pax_global_header00006660000000000000000000000064126514663340014524gustar00rootroot0000000000000052 comment=bdd3ad84c18a49fb376dc094d4f2657202cc27f8 polyml-5.6/000077500000000000000000000000001265146633400127125ustar00rootroot00000000000000polyml-5.6/.gitattributes000066400000000000000000000006211265146633400156040ustar00rootroot00000000000000*.txt text *.vcproj eol=crlf *.vcxproj eol=crlf *.sln eol=crlf *.dsp eol=crlf *.dsw eol=crlf *.rc eol=crlf *.sh eol=lf *-sh eol=lf configure eol=lf missing eol=lf config.guess eol=lf config.status eol=lf depcomp eol=lf compile eol=lf *.texi eol=lf *.in eol=lf polyml-5.6/.gitignore000066400000000000000000000006701265146633400147050ustar00rootroot00000000000000# Intermediate files *.lo *.o *.obj *.pc *.la *.exe .libs/ .deps/ # Visual Studio x64/ Release/ Debug/ Release64/ Debug64/ *.user *.tlog *.suo *.sdf *.opensdf # Temporaries x86asmtemp.S polytemp.txt # Final executables poly polyc polyimport !PolyImport/ # Autoconf generated Makefile stamp-h1 config.h config.log config.status fficonfig.h libffi/include/ffi.h libffi/include/ffitarget.h libtool local.exp .dirstamp # Others .polysave/ polyml-5.6/COPYING000066400000000000000000000635411265146633400137560ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; 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. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! polyml-5.6/Makefile.am000066400000000000000000000065071265146633400147560ustar00rootroot00000000000000AUTOMAKE_OPTIONS=foreign ACLOCAL_AMFLAGS= -I m4 --install AM_CPPFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall AM_CFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall -fno-strict-aliasing POLYIMPORT_OPTIONS = -H 50 BOOTSTRAP_OPTIONS = -H 50 DIST_SUBDIRS = libpolyml libpolymain libffi if INTERNAL_LIBFFI SUBDIRS = libffi libpolyml libpolymain else SUBDIRS = libpolyml libpolymain endif bin_PROGRAMS = polyimport poly dist_bin_SCRIPTS = polyc man_MANS = poly.1 polyimport.1 polyc.1 # Select the architecture-specific modules if ARCHI386 POLYIMPORT = $(srcdir)/imports/polymli386.txt else if ARCHINTERPRET POLYIMPORT = $(srcdir)/imports/polymlint.txt else if ARCHINTERPRET64 POLYIMPORT = $(srcdir)/imports/polymlint64.txt else if ARCHX86_64 POLYIMPORT = $(srcdir)/imports/polymlx86_64.txt else endif endif endif endif noinst_HEADERS = polyexports.h poly_LDFLAGS= polyimport_LDFLAGS= POLYRESOURCES= EXTRALDFLAGS= if NATIVE_WINDOWS if ARCHINTERPRET64 EXTRALDFLAGS += -Wl,-u,WinMain else if ARCHX86_64 EXTRALDFLAGS += -Wl,-u,WinMain else EXTRALDFLAGS += -Wl,-u,_WinMain@16 -Wl,--large-address-aware endif endif if WINDOWSGUI EXTRALDFLAGS += -mwindows polyimport_LDFLAGS += -mwindows else EXTRALDFLAGS += -mconsole polyimport_LDFLAGS += -mconsole endif poly_LDFLAGS += $(EXTRALDFLAGS) POLYOBJECTFILE = polyexport.obj POLYRESOURCES += polyresource.o OBJECTSUFFIX=obj else POLYOBJECTFILE = polyexport.o OBJECTSUFFIX=o endif if EXPMACHO poly_LDFLAGS += -Wl,-no_pie endif poly_SOURCES = poly_LDADD = $(POLYOBJECTFILE) $(POLYRESOURCES) libpolymain/libpolymain.la libpolyml/libpolyml.la polyimport_SOURCES = polyimport.c polyimport_LDADD = $(POLYRESOURCES) libpolyml/libpolyml.la EXTRA_DIST = \ imports/polymli386.txt \ imports/polymlint64.txt \ imports/polymlint.txt \ imports/polymlx86_64.txt \ libpolyml/x86asm.asm \ exportPoly.sml \ poly.1 \ polyimport.1 dist-hook: find {basis,mlsource}/ -type d -exec mkdir $(distdir)/{} \; find {basis,mlsource}/ -type f -not -name .svn \ -exec cp -pf {} $(distdir)/{} \; # Unix. polyexport.o: polyimport exportPoly.sml polytemp.txt ./polyimport $(POLYIMPORT_OPTIONS) polytemp.txt -I $(srcdir) < $(srcdir)/exportPoly.sml # Windows. When building on Windows make sure that we provide both stdin and stdout to suppress the GUI. polyexport.obj: polyimport exportPoly.sml polytemp.txt ./polyimport $(POLYIMPORT_OPTIONS) polytemp.txt -I $(srcdir) < $(srcdir)/exportPoly.sml | cat polyresource.o: PolyML.rc poly.ico $(WINDRES) -o polyresource.o $(srcdir)/PolyML.rc polytemp.txt: $(POLYIMPORT) cp $(POLYIMPORT) polytemp.txt #polyc: buildpolyc # ./buildpolyc LINK=\"$(CC)\" BINDIR=\"$(bindir)\" LIBDIR=\"$(libdir)\" LIBS=\"$(LIBS)\" EXTRALDFLAGS=\"$(EXTRALDFLAGS)\" SUFFIX=\"$(OBJECTSUFFIX)\" # This builds the compiler but does not update the files in the imports directory. # It then builds a version of poly containing the new compiler. compiler: all ./poly $(BOOTSTRAP_OPTIONS) --error-exit < mlsource/BuildExport.sml $(MAKE) reboot: compiler cp polytemp.txt $(POLYIMPORT) # Retain this target for backwards compatibility. cvs: compiler clean-local: rm -f *.obj polytemp.txt polyc # Run tests check-local: all echo "val () = use \"$(srcdir)/Tests/RunTests\"; val () = OS.Process.exit(if runTests \"$(srcdir)/Tests\" then OS.Process.success else OS.Process.failure):unit;" | ./poly # Retain this target for backwards compatibility tests: check polyml-5.6/Makefile.in000066400000000000000000001172571265146633400147740ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = polyimport$(EXEEXT) poly$(EXEEXT) @ARCHINTERPRET64_TRUE@@NATIVE_WINDOWS_TRUE@am__append_1 = -Wl,-u,WinMain @ARCHINTERPRET64_FALSE@@ARCHX86_64_TRUE@@NATIVE_WINDOWS_TRUE@am__append_2 = -Wl,-u,WinMain @ARCHINTERPRET64_FALSE@@ARCHX86_64_FALSE@@NATIVE_WINDOWS_TRUE@am__append_3 = -Wl,-u,_WinMain@16 -Wl,--large-address-aware @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_TRUE@am__append_4 = -mwindows @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_TRUE@am__append_5 = -mwindows @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_FALSE@am__append_6 = -mconsole @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_FALSE@am__append_7 = -mconsole @NATIVE_WINDOWS_TRUE@am__append_8 = $(EXTRALDFLAGS) @NATIVE_WINDOWS_TRUE@am__append_9 = polyresource.o @EXPMACHO_TRUE@am__append_10 = -Wl,-no_pie subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/polyc.in $(dist_bin_SCRIPTS) \ depcomp $(noinst_HEADERS) COPYING compile config.guess \ config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = polyc CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_poly_OBJECTS = poly_OBJECTS = $(am_poly_OBJECTS) poly_DEPENDENCIES = $(POLYOBJECTFILE) $(POLYRESOURCES) \ libpolymain/libpolymain.la libpolyml/libpolyml.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = poly_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(poly_LDFLAGS) $(LDFLAGS) -o $@ am_polyimport_OBJECTS = polyimport.$(OBJEXT) polyimport_OBJECTS = $(am_polyimport_OBJECTS) polyimport_DEPENDENCIES = $(POLYRESOURCES) libpolyml/libpolyml.la polyimport_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(polyimport_LDFLAGS) $(LDFLAGS) -o $@ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(dist_bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(poly_SOURCES) $(polyimport_SOURCES) DIST_SOURCES = $(poly_SOURCES) $(polyimport_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_CFLAGS = @FFI_CFLAGS@ FFI_LIBS = @FFI_LIBS@ FGREP = @FGREP@ GIT_VERSION = @GIT_VERSION@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSFLAG = @OSFLAG@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gitinstalled = @gitinstalled@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 --install AM_CPPFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall AM_CFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall -fno-strict-aliasing POLYIMPORT_OPTIONS = -H 50 BOOTSTRAP_OPTIONS = -H 50 DIST_SUBDIRS = libpolyml libpolymain libffi @INTERNAL_LIBFFI_FALSE@SUBDIRS = libpolyml libpolymain @INTERNAL_LIBFFI_TRUE@SUBDIRS = libffi libpolyml libpolymain dist_bin_SCRIPTS = polyc man_MANS = poly.1 polyimport.1 polyc.1 @ARCHI386_FALSE@@ARCHINTERPRET64_FALSE@@ARCHINTERPRET_FALSE@@ARCHX86_64_TRUE@POLYIMPORT = $(srcdir)/imports/polymlx86_64.txt @ARCHI386_FALSE@@ARCHINTERPRET64_TRUE@@ARCHINTERPRET_FALSE@POLYIMPORT = $(srcdir)/imports/polymlint64.txt @ARCHI386_FALSE@@ARCHINTERPRET_TRUE@POLYIMPORT = $(srcdir)/imports/polymlint.txt # Select the architecture-specific modules @ARCHI386_TRUE@POLYIMPORT = $(srcdir)/imports/polymli386.txt noinst_HEADERS = polyexports.h poly_LDFLAGS = $(am__append_8) $(am__append_10) polyimport_LDFLAGS = $(am__append_5) $(am__append_7) POLYRESOURCES = $(am__append_9) EXTRALDFLAGS = $(am__append_1) $(am__append_2) $(am__append_3) \ $(am__append_4) $(am__append_6) @NATIVE_WINDOWS_FALSE@POLYOBJECTFILE = polyexport.o @NATIVE_WINDOWS_TRUE@POLYOBJECTFILE = polyexport.obj @NATIVE_WINDOWS_FALSE@OBJECTSUFFIX = o @NATIVE_WINDOWS_TRUE@OBJECTSUFFIX = obj poly_SOURCES = poly_LDADD = $(POLYOBJECTFILE) $(POLYRESOURCES) libpolymain/libpolymain.la libpolyml/libpolyml.la polyimport_SOURCES = polyimport.c polyimport_LDADD = $(POLYRESOURCES) libpolyml/libpolyml.la EXTRA_DIST = \ imports/polymli386.txt \ imports/polymlint64.txt \ imports/polymlint.txt \ imports/polymlx86_64.txt \ libpolyml/x86asm.asm \ exportPoly.sml \ poly.1 \ polyimport.1 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 polyc: $(top_builddir)/config.status $(srcdir)/polyc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list poly$(EXEEXT): $(poly_OBJECTS) $(poly_DEPENDENCIES) $(EXTRA_poly_DEPENDENCIES) @rm -f poly$(EXEEXT) $(AM_V_CCLD)$(poly_LINK) $(poly_OBJECTS) $(poly_LDADD) $(LIBS) polyimport$(EXEEXT): $(polyimport_OBJECTS) $(polyimport_DEPENDENCIES) $(EXTRA_polyimport_DEPENDENCIES) @rm -f polyimport$(EXEEXT) $(AM_V_CCLD)$(polyimport_LINK) $(polyimport_OBJECTS) $(polyimport_LDADD) $(LIBS) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyimport.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(HEADERS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool clean-local \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \ uninstall-man uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) all check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am check-local clean clean-binPROGRAMS \ clean-cscope clean-generic clean-libtool clean-local cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-dist_binSCRIPTS install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \ uninstall-man uninstall-man1 dist-hook: find {basis,mlsource}/ -type d -exec mkdir $(distdir)/{} \; find {basis,mlsource}/ -type f -not -name .svn \ -exec cp -pf {} $(distdir)/{} \; # Unix. polyexport.o: polyimport exportPoly.sml polytemp.txt ./polyimport $(POLYIMPORT_OPTIONS) polytemp.txt -I $(srcdir) < $(srcdir)/exportPoly.sml # Windows. When building on Windows make sure that we provide both stdin and stdout to suppress the GUI. polyexport.obj: polyimport exportPoly.sml polytemp.txt ./polyimport $(POLYIMPORT_OPTIONS) polytemp.txt -I $(srcdir) < $(srcdir)/exportPoly.sml | cat polyresource.o: PolyML.rc poly.ico $(WINDRES) -o polyresource.o $(srcdir)/PolyML.rc polytemp.txt: $(POLYIMPORT) cp $(POLYIMPORT) polytemp.txt #polyc: buildpolyc # ./buildpolyc LINK=\"$(CC)\" BINDIR=\"$(bindir)\" LIBDIR=\"$(libdir)\" LIBS=\"$(LIBS)\" EXTRALDFLAGS=\"$(EXTRALDFLAGS)\" SUFFIX=\"$(OBJECTSUFFIX)\" # This builds the compiler but does not update the files in the imports directory. # It then builds a version of poly containing the new compiler. compiler: all ./poly $(BOOTSTRAP_OPTIONS) --error-exit < mlsource/BuildExport.sml $(MAKE) reboot: compiler cp polytemp.txt $(POLYIMPORT) # Retain this target for backwards compatibility. cvs: compiler clean-local: rm -f *.obj polytemp.txt polyc # Run tests check-local: all echo "val () = use \"$(srcdir)/Tests/RunTests\"; val () = OS.Process.exit(if runTests \"$(srcdir)/Tests\" then OS.Process.success else OS.Process.failure):unit;" | ./poly # Retain this target for backwards compatibility tests: check # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/PolyImp/000077500000000000000000000000001265146633400143035ustar00rootroot00000000000000polyml-5.6/PolyImp/PolyImport.vcxproj000066400000000000000000000323061265146633400200420ustar00rootroot00000000000000 Debug Win32 IntDebug Win32 IntDebug x64 IntRelease Win32 IntRelease x64 Release Win32 Debug x64 Release x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F} PolyImport Application true v140_xp Unicode Application true v140_xp Unicode Application false v140_xp true Unicode Application false v140_xp true Unicode Application true v140_xp Unicode Application true v140_xp Unicode Application false v140_xp true Unicode Application false v140_xp true Unicode Level3 Disabled true MultiThreadedDebug true true Windows 6.0 false Level3 Disabled true MultiThreadedDebug true true Windows 6.0 false Level3 Disabled true MultiThreadedDebug true true Windows 6.0 false Level3 Disabled true MultiThreadedDebug true true Windows 6.0 false Level3 MaxSpeed true true true MultiThreaded true true true true Windows 6.0 false Level3 MaxSpeed true true true MultiThreaded true true true true Windows 6.0 false Level3 MaxSpeed true true true MultiThreaded true true true true Windows 6.0 false Level3 MaxSpeed true true true MultiThreaded true true true true Windows 6.0 false {0ba5d5b5-f85b-4c49-8a27-67186fa68922} polyml-5.6/PolyML.rc000066400000000000000000000103501265146633400144130ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "windows.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (United Kingdom) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK #pragma code_page(1252) #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""windows.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_MENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "&Quit", ID_FILE_QUIT END POPUP "&Edit" BEGIN MENUITEM "&Copy", ID_EDIT_COPY MENUITEM "&Paste", ID_EDIT_PASTE END POPUP "&Run" BEGIN MENUITEM "&Interrupt", ID_RUN_INTERRUPT END POPUP "&Help" BEGIN MENUITEM "&About Poly/ML...", ID_HELP_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUT_POLYML DIALOGEX 0, 0, 217, 113 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "OK",IDOK,7,92,50,14 LTEXT "Poly/ML v 5.6 Copyright David C.J. Matthews, Cambridge University Technical Services and contributors 2000-15.\n\nThis is free software and released under the GNU Lesser General Public License.",IDC_STATIC,24,30,167,47 ICON IDI_ICON,IDC_STATIC,7,7,20,20 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_ABOUT_POLYML, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 210 TOPMARGIN, 7 BOTTOMMARGIN, 106 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON ICON "poly.ico" ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 5,6,0,0 PRODUCTVERSION 5,6,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080904b0" BEGIN VALUE "CompanyName", " " VALUE "FileDescription", "PolyML v5.6" VALUE "FileVersion", "5.6.0.0" VALUE "InternalName", "PolyML" VALUE "LegalCopyright", "Copyright David Matthews, CUTS and contributors 2000-2015" VALUE "OriginalFilename", "PolyML.exe" VALUE "ProductName", "PolyML" VALUE "ProductVersion", "5.6.0.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x809, 1200 END END ///////////////////////////////////////////////////////////////////////////// // // AFX_DIALOG_LAYOUT // IDD_ABOUT_POLYML AFX_DIALOG_LAYOUT BEGIN 0 END #endif // English (United Kingdom) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED polyml-5.6/PolyML.sln000066400000000000000000000256121265146633400146120ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libffi", "libffi\libffi.vcxproj", "{6D86BC6F-E74E-40C5-9881-F8BB606BCA78}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyLib", "libpolyml\PolyLib.vcxproj", "{0BA5D5B5-F85B-4C49-8A27-67186FA68922}" ProjectSection(ProjectDependencies) = postProject {6D86BC6F-E74E-40C5-9881-F8BB606BCA78} = {6D86BC6F-E74E-40C5-9881-F8BB606BCA78} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyML", "PolyML\PolyML.vcxproj", "{DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyMainLib", "libpolymain\PolyMainLib.vcxproj", "{0326C47A-00AF-42CB-B87D-0369A241B570}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyPerf", "PolyPerf\PolyPerf.vcxproj", "{D9F58E8D-5FCD-4401-8D88-0C28732BD77B}" EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "wininstall", "wininstall\wininstall.wixproj", "{788BA1C9-699E-4F92-9FAF-C7437A419042}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "polyicon", "wininstall\polyicon\polyicon.vcxproj", "{D4DF6521-6183-4E24-A327-55C72519836E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyImport", "PolyImp\PolyImport.vcxproj", "{1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 IntDebug|x64 = IntDebug|x64 IntDebug|x86 = IntDebug|x86 IntRelease|x64 = IntRelease|x64 IntRelease|x86 = IntRelease|x86 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Debug|x64.ActiveCfg = Debug|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Debug|x64.Build.0 = Debug|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Debug|x86.ActiveCfg = Debug|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Debug|x86.Build.0 = Debug|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntDebug|x64.ActiveCfg = IntDebug|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntDebug|x64.Build.0 = IntDebug|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntDebug|x86.ActiveCfg = IntDebug|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntDebug|x86.Build.0 = IntDebug|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntRelease|x64.ActiveCfg = IntRelease|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntRelease|x64.Build.0 = IntRelease|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntRelease|x86.ActiveCfg = IntRelease|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.IntRelease|x86.Build.0 = IntRelease|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Release|x64.ActiveCfg = Release|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Release|x64.Build.0 = Release|x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Release|x86.ActiveCfg = Release|Win32 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78}.Release|x86.Build.0 = Release|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Debug|x64.ActiveCfg = Debug|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Debug|x64.Build.0 = Debug|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Debug|x86.ActiveCfg = Debug|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Debug|x86.Build.0 = Debug|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntDebug|x64.ActiveCfg = IntDebug|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntDebug|x64.Build.0 = IntDebug|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntDebug|x86.ActiveCfg = IntDebug|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntDebug|x86.Build.0 = IntDebug|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntRelease|x64.ActiveCfg = IntRelease|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntRelease|x64.Build.0 = IntRelease|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntRelease|x86.ActiveCfg = IntRelease|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.IntRelease|x86.Build.0 = IntRelease|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Release|x64.ActiveCfg = Release|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Release|x64.Build.0 = Release|x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Release|x86.ActiveCfg = Release|Win32 {0BA5D5B5-F85B-4C49-8A27-67186FA68922}.Release|x86.Build.0 = Release|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Debug|x64.ActiveCfg = Debug|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Debug|x64.Build.0 = Debug|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Debug|x86.ActiveCfg = Debug|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Debug|x86.Build.0 = Debug|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntDebug|x64.ActiveCfg = IntDebug|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntDebug|x64.Build.0 = IntDebug|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntDebug|x86.ActiveCfg = IntDebug|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntDebug|x86.Build.0 = IntDebug|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntRelease|x64.ActiveCfg = IntRelease|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntRelease|x64.Build.0 = IntRelease|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntRelease|x86.ActiveCfg = IntRelease|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.IntRelease|x86.Build.0 = IntRelease|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Release|x64.ActiveCfg = Release|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Release|x64.Build.0 = Release|x64 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Release|x86.ActiveCfg = Release|Win32 {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF}.Release|x86.Build.0 = Release|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.Debug|x64.ActiveCfg = Debug|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.Debug|x64.Build.0 = Debug|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.Debug|x86.ActiveCfg = Debug|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.Debug|x86.Build.0 = Debug|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntDebug|x64.ActiveCfg = IntDebug|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntDebug|x64.Build.0 = IntDebug|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntDebug|x86.ActiveCfg = IntDebug|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntDebug|x86.Build.0 = IntDebug|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntRelease|x64.ActiveCfg = IntRelease|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntRelease|x64.Build.0 = IntRelease|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntRelease|x86.ActiveCfg = IntRelease|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.IntRelease|x86.Build.0 = IntRelease|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.Release|x64.ActiveCfg = Release|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.Release|x64.Build.0 = Release|x64 {0326C47A-00AF-42CB-B87D-0369A241B570}.Release|x86.ActiveCfg = Release|Win32 {0326C47A-00AF-42CB-B87D-0369A241B570}.Release|x86.Build.0 = Release|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Debug|x64.ActiveCfg = Debug|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Debug|x64.Build.0 = Debug|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Debug|x86.ActiveCfg = Debug|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Debug|x86.Build.0 = Debug|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntDebug|x64.ActiveCfg = Debug|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntDebug|x64.Build.0 = Debug|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntDebug|x86.ActiveCfg = Debug|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntDebug|x86.Build.0 = Debug|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntRelease|x64.ActiveCfg = Release|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntRelease|x64.Build.0 = Release|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntRelease|x86.ActiveCfg = Release|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.IntRelease|x86.Build.0 = Release|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Release|x64.ActiveCfg = Release|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Release|x64.Build.0 = Release|x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Release|x86.ActiveCfg = Release|Win32 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B}.Release|x86.Build.0 = Release|Win32 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Debug|x64.ActiveCfg = Debug|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Debug|x86.ActiveCfg = Debug|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.IntDebug|x64.ActiveCfg = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.IntDebug|x86.ActiveCfg = Debug|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.IntRelease|x64.ActiveCfg = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.IntRelease|x86.ActiveCfg = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Release|x64.ActiveCfg = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Release|x64.Build.0 = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Release|x86.ActiveCfg = Release|x86 {788BA1C9-699E-4F92-9FAF-C7437A419042}.Release|x86.Build.0 = Release|x86 {D4DF6521-6183-4E24-A327-55C72519836E}.Debug|x64.ActiveCfg = Debug|x64 {D4DF6521-6183-4E24-A327-55C72519836E}.Debug|x86.ActiveCfg = Debug|Win32 {D4DF6521-6183-4E24-A327-55C72519836E}.IntDebug|x64.ActiveCfg = Debug|x64 {D4DF6521-6183-4E24-A327-55C72519836E}.IntDebug|x86.ActiveCfg = Debug|Win32 {D4DF6521-6183-4E24-A327-55C72519836E}.IntRelease|x64.ActiveCfg = Release|x64 {D4DF6521-6183-4E24-A327-55C72519836E}.IntRelease|x86.ActiveCfg = Release|Win32 {D4DF6521-6183-4E24-A327-55C72519836E}.Release|x64.ActiveCfg = Release|x64 {D4DF6521-6183-4E24-A327-55C72519836E}.Release|x64.Build.0 = Release|x64 {D4DF6521-6183-4E24-A327-55C72519836E}.Release|x86.ActiveCfg = Release|Win32 {D4DF6521-6183-4E24-A327-55C72519836E}.Release|x86.Build.0 = Release|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Debug|x64.ActiveCfg = Debug|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Debug|x64.Build.0 = Debug|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Debug|x86.ActiveCfg = Debug|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Debug|x86.Build.0 = Debug|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntDebug|x64.ActiveCfg = IntDebug|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntDebug|x64.Build.0 = IntDebug|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntDebug|x86.ActiveCfg = IntDebug|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntDebug|x86.Build.0 = IntDebug|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntRelease|x64.ActiveCfg = IntRelease|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntRelease|x64.Build.0 = IntRelease|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntRelease|x86.ActiveCfg = IntRelease|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.IntRelease|x86.Build.0 = IntRelease|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Release|x64.ActiveCfg = Release|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Release|x64.Build.0 = Release|x64 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Release|x86.ActiveCfg = Release|Win32 {1BA3E7A2-D64F-4CE3-9FE5-7846B855C19F}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal polyml-5.6/PolyML/000077500000000000000000000000001265146633400140665ustar00rootroot00000000000000polyml-5.6/PolyML/PolyML.vcxproj000066400000000000000000000751051265146633400166670ustar00rootroot00000000000000 Debug Win32 IntDebug Win32 IntDebug x64 IntRelease Win32 IntRelease x64 Release Win32 Debug x64 Release x64 {0326c47a-00af-42cb-b87d-0369a241b570} {0ba5d5b5-f85b-4c49-8a27-67186fa68922} {1ba3e7a2-d64f-4ce3-9fe5-7846b855c19f} true true true true copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt true true true false true false true true true true copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt true true true true true false true false copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt true true true true copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt copy "%(FullPath)" ..\polytemp.txt ..\polytemp.txt ..\polytemp.txt true true cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml $(IntDir)polyexport.obj $(IntDir)polyexport.obj cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml $(IntDir)polyexport.obj $(IntDir)polyexport.obj cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml $(IntDir)polyexport.obj $(IntDir)polyexport.obj cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml cd .. $(OutDir)PolyImport.exe -H 32 "%(FullPath)" -o PolyML\$(IntDir)polyexport.obj < exportPoly.sml $(IntDir)polyexport.obj $(IntDir)polyexport.obj {DF3B373E-67DF-4AB4-8B1E-F54C5810E2CF} Win32Proj PolyML Application true v140_xp Unicode Application true v140_xp Unicode Application false v140_xp true Unicode Application false v140_xp true Unicode Application true v140_xp Unicode Application true v140_xp Unicode Application false v140_xp true Unicode Application false v140_xp true Unicode true true true true false false false false NotUsing Level3 Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true libcmtd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false NotUsing Level3 Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true libcmtd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false NotUsing Level3 Disabled _DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true libcmtd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false NotUsing Level3 Disabled _DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true libcmtd.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false Level3 NotUsing MaxSpeed true true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true libcmt.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false Level3 NotUsing MaxSpeed true true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true libcmt.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false Level3 NotUsing MaxSpeed true true NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true libcmt.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false Level3 NotUsing MaxSpeed true true NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true libcmt.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true 6.0 false polyml-5.6/PolyPerf/000077500000000000000000000000001265146633400144525ustar00rootroot00000000000000polyml-5.6/PolyPerf/PolyPerf.cpp000066400000000000000000000647411265146633400167320ustar00rootroot00000000000000/* Title: PolyPerf.cpp Copyright (c) 2011 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include #include #include #include "../polystatistics.h" // Statistics currently provided. These are copied from statistics.cpp // although the statistics returned may not match. enum { PSC_THREADS = 0, // Total number of threads PSC_THREADS_IN_ML, // Threads running ML code PSC_THREADS_WAIT_IO, // Threads waiting for IO PSC_THREADS_WAIT_MUTEX, // Threads waiting for a mutex PSC_THREADS_WAIT_CONDVAR, // Threads waiting for a condition var PSC_THREADS_WAIT_SIGNAL, // Special case - signal handling thread PSC_GC_FULLGC, // Number of full garbage collections PSC_GC_PARTIALGC, // Number of partial GCs N_PS_COUNTERS }; enum { PSS_TOTAL_HEAP = 0, // Total size of the local heap PSS_AFTER_LAST_GC, // Space free after last GC PSS_AFTER_LAST_FULLGC, // Space free after the last full GC PSS_ALLOCATION, // Size of allocation space PSS_ALLOCATION_FREE, // Space available in allocation area N_PS_SIZES }; enum { PST_NONGC_UTIME = 0, PST_NONGC_STIME, PST_GC_UTIME, PST_GC_STIME, N_PS_TIMES }; #define N_PS_USER 8 /* This DLL is a plug-in for Windows performance monitoring. The whole interface is extremely messy and seems to have remained unchanged from NT 3.5. The localised string names displayed in the performance monitor are held in the registry and need to be set up before this DLL can be loaded. Wix v3 supports the strings directly and this replaces the old method of using lodctr with .ini and .h files. The DLL is loaded by the performance monitor. In XP that seems to be part of the management console application mmc.exe and perfmon.exe seems to be just a stub. */ extern "C" { /* These are the functions exported from the DLL. The names here appear in the HKLM\SYSTEM\CurrentControlSet\Services\PolyML\Performance registry key. This DLL is loaded by mmc.exe and these functions are called to begin and end monitoring and to extract the current performance values from the shared memory. */ __declspec(dllexport) PM_OPEN_PROC OpenPolyPerfMon; __declspec(dllexport) PM_CLOSE_PROC ClosePolyPerfMon; __declspec(dllexport) PM_COLLECT_PROC CollectPolyPerfMon; }; // Export the functions without any decoration. #ifndef _WIN64 #pragma comment(linker, "/export:OpenPolyPerfMon=_OpenPolyPerfMon@4") #pragma comment(linker, "/export:ClosePolyPerfMon=_ClosePolyPerfMon@0") #pragma comment(linker, "/export:CollectPolyPerfMon=_CollectPolyPerfMon@16") #endif class PolyProcess { public: ~PolyProcess(); static PolyProcess* CreateProcessEntry(DWORD pID); PolyProcess(); unsigned char *sharedMem; // Pointer to shared memory DWORD processID; // Process ID WCHAR *processName; // Unicode name }; // This is the structure of the decoded statistics. These values // are set from the ASN1 coding. // The types of the fields must match the types set in the registry // by the installer (PolyML.wxs). For counters that is numberOfItems32 // and for sizes they have to be DWORDs. The information we display // for sizes is always a ratio of two sizes (i.e. % full) so we // have to scale the values consistently to get them to fit. // Since we also provide type information in the PERF_COUNTER_DEFINITION // structure it's possible we may be able to override that but it's // not clear. typedef struct { PERF_COUNTER_BLOCK header; // Statistics decoded UINT32 psCounters[N_PS_COUNTERS]; // numberOfItems32 #define SIZEOF_COUNTER (sizeof(UINT32)) DWORD psSizes[N_PS_SIZES]; // rawFraction/rawBase (i.e. 32-bits) #define SIZEOF_SIZE (sizeof(DWORD)) FILETIME psTimers[N_PS_TIMES]; // timer100Ns #define SIZEOF_TIME (sizeof(FILETIME)) UINT32 psUser[N_PS_USER]; // numberOfItems32 #define SIZEOF_USER (sizeof(UINT32)) } statistics; PolyProcess::PolyProcess() { sharedMem = NULL; processName = NULL; } PolyProcess::~PolyProcess() { if (sharedMem) ::UnmapViewOfFile(sharedMem); free(processName); } // Try to open the shared memory and if it succeeds create an entry for // this process. PolyProcess *PolyProcess::CreateProcessEntry(DWORD pId) { char shmName[MAX_PATH]; sprintf(shmName, POLY_STATS_NAME "%lu", pId); HANDLE hRemMemory = OpenFileMapping(FILE_MAP_READ, FALSE, shmName); if (hRemMemory == NULL) return NULL; // Probably not a Poly/ML process unsigned char *sMem = (unsigned char*)MapViewOfFile(hRemMemory, FILE_MAP_READ, 0, 0, 0); CloseHandle(hRemMemory); // We don't need this whether it succeeded or not if (sMem == NULL) return NULL; if (*sMem != POLY_STATS_C_STATISTICS) { UnmapViewOfFile(sMem); return NULL; } // Looks good. PolyProcess *result = new PolyProcess; result->processID = pId; result->sharedMem = sMem; // Find the name of the process. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pId); if (hProcess != NULL) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { WCHAR processName[MAX_PATH]; size_t len = 0; processName[0] = 0; if (GetModuleBaseNameW(hProcess, hMod, processName, sizeof(processName)/sizeof(WCHAR)) != 0) { // Remove any ".exe" or similar at the end len = wcslen(processName); if (len > 4 && processName[len-4] == '.') len -= 4; processName[len] = 0; } // Add the process Id in the name _snwprintf(processName+len, MAX_PATH-len, L" (%lu)", pId); // Copy it into the heap result->processName = _wcsdup(processName); } CloseHandle(hProcess); } return result; } class ASN1Parse { public: ASN1Parse (statistics *s, unsigned char *p): stats(s), ptr(p) {} void asn1Decode(); unsigned getLength(); INT64 parseInt(unsigned length); UINT32 parseUnsigned(unsigned length); DWORD parseSize(unsigned length); void parseAStatistic(int subTag, unsigned statlen); void parseTime(FILETIME *ft, unsigned length); statistics *stats; unsigned char *ptr; }; // Decode the ASN1 encoding. If the decoding fails we just leave the // values as zero rather than returning any error. void ASN1Parse::asn1Decode() { unsigned char ch = *ptr++; if (ch != POLY_STATS_C_STATISTICS) return; unsigned overallLength = getLength(); unsigned char *endOfData = ptr+overallLength; while (ptr < endOfData) { // Decode a statistic unsigned tag = *ptr++; unsigned statLen = getLength(); switch (tag) { case POLY_STATS_C_COUNTERSTAT: parseAStatistic(POLY_STATS_C_COUNTER_VALUE, statLen); break; case POLY_STATS_C_SIZESTAT: parseAStatistic(POLY_STATS_C_BYTE_COUNT, statLen); break; case POLY_STATS_C_TIMESTAT: parseAStatistic(POLY_STATS_C_TIME, statLen); break; case POLY_STATS_C_USERSTAT: parseAStatistic(POLY_STATS_C_COUNTER_VALUE, statLen); break; default: ptr += statLen; // Skip it; it's not known } } } // Return the length of the next item unsigned ASN1Parse::getLength() { unsigned ch = *ptr++; if (ch & 0x80) { int lengthOfLength = ch & 0x7f; unsigned length = 0; // Ignore "indefinite length", it's not used here. while (lengthOfLength--) { ch = *ptr++; length = (length << 8) | ch; } return length; } else return ch; } // General case for integer. INT64 ASN1Parse::parseInt(unsigned length) { if (length == 0) return 0; INT64 result = *ptr & 0x80 ? -1 : 0; while (length--) result = (result << 8) | *ptr++; return result; } UINT32 ASN1Parse::parseUnsigned(unsigned length) { INT64 value = parseInt(length); if (value < 0) return 0; // Can't display negative nos return (UINT32)value; } DWORD ASN1Parse::parseSize(unsigned length) { INT64 value = parseInt(length); if (value < 0) return 0; // Can't display negative nos return (DWORD)(value / 1024); // Return kilobytes } void ASN1Parse::parseTime(FILETIME *ft, unsigned length) { unsigned char *end = ptr+length; UINT32 seconds = 0, useconds = 0; while (ptr < end) { unsigned char tag = *ptr++; unsigned elemLen = getLength(); switch (tag) { case POLY_STATS_C_SECONDS: seconds = parseUnsigned(elemLen); break; case POLY_STATS_C_MICROSECS: useconds = parseUnsigned(elemLen); break; default: ptr += elemLen; } } ULARGE_INTEGER li; li.QuadPart = (ULONGLONG)seconds * 10000000 + (ULONGLONG)useconds * 10; ft->dwHighDateTime = li.HighPart; ft->dwLowDateTime = li.LowPart; } void ASN1Parse::parseAStatistic(int subTag, unsigned statLen) { unsigned char *endOfStat = ptr+statLen; unsigned tagId = 0; while (ptr < endOfStat) { unsigned char tag = *ptr++; unsigned elemLen = getLength(); switch (tag) { case POLY_STATS_C_IDENTIFIER: // The identifier of the statistic // We rely on the fact that the Id occurs before the value. tagId = parseUnsigned(elemLen); break; case POLY_STATS_C_COUNTER_VALUE: if (subTag = POLY_STATS_C_COUNTER_VALUE) { UINT32 cValue = parseUnsigned(elemLen); // A counter value occurs in these statistics switch (tagId) { case POLY_STATS_ID_THREADS: stats->psCounters[PSC_THREADS] = cValue; break; case POLY_STATS_ID_THREADS_IN_ML: stats->psCounters[PSC_THREADS_IN_ML] = cValue; break; case POLY_STATS_ID_THREADS_WAIT_IO: stats->psCounters[PSC_THREADS_WAIT_IO] = cValue; break; case POLY_STATS_ID_THREADS_WAIT_MUTEX: stats->psCounters[PSC_THREADS_WAIT_MUTEX] = cValue; break; case POLY_STATS_ID_THREADS_WAIT_CONDVAR: stats->psCounters[PSC_THREADS_WAIT_CONDVAR] = cValue; break; case POLY_STATS_ID_THREADS_WAIT_SIGNAL: stats->psCounters[PSC_THREADS_WAIT_SIGNAL] = cValue; break; case POLY_STATS_ID_GC_FULLGC: stats->psCounters[PSC_GC_FULLGC] = cValue; break; case POLY_STATS_ID_GC_PARTIALGC: stats->psCounters[PSC_GC_PARTIALGC] = cValue; break; case POLY_STATS_ID_USER0: stats->psUser[0] = cValue; break; case POLY_STATS_ID_USER1: stats->psUser[1] = cValue; break; case POLY_STATS_ID_USER2: stats->psUser[2] = cValue; break; case POLY_STATS_ID_USER3: stats->psUser[3] = cValue; break; case POLY_STATS_ID_USER4: stats->psUser[4] = cValue; break; case POLY_STATS_ID_USER5: stats->psUser[5] = cValue; break; case POLY_STATS_ID_USER6: stats->psUser[6] = cValue; break; case POLY_STATS_ID_USER7: stats->psUser[7] = cValue; break; // Anything else is an unknown tag; skip } } else ptr += elemLen; // Skip it - not expected here break; case POLY_STATS_C_BYTE_COUNT: if (subTag == POLY_STATS_C_BYTE_COUNT) { DWORD cValue = parseSize(elemLen); switch (tagId) { case POLY_STATS_ID_TOTAL_HEAP: stats->psSizes[PSS_TOTAL_HEAP] = cValue; break; case POLY_STATS_ID_AFTER_LAST_GC: stats->psSizes[PSS_AFTER_LAST_GC] = cValue; break; case POLY_STATS_ID_AFTER_LAST_FULLGC: stats->psSizes[PSS_AFTER_LAST_FULLGC] = cValue; break; case POLY_STATS_ID_ALLOCATION: stats->psSizes[PSS_ALLOCATION] = cValue; break; case POLY_STATS_ID_ALLOCATION_FREE: stats->psSizes[PSS_ALLOCATION_FREE] = cValue; break; } } else ptr += elemLen; // Skip it - not expected here break; case POLY_STATS_C_TIME: if (subTag == POLY_STATS_C_TIME) { FILETIME ft = { 0, 0}; parseTime(&ft, elemLen); switch (tagId) { case POLY_STATS_ID_NONGC_UTIME: stats->psTimers[PST_NONGC_UTIME] = ft; break; case POLY_STATS_ID_NONGC_STIME: stats->psTimers[PST_NONGC_STIME] = ft; break; case POLY_STATS_ID_GC_UTIME: stats->psTimers[PST_GC_UTIME] = ft; break; case POLY_STATS_ID_GC_STIME: stats->psTimers[PST_GC_STIME] = ft; break; } } else ptr += elemLen; break; default: ptr += elemLen; // Unknown - skip } } } // Pointer to table of processes with the Poly/ML run-time static PolyProcess **polyProcesses; static DWORD numProcesses; // Open: Find the current ML instances. DWORD APIENTRY OpenPolyPerfMon(LPWSTR lpInstanceNames) { // Get the list of all process IDs. Because we don't know // how many there are we increase the buffer size until the // size returned is less than the buffer size. DWORD buffItems = 10, numItems; DWORD *processIds = NULL; while (true) { processIds = (DWORD*)malloc(buffItems * sizeof(DWORD)); if (processIds == NULL) return ERROR_NOT_ENOUGH_MEMORY; DWORD bytesNeeded; if (! EnumProcesses(processIds, buffItems * sizeof(DWORD), &bytesNeeded)) return GetLastError(); if (bytesNeeded < buffItems * sizeof(DWORD)) { numItems = bytesNeeded / sizeof(DWORD); break; } buffItems = buffItems * 2; free(processIds); } // How many of these processes provide the Poly/ML shared memory? // Make an array big enough for all processes to simplify allocation. polyProcesses = (PolyProcess **)malloc(numItems * sizeof(PolyProcess*)); if (polyProcesses == NULL) { free(processIds); free(polyProcesses); return ERROR_NOT_ENOUGH_MEMORY; } for (DWORD dw = 0; dw < numItems; dw++) { // See if this is a Poly/ML process PolyProcess *pProc = PolyProcess::CreateProcessEntry(processIds[dw]); if (pProc != NULL) // We can use this polyProcesses[numProcesses++] = pProc; } free(processIds); return ERROR_SUCCESS; } // Delete the entries. DWORD APIENTRY ClosePolyPerfMon(void) { if (polyProcesses != NULL) { for (DWORD dw = 0; dw < numProcesses; dw++) delete(polyProcesses[dw]); free(polyProcesses); } polyProcesses = NULL; numProcesses = 0; return ERROR_SUCCESS; } static LPVOID allocBuffSpace(LPVOID * &lppData, LPDWORD &lpcbTotalBytes, DWORD &dwBytesAvailable, DWORD size) { if (dwBytesAvailable < size) return NULL; LPVOID pResult = *lppData; *lppData = (LPVOID)((char*)pResult + size); memset(pResult, 0, size); *lpcbTotalBytes += size; dwBytesAvailable -= size; return pResult; } // This is the entry that actually does the work. DWORD APIENTRY CollectPolyPerfMon( /* IN */LPWSTR lpRequest, /* lpRequest is either "Global" (all counters) or a list of counter numbers to return. These are the indexes into counter table in the Perflib\009 registry entry. */ /* IN OUT */LPVOID* lppData, /* IN OUT */LPDWORD lpcbTotalBytes, /* OUT */LPDWORD lpNumObjectTypes) { DWORD dwBytesAvailable = *lpcbTotalBytes; LPVOID lpDataStart = *lppData; *lpcbTotalBytes = 0; // Bytes written *lpNumObjectTypes = 0; // Object types written // For the moment we ignore the lpRequest argument and return all the counters. // First find out where our strings are in the list. This depends on // the strings installed by other applications/services so will vary // from machine to machine. The installer will have added keys under // our "service". If these can't be read then there's nothing we can do. HKEY hkPerform; LONG err; err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\PolyML\\Performance", 0, KEY_READ, &hkPerform); if (err != ERROR_SUCCESS) return err; DWORD dwType, dwSize, dwFirstCounter, dwFirstHelp; dwSize = sizeof(dwFirstCounter); err = RegQueryValueEx(hkPerform, "First Counter", 0, &dwType, (LPBYTE)&dwFirstCounter, &dwSize); if (err != ERROR_SUCCESS) { RegCloseKey(hkPerform); return err; } dwSize = sizeof(dwFirstHelp); err = RegQueryValueEx(hkPerform, "First Help", 0, &dwType, (LPBYTE)&dwFirstHelp, &dwSize); if (err != ERROR_SUCCESS) { RegCloseKey(hkPerform); return err; } RegCloseKey(hkPerform); // The actual strings are inserted by the installer. See PolyML.wxs. unsigned stringCount = 0; // Object header. Just one object. PERF_OBJECT_TYPE *pObjectType = (PERF_OBJECT_TYPE*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_OBJECT_TYPE)); if (pObjectType == NULL) return ERROR_MORE_DATA; pObjectType->HeaderLength = sizeof(PERF_OBJECT_TYPE); pObjectType->ObjectNameTitleIndex = dwFirstCounter + stringCount*2; // First string is the name of the object pObjectType->ObjectHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pObjectType->DetailLevel = PERF_DETAIL_NOVICE; pObjectType->NumCounters = 0; pObjectType->DefaultCounter = -1; pObjectType->NumInstances = numProcesses; // Counter block for each counter. // First the numbers PERF_COUNTER_DEFINITION *pCounters = (PERF_COUNTER_DEFINITION*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_COUNTER_DEFINITION) * N_PS_COUNTERS); if (pCounters == NULL) return ERROR_MORE_DATA; for (unsigned i = 0; i < N_PS_COUNTERS; i++) { pCounters[i].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pCounters[i].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pCounters[i].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pCounters[i].DetailLevel = PERF_DETAIL_NOVICE; pCounters[i].CounterType = PERF_COUNTER_RAWCOUNT; pCounters[i].CounterSize = SIZEOF_COUNTER; pCounters[i].CounterOffset = offsetof(statistics, psCounters)+i*SIZEOF_COUNTER; pObjectType->NumCounters++; } // The sizes are dealt with specially. We need to divide the values and express // them as percentages. Each displayed value is followed by a base value. PERF_COUNTER_DEFINITION *pSizes = (PERF_COUNTER_DEFINITION*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_COUNTER_DEFINITION) * 6); if (pSizes == NULL) return ERROR_MORE_DATA; // First - Heap usage after last GC pSizes[0].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[0].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[0].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[0].DetailLevel = PERF_DETAIL_NOVICE; pSizes[0].CounterType = PERF_RAW_FRACTION; pSizes[0].CounterSize = SIZEOF_SIZE; pSizes[0].CounterOffset = offsetof(statistics, psSizes)+PSS_AFTER_LAST_GC*SIZEOF_SIZE; pObjectType->NumCounters++; pSizes[1].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[1].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[1].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[1].DetailLevel = PERF_DETAIL_NOVICE; pSizes[1].CounterType = PERF_RAW_BASE; pSizes[1].CounterSize = SIZEOF_SIZE; pSizes[1].CounterOffset = offsetof(statistics, psSizes)+PSS_TOTAL_HEAP*SIZEOF_SIZE; pObjectType->NumCounters++; // Second - Heap usage after last full GC pSizes[2].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[2].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[2].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[2].DetailLevel = PERF_DETAIL_NOVICE; pSizes[2].CounterType = PERF_RAW_FRACTION; pSizes[2].CounterSize = SIZEOF_SIZE; pSizes[2].CounterOffset = offsetof(statistics, psSizes)+PSS_AFTER_LAST_FULLGC*SIZEOF_SIZE; pObjectType->NumCounters++; pSizes[3].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[3].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[3].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[3].DetailLevel = PERF_DETAIL_NOVICE; pSizes[3].CounterType = PERF_RAW_BASE; pSizes[3].CounterSize = SIZEOF_SIZE; pSizes[3].CounterOffset = offsetof(statistics, psSizes)+PSS_TOTAL_HEAP*SIZEOF_SIZE; pObjectType->NumCounters++; // Third - Unreserved space in allocation area pSizes[4].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[4].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[4].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[4].DetailLevel = PERF_DETAIL_NOVICE; pSizes[4].CounterType = PERF_RAW_FRACTION; pSizes[4].CounterSize = SIZEOF_SIZE; pSizes[4].CounterOffset = offsetof(statistics, psSizes)+PSS_ALLOCATION_FREE*SIZEOF_SIZE; pObjectType->NumCounters++; pSizes[5].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pSizes[5].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pSizes[5].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pSizes[5].DetailLevel = PERF_DETAIL_NOVICE; pSizes[5].CounterType = PERF_RAW_BASE; pSizes[5].CounterSize = SIZEOF_SIZE; pSizes[5].CounterOffset = offsetof(statistics, psSizes)+PSS_ALLOCATION*SIZEOF_SIZE; pObjectType->NumCounters++; // Then the times PERF_COUNTER_DEFINITION *pTimes = (PERF_COUNTER_DEFINITION*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_COUNTER_DEFINITION) * N_PS_TIMES); if (pTimes == NULL) return ERROR_MORE_DATA; for (unsigned k = 0; k < N_PS_TIMES; k++) { pTimes[k].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pTimes[k].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pTimes[k].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pTimes[k].DetailLevel = PERF_DETAIL_NOVICE; pTimes[k].CounterType = PERF_100NSEC_TIMER; pTimes[k].CounterSize = SIZEOF_TIME; pTimes[k].CounterOffset = offsetof(statistics, psTimers)+k*SIZEOF_TIME; pObjectType->NumCounters++; } // Finally the user counters PERF_COUNTER_DEFINITION *pUsers = (PERF_COUNTER_DEFINITION*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_COUNTER_DEFINITION) * N_PS_USER); if (pUsers == NULL) return ERROR_MORE_DATA; for (unsigned l = 0; l < N_PS_USER; l++) { pUsers[l].ByteLength = sizeof(PERF_COUNTER_DEFINITION); pUsers[l].CounterNameTitleIndex = dwFirstCounter + stringCount*2; pUsers[l].CounterHelpTitleIndex = dwFirstHelp + (stringCount++)*2; pUsers[l].DetailLevel = PERF_DETAIL_NOVICE; pUsers[l].CounterType = PERF_COUNTER_RAWCOUNT; pUsers[l].CounterSize = SIZEOF_USER; pUsers[l].CounterOffset = offsetof(statistics, psUser)+l*SIZEOF_USER; pObjectType->NumCounters++; } pObjectType->DefinitionLength = *lpcbTotalBytes; // End of definitions; start of instance data // Instance data - One entry for each process. Includes the instance name (i.e. the process) // and the counter data. for (DWORD dw = 0; dw < numProcesses; dw++) { PERF_INSTANCE_DEFINITION *pInst = (PERF_INSTANCE_DEFINITION*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, sizeof(PERF_INSTANCE_DEFINITION)); if (pInst == NULL) return ERROR_MORE_DATA; PolyProcess *pProc = polyProcesses[dw]; pInst->UniqueID = PERF_NO_UNIQUE_ID; // Better to show the name pInst->NameOffset = sizeof(PERF_INSTANCE_DEFINITION); // Name follows DWORD len = (DWORD)wcslen(pProc->processName); DWORD byteLength = (len+1)*sizeof(WCHAR); // Length including terminators pInst->NameLength = byteLength; byteLength = (byteLength + 7) / 8 * 8; // Must be rounded up to an eight-byte boundary. pInst->ByteLength = byteLength + sizeof(PERF_INSTANCE_DEFINITION); WCHAR *pName = (WCHAR*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, byteLength); wcscpy(pName, pProc->processName); // Now the statistics including a PERF_COUNTER_BLOCK DWORD statSize = (sizeof(statistics) + 7) / 8 * 8; statistics *pStats = (statistics*)allocBuffSpace(lppData, lpcbTotalBytes, dwBytesAvailable, statSize); if (pStats == NULL) return ERROR_MORE_DATA; pStats->header.ByteLength = sizeof(PERF_COUNTER_BLOCK)+statSize; ASN1Parse decode(pStats, pProc->sharedMem); decode.asn1Decode(); } pObjectType->TotalByteLength = *lpcbTotalBytes; *lpNumObjectTypes = 1; // Single object return ERROR_SUCCESS; } polyml-5.6/PolyPerf/PolyPerf.vcxproj000066400000000000000000000156451265146633400176420ustar00rootroot00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {D9F58E8D-5FCD-4401-8D88-0C28732BD77B} PolyPerf DynamicLibrary true v140_xp MultiByte DynamicLibrary false v140_xp true MultiByte DynamicLibrary true v140_xp MultiByte DynamicLibrary false v140_xp true MultiByte Level3 Disabled true _CRT_SECURE_NO_WARNINGS;POLYPERF_EXPORTS;%(PreprocessorDefinitions) true psapi.lib;%(AdditionalDependencies) Windows Level3 Disabled true _CRT_SECURE_NO_WARNINGS;POLYPERF_EXPORTS;%(PreprocessorDefinitions) true psapi.lib;%(AdditionalDependencies) Windows Level3 MaxSpeed true true true _CRT_SECURE_NO_WARNINGS;POLYPERF_EXPORTS;%(PreprocessorDefinitions) true true true psapi.lib;%(AdditionalDependencies) Windows Level3 MaxSpeed true true true _CRT_SECURE_NO_WARNINGS;POLYPERF_EXPORTS;%(PreprocessorDefinitions) true true true psapi.lib;%(AdditionalDependencies) Windows polyml-5.6/Root.ML000066400000000000000000000142301265146633400140670ustar00rootroot00000000000000(* Copyright (c) 2009, 2010, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Compiler root file. This gives the "use" instructions necessary to build the compiler and suitable for use with an IDE project file. It was constructed from the Poly/ML make files. *) PolyML.print_depth 1; PolyML.Compiler.reportUnreferencedIds := true; use "basis/RuntimeCalls.ML"; use "mlsource/MLCompiler/Boot/Address.ML"; use "mlsource/MLCompiler/Boot/Misc.ML"; use "mlsource/MLCompiler/Boot/HashTable.ML"; use "mlsource/MLCompiler/Boot/UniversalTable.ML"; use "mlsource/MLCompiler/Boot/StretchArray.ML"; use "mlsource/MLCompiler/Boot/ml_bind.ML"; use "mlsource/MLCompiler/STRUCTVALSIG.sml"; use "mlsource/MLCompiler/PRETTYSIG.sml"; use "mlsource/MLCompiler/LEXSIG.sml"; use "mlsource/MLCompiler/SymbolsSig.sml"; use "mlsource/MLCompiler/COMPILERBODYSIG.sml"; use "mlsource/MLCompiler/DEBUGSIG.ML"; use "mlsource/MLCompiler/MAKE_.ML"; use "mlsource/MLCompiler/CODETREESIG.ML"; use "mlsource/MLCompiler/STRUCT_VALS.ML"; use "mlsource/MLCompiler/CodeTree/BackendIntermediateCodeSig.sml"; use "mlsource/MLCompiler/CodeTree/BaseCodeTreeSig.sml"; use "mlsource/MLCompiler/CodeTree/CodetreeFunctionsSig.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_FUNCTIONS.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_STATIC_LINK_AND_CASES.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_CODEGEN_CONSTANT_FUNCTIONS.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_LAMBDA_LIFT.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_REMOVE_REDUNDANT.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_SIMPLIFIER.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE_OPTIMISER.sml"; use "mlsource/MLCompiler/CodeTree/CODETREE.ML"; use "mlsource/MLCompiler/Pretty.sml"; use "mlsource/MLCompiler/CodeTree/X86Code/CODECONSSIG.sml"; use "mlsource/MLCompiler/CodeTree/X86Code/CODEGEN_TABLESIG.sml"; use "mlsource/MLCompiler/CodeTree/X86Code/GENERATE_CODE.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/CODE_ARRAY.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/X86CODESIG.sml"; use "mlsource/MLCompiler/CodeTree/X86Code/X86OUTPUTCODE.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/X86OPTIMISE.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/X86LOWLEVEL.ML"; use "mlsource/MLCompiler/Debug.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/CodeCons.i386.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/CODEGEN_TABLE.ML"; use "mlsource/MLCompiler/CodeTree/X86Code/CodeGenTable.ML"; use "mlsource/MLCompiler/CodeTree/BackendIntermediateCode.sml"; use "mlsource/MLCompiler/CodeTree/BaseCodeTree.sml"; use "mlsource/MLCompiler/CodeTree/X86Code/ml_bind.i386.ML"; use "mlsource/MLCompiler/CodeTree/GCode.i386.ML"; use "mlsource/MLCompiler/CodeTree/ml_bind.ML"; use "mlsource/MLCompiler/StructVals.ML"; use "mlsource/MLCompiler/LEX_.ML"; use "mlsource/MLCompiler/Symbols.ML"; use "mlsource/MLCompiler/Lex.ML"; use "mlsource/MLCompiler/SymsetSig.sml"; use "mlsource/MLCompiler/DATATYPEREPSIG.sml"; use "mlsource/MLCompiler/VALUEOPSSIG.sml"; use "mlsource/MLCompiler/EXPORTTREESIG.sml"; use "mlsource/MLCompiler/STRUCTURESSIG.sml"; use "mlsource/MLCompiler/COMPILER_BODY.ML"; use "mlsource/MLCompiler/SymSet.ML"; use "mlsource/MLCompiler/TYPETREESIG.sml"; use "mlsource/MLCompiler/COPIERSIG.sml"; use "mlsource/MLCompiler/TYPEIDCODESIG.sml"; use "mlsource/MLCompiler/DATATYPE_REP.ML"; use "mlsource/MLCompiler/VALUE_OPS.ML"; use "mlsource/MLCompiler/TYPE_TREE.ML"; use "mlsource/MLCompiler/UTILITIES_.ML"; use "mlsource/MLCompiler/Utilities.ML"; use "mlsource/MLCompiler/PRINT_TABLE.ML"; use "mlsource/MLCompiler/PrintTable.ML"; use "mlsource/MLCompiler/ExportTree.sml"; use "mlsource/MLCompiler/ExportTreeStruct.sml"; use "mlsource/MLCompiler/TypeTree.ML"; use "mlsource/MLCompiler/COPIER.sml"; use "mlsource/MLCompiler/CopierStruct.sml"; use "mlsource/MLCompiler/TYPEIDCODE.sml"; use "mlsource/MLCompiler/TypeIDCodeStruct.sml"; use "mlsource/MLCompiler/DatatypeRep.ML"; use "mlsource/MLCompiler/ValueOps.ML"; use "mlsource/MLCompiler/PARSETREESIG.sml"; use "mlsource/MLCompiler/SIGNATURESSIG.sml"; use "mlsource/MLCompiler/DEBUGGERSIG.sml"; use "mlsource/MLCompiler/STRUCTURES_.ML"; use "mlsource/MLCompiler/DEBUGGER_.sml"; use "mlsource/MLCompiler/Debugger.sml"; use "mlsource/MLCompiler/ParseTree/BaseParseTreeSig.sml"; use "mlsource/MLCompiler/ParseTree/BASE_PARSE_TREE.sml"; use "mlsource/MLCompiler/ParseTree/PrintParsetreeSig.sml"; use "mlsource/MLCompiler/ParseTree/PRINT_PARSETREE.sml"; use "mlsource/MLCompiler/ParseTree/ExportParsetreeSig.sml"; use "mlsource/MLCompiler/ParseTree/EXPORT_PARSETREE.sml"; use "mlsource/MLCompiler/ParseTree/TypeCheckParsetreeSig.sml"; use "mlsource/MLCompiler/ParseTree/TYPECHECK_PARSETREE.sml"; use "mlsource/MLCompiler/ParseTree/MatchCompilerSig.sml"; use "mlsource/MLCompiler/ParseTree/MATCH_COMPILER.sml"; use "mlsource/MLCompiler/ParseTree/CodegenParsetreeSig.sml"; use "mlsource/MLCompiler/ParseTree/CODEGEN_PARSETREE.sml"; use "mlsource/MLCompiler/ParseTree/PARSE_TREE.ML"; use "mlsource/MLCompiler/ParseTree/ml_bind.ML"; use "mlsource/MLCompiler/SIGNATURES.sml"; use "mlsource/MLCompiler/SignaturesStruct.sml"; use "mlsource/MLCompiler/Structures.ML"; use "mlsource/MLCompiler/PARSE_DEC.ML"; use "mlsource/MLCompiler/SKIPS_.ML"; use "mlsource/MLCompiler/Skips.ML"; use "mlsource/MLCompiler/PARSE_TYPE.ML"; use "mlsource/MLCompiler/ParseType.ML"; use "mlsource/MLCompiler/ParseDec.ML"; use "mlsource/MLCompiler/CompilerBody.ML"; use "mlsource/MLCompiler/CompilerVersion.sml"; use "mlsource/MLCompiler/Make.ML"; use "mlsource/MLCompiler/INITIALISE_.ML"; use "mlsource/MLCompiler/Initialise.ML"; use "mlsource/MLCompiler/ml_bind.ML"; polyml-5.6/Tests/000077500000000000000000000000001265146633400140145ustar00rootroot00000000000000polyml-5.6/Tests/Fail/000077500000000000000000000000001265146633400146675ustar00rootroot00000000000000polyml-5.6/Tests/Fail/Test001.ML000066400000000000000000000002641265146633400162630ustar00rootroot00000000000000(* Test for mismatched infixed operators. 1 of 2. *) infix << ; infixr >> ; fun a << b = a ^ b and a >> b = a ^ b; (* These are illegal in ML97 but not ML90. *) "a" << "b" >> "c"; polyml-5.6/Tests/Fail/Test002.ML000066400000000000000000000002641265146633400162640ustar00rootroot00000000000000(* Test for mismatched infixed operators. 2 of 2. *) infix << ; infixr >> ; fun a << b = a ^ b and a >> b = a ^ b; (* These are illegal in ML97 but not ML90. *) "a" >> "b" << "c"; polyml-5.6/Tests/Fail/Test003.ML000066400000000000000000000002621265146633400162630ustar00rootroot00000000000000(* After I removed the restriction on free type variables in type constructors this compiled. Now fixed. *) fun 'a f x = let type t = 'a list in [x]:t end; f 3: bool list; polyml-5.6/Tests/Fail/Test004.ML000066400000000000000000000003261265146633400162650ustar00rootroot00000000000000(* This should fail because it is an expansive polymorphic expression. *) val x = let val id: 'a->'a = fn z => z in id id end; (* It's now allowed but sets it to a unique monotype. This causes it to fail. *) x 2; polyml-5.6/Tests/Fail/Test005.ML000066400000000000000000000002351265146633400162650ustar00rootroot00000000000000(* Checks on free type variables arising from expansive expressions. *) functor F() = struct fun f i = i val z = f f end; structure S = F(); S.z 1; polyml-5.6/Tests/Fail/Test006.ML000066400000000000000000000002021265146633400162600ustar00rootroot00000000000000(* This fails because z is polymorphic. *) structure S: sig val z: 'a -> 'a end = struct fun f i = i val z = f f end; polyml-5.6/Tests/Fail/Test007.ML000066400000000000000000000002571265146633400162730ustar00rootroot00000000000000(* Tests for exporting local datatypes. All these examples are invalid in ML97. *) fn x => let datatype t = C val _ = if true then x else C in 5 end; polyml-5.6/Tests/Fail/Test008.ML000066400000000000000000000001751265146633400162730ustar00rootroot00000000000000(* Tests for exporting local datatypes. All these examples are invalid in ML97. *) fun f x = let datatype t = C in f C end; polyml-5.6/Tests/Fail/Test009.ML000066400000000000000000000002071265146633400162700ustar00rootroot00000000000000(* Tests for exporting local datatypes. All these examples are invalid in ML97. *) val rec f = fn x => let datatype t = C in f C end; polyml-5.6/Tests/Fail/Test010.ML000066400000000000000000000002361265146633400162620ustar00rootroot00000000000000(* Tests for exporting local datatypes. All these examples are invalid in ML97. *) val rec f = fn x => let local datatype t = C in val z = f C end in 3 end; polyml-5.6/Tests/Fail/Test011.ML000066400000000000000000000001611265146633400162600ustar00rootroot00000000000000(* Tests for exporting local datatypes. All these examples are invalid in ML97. *) let datatype t = C in C end; polyml-5.6/Tests/Fail/Test012.ML000066400000000000000000000006641265146633400162710ustar00rootroot00000000000000(* This example uses opaque matching to create types which are distinct from the base type (int) and from each application. *) (* This particular example also caused a problem with the code-generator which had to be fixed. *) structure A = struct type t = int val x = 1 fun succ y = y + 1 end functor f() :> sig type t val x : t val succ: t-> t end = A structure B = f() and C = f(); (* This should fail. *) val it = B.succ C.x; polyml-5.6/Tests/Fail/Test013.ML000066400000000000000000000001431265146633400162620ustar00rootroot00000000000000(* This is invalid but previously worked. *) let fun f x y = x+y in f 1 2; f 2.0 3.0; "WRONG" end; polyml-5.6/Tests/Fail/Test014.ML000066400000000000000000000002451265146633400162660ustar00rootroot00000000000000(* Should fail - Checks that we get the updated generic information. *) let fun g (x as {b,...}) = {c=b, d=b} fun i (x as {a,b,...}) = g (g x) in 1 end; polyml-5.6/Tests/Fail/Test015.ML000066400000000000000000000002761265146633400162730ustar00rootroot00000000000000(* This fails (correctly) because f must be applied to an equality type. *) local val f = valOf o #foo fun g x = (x=x; f x); val _ = f{foo=SOME 1, bar=2.0} in val g = g end; polyml-5.6/Tests/Fail/Test016.ML000066400000000000000000000002211265146633400162620ustar00rootroot00000000000000(* It's crucial that this file does NOT end with a newline. This should give an error message but shouldn't get into an infinite loop! *) 0 0;polyml-5.6/Tests/Fail/Test018.ML000066400000000000000000000011601265146633400162670ustar00rootroot00000000000000(* Stephen Weeks found this bug in which a type error results in a crash. Now fixed by checking each top-level declaration rather than the topdec as a whole. *) (* This should give a type error rather than crashing. *) val b = ref false val r = ref NONE functor F (type t val x: t val f: t -> string) = struct val _ = if !b then print (concat [f (valOf (! r)), "\n"]) else (b := true; r := SOME x) end structure S = F (type t = int val x = 13 val f = Int.toString) structure S = F (type t = real val x = 13.0 val f = Real.toString); polyml-5.6/Tests/Fail/Test019.ML000066400000000000000000000011541265146633400162730ustar00rootroot00000000000000(* This was reported as a bug in several implementations which failed to detect a type error. Poly/ML correctly detects it but I'm including this in the regression set just to make sure we don't accidentally allow it in the future. *) structure S: sig val f: 'a option -> 'a option end = struct val make: unit -> 'a option -> 'a option = fn () => let val r: 'a option ref = ref NONE in fn z => (!r before (r := z)) end val f = make () end val _ = S.f (SOME 13) val _ = case S.f (SOME (fn z => z)) of NONE => 15 | SOME f => f 17 ; polyml-5.6/Tests/Fail/Test020.ML000066400000000000000000000002471265146633400162650ustar00rootroot00000000000000(* The following is wrong. In Poly/ML the overloading becomes Word8.word and so the conversion fails. *) let fun f x = x+0w1000 in f 0w1: Word8.word; "WRONG" end; polyml-5.6/Tests/Fail/Test021.ML000066400000000000000000000006221265146633400162630ustar00rootroot00000000000000(* Check that successive right assocative operators work correctly. *) (* Include the default precedences just so we're clear. *) infix 7 * / div mod infix 6 + - ^ infixr 6 -- infixr 5 :: @ ++; val op ++ = op :: ; val op -- = op -; (* This is wrong but was not faulted in 5.2 and earlier. Must not mix left- and right-associative operators of the same precedence. *) val q = 1 -- 2 * 3 + 4; polyml-5.6/Tests/Fail/Test022.ML000066400000000000000000000002741265146633400162670ustar00rootroot00000000000000(* This is wrong but is allowed in 5.2 *) signature S = sig datatype x = A | B end; structure S: S = struct structure T = struct val A = 1 end datatype x = A | B open T end; polyml-5.6/Tests/Fail/Test023.ML000066400000000000000000000002211265146633400162600ustar00rootroot00000000000000(* This should fail but is not correctly checked in 5.2. *) let datatype t = A | B type s = t * int val q: s = (A, 1) in q end; polyml-5.6/Tests/Fail/Test024.ML000066400000000000000000000011701265146633400162650ustar00rootroot00000000000000(* Tests for well-formedness i.e. that a type with value constructors does not share with a type function. *) signature S = sig datatype t = A end where type t = int * int; signature S = sig datatype t = A type s sharing type s = t end where type s = int * int; signature S = sig datatype t = A type s = int * int sharing type s = t end; signature S = sig datatype t = A end; signature R = sig include S end where type t = int * int; signature R = sig structure Q: S end where type Q.t = int * int; signature S = sig type t = int->int end where type t = int * int; signature S = sig eqtype t end where type t = int->int; polyml-5.6/Tests/Fail/Test025.ML000066400000000000000000000006621265146633400162730ustar00rootroot00000000000000(* Test for printing error messages with type abbreviations. *) signature A = sig type t = int type s type u = s * int val f : u -> t val x : u end; signature S = sig structure A: A val f : A.u -> int end; signature T = sig structure A: A val x: A.u end; functor F (structure S: S and T: T) = struct open S val q = f T.x end; functor F (structure S: S and T: T) = struct open T val q = S.f x end; polyml-5.6/Tests/Fail/Test026.ML000066400000000000000000000004731265146633400162740ustar00rootroot00000000000000(* This is valid in ML90 which maximises equality after applying any sharing constraints but should fail in ML97. *) functor F( S: sig type s datatype t = C of s eqtype u sharing type s = u val x : s end ) = struct fun f y = S.C S.x = y end; polyml-5.6/Tests/Fail/Test027.ML000066400000000000000000000005461265146633400162760ustar00rootroot00000000000000(* Bug detected in Poly/ML 26/10/99. *) (* This function permits equality on functions due to a failure to propagate the equality attribute on flexible records. *) let fun eqforfun (x: int->int, y: int->int) = case ({a=1,b=x}, {a=1,b=y}) of (xx as {a=1,...}, yy as {a=1, ...}) => xx = yy | _ => false in eqforfun(fn x=>x, fn x=>x) end; polyml-5.6/Tests/Fail/Test028.ML000066400000000000000000000002031265146633400162650ustar00rootroot00000000000000(* This should fail because 'a becomes scoped at the fun. *) fun x () = (let val id: 'a->'a = fn z => z in id id end; fn z=>z:'a); polyml-5.6/Tests/Fail/Test029.ML000066400000000000000000000007341265146633400162770ustar00rootroot00000000000000(* Example of datatype replication from the Definition of Standard ML. *) (* This uses opaque signature matching which means that the declaration of x does not elaborate. *) signature MYBOOL = sig type bool val xor: bool * bool -> bool end; structure MyBool:> MYBOOL = struct datatype bool = datatype bool (* from the inital basis *) fun xor (true, false) = true | xor (false, true) = true | xor _ = false end; val x = MyBool.xor(true, false); polyml-5.6/Tests/Fail/Test030.ML000066400000000000000000000002041265146633400162570ustar00rootroot00000000000000(* These examples are invalid. *) structure B: sig val f: 'a->'a end = struct val f = (fn x => x) (fn x => x) end ; polyml-5.6/Tests/Fail/Test031.ML000066400000000000000000000001531265146633400162630ustar00rootroot00000000000000(* These examples are invalid. *) val f = (fn x => x) (fn x => x); structure A = struct end val y = f 7 ; polyml-5.6/Tests/Fail/Test032.ML000066400000000000000000000003721265146633400162670ustar00rootroot00000000000000(* It seems that ML97 allows free type variables in datatypes, unlike ML90. *) (* Actually that appears to have been an error, so this is now in the Invalid directory. *) fun f x = let datatype t = A of 'a val b = A x val A c = b in c end; polyml-5.6/Tests/Fail/Test033.ML000066400000000000000000000004161265146633400162670ustar00rootroot00000000000000(* It seems that ML97 allows free type variables in datatypes, unlike ML90. Actually that was an error so this is the same as p014. This fails because t is not an equality type. *) fun f x = let datatype t = A of 'a val b = A x in if b = b then x else x end; polyml-5.6/Tests/Fail/Test034.ML000066400000000000000000000006671265146633400163000ustar00rootroot00000000000000(* Frank Pfenning's example. This is almost certainly wrong but depends a bit on what structure sharing implies for the types. *) signature A = sig datatype t = C | D type s = t * t end; signature B = sig structure S : A end; functor F (structure S' : A structure T1 : B sharing T1.S = S' structure T2 : B sharing T1.S = S') = struct type r = int end; polyml-5.6/Tests/Fail/Test035.ML000066400000000000000000000001371265146633400162710ustar00rootroot00000000000000(* Various tests. *) signature S = sig type s type t = s*s sharing type s = t end; polyml-5.6/Tests/Fail/Test036.ML000066400000000000000000000001231265146633400162650ustar00rootroot00000000000000 signature S = sig type s = int datatype t = C sharing type s = t end; polyml-5.6/Tests/Fail/Test037.ML000066400000000000000000000001411265146633400162660ustar00rootroot00000000000000 signature S = sig type u type s = u * u datatype t = C; sharing type s = t end; polyml-5.6/Tests/Fail/Test038.ML000066400000000000000000000001671265146633400162770ustar00rootroot00000000000000(* This is illegal. *) signature S = sig type t type u type s = int -> int sharing type t = u = s end; polyml-5.6/Tests/Fail/Test039.ML000066400000000000000000000005571265146633400163030ustar00rootroot00000000000000(* The following is legal in ML97 but not in ML90. *) functor F( structure S: sig eqtype s datatype t = C of int -> int sharing type s = t end) = struct val x:S.s = S.C(fn i => i+1) val y = x = x end; (* But of course this must fail. *) structure Z = F(structure S = struct datatype t = C of int -> int type s = t end); polyml-5.6/Tests/Fail/Test040.ML000066400000000000000000000005051265146633400162640ustar00rootroot00000000000000(* This fails in ML97 although it would work in ML90 because at the point where t is declared it is not an equality type. *) functor F(structure S: sig type s datatype t = C of s val x: s eqtype u sharing type s = u end) = struct val q = S.C S.x val r = q = q end; polyml-5.6/Tests/Fail/Test041.ML000066400000000000000000000001461265146633400162660ustar00rootroot00000000000000 (* This should definitely be illegal. *) signature S = sig eqtype t end where type t = int->int; polyml-5.6/Tests/Fail/Test042.ML000066400000000000000000000003561265146633400162720ustar00rootroot00000000000000(* This is rejected even though the second "where type" doesn't change anything. *) (* In 5.3 the message isn't very helpful. *) signature S = sig type t type u sharing type t = u end where type u = int where type t = int; polyml-5.6/Tests/Fail/Test043.ML000066400000000000000000000002131265146633400162630ustar00rootroot00000000000000 signature S = sig type t type u structure S: sig type s end where type s = t->t sharing type S.s = u end; polyml-5.6/Tests/Fail/Test044.ML000066400000000000000000000004151265146633400162700ustar00rootroot00000000000000(* This will fail in ML97 although it was valid in ML90. Sharing is not transitive. *) functor F( structure A: sig type t val x: t end structure B: sig end structure C: sig type t end sharing A = B sharing B = C ) = struct val q = A.x : C.t end; polyml-5.6/Tests/Fail/Test045.ML000066400000000000000000000001731265146633400162720ustar00rootroot00000000000000 (* This fails in ML97. *) structure A = struct end; signature SIG = sig structure B : sig end sharing A = B end; polyml-5.6/Tests/Fail/Test046.ML000066400000000000000000000002461265146633400162740ustar00rootroot00000000000000(* Should fail - requires equality type. *) let fun f (x as {a, ...}, y as {b, ...}) = x = y in f ({a=1, b=2, c = fn x => x}, {a=1, b=2, c = fn x => x}) end; polyml-5.6/Tests/Fail/Test047.ML000066400000000000000000000002141265146633400162700ustar00rootroot00000000000000 (* This should fail. *) let val f = #a val g = #b val x = if true then f {a=1, b=2, c=3} else f {a=3,b=3, d= 4} in 1 end; polyml-5.6/Tests/Fail/Test048.ML000066400000000000000000000002251265146633400162730ustar00rootroot00000000000000(* This should fail. *) let val g = #b fun f (x as {a, ...}) = if x = x then g x else g x val _ = f{a=1, b=0.0, c = true} in () end; polyml-5.6/Tests/Fail/Test050.ML000066400000000000000000000001511265146633400162620ustar00rootroot00000000000000(* Structure tests. *) structure S: sig datatype t = A | B | C end = struct datatype t = A | B end; polyml-5.6/Tests/Fail/Test051.ML000066400000000000000000000001511265146633400162630ustar00rootroot00000000000000(* Structure/Signature match test. *) structure S: sig datatype t = X end = struct type t = int*int end; polyml-5.6/Tests/Fail/Test052.ML000066400000000000000000000001751265146633400162720ustar00rootroot00000000000000(* This gives a fault when we try to set the constructors. *) structure S: sig datatype t = X end = struct type t = int end; polyml-5.6/Tests/Fail/Test053.ML000066400000000000000000000001441265146633400162670ustar00rootroot00000000000000 datatype s = X; structure S: sig datatype t = X end where type t = s = struct datatype t = Y end; polyml-5.6/Tests/Fail/Test054.ML000066400000000000000000000001001265146633400162600ustar00rootroot00000000000000structure S: sig datatype t = X end = struct type t = real end; polyml-5.6/Tests/Fail/Test055.ML000066400000000000000000000000721265146633400162710ustar00rootroot00000000000000structure S: sig eqtype t end = struct type t = real end; polyml-5.6/Tests/Fail/Test056.ML000066400000000000000000000001011265146633400162630ustar00rootroot00000000000000(* Structure tests. *) structure S: sig type t end = struct end; polyml-5.6/Tests/Fail/Test057.ML000066400000000000000000000001171265146633400162730ustar00rootroot00000000000000(* Structure tests. *) structure S: sig structure T: sig end end = struct end; polyml-5.6/Tests/Fail/Test058.ML000066400000000000000000000001321265146633400162710ustar00rootroot00000000000000(* Structure tests. *) structure S: sig exception x of int end = struct exception x end; polyml-5.6/Tests/Fail/Test059.ML000066400000000000000000000001641265146633400162770ustar00rootroot00000000000000(* Structure tests. *) structure S: sig datatype t = A | B of int end = struct datatype t = A | B of bool end; polyml-5.6/Tests/Fail/Test060.ML000066400000000000000000000002131265146633400162620ustar00rootroot00000000000000(* Structure tests. *) structure S: sig datatype t = A | B of int type int end = struct type int = bool datatype t = A | B of int end; polyml-5.6/Tests/Fail/Test061.ML000066400000000000000000000002451265146633400162700ustar00rootroot00000000000000(* Structure tests. *) structure S: sig datatype 'a opt = NONE | SOME of 'a end where type 'a opt = 'a option = struct datatype 'a opt = NONE | SOME of 'a end; polyml-5.6/Tests/Fail/Test062.ML000066400000000000000000000001221265146633400162630ustar00rootroot00000000000000(* Structure tests. *) structure S: sig val x: int end = struct val x = true end; polyml-5.6/Tests/Fail/Test063.ML000066400000000000000000000002001265146633400162610ustar00rootroot00000000000000(* This was incorrectly accepted in 5.3 *) structure S: sig datatype a = A | B | D end = struct datatype a = A | B | C | D end; polyml-5.6/Tests/Fail/Test064.ML000066400000000000000000000001341265146633400162700ustar00rootroot00000000000000(* Check for escaping datatypes. Case 1. *) fun f x = let datatype s = S in S end; polyml-5.6/Tests/Fail/Test065.ML000066400000000000000000000001611265146633400162710ustar00rootroot00000000000000(* Check for escaping datatypes. Case 2. *) fun f x = let datatype s = S in if x = S then 1 else 2 end; polyml-5.6/Tests/Fail/Test066.ML000066400000000000000000000001661265146633400162770ustar00rootroot00000000000000(* Check for escaping datatypes. Case 3. *) val rec a = fn x => x and b = fn () => let datatype s = S in a S; 0 end; polyml-5.6/Tests/Fail/Test067.ML000066400000000000000000000001461265146633400162760ustar00rootroot00000000000000(* Check for escaping datatypes. Case 4. *) fun a x = x and b () = let datatype s = S in a S; 0 end; polyml-5.6/Tests/Fail/Test068.ML000066400000000000000000000001701265146633400162740ustar00rootroot00000000000000(* Check for escaping datatypes. Case 5. *) fun f () = let val a = ref nil datatype s = S in a := [S] end; polyml-5.6/Tests/Fail/Test069.ML000066400000000000000000000002661265146633400163030ustar00rootroot00000000000000(* Check for escaping datatypes. Another case. *) functor F() = struct datatype s = S end local val a = ref nil structure R = F() open R in val () = a := [S] end; polyml-5.6/Tests/Fail/Test070.ML000066400000000000000000000005471265146633400162750ustar00rootroot00000000000000(* Bug with polymorphic variables. This is arguably a loop-hole in the Definition of Standard ML. This has been a long-standing bug but only showed up when it caused run-time errors in 5.4 SVN. *) structure S = struct datatype ref = datatype ref end; fun f () = let val a = S.ref [] val _ = a := [1] in !a end; f(): (int->int) list; polyml-5.6/Tests/Fail/Test071.ML000066400000000000000000000000771265146633400162740ustar00rootroot00000000000000(* Check that "it" is not in the initial basis. *) val s = it; polyml-5.6/Tests/Fail/Test072.ML000066400000000000000000000011001265146633400162610ustar00rootroot00000000000000(* This gives a Fixed Record error but should not give an internal error. *) (* Test fom Lars Hupel - Bug ticket 16. *) type tracer = { enabled: bool, parent: int } type trace_data = { ctxt: bool, tracer: tracer } fun with_parent {enabled, parent} = {enabled = enabled, parent = 0} fun disable_trace {parent = parent, ...} = {enabled = false, parent = 0} fun generate_result {ctxt, tracer = {enabled, parent}} = 0 > ctxt fun ask data = let val {ctxt, ...} = data in case generate_result data of true => with_parent ctxt end; polyml-5.6/Tests/RunTests.sml000066400000000000000000000126521265146633400163260ustar00rootroot00000000000000(* Run the regression tests. *) fun runTests parentDir = let val defaultInlineSize = ! PolyML.Compiler.maxInlineSize fun runTests (dirName, expectSuccess) = let (* Run a file. Returns true if it succeeds, false if it fails. *) fun runTest fileName = let open PolyML.Compiler (* Max inline size is not available as a CP parameter and some tests adjust it. Set it to the default before each test. *) val () = maxInlineSize := defaultInlineSize (* Set it to the default *) val () = debug := false (* Reset this *) (* First in list is the name with no suffix. *) val inStream = TextIO.getInstream(TextIO.openIn fileName) val stream = ref inStream val lineNo = ref 1; fun getChar () : char option = case TextIO.StreamIO.input1 (! stream) of NONE => NONE | SOME (eoln as #"\n", strm) => ( lineNo := !lineNo + 1; stream := strm; SOME eoln ) | SOME(c, strm) => (stream := strm; SOME c) (* Create a private name space for each test otherwise declarations in one could affect another. *) fun makeSpace(globalLook, globalAll) = let open HashArray val table = hash 10 infix 8 sub fun lookup s = case table sub s of NONE => globalLook s | SOME r => SOME r fun enter(s, v) = update(table, s, v) fun all () = fold (fn(s, v, l) => (s, v) :: l) (globalAll()) table in { lookup = lookup, enter = enter, all = all } end val { lookupFix, lookupSig, lookupVal, lookupType, lookupFunct, lookupStruct, allFix, allSig, allVal, allType, allFunct, allStruct, ...} = PolyML.globalNameSpace; val fixSpace = makeSpace(lookupFix, allFix) val sigSpace = makeSpace(lookupSig, allSig) val valSpace = makeSpace(lookupVal, allVal) val typeSpace = makeSpace(lookupType, allType) val funSpace = makeSpace(lookupFunct, allFunct) val strSpace = makeSpace(lookupStruct, allStruct) val localNameSpace: PolyML.NameSpace.nameSpace = { lookupFix = #lookup fixSpace, lookupSig = #lookup sigSpace, lookupVal = #lookup valSpace, lookupType = #lookup typeSpace, lookupFunct = #lookup funSpace, lookupStruct = #lookup strSpace, enterFix = #enter fixSpace, enterSig = #enter sigSpace, enterVal = #enter valSpace, enterType = #enter typeSpace, enterFunct = #enter funSpace, enterStruct = #enter strSpace, allFix = #all fixSpace, allSig = #all sigSpace, allVal = #all valSpace, allType = #all typeSpace, allFunct = #all funSpace, allStruct = #all strSpace } (* The tests in the Fail directory should all raise exceptions in the compiler as a result of detecting errors. *) exception CompilerException in ( while not (TextIO.StreamIO.endOfStream(!stream)) do let fun discardOut _ = () val nameSpace = PolyML.globalNameSpace val code = PolyML.compiler(getChar, [CPOutStream discardOut, CPNameSpace localNameSpace]) handle Fail "Static Errors" => raise CompilerException in code() end; (* Normal termination: close the stream. *) TextIO.StreamIO.closeIn (! stream); expectSuccess (* OK if we expected success. *) ) handle CompilerException => (TextIO.StreamIO.closeIn(!stream); not expectSuccess) | exn => (TextIO.StreamIO.closeIn(!stream); false) end; open OS.FileSys OS.Path val testPath = joinDirFile{dir=parentDir, file=dirName} val dir = openDir testPath fun runDir (fails: string list) = case readDir dir of NONE => fails (* Finished *) | SOME f => if String.isSuffix "ML" f then ( print f; print " => "; if runTest(joinDirFile{dir=testPath, file=f}) then (print "Passed\n"; runDir fails) else (print "Failed!!\n"; runDir(fails @ [joinDirFile{dir=dirName, file=f}])) ) else runDir fails val failedTests = runDir [] in closeDir dir; failedTests end; in (* Each test in the Succeed directory should succeed and those in the Fail directory should fail. *) case runTests("Succeed", true) @ runTests("Fail", false) of [] => true (* All succeeded *) | failedTests => (print "\nFailed Tests: "; print(String.concatWith " " failedTests); print "\n"; false) end; polyml-5.6/Tests/Succeed/000077500000000000000000000000001265146633400153675ustar00rootroot00000000000000polyml-5.6/Tests/Succeed/Test001.ML000066400000000000000000000004731265146633400167650ustar00rootroot00000000000000(* Code-generator bug. We have to set the maximum inline function size to something small to prevent "return" from being expanded in-line. *) PolyML.Compiler.maxInlineSize := 2; fun f g x = let val old = !x fun return y = (x := old; y) in return (g x handle exn => (return (); raise exn)) end; polyml-5.6/Tests/Succeed/Test002.ML000066400000000000000000000030321265146633400167600ustar00rootroot00000000000000(* Various tests. Some of these are included elsewhere in this directory. *) signature S = sig type s type t sharing type s = t end; signature S = sig type s datatype t = C sharing type s = t end; signature S = sig structure T: sig datatype t = X of int end datatype s = Y of bool; sharing type s = T.t end; (* The following is legal in ML97 but not in ML90. *) functor F( structure S: sig eqtype s datatype t = C of int -> int sharing type s = t end) = struct val x:S.s = S.C(fn i => i+1) val y = x = x end; (* But of course this must fail. *) (*structure Z = F(structure S = struct datatype t = C of int -> int type s = t end);*) (* The following is legal because sharing between an eqtype and a type makes the type into an eqatype. *) functor F(structure S: sig eqtype s type t val x: t sharing type s = t end) = struct val q = S.x = S.x end; (* This was previously rejected but is actually legal. *) signature S = sig datatype t = C end where type t = bool; (* I don't know whether this is legal or not. *) signature S = sig eqtype t end where type t = int; (* This is legal. *) signature S = sig type t type u sharing type t = u end where type u = int; (* This is legal. A and C share so their types share. *) functor F( structure A: sig type t val x: t end structure B: sig end structure C: sig type t end sharing A = B = C ) = struct val q = A.x : C.t end; polyml-5.6/Tests/Succeed/Test003.ML000066400000000000000000000036111265146633400167640ustar00rootroot00000000000000(* A few random tests for BoolVector and BoolArray. *) fun verify true = () | verify false = raise Fail "wrong"; val a = BoolVector.tabulate(20, fn i => i mod 2 = 1); (* While working on converting these tests I actually discovered a new bug. *) verify(a = BoolVector.fromList[false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]); val b = BoolArray.tabulate(20, fn i => i mod 2 = 1); verify(BoolArray.vector b = BoolArray.vector(BoolArray.fromList[false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true])); val b = BoolArray.tabulate(20, fn i => i mod 4 = 1); verify(BoolArray.vector b = BoolArray.vector (BoolArray.fromList[false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false, false, true, false, false])); verify(not(BoolVector.sub(a, 0))); verify(BoolVector.sub(a, 9)); verify((BoolVector.sub(a, 20); false) handle Subscript => true); verify((BoolVector.sub(a, ~1); false) handle Subscript => true); verify(BoolVector.map (fn i => not i) a = BoolVector.fromList[true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]); verify(BoolVector.foldl (fn(a, b) => a orelse b) false a); verify(BoolVector.foldr (fn(a, b) => a orelse b) false a); val d = BoolVector.fromList [true, true, false, true, true]; val c = BoolVector.foldl (fn(a, b) => a :: b) [] a; verify(BoolArray.vector(BoolArray.fromList c) = BoolVector.fromList[true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]); verify(BoolVector.concat[d, d] = BoolVector.fromList[true, true, false, true, true, true, true, false, true, true]); polyml-5.6/Tests/Succeed/Test004.ML000066400000000000000000000007731265146633400167730ustar00rootroot00000000000000(* Check some word operations. These probably won't be checked elsewhere because we're converting from arbitrary precision. *) fun verify true = () | verify false = raise Fail "wrong"; (* These assume 31 bit arithmetic. TODO: Add tests for 63-bits. *) verify(Word.wordSize <> 31 orelse Word.fromInt 10000000000 = 0wx540BE400); verify(Word.wordSize <> 31 orelse Word.fromInt ~10000000000 = 0wx2BF41C00); verify(Word.fromInt 1 = 0w1); verify(Word.wordSize <> 31 orelse Word.fromInt ~1 = 0wx7FFFFFFF); polyml-5.6/Tests/Succeed/Test005.ML000066400000000000000000000002601265146633400167630ustar00rootroot00000000000000(* Bug in Word.word functions with top bit set. *) let val i = ~ 0w4; val j = Word.toInt i in if Word.toInt(i mod 0w272) = j mod 272 then () else raise Fail "WRONG" end; polyml-5.6/Tests/Succeed/Test006.ML000066400000000000000000000067001265146633400167710ustar00rootroot00000000000000(* Equality for vectors has to be dealt with specially now that we generate special equality functions for datatypes. *) fun check f = if f() then () else raise Fail "Wrong"; check (fn () => Vector.fromList [1,2,3] = Vector.fromList [1,2,3]); check (fn () => Vector.fromList [1,3,3] <> Vector.fromList [1,2,3]); check (fn () => Vector.fromList [true, false] = Vector.fromList [true, false]); check (fn () => Vector.fromList [true, false] <> Vector.fromList [true, true]); check (fn () => Vector.fromList [#"a", #"b"] = Vector.fromList [#"a", #"b"]); check (fn () => Vector.fromList [#"a", #"b"] <> Vector.fromList [#"b", #"b"]); check (fn () => Vector.fromList [0w1,0w2,0w3] = Vector.fromList [0w1,0w2,0w3]); check (fn () => Vector.fromList [0w1,0w3,0w3] <> Vector.fromList [0w1,0w2,0w3]); check (fn () => Vector.fromList [[1], [2,3], [4]] = Vector.fromList [[1], [2,3], [4]]); check (fn () => Vector.fromList [[1], [3,3], [4]] <> Vector.fromList [[1], [2,3], [4]]); check (fn () => IntVector.fromList [1,2,3] = IntVector.fromList [1,2,3]); check (fn () => IntVector.fromList [1,3,3] <> IntVector.fromList [1,2,3]); check (fn () => BoolVector.fromList [true, false] = BoolVector.fromList [true, false]); check (fn () => BoolVector.fromList [true, false] <> BoolVector.fromList [true, true]); check (fn () => CharVector.fromList [#"a", #"b"] = CharVector.fromList [#"a", #"b"]); check (fn () => CharVector.fromList [#"a", #"b"] <> CharVector.fromList [#"b", #"b"]); check (fn () => Word8Vector.fromList [0w1,0w2,0w3] = Word8Vector.fromList [0w1,0w2,0w3]); check (fn () => Word8Vector.fromList [0w1,0w3,0w3] <> Word8Vector.fromList [0w1,0w2,0w3]); (* Arrays *) let val v = Array.fromList [1,2,3] in check(fn () => v = v) end; check (fn () => Array.fromList [1,2,3] <> Array.fromList [1,2,3]); check (fn () => Array.fromList [1,3,3] <> Array.fromList [1,2,3]); let val v = Array.fromList [true, false] in check(fn () => v = v) end; check (fn () => Array.fromList [true, false] <> Array.fromList [true, false]); check (fn () => Array.fromList [true, false] <> Array.fromList [true, true]); let val v = Array.fromList [#"a", #"b"] in check(fn () => v = v) end; check (fn () => Array.fromList [#"a", #"b"] <> Array.fromList [#"a", #"b"]); check (fn () => Array.fromList [#"a", #"b"] <> Array.fromList [#"b", #"b"]); let val v = Array.fromList [0w1,0w2,0w3] in check(fn () => v = v) end; check (fn () => Array.fromList [0w1,0w2,0w3] <> Array.fromList [0w1,0w2,0w3]); check (fn () => Array.fromList [0w1,0w3,0w3] <> Array.fromList [0w1,0w2,0w3]); let val v = IntArray.fromList [1,2,3] in check(fn () => v = v) end; check (fn () => IntArray.fromList [1,2,3] <> IntArray.fromList [1,2,3]); check (fn () => IntArray.fromList [1,3,3] <> IntArray.fromList [1,2,3]); let val v = BoolArray.fromList [true, false] in check(fn () => v = v) end; check (fn () => BoolArray.fromList [true, false] <> BoolArray.fromList [true, false]); check (fn () => BoolArray.fromList [true, false] <> BoolArray.fromList [true, true]); let val v = CharArray.fromList [#"a", #"b"] in check(fn () => v = v) end; check (fn () => CharArray.fromList [#"a", #"b"] <> CharArray.fromList [#"a", #"b"]); check (fn () => CharArray.fromList [#"a", #"b"] <> CharArray.fromList [#"b", #"b"]); let val v = Word8Array.fromList [0w1,0w2,0w3] in check(fn () => v = v) end; check (fn () => Word8Array.fromList [0w1,0w2,0w3] <> Word8Array.fromList [0w1,0w2,0w3]); check (fn () => Word8Array.fromList [0w1,0w3,0w3] <> Word8Array.fromList [0w1,0w2,0w3]); polyml-5.6/Tests/Succeed/Test007.ML000066400000000000000000000003441265146633400167700ustar00rootroot00000000000000(* Check that mutable values are not "captured" at compile-time. *) let val x = ref 0 fun f () = !x val a = f() in x := 1; if a = 0 andalso f() = 1 andalso !x = 1 then () else raise Fail "WRONG" end; polyml-5.6/Tests/Succeed/Test008.ML000066400000000000000000000003161265146633400167700ustar00rootroot00000000000000(* This caused a Subscript error in the back end of the compiler at one stage. *) PolyML.Compiler.maxInlineSize := 1; fun f y = let fun a x = b (x+y) and b x = a x in a y end handle exn => raise exn; polyml-5.6/Tests/Succeed/Test009.ML000066400000000000000000000003771265146633400170000ustar00rootroot00000000000000(* Bug in combination of exception pattern matching with val bindings. *) exception E of string list; fun f x = let val E [y] = x in y end; fun g x = let val y = ref x in f(!y) end; if g(E["OK"]) = "OK" then () else raise Fail "Wrong"; polyml-5.6/Tests/Succeed/Test010.ML000066400000000000000000000002471265146633400167640ustar00rootroot00000000000000(* The code to prevent infinite loops when printing circular structures accidentally caught this case of a unary tuple. *) datatype t = X of {a: int} | Y; X{a=99}; polyml-5.6/Tests/Succeed/Test011.ML000066400000000000000000000002051265146633400167570ustar00rootroot00000000000000(* This caused a segmentation fault. *) datatype t = S | B of (int * t) list; B [(1, S)] = B [(1, S)]; polyml-5.6/Tests/Succeed/Test012.ML000066400000000000000000007714371265146633400170060ustar00rootroot00000000000000(* This caused a problem in the Sparc version because the stack frame grew to more than 4096 bytes. Thanks to Rob Arthan for reporting it. *) type STATE = int; type STATE_STACK = STATE list; datatype ('tok, 'lc, 'pp) INPUT_STACK_ITEM = Token of 'tok * 'lc | Parsed of 'pp; type('tok, 'lc, 'pp) INPUT_STACK = ('tok, 'lc, 'pp) INPUT_STACK_ITEM list; datatype ACTION = Shift of STATE | Reduce of ((string * int) * int) | Dynamic of STATE * ((string * int) * int) | Accept | Error; (* type ('lc)ACTION_TABLE = ('lc * ACTION) list PPArray.array; type GOTO_TABLE = (string * STATE) list PPArray.array; type ('tok, 'lc, 'pp)REDUCTION_TABLE = (('tok, 'lc, 'pp)INPUT_STACK -> 'pp) list E_DICT; datatype RESOLUTION = DoShift | DoReduce | DoError; type ('tok, 'lc, 'pp)RESOLVER = ('tok * 'lc) * ('tok, 'lc, 'pp)INPUT_STACK * ((string * int) * int) -> RESOLUTION; type ('tok, 'lc)CLASSIFIER = 'tok -> 'lc; type ('tok, 'lc, 'pp, 'st)ERROR_ROUTINE = 'tok * ('tok, 'lc, 'pp)INPUT_STACK * STATE_STACK * 'st -> ('tok*'st); type ('tok, 'st)READER = 'st -> ('tok * 'st); exception SYNTAX_ERROR; exception PARSER_ERROR of string; local fun get_action (actions : (''lc)ACTION_TABLE) (s:STATE) (lc:''lc) : ACTION = ( (let open PPArray in lassoc3 (sub(actions, s)) lc end handle Fail _ => Error) handle PPArray.Subscript => raise PARSER_ERROR "invalid state" ); in fun lookup_action (resolver : ('tok, ''lc, 'pp)RESOLVER) (actions : (''lc)ACTION_TABLE) (tok : 'tok) (stk : ('tok, ''lc, 'pp)INPUT_STACK) (s : STATE) (lc : ''lc) : ACTION = ( case get_action actions s lc of Dynamic (s', altsymn) => ( case resolver((tok, lc), stk, altsymn) of DoShift => Shift s' | DoReduce => Reduce altsymn | DoError => Error ) | easy => easy ); end; fun lookup_goto (gotos : GOTO_TABLE) (s:STATE) (nt : string) : STATE = ( (let open PPArray in lassoc3 (sub(gotos, s)) nt end handle Fail _ => raise PARSER_ERROR "invalid non-terminal") handle PPArray.Subscript => raise PARSER_ERROR "invalid state" ); fun lookup_reducer (reducers : ('tok, ''lc, 'pp)REDUCTION_TABLE) (nt:string) (alt : int) : ('tok, ''lc, 'pp)INPUT_STACK -> 'pp = ( case e_lookup nt reducers of Value tab => nth alt tab | Nil => raise PARSER_ERROR "invalid non-terminal/alternative" ); fun slrp'parse (s0 : STATE) (actions : (''lc)ACTION_TABLE) (gotos : GOTO_TABLE) (reducers : ('tok, ''lc, 'pp)REDUCTION_TABLE) (resolver : ('tok, ''lc, 'pp) RESOLVER) (classify : ('tok, ''lc)CLASSIFIER) (error : ('tok, ''lc, 'pp, 'st)ERROR_ROUTINE) (reader : ('tok, 'st) READER) : 'st -> 'pp = ( let open PPArray; val init_ss = [s0]; val init_is = []; val fetch_action = lookup_action resolver actions; val fetch_reducer = lookup_reducer reducers; val fetch_goto = lookup_goto gotos; fun go (tok, st) = (fn (ss, is) => let val lc = classify tok; val s = hd ss; in case fetch_action tok is s lc of Shift s' => go (reader st)((s' :: ss), Token(tok, lc) :: is) | Reduce((nt, alt), r) => ( let val reducer = fetch_reducer nt alt; val A = reducer is; val ss' = ss from r; val is' = is from r; val s' = fetch_goto (hd ss') nt; in go (tok, st) (s' :: ss', Parsed A :: is') end ) | Accept => ((ss, is) ) | Error =>( go (error (tok, is, ss, st)) (ss, is) ) | Dynamic _ => ( raise PARSER_ERROR "conflict resolution error" ) end ); in (fn st => ( case go (reader st) (init_ss, init_is)of (_, [Parsed res]) => res | _ => raise PARSER_ERROR "stacks corrupt at end of parse")) end ); fun format_stack (do_tok : 'tok -> string)(stk : ('tok, 'lc, 'pp)INPUT_STACK) : string = ( format_list (fn Token (tk, _) => do_tok tk | _ => "...") (rev stk) " " ); fun default_error (do_tok : 'tok -> string) (tok: 'tok, stk : ('tok, 'lc, 'pp)INPUT_STACK, _ : STATE_STACK, st : 'st) : ('tok*'st) = ( raw_diag_line("*** ERROR Syntax error ***"); if any stk (fn Token _ => true | _ => false) then raw_diag_line(do_tok tok ^ " not expected after: " ^ format_stack do_tok stk) else raw_diag_line(do_tok tok ^ " not expected here"); raise SYNTAX_ERROR; (tok, st) ); val (default_resolver : ('tok, 'lc, 'pp)RESOLVER) = (fn _ => raise PARSER_ERROR "shift/reduce conflict" ); fun simple_resolver (prec : (('tok * 'lc) * ('tok * 'lc)) -> RESOLUTION) : ('tok, 'lc, 'pp)RESOLVER = (fn (toklc, stk, ignored) => case stk of Token toklc' :: _ => prec (toklc', toklc) | _ :: more => simple_resolver prec (toklc, more, ignored) | [] => DoError ); end; (* of structure SlrpDriver *) open SlrpDriver; *) datatype CN_LEX_CLASS = LCAbs | LCAmpersand | LCAnd | LCAnnotation | LCAnnotationLabel | LCArbitraryAda | LCArray | LCAt | LCAuxiliary | LCBar |LCBBody | LCBecomes | LCBegin | LCBy | LCCase| LCCharacterLiteral | LCColon | LCComma | LCComment | LCCompLabel | LCConstant | LCCon | LCCrd | LCDecLabel | LCDeclare| LCDelta | LCDigits | LCDiv | LCDotDot | LCDot | LCElse | LCElsIf | LCEnd | LCEos | LCEquals | LCExit | LCFatDot | LCFor | LCFunction | LCGoesTo | LCGreaterEquals | LCGreaterThan | LCGrkGamma | LCGrkDelta | LCGrkXi | LCIdentifier | LCIf | LCImplement | LCImplementedBy | LCIn | LCIs | LCKSlot | LCLBrace | LCLChevron | LCLessEquals | LCLessGreat | LCLessThan | LCLimited | LCLoop | LCLSqBrack | LCLStrachey | LCMinus | LCMod | LCNotEquals | LCNot | LCNull | LCNumericLiteral | LCOf | LCOrd | LCOr | LCOthers | LCOut | LCPackage | LCPlus | LCPPartLabel | LCPrime | LCPrimedIdentifier | LCPragma | LCPrivate | LCProcedure | LCRBrace | LCRChevron | LCRecord | LCReferences | LCRefinedBy | LCRem | LCRenames | LCReplacedBy | LCReturn | LCReverse | LCRRange | LCRSqBrack | LCRStrachey | LCSemi | LCSeparate | LCSpecLabel | LCStarStar | LCStar | LCStmtLabel | LCStringLiteral | LCSubType | LCThen | LCTill | LCType | LCUse| LCUsing | LCVPartLabel | LCWhen | LCWhile | LCWith | LCXor | LCZ; local val slrp'a711=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551),(LCUsing,Shift 619), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]; val slrp'a710=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCSeparate,Shift 402), (LCPragma,Shift 481),(LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551) ,(LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a711; val slrp'a709=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCSeparate,Shift 400), (LCPragma,Shift 481),(LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551) ,(LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a710; val slrp'a708=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a709; val slrp'a707=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a708; val slrp'a706=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a707; val slrp'a705=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a706; val slrp'a704=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a705; val slrp'a703=[[(LCFor,Shift 596),(LCPackage,Shift 533),(LCPragma,Shift 481), (LCFunction,Shift 565),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462), (LCEos,Reduce(("declarative_part",0),0)), (LCBegin,Reduce(("declarative_part",0),0)), (LCEnd,Reduce(("declarative_part",0),0)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a704; val slrp'a702=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCAuxiliary,Shift 313),(LCEos,Reduce(("visible_part",0),0)), (LCEnd,Reduce(("visible_part",0),0)),(LCPrivate,Reduce(("visible_part",0),0)), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a703; val slrp'a701=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCAuxiliary,Shift 313),(LCEos,Reduce(("visible_part",0),0)), (LCEnd,Reduce(("visible_part",0),0)),(LCPrivate,Reduce(("visible_part",0),0)), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a702; val slrp'a700=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCAuxiliary,Shift 313),(LCEos,Reduce(("visible_part",0),0)), (LCEnd,Reduce(("visible_part",0),0)),(LCPrivate,Reduce(("visible_part",0),0)), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a701; val slrp'a699=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCEos,Reduce(("private_part",0),1)),(LCEnd,Reduce(("private_part",0),1)), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a700; val slrp'a698=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a699; val slrp'a697=[[(LCFor,Shift 596),(LCPragma,Shift 481),(LCFunction,Shift 565), (LCPackage,Shift 358),(LCUse,Shift 509),(LCType,Shift 551), (LCProcedure,Shift 530),(LCLChevron,Shift 462),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a698; val slrp'a696=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a697; val slrp'a695=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a696; val slrp'a694=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a695; val slrp'a693=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a694; val slrp'a692=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a693; val slrp'a691=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a692; val slrp'a690=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a691; val slrp'a689=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a690; val slrp'a688=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a689; val slrp'a687=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a688; val slrp'a686=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a687; val slrp'a685=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCEos,Reduce(("sequence_of_statements",0),1)), (LCElsIf,Reduce(("sequence_of_statements",0),1)), (LCElse,Reduce(("sequence_of_statements",0),1)), (LCEnd,Reduce(("sequence_of_statements",0),1)), (LCWhen,Reduce(("sequence_of_statements",0),1)),(LCCharacterLiteral,Shift 105)]]@slrp'a686; val slrp'a684=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a685; val slrp'a683=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a684; val slrp'a682=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a683; val slrp'a681=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a682; val slrp'a680=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a681; val slrp'a679=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a680; val slrp'a678=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a679; val slrp'a677=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a678; val slrp'a676=[[(LCPragma,Shift 481),(LCReturn,Shift 655),(LCExit,Shift 527), (LCIdentifier,Shift 447),(LCFor,Reduce(("name_colon_opt",0),0)), (LCWhile,Reduce(("name_colon_opt",0),0)),(LCTill,Reduce(("name_colon_opt",0),0)) ,(LCLoop,Reduce(("name_colon_opt",0),0)), (LCDeclare,Reduce(("name_colon_opt",0),0)), (LCBegin,Reduce(("name_colon_opt",0),0)),(LCCase,Shift 646),(LCIf,Shift 651), (LCNull,Shift 197),(LCLChevron,Shift 462),(LCGrkGamma,Shift 181), (LCGrkDelta,Shift 524),(LCAnnotation,Shift 168),(LCCon,Shift 459), (LCCharacterLiteral,Shift 105)]]@slrp'a677; val slrp'a675=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a676; val slrp'a674=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a675; val slrp'a673=[[(LCConstant,Shift 664),(LCLStrachey,Shift 236), (LCMinus,Shift 155),(LCPlus,Shift 154),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a674; val slrp'a672=[[(LCLStrachey,Shift 236),(LCOthers,Shift 221),(LCMinus,Shift 155) ,(LCPlus,Shift 154),(LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a673; val slrp'a671=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 112),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a672; val slrp'a670=[[(LCConstant,Shift 664),(LCLStrachey,Shift 236), (LCMinus,Shift 155),(LCPlus,Shift 154),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a671; val slrp'a669=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a670; val slrp'a668=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a669; val slrp'a667=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a668; val slrp'a666=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a667; val slrp'a665=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96),(LCBecomes,Shift 642)]]@slrp'a666; val slrp'a664=[[(LCLStrachey,Shift 236),(LCReverse,Shift 661), (LCMinus,Shift 155),(LCPlus,Shift 154),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a665; val slrp'a663=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a664; val slrp'a662=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a663; val slrp'a661=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a662; val slrp'a660=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a661; val slrp'a659=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a660; val slrp'a658=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a659; val slrp'a657=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCPragma,Shift 481) ,(LCAnnotation,Shift 563),(LCPackage,Reduce(("context_clause",0),0)), (LCProcedure,Reduce(("context_clause",0),0)), (LCFunction,Reduce(("context_clause",0),0)), (LCSeparate,Reduce(("context_clause",0),0)),(LCUse,Shift 509), (LCLChevron,Shift 462),(LCAnnotationLabel,Shift 440),(LCSpecLabel,Shift 485), (LCStmtLabel,Shift 439),(LCDecLabel,Shift 438),(LCVPartLabel,Shift 437), (LCPPartLabel,Shift 436),(LCCompLabel,Shift 435),(LCArbitraryAda,Shift 13), (LCImplementedBy,Shift 693),(LCRefinedBy,Shift 691)]]@slrp'a658; val slrp'a656=[[(LCSemi,Shift 249),(LCLStrachey,Shift 236),(LCMinus,Shift 155), (LCPlus,Shift 154),(LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a657; val slrp'a655=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a656; val slrp'a654=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a655; val slrp'a653=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a654; val slrp'a652=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a653; val slrp'a651=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a652; val slrp'a650=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOthers,Shift 115),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a651; val slrp'a649=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a650; val slrp'a648=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a649; val slrp'a647=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a648; val slrp'a646=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a647; val slrp'a645=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a646; val slrp'a644=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a645; val slrp'a643=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a644; val slrp'a642=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a643; val slrp'a641=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCElse,Shift 637),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a642; val slrp'a640=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCThen,Shift 635),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a641; val slrp'a639=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a640; val slrp'a638=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a639; val slrp'a637=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a638; val slrp'a636=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a637; val slrp'a635=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a636; val slrp'a634=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96),(LCLessGreat,Shift 72)]]@slrp'a635; val slrp'a633=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a634; val slrp'a632=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a633; val slrp'a631=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a632; val slrp'a630=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a631; val slrp'a629=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a630; val slrp'a628=[[(LCPragma,Shift 481),(LCType,Shift 551), (LCImplement,Reduce(("basic_dec_list",0),1)),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a629; val slrp'a627=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a628; val slrp'a626=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a627; val slrp'a625=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a626; val slrp'a624=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a625; val slrp'a623=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a624; val slrp'a622=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a623; val slrp'a621=[[(LCLStrachey,Shift 236),(LCMinus,Shift 155),(LCPlus,Shift 154), (LCStringLiteral,Shift 141),(LCCharacterLiteral,Shift 450), (LCNumericLiteral,Shift 140),(LCNot,Shift 610),(LCAbs,Shift 609), (LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a622; val slrp'a620=[[(LCPragma,Shift 481),(LCType,Shift 551),(LCSubType,Shift 44), (LCIdentifier,Shift 443),(LCAnnotation,Shift 22)]]@slrp'a621; val slrp'a619=[[(LCSeparate,Shift 484),(LCPackage,Shift 505), (LCFunction,Shift 532),(LCProcedure,Shift 530)]]@slrp'a620; val slrp'a618=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a619; val slrp'a617=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a618; val slrp'a616=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCPragma,Shift 481) ,(LCAnnotation,Shift 563),(LCPackage,Reduce(("context_clause",0),0)), (LCProcedure,Reduce(("context_clause",0),0)), (LCFunction,Reduce(("context_clause",0),0)), (LCSeparate,Reduce(("context_clause",0),0)),(LCEos,Reduce(("compilation",1),1)), (LCUse,Shift 509),(LCLChevron,Shift 462)]]@slrp'a617; val slrp'a615=[[(LCLimited,Shift 347),(LCPrivate,Shift 342),(LCRecord,Shift 550) ,(LCArray,Shift 495),(LCDelta,Shift 621),(LCDigits,Shift 620),(LCOrd,Shift 487), (LCRRange,Shift 628)]]@slrp'a616; val slrp'a614=[[(LCLimited,Shift 344),(LCPrivate,Shift 340),(LCRecord,Shift 550) ,(LCArray,Shift 495),(LCDelta,Shift 621),(LCDigits,Shift 620),(LCOrd,Shift 487), (LCRRange,Shift 628)]]@slrp'a615; val slrp'a613=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCNot,Shift 610), (LCAbs,Shift 609),(LCOrd,Shift 694),(LCIdentifier,Shift 96)]]@slrp'a614; val slrp'a612=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCPragma,Shift 481) ,(LCAnnotation,Shift 563),(LCPackage,Reduce(("context_clause",0),0)), (LCProcedure,Reduce(("context_clause",0),0)), (LCFunction,Reduce(("context_clause",0),0)), (LCSeparate,Reduce(("context_clause",0),0)),(LCUse,Shift 509), (LCLChevron,Shift 462)]]@slrp'a613; val slrp'a611=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCOrd,Shift 694), (LCIdentifier,Shift 96)]]@slrp'a612; val slrp'a610=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCOrd,Shift 694), (LCIdentifier,Shift 96)]]@slrp'a611; val slrp'a609=[[(LCLStrachey,Shift 236),(LCStringLiteral,Shift 141), (LCCharacterLiteral,Shift 450),(LCNumericLiteral,Shift 140),(LCOrd,Shift 694), (LCIdentifier,Shift 96)]]@slrp'a610; val slrp'a608=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCUse,Shift 509), (LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)), (LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)), (LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a609; val slrp'a607=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCUse,Shift 509), (LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)), (LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)), (LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a608; val slrp'a606=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCUse,Shift 509), (LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)), (LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)), (LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a607; val slrp'a605=[[(LCReferences,Shift 490),(LCWith,Shift 489),(LCUse,Shift 509), (LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)), (LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)), (LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a606; val slrp'a604=[[(LCXor,Shift 638),(LCOr,Shift 640),(LCAnd,Shift 639), (LCSemi,Reduce(("expression",0),1)),(LCRRange,Reduce(("expression",0),1)), (LCDigits,Reduce(("expression",0),1)),(LCDelta,Reduce(("expression",0),1)), (LCBecomes,Reduce(("expression",0),1)),(LCComma,Reduce(("expression",0),1)), (LCCrd,Reduce(("expression",0),1)),(LCThen,Reduce(("expression",0),1)), (LCIs,Reduce(("expression",0),1)),(LCGoesTo,Reduce(("expression",0),1)), (LCBar,Reduce(("expression",0),1)),(LCTill,Reduce(("expression",0),1)), (LCLoop,Reduce(("expression",0),1))]]@slrp'a605; val slrp'a603=[[(LCPackage,Shift 321),(LCFunction,Shift 532), (LCProcedure,Shift 530)]]@slrp'a604; val slrp'a602=[[(LCGoesTo,Reduce(("discrete_range",1),1)), (LCBar,Reduce(("discrete_range",1),1)),(LCTill,Reduce(("discrete_range",1),1)), (LCLoop,Reduce(("discrete_range",1),1)),(LCDelta,Shift 621),(LCDigits,Shift 620) ,(LCRRange,Shift 628),(LCBecomes,Reduce(("subtype_indication",1),1)), (LCSemi,Reduce(("subtype_indication",1),1)), (LCCrd,Reduce(("subtype_indication",1),1)), (LCComma,Reduce(("subtype_indication",1),1))]]@slrp'a603; val slrp'a601=[[(LCOrd,Shift 568),(LCGrkDelta,Shift 590), (LCSemi,Reduce(("procedure_specification_1",0),2)), (LCAnnotation,Reduce(("procedure_specification_1",0),2)), (LCLChevron,Reduce(("procedure_specification_1",0),2)), (LCIs,Reduce(("procedure_specification_1",0),2)), (LCRenames,Reduce(("procedure_specification_1",0),2)),(LCGrkGamma,Shift 181)]]@slrp'a602; val slrp'a600=[[(LCEnd,Reduce(("component_pack",0),1)), (LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a601; val slrp'a599=[[(LCRRange,Shift 633),(LCDelta,Shift 621),(LCDigits,Shift 620), (LCBecomes,Reduce(("subtype_indication",1),1)), (LCSemi,Reduce(("subtype_indication",1),1)), (LCCrd,Reduce(("subtype_indication",1),1)), (LCComma,Reduce(("subtype_indication",1),1))]]@slrp'a600; val slrp'a598=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a599; val slrp'a597=[[(LCIdentifier,Shift 512),(LCCharacterLiteral,Shift 105)]]@slrp'a598; val slrp'a596=[[(LCStringLiteral,Shift 279),(LCCharacterLiteral,Shift 105), (LCIdentifier,Shift 96)]]@slrp'a597; val slrp'a595=[[(LCDelta,Shift 621),(LCDigits,Shift 620),(LCRRange,Shift 628), (LCBecomes,Reduce(("subtype_indication",1),1)), (LCSemi,Reduce(("subtype_indication",1),1)), (LCCrd,Reduce(("subtype_indication",1),1)), (LCComma,Reduce(("subtype_indication",1),1))]]@slrp'a596; val slrp'a594=[[(LCRem,Shift 159),(LCMod,Shift 158),(LCDiv,Shift 157), (LCStar,Shift 156),(LCAmpersand,Shift 153),(LCMinus,Shift 152), (LCPlus,Shift 151),(LCBecomes,Reduce(("binoptail",0),0)), (LCSemi,Reduce(("binoptail",0),0)),(LCRRange,Reduce(("binoptail",0),0)), (LCDigits,Reduce(("binoptail",0),0)),(LCDelta,Reduce(("binoptail",0),0)), (LCComma,Reduce(("binoptail",0),0)),(LCCrd,Reduce(("binoptail",0),0)), (LCAnd,Reduce(("binoptail",0),0)),(LCOr,Reduce(("binoptail",0),0)), (LCXor,Reduce(("binoptail",0),0)),(LCGreaterEquals,Reduce(("binoptail",0),0)), (LCGreaterThan,Reduce(("binoptail",0),0)), (LCLessEquals,Reduce(("binoptail",0),0)),(LCLessThan,Reduce(("binoptail",0),0)), (LCNotEquals,Reduce(("binoptail",0),0)),(LCEquals,Reduce(("binoptail",0),0)), (LCIn,Reduce(("binoptail",0),0)),(LCNot,Reduce(("binoptail",0),0)), (LCDotDot,Reduce(("binoptail",0),0)),(LCThen,Reduce(("binoptail",0),0)), (LCIs,Reduce(("binoptail",0),0)),(LCGoesTo,Reduce(("binoptail",0),0)), (LCBar,Reduce(("binoptail",0),0)),(LCTill,Reduce(("binoptail",0),0)), (LCLoop,Reduce(("binoptail",0),0))]]@slrp'a595; val slrp'a593=[[(LCRem,Shift 159),(LCMod,Shift 158),(LCDiv,Shift 157), (LCStar,Shift 156),(LCAmpersand,Shift 153),(LCMinus,Shift 152), (LCPlus,Shift 151),(LCBecomes,Reduce(("binoptail",0),0)), (LCSemi,Reduce(("binoptail",0),0)),(LCRRange,Reduce(("binoptail",0),0)), (LCDigits,Reduce(("binoptail",0),0)),(LCDelta,Reduce(("binoptail",0),0)), (LCComma,Reduce(("binoptail",0),0)),(LCCrd,Reduce(("binoptail",0),0)), (LCAnd,Reduce(("binoptail",0),0)),(LCOr,Reduce(("binoptail",0),0)), (LCXor,Reduce(("binoptail",0),0)),(LCGreaterEquals,Reduce(("binoptail",0),0)), (LCGreaterThan,Reduce(("binoptail",0),0)), (LCLessEquals,Reduce(("binoptail",0),0)),(LCLessThan,Reduce(("binoptail",0),0)), (LCNotEquals,Reduce(("binoptail",0),0)),(LCEquals,Reduce(("binoptail",0),0)), (LCIn,Reduce(("binoptail",0),0)),(LCNot,Reduce(("binoptail",0),0)), (LCDotDot,Reduce(("binoptail",0),0)),(LCThen,Reduce(("binoptail",0),0)), (LCIs,Reduce(("binoptail",0),0)),(LCGoesTo,Reduce(("binoptail",0),0)), (LCBar,Reduce(("binoptail",0),0)),(LCTill,Reduce(("binoptail",0),0)), (LCLoop,Reduce(("binoptail",0),0))]]@slrp'a594; val slrp'a592=[[(LCRem,Shift 159),(LCMod,Shift 158),(LCDiv,Shift 157), (LCStar,Shift 156),(LCAmpersand,Shift 153),(LCMinus,Shift 152), (LCPlus,Shift 151),(LCBecomes,Reduce(("binoptail",0),0)), (LCSemi,Reduce(("binoptail",0),0)),(LCRRange,Reduce(("binoptail",0),0)), (LCDigits,Reduce(("binoptail",0),0)),(LCDelta,Reduce(("binoptail",0),0)), (LCComma,Reduce(("binoptail",0),0)),(LCCrd,Reduce(("binoptail",0),0)), (LCAnd,Reduce(("binoptail",0),0)),(LCOr,Reduce(("binoptail",0),0)), (LCXor,Reduce(("binoptail",0),0)),(LCGreaterEquals,Reduce(("binoptail",0),0)), (LCGreaterThan,Reduce(("binoptail",0),0)), (LCLessEquals,Reduce(("binoptail",0),0)),(LCLessThan,Reduce(("binoptail",0),0)), (LCNotEquals,Reduce(("binoptail",0),0)),(LCEquals,Reduce(("binoptail",0),0)), (LCIn,Reduce(("binoptail",0),0)),(LCNot,Reduce(("binoptail",0),0)), (LCDotDot,Reduce(("binoptail",0),0)),(LCThen,Reduce(("binoptail",0),0)), (LCIs,Reduce(("binoptail",0),0)),(LCGoesTo,Reduce(("binoptail",0),0)), (LCBar,Reduce(("binoptail",0),0)),(LCTill,Reduce(("binoptail",0),0)), (LCLoop,Reduce(("binoptail",0),0))]]@slrp'a593; val slrp'a591=[[(LCGrkXi,Shift 531),(LCZ,Shift 573),(LCLBrace,Shift 178), (LCLSqBrack,Shift 175)]]@slrp'a592; val slrp'a590=[[(LCGrkDelta,Shift 590), (LCSemi,Reduce(("procedure_specification_1",2),3)), (LCAnnotation,Reduce(("procedure_specification_1",2),3)), (LCLChevron,Reduce(("procedure_specification_1",2),3)), (LCIs,Reduce(("procedure_specification_1",2),3)), (LCRenames,Reduce(("procedure_specification_1",2),3)),(LCGrkGamma,Shift 181)]]@slrp'a591; val slrp'a589=[[(LCGreaterEquals,Shift 150),(LCGreaterThan,Shift 149), (LCLessEquals,Shift 148),(LCLessThan,Shift 147),(LCNotEquals,Shift 146), (LCEquals,Shift 145),(LCNot,Shift 129),(LCIn,Shift 630), (LCSemi,Reduce(("relation",0),1)),(LCRRange,Reduce(("relation",0),1)), (LCDigits,Reduce(("relation",0),1)),(LCDelta,Reduce(("relation",0),1)), (LCBecomes,Reduce(("relation",0),1)),(LCComma,Reduce(("relation",0),1)), (LCCrd,Reduce(("relation",0),1)),(LCAnd,Reduce(("relation",0),1)), (LCOr,Reduce(("relation",0),1)),(LCXor,Reduce(("relation",0),1)), (LCThen,Reduce(("relation",0),1)),(LCIs,Reduce(("relation",0),1)), (LCGoesTo,Reduce(("relation",0),1)),(LCBar,Reduce(("relation",0),1)), (LCTill,Reduce(("relation",0),1)),(LCLoop,Reduce(("relation",0),1))]]@slrp'a590; val slrp'a588=[[(LCOrd,Shift 695), (LCSemi,Reduce(("function_specification_1",2),5)), (LCAnnotation,Reduce(("function_specification_1",2),5)), (LCLChevron,Reduce(("function_specification_1",2),5)), (LCIs,Reduce(("function_specification_1",2),5)), (LCRenames,Reduce(("function_specification_1",2),5)),(LCGrkXi,Shift 531), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a589; val slrp'a587=[[(LCOrd,Shift 695), (LCSemi,Reduce(("function_specification_1",0),4)), (LCAnnotation,Reduce(("function_specification_1",0),4)), (LCLChevron,Reduce(("function_specification_1",0),4)), (LCIs,Reduce(("function_specification_1",0),4)), (LCRenames,Reduce(("function_specification_1",0),4)),(LCGrkXi,Shift 531), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a588; val slrp'a586=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a587; val slrp'a585=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a586; val slrp'a584=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a585; val slrp'a583=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a584; val slrp'a582=[[(LCNumericLiteral,Shift 185),(LCCharacterLiteral,Shift 105), (LCIdentifier,Shift 96)]]@slrp'a583; val slrp'a581=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a582; val slrp'a580=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a581; val slrp'a579=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a580; val slrp'a578=[[(LCCharacterLiteral,Shift 105),(LCIdentifier,Shift 96)]]@slrp'a579; val slrp'a577=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a578; val slrp'a576=[[(LCBegin,Shift 682),(LCDeclare,Shift 704),(LCFor,Shift 504), (LCWhile,Shift 653),(LCTill,Reduce(("iteration_scheme_opt",0),0)), (LCLoop,Reduce(("iteration_scheme_opt",0),0))]]@slrp'a577; val slrp'a575=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a576; val slrp'a574=[[(LCGrkXi,Shift 531),(LCLBrace,Shift 172),(LCLSqBrack,Shift 169)]]@slrp'a575; val slrp'a573=[[(LCGrkGamma,Shift 181),(LCGrkDelta,Shift 524)]]@slrp'a574; val slrp'a572=[[(LCRenames,Shift 577),(LCOrd,Shift 695),(LCPrime,Shift 451), (LCBecomes,Reduce(("primary",3),1)),(LCSemi,Reduce(("primary",3),1)), (LCRRange,Reduce(("primary",3),1)),(LCDigits,Reduce(("primary",3),1)), (LCDelta,Reduce(("primary",3),1)),(LCComma,Reduce(("primary",3),1)), (LCCrd,Reduce(("primary",3),1)),(LCAnd,Reduce(("primary",3),1)), (LCOr,Reduce(("primary",3),1)),(LCXor,Reduce(("primary",3),1)), (LCGreaterEquals,Reduce(("primary",3),1)), (LCGreaterThan,Reduce(("primary",3),1)),(LCLessEquals,Reduce(("primary",3),1)), (LCLessThan,Reduce(("primary",3),1)),(LCNotEquals,Reduce(("primary",3),1)), (LCEquals,Reduce(("primary",3),1)),(LCIn,Reduce(("primary",3),1)), (LCNot,Reduce(("primary",3),1)),(LCDotDot,Reduce(("primary",3),1)), (LCAmpersand,Reduce(("primary",3),1)),(LCMinus,Reduce(("primary",3),1)), (LCPlus,Reduce(("primary",3),1)),(LCRem,Reduce(("primary",3),1)), (LCMod,Reduce(("primary",3),1)),(LCDiv,Reduce(("primary",3),1)), (LCStar,Reduce(("primary",3),1)),(LCStarStar,Reduce(("primary",3),1)), (LCThen,Reduce(("primary",3),1)),(LCIs,Reduce(("primary",3),1)), (LCGoesTo,Reduce(("primary",3),1)),(LCBar,Reduce(("primary",3),1)), (LCTill,Reduce(("primary",3),1)),(LCLoop,Reduce(("primary",3),1)), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a573; val slrp'a571=[[(LCIs,Shift 613),(LCOrd,Shift 568)]]@slrp'a572; val slrp'a570=[[(LCIdentifier,Shift 443)]]@slrp'a571; val slrp'a569=[[(LCIdentifier,Shift 443)]]@slrp'a570; val slrp'a568=[[(LCEnd,Reduce(("component_list",0),1)),(LCIdentifier,Shift 443)]]@slrp'a569; val slrp'a567=[[(LCIn,Shift 476),(LCOut,Shift 284), (LCIdentifier,Reduce(("mode",0),0)),(LCCharacterLiteral,Reduce(("mode",0),0))]]@slrp'a568; val slrp'a566=[[(LCStringLiteral,Shift 279),(LCIdentifier,Shift 543)]]@slrp'a567; val slrp'a565=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a566; val slrp'a564=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a565; val slrp'a563=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a564; val slrp'a562=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a563; val slrp'a561=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a562; val slrp'a560=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a561; val slrp'a559=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a560; val slrp'a558=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a559; val slrp'a557=[[(LCCrd,Shift 602),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a558; val slrp'a556=[[(LCDot,Shift 515),(LCSemi,Shift 364),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104)]]@slrp'a557; val slrp'a555=[[(LCOrd,Shift 695),(LCBecomes,Shift 647), (LCCrd,Reduce(("parameter_specification",0),4)), (LCSemi,Reduce(("parameter_specification",0),4)),(LCPrimedIdentifier,Shift 104), (LCDot,Shift 449)]]@slrp'a556; val slrp'a554=[[(LCOrd,Shift 695),(LCSemi,Shift 295),(LCBecomes,Shift 645), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a555; val slrp'a553=[[(LCOrd,Shift 695),(LCPrime,Shift 451), (LCBecomes,Reduce(("primary",3),1)),(LCSemi,Reduce(("primary",3),1)), (LCRRange,Reduce(("primary",3),1)),(LCDigits,Reduce(("primary",3),1)), (LCDelta,Reduce(("primary",3),1)),(LCComma,Reduce(("primary",3),1)), (LCCrd,Reduce(("primary",3),1)),(LCAnd,Reduce(("primary",3),1)), (LCOr,Reduce(("primary",3),1)),(LCXor,Reduce(("primary",3),1)), (LCGreaterEquals,Reduce(("primary",3),1)), (LCGreaterThan,Reduce(("primary",3),1)),(LCLessEquals,Reduce(("primary",3),1)), (LCLessThan,Reduce(("primary",3),1)),(LCNotEquals,Reduce(("primary",3),1)), (LCEquals,Reduce(("primary",3),1)),(LCIn,Reduce(("primary",3),1)), (LCNot,Reduce(("primary",3),1)),(LCDotDot,Reduce(("primary",3),1)), (LCAmpersand,Reduce(("primary",3),1)),(LCMinus,Reduce(("primary",3),1)), (LCPlus,Reduce(("primary",3),1)),(LCRem,Reduce(("primary",3),1)), (LCMod,Reduce(("primary",3),1)),(LCDiv,Reduce(("primary",3),1)), (LCStar,Reduce(("primary",3),1)),(LCStarStar,Reduce(("primary",3),1)), (LCThen,Reduce(("primary",3),1)),(LCIs,Reduce(("primary",3),1)), (LCGoesTo,Reduce(("primary",3),1)),(LCBar,Reduce(("primary",3),1)), (LCTill,Reduce(("primary",3),1)),(LCLoop,Reduce(("primary",3),1)), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a554; val slrp'a552=[[(LCIdentifier,Shift 570)]]@slrp'a553; val slrp'a551=[[(LCIdentifier,Shift 443)]]@slrp'a552; val slrp'a550=[[(LCColon,Shift 672)]]@slrp'a551; val slrp'a549=[[(LCAnnotation,Shift 559),(LCEos,Reduce(("annotation_list",0),0)) ,(LCSemi,Reduce(("annotation_list",0),0)),(LCIs,Reduce(("annotation_list",0),0)) ,(LCRenames,Reduce(("annotation_list",0),0)), (LCPackage,Reduce(("annotation_list",0),0)), (LCProcedure,Reduce(("annotation_list",0),0)), (LCFunction,Reduce(("annotation_list",0),0)), (LCSeparate,Reduce(("annotation_list",0),0)),(LCLChevron,Shift 462)]]@slrp'a550; val slrp'a548=[[(LCPragma,Shift 481),(LCPackage,Reduce(("pragma_list",0),0)), (LCProcedure,Reduce(("pragma_list",0),0)), (LCFunction,Reduce(("pragma_list",0),0)), (LCSeparate,Reduce(("pragma_list",0),0)), (LCReferences,Reduce(("pragma_list",0),0)), (LCAnnotation,Reduce(("pragma_list",0),0)), (LCLChevron,Reduce(("pragma_list",0),0)),(LCWith,Reduce(("pragma_list",0),0)), (LCUse,Reduce(("pragma_list",0),0))]]@slrp'a549; val slrp'a547=[[(LCPragma,Shift 481),(LCPackage,Reduce(("pragma_list",0),0)), (LCProcedure,Reduce(("pragma_list",0),0)), (LCFunction,Reduce(("pragma_list",0),0)), (LCSeparate,Reduce(("pragma_list",0),0)), (LCReferences,Reduce(("pragma_list",0),0)), (LCAnnotation,Reduce(("pragma_list",0),0)), (LCLChevron,Reduce(("pragma_list",0),0)),(LCWith,Reduce(("pragma_list",0),0)), (LCUse,Reduce(("pragma_list",0),0))]]@slrp'a548; val slrp'a546=[[(LCPragma,Shift 481),(LCPackage,Reduce(("pragma_list",0),0)), (LCProcedure,Reduce(("pragma_list",0),0)), (LCFunction,Reduce(("pragma_list",0),0)), (LCSeparate,Reduce(("pragma_list",0),0)), (LCReferences,Reduce(("pragma_list",0),0)), (LCAnnotation,Reduce(("pragma_list",0),0)), (LCLChevron,Reduce(("pragma_list",0),0)),(LCWith,Reduce(("pragma_list",0),0)), (LCUse,Reduce(("pragma_list",0),0))]]@slrp'a547; val slrp'a545=[[(LCUsing,Shift 619),(LCLChevron,Reduce(("using_list",0),1)), (LCFunction,Reduce(("using_list",0),1)),(LCPackage,Reduce(("using_list",0),1)), (LCIdentifier,Reduce(("using_list",0),1)), (LCAnnotation,Reduce(("using_list",0),1)),(LCSubType,Reduce(("using_list",0),1)) ,(LCPragma,Reduce(("using_list",0),1)),(LCProcedure,Reduce(("using_list",0),1)), (LCType,Reduce(("using_list",0),1)),(LCFor,Reduce(("using_list",0),1)), (LCUse,Reduce(("using_list",0),1)),(LCBegin,Reduce(("using_list",0),1))]]@slrp'a546; val slrp'a544=[[(LCOrd,Shift 568),(LCReturn,Shift 582)]]@slrp'a545; val slrp'a543=[[(LCFor,Shift 504),(LCWhile,Shift 653), (LCTill,Reduce(("iteration_scheme_opt",0),0)), (LCLoop,Reduce(("iteration_scheme_opt",0),0))]]@slrp'a544; val slrp'a542=[[(LCWhen,Shift 671),(LCEnd,Reduce(("others_part",0),0))]]@slrp'a543; val slrp'a541=[[(LCAt,Shift 625),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a542; val slrp'a540=[[(LCDot,Shift 514),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104)]]@slrp'a541; val slrp'a539=[[(LCRenames,Shift 580),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a540; val slrp'a538=[[(LCSemi,Shift 360),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a539; val slrp'a537=[[(LCSemi,Shift 357),(LCOrd,Shift 695), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a538; val slrp'a536=[[(LCOrd,Shift 695),(LCCrd,Shift 187), (LCPrimedIdentifier,Shift 104),(LCDot,Shift 449)]]@slrp'a537; val slrp'a535=[[(LCColon,Shift 669)]]@slrp'a536; val slrp'a534=[[(LCBBody,Shift 404),(LCIdentifier,Shift 576)]]@slrp'a535; val slrp'a533=[[(LCIdentifier,Shift 543)]]@slrp'a534; val slrp'a532=[[(LCLBrace,Shift 271),(LCLSqBrack,Shift 268),(LCZ,Shift 471)]]@slrp'a533; val slrp'a531=[[(LCIdentifier,Shift 600)]]@slrp'a532; val slrp'a530=[[(LCSemi,Shift 410),(LCIs,Shift 709), (LCRenames,Reduce(("subprogram_specification",1),1))]]@slrp'a531; val slrp'a529=[[(LCSemi,Shift 409),(LCIs,Shift 708), (LCRenames,Reduce(("subprogram_specification",0),1))]]@slrp'a530; val slrp'a528=[[(LCIdentifier,Shift 229),(LCSemi,Reduce(("name_opt",0),0)), (LCWhen,Reduce(("name_opt",0),0))]]@slrp'a529; val slrp'a527=[[(LCWhen,Shift 667)]]@slrp'a528; val slrp'a526=[[(LCEos,Reduce(("k_slot",0),3)), (LCLChevron,Reduce(("k_slot",0),3)),(LCFunction,Reduce(("k_slot",0),3)), (LCPackage,Reduce(("k_slot",0),3)),(LCIdentifier,Reduce(("k_slot",0),3)), (LCAnnotation,Reduce(("k_slot",0),3)),(LCSubType,Reduce(("k_slot",0),3)), (LCPragma,Reduce(("k_slot",0),3)),(LCProcedure,Reduce(("k_slot",0),3)), (LCType,Reduce(("k_slot",0),3)),(LCFor,Reduce(("k_slot",0),3)), (LCUse,Reduce(("k_slot",0),3)),(LCCon,Reduce(("k_slot",0),3)), (LCGrkGamma,Reduce(("k_slot",0),3)),(LCGrkDelta,Reduce(("k_slot",0),3)), (LCNull,Reduce(("k_slot",0),3)),(LCExit,Reduce(("k_slot",0),3)), (LCReturn,Reduce(("k_slot",0),3)),(LCIf,Reduce(("k_slot",0),3)), (LCCase,Reduce(("k_slot",0),3)),(LCCharacterLiteral,Reduce(("k_slot",0),3)), (LCTill,Reduce(("k_slot",0),3)),(LCLoop,Reduce(("k_slot",0),3)), (LCWhile,Reduce(("k_slot",0),3)),(LCSemi,Reduce(("k_slot",0),3)), (LCEnd,Reduce(("k_slot",0),3)),(LCPrivate,Reduce(("k_slot",0),3)), (LCAuxiliary,Reduce(("k_slot",0),3)),(LCBegin,Reduce(("k_slot",0),3)), (LCElsIf,Reduce(("k_slot",0),3)),(LCElse,Reduce(("k_slot",0),3)), (LCWhen,Reduce(("k_slot",0),3)),(LCIs,Reduce(("k_slot",0),3)), (LCRenames,Reduce(("k_slot",0),3)),(LCSeparate,Reduce(("k_slot",0),3)), (LCOrd,Shift 581)]]@slrp'a527; val slrp'a525=[[(LCLBrace,Shift 178),(LCLSqBrack,Shift 175),(LCZ,Shift 461)]]@slrp'a526; val slrp'a524=[[(LCOrd,Shift 581),(LCEos,Reduce(("statement",3),4)), (LCAnnotation,Reduce(("statement",3),4)),(LCCon,Reduce(("statement",3),4)), (LCLChevron,Reduce(("statement",3),4)),(LCGrkGamma,Reduce(("statement",3),4)), (LCGrkDelta,Reduce(("statement",3),4)),(LCPragma,Reduce(("statement",3),4)), (LCNull,Reduce(("statement",3),4)),(LCExit,Reduce(("statement",3),4)), (LCReturn,Reduce(("statement",3),4)),(LCIf,Reduce(("statement",3),4)), (LCCase,Reduce(("statement",3),4)),(LCIdentifier,Reduce(("statement",3),4)), (LCCharacterLiteral,Reduce(("statement",3),4)), (LCTill,Reduce(("statement",3),4)),(LCLoop,Reduce(("statement",3),4)), (LCFor,Reduce(("statement",3),4)),(LCWhile,Reduce(("statement",3),4)), (LCElsIf,Reduce(("statement",3),4)),(LCElse,Reduce(("statement",3),4)), (LCEnd,Reduce(("statement",3),4)),(LCWhen,Reduce(("statement",3),4))]]@slrp'a525; val slrp'a523=[[(LCOrd,Shift 581),(LCEos,Reduce(("statement",1),1)), (LCAnnotation,Reduce(("statement",1),1)),(LCCon,Reduce(("statement",1),1)), (LCLChevron,Reduce(("statement",1),1)),(LCGrkGamma,Reduce(("statement",1),1)), (LCGrkDelta,Reduce(("statement",1),1)),(LCPragma,Reduce(("statement",1),1)), (LCNull,Reduce(("statement",1),1)),(LCExit,Reduce(("statement",1),1)), (LCReturn,Reduce(("statement",1),1)),(LCIf,Reduce(("statement",1),1)), (LCCase,Reduce(("statement",1),1)),(LCIdentifier,Reduce(("statement",1),1)), (LCCharacterLiteral,Reduce(("statement",1),1)), (LCTill,Reduce(("statement",1),1)),(LCLoop,Reduce(("statement",1),1)), (LCFor,Reduce(("statement",1),1)),(LCWhile,Reduce(("statement",1),1)), (LCElsIf,Reduce(("statement",1),1)),(LCElse,Reduce(("statement",1),1)), (LCEnd,Reduce(("statement",1),1)),(LCWhen,Reduce(("statement",1),1))]]@slrp'a524; val slrp'a522=[[(LCXor,Shift 638),(LCSemi,Reduce(("xor_relation",0),2)), (LCRRange,Reduce(("xor_relation",0),2)),(LCDigits,Reduce(("xor_relation",0),2)), (LCDelta,Reduce(("xor_relation",0),2)),(LCBecomes,Reduce(("xor_relation",0),2)), (LCComma,Reduce(("xor_relation",0),2)),(LCCrd,Reduce(("xor_relation",0),2)), (LCThen,Reduce(("xor_relation",0),2)),(LCIs,Reduce(("xor_relation",0),2)), (LCGoesTo,Reduce(("xor_relation",0),2)),(LCBar,Reduce(("xor_relation",0),2)), (LCTill,Reduce(("xor_relation",0),2)),(LCLoop,Reduce(("xor_relation",0),2))]]@slrp'a523; val slrp'a521=[[(LCOr,Shift 456),(LCSemi,Reduce(("or_else_relation",0),3)), (LCRRange,Reduce(("or_else_relation",0),3)), (LCDigits,Reduce(("or_else_relation",0),3)), (LCDelta,Reduce(("or_else_relation",0),3)), (LCBecomes,Reduce(("or_else_relation",0),3)), (LCComma,Reduce(("or_else_relation",0),3)), (LCCrd,Reduce(("or_else_relation",0),3)), (LCThen,Reduce(("or_else_relation",0),3)), (LCIs,Reduce(("or_else_relation",0),3)), (LCGoesTo,Reduce(("or_else_relation",0),3)), (LCBar,Reduce(("or_else_relation",0),3)), (LCTill,Reduce(("or_else_relation",0),3)), (LCLoop,Reduce(("or_else_relation",0),3))]]@slrp'a522; val slrp'a520=[[(LCOr,Shift 636),(LCSemi,Reduce(("or_relation",0),2)), (LCRRange,Reduce(("or_relation",0),2)),(LCDigits,Reduce(("or_relation",0),2)), (LCDelta,Reduce(("or_relation",0),2)),(LCBecomes,Reduce(("or_relation",0),2)), (LCComma,Reduce(("or_relation",0),2)),(LCCrd,Reduce(("or_relation",0),2)), (LCThen,Reduce(("or_relation",0),2)),(LCIs,Reduce(("or_relation",0),2)), (LCGoesTo,Reduce(("or_relation",0),2)),(LCBar,Reduce(("or_relation",0),2)), (LCTill,Reduce(("or_relation",0),2)),(LCLoop,Reduce(("or_relation",0),2))]]@slrp'a521; val slrp'a519=[[(LCAnd,Shift 455),(LCSemi,Reduce(("and_then_relation",0),3)), (LCRRange,Reduce(("and_then_relation",0),3)), (LCDigits,Reduce(("and_then_relation",0),3)), (LCDelta,Reduce(("and_then_relation",0),3)), (LCBecomes,Reduce(("and_then_relation",0),3)), (LCComma,Reduce(("and_then_relation",0),3)), (LCCrd,Reduce(("and_then_relation",0),3)), (LCThen,Reduce(("and_then_relation",0),3)), (LCIs,Reduce(("and_then_relation",0),3)), (LCGoesTo,Reduce(("and_then_relation",0),3)), (LCBar,Reduce(("and_then_relation",0),3)), (LCTill,Reduce(("and_then_relation",0),3)), (LCLoop,Reduce(("and_then_relation",0),3))]]@slrp'a520; val slrp'a518=[[(LCAnd,Shift 634),(LCSemi,Reduce(("and_relation",0),2)), (LCRRange,Reduce(("and_relation",0),2)),(LCDigits,Reduce(("and_relation",0),2)), (LCDelta,Reduce(("and_relation",0),2)),(LCBecomes,Reduce(("and_relation",0),2)), (LCComma,Reduce(("and_relation",0),2)),(LCCrd,Reduce(("and_relation",0),2)), (LCThen,Reduce(("and_relation",0),2)),(LCIs,Reduce(("and_relation",0),2)), (LCGoesTo,Reduce(("and_relation",0),2)),(LCBar,Reduce(("and_relation",0),2)), (LCTill,Reduce(("and_relation",0),2)),(LCLoop,Reduce(("and_relation",0),2))]]@slrp'a519; val slrp'a517=[[(LCAt,Shift 626),(LCRecord,Shift 508),(LCOrd,Shift 694)]]@slrp'a518; val slrp'a516=[[(LCStringLiteral,Shift 279),(LCIdentifier,Shift 102)]]@slrp'a517; val slrp'a515=[[(LCStringLiteral,Shift 279),(LCIdentifier,Shift 102)]]@slrp'a516; val slrp'a514=[[(LCOrd,Shift 695),(LCPrimedIdentifier,Shift 104), (LCDot,Shift 449)]]@slrp'a515; val slrp'a513=[[(LCUse,Shift 516),(LCOrd,Reduce(("name",0),1)), (LCDot,Reduce(("name",0),1)),(LCPrimedIdentifier,Reduce(("name",0),1)), (LCBecomes,Reduce(("name",0),1)),(LCSemi,Reduce(("name",0),1)), (LCRRange,Reduce(("name",0),1)),(LCDigits,Reduce(("name",0),1)), (LCDelta,Reduce(("name",0),1)),(LCComma,Reduce(("name",0),1)), (LCCrd,Reduce(("name",0),1)),(LCAnd,Reduce(("name",0),1)), (LCOr,Reduce(("name",0),1)),(LCXor,Reduce(("name",0),1)), (LCGreaterEquals,Reduce(("name",0),1)),(LCGreaterThan,Reduce(("name",0),1)), (LCLessEquals,Reduce(("name",0),1)),(LCLessThan,Reduce(("name",0),1)), (LCNotEquals,Reduce(("name",0),1)),(LCEquals,Reduce(("name",0),1)), (LCIn,Reduce(("name",0),1)),(LCNot,Reduce(("name",0),1)), (LCDotDot,Reduce(("name",0),1)),(LCAmpersand,Reduce(("name",0),1)), (LCMinus,Reduce(("name",0),1)),(LCPlus,Reduce(("name",0),1)), (LCRem,Reduce(("name",0),1)),(LCMod,Reduce(("name",0),1)), (LCDiv,Reduce(("name",0),1)),(LCStar,Reduce(("name",0),1)), (LCStarStar,Reduce(("name",0),1)),(LCPrime,Reduce(("name",0),1)), (LCGrkXi,Reduce(("name",0),1)),(LCRenames,Reduce(("name",0),1)), (LCAt,Reduce(("name",0),1)),(LCThen,Reduce(("name",0),1)), (LCIs,Reduce(("name",0),1)),(LCGoesTo,Reduce(("name",0),1)), (LCBar,Reduce(("name",0),1)),(LCTill,Reduce(("name",0),1)), (LCLoop,Reduce(("name",0),1)),(LCAnnotation,Reduce(("name",0),1)), (LCLChevron,Reduce(("name",0),1))]]@slrp'a514; val slrp'a512=[[(LCCrd,Reduce(("argument_association",1),1)), (LCComma,Reduce(("argument_association",1),1)), (LCGoesTo,Reduce(("discrete_range",1),1)),(LCBar,Reduce(("discrete_range",1),1)) ,(LCTill,Reduce(("discrete_range",1),1)),(LCLoop,Reduce(("discrete_range",1),1)) ,(LCRRange,Shift 628)]]@slrp'a513; val slrp'a511=[[(LCComma,Reduce(("expression_list",0),1)), (LCCrd,Reduce(("expression_list",0),1)), (LCGoesTo,Reduce(("discrete_range",1),1)),(LCBar,Reduce(("discrete_range",1),1)) ,(LCTill,Reduce(("discrete_range",1),1)),(LCLoop,Reduce(("discrete_range",1),1)) ,(LCRRange,Shift 628)]]@slrp'a512; val slrp'a510=[[(LCType,Shift 488),(LCIdentifier,Shift 443)]]@slrp'a511; val slrp'a509=[[(LCAt,Shift 426),(LCIdentifier,Reduce(("alignment_opt",0),0)), (LCCharacterLiteral,Reduce(("alignment_opt",0),0))]]@slrp'a510; val slrp'a508=[[(LCRenames,Shift 595)]]@slrp'a509; val slrp'a507=[[(LCRenames,Shift 578),(LCIs,Shift 701)]]@slrp'a508; val slrp'a506=[[(LCBBody,Shift 322),(LCIdentifier,Shift 574)]]@slrp'a507; val slrp'a505=[[(LCIdentifier,Shift 466)]]@slrp'a506; val slrp'a504=[[(LCIdentifier,Shift 229),(LCSemi,Reduce(("name_opt",0),0)), (LCWhen,Reduce(("name_opt",0),0))]]@slrp'a505; val slrp'a503=[[(LCIdentifier,Shift 229),(LCSemi,Reduce(("name_opt",0),0)), (LCWhen,Reduce(("name_opt",0),0))]]@slrp'a504; val slrp'a502=[[(LCIdentifier,Shift 229),(LCSemi,Reduce(("name_opt",0),0)), (LCWhen,Reduce(("name_opt",0),0))]]@slrp'a503; val slrp'a501=[[(LCTill,Shift 467),(LCLoop,Reduce(("till_opt",0),0))]]@slrp'a502; val slrp'a500=[[(LCElsIf,Shift 652),(LCElse,Reduce(("elsif_part",0),0)), (LCEnd,Reduce(("elsif_part",0),0))]]@slrp'a501; val slrp'a499=[[(LCElse,Shift 677),(LCEnd,Reduce(("else_part",0),0))]]@slrp'a500; val slrp'a498=[[(LCElsIf,Shift 652),(LCElse,Reduce(("elsif_part",0),0)), (LCEnd,Reduce(("elsif_part",0),0))]]@slrp'a499; val slrp'a497=[[(LCComma,Shift 649), (LCCrd,Reduce(("positional_association",0),1))]]@slrp'a498; val slrp'a496=[[(LCOrd,Shift 673)]]@slrp'a497; val slrp'a495=[[(LCGoesTo,Reduce(("discrete_range",1),1)), (LCBar,Reduce(("discrete_range",1),1)),(LCTill,Reduce(("discrete_range",1),1)), (LCLoop,Reduce(("discrete_range",1),1)),(LCRRange,Shift 628)]]@slrp'a496; val slrp'a494=[[(LCBecomes,Reduce(("fixed_point_constraint",0),1)), (LCSemi,Reduce(("fixed_point_constraint",0),1)), (LCCrd,Reduce(("fixed_point_constraint",0),1)), (LCComma,Reduce(("fixed_point_constraint",0),1)),(LCRRange,Shift 628)]]@slrp'a495; val slrp'a493=[[(LCBecomes,Reduce(("floating_point_constraint",0),1)), (LCSemi,Reduce(("floating_point_constraint",0),1)), (LCCrd,Reduce(("floating_point_constraint",0),1)), (LCComma,Reduce(("floating_point_constraint",0),1)),(LCRRange,Shift 628)]]@slrp'a494; val slrp'a492=[[(LCIs,Shift 614)]]@slrp'a493; val slrp'a491=[[(LCIdentifier,Shift 443)]]@slrp'a492; val slrp'a490=[[(LCIdentifier,Shift 443)]]@slrp'a491; val slrp'a489=[[(LCIdentifier,Shift 443)]]@slrp'a490; val slrp'a488=[[(LCIdentifier,Shift 443)]]@slrp'a489; val slrp'a487=[[(LCIdentifier,Shift 443)]]@slrp'a488; val slrp'a486=[[(LCArbitraryAda,Reduce(("any_label",5),1)), (LCImplementedBy,Shift 692),(LCRefinedBy,Shift 690)]]@slrp'a487; val slrp'a485=[[(LCOrd,Shift 585)]]@slrp'a486; val slrp'a484=[[(LCComma,Shift 688),(LCCrd,Reduce(("arg_ass_list",0),1))]]@slrp'a485; val slrp'a483=[[(LCOrd,Shift 687),(LCSemi,Shift 389)]]@slrp'a484; val slrp'a482=[[(LCIdentifier,Shift 482)]]@slrp'a483; val slrp'a481=[[(LCBegin,Shift 685), (LCEnd,Reduce(("package_implementation",0),1))]]@slrp'a482; val slrp'a480=[[(LCPrivate,Shift 697),(LCEnd,Shift 304)]]@slrp'a481; val slrp'a479=[[(LCIs,Shift 701)]]@slrp'a480; val slrp'a478=[[(LCComma,Shift 666), (LCCrd,Reduce(("positional_parameter_association",0),1))]]@slrp'a479; val slrp'a477=[[(LCOut,Shift 285),(LCIdentifier,Reduce(("mode",1),1)), (LCCharacterLiteral,Reduce(("mode",1),1))]]@slrp'a478; val slrp'a476=[[(LCColon,Shift 566)]]@slrp'a477; val slrp'a475=[[(LCSemi,Shift 569),(LCCrd,Reduce(("parlist",0),1))]]@slrp'a476; val slrp'a474=[[(LCOrd,Shift 568)]]@slrp'a475; val slrp'a473=[[(LCReturn,Shift 583)]]@slrp'a474; val slrp'a472=[[(LCLBrace,Shift 265),(LCLSqBrack,Shift 262)]]@slrp'a473; val slrp'a471=[[(LCRenames,Reduce(("subprogram_specification",1),1)), (LCSemi,Shift 253)]]@slrp'a472; val slrp'a470=[[(LCRenames,Reduce(("subprogram_specification",0),1)), (LCSemi,Shift 252)]]@slrp'a471; val slrp'a469=[[(LCWhen,Shift 654),(LCSemi,Shift 246)]]@slrp'a470; val slrp'a468=[[(LCLStrachey,Shift 236)]]@slrp'a469; val slrp'a467=[[(LCIn,Shift 663)]]@slrp'a468; val slrp'a466=[[(LCLoop,Shift 680)]]@slrp'a467; val slrp'a465=[[(LCBar,Shift 668),(LCGoesTo,Reduce(("case_choice_list",0),1))]]@slrp'a466; val slrp'a464=[[(LCRChevron,Shift 525)]]@slrp'a465; val slrp'a463=[[(LCKSlot,Shift 463)]]@slrp'a464; val slrp'a462=[[(LCLBrace,Shift 172),(LCLSqBrack,Shift 169)]]@slrp'a463; val slrp'a461=[[(LCFatDot,Shift 572)]]@slrp'a462; val slrp'a460=[[(LCZ,Shift 460)]]@slrp'a461; val slrp'a459=[[(LCStarStar,Shift 608),(LCBecomes,Reduce(("factor",0),1)), (LCSemi,Reduce(("factor",0),1)),(LCRRange,Reduce(("factor",0),1)), (LCDigits,Reduce(("factor",0),1)),(LCDelta,Reduce(("factor",0),1)), (LCComma,Reduce(("factor",0),1)),(LCCrd,Reduce(("factor",0),1)), (LCAnd,Reduce(("factor",0),1)),(LCOr,Reduce(("factor",0),1)), (LCXor,Reduce(("factor",0),1)),(LCGreaterEquals,Reduce(("factor",0),1)), (LCGreaterThan,Reduce(("factor",0),1)),(LCLessEquals,Reduce(("factor",0),1)), (LCLessThan,Reduce(("factor",0),1)),(LCNotEquals,Reduce(("factor",0),1)), (LCEquals,Reduce(("factor",0),1)),(LCIn,Reduce(("factor",0),1)), (LCNot,Reduce(("factor",0),1)),(LCDotDot,Reduce(("factor",0),1)), (LCAmpersand,Reduce(("factor",0),1)),(LCMinus,Reduce(("factor",0),1)), (LCPlus,Reduce(("factor",0),1)),(LCRem,Reduce(("factor",0),1)), (LCMod,Reduce(("factor",0),1)),(LCDiv,Reduce(("factor",0),1)), (LCStar,Reduce(("factor",0),1)),(LCThen,Reduce(("factor",0),1)), (LCIs,Reduce(("factor",0),1)),(LCGoesTo,Reduce(("factor",0),1)), (LCBar,Reduce(("factor",0),1)),(LCTill,Reduce(("factor",0),1)), (LCLoop,Reduce(("factor",0),1))]]@slrp'a460; val slrp'a458=[[(LCDotDot,Shift 622),(LCBecomes,Reduce(("sr_expression",0),1)), (LCSemi,Reduce(("sr_expression",0),1)),(LCRRange,Reduce(("sr_expression",0),1)), (LCDigits,Reduce(("sr_expression",0),1)),(LCDelta,Reduce(("sr_expression",0),1)) ,(LCComma,Reduce(("sr_expression",0),1)),(LCCrd,Reduce(("sr_expression",0),1)), (LCAnd,Reduce(("sr_expression",0),1)),(LCOr,Reduce(("sr_expression",0),1)), (LCXor,Reduce(("sr_expression",0),1)), (LCGreaterEquals,Reduce(("sr_expression",0),1)), (LCGreaterThan,Reduce(("sr_expression",0),1)), (LCLessEquals,Reduce(("sr_expression",0),1)), (LCLessThan,Reduce(("sr_expression",0),1)), (LCNotEquals,Reduce(("sr_expression",0),1)), (LCEquals,Reduce(("sr_expression",0),1)),(LCIn,Reduce(("sr_expression",0),1)), (LCNot,Reduce(("sr_expression",0),1)),(LCThen,Reduce(("sr_expression",0),1)), (LCIs,Reduce(("sr_expression",0),1)),(LCGoesTo,Reduce(("sr_expression",0),1)), (LCBar,Reduce(("sr_expression",0),1)),(LCTill,Reduce(("sr_expression",0),1)), (LCLoop,Reduce(("sr_expression",0),1))]]@slrp'a459; val slrp'a457=[[(LCElse,Shift 637)]]@slrp'a458; val slrp'a456=[[(LCThen,Shift 635)]]@slrp'a457; val slrp'a455=[[(LCBar,Shift 670), (LCGoesTo,Reduce(("aggregate_choice_list",1),1))]]@slrp'a456; val slrp'a454=[[(LCComma,Shift 674),(LCCrd,Reduce(("named_association",0),3))]]@slrp'a455; val slrp'a453=[[(LCGoesTo,Shift 650)]]@slrp'a454; val slrp'a452=[[(LCOrd,Shift 694)]]@slrp'a453; val slrp'a451=[[(LCBecomes,Reduce(("primary",1),1)), (LCSemi,Reduce(("primary",1),1)),(LCRRange,Reduce(("primary",1),1)), (LCDigits,Reduce(("primary",1),1)),(LCDelta,Reduce(("primary",1),1)), (LCComma,Reduce(("primary",1),1)),(LCCrd,Reduce(("primary",1),1)), (LCAnd,Reduce(("primary",1),1)),(LCOr,Reduce(("primary",1),1)), (LCXor,Reduce(("primary",1),1)),(LCGreaterEquals,Reduce(("primary",1),1)), (LCGreaterThan,Reduce(("primary",1),1)),(LCLessEquals,Reduce(("primary",1),1)), (LCLessThan,Reduce(("primary",1),1)),(LCNotEquals,Reduce(("primary",1),1)), (LCEquals,Reduce(("primary",1),1)),(LCIn,Reduce(("primary",1),1)), (LCNot,Reduce(("primary",1),1)),(LCDotDot,Reduce(("primary",1),1)), (LCAmpersand,Reduce(("primary",1),1)),(LCMinus,Reduce(("primary",1),1)), (LCPlus,Reduce(("primary",1),1)),(LCRem,Reduce(("primary",1),1)), (LCMod,Reduce(("primary",1),1)),(LCDiv,Reduce(("primary",1),1)), (LCStar,Reduce(("primary",1),1)),(LCStarStar,Reduce(("primary",1),1)), (LCThen,Reduce(("primary",1),1)),(LCIs,Reduce(("primary",1),1)), (LCGoesTo,Reduce(("primary",1),1)),(LCBar,Reduce(("primary",1),1)), (LCTill,Reduce(("primary",1),1)),(LCLoop,Reduce(("primary",1),1)), (LCPrimedIdentifier,Shift 106)]]@slrp'a452; val slrp'a450=[[(LCIdentifier,Shift 102)]]@slrp'a451; val slrp'a449=[[(LCUse,Shift 623),(LCOrd,Reduce(("name",3),1)), (LCDot,Reduce(("name",3),1)),(LCPrimedIdentifier,Reduce(("name",3),1)), (LCBecomes,Reduce(("name",3),1)),(LCSemi,Reduce(("name",3),1)), (LCRRange,Reduce(("name",3),1)),(LCDigits,Reduce(("name",3),1)), (LCDelta,Reduce(("name",3),1)),(LCComma,Reduce(("name",3),1)), (LCCrd,Reduce(("name",3),1)),(LCAnd,Reduce(("name",3),1)), (LCOr,Reduce(("name",3),1)),(LCXor,Reduce(("name",3),1)), (LCGreaterEquals,Reduce(("name",3),1)),(LCGreaterThan,Reduce(("name",3),1)), (LCLessEquals,Reduce(("name",3),1)),(LCLessThan,Reduce(("name",3),1)), (LCNotEquals,Reduce(("name",3),1)),(LCEquals,Reduce(("name",3),1)), (LCIn,Reduce(("name",3),1)),(LCNot,Reduce(("name",3),1)), (LCDotDot,Reduce(("name",3),1)),(LCAmpersand,Reduce(("name",3),1)), (LCMinus,Reduce(("name",3),1)),(LCPlus,Reduce(("name",3),1)), (LCRem,Reduce(("name",3),1)),(LCMod,Reduce(("name",3),1)), (LCDiv,Reduce(("name",3),1)),(LCStar,Reduce(("name",3),1)), (LCStarStar,Reduce(("name",3),1)),(LCPrime,Reduce(("name",3),1)), (LCGrkXi,Reduce(("name",3),1)),(LCRenames,Reduce(("name",3),1)), (LCAt,Reduce(("name",3),1)),(LCThen,Reduce(("name",3),1)), (LCIs,Reduce(("name",3),1)),(LCGoesTo,Reduce(("name",3),1)), (LCBar,Reduce(("name",3),1)),(LCTill,Reduce(("name",3),1)), (LCLoop,Reduce(("name",3),1)),(LCAnnotation,Reduce(("name",3),1)), (LCLChevron,Reduce(("name",3),1))]]@slrp'a450; val slrp'a448=[[(LCColon,Shift 228),(LCOrd,Reduce(("name",0),1)), (LCDot,Reduce(("name",0),1)),(LCPrimedIdentifier,Reduce(("name",0),1)), (LCBecomes,Reduce(("name",0),1)),(LCSemi,Reduce(("name",0),1)), (LCRRange,Reduce(("name",0),1)),(LCDigits,Reduce(("name",0),1)), (LCDelta,Reduce(("name",0),1)),(LCComma,Reduce(("name",0),1)), (LCCrd,Reduce(("name",0),1)),(LCAnd,Reduce(("name",0),1)), (LCOr,Reduce(("name",0),1)),(LCXor,Reduce(("name",0),1)), (LCGreaterEquals,Reduce(("name",0),1)),(LCGreaterThan,Reduce(("name",0),1)), (LCLessEquals,Reduce(("name",0),1)),(LCLessThan,Reduce(("name",0),1)), (LCNotEquals,Reduce(("name",0),1)),(LCEquals,Reduce(("name",0),1)), (LCIn,Reduce(("name",0),1)),(LCNot,Reduce(("name",0),1)), (LCDotDot,Reduce(("name",0),1)),(LCAmpersand,Reduce(("name",0),1)), (LCMinus,Reduce(("name",0),1)),(LCPlus,Reduce(("name",0),1)), (LCRem,Reduce(("name",0),1)),(LCMod,Reduce(("name",0),1)), (LCDiv,Reduce(("name",0),1)),(LCStar,Reduce(("name",0),1)), (LCStarStar,Reduce(("name",0),1)),(LCPrime,Reduce(("name",0),1)), (LCGrkXi,Reduce(("name",0),1)),(LCRenames,Reduce(("name",0),1)), (LCAt,Reduce(("name",0),1)),(LCThen,Reduce(("name",0),1)), (LCIs,Reduce(("name",0),1)),(LCGoesTo,Reduce(("name",0),1)), (LCBar,Reduce(("name",0),1)),(LCTill,Reduce(("name",0),1)), (LCLoop,Reduce(("name",0),1)),(LCAnnotation,Reduce(("name",0),1)), (LCLChevron,Reduce(("name",0),1))]]@slrp'a449; val slrp'a447=[[(LCComma,Shift 665),(LCCrd,Reduce(("discrete_range_list",0),1))]]@slrp'a448; val slrp'a446=[[(LCComma,Shift 662), (LCCrd,Reduce(("index_subtype_definition_list",0),1))]]@slrp'a447; val slrp'a445=[[(LCGoesTo,Reduce(("discrete_range",0),2)), (LCBar,Reduce(("discrete_range",0),2)),(LCTill,Reduce(("discrete_range",0),2)), (LCLoop,Reduce(("discrete_range",0),2)),(LCBecomes,Reduce(("constraint",0),1)), (LCSemi,Reduce(("constraint",0),1)),(LCCrd,Reduce(("constraint",0),1)), (LCComma,Reduce(("constraint",0),1))]]@slrp'a446; val slrp'a444=[[(LCComma,Shift 486),(LCColon,Reduce(("identifier_list",0),1)), (LCCrd,Reduce(("identifier_list",0),1)),(LCSemi,Reduce(("identifier_list",0),1)) ]]@slrp'a445; val slrp'a443=[[(LCBecomes,Shift 643),(LCSemi,Shift 29)]]@slrp'a444; val slrp'a442=[[(LCSemi,Shift 350),(LCBecomes,Shift 641)]]@slrp'a443; val slrp'a441=[[(LCArbitraryAda,Reduce(("any_label",6),1)), (LCReplacedBy,Shift 548)]]@slrp'a442; val slrp'a440=[[(LCArbitraryAda,Reduce(("any_label",4),1)), (LCImplementedBy,Shift 689)]]@slrp'a441; val slrp'a439=[[(LCArbitraryAda,Reduce(("any_label",3),1)), (LCReplacedBy,Shift 702)]]@slrp'a440; val slrp'a438=[[(LCArbitraryAda,Reduce(("any_label",2),1)), (LCReplacedBy,Shift 699)]]@slrp'a439; val slrp'a437=[[(LCArbitraryAda,Reduce(("any_label",1),1)), (LCReplacedBy,Shift 696)]]@slrp'a438; val slrp'a436=[[(LCArbitraryAda,Reduce(("any_label",0),1)), (LCReplacedBy,Shift 611)]]@slrp'a437; val slrp'a435=[[(LCEos,Reduce(("address_clause",0),6)), (LCLChevron,Reduce(("address_clause",0),6)), (LCFunction,Reduce(("address_clause",0),6)), (LCPackage,Reduce(("address_clause",0),6)), (LCIdentifier,Reduce(("address_clause",0),6)), (LCAnnotation,Reduce(("address_clause",0),6)), (LCSubType,Reduce(("address_clause",0),6)), (LCPragma,Reduce(("address_clause",0),6)), (LCProcedure,Reduce(("address_clause",0),6)), (LCType,Reduce(("address_clause",0),6)),(LCFor,Reduce(("address_clause",0),6)), (LCUse,Reduce(("address_clause",0),6)),(LCEnd,Reduce(("address_clause",0),6)), (LCPrivate,Reduce(("address_clause",0),6)), (LCAuxiliary,Reduce(("address_clause",0),6)), (LCBegin,Reduce(("address_clause",0),6))]]@slrp'a436; val slrp'a434=[[(LCSemi,Shift 434)]]@slrp'a435; val slrp'a433=[[(LCEnd,Reduce(("component_clause",0),6)), (LCIdentifier,Reduce(("component_clause",0),6)), (LCCharacterLiteral,Reduce(("component_clause",0),6))]]@slrp'a434; val slrp'a432=[[(LCSemi,Shift 432)]]@slrp'a433; val slrp'a431=[[(LCRRange,Shift 632)]]@slrp'a432; val slrp'a430=[[(LCEnd,Reduce(("component_pack",1),2))]]@slrp'a431; val slrp'a429=[[(LCIdentifier,Reduce(("alignment_opt",1),4)), (LCCharacterLiteral,Reduce(("alignment_opt",1),4))]]@slrp'a430; val slrp'a428=[[(LCSemi,Shift 428)]]@slrp'a429; val slrp'a427=[[(LCMod,Shift 624)]]@slrp'a428; val slrp'a426=[[(LCEos,Reduce(("record_representation_clause",0),9)), (LCLChevron,Reduce(("record_representation_clause",0),9)), (LCFunction,Reduce(("record_representation_clause",0),9)), (LCPackage,Reduce(("record_representation_clause",0),9)), (LCIdentifier,Reduce(("record_representation_clause",0),9)), (LCAnnotation,Reduce(("record_representation_clause",0),9)), (LCSubType,Reduce(("record_representation_clause",0),9)), (LCPragma,Reduce(("record_representation_clause",0),9)), (LCProcedure,Reduce(("record_representation_clause",0),9)), (LCType,Reduce(("record_representation_clause",0),9)), (LCFor,Reduce(("record_representation_clause",0),9)), (LCUse,Reduce(("record_representation_clause",0),9)), (LCEnd,Reduce(("record_representation_clause",0),9)), (LCPrivate,Reduce(("record_representation_clause",0),9)), (LCAuxiliary,Reduce(("record_representation_clause",0),9)), (LCBegin,Reduce(("record_representation_clause",0),9))]]@slrp'a427; val slrp'a425=[[(LCSemi,Shift 425)]]@slrp'a426; val slrp'a424=[[(LCRecord,Shift 424)]]@slrp'a425; val slrp'a423=[[(LCEnd,Shift 423)]]@slrp'a424; val slrp'a422=[[(LCEos,Reduce(("enumeration_representation_clause",0),5)), (LCLChevron,Reduce(("enumeration_representation_clause",0),5)), (LCFunction,Reduce(("enumeration_representation_clause",0),5)), (LCPackage,Reduce(("enumeration_representation_clause",0),5)), (LCIdentifier,Reduce(("enumeration_representation_clause",0),5)), (LCAnnotation,Reduce(("enumeration_representation_clause",0),5)), (LCSubType,Reduce(("enumeration_representation_clause",0),5)), (LCPragma,Reduce(("enumeration_representation_clause",0),5)), (LCProcedure,Reduce(("enumeration_representation_clause",0),5)), (LCType,Reduce(("enumeration_representation_clause",0),5)), (LCFor,Reduce(("enumeration_representation_clause",0),5)), (LCUse,Reduce(("enumeration_representation_clause",0),5)), (LCEnd,Reduce(("enumeration_representation_clause",0),5)), (LCPrivate,Reduce(("enumeration_representation_clause",0),5)), (LCAuxiliary,Reduce(("enumeration_representation_clause",0),5)), (LCBegin,Reduce(("enumeration_representation_clause",0),5))]]@slrp'a423; val slrp'a421=[[(LCSemi,Shift 421)]]@slrp'a422; val slrp'a420=[[(LCEos,Reduce(("length_clause",0),5)), (LCLChevron,Reduce(("length_clause",0),5)), (LCFunction,Reduce(("length_clause",0),5)), (LCPackage,Reduce(("length_clause",0),5)), (LCIdentifier,Reduce(("length_clause",0),5)), (LCAnnotation,Reduce(("length_clause",0),5)), (LCSubType,Reduce(("length_clause",0),5)), (LCPragma,Reduce(("length_clause",0),5)), (LCProcedure,Reduce(("length_clause",0),5)), (LCType,Reduce(("length_clause",0),5)),(LCFor,Reduce(("length_clause",0),5)), (LCUse,Reduce(("length_clause",0),5)),(LCEnd,Reduce(("length_clause",0),5)), (LCPrivate,Reduce(("length_clause",0),5)), (LCAuxiliary,Reduce(("length_clause",0),5)), (LCBegin,Reduce(("length_clause",0),5))]]@slrp'a421; val slrp'a419=[[(LCSemi,Shift 419)]]@slrp'a420; val slrp'a418=[[(LCEos,Reduce(("type_representation_clause",2),1)), (LCLChevron,Reduce(("type_representation_clause",2),1)), (LCFunction,Reduce(("type_representation_clause",2),1)), (LCPackage,Reduce(("type_representation_clause",2),1)), (LCIdentifier,Reduce(("type_representation_clause",2),1)), (LCAnnotation,Reduce(("type_representation_clause",2),1)), (LCSubType,Reduce(("type_representation_clause",2),1)), (LCPragma,Reduce(("type_representation_clause",2),1)), (LCProcedure,Reduce(("type_representation_clause",2),1)), (LCType,Reduce(("type_representation_clause",2),1)), (LCFor,Reduce(("type_representation_clause",2),1)), (LCUse,Reduce(("type_representation_clause",2),1)), (LCEnd,Reduce(("type_representation_clause",2),1)), (LCPrivate,Reduce(("type_representation_clause",2),1)), (LCAuxiliary,Reduce(("type_representation_clause",2),1)), (LCBegin,Reduce(("type_representation_clause",2),1))]]@slrp'a419; val slrp'a417=[[(LCEos,Reduce(("type_representation_clause",1),1)), (LCLChevron,Reduce(("type_representation_clause",1),1)), (LCFunction,Reduce(("type_representation_clause",1),1)), (LCPackage,Reduce(("type_representation_clause",1),1)), (LCIdentifier,Reduce(("type_representation_clause",1),1)), (LCAnnotation,Reduce(("type_representation_clause",1),1)), (LCSubType,Reduce(("type_representation_clause",1),1)), (LCPragma,Reduce(("type_representation_clause",1),1)), (LCProcedure,Reduce(("type_representation_clause",1),1)), (LCType,Reduce(("type_representation_clause",1),1)), (LCFor,Reduce(("type_representation_clause",1),1)), (LCUse,Reduce(("type_representation_clause",1),1)), (LCEnd,Reduce(("type_representation_clause",1),1)), (LCPrivate,Reduce(("type_representation_clause",1),1)), (LCAuxiliary,Reduce(("type_representation_clause",1),1)), (LCBegin,Reduce(("type_representation_clause",1),1))]]@slrp'a418; val slrp'a416=[[(LCEos,Reduce(("type_representation_clause",0),1)), (LCLChevron,Reduce(("type_representation_clause",0),1)), (LCFunction,Reduce(("type_representation_clause",0),1)), (LCPackage,Reduce(("type_representation_clause",0),1)), (LCIdentifier,Reduce(("type_representation_clause",0),1)), (LCAnnotation,Reduce(("type_representation_clause",0),1)), (LCSubType,Reduce(("type_representation_clause",0),1)), (LCPragma,Reduce(("type_representation_clause",0),1)), (LCProcedure,Reduce(("type_representation_clause",0),1)), (LCType,Reduce(("type_representation_clause",0),1)), (LCFor,Reduce(("type_representation_clause",0),1)), (LCUse,Reduce(("type_representation_clause",0),1)), (LCEnd,Reduce(("type_representation_clause",0),1)), (LCPrivate,Reduce(("type_representation_clause",0),1)), (LCAuxiliary,Reduce(("type_representation_clause",0),1)), (LCBegin,Reduce(("type_representation_clause",0),1))]]@slrp'a417; val slrp'a415=[[(LCEos,Reduce(("representation_clause",1),1)), (LCLChevron,Reduce(("representation_clause",1),1)), (LCFunction,Reduce(("representation_clause",1),1)), (LCPackage,Reduce(("representation_clause",1),1)), (LCIdentifier,Reduce(("representation_clause",1),1)), (LCAnnotation,Reduce(("representation_clause",1),1)), (LCSubType,Reduce(("representation_clause",1),1)), (LCPragma,Reduce(("representation_clause",1),1)), (LCProcedure,Reduce(("representation_clause",1),1)), (LCType,Reduce(("representation_clause",1),1)), (LCFor,Reduce(("representation_clause",1),1)), (LCUse,Reduce(("representation_clause",1),1)), (LCEnd,Reduce(("representation_clause",1),1)), (LCPrivate,Reduce(("representation_clause",1),1)), (LCAuxiliary,Reduce(("representation_clause",1),1)), (LCBegin,Reduce(("representation_clause",1),1))]]@slrp'a416; val slrp'a414=[[(LCEos,Reduce(("representation_clause",0),1)), (LCLChevron,Reduce(("representation_clause",0),1)), (LCFunction,Reduce(("representation_clause",0),1)), (LCPackage,Reduce(("representation_clause",0),1)), (LCIdentifier,Reduce(("representation_clause",0),1)), (LCAnnotation,Reduce(("representation_clause",0),1)), (LCSubType,Reduce(("representation_clause",0),1)), (LCPragma,Reduce(("representation_clause",0),1)), (LCProcedure,Reduce(("representation_clause",0),1)), (LCType,Reduce(("representation_clause",0),1)), (LCFor,Reduce(("representation_clause",0),1)), (LCUse,Reduce(("representation_clause",0),1)), (LCEnd,Reduce(("representation_clause",0),1)), (LCPrivate,Reduce(("representation_clause",0),1)), (LCAuxiliary,Reduce(("representation_clause",0),1)), (LCBegin,Reduce(("representation_clause",0),1))]]@slrp'a415; val slrp'a413=[[(LCEos,Reduce(("subunit",1),5)), (LCLChevron,Reduce(("subunit",1),5)),(LCAnnotation,Reduce(("subunit",1),5)), (LCPragma,Reduce(("subunit",1),5)),(LCReferences,Reduce(("subunit",1),5)), (LCPackage,Reduce(("subunit",1),5)),(LCSeparate,Reduce(("subunit",1),5)), (LCWith,Reduce(("subunit",1),5)),(LCUse,Reduce(("subunit",1),5)), (LCProcedure,Reduce(("subunit",1),5)),(LCFunction,Reduce(("subunit",1),5))]]@slrp'a414; val slrp'a412=[[(LCEos,Reduce(("subunit",0),5)), (LCLChevron,Reduce(("subunit",0),5)),(LCAnnotation,Reduce(("subunit",0),5)), (LCPragma,Reduce(("subunit",0),5)),(LCReferences,Reduce(("subunit",0),5)), (LCPackage,Reduce(("subunit",0),5)),(LCSeparate,Reduce(("subunit",0),5)), (LCWith,Reduce(("subunit",0),5)),(LCUse,Reduce(("subunit",0),5)), (LCProcedure,Reduce(("subunit",0),5)),(LCFunction,Reduce(("subunit",0),5))]]@slrp'a413; val slrp'a411=[[(LCEos,Reduce(("body_stub",4),2)), (LCLChevron,Reduce(("body_stub",4),2)),(LCFunction,Reduce(("body_stub",4),2)), (LCPackage,Reduce(("body_stub",4),2)),(LCIdentifier,Reduce(("body_stub",4),2)), (LCAnnotation,Reduce(("body_stub",4),2)),(LCSubType,Reduce(("body_stub",4),2)), (LCPragma,Reduce(("body_stub",4),2)),(LCProcedure,Reduce(("body_stub",4),2)), (LCType,Reduce(("body_stub",4),2)),(LCFor,Reduce(("body_stub",4),2)), (LCUse,Reduce(("body_stub",4),2)),(LCBegin,Reduce(("body_stub",4),2)), (LCEnd,Reduce(("body_stub",4),2))]]@slrp'a412; val slrp'a410=[[(LCEos,Reduce(("body_stub",3),2)), (LCLChevron,Reduce(("body_stub",3),2)),(LCFunction,Reduce(("body_stub",3),2)), (LCPackage,Reduce(("body_stub",3),2)),(LCIdentifier,Reduce(("body_stub",3),2)), (LCAnnotation,Reduce(("body_stub",3),2)),(LCSubType,Reduce(("body_stub",3),2)), (LCPragma,Reduce(("body_stub",3),2)),(LCProcedure,Reduce(("body_stub",3),2)), (LCType,Reduce(("body_stub",3),2)),(LCFor,Reduce(("body_stub",3),2)), (LCUse,Reduce(("body_stub",3),2)),(LCBegin,Reduce(("body_stub",3),2)), (LCEnd,Reduce(("body_stub",3),2))]]@slrp'a411; val slrp'a409=[[(LCEos,Reduce(("body_stub",2),7)), (LCLChevron,Reduce(("body_stub",2),7)),(LCFunction,Reduce(("body_stub",2),7)), (LCPackage,Reduce(("body_stub",2),7)),(LCIdentifier,Reduce(("body_stub",2),7)), (LCAnnotation,Reduce(("body_stub",2),7)),(LCSubType,Reduce(("body_stub",2),7)), (LCPragma,Reduce(("body_stub",2),7)),(LCProcedure,Reduce(("body_stub",2),7)), (LCType,Reduce(("body_stub",2),7)),(LCFor,Reduce(("body_stub",2),7)), (LCUse,Reduce(("body_stub",2),7)),(LCBegin,Reduce(("body_stub",2),7)), (LCEnd,Reduce(("body_stub",2),7))]]@slrp'a410; val slrp'a408=[[(LCSemi,Shift 408)]]@slrp'a409; val slrp'a407=[[(LCSeparate,Shift 407)]]@slrp'a408; val slrp'a406=[[(LCIs,Shift 406)]]@slrp'a407; val slrp'a405=[[(LCIdentifier,Shift 564)]]@slrp'a406; val slrp'a404=[[(LCEos,Reduce(("body_stub",1),4)), (LCLChevron,Reduce(("body_stub",1),4)),(LCFunction,Reduce(("body_stub",1),4)), (LCPackage,Reduce(("body_stub",1),4)),(LCIdentifier,Reduce(("body_stub",1),4)), (LCAnnotation,Reduce(("body_stub",1),4)),(LCSubType,Reduce(("body_stub",1),4)), (LCPragma,Reduce(("body_stub",1),4)),(LCProcedure,Reduce(("body_stub",1),4)), (LCType,Reduce(("body_stub",1),4)),(LCFor,Reduce(("body_stub",1),4)), (LCUse,Reduce(("body_stub",1),4)),(LCBegin,Reduce(("body_stub",1),4)), (LCEnd,Reduce(("body_stub",1),4))]]@slrp'a405; val slrp'a403=[[(LCSemi,Shift 403)]]@slrp'a404; val slrp'a402=[[(LCEos,Reduce(("body_stub",0),4)), (LCLChevron,Reduce(("body_stub",0),4)),(LCFunction,Reduce(("body_stub",0),4)), (LCPackage,Reduce(("body_stub",0),4)),(LCIdentifier,Reduce(("body_stub",0),4)), (LCAnnotation,Reduce(("body_stub",0),4)),(LCSubType,Reduce(("body_stub",0),4)), (LCPragma,Reduce(("body_stub",0),4)),(LCProcedure,Reduce(("body_stub",0),4)), (LCType,Reduce(("body_stub",0),4)),(LCFor,Reduce(("body_stub",0),4)), (LCUse,Reduce(("body_stub",0),4)),(LCBegin,Reduce(("body_stub",0),4)), (LCEnd,Reduce(("body_stub",0),4))]]@slrp'a403; val slrp'a401=[[(LCSemi,Shift 401)]]@slrp'a402; val slrp'a400=[[(LCPackage,Reduce(("references_clause",0),3)), (LCProcedure,Reduce(("references_clause",0),3)), (LCFunction,Reduce(("references_clause",0),3)), (LCSeparate,Reduce(("references_clause",0),3)), (LCReferences,Reduce(("references_clause",0),3)), (LCAnnotation,Reduce(("references_clause",0),3)), (LCLChevron,Reduce(("references_clause",0),3)), (LCWith,Reduce(("references_clause",0),3)), (LCUse,Reduce(("references_clause",0),3))]]@slrp'a401; val slrp'a399=[[(LCSemi,Shift 399)]]@slrp'a400; val slrp'a398=[[(LCPackage,Reduce(("with_clause",0),3)), (LCProcedure,Reduce(("with_clause",0),3)), (LCFunction,Reduce(("with_clause",0),3)), (LCSeparate,Reduce(("with_clause",0),3)),(LCPragma,Reduce(("with_clause",0),3)), (LCReferences,Reduce(("with_clause",0),3)), (LCAnnotation,Reduce(("with_clause",0),3)), (LCLChevron,Reduce(("with_clause",0),3)),(LCWith,Reduce(("with_clause",0),3)), (LCUse,Reduce(("with_clause",0),3))]]@slrp'a399; val slrp'a397=[[(LCSemi,Shift 397)]]@slrp'a398; val slrp'a396=[[(LCCrd,Reduce(("argument_association",0),3)), (LCComma,Reduce(("argument_association",0),3))]]@slrp'a397; val slrp'a395=[[(LCGoesTo,Shift 648)]]@slrp'a396; val slrp'a394=[[(LCCrd,Reduce(("arg_ass_list",1),3))]]@slrp'a395; val slrp'a393=[[(LCEos,Reduce(("pragma",1),6)), (LCAnnotation,Reduce(("pragma",1),6)),(LCCon,Reduce(("pragma",1),6)), (LCLChevron,Reduce(("pragma",1),6)),(LCGrkGamma,Reduce(("pragma",1),6)), (LCGrkDelta,Reduce(("pragma",1),6)),(LCPragma,Reduce(("pragma",1),6)), (LCNull,Reduce(("pragma",1),6)),(LCExit,Reduce(("pragma",1),6)), (LCReturn,Reduce(("pragma",1),6)),(LCIf,Reduce(("pragma",1),6)), (LCCase,Reduce(("pragma",1),6)),(LCIdentifier,Reduce(("pragma",1),6)), (LCCharacterLiteral,Reduce(("pragma",1),6)),(LCTill,Reduce(("pragma",1),6)), (LCLoop,Reduce(("pragma",1),6)),(LCFor,Reduce(("pragma",1),6)), (LCWhile,Reduce(("pragma",1),6)),(LCReferences,Reduce(("pragma",1),6)), (LCPackage,Reduce(("pragma",1),6)),(LCSeparate,Reduce(("pragma",1),6)), (LCWith,Reduce(("pragma",1),6)),(LCUse,Reduce(("pragma",1),6)), (LCProcedure,Reduce(("pragma",1),6)),(LCFunction,Reduce(("pragma",1),6)), (LCSubType,Reduce(("pragma",1),6)),(LCType,Reduce(("pragma",1),6)), (LCImplement,Reduce(("pragma",1),6)),(LCElsIf,Reduce(("pragma",1),6)), (LCElse,Reduce(("pragma",1),6)),(LCEnd,Reduce(("pragma",1),6)), (LCWhen,Reduce(("pragma",1),6)),(LCPrivate,Reduce(("pragma",1),6)), (LCAuxiliary,Reduce(("pragma",1),6)),(LCBegin,Reduce(("pragma",1),6))]]@slrp'a394; val slrp'a392=[[(LCSemi,Shift 392)]]@slrp'a393; val slrp'a391=[[(LCCrd,Shift 391)]]@slrp'a392; val slrp'a390=[[(LCEos,Reduce(("pragma",0),3)), (LCAnnotation,Reduce(("pragma",0),3)),(LCCon,Reduce(("pragma",0),3)), (LCLChevron,Reduce(("pragma",0),3)),(LCGrkGamma,Reduce(("pragma",0),3)), (LCGrkDelta,Reduce(("pragma",0),3)),(LCPragma,Reduce(("pragma",0),3)), (LCNull,Reduce(("pragma",0),3)),(LCExit,Reduce(("pragma",0),3)), (LCReturn,Reduce(("pragma",0),3)),(LCIf,Reduce(("pragma",0),3)), (LCCase,Reduce(("pragma",0),3)),(LCIdentifier,Reduce(("pragma",0),3)), (LCCharacterLiteral,Reduce(("pragma",0),3)),(LCTill,Reduce(("pragma",0),3)), (LCLoop,Reduce(("pragma",0),3)),(LCFor,Reduce(("pragma",0),3)), (LCWhile,Reduce(("pragma",0),3)),(LCReferences,Reduce(("pragma",0),3)), (LCPackage,Reduce(("pragma",0),3)),(LCSeparate,Reduce(("pragma",0),3)), (LCWith,Reduce(("pragma",0),3)),(LCUse,Reduce(("pragma",0),3)), (LCProcedure,Reduce(("pragma",0),3)),(LCFunction,Reduce(("pragma",0),3)), (LCSubType,Reduce(("pragma",0),3)),(LCType,Reduce(("pragma",0),3)), (LCImplement,Reduce(("pragma",0),3)),(LCElsIf,Reduce(("pragma",0),3)), (LCElse,Reduce(("pragma",0),3)),(LCEnd,Reduce(("pragma",0),3)), (LCWhen,Reduce(("pragma",0),3)),(LCPrivate,Reduce(("pragma",0),3)), (LCAuxiliary,Reduce(("pragma",0),3)),(LCBegin,Reduce(("pragma",0),3))]]@slrp'a391; val slrp'a389=[[(LCPackage,Reduce(("pragma_list",1),2)), (LCProcedure,Reduce(("pragma_list",1),2)), (LCFunction,Reduce(("pragma_list",1),2)), (LCSeparate,Reduce(("pragma_list",1),2)), (LCReferences,Reduce(("pragma_list",1),2)), (LCAnnotation,Reduce(("pragma_list",1),2)), (LCLChevron,Reduce(("pragma_list",1),2)),(LCWith,Reduce(("pragma_list",1),2)), (LCUse,Reduce(("pragma_list",1),2))]]@slrp'a390; val slrp'a388=[[(LCPackage,Reduce(("with_or_use_clause",1),1)), (LCProcedure,Reduce(("with_or_use_clause",1),1)), (LCFunction,Reduce(("with_or_use_clause",1),1)), (LCSeparate,Reduce(("with_or_use_clause",1),1)), (LCPragma,Reduce(("with_or_use_clause",1),1)), (LCReferences,Reduce(("with_or_use_clause",1),1)), (LCAnnotation,Reduce(("with_or_use_clause",1),1)), (LCLChevron,Reduce(("with_or_use_clause",1),1)), (LCWith,Reduce(("with_or_use_clause",1),1)), (LCUse,Reduce(("with_or_use_clause",1),1))]]@slrp'a389; val slrp'a387=[[(LCPackage,Reduce(("with_or_use_clause",0),1)), (LCProcedure,Reduce(("with_or_use_clause",0),1)), (LCFunction,Reduce(("with_or_use_clause",0),1)), (LCSeparate,Reduce(("with_or_use_clause",0),1)), (LCPragma,Reduce(("with_or_use_clause",0),1)), (LCReferences,Reduce(("with_or_use_clause",0),1)), (LCAnnotation,Reduce(("with_or_use_clause",0),1)), (LCLChevron,Reduce(("with_or_use_clause",0),1)), (LCWith,Reduce(("with_or_use_clause",0),1)), (LCUse,Reduce(("with_or_use_clause",0),1))]]@slrp'a388; val slrp'a386=[[(LCPackage,Reduce(("annotated_context_clause",2),1)), (LCProcedure,Reduce(("annotated_context_clause",2),1)), (LCFunction,Reduce(("annotated_context_clause",2),1)), (LCSeparate,Reduce(("annotated_context_clause",2),1))]]@slrp'a387; val slrp'a385=[[(LCPackage,Reduce(("annotated_context_clause",1),2)), (LCProcedure,Reduce(("annotated_context_clause",1),2)), (LCFunction,Reduce(("annotated_context_clause",1),2)), (LCSeparate,Reduce(("annotated_context_clause",1),2))]]@slrp'a386; val slrp'a384=[[(LCPackage,Reduce(("annotated_context_clause",0),3)), (LCProcedure,Reduce(("annotated_context_clause",0),3)), (LCFunction,Reduce(("annotated_context_clause",0),3)), (LCSeparate,Reduce(("annotated_context_clause",0),3))]]@slrp'a385; val slrp'a383=[[(LCPackage,Reduce(("context_clause",3),2)), (LCProcedure,Reduce(("context_clause",3),2)), (LCFunction,Reduce(("context_clause",3),2)), (LCSeparate,Reduce(("context_clause",3),2))]]@slrp'a384; val slrp'a382=[[(LCPackage,Reduce(("context_clause",2),2)), (LCProcedure,Reduce(("context_clause",2),2)), (LCFunction,Reduce(("context_clause",2),2)), (LCSeparate,Reduce(("context_clause",2),2))]]@slrp'a383; val slrp'a381=[[(LCPackage,Reduce(("context_clause",1),3)), (LCProcedure,Reduce(("context_clause",1),3)), (LCFunction,Reduce(("context_clause",1),3)), (LCSeparate,Reduce(("context_clause",1),3))]]@slrp'a382; val slrp'a380=[[(LCEos,Reduce(("main_program",0),1)), (LCLChevron,Reduce(("main_program",0),1)), (LCAnnotation,Reduce(("main_program",0),1)), (LCPragma,Reduce(("main_program",0),1)), (LCReferences,Reduce(("main_program",0),1)), (LCPackage,Reduce(("main_program",0),1)), (LCSeparate,Reduce(("main_program",0),1)),(LCWith,Reduce(("main_program",0),1)), (LCUse,Reduce(("main_program",0),1)),(LCProcedure,Reduce(("main_program",0),1)), (LCFunction,Reduce(("main_program",0),1))]]@slrp'a381; val slrp'a379=[[(LCEos,Reduce(("library_unit_body",0),1)), (LCLChevron,Reduce(("library_unit_body",0),1)), (LCAnnotation,Reduce(("library_unit_body",0),1)), (LCPragma,Reduce(("library_unit_body",0),1)), (LCReferences,Reduce(("library_unit_body",0),1)), (LCPackage,Reduce(("library_unit_body",0),1)), (LCSeparate,Reduce(("library_unit_body",0),1)), (LCWith,Reduce(("library_unit_body",0),1)), (LCUse,Reduce(("library_unit_body",0),1)), (LCProcedure,Reduce(("library_unit_body",0),1)), (LCFunction,Reduce(("library_unit_body",0),1))]]@slrp'a380; val slrp'a378=[[(LCEos,Reduce(("secondary_unit",1),1)), (LCLChevron,Reduce(("secondary_unit",1),1)), (LCAnnotation,Reduce(("secondary_unit",1),1)), (LCPragma,Reduce(("secondary_unit",1),1)), (LCReferences,Reduce(("secondary_unit",1),1)), (LCPackage,Reduce(("secondary_unit",1),1)), (LCSeparate,Reduce(("secondary_unit",1),1)), (LCWith,Reduce(("secondary_unit",1),1)),(LCUse,Reduce(("secondary_unit",1),1)), (LCProcedure,Reduce(("secondary_unit",1),1)), (LCFunction,Reduce(("secondary_unit",1),1))]]@slrp'a379; val slrp'a377=[[(LCEos,Reduce(("secondary_unit",0),1)), (LCLChevron,Reduce(("secondary_unit",0),1)), (LCAnnotation,Reduce(("secondary_unit",0),1)), (LCPragma,Reduce(("secondary_unit",0),1)), (LCReferences,Reduce(("secondary_unit",0),1)), (LCPackage,Reduce(("secondary_unit",0),1)), (LCSeparate,Reduce(("secondary_unit",0),1)), (LCWith,Reduce(("secondary_unit",0),1)),(LCUse,Reduce(("secondary_unit",0),1)), (LCProcedure,Reduce(("secondary_unit",0),1)), (LCFunction,Reduce(("secondary_unit",0),1))]]@slrp'a378; val slrp'a376=[[(LCEos,Reduce(("library_unit",1),1)), (LCLChevron,Reduce(("library_unit",1),1)), (LCAnnotation,Reduce(("library_unit",1),1)), (LCPragma,Reduce(("library_unit",1),1)), (LCReferences,Reduce(("library_unit",1),1)), (LCPackage,Reduce(("library_unit",1),1)), (LCSeparate,Reduce(("library_unit",1),1)),(LCWith,Reduce(("library_unit",1),1)), (LCUse,Reduce(("library_unit",1),1)),(LCProcedure,Reduce(("library_unit",1),1)), (LCFunction,Reduce(("library_unit",1),1))]]@slrp'a377; val slrp'a375=[[(LCEos,Reduce(("library_unit",0),1)), (LCLChevron,Reduce(("library_unit",0),1)), (LCAnnotation,Reduce(("library_unit",0),1)), (LCPragma,Reduce(("library_unit",0),1)), (LCReferences,Reduce(("library_unit",0),1)), (LCPackage,Reduce(("library_unit",0),1)), (LCSeparate,Reduce(("library_unit",0),1)),(LCWith,Reduce(("library_unit",0),1)), (LCUse,Reduce(("library_unit",0),1)),(LCProcedure,Reduce(("library_unit",0),1)), (LCFunction,Reduce(("library_unit",0),1))]]@slrp'a376; val slrp'a374=[[(LCEos,Reduce(("compilation_unit",2),1)), (LCLChevron,Reduce(("compilation_unit",2),1)), (LCAnnotation,Reduce(("compilation_unit",2),1)), (LCPragma,Reduce(("compilation_unit",2),1)), (LCReferences,Reduce(("compilation_unit",2),1)), (LCPackage,Reduce(("compilation_unit",2),1)), (LCSeparate,Reduce(("compilation_unit",2),1)), (LCWith,Reduce(("compilation_unit",2),1)), (LCUse,Reduce(("compilation_unit",2),1)), (LCProcedure,Reduce(("compilation_unit",2),1)), (LCFunction,Reduce(("compilation_unit",2),1))]]@slrp'a375; val slrp'a373=[[(LCEos,Reduce(("compilation_unit",1),2)), (LCLChevron,Reduce(("compilation_unit",1),2)), (LCAnnotation,Reduce(("compilation_unit",1),2)), (LCPragma,Reduce(("compilation_unit",1),2)), (LCReferences,Reduce(("compilation_unit",1),2)), (LCPackage,Reduce(("compilation_unit",1),2)), (LCSeparate,Reduce(("compilation_unit",1),2)), (LCWith,Reduce(("compilation_unit",1),2)), (LCUse,Reduce(("compilation_unit",1),2)), (LCProcedure,Reduce(("compilation_unit",1),2)), (LCFunction,Reduce(("compilation_unit",1),2))]]@slrp'a374; val slrp'a372=[[(LCEos,Reduce(("compilation_unit",0),2)), (LCLChevron,Reduce(("compilation_unit",0),2)), (LCAnnotation,Reduce(("compilation_unit",0),2)), (LCPragma,Reduce(("compilation_unit",0),2)), (LCReferences,Reduce(("compilation_unit",0),2)), (LCPackage,Reduce(("compilation_unit",0),2)), (LCSeparate,Reduce(("compilation_unit",0),2)), (LCWith,Reduce(("compilation_unit",0),2)), (LCUse,Reduce(("compilation_unit",0),2)), (LCProcedure,Reduce(("compilation_unit",0),2)), (LCFunction,Reduce(("compilation_unit",0),2))]]@slrp'a373; val slrp'a371=[[(LCEos,Reduce(("compilation",2),2))]]@slrp'a372; val slrp'a370=[[(LCEos,Reduce(("compilation",0),1))]]@slrp'a371; val slrp'a369=[[(LCEos,Reduce(("renaming_declaration",5),4)), (LCLChevron,Reduce(("renaming_declaration",5),4)), (LCFunction,Reduce(("renaming_declaration",5),4)), (LCPackage,Reduce(("renaming_declaration",5),4)), (LCIdentifier,Reduce(("renaming_declaration",5),4)), (LCAnnotation,Reduce(("renaming_declaration",5),4)), (LCSubType,Reduce(("renaming_declaration",5),4)), (LCPragma,Reduce(("renaming_declaration",5),4)), (LCProcedure,Reduce(("renaming_declaration",5),4)), (LCType,Reduce(("renaming_declaration",5),4)), (LCFor,Reduce(("renaming_declaration",5),4)), (LCUse,Reduce(("renaming_declaration",5),4)), (LCEnd,Reduce(("renaming_declaration",5),4)), (LCPrivate,Reduce(("renaming_declaration",5),4)), (LCAuxiliary,Reduce(("renaming_declaration",5),4)), (LCBegin,Reduce(("renaming_declaration",5),4))]]@slrp'a370; val slrp'a368=[[(LCSemi,Shift 368)]]@slrp'a369; val slrp'a367=[[(LCEos,Reduce(("renaming_declaration",4),6)), (LCLChevron,Reduce(("renaming_declaration",4),6)), (LCFunction,Reduce(("renaming_declaration",4),6)), (LCPackage,Reduce(("renaming_declaration",4),6)), (LCIdentifier,Reduce(("renaming_declaration",4),6)), (LCAnnotation,Reduce(("renaming_declaration",4),6)), (LCSubType,Reduce(("renaming_declaration",4),6)), (LCPragma,Reduce(("renaming_declaration",4),6)), (LCProcedure,Reduce(("renaming_declaration",4),6)), (LCType,Reduce(("renaming_declaration",4),6)), (LCFor,Reduce(("renaming_declaration",4),6)), (LCUse,Reduce(("renaming_declaration",4),6)), (LCEnd,Reduce(("renaming_declaration",4),6)), (LCPrivate,Reduce(("renaming_declaration",4),6)), (LCAuxiliary,Reduce(("renaming_declaration",4),6)), (LCBegin,Reduce(("renaming_declaration",4),6))]]@slrp'a368; val slrp'a366=[[(LCSemi,Shift 366)]]@slrp'a367; val slrp'a365=[[(LCEos,Reduce(("renaming_declaration",3),4)), (LCLChevron,Reduce(("renaming_declaration",3),4)), (LCFunction,Reduce(("renaming_declaration",3),4)), (LCPackage,Reduce(("renaming_declaration",3),4)), (LCIdentifier,Reduce(("renaming_declaration",3),4)), (LCAnnotation,Reduce(("renaming_declaration",3),4)), (LCSubType,Reduce(("renaming_declaration",3),4)), (LCPragma,Reduce(("renaming_declaration",3),4)), (LCProcedure,Reduce(("renaming_declaration",3),4)), (LCType,Reduce(("renaming_declaration",3),4)), (LCFor,Reduce(("renaming_declaration",3),4)), (LCUse,Reduce(("renaming_declaration",3),4)), (LCEnd,Reduce(("renaming_declaration",3),4)), (LCPrivate,Reduce(("renaming_declaration",3),4)), (LCAuxiliary,Reduce(("renaming_declaration",3),4)), (LCBegin,Reduce(("renaming_declaration",3),4))]]@slrp'a366; val slrp'a364=[[(LCEos,Reduce(("renaming_declaration",2),10)), (LCLChevron,Reduce(("renaming_declaration",2),10)), (LCFunction,Reduce(("renaming_declaration",2),10)), (LCPackage,Reduce(("renaming_declaration",2),10)), (LCIdentifier,Reduce(("renaming_declaration",2),10)), (LCAnnotation,Reduce(("renaming_declaration",2),10)), (LCSubType,Reduce(("renaming_declaration",2),10)), (LCPragma,Reduce(("renaming_declaration",2),10)), (LCProcedure,Reduce(("renaming_declaration",2),10)), (LCType,Reduce(("renaming_declaration",2),10)), (LCFor,Reduce(("renaming_declaration",2),10)), (LCUse,Reduce(("renaming_declaration",2),10)), (LCEnd,Reduce(("renaming_declaration",2),10)), (LCPrivate,Reduce(("renaming_declaration",2),10)), (LCAuxiliary,Reduce(("renaming_declaration",2),10)), (LCBegin,Reduce(("renaming_declaration",2),10))]]@slrp'a365; val slrp'a363=[[(LCSemi,Shift 363)]]@slrp'a364; val slrp'a362=[[(LCReturn,Shift 579)]]@slrp'a363; val slrp'a361=[[(LCEos,Reduce(("renaming_declaration",1),6)), (LCLChevron,Reduce(("renaming_declaration",1),6)), (LCFunction,Reduce(("renaming_declaration",1),6)), (LCPackage,Reduce(("renaming_declaration",1),6)), (LCIdentifier,Reduce(("renaming_declaration",1),6)), (LCAnnotation,Reduce(("renaming_declaration",1),6)), (LCSubType,Reduce(("renaming_declaration",1),6)), (LCPragma,Reduce(("renaming_declaration",1),6)), (LCProcedure,Reduce(("renaming_declaration",1),6)), (LCType,Reduce(("renaming_declaration",1),6)), (LCFor,Reduce(("renaming_declaration",1),6)), (LCUse,Reduce(("renaming_declaration",1),6)), (LCEnd,Reduce(("renaming_declaration",1),6)), (LCPrivate,Reduce(("renaming_declaration",1),6)), (LCAuxiliary,Reduce(("renaming_declaration",1),6)), (LCBegin,Reduce(("renaming_declaration",1),6))]]@slrp'a362; val slrp'a360=[[(LCRenames,Shift 578)]]@slrp'a361; val slrp'a359=[[(LCIdentifier,Shift 562)]]@slrp'a360; val slrp'a358=[[(LCEos,Reduce(("renaming_declaration",0),6)), (LCLChevron,Reduce(("renaming_declaration",0),6)), (LCFunction,Reduce(("renaming_declaration",0),6)), (LCPackage,Reduce(("renaming_declaration",0),6)), (LCIdentifier,Reduce(("renaming_declaration",0),6)), (LCAnnotation,Reduce(("renaming_declaration",0),6)), (LCSubType,Reduce(("renaming_declaration",0),6)), (LCPragma,Reduce(("renaming_declaration",0),6)), (LCProcedure,Reduce(("renaming_declaration",0),6)), (LCType,Reduce(("renaming_declaration",0),6)), (LCFor,Reduce(("renaming_declaration",0),6)), (LCUse,Reduce(("renaming_declaration",0),6)), (LCEnd,Reduce(("renaming_declaration",0),6)), (LCPrivate,Reduce(("renaming_declaration",0),6)), (LCAuxiliary,Reduce(("renaming_declaration",0),6)), (LCBegin,Reduce(("renaming_declaration",0),6))]]@slrp'a359; val slrp'a357=[[(LCEos,Reduce(("use_type_clause",0),4)), (LCLChevron,Reduce(("use_type_clause",0),4)), (LCFunction,Reduce(("use_type_clause",0),4)), (LCPackage,Reduce(("use_type_clause",0),4)), (LCIdentifier,Reduce(("use_type_clause",0),4)), (LCAnnotation,Reduce(("use_type_clause",0),4)), (LCSubType,Reduce(("use_type_clause",0),4)), (LCPragma,Reduce(("use_type_clause",0),4)), (LCProcedure,Reduce(("use_type_clause",0),4)), (LCType,Reduce(("use_type_clause",0),4)),(LCFor,Reduce(("use_type_clause",0),4)) ,(LCUse,Reduce(("use_type_clause",0),4)), (LCSeparate,Reduce(("use_type_clause",0),4)), (LCReferences,Reduce(("use_type_clause",0),4)), (LCWith,Reduce(("use_type_clause",0),4)),(LCEnd,Reduce(("use_type_clause",0),4)) ,(LCPrivate,Reduce(("use_type_clause",0),4)), (LCAuxiliary,Reduce(("use_type_clause",0),4)), (LCBegin,Reduce(("use_type_clause",0),4))]]@slrp'a358; val slrp'a356=[[(LCSemi,Shift 356)]]@slrp'a357; val slrp'a355=[[(LCEos,Reduce(("use_package_clause",0),3)), (LCLChevron,Reduce(("use_package_clause",0),3)), (LCFunction,Reduce(("use_package_clause",0),3)), (LCPackage,Reduce(("use_package_clause",0),3)), (LCIdentifier,Reduce(("use_package_clause",0),3)), (LCAnnotation,Reduce(("use_package_clause",0),3)), (LCSubType,Reduce(("use_package_clause",0),3)), (LCPragma,Reduce(("use_package_clause",0),3)), (LCProcedure,Reduce(("use_package_clause",0),3)), (LCType,Reduce(("use_package_clause",0),3)), (LCFor,Reduce(("use_package_clause",0),3)), (LCUse,Reduce(("use_package_clause",0),3)), (LCSeparate,Reduce(("use_package_clause",0),3)), (LCReferences,Reduce(("use_package_clause",0),3)), (LCWith,Reduce(("use_package_clause",0),3)), (LCEnd,Reduce(("use_package_clause",0),3)), (LCPrivate,Reduce(("use_package_clause",0),3)), (LCAuxiliary,Reduce(("use_package_clause",0),3)), (LCBegin,Reduce(("use_package_clause",0),3))]]@slrp'a356; val slrp'a354=[[(LCSemi,Shift 354)]]@slrp'a355; val slrp'a353=[[(LCEos,Reduce(("use_clause",1),1)), (LCLChevron,Reduce(("use_clause",1),1)),(LCFunction,Reduce(("use_clause",1),1)), (LCPackage,Reduce(("use_clause",1),1)),(LCIdentifier,Reduce(("use_clause",1),1)) ,(LCAnnotation,Reduce(("use_clause",1),1)), (LCSubType,Reduce(("use_clause",1),1)),(LCPragma,Reduce(("use_clause",1),1)), (LCProcedure,Reduce(("use_clause",1),1)),(LCType,Reduce(("use_clause",1),1)), (LCFor,Reduce(("use_clause",1),1)),(LCUse,Reduce(("use_clause",1),1)), (LCSeparate,Reduce(("use_clause",1),1)), (LCReferences,Reduce(("use_clause",1),1)),(LCWith,Reduce(("use_clause",1),1)), (LCEnd,Reduce(("use_clause",1),1)),(LCPrivate,Reduce(("use_clause",1),1)), (LCAuxiliary,Reduce(("use_clause",1),1)),(LCBegin,Reduce(("use_clause",1),1))]]@slrp'a354; val slrp'a352=[[(LCEos,Reduce(("use_clause",0),1)), (LCLChevron,Reduce(("use_clause",0),1)),(LCFunction,Reduce(("use_clause",0),1)), (LCPackage,Reduce(("use_clause",0),1)),(LCIdentifier,Reduce(("use_clause",0),1)) ,(LCAnnotation,Reduce(("use_clause",0),1)), (LCSubType,Reduce(("use_clause",0),1)),(LCPragma,Reduce(("use_clause",0),1)), (LCProcedure,Reduce(("use_clause",0),1)),(LCType,Reduce(("use_clause",0),1)), (LCFor,Reduce(("use_clause",0),1)),(LCUse,Reduce(("use_clause",0),1)), (LCSeparate,Reduce(("use_clause",0),1)), (LCReferences,Reduce(("use_clause",0),1)),(LCWith,Reduce(("use_clause",0),1)), (LCEnd,Reduce(("use_clause",0),1)),(LCPrivate,Reduce(("use_clause",0),1)), (LCAuxiliary,Reduce(("use_clause",0),1)),(LCBegin,Reduce(("use_clause",0),1))]]@slrp'a353; val slrp'a351=[[(LCEos,Reduce(("deferred_constant_declaration",0),5)), (LCLChevron,Reduce(("deferred_constant_declaration",0),5)), (LCFunction,Reduce(("deferred_constant_declaration",0),5)), (LCPackage,Reduce(("deferred_constant_declaration",0),5)), (LCIdentifier,Reduce(("deferred_constant_declaration",0),5)), (LCAnnotation,Reduce(("deferred_constant_declaration",0),5)), (LCSubType,Reduce(("deferred_constant_declaration",0),5)), (LCPragma,Reduce(("deferred_constant_declaration",0),5)), (LCProcedure,Reduce(("deferred_constant_declaration",0),5)), (LCType,Reduce(("deferred_constant_declaration",0),5)), (LCFor,Reduce(("deferred_constant_declaration",0),5)), (LCUse,Reduce(("deferred_constant_declaration",0),5)), (LCImplement,Reduce(("deferred_constant_declaration",0),5)), (LCEnd,Reduce(("deferred_constant_declaration",0),5)), (LCPrivate,Reduce(("deferred_constant_declaration",0),5)), (LCAuxiliary,Reduce(("deferred_constant_declaration",0),5)), (LCBegin,Reduce(("deferred_constant_declaration",0),5))]]@slrp'a352; val slrp'a350=[[(LCEos,Reduce(("private_type_declaration",3),7)), (LCLChevron,Reduce(("private_type_declaration",3),7)), (LCFunction,Reduce(("private_type_declaration",3),7)), (LCPackage,Reduce(("private_type_declaration",3),7)), (LCIdentifier,Reduce(("private_type_declaration",3),7)), (LCAnnotation,Reduce(("private_type_declaration",3),7)), (LCSubType,Reduce(("private_type_declaration",3),7)), (LCPragma,Reduce(("private_type_declaration",3),7)), (LCProcedure,Reduce(("private_type_declaration",3),7)), (LCType,Reduce(("private_type_declaration",3),7)), (LCFor,Reduce(("private_type_declaration",3),7)), (LCUse,Reduce(("private_type_declaration",3),7)), (LCImplement,Reduce(("private_type_declaration",3),7)), (LCEnd,Reduce(("private_type_declaration",3),7)), (LCPrivate,Reduce(("private_type_declaration",3),7)), (LCAuxiliary,Reduce(("private_type_declaration",3),7)), (LCBegin,Reduce(("private_type_declaration",3),7))]]@slrp'a351; val slrp'a349=[[(LCSemi,Shift 349)]]@slrp'a350; val slrp'a348=[[(LCPrivate,Shift 348)]]@slrp'a349; val slrp'a347=[[(LCEos,Reduce(("private_type_declaration",2),6)), (LCLChevron,Reduce(("private_type_declaration",2),6)), (LCFunction,Reduce(("private_type_declaration",2),6)), (LCPackage,Reduce(("private_type_declaration",2),6)), (LCIdentifier,Reduce(("private_type_declaration",2),6)), (LCAnnotation,Reduce(("private_type_declaration",2),6)), (LCSubType,Reduce(("private_type_declaration",2),6)), (LCPragma,Reduce(("private_type_declaration",2),6)), (LCProcedure,Reduce(("private_type_declaration",2),6)), (LCType,Reduce(("private_type_declaration",2),6)), (LCFor,Reduce(("private_type_declaration",2),6)), (LCUse,Reduce(("private_type_declaration",2),6)), (LCImplement,Reduce(("private_type_declaration",2),6)), (LCEnd,Reduce(("private_type_declaration",2),6)), (LCPrivate,Reduce(("private_type_declaration",2),6)), (LCAuxiliary,Reduce(("private_type_declaration",2),6)), (LCBegin,Reduce(("private_type_declaration",2),6))]]@slrp'a348; val slrp'a346=[[(LCSemi,Shift 346)]]@slrp'a347; val slrp'a345=[[(LCPrivate,Shift 345)]]@slrp'a346; val slrp'a344=[[(LCEos,Reduce(("private_type_declaration",1),6)), (LCLChevron,Reduce(("private_type_declaration",1),6)), (LCFunction,Reduce(("private_type_declaration",1),6)), (LCPackage,Reduce(("private_type_declaration",1),6)), (LCIdentifier,Reduce(("private_type_declaration",1),6)), (LCAnnotation,Reduce(("private_type_declaration",1),6)), (LCSubType,Reduce(("private_type_declaration",1),6)), (LCPragma,Reduce(("private_type_declaration",1),6)), (LCProcedure,Reduce(("private_type_declaration",1),6)), (LCType,Reduce(("private_type_declaration",1),6)), (LCFor,Reduce(("private_type_declaration",1),6)), (LCUse,Reduce(("private_type_declaration",1),6)), (LCImplement,Reduce(("private_type_declaration",1),6)), (LCEnd,Reduce(("private_type_declaration",1),6)), (LCPrivate,Reduce(("private_type_declaration",1),6)), (LCAuxiliary,Reduce(("private_type_declaration",1),6)), (LCBegin,Reduce(("private_type_declaration",1),6))]]@slrp'a345; val slrp'a343=[[(LCSemi,Shift 343)]]@slrp'a344; val slrp'a342=[[(LCEos,Reduce(("private_type_declaration",0),5)), (LCLChevron,Reduce(("private_type_declaration",0),5)), (LCFunction,Reduce(("private_type_declaration",0),5)), (LCPackage,Reduce(("private_type_declaration",0),5)), (LCIdentifier,Reduce(("private_type_declaration",0),5)), (LCAnnotation,Reduce(("private_type_declaration",0),5)), (LCSubType,Reduce(("private_type_declaration",0),5)), (LCPragma,Reduce(("private_type_declaration",0),5)), (LCProcedure,Reduce(("private_type_declaration",0),5)), (LCType,Reduce(("private_type_declaration",0),5)), (LCFor,Reduce(("private_type_declaration",0),5)), (LCUse,Reduce(("private_type_declaration",0),5)), (LCImplement,Reduce(("private_type_declaration",0),5)), (LCEnd,Reduce(("private_type_declaration",0),5)), (LCPrivate,Reduce(("private_type_declaration",0),5)), (LCAuxiliary,Reduce(("private_type_declaration",0),5)), (LCBegin,Reduce(("private_type_declaration",0),5))]]@slrp'a343; val slrp'a341=[[(LCSemi,Shift 341)]]@slrp'a342; val slrp'a340=[[(LCEnd,Reduce(("package_initialization",0),1))]]@slrp'a341; val slrp'a339=[[(LCImplement,Reduce(("basic_dec_list",1),2))]]@slrp'a340; val slrp'a338=[[(LCLChevron,Reduce(("using_dec",0),7)), (LCFunction,Reduce(("using_dec",0),7)),(LCPackage,Reduce(("using_dec",0),7)), (LCIdentifier,Reduce(("using_dec",0),7)), (LCAnnotation,Reduce(("using_dec",0),7)),(LCSubType,Reduce(("using_dec",0),7)), (LCPragma,Reduce(("using_dec",0),7)),(LCProcedure,Reduce(("using_dec",0),7)), (LCType,Reduce(("using_dec",0),7)),(LCFor,Reduce(("using_dec",0),7)), (LCUse,Reduce(("using_dec",0),7)),(LCBegin,Reduce(("using_dec",0),7)), (LCUsing,Reduce(("using_dec",0),7))]]@slrp'a339; val slrp'a337=[[(LCSemi,Shift 337)]]@slrp'a338; val slrp'a336=[[(LCZ,Shift 336)]]@slrp'a337; val slrp'a335=[[(LCBy,Shift 335)]]@slrp'a336; val slrp'a334=[[(LCZ,Shift 334)]]@slrp'a335; val slrp'a333=[[(LCImplement,Shift 333)]]@slrp'a334; val slrp'a332=[[(LCLChevron,Reduce(("using_list",1),2)), (LCFunction,Reduce(("using_list",1),2)),(LCPackage,Reduce(("using_list",1),2)), (LCIdentifier,Reduce(("using_list",1),2)), (LCAnnotation,Reduce(("using_list",1),2)),(LCSubType,Reduce(("using_list",1),2)) ,(LCPragma,Reduce(("using_list",1),2)),(LCProcedure,Reduce(("using_list",1),2)), (LCType,Reduce(("using_list",1),2)),(LCFor,Reduce(("using_list",1),2)), (LCUse,Reduce(("using_list",1),2)),(LCBegin,Reduce(("using_list",1),2))]]@slrp'a333; val slrp'a331=[[(LCEnd,Reduce(("package_implementation",2),4))]]@slrp'a332; val slrp'a330=[[(LCBegin,Shift 686)]]@slrp'a331; val slrp'a329=[[(LCEnd,Reduce(("package_implementation",1),3))]]@slrp'a330; val slrp'a328=[[(LCEos,Reduce(("package_body",0),9)), (LCLChevron,Reduce(("package_body",0),9)), (LCAnnotation,Reduce(("package_body",0),9)), (LCPragma,Reduce(("package_body",0),9)), (LCReferences,Reduce(("package_body",0),9)), (LCPackage,Reduce(("package_body",0),9)), (LCSeparate,Reduce(("package_body",0),9)),(LCWith,Reduce(("package_body",0),9)), (LCUse,Reduce(("package_body",0),9)),(LCProcedure,Reduce(("package_body",0),9)), (LCFunction,Reduce(("package_body",0),9))]]@slrp'a329; val slrp'a327=[[(LCSemi,Shift 327)]]@slrp'a328; val slrp'a326=[[(LCIdentifier,Shift 326)]]@slrp'a327; val slrp'a325=[[(LCEnd,Shift 325)]]@slrp'a326; val slrp'a324=[[(LCIs,Shift 710)]]@slrp'a325; val slrp'a323=[[(LCIdentifier,Shift 561)]]@slrp'a324; val slrp'a322=[[(LCBBody,Shift 322)]]@slrp'a323; val slrp'a321=[[(LCEos,Reduce(("pdec",2),1)),(LCEnd,Reduce(("pdec",2),1)), (LCLChevron,Reduce(("pdec",2),1)),(LCAnnotation,Reduce(("pdec",2),1)), (LCSubType,Reduce(("pdec",2),1)),(LCPragma,Reduce(("pdec",2),1)), (LCFunction,Reduce(("pdec",2),1)),(LCPackage,Reduce(("pdec",2),1)), (LCType,Reduce(("pdec",2),1)),(LCIdentifier,Reduce(("pdec",2),1)), (LCFor,Reduce(("pdec",2),1)),(LCUse,Reduce(("pdec",2),1)), (LCProcedure,Reduce(("pdec",2),1))]]@slrp'a322; val slrp'a320=[[(LCEos,Reduce(("pdec",1),1)),(LCEnd,Reduce(("pdec",1),1)), (LCLChevron,Reduce(("pdec",1),1)),(LCAnnotation,Reduce(("pdec",1),1)), (LCSubType,Reduce(("pdec",1),1)),(LCPragma,Reduce(("pdec",1),1)), (LCFunction,Reduce(("pdec",1),1)),(LCPackage,Reduce(("pdec",1),1)), (LCType,Reduce(("pdec",1),1)),(LCIdentifier,Reduce(("pdec",1),1)), (LCFor,Reduce(("pdec",1),1)),(LCUse,Reduce(("pdec",1),1)), (LCProcedure,Reduce(("pdec",1),1))]]@slrp'a321; val slrp'a319=[[(LCEos,Reduce(("pdec",0),1)),(LCEnd,Reduce(("pdec",0),1)), (LCLChevron,Reduce(("pdec",0),1)),(LCAnnotation,Reduce(("pdec",0),1)), (LCSubType,Reduce(("pdec",0),1)),(LCPragma,Reduce(("pdec",0),1)), (LCFunction,Reduce(("pdec",0),1)),(LCPackage,Reduce(("pdec",0),1)), (LCType,Reduce(("pdec",0),1)),(LCIdentifier,Reduce(("pdec",0),1)), (LCFor,Reduce(("pdec",0),1)),(LCUse,Reduce(("pdec",0),1)), (LCProcedure,Reduce(("pdec",0),1))]]@slrp'a320; val slrp'a318=[[(LCEos,Reduce(("private_part",1),2)), (LCEnd,Reduce(("private_part",1),2))]]@slrp'a319; val slrp'a317=[[(LCEos,Reduce(("visdec",4),1)),(LCEnd,Reduce(("visdec",4),1)), (LCPrivate,Reduce(("visdec",4),1)),(LCAuxiliary,Reduce(("visdec",4),1)), (LCLChevron,Reduce(("visdec",4),1)),(LCAnnotation,Reduce(("visdec",4),1)), (LCSubType,Reduce(("visdec",4),1)),(LCPragma,Reduce(("visdec",4),1)), (LCFunction,Reduce(("visdec",4),1)),(LCPackage,Reduce(("visdec",4),1)), (LCType,Reduce(("visdec",4),1)),(LCIdentifier,Reduce(("visdec",4),1)), (LCFor,Reduce(("visdec",4),1)),(LCUse,Reduce(("visdec",4),1)), (LCProcedure,Reduce(("visdec",4),1))]]@slrp'a318; val slrp'a316=[[(LCEos,Reduce(("visdec",3),3)),(LCEnd,Reduce(("visdec",3),3)), (LCPrivate,Reduce(("visdec",3),3)),(LCAuxiliary,Reduce(("visdec",3),3)), (LCLChevron,Reduce(("visdec",3),3)),(LCAnnotation,Reduce(("visdec",3),3)), (LCSubType,Reduce(("visdec",3),3)),(LCPragma,Reduce(("visdec",3),3)), (LCFunction,Reduce(("visdec",3),3)),(LCPackage,Reduce(("visdec",3),3)), (LCType,Reduce(("visdec",3),3)),(LCIdentifier,Reduce(("visdec",3),3)), (LCFor,Reduce(("visdec",3),3)),(LCUse,Reduce(("visdec",3),3)), (LCProcedure,Reduce(("visdec",3),3))]]@slrp'a317; val slrp'a315=[[(LCSemi,Shift 315)]]@slrp'a316; val slrp'a314=[[(LCZ,Shift 314)]]@slrp'a315; val slrp'a313=[[(LCEos,Reduce(("visdec",2),1)),(LCEnd,Reduce(("visdec",2),1)), (LCPrivate,Reduce(("visdec",2),1)),(LCAuxiliary,Reduce(("visdec",2),1)), (LCLChevron,Reduce(("visdec",2),1)),(LCAnnotation,Reduce(("visdec",2),1)), (LCSubType,Reduce(("visdec",2),1)),(LCPragma,Reduce(("visdec",2),1)), (LCFunction,Reduce(("visdec",2),1)),(LCPackage,Reduce(("visdec",2),1)), (LCType,Reduce(("visdec",2),1)),(LCIdentifier,Reduce(("visdec",2),1)), (LCFor,Reduce(("visdec",2),1)),(LCUse,Reduce(("visdec",2),1)), (LCProcedure,Reduce(("visdec",2),1))]]@slrp'a314; val slrp'a312=[[(LCEos,Reduce(("visdec",1),1)),(LCEnd,Reduce(("visdec",1),1)), (LCPrivate,Reduce(("visdec",1),1)),(LCAuxiliary,Reduce(("visdec",1),1)), (LCLChevron,Reduce(("visdec",1),1)),(LCAnnotation,Reduce(("visdec",1),1)), (LCSubType,Reduce(("visdec",1),1)),(LCPragma,Reduce(("visdec",1),1)), (LCFunction,Reduce(("visdec",1),1)),(LCPackage,Reduce(("visdec",1),1)), (LCType,Reduce(("visdec",1),1)),(LCIdentifier,Reduce(("visdec",1),1)), (LCFor,Reduce(("visdec",1),1)),(LCUse,Reduce(("visdec",1),1)), (LCProcedure,Reduce(("visdec",1),1))]]@slrp'a313; val slrp'a311=[[(LCEos,Reduce(("visdec",0),1)),(LCEnd,Reduce(("visdec",0),1)), (LCPrivate,Reduce(("visdec",0),1)),(LCAuxiliary,Reduce(("visdec",0),1)), (LCLChevron,Reduce(("visdec",0),1)),(LCAnnotation,Reduce(("visdec",0),1)), (LCSubType,Reduce(("visdec",0),1)),(LCPragma,Reduce(("visdec",0),1)), (LCFunction,Reduce(("visdec",0),1)),(LCPackage,Reduce(("visdec",0),1)), (LCType,Reduce(("visdec",0),1)),(LCIdentifier,Reduce(("visdec",0),1)), (LCFor,Reduce(("visdec",0),1)),(LCUse,Reduce(("visdec",0),1)), (LCProcedure,Reduce(("visdec",0),1))]]@slrp'a312; val slrp'a310=[[(LCEos,Reduce(("visible_part",1),2)), (LCEnd,Reduce(("visible_part",1),2)),(LCPrivate,Reduce(("visible_part",1),2))]]@slrp'a311; val slrp'a309=[[(LCSemi,Reduce(("package_specification",1),9))]]@slrp'a310; val slrp'a308=[[(LCIdentifier,Shift 308)]]@slrp'a309; val slrp'a307=[[(LCEnd,Shift 307)]]@slrp'a308; val slrp'a306=[[(LCSemi,Reduce(("package_specification",0),7))]]@slrp'a307; val slrp'a305=[[(LCIdentifier,Shift 305)]]@slrp'a306; val slrp'a304=[[(LCEos,Reduce(("package_declaration",0),2)), (LCLChevron,Reduce(("package_declaration",0),2)), (LCFunction,Reduce(("package_declaration",0),2)), (LCPackage,Reduce(("package_declaration",0),2)), (LCIdentifier,Reduce(("package_declaration",0),2)), (LCAnnotation,Reduce(("package_declaration",0),2)), (LCSubType,Reduce(("package_declaration",0),2)), (LCPragma,Reduce(("package_declaration",0),2)), (LCProcedure,Reduce(("package_declaration",0),2)), (LCType,Reduce(("package_declaration",0),2)), (LCFor,Reduce(("package_declaration",0),2)), (LCUse,Reduce(("package_declaration",0),2)), (LCReferences,Reduce(("package_declaration",0),2)), (LCSeparate,Reduce(("package_declaration",0),2)), (LCWith,Reduce(("package_declaration",0),2)), (LCBegin,Reduce(("package_declaration",0),2)), (LCEnd,Reduce(("package_declaration",0),2))]]@slrp'a305; val slrp'a303=[[(LCSemi,Shift 303)]]@slrp'a304; val slrp'a302=[[(LCCrd,Reduce(("actual_parameter",0),1)), (LCComma,Reduce(("actual_parameter",0),1))]]@slrp'a303; val slrp'a301=[[(LCCrd,Reduce(("positional_parameter_association",1),3))]]@slrp'a302; val slrp'a300=[[(LCCrd,Reduce(("parameter_association",1),1))]]@slrp'a301; val slrp'a299=[[(LCCrd,Reduce(("parameter_association",0),1))]]@slrp'a300; val slrp'a298=[[(LCOrd,Reduce(("actual_parameter_part",0),3)), (LCDot,Reduce(("actual_parameter_part",0),3)), (LCPrimedIdentifier,Reduce(("actual_parameter_part",0),3)), (LCBecomes,Reduce(("actual_parameter_part",0),3)), (LCSemi,Reduce(("actual_parameter_part",0),3)), (LCRRange,Reduce(("actual_parameter_part",0),3)), (LCDigits,Reduce(("actual_parameter_part",0),3)), (LCDelta,Reduce(("actual_parameter_part",0),3)), (LCComma,Reduce(("actual_parameter_part",0),3)), (LCCrd,Reduce(("actual_parameter_part",0),3)), (LCAnd,Reduce(("actual_parameter_part",0),3)), (LCOr,Reduce(("actual_parameter_part",0),3)), (LCXor,Reduce(("actual_parameter_part",0),3)), (LCGreaterEquals,Reduce(("actual_parameter_part",0),3)), (LCGreaterThan,Reduce(("actual_parameter_part",0),3)), (LCLessEquals,Reduce(("actual_parameter_part",0),3)), (LCLessThan,Reduce(("actual_parameter_part",0),3)), (LCNotEquals,Reduce(("actual_parameter_part",0),3)), (LCEquals,Reduce(("actual_parameter_part",0),3)), (LCIn,Reduce(("actual_parameter_part",0),3)), (LCNot,Reduce(("actual_parameter_part",0),3)), (LCDotDot,Reduce(("actual_parameter_part",0),3)), (LCAmpersand,Reduce(("actual_parameter_part",0),3)), (LCMinus,Reduce(("actual_parameter_part",0),3)), (LCPlus,Reduce(("actual_parameter_part",0),3)), (LCRem,Reduce(("actual_parameter_part",0),3)), (LCMod,Reduce(("actual_parameter_part",0),3)), (LCDiv,Reduce(("actual_parameter_part",0),3)), (LCStar,Reduce(("actual_parameter_part",0),3)), (LCStarStar,Reduce(("actual_parameter_part",0),3)), (LCPrime,Reduce(("actual_parameter_part",0),3)), (LCGrkXi,Reduce(("actual_parameter_part",0),3)), (LCRenames,Reduce(("actual_parameter_part",0),3)), (LCAt,Reduce(("actual_parameter_part",0),3)), (LCThen,Reduce(("actual_parameter_part",0),3)), (LCIs,Reduce(("actual_parameter_part",0),3)), (LCGoesTo,Reduce(("actual_parameter_part",0),3)), (LCBar,Reduce(("actual_parameter_part",0),3)), (LCTill,Reduce(("actual_parameter_part",0),3)), (LCLoop,Reduce(("actual_parameter_part",0),3)), (LCAnnotation,Reduce(("actual_parameter_part",0),3)), (LCLChevron,Reduce(("actual_parameter_part",0),3))]]@slrp'a299; val slrp'a297=[[(LCCrd,Shift 297)]]@slrp'a298; val slrp'a296=[[(LCEos,Reduce(("procedure_call_statement",0),2)), (LCAnnotation,Reduce(("procedure_call_statement",0),2)), (LCCon,Reduce(("procedure_call_statement",0),2)), (LCLChevron,Reduce(("procedure_call_statement",0),2)), (LCGrkGamma,Reduce(("procedure_call_statement",0),2)), (LCGrkDelta,Reduce(("procedure_call_statement",0),2)), (LCPragma,Reduce(("procedure_call_statement",0),2)), (LCNull,Reduce(("procedure_call_statement",0),2)), (LCExit,Reduce(("procedure_call_statement",0),2)), (LCReturn,Reduce(("procedure_call_statement",0),2)), (LCIf,Reduce(("procedure_call_statement",0),2)), (LCCase,Reduce(("procedure_call_statement",0),2)), (LCIdentifier,Reduce(("procedure_call_statement",0),2)), (LCCharacterLiteral,Reduce(("procedure_call_statement",0),2)), (LCTill,Reduce(("procedure_call_statement",0),2)), (LCLoop,Reduce(("procedure_call_statement",0),2)), (LCFor,Reduce(("procedure_call_statement",0),2)), (LCWhile,Reduce(("procedure_call_statement",0),2)), (LCElsIf,Reduce(("procedure_call_statement",0),2)), (LCElse,Reduce(("procedure_call_statement",0),2)), (LCEnd,Reduce(("procedure_call_statement",0),2)), (LCWhen,Reduce(("procedure_call_statement",0),2))]]@slrp'a297; val slrp'a295=[[(LCEos,Reduce(("subprogram_implementation",0),6)), (LCLChevron,Reduce(("subprogram_implementation",0),6)), (LCFunction,Reduce(("subprogram_implementation",0),6)), (LCPackage,Reduce(("subprogram_implementation",0),6)), (LCIdentifier,Reduce(("subprogram_implementation",0),6)), (LCAnnotation,Reduce(("subprogram_implementation",0),6)), (LCSubType,Reduce(("subprogram_implementation",0),6)), (LCPragma,Reduce(("subprogram_implementation",0),6)), (LCProcedure,Reduce(("subprogram_implementation",0),6)), (LCType,Reduce(("subprogram_implementation",0),6)), (LCFor,Reduce(("subprogram_implementation",0),6)), (LCUse,Reduce(("subprogram_implementation",0),6)), (LCReferences,Reduce(("subprogram_implementation",0),6)), (LCSeparate,Reduce(("subprogram_implementation",0),6)), (LCWith,Reduce(("subprogram_implementation",0),6)), (LCBegin,Reduce(("subprogram_implementation",0),6)), (LCEnd,Reduce(("subprogram_implementation",0),6))]]@slrp'a296; val slrp'a294=[[(LCSemi,Shift 294)]]@slrp'a295; val slrp'a293=[[(LCIdentifier,Shift 293)]]@slrp'a294; val slrp'a292=[[(LCEnd,Shift 292)]]@slrp'a293; val slrp'a291=[[(LCBegin,Shift 683)]]@slrp'a292; val slrp'a290=[[(LCEos,Reduce(("subprogram_body",1),3)), (LCLChevron,Reduce(("subprogram_body",1),3)), (LCFunction,Reduce(("subprogram_body",1),3)), (LCPackage,Reduce(("subprogram_body",1),3)), (LCIdentifier,Reduce(("subprogram_body",1),3)), (LCAnnotation,Reduce(("subprogram_body",1),3)), (LCSubType,Reduce(("subprogram_body",1),3)), (LCPragma,Reduce(("subprogram_body",1),3)), (LCProcedure,Reduce(("subprogram_body",1),3)), (LCType,Reduce(("subprogram_body",1),3)),(LCFor,Reduce(("subprogram_body",1),3)) ,(LCUse,Reduce(("subprogram_body",1),3)), (LCReferences,Reduce(("subprogram_body",1),3)), (LCSeparate,Reduce(("subprogram_body",1),3)), (LCWith,Reduce(("subprogram_body",1),3)), (LCBegin,Reduce(("subprogram_body",1),3)), (LCEnd,Reduce(("subprogram_body",1),3))]]@slrp'a291; val slrp'a289=[[(LCIs,Shift 707)]]@slrp'a290; val slrp'a288=[[(LCEos,Reduce(("subprogram_body",0),3)), (LCLChevron,Reduce(("subprogram_body",0),3)), (LCFunction,Reduce(("subprogram_body",0),3)), (LCPackage,Reduce(("subprogram_body",0),3)), (LCIdentifier,Reduce(("subprogram_body",0),3)), (LCAnnotation,Reduce(("subprogram_body",0),3)), (LCSubType,Reduce(("subprogram_body",0),3)), (LCPragma,Reduce(("subprogram_body",0),3)), (LCProcedure,Reduce(("subprogram_body",0),3)), (LCType,Reduce(("subprogram_body",0),3)),(LCFor,Reduce(("subprogram_body",0),3)) ,(LCUse,Reduce(("subprogram_body",0),3)), (LCReferences,Reduce(("subprogram_body",0),3)), (LCSeparate,Reduce(("subprogram_body",0),3)), (LCWith,Reduce(("subprogram_body",0),3)), (LCBegin,Reduce(("subprogram_body",0),3)), (LCEnd,Reduce(("subprogram_body",0),3))]]@slrp'a289; val slrp'a287=[[(LCIs,Shift 706)]]@slrp'a288; val slrp'a286=[[(LCIdentifier,Reduce(("mode",3),2)), (LCCharacterLiteral,Reduce(("mode",3),2))]]@slrp'a287; val slrp'a285=[[(LCIdentifier,Reduce(("mode",2),1)), (LCCharacterLiteral,Reduce(("mode",2),1))]]@slrp'a286; val slrp'a284=[[(LCCrd,Reduce(("parameter_specification",1),6)), (LCSemi,Reduce(("parameter_specification",1),6))]]@slrp'a285; val slrp'a283=[[(LCCrd,Reduce(("parlist",1),3))]]@slrp'a284; val slrp'a282=[[(LCIs,Reduce(("formal_part",0),3)), (LCGrkDelta,Reduce(("formal_part",0),3)), (LCGrkGamma,Reduce(("formal_part",0),3)),(LCReturn,Reduce(("formal_part",0),3)), (LCSemi,Reduce(("formal_part",0),3)),(LCAnnotation,Reduce(("formal_part",0),3)), (LCLChevron,Reduce(("formal_part",0),3)),(LCRenames,Reduce(("formal_part",0),3)) ]]@slrp'a283; val slrp'a281=[[(LCCrd,Shift 281)]]@slrp'a282; val slrp'a280=[[(LCOrd,Reduce(("operator_symbol",0),1)), (LCSemi,Reduce(("operator_symbol",0),1))]]@slrp'a281; val slrp'a279=[[(LCEos,Reduce(("annotation_list",2),2)), (LCSemi,Reduce(("annotation_list",2),2)),(LCIs,Reduce(("annotation_list",2),2)), (LCRenames,Reduce(("annotation_list",2),2)), (LCPackage,Reduce(("annotation_list",2),2)), (LCProcedure,Reduce(("annotation_list",2),2)), (LCFunction,Reduce(("annotation_list",2),2)), (LCSeparate,Reduce(("annotation_list",2),2))]]@slrp'a280; val slrp'a278=[[(LCEos,Reduce(("annotation_list",1),2)), (LCSemi,Reduce(("annotation_list",1),2)),(LCIs,Reduce(("annotation_list",1),2)), (LCRenames,Reduce(("annotation_list",1),2)), (LCPackage,Reduce(("annotation_list",1),2)), (LCProcedure,Reduce(("annotation_list",1),2)), (LCFunction,Reduce(("annotation_list",1),2)), (LCSeparate,Reduce(("annotation_list",1),2))]]@slrp'a279; val slrp'a277=[[(LCSemi,Reduce(("function_specification",0),2)), (LCIs,Reduce(("function_specification",0),2)), (LCRenames,Reduce(("function_specification",0),2))]]@slrp'a278; val slrp'a276=[[(LCSemi,Reduce(("function_specification_1",3),6)), (LCAnnotation,Reduce(("function_specification_1",3),6)), (LCLChevron,Reduce(("function_specification_1",3),6)), (LCIs,Reduce(("function_specification_1",3),6)), (LCRenames,Reduce(("function_specification_1",3),6))]]@slrp'a277; val slrp'a275=[[(LCSemi,Reduce(("function_specification_1",1),5)), (LCAnnotation,Reduce(("function_specification_1",1),5)), (LCLChevron,Reduce(("function_specification_1",1),5)), (LCIs,Reduce(("function_specification_1",1),5)), (LCRenames,Reduce(("function_specification_1",1),5))]]@slrp'a276; val slrp'a274=[[(LCSemi,Reduce(("function_specification_statement",3),4)), (LCAnnotation,Reduce(("function_specification_statement",3),4)), (LCLChevron,Reduce(("function_specification_statement",3),4)), (LCIs,Reduce(("function_specification_statement",3),4)), (LCRenames,Reduce(("function_specification_statement",3),4))]]@slrp'a275; val slrp'a273=[[(LCRBrace,Shift 273)]]@slrp'a274; val slrp'a272=[[(LCZ,Shift 272)]]@slrp'a273; val slrp'a271=[[(LCSemi,Reduce(("function_specification_statement",2),4)), (LCAnnotation,Reduce(("function_specification_statement",2),4)), (LCLChevron,Reduce(("function_specification_statement",2),4)), (LCIs,Reduce(("function_specification_statement",2),4)), (LCRenames,Reduce(("function_specification_statement",2),4))]]@slrp'a272; val slrp'a270=[[(LCRSqBrack,Shift 270)]]@slrp'a271; val slrp'a269=[[(LCZ,Shift 269)]]@slrp'a270; val slrp'a268=[[(LCSemi,Reduce(("function_specification_statement",1),5)), (LCAnnotation,Reduce(("function_specification_statement",1),5)), (LCLChevron,Reduce(("function_specification_statement",1),5)), (LCIs,Reduce(("function_specification_statement",1),5)), (LCRenames,Reduce(("function_specification_statement",1),5))]]@slrp'a269; val slrp'a267=[[(LCRBrace,Shift 267)]]@slrp'a268; val slrp'a266=[[(LCZ,Shift 266)]]@slrp'a267; val slrp'a265=[[(LCSemi,Reduce(("function_specification_statement",0),5)), (LCAnnotation,Reduce(("function_specification_statement",0),5)), (LCLChevron,Reduce(("function_specification_statement",0),5)), (LCIs,Reduce(("function_specification_statement",0),5)), (LCRenames,Reduce(("function_specification_statement",0),5))]]@slrp'a266; val slrp'a264=[[(LCRSqBrack,Shift 264)]]@slrp'a265; val slrp'a263=[[(LCZ,Shift 263)]]@slrp'a264; val slrp'a262=[[(LCSemi,Reduce(("procedure_specification_statement",2),1)), (LCAnnotation,Reduce(("procedure_specification_statement",2),1)), (LCLChevron,Reduce(("procedure_specification_statement",2),1)), (LCIs,Reduce(("procedure_specification_statement",2),1)), (LCRenames,Reduce(("procedure_specification_statement",2),1))]]@slrp'a263; val slrp'a261=[[(LCSemi,Reduce(("procedure_specification_statement",1),2)), (LCAnnotation,Reduce(("procedure_specification_statement",1),2)), (LCLChevron,Reduce(("procedure_specification_statement",1),2)), (LCIs,Reduce(("procedure_specification_statement",1),2)), (LCRenames,Reduce(("procedure_specification_statement",1),2))]]@slrp'a262; val slrp'a260=[[(LCSemi,Reduce(("procedure_specification_statement",0),3)), (LCAnnotation,Reduce(("procedure_specification_statement",0),3)), (LCLChevron,Reduce(("procedure_specification_statement",0),3)), (LCIs,Reduce(("procedure_specification_statement",0),3)), (LCRenames,Reduce(("procedure_specification_statement",0),3))]]@slrp'a261; val slrp'a259=[[(LCSemi,Reduce(("procedure_specification",0),2)), (LCIs,Reduce(("procedure_specification",0),2)), (LCRenames,Reduce(("procedure_specification",0),2))]]@slrp'a260; val slrp'a258=[[(LCSemi,Reduce(("procedure_specification_1",3),4)), (LCAnnotation,Reduce(("procedure_specification_1",3),4)), (LCLChevron,Reduce(("procedure_specification_1",3),4)), (LCIs,Reduce(("procedure_specification_1",3),4)), (LCRenames,Reduce(("procedure_specification_1",3),4))]]@slrp'a259; val slrp'a257=[[(LCSemi,Reduce(("procedure_specification_1",1),3)), (LCAnnotation,Reduce(("procedure_specification_1",1),3)), (LCLChevron,Reduce(("procedure_specification_1",1),3)), (LCIs,Reduce(("procedure_specification_1",1),3)), (LCRenames,Reduce(("procedure_specification_1",1),3))]]@slrp'a258; val slrp'a256=[[(LCRenames,Reduce(("subprogram_specification",1),1))]]@slrp'a257; val slrp'a255=[[(LCRenames,Reduce(("subprogram_specification",0),1))]]@slrp'a256; val slrp'a254=[[(LCEos,Reduce(("subprogram_declaration",1),2)), (LCEnd,Reduce(("subprogram_declaration",1),2)), (LCPrivate,Reduce(("subprogram_declaration",1),2)), (LCAuxiliary,Reduce(("subprogram_declaration",1),2)), (LCLChevron,Reduce(("subprogram_declaration",1),2)), (LCAnnotation,Reduce(("subprogram_declaration",1),2)), (LCSubType,Reduce(("subprogram_declaration",1),2)), (LCPragma,Reduce(("subprogram_declaration",1),2)), (LCFunction,Reduce(("subprogram_declaration",1),2)), (LCPackage,Reduce(("subprogram_declaration",1),2)), (LCType,Reduce(("subprogram_declaration",1),2)), (LCIdentifier,Reduce(("subprogram_declaration",1),2)), (LCFor,Reduce(("subprogram_declaration",1),2)), (LCUse,Reduce(("subprogram_declaration",1),2)), (LCProcedure,Reduce(("subprogram_declaration",1),2))]]@slrp'a255; val slrp'a253=[[(LCEos,Reduce(("subprogram_declaration",0),2)), (LCEnd,Reduce(("subprogram_declaration",0),2)), (LCPrivate,Reduce(("subprogram_declaration",0),2)), (LCAuxiliary,Reduce(("subprogram_declaration",0),2)), (LCLChevron,Reduce(("subprogram_declaration",0),2)), (LCAnnotation,Reduce(("subprogram_declaration",0),2)), (LCSubType,Reduce(("subprogram_declaration",0),2)), (LCPragma,Reduce(("subprogram_declaration",0),2)), (LCFunction,Reduce(("subprogram_declaration",0),2)), (LCPackage,Reduce(("subprogram_declaration",0),2)), (LCType,Reduce(("subprogram_declaration",0),2)), (LCIdentifier,Reduce(("subprogram_declaration",0),2)), (LCFor,Reduce(("subprogram_declaration",0),2)), (LCUse,Reduce(("subprogram_declaration",0),2)), (LCProcedure,Reduce(("subprogram_declaration",0),2))]]@slrp'a254; val slrp'a252=[[(LCEos,Reduce(("return_statement",1),3)), (LCAnnotation,Reduce(("return_statement",1),3)), (LCCon,Reduce(("return_statement",1),3)), (LCLChevron,Reduce(("return_statement",1),3)), (LCGrkGamma,Reduce(("return_statement",1),3)), (LCGrkDelta,Reduce(("return_statement",1),3)), (LCPragma,Reduce(("return_statement",1),3)), (LCNull,Reduce(("return_statement",1),3)), (LCExit,Reduce(("return_statement",1),3)), (LCReturn,Reduce(("return_statement",1),3)), (LCIf,Reduce(("return_statement",1),3)), (LCCase,Reduce(("return_statement",1),3)), (LCIdentifier,Reduce(("return_statement",1),3)), (LCCharacterLiteral,Reduce(("return_statement",1),3)), (LCTill,Reduce(("return_statement",1),3)), (LCLoop,Reduce(("return_statement",1),3)), (LCFor,Reduce(("return_statement",1),3)), (LCWhile,Reduce(("return_statement",1),3)), (LCElsIf,Reduce(("return_statement",1),3)), (LCElse,Reduce(("return_statement",1),3)), (LCEnd,Reduce(("return_statement",1),3)), (LCWhen,Reduce(("return_statement",1),3))]]@slrp'a253; val slrp'a251=[[(LCSemi,Shift 251)]]@slrp'a252; val slrp'a250=[[(LCEos,Reduce(("return_statement",0),2)), (LCAnnotation,Reduce(("return_statement",0),2)), (LCCon,Reduce(("return_statement",0),2)), (LCLChevron,Reduce(("return_statement",0),2)), (LCGrkGamma,Reduce(("return_statement",0),2)), (LCGrkDelta,Reduce(("return_statement",0),2)), (LCPragma,Reduce(("return_statement",0),2)), (LCNull,Reduce(("return_statement",0),2)), (LCExit,Reduce(("return_statement",0),2)), (LCReturn,Reduce(("return_statement",0),2)), (LCIf,Reduce(("return_statement",0),2)), (LCCase,Reduce(("return_statement",0),2)), (LCIdentifier,Reduce(("return_statement",0),2)), (LCCharacterLiteral,Reduce(("return_statement",0),2)), (LCTill,Reduce(("return_statement",0),2)), (LCLoop,Reduce(("return_statement",0),2)), (LCFor,Reduce(("return_statement",0),2)), (LCWhile,Reduce(("return_statement",0),2)), (LCElsIf,Reduce(("return_statement",0),2)), (LCElse,Reduce(("return_statement",0),2)), (LCEnd,Reduce(("return_statement",0),2)), (LCWhen,Reduce(("return_statement",0),2))]]@slrp'a251; val slrp'a249=[[(LCEos,Reduce(("exit_statement",1),5)), (LCAnnotation,Reduce(("exit_statement",1),5)), (LCCon,Reduce(("exit_statement",1),5)), (LCLChevron,Reduce(("exit_statement",1),5)), (LCGrkGamma,Reduce(("exit_statement",1),5)), (LCGrkDelta,Reduce(("exit_statement",1),5)), (LCPragma,Reduce(("exit_statement",1),5)), (LCNull,Reduce(("exit_statement",1),5)),(LCExit,Reduce(("exit_statement",1),5)), (LCReturn,Reduce(("exit_statement",1),5)),(LCIf,Reduce(("exit_statement",1),5)), (LCCase,Reduce(("exit_statement",1),5)), (LCIdentifier,Reduce(("exit_statement",1),5)), (LCCharacterLiteral,Reduce(("exit_statement",1),5)), (LCTill,Reduce(("exit_statement",1),5)),(LCLoop,Reduce(("exit_statement",1),5)), (LCFor,Reduce(("exit_statement",1),5)),(LCWhile,Reduce(("exit_statement",1),5)), (LCElsIf,Reduce(("exit_statement",1),5)),(LCElse,Reduce(("exit_statement",1),5)) ,(LCEnd,Reduce(("exit_statement",1),5)),(LCWhen,Reduce(("exit_statement",1),5))]]@slrp'a250; val slrp'a248=[[(LCSemi,Shift 248)]]@slrp'a249; val slrp'a247=[[(LCEos,Reduce(("exit_statement",0),3)), (LCAnnotation,Reduce(("exit_statement",0),3)), (LCCon,Reduce(("exit_statement",0),3)), (LCLChevron,Reduce(("exit_statement",0),3)), (LCGrkGamma,Reduce(("exit_statement",0),3)), (LCGrkDelta,Reduce(("exit_statement",0),3)), (LCPragma,Reduce(("exit_statement",0),3)), (LCNull,Reduce(("exit_statement",0),3)),(LCExit,Reduce(("exit_statement",0),3)), (LCReturn,Reduce(("exit_statement",0),3)),(LCIf,Reduce(("exit_statement",0),3)), (LCCase,Reduce(("exit_statement",0),3)), (LCIdentifier,Reduce(("exit_statement",0),3)), (LCCharacterLiteral,Reduce(("exit_statement",0),3)), (LCTill,Reduce(("exit_statement",0),3)),(LCLoop,Reduce(("exit_statement",0),3)), (LCFor,Reduce(("exit_statement",0),3)),(LCWhile,Reduce(("exit_statement",0),3)), (LCElsIf,Reduce(("exit_statement",0),3)),(LCElse,Reduce(("exit_statement",0),3)) ,(LCEnd,Reduce(("exit_statement",0),3)),(LCWhen,Reduce(("exit_statement",0),3))]]@slrp'a248; val slrp'a246=[[(LCEos,Reduce(("block_statement",1),6))]]@slrp'a247; val slrp'a245=[[(LCSemi,Shift 245)]]@slrp'a246; val slrp'a244=[[(LCEnd,Shift 503)]]@slrp'a245; val slrp'a243=[[(LCEos,Reduce(("block_statement",0),8))]]@slrp'a244; val slrp'a242=[[(LCSemi,Shift 242)]]@slrp'a243; val slrp'a241=[[(LCEnd,Shift 502)]]@slrp'a242; val slrp'a240=[[(LCBegin,Shift 681)]]@slrp'a241; val slrp'a239=[[(LCBecomes,Reduce(("auxiliary_expression",0),3)), (LCSemi,Reduce(("auxiliary_expression",0),3)), (LCRRange,Reduce(("auxiliary_expression",0),3)), (LCDigits,Reduce(("auxiliary_expression",0),3)), (LCDelta,Reduce(("auxiliary_expression",0),3)), (LCComma,Reduce(("auxiliary_expression",0),3)), (LCCrd,Reduce(("auxiliary_expression",0),3)), (LCAnd,Reduce(("auxiliary_expression",0),3)), (LCOr,Reduce(("auxiliary_expression",0),3)), (LCXor,Reduce(("auxiliary_expression",0),3)), (LCGreaterEquals,Reduce(("auxiliary_expression",0),3)), (LCGreaterThan,Reduce(("auxiliary_expression",0),3)), (LCLessEquals,Reduce(("auxiliary_expression",0),3)), (LCLessThan,Reduce(("auxiliary_expression",0),3)), (LCNotEquals,Reduce(("auxiliary_expression",0),3)), (LCEquals,Reduce(("auxiliary_expression",0),3)), (LCIn,Reduce(("auxiliary_expression",0),3)), (LCNot,Reduce(("auxiliary_expression",0),3)), (LCDotDot,Reduce(("auxiliary_expression",0),3)), (LCAmpersand,Reduce(("auxiliary_expression",0),3)), (LCMinus,Reduce(("auxiliary_expression",0),3)), (LCPlus,Reduce(("auxiliary_expression",0),3)), (LCRem,Reduce(("auxiliary_expression",0),3)), (LCMod,Reduce(("auxiliary_expression",0),3)), (LCDiv,Reduce(("auxiliary_expression",0),3)), (LCStar,Reduce(("auxiliary_expression",0),3)), (LCStarStar,Reduce(("auxiliary_expression",0),3)), (LCLoop,Reduce(("auxiliary_expression",0),3)), (LCThen,Reduce(("auxiliary_expression",0),3)), (LCIs,Reduce(("auxiliary_expression",0),3)), (LCGoesTo,Reduce(("auxiliary_expression",0),3)), (LCBar,Reduce(("auxiliary_expression",0),3)), (LCTill,Reduce(("auxiliary_expression",0),3))]]@slrp'a240; val slrp'a238=[[(LCRStrachey,Shift 238)]]@slrp'a239; val slrp'a237=[[(LCZ,Shift 237)]]@slrp'a238; val slrp'a236=[[(LCLoop,Reduce(("till_opt",1),2))]]@slrp'a237; val slrp'a235=[[(LCTill,Reduce(("loop_parameter_specification",1),4)), (LCLoop,Reduce(("loop_parameter_specification",1),4))]]@slrp'a236; val slrp'a234=[[(LCTill,Reduce(("loop_parameter_specification",0),3)), (LCLoop,Reduce(("loop_parameter_specification",0),3))]]@slrp'a235; val slrp'a233=[[(LCTill,Reduce(("iteration_scheme",1),2)), (LCLoop,Reduce(("iteration_scheme",1),2))]]@slrp'a234; val slrp'a232=[[(LCTill,Reduce(("iteration_scheme",0),2)), (LCLoop,Reduce(("iteration_scheme",0),2))]]@slrp'a233; val slrp'a231=[[(LCTill,Reduce(("iteration_scheme_opt",1),1)), (LCLoop,Reduce(("iteration_scheme_opt",1),1))]]@slrp'a232; val slrp'a230=[[(LCSemi,Reduce(("name_opt",1),1)), (LCWhen,Reduce(("name_opt",1),1))]]@slrp'a231; val slrp'a229=[[(LCFor,Reduce(("name_colon_opt",1),2)), (LCWhile,Reduce(("name_colon_opt",1),2)),(LCTill,Reduce(("name_colon_opt",1),2)) ,(LCLoop,Reduce(("name_colon_opt",1),2)), (LCDeclare,Reduce(("name_colon_opt",1),2)), (LCBegin,Reduce(("name_colon_opt",1),2))]]@slrp'a230; val slrp'a228=[[(LCIdentifier,Reduce(("loop_body",0),4)), (LCSemi,Reduce(("loop_body",0),4))]]@slrp'a229; val slrp'a227=[[(LCLoop,Shift 227)]]@slrp'a228; val slrp'a226=[[(LCEnd,Shift 226)]]@slrp'a227; val slrp'a225=[[(LCEos,Reduce(("loop_statement",0),6)), (LCAnnotation,Reduce(("loop_statement",0),6)), (LCCon,Reduce(("loop_statement",0),6)), (LCLChevron,Reduce(("loop_statement",0),6)), (LCGrkGamma,Reduce(("loop_statement",0),6)), (LCGrkDelta,Reduce(("loop_statement",0),6)), (LCPragma,Reduce(("loop_statement",0),6)), (LCNull,Reduce(("loop_statement",0),6)),(LCExit,Reduce(("loop_statement",0),6)), (LCReturn,Reduce(("loop_statement",0),6)),(LCIf,Reduce(("loop_statement",0),6)), (LCCase,Reduce(("loop_statement",0),6)), (LCIdentifier,Reduce(("loop_statement",0),6)), (LCCharacterLiteral,Reduce(("loop_statement",0),6)), (LCTill,Reduce(("loop_statement",0),6)),(LCLoop,Reduce(("loop_statement",0),6)), (LCFor,Reduce(("loop_statement",0),6)),(LCWhile,Reduce(("loop_statement",0),6)), (LCElsIf,Reduce(("loop_statement",0),6)),(LCElse,Reduce(("loop_statement",0),6)) ,(LCEnd,Reduce(("loop_statement",0),6)),(LCWhen,Reduce(("loop_statement",0),6))]]@slrp'a226; val slrp'a224=[[(LCSemi,Shift 224)]]@slrp'a225; val slrp'a223=[[(LCEnd,Reduce(("others_part",1),4))]]@slrp'a224; val slrp'a222=[[(LCGoesTo,Shift 679)]]@slrp'a223; val slrp'a221=[[(LCGoesTo,Reduce(("case_choice",0),1)), (LCBar,Reduce(("case_choice",0),1))]]@slrp'a222; val slrp'a220=[[(LCGoesTo,Reduce(("case_choice_list",1),3))]]@slrp'a221; val slrp'a219=[[(LCWhen,Reduce(("case_statement_alternative",0),4)), (LCEnd,Reduce(("case_statement_alternative",0),4))]]@slrp'a220; val slrp'a218=[[(LCGoesTo,Shift 678)]]@slrp'a219; val slrp'a217=[[(LCWhen,Reduce(("case_statement_alternative_list",1),2)), (LCEnd,Reduce(("case_statement_alternative_list",1),2))]]@slrp'a218; val slrp'a216=[[(LCWhen,Reduce(("case_statement_alternative_list",0),1)), (LCEnd,Reduce(("case_statement_alternative_list",0),1))]]@slrp'a217; val slrp'a215=[[(LCEos,Reduce(("case_statement",0),8)), (LCAnnotation,Reduce(("case_statement",0),8)), (LCCon,Reduce(("case_statement",0),8)), (LCLChevron,Reduce(("case_statement",0),8)), (LCGrkGamma,Reduce(("case_statement",0),8)), (LCGrkDelta,Reduce(("case_statement",0),8)), (LCPragma,Reduce(("case_statement",0),8)), (LCNull,Reduce(("case_statement",0),8)),(LCExit,Reduce(("case_statement",0),8)), (LCReturn,Reduce(("case_statement",0),8)),(LCIf,Reduce(("case_statement",0),8)), (LCCase,Reduce(("case_statement",0),8)), (LCIdentifier,Reduce(("case_statement",0),8)), (LCCharacterLiteral,Reduce(("case_statement",0),8)), (LCTill,Reduce(("case_statement",0),8)),(LCLoop,Reduce(("case_statement",0),8)), (LCFor,Reduce(("case_statement",0),8)),(LCWhile,Reduce(("case_statement",0),8)), (LCElsIf,Reduce(("case_statement",0),8)),(LCElse,Reduce(("case_statement",0),8)) ,(LCEnd,Reduce(("case_statement",0),8)),(LCWhen,Reduce(("case_statement",0),8))]]@slrp'a216; val slrp'a214=[[(LCSemi,Shift 214)]]@slrp'a215; val slrp'a213=[[(LCCase,Shift 213)]]@slrp'a214; val slrp'a212=[[(LCEnd,Shift 212)]]@slrp'a213; val slrp'a211=[[(LCIs,Shift 526)]]@slrp'a212; val slrp'a210=[[(LCThen,Reduce(("condition",0),1)), (LCTill,Reduce(("condition",0),1)),(LCLoop,Reduce(("condition",0),1)), (LCSemi,Reduce(("condition",0),1))]]@slrp'a211; val slrp'a209=[[(LCEnd,Reduce(("else_part",1),2))]]@slrp'a210; val slrp'a208=[[(LCElse,Reduce(("elsif_part",1),5)), (LCEnd,Reduce(("elsif_part",1),5))]]@slrp'a209; val slrp'a207=[[(LCThen,Shift 676)]]@slrp'a208; val slrp'a206=[[(LCEos,Reduce(("if_statement",0),9)), (LCAnnotation,Reduce(("if_statement",0),9)),(LCCon,Reduce(("if_statement",0),9)) ,(LCLChevron,Reduce(("if_statement",0),9)), (LCGrkGamma,Reduce(("if_statement",0),9)), (LCGrkDelta,Reduce(("if_statement",0),9)), (LCPragma,Reduce(("if_statement",0),9)),(LCNull,Reduce(("if_statement",0),9)), (LCExit,Reduce(("if_statement",0),9)),(LCReturn,Reduce(("if_statement",0),9)), (LCIf,Reduce(("if_statement",0),9)),(LCCase,Reduce(("if_statement",0),9)), (LCIdentifier,Reduce(("if_statement",0),9)), (LCCharacterLiteral,Reduce(("if_statement",0),9)), (LCTill,Reduce(("if_statement",0),9)),(LCLoop,Reduce(("if_statement",0),9)), (LCFor,Reduce(("if_statement",0),9)),(LCWhile,Reduce(("if_statement",0),9)), (LCElsIf,Reduce(("if_statement",0),9)),(LCElse,Reduce(("if_statement",0),9)), (LCEnd,Reduce(("if_statement",0),9)),(LCWhen,Reduce(("if_statement",0),9))]]@slrp'a207; val slrp'a205=[[(LCSemi,Shift 205)]]@slrp'a206; val slrp'a204=[[(LCIf,Shift 204)]]@slrp'a205; val slrp'a203=[[(LCEnd,Shift 203)]]@slrp'a204; val slrp'a202=[[(LCThen,Shift 675)]]@slrp'a203; val slrp'a201=[[(LCEos,Reduce(("assignment_statement",0),4)), (LCAnnotation,Reduce(("assignment_statement",0),4)), (LCCon,Reduce(("assignment_statement",0),4)), (LCLChevron,Reduce(("assignment_statement",0),4)), (LCGrkGamma,Reduce(("assignment_statement",0),4)), (LCGrkDelta,Reduce(("assignment_statement",0),4)), (LCPragma,Reduce(("assignment_statement",0),4)), (LCNull,Reduce(("assignment_statement",0),4)), (LCExit,Reduce(("assignment_statement",0),4)), (LCReturn,Reduce(("assignment_statement",0),4)), (LCIf,Reduce(("assignment_statement",0),4)), (LCCase,Reduce(("assignment_statement",0),4)), (LCIdentifier,Reduce(("assignment_statement",0),4)), (LCCharacterLiteral,Reduce(("assignment_statement",0),4)), (LCTill,Reduce(("assignment_statement",0),4)), (LCLoop,Reduce(("assignment_statement",0),4)), (LCFor,Reduce(("assignment_statement",0),4)), (LCWhile,Reduce(("assignment_statement",0),4)), (LCElsIf,Reduce(("assignment_statement",0),4)), (LCElse,Reduce(("assignment_statement",0),4)), (LCEnd,Reduce(("assignment_statement",0),4)), (LCWhen,Reduce(("assignment_statement",0),4))]]@slrp'a202; val slrp'a200=[[(LCSemi,Shift 200)]]@slrp'a201; val slrp'a199=[[(LCEos,Reduce(("null_statement",0),2)), (LCAnnotation,Reduce(("null_statement",0),2)), (LCCon,Reduce(("null_statement",0),2)), (LCLChevron,Reduce(("null_statement",0),2)), (LCGrkGamma,Reduce(("null_statement",0),2)), (LCGrkDelta,Reduce(("null_statement",0),2)), (LCPragma,Reduce(("null_statement",0),2)), (LCNull,Reduce(("null_statement",0),2)),(LCExit,Reduce(("null_statement",0),2)), (LCReturn,Reduce(("null_statement",0),2)),(LCIf,Reduce(("null_statement",0),2)), (LCCase,Reduce(("null_statement",0),2)), (LCIdentifier,Reduce(("null_statement",0),2)), (LCCharacterLiteral,Reduce(("null_statement",0),2)), (LCTill,Reduce(("null_statement",0),2)),(LCLoop,Reduce(("null_statement",0),2)), (LCFor,Reduce(("null_statement",0),2)),(LCWhile,Reduce(("null_statement",0),2)), (LCElsIf,Reduce(("null_statement",0),2)),(LCElse,Reduce(("null_statement",0),2)) ,(LCEnd,Reduce(("null_statement",0),2)),(LCWhen,Reduce(("null_statement",0),2))]]@slrp'a200; val slrp'a198=[[(LCSemi,Shift 198)]]@slrp'a199; val slrp'a197=[[(LCEos,Reduce(("compound_statement",2),1)), (LCAnnotation,Reduce(("compound_statement",2),1)), (LCCon,Reduce(("compound_statement",2),1)), (LCLChevron,Reduce(("compound_statement",2),1)), (LCGrkGamma,Reduce(("compound_statement",2),1)), (LCGrkDelta,Reduce(("compound_statement",2),1)), (LCPragma,Reduce(("compound_statement",2),1)), (LCNull,Reduce(("compound_statement",2),1)), (LCExit,Reduce(("compound_statement",2),1)), (LCReturn,Reduce(("compound_statement",2),1)), (LCIf,Reduce(("compound_statement",2),1)), (LCCase,Reduce(("compound_statement",2),1)), (LCIdentifier,Reduce(("compound_statement",2),1)), (LCCharacterLiteral,Reduce(("compound_statement",2),1)), (LCTill,Reduce(("compound_statement",2),1)), (LCLoop,Reduce(("compound_statement",2),1)), (LCFor,Reduce(("compound_statement",2),1)), (LCWhile,Reduce(("compound_statement",2),1)), (LCElsIf,Reduce(("compound_statement",2),1)), (LCElse,Reduce(("compound_statement",2),1)), (LCEnd,Reduce(("compound_statement",2),1)), (LCWhen,Reduce(("compound_statement",2),1))]]@slrp'a198; val slrp'a196=[[(LCEos,Reduce(("compound_statement",1),1)), (LCAnnotation,Reduce(("compound_statement",1),1)), (LCCon,Reduce(("compound_statement",1),1)), (LCLChevron,Reduce(("compound_statement",1),1)), (LCGrkGamma,Reduce(("compound_statement",1),1)), (LCGrkDelta,Reduce(("compound_statement",1),1)), (LCPragma,Reduce(("compound_statement",1),1)), (LCNull,Reduce(("compound_statement",1),1)), (LCExit,Reduce(("compound_statement",1),1)), (LCReturn,Reduce(("compound_statement",1),1)), (LCIf,Reduce(("compound_statement",1),1)), (LCCase,Reduce(("compound_statement",1),1)), (LCIdentifier,Reduce(("compound_statement",1),1)), (LCCharacterLiteral,Reduce(("compound_statement",1),1)), (LCTill,Reduce(("compound_statement",1),1)), (LCLoop,Reduce(("compound_statement",1),1)), (LCFor,Reduce(("compound_statement",1),1)), (LCWhile,Reduce(("compound_statement",1),1)), (LCElsIf,Reduce(("compound_statement",1),1)), (LCElse,Reduce(("compound_statement",1),1)), (LCEnd,Reduce(("compound_statement",1),1)), (LCWhen,Reduce(("compound_statement",1),1))]]@slrp'a197; val slrp'a195=[[(LCEos,Reduce(("compound_statement",0),1)), (LCAnnotation,Reduce(("compound_statement",0),1)), (LCCon,Reduce(("compound_statement",0),1)), (LCLChevron,Reduce(("compound_statement",0),1)), (LCGrkGamma,Reduce(("compound_statement",0),1)), (LCGrkDelta,Reduce(("compound_statement",0),1)), (LCPragma,Reduce(("compound_statement",0),1)), (LCNull,Reduce(("compound_statement",0),1)), (LCExit,Reduce(("compound_statement",0),1)), (LCReturn,Reduce(("compound_statement",0),1)), (LCIf,Reduce(("compound_statement",0),1)), (LCCase,Reduce(("compound_statement",0),1)), (LCIdentifier,Reduce(("compound_statement",0),1)), (LCCharacterLiteral,Reduce(("compound_statement",0),1)), (LCTill,Reduce(("compound_statement",0),1)), (LCLoop,Reduce(("compound_statement",0),1)), (LCFor,Reduce(("compound_statement",0),1)), (LCWhile,Reduce(("compound_statement",0),1)), (LCElsIf,Reduce(("compound_statement",0),1)), (LCElse,Reduce(("compound_statement",0),1)), (LCEnd,Reduce(("compound_statement",0),1)), (LCWhen,Reduce(("compound_statement",0),1))]]@slrp'a196; val slrp'a194=[[(LCEos,Reduce(("simple_statement",4),1)), (LCAnnotation,Reduce(("simple_statement",4),1)), (LCCon,Reduce(("simple_statement",4),1)), (LCLChevron,Reduce(("simple_statement",4),1)), (LCGrkGamma,Reduce(("simple_statement",4),1)), (LCGrkDelta,Reduce(("simple_statement",4),1)), (LCPragma,Reduce(("simple_statement",4),1)), (LCNull,Reduce(("simple_statement",4),1)), (LCExit,Reduce(("simple_statement",4),1)), (LCReturn,Reduce(("simple_statement",4),1)), (LCIf,Reduce(("simple_statement",4),1)), (LCCase,Reduce(("simple_statement",4),1)), (LCIdentifier,Reduce(("simple_statement",4),1)), (LCCharacterLiteral,Reduce(("simple_statement",4),1)), (LCTill,Reduce(("simple_statement",4),1)), (LCLoop,Reduce(("simple_statement",4),1)), (LCFor,Reduce(("simple_statement",4),1)), (LCWhile,Reduce(("simple_statement",4),1)), (LCElsIf,Reduce(("simple_statement",4),1)), (LCElse,Reduce(("simple_statement",4),1)), (LCEnd,Reduce(("simple_statement",4),1)), (LCWhen,Reduce(("simple_statement",4),1))]]@slrp'a195; val slrp'a193=[[(LCEos,Reduce(("simple_statement",3),1)), (LCAnnotation,Reduce(("simple_statement",3),1)), (LCCon,Reduce(("simple_statement",3),1)), (LCLChevron,Reduce(("simple_statement",3),1)), (LCGrkGamma,Reduce(("simple_statement",3),1)), (LCGrkDelta,Reduce(("simple_statement",3),1)), (LCPragma,Reduce(("simple_statement",3),1)), (LCNull,Reduce(("simple_statement",3),1)), (LCExit,Reduce(("simple_statement",3),1)), (LCReturn,Reduce(("simple_statement",3),1)), (LCIf,Reduce(("simple_statement",3),1)), (LCCase,Reduce(("simple_statement",3),1)), (LCIdentifier,Reduce(("simple_statement",3),1)), (LCCharacterLiteral,Reduce(("simple_statement",3),1)), (LCTill,Reduce(("simple_statement",3),1)), (LCLoop,Reduce(("simple_statement",3),1)), (LCFor,Reduce(("simple_statement",3),1)), (LCWhile,Reduce(("simple_statement",3),1)), (LCElsIf,Reduce(("simple_statement",3),1)), (LCElse,Reduce(("simple_statement",3),1)), (LCEnd,Reduce(("simple_statement",3),1)), (LCWhen,Reduce(("simple_statement",3),1))]]@slrp'a194; val slrp'a192=[[(LCEos,Reduce(("simple_statement",2),1)), (LCAnnotation,Reduce(("simple_statement",2),1)), (LCCon,Reduce(("simple_statement",2),1)), (LCLChevron,Reduce(("simple_statement",2),1)), (LCGrkGamma,Reduce(("simple_statement",2),1)), (LCGrkDelta,Reduce(("simple_statement",2),1)), (LCPragma,Reduce(("simple_statement",2),1)), (LCNull,Reduce(("simple_statement",2),1)), (LCExit,Reduce(("simple_statement",2),1)), (LCReturn,Reduce(("simple_statement",2),1)), (LCIf,Reduce(("simple_statement",2),1)), (LCCase,Reduce(("simple_statement",2),1)), (LCIdentifier,Reduce(("simple_statement",2),1)), (LCCharacterLiteral,Reduce(("simple_statement",2),1)), (LCTill,Reduce(("simple_statement",2),1)), (LCLoop,Reduce(("simple_statement",2),1)), (LCFor,Reduce(("simple_statement",2),1)), (LCWhile,Reduce(("simple_statement",2),1)), (LCElsIf,Reduce(("simple_statement",2),1)), (LCElse,Reduce(("simple_statement",2),1)), (LCEnd,Reduce(("simple_statement",2),1)), (LCWhen,Reduce(("simple_statement",2),1))]]@slrp'a193; val slrp'a191=[[(LCEos,Reduce(("simple_statement",1),1)), (LCAnnotation,Reduce(("simple_statement",1),1)), (LCCon,Reduce(("simple_statement",1),1)), (LCLChevron,Reduce(("simple_statement",1),1)), (LCGrkGamma,Reduce(("simple_statement",1),1)), (LCGrkDelta,Reduce(("simple_statement",1),1)), (LCPragma,Reduce(("simple_statement",1),1)), (LCNull,Reduce(("simple_statement",1),1)), (LCExit,Reduce(("simple_statement",1),1)), (LCReturn,Reduce(("simple_statement",1),1)), (LCIf,Reduce(("simple_statement",1),1)), (LCCase,Reduce(("simple_statement",1),1)), (LCIdentifier,Reduce(("simple_statement",1),1)), (LCCharacterLiteral,Reduce(("simple_statement",1),1)), (LCTill,Reduce(("simple_statement",1),1)), (LCLoop,Reduce(("simple_statement",1),1)), (LCFor,Reduce(("simple_statement",1),1)), (LCWhile,Reduce(("simple_statement",1),1)), (LCElsIf,Reduce(("simple_statement",1),1)), (LCElse,Reduce(("simple_statement",1),1)), (LCEnd,Reduce(("simple_statement",1),1)), (LCWhen,Reduce(("simple_statement",1),1))]]@slrp'a192; val slrp'a190=[[(LCEos,Reduce(("simple_statement",0),1)), (LCAnnotation,Reduce(("simple_statement",0),1)), (LCCon,Reduce(("simple_statement",0),1)), (LCLChevron,Reduce(("simple_statement",0),1)), (LCGrkGamma,Reduce(("simple_statement",0),1)), (LCGrkDelta,Reduce(("simple_statement",0),1)), (LCPragma,Reduce(("simple_statement",0),1)), (LCNull,Reduce(("simple_statement",0),1)), (LCExit,Reduce(("simple_statement",0),1)), (LCReturn,Reduce(("simple_statement",0),1)), (LCIf,Reduce(("simple_statement",0),1)), (LCCase,Reduce(("simple_statement",0),1)), (LCIdentifier,Reduce(("simple_statement",0),1)), (LCCharacterLiteral,Reduce(("simple_statement",0),1)), (LCTill,Reduce(("simple_statement",0),1)), (LCLoop,Reduce(("simple_statement",0),1)), (LCFor,Reduce(("simple_statement",0),1)), (LCWhile,Reduce(("simple_statement",0),1)), (LCElsIf,Reduce(("simple_statement",0),1)), (LCElse,Reduce(("simple_statement",0),1)), (LCEnd,Reduce(("simple_statement",0),1)), (LCWhen,Reduce(("simple_statement",0),1))]]@slrp'a191; val slrp'a189=[[(LCEos,Reduce(("k_slot",1),4)), (LCLChevron,Reduce(("k_slot",1),4)),(LCFunction,Reduce(("k_slot",1),4)), (LCPackage,Reduce(("k_slot",1),4)),(LCIdentifier,Reduce(("k_slot",1),4)), (LCAnnotation,Reduce(("k_slot",1),4)),(LCSubType,Reduce(("k_slot",1),4)), (LCPragma,Reduce(("k_slot",1),4)),(LCProcedure,Reduce(("k_slot",1),4)), (LCType,Reduce(("k_slot",1),4)),(LCFor,Reduce(("k_slot",1),4)), (LCUse,Reduce(("k_slot",1),4)),(LCCon,Reduce(("k_slot",1),4)), (LCGrkGamma,Reduce(("k_slot",1),4)),(LCGrkDelta,Reduce(("k_slot",1),4)), (LCNull,Reduce(("k_slot",1),4)),(LCExit,Reduce(("k_slot",1),4)), (LCReturn,Reduce(("k_slot",1),4)),(LCIf,Reduce(("k_slot",1),4)), (LCCase,Reduce(("k_slot",1),4)),(LCCharacterLiteral,Reduce(("k_slot",1),4)), (LCTill,Reduce(("k_slot",1),4)),(LCLoop,Reduce(("k_slot",1),4)), (LCWhile,Reduce(("k_slot",1),4)),(LCSemi,Reduce(("k_slot",1),4)), (LCEnd,Reduce(("k_slot",1),4)),(LCPrivate,Reduce(("k_slot",1),4)), (LCAuxiliary,Reduce(("k_slot",1),4)),(LCBegin,Reduce(("k_slot",1),4)), (LCElsIf,Reduce(("k_slot",1),4)),(LCElse,Reduce(("k_slot",1),4)), (LCWhen,Reduce(("k_slot",1),4)),(LCIs,Reduce(("k_slot",1),4)), (LCRenames,Reduce(("k_slot",1),4)),(LCSeparate,Reduce(("k_slot",1),4))]]@slrp'a190; val slrp'a188=[[(LCEos,Reduce(("label",1),3)), (LCAnnotation,Reduce(("label",1),3)),(LCCon,Reduce(("label",1),3)), (LCLChevron,Reduce(("label",1),3)),(LCGrkGamma,Reduce(("label",1),3)), (LCGrkDelta,Reduce(("label",1),3)),(LCPragma,Reduce(("label",1),3)), (LCNull,Reduce(("label",1),3)),(LCExit,Reduce(("label",1),3)), (LCReturn,Reduce(("label",1),3)),(LCIf,Reduce(("label",1),3)), (LCCase,Reduce(("label",1),3)),(LCIdentifier,Reduce(("label",1),3)), (LCCharacterLiteral,Reduce(("label",1),3)),(LCTill,Reduce(("label",1),3)), (LCLoop,Reduce(("label",1),3)),(LCFor,Reduce(("label",1),3)), (LCWhile,Reduce(("label",1),3)),(LCFunction,Reduce(("label",1),3)), (LCPackage,Reduce(("label",1),3)),(LCSubType,Reduce(("label",1),3)), (LCProcedure,Reduce(("label",1),3)),(LCType,Reduce(("label",1),3)), (LCUse,Reduce(("label",1),3)),(LCElsIf,Reduce(("label",1),3)), (LCElse,Reduce(("label",1),3)),(LCEnd,Reduce(("label",1),3)), (LCWhen,Reduce(("label",1),3)),(LCSemi,Reduce(("label",1),3)), (LCPrivate,Reduce(("label",1),3)),(LCAuxiliary,Reduce(("label",1),3)), (LCBegin,Reduce(("label",1),3)),(LCIs,Reduce(("label",1),3)), (LCRenames,Reduce(("label",1),3)),(LCSeparate,Reduce(("label",1),3))]]@slrp'a189; val slrp'a187=[[(LCEos,Reduce(("label",0),3)), (LCAnnotation,Reduce(("label",0),3)),(LCCon,Reduce(("label",0),3)), (LCLChevron,Reduce(("label",0),3)),(LCGrkGamma,Reduce(("label",0),3)), (LCGrkDelta,Reduce(("label",0),3)),(LCPragma,Reduce(("label",0),3)), (LCNull,Reduce(("label",0),3)),(LCExit,Reduce(("label",0),3)), (LCReturn,Reduce(("label",0),3)),(LCIf,Reduce(("label",0),3)), (LCCase,Reduce(("label",0),3)),(LCIdentifier,Reduce(("label",0),3)), (LCCharacterLiteral,Reduce(("label",0),3)),(LCTill,Reduce(("label",0),3)), (LCLoop,Reduce(("label",0),3)),(LCFor,Reduce(("label",0),3)), (LCWhile,Reduce(("label",0),3)),(LCFunction,Reduce(("label",0),3)), (LCPackage,Reduce(("label",0),3)),(LCSubType,Reduce(("label",0),3)), (LCProcedure,Reduce(("label",0),3)),(LCType,Reduce(("label",0),3)), (LCUse,Reduce(("label",0),3)),(LCElsIf,Reduce(("label",0),3)), (LCElse,Reduce(("label",0),3)),(LCEnd,Reduce(("label",0),3)), (LCWhen,Reduce(("label",0),3)),(LCSemi,Reduce(("label",0),3)), (LCPrivate,Reduce(("label",0),3)),(LCAuxiliary,Reduce(("label",0),3)), (LCBegin,Reduce(("label",0),3)),(LCIs,Reduce(("label",0),3)), (LCRenames,Reduce(("label",0),3)),(LCSeparate,Reduce(("label",0),3))]]@slrp'a188; val slrp'a186=[[(LCCrd,Shift 186)]]@slrp'a187; val slrp'a185=[[(LCEos,Reduce(("specification_statement",4),4)), (LCAnnotation,Reduce(("specification_statement",4),4)), (LCCon,Reduce(("specification_statement",4),4)), (LCLChevron,Reduce(("specification_statement",4),4)), (LCGrkGamma,Reduce(("specification_statement",4),4)), (LCGrkDelta,Reduce(("specification_statement",4),4)), (LCPragma,Reduce(("specification_statement",4),4)), (LCNull,Reduce(("specification_statement",4),4)), (LCExit,Reduce(("specification_statement",4),4)), (LCReturn,Reduce(("specification_statement",4),4)), (LCIf,Reduce(("specification_statement",4),4)), (LCCase,Reduce(("specification_statement",4),4)), (LCIdentifier,Reduce(("specification_statement",4),4)), (LCCharacterLiteral,Reduce(("specification_statement",4),4)), (LCTill,Reduce(("specification_statement",4),4)), (LCLoop,Reduce(("specification_statement",4),4)), (LCFor,Reduce(("specification_statement",4),4)), (LCWhile,Reduce(("specification_statement",4),4)), (LCOrd,Reduce(("specification_statement",4),4)), (LCElsIf,Reduce(("specification_statement",4),4)), (LCElse,Reduce(("specification_statement",4),4)), (LCEnd,Reduce(("specification_statement",4),4)), (LCWhen,Reduce(("specification_statement",4),4)), (LCSemi,Reduce(("specification_statement",4),4)), (LCIs,Reduce(("specification_statement",4),4)), (LCRenames,Reduce(("specification_statement",4),4))]]@slrp'a186; val slrp'a184=[[(LCRBrace,Shift 184)]]@slrp'a185; val slrp'a183=[[(LCZ,Shift 183)]]@slrp'a184; val slrp'a182=[[(LCLBrace,Shift 182)]]@slrp'a183; val slrp'a181=[[(LCEos,Reduce(("specification_statement",3),4)), (LCAnnotation,Reduce(("specification_statement",3),4)), (LCCon,Reduce(("specification_statement",3),4)), (LCLChevron,Reduce(("specification_statement",3),4)), (LCGrkGamma,Reduce(("specification_statement",3),4)), (LCGrkDelta,Reduce(("specification_statement",3),4)), (LCPragma,Reduce(("specification_statement",3),4)), (LCNull,Reduce(("specification_statement",3),4)), (LCExit,Reduce(("specification_statement",3),4)), (LCReturn,Reduce(("specification_statement",3),4)), (LCIf,Reduce(("specification_statement",3),4)), (LCCase,Reduce(("specification_statement",3),4)), (LCIdentifier,Reduce(("specification_statement",3),4)), (LCCharacterLiteral,Reduce(("specification_statement",3),4)), (LCTill,Reduce(("specification_statement",3),4)), (LCLoop,Reduce(("specification_statement",3),4)), (LCFor,Reduce(("specification_statement",3),4)), (LCWhile,Reduce(("specification_statement",3),4)), (LCOrd,Reduce(("specification_statement",3),4)), (LCElsIf,Reduce(("specification_statement",3),4)), (LCElse,Reduce(("specification_statement",3),4)), (LCEnd,Reduce(("specification_statement",3),4)), (LCWhen,Reduce(("specification_statement",3),4)), (LCSemi,Reduce(("specification_statement",3),4)), (LCIs,Reduce(("specification_statement",3),4)), (LCRenames,Reduce(("specification_statement",3),4))]]@slrp'a182; val slrp'a180=[[(LCRBrace,Shift 180)]]@slrp'a181; val slrp'a179=[[(LCZ,Shift 179)]]@slrp'a180; val slrp'a178=[[(LCEos,Reduce(("specification_statement",2),4)), (LCAnnotation,Reduce(("specification_statement",2),4)), (LCCon,Reduce(("specification_statement",2),4)), (LCLChevron,Reduce(("specification_statement",2),4)), (LCGrkGamma,Reduce(("specification_statement",2),4)), (LCGrkDelta,Reduce(("specification_statement",2),4)), (LCPragma,Reduce(("specification_statement",2),4)), (LCNull,Reduce(("specification_statement",2),4)), (LCExit,Reduce(("specification_statement",2),4)), (LCReturn,Reduce(("specification_statement",2),4)), (LCIf,Reduce(("specification_statement",2),4)), (LCCase,Reduce(("specification_statement",2),4)), (LCIdentifier,Reduce(("specification_statement",2),4)), (LCCharacterLiteral,Reduce(("specification_statement",2),4)), (LCTill,Reduce(("specification_statement",2),4)), (LCLoop,Reduce(("specification_statement",2),4)), (LCFor,Reduce(("specification_statement",2),4)), (LCWhile,Reduce(("specification_statement",2),4)), (LCOrd,Reduce(("specification_statement",2),4)), (LCElsIf,Reduce(("specification_statement",2),4)), (LCElse,Reduce(("specification_statement",2),4)), (LCEnd,Reduce(("specification_statement",2),4)), (LCWhen,Reduce(("specification_statement",2),4)), (LCSemi,Reduce(("specification_statement",2),4)), (LCIs,Reduce(("specification_statement",2),4)), (LCRenames,Reduce(("specification_statement",2),4))]]@slrp'a179; val slrp'a177=[[(LCRSqBrack,Shift 177)]]@slrp'a178; val slrp'a176=[[(LCZ,Shift 176)]]@slrp'a177; val slrp'a175=[[(LCEos,Reduce(("specification_statement",1),5)), (LCAnnotation,Reduce(("specification_statement",1),5)), (LCCon,Reduce(("specification_statement",1),5)), (LCLChevron,Reduce(("specification_statement",1),5)), (LCGrkGamma,Reduce(("specification_statement",1),5)), (LCGrkDelta,Reduce(("specification_statement",1),5)), (LCPragma,Reduce(("specification_statement",1),5)), (LCNull,Reduce(("specification_statement",1),5)), (LCExit,Reduce(("specification_statement",1),5)), (LCReturn,Reduce(("specification_statement",1),5)), (LCIf,Reduce(("specification_statement",1),5)), (LCCase,Reduce(("specification_statement",1),5)), (LCIdentifier,Reduce(("specification_statement",1),5)), (LCCharacterLiteral,Reduce(("specification_statement",1),5)), (LCTill,Reduce(("specification_statement",1),5)), (LCLoop,Reduce(("specification_statement",1),5)), (LCFor,Reduce(("specification_statement",1),5)), (LCWhile,Reduce(("specification_statement",1),5)), (LCOrd,Reduce(("specification_statement",1),5)), (LCElsIf,Reduce(("specification_statement",1),5)), (LCElse,Reduce(("specification_statement",1),5)), (LCEnd,Reduce(("specification_statement",1),5)), (LCWhen,Reduce(("specification_statement",1),5)), (LCSemi,Reduce(("specification_statement",1),5)), (LCIs,Reduce(("specification_statement",1),5)), (LCRenames,Reduce(("specification_statement",1),5))]]@slrp'a176; val slrp'a174=[[(LCRBrace,Shift 174)]]@slrp'a175; val slrp'a173=[[(LCZ,Shift 173)]]@slrp'a174; val slrp'a172=[[(LCEos,Reduce(("specification_statement",0),5)), (LCAnnotation,Reduce(("specification_statement",0),5)), (LCCon,Reduce(("specification_statement",0),5)), (LCLChevron,Reduce(("specification_statement",0),5)), (LCGrkGamma,Reduce(("specification_statement",0),5)), (LCGrkDelta,Reduce(("specification_statement",0),5)), (LCPragma,Reduce(("specification_statement",0),5)), (LCNull,Reduce(("specification_statement",0),5)), (LCExit,Reduce(("specification_statement",0),5)), (LCReturn,Reduce(("specification_statement",0),5)), (LCIf,Reduce(("specification_statement",0),5)), (LCCase,Reduce(("specification_statement",0),5)), (LCIdentifier,Reduce(("specification_statement",0),5)), (LCCharacterLiteral,Reduce(("specification_statement",0),5)), (LCTill,Reduce(("specification_statement",0),5)), (LCLoop,Reduce(("specification_statement",0),5)), (LCFor,Reduce(("specification_statement",0),5)), (LCWhile,Reduce(("specification_statement",0),5)), (LCOrd,Reduce(("specification_statement",0),5)), (LCElsIf,Reduce(("specification_statement",0),5)), (LCElse,Reduce(("specification_statement",0),5)), (LCEnd,Reduce(("specification_statement",0),5)), (LCWhen,Reduce(("specification_statement",0),5)), (LCSemi,Reduce(("specification_statement",0),5)), (LCIs,Reduce(("specification_statement",0),5)), (LCRenames,Reduce(("specification_statement",0),5))]]@slrp'a173; val slrp'a171=[[(LCRSqBrack,Shift 171)]]@slrp'a172; val slrp'a170=[[(LCZ,Shift 170)]]@slrp'a171; val slrp'a169=[[(LCEos,Reduce(("statement",8),1)), (LCAnnotation,Reduce(("statement",8),1)),(LCCon,Reduce(("statement",8),1)), (LCLChevron,Reduce(("statement",8),1)),(LCGrkGamma,Reduce(("statement",8),1)), (LCGrkDelta,Reduce(("statement",8),1)),(LCPragma,Reduce(("statement",8),1)), (LCNull,Reduce(("statement",8),1)),(LCExit,Reduce(("statement",8),1)), (LCReturn,Reduce(("statement",8),1)),(LCIf,Reduce(("statement",8),1)), (LCCase,Reduce(("statement",8),1)),(LCIdentifier,Reduce(("statement",8),1)), (LCCharacterLiteral,Reduce(("statement",8),1)), (LCTill,Reduce(("statement",8),1)),(LCLoop,Reduce(("statement",8),1)), (LCFor,Reduce(("statement",8),1)),(LCWhile,Reduce(("statement",8),1)), (LCElsIf,Reduce(("statement",8),1)),(LCElse,Reduce(("statement",8),1)), (LCEnd,Reduce(("statement",8),1)),(LCWhen,Reduce(("statement",8),1))]]@slrp'a170; val slrp'a168=[[(LCEos,Reduce(("statement",7),1)), (LCAnnotation,Reduce(("statement",7),1)),(LCCon,Reduce(("statement",7),1)), (LCLChevron,Reduce(("statement",7),1)),(LCGrkGamma,Reduce(("statement",7),1)), (LCGrkDelta,Reduce(("statement",7),1)),(LCPragma,Reduce(("statement",7),1)), (LCNull,Reduce(("statement",7),1)),(LCExit,Reduce(("statement",7),1)), (LCReturn,Reduce(("statement",7),1)),(LCIf,Reduce(("statement",7),1)), (LCCase,Reduce(("statement",7),1)),(LCIdentifier,Reduce(("statement",7),1)), (LCCharacterLiteral,Reduce(("statement",7),1)), (LCTill,Reduce(("statement",7),1)),(LCLoop,Reduce(("statement",7),1)), (LCFor,Reduce(("statement",7),1)),(LCWhile,Reduce(("statement",7),1)), (LCElsIf,Reduce(("statement",7),1)),(LCElse,Reduce(("statement",7),1)), (LCEnd,Reduce(("statement",7),1)),(LCWhen,Reduce(("statement",7),1))]]@slrp'a169; val slrp'a167=[[(LCEos,Reduce(("statement",6),1)), (LCAnnotation,Reduce(("statement",6),1)),(LCCon,Reduce(("statement",6),1)), (LCLChevron,Reduce(("statement",6),1)),(LCGrkGamma,Reduce(("statement",6),1)), (LCGrkDelta,Reduce(("statement",6),1)),(LCPragma,Reduce(("statement",6),1)), (LCNull,Reduce(("statement",6),1)),(LCExit,Reduce(("statement",6),1)), (LCReturn,Reduce(("statement",6),1)),(LCIf,Reduce(("statement",6),1)), (LCCase,Reduce(("statement",6),1)),(LCIdentifier,Reduce(("statement",6),1)), (LCCharacterLiteral,Reduce(("statement",6),1)), (LCTill,Reduce(("statement",6),1)),(LCLoop,Reduce(("statement",6),1)), (LCFor,Reduce(("statement",6),1)),(LCWhile,Reduce(("statement",6),1)), (LCElsIf,Reduce(("statement",6),1)),(LCElse,Reduce(("statement",6),1)), (LCEnd,Reduce(("statement",6),1)),(LCWhen,Reduce(("statement",6),1))]]@slrp'a168; val slrp'a166=[[(LCEos,Reduce(("statement",5),1)), (LCAnnotation,Reduce(("statement",5),1)),(LCCon,Reduce(("statement",5),1)), (LCLChevron,Reduce(("statement",5),1)),(LCGrkGamma,Reduce(("statement",5),1)), (LCGrkDelta,Reduce(("statement",5),1)),(LCPragma,Reduce(("statement",5),1)), (LCNull,Reduce(("statement",5),1)),(LCExit,Reduce(("statement",5),1)), (LCReturn,Reduce(("statement",5),1)),(LCIf,Reduce(("statement",5),1)), (LCCase,Reduce(("statement",5),1)),(LCIdentifier,Reduce(("statement",5),1)), (LCCharacterLiteral,Reduce(("statement",5),1)), (LCTill,Reduce(("statement",5),1)),(LCLoop,Reduce(("statement",5),1)), (LCFor,Reduce(("statement",5),1)),(LCWhile,Reduce(("statement",5),1)), (LCElsIf,Reduce(("statement",5),1)),(LCElse,Reduce(("statement",5),1)), (LCEnd,Reduce(("statement",5),1)),(LCWhen,Reduce(("statement",5),1))]]@slrp'a167; val slrp'a165=[[(LCEos,Reduce(("statement",4),5)), (LCAnnotation,Reduce(("statement",4),5)),(LCCon,Reduce(("statement",4),5)), (LCLChevron,Reduce(("statement",4),5)),(LCGrkGamma,Reduce(("statement",4),5)), (LCGrkDelta,Reduce(("statement",4),5)),(LCPragma,Reduce(("statement",4),5)), (LCNull,Reduce(("statement",4),5)),(LCExit,Reduce(("statement",4),5)), (LCReturn,Reduce(("statement",4),5)),(LCIf,Reduce(("statement",4),5)), (LCCase,Reduce(("statement",4),5)),(LCIdentifier,Reduce(("statement",4),5)), (LCCharacterLiteral,Reduce(("statement",4),5)), (LCTill,Reduce(("statement",4),5)),(LCLoop,Reduce(("statement",4),5)), (LCFor,Reduce(("statement",4),5)),(LCWhile,Reduce(("statement",4),5)), (LCElsIf,Reduce(("statement",4),5)),(LCElse,Reduce(("statement",4),5)), (LCEnd,Reduce(("statement",4),5)),(LCWhen,Reduce(("statement",4),5))]]@slrp'a166; val slrp'a164=[[(LCEos,Reduce(("statement",2),2)), (LCAnnotation,Reduce(("statement",2),2)),(LCCon,Reduce(("statement",2),2)), (LCLChevron,Reduce(("statement",2),2)),(LCGrkGamma,Reduce(("statement",2),2)), (LCGrkDelta,Reduce(("statement",2),2)),(LCPragma,Reduce(("statement",2),2)), (LCNull,Reduce(("statement",2),2)),(LCExit,Reduce(("statement",2),2)), (LCReturn,Reduce(("statement",2),2)),(LCIf,Reduce(("statement",2),2)), (LCCase,Reduce(("statement",2),2)),(LCIdentifier,Reduce(("statement",2),2)), (LCCharacterLiteral,Reduce(("statement",2),2)), (LCTill,Reduce(("statement",2),2)),(LCLoop,Reduce(("statement",2),2)), (LCFor,Reduce(("statement",2),2)),(LCWhile,Reduce(("statement",2),2)), (LCElsIf,Reduce(("statement",2),2)),(LCElse,Reduce(("statement",2),2)), (LCEnd,Reduce(("statement",2),2)),(LCWhen,Reduce(("statement",2),2))]]@slrp'a165; val slrp'a163=[[(LCEos,Reduce(("statement",0),1)), (LCAnnotation,Reduce(("statement",0),1)),(LCCon,Reduce(("statement",0),1)), (LCLChevron,Reduce(("statement",0),1)),(LCGrkGamma,Reduce(("statement",0),1)), (LCGrkDelta,Reduce(("statement",0),1)),(LCPragma,Reduce(("statement",0),1)), (LCNull,Reduce(("statement",0),1)),(LCExit,Reduce(("statement",0),1)), (LCReturn,Reduce(("statement",0),1)),(LCIf,Reduce(("statement",0),1)), (LCCase,Reduce(("statement",0),1)),(LCIdentifier,Reduce(("statement",0),1)), (LCCharacterLiteral,Reduce(("statement",0),1)), (LCTill,Reduce(("statement",0),1)),(LCLoop,Reduce(("statement",0),1)), (LCFor,Reduce(("statement",0),1)),(LCWhile,Reduce(("statement",0),1)), (LCElsIf,Reduce(("statement",0),1)),(LCElse,Reduce(("statement",0),1)), (LCEnd,Reduce(("statement",0),1)),(LCWhen,Reduce(("statement",0),1))]]@slrp'a164; val slrp'a162=[[(LCEos,Reduce(("sequence_of_statements",1),2)), (LCElsIf,Reduce(("sequence_of_statements",1),2)), (LCElse,Reduce(("sequence_of_statements",1),2)), (LCEnd,Reduce(("sequence_of_statements",1),2)), (LCWhen,Reduce(("sequence_of_statements",1),2))]]@slrp'a163; val slrp'a161=[[(LCBecomes,Reduce(("qualified_expression",0),3)), (LCSemi,Reduce(("qualified_expression",0),3)), (LCRRange,Reduce(("qualified_expression",0),3)), (LCDigits,Reduce(("qualified_expression",0),3)), (LCDelta,Reduce(("qualified_expression",0),3)), (LCComma,Reduce(("qualified_expression",0),3)), (LCCrd,Reduce(("qualified_expression",0),3)), (LCAnd,Reduce(("qualified_expression",0),3)), (LCOr,Reduce(("qualified_expression",0),3)), (LCXor,Reduce(("qualified_expression",0),3)), (LCGreaterEquals,Reduce(("qualified_expression",0),3)), (LCGreaterThan,Reduce(("qualified_expression",0),3)), (LCLessEquals,Reduce(("qualified_expression",0),3)), (LCLessThan,Reduce(("qualified_expression",0),3)), (LCNotEquals,Reduce(("qualified_expression",0),3)), (LCEquals,Reduce(("qualified_expression",0),3)), (LCIn,Reduce(("qualified_expression",0),3)), (LCNot,Reduce(("qualified_expression",0),3)), (LCDotDot,Reduce(("qualified_expression",0),3)), (LCAmpersand,Reduce(("qualified_expression",0),3)), (LCMinus,Reduce(("qualified_expression",0),3)), (LCPlus,Reduce(("qualified_expression",0),3)), (LCRem,Reduce(("qualified_expression",0),3)), (LCMod,Reduce(("qualified_expression",0),3)), (LCDiv,Reduce(("qualified_expression",0),3)), (LCStar,Reduce(("qualified_expression",0),3)), (LCStarStar,Reduce(("qualified_expression",0),3)), (LCThen,Reduce(("qualified_expression",0),3)), (LCIs,Reduce(("qualified_expression",0),3)), (LCGoesTo,Reduce(("qualified_expression",0),3)), (LCBar,Reduce(("qualified_expression",0),3)), (LCTill,Reduce(("qualified_expression",0),3)), (LCLoop,Reduce(("qualified_expression",0),3))]]@slrp'a162; val slrp'a160=[[(LCNot,Reduce(("multiplying_operator",3),1)), (LCAbs,Reduce(("multiplying_operator",3),1)), (LCStringLiteral,Reduce(("multiplying_operator",3),1)), (LCCharacterLiteral,Reduce(("multiplying_operator",3),1)), (LCNumericLiteral,Reduce(("multiplying_operator",3),1)), (LCIdentifier,Reduce(("multiplying_operator",3),1)), (LCOrd,Reduce(("multiplying_operator",3),1)), (LCLStrachey,Reduce(("multiplying_operator",3),1))]]@slrp'a161; val slrp'a159=[[(LCNot,Reduce(("multiplying_operator",2),1)), (LCAbs,Reduce(("multiplying_operator",2),1)), (LCStringLiteral,Reduce(("multiplying_operator",2),1)), (LCCharacterLiteral,Reduce(("multiplying_operator",2),1)), (LCNumericLiteral,Reduce(("multiplying_operator",2),1)), (LCIdentifier,Reduce(("multiplying_operator",2),1)), (LCOrd,Reduce(("multiplying_operator",2),1)), (LCLStrachey,Reduce(("multiplying_operator",2),1))]]@slrp'a160; val slrp'a158=[[(LCNot,Reduce(("multiplying_operator",1),1)), (LCAbs,Reduce(("multiplying_operator",1),1)), (LCStringLiteral,Reduce(("multiplying_operator",1),1)), (LCCharacterLiteral,Reduce(("multiplying_operator",1),1)), (LCNumericLiteral,Reduce(("multiplying_operator",1),1)), (LCIdentifier,Reduce(("multiplying_operator",1),1)), (LCOrd,Reduce(("multiplying_operator",1),1)), (LCLStrachey,Reduce(("multiplying_operator",1),1))]]@slrp'a159; val slrp'a157=[[(LCNot,Reduce(("multiplying_operator",0),1)), (LCAbs,Reduce(("multiplying_operator",0),1)), (LCStringLiteral,Reduce(("multiplying_operator",0),1)), (LCCharacterLiteral,Reduce(("multiplying_operator",0),1)), (LCNumericLiteral,Reduce(("multiplying_operator",0),1)), (LCIdentifier,Reduce(("multiplying_operator",0),1)), (LCOrd,Reduce(("multiplying_operator",0),1)), (LCLStrachey,Reduce(("multiplying_operator",0),1))]]@slrp'a158; val slrp'a156=[[(LCNot,Reduce(("unary_adding_operator",1),1)), (LCAbs,Reduce(("unary_adding_operator",1),1)), (LCStringLiteral,Reduce(("unary_adding_operator",1),1)), (LCCharacterLiteral,Reduce(("unary_adding_operator",1),1)), (LCNumericLiteral,Reduce(("unary_adding_operator",1),1)), (LCIdentifier,Reduce(("unary_adding_operator",1),1)), (LCOrd,Reduce(("unary_adding_operator",1),1)), (LCLStrachey,Reduce(("unary_adding_operator",1),1))]]@slrp'a157; val slrp'a155=[[(LCNot,Reduce(("unary_adding_operator",0),1)), (LCAbs,Reduce(("unary_adding_operator",0),1)), (LCStringLiteral,Reduce(("unary_adding_operator",0),1)), (LCCharacterLiteral,Reduce(("unary_adding_operator",0),1)), (LCNumericLiteral,Reduce(("unary_adding_operator",0),1)), (LCIdentifier,Reduce(("unary_adding_operator",0),1)), (LCOrd,Reduce(("unary_adding_operator",0),1)), (LCLStrachey,Reduce(("unary_adding_operator",0),1))]]@slrp'a156; val slrp'a154=[[(LCNot,Reduce(("binary_adding_operator",2),1)), (LCAbs,Reduce(("binary_adding_operator",2),1)), (LCStringLiteral,Reduce(("binary_adding_operator",2),1)), (LCCharacterLiteral,Reduce(("binary_adding_operator",2),1)), (LCNumericLiteral,Reduce(("binary_adding_operator",2),1)), (LCIdentifier,Reduce(("binary_adding_operator",2),1)), (LCOrd,Reduce(("binary_adding_operator",2),1)), (LCLStrachey,Reduce(("binary_adding_operator",2),1))]]@slrp'a155; val slrp'a153=[[(LCNot,Reduce(("binary_adding_operator",1),1)), (LCAbs,Reduce(("binary_adding_operator",1),1)), (LCStringLiteral,Reduce(("binary_adding_operator",1),1)), (LCCharacterLiteral,Reduce(("binary_adding_operator",1),1)), (LCNumericLiteral,Reduce(("binary_adding_operator",1),1)), (LCIdentifier,Reduce(("binary_adding_operator",1),1)), (LCOrd,Reduce(("binary_adding_operator",1),1)), (LCLStrachey,Reduce(("binary_adding_operator",1),1))]]@slrp'a154; val slrp'a152=[[(LCNot,Reduce(("binary_adding_operator",0),1)), (LCAbs,Reduce(("binary_adding_operator",0),1)), (LCStringLiteral,Reduce(("binary_adding_operator",0),1)), (LCCharacterLiteral,Reduce(("binary_adding_operator",0),1)), (LCNumericLiteral,Reduce(("binary_adding_operator",0),1)), (LCIdentifier,Reduce(("binary_adding_operator",0),1)), (LCOrd,Reduce(("binary_adding_operator",0),1)), (LCLStrachey,Reduce(("binary_adding_operator",0),1))]]@slrp'a153; val slrp'a151=[[(LCMinus,Reduce(("relational_operator",5),1)), (LCPlus,Reduce(("relational_operator",5),1)), (LCNot,Reduce(("relational_operator",5),1)), (LCAbs,Reduce(("relational_operator",5),1)), (LCStringLiteral,Reduce(("relational_operator",5),1)), (LCCharacterLiteral,Reduce(("relational_operator",5),1)), (LCNumericLiteral,Reduce(("relational_operator",5),1)), (LCIdentifier,Reduce(("relational_operator",5),1)), (LCOrd,Reduce(("relational_operator",5),1)), (LCLStrachey,Reduce(("relational_operator",5),1))]]@slrp'a152; val slrp'a150=[[(LCMinus,Reduce(("relational_operator",4),1)), (LCPlus,Reduce(("relational_operator",4),1)), (LCNot,Reduce(("relational_operator",4),1)), (LCAbs,Reduce(("relational_operator",4),1)), (LCStringLiteral,Reduce(("relational_operator",4),1)), (LCCharacterLiteral,Reduce(("relational_operator",4),1)), (LCNumericLiteral,Reduce(("relational_operator",4),1)), (LCIdentifier,Reduce(("relational_operator",4),1)), (LCOrd,Reduce(("relational_operator",4),1)), (LCLStrachey,Reduce(("relational_operator",4),1))]]@slrp'a151; val slrp'a149=[[(LCMinus,Reduce(("relational_operator",3),1)), (LCPlus,Reduce(("relational_operator",3),1)), (LCNot,Reduce(("relational_operator",3),1)), (LCAbs,Reduce(("relational_operator",3),1)), (LCStringLiteral,Reduce(("relational_operator",3),1)), (LCCharacterLiteral,Reduce(("relational_operator",3),1)), (LCNumericLiteral,Reduce(("relational_operator",3),1)), (LCIdentifier,Reduce(("relational_operator",3),1)), (LCOrd,Reduce(("relational_operator",3),1)), (LCLStrachey,Reduce(("relational_operator",3),1))]]@slrp'a150; val slrp'a148=[[(LCMinus,Reduce(("relational_operator",2),1)), (LCPlus,Reduce(("relational_operator",2),1)), (LCNot,Reduce(("relational_operator",2),1)), (LCAbs,Reduce(("relational_operator",2),1)), (LCStringLiteral,Reduce(("relational_operator",2),1)), (LCCharacterLiteral,Reduce(("relational_operator",2),1)), (LCNumericLiteral,Reduce(("relational_operator",2),1)), (LCIdentifier,Reduce(("relational_operator",2),1)), (LCOrd,Reduce(("relational_operator",2),1)), (LCLStrachey,Reduce(("relational_operator",2),1))]]@slrp'a149; val slrp'a147=[[(LCMinus,Reduce(("relational_operator",1),1)), (LCPlus,Reduce(("relational_operator",1),1)), (LCNot,Reduce(("relational_operator",1),1)), (LCAbs,Reduce(("relational_operator",1),1)), (LCStringLiteral,Reduce(("relational_operator",1),1)), (LCCharacterLiteral,Reduce(("relational_operator",1),1)), (LCNumericLiteral,Reduce(("relational_operator",1),1)), (LCIdentifier,Reduce(("relational_operator",1),1)), (LCOrd,Reduce(("relational_operator",1),1)), (LCLStrachey,Reduce(("relational_operator",1),1))]]@slrp'a148; val slrp'a146=[[(LCMinus,Reduce(("relational_operator",0),1)), (LCPlus,Reduce(("relational_operator",0),1)), (LCNot,Reduce(("relational_operator",0),1)), (LCAbs,Reduce(("relational_operator",0),1)), (LCStringLiteral,Reduce(("relational_operator",0),1)), (LCCharacterLiteral,Reduce(("relational_operator",0),1)), (LCNumericLiteral,Reduce(("relational_operator",0),1)), (LCIdentifier,Reduce(("relational_operator",0),1)), (LCOrd,Reduce(("relational_operator",0),1)), (LCLStrachey,Reduce(("relational_operator",0),1))]]@slrp'a147; val slrp'a145=[[(LCBecomes,Reduce(("primary",6),1)), (LCSemi,Reduce(("primary",6),1)),(LCRRange,Reduce(("primary",6),1)), (LCDigits,Reduce(("primary",6),1)),(LCDelta,Reduce(("primary",6),1)), (LCComma,Reduce(("primary",6),1)),(LCCrd,Reduce(("primary",6),1)), (LCAnd,Reduce(("primary",6),1)),(LCOr,Reduce(("primary",6),1)), (LCXor,Reduce(("primary",6),1)),(LCGreaterEquals,Reduce(("primary",6),1)), (LCGreaterThan,Reduce(("primary",6),1)),(LCLessEquals,Reduce(("primary",6),1)), (LCLessThan,Reduce(("primary",6),1)),(LCNotEquals,Reduce(("primary",6),1)), (LCEquals,Reduce(("primary",6),1)),(LCIn,Reduce(("primary",6),1)), (LCNot,Reduce(("primary",6),1)),(LCDotDot,Reduce(("primary",6),1)), (LCAmpersand,Reduce(("primary",6),1)),(LCMinus,Reduce(("primary",6),1)), (LCPlus,Reduce(("primary",6),1)),(LCRem,Reduce(("primary",6),1)), (LCMod,Reduce(("primary",6),1)),(LCDiv,Reduce(("primary",6),1)), (LCStar,Reduce(("primary",6),1)),(LCStarStar,Reduce(("primary",6),1)), (LCThen,Reduce(("primary",6),1)),(LCIs,Reduce(("primary",6),1)), (LCGoesTo,Reduce(("primary",6),1)),(LCBar,Reduce(("primary",6),1)), (LCTill,Reduce(("primary",6),1)),(LCLoop,Reduce(("primary",6),1))]]@slrp'a146; val slrp'a144=[[(LCBecomes,Reduce(("primary",5),1)), (LCSemi,Reduce(("primary",5),1)),(LCRRange,Reduce(("primary",5),1)), (LCDigits,Reduce(("primary",5),1)),(LCDelta,Reduce(("primary",5),1)), (LCComma,Reduce(("primary",5),1)),(LCCrd,Reduce(("primary",5),1)), (LCAnd,Reduce(("primary",5),1)),(LCOr,Reduce(("primary",5),1)), (LCXor,Reduce(("primary",5),1)),(LCGreaterEquals,Reduce(("primary",5),1)), (LCGreaterThan,Reduce(("primary",5),1)),(LCLessEquals,Reduce(("primary",5),1)), (LCLessThan,Reduce(("primary",5),1)),(LCNotEquals,Reduce(("primary",5),1)), (LCEquals,Reduce(("primary",5),1)),(LCIn,Reduce(("primary",5),1)), (LCNot,Reduce(("primary",5),1)),(LCDotDot,Reduce(("primary",5),1)), (LCAmpersand,Reduce(("primary",5),1)),(LCMinus,Reduce(("primary",5),1)), (LCPlus,Reduce(("primary",5),1)),(LCRem,Reduce(("primary",5),1)), (LCMod,Reduce(("primary",5),1)),(LCDiv,Reduce(("primary",5),1)), (LCStar,Reduce(("primary",5),1)),(LCStarStar,Reduce(("primary",5),1)), (LCThen,Reduce(("primary",5),1)),(LCIs,Reduce(("primary",5),1)), (LCGoesTo,Reduce(("primary",5),1)),(LCBar,Reduce(("primary",5),1)), (LCTill,Reduce(("primary",5),1)),(LCLoop,Reduce(("primary",5),1))]]@slrp'a145; val slrp'a143=[[(LCBecomes,Reduce(("primary",4),1)), (LCSemi,Reduce(("primary",4),1)),(LCRRange,Reduce(("primary",4),1)), (LCDigits,Reduce(("primary",4),1)),(LCDelta,Reduce(("primary",4),1)), (LCComma,Reduce(("primary",4),1)),(LCCrd,Reduce(("primary",4),1)), (LCAnd,Reduce(("primary",4),1)),(LCOr,Reduce(("primary",4),1)), (LCXor,Reduce(("primary",4),1)),(LCGreaterEquals,Reduce(("primary",4),1)), (LCGreaterThan,Reduce(("primary",4),1)),(LCLessEquals,Reduce(("primary",4),1)), (LCLessThan,Reduce(("primary",4),1)),(LCNotEquals,Reduce(("primary",4),1)), (LCEquals,Reduce(("primary",4),1)),(LCIn,Reduce(("primary",4),1)), (LCNot,Reduce(("primary",4),1)),(LCDotDot,Reduce(("primary",4),1)), (LCAmpersand,Reduce(("primary",4),1)),(LCMinus,Reduce(("primary",4),1)), (LCPlus,Reduce(("primary",4),1)),(LCRem,Reduce(("primary",4),1)), (LCMod,Reduce(("primary",4),1)),(LCDiv,Reduce(("primary",4),1)), (LCStar,Reduce(("primary",4),1)),(LCStarStar,Reduce(("primary",4),1)), (LCThen,Reduce(("primary",4),1)),(LCIs,Reduce(("primary",4),1)), (LCGoesTo,Reduce(("primary",4),1)),(LCBar,Reduce(("primary",4),1)), (LCTill,Reduce(("primary",4),1)),(LCLoop,Reduce(("primary",4),1))]]@slrp'a144; val slrp'a142=[[(LCBecomes,Reduce(("primary",2),1)), (LCSemi,Reduce(("primary",2),1)),(LCRRange,Reduce(("primary",2),1)), (LCDigits,Reduce(("primary",2),1)),(LCDelta,Reduce(("primary",2),1)), (LCComma,Reduce(("primary",2),1)),(LCCrd,Reduce(("primary",2),1)), (LCAnd,Reduce(("primary",2),1)),(LCOr,Reduce(("primary",2),1)), (LCXor,Reduce(("primary",2),1)),(LCGreaterEquals,Reduce(("primary",2),1)), (LCGreaterThan,Reduce(("primary",2),1)),(LCLessEquals,Reduce(("primary",2),1)), (LCLessThan,Reduce(("primary",2),1)),(LCNotEquals,Reduce(("primary",2),1)), (LCEquals,Reduce(("primary",2),1)),(LCIn,Reduce(("primary",2),1)), (LCNot,Reduce(("primary",2),1)),(LCDotDot,Reduce(("primary",2),1)), (LCAmpersand,Reduce(("primary",2),1)),(LCMinus,Reduce(("primary",2),1)), (LCPlus,Reduce(("primary",2),1)),(LCRem,Reduce(("primary",2),1)), (LCMod,Reduce(("primary",2),1)),(LCDiv,Reduce(("primary",2),1)), (LCStar,Reduce(("primary",2),1)),(LCStarStar,Reduce(("primary",2),1)), (LCThen,Reduce(("primary",2),1)),(LCIs,Reduce(("primary",2),1)), (LCGoesTo,Reduce(("primary",2),1)),(LCBar,Reduce(("primary",2),1)), (LCTill,Reduce(("primary",2),1)),(LCLoop,Reduce(("primary",2),1))]]@slrp'a143; val slrp'a141=[[(LCBecomes,Reduce(("primary",0),1)), (LCSemi,Reduce(("primary",0),1)),(LCRRange,Reduce(("primary",0),1)), (LCDigits,Reduce(("primary",0),1)),(LCDelta,Reduce(("primary",0),1)), (LCComma,Reduce(("primary",0),1)),(LCCrd,Reduce(("primary",0),1)), (LCAnd,Reduce(("primary",0),1)),(LCOr,Reduce(("primary",0),1)), (LCXor,Reduce(("primary",0),1)),(LCGreaterEquals,Reduce(("primary",0),1)), (LCGreaterThan,Reduce(("primary",0),1)),(LCLessEquals,Reduce(("primary",0),1)), (LCLessThan,Reduce(("primary",0),1)),(LCNotEquals,Reduce(("primary",0),1)), (LCEquals,Reduce(("primary",0),1)),(LCIn,Reduce(("primary",0),1)), (LCNot,Reduce(("primary",0),1)),(LCDotDot,Reduce(("primary",0),1)), (LCAmpersand,Reduce(("primary",0),1)),(LCMinus,Reduce(("primary",0),1)), (LCPlus,Reduce(("primary",0),1)),(LCRem,Reduce(("primary",0),1)), (LCMod,Reduce(("primary",0),1)),(LCDiv,Reduce(("primary",0),1)), (LCStar,Reduce(("primary",0),1)),(LCStarStar,Reduce(("primary",0),1)), (LCThen,Reduce(("primary",0),1)),(LCIs,Reduce(("primary",0),1)), (LCGoesTo,Reduce(("primary",0),1)),(LCBar,Reduce(("primary",0),1)), (LCTill,Reduce(("primary",0),1)),(LCLoop,Reduce(("primary",0),1))]]@slrp'a142; val slrp'a140=[[(LCBecomes,Reduce(("factor",3),2)), (LCSemi,Reduce(("factor",3),2)),(LCRRange,Reduce(("factor",3),2)), (LCDigits,Reduce(("factor",3),2)),(LCDelta,Reduce(("factor",3),2)), (LCComma,Reduce(("factor",3),2)),(LCCrd,Reduce(("factor",3),2)), (LCAnd,Reduce(("factor",3),2)),(LCOr,Reduce(("factor",3),2)), (LCXor,Reduce(("factor",3),2)),(LCGreaterEquals,Reduce(("factor",3),2)), (LCGreaterThan,Reduce(("factor",3),2)),(LCLessEquals,Reduce(("factor",3),2)), (LCLessThan,Reduce(("factor",3),2)),(LCNotEquals,Reduce(("factor",3),2)), (LCEquals,Reduce(("factor",3),2)),(LCIn,Reduce(("factor",3),2)), (LCNot,Reduce(("factor",3),2)),(LCDotDot,Reduce(("factor",3),2)), (LCAmpersand,Reduce(("factor",3),2)),(LCMinus,Reduce(("factor",3),2)), (LCPlus,Reduce(("factor",3),2)),(LCRem,Reduce(("factor",3),2)), (LCMod,Reduce(("factor",3),2)),(LCDiv,Reduce(("factor",3),2)), (LCStar,Reduce(("factor",3),2)),(LCThen,Reduce(("factor",3),2)), (LCIs,Reduce(("factor",3),2)),(LCGoesTo,Reduce(("factor",3),2)), (LCBar,Reduce(("factor",3),2)),(LCTill,Reduce(("factor",3),2)), (LCLoop,Reduce(("factor",3),2))]]@slrp'a141; val slrp'a139=[[(LCBecomes,Reduce(("factor",2),2)), (LCSemi,Reduce(("factor",2),2)),(LCRRange,Reduce(("factor",2),2)), (LCDigits,Reduce(("factor",2),2)),(LCDelta,Reduce(("factor",2),2)), (LCComma,Reduce(("factor",2),2)),(LCCrd,Reduce(("factor",2),2)), (LCAnd,Reduce(("factor",2),2)),(LCOr,Reduce(("factor",2),2)), (LCXor,Reduce(("factor",2),2)),(LCGreaterEquals,Reduce(("factor",2),2)), (LCGreaterThan,Reduce(("factor",2),2)),(LCLessEquals,Reduce(("factor",2),2)), (LCLessThan,Reduce(("factor",2),2)),(LCNotEquals,Reduce(("factor",2),2)), (LCEquals,Reduce(("factor",2),2)),(LCIn,Reduce(("factor",2),2)), (LCNot,Reduce(("factor",2),2)),(LCDotDot,Reduce(("factor",2),2)), (LCAmpersand,Reduce(("factor",2),2)),(LCMinus,Reduce(("factor",2),2)), (LCPlus,Reduce(("factor",2),2)),(LCRem,Reduce(("factor",2),2)), (LCMod,Reduce(("factor",2),2)),(LCDiv,Reduce(("factor",2),2)), (LCStar,Reduce(("factor",2),2)),(LCThen,Reduce(("factor",2),2)), (LCIs,Reduce(("factor",2),2)),(LCGoesTo,Reduce(("factor",2),2)), (LCBar,Reduce(("factor",2),2)),(LCTill,Reduce(("factor",2),2)), (LCLoop,Reduce(("factor",2),2))]]@slrp'a140; val slrp'a138=[[(LCBecomes,Reduce(("factor",1),3)), (LCSemi,Reduce(("factor",1),3)),(LCRRange,Reduce(("factor",1),3)), (LCDigits,Reduce(("factor",1),3)),(LCDelta,Reduce(("factor",1),3)), (LCComma,Reduce(("factor",1),3)),(LCCrd,Reduce(("factor",1),3)), (LCAnd,Reduce(("factor",1),3)),(LCOr,Reduce(("factor",1),3)), (LCXor,Reduce(("factor",1),3)),(LCGreaterEquals,Reduce(("factor",1),3)), (LCGreaterThan,Reduce(("factor",1),3)),(LCLessEquals,Reduce(("factor",1),3)), (LCLessThan,Reduce(("factor",1),3)),(LCNotEquals,Reduce(("factor",1),3)), (LCEquals,Reduce(("factor",1),3)),(LCIn,Reduce(("factor",1),3)), (LCNot,Reduce(("factor",1),3)),(LCDotDot,Reduce(("factor",1),3)), (LCAmpersand,Reduce(("factor",1),3)),(LCMinus,Reduce(("factor",1),3)), (LCPlus,Reduce(("factor",1),3)),(LCRem,Reduce(("factor",1),3)), (LCMod,Reduce(("factor",1),3)),(LCDiv,Reduce(("factor",1),3)), (LCStar,Reduce(("factor",1),3)),(LCThen,Reduce(("factor",1),3)), (LCIs,Reduce(("factor",1),3)),(LCGoesTo,Reduce(("factor",1),3)), (LCBar,Reduce(("factor",1),3)),(LCTill,Reduce(("factor",1),3)), (LCLoop,Reduce(("factor",1),3))]]@slrp'a139; val slrp'a137=[[(LCBecomes,Reduce(("term",1),3)),(LCSemi,Reduce(("term",1),3)), (LCRRange,Reduce(("term",1),3)),(LCDigits,Reduce(("term",1),3)), (LCDelta,Reduce(("term",1),3)),(LCComma,Reduce(("term",1),3)), (LCCrd,Reduce(("term",1),3)),(LCAnd,Reduce(("term",1),3)), (LCOr,Reduce(("term",1),3)),(LCXor,Reduce(("term",1),3)), (LCGreaterEquals,Reduce(("term",1),3)),(LCGreaterThan,Reduce(("term",1),3)), (LCLessEquals,Reduce(("term",1),3)),(LCLessThan,Reduce(("term",1),3)), (LCNotEquals,Reduce(("term",1),3)),(LCEquals,Reduce(("term",1),3)), (LCIn,Reduce(("term",1),3)),(LCNot,Reduce(("term",1),3)), (LCDotDot,Reduce(("term",1),3)),(LCAmpersand,Reduce(("term",1),3)), (LCMinus,Reduce(("term",1),3)),(LCPlus,Reduce(("term",1),3)), (LCRem,Reduce(("term",1),3)),(LCMod,Reduce(("term",1),3)), (LCDiv,Reduce(("term",1),3)),(LCStar,Reduce(("term",1),3)), (LCThen,Reduce(("term",1),3)),(LCIs,Reduce(("term",1),3)), (LCGoesTo,Reduce(("term",1),3)),(LCBar,Reduce(("term",1),3)), (LCTill,Reduce(("term",1),3)),(LCLoop,Reduce(("term",1),3))]]@slrp'a138; val slrp'a136=[[(LCBecomes,Reduce(("term",0),1)),(LCSemi,Reduce(("term",0),1)), (LCRRange,Reduce(("term",0),1)),(LCDigits,Reduce(("term",0),1)), (LCDelta,Reduce(("term",0),1)),(LCComma,Reduce(("term",0),1)), (LCCrd,Reduce(("term",0),1)),(LCAnd,Reduce(("term",0),1)), (LCOr,Reduce(("term",0),1)),(LCXor,Reduce(("term",0),1)), (LCGreaterEquals,Reduce(("term",0),1)),(LCGreaterThan,Reduce(("term",0),1)), (LCLessEquals,Reduce(("term",0),1)),(LCLessThan,Reduce(("term",0),1)), (LCNotEquals,Reduce(("term",0),1)),(LCEquals,Reduce(("term",0),1)), (LCIn,Reduce(("term",0),1)),(LCNot,Reduce(("term",0),1)), (LCDotDot,Reduce(("term",0),1)),(LCAmpersand,Reduce(("term",0),1)), (LCMinus,Reduce(("term",0),1)),(LCPlus,Reduce(("term",0),1)), (LCRem,Reduce(("term",0),1)),(LCMod,Reduce(("term",0),1)), (LCDiv,Reduce(("term",0),1)),(LCStar,Reduce(("term",0),1)), (LCThen,Reduce(("term",0),1)),(LCIs,Reduce(("term",0),1)), (LCGoesTo,Reduce(("term",0),1)),(LCBar,Reduce(("term",0),1)), (LCTill,Reduce(("term",0),1)),(LCLoop,Reduce(("term",0),1))]]@slrp'a137; val slrp'a135=[[(LCBecomes,Reduce(("binoptail",1),3)), (LCSemi,Reduce(("binoptail",1),3)),(LCRRange,Reduce(("binoptail",1),3)), (LCDigits,Reduce(("binoptail",1),3)),(LCDelta,Reduce(("binoptail",1),3)), (LCComma,Reduce(("binoptail",1),3)),(LCCrd,Reduce(("binoptail",1),3)), (LCAnd,Reduce(("binoptail",1),3)),(LCOr,Reduce(("binoptail",1),3)), (LCXor,Reduce(("binoptail",1),3)),(LCGreaterEquals,Reduce(("binoptail",1),3)), (LCGreaterThan,Reduce(("binoptail",1),3)), (LCLessEquals,Reduce(("binoptail",1),3)),(LCLessThan,Reduce(("binoptail",1),3)), (LCNotEquals,Reduce(("binoptail",1),3)),(LCEquals,Reduce(("binoptail",1),3)), (LCIn,Reduce(("binoptail",1),3)),(LCNot,Reduce(("binoptail",1),3)), (LCDotDot,Reduce(("binoptail",1),3)),(LCThen,Reduce(("binoptail",1),3)), (LCIs,Reduce(("binoptail",1),3)),(LCGoesTo,Reduce(("binoptail",1),3)), (LCBar,Reduce(("binoptail",1),3)),(LCTill,Reduce(("binoptail",1),3)), (LCLoop,Reduce(("binoptail",1),3))]]@slrp'a136; val slrp'a134=[[(LCBecomes,Reduce(("simple_expression",1),3)), (LCSemi,Reduce(("simple_expression",1),3)), (LCRRange,Reduce(("simple_expression",1),3)), (LCDigits,Reduce(("simple_expression",1),3)), (LCDelta,Reduce(("simple_expression",1),3)), (LCComma,Reduce(("simple_expression",1),3)), (LCCrd,Reduce(("simple_expression",1),3)), (LCAnd,Reduce(("simple_expression",1),3)), (LCOr,Reduce(("simple_expression",1),3)), (LCXor,Reduce(("simple_expression",1),3)), (LCGreaterEquals,Reduce(("simple_expression",1),3)), (LCGreaterThan,Reduce(("simple_expression",1),3)), (LCLessEquals,Reduce(("simple_expression",1),3)), (LCLessThan,Reduce(("simple_expression",1),3)), (LCNotEquals,Reduce(("simple_expression",1),3)), (LCEquals,Reduce(("simple_expression",1),3)), (LCIn,Reduce(("simple_expression",1),3)), (LCNot,Reduce(("simple_expression",1),3)), (LCDotDot,Reduce(("simple_expression",1),3)), (LCThen,Reduce(("simple_expression",1),3)), (LCIs,Reduce(("simple_expression",1),3)), (LCGoesTo,Reduce(("simple_expression",1),3)), (LCBar,Reduce(("simple_expression",1),3)), (LCTill,Reduce(("simple_expression",1),3)), (LCLoop,Reduce(("simple_expression",1),3))]]@slrp'a135; val slrp'a133=[[(LCBecomes,Reduce(("simple_expression",0),2)), (LCSemi,Reduce(("simple_expression",0),2)), (LCRRange,Reduce(("simple_expression",0),2)), (LCDigits,Reduce(("simple_expression",0),2)), (LCDelta,Reduce(("simple_expression",0),2)), (LCComma,Reduce(("simple_expression",0),2)), (LCCrd,Reduce(("simple_expression",0),2)), (LCAnd,Reduce(("simple_expression",0),2)), (LCOr,Reduce(("simple_expression",0),2)), (LCXor,Reduce(("simple_expression",0),2)), (LCGreaterEquals,Reduce(("simple_expression",0),2)), (LCGreaterThan,Reduce(("simple_expression",0),2)), (LCLessEquals,Reduce(("simple_expression",0),2)), (LCLessThan,Reduce(("simple_expression",0),2)), (LCNotEquals,Reduce(("simple_expression",0),2)), (LCEquals,Reduce(("simple_expression",0),2)), (LCIn,Reduce(("simple_expression",0),2)), (LCNot,Reduce(("simple_expression",0),2)), (LCDotDot,Reduce(("simple_expression",0),2)), (LCThen,Reduce(("simple_expression",0),2)), (LCIs,Reduce(("simple_expression",0),2)), (LCGoesTo,Reduce(("simple_expression",0),2)), (LCBar,Reduce(("simple_expression",0),2)), (LCTill,Reduce(("simple_expression",0),2)), (LCLoop,Reduce(("simple_expression",0),2))]]@slrp'a134; val slrp'a132=[[(LCBecomes,Reduce(("sr_expression",1),3)), (LCSemi,Reduce(("sr_expression",1),3)),(LCRRange,Reduce(("sr_expression",1),3)), (LCDigits,Reduce(("sr_expression",1),3)),(LCDelta,Reduce(("sr_expression",1),3)) ,(LCComma,Reduce(("sr_expression",1),3)),(LCCrd,Reduce(("sr_expression",1),3)), (LCAnd,Reduce(("sr_expression",1),3)),(LCOr,Reduce(("sr_expression",1),3)), (LCXor,Reduce(("sr_expression",1),3)), (LCGreaterEquals,Reduce(("sr_expression",1),3)), (LCGreaterThan,Reduce(("sr_expression",1),3)), (LCLessEquals,Reduce(("sr_expression",1),3)), (LCLessThan,Reduce(("sr_expression",1),3)), (LCNotEquals,Reduce(("sr_expression",1),3)), (LCEquals,Reduce(("sr_expression",1),3)),(LCIn,Reduce(("sr_expression",1),3)), (LCNot,Reduce(("sr_expression",1),3)),(LCThen,Reduce(("sr_expression",1),3)), (LCIs,Reduce(("sr_expression",1),3)),(LCGoesTo,Reduce(("sr_expression",1),3)), (LCBar,Reduce(("sr_expression",1),3)),(LCTill,Reduce(("sr_expression",1),3)), (LCLoop,Reduce(("sr_expression",1),3))]]@slrp'a133; val slrp'a131=[[(LCSemi,Reduce(("relation",3),4)), (LCRRange,Reduce(("relation",3),4)),(LCDigits,Reduce(("relation",3),4)), (LCDelta,Reduce(("relation",3),4)),(LCBecomes,Reduce(("relation",3),4)), (LCComma,Reduce(("relation",3),4)),(LCCrd,Reduce(("relation",3),4)), (LCAnd,Reduce(("relation",3),4)),(LCOr,Reduce(("relation",3),4)), (LCXor,Reduce(("relation",3),4)),(LCThen,Reduce(("relation",3),4)), (LCIs,Reduce(("relation",3),4)),(LCGoesTo,Reduce(("relation",3),4)), (LCBar,Reduce(("relation",3),4)),(LCTill,Reduce(("relation",3),4)), (LCLoop,Reduce(("relation",3),4))]]@slrp'a132; val slrp'a130=[[(LCIn,Shift 631)]]@slrp'a131; val slrp'a129=[[(LCSemi,Reduce(("relation",2),3)), (LCRRange,Reduce(("relation",2),3)),(LCDigits,Reduce(("relation",2),3)), (LCDelta,Reduce(("relation",2),3)),(LCBecomes,Reduce(("relation",2),3)), (LCComma,Reduce(("relation",2),3)),(LCCrd,Reduce(("relation",2),3)), (LCAnd,Reduce(("relation",2),3)),(LCOr,Reduce(("relation",2),3)), (LCXor,Reduce(("relation",2),3)),(LCThen,Reduce(("relation",2),3)), (LCIs,Reduce(("relation",2),3)),(LCGoesTo,Reduce(("relation",2),3)), (LCBar,Reduce(("relation",2),3)),(LCTill,Reduce(("relation",2),3)), (LCLoop,Reduce(("relation",2),3))]]@slrp'a130; val slrp'a128=[[(LCSemi,Reduce(("relation",1),3)), (LCRRange,Reduce(("relation",1),3)),(LCDigits,Reduce(("relation",1),3)), (LCDelta,Reduce(("relation",1),3)),(LCBecomes,Reduce(("relation",1),3)), (LCComma,Reduce(("relation",1),3)),(LCCrd,Reduce(("relation",1),3)), (LCAnd,Reduce(("relation",1),3)),(LCOr,Reduce(("relation",1),3)), (LCXor,Reduce(("relation",1),3)),(LCThen,Reduce(("relation",1),3)), (LCIs,Reduce(("relation",1),3)),(LCGoesTo,Reduce(("relation",1),3)), (LCBar,Reduce(("relation",1),3)),(LCTill,Reduce(("relation",1),3)), (LCLoop,Reduce(("relation",1),3))]]@slrp'a129; val slrp'a127=[[(LCSemi,Reduce(("xor_relation",1),3)), (LCRRange,Reduce(("xor_relation",1),3)),(LCDigits,Reduce(("xor_relation",1),3)), (LCDelta,Reduce(("xor_relation",1),3)),(LCBecomes,Reduce(("xor_relation",1),3)), (LCComma,Reduce(("xor_relation",1),3)),(LCCrd,Reduce(("xor_relation",1),3)), (LCThen,Reduce(("xor_relation",1),3)),(LCIs,Reduce(("xor_relation",1),3)), (LCGoesTo,Reduce(("xor_relation",1),3)),(LCBar,Reduce(("xor_relation",1),3)), (LCTill,Reduce(("xor_relation",1),3)),(LCLoop,Reduce(("xor_relation",1),3))]]@slrp'a128; val slrp'a126=[[(LCSemi,Reduce(("or_else_relation",1),4)), (LCRRange,Reduce(("or_else_relation",1),4)), (LCDigits,Reduce(("or_else_relation",1),4)), (LCDelta,Reduce(("or_else_relation",1),4)), (LCBecomes,Reduce(("or_else_relation",1),4)), (LCComma,Reduce(("or_else_relation",1),4)), (LCCrd,Reduce(("or_else_relation",1),4)), (LCThen,Reduce(("or_else_relation",1),4)), (LCIs,Reduce(("or_else_relation",1),4)), (LCGoesTo,Reduce(("or_else_relation",1),4)), (LCBar,Reduce(("or_else_relation",1),4)), (LCTill,Reduce(("or_else_relation",1),4)), (LCLoop,Reduce(("or_else_relation",1),4))]]@slrp'a127; val slrp'a125=[[(LCSemi,Reduce(("or_relation",1),3)), (LCRRange,Reduce(("or_relation",1),3)),(LCDigits,Reduce(("or_relation",1),3)), (LCDelta,Reduce(("or_relation",1),3)),(LCBecomes,Reduce(("or_relation",1),3)), (LCComma,Reduce(("or_relation",1),3)),(LCCrd,Reduce(("or_relation",1),3)), (LCThen,Reduce(("or_relation",1),3)),(LCIs,Reduce(("or_relation",1),3)), (LCGoesTo,Reduce(("or_relation",1),3)),(LCBar,Reduce(("or_relation",1),3)), (LCTill,Reduce(("or_relation",1),3)),(LCLoop,Reduce(("or_relation",1),3))]]@slrp'a126; val slrp'a124=[[(LCSemi,Reduce(("and_then_relation",1),4)), (LCRRange,Reduce(("and_then_relation",1),4)), (LCDigits,Reduce(("and_then_relation",1),4)), (LCDelta,Reduce(("and_then_relation",1),4)), (LCBecomes,Reduce(("and_then_relation",1),4)), (LCComma,Reduce(("and_then_relation",1),4)), (LCCrd,Reduce(("and_then_relation",1),4)), (LCThen,Reduce(("and_then_relation",1),4)), (LCIs,Reduce(("and_then_relation",1),4)), (LCGoesTo,Reduce(("and_then_relation",1),4)), (LCBar,Reduce(("and_then_relation",1),4)), (LCTill,Reduce(("and_then_relation",1),4)), (LCLoop,Reduce(("and_then_relation",1),4))]]@slrp'a125; val slrp'a123=[[(LCSemi,Reduce(("and_relation",1),3)), (LCRRange,Reduce(("and_relation",1),3)),(LCDigits,Reduce(("and_relation",1),3)), (LCDelta,Reduce(("and_relation",1),3)),(LCBecomes,Reduce(("and_relation",1),3)), (LCComma,Reduce(("and_relation",1),3)),(LCCrd,Reduce(("and_relation",1),3)), (LCThen,Reduce(("and_relation",1),3)),(LCIs,Reduce(("and_relation",1),3)), (LCGoesTo,Reduce(("and_relation",1),3)),(LCBar,Reduce(("and_relation",1),3)), (LCTill,Reduce(("and_relation",1),3)),(LCLoop,Reduce(("and_relation",1),3))]]@slrp'a124; val slrp'a122=[[(LCSemi,Reduce(("expression",5),2)), (LCRRange,Reduce(("expression",5),2)),(LCDigits,Reduce(("expression",5),2)), (LCDelta,Reduce(("expression",5),2)),(LCBecomes,Reduce(("expression",5),2)), (LCComma,Reduce(("expression",5),2)),(LCCrd,Reduce(("expression",5),2)), (LCThen,Reduce(("expression",5),2)),(LCIs,Reduce(("expression",5),2)), (LCGoesTo,Reduce(("expression",5),2)),(LCBar,Reduce(("expression",5),2)), (LCTill,Reduce(("expression",5),2)),(LCLoop,Reduce(("expression",5),2))]]@slrp'a123; val slrp'a121=[[(LCSemi,Reduce(("expression",4),2)), (LCRRange,Reduce(("expression",4),2)),(LCDigits,Reduce(("expression",4),2)), (LCDelta,Reduce(("expression",4),2)),(LCBecomes,Reduce(("expression",4),2)), (LCComma,Reduce(("expression",4),2)),(LCCrd,Reduce(("expression",4),2)), (LCThen,Reduce(("expression",4),2)),(LCIs,Reduce(("expression",4),2)), (LCGoesTo,Reduce(("expression",4),2)),(LCBar,Reduce(("expression",4),2)), (LCTill,Reduce(("expression",4),2)),(LCLoop,Reduce(("expression",4),2))]]@slrp'a122; val slrp'a120=[[(LCSemi,Reduce(("expression",3),2)), (LCRRange,Reduce(("expression",3),2)),(LCDigits,Reduce(("expression",3),2)), (LCDelta,Reduce(("expression",3),2)),(LCBecomes,Reduce(("expression",3),2)), (LCComma,Reduce(("expression",3),2)),(LCCrd,Reduce(("expression",3),2)), (LCThen,Reduce(("expression",3),2)),(LCIs,Reduce(("expression",3),2)), (LCGoesTo,Reduce(("expression",3),2)),(LCBar,Reduce(("expression",3),2)), (LCTill,Reduce(("expression",3),2)),(LCLoop,Reduce(("expression",3),2))]]@slrp'a121; val slrp'a119=[[(LCSemi,Reduce(("expression",2),2)), (LCRRange,Reduce(("expression",2),2)),(LCDigits,Reduce(("expression",2),2)), (LCDelta,Reduce(("expression",2),2)),(LCBecomes,Reduce(("expression",2),2)), (LCComma,Reduce(("expression",2),2)),(LCCrd,Reduce(("expression",2),2)), (LCThen,Reduce(("expression",2),2)),(LCIs,Reduce(("expression",2),2)), (LCGoesTo,Reduce(("expression",2),2)),(LCBar,Reduce(("expression",2),2)), (LCTill,Reduce(("expression",2),2)),(LCLoop,Reduce(("expression",2),2))]]@slrp'a120; val slrp'a118=[[(LCSemi,Reduce(("expression",1),2)), (LCRRange,Reduce(("expression",1),2)),(LCDigits,Reduce(("expression",1),2)), (LCDelta,Reduce(("expression",1),2)),(LCBecomes,Reduce(("expression",1),2)), (LCComma,Reduce(("expression",1),2)),(LCCrd,Reduce(("expression",1),2)), (LCThen,Reduce(("expression",1),2)),(LCIs,Reduce(("expression",1),2)), (LCGoesTo,Reduce(("expression",1),2)),(LCBar,Reduce(("expression",1),2)), (LCTill,Reduce(("expression",1),2)),(LCLoop,Reduce(("expression",1),2))]]@slrp'a119; val slrp'a117=[[(LCCrd,Reduce(("positional_association",1),5))]]@slrp'a118; val slrp'a116=[[(LCGoesTo,Shift 644)]]@slrp'a117; val slrp'a115=[[(LCGoesTo,Reduce(("aggregate_choice",0),1)), (LCBar,Reduce(("aggregate_choice",0),1))]]@slrp'a116; val slrp'a114=[[(LCGoesTo,Reduce(("aggregate_choice_list",2),3))]]@slrp'a115; val slrp'a113=[[(LCGoesTo,Reduce(("aggregate_choice_list",0),1))]]@slrp'a114; val slrp'a112=[[(LCCrd,Reduce(("named_association",1),5))]]@slrp'a113; val slrp'a111=[[(LCCrd,Reduce(("component_association",1),1))]]@slrp'a112; val slrp'a110=[[(LCCrd,Reduce(("component_association",0),1))]]@slrp'a111; val slrp'a109=[[(LCBecomes,Reduce(("aggregate",0),3)), (LCSemi,Reduce(("aggregate",0),3)),(LCRRange,Reduce(("aggregate",0),3)), (LCDigits,Reduce(("aggregate",0),3)),(LCDelta,Reduce(("aggregate",0),3)), (LCComma,Reduce(("aggregate",0),3)),(LCCrd,Reduce(("aggregate",0),3)), (LCAnd,Reduce(("aggregate",0),3)),(LCOr,Reduce(("aggregate",0),3)), (LCXor,Reduce(("aggregate",0),3)),(LCGreaterEquals,Reduce(("aggregate",0),3)), (LCGreaterThan,Reduce(("aggregate",0),3)), (LCLessEquals,Reduce(("aggregate",0),3)),(LCLessThan,Reduce(("aggregate",0),3)), (LCNotEquals,Reduce(("aggregate",0),3)),(LCEquals,Reduce(("aggregate",0),3)), (LCIn,Reduce(("aggregate",0),3)),(LCNot,Reduce(("aggregate",0),3)), (LCDotDot,Reduce(("aggregate",0),3)),(LCAmpersand,Reduce(("aggregate",0),3)), (LCMinus,Reduce(("aggregate",0),3)),(LCPlus,Reduce(("aggregate",0),3)), (LCRem,Reduce(("aggregate",0),3)),(LCMod,Reduce(("aggregate",0),3)), (LCDiv,Reduce(("aggregate",0),3)),(LCStar,Reduce(("aggregate",0),3)), (LCStarStar,Reduce(("aggregate",0),3)),(LCThen,Reduce(("aggregate",0),3)), (LCIs,Reduce(("aggregate",0),3)),(LCGoesTo,Reduce(("aggregate",0),3)), (LCBar,Reduce(("aggregate",0),3)),(LCTill,Reduce(("aggregate",0),3)), (LCLoop,Reduce(("aggregate",0),3))]]@slrp'a110; val slrp'a108=[[(LCCrd,Shift 108)]]@slrp'a109; val slrp'a107=[[(LCUse,Reduce(("attribute",1),2)), (LCOrd,Reduce(("attribute",1),2)),(LCDot,Reduce(("attribute",1),2)), (LCPrimedIdentifier,Reduce(("attribute",1),2)), (LCBecomes,Reduce(("attribute",1),2)),(LCSemi,Reduce(("attribute",1),2)), (LCRRange,Reduce(("attribute",1),2)),(LCDigits,Reduce(("attribute",1),2)), (LCDelta,Reduce(("attribute",1),2)),(LCComma,Reduce(("attribute",1),2)), (LCCrd,Reduce(("attribute",1),2)),(LCAnd,Reduce(("attribute",1),2)), (LCOr,Reduce(("attribute",1),2)),(LCXor,Reduce(("attribute",1),2)), (LCGreaterEquals,Reduce(("attribute",1),2)), (LCGreaterThan,Reduce(("attribute",1),2)), (LCLessEquals,Reduce(("attribute",1),2)),(LCLessThan,Reduce(("attribute",1),2)), (LCNotEquals,Reduce(("attribute",1),2)),(LCEquals,Reduce(("attribute",1),2)), (LCIn,Reduce(("attribute",1),2)),(LCNot,Reduce(("attribute",1),2)), (LCDotDot,Reduce(("attribute",1),2)),(LCAmpersand,Reduce(("attribute",1),2)), (LCMinus,Reduce(("attribute",1),2)),(LCPlus,Reduce(("attribute",1),2)), (LCRem,Reduce(("attribute",1),2)),(LCMod,Reduce(("attribute",1),2)), (LCDiv,Reduce(("attribute",1),2)),(LCStar,Reduce(("attribute",1),2)), (LCStarStar,Reduce(("attribute",1),2)),(LCPrime,Reduce(("attribute",1),2)), (LCGrkXi,Reduce(("attribute",1),2)),(LCRenames,Reduce(("attribute",1),2)), (LCAt,Reduce(("attribute",1),2)),(LCThen,Reduce(("attribute",1),2)), (LCIs,Reduce(("attribute",1),2)),(LCGoesTo,Reduce(("attribute",1),2)), (LCBar,Reduce(("attribute",1),2)),(LCTill,Reduce(("attribute",1),2)), (LCLoop,Reduce(("attribute",1),2)),(LCAnnotation,Reduce(("attribute",1),2)), (LCLChevron,Reduce(("attribute",1),2))]]@slrp'a108; val slrp'a106=[[(LCPrimedIdentifier,Shift 106)]]@slrp'a107; val slrp'a105=[[(LCUse,Reduce(("attribute",0),2)), (LCOrd,Reduce(("attribute",0),2)),(LCDot,Reduce(("attribute",0),2)), (LCPrimedIdentifier,Reduce(("attribute",0),2)), (LCBecomes,Reduce(("attribute",0),2)),(LCSemi,Reduce(("attribute",0),2)), (LCRRange,Reduce(("attribute",0),2)),(LCDigits,Reduce(("attribute",0),2)), (LCDelta,Reduce(("attribute",0),2)),(LCComma,Reduce(("attribute",0),2)), (LCCrd,Reduce(("attribute",0),2)),(LCAnd,Reduce(("attribute",0),2)), (LCOr,Reduce(("attribute",0),2)),(LCXor,Reduce(("attribute",0),2)), (LCGreaterEquals,Reduce(("attribute",0),2)), (LCGreaterThan,Reduce(("attribute",0),2)), (LCLessEquals,Reduce(("attribute",0),2)),(LCLessThan,Reduce(("attribute",0),2)), (LCNotEquals,Reduce(("attribute",0),2)),(LCEquals,Reduce(("attribute",0),2)), (LCIn,Reduce(("attribute",0),2)),(LCNot,Reduce(("attribute",0),2)), (LCDotDot,Reduce(("attribute",0),2)),(LCAmpersand,Reduce(("attribute",0),2)), (LCMinus,Reduce(("attribute",0),2)),(LCPlus,Reduce(("attribute",0),2)), (LCRem,Reduce(("attribute",0),2)),(LCMod,Reduce(("attribute",0),2)), (LCDiv,Reduce(("attribute",0),2)),(LCStar,Reduce(("attribute",0),2)), (LCStarStar,Reduce(("attribute",0),2)),(LCPrime,Reduce(("attribute",0),2)), (LCGrkXi,Reduce(("attribute",0),2)),(LCRenames,Reduce(("attribute",0),2)), (LCAt,Reduce(("attribute",0),2)),(LCThen,Reduce(("attribute",0),2)), (LCIs,Reduce(("attribute",0),2)),(LCGoesTo,Reduce(("attribute",0),2)), (LCBar,Reduce(("attribute",0),2)),(LCTill,Reduce(("attribute",0),2)), (LCLoop,Reduce(("attribute",0),2)),(LCAnnotation,Reduce(("attribute",0),2)), (LCLChevron,Reduce(("attribute",0),2))]]@slrp'a106; val slrp'a104=[[(LCComma,Reduce(("expression_list",1),3)), (LCCrd,Reduce(("expression_list",1),3))]]@slrp'a105; val slrp'a103=[[(LCOrd,Reduce(("selector",0),1)), (LCDot,Reduce(("selector",0),1)),(LCPrimedIdentifier,Reduce(("selector",0),1)), (LCBecomes,Reduce(("selector",0),1)),(LCSemi,Reduce(("selector",0),1)), (LCRRange,Reduce(("selector",0),1)),(LCDigits,Reduce(("selector",0),1)), (LCDelta,Reduce(("selector",0),1)),(LCComma,Reduce(("selector",0),1)), (LCCrd,Reduce(("selector",0),1)),(LCAnd,Reduce(("selector",0),1)), (LCOr,Reduce(("selector",0),1)),(LCXor,Reduce(("selector",0),1)), (LCGreaterEquals,Reduce(("selector",0),1)), (LCGreaterThan,Reduce(("selector",0),1)),(LCLessEquals,Reduce(("selector",0),1)) ,(LCLessThan,Reduce(("selector",0),1)),(LCNotEquals,Reduce(("selector",0),1)), (LCEquals,Reduce(("selector",0),1)),(LCIn,Reduce(("selector",0),1)), (LCNot,Reduce(("selector",0),1)),(LCDotDot,Reduce(("selector",0),1)), (LCAmpersand,Reduce(("selector",0),1)),(LCMinus,Reduce(("selector",0),1)), (LCPlus,Reduce(("selector",0),1)),(LCRem,Reduce(("selector",0),1)), (LCMod,Reduce(("selector",0),1)),(LCDiv,Reduce(("selector",0),1)), (LCStar,Reduce(("selector",0),1)),(LCStarStar,Reduce(("selector",0),1)), (LCPrime,Reduce(("selector",0),1)),(LCGrkXi,Reduce(("selector",0),1)), (LCRenames,Reduce(("selector",0),1)),(LCAt,Reduce(("selector",0),1)), (LCThen,Reduce(("selector",0),1)),(LCIs,Reduce(("selector",0),1)), (LCGoesTo,Reduce(("selector",0),1)),(LCBar,Reduce(("selector",0),1)), (LCTill,Reduce(("selector",0),1)),(LCLoop,Reduce(("selector",0),1)), (LCAnnotation,Reduce(("selector",0),1)),(LCLChevron,Reduce(("selector",0),1))]]@slrp'a104; val slrp'a102=[[(LCOrd,Reduce(("selected_component",0),3)), (LCDot,Reduce(("selected_component",0),3)), (LCPrimedIdentifier,Reduce(("selected_component",0),3)), (LCBecomes,Reduce(("selected_component",0),3)), (LCSemi,Reduce(("selected_component",0),3)), (LCRRange,Reduce(("selected_component",0),3)), (LCDigits,Reduce(("selected_component",0),3)), (LCDelta,Reduce(("selected_component",0),3)), (LCComma,Reduce(("selected_component",0),3)), (LCCrd,Reduce(("selected_component",0),3)), (LCAnd,Reduce(("selected_component",0),3)), (LCOr,Reduce(("selected_component",0),3)), (LCXor,Reduce(("selected_component",0),3)), (LCGreaterEquals,Reduce(("selected_component",0),3)), (LCGreaterThan,Reduce(("selected_component",0),3)), (LCLessEquals,Reduce(("selected_component",0),3)), (LCLessThan,Reduce(("selected_component",0),3)), (LCNotEquals,Reduce(("selected_component",0),3)), (LCEquals,Reduce(("selected_component",0),3)), (LCIn,Reduce(("selected_component",0),3)), (LCNot,Reduce(("selected_component",0),3)), (LCDotDot,Reduce(("selected_component",0),3)), (LCAmpersand,Reduce(("selected_component",0),3)), (LCMinus,Reduce(("selected_component",0),3)), (LCPlus,Reduce(("selected_component",0),3)), (LCRem,Reduce(("selected_component",0),3)), (LCMod,Reduce(("selected_component",0),3)), (LCDiv,Reduce(("selected_component",0),3)), (LCStar,Reduce(("selected_component",0),3)), (LCStarStar,Reduce(("selected_component",0),3)), (LCPrime,Reduce(("selected_component",0),3)), (LCGrkXi,Reduce(("selected_component",0),3)), (LCRenames,Reduce(("selected_component",0),3)), (LCAt,Reduce(("selected_component",0),3)), (LCThen,Reduce(("selected_component",0),3)), (LCIs,Reduce(("selected_component",0),3)), (LCGoesTo,Reduce(("selected_component",0),3)), (LCBar,Reduce(("selected_component",0),3)), (LCTill,Reduce(("selected_component",0),3)), (LCLoop,Reduce(("selected_component",0),3)), (LCAnnotation,Reduce(("selected_component",0),3)), (LCLChevron,Reduce(("selected_component",0),3))]]@slrp'a103; val slrp'a101=[[(LCOrd,Reduce(("indexed_component",0),2)), (LCDot,Reduce(("indexed_component",0),2)), (LCPrimedIdentifier,Reduce(("indexed_component",0),2)), (LCBecomes,Reduce(("indexed_component",0),2)), (LCSemi,Reduce(("indexed_component",0),2)), (LCRRange,Reduce(("indexed_component",0),2)), (LCDigits,Reduce(("indexed_component",0),2)), (LCDelta,Reduce(("indexed_component",0),2)), (LCComma,Reduce(("indexed_component",0),2)), (LCCrd,Reduce(("indexed_component",0),2)), (LCAnd,Reduce(("indexed_component",0),2)), (LCOr,Reduce(("indexed_component",0),2)), (LCXor,Reduce(("indexed_component",0),2)), (LCGreaterEquals,Reduce(("indexed_component",0),2)), (LCGreaterThan,Reduce(("indexed_component",0),2)), (LCLessEquals,Reduce(("indexed_component",0),2)), (LCLessThan,Reduce(("indexed_component",0),2)), (LCNotEquals,Reduce(("indexed_component",0),2)), (LCEquals,Reduce(("indexed_component",0),2)), (LCIn,Reduce(("indexed_component",0),2)), (LCNot,Reduce(("indexed_component",0),2)), (LCDotDot,Reduce(("indexed_component",0),2)), (LCAmpersand,Reduce(("indexed_component",0),2)), (LCMinus,Reduce(("indexed_component",0),2)), (LCPlus,Reduce(("indexed_component",0),2)), (LCRem,Reduce(("indexed_component",0),2)), (LCMod,Reduce(("indexed_component",0),2)), (LCDiv,Reduce(("indexed_component",0),2)), (LCStar,Reduce(("indexed_component",0),2)), (LCStarStar,Reduce(("indexed_component",0),2)), (LCPrime,Reduce(("indexed_component",0),2)), (LCGrkXi,Reduce(("indexed_component",0),2)), (LCRenames,Reduce(("indexed_component",0),2)), (LCAt,Reduce(("indexed_component",0),2)), (LCThen,Reduce(("indexed_component",0),2)), (LCIs,Reduce(("indexed_component",0),2)), (LCGoesTo,Reduce(("indexed_component",0),2)), (LCBar,Reduce(("indexed_component",0),2)), (LCTill,Reduce(("indexed_component",0),2)), (LCLoop,Reduce(("indexed_component",0),2)), (LCAnnotation,Reduce(("indexed_component",0),2)), (LCLChevron,Reduce(("indexed_component",0),2))]]@slrp'a102; val slrp'a100=[[(LCOrd,Reduce(("name",3),1)),(LCDot,Reduce(("name",3),1)), (LCPrimedIdentifier,Reduce(("name",3),1)),(LCBecomes,Reduce(("name",3),1)), (LCSemi,Reduce(("name",3),1)),(LCRRange,Reduce(("name",3),1)), (LCDigits,Reduce(("name",3),1)),(LCDelta,Reduce(("name",3),1)), (LCComma,Reduce(("name",3),1)),(LCCrd,Reduce(("name",3),1)), (LCAnd,Reduce(("name",3),1)),(LCOr,Reduce(("name",3),1)), (LCXor,Reduce(("name",3),1)),(LCGreaterEquals,Reduce(("name",3),1)), (LCGreaterThan,Reduce(("name",3),1)),(LCLessEquals,Reduce(("name",3),1)), (LCLessThan,Reduce(("name",3),1)),(LCNotEquals,Reduce(("name",3),1)), (LCEquals,Reduce(("name",3),1)),(LCIn,Reduce(("name",3),1)), (LCNot,Reduce(("name",3),1)),(LCDotDot,Reduce(("name",3),1)), (LCAmpersand,Reduce(("name",3),1)),(LCMinus,Reduce(("name",3),1)), (LCPlus,Reduce(("name",3),1)),(LCRem,Reduce(("name",3),1)), (LCMod,Reduce(("name",3),1)),(LCDiv,Reduce(("name",3),1)), (LCStar,Reduce(("name",3),1)),(LCStarStar,Reduce(("name",3),1)), (LCPrime,Reduce(("name",3),1)),(LCGrkXi,Reduce(("name",3),1)), (LCRenames,Reduce(("name",3),1)),(LCAt,Reduce(("name",3),1)), (LCThen,Reduce(("name",3),1)),(LCIs,Reduce(("name",3),1)), (LCGoesTo,Reduce(("name",3),1)),(LCBar,Reduce(("name",3),1)), (LCTill,Reduce(("name",3),1)),(LCLoop,Reduce(("name",3),1)), (LCAnnotation,Reduce(("name",3),1)),(LCLChevron,Reduce(("name",3),1))]]@slrp'a101; val slrp'a99=[[(LCOrd,Reduce(("name",2),1)),(LCDot,Reduce(("name",2),1)), (LCPrimedIdentifier,Reduce(("name",2),1)),(LCBecomes,Reduce(("name",2),1)), (LCSemi,Reduce(("name",2),1)),(LCRRange,Reduce(("name",2),1)), (LCDigits,Reduce(("name",2),1)),(LCDelta,Reduce(("name",2),1)), (LCComma,Reduce(("name",2),1)),(LCCrd,Reduce(("name",2),1)), (LCAnd,Reduce(("name",2),1)),(LCOr,Reduce(("name",2),1)), (LCXor,Reduce(("name",2),1)),(LCGreaterEquals,Reduce(("name",2),1)), (LCGreaterThan,Reduce(("name",2),1)),(LCLessEquals,Reduce(("name",2),1)), (LCLessThan,Reduce(("name",2),1)),(LCNotEquals,Reduce(("name",2),1)), (LCEquals,Reduce(("name",2),1)),(LCIn,Reduce(("name",2),1)), (LCNot,Reduce(("name",2),1)),(LCDotDot,Reduce(("name",2),1)), (LCAmpersand,Reduce(("name",2),1)),(LCMinus,Reduce(("name",2),1)), (LCPlus,Reduce(("name",2),1)),(LCRem,Reduce(("name",2),1)), (LCMod,Reduce(("name",2),1)),(LCDiv,Reduce(("name",2),1)), (LCStar,Reduce(("name",2),1)),(LCStarStar,Reduce(("name",2),1)), (LCPrime,Reduce(("name",2),1)),(LCGrkXi,Reduce(("name",2),1)), (LCRenames,Reduce(("name",2),1)),(LCAt,Reduce(("name",2),1)), (LCThen,Reduce(("name",2),1)),(LCIs,Reduce(("name",2),1)), (LCGoesTo,Reduce(("name",2),1)),(LCBar,Reduce(("name",2),1)), (LCTill,Reduce(("name",2),1)),(LCLoop,Reduce(("name",2),1)), (LCAnnotation,Reduce(("name",2),1)),(LCLChevron,Reduce(("name",2),1))]]@slrp'a100; val slrp'a98=[[(LCOrd,Reduce(("name",1),1)),(LCDot,Reduce(("name",1),1)), (LCPrimedIdentifier,Reduce(("name",1),1)),(LCBecomes,Reduce(("name",1),1)), (LCSemi,Reduce(("name",1),1)),(LCRRange,Reduce(("name",1),1)), (LCDigits,Reduce(("name",1),1)),(LCDelta,Reduce(("name",1),1)), (LCComma,Reduce(("name",1),1)),(LCCrd,Reduce(("name",1),1)), (LCAnd,Reduce(("name",1),1)),(LCOr,Reduce(("name",1),1)), (LCXor,Reduce(("name",1),1)),(LCGreaterEquals,Reduce(("name",1),1)), (LCGreaterThan,Reduce(("name",1),1)),(LCLessEquals,Reduce(("name",1),1)), (LCLessThan,Reduce(("name",1),1)),(LCNotEquals,Reduce(("name",1),1)), (LCEquals,Reduce(("name",1),1)),(LCIn,Reduce(("name",1),1)), (LCNot,Reduce(("name",1),1)),(LCDotDot,Reduce(("name",1),1)), (LCAmpersand,Reduce(("name",1),1)),(LCMinus,Reduce(("name",1),1)), (LCPlus,Reduce(("name",1),1)),(LCRem,Reduce(("name",1),1)), (LCMod,Reduce(("name",1),1)),(LCDiv,Reduce(("name",1),1)), (LCStar,Reduce(("name",1),1)),(LCStarStar,Reduce(("name",1),1)), (LCPrime,Reduce(("name",1),1)),(LCGrkXi,Reduce(("name",1),1)), (LCRenames,Reduce(("name",1),1)),(LCAt,Reduce(("name",1),1)), (LCThen,Reduce(("name",1),1)),(LCIs,Reduce(("name",1),1)), (LCGoesTo,Reduce(("name",1),1)),(LCBar,Reduce(("name",1),1)), (LCTill,Reduce(("name",1),1)),(LCLoop,Reduce(("name",1),1)), (LCAnnotation,Reduce(("name",1),1)),(LCLChevron,Reduce(("name",1),1))]]@slrp'a99; val slrp'a97=[[(LCOrd,Reduce(("name",0),1)),(LCDot,Reduce(("name",0),1)), (LCPrimedIdentifier,Reduce(("name",0),1)),(LCBecomes,Reduce(("name",0),1)), (LCSemi,Reduce(("name",0),1)),(LCRRange,Reduce(("name",0),1)), (LCDigits,Reduce(("name",0),1)),(LCDelta,Reduce(("name",0),1)), (LCComma,Reduce(("name",0),1)),(LCCrd,Reduce(("name",0),1)), (LCAnd,Reduce(("name",0),1)),(LCOr,Reduce(("name",0),1)), (LCXor,Reduce(("name",0),1)),(LCGreaterEquals,Reduce(("name",0),1)), (LCGreaterThan,Reduce(("name",0),1)),(LCLessEquals,Reduce(("name",0),1)), (LCLessThan,Reduce(("name",0),1)),(LCNotEquals,Reduce(("name",0),1)), (LCEquals,Reduce(("name",0),1)),(LCIn,Reduce(("name",0),1)), (LCNot,Reduce(("name",0),1)),(LCDotDot,Reduce(("name",0),1)), (LCAmpersand,Reduce(("name",0),1)),(LCMinus,Reduce(("name",0),1)), (LCPlus,Reduce(("name",0),1)),(LCRem,Reduce(("name",0),1)), (LCMod,Reduce(("name",0),1)),(LCDiv,Reduce(("name",0),1)), (LCStar,Reduce(("name",0),1)),(LCStarStar,Reduce(("name",0),1)), (LCPrime,Reduce(("name",0),1)),(LCGrkXi,Reduce(("name",0),1)), (LCRenames,Reduce(("name",0),1)),(LCAt,Reduce(("name",0),1)), (LCThen,Reduce(("name",0),1)),(LCIs,Reduce(("name",0),1)), (LCGoesTo,Reduce(("name",0),1)),(LCBar,Reduce(("name",0),1)), (LCTill,Reduce(("name",0),1)),(LCLoop,Reduce(("name",0),1)), (LCAnnotation,Reduce(("name",0),1)),(LCLChevron,Reduce(("name",0),1))]]@slrp'a98; val slrp'a96=[[(LCEos,Reduce(("proper_body",0),1)), (LCLChevron,Reduce(("proper_body",0),1)), (LCFunction,Reduce(("proper_body",0),1)),(LCPackage,Reduce(("proper_body",0),1)) ,(LCIdentifier,Reduce(("proper_body",0),1)), (LCAnnotation,Reduce(("proper_body",0),1)), (LCSubType,Reduce(("proper_body",0),1)),(LCPragma,Reduce(("proper_body",0),1)), (LCProcedure,Reduce(("proper_body",0),1)),(LCType,Reduce(("proper_body",0),1)), (LCFor,Reduce(("proper_body",0),1)),(LCUse,Reduce(("proper_body",0),1)), (LCReferences,Reduce(("proper_body",0),1)), (LCSeparate,Reduce(("proper_body",0),1)),(LCWith,Reduce(("proper_body",0),1)), (LCBegin,Reduce(("proper_body",0),1)),(LCEnd,Reduce(("proper_body",0),1))]]@slrp'a97; val slrp'a95=[[(LCEos,Reduce(("body",1),1)),(LCLChevron,Reduce(("body",1),1)), (LCFunction,Reduce(("body",1),1)),(LCPackage,Reduce(("body",1),1)), (LCIdentifier,Reduce(("body",1),1)),(LCAnnotation,Reduce(("body",1),1)), (LCSubType,Reduce(("body",1),1)),(LCPragma,Reduce(("body",1),1)), (LCProcedure,Reduce(("body",1),1)),(LCType,Reduce(("body",1),1)), (LCFor,Reduce(("body",1),1)),(LCUse,Reduce(("body",1),1)), (LCBegin,Reduce(("body",1),1)),(LCEnd,Reduce(("body",1),1))]]@slrp'a96; val slrp'a94=[[(LCEos,Reduce(("body",0),1)),(LCLChevron,Reduce(("body",0),1)), (LCFunction,Reduce(("body",0),1)),(LCPackage,Reduce(("body",0),1)), (LCIdentifier,Reduce(("body",0),1)),(LCAnnotation,Reduce(("body",0),1)), (LCSubType,Reduce(("body",0),1)),(LCPragma,Reduce(("body",0),1)), (LCProcedure,Reduce(("body",0),1)),(LCType,Reduce(("body",0),1)), (LCFor,Reduce(("body",0),1)),(LCUse,Reduce(("body",0),1)), (LCBegin,Reduce(("body",0),1)),(LCEnd,Reduce(("body",0),1))]]@slrp'a95; val slrp'a93=[[(LCEos,Reduce(("basic_declarative_item",2),1)), (LCLChevron,Reduce(("basic_declarative_item",2),1)), (LCFunction,Reduce(("basic_declarative_item",2),1)), (LCPackage,Reduce(("basic_declarative_item",2),1)), (LCIdentifier,Reduce(("basic_declarative_item",2),1)), (LCAnnotation,Reduce(("basic_declarative_item",2),1)), (LCSubType,Reduce(("basic_declarative_item",2),1)), (LCPragma,Reduce(("basic_declarative_item",2),1)), (LCProcedure,Reduce(("basic_declarative_item",2),1)), (LCType,Reduce(("basic_declarative_item",2),1)), (LCFor,Reduce(("basic_declarative_item",2),1)), (LCUse,Reduce(("basic_declarative_item",2),1)), (LCEnd,Reduce(("basic_declarative_item",2),1)), (LCPrivate,Reduce(("basic_declarative_item",2),1)), (LCAuxiliary,Reduce(("basic_declarative_item",2),1)), (LCBegin,Reduce(("basic_declarative_item",2),1))]]@slrp'a94; val slrp'a92=[[(LCEos,Reduce(("basic_declarative_item",1),1)), (LCLChevron,Reduce(("basic_declarative_item",1),1)), (LCFunction,Reduce(("basic_declarative_item",1),1)), (LCPackage,Reduce(("basic_declarative_item",1),1)), (LCIdentifier,Reduce(("basic_declarative_item",1),1)), (LCAnnotation,Reduce(("basic_declarative_item",1),1)), (LCSubType,Reduce(("basic_declarative_item",1),1)), (LCPragma,Reduce(("basic_declarative_item",1),1)), (LCProcedure,Reduce(("basic_declarative_item",1),1)), (LCType,Reduce(("basic_declarative_item",1),1)), (LCFor,Reduce(("basic_declarative_item",1),1)), (LCUse,Reduce(("basic_declarative_item",1),1)), (LCEnd,Reduce(("basic_declarative_item",1),1)), (LCPrivate,Reduce(("basic_declarative_item",1),1)), (LCAuxiliary,Reduce(("basic_declarative_item",1),1)), (LCBegin,Reduce(("basic_declarative_item",1),1))]]@slrp'a93; val slrp'a91=[[(LCEos,Reduce(("basic_declarative_item",0),1)), (LCLChevron,Reduce(("basic_declarative_item",0),1)), (LCFunction,Reduce(("basic_declarative_item",0),1)), (LCPackage,Reduce(("basic_declarative_item",0),1)), (LCIdentifier,Reduce(("basic_declarative_item",0),1)), (LCAnnotation,Reduce(("basic_declarative_item",0),1)), (LCSubType,Reduce(("basic_declarative_item",0),1)), (LCPragma,Reduce(("basic_declarative_item",0),1)), (LCProcedure,Reduce(("basic_declarative_item",0),1)), (LCType,Reduce(("basic_declarative_item",0),1)), (LCFor,Reduce(("basic_declarative_item",0),1)), (LCUse,Reduce(("basic_declarative_item",0),1)), (LCEnd,Reduce(("basic_declarative_item",0),1)), (LCPrivate,Reduce(("basic_declarative_item",0),1)), (LCAuxiliary,Reduce(("basic_declarative_item",0),1)), (LCBegin,Reduce(("basic_declarative_item",0),1))]]@slrp'a92; val slrp'a90=[[(LCEos,Reduce(("dec",4),1)),(LCLChevron,Reduce(("dec",4),1)), (LCFunction,Reduce(("dec",4),1)),(LCPackage,Reduce(("dec",4),1)), (LCIdentifier,Reduce(("dec",4),1)),(LCAnnotation,Reduce(("dec",4),1)), (LCSubType,Reduce(("dec",4),1)),(LCPragma,Reduce(("dec",4),1)), (LCProcedure,Reduce(("dec",4),1)),(LCType,Reduce(("dec",4),1)), (LCFor,Reduce(("dec",4),1)),(LCUse,Reduce(("dec",4),1)), (LCBegin,Reduce(("dec",4),1)),(LCEnd,Reduce(("dec",4),1))]]@slrp'a91; val slrp'a89=[[(LCEos,Reduce(("dec",3),1)),(LCLChevron,Reduce(("dec",3),1)), (LCFunction,Reduce(("dec",3),1)),(LCPackage,Reduce(("dec",3),1)), (LCIdentifier,Reduce(("dec",3),1)),(LCAnnotation,Reduce(("dec",3),1)), (LCSubType,Reduce(("dec",3),1)),(LCPragma,Reduce(("dec",3),1)), (LCProcedure,Reduce(("dec",3),1)),(LCType,Reduce(("dec",3),1)), (LCFor,Reduce(("dec",3),1)),(LCUse,Reduce(("dec",3),1)), (LCBegin,Reduce(("dec",3),1)),(LCEnd,Reduce(("dec",3),1))]]@slrp'a90; val slrp'a88=[[(LCEos,Reduce(("dec",2),1)),(LCLChevron,Reduce(("dec",2),1)), (LCFunction,Reduce(("dec",2),1)),(LCPackage,Reduce(("dec",2),1)), (LCIdentifier,Reduce(("dec",2),1)),(LCAnnotation,Reduce(("dec",2),1)), (LCSubType,Reduce(("dec",2),1)),(LCPragma,Reduce(("dec",2),1)), (LCProcedure,Reduce(("dec",2),1)),(LCType,Reduce(("dec",2),1)), (LCFor,Reduce(("dec",2),1)),(LCUse,Reduce(("dec",2),1)), (LCBegin,Reduce(("dec",2),1)),(LCEnd,Reduce(("dec",2),1))]]@slrp'a89; val slrp'a87=[[(LCEos,Reduce(("dec",1),1)),(LCLChevron,Reduce(("dec",1),1)), (LCFunction,Reduce(("dec",1),1)),(LCPackage,Reduce(("dec",1),1)), (LCIdentifier,Reduce(("dec",1),1)),(LCAnnotation,Reduce(("dec",1),1)), (LCSubType,Reduce(("dec",1),1)),(LCPragma,Reduce(("dec",1),1)), (LCProcedure,Reduce(("dec",1),1)),(LCType,Reduce(("dec",1),1)), (LCFor,Reduce(("dec",1),1)),(LCUse,Reduce(("dec",1),1)), (LCBegin,Reduce(("dec",1),1)),(LCEnd,Reduce(("dec",1),1))]]@slrp'a88; val slrp'a86=[[(LCEos,Reduce(("dec",0),1)),(LCLChevron,Reduce(("dec",0),1)), (LCFunction,Reduce(("dec",0),1)),(LCPackage,Reduce(("dec",0),1)), (LCIdentifier,Reduce(("dec",0),1)),(LCAnnotation,Reduce(("dec",0),1)), (LCSubType,Reduce(("dec",0),1)),(LCPragma,Reduce(("dec",0),1)), (LCProcedure,Reduce(("dec",0),1)),(LCType,Reduce(("dec",0),1)), (LCFor,Reduce(("dec",0),1)),(LCUse,Reduce(("dec",0),1)), (LCBegin,Reduce(("dec",0),1)),(LCEnd,Reduce(("dec",0),1))]]@slrp'a87; val slrp'a85=[[(LCEos,Reduce(("declarative_part",1),2)), (LCBegin,Reduce(("declarative_part",1),2)), (LCEnd,Reduce(("declarative_part",1),2))]]@slrp'a86; val slrp'a84=[[(LCEnd,Reduce(("component_declaration",0),4)), (LCIdentifier,Reduce(("component_declaration",0),4))]]@slrp'a85; val slrp'a83=[[(LCSemi,Shift 83)]]@slrp'a84; val slrp'a82=[[(LCColon,Shift 660)]]@slrp'a83; val slrp'a81=[[(LCEnd,Reduce(("component_list",1),2))]]@slrp'a82; val slrp'a80=[[(LCSemi,Reduce(("record_type_definition",0),4))]]@slrp'a81; val slrp'a79=[[(LCRecord,Shift 79)]]@slrp'a80; val slrp'a78=[[(LCEnd,Shift 78)]]@slrp'a79; val slrp'a77=[[(LCGoesTo,Reduce(("discrete_range",0),2)), (LCBar,Reduce(("discrete_range",0),2)),(LCTill,Reduce(("discrete_range",0),2)), (LCLoop,Reduce(("discrete_range",0),2))]]@slrp'a78; val slrp'a76=[[(LCCrd,Reduce(("discrete_range_list",1),3))]]@slrp'a77; val slrp'a75=[[(LCOf,Reduce(("index_constraint",0),3))]]@slrp'a76; val slrp'a74=[[(LCCrd,Shift 74)]]@slrp'a75; val slrp'a73=[[(LCCrd,Reduce(("index_subtype_definition",0),3)), (LCComma,Reduce(("index_subtype_definition",0),3))]]@slrp'a74; val slrp'a72=[[(LCLessGreat,Shift 72)]]@slrp'a73; val slrp'a71=[[(LCRRange,Shift 71)]]@slrp'a72; val slrp'a70=[[(LCCrd,Reduce(("index_subtype_definition_list",1),3))]]@slrp'a71; val slrp'a69=[[(LCSemi,Reduce(("constrained_array_definition",0),4))]]@slrp'a70; val slrp'a68=[[(LCOf,Shift 659)]]@slrp'a69; val slrp'a67=[[(LCSemi,Reduce(("unconstrained_array_definition",0),6))]]@slrp'a68; val slrp'a66=[[(LCOf,Shift 658)]]@slrp'a67; val slrp'a65=[[(LCCrd,Shift 65)]]@slrp'a66; val slrp'a64=[[(LCSemi,Reduce(("array_type_definition",1),1))]]@slrp'a65; val slrp'a63=[[(LCSemi,Reduce(("array_type_definition",0),1))]]@slrp'a64; val slrp'a62=[[(LCBecomes,Reduce(("fixed_accuracy_definition",0),2)), (LCSemi,Reduce(("fixed_accuracy_definition",0),2)), (LCRRange,Reduce(("fixed_accuracy_definition",0),2)), (LCCrd,Reduce(("fixed_accuracy_definition",0),2)), (LCComma,Reduce(("fixed_accuracy_definition",0),2))]]@slrp'a63; val slrp'a61=[[(LCBecomes,Reduce(("fixed_point_constraint",1),2)), (LCSemi,Reduce(("fixed_point_constraint",1),2)), (LCCrd,Reduce(("fixed_point_constraint",1),2)), (LCComma,Reduce(("fixed_point_constraint",1),2))]]@slrp'a62; val slrp'a60=[[(LCBecomes,Reduce(("floating_accuracy_definition",0),2)), (LCSemi,Reduce(("floating_accuracy_definition",0),2)), (LCRRange,Reduce(("floating_accuracy_definition",0),2)), (LCCrd,Reduce(("floating_accuracy_definition",0),2)), (LCComma,Reduce(("floating_accuracy_definition",0),2))]]@slrp'a61; val slrp'a59=[[(LCBecomes,Reduce(("floating_point_constraint",1),2)), (LCSemi,Reduce(("floating_point_constraint",1),2)), (LCCrd,Reduce(("floating_point_constraint",1),2)), (LCComma,Reduce(("floating_point_constraint",1),2))]]@slrp'a60; val slrp'a58=[[(LCSemi,Reduce(("real_type_definition",1),1))]]@slrp'a59; val slrp'a57=[[(LCSemi,Reduce(("real_type_definition",0),1))]]@slrp'a58; val slrp'a56=[[(LCSemi,Reduce(("integer_type_definition",0),1))]]@slrp'a57; val slrp'a55=[[(LCSemi,Reduce(("enumeration_type_definition",0),3))]]@slrp'a56; val slrp'a54=[[(LCCrd,Shift 54)]]@slrp'a55; val slrp'a53=[[(LCBecomes,Reduce(("range_constraint",0),2)), (LCSemi,Reduce(("range_constraint",0),2)), (LCCrd,Reduce(("range_constraint",0),2)), (LCComma,Reduce(("range_constraint",0),2)), (LCGoesTo,Reduce(("range_constraint",0),2)), (LCBar,Reduce(("range_constraint",0),2)), (LCTill,Reduce(("range_constraint",0),2)), (LCLoop,Reduce(("range_constraint",0),2))]]@slrp'a54; val slrp'a52=[[(LCBecomes,Reduce(("constraint",2),1)), (LCSemi,Reduce(("constraint",2),1)),(LCCrd,Reduce(("constraint",2),1)), (LCComma,Reduce(("constraint",2),1))]]@slrp'a53; val slrp'a51=[[(LCBecomes,Reduce(("constraint",1),1)), (LCSemi,Reduce(("constraint",1),1)),(LCCrd,Reduce(("constraint",1),1)), (LCComma,Reduce(("constraint",1),1))]]@slrp'a52; val slrp'a50=[[(LCBecomes,Reduce(("constraint",0),1)), (LCSemi,Reduce(("constraint",0),1)),(LCCrd,Reduce(("constraint",0),1)), (LCComma,Reduce(("constraint",0),1))]]@slrp'a51; val slrp'a49=[[(LCBecomes,Reduce(("subtype_indication",0),2)), (LCSemi,Reduce(("subtype_indication",0),2)), (LCCrd,Reduce(("subtype_indication",0),2)), (LCComma,Reduce(("subtype_indication",0),2))]]@slrp'a50; val slrp'a48=[[(LCEos,Reduce(("subtype_declaration",0),5)), (LCLChevron,Reduce(("subtype_declaration",0),5)), (LCFunction,Reduce(("subtype_declaration",0),5)), (LCPackage,Reduce(("subtype_declaration",0),5)), (LCIdentifier,Reduce(("subtype_declaration",0),5)), (LCAnnotation,Reduce(("subtype_declaration",0),5)), (LCSubType,Reduce(("subtype_declaration",0),5)), (LCPragma,Reduce(("subtype_declaration",0),5)), (LCProcedure,Reduce(("subtype_declaration",0),5)), (LCType,Reduce(("subtype_declaration",0),5)), (LCFor,Reduce(("subtype_declaration",0),5)), (LCUse,Reduce(("subtype_declaration",0),5)), (LCImplement,Reduce(("subtype_declaration",0),5)), (LCEnd,Reduce(("subtype_declaration",0),5)), (LCPrivate,Reduce(("subtype_declaration",0),5)), (LCAuxiliary,Reduce(("subtype_declaration",0),5)), (LCBegin,Reduce(("subtype_declaration",0),5))]]@slrp'a49; val slrp'a47=[[(LCSemi,Shift 47)]]@slrp'a48; val slrp'a46=[[(LCIs,Shift 657)]]@slrp'a47; val slrp'a45=[[(LCIdentifier,Shift 45)]]@slrp'a46; val slrp'a44=[[(LCSemi,Reduce(("type_definition",4),1))]]@slrp'a45; val slrp'a43=[[(LCSemi,Reduce(("type_definition",3),1))]]@slrp'a44; val slrp'a42=[[(LCSemi,Reduce(("type_definition",2),1))]]@slrp'a43; val slrp'a41=[[(LCSemi,Reduce(("type_definition",1),1))]]@slrp'a42; val slrp'a40=[[(LCSemi,Reduce(("type_definition",0),1))]]@slrp'a41; val slrp'a39=[[(LCEos,Reduce(("full_type_declaration",1),6)), (LCLChevron,Reduce(("full_type_declaration",1),6)), (LCFunction,Reduce(("full_type_declaration",1),6)), (LCPackage,Reduce(("full_type_declaration",1),6)), (LCIdentifier,Reduce(("full_type_declaration",1),6)), (LCAnnotation,Reduce(("full_type_declaration",1),6)), (LCSubType,Reduce(("full_type_declaration",1),6)), (LCPragma,Reduce(("full_type_declaration",1),6)), (LCProcedure,Reduce(("full_type_declaration",1),6)), (LCType,Reduce(("full_type_declaration",1),6)), (LCFor,Reduce(("full_type_declaration",1),6)), (LCUse,Reduce(("full_type_declaration",1),6)), (LCImplement,Reduce(("full_type_declaration",1),6)), (LCEnd,Reduce(("full_type_declaration",1),6)), (LCPrivate,Reduce(("full_type_declaration",1),6)), (LCAuxiliary,Reduce(("full_type_declaration",1),6)), (LCBegin,Reduce(("full_type_declaration",1),6))]]@slrp'a40; val slrp'a38=[[(LCSemi,Shift 38)]]@slrp'a39; val slrp'a37=[[(LCEos,Reduce(("full_type_declaration",0),5)), (LCLChevron,Reduce(("full_type_declaration",0),5)), (LCFunction,Reduce(("full_type_declaration",0),5)), (LCPackage,Reduce(("full_type_declaration",0),5)), (LCIdentifier,Reduce(("full_type_declaration",0),5)), (LCAnnotation,Reduce(("full_type_declaration",0),5)), (LCSubType,Reduce(("full_type_declaration",0),5)), (LCPragma,Reduce(("full_type_declaration",0),5)), (LCProcedure,Reduce(("full_type_declaration",0),5)), (LCType,Reduce(("full_type_declaration",0),5)), (LCFor,Reduce(("full_type_declaration",0),5)), (LCUse,Reduce(("full_type_declaration",0),5)), (LCImplement,Reduce(("full_type_declaration",0),5)), (LCEnd,Reduce(("full_type_declaration",0),5)), (LCPrivate,Reduce(("full_type_declaration",0),5)), (LCAuxiliary,Reduce(("full_type_declaration",0),5)), (LCBegin,Reduce(("full_type_declaration",0),5))]]@slrp'a38; val slrp'a36=[[(LCSemi,Shift 36)]]@slrp'a37; val slrp'a35=[[(LCEos,Reduce(("type_declaration",1),1)), (LCLChevron,Reduce(("type_declaration",1),1)), (LCFunction,Reduce(("type_declaration",1),1)), (LCPackage,Reduce(("type_declaration",1),1)), (LCIdentifier,Reduce(("type_declaration",1),1)), (LCAnnotation,Reduce(("type_declaration",1),1)), (LCSubType,Reduce(("type_declaration",1),1)), (LCPragma,Reduce(("type_declaration",1),1)), (LCProcedure,Reduce(("type_declaration",1),1)), (LCType,Reduce(("type_declaration",1),1)), (LCFor,Reduce(("type_declaration",1),1)), (LCUse,Reduce(("type_declaration",1),1)), (LCImplement,Reduce(("type_declaration",1),1)), (LCEnd,Reduce(("type_declaration",1),1)), (LCPrivate,Reduce(("type_declaration",1),1)), (LCAuxiliary,Reduce(("type_declaration",1),1)), (LCBegin,Reduce(("type_declaration",1),1))]]@slrp'a36; val slrp'a34=[[(LCEos,Reduce(("type_declaration",0),1)), (LCLChevron,Reduce(("type_declaration",0),1)), (LCFunction,Reduce(("type_declaration",0),1)), (LCPackage,Reduce(("type_declaration",0),1)), (LCIdentifier,Reduce(("type_declaration",0),1)), (LCAnnotation,Reduce(("type_declaration",0),1)), (LCSubType,Reduce(("type_declaration",0),1)), (LCPragma,Reduce(("type_declaration",0),1)), (LCProcedure,Reduce(("type_declaration",0),1)), (LCType,Reduce(("type_declaration",0),1)), (LCFor,Reduce(("type_declaration",0),1)), (LCUse,Reduce(("type_declaration",0),1)), (LCImplement,Reduce(("type_declaration",0),1)), (LCEnd,Reduce(("type_declaration",0),1)), (LCPrivate,Reduce(("type_declaration",0),1)), (LCAuxiliary,Reduce(("type_declaration",0),1)), (LCBegin,Reduce(("type_declaration",0),1))]]@slrp'a35; val slrp'a33=[[(LCColon,Reduce(("identifier_list",1),3)), (LCCrd,Reduce(("identifier_list",1),3)),(LCSemi,Reduce(("identifier_list",1),3)) ]]@slrp'a34; val slrp'a32=[[(LCEos,Reduce(("variable_declaration",1),6)), (LCLChevron,Reduce(("variable_declaration",1),6)), (LCFunction,Reduce(("variable_declaration",1),6)), (LCPackage,Reduce(("variable_declaration",1),6)), (LCIdentifier,Reduce(("variable_declaration",1),6)), (LCAnnotation,Reduce(("variable_declaration",1),6)), (LCSubType,Reduce(("variable_declaration",1),6)), (LCPragma,Reduce(("variable_declaration",1),6)), (LCProcedure,Reduce(("variable_declaration",1),6)), (LCType,Reduce(("variable_declaration",1),6)), (LCFor,Reduce(("variable_declaration",1),6)), (LCUse,Reduce(("variable_declaration",1),6)), (LCImplement,Reduce(("variable_declaration",1),6)), (LCEnd,Reduce(("variable_declaration",1),6)), (LCPrivate,Reduce(("variable_declaration",1),6)), (LCAuxiliary,Reduce(("variable_declaration",1),6)), (LCBegin,Reduce(("variable_declaration",1),6))]]@slrp'a33; val slrp'a31=[[(LCSemi,Shift 31)]]@slrp'a32; val slrp'a30=[[(LCEos,Reduce(("variable_declaration",0),4)), (LCLChevron,Reduce(("variable_declaration",0),4)), (LCFunction,Reduce(("variable_declaration",0),4)), (LCPackage,Reduce(("variable_declaration",0),4)), (LCIdentifier,Reduce(("variable_declaration",0),4)), (LCAnnotation,Reduce(("variable_declaration",0),4)), (LCSubType,Reduce(("variable_declaration",0),4)), (LCPragma,Reduce(("variable_declaration",0),4)), (LCProcedure,Reduce(("variable_declaration",0),4)), (LCType,Reduce(("variable_declaration",0),4)), (LCFor,Reduce(("variable_declaration",0),4)), (LCUse,Reduce(("variable_declaration",0),4)), (LCImplement,Reduce(("variable_declaration",0),4)), (LCEnd,Reduce(("variable_declaration",0),4)), (LCPrivate,Reduce(("variable_declaration",0),4)), (LCAuxiliary,Reduce(("variable_declaration",0),4)), (LCBegin,Reduce(("variable_declaration",0),4))]]@slrp'a31; val slrp'a29=[[(LCEos,Reduce(("constant_declaration",1),6)), (LCLChevron,Reduce(("constant_declaration",1),6)), (LCFunction,Reduce(("constant_declaration",1),6)), (LCPackage,Reduce(("constant_declaration",1),6)), (LCIdentifier,Reduce(("constant_declaration",1),6)), (LCAnnotation,Reduce(("constant_declaration",1),6)), (LCSubType,Reduce(("constant_declaration",1),6)), (LCPragma,Reduce(("constant_declaration",1),6)), (LCProcedure,Reduce(("constant_declaration",1),6)), (LCType,Reduce(("constant_declaration",1),6)), (LCFor,Reduce(("constant_declaration",1),6)), (LCUse,Reduce(("constant_declaration",1),6)), (LCImplement,Reduce(("constant_declaration",1),6)), (LCEnd,Reduce(("constant_declaration",1),6)), (LCPrivate,Reduce(("constant_declaration",1),6)), (LCAuxiliary,Reduce(("constant_declaration",1),6)), (LCBegin,Reduce(("constant_declaration",1),6))]]@slrp'a30; val slrp'a28=[[(LCSemi,Shift 28)]]@slrp'a29; val slrp'a27=[[(LCEos,Reduce(("constant_declaration",0),7)), (LCLChevron,Reduce(("constant_declaration",0),7)), (LCFunction,Reduce(("constant_declaration",0),7)), (LCPackage,Reduce(("constant_declaration",0),7)), (LCIdentifier,Reduce(("constant_declaration",0),7)), (LCAnnotation,Reduce(("constant_declaration",0),7)), (LCSubType,Reduce(("constant_declaration",0),7)), (LCPragma,Reduce(("constant_declaration",0),7)), (LCProcedure,Reduce(("constant_declaration",0),7)), (LCType,Reduce(("constant_declaration",0),7)), (LCFor,Reduce(("constant_declaration",0),7)), (LCUse,Reduce(("constant_declaration",0),7)), (LCImplement,Reduce(("constant_declaration",0),7)), (LCEnd,Reduce(("constant_declaration",0),7)), (LCPrivate,Reduce(("constant_declaration",0),7)), (LCAuxiliary,Reduce(("constant_declaration",0),7)), (LCBegin,Reduce(("constant_declaration",0),7))]]@slrp'a28; val slrp'a26=[[(LCSemi,Shift 26)]]@slrp'a27; val slrp'a25=[[(LCEos,Reduce(("object_declaration",1),1)), (LCLChevron,Reduce(("object_declaration",1),1)), (LCFunction,Reduce(("object_declaration",1),1)), (LCPackage,Reduce(("object_declaration",1),1)), (LCIdentifier,Reduce(("object_declaration",1),1)), (LCAnnotation,Reduce(("object_declaration",1),1)), (LCSubType,Reduce(("object_declaration",1),1)), (LCPragma,Reduce(("object_declaration",1),1)), (LCProcedure,Reduce(("object_declaration",1),1)), (LCType,Reduce(("object_declaration",1),1)), (LCFor,Reduce(("object_declaration",1),1)), (LCUse,Reduce(("object_declaration",1),1)), (LCImplement,Reduce(("object_declaration",1),1)), (LCEnd,Reduce(("object_declaration",1),1)), (LCPrivate,Reduce(("object_declaration",1),1)), (LCAuxiliary,Reduce(("object_declaration",1),1)), (LCBegin,Reduce(("object_declaration",1),1))]]@slrp'a26; val slrp'a24=[[(LCEos,Reduce(("object_declaration",0),1)), (LCLChevron,Reduce(("object_declaration",0),1)), (LCFunction,Reduce(("object_declaration",0),1)), (LCPackage,Reduce(("object_declaration",0),1)), (LCIdentifier,Reduce(("object_declaration",0),1)), (LCAnnotation,Reduce(("object_declaration",0),1)), (LCSubType,Reduce(("object_declaration",0),1)), (LCPragma,Reduce(("object_declaration",0),1)), (LCProcedure,Reduce(("object_declaration",0),1)), (LCType,Reduce(("object_declaration",0),1)), (LCFor,Reduce(("object_declaration",0),1)), (LCUse,Reduce(("object_declaration",0),1)), (LCImplement,Reduce(("object_declaration",0),1)), (LCEnd,Reduce(("object_declaration",0),1)), (LCPrivate,Reduce(("object_declaration",0),1)), (LCAuxiliary,Reduce(("object_declaration",0),1)), (LCBegin,Reduce(("object_declaration",0),1))]]@slrp'a25; val slrp'a23=[[(LCEos,Reduce(("basic_declaration",5),1)), (LCLChevron,Reduce(("basic_declaration",5),1)), (LCFunction,Reduce(("basic_declaration",5),1)), (LCPackage,Reduce(("basic_declaration",5),1)), (LCIdentifier,Reduce(("basic_declaration",5),1)), (LCAnnotation,Reduce(("basic_declaration",5),1)), (LCSubType,Reduce(("basic_declaration",5),1)), (LCPragma,Reduce(("basic_declaration",5),1)), (LCProcedure,Reduce(("basic_declaration",5),1)), (LCType,Reduce(("basic_declaration",5),1)), (LCFor,Reduce(("basic_declaration",5),1)), (LCUse,Reduce(("basic_declaration",5),1)), (LCImplement,Reduce(("basic_declaration",5),1)), (LCEnd,Reduce(("basic_declaration",5),1)), (LCPrivate,Reduce(("basic_declaration",5),1)), (LCAuxiliary,Reduce(("basic_declaration",5),1)), (LCBegin,Reduce(("basic_declaration",5),1))]]@slrp'a24; val slrp'a22=[[(LCEos,Reduce(("basic_declaration",4),1)), (LCLChevron,Reduce(("basic_declaration",4),1)), (LCFunction,Reduce(("basic_declaration",4),1)), (LCPackage,Reduce(("basic_declaration",4),1)), (LCIdentifier,Reduce(("basic_declaration",4),1)), (LCAnnotation,Reduce(("basic_declaration",4),1)), (LCSubType,Reduce(("basic_declaration",4),1)), (LCPragma,Reduce(("basic_declaration",4),1)), (LCProcedure,Reduce(("basic_declaration",4),1)), (LCType,Reduce(("basic_declaration",4),1)), (LCFor,Reduce(("basic_declaration",4),1)), (LCUse,Reduce(("basic_declaration",4),1)), (LCImplement,Reduce(("basic_declaration",4),1)), (LCEnd,Reduce(("basic_declaration",4),1)), (LCPrivate,Reduce(("basic_declaration",4),1)), (LCAuxiliary,Reduce(("basic_declaration",4),1)), (LCBegin,Reduce(("basic_declaration",4),1))]]@slrp'a23; val slrp'a21=[[(LCEos,Reduce(("basic_declaration",3),1)), (LCLChevron,Reduce(("basic_declaration",3),1)), (LCFunction,Reduce(("basic_declaration",3),1)), (LCPackage,Reduce(("basic_declaration",3),1)), (LCIdentifier,Reduce(("basic_declaration",3),1)), (LCAnnotation,Reduce(("basic_declaration",3),1)), (LCSubType,Reduce(("basic_declaration",3),1)), (LCPragma,Reduce(("basic_declaration",3),1)), (LCProcedure,Reduce(("basic_declaration",3),1)), (LCType,Reduce(("basic_declaration",3),1)), (LCFor,Reduce(("basic_declaration",3),1)), (LCUse,Reduce(("basic_declaration",3),1)), (LCImplement,Reduce(("basic_declaration",3),1)), (LCEnd,Reduce(("basic_declaration",3),1)), (LCPrivate,Reduce(("basic_declaration",3),1)), (LCAuxiliary,Reduce(("basic_declaration",3),1)), (LCBegin,Reduce(("basic_declaration",3),1))]]@slrp'a22; val slrp'a20=[[(LCEos,Reduce(("basic_declaration",2),1)), (LCLChevron,Reduce(("basic_declaration",2),1)), (LCFunction,Reduce(("basic_declaration",2),1)), (LCPackage,Reduce(("basic_declaration",2),1)), (LCIdentifier,Reduce(("basic_declaration",2),1)), (LCAnnotation,Reduce(("basic_declaration",2),1)), (LCSubType,Reduce(("basic_declaration",2),1)), (LCPragma,Reduce(("basic_declaration",2),1)), (LCProcedure,Reduce(("basic_declaration",2),1)), (LCType,Reduce(("basic_declaration",2),1)), (LCFor,Reduce(("basic_declaration",2),1)), (LCUse,Reduce(("basic_declaration",2),1)), (LCImplement,Reduce(("basic_declaration",2),1)), (LCEnd,Reduce(("basic_declaration",2),1)), (LCPrivate,Reduce(("basic_declaration",2),1)), (LCAuxiliary,Reduce(("basic_declaration",2),1)), (LCBegin,Reduce(("basic_declaration",2),1))]]@slrp'a21; val slrp'a19=[[(LCEos,Reduce(("basic_declaration",1),1)), (LCLChevron,Reduce(("basic_declaration",1),1)), (LCFunction,Reduce(("basic_declaration",1),1)), (LCPackage,Reduce(("basic_declaration",1),1)), (LCIdentifier,Reduce(("basic_declaration",1),1)), (LCAnnotation,Reduce(("basic_declaration",1),1)), (LCSubType,Reduce(("basic_declaration",1),1)), (LCPragma,Reduce(("basic_declaration",1),1)), (LCProcedure,Reduce(("basic_declaration",1),1)), (LCType,Reduce(("basic_declaration",1),1)), (LCFor,Reduce(("basic_declaration",1),1)), (LCUse,Reduce(("basic_declaration",1),1)), (LCImplement,Reduce(("basic_declaration",1),1)), (LCEnd,Reduce(("basic_declaration",1),1)), (LCPrivate,Reduce(("basic_declaration",1),1)), (LCAuxiliary,Reduce(("basic_declaration",1),1)), (LCBegin,Reduce(("basic_declaration",1),1))]]@slrp'a20; val slrp'a18=[[(LCEos,Reduce(("basic_declaration",0),1)), (LCLChevron,Reduce(("basic_declaration",0),1)), (LCFunction,Reduce(("basic_declaration",0),1)), (LCPackage,Reduce(("basic_declaration",0),1)), (LCIdentifier,Reduce(("basic_declaration",0),1)), (LCAnnotation,Reduce(("basic_declaration",0),1)), (LCSubType,Reduce(("basic_declaration",0),1)), (LCPragma,Reduce(("basic_declaration",0),1)), (LCProcedure,Reduce(("basic_declaration",0),1)), (LCType,Reduce(("basic_declaration",0),1)), (LCFor,Reduce(("basic_declaration",0),1)), (LCUse,Reduce(("basic_declaration",0),1)), (LCImplement,Reduce(("basic_declaration",0),1)), (LCEnd,Reduce(("basic_declaration",0),1)), (LCPrivate,Reduce(("basic_declaration",0),1)), (LCAuxiliary,Reduce(("basic_declaration",0),1)), (LCBegin,Reduce(("basic_declaration",0),1))]]@slrp'a19; val slrp'a17=[[(LCEos,Reduce(("sequence_of_statements_or_block",1),1))]]@slrp'a18; val slrp'a16=[[(LCEos,Reduce(("sequence_of_statements_or_block",0),1))]]@slrp'a17; val slrp'a15=[[(LCEos,Reduce(("web_clause",12),3))]]@slrp'a16; val slrp'a14=[[(LCEos,Reduce(("web_clause",11),1))]]@slrp'a15; val slrp'a13=[[(LCEos,Reduce(("web_clause",10),2))]]@slrp'a14; val slrp'a12=[[(LCArbitraryAda,Shift 12)]]@slrp'a13; val slrp'a11=[[(LCEos,Reduce(("web_clause",9),2))]]@slrp'a12; val slrp'a10=[[(LCEos,Reduce(("web_clause",8),3))]]@slrp'a11; val slrp'a9=[[(LCEos,Reduce(("web_clause",7),2))]]@slrp'a10; val slrp'a8=[[(LCEos,Reduce(("web_clause",6),3))]]@slrp'a9; val slrp'a7=[[(LCEos,Reduce(("web_clause",5),3))]]@slrp'a8; val slrp'a6=[[(LCEos,Reduce(("web_clause",4),3))]]@slrp'a7; val slrp'a5=[[(LCEos,Reduce(("web_clause",3),3))]]@slrp'a6; val slrp'a4=[[(LCEos,Reduce(("web_clause",2),3))]]@slrp'a5; val slrp'a3=[[(LCEos,Reduce(("web_clause",1),3))]]@slrp'a4; val slrp'a2=[[(LCEos,Reduce(("web_clause",0),1))]]@slrp'a3; val slrp'a1=[[(LCEos,Accept)]]@slrp'a2; in val slrp'actions=Array.fromList slrp'a1; end; polyml-5.6/Tests/Succeed/Test013.ML000066400000000000000000000003601265146633400167630ustar00rootroot00000000000000(* Bug found in the basis library. *) CharVector.foldri(fn (_, a, b) => a :: b) [] "abc"; CharVector.foldri(fn (i, a, b) => (i, a) :: b) [] "abc"; val yy = IntVector.fromList [1, 2, 3]; IntVector.foldri(fn (i, a, b) => (i, a) :: b) [] yy; polyml-5.6/Tests/Succeed/Test014.ML000066400000000000000000000012251265146633400167650ustar00rootroot00000000000000(* Bug in handling of relational operators in LargeWord. *) if LargeWord.< (0w1, 0w2) then () else raise Fail "WRONG"; if LargeWord.< (0w1, 0wx80000002) then () else raise Fail "WRONG"; if LargeWord.> (0w1, 0w2) then raise Fail "WRONG" else (); if LargeWord.> (0w1, 0wx80000002) then raise Fail "WRONG" else (); if LargeWord.<= (0w1, 0w2) then () else raise Fail "WRONG"; if LargeWord.<= (0w1, 0wx80000002) then () else raise Fail "WRONG"; if LargeWord.>= (0w1, 0w2) then raise Fail "WRONG" else (); if LargeWord.>= (0w1, 0wx80000002) then raise Fail "WRONG" else (); case LargeWord.compare(0w1, 0wx80000000) of LESS => () | _ => raise Fail "WRONG"; polyml-5.6/Tests/Succeed/Test015.ML000066400000000000000000000011731265146633400167700ustar00rootroot00000000000000(* Bug report from Sebastian Skalberg. There was a problem with the code added in version 4.1.2 to handle flexible labelled records. *) structure VHI = struct fun update_typs {typs,thy} typs' = {typs=typs',thy=thy } fun translate_type args = #thy args fun parse_usertype pos = translate_type fun parse_internaltype args = #thy args fun parse_expr inner pos args = translate_type args | parse_expr inner pos args = parse_internaltype args fun parse_formal args = update_typs args (parse_usertype "var" args) fun parse_index args = update_typs args (parse_expr false "index" args) end; polyml-5.6/Tests/Succeed/Test016.ML000066400000000000000000000006641265146633400167750ustar00rootroot00000000000000(* Bug in the equality compiler. This caused a seg fault. *) datatype ('a, 'v) trie = Trie of 'v option * ('a * ('a, 'v) trie) list; val x = Trie (NONE, [(0, Trie (SOME ~2, []))]); val y = Trie (NONE, [(~2, Trie (NONE, [(0, Trie (SOME 1, [])), (0, Trie (NONE, []))])), (0, Trie (SOME ~2, [(0, Trie (SOME 2, [])), (1, Trie (SOME ~1, []))]))]); x = y; polyml-5.6/Tests/Succeed/Test017.ML000066400000000000000000000142341265146633400167740ustar00rootroot00000000000000(* More assorted tests from updating the basis library. *) fun verify true = () | verify false = raise Fail "wrong"; structure S = PrimIO( structure Vector = CharVector and Array = CharArray and VectorSlice = CharVectorSlice and ArraySlice = CharArraySlice val someElem = #" " type pos = int val compare = Int.compare); val S.RD r = S.openVector "abcdefghijk"; verify(valOf(#readVec r) 2 = "ab"); verify(valOf(#readVec r) 2 = "cd"); #close r (); (valOf(#readVec r) 2; raise Fail "wrong") handle IO.ClosedStream => (); val S.RD r = S.openVector "a"; verify(valOf(#readVec r) 2 = "a"); verify(valOf(#readVec r) 2 = ""); Timer.checkCPUTimes(Timer.totalCPUTimer()); fun ieeeVerify(SOME(iee, subs), ieeMatch, str) = if iee = ieeMatch andalso Substring.string subs = str then () else raise Fail "wrong" | ieeeVerify _ = raise Fail "wrong"; ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 1.23X"), {exp = 1, sign = false, class = IEEEReal.NORMAL, digits = [1, 2, 3]}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 1.23E3X"), {exp = 4, sign = false, class = IEEEReal.NORMAL, digits = [1, 2, 3]}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 1.23E 3X"), {exp = 1, sign = false, class = IEEEReal.NORMAL, digits = [1, 2, 3]}, "E 3X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " ~1.23E 3X"), {exp = 1, sign = true, class = IEEEReal.NORMAL, digits = [1, 2, 3]}, "E 3X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " .23E 3X"), {exp = 0, sign = false, class = IEEEReal.NORMAL, digits = [2, 3]}, "E 3X"); (* Valid, but E 3X isn't part of the number. *) verify(not(isSome(IEEEReal.scan Substring.getc (Substring.full " . 23E 3X")))); (* Not valid. *) ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 000.000X"), {exp = 0, sign = false, class = IEEEReal.ZERO, digits = []}, "X"); verify(not(isSome(IEEEReal.scan Substring.getc (Substring.full " E2 3X")))); (* Not valid. *) ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 0X"), {exp = 0, sign = false, class = IEEEReal.ZERO, digits = []}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 1X"), {exp = 1, sign = false, class = IEEEReal.NORMAL, digits = [1]}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 12X"), {exp = 2, sign = false, class = IEEEReal.NORMAL, digits = [1, 2]}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 0.00X"), {exp = 0, sign = false, class = IEEEReal.ZERO, digits = []}, "X"); ieeeVerify(IEEEReal.scan Substring.getc (Substring.full " 10.X"), {exp = 2, sign = false, class = IEEEReal.NORMAL, digits = [1, 0]}, ".X"); (* Valid. The decimal point is not part of the number. *) fun timeVerify(SOME(t, subs), tMatch, str) = if t = Time.fromMilliseconds tMatch andalso Substring.string subs = str then () else raise Fail "wrong" | timeVerify _ = raise Fail "wrong"; timeVerify(Time.scan Substring.getc (Substring.full " 0.00X"), 0, "X"); timeVerify(Time.scan Substring.getc (Substring.full " 1.23X"), 1230, "X"); timeVerify(Time.scan Substring.getc (Substring.full " 0.001X"), 1, "X"); timeVerify(Time.scan Substring.getc (Substring.full " 10.X"), 10000, ".X"); (* Valid. The decimal point is not part of the number. *) timeVerify(Time.scan Substring.getc (Substring.full " 0 .X"), 0, " .X"); timeVerify(Time.scan Substring.getc (Substring.full " .12X"), 120, "X"); verify(let val SOME x = Time.fromString " 0.001X" in Time.toNanoseconds x end = 1000000); verify(let val SOME x = Time.fromString " 0.000001X" in Time.toNanoseconds x end = 1000); verify(abs(let val SOME x = Time.fromString " 0.000000001X" in Time.toNanoseconds x end) <= 1); (* May be below the resolution. *) verify(List.collate Int.compare ([1,2,3], [1,2,3]) = EQUAL); verify(List.collate Int.compare ([1,2], [1,2,3]) = LESS); verify(List.collate Int.compare ([2,2], [1,2,3]) = GREATER); verify(String.concatWith "a" ["X", "Y", "Z"] = "XaYaZ"); verify(String.concatWith "a" [] = ""); (* These examples are given in G&R 2004. *) verify(String.fromString "\\q" = NONE); verify(String.fromString "a\^D" = SOME "a"); verify(String.fromString "a\\ \\\\q" = SOME "a"); verify(String.fromString "\\ \\" = SOME ""); verify(String.fromString "" = SOME ""); verify(String.fromString "\\ \\\^D" = SOME ""); verify(String.fromString "\\ a" = NONE); verify(Char.fromString "\\q" = NONE); verify(Char.fromString "a\^D" = SOME #"a"); verify(Char.fromString "a\\ \\\\q" = SOME #"a"); verify(Char.fromString "\\ \\" = NONE); verify(Char.fromString "" = NONE); verify(Char.fromString "\\ \\\^D" = NONE); verify(Char.fromString "\\ a" = NONE); verify(String.fromString("a\\ \\bc") = SOME "abc"); verify(Char.fromString("\\ \\bc") = SOME #"b"); verify(Substring.isPrefix "abc" (Substring.substring("XXXabcdYYY", 3, 4))); verify(not(Substring.isPrefix "abcd" (Substring.substring("XXXabcdYYY", 3, 3)))); verify(Substring.isPrefix "abc" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isPrefix "" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isPrefix "" (Substring.substring("XXXabcdYYY", 3, 0))); verify(not(Substring.isPrefix "abc" (Substring.substring("XXXdabcYYY", 3, 4)))); verify(not(Substring.isSuffix "abc" (Substring.substring("XXXabcdYYY", 3, 4)))); verify(not(Substring.isSuffix "abcd" (Substring.substring("XXXabcdYYY", 3, 3)))); verify(Substring.isSuffix "abc" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isSuffix "" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isSuffix "" (Substring.substring("XXXabcdYYY", 3, 0))); verify(Substring.isSuffix "abc" (Substring.substring("XXXdabcYYY", 3, 4))); verify(Substring.isSubstring "abc" (Substring.substring("XXXabcdYYY", 3, 4))); verify(not(Substring.isSubstring "abcd" (Substring.substring("XXXabcdYYY", 3, 3)))); verify(Substring.isSubstring "abc" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isSubstring "" (Substring.substring("XXXabcdYYY", 3, 3))); verify(Substring.isSubstring "" (Substring.substring("XXXabcdYYY", 3, 0))); verify(Substring.isSubstring "abc" (Substring.substring("XXXdabcYYY", 3, 4))); verify(Substring.isSubstring "abc" (Substring.full "xyzabcdef")); polyml-5.6/Tests/Succeed/Test018.ML000066400000000000000000000005141265146633400167710ustar00rootroot00000000000000(* Bugs in handling of single-character strings. *) fun verify true = () | verify false = raise Fail "error"; verify(String.isPrefix "a" "a"); verify(String.isPrefix "a" "abcd"); verify(String.isSuffix "a" "a"); verify(not(String.isSuffix "a" "abcd")); verify(String.isSubstring "a" "a"); verify(String.isSubstring "a" "abcd"); polyml-5.6/Tests/Succeed/Test019.ML000066400000000000000000000002171265146633400167720ustar00rootroot00000000000000(* This failed an assertion on the PPC architecture. *) fun f x = Word.andb(x, 0wx108000); RunCall.run_call0 RuntimeCalls.POLY_SYS_full_gc (); polyml-5.6/Tests/Succeed/Test020.ML000066400000000000000000000043111265146633400167610ustar00rootroot00000000000000(* I've redone some of the string comparison routines so these are a few checks especially for the special cases of single-character strings. *) fun check f = if f() then () else raise Fail "Test failed!!\n"; check (fn () => not ("abc" > "abc")); check (fn () => "abd" > "abc"); check (fn () => "abc" > ""); check (fn () => "abcd" > "abc"); check (fn () => "a" > ""); check (fn () => "b" > "a"); check (fn () => not("a" > "a")); check (fn () => not("a" > "b")); check (fn () => not ("" > "a")); check (fn () => "abc" > "a"); check (fn () => not ("a" > "abc")); check (fn () => not ("abc" < "abc")); check (fn () => not ("abd" < "abc")); check (fn () => not ("abc" < "")); check (fn () => not ("abcd" < "abc")); check (fn () => not ("a" < "")); check (fn () => not ("b" < "a")); check (fn () => not("a" < "a")); check (fn () => "a" < "b"); check (fn () => "" < "a"); check (fn () => not ("abc" < "a")); check (fn () => "a" < "abc"); check (fn () => "abc" >= "abc"); check (fn () => "abd" >= "abc"); check (fn () => "abc" >= ""); check (fn () => "abcd" >= "abc"); check (fn () => "a" >= ""); check (fn () => "b" >= "a"); check (fn () => "a" >= "a"); check (fn () => not("a" >= "b")); check (fn () => not ("" >= "a")); check (fn () => "abc" >= "a"); check (fn () => not ("a" >= "abc")); check (fn () => "abc" <= "abc"); check (fn () => not ("abd" <= "abc")); check (fn () => not ("abc" <= "")); check (fn () => not ("abcd" <= "abc")); check (fn () => not ("a" <= "")); check (fn () => not ("b" <= "a")); check (fn () => "a" <= "a"); check (fn () => "a" <= "b"); check (fn () => "" <= "a"); check (fn () => not ("abc" <= "a")); check (fn () => "a" <= "abc"); check (fn () => String.compare("abc", "abc") = EQUAL); check (fn () => String.compare("abd", "abc") = GREATER); check (fn () => String.compare("abc", "") = GREATER); check (fn () => String.compare("abcd", "abc") = GREATER); check (fn () => String.compare("a", "") = GREATER); check (fn () => String.compare("b", "a") = GREATER); check (fn () => String.compare("a", "a") = EQUAL); check (fn () => String.compare("a", "b") = LESS); check (fn () => String.compare("", "a") = LESS); check (fn () => String.compare("abc", "a") = GREATER); check (fn () => String.compare("a", "abc") = LESS); polyml-5.6/Tests/Succeed/Test021.ML000066400000000000000000000001471265146633400167650ustar00rootroot00000000000000(* Conversion of negative hex numbers had an error. *) if ~0x4 = ~ 0x4 then () else raise Fail "FAIL"; polyml-5.6/Tests/Succeed/Test022.ML000066400000000000000000000012011265146633400167560ustar00rootroot00000000000000(* Reported by Makarius: the second case raised the Bind exception. I've added some more tests that also gave the wrong result because of the same bug. *) datatype ('a, 'b) pair = Pair of 'a * 'b; Pair (1, 1) = Pair (1, 1); Pair (1, Pair (1, 1)) = Pair (1, Pair (1, 1)); val x = ref 1; Pair (1, x) = Pair (1, x); Pair (x, (1,1)) = Pair (x, (1,1)); Pair ((1,1), x) = Pair ((1,1), x); datatype ('a, 'b, 'c) Triple = X of 'c | Y of 'b | Z of 'a; (X 10000000000: (int ref, int ref, int) Triple) = X 10000000000; (X 10000000000: (int, int ref, int) Triple) = X 10000000000; (X 10000000000: (int ref, int, int) Triple) = X 10000000000; polyml-5.6/Tests/Succeed/Test023.ML000066400000000000000000000010161265146633400167630ustar00rootroot00000000000000(* To check that we've handled equality correctly on datatypes whose representations aren't known when we compile the functor. *) functor F(S: sig eqtype t datatype s = X | Y of t end) = struct fun eq(x: S.s, y) = if x = y then () else raise Fail "FAIL" end; datatype s = X | Y of int; structure R = F(struct datatype s = datatype s type t = int end); R.eq(X, X); R.eq(Y 9, Y 9); datatype s = X | Y of int * int; structure R = F(struct datatype s = datatype s type t = int * int end); R.eq(X, X); R.eq(Y(4,5), Y(4, 5)); polyml-5.6/Tests/Succeed/Test024.ML000066400000000000000000000005321265146633400167660ustar00rootroot00000000000000(* For some reason the tests for the sign for ZERO values in Real.fromDecimal was reversed. *) if Real.toString(valOf (Real.fromDecimal (valOf (IEEEReal.fromString "0.0")))) = "0.0" then () else raise Fail "WRONG!!\n"; if Real.toString(valOf (Real.fromDecimal (valOf (IEEEReal.fromString "~0.0")))) = "~0.0" then () else raise Fail "WRONG!!\n"; polyml-5.6/Tests/Succeed/Test025.ML000066400000000000000000000014121265146633400167650ustar00rootroot00000000000000(* Check that locks work correctly. *) open Thread.Thread Thread.Mutex val a = ref 0 and b = ref 0 and c = ref 0 val mut = mutex() fun f s n () = let val () = lock mut val aa = (a := !a+1; !a) and bb = (b := !b+1; !b) and cc = (c := !c+1; !c) val () = unlock mut in if aa <> bb orelse aa <> cc orelse bb <> cc then print(concat[s, "-> a = ", Int.toString aa, " b = ", Int.toString bb, " c = ", Int.toString cc, "\n"]) else if aa < 10000 then f s (n+1) () else () end; fork(f "A" 0, [InterruptState InterruptAsynch, EnableBroadcastInterrupt true]); fork(f "B" 0, [InterruptState InterruptAsynch, EnableBroadcastInterrupt true]); fork(f "C" 0, [InterruptState InterruptAsynch, EnableBroadcastInterrupt true]); f "D" 0 (); polyml-5.6/Tests/Succeed/Test026.ML000066400000000000000000000006431265146633400167730ustar00rootroot00000000000000(* Previously the lexical analyser assumed that a number followed by E or e was always a real number and if there was no valid number after it this was an error. *) val e = ("a", "b") ; (* Vesa Karvonen's original example. *) #1e ; (* Other test cases. *) val e = 3; fun f a b c = c(a+b); f 1e~; val example = 1 and Example = 2; f 1example~; f 1Example~; val e = 1.1; fun f (a: real) b c = c(a+b); f 1.2e~; polyml-5.6/Tests/Succeed/Test027.ML000066400000000000000000000011331265146633400167670ustar00rootroot00000000000000(* The identity type constructor complicates the matching since it is the only case where an explicit type variable can match a type construction. *) functor F (RNGY : sig type t end) : sig type 'a tt (*type 'a c*) val ir : ('a -> 'a tt) -> ('a->'a) -> 'a -> 'a tt structure RNGX : sig type t end end = struct structure RNGX = struct type t = RNGY.t end type 'a c = 'a type 'a tt = RNGY.t -> 'a c fun ir bir b2a xy nr = b2a( (bir xy) nr) end; type 'a Id = 'a; fun f (x: 'a Id -> 'a) = (); val g = f : ('a Id -> 'a) -> unit; val h : ('a Id -> 'a) -> unit = f; polyml-5.6/Tests/Succeed/Test028.ML000066400000000000000000000016031265146633400167720ustar00rootroot00000000000000(* Check the real number comparison operations. All operations return false on Nans except for != *) fun verify s = if s then () else raise Fail "FAIL!!"; val Nan = 0.0/0.0; verify(Real.==(1.0, 1.0)); verify(not (Real.==(1.0, 1.1))); verify(not (Real.==(1.1, 1.0))); verify(not (Real.==(Nan, Nan))); verify(not (Real.!=(1.0, 1.0))); verify(Real.!=(1.0, 1.1)); verify(Real.!=(1.1, 1.0)); verify(Real.!=(Nan, Nan)); verify(1.0 < 1.1); verify(not (1.1 < 1.0)); verify(not (1.0 < Nan)); verify(not (Nan < 1.0)); verify(not (1.0 < 1.0)); verify(not (1.0 > 1.1)); verify(1.1 > 1.0); verify(not (1.0 > Nan)); verify(not (Nan > 1.0)); verify(not (1.0 > 1.0)); verify(1.0 <= 1.1); verify(not (1.1 <= 1.0)); verify(not (1.0 <= Nan)); verify(not (Nan <= 1.0)); verify(1.0 <= 1.0); verify(not (1.0 >= 1.1)); verify(1.1 >= 1.0); verify(not (1.0 >= Nan)); verify(not (Nan >= 1.0)); verify(1.0 >= 1.0); polyml-5.6/Tests/Succeed/Test029.ML000066400000000000000000000002111265146633400167650ustar00rootroot00000000000000(* A type constraint was missing in the REAL signature. *) functor F (R: REAL) = struct fun f(x: R.real) = R.+(x, R.Math.tan x) end; polyml-5.6/Tests/Succeed/Test030.ML000066400000000000000000000024211265146633400167620ustar00rootroot00000000000000(* Bug in CODETREE.ML which resulted in Subscript exception in the compiler. Reported by Lucas Dixon ldixon at inf dot ed dot ac dot uk *) PolyML.Compiler.maxInlineSize := 80; structure Output = struct fun output_width x = (x, 99) end; structure Markup = struct type property = string * string type T = string * property list val none = ("", []); end structure Pretty = struct datatype T = Block of Markup.T * T list * int * int | String of string * int | Break of bool * int; fun length (Block (_, _, _, len)) = len | length (String (_, len)) = len | length (Break (_, wd)) = wd; val str = String o Output.output_width; fun markup_block m (indent, es) = let fun sum [] k = k | sum (e :: es) k = sum es (length e + k); in Block (m, es, indent, sum es 0) end; val blk = markup_block Markup.none; fun block prts = blk (2, prts); end; fun foo l s x i = [] @ map (fn (i,s) => Pretty.block [(case x of NONE => Pretty.str "a" | SOME openi => (if (openi = i) then Pretty.str "b" else Pretty.str "c")), Pretty.str "d"]) l; polyml-5.6/Tests/Succeed/Test031.ML000066400000000000000000000002751265146633400167700ustar00rootroot00000000000000(* Bug in OS.Path.makeCanonical reported by Scott dot Owens at cl dot cam dot ac dot uk *) if OS.Path.mkCanonical "/a/b/../../c" = OS.Path.mkCanonical "/c" then () else raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test032.ML000066400000000000000000000025741265146633400167750ustar00rootroot00000000000000(* Simon Finn pointed out that there might be a bug in this area and there was. We can't use the optimised representation for top-level datatypes because they may get incorporated into structures. This didn't apply in ML90 because there wasn't any way to get a top-level datatype into a structure. *) datatype t = X | Y of int * int; functor F(S: sig type s datatype t = X | Y of s val def: s end) = struct open S fun f (Y d) = d | f X = def end; structure S = F(struct type s = int * int datatype t = datatype t val def = (0,0) end); if S.f(Y(1,1)) = (1,1) then () else raise Fail "FAIL"; local datatype t = X | Y of int * int; in structure S1 = F(struct type s = int * int datatype t = datatype t val def = (0,0) end); val isOk = if S1.f(Y(1,1)) = (1,1) then "OK" else "FAIL"; end; structure Q = let datatype t = X | Y of int * int; structure S1 = F(struct type s = int * int datatype t = datatype t val def = (0,0) end); in struct val isOk = S1.f(Y(1,1)) = (1,1); end end; if Q.isOk then () else raise Fail "wrong"; structure Q = struct structure T = let datatype t = X | Y of int * int; structure S1 = F(struct type s = int * int datatype t = datatype t val def = (0,0) end); in struct val isOk = S1.f(Y(1,1)) = (1,1) end end end; if Q.T.isOk then () else raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test033.ML000066400000000000000000000014651265146633400167740ustar00rootroot00000000000000(* Tests for bugs in real conversion. Also tests that Real.~ flips the sign bit. It's not clear from the Basis Library book whether this is correct for zero but for consistency we assume it. Reported by Matthew Fluet fluet AT tti-c AT org *) fun verify true = () | verify false = raise Fail "wrong"; verify(Real.round(valOf(Real.fromString "1234567890.12345678901234")) = 1234567890); verify(Real.round(valOf(Real.fromString "1234567890.123456789012345")) = 1234567890); verify(Real.round(valOf(Real.fromString "1234567890.1234567890123456")) = 1234567890); verify(Real.round(valOf(Real.fromString "1234567890.1234567890123456789")) = 1234567890); verify(not(Real.signBit 0.0)); verify(Real.signBit (Real.~ 0.0)); verify(Real.signBit (Real.~ 1.0)); verify(Real.signBit (valOf (Real.fromString "~0.0"))); polyml-5.6/Tests/Succeed/Test034.ML000066400000000000000000000017011265146633400167660ustar00rootroot00000000000000(* Tests for Substring.isPrefix, Substring.isSuffix with single character strings. Reported by Richard Harrison rdharrison2 at hotmail dot co dot uk *) fun verify true = () | verify false = raise Fail "wrong"; verify(Substring.isPrefix "a" (Substring.full "abc")); verify(Substring.isPrefix "a" (Substring.full "a")); verify(not(Substring.isPrefix "a" (Substring.full "bc"))); verify(not(Substring.isPrefix "a" (Substring.full "b"))); verify(not(Substring.isSuffix "a" (Substring.full "abc"))); verify(Substring.isSuffix "a" (Substring.full "a")); verify(Substring.isSuffix "a" (Substring.full "bca")); verify(not(Substring.isSuffix "a" (Substring.full "b"))); verify(Substring.isSubstring "b" (Substring.full "abc")); verify(Substring.isSubstring "a" (Substring.full "a")); verify(not(Substring.isSubstring "a" (Substring.full "bc"))); verify(not(Substring.isSubstring "a" (Substring.full "b"))); verify(Substring.isSubstring "" (Substring.full "a")); polyml-5.6/Tests/Succeed/Test035.ML000066400000000000000000000003131265146633400167650ustar00rootroot00000000000000(* Bug in sparc assembly code. *) if IntInf.andb(1234567890123456789, 1) = 1 then () else raise Fail "FAIL"; if IntInf.xorb(1234567890123456789, 1) = 1234567890123456788 then () else raise Fail "FAIL"; polyml-5.6/Tests/Succeed/Test036.ML000066400000000000000000000004351265146633400167730ustar00rootroot00000000000000(* Reported by Phil Clayton. *) fun verify true = () | verify false = raise Fail "wrong"; val test = IntInf.pow; verify(test (~1, ~1000000) = 1); verify(test (~1, ~8) = 1); verify(test (~1, ~6) = 1); verify(test (~1, ~4) = 1); verify(test (~1, ~2) = 1); verify(test (~1, ~1) = ~1); polyml-5.6/Tests/Succeed/Test037.ML000066400000000000000000000005231265146633400167720ustar00rootroot00000000000000(* Bug in SVN 630. *) (* The problem was that the bound variable count was being reset so that tt was getting the same bound variable as S.t. *) functor U (S: sig type t val y: t end) = struct structure T: sig val x: S.t type tt end = struct val x = S.y type tt = int end end; polyml-5.6/Tests/Succeed/Test038.ML000066400000000000000000000006231265146633400167740ustar00rootroot00000000000000(* Check that successive right assocative operators work correctly. *) (* Include the default precedences just so we're clear. *) infix 7 * / div mod infix 6 + - ^ infixr 6 -- infixr 5 :: @ ++; val op ++ = op :: ; val op -- = op -; (* This failed in 5.2 and earlier but is valid. *) val q = 1 :: 1 + 2 ++ 3*4 :: nil; (* This failed in SVN prior to SVN 639. *) val q = 1 :: 1 + 2 :: 3*4 :: nil; polyml-5.6/Tests/Succeed/Test039.ML000066400000000000000000000004631265146633400167770ustar00rootroot00000000000000(* This violates an assumption that all structures produced by a core-language expression are global. structure "T" is still local when "open S" is processed. *) structure S = struct structure T = struct val x = 1 end end (* N.B. No semicolon in here. *) open S; T.x; polyml-5.6/Tests/Succeed/Test040.ML000066400000000000000000000004661265146633400167720ustar00rootroot00000000000000(* This failed because the "level" was not being correctly calculated when using an overloaded function as a value rather than calling it. *) local datatype a = A | B fun s (l:(a*a) list) = List.map (op =) l in val x = s [(A, A), (B,B)] end; if x = [true, true] then () else raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test041.ML000066400000000000000000000004471265146633400167720ustar00rootroot00000000000000(* Test of code-generation of equality across signature matching. *) structure S:> sig eqtype 'a t val mkT: 'a * int -> 'a t end = struct datatype 'a X = X of 'a type 'a t = 'a X * int X fun mkT(x, n) = (X x, X n) end; if S.mkT(3, 4) = S.mkT(3, 4) then () else raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test042.ML000066400000000000000000000003541265146633400167700ustar00rootroot00000000000000functor BasicNameSetFun(N : sig type name end) = struct structure N = N datatype T = Empty end; datatype name = A (* N.B. No semicolon. *) structure R = struct type name = name list end structure Names = BasicNameSetFun(R); polyml-5.6/Tests/Succeed/Test043.ML000066400000000000000000000006741265146633400167760ustar00rootroot00000000000000(* Bugs fixed in OS.Path.joinDirFile. *) fun checkPathFns s = let val result = OS.Path.joinDirFile(OS.Path.splitDirFile s) in (* On Windows / is accepted as a path separator but replaced by \\. *) if result = s orelse result = String.map(fn #"/" => #"\\" | c => c) s then () else raise Fail "FAIL" end; checkPathFns "single"; checkPathFns "a/b"; checkPathFns "a\\b"; checkPathFns "\\ab"; checkPathFns "C:\\ab"; checkPathFns "/ab"; polyml-5.6/Tests/Succeed/Test044.ML000066400000000000000000000003271265146633400167720ustar00rootroot00000000000000signature A = sig type t end; signature S = sig type a type b type c include A where type t = int * c sharing type a = b end; structure S: S = struct type a = int type b = int type c = int type t = int * int end; polyml-5.6/Tests/Succeed/Test045.ML000066400000000000000000000025251265146633400167750ustar00rootroot00000000000000(* Three different bugs to do with where-type constraints. *) signature EXPORTTREESIG = sig (* Export tree. *) type ptProperties include sig type exportTree end where type exportTree = int * ptProperties list end; functor INITIALISE_ ( structure VALUEOPS : sig type location end where type location = int; structure EXPORTTREE: EXPORTTREESIG structure MAKE : sig type exportTree end where type exportTree = EXPORTTREE.exportTree; ) = struct end; (* I think I've identified these. *) functor INITIALISE_ ( structure EXPORTTREE: sig type exportTree end where type exportTree = int structure MAKE : sig type exportTree end where type exportTree = EXPORTTREE.exportTree; ) = struct end; (* I think I've identified this one. *) signature EXPORTTREESIG = sig type ptProperties include sig type location end where type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } include sig type exportTree end where type exportTree = location * ptProperties list include sig type navigation end where type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} end; functor F(structure E: EXPORTTREESIG) = struct end; polyml-5.6/Tests/Succeed/Test046.ML000066400000000000000000000010601265146633400167670ustar00rootroot00000000000000(* This caused a Bind exception. *) signature HOLPP = sig type ppstream datatype frag = QUOTE of string val lineWidth : int -> int val pp_to_string : int -> (int -> 'a -> unit) -> 'a -> string end; signature Portable = sig include HOLPP end; structure Portable :> Portable = struct type ppstream = int datatype frag = QUOTE of string fun lineWidth _ = raise Fail "bad" fun pp_to_string _ = raise Fail "bad" fun pp_to_string linewidth ppfn ob = "" end (* Portable *) ; datatype frag = datatype Portable.frag; val q2 = QUOTE "" : Portable.frag; polyml-5.6/Tests/Succeed/Test047.ML000066400000000000000000000012161265146633400167730ustar00rootroot00000000000000(* Datatypes with a single constructor are normally represented as the value, i.e. the contructor is an identity function. We optimise the case of constructors of tuples so that B values are triples containing the tag, a and b. We MUSTN'T do that for ref. *) datatype 'a t = T of 'a type q = {a: string, b: string}; datatype s = A | B of q t | C of int; let val x = B(T{a="O", b="K"}) val B(T{a,b}) = x in a^b end; datatype s = A | B of q ref | C of int; let val x = B(ref{a="WRO", b="NG"}) val B r = x val _ = r := {a="O", b="K"} val B(ref{a,b}) = x in if a^b = "OK" then () else raise Fail "Wrong" end; polyml-5.6/Tests/Succeed/Test048.ML000066400000000000000000000004411265146633400167730ustar00rootroot00000000000000(* The Definition does not actually put any restriction on what can follow a datatype replication so the following would appear to be legal. *) structure S2: sig datatype t = datatype char end = struct datatype t = datatype char end; type 'a s = 'a * 'a; datatype t = datatype s; polyml-5.6/Tests/Succeed/Test049.ML000066400000000000000000000004401265146633400167730ustar00rootroot00000000000000(* This broke in 5.3 RC1 *) signature A = sig datatype t = A | B end; structure A: A = struct datatype t = A | B end; structure B = struct open A datatype s = datatype t end; (* This wasn't a problem, but include it anyway. *) structure B = struct open A datatype s = datatype A.t end; polyml-5.6/Tests/Succeed/Test050.ML000066400000000000000000000003461265146633400167700ustar00rootroot00000000000000(* This produced a Subscript error in the printing code. *) functor F(S:sig type T end) = struct type T = S.T end; structure S = struct datatype a = B datatype t = A structure R = F(type T = (int * t) list); type T = R.T end; polyml-5.6/Tests/Succeed/Test051.ML000066400000000000000000000005101265146633400167620ustar00rootroot00000000000000(* This caused a Subscript error when printing. *) functor Longid (S: sig end): sig datatype node = T of int type obj val r: obj end = struct datatype node = T of int type obj = node list val r = nil end ; functor AstAtoms () = struct datatype T = A datatype S = B structure Longcon = Longid () end ; polyml-5.6/Tests/Succeed/Test052.ML000066400000000000000000000013041265146633400167650ustar00rootroot00000000000000(* This produced a signature match error in the structure declaration even though it had already matched in the functor result. *) signature LONGID = sig type node type t val x: t end; functor Longid (): LONGID = struct datatype node = T type t = node list val x = nil end; signature AST_ATOMS = sig structure Longcon: LONGID structure Longvid: sig type t val longc: Longcon.t end end ; functor AstAtoms (): AST_ATOMS = struct structure Longcon = Longid () structure Longvid = struct structure L = Longid () open L val longc = Longcon.x end end; structure AstCore = AstAtoms () : AST_ATOMS; polyml-5.6/Tests/Succeed/Test053.ML000066400000000000000000000010271265146633400167700ustar00rootroot00000000000000(* Equality for datatypes in signatures is more complicated if type abbreviations or sharing constraints have set types to equality types. *) functor F(S: sig type t = int * int datatype s = X of t end) = struct fun f(x, y: S.s) = x = y end; signature Q = sig type a eqtype b end; functor F(S: sig structure R : Q sharing type R.a = R.b datatype s = X of R.a end) = struct fun f(x, y: S.s) = x = y end; functor F(S: sig eqtype r structure R : Q where type a = r datatype s = X of R.a end) = struct fun f(x, y: S.s) = x = y end; polyml-5.6/Tests/Succeed/Test054.ML000066400000000000000000000002351265146633400167710ustar00rootroot00000000000000(* This segfaulted on x86-64 with 5.3rc1 *) datatype ('a, 'b, 'c, 'd, 'e, 'f, 'g) t = X of 'a | Y of 'b; (X 1: (int, int, int, int, int, int, int) t) = X 1; polyml-5.6/Tests/Succeed/Test055.ML000066400000000000000000000003711265146633400167730ustar00rootroot00000000000000(* This should fail because it is illegal to redeclare 'a when it is bound explicitly or implicitly in an outer scope. *) (* That was a misunderstanding. This is actually legal. *) fun x () = let val 'a id: 'a->'a = fn z => z in id end: 'a->'a; polyml-5.6/Tests/Succeed/Test056.ML000066400000000000000000000005171265146633400167760ustar00rootroot00000000000000(* Checks on free type variables arising from expansive expressions. *) functor F() = struct fun f i = i fun z x = (f f) x end; structure Q = F(); Q.z 1; (* This is acceptable because the signature coerces the type to a monotype. *) structure S: sig val z: int -> int end = struct fun f i = i val z = f f end; polyml-5.6/Tests/Succeed/Test057.ML000066400000000000000000000012521265146633400167740ustar00rootroot00000000000000(* Check that line buffering and no buffering work correctly. *) val temp = OS.FileSys.tmpName(); val (writer, _) = TextIO.StreamIO.getWriter(TextIO.getOutstream(TextIO.openOut temp)); val sLine = TextIO.StreamIO.mkOutstream(writer, IO.LINE_BUF); val sNone = TextIO.StreamIO.mkOutstream(writer, IO.NO_BUF); (TextIO.StreamIO.output(sLine, "First line \n line "); TextIO.StreamIO.output(sNone, "Second")); TextIO.StreamIO.flushOut sLine; let open TextPrimIO val WR { close, ... } = writer in close () end; val sTxt = TextIO.openIn temp; val s = TextIO.inputAll sTxt; TextIO.closeIn sTxt; if s = "First line \nSecond line " then () else raise Fail "failed"; OS.FileSys.remove temp; polyml-5.6/Tests/Succeed/Test058.ML000066400000000000000000000021521265146633400167750ustar00rootroot00000000000000(* include must copy values, exceptions and, with the latest changes, value constructors. *) signature S1 = sig val x : int type t datatype s = A | B of t | C of int val y : int end; signature S2 = sig val a: int include S1 val b : int end; functor F(Q: S2) = struct fun f (Q.A) = Q.x | f (Q.B _) = Q.b | f (Q.C i) = i datatype s = datatype Q.s end; structure P = F(struct val x = 1; type t = bool datatype s = A | B of t | C of int; val y = 3; val a = 4 val b = 5 end); if P.f(P.A) = 1 then () else raise Fail "WRONG"; signature S2 = sig val a: int include sig val x : int type t datatype s = A | B of t | C of int val y : int end val b : int end; functor F(Q: S2) = struct fun f (Q.A) = Q.x | f (Q.B _) = Q.b | f (Q.C i) = i datatype s = datatype Q.s end; structure P = F(struct val x = 1; type t = bool datatype s = A | B of t | C of int; val y = 3; val a = 4 val b = 5 end); if P.f(P.A) = 1 then () else raise Fail "WRONG"; polyml-5.6/Tests/Succeed/Test059.ML000066400000000000000000000004771265146633400170060ustar00rootroot00000000000000(* This caused an exception in the code generator. *) local val x = ref 0 in fun f i = (if not false then x:= i else(); "hello") end; val x = ref 0; fun f i = ( if (if not false then (x:= i; !x = i) else true) then 1 else 0; "hello"); fun f i = ( if not false andalso (x:= i; !x = i) then 1 else 0; "hello"); polyml-5.6/Tests/Succeed/Test060.ML000066400000000000000000000003061265146633400167650ustar00rootroot00000000000000(* This was forbidden in ML90 but is legal in ML97. *) functor F( S: sig eqtype s datatype t = C of int->int sharing type s = t end ) = struct end; polyml-5.6/Tests/Succeed/Test061.ML000066400000000000000000000002311265146633400167630ustar00rootroot00000000000000(* This is ok. *) fun x () = let val id: 'a->'a = fn z => z in id id end; (* This is ok. *) fun x () = let val id: 'a->'a = fn z => z in id end: 'a->'a; polyml-5.6/Tests/Succeed/Test062.ML000066400000000000000000000005321265146633400167700ustar00rootroot00000000000000infix ++ +++; fun a ++ b = a ^ b; fun a +++ b = b ^ a; val x = "a" ++ "b" +++ "c"; (* This next has changed in ML97. In ML90 two different operators always associated to the left. *) infixr ++ +++; fun a ++ b = a ^ b; fun a +++ b = b ^ a; val y = "a" ++ "b" +++ "c"; (* In ML90 x and y are the same. *) if x = y then raise Size else (); polyml-5.6/Tests/Succeed/Test063.ML000066400000000000000000000001411265146633400167650ustar00rootroot00000000000000(* An example from the Definition. This is now legal. *) datatype t = f; val rec f = fn x => x; polyml-5.6/Tests/Succeed/Test064.ML000066400000000000000000000002251265146633400167710ustar00rootroot00000000000000(* This is valid, but previously failed. *) fun f (i, d, q, r) = if r then i+d=q else i+d=q; if f(1, 2, 3, true) then "OK" else raise Fail "WRONG"; polyml-5.6/Tests/Succeed/Test065.ML000066400000000000000000000005641265146633400170000ustar00rootroot00000000000000(* Example of datatype replication from the Definition of Standard ML. *) signature MYBOOL = sig type bool val xor: bool * bool -> bool end; structure MyBool: MYBOOL = struct datatype bool = datatype bool (* from the inital basis *) fun xor (true, false) = true | xor (false, true) = true | xor _ = false end; val x = MyBool.xor(true, false); polyml-5.6/Tests/Succeed/Test066.ML000066400000000000000000000002461265146633400167760ustar00rootroot00000000000000(* Example of datatype replication from the Definition of Standard ML. *) datatype t = C | D; signature SIG = sig datatype t = datatype t val f : t -> t end; polyml-5.6/Tests/Succeed/Test067.ML000066400000000000000000000002531265146633400167750ustar00rootroot00000000000000(* Example of datatype replication from the Definition of Standard ML. *) datatype t0 = C; structure A: sig type t val C: t end = struct datatype t = datatype t0 end; polyml-5.6/Tests/Succeed/Test068.ML000066400000000000000000000003141265146633400167740ustar00rootroot00000000000000(* Check for special cases of single character strings. *) if StringCvt.padLeft #"O" 2 "K" = "OK" then () else raise Fail "wrong"; if StringCvt.padRight #"K" 2 "O" = "OK" then () else raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test069.ML000066400000000000000000000004451265146633400170020ustar00rootroot00000000000000(* This failed with the latest changes. We need "open" to process the constructor list of a datatype. *) functor F(S: sig type s datatype t = A | B of s end) = struct open S datatype p = datatype t end; structure S = F(type s = int*int datatype t = A | B of int*int); S.A; polyml-5.6/Tests/Succeed/Test070.ML000066400000000000000000000007461265146633400167760ustar00rootroot00000000000000(* Examples of type definitions in which unwrapping the type construction gets back to a type variable. This used to work for a single level but has now been fixed for arbitrary levels. *) type 'a t = 'a; let val f : 'a -> 'a t t t t = fn x => x in f 1 end; type ('a,'b) x = 'a; let val f : 'a -> (('a, bool) x, int) x = fn x => x in f 1 end; (* Discovered another example. *) let val f : 'a -> (('a, bool) x, int) x = fn x => x fun g () = if true then f 1 else f 2 in g end; polyml-5.6/Tests/Succeed/Test071.ML000066400000000000000000000006621265146633400167740ustar00rootroot00000000000000(* Code-generation bug. *) let fun f x = if x = 1 then "a" else if x = 2 then "b" else if x = 3 then "c" (* Note duplication of the next case. *) else if x = 6 then "d" else if x = 6 then "f" else (* Missing case here *) if x = 8 then "h" else if x = 9 then "i" else if x = 10 then "j" else if x = 11 then "k" else "l"; in if f 8 = "h" andalso f 6 = "d" andalso f 7 = "l" then "OK" else raise Fail "FAIL" end; polyml-5.6/Tests/Succeed/Test072.ML000066400000000000000000000010711265146633400167700ustar00rootroot00000000000000(* Newly created files should not have execute permission. Note: this only applies to Unix. The definition of OS.FileSys.access says that it should accept but ignore A_EXEC if it doesn't make sense. *) if RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (0, 0) <> 0 then () (* Windows *) else let val fileName = OS.FileSys.tmpName(); open TextIO OS.FileSys val f = openOut fileName in output(f, "hello\n"); closeOut f; let val isExecute = access(fileName, [A_EXEC]) in remove fileName; if isExecute then raise Fail "FAIL" else () end end; polyml-5.6/Tests/Succeed/Test073.ML000066400000000000000000000003241265146633400167710ustar00rootroot00000000000000(* Side-effects should still be performed even if the result is known. *) val r = ref false; fun g b = r := b; fun f s = (g s; true); fun p s = not (f s); val _ = p true; if ! r then () else raise Fail "Wrong"; polyml-5.6/Tests/Succeed/Test074.ML000066400000000000000000000010671265146633400167770ustar00rootroot00000000000000(* this structure compiles OK *) structure HashTable = struct type hashedstring = string fun hash s = s fun unhash s = s end; (* This structure reports Exception- InternalError: incrUseCount: no entry 2 raised while compiling *) structure Prettyprinter = struct datatype printmode = compressed | uncompressed | verbose fun print mode = let fun printid s = (case mode of compressed => HashTable.hash s | uncompressed => HashTable.unhash s | verbose => HashTable.unhash s) in printid end end; polyml-5.6/Tests/Succeed/Test075.ML000066400000000000000000000012001265146633400167650ustar00rootroot00000000000000(* Some parsing problems. All of these were rejected by 4.1.1. *) (* This is valid but caused problems. I think it's a relic of SML90. *) type t = int signature S = sig end; (* This is valid. Empty specifications are legal. *) signature S = sig ; ; ; end; (* The syntax here is odd. It requires the word "type" to be repeated. That's to distinguish between signature T = sig ... end where type s = int and type t = bool and signature T = sig ... end where type s = int and S = S' In the latter case we're defining a new signature. *) signature T = sig type s type t end where type s = int and type t = bool and U = S; polyml-5.6/Tests/Succeed/Test076.ML000066400000000000000000000054401265146633400170000ustar00rootroot00000000000000(* Assorted tests on flexible records. Some should fail. *) let val f = #a val g = #b fun h x = let val i = f x and j = g x in 1 end val _ = h {a = 1, b = 2, c = 3} val _ = h {a = true, b = [], c = 0.0 } in 1 end; let fun f {a, ...} = a fun g {a, b} = a fun h x = let val i = f x and j = g x in 1 end in 1 end; local val f = #a val g = #b fun h (x as {a, b, ...}) = let val i = f x and j = g x in 1 end val _ = h {a = 1, b = 2, c = 3} val _ = h {a = true, b = [], c = 0.0 } in val h = h end; (* flexrecord2 *) val _ = let val g = #foo val _ = g {foo = 13} val _ = g {foo = "yes"} in () end; (* flexrecord2 *) (* flexrecord3 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = 1.0} in () end; (* flexrecord3 *) (* flexrecord4 *) val _ = let val g = #foo val _ = g {foo = 13, goo = 1.0} val _ = g {foo = "yes", goo = false} in () end; (* flexrecord4 *) local val g = #b fun f (x as {a, ...}) = if x = x then g x else g x val _ = f{a=1, b=0, c = true} in val f = f end; let fun g (x as {b,...}) = x fun i (x as {a,b,...}) = g (if true then g x else g {a=2, b = 1, c=3}) in 1 end; (* Setting the generic has an effect on an instance constrained by value polymorphism. Both foo and bar in g have types which are free variables. *) local val f = #foo val g = valOf o f val _ = f {foo=0, bar=1} in val f = f and g = g end; local val f = #foo val g = (valOf: int option -> int) o f val _ = f {foo=0, bar=1} in val f = f and g = g end; local val f = #foo val g = valOf o f val _ = f {foo=0, bar=1} val _ = g {foo=SOME 0, bar = true} in val f = f and g = g end; (* Check that equality is inherited correctly. The equality attribute is a property of the generic as well as the instance. In this example the generic instance for g is an equality type but f is not. *) local fun f (x as {a, ...}) = (x=x; a) fun g {a, ...} = a fun h x = (g x; f x) val _ = h{a=1, b=2} in val f = f and g = g and h = h end; (* In this example it is the INSTANCE which is an equality type. ???? *) local val f = #foo fun g x = (x=x; f x) val _ = f{foo=0.0, bar=0.0} in val f = f and g = g end; (* This demonstrates that the flexible record can be made rigid anywhere withing the topdec. *) structure S = struct val f = #foo end val _ = S.f{foo=1, goo=2}; (* Shows that we can make the record rigid using the signature. *) structure S : sig val f : {a: 'a, b: 'b} -> 'a end = struct val f = #a end; polyml-5.6/Tests/Succeed/Test077.ML000066400000000000000000000001571265146633400170010ustar00rootroot00000000000000(* Code-generator bug. Found by Rob Arthan 28/11/01. *) fun f _ = let val (a, b) = raise Fail "bad" in a end; polyml-5.6/Tests/Succeed/Test078.ML000066400000000000000000000007731265146633400170060ustar00rootroot00000000000000(* Test simple TCP connection. There was a problem with "connect" on Windows. *) val x = INetSock.TCP.socket(): Socket.passive INetSock.stream_sock and y = INetSock.TCP.socket(): Socket.active INetSock.stream_sock; val SOME me = NetHostDB.getByName "localhost"; val localhost = NetHostDB.addr me; Socket.bind(x, INetSock.toAddr(localhost, 0)); Socket.listen(x, 5); let val (_, port) = INetSock.fromAddr(Socket.Ctl.getSockName x) in Socket.connect(y, INetSock.toAddr(localhost, port)) end; Socket.accept x; polyml-5.6/Tests/Succeed/Test079.ML000066400000000000000000000001071265146633400167760ustar00rootroot00000000000000(* This crashed in the Power PC version. *) Process.fork(fn () => ()); polyml-5.6/Tests/Succeed/Test080.ML000066400000000000000000000010241265146633400167650ustar00rootroot00000000000000PolyML.Compiler.printInAlphabeticalOrder := false; val (c, a, b) = (3,1,2); local structure s = struct val r = true val ww = false end in val w = 3 val aaa = 4 type t = int infix foo exception e structure f = s open f datatype s = x | y end; val a = 2 functor f () = struct end signature s = sig end type t = int functor q(): s = struct end; signature s = sig end and p = sig end; functor g () = struct end and f () = struct end and h () = struct end; fun f a b = 1 infix a fun f a b = 2 val z = f 0 0 and z' = 1 a 1; nonfix a; polyml-5.6/Tests/Succeed/Test081.ML000066400000000000000000000012761265146633400167770ustar00rootroot00000000000000(* Reading very long string. This didn't fail but just took a long time since the process was quadratic in the length of the string rather than linear. *) (* This code writes a very long string to a temporary file and then compiles it. *) let val fname = OS.FileSys.tmpName(); val f = TextIO.openOut fname; val _ = TextIO.output(f, "val _ = \"\\\n"); fun outlines n = if n >= 1000 then () else (TextIO.output(f, "\\A long line-A long line-A long line-A long line-A long line-A long line-A long line-\\n\\"); outlines(n+1)); in outlines 0; TextIO.output(f, "\\\";"); TextIO.closeOut f; use fname; OS.FileSys.remove fname end; polyml-5.6/Tests/Succeed/Test082.ML000066400000000000000000000012771265146633400170010ustar00rootroot00000000000000(* Variant of p060. This tests the error when the connection is refused. *) val x = INetSock.TCP.socket(): Socket.passive INetSock.stream_sock and y = INetSock.TCP.socket(): Socket.active INetSock.stream_sock; val SOME me = NetHostDB.getByName "localhost"; val localhost = NetHostDB.addr me; Socket.bind(x, INetSock.toAddr(localhost, 0)); (* Socket.listen(x, 5); *) ( let val (_, port) = INetSock.fromAddr(Socket.Ctl.getSockName x) in Socket.connect(y, INetSock.toAddr(localhost, port)); (* Shouldn't get here. *) raise Fail "wrong" end ) handle OS.SysErr(_, SOME e) => if e = valOf(OS.syserror "ECONNREFUSED") then () else raise Fail "bad error"; (* We could also get ECONNABORTED here perhaps. *) polyml-5.6/Tests/Succeed/Test083.ML000066400000000000000000000030571265146633400170000ustar00rootroot00000000000000(* Test of polling and non-blocking sockets. *) (* Updated to the new non-blocking calls. *) fun verify true = () | verify false = raise Fail "wrong"; val x = INetSock.TCP.socket(): Socket.passive INetSock.stream_sock and y = INetSock.TCP.socket(): Socket.active INetSock.stream_sock; val SOME me = NetHostDB.getByName "localhost"; val localhost = NetHostDB.addr me; Socket.bind(x, INetSock.toAddr(localhost, 0)); Socket.listen(x, 5); Socket.acceptNB x; val xPoll = valOf(OS.IO.pollDesc(Socket.ioDesc x)) and yPoll = valOf(OS.IO.pollDesc(Socket.ioDesc y)); fun printPoll(p, l) = let open OS.IO in (if isIn p then ["In"] else []) @ (if isOut p then ["Out"] else []) @ (if isPri p then ["Pri"] else []) @ l end; verify(null(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn xPoll, OS.IO.pollOut xPoll], SOME(Time.fromSeconds 1))))); let val p1 = List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn yPoll, OS.IO.pollOut yPoll], SOME(Time.fromSeconds 1))) in (* This gives [] in Windows but ["Out"] on Linux*) verify(p1 = [] orelse p1 = ["Out"]) end; let val (_, port) = INetSock.fromAddr(Socket.Ctl.getSockName x) in Socket.connectNB(y, INetSock.toAddr(localhost, port)) end; verify(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn xPoll, OS.IO.pollOut xPoll], SOME(Time.fromSeconds 1))) = ["In"]); verify(List.foldl printPoll [] (OS.IO.poll([OS.IO.pollIn yPoll, OS.IO.pollOut yPoll], SOME(Time.fromSeconds 1))) = ["Out"]); val SOME(sock1, _) = Socket.acceptNB x; val NONE = Socket.acceptNB x; Socket.close sock1; Socket.close x; Socket.close y; polyml-5.6/Tests/Succeed/Test084.ML000066400000000000000000000004201265146633400167700ustar00rootroot00000000000000(* Examples from the Revised Definition p90 These examples are valid in ML97 but not in ML90. *) val f = (fn x => x) (fn x => x) structure A = struct end val y = f 7 ; structure A: sig val f: int->int end = struct val f = (fn x => x) (fn x => x) end ; polyml-5.6/Tests/Succeed/Test085.ML000066400000000000000000000005121265146633400167730ustar00rootroot00000000000000(* Minimal version of example program that produced Subscript exception in SVN 913. *) structure A = struct structure B = struct datatype t = X end end (* No semicolon here. *) open A; (* Semicolon here. *) B.X; (* Raised Subscript exception. *) PolyML.prettyRepresentation (B.X, 2); (* Raised InternalError. *) polyml-5.6/Tests/Succeed/Test086.ML000066400000000000000000000014531265146633400170010ustar00rootroot00000000000000(* Tests on coercions that apply between structures and signatures. *) functor F(): sig val a: exn and b: string->exn val checkA: (unit -> unit) -> unit val checkB: (unit -> unit) -> string type t val c: t and d: int->t val checkC: t -> unit and checkD: t -> unit end = struct exception a and b of string datatype t = c | d of int fun checkA f = f() handle a => () fun checkB f = (f(); "bad") handle b s => s fun checkC c = () | checkC _ = raise Fail "bad" fun checkD (d 1) = () | checkD _ = raise Fail "bad" end; structure S = F(); S.checkA(fn () => raise S.a); if S.checkB(fn () => raise S.b "test") = "test" then () else raise Fail "failed"; S.checkC S.c; S.checkD (S.d 1); polyml-5.6/Tests/Succeed/Test087.ML000066400000000000000000000006231265146633400170000ustar00rootroot00000000000000(* Tests for handling of complex polymorphic declarations. *) let fun f x = x val c = (f, f) val (a, b) = c in a(b 1) end; let val c = (nil, nil) fun f(a::_, b::_) = a+b | f _ = 0 in f c end; let val a = { x=NONE, y=NONE } fun f {x=SOME (x: int), y=SOME(y: int) } = x + y | f _ = 0 in f a end; let val SOME f = SOME (fn x => x) in f (f 1) end; polyml-5.6/Tests/Succeed/Test088.ML000066400000000000000000000021011265146633400167720ustar00rootroot00000000000000(* Some more cases of polymorphism conversion. *) (* This changes the polymorphism at some level. *) structure S: sig type 'a t val x: 'a t val f : 'a t -> int val g: int -> 'a t end = struct type 'a t = int val x: 'a t = 1 fun f (n: int): 'a t = n (* int -> 'a t*) fun g (x :'a t): int = x (* 'a t -> int *) end; if S.x = 1 then () else raise Fail "Error"; if S.f S.x = 1 then () else raise Fail "Error"; (* Slightly different version that completely hides the relationship with int. *) structure S:> sig type 'a t val x: 'a t val f : 'a t -> int val g: int -> 'a t end = struct type 'a t = int val x: 'a t = 1 fun f (n: int): 'a t = n (* int -> 'a t*) fun g (x :'a t): int = x (* 'a t -> int *) end; val x = S.x; if S.f x = 1 then () else raise Fail "Error"; if S.f S.x = 1 then () else raise Fail "Error"; (* The signature adds polymorphism to a monomorphic function. *) structure Dispatch: sig type 'a union val Char : word -> 'a union; end = struct type 'a union = word fun Char (x:word) : 'a union = x; end; polyml-5.6/Tests/Succeed/Test089.ML000066400000000000000000000011501265146633400167760ustar00rootroot00000000000000(* Test to construct polytype from type abbreviation by opaque matching. *) structure S:> sig eqtype 'a t val mkT: 'a -> 'a t end = struct type 'a t = 'a fun mkT x = x end; PolyML.makestring(S.mkT 1); (* Check the pretty-printer. *) if S.mkT 1 = S.mkT 1 then () else raise Fail "error"; if S.mkT 1 = S.mkT 2 then raise Fail "error" else (); (* And from datatype. *) structure S:> sig eqtype 'a t val mkT: 'a -> 'a t end = struct datatype 'a t = X of 'a val mkT = X end; PolyML.makestring(S.mkT 1); if S.mkT 1 = S.mkT 1 then () else raise Fail "error"; if S.mkT 1 = S.mkT 2 then raise Fail "error" else (); polyml-5.6/Tests/Succeed/Test090.ML000066400000000000000000000011351265146633400167710ustar00rootroot00000000000000(* Exporting datatype constructors from structures. *) structure T1 = struct datatype f = A | B end; open T1; structure T2: sig datatype f = A | B end = struct datatype f = A | B end; open T2; (* Explicit signatures cannot rebind constructors but that doesn't apply to the result if there's no signature. *) structure T3 = struct datatype f = A of bool | B datatype g = A of int end; open T3; A 1; datatype t = datatype f; A true; functor F1() = struct datatype f = A of bool | B datatype g = A of int end; structure T4 = F1(); open T4; A 1; datatype t = datatype f; A true; polyml-5.6/Tests/Succeed/Test091.ML000066400000000000000000000010441265146633400167710ustar00rootroot00000000000000(* Problem handling polymorphism. *) fun q () = let fun f (x, y) = (PolyML.print(x ()); PolyML.print(y ()); ()) and g x = f (x, fn () => raise Fail "bad") in f (fn () => true, fn () => false); f (fn () => 1, fn () => 1) end; q(); fun q () = let fun f (x, y) = (PolyML.print(x ()); PolyML.print(y ()); ()) and g x = f (x, fn () => raise Fail "bad") in f (fn () => true, fn () => false); f (fn () => 1, fn () => 1); g (fn _ => 4) end; (q(); raise Fail "wrong") handle Fail "bad" => () | _ => raise Fail "wrong"; polyml-5.6/Tests/Succeed/Test092.ML000066400000000000000000000002071265146633400167720ustar00rootroot00000000000000(* Datatype replication should export the constructors from an abstype. *) abstype t = X with datatype p = datatype t end; val q = X; polyml-5.6/Tests/Succeed/Test093.ML000066400000000000000000000001261265146633400167730ustar00rootroot00000000000000(* Structure test *) structure S: sig datatype t = X end = struct datatype t = X end; polyml-5.6/Tests/Succeed/Test094.ML000066400000000000000000000013021265146633400167710ustar00rootroot00000000000000(* The code-generator rewrites if..then into indexed cases. This is a check that it correctly ignores duplicates. *) fun f i = if i = 0 then 0 else if i = 1 then 1 else if i = 2 then 2 else if i = 3 then 3 else if i = 4 then 4 else if i = 5 then 5 else if i = 6 then 6 else if i = 7 then 7 else if i = 8 then 8 else if i = 0 then raise Fail "bad" else if i = 1 then raise Fail "bad" else if i = 2 then raise Fail "bad" else if i = 3 then raise Fail "bad" else if i = 4 then raise Fail "bad" else if i = 5 then raise Fail "bad" else if i = 6 then raise Fail "bad" else 7; fun test n = if n = 8 then () else (f n; test(n+1)); test 0; polyml-5.6/Tests/Succeed/Test095.ML000066400000000000000000000007051265146633400170000ustar00rootroot00000000000000(* This caused a problem at one stage. When constructing the optimised code for pattern matching we have to merge multiple occurrences of the same special constant and that requires the equality function to be evaluated at compile-time. This was picking up the wrong equality function. *) structure S = struct type addrs = word fun f (n: word, ic: addrs list) = case (n + hd ic) of 0w1 => 1 | _ => 2 end; polyml-5.6/Tests/Succeed/Test096.ML000066400000000000000000000011541265146633400170000ustar00rootroot00000000000000(* Inlined loops with more loop variables than registers to hold all of them, at least on X86/32. This was originally just a coverage test but it turned out to be broken in 5.3 and earlier. Since this will go into an infinite loop there's an explicit check here. *) if PolyML.Compiler.compilerVersionNumber <= 530 then raise Fail "Will loop" else (); PolyML.Compiler.maxInlineSize := 100; fun f x = let fun f (i, j, k, l, m, n, p, q) = if i = 10 then q else f(i+1, j+1, k+1, l+1, m+1, n+1, p+1, q+1) in f(x, x+1, x+2, x+3, x+4, x+5, x+6, x+7) end; if f 1 = 17 then () else raise Fail "failed"; polyml-5.6/Tests/Succeed/Test097.ML000066400000000000000000000056021265146633400170030ustar00rootroot00000000000000(* Tests for functions added to the Array and ArraySlice structures. *) fun check f = if f() then () else raise Fail "Wrong"; val a = Array.tabulate (10, fn i => i); check(fn () => Array.vector a = Vector.fromList(List.tabulate(10, fn i => i))); check(fn () => Array.findi (fn (_, 3) => true | _ => false) a = SOME(3, 3)); check(fn () => not(isSome(Array.findi (fn (_, 11) => true | _ => false) a))); check(fn () => Array.find (fn 3 => true | _ => false) a = SOME 3); check(fn () => not(isSome(Array.find (fn 11 => true | _ => false) a))); check(fn () => Array.exists (fn 3 => true | _ => false) a); check(fn () => not(Array.exists (fn 11 => true | _ => false) a)); check(fn () => not(Array.all (fn 3 => true | _ => false) a)); check(fn () => Array.all (fn x => x < 10) a); check(fn () => not(Array.all (fn x => x < 9) a)); check(fn () => Array.collate Int.compare (a, a) = EQUAL); val b = Array.array(10, 0); check(fn () => Array.vector b = Vector.fromList(List.tabulate(10, fn _ => 0))); Array.copy{src = a, dst=b, di=0}; check(fn () => Array.vector b = Vector.fromList(List.tabulate(10, fn i => i))); check(fn () => (Array.copy{src = a, dst=b, di=1}; false) handle Subscript => true); check(fn () => Array.collate Int.compare (a, b) = EQUAL); Array.update(a, 9, 10); check(fn () => Array.collate Int.compare (a, b) = GREATER); Array.update(b, 2, 11); check(fn () => Array.collate Int.compare (a, b) = LESS); check(fn () => Array.collate Int.compare (Array.array(0, 0), Array.array(0, 0)) = EQUAL); check(fn () => Array.collate Int.compare (Array.array(0, 0), a) = LESS); check(fn () => Array.collate Int.compare (a, Array.array(0, 0)) = GREATER); check(fn () => Array.collate Int.compare (Array.array(1, 0), a) = LESS); check(fn () => Array.collate Int.compare (Array.array(1, 1), a) = GREATER); val sa = ArraySlice.slice(a, 2, NONE); val sb = ArraySlice.slice(a, 6, SOME 3); check(fn () => ArraySlice.vector sa = Vector.fromList [2, 3, 4, 5, 6, 7, 8, 10]); check(fn () => ArraySlice.vector sb = Vector.fromList[6, 7, 8]); check(fn () => (ArraySlice.slice(a, 6, SOME 5); false) handle Subscript => true); check(fn () => ArraySlice.findi(fn (_, 3) => true | _ => false) sa = SOME(1, 3)); check(fn () => not(isSome(ArraySlice.findi(fn (_, 3) => true | _ => false) sb))); check(fn () => not(ArraySlice.all (fn x => x < 9) sa)); check(fn () => ArraySlice.all (fn x => x < 9) sb); ArraySlice.copy{src=sb, dst=a, di=1}; check(fn () => Array.vector a = Vector.fromList [0, 6, 7, 8, 4, 5, 6, 7, 8, 10]); (* Check for overlapping areas. *) ArraySlice.copy{src=sb, dst=a, di=7}; check(fn () => Array.vector a = Vector.fromList [0, 6, 7, 8, 4, 5, 6, 6, 7, 8]); check(fn () => ArraySlice.vector sb = Vector.fromList[6, 6, 7]); val sc = ArraySlice.slice(a, 4, SOME 3); check(fn () => ArraySlice.vector sc = Vector.fromList[4, 5, 6]); ArraySlice.copy{src=sc, dst=a, di=3}; check(fn () => Array.vector a = Vector.fromList [0, 6, 7, 4, 5, 6, 6, 6, 7, 8]); polyml-5.6/Tests/Succeed/Test098.ML000066400000000000000000000065251265146633400170110ustar00rootroot00000000000000(* Tests for Word8Array and Word8ArraySlice. *) fun check f = if f() then () else raise Fail "Wrong"; val a = Word8Array.tabulate (10, fn i => Word8.fromInt i); check(fn () => Word8Array.vector a = Word8Vector.fromList(List.tabulate(10, Word8.fromInt))); check(fn () => Word8Array.findi (fn (_, 0w3) => true | _ => false) a = SOME(3, 0w3)); check(fn () => not(isSome(Word8Array.findi (fn (_, 0w11) => true | _ => false) a))); check(fn () => Word8Array.find (fn 0w3 => true | _ => false) a = SOME 0w3); check(fn () => not(isSome(Word8Array.find (fn 0w11 => true | _ => false) a))); check(fn () => Word8Array.exists (fn 0w3 => true | _ => false) a); check(fn () => not(Word8Array.exists (fn 0w11 => true | _ => false) a)); check(fn () => not(Word8Array.all (fn 0w3 => true | _ => false) a)); check(fn () => Word8Array.all (fn x => x < 0w10) a); check(fn () => not(Word8Array.all (fn x => x < 0w9) a)); check(fn () => Word8Array.collate Word8.compare (a, a) = EQUAL); val b = Word8Array.array(10, 0w0); check(fn () => Word8Array.vector b = Word8Vector.fromList(List.tabulate(10, fn _ => 0w0))); Word8Array.copy{src = a, dst=b, di=0}; check(fn () => Word8Array.vector b = Word8Vector.fromList(List.tabulate(10, Word8.fromInt))); check(fn () => (Word8Array.copy{src = a, dst=b, di=1}; false) handle Subscript => true); check(fn () => Word8Array.collate Word8.compare (a, b) = EQUAL); Word8Array.update(a, 9, 0w10); check(fn () => Word8Array.collate Word8.compare (a, b) = GREATER); Word8Array.update(b, 2, 0w11); check(fn () => Word8Array.collate Word8.compare (a, b) = LESS); check(fn () => Word8Array.collate Word8.compare (Word8Array.array(0, 0w0), Word8Array.array(0, 0w0)) = EQUAL); check(fn () => Word8Array.collate Word8.compare (Word8Array.array(0, 0w0), a) = LESS); check(fn () => Word8Array.collate Word8.compare (a, Word8Array.array(0, 0w0)) = GREATER); check(fn () => Word8Array.collate Word8.compare (Word8Array.array(1, 0w0), a) = LESS); check(fn () => Word8Array.collate Word8.compare (Word8Array.array(1, 0w1), a) = GREATER); val sa = Word8ArraySlice.slice(a, 2, NONE); val sb = Word8ArraySlice.slice(a, 6, SOME 3); check(fn () => Word8ArraySlice.vector sa = Word8Vector.fromList [0w2, 0w3, 0w4, 0w5, 0w6, 0w7, 0w8, 0w10]); check(fn () => Word8ArraySlice.vector sb = Word8Vector.fromList[0w6, 0w7, 0w8]); check(fn () => (Word8ArraySlice.slice(a, 6, SOME 5); false) handle Subscript => true); check(fn () => Word8ArraySlice.findi(fn (_, 0w3) => true | _ => false) sa = SOME(1, 0w3)); check(fn () => not(isSome(Word8ArraySlice.findi(fn (_, 0w3) => true | _ => false) sb))); check(fn () => not(Word8ArraySlice.all (fn x => x < 0w9) sa)); check(fn () => Word8ArraySlice.all (fn x => x < 0w9) sb); Word8ArraySlice.copy{src=sb, dst=a, di=1}; check(fn () => Word8Array.vector a = Word8Vector.fromList [0w0, 0w6, 0w7, 0w8, 0w4, 0w5, 0w6, 0w7, 0w8, 0w10]); (* Check for overlapping areas. *) Word8ArraySlice.copy{src=sb, dst=a, di=7}; check(fn () => Word8Array.vector a = Word8Vector.fromList [0w0, 0w6, 0w7, 0w8, 0w4, 0w5, 0w6, 0w6, 0w7, 0w8]); check(fn () => Word8ArraySlice.vector sb = Word8Vector.fromList[0w6, 0w6, 0w7]); val sc = Word8ArraySlice.slice(a, 4, SOME 3); check(fn () => Word8ArraySlice.vector sc = Word8Vector.fromList[0w4, 0w5, 0w6]); Word8ArraySlice.copy{src=sc, dst=a, di=3}; check(fn () => Word8Array.vector a = Word8Vector.fromList [0w0, 0w6, 0w7, 0w4, 0w5, 0w6, 0w6, 0w6, 0w7, 0w8]); polyml-5.6/Tests/Succeed/Test099.ML000066400000000000000000000057031265146633400170070ustar00rootroot00000000000000(* Tests for functions added to the CharArray and CharArraySlice structures. *) fun check f = if f() then () else raise Fail "Wrong"; val a = CharArray.tabulate (10, fn i => Char.chr(i+ Char.ord #"0")); check(fn () => CharArray.vector a = "0123456789"); check(fn () => CharArray.findi (fn (_, #"3") => true | _ => false) a = SOME(3, #"3")); check(fn () => not(isSome(CharArray.findi (fn (_, #"A") => true | _ => false) a))); check(fn () => CharArray.find (fn #"3" => true | _ => false) a = SOME #"3"); check(fn () => not(isSome(CharArray.find (fn #"A" => true | _ => false) a))); check(fn () => CharArray.exists (fn #"3" => true | _ => false) a); check(fn () => not(CharArray.exists (fn #"A" => true | _ => false) a)); check(fn () => not(CharArray.all (fn #"3" => true | _ => false) a)); check(fn () => CharArray.all (fn x => x < #"A") a); check(fn () => not(CharArray.all (fn x => x < #"9") a)); check(fn () => CharArray.collate Char.compare (a, a) = EQUAL); val b = CharArray.array(10, #"0"); check(fn () => CharArray.vector b = CharVector.fromList(List.tabulate(10, fn _ => #"0"))); CharArray.copy{src = a, dst=b, di=0}; check(fn () => CharArray.vector b = "0123456789"); check(fn () => (CharArray.copy{src = a, dst=b, di=1}; false) handle Subscript => true); check(fn () => CharArray.collate Char.compare (a, b) = EQUAL); CharArray.update(a, 9, #"A"); check(fn () => CharArray.collate Char.compare (a, b) = GREATER); CharArray.update(b, 2, #"B"); check(fn () => CharArray.collate Char.compare (a, b) = LESS); check(fn () => CharArray.collate Char.compare (CharArray.array(0, #"0"), CharArray.array(0, #"0")) = EQUAL); check(fn () => CharArray.collate Char.compare (CharArray.array(0, #"0"), a) = LESS); check(fn () => CharArray.collate Char.compare (a, CharArray.array(0, #"0")) = GREATER); check(fn () => CharArray.collate Char.compare (CharArray.array(1, #"0"), a) = LESS); check(fn () => CharArray.collate Char.compare (CharArray.array(1, #"1"), a) = GREATER); val sa = CharArraySlice.slice(a, 2, NONE); val sb = CharArraySlice.slice(a, 6, SOME 3); check(fn () => CharArraySlice.vector sa = "2345678A"); check(fn () => CharArraySlice.vector sb = "678"); check(fn () => (CharArraySlice.slice(a, 6, SOME 5); false) handle Subscript => true); check(fn () => CharArraySlice.findi(fn (_, #"3") => true | _ => false) sa = SOME(1, #"3")); check(fn () => not(isSome(CharArraySlice.findi(fn (_, #"3") => true | _ => false) sb))); check(fn () => not(CharArraySlice.all (fn x => x < #"9") sa)); check(fn () => CharArraySlice.all (fn x => x < #"9") sb); CharArraySlice.copy{src=sb, dst=a, di=1}; check(fn () => CharArray.vector a = "067845678A"); (* Check for overlapping areas. *) CharArraySlice.copy{src=sb, dst=a, di=7}; check(fn () => CharArray.vector a = "0678456678"); check(fn () => CharArraySlice.vector sb = "667"); val sc = CharArraySlice.slice(a, 4, SOME 3); check(fn () => CharArraySlice.vector sc = "456"); CharArraySlice.copy{src=sc, dst=a, di=3}; check(fn () => CharArray.vector a = "0674566678"); polyml-5.6/Tests/Succeed/Test100.ML000066400000000000000000000004501265146633400167600ustar00rootroot00000000000000(* Bug in handling of polymorphic values. This produced an internal exception. *) local val q = op :: datatype s = S in fun p s = q (S, s) end; functor F() = struct datatype s = S end; local val q = op :: structure R = F() open R in fun p s = q (S, s) end; polyml-5.6/Tests/Succeed/Test101.ML000066400000000000000000000043371265146633400167710ustar00rootroot00000000000000(* Tests for various cases of arbitrary-precision arithmetic that require emulation. The tests depend on assumptions about how the compiler will generate code and may need changing in the future. *) fun check x = x orelse raise Fail "Test failed"; (* This is used to avoid constant folding in the compiler. *) fun I x = let val x = ref x in ! x end; (* The maximum short precision number. *) val maxShort = Word.toInt(Word.<<(0w1, Word.fromInt (Word.wordSize-1))-0w1); val minShort = ~maxShort-1; val aLong = maxShort+1; (* A long precision number. *) check(PolyML.objSize maxShort = 0 andalso PolyML.objSize minShort = 0 andalso PolyML.objSize aLong <> 0); fun f x = I x > 0; check(f maxShort); check(f aLong); fun f x = I x < aLong; check(f 0); check(not(f aLong)); fun f x = I x <= x; check(f aLong); fun f x y = let val (_, a) = I (0, x) in a < y end; check(f 0 1); check(f 0 aLong); fun f x = I x + 1; check(f maxShort = maxShort+1); (* Overflow check *) check(f aLong = aLong+1); fun f x = I x + aLong; check(f maxShort = maxShort+aLong); check(f aLong = aLong+aLong); fun f x = I x + x; check(f maxShort = maxShort*2); check(f aLong = aLong*2); fun f x y = let val (_, a) = I (0, x) in a + y end; check(f maxShort 1 = maxShort+1); check(f aLong 1 = aLong+1); fun f x = I x + 1; check(f maxShort = maxShort+1); (* Overflow check *) check(f aLong = aLong+1); fun f x = I x + aLong; check(f maxShort = maxShort+aLong); check(f aLong = aLong+aLong); fun f x = I x + x; check(f maxShort = maxShort*2); check(f aLong = aLong*2); fun f x y = let val (_, a) = I (0, x) in a + y end; check(f maxShort 1 = maxShort+1); check(f aLong 1 = aLong+1); fun f x = I x - 1; check(f minShort = minShort-1); (* Overflow check *) check(f aLong = aLong-1); fun f x = I x - aLong; check(f minShort = minShort-aLong); check(f 0 = ~aLong); fun f x y = I x - y; check(f minShort 1 = minShort-1); check(f 0 aLong = ~aLong); fun f x y = let val (_, a) = I (0, y) in I x - a end; check(f minShort 1 = minShort-1); check(f aLong 1 = aLong-1); fun f x = Real.fromInt(I x); check(Real.round(f 3) = 3); check(Real.round(f aLong) = aLong); fun f x = I x * 2; check(f aLong = aLong+aLong); check(f minShort = minShort+minShort); check(f maxShort = maxShort+maxShort); polyml-5.6/Tests/Succeed/Test102.ML000066400000000000000000000015121265146633400167620ustar00rootroot00000000000000(* A little bit of Isabelle that provoked a bug. The internal expansions of prod_ord were being treated as recursive. *) fun prod_ord a_ord b_ord ((x, y), (x', y')) = (case a_ord (x, x') of EQUAL => b_ord (y, y') | ord => ord); val int_ord = Int.compare; fun hd_ord f_ord (f, g) = prod_ord (prod_ord int_ord (prod_ord int_ord int_ord)) int_ord (f, g); (* (* It should be equivalent to this but only if the expansions of the arguments are done first. *) fun prod_ord8(a_ord, b_ord, x, y, x', y') = (case a_ord (x, x') of EQUAL => b_ord (y, y') | ord => ord); fun hd_ord5(f_ord, f, f', g, g') = prod_ord8(fn ((x, x'), (y, y')) => prod_ord8(int_ord, fn ((p, p'), (q, q')) => prod_ord8(int_ord, int_ord, p, q, p', q'), x, y, x', y'), int_ord, f, g, f', g'); *) polyml-5.6/Tests/Succeed/Test103.ML000066400000000000000000000015331265146633400167660ustar00rootroot00000000000000(* Code-generator bug in X86 development version. The stack adjustment is wrong. *) datatype cterm = Cterm of { thy_ref: int, t: int, T: int, maxidx: int, sorts: int}; PolyML.Compiler.maxInlineSize := 1; fun read_prop s = Cterm {maxidx = ~1, thy_ref = valOf(Int.fromString s), t = 0, T = 0, sorts = 0}; PolyML.Compiler.maxInlineSize := 40; val transitive_thm = ( let val qqq = ref 0 val xy = read_prop "123"; val yz = read_prop "124"; val xythm = let val _ = let val ct as Cterm {thy_ref, t, T, maxidx, sorts} = xy in if maxidx = ~1 then ct else Cterm {maxidx = t, thy_ref = thy_ref, t = t, T = T, sorts = sorts} end; in 0 end; in case xy of Cterm{sorts=0, ...} => () | _ => raise Fail "bad" end ) (*handle Match => raise Match*); polyml-5.6/Tests/Succeed/Test104.ML000066400000000000000000000014461265146633400167720ustar00rootroot00000000000000(* This caused an InternalError exception in the compiler. *) PolyML.Compiler.maxInlineSize := 80; type typ = string; type indexname = int; datatype term = Const of string * typ | Abs of string * typ * term | $ of term * term; infix 9 $; exception TERM of string * term list; fun dest_equals (Const ("==", _) $ t $ u) = (t, u) | dest_equals t = raise TERM ("dest_equals", [t]); fun term_depth (Abs (_, _, t)) = 1 + term_depth t | term_depth _ = 0; datatype thm = Thm of int * {maxidx: int, prop: term} fun rep_thm (Thm (_, args)) = args; val lhs_of_thm = #1 o dest_equals o #prop o rep_thm; fun make keyfun = let fun keypair x = (x, keyfun x) in map keypair end; fun sort_lhs_depths defs = let val keylist = make (term_depth o lhs_of_thm) defs in map #2 keylist end; polyml-5.6/Tests/Succeed/Test105.ML000066400000000000000000000013011265146633400167610ustar00rootroot00000000000000(* Another Isabelle crash: This caused a segfault. *) datatype term = Const of string * int | $ of term * term; PolyML.Compiler.maxInlineSize := 1; fun aeconv(t, u) = case (t, u) of (Const(s, _), Const(y, _)) => s = y | _ => false; PolyML.Compiler.maxInlineSize := 80; infix 9 $; exception TERM of string * term list; fun dest_equals (Const ("==", _) $ t $ u) = (t, u) | dest_equals t = raise TERM ("dest_equals", [t]); datatype thm = Thm of int * {tpairs: (term * term) list, prop: term}; fun is_trivial(Thm (_, {prop, ...})) = aeconv(dest_equals prop); fun doFilter raw_eqs = List.filter is_trivial raw_eqs; doFilter[Thm(1, {tpairs=[], prop=Const("==", 0) $ Const("a", 0) $ Const("a", 0)})]; polyml-5.6/Tests/Succeed/Test106.ML000066400000000000000000000002561265146633400167720ustar00rootroot00000000000000(* This produced an internal error exception because the equality attribute had been removed in the third pass. *) abstype t = T of int with fun eq a (b:t) = a = b end; polyml-5.6/Tests/Succeed/Test107.ML000066400000000000000000000046421265146633400167760ustar00rootroot00000000000000(* Bug found. Final references for the inner loop were being processed in the wrong order. *) PolyML.Compiler.maxInlineSize := 40; type location = { startPosition: int, endPosition: int }; datatype ptProperties = PTprint of string | PTparent of unit -> exportTree | PTpreviousSibling of unit -> exportTree | PTnextSibling of unit -> exportTree | PTfirstChild of unit -> exportTree withtype exportTree = location * ptProperties list datatype direction = Up | Down | Left | Right; fun find([], _) = NONE (* No change *) | find(PTparent p :: _, Up) = SOME p | find(PTpreviousSibling p :: _, Left) = SOME p | find(PTnextSibling p :: _, Right) = SOME p | find(PTfirstChild p :: _, Down) = SOME p | find(_ :: tl, dir) = find (tl, dir); fun navigateTo(searchLocation as {startOffset, endOffset}, lastParsetree as ({ startPosition, endPosition, ... }, tree)) = if startOffset = startPosition andalso endOffset = endPosition then (* We're there already. *) lastParsetree else if startOffset >= startPosition andalso endOffset <= endPosition then (* It's this node or a child. *) let val child = find(tree, Down) in (* See if the element we want is actually a child. *) case child of SOME child => let (* See which child it is. *) fun findChild(location as {startPosition, endPosition, ...}, child) = if startOffset >= startPosition andalso endOffset <= endPosition then SOME (location, child) else case find(child, Right) of NONE => NONE | SOME next => findChild(next()) in case findChild(child()) of NONE => lastParsetree (* In this *) | SOME child => navigateTo(searchLocation, child) end | NONE => lastParsetree (* No children. *) end else raise Fail "bad"; fun pos(s, e) = {startPosition=s, endPosition=e}: location; val n1 = (pos(1, 2), [PTprint("a")]); val n2 = (pos(3, 4), [PTprint("b"), PTnextSibling(fn () => n1)]); val n3 = (pos(1, 4), [PTprint("c"), PTfirstChild(fn()=>n2)]); case navigateTo({startOffset=1, endOffset=1}, n3) of ({endPosition = 2, startPosition = 1}, [PTprint "a"]) => () | _ => raise Fail "bad"; polyml-5.6/Tests/Succeed/Test108.ML000066400000000000000000000004251265146633400167720ustar00rootroot00000000000000(* Code generator bug. *) fun prod_ord a_ord b_ord ((x, y), (x', y')) = (case a_ord (x, x') of EQUAL => b_ord (y, y') | ord => ord); fun fast_term_ord (_: int*int) = EQUAL; val term2_ord = prod_ord fast_term_ord fast_term_ord; val ord = prod_ord fast_term_ord term2_ord; polyml-5.6/Tests/Succeed/Test109.ML000066400000000000000000000040211265146633400167670ustar00rootroot00000000000000(* This produced an InternalError exception. That check has been removed but the test has been included because it may be useful to revisit this. *) type polarity = int datatype rep = Atom of int * int | Struct of rep list | Vect of int * rep | Func of rep * rep ; exception REP of string * rep list; exception LIMIT of string * string; PolyML.Compiler.maxInlineSize := 1; fun card_of_rep (_: rep): int = (PolyML.print "card_of_rep"; raise Match); fun is_lone_rep (_: rep): bool = (PolyML.print "is_lone_rep"; raise Match); fun kk_case_switch _ = (PolyML.print "kk_case_switch"; raise Match); fun all_singletons_for_rep _ = (PolyML.print "all_singletons_for_rep"; raise Match); PolyML.Compiler.maxInlineSize := 60; structure S = struct exception E fun vect_from_rel_expr a b c d e = ( PolyML.print a; PolyML.print b; PolyML.print c; PolyML.print d; PolyML.print e; PolyML.print a; PolyML.print b; PolyML.print c; raise E ); fun lone_rep_fallback kk new_R old_R r = if old_R = new_R then r else let val card = card_of_rep old_R in if is_lone_rep old_R andalso is_lone_rep new_R andalso card = card_of_rep new_R then if card >= 4096 then raise LIMIT ("lone_rep_fallback", "too high cardinality (" ^ Int.toString card ^ ")") else kk_case_switch kk old_R new_R r (all_singletons_for_rep old_R) (all_singletons_for_rep new_R) else raise REP ("lone_rep_fallback", [old_R, new_R]) end and atom_from_rel_expr kk (x as (k, j0)) old_R r = case old_R of Func (R1, R2) => let val dom_card = card_of_rep R1 val R2' = case R2 of Atom _ => R2 | _ => Atom (card_of_rep R2, 0) in atom_from_rel_expr kk x (Vect (dom_card, R2')) (vect_from_rel_expr kk dom_card R2' old_R r) end | _ => lone_rep_fallback kk (Atom x) old_R r fun yy a kk x c d y = (if a then atom_from_rel_expr kk (c, d) else fn _ => raise Match) y end ; polyml-5.6/Tests/Succeed/Test110.ML000066400000000000000000000015711265146633400167660ustar00rootroot00000000000000(* Check integer conversion. *) fun verifyBase radix n = valOf(StringCvt.scanString (Int.scan radix)(Int.fmt radix n)) = n fun verify n = if verifyBase StringCvt.DEC n andalso verifyBase StringCvt.HEX n andalso verifyBase StringCvt.OCT n andalso verifyBase StringCvt.BIN n then () else raise Fail "failed"; (* Random number generator. From Isabelle. *) local fun rmod x y = x - y * Real.realFloor (x / y); val a = 16807.0; val m = 2147483647.0; val random_seed = ref 1.0; in fun random () = let val r = rmod (a * ! random_seed) m in random_seed := r; Real.floor r end end; fun doFor f 0 = () | doFor f n = (f(); doFor f (n-1)); verify 0; verify 1; verify ~1; verify 100000000000000000000000; verify 100000000000000000000001; verify 9051234567; doFor(fn () => (verify(random()); verify(~(random())))) 100; polyml-5.6/Tests/Succeed/Test111.ML000066400000000000000000000005231265146633400167630ustar00rootroot00000000000000(* Bug in X86 code-generator with "containers" that are not actually used. The container was being popped from the stack before the function was called resulting in a segfault. *) PolyML.Compiler.maxInlineSize := 1; fun f (x: int) = ((x, x)); fun h s = s+s; fun g y = let val a = ref 0 val _ = h y val _ = f y in ! a + y end; g 0; polyml-5.6/Tests/Succeed/Test112.ML000066400000000000000000000003251265146633400167640ustar00rootroot00000000000000(* Printing records as tuples. *) if PolyML.makestring {1=true} = "{1 = true}" then () else raise Fail "makestring"; if PolyML.makestring {1=true, 2=false} = "(true, false)" then () else raise Fail "makestring"; polyml-5.6/Tests/Succeed/Test113.ML000066400000000000000000000002571265146633400167710ustar00rootroot00000000000000(* Bug in reported in SVN 1182 by Phil Clayton *) datatype ''a t = A of ''a | B of int; B 1; (* Further check for nullary constructors. *) datatype ''a s = C of ''a | D; D; polyml-5.6/Tests/Succeed/Test114.ML000066400000000000000000000011051265146633400167630ustar00rootroot00000000000000(* Cut down version of bug reported by Phil Clayton in SVN 1180. *) structure RedBlackDict = struct type 'a maplet = string * 'a datatype colour = Red | Black datatype 'a tree = Node of 'a node | Tip withtype 'a node = 'a tree * colour * 'a maplet * 'a tree; datatype 'a map = Map of {t : 'a tree, bh : int}; fun min (Map {t, ...} : 'a map) : 'a maplet = ( let fun leftmost (l, _, A, _) = case l of Node n => leftmost n | Tip => A in case t of Node n => leftmost n | Tip => raise Empty end ) end; polyml-5.6/Tests/Succeed/Test115.ML000066400000000000000000000001751265146633400167720ustar00rootroot00000000000000(* Uncaught exceptions in a thread. Caused a segfault in SVN 1189 on X86. *) Thread.Thread.fork(fn () => raise Match, []); polyml-5.6/Tests/Succeed/Test116.ML000066400000000000000000000013771265146633400170000ustar00rootroot00000000000000(* This produced an InternalError exception in SVN 1192. *) structure Q = struct type t = int fun s _ = 0 end; (* There are three properties of this example which are needed to show the bug. There must be no result signature on the functor. There must be no semicolon between the functor declaration and the structure. There must be a result signature on the structure declaration. *) functor F(S: sig type t val s: string -> t end) = struct type t = S.t val s = S.s end (* N.B. No semicolon here. *) structure T: sig type t val s: string -> t end = F(Q) ; (* Additional check that F can be applied to more than one type. *) structure R = struct type t = string fun s _ = "hello" end; structure A: sig type t=string val s: string -> t end = F(R); polyml-5.6/Tests/Succeed/Test117.ML000066400000000000000000000012021265146633400167640ustar00rootroot00000000000000(* Bug in installing a pretty printer for datatypes with more than one type argument. Reported by Makarius in SVN 1193. *) datatype ('a, 'b) foo = Foo of 'a * 'b; PolyML.addPrettyPrinter (fn depth => fn (pretty1, pretty2) => fn Foo (x, y) => PolyML.PrettyBlock (2, false, [], [PolyML.PrettyString "FOO", PolyML.PrettyBreak (1, 0), PolyML.PrettyString "(", pretty1 (x, depth - 1), PolyML.PrettyString ",", PolyML.PrettyBreak (1, 0), pretty2 (y, depth - 1), PolyML.PrettyString ")"])); if PolyML.makestring(Foo(100, "abc")) = "FOO (100, \"abc\")" then () else raise Fail "pretty printing"; polyml-5.6/Tests/Succeed/Test118.ML000066400000000000000000000022671265146633400170010ustar00rootroot00000000000000(* This produced a "jump too large" exception on X86. *) (* The problem occurred because extending a pending branch requires five bytes for the 32-bit jump instruction and if the previous pending branches were less than five bytes apart extending the shortest branch might push the other branches outside the 8-bit range. *) datatype t = A1 | B1 | C1 | D1 | E1 | F1 | G1 | H1 | I1 | J1 | K1 | L1 | M1 | A2 | B2 | C2 | D2 | E2 | F2 | G2 | H2 | I2 | J2 | K2 | L2 | M2 | A3 | B3 | C3 | D3; fun f a b c = let val x = case a of A1 => c | B1 => b | C1 => c | D1 => b | E1 => c | F1 => b | G1 => c | H1 => b | I1 => c | J1 => b | K1 => c | L1 => b | M1 => c | A2 => c | B2 => b | C2 => c | D2 => b | E2 => c | F2 => b | G2 => c | H2 => b | I2 => (print "hello"; print "there"; c) | J2 => b | K2 => c | L2 => b | M2 => c | A3 => c | B3 => b | C3 => c | _ => c in x+c+b end; polyml-5.6/Tests/Succeed/Test119.ML000066400000000000000000000004101265146633400167660ustar00rootroot00000000000000(* Word.div and Word.mod on X86 left the contents of the dividend register untagged resulting in a crash if a GC happened before the register was reloaded. *) PolyML.Compiler.maxInlineSize := 1; fun f (a: Word.word) b = b mod a; (f 0w1 0w6; PolyML.fullGC()); polyml-5.6/Tests/Succeed/Test120.ML000066400000000000000000000002751265146633400167670ustar00rootroot00000000000000(* This deadlocked with pthreads but not on Windows. *) val w = let val x = SOME (ref 3) in Weak.weak x end; PolyML.fullGC (); case !w of NONE => () | SOME _ => raise Fail "Not removed"; polyml-5.6/Tests/Succeed/Test121.ML000066400000000000000000000014311265146633400167630ustar00rootroot00000000000000(* The rounding settings were not being carried over correctly between the RTS and compiled code. *) fun check x = if x then () else raise Fail "Wrong"; open IEEEReal; setRoundingMode(TO_POSINF); check(getRoundingMode() = TO_POSINF); val pos = 1.0/3.0; check(pos * 3.0 > 1.0); val neg = ~1.0/3.0; check(neg * 3.0 > ~1.0); setRoundingMode(TO_NEGINF); check(getRoundingMode() = TO_NEGINF); val pos = 1.0/3.0; check(pos * 3.0 < 1.0); val neg = ~1.0/3.0; check(neg * 3.0 < ~1.0); setRoundingMode(TO_ZERO); check(getRoundingMode() = TO_ZERO); val pos = 1.0/3.0; check(pos * 3.0 < 1.0); val neg = ~1.0/3.0; check(neg * 3.0 > ~1.0); check(Real.==(~neg, pos)); setRoundingMode(TO_NEAREST); check(getRoundingMode() = TO_NEAREST); val pos = 1.0/3.0; val neg = ~1.0/3.0; check(Real.==(~neg, pos)); polyml-5.6/Tests/Succeed/Test122.ML000066400000000000000000000036611265146633400167730ustar00rootroot00000000000000(* Real number bugs reported by Phil Clayton together with some additional tests. *) fun check x = x orelse raise Fail "Test failed"; let val a = Real.nextAfter(1.0, 2.0) in check(a > 1.0 andalso a < 2.0) (* This was actually a code-generator bug. *) end; (* The old version of the basis library documentation said that this should print the digits. That was removed before the book was published but not fixed in the source. *) check(IEEEReal.toString {class = IEEEReal.NAN, sign = false, digits = [1,2,3], exp = 0} = "nan"); val pNan = valOf(Real.fromDecimal { class = IEEEReal.NAN, sign = false, digits = [], exp = 0}) and mNan = valOf(Real.fromDecimal { class = IEEEReal.NAN, sign = true, digits = [], exp = 0}); check(not(Real.signBit pNan)); check(Real.signBit mNan); check(not(#sign(Real.toDecimal pNan))); check(#sign(Real.toDecimal mNan)); check(not(Real.signBit(abs(Real.posInf * 0.0)))); check(not(Real.signBit(abs(~ (Real.posInf * 0.0))))); check(not(Real.signBit(Real.abs(Real.posInf * 0.0)))); check(not(Real.signBit(Real.abs(~ (Real.posInf * 0.0))))); check(Real.fmt (StringCvt.SCI NONE) mNan = "nan"); check(Real.fmt (StringCvt.FIX NONE) mNan = "nan"); check(Real.fmt (StringCvt.GEN NONE) mNan = "nan"); check(Real.fmt StringCvt.EXACT mNan = "nan"); check(not (Real.isNan 0.0)); check(not (Real.isNan ~1.0)); check(not (Real.isNan Real.posInf)); check(not (Real.isNan Real.negInf)); check (Real.isNan pNan); check (Real.isNan mNan); check(Real.isFinite 0.0); check(not (Real.isFinite pNan)); check(not (Real.isFinite mNan)); check(not (Real.isFinite Real.posInf)); check(not (Real.isFinite Real.negInf)); (* The exceptions with invalid specifications should be raised when Real.fmt is applied to the spec. *) check((Real.fmt(StringCvt.SCI(SOME ~1)); false) handle Size => true); check((Real.fmt(StringCvt.FIX(SOME ~1)); false) handle Size => true); check((Real.fmt(StringCvt.GEN(SOME ~1)); false) handle Size => true); polyml-5.6/Tests/Succeed/Test123.ML000066400000000000000000000040721265146633400167710ustar00rootroot00000000000000(* The first part gives an internal error. *) local fun f {data, ...} = () fun g {base = {rows, cols, ...}, row:'a} = () fun h (reg as {base, row:int, ...}) = let val _ = f base (* Eventually, fixes base as {rows, cols, data} *) val _ = g reg (* Fixes reg as {base, row} *) in () end val tt : { rows: int, cols: int, data: string } -> unit = f in end; (* This part reports an Empty exception. *) structure Vector2 :> sig type 'a vector val sub: 'a vector * int * int -> 'a end = struct (* open IterateX*) fun badArg _ = raise Fail "bad" fun repeat f cnt init = let fun iter (n,v) = if n = cnt then v else iter(n+1,f(n,v)) in if cnt < 0 then badArg ("repeat","count < 0") else iter (0,init) end type 'a vector = { rows: int , cols: int , data: 'a Vector.vector } datatype traversal = RowMajor | ColMajor fun tabulate tr (r, c, f) = raise Size fun sub (v as {cols=c, data=d,...}, i, j) = raise Size (*d // (i * c + j)*) fun dimensions ({rows=r, cols=c,...}) = (r, c) fun getRegion {base, row, col, nrows, ncols} = let val (lRows, lCols) = dimensions base in raise Subscript end fun mapi tr f (reg as {base, row, col, ...}) = let val (nrows, ncols) = getRegion reg fun select (i, j) = let val (i', j') = (i + row, j + col) in (i', j', sub (base, i', j')) end in tabulate tr (nrows, ncols, f o select) end fun foldi tr f x (reg as {base, row, col, ...}) = let val (nrows, ncols) = getRegion reg fun foldval (i, z) = let val (j, k) = case tr of RowMajor => (row + i div ncols, col + i mod ncols) | ColMajor => (row + i mod nrows, col + i div nrows) in f (j, k, sub (base, j, k), z) end in repeat foldval (nrows * ncols) x end end; polyml-5.6/Tests/Succeed/Test124.ML000066400000000000000000000005351265146633400167720ustar00rootroot00000000000000(* This builds a large list but with the tail in the first word of the pair. That causes a segfault in older versions of the garbage collector because it overflows the stack during the mark phase. *) datatype 'a liszt = Nill | Conns of 'a liszt * 'a; fun mk 0 = Nill | mk n = Conns(mk (n-1), (n,n)); val a = mk 100000; PolyML.fullGC(); polyml-5.6/Tests/Succeed/Test125.ML000066400000000000000000000002231265146633400167650ustar00rootroot00000000000000(* The Standard ML syntax allows "op" in an exception binding. Poly/ML wasn't allowing it. *) infix & %; exception op &; exception op % = op &; polyml-5.6/Tests/Succeed/Test126.ML000066400000000000000000000011461265146633400167730ustar00rootroot00000000000000(* On X86/64 these resulted in InternalError exceptions because the offset was too large to fit into a 32-bit integer. *) val a = fn ~1 => "A" | ~2 => "B" | ~3 => "C" | ~4 => "D" | ~5 => "E" | ~6 => "F" | ~7 => "G" | ~8 => "H" | _ => "" ; if a ~2 = "B" andalso a 0 = "" then () else raise Fail "error"; val e = fn 0wx7FFFFFFF => "A" | 0wx7FFFFFFE => "B" | 0wx7FFFFFFD => "C" | 0wx7FFFFFFC => "D" | 0wx7FFFFFFB => "E" | 0wx7FFFFFFA => "F" | 0wx7FFFFFF9 => "G" | 0wx7FFFFFF8 => "H" | _ => ""; if e 0wx7FFFFFFC = "D" andalso e 0w0 = "" then () else raise Fail "error"; polyml-5.6/Tests/Succeed/Test127.ML000066400000000000000000000011451265146633400167730ustar00rootroot00000000000000(* There was a bug in the GMP version of the code where not all the result was being returned. *) fun verify a b c = if PolyML.IntInf.gcd(a, b) = c then () else raise Fail "Verification failed"; verify 9000988026767242076147268431373884447608090492573059 24797715036919699953447189576200253247082031218688000 1053; verify 200000000000000000000000000000000000000000000000000000000000000000 50000000000000000000000000000000000000000000000000000000000000000 50000000000000000000000000000000000000000000000000000000000000000; verify 367111367871840337041 367111367871840337041 367111367871840337041; polyml-5.6/Tests/Succeed/Test128.ML000066400000000000000000000023121265146633400167710ustar00rootroot00000000000000(* If type abbreviations contain type variables that are not present on the right-hand side we have to reduce the abbreviation before unification and applying the value restriction. The first part of the example was provided by Phil Clayton. *) signature A = sig type ('a, 'b) t val mkT : int -> ('a, int) t end structure A :> A = struct type ('a, 'b) t = 'b fun mkT n = n end signature B = sig type 'a t val x : ('a t, int) A.t end structure B :> B = struct type 'a t = unit val x = A.mkT 2 end; type 'a t = int; val x: 'a t = 1 +1; (* A further example from Phil. *) signature A = sig type ('a, 'b) t val mkT : int -> ('a, int) t end structure A :> A = struct type ('a, 'b) t = 'b fun mkT n = n end signature B = sig type 'a t val x : ('a t, int) A.t end structure B :> B = struct type 'a t1 = unit type 'a t = 'a t1 * 'a t1 (* two levels of phantom types *) val x = A.mkT 2 end; (* A further check. This has worked correctly for a long time because of the way equality is handled. Include it here just in case it gets broken by a change in the future. *) fun f (x: real t) y = x = y; polyml-5.6/Tests/Succeed/Test129.ML000066400000000000000000000014061265146633400167750ustar00rootroot00000000000000(* Some bugs in Word32 on 64-bit and a bug in arithmetic right shift with a constant shift value. *) fun check a b = if a = b then () else raise Fail "Bad"; check(Word32.toIntX 0wx0) 0; check(Word32.toIntX 0wx1) 1; check(Word32.toIntX 0wx7FFFFFFF) 2147483647; check(Word32.toIntX 0wx80000000) ~2147483648; check(Word32.toIntX 0wx80000001) ~2147483647; check(Word32.toIntX 0wxFFFFFFFE) ~2; check(Word32.toIntX 0wxFFFFFFFF) ~1; check(Word32.toLargeX 0wx0) 0wx0; check(Word32.toLargeX 0wx1) 0wx1; check(Word32.toLargeX 0wx7FFFFFFF) 0wx7FFFFFFF; check (let val r = ref 0w4 in Word.~>>(!r, 0w1) end) 0w2; (* Checks that fromLargeInt returns the same result as fromInt *) check(Word32.fromLargeInt ~1) 0wxFFFFFFFF; check(Word32.fromLargeInt (IntInf.pow (2, 32))) 0wx0; polyml-5.6/Tests/Succeed/Test130.ML000066400000000000000000000006211265146633400167630ustar00rootroot00000000000000(* Fix to bug in code-generation for structure matching. If the only difference between the original and final structure was a "coercion" from a constructor to a value the code to do this was lost. *) structure S1 = struct datatype s = A of int end; structure S2 : sig type s val A: int -> s end = S1; S2.A 1; signature S = sig val e: exn end; structure s : S = struct exception e end; s.e; polyml-5.6/Tests/Succeed/Test131.ML000066400000000000000000000031461265146633400167710ustar00rootroot00000000000000(* Bug test for pushing a value that won't fit in a 32-bit literal. *) (* Original test from Rene Neumann *) datatype bexp = Tt | Ff | V of IntInf.int | Not of bexp | And of bexp * bexp | Or of bexp * bexp; fun bexp_rec f1 f2 f3 f4 f5 f6 Tt = f1 | bexp_rec f1 f2 f3 f4 f5 f6 Ff = f2 | bexp_rec f1 f2 f3 f4 f5 f6 (V nat) = f3 nat | bexp_rec f1 f2 f3 f4 f5 f6 (Not bexp) = f4 bexp (bexp_rec f1 f2 f3 f4 f5 f6 bexp) | bexp_rec f1 f2 f3 f4 f5 f6 (And (bexp1, bexp2)) = f5 bexp1 bexp2 (bexp_rec f1 f2 f3 f4 f5 f6 bexp1) (bexp_rec f1 f2 f3 f4 f5 f6 bexp2) | bexp_rec f1 f2 f3 f4 f5 f6 (Or (bexp1, bexp2)) = f6 bexp1 bexp2 (bexp_rec f1 f2 f3 f4 f5 f6 bexp1) (bexp_rec f1 f2 f3 f4 f5 f6 bexp2); fun hashcode_bexp x = bexp_rec (2037113697 : IntInf.int) (1965105786 : IntInf.int) (fn x_0 => IntInf.+ (IntInf.* ((1562730118 : IntInf.int), x_0), (1569390485 : IntInf.int))) (fn _ => fn res_0 => IntInf.+ (IntInf.* ((1384320508 : IntInf.int), res_0), (1390980875 : IntInf.int))) (fn _ => fn _ => fn res_0 => fn res_1 => IntInf.+ (IntInf.* ((238441399 : IntInf.int), res_0), IntInf.+ (IntInf.* ((231781032 : IntInf.int), res_1), (245101766 : IntInf.int)))) (fn _ => fn _ => fn res_0 => fn res_1 => IntInf.+ (IntInf.* ((2025552342 : IntInf.int), res_0), IntInf.+ (IntInf.* ((2018891975 : IntInf.int), res_1), (2032212709 : IntInf.int)))) x; (* Alternative test. *) PolyML.Compiler.maxInlineSize := 1; fun f (a,b,c,d,e,f) = f; if f(0,0,0,0,0,2037113697) = 2037113697 then () else raise Fail "Compilation error"; polyml-5.6/Tests/Succeed/Test132.ML000066400000000000000000000012711265146633400167670ustar00rootroot00000000000000(* This caused a segfault in 5.5 and earlier due to an error in the optimiser. These examples are a special case because they could result in infinite inline expansion. *) datatype 'a ft = FT of 'a ft -> 'a; fun Y f = ( fn (FT x) => (f (fn a => x (FT x) a) ) ) (FT ( fn (FT x) => (f (fn a => x (FT x) a) ) ) ); fun Fact f n = if n = 0 then 1 else n * f(n-1); val fact = Y Fact; fact 4; (* This crashed. *) (* A slightly different example. This is infinitely recursive. *) fun Z() = let val f = fn(FT g) => g (FT g) in f (FT f) end; polyml-5.6/Tests/Succeed/Test133.ML000066400000000000000000000625301265146633400167750ustar00rootroot00000000000000(* This example resulted in a code blow-up. The match compiler generates thousands of cases. Now fixed by using a naive pattern-by-pattern match. *) structure Nbe = struct datatype Univ = Const of string * Univ list | Free of string * Univ list | DFree of string | BVar of int * Univ list | Abs of (int * (Univ list -> Univ)) * Univ list; end; fun c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vp, v_vo, v_vn, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vp, v_vo, v_vn, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vp, v_vo, v_vn, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vp, v_vo, v_vn, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vm, v_vl, v_vk, v_vj, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_vi, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vg, v_vf, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vl, v_vk, v_vj, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vi, v_vh, v_vg, v_vf, (Nbe.Const ("RedBlackTree.b.const", []))])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_vc, v_vb, (Nbe.Const ("RedBlackTree.e.const", [])), v_v])), v_t, v_s, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.r.const", []))])), v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.r.const", []))])), v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", []))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vh, v_vg, v_vf, v_ve, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, v_b, (Nbe.Const ("RedBlackTree.r.const", []))])), v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, (Nbe.Const ("RedBlackTree.e.const", [])), (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_vd, v_vc, v_vb, v_va, (Nbe.Const ("RedBlackTree.b.const", []))])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, (Nbe.Const ("RedBlackTree.tr.const", [v_c, v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.r.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.e.const", [])), v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.r.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.r.const", []))]))] = (Nbe.Const ("RedBlackTree.tr.const", [(Nbe.Const ("RedBlackTree.tr.const", [v_d, v_z, v_y, v_c, (Nbe.Const ("RedBlackTree.b.const", []))])), v_t, v_s, (Nbe.Const ("RedBlackTree.tr.const", [v_b, v_x, v_w, v_a, (Nbe.Const ("RedBlackTree.b.const", []))])), (Nbe.Const ("RedBlackTree.r.const", []))])) | c_RedBlackTree_balance_const [v_a, v_b, v_c, v_d] = (Nbe.Const ("RedBlackTree.balance.const", [v_a, v_b, v_c, v_d])); polyml-5.6/Tests/Succeed/Test134.ML000066400000000000000000000006471265146633400167770ustar00rootroot00000000000000(* Check the pathological cases of exception aliasing. *) fun check true = () | check false = raise Fail "Wrong"; exception R of int and Q of int; functor F (exception A of int) = struct fun f (R 1) = 1 | f (A 2) = 2 | f (R 2) = 3 | f (A 1) = 4 | f _ = 5 end; structure A = F(exception A = R); check(A.f(R 2) = 2); check(A.f(R 1) = 1); structure B = F(exception A = Q); check(B.f(R 2) = 3); check(B.f(R 1) = 1); polyml-5.6/Tests/Succeed/Test135.ML000066400000000000000000000004601265146633400167710ustar00rootroot00000000000000(* Bug in interaction between the debugger and pattern matching - this crashed. *) PolyML.Compiler.debug := true; fun processConstrs(_, 0) = () | processConstrs([], _) = () | processConstrs({a, b} :: next, toDo) = ( processConstrs(next, toDo-1) ); processConstrs([{a=1, b=2}], 1); polyml-5.6/Tests/Succeed/Test136.ML000066400000000000000000000007611265146633400167760ustar00rootroot00000000000000(* This caused the intermediate code optimiser to blow up. *) fun I x = x infixr & datatype ('a, 'b) pair = op & of 'a * 'b infixr 1 &&&> fun (f &&&> g) h (a & b) = f (fn a' => g (fn b' => h (a' & b')) b) a ; ( I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I &&&> I ) ; polyml-5.6/Tests/Succeed/Test137.ML000066400000000000000000000003331265146633400167720ustar00rootroot00000000000000(* Verify that the correct exception is raised for negative values. *) (TextIO.canInput(TextIO.stdIn, ~1); raise Fail "wrong") handle Size => (); (TextIO.inputN(TextIO.stdIn, ~1); raise Fail "wrong") handle Size => (); polyml-5.6/Tests/Succeed/Test138.ML000066400000000000000000000003501265146633400167720ustar00rootroot00000000000000(* Bug related to detecting usage patterns for recursion. *) fun foldr f n [] = n | foldr f n (hd :: tl) = f (hd, foldr f n tl); fun g z = let val (x, _) = foldr (fn (h, t) => (ref(#2 t); t)) (0, 0) z in x end; g[1]; polyml-5.6/Tests/Succeed/Test139.ML000066400000000000000000000002411265146633400167720ustar00rootroot00000000000000(* Bug fix for byte vector equality. *) if BoolVector.tabulate(16, fn n => n < 8) = BoolVector.tabulate(16, fn n => n < 10) then raise Fail "Wrong" else (); polyml-5.6/Tests/Succeed/Test140.ML000066400000000000000000000005071265146633400167670ustar00rootroot00000000000000(* Now that argument functions may have multiple arguments rather than a single argument that may be a tuple it is necessary to load the function before overwriting it in a tail-recursive call. *) PolyML.Compiler.maxInlineSize := 0; fun g (a, b, c, d, e, f) = f (a, e, d, b, c, a); g (1, 1, 1, 1, 1, fn _ => ()); polyml-5.6/Tests/Succeed/Test141.ML000066400000000000000000000002021265146633400167600ustar00rootroot00000000000000(* This should raise the Size exception. *) (TextIO.canInput(TextIO.stdIn, ~1); raise Fail "No exception") handle Size => (); polyml-5.6/Tests/Succeed/Test142.ML000066400000000000000000000002531265146633400167670ustar00rootroot00000000000000(* Polymorphic declaration. Ensure that Bind is raised. *) (let val SOME (f: 'a -> 'a) = NONE in f (f 1); raise Fail "No exception" end) handle Bind => () ; polyml-5.6/Tests/Succeed/Test143.ML000066400000000000000000000002551265146633400167720ustar00rootroot00000000000000(* Bug with determining when to detuple the result. *) PolyML.Compiler.maxInlineSize := 0; let fun f x = ! (ref (fn y => (y, x))) val r = #2 (f 1 2) in r end; polyml-5.6/Tests/Succeed/Test144.ML000066400000000000000000000002161265146633400167700ustar00rootroot00000000000000(* Check for bug with missing BeginLoop *) let fun f n m = (n, m) handle Fail _ => f n m fun g x = #1 (f x x) in g 3 end; polyml-5.6/Tests/Succeed/Test145.ML000066400000000000000000000067241265146633400170030ustar00rootroot00000000000000(* Cut-down example from Isabelle code-generator. During testing this showed up a bug in the X86 code-generator. *) structure Generated_Code = struct datatype num = One | Bit0 of num | Bit1 of num; datatype int = Zero_int | Pos of num | Neg of num; type 'a one = {one : 'a}; type 'a times = {times : 'a -> 'a -> 'a}; fun nat _ = raise Fail "bad" fun uminus_int (Neg m) = Pos m | uminus_int (Pos m) = Neg m | uminus_int Zero_int = Zero_int; fun plus_num _ = raise Fail "bad" fun sub _ _ = raise Fail "bad" and plus_inta (Neg m) (Neg n) = Neg (plus_num m n) | plus_inta (Neg m) (Pos n) = sub n m | plus_inta (Pos m) (Neg n) = sub m n | plus_inta (Pos m) (Pos n) = Pos (plus_num m n) | plus_inta Zero_int l = l | plus_inta k Zero_int = k; fun minus_int _ _ = raise Fail "bad"; type 'a power = {one_power : 'a one, times_power : 'a times}; fun times_inta _ = raise Fail "bad" val times_int = {times = times_inta} : int times; val one_inta : int = Pos One; val one_int = {one = one_inta} : int one; val power_int = {one_power = one_int, times_power = times_int} : int power; fun less_num (Bit1 m) (Bit0 n) = less_num m n | less_num (Bit1 m) (Bit1 n) = less_num m n | less_num (Bit0 m) (Bit1 n) = less_eq_num m n | less_num (Bit0 m) (Bit0 n) = less_num m n | less_num One (Bit1 n) = true | less_num One (Bit0 n) = true | less_num m One = false and less_eq_num (Bit1 m) (Bit0 n) = less_num m n | less_eq_num (Bit1 m) (Bit1 n) = less_eq_num m n | less_eq_num (Bit0 m) (Bit1 n) = less_eq_num m n | less_eq_num (Bit0 m) (Bit0 n) = less_eq_num m n | less_eq_num (Bit1 m) One = false | less_eq_num (Bit0 m) One = false | less_eq_num One n = true; type 'a ord = {less_eq : 'a -> 'a -> bool, less : 'a -> 'a -> bool}; val less_eq = #less_eq : 'a ord -> 'a -> 'a -> bool; fun less_int (Neg k) (Neg l) = less_num l k | less_int (Neg k) (Pos l) = true | less_int (Neg k) Zero_int = true | less_int (Pos k) (Neg l) = false | less_int (Pos k) (Pos l) = less_num k l | less_int (Pos k) Zero_int = false | less_int Zero_int (Neg l) = false | less_int Zero_int (Pos l) = true | less_int Zero_int Zero_int = false; fun less_eq_int (Neg k) (Neg l) = less_eq_num l k | less_eq_int (Neg k) (Pos l) = true | less_eq_int (Neg k) Zero_int = true | less_eq_int (Pos k) (Neg l) = false | less_eq_int (Pos k) (Pos l) = less_eq_num k l | less_eq_int (Pos k) Zero_int = false | less_eq_int Zero_int (Neg l) = false | less_eq_int Zero_int (Pos l) = true | less_eq_int Zero_int Zero_int = true; datatype float = Float of int * int; fun min A_ a b = (if less_eq A_ a b then a else b); fun power s = raise Fail "bad" fun is_float_nonneg _ = raise Fail "ab" fun uminus_float (Float (m1, e1)) = Float (uminus_int m1, e1); fun plus_float (Float (m1, e1)) (Float (m2, e2)) = (if less_eq_int e1 e2 then Float (plus_inta m1 (times_inta m2 (power power_int (Pos (Bit0 One)) (nat (minus_int e2 e1)))), e1) else Float (plus_inta m2 (times_inta m1 (power power_int (Pos (Bit0 One)) (nat (minus_int e1 e2)))), e2)); fun minus_float f g = plus_float f (uminus_float g); fun less_eq_float a b = is_float_nonneg (minus_float b a); fun is_float_pos (Float (m, e)) = less_int Zero_int m; fun less_float a b = is_float_pos (minus_float b a); val ord_float = {less_eq = less_eq_float, less = less_float} : float ord; fun inf_float a b = min ord_float a b; end; polyml-5.6/Tests/Succeed/Test146.ML000066400000000000000000000012531265146633400167740ustar00rootroot00000000000000(* Bug in transformation of arguments which are curried functions. It is not safe to transform "f" in the argument to "bar". Although it is curried the application to the first argument "()" is not immediately followed by the application to the second. *) local val r = ref 0 in (* Foo should be called exactly once *) fun foo () = (r:= !r+1; fn i => i) fun checkOnce () = if !r = 1 then () else raise Fail "bad" end; fun bar f = let val r = f() in (r 1; r 2; List.map r [1, 2, 3]) end; bar foo; checkOnce(); exception A and B and C; fun rA () = raise A and rB () = raise B; fun h (f, g) = let val a = f() in g(); a () end; h(rA, rB) handle A => (); polyml-5.6/Tests/Succeed/Test147.ML000066400000000000000000000016401265146633400167750ustar00rootroot00000000000000(* Bug in optimiser transformation. A function argument that returns a tuple can be transformed to take a container but only if it is not curried. *) (* Cut down example from Isabelle that caused an internal error exception. *) fun one _ [] = raise Fail "bad" | one pred (x :: xs) = if pred x then (x, xs) else raise Fail "bad"; fun foo (scan, f) xs = let val (x, y) = scan xs in (f x, y) end; fun bar (scan1, scan2) xs = let val (x, ys) = scan1 xs; val (y, zs) = scan2 x ys; in ((x, y), zs) end; fun bub (scan1, scan2) = foo(bar(scan1, (fn _ => scan2)), op ^); val qqq: string list -> string * int = bub(one (fn _ => raise Match), (foo((fn _ => raise Match), String.concat))); (* Further example - This caused a segfault. *) PolyML.Compiler.maxInlineSize := 1; fun f g = let val (x,y) = g 1 2 in x+y end; fun r (x, y, z) = fn _ => (x, y+z); val h: int-> int*int = r (4,5,6); f (fn _ => h); polyml-5.6/Tests/Succeed/Test148.ML000066400000000000000000000014001265146633400167700ustar00rootroot00000000000000(* This caused an InternalError exception during the "open". The problem was that the "garbage-collector" introduced in commit 1893 had a bug where it assumed that if it processed the "general" value for a binding the binding had been fully processed. However the "general" value for "tuple" is reachable both through the closure of "f" and also through the entry in the structure itself but only the latter has the "special" entries that refer to the fields. *) local val r : ((int -> int) * (int->int) * int ref * int ref) option ref = ref NONE in fun doDo p = r := SOME p end; structure Test = struct val tuple = (fn _ => raise Fail "bad", fn _ => raise Fail "bad", ref 0, ref 0) fun f _ = (doDo tuple; 0) end; open Test; polyml-5.6/Tests/Succeed/Test149.ML000066400000000000000000000010751265146633400170010ustar00rootroot00000000000000(* Some tests for the HashArray structure. *) open HashArray; val a = hash 10: int hash; update(a, "a", 1); update(a, "b", 2); update(a, "k", 3); (* Happens to hash to the same as "a" *) update(a, "l", 4); val sum = fold (fn (_, a, b) => a+b) 0; fun verify true = () | verify false = raise Fail "failed"; verify(sub(a, "a") = SOME 1); verify(sub(a, "b") = SOME 2); verify(sub(a, "c") = NONE); verify(sub(a, "k") = SOME 3); verify(sub(a, "l") = SOME 4); verify(sum a = 10); delete(a, "a"); verify(sub(a, "a") = NONE); verify(sub(a, "k") = SOME 3); verify(sum a = 9); polyml-5.6/Tests/Succeed/Test150.ML000066400000000000000000000001461265146633400167670ustar00rootroot00000000000000(* Bug in code generator reported by Lars Noschinski *) fun f xs = (xs : ''a) val _ = (fn x => f x); polyml-5.6/Tests/Succeed/Test151.ML000066400000000000000000000003061265146633400167660ustar00rootroot00000000000000(* Bug in arbitrary precision emulation reported by Anthony Fox. *) fun f x = IntInf.<< (1, Word.fromInt x) val a = f 64 val b = f 32; if a - b = (f 64 - f 32) then () else raise Fail "failed"; polyml-5.6/Tests/Succeed/Test152.ML000066400000000000000000000007061265146633400167730ustar00rootroot00000000000000(* Creating a negative sized array should raise Size. *) (let val v = Array.array(~12, 4) in raise Fail "failed" end) handle Size => (); (let val v = Array.array(Array.maxLen+1, 4) in raise Fail "failed" end) handle Size => (); (let val v = Array.tabulate(~12, fn i => i) in raise Fail "failed" end) handle Size => (); (let val v = Array.tabulate(Array.maxLen+1, fn i => i) in raise Fail "failed" end) handle Size => (); polyml-5.6/Tests/Succeed/Test153.ML000066400000000000000000000004701265146633400167720ustar00rootroot00000000000000(* Bug to do with raising an exception inside a new thread. The actual problem was that the same location on the stack was used for the normal return address and the exception case. *) PolyML.Compiler.maxInlineSize := 1; fun wrap _ _ _ _ _ () = raise Match; Thread.Thread.fork (wrap 1 2 3 4 5, []); polyml-5.6/Tests/Succeed/Test154.ML000066400000000000000000000006251265146633400167750ustar00rootroot00000000000000(* Bug in X86 code-generation. Because the tag is subtracted AFTER the operation an operation that actually overflows may not be correctly detected. *) fun t x = x + x * 1073741824; (* Use ! and ref here to prevent the compiler interpreting it. *) if ! (ref t) ~1 > 0 then raise Fail "wrong" else (); fun s x = x + x * 4611686018427387904; if ! (ref s) ~1 > 0 then raise Fail "wrong" else (); polyml-5.6/Tests/Succeed/Test155.ML000066400000000000000000000003311265146633400167700ustar00rootroot00000000000000 (* These raised Size exceptions *) fun test1 (r:real) = Real.toLargeInt IEEEReal.TO_NEAREST r; fun test2 (r:real) = Real.toLargeInt IEEEReal.TO_ZERO r; test1 2.23E34; test1 2.23E35; test2 2.23E34; test2 2.23E35; polyml-5.6/Tests/Succeed/Test156.ML000066400000000000000000000011261265146633400167740ustar00rootroot00000000000000(* Functions with free variables were turned into stack closures but these could not be called tail-recursively. This code sets the maximum stack to detect the problem early on but with large enough examples this can exhaust the memory. *) PolyML.Compiler.maxInlineSize := 1; fun f x = let fun g y = if y = 0 then 0 else f (x-1) in g x end; Thread.Thread.setAttributes[Thread.Thread.MaximumMLStack (SOME 3000)]; f 10000000 handle exn => (Thread.Thread.setAttributes[Thread.Thread.MaximumMLStack NONE]; raise exn); Thread.Thread.setAttributes[Thread.Thread.MaximumMLStack NONE]; polyml-5.6/Tests/Succeed/Test157.ML000066400000000000000000000011121265146633400167700ustar00rootroot00000000000000(* Something that looks like it should be an integer or word constant but isn't should be lexically analysed as an integer constant followed by an identifier. This is similar to the problem with real constants identified in Test026. *) fun test 0 _ = () | test _ _ = raise Fail "wrong"; val () = let val xz = 1 in test 0xz end; val () = let val wxz = 1 in test 0wxz end; val () = let val xw9 = 1 in test 0xw9 end; val () = let val x = 1 in test 0x; () end; (* Another one identified. *) val () = let val w1 = 1 in test ~0w1 end; val () = let val xw1 = 1 in test ~0xw1 end; polyml-5.6/Tests/Succeed/Test158.ML000066400000000000000000000204231265146633400167770ustar00rootroot00000000000000(* Various tests for the OS.Path structure. The Unix tests are taken largely from the documentation. The Windows tests are inferred from the documentation which isn't always clear. *) datatype sys = Windows | Posix; open OS.Path; fun check s true = () | check s false = raise Fail ("check " ^ s); val check' = check ""; val sys = if isRoot "/" then Posix else Windows; (* Windows uses either / or \ as a separator but the output routines generally produce \. To simplify the checks map backslashes into forward slashes in some cases. *) val mapSep = case sys of Posix => (fn c => c) | Windows => String.map (fn #"\\" => #"/" | c => c); (* fromString *) val testFromTo = [ { s = "", p = {isAbs=false, vol="", arcs=[]}, w = {isAbs=false, vol="", arcs=[]} }, { s = "/", p = {isAbs=true, vol="", arcs=[""]}, (* In Windows this means the "root" directory on the current drive. *) w = {isAbs = false, vol = "", arcs = ["", ""]} }, { s = "//", p = {isAbs=true, vol="", arcs=["", ""]}, w = {isAbs = false, vol = "", arcs = ["", "", ""]} }, { s = "a", p = {isAbs=false, vol="", arcs=["a"]}, w = {isAbs=false, vol="", arcs=["a"]} }, { s = "/a", p = {isAbs=true, vol="", arcs=["a"]}, w = {isAbs=false, vol="", arcs=["", "a"]} }, { s = "//a", p = {isAbs=true, vol="", arcs=["","a"]}, w = {isAbs=false, vol="", arcs=["","", "a"]} }, { s = "a/", p = {isAbs=false, vol="", arcs=["a", ""]}, w = {isAbs=false, vol="", arcs=["a", ""]} }, { s = "a//", p = {isAbs=false, vol="", arcs=["a", "", ""]}, w = {isAbs=false, vol="", arcs=["a", "", ""]} }, { s = "a/b", p = {isAbs=false, vol="", arcs=["a", "b"]}, w = {isAbs=false, vol="", arcs=["a", "b"]} }, { s = "c:\\", p = {isAbs=false, vol="", arcs=["c:\\"]}, w = {isAbs = true, vol = "c:", arcs = [""]} }, { s = "c:", p = {isAbs=false, vol="", arcs=["c:"]}, w = {isAbs=false, vol = "c:", arcs = [""]} }, { s = "c:\\abc", p = {isAbs=false, vol="", arcs=["c:\\abc"]}, w = {isAbs=true, vol = "c:", arcs = ["abc"]} } ]; fun test { s, p, w } = let val res = fromString s val ts = toString res in case sys of Posix => check s (res = p) | Windows => check s (res = w); check s (ts = s orelse mapSep ts = s) end; val () = List.app test testFromTo; (* validVolume *) val v1 = validVolume{isAbs = true, vol = ""}; case sys of Posix => check' v1 | Windows => check' (not v1); val v2 = validVolume{isAbs = false, vol = ""}; check' v2; val v3 = validVolume{isAbs = true, vol = "C:"}; case sys of Posix => check'(not v3) | Windows => check' v3; val v4 = validVolume{isAbs = false, vol = "C:"}; case sys of Posix => check'(not v4) | Windows => check' v4; val v5 = validVolume{isAbs = false, vol = "\\\\server\\share" }; case sys of Posix => check'(not v5) | Windows => check' v5; (* getParent *) val testGetParent = [ { s = "/", p = "/", w = "/" }, { s = "a", p = ".", w = "." }, { s = "a/", p = "a/..", w = "a/.." }, { s = "a///", p = "a///..", w = "a///.." }, { s = "a/b", p = "a", w = "a" }, { s = "a/b/", p = "a/b/..", w = "a/b/.." }, { s = "..", p = "../..", w = "../.." }, { s = ".", p = "..", w = ".." }, { s = "C:\\", p = ".", w = "C:\\" }, { s = "\\\\server\\share\\", p = ".", w = "\\\\server\\share\\" } ]; fun test { s, p, w } = let val res = getParent s in case sys of Posix => check s (res = p) | Windows => check s (res = w orelse mapSep res = mapSep w) end; val () = List.app test testGetParent; (* splitDirFile *) val testSplitFile = [ { s = "", p = {dir = "", file = ""}, w = {dir = "", file = ""} }, { s = ".", p = {dir = "", file = "."}, w = {dir = "", file = "."} }, { s = "b", p = {dir = "", file = "b"}, w = {dir = "", file = "b"} }, { s = "b/", p = {dir = "b", file = ""}, w = {dir = "b", file = ""} }, { s = "a/b", p = {dir = "a", file = "b"}, w = {dir = "a", file = "b"} }, { s = "/a", p = {dir = "/", file = "a"}, w = {dir = "/", file = "a"} }, { s = "c:\\a", p = {dir = "", file = "c:\\a"}, w = {dir = "c:\\", file = "a"} } ]; fun test { s, p, w } = let val res as { dir, file } = splitDirFile s in case sys of Posix => check s (res = p) | Windows => check s (res = w orelse mapSep dir = #dir w andalso mapSep file = #file w) end; val () = List.app test testSplitFile; val testAbsolute = [ { s = "/a", p = true, w = false }, { s = "c:/a", p = false, w = true } ]; fun test { s, p, w } = let val res = isAbsolute s in case sys of Posix => check s (res = p) | Windows => check s (res = w) end; val () = List.app test testAbsolute; case sys of Posix => let val testMkRelative = [ (* These are all relative paths in Windows. *) { s = { path = "a/b", relativeTo = "/c/d" }, p = "a/b"}, { s = { path = "/", relativeTo = "/a/b/c" }, p = "../../.." }, { s = { path = "/a/b/", relativeTo = "/a/c" }, p = "../b/" }, { s = { path = "/a/b", relativeTo = "/a/c" }, p = "../b" }, { s = { path = "/a/b/", relativeTo = "/a/c/"}, p = "../b/" }, { s = { path = "/a/b", relativeTo = "/a/c/"}, p = "../b" }, { s = { path = "/", relativeTo = "/"}, p = "." }, { s = { path = "/", relativeTo = "/."}, p = "." }, { s = { path = "/", relativeTo = "/.."}, p = "." }, { s = { path = "/a/b/../c", relativeTo = "/a/d"}, p = "../b/../c" }, { s = { path = "/a/b", relativeTo = "/c/d"}, p = "../../a/b" }, { s = { path = "/c/a/b", relativeTo = "/c/d"}, p = "../a/b" }, { s = { path = "/c/d/a/b", relativeTo = "/c/d"}, p = "a/b" } ]; fun test { s, p } = let val res = mkRelative s in check (#path s ^ " " ^ #relativeTo s) (res = p) end; in List.app test testMkRelative end | Windows => let val testMkRelative = [ { s = { path = "a/b", relativeTo = "c:/c/d" }, w = "a/b" }, { s = { path = "c:/", relativeTo = "c:/a/b/c" }, w = "../../.." }, { s = { path = "c:/a/b/", relativeTo = "c:/a/c" }, w = "../b/" }, { s = { path = "c:/a/b", relativeTo = "c:/a/c" }, w = "../b" }, { s = { path = "c:/a/b/", relativeTo = "c:/a/c/"}, w = "../b/" }, { s = { path = "c:/a/b", relativeTo = "c:/a/c/"}, w = "../b" }, { s = { path = "c:/", relativeTo = "c:/"}, w = "." }, { s = { path = "c:/", relativeTo = "c:/."}, w = "." }, { s = { path = "c:/", relativeTo = "c:/.."}, w = "." }, { s = { path = "c:/a/b/../c", relativeTo = "c:/a/d"}, w = "../b/../c" }, { s = { path = "c:/a/b", relativeTo = "c:/c/d"}, w = "../../a/b" }, { s = { path = "c:/c/a/b", relativeTo = "c:/c/d"}, w = "../a/b" }, { s = { path = "c:/c/d/a/b", relativeTo = "c:/c/d"}, w = "a/b" } ]; fun test { s, w } = let val res = mkRelative s in check (#path s ^ " " ^ #relativeTo s) (res = w orelse mapSep res = mapSep w) end; in List.app test testMkRelative end; case sys of Windows => ( (* Special cases for the relative path \\abc. This is relative to the current volume. *) check "" (mkAbsolute{path="\\abc", relativeTo="c:\\def\\xyz"} = "c:\\abc"); check "" (concat("c:\\abc\\def", "\\ghi") = "c:\\ghi") ) | Posix => (); (* OS.Path.joinDirFile should raise InvalidArc if the file name does not correspond to an arc *) (OS.Path.joinDirFile {dir="abc/def", file="ghi/jkl"}; raise Fail "incorrect") handle OS.Path.InvalidArc => (); polyml-5.6/Tests/Succeed/Test159.ML000066400000000000000000000002211265146633400167720ustar00rootroot00000000000000(* This caused an InternalError exception. *) PolyML.Compiler.maxInlineSize := 1; fun f (x: real, y: real) = (y, x) handle Bind => (y+1.0, x); polyml-5.6/basis/000077500000000000000000000000001265146633400140135ustar00rootroot00000000000000polyml-5.6/basis/ASN1.sml000066400000000000000000000233401265146633400152340ustar00rootroot00000000000000(* Title: ASN1 support. Author: David Matthews Copyright David Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* These functions provide assistance in the encoding and decoding of ASN1 binary encoding. *) signature ASN1 = sig datatype form = Primitive | Constructed datatype tagType = Universal of int * form | Application of int * form | Context of int * form | Private of int * form val asn1Boolean: tagType and asn1Integer: tagType and asn1BitString: tagType and asn1OctetString: tagType (* Parse the tag and length information to extract the first tag/value pair from the input. Returns with the reader pointing at the start of the data. *) val readHeader: (Word8.word, 'a) StringCvt.reader -> ((tagType * int), 'a) StringCvt.reader (* Parse the tag and length information to extract the first tag/value pair from the input. Returns the remainder of the input. *) val decodeItem: Word8VectorSlice.slice -> {tag: tagType, data: Word8VectorSlice.slice, remainder: Word8VectorSlice.slice} option val decodeInt: Word8VectorSlice.slice -> int and decodeString: Word8VectorSlice.slice -> string and decodeBool: Word8VectorSlice.slice -> bool (* Encode a tag/value pair. *) val encodeItem: tagType * Word8Vector.vector list -> Word8Vector.vector list val encodeInt: int -> Word8Vector.vector and encodeString: string -> Word8Vector.vector and encodeBool: bool -> Word8Vector.vector end; structure Asn1: ASN1 = struct datatype form = Primitive | Constructed datatype tagType = Universal of int * form | Application of int * form | Context of int * form | Private of int * form (* A few standard tags *) val asn1Boolean = Universal(1, Primitive) and asn1Integer = Universal(2, Primitive) and asn1BitString = Universal(3, Primitive) (* Could also be constructed *) and asn1OctetString = Universal(4, Primitive) (* Could also be constructed *) open Word8VectorSlice (* Convert the length data. The first byte is either the length itself, if it is less than 128 otherwise it is the number of bytes containing the length. *) fun getLength getNext p = case getNext p of SOME (n, t) => if n < 0wx80 then SOME(Word8.toInt n, t) else let fun getL(0w0, m, l) = SOME(m, l) | getL(n, m, t) = case getNext t of SOME (hd, tl) => getL(n-0w1, m * 256 + Word8.toInt hd, tl) | NONE => NONE val lengthOfLength = Word8.andb(n, 0wx7f) in if lengthOfLength = 0w0 then raise Fail "Indefinite length is not implemented" else getL(lengthOfLength, 0, t) end | NONE => NONE fun readHeader getNext input = case getNext input of SOME (code, t) => let (* The type is encoded in the top two bits of the first byte. *) val tagType: int * form -> tagType = case Word8.andb(code, 0wxc0) of 0wx00 => Universal | 0wx40 => Application | 0wx80 => Context | _ => Private val sc = if Word8.andb(code, 0wx20) = 0w0 then Primitive else Constructed (* The tag is the bottom five bits except that if it is 0x1f the tag is encoded in subsequent bytes. *) val tagRest = case Word8.andb(code, 0w31) of 0w31 => (* This is a long-format tag *) let fun decode (acc, seq) = case getNext seq of SOME(code, seq') => let (* Keep accumulating the tags until we find a byte with the top bit clear. *) val tag' = acc * 128 + Word8.toInt(Word8.andb(code, 0wx7f)) in if Word8.andb(code, 0wx80) = 0w0 then SOME(tag', seq') else decode(tag', seq') end | NONE => NONE in decode(0, t) end | firstTag => SOME(Word8.toInt firstTag, t) in case tagRest of SOME(tag, rest) => ( case getLength getNext rest of SOME(len, tail) => SOME((tagType(tag, sc), len), tail) | NONE => NONE ) | NONE => NONE end | NONE => NONE (* Decode Word8VectorSlice.slice input. *) local fun getNext n = if length n = 0 then NONE else SOME(sub(n, 0), subslice(n, 1, NONE)) in fun decodeItem input = case readHeader getNext input of SOME((tag, len), tail) => SOME{tag = tag, data = Word8VectorSlice.subslice(tail, 0, SOME len), remainder = Word8VectorSlice.subslice(tail, len, NONE) } | NONE => NONE fun decodeInt p = case getNext p of NONE => 0 | SOME(h, tl) => let fun parseRest(n, p) = case getNext p of NONE => n | SOME (hd, tl) => parseRest(n * 256 + Word8.toInt hd, tl) in parseRest(Word8.toIntX h, tl) end end fun decodeString t = Byte.bytesToString(vector t) and decodeBool p = decodeInt p <> 0 fun encodeItem (tag, value) = let open Word8Vector fun encodeTag(tagType, tagValue) = if tagValue < 31 then [Word8.orb(tagType, Word8.fromInt tagValue)] else let (* Set the top bit on all bytes except the last. *) fun addToList(n, []) = [Word8.fromInt n] | addToList(n, t) = Word8.fromInt(128 + n) :: t fun encode(n, t) = if n < 128 then addToList(n, t) else let val (d, m) = IntInf.divMod(n, 128) in encode(d, addToList(m, t)) end in Word8.orb(tagType, 0w31) :: encode(tagValue, []) end val tagCode = case tag of Universal (t, Primitive) => encodeTag(0wx00, t) | Universal (t, Constructed) => encodeTag(0wx20, t) | Application (t, Primitive) => encodeTag(0wx40, t) | Application (t, Constructed) => encodeTag(0wx60, t) | Context (t, Primitive) => encodeTag(0wx80, t) | Context (t, Constructed) => encodeTag(0wxa0, t) | Private (t, Primitive) => encodeTag(0wxc0, t) | Private (t, Constructed) => encodeTag(0wxe0, t) (* Encode the length the argument. *) val length = List.foldl(fn (a, b) => length a + b) 0 value val lengthCode = if length < 128 then [Word8.fromInt length] else let fun encodeLength (0, t) = t | encodeLength (v, t) = let val (d, m) = IntInf.divMod(v, 256) in encodeLength(d, Word8.fromInt m :: t) end val encodedLength = encodeLength(length, []) in Word8.orb(0wx80, Word8.fromInt(List.length encodedLength)) :: encodedLength end in fromList(tagCode @ lengthCode) :: value end fun encodeInt n = let fun encode (n, t) = let val lo = Word8.fromInt n (* Bottom byte *) val hi = n div 256 in (* If the high byte is 0 or -1 and the sign bit is already correct we've finished. *) if hi = 0 andalso lo < 0w128 orelse hi = ~1 andalso lo >= 0w128 then lo :: t else encode(hi, lo :: t) end in Word8Vector.fromList(encode(n, [])) end val encodeString = Byte.stringToBytes fun encodeBool b = encodeInt(if b then 1 else 0) end; polyml-5.6/basis/Array.sml000066400000000000000000000405131265146633400156110ustar00rootroot00000000000000(* Title: Standard Basis Library: Array Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. Added ArraySlice and ARRAY_SLICE. *) signature ARRAY = sig eqtype 'a array type 'a vector val maxLen : int val array : (int * 'a) -> 'a array val fromList : 'a list -> 'a array val vector: 'a array -> 'a vector val tabulate : (int * (int -> 'a)) -> 'a array val length : 'a array -> int val sub : ('a array * int) -> 'a val update : ('a array * int * 'a) -> unit val copy : {src : 'a array, dst : 'a array, di : int} -> unit val copyVec : {src : 'a vector, dst : 'a array, di : int} -> unit val appi : ((int * 'a) -> unit) -> 'a array -> unit val app : ('a -> unit) -> 'a array -> unit val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> 'a array -> 'b val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> 'a array -> 'b val foldl : (('a * 'b) -> 'b) -> 'b -> 'a array -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a array -> 'b val modifyi : ((int * 'a) -> 'a) -> 'a array -> unit val modify : ('a -> 'a) -> 'a array -> unit val findi: (int * 'a -> bool) -> 'a array -> (int * 'a) option val find: ('a -> bool) -> 'a array -> 'a option val exists: ('a -> bool) -> 'a array -> bool val all: ('a -> bool) -> 'a array -> bool val collate: ('a * 'a -> order) -> 'a array * 'a array -> order end; local (* This was previously implemented as simply an n-word block of mutable store, length being obtained from the length field. There was a complication in that equality for arrays is defined as pointer equality even for zero-sized arrays but the run-time system doesn't allow zero-sized objects. To get round that we used a one-word object with the "negative" bit set in the flags byte. This meant that the length function was quite complicated which is significant because we need to compute the length to do bounds checking on every "sub" or "update". This method is the most efficient in storage. The current version uses the first word to hold the length. *) open RuntimeCalls type 'a array = 'a array (* Predeclared in the basis with special equality props. *) val System_alloc: int*word*word->word = RunCall.run_call3 POLY_SYS_alloc_store; val System_loadw: word*int->word = RunCall.run_call2 POLY_SYS_load_word; val System_setw: word * int * word -> unit = RunCall.run_call3 POLY_SYS_assign_word; val System_lock: word -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_zero: word = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_nullvector; (* A zero word. *) val System_move_words: word*int*word*int*int->unit = RunCall.run_call5 POLY_SYS_move_words val System_move_words_overlap: word*int*word*int*int->unit = RunCall.run_call5 POLY_SYS_move_words_overlap (* Unsafe subscript and update functions used internally for cases where we've already checked the range. N.B. THESE ADD THE ONE WHICH IS NECESSARY TO SKIP THE LENGTH WORD *) fun unsafeSub(v: 'a array, i: int): 'a = RunCall.unsafeCast(System_loadw (RunCall.unsafeCast v, i+1)) and unsafeUpdate(v: 'a array, i: int, new: 'a): unit = System_setw (RunCall.unsafeCast v, i+1, RunCall.unsafeCast new); val intAsWord: int -> word = RunCall.unsafeCast and wordAsInt: word -> int = RunCall.unsafeCast (* "vector" creates a vector from an array so the representation of a zero-length object is different. Locking the resultant object turns into an immutable object and changes the equality function from pointer equality to value equality. *) fun makeVector(v: 'a array, start, length): 'a vector = if length = 0 then RunCall.unsafeCast System_zero (* Special case for zero *) else (* The size must have already been checked. *) let (* Make a vector initialised to zero. *) val new_vec = System_alloc(length, 0wx40, 0w0) in System_move_words(RunCall.unsafeCast v, start+1, new_vec, 0, length); System_lock new_vec; RunCall.unsafeCast new_vec end in structure Array: ARRAY = struct type 'a array = 'a array type 'a vector = 'a Vector.vector (* The maximum size of an array is one less than the maximum allocation size to allow for the length word. *) val maxLen = RunCall.unsafeCast(LibrarySupport.maxAllocation - 0w1) (* Internal function: Construct an array initialised to zero. That's probably more efficient than the alternative of setting every word to the length. *) fun alloc len = let val () = if len >= maxLen then raise General.Size else () val vec = System_alloc(len+1, 0wx40, 0w0) in System_setw(vec, 0, RunCall.unsafeCast len); RunCall.unsafeCast vec end fun array(len, a) = let val () = if len < 0 orelse len >= maxLen then raise General.Size else () val vec = System_alloc(len+1, 0wx40, RunCall.unsafeCast a) in System_setw(vec, 0, RunCall.unsafeCast len); RunCall.unsafeCast vec end val listLength = length; (* Pick this up from the prelude. *) fun length (vec: 'a array): int = RunCall.unsafeCast(System_loadw(RunCall.unsafeCast vec, 0)) fun op sub (vec: 'a array as v, i: int): 'a = if i < 0 orelse i >= length vec then raise General.Subscript else RunCall.unsafeCast(System_loadw (RunCall.unsafeCast v, i+1)) fun update (vec: 'a array as v, i: int, new: 'a) : unit = if i < 0 orelse i >= length vec then raise General.Subscript else System_setw (RunCall.unsafeCast v, i+1, RunCall.unsafeCast new); (* Create an array from a list. *) fun fromList (l : 'a list) : 'a array = let val length = listLength l; (* Make a array initialised to zero. *) val vec = alloc length (* Copy the list elements into the array. *) fun init (v, i, a :: l) = ( unsafeUpdate(v, i, a); init(v, i + 1, l) ) | init (_, _, []) = (); in init(vec, 0, l); vec end fun tabulate (length: int , f : int->'a): 'a array = let val vec = if length < 0 then raise General.Size else alloc length; (* Initialise it to the function values. *) fun init i = if length <= i then () else (unsafeUpdate(vec, i, f i); init(i+1)) in init 0; vec end (* "vector" creates a vector from an array so the representation of a zero-length object is different. Locking the resultant object turns into an immutable object and changes the equality function from pointer equality to value equality. *) fun vector (vec: 'a array): 'a vector = makeVector(vec, 0, length vec) (* Copy one array into another. It's possible for the arrays to be the same but in that case di would have to be zero otherwise the length check would fail. *) fun copy {src: 'a array as s, dst: 'a array as d, di: int} = let val len = length src in if di < 0 orelse di+len > length dst then raise General.Subscript else System_move_words(RunCall.unsafeCast s, 1, RunCall.unsafeCast d, di+1, len) end (* Copy a vector into an array. *) fun copyVec {src: 'a vector, dst: 'a array as d, di: int} = let val len = Vector.length src in if di < 0 orelse di+len > length dst then raise General.Subscript else System_move_words(RunCall.unsafeCast src, 0, RunCall.unsafeCast d, di+1, len) end (* Create the other functions. *) structure VectorOps = PolyVectorOperations( struct type 'a vector = 'a array local val l = length in fun length(v: 'a array):word = intAsWord(l v) end local val u = unsafeSub in fun unsafeSub (v: 'a array, i: word) = u(v, wordAsInt i) end fun unsafeSet(v, i: word, e: 'a) = unsafeUpdate(v, wordAsInt i, e) end); open VectorOps; local (* Install the pretty printer for arrays *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) (printElem: 'a * int -> PolyML.pretty) (x: 'a array) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( printElem(w, d-1) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end (* Array *) structure ArraySlice = struct datatype 'a slice = Slice of { array: 'a Array.array, start: int, length: int }; fun length(Slice{length, ...}) = length fun op sub (Slice{array, start, length}, i: int): 'a = if i < 0 orelse i >= length then raise General.Subscript else unsafeSub(array, i+start) fun update (Slice{array, start, length}, i: int, new: 'a) : unit = if i < 0 orelse i >= length then raise General.Subscript else unsafeUpdate (array, i+start, new); (* Create a slice, checking the sizes so that the resulting slice is always valid. *) fun slice(vec: 'a array, i: int, NONE) = let val len = Array.length vec in if i >= 0 andalso i <= len then Slice{array=vec, start=i, length=len-i} (* Length is rest of array. *) else raise General.Subscript end | slice(vec: 'a array, i: int, SOME l) = let val len = Array.length vec in if i >= 0 andalso l >= 0 andalso i+l <= len then Slice{array=vec, start=i, length=l} (* Length is as given. *) else raise General.Subscript end (* Slice from the whole array. *) fun full a = Slice{array=a, start=0, length=Array.length a} (* Slice from existing slice *) fun subslice(Slice{array, start, length}, i: int, NONE) = if i >= 0 andalso i <= length then Slice{array=array, start=i+start, length=length-i} (* Length is rest of array. *) else raise General.Subscript | subslice(Slice{array, start, length}, i: int, SOME l) = if i >= 0 andalso l >= 0 andalso i+l <= length then Slice{array=array, start=i+start, length=l} (* Length is as given. *) else raise General.Subscript fun base(Slice{array, start, length}) = (array, start, length) fun vector (Slice{array, start, length}): 'a vector = makeVector(array, start, length) (* Copy one array into another. It's possible for the arrays to be the same and for the source and destinations to overlap so we have to take care of that. *) fun copy {src = Slice{array=s, start=srcStart, length=srcLen}, dst, di: int} = if di < 0 orelse di+srcLen > Array.length dst then raise General.Subscript else System_move_words_overlap(RunCall.unsafeCast s, srcStart+1, RunCall.unsafeCast dst, di+1, srcLen) (* Copy a vector into an array. *) fun copyVec {src: 'a VectorSlice.slice, dst: 'a array as d, di: int} = let val (v, i, len) = VectorSlice.base src in if di < 0 orelse di+len > Array.length dst then raise General.Subscript else System_move_words(RunCall.unsafeCast v, i, RunCall.unsafeCast d, di+1, len) end fun isEmpty(Slice{length, ...}) = length = 0 (* Return the first item of the slice and the rest of the slice. *) fun getItem(Slice{length=0, ...}) = NONE | getItem(Slice{array, start, length}) = SOME(unsafeSub(array, start), Slice{array=array, start=start+1, length=length-1}) (* Create the other functions. *) structure VectorOps = PolyVectorOperations( struct type 'a vector = 'a slice fun length(Slice{length, ...}) = intAsWord length local val u = unsafeSub in fun unsafeSub (Slice{array, start, ...}, i: word) = u(array, wordAsInt i + start) end fun unsafeSet(Slice{array, start, ...}, i: word, e: 'a) = unsafeUpdate(array, wordAsInt i + start, e) end); open VectorOps; end (* ArraySlice *) end; (* Local in end *) (* The ARRAY_SLICE signature refers to the Array structure so has to be defined afterwards. *) signature ARRAY_SLICE = sig type 'a slice val length : 'a slice -> int val sub : 'a slice * int -> 'a val update : 'a slice * int * 'a -> unit val full: 'a Array.array -> 'a slice val slice: 'a Array.array * int * int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val base: 'a slice -> 'a Array.array * int * int val vector: 'a slice -> 'a Vector.vector val copy : {src : 'a slice, dst : 'a Array.array, di : int} -> unit val copyVec : {src : 'a VectorSlice.slice, dst : 'a Array.array, di : int} -> unit val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a * 'a slice) option val appi : (int * 'a -> unit) -> 'a slice -> unit val app : ('a -> unit) -> 'a slice -> unit val modifyi : (int * 'a -> 'a) -> 'a slice -> unit val modify : ('a -> 'a) -> 'a slice -> unit val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldl : (('a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val find: ('a -> bool) -> 'a slice -> 'a option val exists: ('a -> bool) -> 'a slice -> bool val all: ('a -> bool) -> 'a slice -> bool val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order end; structure ArraySlice :> ARRAY_SLICE = ArraySlice; local open ArraySlice (* Install the pretty printer for array slices *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) (printElem: 'a * int -> PolyML.pretty) (x: 'a slice) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( printElem(w, d-1) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val _ = PolyML.addPrettyPrinter pretty end polyml-5.6/basis/Array2.sml000066400000000000000000000271131265146633400156740ustar00rootroot00000000000000(* Title: Standard Basis Library: Array2 structure and signature. Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: modified to accommodate changes in Array structure. *) signature ARRAY2 = sig eqtype 'a array type 'a region = { base : 'a array, row : int, col : int, nrows : int option, ncols : int option } datatype traversal = RowMajor | ColMajor val array: int * int * 'a -> 'a array val fromList: 'a list list -> 'a array val tabulate: traversal -> int * int * (int * int -> 'a) -> 'a array val sub: 'a array * int * int -> 'a val update: 'a array * int * int * 'a -> unit val dimensions: 'a array -> int * int val nCols: 'a array -> int val nRows: 'a array -> int val row: 'a array * int -> 'a Vector.vector val column: 'a array * int -> 'a Vector.vector val copy: {src : 'a region, dst : 'a array, dst_row : int, dst_col : int} -> unit val appi: traversal -> (int * int * 'a -> unit) -> 'a region -> unit val app: traversal -> ('a -> unit) -> 'a array -> unit val modifyi: traversal -> (int * int * 'a -> 'a) -> 'a region -> unit val modify: traversal -> ('a -> 'a) -> 'a array -> unit val foldi: traversal -> (int * int * 'a * 'b -> 'b) -> 'b -> 'a region -> 'b val fold: traversal -> ('a * 'b -> 'b) -> 'b -> 'a array -> 'b end; structure Array2 : ARRAY2 = struct (* There are lots of possible implementations with advantages and disadvantages according to the requirements. I'm choosing a very simple implementation in terms of arrays of arrays. *) (* This is implemented as a vector of rows i.e. Vector.sub(v, 0) returns the first row, Vector.sub(v, 1) the second. *) (* It's a bit messy though. In order for this to be an eqtype for any 'a it needs to be treated specially by the compiler so we have to inherit a type that has been created specially for the purpose. *) type 'a array = 'a Bootstrap.array type 'a implementation = 'a Array.array Vector.vector fun toArray(impl: 'a implementation): 'a array = RunCall.unsafeCast impl fun fromArray(a: 'a array): 'a implementation = RunCall.unsafeCast a type 'a region = { base : 'a array, row : int, col : int, nrows : int option, ncols : int option } datatype traversal = RowMajor | ColMajor fun array(r, c, init) = toArray(Vector.tabulate(r, fn _ => Array.array(c, init))) fun fromList l = let (* Check that all the lists have the same length. *) fun checkLen(l, NONE) = SOME(List.length l) | checkLen(l, SOME i) = if List.length l <> i then raise Size else SOME i val _ = List.foldl checkLen NONE l in (* Build the arrays. *) toArray(Vector.fromList(List.map (fn ll => Array.fromList ll) l)) end fun tabulate RowMajor (r, c, f) = toArray(Vector.tabulate(r, fn r' => Array.tabulate(c, fn c' => f(r', c')))) | tabulate ColMajor (r, c, f) = let (* First tabulate into column-major vectors. *) val vecs = Vector.tabulate(c, fn c' => Vector.tabulate(r, fn r' => f(r', c'))) in (* Convert this to row-major arrays. *) tabulate RowMajor (r, c, fn (r', c') => Vector.sub(Vector.sub(vecs, c'), r')) end (* Internal functions: These are used where we have already checked that the indexes are in range. Actually, at the moment these repeat the checking anyway. *) fun uncheckedSub(a, i, j) = Array.sub(Vector.sub(fromArray a, i), j) and uncheckedUpdate(arr, i, j, a) = Array.update(Vector.sub(fromArray arr, i), j, a) fun sub(a, i, j) = Array.sub(Vector.sub(fromArray a, i), j) fun update (arr, i, j, a) = Array.update(Vector.sub(fromArray arr, i), j, a) fun nRows a = Vector.length(fromArray a) (* This next is wrong in the case where nRows = 0. It'll do for the moment. *) fun nCols a = Array.length(Vector.sub(fromArray a, 0)) fun dimensions a = (nRows a, nCols a) fun row(a, i) = Array.vector(Vector.sub(fromArray a, i)) fun column(a, j) = Vector.tabulate(nRows a, fn i => sub(a, i, j)) (* Internal function. Check that the region is valid and get the actual lengths. *) fun getRegion {base, row, col, nrows, ncols} = let val (lRows, lCols) = dimensions base val nrows' = case nrows of NONE => if row < 0 orelse row > lRows then raise Subscript else lRows - row | SOME r => if r < 0 orelse row < 0 orelse r+row > lRows then raise Subscript else r val ncols' = case ncols of NONE => if col < 0 orelse col > lCols then raise Subscript else lCols - col | SOME c => if c < 0 orelse col < 0 orelse c+col > lCols then raise Subscript else c in (nrows', ncols') end fun copy {src as {base, row, col, ...}, dst, dst_row, dst_col} = let (* Check the region and get the lengths. *) val (nrows, ncols) = getRegion src val (dRows, dCols) = dimensions dst fun copyIncrementing(r, c) = if r = nrows then () else if c = ncols then copyIncrementing(r+1, 0) else ( uncheckedUpdate(dst, dst_row+r, dst_col+c, uncheckedSub(base, row+r, col+c)); copyIncrementing(r, c+1) ) fun copyDecrementing(r, c) = if r < 0 then () else if c < 0 then copyDecrementing(r-1, ncols-1) else ( uncheckedUpdate(dst, dst_row+r, dst_col+c, uncheckedSub(base, row+r, col+c)); copyDecrementing(r, c-1) ) in (* Check the destination *) if dst_row < 0 orelse dst_col < 0 orelse dst_row+nrows > dRows orelse dst_col+ncols > dCols then raise Subscript else (* We have to be careful if dst = src and the regions overlap. Rather than treat the overlapped case specially we simply choose incrementing or decrementing copies depending on the indexes. *) if dst_row < row orelse (dst_row = row andalso dst_col < col) then copyIncrementing(0, 0) else copyDecrementing(nrows-1, ncols-1) end fun appi tr f (reg as {base, row, col, ...}) = let val (nrows, ncols) = getRegion reg fun appRowMajor (r, c) = if r = nrows then () else if c = ncols then appRowMajor(r+1, 0) else ( f(r+row, c+col, uncheckedSub(base, r+row, c+col)); appRowMajor(r, c+1) ) fun appColMajor (r, c) = if c = ncols then () else if r = nrows then appColMajor(0, c+1) else ( f(r+row, c+col, uncheckedSub(base, r+row, c+col)); appColMajor(r+1, c) ) in case tr of RowMajor => appRowMajor(0, 0) | ColMajor => appColMajor(0, 0) end fun app tr f arr = appi tr (f o #3) {base=arr, row=0, col=0, nrows=NONE, ncols=NONE} (* Just define modify in terms of app. *) fun modifyi tr f (reg as {base, ...}) = appi tr (fn(i, j, a) => uncheckedUpdate(base, i, j, f(i, j, a))) reg fun modify tr f arr = modifyi tr (f o #3) {base=arr, row=0, col=0, nrows=NONE, ncols=NONE} (* Fold is fairly similar to app. *) fun foldi tr f init (reg as {base, row, col, ...}) = let val (nrows, ncols) = getRegion reg fun foldRowMajor (r, c, i) = if r = nrows then i else if c = ncols then foldRowMajor(r+1, 0, i) else foldRowMajor(r, c+1, f(r+row, c+col, uncheckedSub(base, r+row, c+col), i)) fun foldColMajor (r, c, i) = if c = ncols then i else if r = nrows then foldColMajor(0, c+1, i) else foldColMajor(r+1, c, f(r+row, c+col, uncheckedSub(base, r+row, c+col), i)) in case tr of RowMajor => foldRowMajor(0, 0, init) | ColMajor => foldColMajor(0, 0, init) end fun fold tr f init arr = foldi tr (fn (_,_,a,b) => f (a,b)) init {base=arr, row=0, col=0, nrows=NONE, ncols=NONE} local (* Install the pretty printer for arrays *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun 'a pretty(depth: int) (printElem: 'a * int -> PolyML.pretty) (x: 'a array): PolyML.pretty = let open PolyML val (nrows, ncols) = dimensions x fun put_elem (w, index, l, d) = if d = 0 then PrettyString "..." :: l else if d < 0 then l else printElem (w, d-1) :: (if index <> ncols-1 then PrettyString "," :: PrettyBreak(1, 0) :: l else l) fun putRowElements (row, col, tail, depth) = if col < 0 then tail else putRowElements(row, col-1, put_elem(sub(x, row, col), col, tail, depth), depth+1) (* TODO: This formats everything as a single block. We really want each row to be formatted as a block with consistent breaks. *) fun putRow(r, d, l) = if r < 0 then l else if d < 0 then putRow(r-1, d+1, l) else if d = 0 then putRow(r-1, d+1, PrettyString "..." :: l) else let val rowTail = if r <> nrows-1 then PrettyString "," :: PrettyBreak(1, 0) :: l else l val rowPrint = PrettyString "[" :: putRowElements(r, ncols-1, PrettyString "]" :: rowTail, d-ncols+1) in putRow(r-1, d+1, rowPrint) end in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else putRow(nrows-1, depth-nrows+1, [PrettyString "]"]) )) end in val () = PolyML.addPrettyPrinter pretty end end; polyml-5.6/basis/BIT_FLAGS.sml000066400000000000000000000023671265146633400160720ustar00rootroot00000000000000(* Title: Standard Basis Library: BIT_FLAGS signature Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature BIT_FLAGS = sig eqtype flags val toWord : flags -> SysWord.word val fromWord : SysWord.word -> flags val all: flags val flags : flags list -> flags val intersect: flags list -> flags val clear: flags * flags -> flags val allSet : flags * flags -> bool val anySet : flags * flags -> bool end; polyml-5.6/basis/BasicStreamIO.sml000066400000000000000000001023441265146633400171610ustar00rootroot00000000000000(* Title: Standard Basis Library: StreamIO functor Copyright David C.J. Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor BasicStreamIO( structure PrimIO : PRIM_IO structure Vector : MONO_VECTOR structure Array : MONO_ARRAY structure VectorSlice: MONO_VECTOR_SLICE structure ArraySlice: MONO_ARRAY_SLICE sharing type PrimIO.elem = Vector.elem = Array.elem = VectorSlice.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = Array.vector = VectorSlice.vector = ArraySlice.vector sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array_slice = ArraySlice.slice val someElem : PrimIO.elem ): sig include STREAM_IO (* Note: This is non-standard but enables us to define the derived BinIO and TextIO structures more efficiently. *) val outputVec: outstream * PrimIO.vector_slice -> unit end = struct open IO type vector = Vector.vector type elem = PrimIO.elem datatype reader = datatype PrimIO.reader datatype writer = datatype PrimIO.writer type array = Array.array type pos = PrimIO.pos exception Interrupt = RunCall.Interrupt (* Called after any exception in the lower level reader or writer to map any exception other than Io into Io. *) fun mapToIo (io as Io _, _, _) = io | mapToIo (Interrupt, _, _) = Interrupt | mapToIo (nonIo, name, caller) = Io { name = name, function = caller, cause = nonIo } val emptyVec = Vector.fromList [] (* Represents end-of-stream. *) datatype instream = (* The usual state of a stream: We may have to read from the reader before we have any real data or we may have already read. *) Uncommitted of { state: streamState ref, locker: Thread.Mutex.mutex } (* If we know we have unread input we can return this as the stream. That allows part of the stream to be read without locking. This is an optimisation. *) | Committed of { vec: vector, offset: int, rest: instream, startPos: pos option } and streamState = Truncated (* The stream has been closed or truncated. *) | HaveRead of (* A vector has been read from the stream. If the vector has size zero this is treated as EOF. startPos is the position when the vector was read. *) {vec: vector, rest: streamState ref, startPos: pos option } | ToRead of reader (* We have not yet closed or truncated the stream. *) and outstream = OutStream of { wrtr: writer, buffType : IO.buffer_mode ref, buf: array, bufp: int ref, isTerm: bool ref, locker: Thread.Mutex.mutex } datatype out_pos = OutPos of outstream * pos (* Create a new stream from the vector and the reader. *) fun mkInstream (r, v: vector): instream = let val readRest = Uncommitted { state = ref (ToRead r), locker = Thread.Mutex.mutex() } (* If the vector is non-empty the first entry is as though the vector had been read otherwise it's just the reader. *) in if Vector.length v = 0 then readRest else Committed { vec = v, offset = 0, rest = readRest, startPos = NONE } end local fun input' (ref (HaveRead {vec, rest, ...}), locker) = let (* TODO: If we have already read further on we could convert these entries to Committed. *) in (vec, Uncommitted{ state = rest, locker = locker }) end | input' (s as ref Truncated, locker) = (* Truncated: return end-of-stream *) (emptyVec, Uncommitted{ state = s, locker = locker }) | input' (state as ref(readMore as ToRead (RD {chunkSize, readVec = SOME readVec, getPos, ...})), locker) = let (* We've not yet read this. Try reading from the reader. *) val startPos = case getPos of SOME g => SOME(g()) | NONE => NONE val data = readVec chunkSize (* Create a reference to the reader which will be updated by the next read. The ref is shared between the existing stream and the new one so reading on either adds to the same chain. *) val nextLink = ref readMore val nextChunk = HaveRead {vec = data, rest = nextLink, startPos = startPos} in (* Extend the stream by adding this vector to the list of chunks read so far. *) state := nextChunk; (* Return a new stream which continues reading. *) (data, Uncommitted { state = nextLink, locker = locker }) end | input' (ref(ToRead(RD{name, ...})), _) = (* readVec missing in reader. *) raise Io { name = name, function = "input", cause = BlockingNotSupported } fun inputNList' (ref (HaveRead {vec, rest, startPos}), locker, n) = let val vecLength = Vector.length vec in if vecLength = 0 (* End-of-stream: Return next in list. *) then ([vec], Uncommitted{ state = rest, locker = locker }) else if n < vecLength then (* We can use what's already been read. The stream we return allows us to read the rest without blocking. *) ([VectorSlice.vector(VectorSlice.slice(vec, 0, SOME n))], Committed{ vec = vec, offset = n, startPos = startPos, rest = Uncommitted{ state = rest, locker = locker} }) else if n = vecLength then (* Exactly uses up the buffer. New stream state is the next entry. *) ([vec], Uncommitted{ state = rest, locker = locker}) else (* Have to get the next item *) let val (nextVecs, nextStream) = inputNList' (rest, locker, n - vecLength) in (vec :: nextVecs, nextStream) end end | inputNList' (s as ref Truncated, locker, _) = (* Truncated: return end-of-stream *) ([emptyVec], Uncommitted{ state = s, locker = locker }) | inputNList' (f, locker, n) = (* ToRead *) let val (vec, f') = input' (f, locker) in if Vector.length vec = 0 then ([vec], f') (* Truncated or end-of-file. *) else inputNList' (f, locker, n) (* Reread *) end in fun input (Uncommitted { state, locker }) = LibraryIOSupport.protect locker input' (state, locker) | input (Committed { vec, offset, rest, ... }) = (* This stream was produced from re-reading a stream that already had data. We can return the result without the overhead of locking. *) (VectorSlice.vector(VectorSlice.slice(vec, offset, NONE)), rest) fun inputNList (Uncommitted { state, locker }, n) = LibraryIOSupport.protect locker inputNList' (state, locker, n) | inputNList (Committed { vec, offset, rest, startPos }, n) = let val vecLength = Vector.length vec in if vecLength = 0 (* End-of-stream: Return next in list. *) then ([vec], rest) else if n < vecLength - offset then (* We can use what's already been read. Next entry is a committed stream that returns the part we haven't yet used. *) ([VectorSlice.vector(VectorSlice.slice(vec, offset, SOME n))], Committed{ vec = vec, offset = offset+n, rest = rest, startPos = startPos }) else if n = vecLength - offset then (* Exactly uses up the buffer. New stream state is the next entry. *) ([VectorSlice.vector(VectorSlice.slice(vec, offset, NONE))], rest) else (* Have to get the next item *) let val (nextVecs, nextStream) = inputNList (rest, n - (vecLength - offset)) in (VectorSlice.vector(VectorSlice.slice(vec, offset, NONE)) :: nextVecs, nextStream) end end fun inputN (f, n) = if n < 0 then raise Size else if n = 0 (* Defined to return the empty vector and f *) then (emptyVec, f) else let val (vecs, f') = inputNList (f, n) in (Vector.concat vecs, f') end (* Read the whole of the remaining input until we get an EOF. *) fun inputAll f = let (* Find out the size of the file. *) fun getSize(n, f) = let val (v, f') = input f val vSize = Vector.length v in if vSize = 0 then n (* Reached EOF. *) else getSize (n + vSize, f') end in (* Read the whole file. *) inputN(f, getSize(0,f)) end (* Note a crucial difference between inputN and input1. Because input1 does not return a stream if it detects EOF it cannot advance beyond a temporary EOF in a stream. *) fun input1 (Committed { vec, offset, rest, startPos }) = let val vecSize = Vector.length vec in if vecSize = 0 then NONE else if vecSize = offset+1 then SOME(Vector.sub(vec, offset), rest) else SOME(Vector.sub(vec, offset), Committed{ vec = vec, offset = offset+1, rest = rest, startPos = startPos }) end | input1 f = let val (s, f') = inputN (f, 1) in if Vector.length s = 0 then NONE else SOME(Vector.sub(s, 0), f') end end local fun doClose (ref (HaveRead {rest, ...})) = doClose rest | doClose (ref Truncated) = () | doClose (state as ref (ToRead (RD{close, ...}))) = (state := Truncated; close()) in fun closeIn (Uncommitted { state, locker }) = LibraryIOSupport.protect locker doClose state | closeIn (Committed { rest, ...}) = closeIn rest end local (* Return the reader. *) fun getReader' (ref (HaveRead {rest, ...})) = getReader' rest | getReader' (ref Truncated) = raise Io { name = "", function = "getReader", cause = ClosedStream } | getReader' (state as ref (ToRead reader)) = (state := Truncated; reader) in fun getReader'' (Uncommitted { state, locker }) = LibraryIOSupport.protect locker getReader' state | getReader'' (Committed { rest, ... }) = getReader'' rest fun getReader f = let val reader = getReader'' f val (allInput, _) = inputAll f in (* Return the reader along with buffered input. It's not clear what to do if there are EOFs in the stream. The book says the result is the result of inputAll which takes everything up to the first EOF. *) (reader, allInput) end end local (* Check that the stream is not terminated and then convert a file position plus a vector offset into a file position. In particular, if the reader has converted CRNL into NL we don't have a simple relationship between elements and file offsets. *) fun findPosition'(startPos, offset, HaveRead {rest=ref rest, ...}) = findPosition'(startPos, offset, rest) | findPosition'(_, _, Truncated) = raise Io { name = "", function = "filePosIn", cause = ClosedStream } | findPosition'(startPos, offset, ToRead (RD { getPos = SOME getPos, setPos = SOME setPos, readVec = SOME readVec, ...})) = if offset = 0 then startPos (* Easy *) else (* When we read this vector we recorded the file position of the beginning only. To find the file position of the particular element we actually need to read the portion of the input up to that element and find out the file position at that point. *) let val savep = getPos() (* Save current position. *) (* Move to the point where we read the vector. *) val () = setPos startPos; (* Call readVec until we have read the required number of elements. N.B. Ganser & Reppy has a bug here. There is no guarantee that readVec n will actually return n elements so it's unsafe to assume that it will move the file pointer by n elements. *) fun doRead n = let val read = Vector.length(readVec n) in if read = n orelse read = 0 (* Error? *) then () else doRead (n - read) end (* Read the offset number of elements. *) val () = doRead offset; (* Record the position after actually reading the elements. *) val position = getPos(); in setPos savep; (* Restore. *) position end | findPosition'(_, _, ToRead _) = raise Io { name = "", function = "filePosIn", cause = RandomAccessNotSupported } fun findPosition(startPos, offset, Committed { rest, ... }) = findPosition(startPos, offset, rest) | findPosition(startPos, offset, Uncommitted { state = ref state, locker }) = LibraryIOSupport.protect locker findPosition' (startPos, offset, state) fun filePosIn' (HaveRead {rest=ref rest, startPos = SOME startPos, ...}) = findPosition'(startPos, 0, rest) | filePosIn' (HaveRead {startPos = NONE, ...}) = raise Io { name = "", function = "filePosIn", cause = RandomAccessNotSupported } | filePosIn' Truncated = raise Io { name = "", function = "filePosIn", cause = ClosedStream } | filePosIn' (ToRead(RD { getPos = SOME getPos, ...})) = getPos() | filePosIn' (ToRead _) = raise Io { name = "", function = "filePosIn", cause = RandomAccessNotSupported } in (* Find the first entry to get the position. *) fun filePosIn (Uncommitted { state = ref state, locker }) = LibraryIOSupport.protect locker filePosIn' state | filePosIn (Committed { offset, rest, startPos = SOME startPos, ... }) = findPosition(startPos, offset, rest) | filePosIn (Committed { startPos = NONE, ... }) = (* This can occur either because the reader doesn't support getPos or because the position is within the initial vector passed to mkInstream. *) raise Io { name = "", function = "filePosIn", cause = RandomAccessNotSupported } end local fun doCanInput' (ref (HaveRead {vec, rest, ...}), locker, n, k) = let val vecLength = Vector.length vec in if vecLength = 0 then SOME k else if vecLength >= n then SOME (k+n) else doCanInput'(rest, locker, n-vecLength, k+vecLength) end | doCanInput' (ref Truncated, _, _, k) = SOME k | doCanInput' (state as ref(readMore as ToRead (RD {chunkSize, readVecNB = SOME readVecNB, getPos, ...})), locker, n, k) = let val startPos = case getPos of SOME g => SOME(g()) | NONE => NONE in (* Read a block full. This will avoid us creating lots of small items in the list if there is actually plenty of input available. *) case readVecNB chunkSize of NONE => (* Reading these would block but we may already have some input. *) if k = 0 then NONE else SOME k | SOME data => let (* We have to record this in the stream. *) val nextLink = ref readMore val nextChunk = HaveRead {vec = data, rest = nextLink, startPos = startPos} in state := nextChunk; (* Check whether this has satisfied the request. *) doCanInput'(state, locker, n, k) end end | doCanInput' (ref(ToRead(RD {name, ...})), _, _, _) = (* readVecNB missing in reader. *) raise Io { name = name, function = "canInput", cause = NonblockingNotSupported } fun doCanInput (Uncommitted { state, locker }, n, k) = LibraryIOSupport.protect locker doCanInput' (state, locker, n, k) | doCanInput (Committed { vec, rest, ... }, n, k) = let val vecLength = Vector.length vec in if vecLength = 0 then SOME k (* Reached EOF. *) else if vecLength >= n then SOME (k + n) (* Have already read enough. *) else doCanInput(rest, n-vecLength, k+vecLength) end in fun canInput(f, n) = if n < 0 then raise Size else doCanInput(f, n, 0) end (* Look for end-of-stream. Could be defined more directly but it probably isn't worth it. *) fun endOfStream f = let val (v, _) = input f in Vector.length v = 0 end (* OUTPUT *) (* In order to be able to flush and close the streams when we exit we need to keep a list of the output streams. One unfortunate side-effect of this is that the RTS can't garbage-collect output streams since there will always be a reference to a stream until it is explicitly closed. It could be worth using a weak reference here but that requires either a separate thread or some way of registering a function to be called to check the list. *) val ostreamLock = Thread.Mutex.mutex() (* Use a no-overwrite ref for the list of streams. This ensures that the ref will not be overwritten if we load a saved state. *) val outputStreamList: outstream list ref = LibrarySupport.noOverwriteRef nil; fun protectOut f (outs as OutStream{locker, ...}) = LibraryIOSupport.protect locker f outs fun mkOutstream'(wrtr as WR{chunkSize, ...}, buffMode) = let open Thread.Mutex val strm = OutStream{wrtr=wrtr, buffType=ref buffMode, buf=Array.array(chunkSize, someElem), isTerm=ref false, bufp=ref 0, locker=Thread.Mutex.mutex()} in (* Add it to the list. *) outputStreamList := strm :: ! outputStreamList; strm end val mkOutstream = LibraryIOSupport.protect ostreamLock mkOutstream' fun getBufferMode(OutStream{buffType=ref b, ...}) = b local (* Flush anything from the buffer. *) fun flushOut'(OutStream{buf, bufp=bufp as ref endBuf, wrtr=wrtr as WR{name, ...}, ...}) = if endBuf = 0 then () (* Nothing buffered *) else case wrtr of WR{writeArr=SOME wa, ...} => let fun flushBuff n = let val written = wa(ArraySlice.slice(buf, n, SOME(endBuf-n))) handle exn => raise mapToIo(exn, name, "flushOut") in if written+n = endBuf then () else flushBuff(written+n) end in (* Set the buffer to empty BEFORE writing anything. If we get an asynchronous interrupt (ctrl-C) we want to lose data in preference to duplicating it. *) bufp := 0; flushBuff 0 end | _ => raise Io { name = name, function = "flushOut", cause = BlockingNotSupported } (* Terminate a stream either because it has been closed or because we have extracted the underlying writer. *) fun terminateStream'(OutStream{isTerm=ref true, ...}) = () (* Nothing to do. *) | terminateStream'(f as OutStream{isTerm, ...}) = let (* outstream is not an equality type but we can get the desired effect by comparing the isTerm references for equality (N.B. NOT their contents). *) fun removeThis(OutStream{isTerm=isTerm', ...}) = isTerm' <> isTerm open Thread.Mutex in isTerm := true; lock ostreamLock; outputStreamList := List.filter removeThis (!outputStreamList); unlock ostreamLock; flushOut' f end; (* Close the stream. It is safe to repeat this and we may need to close the writer even if the stream is terminated. *) fun closeOut'(f as OutStream{wrtr=WR{close, ...}, ...}) = ( terminateStream' f; close() (* Close the underlying writer. *) ) (* Flush the stream, terminate it and return the underlying writer. *) fun getWriter'(OutStream{wrtr=WR{name, ...}, isTerm=ref true, ...}) = (* Already terminated. *) raise Io { name = name, function = "getWriter", cause = ClosedStream } | getWriter'(f as OutStream{buffType, wrtr, ...}) = ( terminateStream' f; (wrtr, !buffType) ) (* Set the buffer mode, possibly flushing the buffer as it does. *) fun setBufferMode' newBuff (f as OutStream{buffType, bufp, ...}) = (* Question: What if the stream is terminated? *) ( if newBuff = NO_BUF andalso !bufp <> 0 then (* Flush pending output. *) (* Switching from block to line buffering does not flush. *) flushOut' f else (); buffType := newBuff ) (* Internal function: Write a vector directly to the writer. It only returns when the vector has been completely written. "output" should work if the writer only provides writeArr so we may have to use that if writeVec isn't there. *) (* FOR TESTING: Put writeArr first. *) fun writeVec(OutStream{wrtr=WR{writeVec=SOME wv, name, ...}, ...}, v, i, len) = let fun forceOut p = let val written = wv(VectorSlice.slice(v, p+i, SOME(len-p))) handle exn => raise mapToIo(exn, name, "output") in if written+p = len then () else forceOut(written+p) end in forceOut 0 end | writeVec(OutStream{wrtr=WR{writeArr=SOME wa, name, ...}, ...}, v, i, len) = let val buffSize = 10 val buff = Array.array(buffSize, someElem); fun forceOut p = let val toCopy = Int.min(len-p, buffSize) val () = ArraySlice.copyVec{src=VectorSlice.slice(v, p+i, SOME toCopy), dst=buff, di=0} val written = wa(ArraySlice.slice(buff, 0, SOME toCopy)) handle exn => raise mapToIo(exn, name, "output") in if written+p = len then () else forceOut(written+p) end in forceOut 0 end | writeVec(OutStream{wrtr=WR{name, ...}, ...}, _, _, _) = raise Io { name = name, function = "output", cause = BlockingNotSupported } (* Internal function. Write a vector to the stream using the start and length provided. *) fun outputVector _ (OutStream{isTerm=ref true, wrtr=WR{name, ...}, ...}) = raise Io { name = name, function = "output", cause = ClosedStream } | outputVector (v, start, vecLen) (f as OutStream{buffType, buf, bufp, ...}) = let val buffLen = Array.length buf fun arrayCopyVec{src: Vector.vector, si: int, len: int, dst: Array.array, di: int} = ArraySlice.copyVec{src=VectorSlice.slice(src, si, SOME len), dst=dst, di=di}; fun addVecToBuff () = if vecLen < buffLen - !bufp then (* Room in the buffer. *) ( arrayCopyVec{src=v, si=start, len=vecLen, dst=buf, di= !bufp}; bufp := !bufp + vecLen ) else let val buffSpace = buffLen - !bufp in (* Copy as much of the vector as will fit *) arrayCopyVec{src=v, si=start, len=buffSpace, dst=buf, di= !bufp}; bufp := !bufp+buffSpace; (* TODO: Flushing the buffer ensures that all the buffer contents have been written. We don't actually need that, what we need is for enough to have been written that we have space in the buffer for the rest of the vector. *) flushOut' f; (* Write it out. *) (* Copy the rest of the vector. *) arrayCopyVec{src=v, si=start+buffSpace, len=vecLen-buffSpace, dst=buf, di=0}; bufp := vecLen-buffSpace end (* addVecToBuff *) in if vecLen > buffLen then (* If the vector is too large to put in the buffer we're going to have to write something out. To reduce copying we simply flush the buffer and write the vector directly. *) (flushOut' f; writeVec(f, v, start, vecLen)) else (* Try copying to the buffer. *) if !buffType = IO.NO_BUF then (* Write it directly *) writeVec(f, v, start, vecLen) else (* Block or line buffering - add it to the buffer. Line buffering is treated as block buffering on binary streams and handled at the higher level for text streams. *) addVecToBuff() end (* outputVec *) (* This could be defined in terms of outputVector but this is likely to be much more efficient if we are buffering. *) fun output1' _ (OutStream{isTerm=ref true, wrtr=WR{name, ...}, ...}) = raise Io { name = name, function = "output1", cause = ClosedStream } | output1' c (f as OutStream{buffType, buf, bufp, ...}) = if !buffType = IO.NO_BUF then writeVec(f, Vector.fromList[c], 0, 1) else (* Line or block buffering. *) ( Array.update(buf, !bufp, c); bufp := !bufp + 1; if !bufp = Array.length buf then flushOut' f else () ) fun getPosOut'(f as OutStream{wrtr=WR{name, getPos=SOME getPos, ...}, ...}) = ( flushOut' f; OutPos(f, getPos()) handle exn => raise mapToIo(exn, name, "getPosOut") ) | getPosOut'(OutStream{wrtr=WR{name, ...}, ...}) = raise Io { name = name, function = "getPosOut", cause = RandomAccessNotSupported } fun setPosOut' p (f as OutStream{wrtr=WR{setPos=SOME setPos, ...}, ...}) = ( flushOut' f; setPos p; f ) | setPosOut' _ (OutStream{wrtr=WR{name, ...}, ...}) = raise Io { name = name, function = "setPosOut", cause = RandomAccessNotSupported } in fun output1(f, c) = protectOut (output1' c) f fun output(f, v) = protectOut (outputVector(v, 0, Vector.length v)) f val flushOut = protectOut flushOut' val closeOut = protectOut closeOut' val getWriter = protectOut getWriter' fun setBufferMode(f, n) = protectOut (setBufferMode' n) f (* Exported function to output part of a vector. Non-standard. *) fun outputVec(f, slice) = let val (v, i, len) = VectorSlice.base slice in protectOut (outputVector(v, i, len)) f end val getPosOut = protectOut getPosOut' fun setPosOut(OutPos(f, p)) = protectOut (setPosOut' p) f end fun filePosOut(OutPos(_, p)) = p (* We need to set up a function to flush the streams when we exit. This has to be set up for every session so we set up an entry function, which is persistent, to do it. *) local fun closeAll () = (* Close all the streams. closeOut removes the streams from the list so we should end up with outputStreamList being nil. *) List.foldl (fn (s, ()) => closeOut s handle _ => ()) () (! outputStreamList) fun doOnEntry () = OS.Process.atExit closeAll in val () = PolyML.onEntry doOnEntry; val () = doOnEntry() (* Set it up for this session as well. *) end local open PolyML fun printWithName(s, name) = PolyML.PrettyString(String.concat[s, "-\"", String.toString name, "\""]) fun prettyIn depth a (Committed { rest, ...}) = prettyIn depth a rest | prettyIn _ _ (Uncommitted { state = ref streamState, ...}) = let fun prettyState Truncated = PolyML.PrettyString("Instream-truncated") | prettyState (HaveRead{ rest = ref rest, ...}) = prettyState rest | prettyState (ToRead(RD{name, ...})) = printWithName("Instream", name) in prettyState streamState end fun prettyOut _ _ (OutStream { wrtr = WR { name, ...}, ...}) = printWithName("Outstream", name) in val () = addPrettyPrinter prettyIn val () = addPrettyPrinter prettyOut end end; (* Define the StreamIO functor in terms of BasicStreamIO to filter out outputVec. *) (* This is non-standard. According to G&R 2004 StreamIO does not take the slice structures as args. *) functor StreamIO( structure PrimIO : PRIM_IO structure Vector : MONO_VECTOR structure Array : MONO_ARRAY structure VectorSlice: MONO_VECTOR_SLICE structure ArraySlice: MONO_ARRAY_SLICE sharing type PrimIO.elem = Vector.elem = Array.elem = VectorSlice.elem = ArraySlice.elem sharing type PrimIO.vector = Vector.vector = Array.vector = VectorSlice.vector = ArraySlice.vector sharing type PrimIO.array = Array.array = ArraySlice.array sharing type PrimIO.vector_slice = VectorSlice.slice = ArraySlice.vector_slice sharing type PrimIO.array_slice = ArraySlice.slice val someElem : PrimIO.elem ): STREAM_IO = struct structure StreamIO = BasicStreamIO(structure PrimIO = PrimIO and Vector = Vector and Array = Array and VectorSlice = VectorSlice and ArraySlice = ArraySlice val someElem = someElem) open StreamIO end; polyml-5.6/basis/BinIO.sml000066400000000000000000000111511265146633400154670ustar00rootroot00000000000000(* Title: Standard Basis Library: Binary IO Copyright David C.J. Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: in progress. *) signature BIN_IO = sig include IMPERATIVE_IO where type StreamIO.vector = Word8Vector.vector where type StreamIO.elem = Word8.word where type StreamIO.reader = BinPrimIO.reader where type StreamIO.writer = BinPrimIO.writer where type StreamIO.pos = BinPrimIO.pos val openIn : string -> instream val openOut : string -> outstream val openAppend : string -> outstream end; structure BinIO: BIN_IO = struct open IO structure StreamIO = BasicStreamIO( structure PrimIO = BinPrimIO structure Vector = Word8Vector structure Array = Word8Array structure VectorSlice = Word8VectorSlice structure ArraySlice = Word8ArraySlice val someElem : PrimIO.elem = 0wx20 ); (* For binary streams line-buffering is supposed to be treated as block buffering so we don't need to do anything special. *) structure ImpIO = ImperativeIO( structure StreamIO = StreamIO structure Vector = Word8Vector structure Array = Word8Array) open ImpIO open RuntimeCalls; exception Interrupt = RunCall.Interrupt (* Called after any exception in the lower level reader or writer to map any exception other than Io into Io. *) fun mapToIo (io as Io _, _, _) = io | mapToIo (Interrupt, _, _) = Interrupt | mapToIo (nonIo, name, caller) = Io { name = name, function = caller, cause = nonIo } type fileDescr = OS.IO.iodesc (* Actually abstract. This isn't the file descriptor itself, rather a pointer into the io table. *) local local val doIo: int*int*string -> fileDescr = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_open_in_bin name = doIo(4, 0, name) and sys_open_out_bin name = doIo(6, 0, name) and sys_open_append_bin name = doIo(14, 0, name) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_get_buffsize (strm: fileDescr): int = doIo(15, strm, 0) end fun wrapInFileDescr(n, name) = let val binPrimRd = LibraryIOSupport.wrapBinInFileDescr {fd=n, name=name, initBlkMode=true} val streamIo = StreamIO.mkInstream(binPrimRd, Word8Vector.fromList []) in mkInstream streamIo end fun wrapOutFileDescr(n, name, buffering, isAppend) = let val buffSize = sys_get_buffsize n val binPrimWr = LibraryIOSupport.wrapBinOutFileDescr{fd=n, name=name, appendMode=isAppend, chunkSize=buffSize, initBlkMode=true} (* Construct a stream. *) val streamIo = StreamIO.mkOutstream(binPrimWr, buffering) in mkOutstream streamIo end in (* Open a file for input. *) fun openIn s = wrapInFileDescr( sys_open_in_bin s handle exn => raise mapToIo(exn, s, "BinIO.openIn"), s) (* Open a file for output. *) fun openOut s = let val f = sys_open_out_bin s handle exn => raise mapToIo(exn, s, "BinIO.openOut") in wrapOutFileDescr (f, s, IO.BLOCK_BUF, false (* Not append *)) end fun openAppend s = let val f = sys_open_append_bin s handle exn => raise mapToIo(exn, s, "BinIO.openAppend") in wrapOutFileDescr (f, s, IO.BLOCK_BUF, true (* setPos will not work. *)) end end end; polyml-5.6/basis/BinPrimIO.sml000066400000000000000000000032401265146633400163170ustar00rootroot00000000000000(* Title: Standard Basis Library: Primitive Binary IO Copyright David C.J. Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Minor changes. I've included sharing constraints on the slice types which aren't in the book. *) structure BinPrimIO :> PRIM_IO where type vector = Word8Vector.vector where type elem = Word8.word where type array = Word8Array.array where type pos = Position.int where type vector_slice = Word8VectorSlice.slice where type array_slice = Word8ArraySlice.slice = PrimIO ( structure Array : MONO_ARRAY = Word8Array structure Vector : MONO_VECTOR = Word8Vector structure VectorSlice = Word8VectorSlice structure ArraySlice = Word8ArraySlice val someElem : Vector.elem = 0wx20 (* Initialise to spaces. *) (* BinPrimIO.pos is defined to be Position.int *) type pos = Position.int val compare = Position.compare ); polyml-5.6/basis/Bool.sml000066400000000000000000000055111265146633400154250ustar00rootroot00000000000000(* Title: Standard Basis Library: Bool Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R status: Minor change to signature. Done. *) signature BOOL = sig datatype bool = datatype bool val not : bool -> bool val fromString : string -> bool option val scan : (char, 'a) StringCvt.reader -> (bool, 'a) StringCvt.reader val toString : bool -> string end; structure Bool : BOOL = struct open RuntimeCalls; (* for POLY_SYS and EXC numbers *) datatype bool = datatype bool val not: bool -> bool = RunCall.run_call1 POLY_SYS_not_bool; local val explode_true = Text.String.explode "true" and explode_false = Text.String.explode "false" in fun scan (getc: (char, 'a) StringCvt.reader) (str: 'a) : (bool * 'a) option = let (* Skip leading white space. *) val strm = StringCvt.skipWS getc str (* Test for a match between a reader and a list of lower case chars. *) fun matchNC _ strm [] = (strm, true )(* Reached end of list - succeeded *) | matchNC getc strm (ch::rest) = case getc strm of NONE => (strm, false) (* Couldn't read it - fail. *) | SOME(ch', strm') => if ch = Char.toLower ch' (* N.B. ch is already lower case. *) then matchNC getc strm' rest else (strm', false) in (* If it matches "true" or "false" we have a valid match, otherwise return NONE. *) case matchNC getc strm explode_true of (strm', true) => SOME(true, strm') | _ => ( case matchNC getc strm explode_false of (strm', true) => SOME(false, strm') | _ => NONE ) end end (* Convert from a string. *) (* TODO: More efficient conversion? *) val fromString = StringCvt.scanString scan (* Convert to a string. *) fun toString true = "true" | toString false = "false" end; polyml-5.6/basis/BoolArray.sml000066400000000000000000000512421265146633400164260ustar00rootroot00000000000000(* Title: Standard Basis Library: BoolArray and BoolVector Structures Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R status: BoolVector and BoolArray done. TODO: Add sliced versions. *) local open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open LibrarySupport (* TODO: Use a single word for vectors of size <= number of bits in a word. *) (* We use int here for the length rather than word because the number of bits could be more than the maximum value of Word.word. *) datatype vector = Vector of int * Bootstrap.byteVector (* This has a byte-wise equality. *) and array = Array of int * Bootstrap.byteArray (* This has pointer equality. *) val wordSize : word = LibrarySupport.wordSize; val System_loadbV: Bootstrap.byteVector*word->word = RunCall.run_call2 POLY_SYS_load_byte; val System_setbV: Bootstrap.byteVector * word * word -> unit = RunCall.run_call3 POLY_SYS_assign_byte val System_loadbA: Bootstrap.byteArray*word->word = RunCall.run_call2 POLY_SYS_load_byte; val System_setbA: Bootstrap.byteArray * word * word -> unit = RunCall.run_call3 POLY_SYS_assign_byte; (* Casts between int and word. *) val intAsWord: int -> word = RunCall.unsafeCast and wordAsInt: word -> int = RunCall.unsafeCast val bitsPerWord = wordAsInt wordSize * 8 (* Limit the size to the maximum value of Word.word. This is actually a long integer but since we always do the arithmetic as integers it will be fine. *) val maxLen = IntInf.pow(2, Word.wordSize) - 1 local val F_mutable_bytes : int = 65; in (* All the arrays and vectors are initially created containing zeros and then initialised. If the length is zero a one-word object is created. In the case of vectors this will remain all zeros and will be locked so that two zero-sized vectors will be equal. *) fun alloc bits = let val System_alloc = RunCall.run_call3 POLY_SYS_alloc_store val words : word = if bits = 0 then 0w1 (* Zero-sized objects are not allowed. *) else if bits < 0 orelse bits > maxLen then raise General.Size else intAsWord(Int.quot((bits + (bitsPerWord - 1)), bitsPerWord)) in System_alloc(words, F_mutable_bytes, 0) end end val andb = Word.andb and orb = Word.orb and notb = Word.notb and << = Word.<< and >> = Word.>>; infix 9 sub infix 7 andb infix 6 orb infix 5 << >> (* Create a vector/array from a list. Used as the basis of Array.fromList and Vector.fromList. *) fun fromList' (l : bool list) = let val System_setb = RunCall.run_call3 POLY_SYS_assign_byte val length = List.length l (* Make a array initialised to zero. *) val vec = alloc length; (* Accumulate the list elements into bytes and store them in the vector. *) fun init (byteno, acc, bit, []) = if bit = 0w1 then () else System_setb(vec, byteno, acc) | init (byteno, acc, bit, a :: b) = let val byte = if a then bit orb acc else acc in if bit = 0wx80 then ( System_setb(vec, byteno, byte); init(byteno+0w1, 0w0, 0w1, b) ) else init(byteno, byte, bit << 0w1, b) end in init(0w0, 0w0, 0w1, l); (length, vec) end fun tabulate' (length: int, f : int->bool) = let val System_setb = RunCall.run_call3 POLY_SYS_assign_byte val vec = if length >= 0 then alloc length else raise General.Size; (* Accumulate the bits into bytes and store into the array. *) fun init i byteNo bit acc = if i < length then let val byte = if f i then bit orb acc else acc in if bit = 0wx80 then ( System_setb(vec, byteNo, byte) ; init (i+1) (byteNo+0w1) 0w1 0w0 ) else init (i+1) byteNo (bit << 0w1) byte end else if acc = 0w0 then () else (* Put in the last byte. *) System_setb(vec, byteNo, acc) in init 0 0w0 0w1 0w0; (length, vec) end (* Internal function which subscripts the vector assuming that the index has already been checked for validity. *) fun uncheckedSub (v, i: int): bool = let val System_loadb = RunCall.run_call2 POLY_SYS_load_byte val (byteOffset, bitOffset) = IntInf.quotRem(i, 8) val byte = System_loadb(v, intAsWord byteOffset); val mask = 0w1 << intAsWord bitOffset in byte andb mask <> 0w0 end (* Move a set of bits from one vector of bytes to another. The bits may not be on the same byte alignment. Does not examine the destination so if dest_off is not byte aligned any bits required in the first byte must be passed in as src_in. Returns any bits which do not exactly fit into a byte. *) (* TODO: This only handles the case where the source starts at the beginning of the vector. It is easy to modify it for the case where the source offset is a multiple of 8 but more difficult to handle the other cases. *) fun move_bits(src: Bootstrap.byteVector, dest: Bootstrap.byteVector, dest_off, len, last_bits) = let val dest_byte = intAsWord(Int.quot(dest_off, 8)) (* Byte offset *) val dest_bit = intAsWord dest_off - dest_byte*0w8 (* Bit offset *) fun do_move last byte len : word = if len >= 8 then let (* Get the next byte and shift it up *) val newbyte = last orb (System_loadbV(src, byte) << dest_bit) in (* Store the low-order 8 bits into the destination. *) System_setbV(dest, dest_byte+byte, newbyte); (* Shift the accumulator down by 8 bits and get ready for the next byte. *) do_move (newbyte >> 0w8) (byte+0w1) (len-8) end else if len <= 0 then last else (* 0 < len < 8 *) let (* Get the next byte and shift it up *) val nextsrc = System_loadbV(src, byte); val newbyte: word = last orb (nextsrc << dest_bit) (* This assumes that any extra bits of the source are zero. *) in if len + Word.toInt dest_bit >= 8 then ( (* Store the low-order 8 bits into the destination. *) System_setbV(dest, dest_byte+byte, newbyte); (* Shift the accumulator down by 8 bits and get ready for the next byte. *) do_move (newbyte >> 0w8) (byte+0w1) (len-8) ) else newbyte end in (* TODO: If dest_bit is zero we can simply move the bytes. If len is not a multiple of 8 we may have to return the low-order bits. *) do_move last_bits 0w0 len end in structure BoolVector: MONO_VECTOR = struct val System_lock: Bootstrap.byteVector -> unit = RunCall.run_call1 POLY_SYS_lockseg; type vector = vector type elem = bool val maxLen = maxLen fun length(Vector(l, _)) = l fun op sub (Vector(l, v), i: int): bool = if i < 0 orelse i >= l then raise General.Subscript else uncheckedSub(v, i) (* Create a vector from a list. Must lock the vector before returning it. *) fun fromList (l : elem list) : vector = let val (length, vec) = fromList' l in System_lock vec; Vector(length, vec) end fun tabulate (length: int, f : int->elem): vector = let val (length, vec) = tabulate' (length, f) in System_lock vec; Vector(length, vec) end (* fun map f (Vector(len, vec)) = let val new_vec = alloc len (* Destination vector. *) fun mapbyte b i acc max = if i = max then acc else if f ((b andb i) <> 0w0) then mapbyte b (i<<0w1) (acc orb i) max else mapbyte b (i<<0w1) acc max fun copy b l = if l <= 0 then () else let val byte = System_loadb(vec, b) val res = (* Map each byte to get the result. Must not apply the function beyond the last bit. *) if l >= 8 then mapbyte byte 0w1 0w0 0wx100 else mapbyte byte 0w1 0w0 (0w1 << Word.fromInt l) in System_setb(new_vec, b, res); copy (b+0w1) (l-8) end in copy 0w0 len; System_lock new_vec; Vector(len, new_vec) end*) fun mapi f (Vector(len, vec)) = let val new_vec = alloc len (* Destination vector. *) fun mapbyte b i acc max l = if i = max then acc else if f (len-l, ((b andb i) <> 0w0)) then mapbyte b (i<<0w1) (acc orb i) max (l-1) else mapbyte b (i<<0w1) acc max (l-1) fun copy b l = if l <= 0 then () else let val byte = System_loadbV(vec, b) val res = (* Map each byte to get the result. Must not apply the function beyond the last bit. *) if l >= 8 then mapbyte byte 0w1 0w0 0wx100 l else mapbyte byte 0w1 0w0 (0w1 << Word.fromInt l) l in System_setbV(new_vec, b, res); copy (b+0w1) (l-8) end in copy 0w0 len; System_lock new_vec; Vector(len, new_vec) end (* To save duplicating almost the same code just define map in terms of mapi. *) fun map f v = mapi (fn (_, x) => f x) v (* Return a copy of the vector with a particular entry replaced *) fun update (v as Vector(len, _), i, c) = if i < 0 orelse i >= len then raise Subscript else mapi (fn (j, s) => if j = i then c else s) v fun concat l = let (* Calculate the total length *) fun total [] i = i | total (Vector(len, _)::t) i = total t (i+len) val total_len = total l 0 in let (* Allocate a new vector. *) val new_vec = alloc total_len (* Copy all the source vectors into the destination. *) fun copy_list (Vector(src_len, src_vec)::t) dest_off bits = let val next = move_bits(src_vec, new_vec, dest_off, src_len, bits) in copy_list t (dest_off+src_len) next end | copy_list [] dest_off bits = (* At the end of the lists store any extra in the last byte. *) if bits = 0w0 then () else System_setbV(new_vec, intAsWord(Int.quot(dest_off, 8)), bits) in copy_list l 0 0w0; System_lock new_vec; Vector(total_len, new_vec) end end (* Create the other functions. *) structure VectorOps = VectorOperations( struct type vector = vector and elem = elem fun length(Vector(l, _)) = intAsWord l fun unsafeSub (Vector(_, v), i) = uncheckedSub(v, wordAsInt i) fun unsafeSet _ = raise Fail "Should not be called" end); open VectorOps; local (* Install the pretty printer for BoolVector.vector *) fun pretty(depth: int) _ (x: vector) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString(if w then "true" else "false") :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end structure BoolArray: MONO_ARRAY = struct type array = array type elem = bool type vector = vector val maxLen = maxLen; fun length(Array(l, _)) = l (* Internal function for updating a bit assuming the bounds checks have already been done. *) fun uncheckedUpdate(v, i, new): unit = let val (byteOffset, bitOffset) = IntInf.quotRem(i, 8) val byteOffsetW = intAsWord byteOffset val byte = System_loadbA(v, byteOffsetW); val mask = 0w1 << intAsWord bitOffset val newByte = if new then byte orb mask else byte andb (notb mask) in System_setbA(v, byteOffsetW, newByte) end fun array (len, ini) = let (* Create the array with zeros initially. *) val vec = alloc len (* If we need to set this to true we set all the bytes to 0xff. This could mean that we have bits set which don't correspond to values in the range and so two arrays with the same abstract values could have different representations. That's safe for arrays because equality is pointer equality but wouldn't be safe for immutables because structure equality could give the wrong answer. *) fun setTrue i b = if len <= i then () else (System_setbA(vec, b, 0wxff); setTrue (i+8) (b+0w1)) in if ini then setTrue 0 0w0 else (); Array(len, vec) end fun op sub (Array(l, v), i: int): elem = if i < 0 orelse i >= l then raise General.Subscript else uncheckedSub(v, i) (* Exported update function. *) fun update (Array (l, v), i: int, new) : unit = if i < 0 orelse i >= l then raise General.Subscript else uncheckedUpdate(v, i, new) (* Create an array from a list. *) fun fromList (l : elem list) : array = Array(fromList' l) fun tabulate (length: int , f : int->elem): array = Array(tabulate'(length, f)) fun vector(Array(len, vec)): vector = (* TODO: We may be able to handle special cases where the source and destination are aligned on the same bit offset. For the moment just take the simple approach. *) BoolVector.tabulate(len, fn j => uncheckedSub(vec, j)) (* Copy one array into another. The arrays could be the same but in that case di must be zero. *) fun copy {src=Array (slen, s), dst=Array (dlen, d), di: int} = if di < 0 orelse di+slen > dlen then raise General.Subscript else (* TODO: Handle multiple bits where possible by using move_bits or a variant. *) let fun copyBits n = if n >= slen then () else (uncheckedUpdate(d, di+n, uncheckedSub(s, n)); copyBits(n+1)) in copyBits 0 end (* fun copy {src as Array (slen, s), dst as Array (dlen, d), di: int} = let in if di < 0 orelse di+slen > dlen then raise General.Subscript else if si < di then (* Moving up - Start from the end *) (* TODO: Handle multiple bits where possible by using move_bits or a variant. *) let fun copyBits n = if n < 0 then () else (uncheckedUpdate(d, di+n, uncheckedSub(s, si+n)); copyBits(n-1)) in copyBits (slen-1) end else (* Moving down. *) let fun copyBits n = if n >= slice_len then () else (uncheckedUpdate(d, di+n, uncheckedSub(s, si+n)); copyBits(n+1)) in copyBits 0 end end *) (* Copy a vector into an array. *) fun copyVec {src=Vector(slen, s), dst=Array (dlen, d), di: int} = let fun copyBits n = if n >= slen then () else (uncheckedUpdate(d, di+n, uncheckedSub(s, n)); copyBits(n+1)) in if di < 0 orelse di+slen > dlen then raise General.Subscript else copyBits 0 end (* Create the other functions. *) structure VectorOps = VectorOperations( struct type vector = array and elem = elem fun length(Array(l, _)) = intAsWord l fun unsafeSub (Array(_, v), i) = uncheckedSub(v, wordAsInt i) fun unsafeSet (Array(_, v), i, new) = uncheckedUpdate(v, wordAsInt i, new) end); open VectorOps; local (* Install the pretty printer for BoolArray.array *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) _ (x: array) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString(if w then "true" else "false") :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end end; polyml-5.6/basis/Byte.sml000066400000000000000000000043061265146633400154360ustar00rootroot00000000000000(* Title: Standard Basis Library: Byte Structure and signature Author: David Matthews Copyright David Matthews 1999, 2005, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA under the terms of that licence. *) signature BYTE = sig val byteToChar : Word8.word -> char val charToByte : char -> Word8.word val bytesToString : Word8Vector.vector -> string val stringToBytes : string -> Word8Vector.vector val unpackStringVec : Word8VectorSlice.slice -> string val unpackString : Word8ArraySlice.slice -> string val packString : Word8Array.array * int * Substring.substring -> unit end; structure Byte: BYTE = struct (* Chars and Word8.word values are both tagged integers in the range 0..255. *) fun byteToChar (w: Word8.word): char = RunCall.unsafeCast w fun charToByte (c: char) : Word8.word = RunCall.unsafeCast c (* Conversion between Word8Vector.vector and string is just a cast. *) val bytesToString = LibrarySupport.w8vectorToString and stringToBytes = LibrarySupport.w8vectorFromString fun unpackStringVec slice : string = bytesToString(Word8VectorSlice.vector slice) fun unpackString slice : string = bytesToString(Word8ArraySlice.vector slice) fun packString(array: Word8Array.array, i, s: substring) = let val (str, offset, size) = Substring.base s val slice = Word8VectorSlice.slice(stringToBytes str, offset, SOME size) in Word8ArraySlice.copyVec{src=slice, dst=array, di=i} end end; polyml-5.6/basis/COPYING000066400000000000000000000634671265146633400150660ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; 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. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! polyml-5.6/basis/CommandLine.sml000066400000000000000000000024431265146633400167210ustar00rootroot00000000000000(* Title: Standard Basis Library: CommandLine Structure and Signature Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 checked: no change. *) signature COMMAND_LINE = sig val name : unit -> string val arguments : unit -> string list end structure CommandLine : COMMAND_LINE = struct fun callProcEnv (code: int) args = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env (code,args); val name : unit -> string = callProcEnv 0 val arguments : unit -> string list = callProcEnv 1 end; polyml-5.6/basis/Date.sml000066400000000000000000000521241265146633400154110ustar00rootroot00000000000000(* Title: Standard Basis Library: Date Signature and structure. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Signature checked. No change. Probably needs the structure checking to see whether the implementation is correct. *) signature DATE = sig datatype weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun datatype month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec type date exception Date val date : { year : int, month : month, day : int, hour : int, minute : int, second : int, offset : Time.time option } -> date val year : date -> int val month : date -> month val day : date -> int val hour : date -> int val minute : date -> int val second : date -> int val weekDay : date -> weekday val yearDay : date -> int val offset : date -> Time.time option val isDst : date -> bool option val localOffset : unit -> Time.time val fromTimeLocal : Time.time -> date val fromTimeUniv : Time.time -> date val toTime : date -> Time.time val toString : date -> string val fmt : string -> date -> string val fromString : string -> date option val scan : (char, 'a) StringCvt.reader -> 'a -> (date * 'a) option val compare : date * date -> General.order end; structure Date :> DATE = struct (* There seems to be an assumption, particularly in the "compare" function, that Date.date values are records of year, month, day etc. *) type date = { year: int, (* Signed year. *) month: int, (* Month as 0..11 *) day: int, (* Day as 1..(28, 29, 30, 31) *) hour: int, (* Hour as 0..23 *) minute: int, (* Minute as 0..59 *) second: int, (* Second as 0..59 (maybe 60 or 61 if leap) *) offset: Time.time option (* Offset as Time.time -24hrs raise Date (* Should never happen *) fun isLeapYear l = if l mod 100 = 0 then (l div 100) mod 4 = 0 else l mod 4 = 0 (* Convert the enumerated type to a month number. *) fun monthToMonthNo Jan = 0 | monthToMonthNo Feb = 1 | monthToMonthNo Mar = 2 | monthToMonthNo Apr = 3 | monthToMonthNo May = 4 | monthToMonthNo Jun = 5 | monthToMonthNo Jul = 6 | monthToMonthNo Aug = 7 | monthToMonthNo Sep = 8 | monthToMonthNo Oct = 9 | monthToMonthNo Nov = 10 | monthToMonthNo Dec = 11 open RuntimeCalls fun callTiming (code: int) args = RunCall.run_call2 RuntimeCalls.POLY_SYS_timing_dispatch (code,args); (* Get the local time offset which applied at the specific time. The time is in seconds since the epoch. The result may be the current time offset if it is outside the range for which we have information. We use seconds as the argument and result here because it avoids having to multiply and divide arbitrary precision values in the RTS. May raise Size if the value is too large (or small). In that case we use the current time offset. *) fun localOffsetApplying (t: int) : int = callTiming 4 t handle General.Size => callTiming 4 (Time.toSeconds(Time.now())) (* Get the current local time offset. *) fun localOffset (): Time.time = Time.fromSeconds(localOffsetApplying(Time.toSeconds(Time.now()))) local (* Time values are since 1st January of this year. *) val baseYear: int = callTiming 2 0 val yearOffset: int = callTiming 3 0 (* The offset of zeroTime within that year. *) (* Get the day in the year. Either of day or year may be unnormalised but that shouldn't affect the result (except if year is negative???) *) fun dayInYear (day, month, year) = if isLeapYear year then Vector.sub(dayInLeapYearVec, month) + day else Vector.sub(dayVec, month) + day (* Compute the number of days since the start. *) fun yearToDays y = let fun ytod dys yr = if yr = baseYear then dys (* If the year is before the base year we subtract the number of days in this year and recurse. *) else if yr < baseYear then if isLeapYear yr then ytod (dys-366) (yr+1) else ytod (dys-365) (yr+1) (* The year we want is after the base year. *) else if yr - baseYear >= 100 (* If it is more than a century apart then we can add in the number of days in a century. There are 24 leap years in most centuries except those which are divisible by 400. Note: We're assuming the Gregorian calendar. *) then if ((yr-1) div 100) mod 4 = 0 then ytod (dys+36525) (yr-100) else ytod (dys+36524) (yr-100) else if isLeapYear(yr-1) then ytod (dys+366) (yr-1) else ytod (dys+365) (yr-1) in ytod 0 y end (* Convert days to number of years plus the day within the year. *) fun daysToYears d = let fun dtoy dys yr = if dys < 0 then (* Before the base year: have to add in days. *) if isLeapYear (yr-1) then dtoy (dys+366) (yr-1) else dtoy (dys+365) (yr-1) (* If we are at least a century away we can subtract the century. *) else if dys >= 36525 then if ((yr+99) div 100) mod 4 = 0 then dtoy (dys-36525) (yr+100) else dtoy (dys-36524) (yr+100) else if isLeapYear yr then if dys >= 366 then dtoy (dys-366) (yr+1) else (yr, dys) else if dys >= 365 then dtoy (dys-365) (yr+1) else (yr, dys) in dtoy d baseYear end (* Convert a number of seconds to a date. *) fun fromSeconds t (tzOffset: Time.time option) : date = let val tsecs = t - yearOffset val secs = tsecs mod 60 val mins = (tsecs div 60) mod 60 val hrs = (tsecs div secsPerHour) mod 24 (* Get the day and year. The day is a value between 0 and 364/365. *) val (year, days) = daysToYears (tsecs div secsPerDay) (* Convert the day into a month+day *) val isLeap = isLeapYear year fun dayToMonth dy mth = if dy <= Vector.sub(if isLeap then dayInLeapYearVec else dayVec, mth+1) then mth else dayToMonth dy (mth+1) val month = dayToMonth days 0 val dayInMonth = days - Vector.sub(if isLeap then dayInLeapYearVec else dayVec, month) in {year=year, month=month, day=dayInMonth, hour=hrs, minute=mins, second=secs, offset = tzOffset } end in (* Get the day in the year. *) fun yearDay({day, month, year, ...}:date) = dayInYear(day, month, year) (* Convert the date into a UTC time value. *) fun toTime (date as {year, hour, minute, second, offset, ...}) = let (* Compute the seconds. *) val secs = second + minute*60 + hour*secsPerHour + (yearDay date + yearToDays year)*secsPerDay + yearOffset; in case offset of SOME t => Time.+(t, Time.fromSeconds secs) | NONE => Time.fromSeconds(secs + localOffsetApplying secs) end (* Convert a UTC time to a UTC date. *) fun fromTimeUniv t = fromSeconds (Time.toSeconds t) (SOME Time.zeroTime) (* Convert a UTC time to a date in the local time zone. *) fun fromTimeLocal t = let val secs = Time.toSeconds t val localOffset = localOffsetApplying secs in fromSeconds (secs-localOffset) NONE end (* Generate a normalised date. *) fun date {year, month, day, hour, minute, second, offset} = let (* Get the time zone information if it is provided. If it is outside +/- 24 hours we get the number of full days. *) val (tzDays, normTz) = case offset of SOME tz => let open Time val excess = Int.quot(Time.toSeconds tz, secsPerDay)*secsPerDay; in (excess, SOME(tz-Time.fromSeconds excess)) end | NONE => (0, NONE) (* Convert it to the number of seconds since the epoch which will normalise it. *) val secs = second + minute*60 + hour*secsPerHour + (dayInYear(day, monthToMonthNo month, year) + yearToDays year)*secsPerDay + yearOffset + tzDays; in (* Convert it into a date. *) fromSeconds secs normTz end end val year: date->int = #year and day: date->int = #day and hour: date->int = #hour and minute: date->int = #minute and second: date->int = #second and offset: date->Time.time option = #offset (* Return the month from the enumerated type. *) fun month({month, ...}:date) = monthNoToMonth month (* Get the day of the week as a number - not exported. *) fun dayOfWeek({year, month, day, ...}: date) = let (* From looking at the code of mktime, which is marked as being in the public domain, this formula (Zeller's Congruence?) is used to find the day of the week for the first of any month. I don't know what range this works for but it seems accurate as far as I can test it. *) val m0 = month+1 (* Count months from 1 *) val m1 = (m0 + 9) mod 12 + 1 val yy0 = if m0 <= 2 then year-1 else year val yy1 = yy0 div 100 val yy2 = yy0 mod 100 val dow = ((26*m1 - 2) div 10 + 1 + yy2 + yy2 div 4 + yy1 div 4 - 2*yy1) mod 7 in (* Add on the day within the month. *) (dow + day - 1) mod 7 end (* Get day of week as an enumerated type - exported. *) fun weekDay date = Vector.sub(dayOfWkVec, dayOfWeek date) (* QUESTION: The definition of isDst is very vague. I am assuming that it means that, for a local time, did/will Summer Time apply at that time? *) fun isDst (d as {offset=NONE, ...} : date): bool option = let val isSummer = callTiming 5 (Time.toSeconds(toTime d)) handle Size => ~1 in if isSummer < 0 then NONE else SOME (isSummer > 0) end | isDst {offset=SOME _, ...} = SOME false (* ?? *) (* Compare the dates ignoring time zone information. *) fun compare({year=y1, month=m1, day=d1, hour=h1, minute=n1, second=s1, ...}:date, {year=y2, month=m2, day=d2, hour=h2, minute=n2, second=s2, ...}:date) = if y1 < y2 then General.LESS else if y1 > y2 then General.GREATER else if m1 < m2 then General.LESS else if m1 > m2 then General.GREATER else if d1 < d2 then General.LESS else if d1 > d2 then General.GREATER else if h1 < h2 then General.LESS else if h1 > h2 then General.GREATER else if n1 < n2 then General.LESS else if n1 > n2 then General.GREATER else Int.compare(s1, s2) (* Parse a date/time. *) fun scan getc str = let (* Try to extract an n-character string. *) fun getChars n str = let fun getN 0 s str = SOME (String.implode(List.rev s), str) | getN n s str = case getc str of NONE => NONE | SOME(ch, str') => getN (n-1) (ch :: s) str' in getN n [] str end (* Get the day of the week. We don't actually use it but we need to verify it. *) (* QUESTION: What time offset should be used? I presume NONE. *) fun parseDayOfWeek str = case getChars 3 str of NONE => NONE | SOME(s, str') => if Vector.foldr (fn(s', t) => t orelse s=s') false dayNames then SOME(s, str') else NONE fun parseMonth str = case getChars 3 str of NONE => NONE | SOME(s, str') => (* Return the month corresponding to the month name otherwise NONE. *) Vector.foldri (fn(n:int, s':string, t) => if s = s' then SOME(Vector.sub(monthVec, n), str') else t) NONE monthNames (* Get a two digit number. *) fun parse2Digits str = case getc str of NONE => NONE | SOME(ch0, str1) => if ch0 < #"0" orelse ch0 > #"9" then NONE else case getc str1 of NONE => NONE | SOME(ch1, str2) => if ch1 < #"0" orelse ch1 > #"9" then NONE else SOME((Char.ord ch0 - Char.ord #"0")*10 + (Char.ord ch1 - Char.ord #"0"), str2) (* Get two digits as a day of the month. Don't check the range. *) val parseDayOfMonth = parse2Digits (* A time is written as hh:mm:ss *) fun parseTime str = case parse2Digits str of NONE => NONE | SOME(hh, str1) => case getc str1 of NONE => NONE | SOME(ch, str2) => if ch <> #":" then NONE else case parse2Digits str2 of NONE => NONE | SOME(mm, str3) => case getc str3 of NONE => NONE | SOME(ch, str4) => if ch <> #":" then NONE else case parse2Digits str4 of NONE => NONE | SOME(ss, str5) => SOME((hh, mm, ss), str5) (* A year is represented as four digits. *) fun parseYear str = case parse2Digits str of NONE => NONE | SOME(yy0, str1) => case parse2Digits str1 of NONE => NONE | SOME(yy1, str2) => SOME(yy0*100+yy1, str2) fun parseDate str = case parseDayOfWeek str of NONE => NONE | SOME(_, str1) => case getc str1 of (* Get exactly one space. *) NONE => NONE | SOME(ch, str2) => if ch <> #" " then NONE else case parseMonth str2 of (* Name of month. *) NONE => NONE | SOME(mth, str3) => case getc str3 of (* Get exactly one space. *) NONE => NONE | SOME(ch, str4) => if ch <> #" " then NONE else case parseDayOfMonth str4 of NONE => NONE | SOME(day, str5) => case getc str5 of (* Get exactly one space. *) NONE => NONE | SOME(ch, str6) => if ch <> #" " then NONE else case parseTime str6 of NONE => NONE | SOME((hr,min,sec), str7) => case getc str7 of (* Get exactly one space. *) NONE => NONE | SOME(ch, str8) => if ch <> #" " then NONE else case parseYear str8 of NONE => NONE | SOME(year, str9) => SOME(date{year=year, month=mth, day=day, hour=hr, minute=min, second=sec, offset=NONE}, str9) in case getc str of NONE => NONE | SOME (ch, str') => (* Remove initial white space. *) if Char.isSpace ch then scan getc str' else parseDate str end val fromString = StringCvt.scanString scan (* toString generates an English language, American style date. *) fun toString (date as {year, month, day, hour, minute, second, ...}: date) = let (* Pad a number with zeros up to the required width. Doesn't work for negatives which ought to be padded after the minus sign, but that's only a problem for years. *) fun int2str n i = let val str = Int.toString i fun padZeros n = if n <= 0 then "" else "0" ^ padZeros (n-1) in padZeros (n-String.size str) ^ str end in String.concat[ Vector.sub(dayNames, dayOfWeek date), " ", Vector.sub(monthNames, month), " ", int2str 2 day, " ", int2str 2 hour, ":", int2str 2 minute, ":", int2str 2 second, " ", int2str 4 year] end fun fmt s (date as {year, month, day, hour, minute, second, offset}) = let (* Edit the string to remove any undefined escape combinations. They shouldn't normally occur. *) fun editString s i l = if i = l then s (* Done *) else if String.sub(s, i) <> #"%" then editString s (i+1) l else (* Found a % sign. *) if i = l-1 then (* This was the last character. QUESTION: This isn't defined assume we should remove it. *) String.substring(s, 0, i) else let val c = String.sub(s, i+1) in if Char.contains "aAbBcdHIjmMpSUwWxXyYZ%" c then (* OK *) editString s (i+2) l else (* Replace %c by c, i.e. remove the %. *) editString (String.substring(s, 0, i) ^ String.substring(s, i+1, l-i-1)) i (l-1) end val newFormat = editString s 0 (String.size s) val summer = case offset of SOME _ => ~1 | NONE => callTiming 5 (Time.toSeconds(toTime date)) handle Size => ~1 in callTiming 6 (newFormat, year, month, day, hour, minute, second, dayOfWeek date, yearDay date, summer) handle RunCall.Size => raise Date end end; local (* Install the pretty printer for Date.date. This has to be done outside the structure because of the opaque matching. *) fun pretty _ _ x = PolyML.PrettyString(Date.toString x) in val () = PolyML.addPrettyPrinter pretty end polyml-5.6/basis/ExnPrinter.sml000066400000000000000000000124701265146633400166320ustar00rootroot00000000000000(* Title: Install a pretty printer for the exn type Author: David Matthews Copyright David Matthews 2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local open PolyML open RunCall (* Print exception packet. Run-time system exceptions have to be processed specially because the IDs don't have printer functions. *) fun exnPrint depth _ exn = let val (exnId, exnName, exnArg, _) = unsafeCast exn (* This parenthesis code is used in various places and probably should be centralised. *) fun parenthesise(s as PrettyBlock(_, _, _, [ _ ])) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("(")::_ ))) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("{")::_ ))) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("[")::_ ))) = s | parenthesise(s as PrettyBlock _) = PrettyBlock(3, true, [], [ PrettyString "(", s, PrettyString ")" ]) | parenthesise s = s (* String or Break *) fun nullaryException s = PrettyString s and parameterException(s, param) = PrettyBlock(1, false, [], [ PrettyString s, PrettyBreak(1, 1), parenthesise param ]) (* Use prettyRepresentation because this correctly quotes the string. *) fun stringException(s, arg: string) = parameterException(s, PolyML.prettyRepresentation(arg, depth-1)) in if run_call1 RuntimeCalls.POLY_SYS_is_short exnId then case exn of Conversion s => stringException(exnName, s) | Fail s => stringException(exnName, s) | Foreign s => stringException(exnName, s) | Thread s => stringException(exnName, s) | XWindows s => stringException(exnName, s) | OS.SysErr param => parameterException("SysErr", if depth <= 1 then PrettyString "..." else PolyML.prettyRepresentation(param, depth-1)) | _ => (* Anything else is nullary. *) nullaryException exnName else ( (* Exceptions generated within ML contain a printer function. *) case !exnId of NONE => nullaryException exnName | SOME printFn => parameterException(exnName, printFn(exnArg, depth-1)) ) end in val () = addPrettyPrinter exnPrint end; (* Print a ref. Because refs can form circular structures we include a check for a loop here. *) local open PolyML (* If we have an expression as the argument we parenthesise it unless it is a simple string, a tuple, a record or a list. *) fun parenthesise(s as PrettyBlock(_, _, _, [ _ ])) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("(")::_ ))) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("{")::_ ))) = s | parenthesise(s as PrettyBlock(_, _, _, (PrettyString("[")::_ ))) = s | parenthesise(s as PrettyBlock _) = PrettyBlock(3, true, [], [ PrettyString "(", s, PrettyString ")" ]) | parenthesise s = s (* String or Break *) val printLimit: word ref list Universal.tag = Universal.tag() fun print_ref depth doArg (r as ref x) = if depth <= 0 then PrettyString "..." else let (* We keep a list in thread-local storage of refs we're currently printing. This is thread-local to avoid interference between different threads. *) val currentRefs = case Thread.Thread.getLocal printLimit of NONE => [] | SOME limit => limit val thisRef: word ref = RunCall.unsafeCast r in if List.exists(fn x => x = thisRef) currentRefs then PrettyString "..." (* We've already seen this ref. *) else ( (* Add this to the list. *) Thread.Thread.setLocal (printLimit, thisRef :: currentRefs); (* Print it and reset the list*) (PrettyBlock(3, false, [], [ PrettyString "ref", PrettyBreak(1, 0), parenthesise(doArg(x, depth-1)) ])) before (Thread.Thread.setLocal (printLimit, currentRefs)) ) handle exn => ( (* Reset the list if there's been an exception. *) Thread.Thread.setLocal (printLimit, currentRefs); raise exn ) end in val () = addPrettyPrinter print_ref end; polyml-5.6/basis/FinalPolyML.552.sml000066400000000000000000002426301265146633400171770ustar00rootroot00000000000000(* Title: Nearly final version of the PolyML structure Author: David Matthews Copyright David Matthews 2008-9, 2014 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Based on: Title: Poly Make Program. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This is the version of the PolyML structure that can be compiled after we have the rest of the basis library. In particular it binds in TextIO.stdIn and TextIO.stdOut. This contains the top-level read-eval-print loop as well as "use" and Poly/ML's "make". The rootFunction has now been pulled out into a separate file and is added on after this. *) local (* A hash table with a mutex that protects against multiple threads rehashing the table by entering values at the same time. *) structure ProtectedTable :> sig type 'a ptable val create: unit -> 'a ptable val lookup: 'a ptable -> string -> 'a option val enter: 'a ptable -> string * 'a -> unit val all: 'a ptable -> unit -> (string * 'a) list val delete: 'a ptable -> string -> unit end = struct open HashArray Thread.Mutex LibraryIOSupport type 'a ptable = 'a hash * mutex fun create () = (hash 10, mutex()) and lookup(tab, mutx) = protect mutx (fn s => sub(tab, s)) and enter(tab, mutx) = protect mutx (fn (s, v) => update(tab, s, v)) and all(tab, mutx) = protect mutx (fn () => fold (fn (s, v, l) => ((s, v) :: l)) [] tab) and delete(tab, mutx) = protect mutx (fn s => HashArray.delete (tab, s)) end open PolyML.NameSpace local open ProtectedTable val fixTable = create() and sigTable = create() and valTable = create() and typTable = create() and fncTable = create() and strTable = create() in val globalNameSpace: PolyML.NameSpace.nameSpace = { lookupFix = lookup fixTable, lookupSig = lookup sigTable, lookupVal = lookup valTable, lookupType = lookup typTable, lookupFunct = lookup fncTable, lookupStruct = lookup strTable, enterFix = enter fixTable, enterSig = enter sigTable, enterVal = enter valTable, enterType = enter typTable, enterFunct = enter fncTable, enterStruct = enter strTable, allFix = all fixTable, allSig = all sigTable, allVal = all valTable, allType = all typTable, allFunct = all fncTable, allStruct = all strTable } val forgetFix = delete fixTable and forgetSig = delete sigTable and forgetVal = delete valTable and forgetType = delete typTable and forgetFunct = delete fncTable and forgetStruct = delete strTable end (* PolyML.compiler takes a list of these parameter values. They all default so it's possible to pass only those that are actually needed. *) datatype compilerParameters = CPOutStream of string->unit (* Output stream for debugging and other output from the compiler. Provides a default stream for other output. Default: TextIO.print *) | CPNameSpace of PolyML.NameSpace.nameSpace (* Name space to look up and enter results. Default: globalNameSpace *) | CPErrorMessageProc of { message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } -> unit (* Called by the compiler to generate error messages. Arguments (message, isHard, lineNo, context). message is the message. isHard is true if this is an error, false if a warning. location is the file-name, line number and position. context is an optional extra piece of information showing the part of the parse tree where the error was detected. Default: print this to CPOutStream value using CPLineNo and CPFileName. *) | CPLineNo of unit -> int (* Called by the compiler to get the current "line number". This is passed to CPErrorMessageProc and the debugger. It may actually be a more general location than a source line. Default: fn () => 0 i.e. no line numbering. *) | CPLineOffset of unit -> int (* Called by the compiler to get the current "offset". This is passed to CPErrorMessageProc and the debugger. This may either be an offset on the current file, a byte offset or simply zero. Default: fn () => 0 i.e. no line offset. *) | CPFileName of string (* The current file being compiled. This is used by the default CPErrorMessageProc and the debugger. Default: "" i.e. interactive stream. *) | CPPrintInAlphabeticalOrder of bool (* Whether to sort the results by alphabetical order before printing them. Applies only to the default CPResultFun. Default value of printInAlphabeticalOrder. *) | CPResultFun of { fixes: (string * fixityVal) list, values: (string * valueVal) list, structures: (string * structureVal) list, signatures: (string * signatureVal) list, functors: (string * functorVal) list, types: (string * typeVal) list} -> unit (* Function to apply to the result of compiling and running the code. Default: print and enter the values into CPNameSpace. *) | CPCompilerResultFun of PolyML.parseTree option * ( unit -> { fixes: (string * fixityVal) list, values: (string * valueVal) list, structures: (string * structureVal) list, signatures: (string * signatureVal) list, functors: (string * functorVal) list, types: (string * typeVal) list}) option -> unit -> unit (* Function to process the result of compilation. This can be used to capture the parse tree even if type-checking fails. Default: Execute the code and call the result function if the compilation succeeds. Raise an exception if the compilation failed. *) | CPProfiling of int (* Control profiling. 0 is no profiling, 1 is time etc. Default is value of PolyML.profiling. *) | CPTiming of bool (* Control whether the compiler should time various phases of the compilation and also the run time. Default: value of PolyML.timing. *) | CPDebug of bool (* Control whether calls to the debugger should be inserted into the compiled code. This allows breakpoints to be set, values to be examined and printed and functions to be traced at the cost of a very large run-time overhead. Default: value of PolyML.Compiler.debug *) | CPPrintDepth of unit->int (* This controls the depth of printing if the default CPResultFun is used. It is also bound into any use of PolyML.print in the compiled code and will be called to get the print depth whenever that code is executed. Default: Get the current value of PolyML.print_depth. *) | CPPrintStream of string->unit (* This is bound into any occurrence of PolyML.print and is used to produce the outut. Default: CPOutStream. *) | CPErrorDepth of int (* Controls the depth of context to produce in error messages. Default : value of PolyML.error_depth. *) | CPLineLength of int (* Bound into any occurrences of PolyML.print. This is the length of a line used in the pretty printer. Default: value of PolyML.line_length. *) | CPRootTree of { parent: (unit -> PolyML.parseTree) option, next: (unit -> PolyML.parseTree) option, previous: (unit -> PolyML.parseTree) option } (* This can be used to provide a parent for parse trees created by the compiler. This appears as a PTparent property in the tree. The default is NONE which does not to provide a parent. *) | CPAllocationProfiling of int (* Controls whether to add profiling information to each allocation. Currently zero means no profiling and one means add the allocating function. *) | CPDebuggerFunction of int * valueVal * int * string * string * nameSpace -> unit (* The debugger function inserted at the start and end of *) (* References for control and debugging. *) val profiling = ref 0 and timing = ref false and printDepth = ref 0 and errorDepth = ref 6 and lineLength = ref 77 and allocationProfiling = ref 0 val assemblyCode = ref false and codetree = ref false and codetreeAfterOpt = ref false and pstackTrace = ref false and parsetree = ref false and reportUnreferencedIds = ref false and reportExhaustiveHandlers = ref false and narrowOverloadFlexRecord = ref false val lowlevelOptimise = ref true val debug = ref false val inlineFunctors = ref true val maxInlineSize = ref 80 val printInAlphabeticalOrder = ref true val traceCompiler = ref false fun prettyPrintWithIDEMarkup(stream : string -> unit, lineWidth : int): PolyML.pretty -> unit = let open PolyML val openDeclaration = "\u001bD" val closeDeclaration = "\u001bd" val separator = "\u001b," val finalSeparator = "\u001b;" fun beginMarkup context = case List.find (fn ContextLocation _ => true | _ => false) context of SOME (ContextLocation{file,startLine,startPosition,endPosition, ...}) => let (* In the unlikely event there's an escape character in the file name convert it to ESC-ESC. *) fun escapeEscapes #"\u001b" = "\u001b\u001b" | escapeEscapes c = str c in stream openDeclaration; stream(String.translate escapeEscapes file); stream separator; stream(Int.toString startLine); stream separator; stream(Int.toString startPosition); stream separator; stream(Int.toString endPosition); stream finalSeparator end | _ => () fun endMarkup context = List.app (fn ContextLocation _ => stream closeDeclaration | _ => ()) context in prettyMarkup (beginMarkup, endMarkup) (stream, lineWidth) end; (* useMarkupInOutput is set according to the setting of *) val useMarkupInOutput = ref false fun prettyPrintWithOptionalMarkup(stream, lineWidth) = if ! useMarkupInOutput then prettyPrintWithIDEMarkup(stream, lineWidth) else PolyML.prettyPrint(stream, lineWidth) (* Top-level prompts. *) val prompt1 = ref "> " and prompt2 = ref "# "; (* Debugger control. *) (* Whenever we enter a function we push information onto this stack. *) type debugStackEntry = { lineNo: int, funName: string, fileName: string, space: PolyML.NameSpace.nameSpace, arguments: PolyML.NameSpace.valueVal } (* With the exception of the stack, which is thread-specific, all these are global variables and apply to any thread. Perhaps they should be thread-specific in which case the debugger will only be entered if the thread that set a breakpoint encounters it. *) local val stackTag: debugStackEntry list ref Universal.tag = Universal.tag() in (* Get the stack of previous calls. Create a new one if necessary.*) fun getStack(): debugStackEntry list ref = case Thread.Thread.getLocal stackTag of NONE => let val stack = ref [] in Thread.Thread.setLocal(stackTag, stack); stack end | SOME stack => stack end val debugLevel = ref 0 (* Set to true to exit the debug loop. Set by commands such as "continue". *) val exitLoop = ref false; (* Exception packet sent if this was continueWithEx. *) val debugExPacket: exn option ref = ref NONE (* Call tracing. *) val tracing = ref false; val breakNext = ref false; (* Single stepping. *) val stepDebug = ref false; val stepDepth = ref ~1; (* Only break at a stack size less than this. *) val alreadyInDebug = ref false (* If true we are already at a breakpoint. *) (* Break points. We have three breakpoint lists: a list of file-line pairs, a list of function names and a list of exceptions. *) val lineBreakPoints = ref [] and fnBreakPoints = ref [] and exBreakPoints = ref [] fun checkLineBreak (file, line) = let fun findBreak [] = false | findBreak ((f, l) :: rest) = (l = line andalso f = file) orelse findBreak rest in findBreak (! lineBreakPoints) end fun checkFnBreak exact name = let (* When matching a function name we allow match if the name we're looking for matches the last component of the name we have. e.g. if we set a break for "f" we match F().S.f . *) fun matchName n = if name = n then true else if exact then false else let val nameLen = size name and nLen = size n fun isSeparator #"-" = true | isSeparator #")" = true | isSeparator #"." = true | isSeparator _ = false in nameLen > nLen andalso String.substring(name, nameLen - nLen, nLen) = n andalso isSeparator(String.sub(name, nameLen - nLen - 1)) end in List.exists matchName (! fnBreakPoints) end (* Get the exception id from an exception packet. The id is the first word in the packet. It's a mutable so treat it as an int ref here. *) fun getExnId(ex: exn): int ref = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word (ex, 0) fun checkExnBreak(ex: exn) = let val exnId = getExnId ex in List.exists (fn n => n = exnId) (! exBreakPoints) end fun printOut s = TextIO.print s (* If we get an exception while writing to stdOut we've got a big problem and can't continue. It could happen if we have closed stdOut. Try reporting the error through stdErr and exit. *) handle Thread.Thread.Interrupt => raise Thread.Thread.Interrupt | exn => ( ( TextIO.output(TextIO.stdErr, concat["Exception ", exnName exn, " raised while writing to stdOut.\n"]); TextIO.flushOut TextIO.stdErr (* probably unnecessary. *) ) handle _ => (); (* Get out without trying to do anything else. *) OS.Process.terminate OS.Process.failure ) (* Try to print the appropriate line from the file. Used in the debugger and debug functions. *) fun printSourceLine(fileName: string, line: int, funName: string, justLocation) = let open TextIO open PolyML (* Use the pretty printer here because that allows us to provide a link to the function in the markup so the IDE can go straight to it. *) val prettyOut = prettyPrintWithOptionalMarkup (printOut, !lineLength) val lineInfo = concat( (if fileName = "" then [] else [fileName, " "]) @ (if line = 0 then [] else [" line:", Int.toString line, " "]) @ ["function:", funName]) in (* First just print where we are. *) prettyOut( PrettyBlock(0, true, [ContextLocation{file=fileName,startLine=line, endLine=line,startPosition=0,endPosition=0}], [PrettyString lineInfo])); (* Try to print it. This may fail if the file name was not a full path name and we're not in the correct directory. *) if justLocation orelse fileName = "" then () else let val fd = openIn fileName fun pLine n = case inputLine fd of NONE => () | SOME s => if n = 1 then printOut s else pLine(n-1) in pLine line; closeIn fd end handle IO.Io _ => () (* If it failed simply ignore the error. *) end local open Bootstrap Bootstrap.Universal (* To allow for the possibility of changing the representation we don't make Universal be the same as Bootstrap.Universal. *) (* Default error message function. *) fun defaultErrorProc printString {message: PolyML.pretty, hard: bool, location={startLine, startPosition, endPosition, file, ...}: PolyML.location, context: PolyML.pretty option} = let open PolyML val fullMessage = case context of NONE => message | SOME ctxt => PrettyBlock(0, true, [], [ message, PrettyBreak(1, 0), PrettyBlock(2, false, [], [PrettyString "Found near", PrettyBreak(1, 0), ctxt]) ]) in if ! useMarkupInOutput then (* IDE mark-up of error messages. This is actually the same as within the IDE. *) let val openError = "\u001bE" val closeError = "\u001be" val separator = "\u001b," val finalSeparator = "\u001b;" in printString( concat [ openError, if hard then "E" else "W", separator, file, (* TODO double any escapes. *) separator, Int.toString startLine, separator, Int.toString startPosition, separator, Int.toString endPosition, finalSeparator ] ); prettyPrintWithIDEMarkup(printString, !lineLength) fullMessage; printString closeError end else (* Plain text form. *) ( printString(concat ( (if file = "" then ["poly: "] else [file, ":"]) @ (if startLine = 0 then [] else [Int.toString startLine]) @ (if startPosition = 0 then [": "] else [".", Int.toString startPosition, "-", Int.toString endPosition, ": "]) @ (if hard then ["error: "] else ["warning: "]) )); (* ( (if hard then ["Error-"] else ["Warning-"]) @ (if file = "" then [] else [" in '", file, "',"]) @ (if startLine = 0 then [] else [" line ", Int.toString startLine]) @ (if startLine = 0 andalso file = "" then [] else [".\n"]))); *) PolyML.prettyPrint(printString, !lineLength) fullMessage ) end (* Default function to print and enter a value. *) fun printAndEnter (inOrder: bool, space: PolyML.NameSpace.nameSpace, stream: string->unit, depth: int) { fixes: (string * fixityVal) list, values: (string * valueVal) list, structures: (string * structureVal) list, signatures: (string * signatureVal) list, functors: (string * functorVal) list, types: (string * typeVal) list}: unit = let (* We need to merge the lists to sort them alphabetically. *) datatype decKind = FixStatusKind of fixityVal | TypeConstrKind of typeVal | SignatureKind of signatureVal | StructureKind of structureVal | FunctorKind of functorVal | ValueKind of valueVal val decList = map (fn (s, f) => (s, FixStatusKind f)) fixes @ map (fn (s, f) => (s, TypeConstrKind f)) types @ map (fn (s, f) => (s, SignatureKind f)) signatures @ map (fn (s, f) => (s, StructureKind f)) structures @ map (fn (s, f) => (s, FunctorKind f)) functors @ map (fn (s, f) => (s, ValueKind f)) values fun kindToInt(FixStatusKind _) = 0 | kindToInt(TypeConstrKind _) = 1 | kindToInt(SignatureKind _) = 2 | kindToInt(StructureKind _) = 3 | kindToInt(FunctorKind _) = 4 | kindToInt(ValueKind _) = 5 fun order (s1: string, k1) (s2, k2) = if s1 = s2 then kindToInt k1 <= kindToInt k2 else s1 <= s2 fun quickSort _ ([]:'a list) = [] | quickSort _ ([h]:'a list) = [h] | quickSort (leq:'a -> 'a -> bool) ((h::t) :'a list) = let val (after, befor) = List.partition (leq h) t in quickSort leq befor @ (h :: quickSort leq after) end; (* Don't sort the declarations if we want them in declaration order. *) val sortedDecs = if inOrder then quickSort order decList else decList fun enterDec(n, FixStatusKind f) = #enterFix space (n,f) | enterDec(n, TypeConstrKind t) = #enterType space (n,t) | enterDec(n, SignatureKind s) = #enterSig space (n,s) | enterDec(n, StructureKind s) = #enterStruct space (n,s) | enterDec(n, FunctorKind f) = #enterFunct space (n,f) | enterDec(n, ValueKind v) = #enterVal space (n,v) fun printDec(n, FixStatusKind f) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displayFix(n,f)) | printDec(_, TypeConstrKind t) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displayType(t, depth, space)) | printDec(_, SignatureKind s) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displaySig(s, depth, space)) | printDec(_, StructureKind s) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displayStruct(s, depth, space)) | printDec(_, FunctorKind f) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displayFunct(f, depth, space)) | printDec(_, ValueKind v) = prettyPrintWithOptionalMarkup (stream, !lineLength) (displayVal(v, depth, space)) in (* First add the declarations to the name space and then print them. Doing it this way improves the printing of types since these require look-ups in the name space. For instance the constructors of a datatype from an opened structure should not include the structure name but that will only work once the datatype itself is in the global name-space. *) List.app enterDec sortedDecs; if depth > 0 then List.app printDec sortedDecs else () end in fun polyCompiler (getChar: unit->char option, parameters: compilerParameters list) = let (* Find the first item that matches or return the default. *) fun find _ def [] = def | find f def (hd::tl) = case f hd of SOME s => s | NONE => find f def tl val outstream = find (fn CPOutStream s => SOME s | _ => NONE) TextIO.print parameters val nameSpace = find (fn CPNameSpace n => SOME n | _ => NONE) globalNameSpace parameters val lineNo = find (fn CPLineNo l => SOME l | _ => NONE) (fn () => 0) parameters val lineOffset = find (fn CPLineOffset l => SOME l | _ => NONE) (fn () => 0) parameters val fileName = find (fn CPFileName s => SOME s | _ => NONE) "" parameters val printInOrder = find (fn CPPrintInAlphabeticalOrder t => SOME t | _ => NONE) (! printInAlphabeticalOrder) parameters val profiling = find (fn CPProfiling i => SOME i | _ => NONE) (!profiling) parameters val timing = find (fn CPTiming b => SOME b | _ => NONE) (!timing) parameters val printDepth = find (fn CPPrintDepth f => SOME f | _ => NONE) (fn () => !printDepth) parameters val resultFun = find (fn CPResultFun f => SOME f | _ => NONE) (printAndEnter(printInOrder, nameSpace, outstream, printDepth())) parameters val printString = find (fn CPPrintStream s => SOME s | _ => NONE) outstream parameters val errorProc = find (fn CPErrorMessageProc f => SOME f | _ => NONE) (defaultErrorProc printString) parameters val debugging = find (fn CPDebug t => SOME t | _ => NONE) (! debug) parameters val allocProfiling = find(fn CPAllocationProfiling l => SOME l | _ => NONE) (!allocationProfiling) parameters local (* Default is to filter the parse tree argument. *) fun defaultCompilerResultFun (_, NONE) = raise Fail "Static Errors" | defaultCompilerResultFun (_, SOME code) = fn () => resultFun(code()) in val compilerResultFun = find (fn CPCompilerResultFun f => SOME f | _ => NONE) defaultCompilerResultFun parameters end (* TODO: Make this available as a parameter. *) val prettyOut = prettyPrintWithOptionalMarkup(printString, !lineLength) val compilerOut = prettyPrintWithOptionalMarkup(outstream, !lineLength) (* Parent tree defaults to empty. *) val parentTree = find (fn CPRootTree f => SOME f | _ => NONE) { parent = NONE, next = NONE, previous = NONE } parameters val debuggerFunction = find (fn CPDebuggerFunction f => SOME f | _ => NONE) debugFunction parameters (* Pass all the settings. Some of these aren't included in the parameters datatype (yet?). *) val treeAndCode = PolyML.compiler(nameSpace, getChar, [ tagInject errorMessageProcTag errorProc, tagInject compilerOutputTag compilerOut, tagInject lineNumberTag lineNo, tagInject offsetTag lineOffset, tagInject fileNameTag fileName, tagInject inlineFunctorsTag (! inlineFunctors), tagInject maxInlineSizeTag (! maxInlineSize), tagInject parsetreeTag (! parsetree), tagInject codetreeTag (! codetree), tagInject pstackTraceTag (! pstackTrace), tagInject lowlevelOptimiseTag (! lowlevelOptimise), tagInject assemblyCodeTag (! assemblyCode), tagInject codetreeAfterOptTag (! codetreeAfterOpt), tagInject timingTag timing, tagInject profilingTag profiling, tagInject profileAllocationTag allocProfiling, tagInject errorDepthTag (! errorDepth), tagInject printDepthFunTag printDepth, tagInject lineLengthTag (! lineLength), tagInject traceCompilerTag (! traceCompiler), tagInject debugTag debugging, tagInject debuggerTag debuggerFunction, tagInject printOutputTag prettyOut, tagInject rootTreeTag parentTree, tagInject reportUnreferencedIdsTag (! reportUnreferencedIds), tagInject reportExhaustiveHandlersTag (! reportExhaustiveHandlers), tagInject narrowOverloadFlexRecordTag (! narrowOverloadFlexRecord) ]) in compilerResultFun treeAndCode end (* Top-level read-eval-print loop. This is the normal top-level loop but is also used for the debugger so has to be mutually recursively defined with it. *) and topLevel {isDebug, nameSpace, exitLoop, exitOnError, isInteractive } = let (* This is used as the main read-eval-print loop. It is also invoked by running code that has been compiled with the debug option on when it stops at a breakpoint. In that case debugEnv contains an environment formed from the local variables. This is placed in front of the normal top-level environment. *) (* Don't use the end_of_stream because it may have been set by typing EOT to the command we were running. *) val endOfFile = ref false; val realDataRead = ref false; val lastWasEol = ref true; (* Each character typed is fed into the compiler but leading blank lines result in the prompt remaining as firstPrompt until significant characters are typed. *) fun readin () : char option = let val () = if isInteractive andalso !lastWasEol (* Start of line *) then if !realDataRead then printOut (if isDebug then "debug " ^ !prompt2 else !prompt2) else printOut (if isDebug then "debug " ^ !prompt1 else !prompt1) else (); in case TextIO.input1 TextIO.stdIn of NONE => (endOfFile := true; NONE) | SOME #"\n" => ( lastWasEol := true; SOME #"\n" ) | SOME ch => ( lastWasEol := false; if ch <> #" " then realDataRead := true else (); SOME ch ) end; (* readin *) (* Remove all buffered but unread input. *) fun flushInput () = case TextIO.canInput(TextIO.stdIn, 1) of SOME 1 => (TextIO.inputN(TextIO.stdIn, 1); flushInput()) | _ => (* No input waiting or we're at EOF. *) () fun readEvalPrint () : unit = let (* If we have executed a deeply recursive function the stack will have extended to be very large. It's better to reduce the stack if we can. This is RISKY. Each function checks on entry that the stack has sufficient space for everything it will allocate and assumes the stack will not shrink. It's unlikely that any of the functions here will have asked for very much but as a precaution we allow for an extra 8k words. *) fun shrink_stack (newsize : int) : unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_shrink_stack newsize val () = if isDebug then () else shrink_stack 8000; in realDataRead := false; (* Compile and then run the code. *) let val code = polyCompiler(readin, [CPNameSpace nameSpace, CPOutStream printOut]) handle Fail s => ( printOut(s ^ "\n"); flushInput(); lastWasEol := true; raise Fail s ) in code () (* Report exceptions in running code. *) handle exn => let open PolyML PolyML.Exception val exLoc = case exceptionLocation exn of NONE => [] | SOME loc => [ContextLocation loc] in prettyPrintWithOptionalMarkup(TextIO.print, ! lineLength) (PrettyBlock(0, false, [], [ PrettyBlock(0, false, exLoc, [PrettyString "Exception-"]), PrettyBreak(1, 3), prettyRepresentation(exn, ! printDepth), PrettyBreak(1, 3), PrettyString "raised" ])); PolyML.Exception.reraise exn end end end; (* readEvalPrint *) fun handledLoop () : unit = ( (* Process a single top-level command. *) readEvalPrint() handle _ => if exitOnError then OS.Process.exit OS.Process.failure else (); (* Exit if we've seen end-of-file or we're in the debugger and we've run "continue". *) if !endOfFile orelse exitLoop() then () else handledLoop () ) in handledLoop () end (* Debug function. Calls to this function are inserted in the compiled code if the code is compiled with debugging on. *) and debugFunction(code, value, line, file, name, debugEnv) = if ! alreadyInDebug then () (* If we're executing code at the debug prompt we don't want to break or change the stack. *) else let val stack: debugStackEntry list ref = getStack() fun printVal v = prettyPrintWithOptionalMarkup(TextIO.print, 77) (Bootstrap.printValue(v, !printDepth, globalNameSpace)) fun enterDebugger ()= let (* Remove any type-ahead. *) fun flushInput () = case TextIO.canInput(TextIO.stdIn, 1) of SOME 1 => (TextIO.inputN(TextIO.stdIn, 1); flushInput()) | _ => () val () = flushInput () val () = exitLoop := false; val () = debugLevel := 0; val () = breakNext := false; val () = alreadyInDebug := true val () = case !stack of {fileName, funName, ...} :: _ => printSourceLine(fileName, line, funName, false) | [] => () (* Shouldn't happen. *) val compositeNameSpace = (* Compose any debugEnv with the global environment. Create a new temporary environment to contain any bindings made within the shell. They are discarded when we continue from the break-point. Previously, bindings were made in the global environment but that is problematic. It is possible to capture local types in the bindings which could actually be different at the next breakpoint. *) let val fixTab = ProtectedTable.create() and sigTab = ProtectedTable.create() and valTab = ProtectedTable.create() and typTab = ProtectedTable.create() and fncTab = ProtectedTable.create() and strTab = ProtectedTable.create() (* The debugging environment depends on the currently selected stack frame. *) fun debugEnv() = #space (List.nth(!stack, !debugLevel)) fun dolookup f t s = case ProtectedTable.lookup t s of NONE => (case f (debugEnv()) s of NONE => f globalNameSpace s | v => v) | v => v fun getAll f t () = ProtectedTable.all t () @ f (debugEnv()) () @ f globalNameSpace () in { lookupFix = dolookup #lookupFix fixTab, lookupSig = dolookup #lookupSig sigTab, lookupVal = dolookup #lookupVal valTab, lookupType = dolookup #lookupType typTab, lookupFunct = dolookup #lookupFunct fncTab, lookupStruct = dolookup #lookupStruct strTab, enterFix = ProtectedTable.enter fixTab, enterSig = ProtectedTable.enter sigTab, enterVal = ProtectedTable.enter valTab, enterType = ProtectedTable.enter typTab, enterFunct = ProtectedTable.enter fncTab, enterStruct = ProtectedTable.enter strTab, allFix = getAll #allFix fixTab, allSig = getAll #allSig sigTab, allVal = getAll #allVal valTab, allType = getAll #allType typTab, allFunct = getAll #allFunct fncTab, allStruct = getAll #allStruct strTab } end in topLevel { isDebug = true, nameSpace = compositeNameSpace, exitLoop = fn _ => ! exitLoop, exitOnError = false, isInteractive = true } handle exn => (alreadyInDebug := false; PolyML.Exception.reraise exn); alreadyInDebug := false; (* If this was continueWithEx raise the exception. *) case ! debugExPacket of NONE => () | SOME exn => (debugExPacket := NONE; raise exn) end fun printSpaces () = let fun printSp 0 = () | printSp n = (print " "; printSp (n-1)) val depth = List.length(! stack) in if depth > 50 then printSp 50 else if depth = 0 then () else printSp (depth-1) end in case code of 1 => (* Entry to function *) let (* Push this onto the stack. *) val newStackEntry: debugStackEntry = { lineNo = line, funName = name, fileName = file, space = debugEnv, arguments = value} in stack := newStackEntry :: !stack; if ! tracing then (printSpaces(); print name; print " "; printVal value; print "\n") else (); (* We don't actually break here because at this stage we don't have any variables declared. *) if checkLineBreak (name, line) orelse checkFnBreak false name then breakNext := true else () end | 2 => (* Return from function. *) let val (args, stackTail) = case !stack of [] => (value, []) (* Use the passed in value for the arg. *) | {arguments, ...} ::tl => (arguments, tl) in if ! tracing then (printSpaces(); print name; print " "; printVal args; print " = "; printVal value; print "\n") else (); (* Pop the stack. *) stack := stackTail end | 3 => (* Function raised an exception. *) let val (args, _) = case !stack of [] => (value, []) (* Use the passed in value for the arg. *) | {arguments, ...} ::tl => (arguments, tl) in if ! tracing then (printSpaces(); print name; print " "; printVal args; print " raised "; printVal value; print "\n") else (); if checkExnBreak(Bootstrap.getValue value) then enterDebugger () else (); (* Pop the stack. *) stack := (case !stack of [] => [] | _::tl => tl) end | 4 => (* Change of line within a function *) let val (args, stackTail) = (* If this is top-level code the stack may be empty. *) case !stack of [] => (value, []) (* Use the passed in value for the arg. *) | {arguments, ...} ::tl => (arguments, tl); (* Update the entry but include the original arguments. *) val newStackEntry: debugStackEntry = { lineNo = line, funName = name, fileName = file, space = debugEnv, arguments = args} in (* Update the stack. If this is top-level code the stack may be empty. *) stack := newStackEntry :: stackTail; (* We need to enter the debugger if we are single stepping or we have a break at this line or we've just entered a function with a break point. *) if (!stepDebug andalso (!stepDepth < 0 orelse List.length(!stack) <= !stepDepth)) orelse checkLineBreak (name, line) orelse ! breakNext then enterDebugger () else () end | _ => () end (* Normal, non-debugging top-level loop. *) fun shell () = let val argList = CommandLine.arguments() fun switchOption option = List.exists(fn s => s = option) argList (* Generate mark-up in IDE code when printing if the option has been given on the command line. *) val () = useMarkupInOutput := switchOption "--with-markup" val exitOnError = switchOption"--error-exit" val interactive = switchOption "-i" orelse let open TextIO OS open StreamIO TextPrimIO IO val s = getInstream stdIn val (r, v) = getReader s val RD { ioDesc, ...} = r in setInstream(stdIn, mkInstream(r,v)); case ioDesc of SOME io => (kind io = Kind.tty handle SysErr _ => false) | _ => false end in topLevel { isDebug = false, nameSpace = globalNameSpace, exitLoop = fn _ => false, isInteractive = interactive, exitOnError = exitOnError } end end val suffixes = ref ["", ".ML", ".sml"]; (*****************************************************************************) (* "use": compile from a file. *) (*****************************************************************************) fun use (originalName: string): unit = let (* use "f" first tries to open "f" but if that fails it tries "f.ML", "f.sml" etc. *) (* We use the functional layer and a reference here rather than TextIO.input1 because that requires locking round every read to make it thread-safe. We know there's only one thread accessing the stream so we don't need it here. *) fun trySuffixes [] = (* Not found - attempt to open the original and pass back the exception. *) (TextIO.getInstream(TextIO.openIn originalName), originalName) | trySuffixes (s::l) = (TextIO.getInstream(TextIO.openIn (originalName ^ s)), originalName ^ s) handle IO.Io _ => trySuffixes l (* First in list is the name with no suffix. *) val (inStream, fileName) = trySuffixes("" :: ! suffixes) val stream = ref inStream val lineNo = ref 1; fun getChar () : char option = case TextIO.StreamIO.input1 (! stream) of NONE => NONE | SOME (eoln as #"\n", strm) => ( lineNo := !lineNo + 1; stream := strm; SOME eoln ) | SOME(c, strm) => (stream := strm; SOME c) in while not (TextIO.StreamIO.endOfStream(!stream)) do let val code = polyCompiler(getChar, [CPFileName fileName, CPLineNo(fn () => !lineNo)]) handle exn => ( TextIO.StreamIO.closeIn(!stream); PolyML.Exception.reraise exn ) in code() handle exn => ( (* Report exceptions in running code. *) TextIO.print ("Exception- " ^ exnMessage exn ^ " raised\n"); TextIO.StreamIO.closeIn (! stream); PolyML.Exception.reraise exn ) end; (* Normal termination: close the stream. *) TextIO.StreamIO.closeIn (! stream) end (* use *) local open Time in fun maxTime (x : time, y : time): time = if x < y then y else x end exception ObjNotFile; type 'a tag = 'a Universal.tag; fun splitFilename (name: string) : string * string = let val {dir, file } = OS.Path.splitDirFile name in (dir, file) end (* Make *) (* There are three possible states - The object may have been checked, it may be currently being compiled, or it may not have been processed yet. *) datatype compileState = NotProcessed | Searching | Checked; fun longName (directory, file) = OS.Path.joinDirFile{dir=directory, file = file} local fun fileReadable (fileTuple as (directory, object)) = (* Use OS.FileSys.isDir just to test if the file/directory exists. *) if (OS.FileSys.isDir (longName fileTuple); false) handle OS.SysErr _ => true then false else let (* Check that the object is present in the directory with the name given and not a case-insensitive version of it. This avoids problems with "make" attempting to recursively make Array etc because they contain signatures ARRAY. *) open OS.FileSys val d = openDir (if directory = "" then "." else directory) fun searchDir () = case readDir d of NONE => false | SOME f => f = object orelse searchDir () val present = searchDir() in closeDir d; present end fun findFileTuple _ [] = NONE | findFileTuple (directory, object) (suffix :: suffixes) = let val fileName = object ^ suffix val fileTuple = (directory, fileName) in if fileReadable fileTuple then SOME fileTuple else findFileTuple (directory, object) suffixes end in fun filePresent (directory : string, kind: string option, object : string) = let (* Construct suffixes with the architecture and version number in so we can compile architecture- and version-specific code. *) val archSuffix = "." ^ String.map Char.toLower (PolyML.architecture()) val versionSuffix = "." ^ Int.toString Bootstrap.compilerVersionNumber val extraSuffixes = case kind of NONE => [archSuffix, versionSuffix, ""] | SOME k => ["." ^ k ^ archSuffix, "." ^ k ^ versionSuffix, "." ^ k, archSuffix, versionSuffix, ""] val addedSuffixes = List.foldr(fn (i, l) => (List.map (fn s => s ^ i) extraSuffixes) @ l) [] (!suffixes) in (* For each of the suffixes in the list try it. *) findFileTuple (directory, object) addedSuffixes end end (* See if the corresponding file is there and if it is a directory. *) fun testForDirectory (name: string) : bool = OS.FileSys.isDir name handle OS.SysErr _ => false (* No such file. *) (* Time stamps. *) type timeStamp = Time.time; val firstTimeStamp : timeStamp = Time.zeroTime; (* Get the current time. *) val newTimeStamp : unit -> timeStamp = Time.now (* Get the date of a file. *) val fileTimeStamp : string -> timeStamp = OS.FileSys.modTime local open ProtectedTable (* Global tables to hold information about entities that have been made using "make". *) val timeStampTable: timeStamp ptable = create() and dependencyTable: string list ptable = create() in (* When was the entity last built? Returns zeroTime if it hasn't. *) fun lastMade (objectName : string) : timeStamp = getOpt(lookup timeStampTable objectName, firstTimeStamp) (* Get the dependencies as an option type. *) val getMakeDependencies = lookup dependencyTable (* Set the time stamp and dependencies. *) fun updateMakeData(objectName, times, depends) = ( enter timeStampTable (objectName, times); enter dependencyTable (objectName, depends) ) end (* Main make function *) fun make (targetName: string) : unit = let (* This serves two purposes. It provides a list of objects which have been re-made to prevent them being made more than once, and it also prevents circular dependencies from causing infinite loops (e.g. let x = f(x)) *) local open HashArray; val htab : compileState hash = hash 10; in fun lookupStatus (name: string) : compileState = getOpt(sub (htab, name), NotProcessed); fun setStatus (name: string, cs: compileState) : unit = update (htab, name, cs) end; (* Remove leading directory names to get the name of the object itself. e.g. "../compiler/parsetree/gencode" yields simply "gencode". *) val (dirName,objectName) = splitFilename targetName; (* Looks to see if the file is in the current directory. If it is and the file is newer than the corresponding object then it must be remade. If it is a directory then we attempt to remake the directory by compiling the "bind" file. This will only actually be executed if it involves some identifier which is newer than the result object. *) fun remakeObj (objName: string, kind: string option, findDirectory: string option -> string -> string) = let (* Find a directory that contains this object. An exception will be raised if it is not there. *) val directory = findDirectory kind objName val fullName = if directory = "" (* Work around for bug. *) then objName else OS.Path.joinDirFile{dir=directory, file=objName} val objIsDir = testForDirectory fullName val here = fullName (* Look to see if the file exists, possibly with an extension, and get the extended version. *) val fileTuple = let (* If the object is a directory the source is in the bind file. *) val (dir : string, file : string) = if objIsDir then (here,"ml_bind") else (directory, objName); in case filePresent (dir, kind, file) of SOME res' => res' | NONE => raise Fail ("No such file or directory ("^file^","^dir^")") end ; val fileName = longName fileTuple; val newFindDirectory : string option -> string -> string = if objIsDir then let (* Look in this directory then in the ones above. *) fun findDirectoryHere kind (name: string) : string = case filePresent (here, kind, name) of NONE => findDirectory kind name (* not in this directory *) | _ => here; in findDirectoryHere end else findDirectory (* Compiles a file. *) fun remakeCurrentObj () = let val () = print ("Making " ^ objName ^ "\n"); local (* Keep a list of the dependencies. *) val deps : bool HashArray.hash = HashArray.hash 10; fun addDep name = if getOpt(HashArray.sub (deps, name), true) then HashArray.update(deps, name, true) else (); (* Called by the compiler to look-up a global identifier. *) fun lookupMakeEnv (globalLook, kind: string option) (name: string) : 'a option = let (* Have we re-declared it ? *) val res = lookupStatus name; in case res of NotProcessed => ( (* Compile the dependency. *) remakeObj (name, kind, newFindDirectory); (* Add this to the dependencies. *) addDep name ) | Searching => (* In the process of making it *) print("Circular dependency: " ^ name ^ " depends on itself\n") | Checked => addDep name; (* Add this to the dependencies. *) (* There was previously a comment about returning NONE here if we had a problem remaking a dependency. *) globalLook name end (* lookupMakeEnv *) (* Enter the declared value in the table. Usually this will be the target we are making. Also set the state to "Checked". The state is set to checked when we finish making the object but setting it now suppresses messages about circular dependencies if we use the identifier within the file. *) fun enterMakeEnv (kind : string, enterGlobal) (name: string, v: 'a) : unit = ( (* Put in the value. *) enterGlobal (name, v); print ("Created " ^ kind ^ " " ^ name ^ "\n"); (* The name we're declaring may appear to be a dependency but isn't, so don't include it in the list. *) HashArray.update (deps, name, false); if name = objName then let (* Put in the dependencies i.e. those names set to true in the table. *) val depends = HashArray.fold (fn (s, v, l) => if v then s :: l else l) [] deps; (* Put in a time stamp for the new object. We need to make sure that it is no older than the newest object it depends on. In theory that should not be a problem but clocks on different machines can get out of step leading to objects made later having earlier time stamps. *) val newest = List.foldl (fn (s: string, t: timeStamp) => maxTime (lastMade s, t)) (fileTimeStamp fileName) depends; val timeStamp = maxTime(newest, newTimeStamp()); in setStatus (name, Checked); updateMakeData(name, timeStamp, depends) end else () ) (* enterMakeEnv *); in val makeEnv = { lookupFix = #lookupFix globalNameSpace, lookupVal = #lookupVal globalNameSpace, lookupType = #lookupType globalNameSpace, lookupSig = lookupMakeEnv (#lookupSig globalNameSpace, SOME "signature"), lookupStruct = lookupMakeEnv (#lookupStruct globalNameSpace, SOME "structure"), lookupFunct = lookupMakeEnv (#lookupFunct globalNameSpace, SOME "functor"), enterFix = #enterFix globalNameSpace, enterVal = #enterVal globalNameSpace, enterType = #enterType globalNameSpace, enterStruct = enterMakeEnv ("structure", #enterStruct globalNameSpace), enterSig = enterMakeEnv ("signature", #enterSig globalNameSpace), enterFunct = enterMakeEnv ("functor", #enterFunct globalNameSpace), allFix = #allFix globalNameSpace, allVal = #allVal globalNameSpace, allType = #allType globalNameSpace, allSig = #allSig globalNameSpace, allStruct = #allStruct globalNameSpace, allFunct = #allFunct globalNameSpace }; end; (* local for makeEnv *) val inputFile = OS.Path.joinDirFile{dir= #1 fileTuple, file= #2 fileTuple} val inStream = TextIO.openIn inputFile; val () = let (* scope of exception handler to close inStream *) val endOfStream = ref false; val lineNo = ref 1; fun getChar () : char option = case TextIO.input1 inStream of NONE => (endOfStream := true; NONE) (* End of file *) | eoln as SOME #"\n" => (lineNo := !lineNo + 1; eoln) | c => c in while not (!endOfStream) do let val code = polyCompiler(getChar, [CPNameSpace makeEnv, CPFileName fileName, CPLineNo(fn () => !lineNo)]) in code () handle exn as Fail _ => PolyML.Exception.reraise exn | exn => ( print ("Exception- " ^ exnMessage exn ^ " raised\n"); PolyML.Exception.reraise exn ) end end (* body of scope of inStream *) handle exn => (* close inStream if an error occurs *) ( TextIO.closeIn inStream; PolyML.Exception.reraise exn ) in (* remake normal termination *) TextIO.closeIn inStream end (* remakeCurrentObj *) in (* body of remakeObj *) setStatus (objName, Searching); (* If the file is newer than the object then we definitely must remake it. Otherwise we look at the dependency list and check those. If the result of that check is that one of the dependencies is newer than the object (probably because it has just been recompiled) we have to recompile the file. Compiling a file also checks the dependencies and recompiles them, generating a new dependency list. That is why we don't check the dependency list if the object is out of date with the file. Also if the file has been changed it may no longer depend on the things it used to depend on. *) let val objDate = lastMade objName fun maybeRemake (s:string) : unit = case lookupStatus s of NotProcessed => (* see if it's a file. *) (* Compile the dependency. *) remakeObj(s, kind, newFindDirectory) | Searching => (* In the process of making it *) print ("Circular dependency: " ^ s ^ " depends on itself\n") | Checked => () (* do nothing *) open Time (* Process each entry and return true if any is newer than the target. *) val processChildren = List.foldl (fn (child:string, parentNeedsMake:bool) => ( maybeRemake child; (* Find its date and see if it is newer. *) parentNeedsMake orelse lastMade child > objDate ) ) false; in if objDate < fileTimeStamp fileName orelse ( (* Get the dependency list. There may not be one if this object has not been compiled with "make". *) case getMakeDependencies objName of SOME d => processChildren d | NONE => true (* No dependency list - must use "make" on it. *) ) then remakeCurrentObj () else () end; (* Mark it as having been checked. *) setStatus (objName, Checked) end (* body of remakeObj *) (* If the object is not a file mark it is checked. It may be a pervasive or it may be missing. In either case mark it as checked to save searching for it again. *) handle ObjNotFile => setStatus (objName, Checked) | exn => (* Compilation (or execution) error. *) ( (* Mark as checked to prevent spurious messages. *) setStatus (objName, Checked); raise exn ) in (* body of make *) (* Check that the target exists. *) case filePresent (dirName, NONE, objectName) of NONE => let val dir = if dirName = "" then "" else " (directory "^dirName^")"; val s = "File "^objectName^" not found" ^ dir in print (s ^ "\n"); raise Fail s end | _ => let val targetIsDir = testForDirectory targetName; (* If the target we are making is a directory all the objects must be in the directory. If it is a file we allow references to other objects in the same directory. Objects not found must be pervasive. *) fun findDirectory kind (s: string) : string = if (not targetIsDir orelse s = objectName) andalso isSome(filePresent(dirName, kind, s)) then dirName else raise ObjNotFile; in remakeObj (objectName, NONE, findDirectory) handle exn => ( print (targetName ^ " was not declared\n"); PolyML.Exception.reraise exn ) end end (* make *) in structure PolyML = struct open PolyML (* We must not have a signature on the result otherwise print and makestring will be given polymorphic types and will only produce "?" *) val globalNameSpace = globalNameSpace val use = use and make = make and shell = shell val suffixes = suffixes val compiler = polyCompiler val prettyPrintWithIDEMarkup = prettyPrintWithIDEMarkup structure Compiler = struct datatype compilerParameters = datatype compilerParameters val compilerVersion = Bootstrap.compilerVersion val compilerVersionNumber = Bootstrap.compilerVersionNumber val forgetSignature: string -> unit = forgetSig and forgetStructure: string -> unit = forgetStruct and forgetFunctor: string -> unit = forgetFunct and forgetValue: string -> unit = forgetVal and forgetType: string -> unit = forgetType and forgetFixity: string -> unit = forgetFix fun signatureNames (): string list = #1(ListPair.unzip (#allSig globalNameSpace ())) and structureNames (): string list = #1(ListPair.unzip (#allStruct globalNameSpace ())) and functorNames (): string list = #1(ListPair.unzip (#allFunct globalNameSpace ())) and valueNames (): string list = #1(ListPair.unzip (#allVal globalNameSpace ())) and typeNames (): string list = #1(ListPair.unzip (#allType globalNameSpace ())) and fixityNames (): string list = #1(ListPair.unzip (#allFix globalNameSpace ())) val prompt1 = prompt1 and prompt2 = prompt2 and profiling = profiling and timing = timing and printDepth = printDepth and errorDepth = errorDepth and lineLength = lineLength and allocationProfiling = allocationProfiling val assemblyCode = assemblyCode and codetree = codetree and codetreeAfterOpt = codetreeAfterOpt and pstackTrace = pstackTrace and parsetree = parsetree and reportUnreferencedIds = reportUnreferencedIds and lowlevelOptimise = lowlevelOptimise and reportExhaustiveHandlers = reportExhaustiveHandlers and narrowOverloadFlexRecord = narrowOverloadFlexRecord val debug = debug val inlineFunctors = inlineFunctors val maxInlineSize = maxInlineSize val printInAlphabeticalOrder = printInAlphabeticalOrder val traceCompiler = traceCompiler end and Debug = struct (* singleStep causes the debugger to be entered on the next call. stepOver enters the debugger on the next call when the stack is no larger than it is at present. stepOut enters the debugger on the next call when the stack is smaller than it is at present. *) fun step () = (stepDebug := true; stepDepth := ~1; exitLoop := true) and stepOver() = (stepDebug := true; stepDepth := List.length(!(getStack())); exitLoop := true) and stepOut() = (stepDebug := true; stepDepth := List.length(!(getStack())) - 1; exitLoop := true) and continue () = (stepDebug := false; stepDepth := ~1; exitLoop := true) and continueWithEx exn = (stepDebug := false; stepDepth := ~1; exitLoop := true; debugExPacket := SOME exn) and trace b = tracing := b fun breakAt (file, line) = if checkLineBreak(file, line) then () (* Already there. *) else lineBreakPoints := (file, line) :: ! lineBreakPoints fun clearAt (file, line) = let fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak ((f, l) :: rest) = if l = line andalso f = file then rest else (f, l) :: findBreak rest in lineBreakPoints := findBreak (! lineBreakPoints) end fun breakIn name = if checkFnBreak true name then () (* Already there. *) else fnBreakPoints := name :: ! fnBreakPoints fun clearIn name = let fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak (n :: rest) = if name = n then rest else n :: findBreak rest in fnBreakPoints := findBreak (! fnBreakPoints) end fun breakEx exn = if checkExnBreak exn then () (* Already there. *) else exBreakPoints := getExnId exn :: ! exBreakPoints fun clearEx exn = let val exnId = getExnId exn fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak (n :: rest) = if exnId = n then rest else n :: findBreak rest in exBreakPoints := findBreak (! exBreakPoints) end (* Stack traversal. *) fun up () = let val stack = getStack() in if !debugLevel < List.length (!stack) -1 then let val _ = debugLevel := !debugLevel + 1; val {funName, lineNo, fileName, ...} = List.nth(!stack, !debugLevel) in printSourceLine(fileName, lineNo, funName, false) end else TextIO.print "Top of stack.\n" end and down () = let val stack = getStack() in if !debugLevel = 0 then TextIO.print "Bottom of stack.\n" else let val () = debugLevel := !debugLevel - 1; val {funName, lineNo, fileName, ...} = List.nth(!stack, !debugLevel) in printSourceLine(fileName, lineNo, funName, false) end end (* Just print the functions without any other context. *) fun stack () : unit = let fun printTrace ({funName, lineNo, fileName, ...} : debugStackEntry) = printSourceLine(fileName, lineNo, funName, true) in List.app printTrace (! (getStack())) end local fun printVal v = prettyPrintWithOptionalMarkup(TextIO.print, !lineLength) (NameSpace.displayVal(v, !printDepth, globalNameSpace)) fun printStack (stack: debugStackEntry) = List.app (fn (_,v) => printVal v) (#allVal (#space stack) ()) in (* Print all variables at the current level. *) fun variables() = printStack (List.nth(!(getStack()), !debugLevel)) (* Print all the levels. *) and dump() = let fun printLevel (stack as {funName, ...}) = ( TextIO.print(concat["Function ", funName, ":"]); printStack stack; TextIO.print "\n" ) in List.app printLevel (!(getStack())) end end end and CodeTree = struct open PolyML.CodeTree (* Add options to the code-generation phase. *) val genCode = fn (code, numLocals) => let open Bootstrap Bootstrap.Universal val compilerOut = prettyPrintWithOptionalMarkup(TextIO.print, !lineLength) in genCode(code, [ tagInject compilerOutputTag compilerOut, tagInject maxInlineSizeTag (! maxInlineSize), tagInject codetreeTag (! codetree), tagInject pstackTraceTag (! pstackTrace), tagInject lowlevelOptimiseTag (! lowlevelOptimise), tagInject assemblyCodeTag (! assemblyCode), tagInject codetreeAfterOptTag (! codetreeAfterOpt) ], numLocals) end end (* Original print_depth etc functions. *) fun profiling i = Compiler.profiling := i and timing b = Compiler.timing := b and print_depth i = Compiler.printDepth := i and error_depth i = Compiler.errorDepth := i and line_length i = Compiler.lineLength := i (* Legacy exception_trace. *) structure Exception = struct open Exception local fun printTrace(trace, exn) = let fun pr s = TextIO.output(TextIO.stdOut, s) in (* Exception *) pr "Exception trace for exception - "; pr (General.exnName exn); (* Location if available *) case exceptionLocation exn of SOME { file, startLine=line, ... } => ( if file = "" then () else (pr " raised in "; pr file); if line = 0 then () else (pr " line "; pr(Int.toString line)) ) | NONE => (); pr "\n\n"; (* Function list *) List.app(fn s => (pr s; pr "\n")) trace; pr "End of trace\n\n"; TextIO.flushOut TextIO.stdOut; (* Reraise the exception. *) PolyML.Exception.reraise exn end in fun exception_trace f = traceException(f, printTrace) end end (* Include it in the PolyML structure for backwards compatibility. *) val exception_trace = Exception.exception_trace (* Saving and loading state. *) structure SaveState = struct local val getOS: int = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (0, 0) fun loadMod (args: string): Universal.universal list = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (32, args) and systemDir(): string = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (34, ()) in fun loadModuleBasic (fileName: string): Universal.universal list = (* If there is a path separator use the name and don't search further. *) if OS.Path.dir fileName <> "" then loadMod fileName else let (* Path elements are separated by semicolons in Windows but colons in Unix. *) val sepInPathList = if getOS = 1 then #";" else #":" val pathList = case OS.Process.getEnv "POLYMODPATH" of NONE => [] | SOME s => String.fields (fn ch => ch = sepInPathList) s fun findFile [] = NONE | findFile (hd::tl) = (* Try actually loading the file. That way we really check we have a module. *) SOME(loadMod (OS.Path.joinDirFile{dir=hd, file=fileName})) handle Fail _ => findFile tl | OS.SysErr _ => findFile tl in case findFile pathList of SOME l => l (* Found *) | NONE => let val sysDir = systemDir() val inSysDir = if sysDir = "" then NONE else findFile[sysDir] in case inSysDir of SOME l => l | NONE => raise Fail("Unable to find module ``" ^ fileName ^ "''") end end end fun saveChild(f: string, depth: int): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (20, (f, depth)) fun saveState f = saveChild (f, 0); fun showHierarchy(): string list = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (22, ()) fun renameParent{ child: string, newParent: string }: unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (23, (child, newParent)) fun showParent(child: string): string option = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (24, child) fun loadState (f: string): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (21, f) and loadHierarchy (s: string list): unit = (* Load hierarchy takes a list of file names in order with the parents before the children. It's easier for the RTS if this is reversed. *) RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (33, List.rev s) (* Module loading and storing. *) structure Tags = struct val structureTag: (string * PolyML.NameSpace.structureVal) Universal.tag = Universal.tag() val functorTag: (string * PolyML.NameSpace.functorVal) Universal.tag = Universal.tag() val signatureTag: (string * PolyML.NameSpace.signatureVal) Universal.tag = Universal.tag() val valueTag: (string * PolyML.NameSpace.valueVal) Universal.tag = Universal.tag() val typeTag: (string * PolyML.NameSpace.typeVal) Universal.tag = Universal.tag() val fixityTag: (string * PolyML.NameSpace.fixityVal) Universal.tag = Universal.tag() val startupTag: (unit -> unit) Universal.tag = Universal.tag() end val saveModuleBasic: string * Universal.universal list -> unit = fn args => RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (31, args) fun saveModule(s, {structs, functors, sigs, onStartup}) = let fun dolookup (look, tag, kind) s = case look globalNameSpace s of SOME v => Universal.tagInject tag (s, v) | NONE => raise Fail (concat[kind, " ", s, " has not been declared"]) val structVals = map (dolookup(#lookupStruct, Tags.structureTag, "Structure")) structs val functorVals = map (dolookup(#lookupFunct, Tags.functorTag, "Functor")) functors val sigVals = map (dolookup(#lookupSig, Tags.signatureTag, "Signature")) sigs val startVal = case onStartup of SOME f => [Universal.tagInject Tags.startupTag f] | NONE => [] in saveModuleBasic(s, structVals @ functorVals @ sigVals @ startVal) end fun loadModule s = let val ulist = loadModuleBasic s (* Find and run the start-up function. If it raises an exception we don't go further. *) val startFn = List.find (Universal.tagIs Tags.startupTag) ulist val () = case startFn of SOME f => (Universal.tagProject Tags.startupTag f) () | NONE => () (* Enter the items into the name space. *) fun addItems (tag, enter) (hd :: tl) = (if Universal.tagIs tag hd then enter globalNameSpace (Universal.tagProject tag hd) else (); addItems (tag, enter) tl) | addItems _ _ = () in addItems(Tags.structureTag, #enterStruct) ulist; addItems(Tags.signatureTag, #enterSig) ulist; addItems(Tags.functorTag, #enterFunct) ulist; addItems(Tags.valueTag, #enterVal) ulist; addItems(Tags.typeTag, #enterType) ulist; addItems(Tags.fixityTag, #enterFix) ulist end end end end (* PolyML. *); polyml-5.6/basis/FinalPolyML.sml000066400000000000000000003212171265146633400166640ustar00rootroot00000000000000(* Title: Nearly final version of the PolyML structure Author: David Matthews Copyright David Matthews 2008-9, 2014, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Based on: Title: Poly Make Program. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This is the version of the PolyML structure that can be compiled after we have the rest of the basis library. In particular it binds in TextIO.stdIn and TextIO.stdOut. This contains the top-level read-eval-print loop as well as "use" and Poly/ML's "make". The rootFunction has now been pulled out into a separate file and is added on after this. *) local (* A hash table with a mutex that protects against multiple threads rehashing the table by entering values at the same time. *) structure ProtectedTable :> sig type 'a ptable val create: unit -> 'a ptable val lookup: 'a ptable -> string -> 'a option val enter: 'a ptable -> string * 'a -> unit val all: 'a ptable -> unit -> (string * 'a) list val delete: 'a ptable -> string -> unit end = struct open HashArray Thread.Mutex LibraryIOSupport type 'a ptable = 'a hash * mutex fun create () = (hash 10, mutex()) and lookup(tab, mutx) = protect mutx (fn s => sub(tab, s)) and enter(tab, mutx) = protect mutx (fn (s, v) => update(tab, s, v)) and all(tab, mutx) = protect mutx (fn () => fold (fn (s, v, l) => ((s, v) :: l)) [] tab) and delete(tab, mutx) = protect mutx (fn s => HashArray.delete (tab, s)) end fun quickSort _ ([]:'a list) = [] | quickSort _ ([h]:'a list) = [h] | quickSort (leq:'a -> 'a -> bool) ((h::t) :'a list) = let val (after, befor) = List.partition (leq h) t in quickSort leq befor @ (h :: quickSort leq after) end open PolyML.NameSpace local open ProtectedTable val fixTable = create() and sigTable = create() and valTable = create() and typTable = create() and fncTable = create() and strTable = create() in val globalNameSpace: PolyML.NameSpace.nameSpace = { lookupFix = lookup fixTable, lookupSig = lookup sigTable, lookupVal = lookup valTable, lookupType = lookup typTable, lookupFunct = lookup fncTable, lookupStruct = lookup strTable, enterFix = enter fixTable, enterSig = enter sigTable, enterVal = enter valTable, enterType = enter typTable, enterFunct = enter fncTable, enterStruct = enter strTable, allFix = all fixTable, allSig = all sigTable, allVal = all valTable, allType = all typTable, allFunct = all fncTable, allStruct = all strTable } val forgetFix = delete fixTable and forgetSig = delete sigTable and forgetVal = delete valTable and forgetType = delete typTable and forgetFunct = delete fncTable and forgetStruct = delete strTable end local open PolyML (* For prettyprint datatype *) (* Install a pretty printer for parsetree properties. This isn't done in the compiler. *) fun prettyProps depth _ l = if depth <= 0 then PrettyString "..." else prettyProp(l, depth-1) (* Use prettyRepresentation to print most of the arguments *) and prettyProp(PTbreakPoint b, d) = blockArg("PTbreakPoint", prettyRepresentation(b, d)) | prettyProp(PTcompletions s, d) = blockArg("PTcompletions", prettyRepresentation(s, d)) | prettyProp(PTdeclaredAt l, d) = blockArg("PTdeclaredAt", prettyRepresentation(l, d)) | prettyProp(PTdefId i, d) = blockArg("PTdefId", prettyRepresentation(i, d)) | prettyProp(PTfirstChild _, _) = blockArg("PTfirstChild", PrettyString "fn") | prettyProp(PTnextSibling _, _) = blockArg("PTnextSibling", PrettyString "fn") | prettyProp(PTopenedAt f, d) = blockArg("PTopenedAt", prettyRepresentation(f, d)) | prettyProp(PTparent _, _) = blockArg("PTparent", PrettyString "fn") | prettyProp(PTpreviousSibling _, _)= blockArg("PTpreviousSibling", PrettyString "fn") | prettyProp(PTprint _, _) = blockArg("PTprint", PrettyString "fn") | prettyProp(PTreferences f, d) = blockArg("PTreferences", prettyRepresentation(f, d)) | prettyProp(PTrefId f, d) = blockArg("PTrefId", prettyRepresentation(f, d)) | prettyProp(PTstructureAt f, d) = blockArg("PTstructureAt", prettyRepresentation(f, d)) | prettyProp(PTtype f, d) = blockArg("PTtype", prettyRepresentation(f, d)) and blockArg (s, arg) = PrettyBlock(3, true, [], [PrettyString s, PrettyBreak(1, 1), parenthesise arg]) and parenthesise(p as PrettyBlock(_, _, _, PrettyString "(" :: _)) = p | parenthesise(p as PrettyBlock(_, _, _, PrettyString "{" :: _)) = p | parenthesise(p as PrettyBlock(_, _, _, PrettyString "[" :: _)) = p | parenthesise(p as PrettyBlock(_, _, _, _ :: _)) = PrettyBlock(3, true, [], [ PrettyString "(", PrettyBreak(0, 0), p, PrettyBreak(0, 0), PrettyString ")" ]) | parenthesise p = p in val () = addPrettyPrinter prettyProps end (* PolyML.compiler takes a list of these parameter values. They all default so it's possible to pass only those that are actually needed. *) datatype compilerParameters = CPOutStream of string->unit (* Output stream for debugging and other output from the compiler. Provides a default stream for other output. Default: TextIO.print *) | CPNameSpace of PolyML.NameSpace.nameSpace (* Name space to look up and enter results. Default: globalNameSpace *) | CPErrorMessageProc of { message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } -> unit (* Called by the compiler to generate error messages. Arguments (message, isHard, lineNo, context). message is the message. isHard is true if this is an error, false if a warning. location is the file-name, line number and position. context is an optional extra piece of information showing the part of the parse tree where the error was detected. Default: print this to CPOutStream value using CPLineNo and CPFileName. *) | CPLineNo of unit -> int (* Called by the compiler to get the current "line number". This is passed to CPErrorMessageProc and the debugger. It may actually be a more general location than a source line. Default: fn () => 0 i.e. no line numbering. *) | CPLineOffset of unit -> int (* Called by the compiler to get the current "offset". This is passed to CPErrorMessageProc and the debugger. This may either be an offset on the current file, a byte offset or simply zero. Default: fn () => 0 i.e. no line offset. *) | CPFileName of string (* The current file being compiled. This is used by the default CPErrorMessageProc and the debugger. Default: "" i.e. interactive stream. *) | CPPrintInAlphabeticalOrder of bool (* Whether to sort the results by alphabetical order before printing them. Applies only to the default CPResultFun. Default value of printInAlphabeticalOrder. *) | CPResultFun of { fixes: (string * Infixes.fixity) list, values: (string * Values.value) list, structures: (string * Structures.structureVal) list, signatures: (string * Signatures.signatureVal) list, functors: (string * Functors.functorVal) list, types: (string * TypeConstrs.typeConstr) list} -> unit (* Function to apply to the result of compiling and running the code. Default: print and enter the values into CPNameSpace. *) | CPCompilerResultFun of PolyML.parseTree option * ( unit -> { fixes: (string * Infixes.fixity) list, values: (string * Values.value) list, structures: (string * Structures.structureVal) list, signatures: (string * Signatures.signatureVal) list, functors: (string * Functors.functorVal) list, types: (string * TypeConstrs.typeConstr) list}) option -> unit -> unit (* Function to process the result of compilation. This can be used to capture the parse tree even if type-checking fails. Default: Execute the code and call the result function if the compilation succeeds. Raise an exception if the compilation failed. *) | CPProfiling of int (* Deprecated: No longer used. *) | CPTiming of bool (* Deprecated: No longer used. *) | CPDebug of bool (* Control whether calls to the debugger should be inserted into the compiled code. This allows breakpoints to be set, values to be examined and printed and functions to be traced at the cost of a very large run-time overhead. Default: value of PolyML.Compiler.debug *) | CPPrintDepth of unit->int (* This controls the depth of printing if the default CPResultFun is used. It is also bound into any use of PolyML.print in the compiled code and will be called to get the print depth whenever that code is executed. Default: Get the current value of PolyML.print_depth. *) | CPPrintStream of string->unit (* This is bound into any occurrence of PolyML.print and is used to produce the outut. Default: CPOutStream. *) | CPErrorDepth of int (* Controls the depth of context to produce in error messages. Default : value of PolyML.error_depth. *) | CPLineLength of int (* Bound into any occurrences of PolyML.print. This is the length of a line used in the pretty printer. Default: value of PolyML.line_length. *) | CPRootTree of { parent: (unit -> PolyML.parseTree) option, next: (unit -> PolyML.parseTree) option, previous: (unit -> PolyML.parseTree) option } (* This can be used to provide a parent for parse trees created by the compiler. This appears as a PTparent property in the tree. The default is NONE which does not to provide a parent. *) | CPAllocationProfiling of int (* Controls whether to add profiling information to each allocation. Currently zero means no profiling and one means add the allocating function. *) | CPDebuggerFunction of int * Values.value * int * string * string * nameSpace -> unit (* Deprecated: No longer used. *) | CPBindingSeq of unit -> int (* Used to create a sequence no for PTdefId properties. This can be used in an IDE to allocate a unique Id for an identifier. Default fn _ => 0. *) (* References for control and debugging. *) val timing = ref false and printDepth = ref 0 and errorDepth = ref 6 and lineLength = ref 77 and allocationProfiling = ref false val assemblyCode = ref false and codetree = ref false and codetreeAfterOpt = ref false and pstackTrace = ref false and parsetree = ref false and reportUnreferencedIds = ref false and reportExhaustiveHandlers = ref false and narrowOverloadFlexRecord = ref false and createPrintFunctions = ref true and reportDiscardFunction = ref true and reportDiscardNonUnit = ref false val lowlevelOptimise = ref true val debug = ref false val inlineFunctors = ref true val maxInlineSize = ref 80 val printInAlphabeticalOrder = ref true val traceCompiler = ref false fun prettyPrintWithIDEMarkup(stream : string -> unit, lineWidth : int): PolyML.pretty -> unit = let open PolyML val openDeclaration = "\u001bD" val closeDeclaration = "\u001bd" val separator = "\u001b," val finalSeparator = "\u001b;" fun beginMarkup context = case List.find (fn ContextLocation _ => true | _ => false) context of SOME (ContextLocation{file,startLine,startPosition,endPosition, ...}) => let (* In the unlikely event there's an escape character in the file name convert it to ESC-ESC. *) fun escapeEscapes #"\u001b" = "\u001b\u001b" | escapeEscapes c = str c in stream openDeclaration; stream(String.translate escapeEscapes file); stream separator; stream(Int.toString startLine); stream separator; stream(Int.toString startPosition); stream separator; stream(Int.toString endPosition); stream finalSeparator end | _ => () fun endMarkup context = List.app (fn ContextLocation _ => stream closeDeclaration | _ => ()) context in prettyMarkup (beginMarkup, endMarkup) (stream, lineWidth) end; (* useMarkupInOutput is set according to the setting of *) val useMarkupInOutput = ref false fun prettyPrintWithOptionalMarkup(stream, lineWidth) = if ! useMarkupInOutput then prettyPrintWithIDEMarkup(stream, lineWidth) else PolyML.prettyPrint(stream, lineWidth) (* Top-level prompts. *) val prompt1 = ref "> " and prompt2 = ref "# "; fun printOut s = TextIO.print s (* If we get an exception while writing to stdOut we've got a big problem and can't continue. It could happen if we have closed stdOut. Try reporting the error through stdErr and exit. *) handle Thread.Thread.Interrupt => raise Thread.Thread.Interrupt | exn => ( ( TextIO.output(TextIO.stdErr, concat["Exception ", exnName exn, " raised while writing to stdOut.\n"]); TextIO.flushOut TextIO.stdErr (* probably unnecessary. *) ) handle _ => (); (* Get out without trying to do anything else. *) OS.Process.terminate OS.Process.failure ) (* Default function to print and enter a value. *) fun printAndEnter (inOrder: bool, space: PolyML.NameSpace.nameSpace, stream: string->unit, depth: int) { fixes: (string * Infixes.fixity) list, values: (string * Values.value) list, structures: (string * Structures.structureVal) list, signatures: (string * Signatures.signatureVal) list, functors: (string * Functors.functorVal) list, types: (string * TypeConstrs.typeConstr) list}: unit = let (* We need to merge the lists to sort them alphabetically. *) datatype decKind = FixStatusKind of Infixes.fixity | TypeConstrKind of TypeConstrs.typeConstr | SignatureKind of Signatures.signatureVal | StructureKind of Structures.structureVal | FunctorKind of Functors.functorVal | ValueKind of Values.value val decList = map (fn (s, f) => (s, FixStatusKind f)) fixes @ map (fn (s, f) => (s, TypeConstrKind f)) types @ map (fn (s, f) => (s, SignatureKind f)) signatures @ map (fn (s, f) => (s, StructureKind f)) structures @ map (fn (s, f) => (s, FunctorKind f)) functors @ map (fn (s, f) => (s, ValueKind f)) values fun kindToInt(FixStatusKind _) = 0 | kindToInt(TypeConstrKind _) = 1 | kindToInt(SignatureKind _) = 2 | kindToInt(StructureKind _) = 3 | kindToInt(FunctorKind _) = 4 | kindToInt(ValueKind _) = 5 fun order (s1: string, k1) (s2, k2) = if s1 = s2 then kindToInt k1 <= kindToInt k2 else s1 <= s2 (* Don't sort the declarations if we want them in declaration order. *) val sortedDecs = if inOrder then quickSort order decList else decList fun enterDec(n, FixStatusKind f) = #enterFix space (n,f) | enterDec(n, TypeConstrKind t) = #enterType space (n,t) | enterDec(n, SignatureKind s) = #enterSig space (n,s) | enterDec(n, StructureKind s) = #enterStruct space (n,s) | enterDec(n, FunctorKind f) = #enterFunct space (n,f) | enterDec(n, ValueKind v) = #enterVal space (n,v) fun printDec(_, FixStatusKind f) = prettyPrintWithOptionalMarkup (stream, !lineLength) (Infixes.print f) | printDec(_, TypeConstrKind t) = prettyPrintWithOptionalMarkup (stream, !lineLength) (TypeConstrs.print(t, depth, SOME space)) | printDec(_, SignatureKind s) = prettyPrintWithOptionalMarkup (stream, !lineLength) (Signatures.print(s, depth, SOME space)) | printDec(_, StructureKind s) = prettyPrintWithOptionalMarkup (stream, !lineLength) (Structures.print(s, depth, SOME space)) | printDec(_, FunctorKind f) = prettyPrintWithOptionalMarkup (stream, !lineLength) (Functors.print(f, depth, SOME space)) | printDec(_, ValueKind v) = if Values.isConstructor v andalso not (Values.isException v) then () (* Value constructors are printed with the datatype. *) else prettyPrintWithOptionalMarkup (stream, !lineLength) (Values.printWithType(v, depth, SOME space)) in (* First add the declarations to the name space and then print them. Doing it this way improves the printing of types since these require look-ups in the name space. For instance the constructors of a datatype from an opened structure should not include the structure name but that will only work once the datatype itself is in the global name-space. *) List.app enterDec sortedDecs; if depth > 0 then List.app printDec sortedDecs else () end local open Bootstrap Bootstrap.Universal (* To allow for the possibility of changing the representation we don't make Universal be the same as Bootstrap.Universal. *) (* Default error message function. *) fun defaultErrorProc printString {message: PolyML.pretty, hard: bool, location={startLine, startPosition, endPosition, file, ...}: PolyML.location, context: PolyML.pretty option} = let open PolyML val fullMessage = case context of NONE => message | SOME ctxt => PrettyBlock(0, true, [], [ message, PrettyBreak(1, 0), PrettyBlock(2, false, [], [PrettyString "Found near", PrettyBreak(1, 0), ctxt]) ]) in if ! useMarkupInOutput then (* IDE mark-up of error messages. This is actually the same as within the IDE. *) let val openError = "\u001bE" val closeError = "\u001be" val separator = "\u001b," val finalSeparator = "\u001b;" in printString( concat [ openError, if hard then "E" else "W", separator, file, (* TODO double any escapes. *) separator, Int.toString startLine, separator, Int.toString startPosition, separator, Int.toString endPosition, finalSeparator ] ); prettyPrintWithIDEMarkup(printString, !lineLength) fullMessage; printString closeError end else (* Plain text form. *) ( printString(concat ( (if file = "" then ["poly: "] else [file, ":"]) @ (if startLine = 0 then [] else [Int.toString startLine]) @ (if startPosition = 0 then [": "] else [".", Int.toString startPosition, "-", Int.toString endPosition, ": "]) @ (if hard then ["error: "] else ["warning: "]) )); (* ( (if hard then ["Error-"] else ["Warning-"]) @ (if file = "" then [] else [" in '", file, "',"]) @ (if startLine = 0 then [] else [" line ", Int.toString startLine]) @ (if startLine = 0 andalso file = "" then [] else [".\n"]))); *) PolyML.prettyPrint(printString, !lineLength) fullMessage ) end in (* This function ends up as PolyML.compiler. *) fun polyCompiler (getChar: unit->char option, parameters: compilerParameters list) = let (* Find the first item that matches or return the default. *) fun find _ def [] = def | find f def (hd::tl) = case f hd of SOME s => s | NONE => find f def tl val outstream = find (fn CPOutStream s => SOME s | _ => NONE) TextIO.print parameters val nameSpace = find (fn CPNameSpace n => SOME n | _ => NONE) globalNameSpace parameters val lineNo = find (fn CPLineNo l => SOME l | _ => NONE) (fn () => 0) parameters val lineOffset = find (fn CPLineOffset l => SOME l | _ => NONE) (fn () => 0) parameters val fileName = find (fn CPFileName s => SOME s | _ => NONE) "" parameters val printInOrder = find (fn CPPrintInAlphabeticalOrder t => SOME t | _ => NONE) (! printInAlphabeticalOrder) parameters val printDepth = find (fn CPPrintDepth f => SOME f | _ => NONE) (fn () => !printDepth) parameters val resultFun = find (fn CPResultFun f => SOME f | _ => NONE) (printAndEnter(printInOrder, nameSpace, outstream, printDepth())) parameters val printString = find (fn CPPrintStream s => SOME s | _ => NONE) outstream parameters val errorProc = find (fn CPErrorMessageProc f => SOME f | _ => NONE) (defaultErrorProc printString) parameters val debugging = find (fn CPDebug t => SOME t | _ => NONE) (! debug) parameters val allocProfiling = find(fn CPAllocationProfiling l => SOME l | _ => NONE) (if !allocationProfiling then 1 else 0) parameters val bindingSeq = find(fn CPBindingSeq l => SOME l | _ => NONE) (fn () => 0) parameters local (* Default is to filter the parse tree argument. *) fun defaultCompilerResultFun (_, NONE) = raise Fail "Static Errors" | defaultCompilerResultFun (_, SOME code) = fn () => resultFun(code()) in val compilerResultFun = find (fn CPCompilerResultFun f => SOME f | _ => NONE) defaultCompilerResultFun parameters end (* TODO: Make this available as a parameter. *) val prettyOut = prettyPrintWithOptionalMarkup(printString, !lineLength) val compilerOut = prettyPrintWithOptionalMarkup(outstream, !lineLength) (* Parent tree defaults to empty. *) val parentTree = find (fn CPRootTree f => SOME f | _ => NONE) { parent = NONE, next = NONE, previous = NONE } parameters (* Pass all the settings. Some of these aren't included in the parameters datatype (yet?). *) val treeAndCode = PolyML.compiler(nameSpace, getChar, [ tagInject errorMessageProcTag errorProc, tagInject compilerOutputTag compilerOut, tagInject lineNumberTag lineNo, tagInject offsetTag lineOffset, tagInject fileNameTag fileName, tagInject bindingCounterTag bindingSeq, tagInject inlineFunctorsTag (! inlineFunctors), tagInject maxInlineSizeTag (! maxInlineSize), tagInject parsetreeTag (! parsetree), tagInject codetreeTag (! codetree), tagInject pstackTraceTag (! pstackTrace), tagInject lowlevelOptimiseTag (! lowlevelOptimise), tagInject assemblyCodeTag (! assemblyCode), tagInject codetreeAfterOptTag (! codetreeAfterOpt), tagInject profileAllocationTag allocProfiling, tagInject errorDepthTag (! errorDepth), tagInject printDepthFunTag printDepth, tagInject lineLengthTag (! lineLength), tagInject traceCompilerTag (! traceCompiler), tagInject debugTag debugging, tagInject printOutputTag prettyOut, tagInject rootTreeTag parentTree, tagInject reportUnreferencedIdsTag (! reportUnreferencedIds), tagInject reportExhaustiveHandlersTag (! reportExhaustiveHandlers), tagInject narrowOverloadFlexRecordTag (! narrowOverloadFlexRecord), tagInject createPrintFunctionsTag (! createPrintFunctions), tagInject reportDiscardedValuesTag (if ! reportDiscardNonUnit then 2 else if ! reportDiscardFunction then 1 else 0) ]) in compilerResultFun treeAndCode end (* Top-level read-eval-print loop. This is the normal top-level loop and is also used for the debugger. *) fun topLevel {isDebug, nameSpace, exitLoop, exitOnError, isInteractive, startExec, endExec } = let (* This is used as the main read-eval-print loop. It is also invoked by running code that has been compiled with the debug option on when it stops at a breakpoint. In that case debugEnv contains an environment formed from the local variables. This is placed in front of the normal top-level environment. *) (* Don't use the end_of_stream because it may have been set by typing EOT to the command we were running. *) val endOfFile = ref false; val realDataRead = ref false; val lastWasEol = ref true; (* Each character typed is fed into the compiler but leading blank lines result in the prompt remaining as firstPrompt until significant characters are typed. *) fun readin () : char option = let val () = if isInteractive andalso !lastWasEol (* Start of line *) then if !realDataRead then printOut (if isDebug then "debug " ^ !prompt2 else !prompt2) else printOut (if isDebug then "debug " ^ !prompt1 else !prompt1) else (); in case TextIO.input1 TextIO.stdIn of NONE => (endOfFile := true; NONE) | SOME #"\n" => ( lastWasEol := true; SOME #"\n" ) | SOME ch => ( lastWasEol := false; if ch <> #" " then realDataRead := true else (); SOME ch ) end; (* readin *) (* Remove all buffered but unread input. *) fun flushInput () = case TextIO.canInput(TextIO.stdIn, 1) of SOME 1 => (TextIO.inputN(TextIO.stdIn, 1); flushInput()) | _ => (* No input waiting or we're at EOF. *) () fun readEvalPrint () : unit = let (* If we have executed a deeply recursive function the stack will have extended to be very large. It's better to reduce the stack if we can. This is RISKY. Each function checks on entry that the stack has sufficient space for everything it will allocate and assumes the stack will not shrink. It's unlikely that any of the functions here will have asked for very much but as a precaution we allow for an extra 8k words. *) fun shrink_stack (newsize : int) : unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_shrink_stack newsize val () = if isDebug then () else shrink_stack 8000; in realDataRead := false; (* Compile and then run the code. *) let val startCompile = Timer.startCPUTimer() (* Compile a top-level declaration/expression. *) val code = polyCompiler (readin, [CPNameSpace nameSpace, CPOutStream printOut]) (* Don't print any times if this raises an exception. *) handle exn as Fail s => ( printOut(s ^ "\n"); flushInput(); lastWasEol := true; PolyML.Exception.reraise exn ) val endCompile = Timer.checkCPUTimer startCompile (* Run the code *) val startRun = Timer.startCPUTimer() val () = startExec() (* Enable any debugging *) (* Run the code and capture any exception (temporarily). *) val finalResult = (code(); NONE) handle exn => SOME exn val () = endExec() (* Turn off debugging *) (* Print the times if required. *) val endRun = Timer.checkCPUTimer startRun val () = if !timing then printOut( concat["Timing - compile: ", Time.fmt 1 (#usr endCompile + #sys endCompile), " run: ", Time.fmt 1 (#usr endRun + #sys endRun), "\n"]) else () in case finalResult of NONE => () (* No exceptions raised. *) | SOME exn => (* Report exceptions in running code. *) let open PolyML PolyML.Exception val exLoc = case exceptionLocation exn of NONE => [] | SOME loc => [ContextLocation loc] in prettyPrintWithOptionalMarkup(TextIO.print, ! lineLength) (PrettyBlock(0, false, [], [ PrettyBlock(0, false, exLoc, [PrettyString "Exception-"]), PrettyBreak(1, 3), prettyRepresentation(exn, ! printDepth), PrettyBreak(1, 3), PrettyString "raised" ])); PolyML.Exception.reraise exn end end end; (* readEvalPrint *) fun handledLoop () : unit = ( (* Process a single top-level command. *) readEvalPrint() handle Thread.Thread.Interrupt => (* Allow ^C to terminate the debugger and raise Interrupt in the called program. *) if exitOnError then OS.Process.exit OS.Process.failure else if isDebug then (flushInput(); raise Thread.Thread.Interrupt) else () | _ => if exitOnError then OS.Process.exit OS.Process.failure else (); (* Exit if we've seen end-of-file or we're in the debugger and we've run "continue". *) if !endOfFile orelse exitLoop() then () else handledLoop () ) in handledLoop () end end val suffixes = ref ["", ".ML", ".sml"] (*****************************************************************************) (* "use": compile from a file. *) (*****************************************************************************) val useFileTag: string option Universal.tag = Universal.tag() fun getUseFileName(): string option = Option.join (Thread.Thread.getLocal useFileTag) fun use (originalName: string): unit = let (* use "f" first tries to open "f" but if that fails it tries "f.ML", "f.sml" etc. *) (* We use the functional layer and a reference here rather than TextIO.input1 because that requires locking round every read to make it thread-safe. We know there's only one thread accessing the stream so we don't need it here. *) fun trySuffixes [] = (* Not found - attempt to open the original and pass back the exception. *) (TextIO.getInstream(TextIO.openIn originalName), originalName) | trySuffixes (s::l) = (TextIO.getInstream(TextIO.openIn (originalName ^ s)), originalName ^ s) handle IO.Io _ => trySuffixes l (* First in list is the name with no suffix. *) val (inStream, fileName) = trySuffixes("" :: ! suffixes) val stream = ref inStream (* Record the file name. This allows nested calls to "use" to set the correct path. *) val oldName = getUseFileName() val () = Thread.Thread.setLocal(useFileTag, SOME fileName) val lineNo = ref 1; fun getChar () : char option = case TextIO.StreamIO.input1 (! stream) of NONE => NONE | SOME (eoln as #"\n", strm) => ( lineNo := !lineNo + 1; stream := strm; SOME eoln ) | SOME(c, strm) => (stream := strm; SOME c) in while not (TextIO.StreamIO.endOfStream(!stream)) do let val code = polyCompiler(getChar, [CPFileName fileName, CPLineNo(fn () => !lineNo)]) handle exn => ( TextIO.StreamIO.closeIn(!stream); PolyML.Exception.reraise exn ) in code() handle exn => ( (* Report exceptions in running code. *) TextIO.print ("Exception- " ^ exnMessage exn ^ " raised\n"); TextIO.StreamIO.closeIn (! stream); Thread.Thread.setLocal(useFileTag, oldName); PolyML.Exception.reraise exn ) end; (* Normal termination: close the stream. *) TextIO.StreamIO.closeIn (! stream); Thread.Thread.setLocal(useFileTag, oldName) end (* use *) local open Time in fun maxTime (x : time, y : time): time = if x < y then y else x end exception ObjNotFile; type 'a tag = 'a Universal.tag; fun splitFilename (name: string) : string * string = let val {dir, file } = OS.Path.splitDirFile name in (dir, file) end (* Make *) (* There are three possible states - The object may have been checked, it may be currently being compiled, or it may not have been processed yet. *) datatype compileState = NotProcessed | Searching | Checked; fun longName (directory, file) = OS.Path.joinDirFile{dir=directory, file = file} local fun fileReadable (fileTuple as (directory, object)) = (* Use OS.FileSys.isDir just to test if the file/directory exists. *) if (OS.FileSys.isDir (longName fileTuple); false) handle OS.SysErr _ => true then false else let (* Check that the object is present in the directory with the name given and not a case-insensitive version of it. This avoids problems with "make" attempting to recursively make Array etc because they contain signatures ARRAY. *) open OS.FileSys val d = openDir (if directory = "" then "." else directory) fun searchDir () = case readDir d of NONE => false | SOME f => f = object orelse searchDir () val present = searchDir() in closeDir d; present end fun findFileTuple _ [] = NONE | findFileTuple (directory, object) (suffix :: suffixes) = let val fileName = object ^ suffix val fileTuple = (directory, fileName) in if fileReadable fileTuple then SOME fileTuple else findFileTuple (directory, object) suffixes end in fun filePresent (directory : string, kind: string option, object : string) = let (* Construct suffixes with the architecture and version number in so we can compile architecture- and version-specific code. *) val archSuffix = "." ^ String.map Char.toLower (PolyML.architecture()) val versionSuffix = "." ^ Int.toString Bootstrap.compilerVersionNumber val extraSuffixes = case kind of NONE => [archSuffix, versionSuffix, ""] | SOME k => ["." ^ k ^ archSuffix, "." ^ k ^ versionSuffix, "." ^ k, archSuffix, versionSuffix, ""] val addedSuffixes = List.foldr(fn (i, l) => (List.map (fn s => s ^ i) extraSuffixes) @ l) [] (!suffixes) in (* For each of the suffixes in the list try it. *) findFileTuple (directory, object) addedSuffixes end end (* See if the corresponding file is there and if it is a directory. *) fun testForDirectory (name: string) : bool = OS.FileSys.isDir name handle OS.SysErr _ => false (* No such file. *) (* Time stamps. *) type timeStamp = Time.time; val firstTimeStamp : timeStamp = Time.zeroTime; (* Get the current time. *) val newTimeStamp : unit -> timeStamp = Time.now (* Get the date of a file. *) val fileTimeStamp : string -> timeStamp = OS.FileSys.modTime local open ProtectedTable (* Global tables to hold information about entities that have been made using "make". *) val timeStampTable: timeStamp ptable = create() and dependencyTable: string list ptable = create() in (* When was the entity last built? Returns zeroTime if it hasn't. *) fun lastMade (objectName : string) : timeStamp = getOpt(lookup timeStampTable objectName, firstTimeStamp) (* Get the dependencies as an option type. *) val getMakeDependencies = lookup dependencyTable (* Set the time stamp and dependencies. *) fun updateMakeData(objectName, times, depends) = ( enter timeStampTable (objectName, times); enter dependencyTable (objectName, depends) ) end (* Main make function *) fun make (targetName: string) : unit = let (* This serves two purposes. It provides a list of objects which have been re-made to prevent them being made more than once, and it also prevents circular dependencies from causing infinite loops (e.g. let x = f(x)) *) local open HashArray; val htab : compileState hash = hash 10; in fun lookupStatus (name: string) : compileState = getOpt(sub (htab, name), NotProcessed); fun setStatus (name: string, cs: compileState) : unit = update (htab, name, cs) end; (* Remove leading directory names to get the name of the object itself. e.g. "../compiler/parsetree/gencode" yields simply "gencode". *) val (dirName,objectName) = splitFilename targetName; (* Looks to see if the file is in the current directory. If it is and the file is newer than the corresponding object then it must be remade. If it is a directory then we attempt to remake the directory by compiling the "bind" file. This will only actually be executed if it involves some identifier which is newer than the result object. *) fun remakeObj (objName: string, kind: string option, findDirectory: string option -> string -> string) = let (* Find a directory that contains this object. An exception will be raised if it is not there. *) val directory = findDirectory kind objName val fullName = if directory = "" (* Work around for bug. *) then objName else OS.Path.joinDirFile{dir=directory, file=objName} val objIsDir = testForDirectory fullName val here = fullName (* Look to see if the file exists, possibly with an extension, and get the extended version. *) val fileTuple = let (* If the object is a directory the source is in the bind file. *) val (dir : string, file : string) = if objIsDir then (here,"ml_bind") else (directory, objName); in case filePresent (dir, kind, file) of SOME res' => res' | NONE => raise Fail ("No such file or directory ("^file^","^dir^")") end ; val fileName = longName fileTuple; val newFindDirectory : string option -> string -> string = if objIsDir then let (* Look in this directory then in the ones above. *) fun findDirectoryHere kind (name: string) : string = case filePresent (here, kind, name) of NONE => findDirectory kind name (* not in this directory *) | _ => here; in findDirectoryHere end else findDirectory (* Compiles a file. *) fun remakeCurrentObj () = let val () = print ("Making " ^ objName ^ "\n"); local (* Keep a list of the dependencies. *) val deps : bool HashArray.hash = HashArray.hash 10; fun addDep name = if getOpt(HashArray.sub (deps, name), true) then HashArray.update(deps, name, true) else (); (* Called by the compiler to look-up a global identifier. *) fun lookupMakeEnv (globalLook, kind: string option) (name: string) : 'a option = let (* Have we re-declared it ? *) val res = lookupStatus name; in case res of NotProcessed => ( (* Compile the dependency. *) remakeObj (name, kind, newFindDirectory); (* Add this to the dependencies. *) addDep name ) | Searching => (* In the process of making it *) print("Circular dependency: " ^ name ^ " depends on itself\n") | Checked => addDep name; (* Add this to the dependencies. *) (* There was previously a comment about returning NONE here if we had a problem remaking a dependency. *) globalLook name end (* lookupMakeEnv *) (* Enter the declared value in the table. Usually this will be the target we are making. Also set the state to "Checked". The state is set to checked when we finish making the object but setting it now suppresses messages about circular dependencies if we use the identifier within the file. *) fun enterMakeEnv (kind : string, enterGlobal) (name: string, v: 'a) : unit = ( (* Put in the value. *) enterGlobal (name, v); print ("Created " ^ kind ^ " " ^ name ^ "\n"); (* The name we're declaring may appear to be a dependency but isn't, so don't include it in the list. *) HashArray.update (deps, name, false); if name = objName then let (* Put in the dependencies i.e. those names set to true in the table. *) val depends = HashArray.fold (fn (s, v, l) => if v then s :: l else l) [] deps; (* Put in a time stamp for the new object. We need to make sure that it is no older than the newest object it depends on. In theory that should not be a problem but clocks on different machines can get out of step leading to objects made later having earlier time stamps. *) val newest = List.foldl (fn (s: string, t: timeStamp) => maxTime (lastMade s, t)) (fileTimeStamp fileName) depends; val timeStamp = maxTime(newest, newTimeStamp()); in setStatus (name, Checked); updateMakeData(name, timeStamp, depends) end else () ) (* enterMakeEnv *); in val makeEnv = { lookupFix = #lookupFix globalNameSpace, lookupVal = #lookupVal globalNameSpace, lookupType = #lookupType globalNameSpace, lookupSig = lookupMakeEnv (#lookupSig globalNameSpace, SOME "signature"), lookupStruct = lookupMakeEnv (#lookupStruct globalNameSpace, SOME "structure"), lookupFunct = lookupMakeEnv (#lookupFunct globalNameSpace, SOME "functor"), enterFix = #enterFix globalNameSpace, enterVal = #enterVal globalNameSpace, enterType = #enterType globalNameSpace, enterStruct = enterMakeEnv ("structure", #enterStruct globalNameSpace), enterSig = enterMakeEnv ("signature", #enterSig globalNameSpace), enterFunct = enterMakeEnv ("functor", #enterFunct globalNameSpace), allFix = #allFix globalNameSpace, allVal = #allVal globalNameSpace, allType = #allType globalNameSpace, allSig = #allSig globalNameSpace, allStruct = #allStruct globalNameSpace, allFunct = #allFunct globalNameSpace }; end; (* local for makeEnv *) val inputFile = OS.Path.joinDirFile{dir= #1 fileTuple, file= #2 fileTuple} val inStream = TextIO.openIn inputFile; val () = let (* scope of exception handler to close inStream *) val endOfStream = ref false; val lineNo = ref 1; fun getChar () : char option = case TextIO.input1 inStream of NONE => (endOfStream := true; NONE) (* End of file *) | eoln as SOME #"\n" => (lineNo := !lineNo + 1; eoln) | c => c in while not (!endOfStream) do let val code = polyCompiler(getChar, [CPNameSpace makeEnv, CPFileName fileName, CPLineNo(fn () => !lineNo)]) in code () handle exn as Fail _ => PolyML.Exception.reraise exn | exn => ( print ("Exception- " ^ exnMessage exn ^ " raised\n"); PolyML.Exception.reraise exn ) end end (* body of scope of inStream *) handle exn => (* close inStream if an error occurs *) ( TextIO.closeIn inStream; PolyML.Exception.reraise exn ) in (* remake normal termination *) TextIO.closeIn inStream end (* remakeCurrentObj *) in (* body of remakeObj *) setStatus (objName, Searching); (* If the file is newer than the object then we definitely must remake it. Otherwise we look at the dependency list and check those. If the result of that check is that one of the dependencies is newer than the object (probably because it has just been recompiled) we have to recompile the file. Compiling a file also checks the dependencies and recompiles them, generating a new dependency list. That is why we don't check the dependency list if the object is out of date with the file. Also if the file has been changed it may no longer depend on the things it used to depend on. *) let val objDate = lastMade objName fun maybeRemake (s:string) : unit = case lookupStatus s of NotProcessed => (* see if it's a file. *) (* Compile the dependency. *) remakeObj(s, kind, newFindDirectory) | Searching => (* In the process of making it *) print ("Circular dependency: " ^ s ^ " depends on itself\n") | Checked => () (* do nothing *) open Time (* Process each entry and return true if any is newer than the target. *) val processChildren = List.foldl (fn (child:string, parentNeedsMake:bool) => ( maybeRemake child; (* Find its date and see if it is newer. *) parentNeedsMake orelse lastMade child > objDate ) ) false; in if objDate < fileTimeStamp fileName orelse ( (* Get the dependency list. There may not be one if this object has not been compiled with "make". *) case getMakeDependencies objName of SOME d => processChildren d | NONE => true (* No dependency list - must use "make" on it. *) ) then remakeCurrentObj () else () end; (* Mark it as having been checked. *) setStatus (objName, Checked) end (* body of remakeObj *) (* If the object is not a file mark it is checked. It may be a pervasive or it may be missing. In either case mark it as checked to save searching for it again. *) handle ObjNotFile => setStatus (objName, Checked) | exn => (* Compilation (or execution) error. *) ( (* Mark as checked to prevent spurious messages. *) setStatus (objName, Checked); raise exn ) in (* body of make *) (* Check that the target exists. *) case filePresent (dirName, NONE, objectName) of NONE => let val dir = if dirName = "" then "" else " (directory "^dirName^")"; val s = "File "^objectName^" not found" ^ dir in print (s ^ "\n"); raise Fail s end | _ => let val targetIsDir = testForDirectory targetName; (* If the target we are making is a directory all the objects must be in the directory. If it is a file we allow references to other objects in the same directory. Objects not found must be pervasive. *) fun findDirectory kind (s: string) : string = if (not targetIsDir orelse s = objectName) andalso isSome(filePresent(dirName, kind, s)) then dirName else raise ObjNotFile; in remakeObj (objectName, NONE, findDirectory) handle exn => ( print (targetName ^ " was not declared\n"); PolyML.Exception.reraise exn ) end end (* make *) in structure PolyML = struct open PolyML (* We must not have a signature on the result otherwise print and makestring will be given polymorphic types and will only produce "?" *) val globalNameSpace = globalNameSpace val use = use and make = make val suffixes = suffixes and getUseFileName = getUseFileName val compiler = polyCompiler val prettyPrintWithIDEMarkup = prettyPrintWithIDEMarkup structure Compiler = struct datatype compilerParameters = datatype compilerParameters val compilerVersion = Bootstrap.compilerVersion val compilerVersionNumber = Bootstrap.compilerVersionNumber val forgetSignature: string -> unit = forgetSig and forgetStructure: string -> unit = forgetStruct and forgetFunctor: string -> unit = forgetFunct and forgetValue: string -> unit = forgetVal and forgetType: string -> unit = forgetType and forgetFixity: string -> unit = forgetFix fun signatureNames (): string list = #1(ListPair.unzip (#allSig globalNameSpace ())) and structureNames (): string list = #1(ListPair.unzip (#allStruct globalNameSpace ())) and functorNames (): string list = #1(ListPair.unzip (#allFunct globalNameSpace ())) and valueNames (): string list = #1(ListPair.unzip (#allVal globalNameSpace ())) and typeNames (): string list = #1(ListPair.unzip (#allType globalNameSpace ())) and fixityNames (): string list = #1(ListPair.unzip (#allFix globalNameSpace ())) val prompt1 = prompt1 and prompt2 = prompt2 and timing = timing and printDepth = printDepth and errorDepth = errorDepth and lineLength = lineLength and allocationProfiling = allocationProfiling val assemblyCode = assemblyCode and codetree = codetree and codetreeAfterOpt = codetreeAfterOpt and pstackTrace = pstackTrace and parsetree = parsetree and reportUnreferencedIds = reportUnreferencedIds and lowlevelOptimise = lowlevelOptimise and reportExhaustiveHandlers = reportExhaustiveHandlers and narrowOverloadFlexRecord = narrowOverloadFlexRecord and createPrintFunctions = createPrintFunctions and reportDiscardFunction = reportDiscardFunction and reportDiscardNonUnit = reportDiscardNonUnit val debug = debug val inlineFunctors = inlineFunctors val maxInlineSize = maxInlineSize val printInAlphabeticalOrder = printInAlphabeticalOrder val traceCompiler = traceCompiler end (* Debugger control. Extend DebuggerInterface set up by INITIALISE. Replaces the original DebuggerInterface. *) structure DebuggerInterface: sig type debugState val debugFunction: debugState -> string val debugFunctionArg: debugState -> PolyML.NameSpace.Values.value val debugFunctionResult: debugState -> PolyML.NameSpace.Values.value val debugLocation: debugState -> PolyML.location val debugNameSpace: debugState -> PolyML.NameSpace.nameSpace val debugLocalNameSpace: debugState -> PolyML.NameSpace.nameSpace val debugState: Thread.Thread.thread -> debugState list val setOnBreakPoint: (PolyML.location * bool ref -> unit) option -> unit val setOnEntry: (string * PolyML.location -> unit) option -> unit val setOnExit: (string * PolyML.location -> unit) option -> unit val setOnExitException: (string * PolyML.location -> exn -> unit) option -> unit end = struct open PolyML.DebuggerInterface fun debugState(t: Thread.Thread.thread): debugState list = let val stack = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word(t, 0w5) and static = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word(t, 0w6) and dynamic = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word(t, 0w7) and locationInfo = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word(t, 0w8) (* Turn the chain of saved entries along with the current top entry into a list. The bottom entry will generally be the state from non-debugging code and needs to be filtered out. *) fun toList r = if RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short r then [] else let val s = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word_immut(r, 0w0) and d = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word_immut(r, 0w1) and l = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word_immut(r, 0w2) and n = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word_immut(r, 0w3) in if RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short s orelse RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short l then toList n else (s, d, l) :: toList n end in if RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short static orelse RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short locationInfo then toList stack else (static, dynamic, locationInfo) :: toList stack end fun searchEnvs match (staticEntry :: statics, dlist as dynamicEntry :: dynamics) = ( case (match (staticEntry, dynamicEntry), staticEntry) of (SOME result, _) => SOME result | (NONE, EnvTypeid _) => searchEnvs match (statics, dynamics) | (NONE, EnvVConstr _) => searchEnvs match (statics, dynamics) | (NONE, EnvValue _) => searchEnvs match (statics, dynamics) | (NONE, EnvException _) => searchEnvs match (statics, dynamics) | (NONE, EnvStructure _) => searchEnvs match (statics, dynamics) | (NONE, EnvStartFunction _) => searchEnvs match (statics, dynamics) | (NONE, EnvEndFunction _) => searchEnvs match (statics, dynamics) (* EnvTConstr doesn't have an entry in the dynamic list *) | (NONE, EnvTConstr _) => searchEnvs match (statics, dlist) ) | searchEnvs _ _ = NONE (* N.B. It is possible to have ([EnvTConstr ...], []) in the arguments so we can't assume that if either the static or dynamic list is nil and the other non-nil it's an error. *) (* Function argument. This should always be present but if it isn't just return unit. That's probably better than an exception here. *) fun debugFunctionArg (state: debugState as (cList, rList, _)) = let val d = (cList, rList) fun match (EnvStartFunction(_, _, ty), valu) = SOME(makeAnonymousValue state (ty, valu)) | match _ = NONE in getOpt(searchEnvs match d, unitValue) end (* Function result - only valid in exit function. *) and debugFunctionResult (state: debugState as (cList, rList, _)) = let val d = (cList, rList) fun match (EnvEndFunction(_, _, ty), valu) = SOME(makeAnonymousValue state(ty, valu)) | match _ = NONE in getOpt(searchEnvs match d, unitValue) end (* debugFunction just looks at the static data. There should always be an EnvStartFunction entry. *) fun debugFunction ((cList, _, _): debugState): string = ( case List.find(fn (EnvStartFunction _) => true | _ => false) cList of SOME(EnvStartFunction(s, _, _)) => s | _ => "?" ) fun debugLocation ((_, _, locn): debugState) = locn fun nameSpace localOnly (state: debugState as (clist, rlist, _)) : nameSpace = let val debugEnviron = (clist, rlist) (* Lookup and "all" functions for the environment. We can't easily use a general function for the lookup because we have dynamic entries for values and structures but not for type constructors. *) fun lookupValues (EnvValue(name, ty, location) :: ntl, valu :: vl) s = if name = s then SOME(makeValue state (name, ty, location, valu)) else lookupValues(ntl, vl) s | lookupValues (EnvException(name, ty, location) :: ntl, valu :: vl) s = if name = s then SOME(makeException state (name, ty, location, valu)) else lookupValues(ntl, vl) s | lookupValues (EnvVConstr(name, ty, nullary, count, location) :: ntl, valu :: vl) s = if name = s then SOME(makeConstructor state (name, ty, nullary, count, location, valu)) else lookupValues(ntl, vl) s | lookupValues (EnvTConstr _ :: ntl, vl) s = lookupValues(ntl, vl) s | lookupValues (EnvStartFunction _ :: ntl, _ :: vl) s = if localOnly then NONE else lookupValues(ntl, vl) s | lookupValues (_ :: ntl, _ :: vl) s = lookupValues(ntl, vl) s | lookupValues _ _ = (* The name we are looking for isn't in the environment. The lists should be the same length. *) NONE fun allValues (EnvValue(name, ty, location) :: ntl, valu :: vl) = (name, makeValue state (name, ty, location, valu)) :: allValues(ntl, vl) | allValues (EnvException(name, ty, location) :: ntl, valu :: vl) = (name, makeException state (name, ty, location, valu)) :: allValues(ntl, vl) | allValues (EnvVConstr(name, ty, nullary, count, location) :: ntl, valu :: vl) = (name, makeConstructor state (name, ty, nullary, count, location, valu)) :: allValues(ntl, vl) | allValues (EnvTConstr _ :: ntl, vl) = allValues(ntl, vl) | allValues (EnvStartFunction _ :: ntl, _ :: vl) = if localOnly then [] else allValues(ntl, vl) | allValues (_ :: ntl, _ :: vl) = allValues(ntl, vl) | allValues _ = [] fun lookupTypes (EnvTConstr (name, tCons) :: ntl, vl) s = if name = s then SOME (makeTypeConstr state tCons) else lookupTypes(ntl, vl) s | lookupTypes (EnvStartFunction _ :: ntl, _ :: vl) s = if localOnly then NONE else lookupTypes(ntl, vl) s | lookupTypes (_ :: ntl, _ :: vl) s = lookupTypes(ntl, vl) s | lookupTypes _ _ = NONE fun allTypes (EnvTConstr(name, tCons) :: ntl, vl) = (name, makeTypeConstr state tCons) :: allTypes(ntl, vl) | allTypes (EnvStartFunction _ :: ntl, _ :: vl) = if localOnly then [] else allTypes(ntl, vl) | allTypes (_ :: ntl, _ :: vl) = allTypes(ntl, vl) | allTypes _ = [] fun lookupStructs (EnvStructure (name, rSig, locations) :: ntl, valu :: vl) s = if name = s then SOME(makeStructure state (name, rSig, locations, valu)) else lookupStructs(ntl, vl) s | lookupStructs (EnvTConstr _ :: ntl, vl) s = lookupStructs(ntl, vl) s | lookupStructs (EnvStartFunction _ :: ntl, _ :: vl) s = if localOnly then NONE else lookupStructs(ntl, vl) s | lookupStructs (_ :: ntl, _ :: vl) s = lookupStructs(ntl, vl) s | lookupStructs _ _ = NONE fun allStructs (EnvStructure (name, rSig, locations) :: ntl, valu :: vl) = (name, makeStructure state (name, rSig, locations, valu)) :: allStructs(ntl, vl) | allStructs (EnvTypeid _ :: ntl, _ :: vl) = allStructs(ntl, vl) | allStructs (EnvStartFunction _ :: ntl, _ :: vl) = if localOnly then [] else allStructs(ntl, vl) | allStructs (_ :: ntl, vl) = allStructs(ntl, vl) | allStructs _ = [] (* We have a full environment here for future expansion but at the moment only some of the entries are used. *) fun noLook _ = NONE and noEnter _ = raise Fail "Cannot update this name space" and allEmpty _ = [] in { lookupVal = lookupValues debugEnviron, lookupType = lookupTypes debugEnviron, lookupFix = noLook, lookupStruct = lookupStructs debugEnviron, lookupSig = noLook, lookupFunct = noLook, enterVal = noEnter, enterType = noEnter, enterFix = noEnter, enterStruct = noEnter, enterSig = noEnter, enterFunct = noEnter, allVal = fn () => allValues debugEnviron, allType = fn () => allTypes debugEnviron, allFix = allEmpty, allStruct = fn () => allStructs debugEnviron, allSig = allEmpty, allFunct = allEmpty } end val debugNameSpace = nameSpace false and debugLocalNameSpace = nameSpace true end local open DebuggerInterface fun debugLocation(d: debugState): string * PolyML.location = (debugFunction d, DebuggerInterface.debugLocation d) fun getStack() = debugState(Thread.Thread.self()) (* These are only relevant when we are stopped at the debugger but we need to use globals here so that the debug functions such as "variables" and "continue" will work. *) val inDebugger = ref false (* Current stack and debug level. *) val currentStack = ref [] fun getCurrentStack() = if !inDebugger then !currentStack else raise Fail "Not stopped in debugger" val debugLevel = ref 0 (* Set to true to exit the debug loop. Set by commands such as "continue". *) val exitLoop = ref false (* Exception packet sent if this was continueWithEx. *) val debugExPacket: exn option ref = ref NONE (* Call tracing. *) val tracing = ref false val breakNext = ref false (* Single stepping. *) val stepDebug = ref false val stepDepth = ref ~1 (* Only break at a stack size less than this. *) (* Break points. We have three breakpoint lists: a list of file-line pairs, a list of function names and a list of exceptions. *) val lineBreakPoints = ref [] and fnBreakPoints = ref [] and exBreakPoints = ref [] fun checkLineBreak (file, line) = let fun findBreak [] = false | findBreak ((f, l) :: rest) = (l = line andalso f = file) orelse findBreak rest in findBreak (! lineBreakPoints) end fun checkFnBreak exact name = let (* When matching a function name we allow match if the name we're looking for matches the last component of the name we have. e.g. if we set a break for "f" we match F().S.f . *) fun matchName n = if name = n then true else if exact then false else let val nameLen = size name and nLen = size n fun isSeparator #"-" = true | isSeparator #")" = true | isSeparator #"." = true | isSeparator _ = false in nameLen > nLen andalso String.substring(name, nameLen - nLen, nLen) = n andalso isSeparator(String.sub(name, nameLen - nLen - 1)) end in List.exists matchName (! fnBreakPoints) end (* Get the exception id from an exception packet. The id is the first word in the packet. It's a mutable so treat it as an int ref here. *) fun getExnId(ex: exn): int ref = RunCall.run_call2 RuntimeCalls.POLY_SYS_load_word (ex, 0) fun checkExnBreak(ex: exn) = let val exnId = getExnId ex in List.exists (fn n => n = exnId) (! exBreakPoints) end fun getArgResult stack get = case stack of hd :: _ => Values.print(get hd, !printDepth) | _ => PrettyString "?" fun printTrace (funName, location, stack, argsAndResult) = let (* This prints a block with the argument and, if we're exiting the result. The function name is decorated with the location. TODO: This works fine so long as the recursion depth is not too deep but once it gets too wide the pretty-printer starts breaking the lines. *) val block = PrettyBlock(0, false, [], [ PrettyBreak(length stack, 0), PrettyBlock(0, false, [], [ PrettyBlock(0, false, [ContextLocation location], [PrettyString funName]), PrettyBreak(1, 3) ] @ argsAndResult) ]) in prettyPrintWithOptionalMarkup (TextIO.print, !lineLength) block end (* Try to print the appropriate line from the file.*) fun printSourceLine(prefix, fileName: string, line: int, funName: string, justLocation) = let open TextIO open PolyML (* Use the pretty printer here because that allows us to provide a link to the function in the markup so the IDE can go straight to it. *) val prettyOut = prettyPrintWithOptionalMarkup (printOut, !lineLength) val lineInfo = concat( [prefix] @ (if fileName = "" then [] else [fileName, " "]) @ (if line = 0 then [] else [" line:", Int.toString line, " "]) @ ["function:", funName]) in (* First just print where we are. *) prettyOut( PrettyBlock(0, true, [ContextLocation{file=fileName,startLine=line, endLine=line,startPosition=0,endPosition=0}], [PrettyString lineInfo])); (* Try to print it. This may fail if the file name was not a full path name and we're not in the correct directory. *) if justLocation orelse fileName = "" then () else let val fd = openIn fileName fun pLine n = case inputLine fd of NONE => () | SOME s => if n = 1 then printOut s else pLine(n-1) in pLine line; closeIn fd end handle IO.Io _ => () (* If it failed simply ignore the error. *) end (* These functions are installed as global callbacks if necessary. *) fun onEntry (funName, location as {file, startLine, ...}: PolyML.location) = ( if ! tracing then let val stack = getStack() val arg = getArgResult stack debugFunctionArg in printTrace(funName, location, stack, [arg]) end else (); (* We don't actually break here because at this stage we don't have any variables declared. *) (* TODO: If for whatever reason we fail to find the breakpoint we need to cancel the pending break in the exit code. Otherwise we could try and break in some other code. *) if checkLineBreak (file, startLine) orelse checkFnBreak false funName then (breakNext := true; setOnBreakPoint(SOME onBreakPoint)) else () ) and onExit (funName, location) = ( if ! tracing then let val stack = getStack() val arg = getArgResult stack debugFunctionArg val res = getArgResult stack debugFunctionResult in printTrace(funName, location, stack, [arg, PrettyBreak(1, 3), PrettyString "=", PrettyBreak(1, 3), res]) end else () ) and onExitException(funName, location) exn = ( if ! tracing then let val stack = getStack() val arg = getArgResult stack debugFunctionArg in printTrace(funName, location, stack, [arg, PrettyBreak(1, 3), PrettyString "=", PrettyBreak(1, 3), PrettyString "raised", PrettyBreak(1, 3), PrettyString(exnName exn)]) end else (); if checkExnBreak exn then enterDebugger () else () ) and onBreakPoint({file, startLine, ...}: PolyML.location, _) = ( if (!stepDebug andalso (!stepDepth < 0 orelse List.length(getStack()) <= !stepDepth)) orelse checkLineBreak (file, startLine) orelse ! breakNext then enterDebugger () else () ) (* Set the callbacks when beginning to run some code. *) and setCallBacks () = ( setOnEntry(if !tracing orelse not(null(! fnBreakPoints)) then SOME onEntry else NONE); setOnExit(if !tracing then SOME onExit else NONE); setOnExitException(if !tracing orelse not(null(! exBreakPoints)) then SOME onExitException else NONE); setOnBreakPoint(if !tracing orelse ! stepDebug orelse not(null(! lineBreakPoints)) then SOME onBreakPoint else NONE) ) (* Clear all callbacks when exiting debuggable code. *) and clearCallBacks () = ( setOnEntry NONE; setOnExit NONE; setOnExitException NONE; setOnBreakPoint NONE; (* Clear all stepping. *) breakNext := false; stepDebug := false; stepDepth := ~1; (* Clear the debugger state *) debugLevel := 0; currentStack := [] ) and enterDebugger () = let (* Clear the onXXX functions to prevent any recursion. *) val () = clearCallBacks () val () = inDebugger := true (* Remove any type-ahead. *) fun flushInput () = case TextIO.canInput(TextIO.stdIn, 1) of SOME 1 => (TextIO.inputN(TextIO.stdIn, 1); flushInput()) | _ => () val () = flushInput () val () = exitLoop := false (* Save the stack on entry. If we execute any code with debugging enabled while we're in the debugger we could change this. *) val () = currentStack := getStack() val () = case !currentStack of hd :: _ => let val (funName, {file, startLine, ...}) = debugLocation hd in printSourceLine("", file, startLine, funName, false) end | [] => () (* Shouldn't happen. *) val compositeNameSpace = (* Compose any debugEnv with the global environment. Create a new temporary environment to contain any bindings made within the shell. They are discarded when we continue from the break-point. Previously, bindings were made in the global environment but that is problematic. It is possible to capture local types in the bindings which could actually be different at the next breakpoint. *) let val fixTab = ProtectedTable.create() and sigTab = ProtectedTable.create() and valTab = ProtectedTable.create() and typTab = ProtectedTable.create() and fncTab = ProtectedTable.create() and strTab = ProtectedTable.create() (* The debugging environment depends on the currently selected stack frame. *) fun debugEnv() = debugNameSpace (List.nth(!currentStack, !debugLevel)) fun dolookup f t s = case ProtectedTable.lookup t s of NONE => (case f (debugEnv()) s of NONE => f globalNameSpace s | v => v) | v => v fun getAll f t () = ProtectedTable.all t () @ f (debugEnv()) () @ f globalNameSpace () in { lookupFix = dolookup #lookupFix fixTab, lookupSig = dolookup #lookupSig sigTab, lookupVal = dolookup #lookupVal valTab, lookupType = dolookup #lookupType typTab, lookupFunct = dolookup #lookupFunct fncTab, lookupStruct = dolookup #lookupStruct strTab, enterFix = ProtectedTable.enter fixTab, enterSig = ProtectedTable.enter sigTab, enterVal = ProtectedTable.enter valTab, enterType = ProtectedTable.enter typTab, enterFunct = ProtectedTable.enter fncTab, enterStruct = ProtectedTable.enter strTab, allFix = getAll #allFix fixTab, allSig = getAll #allSig sigTab, allVal = getAll #allVal valTab, allType = getAll #allType typTab, allFunct = getAll #allFunct fncTab, allStruct = getAll #allStruct strTab } end in topLevel { isDebug = true, nameSpace = compositeNameSpace, exitLoop = fn _ => ! exitLoop, exitOnError = false, isInteractive = true, (* Don't enable debugging for anything run within the debug level. *) startExec = fn () => (), endExec = fn () => () } (* If we type control-C to the debugger we exit it and raise Interrupt within the debuggee without re-enabling any breakpoints. *) handle exn => (inDebugger := false; raise exn); inDebugger := false; setCallBacks(); (* Re-enable debugging. *) (* If this was continueWithEx raise the exception. *) case ! debugExPacket of NONE => () | SOME exn => (debugExPacket := NONE; raise exn) end in (* Normal, non-debugging top-level loop. *) fun shell () = let val argList = CommandLine.arguments() fun switchOption option = List.exists(fn s => s = option) argList (* Generate mark-up in IDE code when printing if the option has been given on the command line. *) val () = useMarkupInOutput := switchOption "--with-markup" val exitOnError = switchOption"--error-exit" val interactive = switchOption "-i" orelse let open TextIO OS open StreamIO TextPrimIO IO val s = getInstream stdIn val (r, v) = getReader s val RD { ioDesc, ...} = r in setInstream(stdIn, mkInstream(r,v)); case ioDesc of SOME io => (kind io = Kind.tty handle SysErr _ => false) | _ => false end in topLevel { isDebug = false, nameSpace = globalNameSpace, exitLoop = fn _ => false, isInteractive = interactive, exitOnError = exitOnError, startExec = setCallBacks, endExec = clearCallBacks } end structure Debug = struct (* Functions that are only relevant when called from the debugger. These check the debugging state using getCurrentStack which raises an exception if we're not in the debugger. *) (* "step" causes the debugger to be entered on the next call. "stepOver" enters the debugger on the next call when the stack is no larger than it is at present. "stepOut" enters the debugger on the next call when the stack is smaller than it is at present. *) fun step () = let val _ = getCurrentStack() in stepDebug := true; stepDepth := ~1; exitLoop := true end and stepOver() = let val stack = getCurrentStack() in stepDebug := true; stepDepth := List.length stack; exitLoop := true end and stepOut() = let val stack = getCurrentStack() in stepDebug := true; stepDepth := List.length stack - 1; exitLoop := true end and continue () = let val _ = getCurrentStack() in stepDebug := false; stepDepth := ~1; exitLoop := true end and continueWithEx exn = let val _ = getCurrentStack() in stepDebug := false; stepDepth := ~1; exitLoop := true; debugExPacket := SOME exn end (* Stack traversal. *) fun up () = let val stack = getCurrentStack() in if !debugLevel < List.length stack -1 then let val _ = debugLevel := !debugLevel + 1; val (funName, {startLine, file, ...}) = debugLocation(List.nth(stack, !debugLevel)) in printSourceLine("", file, startLine, funName, false) end else TextIO.print "Top of stack.\n" end and down () = let val stack = getCurrentStack() in if !debugLevel = 0 then TextIO.print "Bottom of stack.\n" else let val () = debugLevel := !debugLevel - 1; val (funName, {startLine, file, ...}) = debugLocation(List.nth(stack, !debugLevel)) in printSourceLine("", file, startLine, funName, false) end end (* Just print the functions without any other context. *) fun stack () : unit = let fun printTrace(d, n) = let val (funName, {file, startLine, ...}) = debugLocation d (* If this is the current level prefix it with > *) val prefix = if n = !debugLevel then "> " else " " in printSourceLine(prefix, file, startLine, funName, true); n+1 end in ignore (List.foldl printTrace 0 (getCurrentStack())) end local fun printVal v = prettyPrintWithOptionalMarkup(TextIO.print, !lineLength) (NameSpace.Values.printWithType(v, !printDepth, SOME globalNameSpace)) fun printStack (stack: debugState) = List.app (fn (_,v) => printVal v) (#allVal (debugNameSpace stack) ()) in (* Print all variables at the current level. *) fun variables() = printStack (List.nth(getCurrentStack(), !debugLevel)) (* Print all the levels. *) and dump() = let fun printLevel stack = let val (funName, _) = debugLocation stack in TextIO.print(concat["Function ", funName, ":"]); printStack stack; TextIO.print "\n" end in List.app printLevel (getCurrentStack()) end (* Print local variables at the current level. *) and locals() = let val stack = List.nth(getCurrentStack(), !debugLevel) in List.app (fn (_,v) => printVal v) (#allVal (debugLocalNameSpace stack) ()) end end (* Functions to adjust tracing and breakpointing. May be called either within or outside the debugger. *) fun trace b = tracing := b fun breakAt (file, line) = if checkLineBreak(file, line) then () (* Already there. *) else lineBreakPoints := (file, line) :: ! lineBreakPoints fun clearAt (file, line) = let fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak ((f, l) :: rest) = if l = line andalso f = file then rest else (f, l) :: findBreak rest in lineBreakPoints := findBreak (! lineBreakPoints) end fun breakIn name = if checkFnBreak true name then () (* Already there. *) else fnBreakPoints := name :: ! fnBreakPoints fun clearIn name = let fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak (n :: rest) = if name = n then rest else n :: findBreak rest in fnBreakPoints := findBreak (! fnBreakPoints) end fun breakEx exn = if checkExnBreak exn then () (* Already there. *) else exBreakPoints := getExnId exn :: ! exBreakPoints fun clearEx exn = let val exnId = getExnId exn fun findBreak [] = (TextIO.print "No such breakpoint.\n"; []) | findBreak (n :: rest) = if exnId = n then rest else n :: findBreak rest in exBreakPoints := findBreak (! exBreakPoints) end end end structure CodeTree = struct open PolyML.CodeTree (* Add options to the code-generation phase. *) val genCode = fn (code, numLocals) => let open Bootstrap Bootstrap.Universal val compilerOut = prettyPrintWithOptionalMarkup(TextIO.print, !lineLength) in genCode(code, [ tagInject compilerOutputTag compilerOut, tagInject maxInlineSizeTag (! maxInlineSize), tagInject codetreeTag (! codetree), tagInject pstackTraceTag (! pstackTrace), tagInject lowlevelOptimiseTag (! lowlevelOptimise), tagInject assemblyCodeTag (! assemblyCode), tagInject codetreeAfterOptTag (! codetreeAfterOpt) ], numLocals) end end (* Original print_depth etc functions. *) fun timing b = Compiler.timing := b and print_depth i = Compiler.printDepth := i and error_depth i = Compiler.errorDepth := i and line_length i = Compiler.lineLength := i (* Legacy exception_trace. *) structure Exception = struct open Exception local fun printTrace(trace, exn) = let fun pr s = TextIO.output(TextIO.stdOut, s) in (* Exception *) pr "Exception trace for exception - "; pr (General.exnName exn); (* Location if available *) case exceptionLocation exn of SOME { file, startLine=line, ... } => ( if file = "" then () else (pr " raised in "; pr file); if line = 0 then () else (pr " line "; pr(Int.toString line)) ) | NONE => (); pr "\n\n"; (* Function list *) List.app(fn s => (pr s; pr "\n")) trace; pr "End of trace\n\n"; TextIO.flushOut TextIO.stdOut; (* Reraise the exception. *) PolyML.Exception.reraise exn end in fun exception_trace f = traceException(f, printTrace) end end (* Include it in the PolyML structure for backwards compatibility. *) val exception_trace = Exception.exception_trace local val systemProfile : int -> (int * string) list = RunCall.run_call1 RuntimeCalls.POLY_SYS_profiler fun printProfile profRes = let (* Sort in ascending order. *) val sorted = quickSort (fn (a, _) => fn (b, _) => a <= b) profRes fun doPrint (count, name) = let val cPrint = Int.toString count val prefix = CharVector.tabulate(Int.max(0, 10-size cPrint), fn _ => #" ") in TextIO.output(TextIO.stdOut, concat[prefix, cPrint, " ", name, "\n"]) end val total = List.foldl (fn ((c,_),s) => c+s) 0 profRes in List.app doPrint sorted; if total = 0 then () else TextIO.print(concat["Total ", Int.toString total, "\n"]) end in structure Profiling = struct datatype profileMode = ProfileTime (* old mode 1 *) | ProfileAllocations (* old mode 2 *) | ProfileLongIntEmulation (* old mode 3 *) | ProfileTimeThisThread (* old mode 6 *) fun profileStream (stream: (int * string) list -> unit) mode f arg = let (* Control profiling. This may raise Fail if profiling is turned on when it is already on or if there is insufficient memory. *) val code = case mode of ProfileTime => 1 | ProfileAllocations => 2 | ProfileLongIntEmulation => 3 | ProfileTimeThisThread => 6 val _ = systemProfile code (* Discard the result *) val result = f arg handle exn => (stream(systemProfile 0); PolyML.Exception.reraise exn) in stream(systemProfile 0); result end fun profile mode f arg = profileStream printProfile mode f arg (* Live data profiles show the current state. We need to run the GC to produce the counts. *) datatype profileDataMode = ProfileLiveData | ProfileLiveMutableData fun profileDataStream(stream: (int * string) list -> unit) mode = let val code = case mode of ProfileLiveData => 4 | ProfileLiveMutableData => 5 val _ = systemProfile code (* Discard the result *) val () = PolyML.fullGC() in stream(systemProfile 0) end val profileData = profileDataStream printProfile end end (* Saving and loading state. *) structure SaveState = struct local val getOS: int = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (0, 0) fun loadMod (args: string): Universal.universal list = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (32, args) and systemDir(): string = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (34, ()) in fun loadModuleBasic (fileName: string): Universal.universal list = (* If there is a path separator use the name and don't search further. *) if OS.Path.dir fileName <> "" then loadMod fileName else let (* Path elements are separated by semicolons in Windows but colons in Unix. *) val sepInPathList = if getOS = 1 then #";" else #":" val pathList = case OS.Process.getEnv "POLYMODPATH" of NONE => [] | SOME s => String.fields (fn ch => ch = sepInPathList) s fun findFile [] = NONE | findFile (hd::tl) = (* Try actually loading the file. That way we really check we have a module. *) SOME(loadMod (OS.Path.joinDirFile{dir=hd, file=fileName})) handle Fail _ => findFile tl | OS.SysErr _ => findFile tl in case findFile pathList of SOME l => l (* Found *) | NONE => let val sysDir = systemDir() val inSysDir = if sysDir = "" then NONE else findFile[sysDir] in case inSysDir of SOME l => l | NONE => raise Fail("Unable to find module ``" ^ fileName ^ "''") end end end fun saveChild(f: string, depth: int): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (20, (f, depth)) fun saveState f = saveChild (f, 0); fun showHierarchy(): string list = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (22, ()) fun renameParent{ child: string, newParent: string }: unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (23, (child, newParent)) fun showParent(child: string): string option = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (24, child) fun loadState (f: string): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (21, f) and loadHierarchy (s: string list): unit = (* Load hierarchy takes a list of file names in order with the parents before the children. It's easier for the RTS if this is reversed. *) RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (33, List.rev s) (* Module loading and storing. *) structure Tags = struct val structureTag: (string * PolyML.NameSpace.Structures.structureVal) Universal.tag = Universal.tag() val functorTag: (string * PolyML.NameSpace.Functors.functorVal) Universal.tag = Universal.tag() val signatureTag: (string * PolyML.NameSpace.Signatures.signatureVal) Universal.tag = Universal.tag() val valueTag: (string * PolyML.NameSpace.Values.value) Universal.tag = Universal.tag() val typeTag: (string * PolyML.NameSpace.TypeConstrs.typeConstr) Universal.tag = Universal.tag() val fixityTag: (string * PolyML.NameSpace.Infixes.fixity) Universal.tag = Universal.tag() val startupTag: (unit -> unit) Universal.tag = Universal.tag() end val saveModuleBasic: string * Universal.universal list -> unit = fn args => RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (31, args) fun saveModule(s, {structs, functors, sigs, onStartup}) = let fun dolookup (look, tag, kind) s = case look globalNameSpace s of SOME v => Universal.tagInject tag (s, v) | NONE => raise Fail (concat[kind, " ", s, " has not been declared"]) val structVals = map (dolookup(#lookupStruct, Tags.structureTag, "Structure")) structs val functorVals = map (dolookup(#lookupFunct, Tags.functorTag, "Functor")) functors val sigVals = map (dolookup(#lookupSig, Tags.signatureTag, "Signature")) sigs val startVal = case onStartup of SOME f => [Universal.tagInject Tags.startupTag f] | NONE => [] in saveModuleBasic(s, structVals @ functorVals @ sigVals @ startVal) end fun loadModule s = let val ulist = loadModuleBasic s (* Find and run the start-up function. If it raises an exception we don't go further. *) val startFn = List.find (Universal.tagIs Tags.startupTag) ulist val () = case startFn of SOME f => (Universal.tagProject Tags.startupTag f) () | NONE => () fun extract (tag:'a Universal.tag): Universal.universal list -> 'a list = List.mapPartial( fn s => if Universal.tagIs tag s then SOME(Universal.tagProject tag s) else NONE) in (* Add the entries and print them in the same way as top-level bindings. *) printAndEnter(! printInAlphabeticalOrder, globalNameSpace, TextIO.print, !printDepth) { fixes = extract Tags.fixityTag ulist, values = extract Tags.valueTag ulist, structures = extract Tags.structureTag ulist, signatures = extract Tags.signatureTag ulist, functors = extract Tags.functorTag ulist, types = extract Tags.typeTag ulist } end end val loadModule = SaveState.loadModule end end (* PolyML. *); polyml-5.6/basis/Foreign.sml000066400000000000000000006057741265146633400161440ustar00rootroot00000000000000(* Title: Foreign Function Interface: main part Author: David Matthews Copyright David Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature FOREIGN = sig exception Foreign of string structure Memory: sig eqtype volatileRef val volatileRef: SysWord.word -> volatileRef val setVolatileRef: volatileRef * SysWord.word -> unit val getVolatileRef: volatileRef -> SysWord.word eqtype voidStar val voidStar2Sysword: voidStar -> SysWord.word val sysWord2VoidStar: SysWord.word -> voidStar val null: voidStar val ++ : voidStar * word -> voidStar val -- : voidStar * word -> voidStar (* Remember an address except across loads. *) val memoise: ('a -> voidStar) ->'a -> unit -> voidStar exception Memory (* malloc - allocate memory. N.B. argument is the number of bytes. Raises Memory exception if it cannot allocate. *) val malloc: word -> voidStar (* free - free allocated memory. *) val free: voidStar -> unit val get8: voidStar * Word.word -> Word8.word val get16: voidStar * Word.word -> Word.word val get32: voidStar * Word.word -> Word32.word val get64: voidStar * Word.word -> SysWord.word val set8: voidStar * Word.word * Word8.word -> unit val set16: voidStar * Word.word * Word.word -> unit val set32: voidStar * Word.word * Word32.word -> unit val set64: voidStar * Word.word * SysWord.word -> unit val getFloat: voidStar * Word.word -> real val getDouble: voidStar * Word.word -> real val setFloat: voidStar * Word.word * real -> unit val setDouble: voidStar * Word.word * real -> unit val getAddress: voidStar * Word.word -> voidStar val setAddress: voidStar * Word.word * voidStar -> unit end structure System: sig type voidStar = Memory.voidStar val loadLibrary: string -> voidStar and loadExecutable: unit -> voidStar and freeLibrary: voidStar -> unit and getSymbol: voidStar * string -> voidStar end structure LibFFI: sig eqtype abi (* List of ABIs defined in libffi for this platform. *) val abiList: (string * abi) list (* The default Abi. *) val abiDefault: abi (* Type codes. *) val ffiTypeCodeVoid: Word.word and ffiTypeCodeInt: Word.word and ffiTypeCodeFloat: Word.word and ffiTypeCodeDouble: Word.word and ffiTypeCodeUInt8: Word.word and ffiTypeCodeSInt8: Word.word and ffiTypeCodeUInt16: Word.word and ffiTypeCodeSInt16: Word.word and ffiTypeCodeUInt32: Word.word and ffiTypeCodeSInt32: Word.word and ffiTypeCodeUInt64: Word.word and ffiTypeCodeSInt64: Word.word and ffiTypeCodeStruct: Word.word and ffiTypeCodePointer: Word.word (* Predefined types. These are addresses so have to be reloaded in each session. *) eqtype ffiType val ffiType2voidStar: ffiType -> Memory.voidStar val voidStar2ffiType: Memory.voidStar -> ffiType val getFFItypeVoid: unit -> ffiType and getFFItypeUint8: unit -> ffiType and getFFItypeSint8: unit -> ffiType and getFFItypeUint16: unit -> ffiType and getFFItypeSint16: unit -> ffiType and getFFItypeUint32: unit -> ffiType and getFFItypeSint32: unit -> ffiType and getFFItypeUint64: unit -> ffiType and getFFItypeSint64: unit -> ffiType and getFFItypeFloat: unit -> ffiType and getFFItypeDouble: unit -> ffiType and getFFItypePointer: unit -> ffiType and getFFItypeUChar: unit -> ffiType and getFFItypeSChar: unit -> ffiType and getFFItypeUShort: unit -> ffiType and getFFItypeSShort: unit -> ffiType and getFFItypeUint: unit -> ffiType and getFFItypeSint: unit -> ffiType and getFFItypeUlong: unit -> ffiType and getFFItypeSlong: unit -> ffiType val extractFFItype: ffiType -> { size: word, align: word, typeCode: word, elements: ffiType list } val createFFItype: { size: word, align: word, typeCode: word, elements: ffiType list } -> ffiType eqtype cif val cif2voidStar: cif -> Memory.voidStar val voidStar2cif: Memory.voidStar -> cif val createCIF: abi * ffiType * ffiType list -> cif val callFunction: { cif: cif, function: Memory.voidStar, result: Memory.voidStar, arguments: Memory.voidStar } -> unit val createCallback: (Memory.voidStar * Memory.voidStar -> unit) * cif -> Memory.voidStar val freeCallback: Memory.voidStar -> unit end type library type symbol val loadLibrary: string -> library val loadExecutable: unit -> library val getSymbol: library -> string -> symbol val symbolAsAddress: symbol -> Memory.voidStar structure LowLevel: sig type ctype = { size: Word.word, (* Size in bytes *) align: Word.word, (* Alignment *) ffiType: unit -> LibFFI.ffiType } val cTypeVoid: ctype and cTypePointer: ctype and cTypeInt8: ctype and cTypeChar: ctype and cTypeUint8: ctype and cTypeUchar: ctype and cTypeInt16: ctype and cTypeUint16: ctype and cTypeInt32: ctype and cTypeUint32: ctype and cTypeInt64: ctype and cTypeUint64: ctype and cTypeInt: ctype and cTypeUint: ctype and cTypeLong: ctype and cTypeUlong: ctype and cTypeFloat: ctype and cTypeDouble: ctype val cStruct: ctype list -> ctype val callwithAbi: LibFFI.abi -> ctype list -> ctype -> symbol -> Memory.voidStar list * Memory.voidStar -> unit val call: ctype list -> ctype -> symbol -> Memory.voidStar list * Memory.voidStar -> unit val cFunctionWithAbi: LibFFI.abi -> ctype list -> ctype -> (Memory.voidStar * Memory.voidStar -> unit) -> Memory.voidStar val cFunction: ctype list -> ctype -> (Memory.voidStar * Memory.voidStar -> unit) -> Memory.voidStar end type 'a conversion val makeConversion: { load: Memory.voidStar -> 'a, (* Load a value from C memory *) store: Memory.voidStar * 'a -> unit -> unit, (* Store value and return free function. *) ctype: LowLevel.ctype } -> 'a conversion val breakConversion: 'a conversion -> { load: Memory.voidStar -> 'a, (* Load a value from C memory *) store: Memory.voidStar * 'a -> unit -> unit, (* Store value and return free function. *) ctype: LowLevel.ctype } val cVoid: unit conversion val cPointer: Memory.voidStar conversion val cInt8: int conversion val cUint8: int conversion val cChar: char conversion val cUchar: Word8.word conversion val cInt16: int conversion val cUint16: int conversion val cInt32: int conversion val cUint32: int conversion val cInt64: int conversion val cUint64: int conversion val cShort: int conversion val cUshort: int conversion val cInt: int conversion val cUint: int conversion val cLong: int conversion val cUlong: int conversion val cString: string conversion val cByteArray: Word8Vector.vector conversion val cFloat: real conversion val cDouble: real conversion (* When a pointer e.g. a string may be null. *) val cOptionPtr: 'a conversion -> 'a option conversion type 'a closure val cFunction: ('a->'b) closure conversion val buildClosure0withAbi: (unit -> 'a) * LibFFI.abi * unit * 'a conversion -> (unit -> 'a) closure val buildClosure0: (unit -> 'a) * unit * 'a conversion -> (unit -> 'a) closure val buildClosure1withAbi: ('a -> 'b) * LibFFI.abi * 'a conversion * 'b conversion -> ('a -> 'b) closure val buildClosure1: ('a -> 'b) * 'a conversion * 'b conversion -> ('a -> 'b) closure val buildClosure2withAbi: ('a * 'b -> 'c) * LibFFI.abi * ('a conversion * 'b conversion) * 'c conversion -> ('a * 'b -> 'c) closure val buildClosure2: ('a * 'b -> 'c) * ('a conversion * 'b conversion) * 'c conversion -> ('a * 'b -> 'c) closure val buildClosure3withAbi: ('a * 'b *'c -> 'd) * LibFFI.abi * ('a conversion * 'b conversion * 'c conversion) * 'd conversion -> ('a * 'b *'c -> 'd) closure val buildClosure3: ('a * 'b *'c -> 'd) * ('a conversion * 'b conversion * 'c conversion) * 'd conversion -> ('a * 'b *'c -> 'd) closure val buildClosure4withAbi: ('a * 'b * 'c * 'd -> 'e) * LibFFI.abi * ('a conversion * 'b conversion * 'c conversion* 'd conversion) * 'e conversion -> ('a * 'b * 'c * 'd -> 'e) closure val buildClosure4: ('a * 'b * 'c * 'd -> 'e) * ('a conversion * 'b conversion * 'c conversion* 'd conversion) * 'e conversion -> ('a * 'b * 'c * 'd -> 'e) closure val buildClosure5withAbi: ('a * 'b * 'c * 'd * 'e -> 'f) * LibFFI.abi * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion) * 'f conversion -> ('a * 'b * 'c * 'd * 'e -> 'f) closure val buildClosure5: ('a * 'b * 'c * 'd * 'e -> 'f) * ('a conversion * 'b conversion * 'c conversion* 'd conversion * 'e conversion) * 'f conversion -> ('a * 'b * 'c * 'd * 'e -> 'f) closure val buildClosure6withAbi: ('a * 'b * 'c * 'd * 'e * 'f -> 'g) * LibFFI.abi * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion) * 'g conversion -> ('a * 'b * 'c * 'd * 'e * 'f -> 'g) closure val buildClosure6: ('a * 'b * 'c * 'd * 'e * 'f -> 'g) * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion) * 'g conversion -> ('a * 'b * 'c * 'd * 'e * 'f -> 'g) closure (* Remove the "free" from a conversion. Used if extra memory allocated by the argument must not be freed when the function returns. *) val permanent: 'a conversion -> 'a conversion (* Call by reference. *) val cStar: 'a conversion -> 'a ref conversion (* Pass a const pointer *) val cConstStar: 'a conversion -> 'a conversion (* Fixed size vector. It is treated as a struct and passed by value or embedded in a structure. *) val cVectorFixedSize: int * 'a conversion -> 'a vector conversion (* Pass an ML vector as a pointer to a C array. *) and cVectorPointer: 'a conversion -> 'a vector conversion (* Pass an ML array as a pointer to a C array and, on return, update each element of the ML array from the C array. *) and cArrayPointer: 'a conversion -> 'a array conversion (* structs. *) val cStruct2: 'a conversion * 'b conversion -> ('a * 'b) conversion val cStruct3: 'a conversion * 'b conversion * 'c conversion -> ('a*'b*'c)conversion val cStruct4: 'a conversion * 'b conversion * 'c conversion * 'd conversion -> ('a*'b*'c*'d)conversion val cStruct5: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion -> ('a*'b*'c*'d*'e)conversion val cStruct6: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion -> ('a*'b*'c*'d*'e*'f)conversion val cStruct7: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion -> ('a*'b*'c*'d*'e*'f*'g)conversion val cStruct8: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion -> ('a*'b*'c*'d*'e*'f*'g*'h)conversion val cStruct9: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i)conversion val cStruct10: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j)conversion val cStruct11: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k)conversion val cStruct12: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l)conversion val cStruct13: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m)conversion val cStruct14: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n)conversion val cStruct15: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o)conversion val cStruct16: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion * 'p conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p)conversion val cStruct17: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion * 'p conversion * 'q conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q)conversion val cStruct18: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion * 'p conversion * 'q conversion * 'r conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r)conversion val cStruct19: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion * 'p conversion * 'q conversion * 'r conversion * 's conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r*'s)conversion val cStruct20: 'a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion * 'o conversion * 'p conversion * 'q conversion * 'r conversion * 's conversion * 't conversion -> ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r*'s*'t)conversion val buildCall0withAbi: LibFFI.abi * symbol * unit * 'a conversion -> unit -> 'a val buildCall0: symbol * unit * 'a conversion -> unit -> 'a val buildCall1withAbi: LibFFI.abi * symbol * 'a conversion * 'b conversion -> 'a -> 'b val buildCall1: symbol * 'a conversion * 'b conversion -> 'a -> 'b val buildCall2withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion) * 'c conversion -> 'a * 'b -> 'c val buildCall2: symbol * ('a conversion * 'b conversion) * 'c conversion -> 'a * 'b -> 'c val buildCall3withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion) * 'd conversion -> 'a * 'b * 'c -> 'd val buildCall3: symbol * ('a conversion * 'b conversion * 'c conversion) * 'd conversion -> 'a * 'b * 'c -> 'd val buildCall4withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion) * 'e conversion -> 'a * 'b * 'c * 'd -> 'e val buildCall4: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion) * 'e conversion -> 'a * 'b * 'c * 'd -> 'e val buildCall5withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion) * 'f conversion -> 'a * 'b * 'c * 'd * 'e -> 'f val buildCall5: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion) * 'f conversion -> 'a * 'b * 'c * 'd * 'e -> 'f val buildCall6withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion) * 'g conversion -> 'a * 'b * 'c * 'd * 'e * 'f -> 'g val buildCall6: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion) * 'g conversion -> 'a * 'b * 'c * 'd * 'e * 'f -> 'g val buildCall7withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion) * 'h conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g -> 'h val buildCall7: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion) * 'h conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g -> 'h val buildCall8withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion) * 'i conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h -> 'i val buildCall8: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion) * 'i conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h -> 'i val buildCall9withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion) * 'j conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j val buildCall9: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion) * 'j conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j val buildCall10withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion) * 'k conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k val buildCall10: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion) * 'k conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k val buildCall11withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion) * 'l conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l val buildCall11: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion) * 'l conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l val buildCall12withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion) * 'm conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm val buildCall12: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion) * 'm conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm val buildCall13withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion) * 'n conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n val buildCall13: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion) * 'n conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n val buildCall14withAbi: LibFFI.abi * symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion) * 'o conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'o val buildCall14: symbol * ('a conversion * 'b conversion * 'c conversion * 'd conversion * 'e conversion * 'f conversion * 'g conversion * 'h conversion * 'i conversion * 'j conversion * 'k conversion * 'l conversion * 'm conversion * 'n conversion) * 'o conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'o end; structure Foreign:> FOREIGN = struct fun id x = x exception Foreign = RunCall.Foreign open ForeignConstants structure Memory = ForeignMemory infix 6 ++ -- (* Internal utility function. *) fun alignUp(s, align) = Word.andb(s + align-0w1, ~ align) structure System = struct type voidStar = Memory.voidStar fun loadLibrary(s: string): voidStar = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (2, s) and loadExecutable(): voidStar = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (3, ()) and freeLibrary(s: voidStar): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (4, s) and getSymbol(lib: voidStar, s: string): voidStar = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (5, (lib, s)) end structure LibFFI = struct type abi = Word.word val abiList: (string * abi) list = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (50, ()) local fun getConstant (n: int) : Word.word = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (51, n) in val abiDefault = getConstant 0 and ffiTypeCodeVoid = getConstant 1 and ffiTypeCodeInt = getConstant 2 and ffiTypeCodeFloat = getConstant 3 and ffiTypeCodeDouble = getConstant 4 and ffiTypeCodeUInt8 = getConstant 5 and ffiTypeCodeSInt8 = getConstant 6 and ffiTypeCodeUInt16 = getConstant 7 and ffiTypeCodeSInt16 = getConstant 8 and ffiTypeCodeUInt32 = getConstant 9 and ffiTypeCodeSInt32 = getConstant 10 and ffiTypeCodeUInt64 = getConstant 11 and ffiTypeCodeSInt64 = getConstant 12 and ffiTypeCodeStruct = getConstant 13 and ffiTypeCodePointer = getConstant 14 end type ffiType = Memory.voidStar val ffiType2voidStar = id and voidStar2ffiType = id local fun getFFItype (n: int) (): ffiType = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (52, n) in val getFFItypeVoid = getFFItype 0 and getFFItypeUint8 = getFFItype 1 and getFFItypeSint8 = getFFItype 2 and getFFItypeUint16 = getFFItype 3 and getFFItypeSint16 = getFFItype 4 and getFFItypeUint32 = getFFItype 5 and getFFItypeSint32 = getFFItype 6 and getFFItypeUint64 = getFFItype 7 and getFFItypeSint64 = getFFItype 8 and getFFItypeFloat = getFFItype 9 and getFFItypeDouble = getFFItype 10 and getFFItypePointer = getFFItype 11 and getFFItypeUChar = getFFItype 12 and getFFItypeSChar = getFFItype 13 and getFFItypeUShort = getFFItype 14 and getFFItypeSShort = getFFItype 15 and getFFItypeUint = getFFItype 16 and getFFItypeSint = getFFItype 17 and getFFItypeUlong = getFFItype 18 and getFFItypeSlong = getFFItype 19 end fun extractFFItype (s: ffiType) = let val (size: word, align: word, typ: word, elem: Memory.voidStar) = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (53, s) (* Unpack the "elements". *) open Memory fun loadElements i = let val a = getAddress(elem, i) in if a = null then [] else a :: loadElements(i+0w1) end val elements = if elem = sysWord2VoidStar 0w0 then [] else loadElements 0w0 in { size=size, align=align, typeCode = typ, elements = elements } end (* Construct a new FFItype in allocated memory. *) fun createFFItype { size: word, align: word, typeCode: word, elements: ffiType list }: ffiType = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (54, (size, align, typeCode, elements)) type cif = Memory.voidStar val cif2voidStar = id and voidStar2cif = id (* Construct and prepare a CIF in allocated memory. *) fun createCIF (abi: abi, resultType: ffiType, argTypes: ffiType list): cif = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (55, (abi, resultType, argTypes)) (* Call a function. We have to pass some space for the result *) fun callFunction { cif: cif, function: Memory.voidStar, result: Memory.voidStar, arguments: Memory.voidStar }: unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (56, (cif, function, result, arguments)) (* Create a callback. Returns the C function. *) fun createCallback(f: Memory.voidStar * Memory.voidStar -> unit, cif: cif): Memory.voidStar = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (57, (f, cif)) (* Free a callback. This takes the C function address returned by createCallback *) fun freeCallback(cb: Memory.voidStar): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (58, cb) end type library = unit -> Memory.voidStar type symbol = unit -> Memory.voidStar (* Load the library but memoise it so if we reference the library in another session we will reload it. We load the library immediately so that if there is an error we get the error immediately. *) fun loadLibrary (name: string): library = Memory.memoise System.loadLibrary name and loadExecutable (): library = Memory.memoise System.loadExecutable () (* To get a symbol we memoise a function that forces a library load if necessary and then gets the symbol. *) fun getSymbol(lib: library) (name: string): symbol = Memory.memoise (fn s => System.getSymbol(lib(), s)) name (* This forces the symbol to be loaded. The result is NOT memoised. *) fun symbolAsAddress(s: symbol): Memory.voidStar = s() structure LowLevel = struct type ctype = { size: Word.word, (* Size in bytes *) align: Word.word, (* Alignment *) ffiType: unit -> LibFFI.ffiType } local open LibFFI Memory val getffArg = if ffiMinArgSize = 0w4 then Word32.toLargeWord o get32 else if ffiMinArgSize = 0w8 then get64 else raise Foreign ("Unable to load ffi_arg size=" ^ Word.toString ffiMinArgSize) in val cTypeVoid = { size= #size saVoid, align= #align saVoid, ffiType = memoise getFFItypeVoid () } val cTypePointer = { size= #size saPointer, align= #align saPointer, ffiType = memoise getFFItypePointer () } val cTypeInt8 = { size= #size saSint8, align= #align saSint8, ffiType = memoise getFFItypeSint8 () } val cTypeChar = cTypeInt8 val cTypeUint8 = { size= #size saUint8, align= #align saUint8, ffiType = memoise getFFItypeUint8 () } val cTypeUchar = cTypeUint8 val cTypeInt16 = { size= #size saSint16, align= #align saSint16, ffiType = memoise getFFItypeSint16 () } val cTypeUint16 = { size= #size saUint16, align= #align saUint16, ffiType = memoise getFFItypeUint16 () } val cTypeInt32 = { size= #size saSint32, align= #align saSint32, ffiType = memoise getFFItypeSint32 () } val cTypeUint32 = { size= #size saUint32, align= #align saUint32, ffiType = memoise getFFItypeUint32 () } val cTypeInt64 = { size= #size saSint64, align= #align saSint64, ffiType = memoise getFFItypeSint64 () } val cTypeUint64 = { size= #size saUint64, align= #align saUint64, ffiType = memoise getFFItypeUint64 () } val cTypeInt = { size= #size saSint, align= #align saSint, ffiType = memoise getFFItypeSint () } val cTypeUint = { size= #size saUint, align= #align saUint, ffiType = memoise getFFItypeUint () } val cTypeLong = { size= #size saSlong, align= #align saSlong, ffiType = memoise getFFItypeSlong () } val cTypeUlong = { size= #size saUlong, align= #align saUlong, ffiType = memoise getFFItypeUlong () } val cTypeFloat = { size= #size saFloat, align= #align saFloat, ffiType = memoise getFFItypeFloat () } val cTypeDouble = { size= #size saDouble, align= #align saDouble, ffiType = memoise getFFItypeDouble () } fun cStruct(fields: ctype list): ctype = let (* The total alignment is the maximum alignment of the fields. *) val align = foldl(fn ({align, ...}, a) => Word.max(align, a)) 0w1 fields (* Each field needs to be on its alignment. Finally we round up the size to the total alignment. *) val size = alignUp(foldl(fn ({align, size, ...}, s) => alignUp(s, align) + size) 0w0 fields, align) val types = map #ffiType fields (* Make the type but only when it's used. *) fun ffiType () = LibFFI.createFFItype { size = size, align = align, typeCode=LibFFI.ffiTypeCodeStruct, elements = map (fn t => t()) types } in {align=align, size=size, ffiType=memoise ffiType ()} end fun callwithAbi (abi: abi) (argTypes: ctype list) (resType: ctype): symbol -> voidStar list * voidStar -> unit = let (* Preparation when we create the function. *) fun buildCif () = createCIF (abi, #ffiType resType (), map (fn {ffiType, ...} => ffiType ()) argTypes) val cif: unit->cif = memoise buildCif () val nArgs = List.length argTypes val resSize = #size resType (* If the result size is smaller than ffiMinArgSize we have to first store the result in a value of size ffiMinArgSize then copy the result. This is a restriction of libffi. *) fun smallSpace (fnAddr: unit->voidStar) (args, resMem) = let val _ = List.length args = nArgs orelse raise Foreign "Incorrect number of arguments" val resultSize = alignUp(ffiMinArgSize, #align saPointer) val argResVec = malloc(resultSize + #size saPointer * Word.fromInt nArgs) val argLocn = argResVec ++ resultSize val _ = List.foldl(fn (arg, n) => (setAddress(argLocn, n, arg); n+0w1)) 0w0 args in let val () = callFunction { cif=cif(), function=fnAddr(), result = argResVec, arguments = argLocn} val result: SysWord.word = getffArg(argResVec, 0w0) in (* Copy to the final location. Currently "void" has size 1 so if the function has a void result we still copy one byte. *) if #size resType = 0w1 then set8(resMem, 0w0, Word8.fromLargeWord result) else if #size resType = 0w2 then set16(resMem, 0w0, Word.fromLargeWord result) else if #size resType = 0w4 then set32(resMem, 0w0, Word32.fromLargeWord result) else raise Foreign "Unable to set result: wrong size"; free argResVec end handle exn => (free argResVec; raise exn) end (* If we have enough space. *) fun largeSpace (fnAddr: unit->voidStar) (args, resMem) = let val _ = List.length args = nArgs orelse raise Foreign "Incorrect number of arguments" val argVec = if nArgs = 0 then null else malloc(#size saPointer * Word.fromInt nArgs) val _ = List.foldl(fn (arg, n) => (setAddress(argVec, n, arg); n+0w1)) 0w0 args in let val () = callFunction { cif=cif(), function=fnAddr(), result = resMem, arguments = argVec} in free argVec end handle exn => (free argVec; raise exn) end in if resSize < ffiMinArgSize then smallSpace else largeSpace end fun call x = callwithAbi abiDefault x (* Have to make it a fun to avoid value restriction *) (* Build a call-back function. Returns a function to take the actual ML function, create a callback and then return the address. *) fun cFunctionWithAbi (abi: abi) (argTypes: ctype list) (resType: ctype): (voidStar * voidStar -> unit) -> voidStar = let fun buildCif () = createCIF (abi, #ffiType resType (), map (fn {ffiType, ...} => ffiType ()) argTypes) val cif: unit->cif = memoise buildCif () in fn cbFun => createCallback(cbFun, cif()) end fun cFunction x = cFunctionWithAbi abiDefault x end end type 'a conversion = { load: Memory.voidStar -> 'a, (* Load a value from C memory *) store: Memory.voidStar * 'a -> unit -> unit, (* Store a value in C memory *) updateML: Memory.voidStar * 'a -> unit, (* Update ML value after call - only used in cStar. *) updateC: Memory.voidStar * 'a -> unit, (* Update C value after callback - only used in cStar. *) ctype: LowLevel.ctype } fun makeConversion { load, store, ctype } = { load = load, store = store, ctype = ctype, updateML = fn _ => (), updateC = fn _ => () } fun breakConversion({load, store, ctype, ... }: 'a conversion) = { load = load, store = store, ctype = ctype } (* Conversions *) local open LibFFI Memory LowLevel fun checkRange(i, min, max) = if i < min orelse i > max then raise Overflow else i fun noFree _ = () (* None of these allocate extra memory or need to update. *) in val cVoid: unit conversion = makeConversion{ load=fn _ => (), store=fn _ => noFree, ctype = cTypeVoid } (* cPointer should only be used to base other conversions on. *) val cPointer: voidStar conversion = makeConversion { load=fn a => getAddress(a, 0w0), store=fn(a, v) => (setAddress(a, 0w0, v); noFree), ctype = cTypePointer } local fun load(m: voidStar): int = Word8.toIntX(get8(m, 0w0)) fun store(m: voidStar, i: int) = (set8(m, 0w0, Word8.fromInt(checkRange(i, ~128, 127))); noFree) in val cInt8: int conversion = makeConversion { load=load, store=store, ctype = cTypeInt8 } end local (* Char is signed in C but unsigned in ML. *) fun load(m: voidStar): char = Char.chr(Word8.toInt(get8(m, 0w0))) fun store(m: voidStar, i: char) = (set8(m, 0w0, Word8.fromInt(Char.ord i)); noFree) in val cChar: char conversion = makeConversion{ load=load, store=store, ctype = cTypeChar } end local (* Uchar - convert as Word8.word. *) fun load(m: voidStar): Word8.word = get8(m, 0w0) fun store(m: voidStar, i: Word8.word) = (set8(m, 0w0, i); noFree) in val cUchar: Word8.word conversion = makeConversion{ load=load, store=store, ctype = cTypeUchar } end local fun load(m: voidStar): int = Word8.toInt(get8(m, 0w0)) fun store(m: voidStar, i: int) = (set8(m, 0w0, Word8.fromInt(checkRange(i, 0, 255))); noFree) in val cUint8: int conversion = makeConversion{ load=load, store=store, ctype = cTypeUint8 } end local fun load(m: voidStar): int = Word.toIntX(get16(m, 0w0)) fun store(m: voidStar, i: int) = (set16(m, 0w0, Word.fromInt(checkRange(i, ~32768, 32767))); noFree) in val cInt16: int conversion = makeConversion{ load=load, store=store, ctype = cTypeInt16 } end local fun load(m: voidStar): int = Word.toInt(get16(m, 0w0)) fun store(m: voidStar, i: int) = (set16(m, 0w0, Word.fromInt(checkRange(i, 0, 65535))); noFree) in val cUint16: int conversion = makeConversion{ load=load, store=store, ctype = cTypeUint16 } end local fun load(m: voidStar): int = Word32.toIntX(get32(m, 0w0)) fun store(m: voidStar, i: int) = (set32(m, 0w0, Word32.fromInt(checkRange(i, ~2147483648, 2147483647))); noFree) in val cInt32: int conversion = makeConversion{ load=load, store=store, ctype = cTypeInt32 } end local fun load(m: voidStar): int = Word32.toInt(get32(m, 0w0)) fun store(m: voidStar, i: int) = (set32(m, 0w0, Word32.fromInt(checkRange(i, 0, 4294967295))); noFree) in val cUint32: int conversion = makeConversion{ load=load, store=store, ctype = cTypeUint32 } end local fun load(m: voidStar): int = if wordSize = 0w4 then let val v1 = get32(m, 0w0) and v2 = get32(m, 0w1) in if bigEndian then IntInf.<<(Word32.toIntX v1, 0w32) + Word32.toInt v2 else IntInf.<<(Word32.toIntX v2, 0w32) + Word32.toInt v1 end else SysWord.toIntX(get64(m, 0w0)) val max = IntInf.<<(1, 0w63) - 1 and min = ~ (IntInf.<<(1, 0w63)) fun store(m: voidStar, i: int) = if wordSize = 0w4 then let val _ = checkRange(i, min, max) val lo = Word32.fromInt i and hi = Word32.fromInt (IntInf.~>>(i, 0w32)) in if bigEndian then (set32(m, 0w0, hi); set32(m, 0w1, lo)) else (set32(m, 0w0, lo); set32(m, 0w1, hi)); noFree end else (set64(m, 0w0, SysWord.fromInt(checkRange(i, min, max))); noFree) in val cInt64: int conversion = makeConversion{ load=load, store=store, ctype = cTypeInt64 } end local fun load(m: voidStar): int = if wordSize = 0w4 then let val v1 = get32(m, 0w0) and v2 = get32(m, 0w1) in if bigEndian then IntInf.<<(Word32.toInt v1, 0w32) + Word32.toInt v2 else IntInf.<<(Word32.toInt v2, 0w32) + Word32.toInt v1 end else SysWord.toInt(get64(m, 0w0)) val max = IntInf.<<(1, 0w64) - 1 fun store(m: voidStar, i: int) = if wordSize = 0w4 then let val _ = checkRange(i, 0, max) val lo = Word32.fromInt i and hi = Word32.fromInt (IntInf.~>>(i, 0w32)) in if bigEndian then (set32(m, 0w0, hi); set32(m, 0w1, lo)) else (set32(m, 0w0, lo); set32(m, 0w1, hi)); noFree end else (set64(m, 0w0, SysWord.fromInt(checkRange(i, 0, max))); noFree) in val cUint64: int conversion = makeConversion{ load=load, store=store, ctype = cTypeUint64 } end local fun load(m: voidStar): real = getFloat(m, 0w0) fun store(m: voidStar, v: real) = (setFloat(m, 0w0, v); noFree) in val cFloat: real conversion = makeConversion{ load=load, store=store, ctype = cTypeFloat } end local fun load(m: voidStar): real = getDouble(m, 0w0) fun store(m: voidStar, v: real) = (setDouble(m, 0w0, v); noFree) in val cDouble: real conversion = makeConversion{ load=load, store=store, ctype = cTypeDouble } end val cShort = if #size saSShort = #size saSint16 then cInt16 else if #size saSShort = #size saSint32 then cInt32 else raise Foreign "Unable to find type for short" val cUshort = if #size saUShort = #size saUint16 then cUint16 else if #size saUShort = #size saUint32 then cUint32 else raise Foreign "Unable to find type for unsigned" val cInt = if #size saSint = #size saSint16 then cInt16 else if #size saSint = #size saSint32 then cInt32 else if #size saSint = #size saSint64 then cInt64 else raise Foreign "Unable to find type for int" val cUint = if #size saUint = #size saUint16 then cUint16 else if #size saUint = #size saUint32 then cUint32 else if #size saUint = #size saUint64 then cUint64 else raise Foreign "Unable to find type for unsigned" val cLong = if #size saSlong = #size saSint16 then cInt16 else if #size saSlong = #size saSint32 then cInt32 else if #size saSlong = #size saSint64 then cInt64 else raise Foreign "Unable to find type for long" val cUlong = if #size saUlong = #size saUint16 then cUint16 else if #size saUlong = #size saUint32 then cUint32 else if #size saUlong = #size saUint64 then cUint64 else raise Foreign "Unable to find type for unsigned long" local fun load(s: voidStar): string = let (* The location contains the address of the string. *) val sAddr = getAddress(s, 0w0) fun sLen i = if get8(sAddr, i) = 0w0 then i else sLen(i+0w1) val length = sLen 0w0 fun loadChar i = Char.chr(Word8.toInt(get8(sAddr, Word.fromInt i))) in CharVector.tabulate(Word.toInt length, loadChar) end fun store(v: voidStar, s: string) = let val sLen = Word.fromInt(String.size s) val sMem = malloc(sLen + 0w1) val () = CharVector.appi(fn(i, ch) => set8(sMem, Word.fromInt i, Word8.fromInt(Char.ord ch))) s val () = set8(sMem, sLen, 0w0) in setAddress(v, 0w0, sMem); fn () => Memory.free sMem end in val cString: string conversion = makeConversion { load=load, store=store, ctype = cTypePointer } end (* This is used if we want to pass NULL rather than a pointer in some cases. *) fun cOptionPtr({load, store, updateML, updateC, ctype}:'a conversion): 'a option conversion = if #typeCode(extractFFItype(#ffiType ctype ())) <> ffiTypeCodePointer then raise Foreign "cOptionPtr must be applied to a pointer type" else let fun loadOpt(s: voidStar) = if getAddress(s, 0w0) = null then NONE else SOME(load s) fun storeOpt(v: voidStar, NONE) = (setAddress(v, 0w0, null); fn _ => ()) | storeOpt(v: voidStar, SOME s) = store(v, s) (* Do we have update here? *) fun updateMLOpt(_, NONE) = () | updateMLOpt(v: voidStar, SOME s) = updateML(v, s) fun updateCOpt(_, NONE) = () | updateCOpt(v, SOME s) = updateC(v, s) in { load=loadOpt, store=storeOpt, updateML = updateMLOpt, updateC = updateCOpt, ctype = cTypePointer } end local (* Word8Vector.vector to C array of bytes. It is only possible to do this one way because conversion from a C array requires us to know the size. *) fun load _ = raise Foreign "cByteArray cannot convert from C to ML" fun store(v: voidStar, s: Word8Vector.vector) = let open Word8Vector val sLen = Word.fromInt(length s) val sMem = malloc sLen val () = appi(fn(i, b) => set8(sMem, Word.fromInt i, b)) s in setAddress(v, 0w0, sMem); fn () => Memory.free sMem end in val cByteArray: Word8Vector.vector conversion = makeConversion{ load=load, store=store, ctype = cTypePointer } end end (* Remove the free part from the store fn. This is intended for situations where an argument should not be deleted once the function completes. *) fun permanent({load, store, ctype, updateML, updateC }: 'a conversion): 'a conversion = let fun storeP args = (ignore (store args); fn () => ()) in { load=load, store=storeP, updateML = updateML, updateC = updateC, ctype=ctype } end val op ++ = Memory.++ fun cStruct2(a: 'a conversion, b: 'b conversion): ('a*'b)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ... }} = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {align=alignb, ... }} = b val offsetb = alignUp(sizea, alignb) fun load s = (loada s, loadb(s ++ offsetb)) and store (x, (a, b)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) in fn () => ( freea(); freeb() ) end and updateML(s, (a, b)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b)) and updateC(x, (a, b)) = (updateCa(x, a); updateCb(x ++ offsetb, b)) in {load=load, store=store, updateML = updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb]} end fun cStruct3(a: 'a conversion, b: 'b conversion, c: 'c conversion): ('a*'b*'c)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {align=alignc, ...} } = c val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc)) and store (x, (a, b, c)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) in fn () => ( freea(); freeb(); freec() ) end and updateML(s, (a, b, c)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c)) and updateC(x, (a, b, c)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec]} end fun cStruct4(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion): ('a*'b*'c*'d)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {align=alignd, ...} } = d val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd)) and store (x, (a, b, c, d)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) in fn () => ( freea(); freeb(); freec(); freed() ) end and updateML(s, (a, b, c, d)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d)) and updateC(x, (a, b, c, d)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped]} end fun cStruct5(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion): ('a*'b*'c*'d*'e)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {align=aligne, ...} } = e val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete)) and store (x, (a, b, c, d, e)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) in fn () => ( freea(); freeb(); freec(); freed(); freee() ) end and updateML(s, (a, b, c, d, e)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d); updateMLe(s ++ offsete, e)) and updateC(x, (a, b, c, d, e)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee]} end fun cStruct6(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion): ('a*'b*'c*'d*'e*'f)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {align=alignf, ...} } = f val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf)) and store (x, (a, b, c, d, e, f)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef() ) end and updateML(s, (a, b, c, d, e, f)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d); updateMLe(s ++ offsete, e); updateMLf(s ++ offsetf, f)) and updateC(x, (a, b, c, d, e, f)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef]} end fun cStruct7(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion): ('a*'b*'c*'d*'e*'f*'g)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {align=aligng, ...} } = g val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg)) and store (x, (a, b, c, d, e, f, g)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg() ) end and updateML(s, (a, b, c, d, e, f, g)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d); updateMLe(s ++ offsete, e); updateMLf(s ++ offsetf, f); updateMLg(s ++ offsetg, g)) and updateC(x, (a, b, c, d, e, f, g)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg]} end fun cStruct8(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion): ('a*'b*'c*'d*'e*'f*'g*'h)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {align=alignh, ...} } = h val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth)) and store (x, (a, b, c, d, e, f, g, h)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh() ) end and updateML(s, (a, b, c, d, e, f, g, h)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d); updateMLe(s ++ offsete, e); updateMLf(s ++ offsetf, f); updateMLg(s ++ offsetg, g); updateMLh(s ++ offseth, h)) and updateC(x, (a, b, c, d, e, f, g, h)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh]} end fun cStruct9(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {align=aligni, ...} } = i val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti)) and store (x, (a, b, c, d, e, f, g, h, i)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei() ) end and updateML(s, (a, b, c, d, e, f, g, h, i)) = (updateMLa(s, a); updateMLb(s ++ offsetb, b); updateMLc(s ++ offsetc, c); updateMLd(s ++ offsetd, d); updateMLe(s ++ offsete, e); updateMLf(s ++ offsetf, f); updateMLg(s ++ offsetg, g); updateMLh(s ++ offseth, h); updateMLi(s ++ offseti, i)) and updateC(x, (a, b, c, d, e, f, g, h, i)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei]} end fun cStruct10(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {align=alignj, ...} } = j val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj)) and store (x, (a, b, c, d, e, f, g, h, i, j)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j)) and updateC(x, (a, b, c, d, e, f, g, h, i, j)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej]} end fun cStruct11(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {align=alignk, ...} } = k val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk)) and store (x, (a, b, c, d, e, f, g, h, i, j, k)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek]} end fun cStruct12(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {align=alignl, ...} } = l val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel]} end fun cStruct13(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {align=alignm, ...} } = m val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem]} end nonfix o fun cStruct14(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {align=alignn, ...} } = n val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen]} end fun cStruct15(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {align=aligno, ...} } = o val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo]} end fun cStruct16(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion, p: 'p conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {size=sizeo, align=aligno, ...} } = o and {load=loadp, store=storep, updateML=updateMLp, updateC=updateCp, ctype = ctypep as {align=alignp, ...} } = p val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) val offsetp = alignUp(offseto + sizeo, alignp) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto), loadp(s ++ offsetp)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) and freep = storep(x ++ offsetp, p) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo(); freep() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o); updateMLp(x ++ offsetp, p)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o); updateCp(x ++ offsetp, p)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo, ctypep]} end fun cStruct17(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion, p: 'p conversion, q: 'q conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {size=sizeo, align=aligno, ...} } = o and {load=loadp, store=storep, updateML=updateMLp, updateC=updateCp, ctype = ctypep as {size=sizep, align=alignp, ...} } = p and {load=loadq, store=storeq, updateML=updateMLq, updateC=updateCq, ctype = ctypeq as {align=alignq, ...} } = q val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) val offsetp = alignUp(offseto + sizeo, alignp) val offsetq = alignUp(offsetp + sizep, alignq) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto), loadp(s ++ offsetp), loadq(s ++ offsetq)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) and freep = storep(x ++ offsetp, p) and freeq = storeq(x ++ offsetq, q) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo(); freep(); freeq() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o); updateMLp(x ++ offsetp, p); updateMLq(x ++ offsetq, q)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o); updateCp(x ++ offsetp, p); updateCq(x ++ offsetq, q)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo, ctypep, ctypeq]} end fun cStruct18(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion, p: 'p conversion, q: 'q conversion, r: 'r conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {size=sizeo, align=aligno, ...} } = o and {load=loadp, store=storep, updateML=updateMLp, updateC=updateCp, ctype = ctypep as {size=sizep, align=alignp, ...} } = p and {load=loadq, store=storeq, updateML=updateMLq, updateC=updateCq, ctype = ctypeq as {size=sizeq, align=alignq, ...} } = q and {load=loadr, store=storer, updateML=updateMLr, updateC=updateCr, ctype = ctyper as {align=alignr, ...} } = r val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) val offsetp = alignUp(offseto + sizeo, alignp) val offsetq = alignUp(offsetp + sizep, alignq) val offsetr = alignUp(offsetq + sizeq, alignr) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto), loadp(s ++ offsetp), loadq(s ++ offsetq), loadr(s ++ offsetr)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) and freep = storep(x ++ offsetp, p) and freeq = storeq(x ++ offsetq, q) and freer = storer(x ++ offsetr, r) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo(); freep(); freeq(); freer() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o); updateMLp(x ++ offsetp, p); updateMLq(x ++ offsetq, q); updateMLr(x ++ offsetr, r)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o); updateCp(x ++ offsetp, p); updateCq(x ++ offsetq, q); updateCr(x ++ offsetr, r)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo, ctypep, ctypeq, ctyper]} end fun cStruct19(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion, p: 'p conversion, q: 'q conversion, r: 'r conversion, s: 's conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r*'s)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {size=sizeo, align=aligno, ...} } = o and {load=loadp, store=storep, updateML=updateMLp, updateC=updateCp, ctype = ctypep as {size=sizep, align=alignp, ...} } = p and {load=loadq, store=storeq, updateML=updateMLq, updateC=updateCq, ctype = ctypeq as {size=sizeq, align=alignq, ...} } = q and {load=loadr, store=storer, updateML=updateMLr, updateC=updateCr, ctype = ctyper as {size=sizer, align=alignr, ...} } = r and {load=loads, store=stores, updateML=updateMLs, updateC=updateCs, ctype = ctypes as {align=aligns, ...} } = s val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) val offsetp = alignUp(offseto + sizeo, alignp) val offsetq = alignUp(offsetp + sizep, alignq) val offsetr = alignUp(offsetq + sizeq, alignr) val offsets = alignUp(offsetr + sizer, aligns) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto), loadp(s ++ offsetp), loadq(s ++ offsetq), loadr(s ++ offsetr), loads(s ++ offsets)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) and freep = storep(x ++ offsetp, p) and freeq = storeq(x ++ offsetq, q) and freer = storer(x ++ offsetr, r) and frees = stores(x ++ offsets, s) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo(); freep(); freeq(); freer(); frees() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o); updateMLp(x ++ offsetp, p); updateMLq(x ++ offsetq, q); updateMLr(x ++ offsetr, r); updateMLs(x ++ offsets, s)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o); updateCp(x ++ offsetp, p); updateCq(x ++ offsetq, q); updateCr(x ++ offsetr, r); updateCs(x ++ offsets, s)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo, ctypep, ctypeq, ctyper, ctypes]} end fun cStruct20(a: 'a conversion, b: 'b conversion, c: 'c conversion, d: 'd conversion, e: 'e conversion, f: 'f conversion, g: 'g conversion, h: 'h conversion, i: 'i conversion, j: 'j conversion, k: 'k conversion, l: 'l conversion, m: 'm conversion, n: 'n conversion, o: 'o conversion, p: 'p conversion, q: 'q conversion, r: 'r conversion, s: 's conversion, t: 't conversion): ('a*'b*'c*'d*'e*'f*'g*'h*'i*'j*'k*'l*'m*'n*'o*'p*'q*'r*'s*'t)conversion = let val {load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype = ctypea as {size=sizea, ...} } = a and {load=loadb, store=storeb, updateML=updateMLb, updateC=updateCb, ctype = ctypeb as {size=sizeb, align=alignb, ...} } = b and {load=loadc, store=storec, updateML=updateMLc, updateC=updateCc, ctype = ctypec as {size=sizec, align=alignc, ...} } = c and {load=loadd, store=stored, updateML=updateMLd, updateC=updateCd, ctype = ctyped as {size=sized, align=alignd, ...} } = d and {load=loade, store=storee, updateML=updateMLe, updateC=updateCe, ctype = ctypee as {size=sizee, align=aligne, ...} } = e and {load=loadf, store=storef, updateML=updateMLf, updateC=updateCf, ctype = ctypef as {size=sizef, align=alignf, ...} } = f and {load=loadg, store=storeg, updateML=updateMLg, updateC=updateCg, ctype = ctypeg as {size=sizeg, align=aligng, ...} } = g and {load=loadh, store=storeh, updateML=updateMLh, updateC=updateCh, ctype = ctypeh as {size=sizeh, align=alignh, ...} } = h and {load=loadi, store=storei, updateML=updateMLi, updateC=updateCi, ctype = ctypei as {size=sizei, align=aligni, ...} } = i and {load=loadj, store=storej, updateML=updateMLj, updateC=updateCj, ctype = ctypej as {size=sizej, align=alignj, ...} } = j and {load=loadk, store=storek, updateML=updateMLk, updateC=updateCk, ctype = ctypek as {size=sizek, align=alignk, ...} } = k and {load=loadl, store=storel, updateML=updateMLl, updateC=updateCl, ctype = ctypel as {size=sizel, align=alignl, ...} } = l and {load=loadm, store=storem, updateML=updateMLm, updateC=updateCm, ctype = ctypem as {size=sizem, align=alignm, ...} } = m and {load=loadn, store=storen, updateML=updateMLn, updateC=updateCn, ctype = ctypen as {size=sizen, align=alignn, ...} } = n and {load=loado, store=storeo, updateML=updateMLo, updateC=updateCo, ctype = ctypeo as {size=sizeo, align=aligno, ...} } = o and {load=loadp, store=storep, updateML=updateMLp, updateC=updateCp, ctype = ctypep as {size=sizep, align=alignp, ...} } = p and {load=loadq, store=storeq, updateML=updateMLq, updateC=updateCq, ctype = ctypeq as {size=sizeq, align=alignq, ...} } = q and {load=loadr, store=storer, updateML=updateMLr, updateC=updateCr, ctype = ctyper as {size=sizer, align=alignr, ...} } = r and {load=loads, store=stores, updateML=updateMLs, updateC=updateCs, ctype = ctypes as {size=sizes, align=aligns, ...} } = s and {load=loadt, store=storet, updateML=updateMLt, updateC=updateCt, ctype = ctypet as {align=alignt, ...} } = t val offsetb = alignUp(sizea, alignb) val offsetc = alignUp(offsetb + sizeb, alignc) val offsetd = alignUp(offsetc + sizec, alignd) val offsete = alignUp(offsetd + sized, aligne) val offsetf = alignUp(offsete + sizee, alignf) val offsetg = alignUp(offsetf + sizef, aligng) val offseth = alignUp(offsetg + sizeg, alignh) val offseti = alignUp(offseth + sizeh, aligni) val offsetj = alignUp(offseti + sizei, alignj) val offsetk = alignUp(offsetj + sizej, alignk) val offsetl = alignUp(offsetk + sizek, alignl) val offsetm = alignUp(offsetl + sizel, alignm) val offsetn = alignUp(offsetm + sizem, alignn) val offseto = alignUp(offsetn + sizen, aligno) val offsetp = alignUp(offseto + sizeo, alignp) val offsetq = alignUp(offsetp + sizep, alignq) val offsetr = alignUp(offsetq + sizeq, alignr) val offsets = alignUp(offsetr + sizer, aligns) val offsett = alignUp(offsets + sizes, alignt) fun load s = (loada s, loadb(s ++ offsetb), loadc(s ++ offsetc), loadd(s ++ offsetd), loade(s ++ offsete), loadf(s ++ offsetf), loadg(s ++ offsetg), loadh(s ++ offseth), loadi(s ++ offseti), loadj(s ++ offsetj), loadk(s ++ offsetk), loadl(s ++ offsetl), loadm(s ++ offsetm), loadn(s ++ offsetn), loado(s ++ offseto), loadp(s ++ offsetp), loadq(s ++ offsetq), loadr(s ++ offsetr), loads(s ++ offsets), loadt(s ++ offsett)) and store (x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) = let val freea = storea(x, a) and freeb = storeb(x ++ offsetb, b) and freec = storec(x ++ offsetc, c) and freed = stored(x ++ offsetd, d) and freee = storee(x ++ offsete, e) and freef = storef(x ++ offsetf, f) and freeg = storeg(x ++ offsetg, g) and freeh = storeh(x ++ offseth, h) and freei = storei(x ++ offseti, i) and freej = storej(x ++ offsetj, j) and freek = storek(x ++ offsetk, k) and freel = storel(x ++ offsetl, l) and freem = storem(x ++ offsetm, m) and freen = storen(x ++ offsetn, n) and freeo = storeo(x ++ offseto, o) and freep = storep(x ++ offsetp, p) and freeq = storeq(x ++ offsetq, q) and freer = storer(x ++ offsetr, r) and frees = stores(x ++ offsets, s) and freet = storet(x ++ offsett, t) in fn () => ( freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); freeo(); freep(); freeq(); freer(); frees(); freet() ) end and updateML(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) = (updateMLa(x, a); updateMLb(x ++ offsetb, b); updateMLc(x ++ offsetc, c); updateMLd(x ++ offsetd, d); updateMLe(x ++ offsete, e); updateMLf(x ++ offsetf, f); updateMLg(x ++ offsetg, g); updateMLh(x ++ offseth, h); updateMLi(x ++ offseti, i); updateMLj(x ++ offsetj, j); updateMLk(x ++ offsetk, k); updateMLl(x ++ offsetl, l); updateMLm(x ++ offsetm, m); updateMLn(x ++ offsetn, n); updateMLo(x ++ offseto, o); updateMLp(x ++ offsetp, p); updateMLq(x ++ offsetq, q); updateMLr(x ++ offsetr, r); updateMLs(x ++ offsets, s); updateMLt(x ++ offsett, t)) and updateC(x, (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) = (updateCa(x, a); updateCb(x ++ offsetb, b); updateCc(x ++ offsetc, c); updateCd(x ++ offsetd, d); updateCe(x ++ offsete, e); updateCf(x ++ offsetf, f); updateCg(x ++ offsetg, g); updateCh(x ++ offseth, h); updateCi(x ++ offseti, i); updateCj(x ++ offsetj, j); updateCk(x ++ offsetk, k); updateCl(x ++ offsetl, l); updateCm(x ++ offsetm, m); updateCn(x ++ offsetn, n); updateCo(x ++ offseto, o); updateCp(x ++ offsetp, p); updateCq(x ++ offsetq, q); updateCr(x ++ offsetr, r); updateCs(x ++ offsets, s); updateCt(x ++ offsett, t)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = LowLevel.cStruct[ctypea, ctypeb, ctypec, ctyped, ctypee, ctypef, ctypeg, ctypeh, ctypei, ctypej, ctypek, ctypel, ctypem, ctypen, ctypeo, ctypep, ctypeq, ctyper, ctypes, ctypet]} end (* Conversion for call-by-reference. *) local open Memory LowLevel in fun cStar({load=loada, store=storea, ctype=ctypea, ...}: 'a conversion): 'a ref conversion = let fun store(m, ref s) = let (* When we pass a ref X into a cStar cX function we need to allocate a memory cell big enough for a cX value. Then we copy the current value of the ML into this. We set the argument, a pointer, to the address of the cell. *) val mem = malloc(#size ctypea) val () = setAddress(m, 0w0, mem) val freea = storea(mem, s) in fn () => (free mem; freea()) end (* Called to update the ML value when the C . *) fun updateML(m, s) = s := loada(getAddress(m, 0w0)) (* Used when an ML callback receives a cStar argument. *) fun load s = ref(loada(getAddress(s, 0w0))) (* Used when a callback has returned to update the C value. If storea allocates then there's nothing we can do. *) fun updateC(m, ref s) = ignore(storea(getAddress(m, 0w0), s)) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = cTypePointer} end (* Similar to cStar but without the need to update the result. *) fun cConstStar({load=loada, store=storea, updateML=updateMLa, updateC=updateCa, ctype=ctypea}: 'a conversion): 'a conversion = let fun load s = loada(getAddress(s, 0w0)) fun store(m, s) = let val mem = malloc(#size ctypea) val () = setAddress(m, 0w0, mem) val freea = storea(mem, s) in fn () => (free mem; freea()) end (* Do we have to do anything here? Could we pass a const pointer to a structure with variable fields? *) fun updateML(m, s) = updateMLa(getAddress(m, 0w0), s) and updateC(m, s) = updateCa(getAddress(m, 0w0), s) in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = cTypePointer} end (* Fixed size vector. It is treated as a struct and passed by value or embedded in a structure. *) fun cVectorFixedSize(n, {load=loadEl, store=storeEl, updateML=updateMLel, updateC=updateCel, ctype={size=sizeEl, align=alignEl, ffiType=ffiTypeEl}, ...}: 'a conversion) : 'a vector conversion = let val arraySize = sizeEl * Word.fromInt n fun ffiTypeArray () = LibFFI.createFFItype { size = arraySize, align = alignEl, typeCode=LibFFI.ffiTypeCodeStruct, elements = List.tabulate (n, fn _ => ffiTypeEl()) } val arrayType = { size = arraySize, align = alignEl, ffiType = ffiTypeArray } fun load(v: voidStar): 'a vector = Vector.tabulate(n, fn i => loadEl(v ++ Word.fromInt i)) fun store(v: voidStar, s: 'a vector) = let val sLen = Vector.length s val _ = sLen <= n orelse raise Foreign "vector too long" (* Store the values. Make a list of the free fns in case they allocate *) val frees = Vector.foldli(fn(i, el, l) => storeEl(v ++ Word.fromInt i, el) :: l) [] s; in fn () => List.app (fn f => f()) frees end (* If we have a ref in here we need to update *) fun updateML(v, s) = Vector.appi(fn (i, el) => updateMLel(v ++ Word.fromInt i, el)) s and updateC(v, s) = Vector.appi(fn (i, el) => updateCel(v ++ Word.fromInt i, el)) s in { load = load, store = store, updateML=updateML, updateC=updateC, ctype = arrayType } end (* Pass an ML vector as a pointer to a C array. *) fun cVectorPointer ({store=storeEl, updateML=updateMLel, ctype={size=sizeEl, ...}, ...}: 'a conversion) : 'a vector conversion = let (* We can't determine the size so can't construct a suitable ML value. *) fun load _ = raise Foreign "Cannot return a cVectorPointer from C to ML" fun store(m, s) = let val mem = malloc(sizeEl * Word.fromInt(Vector.length s)) val () = setAddress(m, 0w0, mem) (* Store the values. Make a list of the free fns in case they allocate *) val frees = Vector.foldli(fn(i, el, l) => storeEl(mem ++ (sizeEl * Word.fromInt i), el) :: l) [] s; in fn () => (List.app (fn f => f()) frees; free mem) end (* This is only appropriate if the elements are refs. *) fun updateML(v, s) = let val addr = getAddress(v, 0w0) in Vector.appi(fn (i, el) => updateMLel(addr ++ (sizeEl * Word.fromInt i), el)) s end (* updateC can't actually be used because we can't load a suitable value *) and updateC _ = raise Foreign "Cannot return a cVectorPointer from C to ML" in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = cTypePointer} end (* Pass an ML array as a pointer to a C array and, on return, update each element of the ML array from the C array. *) fun cArrayPointer ({load=loadEl, store=storeEl, ctype={size=sizeEl, ...}, ...}: 'a conversion) : 'a array conversion = let (* We can't determine the size so can't construct a suitable ML value. *) fun load _ = raise Foreign "Cannot return a cArrayPointer from C to ML" fun store(m, s) = let val mem = malloc(sizeEl * Word.fromInt(Array.length s)) val () = setAddress(m, 0w0, mem) (* Store the values. Make a list of the free fns in case they allocate *) val frees = Array.foldli(fn(i, el, l) => storeEl(mem ++ (sizeEl * Word.fromInt i), el) :: l) [] s; in fn () => (List.app (fn f => f()) frees; free mem) end (* updateML is used after a C function returns. It needs to update each element. *) fun updateML(v, s) = let val addr = getAddress(v, 0w0) in Array.modifyi(fn (i, _) => loadEl(addr ++ (sizeEl * Word.fromInt i))) s end (* updateC can't actually be used because we can't load a suitable value *) and updateC _ = raise Foreign "Cannot return a cArrayPointer from C to ML" in {load=load, store=store, updateML=updateML, updateC=updateC, ctype = cTypePointer} end end (* Calls with conversion. *) (* Note: it may be possible to have general functions to compute offsets but we don't do that because this way the compiler can compute the offsets as constants during inline expansion. *) local open LibFFI Memory LowLevel in fun buildCall0withAbi(abi: abi, fnAddr, (), {ctype = resType, load= resLoad, ...} : 'a conversion): unit->'a = let val callF = callwithAbi abi [] resType fnAddr in fn () => let val rMem = malloc(#size resType) in let val () = callF([], rMem) val result = resLoad rMem in free rMem; result end handle exn => (free rMem; raise exn) end end fun buildCall0(symbol, argTypes, resType) = buildCall0withAbi (abiDefault, symbol, argTypes, resType) fun buildCall1withAbi (abi: abi, fnAddr, { ctype = argType, store = argStore, updateML = argUpdate, ...}: 'a conversion, { ctype = resType, load= resLoad, ...}: 'b conversion): 'a ->'b = let val callF = callwithAbi abi [argType] resType fnAddr in fn x => let (* Allocate space for argument(s) and result. We can't use cStruct here because we only store the argument before the call and load the result after. *) val argOffset = alignUp(#size resType, #align argType) val rMem = malloc(argOffset + #size argType) val argAddr = rMem ++ argOffset val freea = argStore (argAddr, x) fun freeAll () = (freea(); free rMem) in let val () = callF([argAddr], rMem) val result = resLoad rMem in argUpdate (argAddr, x); freeAll (); result end handle exn => (freeAll (); raise exn) end end fun buildCall1(symbol, argTypes, resType) = buildCall1withAbi (abiDefault, symbol, argTypes, resType) fun buildCall2withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion), { ctype = resType, load= resLoad, ...}: 'c conversion): 'a * 'b -> 'c = let val callF = callwithAbi abi [arg1Type, arg2Type] resType fnAddr in fn (a, b) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val rMem = malloc(arg2Offset + #size arg2Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) fun freeAll() = (freea(); freeb(); free rMem) in let val () = callF([arg1Addr, arg2Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall2(symbol, argTypes, resType) = buildCall2withAbi (abiDefault, symbol, argTypes, resType) fun buildCall3withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion), { ctype = resType, load= resLoad, ...}: 'd conversion): 'a * 'b *'c -> 'd = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type] resType fnAddr in fn (a, b, c) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val rMem = malloc(arg3Offset + #size arg3Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) fun freeAll() = (freea(); freeb(); freec(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall3(symbol, argTypes, resType) = buildCall3withAbi (abiDefault, symbol, argTypes, resType) fun buildCall4withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion), { ctype = resType, load= resLoad, ...}: 'e conversion): 'a * 'b *'c * 'd -> 'e = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type] resType fnAddr in fn (a, b, c, d) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val rMem = malloc(arg4Offset + #size arg4Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) fun freeAll() = (freea(); freeb(); freec(); freed(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall4(symbol, argTypes, resType) = buildCall4withAbi (abiDefault, symbol, argTypes, resType) fun buildCall5withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion), { ctype = resType, load= resLoad, ...}: 'f conversion): 'a * 'b *'c * 'd * 'e -> 'f = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type] resType fnAddr in fn (a, b, c, d, e) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val rMem = malloc(arg5Offset + #size arg5Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall5(symbol, argTypes, resType) = buildCall5withAbi (abiDefault, symbol, argTypes, resType) fun buildCall6withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion), { ctype = resType, load= resLoad, ...}: 'g conversion): 'a * 'b *'c * 'd * 'e * 'f -> 'g = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type] resType fnAddr in fn (a, b, c, d, e, f) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val rMem = malloc(arg6Offset + #size arg6Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr , arg6Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall6(symbol, argTypes, resType) = buildCall6withAbi (abiDefault, symbol, argTypes, resType) fun buildCall7withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion), { ctype = resType, load= resLoad, ...}: 'h conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g -> 'h = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type] resType fnAddr in fn (a, b, c, d, e, f, g) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val rMem = malloc(arg7Offset + #size arg7Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall7(symbol, argTypes, resType) = buildCall7withAbi (abiDefault, symbol, argTypes, resType) fun buildCall8withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion), { ctype = resType, load= resLoad, ...}: 'i conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h -> 'i = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type] resType fnAddr in fn (a, b, c, d, e, f, g, h) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val rMem = malloc(arg8Offset + #size arg8Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall8(symbol, argTypes, resType) = buildCall8withAbi (abiDefault, symbol, argTypes, resType) fun buildCall9withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion), { ctype = resType, load= resLoad, ...}: 'j conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val rMem = malloc(arg9Offset + #size arg9Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall9(symbol, argTypes, resType) = buildCall9withAbi (abiDefault, symbol, argTypes, resType) fun buildCall10withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion, { ctype = arg10Type, store = arg10Store, updateML = arg10Update, ...}: 'j conversion), { ctype = resType, load= resLoad, ...}: 'k conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type, arg10Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i, j) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val arg10Offset = alignUp(arg9Offset + #size arg9Type, #align arg10Type) val rMem = malloc(arg10Offset + #size arg10Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val arg10Addr = rMem ++ arg10Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) val freej = arg10Store (arg10Addr, j) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr, arg10Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); arg10Update (arg10Addr, j); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall10(symbol, argTypes, resType) = buildCall10withAbi (abiDefault, symbol, argTypes, resType) fun buildCall11withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion, { ctype = arg10Type, store = arg10Store, updateML = arg10Update, ...}: 'j conversion, { ctype = arg11Type, store = arg11Store, updateML = arg11Update, ...}: 'k conversion), { ctype = resType, load= resLoad, ...}: 'l conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type, arg10Type, arg11Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i, j, k) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val arg10Offset = alignUp(arg9Offset + #size arg9Type, #align arg10Type) val arg11Offset = alignUp(arg10Offset + #size arg10Type, #align arg11Type) val rMem = malloc(arg11Offset + #size arg11Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val arg10Addr = rMem ++ arg10Offset val arg11Addr = rMem ++ arg11Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) val freej = arg10Store (arg10Addr, j) val freek = arg11Store (arg11Addr, k) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr, arg10Addr, arg11Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); arg10Update (arg10Addr, j); arg11Update (arg11Addr, k); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall11(symbol, argTypes, resType) = buildCall11withAbi (abiDefault, symbol, argTypes, resType) fun buildCall12withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion, { ctype = arg10Type, store = arg10Store, updateML = arg10Update, ...}: 'j conversion, { ctype = arg11Type, store = arg11Store, updateML = arg11Update, ...}: 'k conversion, { ctype = arg12Type, store = arg12Store, updateML = arg12Update, ...}: 'l conversion), { ctype = resType, load= resLoad, ...}: 'm conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type, arg10Type, arg11Type, arg12Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i, j, k, l) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val arg10Offset = alignUp(arg9Offset + #size arg9Type, #align arg10Type) val arg11Offset = alignUp(arg10Offset + #size arg10Type, #align arg11Type) val arg12Offset = alignUp(arg11Offset + #size arg11Type, #align arg12Type) val rMem = malloc(arg12Offset + #size arg12Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val arg10Addr = rMem ++ arg10Offset val arg11Addr = rMem ++ arg11Offset val arg12Addr = rMem ++ arg12Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) val freej = arg10Store (arg10Addr, j) val freek = arg11Store (arg11Addr, k) val freel = arg12Store (arg12Addr, l) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr, arg10Addr, arg11Addr, arg12Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); arg10Update (arg10Addr, j); arg11Update (arg11Addr, k); arg12Update (arg12Addr, l); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall12(symbol, argTypes, resType) = buildCall12withAbi (abiDefault, symbol, argTypes, resType) fun buildCall13withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion, { ctype = arg10Type, store = arg10Store, updateML = arg10Update, ...}: 'j conversion, { ctype = arg11Type, store = arg11Store, updateML = arg11Update, ...}: 'k conversion, { ctype = arg12Type, store = arg12Store, updateML = arg12Update, ...}: 'l conversion, { ctype = arg13Type, store = arg13Store, updateML = arg13Update, ...}: 'm conversion), { ctype = resType, load= resLoad, ...}: 'n conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type, arg10Type, arg11Type, arg12Type, arg13Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i, j, k, l, m) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val arg10Offset = alignUp(arg9Offset + #size arg9Type, #align arg10Type) val arg11Offset = alignUp(arg10Offset + #size arg10Type, #align arg11Type) val arg12Offset = alignUp(arg11Offset + #size arg11Type, #align arg12Type) val arg13Offset = alignUp(arg12Offset + #size arg12Type, #align arg13Type) val rMem = malloc(arg13Offset + #size arg13Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val arg10Addr = rMem ++ arg10Offset val arg11Addr = rMem ++ arg11Offset val arg12Addr = rMem ++ arg12Offset val arg13Addr = rMem ++ arg13Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) val freej = arg10Store (arg10Addr, j) val freek = arg11Store (arg11Addr, k) val freel = arg12Store (arg12Addr, l) val freem = arg13Store (arg13Addr, m) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr, arg10Addr, arg11Addr, arg12Addr, arg13Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); arg10Update (arg10Addr, j); arg11Update (arg11Addr, k); arg12Update (arg12Addr, l); arg13Update (arg13Addr, m); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall13(symbol, argTypes, resType) = buildCall13withAbi (abiDefault, symbol, argTypes, resType) fun buildCall14withAbi (abi: abi, fnAddr, ({ ctype = arg1Type, store = arg1Store, updateML = arg1Update, ...}: 'a conversion, { ctype = arg2Type, store = arg2Store, updateML = arg2Update, ...}: 'b conversion, { ctype = arg3Type, store = arg3Store, updateML = arg3Update, ...}: 'c conversion, { ctype = arg4Type, store = arg4Store, updateML = arg4Update, ...}: 'd conversion, { ctype = arg5Type, store = arg5Store, updateML = arg5Update, ...}: 'e conversion, { ctype = arg6Type, store = arg6Store, updateML = arg6Update, ...}: 'f conversion, { ctype = arg7Type, store = arg7Store, updateML = arg7Update, ...}: 'g conversion, { ctype = arg8Type, store = arg8Store, updateML = arg8Update, ...}: 'h conversion, { ctype = arg9Type, store = arg9Store, updateML = arg9Update, ...}: 'i conversion, { ctype = arg10Type, store = arg10Store, updateML = arg10Update, ...}: 'j conversion, { ctype = arg11Type, store = arg11Store, updateML = arg11Update, ...}: 'k conversion, { ctype = arg12Type, store = arg12Store, updateML = arg12Update, ...}: 'l conversion, { ctype = arg13Type, store = arg13Store, updateML = arg13Update, ...}: 'm conversion, { ctype = arg14Type, store = arg14Store, updateML = arg14Update, ...}: 'n conversion), { ctype = resType, load= resLoad, ...}: 'o conversion): 'a * 'b *'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'o = let val callF = callwithAbi abi [arg1Type, arg2Type, arg3Type, arg4Type, arg5Type, arg6Type, arg7Type, arg8Type, arg9Type, arg10Type, arg11Type, arg12Type, arg13Type, arg14Type] resType fnAddr in fn (a, b, c, d, e, f, g, h, i, j, k, l, m, n) => let val arg1Offset = alignUp(#size resType, #align arg1Type) val arg2Offset = alignUp(arg1Offset + #size arg1Type, #align arg2Type) val arg3Offset = alignUp(arg2Offset + #size arg2Type, #align arg3Type) val arg4Offset = alignUp(arg3Offset + #size arg3Type, #align arg4Type) val arg5Offset = alignUp(arg4Offset + #size arg4Type, #align arg5Type) val arg6Offset = alignUp(arg5Offset + #size arg5Type, #align arg6Type) val arg7Offset = alignUp(arg6Offset + #size arg6Type, #align arg7Type) val arg8Offset = alignUp(arg7Offset + #size arg7Type, #align arg8Type) val arg9Offset = alignUp(arg8Offset + #size arg8Type, #align arg9Type) val arg10Offset = alignUp(arg9Offset + #size arg9Type, #align arg10Type) val arg11Offset = alignUp(arg10Offset + #size arg10Type, #align arg11Type) val arg12Offset = alignUp(arg11Offset + #size arg11Type, #align arg12Type) val arg13Offset = alignUp(arg12Offset + #size arg12Type, #align arg13Type) val arg14Offset = alignUp(arg13Offset + #size arg13Type, #align arg14Type) val rMem = malloc(arg14Offset + #size arg14Type) val arg1Addr = rMem ++ arg1Offset val arg2Addr = rMem ++ arg2Offset val arg3Addr = rMem ++ arg3Offset val arg4Addr = rMem ++ arg4Offset val arg5Addr = rMem ++ arg5Offset val arg6Addr = rMem ++ arg6Offset val arg7Addr = rMem ++ arg7Offset val arg8Addr = rMem ++ arg8Offset val arg9Addr = rMem ++ arg9Offset val arg10Addr = rMem ++ arg10Offset val arg11Addr = rMem ++ arg11Offset val arg12Addr = rMem ++ arg12Offset val arg13Addr = rMem ++ arg13Offset val arg14Addr = rMem ++ arg14Offset val freea = arg1Store (arg1Addr, a) val freeb = arg2Store (arg2Addr, b) val freec = arg3Store (arg3Addr, c) val freed = arg4Store (arg4Addr, d) val freee = arg5Store (arg5Addr, e) val freef = arg6Store (arg6Addr, f) val freeg = arg7Store (arg7Addr, g) val freeh = arg8Store (arg8Addr, h) val freei = arg9Store (arg9Addr, i) val freej = arg10Store (arg10Addr, j) val freek = arg11Store (arg11Addr, k) val freel = arg12Store (arg12Addr, l) val freem = arg13Store (arg13Addr, m) val freen = arg14Store (arg14Addr, n) fun freeAll() = (freea(); freeb(); freec(); freed(); freee(); freef(); freeg(); freeh(); freei(); freej(); freek(); freel(); freem(); freen(); free rMem) in let val () = callF([arg1Addr, arg2Addr, arg3Addr, arg4Addr, arg5Addr, arg6Addr, arg7Addr, arg8Addr, arg9Addr, arg10Addr, arg11Addr, arg12Addr, arg13Addr, arg14Addr], rMem) val result = resLoad rMem in arg1Update(arg1Addr, a); arg2Update (arg2Addr, b); arg3Update (arg3Addr, c); arg4Update (arg4Addr, d); arg5Update (arg5Addr, e); arg6Update (arg6Addr, f); arg7Update (arg7Addr, g); arg8Update (arg8Addr, h); arg9Update (arg9Addr, i); arg10Update (arg10Addr, j); arg11Update (arg11Addr, k); arg12Update (arg12Addr, l); arg13Update (arg13Addr, m); arg14Update (arg14Addr, n); freeAll(); result end handle exn => (freeAll(); raise exn) end end fun buildCall14(symbol, argTypes, resType) = buildCall14withAbi (abiDefault, symbol, argTypes, resType) end (* A closure is a memoised address. *) type 'a closure = unit -> Memory.voidStar local open Memory LowLevel fun load _ = raise Foreign "Cannot return a closure" (* "dememoise" the value when we store it. This means that the closure is actually created when the value is first stored and then it is cached. *) and store(v, cl: ('a->'b) closure) = (Memory.setAddress(v, 0w0, cl()); fn () => ()) in val cFunction: ('a->'b) closure conversion = makeConversion { load=load, store=store, ctype = LowLevel.cTypePointer } end local open LibFFI Memory LowLevel in fun buildClosure0withAbi(f: unit-> 'a, abi: abi, (), resConv: 'a conversion): (unit->'a) closure = let fun callback (f: unit -> 'a) (_: voidStar, res: voidStar): unit = ignore(#store resConv (res, f ())) (* Ignore the result of #store resConv. What this means is if the callback returns something, e.g. a string, that requires dynamic allocation there will be a memory leak. *) val makeCallback = cFunctionWithAbi abi [] (#ctype resConv) in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure0(f, argConv, resConv) = buildClosure0withAbi(f, abiDefault, argConv, resConv) fun buildClosure1withAbi (f: 'a -> 'b, abi: abi, argConv: 'a conversion, resConv: 'b conversion) : ('a -> 'b) closure = let fun callback (f: 'a -> 'b) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) val arg1 = #load argConv arg1Addr val result = f arg1 val () = #updateC argConv (arg1Addr, arg1) in ignore(#store resConv (res, result)) end val makeCallback = cFunctionWithAbi abi [#ctype argConv] (#ctype resConv) in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure1(f, argConv, resConv) = buildClosure1withAbi(f, abiDefault, argConv, resConv) fun buildClosure2withAbi (f: 'a * 'b -> 'c, abi: abi, (arg1Conv: 'a conversion, arg2Conv: 'b conversion), resConv: 'c conversion) : ('a * 'b -> 'c) closure = let fun callback (f: 'a *'b -> 'c) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) and arg2Addr = getAddress(args, 0w1) val arg1 = #load arg1Conv arg1Addr and arg2 = #load arg2Conv arg2Addr val result = f (arg1, arg2) val () = #updateC arg1Conv(arg1Addr, arg1) and () = #updateC arg2Conv(arg2Addr, arg2) in ignore(#store resConv (res, result)) end val argTypes = [#ctype arg1Conv, #ctype arg2Conv] and resType = #ctype resConv val makeCallback = cFunctionWithAbi abi argTypes resType in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure2(f, argConv, resConv) = buildClosure2withAbi(f, abiDefault, argConv, resConv) fun buildClosure3withAbi (f, abi, (arg1Conv: 'a conversion, arg2Conv: 'b conversion, arg3Conv: 'c conversion), resConv: 'd conversion) = let fun callback (f: 'a *'b * 'c -> 'd) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) and arg2Addr = getAddress(args, 0w1) and arg3Addr = getAddress(args, 0w2) val arg1 = #load arg1Conv arg1Addr and arg2 = #load arg2Conv arg2Addr and arg3 = #load arg3Conv arg3Addr val result = f (arg1, arg2, arg3) val () = #updateC arg1Conv(arg1Addr, arg1) and () = #updateC arg2Conv(arg2Addr, arg2) and () = #updateC arg3Conv(arg3Addr, arg3) in ignore(#store resConv (res, result)) end val argTypes = [#ctype arg1Conv, #ctype arg2Conv, #ctype arg3Conv] and resType = #ctype resConv val makeCallback = cFunctionWithAbi abi argTypes resType in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure3(f, argConv, resConv) = buildClosure3withAbi(f, abiDefault, argConv, resConv) fun buildClosure4withAbi (f, abi, (arg1Conv: 'a conversion, arg2Conv: 'b conversion, arg3Conv: 'c conversion, arg4Conv: 'd conversion), resConv: 'e conversion) = let fun callback (f: 'a *'b * 'c * 'd -> 'e) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) and arg2Addr = getAddress(args, 0w1) and arg3Addr = getAddress(args, 0w2) and arg4Addr = getAddress(args, 0w3) val arg1 = #load arg1Conv arg1Addr and arg2 = #load arg2Conv arg2Addr and arg3 = #load arg3Conv arg3Addr and arg4 = #load arg4Conv arg4Addr val result = f (arg1, arg2, arg3, arg4) val () = #updateC arg1Conv(arg1Addr, arg1) and () = #updateC arg2Conv(arg2Addr, arg2) and () = #updateC arg3Conv(arg3Addr, arg3) and () = #updateC arg4Conv(arg4Addr, arg4) in ignore(#store resConv (res, result)) end val argTypes = [#ctype arg1Conv, #ctype arg2Conv, #ctype arg3Conv, #ctype arg4Conv] and resType = #ctype resConv val makeCallback = cFunctionWithAbi abi argTypes resType in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure4(f, argConv, resConv) = buildClosure4withAbi(f, abiDefault, argConv, resConv) fun buildClosure5withAbi (f, abi, (arg1Conv: 'a conversion, arg2Conv: 'b conversion, arg3Conv: 'c conversion, arg4Conv: 'd conversion, arg5Conv: 'e conversion), resConv: 'f conversion) = let fun callback (f: 'a *'b * 'c * 'd * 'e -> 'f) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) and arg2Addr = getAddress(args, 0w1) and arg3Addr = getAddress(args, 0w2) and arg4Addr = getAddress(args, 0w3) and arg5Addr = getAddress(args, 0w4) val arg1 = #load arg1Conv arg1Addr and arg2 = #load arg2Conv arg2Addr and arg3 = #load arg3Conv arg3Addr and arg4 = #load arg4Conv arg4Addr and arg5 = #load arg5Conv arg5Addr val result = f (arg1, arg2, arg3, arg4, arg5) val () = #updateC arg1Conv(arg1Addr, arg1) and () = #updateC arg2Conv(arg2Addr, arg2) and () = #updateC arg3Conv(arg3Addr, arg3) and () = #updateC arg4Conv(arg4Addr, arg4) and () = #updateC arg5Conv(arg5Addr, arg5) in ignore(#store resConv (res, result)) end val argTypes = [#ctype arg1Conv, #ctype arg2Conv, #ctype arg3Conv, #ctype arg4Conv, #ctype arg5Conv] and resType = #ctype resConv val makeCallback = cFunctionWithAbi abi argTypes resType in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure5(f, argConv, resConv) = buildClosure5withAbi(f, abiDefault, argConv, resConv) fun buildClosure6withAbi (f, abi, (arg1Conv: 'a conversion, arg2Conv: 'b conversion, arg3Conv: 'c conversion, arg4Conv: 'd conversion, arg5Conv: 'e conversion, arg6Conv: 'f conversion), resConv: 'g conversion) = let fun callback (f: 'a *'b * 'c * 'd * 'e * 'f -> 'g) (args: voidStar, res: voidStar): unit = let val arg1Addr = getAddress(args, 0w0) and arg2Addr = getAddress(args, 0w1) and arg3Addr = getAddress(args, 0w2) and arg4Addr = getAddress(args, 0w3) and arg5Addr = getAddress(args, 0w4) and arg6Addr = getAddress(args, 0w5) val arg1 = #load arg1Conv arg1Addr and arg2 = #load arg2Conv arg2Addr and arg3 = #load arg3Conv arg3Addr and arg4 = #load arg4Conv arg4Addr and arg5 = #load arg5Conv arg5Addr and arg6 = #load arg6Conv arg6Addr val result = f (arg1, arg2, arg3, arg4, arg5, arg6) val () = #updateC arg1Conv(arg1Addr, arg1) and () = #updateC arg2Conv(arg2Addr, arg2) and () = #updateC arg3Conv(arg3Addr, arg3) and () = #updateC arg4Conv(arg4Addr, arg4) and () = #updateC arg5Conv(arg5Addr, arg5) and () = #updateC arg6Conv(arg6Addr, arg6) in ignore(#store resConv (res, result)) end val argTypes = [#ctype arg1Conv, #ctype arg2Conv, #ctype arg3Conv, #ctype arg4Conv, #ctype arg5Conv, #ctype arg6Conv] and resType = #ctype resConv val makeCallback = cFunctionWithAbi abi argTypes resType in Memory.memoise (fn () => makeCallback(callback f)) () end fun buildClosure6(f, argConv, resConv) = buildClosure6withAbi(f, abiDefault, argConv, resConv) end end; polyml-5.6/basis/ForeignConstants.sml000066400000000000000000000047561265146633400200320ustar00rootroot00000000000000(* Title: Foreign Function Interface: constants Author: David Matthews Copyright David Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is defined separately so that the values are computed and available as constants for the Foreign structure. *) structure ForeignConstants = struct local fun getSizeAndAlign (n: int) = let val ffiType = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (52, n) val (size: word, align: word, _, _) = (* Just get the first two fields. *) RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (53, ffiType) in {size=size, align=align} end in val saVoid = getSizeAndAlign 0 and saUint8 = getSizeAndAlign 1 and saSint8 = getSizeAndAlign 2 and saUint16 = getSizeAndAlign 3 and saSint16 = getSizeAndAlign 4 and saUint32 = getSizeAndAlign 5 and saSint32 = getSizeAndAlign 6 and saUint64 = getSizeAndAlign 7 and saSint64 = getSizeAndAlign 8 and saFloat = getSizeAndAlign 9 and saDouble = getSizeAndAlign 10 and saPointer = getSizeAndAlign 11 and saUChar = getSizeAndAlign 12 and saSChar = getSizeAndAlign 13 and saUShort = getSizeAndAlign 14 and saSShort = getSizeAndAlign 15 and saUint = getSizeAndAlign 16 and saSint = getSizeAndAlign 17 and saUlong = getSizeAndAlign 18 and saSlong = getSizeAndAlign 19 end val bigEndian : bool = RunCall.run_call0 RuntimeCalls.POLY_SYS_is_big_endian () val wordSize : word = RunCall.run_call0 RuntimeCalls.POLY_SYS_bytes_per_word () (* Minimum argument size. *) val ffiMinArgSize: Word.word = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (51, 15) end; polyml-5.6/basis/ForeignMemory.sml000066400000000000000000000260421265146633400173160ustar00rootroot00000000000000(* Title: Foreign Function Interface: memory operations Author: David Matthews Copyright David Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ForeignMemory :> sig eqtype volatileRef val volatileRef: SysWord.word -> volatileRef val setVolatileRef: volatileRef * SysWord.word -> unit val getVolatileRef: volatileRef -> SysWord.word eqtype voidStar val voidStar2Sysword: voidStar -> SysWord.word val sysWord2VoidStar: SysWord.word -> voidStar val null: voidStar val ++ : voidStar * word -> voidStar val -- : voidStar * word -> voidStar (* Remember an address except across loads. *) val memoise: ('a -> voidStar) ->'a -> unit -> voidStar exception Memory (* malloc - allocate memory. N.B. argument is the number of bytes. Raises Memory exception if it cannot allocate. *) val malloc: word -> voidStar (* free - free allocated memory. *) val free: voidStar -> unit val get8: voidStar * Word.word -> Word8.word val get16: voidStar * Word.word -> Word.word val get32: voidStar * Word.word -> Word32.word val get64: voidStar * Word.word -> SysWord.word val set8: voidStar * Word.word * Word8.word -> unit val set16: voidStar * Word.word * Word.word -> unit val set32: voidStar * Word.word * Word32.word -> unit val set64: voidStar * Word.word * SysWord.word -> unit val getFloat: voidStar * Word.word -> real val getDouble: voidStar * Word.word -> real val setFloat: voidStar * Word.word * real -> unit val setDouble: voidStar * Word.word * real -> unit val getAddress: voidStar * Word.word -> voidStar val setAddress: voidStar * Word.word * voidStar -> unit end = struct open ForeignConstants exception Foreign = RunCall.Foreign fun id x = x (* Internal utility function. *) fun alignUp(s, align) = Word.andb(s + align-0w1, ~ align) (* Both volatileRef and SysWord.word are the ADDRESSes of the actual value. *) type volatileRef = word ref val memMove: SysWord.word * word * SysWord.word * word* word -> unit = RunCall.run_call5 RuntimeCalls.POLY_SYS_move_bytes fun volatileRef init = let (* Allocate a single word marked as mutable, weak, no-overwrite, byte. *) (* A weak byte cell is cleared to zero when it is read in either from the executable or from a saved state. Using the no-overwrite bit ensures that if it is contained in the executable it won't be changed by loading a saved state but there's a problem if it is contained in a parent state. Then loading a child state will clear it because we reload all the parents when we load a child. *) val v = RunCall.run_call3 RuntimeCalls.POLY_SYS_alloc_store(0w1, 0wx69, 0w0) (* Copy the SysWord into it. *) val () = memMove(init, 0w0, RunCall.unsafeCast v, 0w0, wordSize) in v end fun setVolatileRef(v, i) = memMove(i, 0w0, RunCall.unsafeCast v, 0w0, wordSize) fun getVolatileRef var = let (* Allocate a single word marked as mutable, byte. *) val v = RunCall.run_call3 RuntimeCalls.POLY_SYS_alloc_store(0w1, 0wx41, 0w0) val () = memMove(RunCall.unsafeCast var, 0w0, v, 0w0, wordSize) val () = RunCall.run_call1 RuntimeCalls.POLY_SYS_lockseg v in v end type voidStar = SysWord.word val voidStar2Sysword = id and sysWord2VoidStar = id (* Exported conversions *) val null: voidStar = 0w0 infix 6 ++ -- fun s ++ w = s + SysWord.fromLarge(Word.toLarge w) and s -- w = s - SysWord.fromLarge(Word.toLarge w) fun 'a memoise(f: 'a -> voidStar) (a: 'a) : unit -> voidStar = let (* Initialise to zero. That means the function won't be executed until we actually want the result. *) val v = volatileRef 0w0 in (* If we've reloaded the volatile ref it will have been reset to zero. We need to execute the function and set it. *) fn () => (case getVolatileRef v of 0w0 => let val r = f a in setVolatileRef(v, r); r end | r => r) end exception Memory fun get8 (s: voidStar, i: Word.word): Word8.word = RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_8 (s, 0w0, i) and get16(s: voidStar, i: Word.word): Word.word = RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_16 (s, 0w0, i) and get32(s: voidStar, i: Word.word): Word32.word = RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_32 (s, 0w0, i) and get64(s: voidStar, i: Word.word): SysWord.word = if wordSize = 0w4 then raise Foreign "64-bit operations not available" else RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_64 (s, 0w0, i) and getFloat(s: voidStar, i: Word.word): real = RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_float (s, 0w0, i) and getDouble(s: voidStar, i: Word.word): real = RunCall.run_call3 RuntimeCalls.POLY_SYS_cmem_load_double (s, 0w0, i) fun set8 (s: voidStar, i: Word.word, v: Word8.word): unit = RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_8 (s, 0w0, i, v) and set16 (s: voidStar, i: Word.word, v: Word.word): unit = RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_16 (s, 0w0, i, v) and set32 (s: voidStar, i: Word.word, v: Word32.word): unit = RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_32 (s, 0w0, i, v) and set64 (s: voidStar, i: Word.word, v: SysWord.word): unit = if wordSize = 0w4 then raise Foreign "64-bit operations not available" else RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_64 (s, 0w0, i, v) and setFloat (s: voidStar, i: Word.word, v: real): unit = RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_float (s, 0w0, i, v) and setDouble (s: voidStar, i: Word.word, v: real): unit = RunCall.run_call4 RuntimeCalls.POLY_SYS_cmem_store_double (s, 0w0, i, v) (* Get and set addresses. This is a bit messy because it has to compile on 64-bits as well as 32-bits. *) val getAddress: voidStar * Word.word -> voidStar = if wordSize = 0w4 then Word32.toLargeWord o get32 else get64 val setAddress: voidStar * Word.word * voidStar -> unit = if wordSize = 0w4 then fn (s, i, v) => set32(s, i, Word32.fromLargeWord v) else set64 local fun systemMalloc (s: word): voidStar = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (0, s) (*fun systemFree (s: voidStar): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_ffi (1, s)*) (* Simple malloc/free implementation to reduce the number of RTS calls needed. *) val lock = Thread.Mutex.mutex() (* It would be possible to chain the free list in the C memory itself. For the moment we don't do that. The free list is the list of chunks ordered by increasing address. That allows us to merge adjacent free blocks. *) val freeList: {address: SysWord.word, size: word} list ref = LibrarySupport.noOverwriteRef nil (* Clear it once on entry. *) val () = PolyML.onEntry (fn _ => freeList := nil) (* Assume that if we align to the maximum of these we're all right. *) val maxAlign = Word.max(#align saDouble, Word.max(#align saPointer, #align saSint64)) (* We need a length word in each object we allocate but we need enough padding to align the result. *) val overhead = alignUp(wordSize, maxAlign) val chunkSize = 0w4096 (* Configure this. *) fun addFree(entry, []) = [entry] | addFree(entry, this :: rest) = if #address entry < #address this then ( if #address entry ++ #size entry = #address this then (* New entry is immediately before old one - merge. *) {address= #address entry, size = #size entry + #size this } :: rest else entry :: this :: rest ) else if #address this ++ #size this = #address entry then (* New entry is immediately after this - merge. Continue because it could also merge with an entry after this as well. *) addFree({address= #address this, size= #size entry + #size this}, rest) else this :: addFree(entry, rest) (* Search on. *) (* Find free space. *) fun findFree (_, []) = (NONE, []) | findFree (space, (this as {size, address}) :: tl) = if space = size then (SOME address, tl) else if space < size then (SOME address, {size=size-space, address=address ++ space} :: tl) else let val (res, rest) = findFree(space, tl) in (res, this :: rest) end fun freeMem s = let val addr = s -- overhead val size = Word.fromLarge(SysWord.toLarge(getAddress(addr, 0w0))) in freeList := addFree({address=addr, size=size}, !freeList) end fun allocMem s = let val space = alignUp(s + overhead, maxAlign) val (found, newList) = findFree(space, !freeList) in case found of NONE => let (* Need more memory *) val requestSpace = Word.max(chunkSize, space) val newSpace = systemMalloc requestSpace val _ = newSpace <> null orelse raise Memory in (* Add the space to the free list in the appropriate place. *) freeList := addFree({address=newSpace, size=requestSpace}, !freeList); allocMem s (* Repeat - should succeed now. *) end | SOME address => let val () = freeList := newList (* Update the free list *) (* Store the length in the first word. *) val () = setAddress(address, 0w0, SysWord.fromLarge(Word.toLarge space)) in address ++ overhead end end in val malloc: word -> voidStar = ThreadLib.protect lock allocMem fun free v = if v = null then () else ThreadLib.protect lock freeMem v end end; polyml-5.6/basis/General.sml000066400000000000000000000065461265146633400161200ustar00rootroot00000000000000(* Title: Standard Basis Library: General Structure Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature GENERAL = sig eqtype unit type exn exception Bind exception Chr exception Div exception Domain exception Fail of string exception Match exception Overflow exception Size exception Span exception Subscript val exnName : exn -> string val exnMessage : exn -> string datatype order = LESS | EQUAL | GREATER val ! : 'a ref -> 'a val := : ('a ref * 'a) -> unit val o : (('b -> 'c) * ('a -> 'b)) -> 'a -> 'c val before : ('a * unit) -> 'a val ignore : 'a -> unit end; (* We declare the values in the top-level environment and construct the structure afterwards rather than opening the structure. The reason for this is that we would prefer that types unit and exn did not capture the General structure name. *) local open RuntimeCalls (* for POLY_SYS and EXC numbers *) val System_loadw: exn*int->string = RunCall.run_call2 POLY_SYS_load_word in exception Bind = RunCall.Bind and Div = RunCall.Div and Match = RunCall.Match and Overflow = RunCall.Overflow and Subscript = RunCall.Subscript and Size = RunCall.Size exception Domain and Span and Chr (* Exception packets. The first word is the code, a unique id; the second is the exception name and the third is the exception argument. *) fun exnName (ex: exn) = System_loadw(ex, 1) (* Since exception packets carry a printer function this is just PolyML.makestring. *) fun exnMessage (ex: exn) = PolyML.makestring ex datatype order = LESS | EQUAL | GREATER fun op before (a, _ : unit) = a fun ignore _ = () structure General (*: GENERAL *) (* Don't use a signature here. *) = struct type unit = unit (* This has to be primitive because its value is given by () *) type exn = exn exception Bind = Bind and Div = Div and Match = Match and Chr = Chr exception Overflow = Overflow and Domain= Domain and Fail = Fail exception Span = Span and Subscript = Subscript and Size = Size val exnName = exnName and op := = op := and ! = ! and op o = op o and op before = op before and ignore = ignore val exnMessage = exnMessage datatype order = datatype order end end (* Although these are available unqualified we always use them qualified within this library so that dependencies are maintained. *) polyml-5.6/basis/GenericSock.sml000066400000000000000000000041101265146633400167200ustar00rootroot00000000000000(* Title: Standard Basis Library: Generic socket structure and signature. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature GENERIC_SOCK = sig val socket : Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock val socketPair : Socket.AF.addr_family * Socket.SOCK.sock_type -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock val socket' : Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock val socketPair' : Socket.AF.addr_family * Socket.SOCK.sock_type * int -> ('af, 'sock_type) Socket.sock * ('af, 'sock_type) Socket.sock end; structure GenericSock : GENERIC_SOCK = struct fun socket' (af, st, p: int) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network(14, (af, st, p)) fun socketPair' (af, st, p: int) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network(55, (af, st, p)) (* We assume that the default protocol is always zero. *) fun socket(af, st) = socket'(af, st, 0) fun socketPair(af, st) = socketPair'(af, st, 0) end; polyml-5.6/basis/HashArray.ML000066400000000000000000000150071265146633400161320ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008, 2014, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Hash table type - Creates a hash table of specified initial size. This version expands the hash table and rehashes when the table gets too full *) structure HashArray:> sig type 'a hash val hash: int -> 'a hash val update: 'a hash * string * 'a -> unit val sub: 'a hash * string -> 'a option val delete: 'a hash * string -> unit val fold: (string * 'a * 'b -> 'b) -> 'b -> 'a hash -> 'b end = struct local infix 8 sub (* Each entry in the table is a pair containing the key and the value. *) (* The type of each entry in the array. Putting the tuple in here allows the compiler to use an optimised representation. We have to distinguish empty entries, which stop the search, from deleted entries that don't. *) datatype 'a namedOption = Empty | Deleted | Used of string * 'a in fun hashValue vecLen str = Word.toInt( Word.mod( CharVector.foldr (fn (ch, n) => Word.fromInt(Char.ord ch) + 0w7*n) 0w0 str, (Word.fromInt vecLen))) (* The above function is the quickest and simplest way of computing the hash value now that we have Word.* and Word.mod compiled inline. They aren't implemented in all code-generators so it could be worth retaining the old code. DCJM 26/2/01. *) datatype 'a hash = Hash of { used: int ref, entries: 'a namedOption array ref } (* Create an empty table. *) fun hash size = Hash { used = ref 0, entries = ref (Array.array (size, Empty)) } fun op sub (Hash {entries = ref arr, ...}, name : string) : 'a option = (* Searches the table starting from the position given by the hash value. *) let open Array val vecLen = length arr (* Loops until it either finds an empty entry - in which case it returns NONE, or it finds the name it is looking for. There will always be several empty entries because we rehash if it gets too full. *) fun find i = let val h = arr sub i in case h of Empty => NONE | Deleted => find ((if i = 0 then vecLen else i) - 1) | Used (n,v) => if name = n then SOME v else find ((if i = 0 then vecLen else i) - 1) end in find (hashValue vecLen name) end fun update (Hash {entries as ref currentArray, used}, name, value) = let open Array fun enter a i (entry as (name, _)) = (* Loops until it either finds an empty entry - in which case it enters the value in there, or it finds the string. If it finds a deleted entry it can reuse that but it must check that we haven't also got the same string further along. *) case a sub i of Empty => (* Empty. Add the entry and increment "used". *) (update (a, i, Used entry); true) | Deleted => (* Deleted. Use this entry. *) let fun checkEntry i = case a sub i of Empty => () | Deleted => checkEntry((if i = 0 then length a else i) - 1) | Used(n, _) => if n = name then update(a, i, Deleted) else checkEntry((if i = 0 then length a else i) - 1) in checkEntry i; update (a, i, Used entry); false end | Used (n, _) => (* In use. Overwrite if it's the same name. *) if n = name then (update (a, i, Used entry); false) (* Same name as previous - overwrite it *) else enter a ((if i = 0 then length a else i) - 1) entry; val () = if enter currentArray (hashValue (length currentArray) name) (name, value) then used := !used + 1 else () val currentSize = length currentArray in (* Do we need to rehash ? *) if !used * 5 > currentSize * 4 (* More than 80% full so rehash *) then let val newN = currentSize * 2 (* Double the size *) val newA = array (newN, Empty) val hashNewN = hashValue newN fun copyOver(Used(entry as (name, _))) = if enter newA (hashNewN name) entry then used := !used+1 else () | copyOver _ = () in (* Reset the count to include only non-deleted entries. *) used := 0; (* Copy into the new array *) Array.app copyOver currentArray; entries := newA end else () end fun fold f init (Hash { entries = ref e, ...}) = let fun getEntry(Used(name,alpha), acc) = f (name, alpha, acc) | getEntry(_, acc) = acc in Array.foldl getEntry init e end fun delete(Hash {entries = ref arr, ...}, name) = let open Array val vecLen = length arr (* Similar to "sub" except that it overwrites the entry if it finds it. *) fun find i = let val h = arr sub i in case h of Empty => () (* Not there *) | Deleted => find ((if i = 0 then vecLen else i) - 1) | Used (n, _) => if name = n then update(arr, i, Deleted) else find ((if i = 0 then vecLen else i) - 1) end in find (hashValue vecLen name) end end (* local *); end (* HashArray *); polyml-5.6/basis/IEEEReal.sml000066400000000000000000000203321265146633400160430ustar00rootroot00000000000000(* Title: Standard Basis Library: IEEEReal Structure. Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. *) structure IEEEReal: IEEE_REAL = struct exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO (* This is used for newly added functions in the Standard Basis. *) fun callReal (code: int) args = RunCall.run_call2 RuntimeCalls.POLY_SYS_Real_Dispatch (code,args); fun setRoundingMode (r: rounding_mode) : unit = let (* Although the datatype values are almost certainly integers it's much safer to map them to known values here. *) val rv = case r of TO_NEAREST => 0 | TO_NEGINF => 1 | TO_POSINF => 2 | TO_ZERO => 3 in callReal 9 rv end; fun getRoundingMode () = case callReal 10 () of 0 => TO_NEAREST | 1 => TO_NEGINF | 2 => TO_POSINF | _ => TO_ZERO type decimal_approx = { class : float_class, sign : bool, digits : int list, exp : int } local fun dodigits [] = "" | dodigits (a::b) = Int.toString a ^ dodigits b in fun toString {class, sign=true, digits, exp} = (* Sign bit set *) "~" ^ toString {class=class, sign=false, digits=digits, exp=exp} | toString {class=NAN, ...} = "nan" | toString {class=INF, ...} = "inf" | toString {class=ZERO, ...} = "0.0" | toString {digits, exp, ...} = (* NORMAL or SUBNORMAL *) "0." ^ dodigits digits ^ (if exp = 0 then "" else "E"^(Int.toString exp)) end fun 'a scan (getc: (char, 'a) StringCvt.reader) (src: 'a) : (decimal_approx *'a) option = let fun checkString (src, match: substring) = (* Check the string matches and return the rest of the input if it does. *) case Substring.getc match of NONE => (* Finished *) SOME src (* Return rest *) | SOME (ch, rest) => (case getc src of NONE => NONE | SOME (ch', src') => if ch = Char.toUpper ch' then checkString(src', rest) else NONE ) (* Return a list of digits. *) fun getdigits inp src = case getc src of NONE => (List.rev inp, src) | SOME(ch, src') => if ch >= #"0" andalso ch <= #"9" then getdigits ((Char.ord ch - Char.ord #"0") :: inp) src' else (List.rev inp, src) (* Return the signed exponent. If this doesn't represent a valid integer return NONE since we shouldn't take off the E. Int.scan accepts and removes leading space but we don't allow space here so return NONE if we find any. *) fun getExponent src = case getc src of NONE => NONE | SOME(ch, _) => if Char.isSpace ch then NONE else Int.scan StringCvt.DEC getc src fun readNumber sign (src: 'a): (decimal_approx *'a) option = case getc src of NONE => NONE | SOME (ch, _) => if ch >= #"0" andalso ch <= #"9" orelse ch = #"." then (* Digits or decimal. *) let (* Get the digits before the decimal point (if any) *) val (intPart, src2) = getdigits [] src (* Get the digits after the decimal point. If there is a decimal point with no digits after it we don't swallow the dp. *) val (decimals, src3) = case getc src2 of SOME (#".", src3a) => ( case getdigits [] src3a of ([], _) => ([], src2) | (digs, s) => (digs, s) ) | _=> ([], src2) (* Get the exponent, returning zero if it doesn't match. *) val (exponent, src4) = case getc src3 of NONE => (0, src3) | SOME (ch, src4a) => if ch = #"e" orelse ch = #"E" then ( case getExponent src4a of NONE => (0, src3) | SOME x => x ) else (0, src3) (* Trim leading zeros from the part before the decimal and trailing zeros from the part after. *) fun trimLeadingZeros [] = [] | trimLeadingZeros (0 :: l) = trimLeadingZeros l | trimLeadingZeros l = l val trimTrailingZeros = List.rev o trimLeadingZeros o List.rev val leading = trimLeadingZeros intPart val trailing = trimTrailingZeros decimals in (* If both the leading and trailing parts are empty the number is zero, except that if there were no digits at all we have a malformed number. *) case (intPart, decimals, leading, trailing) of ([], [], _, _) => NONE | (_, _, [], []) => SOME ({class=ZERO, sign=sign, digits=[], exp=0}, src4) | _ => SOME ({class=NORMAL, sign=sign, digits=List.@(leading, trailing), exp=exponent + List.length leading}, src4) end else ( (* Could be INFINITY, INF or NAN. Check INFINITY before INF. *) case checkString (src, Substring.full "INFINITY") of SOME src' => SOME ({class=INF, sign=sign, digits=[], exp=0}, src') | NONE => ( case checkString (src, Substring.full "INF") of SOME src' => SOME ({class=INF, sign=sign, digits=[], exp=0}, src') | NONE => ( case checkString (src, Substring.full "NAN") of SOME src' => SOME ({class=NAN, sign=sign, digits=[], exp=0}, src') | NONE => NONE ) ) ) in case getc src of NONE => NONE | SOME(ch, src') => if Char.isSpace ch (* Skip white space. *) then scan getc src' (* Recurse *) else if ch = #"+" then readNumber false src' (* Skip it *) else if ch = #"-" orelse ch = #"~" then readNumber true src' (* Skip it and ignore sign *) else readNumber false src end (* scan *) fun fromString (s: string): decimal_approx option = StringCvt.scanString scan s end; polyml-5.6/basis/IEEE_REAL.sml000066400000000000000000000031311265146633400160400ustar00rootroot00000000000000(* Title: Standard Basis Library: IEEE_REAL Signature. Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. *) signature IEEE_REAL = sig exception Unordered datatype real_order = LESS | EQUAL | GREATER | UNORDERED datatype float_class = NAN | INF | ZERO | NORMAL | SUBNORMAL datatype rounding_mode = TO_NEAREST | TO_NEGINF | TO_POSINF | TO_ZERO val setRoundingMode : rounding_mode -> unit val getRoundingMode : unit -> rounding_mode type decimal_approx = { class : float_class, sign : bool, digits : int list, exp : int } val toString : decimal_approx -> string val scan : (char, 'a) StringCvt.reader -> (decimal_approx, 'a) StringCvt.reader val fromString : string -> decimal_approx option end; polyml-5.6/basis/IMPERATIVE_IO.sml000066400000000000000000000037501265146633400165710ustar00rootroot00000000000000(* Title: Standard Basis Library: Imperative IO Signature Copyright David C.J. Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change *) signature IMPERATIVE_IO = sig structure StreamIO : STREAM_IO type vector = StreamIO.vector type elem = StreamIO.elem type instream type outstream val input : instream -> vector val input1 : instream -> elem Option.option val inputN : instream * int -> vector val inputAll : instream -> vector val canInput : instream * int -> int Option.option val lookahead : instream -> elem Option.option val closeIn : instream -> unit val endOfStream : instream -> bool val output : outstream * vector -> unit val output1 : outstream * elem -> unit val flushOut : outstream -> unit val closeOut : outstream -> unit val mkInstream : StreamIO.instream -> instream val getInstream : instream -> StreamIO.instream val setInstream : instream * StreamIO.instream -> unit val mkOutstream : StreamIO.outstream -> outstream val getOutstream : outstream -> StreamIO.outstream val setOutstream : outstream * StreamIO.outstream -> unit val getPosOut : outstream -> StreamIO.out_pos val setPosOut : outstream * StreamIO.out_pos -> unit end; polyml-5.6/basis/INTEGER.sml000066400000000000000000000037511265146633400156330ustar00rootroot00000000000000(* Title: Standard Basis Library: Integer signature Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Minor change to type of "scan". *) signature INTEGER = sig eqtype int val toLarge : int -> LargeInt.int val fromLarge : LargeInt.int -> int val toInt : int -> Int.int val fromInt : Int.int -> int val precision : Int.int option val minInt : int option val maxInt : int option val ~ : int -> int val * : (int * int) -> int val div : (int * int) -> int val mod : (int * int) -> int val quot : (int * int) -> int val rem : (int * int) -> int val + : (int * int) -> int val - : (int * int) -> int val compare : (int * int) -> General.order val > : (int * int) -> bool val >= : (int * int) -> bool val < : (int * int) -> bool val <= : (int * int) -> bool val abs : int -> int val min : (int * int) -> int val max : (int * int) -> int val sign : int -> Int.int val sameSign : (int * int) -> bool val fmt : StringCvt.radix -> int -> string val toString : int -> string val fromString : string -> int option val scan : StringCvt.radix -> (char, 'a) StringCvt.reader -> (int, 'a) StringCvt.reader end; polyml-5.6/basis/INetSock.sml000066400000000000000000000072411265146633400162130ustar00rootroot00000000000000(* Title: Standard Basis Library: Internet Sockets Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Checked, no change. *) signature INET_SOCK = sig type inet type 'sock_type sock = (inet, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr val inetAF : Socket.AF.addr_family val toAddr : NetHostDB.in_addr * int -> sock_addr val fromAddr : sock_addr -> NetHostDB.in_addr * int val any : int -> sock_addr structure UDP : sig val socket : unit -> dgram_sock val socket' : int -> dgram_sock end structure TCP : sig val socket : unit -> 'mode stream_sock val socket' : int -> 'mode stream_sock val getNODELAY : 'mode stream_sock -> bool val setNODELAY : 'mode stream_sock * bool -> unit end end; structure INetSock :> INET_SOCK = struct abstype inet = ABSTRACT with end; type 'sock_type sock = (inet, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = inet Socket.sock_addr val inetAF : Socket.AF.addr_family = case Socket.AF.fromString "INET" of NONE => raise OS.SysErr("Missing address family", NONE) | SOME s => s local val doCall = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun toAddr(iaddr: NetHostDB.in_addr, port: int) : sock_addr = doCall(40, (port, iaddr)) end local val doCall1 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network and doCall2 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun fromAddr (s: sock_addr) : NetHostDB.in_addr * int = if Socket.familyOfAddr s <> inetAF then raise Match else (doCall1(42, s), doCall2(41, s)) end local val doCall = RunCall.run_call2 RuntimeCalls.POLY_SYS_network val iAddrAny: NetHostDB.in_addr = doCall(13, ()) in fun any (p: int) : sock_addr = toAddr(iAddrAny, p) end local val doCall1 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network val doCall2 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in structure UDP = struct fun socket () = GenericSock.socket(inetAF, Socket.SOCK.dgram) fun socket' p = GenericSock.socket'(inetAF, Socket.SOCK.dgram, p) end structure TCP = struct fun socket () = GenericSock.socket(inetAF, Socket.SOCK.stream) fun socket' p = GenericSock.socket'(inetAF, Socket.SOCK.stream, p) fun getNODELAY(s: 'mode stream_sock): bool = doCall1(16, RunCall.unsafeCast s) fun setNODELAY (s: 'mode stream_sock, b: bool): unit = doCall2(15, (RunCall.unsafeCast s, b)) end end end; polyml-5.6/basis/IO.sml000066400000000000000000000030261265146633400150400ustar00rootroot00000000000000(* Title: Standard Basis Library: IO Structure and Signature Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: done. Removed TerminatedStream exception. *) signature IO = sig exception Io of {name : string, function : string, cause : exn} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end; structure IO: IO = struct exception Io of {name : string, function : string, cause : exn} exception BlockingNotSupported exception NonblockingNotSupported exception RandomAccessNotSupported exception ClosedStream datatype buffer_mode = NO_BUF | LINE_BUF | BLOCK_BUF end; polyml-5.6/basis/ImperativeIO.sml000066400000000000000000000147561265146633400171020ustar00rootroot00000000000000(* Title: Standard Basis Library: ImperativeIO functor Copyright David C.J. Matthews 2000, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is also used in TextIO. We need "protect". *) functor BasicImperativeIO ( structure StreamIO : STREAM_IO structure Vector : MONO_VECTOR structure Array : MONO_ARRAY sharing type StreamIO.elem = Vector.elem = Array.elem sharing type StreamIO.vector = Vector.vector = Array.vector ) (* No signature on the result *) = struct structure StreamIO = StreamIO type vector = Vector.vector and elem = StreamIO.elem datatype instream = InStream of { (* An imperative input stream is a reference to a lazy functional stream. *) fStream: StreamIO.instream ref, lock: Thread.Mutex.mutex } and outstream = OutStream of { (* An imperative output stream is a reference to the underlying stream. Unlike instream the underlying stream is also imperative but we need a reference here to allow us to redirect. *) fStream: StreamIO.outstream ref } (* We don't need a mutex for outstream assuming := and ! are atomic i.e. '!' returns either the previous value or the current one and not some intermediate value. *) (* Use no-overwrite refs for imperative streams. This is really only needed for stdIn to make sure that when we call PolyML.SaveState.loadState we don't overwrite any unread input by the contents of the buffer when saveState was called. *) fun mkInstream (s : StreamIO.instream) : instream = InStream{fStream = LibrarySupport.noOverwriteRef s, lock = Thread.Mutex.mutex()} fun protect (InStream{fStream, lock}) f = LibraryIOSupport.protect lock f fStream (* Get and set the underlying stream. We have to interlock setInstream at least. *) fun getInstream s = protect s (fn fStream => !fStream) and setInstream(InStream{fStream, lock}, s) = LibraryIOSupport.protect lock (fn fStream => fStream := s) fStream (* These are just wrappers for the underlying functional calls. *) fun input s = protect s (fn fStream => let val (v, f') = StreamIO.input(!fStream) in fStream := f'; v end) (* We don't use StreamIO.input1 here because that never advances over a temporary EOF. *) fun input1 s = protect s (fn fStream => let val (s, f') = StreamIO.inputN(!fStream, 1) in fStream := f'; if Vector.length s = 0 then NONE else SOME(Vector.sub(s, 0)) end) fun inputN(InStream{fStream, lock}, n) = LibraryIOSupport.protect lock (fn fStream => let val (v, f') = StreamIO.inputN(!fStream, n) in fStream := f'; v end) fStream fun inputAll s = protect s (fn fStream => let val (v, f') = StreamIO.inputAll(!fStream) in fStream := f'; v end) (* These next functions only query the stream and don't affect the fStream ref so don't really need interlocking. If two threads call these functions simultaneously the result is non-deterministic anyway. *) fun canInput(InStream{fStream, lock}, n) = LibraryIOSupport.protect lock (fn fStream => StreamIO.canInput(! fStream, n)) fStream and closeIn s = protect s (fn fStream => StreamIO.closeIn(! fStream)) and endOfStream s = protect s (fn fStream => StreamIO.endOfStream(! fStream)) fun lookahead s = protect s (fn fStream => case StreamIO.input1 (! fStream) of NONE => NONE | SOME(s, _) => SOME s ) (* These are simply wrappers. *) fun mkOutstream (s : StreamIO.outstream) : outstream = OutStream{fStream = LibrarySupport.noOverwriteRef s} fun getOutstream(OutStream{fStream = ref s}) = s and setOutstream(OutStream{fStream}, s) = fStream := s fun output(OutStream{fStream=ref f, ...}, v) = StreamIO.output(f, v) and output1(OutStream{fStream=ref f, ...}, c) = StreamIO.output1(f, c) and flushOut(OutStream{fStream=ref f, ...}) = StreamIO.flushOut f and closeOut(OutStream{fStream=ref f, ...}) = StreamIO.closeOut f and getPosOut(OutStream{fStream=ref f, ...}) = StreamIO.getPosOut f fun setPosOut(OutStream{fStream, ...}, p) = fStream := StreamIO.setPosOut p (* Add pretty printers to hide the internals. These just use the implementation streams. *) local open PolyML fun prettyIn depth _ (InStream{ fStream = ref s, ...}) = PolyML.prettyRepresentation(s, depth) fun prettyOut depth _ (OutStream { fStream = ref s, ...}) = PolyML.prettyRepresentation(s, depth) in val () = addPrettyPrinter prettyIn val () = addPrettyPrinter prettyOut end end; (* General exported version with final signature. *) functor ImperativeIO ( structure StreamIO : STREAM_IO structure Vector : MONO_VECTOR structure Array : MONO_ARRAY sharing type StreamIO.elem = Vector.elem = Array.elem sharing type StreamIO.vector = Vector.vector = Array.vector ) : IMPERATIVE_IO where type StreamIO.elem = StreamIO.elem where type StreamIO.vector = StreamIO.vector where type StreamIO.instream = StreamIO.instream where type StreamIO.outstream = StreamIO.outstream where type StreamIO.out_pos = StreamIO.out_pos where type StreamIO.reader = StreamIO.reader where type StreamIO.writer = StreamIO.writer where type StreamIO.pos = StreamIO.pos = BasicImperativeIO(structure StreamIO = StreamIO and Vector = Vector and Array = Array); polyml-5.6/basis/InitialBasis.ML000066400000000000000000000273431265146633400166310ustar00rootroot00000000000000(* Copyright (c) 2000-2010 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: ML prelude file. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* 10/2/94 SPF merged prelude files from AHL's v2.07X and Dave's v2.08 *) (* 10/2/94 SPF inlined signatures to avoid name-space pollution *) (* For ML97 this prelude has been reduced to virtually nothing. Almost everything is defined in the Standard Basis library. *) (*****************************************************************************) (* Infixes *) (*****************************************************************************) infix 7 * / div mod infix 6 + - ^ infixr 5 :: @ infix 4 = <> > >= < <= infix 3 := o infix 0 before (* Set up the overloading first so we can use it in the rest of the prelude. Setting up overloads is messy because of the need to capture the inline code for the functions. *) (* Conversion functions. At this stage we have installed a simple conversion function for strings and ints. *) val it: string->real = RunCall.run_call1 RuntimeCalls.POLY_SYS_conv_real; RunCall.addOverload it "convReal"; (* Comparisons. These are overloaded on strings, chars and word as well as int and real. *) (* N.B. We have to bind these overloads in separate top-level declarations because of limitations in addOverload. This has the unfortunate side-effect of leaving "it" bound to something but it's cleared out when we copy everything to the final top-level name space. *) val it: int*int->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_int_geq; RunCall.addOverload it ">="; val it: string*string->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_teststrgeq; RunCall.addOverload it ">="; val it: real*real->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_Real_geq; RunCall.addOverload it ">="; val it: char*char->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_geq; RunCall.addOverload it ">="; val it: word*word->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_geq; RunCall.addOverload it ">="; val it: int*int->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_int_leq; RunCall.addOverload it "<="; val it: string*string->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_teststrleq; RunCall.addOverload it "<="; val it: real*real->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_Real_leq; RunCall.addOverload it "<="; val it: char*char->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_leq; RunCall.addOverload it "<="; val it: word*word->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_leq; RunCall.addOverload it "<="; val it: int*int->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_int_gtr; RunCall.addOverload it ">"; val it: string*string->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_teststrgtr; RunCall.addOverload it ">"; val it: real*real->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_Real_gtr; RunCall.addOverload it ">"; val it: char*char->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_gtr; RunCall.addOverload it ">"; val it: word*word->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_gtr; RunCall.addOverload it ">"; val it: int*int->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_int_lss; RunCall.addOverload it "<"; val it: string*string->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_teststrlss; RunCall.addOverload it "<"; val it: real*real->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_Real_lss; RunCall.addOverload it "<"; val it: char*char->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_lss; RunCall.addOverload it "<"; val it: word*word->bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_word_lss; RunCall.addOverload it "<"; (* Binary operations. *) val it: int*int->int = RunCall.run_call2 RuntimeCalls.POLY_SYS_aplus; RunCall.addOverload it "+"; val it: real*real->real = RunCall.run_call2 RuntimeCalls.POLY_SYS_Add_real; RunCall.addOverload it "+"; val it: word*word->word = RunCall.run_call2 RuntimeCalls.POLY_SYS_plus_word; RunCall.addOverload it "+"; val it: int*int->int = RunCall.run_call2 RuntimeCalls.POLY_SYS_aminus; RunCall.addOverload it "-"; val it: real*real->real = RunCall.run_call2 RuntimeCalls.POLY_SYS_Sub_real; RunCall.addOverload it "-"; val it: word*word->word = RunCall.run_call2 RuntimeCalls.POLY_SYS_minus_word; RunCall.addOverload it "-"; val it: int*int->int = RunCall.run_call2 RuntimeCalls.POLY_SYS_amul; RunCall.addOverload it "*"; val it: real*real->real = RunCall.run_call2 RuntimeCalls.POLY_SYS_Mul_real; RunCall.addOverload it "*"; val it: word*word->word = RunCall.run_call2 RuntimeCalls.POLY_SYS_mul_word; RunCall.addOverload it "*"; (* Unary operations. *) val it: int->int = RunCall.run_call1 RuntimeCalls.POLY_SYS_aneg; RunCall.addOverload it "~"; val it: real->real = RunCall.run_call1 RuntimeCalls.POLY_SYS_Neg_real; RunCall.addOverload it "~"; local val zero: word = RunCall.unsafeCast 0 in fun it x = zero - x end; RunCall.addOverload it "~"; fun it (i: int): int = if i >= 0 then i else ~ i; RunCall.addOverload it "abs"; val it: real->real = RunCall.run_call1 RuntimeCalls.POLY_SYS_Abs_real; RunCall.addOverload it "abs"; local val zero: word = RunCall.unsafeCast 0 in fun it x = if x >= zero then x else ~ x end; RunCall.addOverload it "abs"; (* div, mod and / are overloaded in ML97. *) val it: real * real -> real = RunCall.run_call2 RuntimeCalls.POLY_SYS_Div_real; RunCall.addOverload it "/"; local infix 7 quot val op quot: int * int -> int = RunCall.run_call2 RuntimeCalls.POLY_SYS_adiv; in fun it (x, y) = let (* If the signs differ the normal quot operation will give the wrong answer. We have to round the result down by subtracting either y-1 or y+1. This will round down because it will have the opposite sign to x *) (* ... val d = x - (if (y >= 0) = (x >= 0) then 0 else if y > 0 then y-1 else y+1) ... *) val xpos = x >= 0; val ypos = y >= 0; val d = if xpos = ypos then x else if ypos then (x - (y - 1)) else (x - (y + 1)) in d quot y (* may raise Div for divide-by-zero *) end; end; RunCall.addOverload it "div"; local infix 7 rem val op rem: int * int -> int = RunCall.run_call2 RuntimeCalls.POLY_SYS_amod; in fun it(x, y) = let val r = (x rem y) (* must handle divide-by-zero *) (* handle Div => raise Mod; *) in if r = 0 orelse (y >= 0) = (r >= 0) then r else r + y end; end; RunCall.addOverload it "mod"; val it : word*word->word = RunCall.run_call2 RuntimeCalls.POLY_SYS_div_word; RunCall.addOverload it "div"; val it : word*word->word = RunCall.run_call2 RuntimeCalls.POLY_SYS_mod_word; RunCall.addOverload it "mod"; (* We need to use the same identifier for this that we used when compiling the compiler, particularly "make". *) exception Fail = RunCall.Fail (* A few useful functions which are in the top-level environment. Others are added later. *) (* This is built in because the length of a string is stored as an untagged integer. The result needs to be a tagged integer. Actually this might be better written using a separate function POLY_SYS_get_string_length (by analogy with POLY_SYS_set_string_length) and then fun size (s: string): int = if isShort s then 1 else POLY_SYS_get_string_length s; The advantage would be that the . *) val size : string -> int = RunCall.run_call1 RuntimeCalls.POLY_SYS_string_length; val str: char ->string = RunCall.unsafeCast; val ord: char -> int = RunCall.unsafeCast; val not: bool -> bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_not_bool; val use: string -> unit = Bootstrap.use; (* This will be replaced. *) local val System_setw: (* 'a ref*int*'a*) word*int*word ->unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_assign_word in fun (var: 'a ref) := (v: 'a) : unit = (RunCall.unsafeCast System_setw (var, 0, v); ()) end; (* The following version of "o" currently gets optimised better. *) fun (f o g) = fn x => f (g x); (* functional composition *) fun ! (ref x) = x; fun length l = let (* Tail-recursive function. *) fun len [] i = i | len (_::l) i = len l (i+1) in len l 0 end local (* Temporary conversion function for characters. This is replaced in the Char structure. *) open RuntimeCalls; val isShortString : string -> bool = RunCall.run_call1 POLY_SYS_is_short fun convChar (s: string) : char = let val convS = Bootstrap.convString s in (* Should be exactly a single character i.e. a single short value. *) if isShortString convS then RunCall.unsafeCast convS else raise RunCall.Conversion "Bad character" end; in val it = RunCall.addOverload convChar "convChar"; end; (* Print functions. Some of these are replaced by functions in the Basis library and are installed here merely so that we can get useful output if we get a failure while compiling it. *) local open RuntimeCalls PolyML fun print_bool _ _ (b: bool) = PrettyString(if b then "true" else "false") fun print_string _ _ (s: string) = PrettyString s (* Not escaped at the moment. *) fun print_char _ _ (c: char) = PrettyBlock (0, false, [], [PrettyString "#", PrettyString(RunCall.unsafeCast c)]) fun nil @ y = y (* This is redefined later. *) | (a::b) @ y = a :: (b @ y) fun print_list depth printEl (l: 'a list) = let (* Print the list as [, , etc ]. Replace the rest of the list by ... once the depth reaches zero. *) fun plist [] _ = [] | plist _ 0 = [PrettyString "..."] | plist [h] depth = [printEl (h, depth)] | plist (h::t) depth = printEl (h, depth) :: PrettyString "," :: PrettyBreak (1, 0) :: plist t (depth - 1) in PrettyBlock (1, false, [], (* Wrap this in a begin-end block to keep it together. *) PrettyString "[" :: ((if depth <= 0 then [PrettyString "..."] else plist l depth) @ [PrettyString "]"] ) ) end fun print_int _ _ (i: int) = let fun pr i = if i < 0 then PrettyString "~" :: pr (~ i) else if i < 10 then [PrettyString(RunCall.unsafeCast(i + RunCall.unsafeCast #"0"))] else pr(i div 10) @ [PrettyString(RunCall.unsafeCast(i mod 10 + 48))] in PrettyBlock(1, false, [], pr i) end in val () = addPrettyPrinter print_bool val () = addPrettyPrinter print_string val () = addPrettyPrinter print_char val () = addPrettyPrinter print_list val () = addPrettyPrinter print_int end; polyml-5.6/basis/InitialPolyML.ML000066400000000000000000000114321265146633400167340ustar00rootroot00000000000000(* Title: Extend the PolyML structure. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000-7 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Extend the PolyML structure. In particular this adds onEntry which needs to be used further on in the basis library. We also add a few more items at this point. *) local open RuntimeCalls in structure PolyML = (* We must not have a signature on the result otherwise print and makestring will be given polymorphic types and will only produce "?" *) struct open PolyML local (* Initialise the list with the existing start-up function. *) val onEntryList: (unit->unit) list ref = ref[] and onEntryMutex = Thread.Mutex.mutex() (* Run the list in reverse order. *) fun runOnEntry [] = () | runOnEntry (f :: b) = (runOnEntry b; f() handle _ => ()); (* This wraps the function provided to PolyML.export and PolyML.exportPortable so that the library is initialised at start-up and finalised at close-down. *) fun runFunction f () = let val () = runOnEntry(! onEntryList); (* Perform start-up operations. *) (* Run the main program. If it doesn't explicitly call OS.Process.exit then use "success" as the normal result and "failure" if it raises an exception. *) val result = (f(); OS.Process.success) handle _ => OS.Process.failure (* Run the main function. *) in OS.Process.exit result (* Perform close-down actions. *) end in (* The equivalent of atExit except that functions are added to the list persistently and of course the functions are executed at start-up rather than close-down. *) (* Protect this with a mutex in case two threads try to add entries at the same time. Very unlikely since this is really only called when building the basis library. *) fun onEntry (f: unit->unit) : unit = ThreadLib.protect onEntryMutex (fn () => onEntryList := f :: !onEntryList) () (* Export functions - write out the function and everything reachable from it. *) fun export(filename: string, f: unit->unit): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (1, (filename, runFunction f)) fun exportPortable(filename: string, f: unit->unit): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (3, (filename, runFunction f)) end fun shareCommonData(root: 'a): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (13, root) fun objSize(x:'a): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (14, x) and showSize(x:'a): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (15, x) and objProfile(x:'a): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (16, x) val fullGC: unit -> unit = RunCall.run_call0 POLY_SYS_full_gc; val stackTrace: unit -> unit = RunCall.run_call0 POLY_SYS_stack_trace; local val eqWord : word*word->bool = RunCall.run_call2 POLY_SYS_word_eq in fun pointerEq(x: 'a ,y: 'a): bool = RunCall.unsafeCast eqWord (x,y) end fun rtsVersion () : int = RunCall.run_call2 POLY_SYS_process_env(104, ()) fun architecture(): string = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (12, ()) fun rtsArgumentHelp(): string = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (19, ()); structure IntInf = struct fun gcd(args: int * int): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (50, args) and lcm(args: int * int): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (51, args) end end end; polyml-5.6/basis/Int.sml000066400000000000000000000372311265146633400152700ustar00rootroot00000000000000(* Title: Standard Basis Library: Int and LargeInt structures Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: done. Very minor change to type of "scan". *) structure Int: sig (* This signature is almost the same as INTEGER except that occurrences of Int and LargeInt are removed. The type is the same in all cases so that doesn't matter. *) eqtype int val toLarge : int -> (*LargeInt.*)int val fromLarge : (*LargeInt.*)int -> int val toInt : int -> (*Int.*)int val fromInt : (*Int.*)int -> int val precision : (*Int.*)int option val minInt : int option val maxInt : int option val ~ : int -> int val * : (int * int) -> int val div : (int * int) -> int val mod : (int * int) -> int val quot : (int * int) -> int val rem : (int * int) -> int val + : (int * int) -> int val - : (int * int) -> int val compare : (int * int) -> General.order val > : (int * int) -> bool val >= : (int * int) -> bool val < : (int * int) -> bool val <= : (int * int) -> bool val abs : int -> int val min : (int * int) -> int val max : (int * int) -> int val sign : int -> (*Int.*)int val sameSign : (int * int) -> bool val fmt : StringCvt.radix -> int -> string val toString : int -> string val fromString : string -> int option val scan : StringCvt.radix -> (char, 'a) StringCvt.reader -> (int, 'a) StringCvt.reader end = struct open RuntimeCalls; (* for POLY_SYS and EXC numbers *) (* In Poly/ML we use arbitrary precision for the normal integer. That uses a short representation which is typically 30 or 31 bit and a long representation which is a pointer to a segment of bytes. *) type int = int (* Underlying type *) (* Since LargeInt and Int are the same these are identity functions. *) fun toLarge i = i and fromLarge i = i and toInt i = i and fromInt i = i val precision = NONE (* Arbitrary precision. *) and minInt = NONE and maxInt = NONE infix 7 quot rem val op quot: int * int -> int = RunCall.run_call2 POLY_SYS_adiv and op rem: int * int -> int = RunCall.run_call2 POLY_SYS_amod (* TODO: There was a bug in the i386 RTS which caused the wrong exception to be raised for divide-by-zero. It's been fixed in the Windows version. Check other RTS's, in particular Linux. *) fun x mod y = let val r = x rem y (* must handle divide-by-zero *) (* NB: Unlike ML 90 this function raises Div if y is zero, not Mod *) in if r = 0 orelse (y >= 0) = (r >= 0) then r else r + y end; fun x div y = let (* If the signs differ the normal quot operation will give the wrong answer. We have to round the result down by subtracting either y-1 or y+1. This will round down because it will have the opposite sign to x *) (* ... val d = x - (if (y >= 0) = (x >= 0) then 0 else if y > 0 then y-1 else y+1) ... *) val xpos = x >= 0; val ypos = y >= 0; val d = if xpos = ypos then x else if ypos then (x - (y - 1)) else (x - (y + 1)) in d quot y (* may raise Div for divide-by-zero *) end; fun compare (i, j) = if i < j then General.LESS else if i > j then General.GREATER else General.EQUAL fun abs i = if i >= 0 then i else ~ i fun min (i, j) = if i < j then i else j and max (i, j) = if i > j then i else j fun sign i = if i = 0 then 0 else if i < 0 then ~1 else 1 (* It might be possible to do something clever by xor-ing the words together when both values are short. *) fun sameSign(i, j) = if i = 0 then j = 0 else if i < 0 then j < 0 else (* i > 0 *) j > 0 local (* To reduce the need for arbitrary precision arithmetic we can try to process values in groups. *) (* Return the largest short value and the number of digits. *) fun maxShort(n, radix, acc) = if LibrarySupport.isShortInt(acc * radix) then maxShort(n+1, radix, acc*radix) else (acc, (*Word.fromInt*) RunCall.unsafeCast n) val (maxB, lenB) = maxShort(0, 2, 1) and (maxO, lenO) = maxShort(0, 8, 1) and (maxD, lenD) = maxShort(0, 10, 1) and (maxH, lenH) = maxShort(0, 16, 1) in (* Local function *) fun baseOf StringCvt.BIN = (2, maxB, lenB) | baseOf StringCvt.OCT = (8, maxO, lenO) | baseOf StringCvt.DEC = (10, maxD, lenD) | baseOf StringCvt.HEX = (16, maxH, lenH) end local open LibrarySupport val System_lock: string -> unit = RunCall.run_call1 POLY_SYS_lockseg val System_setb: string * word * char -> unit = RunCall.run_call3 POLY_SYS_assign_byte val quotRem: int*int -> int*int = RunCall.run_call2C2 POLY_SYS_quotrem (* Int.toChars turned out to be a major allocation hot-spot in some Isabelle examples. The old code created a list of the characters and then concatenated them. This cost 3 words for each character before the actual string was created. This version avoids that problem. This has also now been modified to reduce the arbitrary precision arithmetic required when the value is long. Instead of reducing it by the radix each time we take off chunks of up to the maximum value that can be represented as a short precision value. *) fun toChar digit = if digit < 10 then Char.chr(Char.ord(#"0") + digit) else (* Hex *) Char.chr(Char.ord(#"A") + digit - 10) in fun fmt radix i = let val (base, maxShort, shortChars) = baseOf radix val negative = i < 0 fun toChars(0, chars, 0, _) = (* Really finished. Allocate the string. *) if negative then let val res = allocString(chars+0w1) in System_setb(res, wordSize, #"~"); (res, wordSize+0w1) end else (* Positive *) (allocString chars, wordSize) | toChars(0, chars, continuation, pad) = (* Finished this group but have at least one more group. *) let val (result, pos) = toCharGroup(continuation, chars + pad) fun addZeros n = if n = pad then () else (System_setb(result, pos+n, #"0"); addZeros(n+0w1)) in addZeros 0w0; (result, pos+pad) end | toChars(i, chars, continuation, pad) = (* More to do in this group. *) let val (q, digit) = quotRem(i, base) val ch = toChar digit (* Get the string. *) val (result, pos) = toChars(q, chars+0w1, continuation, pad-0w1) in System_setb(result, pos, ch); (result, pos+0w1) end (* Process a group of characters that will fit in a short precision number. *) and toCharGroup(i, chars) = if LibrarySupport.isShortInt i then toChars(i, chars, 0, 0w0) else let val (q, r) = quotRem(i, maxShort) in toChars(r, chars, q, shortChars) end in if i >= 0 andalso i < base then (* This will be a single character. Treat specially. This is also the only case where we print a leading zero. *) RunCall.unsafeCast(toChar i) : string else (* Multiple characters. *) let val (result, _) = toCharGroup(abs i, 0w0) in System_lock result; result end end end val toString = fmt StringCvt.DEC fun scan radix getc src = let val (base, _, _) = baseOf radix (* Read the digits, accumulating the result in acc. isOk is true once we have read a valid digit. *) fun read_digits src acc isOk = case getc src of NONE => if isOk then SOME(acc, src) else NONE | SOME(ch, src') => if Char.ord ch >= Char.ord #"0" andalso Char.ord ch < (Char.ord #"0" + base) then read_digits src' (acc*base + Char.ord ch - Char.ord #"0") true else (* Invalid character - either end of number or bad no. *) if isOk then SOME(acc, src) else NONE fun read_hex_digits src acc isOk = case getc src of NONE => if isOk then SOME(acc, src) else NONE | SOME(ch, src') => if Char.ord ch >= Char.ord #"0" andalso Char.ord ch <= Char.ord #"9" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"0") true else if Char.ord ch >= Char.ord #"A" andalso Char.ord ch <= Char.ord #"F" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"A" + 10) true else if Char.ord ch >= Char.ord #"a" andalso Char.ord ch <= Char.ord #"f" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"a" + 10) true else (* Invalid character - either end of number or bad no. *) if isOk then SOME(acc, src) else NONE (* There is a special case with hex numbers. A hex number MAY begin with 0x or 0X e.g. 0x1f0 but need not. So "0x " and "0xg" are both valid and represent the value 0 with "x " and "xg" as the continuations of the input. *) fun read_number src = if base = 16 then (* Hex. *) ( case getc src of NONE => NONE | SOME(ch, src') => if ch <> #"0" then read_hex_digits src 0 false else ( case getc src' of NONE => SOME(0, src') (* Accept the 0 *) | SOME(ch, src'') => if ch = #"x" orelse ch = #"X" then ( (* See if the characters after the 0x form a valid hex number. If so return that, if not return the 0 and treat the rest of the string as starting with the x. *) case read_hex_digits src'' 0 false of NONE => SOME(0, src') (* Accept the 0 *) | res => res ) else (* Start from the 0. *) read_hex_digits src 0 false ) ) else (* Binary, octal and decimal *) read_digits src 0 false in case getc src of NONE => NONE | SOME(ch, src') => if Char.isSpace ch (* Skip white space. *) then scan radix getc src' (* Recurse *) else if ch = #"+" (* Remove the + sign *) then read_number src' else if ch = #"-" orelse ch = #"~" then ( case read_number src' of NONE => NONE | SOME(i, r) => SOME(~i, r) ) else (* See if it's a valid digit. *) read_number src end (* TODO: Implement this directly? *) val fromString = StringCvt.scanString (scan StringCvt.DEC) (* Converter to int values. This replaces the basic conversion function for ints installed in the bootstrap process. In particular this converter can handle hexadecimal. *) local (* The string may be either decimal or hex. *) (* TODO: We could rewrite scan so that it raises Conversion with a string giving more information and then handle. It's possibly not worth it since the lexical analyser should only pass in a syntactically valid string. *) fun convInt s = let val radix = if String.size s >= 3 andalso String.substring(s, 0, 2) = "0x" orelse String.size s >= 4 andalso String.substring(s, 0, 3) = "~0x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (scan radix) s of NONE => raise RunCall.Conversion "Invalid integer constant" | SOME res => res end in (* Install this as a conversion function for integer literals. Unlike other overloaded functions there's no need to ensure that overloaded conversion functions are installed at the top-level. The compiler has type "int" built in and will use this conversion function for literals of the form nnn... in preference to any other if unification does not give an explicit type. *) val () = RunCall.addOverload convInt "convInt" end (* These are overloaded functions and are treated specially. *) (* Since they aren't overloaded in this structure we can pick up the underlying RTS functions. *) val ~ : int->int = RunCall.run_call1 POLY_SYS_aneg and op * : int*int->int = RunCall.run_call2 POLY_SYS_amul and op + : int*int->int = RunCall.run_call2 POLY_SYS_aplus and op - : int*int->int = RunCall.run_call2 POLY_SYS_aminus val op < : int*int->bool = RunCall.run_call2 POLY_SYS_int_lss and op > : int*int->bool = RunCall.run_call2 POLY_SYS_int_gtr and op <= : int*int->bool = RunCall.run_call2 POLY_SYS_int_leq and op >= : int*int->bool = RunCall.run_call2 POLY_SYS_int_geq end; local (* Install the pretty printer for int *) fun prettyInt _ _ x = PolyML.PrettyString(Int.toString x) in val () = PolyML.addPrettyPrinter prettyInt end; structure LargeInt = Int and Position = Int; polyml-5.6/basis/Int32.sml000066400000000000000000000055771265146633400154450ustar00rootroot00000000000000(* Title: Standard Basis Library: Int32 Structure Author: Vesa Karvonen Copyright David Matthews 1999 Vesa Karvonen 2007 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is a hacked version of Int32 - a 32bit Int implementation for PolyML 5. It's neither well tested nor efficiently implemented. *) structure Int32 :> INTEGER = struct open Int val precision = 32 val minInt = ~(IntInf.<< (1, Word.fromInt (precision - 1))) val maxInt = ~1-minInt fun check i = if i < minInt orelse maxInt < i then raise Overflow else i val precision = SOME precision val minInt = SOME minInt val maxInt = SOME maxInt val fromLarge = check o fromLarge val fromInt = check o fromInt val ~ = check o ~ val op * = check o op * val op + = check o op + val op - = check o op - val op div = check o op div val op mod = check o op mod val quot = check o quot val rem = check o rem val abs = check o abs fun scan' r g s = case scan r g s of NONE => NONE | SOME (i, s) => SOME (check i, s) val scan = scan' val fromString = Option.map check o fromString end; local fun convInt s = let val radix = if String.size s >= 3 andalso String.substring(s, 0, 2) = "0x" orelse String.size s >= 4 andalso String.substring(s, 0, 3) = "~0x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (Int32.scan radix) s of NONE => raise RunCall.Conversion "Invalid integer constant" | SOME res => res end fun pretty _ _ x = PolyML.PrettyString (Int32.toString x) in val () = RunCall.addOverload convInt "convInt" val () = PolyML.addPrettyPrinter pretty end; val () = RunCall.addOverload Int32.~ "~"; val () = RunCall.addOverload Int32.+ "+"; val () = RunCall.addOverload Int32.- "-"; val () = RunCall.addOverload Int32.* "*"; val () = RunCall.addOverload Int32.div "div"; val () = RunCall.addOverload Int32.mod "mod"; val () = RunCall.addOverload Int32.< "<"; val () = RunCall.addOverload Int32.> ">"; val () = RunCall.addOverload Int32.<= "<="; val () = RunCall.addOverload Int32.>= ">="; val () = RunCall.addOverload Int32.abs "abs"; polyml-5.6/basis/IntArray.sml000066400000000000000000000031031265146633400162560ustar00rootroot00000000000000(* Title: Standard Basis Library: IntArray and IntVector Structures Author: David Matthews Copyright David Matthews 1999-2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: no change. Added slice versions. *) structure IntVector: MONO_VECTOR = struct open Vector type vector = int vector and elem = int end; structure IntArray: MONO_ARRAY = struct open Array type vector = int vector and array = int array and elem = int end; structure IntVectorSlice: MONO_VECTOR_SLICE = struct open VectorSlice type slice = int slice and vector = IntVector.vector and elem = int end; structure IntArraySlice: MONO_ARRAY_SLICE = struct open ArraySlice type slice = int slice and vector = IntVector.vector and array = IntArray.array and elem = int and vector_slice = IntVectorSlice.slice end; polyml-5.6/basis/IntArray2.sml000066400000000000000000000107111265146633400163430ustar00rootroot00000000000000(* Title: Standard Basis Library: Mono_Array2 signature and structures. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: no change. *) signature MONO_ARRAY2 = sig eqtype array type elem type vector type region = { base : array, row : int, col : int, nrows : int option, ncols : int option } datatype traversal = datatype Array2.traversal val array : int * int * elem -> array val fromList : elem list list -> array val tabulate : traversal -> int * int * (int * int -> elem) -> array val sub : array * int * int -> elem val update : array * int * int * elem -> unit val dimensions : array -> int * int val nCols : array -> int val nRows : array -> int val row: array * int -> vector val column: array * int -> vector val copy: { src : region, dst : array, dst_row : int, dst_col : int } -> unit val appi: Array2.traversal -> (int * int * elem -> unit) -> region -> unit val app: Array2.traversal -> (elem -> unit) -> array -> unit val modifyi: Array2.traversal -> (int * int * elem -> elem) -> region -> unit val modify: Array2.traversal -> (elem -> elem) -> array -> unit val foldi: Array2.traversal -> (int * int * elem * 'b -> 'b) -> 'b -> region -> 'b val fold: Array2.traversal -> (elem * 'b -> 'b) -> 'b -> array -> 'b end; (* All these are simply defined in terms of Array2, at least for the moment. *) structure Word8Array2 : MONO_ARRAY2 where type vector = Word8Vector.vector where type elem = Word8.word = struct open Array2 type elem = Word8.word type vector = Word8Vector.vector type elem = Word8.word type array = elem array type region = elem region (* Have to redefine row and column in terms of Word8Vector. *) fun row(a, i) = Word8Vector.tabulate(nCols a, fn j => sub(a, i, j)) and column(a, j) = Word8Vector.tabulate(nRows a, fn i => sub(a, i, j)) end; structure CharArray2 : MONO_ARRAY2 where type vector = CharVector.vector where type elem = char = struct open Array2 type elem = char type vector = CharVector.vector type array = elem array type region = elem region fun row(a, i) = CharVector.tabulate(nCols a, fn j => sub(a, i, j)) and column(a, j) = CharVector.tabulate(nRows a, fn i => sub(a, i, j)) end; structure BoolArray2 : MONO_ARRAY2 where type vector = BoolVector.vector where type elem = bool = struct open Array2 type elem = bool type vector = BoolVector.vector type array = elem array type region = elem region fun row(a, i) = BoolVector.tabulate(nCols a, fn j => sub(a, i, j)) and column(a, j) = BoolVector.tabulate(nRows a, fn i => sub(a, i, j)) end; structure IntArray2 : MONO_ARRAY2 where type vector = IntVector.vector where type elem = int = struct open Array2 type elem = int type vector = IntVector.vector type array = elem array type region = elem region fun row(a, i) = IntVector.tabulate(nCols a, fn j => sub(a, i, j)) and column(a, j) = IntVector.tabulate(nRows a, fn i => sub(a, i, j)) end; structure RealArray2 : MONO_ARRAY2 where type vector = RealVector.vector where type elem = real = struct open Array2 type elem = real type vector = RealVector.vector type array = elem array type region = elem region fun row(a, i) = RealVector.tabulate(nCols a, fn j => sub(a, i, j)) and column(a, j) = RealVector.tabulate(nRows a, fn i => sub(a, i, j)) end; polyml-5.6/basis/IntInf.sml000066400000000000000000000105741265146633400157260ustar00rootroot00000000000000(* Title: Standard Basis Library: IntInf structure and signature. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature INT_INF = sig include INTEGER val divMod : int * int -> int * int val quotRem : int * int -> int * int val pow : int * Int.int -> int val log2 : int -> Int.int val orb : int * int -> int val xorb : int * int -> int val andb : int * int -> int val notb : int -> int val << : int * Word.word -> int val ~>> : int * Word.word -> int end; structure IntInf : INT_INF = struct open RuntimeCalls; val quotRem: int*int->int*int = RunCall.run_call2C2 POLY_SYS_quotrem (* This should really be defined in terms of quotRem. *) fun divMod(i, j) = (i div j, i mod j) (* Return the position of the highest bit set in the value. *) local val isShort: int -> bool = RunCall.run_call1 POLY_SYS_is_short val loadByte: int*int->word = RunCall.run_call2 POLY_SYS_load_byte val segLength: int -> int = RunCall.run_call1 POLY_SYS_get_length (* Compute log2 for a short value. The top bit of i will always be zero since we've checked that it's positive so it will always terminate. *) fun log2Word(i: word, j: word, n: int) = if Word.>(j, i) then n-1 else log2Word(i, Word.<<(j, 0w1), n+1) (* The value is represented as little-endian byte segment. High-order bytes may be zero so we work back until we find a non-zero byte and then find the bit-position within it. *) fun log2Long(i, byte) = let val b = loadByte(i, byte) in if b = 0w0 then log2Long(i, byte-1) else log2Word(b, 0w2, 1) + byte*8 end in fun log2 i = if i <= 0 then raise Domain else if isShort i then log2Word(Word.fromInt i, 0w2, 1) else (* i is actually a pointer to a byte segment. *) let val bytes = segLength i * RunCall.unsafeCast LibrarySupport.wordSize in log2Long(i, bytes-1) end end (* These are implemented in the RTS. *) val orb : int * int -> int = RunCall.run_call2 POLY_SYS_ora val xorb : int * int -> int = RunCall.run_call2 POLY_SYS_xora val andb : int * int -> int = RunCall.run_call2 POLY_SYS_anda (* notb is defined as ~ (i+1) and there doesn't seem to be much advantage in implementing it any other way. *) fun notb i = ~(i + 1) fun pow(i, j) = let fun power(acc, _, 0) = acc | power(acc, n, i) = power(if andb(i, 1) = 1 then acc*n else acc, n*n, Int.quot(i, 2)) in if j < 0 then (* Various exceptional cases. *) ( if i = 0 then raise Div else if i = 1 then 1 else if i = ~1 then if andb(j, 1) = 0 then (*even*) 1 else (*odd*) ~1 else 0 ) else power(1, i, j) end (* These could be implemented in the RTS although I doubt if it's really worth it. *) local val maxShift = Word.fromInt Word.wordSize val fullShift = pow(2, Word.wordSize) in fun << (i: int, j: Word.word) = if j < maxShift then i * Word.toInt(Word.<<(0w1, j)) else <<(i * fullShift, j-maxShift) end fun ~>> (i: int, j: Word.word) = Int.div(i, pow(2, Word.toInt j)) open Int (* Inherit everything from Int. Do this last because it overrides the overloaded functions. *) end; polyml-5.6/basis/LargeWord.sml000066400000000000000000000610271265146633400164240ustar00rootroot00000000000000(* Title: Standard Basis Library: Word and LargeWord Structure Author: David Matthews Copyright David Matthews 1999, 2005, 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This file contains definitions of both LargeWord and Word. SysWord is defined to be LargeWord. The only purpose of LargeWord is so that it can be used, as SysWord, to hold the full machine word values for certain operating-system calls. *) (* This uses the global definition of type "word" made in the compiler. That type has special status as the default for literals of the form 0wn in the absence of any other type information. It also uses the definition of LargeWord.word that the compiler puts into the Bootstrap structure. This has to be done by the compiler because there is currently no way to introduce a new type with a specific equality function. *) local open RuntimeCalls; type largeword = Bootstrap.word (* Extract a word value from a character stream. *) (* There's a complication here which is similar to that with 0x for Int.scan. A word value may, optionally, be preceded by 0w or for hex values 0wx, 0wX, 0x or 0X. Since this is optional it is possible for the value after the 0w to be anything, not just a valid number, in which case the result is the 0 and the continuation is w... *) fun scanWord radix getc src = let (* Some of this code duplicates code in Int.scan. It would be better to avoid that if we could. The difficulty is that Int.scan allows the number to begin with a sign and also another 0x for hex values. *) val base = case radix of StringCvt.BIN => 2 | StringCvt.OCT => 8 | StringCvt.DEC => 10 | StringCvt.HEX => 16 (* Read the digits, accumulating the result in acc. isOk is true once we have read a valid digit. *) fun read_digits src acc isOk = case getc src of NONE => if isOk then SOME(acc, src) else NONE | SOME(ch, src') => if Char.ord ch >= Char.ord #"0" andalso Char.ord ch < (Char.ord #"0" + base) then read_digits src' (acc*base + Char.ord ch - Char.ord #"0") true else (* Invalid character - either end of number or bad no. *) if isOk then SOME(acc, src) else NONE fun read_hex_digits src acc isOk = case getc src of NONE => if isOk then SOME(acc, src) else NONE | SOME(ch, src') => if Char.ord ch >= Char.ord #"0" andalso Char.ord ch <= Char.ord #"9" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"0") true else if Char.ord ch >= Char.ord #"A" andalso Char.ord ch <= Char.ord #"F" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"A" + 10) true else if Char.ord ch >= Char.ord #"a" andalso Char.ord ch <= Char.ord #"f" then read_hex_digits src' (acc*16 + Char.ord ch - Char.ord #"a" + 10) true else (* Invalid character - either end of number or bad no. *) if isOk then SOME(acc, src) else NONE fun read_number src = case radix of StringCvt.HEX => read_hex_digits src 0 false | _ => (* Binary, octal and decimal *) read_digits src 0 false in case getc src of NONE => NONE | SOME(#"0", src') => let (* May be the start of the number or may be 0w, 0x etc. *) val after0 = case getc src' of NONE => NONE | SOME(ch, src'') => if ch = #"w" then if radix = StringCvt.HEX then (* Is it 0wx, 0wX ? *) ( case getc src'' of NONE => NONE | SOME(ch, src''') => if ch = #"x" orelse ch = #"X" then read_number src''' (* Skip the 0wx *) else read_number src'' (* Skip the 0w *) ) else read_number src'' (* Skip the 0w *) else if (ch = #"x" orelse ch = #"X") andalso radix = StringCvt.HEX then read_number src'' else read_number src (* Include the 0 in the input *) in (* If the string *) case after0 of NONE => (* No valid number after it, return the zero .*) SOME(0, src') | res => res end | SOME(ch, src') => if Char.isSpace ch (* Skip white space. *) then scanWord radix getc src' (* Recurse *) else (* See if it's a valid digit. *) read_number src end (* scanWord *) (* Conversion from integer may involve extracting the low-order word from a long-integer representation. *) local (* Load the first word of a long form arbitrary precision number which is always little-endian, tag it and negate it if necessary. *) val getFirstWord: int -> word = RunCall.run_call1 POLY_SYS_get_first_long_word in (* We previously had a single RTS function to do this. I've replaced that by this code. Since most of the time we're going to be converting short integers this will avoid making an RTS call. getFirstWord can be implemented in the code-generator fairly easily on little-endian machines but it's too difficult to do it on the Sparc. *) fun wordFromInt (i: int): word = if LibrarySupport.isShortInt i then RunCall.unsafeCast i else getFirstWord i end (* The maximum word is the largest tagged value. The maximum large-word is the largest value that will fit in a machine word. *) val zero = (* 0w *) wordFromInt 0 local fun power2' n 0 = n | power2' n i = power2' (2*n) (i-1) val power2 = power2' 1 val bitsInWord: int = (RunCall.unsafeCast LibrarySupport.wordSize) * 8 in val wordSize = bitsInWord - 1 (* 31 or 63 bits *) val maxWordP1 = power2 wordSize (* One more than the maximum word *) val maxWord = maxWordP1 - 1 val largeWordSize = bitsInWord val maxLargeWord = power2 largeWordSize - 1 val largeWordTopBit = maxWordP1 (* The top bit of a large word *) val maxWordAsWord = wordFromInt maxWord end structure Words :> sig (* The result signatures are quite complicated because the general signature includes LargeWord.word and Word.word explicitly in a few cases. We have to make variants of them to handle the fact that we are declaring Word and LargeWord. *) type smallword = word type largeword structure Word: sig type word = word val wordSize : int val toLarge : word -> largeword val toLargeX : word -> largeword val toLargeWord : word -> largeword val toLargeWordX : word -> largeword val fromLarge : largeword -> word val fromLargeWord : largeword -> word val toLargeInt : word -> LargeInt.int val toLargeIntX : word -> LargeInt.int val fromLargeInt : LargeInt.int -> word val toInt : word -> Int.int val toIntX : word -> Int.int val fromInt : Int.int -> word val orb : (word * word) -> word val xorb : (word * word) -> word val andb : (word * word) -> word val notb : word -> word val << : (word * word) -> word val >> : (word * word) -> word val ~>> : (word * word) -> word val + : (word * word) -> word val - : (word * word) -> word val * : (word * word) -> word val div : (word * word) -> word val mod : (word * word) -> word val ~ : word -> word val compare : (word * word) -> General.order val > : (word * word) -> bool val < : (word * word) -> bool val >= : (word * word) -> bool val <= : (word * word) -> bool val min : (word * word) -> word val max : (word * word) -> word val fmt : StringCvt.radix -> word -> string val toString : word -> string val fromString : string -> word option val scan : StringCvt.radix -> (char, 'a) StringCvt.reader -> 'a -> (word * 'a) option end and LargeWord: sig eqtype word val wordSize : int val toLarge : word -> word val toLargeX : word -> word val toLargeWord : word -> word val toLargeWordX : word -> word val fromLarge : word -> word val fromLargeWord : word -> word val toLargeInt : word -> LargeInt.int val toLargeIntX : word -> LargeInt.int val fromLargeInt : LargeInt.int -> word val toInt : word -> Int.int val toIntX : word -> Int.int val fromInt : Int.int -> word val orb : (word * word) -> word val xorb : (word * word) -> word val andb : (word * word) -> word val notb : word -> word val << : (word * smallword) -> word val >> : (word * smallword) -> word val ~>> : (word * smallword) -> word val + : (word * word) -> word val - : (word * word) -> word val * : (word * word) -> word val div : (word * word) -> word val mod : (word * word) -> word val ~ : word -> word val compare : (word * word) -> General.order val > : (word * word) -> bool val < : (word * word) -> bool val >= : (word * word) -> bool val <= : (word * word) -> bool val min : (word * word) -> word val max : (word * word) -> word val fmt : StringCvt.radix -> word -> string val toString : word -> string val fromString : string -> word option val scan : StringCvt.radix -> (char, 'a) StringCvt.reader -> 'a -> (word * 'a) option end (* These sharing constraints ensure that although we are using opaque matching we retain the correct sharing. *) sharing type LargeWord.word = largeword (* Abstract *) end = struct type largeword = largeword and smallword = word structure Word = struct (* Word.word is represented using the short (tagged) integer format. It is, though, unsigned so large word values are represented in the same form as negative integers. *) type word = word val fromInt = wordFromInt and wordSize = wordSize (* Conversion to signed integer is simple. *) val toIntX: word->int = RunCall.unsafeCast (* Conversion to unsigned integer has to treat values with the sign bit set specially. *) fun toInt x = let val signed = toIntX x in if signed < 0 then maxWordP1+signed else signed end fun scan radix getc src = case scanWord radix getc src of NONE => NONE | SOME(res, src') => if res > maxWord then raise General.Overflow else SOME(fromInt res, src') (* TODO: Implement this directly? *) val fromString = StringCvt.scanString (scan StringCvt.HEX) val toLargeInt : word -> LargeInt.int = toInt and toLargeIntX : word -> LargeInt.int = toIntX and fromLargeInt : LargeInt.int -> word = fromInt infix >> << ~>> val op + : word*word->word = RunCall.run_call2 POLY_SYS_plus_word and op - : word*word->word = RunCall.run_call2 POLY_SYS_minus_word and op * : word*word->word = RunCall.run_call2 POLY_SYS_mul_word and op div : word*word->word = RunCall.run_call2 POLY_SYS_div_word and op mod : word*word->word = RunCall.run_call2 POLY_SYS_mod_word and orb : word*word->word = RunCall.run_call2 POLY_SYS_or_word and andb : word*word->word = RunCall.run_call2 POLY_SYS_and_word and xorb : word*word->word = RunCall.run_call2 POLY_SYS_xor_word and op >> : word*word->word = RunCall.run_call2 POLY_SYS_shift_right_word and op << : word*word->word = RunCall.run_call2 POLY_SYS_shift_left_word and op ~>> : word*word->word = RunCall.run_call2 POLY_SYS_shift_right_arith_word val toLargeWord: word->largeword = RunCall.run_call1 POLY_SYS_unsigned_to_longword and toLargeWordX: word->largeword = RunCall.run_call1 POLY_SYS_signed_to_longword and fromLargeWord: largeword->word = RunCall.run_call1 POLY_SYS_longword_to_tagged fun ~ x = zero - x val toLarge = toLargeWord and toLargeX = toLargeWordX and fromLarge = fromLargeWord fun notb x = xorb(maxWordAsWord, x) (* We can format the result using the integer format function. *) fun fmt radix i = Int.fmt radix (toInt i) val toString = fmt StringCvt.HEX val op > : word*word->bool = RunCall.run_call2 POLY_SYS_word_gtr and op < : word*word->bool = RunCall.run_call2 POLY_SYS_word_lss and op >= : word*word->bool = RunCall.run_call2 POLY_SYS_word_geq and op <= : word*word->bool = RunCall.run_call2 POLY_SYS_word_leq fun compare (i, j) = if i < j then General.LESS else if i > j then General.GREATER else General.EQUAL fun min (i, j) = if i < j then i else j and max (i, j) = if i > j then i else j end (* Word *) (* LargeWord.word values have one more bit of precision than Word,word values and are always "boxed" i.e. held in a one word piece of memory with the "byte" bit set. *) structure LargeWord = struct type word = largeword val wordSize = largeWordSize (* As this is LargeWord we don't need to do anything here. *) fun toLargeWord x = x and toLargeWordX x = x and fromLargeWord x = x val toLarge = toLargeWord and toLargeX = toLargeWordX and fromLarge = fromLargeWord (* Logical operations. Declare these first so they can be used in fromInt etc but leave the arithmetic operations until later. *) val orb : word*word->word = RunCall.run_call2 POLY_SYS_orb_longword and andb : word*word->word = RunCall.run_call2 POLY_SYS_andb_longword and xorb : word*word->word = RunCall.run_call2 POLY_SYS_xorb_longword and op >> : word*Word.word->word = RunCall.run_call2 POLY_SYS_shift_right_longword and op << : word*Word.word->word = RunCall.run_call2 POLY_SYS_shift_left_longword and op ~>> : word*Word.word->word = RunCall.run_call2 POLY_SYS_shift_right_arith_longword local val shortToWord: int -> largeword = RunCall.run_call1 POLY_SYS_signed_to_longword val getFirstWord: int -> Word.word = RunCall.run_call1 POLY_SYS_get_first_long_word val longToInt: largeword -> int = RunCall.run_call1 POLY_SYS_longword_to_tagged val zero: largeword = shortToWord 0 val andbInt : int * int -> int = RunCall.run_call2 POLY_SYS_anda infix << orb andb val topBitAsLargeWord: largeword = (* The top bit *) shortToWord 1 << Word.fromInt(largeWordSize - 1) fun topBitClear (x: largeword) : bool = (x andb topBitAsLargeWord) = zero in (* If it is short we just need to sign-extend it when storing it into memory. If it is long it's more complicated. getFirstWord returns the tagged value, possibly negated, but loses the high-order bit. That has to be put back. *) fun fromInt x = if LibrarySupport.isShortInt x then shortToWord x else let val lo = Word.toLargeWord(getFirstWord x) in (* TODO: Testing this bit will currently require an RTS call *) if andbInt(x, largeWordTopBit) = 0 then lo else topBitAsLargeWord orb lo end and toInt x = let val asInt: int = longToInt x in (if asInt < 0 then maxWordP1 + asInt else asInt) + (if topBitClear x then 0 else largeWordTopBit) end and toIntX x = let val asInt: int = longToInt x in (if asInt < 0 then maxWordP1 + asInt else asInt) - (if topBitClear x then 0 else largeWordTopBit) end val zero = zero val maxLargeWordAsLargeWord = fromInt maxLargeWord end val toLargeInt = toInt val toLargeIntX = toIntX val fromLargeInt = fromInt fun scan radix getc src = case scanWord radix getc src of NONE => NONE | SOME(res, src') => if res > maxLargeWord then raise General.Overflow else SOME(fromInt res, src') val fromString = StringCvt.scanString (scan StringCvt.HEX) val op + : word*word->word = RunCall.run_call2 POLY_SYS_plus_longword and op - : word*word->word = RunCall.run_call2 POLY_SYS_minus_longword and op * : word*word->word = RunCall.run_call2 POLY_SYS_mul_longword and op div : word*word->word = RunCall.run_call2 POLY_SYS_div_longword and op mod : word*word->word = RunCall.run_call2 POLY_SYS_mod_longword fun ~ x = zero - x fun notb x = xorb(maxLargeWordAsLargeWord, x) val op > : word*word->bool = RunCall.run_call2 POLY_SYS_gt_longword and op < : word*word->bool = RunCall.run_call2 POLY_SYS_lt_longword and op >= : word*word->bool = RunCall.run_call2 POLY_SYS_geq_longword and op <= : word*word->bool = RunCall.run_call2 POLY_SYS_leq_longword fun compare (i, j) = if i < j then General.LESS else if i > j then General.GREATER else General.EQUAL fun min (i, j) = if i < j then i else j and max (i, j) = if i > j then i else j (* We can format the result using the integer format function. *) fun fmt radix i = Int.fmt radix (toInt i) val toString = fmt StringCvt.HEX end; end (* Words *) local (* Install the pretty printer for Word.word *) fun prettyWord _ _ x = PolyML.PrettyString("0wx" ^ Words.Word.toString x) and prettyLarge _ _ x = PolyML.PrettyString("0wx" ^ Words.LargeWord.toString x) in val () = PolyML.addPrettyPrinter prettyWord val () = PolyML.addPrettyPrinter prettyLarge end in structure Word = Words.Word; structure LargeWord = Words.LargeWord; end; (* Converter to word values. These must be installed outside the structure because they depend on the type identifiers. *) local (* The string may be either 0wnnn or 0wxXXX *) fun getRadix s = if String.size s > 2 andalso String.sub(s, 2) = #"x" then StringCvt.HEX else StringCvt.DEC fun convWord s = let val radix = getRadix s in case StringCvt.scanString (Word.scan radix) s of NONE => raise RunCall.Conversion "Invalid word constant" | SOME res => res end and convLarge s = let val radix = getRadix s in case StringCvt.scanString (LargeWord.scan radix) s of NONE => raise RunCall.Conversion "Invalid word constant" | SOME res => res end in (* Install this as a conversion function for word literals. Unlike other overloaded functions there's no need to ensure that overloaded conversion functions are installed at the top-level. The compiler has type "word" built in and will use this conversion function for literals of the form 0w... in preference to any other (e.g. for Word8.word) if unification does not give an explicit type. However, because LargeWord.word is abstract we have to install the convertor outside the structure. *) val () = RunCall.addOverload convWord "convWord" val () = RunCall.addOverload convLarge "convWord" end; (* Add the overloaded operators. Do this outside the structure so that we can capture the inline code. We've already done this for word (=Word.word) in the prelude. *) val () = RunCall.addOverload LargeWord.~ "~"; val () = RunCall.addOverload LargeWord.+ "+"; val () = RunCall.addOverload LargeWord.- "-"; val () = RunCall.addOverload LargeWord.* "*"; val () = RunCall.addOverload LargeWord.div "div"; val () = RunCall.addOverload LargeWord.mod "mod"; val () = RunCall.addOverload LargeWord.< "<"; val () = RunCall.addOverload LargeWord.> ">"; val () = RunCall.addOverload LargeWord.<= "<="; val () = RunCall.addOverload LargeWord.>= ">="; (* This signature is defined in terms of Word and LargeWord so we have to define it after the structures. *) signature WORD = sig eqtype word val wordSize : int val toLarge : word -> LargeWord.word val toLargeX : word -> LargeWord.word val toLargeWord : word -> LargeWord.word val toLargeWordX : word -> LargeWord.word val fromLarge : LargeWord.word -> word val fromLargeWord : LargeWord.word -> word val toLargeInt : word -> LargeInt.int val toLargeIntX : word -> LargeInt.int val fromLargeInt : LargeInt.int -> word val toInt : word -> Int.int val toIntX : word -> Int.int val fromInt : Int.int -> word val orb : (word * word) -> word val xorb : (word * word) -> word val andb : (word * word) -> word val notb : word -> word val << : (word * Word.word) -> word val >> : (word * Word.word) -> word val ~>> : (word * Word.word) -> word val + : (word * word) -> word val - : (word * word) -> word val * : (word * word) -> word val div : (word * word) -> word val mod : (word * word) -> word val ~ : word -> word val compare : (word * word) -> General.order val > : (word * word) -> bool val < : (word * word) -> bool val >= : (word * word) -> bool val <= : (word * word) -> bool val min : (word * word) -> word val max : (word * word) -> word val fmt : StringCvt.radix -> word -> string val toString : word -> string val fromString : string -> word option val scan : StringCvt.radix -> (char, 'a) StringCvt.reader -> (word, 'a) StringCvt.reader end; polyml-5.6/basis/LibraryIOSupport.sml000066400000000000000000000375351265146633400177760ustar00rootroot00000000000000(* Title: Standard Basis Library: IO Support functions Copyright David C.J. Matthews 2000, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This function provides wrappers for the RTS file descriptors to construct TextPrimIO and BinPrimIO readers and writers. It is used both from the TextIO and BinIO structures and also from the Windows and Unix structures to wrap up pipes. *) structure LibraryIOSupport: sig val wrapInFileDescr : { fd : OS.IO.iodesc, name : string, initBlkMode : bool } -> TextPrimIO.reader val wrapOutFileDescr : { fd : OS.IO.iodesc, name : string, appendMode : bool, initBlkMode : bool, chunkSize : int } -> TextPrimIO.writer val wrapBinInFileDescr : { fd : OS.IO.iodesc, name : string, initBlkMode : bool } -> BinPrimIO.reader val wrapBinOutFileDescr : { fd : OS.IO.iodesc, name : string, appendMode : bool, initBlkMode : bool, chunkSize : int } -> BinPrimIO.writer val readBinVector: OS.IO.iodesc * int -> Word8Vector.vector val readBinArray: OS.IO.iodesc * Word8ArraySlice.slice -> int val writeBinVec: OS.IO.iodesc * Word8VectorSlice.slice -> int val writeBinArray: OS.IO.iodesc * Word8ArraySlice.slice -> int val nonBlocking : ('a->'b) -> 'a ->'b option val protect: Thread.Mutex.mutex -> ('a -> 'b) -> 'a -> 'b end = struct (* open IO *) open RuntimeCalls type address = LibrarySupport.address type fileDescr = OS.IO.iodesc (* Called after any exception in the lower level reader or writer to map any exception other than Io into Io. *) local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_close (strm: fileDescr): unit = doIo(7, strm, 0) and sys_block_in(strm: fileDescr): unit = doIo(27, strm, 0) and sys_block_out(strm: fileDescr): unit = doIo(29, strm, 0) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_read_text (strm: fileDescr, vil: address*word*word): int = doIo(8, strm, vil) fun sys_write_text (strm: fileDescr, vil: address*word*word): int = doIo(11, strm, vil) fun sys_read_bin (strm: fileDescr, vil: address*word*word): int = doIo(9, strm, vil) fun sys_write_bin (strm: fileDescr, vil: address*word*word): int = doIo(12, strm, vil) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_read_string (strm: fileDescr, len: int): string = doIo(10, strm, len) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun readBinVector (strm: fileDescr, len: int): Word8Vector.vector = doIo(26, strm, len) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_get_buffsize (strm: fileDescr): int = doIo(15, strm, 0) and sys_can_input(strm: fileDescr): int = doIo(16, strm, 0) and sys_can_output(strm: fileDescr): int = doIo(28, strm, 0) and sys_avail(strm: fileDescr): int = doIo(17, strm, 0) and sys_get_pos(strm: fileDescr): int = doIo(18, strm, 0) and sys_set_pos(strm: fileDescr, p: int): unit = (doIo(19, strm, p); ()) and sys_end_pos(strm: fileDescr): int = doIo(20, strm, 0) and sys_get_iodesc(strm: fileDescr): int = doIo(30, strm, 0) end local (* Find out the error which will be generated if a stream in non-blocking mode would block. *) val eAgain = OS.syserror "EAGAIN" and eWouldBlock = OS.syserror "EWOULDBLOCK" and eInProgress = OS.syserror "EINPROGRESS" in (* If evaluating the function raises EAGAIN or EWOULDBLOCK we return NONE otherwise if it succeeds return SOME result. Pass other exceptions back to the caller. *) fun nonBlocking f arg = SOME(f arg) handle exn as OS.SysErr(_, SOME e) => if (case eAgain of SOME again => e = again | NONE => false) then NONE else if (case eWouldBlock of SOME wouldBlock => e = wouldBlock | NONE => false) then NONE else if (case eInProgress of SOME inProgress => e = inProgress | NONE => false) then NONE else raise exn end val wordSize : word = LibrarySupport.wordSize; (* Find out if random access is permitted and return the appropriate values. *) fun getRandAccessFns n = let val isRandomAccess = ((sys_get_pos n; true) handle OS.SysErr _ => false) val getPos = if isRandomAccess then SOME(fn () => sys_get_pos n) else NONE val setPos = if isRandomAccess then SOME(fn p => sys_set_pos(n, p)) else NONE val endPos = if isRandomAccess then SOME(fn () => sys_end_pos n) else NONE in (getPos, setPos, endPos) end fun writeBinArray (n: fileDescr, slice: Word8ArraySlice.slice): int = let val (buf, i, len) = Word8ArraySlice.base slice val LibrarySupport.Word8Array.Array(_, v) = buf val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len in sys_write_bin(n, (v, iW, lenW)) end fun readBinArray (n: fileDescr, slice: Word8ArraySlice.slice): int = let val (buf, i, len) = Word8ArraySlice.base slice val LibrarySupport.Word8Array.Array(_, v) = buf val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len val iW = LibrarySupport.unsignedShortOrRaiseSubscript i in sys_read_bin(n, (v, iW, lenW)) end (* Write out a string using the underlying call. Note that we have to add the size of a word to the offsets to skip the length word. The underlying call deals with the special case of a single character string where the "string" is actually the character itself. *) fun writeBinVec (n: fileDescr, slice: Word8VectorSlice.slice): int = let val (buf, i, len) = Word8VectorSlice.base slice val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len in sys_write_bin(n, (LibrarySupport.w8vectorAsAddress buf, iW+wordSize, lenW)) end (* Create the primitive IO functions and add the higher layers. For all file descriptors other than standard input we look at the stream to see if we can do non-blocking input and/or random access. Standard input, though is persistent and so we have to take a more restrictive view. *) fun wrapInFileDescr{ fd, name, initBlkMode } = let fun readArray (slice: CharArraySlice.slice): int = let val (buf, i, len) = CharArraySlice.base slice val LibrarySupport.CharArray.Array(_, v) = buf val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len in sys_read_text(fd, (v, iW, lenW)) end fun readVector l = sys_read_string(fd, l) (* If we have opened the stream in non-blocking mode readVec and readArray will raise an exception if they would block. We have to handle that. The blocking functions can be constructed using block_in but that should be done by augmentReader. *) val (readVec, readArr, readVecNB, readArrNB) = if initBlkMode then (SOME readVector, SOME readArray, NONE, NONE) else (NONE, NONE, SOME(nonBlocking readVector), SOME(nonBlocking readArray)) (* Don't allow random access on stdIn. The reason is that we create stdIn when we compile TextIO yet this stream is persistent (unlike every other stream). *) val (getPos, setPos, endPos) = if sys_get_iodesc fd <= 2 then (NONE, NONE, NONE) else getRandAccessFns fd (* Unlike the other functions "avail" is a function returning an option, not an optional function. *) fun avail () = let (* If we get an exception or a negative number return NONE. *) val v = sys_avail fd handle OS.SysErr _ => ~1 in if v >= 0 then SOME v else NONE end val textPrimRd = TextPrimIO.RD { name = name, chunkSize = sys_get_buffsize fd, readVec = readVec, readArr = readArr, readVecNB = readVecNB, readArrNB = readArrNB, block = SOME(fn () => sys_block_in fd), canInput = SOME (fn () => sys_can_input fd > 0), avail = avail, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = getPos, close = fn () => sys_close fd, ioDesc = (SOME fd) : OS.IO.iodesc option } in TextPrimIO.augmentReader textPrimRd end fun wrapOutFileDescr {fd, name, appendMode, initBlkMode, chunkSize} = let fun writeArray (slice: CharArraySlice.slice): int = let val (buf, i, len) = CharArraySlice.base slice val LibrarySupport.CharArray.Array(_, v) = buf val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len in sys_write_text(fd, (v, iW, lenW)) end (* Write out a string using the underlying call. Note that we have to add the size of a word to the offsets to skip the length word. The underlying call deals with the special case of a single character string where the "string" is actually the character itself. *) fun writeVector (slice: CharVectorSlice.slice): int = let val (buf, i, len) = CharVectorSlice.base slice val v = LibrarySupport.stringAsAddress buf val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lenW = LibrarySupport.unsignedShortOrRaiseSubscript len in sys_write_text(fd, (v, iW+wordSize, lenW)) end (* Set up the writers depending on whether the stream is in non-blocking mode or not. *) val (writeVec, writeArr, writeVecNB, writeArrNB) = if initBlkMode then (SOME writeVector, SOME writeArray, NONE, NONE) else (NONE, NONE, SOME(nonBlocking writeVector), SOME(nonBlocking writeArray)) (* Random access is provided if getPos works except that we don't allow it for standard output and standard error at all. *) val (getPos, setPos, endPos) = if sys_get_iodesc fd <= 2 then (NONE, NONE, NONE) else getRandAccessFns fd (* If we have opened the stream for append we will always write to the end of the stream so setPos won't work. *) val setPos = if appendMode then NONE else setPos val textPrimWr = TextPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = writeVecNB, writeArrNB = writeArrNB, block = SOME(fn () => sys_block_out fd), canOutput = SOME(fn () => sys_can_output fd > 0), getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = getPos, close = fn () => sys_close fd, ioDesc = (SOME fd) : OS.IO.iodesc option } in TextPrimIO.augmentWriter textPrimWr end fun wrapBinInFileDescr{fd, name, initBlkMode} = let fun readVector l = readBinVector(fd, l) and readArray b = readBinArray(fd, b) (* If we have opened the stream in non-blocking mode readVec and readArray will raise an exception if they would block. We have to handle that. The blocking functions can be constructed using block_in but that should be done by augmentReader. *) val (readVec, readArr, readVecNB, readArrNB) = if initBlkMode then (SOME readVector, SOME readArray, NONE, NONE) else (NONE, NONE, SOME(nonBlocking readVector), SOME(nonBlocking readArray)) (* Random access is provided if getPos works. *) val (getPos, setPos, endPos) = getRandAccessFns fd (* Unlike the other functions "avail" is a function returning an option, not an optional function. *) fun avail () = let (* If we get an exception or a negative number return NONE. *) val v = sys_avail fd handle OS.SysErr _ => ~1 in if v >= 0 then SOME v else NONE end val binPrimRd = BinPrimIO.RD { name = name, chunkSize = sys_get_buffsize fd, readVec = readVec, readArr = readArr, readVecNB = readVecNB, readArrNB = readArrNB, block = SOME(fn () => sys_block_in fd), canInput = SOME(fn() =>sys_can_input fd > 0), avail = avail, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = getPos, close = fn() => sys_close fd, ioDesc = SOME fd } in BinPrimIO.augmentReader binPrimRd end fun wrapBinOutFileDescr{fd, name, appendMode, initBlkMode, chunkSize} = let fun writeArray b = writeBinArray(fd, b) and writeVector b = writeBinVec(fd, b) (* Set up the writers depending on whether the stream is in non-blocking mode or not. *) val (writeVec, writeArr, writeVecNB, writeArrNB) = if initBlkMode then (SOME writeVector, SOME writeArray, NONE, NONE) else (NONE, NONE, SOME(nonBlocking writeVector), SOME(nonBlocking writeArray)) (* Random access is provided if getPos works. *) val (getPos, setPos, endPos) = getRandAccessFns fd (* If we have opened the stream for append we will always write to the end of the stream so setPos won't work. *) val setPos = if appendMode then NONE else setPos val binPrimWr = BinPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = writeVecNB, writeArrNB = writeArrNB, block = SOME(fn () => sys_block_out fd), canOutput = SOME(fn () => sys_can_output fd > 0), getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = getPos, close = fn () => sys_close fd, ioDesc = SOME fd } in BinPrimIO.augmentWriter binPrimWr end (* Many of the IO functions need a mutex so we include this here. This applies a function while a mutex is being held. *) val protect = ThreadLib.protect end; polyml-5.6/basis/LibrarySupport.sml000066400000000000000000000274571265146633400175500ustar00rootroot00000000000000(* Title: Standard Basis Library: Support functions Copyright David C.J. Matthews 2000, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* We need to execute these calls BEFORE compiling LibrarySupport if we want them to be compiled in as constants. *) structure MachineConstants = struct val bigEndian : bool = RunCall.run_call0 RuntimeCalls.POLY_SYS_is_big_endian (); val wordSize : word = RunCall.run_call0 RuntimeCalls.POLY_SYS_bytes_per_word (); end; structure LibrarySupport :> sig eqtype address (* eqtype so we can compare vectors. *) structure CharArray: sig datatype array = Array of word*address end structure Word8Array: sig datatype array = Array of word*address eqtype vector end val w8vectorToString: Word8Array.vector -> string and w8vectorFromString: string -> Word8Array.vector val wordSize: word val bigEndian: bool val allocString: word -> string (* Create a mutable string. *) val allocBytes: word -> address val unsafeStringSub: string*word -> char val unsafeSubstring: string*word*word -> string val stringImplode: char list -> string val stringExplode: string * word * word -> char list val isShortString : string -> bool val isShortInt : int -> bool val unsignedShortOrRaiseSize: int -> word val unsignedShortOrRaiseSubscript: int -> word val sizeAsWord : string -> word val stringAsAddress : string -> address val w8vectorAsAddress : Word8Array.vector -> address val maxAllocation: word val noOverwriteRef: 'a -> 'a ref end = struct (* An address is the address of a vector in memory. *) type address = Bootstrap.byteArray (* This forces pointer equality. *) local (* Add a pretty printer to avoid crashes during debugging. *) open PolyML fun prettyAddress _ _ (_: address) = PolyML.PrettyString "byteArray" in val () = addPrettyPrinter prettyAddress end (* Provide the implementation of CharArray.array, Word8Array.array and Word8Array.vector (= Word8Vector.vector) here so that they are available to the IO routines. *) structure CharArray = struct datatype array = Array of word*address end structure Word8Array = struct (* Using the Array constructor here does not add any overhead since it is compiled as an identity function. *) datatype array = Array of word*address (* The representation of Word8Vector.vector is the same as that of string. We define it as "string" here so that it inherits the same equality function. The representation is assumed by the RTS. *) type vector = string end (* Identity functions to provide convertions. *) fun w8vectorToString s = s and w8vectorFromString s = s (* There are circumstances when we want to pass the address of a string where we expect an address. *) val stringAsAddress : string -> address = RunCall.unsafeCast val w8vectorAsAddress = stringAsAddress o w8vectorToString open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open MachineConstants; (* If a vector/string is short (i.e. has an integer tag) it must be the character itself rather than a pointer to a segment. *) val isShortString: string -> bool = RunCall.run_call1 POLY_SYS_is_short local val F_mutable_bytes : word = 0wx41; val System_alloc: word*word*word->string = RunCall.run_call3 POLY_SYS_alloc_store val System_setb: string * word * char -> unit = RunCall.run_call3 POLY_SYS_assign_byte; val System_lock: string -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_loadb: string*word->char = RunCall.run_call2 POLY_SYS_load_byte; val SetLengthWord: string * word -> unit = RunCall.run_call2 POLY_SYS_set_string_length; val MemMove: string*word*string*word*word -> unit = RunCall.run_call5 POLY_SYS_move_bytes val maxString = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env (101, ()) (* These two functions are used to convert between single character strings and the character representation. *) val vecAsChar: string->char = RunCall.unsafeCast val charAsVec: char->string = RunCall.unsafeCast in (* Get the maximum allocation size. This is the maximum value that can fit in the length field of a segment. *) val maxAllocation = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env(100, ()) val isShortInt: int -> bool = RunCall.run_call1 POLY_SYS_is_short (* The length of a string is always a short integer so we can simply cast the result of "size". *) fun sizeAsWord(s: string) : word = RunCall.unsafeCast (size s) fun unsignedShortOrRaiseSize (i: int): word = if isShortInt i andalso i >= 0 then RunCall.unsafeCast i else raise Size fun unsignedShortOrRaiseSubscript (i: int): word = if isShortInt i andalso i >= 0 then RunCall.unsafeCast i else raise Subscript fun allocBytes bytes : address = let val System_alloc_array: word*word*word->address = RunCall.run_call3 POLY_SYS_alloc_store val words : word = if bytes = 0w0 then 0w1 (* Zero-sized objects are not allowed. *) else if bytes > maxString (* The maximum string size is slightly smaller than the maximum array size because strings have a length word. That means that System_alloc will not raise Size if "bytes" size is between maxString and maxString+3. It seems best to use the same maximum size for CharArray/Word8Array and for String/Word8Vector so we need to check here. *) then raise Size else (bytes + wordSize - 0w1) div wordSize in System_alloc_array(words, F_mutable_bytes, 0w0) end (* Allocate store for the string and set the first word to contain the length and the rest zero. *) fun allocString charsW = let (* The space is the number of characters plus space for the length word plus rounding. *) val words : word = (charsW + 0w2 * wordSize - 0w1) div wordSize val () = if words >= maxAllocation then raise Size else () (* We are relying on the allocator initialising the store since we only copy as many bytes as we have in the string, possibly leaving bytes in the last word unset. Generally that wouldn't be a problem, since we will use the string length word to find out how many real characters there are, except in the case of the structure equality function. It uses the segment length word and compares the whole of each word so we must ensure that two equal strings are equal in every WORD including any unused bytes at the end. It might be faster if we didn't want to initialise every byte to simply zero the last word of the segment. *) val vec = System_alloc(words, F_mutable_bytes, 0w0) in (* Set the length word. Since this is untagged we can't simply use assign_word.*) SetLengthWord(vec, charsW); vec end (* We need implode in StringCvt so we define it here rather than in String. *) fun stringImplode [] : string = "" | stringImplode (L as (H::_)) = let (* How many characters do we have to implode? *) val listLength = length L (* In practice we could never make a list with a combined length which was a long integer but we still check it here in unsignedShortOrRaiseSize. *) val chars: word = unsignedShortOrRaiseSize listLength in if chars = 0w1 then str H else let val dest = allocString chars; fun copy (_, []:char list) = () | copy (i, H :: T) = ( System_setb (dest, i, H); copy (i + 0w1, T) ) in copy (wordSize, L); System_lock dest; (* reset mutable flag *) dest end end (* We use stringExplode in String and Substring. *) fun stringExplode (s: string, i: word, l: word) : char list = let fun exp_str (num, res) = if num = 0w0 then res else exp_str (num - 0w1, System_loadb(s, num+i-0w1+wordSize) :: res) in (* Handle the special case of a single character string which is represented by the character itself. N.B. because we use this function to explode substrings as well as whole strings the test here needs to be whether the base string is short not whether l is one. If l is zero we use exp_str which immediately returns nil. *) if isShortString s andalso l <> 0w0 then [ vecAsChar s ] else exp_str (l, []) end (* We want this in both String and Substring. *) fun unsafeSubstring(s: string, i: word, l: word) : string = let val baseLen = sizeAsWord s (* Length of base string. *) in if i = 0w0 andalso l = baseLen then s else if l = 0w0 then "" (* Empty string. *) else if l = 0w1 (* Result is a single character string (and s isn't). *) then charAsVec(System_loadb(s, i + wordSize)) else let (* Multiple character string. *) val vec = allocString l in MemMove(s, wordSize+i, vec, wordSize, l); System_lock vec; vec end end (* This can be used where we have already checked the range. *) fun unsafeStringSub(s: string, i: word): char = if isShortString s then RunCall.unsafeCast s else System_loadb(s, i + wordSize) (* Create non-overwritable mutables for mutexes and condition variables. A non-overwritable mutable in the executable or a saved state is not overwritten when a saved state further down the hierarchy is loaded. This is also used for imperative streams, really only so that stdIn works properly across SaveState.loadState calls. *) fun noOverwriteRef (a: 'a) : 'a ref = RunCall.unsafeCast(System_alloc(0w1, 0wx48, RunCall.unsafeCast a)) end end; polyml-5.6/basis/List.sml000066400000000000000000000147131265146633400154510ustar00rootroot00000000000000(* Title: Standard Basis Library: List Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Updated. *) signature LIST = sig datatype list = datatype list (* G&R include the definition of list below in their "Interface". This is illegal. *) (*datatype 'a list = nil | :: of 'a * 'a list *) exception Empty val null : 'a list -> bool val length : 'a list -> int val @ : ('a list * 'a list) -> 'a list val concat : 'a list list -> 'a list val revAppend : ('a list * 'a list) -> 'a list val tabulate : (int * (int -> 'a)) -> 'a list val hd : 'a list -> 'a val tl : 'a list -> 'a list val last : 'a list -> 'a val getItem : 'a list -> ('a * 'a list) option val nth : ('a list * int) -> 'a val take : ('a list * int) -> 'a list val drop : ('a list * int) -> 'a list val rev : 'a list -> 'a list val app : ('a -> unit) -> 'a list -> unit val map : ('a -> 'b) -> 'a list -> 'b list val mapPartial : ('a -> 'b option) -> 'a list -> 'b list val find : ('a -> bool) -> 'a list -> 'a option val filter : ('a -> bool) -> 'a list -> 'a list val partition : ('a -> bool) -> 'a list -> ('a list * 'a list) val foldl : (('a * 'b) -> 'b) -> 'b -> 'a list -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a list -> 'b val exists : ('a -> bool) -> 'a list -> bool val all : ('a -> bool) -> 'a list -> bool val collate: ('a * 'a -> order) -> 'a list * 'a list -> order end; structure List: LIST = struct datatype list = datatype list exception Empty fun null [] = true | null (_::_) = false val length = length (* Declared in prelude. *) (* ... fun nil @ M = M (* append *) | (x::L) @ M = x :: (L @ M); ... *) (* Dave's improved(?) version SPF 10/2/94 *) (* Taken from the prelude. The idea is to avoid rebuilding the list if the second list is empty. *) fun x @ nil = x (* append *) | x @ y = let fun app nil = y | app (a :: b) = a :: app b in app x end; fun hd (a::_) = a | hd _ = raise Empty and tl (_::a) = a | tl _ = raise Empty (* TODO: We could avoid the test for nil in the recursive cases. *) fun last [] = raise Empty | last [a] = a | last (_::b) = last b fun getItem [] = NONE | getItem (a::b) = SOME(a, b) (* We could raise subscript immediately if i < 0 and we probably would have to if we were using fixed precision arithmetic. *) fun nth([], _) = raise General.Subscript | nth(a::_, 0) = a | nth(_::l, i) = nth(l, i-1) (* TODO: Many of these functions involve recursing down the list and so require stack space proportional to the length of the list. Would it be more efficient to build the lists in reverse and then reverse the result? That would save on stack space at the expense of constructing the list twice. *) fun take(_, 0) = [] | take([], _) = raise General.Subscript | take(a::b, i) = a :: take(b, i-1) fun drop(l, 0) = l | drop([], _) = raise General.Subscript | drop(_::l, i) = drop(l, i-1) fun revAppend([], a) = a | revAppend(x::y, a) = revAppend(y, x::a) fun rev l = revAppend(l, []) fun concat [] = [] | concat (a::b) = a @ concat b fun app _ [] = () | app f (h::t) = (f h; app f t) fun map _ [] = [] | map f (a::b) = f a :: map f b; fun mapPartial _ [] = [] | mapPartial f (a::b) = case f a of SOME r => r :: mapPartial f b | NONE => mapPartial f b fun find _ [] = NONE | find f (a::b) = if f a then SOME a else find f b fun filter _ [] = [] | filter f (a::b) = if f a then a :: filter f b else filter f b (* This is defined to evaluate f from left to right. *) (* TODO: This involves returning a pair and creating new pairs which allocates storage in Poly/ML. Is there a more efficient implementation? e.g. recurse down the list and then reverse it. *) fun partition _ [] = ([], []) | partition f (a::b) = let val test = f a and (x, y) = partition f b in if test then (a::x, y) else (x, a::y) end fun foldl _ b [] = b | foldl f b (x::y) = foldl f (f(x, b)) y fun foldr _ b [] = b | foldr f b (x::y) = f(x, foldr f b y) fun exists _ [] = false | exists f (a::b) = if f a then true else exists f b fun all _ [] = true | all f (a::b) = if f a then all f b else false (* tabulate a function. Rewritten again this time using an array. *) fun tabulate(n, f) = let val a = Array.tabulate(n, f) in Array.foldr (op ::) [] a end (* Lexicographic comparison. *) fun collate _ ([], []) = General.EQUAL | collate _ ([], _) = General.LESS | collate _ (_, []) = General.GREATER | collate cmp (a::b, c::d) = (case cmp (a, c) of General.EQUAL => collate cmp (b, d) | notEqual => notEqual) end; (* Values available at the top level. *) exception Empty = List.Empty val null : 'a list -> bool = List.null val hd : 'a list -> 'a = List.hd val tl : 'a list -> 'a list = List.tl val length : 'a list -> int = List.length val rev : 'a list -> 'a list = List.rev val op @ : ('a list * 'a list) -> 'a list = List.@ val app : ('a -> unit) -> 'a list -> unit = List.app val map : ('a -> 'b) -> 'a list -> 'b list = List.map val foldr: ('a*'b->'b)-> 'b -> 'a list -> 'b = List.foldr val foldl: ('a*'b->'b)-> 'b -> 'a list -> 'b = List.foldl; polyml-5.6/basis/ListPair.sml000066400000000000000000000077121265146633400162660ustar00rootroot00000000000000(* Title: Standard Basis Library: ListPair Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Done. *) signature LIST_PAIR = sig exception UnequalLengths val zip : ('a list * 'b list) -> ('a * 'b) list val zipEq : ('a list * 'b list) -> ('a * 'b) list val unzip : ('a * 'b) list -> ('a list * 'b list) val app : ('a * 'b -> unit) -> ('a list * 'b list) -> unit val appEq : ('a * 'b -> unit) -> ('a list * 'b list) -> unit val map : ('a * 'b -> 'c) -> ('a list * 'b list) -> 'c list val mapEq : ('a * 'b -> 'c) -> ('a list * 'b list) -> 'c list val foldl : (('a * 'b * 'c) -> 'c) -> 'c -> ('a list * 'b list) -> 'c val foldr : (('a * 'b * 'c) -> 'c) -> 'c -> ('a list * 'b list) -> 'c val foldlEq : (('a * 'b * 'c) -> 'c) -> 'c -> ('a list * 'b list) -> 'c val foldrEq : (('a * 'b * 'c) -> 'c) -> 'c -> ('a list * 'b list) -> 'c val all : ('a * 'b -> bool) -> ('a list * 'b list) -> bool val exists : ('a * 'b -> bool) -> ('a list * 'b list) -> bool val allEq : ('a * 'b -> bool) -> ('a list * 'b list) -> bool end; structure ListPair : LIST_PAIR = struct exception UnequalLengths fun zip (h::t, h'::t') = (h, h') :: zip(t, t') | zip (_, _) = [] (* Stop as soon as either list is exhausted. *) fun zipEq (h::t, h'::t') = (h, h') :: zipEq(t, t') | zipEq ([], []) = [] | zipEq (_, _) = raise UnequalLengths fun unzip ((a, b) :: l) = let (* TODO: This is quite inefficient in Poly/ML. It might be better to unzip each of the lists separately. *) val (x, y) = unzip l in (a :: x, b :: y) end | unzip [] = ([], []) fun map f (h::t, h'::t') = f(h, h') :: map f (t, t') | map _ _ = [] fun mapEq f (h::t, h'::t') = f(h, h') :: mapEq f (t, t') | mapEq _ ([], []) = [] | mapEq _ _ = raise UnequalLengths fun app f (h::t, h'::t') = (f(h, h'); app f (t, t')) | app _ _ = () fun appEq f (h::t, h'::t') = (f(h, h'); appEq f (t, t')) | appEq _ ([], []) = () | appEq _ _ = raise UnequalLengths fun foldl f b (h::t, h'::t') = foldl f (f(h, h', b)) (t, t') | foldl _ b _ = b fun foldr f b (h::t, h'::t') = f(h, h', foldr f b (t, t')) | foldr _ b _ = b fun foldlEq f b (h::t, h'::t') = foldlEq f (f(h, h', b)) (t, t') | foldlEq _ b ([], []) = b | foldlEq _ _ _ = raise UnequalLengths fun foldrEq f b (h::t, h'::t') = f(h, h', foldrEq f b (t, t')) | foldrEq _ b ([], []) = b | foldrEq _ _ _ = raise UnequalLengths fun exists f (h::t, h'::t') = if f(h, h') then true else exists f (t, t') | exists _ _ = false (* all and allEq differ in the way they handle lists of different lengths. all returns true if the predicate holds up to the shorter of the lists whereas allEq returns false if the lists have different lengths. *) fun all f (h::t, h'::t') = if f(h, h') then all f (t, t') else false | all _ _ = true (* Is it better to check the lengths first? *) fun allEq f (h::t, h'::t') = if f(h, h') then allEq f (t, t') else false | allEq _ ([], []) = true | allEq _ _ = false end; polyml-5.6/basis/MATH.sml000066400000000000000000000026651265146633400152720ustar00rootroot00000000000000(* Title: Standard Basis Library: Math Signature. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change required. *) signature MATH = sig type real val pi : real val e : real val sqrt : real -> real val sin : real -> real val cos : real -> real val tan : real -> real val asin : real -> real val acos : real -> real val atan : real -> real val atan2 : (real * real) -> real val exp : real -> real val pow : (real * real) -> real val ln : real -> real val log10 : real -> real val sinh : real -> real val cosh : real -> real val tanh : real -> real end; polyml-5.6/basis/MONO_ARRAY.sml000066400000000000000000000041471265146633400162440ustar00rootroot00000000000000(* Title: Standard Basis Library: Mono_Array signature Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. *) signature MONO_ARRAY = sig eqtype array type elem type vector val maxLen : int val array : (int * elem) -> array val fromList : elem list -> array val vector: array -> vector val tabulate : (int * (int -> elem)) -> array val length : array -> int val sub : (array * int) -> elem val update : (array * int * elem) -> unit val copy : {src : array, dst : array, di : int} -> unit val copyVec : {src : vector, dst : array, di : int} -> unit val appi : ((int * elem) -> unit) -> array -> unit val app : (elem -> unit) -> array -> unit val foldli : ((int * elem * 'b) -> 'b) -> 'b -> array -> 'b val foldri : ((int * elem * 'b) -> 'b) -> 'b -> array -> 'b val foldl : ((elem * 'b) -> 'b) -> 'b -> array -> 'b val foldr : ((elem * 'b) -> 'b) -> 'b -> array -> 'b val modifyi : ((int * elem) -> elem) -> array -> unit val modify : (elem -> elem) -> array -> unit val findi: (int * elem -> bool) -> array -> (int * elem) option val find: (elem -> bool) -> array -> elem option val exists: (elem -> bool) -> array -> bool val all: (elem -> bool) -> array -> bool val collate: (elem * elem -> order) -> array * array -> order end; polyml-5.6/basis/MONO_ARRAY_SLICE.sml000066400000000000000000000043711265146633400171620ustar00rootroot00000000000000(* Title: Standard Basis Library: MONO_ARRAY_SLICE signature Author: David Matthews Copyright David Matthews 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: new. *) signature MONO_ARRAY_SLICE = sig type elem type array type slice type vector type vector_slice val length : slice -> int val sub : (slice * int) -> elem val update: slice * int * elem -> unit val full: array -> slice val slice: array * int * int option -> slice val subslice: slice * int * int option -> slice val base: slice -> array * int * int val vector: slice -> vector val copy : {src : slice, dst : array, di : int} -> unit val copyVec : {src : vector_slice, dst : array, di : int} -> unit val isEmpty: slice -> bool val getItem: slice -> (elem * slice) option val appi : ((int * elem) -> unit) -> slice -> unit val app : (elem -> unit) -> slice -> unit val modifyi : (int * elem -> elem) -> slice -> unit val modify : (elem -> elem) -> slice -> unit val foldli : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool val collate: (elem * elem -> order) -> slice * slice -> order end; polyml-5.6/basis/MONO_VECTOR.sml000066400000000000000000000037171265146633400163720ustar00rootroot00000000000000(* Title: Standard Basis Library: MONO_VECTOR signature Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. *) signature MONO_VECTOR = sig type vector type elem val maxLen : int val fromList : elem list -> vector val tabulate : (int * (int -> elem)) -> vector val length : vector -> int val sub : (vector * int) -> elem val update: vector * int * elem -> vector val concat : vector list -> vector val mapi : ((int * elem) -> elem) -> vector -> vector val map : (elem -> elem) -> vector -> vector val appi : ((int * elem) -> unit) -> vector -> unit val app : (elem -> unit) -> vector -> unit val foldli : ((int * elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> vector -> 'a val findi: (int * elem -> bool) -> vector -> (int * elem) option val find: (elem -> bool) -> vector -> elem option val exists: (elem -> bool) -> vector -> bool val all: (elem -> bool) -> vector -> bool val collate: (elem * elem -> order) -> vector * vector -> order end; polyml-5.6/basis/MONO_VECTOR_SLICE.sml000066400000000000000000000041211265146633400172770ustar00rootroot00000000000000(* Title: Standard Basis Library: MONO_VECTOR_SLICE signature Author: David Matthews Copyright David Matthews 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: new. *) signature MONO_VECTOR_SLICE = sig type vector type elem type slice val length : slice -> int val sub : (slice * int) -> elem val full: vector -> slice val slice: vector * int * int option -> slice val subslice: slice * int * int option -> slice val base: slice -> vector * int * int val vector: slice -> vector val concat: slice list -> vector val isEmpty: slice -> bool val getItem: slice -> (elem * slice) option val appi : ((int * elem) -> unit) -> slice -> unit val app : (elem -> unit) -> slice -> unit val mapi : ((int * elem) -> elem) -> slice -> vector val map : (elem -> elem) -> slice -> vector val foldli : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool val collate: (elem * elem -> order) -> slice * slice -> order end; polyml-5.6/basis/NetHostDB.sml000066400000000000000000000157571265146633400163410ustar00rootroot00000000000000(* Title: Standard Basis Library: NetHostDB and NetDB Structures and Signatures Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: no change *) signature NET_HOST_DB = sig eqtype in_addr eqtype addr_family type entry val name : entry -> string val aliases : entry -> string list val addrType : entry -> addr_family val addr : entry -> in_addr val addrs : entry -> in_addr list val getByName : string -> entry option val getByAddr : in_addr -> entry option val getHostName : unit -> string val scan : (char, 'a) StringCvt.reader -> (in_addr, 'a) StringCvt.reader val fromString : string -> in_addr option val toString : in_addr -> string end; local fun power2 0 = 1 | power2 n = 2 * power2(n-1) val p32 = power2 32 val p24 = power2 24 fun scan getc src = let (* Read a number as either decimal, hex or octal up to the given limit. Stops when it reaches the limit or finds a character it doesn't recognise. *) fun readNum base acc limit src = let fun addDigit d src = let val n = case acc of SOME(n, _) => n | NONE => 0 val next = n*base + d in (* If we are below the limit we can continue. *) if next < limit then readNum base (SOME(next, src)) limit src else acc end in case getc src of NONE => acc | SOME(ch, src') => if Char.isDigit ch andalso ch < Char.chr(Char.ord #"0" + base) then addDigit (Char.ord ch - Char.ord #"0") src' else if base = 16 andalso (ch >= #"A" andalso ch <= #"F") then addDigit (Char.ord ch - Char.ord #"A" + 10) src' else if base = 16 andalso (ch >= #"a" andalso ch <= #"f") then addDigit (Char.ord ch - Char.ord #"a" + 10) src' else acc end (* Read a number. If it starts with 0x or 0X treat it as hex, otherwise if it starts with 0 treat as octal otherwise decimal. *) fun scanNum limit src = case getc src of NONE => NONE | SOME (#"0", src') => ( case getc src' of SOME(ch, src'') => if ch = #"x" orelse ch = #"X" then ( (* If it is invalid we have still read a zero so return that. *) case readNum 16 NONE limit src'' of NONE => SOME(0, src') | res => res ) else (* Octal - include the zero. *) readNum 8 NONE limit src' | NONE => SOME(0, src') (* Just the zero. *) ) | SOME (_, _) => (* Treat it as a decimal number. *) readNum 10 NONE limit src fun scanAddr src limit i acc = case scanNum limit src of NONE => NONE | SOME(n, src') => let val res = acc*256 + n (* This is the accumulated result. *) in (* If the result is more than 24 bits or we've read all the sections we're finished. *) if res >= p24 orelse i = 1 then SOME(res, src') else case getc src' of SOME (#".", src'') => ( (* The limit for sections other than the first is 256. *) case scanAddr src'' 256 (i-1) res of NONE => SOME(res, src') (* Return what we had. *) | r => r ) | _ => SOME(res, src') (* Return what we've got. *) end in scanAddr src p32 4 (* Four sections in all. *) 0 end (* scan *) in structure NetHostDB :> NET_HOST_DB = struct type in_addr = int and addr_family = int type entry = string * string list * addr_family * in_addr list val name: entry -> string = #1 val aliases : entry -> string list = #2 val addrType : entry -> addr_family = #3 val addrs : entry -> in_addr list = #4 (* Addr returns the first address in the list. There should always be at least one entry. *) fun addr e = case addrs e of a :: _ => a | [] => raise OS.SysErr("No address returned", NONE) local val doCall: int*unit -> string = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getHostName () = doCall(0, ()) end local val doCall: int*string -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByName s = SOME(doCall(1, s)) handle OS.SysErr _ => NONE end local val doCall: int*int -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByAddr n = SOME(doCall(2, n)) handle OS.SysErr _ => NONE end val scan = scan and fromString = StringCvt.scanString scan fun toString n = let fun pr n i = (if i > 0 then pr (n div 256) (i-1) ^ "." else "") ^ Int.toString (n mod 256) in pr n 3 (* Always generate 4 numbers. *) end end; end; local (* Install the pretty printer for NetHostDB.in_addr. This must be done outside the structure if we use opaque matching. *) fun printAddr _ _ x = PolyML.PrettyString(NetHostDB.toString x) in val () = PolyML.addPrettyPrinter printAddr end polyml-5.6/basis/NetProtDB.sml000066400000000000000000000034331265146633400163340ustar00rootroot00000000000000(* Title: Standard Basis Library: NetProtDB Structures and Signatures Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature NET_PROT_DB = sig type entry val name : entry -> string val aliases : entry -> string list val protocol : entry -> int val getByName : string -> entry option val getByNumber : int -> entry option end; structure NetProtDB :> NET_PROT_DB = struct type entry = string * string list * int val name: entry -> string = #1 val aliases : entry -> string list = #2 val protocol : entry -> int = #3 local val doCall: int*string -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByName s = SOME(doCall(3, s)) handle OS.SysErr _ => NONE end local val doCall: int*int -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByNumber n = SOME(doCall(4, n)) handle OS.SysErr _ => NONE end end; polyml-5.6/basis/NetServDB.sml000066400000000000000000000045121265146633400163260ustar00rootroot00000000000000(* Title: Standard Basis Library: NetServDB Structures and Signatures Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) signature NET_SERV_DB = sig type entry val name : entry -> string val aliases : entry -> string list val port : entry -> int val protocol : entry -> string val getByName : string * string option -> entry option val getByPort : int * string option -> entry option end; structure NetServDB :> NET_SERV_DB = struct type entry = string * string list * int * string val name: entry -> string = #1 val aliases : entry -> string list = #2 val port : entry -> int = #3 val protocol : entry -> string = #4 local val doCall1: int*string -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network and doCall2: int*(string*string) -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByName(s, NONE) = ( SOME(doCall1(5, s)) handle OS.SysErr _ => NONE ) | getByName(s, SOME p) = ( SOME(doCall2(6, (s, p))) handle OS.SysErr _ => NONE ) end local val doCall1: int*int -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network and doCall2: int*(int*string) -> entry = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getByPort(n, NONE) = ( SOME(doCall1(7, n)) handle OS.SysErr _ => NONE ) | getByPort(n, SOME p) = ( SOME(doCall2(8, (n, p))) handle OS.SysErr _ => NONE ) end end; polyml-5.6/basis/OS.sml000066400000000000000000001355061265146633400150630ustar00rootroot00000000000000(* Title: Standard Basis Library: OS Structures and Signatures Author: David Matthews Copyright David Matthews 2000, 2005, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature OS_FILE_SYS = sig type dirstream val openDir : string -> dirstream val readDir : dirstream -> string option val rewindDir : dirstream -> unit val closeDir : dirstream -> unit val chDir : string -> unit val getDir : unit -> string val mkDir : string -> unit val rmDir : string -> unit val isDir : string -> bool val isLink : string -> bool val readLink : string -> string val fullPath : string -> string val realPath : string -> string val modTime : string -> Time.time val fileSize : string -> Position.int val setTime : (string * Time.time Option.option) -> unit val remove : string -> unit val rename : {old : string, new : string} -> unit datatype access_mode = A_READ | A_WRITE | A_EXEC val access : (string * access_mode list) -> bool val tmpName : unit -> string eqtype file_id val fileId : string -> file_id val hash : file_id -> word val compare : (file_id * file_id) -> General.order end (* OS_FILE_SYS *); signature OS_PATH = sig exception Path exception InvalidArc val parentArc : string val currentArc : string val fromString : string -> { isAbs : bool, vol : string, arcs : string list } val toString : { isAbs : bool, vol : string, arcs : string list } -> string val validVolume : {isAbs : bool, vol : string} -> bool val getVolume : string -> string val getParent : string -> string val splitDirFile : string -> {dir : string, file : string} val joinDirFile : {dir : string, file : string} -> string val dir : string -> string val file : string -> string val splitBaseExt : string -> {base : string, ext : string option } val joinBaseExt : {base : string, ext : string option} -> string val base : string -> string val ext : string -> string option val mkCanonical : string -> string val isCanonical : string -> bool val mkAbsolute : {path : string, relativeTo : string} -> string val mkRelative : {path : string, relativeTo : string} -> string val isAbsolute : string -> bool val isRelative : string -> bool val isRoot : string -> bool val concat : string * string -> string val toUnixPath : string -> string val fromUnixPath : string -> string end (* OS_PATH *); signature OS_PROCESS = sig type status val success : status val failure : status val isSuccess : status -> bool val system : string -> status val atExit : (unit -> unit) -> unit val exit : status -> 'a val terminate : status -> 'a val getEnv : string -> string Option.option val sleep: Time.time -> unit end (* OS_PROCESS *); signature OS_IO = sig eqtype iodesc val hash : iodesc -> word val compare : (iodesc * iodesc) -> General.order eqtype iodesc_kind val kind : iodesc -> iodesc_kind structure Kind: sig val file : iodesc_kind val dir : iodesc_kind val symlink : iodesc_kind val tty : iodesc_kind val pipe : iodesc_kind val socket : iodesc_kind val device : iodesc_kind end eqtype poll_desc type poll_info val pollDesc : iodesc -> poll_desc Option.option val pollToIODesc : poll_desc -> iodesc exception Poll val pollIn : poll_desc -> poll_desc val pollOut : poll_desc -> poll_desc val pollPri : poll_desc -> poll_desc val poll : (poll_desc list * Time.time Option.option) -> poll_info list val isIn : poll_info -> bool val isOut : poll_info -> bool val isPri : poll_info -> bool val infoToPollDesc : poll_info -> poll_desc end (* OS_IO *); signature OS = sig eqtype syserror exception SysErr of (string * syserror Option.option) val errorMsg : syserror -> string val errorName : syserror -> string val syserror : string -> syserror Option.option structure FileSys : OS_FILE_SYS structure Path : OS_PATH structure Process : OS_PROCESS structure IO : OS_IO end (* OS *); structure OS:> OS = struct type syserror = int (* Abstract. *) (* The calls themselves raise the SysCall exception. That has to be turned into a SysError exception. *) exception SysErr = RunCall.SysErr local val doCall: int*syserror -> string = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in (* Convert a numeric system error to a string. *) fun errorName (s: syserror) : string = doCall(2, s) fun errorMsg (s: syserror) : string = doCall(3, s) end local val doCall: int*string -> syserror = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in (* Convert a string to an error message if possible. *) fun syserror (s: string) : syserror option = let val n = doCall(4, s) in if n = 0 then NONE else SOME n end end structure Path:> OS_PATH = struct (* Note: The definition of relative and absolute paths are somewhat unclear and some of the examples seem contradictory. The definition I would prefer to use is that an absolute path is one which identifies a given file independent of any setting of the current directory. Hence the examples of "\" and "\A\B" as being absolute paths in DOS is in my opinion wrong. These are relative since they depend on the setting of the current volume. However this is a mess when it comes to fromString since if we don't treat "\A" as an absolute path it looks just like an absolute path with an empty arc. *) exception Path exception InvalidArc local val getOS: int = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (0, 0) in val isWindows = case getOS of 0 => false (* Posix *) | 1 => true | _ => raise Fail "Unknown operating system" end val isCaseSensitive = not isWindows val isSeparator = if isWindows then fn #"/" => true | #"\\" => true | _ => false else fn #"/" => true | _ => false val separator = if isWindows then "\\" else "/" val parentArc = ".." and currentArc = "." val isValidArc = if isWindows then let fun invalidChars #"\000" = true | invalidChars #"<" = true | invalidChars #">" = true | invalidChars #":" = true | invalidChars #"\"" = true | invalidChars #"\\" = true | invalidChars #"/" = true | invalidChars #"|" = true | invalidChars #"?" = true | invalidChars #"*" = true | invalidChars _ = false in not o (CharVector.exists invalidChars) end else let (* Posix - only null and / are invalid. *) fun invalidChars #"\000" = true | invalidChars #"/" = true | invalidChars _ = false in not o (CharVector.exists invalidChars) end local (* Given a string it examines the prefix and extracts the volume name if there is one. It returns the volume and also whether the name is absolute. It also returns the number of characters which matched so that this can be removed before treating the rest as a relative path. *) fun matchVolumePrefixPosix s = if String.size s > 0 andalso String.sub(s, 0) = #"/" then {volLen = 1, vol = "", abs = true, root = true } else {volLen = 0, vol = "", abs = false, root = false } fun matchVolumePrefixWindows s = let val slen = String.size s in if slen = 0 then { volLen = 0, vol = "", abs = false, root = false } else if slen >= 2 andalso String.sub(s, 1) = #":" andalso Char.isAlpha(String.sub(s, 0)) then if slen > 2 andalso isSeparator(String.sub(s, 2)) then { volLen = 3, vol = String.substring(s, 0, 2), abs = true, root = true } (* e.g. C:\ or C:\fred *) else { volLen = 2, vol = String.substring(s, 0, 2), abs = false, root = false } (* e.g. C: or C:fred *) else if slen > 2 andalso isSeparator(String.sub(s, 0)) andalso isSeparator(String.sub(s, 1)) then (* Looks like a UNC server name. See how big it is. *) let val (server, rest) = Substring.splitl(fn c => not (isSeparator c)) (Substring.extract(s, 2, NONE)) (* TODO: Is the server name actually valid? Assume yes. *) in if Substring.size rest = 0 then { volLen = 0, vol = "", abs = false, root = false } else (* Must be room for a share name as well. *) let val shareName = Substring.takel(fn c => not (isSeparator c)) (Substring.triml 1 rest) in { volLen = Substring.size server + Substring.size shareName + 4, vol = separator ^ separator ^ Substring.string server ^ separator ^ Substring.string shareName, abs = true, root = true } end end (* Leading \ in Windows means the "root" directory on the current drive. *) else if isSeparator(String.sub(s, 0)) then { volLen = 1, vol = "", abs = false, root = true } else { volLen = 0, vol = "", abs = false, root = false } end in val matchVolumePrefix = if isWindows then matchVolumePrefixWindows else matchVolumePrefixPosix end (* Internal - map the strings to the canonical case if they are not case sensitive. *) val toCanonicalCase = if isCaseSensitive then fn s => s else String.map Char.toLower (* Internal - are the arcs equivalent? *) fun equivalent (s, t) = toCanonicalCase s = toCanonicalCase t (* See if the volume name is valid for either an absolute or relative path. Windows relative paths may or may not have a volume but if they have the volume must look right. On Unix relative paths may not specify a volume and the only volume for absolute paths is the empty string. *) val validVolume = if isWindows then fn {isAbs, vol = ""} => not isAbs (* Empty volume is only valid for relative paths. *) | {vol, ...} => if size vol = 2 andalso String.sub(vol, 1) = #":" andalso Char.isAlpha(String.sub(vol, 0)) then true (* Drive letter e.g. C: *) else if size vol > 2 andalso isSeparator(String.sub(vol, 0)) then (* UNC name? \\server\share *) case String.fields isSeparator vol of ["", "", server, share] => server <> "" andalso share <> "" | _ => false else false else (* Posix. The volume must always be empty. *) fn {vol = "", ...} => true | _ => false (* We only return an empty arcs list if the argument is the empty string. *) fun fromString "" = {isAbs = false, vol = "", arcs=[]} | fromString (s: string) = let (* Do we have a volume name? *) val {volLen, vol, abs, root, ...} = matchVolumePrefix s (* The remainder forms a set of arcs. *) val rest = String.extract(s, volLen, NONE) val arcs = String.fields isSeparator rest (* If it begins with the Windows \ without a drive we need to add an extra empty arc. Otherwise we can't distinguish \a from a. *) val allArcs = if root andalso not abs then "" :: arcs else arcs in {isAbs = abs, vol = vol, arcs=allArcs} end (* Note: This is a mess as well. For example it says that it should raise Path if there is a relative path which begins with an empty arc. That's only true in Unix. What it should say is that it if isAbs is false then it should raise Path if the resulting path has the form of an absolute path. In Windows we should raise path if given (e.g.) {isAbs=false, vol="", arcs=["", "", "a", "b"]} because that looks like a UNC name. *) fun toString {isAbs : bool, vol : string, arcs : string list} = (* Check we have a valid volume. *) if not (validVolume{isAbs=isAbs, vol=vol}) then raise Path (* Check that each arc is valid. *) else if List.exists (fn s => not (isValidArc s)) arcs then raise InvalidArc else let (* Place separators between each arc. *) fun arcsToLinks [] = [] | arcsToLinks [a] = [a] | arcsToLinks (a::b) = a :: separator :: arcsToLinks b fun makePrefix(vol, false) = vol | makePrefix(vol, true) = vol ^ separator val r = String.concat(makePrefix(vol, isAbs) :: arcsToLinks arcs) (* Check to see whether we have turned a relative path into an absolute one by including empty arcs in the wrong places. *) val {abs = nowAbs, ...} = matchVolumePrefix r in if nowAbs <> isAbs then raise Path else r end (* Note: this is just defined to "return the volume portion" but doesn't say what to do if there isn't a volume. Seems simplest to define it as below. *) fun getVolume s = #vol(fromString s) (* Note: Once again this has very much a Unix view of the world, most of which almost works in Windows. I think the idea is that if possible it replaces the path with the path to the containing directory. If we're in the root directory we get the root directory. If we're in a path that ends with a component *) fun getParent "" = parentArc | getParent s = let val len = String.size s val {volLen, ...} = matchVolumePrefix s (* Split it at the last separator. *) val (prefix, suffix) = Substring.splitr (fn c => not (isSeparator c)) (Substring.full s) in if volLen = len then s (* We have a root. *) else if Substring.size suffix = 0 then (* If the last character is a separator just add on the parent arc (..) to refer to the parent directory. I don't know why we can't just remove the last component in this case but the examples don't do that. The only special case is where we have reached the root when we just return the root. *) s ^ parentArc else if Substring.size prefix = 0 then (* No separator at all *) ( if s = parentArc (* .. => ../.. *) then parentArc ^ (separator) ^ parentArc else if s = currentArc then parentArc (* . => .. *) else currentArc (* abc => . *) ) else if Substring.size prefix = volLen (* ??? If the prefix matches the volume then return the whole of prefix including the separator. *) then Substring.string prefix else (* Return the prefix with the separator removed. *) Substring.string(Substring.trimr 1 prefix) end (* Another mess defined in terms of examples for Unix from which one is expected to infer a general rule. It seems to split the string at the last separator and return the two halves without the separator except in the case where the directory is a root directory when a full volume name and separator are given. *) fun splitDirFile s = let (* Split it at the last separator. *) val (prefix, suffix) = Substring.splitr (fn c => not (isSeparator c)) (Substring.full s) val {volLen, vol, ...} = matchVolumePrefix s val dirName = case Substring.size prefix of 0 => "" | 1 => Substring.string prefix (* Special case of Windows \a. *) | _ => Substring.string(Substring.trimr 1 prefix) and fileName = Substring.string suffix in if volLen <> 0 andalso vol = dirName then {dir = vol ^ separator, file = fileName} else {dir = dirName, file = fileName} end fun dir s = #dir(splitDirFile s) and file s = #file(splitDirFile s) (* Question: It seems from the definition of toString that the arcs list can include separators. Is that true here? Assume yes. *) (* If the last character is already a separator we don't add one, e.g. if the directory is "/". *) fun joinDirFile{dir, file} = if not (isValidArc file) then raise InvalidArc else if dir = "" then file (* Return the file name unchanged *) else if isSeparator(String.sub(dir, size dir - 1)) then dir ^ file else dir ^ separator ^ file fun splitBaseExt s = let val slen = String.size s fun getExt n = if n <= 0 then NONE (* If it's at the start ignore it. *) else if isSeparator(String.sub(s, n)) then NONE else if String.sub(s, n) = #"." then (* Found a dot. *) ( if n = slen-1 then NONE (* Dot in last position. *) else if isSeparator(String.sub(s, n-1)) then NONE (* Dot immediately after separator. *) else SOME n ) else getExt (n-1) val extPos = getExt(slen - 1) in case extPos of NONE => {base=s, ext=NONE} | SOME n => {base=String.substring(s, 0, n), ext=SOME(String.substring(s, n+1, slen-n-1))} end fun joinBaseExt {base : string, ext = NONE} = base | joinBaseExt {base : string, ext = SOME ""} = base | joinBaseExt {base : string, ext = SOME ext} = base ^ "." ^ ext fun base s = #base(splitBaseExt s) and ext s = #ext(splitBaseExt s) val emptyArcIsRedundant = true fun mkCanonical s = let val {isAbs, vol, arcs} = fromString s fun collapse [] = [] | collapse (a :: b) = (* Work down the list removing currentArc entries and null entries (if the OS treats them as redundant).. *) if a = currentArc orelse (emptyArcIsRedundant andalso a = "") then collapse b (* Then work back up it removing parentArc entries. *) else case collapse b of [] => [a] | b' as (x :: y) => if x = parentArc andalso not (a = parentArc) then (* Remove "a" and "x". *) y else a :: b' val collapsed = collapse arcs (* If this is the root we can remove leading occurrences of the parent arc since the parent of the root is the root. *) fun removeLeadingParent [] = [] | removeLeadingParent (a::b) = if a = parentArc then removeLeadingParent b else a::b val newArcs = if isAbs then removeLeadingParent collapsed else collapsed val res = toString{isAbs=isAbs, vol=vol, arcs=newArcs} in (* Finally replace the empty string with "." and map to lower case if it's not case sensitive. *) if res = "" then currentArc else toCanonicalCase res end fun isCanonical s = mkCanonical s = s handle Path => false fun isAbsolute s = #isAbs(fromString s) and isRelative s = not(#isAbs(fromString s)) (* Concatenate two paths. The second must be relative and, if it contains a volume name, refer to the same volume as the first. *) fun concat(s, t) = let val {isAbs=absS, vol=volS, arcs=ArcsS} = fromString s val {isAbs=absT, vol=volT, arcs=ArcsT} = fromString t (* Concatenate the two lists of arcs except that a trailing empty arc on the first path is removed (i.e. concat("a/", "b") is the same as concat("a", "b") *) fun concatArcs [] p = p | concatArcs [a] p = if a = "" then p else a :: p | concatArcs (a::b) p = a :: concatArcs b p in if absT then raise Path else if volT <> "" andalso not(equivalent(volS, volT)) then raise Path else if #root(matchVolumePrefix t) (* Special case for Windows. concat("c:\\abc\\def", "\\xyz") is "c:\\xyz". *) then let (* Because this a relative path we have an extra empty arc here. *) val ArcsT' = case ArcsT of "" :: a => a | a => a in toString{isAbs=absS, vol=volS, arcs=ArcsT'} end else toString{isAbs=absS, vol=volS, arcs=concatArcs ArcsS ArcsT} end (* Make an absolute path by treating a relative path as relative to a given path. *) fun mkAbsolute {path, relativeTo} = let val {isAbs=absP, vol=volP, ...} = fromString path val {isAbs=absRT, vol=volRT, ...} = fromString relativeTo in if absP then path else if not absRT then raise Path (* If the path contained a volume it must be the same as the absolute path. *) else if volP <> "" andalso not(equivalent(volP, volRT)) then raise Path else mkCanonical(concat(relativeTo, path)) end (* Make a relative path by treating an absolute path as derived from a given other absolute path. *) fun mkRelative {path, relativeTo} = case fromString path of {isAbs=false, ...} => path (* Already relative *) | {vol=volP, arcs=arcsP, ...} => let val {isAbs=absRT, vol=volRT, arcs=arcsRT} = fromString (mkCanonical relativeTo) (* Add as many parent arcs as there are arcs in the path. *) fun addParents [] p = p | addParents (_::b) p = parentArc :: addParents b p fun matchPaths [] [] = [currentArc] (* Both equal *) | matchPaths p [] = (* Absolute path is finished - return p *) p | matchPaths [] r = (* Relative paths finished - add parent arcs *) addParents r [] | matchPaths (p :: p') (r :: r') = (* Are they the same arc? Note: When arcs are case insensitive I'm doing a case insensitive match here. *) if equivalent(p, r) then matchPaths p' r' else addParents (r :: r') (p :: p') (* We have a special case with the root directory (/ on Unix or c:\\ on Windows). In that case fromString returns a single empty arc and we want to remove it here otherwise we can end up with an empty arc in addParents. *) val arcsP' = case arcsP of [""] => [] | _ => arcsP val arcsRT' = case arcsRT of [""] => [] | _ => arcsRT in if not absRT then raise Path (* If the path contained a volume it must be the same as the absolute path. *) else if volP <> "" andalso not(equivalent(volP, volRT)) then raise Path else toString{isAbs=false, vol="", arcs=matchPaths arcsP' arcsRT'} end (* Another badly defined function. What is a root? Does it have to specify a volume or is \ a root in Windows? Assume that it must be absolute. *) fun isRoot s = let val {volLen, abs, ...} = matchVolumePrefix s in abs andalso volLen = String.size s andalso isCanonical s end (* Question: there's no definition of what these functions mean. The crucial questions are how to deal with volume names and also how to deal with symbols in the paths which may be invalid (e.g. path separators) in one or other system. For instance "a\b" is a valid file name in Unix and 31/3/2000 is valid in MacOS. Are they supposed to represent the original file system in some way? *) fun toUnixPath s = let (* We may have occurrences of "/" in the arcs if that is not a separator on this OS. Replace them by this machine's separator. *) fun mapArc a = if a = currentArc then "." else if a = parentArc then ".." else a fun mapArcs [] = [] | mapArcs [a] = [mapArc a] | mapArcs (a::b) = mapArc a :: "/" :: mapArcs b val {isAbs, vol, arcs} = fromString s val volArc = if vol <> "" then vol :: arcs else arcs val sl = String.concat(mapArcs volArc) in if String.size sl = 0 then "" else if isAbs then if String.sub(sl, 0) <> #"/" then "/" ^ sl else sl else (* not abs *) if String.sub(sl, 0) = #"/" then "." ^ sl else sl end fun fromUnixPath s = let val arcs = String.fields (fn ch => ch = #"/") s (* Turn any occurrences of this OS's separator into / since that can't occur within an arc. *) val convArc = String.translate ( fn ch => if isSeparator ch then "/" else String.str ch) val convArcs = List.map convArc arcs in case convArcs of [] => "" | ("" :: a :: rest) => let (* We had a leading / : is the first arc a volume name? *) val {volLen = n, vol, ...} = matchVolumePrefix a in if n = String.size a then (* We have a volume name. *) toString{isAbs=true, vol=vol, arcs=rest} else toString{isAbs=true, vol="", arcs=convArcs} end | (a :: rest) => let (* May be a relative volume name. *) val {volLen = n, vol, ...} = matchVolumePrefix a in if n = String.size a then toString{isAbs=false, vol=vol, arcs=rest} else toString{isAbs=false, vol="", arcs=convArcs} end end end (* Path *) structure FileSys:> OS_FILE_SYS = struct type dirFd = int (* The directory stream consists of the stream identifier returned by openDir together with the original directory name. We need that for rewind in Windows. *) datatype dirstream = DIR of dirFd * string local val doIo: int*unit*string -> dirFd = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun openDir (s : string): dirstream = DIR(doIo(50, (), s), s) end local val doIo: int*dirFd*unit -> string = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun readDir (DIR(d, _)): string option = let (* This returns the empty string at end-of-stream. *) val s = doIo(51, d, ()) in if s = "" then NONE else SOME s end end local val doIo: int*dirFd*unit -> unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun closeDir(DIR(d, _)) = doIo(52, d, ()) end local val doIo: int*dirFd*string -> unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* We need to pass in the string because Windows has to reopen the stream. *) fun rewindDir(DIR(d, s)) = doIo(53, d, s) end local val cd: string -> unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_chdir; in fun chDir s = cd s end local val doIo: int*unit*unit -> string = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Return current directory. *) fun getDir() = doIo(54, (), ()) (* Get a temporary file name. *) fun tmpName() = doIo(67, (), ()) end local val doIo: int*unit*string -> unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Create and delete directories and remove a file. *) fun mkDir s = doIo(55, (), s) and rmDir s = doIo(56, (), s) and remove s = doIo(64, (), s) end local val doIo: int*unit*string -> bool = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Test for directory and symbolic link. *) fun isDir s = doIo(57, (), s) and isLink s = doIo(58, (), s) end local val doIo: int*unit*string -> string = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Read a symbolic link. *) fun readLink s = doIo(59, (), s) (* Get a full canonical path name. *) and fullPath s = doIo(60, (), s) end local val doIo: int*unit*string -> Time.time = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Get file modification time. *) fun modTime s = doIo(61, (), s) end local val doIo: int*unit*string -> int = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Get file size. *) fun fileSize s = doIo(62, (), s) end local val doIo: int*string*Time.time -> unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Get file size. *) fun setTime(s, NONE) = doIo(63, s, Time.now()) | setTime(s, SOME t) = doIo(63, s, t) end local val doIo: int*string*string -> unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Rename a file. *) fun rename {old, new} = doIo(65, old, new) end datatype access_mode = A_READ | A_WRITE | A_EXEC local val doIo: int*string*word -> bool = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch fun mapAccess (A_READ, m) = Word.orb(m, 0w1) | mapAccess (A_WRITE, m) = Word.orb(m, 0w2) | mapAccess (A_EXEC, m) = Word.orb(m, 0w4) in (* Get access rights. *) fun access (s, m) = doIo(66, s, List.foldl mapAccess 0w0 m) end (* file_id seems to be intended to reflect the semantics of a Unix inode. That concept doesn't exist in Windows so we use a canonical file name instead. *) datatype file_id = INODE of int | FILENAME of string fun compare(INODE i, INODE j) = Int.compare(i, j) | compare(FILENAME s, FILENAME t) = String.compare(s, t) | (* These cases shouldn't happen but we'll define them anyway. *) compare(INODE _, FILENAME _) = General.GREATER | compare(FILENAME _, INODE _) = General.LESS (* TODO: The hash function is supposed to well distribute the the values when taken modulo 2^n for any n. I'm sure we can come up with something better than this. *) fun hash(INODE i) = let open Word infix xorb << val w = Word.fromInt i in w xorb (w << 0w8) xorb (w << 0w16) xorb (w << 0w24) end | hash(FILENAME s) = (* Simple hash function which multiplies the accumulator by 7 and adds in the next character. *) CharVector.foldl (fn(c, a) => a * 0w7 + Word.fromInt(Char.ord c)) 0w0 s local val doIo: int*unit*string -> int = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Get file id (inode). Returns negative value if inodes aren't supported. *) fun fileId s = let val i = doIo(68, (), s) in if i < 0 then FILENAME(fullPath s) else INODE i end end fun realPath p = if Path.isAbsolute p then fullPath p else Path.mkRelative{path=fullPath p, relativeTo=fullPath(getDir())} end (* FileSys *) structure IO :> OS_IO = struct datatype iodesc = IODESC of int (* Actually abstract. This isn't the file descriptor itself, rather a pointer into the io table. *) local val doIo: int*iodesc*unit -> int = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in (* Get underlying index. *) fun getIndex f = doIo(69, f, ()) end (* TODO: The hash function is supposed to well distribute the the values when taken modulo 2^n for any n. I'm sure we can come up with something better than this. *) fun hash (i: iodesc) : word = let open Word infix xorb << val w = Word.fromInt(getIndex i) in w xorb (w << 0w8) xorb (w << 0w16) xorb (w << 0w24) end fun compare(i, j) = Int.compare(getIndex i, getIndex j) (* eq *)type iodesc_kind = int structure Kind = struct val file : iodesc_kind = 0 val dir : iodesc_kind = 1 val symlink : iodesc_kind = 2 val tty : iodesc_kind = 3 val pipe : iodesc_kind = 4 val socket : iodesc_kind = 5 val device : iodesc_kind = 6 end local val doIo: int*iodesc*int -> int = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun kind (i: iodesc): iodesc_kind = let val k = doIo(21, i, 0) in (* Returns a negative number if the call fails, otherwise one of the above numbers. *) if k < 0 orelse k > 6 then raise SysErr("Invalid result", NONE) else k end end (* The poll descriptor and the result of polling is a bit map together with the io descriptor. *) val inBit = 0w1 and outBit = 0w2 and priBit = 0w4 (* N.B. The implementation of poll_desc is hard-wired into Socket.pollDesc. *) type poll_desc = word*iodesc datatype poll_info = PI of word*poll_desc local val doIo: int*iodesc*int -> word = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun sys_poll_test(i: iodesc) = doIo(22, i, 0) end local val doIo: int*int* (iodesc Vector.vector * word Vector.vector * Time.time) -> word Vector.vector = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun sys_poll_block(iov, wv) = doIo(23, 0, (iov, wv, Time.zeroTime)) fun sys_poll_poll(iov, wv) = doIo(25, 0, (iov, wv, Time.zeroTime)) and sys_poll_wait (iov, wv, t) = doIo(24, 0, (iov, wv, t)) end fun pollDesc (i: iodesc): poll_desc option = (* If the poll test returns zero then polling is not allowed for any mode. *) if sys_poll_test i = 0w0 then NONE else SOME(0w0, i) fun pollToIODesc(_, i): iodesc = i exception Poll (* Add the appropriate bit to the set if it is allowed. *) local fun addBit b ((bm, i)) = if Word.andb(sys_poll_test i, b) = 0w0 then raise Poll else (Word.orb(bm, b), i) in val pollIn = addBit inBit and pollOut = addBit outBit and pollPri = addBit priBit end fun poll (l : poll_desc list, t: Time.time Option.option) : poll_info list = let (* The original poll descriptor list may contain multiple occurrences of the same IO descriptor with the same or different flags. On Cygwin, at least, passing this directly produces funny results so we transform the request so that we make at most one request for each descriptor. *) local fun quickSort _ ([]:'a list) = [] | quickSort _ ([h]:'a list) = [h] | quickSort (leq:'a -> 'a -> bool) ((h::t) :'a list) = let val (after, befor) = List.partition (leq h) t in quickSort leq befor @ (h :: quickSort leq after) end; fun leqPoll((p1, f1): poll_desc) ((p2, f2): poll_desc) = case compare(f1, f2) of EQUAL => p1 <= p2 | LESS => true | GREATER => false fun merge ((p1, f1) :: (p2, f2) :: rest) = if compare(f1, f2) = EQUAL then merge((Word.orb(p1, p2), f1) :: rest) else (p1, f1) :: merge((p2, f2) :: rest) | merge c = c val sortedDescs = quickSort leqPoll l in val mergedDescs = merge sortedDescs end (* Turn the list into vectors of io descriptors and request bits - easier for the RTS to manage. N.B. This assumes that Vector.vector creates a simple memory vector and does not wrap it in any way. *) local val (bits, ioDescs) = ListPair.unzip mergedDescs in val bitVector: word Vector.vector = Vector.fromList bits and ioVector: iodesc Vector.vector = Vector.fromList ioDescs end (* Do the actual polling. Returns a vector with bits set for the results. *) val resV: word Vector.vector = case t of NONE => sys_poll_block(ioVector, bitVector) | SOME tt => let open Time in if tt = Time.zeroTime then sys_poll_poll(ioVector, bitVector) else if tt < Time.zeroTime (* Must check for negative times since these can be interpreted as infinity. *) then raise SysErr("Invalid time", NONE) (* For non-zero times we convert this to a number of milliseconds since the current time. We have to pass in an absolute time rather than a relative time because the RTS may retry this call if the polled events haven't happened. *) else sys_poll_wait(ioVector, bitVector, tt + Time.now()) end (* Process the original list to see which items are present, retaining the original order. *) fun testResults(request as (bits, iod), tl) = let val (index, _) = (* Find the IO descriptor. It must be there somewhere. *) valOf(Vector.findi (fn (_, iod1) => compare(iod, iod1) = EQUAL) ioVector) (* The result is in the corresponding index position. We need to AND this with the request because we could have separate requests asking for different bits for the same file descriptor. *) val result = Word.andb(bits, Vector.sub(resV, index)) in if result = 0w0 then tl else PI(result, request) :: tl end in List.foldl testResults [] l end fun isIn(PI(b, _)) = Word.andb(b, inBit) <> 0w0 and isOut(PI(b, _)) = Word.andb(b, outBit) <> 0w0 and isPri(PI(b, _)) = Word.andb(b, priBit) <> 0w0 fun infoToPollDesc (PI(_, pd)) = pd end (* IO *) structure Process:> OS_PROCESS = struct type status = int local val doCall: int*unit -> int = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in val success = doCall(15, ()) and failure = doCall(16, ()) end fun isSuccess i = i = success local val doCall: int*string -> status = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in (* Run a process and wait for the result. *) fun system s = doCall(17, s) end local val doCall: int*(unit->unit) -> unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in (* Register a function to be run at exit. *) fun atExit f = doCall(18, f) end local val doExit = RunCall.run_call1 RuntimeCalls.POLY_SYS_exit val doCall: int*unit -> (unit->unit) = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in fun exit (n: int) = let val exitFun = (* If we get an empty list here we've finished. *) doCall(19, ()) handle _ => doExit n in (* Run the function and then repeat. *) exitFun() handle _ => (); exit(n) end end (* Terminate without running the atExit list or flushing the buffers. The type returns a type variable so we don't use the local...in...end mechanism to reduce extra calls, but it hardly matters since we'll only call this at most once per session! *) fun terminate n = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env(20, n) local val doCall: int*string -> string = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in (* Get an environment string. The underlying call raises an exception if the string isn't there. *) fun getEnv s = SOME(doCall(14, s)) handle RunCall.SysErr _ => NONE end (* poll is implemented so that an empty list simply waits for the time. *) fun sleep t = (IO.poll([], SOME t); ()) end (* Process. *) end; local (* Install the pretty printer for OS.IO.Kind and OS.syserror. *) fun kind_string k = if k = OS.IO.Kind.file then "file" else if k = OS.IO.Kind.dir then "dir" else if k = OS.IO.Kind.symlink then "symlink" else if k = OS.IO.Kind.tty then "tty" else if k = OS.IO.Kind.pipe then "pipe" else if k = OS.IO.Kind.socket then "socket" else if k = OS.IO.Kind.device then "device" else "unknown" fun printKind _ _ x = PolyML.PrettyString(kind_string x) fun printSysError _ _ x = PolyML.PrettyString(OS.errorName x) (* For the moment just make these opaque. *) fun printPollDesc _ _ (_: OS.IO.poll_desc) = PolyML.PrettyString "?" and printPollInfo _ _ (_: OS.IO.poll_info) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter printKind val () = PolyML.addPrettyPrinter printSysError val () = PolyML.addPrettyPrinter printPollDesc val () = PolyML.addPrettyPrinter printPollInfo end polyml-5.6/basis/Option.sml000066400000000000000000000052741265146633400160100ustar00rootroot00000000000000(* Title: Standard Basis Library: Option Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated, added "app" function. *) signature OPTION = sig datatype 'a option = NONE | SOME of 'a exception Option val getOpt : ('a option * 'a) -> 'a val isSome : 'a option -> bool val valOf : 'a option -> 'a val filter : ('a -> bool) -> 'a -> 'a option val join : 'a option option -> 'a option val app : ('a -> unit) -> 'a option -> unit val map : ('a -> 'b) -> 'a option -> 'b option val mapPartial : ('a -> 'b option) -> 'a option -> 'b option val compose : (('a -> 'b) * ('c -> 'a option)) -> 'c -> 'b option val composePartial : (('a -> 'b option) * ('c -> 'a option)) -> 'c -> 'b option end; structure Option : OPTION = struct (* datatype 'a option = NONE | SOME of 'a *) datatype option = datatype option exception Option fun getOpt (SOME a, _) = a | getOpt (NONE, b) = b fun isSome (SOME _) = true | isSome (NONE) = false fun valOf (SOME a) = a | valOf (NONE) = raise Option fun filter f a = if f a then SOME a else NONE fun join (SOME v) = v | join NONE = NONE fun app f (SOME v) = f v | app _ NONE = () fun map f (SOME v) = SOME (f v) | map _ NONE = NONE fun mapPartial f (SOME v) = f v | mapPartial _ NONE = NONE fun compose (f, g) a = case g a of NONE => NONE | SOME v => SOME (f v) fun composePartial (f, g) a = case g a of NONE => NONE | SOME v => f v end; (* Export some of these to the top-level. *) local structure dummy: sig (* datatype 'a option = NONE | SOME of 'a *) exception Option val getOpt : ('a option * 'a) -> 'a val isSome : 'a option -> bool val valOf : 'a option -> 'a end = Option in open dummy end; polyml-5.6/basis/PRIM_IO.sml000066400000000000000000000052161265146633400156720ustar00rootroot00000000000000(* Title: Standard Basis Library: Primitive IO Signature Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 done. *) signature PRIM_IO = sig type elem type vector type vector_slice type array type array_slice eqtype pos val compare : pos * pos -> General.order datatype reader = RD of { name : string, chunkSize : int, readVec : (int -> vector) Option.option, readArr : (array_slice -> int) Option.option, readVecNB : (int -> vector Option.option) Option.option, readArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) Option.option, canInput : (unit -> bool) Option.option, avail : unit -> int Option.option, getPos : (unit -> pos) Option.option, setPos : (pos -> unit) Option.option, endPos : (unit -> pos) Option.option, verifyPos : (unit -> pos) Option.option, close : unit -> unit, ioDesc : OS.IO.iodesc Option.option } datatype writer = WR of { name : string, chunkSize : int, writeVec : (vector_slice -> int) Option.option, writeArr : (array_slice -> int) Option.option, writeVecNB : (vector_slice -> int Option.option) Option.option, writeArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) Option.option, canOutput : (unit -> bool) Option.option, getPos : (unit -> pos) Option.option, setPos : (pos -> unit) Option.option, endPos : (unit -> pos) Option.option, verifyPos : (unit -> pos) Option.option, close : unit -> unit, ioDesc : OS.IO.iodesc Option.option } val openVector: vector -> reader val nullRd: unit -> reader val nullWr: unit -> writer val augmentReader : reader -> reader val augmentWriter : writer -> writer end; polyml-5.6/basis/PackRealBig.sml000066400000000000000000000167451265146633400166510ustar00rootroot00000000000000(* Title: Standard Basis Library: Pack Real structures and signatures Author: David Matthews Copyright David Matthews 2000, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature PACK_REAL = sig type real val bytesPerElem : int val isBigEndian : bool val toBytes : real -> Word8Vector.vector val fromBytes : Word8Vector.vector -> real val subVec : Word8Vector.vector * int -> real val subArr : Word8Array.array * int -> real val update : Word8Array.array * int * real -> unit end; local open LibrarySupport open RuntimeCalls open LibrarySupport.Word8Array val realSize: word = RunCall.run_call2 POLY_SYS_Real_Dispatch (28, ()) val System_lock: address -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_locks: string -> unit = RunCall.run_call1 POLY_SYS_lockseg; local val System_loadb: address * word -> Word8.word = RunCall.run_call2 POLY_SYS_load_byte; val System_setb: address * word * Word8.word -> unit = RunCall.run_call3 POLY_SYS_assign_byte; val System_move_bytes: address*word*address*word*word->unit = RunCall.run_call5 POLY_SYS_move_bytes (* Move bytes, reversing the order. *) fun swapOrder(src: address, srcOff: word, dest: address, destOff: word, length: word) = if length = 0w0 then () else ( System_setb(dest, destOff+length-0w1, System_loadb(src, srcOff)); swapOrder(src, srcOff+0w1, dest, destOff, length-0w1) ) in fun doMove(src: address, srcOff: word, dest: address, destOff: word, wantBigEndian: bool) = if wantBigEndian = bigEndian (* Host byte order = required byte order *) then System_move_bytes(src, srcOff, dest, destOff, realSize) else (* Host byte order is reverse of required byte order. *) swapOrder(src, srcOff, dest, destOff, realSize) end in structure PackRealBig: PACK_REAL = struct type real = real val bytesPerElem: int = Word.toInt realSize val isBigEndian = true (* Note: this seems unnecessary. *) fun toBytes r = let val v = allocString realSize (* r is actually represented by a pointer to a vector. *) val addr: address = RunCall.unsafeCast r in doMove(addr, 0w0, stringAsAddress v, wordSize, isBigEndian); System_locks v; w8vectorFromString v end fun fromBytes v = (* Raises an exception if the vector is too small and takes the first few elements if it's larger. *) if Word8Vector.length v < bytesPerElem then raise Subscript else let val r = allocBytes realSize in doMove(w8vectorAsAddress v, wordSize, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end fun subVec(v, i) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= Word.fromInt(Word8Vector.length v) then raise Subscript (* This IS defined. *) else let val r = allocBytes realSize in doMove(w8vectorAsAddress v, wordSize + iW, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end end fun subArr(Array(l, v), i) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= l then raise Subscript (* This IS defined. *) else let val r = allocBytes realSize in doMove(v, iW, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end end fun update(Array(l, v), i, r) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= l then raise Subscript (* This IS defined. *) else let (* r is actually represented by a pointer to a vector. *) val addr: address = RunCall.unsafeCast r in doMove(addr, 0w0, v, iW, isBigEndian) end end end; structure PackRealLittle: PACK_REAL = struct type real = real val bytesPerElem: int = Word.toInt realSize val isBigEndian = false fun toBytes r = let val v = allocString realSize (* r is actually represented by a pointer to a vector. *) val addr: address = RunCall.unsafeCast r in doMove(addr, 0w0, stringAsAddress v, wordSize, isBigEndian); System_locks v; w8vectorFromString v end fun fromBytes v = (* Raises an exception if the vector is too small and takes the first few elements if it's larger. *) if Word8Vector.length v < bytesPerElem then raise Subscript else let val r = allocBytes realSize in doMove(w8vectorAsAddress v, wordSize, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end fun subVec(v, i) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= Word.fromInt(Word8Vector.length v) then raise Subscript (* This IS defined. *) else let val r = allocBytes realSize in doMove(w8vectorAsAddress v, wordSize+iW, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end end fun subArr(Array(l, v), i) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= l then raise Subscript (* This IS defined. *) else let val r = allocBytes realSize in doMove(v, iW, r, 0w0, isBigEndian); System_lock r; (RunCall.unsafeCast r): real end end fun update(Array(l, v), i, r) = let val iW = unsignedShortOrRaiseSubscript i * realSize in if iW >= l then raise Subscript (* This IS defined. *) else let (* r is actually represented by a pointer to a vector. *) val addr: address = RunCall.unsafeCast r in doMove(addr, 0w0, v, iW, isBigEndian) end end end; end; polyml-5.6/basis/PackWord8Big.sml000066400000000000000000000166551265146633400167710ustar00rootroot00000000000000(* Title: Standard Basis Library: PACK_WORD signature and structures Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated, the structure names have changed. *) signature PACK_WORD = sig val bytesPerElem : int val isBigEndian : bool val subVec : Word8Vector.vector * int -> LargeWord.word val subVecX : Word8Vector.vector * int -> LargeWord.word val subArr : Word8Array.array * int -> LargeWord.word val subArrX : Word8Array.array * int -> LargeWord.word val update : Word8Array.array * int * LargeWord.word -> unit end; (* I'm not sure what use Pack8Big and Pack8Little are since they don't do any packing. *) structure PackWord8Big : PACK_WORD = struct val bytesPerElem = 1 val isBigEndian = true val subVec = Word8.toLargeWord o Word8Vector.sub val subVecX = Word8.toLargeWordX o Word8Vector.sub val subArr = Word8.toLargeWord o Word8Array.sub val subArrX = Word8.toLargeWordX o Word8Array.sub fun update(a, i, v) = Word8Array.update(a, i, Word8.fromLargeWord v) end; structure PackWord8Little : PACK_WORD = struct (* Exactly the same as Pack8Big except for the value of isBigEndian *) open PackWord8Big val isBigEndian = false end; local infix << >> infix andb infix orb val op orb = LargeWord.orb and op << = LargeWord.<< and op >> = LargeWord.>> fun twoBytesToWord(hi: Word8.word, lo: Word8.word) = (Word8.toLargeWord hi << 0w8) orb Word8.toLargeWord lo fun twoBytesToWordX(hi: Word8.word, lo: Word8.word) = (Word8.toLargeWordX hi << 0w8) orb Word8.toLargeWord lo fun fourBytesToWord(highest, higher, lower, low) = (Word8.toLargeWord highest << 0w24) orb (Word8.toLargeWord higher << 0w16) orb (Word8.toLargeWord lower << 0w8) orb Word8.toLargeWord low fun fourBytesToWordX(highest, higher, lower, low) = (Word8.toLargeWordX highest << 0w24) orb (Word8.toLargeWord higher << 0w16) orb (Word8.toLargeWord lower << 0w8) orb Word8.toLargeWord low in structure PackWord16Big : PACK_WORD = struct val bytesPerElem = 2 val isBigEndian = true fun subVec(a, i) = twoBytesToWord( Word8Vector.sub(a, i*2), Word8Vector.sub(a, i*2+1)) fun subVecX(a, i) = twoBytesToWordX( Word8Vector.sub(a, i*2), Word8Vector.sub(a, i*2+1)) fun subArr(a, i) = twoBytesToWord( Word8Array.sub(a, i*2), Word8Array.sub(a, i*2+1)) fun subArrX(a, i) = twoBytesToWordX( Word8Array.sub(a, i*2), Word8Array.sub(a, i*2+1)) fun update(a, i, v) = (* Check the index before doing any update. *) if i < 0 orelse i*2+1 >= Word8Array.length a then raise Subscript else (Word8Array.update(a, i*2+1, Word8.fromLargeWord v); Word8Array.update(a, i*2, Word8.fromLargeWord(v >> 0w8)) ) end; structure PackWord16Little : PACK_WORD = struct val bytesPerElem = 2 val isBigEndian = false fun subVec(a, i) = twoBytesToWord( Word8Vector.sub(a, i*2+1), Word8Vector.sub(a, i*2)) fun subVecX(a, i) = twoBytesToWordX( Word8Vector.sub(a, i*2+1), Word8Vector.sub(a, i*2)) fun subArr(a, i) = twoBytesToWord( Word8Array.sub(a, i*2+1), Word8Array.sub(a, i*2)) fun subArrX(a, i) = twoBytesToWordX( Word8Array.sub(a, i*2+1), Word8Array.sub(a, i*2)) fun update(a, i, v) = (* Check the index before doing any update. *) if i < 0 orelse i*2+1 >= Word8Array.length a then raise Subscript else (Word8Array.update(a, i*2, Word8.fromLargeWord v); Word8Array.update(a, i*2+1, Word8.fromLargeWord(v >> 0w8)) ) end; structure PackWord32Big : PACK_WORD = struct val bytesPerElem = 4 val isBigEndian = true fun subVec(a, i) = fourBytesToWord( Word8Vector.sub(a, i*4), Word8Vector.sub(a, i*4+1), Word8Vector.sub(a, i*4+2), Word8Vector.sub(a, i*4+3)) fun subVecX(a, i) = fourBytesToWordX( Word8Vector.sub(a, i*4), Word8Vector.sub(a, i*4+1), Word8Vector.sub(a, i*4+2), Word8Vector.sub(a, i*4+3)) fun subArr(a, i) = fourBytesToWord( Word8Array.sub(a, i*4), Word8Array.sub(a, i*4+1), Word8Array.sub(a, i*4+2), Word8Array.sub(a, i*4+3)) fun subArrX(a, i) = fourBytesToWordX( Word8Array.sub(a, i*4), Word8Array.sub(a, i*4+1), Word8Array.sub(a, i*4+2), Word8Array.sub(a, i*4+3)) fun update(a, i, v) = (* Check the index before doing any update. *) if i < 0 orelse i*4+3 >= Word8Array.length a then raise Subscript else (Word8Array.update(a, i*4+3, Word8.fromLargeWord v); Word8Array.update(a, i*4+2, Word8.fromLargeWord(v >> 0w8)); Word8Array.update(a, i*4+1, Word8.fromLargeWord(v >> 0w16)); Word8Array.update(a, i*4, Word8.fromLargeWord(v >> 0w24)) ) end; structure PackWord32Little : PACK_WORD = struct val bytesPerElem = 4 val isBigEndian = false fun subVec(a, i) = fourBytesToWord( Word8Vector.sub(a, i*4+3), Word8Vector.sub(a, i*4+2), Word8Vector.sub(a, i*4+1), Word8Vector.sub(a, i*4)) fun subVecX(a, i) = fourBytesToWordX( Word8Vector.sub(a, i*4+3), Word8Vector.sub(a, i*4+2), Word8Vector.sub(a, i*4+1), Word8Vector.sub(a, i*4)) fun subArr(a, i) = fourBytesToWord( Word8Array.sub(a, i*4+3), Word8Array.sub(a, i*4+2), Word8Array.sub(a, i*4+1), Word8Array.sub(a, i*4)) fun subArrX(a, i) = fourBytesToWordX( Word8Array.sub(a, i*4+3), Word8Array.sub(a, i*4+2), Word8Array.sub(a, i*4+1), Word8Array.sub(a, i*4)) fun update(a, i, v) = (* Check the index before doing any update. *) if i < 0 orelse i*4+3 >= Word8Array.length a then raise Subscript else (Word8Array.update(a, i*4, Word8.fromLargeWord v); Word8Array.update(a, i*4+1, Word8.fromLargeWord(v >> 0w8)); Word8Array.update(a, i*4+2, Word8.fromLargeWord(v >> 0w16)); Word8Array.update(a, i*4+3, Word8.fromLargeWord(v >> 0w24)) ) end end; polyml-5.6/basis/PolyMLException.sml000066400000000000000000000100071265146633400175610ustar00rootroot00000000000000(* Title: PolyML.Exception structure Author: David C. J. Matthews Copyright (c) 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Add PolyML.Exception to the PolyML structure. *) (* N.B. The effect of compiling this file is to extend the PolyML structure. *) structure PolyML = struct open PolyML local open RuntimeCalls in structure Exception = struct fun traceException(f: unit->'a, h: string list * exn -> 'a): 'a = RunCall.run_call1 POLY_SYS_exception_trace_fn f handle RunCall.ExTrace(s, e) => h(s, e) fun exceptionLocation(exn: exn): location option = let open RuntimeCalls datatype RuntimeLocation = NoLocation | SomeLocation of (* file: *) string * (*startLine:*) int * (*startPosition:*) int * (*endLine:*) int * (*endPosition:*) int in (* If we get an exception in the compiler it may be code that was built using the old exception packet format that didn't include a loction so we need to check the length of the packet first. This won't be needed once we can be sure we're using 5.3. *) if RunCall.run_call1 POLY_SYS_get_length exn < 0w4 then NONE else case RunCall.run_call2 POLY_SYS_load_word(exn, 0w3) of NoLocation => NONE | SomeLocation(file, startLine, startPosition, endLine, endPosition) => SOME { file=file, startLine=startLine, startPosition=startPosition, endLine=endLine, endPosition=endPosition } end (* Raise an exception using a given location rather than the value in the packet. *) fun raiseWithLocation(ex: exn, {file, startLine, startPosition, endLine, endPosition}: location) = let open RunCall RuntimeCalls fun getEntry n = run_call2 POLY_SYS_load_word(ex, n) (* This datatype is used in VALUE_OPS and FinalPolyML to define the format of a location in an exception packet. It includes the possibility that the location information may be missing. *) datatype RuntimeLocation = NoLocation | SomeLocation of (* file: *) string * (*startLine:*) int * (*startPosition:*) int * (*endLine:*) int * (*endPosition:*) int val packet = (getEntry 0, getEntry 1, getEntry 2, SomeLocation(file, startLine, startPosition, endLine, endPosition)) in run_call1 POLY_SYS_raisex packet end (* Re-raise an exception that has been handled preserving the location. *) fun reraise exn = case exceptionLocation exn of NONE => raise exn | SOME location => raiseWithLocation (exn, location) end end (* For backwards compatibility include these in the PolyML structure. *) val exceptionLocation = Exception.exceptionLocation and raiseWithLocation = Exception.raiseWithLocation end; polyml-5.6/basis/PolyVectorOperations.sml000066400000000000000000000142761265146633400207140ustar00rootroot00000000000000(* Title: Standard Basis Library: Vector and Array functor for polymorphic vectors and arrays Copyright David C.J. Matthews 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is almost identical to the VectorOperations functor but works on polymorphic vectors and arrays. There may be a way to combine the two. *) functor PolyVectorOperations( type 'a vector val length: 'a vector -> word val unsafeSub: 'a vector * word -> 'a val unsafeSet: 'a vector * word * 'a -> unit (* Array only *) ): sig val appi : ((int * 'a) -> unit) -> 'a vector -> unit val app : ('a -> unit) -> 'a vector -> unit val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldl : (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val modifyi : ((int * 'a) -> 'a) -> 'a vector -> unit (* Array only *) val modify : ('a -> 'a) -> 'a vector -> unit (* Array only *) val findi: (int * 'a -> bool) -> 'a vector -> (int * 'a) option val find: ('a -> bool) -> 'a vector -> 'a option val exists: ('a -> bool) -> 'a vector -> bool val all: ('a -> bool) -> 'a vector -> bool val collate: ('a * 'a -> order) -> 'a vector * 'a vector -> order end = struct val wordAsInt: word -> int = RunCall.unsafeCast (* Apply a function to each element in turn *) fun appi f vec = let val len = length vec fun doapp j = if j >= len then () else (f(wordAsInt j, unsafeSub(vec, j)); doapp(j+0w1)) in doapp 0w0 end fun app f vec = let val len = length vec fun doapp j = if j >= len then () else (f(unsafeSub(vec, j)); doapp(j+0w1)) in doapp 0w0 end (* Fold a function over a array. *) (* foldl - increasing index *) fun foldl f init vec = let val len = length vec fun dofold j acc = if j >= len then acc else dofold (j+0w1) (f (unsafeSub(vec, j), acc)) in dofold 0w0 init end fun foldli f init vec = let val len = length vec fun dofold j acc = if j >= len then acc else dofold (j+0w1) (f (wordAsInt j, unsafeSub(vec, j), acc)) in dofold 0w0 init end (* foldr - decreasing index *) fun foldr f init vec = let val len = length vec fun dofold j acc = if j = 0w0 then acc else dofold (j-0w1) (f (unsafeSub(vec, j-0w1), acc)) in dofold len init end fun foldri f init vec = let val len = length vec fun dofold j acc = if j = 0w0 then acc else dofold (j-0w1) (f (wordAsInt(j-0w1), unsafeSub(vec, j-0w1), acc)) in dofold len init end (* Apply a function to each element in turn and update the array with the new values. *) fun modifyi f vec = let val len = length vec fun doupdate j = if j >= len then () else (unsafeSet(vec, j, f(wordAsInt j, unsafeSub(vec, j))); doupdate(j+0w1)) in doupdate 0w0 end fun modify f vec = let val len = length vec fun doupdate j = if j >= len then () else (unsafeSet(vec, j, f(unsafeSub(vec, j))); doupdate(j+0w1)) in doupdate 0w0 end (* Find a character that matches the predicate. *) fun findi pred vec = let val len = length vec fun dofind j = if j >= len then NONE else let val v = unsafeSub(vec, j) in if pred(wordAsInt j, v) then SOME (wordAsInt j, v) else dofind (j+0w1) end in dofind 0w0 end fun find pred vec = let val len = length vec fun dofind j = if j >= len then NONE else let val v = unsafeSub(vec, j) in if pred v then SOME v else dofind (j+0w1) end in dofind 0w0 end fun exists f arr = Option.isSome(find f arr) fun all pred arr = not (exists (not o pred) arr) fun collate cmp (vec1, vec2) = let val len1 = length vec1 and len2 = length vec2 (* Keep comparing items until either we come to the end of one of the arrays or we find a mismatch. *) fun dotest j = if j >= len1 then if len1 = len2 then EQUAL else (* j < len2 *) LESS else if j >= len2 then (* But j < len1, so a1 is longer *) GREATER else case cmp(unsafeSub(vec1, j), unsafeSub(vec2, j)) of LESS => LESS | GREATER => GREATER | EQUAL => dotest (j+0w1) in dotest 0w0 end end; polyml-5.6/basis/Posix.sml000066400000000000000000001535461265146633400156500ustar00rootroot00000000000000(* Title: Standard Basis Library: Posix structure and signature. Author: David Matthews Copyright David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Only minor changes to Posix.IO. Done. *) signature POSIX_ERROR = sig type syserror = OS.syserror (* G&R 2004 has an error *) val toWord : syserror -> SysWord.word val fromWord : SysWord.word -> syserror val errorMsg : syserror -> string val errorName : syserror -> string val syserror : string -> syserror option val acces : syserror val again : syserror val badf : syserror val badmsg : syserror val busy : syserror val canceled (* sic *) : syserror val child : syserror val deadlk : syserror val dom : syserror val exist : syserror val fault : syserror val fbig : syserror val inprogress : syserror val intr : syserror val inval : syserror val io : syserror val isdir : syserror val loop : syserror val mfile : syserror val mlink : syserror val msgsize : syserror val nametoolong : syserror val nfile : syserror val nodev : syserror val noent : syserror val noexec : syserror val nolck : syserror val nomem : syserror val nospc : syserror val nosys : syserror val notdir : syserror val notempty : syserror val notsup : syserror val notty : syserror val nxio : syserror val perm : syserror val pipe : syserror val range : syserror val rofs : syserror val spipe : syserror val srch : syserror val toobig : syserror val xdev : syserror end; signature POSIX_SIGNAL = sig eqtype signal val toWord : signal -> SysWord.word val fromWord : SysWord.word -> signal val abrt : signal val alrm : signal val bus : signal val fpe : signal val hup : signal val ill : signal val int : signal val kill : signal val pipe : signal val quit : signal val segv : signal val term : signal val usr1 : signal val usr2 : signal val chld : signal val cont : signal val stop : signal val tstp : signal val ttin : signal val ttou : signal end; signature POSIX_PROCESS = sig eqtype signal eqtype pid val wordToPid : SysWord.word -> pid val pidToWord : pid -> SysWord.word val fork : unit -> pid option val exec : string * string list -> 'a val exece : string * string list * string list -> 'a val execp : string * string list -> 'a datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED (* sic *) of signal | W_STOPPED of signal val fromStatus : OS.Process.status -> exit_status structure W: sig include BIT_FLAGS val untraced : flags end val wait : unit -> pid * exit_status val waitpid : waitpid_arg * W.flags list -> pid * exit_status val waitpid_nh : waitpid_arg * W.flags list -> (pid * exit_status) option val exit : Word8.word -> 'a datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid val kill : killpid_arg * signal -> unit val alarm : Time.time -> Time.time val pause : unit -> unit (* QUESTION: Why does sleep return a Time.time ? Is it intended to be the time remaining? Assume so. *) val sleep : Time.time -> Time.time end; signature POSIX_PROC_ENV = sig eqtype pid eqtype uid eqtype gid eqtype file_desc val uidToWord : uid -> SysWord.word val wordToUid : SysWord.word -> uid val gidToWord : gid -> SysWord.word val wordToGid : SysWord.word -> gid val getpid : unit -> pid val getppid : unit -> pid val getuid : unit -> uid val geteuid : unit -> uid val getgid : unit -> gid val getegid : unit -> gid val setuid : uid -> unit val setgid : gid -> unit val getgroups : unit -> gid list val getlogin : unit -> string val getpgrp : unit -> pid val setsid : unit -> pid val setpgid : {pid : pid option, pgid : pid option} -> unit val uname : unit -> (string * string) list val time : unit -> Time.time val times : unit -> { elapsed : Time.time, utime : Time.time, stime : Time.time, cutime : Time.time, cstime : Time.time } val getenv : string -> string option val environ : unit -> string list val ctermid : unit -> string val ttyname : file_desc -> string val isatty : file_desc -> bool val sysconf : string -> SysWord.word end; signature POSIX_FILE_SYS = sig eqtype uid eqtype gid eqtype file_desc val fdToWord : file_desc -> SysWord.word val wordToFD : SysWord.word -> file_desc val fdToIOD : file_desc -> OS.IO.iodesc val iodToFD : OS.IO.iodesc -> file_desc option type dirstream val opendir : string -> dirstream val readdir : dirstream -> string option val rewinddir : dirstream -> unit val closedir : dirstream -> unit val chdir : string -> unit val getcwd : unit -> string val stdin : file_desc val stdout : file_desc val stderr : file_desc structure S : sig eqtype mode include BIT_FLAGS where type flags = mode val irwxu : mode val irusr : mode val iwusr : mode val ixusr : mode val irwxg : mode val irgrp : mode val iwgrp : mode val ixgrp : mode val irwxo : mode val iroth : mode val iwoth : mode val ixoth : mode val isuid : mode val isgid : mode end structure O: sig include BIT_FLAGS val append : flags val excl : flags val noctty : flags val nonblock : flags val sync : flags val trunc : flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val openf : string * open_mode * O.flags -> file_desc val createf : string * open_mode * O.flags * S.mode -> file_desc val creat : string * S.mode -> file_desc val umask : S.mode -> S.mode val link : {old : string, new : string} -> unit val mkdir : string * S.mode -> unit val mkfifo : string * S.mode -> unit val unlink : string -> unit val rmdir : string -> unit val rename : {old : string, new : string} -> unit val symlink : {old : string, new : string} -> unit val readlink : string -> string eqtype dev val wordToDev : SysWord.word -> dev val devToWord : dev -> SysWord.word eqtype ino val wordToIno : SysWord.word -> ino val inoToWord : ino -> SysWord.word structure ST: sig type stat val isDir : stat -> bool val isChr : stat -> bool val isBlk : stat -> bool val isReg : stat -> bool val isFIFO : stat -> bool val isLink : stat -> bool val isSock : stat -> bool val mode : stat -> S.mode val ino : stat -> ino val dev : stat -> dev val nlink : stat -> int val uid : stat -> uid val gid : stat -> gid val size : stat -> Position.int val atime : stat -> Time.time val mtime : stat -> Time.time val ctime : stat -> Time.time end val stat : string -> ST.stat val lstat : string -> ST.stat val fstat : file_desc -> ST.stat datatype access_mode = A_READ | A_WRITE | A_EXEC val access : string * access_mode list -> bool val chmod : string * S.mode -> unit val fchmod : file_desc * S.mode -> unit val chown : string * uid * gid -> unit val fchown : file_desc * uid * gid -> unit val utime : string * {actime : Time.time, modtime : Time.time} option -> unit val ftruncate : file_desc * Position.int -> unit val pathconf : string * string -> SysWord.word option val fpathconf : file_desc * string -> SysWord.word option end; signature POSIX_IO = sig eqtype file_desc eqtype pid val pipe: unit -> {infd : file_desc, outfd : file_desc} val dup: file_desc -> file_desc val dup2: {old : file_desc, new : file_desc} -> unit val close: file_desc -> unit val readVec : file_desc * int -> Word8Vector.vector val readArr: file_desc * Word8ArraySlice.slice -> int val writeVec: file_desc * Word8VectorSlice.slice -> int val writeArr: file_desc * Word8ArraySlice.slice -> int datatype whence = SEEK_SET | SEEK_CUR | SEEK_END structure FD: sig include BIT_FLAGS val cloexec: flags end structure O: sig include BIT_FLAGS val append : flags val nonblock : flags val sync : flags end datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR val dupfd : {old : file_desc, base : file_desc} -> file_desc val getfd : file_desc -> FD.flags val setfd : file_desc * FD.flags -> unit val getfl : file_desc -> O.flags * open_mode val setfl : file_desc * O.flags -> unit val lseek : file_desc * Position.int * whence -> Position.int val fsync : file_desc -> unit datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock: sig type flock val flock : { ltype : lock_type, whence : whence, start : Position.int, len : Position.int, pid : pid option } -> flock val ltype : flock -> lock_type val whence : flock -> whence val start : flock -> Position.int val len : flock -> Position.int val pid : flock -> pid option end val getlk : file_desc * FLock.flock -> FLock.flock val setlk : file_desc * FLock.flock -> FLock.flock val setlkw : file_desc * FLock.flock -> FLock.flock val mkBinReader: { fd : file_desc, name : string, initBlkMode : bool } -> BinPrimIO.reader val mkTextReader: { fd : file_desc, name : string, initBlkMode : bool } -> TextPrimIO.reader val mkBinWriter: { fd : file_desc, name : string, appendMode : bool, initBlkMode : bool, chunkSize : int } -> BinPrimIO.writer val mkTextWriter: { fd : file_desc, name : string, appendMode : bool, initBlkMode : bool, chunkSize : int } -> TextPrimIO.writer end; signature POSIX_SYS_DB = sig eqtype uid eqtype gid structure Passwd : sig type passwd val name : passwd -> string val uid : passwd -> uid val gid : passwd -> gid val home : passwd -> string val shell : passwd -> string end structure Group : sig type group val name : group -> string val gid : group -> gid val members : group -> string list end val getgrgid : gid -> Group.group val getgrnam : string -> Group.group val getpwuid : uid -> Passwd.passwd val getpwnam : string -> Passwd.passwd end; signature POSIX_TTY = sig eqtype pid eqtype file_desc structure V : sig val eof : int val eol : int val erase : int val intr : int val kill : int val min : int val quit : int val susp : int val time : int val start : int val stop : int val nccs : int type cc val cc : (int * char) list -> cc val update : cc * (int * char) list -> cc val sub : cc * int -> char end structure I : sig include BIT_FLAGS val brkint : flags val icrnl : flags val ignbrk : flags val igncr : flags val ignpar : flags val inlcr : flags val inpck : flags val istrip : flags val ixoff : flags val ixon : flags val parmrk : flags end structure O : sig include BIT_FLAGS val opost : flags end structure C : sig include BIT_FLAGS val clocal : flags val cread : flags val cs5 : flags val cs6 : flags val cs7 : flags val cs8 : flags val csize : flags val cstopb : flags val hupcl : flags val parenb : flags val parodd : flags end structure L : sig include BIT_FLAGS val echo : flags val echoe : flags val echok : flags val echonl : flags val icanon : flags val iexten : flags val isig : flags val noflsh : flags val tostop : flags end eqtype speed val compareSpeed : speed * speed -> order val speedToWord : speed -> SysWord.word val wordToSpeed : SysWord.word -> speed val b0 : speed val b50 : speed val b75 : speed val b110 : speed val b134 : speed val b150 : speed val b200 : speed val b300 : speed val b600 : speed val b1200 : speed val b1800 : speed val b2400 : speed val b4800 : speed val b9600 : speed val b19200 : speed val b38400 : speed type termios val termios : { iflag : I.flags, oflag : O.flags, cflag : C.flags, lflag : L.flags, cc : V.cc, ispeed : speed, ospeed : speed } -> termios val fieldsOf : termios -> { iflag : I.flags, oflag : O.flags, cflag : C.flags, lflag : L.flags, cc : V.cc, ispeed : speed, ospeed : speed } val getiflag : termios -> I.flags val getoflag : termios -> O.flags val getcflag : termios -> C.flags val getlflag : termios -> L.flags val getcc : termios -> V.cc structure CF : sig val getospeed : termios -> speed val setospeed : termios * speed -> termios val getispeed : termios -> speed val setispeed : termios * speed -> termios end structure TC : sig eqtype set_action val sanow : set_action val sadrain : set_action val saflush : set_action eqtype flow_action val ooff : flow_action val oon : flow_action val ioff : flow_action val ion : flow_action eqtype queue_sel val iflush : queue_sel val oflush : queue_sel val ioflush : queue_sel val getattr : file_desc -> termios val setattr : file_desc * set_action * termios -> unit val sendbreak : file_desc * int -> unit val drain : file_desc -> unit val flush : file_desc * queue_sel -> unit val flow : file_desc * flow_action -> unit end val getpgrp : file_desc -> pid val setpgrp : file_desc * pid -> unit end; signature POSIX = sig structure Error : POSIX_ERROR structure Signal : POSIX_SIGNAL structure Process : POSIX_PROCESS where type signal = Signal.signal structure ProcEnv : POSIX_PROC_ENV where type pid = Process.pid structure FileSys : POSIX_FILE_SYS where type file_desc = ProcEnv.file_desc where type uid = ProcEnv.uid where type gid = ProcEnv.gid structure IO : POSIX_IO where type pid = Process.pid where type file_desc = ProcEnv.file_desc where type open_mode = FileSys.open_mode structure SysDB : POSIX_SYS_DB where type uid = ProcEnv.uid where type gid = ProcEnv.gid structure TTY : POSIX_TTY where type pid = Process.pid where type file_desc = ProcEnv.file_desc end; structure Posix :> sig include POSIX (* I'm not sure if it's legal to use where type with a datatype. The alternative is to copy the whole of the signature and use datatype replication. *) where type FileSys.access_mode = OS.FileSys.access_mode sharing type Process.pid = ProcEnv.pid = IO.pid = TTY.pid sharing type ProcEnv.uid = FileSys.uid = SysDB.uid sharing type ProcEnv.gid = FileSys.gid = SysDB.gid sharing type ProcEnv.file_desc = FileSys.file_desc = IO.file_desc = TTY.file_desc end (* Posix.Signal.signal is made the same as int so that we can pass the values directly to our (non-standard) Signal.signal function. Since there isn't a standard way of handling signals this is the best we can do. *) where type Signal.signal = int where type FileSys.dirstream = OS.FileSys.dirstream = struct open RuntimeCalls; fun getConst i = SysWord.fromInt(RunCall.run_call2 POLY_SYS_os_specific (4, i)) structure BitFlags = (* This structure is used as the basis of all the BIT_FLAGS structures. *) struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) end structure Error = struct type syserror = OS.syserror val errorMsg = OS.errorMsg and errorName = OS.errorName and syserror = OS.syserror fun toWord (s: syserror): SysWord.word = SysWord.fromInt(RunCall.unsafeCast s) and fromWord (w: SysWord.word) : syserror = RunCall.unsafeCast(SysWord.toInt w) val toobig = fromWord(getConst 0) and acces = fromWord(getConst 1) and again = fromWord(getConst 2) and badf = fromWord(getConst 3) and badmsg = fromWord(getConst 4) and busy = fromWord(getConst 5) and canceled (* sic *) = fromWord(getConst 6) and child = fromWord(getConst 7) and deadlk = fromWord(getConst 8) and dom = fromWord(getConst 9) and exist = fromWord(getConst 10) and fault = fromWord(getConst 11) and fbig = fromWord(getConst 12) and inprogress = fromWord(getConst 13) and intr = fromWord(getConst 14) and inval = fromWord(getConst 15) and io = fromWord(getConst 16) and isdir = fromWord(getConst 17) and loop = fromWord(getConst 18) and mfile = fromWord(getConst 19) and mlink = fromWord(getConst 20) and msgsize = fromWord(getConst 21) and nametoolong = fromWord(getConst 22) and nfile = fromWord(getConst 23) and nodev = fromWord(getConst 24) and noent = fromWord(getConst 25) and noexec = fromWord(getConst 26) and nolck = fromWord(getConst 27) and nomem = fromWord(getConst 28) and nospc = fromWord(getConst 29) and nosys = fromWord(getConst 30) and notdir = fromWord(getConst 31) and notempty = fromWord(getConst 32) and notsup = fromWord(getConst 33) and notty = fromWord(getConst 34) and nxio = fromWord(getConst 35) and perm = fromWord(getConst 36) and pipe = fromWord(getConst 37) and range = fromWord(getConst 38) and rofs = fromWord(getConst 39) and spipe = fromWord(getConst 40) and srch = fromWord(getConst 41) and xdev = fromWord(getConst 42) end; structure Signal = struct type signal = int val toWord = SysWord.fromInt and fromWord = SysWord.toInt (* These signal values are probably defined to correspond to particular numbers but there's no harm in getting them from the RTS. *) val abrt = fromWord(getConst 43) and alrm = fromWord(getConst 44) and bus = fromWord(getConst 45) and fpe = fromWord(getConst 46) and hup = fromWord(getConst 47) and ill = fromWord(getConst 48) and int = fromWord(getConst 49) and kill = fromWord(getConst 50) and pipe = fromWord(getConst 51) and quit = fromWord(getConst 52) and segv = fromWord(getConst 53) and term = fromWord(getConst 54) and usr1 = fromWord(getConst 55) and usr2 = fromWord(getConst 56) and chld = fromWord(getConst 57) and cont = fromWord(getConst 58) and stop = fromWord(getConst 59) and tstp = fromWord(getConst 60) and ttin = fromWord(getConst 61) and ttou = fromWord(getConst 62) end; structure Process = struct type signal = Signal.signal type pid = int val pidToWord = SysWord.fromInt and wordToPid = SysWord.toInt datatype waitpid_arg = W_ANY_CHILD | W_CHILD of pid | W_SAME_GROUP | W_GROUP of pid datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED of signal | W_STOPPED of signal datatype killpid_arg = K_PROC of pid | K_SAME_GROUP | K_GROUP of pid structure W = struct open BitFlags val untraced = getConst 133 val nohang = getConst 134 (* Not exported. *) val all = flags [ untraced, nohang] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun fork () = case doCall(5, ()) of 0 => NONE (* Parent *) | n => SOME n (* Child *) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in (* Map the pid argument to positive, zero or negative. *) fun kill (K_PROC pid, si) = doCall(6,(pid, si)) | kill (K_SAME_GROUP, si) = doCall(6, (0, si)) | kill (K_GROUP pid, si) = doCall(6, (~pid, si)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in (* The format of a result may well be sufficiently fixed that we could decode it without calling the RTS. It's probably worth the small cost to make maintenance easier. *) fun fromStatus (stat: OS.Process.status): exit_status = case (doCall(15, stat)) of (1, 0) => W_EXITED | (1, n) => W_EXITSTATUS(Word8.fromInt n) | (2, n) => W_SIGNALED n | (3, n) => W_STOPPED n | _ => raise Fail "Unknown result status" end local val doCall = RunCall.run_call2 POLY_SYS_os_specific fun doWait(kind: int, pid: pid, flags: W.flags list) = let val (pid, status) = doCall(14, (kind, pid, SysWord.toInt(W.flags flags))) in (pid, fromStatus status) end in fun waitpid(W_ANY_CHILD, flags) = doWait(0, 0, flags) | waitpid(W_CHILD pid, flags) = doWait(1, pid, flags) | waitpid(W_SAME_GROUP, flags) = doWait(2, 0, flags) | waitpid(W_GROUP pid, flags) = doWait(3, pid, flags) fun wait() = waitpid(W_ANY_CHILD, []) fun waitpid_nh(wpa, flags) = let val (pid, status) = waitpid(wpa, W.nohang :: flags) in if pid = 0 then NONE else SOME(pid, status) end end fun exec(p, args) = RunCall.run_call2 POLY_SYS_os_specific(17, (p, args)) and exece(p, args, env) = RunCall.run_call2 POLY_SYS_os_specific(18, (p, args, env)) and execp(p, args) = RunCall.run_call2 POLY_SYS_os_specific(19, (p, args)) (* The definition of "exit" is obviously designed to allow OS.Process.exit to be defined in terms of it. In particular it doesn't execute the functions registered with atExit. *) fun exit w = RunCall.run_call1 RuntimeCalls.POLY_SYS_exit w local val doCall = RunCall.run_call2 POLY_SYS_os_specific fun toAbsolute t = if t < Time.zeroTime then raise OS.SysErr("Invalid time", NONE) else t + Time.now() (* Because of rounding we may get a negative time. In that case we return zero. *) fun endTime t = let val now = Time.now() in if t > now then t-now else Time.zeroTime end in (* This previously used absolute times. Now uses relative. *) fun alarm t = doCall(20, t) fun sleep t = let val finish = toAbsolute t in (* We need to pass in the absolute time here. That's because the process scheduler retries the function until a signal occurs or the time expires. *) (* The result is zero if it returns successfully. If an exception is raised we return the remaining time. We assume that this only happens because the process is interrupted. We don't handle the Interrupt exception, though. *) (doCall(22, finish); Time.zeroTime) handle OS.SysErr _ => endTime finish end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun pause() = doCall(21, ()) end end; structure ProcEnv = struct type pid = Process.pid and file_desc = OS.IO.iodesc type uid = int and gid = int val uidToWord = SysWord.fromInt and wordToUid = SysWord.toInt and gidToWord = SysWord.fromInt and wordToGid = SysWord.toInt local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getpid () = doCall(7, ()) and getppid () = doCall(8, ()) and getuid () = doCall(9, ()) and geteuid () = doCall(10, ()) and getgid () = doCall(11, ()) and getegid () = doCall(12, ()) and getpgrp () = doCall(13, ()) and setsid () = doCall(27, ()) end val getenv = OS.Process.getEnv fun environ() = RunCall.run_call2 POLY_SYS_process_env(21, ()) local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun setuid(u: uid) = doCall(23, u) and setgid(g: gid) = doCall(24, g) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getgroups() = doCall(25, ()) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getlogin() = doCall(26, ()) and ctermid() = doCall(30, ()) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in (* In each case NONE as an argument is taken as 0. *) fun setpgid{pid, pgid} = doCall(28, (getOpt(pid, 0), getOpt(pgid, 0))) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun uname() = doCall(29, ()) end val time = Time.now fun times() = let (* Apart from the child times all these could be obtained by calling the Timer functions. *) val doCall: int*unit -> Time.time = RunCall.run_call2 RuntimeCalls.POLY_SYS_timing_dispatch fun getUserTime() = doCall(7, ()) and getSysTime() = doCall(8, ()) and getRealTime() = doCall(10, ()) and getChildUserTime() = doCall(11, ()) and getChildSysTime() = doCall(12, ()) in { elapsed=getRealTime(), utime=getUserTime(), stime=getSysTime(), cutime=getChildUserTime(), cstime=getChildSysTime()} end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun ttyname(f: file_desc) = doCall(31, f) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun isatty(f: file_desc) = doCall(32, f) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun sysconf(s: string) = SysWord.fromInt(doCall(33, s)) end end; structure FileSys = struct type uid = ProcEnv.uid and gid = ProcEnv.gid type file_desc = OS.IO.iodesc type dirstream = OS.FileSys.dirstream datatype open_mode = O_RDONLY | O_WRONLY | O_RDWR structure O = struct open BitFlags val append = getConst 66 and excl = getConst 67 and noctty = getConst 68 and nonblock = getConst 69 and sync = getConst 70 and trunc = getConst 71 val all = flags [append, excl, noctty, nonblock, sync, trunc] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end local val doIo: int*file_desc*unit -> int = RunCall.run_call3 POLY_SYS_io_dispatch in fun fdToWord (f: file_desc) = SysWord.fromInt(doIo(30, f, ())) end local val doIo: int*unit*int -> file_desc = RunCall.run_call3 POLY_SYS_io_dispatch in fun wordToFD(s: SysWord.word): file_desc = doIo(31, (), SysWord.toInt s) end (* file_desc and OS.IO.iodesc are the same. *) fun fdToIOD i = i and iodToFD i = SOME i val opendir = OS.FileSys.openDir and readdir = OS.FileSys.readDir and rewinddir = OS.FileSys.rewindDir and closedir = OS.FileSys.closeDir and chdir = OS.FileSys.chDir and getcwd = OS.FileSys.getDir and unlink = OS.FileSys.remove and rmdir = OS.FileSys.rmDir and rename = OS.FileSys.rename and readlink = OS.FileSys.readLink val stdin : file_desc = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_stdin val stdout : file_desc = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_stdout val stderr : file_desc = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_stderr structure S = struct open BitFlags type mode = flags val irusr : mode = getConst 145 and iwusr : mode = getConst 146 and ixusr : mode = getConst 147 val irwxu : mode = flags[irusr, iwusr, ixusr] val irgrp : mode = getConst 148 and iwgrp : mode = getConst 149 and ixgrp : mode = getConst 150 val irwxg : mode = flags[irgrp, iwgrp, ixgrp] val iroth : mode = getConst 151 and iwoth : mode = getConst 152 and ixoth : mode = getConst 153 val irwxo : mode = flags[iroth, iwoth, ixoth] val isuid : mode = getConst 154 val isgid : mode = getConst 155 val all = flags [irwxu, irwxg, irwxo, isuid, isgid] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end local val o_rdonly = getConst 63 and o_wronly = getConst 64 and o_rdwr = getConst 65 fun toBits O_RDONLY = o_rdonly | toBits O_WRONLY = o_wronly | toBits O_RDWR = o_rdwr val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun openf(name, mode, flags) = let val bits = SysWord.orb(flags, toBits mode) in doIo(70, 0, (name, SysWord.toInt bits, 0)) end and createf(name, mode, flags, smode) = let val bits = SysWord.orb(flags, toBits mode) in doIo(71, 0, (name, SysWord.toInt bits, SysWord.toInt smode)) end end fun creat(s, m) = createf(s, O_WRONLY, O.trunc, m) local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun umask m = SysWord.fromInt(doCall(50, SysWord.toInt m)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun link{old, new} = doCall(51, (old, new)) and symlink{old, new} = doCall(54, (old, new)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun mkdir(name, mode) = doCall(52, (name, SysWord.toInt mode)) and mkfifo(name, mode) = doCall(53, (name, SysWord.toInt mode)) and chmod(name, mode) = doCall(59, (name, SysWord.toInt mode)) end type dev = int and ino = int val wordToDev = SysWord.toInt and devToWord = SysWord.fromInt and wordToIno = SysWord.toInt and inoToWord = SysWord.fromInt structure ST = struct type stat = { mode: S.mode, kind: int, ino: ino, dev: dev, nlink: int, uid: uid, gid: gid, size: int, atime: Time.time, mtime: Time.time, ctime: Time.time } (* The "kind" information is encoded by "stat" *) fun isDir({ kind, ...} : stat) = kind = 1 and isChr({ kind, ...} : stat) = kind = 2 and isBlk({ kind, ...} : stat) = kind = 3 and isReg({ kind, ...} : stat) = kind = 0 and isFIFO({ kind, ...} : stat) = kind = 4 and isLink({ kind, ...} : stat) = kind = 5 and isSock({ kind, ...} : stat) = kind = 6 val mode : stat -> S.mode = #mode and ino : stat -> ino = #ino val dev : stat -> dev = #dev val nlink : stat -> int = #nlink val uid : stat -> uid = #uid val gid : stat -> gid = #gid val size : stat -> Position.int = #size val atime : stat -> Time.time = #atime val mtime : stat -> Time.time = #mtime val ctime : stat -> Time.time = #ctime end local val doCall1 = RunCall.run_call2 POLY_SYS_os_specific val doCall2 = RunCall.run_call2 POLY_SYS_os_specific fun convStat(mode, kind, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = { mode = SysWord.fromInt mode, kind = kind, ino = ino, dev = dev, nlink = nlink, uid = uid, gid = gid, size = size, atime = atime, mtime = mtime, ctime = ctime } in fun stat name = convStat(doCall1(55, name)) and lstat name = convStat(doCall1(56, name)) and fstat f = convStat(doCall2(57, f)) end datatype access_mode = datatype OS.FileSys.access_mode local val doCall = RunCall.run_call2 POLY_SYS_os_specific val rOK = getConst 156 and wOK = getConst 157 and eOK = getConst 158 and fOK = getConst 159 fun abit A_READ = rOK | abit A_WRITE = wOK | abit A_EXEC = eOK val abits = List.foldl (fn (a, b) => SysWord.orb(abit a,b)) 0w0 in (* If the bits are nil it tests for existence of the file. *) fun access(name, []) = doCall(58, (name, SysWord.toInt(fOK))) | access(name, al) = doCall(58, (name, SysWord.toInt(abits al))) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun fchmod(fd, mode) = doCall(60, (fd, SysWord.toInt mode)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun chown(name, uid, gid) = doCall(61, (name, uid, gid)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun fchown(fd, uid, gid) = doCall(62, (fd, uid, gid)) end local val doCall1 = RunCall.run_call2 POLY_SYS_os_specific and doCall2 = RunCall.run_call2 POLY_SYS_os_specific in fun utime (name, NONE) = doCall1(64, name) | utime (name, SOME{actime, modtime}) = doCall2(63, (name, actime, modtime)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun ftruncate(fd, size) = doCall(65, (fd, size)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun pathconf(name, var) = let val res = doCall(66, (name, var)) in if res < 0 then NONE else SOME(SysWord.fromInt res) end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun fpathconf(fd, var) = let val res = doCall(67, (fd, var)) in if res < 0 then NONE else SOME(SysWord.fromInt res) end end end; structure IO = struct type file_desc = OS.IO.iodesc and pid = Process.pid structure FD = struct open BitFlags val cloexec: flags = getConst 132 val all = flags [cloexec] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end (* Posix.IO.O seems to be a cut-down version of Posix.FileSys.O. It seems to me that one structure would suffice. *) structure O = FileSys.O datatype open_mode = datatype FileSys.open_mode local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun close (strm: file_desc): unit = doIo(7, strm, 0) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun readVec (strm: file_desc, len: int): Word8Vector.vector = doIo(26, strm, len) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun pipe() = let val (inf, outf) = doCall(110, ()) in { infd=inf, outfd=outf } end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun dup fd = doCall(111, fd) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun dup2{old, new} = doCall(112, (old, new)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun dupfd{old, base} = doCall(113, (old, base)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific val o_rdonly = getConst 63 and o_wronly = getConst 64 and o_accmode = getConst 166 (* Access mode mask. *) in fun getfd fd = SysWord.fromInt(doCall(114, fd)) and getfl fd = let val res = SysWord.fromInt(doCall(116, fd)) (* Separate out the mode bits. *) val flgs = SysWord.andb(res, SysWord.notb o_accmode) val mode = SysWord.andb(res, o_accmode) val omode = if mode = o_rdonly then O_RDONLY else if mode = o_wronly then O_WRONLY else O_RDWR in (flgs, omode) end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun setfd(fd, flags) = doCall(115, (fd, SysWord.toInt flags)) and setfl(fd, flags) = doCall(117, (fd, SysWord.toInt flags)) end datatype whence = SEEK_SET | SEEK_CUR | SEEK_END local val seekSet = SysWord.toInt(getConst 160) and seekCur = SysWord.toInt(getConst 161) and seekEnd = SysWord.toInt(getConst 162) in (* Convert the datatype to the corresponding int. *) fun seekWhence SEEK_SET = seekSet | seekWhence SEEK_CUR = seekCur | seekWhence SEEK_END = seekEnd fun whenceSeek s = if s = seekSet then SEEK_SET else if s = seekCur then SEEK_CUR else SEEK_END end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun lseek(fd, pos, whence) = doCall(115, (fd, pos, seekWhence whence)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun fsync fd = doCall(119, fd) end datatype lock_type = F_RDLCK | F_WRLCK | F_UNLCK structure FLock = struct val fRdlck = SysWord.toInt(getConst 163) and fWrlck = SysWord.toInt(getConst 164) and fUnlck = SysWord.toInt(getConst 165) type flock = int (* lock type *) * int (* whence *) * Position.int (* start *) * Position.int (* len *) * pid fun flock{ltype, whence, start, len, pid} = let val lt = case ltype of F_RDLCK => fRdlck | F_WRLCK => fWrlck | F_UNLCK => fUnlck in (lt, seekWhence whence, start, len, getOpt(pid, ~1)) end fun ltype (lt, _, _, _, _) = if lt = fRdlck then F_RDLCK else if lt = fWrlck then F_WRLCK else F_UNLCK fun whence (fl: flock) = whenceSeek(#2 fl) val start : flock -> Position.int = #3 val len : flock -> Position.int = #4 fun pid (_, _, _, _, pid) = if pid < 0 then NONE else SOME pid end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getlk(fd, (t, w, s, l, p)) = doCall(120, (fd, t, w, s, l, p)) (* Note: the return type of setlk and setlkw is Flock.lock not unit. I assume they simply return their argument. *) and setlk(fd, (t, w, s, l, p)) = doCall(121, (fd, t, w, s, l, p)) and setlkw(fd, (t, w, s, l, p)) = doCall(122, (fd, t, w, s, l, p)) end val readArr = LibraryIOSupport.readBinArray and writeVec = LibraryIOSupport.writeBinVec and writeArr = LibraryIOSupport.writeBinArray val mkTextReader = LibraryIOSupport.wrapInFileDescr and mkTextWriter = LibraryIOSupport.wrapOutFileDescr val mkBinReader = LibraryIOSupport.wrapBinInFileDescr and mkBinWriter = LibraryIOSupport.wrapBinOutFileDescr end; structure SysDB = struct type uid = ProcEnv.uid and gid = ProcEnv.gid structure Passwd = struct type passwd = string * uid * gid * string * string val name: passwd->string = #1 and uid: passwd->uid = #2 and gid: passwd->gid = #3 and home: passwd->string = #4 and shell: passwd->string = #5 end structure Group = struct type group = string * gid * string list val name: group->string = #1 and gid: group->gid = #2 and members: group->string list = #3 end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getpwnam (s: string): Passwd.passwd = doCall(100, s) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getpwuid (u: uid): Passwd.passwd = doCall(101, u) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getgrnam (s: string): Group.group = doCall(102, s) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getgrgid (g: gid): Group.group = doCall(103, g) end end; structure TTY = struct type pid = Process.pid and file_desc = OS.IO.iodesc structure V = struct val eof = SysWord.toInt(getConst 72) and eol = SysWord.toInt(getConst 73) and erase = SysWord.toInt(getConst 74) and intr = SysWord.toInt(getConst 75) and kill = SysWord.toInt(getConst 76) and min = SysWord.toInt(getConst 77) and quit = SysWord.toInt(getConst 78) and susp = SysWord.toInt(getConst 79) and time = SysWord.toInt(getConst 80) and start = SysWord.toInt(getConst 81) and stop = SysWord.toInt(getConst 82) and nccs = SysWord.toInt(getConst 83) type cc = string fun cc l = (* Generate a string using the values given and defaulting the rest to NULL. *) let fun find [] _ = #"\000" | find ((n, c)::l) i = if i = n then c else find l i in CharVector.tabulate(nccs, find l) end (* Question: What order does this take? E.g. What is the result of update(cc, [(eof, #"a"), (eof, #"b")]) ? Assume that earlier entries take precedence. That also affects the processing of exceptions. *) fun update(cc, l) = let fun find [] i = String.sub(cc, i) | find ((n, c)::l) i = if i = n then c else find l i in CharVector.tabulate(nccs, find l) end val sub = String.sub end structure I = struct open BitFlags val brkint = getConst 84 and icrnl = getConst 85 and ignbrk = getConst 86 and igncr = getConst 87 and ignpar = getConst 88 and inlcr = getConst 89 and inpck = getConst 90 and istrip = getConst 91 and ixoff = getConst 92 and ixon = getConst 93 and parmrk = getConst 94 val all = flags [brkint, icrnl, ignbrk, igncr, ignpar, inlcr, inpck, istrip, ixoff, ixon, parmrk] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end structure O = struct open BitFlags val opost = getConst 95 val all = flags [opost] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end structure C = struct open BitFlags val clocal = getConst 96 and cread = getConst 97 and cs5 = getConst 98 and cs6 = getConst 99 and cs7 = getConst 100 and cs8 = getConst 101 and csize = getConst 102 and cstopb = getConst 103 and hupcl = getConst 104 and parenb = getConst 105 and parodd = getConst 106 val all = flags [clocal, cread, cs5, cs6, cs7, cs8, csize, cstopb, hupcl, parenb, parodd] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end structure L = struct open BitFlags val echo = getConst 107 and echoe = getConst 108 and echok = getConst 109 and echonl = getConst 110 and icanon = getConst 111 and iexten = getConst 112 and isig = getConst 113 and noflsh = getConst 114 and tostop = getConst 115 val all = flags [echo, echoe, echok, echonl, icanon, iexten, isig, noflsh, tostop] val intersect = List.foldl (fn (a, b) => SysWord.andb(a, b)) all end type speed = int (* compareSpeed is supposed to compare by the baud rate, not by the encoding. Provided the encoding maintains the ordering then that's fine. Maybe we should have an RTS call. *) val compareSpeed : speed * speed -> order = Int.compare and speedToWord : speed -> SysWord.word = SysWord.fromInt and wordToSpeed : SysWord.word -> speed = SysWord.toInt val b0 : speed = SysWord.toInt(getConst 116) and b50 : speed = SysWord.toInt(getConst 117) and b75 : speed = SysWord.toInt(getConst 118) and b110 : speed = SysWord.toInt(getConst 119) and b134 : speed = SysWord.toInt(getConst 120) and b150 : speed = SysWord.toInt(getConst 121) and b200 : speed = SysWord.toInt(getConst 122) and b300 : speed = SysWord.toInt(getConst 123) and b600 : speed = SysWord.toInt(getConst 124) and b1200 : speed = SysWord.toInt(getConst 125) and b1800 : speed = SysWord.toInt(getConst 126) and b2400 : speed = SysWord.toInt(getConst 127) and b4800 : speed = SysWord.toInt(getConst 128) and b9600 : speed = SysWord.toInt(getConst 129) and b19200 : speed = SysWord.toInt(getConst 130) and b38400 : speed = SysWord.toInt(getConst 131) type termios = { iflag : I.flags, oflag : O.flags, cflag : C.flags, lflag : L.flags, cc : V.cc, ispeed : speed, ospeed : speed } fun termios t = t and fieldsOf t = t val getiflag : termios -> I.flags = #iflag and getoflag : termios -> O.flags = #oflag and getcflag : termios -> C.flags = #cflag and getlflag : termios -> L.flags = #lflag and getcc : termios -> V.cc = #cc structure CF = struct val getospeed : termios -> speed = #ospeed and getispeed : termios -> speed = #ispeed fun setospeed ({ iflag, oflag, cflag, lflag, cc, ispeed, ... }, speed) = { iflag=iflag, oflag=oflag, cflag=cflag, lflag=lflag, cc=cc, ispeed = ispeed, ospeed = speed } fun setispeed ({ iflag, oflag, cflag, lflag, cc, ospeed, ... }, speed) = { iflag=iflag, oflag=oflag, cflag=cflag, lflag=lflag, cc=cc, ispeed = speed, ospeed = ospeed } end structure TC = struct type set_action = int val sanow : set_action = SysWord.toInt(getConst 135) val sadrain : set_action = SysWord.toInt(getConst 136) val saflush : set_action = SysWord.toInt(getConst 137) type flow_action = int val ooff : flow_action = SysWord.toInt(getConst 138) val oon : flow_action = SysWord.toInt(getConst 139) val ioff : flow_action = SysWord.toInt(getConst 140) val ion : flow_action = SysWord.toInt(getConst 141) type queue_sel = int val iflush : queue_sel = SysWord.toInt(getConst 142) val oflush : queue_sel = SysWord.toInt(getConst 143) val ioflush : queue_sel = SysWord.toInt(getConst 144) local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getattr f = let val (iflag, oflag, cflag, lflag, cc, ispeed, ospeed) = doCall(150, f) in { iflag=SysWord.fromInt iflag, oflag=SysWord.fromInt oflag, cflag=SysWord.fromInt cflag, lflag=SysWord.fromInt lflag, cc=cc, ispeed = ispeed, ospeed = ospeed } end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun setattr (f, sa, {iflag, oflag, cflag, lflag, cc, ispeed, ospeed}) = doCall(151, (f, sa, SysWord.toInt iflag, SysWord.toInt oflag, SysWord.toInt cflag, SysWord.toInt lflag, cc, ispeed, ospeed)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun sendbreak (f, d) = doCall(152, (f, d)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun drain f = doCall(153, f) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun flush (f, qs) = doCall(154, (f, qs)) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun flow (f, fa) = doCall(155, (f, fa)) end end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun getpgrp (f: file_desc): pid = doCall(156, f) end local val doCall = RunCall.run_call2 POLY_SYS_os_specific in fun setpgrp (f: file_desc, p: pid): unit = doCall(157, (f,p)) end end end; local (* Install the pretty printers for pid, uid, gid. Don't install one for signal because it's now the same as int. *) fun ppid _ _ x = PolyML.PrettyString(Int.toString(SysWord.toInt(Posix.Process.pidToWord x))) and puid _ _ x = PolyML.PrettyString(Int.toString(SysWord.toInt(Posix.ProcEnv.uidToWord x))) and pgid _ _ x = PolyML.PrettyString(Int.toString(SysWord.toInt(Posix.ProcEnv.gidToWord x))) in val () = PolyML.addPrettyPrinter ppid val () = PolyML.addPrettyPrinter puid val () = PolyML.addPrettyPrinter pgid end; polyml-5.6/basis/PrettyPrinter.sml000066400000000000000000000220171265146633400173650ustar00rootroot00000000000000(* Title: Pretty Printer. Author: David C. J. Matthews Copyright (c) 2009, 2013, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is a complete rewrite of the original pretty printer. The original version was written in the Poly language in the early 80s and was based on the paper by D.C Oppen in ACM ToPLAS Vol. 2 No. 4 Oct 1980. His version was imperative and provided "blockBegin", "blockEnd", "break" and "string" functions to lay out the text. This version uses the "pretty" datatype that uses the same model of the text but implements it completely differently. PrettyString s - Prints out the string s PrettyStringWithWidth (s, w) - The same as PrettyString except that the width is given explicitly rather than being the length of the string. This is intended for multibyte encodings where the number of columns is not the same as the number of characters in the string PrettyBreak(blanks, offset) - Provides a place where the text may be broken. If no break is needed it prints "blanks" spaces. If a break is needed it add a temporary indent of "offset" to the indentation of the next block of text. PrettyBlock(indent, consistent, context, entries) - Defines a block of text. If all the entries will fit on the line they are simply printed out. If they do not fit the block must be broken. If "consistent" is true then every "PrettyBreak" within "entries" (at this level only, not recursively) is a break point and the line will be broken at that point. If "consistent" is false then a line break is inserted at a PrettyBreak only if the following entry will not fit. "indent" is the value that is added to the effective indentation each time the line is broken within this block. It does not affect the indentation of the first string in the block. PrettyLineBreak Insert an explicit line break *) (* N.B. The effect of compiling this file is to extend the PolyML structure. *) structure PolyML = struct open PolyML fun prettyMarkup (beginContext: context list -> unit, endContext: context list -> unit) (stream : string -> unit, lineWidth : int) (pretty: pretty): unit = let fun printBlanks n = if n > 0 then (stream " "; printBlanks(n-1)) else () (* Find out whether the block fits and return the space left if it does. Terminates with NONE as soon as it finds the line doesn't fit. *) fun getSize(PrettyBlock (_, _, _, entries), spaceLeft) = List.foldl(fn (p, SOME s) => getSize(p, s) | (_, NONE) => NONE) (SOME spaceLeft) entries | getSize(PrettyBreak (blanks, _), spaceLeft) = if blanks <= spaceLeft then SOME(spaceLeft-blanks) else NONE | getSize(PrettyString st, spaceLeft) = let val size = String.size st in if size <= spaceLeft then SOME(spaceLeft-size) else NONE end | getSize(PrettyStringWithWidth(_, w), spaceLeft) = if w <= spaceLeft then SOME(spaceLeft-w) else NONE | getSize(PrettyLineBreak, _) = NONE (* Lay out the block and return the space that is left after the line has been printed. *) fun layOut(p as PrettyBlock (blockOffset, consistent, context, entries), indent, spaceLeft) = let val blockIndent = indent+blockOffset in case getSize(p, spaceLeft) of SOME s => (* Fits *) ( beginContext context; (* Lay out the contents. This will not need to break. *) List.foldl(fn(p, space) => layOut(p, blockIndent, space)) spaceLeft entries; endContext context; s ) | NONE => (* Doesn't fit - break line somewhere. *) let (* Lay out this block, breaking where necessary. *) fun doPrint([], _, left) = (* Finished: return what's left. *) left | doPrint([PrettyBreak _], _, left) = left (* Ignore trailing breaks. *) | doPrint(PrettyBreak (blanks, breakIndent) :: rest, _, left) = let val currentIndent = blockIndent+breakIndent (* Compute the space of the next item(s) up to the end or the next space. Since we only break at spaces if there are Blocks or Strings without spaces between we need to know the total size. *) fun getsp([], left) = SOME left | getsp(PrettyBreak _ :: _, left) = SOME left | getsp(next::rest, left) = case getSize(next, left) of NONE => NONE | SOME sp => getsp(rest, sp) in if consistent orelse left <= blanks orelse not(isSome(getsp(rest, left-blanks))) then (* Either a consistent break or the next item won't fit. *) ( stream "\n"; printBlanks currentIndent; (* Carry the indent associated with this item forward so that it is included in the block indentation if the next item is a block. If it is a string we have already included it. *) doPrint(rest, breakIndent, lineWidth-currentIndent) ) else (* We don't need to break here. *) ( printBlanks blanks; doPrint(rest, 0, left-blanks) ) end | doPrint(PrettyString s :: rest, _, left) = ( stream s; doPrint(rest, 0, left-size s) ) | doPrint(PrettyStringWithWidth(s, w) :: rest, _, left) = ( stream s; doPrint(rest, 0, left-w) ) | doPrint((b as PrettyBlock _) :: rest, breakIndent, left) = doPrint(rest, 0, layOut(b, blockIndent+breakIndent, left)) | doPrint(PrettyLineBreak :: rest, _, _) = ( stream "\n"; printBlanks blockIndent; doPrint(rest, 0, lineWidth-blockIndent) ) val () = beginContext context; val onLine = doPrint(entries, 0, spaceLeft); val () = endContext context in onLine end end | layOut (PrettyBreak (blanks, _), _, spaceLeft) = ( printBlanks blanks; Int.max(spaceLeft-blanks, 0) ) | layOut (PrettyString st, _, spaceLeft) = ( stream st; Int.max(spaceLeft-String.size st, 0) ) | layOut (PrettyStringWithWidth(st, w), _, spaceLeft) = ( stream st; Int.max(spaceLeft-w, 0) ) | layOut (PrettyLineBreak, _, spaceLeft) = spaceLeft in if layOut(pretty, 0, lineWidth) <> lineWidth then stream "\n" (* End the line unless we haven't written anything. *) else () end (* Basic pretty printer without mark-up of context. *) val prettyPrint = prettyMarkup (fn _ => (), fn _ => ()) end (* PolyML *); polyml-5.6/basis/PrimIO.sml000066400000000000000000000563241265146633400157010ustar00rootroot00000000000000(* Title: Standard Basis Library: PrimIO functor Copyright David C.J. Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Done *) functor PrimIO ( structure Vector : MONO_VECTOR structure VectorSlice: MONO_VECTOR_SLICE structure Array : MONO_ARRAY structure ArraySlice : MONO_ARRAY_SLICE sharing type Array.elem = Vector.elem = VectorSlice.elem = ArraySlice.elem sharing type Array.vector = Vector.vector = VectorSlice.vector = ArraySlice.vector sharing type VectorSlice.slice = ArraySlice.vector_slice sharing type Array.array = ArraySlice.array val someElem : Array.elem eqtype pos (* Note: this was shown as just a type in the functor arg. *) val compare : pos * pos -> order ): PRIM_IO = struct type array = Array.array and vector = Vector.vector and elem = Array.elem and vector_slice = VectorSlice.slice and array_slice = ArraySlice.slice type pos = pos val compare = compare datatype reader = RD of { name : string, chunkSize : int, readVec : (int -> vector) Option.option, (* Use Option once to ensure dependency. *) readArr : (array_slice -> int) Option.option, readVecNB : (int -> vector Option.option) Option.option, readArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) option, canInput : (unit -> bool) option, avail : unit -> int option, getPos : (unit -> pos) option, setPos : (pos -> unit) option, endPos : (unit -> pos) option, verifyPos : (unit -> pos) option, close : unit -> unit, ioDesc : OS.IO.iodesc option } datatype writer = WR of { name : string, chunkSize : int, writeVec : (vector_slice -> int) Option.option, writeArr : (array_slice -> int) Option.option, writeVecNB : (vector_slice -> int Option.option) Option.option, writeArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) option, canOutput : (unit -> bool) option, getPos : (unit -> pos) option, setPos : (pos -> unit) option, endPos : (unit -> pos) option, verifyPos : (unit -> pos) option, close : unit -> unit, ioDesc : OS.IO.iodesc option } (* Define readVec, readArr, readVecNB, readArrNB if they are not provided using the functions which are. *) fun augmentReader ( RD { name : string, chunkSize : int, readVec : (int -> vector) Option.option, readArr : (array_slice -> int) Option.option, readVecNB : (int -> vector Option.option) Option.option, readArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) option, canInput : (unit -> bool) option, avail : unit -> int option, getPos : (unit -> pos) option, setPos : (pos -> unit) option, endPos : (unit -> pos) option, verifyPos : (unit -> pos) option, close : unit -> unit, ioDesc : OS.IO.iodesc option }) : reader = let (* First try defining readVec in terms of readArr. *) val readVec' = case (readVec, readArr) of (s as SOME _, _) => s (* If readVec exists use it. *) | (NONE, SOME ra) => (* if readVec doesn't exists but readArr does *) SOME( fn (l: int) => let (* Create an array initialised to zeros. We have to be careful here. Suppose the caller was using "readVec maxInt" to mean "give me the rest of the file" knowing that it was only small. To avoid problems we only read the smaller of the size requested or the block size. *) val v = Array.array(Int.min(l, chunkSize), someElem) (* Read as much as we can. *) val n = ra(ArraySlice.full v) in (* Return the section read. *) ArraySlice.vector(ArraySlice.slice(v, 0, SOME n)) end ) | (NONE, NONE) => NONE (* And vice-versa *) val readArr' = case (readArr, readVec) of (s as SOME _, _) => s(* If readArr exists use it. *) | (NONE, SOME rv) => (* if readArr doesn't exists but readVec does *) SOME( fn slice => let val (buff, i, len) = ArraySlice.base slice (* Read a vector and try and put that into the array. *) val r = rv len in (* Copy the vector into the array. *) Array.copyVec{src=r, dst = buff, di=i}; (* Return the number of characters read. *) Vector.length r end ) | (NONE, NONE) => NONE (* We now have the blocking versions of readVec and readArr if either of them existed. Now defining the non-blocking versions using these blocking versions if we have to. *) val readVecNB' = case (readVecNB, readArrNB) of (s as SOME _, _) => s (* If readVecNB exists use it. *) | (NONE, SOME ra) => (* If readVecNB does not exist but readArrNB does*) SOME( fn (l: int) => let val v = Array.array(Int.min(l, chunkSize), someElem) in case ra(ArraySlice.full v) of NONE => NONE | SOME n => (* Return the section read. *) SOME (ArraySlice.vector(ArraySlice.slice(v, 0, SOME n))) end ) | (NONE, NONE) => (* Try using the blocking readVec' with canInput. We use the readVec' we defined above so that this will also try using readArr. *) case (canInput, readVec') of (SOME canIn, SOME rv) => SOME( fn (l: int) => if canIn() then SOME(rv l) else NONE ) | _ => NONE (* Can't do it. *) val readArrNB' = case (readArrNB, readVecNB) of (s as SOME _, _) => s(* If readArrNB exists use it. *) | (NONE, SOME rv) => (* if readArrNB doesn't exists but readVecNB does *) SOME( fn slice => let val (buff, i, len) = ArraySlice.base slice in (* Try reading a vector of this size. *) case rv len of NONE => NONE | SOME r => ( (* Copy the vector into the array. *) Array.copyVec{src=r, dst = buff, di=i}; (* Return the number of characters read. *) SOME(Vector.length r) ) end ) | (NONE, NONE) => (* Try using the blocking readArr' with canInput. We use the readArr' we defined above so that this will also try using readVec. *) case (canInput, readArr') of (SOME canIn, SOME ra) => SOME( fn slice => if canIn() then SOME(ra slice) else NONE ) | _ => NONE (* Can't do it. *) (* Finally define the blocking functions in terms of the non-blocking if we have to. *) val readVec'' = case readVec' of (* If readVec' exists use it. i.e. if readVec or readArr were defined. *) (s as SOME _) => s | NONE => (* No blocking version exists - try using block and the synthesised non-blocking version. *) case (block, readVecNB') of (SOME blk, SOME rv) => SOME( fn (l: int) => ( blk(); case rv l of NONE => (* Should not occur. *) raise IO.Io{ name=name, function="readVec", cause = IO.BlockingNotSupported } | SOME v => v ) ) | _ => NONE (* Can't do it. *) val readArr'' = case readArr' of (* If readArr' exists use it. *) (s as SOME _) => s | NONE => (* Try using block and the synthesised readArrNB'. *) case (block, readArrNB') of (SOME blk, SOME ra) => SOME( fn slice => ( blk(); case ra slice of NONE => raise IO.Io{ name=name, function="readArr", cause = IO.BlockingNotSupported } | SOME l => l ) ) | _ => NONE (* Can't do it. *) in RD { name = name, chunkSize = chunkSize, readVec = readVec'', readArr = readArr'', readVecNB = readVecNB', readArrNB = readArrNB', block = block, canInput = canInput, avail = avail, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc } end fun augmentWriter (WR { name : string, chunkSize : int, writeVec : (vector_slice -> int) Option.option, writeArr : (array_slice -> int) Option.option, writeVecNB : (vector_slice -> int Option.option) Option.option, writeArrNB : (array_slice -> int Option.option) Option.option, block : (unit -> unit) option, canOutput : (unit -> bool) option, getPos : (unit -> pos) option, setPos : (pos -> unit) option, endPos : (unit -> pos) option, verifyPos : (unit -> pos) option, close : unit -> unit, ioDesc : OS.IO.iodesc option }) : writer = let (* First try defining writeVec in terms of writeArr. *) val writeVec' = case (writeVec, writeArr) of (s as SOME _, _) => s (* If writeVec exists use it. *) | (NONE, SOME ra) => (* if writeVec doesn't exists but writeArr does *) SOME( fn slice => let (* Create an array to hold this slice. *) val a = Array.array(VectorSlice.length slice, someElem) in (* Copy in the vector. *) ArraySlice.copyVec{src=slice, dst=a, di=0}; (* write as much as we can. *) ra(ArraySlice.full a) end ) | (NONE, NONE) => NONE (* And vice-versa *) val writeArr' = case (writeArr, writeVec) of (s as SOME _, _) => s (* If writeArr exists use it. *) | (NONE, SOME wv) => (* if writeArr doesn't exists but writeVec does *) SOME( fn slice => let (* Construct a vector from this slice. *) val v = ArraySlice.vector slice; in (* Try writing this vector. *) wv(VectorSlice.full v) end ) | (NONE, NONE) => NONE (* We now have the blocking versions of writeVec and writeArr if either of them existed. Now defining the non-blocking versions using these blocking versions if we have to. *) val writeVecNB' = case (writeVecNB, writeArrNB) of (s as SOME _, _) => s (* If writeVecNB exists use it. *) | (NONE, SOME wa) => (* If writeVecNB does not exist but writeArrNB does*) SOME( fn slice => let val len = VectorSlice.length slice (* Create an array to hold this slice. *) val a = Array.array(len, someElem) in (* Copy in the vector. *) ArraySlice.copyVec{src=slice, dst=a, di=0}; (* Try writing it and see what happened. *) wa(ArraySlice.full a) end ) | (NONE, NONE) => (* Try using the blocking writeVec' with canOutput. We use the writeVec' we defined above so that this will also try using writeArr. *) case (canOutput, writeVec') of (SOME canOut, SOME wv) => SOME( fn slice => if canOut() then SOME(wv slice) else NONE ) | _ => NONE (* Can't do it. *) val writeArrNB' = case (writeArrNB, writeVecNB) of (s as SOME _, _) => s (* If writeArrNB exists use it. *) | (NONE, SOME wv) => (* if writeArrNB doesn't exists but writeVecNB does *) SOME( fn slice => let (* Construct a vector from this slice. *) val v = ArraySlice.vector slice; in (* Try writing the vector. *) wv(VectorSlice.full v) end ) | (NONE, NONE) => (* Try using the blocking writeArr' with canOutput. We use the writeArr' we defined above so that this will also try using writeVec. *) case (canOutput, writeArr') of (SOME canOut, SOME wa) => SOME( fn slice => if canOut() then SOME(wa slice) else NONE ) | _ => NONE (* Can't do it. *) (* Finally define the blocking functions in terms of the non-blocking if we have to. *) val writeVec'' = case writeVec' of (* If writeVec' exists use it. i.e. if writeVec or writeArr were defined. *) (s as SOME _) => s | NONE => (* No blocking version exists - try using block and the synthesised non-blocking version. *) case (block, writeVecNB') of (SOME blk, SOME wv) => SOME( fn slice => ( blk(); case wv slice of NONE => (* Should not occur. *) raise IO.Io{ name=name, function="writeVec", cause = IO.BlockingNotSupported } | SOME l => l ) ) | _ => NONE (* Can't do it. *) val writeArr'' = case writeArr' of (* If writeArr' exists use it. *) (s as SOME _) => s | NONE => (* Try using block and the synthesised writeArrNB'. *) case (block, writeArrNB') of (SOME blk, SOME wa) => SOME( fn slice => ( blk(); case wa slice of NONE => raise IO.Io{ name=name, function="writeArr", cause = IO.BlockingNotSupported } | SOME l => l ) ) | _ => NONE (* Can't do it. *) in WR { name = name, chunkSize = chunkSize, writeVec = writeVec'', writeArr = writeArr'', writeVecNB = writeVecNB', writeArrNB = writeArrNB', block = block, canOutput = canOutput, getPos = getPos, setPos = setPos, endPos = endPos, verifyPos = verifyPos, close = close, ioDesc = ioDesc } end (* Null reader - always returns end-of-file except when closed when it raises IO.ClosedStream. *) fun nullRd () = let val isOpen = ref true in RD { name = "nullRd", chunkSize = 1, readVec = SOME(fn n => if n < 0 then raise Size else if !isOpen then Vector.fromList [] else raise IO.ClosedStream), readArr = SOME(fn _ => if !isOpen then 0 else raise IO.ClosedStream), readVecNB = SOME(fn n => if n < 0 then raise Size else if !isOpen then SOME(Vector.fromList []) else raise IO.ClosedStream), readArrNB = SOME(fn _ => if !isOpen then SOME 0 else raise IO.ClosedStream), block = SOME(fn () => if !isOpen then () else raise IO.ClosedStream), canInput = SOME(fn () => if !isOpen then true else raise IO.ClosedStream), avail = fn () => if !isOpen then NONE else raise IO.ClosedStream, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => isOpen := false, ioDesc = NONE } end (* Null writer - always swallows input except when closed when it raises IO.ClosedStream. *) fun nullWr () = let val isOpen = ref true in WR { name = "nullWr", chunkSize = 1, writeVec = SOME(fn slice => if !isOpen then VectorSlice.length slice else raise IO.ClosedStream), writeArr = SOME(fn slice => if !isOpen then ArraySlice.length slice else raise IO.ClosedStream), writeVecNB = SOME(fn slice => if !isOpen then SOME(VectorSlice.length slice) else raise IO.ClosedStream), writeArrNB = SOME(fn slice => if !isOpen then SOME(ArraySlice.length slice) else raise IO.ClosedStream), block = SOME(fn () => if !isOpen then () else raise IO.ClosedStream), canOutput = SOME(fn () => if !isOpen then true else raise IO.ClosedStream), getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => isOpen := false, ioDesc = NONE } end fun openVector v = let val isOpen = ref true val len = Vector.length v val p = ref 0 (* Pointer to current element. *) (* Return a slice of the vector from the current position for either the rest of the vector or the size requested if that's smaller. *) fun getSlice n = if not (! isOpen) then raise IO.ClosedStream else let val toRead = Int.min(n, len - !p) (* Return the smaller of the size requested or the size left. *) val resSlice = VectorSlice.slice(v, !p, SOME toRead) in p := !p + toRead; resSlice end (* Return a slice of the vector. *) fun readVec n = if n < 0 then raise Size else VectorSlice.vector(getSlice n) (* Copy a portion of the vector into the array. We can probably copy directly from the original vector whereas if we synthesised this function it would require an extra copy. *) fun readArr slice = let val (base, di, len) = ArraySlice.base slice val resSlice = getSlice len in ArraySlice.copyVec{src=resSlice, dst=base, di=di}; VectorSlice.length resSlice end in RD { name = "openVector", chunkSize = 1, (* Or the size of the vector? *) readVec = SOME readVec, readArr = SOME readArr, readVecNB = NONE, readArrNB = NONE, block = SOME(fn () => if !isOpen then () else raise IO.ClosedStream), canInput = SOME(fn () => if !isOpen then true else raise IO.ClosedStream), (* avail returns the number of bytes and since we don't know the size of "elem" we return NONE here *) avail = fn () => if !isOpen then NONE else raise IO.ClosedStream, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => isOpen := false, ioDesc = NONE } end end; polyml-5.6/basis/Real.sml000066400000000000000000000676171265146633400154340ustar00rootroot00000000000000(* Title: Standard Basis Library: Real Signature and structure. Author: David Matthews Copyright David Matthews 2000, 2005, 2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure LargeReal = struct type real = real end; signature REAL = sig type real structure Math : MATH where type real = real val radix : int val precision : int val maxFinite : real val minPos : real val minNormalPos : real val posInf : real val negInf : real val + : (real * real) -> real val - : (real * real) -> real val * : (real * real) -> real val / : (real * real) -> real val *+ : real * real * real -> real val *- : real * real * real -> real val ~ : real -> real val abs : real -> real val min : (real * real) -> real val max : (real * real) -> real val sign : real -> int val signBit : real -> bool val sameSign : (real * real) -> bool val copySign : (real * real) -> real val compare : (real * real) -> General.order val compareReal : (real * real) -> IEEEReal.real_order val < : (real * real) -> bool val <= : (real * real) -> bool val > : (real * real) -> bool val >= : (real * real) -> bool val == : (real * real) -> bool val != : (real * real) -> bool val ?= : (real * real) -> bool val unordered : (real * real) -> bool val isFinite : real -> bool val isNan : real -> bool val isNormal : real -> bool val class : real -> IEEEReal.float_class val fmt : StringCvt.realfmt -> real -> string val toString : real -> string val fromString : string -> real option val scan : (char, 'a) StringCvt.reader -> (real, 'a) StringCvt.reader val toManExp : real -> {man : real, exp : int} val fromManExp : {man : real, exp : int} -> real val split : real -> {whole : real, frac : real} val realMod : real -> real val rem : (real * real) -> real val nextAfter : (real * real) -> real val checkFloat : real ->real val realFloor : real -> real val realCeil : real -> real val realTrunc : real -> real val realRound : real -> real val floor : real -> Int.int val ceil : real -> Int.int val trunc : real -> Int.int val round : real -> Int.int val toInt : IEEEReal.rounding_mode -> real -> int val toLargeInt : IEEEReal.rounding_mode -> real -> LargeInt.int val fromInt : int -> real val fromLargeInt : LargeInt.int -> real val toLarge : real -> LargeReal.real val fromLarge : IEEEReal.rounding_mode -> LargeReal.real -> real val toDecimal : real -> IEEEReal.decimal_approx val fromDecimal : IEEEReal.decimal_approx -> real option end; structure Real: REAL = struct open RuntimeCalls IEEEReal (* This is used for newly added functions in the Standard Basis. *) (* We want to get the io function once for each function, not once per call, but that's complicated in ML97. *) local val doReal : int*real->real = RunCall.run_call2 POLY_SYS_Real_Dispatch in fun callReal n x = doReal(n, x) end local val doReal : int*(real*real)->real = RunCall.run_call2 POLY_SYS_Real_Dispatch in fun callRealReal n p = doReal(n, p) end local val doReal : int*real->bool = RunCall.run_call2 POLY_SYS_Real_Dispatch in fun callRealToBool n x = doReal(n, x) end local val doReal : int*real->int = RunCall.run_call2 POLY_SYS_Real_Dispatch in fun callRealToInt n x = doReal(n, x) end type real = real (* Pick up from globals. *) structure Math: MATH = struct type real = real (* Pick up from globals. *) (* These are provided directly in the RTS. *) (* These are the old functions which had separate entries in the interface vector. *) val sqrt: real -> real = RunCall.run_call1 POLY_SYS_sqrt_real; val sin: real -> real = RunCall.run_call1 POLY_SYS_sin_real; val cos: real -> real = RunCall.run_call1 POLY_SYS_cos_real; val atan: real -> real = RunCall.run_call1 POLY_SYS_arctan_real; val exp: real -> real = RunCall.run_call1 POLY_SYS_exp_real; val ln: real -> real = RunCall.run_call1 POLY_SYS_ln_real; (* Functions added for ML 97. These use the Real_dispatch entry. *) (* It may well be possible to derive these from the old ML90 functions but it's almost certainly quicker to implement them in the RTS. *) val tan = callReal 0 val asin = callReal 1 val acos = callReal 2 val atan2 = callRealReal 3 val pow = callRealReal 4 val log10 = callReal 5 val sinh = callReal 6 val cosh = callReal 7 val tanh = callReal 8 (* Derived values. *) val e = exp 1.0 val pi = 4.0 * atan 1.0 end; infix 4 == != ?=; val op == : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_eq; val op != : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_neq; val radix : int = callRealToInt 11 0.0 val precision : int = callRealToInt 12 0.0 val maxFinite : real = callReal 13 0.0 val minNormalPos : real = callReal 14 0.0 val posInf : real = 1.0/0.0; val negInf : real = ~1.0/0.0; (* We only implement this sort of real. *) fun toLarge (x: real) : (*LargeReal.*)real =x fun fromLarge (_ : IEEEReal.rounding_mode) (x: (*LargeReal.*)real): real = x (* NAN values fail any test including equality with themselves. *) fun isNan x = x != x (* NAN values do not match and infinities when multiplied by 0 produce NAN. *) fun isFinite x = x * 0.0 == 0.0 val signBit : real -> bool = callRealToBool 17 val copySign : (real * real) -> real = callRealReal 18 (* If we assume that all functions produce normalised results where possible, the only subnormal values will be those smaller than minNormalPos. *) fun isNormal x = isFinite x andalso abs x >= minNormalPos fun class x = if isFinite x then if x == 0.0 then ZERO else if abs x >= minNormalPos then NORMAL else SUBNORMAL else if isNan x then NAN else (* not finite and not Nan *) INF fun sign x = if isNan x then raise General.Domain else if x == 0.0 then 0 else if x < 0.0 then ~1 else 1 fun sameSign (x, y) = signBit x = signBit y fun unordered (x, y) = isNan x orelse isNan y (* Returns the minimum. In the case where one is a NaN it returns the other. In that case the comparison will be false. *) fun min (a: real, b: real): real = if a < b orelse isNan b then a else b (* Similarly for max. *) fun max (a: real, b: real): real = if a > b orelse isNan b then a else b fun checkFloat x = if isFinite x then x else if isNan x then raise General.Div else raise General.Overflow val fromInt: int -> real = RunCall.run_call1 POLY_SYS_int_to_real val fromLargeInt = fromInt val radixAsReal (* Not exported *) = fromInt radix val epsilon (* Not exported *) = Math.pow(radixAsReal, fromInt (Int.-(1, precision))) val minPos : real = minNormalPos*epsilon; local val toMantissa : real->real = callReal 24 and toExponent : real->int = callRealToInt 25 val doReal : int*(real*int)->real = RunCall.run_call2 POLY_SYS_Real_Dispatch fun fromManAndExp (ri: real*int): real = doReal(23, ri) in fun toManExp r = if not (isFinite r) orelse r == 0.0 (* Nan, infinities and +/-0 all return r in the mantissa. We include 0 to preserve its sign. *) then {man=r, exp=0} else {man=toMantissa r, exp=toExponent r} fun fromManExp {man, exp} = if not (isFinite man) orelse man == 0.0 (* Nan, infinities and +/-0 in the mantissa all return their argument. *) then man else fromManAndExp(man, exp) end local (* The RTS function converts to at most a 64-bit value (even on 32-bits). That will convert all the bits of the mantissa but if the exponent is large we may have to multiply by some power of two. *) val realToInt: real -> int = RunCall.run_call1 POLY_SYS_real_to_int in val realFloor = callReal 19 and realCeil = callReal 20 and realTrunc = callReal 21 and realRound = callReal 22 fun toArbitrary x = if isNan x then raise General.Domain else if not (isFinite x) then raise General.Overflow else let val { man, exp } = toManExp x in if exp <= precision then realToInt x else IntInf.<< (realToInt(fromManExp{man=man, exp=precision}), Word.fromInt(exp - precision)) end fun floor x = toArbitrary(realFloor x) (* Returns the largest integer <= x. *) fun ceil x = toArbitrary(realCeil x) (* Returns the smallest integer >= x. *) fun trunc x = toArbitrary(realTrunc x) (* Truncate towards zero. *) fun round x = toArbitrary(realRound x) (* Return the nearest integer, returning an even value if equidistant. *) fun toInt IEEEReal.TO_NEGINF r = floor r | toInt IEEEReal.TO_POSINF r = ceil r | toInt IEEEReal.TO_ZERO r = trunc r | toInt IEEEReal.TO_NEAREST r = round r val toLargeInt = toInt end; local val realConv: string->real = RunCall.run_call1 POLY_SYS_conv_real val posNan = abs(0.0 / 0.0) val negNan = ~posNan in fun fromDecimal { class = INF, sign=true, ...} = SOME negInf | fromDecimal { class = INF, sign=false, ...} = SOME posInf | fromDecimal { class = ZERO, sign=true, ...} = SOME ~0.0 | fromDecimal { class = ZERO, sign=false, ...} = SOME 0.0 (* Generate signed Nans ignoring the digits and mantissa. There was code here to set the mantissa but there's no reference to that in the current version of the Basis library. *) | fromDecimal { class = NAN, sign=true, ... } = SOME negNan | fromDecimal { class = NAN, sign=false, ... } = SOME posNan | fromDecimal { class = _ (* NORMAL or SUBNORMAL *), sign, digits, exp} = (let fun toChar x = if x < 0 orelse x > 9 then raise General.Domain else Char.chr (x + Char.ord #"0") (* Turn the number into a string. *) val str = "0." ^ String.implode(List.map toChar digits) ^"E" ^ Int.toString exp (* Convert it to a real using the RTS conversion function. Change any Conversion exceptions into Domain. *) val result = realConv str handle RunCall.Conversion _ => raise General.Domain in if sign then SOME (~result) else SOME result end handle General.Domain => NONE ) end local val dtoa: real*int*int -> string*int*int = RunCall.run_call3 POLY_SYS_Real_str open StringCvt fun addZeros n = if n <= 0 then "" else "0" ^ addZeros (n-1) fun fixFmt ndigs r = if isNan r then "nan" else if not (isFinite r) then if r < 0.0 then "~inf" else "inf" else let (* Try to get ndigs past the decimal point. *) val (str, exp, sign) = dtoa(r, 3, ndigs) val strLen = String.size str (* If the exponents is negative or zero we need to put a zero before the decimal point. If the exponent is positive and less than the number of digits we can take that many characters off, otherwise we have to pad with zeros. *) val numb = if exp <= 0 then (* Exponent is zero or negative - all significant digits are after the decimal point. Put in any zeros before the significant digits, then the significant digits and then any trailing zeros. *) if ndigs = 0 then "0" else "0." ^ addZeros(~exp) ^ str ^ addZeros(ndigs-strLen+exp) else if strLen <= exp then (* Exponent is not less than the length of the string - all significant digits are before the decimal point. Add any extra zeros before the decimal point then zeros after it. *) str ^ addZeros(exp-strLen) ^ (if ndigs = 0 then "" else "." ^ addZeros ndigs) else (* Significant digits straddle the decimal point - insert the decimal point and add any trailing zeros. *) String.substring(str, 0, exp) ^ "." ^ String.substring(str, exp, strLen-exp) ^ addZeros(ndigs-strLen+exp) in if sign <> 0 then "~" ^ numb else numb end fun sciFmt ndigs r = if isNan r then "nan" else if not (isFinite r) then if r < 0.0 then "~inf" else "inf" else let (* Try to get ndigs+1 digits. 1 before the decimal point and ndigs after. *) val (str, exp, sign) = dtoa(r, 2, ndigs+1) val strLen = String.size str fun addZeros n = if n <= 0 then "" else "0" ^ addZeros (n-1) val numb = if strLen = 0 then "0" ^ (if ndigs = 0 then "" else "." ^ addZeros ndigs) ^ "E0" else (if strLen = 1 then str ^ (if ndigs = 0 then "" else "." ^ addZeros ndigs) else String.substring(str, 0, 1) ^ "." ^ String.substring(str, 1, strLen-1) ^ addZeros (ndigs-strLen+1) ) ^ "E" ^ Int.toString (exp-1) in if sign <> 0 then "~" ^ numb else numb end fun genFmt ndigs r = if isNan r then "nan" else if not (isFinite r) then if r < 0.0 then "~inf" else "inf" else let (* Try to get ndigs digits. *) val (str, exp, sign) = dtoa(r, 2, ndigs) val strLen = String.size str val numb = (* Have to use scientific notation if exp > ndigs. Also use it if the exponent is small (TODO: adjust this) *) if exp > ndigs orelse exp < ~5 then (* Scientific format *) (if strLen = 1 then str else String.substring(str, 0, 1) ^ "." ^ String.substring(str, 1, strLen-1) ) ^ "E" ^ Int.toString (exp-1) else (* Fixed format (N.B. no trailing zeros are added after the decimal point apart from one if necessary) *) if exp <= 0 then (* Exponent is zero or negative - all significant digits are after the decimal point. Put in any zeros before the significant digits, then the significant digits and then any trailing zeros. *) "0." ^ addZeros(~exp) ^ str else if strLen <= exp then (* Exponent is not less than the length of the string - all significant digits are before the decimal point. Add any extra zeros before the decimal point. Insert .0 at the end to make it a valid real number. *) str ^ addZeros(exp-strLen) ^ ".0" else (* Significant digits straddle the decimal point - insert the decimal point. *) String.substring(str, 0, exp) ^ "." ^ String.substring(str, exp, strLen-exp) in if sign <> 0 then "~" ^ numb else numb end fun strToDigitList str = let fun getDigs i l = if i < 0 then l else getDigs (i-1) ((Char.ord(String.sub(str, i)) - Char.ord #"0") :: l) in getDigs (String.size str - 1) [] end in fun toDecimal r = let val sign = signBit r val kind = class r in case kind of ZERO => { class = ZERO, sign = sign, digits=[], exp = 0 } | INF => { class = INF, sign = sign, digits=[], exp = 0 } | NAN => { class = NAN, sign = sign, digits=[], exp = 0 } | _ => (* NORMAL/SUBNORMAL *) let val (str, exp, sign) = dtoa(r, 0, 0) val digits = strToDigitList str in { class = kind, sign = sign <> 0, digits = digits, exp = exp } end end (* Note: The definition says, reasonably, that negative values for the number of digits raises Size. The tests also check for a very large value for the number of digits and seem to expect Size to be raised in that case. Note that the exception is raised when fmt spec is evaluated and before it is applied to an actual real argument. In all cases, even EXACT format, this should produce "nan" for a NaN and ignore the sign bit. *) fun fmt (SCI NONE) = sciFmt 6 | fmt (SCI (SOME d) ) = if d < 0 orelse d > 200 then raise General.Size else sciFmt d | fmt (FIX NONE) = fixFmt 6 | fmt (FIX (SOME d) ) = if d < 0 orelse d > 200 then raise General.Size else fixFmt d | fmt (GEN NONE) = genFmt 12 | fmt (GEN (SOME d) ) = if d < 1 orelse d > 200 then raise General.Size else genFmt d | fmt EXACT = (fn r => if isNan r then "nan" else IEEEReal.toString(toDecimal r)) val toString = fmt (GEN NONE) end fun scan getc src = let (* Return a list of digits. *) fun getdigits inp src = case getc src of NONE => (List.rev inp, src) | SOME(ch, src') => if ch >= #"0" andalso ch <= #"9" then getdigits ((Char.ord ch - Char.ord #"0") :: inp) src' else (List.rev inp, src) (* Read an unsigned integer. Returns NONE if no digits have been read. *) fun getNumber sign digits acc src = case getc src of NONE => if digits = 0 then NONE else SOME(if sign then ~acc else acc, src) | SOME(ch, src') => if ch >= #"0" andalso ch <= #"9" then getNumber sign (digits+1) (acc*10 + Char.ord ch - Char.ord #"0") src' else if digits = 0 then NONE else SOME(if sign then ~acc else acc, src') (* Return the signed exponent. *) fun getExponent src = case getc src of NONE => NONE | SOME(ch, src') => if ch = #"+" then getNumber false 0 0 src' else if ch = #"-" orelse ch = #"~" then getNumber true 0 0 src' else getNumber false 0 0 src fun read_number sign src = case getc src of NONE => NONE | SOME(ch, _) => if not (ch >= #"0" andalso ch <= #"9" orelse ch = #".") then NONE (* Bad *) else (* Digits or decimal. *) let (* Get the digits before the decimal point (if any) *) val (intPart, srcAfterDigs) = getdigits [] src (* Get the digits after the decimal point (if any). If there is a decimal point we only accept it if there is at least one digit after it. *) val (decimals, srcAfterMant) = case getc srcAfterDigs of NONE => ([], srcAfterDigs) | SOME (#".", srcAfterDP) => ( (* Check that the next character is a digit. *) case getc srcAfterDP of NONE => ([], srcAfterDigs) | SOME(ch, _) => if ch >= #"0" andalso ch <= #"9" then getdigits [] srcAfterDP else ([], srcAfterDigs) ) | SOME (_, _) => ([], srcAfterDigs) (* The exponent is optional. If it doesn't form a valid exponent we return zero as the value and the continuation is the beginning of the "exponent". *) val (exponent, srcAfterExp) = case getc srcAfterMant of NONE => (0, srcAfterMant) | SOME (ch, src'''') => if ch = #"e" orelse ch = #"E" then ( case getExponent src'''' of NONE => (0, srcAfterMant) | SOME x => x ) else (0, srcAfterMant) (* Generate a decimal representation ready for conversion. We don't bother to strip off leading or trailing zeros. *) val decimalRep = {class=NORMAL, sign=sign, digits=List.@(intPart, decimals), exp=exponent + List.length intPart} in case fromDecimal decimalRep of SOME r => SOME(r, srcAfterExp) | NONE => NONE end in case getc src of NONE => NONE | SOME(ch, src') => if Char.isSpace ch (* Skip white space. *) then scan getc src' (* Recurse *) else if ch = #"+" (* Remove the + sign *) then read_number false src' else if ch = #"-" orelse ch = #"~" then read_number true src' else (* See if it's a valid digit. *) read_number false src end val fromString = StringCvt.scanString scan (* Converter to real values. This replaces the basic conversion function for reals installed in the bootstrap process. For more information see convInt in Int. *) (* Don't use it for the moment because it doesn't really provide any advantage over the existing function. *) (* local structure Conversion = RunCall.Run_exception1 ( type ex_type = string; val ex_iden = EXC_conversion ); exception Conversion = Conversion.ex; fun convReal s = case StringCvt.scanString scan s of NONE => raise Conversion "Invalid real constant" | SOME res => res in (* Install this as a conversion function for real literals. *) val (): unit = RunCall.addOverload convReal "convReal" end *) val op + : (real * real) -> real = RunCall.run_call2 POLY_SYS_Add_real; val op - : (real * real) -> real = RunCall.run_call2 POLY_SYS_Sub_real; val op * : (real * real) -> real = RunCall.run_call2 POLY_SYS_Mul_real; val op / : (real * real) -> real = RunCall.run_call2 POLY_SYS_Div_real; val op < : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_lss; val op <= : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_leq; val op > : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_gtr; val op >= : (real * real) -> bool = RunCall.run_call2 POLY_SYS_Real_geq; fun compare (r1, r2) = if r1 == r2 then General.EQUAL else if r1 < r2 then General.LESS else if r1 > r2 then General.GREATER else raise Unordered fun compareReal (r1, r2) = if r1 == r2 then EQUAL else if r1 < r2 then LESS else if r1 > r2 then GREATER else UNORDERED (* Question: The definition says "bitwise equal, ignoring signs on zeros". If we assume that all numbers are normalised, is that the same as "equal"?*) fun op ?= (x, y) = isNan x orelse isNan y orelse x == y (* Although these may be built in in some architectures it's probably not worth treating them specially at the moment. *) fun *+ (x: real, y: real, z: real): real = x*y+z and *- (x: real, y: real, z: real): real = x*y-z val ~ : real -> real = RunCall.run_call1 POLY_SYS_Neg_real (* This was previously done by a test and negation but it's difficult to get that right for +/- NaN *) and abs : real -> real = RunCall.run_call1 POLY_SYS_Abs_real fun rem (x, y) = if not (isFinite y) andalso not (isNan y) then x else x - realTrunc(x / y)*y (* Split a real into whole and fractional parts. The fractional part must have the same sign as the number even if it is zero. *) fun split r = let val whole = realTrunc r val frac = r - whole in { whole = whole, frac = if not (isFinite r) then if isNan r then r else (* Infinity *) if r < 0.0 then ~0.0 else 0.0 else if frac == 0.0 then if signBit r then ~0.0 else 0.0 else frac } end (* Get the fractional part of a real. *) fun realMod r = #frac(split r) local (* For normalised numbers the next in the sequence is x*(1+epsilon). However for unnormalised values we may have to multiply the epsilon value by the radix. *) fun nextUp r p = let val nxt = r + r*p in if nxt == r then nextUp r (p*radixAsReal) else nxt end fun nextDown r p = let val prev = r - r*p in if prev == r then nextDown r (p*radixAsReal) else prev end in fun nextAfter (r, t) = if not (isFinite r) orelse r == t then r else if r < t then nextUp r epsilon else nextDown r epsilon end end; structure Math = Real.Math; structure LargeReal: REAL = Real; (* Values available unqualified at the top-level. *) val real : int -> real = Real.fromInt val trunc : real -> int = Real.trunc val floor : real -> int = Real.floor val ceil : real -> int = Real.ceil val round : real -> int =Real.round; (* Install print function. *) local fun print_real _ _ (r: real) = PolyML.PrettyString(Real.fmt (StringCvt.GEN(SOME 10)) r) in val () = PolyML.addPrettyPrinter print_real; end; polyml-5.6/basis/RealArray.sml000066400000000000000000000036511265146633400164170ustar00rootroot00000000000000(* Title: Standard Basis Library: RealArray and RealVector Structures Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: done. Added sliced versions. *) (* TODO: This stores the vectors as vectors of pointers to cells containing the real values. It would be more efficient to store numbers directly in a byte-vector. We could use the move_bytes function to load and store reals although it would probably be better to define RTS functions to load and store reals. *) structure RealVector: MONO_VECTOR = struct open Vector type vector = real vector and elem = real end; structure RealArray: MONO_ARRAY = struct open Array type vector = RealVector.vector and array = real array and elem = real end; structure RealVectorSlice: MONO_VECTOR_SLICE = struct open VectorSlice type slice = real slice and elem = real and vector = RealVector.vector end; structure RealArraySlice: MONO_ARRAY_SLICE = struct open ArraySlice type slice = real slice and vector = RealVector.vector and array = RealArray.array and elem = real and vector_slice = RealVectorSlice.slice end; polyml-5.6/basis/RuntimeCalls.ML000066400000000000000000000224031265146633400166500ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further work copyright David C. J. Matthews 2012, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This file should reflect the RTS entries in libpolyml/sys.h. When adding entries don't forget to update the table in Boot/Address.ML. *) structure RuntimeCalls = struct (* 0 not used (unusable?) *) val POLY_SYS_exit = 1 val POLY_SYS_chdir = 9 val POLY_SYS_alloc_store = 11 val POLY_SYS_alloc_uninit = 12 val POLY_SYS_raisex = 14 val POLY_SYS_get_length = 15 val POLY_SYS_get_flags = 17 val POLY_SYS_str_compare = 23 (* DCJM 21/3/06 *) val POLY_SYS_teststrgtr = 26 val POLY_SYS_teststrlss = 27 val POLY_SYS_teststrgeq = 28 val POLY_SYS_teststrleq = 29 val POLY_SYS_exception_trace = 30 val POLY_SYS_give_ex_trace = 31 (* Only used within the RTS*) val POLY_SYS_exception_trace_fn = 32 val POLY_SYS_give_ex_trace_fn = 33 (* Only used within the RTS*) val POLY_SYS_lockseg = 47 val POLY_SYS_emptystring = 48 val POLY_SYS_nullvector = 49 val POLY_SYS_network = 51 (* DCJM 22/5/00 *) val POLY_SYS_os_specific = 52 (* DCJM 22/5/00 *) val POLY_SYS_eq_longword = 53 val POLY_SYS_neq_longword = 54 val POLY_SYS_geq_longword = 55 val POLY_SYS_leq_longword = 56 val POLY_SYS_gt_longword = 57 val POLY_SYS_lt_longword = 58 val POLY_SYS_io_dispatch = 61 (* DCJM 8/5/00 *) val POLY_SYS_signal_handler = 62 (* DCJM 18/7/00 *) val POLY_SYS_atomic_reset = 69 (* DCJM 18/9/12 *) val POLY_SYS_atomic_incr = 70 (* DCJM 12/3/07 *) val POLY_SYS_atomic_decr = 71 (* DCJM 12/3/07 *) val POLY_SYS_thread_self = 72 (* DCJM 12/3/07 *) val POLY_SYS_thread_dispatch = 73 (* DCJM 12/3/07 *) val POLY_SYS_plus_longword = 74 val POLY_SYS_minus_longword = 75 val POLY_SYS_mul_longword = 76 val POLY_SYS_div_longword = 77 val POLY_SYS_mod_longword = 78 val POLY_SYS_andb_longword = 79 val POLY_SYS_orb_longword = 80 val POLY_SYS_xorb_longword = 81 val POLY_SYS_kill_self = 84 val POLY_SYS_shift_left_longword = 85 val POLY_SYS_shift_right_longword = 86 val POLY_SYS_shift_right_arith_longword = 87 val POLY_SYS_longword_to_tagged = 89 val POLY_SYS_signed_to_longword = 90 val POLY_SYS_unsigned_to_longword = 91 val POLY_SYS_profiler = 88 val POLY_SYS_full_gc = 92 (* MJC 18/03/91 *) val POLY_SYS_stack_trace = 93 (* MJC 18/03/91 *) val POLY_SYS_timing_dispatch = 94 (* DCJM 10/4/00 *) val POLY_SYS_objsize = 99 (* MJC 27/04/88 *) val POLY_SYS_showsize = 100 (* MJC 09/03/89 *) val POLY_SYS_quotrem = 104 (* DCJM 05/03/10 *) val POLY_SYS_is_short = 105 val POLY_SYS_aplus = 106 val POLY_SYS_aminus = 107 val POLY_SYS_amul = 108 val POLY_SYS_adiv = 109 val POLY_SYS_amod = 110 val POLY_SYS_aneg = 111 val POLY_SYS_xora = 112 (* DCJM 21/6/00 *) val POLY_SYS_equala = 113 val POLY_SYS_ora = 114 (* DCJM 21/6/00 *) val POLY_SYS_anda = 115 (* DCJM 21/6/00 *) val POLY_SYS_Real_str = 117 (* DCJM 6/4/00 *) val POLY_SYS_Real_geq = 118 (* DCJM 28/3/00 *) val POLY_SYS_Real_leq = 119 (* DCJM 28/3/00 *) val POLY_SYS_Real_gtr = 120 (* DCJM 28/3/00 *) val POLY_SYS_Real_lss = 121 (* DCJM 28/3/00 *) val POLY_SYS_Real_eq = 122 (* DCJM 28/3/00 *) val POLY_SYS_Real_neq = 123 (* DCJM 28/3/00 *) val POLY_SYS_Real_Dispatch = 124 (* DCJM 25/3/00 *) val POLY_SYS_Add_real = 125 val POLY_SYS_Sub_real = 126 val POLY_SYS_Mul_real = 127 val POLY_SYS_Div_real = 128 val POLY_SYS_Abs_real = 129 (* DCJM 26/12/11 *) val POLY_SYS_Neg_real = 130 (*val POLY_SYS_Repr_real = 132*) val POLY_SYS_conv_real = 133 val POLY_SYS_real_to_int = 134 val POLY_SYS_int_to_real = 135 val POLY_SYS_sqrt_real = 136 val POLY_SYS_sin_real = 137 val POLY_SYS_cos_real = 138 val POLY_SYS_arctan_real = 139 val POLY_SYS_exp_real = 140 val POLY_SYS_ln_real = 141 val POLY_SYS_stdin = 148 val POLY_SYS_stdout = 149 val POLY_SYS_process_env = 150 (* DCJM 25/4/00 *) val POLY_SYS_set_string_length = 151 (* DCJM 28/2/01 *) val POLY_SYS_get_first_long_word = 152 (* DCJM 28/2/01 *) val POLY_SYS_poly_specific = 153 (* DCJM 17/6/06 *) val POLY_SYS_bytevec_eq = 154 (* DCJM 13/1/10 *) val POLY_SYS_cmem_load_8 = 160 val POLY_SYS_cmem_load_16 = 161 val POLY_SYS_cmem_load_32 = 162 val POLY_SYS_cmem_load_64 = 163 val POLY_SYS_cmem_load_float = 164 val POLY_SYS_cmem_load_double = 165 val POLY_SYS_cmem_store_8 = 166 val POLY_SYS_cmem_store_16 = 167 val POLY_SYS_cmem_store_32 = 168 val POLY_SYS_cmem_store_64 = 169 val POLY_SYS_cmem_store_float = 170 val POLY_SYS_cmem_store_double = 171 val POLY_SYS_io_operation = 189 val POLY_SYS_ffi = 190 val POLY_SYS_move_words_overlap = 193 val POLY_SYS_set_code_constant = 194 (* DCJM 2/1/01 *) val POLY_SYS_move_words = 195 (* DCJM 9/10/99 *) val POLY_SYS_shift_right_arith_word = 196 (* DCJM 9/10/99 *) val POLY_SYS_move_bytes = 198 (* DCJM 9/10/99 *) val POLY_SYS_move_bytes_overlap = 199 val POLY_SYS_code_flags = 200 (* SPF 10/11/1998 *) val POLY_SYS_shrink_stack = 201 (* SPF 10/11/1998 *) val POLY_SYS_stderr = 202 (* SPF 10/11/1998 *) val POLY_SYS_callcode_tupled = 204 (* SPF 07/07/94 *) val POLY_SYS_foreign_dispatch = 205 (* NIC 22/04/94 *) val POLY_SYS_XWindows = 209 (* MJC 27/09/90 *) val POLY_SYS_is_big_endian = 213 (* added 30/3/95 (DCJM) *) val POLY_SYS_bytes_per_word = 214 (* added 30/3/95 (DCJM) *) val POLY_SYS_offset_address = 215 val POLY_SYS_shift_right_word = 216 val POLY_SYS_word_neq = 217 val POLY_SYS_not_bool = 218 val POLY_SYS_string_length = 223 val POLY_SYS_touch_final = 228 val POLY_SYS_int_geq = 231 (* These are actually arbitrary precision ops. *) val POLY_SYS_int_leq = 232 val POLY_SYS_int_gtr = 233 val POLY_SYS_int_lss = 234 val POLY_SYS_load_byte_immut = 235 val POLY_SYS_load_word_immut = 236 val POLY_SYS_mul_word = 238 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_plus_word = 239 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_minus_word = 240 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_div_word = 241 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_or_word = 242 val POLY_SYS_and_word = 243 val POLY_SYS_xor_word = 244 val POLY_SYS_shift_left_word = 245 val POLY_SYS_mod_word = 246 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_word_geq = 247 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_word_leq = 248 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_word_gtr = 249 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_word_lss = 250 (* Reinstated DCJM 9/10/99 *) val POLY_SYS_word_eq = 251 val POLY_SYS_load_byte = 252 val POLY_SYS_load_word = 253 val POLY_SYS_assign_byte = 254 val POLY_SYS_assign_word = 255 (* val POLY_SYS_vecsize = 256 *) (* Exception identifiers *) val EXC_interrupt = 1 val EXC_syserr = 2 val EXC_size = 4 val EXC_overflow = 5 val EXC_underflow = 6 val EXC_divide = 7 val EXC_conversion = 8 val EXC_XWindows = 10 val EXC_subscript = 11 val EXC_thread = 12 (* DCJM 13/3/07. *) val EXC_extrace = 13 val EXC_foreign = 23 (* nic 4/5/94 *) (* The following numbers are hard-coded into the ML compiler rather than the run-time system, but they're still hard to change. *) val EXC_Bind = 100; (* SPF 17/11/94 *) val EXC_Match = 101; (* SPF 17/11/94 *) val EXC_Fail = 103; (* Added DCJM 23/7/00 *) (* Now also in the RTS. *) end; polyml-5.6/basis/SML90.sml000066400000000000000000000073201265146633400153360ustar00rootroot00000000000000(* Title: Standard Basis Library: SML90 Signature and Structure Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: This structure and signature are not listed and should be avoided in new code. *) signature SML90 = sig exception Abs exception Quot exception Prod exception Neg exception Sum exception Diff exception Floor exception Exp exception Sqrt exception Ln exception Ord exception Mod exception Io of string exception Interrupt val sqrt : real -> real val exp : real -> real val ln : real -> real val sin : real -> real val cos : real -> real val arctan : real -> real val ord : string -> int val chr : int -> string val explode : string -> string list val implode : string list -> string type instream type outstream val std_in : instream val std_out : outstream val open_in : string -> instream val input : instream * int -> string val lookahead : instream -> string val close_in : instream -> unit val end_of_stream : instream -> bool val open_out : string -> outstream val output : outstream * string -> unit val close_out : outstream -> unit end; structure SML90 :> SML90 = struct exception Abs = Overflow and Quot = Overflow and Prod = Overflow and Neg = Overflow and Sum = Overflow and Diff = Overflow and Floor = Overflow and Exp = Overflow and Sqrt = Overflow and Ln = Overflow and Ord = Overflow and Mod = Div and Interrupt = RunCall.Interrupt exception Io of string fun sqrt x = if x < 0.0 then raise Sqrt else Real.Math.sqrt x fun exp x = let val r = Real.Math.exp x in if Real.isFinite r then r else raise Exp end fun ln x = if x < 0.0 then raise Ln else Real.Math.ln x val sin = Real.Math.sin and cos = Real.Math.cos and arctan = Real.Math.atan fun ord "" = raise Ord | ord s = Char.ord(String.sub(s, 0)) fun chr i = str(Char.chr i) (* Because single character strings are represented by the characters themselves we just need to coerce String.explode. *) val explode: string -> string list = RunCall.unsafeCast(String.explode) val implode = String.concat type instream = TextIO.instream and outstream = TextIO.outstream val std_in : instream = TextIO.stdIn and std_out : outstream = TextIO.stdOut fun open_in s = TextIO.openIn s handle IO.Io _ => raise Io "Cannot open" and open_out s = TextIO.openOut s handle IO.Io _ => raise Io "Cannot open" fun input(str, i) = TextIO.inputN(str, i) handle IO.Io _ => raise Io "Cannot read" fun lookahead strm = case TextIO.lookahead strm of NONE => "" | SOME ch => str ch val close_in : instream -> unit = TextIO.closeIn and close_out : outstream -> unit = TextIO.closeOut fun output(str, s) = TextIO.output(str, s) handle IO.Io _ => raise Io "Cannot output" val end_of_stream = TextIO.endOfStream end; polyml-5.6/basis/STREAM_IO.sml000066400000000000000000000037541265146633400161230ustar00rootroot00000000000000(* Title: Standard Basis Library: STREAM_IO signature Copyright David C.J. Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked. No change *) signature STREAM_IO = sig type elem type vector type instream type outstream type out_pos type reader type writer type pos val input : instream -> vector * instream val input1 : instream -> (elem * instream) option val inputN : instream * int -> vector * instream val inputAll : instream -> vector * instream val canInput : instream * int -> int option val closeIn : instream -> unit val endOfStream : instream -> bool val output : outstream * vector -> unit val output1 : outstream * elem -> unit val flushOut : outstream -> unit val closeOut : outstream -> unit val mkInstream : reader * vector -> instream val getReader : instream -> reader * vector val filePosIn : instream -> pos val setBufferMode : outstream * IO.buffer_mode -> unit val getBufferMode : outstream -> IO.buffer_mode val mkOutstream : writer * IO.buffer_mode -> outstream val getWriter : outstream -> writer * IO.buffer_mode val getPosOut : outstream -> out_pos val setPosOut : out_pos -> outstream val filePosOut : out_pos -> pos end; polyml-5.6/basis/Signal.sml000066400000000000000000000065551265146633400157600ustar00rootroot00000000000000(* Title: Signal structure and signature. Author: David Matthews Copyright David Matthews 2000, 2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature SIGNAL = sig datatype sig_handle = SIG_DFL | SIG_IGN | SIG_HANDLE of int->unit val signal: int * sig_handle -> sig_handle end; structure Signal: SIGNAL = struct datatype sig_handle = SIG_DFL | SIG_IGN | SIG_HANDLE of int->unit local val doSig = RunCall.run_call2 RuntimeCalls.POLY_SYS_signal_handler in fun signal(s, cmd) = let val c = case cmd of SIG_DFL => 0 | SIG_IGN => 1 | SIG_HANDLE f => RunCall.unsafeCast f in case doSig(0, (s, c)) of 0 => SIG_DFL | 1 => SIG_IGN | f => SIG_HANDLE(RunCall.unsafeCast f) end end local datatype sigHandle = SigHandle of (int->unit) * int | WeakMarker val doSig = RunCall.run_call2 RuntimeCalls.POLY_SYS_signal_handler open Thread fun sigThread(): unit = let (* This call to the RTS returns either a pair of a signal and a handler or a flag indicating that some wek reference has been set to NONE. These aren't logically related but it's convenient to use a single thread for both. *) val nextSig: sigHandle = doSig(1, ()) (* When we get a WeakMarker message we need to broadcast on this condition variable. *) fun broadCastWeak haveLock () = ( if haveLock then () else Mutex.lock Weak.weakLock; ConditionVar.broadcast Weak.weakSignal; Mutex.unlock Weak.weakLock ) in case nextSig of SigHandle (handler, signal) => (handler signal handle _ => ()) | WeakMarker => (* If the lock is free we can do the broadcast now but to avoid waiting and being unable to handle any signals we fork off a thread if we can't. *) if Mutex.trylock Weak.weakLock then broadCastWeak true () else (Thread.fork(broadCastWeak false, []); ()); sigThread() (* Forever. *) end fun forkThread() = (Thread.fork(sigThread, []); ()) handle Thread _ => print "Unable to create signal thread\n" in (* Run this thread now and also start one each time we start up. *) val _ = forkThread() val _ = PolyML.onEntry forkThread end end; polyml-5.6/basis/SingleAssignment.sml000066400000000000000000000025671265146633400200140ustar00rootroot00000000000000(* Title: References that allow a single assignment Author: David Matthews Copyright David Matthews 2010 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure SingleAssignment:> sig type 'a saref (* Equality not allowed *) exception Locked val saref: unit -> 'a saref val savalue: 'a saref -> 'a option val saset: 'a saref * 'a -> unit end = struct exception Locked type 'a saref = 'a option ref fun saref () = ref NONE val savalue = ! fun saset(saVar as ref NONE, newValue) = let val lock = RunCall.run_call1 RuntimeCalls.POLY_SYS_lockseg in saVar := SOME newValue; lock saVar end | saset _ = raise Locked end; polyml-5.6/basis/Socket.sml000066400000000000000000000644601265146633400157720ustar00rootroot00000000000000(* Title: Standard Basis Library: Generic Sockets Author: David Matthews Copyright David Matthews 2000, 2005, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature SOCKET = sig type ('af,'sock_type) sock type 'af sock_addr type dgram type 'mode stream type passive type active structure AF : sig type addr_family = NetHostDB.addr_family val list : unit -> (string * addr_family) list val toString : addr_family -> string val fromString : string -> addr_family option end structure SOCK : sig eqtype sock_type val stream : sock_type val dgram : sock_type val list : unit -> (string * sock_type) list val toString : sock_type -> string val fromString : string -> sock_type option end structure Ctl : sig val getDEBUG : ('af, 'sock_type) sock -> bool val setDEBUG : ('af, 'sock_type) sock * bool -> unit val getREUSEADDR : ('af, 'sock_type) sock -> bool val setREUSEADDR : ('af, 'sock_type) sock * bool -> unit val getKEEPALIVE : ('af, 'sock_type) sock -> bool val setKEEPALIVE : ('af, 'sock_type) sock * bool -> unit val getDONTROUTE : ('af, 'sock_type) sock -> bool val setDONTROUTE : ('af, 'sock_type) sock * bool -> unit val getLINGER : ('af, 'sock_type) sock -> Time.time option val setLINGER : ('af, 'sock_type) sock * Time.time option -> unit val getBROADCAST : ('af, 'sock_type) sock -> bool val setBROADCAST : ('af, 'sock_type) sock * bool -> unit val getOOBINLINE : ('af, 'sock_type) sock -> bool val setOOBINLINE : ('af, 'sock_type) sock * bool -> unit val getSNDBUF : ('af, 'sock_type) sock -> int val setSNDBUF : ('af, 'sock_type) sock * int -> unit val getRCVBUF : ('af, 'sock_type) sock -> int val setRCVBUF : ('af, 'sock_type) sock * int -> unit val getTYPE : ('af, 'sock_type) sock -> SOCK.sock_type val getERROR : ('af, 'sock_type) sock -> bool val getPeerName : ('af, 'sock_type) sock -> 'af sock_addr val getSockName : ('af, 'sock_type) sock -> 'af sock_addr val getNREAD : ('af, 'sock_type) sock -> int val getATMARK : ('af, active stream) sock -> bool end val sameAddr : 'af sock_addr * 'af sock_addr -> bool val familyOfAddr : 'af sock_addr -> AF.addr_family val bind : ('af, 'sock_type) sock * 'af sock_addr -> unit val listen : ('af, passive stream) sock * int -> unit val accept : ('af, passive stream) sock -> ('af, active stream) sock * 'af sock_addr val acceptNB : ('af, passive stream) sock -> (('af, active stream) sock * 'af sock_addr) option val connect : ('af, 'sock_type) sock * 'af sock_addr -> unit val connectNB : ('af, 'sock_type) sock * 'af sock_addr -> bool val close : ('af, 'sock_type) sock -> unit datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS val shutdown : ('af, 'sock_type stream) sock * shutdown_mode -> unit type sock_desc val sockDesc : ('af, 'sock_type) sock -> sock_desc val sameDesc: sock_desc * sock_desc -> bool val select: { rds: sock_desc list, wrs : sock_desc list, exs : sock_desc list, timeout: Time.time option } -> { rds: sock_desc list, wrs : sock_desc list, exs : sock_desc list } val ioDesc : ('af, 'sock_type) sock -> OS.IO.iodesc type out_flags = {don't_route : bool, oob : bool} type in_flags = {peek : bool, oob : bool} val sendVec : ('af, active stream) sock * Word8VectorSlice.slice -> int val sendArr : ('af, active stream) sock * Word8ArraySlice.slice -> int val sendVec' : ('af, active stream) sock * Word8VectorSlice.slice * out_flags -> int val sendArr' : ('af, active stream) sock * Word8ArraySlice.slice * out_flags -> int val sendVecNB : ('af, active stream) sock * Word8VectorSlice.slice -> int option val sendArrNB : ('af, active stream) sock * Word8ArraySlice.slice -> int option val sendVecNB' : ('af, active stream) sock * Word8VectorSlice.slice * out_flags -> int option val sendArrNB' : ('af, active stream) sock * Word8ArraySlice.slice * out_flags -> int option val recvVec : ('af, active stream) sock * int -> Word8Vector.vector val recvArr : ('af, active stream) sock * Word8ArraySlice.slice -> int val recvVec' : ('af, active stream) sock * int * in_flags -> Word8Vector.vector val recvArr' : ('af, active stream) sock * Word8ArraySlice.slice * in_flags -> int val recvVecNB : ('af, active stream) sock * int -> Word8Vector.vector option val recvArrNB : ('af, active stream) sock * Word8ArraySlice.slice -> int option val recvVecNB' : ('af, active stream) sock * int * in_flags -> Word8Vector.vector option val recvArrNB' : ('af, active stream) sock * Word8ArraySlice.slice * in_flags -> int option val sendVecTo : ('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice -> unit val sendArrTo : ('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice -> unit val sendVecTo' : ('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags -> unit val sendArrTo' : ('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags -> unit val sendVecToNB : ('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice -> bool val sendArrToNB : ('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice -> bool val sendVecToNB' : ('af, dgram) sock * 'af sock_addr * Word8VectorSlice.slice * out_flags -> bool val sendArrToNB' : ('af, dgram) sock * 'af sock_addr * Word8ArraySlice.slice * out_flags -> bool val recvVecFrom : ('af, dgram) sock * int -> Word8Vector.vector * 'sock_type sock_addr val recvArrFrom : ('af, dgram) sock * Word8ArraySlice.slice -> int * 'af sock_addr val recvVecFrom' : ('af, dgram) sock * int * in_flags -> Word8Vector.vector * 'sock_type sock_addr val recvArrFrom' : ('af, dgram) sock * Word8ArraySlice.slice * in_flags -> int * 'af sock_addr val recvVecFromNB : ('af, dgram) sock * int -> (Word8Vector.vector * 'sock_type sock_addr) option val recvArrFromNB : ('af, dgram) sock * Word8ArraySlice.slice -> (int * 'af sock_addr) option val recvVecFromNB' : ('af, dgram) sock * int * in_flags -> (Word8Vector.vector * 'sock_type sock_addr) option val recvArrFromNB' : ('af, dgram) sock * Word8ArraySlice.slice * in_flags -> (int * 'af sock_addr) option end; structure Socket :> SOCKET = struct (* We don't really need an implementation for these. *) (* TODO: We should really pull the definition of the sock type into a common structure so it can be shared by the various socket structures. In fact it doesn't matter since the unary constructor here is compiled as an identity so the underlying representation of "SOCK x" will be the same as "x". *) datatype ('af,'sock_type) sock = SOCK of OS.IO.iodesc and dgram = DGRAM and 'mode stream = STREAM and passive = PASSIVE and active = ACTIVE structure AF = struct type addr_family = NetHostDB.addr_family local val doCall: int*unit -> (string * addr_family) list = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun list () = doCall(11, ()) end fun toString (af: addr_family) = let val afs = list() in (* Do a linear search on the list - it's small. *) case List.find (fn (_, af') => af=af') afs of NONE => raise OS.SysErr("Missing address family", NONE) | SOME (s, _) => s end fun fromString s = let val afs = list() in (* Do a linear search on the list - it's small. *) case List.find (fn (s', _) => s=s') afs of NONE => NONE | SOME (_, af) => SOME af end end structure SOCK = struct datatype sock_type = SOCKTYPE of int local val doCall: int*unit -> (string * sock_type) list = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun list () = doCall(12, ()) end fun toString (sk: sock_type) = let val sks = list() in (* Do a linear search on the list - it's small. *) case List.find (fn (_, sk') => sk=sk') sks of NONE => raise OS.SysErr("Missing socket type", NONE) | SOME (s, _) => s end fun fromString s = let val sks = list() in (* Do a linear search on the list - it's small. *) case List.find (fn (s', _) => s=s') sks of NONE => NONE | SOME (_, sk) => SOME sk end (* We assume that both of these at least are in the table. *) val stream = case fromString "STREAM" of NONE => raise OS.SysErr("Missing socket type", NONE) | SOME s => s val dgram = case fromString "DGRAM" of NONE => raise OS.SysErr("Missing socket type", NONE) | SOME s => s end (* Socket addresses are implemented as strings. *) datatype 'af sock_addr = SOCKADDR of Word8Vector.vector (* Note: The definition did not make these equality type variables. The assumption is probably that it works much like equality on references. *) fun sameAddr (SOCKADDR a, SOCKADDR b) = a = b fun familyOfAddr (sa: 'af sock_addr) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network(39, sa) structure Ctl = struct local val doCall1 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network val doCall2 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getOpt (i:int) (SOCK s) = doCall1(i, s) fun setOpt (i: int) (SOCK s, b: bool) = doCall2(i, (s, b)) end fun getDEBUG s = getOpt 18 s and setDEBUG s = setOpt 17 s and getREUSEADDR s = getOpt 20 s and setREUSEADDR s = setOpt 19 s and getKEEPALIVE s = getOpt 22 s and setKEEPALIVE s = setOpt 21 s and getDONTROUTE s = getOpt 24 s and setDONTROUTE s = setOpt 23 s and getBROADCAST s = getOpt 26 s and setBROADCAST s = setOpt 25 s and getOOBINLINE s = getOpt 28 s and setOOBINLINE s = setOpt 27 s and getERROR s = getOpt 34 s and getATMARK s = getOpt 45 s local val doCall1 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network val doCall2 = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun getSNDBUF (SOCK s) = doCall1(30, s) fun setSNDBUF (SOCK s, i: int) = doCall2(29, (s, i)) fun getRCVBUF (SOCK s) = doCall1(32, s) fun setRCVBUF (SOCK s, i: int) = doCall2(31, (s, i)) fun getTYPE (SOCK s) = SOCK.SOCKTYPE(doCall1(33, s)) fun getNREAD (SOCK s) = doCall1(44, s) fun getLINGER (SOCK s): Time.time option = let val lTime = doCall1(36, s) in if lTime < 0 then NONE else SOME(Time.fromSeconds lTime) end fun setLINGER (SOCK s, NONE) = ( doCall2(35, (s, ~1)) ) | setLINGER (SOCK s, SOME t) = let val lTime = Time.toSeconds t in if lTime < 0 then raise OS.SysErr("Invalid time", NONE) else doCall2(35, (s, lTime)) end end fun getPeerName (SOCK s): 'af sock_addr = RunCall.run_call2 RuntimeCalls.POLY_SYS_network(37, s) fun getSockName (SOCK s): 'af sock_addr = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (38, s) end (* Ctl *) (* Run an operation in non-blocking mode. This catches EWOULDBLOCK and returns NONE, otherwise returns SOME result. Other exceptions are passed back as normal. *) val nonBlockingCall = LibraryIOSupport.nonBlocking fun accept (SOCK s) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (46, s) local fun acc sock = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (58, sock) in fun acceptNB sock = nonBlockingCall acc sock end fun bind (SOCK s, a) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (47, (s, a)) fun connect (SOCK s, a) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (48, (s, a)) local fun connct sa = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (59, sa) in fun connectNB (SOCK s, a) = case nonBlockingCall connct (s,a) of SOME () => true | NONE => false end fun listen (SOCK s, b) = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (49, (s, b)) (* We use the normal "close" for streams. We can't use the normal "local in" here to avoid the extra function calls at run-time because of the polymorphism. *) fun close (SOCK strm): unit = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch(7, strm, 0) datatype shutdown_mode = NO_RECVS | NO_SENDS | NO_RECVS_OR_SENDS fun shutdown (SOCK s, mode) = let val m = case mode of NO_RECVS => 1 | NO_SENDS => 2 | NO_RECVS_OR_SENDS => 3 in RunCall.run_call2 RuntimeCalls.POLY_SYS_network (50, (s, m)) end (* The IO descriptor is the underlying socket. *) fun ioDesc (SOCK s) = s; type out_flags = {don't_route : bool, oob : bool} type in_flags = {peek : bool, oob : bool} type 'a buf = {buf : 'a, i : int, sz : int option} local val nullOut = { don't_route = false, oob = false } and nullIn = { peek = false, oob = false } (* This implementation is copied from the implementation of Word8Array.array and Word8Vector.vector. *) type address = LibrarySupport.address datatype vector = datatype LibrarySupport.Word8Array.vector datatype array = datatype LibrarySupport.Word8Array.array val wordSize = LibrarySupport.wordSize (* Send the data from an array or vector. Note: the underlying RTS function deals with the special case of sending a single byte vector where the "address" is actually the byte itself. *) local fun doSend i a = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (i, a) in fun send (SOCK sock, base: address, offset: int, length: int, rt: bool, oob: bool): int = doSend 51 (sock, base, offset, length, rt, oob) fun sendNB (SOCK sock, base: address, offset: int, length: int, rt: bool, oob: bool): int option = nonBlockingCall (doSend 60) (sock, base, offset, length, rt, oob) end local (* Although the underlying call returns the number of bytes written the ML functions now return unit. *) fun doSendTo i a = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (i, a) in fun sendTo (SOCK sock, addr, base: address, offset: int, length: int, rt: bool, oob: bool): unit = doSendTo 52 (sock, addr, base, offset, length, rt, oob) fun sendToNB (SOCK sock, addr, base: address, offset: int, length: int, rt: bool, oob: bool): bool = case nonBlockingCall (doSendTo 61) (sock, addr, base, offset, length, rt, oob) of NONE => false | SOME _ => true end local fun doRecv i a = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (i, a) in (* Receive the data into an array. *) fun recv (SOCK sock, base: address, offset: int, length: int, peek: bool, oob: bool): int = doRecv 53 (sock, base, offset, length, peek, oob) fun recvNB (SOCK sock, base: address, offset: int, length: int, peek: bool, oob: bool): int option = nonBlockingCall (doRecv 62) (sock, base, offset, length, peek, oob) end local fun doRecvFrom i a = RunCall.run_call2 RuntimeCalls.POLY_SYS_network (i, a) in fun recvFrom (SOCK sock, base: address, offset: int, length: int, peek: bool, oob: bool) = doRecvFrom 54 (sock, base, offset, length, peek, oob) fun recvFromNB (SOCK sock, base: address, offset: int, length: int, peek: bool, oob: bool) = nonBlockingCall (doRecvFrom 63) (sock, base, offset, length, peek, oob) end in fun sendVec' (sock, slice: Word8VectorSlice.slice, {don't_route, oob}) = let val (v, i, length) = Word8VectorSlice.base slice in send(sock, LibrarySupport.w8vectorAsAddress v, i + Word.toInt wordSize, length, don't_route, oob) end and sendVec (sock, vbuff) = sendVec'(sock, vbuff, nullOut) fun sendVecNB' (sock, slice: Word8VectorSlice.slice, {don't_route, oob}) = let val (v, i, length) = Word8VectorSlice.base slice in sendNB(sock, LibrarySupport.w8vectorAsAddress v, i + Word.toInt wordSize, length, don't_route, oob) end and sendVecNB (sock, vbuff) = sendVecNB'(sock, vbuff, nullOut) fun sendArr' (sock, slice: Word8ArraySlice.slice, {don't_route, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in send(sock, v, i, length, don't_route, oob) end and sendArr (sock, vbuff) = sendArr'(sock, vbuff, nullOut) fun sendArrNB' (sock, slice: Word8ArraySlice.slice, {don't_route, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in sendNB(sock, v, i, length, don't_route, oob) end and sendArrNB (sock, vbuff) = sendArrNB'(sock, vbuff, nullOut) fun sendVecTo' (sock, addr, slice: Word8VectorSlice.slice, {don't_route, oob}) = let val (v, i, length) = Word8VectorSlice.base slice in sendTo(sock, addr, LibrarySupport.w8vectorAsAddress v, i + Word.toInt wordSize, length, don't_route, oob) end and sendVecTo (sock, addr, vbuff) = sendVecTo'(sock, addr, vbuff, nullOut) fun sendVecToNB' (sock, addr, slice: Word8VectorSlice.slice, {don't_route, oob}) = let val (v, i, length) = Word8VectorSlice.base slice in sendToNB(sock, addr, LibrarySupport.w8vectorAsAddress v, i + Word.toInt wordSize, length, don't_route, oob) end and sendVecToNB (sock, addr, vbuff) = sendVecToNB'(sock, addr, vbuff, nullOut) fun sendArrTo' (sock, addr, slice: Word8ArraySlice.slice, {don't_route, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in sendTo(sock, addr, v, i, length, don't_route, oob) end and sendArrTo (sock, addr, vbuff) = sendArrTo'(sock, addr, vbuff, nullOut) fun sendArrToNB' (sock, addr, slice: Word8ArraySlice.slice, {don't_route, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in sendToNB(sock, addr, v, i, length, don't_route, oob) end and sendArrToNB (sock, addr, vbuff) = sendArrToNB'(sock, addr, vbuff, nullOut) fun recvArr' (sock, slice: Word8ArraySlice.slice, {peek, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in recv(sock, v, i, length, peek, oob) end and recvArr (sock, vbuff) = recvArr'(sock, vbuff, nullIn) fun recvArrNB' (sock, slice: Word8ArraySlice.slice, {peek, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in recvNB(sock, v, i, length, peek, oob) end and recvArrNB (sock, vbuff) = recvArrNB'(sock, vbuff, nullIn) (* To receive a vector first create an array, read into it, then copy it to a new vector. This does involve extra copying but it probably doesn't matter too much. *) fun recvVec' (sock, size, flags) = let val arr = Word8Array.array(size, 0w0); val recvd = recvArr'(sock, Word8ArraySlice.full arr, flags) in Word8ArraySlice.vector(Word8ArraySlice.slice(arr, 0, SOME recvd)) end and recvVec (sock, size) = recvVec'(sock, size, nullIn) fun recvVecNB' (sock, size, flags) = let val arr = Word8Array.array(size, 0w0); in case recvArrNB'(sock, Word8ArraySlice.full arr, flags) of NONE => NONE | SOME recvd => SOME(Word8ArraySlice.vector(Word8ArraySlice.slice(arr, 0, SOME recvd))) end and recvVecNB (sock, size) = recvVecNB'(sock, size, nullIn) fun recvArrFrom' (sock, slice: Word8ArraySlice.slice, {peek, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in recvFrom(sock, v, i, length, peek, oob) end and recvArrFrom (sock, abuff) = recvArrFrom'(sock, abuff, nullIn) fun recvArrFromNB' (sock, slice: Word8ArraySlice.slice, {peek, oob}) = let val (Array(_, v), i, length) = Word8ArraySlice.base slice in recvFromNB(sock, v, i, length, peek, oob) end and recvArrFromNB (sock, abuff) = recvArrFromNB'(sock, abuff, nullIn) fun recvVecFrom' (sock, size, flags) = let val arr = Word8Array.array(size, 0w0); val (rcvd, addr) = recvArrFrom'(sock, Word8ArraySlice.full arr, flags) in (Word8ArraySlice.vector(Word8ArraySlice.slice(arr, 0, SOME rcvd)), addr) end and recvVecFrom (sock, size) = recvVecFrom'(sock, size, nullIn) fun recvVecFromNB' (sock, size, flags) = let val arr = Word8Array.array(size, 0w0); in case recvArrFromNB'(sock, Word8ArraySlice.full arr, flags) of NONE => NONE | SOME (rcvd, addr) => SOME (Word8ArraySlice.vector(Word8ArraySlice.slice(arr, 0, SOME rcvd)), addr) end and recvVecFromNB (sock, size) = recvVecFromNB'(sock, size, nullIn) end (* "select" call. *) datatype sock_desc = SOCKDESC of OS.IO.iodesc fun sockDesc (SOCK sock) = SOCKDESC sock (* Create a socket descriptor from a socket. *) fun sameDesc (SOCKDESC a, SOCKDESC b) = a = b local (* The underlying call takes three arrays and updates them with the sockets that are in the appropriate state. It sets inactive elements to ~1. *) val doIo: int * (OS.IO.iodesc Vector.vector * OS.IO.iodesc Vector.vector * OS.IO.iodesc Vector.vector * Time.time) -> OS.IO.iodesc Vector.vector * OS.IO.iodesc Vector.vector * OS.IO.iodesc Vector.vector = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun sys_select_block(rds, wrs, exs) = doIo(64, (rds, wrs, exs, Time.zeroTime)) fun sys_select_poll(rds, wrs, exs) = doIo(65, (rds, wrs, exs, Time.zeroTime)) (* The time parameter for a wait is the absolute time when the timeout expires. *) and sys_select_wait (rds, wrs, exs, t) = doIo(66, (rds, wrs, exs, t)) end fun select { rds: sock_desc list, wrs : sock_desc list, exs : sock_desc list, timeout: Time.time option } : { rds: sock_desc list, wrs : sock_desc list, exs : sock_desc list } = let fun sockDescToDesc(SOCKDESC sock) = sock (* Create the initial vectors. *) val rdVec: OS.IO.iodesc Vector.vector = Vector.fromList(map sockDescToDesc rds) val wrVec: OS.IO.iodesc Vector.vector = Vector.fromList(map sockDescToDesc wrs) val exVec: OS.IO.iodesc Vector.vector = Vector.fromList(map sockDescToDesc exs) open Time val (rdResult, wrResult, exResult) = (* Do the approriate select. *) case timeout of NONE => sys_select_block(rdVec, wrVec, exVec) | SOME t => if t <= Time.zeroTime then sys_select_poll(rdVec, wrVec, exVec) else sys_select_wait(rdVec, wrVec, exVec, t + Time.now()); (* Function to create the results. *) fun getResults v = Vector.foldr (fn (sd, l) => SOCKDESC sd :: l) [] v in (* Convert the results. *) { rds = getResults rdResult, wrs = getResults wrResult, exs = getResults exResult } end end; local (* Install the pretty printer for Socket.AF.addr_family This must be done outside the structure if we use opaque matching. *) fun printAF _ _ x = PolyML.PrettyString(Socket.AF.toString x) fun printSK _ _ x = PolyML.PrettyString(Socket.SOCK.toString x) fun prettySocket _ _ (_: ('a, 'b) Socket.sock) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter printAF val () = PolyML.addPrettyPrinter printSK val () = PolyML.addPrettyPrinter prettySocket end; polyml-5.6/basis/Statistics.ML000066400000000000000000000214471265146633400164070ustar00rootroot00000000000000(* Title: Poly/ML Statistics parser. Author: David Matthews Copyright David Matthews 2013, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is an interface to the statistics provided by the run-time system. For machine-independence and backwards compatibility they are encoded using ASN1 binary encodeing *) local open Asn1 datatype statistic = UnknownStat | CounterStat of { identifier: int, name: string, count: int } | SizeStat of { identifier: int, name: string, size: int } | TimeStat of { identifier: int, name: string, time: Time.time } | UserStat of { identifier: int, name: string, count: int } datatype component = CounterValue of int | ByteCount of int | Time of Time.time | UnknownComponent val emptySlice = Word8VectorSlice.full(Word8Vector.fromList []) fun convStats(v: Word8Vector.vector) = let fun parseStatistic p = case decodeItem p of SOME {tag = Application(0x1, Constructed), data, remainder} => ( case parseComponents({identifier=0, name="", value=UnknownComponent}, data) of {identifier, name, value=CounterValue v} => (CounterStat{identifier=identifier, name=name, count=v}, remainder) | _ => (UnknownStat, remainder) ) | SOME {tag = Application(0x2, Constructed), data, remainder} => ( case parseComponents({identifier=0, name="", value=UnknownComponent}, data) of {identifier, name, value=ByteCount s} => (SizeStat{identifier=identifier, name=name, size=s}, remainder) | _ => (UnknownStat, remainder) ) | SOME {tag = Application(0x3, Constructed), data, remainder} => ( case parseComponents({identifier=0, name="", value=UnknownComponent}, data) of {identifier, name, value=Time t} => (TimeStat{identifier=identifier, name=name, time=t}, remainder) | _ => (UnknownStat, remainder) ) | SOME {tag = Application(0xb, Constructed), data, remainder} => ( case parseComponents({identifier=0, name="", value=UnknownComponent}, data) of {identifier, name, value=CounterValue c} => (UserStat{identifier=identifier, name=name, count=c}, remainder) | _ => (UnknownStat, remainder) ) | SOME {remainder, ...} => (UnknownStat, remainder) | NONE => (UnknownStat, emptySlice) and parseComponents(result as {identifier, name, value }, p) = if Word8VectorSlice.length p = 0 then result else ( case decodeItem p of SOME {tag = Application(0x4, Primitive), data, remainder} => parseComponents({identifier=decodeInt data, name=name, value=value}, remainder) | SOME {tag = Application(0x5, Primitive), data, remainder} => parseComponents({name=decodeString data, identifier=identifier, value=value}, remainder) | SOME {tag = Application(0x6, Primitive), data, remainder} => parseComponents({identifier=identifier, name=name, value=CounterValue(decodeInt data)}, remainder) | SOME {tag = Application(0x7, Primitive), data, remainder} => parseComponents({identifier=identifier, name=name, value=ByteCount(decodeInt data)}, remainder) | SOME {tag = Application(0x8, Constructed), data, remainder} => let fun parseTime (t, p) = if Word8VectorSlice.length p = 0 then t else ( case decodeItem p of SOME {tag = Application(0x9, Primitive), data, remainder} => parseTime(t + Time.fromSeconds(decodeInt data), remainder) | SOME {tag = Application(0xa, Primitive), data, remainder} => parseTime(t + Time.fromMicroseconds(decodeInt data), remainder) | SOME {remainder, ...} => parseTime(t, remainder) (* Unknown *) | NONE => t ) in parseComponents({identifier=identifier, name=name, value=Time(parseTime(Time.zeroTime, data))}, remainder) end | SOME {remainder, ...} => parseComponents(result, remainder) | NONE => result ) fun parseStatistics l = if Word8VectorSlice.length l = 0 then [] else let val (item, rest) = parseStatistic l val items = parseStatistics rest in item :: items end val stats = case decodeItem (Word8VectorSlice.full v) of SOME {tag = Application(0x0, Constructed), data, ...} => parseStatistics data | _ => raise Fail "Statistics not available" fun extractCounter(n, l) = case List.find (fn CounterStat{identifier, ...} => identifier = n | _ => false) l of SOME(CounterStat{ count, ...}) => count | _ => 0 and extractSize(n, l) = case List.find (fn SizeStat{identifier, ...} => identifier = n | _ => false) l of SOME(SizeStat{ size, ...}) => size | _ => 0 and extractTime(n, l) = case List.find (fn TimeStat{identifier, ...} => identifier = n | _ => false) l of SOME(TimeStat{ time, ...}) => time | _ => Time.zeroTime and extractUser(n, l) = case List.find (fn UserStat{identifier, ...} => identifier = n | _ => false) l of SOME(UserStat{ count, ...}) => count | _ => 0 in { threadsTotal = extractCounter(1, stats), threadsInML = extractCounter(2, stats), threadsWaitIO = extractCounter(3, stats), threadsWaitMutex = extractCounter(4, stats), threadsWaitCondVar = extractCounter(5, stats), threadsWaitSignal = extractCounter(6, stats), gcFullGCs = extractCounter(7, stats), gcPartialGCs = extractCounter(8, stats), sizeHeap = extractSize(9, stats), sizeHeapFreeLastGC = extractSize(10, stats), sizeHeapFreeLastFullGC = extractSize(11, stats), sizeAllocation = extractSize(12, stats), sizeAllocationFree = extractSize(13, stats), timeNonGCUser = extractTime(14, stats), timeNonGCSystem = extractTime(15, stats), timeGCUser = extractTime(16, stats), timeGCSystem = extractTime(17, stats), userCounters = Vector.tabulate(8, fn n => extractUser(n+18, stats)) } end open RunCall RuntimeCalls in structure PolyML = struct open PolyML structure Statistics = struct fun getLocalStats() = convStats(RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (29, ())) and getRemoteStats(pid: int) = convStats(RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (30, pid)) and numUserCounters(): int = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (27, ()) and setUserCounter(which: int, value: int): unit = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (28, (which, value)) end end end; polyml-5.6/basis/String.sml000066400000000000000000002153421265146633400160050ustar00rootroot00000000000000(* Title: Standard Basis Library: String Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This file declares Char, String and CharVector. String and CharVector are simply different views on the same underlying structure. *) (* G&R 2004 status: Done *) structure Char = struct type char = char end; (* We need this for "scan". *) structure String = struct type string = string end; (* Needed for toString, fromString etc. *) signature CHAR = sig eqtype char eqtype string val minChar : char val maxChar : char val maxOrd : int val ord : char -> int val chr : int -> char val succ : char -> char val pred : char -> char val < : (char * char) -> bool val <= : (char * char) -> bool val > : (char * char) -> bool val >= : (char * char) -> bool val compare : (char * char) -> General.order val contains : string -> char -> bool val notContains : string -> char -> bool val toLower : char -> char val toUpper : char -> char val isAlpha : char -> bool val isAlphaNum : char -> bool val isAscii : char -> bool val isCntrl : char -> bool val isDigit : char -> bool val isGraph : char -> bool val isHexDigit : char -> bool val isLower : char -> bool val isPrint : char -> bool val isSpace : char -> bool val isPunct : char -> bool val isUpper : char -> bool val fromString : String.string -> char option (* The argument to scan should be the global *) val scan : (Char.char, 'a) StringCvt.reader -> (char, 'a) StringCvt.reader val toString : char -> String.string val fromCString : String.string -> char option val toCString : char -> String.string end; signature STRING = sig eqtype string eqtype char val maxSize : int val size : string -> int val sub : (string * int) -> char val extract : (string * int * int option) -> string val substring : (string * int * int) -> string val concat : string list -> string val concatWith: string -> string list -> string val ^ : (string * string) -> string val str : char -> string val implode : char list -> string val explode : string -> char list val map : (char -> char) -> string -> string val translate : (char -> string) -> string -> string val tokens : (char -> bool) -> string -> string list val fields : (char -> bool) -> string -> string list val isPrefix : string -> string -> bool val isSubstring : string -> string -> bool val isSuffix : string -> string -> bool val compare : (string * string) -> General.order val collate : ((char * char) -> General.order) -> (string * string) -> General.order val < : (string * string) -> bool val <= : (string * string) -> bool val > : (string * string) -> bool val >= : (string * string) -> bool val toString : string -> String.string val scan: (Char.char, 'a) StringCvt.reader -> (string, 'a) StringCvt.reader val fromString : String.string -> string option val toCString : string -> String.string val fromCString : String.string -> string option end; signature SUBSTRING = sig type substring eqtype char eqtype string val size : substring -> int val base : substring -> (string * int * int) val isEmpty : substring -> bool val sub : (substring * int) -> char val getc : substring -> (char * substring) option val first : substring -> char option val extract : (string * int * int option) -> substring val substring : (string * int * int) -> substring val slice : (substring * int * int option) -> substring val full: string -> substring val string : substring -> string val concat: substring list ->string val concatWith: string -> substring list ->string val explode : substring -> char list val translate : (char -> string) -> substring -> string val app : (char -> unit) -> substring -> unit val foldl : ((char * 'a) -> 'a) -> 'a -> substring -> 'a val foldr : ((char * 'a) -> 'a) -> 'a -> substring -> 'a val tokens : (char -> bool) -> substring -> substring list val fields : (char -> bool) -> substring -> substring list val isPrefix: string -> substring -> bool val isSubstring: string -> substring -> bool val isSuffix: string -> substring -> bool val compare : (substring * substring) -> General.order val collate : ((char * char) -> General.order) -> (substring * substring) -> General.order val triml : int -> substring -> substring val trimr : int -> substring -> substring val splitl : (char -> bool) -> substring -> (substring * substring) val splitr : (char -> bool) -> substring -> (substring * substring) val splitAt : (substring * int) -> (substring * substring) val dropl : (char -> bool) -> substring -> substring val dropr : (char -> bool) -> substring -> substring val takel : (char -> bool) -> substring -> substring val taker : (char -> bool) -> substring -> substring val position : string -> substring -> (substring * substring) val span : (substring * substring) -> substring end; (* The overloads for char and string for the relational operators have already been set up in the prelude. *) local open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open LibrarySupport; val System_lock: string -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_loadb: string*word->char = RunCall.run_call2 POLY_SYS_load_byte; val System_setb: string * word * char -> unit = RunCall.run_call3 POLY_SYS_assign_byte; (* Redefine these as functions on the abstract type. *) val System_loadbA: address*word->char = RunCall.run_call2 POLY_SYS_load_byte; val System_setbA: address * word * char -> unit = RunCall.run_call3 POLY_SYS_assign_byte; val System_move_bytesA: address*word*address*word*word->unit = RunCall.run_call5 POLY_SYS_move_bytes (* If a vector/string is short (i.e. has an integer tag) it must be the character itself rather than a pointer to a segment. *) val System_isShort : string -> bool = RunCall.run_call1 POLY_SYS_is_short val wordSize : word = LibrarySupport.wordSize; local val mem_move: string*word*string*word*word -> unit = RunCall.run_call5 POLY_SYS_move_bytes in fun bcopy(src: string, dst: string, src_off: word, dst_off: word, length: word) = mem_move(src, src_off, dst, dst_off, length) end (* These two functions are used to convert between single character strings and the character representation. *) val vecAsChar: string->char = RunCall.unsafeCast val charAsVec: char->string = RunCall.unsafeCast (* Casts between int and word. *) val intAsWord: int -> word = RunCall.unsafeCast and wordAsInt: word -> int = RunCall.unsafeCast (* String concatenation is currently built into the RTS although it doesn't need to be. *) (* val op ^ : string * string -> string = op ^ *)(* In prelude. *) fun op ^ (a: string, b: string): string = let val a_length = sizeAsWord a and b_length = sizeAsWord b in (* Handle the special cases where one of the strings is empty. As well as saving on duplicating storage it also means we don't have to consider the special case when the result string is a single character. *) if a_length = 0w0 then b else if b_length = 0w0 then a else (* Normal case *) let val vec = allocString(a_length + b_length) in if a_length = 0w1 then System_setb (vec, wordSize, vecAsChar a) else bcopy(a, vec, wordSize, wordSize, a_length); if b_length = 0w1 then System_setb (vec, wordSize+a_length, vecAsChar b) else bcopy(b, vec, wordSize, wordSize+a_length, b_length); System_lock vec; vec end end (* op ^ *) (* This can be used where we have already checked the range. *) val unsafeSub = LibrarySupport.unsafeStringSub; (* String comparison function used in isPrefix and isSuffix. N.B. The caller must make sure that neither string is a single character. *) local val byteVecEq: string * word * string * word * word -> bool = RunCall.run_call5 POLY_SYS_bytevec_eq in fun byteMatch s1 s2 i j l = byteVecEq(s1, i+wordSize, s2, j+wordSize, l) end (* There's an irritating dependency here. Char uses StringCvt.reader which means that StringCvt depends on Char so String depends on StringCvt. That means we can't define StringCvt in terms of String which would be easiest. I've solved this by putting common code into LibrarySupport. *) structure Char = struct type char = char and string = string val maxOrd = 255 (* Range from 0 to 255 *) (* Single characters are represented by the number so we only need to check the argument and then convert it. *) fun chr i : char = if i < 0 orelse i > maxOrd then raise General.Chr else RunCall.unsafeCast i val ord: char -> int = RunCall.unsafeCast val minChar = chr 0 and maxChar = chr maxOrd fun succ c = if ord c = maxOrd then raise Chr else chr(ord c + 1) and pred c = if ord c = 0 then raise Chr else chr(ord c - 1) fun isUpper c = #"A" <= c andalso c <= #"Z" fun isLower c = #"a" <= c andalso c <= #"z" fun isDigit c = #"0" <= c andalso c <= #"9" fun isAlpha c = isUpper c orelse isLower c fun isAlphaNum c = isAlpha c orelse isDigit c fun isHexDigit c = isDigit c orelse (#"a" <= c andalso c <= #"f") orelse (#"A" <= c andalso c <= #"F") fun isGraph c = #"!" <= c andalso c <= #"~" fun isPrint c = isGraph c orelse c = #" " fun isPunct c = isGraph c andalso not (isAlphaNum c) (* NOTE: The web page includes 0 <= ord c but all chars satisfy that. *) fun isAscii c = c <= chr 127 (* NOTE: The web page defines isCtrl not isCntrl *) fun isCntrl c = isAscii c andalso not (isPrint c) (* NOTE: There's a mistake in the web page. It says c <= #"\ " *) fun isSpace c = (#"\t" <= c andalso c <= #"\r") orelse c = #" " fun toLower c = if isUpper c then chr (ord c + 32) else c fun toUpper c = if isLower c then chr (ord c - 32) else c (* TODO: More efficient versions. Probably best to use comparison for short strings and table look-up for longer ones. *) fun contains s = let fun match 0w0 _ = false | match i c = unsafeSub(s, i-0w1) = c orelse match (i-0w1) c in match (sizeAsWord s) end fun notContains s c = not (contains s c) (* Convert the first i digits as a hex number. Check the result is in the range before returning it. *) local fun readHex' _ str 0 res = if res > maxOrd then NONE else SOME(chr res, str) | readHex' getc str i res = case getc str of NONE => (* No char available. That's ok if we are converting as many chars as we can and have already converted one but not if we are converting n chars and haven't got them *) if i >= ~1 orelse res > maxOrd then NONE else SOME(chr res, str) | SOME(ch, str') => if #"0" <= ch andalso ch <= #"9" then readHex' getc str' (i-1) (res*16 + ord ch - ord #"0") else if #"a" <= ch andalso ch <= #"f" then readHex' getc str' (i-1) (res*16 + ord ch - ord #"a" + 10) else if #"A" <= ch andalso ch <= #"F" then readHex' getc str' (i-1) (res*16 + ord ch - ord #"A" + 10) else (* Not a hex char. Ok if we are converting as many as we can. *) if i >= ~1 orelse res > maxOrd then NONE else SOME(chr res, str) in fun readHexN getc str i = readHex' getc str i 0 and readHex getc str = readHex' getc str ~1 0 end (* Convert the first i digits as a decimal. There must be exactly i digits. *) fun readDec _ str 0 res = if res > maxOrd then NONE else SOME(chr res, str) | readDec getc str i res = case getc str of NONE => if res > maxOrd orelse i > 0 (* not enough chars *) then NONE else SOME(chr res, str) | SOME(ch, str') => if #"0" <= ch andalso ord #"9" >= ord ch then readDec getc str' (i-1) (res*10 + ord ch - ord #"0") else (* Not enough valid digits. *) NONE (* Convert up to i digits as an octal number. There may be fewer than i digits. *) fun readOct _ str 0 res = if res > maxOrd then NONE else SOME(chr res, str) | readOct getc str i res = case getc str of NONE => if res > maxOrd then NONE else SOME(chr res, str) | SOME(ch, str') => if #"0" <= ch andalso ord #"7" >= ord ch then readOct getc str' (i-1) (res*8 + ord ch - ord #"0") else (* Stop here. *) if res > maxOrd then NONE else SOME(chr res, str) (* This function is used as the basis of Char.scan and String.scan. There is a crucial difference between Char.scan and String.scan in that Char.scan returns NONE if it cannot read a single character whereas String.scan returns NONE only if it encounters a bad escape before reading any valid input, which includes a format sequence (\\). This function returns NONE if it encounters a bad escape but SOME("", strm) if it encounters end-of-stream or has read a format sequence. *) fun scanBase (getc: (char, 'a) StringCvt.reader) (str :'a) : (string * 'a) option = case getc str of (* Read the first character. *) NONE => SOME("", str) (* Just end-of-stream. *) | SOME(ch, str') => if ch < chr 32 orelse chr 126 < ch then NONE (* Non-printable character. *) else if ch = #"\\" then (* escape *) ( case getc str' of NONE => NONE | SOME(#"a", str'') => SOME("\a", str'') | SOME(#"b", str'') => SOME("\b", str'') | SOME(#"t", str'') => SOME("\t", str'') | SOME(#"n", str'') => SOME("\n", str'') | SOME(#"v", str'') => SOME("\v", str'') | SOME(#"f", str'') => SOME("\f", str'') | SOME(#"r", str'') => SOME("\r", str'') | SOME(#"\\", str'') => SOME("\\", str'') | SOME(#"\"", str'') => SOME("\"", str'') | SOME(#"^", str'') => (* Control char *) ( case getc str'' of NONE => NONE | SOME(ch'', str''') => if ord ch'' >= 64 andalso 95 >= ord ch'' then SOME(charAsVec(chr(ord ch'' - 64)), str''') else NONE ) | SOME(#"u", str'') => (* Hex encoding: Read 4 hex digits *) (* NOTE: There's a contradiction in the web page: It says both 4 hex digits and also "the longest sequence of such characters" *) (case readHexN getc str'' 4 of NONE => NONE | SOME(s, str) => SOME(charAsVec s, str)) | SOME(ch', str'') => if isSpace ch' then (* Remove \f...f\ and then recurse. *) ( case getc (StringCvt.skipWS getc str'') of NONE => NONE | SOME(ch'', str''') => if ch'' <> #"\\" then NONE (* Bad format *) else SOME("", str''') (* Return an empty string. *) ) else if #"0" <= ch' andalso ch' <= #"2" then (* Decimal encoding *) (* NOTE: There's a contradiction in the web page: It says both 3 digits and also "the longest sequence of such characters". The tests insist on 3 digits so we go with that. *) (case readDec getc str' 3 0 of NONE => NONE | SOME(s, str) => SOME(charAsVec s, str)) else (* Unknown escape *) NONE ) else SOME(charAsVec ch, str') (* Result is the character. *) fun scan (getc: (char, 'a) StringCvt.reader) (str :'a) : (char * 'a) option = case scanBase getc str of NONE => NONE | SOME("", strm') => (* May be end-of-string or we may have read a format sequence. *) (case getc strm' of NONE => (* end-of-string *) NONE | _ => scan getc strm') | SOME(s, strm') => SOME(vecAsChar s, strm') (* Only ever a single character *) (* Convert C escapes *) (* This function does not appear in the CHAR signature but we need to export it from Char to use it in String.fromCString. *) fun scanC (getc: (char, 'a) StringCvt.reader) (str :'a) : (char * 'a) option = case getc str of (* Read the first character. *) NONE => NONE | SOME(ch, str') => if ch < chr 32 orelse chr 126 < ch then NONE (* Non-printable character. *) else if ch = #"\\" then (* escape *) ( case getc str' of NONE => NONE | SOME(#"a", str'') => SOME((*#"\a"*) chr 7, str'') | SOME(#"b", str'') => SOME((*#"\b"*) chr 8, str'') | SOME(#"t", str'') => SOME(#"\t", str'') | SOME(#"n", str'') => SOME(#"\n", str'') | SOME(#"v", str'') => SOME((*#"\v" *) chr 11, str'') | SOME(#"f", str'') => SOME((*#"\f"*) chr 12, str'') | SOME(#"r", str'') => SOME((*#"\r"*) chr 13, str'') | SOME(#"?", str'') => SOME(#"?", str'') | SOME(#"\\", str'') => SOME(#"\\", str'') | SOME(#"\"", str'') => SOME(#"\"", str'') | SOME(#"'", str'') => SOME(#"'", str'') | SOME(#"^", str'') => (* Control char *) ( case getc str'' of NONE => NONE | SOME(ch'', str''') => if ord ch'' >= 64 andalso 95 >= ord ch'' then SOME(chr(ord ch'' - 64), str''') else NONE ) (* Note: the web page says \u here but it seems it should be \x. That's confirmed by the latest version of the library definition. *) | SOME(#"x", str'') => (* Hex encoding. *) readHex getc str'' | SOME(ch', _) => if #"0" <= ch' andalso ch' <= #"7" then (* Octal encoding *) readOct getc str' 3 0 else (* Unknown escape *) NONE ) else SOME(ch, str') (* Result is the character. *) (* Convert from a string. *) (* TODO: More efficient conversion using the string directly rather than scanString ? *) val fromString = StringCvt.scanString scan and fromCString = StringCvt.scanString scanC (* Convert to printable string. *) local local (* Conversion to octal has now been defined to generate three octal digits in the same way as conversion to integer. *) fun octIntRepr base digs (i: int) = if digs = 0 then "" else octIntRepr base (digs-1) (i div base) ^ str(chr(i mod base + ord #"0")) in val intRepr = octIntRepr 10 3 val octalRepr = octIntRepr 8 3 end in (* Conversion to ML escapes. *) fun toString ch = (* First handle the special cases *) if ch = #"\\" then "\\\\" else if ch = #"\"" then "\\\"" else if isPrint ch (* Other printable characters *) then str ch else (* Control chars: Special cases first *) if ch = chr 7 then "\\a" else if ch = chr 8 then "\\b" else if ch = chr 9 then "\\t" else if ch = chr 10 then "\\n" else if ch = chr 11 then "\\v" else if ch = chr 12 then "\\f" else if ch = chr 13 then "\\r" else if ch < chr 32 (* Other chars must be escaped. *) then "\\^" ^ str(chr(ord ch + 64)) else (* Use 3 digit notation. *) (* Note: Web site assumes ASCII, not Unicode. *) "\\" ^ intRepr(ord ch) (* Conversion to C escapes. *) fun toCString ch = (* First handle the special cases *) if ch = #"\\" then "\\\\" else if ch = #"\"" then "\\\"" else if ch = #"?" then "\\?" else if ch = #"'" then "\\'" else if isPrint ch (* Other printable characters *) then str ch else (* Control chars: Special cases first *) if ch = chr 7 then "\\a" else if ch = chr 8 then "\\b" else if ch = chr 9 then "\\t" else if ch = chr 10 then "\\n" else if ch = chr 11 then "\\v" else if ch = chr 12 then "\\f" else if ch = chr 13 then "\\r" else (* Use octal notation. *) (* Note: Web site assumes ASCII, not Unicode. *) "\\" ^ octalRepr(ord ch) end; (* Install conversion and print functions. *) local (* It might be worth rewriting scan to raise Conversion with a string argument so we can pass back information about why an escape code was invalid. *) fun convChar s = let val len = sizeAsWord s fun rdr i = if i = len then NONE else SOME(unsafeSub(s, i), i+0w1) in case scan rdr 0w0 of NONE => raise RunCall.Conversion "Invalid character constant" | SOME(res, index') => (* Check that we have converted all the string. *) if index' <> len then raise RunCall.Conversion "Not exactly one character" else res end fun print_char _ _ (c: char) = PolyML.PrettyString("#\"" ^ toString c ^ "\"") in val () = RunCall.addOverload convChar "convChar"; val () = PolyML.addPrettyPrinter print_char end (* Define the type-specific inequalities. *) val op < : char * char -> bool = op < val op <= : char * char -> bool = op <= val op > : char * char -> bool = op > val op >= : char * char -> bool = op >= fun compare (ch, ch') = if ch < ch' then General.LESS else if ch > ch' then General.GREATER else General.EQUAL end; (* structure Char *) structure String = (* This structure is the basis of both String and CharVector. *) struct type string = string and vector = string and elem = char and char = char val size : string -> int = size (* In prelude *) (* A one character string is simply the character itself. *) val str: char ->string = charAsVec val maxSize: int = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env (101, ()) val alloc = LibrarySupport.allocString (* Concatentate a list of strings. *) fun concat [] = "" | concat [s] = s (* Handle special case to reduce copying. *) (* Could also handle the case of concat(""::s) = concat s *) | concat L = let fun total n [] = n | total n (H::T) = total (n + size H) T (* How many characters do we have to implode? This could possibly be long (although we would probably have run out of memory long before) so we have to add these as integers and then raise an exception if it's not short. *) val chars : int = total 0 L; in if chars = 0 then "" else if chars = 1 then let (* Special case for single char *) (* Find the character by first removing any empty strings. *) fun getChar [] = raise Fail "" (* Should never occur *) | getChar ("" :: T) = getChar T | getChar (H :: _) = H (* Should be a single character *) in getChar L end else (* Normal case *) let val chs = unsignedShortOrRaiseSize chars (* Check it's short. *) val vec = alloc chs fun copy (_, []:string list) = () | copy (i, H :: T) = let val src_len = sizeAsWord H in if src_len = 0w1 then (* single character strings are ints *) System_setb (vec, i, vecAsChar H) else bcopy(H, vec, wordSize, i, src_len); copy(i+src_len, T) end in copy (wordSize, L); System_lock vec; vec end end (* concat *) fun concatWith _ [] = "" | concatWith _ [one] = one | concatWith s (hd :: tl) = let fun mk [] = [] | mk (h::t) = s :: h :: mk t in concat(hd :: mk tl) end (* implode is very similar to concat, in fact it could be defined as a cast version of it. Since we need it for StringCvt.splitl it's defined in LibrarySupport. *) val implode = LibrarySupport.stringImplode (* This was previously built-in because of the way it worked in the Poly language. It could be defined as concat[a,b] but we define it separately for efficiency. *) val op ^ : string * string -> string = op ^ (* This replaces the string_sub function in the RTS. It's probably worthwhile because that function indexes from 1 so we need a wrap-around anyway. *) fun sub (s: string, i: int): char = if i < 0 orelse i >= size s then raise General.Subscript else if System_isShort s then vecAsChar s else System_loadb(s, intAsWord i + wordSize); (* Explode a string into a list of characters. *) fun explode (s : string) : char list = stringExplode(s, 0w0, sizeAsWord s) (* TODO: Could be defined more efficiently, perhaps by copying it into an array. *) (* This would be easier if we could process the string twice as we do with toString but we need to be careful to call f only once for each character in case it has a side-effect. *) fun translate f s = let val len = sizeAsWord s in if len = 0w1 (* Handle special case of single character. *) then f(vecAsChar s) else let (* Accumulate the characters into a list. *) fun mapChars i l = if i = len then l else mapChars (i+0w1) (f(System_loadb(s, i+wordSize)) :: l) in (* Reverse the list and concatenate it. *) concat(List.rev(mapChars 0w0 [])) end end fun substring (s, i, j) = let val len = sizeAsWord s (* Check that the index and length are both non-negative. *) val i' = unsignedShortOrRaiseSubscript i and j' = unsignedShortOrRaiseSubscript j in if i'+j' > len then raise Subscript else unsafeSubstring(s, i', j') end fun extract (s, i, NONE) = substring (s, i, size s - i) | extract (s, i, SOME j) = substring (s, i, j) (* tokens and fields are very similar except that tokens does not return empty strings for adjacent delimiters whereas fields does. *) fun tokens p s = let val length = size s fun tok' i l = (* i is the character to examine. l is the start of a token *) if i = length then (* Finished the input. Return any partially completed string. *) ( if l = i then [] else [substring (s, l, i-l)] ) else if p (sub(s, i)) (* TODO: We don't need sub to do the range check here *) then (* It's a delimiter. If we have more than one character in the string we create a string otherwise we just continue. *) ( if l = i then tok' (i+1) (i+1) else substring (s, l, i-l) :: tok' (i+1) (i+1) ) else (* Token: Keep accumulating characters. *) tok' (i+1) l in tok' 0 0 end fun fields p s = let val length = size s fun field' i l = (* i is the character to examine. l is the start of a token *) if i = length then (* Finished the input. Return any partially completed string. *) [substring (s, l, i-l)] else if p (unsafeSub(s, intAsWord i)) then (* It's a delimiter. Finish the partially completed string and start another. *) substring (s, l, i-l) :: field' (i+1) (i+1) else (* Field: Keep accumulating characters. *) field' (i+1) l in field' 0 0 end (* Generate escape characters. *) local fun toStrings convert s = let val len = sizeAsWord s in (* Handle the special case of a single character string first. *) if len = 0w1 then convert(vecAsChar s) else let (* First pass - find out the size of the result string. *) fun getSize i n = if i = len then n else getSize (i+0w1) (n + size(convert(System_loadb(s, i+wordSize)))) (* The result could possibly be long so we add the lengths as integers and convert and check when we've finished. *) val newSize = unsignedShortOrRaiseSize (getSize 0w0 0) in (* If the size is the same we can return the original string. This relies on the fact that the conversions either return the character unchanged or return a longer escape sequence. *) if newSize = len then s else let (* Second pass: create the output string and copy to it. *) val newVec = allocString newSize fun copyToOut i j = if i = len then () else let val conv = convert(System_loadb(s, i+wordSize)) val convSize = sizeAsWord conv in if convSize = 0w1 then System_setb (newVec, j, vecAsChar conv) else bcopy(conv, newVec, wordSize, j, convSize); copyToOut (i+0w1) (j+convSize) end in copyToOut 0w0 wordSize; System_lock newVec; newVec end end end in val toString = toStrings Char.toString and toCString = toStrings Char.toCString end (* Convert escapes. *) fun scan (getc: (char, 'a) StringCvt.reader) (str :'a) : (string * 'a) option = let fun scanString str l haveRead = case Char.scanBase getc str of NONE => (* Invalid escape sequence *) if haveRead then SOME(concat(rev l), str) else NONE | SOME("", strm') => (* End of input or read a format sequence. *) (case getc strm' of NONE => SOME(concat(rev l), strm') | _ => scanString strm' l true) | SOME(s, strm') => scanString strm' (s :: l) true (* More to do. *) in scanString str [] false end val fromString = StringCvt.scanString scan (* TODO: More efficient version. *) fun fromCString "" = SOME "" (* Special case *) | fromCString s = let val len = sizeAsWord s fun rdr i = if i = len then NONE else SOME(unsafeSub(s, i), i+0w1) (* Repeatedly convert escape sequences and accumulate the results in a list. *) fun convChar i = case Char.scanC rdr i of NONE => [] | SOME(res, j) => res :: convChar j in (* If we couldn't even get a single character we return NONE. *) case convChar 0w0 of [] => NONE | res => SOME(implode res) end (* Install conversion and print functions. *) local (* It might be worth rewrite scan to raise Conversion with a string argument so we can pass back information about why an escape code was invalid. *) (* Unlike fromString which returns as much of the input string as could be converted this raises an exception if the input contains any invalid character. *) fun convString s = let val len = sizeAsWord s fun rdr i = if i = len then NONE else SOME(unsafeSub(s, i), i+0w1) (* Repeatedly convert escape sequences and accumulate the results in a list. *) fun convChars i = if i = len then [] (* Finished *) else case Char.scan rdr i of NONE => (* Bad conversion *) raise RunCall.Conversion "Invalid string constant" | SOME(res, j) => res :: convChars j in implode(convChars 0w0) end fun print_string _ _ (s: string) = PolyML.PrettyString(concat["\"", toString s, "\""]) in val () = RunCall.addOverload convString "convString"; val () = PolyML.addPrettyPrinter print_string end (* True if s1 is a prefix of s2 *) (* G&R now says that a string is a prefix of itself. *) fun isPrefix s1 s2 = let val size_s1 = size s1 and size_s2 = size s2 in if size_s1 <= size_s2 then if size_s1 = 1 (* We have to deal with the case of single chars. *) then if size_s2 = 1 then vecAsChar s1 = vecAsChar s2 else vecAsChar s1 = System_loadb(s2, wordSize) else byteMatch s1 s2 0w0 0w0 (intAsWord size_s1) else false end (* True if s1 is a suffix of s2 *) fun isSuffix s1 s2 = let val size_s1 = size s1 and size_s2 = size s2 in if size_s1 <= size_s2 then if size_s1 = 1 (* We have to deal with the case of single chars. *) then if size_s2 = 1 then vecAsChar s1 = vecAsChar s2 else vecAsChar s1 = System_loadb(s2, wordSize+intAsWord(size_s2-1)) else byteMatch s1 s2 0w0 (intAsWord (size_s2 - size_s1)) (intAsWord size_s1) else false end (* True if s1 is a substring of s2 *) fun isSubstring s1 s2 = let val size_s1 = size s1 and size_s2 = size s2 (* Start at the beginning and compare until we get a match. *) fun doMatch i s = if s < size_s1 then false (* The remainder of the string is too small to match. *) else if byteMatch s1 s2 0w0 i (intAsWord size_s1) then true else doMatch (i+0w1) (s-1) in if size_s1 = 1 then Char.contains s2 (vecAsChar s1) else doMatch 0w0 size_s2 end (* Functions specific to CharVector, apart from map which is common. *) fun tabulate (0, _) : vector = "" (* Must not try to lock it. *) | tabulate (1, f) : vector = charAsVec(f 0) | tabulate (length: int , f : int->elem): vector = let val len = unsignedShortOrRaiseSize length (* Raises Size if length < 0 *) val vec = alloc len (* Initialise it to the function values. *) fun init i = if len <= i then () else (System_setb(vec, i+wordSize, f(wordAsInt i)); init(i+0w1)) in init 0w0; System_lock vec; vec end (* Create the other functions. *) structure VectorOps = VectorOperations( struct type vector = vector and elem = elem val length = sizeAsWord fun unsafeSub(s, i) = if System_isShort s then vecAsChar s else System_loadb(s, i + wordSize); fun unsafeSet(_, _, _) = raise Fail "Should not be called" end); open VectorOps; fun map f vec = let val len = sizeAsWord vec in if len = 0w0 then "" else if len = 0w1 (* Special case. Single character strings. *) then charAsVec(f(vecAsChar vec)) else (* len > 1 *) let (* Allocate a new vector. *) val new_vec = alloc len val byte_limit = len + wordSize fun domap i = if i >= byte_limit then () else (System_setb(new_vec, i, f(System_loadb(vec, i))); domap(i+0w1)) in domap wordSize; System_lock new_vec; new_vec end end fun mapi f vec = let val len = sizeAsWord vec in if len = 0w0 then "" else if len = 0w1 (* Special case. Single character strings. *) then charAsVec(f (0, vecAsChar vec)) else (* len >= 2 *) let (* Allocate a new vector. *) val new_vec = alloc len fun domap j = if j >= len then () else (System_setb(new_vec, j+wordSize, f(wordAsInt(j), System_loadb(vec, j+wordSize))); domap(j+0w1)) in domap 0w0; System_lock new_vec; new_vec end end (* Return a copy of the string with a particular character replaced *) fun update (v, i, c) = if i < 0 orelse i >= size v then raise Subscript else mapi (fn (j, s) => if j = i then c else s) v (* Name changes needed for CharVector. *) val maxLen = maxSize val fromList = implode val length = size (* Finally the comparison operations since defining these removes the overloading. *) val op < : (string * string) -> bool = op < val op <= : (string * string) -> bool = op <= val op > : (string * string) -> bool = op > val op >= : (string * string) -> bool = op >= local (* The previous version of compare involved two tests. This uses a single string comparison and then tests the result. *) val strCompare: string*string->int = RunCall.run_call2 POLY_SYS_str_compare in fun compare (s1, s2) = let val c = strCompare(s1, s2) in if c = 0 then General.EQUAL else if c = 1 then General.GREATER else General.LESS end end end (* String *) in (* CharArray is very similar to Word8Array and most of the code is duplicated. *) structure CharArray : MONO_ARRAY = struct (* We can't use the segment length for the length of the vector as we do for "normal" arrays and vectors. There are two ways of handling this. We could implement arrays in the same way as strings, with a length word in the first word, or we could store the length separately. The former has the advantage of using less store but the latter allows the byte vector to be used for other purposes and is probably faster. *) type address = LibrarySupport.address datatype array = datatype LibrarySupport.CharArray.array (* N.B. This representation is hard-wired into TextIO. Don't change this representation without changing that as well. *) type vector = string and elem = char infix 9 sub (* For what it's worth *) val maxLen = String.maxLen (* Use the same maximum as string. *) val alloc = LibrarySupport.allocBytes fun length(Array(l, _)) = wordAsInt l fun array (length, ini) = let (* The array is allocated containing zeros. Some versions of the RTS will allow byte vectors to be allocated with other values but other versions don't. For the moment assume that we have to initialise the array separately. *) val len = unsignedShortOrRaiseSize length val vec = alloc len fun init i = if len <= i then () else (System_setbA(vec, i, ini); init(i+0w1)) in init 0w0; Array(len, vec) end fun op sub (Array(l, v), i: int): elem = let val iW = if isShortInt i andalso i >= 0 then intAsWord i else raise General.Subscript in if iW >= l then raise General.Subscript else System_loadbA (v, iW) end fun update (Array (l, v), i: int, new) : unit = let val iW = if isShortInt i andalso i >= 0 then intAsWord i else raise General.Subscript in if iW >= l then raise General.Subscript else System_setbA (v, iW, new) end; (* Create an array from a list. *) local fun fromList' (l : char list) : word*address = let val length = unsignedShortOrRaiseSize (List.length l); (* Make a array initialised to zero. *) val vec = alloc length; (* Copy the list elements into the array. *) fun init (v, i, a :: l) = (System_setbA(v, i, a); init(v, i + 0w1, l)) | init (_, _, []) = (); in init(vec, 0w0, l); (length, vec) end in fun fromList (l : elem list) : array = Array(fromList' l) end fun tabulate (length: int , f : int->elem): array = let val len = unsignedShortOrRaiseSize length val vec = alloc len (* Initialise it to the function values. *) fun init i = if len <= i then () else (System_setbA(vec, i, f(wordAsInt i)); init(i+0w1)) in init 0w0; Array(len, vec) end fun vector (Array(len, vec)) = if len = 0w0 then "" else if len = 0w1 then (* Single character string is the character itself. *) charAsVec (System_loadbA (vec, 0w0)) else let (* Make an array initialised to zero. *) val new_vec = String.alloc len in System_move_bytesA(vec, 0w0, RunCall.unsafeCast new_vec, wordSize, len); System_lock new_vec; new_vec end (* Copy an array into another. It's possible for the arrays to be the same but in that case diW must be zero and the copy is a no-op. *) fun copy {src=Array (len, s), dst=Array (dlen, d), di: int} = let val diW = unsignedShortOrRaiseSubscript di in if diW+len > dlen then raise General.Subscript else System_move_bytesA(s, 0w0, d, diW, len) end (* Copy avector into an array. *) (* Since the source is actually a string we have to start the copy from si+wordSize. *) fun copyVec {src, dst=Array (dlen, d), di: int} = let val len = LibrarySupport.sizeAsWord src val diW = unsignedShortOrRaiseSubscript di in if diW + len > dlen then raise General.Subscript else if System_isShort src (* i.e. String.length s = 1 *) then (* Single character strings are represented by the character so we just need to insert the character into the array. *) System_setbA(d, diW, vecAsChar src) else System_move_bytesA(RunCall.unsafeCast src, wordSize, d, diW, len) end (* Create the other functions. *) structure ArrayOps = VectorOperations( struct type vector = array and elem = elem fun length(Array(len, _)) = len fun unsafeSub(Array(_, v), i) = System_loadbA(v, i) and unsafeSet(Array(_, v), i, c) = System_setbA(v, i, c) end); open ArrayOps; local (* Install the pretty printer for CharArray.array *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty _ _ x = PolyML.PrettyString(String.concat["\"", String.toString(vector x), "\""]) in val () = PolyML.addPrettyPrinter pretty end end; structure Substring :> sig type substring eqtype char eqtype string val size : substring -> int val base : substring -> (string * int * int) val isEmpty : substring -> bool val sub : (substring * int) -> char val getc : substring -> (char * substring) option val first : substring -> char option val extract : (string * int * int option) -> substring val substring : (string * int * int) -> substring (*val slice : (substring * int * int option) -> substring*) val full: string -> substring val string : substring -> string val concat: substring list ->string val concatWith: string -> substring list ->string val explode : substring -> char list val translate : (char -> string) -> substring -> string val app : (char -> unit) -> substring -> unit val foldl : ((char * 'a) -> 'a) -> 'a -> substring -> 'a val foldr : ((char * 'a) -> 'a) -> 'a -> substring -> 'a val tokens : (char -> bool) -> substring -> substring list val fields : (char -> bool) -> substring -> substring list val isPrefix: string -> substring -> bool val isSubstring: string -> substring -> bool val isSuffix: string -> substring -> bool val compare : (substring * substring) -> General.order val collate : ((char * char) -> General.order) -> (substring * substring) -> General.order val triml : int -> substring -> substring val trimr : int -> substring -> substring val splitl : (char -> bool) -> substring -> (substring * substring) val splitr : (char -> bool) -> substring -> (substring * substring) val splitAt : (substring * int) -> (substring * substring) val dropl : (char -> bool) -> substring -> substring val dropr : (char -> bool) -> substring -> substring val takel : (char -> bool) -> substring -> substring val taker : (char -> bool) -> substring -> substring val position : string -> substring -> (substring * substring) val span : (substring * substring) -> substring type vector type elem type slice val length : slice -> int val subslice: slice * int * int option -> slice val slice: vector * int * int option -> slice val vector: slice -> vector val getItem: slice -> (elem * slice) option val appi : ((int * elem) -> unit) -> slice -> unit val mapi : ((int * elem) -> elem) -> slice -> vector val map : (elem -> elem) -> slice -> vector val foldli : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool sharing type slice = substring end where type elem = char where type vector = string where type char = char where type string = string = struct type vector = string and elem = char structure VectorSliceOps = VectorSliceOperations( struct type vector = vector and elem = char val vecLength = sizeAsWord fun unsafeVecSub(s, i: word) = if System_isShort s then vecAsChar s else System_loadb(s, i + wordSize) fun unsafeVecUpdate _ = raise Fail "Should not be called" (* Not applicable *) end); open VectorSliceOps; (* vector: get the slice out. Since the underlying vector is implemented using the basic string type we can use substring here. *) fun vector slice : vector = let val (vector, start, length) = base slice in unsafeSubstring(vector, intAsWord start, intAsWord length) end; (* It would be more efficient to do these as single operations but it's probably too complicated. *) fun concat L = String.concat(List.map vector L) fun concatWith s L = String.concatWith s (List.map vector L) fun map f slice = String.map f (vector slice) fun mapi f slice = String.mapi f (vector slice) (* Substring operations. *) type substring = slice type char = elem type string = vector val size = length (* Since we've already checked the bounds we don't need to do it here. *) fun string(Slice{vector=s, start=i, length=l}) = unsafeSubstring(s, i, l) (* Check that the index and length are valid. *) fun substring(s, i, j) = if i < 0 orelse j < 0 orelse String.size s < i+j then raise General.Subscript else Slice{vector=s, start=intAsWord i, length=intAsWord j} fun extract(s, i, NONE) = substring(s, i, String.size s-i) | extract(s, i, SOME j) = substring(s, i, j) fun triml k = if k < 0 then raise General.Subscript else fn (Slice{vector=s, start=i, length=l}) => if k > wordAsInt l then Slice{vector=s, start=i+l, length=0w0} else Slice{vector=s, start=i + intAsWord k, length=l - intAsWord k} fun trimr k = if k < 0 then raise General.Subscript else fn (Slice{vector=s, start=i, length=l}) => if k > wordAsInt l then Slice{vector=s, start=i, length=0w0} else Slice{vector=s, start=i, length=l - intAsWord k} fun explode (Slice{vector=s, start=i, length=l}) : char list = LibrarySupport.stringExplode(s, i, l) (* Compare two strings. We could define compare in terms of collate and it would be just as efficient provided we set PolyML.Compiler.maxInlineSize to a large enough value that collate was inlined, and hence Char.compare would be inlined. *) fun compare (Slice{vector=s, start=j, length=l}, Slice{vector=s', start=j', length=l'}) = let fun comp' i = if i = l then ( if l = l' then General.EQUAL else (* l < l' *) General.LESS ) else if i = l' (* and not l *) then General.GREATER else case Char.compare(unsafeSub(s, i+j), unsafeSub(s', i+j')) of General.EQUAL => comp' (i+0w1) | General.LESS => General.LESS | General.GREATER => General.GREATER in comp' 0w0 end fun isPrefix (s1: string) (Slice{vector=s2, start=i, length=l}) = let val size_s1 = sizeAsWord s1 in if size_s1 > l then false else if size_s1 = 0w1 then if System_isShort s2 then vecAsChar s1 = vecAsChar s2 else vecAsChar s1 = System_loadb(s2, i + wordSize) else byteMatch s1 s2 0w0 i size_s1 end (* True if s1 is a suffix of s2 *) fun isSuffix s1 (Slice{vector=s2, start=i, length=l}) = let val size_s1 = sizeAsWord s1 in if size_s1 > l then false else if size_s1 = 0w1 then if System_isShort s2 then vecAsChar s1 = vecAsChar s2 else vecAsChar s1 = System_loadb(s2, i + l - 0w1 + wordSize) else byteMatch s1 s2 0w0 (l + i - size_s1) size_s1 end (* True if s1 is a substring of s2 *) fun isSubstring s1 (Slice{vector=s2, start, length}) = let val size_s1 = sizeAsWord s1 (* Start at the beginning and compare until we get a match. *) fun doMatch i s = if s < size_s1 then false (* The remainder of the string is too small to match. *) else if ( if size_s1 = 0w1 then vecAsChar s1 = System_loadb(s2, i + wordSize) else byteMatch s1 s2 0w0 i size_s1 ) then true else doMatch (i+0w1) (s-0w1) in if System_isShort s2 then size_s1 = 0w0 orelse (size_s1 = 0w1 andalso vecAsChar s1 = vecAsChar s2) else doMatch start length end (* TODO: This would be quicker with an RTS function to scan for a character in a string. *) fun splitl f (Slice{vector=s, start=i, length=l}) = let fun find j = if j = i+l then (* All chars satisfy f *) (Slice{vector=s, start=i, length=l}, Slice{vector=s, start=j, length=0w0}) else if f(unsafeSub(s, j)) then find (j+0w1) else (* Found a separator *) (Slice{vector=s, start=i, length=j-i}, Slice{vector=s, start=j, length=l+i-j}) in find i end (* TODO: This would be quicker with an RTS function to scan for a character in a string. *) fun splitr f (Slice{vector=s, start=i, length=l}) = let fun find j = if j = i then (* All chars satisfy f *) (Slice{vector=s, start=j, length=0w0}, Slice{vector=s, start=i, length=l}) else if f(unsafeSub(s, j-0w1)) then find (j-0w1) else (* Found a separator *) (Slice{vector=s, start=i, length=j-i}, Slice{vector=s, start=j, length=l+i-j}) in find (i+l) end fun splitAt (Slice{vector=s, start=i, length=l}, j) = let val j' = unsignedShortOrRaiseSubscript j in if j' > l then raise General.Subscript else (Slice{vector=s, start=i, length=j'}, Slice{vector=s, start=i+j', length=l-j'}) end (* TODO: Define these directly rather than via split. It's not so expensive doing it this way for substrings because we don't actually copy the strings. *) fun takel p s = #1(splitl p s) and dropl p s = #2(splitl p s) and taker p s = #2(splitr p s) and dropr p s = #1(splitr p s) (* NOTE: There's an error in the web page. The example function uses "trim" rather than "triml". QUESTION: The check i'+n' >= i does not guarantee that ss is to the left of ss', merely that the end of ss' is to the right of the beginning of ss. I can't remember my reasoning about this at the moment. *) val equal_ptr: string*string->bool = RunCall.run_call2 POLY_SYS_word_eq fun span (Slice{vector=s, start=i, length=_}, Slice{vector=s', start=i', length=n'}) = (* First check with pointer equality and only if that fails do we use the string equality function. *) if (equal_ptr(s, s') orelse s = s') andalso i'+n' >= i then Slice{vector=s, start=i, length=i'+n'-i} else raise General.Span (* tokens and fields are very similar except that tokens does not return empty strings for adjacent delimiters whereas fields does. This definition is almost the same as String.tokens and String.fields. *) (* QUESTION: Are these defined always to return the results as substrings of the original base string? That's important if we want to be able to use "span" to join them up again. *) fun tokens p (Slice{vector=s, start=j, length}) = let val ends = j+length fun tok' i l = (* i is the character to examine. l is the start of a token *) if i = ends then (* Finished the input. Return any partially completed string. *) ( if l = i then [] else [Slice{vector=s, start=l, length=i-l}] ) else if p (unsafeSub(s, i)) then (* It's a delimiter. If we have more than one character in the string we create a string otherwise we just continue. *) ( if l = i then tok' (i+0w1) (i+0w1) else Slice{vector=s, start=l, length=i-l} :: tok' (i+0w1) (i+0w1) ) else (* Token: Keep accumulating characters. *) tok' (i+0w1) l in tok' j j end fun fields p (Slice{vector=s, start=j, length}) = let val ends = j+length fun field' i l = (* i is the character to examine. l is the start of a token *) if i = ends then (* Finished the input. Return any partially completed string. *) [Slice{vector=s, start=l, length=i-l}] else if p (unsafeSub(s, i)) then (* It's a delimiter. Finish the partially completed string and start another. *) Slice{vector=s, start=l, length=i-l} :: field' (i+0w1) (i+0w1) else (* Field: Keep accumulating characters. *) field' (i+0w1) l in field' j j end (* TODO: Could be defined more efficiently. *) (* map and translate are defined to apply f from left to right. *) fun translate f s = String.concat(List.map f (explode s)) fun position s (Slice{vector=s', start=i, length=n}) = let val m = sizeAsWord s (* Length of string to match. *) fun pos k = if k > n-m then (* No match *) (Slice{vector=s', start=i, length=n}, Slice{vector=s', start=i+n, length=0w0}) else if compare(full s, Slice{vector=s', start=i+k, length=m}) = EQUAL then (* Match *) (Slice{vector=s', start=i, length=k}, Slice{vector=s', start=k+i, length=n-k}) else pos (k+0w1) in (* Because m and n are word values n-m is UNSIGNED so we have to check this before we call "pos". *) if m > n then (Slice{vector=s', start=i, length=n}, Slice{vector=s', start=i+n, length=0w0}) else pos 0w0 end (* Return the first character of the string together with the rest of the string. *) fun getc(Slice{length=0w0, ...}) = NONE | getc(Slice{vector=s, start=i, length=l}) = SOME(unsafeSub(s, i), Slice{vector=s, start=i+0w1, length=l-0w1}) fun first(Slice{length=0w0, ...}) = NONE | first(Slice{vector=s, start=i, length=_}) = SOME(unsafeSub(s, i)) end; (* CharVectorSlice. *) structure CharVectorSlice: MONO_VECTOR_SLICE where type elem = char where type vector = string = Substring; structure Substring : SUBSTRING = struct open Substring; val slice = subslice end local (* Install the pretty printer for CharVector.slice (and substring) *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty _ _ s = PolyML.PrettyString(String.concat["\"", String.toString(Substring.string s), "\""]) in val _ = PolyML.addPrettyPrinter pretty end; structure CharArraySlice:> MONO_ARRAY_SLICE where type elem = char where type vector = string where type vector_slice = CharVectorSlice.slice where type array = CharArray.array = struct type elem = char type vector = string datatype array = datatype LibrarySupport.CharArray.array (* N.B. This representation is hard-wired into TextIO. Don't change this representation without changing that as well. *) type vector_slice = CharVectorSlice.slice structure ArraySliceOps = VectorSliceOperations( struct type vector = array and elem = char fun unsafeVecSub(Array(_, s: LibrarySupport.address), i) = System_loadbA(s, i) and unsafeVecUpdate(Array(_, s), i, x) = System_setbA (s, i, x) and vecLength(Array(l, _)) = l end); open ArraySliceOps; (* vector: get the slice out. *) fun vector slice: vector = let val (Array(_, vec), start, length) = base slice in if length = 0 then "" else if length = 1 then (* Single character string is the character itself. *) RunCall.unsafeCast (System_loadbA (vec, intAsWord start)) else let val len = intAsWord length (* Make an array initialised to zero. *) val new_vec = String.alloc len in System_move_bytesA(vec, intAsWord start, RunCall.unsafeCast new_vec, wordSize, len); System_lock new_vec; new_vec end end (* Copy a slice into an array. N.B. The arrays could be the same. *) fun copy {src, dst, di: int} = let val (src, start, length) = base src in if di < 0 orelse di+length > CharArray.length dst then raise General.Subscript else (* We can't use System_move_bytes because of the potential overlap problem. Instead we use explicit copying choosing to copy up or down depending on the index whether the source and destination are the same or not. *) let fun copyUp n = if n = length then () else (CharArray.update(dst, n+di, CharArray.sub(src, n+start)); copyUp(n+1)) and copyDown n = if n < 0 then () else (CharArray.update(dst, n+di, CharArray.sub(src, n+start)); copyDown(n-1)) in if di > start then copyDown(length-1) else copyUp 0 end (* System_move_bytesA(s, intAsWord start, d, intAsWord di, intAsWord length) *) end (* Copy a vector slice into an array. *) fun copyVec {src: CharVectorSlice.slice, dst=Array (dlen, d), di: int} = let val (source, i, l) = CharVectorSlice.base src val len = intAsWord l and offset = intAsWord i val diW = unsignedShortOrRaiseSubscript di in if diW + len > dlen then raise General.Subscript else if System_isShort source (* i.e. length s = 1 *) then (* Single character strings are represented by the character so we just need to insert the character into the array. *) System_setbA(d, diW + offset, vecAsChar source) (* The source is represented by a string whose first word is the length. *) else System_move_bytesA(RunCall.unsafeCast source, offset + wordSize, d, diW, len) end end (* CharArraySlice *); local (* Install the pretty printer for CharArraySlice.slice *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty _ _ x = PolyML.PrettyString(String.concat["\"", CharArraySlice.vector x, "\""]) in val _ = PolyML.addPrettyPrinter pretty end structure CharVector: MONO_VECTOR = String structure String: STRING = String structure Char: CHAR = Char end; (* Values available unqualified at the top level. *) val ord : char -> int = Char.ord val chr : int -> char = Char.chr val concat : string list -> string =String.concat val implode : char list -> string = String.implode val explode : string -> char list = String.explode val substring : string * int * int -> string = String.substring; val op ^ : string * string -> string = String.^; type substring = Substring.substring; (* These are declared in the prelude. *) (* val size : string -> int = String.size val str : char -> string = String.str *) polyml-5.6/basis/StringCvt.sml000066400000000000000000000154301265146633400164560ustar00rootroot00000000000000(* Title: Standard Basis Library: StringCvt Structure Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change required. *) signature STRING_CVT = sig datatype radix = BIN | OCT | DEC | HEX datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option val padLeft : char -> int -> string -> string val padRight : char -> int -> string -> string val splitl : (char -> bool) -> (char, 'a) reader ->'a -> (string * 'a) val takel : (char -> bool) -> (char, 'a) reader ->'a -> string val dropl : (char -> bool) -> (char, 'a) reader ->'a -> 'a val skipWS : (char, 'a) reader -> 'a -> 'a type cs val scanString : ((char, cs) reader -> ('a, cs) reader) -> string -> 'a option end; structure StringCvt : STRING_CVT = struct (* Note: Both the String and Char structures use StringCvt.reader . This means that they depend on this structure so we have to put declarations we need for both in LibrarySupport. *) open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open LibrarySupport val chToString: char->string = RunCall.unsafeCast and stringToCh: string->char = RunCall.unsafeCast val System_lock: string -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_setb: string * word * char -> unit = RunCall.run_call3 POLY_SYS_assign_byte; val mem_move: string*word*string*word*word -> unit = RunCall.run_call5 POLY_SYS_move_bytes datatype radix = BIN | OCT | DEC | HEX datatype realfmt = SCI of int option | FIX of int option | GEN of int option | EXACT type ('a, 'b) reader = 'b -> ('a * 'b) option fun padLeft c i s = if i <= 0 (* unsignedShortOrRaiseSize raises Size if i < 0 which isn't right here. *) then s else let val len: word = sizeAsWord s val iW = unsignedShortOrRaiseSize i (* checks that i is a short. *) in if len >= iW then s else if iW = 0w1 (* and therefore size s = 0 *) then chToString c (* return single character string. *) else let val extra = iW - len val str = allocString iW fun setCh n = if n = extra then () (* Set the character part of the string. *) else ( System_setb(str, n+wordSize, c); setCh(n+0w1) ) in setCh 0w0; (* Copy the character part of the string over. *) if len = 0w1 then System_setb(str, extra + wordSize, stringToCh s) else mem_move(s, wordSize, str, extra + wordSize, len); System_lock str; str end end fun padRight c i s = if i <= 0 (* unsignedShortOrRaiseSize raises Size if i < 0 which isn't right here. *) then s else let val len = sizeAsWord s val iW = unsignedShortOrRaiseSize i (* checks that i is a short. *) in if len >= iW then s else if iW = 0w1 (* and therefore size s = 0 *) then chToString c (* return single character string. *) else let val str = allocString iW fun setCh n = if n = iW then () (* Set the character part of the string. *) else ( System_setb(str, n+wordSize, c); setCh(n+0w1) ) in (* Copy the character part of the string over. *) if len = 0w1 then System_setb(str, wordSize, stringToCh s) else mem_move(s, wordSize, str, wordSize, len); setCh len; System_lock str; str end end (* p is described as a predicate. That implies that it is side-effect free. If it is we could use it e.g. twice, once to work out the length of the string and then to create the string itself. Assume that it may have side-effects and that we can only execute it once. *) local (* We have to define rev here because it isn't defined until we compile List. *) fun rev l [] = l | rev l (a::b) = rev (a::l) b fun split' p f res src = case f src of NONE => (stringImplode(rev [] res), src) (* Not available. *) | SOME (ch, src') => (* Char available *) if p ch then (* It matches - include in the result *) split' p f (ch :: res) src' else (stringImplode(rev [] res), src) (* No match *) in fun splitl p f src = split' p f [] src end (* It may be worth defining takel independently but it doesn't add much overhead by contrast with dropl *) fun takel p f s = #1(splitl p f s) (* fun dropl p f s = #2(splitl p f s) *) (* This is probably as efficient as it can be. *) fun dropl p f src = case f src of NONE => src (* Not available. *) | SOME (ch, src') => (* Char available *) if p ch then dropl p f src' else src (* No match *) (* Copied isSpace from Char structure to avoid circular dependency. *) fun skipWS f src = case f src of NONE => src (* Not available. *) | SOME (ch, src') => (* Char available *) if (#"\t" <= ch andalso ch <= #"\r") orelse ch = #" " then skipWS f src' else src (* No match *) datatype cs = Index of word (* Index into the string. *) fun scanString cvt s = let val len = sizeAsWord s fun rdr (Index i) = if i = len then NONE (* Since we know the index is between 0 and len-1 we can use the unsafe subscript function here. *) else SOME(LibrarySupport.unsafeStringSub(s, i), Index(i+0w1)) in case cvt rdr (Index 0w0) of NONE => NONE | SOME(res, _) => SOME res end end; polyml-5.6/basis/SysWord.sml000066400000000000000000000017601265146633400161460ustar00rootroot00000000000000(* Title: Standard Basis Library: SysWord Structure Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change. *) (* Just defined in terms of LargeWord. *) structure SysWord: WORD = LargeWord; polyml-5.6/basis/Text.sml000066400000000000000000000037401265146633400154600ustar00rootroot00000000000000(* Title: Standard Basis Library: Text Signature and Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated to include CharVectorSlice and CharArraySlice. *) signature TEXT = sig structure Char : CHAR structure String : STRING structure Substring : SUBSTRING structure CharVector : MONO_VECTOR structure CharArray : MONO_ARRAY structure CharVectorSlice: MONO_VECTOR_SLICE structure CharArraySlice : MONO_ARRAY_SLICE sharing type Char.char = String.char = Substring.char = CharVector.elem = CharArray.elem = CharVectorSlice.elem = CharArraySlice.elem sharing type Char.string = String.string = Substring.string = CharVector.vector = CharArray.vector = CharVectorSlice.vector = CharArraySlice.vector sharing type CharArray.array = CharArraySlice.array sharing type CharVectorSlice.slice = CharArraySlice.vector_slice end; structure Text : TEXT = struct structure Char = Char structure String = String structure Substring = Substring structure CharVector = CharVector structure CharArray = CharArray structure CharVectorSlice = CharVectorSlice structure CharArraySlice = CharArraySlice end; polyml-5.6/basis/TextIO.sml000066400000000000000000000375121265146633400157140ustar00rootroot00000000000000(* Title: Standard Basis Library: Text IO Copyright David C.J. Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. It's possible that there are subtleties that haven't been addressed. *) signature TEXT_STREAM_IO = sig include STREAM_IO where type vector = CharVector.vector where type elem = Char.char val inputLine : instream -> (string * instream) option val outputSubstr : outstream * Substring.substring -> unit end; signature TEXT_IO = sig (* include IMPERATIVE_IO *) structure StreamIO : TEXT_STREAM_IO where type reader = TextPrimIO.reader where type writer = TextPrimIO.writer where type pos = TextPrimIO.pos type vector = StreamIO.vector type elem = StreamIO.elem type instream type outstream val input : instream -> vector val input1 : instream -> elem option val inputN : instream * int -> vector val inputAll : instream -> vector val canInput : instream * int -> int option val lookahead : instream -> elem option val closeIn : instream -> unit val endOfStream : instream -> bool val output : outstream * vector -> unit val output1 : outstream * elem -> unit val flushOut : outstream -> unit val closeOut : outstream -> unit val mkInstream : StreamIO.instream -> instream val getInstream : instream -> StreamIO.instream val setInstream : instream * StreamIO.instream -> unit val mkOutstream : StreamIO.outstream -> outstream val getOutstream : outstream -> StreamIO.outstream val setOutstream : outstream * StreamIO.outstream -> unit val getPosOut : outstream -> StreamIO.out_pos val setPosOut : outstream * StreamIO.out_pos -> unit (* End of include IMPERATIVE_IO *) val inputLine : instream -> string option val outputSubstr : outstream * Substring.substring -> unit val openIn : string -> instream val openOut : string -> outstream val openAppend : string -> outstream val openString : string -> instream val stdIn : instream val stdOut : outstream val stdErr : outstream val print : string -> unit val scanStream : ((Char.char, StreamIO.instream) StringCvt.reader -> ('a, StreamIO.instream) StringCvt.reader) -> instream -> 'a option end; structure TextIO :> TEXT_IO = struct open IO type vector = String.string and elem = Char.char exception Interrupt = RunCall.Interrupt (* Called after any exception in the lower level reader or writer to map any exception other than Io into Io. *) fun mapToIo (io as Io _, _, _) = io | mapToIo (Interrupt, _, _) = Interrupt | mapToIo (nonIo, name, caller) = Io { name = name, function = caller, cause = nonIo } (* Functional IO Layer. *) structure TextStreamIO = struct structure BasicTextStreamIO = BasicStreamIO( structure PrimIO = TextPrimIO structure Vector = CharVector structure Array = CharArray structure VectorSlice = CharVectorSlice structure ArraySlice = CharArraySlice val someElem : PrimIO.elem = #" " ); open BasicTextStreamIO (* Input a line. Adds a newline if the file ends without one. *) fun inputLine f = let (* Read a sequence of blocks until we get a newline or EOF. *) fun inputBlocks read f = let (* Read the next block and see how big it is. *) val (blk, f') = input f val length = String.size blk (* See if it contains a newline and if so where. *) fun newlinePos i = if i = length then length+1 else if String.sub(blk, i) = #"\n" then i+1 (* Return characters including newline. *) else newlinePos (i+1) val nlPos = newlinePos 0 in if length = 0 (* EOF *) then ( (* If we have not read anything at all we return NONE otherwise return what we had with a newline added. *) case read of [] => NONE | _ => SOME(String.concat(List.rev("\n"::read)), f) ) else if nlPos > length then inputBlocks (blk::read) f' (* No newline - get another block.. *) else (* The string we read included a newline. *) let (* Reread all up to and including the newline and return the stream which gives us the rest. *) val (b, f') = inputN(f, nlPos) in SOME(String.concat(List.rev(b::read)), f') end end in (* If we are at end-of-stream we return NONE. Since this is a functional stream that means we will always return NONE for a given f (i.e. there's no temporary end-of-stream to be cleared). *) inputBlocks [] f end (* StreamIO treats line buffering on output as block buffering since it has no concept of a line separator. *) fun output(f, v) = case getBufferMode f of LINE_BUF => let val vecLen = CharVector.length v (* Find the last newline character in the string. *) fun lastNewline 0 = 0 | lastNewline i = if CharVector.sub(v, i-1) = #"\n" then i else lastNewline(i-1) val newLinePos = lastNewline vecLen in if newLinePos = 0 then (* No newlines in it. *) BasicTextStreamIO.output(f, v) else (* There's at least one newline. *) ( outputVec(f, CharVectorSlice.slice(v, 0, SOME newLinePos)); flushOut f; outputVec(f, CharVectorSlice.slice(v, newLinePos, NONE)) ) end | _ => BasicTextStreamIO.output(f, v) (* Not line buffering. *) (* This could be defined in terms of output but the underlying output1 function is likely to be more efficient. *) fun output1(f, c) = ( BasicTextStreamIO.output1(f, c); if c = #"\n" andalso getBufferMode f = LINE_BUF then flushOut f else () ) end (* StreamIO. *) (* The imperative IO streams *) structure ImpIO = BasicImperativeIO( structure StreamIO = TextStreamIO structure Vector = CharVector structure Array = CharArray) open ImpIO (* Now define StreamIO as our extended StreamIO *) (* Replace the StreamIO from ImpIO by our version. *) structure StreamIO = struct open TextStreamIO val outputSubstr = outputVec end open Thread.Thread open Thread.Mutex open RuntimeCalls LibrarySupport.CharArray type fileDescr = OS.IO.iodesc; type address = LibrarySupport.address (* We have to declare doIo separately depending on the types of the arguments. It's possible to get round this but that would result in an extra call to run_call3 for each io call. *) local val doIo: int*int*string -> fileDescr = RunCall.run_call3 POLY_SYS_io_dispatch in val stdInDesc: fileDescr = doIo(0, 0, "") fun sys_open_in_text name = doIo(3, 0, name) and sys_open_out_text name = doIo(5, 0, name) and sys_open_append_text name = doIo(13, 0, name) end local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_get_buffsize (strm: fileDescr): int = doIo(15, strm, 0) end (* Create the primitive IO functions and add the higher layers. *) fun wrapInFileDescr(n, name) = let val textPrimRd = LibraryIOSupport.wrapInFileDescr{fd=n, name=name, initBlkMode=true} val streamIo = StreamIO.mkInstream(textPrimRd, "") in ImpIO.mkInstream streamIo end fun wrapOutFileDescr(n, name, buffering, isAppend) = let val buffSize = sys_get_buffsize n val textPrimWr = LibraryIOSupport.wrapOutFileDescr{fd=n, name=name, appendMode=isAppend, initBlkMode=true, chunkSize=buffSize} (* Construct a stream. *) val streamIo = StreamIO.mkOutstream(textPrimWr, buffering) in mkOutstream streamIo end (* Open a file for output. *) fun openOut s = let val f = sys_open_out_text s handle exn => raise mapToIo(exn, s, "TextIO.openOut") (* Look at the stream to see what kind of buffering to use. *) val k = OS.IO.kind f in wrapOutFileDescr (f, s, if k = OS.IO.Kind.tty then IO.LINE_BUF else IO.BLOCK_BUF, false (* Not append *)) end fun openAppend s = let val f = sys_open_append_text s handle exn => raise mapToIo(exn, s, "TextIO.openAppend") val k = OS.IO.kind f in wrapOutFileDescr (f, s, if k = OS.IO.Kind.tty then IO.LINE_BUF else IO.BLOCK_BUF, true (* setPos will not work. *)) end (* Open a file for input. *) fun openIn s = let val f = sys_open_in_text s handle exn => raise mapToIo(exn, s, "TextIO.openIn") in wrapInFileDescr(f, s) end (* Get the entries for standard input, standard output and standard error. *) val stdIn = wrapInFileDescr(stdInDesc, "stdIn") local (* On startup reset stdIn to the original stream. Among other things this clears any data that may have been in the buffer when we exported. *) fun onStartUp () = let val textPrimRd = LibraryIOSupport.wrapInFileDescr{fd=stdInDesc, name="stdIn", initBlkMode=true} val streamIo = StreamIO.mkInstream(textPrimRd, "") in ImpIO.setInstream(stdIn, streamIo) end in (* Set up an onEntry handler so that this is always installed. *) val () = PolyML.onEntry onStartUp end; (* We may want to consider unbuffered output or even linking stdOut with stdIn so that any unbuffered output is flushed before reading from stdIn. That's the way that stdio works to ensure that prompts are written out. *) (* PROBLEM: The following declaration is evaluated when this structure is created, not at the start of the session. The buffering will be set permanently to the buffering in effect at that point. Two solutions are possible. One is to define special versions of the "write" functions to examine the stream whenever they are called and decide whether to change the buffering. Another is simply to set it to unbuffered. That can be changed, though, which may not be satisfactory. *) (* I've changed this from NO_BUF to LINE_BUF which should improve the performance. An alternative might be to set up an "OnEntry" call which would examine the stream and decide what kind of buffering to use. DCJM 1/9/00. *) val stdOut = let val f = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_stdout in wrapOutFileDescr (f, "stdOut", IO.LINE_BUF (* if System_is_term f then IO.LINE_BUF else IO.BLOCK_BUF *), false) end val stdErr = let val f = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_stderr in wrapOutFileDescr (f, "stdErr", IO.NO_BUF (* Defined to be unbuffered. *), false) end local (* This requires access to the underlying representation in order to be able to lock the stream while reading the line. This ensures that if multiple threads are reading lines from a stream each thread will get a complete line. *) fun inputLine' fStream = let val f = ! fStream in case StreamIO.inputLine f of NONE => let (* It's not clear what should happen here. Assume that this clears any temporary EOF. *) val (_, f') = StreamIO.input f in fStream := f'; NONE end | SOME (s, f') => ( fStream := f'; SOME s ) end in fun inputLine s = ImpIO.protect s inputLine' end fun outputSubstr(f, s) = StreamIO.outputSubstr(getOutstream f, s) fun print s = (output(stdOut, s); flushOut stdOut) (* Open a string as an input stream. It would be possible to define this using the string as the argument to mkInstream and a null reader. This way gives more flexibility since it allows for random access to the string. *) fun openString (s: string) : instream = let val stringLength = String.size s val posN = ref 0 (* We can read from the string until it is exhausted. *) fun readVec (len: int): vector = let val l = Int.min(len, stringLength - !posN) val v = String.substring(s, !posN, l) in posN := !posN + l; v end (* Closing it simply exhausts the input. *) fun close () : unit = (posN := stringLength) and avail () : int option = SOME(stringLength - ! posN) and readVecNB l = SOME(readVec l) and block () = () and canInput () = true and getPos () = !posN and setPos n = posN := n and endPos () = stringLength val textPrimRd = TextPrimIO.RD { name = "StringPrimIO", chunkSize = stringLength, (* Most efficient to read the whole string. *) readVec = SOME readVec, readArr = NONE, (* Can be synthesised. *) readVecNB = SOME readVecNB, readArrNB = NONE, (* Can be synthesised. *) block = SOME block, canInput = SOME canInput, avail = avail, getPos = SOME getPos, setPos = SOME setPos, endPos = SOME endPos, verifyPos = SOME getPos, close = close, ioDesc = NONE } val streamIo = StreamIO.mkInstream(textPrimRd, "") in ImpIO.mkInstream streamIo end fun scanStream scanFn strm = let val f = getInstream strm in case (scanFn StreamIO.input1 f) of NONE => NONE | SOME(v, f') => ( setInstream(strm, f'); SOME v ) end end; (* Available unqualified at top-level. *) val print = TextIO.print; polyml-5.6/basis/TextPrimIO.sml000066400000000000000000000036061265146633400165410ustar00rootroot00000000000000(* Title: Standard Basis Library: Primitive Text IO Copyright David C.J. Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* QUESTION: What is the relationship between TextPrimIO and TextIO? Is TextIO.StreamIO.reader supposed to be the same as TextPrimIO.reader and similarly for writer? Assume yes. Yes, in G&R these are explicit*) structure TextPrimIO :> sig include PRIM_IO where type vector = CharVector.vector where type elem = Char.char where type array = CharArray.array where type pos = Position.int where type vector_slice = CharVectorSlice.slice where type array_slice = CharArraySlice.slice end = PrimIO ( structure Array = CharArray structure Vector = CharVector structure ArraySlice = CharArraySlice structure VectorSlice = CharVectorSlice val someElem : Array.elem = #" " (* Initialise to spaces. *) (* BinPrimIO.pos is defined to be Position.int. TextPrimIO.pos may be abstract. It's very convenient to be able to build additional readers and that requires pos to be non-abstract. *) type pos = Position.int val compare = Position.compare ); polyml-5.6/basis/Thread.sml000066400000000000000000001024301265146633400157370ustar00rootroot00000000000000(* Title: Thread package for ML. Author: David C. J. Matthews Copyright (c) 2007-2014 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This signature and structure are not part of the standard basis library but are included here because they depend on the Time structure and are in turn dependencies of the BasicIO structure. *) signature THREAD = sig exception Thread of string (* Raised if an operation fails. *) structure Thread: sig type thread; (* Thread attributes - This may be extended. *) datatype threadAttribute = (* Does this thread accept a broadcast interrupt? The default is not to accept broadcast interrupts. *) EnableBroadcastInterrupt of bool (* How to handle interrupts. The default is to handle interrupts synchronously. *) | InterruptState of interruptState (* Maximum size of the ML stack in words. NONE means unlimited *) | MaximumMLStack of int option and interruptState = InterruptDefer (* Defer any interrupts. *) | InterruptSynch (* Interrupts are delivered synchronously. An interrupt will be delayed until an interruption point. An interruption point is one of: testInterrupt, ConditionVar.wait, ConditionVar.waitUntil and various library calls that may block, such as IO calls, pause etc. N.B. Mutex.lock is not an interruption point even though it can result in a thread blocking for an indefinite period. *) | InterruptAsynch (* Interrupts are delivered asynchronously i.e. at a suitable point soon after they are triggered. *) | InterruptAsynchOnce (* As InterruptAsynch except that only a single interrupt is delivered asynchronously after which the interrupt state is changed to InterruptSynch. It allows a thread to tidy up and if necessary indicate that it has been interrupted without the risk of a second asynchronous interrupt occurring in the handler for the first interrupt. *) (* fork: Fork a thread. Starts a new thread running the function argument. The attribute list gives initial values for thread attributes which can be modified by the thread itself. Any unspecified attributes take default values. The thread is terminated when the thread function returns, if it raises an uncaught exception or if it calls "exit". *) val fork: (unit->unit) * threadAttribute list -> thread (* exit: Terminate this thread. *) val exit: unit -> unit (* isActive: Test if a thread is still running or has terminated. *) val isActive: thread -> bool (* Test whether thread ids are the same. *) val equal: thread * thread -> bool (* Get my own ID. *) val self: unit -> thread exception Interrupt (* = SML90.Interrupt *) (* Send an Interrupt exception to a specific thread. When and indeed whether the exception is actually delivered will depend on the interrupt state of the target thread. Raises Thread if the thread is no longer running, so an exception handler should be used unless the thread is known to be blocked. *) val interrupt: thread -> unit (* Send an interrupt exception to every thread which is set to accept it. *) val broadcastInterrupt: unit -> unit (* If this thread is handling interrupts synchronously, test to see if it has been interrupted. If so it raises the Interrupt exception. *) val testInterrupt: unit -> unit (* Terminate a thread. This should be used as a last resort. Normally a thread should be allowed to clean up and terminate by using the interrupt call. Raises Thread if the thread is no longer running, so an exception handler should be used unless the thread is known to be blocked. *) val kill: thread -> unit (* Get and set thread-local store for the calling thread. The store is a tagged associative memory which is initially empty for a new thread. A thread can call setLocal to add or replace items in its store and call getLocal to return values if they exist. The Universal structure contains functions to make new tags as well as injection, projection and test functions. *) val getLocal: 'a Universal.tag -> 'a option val setLocal: 'a Universal.tag * 'a -> unit (* Change the specified attribute(s) for the calling thread. Unspecified attributes remain unchanged. *) val setAttributes: threadAttribute list -> unit (* Get the values of attributes. *) val getAttributes: unit -> threadAttribute list (* Return the number of processors that will be used to run threads. *) val numProcessors: unit -> int (* and the number of physical processors if that is available. *) and numPhysicalProcessors: unit -> int option end structure Mutex: sig (* Mutexes. A mutex provides simple mutual exclusion. A thread can lock a mutex and until it unlocks it no other thread will be able to lock it. Locking and unlocking are intended to be fast in the situation when there is no other process attempting to lock the mutex. *) type mutex (* mutex: Make a new mutex *) val mutex: unit -> mutex (* lock: Lock a mutex. If the mutex is currently locked the thread is blocked until it is unlocked. If a thread tries to lock a mutex that it has previously locked the thread will deadlock. N.B. "lock" is not an interruption point (a point where synchronous interrupts are delivered) even though a thread can be blocked indefinitely. *) val lock: mutex -> unit (* unlock: Unlock a mutex and allow any waiting threads to run. The behaviour if the mutex was not previously locked by the calling thread is undefined. *) val unlock: mutex -> unit (* trylock: Attempt to lock the mutex. Returns true if the mutex was not previously locked and has now been locked by the calling thread. Returns false if the mutex was previously locked, including by the calling thread. *) val trylock: mutex -> bool (* These functions may not work correctly if an asynchronous interrupt is delivered during the calls. A thread should use synchronous interrupt when using these calls. *) end structure ConditionVar: sig (* Condition variables. Condition variables are used to provide communication between threads. A condition variable is used in conjunction with a mutex and usually a reference to establish and test changes in state. The normal use is for one thread to lock a mutex, test the reference and then wait on the condition variable, releasing the lock on the mutex while it does so. Another thread may then lock the mutex, update the reference, unlock the mutex, and signal the condition variable. This wakes up the first thread and reacquires the lock allowing the thread to test the updated reference with the lock held. More complex communication mechanisms, such as blocking channels, can be written in terms of condition variables. *) type conditionVar (* conditionVar: Make a new condition variable. *) val conditionVar: unit -> conditionVar (* wait: Release the mutex and block until the condition variable is signalled. When wait returns the mutex has been re-acquired. If thread is handling interrupts synchronously a call to "wait" may cause an Interrupt exception to be delivered. (The implementation must ensure that if an Interrupt is delivered as well as signal waking up a single thread that the interrupted thread does not consume the "signal".) The mutex is (re)acquired before Interrupt is delivered. *) val wait: conditionVar * Mutex.mutex -> unit (* waitUntil: As wait except that it blocks until either the condition variable is signalled or the time (absolute) is reached. Either way the mutex is reacquired so there may be a further delay if it is held by another thread. *) val waitUntil: conditionVar * Mutex.mutex * Time.time -> bool (* signal: Wake up one thread if any are waiting on the condition variable. *) val signal: conditionVar -> unit (* broadcast: Wake up all threads waiting on the condition variable. *) val broadcast: conditionVar -> unit end end; structure Thread :> THREAD = struct open RuntimeCalls (* for POLY_SYS and EXC numbers *) exception Thread = RunCall.Thread (* Create non-overwritable mutables for mutexes and condition variables. A non-overwritable mutable in the executable or a saved state is not overwritten when a saved state further down the hierarchy is loaded. *) val nvref = LibrarySupport.noOverwriteRef structure Thread = struct datatype threadAttribute = EnableBroadcastInterrupt of bool | InterruptState of interruptState | MaximumMLStack of int option and interruptState = InterruptDefer | InterruptSynch | InterruptAsynch | InterruptAsynchOnce (* Convert attributes to bits and a mask. *) fun attrsToWord (at: threadAttribute list): Word.word * Word.word = let (* Check that a particular attribute appears only once. As well as accumulating the actual bits in the result we also accumulate the mask of bits. If any of these reappear we raise an exception. *) fun checkRepeat(r, acc, set, mask) = if Word.andb(set, mask) <> 0w0 then raise Thread "The same attribute appears more than once in the list" else convert(r, acc, Word.orb(set, mask)) and convert([], acc, set) = (acc, set) | convert(EnableBroadcastInterrupt true :: r, acc, set) = checkRepeat(r, Word.orb(acc, 0w1), set, 0w1) | convert(EnableBroadcastInterrupt false :: r, acc, set) = checkRepeat(r, acc (* No bit *), set, 0w1) | convert(InterruptState s :: r, acc, set) = checkRepeat(r, Word.orb(setIstateBits s, acc), set, 0w6) | convert(MaximumMLStack _ :: r, acc, set) = convert(r, acc, set) in convert(at, 0w0, 0w0) end and setIstateBits InterruptDefer = 0w0 | setIstateBits InterruptSynch = 0w2 | setIstateBits InterruptAsynch = 0w4 | setIstateBits InterruptAsynchOnce = 0w6 fun getIstateBits(w: Word.word): interruptState = let val ibits = Word.andb(w, 0w6) in if ibits = 0w0 then InterruptDefer else if ibits = 0w2 then InterruptSynch else if ibits = 0w4 then InterruptAsynch else InterruptAsynchOnce end fun wordToAttrs w = let (* Enable broadcast - true if bottom bit is set. *) val bcast = EnableBroadcastInterrupt(Word.andb(w, 0w1) = 0w1) in [bcast, InterruptState(getIstateBits w)] end exception Interrupt = RunCall.Interrupt (* The thread id is opaque outside this structure but is actually a six word mutable object. Word 0: Index into thread table (used inside the RTS only) Word 1: Flags: initialised by the RTS and set by this code Word 2: Thread local store: read and set by this code. Word 3: IntRequest: Set by the RTS if there is an interrupt pending Word 4: Maximum ML stack size. Unlimited is stored here as zero *) val threadIdFlags = 0w1 and threadIdThreadLocal = 0w2 and threadIdIntRequest = 0w3 and threadIdStackSize = 0w4 type thread = Word.word ref (* Actually this is a multi-word mutable object. *) (* Equality is pointer equality. *) val equal : thread*thread->bool = RunCall.run_call2 POLY_SYS_word_eq (* Return our own thread object. *) val self: unit->thread = RunCall.run_call0 POLY_SYS_thread_self fun getLocal (t: 'a Universal.tag) : 'a option = let val root: Universal.universal ref list = RunCall.run_call2 POLY_SYS_load_word(self(), threadIdThreadLocal) fun doFind [] = NONE | doFind ((ref v)::r) = if Universal.tagIs t v then SOME(Universal.tagProject t v) else doFind r in doFind root end fun setLocal (t: 'a Universal.tag, newVal: 'a) : unit = let (* See if we already have this in the list. *) val root: Universal.universal ref list = RunCall.run_call2 POLY_SYS_load_word(self(), threadIdThreadLocal) fun doFind [] = (* Not in the list - Add it. *) RunCall.run_call3 POLY_SYS_assign_word (self(), threadIdThreadLocal, ref (Universal.tagInject t newVal) :: root) | doFind (v::r) = if Universal.tagIs t (!v) (* If it's in the list update it. *) then v := Universal.tagInject t newVal else doFind r in doFind root end local val doCall: int*unit->unit = RunCall.run_call2 POLY_SYS_thread_dispatch in fun testInterrupt() = (* If there is a pending request the word in the thread object will be non-zero. *) if RunCall.run_call2 POLY_SYS_load_word(self(), threadIdIntRequest) <> 0 then doCall(11, ()) else () end local fun getAttrWord (me: thread) : Word.word = RunCall.run_call2 POLY_SYS_load_word(me, threadIdFlags) (* Just for the moment we check the length of the thread ID to be sure we have the appropriate fields present. *) val System_length: thread -> word = RunCall.run_call1 POLY_SYS_get_length fun getStackSizeAsInt (me: thread) : int = if System_length me <= threadIdStackSize then 0 else RunCall.run_call2 POLY_SYS_load_word(me, threadIdStackSize) and getStackSize me : int option = case getStackSizeAsInt me of 0 => NONE | s => SOME s fun newStackSize ([], default) = default | newStackSize (MaximumMLStack NONE :: _, _) = 0 | newStackSize (MaximumMLStack (SOME n) :: _, _) = if n <= 0 then raise Thread "The stack size must be greater than zero" else n | newStackSize (_ :: l, default) = newStackSize (l, default) in (* Set attributes. Only changes the values that are specified. The others remain the same. *) fun setAttributes (attrs: threadAttribute list) : unit = let val me = self() val oldValues: Word.word = getAttrWord me val (newValue, mask) = attrsToWord attrs val stack = newStackSize(attrs, getStackSizeAsInt me) in RunCall.run_call3 POLY_SYS_assign_word (self(), threadIdFlags, Word.orb(newValue, Word.andb(Word.notb mask, oldValues))); if stack = getStackSizeAsInt me then () else RunCall.run_call2 POLY_SYS_thread_dispatch (15, stack); (* If we are now handling interrupts asynchronously check whether we have a pending interrupt now. This will only be effective if we were previously handling them synchronously or blocking them. *) if Word.andb(newValue, 0w4) = 0w4 then testInterrupt() else () end fun getAttributes() : threadAttribute list = let val me = self() in MaximumMLStack (getStackSize me) :: wordToAttrs(getAttrWord me) end (* These are used in the ConditionVar structure. They affect only the interrupt handling bits. *) fun getInterruptState(): interruptState = getIstateBits(getAttrWord(self())) and setInterruptState(s: interruptState): unit = RunCall.run_call3 POLY_SYS_assign_word (self(), threadIdFlags, Word.orb(setIstateBits s, Word.andb(Word.notb 0w6, getAttrWord(self())))) local (* The default for a new thread is to ignore broadcasts and handle explicit interrupts synchronously. *) val (defaultAttrs, _) = attrsToWord[EnableBroadcastInterrupt false, InterruptState InterruptSynch] val doCall = RunCall.run_call2 POLY_SYS_thread_dispatch in fun fork(f:unit->unit, attrs: threadAttribute list): thread = let (* Any attributes specified explicitly override the defaults. *) val (attrWord, mask) = attrsToWord attrs val attrValue = Word.orb(attrWord, Word.andb(Word.notb mask, defaultAttrs)) val stack = newStackSize(attrs, 0 (* Default is unlimited *)) in doCall(7, (f, attrValue, stack)) end end end val exit: unit -> unit = RunCall.run_call0 POLY_SYS_kill_self local val doCall: int*thread->bool = RunCall.run_call2 POLY_SYS_thread_dispatch in fun isActive(t: thread): bool = doCall(8, t) end local val doCall: int*unit->unit = RunCall.run_call2 POLY_SYS_thread_dispatch in fun broadcastInterrupt() = doCall(10, ()) end local val doCall: int*thread->unit = RunCall.run_call2 POLY_SYS_thread_dispatch in fun kill(t: thread) = doCall(12, t) and interrupt(t: thread) = doCall(9, t) end local val doCall = RunCall.run_call2 POLY_SYS_thread_dispatch in fun numProcessors():int = doCall(13, 0) and numPhysicalProcessors(): int option = (* It is not always possible to get this information *) case doCall(14, 0) of 0 => NONE | n => SOME n end end structure Mutex = struct type mutex = Word.word ref fun mutex() = nvref 0w1; (* Initially unlocked. *) val atomicIncr: Word.word ref -> Word.word = RunCall.run_call1 POLY_SYS_atomic_incr and atomicDecr: Word.word ref -> Word.word = RunCall.run_call1 POLY_SYS_atomic_decr and atomicReset: Word.word ref -> unit = RunCall.run_call1 POLY_SYS_atomic_reset val doCall: int * mutex -> unit = RunCall.run_call2 POLY_SYS_thread_dispatch (* A mutex is implemented as a Word.word ref. It is initially set to 1 and locked by atomically decrementing it. If it was previously unlocked the result will by zero but if it was already locked it will be some negative value. When it is unlocked it is atomically incremented. If there was no contention the result will again be 1 but if some other thread tried to lock it the result will be zero or negative. In that case the unlocking thread needs to call in to the RTS to wake up the blocked thread. The cost of contention on the lock is very high. To try to avoid this we first loop (spin) to see if we can get the lock without contention. *) val spin_cycle = 20000 fun spin (m: mutex, c: int) = if ! m = 0w1 then () else if c = spin_cycle then () else spin(m, c+1); fun lock (m: mutex): unit = let val () = spin(m, 0) val newValue = atomicDecr m in if newValue = 0w0 then () (* We've acquired the lock. *) else (* It's locked. We return when we have the lock. *) ( doCall(1, m); lock m (* Try again. *) ) end fun unlock (m: mutex): unit = let val newValue = atomicIncr m in if newValue = 0w1 then () (* No contention. *) else (* Another thread has blocked and we have to release it. We can safely set the value to 1 here to release the lock. If another thread acquires it before we have woken up the other threads that's fine. Equally, if another thread decremented the count and saw it was still locked it will enter the RTS and try to acquire the lock there. It's probably better to reset it here rather than within the RTS since it allows another thread to acquire the lock immediately rather than after the rather long process of entering the RTS. Resetting this needs to be atomic with respect to atomic increment and decrement. That's not a problem on X86 so a simple assignment is sufficient but in the interpreter at least it's necessary to acquire a lock. *) ( atomicReset m; doCall(2, m) ) end (* Try to lock the mutex. If it was previously unlocked then lock it and return true otherwise return false. Because we don't block here there is the possibility that the thread that has locked it could release the lock shortly afterwards. The check for !m = 0w1 is an optimisation and nearly all the time it avoids the call to atomicDecr setting m to a negative value. There is a small chance that another thread could lock the mutex between the test for !m = 0w1 and the atomicDecr. In that case the atomicDecr would return a negative value and the function that locked the mutex will have to call into the RTS to reset it when it is unlocked. *) fun trylock (m: mutex): bool = if !m = 0w1 andalso atomicDecr m = 0w0 then true (* We've acquired the lock. *) else false (* The lock was taken. *) end structure ConditionVar = struct open Thread (* A condition variable contains a lock and a list of suspended threads. *) type conditionVar = { lock: Mutex.mutex, threads: thread list ref } fun conditionVar(): conditionVar = { lock = Mutex.mutex(), threads = nvref nil } (* To avoid duplicating the code we use zero to represent an infinite wait. Since that's a valid time in the past we check that it isn't used in waitUntil before doing anything else. *) val infinity = Time.zeroTime; local val doCall = RunCall.run_call2 POLY_SYS_thread_dispatch fun Sleep(mt: Mutex.mutex * Time.time): unit = doCall(3, mt) in fun innerWait({lock, threads}: conditionVar, m: Mutex.mutex, t: Time.time) : bool = let val me = self() (* My thread id. *) fun waitAgain() = let fun doFind [] = false | doFind(h::t) = equal(h, me) orelse doFind t fun removeThis [] = raise Fail "Thread missing in list" | removeThis (h::t) = if equal(h, me) then t else h :: removeThis t val () = Sleep(lock, t) (* Atomically release the lock and wait. *) val () = Mutex.lock lock (* Get the lock again. *) (* Are we still on the list? If so we haven't been explicitly woken up. We've either timed out, been interrupted or simply returned because the RTS needed to process some asynchronous results. *) val stillThere = doFind(!threads) open Time (* For >= *) in if not stillThere then (* We're done. *) ( Mutex.unlock lock; true ) else if t <> infinity andalso Time.now() >= t then (* We've timed out. *) ( threads := removeThis(! threads); Mutex.unlock lock; false ) else ( (* See if we've been interrupted. If so remove ourselves and exit. *) testInterrupt() handle exn => (threads := removeThis(! threads); Mutex.unlock lock; raise exn); (* Otherwise just keep waiting. *) waitAgain() ) end in Mutex.lock lock; (* Lock the internal mutex. *) Mutex.unlock m; (* Unlock the external mutex *) threads := me :: !threads; (* Add ourselves to the list. *) waitAgain() (* Wait and return the result when we're done. *) end fun doWait(c: conditionVar, m: Mutex.mutex, t: Time.time) : bool = let val originalIntstate = getInterruptState() (* Set this to handle interrupts synchronously unless we're already ignoring them. *) val () = if originalIntstate = InterruptDefer then () else setInterruptState InterruptSynch; (* Wait for the condition. If it raises an exception we still need to reacquire the lock unless we were handling interrupts asynchronously. *) val result = innerWait(c, m, t) handle exn => ( (* We had an exception. If we were handling exceptions synchronously we reacquire the lock. If it was set to InterruptAsynchOnce this counts as a single asynchronous exception and we restore the state as InterruptSynch. *) case originalIntstate of InterruptDefer => (* Shouldn't happen? *) Mutex.lock m | InterruptSynch => Mutex.lock m | InterruptAsynch => setInterruptState InterruptAsynch | InterruptAsynchOnce => setInterruptState InterruptSynch; raise exn (* Reraise the exception*) ) in (* Restore the original interrupt state first. *) setInterruptState originalIntstate; (* Normal return. Reacquire the lock before returning. *) Mutex.lock m; result end fun wait(c: conditionVar, m: Mutex.mutex) : unit = (doWait(c, m, infinity); ()) and waitUntil(c: conditionVar, m: Mutex.mutex, t: Time.time) : bool = if t = infinity then false (* This has already happened. *) else doWait(c, m, t) end local val doCall = RunCall.run_call2 POLY_SYS_thread_dispatch (* This call wakes up the specified thread. If the thread has already been interrupted and is not ignoring interrupts it returns false. Otherwise it wakes up the thread and returns true. We have to use this because we define that if a thread is interrupted before it is signalled then it raises Interrupt. *) fun doWake(t: thread): bool = doCall(4, t) (* Wake a single thread if we can (signal). *) fun wakeOne [] = [] | wakeOne (thread::rest) = if doWake thread then rest else thread :: wakeOne rest (* Wake all threads (broadcast). *) fun wakeAll [] = [] (* Always returns the empty list. *) | wakeAll (thread::rest) = (doWake thread; wakeAll rest) fun signalOrBroadcast({lock, threads}: conditionVar, wakeThreads) : unit = let val originalState = getInterruptState() in (* Set this to handle interrupts synchronously unless we're already ignoring them. We need to do this to avoid an asynchronous interrupt which could leave the internal lock in an inconsistent state. *) if originalState = InterruptDefer then () else setInterruptState InterruptSynch; (* Get the condition var lock. *) Mutex.lock lock; threads := wakeThreads(! threads); Mutex.unlock lock; setInterruptState originalState; (* Restore original state. *) (* Test if we were interrupted while we were handling interrupts synchronously. *) if originalState = InterruptAsynch orelse originalState = InterruptAsynchOnce then testInterrupt() else () end in fun signal cv = signalOrBroadcast(cv, wakeOne) and broadcast cv = signalOrBroadcast(cv, wakeAll) end end end; structure ThreadLib: sig val protect: Thread.Mutex.mutex -> ('a -> 'b) -> 'a -> 'b end = struct (* This applies a function while a mutex is being held. Although this can be defined in terms of Thread.Thread.getAttributes it's defined here using the underlying calls. The original version with getAttributes appeared as a major allocation hot-spot when building the compiler because "protect" is called round every access to the global name-space. *) fun protect m f a = let open Thread.Thread Thread.Mutex open RuntimeCalls Word (* Set this to handle interrupts synchronously except if we are blocking them. We don't want to get an asynchronous interrupt while we are actually locking or unlocking the mutex but if we have to block to do IO then we should allow an interrupt at that point. *) val oldAttrs: Word.word = RunCall.run_call2 POLY_SYS_load_word(self(), 1) val () = if andb(oldAttrs, 0w6) = 0w0 (* Already deferred? *) then () else RunCall.run_call3 POLY_SYS_assign_word (self(), 1, orb(andb(notb 0w6, oldAttrs), 0w4)) fun restoreAttrs() = ( RunCall.run_call3 POLY_SYS_assign_word (self(), 1, oldAttrs); if andb(oldAttrs, 0w4) = 0w4 then testInterrupt() else () ) val () = lock m val result = f a handle exn => ( unlock m; restoreAttrs(); (* Reraise the exception preserving the location information. *) PolyML.Exception.reraise exn ) in unlock m; restoreAttrs(); result end end; local fun prettyMutex _ _ (_: Thread.Mutex.mutex) = PolyML.PrettyString "?" and prettyThread _ _ (_: Thread.Thread.thread) = PolyML.PrettyString "?" and prettyCondVar _ _ (_: Thread.ConditionVar.conditionVar) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyMutex and () = PolyML.addPrettyPrinter prettyThread and () = PolyML.addPrettyPrinter prettyCondVar end; polyml-5.6/basis/Time.sml000066400000000000000000000210171265146633400154270ustar00rootroot00000000000000(* Title: Standard Basis Library: Time Signature and structure. Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. *) signature TIME = sig eqtype time exception Time val zeroTime : time val fromReal : LargeReal.real -> time val toReal : time -> LargeReal.real val toSeconds : time -> LargeInt.int val toMilliseconds : time -> LargeInt.int val toMicroseconds : time -> LargeInt.int val toNanoseconds : time -> LargeInt.int val fromSeconds : LargeInt.int -> time val fromMilliseconds : LargeInt.int -> time val fromMicroseconds : LargeInt.int -> time val fromNanoseconds : LargeInt.int -> time val + : time * time -> time val - : time * time -> time val compare : time * time -> General.order val < : time * time -> bool val <= : time * time -> bool val > : time * time -> bool val >= : time * time -> bool val now : unit -> time val fmt : int -> time -> string val toString : time -> string val fromString : string -> time option val scan : (char, 'a) StringCvt.reader -> (time, 'a) StringCvt.reader end; structure Time :> TIME = struct (* Unix and Windows both use 64 bit quantities for times. Windows uses a 64-bit number of 100ns ticks, Unix uses one word of seconds and another of microseconds. To handle both easily we use a single arbitrary precision number for times with the actual resolution returned as an RTS call. The intention is retain as much precision as possible. *) type time = int (* Becomes abstract *) exception Time open RuntimeCalls val doTiming: int*int->int = RunCall.run_call2 POLY_SYS_timing_dispatch fun callTiming (code: int) args = doTiming (code,args); (* Get the number of ticks per microsecond and compute the corresponding values for milliseconds and seconds. *) val ticksPerMicrosecond = callTiming 0 0 val ticksPerMillisecond = ticksPerMicrosecond * 1000 val ticksPerSecond = ticksPerMillisecond * 1000 (* Check for very large time values. These cause problems if converted to dates. *) local val Years100000 = ticksPerSecond*60*60*24*365*100000 in fun checkTimeValue t = if t < ~ Years100000 orelse t > Years100000 then raise Time else t end; (* The real representation is as a number of seconds. *) local val realTicks = Real.fromInt ticksPerSecond in fun fromReal (x: real): time = checkTimeValue(Real.round (x * realTicks)) and toReal (t: time): real = Real.fromInt t / realTicks end val zeroTime = fromReal 0.0 (* Convert to seconds, etc.*) fun toSeconds x = x div ticksPerSecond and toMilliseconds x = x div ticksPerMillisecond and toMicroseconds x = x div ticksPerMicrosecond and toNanoseconds x = x * 1000 div ticksPerMicrosecond (* Convert from the integer representations. *) fun fromSeconds i = checkTimeValue(i * ticksPerSecond) and fromMilliseconds i = checkTimeValue(i * ticksPerMillisecond) and fromMicroseconds i = checkTimeValue(i * ticksPerMicrosecond) and fromNanoseconds i = checkTimeValue(i * ticksPerMicrosecond div 1000) (* Format as a fixed precision number. if n < 0 treat as n = 0. *) fun fmt n r = Real.fmt (StringCvt.FIX(SOME(Int.max(n, 0)))) (toReal r) val toString = fmt 3 (* The scanned string is a subset of the format of a real number. It does not have an exponent. At present we convert it as a real number but it would probably be better to treat it as an integer. *) fun scan getc src = let (* Return a list of digits. *) fun getdigits inp src = case getc src of NONE => (List.rev inp, src) | SOME(ch, src') => if ch >= #"0" andalso ch <= #"9" then getdigits ((Char.ord ch - Char.ord #"0") :: inp) src' else (List.rev inp, src) fun read_number sign src = case getc src of NONE => NONE | SOME(ch, _) => if not (ch >= #"0" andalso ch <= #"9" orelse ch = #".") then NONE (* Bad "*) else (* Digits or decimal. *) let (* Get the digits before the decimal point (if any) *) val (intPart, src'') = getdigits [] src (* Get the digits after the decimal point (if any). If there is a decimal point we swallow the decimal only if there is at least one digit after it. *) val (decPart, srcAfterMant) = case getc src'' of SOME (#".", src''') => ( (* Check that the next character is a digit. *) case getc src''' of NONE => ([], src'') | SOME(ch, _) => if ch >= #"0" andalso ch <= #"9" then getdigits [] src''' else ([], src'') ) | _ => ([], src'') in case (intPart, decPart) of ([], []) => NONE (* Must have a digit either before or after the dp. *) | _ => let (* Get exactly 9 digits after the decimal point. *) val decs = intPart @ (List.take(decPart @ [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 9)); (* It's now in nanoseconds. *) val toInt = List.foldl (fn (i, j) => i + j*10) 0 decs in SOME(fromNanoseconds(if sign then ~toInt else toInt), srcAfterMant) end end in case getc src of NONE => NONE | SOME(ch, src') => if Char.isSpace ch (* Skip white space. *) then scan getc src' (* Recurse *) else if ch = #"+" (* Remove the + sign *) then read_number false src' else if ch = #"-" orelse ch = #"~" then read_number true src' else (* See if it's a valid digit or decimal point. *) read_number false src end val fromString = StringCvt.scanString scan (* Use the integer operations for these. *) val op < : (time * time) -> bool = Int.< val op <= : (time * time) -> bool = Int.<= val op > : (time * time) -> bool = Int.> val op >= : (time * time) -> bool = Int.>=; val compare = Int.compare val op + : (time * time) -> time = Int.+ val op - : (time * time) -> time = Int.- fun now () = callTiming 1 0 handle RunCall.SysErr _ => raise Time end; local (* Install the pretty printer for Time.time. This has to be done outside the structure because of the opaque matching. *) fun pretty _ _ x = PolyML.PrettyString(Time.toString x) in val () = PolyML.addPrettyPrinter pretty (* Add overloads for +, -, <= etc *) (* This is actually non-standard. The basis library documentation does not include Time.time among the types for which these operators are overloaded. *) val () = RunCall.addOverload Time.+ "+"; val () = RunCall.addOverload Time.- "-"; val () = RunCall.addOverload Time.< "<"; val () = RunCall.addOverload Time.> ">"; val () = RunCall.addOverload Time.<= "<="; val () = RunCall.addOverload Time.>= ">="; end polyml-5.6/basis/Timer.sml000066400000000000000000000065361265146633400156220ustar00rootroot00000000000000(* Title: Standard Basis Library: Timer Signature and structure. Author: David Matthews Copyright David Matthews 2000, 2005, 2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. Added checkCPUTimes. *) signature TIMER = sig type cpu_timer type real_timer val startCPUTimer : unit -> cpu_timer val checkCPUTimer : cpu_timer -> {usr : Time.time, sys : Time.time} val checkGCTime : cpu_timer -> Time.time val totalCPUTimer : unit -> cpu_timer val startRealTimer : unit -> real_timer val checkRealTimer : real_timer -> Time.time val totalRealTimer : unit -> real_timer val checkCPUTimes : cpu_timer -> { nongc: { usr : Time.time, sys : Time.time}, gc: { usr : Time.time, sys : Time.time} } end structure Timer :> TIMER = struct type cpu_timer = {userTime: Time.time, sysTime: Time.time, gcUTime: Time.time, gcSTime: Time.time } type real_timer = Time.time local open Time val doCall: int*unit -> Time.time = RunCall.run_call2 RuntimeCalls.POLY_SYS_timing_dispatch fun getUserTime() = doCall(7, ()) and getSysTime() = doCall(8, ()) and getGCUTime() = doCall(9, ()) and getGCSTime() = doCall(13, ()) in fun startCPUTimer () = {userTime=getUserTime(), sysTime=getSysTime(), gcUTime=getGCUTime(), gcSTime=getGCSTime() } and checkCPUTimer ({ userTime, sysTime, ...}: cpu_timer) = { usr = getUserTime() - userTime, sys = getSysTime() - sysTime} and checkGCTime ({ gcUTime, ...}: cpu_timer) = getGCUTime() - gcUTime and totalCPUTimer () = { userTime=Time.zeroTime, sysTime=Time.zeroTime, gcUTime=Time.zeroTime, gcSTime=Time.zeroTime } fun checkCPUTimes (timer as { gcUTime, gcSTime, ... }) = let val { usr, sys } = checkCPUTimer timer val gc_usr = getGCUTime() - gcUTime and gc_sys = getGCSTime() - gcSTime in { gc = { usr = gc_usr, sys = gc_sys }, nongc = { usr = usr-gc_usr, sys = sys-gc_sys } } end fun totalRealTimer() = Time.zeroTime and startRealTimer() = doCall(10, ()) and checkRealTimer t = startRealTimer() - t end end; (* Override the default printer so they're abstract. *) local fun prettyCPUTimer _ _ (_: Timer.cpu_timer) = PolyML.PrettyString "?" and prettyRealTimer _ _ (_: Timer.real_timer) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyCPUTimer and () = PolyML.addPrettyPrinter prettyRealTimer end; polyml-5.6/basis/TopLevelPolyML.552.sml000066400000000000000000002715671265146633400177130ustar00rootroot00000000000000(* Title: Root function for the PolyML structure Author: David Matthews Copyright David Matthews 2009, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This contains the code for the IDE protocol as well as the normal Poly/ML top-level loop. *) local val parseTree = ref ("", []) (* Parsetree ID and parsetrees as a list. *) fun runIDEProtocol () = let (* Save the last parsetree here. *) val lastParsetree = ref (case parseTree of ref(_, hd::_) => SOME hd | _ => NONE) val parseLock = Thread.Mutex.mutex() (* Access the parse tree and other information with the lock held. *) fun withLock f = let open Thread.Thread Thread.Mutex val originalState = getAttributes() val () = setAttributes[InterruptState InterruptDefer] val () = lock parseLock val result = f () val () = unlock parseLock val () = setAttributes originalState in result end type basicLoc = (* Locations in request packets. *) { startOffset: int, endOffset: int } type compileError = { hardError: bool, location: PolyML.location, message: PolyML.pretty } datatype request = (* Requests sent by the IDE to Poly/ML. *) PropertyRequest (* O *) of { requestId: string, parseTreeId: string, location: basicLoc } | MoveRequest (* M *) of { requestId: string, parseTreeId: string, location: basicLoc, direction: direction } | TypeRequest (* T *) of { requestId: string, parseTreeId: string, location: basicLoc } | DecRequest (* I *) of { requestId: string, parseTreeId: string, location: basicLoc, decType: dectype } | RefRequest (* V *) of { requestId: string, parseTreeId: string, location: basicLoc } | CompileRequest (* R *) of { requestId: string, fileName: string, startPosition: int, preludeCode: string, sourceCode: string } | KillRequest (* K *) of { requestId: string } | UnknownRequest (* Provided for upwards compatibility. *) of { request: int, requestId: string} and direction = DirUp | DirLeft | DirRight | DirDown and dectype = DecLocal | DecOpen | DecParent and response = (* Replies sent from Poly/ML to the IDE. *) PropertyResponse (* O *) of { requestId: string, parseTreeId: string, location: basicLoc, commands: string list } | MoveResponse (* M *) of { requestId: string, parseTreeId: string, location: basicLoc } | TypeResponse (* T *) of { requestId: string, parseTreeId: string, location: basicLoc, typeRes: PolyML.pretty option } | DecResponse (* I *) of { requestId: string, parseTreeId: string, location: basicLoc, decLocation: PolyML.location option } | RefResponse (* V *) of { requestId: string, parseTreeId: string, location: basicLoc, references: basicLoc list } | CompilerResponse (* R *) of { requestId: string, parseTreeId: string, finalOffset: int, result: compileResult } | UnknownResponse (* Provided for upwards compatibility. *) of { request: int, requestId: string } and compileResult = Succeeded of compileError list | RuntimeException of PolyML.pretty * compileError list | PreludeFail of string | CompileFail of compileError list | CompileCancelled of compileError list val outputLock = Thread.Mutex.mutex() val (readRequest, sendStartedMessage, sendResponse) = case OS.Process.getEnv "POLYIDESOCKET" of NONE => (* Version 1 protocol - backwards compatibility - use stdIn/stdOut *) let (* Separate out the output stream. We need to interlock access to stdOut to avoid user code outputing within a packet. *) open TextIO TextIO.StreamIO val outStream = getOutstream stdOut val (writer, buffMode) = getWriter outStream val TextPrimIO.WR { name, chunkSize, writeVec, writeArr, block, canOutput, ioDesc, ... } = writer (* Create a version of the stream that locks before actually sending output. *) val lockedWriteVec = case writeVec of NONE => NONE | SOME writeVec => SOME(fn a => ThreadLib.protect outputLock writeVec a) val lockedWriteArray = case writeArr of NONE => NONE | SOME writeArr => SOME(fn a => ThreadLib.protect outputLock writeArr a) val lockedWriter = TextPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = lockedWriteVec, writeArr = lockedWriteArray, writeVecNB = NONE, writeArrNB = NONE, block = block, canOutput = canOutput, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = ioDesc } (* Use this locked version for normal stdOut. *) val () = setOutstream(stdOut, StreamIO.mkOutstream(TextPrimIO.augmentWriter lockedWriter, buffMode)) (* Create an unlocked version for use within the IDE code. When writing to this stream the IDE code will first get a lock, then output the whole packet before releasing the lock. Because mutexes are not recursive we can't use the locking version. *) val unLockedWriter = TextPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = NONE, writeArrNB = NONE, block = block, canOutput = canOutput, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = ioDesc } val inStream = stdIn val outStream = StreamIO.mkOutstream(TextPrimIO.augmentWriter unLockedWriter, buffMode) fun protocolError error = let open OS.Process in TextIO.print ("Protocol error: " ^ error) handle _ => (); exit failure; raise Fail "bad" (* Never called but sets return type as 'a *) end (* Reads a request. Calls OS.Process.exit at end-of-file or on a protocol error. *) fun readRequest (): request = let open TextIO (* Returns the string as far as the next ESC and the terminator. *) fun readToEscape (soFar: string, terminator) : string = case input1 inStream of SOME #"\u001b" => ( case input1 inStream of NONE => protocolError "End of file" | SOME ch => if ch = terminator then soFar else if ch = #"\u001b" (* Escaped ESC. *) then readToEscape(soFar ^ str #"\u001b", terminator) else protocolError(str ch ^ " not " ^ str terminator) ) | SOME ch => readToEscape(soFar ^ str ch, terminator) | NONE => protocolError "End of file" (* Parse an integer. Returns zero if it isn't a valid int. *) fun getInt termCh : int = case Int.fromString (readToEscape("", termCh)) of NONE => 0 | SOME i => i val () = case input1 inStream of NONE => OS.Process.exit OS.Process.success (* Close down. *) | SOME #"\u001b" => () (* Escape- start of packet. *) | SOME ch => protocolError(str ch ^ " not ESCAPE at start of packet") val startCh = (* Request code *) case input1 inStream of NONE => protocolError "End of file" | SOME ch => ch in case startCh of #"R" => let (* Compile request. *) (* Begin a new compilation. *) val requestId = readToEscape("", #",") val fileName = readToEscape("", #",") val startPosition = getInt #"," (* The next two are the lengths *) val preludeLength = getInt #"," val sourceLength = getInt #"," (* *) val preludeCode = TextIO.inputN(inStream, preludeLength) val _ = readToEscape("", #",") (* Should be empty - check? *) val sourceText = TextIO.inputN(inStream, sourceLength) val _ = readToEscape("", #"r") (* Should be empty - check? *) in CompileRequest { requestId = requestId, fileName = fileName, startPosition = startPosition, preludeCode = preludeCode, sourceCode = sourceText } end (* Navigation functions. *) | #"M" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"," val requestType = case readToEscape("", #"m") of "N" => DirRight | "P" => DirLeft | "U" => DirUp | _(*"C"*) => DirDown in MoveRequest{ requestId = requestId, parseTreeId = parseTreeId, direction= requestType, location = { startOffset = startOffset, endOffset = endOffset } } end (* Print the type of the selected node. *) | #"T" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"t" in TypeRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end (* Print the declaration location of the selected node. *) | #"I" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"," val decType = case readToEscape("", #"i") of "J" => DecOpen | "S" => DecParent | _ (*"I"*) => DecLocal in DecRequest{ requestId = requestId, parseTreeId = parseTreeId, decType = decType, location = { startOffset = startOffset, endOffset = endOffset } } end (* Return the local references to the given identifier. *) | #"V" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"v" in RefRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"O" => (* Print list of valid commands. *) let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"o" in PropertyRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"K" => (* Cancel request. *) KillRequest { requestId = readToEscape ("", #"k") } | ch => (* Something else. Reply with empty response. *) let (* Unlike the other cases we don't know what may follow ESCAPE. *) val terminator = Char.toLower ch fun skipToTerminator () = case input1 inStream of SOME #"\u001b" => ( case input1 inStream of NONE => protocolError "End of file" | SOME ch => if ch = terminator then () (* Found the end. *) else (* Some internal escape code. *) skipToTerminator() ) | SOME _ => skipToTerminator () | NONE => protocolError "End of file" in skipToTerminator (); UnknownRequest { request = Char.ord ch, requestId = "" } end end (* readRequest *) fun sendStartedMessage () = let fun print s = TextIO.StreamIO.output(outStream, s) fun printEsc ch = print (String.concat["\u001b", String.str ch]) fun sendResponse () = ( (* send the version number of the protocol *) printEsc #"H"; print "1.0.0"; printEsc #"h"; TextIO.StreamIO.flushOut outStream ) in ThreadLib.protect outputLock sendResponse () end (* Send a reply packet. *) fun sendResponse response = let fun print s = TextIO.StreamIO.output(outStream, s) fun printEsc ch = print (String.concat["\u001b", String.str ch]) fun printLocation {startOffset, endOffset } = print (String.concat[Int.toString startOffset, "\u001b,", Int.toString endOffset]) and printFullLocation { file, startLine, startPosition, endPosition, ...} = ( print file; (* TODO double any escapes. *) printEsc #","; print (Int.toString startLine); printEsc #","; print (Int.toString startPosition); printEsc #","; print (Int.toString endPosition) ) fun makeResponse (PropertyResponse { requestId, parseTreeId, location, commands }) = let fun printCommand comm = (printEsc #","; print comm) in printEsc #"O"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; List.app printCommand commands; printEsc #"o" end | makeResponse (MoveResponse { requestId, parseTreeId, location }) = ( printEsc #"M"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; printEsc #"m" ) | makeResponse (TypeResponse { requestId, parseTreeId, location, typeRes }) = let fun prettyAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrint(doPrint, !PolyML.Compiler.lineLength) message in String.concat(List.rev(! result)) end in printEsc #"T"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; case typeRes of NONE => () | SOME typeRes => ( printEsc #","; print(prettyAsString typeRes) ); printEsc #"t" end | makeResponse (DecResponse { requestId, parseTreeId, location, decLocation }) = ( printEsc #"I"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; case decLocation of SOME location => (printEsc #","; printFullLocation location) | NONE => (); printEsc #"i" ) | makeResponse (RefResponse { requestId, parseTreeId, location, references }) = ( printEsc #"V"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; List.app (fn loc => (printEsc #","; printLocation loc)) references; printEsc #"v" ) | makeResponse (CompilerResponse { requestId, parseTreeId, finalOffset, result }) = let (* Pretty print a message and return the output string. *) fun prettyMarkupAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrintWithIDEMarkup(doPrint, !PolyML.Compiler.lineLength) message in String.concat(List.rev(! result)) end fun printError { hardError, location, message } = ( printEsc #"E"; if hardError then print "E" else print "W"; printEsc #","; printFullLocation location; printEsc #";"; (* N.B. Semicolon here, not comma. *) print (prettyMarkupAsString message); (* May include markup *) printEsc #"e" ) fun printOffset() = (printEsc #","; print (Int.toString finalOffset)) fun printErrors errors = (List.app printError errors) in printEsc #"R"; print requestId; printEsc #","; print parseTreeId; printEsc #","; case result of Succeeded errors => (print "S"; printOffset(); printEsc #";"; printErrors errors) | RuntimeException (s, errors) => ( print "X"; printOffset(); printEsc #";"; printEsc #"X"; print(prettyMarkupAsString s); (* May include markup *) printEsc #"x"; printErrors errors ) | PreludeFail s => ( print "L"; printOffset(); printEsc #";"; print s (* May include markup *) ) | CompileFail errors => ( print "F"; printOffset(); printEsc #";"; printErrors errors ) | CompileCancelled errors => ( print "C"; printOffset(); printEsc #";"; printErrors errors ); printEsc #"r" end | makeResponse (UnknownResponse { request, ... }) = let val startCh = Char.chr request in (* Response to unknown command - return empty result. *) ( printEsc startCh; printEsc (Char.toLower startCh)) end fun sendResponse () = ( makeResponse response handle _ => protocolError "Exception"; TextIO.StreamIO.flushOut outStream ) in (* Sending the response packet must be atomic with respect to any other output to stdOut. *) ThreadLib.protect outputLock sendResponse () end (* sendResponse *) in (readRequest, sendStartedMessage, sendResponse) end | SOME portNo => (* Version 2 protocol - uses ASN1 binary over a socket.*) let val prefBuffSize = 4096 (* Get this from somewhere? *) val socket = INetSock.TCP.socket(): Socket.active INetSock.stream_sock (* We don't have a stream to produce error messages so simply fail if we get an exception here. *) val localhost = NetHostDB.addr (valOf(NetHostDB.getByName "localhost")) val port = valOf(Int.fromString portNo) val () = Socket.connect(socket, INetSock.toAddr(localhost, port)) (* Construct the readers and writers. *) fun sendASN1(v: Word8Vector.vector list) = let open Word8VectorSlice (* Write the whole data, in chunks if necessary. *) fun sendSlice slice = if length slice = 0 then () else sendSlice(subslice(slice, Socket.sendVec(socket, slice), NONE)) in sendSlice(Word8VectorSlice.full(Word8Vector.concat v)) end fun readVecFromSocket(n: int): Word8Vector.vector = Socket.recvVec(socket, n) open TextIO Asn1 local (* Interlocked writer for TextIO.stdOut *) (* Whenever we write plain text we package it as an ASN1 packet. *) fun writeVecToSocket(v: CharVectorSlice.slice) = ( sendASN1(encodeItem(Application(1, Primitive), [encodeString(CharVectorSlice.vector v)])); CharVectorSlice.length v (* It's written it all. *) ) val lockedWriteVec = ThreadLib.protect outputLock writeVecToSocket val lockedWriter = TextPrimIO.WR { name = "TextIO.stdOut", chunkSize = prefBuffSize, writeVec = SOME lockedWriteVec, writeArr = NONE, writeVecNB = NONE, writeArrNB = NONE, block = NONE, canOutput = NONE, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = SOME(Socket.ioDesc socket) } in (* Use this locked version for normal stdOut. *) val () = setOutstream(stdOut, StreamIO.mkOutstream(TextPrimIO.augmentWriter lockedWriter, IO.LINE_BUF)) end local (* Create a functional binary stream *) val reader = BinPrimIO.RD { name = "socket", chunkSize = prefBuffSize, readVec = SOME readVecFromSocket, readArr = NONE, readVecNB = NONE, readArrNB = NONE, block = NONE, canInput = NONE, avail = fn _ => NONE, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn _ => (), ioDesc = SOME(Socket.ioDesc socket) } val binStream = BinIO.StreamIO.mkInstream(BinPrimIO.augmentReader reader, Word8Vector.fromList []) in val inStream = ref binStream end fun protocolError error = let open OS.Process in TextIO.print ("Protocol error: " ^ error) handle _ => (); exit failure end (* Reads a request. Calls OS.Process.exit at end-of-file or on a protocol error. *) fun readRequest (): request = let open Asn1 (* Read the ASN1 header to get the tag and then read the data. Position the stream ready to read the next request. *) val (requestTag, data) = case readHeader BinIO.StreamIO.input1 (!inStream) of NONE => (* If we had EOF here it's probably because we've closed. *) OS.Process.exit OS.Process.success (* Close down. *) | SOME((tag, length), afterHdr) => let val (vector, afterBlock) = BinIO.StreamIO.inputN(afterHdr, length) in if Word8Vector.length vector = length then () else protocolError "Stream closed"; inStream := afterBlock; (tag, vector) end fun splitSequence v = case decodeItem v of SOME{tag, data, remainder} => (tag, data) :: splitSequence remainder | NONE => [] (* See if an item is present and return it if it is. *) fun findData tag list = Option.map #2 (List.find (fn (t, _) => t = tag) list) fun findString tag list = Option.map decodeString (findData tag list) and findInt tag list = Option.map decodeInt (findData tag list) in case requestTag of Application(3, _) => (* Compilation request. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* File name - optional, default "" *) val fileName = getOpt(findString (Context(1, Primitive)) tdList, "") (* Start position - optional, default 0 *) val startPosition = getOpt(findInt (Context(2, Primitive)) tdList, 0) (* Prelude code - optional, default "" *) val preludeCode = getOpt(findString (Context(3, Primitive)) tdList, "") (* Source code *) val source = findString (Context(4, Primitive)) tdList in case (reqId, source) of (SOME requestId, SOME sourceText) => CompileRequest { requestId = requestId, fileName = fileName, startPosition = startPosition, preludeCode = preludeCode, sourceCode = sourceText } | (SOME requestId, _) => UnknownRequest { request = 3, requestId = requestId } | _ => UnknownRequest { request = 3, requestId = "" } (* Malformed *) end | Application(4, _) => (* Return the type of the selected node. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList in case (reqId, parseId, startOff, endOff) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset) => TypeRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } | (SOME requestId, _, _, _) => UnknownRequest { request = 4, requestId = requestId } | _ => UnknownRequest { request = 4, requestId = "" } (* Malformed *) end | Application(5, _) => (* Move request. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList (* Move direction *) val dir = findInt (Context(3, Primitive)) tdList in case (reqId, parseId, startOff, endOff, dir) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset, SOME dir) => let val dirn = case dir of 1 => DirUp | 2 => DirLeft | 3 => DirRight | _ (*4*) => DirDown in MoveRequest{ requestId = requestId, parseTreeId = parseTreeId, direction = dirn, location = { startOffset = startOffset, endOffset = endOffset } } end | (SOME requestId, _, _, _, _) => UnknownRequest { request = 5, requestId = requestId } | _ => UnknownRequest { request = 5, requestId = "" } (* Malformed *) end | Application(6, _) => (* Declaration location for variables. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList (* Dec type *) val dt = findInt (Context(3, Primitive)) tdList in case (reqId, parseId, startOff, endOff, dt) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset, SOME dect) => let val decType = case dect of 2 => DecOpen | 3 => DecParent | _ (*1*) => DecLocal in DecRequest{ requestId = requestId, parseTreeId = parseTreeId, decType = decType, location = { startOffset = startOffset, endOffset = endOffset } } end | (SOME requestId, _, _, _, _) => UnknownRequest { request = 6, requestId = requestId } | _ => UnknownRequest { request = 6, requestId = "" } (* Malformed *) end | Application(7, _) => (* List the references to a variable. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList in case (reqId, parseId, startOff, endOff) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset) => RefRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } | (SOME requestId, _, _, _) => UnknownRequest { request = 7, requestId = requestId } | _ => UnknownRequest { request = 7, requestId = "" } (* Malformed *) end | Universal(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Application(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Context(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Private(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } (*case startCh of | #"O" => (* Print list of valid commands. *) let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"o" in PropertyRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"K" => (* Cancel request. *) KillRequest { requestId = readToEscape ("", #"k") } *) end (* readRequest *) fun sendStartedMessage () = let fun sendResponse () = sendASN1(encodeItem(Application(2, Primitive), [encodeString "1.0.0"])) in ThreadLib.protect outputLock sendResponse () end (* Send a reply packet. *) fun sendResponse response = let fun encodeFullLocation { file, startLine, startPosition, endPosition, ...} = let val encFile = if file = "" then [] else encodeItem(Context(1, Primitive), [encodeString file]) val encLine = if startLine = 0 then [] else encodeItem(Context(2, Primitive), [encodeInt startLine]) val encStart = if startPosition = 0 then [] else encodeItem(Context(3, Primitive), [encodeInt startPosition]) val encEnd = if endPosition = 0 then [] else encodeItem(Context(4, Primitive), [encodeInt endPosition]) in encFile @ encLine @ encStart @ encEnd end and encodeLocation {startOffset, endOffset } = encodeItem(Context(3, Primitive), [encodeInt startOffset]) @ encodeItem(Context(4, Primitive), [encodeInt endOffset]) and encodeRequestId requestId = encodeItem(Application(20, Primitive), [encodeString requestId]) and encodeParseId parseId = encodeItem(Application(21, Primitive), [encodeString parseId]) fun mapEnc _ [] = [] | mapEnc f (hd :: tl) = f hd @ mapEnc f tl (* Turn a pretty-print structure into text, stripping out mark-up. *) (* TODO: We could return the "pretty" structure and have the IDE format it. *) fun prettyAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrint(doPrint, 120(*!PolyML.Compiler.lineLength*)) message in String.concat(List.rev(! result)) end fun makeResponse (CompilerResponse { requestId, parseTreeId, finalOffset, result }) = let fun encodeError { hardError, location, message } = encodeItem(Context(4, Constructed), encodeItem(Context(1, Primitive), [encodeBool hardError]) @ encodeItem(Context(3, Constructed), encodeFullLocation location) @ encodeItem(Context(2, Primitive), [encodeString(prettyAsString message)]) ) val (resultCode, resultData) = case result of Succeeded errors => (0, mapEnc encodeError errors) | RuntimeException (s, errors) => (1, encodeItem(Context(3, Primitive), [encodeString(prettyAsString s)]) @ mapEnc encodeError errors) | PreludeFail s => (2, encodeItem(Context(3, Primitive), [encodeString s])) | CompileFail errors => (3, mapEnc encodeError errors) | CompileCancelled errors => (4, mapEnc encodeError errors) in sendASN1(encodeItem(Application(3, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Primitive), [encodeInt finalOffset]) @ encodeItem(Context(2, Primitive), [encodeInt resultCode]) @ resultData)) end | makeResponse (PropertyResponse { requestId, parseTreeId, location, commands }) = let fun encCommand c = encodeItem(Context(2, Primitive), [encodeString c]) in sendASN1(encodeItem(Application(4, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ mapEnc encCommand commands)) end | makeResponse (MoveResponse { requestId, parseTreeId, location }) = sendASN1(encodeItem(Application(7, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location))) | makeResponse (TypeResponse { requestId, parseTreeId, location, typeRes }) = let val typeData = case typeRes of NONE => [] | SOME t => encodeItem(Context(2, Primitive), [encodeString(prettyAsString t)]) in sendASN1(encodeItem(Application(8, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ typeData)) end | makeResponse (DecResponse { requestId, parseTreeId, location, decLocation }) = let val decData = case decLocation of NONE => [] | SOME l => encodeItem(Context(2, Constructed), encodeFullLocation l) in sendASN1(encodeItem(Application(9, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ decData)) end | makeResponse (RefResponse { requestId, parseTreeId, location, references }) = let fun encLoc l = encodeItem(Context(2, Constructed), encodeLocation l) in sendASN1(encodeItem(Application(10, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ mapEnc encLoc references)) end | makeResponse (UnknownResponse { requestId, ... }) = (* Send an Error packet. *) sendASN1(encodeItem(Application(0, Constructed), if requestId = "" then [] else encodeRequestId requestId)) fun sendResponse () = ( makeResponse response handle _ => protocolError "Exception" ) in (* Sending the response packet must be atomic with respect to any other output to stdOut. *) ThreadLib.protect outputLock sendResponse () end (* sendResponse *) in (readRequest, sendStartedMessage, sendResponse) end (* Get the current parse tree and identifier. *) fun getCurrentParse() = withLock (fn () => let val (id, trees) = ! parseTree in (trees, ! lastParsetree, id) end) (* Update lastParsetree if the id is still valid. *) fun updateLastParse(id, pt) = let fun f () = if id = #1 (! parseTree) then lastParsetree := pt else () in withLock f end (* Set parse tree and ID as a result of a compilation. Sets lastParsetree to the head of the updated parse tree. *) fun setParseTree(pt, id) = let fun f () = ( parseTree := (id, pt); case pt of [] => lastParsetree := NONE | hd :: _ => lastParsetree := SOME hd ) in withLock f end (* The source text may consist of several "programs". When we compile a "program" we have to provide a way for the parsetree for this "program" to navigate to others even though they won't have been compiled yet. This enables it to work. *) (* We have to return functions for the parent, for the next sibling even if there isn't one and for the previous sibling. *) fun toplevelParseTree (parseRootRef as ref currentList) = let open PolyML (* This is called when we have processed the previous "programs" but not yet processed this one. *) fun makelist([], _) = (* Shouldn't happen *) raise Fail "Null list" | makelist(l as (locn, props) :: tl, previous) = let fun this () = makelist(l, previous) (* If there is another item in the list we need a property that moves there whose "previous" property comes here. *) val next = case tl of [] => [] | _ => [PTnextSibling( fn () => makelist(tl, [PTpreviousSibling this]))] in (locn, previous @ next @ props) end fun parent () = case ! parseRootRef of [] => raise Fail "Empty Tree" | trees as (hd :: _) => let (* Navigation for one or more topdecs. *) val fullLoc = case (hd, List.last trees) of (({ file, startLine, startPosition, ... }, _), ({ endLine, endPosition, ... }, _)) => { file=file, startLine=startLine, startPosition=startPosition, endLine=endLine, endPosition=endPosition } in (fullLoc, [PTfirstChild(fn () => makelist(trees, []))]) end val itemCount = List.length currentList fun moveToNth n = let fun move (tree, 0) = tree | move ((loc, opts), n) = case List.find(fn PTnextSibling _ => true | _ => false) opts of NONE => let (* We have to put a dummy item in at the end since when we created the parent properties for the last "program" we will have passed in a "next" entry even though there wasn't actually a "next". *) val { file, startLine, startPosition, ... } = loc val lastPos = { file = file, startLine = startLine, endLine = startLine, startPosition = startPosition, endPosition = startPosition } val opts = List.filter(fn PTparent _ => true | PTpreviousSibling _ => true | _ => false) opts in (lastPos, opts) end | SOME (PTnextSibling f) => move(f(), n-1) | SOME _ => raise Match (* Shouldn't happen *) in case ! parseRootRef of [] => raise Fail "Empty Tree" | trees => move(makelist(trees, []), n) end val previous = case currentList of [] => NONE (* This is the first. *) | _ => SOME(fn () => moveToNth(itemCount-1)) fun next () = moveToNth(itemCount+1) in { parent = SOME parent, next = SOME next, previous = previous } end (* Move in the selected direction. Returns the tree as the result of the move. *) fun navigateTo(searchLocation as {startOffset, endOffset}, lastParsetree) = case lastParsetree of NONE => NONE | SOME({ startPosition, endPosition, ... }, tree) => let open PolyML datatype direction = Up | Down | Left | Right fun find([], _) = NONE (* No change *) | find(PTparent p :: _, Up) = SOME p | find(PTpreviousSibling p :: _, Left) = SOME p | find(PTnextSibling p :: _, Right) = SOME p | find(PTfirstChild p :: _, Down) = SOME p | find(_ :: tl, dir) = find (tl, dir) in if startOffset = startPosition andalso endOffset = endPosition then (* We're there already. *) lastParsetree else if startOffset >= startPosition andalso endOffset <= endPosition then (* It's this node or a child. *) let val child = find(tree, Down) in (* See if the element we want is actually a child. *) case child of SOME child => let (* See which child it is. *) fun findChild(location as {startPosition, endPosition, ...}, child) = if startOffset >= startPosition andalso endOffset <= endPosition then SOME (location, child) else case find(child, Right) of NONE => NONE | SOME next => findChild(next()) in case findChild(child()) of NONE => lastParsetree (* In this *) | SOME child => navigateTo(searchLocation, SOME child) end | NONE => lastParsetree (* No children. *) end else (* Must go out. *) ( case find(tree, Up) of SOME p => navigateTo(searchLocation, SOME(p())) | NONE => NONE (* Not found *) ) end (* Main protocol loop. *) fun runProtocol currentCompilation = let (* Return the location of the given tree. *) fun treeLocation NONE = {startOffset = 0, endOffset = 0} | treeLocation (SOME ({startPosition, endPosition, ...}, _)) = {startOffset = startPosition, endOffset = endPosition} in case readRequest () of PropertyRequest { requestId: string, parseTreeId: string, location } => let (* Properties of selected node. *) (* Get the current parse tree and check the ID matches *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (commands, location) = if parseTreeId = currentParseID then let val newTree = navigateTo(location, lastParsetree) (* Update the last tree if it's still valid. *) val () = updateLastParse(currentParseID, newTree) val commands = case newTree of NONE => [] | (SOME(_, tree)) => let open PolyML fun printCode(PTparent _, rest) = "U" :: rest | printCode(PTpreviousSibling _, rest) = "P" :: rest | printCode(PTnextSibling _, rest) = "N" :: rest | printCode(PTfirstChild _, rest) = "C" :: rest | printCode(PTtype _, rest) = "T" :: rest | printCode(PTdeclaredAt _, rest) = "I" :: rest | printCode(PTopenedAt _, rest) = "J" :: rest | printCode(PTstructureAt _, rest) = "S" :: rest | printCode(PTreferences(_, _::_), rest) = "V" :: rest (* Only include references if there is at least one local reference. *) | printCode(PTreferences(_, []), rest) = rest | printCode(PTprint _, rest) = rest in List.foldl printCode [] tree end in (commands, treeLocation newTree) end else ([], { startOffset = 0, endOffset = 0 }) (* Wrong ID. *) in sendResponse( PropertyResponse { requestId = requestId, parseTreeId = currentParseID, location = location, commands = commands }); runProtocol currentCompilation end | MoveRequest { requestId, parseTreeId, location, direction } => let (* Get location after a move relative to a selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val newLocation = if parseTreeId = currentParseID then let (* Move to the given location, then move in the required direction. *) val newTree = case navigateTo(location, lastParsetree) of NONE => NONE | SOME(location, tree) => let open PolyML fun find([], _) = (location, tree) (* No change *) | find(PTparent p :: _, DirUp) = p() | find(PTpreviousSibling p :: _, DirLeft) = p() | find(PTnextSibling p :: _, DirRight) = p() | find(PTfirstChild p :: _, DirDown) = p() | find(_ :: tl, dir) = find (tl, dir) in SOME(find(tree, direction)) end (* Update the last tree if it's still valid. *) val () = updateLastParse(currentParseID, newTree) in treeLocation newTree (* Return the location of the updated tree. *) end else { startOffset = 0, endOffset = 0 } (* *) in sendResponse( MoveResponse { requestId = requestId, parseTreeId = currentParseID, location = newLocation }); runProtocol currentCompilation end | TypeRequest { requestId, parseTreeId, location } => let (* Type of value at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (typeRes, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) (* If it has a type return it. *) val typeRes = case newTree of NONE => NONE | (SOME(_, tree)) => ( (* Print the type if it's there. Don't include any mark-up. *) (* TODO: This uses the global name space to find types and structures. It really should use the local name space but that requires adding an environment to the parse tree. *) case List.find (fn (PolyML.PTtype _) => true | _ => false) tree of SOME(PolyML.PTtype t) => SOME(PolyML.NameSpace.displayTypeExpression(t, 100, PolyML.globalNameSpace)) | _ => NONE ) in (typeRes, treeLocation newTree) end else (NONE, { startOffset = 0, endOffset = 0 }) in sendResponse( TypeResponse { requestId = requestId, parseTreeId = currentParseID, location = location, typeRes = typeRes }); runProtocol currentCompilation end | DecRequest { requestId, parseTreeId, location, decType } => let (* Information about declaration location of identifier at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (decLocation, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) val decLocation = (* If it has the right kind of property return it. *) case newTree of NONE => NONE | (SOME(_, tree)) => let open PolyML val getLoc = case decType of DecLocal => (fn (PTdeclaredAt p) => SOME p | _ => NONE) | DecOpen => (fn (PTopenedAt p) => SOME p | _ => NONE) | DecParent => (fn (PTstructureAt p) => SOME p | _ => NONE) (* Seatch in the properties of the current node for the property we want. *) fun findLoc [] = NONE | findLoc (hd::tl) = case getLoc hd of SOME location => SOME location | NONE => (* Keep trying. *) findLoc tl in findLoc tree end in (decLocation, treeLocation newTree) end else (NONE, { startOffset = 0, endOffset = 0 }) in sendResponse( DecResponse { requestId = requestId, parseTreeId = currentParseID, location = location, decLocation = decLocation }); runProtocol currentCompilation end | RefRequest { requestId, parseTreeId, location } => let (* Type of value at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (references, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) (* Find the local references. *) val references = case newTree of NONE => [] | SOME(_, tree) => ( case List.find (fn (PolyML.PTreferences _) => true | _ => false) tree of SOME(PolyML.PTreferences(_, l)) => List.map (fn {startPosition, endPosition, ...} => { startOffset=startPosition, endOffset=endPosition}) l | _ => [] ) in (references, treeLocation newTree) end else ([], { startOffset = 0, endOffset = 0 }) in sendResponse( RefResponse { requestId = requestId, parseTreeId = currentParseID, location = location, references = references }); runProtocol currentCompilation end | CompileRequest { requestId, fileName, startPosition, preludeCode, sourceCode } => (* Unlike the other requests this is done asynchronously. *) let fun compileThread () = let type errorMsg = { message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } (* Even success may include warning messages. *) datatype compileResult = Success | Exception of exn | Interrupted | Errors local open PolyML.NameSpace (* Put in the results without printing. *) fun resultFun { fixes: (string * fixityVal) list, values: (string * valueVal) list, structures: (string * structureVal) list, signatures: (string * signatureVal) list, functors: (string * functorVal) list, types: (string * typeVal) list} = let open PolyML in List.app (#enterFix globalNameSpace) fixes; List.app (#enterType globalNameSpace) types; List.app (#enterSig globalNameSpace) signatures; List.app (#enterStruct globalNameSpace) structures; List.app (#enterFunct globalNameSpace) functors; List.app (#enterVal globalNameSpace) values end in (* Compile the prelude. Simply returns true if it succeeded and false on any error. Note: Unlike the main compilation this is run with the interlock held and interrupts deferred. *) fun compilePreludeString stringInput: string option = let val stringStream = TextIO.openString stringInput fun compilerResultFun (_, codeOpt) = case codeOpt of SOME code => (fn () => resultFun(code())) | NONE => raise Fail "Static Errors" fun compilerLoop () = (* Compile each "program" until either we get to the end or an exception. *) if TextIO.endOfStream stringStream then NONE (* Reached the end of the input without error. *) else let (* Compile the code and get the result. *) open PolyML PolyML.Compiler val (code, result) = (PolyML.compiler(fn () => TextIO.input1 stringStream, [CPOutStream TextIO.print, CPCompilerResultFun compilerResultFun]), NONE) handle exn => (fn() => (), SOME(exnMessage exn)) in case result of NONE => ( (* No exception in compiler: run the code and check that it runs successfully. *) case ((code(); NONE) handle exn => SOME(exnMessage exn)) of NONE => compilerLoop () (* Continue. *) | exn => exn ) | error => error end fun runloop () = let val res = compilerLoop() in (* The prelude may update the current parse tree. *) case !parseTree of (_, []) => lastParsetree := NONE | (_, hd :: _) => lastParsetree := SOME hd; res end in (* This is run with the lock held. *) withLock runloop end (* Compile the main source code. *) fun compileString(stringInput, startPosition) = let val errorList = ref [] val stringPosition = ref 0 val stringSize = String.size stringInput val resultTrees : PolyML.parseTree list ref = ref [] val lastTreePosition = ref 0 fun readIn () = let val posn = ! stringPosition in if posn >= stringSize then NONE else SOME(String.sub(stringInput, posn)) before (stringPosition := posn+1) end (* We need to define our own compilerResultFun in order to capture the parse trees. *) fun compilerResultFun (parsetree, codeOpt) = ( (* Add the parsetree to the list. Record this as the position of the last valid tree. *) case parsetree of SOME pt => (resultTrees := ! resultTrees @ [pt]; lastTreePosition := !stringPosition) | NONE => (); (* Not if parse failed. *) case codeOpt of SOME code => (fn () => resultFun(code())) | NONE => raise Fail "Static Errors" ) fun compilerLoop () = (* Compile each "program" until either we get to the end or an exception. *) if ! stringPosition >= stringSize then Success (* Reached the end of the input without error. *) else let open PolyML PolyML.Compiler val (code, result) = (PolyML.compiler(readIn, [CPOutStream TextIO.print, CPLineOffset (fn () => startPosition + !stringPosition), CPErrorMessageProc (fn msg => errorList := !errorList @ [msg]), CPCompilerResultFun compilerResultFun, CPFileName fileName, CPRootTree (toplevelParseTree resultTrees)]), Success) handle Fail _ => (fn() => (), Errors) | _ (* E.g. Interrupted *) => (fn() => (), Interrupted) in case result of Success => (* Compilation succeeded. *) ( (* Run the code. If it raised an exception pass that back. *) case (code(); Success) handle exn => Exception exn of Success => compilerLoop () (* Continue. *) | fault => fault ) | error => error end in (compilerLoop (), startPosition + !lastTreePosition, ! resultTrees, ! errorList) end end in if (* First run the prelude. If there are any errors report them and stop. *) case compilePreludeString preludeCode of NONE => true (* Succeeded - continue *) | SOME preludeError => (* Error - stop *) let (* Leave the parse tree unchanged. *) val (_, _, currentId) = getCurrentParse() in sendResponse( CompilerResponse { requestId = requestId, parseTreeId = currentId, finalOffset = startPosition, result = PreludeFail preludeError }); false end then (* We can do the main compilation. *) let local open Thread.Thread in (* The rest of this code is interruptible TODO: Multiple interrupts could result in not sending a result packet. *) val () = setAttributes [EnableBroadcastInterrupt true, InterruptState InterruptAsynch] end; val (result, finalPosition, resultTrees, errors) = compileString(sourceCode, startPosition) fun makeErrorPacket {message: PolyML.pretty, hard: bool, location, ...} = { hardError = hard, location = location, message = message } val errorPackets = List.map makeErrorPacket errors val compileResult = case result of Success => Succeeded errorPackets (* May be warning messages. *) | Exception exn => let open PolyML val exLoc = case exceptionLocation exn of SOME loc => [ContextLocation loc] | NONE => [] val exceptionString = (PrettyBlock(0, false, exLoc, [ prettyRepresentation(exn, !PolyML.Compiler.printDepth) ])) in RuntimeException(exceptionString, errorPackets) end | Interrupted => CompileCancelled errorPackets | Errors => CompileFail errorPackets (* Update the tree unless parsing failed and we don't have one. *) val parseTreeId = case resultTrees of [] => #3 (getCurrentParse()) (* Return existing tree. *) | _ => (setParseTree(resultTrees, requestId); requestId) in (* Send the response. *) sendResponse( CompilerResponse { requestId = requestId, parseTreeId = parseTreeId, finalOffset = finalPosition, result = compileResult }) end else () (* Prelude failed. *) end (* compileThread *) open Thread.Thread (* First see if the last compilation has terminated. Starting a new compilation before the previous one has finished is really a protocol error. *) val isStillRunning = case currentCompilation of NONE => false | SOME (_, lastCompileThread) => isActive lastCompileThread in if isStillRunning then sendResponse( CompilerResponse { requestId = requestId, parseTreeId = #3 (getCurrentParse()), finalOffset = startPosition, result = PreludeFail "Thread still running" }) else let (* The compile thread is run with interrupts deferred initially. *) val thread = fork(compileThread, [InterruptState InterruptDefer]) in runProtocol (SOME(requestId, thread)) end end | KillRequest { requestId: string } => (* Kill compilation. *) ( case currentCompilation of NONE => () (* No compilation. *) | SOME (id, thread) => if requestId = id then Thread.Thread.interrupt thread else () (* Different ID running. *); runProtocol currentCompilation ) | UnknownRequest req => (* Respond with an empty response. *) ( sendResponse(UnknownResponse req); runProtocol currentCompilation ) end in let (* Turn off interrupts for the interface thread. *) open Thread.Thread in setAttributes[EnableBroadcastInterrupt false, InterruptState InterruptDefer] end; sendStartedMessage(); runProtocol NONE (* No compilation. *) end (* runIDEProtocol. *) in structure PolyML = struct (* This is the root function to run the Poly/ML top level. *) fun rootFunction () : unit = let val argList = CommandLine.arguments() fun rtsRelease() = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (10, ()) fun rtsHelp() = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (19, ()) fun switchOption option = List.exists(fn s => s = option) argList in if switchOption "-v" then (* -v option : Print version information and exit *) print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, " RTS version: ", rtsRelease(), "\n"]) else if switchOption "--help" then (* --help option: Print argument information and exit. *) ( print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, "\n"]); print "Compiler arguments:\n"; print "\n"; print "-v Print the version of Poly/ML and exit\n"; print "--help Print this message and exit\n"; print "-q Suppress the start-up message and turn off printing of results\n"; print "-i Interactive mode. Default if input is from a terminal\n"; print "--use FILE Executes 'use \"FILE\";' before the ML shell starts\n"; print "--eval STRING Compiles and executes STRING as ML before the ML shell starts\n"; print "--error-exit Exit shell on unhandled exception\n"; print "--with-markup Include extra mark-up information when printing\n"; print "--ideprotocol[=v2] Run the IDE communications protocol\n"; print "--script The input is a script. Skips the first line if it begins with #!"; print "\nRun time system arguments:\n"; print (rtsHelp()) ) else if switchOption "--ideprotocol" then runIDEProtocol () (* Run the IDE communication protocol. *) else if switchOption "--script" then let (* The last argument is the file name. Open it but skip the first line if it's #!. The rest of this code is largely copied from PolyML.use. *) val fileName = List.last argList (* We know there's at least one *) open TextIO val inStream = getInstream(TextIO.openIn fileName) open StreamIO val stream = ref inStream val lineNo = ref 1 val (start, _) = inputN(inStream, 2) fun getChar () = case input1 (! stream) of NONE => NONE | SOME (eoln as #"\n", strm) => ( lineNo := !lineNo + 1; stream := strm; SOME eoln ) | SOME(c, strm) => (stream := strm; SOME c) val () = if start = "#!" then while (case getChar () of NONE => false | SOME #"\n" => false | SOME _ => true) do () else () val () = PolyML.print_depth 0 (* Quieten. *) in while not (endOfStream(!stream)) do let open PolyML.Compiler val code = PolyML.compiler(getChar, [CPFileName fileName, CPLineNo(fn () => !lineNo)]) handle exn => ( closeIn(!stream); PolyML.Exception.reraise exn ) in code() handle exn => ( (* Report exceptions in running code. *) TextIO.print ("Exception- " ^ exnMessage exn ^ " raised\n"); input1 (! stream); PolyML.Exception.reraise exn ) end; (* Normal termination: close the stream. *) closeIn (! stream) end else (* Enter normal Poly/ML top-level. *) let open Signal val () = if switchOption "-q" then PolyML.print_depth 0 else print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, "\n"]); (* Set up a handler for SIGINT if that is currently set to SIG_DFL. If a handler has been set up by an initialisation function don't replace it. *) val () = case signal(2, SIG_IGN) of SIG_IGN => () | SIG_DFL => (signal(2, SIG_HANDLE(fn _ => Thread.Thread.broadcastInterrupt())); ()) | oldHandle => (signal(2, oldHandle); ()) fun tryUseFileArguments [] = () (* done successfully *) | tryUseFileArguments ["--use"] = ( print "'--use' requires a filename to be given as the next argument.\n"; OS.Process.exit OS.Process.failure ) | tryUseFileArguments ("--use" :: filenameArg :: moreArgs) = ( PolyML.use filenameArg handle _ => ( print("Error trying to use the file: '" ^ filenameArg ^ "'\n"); OS.Process.exit OS.Process.failure ); tryUseFileArguments moreArgs ) | tryUseFileArguments ["--eval"] = ( print "'--eval' requires a string to be given as the next argument.\n"; OS.Process.exit OS.Process.failure ) | tryUseFileArguments ("--eval" :: useString :: moreArgs) = let (* Compile and execute commands from the string. *) val p = ref 0 in while !p < size useString do let fun getChar() = if !p >= size useString then NONE else SOME(String.sub(useString, !p)) before p := !p+1 val code = PolyML.compiler(getChar, []) handle _ => OS.Process.exit OS.Process.failure in code() handle exn => ( (* Report exceptions in running code. *) print ("Exception- " ^ exnMessage exn ^ " raised\n"); OS.Process.exit OS.Process.failure ) end; tryUseFileArguments moreArgs end | tryUseFileArguments (_ :: args) = tryUseFileArguments args in tryUseFileArguments argList; PolyML.shell (); OS.Process.exit OS.Process.success (* Run any "atExit" functions and then quit. *) end end; structure IDEInterface = struct val parseTree = parseTree val runIDEProtocol = runIDEProtocol end; open PolyML (* Add this to the PolyML structure. *) end end; polyml-5.6/basis/TopLevelPolyML.sml000066400000000000000000002727301265146633400173720ustar00rootroot00000000000000(* Title: Root function for the PolyML structure Author: David Matthews Copyright David Matthews 2009, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This contains the code for the IDE protocol as well as the normal Poly/ML top-level loop. *) local val parseTree = ref ("", []) (* Parsetree ID and parsetrees as a list. *) fun runIDEProtocol () = let (* Save the last parsetree here. *) val lastParsetree = ref (case parseTree of ref(_, hd::_) => SOME hd | _ => NONE) val parseLock = Thread.Mutex.mutex() (* Access the parse tree and other information with the lock held. *) fun withLock f = let open Thread.Thread Thread.Mutex val originalState = getAttributes() val () = setAttributes[InterruptState InterruptDefer] val () = lock parseLock val result = f () val () = unlock parseLock val () = setAttributes originalState in result end type basicLoc = (* Locations in request packets. *) { startOffset: int, endOffset: int } type compileError = { hardError: bool, location: PolyML.location, message: PolyML.pretty } datatype request = (* Requests sent by the IDE to Poly/ML. *) PropertyRequest (* O *) of { requestId: string, parseTreeId: string, location: basicLoc } | MoveRequest (* M *) of { requestId: string, parseTreeId: string, location: basicLoc, direction: direction } | TypeRequest (* T *) of { requestId: string, parseTreeId: string, location: basicLoc } | DecRequest (* I *) of { requestId: string, parseTreeId: string, location: basicLoc, decType: dectype } | RefRequest (* V *) of { requestId: string, parseTreeId: string, location: basicLoc } | CompileRequest (* R *) of { requestId: string, fileName: string, startPosition: int, preludeCode: string, sourceCode: string } | KillRequest (* K *) of { requestId: string } | UnknownRequest (* Provided for upwards compatibility. *) of { request: int, requestId: string} and direction = DirUp | DirLeft | DirRight | DirDown and dectype = DecLocal | DecOpen | DecParent and response = (* Replies sent from Poly/ML to the IDE. *) PropertyResponse (* O *) of { requestId: string, parseTreeId: string, location: basicLoc, commands: string list } | MoveResponse (* M *) of { requestId: string, parseTreeId: string, location: basicLoc } | TypeResponse (* T *) of { requestId: string, parseTreeId: string, location: basicLoc, typeRes: PolyML.pretty option } | DecResponse (* I *) of { requestId: string, parseTreeId: string, location: basicLoc, decLocation: PolyML.location option } | RefResponse (* V *) of { requestId: string, parseTreeId: string, location: basicLoc, references: basicLoc list } | CompilerResponse (* R *) of { requestId: string, parseTreeId: string, finalOffset: int, result: compileResult } | UnknownResponse (* Provided for upwards compatibility. *) of { request: int, requestId: string } and compileResult = Succeeded of compileError list | RuntimeException of PolyML.pretty * compileError list | PreludeFail of string | CompileFail of compileError list | CompileCancelled of compileError list val outputLock = Thread.Mutex.mutex() val (readRequest, sendStartedMessage, sendResponse) = case OS.Process.getEnv "POLYIDESOCKET" of NONE => (* Version 1 protocol - backwards compatibility - use stdIn/stdOut *) let (* Separate out the output stream. We need to interlock access to stdOut to avoid user code outputing within a packet. *) open TextIO TextIO.StreamIO val outStream = getOutstream stdOut val (writer, buffMode) = getWriter outStream val TextPrimIO.WR { name, chunkSize, writeVec, writeArr, block, canOutput, ioDesc, ... } = writer (* Create a version of the stream that locks before actually sending output. *) val lockedWriteVec = case writeVec of NONE => NONE | SOME writeVec => SOME(fn a => ThreadLib.protect outputLock writeVec a) val lockedWriteArray = case writeArr of NONE => NONE | SOME writeArr => SOME(fn a => ThreadLib.protect outputLock writeArr a) val lockedWriter = TextPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = lockedWriteVec, writeArr = lockedWriteArray, writeVecNB = NONE, writeArrNB = NONE, block = block, canOutput = canOutput, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = ioDesc } (* Use this locked version for normal stdOut. *) val () = setOutstream(stdOut, StreamIO.mkOutstream(TextPrimIO.augmentWriter lockedWriter, buffMode)) (* Create an unlocked version for use within the IDE code. When writing to this stream the IDE code will first get a lock, then output the whole packet before releasing the lock. Because mutexes are not recursive we can't use the locking version. *) val unLockedWriter = TextPrimIO.WR { name = name, chunkSize = chunkSize, writeVec = writeVec, writeArr = writeArr, writeVecNB = NONE, writeArrNB = NONE, block = block, canOutput = canOutput, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = ioDesc } val inStream = stdIn val outStream = StreamIO.mkOutstream(TextPrimIO.augmentWriter unLockedWriter, buffMode) fun protocolError error = let open OS.Process in TextIO.print ("Protocol error: " ^ error) handle _ => (); exit failure; raise Fail "bad" (* Never called but sets return type as 'a *) end (* Reads a request. Calls OS.Process.exit at end-of-file or on a protocol error. *) fun readRequest (): request = let open TextIO (* Returns the string as far as the next ESC and the terminator. *) fun readToEscape (soFar: string, terminator) : string = case input1 inStream of SOME #"\u001b" => ( case input1 inStream of NONE => protocolError "End of file" | SOME ch => if ch = terminator then soFar else if ch = #"\u001b" (* Escaped ESC. *) then readToEscape(soFar ^ str #"\u001b", terminator) else protocolError(str ch ^ " not " ^ str terminator) ) | SOME ch => readToEscape(soFar ^ str ch, terminator) | NONE => protocolError "End of file" (* Parse an integer. Returns zero if it isn't a valid int. *) fun getInt termCh : int = case Int.fromString (readToEscape("", termCh)) of NONE => 0 | SOME i => i val () = case input1 inStream of NONE => OS.Process.exit OS.Process.success (* Close down. *) | SOME #"\u001b" => () (* Escape- start of packet. *) | SOME ch => protocolError(str ch ^ " not ESCAPE at start of packet") val startCh = (* Request code *) case input1 inStream of NONE => protocolError "End of file" | SOME ch => ch in case startCh of #"R" => let (* Compile request. *) (* Begin a new compilation. *) val requestId = readToEscape("", #",") val fileName = readToEscape("", #",") val startPosition = getInt #"," (* The next two are the lengths *) val preludeLength = getInt #"," val sourceLength = getInt #"," (* *) val preludeCode = TextIO.inputN(inStream, preludeLength) val _ = readToEscape("", #",") (* Should be empty - check? *) val sourceText = TextIO.inputN(inStream, sourceLength) val _ = readToEscape("", #"r") (* Should be empty - check? *) in CompileRequest { requestId = requestId, fileName = fileName, startPosition = startPosition, preludeCode = preludeCode, sourceCode = sourceText } end (* Navigation functions. *) | #"M" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"," val requestType = case readToEscape("", #"m") of "N" => DirRight | "P" => DirLeft | "U" => DirUp | _(*"C"*) => DirDown in MoveRequest{ requestId = requestId, parseTreeId = parseTreeId, direction= requestType, location = { startOffset = startOffset, endOffset = endOffset } } end (* Print the type of the selected node. *) | #"T" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"t" in TypeRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end (* Print the declaration location of the selected node. *) | #"I" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"," val decType = case readToEscape("", #"i") of "J" => DecOpen | "S" => DecParent | _ (*"I"*) => DecLocal in DecRequest{ requestId = requestId, parseTreeId = parseTreeId, decType = decType, location = { startOffset = startOffset, endOffset = endOffset } } end (* Return the local references to the given identifier. *) | #"V" => let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"v" in RefRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"O" => (* Print list of valid commands. *) let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"o" in PropertyRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"K" => (* Cancel request. *) KillRequest { requestId = readToEscape ("", #"k") } | ch => (* Something else. Reply with empty response. *) let (* Unlike the other cases we don't know what may follow ESCAPE. *) val terminator = Char.toLower ch fun skipToTerminator () = case input1 inStream of SOME #"\u001b" => ( case input1 inStream of NONE => protocolError "End of file" | SOME ch => if ch = terminator then () (* Found the end. *) else (* Some internal escape code. *) skipToTerminator() ) | SOME _ => skipToTerminator () | NONE => protocolError "End of file" in skipToTerminator (); UnknownRequest { request = Char.ord ch, requestId = "" } end end (* readRequest *) fun sendStartedMessage () = let fun print s = TextIO.StreamIO.output(outStream, s) fun printEsc ch = print (String.concat["\u001b", String.str ch]) fun sendResponse () = ( (* send the version number of the protocol *) printEsc #"H"; print "1.0.0"; printEsc #"h"; TextIO.StreamIO.flushOut outStream ) in ThreadLib.protect outputLock sendResponse () end (* Send a reply packet. *) fun sendResponse response = let fun print s = TextIO.StreamIO.output(outStream, s) fun printEsc ch = print (String.concat["\u001b", String.str ch]) fun printLocation {startOffset, endOffset } = print (String.concat[Int.toString startOffset, "\u001b,", Int.toString endOffset]) and printFullLocation { file, startLine, startPosition, endPosition, ...} = ( print file; (* TODO double any escapes. *) printEsc #","; print (Int.toString startLine); printEsc #","; print (Int.toString startPosition); printEsc #","; print (Int.toString endPosition) ) fun makeResponse (PropertyResponse { requestId, parseTreeId, location, commands }) = let fun printCommand comm = (printEsc #","; print comm) in printEsc #"O"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; List.app printCommand commands; printEsc #"o" end | makeResponse (MoveResponse { requestId, parseTreeId, location }) = ( printEsc #"M"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; printEsc #"m" ) | makeResponse (TypeResponse { requestId, parseTreeId, location, typeRes }) = let fun prettyAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrint(doPrint, !PolyML.Compiler.lineLength) message in String.concat(List.rev(! result)) end in printEsc #"T"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; case typeRes of NONE => () | SOME typeRes => ( printEsc #","; print(prettyAsString typeRes) ); printEsc #"t" end | makeResponse (DecResponse { requestId, parseTreeId, location, decLocation }) = ( printEsc #"I"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; case decLocation of SOME location => (printEsc #","; printFullLocation location) | NONE => (); printEsc #"i" ) | makeResponse (RefResponse { requestId, parseTreeId, location, references }) = ( printEsc #"V"; print requestId; printEsc #","; print parseTreeId; printEsc #","; printLocation location; List.app (fn loc => (printEsc #","; printLocation loc)) references; printEsc #"v" ) | makeResponse (CompilerResponse { requestId, parseTreeId, finalOffset, result }) = let (* Pretty print a message and return the output string. *) fun prettyMarkupAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrintWithIDEMarkup(doPrint, !PolyML.Compiler.lineLength) message in String.concat(List.rev(! result)) end fun printError { hardError, location, message } = ( printEsc #"E"; if hardError then print "E" else print "W"; printEsc #","; printFullLocation location; printEsc #";"; (* N.B. Semicolon here, not comma. *) print (prettyMarkupAsString message); (* May include markup *) printEsc #"e" ) fun printOffset() = (printEsc #","; print (Int.toString finalOffset)) fun printErrors errors = (List.app printError errors) in printEsc #"R"; print requestId; printEsc #","; print parseTreeId; printEsc #","; case result of Succeeded errors => (print "S"; printOffset(); printEsc #";"; printErrors errors) | RuntimeException (s, errors) => ( print "X"; printOffset(); printEsc #";"; printEsc #"X"; print(prettyMarkupAsString s); (* May include markup *) printEsc #"x"; printErrors errors ) | PreludeFail s => ( print "L"; printOffset(); printEsc #";"; print s (* May include markup *) ) | CompileFail errors => ( print "F"; printOffset(); printEsc #";"; printErrors errors ) | CompileCancelled errors => ( print "C"; printOffset(); printEsc #";"; printErrors errors ); printEsc #"r" end | makeResponse (UnknownResponse { request, ... }) = let val startCh = Char.chr request in (* Response to unknown command - return empty result. *) ( printEsc startCh; printEsc (Char.toLower startCh)) end fun sendResponse () = ( makeResponse response handle _ => protocolError "Exception"; TextIO.StreamIO.flushOut outStream ) in (* Sending the response packet must be atomic with respect to any other output to stdOut. *) ThreadLib.protect outputLock sendResponse () end (* sendResponse *) in (readRequest, sendStartedMessage, sendResponse) end | SOME portNo => (* Version 2 protocol - uses ASN1 binary over a socket.*) let val prefBuffSize = 4096 (* Get this from somewhere? *) val socket = INetSock.TCP.socket(): Socket.active INetSock.stream_sock (* We don't have a stream to produce error messages so simply fail if we get an exception here. *) val localhost = NetHostDB.addr (valOf(NetHostDB.getByName "localhost")) val port = valOf(Int.fromString portNo) val () = Socket.connect(socket, INetSock.toAddr(localhost, port)) (* Construct the readers and writers. *) fun sendASN1(v: Word8Vector.vector list) = let open Word8VectorSlice (* Write the whole data, in chunks if necessary. *) fun sendSlice slice = if length slice = 0 then () else sendSlice(subslice(slice, Socket.sendVec(socket, slice), NONE)) in sendSlice(Word8VectorSlice.full(Word8Vector.concat v)) end fun readVecFromSocket(n: int): Word8Vector.vector = Socket.recvVec(socket, n) open TextIO Asn1 local (* Interlocked writer for TextIO.stdOut *) (* Whenever we write plain text we package it as an ASN1 packet. *) fun writeVecToSocket(v: CharVectorSlice.slice) = ( sendASN1(encodeItem(Application(1, Primitive), [encodeString(CharVectorSlice.vector v)])); CharVectorSlice.length v (* It's written it all. *) ) val lockedWriteVec = ThreadLib.protect outputLock writeVecToSocket val lockedWriter = TextPrimIO.WR { name = "TextIO.stdOut", chunkSize = prefBuffSize, writeVec = SOME lockedWriteVec, writeArr = NONE, writeVecNB = NONE, writeArrNB = NONE, block = NONE, canOutput = NONE, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn () => raise Fail "stdOut must not be closed", ioDesc = SOME(Socket.ioDesc socket) } in (* Use this locked version for normal stdOut. *) val () = setOutstream(stdOut, StreamIO.mkOutstream(TextPrimIO.augmentWriter lockedWriter, IO.LINE_BUF)) end local (* Create a functional binary stream *) val reader = BinPrimIO.RD { name = "socket", chunkSize = prefBuffSize, readVec = SOME readVecFromSocket, readArr = NONE, readVecNB = NONE, readArrNB = NONE, block = NONE, canInput = NONE, avail = fn _ => NONE, getPos = NONE, setPos = NONE, endPos = NONE, verifyPos = NONE, close = fn _ => (), ioDesc = SOME(Socket.ioDesc socket) } val binStream = BinIO.StreamIO.mkInstream(BinPrimIO.augmentReader reader, Word8Vector.fromList []) in val inStream = ref binStream end fun protocolError error = let open OS.Process in TextIO.print ("Protocol error: " ^ error) handle _ => (); exit failure end (* Reads a request. Calls OS.Process.exit at end-of-file or on a protocol error. *) fun readRequest (): request = let open Asn1 (* Read the ASN1 header to get the tag and then read the data. Position the stream ready to read the next request. *) val (requestTag, data) = case readHeader BinIO.StreamIO.input1 (!inStream) of NONE => (* If we had EOF here it's probably because we've closed. *) OS.Process.exit OS.Process.success (* Close down. *) | SOME((tag, length), afterHdr) => let val (vector, afterBlock) = BinIO.StreamIO.inputN(afterHdr, length) in if Word8Vector.length vector = length then () else protocolError "Stream closed"; inStream := afterBlock; (tag, vector) end fun splitSequence v = case decodeItem v of SOME{tag, data, remainder} => (tag, data) :: splitSequence remainder | NONE => [] (* See if an item is present and return it if it is. *) fun findData tag list = Option.map #2 (List.find (fn (t, _) => t = tag) list) fun findString tag list = Option.map decodeString (findData tag list) and findInt tag list = Option.map decodeInt (findData tag list) in case requestTag of Application(3, _) => (* Compilation request. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* File name - optional, default "" *) val fileName = getOpt(findString (Context(1, Primitive)) tdList, "") (* Start position - optional, default 0 *) val startPosition = getOpt(findInt (Context(2, Primitive)) tdList, 0) (* Prelude code - optional, default "" *) val preludeCode = getOpt(findString (Context(3, Primitive)) tdList, "") (* Source code *) val source = findString (Context(4, Primitive)) tdList in case (reqId, source) of (SOME requestId, SOME sourceText) => CompileRequest { requestId = requestId, fileName = fileName, startPosition = startPosition, preludeCode = preludeCode, sourceCode = sourceText } | (SOME requestId, _) => UnknownRequest { request = 3, requestId = requestId } | _ => UnknownRequest { request = 3, requestId = "" } (* Malformed *) end | Application(4, _) => (* Return the type of the selected node. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList in case (reqId, parseId, startOff, endOff) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset) => TypeRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } | (SOME requestId, _, _, _) => UnknownRequest { request = 4, requestId = requestId } | _ => UnknownRequest { request = 4, requestId = "" } (* Malformed *) end | Application(5, _) => (* Move request. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList (* Move direction *) val dir = findInt (Context(3, Primitive)) tdList in case (reqId, parseId, startOff, endOff, dir) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset, SOME dir) => let val dirn = case dir of 1 => DirUp | 2 => DirLeft | 3 => DirRight | _ (*4*) => DirDown in MoveRequest{ requestId = requestId, parseTreeId = parseTreeId, direction = dirn, location = { startOffset = startOffset, endOffset = endOffset } } end | (SOME requestId, _, _, _, _) => UnknownRequest { request = 5, requestId = requestId } | _ => UnknownRequest { request = 5, requestId = "" } (* Malformed *) end | Application(6, _) => (* Declaration location for variables. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList (* Dec type *) val dt = findInt (Context(3, Primitive)) tdList in case (reqId, parseId, startOff, endOff, dt) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset, SOME dect) => let val decType = case dect of 2 => DecOpen | 3 => DecParent | _ (*1*) => DecLocal in DecRequest{ requestId = requestId, parseTreeId = parseTreeId, decType = decType, location = { startOffset = startOffset, endOffset = endOffset } } end | (SOME requestId, _, _, _, _) => UnknownRequest { request = 6, requestId = requestId } | _ => UnknownRequest { request = 6, requestId = "" } (* Malformed *) end | Application(7, _) => (* List the references to a variable. *) let val tdList = splitSequence(Word8VectorSlice.full data) (* Request id *) val reqId = findString (Application(1, Primitive)) tdList (* Parse id *) val parseId = findString (Application(2, Primitive)) tdList (* Start offset *) val startOff = findInt (Context(1, Primitive)) tdList (* End offset *) val endOff = findInt (Context(2, Primitive)) tdList in case (reqId, parseId, startOff, endOff) of (SOME requestId, SOME parseTreeId, SOME startOffset, SOME endOffset) => RefRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } | (SOME requestId, _, _, _) => UnknownRequest { request = 7, requestId = requestId } | _ => UnknownRequest { request = 7, requestId = "" } (* Malformed *) end | Universal(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Application(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Context(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } | Private(tagNo, _) => UnknownRequest { request = tagNo, requestId = "" } (*case startCh of | #"O" => (* Print list of valid commands. *) let val requestId = readToEscape("", #",") val parseTreeId = readToEscape("", #",") val startOffset = getInt #"," val endOffset = getInt #"o" in PropertyRequest{ requestId = requestId, parseTreeId = parseTreeId, location = { startOffset = startOffset, endOffset = endOffset } } end | #"K" => (* Cancel request. *) KillRequest { requestId = readToEscape ("", #"k") } *) end (* readRequest *) fun sendStartedMessage () = let fun sendResponse () = sendASN1(encodeItem(Application(2, Primitive), [encodeString "1.0.0"])) in ThreadLib.protect outputLock sendResponse () end (* Send a reply packet. *) fun sendResponse response = let fun encodeFullLocation { file, startLine, startPosition, endPosition, ...} = let val encFile = if file = "" then [] else encodeItem(Context(1, Primitive), [encodeString file]) val encLine = if startLine = 0 then [] else encodeItem(Context(2, Primitive), [encodeInt startLine]) val encStart = if startPosition = 0 then [] else encodeItem(Context(3, Primitive), [encodeInt startPosition]) val encEnd = if endPosition = 0 then [] else encodeItem(Context(4, Primitive), [encodeInt endPosition]) in encFile @ encLine @ encStart @ encEnd end and encodeLocation {startOffset, endOffset } = encodeItem(Context(3, Primitive), [encodeInt startOffset]) @ encodeItem(Context(4, Primitive), [encodeInt endOffset]) and encodeRequestId requestId = encodeItem(Application(20, Primitive), [encodeString requestId]) and encodeParseId parseId = encodeItem(Application(21, Primitive), [encodeString parseId]) fun mapEnc _ [] = [] | mapEnc f (hd :: tl) = f hd @ mapEnc f tl (* Turn a pretty-print structure into text, stripping out mark-up. *) (* TODO: We could return the "pretty" structure and have the IDE format it. *) fun prettyAsString message = let val result = ref [] fun doPrint s = result := s :: ! result val () = PolyML.prettyPrint(doPrint, 120(*!PolyML.Compiler.lineLength*)) message in String.concat(List.rev(! result)) end fun makeResponse (CompilerResponse { requestId, parseTreeId, finalOffset, result }) = let fun encodeError { hardError, location, message } = encodeItem(Context(4, Constructed), encodeItem(Context(1, Primitive), [encodeBool hardError]) @ encodeItem(Context(3, Constructed), encodeFullLocation location) @ encodeItem(Context(2, Primitive), [encodeString(prettyAsString message)]) ) val (resultCode, resultData) = case result of Succeeded errors => (0, mapEnc encodeError errors) | RuntimeException (s, errors) => (1, encodeItem(Context(3, Primitive), [encodeString(prettyAsString s)]) @ mapEnc encodeError errors) | PreludeFail s => (2, encodeItem(Context(3, Primitive), [encodeString s])) | CompileFail errors => (3, mapEnc encodeError errors) | CompileCancelled errors => (4, mapEnc encodeError errors) in sendASN1(encodeItem(Application(3, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Primitive), [encodeInt finalOffset]) @ encodeItem(Context(2, Primitive), [encodeInt resultCode]) @ resultData)) end | makeResponse (PropertyResponse { requestId, parseTreeId, location, commands }) = let fun encCommand c = encodeItem(Context(2, Primitive), [encodeString c]) in sendASN1(encodeItem(Application(4, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ mapEnc encCommand commands)) end | makeResponse (MoveResponse { requestId, parseTreeId, location }) = sendASN1(encodeItem(Application(7, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location))) | makeResponse (TypeResponse { requestId, parseTreeId, location, typeRes }) = let val typeData = case typeRes of NONE => [] | SOME t => encodeItem(Context(2, Primitive), [encodeString(prettyAsString t)]) in sendASN1(encodeItem(Application(8, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ typeData)) end | makeResponse (DecResponse { requestId, parseTreeId, location, decLocation }) = let val decData = case decLocation of NONE => [] | SOME l => encodeItem(Context(2, Constructed), encodeFullLocation l) in sendASN1(encodeItem(Application(9, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ decData)) end | makeResponse (RefResponse { requestId, parseTreeId, location, references }) = let fun encLoc l = encodeItem(Context(2, Constructed), encodeLocation l) in sendASN1(encodeItem(Application(10, Constructed), encodeRequestId requestId @ encodeParseId parseTreeId @ encodeItem(Context(1, Constructed), encodeLocation location) @ mapEnc encLoc references)) end | makeResponse (UnknownResponse { requestId, ... }) = (* Send an Error packet. *) sendASN1(encodeItem(Application(0, Constructed), if requestId = "" then [] else encodeRequestId requestId)) fun sendResponse () = ( makeResponse response handle _ => protocolError "Exception" ) in (* Sending the response packet must be atomic with respect to any other output to stdOut. *) ThreadLib.protect outputLock sendResponse () end (* sendResponse *) in (readRequest, sendStartedMessage, sendResponse) end (* Get the current parse tree and identifier. *) fun getCurrentParse() = withLock (fn () => let val (id, trees) = ! parseTree in (trees, ! lastParsetree, id) end) (* Update lastParsetree if the id is still valid. *) fun updateLastParse(id, pt) = let fun f () = if id = #1 (! parseTree) then lastParsetree := pt else () in withLock f end (* Set parse tree and ID as a result of a compilation. Sets lastParsetree to the head of the updated parse tree. *) fun setParseTree(pt, id) = let fun f () = ( parseTree := (id, pt); case pt of [] => lastParsetree := NONE | hd :: _ => lastParsetree := SOME hd ) in withLock f end (* The source text may consist of several "programs". When we compile a "program" we have to provide a way for the parsetree for this "program" to navigate to others even though they won't have been compiled yet. This enables it to work. *) (* We have to return functions for the parent, for the next sibling even if there isn't one and for the previous sibling. *) fun toplevelParseTree (parseRootRef as ref currentList) = let open PolyML (* This is called when we have processed the previous "programs" but not yet processed this one. *) fun makelist([], _) = (* Shouldn't happen *) raise Fail "Null list" | makelist(l as (locn, props) :: tl, previous) = let fun this () = makelist(l, previous) (* If there is another item in the list we need a property that moves there whose "previous" property comes here. *) val next = case tl of [] => [] | _ => [PTnextSibling( fn () => makelist(tl, [PTpreviousSibling this]))] in (locn, previous @ next @ props) end fun parent () = case ! parseRootRef of [] => raise Fail "Empty Tree" | trees as (hd :: _) => let (* Navigation for one or more topdecs. *) val fullLoc = case (hd, List.last trees) of (({ file, startLine, startPosition, ... }, _), ({ endLine, endPosition, ... }, _)) => { file=file, startLine=startLine, startPosition=startPosition, endLine=endLine, endPosition=endPosition } in (fullLoc, [PTfirstChild(fn () => makelist(trees, []))]) end val itemCount = List.length currentList fun moveToNth n = let fun move (tree, 0) = tree | move ((loc, opts), n) = case List.find(fn PTnextSibling _ => true | _ => false) opts of NONE => let (* We have to put a dummy item in at the end since when we created the parent properties for the last "program" we will have passed in a "next" entry even though there wasn't actually a "next". *) val { file, startLine, startPosition, ... } = loc val lastPos = { file = file, startLine = startLine, endLine = startLine, startPosition = startPosition, endPosition = startPosition } val opts = List.filter(fn PTparent _ => true | PTpreviousSibling _ => true | _ => false) opts in (lastPos, opts) end | SOME (PTnextSibling f) => move(f(), n-1) | SOME _ => raise Match (* Shouldn't happen *) in case ! parseRootRef of [] => raise Fail "Empty Tree" | trees => move(makelist(trees, []), n) end val previous = case currentList of [] => NONE (* This is the first. *) | _ => SOME(fn () => moveToNth(itemCount-1)) fun next () = moveToNth(itemCount+1) in { parent = SOME parent, next = SOME next, previous = previous } end (* Move in the selected direction. Returns the tree as the result of the move. *) fun navigateTo(searchLocation as {startOffset, endOffset}, lastParsetree) = case lastParsetree of NONE => NONE | SOME({ startPosition, endPosition, ... }, tree) => let open PolyML datatype direction = Up | Down | Left | Right fun find([], _) = NONE (* No change *) | find(PTparent p :: _, Up) = SOME p | find(PTpreviousSibling p :: _, Left) = SOME p | find(PTnextSibling p :: _, Right) = SOME p | find(PTfirstChild p :: _, Down) = SOME p | find(_ :: tl, dir) = find (tl, dir) in if startOffset = startPosition andalso endOffset = endPosition then (* We're there already. *) lastParsetree else if startOffset >= startPosition andalso endOffset <= endPosition then (* It's this node or a child. *) let val child = find(tree, Down) in (* See if the element we want is actually a child. *) case child of SOME child => let (* See which child it is. *) fun findChild(location as {startPosition, endPosition, ...}, child) = if startOffset >= startPosition andalso endOffset <= endPosition then SOME (location, child) else case find(child, Right) of NONE => NONE | SOME next => findChild(next()) in case findChild(child()) of NONE => lastParsetree (* In this *) | SOME child => navigateTo(searchLocation, SOME child) end | NONE => lastParsetree (* No children. *) end else (* Must go out. *) ( case find(tree, Up) of SOME p => navigateTo(searchLocation, SOME(p())) | NONE => NONE (* Not found *) ) end (* Main protocol loop. *) fun runProtocol currentCompilation = let (* Return the location of the given tree. *) fun treeLocation NONE = {startOffset = 0, endOffset = 0} | treeLocation (SOME ({startPosition, endPosition, ...}, _)) = {startOffset = startPosition, endOffset = endPosition} in case readRequest () of PropertyRequest { requestId: string, parseTreeId: string, location } => let (* Properties of selected node. *) (* Get the current parse tree and check the ID matches *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (commands, location) = if parseTreeId = currentParseID then let val newTree = navigateTo(location, lastParsetree) (* Update the last tree if it's still valid. *) val () = updateLastParse(currentParseID, newTree) val commands = case newTree of NONE => [] | (SOME(_, tree)) => let open PolyML fun printCode(PTparent _, rest) = "U" :: rest | printCode(PTpreviousSibling _, rest) = "P" :: rest | printCode(PTnextSibling _, rest) = "N" :: rest | printCode(PTfirstChild _, rest) = "C" :: rest | printCode(PTtype _, rest) = "T" :: rest | printCode(PTdeclaredAt _, rest) = "I" :: rest | printCode(PTopenedAt _, rest) = "J" :: rest | printCode(PTstructureAt _, rest) = "S" :: rest | printCode(PTreferences(_, _::_), rest) = "V" :: rest (* Only include references if there is at least one local reference. *) | printCode(PTreferences(_, []), rest) = rest | printCode(PTprint _, rest) = rest | printCode(PTbreakPoint _, rest) = rest | printCode(PTcompletions _, rest) = rest | printCode(PTdefId _, rest) = rest | printCode(PTrefId _, rest) = rest in List.foldl printCode [] tree end in (commands, treeLocation newTree) end else ([], { startOffset = 0, endOffset = 0 }) (* Wrong ID. *) in sendResponse( PropertyResponse { requestId = requestId, parseTreeId = currentParseID, location = location, commands = commands }); runProtocol currentCompilation end | MoveRequest { requestId, parseTreeId, location, direction } => let (* Get location after a move relative to a selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val newLocation = if parseTreeId = currentParseID then let (* Move to the given location, then move in the required direction. *) val newTree = case navigateTo(location, lastParsetree) of NONE => NONE | SOME(location, tree) => let open PolyML fun find([], _) = (location, tree) (* No change *) | find(PTparent p :: _, DirUp) = p() | find(PTpreviousSibling p :: _, DirLeft) = p() | find(PTnextSibling p :: _, DirRight) = p() | find(PTfirstChild p :: _, DirDown) = p() | find(_ :: tl, dir) = find (tl, dir) in SOME(find(tree, direction)) end (* Update the last tree if it's still valid. *) val () = updateLastParse(currentParseID, newTree) in treeLocation newTree (* Return the location of the updated tree. *) end else { startOffset = 0, endOffset = 0 } (* *) in sendResponse( MoveResponse { requestId = requestId, parseTreeId = currentParseID, location = newLocation }); runProtocol currentCompilation end | TypeRequest { requestId, parseTreeId, location } => let (* Type of value at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (typeRes, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) (* If it has a type return it. *) val typeRes = case newTree of NONE => NONE | (SOME(_, tree)) => ( (* Print the type if it's there. Don't include any mark-up. *) (* TODO: This uses the global name space to find types and structures. It really should use the local name space but that requires adding an environment to the parse tree. *) case List.find (fn (PolyML.PTtype _) => true | _ => false) tree of SOME(PolyML.PTtype t) => SOME(PolyML.NameSpace.Values.printType(t, 100, SOME PolyML.globalNameSpace)) | _ => NONE ) in (typeRes, treeLocation newTree) end else (NONE, { startOffset = 0, endOffset = 0 }) in sendResponse( TypeResponse { requestId = requestId, parseTreeId = currentParseID, location = location, typeRes = typeRes }); runProtocol currentCompilation end | DecRequest { requestId, parseTreeId, location, decType } => let (* Information about declaration location of identifier at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (decLocation, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) val decLocation = (* If it has the right kind of property return it. *) case newTree of NONE => NONE | (SOME(_, tree)) => let open PolyML val getLoc = case decType of DecLocal => (fn (PTdeclaredAt p) => SOME p | _ => NONE) | DecOpen => (fn (PTopenedAt p) => SOME p | _ => NONE) | DecParent => (fn (PTstructureAt p) => SOME p | _ => NONE) (* Seatch in the properties of the current node for the property we want. *) fun findLoc [] = NONE | findLoc (hd::tl) = case getLoc hd of SOME location => SOME location | NONE => (* Keep trying. *) findLoc tl in findLoc tree end in (decLocation, treeLocation newTree) end else (NONE, { startOffset = 0, endOffset = 0 }) in sendResponse( DecResponse { requestId = requestId, parseTreeId = currentParseID, location = location, decLocation = decLocation }); runProtocol currentCompilation end | RefRequest { requestId, parseTreeId, location } => let (* Type of value at selected node. *) val (_, lastParsetree, currentParseID) = getCurrentParse() val (references, location) = if parseTreeId = currentParseID then let (* Move to the required location. *) val newTree = navigateTo(location, lastParsetree) val () = updateLastParse(currentParseID, newTree) (* Find the local references. *) val references = case newTree of NONE => [] | SOME(_, tree) => ( case List.find (fn (PolyML.PTreferences _) => true | _ => false) tree of SOME(PolyML.PTreferences(_, l)) => List.map (fn {startPosition, endPosition, ...} => { startOffset=startPosition, endOffset=endPosition}) l | _ => [] ) in (references, treeLocation newTree) end else ([], { startOffset = 0, endOffset = 0 }) in sendResponse( RefResponse { requestId = requestId, parseTreeId = currentParseID, location = location, references = references }); runProtocol currentCompilation end | CompileRequest { requestId, fileName, startPosition, preludeCode, sourceCode } => (* Unlike the other requests this is done asynchronously. *) let fun compileThread () = let type errorMsg = { message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } (* Even success may include warning messages. *) datatype compileResult = Success | Exception of exn | Interrupted | Errors local open PolyML.NameSpace (* Put in the results without printing. *) fun resultFun { fixes: (string * Infixes.fixity) list, values: (string * Values.value) list, structures: (string * Structures.structureVal) list, signatures: (string * Signatures.signatureVal) list, functors: (string * Functors.functorVal) list, types: (string * TypeConstrs.typeConstr) list} = let open PolyML in List.app (#enterFix globalNameSpace) fixes; List.app (#enterType globalNameSpace) types; List.app (#enterSig globalNameSpace) signatures; List.app (#enterStruct globalNameSpace) structures; List.app (#enterFunct globalNameSpace) functors; List.app (#enterVal globalNameSpace) values end in (* Compile the prelude. Simply returns true if it succeeded and false on any error. Note: Unlike the main compilation this is run with the interlock held and interrupts deferred. *) fun compilePreludeString stringInput: string option = let val stringStream = TextIO.openString stringInput fun compilerResultFun (_, codeOpt) = case codeOpt of SOME code => (fn () => resultFun(code())) | NONE => raise Fail "Static Errors" fun compilerLoop () = (* Compile each "program" until either we get to the end or an exception. *) if TextIO.endOfStream stringStream then NONE (* Reached the end of the input without error. *) else let (* Compile the code and get the result. *) open PolyML PolyML.Compiler val (code, result) = (PolyML.compiler(fn () => TextIO.input1 stringStream, [CPOutStream TextIO.print, CPCompilerResultFun compilerResultFun]), NONE) handle exn => (fn() => (), SOME(exnMessage exn)) in case result of NONE => ( (* No exception in compiler: run the code and check that it runs successfully. *) case ((code(); NONE) handle exn => SOME(exnMessage exn)) of NONE => compilerLoop () (* Continue. *) | exn => exn ) | error => error end fun runloop () = let val res = compilerLoop() in (* The prelude may update the current parse tree. *) case !parseTree of (_, []) => lastParsetree := NONE | (_, hd :: _) => lastParsetree := SOME hd; res end in (* This is run with the lock held. *) withLock runloop end (* Compile the main source code. *) fun compileString(stringInput, startPosition) = let val errorList = ref [] val stringPosition = ref 0 val stringSize = String.size stringInput val resultTrees : PolyML.parseTree list ref = ref [] val lastTreePosition = ref 0 fun readIn () = let val posn = ! stringPosition in if posn >= stringSize then NONE else SOME(String.sub(stringInput, posn)) before (stringPosition := posn+1) end (* We need to define our own compilerResultFun in order to capture the parse trees. *) fun compilerResultFun (parsetree, codeOpt) = ( (* Add the parsetree to the list. Record this as the position of the last valid tree. *) case parsetree of SOME pt => (resultTrees := ! resultTrees @ [pt]; lastTreePosition := !stringPosition) | NONE => (); (* Not if parse failed. *) case codeOpt of SOME code => (fn () => resultFun(code())) | NONE => raise Fail "Static Errors" ) fun compilerLoop () = (* Compile each "program" until either we get to the end or an exception. *) if ! stringPosition >= stringSize then Success (* Reached the end of the input without error. *) else let open PolyML PolyML.Compiler val (code, result) = (PolyML.compiler(readIn, [CPOutStream TextIO.print, CPLineOffset (fn () => startPosition + !stringPosition), CPErrorMessageProc (fn msg => errorList := !errorList @ [msg]), CPCompilerResultFun compilerResultFun, CPFileName fileName, CPRootTree (toplevelParseTree resultTrees)]), Success) handle Fail _ => (fn() => (), Errors) | _ (* E.g. Interrupted *) => (fn() => (), Interrupted) in case result of Success => (* Compilation succeeded. *) ( (* Run the code. If it raised an exception pass that back. *) case (code(); Success) handle exn => Exception exn of Success => compilerLoop () (* Continue. *) | fault => fault ) | error => error end in (compilerLoop (), startPosition + !lastTreePosition, ! resultTrees, ! errorList) end end in if (* First run the prelude. If there are any errors report them and stop. *) case compilePreludeString preludeCode of NONE => true (* Succeeded - continue *) | SOME preludeError => (* Error - stop *) let (* Leave the parse tree unchanged. *) val (_, _, currentId) = getCurrentParse() in sendResponse( CompilerResponse { requestId = requestId, parseTreeId = currentId, finalOffset = startPosition, result = PreludeFail preludeError }); false end then (* We can do the main compilation. *) let local open Thread.Thread in (* The rest of this code is interruptible TODO: Multiple interrupts could result in not sending a result packet. *) val () = setAttributes [EnableBroadcastInterrupt true, InterruptState InterruptAsynch] end; val (result, finalPosition, resultTrees, errors) = compileString(sourceCode, startPosition) fun makeErrorPacket {message: PolyML.pretty, hard: bool, location, ...} = { hardError = hard, location = location, message = message } val errorPackets = List.map makeErrorPacket errors val compileResult = case result of Success => Succeeded errorPackets (* May be warning messages. *) | Exception exn => let open PolyML val exLoc = case exceptionLocation exn of SOME loc => [ContextLocation loc] | NONE => [] val exceptionString = (PrettyBlock(0, false, exLoc, [ prettyRepresentation(exn, !PolyML.Compiler.printDepth) ])) in RuntimeException(exceptionString, errorPackets) end | Interrupted => CompileCancelled errorPackets | Errors => CompileFail errorPackets (* Update the tree unless parsing failed and we don't have one. *) val parseTreeId = case resultTrees of [] => #3 (getCurrentParse()) (* Return existing tree. *) | _ => (setParseTree(resultTrees, requestId); requestId) in (* Send the response. *) sendResponse( CompilerResponse { requestId = requestId, parseTreeId = parseTreeId, finalOffset = finalPosition, result = compileResult }) end else () (* Prelude failed. *) end (* compileThread *) open Thread.Thread (* First see if the last compilation has terminated. Starting a new compilation before the previous one has finished is really a protocol error. *) val isStillRunning = case currentCompilation of NONE => false | SOME (_, lastCompileThread) => isActive lastCompileThread in if isStillRunning then sendResponse( CompilerResponse { requestId = requestId, parseTreeId = #3 (getCurrentParse()), finalOffset = startPosition, result = PreludeFail "Thread still running" }) else let (* The compile thread is run with interrupts deferred initially. *) val thread = fork(compileThread, [InterruptState InterruptDefer]) in runProtocol (SOME(requestId, thread)) end end | KillRequest { requestId: string } => (* Kill compilation. *) ( case currentCompilation of NONE => () (* No compilation. *) | SOME (id, thread) => if requestId = id then Thread.Thread.interrupt thread else () (* Different ID running. *); runProtocol currentCompilation ) | UnknownRequest req => (* Respond with an empty response. *) ( sendResponse(UnknownResponse req); runProtocol currentCompilation ) end in let (* Turn off interrupts for the interface thread. *) open Thread.Thread in setAttributes[EnableBroadcastInterrupt false, InterruptState InterruptDefer] end; sendStartedMessage(); runProtocol NONE (* No compilation. *) end (* runIDEProtocol. *) in structure PolyML = struct (* This is the root function to run the Poly/ML top level. *) fun rootFunction () : unit = let val argList = CommandLine.arguments() fun rtsRelease() = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (10, ()) fun rtsHelp() = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (19, ()) val gitVersion = case RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific (9, ()) of "" => "" | s => " (Git version " ^ s ^ ")" fun switchOption option = List.exists(fn s => s = option) argList in if switchOption "-v" then (* -v option : Print version information and exit *) print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, " RTS version: ", rtsRelease(), gitVersion, "\n"]) else if switchOption "--help" then (* --help option: Print argument information and exit. *) ( print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, gitVersion, "\n"]); print "Compiler arguments:\n"; print "\n"; print "-v Print the version of Poly/ML and exit\n"; print "--help Print this message and exit\n"; print "-q Suppress the start-up message and turn off printing of results\n"; print "-i Interactive mode. Default if input is from a terminal\n"; print "--use FILE Executes 'use \"FILE\";' before the ML shell starts\n"; print "--eval STRING Compiles and executes STRING as ML before the ML shell starts\n"; print "--error-exit Exit shell on unhandled exception\n"; print "--with-markup Include extra mark-up information when printing\n"; print "--ideprotocol[=v2] Run the IDE communications protocol\n"; print "--script The input is a script. Skips the first line if it begins with #!"; print "\nRun time system arguments:\n"; print (rtsHelp()) ) else if switchOption "--ideprotocol" then runIDEProtocol () (* Run the IDE communication protocol. *) else if switchOption "--script" then let (* The last argument is the file name. Open it but skip the first line if it's #!. The rest of this code is largely copied from PolyML.use. *) val fileName = List.last argList (* We know there's at least one *) open TextIO val inStream = getInstream(TextIO.openIn fileName) open StreamIO val stream = ref inStream val lineNo = ref 1 val (start, _) = inputN(inStream, 2) fun getChar () = case input1 (! stream) of NONE => NONE | SOME (eoln as #"\n", strm) => ( lineNo := !lineNo + 1; stream := strm; SOME eoln ) | SOME(c, strm) => (stream := strm; SOME c) val () = if start = "#!" then while (case getChar () of NONE => false | SOME #"\n" => false | SOME _ => true) do () else () val () = PolyML.print_depth 0 (* Quieten. *) in while not (endOfStream(!stream)) do let open PolyML.Compiler val code = PolyML.compiler(getChar, [CPFileName fileName, CPLineNo(fn () => !lineNo)]) handle exn => ( closeIn(!stream); PolyML.Exception.reraise exn ) in code() handle exn => ( (* Report exceptions in running code. *) TextIO.print ("Exception- " ^ exnMessage exn ^ " raised\n"); input1 (! stream); PolyML.Exception.reraise exn ) end; (* Normal termination: close the stream. *) closeIn (! stream) end else (* Enter normal Poly/ML top-level. *) let open Signal val () = if switchOption "-q" then PolyML.print_depth 0 else print (String.concat ["Poly/ML ", PolyML.Compiler.compilerVersion, gitVersion, "\n"]); (* Set up a handler for SIGINT if that is currently set to SIG_DFL. If a handler has been set up by an initialisation function don't replace it. *) val () = case signal(2, SIG_IGN) of SIG_IGN => () | SIG_DFL => (signal(2, SIG_HANDLE(fn _ => Thread.Thread.broadcastInterrupt())); ()) | oldHandle => (signal(2, oldHandle); ()) fun tryUseFileArguments [] = () (* done successfully *) | tryUseFileArguments ["--use"] = ( print "'--use' requires a filename to be given as the next argument.\n"; OS.Process.exit OS.Process.failure ) | tryUseFileArguments ("--use" :: filenameArg :: moreArgs) = ( PolyML.use filenameArg handle _ => ( print("Error trying to use the file: '" ^ filenameArg ^ "'\n"); OS.Process.exit OS.Process.failure ); tryUseFileArguments moreArgs ) | tryUseFileArguments ["--eval"] = ( print "'--eval' requires a string to be given as the next argument.\n"; OS.Process.exit OS.Process.failure ) | tryUseFileArguments ("--eval" :: useString :: moreArgs) = let (* Compile and execute commands from the string. *) val p = ref 0 in while !p < size useString do let fun getChar() = if !p >= size useString then NONE else SOME(String.sub(useString, !p)) before p := !p+1 val code = PolyML.compiler(getChar, []) handle _ => OS.Process.exit OS.Process.failure in code() handle exn => ( (* Report exceptions in running code. *) print ("Exception- " ^ exnMessage exn ^ " raised\n"); OS.Process.exit OS.Process.failure ) end; tryUseFileArguments moreArgs end | tryUseFileArguments (_ :: args) = tryUseFileArguments args in tryUseFileArguments argList; PolyML.shell (); OS.Process.exit OS.Process.success (* Run any "atExit" functions and then quit. *) end end; structure IDEInterface = struct val parseTree = parseTree val runIDEProtocol = runIDEProtocol end; open PolyML (* Add this to the PolyML structure. *) end end; polyml-5.6/basis/Universal.ML000066400000000000000000000045771265146633400162320ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Universal :> sig type universal type 'a tag val tag : unit -> 'a tag val tagIs : 'a tag -> universal -> bool val tagInject : 'a tag -> 'a -> universal val tagProject : 'a tag -> universal -> 'a end = struct (* The universal type is based on exn which provides a tagged union. We use opaque signature matching to create a different type. *) type universal = exn type 'a tag = { is: universal -> bool, inject: 'a -> universal, project: universal -> 'a }; (* The Match exception is created in the General structure in the basis library which hasn't been built yet. *) fun tag () : 'a tag = let exception E of 'a; in { inject = fn x => E x, project = fn E x => x | _ => raise RunCall.Match, is = fn E _ => true | _ => false } end ; val tagIs : 'a tag -> universal -> bool = #is val tagInject : 'a tag -> 'a -> universal = #inject val tagProject : 'a tag -> universal -> 'a = #project end; (* This code will test the above structure datatype t = T of int ; datatype x = X of string ; val {is=ist,inject=injectT:t->universal,project=projectT} = tag(); val {is=isx,inject=injectX:x->universal,project=projectX} = tag(); val a = injectT (T 42) ; val b = injectT (T 24) ; val c = injectX (X "hello") ; val d = injectX (X "mike") ; map ist [a,b,c,d] ; map isx [a,b,c,d] ; projectT a ; projectT b ; projectT c ; projectT d ; projectX a ; projectX b ; projectX c ; projectX d ; *) polyml-5.6/basis/UniversalArray.ML000066400000000000000000000053721265146633400172230ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure UniversalArray :> sig type universal = Universal.universal; type 'a tag = 'a Universal.tag; type univArray; val univArray: int -> univArray; val update: univArray * 'a tag * string * 'a -> unit; val sub: univArray * 'a tag * string -> 'a option; val delete: univArray * 'a tag * string -> unit; val fold: (string * universal * 'a -> 'a) -> 'a -> univArray-> 'a; end = struct open HashArray; open Universal; type universal = universal type 'a tag = 'a tag; datatype univArray = Table of universal list hash fun univArray n = Table (hash n); fun op sub (Table tab, t:'a tag, name:string) : 'a option = let fun search [] = NONE | search (H::T) = if tagIs t H then SOME (tagProject t H) else search T; in case HashArray.sub (tab, name) of NONE => NONE | SOME t => search t end; fun update (Table tab, t:'a tag, name:string, v:'a) : unit = let val u = tagInject t v; (* If there is already an entry we add it to the list, otherwise we start a new list. *) fun search [] = [u] | search (H::T) = if tagIs t H then u :: T else H :: search T; val newList = case HashArray.sub (tab, name) of SOME v => search v | NONE => [u] in HashArray.update (tab, name, newList) end; fun delete (Table tab, t:'a tag, name:string) : unit = let fun search [] = [] | search (H::T) = if tagIs t H then T else H :: search T; in case HashArray.sub (tab, name) of SOME l => HashArray.update (tab, name, search l) | NONE => () end; fun fold f init (Table t) = HashArray.fold (fn (s, l, i) => List.foldl (fn (x,y) => f(s, x, y)) i l) init t end (* UniversalArray *); polyml-5.6/basis/Unix.sml000066400000000000000000000212401265146633400154520ustar00rootroot00000000000000(* Title: Standard Basis Library: Unix structure and signature. Author: David Matthews Copyright David Matthews 2000,2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature UNIX = sig type ('a,'b) proc type signal datatype exit_status = W_EXITED | W_EXITSTATUS of Word8.word | W_SIGNALED (* sic *) of signal | W_STOPPED of signal val fromStatus : OS.Process.status -> exit_status val executeInEnv : string * string list * string list -> ('a, 'b) proc val execute : string * string list -> ('a, 'b) proc val textInstreamOf : (TextIO.instream, 'a) proc -> TextIO.instream val binInstreamOf : (BinIO.instream, 'a) proc -> BinIO.instream val textOutstreamOf : ('a, TextIO.outstream) proc -> TextIO.outstream val binOutstreamOf : ('a, BinIO.outstream) proc -> BinIO.outstream val streamsOf : (TextIO.instream, TextIO.outstream) proc -> TextIO.instream * TextIO.outstream val reap : ('a, 'b) proc -> OS.Process.status val kill : ('a, 'b) proc * signal -> unit val exit : Word8.word -> 'a end; structure Unix :> sig (* We have to copy the signature since we can't establish the connection between exit_status and Posix.Process.exit_status with a "where type". *) type ('a,'b) proc type signal = Posix.Signal.signal datatype exit_status = datatype Posix.Process.exit_status val fromStatus : OS.Process.status -> exit_status val executeInEnv : string * string list * string list -> ('a, 'b) proc val execute : string * string list -> ('a, 'b) proc val textInstreamOf : (TextIO.instream, 'a) proc -> TextIO.instream val binInstreamOf : (BinIO.instream, 'a) proc -> BinIO.instream val textOutstreamOf : ('a, TextIO.outstream) proc -> TextIO.outstream val binOutstreamOf : ('a, BinIO.outstream) proc -> BinIO.outstream val streamsOf : (TextIO.instream, TextIO.outstream) proc -> TextIO.instream * TextIO.outstream val reap : ('a, 'b) proc -> OS.Process.status val kill : ('a, 'b) proc * signal -> unit val exit : Word8.word -> 'a end = struct type ('a,'b) proc = { pid: Posix.Process.pid, infd: Posix.IO.file_desc, outfd: Posix.IO.file_desc, (* We have to remember the result status. *) result: OS.Process.status option ref } type signal = Posix.Signal.signal datatype exit_status = datatype Posix.Process.exit_status val fromStatus = Posix.Process.fromStatus fun kill({pid, ... }: ('a, 'b) proc, signal) = Posix.Process.kill(Posix.Process.K_PROC pid, signal) (* Create a new process running a command and with pipes connecting the standard input and output. The command is supposed to be an executable and we should raise an exception if it is not. Since the exece is only done in the child we need to test whether we have an executable at the beginning. The definition does not say whether the first of the user-supplied arguments includes the command or not. Assume that only the "real" arguments are provided and pass the last component of the command name in the exece call. *) fun executeInEnv (cmd, args, env) = let open Posix (* Test first for presence of the file and then that we have correct access rights. *) val s = FileSys.stat cmd (* Raises SysErr if the file doesn't exist. *) val () = if not (FileSys.ST.isReg s) orelse not (FileSys.access(cmd, [FileSys.A_EXEC])) then raise OS.SysErr(OS.errorMsg Error.acces, SOME Error.acces) else () val toChild = IO.pipe() and fromChild = IO.pipe() in case Process.fork() of NONE => (* In the child *) (( (* Should really clean up the signals here and turn off timers. *) (* Close the unwanted ends of the pipes and set the required ends up as stdin and stdout. *) IO.close(#outfd toChild); IO.close(#infd fromChild); IO.dup2{old= #infd toChild, new=FileSys.wordToFD 0w0}; IO.dup2{old= #outfd fromChild, new= FileSys.wordToFD 0w1}; IO.close(#infd toChild); IO.close(#outfd fromChild); (* Run the command. *) Process.exece(cmd, OS.Path.file cmd :: args, env); (* If we get here the exec must have failed - terminate this process. We're supposed to set the error code to 126 in this case. *) Process.exit 0w126 ) handle _ => Process.exit 0w126) | SOME pid => (* In the parent *) ( IO.close(#infd toChild); IO.close(#outfd fromChild); {pid=pid, infd= #infd fromChild, outfd= #outfd toChild, result = ref NONE} ) end fun execute (cmd, args) = executeInEnv(cmd, args, Posix.ProcEnv.environ()) local (* Internal function to get the preferred buffer size. *) val doIo = RunCall.run_call3 RuntimeCalls.POLY_SYS_io_dispatch in fun sys_get_buffsize (strm: OS.IO.iodesc): int = doIo(15, strm, 0) end fun textInstreamOf {infd, ...} = let val n = Posix.FileSys.fdToIOD infd val textPrimRd = LibraryIOSupport.wrapInFileDescr {fd=n, name="TextPipeInput", initBlkMode=true} val streamIo = TextIO.StreamIO.mkInstream(textPrimRd, "") in TextIO.mkInstream streamIo end fun textOutstreamOf {outfd, ...} = let val n = Posix.FileSys.fdToIOD outfd val buffSize = sys_get_buffsize n val textPrimWr = LibraryIOSupport.wrapOutFileDescr{fd=n, name="TextPipeOutput", appendMode=false, initBlkMode=true, chunkSize=buffSize} (* Construct a stream. *) val streamIo = TextIO.StreamIO.mkOutstream(textPrimWr, IO.LINE_BUF) in TextIO.mkOutstream streamIo end fun binInstreamOf {infd, ...} = let val n = Posix.FileSys.fdToIOD infd val binPrimRd = LibraryIOSupport.wrapBinInFileDescr{fd=n, name="BinPipeInput", initBlkMode=true} val streamIo = BinIO.StreamIO.mkInstream(binPrimRd, Word8Vector.fromList []) in BinIO.mkInstream streamIo end fun binOutstreamOf {outfd, ...} = let val n = Posix.FileSys.fdToIOD outfd val buffSize = sys_get_buffsize n val binPrimWr = LibraryIOSupport.wrapBinOutFileDescr{fd=n, name="BinPipeOutput", appendMode=false, chunkSize=buffSize, initBlkMode=true} (* Construct a stream. *) val streamIo = BinIO.StreamIO.mkOutstream(binPrimWr, IO.LINE_BUF) in BinIO.mkOutstream streamIo end fun streamsOf p = (textInstreamOf p, textOutstreamOf p) (* Internal function - inverse of Posix.Process.fromStatus. *) local val doCall = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific in fun toStatus W_EXITED: OS.Process.status = doCall(16, (1, 0)) | toStatus(W_EXITSTATUS w) = doCall(16, (1, Word8.toInt w)) | toStatus(W_SIGNALED s) = doCall(16, (2, SysWord.toInt(Posix.Signal.toWord s))) | toStatus(W_STOPPED s) = doCall(16, (3, SysWord.toInt(Posix.Signal.toWord s))) end fun reap {result = ref(SOME r), ...} = r | reap(p as {pid, infd, outfd, result}) = let val () = Posix.IO.close infd; val () = Posix.IO.close outfd; val (_, status) = Posix.Process.waitpid(Posix.Process.W_CHILD pid, []) in (* If the process is only stopped we need to wait again. *) case status of W_STOPPED _ => reap p | _ => let val s = toStatus status in result := SOME s; s end end fun exit w = OS.Process.exit(toStatus (W_EXITSTATUS w)) end; polyml-5.6/basis/UnixSock.sml000066400000000000000000000054401265146633400162760ustar00rootroot00000000000000(* Title: Standard Basis Library: Unix socket structure and signature. Author: David Matthews Copyright David Matthews 2000, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: Checked. No change except that it seems I'd commented out some of the type equivalences. *) signature UNIX_SOCK = sig type unix type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF : Socket.AF.addr_family val toAddr : string -> sock_addr val fromAddr : sock_addr -> string structure Strm : sig val socket : unit -> 'mode stream_sock val socketPair : unit -> 'mode stream_sock * 'mode stream_sock end structure DGrm : sig val socket : unit -> dgram_sock val socketPair : unit -> dgram_sock * dgram_sock end end; structure UnixSock : UNIX_SOCK = struct abstype unix = ABSTRACT with end; type 'sock_type sock = (unix, 'sock_type) Socket.sock type 'mode stream_sock = 'mode Socket.stream sock type dgram_sock = Socket.dgram sock type sock_addr = unix Socket.sock_addr val unixAF : Socket.AF.addr_family = case Socket.AF.fromString "UNIX" of NONE => raise OS.SysErr("Missing address family", NONE) | SOME s => s local val doCall: int * string -> sock_addr = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun toAddr s = doCall(56, s) end local val doCall: int * sock_addr -> string = RunCall.run_call2 RuntimeCalls.POLY_SYS_network in fun fromAddr s = doCall(57, s) end structure Strm = struct fun socket() = GenericSock.socket(unixAF, Socket.SOCK.stream) fun socketPair() = GenericSock.socketPair(unixAF, Socket.SOCK.stream) end structure DGrm = struct fun socket() = GenericSock.socket(unixAF, Socket.SOCK.dgram) fun socketPair() = GenericSock.socketPair(unixAF, Socket.SOCK.dgram) end end; polyml-5.6/basis/Vector.sml000066400000000000000000000425231265146633400160000ustar00rootroot00000000000000(* Title: Standard Basis Library: Vector Structure Author: David Matthews Copyright David Matthews 1999, 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: updated. Added VectorSlice and VECTOR_SLICE. *) signature VECTOR = sig eqtype 'a vector val maxLen : int val fromList : 'a list -> 'a vector val tabulate : (int * (int -> 'a)) -> 'a vector val length : 'a vector -> int val sub : ('a vector * int) -> 'a val update: 'a vector * int * 'a -> 'a vector val concat : 'a vector list -> 'a vector val mapi : ((int * 'a) -> 'b) -> 'a vector -> 'b vector val map : ('a -> 'b) -> 'a vector -> 'b vector val appi : ((int * 'a) -> unit) -> 'a vector -> unit val app : ('a -> unit) -> 'a vector -> unit val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldl : (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a vector -> 'b val findi: (int * 'a -> bool) -> 'a vector -> (int * 'a) option val find: ('a -> bool) -> 'a vector -> 'a option val exists: ('a -> bool) -> 'a vector -> bool val all: ('a -> bool) -> 'a vector -> bool val collate: ('a * 'a -> order) -> 'a vector * 'a vector -> order end; local open RuntimeCalls (* Inherit the definition of vector in the initial environment. We have to declare vector in the initial environment in order for equality to work correctly. *) (* It would be simpler to be able to define these as functions to or from 'a vector but that gives error messages about free type variables. *) val System_lock: word -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_loadw: word*word->word = RunCall.run_call2 POLY_SYS_load_word; val System_setw: word * word * word -> unit = RunCall.run_call3 POLY_SYS_assign_word; val System_length: word -> word = RunCall.run_call1 POLY_SYS_get_length; val System_zero: word = RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_nullvector; (* A zero word. *) val System_move_words: word*int*word*int*int->unit = RunCall.run_call5 POLY_SYS_move_words val vecAsWord: 'a vector -> word = RunCall.unsafeCast and wordAsVec: word -> 'a vector = RunCall.unsafeCast val intAsWord: int -> word = RunCall.unsafeCast and wordAsInt: word -> int = RunCall.unsafeCast local val System_alloc: int*word*word->word = RunCall.run_call3 POLY_SYS_alloc_store in (* All the arrays are initially created containing zeros and then initialised. *) fun alloc len = System_alloc(len, 0wx40, 0w0) end fun unsafeSub(v: 'a vector, i: int): 'a = RunCall.unsafeCast(System_loadw (vecAsWord v, intAsWord i)) and unsafeUpdate(v: 'a vector, i: int, new: 'a): unit = System_setw (vecAsWord v, intAsWord i, RunCall.unsafeCast new); in structure Vector: VECTOR = struct (* N.B. This implementation of vectors is implicitly used in Array.extract. Don't change this implementation without also changing that. It's also used in the interface to the RTS in OS.Poll and Socket.select. *) type 'a vector = 'a vector (* The maximum size of a vector is the maximum object size we can allocate. This is one more than the maximum size of an array. *) val maxLen = RunCall.unsafeCast LibrarySupport.maxAllocation infix 9 sub (* For what it's worth *) (* Lock the arrays after they have been created. All this does is switch off the "mutable" bit. This does not prevent updating of itself, the signature does that by removing "update", but improves g.c. performance and causes equality to check for value equality not pointer equality. *) val listLength = length; (* Pick this up from the prelude. *) fun length v = wordAsInt(System_length(vecAsWord v)); fun op sub (vec:'a vector, i: int): 'a = let val v = vecAsWord vec in if not (LibrarySupport.isShortInt i) orelse intAsWord i >= System_length v then raise General.Subscript else RunCall.unsafeCast(System_loadw (v, intAsWord i)) end (* Create a vector from a list. We have to treat an empty list specially because we don't allow zero sized heap objects. *) fun fromList [] : 'a vector = wordAsVec System_zero (* Must not try to lock it. *) | fromList (l : 'a list) : 'a vector = let val length = listLength l; val () = if length >= maxLen then raise General.Size else () (* Make a vector initialised to zero. *) val vec = alloc length; (* Copy the list elements into the vector. *) fun init (v, i, a :: l) = ( System_setw(v, intAsWord i, RunCall.unsafeCast a); init(v, i + 1, l) ) | init (_, _, []) = (); in init(vec, 0, l); System_lock vec; wordAsVec vec end fun tabulate (0, _) : 'a vector = wordAsVec System_zero (* Must not try to lock it. *) | tabulate (length: int , f : int->'a): 'a vector = let val vec = if length > 0 andalso length < maxLen then alloc length else raise General.Size; (* Initialise it to the function values. *) fun init i = if length <= i then () else (System_setw(vec, intAsWord i, RunCall.unsafeCast(f i)); init(i+1)) in init 0; System_lock vec; wordAsVec vec end fun concat [] = wordAsVec System_zero | concat [v] = v (* Handle special cases to reduce copying. *) | concat l = let (* Calculate the total length *) fun total [] i = i | total (h::t) i = total t (i+length h) val total_len = total l 0 in if total_len = 0 then wordAsVec System_zero else if total_len >= maxLen then raise General.Size else let (* Allocate a new vector. *) val new_vec = alloc total_len fun copy_list [] _ = () | copy_list (h::t) j = let val v = vecAsWord h val src_len = length h in System_move_words(v, 0, new_vec, j, src_len); copy_list t (j+src_len) end in copy_list l 0; System_lock new_vec; wordAsVec new_vec end end fun map (f: 'a->'b) (vec: 'a vector): 'b vector = let val len = length vec in if len = 0 then wordAsVec System_zero else let (* Allocate a new vector. *) val new_vec = alloc len val newResult = wordAsVec new_vec fun domap i = if i >= len then () else (unsafeUpdate(newResult, i, f(unsafeSub(vec, i))); domap(i+1)) in domap 0; System_lock new_vec; newResult end end fun mapi (f: int*'a->'b) (vec:'a vector): 'b vector = let val len = length vec in if len = 0 then wordAsVec System_zero else let (* Allocate a new vector. *) val new_vec = alloc len val newResult = wordAsVec new_vec fun domap i = if i >= len then () else (unsafeUpdate(newResult, i, f(i, unsafeSub(vec, i))); domap(i+1)) in domap 0; System_lock new_vec; newResult end end (* Create a new vector with the ith element replaced by c *) fun update(v: 'a vector, i , c) = if i < 0 orelse i >= length v then raise Subscript else mapi (fn (j, s) => if j = i then c else s) v (* Create the other functions. *) structure VectorOps = PolyVectorOperations( struct type 'a vector = 'a vector fun length v = System_length(vecAsWord v) local val u = unsafeSub in fun unsafeSub (v: 'a vector, i: word) = u(v, wordAsInt i) end fun unsafeSet _ = raise Fail "Should not be called" end); open VectorOps; local (* Install the pretty printer for vectors *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) (printElem: 'a * int -> PolyML.pretty) (x: 'a vector) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( printElem(w, d-1) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end (* Vector *) structure VectorSlice = struct datatype 'a slice = Slice of { vector: 'a vector, start: int, length: int }; fun length(Slice{length, ...}) = length fun op sub (Slice{vector, start, length}, i: int): 'a = if i < 0 orelse i >= length then raise General.Subscript else unsafeSub(vector, i+start) (* Create a slice from a vector. *) fun slice(vec: 'a vector, i: int, NONE) = let val len = Vector.length vec in if i >= 0 andalso i <= len then Slice{vector=vec, start=i, length=len-i} (* Length is rest of vector. *) else raise General.Subscript end | slice(vec: 'a vector, i: int, SOME l) = let val len = Vector.length vec in if i >= 0 andalso l >= 0 andalso i+l <= len then Slice{vector=vec, start=i, length=l} (* Length is as given. *) else raise General.Subscript end (* Slice from the whole vector. *) fun full v = Slice{vector=v, start=0, length=Vector.length v} (* Slice from existing slice *) fun subslice(Slice{vector, start, length}, i: int, NONE) = if i >= 0 andalso i <= length then Slice{vector=vector, start=i+start, length=length-i} (* Length is rest of array. *) else raise General.Subscript | subslice(Slice{vector, start, length}, i: int, SOME l) = if i >= 0 andalso l >= 0 andalso i+l <= length then Slice{vector=vector, start=i+start, length=l} (* Length is as given. *) else raise General.Subscript fun vector(Slice{vector, start, length}) = if length = 0 then wordAsVec System_zero (* Special case for zero *) else let (* Make a vector initialised to zero. *) val new_vec = alloc length in System_move_words(vecAsWord vector, start, new_vec, 0, length); System_lock new_vec; wordAsVec new_vec end fun base(Slice{vector, start, length}) = (vector, start, length) fun isEmpty(Slice{length, ...}) = length = 0 (* Return the first item of the slice and the rest of the slice. *) fun getItem(Slice{length=0, ...}) = NONE | getItem(Slice{vector, start, length}) = SOME(unsafeSub(vector, start), Slice{vector=vector, start=start+1, length=length-1}) fun concat [] = wordAsVec System_zero | concat l = let (* Calculate the total length *) fun total [] i = i | total (h::t) i = total t (i+length h) val total_len = total l 0 in if total_len = 0 then wordAsVec System_zero else let (* Allocate a new vector. *) val new_vec = alloc total_len fun copy_list [] _ = () | copy_list (Slice{vector, start, length}::t) j = ( System_move_words(vecAsWord vector, start, new_vec, j, length); copy_list t (j+length) ) in copy_list l 0; System_lock new_vec; wordAsVec new_vec end end fun map (f: 'a->'b) (Slice{vector:'a Vector.vector, start, length}): 'b Vector.vector = if length = 0 then wordAsVec System_zero else let (* Allocate a new vector. *) val new_vec = alloc length val newResult = wordAsVec new_vec fun domap i = if i >= length then () else (unsafeUpdate(newResult, i, f(unsafeSub(vector, i+start))); domap(i+1)) in domap 0; System_lock new_vec; newResult end fun mapi (f: int*'a->'b) (Slice{vector:'a Vector.vector, start, length}): 'b Vector.vector = if length = 0 then wordAsVec System_zero else let (* Allocate a new vector. *) val new_vec = alloc length val newResult = wordAsVec new_vec fun domap i = if i >= length then () else (unsafeUpdate(newResult, i, f(i, unsafeSub(vector, i+start))); domap(i+1)) in domap 0; System_lock new_vec; newResult end (* Create the other functions. *) structure VectorOps = PolyVectorOperations( struct type 'a vector = 'a slice fun length(Slice{length, ...}) = intAsWord length fun unsafeSub (Slice{vector, start, ...}, i) = RunCall.unsafeCast(System_loadw (vecAsWord vector, i + intAsWord start)) fun unsafeSet _ = raise Fail "Should not be called" end); open VectorOps; end (* VectorSlice *) end (* Local in end *); (* The VECTOR_SLICE signature refers to the Vector structure which complicates things. *) signature VECTOR_SLICE = sig type 'a slice val length : 'a slice -> int val sub : ('a slice * int) -> 'a val full: 'a Vector.vector -> 'a slice val slice: 'a Vector.vector * int * int option -> 'a slice val subslice: 'a slice * int * int option -> 'a slice val base: 'a slice -> 'a Vector.vector * int * int val vector: 'a slice -> 'a Vector.vector val concat : 'a slice list -> 'a Vector.vector val isEmpty: 'a slice -> bool val getItem: 'a slice -> ('a * 'a slice) option val appi : ((int * 'a) -> unit) -> 'a slice -> unit val app : ('a -> unit) -> 'a slice -> unit val mapi : ((int * 'a) -> 'b) -> 'a slice -> 'b Vector.vector val map : ('a -> 'b) -> 'a slice -> 'b Vector.vector val foldli : ((int * 'a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldri : ((int * 'a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldl : (('a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val foldr : (('a * 'b) -> 'b) -> 'b -> 'a slice -> 'b val findi: (int * 'a -> bool) -> 'a slice -> (int * 'a) option val find: ('a -> bool) -> 'a slice -> 'a option val exists: ('a -> bool) -> 'a slice -> bool val all: ('a -> bool) -> 'a slice -> bool val collate: ('a * 'a -> order) -> 'a slice * 'a slice -> order end; structure VectorSlice :> VECTOR_SLICE = VectorSlice; local open VectorSlice (* Install the pretty printer for vector slices *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) (printElem: 'a * int -> PolyML.pretty) (x: 'a slice) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( printElem(w, d-1) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end ; (* type 'a vector is available unqualified in the global basis. *) val vector : 'a list -> 'a vector = Vector.fromList; polyml-5.6/basis/VectorOperations.sml000066400000000000000000000146061265146633400200450ustar00rootroot00000000000000(* Title: Standard Basis Library: Vector and Array functor Copyright David C.J. Matthews 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* The MONO_ARRAY and MONO_VECTOR signatures contain a number of functions for operating over vectors and arrays. Many of these do not require bounds checking so they can be implemented without the checks. This functor provides basic implementations which can be overridden if necessary. unsafeSet is used only in the modify functions which are only exported from arrays. *) functor VectorOperations( type vector type elem val length: vector -> word val unsafeSub: vector * word -> elem val unsafeSet: vector * word * elem -> unit (* Array only *) ): sig val appi : ((int * elem) -> unit) -> vector -> unit val app : (elem -> unit) -> vector -> unit val foldli : ((int * elem * 'b) -> 'b) -> 'b -> vector -> 'b val foldri : ((int * elem * 'b) -> 'b) -> 'b -> vector -> 'b val foldl : ((elem * 'b) -> 'b) -> 'b -> vector -> 'b val foldr : ((elem * 'b) -> 'b) -> 'b -> vector -> 'b val modifyi : ((int * elem) -> elem) -> vector -> unit (* Array only *) val modify : (elem -> elem) -> vector -> unit (* Array only *) val findi: (int * elem -> bool) -> vector -> (int * elem) option val find: (elem -> bool) -> vector -> elem option val exists: (elem -> bool) -> vector -> bool val all: (elem -> bool) -> vector -> bool val collate: (elem * elem -> order) -> vector * vector -> order end = struct val wordAsInt: word -> int = RunCall.unsafeCast (* Apply a function to each element in turn *) fun appi f vec = let val len = length vec fun doapp j = if j >= len then () else (f(wordAsInt j, unsafeSub(vec, j)); doapp(j+0w1)) in doapp 0w0 end fun app f vec = let val len = length vec fun doapp j = if j >= len then () else (f(unsafeSub(vec, j)); doapp(j+0w1)) in doapp 0w0 end (* Fold a function over a array. *) (* foldl - increasing index *) fun foldl f init vec = let val len = length vec fun dofold j acc = if j >= len then acc else dofold (j+0w1) (f (unsafeSub(vec, j), acc)) in dofold 0w0 init end fun foldli f init vec = let val len = length vec fun dofold j acc = if j >= len then acc else dofold (j+0w1) (f (wordAsInt j, unsafeSub(vec, j), acc)) in dofold 0w0 init end (* foldr - decreasing index *) fun foldr f init vec = let val len = length vec fun dofold j acc = if j = 0w0 then acc else dofold (j-0w1) (f (unsafeSub(vec, j-0w1), acc)) in dofold len init end fun foldri f init vec = let val len = length vec fun dofold j acc = if j = 0w0 then acc else dofold (j-0w1) (f (wordAsInt(j-0w1), unsafeSub(vec, j-0w1), acc)) in dofold len init end (* Apply a function to each element in turn and update the array with the new values. *) fun modifyi f vec = let val len = length vec fun doupdate j = if j >= len then () else (unsafeSet(vec, j, f(wordAsInt j, unsafeSub(vec, j))); doupdate(j+0w1)) in doupdate 0w0 end fun modify f vec = let val len = length vec fun doupdate j = if j >= len then () else (unsafeSet(vec, j, f(unsafeSub(vec, j))); doupdate(j+0w1)) in doupdate 0w0 end (* Find a character that matches the predicate. *) fun findi pred vec = let val len = length vec fun dofind j = if j >= len then NONE else let val v = unsafeSub(vec, j) in if pred(wordAsInt j, v) then SOME (wordAsInt j, v) else dofind (j+0w1) end in dofind 0w0 end fun find pred vec = let val len = length vec fun dofind j = if j >= len then NONE else let val v = unsafeSub(vec, j) in if pred v then SOME v else dofind (j+0w1) end in dofind 0w0 end fun exists f arr = Option.isSome(find f arr) fun all pred arr = not (exists (not o pred) arr) fun collate cmp (vec1, vec2) = let val len1 = length vec1 and len2 = length vec2 (* Keep comparing items until either we come to the end of one of the arrays or we find a mismatch. *) fun dotest j = if j >= len1 then if len1 = len2 then EQUAL else (* j < len2 *) LESS else if j >= len2 then (* But j < len1, so a1 is longer *) GREATER else case cmp(unsafeSub(vec1, j), unsafeSub(vec2, j)) of LESS => LESS | GREATER => GREATER | EQUAL => dotest (j+0w1) in dotest 0w0 end end; polyml-5.6/basis/VectorSliceOperations.sml000066400000000000000000000145351265146633400210260ustar00rootroot00000000000000(* Title: Standard Basis Library: Vector and Array slice functor Copyright David C.J. Matthews 2005 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* The mono vector slice and mono array slice operations can all be combined into this functor fairly easily. Where appropriate functions can be redefined in the calling structure. *) functor VectorSliceOperations( type vector type elem val vecLength: vector -> word val unsafeVecSub: vector * word -> elem val unsafeVecUpdate: vector * word * elem -> unit (* Array only *) ): sig (*type slice*) datatype slice = Slice of { vector: vector, start: word, length: word }; val length : slice -> int val sub : (slice * int) -> elem val full: vector -> slice val slice: vector * int * int option -> slice val subslice: slice * int * int option -> slice val base: slice -> vector * int * int val isEmpty: slice -> bool val getItem: slice -> (elem * slice) option val appi : ((int * elem) -> unit) -> slice -> unit val app : (elem -> unit) -> slice -> unit val foldli : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldri : ((int * elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldl : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val foldr : ((elem * 'a) -> 'a) -> 'a -> slice -> 'a val findi: (int * elem -> bool) -> slice -> (int * elem) option val find: (elem -> bool) -> slice -> elem option val exists: (elem -> bool) -> slice -> bool val all: (elem -> bool) -> slice -> bool val collate: (elem * elem -> order) -> slice * slice -> order (* These functions modify the vector or array. They aren't used for vectors. *) val update: slice * int * elem -> unit val modifyi : (int * elem -> elem) -> slice -> unit val modify : (elem -> elem) -> slice -> unit end = struct val wordAsInt: word -> int = RunCall.unsafeCast type elem = elem type vector = vector datatype slice = Slice of { vector: vector, start: word, length: word }; fun length(Slice{length, ...}) = wordAsInt length fun op sub (Slice{vector, start, length}, i: int) = let (* Check that the value is non-negative and short and cast it to word. *) val iW = LibrarySupport.unsignedShortOrRaiseSubscript i in if iW >= length then raise General.Subscript else unsafeVecSub(vector, iW+start) end (* update obviously doesn't apply to vector slices which are immutable. This function is filtered out by the caller's signature. *) fun update(Slice{vector, start, length}, i: int, x: elem) = let (* Check that the value is non-negative and short and cast it to word. *) val iW = LibrarySupport.unsignedShortOrRaiseSubscript i in if iW >= length then raise General.Subscript else unsafeVecUpdate(vector, iW+start, x) end (* Slice from the whole vector. *) fun full v = Slice{vector=v, start=0w0, length=vecLength v} (* Create a slice from a vector. *) fun slice(vec: vector, i: int, NONE) = let val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val len = vecLength vec in if iW <= len then Slice{vector=vec, start=iW, length=len-iW} (* Length is rest of vector. *) else raise General.Subscript end | slice(vec: vector, i: int, SOME l) = let val len = vecLength vec val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lW = LibrarySupport.unsignedShortOrRaiseSubscript l in if iW+lW <= len then Slice{vector=vec, start=iW, length=lW} (* Length is as given. *) else raise General.Subscript end (* Slice from existing slice *) fun subslice(Slice{vector, start, length}, i: int, NONE) = let val iW = LibrarySupport.unsignedShortOrRaiseSubscript i in if iW <= length then Slice{vector=vector, start=iW+start, length=length-iW} (* Length is rest of array. *) else raise General.Subscript end | subslice(Slice{vector, start, length}, i: int, SOME l) = let val iW = LibrarySupport.unsignedShortOrRaiseSubscript i val lW = LibrarySupport.unsignedShortOrRaiseSubscript l in if iW+lW <= length then Slice{vector=vector, start=iW+start, length=lW} (* Length is as given. *) else raise General.Subscript end fun base(Slice{vector, start, length}) = (vector, wordAsInt start, wordAsInt length) fun isEmpty(Slice{length, ...}) = length = 0w0 (* Return the first item of the slice and the rest of the slice. *) fun getItem(Slice{length=0w0, ...}) = NONE | getItem(Slice{vector, start, length}) = SOME(unsafeVecSub(vector, start), Slice{vector=vector, start=start+0w1, length=length-0w1}) (* Standard vector operations. *) structure VectorOps = VectorOperations( struct type vector = slice and elem = elem fun length(Slice{length, ...}) = length fun unsafeSub (Slice{vector, start, ...}, i) = unsafeVecSub(vector, start + i) fun unsafeSet (Slice{vector, start, ...}, i, x) = unsafeVecUpdate(vector, start + i, x) end); open VectorOps; end; polyml-5.6/basis/Weak.sml000066400000000000000000000056371265146633400154320ustar00rootroot00000000000000(* Title: Weak references Author: David Matthews Copyright David Matthews 2008, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* A weak reference or array contains option values. The SOME variant of the option must contain a reference. This restriction is imposed because they require pointer equality. A weak reference or array behaves just like a normal ref or array with one difference. The garbage collector may set a weak ref or the field of weak array to NONE if it currently contains SOME r but r is not reachable other than through weak references. The one proviso is that if r is contained in the executable it is always reachable. *) signature WEAK = sig val weak: 'a ref option -> 'a ref option ref val weakArray: int * 'a ref option -> 'a ref option array val weakLock: Thread.Mutex.mutex and weakSignal: Thread.ConditionVar.conditionVar val touch : 'a ref -> unit end; structure Weak: WEAK = struct fun weak (v: 'a ref option): 'a ref option ref = let val System_alloc = RunCall.run_call3 RuntimeCalls.POLY_SYS_alloc_store in System_alloc(0w1, 0wx60, v) end fun weakArray(n: int, v: 'a ref option): 'a ref option array = let (* An array consists of n+1 words with the first containing the length. *) val System_alloc = RunCall.run_call3 RuntimeCalls.POLY_SYS_alloc_store val System_setw = RunCall.run_call3 RuntimeCalls.POLY_SYS_assign_word; val () = if n < 0 orelse n >= Array.maxLen then raise Size else () val arr = System_alloc(n+1, 0wx60, v) in System_setw(arr, 0, n); arr end val weakLock = Thread.Mutex.mutex() and weakSignal = Thread.ConditionVar.conditionVar() (* touch is considered by the compiler as an access to the ref but doesn't actually do anything with it. The idea is that it ensures that when a ref is used as a token that this will access the ref and avoid the weak reference becoming set to NONE. It's primarily there for long-term security in the event that the compiler is sufficiently clever to work out that something is no longer referenced. *) fun touch v = RunCall.run_call1 RuntimeCalls.POLY_SYS_touch_final v end; polyml-5.6/basis/Windows.sml000066400000000000000000000577411265146633400162000ustar00rootroot00000000000000(* Title: Standard Basis Library: Windows signature and structure Author: David Matthews Copyright David Matthews 2000, 2005, 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature WINDOWS = sig structure Key : sig include BIT_FLAGS val allAccess : flags val createLink : flags val createSubKey : flags val enumerateSubKeys : flags val execute : flags val notify : flags val queryValue : flags val read : flags val setValue : flags val write : flags end structure Reg : sig eqtype hkey val classesRoot : hkey val currentUser : hkey val localMachine : hkey val users : hkey val performanceData : hkey val currentConfig : hkey val dynData : hkey datatype create_result = CREATED_NEW_KEY of hkey | OPENED_EXISTING_KEY of hkey val createKeyEx : hkey * string * Key.flags -> create_result val openKeyEx : hkey * string * Key.flags -> hkey val closeKey : hkey -> unit val deleteKey : hkey * string -> unit val deleteValue : hkey * string -> unit val enumKeyEx : hkey * int -> string option val enumValue : hkey * int -> string option datatype value = SZ of string | DWORD of SysWord.word | BINARY of Word8Vector.vector | MULTI_SZ of string list | EXPAND_SZ of string val queryValueEx : hkey * string -> value option val setValueEx : hkey * string * value -> unit end structure Config: sig val platformWin32s : SysWord.word val platformWin32Windows : SysWord.word val platformWin32NT : SysWord.word val platformWin32CE : SysWord.word val getVersionEx: unit -> { majorVersion: SysWord.word, minorVersion: SysWord.word, buildNumber: SysWord.word, platformId: SysWord.word, csdVersion: string } val getWindowsDirectory: unit -> string val getSystemDirectory: unit -> string val getComputerName: unit -> string val getUserName: unit -> string end structure DDE : sig type info val startDialog : string * string -> info val executeString : info * string * int * Time.time -> unit val stopDialog : info -> unit end val getVolumeInformation : string -> { volumeName : string, systemName : string, serialNumber : SysWord.word, maximumComponentLength : int } val findExecutable : string -> string option val launchApplication : string * string -> unit val openDocument : string -> unit val simpleExecute : string * string -> OS.Process.status type ('a,'b) proc val execute : string * string -> ('a, 'b) proc val textInstreamOf : (TextIO.instream, 'a) proc -> TextIO.instream val binInstreamOf : (BinIO.instream, 'a) proc -> BinIO.instream val textOutstreamOf : ('a, TextIO.outstream) proc -> TextIO.outstream val binOutstreamOf : ('a, BinIO.outstream) proc -> BinIO.outstream val reap : ('a, 'b) proc -> OS.Process.status structure Status : sig type status = SysWord.word val accessViolation : status val arrayBoundsExceeded : status val breakpoint : status val controlCExit : status val datatypeMisalignment : status val floatDenormalOperand : status val floatDivideByZero : status val floatInexactResult : status val floatInvalidOperation : status val floatOverflow : status val floatStackCheck : status val floatUnderflow : status val guardPageViolation : status val integerDivideByZero : status val integerOverflow : status val illegalInstruction : status val invalidDisposition : status val invalidHandle : status val inPageError : status val noncontinuableException: status val pending : status val privilegedInstruction : status val singleStep : status val stackOverflow : status val timeout : status val userAPC : status end val fromStatus : OS.Process.status -> Status.status val exit : Status.status -> 'a end structure Windows :> WINDOWS = struct open RuntimeCalls fun getConst i = SysWord.fromInt(RunCall.run_call2 POLY_SYS_os_specific (1006, i)) structure Key = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val allAccess : flags = getConst 0 val createLink : flags = getConst 1 val createSubKey : flags = getConst 2 val enumerateSubKeys : flags = getConst 3 val execute : flags = getConst 4 val notify : flags = getConst 5 val queryValue : flags = getConst 6 val read : flags = getConst 7 val setValue : flags = getConst 8 val write : flags = getConst 9 (* all is probably equivalent to allAccess. *) val all = flags[allAccess, createLink, createSubKey, enumerateSubKeys, execute, notify, queryValue, read, setValue, write] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end structure Reg = struct datatype hkey = PREDEFINED of int | SUBKEY of int (* Actually abstract. *) val classesRoot = PREDEFINED 0 val currentUser = PREDEFINED 1 val localMachine = PREDEFINED 2 val users = PREDEFINED 3 val performanceData = PREDEFINED 4 val currentConfig = PREDEFINED 5 val dynData = PREDEFINED 6 datatype create_result = CREATED_NEW_KEY of hkey | OPENED_EXISTING_KEY of hkey datatype value = SZ of string | DWORD of SysWord.word | BINARY of Word8Vector.vector | MULTI_SZ of string list | EXPAND_SZ of string local val winCall = RunCall.run_call2 POLY_SYS_os_specific (* Open one of the root keys. *) (* QUESTION: Why is this an option? The definition asks the same question. I've removed the option type. *) fun openRoot args = SUBKEY(winCall(1007, args)) (* Open a sub-key. *) and openSubKey args = SUBKEY(winCall(1008, args)) in fun openKeyEx(PREDEFINED i, s, f) = openRoot(i, s, SysWord.toInt f) | openKeyEx(SUBKEY i, s, f) = openSubKey(i, s, SysWord.toInt f) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific fun pairToResult (0, k) = CREATED_NEW_KEY (SUBKEY k) | pairToResult (_, k) = OPENED_EXISTING_KEY (SUBKEY k) (* Open one of the root keys. *) fun createRoot args = pairToResult(winCall(1009, args)) (* Open a sub-key. *) and createSubKey args = pairToResult(winCall(1010, args)) in (* I've retained the third argument in this interface which used to be used for VOLATILE (1) or NON_VOLATILE (0). Keys are now always non-volatile. *) fun createKeyEx(PREDEFINED i, s, f) = createRoot(i, s, 0, SysWord.toInt f) | createKeyEx(SUBKEY i, s, f) = createSubKey(i, s, 0, SysWord.toInt f) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in (* TODO: We wouldn't normally expect to close a predefined key but it looks as though we might have to be able to close HKEY_PERFORMANCE_DATA. *) fun closeKey(PREDEFINED _) = () | closeKey(SUBKEY i) = winCall(1011, i) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific fun unpackString v = let val len = Word8Vector.length v in if len = 0 then "" else Byte.unpackStringVec(Word8VectorSlice.slice(v, 0, SOME(len -1))) end fun unpackStringList v = let val len = Word8Vector.length v fun unpack start i = if i >= len orelse Word8Vector.sub(v, i) = 0w0 then if i = start then [] else Byte.unpackStringVec(Word8VectorSlice.slice(v, start, SOME(i - start))) :: unpack (i+1) (i+1) else unpack start (i+1) in unpack 0 0 end fun queryResultToValues(t, v) = (* Decode the type code and the value. Strings are null terminated so the last character must be removed. *) case t of 1 => SZ(unpackString v) | 4 => DWORD(PackWord32Little.subVec(v, 0)) | 2 => EXPAND_SZ(unpackString v) | 7 => MULTI_SZ(unpackStringList v) | _ => BINARY v val errorFileNotFound = valOf(OS.syserror "ERROR_FILE_NOT_FOUND") in (* The queryValue functions simply return a type and a vector of bytes. The type code is decoded and the bytes unpacked appropriately. *) fun queryValueEx(key, s) = SOME(queryResultToValues( case key of PREDEFINED i => winCall(1012, (i, s)) | SUBKEY i => winCall(1013, (i, s)) )) handle ex as OS.SysErr(_, SOME err) => if err = errorFileNotFound then NONE else raise ex end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun deleteValue(PREDEFINED i, s) = (winCall(1022, (i, s))) | deleteValue(SUBKEY i, s) = (winCall(1023, (i, s))) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific fun packString s = let val len = String.size s val arr = Word8Array.array(len+1, 0w0) in Byte.packString(arr, 0, Substring.full s); Word8Array.vector arr end fun packStringList sl = let (* The string list is packed as a set of null-terminated strings with a final null at the end. *) (* TODO: Check for nulls in the strings themselves? *) fun totalSize n [] = n | totalSize n (s::sl) = totalSize (n + String.size s + 1) sl val len = totalSize 1 sl val arr = Word8Array.array(len, 0w0) fun pack _ [] = () | pack n (s::sl) = ( Byte.packString(arr, n, Substring.full s); pack (n + String.size s + 1) sl ) in pack 0 sl; Word8Array.vector arr end fun valuesToTypeVal(SZ s) = (1, packString s) | valuesToTypeVal(EXPAND_SZ s) = (2, packString s) | valuesToTypeVal(BINARY s) = (3, s) | valuesToTypeVal(DWORD n) = let (* Pack the 32 bit value into an array, then extract that. *) val arr = Word8Array.array(4, 0w0) in PackWord32Little.update(arr, 0, n); (4, Word8Array.vector arr) end | valuesToTypeVal(MULTI_SZ s) = (7, packStringList s) in fun setValueEx(key, name, v) = let val (t, s) = valuesToTypeVal v val (call, k) = case key of PREDEFINED i => (1016, i) | SUBKEY i => (1017, i) in (winCall(call, (k, name, t, s))) end end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun enumKeyEx(PREDEFINED i, n) = (winCall(1018, (i, n))) | enumKeyEx(SUBKEY i, n) = (winCall(1019, (i, n))) fun enumValue(PREDEFINED i, n) = (winCall(1020, (i, n))) | enumValue(SUBKEY i, n) = (winCall(1021, (i, n))) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific (* In Windows NT RegDeleteKey will fail if the key has subkeys. To give the same behaviour in both Windows 95 and NT we have to recursively delete any subkeys. *) fun basicDeleteKey(PREDEFINED i, s) = (winCall(1014, (i, s))) | basicDeleteKey(SUBKEY i, s) = (winCall(1015, (i, s))) in fun deleteKey(k, s) = let val sk = openKeyEx(k, s, Key.enumerateSubKeys) fun deleteSubKeys () = case enumKeyEx(sk, 0) of NONE => () | SOME name => (deleteKey(sk, name); deleteSubKeys()) in deleteSubKeys() handle exn => (closeKey sk; raise exn); closeKey sk; basicDeleteKey(k, s) end end end structure DDE = struct type info = int (* Actually abstract. *) local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun startDialog (service, topic) = winCall(1038, (service, topic)) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in (* The timeout and retry count apply only in the case of a busy result. The Windows call takes a timeout parameter as the length of time to wait for a response and maybe we should use it for that as well. *) fun executeString (info, cmd, retry, delay) = let fun try n = if winCall(1039, (info, cmd)) then () (* Succeeded. *) else if n = 0 then raise OS.SysErr("DDE Server busy", NONE) else ( OS.IO.poll([], SOME delay); try (n-1) ) in try retry end end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun stopDialog (info) = winCall(1040, info) end end (* DDE *) (* No (longer?) in Basis library local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun fileTimeToLocalFileTime t = winCall(1030, t) fun localFileTimeToFileTime t = winCall(1031, t) end *) local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun getVolumeInformation root = let val (vol, sys, serial, max) = winCall(1032, root) in { volumeName = vol, systemName = sys, serialNumber = SysWord.fromInt serial, maximumComponentLength = max } end end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun findExecutable s = SOME(winCall(1033, s)) handle OS.SysErr _ => NONE end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun openDocument s = winCall(1034, s) end local val winCall = RunCall.run_call2 POLY_SYS_os_specific in fun launchApplication (command, arg) = winCall(1035, (command, arg)) end abstype ('a,'b) proc = ABS of int with end; (* Run a process and return a proces object which will allow us to extract the input and output streams. *) fun execute(command, arg): ('a,'b) proc = RunCall.run_call2 POLY_SYS_os_specific (1000, (command, arg)) local val doIo = RunCall.run_call3 POLY_SYS_io_dispatch in fun sys_get_buffsize (strm: OS.IO.iodesc): int = doIo(15, strm, 0) end fun textInstreamOf p = let (* Get the underlying file descriptor. *) val n = RunCall.run_call2 POLY_SYS_os_specific(1001, p) val textPrimRd = LibraryIOSupport.wrapInFileDescr {fd=n, name="TextPipeInput", initBlkMode=true} val streamIo = TextIO.StreamIO.mkInstream(textPrimRd, "") in TextIO.mkInstream streamIo end fun textOutstreamOf p = let val n = RunCall.run_call2 POLY_SYS_os_specific(1002, p) val buffSize = sys_get_buffsize n val textPrimWr = LibraryIOSupport.wrapOutFileDescr{fd=n, name="TextPipeOutput", appendMode=false, initBlkMode=true, chunkSize=buffSize} (* Construct a stream. *) val streamIo = TextIO.StreamIO.mkOutstream(textPrimWr, IO.LINE_BUF) in TextIO.mkOutstream streamIo end fun binInstreamOf p = let (* Get the underlying file descriptor. *) val n = RunCall.run_call2 POLY_SYS_os_specific(1003, p) val binPrimRd = LibraryIOSupport.wrapBinInFileDescr {fd=n, name="BinPipeInput", initBlkMode=true} val streamIo = BinIO.StreamIO.mkInstream(binPrimRd, Word8Vector.fromList []) in BinIO.mkInstream streamIo end fun binOutstreamOf p = let val n = RunCall.run_call2 POLY_SYS_os_specific(1004, p) val buffSize = sys_get_buffsize n val binPrimWr = LibraryIOSupport.wrapBinOutFileDescr{fd=n, name="BinPipeOutput", appendMode=false, initBlkMode=true, chunkSize=buffSize} (* Construct a stream. *) val streamIo = BinIO.StreamIO.mkOutstream(binPrimWr, IO.LINE_BUF) in BinIO.mkOutstream streamIo end (* reap - wait until the process finishes and get the result. Note: this is defined to be able to return the result repeatedly. At present that's done by not closing the handle except in the garbage collector. That could cause us to run out of handles. *) fun reap p = RunCall.run_call2 POLY_SYS_os_specific(1005, p) local val winCall = RunCall.run_call2 POLY_SYS_os_specific in (* Run a process and wait for the result. Rather than do the whole thing as a single RTS call we first start the process and then call "reap" to get the result. This allows this to be run as a separate ML process if necessary without blocking everything. This is similar to OS.Process.system but differs in that the streams are directed to NUL and this runs the executable directly, not via cmd.exe/command.com so cannot run DOS commands. OS.Process.system waits for the result within the RTS call so the whole of ML will be blocked until the process completes. *) fun simpleExecute (command, arg) = let val process = winCall(1037, (command, arg)) in reap process end end structure Status = struct type status = SysWord.word val accessViolation = getConst 10 val arrayBoundsExceeded = getConst 11 val breakpoint = getConst 12 val controlCExit = getConst 13 val datatypeMisalignment = getConst 14 val floatDenormalOperand = getConst 15 val floatDivideByZero = getConst 16 val floatInexactResult = getConst 17 val floatInvalidOperation = getConst 18 val floatOverflow = getConst 19 val floatStackCheck = getConst 20 val floatUnderflow = getConst 21 val guardPageViolation = getConst 22 val integerDivideByZero = getConst 23 val integerOverflow = getConst 24 val illegalInstruction = getConst 25 val invalidDisposition = getConst 26 val invalidHandle = getConst 27 val inPageError = getConst 28 (* This was given as nocontinuableException *) val noncontinuableException= getConst 29 val pending = getConst 30 val privilegedInstruction = getConst 31 val singleStep = getConst 32 val stackOverflow = getConst 33 val timeout = getConst 34 val userAPC = getConst 35 end (* The status is implemented as an integer. *) fun fromStatus (s: OS.Process.status): Status.status = SysWord.fromInt(RunCall.unsafeCast s); fun exit (s: Status.status) = OS.Process.exit(RunCall.unsafeCast(SysWord.toInt s)) structure Config = struct local val winCall: int*unit->int*int*int*int*string = RunCall.run_call2 POLY_SYS_os_specific in fun getVersionEx () = let val (major, minor, build, platform, version) = winCall(1050, ()) in { majorVersion = SysWord.fromInt major, minorVersion = SysWord.fromInt minor, buildNumber = SysWord.fromInt build, platformId = SysWord.fromInt platform, csdVersion = version } end end local val winCall: int*unit->string = RunCall.run_call2 POLY_SYS_os_specific in fun getWindowsDirectory () = winCall(1051, ()) and getSystemDirectory () = winCall(1052, ()) and getComputerName () = winCall(1053, ()) and getUserName () = winCall(1054, ()) end val platformWin32s = getConst 36 val platformWin32Windows = getConst 37 val platformWin32NT = getConst 38 val platformWin32CE = getConst 39 end end; local (* Add pretty printers to hide internals. *) fun prettyRegKey _ _ (_: Windows.Reg.hkey) = PolyML.PrettyString "?" and prettyDDEInfo _ _ (_: Windows.DDE.info) = PolyML.PrettyString "?" and prettyProc _ _ (_: ('a, 'b) Windows.proc) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyRegKey and () = PolyML.addPrettyPrinter prettyDDEInfo and () = PolyML.addPrettyPrinter prettyProc end; polyml-5.6/basis/Word32.sml000066400000000000000000000017711265146633400156160ustar00rootroot00000000000000(* Title: Standard Basis Library: Word31 structure Copyright David C.J. Matthews 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* On 32-bit LargeWord has a 32-bit word length. *) structure Word32 = LargeWord; val () = if Word32.wordSize <> 32 then raise Fail "Not 32 bit word" else (); polyml-5.6/basis/Word32In64.sml000066400000000000000000000124401265146633400162520ustar00rootroot00000000000000(* Title: Standard Basis Library: Word32 Structure Author: David Matthews Achim D. Brucker Copyright David Matthews 1999 Achim D. Brucker 2006 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is a hacked version of Word32 - a 32bit Word implementation for PolyML 5. It's neither well tested nor efficiently implemented. Nevertheless, it works well enough for the XML parser fxp (http://www2.in.tum.de/~berlea/Fxp/). *) (* This version has been modified for 64-bit architecture and does not require boxed word values. DCJM 14/8/09. *) (* We need to declare a Word64 structure as well. *) structure Word64 = LargeWord; val () = if Word64.wordSize <> 64 then raise Fail "Not 64-bit" else () structure Word32 :> WORD = struct (* We can use Word here because a 63-bit tagged value is sufficient. *) open Word (* Values of type Word32.word can be in the range 0.. 4294967295 *) val wordSize = 32 val maxWord = 4294967295 val maxWordAsWord: word = (Word.fromInt maxWord) infix 8 << >> ~>> ; (* Comparison operations, min, max and compare, fmt, toString, orb, andb, xorb can be inherited directly from LargeWord. Similarly div, mod and >> since the results will always be no larger than the arguments. *) (* Not the same as Word.notb because it only affects the bottom 32 bits. *) fun notb x = xorb(maxWordAsWord, x) (* Internal function to convert from Word.word. *) fun fromWord (w: Word.word) = andb(w, maxWordAsWord) (* Converting from LargeWord.word. First convert to Word.word and then mask. *) fun fromLargeWord (w: LargeWord.word) = fromWord(Word.fromLargeWord w) and fromInt (i: int): word = fromWord(Word.fromInt i) val fromLarge = fromLargeWord and fromLargeInt = fromInt (* Arithmetic shift - sign extends. *) (* Shift the "sign" bit into the real sign bit position then shift right down again. *) local val toSignBit = (Word.fromInt(Int.-(Word.wordSize,wordSize))) in fun op ~>> (a: word, b: Word.word): word = fromWord(Word.~>>(Word.<<(a, toSignBit), Word.+(b, toSignBit))) (* Convert to a large word by sign extending. *) fun toLargeWordX (w: word): LargeWord.word = LargeWord.~>>(Word.toLargeWordX(Word.<<(w, toSignBit)), toSignBit) end val toLargeX = toLargeWordX (* Conversion to signed integer. *) fun toIntX (x: word) : int = LargeWord.toIntX(toLargeWordX x) val toLargeIntX = toIntX (* Use Word.scan but check that the result is in the range. *) val wordScan = scan; fun scan radix getc src = case wordScan radix getc src of NONE => NONE | SOME(res, src') => if res > maxWordAsWord then raise General.Overflow else SOME(res, src') val fromString = StringCvt.scanString (scan StringCvt.HEX) (* TODO: Replace by built-ins? *) fun op + (a, b) = fromWord(Word.+(a, b)) and op - (a, b) = fromWord(Word.-(a, b)) and op * (a, b) = fromWord(Word.*(a, b)) and op << (a, b) = fromWord(Word.<<(a, b)) fun ~ x = 0w0 - x end; (* Because we are using opaque signature matching we have to install type-dependent functions OUTSIDE the structure. *) local (* The string may be either 0wnnn or 0wxXXX *) fun convWord s : Word32.word = let val radix = (* The word value must consist of at least 0w and a digit. *) if String.sub(s, 2) = #"x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (Word32.scan radix) s of NONE => raise RunCall.Conversion "Invalid Word32.word constant" | SOME res => res end (* Install the pretty printer for Word32.word *) fun pretty _ _ x = PolyML.PrettyString("0wx" ^ Word32.toString x) in val () = RunCall.addOverload convWord "convWord" val () = PolyML.addPrettyPrinter pretty end; (* Add the overloaded operators. *) val () = RunCall.addOverload Word32.~ "~"; val () = RunCall.addOverload Word32.+ "+"; val () = RunCall.addOverload Word32.- "-"; val () = RunCall.addOverload Word32.* "*"; val () = RunCall.addOverload Word32.div "div"; val () = RunCall.addOverload Word32.mod "mod"; val () = RunCall.addOverload Word32.< "<"; val () = RunCall.addOverload Word32.> ">"; val () = RunCall.addOverload Word32.<= "<="; val () = RunCall.addOverload Word32.>= ">="; polyml-5.6/basis/Word8.sml000066400000000000000000000147051265146633400155420ustar00rootroot00000000000000(* Title: Standard Basis Library: Word8 Structure Author: David Matthews Copyright David Matthews 1999 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* G&R 2004 status: checked, no change *) structure Word8 :> WORD = struct (* This structure is largely derived from Word but we use opaque signature matching so that it is a different type. *) open Word (* Values of type Word8.word can be in the range 0..255 and are implemented using tagged integers. *) (* There seem to be two ways to implement this, given that the underlying representation is a tagged 30/31 bit integer. We could either ensure that the top 22/23 bits are always zero and mask them after every operation (or if the code-generator was clever, after several) or we could allow these bits to be undefined and mask them before any operation which could expose them. For the moment we choose the former. *) (* N.B. The Byte structure contains functions which map between Word8.word values and Char.char. It assumes that the underlying representation is the same. *) open RuntimeCalls val wordSize = 8 val maxWord = 255 val maxWordAsWord: word = RunCall.unsafeCast maxWord infix 8 << >> ~>> ; (* Comparison operations, min, max and compare, fmt, toString, orb, andb, xorb can be inherited directly from Word. Similarly div and mod since the results will always be no larger than the arguments. *) (* ... but this can't because the second argument is still Word.word even in this structure. *) val op >> : word*Word.word->word = RunCall.run_call2 POLY_SYS_shift_right_word (* Not the same as Word.notb because it only affects the bottom 8 bits. *) fun notb x = xorb(maxWordAsWord, x) (* Internal function to convert from Word.word. *) fun fromWord (w: Word.word) = andb(w, maxWordAsWord) (* Converting from LargeWord.word. First convert to Word.word and then mask. *) fun fromLargeWord (w: LargeWord.word) = fromWord(Word.fromLargeWord w) and fromInt (i: int): word = fromWord(Word.fromInt i) val fromLarge = fromLargeWord (* Arithmetic shift - sign extends. *) (* TODO: Replace by built-in? We need a separate function from arithmetic shift for Word because the sign bit is in a different place. *) (* Shift the "sign" bit into the real sign bit position then shift right down again. *) local val toSignBit = Word.fromInt(Int.-(Word.wordSize,wordSize)) in fun op ~>> (a: word, b: Word.word): word = fromWord(Word.~>>(Word.<<(a, toSignBit), Word.+(b, toSignBit))) end (* TODO: Replace with built-in? We need to mask the result so that it remains in the range 0..255 *) local val wordshift = RunCall.run_call2 POLY_SYS_shift_left_word in fun op << (a: word, b: Word.word): word = andb(wordshift(a,b), maxWordAsWord) end (* Conversion to unsigned integer. This is simpler than for Word because all Word8 values correspond to short integers. *) val toInt: word->int = RunCall.unsafeCast (* Conversion to signed integer. *) (* TODO: This could be implemented using shifts. i.e logical shift left by (Word.wordSize-Word8.wordSize) then arithmetic shift right by the same amount. *) fun toIntX (x: word) : int = let val intx = toInt x open Int (* We want integer arithmetic here. *) in if intx >= 128 then intx-maxWord-1 else intx end val fromLargeInt = fromInt and toLargeInt = toInt and toLargeIntX = toIntX (* Convert to a large word by sign extending. *) fun toLargeWordX (w: word): LargeWord.word = LargeWord.fromInt(toIntX w); val toLargeX = toLargeWordX (* Use Word.scan but check that the result is in the range. *) val wordScan = scan; fun scan radix getc src = case wordScan radix getc src of NONE => NONE | SOME(res, src') => if res > maxWordAsWord then raise General.Overflow else SOME(res, src') val fromString = StringCvt.scanString (scan StringCvt.HEX) (* TODO: Replace by built-ins? *) fun op + (a, b) = fromWord(Word.+(a, b)) and op - (a, b) = fromWord(Word.-(a, b)) and op * (a, b) = fromWord(Word.*(a, b)) fun ~ x = 0w0 - x end; (* Because we are using opaque signature matching we have to install type-dependent functions OUTSIDE the structure. *) local (* The string may be either 0wnnn or 0wxXXX *) fun convWord s : Word8.word = let val radix = (* The word value must consist of at least 0w and a digit. *) if String.sub(s, 2) = #"x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (Word8.scan radix) s of NONE => raise RunCall.Conversion "Invalid word8 constant" | SOME res => res end (* Install the pretty printer for Word8.word *) fun pretty _ _ x = PolyML.PrettyString("0wx" ^ Word8.toString x) in val () = RunCall.addOverload convWord "convWord" val () = PolyML.addPrettyPrinter pretty end; (* Add the overloaded operators. *) val () = RunCall.addOverload Word8.~ "~"; val () = RunCall.addOverload Word8.+ "+"; val () = RunCall.addOverload Word8.- "-"; val () = RunCall.addOverload Word8.* "*"; val () = RunCall.addOverload Word8.div "div"; val () = RunCall.addOverload Word8.mod "mod"; val () = RunCall.addOverload Word8.< "<"; val () = RunCall.addOverload Word8.> ">"; val () = RunCall.addOverload Word8.<= "<="; val () = RunCall.addOverload Word8.>= ">="; polyml-5.6/basis/Word8Array.sml000066400000000000000000000461441265146633400165430ustar00rootroot00000000000000(* Title: Standard Basis Library: Word8Array, Word8Vector and Byte Structures Author: David Matthews Copyright David Matthews 1999, 2005, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local open RuntimeCalls; (* for POLY_SYS and EXC numbers *) (* We can't use the segment length for the length of the vector as we do for "normal" arrays and vectors. There are two ways of handling this. We could implement byte vectors in the same way as strings, with a length word in the first word, or we could store the length separately, as with arrays. We could, of course, treat arrays in the same way. Implementing vectors as strings simplifies conversion between the two and that's the approach I've adopted. *) open LibrarySupport type vector = LibrarySupport.Word8Array.vector datatype array = datatype LibrarySupport.Word8Array.array val System_lock: string -> unit = RunCall.run_call1 POLY_SYS_lockseg; val System_loads: vector*word->Word8.word = RunCall.run_call2 POLY_SYS_load_byte; val System_loadb: address*word->Word8.word = RunCall.run_call2 POLY_SYS_load_byte; val System_setb: address * word * Word8.word -> unit = RunCall.run_call3 POLY_SYS_assign_byte; val System_move_bytes: address*word*address*word*word->unit = RunCall.run_call5 POLY_SYS_move_bytes val System_move_str: vector*word*address*word*word->unit = RunCall.run_call5 POLY_SYS_move_bytes val System_isShort : vector -> bool = RunCall.run_call1 POLY_SYS_is_short val emptyVec: vector = (* This is represented by a null string not a null vector. *) RunCall.run_call1 POLY_SYS_io_operation POLY_SYS_emptystring; val maxLen = CharVector.maxLen val alloc = LibrarySupport.allocBytes val vecLength: vector -> int = RunCall.run_call1 RuntimeCalls.POLY_SYS_string_length; val wVecLength: vector -> word = RunCall.run_call1 RuntimeCalls.POLY_SYS_string_length; (* Casts between int and word. *) val intAsWord: int -> word = RunCall.unsafeCast and wordAsInt: word -> int = RunCall.unsafeCast infix 9 sub (* For what it's worth *) in (* We don't use opaque matching because we need the internal representation of vector and array in the IO structures. *) structure Word8Vector : MONO_VECTOR = struct type elem = Word8.word type vector = vector val maxLen = maxLen; val length = vecLength fun op sub (v, i: int): elem = if i < 0 orelse i >= length v then raise General.Subscript else if System_isShort v then RunCall.unsafeCast v else System_loads (v, intAsWord i + wordSize) (* Because Word8Vector.vector is implemented as a string and Word8.word as a byte all these functions have the same implementation in Word8Vector and CharVector. We might be able to avoid the casts by some clever use of opaque matching but we would have to do the conversion of Word8.word from char to an opaque type at the same time as converting Word8Vector.elem to preserve the sharing. *) (* Can't that be achieved by Word8Vector :> MONO_VECTOR where type elem = Word8.word ? *) val fromList: Word8.word list -> vector = RunCall.unsafeCast CharVector.fromList and tabulate: int * (int->Word8.word) -> vector = RunCall.unsafeCast CharVector.tabulate and concat: vector list -> vector = RunCall.unsafeCast CharVector.concat and map: (elem -> elem) -> vector -> vector = RunCall.unsafeCast CharVector.map and mapi: ((int * elem) -> elem) -> vector -> vector = RunCall.unsafeCast CharVector.mapi and update: vector * int * elem -> vector = RunCall.unsafeCast CharVector.update (* Create the other functions. *) structure VectorOps = VectorOperations( struct type vector = vector and elem = elem val length = RunCall.run_call1 RuntimeCalls.POLY_SYS_string_length fun unsafeSub (s, i) = if System_isShort s then RunCall.unsafeCast s else System_loads(s, i + wordSize); fun unsafeSet _ = raise Fail "Should not be called" end); open VectorOps; local (* Install the pretty printer for Word8Vector.vector *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) _ (x: vector) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString("0wx" ^ Word8.toString w) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end (* Vector *); structure Word8Array : MONO_ARRAY = struct type array = array type elem = Word8.word type vector = vector val maxLen = maxLen; fun length(Array(l, _)) = wordAsInt l fun array (length, ini) = let (* The array is allocated containing zeros. Some versions of the RTS will allow byte vectors to be allocated with other values but other versions don't. For the moment assume that we have to initialise the array separately. *) val len = unsignedShortOrRaiseSize length val vec = alloc len fun init i = if len <= i then () else (System_setb(vec, i, ini); init(i+0w1)) in init 0w0; Array(len, vec) end fun op sub (Array(l, v), i: int): elem = if i < 0 orelse i >= wordAsInt l then raise General.Subscript else System_loadb (v, intAsWord i) fun update (Array (l, v), i: int, new) : unit = if i < 0 orelse i >= wordAsInt l then raise General.Subscript else System_setb (v, intAsWord i, new); (* Create an array from a list. *) fun fromList (l : elem list) : array = let val length = unsignedShortOrRaiseSize(List.length l); (* Make a array initialised to zero. *) val vec = alloc length; (* Copy the list elements into the array. *) fun init (v, i, a :: l) = (System_setb(v, i, a); init(v, i + 0w1, l)) | init (_, _, []) = (); in init(vec, 0w0, l); Array(length, vec) end fun tabulate (length: int , f : int->elem): array = let val len = unsignedShortOrRaiseSize length val vec = alloc len (* Initialise it to the function values. *) fun init i = if len <= i then () else (System_setb(vec, i, f(wordAsInt i)); init(i+0w1)) in init 0w0; Array(len, vec) end fun vector(Array(len, vec)) = if len = 0w0 then emptyVec else if len = 0w1 then (* Single character string is the character itself. *) RunCall.unsafeCast (System_loadb (vec, 0w0)) else let (* Make an array initialised to zero. *) val new_vec = allocString len in System_move_bytes(vec, 0w0, RunCall.unsafeCast new_vec, wordSize, len); System_lock new_vec; w8vectorFromString new_vec end (* Copy an array into another. It's possible for the arrays to be the same but in that case di must be zero (since len = dlen) and the copy is a no-op. *) fun copy {src=Array (len, s), dst=Array (dlen, d), di: int} = let val diW = unsignedShortOrRaiseSubscript di in if diW+len > dlen then raise General.Subscript else System_move_bytes(s, 0w0, d, diW, len) end (* Copy a vector into an array. *) fun copyVec {src, dst=Array (dlen, d), di: int} = let val len = intAsWord(vecLength src) val diW = unsignedShortOrRaiseSubscript di in if diW + len > dlen then raise General.Subscript else if System_isShort src (* i.e. length s = 1 *) then (* Single character strings are represented by the character so we just need to insert the character into the array. *) System_setb(d, diW, RunCall.unsafeCast src) else System_move_str(src, wordSize, d, diW, len) end (* Create the other functions. *) structure ArrayOps = VectorOperations( struct type vector = array and elem = elem fun length(Array(len, _)) = len fun unsafeSub(Array(_, v), i) = System_loadb(v, i) and unsafeSet(Array(_, v), i, c) = System_setb(v, i, c) end); open ArrayOps; local (* Install the pretty printer for Word8Array.array *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) _ (x: array) = let open PolyML val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString("0wx" ^ Word8.toString w) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end (* Word8Array *); structure Word8VectorSlice:> MONO_VECTOR_SLICE where type elem = Word8.word where type vector = Word8Vector.vector = (* We use opaque matching here simply to remove a confusing reference to VectorSliceOps when the type is printed. *) struct type vector = vector and elem = Word8.word structure VectorSliceOps = VectorSliceOperations( struct type vector = vector and elem = Word8.word val vecLength = wVecLength fun unsafeVecSub(s, i: word) = if System_isShort s then RunCall.unsafeCast s else System_loads(s, i + wordSize) fun unsafeVecUpdate _ = raise Fail "Should not be called" (* Not applicable *) end); open VectorSliceOps; (* vector: get the slice out. Since the underlying vector is implemented using the basic string type we can use substring here. *) fun vector slice : vector = let val (vector, start, length) = base slice in w8vectorFromString(unsafeSubstring(w8vectorToString vector, intAsWord start, intAsWord length)) end; (* It would be more efficient to do these as single operations but it's probably too complicated. *) fun concat L = Word8Vector.concat(List.map vector L) fun map f slice = Word8Vector.map f (vector slice) fun mapi f slice = Word8Vector.mapi f (vector slice) end (* Word8VectorSlice *); local (* Install the pretty printer for Word8VectorSlice.slice *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) _ (x: Word8VectorSlice.slice) = let open PolyML Word8VectorSlice val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString("0wx" ^ Word8.toString w) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val _ = PolyML.addPrettyPrinter pretty end; structure Word8ArraySlice:> MONO_ARRAY_SLICE where type elem = Word8.word where type vector = Word8Vector.vector where type vector_slice = Word8VectorSlice.slice where type array = Word8Array.array = struct structure VectorSliceOps = VectorSliceOperations( struct type vector = array and elem = Word8.word fun unsafeVecSub(Array(_, s), i) = System_loadb(s, i) and unsafeVecUpdate(Array(_, s), i, x) = System_setb (s, i, x) and vecLength(Array(l, _)) = l end); open VectorSliceOps; type elem = Word8.word type vector = vector type array = array type vector_slice = Word8VectorSlice.slice (* vector: get the slice out. *) fun vector slice: vector = let val (Array(_, vec), start, length) = base slice in if length = 0 then emptyVec else if length = 1 then (* Single character string is the character itself. *) RunCall.unsafeCast (System_loadb (vec, intAsWord start)) else let val len = intAsWord length (* Make an array initialised to zero. *) val new_vec = allocString len in System_move_bytes(vec, intAsWord start, RunCall.unsafeCast new_vec, wordSize, len); System_lock new_vec; w8vectorFromString new_vec end end (* Copy a slice into an array. N.B. The arrays could be the same. *) fun copy {src, dst, di: int} = let val (src, start, length) = base src in if di < 0 orelse di+length > Word8Array.length dst then raise General.Subscript else (* We can't use System_move_bytes because of the potential overlap problem. Instead we use explicit copying choosing to copy up or down depending on the index whether the source and destination are the same or not. *) let fun copyUp n = if n = length then () else (Word8Array.update(dst, n+di, Word8Array.sub(src, n+start)); copyUp(n+1)) and copyDown n = if n < 0 then () else (Word8Array.update(dst, n+di, Word8Array.sub(src, n+start)); copyDown(n-1)) in if di > start then copyDown(length-1) else copyUp 0 end (* System_move_bytes(s, intAsWord start, d, intAsWord di, intAsWord length) *) end (* Copy a vector slice into an array. *) fun copyVec {src: Word8VectorSlice.slice, dst=Array (dlen, d), di: int} = let val (source, i, l) = Word8VectorSlice.base src val len = intAsWord l and offset = intAsWord i val diW = unsignedShortOrRaiseSubscript di in if diW + len > dlen then raise General.Subscript else if System_isShort source (* i.e. length s = 1 *) then (* Single character strings are represented by the character so we just need to insert the character into the array. *) System_setb(d, diW + offset, RunCall.unsafeCast source) (* The source is represented by a string whose first word is the length. *) else System_move_str(source, offset + wordSize, d, diW, len) end end (* Word8ArraySlice *); local (* Install the pretty printer for Word8ArraySlice.slice *) (* We may have to do this outside the structure if we have opaque signature matching. *) fun pretty(depth: int) _ (x: Word8ArraySlice.slice) = let open PolyML Word8ArraySlice val last = length x - 1 fun put_elem (index, w, (l, d)) = if d = 0 then ([PrettyString "...]"], d+1) else if d < 0 then ([], d+1) else ( PrettyString("0wx" ^ Word8.toString w) :: (if index <> last then PrettyString "," :: PrettyBreak(1, 0) :: l else l), d+1 ) in PrettyBlock(3, false, [], PrettyString "fromList[" :: (if depth <= 0 then [PrettyString "...]"] else #1 (foldri put_elem ([PrettyString "]"], depth-last) x) ) ) end in val () = PolyML.addPrettyPrinter pretty end end; polyml-5.6/basis/build.sml000066400000000000000000000170711265146633400156350ustar00rootroot00000000000000(* Title: Standard Basis Library: Commands to build the library Copyright David C.J. Matthews 2000, 2005, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Thread, Weak and Signal are Poly/ML extensions. *) val () = Bootstrap.use "basis/RuntimeCalls.ML"; val () = Bootstrap.use "basis/InitialBasis.ML"; val () = Bootstrap.use "basis/Universal.ML"; val () = Bootstrap.use "basis/General.sml"; val () = Bootstrap.use "basis/LibrarySupport.sml"; val () = Bootstrap.use "basis/PolyMLException.sml"; val () = Bootstrap.use "basis/Option.sml"; val () = Bootstrap.use "basis/VectorOperations.sml"; val () = Bootstrap.use "basis/PolyVectorOperations.sml"; val () = Bootstrap.use "basis/VectorSliceOperations.sml"; val () = Bootstrap.use "basis/StringCvt.sml"; val () = Bootstrap.use "basis/MONO_VECTOR.sml"; val () = Bootstrap.use "basis/MONO_VECTOR_SLICE.sml"; val () = Bootstrap.use "basis/MONO_ARRAY.sml"; val () = Bootstrap.use "basis/MONO_ARRAY_SLICE.sml"; val () = Bootstrap.use "basis/Vector.sml"; val () = Bootstrap.use "basis/Array.sml"; val () = Bootstrap.use "basis/List.sml"; val () = Bootstrap.use "basis/String.sml"; val () = Bootstrap.use "basis/Text.sml"; (* Declares Char, String, CharArray, CharVector *) val () = Bootstrap.use "basis/Bool.sml"; val () = Bootstrap.use "basis/ListPair.sml"; val () = Bootstrap.use "basis/Int.sml"; val () = Bootstrap.use "basis/LargeWord.sml"; (* Declare the appropriate additional structures. *) (* The version of Word32 we use depends on whether this is 32-bit or 64-bit. *) val () = if LargeWord.wordSize = 32 then Bootstrap.use "basis/Word32.sml" else if LargeWord.wordSize = 64 then Bootstrap.use "basis/Word32In64.sml" else if LargeWord.wordSize = 62 then Bootstrap.use "basis/Word32.550.sml" else if LargeWord.wordSize = 126 then Bootstrap.use "basis/Word32In64.550.sml" else (); val () = Bootstrap.use "basis/Word8.sml"; val () = Bootstrap.use "basis/INTEGER.sml"; val () = Bootstrap.use "basis/IntInf.sml"; val () = Bootstrap.use "basis/Int32.sml"; val () = Bootstrap.use "basis/Word8Array.sml"; val () = Bootstrap.use "basis/Byte.sml"; val () = Bootstrap.use "basis/BoolArray.sml"; val () = Bootstrap.use "basis/IntArray.sml"; val () = Bootstrap.use "basis/RealArray.sml"; val () = Bootstrap.use "basis/IEEE_REAL.sml"; val () = Bootstrap.use "basis/IEEEReal.sml"; val () = Bootstrap.use "basis/MATH.sml"; val () = Bootstrap.use "basis/Real.sml"; val () = Bootstrap.use "basis/Time.sml"; val () = Bootstrap.use "basis/Date.sml"; val () = Bootstrap.use "basis/Thread.sml"; (* Non-standard. *) val () = Bootstrap.use "basis/Timer.sml"; val () = Bootstrap.use "basis/CommandLine.sml"; val () = Bootstrap.use "basis/OS.sml"; val () = Bootstrap.use "basis/ExnPrinter.sml"; (* Relies on OS. *) val () = Bootstrap.use "basis/InitialPolyML.ML"; (* Relies on OS. *) val () = Bootstrap.use "basis/IO.sml"; val () = Bootstrap.use "basis/PRIM_IO.sml"; val () = Bootstrap.use "basis/PrimIO.sml"; val () = Bootstrap.use "basis/TextPrimIO.sml"; val () = Bootstrap.use "basis/BinPrimIO.sml"; val () = Bootstrap.use "basis/LibraryIOSupport.sml"; val () = Bootstrap.use "basis/STREAM_IO.sml"; val () = Bootstrap.use "basis/BasicStreamIO.sml"; val () = Bootstrap.use "basis/IMPERATIVE_IO.sml"; val () = Bootstrap.use "basis/ImperativeIO.sml"; val () = Bootstrap.use "basis/TextIO.sml"; val () = Bootstrap.use "basis/BinIO.sml"; val () = Bootstrap.use "basis/NetHostDB.sml"; val () = Bootstrap.use "basis/NetProtDB.sml"; val () = Bootstrap.use "basis/NetServDB.sml"; val () = Bootstrap.use "basis/Socket.sml"; val () = Bootstrap.use "basis/GenericSock.sml"; val () = Bootstrap.use "basis/INetSock.sml"; val () = Bootstrap.use "basis/UnixSock.sml"; val () = Bootstrap.use "basis/PackRealBig.sml"; (* also declares PackRealLittle *) val () = Bootstrap.use "basis/PackWord8Big.sml"; (* also declares Pack8Little. ...*) val () = Bootstrap.use "basis/Array2.sml"; val () = Bootstrap.use "basis/IntArray2.sml"; val () = Bootstrap.use "basis/SML90.sml"; val () = Bootstrap.use "basis/Weak.sml"; val () = Bootstrap.use "basis/Signal.sml"; val () = Bootstrap.use "basis/SysWord.sml"; val () = Bootstrap.use "basis/BIT_FLAGS.sml"; val () = Bootstrap.use "basis/SingleAssignment.sml"; (* Build Windows or Unix structure as appropriate. *) local val getOS: int = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (0, 0) in val () = if getOS = 0 then ( Bootstrap.use "basis/Posix.sml"; Bootstrap.use "basis/Unix.sml") else if getOS = 1 then (Bootstrap.use "basis/Windows.sml") else () end; (* Build the Process structure for backwards compatibility. *) val () = Bootstrap.use "basis/processes.ML"; val () = Bootstrap.use "basis/HashArray.ML"; val () = Bootstrap.use "basis/UniversalArray.ML"; val () = Bootstrap.use "basis/PrettyPrinter.sml"; (* Add PrettyPrinter to PolyML structure. *) val () = Bootstrap.use "basis/ASN1.sml"; val () = Bootstrap.use "basis/Statistics.ML"; (* Add Statistics to PolyML structure. *) val () = Bootstrap.use "basis/ForeignConstants.sml"; val () = Bootstrap.use "basis/ForeignMemory.sml"; (*val () = Bootstrap.useWithParms [Bootstrap.Universal.tagInject Bootstrap.maxInlineSizeTag 1000] "basis/Foreign.sml";*) val () = Bootstrap.use "basis/Foreign.sml"; val () = Bootstrap.use "basis/FinalPolyML.sml"; val () = Bootstrap.use "basis/TopLevelPolyML.sml"; (* Add rootFunction to Poly/ML. *) val use = PolyML.use; (* Copy everything out of the original name space. *) (* Do this AFTER we've finished compiling PolyML and after adding "use". *) val () = List.app (#enterVal PolyML.globalNameSpace) (#allVal Bootstrap.globalSpace ()) and () = List.app (#enterFix PolyML.globalNameSpace) (#allFix Bootstrap.globalSpace ()) and () = List.app (#enterSig PolyML.globalNameSpace) (#allSig Bootstrap.globalSpace ()) and () = List.app (#enterType PolyML.globalNameSpace) (#allType Bootstrap.globalSpace ()) and () = List.app (#enterFunct PolyML.globalNameSpace) (#allFunct Bootstrap.globalSpace ()) and () = List.app (#enterStruct PolyML.globalNameSpace) (#allStruct Bootstrap.globalSpace ()) (* We don't want Bootstrap copied over. *) val () = PolyML.Compiler.forgetStructure "Bootstrap"; (* Clean out structures and functors which are only used to build the library. *) PolyML.Compiler.forgetValue "it"; PolyML.Compiler.forgetStructure "LibrarySupport"; PolyML.Compiler.forgetStructure "LibraryIOSupport"; PolyML.Compiler.forgetStructure "MachineConstants"; PolyML.Compiler.forgetStructure "ForeignConstants"; PolyML.Compiler.forgetStructure "ForeignMemory"; PolyML.Compiler.forgetFunctor "BasicStreamIO"; PolyML.Compiler.forgetFunctor "VectorOperations"; PolyML.Compiler.forgetFunctor "PolyVectorOperations"; PolyML.Compiler.forgetFunctor "VectorSliceOperations"; PolyML.Compiler.forgetFunctor "BasicImperativeIO"; PolyML.Compiler.forgetFunctor "ASN1"; PolyML.Compiler.forgetSignature "ASN1"; (* Now we've created the new name space we must use PolyML.make/use. N.B. Unlike Bootstrap.use these don't automatically look at the -I option. *) polyml-5.6/basis/ml_bind.sml000066400000000000000000000045451265146633400161440ustar00rootroot00000000000000(* Title: Standard Basis Library: Top level make Author: David Matthews Copyright David Matthews 1999-2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local (* Several modules are made as a result of being dependencies of modules in this list. *) (* Thread, Weak and Signal are Poly/ML extensions. *) structure g = General structure o = Option structure s = String structure ss = Substring (* structure tt = Text*) (* Declares Char, String, CharArray, CharVector *) structure b = Bool (* Depends on Text *) structure lp = ListPair structure i = Int structure a = Array structure w = LargeWord structure w8 = Word8 structure w32 = Word32 structure ii = IntInf structure i32 = Int32 structure w8a = Word8Array (* Depends on Word8, Word, String, Substring *) structure by = Byte (* Depends on Word8Array among others. *) structure bv = BoolArray structure iv = IntArray structure rv = RealArray structure rl = Real (* Depends on IEEEReal*) structure d = Date (* Depends on Time, Int, String, Char ... *) structure th = Thread (* Non-standard. May not actually need to include explicitly. *) structure t = Timer structure c = CommandLine structure o = OS (* Depends on Time *) structure t = TextIO structure b = BinIO structure nh = NetHostDB structure np = NetProtDB structure ns = NetServDB structure sk = Socket structure isk = INetSock structure usk = UnixSock structure pr = PackRealBig (* also declares PackRealLittle *) structure pw = PackWord8Big (* also declares Pack8Little. ...*) structure a2 = Array2 structure i2 = IntArray2 structure ml90 = SML90 structure we = Weak structure si = Signal (* Unix and Windows structures are built separately. *) in end; polyml-5.6/basis/processes.ML000066400000000000000000000415751265146633400162670ustar00rootroot00000000000000(* Title: Process package for ML. Author: David C. J. Matthews Copyright (c) 2007 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is provided for backwards compatibility. New programs should use the Thread structure directly. *) structure Process: sig type 'a channel val channel: unit -> '_a channel val send: 'a channel * 'a -> unit val receive: 'a channel -> 'a val fork: (unit->unit)->unit val console: (unit->unit)->(unit->unit) val choice: (unit->unit)*(unit->unit)->unit val interruptConsoleProcesses: unit->unit end = struct open Thread.Thread Thread.Mutex Thread.ConditionVar val debug = ref false and identifiers = ref 0 and ids = ref 0; (* Each process created by fork, console or choice has this information as thread-local data. *) datatype processData = PROC of { synchro: (synchroniser * direction) list ref, (* The synchroniser chain. *) blocker: conditionVar, (* Condition var to block this process. *) processNo: int (* An identifier for debugging. *) } and synchroniser = SYNCH of { state: choicestate ref, (* The state of this choice. *) synchLock: mutex (* A mutex to protect the state variable. *) } and choicestate = ChoiceUntaken | ChoiceTaken of direction and direction = DirLeft | DirRight; val procTag = Universal.tag(): processData Universal.tag (* Get the process data for this thread. If it was created by a Thread call directly it may not yet have any process data so we need to make it now. *) fun get_process_data(): processData = case getLocal procTag of SOME p => p | NONE => let val pnum = (identifiers := !identifiers+1; !identifiers); val pData = PROC { synchro = ref [], blocker = conditionVar(), processNo = pnum } in setLocal(procTag, pData); pData end datatype 'a channel = CHAN of {senders: 'a procVal list ref, receivers: 'a option ref procVal list ref, chanLock: mutex, Id: int} (* This represents a suspended process. The 'a is either a value to be sent or a "basket", a reference to hold the result. *) withtype 'a procVal = conditionVar * processData * 'a fun channel () : 'a channel = CHAN {senders = ref [], receivers = ref [], chanLock = mutex(), Id = (ids := !ids+1; !ids) } datatype 'a synchResult = NoMatch | FoundMatch of 'a procVal (* Prunes the synchroniser list to remove committed choices. Returns the first non-committed synchroniser or the first committed synchroniser with a choice that is taken in the "wrong" direction (i.e. which ndicates that this process must not be allowed to communicate). *) fun getActiveSynchroniser(PROC{synchro, ...}, unlockAfter) = let fun getSynch [] = [] | getSynch(l as (SYNCH{state, synchLock}, dir) :: t) = ( lock synchLock; case ! state of ChoiceUntaken => (* This is untaken. Stop here. *) ( if unlockAfter then unlock synchLock else (getSynch t; ()); (* We need to lock any others. *) l ) | ChoiceTaken d => (* This is taken. Stop here if it is taken in a different way. *) ( unlock synchLock; if d = dir then getSynch t else l ) ) val newSynchList = getSynch(! synchro) in (* We can update the list for this process. We don't need to lock the synchro variable since it is only updated either by the process itself or when this process is waiting on a channel, which is locked before access. *) synchro := newSynchList; newSynchList end (* Try to find a matching process. toSearch is the list of corresponding processes i.e. receivers if we are trying to send, senders if we are trying to receive. The result is a pair of the updated version of the toSearch, with the matching process removed if a match has been found and the matching process's data. *) fun synchronise (toSearch: 'a procVal list, thisProcess) : 'a procVal list * 'a synchResult = let (* Release the lock on the synchroniser for the process that is looking for a partner. This is only called if no matching process can be found. *) fun releaseLock(PROC{synchro = ref synchro, ...}) = List.app (fn (SYNCH{synchLock, state=ref ChoiceUntaken}, _) => unlock synchLock | _ => ()) synchro (* Commit the choices and release the locks. If some entries are shared between the two processes then we may find some entries already set. *) fun commitChoices(PROC{synchro=synchro as ref synch, ...}) = ( List.app (fn (SYNCH{synchLock, state=state as ref ChoiceUntaken}, dir) => (state := ChoiceTaken dir; unlock synchLock) | _ => ()) synch; synchro := [] (* Since all are taken we can set this to the empty list. *) ) (* Get the first synchroniser and lock it unless it is already committed. *) val mySynch = getActiveSynchroniser(thisProcess, false (* Leave locked. *)) (* Get the list of synchronisers for a potential matching process. Generally any process on the sender list will match a receiver and vice versa. The exception is if the two processes are alternative choices. We have to be careful with the synchroniser lists. We've already locked the list for our process so we mustn't lock any synchronisers that are shared. *) datatype matchResult = MrTaken | MrAlternatives | MrOK of (synchroniser * direction) list fun getMatchingSynchs(PROC{synchro, ...}) = let fun getSynch([], _) = MrOK [] | getSynch(l as (SYNCH{state, ...}, dir) :: t, myL as (SYNCH{state=s, ...}, myDir) :: myT) = if s <> state then (* Different references - safe to lock. *) lockSynch(l, myL) else (* Same reference - already locked. *) if dir <> myDir (* These are different choices. *) then MrAlternatives (* Not allowed to communicate. *) else (* OK, same choice: test the rest*) getSynch(t, myT) | getSynch(l, []) = (* The list of synchronisers for the original process is empty or has run out before this. *) lockSynch(l, []) and lockSynch(l as (SYNCH{state, synchLock}, dir) :: t, myL) = ( lock synchLock; case ! state of ChoiceUntaken => (* This is untaken. Stop here. *) ( getSynch(t, myL); (* We need to lock any others. *) MrOK l ) | ChoiceTaken d => (* This is taken. Stop here if it is taken in a different way. *) ( unlock synchLock; if d = dir then getSynch(t, myL) else MrTaken ) ) | lockSynch _ = raise Match (* Suppress warning *) in getSynch(! synchro, mySynch) end fun findAProcess [] = (* Find a process that matches and return the new list of partners and the new list of runnable processes. *) (* No match *) ([], NoMatch) | findAProcess((entry as (_,d,_)) :: t) = case getMatchingSynchs d of MrTaken => (* This process is a committed choice in a different direction. Drop it from the list since it can never communicate. *) findAProcess t | MrAlternatives => (* This process is an alternative choice with our process. It can still communicate, just not with us. Skip this and try the next. *) let val (clist, result) = findAProcess t in (entry :: clist, result) end | MrOK _ => (t, FoundMatch entry) (* Return the new list. *) in case mySynch of (SYNCH{state = ref (ChoiceTaken _), ...}, _) :: _ => (* This choice is already taken - kill this process. Actually all we do at this stage is pretend that the process cannot communicate, and suspend it. Later it may be removed from the channel. *) (toSearch, NoMatch) | _ => (* No synch or uncommitted choice. *) case findAProcess toSearch of t as (_, NoMatch) => (releaseLock thisProcess; t) | t as (_, FoundMatch(_,p,_)) => (commitChoices thisProcess; commitChoices p; t) end (* We need to ensure that interrupts are delivered synchronously when synchronising rather than risk receiving an interrupt while holding a lock. *) fun blockInterrupt (f: unit->'a) = let open Thread val oldState = getAttributes() in case List.find (fn InterruptState _ => true | _ => false) oldState of SOME(InterruptState InterruptDefer) => f() (* Continue to defer. *) | SOME(InterruptState InterruptSynch) => f() (* No need to change. *) | _ => (* Unset(?) or asynchronous. Have to make synchronous. *) let val () = setAttributes[InterruptState InterruptSynch] (* Call the function. It may raise an Interrupt exception if it has to wait. In that case we still need to restore the old state. *) val result = f() handle exn => (setAttributes oldState; raise exn) val () = setAttributes oldState; in result end end fun send (CHAN {senders, receivers, chanLock, ...}, v:'a) = blockInterrupt(fn () => let val () = lock chanLock; val myProcessData as PROC { blocker, ...} = get_process_data() in case synchronise(!receivers, myProcessData) of (newlist, FoundMatch (p,_,basket)) (* Success *) => ( basket := SOME v; (* Put the sent value into the receiver's basket. *) receivers := newlist; signal p; (* Wake up the new thread. *) unlock chanLock ) | (newlist, NoMatch) (* Failure *) => (* Set the new receiver/sender list to include this process, and suspend ourselves, releasing the lock. *) ( senders := (blocker, myProcessData, v) :: !senders; receivers := newlist; (* Wait until we're woken up and release the lock. This may result in an exception but if the exception is raised the lock will be reacquired so we must unlock it in the handler. *) wait(blocker, chanLock) handle exn => (unlock chanLock; raise exn); (* We don't need the lock any longer. *) unlock chanLock ) end ) fun receive (CHAN {senders, receivers, chanLock, ...}): 'a = blockInterrupt(fn () => let val () = lock chanLock; val myProcessData as PROC { blocker, ...} = get_process_data() in case synchronise(!senders, myProcessData) of (newlist, FoundMatch (p,_,v)) (* Success *) => ( senders := newlist; signal p; (* Wake up the sending thread. *) unlock chanLock; v (* This is our result *) ) | (newlist, NoMatch) (* Failure *) => (* Set the new receiver/sender list to include this process, and suspend ourselves, releasing the lock. *) let val basket = ref NONE; (* Create a basket to receive the result. *) in receivers := (blocker, myProcessData, basket) :: !receivers; senders := newlist; (* Wait until we're woken up and release the lock. This may result in an exception but if the exception is raised the lock will be reacquired so we must unlock it in the handler. *) wait(blocker, chanLock) handle exn => (unlock chanLock; raise exn); (* We don't need the lock any longer. *) unlock chanLock; valOf(!basket) (* This should have been set to SOME v by the sender. *) end end ) fun new_process f synch attrs = (* Make a new process. *) let val pnum = (identifiers := !identifiers+1; !identifiers); val data = PROC { synchro = ref synch, processNo = pnum, blocker = conditionVar() } fun fun_to_fork () = ( setLocal(procTag, data); (f () handle _ => ()) ) val newproc = fork(fun_to_fork, attrs) in if !debug then (PolyML.print("new_process:", data); ()) else (); newproc end fun fork f = let (* Get the parent's synchroniser and remove any redundant entries. *) val synch = getActiveSynchroniser(get_process_data(), true) val _ = new_process f synch (* Share the parent's synchroniser. *) [EnableBroadcastInterrupt false] (* Does not accept broadcasts. *) in () end and console f = let (* Get the parent's synchroniser and remove any redundant entries. *) val synch = getActiveSynchroniser(get_process_data(), true) val threadId = new_process f synch (* Share the parent's synchroniser. *) [EnableBroadcastInterrupt true] (* Accepts broadcasts. *) in (* Return a function that will interrupt the process. *) fn () => interrupt threadId end and choice (f, g) =(* Fork a pair of "choice" processes. *) let (* Get the parent's synchroniser and remove any redundant entries. *) val synch = getActiveSynchroniser(get_process_data(), true) (* If the parent is already a Choice (whether Taken or not), we run the new processes in Parallel with it. The reason for this is that if we have choice( (choice(a,b); c), d) we allow both a and c (say) to communicate (N.B. "choice" creates two new processes and returns immediately so c runs in parallel with a and b). It is actually equivalent to a.c + b.c + d . *) val newSynch = SYNCH{state = ref ChoiceUntaken, synchLock = mutex()} in new_process g (synch @ [(newSynch, DirLeft)]) [EnableBroadcastInterrupt false]; new_process f (synch @ [(newSynch, DirRight)]) [EnableBroadcastInterrupt false]; () end val interruptConsoleProcesses = broadcastInterrupt end; polyml-5.6/config.guess000077500000000000000000001235501265146633400152400ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-03-23' # This file 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: polyml-5.6/config.h.in000066400000000000000000000506451265146633400147470ustar00rootroot00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to the type of elements in the array set by `getgroups'. Usually this is either `int' or `gid_t'. */ #undef GETGROUPS_T /* Define to 1 if the `getpgrp' function requires zero arguments. */ #undef GETPGRP_VOID /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ASM_ELF_H /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if your system has a working `chown' function. */ #undef HAVE_CHOWN /* Define to 1 if you have the `ctermid' function. */ #undef HAVE_CTERMID /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the declaration of `fpsetmask', and to 0 if you don't. */ #undef HAVE_DECL_FPSETMASK /* Define to 1 if you have the header file. */ #undef HAVE_DIRECT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `dlopen' function. */ #undef HAVE_DLOPEN /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `dtoa' function. */ #undef HAVE_DTOA /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have and header files. */ #undef HAVE_ELF_ABI_H /* Define to 1 if you have the header file. */ #undef HAVE_ELF_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_EXCPT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FENV_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the header file. */ #undef HAVE_FPU_CONTROL_H /* Define to 1 if you have the `ftruncate' function. */ #undef HAVE_FTRUNCATE /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if your system has a working `getgroups' function. */ #undef HAVE_GETGROUPS /* Define to 1 if you have the `gethostbyaddr' function. */ #undef HAVE_GETHOSTBYADDR /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `getrusage' function. */ #undef HAVE_GETRUSAGE /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the gmp.h header file */ #undef HAVE_GMP_H /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* Define to 1 if the system has the type `IMAGE_FILE_HEADER'. */ #undef HAVE_IMAGE_FILE_HEADER /* Define to 1 if the system has the type `intptr_t'. */ #undef HAVE_INTPTR_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* Define to 1 if you have the `gcc' library (-lgcc). */ #undef HAVE_LIBGCC /* Define to 1 if you have the `gcc_s' library (-lgcc_s). */ #undef HAVE_LIBGCC_S /* Define to 1 if you have the `gdi32' library (-lgdi32). */ #undef HAVE_LIBGDI32 /* Define to 1 if you have libgmp */ #undef HAVE_LIBGMP /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `stdc++' library (-lstdc++). */ #undef HAVE_LIBSTDC__ /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ #undef HAVE_LIBWS2_32 /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the `Xext' library (-lXext). */ #undef HAVE_LIBXEXT /* Define to 1 if you have the `Xm' library (-lXm). */ #undef HAVE_LIBXM /* Define to 1 if you have the `Xt' library (-lXt). */ #undef HAVE_LIBXT /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if the system has the type `long long'. */ #undef HAVE_LONG_LONG /* Define to 1 if `lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_MACHINE_RELOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_O_RELOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if `gregs' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_GREGS /* Define to 1 if `mc_esp' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_MC_ESP /* Define to 1 if `regs' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_REGS /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the `mkfifo' function. */ #undef HAVE_MKFIFO /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the `mprotect' function. */ #undef HAVE_MPROTECT /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H /* Define to 1 if you have the `pathconf' function. */ #undef HAVE_PATHCONF /* Define to 1 if you have the PE/COFF types. */ #undef HAVE_PECOFF /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `rmdir' function. */ #undef HAVE_RMDIR /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the header file. */ #undef HAVE_SEMAPHORE_H /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the `sigaltstack' function. */ #undef HAVE_SIGALTSTACK /* Define to 1 if the system has the type `sighandler_t'. */ #undef HAVE_SIGHANDLER_T /* Define to 1 if you have the header file. */ #undef HAVE_SIGINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if the system has the type `sig_t'. */ #undef HAVE_SIG_T /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if the system has the type `ssize_t'. */ #undef HAVE_SSIZE_T /* Define to 1 if the system has the type `stack_t'. */ #undef HAVE_STACK_T /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strtod' function. */ #undef HAVE_STRTOD /* Define to 1 if `ss' is a member of `struct mcontext'. */ #undef HAVE_STRUCT_MCONTEXT_SS /* Define to 1 if the system has the type `struct sigcontext'. */ #undef HAVE_STRUCT_SIGCONTEXT /* Define to 1 if `sun_len' is a member of `struct sockaddr_un'. */ #undef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN /* Define to 1 if `st_atim' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIM /* Define to 1 if `st_atimensec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMENSEC /* Define to 1 if `st_atimespec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMESPEC /* Define to 1 if `st_atime_n' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIME_N /* Define to 1 if `st_uatime' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_UATIME /* Define to 1 if `ss' is a member of `struct __darwin_mcontext32'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT32_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext32'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT32___SS /* Define to 1 if `ss' is a member of `struct __darwin_mcontext64'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT64_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext64'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT64___SS /* Define to 1 if `ss' is a member of `struct __darwin_mcontext'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT___SS /* Define to 1 if you have the `sysctl' function. */ #undef HAVE_SYSCTL /* Define to 1 if you have the `sysctlbyname' function. */ #undef HAVE_SYSCTLBYNAME /* Define to 1 if the system has the type `SYSTEM_LOGICAL_PROCESSOR_INFORMATION'. */ #undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ELF_386_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ELF_AMD64_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ELF_SPARC_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the `tcdrain' function. */ #undef HAVE_TCDRAIN /* Define to 1 if you have the header file. */ #undef HAVE_TCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_UCONTEXT_H /* Define to 1 if the system has the type `ucontext_t'. */ #undef HAVE_UCONTEXT_T /* Define to 1 if the system has the type `uintptr_t'. */ #undef HAVE_UINTPTR_T /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_X11_XLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_XM_XM_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define if the host is an ARM (64-bit) */ #undef HOSTARCHITECTURE_AARCH64 /* Define if the host is an ARM (32-bit) */ #undef HOSTARCHITECTURE_ARM /* Define if the host is an Itanium */ #undef HOSTARCHITECTURE_IA64 /* Define if the host is a MIPS (32-bit) */ #undef HOSTARCHITECTURE_MIPS /* Define if the host is a PowerPC (32-bit) */ #undef HOSTARCHITECTURE_PPC /* Define if the host is a PowerPC (64-bit) */ #undef HOSTARCHITECTURE_PPC64 /* Define if the host is a Sparc (32-bit) */ #undef HOSTARCHITECTURE_SPARC /* Define if the host is an X86 (32-bit) */ #undef HOSTARCHITECTURE_X86 /* Define if the host is an X86 (64-bit) */ #undef HOSTARCHITECTURE_X86_64 /* Define if using the interpreter */ #undef INTERPRETED /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define prefix of external names */ #undef POLY_LINKAGE_PREFIX /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define if the X-Windows interface should be built */ #undef WITH_XWINDOWS /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type wide enough to hold a pointer, if such a type exists, and if the system does not define it. */ #undef intptr_t /* Define to `int' if does not define. */ #undef mode_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type wide enough to hold a pointer, if such a type exists, and if the system does not define it. */ #undef uintptr_t /* Define as `fork' if `vfork' does not work. */ #undef vfork polyml-5.6/config.sub000077500000000000000000001057751265146633400147140ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-09-11' # This file 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: polyml-5.6/configure000077500000000000000000026504651265146633400146430ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Poly/ML 5.6. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and polyml AT polyml $0: DOT org about your system, including any error possibly $0: output before this message. Then install a modern $0: shell, or manually run the script under such a shell if $0: you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Poly/ML' PACKAGE_TARNAME='polyml' PACKAGE_VERSION='5.6' PACKAGE_STRING='Poly/ML 5.6' PACKAGE_BUGREPORT='polyml AT polyml DOT org' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_unique_file="polyexports.h" enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS moduledir GIT_VERSION gitinstalled NO_UNDEFINED_FALSE NO_UNDEFINED_TRUE NATIVE_WINDOWS_FALSE NATIVE_WINDOWS_TRUE ARCHINTERPRET64_FALSE ARCHINTERPRET64_TRUE ARCHINTERPRET_FALSE ARCHINTERPRET_TRUE ARCHX86_64_FALSE ARCHX86_64_TRUE ARCHI386_FALSE ARCHI386_TRUE POW_LIB LIBOBJS EXPMACHO_FALSE EXPMACHO_TRUE EXPELF_FALSE EXPELF_TRUE EXPPECOFF_FALSE EXPPECOFF_TRUE INTERNAL_LIBFFI_FALSE INTERNAL_LIBFFI_TRUE FFI_LIBS FFI_CFLAGS subdirs PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG ALLOCA XMKMF sys_symbol_underscore am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCASFLAGS CCAS CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTOOL OBJDUMP DLLTOOL AS WINDOWSGUI_FALSE WINDOWSGUI_TRUE WINDRES OSFLAG host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_debug enable_windows_gui enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_maintainer_mode enable_largefile with_x with_gmp with_system_libffi with_threads enable_native_codegeneration with_moduledir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP CCAS CCASFLAGS XMKMF PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR FFI_CFLAGS FFI_LIBS' ac_subdirs_all='libffi' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Poly/ML 5.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/polyml] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Poly/ML 5.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-debug Compiles without optimisation for debugging --enable-windows-gui create a GUI in Windows. If this is disabled use a Windows console. [default=yes] --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-largefile omit support for large files --disable-native-codegeneration disable the native code generator and use the slow byte code interpreter instead. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-gmp use the GMP library for arbitrary precision arithmetic [default=check] --with-system-libffi use the version of libffi installed on your system rather than the version supplied with poly [default=no] --with-threads use the pthread library for multi-threading [default=check] --with-moduledir=DIR directory for Poly/ML modules Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) XMKMF Path to xmkmf, Makefile generator for X Window System PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path FFI_CFLAGS C compiler flags for FFI, overriding pkg-config FFI_LIBS linker flags for FFI, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Poly/ML configure 5.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------------- ## ## Report this to polyml AT polyml DOT org ## ## --------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Poly/ML $as_me 5.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='polyml' VERSION='5.6' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # libtoolize recommends this line. ac_debug_mode="no" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; ac_debug_mode="yes" fi if test "$ac_debug_mode" != "yes"; then # Default to maximum optimisation. -O2 is not good enough. # Set CCASFLAGS to empty so that it doesn't get set to CFLAGS. # The -g option on assembler causes problems on Sparc/Solaris 10. # test X || Y is equivalent to if !X then Y test "${CFLAGS+set}" = set || CFLAGS="-O3" test "${CXXFLAGS+set}" = set || CXXFLAGS="-O3" test "${CCASFLAGS+set}" = set || CCASFLAGS="" else test "${CFLAGS+set}" = set || CFLAGS="-g" test "${CXXFLAGS+set}" = set || CXXFLAGS="-g" test "${CCASFLAGS+set}" = set || CCASFLAGS="" fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Set the OS flag. This should not really be required but is still used in # a few places for OS-specific quirks that can't be handled by more specific tests. # Check also for mingw in which case we want to build native Windows. poly_native_windows=no # If we are building on cygwin or mingw we need to give the -no-defined flag to # build a DLL. # On mingw we need the -mthreads flag and this must be included in CFLAGS and # CXXFLAGS before the LIBTOOL macros. # When building native Windows set the flag to build the Unicode version and # the API version to at least Windows Vista to allow condition variables. poly_no_undefined=no case "${host_os}" in darwin*) OSFLAG=-DMACOSX ;; sunos* | solaris*) OSFLAG=-DSOLARIS ;; *mingw*) OSFLAG="-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi poly_native_windows=yes poly_no_undefined=yes CFLAGS="$CFLAGS -mthreads" CXXFLAGS="$CXXFLAGS -mthreads" ;; *cygwin*) poly_no_undefined=yes if test "$ac_cv_c_compiler_gnu" = "yes"; then if $CC -dumpmachine | grep -q mingw; then OSFLAG="-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600" poly_native_windows=yes CFLAGS="$CFLAGS -mthreads" CXXFLAGS="$CXXFLAGS -mthreads" fi fi ;; esac # Enable/Disable the GUI in Windows. Should this only be present if # building on mingw? # Check whether --enable-windows-gui was given. if test "${enable_windows_gui+set}" = set; then : enableval=$enable_windows_gui; case "${enableval}" in yes) enablegui=true ;; no) enablegui=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-windows-gui" "$LINENO" 5 ;; esac else enablegui=true fi if test x$enablegui = xtrue; then WINDOWSGUI_TRUE= WINDOWSGUI_FALSE='#' else WINDOWSGUI_TRUE='#' WINDOWSGUI_FALSE= fi # libpolyml can be a DLL but libpolymain can't. # Disable shared libraries by default. It complicates installation to "non-standard" places. case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi enable_dlopen=no # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Check we're in the right directory ac_config_headers="$ac_config_headers config.h" # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # The following check was supposed to check that there was actually a # C++ compiler but doesn't work properly if CXX is set by the user. #AC_CHECK_PROG(check_cpp, $CXX, "yes", "no") #if test "$check_cpp" != "yes"; then # AC_MSG_ERROR([No C++ compiler found. Unable to build Poly/ML.]) #fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 $as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi # Activate large file mode if needed # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgcc" >&5 $as_echo_n "checking for main in -lgcc... " >&6; } if ${ac_cv_lib_gcc_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgcc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gcc_main=yes else ac_cv_lib_gcc_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcc_main" >&5 $as_echo "$ac_cv_lib_gcc_main" >&6; } if test "x$ac_cv_lib_gcc_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGCC 1 _ACEOF LIBS="-lgcc $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgcc_s" >&5 $as_echo_n "checking for main in -lgcc_s... " >&6; } if ${ac_cv_lib_gcc_s_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgcc_s $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gcc_s_main=yes else ac_cv_lib_gcc_s_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcc_s_main" >&5 $as_echo "$ac_cv_lib_gcc_s_main" >&6; } if test "x$ac_cv_lib_gcc_s_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGCC_S 1 _ACEOF LIBS="-lgcc_s $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lstdc++" >&5 $as_echo_n "checking for main in -lstdc++... " >&6; } if ${ac_cv_lib_stdcpp_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lstdc++ $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_stdcpp_main=yes else ac_cv_lib_stdcpp_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdcpp_main" >&5 $as_echo "$ac_cv_lib_stdcpp_main" >&6; } if test "x$ac_cv_lib_stdcpp_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSTDC__ 1 _ACEOF LIBS="-lstdc++ $LIBS" fi # These can sometimes be in the standard libraries { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 $as_echo_n "checking for library containing dlopen... " >&6; } if ${ac_cv_search_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl dld; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dlopen+:} false; then : break fi done if ${ac_cv_search_dlopen+:} false; then : else ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 $as_echo "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5 $as_echo_n "checking for library containing floor... " >&6; } if ${ac_cv_search_floor+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char floor (); int main () { return floor (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_floor=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_floor+:} false; then : break fi done if ${ac_cv_search_floor+:} false; then : else ac_cv_search_floor=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 $as_echo "$ac_cv_search_floor" >&6; } ac_res=$ac_cv_search_floor if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # The next two are only used with mingw { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5 $as_echo_n "checking for main in -lws2_32... " >&6; } if ${ac_cv_lib_ws2_32_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lws2_32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ws2_32_main=yes else ac_cv_lib_ws2_32_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5 $as_echo "$ac_cv_lib_ws2_32_main" >&6; } if test "x$ac_cv_lib_ws2_32_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBWS2_32 1 _ACEOF LIBS="-lws2_32 $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgdi32" >&5 $as_echo_n "checking for main in -lgdi32... " >&6; } if ${ac_cv_lib_gdi32_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgdi32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gdi32_main=yes else ac_cv_lib_gdi32_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdi32_main" >&5 $as_echo "$ac_cv_lib_gdi32_main" >&6; } if test "x$ac_cv_lib_gdi32_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGDI32 1 _ACEOF LIBS="-lgdi32 $LIBS" fi ## External names on Win64. They have no leading underscores as per ## the X64 ABI published by MS. Earlier versions of GCC (anything ## prior to 4.5.0) were faulty. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 $as_echo_n "checking for _ prefix in compiled symbols... " >&6; } if ${lt_cv_sys_symbol_underscore+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sys_symbol_underscore=no cat > conftest.$ac_ext <<_LT_EOF void nm_test_func(){} int main(){nm_test_func;return 0;} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. ac_nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$ac_nlist"; then # See whether the symbols have a leading underscore. if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then lt_cv_sys_symbol_underscore=yes else if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then : else echo "configure: cannot find nm_test_func in $ac_nlist" >&5 fi fi else echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "configure: failed program was:" >&5 cat conftest.c >&5 fi rm -rf conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 $as_echo "$lt_cv_sys_symbol_underscore" >&6; } sys_symbol_underscore=$lt_cv_sys_symbol_underscore if test x$sys_symbol_underscore = xyes; then $as_echo "#define POLY_LINKAGE_PREFIX _" >>confdefs.h fi # Solaris needs -lsocket, -lnsl and -lrt { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getsockopt" >&5 $as_echo_n "checking for library containing getsockopt... " >&6; } if ${ac_cv_search_getsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getsockopt (); int main () { return getsockopt (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getsockopt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getsockopt+:} false; then : break fi done if ${ac_cv_search_getsockopt+:} false; then : else ac_cv_search_getsockopt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getsockopt" >&5 $as_echo "$ac_cv_search_getsockopt" >&6; } ac_res=$ac_cv_search_getsockopt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_wait" >&5 $as_echo_n "checking for library containing sem_wait... " >&6; } if ${ac_cv_search_sem_wait+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_wait (); int main () { return sem_wait (); ; return 0; } _ACEOF for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_wait=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_wait+:} false; then : break fi done if ${ac_cv_search_sem_wait+:} false; then : else ac_cv_search_sem_wait=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_wait" >&5 $as_echo "$ac_cv_search_sem_wait" >&6; } ac_res=$ac_cv_search_sem_wait if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Check for X and Motif headers and libraries { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "x${with_x}" = "xyes"; then $as_echo "#define WITH_XWINDOWS 1" >>confdefs.h if test "$x_includes" != "" ; then if test "$x_includes" != "NONE" ; then CFLAGS="$CFLAGS -I$x_includes" CXXFLAGS="$CXXFLAGS -I$x_includes" CPPFLAGS="$CPPFLAGS -I$x_includes" fi fi if test "$x_libraries" != "" ; then if test "$x_libraries" != "NONE" ; then LIBS="-L$x_libraries $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCreateGC in -lX11" >&5 $as_echo_n "checking for XCreateGC in -lX11... " >&6; } if ${ac_cv_lib_X11_XCreateGC+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XCreateGC (); int main () { return XCreateGC (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_X11_XCreateGC=yes else ac_cv_lib_X11_XCreateGC=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_XCreateGC" >&5 $as_echo "$ac_cv_lib_X11_XCreateGC" >&6; } if test "x$ac_cv_lib_X11_XCreateGC" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBX11 1 _ACEOF LIBS="-lX11 $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XtMalloc in -lXt" >&5 $as_echo_n "checking for XtMalloc in -lXt... " >&6; } if ${ac_cv_lib_Xt_XtMalloc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XtMalloc (); int main () { return XtMalloc (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xt_XtMalloc=yes else ac_cv_lib_Xt_XtMalloc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xt_XtMalloc" >&5 $as_echo "$ac_cv_lib_Xt_XtMalloc" >&6; } if test "x$ac_cv_lib_Xt_XtMalloc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXT 1 _ACEOF LIBS="-lXt $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XextAddDisplay in -lXext" >&5 $as_echo_n "checking for XextAddDisplay in -lXext... " >&6; } if ${ac_cv_lib_Xext_XextAddDisplay+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XextAddDisplay (); int main () { return XextAddDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xext_XextAddDisplay=yes else ac_cv_lib_Xext_XextAddDisplay=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XextAddDisplay" >&5 $as_echo "$ac_cv_lib_Xext_XextAddDisplay" >&6; } if test "x$ac_cv_lib_Xext_XextAddDisplay" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXEXT 1 _ACEOF LIBS="-lXext $LIBS" fi if test "$xm_includes" != "" ; then if test "$xm_includes" != "NONE" ; then CFLAGS="$CFLAGS -I$xm_includes" CXXFLAGS="$CXXFLAGS -I$xm_includes" CPPFLAGS="$CPPFLAGS -I$xm_includes" fi fi if test "$xm_libraries" != "" ; then if test "$xm_libraries" != "NONE" ; then LIBS="-L$xm_libraries $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XmGetDestination in -lXm" >&5 $as_echo_n "checking for XmGetDestination in -lXm... " >&6; } if ${ac_cv_lib_Xm_XmGetDestination+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XmGetDestination (); int main () { return XmGetDestination (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xm_XmGetDestination=yes else ac_cv_lib_Xm_XmGetDestination=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xm_XmGetDestination" >&5 $as_echo "$ac_cv_lib_Xm_XmGetDestination" >&6; } if test "x$ac_cv_lib_Xm_XmGetDestination" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXM 1 _ACEOF LIBS="-lXm $LIBS" fi fi # TODO: May need AC_PATH_XTRA for Solaris # Check for headers ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi for ac_header in stdio.h time.h fcntl.h float.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/systeminfo.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/time.h unistd.h values.h dlfcn.h signal.h ucontext.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in assert.h ctype.h direct.h errno.h excpt.h fenv.h fpu_control.h grp.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in ieeefp.h io.h math.h memory.h netinet/tcp.h poll.h pwd.h siginfo.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stdarg.h sys/errno.h sys/filio.h sys/mman.h sys/resource.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/signal.h sys/sockio.h sys/stat.h termios.h sys/termios.h sys/times.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/select.h sys/sysctl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/elf_SPARC.h sys/elf_386.h sys/elf_amd64.h asm/elf.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in windows.h tchar.h semaphore.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Only check for the X headers if the user said --with-x. if test "${with_x+set}" = set; then for ac_header in X11/Xlib.h Xm/Xm.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check for GMP # Check whether --with-gmp was given. if test "${with_gmp+set}" = set; then : withval=$with_gmp; else with_gmp=check fi # If we want GMP check that the library and headers are installed. if test "x$with_gmp" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpn_tdiv_qr in -lgmp" >&5 $as_echo_n "checking for __gmpn_tdiv_qr in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpn_tdiv_qr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpn_tdiv_qr (); int main () { return __gmpn_tdiv_qr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpn_tdiv_qr=yes else ac_cv_lib_gmp___gmpn_tdiv_qr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpn_tdiv_qr" >&5 $as_echo "$ac_cv_lib_gmp___gmpn_tdiv_qr" >&6; } if test "x$ac_cv_lib_gmp___gmpn_tdiv_qr" = xyes; then : $as_echo "#define HAVE_LIBGMP 1" >>confdefs.h LIBS="-lgmp $LIBS" ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : $as_echo "#define HAVE_GMP_H 1" >>confdefs.h else if test "x$with_gmp" != "xcheck"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-gmp was given, but gmp.h header file is not installed See \`config.log' for more details" "$LINENO" 5; } fi fi else if test "x$with_gmp" != "xcheck"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-gmp was given, but gmp library (version 4 or later) is not installed See \`config.log' for more details" "$LINENO" 5; } fi fi fi # libffi # libffi must be configured even if we are not building with it so that things like "make dist" work. subdirs="$subdirs libffi" # Use the internal version unless --with-system-libffi is given. # Check whether --with-system-libffi was given. if test "${with_system_libffi+set}" = set; then : withval=$with_system_libffi; else with_system_libffi=no fi # Libffi uses pkg-config. if test "x$with_system_libffi" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFI" >&5 $as_echo_n "checking for FFI... " >&6; } if test -n "$FFI_CFLAGS"; then pkg_cv_FFI_CFLAGS="$FFI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5 ($PKG_CONFIG --exists --print-errors "libffi") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFI_CFLAGS=`$PKG_CONFIG --cflags "libffi" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FFI_LIBS"; then pkg_cv_FFI_LIBS="$FFI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libffi\""; } >&5 ($PKG_CONFIG --exists --print-errors "libffi") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFI_LIBS=`$PKG_CONFIG --libs "libffi" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libffi" 2>&1` else FFI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libffi" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FFI_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_closure_loc in -lffi" >&5 $as_echo_n "checking for ffi_prep_closure_loc in -lffi... " >&6; } if ${ac_cv_lib_ffi_ffi_prep_closure_loc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lffi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ffi_prep_closure_loc (); int main () { return ffi_prep_closure_loc (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ffi_ffi_prep_closure_loc=yes else ac_cv_lib_ffi_ffi_prep_closure_loc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_prep_closure_loc" >&5 $as_echo "$ac_cv_lib_ffi_ffi_prep_closure_loc" >&6; } if test "x$ac_cv_lib_ffi_ffi_prep_closure_loc" = xyes; then : LIBS="-lffi $LIBS" ac_fn_c_check_header_mongrel "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default" if test "x$ac_cv_header_ffi_h" = xyes; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-system-libffi was given, but ffi.h header file cannot be found See \`config.log' for more details" "$LINENO" 5; } fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-system-libffi was given, but the ffi library is not installed See \`config.log' for more details" "$LINENO" 5; } fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ffi_prep_closure_loc in -lffi" >&5 $as_echo_n "checking for ffi_prep_closure_loc in -lffi... " >&6; } if ${ac_cv_lib_ffi_ffi_prep_closure_loc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lffi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ffi_prep_closure_loc (); int main () { return ffi_prep_closure_loc (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ffi_ffi_prep_closure_loc=yes else ac_cv_lib_ffi_ffi_prep_closure_loc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ffi_ffi_prep_closure_loc" >&5 $as_echo "$ac_cv_lib_ffi_ffi_prep_closure_loc" >&6; } if test "x$ac_cv_lib_ffi_ffi_prep_closure_loc" = xyes; then : LIBS="-lffi $LIBS" ac_fn_c_check_header_mongrel "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default" if test "x$ac_cv_header_ffi_h" = xyes; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-system-libffi was given, but ffi.h header file cannot be found See \`config.log' for more details" "$LINENO" 5; } fi else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-system-libffi was given, but the ffi library is not installed See \`config.log' for more details" "$LINENO" 5; } fi else FFI_CFLAGS=$pkg_cv_FFI_CFLAGS FFI_LIBS=$pkg_cv_FFI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } LIBS="$FFI_LIBS $LIBS" CFLAGS="$FFI_CFLAGS $CFLAGS" fi else # Use internal libffi CFLAGS="$CFLAGS -I../libffi/include" CXXFLAGS="$CXXFLAGS -I../libffi/include" fi if test "x$with_system_libffi" != "xyes"; then INTERNAL_LIBFFI_TRUE= INTERNAL_LIBFFI_FALSE='#' else INTERNAL_LIBFFI_TRUE='#' INTERNAL_LIBFFI_FALSE= fi # Check for pthreads. Mainly, this allows a single-threaded build on OSes such as Mac OS X # that don't have proper multi-threaded profiling. # Check whether --with-threads was given. if test "${with_threads+set}" = set; then : withval=$with_threads; else with_threads=check fi # If we want pthreads check that the library and headers are installed. # On Android pthread_create is in the standard library if test "x$with_threads" != "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_create" >&5 $as_echo_n "checking for library containing pthread_create... " >&6; } if ${ac_cv_search_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF for ac_lib in '' pthread; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_pthread_create=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_pthread_create+:} false; then : break fi done if ${ac_cv_search_pthread_create+:} false; then : else ac_cv_search_pthread_create=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pthread_create" >&5 $as_echo "$ac_cv_search_pthread_create" >&6; } ac_res=$ac_cv_search_pthread_create if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_LIBPTHREAD 1" >>confdefs.h ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h else if test "x$with_threads" != "xcheck"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-threads was given, but pthread.h header file is not installed See \`config.log' for more details" "$LINENO" 5; } fi fi else if test "x$with_threads" != "xcheck"; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "--with-threads was given, but pthread library is not installed See \`config.log' for more details" "$LINENO" 5; } fi fi fi # Find out which type of object code exporter to use. # If we have winnt use PECOFF. This really only applies to cygwin here. # If we have elf.h use ELF. # If we have mach-o/reloc.h use Mach-O # Otherwise use the C source code exporter. ac_fn_c_check_type "$LINENO" "IMAGE_FILE_HEADER" "ac_cv_type_IMAGE_FILE_HEADER" "#include " if test "x$ac_cv_type_IMAGE_FILE_HEADER" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_IMAGE_FILE_HEADER 1 _ACEOF $as_echo "#define HAVE_PECOFF /**/" >>confdefs.h polyexport=pecoff else ac_fn_c_check_header_mongrel "$LINENO" "elf.h" "ac_cv_header_elf_h" "$ac_includes_default" if test "x$ac_cv_header_elf_h" = xyes; then : $as_echo "#define HAVE_ELF_H /**/" >>confdefs.h polyexport=elf else ac_fn_c_check_header_mongrel "$LINENO" "mach-o/reloc.h" "ac_cv_header_mach_o_reloc_h" "$ac_includes_default" if test "x$ac_cv_header_mach_o_reloc_h" = xyes; then : $as_echo "#define HAVE_MACH_O_RELOC_H /**/" >>confdefs.h polyexport=macho else for ac_header in elf_abi.h machine/reloc.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF $as_echo "#define HAVE_ELF_ABI_H /**/" >>confdefs.h polyexport=elf fi done fi fi fi if test "$polyexport" = pecoff; then EXPPECOFF_TRUE= EXPPECOFF_FALSE='#' else EXPPECOFF_TRUE='#' EXPPECOFF_FALSE= fi if test "$polyexport" = elf; then EXPELF_TRUE= EXPELF_FALSE='#' else EXPELF_TRUE='#' EXPELF_FALSE= fi if test "$polyexport" = macho; then EXPMACHO_TRUE= EXPMACHO_FALSE='#' else EXPMACHO_TRUE='#' EXPMACHO_FALSE= fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" if test "x$ac_cv_type_intptr_t" = xyes; then : $as_echo "#define HAVE_INTPTR_T 1" >>confdefs.h else for ac_type in 'int' 'long int' 'long long int'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat >>confdefs.h <<_ACEOF #define intptr_t $ac_type _ACEOF ac_type= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test -z "$ac_type" && break done fi ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" if test "x$ac_cv_type_uintptr_t" = xyes; then : $as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h else for ac_type in 'unsigned int' 'unsigned long int' \ 'unsigned long long int'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat >>confdefs.h <<_ACEOF #define uintptr_t $ac_type _ACEOF ac_type= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test -z "$ac_type" && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi # Check for the various sub-second fields of the stat structure. ac_fn_c_check_member "$LINENO" "struct stat" "st_atim" "ac_cv_member_struct_stat_st_atim" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atim" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIM 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec" "ac_cv_member_struct_stat_st_atimespec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atimespec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIMESPEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIMENSEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_atime_n" "ac_cv_member_struct_stat_st_atime_n" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_atime_n" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_ATIME_N 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_uatime" "ac_cv_member_struct_stat_st_uatime" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_uatime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_UATIME 1 _ACEOF fi # Mac OS X, at any rate, needs signal.h to be included first. ac_fn_c_check_type "$LINENO" "ucontext_t" "ac_cv_type_ucontext_t" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_type_ucontext_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UCONTEXT_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct sigcontext" "ac_cv_type_struct_sigcontext" "#include \"signal.h\" " if test "x$ac_cv_type_struct_sigcontext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SIGCONTEXT 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "stack_t" "ac_cv_type_stack_t" "#include \"signal.h\" " if test "x$ac_cv_type_stack_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STACK_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "#include \"signal.h\" " if test "x$ac_cv_type_sighandler_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGHANDLER_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "sig_t" "ac_cv_type_sig_t" "#include \"signal.h\" " if test "x$ac_cv_type_sig_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIG_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include \"sys/types.h\" #include \"sys/socket.h\" " if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKLEN_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "SYSTEM_LOGICAL_PROCESSOR_INFORMATION" "ac_cv_type_SYSTEM_LOGICAL_PROCESSOR_INFORMATION" "#include \"windows.h\" " if test "x$ac_cv_type_SYSTEM_LOGICAL_PROCESSOR_INFORMATION" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" if test "x$ac_cv_type_long_long" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LONG_LONG 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SSIZE_T 1 _ACEOF fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 $as_echo_n "checking size of void*... " >&6; } if ${ac_cv_sizeof_voidp+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : else if test "$ac_cv_type_voidp" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void*) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_voidp=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 $as_echo "$ac_cv_sizeof_voidp" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOIDP $ac_cv_sizeof_voidp _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF # Checks for library functions. for ac_header in unistd.h do : ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5 $as_echo_n "checking for working chown... " >&6; } if ${ac_cv_func_chown_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_chown_works=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { char *f = "conftest.chown"; struct stat before, after; if (creat (f, 0600) < 0) return 1; if (stat (f, &before) < 0) return 1; if (chown (f, (uid_t) -1, (gid_t) -1) == -1) return 1; if (stat (f, &after) < 0) return 1; return ! (before.st_uid == after.st_uid && before.st_gid == after.st_gid); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_chown_works=yes else ac_cv_func_chown_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f conftest.chown fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chown_works" >&5 $as_echo "$ac_cv_func_chown_works" >&6; } if test $ac_cv_func_chown_works = yes; then $as_echo "#define HAVE_CHOWN 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIBOBJS " in *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking type of array argument to getgroups" >&5 $as_echo_n "checking type of array argument to getgroups... " >&6; } if ${ac_cv_type_getgroups+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_type_getgroups=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Mike Rendell for this test. */ $ac_includes_default #define NGID 256 #undef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) int main () { gid_t gidset[NGID]; int i, n; union { gid_t gval; long int lval; } val; val.lval = -1; for (i = 0; i < NGID; i++) gidset[i] = val.gval; n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1, gidset); /* Exit non-zero if getgroups seems to require an array of ints. This happens when gid_t is short int but getgroups modifies an array of ints. */ return n > 0 && gidset[n] != val.gval; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_type_getgroups=gid_t else ac_cv_type_getgroups=int fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_type_getgroups = cross; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then : ac_cv_type_getgroups=gid_t else ac_cv_type_getgroups=int fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_getgroups" >&5 $as_echo "$ac_cv_type_getgroups" >&6; } cat >>confdefs.h <<_ACEOF #define GETGROUPS_T $ac_cv_type_getgroups _ACEOF ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups" if test "x$ac_cv_func_getgroups" = xyes; then : fi # If we don't yet have getgroups, see if it's in -lbsd. # This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1. ac_save_LIBS=$LIBS if test $ac_cv_func_getgroups = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getgroups in -lbsd" >&5 $as_echo_n "checking for getgroups in -lbsd... " >&6; } if ${ac_cv_lib_bsd_getgroups+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getgroups (); int main () { return getgroups (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_getgroups=yes else ac_cv_lib_bsd_getgroups=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_getgroups" >&5 $as_echo "$ac_cv_lib_bsd_getgroups" >&6; } if test "x$ac_cv_lib_bsd_getgroups" = xyes; then : GETGROUPS_LIB=-lbsd fi fi # Run the program to test the functionality of the system-supplied # getgroups function only if there is such a function. if test $ac_cv_func_getgroups = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working getgroups" >&5 $as_echo_n "checking for working getgroups... " >&6; } if ${ac_cv_func_getgroups_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_getgroups_works=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* On Ultrix 4.3, getgroups (0, 0) always fails. */ return getgroups (0, 0) == -1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_getgroups_works=yes else ac_cv_func_getgroups_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getgroups_works" >&5 $as_echo "$ac_cv_func_getgroups_works" >&6; } else ac_cv_func_getgroups_works=no fi if test $ac_cv_func_getgroups_works = yes; then $as_echo "#define HAVE_GETGROUPS 1" >>confdefs.h fi LIBS=$ac_save_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getpgrp requires zero arguments" >&5 $as_echo_n "checking whether getpgrp requires zero arguments... " >&6; } if ${ac_cv_func_getpgrp_void+:} false; then : $as_echo_n "(cached) " >&6 else # Use it with a single arg. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { getpgrp (0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_getpgrp_void=no else ac_cv_func_getpgrp_void=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpgrp_void" >&5 $as_echo "$ac_cv_func_getpgrp_void" >&6; } if test $ac_cv_func_getpgrp_void = yes; then $as_echo "#define GETPGRP_VOID 1" >>confdefs.h fi if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat accepts an empty string" >&5 $as_echo_n "checking whether lstat accepts an empty string... " >&6; } if ${ac_cv_func_lstat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_lstat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return lstat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_empty_string_bug=no else ac_cv_func_lstat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_empty_string_bug" >&5 $as_echo "$ac_cv_func_lstat_empty_string_bug" >&6; } if test $ac_cv_func_lstat_empty_string_bug = yes; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_LSTAT_EMPTY_STRING_BUG 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done for ac_func in bzero dup2 floor ftruncate getcwd gethostbyaddr gethostname gettimeofday memmove do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in memset mkdir mkfifo munmap pathconf pow realpath rmdir select setlocale socket sqrt strdup strerror do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in uname dlopen getrusage strtod dtoa sigaction mkstemp getpagesize sigaltstack mmap mprotect do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ## There does not seem to be a declaration for fpsetmask in mingw64. ac_fn_c_check_decl "$LINENO" "fpsetmask" "ac_cv_have_decl_fpsetmask" "#include " if test "x$ac_cv_have_decl_fpsetmask" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FPSETMASK $ac_have_decl _ACEOF for ac_func in sysctl sysctlbyname do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in localtime_r gmtime_r do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in ctermid tcdrain do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Where are the registers? #Linux: ac_fn_c_check_member "$LINENO" "mcontext_t" "gregs" "ac_cv_member_mcontext_t_gregs" "#include \"ucontext.h\" " if test "x$ac_cv_member_mcontext_t_gregs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MCONTEXT_T_GREGS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "mcontext_t" "regs" "ac_cv_member_mcontext_t_regs" "#include \"ucontext.h\" " if test "x$ac_cv_member_mcontext_t_regs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MCONTEXT_T_REGS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "mcontext_t" "mc_esp" "ac_cv_member_mcontext_t_mc_esp" "#include \"ucontext.h\" " if test "x$ac_cv_member_mcontext_t_mc_esp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MCONTEXT_T_MC_ESP 1 _ACEOF fi #Mac OS X: ac_fn_c_check_member "$LINENO" "struct mcontext" "ss" "ac_cv_member_struct_mcontext_ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct_mcontext_ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_MCONTEXT_SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext" "ss" "ac_cv_member_struct___darwin_mcontext_ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext_ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT_SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext" "__ss" "ac_cv_member_struct___darwin_mcontext___ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext___ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT___SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext32" "ss" "ac_cv_member_struct___darwin_mcontext32_ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext32_ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT32_SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext32" "__ss" "ac_cv_member_struct___darwin_mcontext32___ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext32___ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT32___SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext64" "ss" "ac_cv_member_struct___darwin_mcontext64_ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext64_ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT64_SS 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct __darwin_mcontext64" "__ss" "ac_cv_member_struct___darwin_mcontext64___ss" "#include \"signal.h\" #include \"ucontext.h\" " if test "x$ac_cv_member_struct___darwin_mcontext64___ss" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT___DARWIN_MCONTEXT64___SS 1 _ACEOF fi # FreeBSD includes a sun_len member in struct sockaddr_un ac_fn_c_check_member "$LINENO" "struct sockaddr_un" "sun_len" "ac_cv_member_struct_sockaddr_un_sun_len" "#include " if test "x$ac_cv_member_struct_sockaddr_un_sun_len" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_UN_SUN_LEN 1 _ACEOF fi # Additional checks. AC_CANONICAL_HOST has already been called. #AC_CANONICAL_HOST # This option enables the native code generator. More precisely it allows # the byte code interpreter to be built on X86. # Check whether --enable-native-codegeneration was given. if test "${enable_native_codegeneration+set}" = set; then : enableval=$enable_native_codegeneration; case "${enableval}" in no) with_portable=yes ;; yes) with_portable=no ;; *) as_fn_error $? "bad value ${enableval} for --enable-native-codegeneration" "$LINENO" 5 ;; esac else with_portable=check fi case "${host_cpu}" in i[3456]86*) $as_echo "#define HOSTARCHITECTURE_X86 1" >>confdefs.h polyarch=i386 ;; x86_64* | amd64*) $as_echo "#define HOSTARCHITECTURE_X86_64 1" >>confdefs.h polyarch=x86_64 ;; sparc*) $as_echo "#define HOSTARCHITECTURE_SPARC 1" >>confdefs.h polyarch=interpret ;; powerpc64* | ppc64*) $as_echo "#define HOSTARCHITECTURE_PPC64 1" >>confdefs.h polyarch=interpret ;; power* | ppc*) $as_echo "#define HOSTARCHITECTURE_PPC 1" >>confdefs.h polyarch=interpret ;; arm*) $as_echo "#define HOSTARCHITECTURE_ARM 1" >>confdefs.h polyarch=interpret ;; aarch64*) $as_echo "#define HOSTARCHITECTURE_AARCH64 1" >>confdefs.h polyarch=interpret ;; ia64*) $as_echo "#define HOSTARCHITECTURE_IA64 1" >>confdefs.h polyarch=interpret ;; mips*) $as_echo "#define HOSTARCHITECTURE_MIPS 1" >>confdefs.h polyarch=interpret ;; *) as_fn_error $? "Poly/ML is not supported for this architecture" "$LINENO" 5 ;; esac # If we explicitly asked to use the interpreter set the architecture to interpreted. if test "x$with_portable" = "xyes" ; then if test "x$polyarch" != "xinterpret" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *******You have disabled native code generation. Are you really sure you want to do that?*******" >&5 $as_echo "$as_me: WARNING: *******You have disabled native code generation. Are you really sure you want to do that?*******" >&2;} fi polyarch=interpret fi # If we asked not to use the interpreter check we have native code support. if test "x$with_portable" = "xno" ; then if test "x$polyarch" = "xinterpret" ; then as_fn_error $? "--enable-native-codegeneration was given but native code is not supported on this platform" "$LINENO" 5 fi fi # Set the define if this is the interpreter. This is no longer actually used. if test "x$polyarch" = "xinterpret" ; then $as_echo "#define INTERPRETED 1" >>confdefs.h fi # Put this test at the end where it's less likely to be missed. # If we're compiling on Cygwin (and mingw?) and /usr/bin/file is not present # the link step will produce some strange warning messages of the form: # "Warning: linker path does not have real file for library -lXXX". I think # that's really a bug in autoconf but to explain what's happening to the user # add a test here. if test "$lt_cv_file_magic_cmd" = "func_win32_libid"; then if test \! -x /usr/bin/file; then echo "" echo "*** Warning: You are building Poly/ML on Cygwin/Mingw but '/usr/bin/file' cannot be found." echo "*** You can still go ahead and build Poly/ML but libpolyml will not be built as a" echo "*** shared library and you may get strange warning messages from the linker step." echo "*** Install the 'file' package to correct this problem." echo "" fi fi if test "$polyarch" = i386; then ARCHI386_TRUE= ARCHI386_FALSE='#' else ARCHI386_TRUE='#' ARCHI386_FALSE= fi if test "$polyarch" = x86_64; then ARCHX86_64_TRUE= ARCHX86_64_FALSE='#' else ARCHX86_64_TRUE='#' ARCHX86_64_FALSE= fi if test "$polyarch" = interpret -a X"$ac_cv_sizeof_voidp" = X4; then ARCHINTERPRET_TRUE= ARCHINTERPRET_FALSE='#' else ARCHINTERPRET_TRUE='#' ARCHINTERPRET_FALSE= fi if test "$polyarch" = interpret -a X"$ac_cv_sizeof_voidp" = X8; then ARCHINTERPRET64_TRUE= ARCHINTERPRET64_FALSE='#' else ARCHINTERPRET64_TRUE='#' ARCHINTERPRET64_FALSE= fi if test "$poly_native_windows" = yes; then NATIVE_WINDOWS_TRUE= NATIVE_WINDOWS_FALSE='#' else NATIVE_WINDOWS_TRUE='#' NATIVE_WINDOWS_FALSE= fi if test "$poly_no_undefined" = yes; then NO_UNDEFINED_TRUE= NO_UNDEFINED_FALSE='#' else NO_UNDEFINED_TRUE='#' NO_UNDEFINED_FALSE= fi # Test whether this is a git directory and set the version if possible # Extract the first word of "git", so it can be a program name with args. set dummy git; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_gitinstalled+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$gitinstalled"; then ac_cv_prog_gitinstalled="$gitinstalled" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_gitinstalled="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_gitinstalled" && ac_cv_prog_gitinstalled="no" fi fi gitinstalled=$ac_cv_prog_gitinstalled if test -n "$gitinstalled"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gitinstalled" >&5 $as_echo "$gitinstalled" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test X"$gitinstalled" = "Xyes" -a -d ".git"; then GIT_VERSION='-DGIT_VERSION=$(shell git describe --tags --always)' fi # Modules directory # Check whether --with-moduledir was given. if test "${with_moduledir+set}" = set; then : withval=$with_moduledir; moduledir=$withval else moduledir="\${libdir}/polyml/modules" fi moduledir=$moduledir # These are needed for building in a separate build directory, as they are # referenced from exportPoly.sml. ac_config_commands="$ac_config_commands basis" ac_config_commands="$ac_config_commands mlsource" ac_config_files="$ac_config_files Makefile libpolyml/Makefile libpolyml/polyml.pc libpolymain/Makefile" ac_config_files="$ac_config_files polyc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${WINDOWSGUI_TRUE}" && test -z "${WINDOWSGUI_FALSE}"; then as_fn_error $? "conditional \"WINDOWSGUI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INTERNAL_LIBFFI_TRUE}" && test -z "${INTERNAL_LIBFFI_FALSE}"; then as_fn_error $? "conditional \"INTERNAL_LIBFFI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXPPECOFF_TRUE}" && test -z "${EXPPECOFF_FALSE}"; then as_fn_error $? "conditional \"EXPPECOFF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXPELF_TRUE}" && test -z "${EXPELF_FALSE}"; then as_fn_error $? "conditional \"EXPELF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXPMACHO_TRUE}" && test -z "${EXPMACHO_FALSE}"; then as_fn_error $? "conditional \"EXPMACHO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARCHI386_TRUE}" && test -z "${ARCHI386_FALSE}"; then as_fn_error $? "conditional \"ARCHI386\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARCHX86_64_TRUE}" && test -z "${ARCHX86_64_FALSE}"; then as_fn_error $? "conditional \"ARCHX86_64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARCHINTERPRET_TRUE}" && test -z "${ARCHINTERPRET_FALSE}"; then as_fn_error $? "conditional \"ARCHINTERPRET\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARCHINTERPRET64_TRUE}" && test -z "${ARCHINTERPRET64_FALSE}"; then as_fn_error $? "conditional \"ARCHINTERPRET64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NATIVE_WINDOWS_TRUE}" && test -z "${NATIVE_WINDOWS_FALSE}"; then as_fn_error $? "conditional \"NATIVE_WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then as_fn_error $? "conditional \"NO_UNDEFINED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Poly/ML $as_me 5.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Poly/ML config.status 5.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "basis") CONFIG_COMMANDS="$CONFIG_COMMANDS basis" ;; "mlsource") CONFIG_COMMANDS="$CONFIG_COMMANDS mlsource" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "libpolyml/Makefile") CONFIG_FILES="$CONFIG_FILES libpolyml/Makefile" ;; "libpolyml/polyml.pc") CONFIG_FILES="$CONFIG_FILES libpolyml/polyml.pc" ;; "libpolymain/Makefile") CONFIG_FILES="$CONFIG_FILES libpolymain/Makefile" ;; "polyc") CONFIG_FILES="$CONFIG_FILES polyc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "basis":C) test -e basis || ln -sf ${ac_top_srcdir}/basis . ;; "mlsource":C) test -e mlsource || ln -sf ${ac_top_srcdir}/mlsource . ;; "polyc":F) chmod +x polyc ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi polyml-5.6/configure.ac000066400000000000000000000457011265146633400152070ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT([Poly/ML],[5.6],[polyml AT polyml DOT org],[polyml]) AM_INIT_AUTOMAKE AC_PREREQ(2.65) # libtoolize recommends this line. AC_CONFIG_MACRO_DIR([m4]) ac_debug_mode="no" AC_ARG_ENABLE([debug], [ --enable-debug Compiles without optimisation for debugging ], [ac_debug_mode="yes"]) if test "$ac_debug_mode" != "yes"; then # Default to maximum optimisation. -O2 is not good enough. # Set CCASFLAGS to empty so that it doesn't get set to CFLAGS. # The -g option on assembler causes problems on Sparc/Solaris 10. # test X || Y is equivalent to if !X then Y test "${CFLAGS+set}" = set || CFLAGS="-O3" test "${CXXFLAGS+set}" = set || CXXFLAGS="-O3" test "${CCASFLAGS+set}" = set || CCASFLAGS="" else test "${CFLAGS+set}" = set || CFLAGS="-g" test "${CXXFLAGS+set}" = set || CXXFLAGS="-g" test "${CCASFLAGS+set}" = set || CCASFLAGS="" fi AC_CANONICAL_HOST # Set the OS flag. This should not really be required but is still used in # a few places for OS-specific quirks that can't be handled by more specific tests. # Check also for mingw in which case we want to build native Windows. poly_native_windows=no # If we are building on cygwin or mingw we need to give the -no-defined flag to # build a DLL. # On mingw we need the -mthreads flag and this must be included in CFLAGS and # CXXFLAGS before the LIBTOOL macros. # When building native Windows set the flag to build the Unicode version and # the API version to at least Windows Vista to allow condition variables. poly_no_undefined=no case "${host_os}" in darwin*) AC_SUBST([OSFLAG], [-DMACOSX]) ;; sunos* | solaris*) AC_SUBST([OSFLAG], [-DSOLARIS]) ;; *mingw*) AC_SUBST([OSFLAG], ["-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600"]) AC_CHECK_TOOL(WINDRES, windres) poly_native_windows=yes poly_no_undefined=yes CFLAGS="$CFLAGS -mthreads" CXXFLAGS="$CXXFLAGS -mthreads" ;; *cygwin*) poly_no_undefined=yes if test "$ac_cv_c_compiler_gnu" = "yes"; then if $CC -dumpmachine | grep -q mingw; then AC_SUBST([OSFLAG], ["-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x600"]) poly_native_windows=yes CFLAGS="$CFLAGS -mthreads" CXXFLAGS="$CXXFLAGS -mthreads" fi fi ;; esac # Enable/Disable the GUI in Windows. Should this only be present if # building on mingw? AC_ARG_ENABLE([windows-gui], [AS_HELP_STRING([--enable-windows-gui], [create a GUI in Windows. If this is disabled use a Windows console. @<:@default=yes@:>@])], [case "${enableval}" in yes) enablegui=true ;; no) enablegui=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-windows-gui]) ;; esac], [enablegui=true]) AM_CONDITIONAL([WINDOWSGUI], [test x$enablegui = xtrue]) # libpolyml can be a DLL but libpolymain can't. # Disable shared libraries by default. It complicates installation to "non-standard" places. LT_INIT([win32-dll disable-shared]) AM_MAINTAINER_MODE # Check we're in the right directory AC_CONFIG_SRCDIR([polyexports.h]) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CXX # The following check was supposed to check that there was actually a # C++ compiler but doesn't work properly if CXX is set by the user. #AC_CHECK_PROG(check_cpp, $CXX, "yes", "no") #if test "$check_cpp" != "yes"; then # AC_MSG_ERROR([No C++ compiler found. Unable to build Poly/ML.]) #fi AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_CPP AM_PROG_AS # Activate large file mode if needed AC_SYS_LARGEFILE # Checks for libraries. AC_CHECK_LIB(gcc, main) AC_CHECK_LIB(gcc_s, main) AC_CHECK_LIB(stdc++, main) # These can sometimes be in the standard libraries AC_SEARCH_LIBS([dlopen], [dl dld]) AC_SEARCH_LIBS([floor], [m]) # The next two are only used with mingw AC_CHECK_LIB(ws2_32, main) AC_CHECK_LIB(gdi32, main) ## External names on Win64. They have no leading underscores as per ## the X64 ABI published by MS. Earlier versions of GCC (anything ## prior to 4.5.0) were faulty. LT_SYS_SYMBOL_USCORE if test x$sys_symbol_underscore = xyes; then AC_DEFINE(POLY_LINKAGE_PREFIX, [_], [Define prefix of external names]) fi # Solaris needs -lsocket, -lnsl and -lrt AC_SEARCH_LIBS([gethostbyname], [nsl]) AC_SEARCH_LIBS([getsockopt], [socket]) AC_SEARCH_LIBS([sem_wait], [rt]) # Check for X and Motif headers and libraries AC_PATH_X if test "x${with_x}" = "xyes"; then AC_DEFINE([WITH_XWINDOWS], [1], [Define if the X-Windows interface should be built]) if test "$x_includes" != "" ; then if test "$x_includes" != "NONE" ; then CFLAGS="$CFLAGS -I$x_includes" CXXFLAGS="$CXXFLAGS -I$x_includes" CPPFLAGS="$CPPFLAGS -I$x_includes" fi fi if test "$x_libraries" != "" ; then if test "$x_libraries" != "NONE" ; then LIBS="-L$x_libraries $LIBS" fi fi AC_CHECK_LIB(X11, XCreateGC) AC_CHECK_LIB(Xt, XtMalloc) AC_CHECK_LIB(Xext, XextAddDisplay) if test "$xm_includes" != "" ; then if test "$xm_includes" != "NONE" ; then CFLAGS="$CFLAGS -I$xm_includes" CXXFLAGS="$CXXFLAGS -I$xm_includes" CPPFLAGS="$CPPFLAGS -I$xm_includes" fi fi if test "$xm_libraries" != "" ; then if test "$xm_libraries" != "NONE" ; then LIBS="-L$xm_libraries $LIBS" fi fi AC_CHECK_LIB(Xm, XmGetDestination) fi # TODO: May need AC_PATH_XTRA for Solaris # Check for headers AC_FUNC_ALLOCA AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([stdio.h time.h fcntl.h float.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h]) AC_CHECK_HEADERS([stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/systeminfo.h]) AC_CHECK_HEADERS([sys/time.h unistd.h values.h dlfcn.h signal.h ucontext.h]) AC_CHECK_HEADERS([assert.h ctype.h direct.h errno.h excpt.h fenv.h fpu_control.h grp.h]) AC_CHECK_HEADERS([ieeefp.h io.h math.h memory.h netinet/tcp.h poll.h pwd.h siginfo.h]) AC_CHECK_HEADERS([stdarg.h sys/errno.h sys/filio.h sys/mman.h sys/resource.h]) AC_CHECK_HEADERS([sys/signal.h sys/sockio.h sys/stat.h termios.h sys/termios.h sys/times.h]) AC_CHECK_HEADERS([sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/select.h sys/sysctl.h]) AC_CHECK_HEADERS([sys/elf_SPARC.h sys/elf_386.h sys/elf_amd64.h asm/elf.h]) AC_CHECK_HEADERS([windows.h tchar.h semaphore.h]) # Only check for the X headers if the user said --with-x. if test "${with_x+set}" = set; then AC_CHECK_HEADERS([X11/Xlib.h Xm/Xm.h]) fi PKG_PROG_PKG_CONFIG # Check for GMP AC_ARG_WITH([gmp], [AS_HELP_STRING([--with-gmp], [use the GMP library for arbitrary precision arithmetic @<:@default=check@:>@])], [], [with_gmp=check]) # If we want GMP check that the library and headers are installed. if test "x$with_gmp" != "xno"; then AC_CHECK_LIB([gmp], [__gmpn_tdiv_qr], [AC_DEFINE([HAVE_LIBGMP], [1], [Define to 1 if you have libgmp]) [LIBS="-lgmp $LIBS"] AC_CHECK_HEADER([gmp.h], [AC_DEFINE([HAVE_GMP_H], [1], [Define to 1 if you have the gmp.h header file])], [if test "x$with_gmp" != "xcheck"; then AC_MSG_FAILURE( [--with-gmp was given, but gmp.h header file is not installed]) fi ]) ], [if test "x$with_gmp" != "xcheck"; then AC_MSG_FAILURE( [--with-gmp was given, but gmp library (version 4 or later) is not installed]) fi ]) fi # libffi # libffi must be configured even if we are not building with it so that things like "make dist" work. AC_CONFIG_SUBDIRS([libffi]) # Use the internal version unless --with-system-libffi is given. AC_ARG_WITH([system-libffi], [AS_HELP_STRING([--with-system-libffi], [use the version of libffi installed on your system rather than the version supplied with poly @<:@default=no@:>@])], [], [with_system_libffi=no]) # Libffi uses pkg-config. if test "x$with_system_libffi" = "xyes"; then PKG_CHECK_MODULES([FFI], [libffi], [LIBS="$FFI_LIBS $LIBS" CFLAGS="$FFI_CFLAGS $CFLAGS"], [AC_CHECK_LIB([ffi], [ffi_prep_closure_loc], [ [LIBS="-lffi $LIBS"] AC_CHECK_HEADER([ffi.h], [], [ AC_MSG_FAILURE([--with-system-libffi was given, but ffi.h header file cannot be found]) ]) ], [AC_MSG_FAILURE([--with-system-libffi was given, but the ffi library is not installed])] ) ] ) else # Use internal libffi CFLAGS="$CFLAGS -I../libffi/include" CXXFLAGS="$CXXFLAGS -I../libffi/include" fi AM_CONDITIONAL([INTERNAL_LIBFFI], [test "x$with_system_libffi" != "xyes"]) # Check for pthreads. Mainly, this allows a single-threaded build on OSes such as Mac OS X # that don't have proper multi-threaded profiling. AC_ARG_WITH([threads], [AS_HELP_STRING([--with-threads], [use the pthread library for multi-threading @<:@default=check@:>@])], [], [with_threads=check]) # If we want pthreads check that the library and headers are installed. # On Android pthread_create is in the standard library if test "x$with_threads" != "xno"; then AC_SEARCH_LIBS([pthread_create], [pthread], [AC_DEFINE([HAVE_LIBPTHREAD], [1], [Define to 1 if you have the `pthread' library (-lpthread).]) AC_CHECK_HEADER([pthread.h], [AC_DEFINE([HAVE_PTHREAD_H], [1], [Define to 1 if you have the header file.])], [if test "x$with_threads" != "xcheck"; then AC_MSG_FAILURE( [--with-threads was given, but pthread.h header file is not installed]) fi ]) ], [if test "x$with_threads" != "xcheck"; then AC_MSG_FAILURE( [--with-threads was given, but pthread library is not installed]) fi ]) fi # Find out which type of object code exporter to use. # If we have winnt use PECOFF. This really only applies to cygwin here. # If we have elf.h use ELF. # If we have mach-o/reloc.h use Mach-O # Otherwise use the C source code exporter. AC_CHECK_TYPES([IMAGE_FILE_HEADER], [AC_DEFINE([HAVE_PECOFF], [], [Define to 1 if you have the PE/COFF types.])] [polyexport=pecoff], [AC_CHECK_HEADER([elf.h], [AC_DEFINE([HAVE_ELF_H], [], [Define to 1 if you have the header file.])] [polyexport=elf], [AC_CHECK_HEADER([mach-o/reloc.h], [AC_DEFINE([HAVE_MACH_O_RELOC_H], [], [Define to 1 if you have the header file.])] [polyexport=macho], [AC_CHECK_HEADERS([elf_abi.h machine/reloc.h], [AC_DEFINE([HAVE_ELF_ABI_H], [], [Define to 1 if you have and header files.])] [polyexport=elf] )] )] )], [#include ] ) AM_CONDITIONAL([EXPPECOFF], [test "$polyexport" = pecoff]) AM_CONDITIONAL([EXPELF], [test "$polyexport" = elf]) AM_CONDITIONAL([EXPMACHO], [test "$polyexport" = macho]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_CONST AC_TYPE_INT16_T AC_TYPE_UINT16_T AC_TYPE_INT32_T AC_TYPE_UINT32_T AC_TYPE_INT64_T AC_TYPE_UINT64_T AC_TYPE_INTPTR_T AC_TYPE_UINTPTR_T AC_TYPE_UID_T AC_TYPE_MODE_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_HEADER_TIME AC_STRUCT_TM # Check for the various sub-second fields of the stat structure. AC_CHECK_MEMBERS([struct stat.st_atim, struct stat.st_atimespec, struct stat.st_atimensec, struct stat.st_atime_n, struct stat.st_uatime]) # Mac OS X, at any rate, needs signal.h to be included first. AC_CHECK_TYPES([ucontext_t], , , [#include "signal.h" #include "ucontext.h"]) AC_CHECK_TYPES([struct sigcontext, stack_t, sighandler_t, sig_t], , ,[#include "signal.h"]) AC_CHECK_TYPES([socklen_t],,,[#include "sys/types.h" #include "sys/socket.h"]) AC_CHECK_TYPES([SYSTEM_LOGICAL_PROCESSOR_INFORMATION],,,[#include "windows.h"]) AC_CHECK_TYPES(long long) AC_CHECK_TYPES(ssize_t) AC_CHECK_SIZEOF(void*) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(long long) # Checks for library functions. AC_FUNC_CHOWN AC_FUNC_CLOSEDIR_VOID AC_FUNC_ERROR_AT_LINE AC_FUNC_FORK AC_FUNC_GETGROUPS AC_FUNC_GETPGRP AC_PROG_GCC_TRADITIONAL AC_FUNC_LSTAT AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_SELECT_ARGTYPES AC_FUNC_STAT AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_FUNC_VPRINTF AC_CHECK_FUNCS([bzero dup2 floor ftruncate getcwd gethostbyaddr gethostname gettimeofday memmove]) AC_CHECK_FUNCS([memset mkdir mkfifo munmap pathconf pow realpath rmdir select setlocale socket sqrt strdup strerror]) AC_CHECK_FUNCS([uname dlopen getrusage strtod dtoa sigaction mkstemp getpagesize sigaltstack mmap mprotect]) ## There does not seem to be a declaration for fpsetmask in mingw64. AC_CHECK_DECLS([fpsetmask], [], [], [[#include ]]) AC_CHECK_FUNCS([sysctl sysctlbyname]) AC_CHECK_FUNCS([localtime_r gmtime_r]) AC_CHECK_FUNCS([ctermid tcdrain]) # Where are the registers? #Linux: AC_CHECK_MEMBERS([mcontext_t.gregs, mcontext_t.regs, mcontext_t.mc_esp],,,[#include "ucontext.h"]) #Mac OS X: AC_CHECK_MEMBERS([struct mcontext.ss, struct __darwin_mcontext.ss, struct __darwin_mcontext.__ss, struct __darwin_mcontext32.ss, struct __darwin_mcontext32.__ss, struct __darwin_mcontext64.ss, struct __darwin_mcontext64.__ss],,, [#include "signal.h" #include "ucontext.h"]) # FreeBSD includes a sun_len member in struct sockaddr_un AC_CHECK_MEMBERS([struct sockaddr_un.sun_len],,, [#include ]) # Additional checks. AC_CANONICAL_HOST has already been called. #AC_CANONICAL_HOST # This option enables the native code generator. More precisely it allows # the byte code interpreter to be built on X86. AC_ARG_ENABLE([native-codegeneration], [AS_HELP_STRING([--disable-native-codegeneration], [disable the native code generator and use the slow byte code interpreter instead.])], [case "${enableval}" in no) with_portable=yes ;; yes) with_portable=no ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-native-codegeneration]) ;; esac], [with_portable=check]) case "${host_cpu}" in i[[3456]]86*) AC_DEFINE([HOSTARCHITECTURE_X86], [1], [Define if the host is an X86 (32-bit)]) polyarch=i386 ;; x86_64* | amd64*) AC_DEFINE([HOSTARCHITECTURE_X86_64], [1], [Define if the host is an X86 (64-bit)]) polyarch=x86_64 ;; sparc*) AC_DEFINE([HOSTARCHITECTURE_SPARC], [1], [Define if the host is a Sparc (32-bit)]) polyarch=interpret ;; powerpc64* | ppc64*) AC_DEFINE([HOSTARCHITECTURE_PPC64], [1], [Define if the host is a PowerPC (64-bit)]) polyarch=interpret ;; power* | ppc*) AC_DEFINE([HOSTARCHITECTURE_PPC], [1], [Define if the host is a PowerPC (32-bit)]) polyarch=interpret ;; arm*) AC_DEFINE([HOSTARCHITECTURE_ARM], [1], [Define if the host is an ARM (32-bit)]) polyarch=interpret ;; aarch64*) AC_DEFINE([HOSTARCHITECTURE_AARCH64], [1], [Define if the host is an ARM (64-bit)]) polyarch=interpret ;; ia64*) AC_DEFINE([HOSTARCHITECTURE_IA64], [1], [Define if the host is an Itanium]) polyarch=interpret ;; mips*) AC_DEFINE([HOSTARCHITECTURE_MIPS], [1], [Define if the host is a MIPS (32-bit)]) polyarch=interpret ;; *) AC_MSG_ERROR([Poly/ML is not supported for this architecture]) ;; esac # If we explicitly asked to use the interpreter set the architecture to interpreted. if test "x$with_portable" = "xyes" ; then if test "x$polyarch" != "xinterpret" ; then AC_MSG_WARN( [*******You have disabled native code generation. Are you really sure you want to do that?*******]) fi polyarch=interpret fi # If we asked not to use the interpreter check we have native code support. if test "x$with_portable" = "xno" ; then if test "x$polyarch" = "xinterpret" ; then AC_MSG_ERROR( [--enable-native-codegeneration was given but native code is not supported on this platform]) fi fi # Set the define if this is the interpreter. This is no longer actually used. if test "x$polyarch" = "xinterpret" ; then AC_DEFINE([INTERPRETED], [1], [Define if using the interpreter] ) fi # Put this test at the end where it's less likely to be missed. # If we're compiling on Cygwin (and mingw?) and /usr/bin/file is not present # the link step will produce some strange warning messages of the form: # "Warning: linker path does not have real file for library -lXXX". I think # that's really a bug in autoconf but to explain what's happening to the user # add a test here. if test "$lt_cv_file_magic_cmd" = "func_win32_libid"; then if test \! -x /usr/bin/file; then echo "" echo "*** Warning: You are building Poly/ML on Cygwin/Mingw but '/usr/bin/file' cannot be found." echo "*** You can still go ahead and build Poly/ML but libpolyml will not be built as a" echo "*** shared library and you may get strange warning messages from the linker step." echo "*** Install the 'file' package to correct this problem." echo "" fi fi AM_CONDITIONAL([ARCHI386], [test "$polyarch" = i386]) AM_CONDITIONAL([ARCHX86_64], [test "$polyarch" = x86_64]) AM_CONDITIONAL([ARCHINTERPRET], [test "$polyarch" = interpret -a X"$ac_cv_sizeof_voidp" = X4]) AM_CONDITIONAL([ARCHINTERPRET64], [test "$polyarch" = interpret -a X"$ac_cv_sizeof_voidp" = X8]) AM_CONDITIONAL([NATIVE_WINDOWS], [test "$poly_native_windows" = yes]) AM_CONDITIONAL([NO_UNDEFINED], [test "$poly_no_undefined" = yes]) # Test whether this is a git directory and set the version if possible AC_CHECK_PROG([gitinstalled], [git], [yes], [no]) if test X"$gitinstalled" = "Xyes" -a -d ".git"; then GIT_VERSION='-DGIT_VERSION=$(shell git describe --tags --always)' AC_SUBST(GIT_VERSION) fi # Modules directory AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [directory for Poly/ML modules])], [moduledir=$withval], [moduledir="\${libdir}/polyml/modules"]) AC_SUBST([moduledir], [$moduledir]) # These are needed for building in a separate build directory, as they are # referenced from exportPoly.sml. AC_CONFIG_COMMANDS([basis], [test -e basis || ln -sf ${ac_top_srcdir}/basis .]) AC_CONFIG_COMMANDS([mlsource], [test -e mlsource || ln -sf ${ac_top_srcdir}/mlsource .]) AC_CONFIG_FILES([Makefile libpolyml/Makefile libpolyml/polyml.pc libpolymain/Makefile]) AC_CONFIG_FILES([polyc], [chmod +x polyc]) AC_OUTPUT polyml-5.6/depcomp000077500000000000000000000560161265146633400142770ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 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 2, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/documentation/000077500000000000000000000000001265146633400155635ustar00rootroot00000000000000polyml-5.6/documentation/IDEProtocol.html000066400000000000000000000453251265146633400206050ustar00rootroot00000000000000 IDE Communications Protocol

IDE Communications Protocol

Poly/ML release 5.3 introduces support for an Integrated Development Environment to extract extra information about a program. This documents the protocol used to exchange information with the front-end. It is written on top of functions that extract the information from the compiler's parse tree. Some applications may find it more convenient to interact directly with these functions and implement their own protocol. This document is primarily aimed at writers of IDEs or plug-ins who are interacting with the normal ML top-level.

Lexical

The basic format uses a binary XML-like representation in which the escape character (0x1b) is used as a special marker. It may be followed by other characters that determine how the remainder of the input is to be treated. Strings are sent as a sequence of bytes terminated by the escape character. If the escape character itself appears in the string it is sent as two escape characters, except within compilation input (see below). Where a value represents a number it is sent as base ten, possibly preceded by ~ or -.

Packets and Mark-up

There are two different ways in which escape combinations may occur. Within the communications protocol data is exchanged between the IDE and the Poly/ML front-end using packets of data. These begin and end with an escape sequence and use escape sequences, usually escape followed by comma, to separate the elements. The opening escape sequence is always escape followed by an upper case character and the closing sequence is always escape followed by the lower case version of the opening sequence. For many cases, the format of the packet is fixed but there is an exception in the case of marked-up text. Marked-up text can arise in the case of error messages or some other output from the compiler where extra information can be inserted at arbitrary point within the text of the message. Such mark-up uses the same format as the protocol packets but the opening section is delimited by escape followed by semicolon. Having a standard format provides for upwards compatibility since an IDE can easily skip mark-up that it does not recognise.

Output mark-up

Poly/ML can be run in a mode where it produces enhanced output but otherwise runs a normal top-level. This can be used by the IDE to give the user access to a normal interactive ML session. The --with-markup option to Poly/ML runs the normal Poly/ML top-level loop but causes it to add mark-up to some of its messages. Currently it is used in two cases; in error messages and in messages showing where an identifier was declared.
The format of the information showing a location is:

ESC 'D' filename ESC ',' startline ESC ',' startlocation ESC ',' endlocation ESC ';'
This is followed by the identifier itself and then the closing packet:
ESC 'd'

An error message packet consists of

ESC 'E' kind ESC ',' filename ESC ',' startline ESC ',' startlocation ESC ',' endlocation ESC ';'

"kind" is either 'E' indicating a hard error or 'W' indicating a non-fatal warning. This is followed by the text of the message and then the closing packet:

ESC 'e'

Mark up in the future will follow the same pattern allowing the IDE to skip unrecognised mark-up. This mark-up is also used in some of the packets within the full IDE protocol.

Full IDE protocol

When run with the --ideprotocol option the top-level loop runs the full IDE communication protocol. This can also be started by PolyML.IDEInterface.runIDEProtocol() from within PolyML.

This is intended primarily for compiling files while they are being edited, either as the result of an explicit request from the user or automatically. When this option is given the front-end retains the parse tree and requests can be made to extract information from the parse tree.

When the IDE mode is started, PolyML sends the following message to std-out:

ESC 'H' protocol-version-number ESC 'h'
where protocol-version-number is the version number identifying the particular version of the PolyML protocol. Requests to PolyML should wait until this message has been sent by PolyML. The current version of the protocol is 1.0.0.

Requests to PolyML are in terms of byte offsets within the last source text. If the text has been edited since it was last sent to ML the IDE must convert positions within the current source text into positions within the original before sending requests to ML and do the reverse conversion before displaying the results.

Requests from IDE to Poly/ML.

Simple requests about the current parse tree all have the same format. They contain a request code that describes the kind of information to return and a pair of positions. Frequently the start and end positions will be the same. PolyML searches for the smallest node in the parse tree that spans the positions and returns information about that node. It always retains the actual span for the node in the result so that the IDE can highlight the actual text in the display.

Every request contains a request identifier which is returned in the result. This allows the IDE to run asynchronously. A request identifier is an arbitrary string generated by the IDE. The request identifier used in a compilation request has a special status. This identifier is used to mark the version of the parse tree that results from the compilation and must be included in commands that query the parse tree. In that way Poly/ML is able to tell whether a request refers to the current tree or to an older or newer version.

The format of a request packet is:

ESC CODE request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC code
The start character is an upper case character, the end character the corresponding lower case character.
The CODE is, currently, one of the following
O Return a list of properties for the node
T Return type information
I Return declaration location
M Move relative to a given position
V Return a list of references to an identifier

Responses follow a similar structure to the request. The start and end code for a response is the same as the start and end for the request. All responses contain the actual start and end points of the current tree. If there is no parse tree the start and end offsets will be zero. An unrecognised command will return an empty response for forwards compatibility. Where a command is invalid or unrecognised the response will be

ESC CODE request-id ESC ',' parse-tree-id ESC ',' startoffset ESC ',' endoffset ESC code

In particular, because the IDE may issue requests while a compilation is running the parse tree id in the request packet may not match the current parse tree within Poly/ML. In that case the parse tree id in the result packet will contain the current parse tree and not the parse tree id in the request. The IDE must keep a list of requests it has sent along with the parse tree id it used and if it receives a response with a different parse tree id it should reissue the request adjusting the offsets to account for any changes.

O Request:

ESC 'O' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC 'o'
O Response:
ESC 'O' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset commands ESC 'o'
The commands are a set of strings separated by ESC ','. At the moment the strings are all single characters and identify the set of valid commands and sub-commands: i.e. T,I,J,S,V,U,C,N and P. For forward compatibility the IDE should accept but ignore other strings.

T Request:

ESC 'T' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC 't'
T Response:
ESC 'T' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC ',' type-string ESC 't'
Returns the type of the selected node as a string. There is no currently mark up in the type. If this is not an expression this returns
ESC 'T' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC 't'

I Request:

ESC CHAR 'I' request-id ESC ',' ESC ',' parse-tree-id ESC ',' startoffset ESC ',' endoffset ESC ',' request-type ESC 'i'
I Response:
ESC 'I' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC ',' filename ESC ',' startline ESC ',' startlocation ESC ',' endlocation ESC 'i'
Thse requests return information about an identifier. Finds an identifier at a given location and returns the location where that identifier was defined, if the request-type is 'I'; where the identifier was added to the current name space using an "open" declaration, if it is J and the location where the structure that was opened was declared, if it is S. The first two locations as usual indicate the position of the use of the identifier. The remaining information relates to the declaration. Returns
ESC 'I' request-id ESC ',' parse-tree-id ESC ',' startoffset ESC ',' endoffset ESC 'i'
if this is not an identifier or did not come from opening a structure, where appropriate. The information is similar to a D block in mark-up.
I Return declaration location
J Return the location where an identifier was opened
S Return the location of an identifier's parent structure

M request:

ESC CHAR 'M' ESC ',' parse-tree-id ESC ',' startoffset ESC ',' endoffset ESC ',' action ESC 'm'
The action string defines the direction of the move. Currently all moves are single character strings.
"U" Move to the parent node
"C" Move to the first child node
"N" Move to the next sibling
"P" Move to the previous sibling
M Response:
ESC CHAR 'M' parse-tree-id ESC ',' startoffset ESC ',' endoffset ESC 'm'
PolyML selects the parse tree node at the given location and moves relative to it. If the move is not possible the location remains unchanged. If the move is successful then the new move location is returned in the packet.

V Request:

ESC 'V' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC 'v'
V Response:
ESC 'V' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC ',' start-ref1 ESC ',' end-ref1 ESC ',' .... start-refn ESC ',' end-refn ESC 'v'
Returns the list of local references to an identifier if the parse tree location refers to a local value identifier. The results are a sequence of start and end offsets. If the specified location is not a local value identifier the result is
ESC 'V' request-id ESC ',' parse-tree-id ESC ',' start-offset ESC ',' end-offset ESC 'v'

Compilation.

In order to compile a piece of text the IDE sends it to ML through the protocol. Because any previous compilation may have executed code and affected the global state it is assumed that the IDE will set up some form of context for the file by previously saving some state. Typically, this would require it to have compiled all the files that this particular piece of source text will depend on and to have saved it in a saved state. A compilation request therefore has the following structure:

ESC 'R' request-id ESC ',' sourcename ESC ',' startposition ESC ',' prelude-length ESC ',' source-length ESC ',' prelude ESC ',' source-text ESC 'r'
'prelude' is a piece of ML code to compile and execute before the user-supplied code. Typically this will include a call to PolyML.SaveState.loadState to load the initial state for the compilation.
'source-text' is the ML code that is being compiled and executed.
'sourcename' is the name to be used as the file name when reporting locations.
'startposition' is the value to be used as the initial offset in the file. The usual case is that this is zero or a null string which is taken as zero.
'prelude-length' and 'source-length' are the number of bytes in the prelude and source text respectively. Since the prelude and source text may be large it is much more efficient to use these lengths to read the input. Because these lengths are provided it is not necessary to search for the escape code within the text and so if the escape character appears within the text it is not itself escaped.

Poly/ML responds with a result block. The format of the result block depends on the result of the compilation and possible execution of the code. The result block has the form:

ESC 'R' request-id ESC ',' parse-tree-id ESC ',' result ESC ',' finaloffset ESC ';' errors_and_messages ESC 'r'
"result" is a single character indicating success or failure.
"finaloffset" is the byte position that indicates the extent of the valid parse tree. If there was an error this may be less than the end of the input. It may be the start of the input if there was a syntax error and no parse tree could be created. As usual "request-id" is the ID of the request. The "parse-tree-id" will normally be the same as the "request-id" indicating that the compilation has updated the parse tree, even if type checking failed. However, if there was a failure, such as during parsing, that meant that no new parse tree could be produced the ID returned will be the original parse tree ID, or the empty string if there was none.
Error packets within the errors_and_messages have the same format as described above for mark-up.

The result codes are
S - Success. The file compiled successfully and ran without an exception.
X - Exception. The file compiled successfully but raised an exception when it ran.
L - The prelude code failed to compile or raised an exception.
F - Parse or type checking failure.
C - Cancelled during compilation.
The parse tree will be updated to reflect the result of the compilation and the current parse tree identifier used by Poly/ML will be set to the identifier supplied in the request.

For a result code of S (compiled successfully) there may be warnings.

For a result code of L (prelude code failed) the result packet contains the exception packet that was returned and has the form:

ESC 'R' request-id ESC ',' parse-tree-id ESC ',' 'L' ESC ',' startOffset ESC ';' error_message ESC 'r'

For a result code of F (parsing or type checking failed) the result packet contains a list of one or more error packets. The format of the result packet is:

ESC 'R' request-id ESC ',' parse-tree-id ESC ',' 'F' ESC ',' endOffset ESC ';' error_packets ESC 'r'

Where the error packets have the same format as described above for mark-up.

For a result code of C (cancel compiled) the result may or may not contain error packets depending on whether the compilation had produced error messages before the compilation was cancelled.

For a result code of X the errors_and_messages result packet contains the exception message first within a X tag, as a string. The string may also containing output mark-up such as the D-style mark-up showing the location where the exception was raised. Thus the format of the packet with exception data is:

ESC 'R' request-id ESC ',' parse-tree-id ESC ',' 'X' ESC ',' startOffset ESC ';' ESC 'X' exception_message ESC 'x' error_packets ESC 'r'

Cancellation.

Compilation is run as a separate thread and may be cancelled using the K-request.

ESC 'K' request-id ESC 'k'

The request identifier is the identifier used in the R-request that should be cancelled. Unlike other requests this packet does not have its own identifier nor does it have a direct response.

The action on receiving a cancel request depends on the current state of the compilation. If the compilation has already finished no action is taken. Poly/ML will have already sent a result packet for the compilation. If the compilation is in progress Poly/ML will attempt to cancel it by sending an interrupt to the compilation thread to ask it to terminate. If the thread is actually in the compiler at the time the interrupt is received the result will be a C result code but if it is actually executing the result of compilation this code will receive the Interrupt exception. Assuming it does not trap it the result will be an X result code. The thread may actually have completed before the interrupt is processed so any other result is also possible.

 

polyml-5.6/documentation/Overview.html000066400000000000000000000651021265146633400202630ustar00rootroot00000000000000 Poly/ML Source Code Overview

Overview of the Poly/ML Source Code

Poly/ML has a history of over 25 years and the source has undergone many changes in that time. Many of the file names no longer reflect the current function of their code. This is intended as a brief introduction to the source code to enable maintainers and those wanting to experiment with the code to find their way round it. The source code is fairly well commented at the level of individual statements.

The source code is comprised of three parts. The run-time system is written in C++ with a small amount of assembly code. The compiler is written in Standard ML and the basis library consists of several Standard ML files.

The source code changes with each release so the documentation will need to be updated. This version reflects the state of the 5.4 release.

The Poly/ML Compiler

The Poly/ML compiler is written in Standard ML. Each file is a module, either a signature, functor or structure whose name matches the name of the file. This is a consequence of using the Poly/ML "make" system to build the compiler. The larger modules will have a signature file, a functor which contains most of the code and a small file which defines the structure as an application of the functor to its arguments.

Compiler control

mlsource/MLCompiler/Debug.ML - Structure
mlsource/MLCompiler/COMPILER_BODY.ML - Functor
mlsource/MLCompiler/CompilerBody.ML - Structure

CompilerBody is the main body of the compiler. The compiler consists of four major passes but the final code-processing pass in particular involves several minor passes. CompilerBody controls each of the major passes. The source code is parsed into a parse-tree which is then type checked and subsequently code-generated into a code-tree. The parsing, type-checking and code-generation passes may each fail because of errors in the source and if one pass fails the later passes are not attempted. The final pass which transforms and optimises the code-tree and generates the final machine code will never fail unless there is an internal compiler error.

Debug contains definitions of most of the "tags" that control the compiler. These are the internal representation of the properties that may be passed in to PolyML.compiler. Most of these are used to control the output of debugging information.

Identifiers

mlsource/MLCompiler/STRUCTVALSIG.sml - Signature
mlsource/MLCompiler/STRUCT_VALS.ML - Functor
mlsource/MLCompiler/StructVals.ML - Structure

StructVals contains the fundamental datatypes that describe all Poly/ML values, types, type-constructors, functors, structures and signatures. These are all entities that can appear in the top-level name space. The compiler operates on name-spaces that contain these entities, looking up existing identifiers and making new identifiers as a result of top-level declarations. The actual "values" associated with values, functors or structures are described using the CodeTree datatype (see BaseCodeTree). This allows for inline functions to contain the full range of code. Structures are actually represented as tuples and functors as functions, which by default are inline. As well as top-level entities the datatypes also include versions of values and structures that occur only during the compilation process.

Lexical Analysis

mlsource/MLCompiler/Symbols.ML - Structure
mlsource/MLCompiler/Syms.ML - Structure
mlsource/MLCompiler/IntSet.ML - Structure
mlsource/MLCompiler/SYM_SET.ML - Functor
mlsource/MLCompiler/SymSet.ML - Structure

Symbols defines the ML reserved words. Syms, IntSet, SYM_SET and SymSet provide a way of handling sets of symbols during parsing.

mlsource/MLCompiler/LEXSIG.sml - Signature
mlsource/MLCompiler/LEX_.ML - Functor
mlsource/MLCompiler/Lex.ML - Structure

The lexical analyser processes the input text skipping over comments and blank space. It sets a group of refs to information about the current sysmbol.

Parsing

mlsource/MLCompiler/PARSE_DEC.ML - Functor
mlsource/MLCompiler/ParseDec.ML - Structure
mlsource/MLCompiler/PARSE_TYPE.ML - Functor
mlsource/MLCompiler/ParseType.ML - Structure
mlsource/MLCompiler/SKIPS_.ML - Functor
mlsource/MLCompiler/Skips.ML - Structure
mlsource/MLCompiler/UTILITIES_.ML - Functor
mlsource/MLCompiler/Utilities.ML - Structure

ParseDec is the main recursive-descent parser. It calls in to the lexical analyser to get the next symbol and calls functions in ParseTree, Signatures and Structures to build the parse-tree as it goes. ParseType does this for the type-expressions such as type constraints or in signatures. Skips and Utilities contain helper functions for parsing.

Parse Tree

mlsource/MLCompiler/STRUCTURESSIG.sml - Signature
mlsource/MLCompiler/STRUCTURES_.ML - Functor
mlsource/MLCompiler/Structures.ML - Structure
mlsource/MLCompiler/SIGNATURESSIG.sml - Signature
mlsource/MLCompiler/SIGNATURES.sml - Functor
mlsource/MLCompiler/SignaturesStruct.sml - Structure
mlsource/MLCompiler/PARSETREESIG.sml - Signature
mlsource/MLCompiler/PARSE_TREE.ML - Functor
mlsource/MLCompiler/ParseTree.ML - Structure

The parser generates a tree structure to represent the source program during the parsing pass. The type-checking and code-generation passes work on this parse tree. ParseTree contains the definitions for the core language, Structures the definitions for structures and functors and Signatures the definitions for signatures. The datatypes for the parse tree are local to each of these modules so each module contains all the code that needs to walk over the parse tree. Each of these modules makes use of the parse tree support modules to perform particular tasks.

Type Checking

mlsource/MLCompiler/TYPETREESIG.sml - Signature
mlsource/MLCompiler/TYPE_TREE.ML - Functor
mlsource/MLCompiler/TypeTree.ML - Structure
mlsource/MLCompiler/COPIERSIG.sml - Signature
mlsource/MLCompiler/COPIER.sml - Functor
mlsource/MLCompiler/CopierStruct.sml - Structure
mlsource/MLCompiler/PRINT_TABLE.ML - Functor
mlsource/MLCompiler/PrintTable.ML - Structure

TypeTree contains the main type-checking code and various other functions to support operations on types. Copier is used to make a copy of a signature when it is instantiated to a structure. PrintTable contains a list of current overloadings of overloaded operations. Previously this included user-provided pretty-printers but this has now been removed.

Parse Tree Support

mlsource/MLCompiler/VALUEOPSSIG.sml - Signature
mlsource/MLCompiler/VALUE_OPS.ML - Functor
mlsource/MLCompiler/ValueOps.ML - Structure
mlsource/MLCompiler/PRETTYSIG.sml - Signature
mlsource/MLCompiler/Pretty.sml - Structure
mlsource/MLCompiler/DATATYPEREPSIG.sml - Signature
mlsource/MLCompiler/DATATYPE_REP.ML - Functor
mlsource/MLCompiler/DatatypeRep.ML - Structure
mlsource/MLCompiler/EXPORTTREESIG.sml - Signature
mlsource/MLCompiler/ExportTree.sml - Functor
mlsource/MLCompiler/ExportTreeStruct.sml - Structure
mlsource/MLCompiler/TYPEIDCODESIG.sml - Signature
mlsource/MLCompiler/TYPEIDCODE.sml - Functor
mlsource/MLCompiler/TypeIDCodeStruct.sml - Structure
mlsource/MLCompiler/DEBUGGERSIG.sml - Signature
mlsource/MLCompiler/DEBUGGER_.sml - Functor
mlsource/MLCompiler/Debugger.sml - Structure

There are various support modules involved in the process of type-checking and code-generation. ValueOps contains operations on identifiers. As well as simple identifiers it also deals with various sorts of overloaded identifiers as well as the type-specific functions such as PolyML.print. It contains many of the functions to display ML values. Pretty defines the type used in the Poly/ML pretty printer. DatatypeRep produces an optimised representation for the value constructors of a datatype depending on the number and types of the constructors. ExportTree is used in the construction of the abstract view of the parse-tree that is made available through the IDE interface. TYPEIDCODE produces code for the type-identifiers associated with types and datatypes. These contain the type-specific printing and equality functions. Debugger is used to build the data structures and hooks used for debugging ML code if the code is compiled with PolyML.Compiler.debug set.

Code Generation

mlsource/MLCompiler/CodeTree/BaseCodeTreeSig.sml - Signature
mlsource/MLCompiler/CodeTree/BaseCodeTree.sml - Structure
mlsource/MLCompiler/CODETREESIG.ML - Signature
mlsource/MLCompiler/CodeTree/CODETREE.ML - Functor
mlsource/MLCompiler/CodeTree/ml_bind.ML - Structure

The third pass of the compiler generates an intermediate code structure from the parse-tree. BaseCodeTree contains the datatype definition for this structure and a few additional functions. CODETREE contains the optimiser and processing functions that transform the tree structure generated from the ML code into an equivalent tree structure for the low-level code generator. The optimise function performs inline function expansion, tuple optimisation and various constant folding operations. Later passes remove redundant declarations especially those added as part of the inline expansion process and compute life-time values for the remaining declarations. Life-time information is used by the low-level code-generator to aid register allocation.

Code Generation - X86

mlsource/MLCompiler/CodeTree/CODE_ARRAY.ML - Structure
mlsource/MLCompiler/CodeTree/CODEGEN_TABLESIG.sml - Signature
mlsource/MLCompiler/CodeTree/CODEGEN_TABLE.ML - Functor
mlsource/MLCompiler/CodeTree/CodeGenTable.ML - Structure
mlsource/MLCompiler/CodeTree/CODECONSSIG.sml - Signature
mlsource/MLCompiler/CodeTree/X86CODESIG.sml - Signature
mlsource/MLCompiler/CodeTree/X86OUTPUTCODE.ML - Functor
mlsource/MLCompiler/CodeTree/X86OPTIMISE.ML - Functor
mlsource/MLCompiler/CodeTree/X86LOWLEVEL.ML - Functor
mlsource/MLCompiler/CodeTree/GENERATE_CODE.ML - Functor
mlsource/MLCompiler/CodeTree/GCode.i386.ML - Structure
mlsource/MLCompiler/CodeTree/CodeCons.i386.ML - Structure

The final part of the compilation process is to generate machine code for the particular architecture. GCode (GENERATE_CODE) processes the code-tree and builds a list of instructions. CodeGenTable is used to keep track of declarations and register allocations. X86LOWLEVEL is the first part of this process. X86OPTIMISE is a peep-hole optimiser that looks for sequences of instructions that can be reduced. The final part of the process is handled by X86OUTPUTCODE which takes the instruction sequence and produces a code-object, a vector containing the X86 machine code and also the constants used in the code. CODE_ARRAY is a helper structure that provides byte and word operations on the code-object.

Bootstrapping

mlsource/MLCompiler/CompilerVersion.sml - Structure
mlsource/MLCompiler/MAKE_.ML - Functor
mlsource/MLCompiler/Make.ML - Structure
mlsource/MLCompiler/INITIALISE_.ML - Functor
mlsource/MLCompiler/Initialise.ML - Structure
mlsource/MLCompiler/ml_bind.ML

CompilerVersion is a tiny structure with the current version information. Make is a wrapper for the compiler and includes a cut-down version of the "use" function to enable the basis library to be compiled. Initialise contains declarations needed for bootstrapping. Before the basis library can be compiled there are certain identifiers that have to be added to the initial name-space. In particular, the compiler itself and various compiler switches and datatypes have to added at this stage. ml_bind is the root when building the compiler using PolyML.make. It sets up the compiler for bootstrapping.

Support Library

mlsource/MLCompiler/Boot/Address.ML
mlsource/MLCompiler/Boot/Misc.ML
mlsource/MLCompiler/Boot/HashTable.ML
mlsource/MLCompiler/Boot/UniversalTable.ML
mlsource/MLCompiler/Boot/StretchArray.ML
mlsource/MLCompiler/Boot/ml_bind.ML

The Boot directory contains a few library structures that are used throughout the compiler. These are gradually being replaced by the Standard Basis Library.

The Run-time System

The Poly/ML run-time system (RTS) is written mostly in C++ with a few files in C and assembly code. All interaction between ML code and the operating system goes through the run-time system. Most interaction is through RTS calls.

Stub Functions

libpolymain/polystub.c
polyimport.c

Every executable program has to have an initial entry point, (main or WinMain) and this is provided by either polyimport or polystub. polystub is used to create the polymain library. All other RTS files are compiled into the polyml library. polyimport is normally only used during the initial installation and reads a heap that has been exported in the portable (text) format. polystub is used when building an executable by linking in an object file that has been exported with PolyML.export.

Globals and Support Modules

libpolyml/mpoly.cpp
libpolyml/mpoly.h
libpolyml/run_time.cpp
libpolyml/run_time.h
libpolyml/diagnostics.cpp
libpolyml/diagnostics.h
libpolyml/rts_module.cpp
libpolyml/rts_module.h
libpolyml/globals.h
libpolyml/noreturn.h
libpolyml/sys.h
libpolyml/version.h
config.h
winconfig.h

mpoly.cpp contains the main entry point to the RTS and is immediately called by the main program in either polyimport or polystub. run_time.cpp contains the main despatch table for RTS calls from ML code and also various functions that do not fit elsewhere. diagnostics.cpp contains some functions to produce debugging information from the RTS. rts_module defines the RTSModule base class that is used for the more specific modules. sys.h provides symbolic definitions for run-time system calls. The information in it should match basis/RuntimeCalls.ML. globals.h defines the PolyWord and PolyObject classes that provide symbolic access to machine words as well as other global definitions. noreturn.h provides a way of indicating that a function does not return normally. version.h is a small file containing the current RTS version. config.h is produced automatically by the configuration process. winconfig.h is an equivalent for Windows when compiling under Visual C++.

Arithmetic and Strings

libpolyml/arb.cpp
libpolyml/arb.h
libpolyml/reals.cpp
libpolyml/reals.h
libpolyml/realconv.cpp
libpolyml/realconv.h
libpolyml/polystring.cpp
libpolyml/polystring.h

arg.cpp contains the arbitrary precision package. It now uses GMP to do the actual arithmetic if GMP is installed and otherwise uses its own code. reals.cpp contains real number (floating point) operations. realconv is a slightly modified version of the real to string conversion functions written by David M. Gay.

Basis Library Support

libpolyml/process_env.cpp
libpolyml/timing.cpp
libpolyml/process_env.h
libpolyml/timing.h
libpolyml/io_internal.h
libpolyml/basicio.cpp
libpolyml/network.cpp
libpolyml/basicio.h
libpolyml/network.h
libpolyml/errors.h

libpolyml/proper_io.h
libpolyml/proper_io.cpp

These files contain the operating system interfaces needed to support the Standard Basis Library. proper_io.cpp contains some wrap-around functions to avoid bugs and inconsistencies in some operating system calls. errors.h contains a table that maps between error numbers (the value stored in errno on Unix) and their textual equivalents.

State Saving and Exporting

polyexports.h
libpolyml/exporter.cpp
libpolyml/exporter.h
libpolyml/elfexport.cpp
libpolyml/elfexport.h
libpolyml/machoexport.cpp
libpolyml/machoexport.h
libpolyml/pecoffexport.cpp
libpolyml/pecoffexport.h
libpolyml/pexport.cpp
libpolyml/pexport.h
libpolyml/sharedata.cpp
libpolyml/sharedata.h
libpolyml/savestate.cpp
libpolyml/savestate.h

These files provide mechanisms for exporting the heap in various forms. Different operating systems use different formats for object modules: ELF on Linux and BSD Unix, Mach-O on Mac OS X and PE-COFF on Windows. Poly/ML also has its own portable text format that is usually used only for the initial installation and pexport.cpp contains the code to both export and import this format. sharedata.cpp is used to reduce the size of the heap by combining values that are equivalent. Although not strictly related to exporting it is usually used before a heap is exported. savestate.cpp contains code to export and import the heap as a saved state.

Operating-System Specific

libpolyml/Console.h
libpolyml/Console.cpp
resource.h
PolyML.rc
libpolyml/PolyControl.h
libpolyml/windows_specific.cpp
libpolyml/unix_specific.cpp
libpolyml/xwindows.cpp
libpolyml/xcall_numbers.h
libpolyml/xwindows.h
libpolyml/os_specific.h

Parts of the RTS are specific to either Windows or to Posix platforms i.e. Unix and Cygwin. unix_specific.cpp contains code to support the Unix and Posix structures in the basis library. windows_specific.cpp supports the Windows structure. Console.cpp provides a simple console window in Windows and PolyML.rc is the resource file with the menus and icons. xwindows.cpp contains the X-Windows and Motif interface. It is only included if the appropriate configuration option is set.

Hardware Specific

libpolyml/machine_dep.h
libpolyml/x86_dep.cpp
libpolyml/x86asm.asm
libpolyml/power_dep.cpp
libpolyml/power_assembly.S
libpolyml/sparc_dep.cpp
libpolyml/sparc_assembly.S
libpolyml/int_opcodes.h
libpolyml/interpret.cpp

Poly/ML is compiled into machine code and uses its own linkage conventions. When calling from ML to the RTS there needs to be an interface which saves the ML state and loads the C state for the RTS. Arguments and results need to be transferred. There is a C++ file and an assembly code file for each of the X86 (32 and 64-bit), PPC and Sparc architectures. On other architectures a portable, interpreted byte code is used and the interpreter takes the place of the machine-specific module.

Multi-Threading

libpolyml/processes.cpp
libpolyml/processes.h
libpolyml/locking.cpp
libpolyml/locking.h

Support for multi-threading is mostly contained in processes.cpp. locking.cpp provides implementation for the PLock, Plocker and PCondVar classes that are used in various places to provide mutual exclusion.

Memory Management

libpolyml/gc.cpp
libpolyml/gc.h
libpolyml/bitmap.cpp
libpolyml/bitmap.h
libpolyml/memmgr.cpp
libpolyml/memmgr.h
libpolyml/osmem.cpp
libpolyml/osmem.h
libpolyml/save_vec.cpp
libpolyml/save_vec.h
libpolyml/scanaddrs.cpp
libpolyml/scanaddrs.h
libpolyml/check_objects.cpp
libpolyml/check_objects.h

The main part of the garbage collector is in gc.cpp. bitmap.cpp provides the Bitmap class that is used to mark allocated words in the memory. memmgr.cpp provides classes to manage the various segments of memory: local segments for local heaps and permanent segments for object file heaps and saved states. osmem.cpp is used for the actual allocation and de-allocation of memory using calls specific to the operating system. save_vec.cpp defines classes that support a save-vector for each thread. When in the RTS a thread may need to allocate memory or access values in the ML heap. It always does this through its save vector which may be modified if there is a garbage collector. scanaddrs.cpp provides classes process data structures in the heap by following pointers. This is used in the garbage collector and also when exporting the heap. check_objects.cpp is used for debugging.

Poly/ML Extensions

libpolyml/foreign.cpp
libpolyml/foreign.h
libpolyml/objsize.cpp
libpolyml/objsize.h
libpolyml/poly_specific.cpp
libpolyml/poly_specific.h
libpolyml/profiling.cpp
libpolyml/profiling.h
libpolyml/sighandler.cpp
libpolyml/sighandler.h

As well as the standard basis library Poly/ML contains various additional structures. foreign.cpp contains the foreign-function interface (CInterface structure). objsize.cpp supports PolyML.objSize and PolyML.showSize. poly_specific.cpp has various additional functions. profiling.cpp supports profiling for time and space. sighandler.cpp supports the Signal structure that allows an ML function to be called as the result of a signal.

Basis Library

The basis library is compiled when Poly/ML is built for a particular platform. Apart from the entries added by the initialisation process all entries in the name space come from the basis library. The library is mostly compiled into a basic name space created during the initialisation process. When this is complete a new name space is built using functions from the basis library and all the declarations are copied over with the exception of some of the support modules that are only used internally in the basis library.

Build control

exportPoly.sml
basis/build.sml

These files are used to control the build process.

Values and Infixes

basis/InitialBasis.ML

Most of the library is arranged as modules (structure or functors and their signatures). InitialBasis contains various values and infix declarations that can appear free in the basis and in particular those that are needed to compile the rest of the basis. A few additional value declarations are made later in the process, in particular the General structure is opened after it has been compiled.

PolyML structure

basis/InitialPolyML.ML
basis/PrettyPrinter.ML
basis/FinalPolyML.sml
basis/TopLevelPolyML.sml

The PolyML structure is unusual in that it is actually built in several phases. There is a version of the structure created in the initialisation process that contains special definitions such as PolyML.print that are infinitely overloaded and cannot be written in ML. InitialPolyML is compiled at the start of building the library and extends the structure to include some functions, such as onEntry, that are used within the basis library itself. PrettyPrinter, FinalPolyML and TopLevelPolyML are compiled after the rest of the basis library. PrettyPrinter contains a pretty printer, FinalPolyML contains the definition of PolyML.compiler and TopLevelPolyML contains code for the IDE protocol.

Support Modules

basis/LibraryIOSupport.sml
basis/LibrarySupport.sml
basis/VectorOperations.sml
basis/VectorSliceOperations.sml
basis/PolyVectorOperations.sml
basis/BasicStreamIO.sml
basis/ExnPrinter.sml

A few modules are compiled during the build process and removed later.

Standard Basis Library

basis/Array.sml
basis/Array2.sml
basis/BIT_FLAGS.sml
basis/BinIO.sml
basis/BinPrimIO.sml
basis/Bool.sml
basis/BoolArray.sml
basis/Byte.sml
basis/CommandLine.sml
basis/Date.sml
basis/General.sml
basis/GenericSock.sml
basis/IEEEReal.sml
basis/IEEE_REAL.sml
basis/IMPERATIVE_IO.sml
basis/INTEGER.sml
basis/INetSock.sml
basis/IO.sml
basis/ImperativeIO.sml
basis/Int.sml
basis/Int32.sml
basis/IntArray.sml
basis/IntArray2.sml
basis/IntInf.sml
basis/LargeWord.sml
basis/List.sml
basis/ListPair.sml
basis/MATH.sml
basis/MONO_ARRAY.sml
basis/MONO_ARRAY_SLICE.sml
basis/MONO_VECTOR.sml
basis/MONO_VECTOR_SLICE.sml
basis/NetHostDB.sml
basis/NetProtDB.sml
basis/NetServDB.sml
basis/OS.sml
basis/Option.sml
basis/PRIM_IO.sml
basis/PackRealBig.sml
basis/PackWord8Big.sml
basis/Posix.sml
basis/PrimIO.sml
basis/Real.sml
basis/RealArray.sml
basis/STREAM_IO.sml
basis/Socket.sml
basis/String.sml
basis/StringCvt.sml
basis/SysWord.sml
basis/Text.sml
basis/TextIO.sml
basis/TextPrimIO.sml
basis/Time.sml
basis/Timer.sml
basis/Unix.sml
basis/UnixSock.sml
basis/Vector.sml
basis/Windows.sml
basis/Word32.sml
basis/Word32.x86_64.sml
basis/Word8.sml
basis/Word8Array.sml

These all contain structures, functors and signatures defined in the Standard Basis Library.

Poly/ML Extensions

basis/RuntimeCalls.ML
basis/Signal.sml
basis/SingleAssignment.sml
basis/Thread.sml
basis/Universal.ML
basis/UniversalArray.ML
basis/Weak.sml
basis/HashArray.ML
basis/processes.ML
basis/SML90.sml

These are extensions added by the Poly/ML system. RuntimeCalls lists the RTS call numbers. Signal provides a way to handle Unix signals (and console interrupts in Windows). SingleAssignment provides a reference that can be assigned to once. Thread provides multi-threading and processes contains a definition of the old Poly/ML Process structure for backwards compatibility. Weak provides weak references i.e. references that can be used to detect when a value is no longer referenced. HashArray provides a hash table structure. SML90 provides backwards compatibility for ML/90. It was defined in the original standard basis document but later removed.

polyml-5.6/documentation/Papers/000077500000000000000000000000001265146633400170155ustar00rootroot00000000000000polyml-5.6/documentation/Papers/poly/000077500000000000000000000000001265146633400200005ustar00rootroot00000000000000polyml-5.6/documentation/Papers/poly/intro.html000066400000000000000000001241031265146633400220220ustar00rootroot00000000000000 Introdution to Poly Note to online version
This document was originally published as a Cambridge University Technical Report (TR29) and as part of my PhD thesis, Programming Language Design with Polymorphism, Cambridge University Technical Report TR49. It describes an early version of the Poly language. David C. J. Matthews, August 2003.

INTRODUCTION TO POLY

D.C.J. Matthews,May 1982
Computer Laboratory,
University of Cambridge

Abstract
This report is a tutorial introduction to the programming language Poly. It describes how to write and run programs in Poly using the VAX/UNIX implementation. Examples given include polymorphic list functions, a double precision integer package and a subrange type constructor.

Introduction to Poly

Poly is a programming language which supports polymorphic operations. This document explains how it is used on the VAX.

1. Commands and Declarations

The system is entered by running the appropriate program (e.g. /mnt/dcjm/poly at Cambridge). The compiler will then reply with a prompt (>). To exit from Poly at any time type ctrl-D (end-of-text) or ctrl-C (interrupt). There are three types of instructions which can be typed to Poly; declarations of identifiers, statements (commands), or expressions. An example of a command and the output it produces is

> print("Hello");
Hello

Note the closing semicolon which must be present to indicate the end of the command. If you forget it the compiler will print a # as a prompt to indicate that the command is not yet complete.

An example of an expression is

> "Hi";
Hi 

Poly prints the value of an expression without the need to type the word 'print'.

Commands can be grouped by enclosing them with the bracketing symbols begin and end or ( and ). For instance

> begin
# print("Hello");
# print(" again")
# end;
Hello again
Any object in Poly can be bound to an identifier by writing a declaration. For instance
> let message == "Hello "; 
declares an identifier 'message' to have the value of the string 'Hello '. It can be printed in the same way as the string constant.
> message;
Hello 

Names can be either a sequence of letters and digits starting with a letter, or a sequence of the special characters + - * = < > etc. Certain names are reserved to have special meanings and cannot be used in declarations. Those words can be written in upper, lower or mixed case, all other words are considered to be different if written in different cases. When declaring a name made up of the special characters remember to put a space between the name and the == or colon which follows it. Comments are enclosed in curly brackets { and }. They are ignored by the compiler and are equivalent to a single space or newline between words.

2. Procedures

Statements or groups of statements can be declared by making them into procedures.

> let printmessage == 
#     proc()
#       (print("A message ")); 

A procedure consists of a procedure header (in this case the word proc and parentheses ( and ) ) and a body. The procedure body must be enclosed in bracketing symbols (in this case '(' and ')') even if there is only one statement.

This is simply another example of a declaration. Just as previously 'message' was declared to have the value "Hello#", 'printmessage' has been declared with the value of the procedure.

The procedure is called by typing the procedure name followed by ().

> printmessage();
A message 

The effect of this is execute the body of the procedure and so print the string.

Procedures can take arguments so that values can be passed to them when they are called.

> let pmessage == 
# proc(m : string) 
# begin 
# print("The message is :");
# print(m) 
# end; 
This can be called by typing
> pmessage("Hello");
The message is :Hello 
or by typing
> pmessage("Goodbye"); 
The message is :Goodbye 

3. Specifications

As well as having a value all objects in Poly have a specification, analogous to a type in other languages. It is used by the compiler to ensure that only meaningful statements will be accepted. You can find the specification of a declared name x by typing ? "x";.

> ? "message";
message : string 
This means that message is a constant belonging to the type 'string'.
> ? "pmessage"; 
pmessage : PROC(string) 
This means that pmessage is a procedure taking a value of type string as its argument. Since message has that specification the call
> pmessage(message);
The message is :Hello 
will work. Likewise the call
> pmessage("Hi");
The message is :Hi 
will work because "Hi" also belongs to type string. However
> pmessage(pmessage); 
Error - specifications have different forms 

will fail because 'pmessage' has the wrong specification. Incidentally, the specification of the procedure is the same as the header used when it was declared, ignoring the differences in the case of some of the words.

4. Integer and Boolean

So far the only constants used have been those belonging to the type string. Another type, integer provides operations on integral numbers.

> print(42); 
42 
The usual arithmetic operations +, -, *, div, mod, succ and pred are available.
> 42+10-2; 50 
However, unlike other languages all infix operators have the same precedence so
> 4+3*2; 14 

prints 14 rather than 10. Also - is an infix operator only, there is a procedure neg which complements its argument.

Another 'standard' type is boolean which has only two values true and false. Its main use is in tests for equality (the = operator), inequality (<>) and magnitude (> < >= <=).

> let two == 2;
> 1 = two;
false
> 2 = two;
true
> 3 <> 4;
true 
> 4 >= 5;
false 
The expression '1 = two' has type boolean. Identifiers can be declared to have boolean values in the same way as integers and strings.
> let testtwo == two > 1; 

declares testtwo to be 'true' since 'two' is greater than 1. There are three operators which work on boolean values, &, | and ~. ~ is a prefix operator which complements its argument (i.e. if its argument was false the result is true, and vice-versa). & is an infix operator which returns true only if both its arguments are true. | is also an infix operator which returns true if either of its arguments is true.

5. If-Statement

Boolean values are particularly useful since they can be tested using if. The if-statement causes different statements to be obeyed depending on a condition.

> if two = 2 
# then print("It is two")
# else print("It isn't two");
It is two 
tests the value of the expression 'two = 2' and executes the statement after the word then if it is true, and the statement after the word else if it is false. This could be written as a procedure,
> let iszero == 
# proc(i: integer) 
# (if i = 0 then print("It is zero") 
# else print("It isn't zero")); 
which could then be called to test a value.
> iszero(4);
It isn't zero
since 4 is not zero. If-statements can return values as well as perform actions in the then and else parts. An alternative way of writing 'iszero' could have been
> let iszero == 
# proc(i: integer) 
# (print( 
# if i  = 0 
# then "It is zero" 
# else "It isn't zero"
# )); 

This version tests the condition, and returns one or other of the strings for printing. This can only be used if both the then and else parts return values with similar specifications (in this case both sides return string constants). The version of the if-statement which does not return a value can be written with only a then-part. If the then-part returns a value there must be an else-part (otherwise what value would be returned if the condition were false?).

6. More on Procedures

Procedures can be written which return results. For instance a further way of writing 'iszero' would be to allow it to return the value of the string.

> let iszero == 
# proc(i: integer)string
# (if i = 0 then "It is zero" 
# else "It isn't zero"); 
> ? "iszero";
iszero : PROC(integer)string
Calling it would then cause it to return the appropriate string which would then be printed.
> iszero(0);
It is zero 
Another example is a procedure which returns the square of its argument.
> let sqr ==
# proc(i: integer)integer (i*i); 
declares sqr to be a procedure which takes an argument with type integer and returns a result with type integer. The body of the procedure evaluates the square of the argument i, and the result is the value of the expression. The call
> sqr(4); 
16 

will therefore print out the value 16.

Procedures in Poly can be written which call themselves, i.e. recursive procedures. These are declared using letrec rather than let.

> letrec fact == 
# proc(i: integer)integer 
# (if i = 1 then 1 
# else i*fact(i-1)); 
This is the recursive definition of the factorial function. The procedure can be called by using
> fact(5); 
120 

which prints the result. letrec has the effect of making the name being declared available in the expression following the ==, whereas let does not declare it until after the closing semicolon.

7. Variables

Constants are objects whose value cannot be changed. There are also objects whose value can change, these are variables. Variables are created by declarations such as

> let v == new(0); 
The procedure 'new' returns a variable whose initial value is the argument.
> v; 
0 
A new value can be given to v by using the assignment operator.
> v := 3; 
> v; 
3 
Thus v now has the value 3. The new value can depend on the old value.
> v := (v+2); 
Sets the value to be 5. The parentheses are necessary because otherwise the order of evaluation would be strictly left-to-right. Variables can be of any type.
> let sv == new("A string"); 

declares sv to be a string variable. The specification of a variable is not as simple as it may seem and will be dealt with later.

8. The While Loop

It is often necessary to repeat some statements more than once. This can be done using the while statement. For instance

> let x == new(10);
> while x <> 0
# do
# begin
# print(x*x);
# print(" ");
# x := pred(x)
# end; 
100 81 64 49 25 16 9 4 1 
prints the square of all the numbers from 10 down to 1. The body of the loop (the statement after the word do) is executed repeatedly while the condition (the expression after the word while) is true. The condition is tested before the loop is entered, so
> while false
# do print("Looping"); 

will not print anything.

9. Operators

We have already seen examples of operators such as + and &. In Poly operators are just procedures whose specifications include the words infix or prefix. They are declared in a similar way to procedures, for instance

> let  sq == proc prefix (i : integer)integer (i*i); 
has declared sq as a prefix operator. It can be used like any other prefix operator:
> sq 3; 
9 

The difference between a prefix operator and other procedures is that the argument to a prefix operator does not need to be in parentheses. Infix operators can be defined similarly.

10. The Specifications of Types

All objects in Poly have specifications. This includes types such as string, integer and boolean.

 > ? "boolean";
boolean : TYPE (boolean)
   & : PROC INFIX (boolean; boolean)boolean;
   false : boolean;
   print : PROC (boolean);
   true : boolean; 
   | : PROC INFIX (boolean; boolean)boolean;
   ~ : PROC PREFIX (boolean)boolean
END 
Types in Poly are regarded as sets of "attributes". These attributes are usually procedures or constants but could be other types. The attributes of a type can be used exactly like ordinary objects with the same specification. However, since different types may have attributes with the same name, it is necessary to prefix the name of the attribute with the name of the type separated by $.
> integer$print(5);
5 
This invokes the attribute 'print' belonging to integer and prints the number. Most types have a print attribute which prints a value of that type in an appropriate format. $ acts a selector which finds the attribute belonging to a particular type. It is not an operator so operators always work on the selected name rather than the type name.
> ~ boolean$true;
false 

11. Records

Poly allows new types to be created in the same way as new procedures, constants or variables. One way of creating a new type is by making a record. A record is a group of similar or dissimilar objects.

> let rec == record(a, b: integer);
This declares 'rec' to be a record with two components, a and b, both of type integer.
> ? "rec";
rec : TYPE (rec)
   a : PROC(rec)integer; 
   b : PROC(rec)integer;
   constr : PROC(integer;integer)rec
END 
'constr' is a procedure which makes a record by taking two integers, and 'a' and 'b' are procedures which return the 'a' and 'b' values of the record.
> let recv == rec$constr(3, 4); 
creates a new record with 3 in the first field (a) and 4 in the second field (b). The result is given the name 'recv'.
> rec$a(recv);
3
> rec$b(recv);
4 

show that the values of the individual fields can be found by using 'a' and 'b' as procedures. They must of course be prefixed by 'rec$' to show the type they belong to.

Records can be made with fields of any specification, not just constants.

> let arec == 
# record(x:integer; p: proc(integer)integer); 
declares a record with fields x and p, x being an integer constant and p a procedure.
> let apply ==
# proc(z : arec)integer
# begin
# let pp == arec$p(z);
# pp(arec$x(z))
# end; 
is a procedure which takes a constant of this record type and applies the procedure p to the value x and returns the result. In fact, it is not necessary to declare pp in the body of the procedure. An alternative way of writing apply is
> let apply ==
# proc(z : arec)integer 
# (arec$p(z)(arec$x(z))); 

12. Unions

Another way of constructing a type is using a 'union'. A union is a type whose values can be constructed from the values of several other types. For instance a value of a union of integer and string could be either an integer or a string.

> let un == union(int: integer; str: string); 
This has created a type which is the union of integer and string. A value of the union type can be constructed by using an injection function. This union type has two such functions, their names made by appending 'int' and 'str' onto the letters 'inj_', making 'inj_int' and 'inj_str'. ('int' and 'str' were the 'tags' given in the declaration, in a similar way to fields in a record).
> let intunion == un$inj_int(3); 
This has created a value with type 'un' containing the integer value 3.
> let stringunion == un$inj_str("The string"); 
creates a value, also with type 'un', but this time containing a string. Given a value of a union type it is often useful to be able to decide which of its constituent types it was made from. For each of the 'tags' there is a procedure whose name is made by prefixing with the letters 'is_', which returns 'true' or 'false' depending on whether its argument was made from the corresponding injection function.
> un$is_int(intunion); true 
prints 'true' because intunion was made from 'inj_int'. However
> un$is_str(intunion); 
false 
Values of the original types can be obtained by using 'projection' functions, which are the reverse of the 'injection' functions. Their names are made by prefixing the tags with 'proj_' to make names like 'proj_str' and 'proj_int'.
> un$proj_int(intunion);
3
> un$proj_str(stringunion); 
The string 
print the original values. It is possible to write
> un$proj_str(intunion);
Exception projecte raised 
because 'intunion' has type 'un', just like 'stringunion'. However, 'proj_str' is expected to return a value with type string so when this is run it will cause an error. The effect will be to raise an 'exception' called 'projecterror' which means that a projection procedure was given an argument constructed using a different injection procedure.
> let unprojstr == un$proj_str;
> ? "unprojstr"; 
unprojstr : PROC(un)string RAISES projecterror 

shows that 'proj_str' may raise 'projecterror'. Exceptions will be dealt with in more detail later on.

13. The Type-Constructor

It is often useful to be able to construct a type which is similar to an existing one but with additional attributes. This can be done by using the type-constructor.

> let nrec ==
# type (r) extends rec;
# let print ==
# proc(v : r)
# begin
# print(r$a(v)); 
# print(",");
# print(r(v))
# end
# end;
> ? "nrec";
   nrec : TYPE (nrec)
   a : PROC (nrec)integer;
   b : PROC (nrec)integer;
   constr : PROC (integer; integer)nrec;
   print : PROC (nrec)
END 
This declares 'nrec' to be a new type which is an 'extension' of an existing type 'rec'. It then lists the new attributes, in this case just the procedure 'print', which are declared just as though they were ordinary declarations. The name 'r' in parentheses which follows the word 'type' is the name for the new type within the body of the type constructor, so the argument of the procedure 'print' is given the type 'r'. It is important to remember that the new type is a completely separate type from 'rec'. Values can be changed from the old to the new type and vice versa, but they cannot be used interchangeably. The specification of nrec is similar to that of rec except that there is now an extra procedure 'print'.
> let nrecv == nrec$constr(5,6);
> nrec$print(nrecv);
5,6 
makes a value with type nrec, and prints it using the new 'print' attribute. It is possible to write simply
> print(nrecv);
5,6 
because there is a procedure 'print' which looks for the 'print' attribute of the type of the value given, and then calls it. This is the way integers and strings are printed (they both have 'print' attributes). Many of the other operations such as ':=' and '+' work in a similar way. A further alternative is to write an expression.
> nrecv;
5,6 

In this case the compiler looks for the 'print' attribute and applies it.

14. A Further Example

This record could be extended in a different way, to make a double-precision integer. Suppose that the maximum range of numbers which could be held in a single integer was from -9999 to 9999. Then a double-precision number could be defined by representing it as a record with two fields, a high and low order part, and the actual number would have value (high)*10000 + (low). This can be implemented as follows.

 > let dp ==
# type (d) extends record(hi, lo: integer);
# let succ ==
# proc(x:d)d
# begin
# if d$lo(x) = 9999
# then d$constr(succ(d$hi(x)), 0)
# else if (d$hi(x) < 0) & (d$lo(x) = 0)
# then d$constr(succ(d$hi(x)), neg(9999))
# else d$constr(d$hi(x), succ(d$lo(x)))
# end;
# let pred ==
# proc(x:d)d
# begin
# if d$lo(x) = neg(9999)
# then d$constr(pred(d$hi(x)), 0)
# else if (d$hi(x) > 0) & (d$lo(x) = 0) 
# then d$constr(pred(d$hi(x)), 9999)
# else d$constr(d$hi(x), pred(d$lo(x))) 
# end;
# let print ==
# proc(x:d)
# begin
# if d$hi(x) <> 0
# then
# begin
# print(d$hi(x));
# if abs(d$lo(x)) < 10
# then print("000")
# else if abs(d$lo(x)) < 100
# then print("00")
# else if abs(d$lo(x)) < 1000
# then print("0");
# print(abs(d$lo(x)))
# end
# else print(d$lo(x))
# end;
# let zero == d$constr(0,0); 
# let iszero ==
# proc(x:d) boolean
# ((d$hi(x) = 0) & (d$lo(x) = 0))
# end; 

This is sufficient to provide the basis of all the arithmetic operations, since +,-,* etc. can all be defined in terms of succ, pred, zero and iszero.

15. Exceptions

In the section on union types above mention was made of exceptions. In the case of the projection operations of a union type an exception is raised when attempting to project a union value onto a type which was not the one used in the injection. An exception is simply a name and any exception can be raised by writing 'raise' followed by the name of the exception.

> raise somefault;
Exception somefault raised 
raises an exception called 'somefault'.
> let procraises
# == proc(b: boolean) 
# (if b then raise afault); 
has specification
PROC(b: boolean) RAISES afault 

Various operations, as well as projection, may raise exceptions. For instance many of the attributes of integer, such as 'succ' raise the exception 'rangeerror' if the result of the operation is outside the range which can be held in an integer constant. 'div' will raise 'divideerror' if it is asked to divide something by 0.

As well as being raised exceptions can also be caught, which allows a program to recover from an error. A group of statements enclosed in brackets or 'begin' and 'end' can have a 'catch phrase' as the last item. A catch phrase is the word catch followed by a procedure. e.g. 'catch p' will catch any exception raised in the group of statements and apply p to its name.

>let proccatches ==
# proc(excp: string) (print(excp)); 
> begin
# procraises(true);
# catch proccatches
# end;
afault 
'proccatches' has been declared as a procedure which takes a argument of type string. The exception is raised by 'procraises' and, since it is not caught in that procedure it propagates back to the point at which 'procraises' was called. The catch phrase catches the exception and calls the procedure with the name of the exception as the argument. The catching procedure can then look at the argument and decide what to do.
> begin
# procraises(false);
# catch proccatches
# end; 

does not print anything because an exception has not been raised and so the procedure is not called.

If the block containing the catch phrase returns a value, then the catching procedure must return a similar value.

> let infinity == 99999;
> let divi ==
# proc infix(a, b: integer)integer 
# begin
# a div b
# catch proc(string)integer (infinity)
# end; 

This declares 'divi' to be similar to 'div' except that instead of raising an exception it returns a large number. Since 'a div b' returns an integer value the catch phrase must also return an integer.

16. The Specification of Variables

The specification of a variable in Poly is not, as one might expect, a constant of some reference type or a separate kind of specification, but each variable is in fact a separate type. Since a type in Poly is simply a set of constants, procedures or other types, a type can be used simply as a way of conveniently grouping together objects.

> let intpair ==
# type
# let first == 1;
# let second == 2
# end; 

This has declared 'intpair' to be a pair of integers containing the values 1 and 2. 'intpair$first' and 'intpair$second' can be used as integer values directly.

The specification of an integer variable is

TYPE
assign: PROC(integer);
content: PROC()integer 
END 
A variable is a pair of procedures, 'assign' which stores a new value in the variable, and 'content' which extracts the current value from it. The standard assignment operator ':=' simply calls 'assign' on the variable. The compiler inserts a call to 'content' automatically when a variable is used when a constant is expected. 'assign' and 'content' can both be called explicitly.
> let vx == new(5);
> vx$assign(vx$content() + 1);
> vx$content(); 
6 
As an example of a more complicated variable, suppose we wanted to write a subrange variable, similar to a subrange in Pascal, which could hold values between 0 and 10.
> let sr ==
# begin
# let varbl == new(0);
# type
# let content == varbl$content;
# let assign ==
# proc(i: integer) 
# (if (i < 0) | (i > 10
# then raise rangeerror
# else varbl$assign(i)) 
# end
# end; 
'varbl' is an integer variable which is initially set to 0. 'assign' checks the value before assigning it to 'varbl', and raises an exception if it is out of range. 'content' is just the 'content' procedure of the variable. It can be used in a similar way to a simple variable.
> sr := 2;
> sr;
2
> sr := 20;
Exception rangeerror raised
> sr;
2 

17. Specifications in Declarations

The double-precision type declared above has one drawback. The specification contains the 'hi', 'lo' and 'constr' attributes in the specification of the type which would allow someone to construct a value which had the type 'dp', but had, for instance, fields outside the range -9999 to 9999 or with different signs. This could make some of the operations fail to work. We need a way of hiding details of the internals of a type declaration so that they do not appear in the specification, and so cannot be used outside. In Poly a specification can be given to something explicitly as well as having it inferred from the declaration.

> let aconst: integer == 2; 
declares 'aconst' and forces it to have type 'integer'. The specification is written in the same way as the specification of the argument of a procedure.
> let quote : proc(string)
# == proc(x: string)
# begin
# print("`"); 
# print(x);
# print("'")
# end; 
is another example of explicitly giving a specification to a value. An explicitly written specification is the specification of the name which is being declared. It need not be identical to the specification of the value following the '=='. However it must be possible to convert the specification of the value to the explicit specification (the 'context').
> let avar == new(3);
> let bconst: integer == avar; 
declares 'avar' to be an integer variable and 'bconst' to be an integer constant. In the latter case the specification is necessary, otherwise 'bconst' would have been a variable and would have been another name for 'avar'. The conversion of a variable to a constant in order to match a given specification is one example of a 'coercion' of a value to match a 'context'. There are several others which can be applied depending on the particular specification. For instance the specification of a procedure may be changed from an operator to a simple procedure or vice versa.
> let plus:
# proc(integer;integer)integer raises rangeerror 
# == integer$+ ; 
declares 'plus' as a procedure which is the same as the '+' attribute of integer except that it is not an infix operator.
> plus(3,4);
7 

The list of exceptions raised by the procedure must be included in the specification. The exception list in the specification given must include all the exceptions which may be raised, but may include others as well. A special exception name any can be used to indicate that a procedure can raise any exception. Any exception list will match a context with exception list 'raises any'.

The specifications of the arguments and result must all match.

> let dble:
# type (d)
# succ, pred: proc(d)d raises rangeerror;
# print: proc(d) raises rangeerror;
# zero: d;
# iszero: proc(d)boolean;
# end
# == dp; 

creates a new type 'dble' with the specification given. The specification is the same as that of 'dp' but with some of the attributes of dp missing.

In the case of types the specification of the value must possess all the attributes of the explicit specification, but the explicit specification need not include all the attributes of the value. If a type is regarded as a set of named attributes then it is possible to take a subset of them and make them into a new type, simply by giving the new type the required specification. The specification of each attribute must itself match the specification that is given for it.

This mechanism provides a way of 'hiding' internal operations from the specification of a type. The specification of 'dble' above has only those attributes which are necessary to use it, and none of the operations which are used internally.

18. Types as Results of Procedures

So far we have considered procedures which take constants as arguments or return constants as results. In Poly values of any specification can be passed to or returned from a procedure. For instance

> let subrange 
# == proc(min, max, initial: integer)
# type (s)
# content: proc()integer; 
# assign: proc(integer) raises outofrange
# end
# begin
# type
# let varbl == new(initial);
# let content == varbl$content;
# let assign == 
# proc(i: integer)
# (if (i < min) | (i > max)
# then raise outofrange 
# else varbl$assign(i))
# end
# end; 
This procedure is similar to the definition of the subrange type 'sr' previously. However the bounds of the type are now arguments of a procedure so their values can be supplied when the program is run. Also new subrange variables can be created by calling the procedure.
> let sv == subrange(0,10,0); 

This creates 'sv' as a variable of this subrange type. As with any procedure the arguments can be arbitrary expressions provided they return results with the correct specification.

19. Types as Arguments to Procedures

Types can be passed as arguments as well as being returned from procedures.

> let copy ==
# proc(atype: type end)
# type (t)
# into: proc(atype)t;
# outof: proc(t)atype
# end 
# begin
# type (t) extends atype;
# let into == t$up
# let outof == t$down
# end
# end; 
This procedure takes a type and returns a type with two operations 'into' and 'outof'. 'up' and 'down' are procedures which are created when 'extends' is used, and provide a way of converting between the original and the resulting types. The specification of 'atype' merely says that it must be passed a type as an argument, but since it does not list any attributes then any type can be used as an actual argument (this is effectively saying that the empty set is a subset of every set). The procedure can be called, giving it an actual type as argument.
> let copyint == copy(integer);
The specification of the result is
TYPE (copyint)
into: PROC(integer)copyint; 
outof: PROC(copyint)integer
END; 
The specification of copyint allows mapping between integer and copyint since the type integer has been included in the specification.
> let copy5 == copyint$into(5);
> copyint$outof(copy5); 
5 
has mapped the integer constant 5 into and out of 'copyint'.
> let copychar == copy(char); 

creates a similar type which maps between char and copychar.

20. Polymorphic Procedures

There are often cases where, in addition to passing a type as a argument, one or more values of that type are passed as well. For instance a procedure to find the second successor of a value might be written as

> let add2 ==
# proc(atype:
# type (t)
# succ: proc(t)t raises rangeerror
# end;
# val: atype)
# (atype$succ(atype$succ(val)));
The specification of 'val' is that it must be a constant, and its type is 'atype'. However 'atype' is also an argument to the procedure so the specification really means that this procedure could be called by giving it any type with the required attributes, and a constant which must be of the same type as the first argument.
> add2(integer, 2);
4 
Similarly
> add2(char, 'A'); C 
However
> add2(integer, 'A'); 
and
> add2(string, "A string"); 

both fail, in the first case because 'A' is not integer, and in the second because string does not have a successor function.

21. Implied Arguments

Many types have a 'print' attribute which prints a constant of the type.

> let pri ==
# proc(printable: type (t) print(t) end; val: printable)
# (printable$print(val)); 
declares 'pri' as a procedure which takes as arguments a type and a constant of that type and prints the constant using the 'print' attribute. This can be called by writing
> pri(integer, 3); or > pri(char, 'a'); 
since both 'integer' and 'char' have a 'print' attribute. Having to pass the type explicitly is really unnecessary, since it is possible for the system to find the type from the specification of the constant. It would be possible for the system to convert 'pri(3)' into 'pri(integer,3)' since '3' has type integer. In Poly types which can be deduced from the specifications of other arguments can be declared as 'implied' arguments. A argument list written in square brackets, [ and ], can precede the normal argument list and those parameters, which must be all be types, are inferred from the other actual arguments when the procedure is called.
> let prin == 
# proc [printable: type (t) print: proc(t) end]
# (val: printable)
# (printable$print(val)); 
  
This can now be called by writing
> prin(3);
or
> prin("hello");
and is in fact the definition of 'print' in the standard library. Alternatively 'prin' could have been declared by giving it an explicit specification and using 'pri'.
> let prin: proc[printable: type (t) print: proc(t) end]
# (printable)
# == pri; 
This is another form of conversion which can be made using an explicit specification. Using implied parameters can simplify considerably the use of procedures with types as arguments, and allow infix or prefix operators to be used in cases where they could not otherwise be used. For instance, consider an addition operation defined as
> let add == 
# proc(summ: type (s) + : proc infix (s;s) raises rangeerror
# end;
# i, j: summ)summ
# (i + j); 
would be used by writing
> add(integer, 1, 2);
3 
However, by writing
> let +
# : proc infix [summ: type(s)
# + : proc infix (s;s)raises rangeerror
# end]
# (i, j: summ)summ raises rangeerror
# == add; 

'+' can become an infix operator, since it has only two actual arguments. Similar definitions are used for many of the other declarations in the library.

22. Literals

We have already seen how constants can be written as "Hello" or 42. These are known as literal constants, because their values are given by the characters which form them, rather than by some previous declaration. They are however, only sequences of characters, it is only by convention that "Hello" is a string constant and 42 an integer constant. This is only important when we wish to use some other definition than the 'standard' one. For instance, if the type integer were restricted to the range -9999 to 9999 then the constant 100000 would be an error if it were treated as an integer. The definition of double-precision integer above, would, however, be able to represent it.

In Poly, therefore, literals have no intrinsic type, they must be converted into a value by the use of a conversion routine. The compiler recognises certain sequences of characters as literals rather than names or special symbols. The three forms of literal constants recognised by the compiler are 'numbers', 'double-quoted sequences' and 'single-quoted sequences'. 'Numbers' begin with a digit and may consist of numbers or letters.

42 0H3F6A 3p14159 
are examples of 'numbers'. 'Double-quoted sequences' are sequences of characters contained in double-quotes. A double-quote character inside the sequence must be written twice.
"Hello" "" "He said ""Hello"""
'Single-quoted sequences' are similar to double-quoted sequences but single rather than double-quotes are used.
'Hello' '' 'He said ''Hello''' 
When the compiler recognises one of these literals it tries to construct a call to a conversion routine which can interpret it as a value of some type. For instance, the standard library contains a definition of 'convertn' which the compiler calls if it finds a 'number'. That definition has specification
PROC(string)integer 

All conversion routines must have similar specifications, but the result type will differ and some exceptions may be raised. The literal is supplied as a constant of type 'string'. The conversion routine can examine the characters which form the literal and return the appropriate value. It may of course raise an exception if the characters do not form a valid value, if either the value would be out of range or if the literal contains illegal characters.

There are also two other conversion routines in the standard library, 'converts' which converts double-quoted sequences into string values, and 'convertc' which converts single-quoted sequences into values of the type 'char'. These definitions can be overridden by preceding the literal by the name of a type and a $ sign. For instance

> let int == integer; 
> let one == int$1; 

applies the 'convertn' routine belonging to 'int', so that 'one' has type int rather than integer.

23. Lists

Lists are a convenient example for polymorphic operations. List types can be constructed by the following procedure.

> let list ==
# proc(base: type end) 
# type (list)
# car : proc(list)base raises nil_list;
# cdr : proc(list)list raises nil_list; 
# cons: proc(base; list)list; 
# nil : list; 
# null: proc(list)boolean 
# end
# begin
# type (list)
# let node == record(cr: base; cd: list);
# extends union(nl : void; nnl : node); 
# let cons == # proc(bb: base; ll: list)list
# (list$inj_nnl(node$constr(bb, ll)));
# let car ==
# proc(ll: list)base
# begin
# node$cr(list$proj_nnl(ll)) 
# catch proc(string)base (raise nil_list)
# end;
# let cdr ==
# proc(ll: list)list
# begin
# node$cd(list$proj_nnl(ll))
# catch proc(string)list (raise nil_list)
# end;
# let nil == list$inj_nl(void$empty);
# let null == list$is_nl
# end
# end; 

'void' is a standard type which has only one value (empty), and is used to represent the 'nil' value of the list. The list structure is made using a recursive union with each node containing a value of the 'base' type and the next item of the list, or containing a nil value. 'cons' makes a new node of the list, 'car' and 'cdr' find the 'base' and 'list' parts of a node respectively, and 'null' tests for the value 'nil'. 'car' and 'cdr' both trap the exception which would be raised if a projection error occurred and raise 'nil_value' in its place.

A particular list type can now be created, for instance a list of integers.

> let ilist == list(integer);
> let il == ilist$cons(1, ilist$cons(2, ilist$cons(3, ilist$nil))); 
A polymorphic 'cons' function could be declared to work on lists of any base type.
> let cons ==
# proc[base: type end;
# list: type (l) cons: proc(base; l)l end]
# (bb: base; ll: list)list # (list$cons(bb, ll)); 
It is now possible to write simply
> let il == cons(1, cons(2, cons(3, ilist$nil))); 
Polymorphic 'car', 'cdr' and 'null' functions can be written similarly. As further examples some other polymorphic list functions are given.
> letrec append ==
# proc[base: type end;
# list: type (l)
# car: proc(l)base raises nil_list;
# cdr: proc(l)l raises nil_list; 
# cons: proc(base; l)l;
# null: proc(l)boolean end]
# (first, second: list)list
# ( if null(first) then second
# else cons(car(first), append(cdr(first), second)) );
> letrec reverse ==
# proc[base: type end;
# list: type (l)
# car: proc(l)base raises nil_list;
# cdr: proc(l)l raises nil_list; 
# cons: proc(base; l)l;
# nil: l;
# null: proc(l)boolean end]
# (ll: list)list
# ( if null(ll) then list$nil
# else append(reverse(cdr(ll)), cons(car(ll), list$nil)) ); 
A useful function would be one which would print the data part of a list if the base type could be printed.
> letrec pr ==
# proc [base: type(b) print: proc(b) end;
# list: type(l) car: proc(l)base raises nil_list;
# cdr: proc(l)l raises nil_list;
# null: proc(l)boolean
# end ]
# (ll: list)
# begin
# if null(ll)
# then print("nil") 
# else
# begin
# print("( ");
# print(list$car(ll));
# print(". ");
# pr(list$cdr(ll));
# print(") ")
# end
# catch proc(string) () 
# end; 
The list created above can now be printed.
> pr(il); 
( 1. ( 2. ( 3. nil) ) ) 

Other polymorphic functions on lists can be declared in a similar way.

24. Conclusion

This document is intended as an introduction to Poly and to give some idea of the ways in which it can be used. It is not a rigorous description and various details, such as the precise checking rules for specifications, have been deliberately skated over in order to explain the language simply. A companion document, the Poly Report, is the reference for the precise details of the language.

polyml-5.6/documentation/Papers/poly/overview.html000066400000000000000000000773571265146633400225570ustar00rootroot00000000000000 An Overview of the Poly Programming Language

This document was presented at the First Workshop on Persistent Objects, Appin, Scotland in August 1985 and published as a Cambridge University Technical Report (TR99) in November 1986.

An Overview of the Poly Programming Language

David C.J. Matthews

Poly is a general purpose programming language based on the idea of treating types as first-class values. It can support polymorphic operations by passing types as parameters to procedures, and abstract types and parameterised types by returning types as results. Although Poly is not intended specifically as a database programming language it was convenient to implement it in a persistent storage system. This allows the user to retain data structures from one session to the next and can support large programming systems such as the Poly compiler and a Standard ML system.

1. Poly and its Type System

Poly[Mat85] is based on the idea of types as first class values first used in the language Russell.[Dem79] In the terms used by Cardelli and MacQueen[Car85] it uses the abstract witness model of a type. Treating a type this way means that polymorphism, parameterised types and modules are all handled by the general concept of function application.

1.1 Types as Values

A type in Poly is a set of values, normally functions. For example the type integer has operations +, - etc. Other types may have these operations, the type real also has + and - but will not have a mod (remainder) operation. The operations need not be functions, integer also has zero, first and last which are simple values, and other types may contain types. All values in Poly have a signature, called a specification in earlier reports, which is only used at compile-time. It is the analogue of a type in languages like Pascal and corresponds in many ways to the idea of a type in Ponder\cite{Ponder}. There are three classes of value in Poly, the simple value which corresponds to what are normally thought of as values in, say Pascal, numbers, strings, vectors etc.; the procedure or function which operates on values and the type which is a set of values. Each kind of value has a signature. To show why this view of types is useful we will consider some properties of other languages, and how they are handled in Poly.

1.2 Polymorphism

A polymorphic function is one that can be applied to values of many different types. The phrase is sometimes used where overloading would be more appropriate, for example the + operator in Pascal. In Pascal, or languages like it, there are operators which can be applied to values of more than one data type and their meanings are different according to the type of their arguments. They can be thought of as a set of overloaded operators in the same way as operators in Ada can be overloaded. Truly polymorphic functions are somewhat different. They are functions which are applicable to values of a wide variety of data types, including types which may not exist at the time the function is written. The fundamental difference is that a new polymorphic function can be written in terms of other polymorphic functions, while a function written in terms of overloaded functions must be defined for each data type even if the program is the same for each. For example

function min(i,j: integer):integer
begin
if i < j then min := i else min := j
end
;
function
min(i,j: real):real
begin
if i < j then min := i else min := j
end;

The ML [Mil84] programming language provides polymorphic operations on an all-or-nothing basis. This allows one to write an identity function which simply returns its argument, and this function is applicable to values of any type. One can also write functions which operate on lists of any type or on functions of any type. This generally works very well but has problems when one wants to write an operation which operates differently on different data types. For example it is still necessary to overload = since comparing two integers is different to comparing two lists of real numbers. The min function cannot be written as a single function in ML. What is required is a way of writing operations which are type-dependent.

A type in Poly is characterised by the operations it has. Both real and integer have < operations though they will be implemented in different ways. Many other types may have < operations since Poly allows the user to make new types. Poly allows a function to be written which selects certain operations from a type and values of any type with those operations can be used as a parameter. For example there is a single < function which works on types which have a < operation and simply applies the operations to the arguments. The effect is as though < were being overloaded. However, we can write a function in terms of this, such as the min function. This will also work on values of any type which has a < operation. For example, min is a function which will work on values of any type with the < operation. Such a type has signature

type (t) < : proc(t;t)boolean end

This type has an operation, <, which takes two values and returns a boolean. We will first write a version of min which takes three parameters; a type and two values of this type and returns a value of the type. It has signature:

proc(t: type (t) < : proc(t;t)boolean end; t; t)t

We can write the whole function.

let min ==
proc(t: type (t) < : proc(t; t)boolean end; x, y: t)t
begin
if
x < y then x else y
end;

It can be applied to integer values

min(integer, 1, 2)

or string values

min(string, "abc", "abd"

or values of any type with a < operation. The first parameter is a type which must have a < operation which compares two values of the type, and the second and third parameters must be values of the type. When we call

min(integer, 1, 2)

the actual parameters are matched to the formal parameters from left to right. First the types are matched by checking that the type given has the appropriate operation, and then the values are matched. They are not of course the same type as t, since they have type integer, but we invoke a matching rule which says that if we have matched an actual type parameter to a formal type then we can match values of corresponding types. In addition the type of the result becomes matched so that the result has type integer. This can be thought of as a systematic renaming of t with integer.

1.3 Implied Parameters

Having to pass the types explicitly is often a nuisance so there is a sugared form which gives a way of omitting the types and having the compiler insert them automatically using the types of the parameters. The only difference to the definition of the function is that the types are written in square brackets before the other parameters. The definition of min would then be:

let min ==
proc
$[$t: type (t) < : proc(t; t)boolean end$]$ (x, y: t)t
begin
if x < y then x else y
end
;

It can be used by just giving the values.

min(1, 2);

min
("abc", "abd");

This sugaring also allows us to define operators such as + and < which simply apply the operation with the same name from the types of their arguments giving the effect of overloading.

let + ==
proc infix 6 $[$t: type (t) + : proc(t; t)t end$]$ (x, y: t)t
begin
t$+ (x, y)
end;

2. Parameterised Types

So far we have seen how having types as parameters to a procedure allows us to write polymorphic operations. Types can also be returned from procedures and this provides a way of defining types which are parameterised by either types or values. As an example, suppose we wanted to construct an associative memory in which to store values of arbitrary type together with a number which would identify each. This could be defined as follows

let associative ==
proc(element: type end)
type (assoc)
enter: proc(assoc; integer; element)assoc;
lookup: proc(assoc; integer)element;
empty: assoc
end
begin
type (assoc)
extends struct(next: assoc; index: integer; value: element);
let empty == assoc$nil;
let enter ==
proc(table: assoc; num: integer; val: element)assoc
begin
assoc$constr(table, num, val)
end;
letrec lookup ==
proc(table: assoc; num: integer)element
begin
if table = assoc$nil
then raise not_found
else if table.index = num
then table.value
else lookup(table.next, num)
end
en}
end;

This is a very simple minded definition but it illustrates the point. We start by giving the header of the procedure which includes the signature of the argument, in this case that element is a type but that any type will do, and the signature of the result. The result is a type with three objects, a value which denotes the empty table and procedures to enter and look up items from the table. It is implemented in terms of a struct (a record with a nil value and equality) which makes up a list of index/value pairs. enter just returns a new list with the new pair "cons-ed" onto the front (We could have written simply let enter == assoc$constr; since the arguments are in the same order). A better implementation would check to see if there was already an entry with that index and return a list with the old entry replaced by the new one. lookup searches the list for an entry with the required index and either returns the value or raises an exception.

There is no particular reason why we should use integers as the indexing value, it would be perfectly possible to use any type which had an equality operation. The procedure header would then be

proc(element: type end;
index_type: type (i) = : proc(i;i)boolean end)...

with integer replaced everywhere in the body by index_type. A more efficient implementation for index types with an ordering would be to use binary trees rather than lists. We would then have to add a > or < to index_type, or at least replace the = by one of these. Now, since types are values we could incorporate an if-statement into the procedure and use one or other of the implementations depending on the value of a further parameter. We might want to do this because one implementation may be more efficient for, say, small tables and the other for larger ones. For the example we will assume a parameter use_binary_tree. The procedure will now look something like this.

proc(element: type end;
index_type: type (i) = , < : proc(i;i)boolean end;
use_binary_tree: boolean)...
begin
if use_binary_tree
then
type .... {Binary tree implementation}
end
else
type .... {List implementation}
end
end

This could now be called as

let a_table == associative(string, integer, true);
let another_table == associative(string, integer, size > 30);

In the second case the expression may not be able to be evaluated when the call to the procedure is compiled, but this does not matter. We do not know at compile-time which of the two implementations of the type will be used, but we know that either of them have all the operations required so they will do equally well. There is however a problem with this idea of types which this example shows quite nicely. Since the expression may not be evaluated at compile-time how do we know when two values have the same type? The type system must ensure that we apply the lookup procedure which understands the representation of the particular associative memory. It would be catastrophic to try to look up a value assuming that the value represented a tree when it was in fact a list. We need the type system to assure us at compile-time that the expressions

let y == X$enter(X$empty, 1, "hello");
X$lookup(y);

where X stands for a type or type-returning expression, will not give faults at run-time because of a mistake in interpreting the representations. There are several possible approaches to the problem of which Poly and Russell illustrate two. In Russell values can have types such as

associative(string, integer, size > 30)

provided nothing in the expression involves a global variable (Variable in this context means something whose value can be changed by assignment.) This essentially means that all functions have to be "variable-free", not just those which directly return types. Given this restriction it is possible to say that if two expressions are syntatically the same in a given context then they return the same value. If however, size were a variable, or associative looked at the value of a global variable, then we could not say with certainty that two values with type

associative(string, integer, size > 30)

had the same type. Taking a purely synatactic view means that expressions like

associative(string, integer, 2 > 1)

and

associative(string, integer, true)

are not the same type. In Poly types are only regarded as the same if they are the same named type. So while values with types which are expressions can sometimes be produced there is very little that can be done with them. To be useful a type-returning expression has to be bound to an identifier.

let a_table == associative(string, integer, true);
let a_val == a_table$enter(a_table$empty, 1, "hello");
let another_table == associative(string, integer, true);
let another_val == another_table$enter(another_table$empty, 1, "hello");

a_val and another_val have distinct types a_table and another_table.

A side-effect of this is that "types" such as

list(integer)

cannot be used directly. We have to write

let int_list == list(integer);

and then use int_list as the type. However this is not such a problem as might at first appear. Since we can write functions which take implied parameters we can write an append function which will work on values of any type with the appropriate hd, tl etc., irrespective of their actual implementations.

3. Modules

A module is conventionally thought of as a collection of types and functions which can be separately compiled. It has an interface which is the types of these functions so that other modules can make use of it without having to know the precise implementation.

Types in Poly can be thought of in the same way. A type is a collection of operations and its signature gives their "types" (We usually think of a type as being something like integer which has values, but a type in Poly can be any collection of objects. So a collection of floating point functions sin, cos etc. could be combined as a type even though there is no such thing as a value of this type.). A module which makes use of other modules, imports them in conventional terms, can be represented as a procedure which is applied to types and returns a type. One of the big advantages of this view of modules is that binding modules together is done using statements written in Poly and type-checked using the normal Poly type-checker. There is no need, as with MESA and C-MESA[Mit79] for a separate module binding language.

The module system for ML[Har85] is essentially a system built on top of the kernel language. Structures and functors correspond to values and functions in the kernel but the ML type system makes it impossible to unify these concepts.

4. Persistence in Poly

Poly is an interactive system in which the user types expressions and declarations and these are compiled and executed immediately. When objects are declared they are added to the objects the system knows about and they can be used in subsequent expressions. Such systems are quite common and usually work on a core image which can be saved from one session to the next. This is fine provided that the core image does not grow too big. However as the core image gets larger the costs of reading it in and writing it out get more serious. Also the cost of garbage-collection rises. There is a further question about the security of the data if the machine crashes while writing out a large image.

For these reasons Poly is implemented in a persistent store [Atk81a][Atk81b] which can be thought of as a core image where objects are only read in when they are actually required. The cost of loading objects from the image, or database, depends on the amount of the store which is used by a program rather than the total size of the image. A simple transaction mechanism ensures that the database remains in a consistent state in the event of a machine crash or if the program is killed halfway through writing out. Some experiments have been done on using multiple databases so that large programs such as the compiler can be shared between several users.

Using this persistent store the Poly compiler has been boot-strapped so that it is just another procedure. A Standard ML compiler has also been written which uses the same back-end as the Poly compiler.

In a typical interactive programming system there is a single name space for all identifiers, but as the number of declarations have grown it has become necessary to divide up the name space into separate environments. An environment is very similar to a directory in a filing system or to a block in a programming language. When an environment is selected all new identifiers are entered into it and looked up in it. There is the equivalent of the scope rules in a programming language so that an identifier is looked up in a series of nested environments until it is found. It could be thought of as a Poly type since it is a collection of objects, but it cannot be quite the same because declarations can be added or removed dynamically to an environment while a Poly type must be "frozen".

5. Conclusions

Poly was designed as a general purpose language and has been used successfully for some medium scale projects (there is about 20000 lines of code in the Poly and ML compilers). After some years of programming in it the type system has proved to work very well. Treating types as first-class values seems to result in a generally simpler language than languages where types are treated as purely compile-time objects. Experience with Standard ML suggests that pattern-matching and exceptions with parameters (exceptions in Poly cannot carry parameters) are something that should be added. Some kind of type inference based on unification could be used to reduce the amount of type information which must be given explicitly, though it cannot remove it completely. The presence of a persistent store tends to break down the distinction between compile-time and run-time, since the compiler is just another function to be applied. Compile-time does have some meaning in this system however. Compiling an expression means checking the interfaces between functions and their arguments so that the result can be guaranteed not to produce a type-checking error later on. If we compile a procedure then we want to produce a type for the procedure as a whole and remove the type information within it. Not only does this improve the efficiency of the procedure but it also gives us a degree of certainty that the procedure will not fail. It is a little way along the road to proving the correctness of the procedure. There is a cost in this static type checking in Poly in that some procedures which are in fact type-correct will fail to pass a static type-checker, but the advantages of static type-checking more than outweigh the disadvantages.

References

[Atk81a] Atkinson M.P., Chisholm K.J. and Cockshott W.P. "PS-Algol: An Algol with a Persistent Heap." Technical Report CSR-94-81, Computer Science Dept., University of Edinburgh.
[Atk81b] Atkinson, M.P., Bailey P., Cockshott W.P., Chisholm K.J. and Morrison R. "Progress with Persistent Programming." Technical Report PPR-8-81, Computer Science Dept., University of Edinburgh.
[Car85] Cardelli L. and MacQueen D. "Persistence and Type Abstraction." Proc. of the Persistence and Data Types Workshop, August 1985.
[Dem79] Demers A. and Donahue J. "Revised Report on Russell." TR 79-389 Dept. of Computer Science, Cornell University.
[Fai85] Fairbairn J. "A New Type-Checker for a Functional Language." Proc. of the Persistence and Data Types Workshop, August 1985.
[Har85] Harper R. "Modules and Persistence in Standard ML." Proc. of the Persistence and Data Types Workshop, August 1985.
[Mat85] Matthews D.C.J. "Poly Manual" SIGPLAN Notices. Vol.20 No.9 Sept. 1985.
[Mil84] Milner R. "A Proposal for Standard ML" in "Proceedings of the 1984 ACM Symposium on Lisp and Functional Programming", Austin, Texas 1984.
[Mit79] Mitchell James G. et al. "MESA Language Manual." XEROX PARC, 1979
polyml-5.6/documentation/Papers/poly/polymanual.html000066400000000000000000003264301265146633400230570ustar00rootroot00000000000000 Poly Manual

Poly Manual

David C.J. Matthews

An original version of this document was published as University of Cambridge Computer Laboratory Technical Report 63 and appeared in SIGPLAN Notices Vol 20 No. 9 Sept. 1985.

Chapter 1. Introduction

Poly is a general purpose high-level programming language. It has a simple type system which is also very powerful. Higher order procedures, polymorphic operations, parameterised abstract types and modules are all supported by a single mechanism.

Poly is strongly typed. All objects have a signature which the compiler can use to check that operations applied to them are sensible. Type errors cannot cause run time faults.

The language is safe. Any faults that occur at run time will result in exceptions which can be caught and handled by the user. All variables must be initialised before they are used so faults due to undefined variables cannot occur.

Poly allows higher order procedures to be declared and used. A higher order procedure is one which takes a procedure as a parameter or returns a procedure as its result. Since Poly is statically scoped (the value bound to an identifier is determined by the static block structure) the procedure that is returned may refer to the arguments and local values belonging to the procedure that returned it, even though that procedure is no longer active.

Poly allows polymorphic operations. For example, in many languages such as Pascal or MODULA-2 programs to sort arrays of integers, arrays of strings or arrays of real numbers are textually almost identical. They differ only in the actual operation used to compare two elements of the array. In Poly one program can be written which will sort arrays of any type provided elements can be compared.

Poly allows abstract types to be created and manipulated. A"hash table" type can be defined that allows an arbitrary object to be stored along with a string which acts as a key. There would be a look-up function that will return the object stored with a given key. These can be written so that only the functions to create a table, enter a value against a key, and return the value with the key, are available to the user of the hash table. This has the advantages that the writer of the hash table function can change the way it is implemented provided it has the same external properties. The user can make use of the hash table knowing that he will not be able to upset its internal structure by accidentally using a function which was intended to be private.

Abstract types can be parameterised so that a set of types with similar properties can be defined in a single definition. A specific type can then be made from that. For example, a single hash table type could be declared from which hash tables to hold any particular type could be derived.

Types in Poly are similar to modules in other languages. For example, types can be separately compiled. An abstract type which makes use of other types can be written as though it were polymorphic - it will work if it is given any type (module) which has the required operations. Its operation may be simply to return a new type (module) as its result. This new type may be used directly or as a parameter to other polymorphic abstract types. There is a mechanism for constructing large programs out of their modules and recompiling those which have been modified since they were last compiled.

Chapter 2. The Type System

The purpose of a type system is to avoid mistakes due to using a value in a way that was not intended, while making meaningful operations easy to express. For example, if we have two matrices with the same dimensions, it should be just as easy to write the instruction to add them together as if they were integers. However it should not be possible to add an integer to a matrix. A type system could be designed in which all these rules were built into the type checker. This has the problem that new types with new rules cannot be added in. A better way is to have a few simple rules which allow new types to be added and checked but which can be used to catch most of the faults which could be made. The Poly type system is based on this idea.

All objects have a signature which is checked by the type-checker. The signature corresponds to a type in other languages, but is more general to take account of the greater power of the type system. For example, in a language like Pascal, a parameter to a procedure may have type integer. This gives enough information for the compiler to check that the procedure is correctly used; it can only be applied to an integer value, but it does not specify precisely which value. It can be applied to 1, 2, 3 etc. but not to strings such as "hello" or "goodbye". The checking done by the compiler ensures that certain kinds of faults will not happen when the program is run, but it cannot prevent all faults.

In Poly this approach is generalised to include procedures, types and exceptions as well as values. The signature of an object contains the information which the compiler uses to check that it is correctly used without restricting it to precisely one object. Expressions and variables can be made to return any kind of object and the signature of the result can be worked out by the compiler, provided of course that all the signatures in the expression match. Specifications have a standard textual form which allows them to be written in a program or output by the compiler. The rules for matching each kind of signature and their textual forms are described below.

2.1. Values

The simplest kind of object is the value which can be operated on but does not do anything itself. Examples are the number 42 or the string "hello". A value is said to belong to a type or have a particular type, which in Poly is always a named type. The signature is the name of the type. For example, the signature of the number 42 is integer and that of "hello" is string. Two values only match if they belong to the same type.

Syntax

<value signature> ::= <identifier> |<value signature>$<identifier>

2.2. Procedures

Procedures are objects which perform a computation. They often take parameters which can be used by the procedure and always return a result. They may also have side-effects or raise exceptions. Examples of procedures are "+" which adds together two values and "print" which prints a value. "+" is an infix operator which takes two values as parameters, and returns a single result.

3 + 4

"print" is a procedure which has the side-effect of printing the value.

print(3+4);

prints out the value 7. It incidentally also produces a result, but it has type void which has only one value, and is ignored.

Procedures can take procedures or types as parameters as well as simple values and can also return them as results. Procedures match if their parameters and results all match. The various forms of procedures will be described in the section on the procedure constructor.

Syntax
<procedure signature> ::=

proc <mode list> <implied parameters> <actual parameters> <signature>

<mode list> ::= <empty> | <mode> <mode list>
<mode> ::= infix <digit> | infixr <digit> | early | inline
<implied parameters> ::= [ <parameter list> ] | <empty>
<actual parameters> ::= ( <parameter list> )
<parameter list> ::= <empty> | <parameter> |<parameter>; <parameter list>
<parameter> ::= <identifier list>: <signature> | <signature>
<identifier list> ::= <identifier> | <identifier list>, <identifier>

2.3. Types

Poly has a novel view of types in that they are treated as being objects as well as having a role in checking the signature of values. Each type has a set of objects associated with it and a type mark. The type mark is used purely by the compiler in checking the signatures of objects and corresponds to the notion of a type in other languages, while the set of objects makes a type in Poly very similar to a module. All types have both a set of objects (which may however be empty) and a type mark, but one or the other may be more important in different circumstances.

2.3.1. Sets of Objects

As an example of the set of objects, the type integer has various operations such as addition, subtraction, multiplication etc. which can operate on values of the integer type. Any program which works on integers will ultimately be written in terms of these basic operations. Similarly the type real will have these operations along with others which convert between integer and real.

The signature of a type is the signature of the objects which make it up. Every object in a type has a name, and all the names in one type are different, although objects with the same name frequently exist in different types. So for instance, many types have a print procedure which takes as its parameter a value of the type, and prints it.

The name of an object in a type is intended to suggest the semantics of the operation, but there is no guarantee that the + operations in all types are commutative; in the type string it is used for concatenation. ( This would require a completely new level of semantic checking which is outside the scope of a conventional compiler. The CLEAR system [Burstall and Goguen] attempts this kind of checking.).

Most of the objects in types are procedures, but a type can contain simple values as well as other types. For instance there may be a first and a last value which give the maximum and minimum values. There is a distinction between objects which are part of the type and those which been created by operations of it and are said to belong to the type or have that type. For example, there is no 3 in the type integer but the number 3 has type integer.

As types are regarded as sets it is reasonable to be able to take subsets or select a particular object from a type. For example,

type (atype)
x
, y: atype;
add: proc(atype; atype)atype;
sub: proc(atype; atype)atype
end

this is the signature of a type with four objects, called x, y, add and sub. x and y are both values of this type, and add and sub are procedures which take a pair of values, and return a value. The name atype in brackets after the word type is the name used to represent the type itself inside the type signature. This type will match any of the following

type (t) { Only the name has changed }
x, y: t;
add: proc(t; t)t;
sub: proc(t; t)t
end

type (atype) { The objects are in a different order }
sub, add: proc(t; t)t;
y: t;
x: t;
end

type (at) { A subset }
x: at;
add: proc(at; at)at
end

type (atype) { Another subset }
add: proc(atype; atype)atype
end

type { Another subset - No need for an internal name }
end

This last example is the empty type which matches any type. The text in curly brackets is comment and ignored by the compiler.

2.3.2 Type Marks and the Specifications of Values

The function of the type mark is in the checking of the signatures of values. Each type has a distinct type mark which is used to identify values which have that type. The signature of a value is simply the type mark of the type to which it belongs. Checking the signatures of two values to see if they match reduces to seeing if they are the same type mark, there is no question of comparing the signatures of the types themselves.

The reason is that there may be many types with the same signature (short and long precision integers may have the same set of operations, +, – etc. but they are different types). The compiler produces type marks in various circumstances so as to guarantee that two different types will always have different type marks. The converse of this is that there are many circumstances in which two types which are in fact identical may have different type marks, and values associated with them will be incompatible. An expression which returns a type always has a type mark which differs from any other, in particular if an existing type is bound to a new name then they will have different type marks. Values which have the old type have a different type mark from the new one and so are incompatible, despite the types being in fact identical.

2.3.3 Sets and Marks

There are circumstances when one or other of the two ways of viewing a type becomes more important. Some types are used only as collections of objects and there are no values associated with them. The type mark for those types is irrelevant. Equally there are occasions in which a type is used where the set of objects is irrelevant. Any type matches the empty type "type end" which has no objects in it. The type mark of the matching type is still there and is used by the compiler.

This is important because of the matching rules for procedure parameters if one or more is a type. A procedure which takes a type as a parameter may use the formal parameter name in the signature of other parameters. For example a procedure may have signature

aproc: proc(atype: type end; x: atype)atype

This procedure takes two parameters, a type which may be any type, and a value which has the same type as the actual parameter. Its result also has this type. This kind of procedure is known as polymorphic. It can therefore be applied to

aproc(integer, 99)

in which case the result will have type integer or

aproc(string, "hello")

returning a string. This procedure might be the identity function which simply returns its second parameter (the value) as its result. What is happening is that the actual type parameter is matched to the formal parameter using the matching rules for types (the formal parameter must be a subset of the actual parameter), and then the type mark of the formal parameter is replaced with the type mark of the actual parameter in the other parameters and the result. The other parameters therefore match if they have the type mark of the actual parameter. The signature of the result is obtained by replacing the formal parameter's type mark by the actual parameter. It is also possible to obtain the type from the type marks of values, and this is used to remove the need to explicitly pass type parameters in many cases.

The reason for considering types both as sets and as marks is that it becomes possible to write polymorphic operations which make use of objects in types. For example a sorting procedure can be written which will work on any values provided they belong to a type whose values can be compared for ordering. How this is done will be described in detail in the section on procedures.

Syntax
<type signature> ::=

type <internal name> <signature list> end

<internal name> ::= <empty> | (<identifier>)
<signature list> ::= <empty> | <object list>
<object list> ::= <object> | <object>; <object list>
<object> ::= <identifier list> : <signature>
<identifier list> ::= <identifier> | <identifier>, <identifier list>

2.3.4. Exceptions

The fourth kind of object in Poly is the exception. The mechanism of exceptions is based on that of Standard ML.

Syntax
<exception signature> ::=

exception <implied parameters> <actual parameters>

Chapter 3. Expressions and Values

The basic element of a Poly program is the expression. An expression has a value and a signature which ensures that the value is correctly used. Expressions consist of identifiers and constructors and operations on them, either procedure applications or selections from types.

3.1. Identifiers

An identifier is a name which represents an object. The binding of a name to a particular object is made by a declaration. An identifier may be any string of alphanumeric characters starting with a letter, or a string of one or more "special" characters. The underline character "_" is considered as an alphanumeric. Each of the following are identifiers, separated by spaces.

a Message integer j + := >>>>>> L999a
An_extremely_long_identifier

The "special" characters are often used for infix operators, but can be used for anything. They are

! # %& = - + * : < > / \ ? ~ ^ | . @

Certain words are reserved and cannot be used as identifiers because they are used for special purposes. These are

and begin cand catch cor do early
else end exception extends if infix infixr
inline let letrec proc raise record struct
then type union while : == .

Identifiers written in different cases are regarded as distinct, except that reserved words may be written in either or mixed case. In this manual reserved words are always shown in bold font while identifiers are given in italics.

Syntax
< identifier> ::=

<letter> | <identifier><letter>|<identifier><digit>

Comments in Poly are written between curly brackets "{" and "}". Any text in the brackets is completely ignored and the whole comment is simply regarded as a separator between words in the same way as a space or a new line.

3.2. Selectors

A selector selects an object from a type.

integer$+

selects the "+" operation from the type integer, while

string$+

selects "+" from string.

Syntax
<selector> ::=

<identifier>$<identifier>|<selector>$<identifier>

3.3. Constructors

Constructors make values from other values. There are general constructors for procedures and types as well as three constructors which make special kinds of types: records, unions, and structures. There are also constructors for values which allow literal constants to be entered in a program.

1 999 "hello" 'A' 0xff

Literal constants are either numbers or strings of characters. Numbers are strings of digits or letters starting with a digit, and strings are any sequence of characters unclosed in quotation marks. By default numbers are converted to type integer and strings to either char if they are enclosed in single quotes ('), or string if they are in double quotes (").

3.4. Declarations

The result of any expression can be bound to an identifier by a declaration.

let result == 4+3* 2;

The identifier result can be used in place of the value that is bound to it.

result+6

will yield the value 16. As well as taking the value from the expression, the identifier also inherits its signature. The signature of result is therefore integer. This works for any expression including those which yield procedures or types.

let p == print;

declares p to be the same as print so

p 10;

will print the value 10.

An explicit signature may be given for an identifier.

let i: integer == 10;

The result of the expression must have this signature for the compiler to allow it. It is useful if a complex expression is being bound to an identifier to check the signature of the result when it is being bound rather than when it is used.

The identifier in an ordinary declaration is declared after the expression is evaluated.

let i == i+1

is valid provided i has been declared before. However when recursive procedures or types are being declared a different kind of declaration is needed.

letrec p == ....

letrec introduces a recursive declaration, and the p used in the expression will be the p that is being declared. Recursive declarations can only be used for procedures or types and will be described in more detail below.

Several declarations can be grouped together with and.

let a == 1 and b == 2

This declares both a and b. Grouping declarations together in this way is useful for mutually recursive declarations.

letrec p == .... and q == ....

Syntax
<declaration> ::=

let <binding> and .... and <binding> | letrec <binding> and .... and <binding>

<binding> ::= <identifier> : <signature> == <expression> | <identifier> == <expression>

3.5. Blocks

Commands can be grouped by enclosing them in the bracketing symbols begin and end or ( and ).

2* (3+4);

begin print "Hello"; print " again" end

A block can consist of several expressions separated by semicolons or just one. While begin and end or round brackets can be used in either case, it is usual to use begin and end to group several expressions together, and round brackets to group parts of an expression which are to be evaluated first. The value returned by the block is the value of the last expression. All the other expressions must return values with type void. Empty blocks are allowed and these return void.

Declarations may appear in the block as well as expressions. The identifier is then available in any of the other expressions after its declaration.

begin let x == 2; x + 3 end

This block returns the value 5. x is not available outside the block, but it is available in inner blocks.

begin
let p == print;
begin
let ten == 10;
p ten
end
end

An identifier declared in a block "hides" an identifier with the same name in a outer block.
Syntax
<block> ::=

begin <expressionlist> catchphrase end | ( <expressionlist> <catchphrase> ) | ( ) | begin end

<expressionlist> ::= <expordec>; ... ; <expordec>
<expordec> ::= <expression> | <declaration>

3.5.1. Conditionals

An expression can return different results according to the value of a test.

if 3 > 4 then 1 else 2;

The result of the conditional is the expression following then if the condition is true and the expression after else if the expression is false. In this case the result will be 2, since the condition is clearly false. The expression to be tested must have type boolean which contains the two values true and false. The two expressions returned by the then- and else-parts must be the same. The else-part may be omitted if the then-part returns a void result.

if x > 3 then print "yes"

Conditionals may return procedures or types but the then- and else-parts must both return values with compatible signatures.

if ... then integer$pred else integer$succ

The expression returns a procedure which takes an integer parameter and returns an integer result.

Syntax
<conditional> ::=

if <expression> then <expression>else <expression> |
if <expression>then <expression>

Related to the if-expression are cand and cor. Syntactically they behave like infix operators of precedence -1 and -2 respectively but they are actually reserved words.

x = 1 cand y =2

is the same as

if x = 1 then y = 2 else false

and

x = 1 cor y =2

is the same as

if x = 1 then true else y = 2

3.5.2. Repetition

An expression can be repeated while some condition holds.

while @x > 0 do x := pred(@x)

decrements x until it is zero, by repeating the second expression until the first returns false. The expression after the while must have type boolean and the expression after do must have type void. The result of a "while-loop" has type void.

The "while-expression" is sometimes convenient, but it is usually both clearer and more efficient to use a recursive procedure.

Syntax
<while loop> ::=

while <expression> do <expression>

 

Chapter 4. Procedures

A procedure is an encapsulated piece of program which may take some parameters and returns a result.

4.1. The Procedure Constructor

A procedure is made by the procedure constructor, called a lambda expression in some languages, which is a expression preceded by a procedure header. The procedure header gives the names and signatures of the parameters as they will be used in the expression and the signature of the result.

proc(i: integer)integer . i + 1

This is a procedure which takes a parameter called i in the block, which is a value of type integer and it returns a result which is a value of type integer. The expression returns a result which is one more than the parameter. This expression is evaluated when the procedure is called and so it is equivalent to the successor function for integer.

The procedure constructor is an expression which returns a procedure as its result. It can be used directly in an expression, but usually it is bound to an identifier.

let imax == proc(i, j: integer)integer . if i > j then i else j

The identifier is then used in an expression

imax(1, imax(2, 3))

4.2. Recursive Procedures

Recursive procedures are declared using letrec.

letrec fact == proc(i: integer)integer . if i = 1 then 1 else fact(i-1) * i

This has made the usual recursive definition of the factorial function. Recursive procedures are the preferred way of making loops and repeating expressions in Poly.

4.3. Operators

Procedures can be declared so that they can be used as infix operators. Infix operators have a precedence which determines how tightly they bind. For example, the expression

1* 2+3* 4

would return 20 if it were evaluated strictly from left to right, but yields 14 if it is evaluated using the normal algebraic rules. In this case the multiplication operator * is said to have a higher precedence than the addition operator +. In Poly the precedence of an infix operator is given as a number between 0 and 9, the higher the number the greater the precedence.

let rem ==
proc infix 7 (i, j: integer)integer . i - i div j * j

This declares rem to return the remainder after dividing i by j.

73 rem 4

In this case rem has been given a precedence of 7, which is the same as the multiplication and division operators. The precedence of the other operators is given in the description of the standard definitions. Operators with the same precedence declared with infix associate to the left. Operators can be made right associative by using infixr.

4.4. Polymorphic Procedures

The imax procedure declared above takes integer values and returns the larger of the two, which is of course also an integer. A similar procedure can be written to return the greater of two strings (in alphabetical order).

let smax == proc(i, j: string)string . if i > j then i else j

smax is exactly the same as imax except for the change in the names of the types. A similar procedure could be written for any type, provided of course that values of the type can be compared with a > operator. In Poly a single procedure can be written to handle all these cases, such a procedure is called polymorphic.

let pmax == proc(a_type: type(t) > : proc(t;t)boolean end; i, j: a_type)a_type .if i > j then i else j

It works by requiring an extra parameter, a_type, which is the type of the values (recall that types can be passed as parameters to procedures). The important thing about this type is that it must have a > operator which compares two values of the type and returns a boolean value. The type signature

type(t) > : proc(t; t)boolean end

expresses this constraint. The other two parameters and the result must be of this type. pmax can therefore be applied to any type which satisfies the constraint, and a pair of values of the type.

pmax(integer, 1, 2)

returns an integer result, while

pmax(string, "abc", "abd")

will return a string. However

pmax(integer, 1, "abc")
pmax(string, 3, 4)

will be rejected by the compiler because the signatures do not match.

max(boolean, true, false)

will also fail, because boolean does not possess a > operator.

4.5. Implied Parameters

It is not very convenient to have to write an extra parameter when calling polymorphic procedures, especially since it is just the type of the other parameters. Poly allows a polymorphic procedure to be written so that the type parameters need not be given explicitly but are passed implicitly.

let max ==
proc[a_type: type (t) > : proc(t;t)boolean end](i, j: a_type)a_type . if i > j then i else j

The type parameter in this case is enclosed in square brackets to indicate that there will not be a corresponding actual parameter.

max(3,4)

looks at the actual parameters, finds that they are integers and so passes the type integer implicitly.

max("abc", "bcd")

passes the type string.

max(3, "abc")

is incorrect because the parameters must have the same type.

Implied parameters are a very powerful facility. All the operators such as + and > are polymorphic procedures which take the type of their explicit parameters as an implied parameter. Their only action is to select and apply the appropriate procedure from the type (This does not mean that adding two integers together requires two procedure calls. These operations are implemented as inline procedures and the compiler optimises it down to a single "add" instruction.) For example, the definition of + in the standard header is

let + { addition } == proc early inline infix 6 [inttype : type (t) + : proc (t; t)t end] (x, y : inttype) inttype} . x inttype$+ y

The words early and inline are directives to the compiler. early tells the compiler that this procedure should be evaluated as soon as possible. This usually means that the compiler will attempt to execute it when it is compiled if its parameters are constants (Since procedures can have side-effects the compiler must not attempt to evaluate all procedures at compile-time. Consider, for example, a procedure which returns the current date and time). inline tells the compiler to insert the code for this procedure at the point of call rather than generate a procedure call. Both early and inline are hints to the compiler rather than instructions, and the compiler may choose to ignore either or both. \syntax{<procedure signature> . <expression>} { <procedure constructor> ::=<procedure signature> . <expression> }

Syntax
<procedure constructor> ::=

<procedure signature> . <expression>

 

Chapter 5. Exceptions

Normally expressions in a block are executed one after another until the end of the block is reached. There are occasions, however, when an unusual case occurs and an escape is needed.

let p == q div r

For example, a program containing a divide operation could possibly fail if r were zero. Explicitly checking for zero before making the division would be tedious and unnecessary in most cases, so what happens is that an exception is generated. Exceptions are error conditions together with a string which identifies the cause of the failure. Dividing by zero, for example, results in an exception with the string divideerror. An exception can also be generated by using raise.

raise an_error

generates an exception with the name an_error.

Exceptions generated in a block may be caught by a handler. A handler is given control when any exception in the block happens and either returns a result or raises another exception. The handler is a procedure whose parameter is a string, the exception name, and result must be compatible with the result the block would return if the exception had not happened.

begin
i div j
catch proc (name: string)integer
begin
print("Exception-");
print(name);
9999
end
end

This block returns the result of dividing i by j unless an exception occurs. In that case it prints out Exception- followed by the name of the exception, and returns the (large) value 9999.

The handling procedure can be any which has the correct signature, but frequently it is written as a procedure constructor after the word catch . Any exceptions raised by the handler are, of course, not caught by it, but appear in the next block out. In addition, if the block contains declarations they are not available to the handler. This is because an exception could occur while the declarations were being made so the identifier would have no value.

begin
let val == i div j;
let otherval == i+1;
catch proc (name: string)...
begin { Cannot use val or otherval here }
end
end

If an exception is not caught in a block it automatically propagates to the containing block. This in turn can handle it, or allow it to propagate to the next block out. An exception raised in a procedure but not caught in it causes the procedure to return and the exception appears at the point where the procedure was called. The calling block will catch the exception if it has a handler or it will propagate back further.

Syntax
<raise expression> ::=

raise <identifier>

<catch phrase> ::= catch <expression>

 

Chapter 6. Specialised Type Constructors

There are three specialised constructors which make different kinds of types. They are normally used to provide the "concrete" type which implements an abstract type. The development of abstract types will be described in the next chapter.

6.1. Records

A record type allows objects composed of a group of values to be put together and taken apart.

let int_pair == record (first, second: integer) } makes a type with the operations for making pairs of integers. The names first and second are known as field names and the signature, in this case integer is the field signature. The result of this declaration is a type int_pair has three operations in it, constr, first and second.

Every record has a constr procedure which takes objects with the field signatures and makes them into a record value. The constr in int_pair takes two integer values and packages them up as a value of the int_pair type.

let pair_val == int_pair$constr(1, 2);

The field names first and second are procedures called selectors that take apart values of the int_pair type and return the first and second values respectively.

int_pair$first(pair_val)

will return 1 and

int_pair$second(pair_val)

will return 2. Records can be made with elements of any signature and any number of elements.

let prec == record (val: integer; pr: proc (integer)integer);

makes a record to hold a value and a procedure. A value of this type can be made by

let prec_val == prec$constr(1, integer$succ)

and the selecting functions val and pr now return an integer value and a procedure respectively.

prec$pr(prec_val)(99) + prec$val(prec_val)

Note, however that each invocation of the record constructor, as with the other constructors, yields a type with a new unique type mark. This means that two record types with identical field names and signatures are regarded as different types. A more convenient syntax for selection is available which allows

pair_val.first pair_val.second

to be used with exactly the same meaning as

int_pair$first(pair_val) int_pair$second(pair_val)

This syntax is not restricted to record selection but can be used with any procedure that is an object in a type and takes one argument of that type. The meaning of X.Y is

X_type$Y(X)

where X_type is the type to which X belongs. So for example,

99.succ.print

is equivalent to

integer$print(integer$succ(99))

Syntax
<record constructor> ::=

record ( <field list> )

<field list> ::= <field> | <field>; <field list>
<field> ::= <identifier list> : <signature>
<identifier list> ::= <identifier> | <identifier> , <identifier list>

6.2. Unions

The record constructor makes types whose values are groups of objects. Another constructor, the union constructor, makes types whose values may have any of a set of signatures.

let int_or_str == union (int: integer; str: string)

This has created a type whose values can be either integers or strings. The names before the colons (int and str) are called tags and a tag and its signature (after the colon) is called a variant. An integer or string may be converted into this type by injection operations.

let int_form == int_or_str$inj_int(99)
let str_form == int_or_str$inj_str("hello")

The names of the injection operations are made by prepending the word inj_ to the tags. The original string and integer values can be obtained by projecting the union value.

int_or_str$proj_int(int_form)
int_or_str$proj_str(str_form)

The names of these operations are made in a similar way to the injection operations and return a value with the appropriate signature. Of course it is possible to apply the wrong projection.

int_or_str$proj_str(int_form)

Since int_form contains an integer it cannot be made to return a string, and so this operation will cause an exception with the name projecterror. To avoid getting exceptions, the union value can be tested to see if it is a particular variant.

if int_or_str$is_str(int_form) then ...

will not execute the expression after then because the test will return false. However

int_or_str$is_int(int_form)

will return true. The alternative syntax for fields of records can be used when projecting or testing unions.

int_form.proj_int
str_form
.proj_str
int_form
.is_int

As with records the variants may be procedures or types as well as values and it is possible to have two variants with the same signature.

let a_union == union (one, another: integer; p: proc (integer)integer)

The two variants one and another are different, so

a_union$proj_one(a_union$inj_another(99))

will result in an exception.

Syntax
<union constructor> ::=

union ( <field list> )

6.3. Structures

The third built-in type constructor makes structure types. Structures are very similar to records in that their values are composed of groups of objects. The difference is that there is an additional value nil in the type and there are operations to compare structure values. Structures are mostly used in recursive declarations to create lists and trees. In fact most structures can be represented using record and union constructors but they are useful enough to be provided separately.

letrec int_list == struct (hd: integer; tl: int_list)

This has created a type which can construct lists of integers. It has five operations together with the the nil value. constr can be used to make int_list values.

let a_list == int_list$constr(1, int_list$constr(2, int_list$nil))

The nil value is used to end the list. Without it there would be no way to construct a structure since a value of the type is needed before a node can be made. The selector procedures, hd and tl are used to select the parts of the structure in the same way as for a record.

int_list$hd(a_list) int_list$hd(int_list$tl(a_list))

If a selector is applied to nil an exception nilreference is raised, since there is no value that can be returned. There are two operations = and <> which compare two structure values. = only returns true if they the structures are identical, that is they were made with the same call of constr or they are both nil.

let b_list == int_list$constr(2, int_list$nil)

has made a list with the same hd and tl values as the tail of a_list but

b_list = a_list.tl

will return false.

Syntax
<structure constructor> ::=

struct ( <field list> )

 

Chapter 7. Type Constructor

As well as the using the constructors described above it is possible to make a type by extending an existing one. This usually involves adding new procedures or replacing existing ones.

let new_int ==
type (int) extends integer;
let sqr == proc (i: int)int . i*i
end

This declares new_int to be a type which is an extension of the existing type integer. The name in brackets, int, is used inside the constructor to represent the type being made. For instance the parameter and result of sqr both have type int. The result of this constructor is a type which has all the operations which integer had, but in addition it has a sqr procedure which returns the square of its parameter. This new type is different from integer so it cannot be used directly on values with the integer type. The conversion operation up must be used to make an integer value into a new_int one.

new_int$sqr(new_int$up(99))

There is a similar operation down which will convert values in the opposite direction

10 + new_int$down(new_int$sqr(new_int$up(11)))

These two operations are added to the new type when an old type is being extended to allow conversion of values from the old to the new types. They can be redefined if necessary or, as we shall see, "hidden" so that conversion of values is not possible.

The above example shows how a new type can be made which is slightly different from an existing one.

7.1. A New Type

The same approach is used to construct a completely new type. We have already seen that a record can be used to make a pair of integers and this pair can be extended to make a double precision integer type. Suppose that the maximum range of numbers which could be held in a single integer was from -9999 to 9999. Then a double-precision number could be defined by representing it as a record with two fields, a high and low order part, and the actual number would have value (high)*10000 + (low). This can be implemented as follows.

let dp ==
type (d) extends record (hi, lo: integer);
let succ ==
proc (x:d)d
begin
if x.lo = 9999
then d$constr(succ(x.hi), 0)
else if x.hi < 0& x.lo = 0
then d$constr(succ(x.hi), ~9999)
else d$constr(x.hi, succ(x.lo))
end;
let pred ==
proc (x:d)d
begin
if x.lo = ~9999
then d$ constr(pred(x.hi), 0)
else if x.hi > 0 & x.lo = 0
then d$constr(pred(x.hi), 9999)
else d$constr(x.hi, pred(x.lo))
end;
let zero == d$ constr(0,0);
let iszero == proc (x:d) boolean . x.hi = 0 & x.lo = 0
end;

This is sufficient to provide the basis of all the arithmetic operations, since +, -, * etc. can all be defined in terms of succ, pred, zero and iszero. Of course they can be included in the type if required.

7.2. Information Hiding

As it stands this type includes the operations hi, lo and constr which were inherited from the record type as well as the new operations. These old operations are a nuisance, they are not part of the double-precision type as such and they provide a security risk since it would be possible for someone to produce a value which appeared to be a double-precision number but, for example, had a positive high order part and a negative low order part. Unwanted operations can be masked out by giving an explicit signature which contains only those operations which are actually required.

let dble:
type (d)
succ, pred: proc (d)d;
zero: d;
iszero: proc (d)boolean
end
== dp;

This has created a new type dble which takes objects from dp but only takes those which are explicitly given in the type signature. It is impossible to create a value of the dble type or take it apart except with the given operations. An alternative would have been to have given the explicit signature in the original declaration.

let dp:
type (d)
succ, pred: proc (d)d;
zero: d;
iszero: proc (d)boolean
end
==
type (d) extends ... { The body of dp as before. }
end

 

7.3. Conversions

This double-precision type suffers from the problem that the only constant value is zero. All other values have to be made by using succ or pred. It would be convenient if other constants could be made. One way would be to define a procedure inside the type constructor which would convert an integer value into a dble one.

let make_double == proc (int: integer)d. d$constr(0, int)

This assumes that no integer value is greater than 10000. If larger integer values are possible then the body of the procedure would be

d$constr(int div 10000, int mod 10000)

integer values can now be made into dble ones.

dble$make_double(42)

The maximum value is limited by the maximum possible integer, so very large double-precision numbers still cannot be made. It would be nice to be able to have large literal constants such as 12345678 in a program. A solution to this is to convert literals directly from their string representations i.e. from the string "12345678". This is done by defining a conversion procedure with the name convertn inside the type.

let convertn ==
proc (rep: string)d
begin
letrec getch ==
{ Returns the result of converting the first i characters. }
proc (i: integer)d
begin
if i = 0
then zero
else
begin
let this_ch == rep sub i; { Obtains the ith. character }
if this_ch < '0' | this_ch > '9' { Must be a digit }
then raise conversionerror
else
{Convert the first i-1 characters}
{then multiply by 10 and add in this digit}
getch(i-1)* d$ make_value(10) + d$ make_value(ord(this_ch) - ord('0'))
end
end;
getch(string$ length(rep))
end

This procedure reads the string and converts it into the numeric value. If any of the characters is not a digit then it raises the exception conversionerror. We assume that + and * operations have been defined for the type.

With this operation it is possible to write expressions like

dble$12345678 + dble$99999

The compiler automatically generates a call to dble$convertn when it recognises these constants. It is usual to declare conversion routines as early so that the compiler will do the conversion, rather than leaving the conversion until the program is run. If a number is not preceeded by a type name then the conversion used is the value of convertn which is in scope. The standard header contains the binding

let convertn == integer$ convertn

so that numerical constants are converted to integer by default.

There are two other conversion operations, convertc for strings in single quotes, and converts for strings in double quotes. These default to char$convertc and string$converts respectively.

7.4. Generic Types

Types in Poly can be treated as ordinary values. We have already seen how the ability to pass types as parameters to a procedure allows polymorphic operations, we shall now see how being able to return a type can be useful.

A type which could be used to hold lists of integer values was described above. It was defined as

letrec int_list == struct (hd: integer; tl: int_list)

A type for lists of strings would be almost identical.

letrec str_list == struct (hd: string; tl: str_list)

Indeed lists of any type could be defined in the same way. The signature of the type in each case is basically the same.

type (list)
hd: proc (list)integer;
tl: proc (list)list;
constr: proc (integer; list)list;
nil: list;
<>, = : proc (list; list)boolean
end

We can define a list type for an arbitrary element type using a procedure.

let list ==
proc (element_type: type end)
type (list)
hd: proc (list)element_type;
tl: proc (list)list;
constr: proc (element_type; list)list;
nil: list;
<>, = : proc (list; list)boolean
end .
begin
letrec list_type == struct (hd: element_type; tl: list_type);
list_type
end

This procedure can be applied to any type, since any type matches the empty type "type end".

let int_list == list(integer);
let str_list == list(string);
let dble_list == list(dble);

The result is always a list with the same operations, but different signatures.

let a_list == int_list$ constr(999, int_list$ nil);
let b_list == str_list$ constr("hello", str_list$ nil);

The list types are different types, so only operations of the correct type are possible.

int_list$ hd(a_list);
str_list$ hd(b_list)

are valid, but

int_list$ hd(b_list);
int_list$ tl(b_list);
let c_list == int_list$ constr(999, b_list)

are not.

Syntax
<type constructor> ::=

type <internal name> <declarations>
<extension> <declarations> end

<internal name> ::= (<identifier>) | <empty>
<declarations> ::= <dec list> | <empty>
<dec list> ::= <declaration> | <dec list>; <declaration>
<extension> ::= extend <expression> | <empty>

 

Chapter 8. Standard Definitions

Poly is extremely flexible because much of the system is built on top of the language rather than built into it. It can be changed as required by redefining or adding new definitions. The standard definitions contain types and procedures which are likely to be of use to many programmers. For efficiency reasons some are written in assembly code or are handled specially by the code generator, but they all have signatures like ordinary definitions and can be redefined if required.

8.1. Primitive Types

8.1.1. void

void is used as a form of place-holder when a type is expected. For example, procedures which have side effects but no result are considered as returning a value of type void. It has only one value empty, and its signature is simply

void :
type (void)
empty : void
end

8.1.2. boolean

Boolean is the type used in tests. It has two values true and false. The complete signature is

boolean :
type (boolean)
true, false : boolean;
& : proc infix 4(boolean; boolean)boolean;
| : proc infix 3(boolean; boolean)boolean;
~ : proc (boolean)boolean;
<>, = : proc infix 5(boolean; boolean)boolean;
repr : proc (boolean)string;
print : proc (boolean)
end

The &, | and ~ operations correspond to the normal boolean operations AND (the result is true only if both the arguments are true), OR (the result is true if either arguments are true) and NOT (the result is true if the argument is false and vice-versa). <> and = compare the two arguments and can be regarded as exclusive-OR and exclusive-NOR respectively. repr returns the string "true" if the argument is true and "false" if it is false. print prints the string representation on the terminal.

8.1.3. integer

The type integer is the basic type used for numbers. Its signature is

integer :
type (integer)
first, last, zero : integer;
+, - : proc infix 6(integer; integer)integer;
* , div, mod : proc infix 7(integer; integer)integer;
pred, succ, neg : proc (integer)integer;
~ : proc (integer)integer;
<, <=, <>, =, >, >= : proc infix 5(integer; integer)boolean;
convertn : proc (string)integer;
repr : proc (integer)string;
print : proc (integer);
end

first and last are the minimum and maximum values that an integer can have. last is frequently one less than the negative of first.

+ and - are the usual infix addition and subtraction operations. They raise the exception range if the result is outside the valid range.

* is the infix multiplication operator which also raises range is the result is out of range.

div is the division operator and mod returns the remainder. They both generate divide if they are asked to divide by zero, and div may generate range when first is divided by minus one.

pred and succ respectively subtract and add one to a number, raising range if the result is out of range.

neg returns the negative, raising range if its argument is first.

~ is the same as neg.

<, <=, <>, =, > and >= are the usual infix comparison operations.

convertn is the operation which converts literal constants into integers. It recognises strings of digits as decimal (base 10) values unless the first character is a '0' in which case it treats it as an octal value or hexadecimal if it starts with '0x'. conversion is raised if the string does not fit one of these forms or rangeerror if it is too large.

repr performs the reverse of convertn by generating a string from a number. It is always generated as a decimal number.

print prints the string representation on the terminal.

8.1.4. long_integer

long_integer is very similar to integer but it allows larger numbers to be handled. Its signature is

long_integer :
type (long_integer)
first, last, zero : long_integer;
+, - : proc infix 6(long_integer; long_integer)long_integer;
* , div, mod: proc infix 7(long_integer; long_integer)long_integer;
pred, succ, neg: proc (long_integer)long_integer;
~ : proc (long_integer)long_integer;
<, <=, <>, =, >, >= : proc infix 5(long_integer; long_integer)boolean;
convertn : proc (string)long_integer;
repr : proc (long_integer)string;
print : proc (long_integer);
from_integer : proc (integer)long_integer;
to_integer : proc (long_integer)integer;
end

The signature is the same as that of integer with the addition of from_integer and to_integer which convert between integer and long_integer. to_integer generates a rangeerror exception if the value is too large to fit into an integer.

8.1.5. char

The type char is the type of character values. It has signature

char :
type (char)
first, last : char;
<, <=, <>, =, >, >= : proc infix 5(char; char)boolean;
convertc : proc (string)char;
pred, succ : proc (char)char;
repr : proc (char)string;
print : proc (char);
end

Characters are regarded as being ordered according to the underlying character code. The ordering will usually follow alphabetic order. first and last are the smallest and largest characters and pred and succ give the previous and succeeding characters according to the ordering. pred and succ raise the range exception if a value would be produced outside the range. The comparison operations compare values according to the ordering.

8.1.6. string

Character strings have type string.

string :
type (string)
mk : proc (char)string;
<, <=, <>, =, >, >= : proc infix 5(string; string)boolean;
converts : proc (string)string;
length : proc (string)integer;
print : proc (string);
repr : proc (string)string;
+ : proc infix 6(string; string)string;
sub : proc infix 8(string; integer)char;
substring : proc (string; integer; integer)string
end

mk converts a character into a single length string, while sub selects a character at a particular position. The character positions are numbered from 1 to the length of the string, returned by length. Selecting a character outside this range results in a subscript exception. Subcripting a zero length string will therefore always result in an exception. substring extracts a string from another. It takes as parameters a string, an integer which gives the starting position in the string, and a second integer which gives the number of characters to select.

string$substring("hello", 3,2);

results in the string "ll". If the first parameter is outside the string or there are not enough characters in the string then subscript is raised. Two strings can be concatenated by +.

8.2. Variables and Vectors

So far the language described has been purely applicative, that is procedures can be applied to values, but there is no way to change the value associated with an object. Variables and vectors can be created and used in Poly but they are not built into the type system.

8.2.1. new

Variables are created by the procedure new which has the following signature.

new : proc [base : type end ] (base)
type
assign : proc (base);
content : proc ()base
end

new is a procedure which takes a value of any type and returns a type with two operations assign and content as its result. For example,

let v == new(99);

declares v as a type with signature

v: type
assign : proc (integer);
content : proc ()integer
end

The type is here being used as a way of packaging together a pair of procedures, there is no such thing as a value of this type.

The parameter type of assign and the result of content were found from the type of the original argument (99 has type integer). The current value associated with the variable is found using the content procedure.

v$content()

will return 99, the initial value associated with it. The value can be changed using assign.

v$assign(v$content()+1);

sets the value to 100.

Variables can be passed as parameters and returned as results from procedures like any other value. However, note that

let vv == v;

makes vv the same value as v which means that it refers to the same variable, and hence changes to vv will affect the value returned from v and vice versa.

It is not necessary to write "$content()" after every variable name in order to extract its value, the compiler will attempt to call the content object of a type if it is given one when it expects an ordinary value. There is also an infix assignment operator defined in the standard header which allows use of the normal syntax for assignment.

v := v+1

is therefore equivalent to

v$assign(v$content()+1)

8.2.2. vector

vector is a procedure which creates an array of variables.

vector: proc [base : type end ] (size: integer; initial_value: base)
type
sub: proc (integer)
type
assign : proc (base);
content : proc ()base
end;
first, last: integer
end

It takes as parameters the size of the array (i.e. the number of variables) and a value which is the initial value for each.

let v == vector(10, "init")

A particular variable is selected by applying the sub procedure to a number between 1 and the size (the index). The result will be a variable which can be assigned a value, or its value can be read.

v$sub(4)
v$sub(5) := "new string"

Attempting to apply sub to a value outside the range causes a subscript exception.

first and last are two integer values that are set to the minimum and maximum index values (1 and the size respectively). If the size parameter given to vector is less than 1 it will raise a range exception.

8.3. Iterators

Many programs involve the processing of lists or sets of values processing each one or searching for one which satisfies some condition. The standard header contains definitions to make these easier. All of these work using a standard interface, a type, called an iterator which represents an abstract sequence of values. An iterator has the following signature.

type (iterator)
continue : proc (iterator)boolean;
init : proc ()iterator;
next : proc (iterator)iterator;
value : proc (iterator)base_type
end

Values of the iterator type are elements of a sequence such that each has a value of some base type associated with it and a way of getting to the next element. They can be regarded as elements of a list, but equally they can be a range of integer values. init generates the first element of the sequence, and continue tests it to see if is a valid entry (the sequence may be empty or exhausted). If it is valid then value may be used to extract the associated value and next used to return the next element in the sequence. To see how this works we will examine two procedures which use iterators.

8.3.1. for

The for procedure is designed to apply a given procedure to every member of a sequence. Its signature is

for : proc [base : type end ]
(iterator :
type (iterator)
continue : proc (iterator)boolean;
init : proc ()iterator;
next : proc (iterator)iterator;
value : proc (iterator)base
end;
body: proc (base))

It takes an iterator and applies the procedure body to each element in turn. The body of for in Poly is

begin
letrec successor ==
{ Loop until the condition is false }
proc inline (counter: iterator)
begin
if counter.continue
then
begin
body(counter.value);
successor(counter.next)
end
end { successor };
successor(iterator$init()) { The initial value of the iterator. }
end { for };

The successor loops generating elements of the sequence and applying body to each value until the sequence is exhausted.

8.3.2. first

The other procedure which operates on iterators is first which searches a sequence until a condition is found. It has signature

first : proc [base, result: type end ]
(iterator :
type (iterator)
continue : proc (iterator)boolean;
init : proc ()iterator;
next : proc (iterator)iterator;
value : proc (iterator)base
end;
test: proc (base)boolean;
success: proc (base)result;
failure: proc ()result
)result

As well as the iterator, first takes three other explicit parameters, all procedures. The first is the test which is applied to each value. If it succeeds (returns true) then the success procedure is called with the value as its parameter. If the sequence is exhausted before the test has succeeded the failure procedure is invoked. The result of first is the result of either success or failure.

Chapter 9. Compiler and Environment

This part of the system is still under development and is not guaranteed to remain stable. Parts of it are also heavily UNIX dependent.

The current environment support provides facilities for compiling text files and remaking a system from its composite modules, compiling those which have been modified. There is a simple history mechanism for re-executing commands.

The system is used interactively with Poly expressions and declarations being typed in by the user and the reponses printed by the computer. Poly is used as a command language as well as a programming language, so all commands are simply Poly procedure calls and have their signatures checked by the compiler. Commands must either return values of type void, in which case they are simply executed, or they must return values of a type which has a print operation so that the result can be printed. Variables and procedures with no parameters are allowed provided their results are void or can be printed.

9.1. environ

environ is the type which is the nearest equivalent to a file directory in Poly. It has signature

environ :
type (environ)
enter : proc (environ; string; declaration);
lookup : proc (environ; string)declaration;
delete : proc (environ; string);
print : proc (environ);
in : proc (
type
enter : proc (string; declaration);
lookup : proc (string)declaration;
delete : proc (string);
over : type (iter)
continue : proc (iter)boolean;
init : proc ()iter;
next : proc (iter)iter;
value : proc (iter)declaration
end
end
)environ;
out : proc (environ)
type
enter : proc (string; declaration);
lookup : proc (string)declaration;
delete : proc (string);
over : type (iter)
continue : proc (iter)boolean;
init : proc ()iter;
next : proc (iter)iter;
value : proc (iter)declaration
end
end
end

declaration is a type which the compiler uses to represent objects that it has created.

A value of the environ type is a set of procedures which map strings onto declaration values. The compiler uses the value of current_env as the environment in which to compile something. It uses the lookup procedure to find the value and signature of identifiers and calls enter to store the result of making declarations. A particular value of the environ type is made by using the in procedure to package up a type with the appropriate operations. The inverse operation out can be used to extract the type.

There is a procedure mkenv which can be used to create environ values. It has signature

mkenv : proc (environ)environ

It returns an environment which can be seen as an extension of the environment which was given as the parameter. New declarations result in entries in this new environment and they can be found by using the identifier. However, looking up an identifier which has not been declared in this environment results in a search in the environment originally passed as the parameter. This can be regarded in the same way as nested declarations in Poly where an identifier is first looked up in the current block and if it is not found there the enclosing blocks are searched. Typically mkenv is called with either the current environment or the global environment as parameter.

let new_env == mkenv(current_env);
current_env := newenv;
let new_env == mkenv(global_env);

The global environment contains declarations such as integer which it is expected that nearly all programs will require.

The computation involved when entering or looking up an identifier may be considerably more than just operating on a table. The make procedure, for example, uses an environment in which looking up an identifier may involve recursive calls to the compiler to compile the object.

9.2. ?

? prints the signature of an object which has previously been declared. It has signature

? : proc (string)

For example, the statement

? "?";

prints

? : proc (string)

It is useful to be able to check the signature of an object before using it.

9.3. #

# runs a text file through the compiler and executes the result. It has signature

\# : proc (string)

At present the string parameter it takes is an ordinary UNIX file name, without any processing of wild-cards.

9.4. sh

sh runs a line of text through the UNIX shell. It can be used to execute any command, including starting up interactive programs. It has signature

sh : proc (string)

For example,

sh "emacs fred";

will start up and run the "emacs" editor on a file called "fred". The Poly system will wait until the process is finished before continuing.

9.5. make

The make command in Poly is similar in function to the "make" command under UNIX. It constructs a Poly object by recompiling only those parts of it which have changed since it was last made.

It is generally good programming practice to break a large program down into several parts, usually called modules, and develop each independently. A module usually provides several related functions and so can be represented in Poly as a "type". Such types may or may not have values belonging to them. For example, a module to construct stacks could be the type "stack" and all stacks would be of that type, but a module for a set of trigonometrical functions would be simply a set of related procedures.

A module may be complete in itself or require other modules to make it work. The latter case is represented in Poly by a procedure which takes some types as parameters and returns a type as the result. So, for example, a module for a parser may use modules for the symbols and for the parse tree.

An important point about these modules is that each can be compiled independently and then the program can be made by applying the modules which are procedures to their parameters. The process of applying a module to other modules is known as binding. Like any other procedure application in Poly it is subject to the normal rules for signature matching.

When a module is changed, for example to correct a bug, it must be recompiled and rebound. The purpose of the make procedure is to ensure that everything which must be recompiled has been and to rebind all the necessary modules. Note that a change to the signature of the module may require changes to other modules that use it, otherwise a signature fault may be generated by the compiler. A change of signature may not always require all the using modules to be recompiled. For example, a module which is a type may have several operations used by different using modules. Changing the signature of one of these operations will require changes only to those modules which actually use that operation.

The make procedure assumes that the source text of the modules is held in some UNIX text files in a set of related directories. As an example suppose we have a set of modules which are combined in the following fashion to make a program.

let a == b(c, d);
let e == f(g, h);
let i == j(a, e, h);
let z == k(i, e);

z is the result of binding the modules together and is the final program. The source text is arranged in a series of directories with the root directory called z.

z contains k, i and e and h.
z/k is the source text for k.
z/i is a directory containing j and a.
z/i/j is the source text for j.
z/i/a is a directory containing source files b, c and d. }
z/e is a directory containing source texts f and g.
z/h is the source text for h.

In addition each directory has a file called poly_bind which are the instructions for binding together the modules to make the result.

z/poly_bind contains "let z == k(i, e);"
i/poly_bind contains "let i == j(a, e, h);"
e/poly_bind contains "let e == f(g, h);"
a/poly_bind contains "let a == b(c, d);"

Supposing h has been modified and we wish to remake z. The command

make "z";

looks for a file "z" and examines its access permission. It discovers that it is a directory and so tries to compile the file "z/poly_bind". This contains the command

let z == k(i, e);

For each identifier in the command it looks up a file with that name in the current directory and only if that fails does it treat it as an ordinary identifier. k is a text file so it compares the time that it was last modified (kept by the operating system) with the time on which an identifier called k was last declared (kept by the Poly system). It sees that the file has not been modified since k was declared so it uses that declaration. If it had found that the file was newer it would recompile k (by a recursive call to the compiler) before returning the newly compiled version. It does not perform any other consistency checks relying on the type checking to ensure that k really is a procedure which can correctly be applied to i and e.

It next encounters i which it discovers is a directory and so it executes the file z/i/poly_bind. j is treated in the same way as k, but a is again a directory. It recurses again to process a and checks b, c and d. Finding that all these are text files and are up to date and that a is newer than each of them, it concludes that a is up to date and uses its current value without rebinding.

e, being a directory, is processed in the same way as a. f and g are both found to be up to date, but h is not found in the directory. The directories are regarded as nested blocks so that if a file is not found in the current directory the make program looks in the immediately enclosing one (i.e. the parent directory). It fails to find h in i and so tries z. There it finds the source text for h and discovers that it has been modified and must be recompiled. It recompiles it, returning the newly compiled h as its result. e must now be rebound so the declaration is executed and the new value returned as the result.

The next identifier in the declaration of i is h itself. The program remembers that h has been checked and uses the new value, rather than repeating the check on when the files were modified. It does this whether it has recompiled the file or just checked that it does not need recompiling. It executes the declaration of i because e and h have been remade and returns this as its result.

In the declaration of z the next identifier is e. Again it uses the fact that e has been checked to save processing the declaration of e again. Finally it can rebind z and the construction is complete. If make is rerun immediately after this it will simply check everything and not rebind any of the files.

Note that each file must be "in scope" when it is required. Because h is used by both i and e it must be in the path to both of them i.e. in the z directory.

9.6. Persistent Storage

The Poly system runs under a persistent storage system, that is any declarations of identifiers or values in variables can be retained from one session to the next on permanent storage. The database is held on a file and objects are read in from it as required. Once read in they are retained in store until the end of the session when those which are to be retained are written out again. The criterion for writing something out to the database is whether it is reachable from the root procedure which is the one used when Poly is started up. In the normal Poly system this essentially means that any declarations made in the global environment will be retained. When the user exits normally from Poly all the reachable objects are written back and the database is updated. The database can also be written back by executing the procedure commit(); which writes back the database and exits from Poly. It is currently not possible to write the database and continue.

9.7. history

The normal Poly system reads commands from the input stream, usually the terminal, and compiles and executes them. It also remembers the last few commands typed so that they can be re-executed if necessary. The commands in the table can be printed by the history procedure.

history();

There are three procedures which execute commands from the history table. Each command prints the command before executing it, and also enters the command it will execute in the history table. The previous command can be executed by the !!procedure.

!!();

Another command can be executed using the !- procedure. It has signature

!- : proc (integer)

The integer parameter is the number of the command counting back from the current one, so

!- 1;

is equivalent to

!!();

The third command ! has signature

! : proc (string)

The string is the first few characters of the command to be executed, so to re-execute the last declaration,

! "let";

can be used. The command found is the first one whose characters match, working from the last command back. polyml-5.6/documentation/PrettyPrint.html000066400000000000000000000135651265146633400207670ustar00rootroot00000000000000 Pretty Printing

Pretty Printing

The way pretty printing is handled in Poly/ML changed in version 5.3. This describes the functions and datatypes that were added in that version. The old mechanism, using PolyML.install_pp, is deprecated and may be removed in a future release.

The basic model, described in the paper by D.C. Oppen ACM ToPLAS Vol. 2 No. 4 Oct 1980, is unchanged but instead of a set of imperative functions pretty printing is structured around the PolyML.pretty datatype and the pretty printing algorithm is now functional rather than imperative.

datatype pretty =
     PrettyBlock of int * bool * context list * pretty list
   | PrettyBreak of int * int
   | PrettyString of string

and context =
    ContextLocation of location
  | ContextParentStructure of string * context list
  | ContextProperty of string * string

withtype location =
   { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int }

PrettyString s contains a string to be printed. PrettyBlock(indent, consistent, context, items) defines a block of items which may be strings, breaks or blocks. The items will be retained on a single line if possible. The indent parameter is an indentation that will be added to the current indentation if the block has to be broken. Note that this does not apply to the first item in the block which will always be printed with the current indentation. The consistent parameter indicates whether the block is to be broken consistently (true) or not (false). If it is true then if the block will not all fit on a line and must be broken then it will be broken at all the breaks in the block whether this is necessary or not. If it is false it will only be broken where necessary. Neither of these parameters are used if the block will fit on a line. PrettyBreak(blanks, breakOffset) indicates a break between items. If the line is not broken at this point then blanks is the number of space characters that will be inserted. If the line is broken at that point then instead the following item is indented by an extra breakOffset spaces.

The context and location types are primarily used by the IDE when providing error messages. For most purposes the context argument to PrettyBlock can be the empty list. ContextProperty can be used by a user-supplied pretty printer to provide extra information which may be useful if the result of pretty printing is to be processed by a user function. It is not produced by Poly/ML pretty printers and the default printers ignore this item. ContextParentStructure was used to deal with types inside structures in an early draft and will probably be removed.

A pretty printer can be associated with a datatype using PolyML.addPrettyPrinter.

val addPrettyPrinter: (int -> 'a -> 'b -> pretty)-> unit

This function has a polymorphic type but is specially handled by the compiler. addPrettyPrinter pp installs a pretty printer pp where pp has arguments depth printArgTypes value. The first argument, depth, is the print depth. This is a value that indicates how much of the data structure should be displayed. If this value is zero or negative the pretty printer should always print a simple string such as PrettyString "...". The third argument, value, is a value of the datatype. When installing a pretty printer there must be sufficient type constraint so that the compiler is able to determine the type unambiguiously. The second argument, printArgTypes, is only used for polytypes i.e. datatypes defined as 'a t or ('a, 'b', 'c ...) t. It is not used for monotypes. If the type takes a single argument then printArgTypes has type 'a * int -> pretty and is the function that will generate the pretty data structure for the argument type. The int argument is the adjusted print depth and should normally be one less than the value of depth. If the type takes multiple arguments then printArgTypes is a tuple with each field being a function of type 'a * int -> pretty that is used for the corresponding argument of the datatype.

As well as PolyML.addPrettyPrinter there some other functions in the PolyML structure that may be useful.

val prettyRepresentation : 'a * int -> pretty

This function returns the pretty structure that can be used to print a value of the given type up to the specified depth. It is similar to PolyML.print in being infinitely overloaded. It can be useful when writing a pretty printer for a datatype that includes types that already have pretty printers installed or where they will be installed later since it uses any pretty printers for the types when it is actually called.

val prettyPrint: (string -> unit) * int -> pretty -> unit

This function takes an output function and a line length and outputs a pretty structure, interpretting the layout information.


polyml-5.6/documentation/Reference/000077500000000000000000000000001265146633400174615ustar00rootroot00000000000000polyml-5.6/documentation/Reference/Basis.html000066400000000000000000001022071265146633400214120ustar00rootroot00000000000000 Poly/ML Basis Library

Poly/ML Basis Library

A list of the items in the Poly/ML basis. These are the pre-defined structures, values, types and functors. Many of them are from the Standard Basis Library and are not described in much detail here. The entries that are specific to Poly/ML are explained in greater detail.

Structures

Array Array2 ArraySlice Asn1 BinIO BinPrimIO Bool BoolArray
BoolArray2 BoolVector Byte Char CharArray CharArray2 CharArraySlice CharVector
CharVectorSlice CInterface CommandLine Date General GenericSock HashArray IEEEReal
INetSock IO Int Int32 IntArray IntArray2 IntArraySlice IntInf
IntVector IntVectorSlice LargeInt LargeReal LargeWord List ListPair Math
NetHostDB NetProtDB NetServDB Option OS PackRealBig PackRealLittle PackWord16Big
PackWord16Little PackWord32Big PackWord32Little PackWord8Big PackWord8Little PolyML Position Posix
Process Real RealArray RealArray2 RealArraySlice RealVector RealVectorSlice RunCall
RuntimeCalls Signal SingleAssignment SML90 Socket String StringCvt Substring
SysWord Text TextIO TextPrimIO Thread ThreadLib Time Timer
Universal UniversalArray Unix UnixSock Vector VectorSlice Weak Windows
Word Word8 Word8Array Word8Array2 Word8ArraySlice Word8Vector Word8VectorSlice Word32
Word64              
 

Signatures

ARRAY ARRAY2 ARRAY_SLICE ASN1 BIN_IO BIT_FLAGS BOOL BYTE
CHAR COMMAND_LINE DATE GENERAL GENERIC_SOCK IEEE_REAL IMPERATIVE_IO INET_SOCK
IO INTEGER INT_INF LIST LIST_PAIR MATH MONO_ARRAY MONO_ARRAY2
MONO_ARRAY_SLICE MONO_VECTOR MONO_VECTOR_SLICE NET_HOST_DB NET_PROT_DB NET_SERV_DB OPTION OS
OS_FILE_SYS OS_IO OS_PATH OS_PROCESS PACK_REAL PACK_WORD POSIX POSIX_FILE_SYS
POSIX_IO POSIX_PROC_ENV POSIX_PROCESS POSIX_SIGNAL POSIX_SYS_DB POSIX_TTY PRIM_IO REAL
SIGNAL SML90 SOCKET STREAM_IO STRING STRING_CVT SUBSTRING TEXT
TEXT_IO TEXT_STREAM_IO THREAD TIME TIMER UNIX UNIX_SOCK VECTOR
VECTOR_SLICE WEAK WINDOWS WORD

Functors

ImperativeIO PrimIO StreamIO

Values

! :: := @ ^ app before Bind
ceil chr Chr concat Div Domain EQUAL Empty
exnMessage exnName explode Fail false floor foldl foldr
getOpt GREATER hd ignore implode isSome length LESS
map Match nil NONE not null o ord
Option Overflow print real ref rev round size
Size SOME Span str Subscript substring tl true
trunc use valOf vector        

Types

array bool char exn int list option order
real ref string substring unit vector word  

Infixes

infix  7 * / div mod
infix  6 + - ^
infix  4 = <> > >= < <= 
infixr 5 :: @
infix  3 := o
infix  0 before

Standard Basis Library

Poly/ML supports the ML Standard Basis Library. The documentation is available as a book, The Standard ML Basis Library, by Emden Gansner and John Reppy.  This is a short overview with specific reference to the implementation in Poly/ML.

signature GENERAL
structure General: GENERAL

Mainly standard exceptions. All of the values in the General structure are available unqualified at the top level.

signature OPTION
structure Option: OPTION

The option type, defined as datatype 'a option = NONE | SOME of 'a, together with associated functions. Some of these are available unqualified at the top level.

signature BOOL
structure Bool: BOOL

Functions on type bool.

signature INTEGER
structure LargeInt: INTEGER
structure Position: INTEGER
structure IntInf: INTEGER

Int, LargeInt and Position are the same structure and provide operations on type int. In Poly/ML that is an arbitrary precision integer. Poly/ML does not support any fixed precision integers. IntInf provides additional functions, such as logical operations on integers. Note: there are functions to compute LCM and GCD in PolyML.IntInf.

signature REAL
structure Real: REAL
structure LargeReal: REAL

Real and LargeReal are the same structure in Poly/ML. They provide functions on type real.

signature MATH
structure Math: MATH

The mathematical functions on type real.

signature IEEE_REAL
structure IEEEReal: IEEE_REAL

Functions to manipulate IEEE real numbers, such as controlling rounding and handling not-a-number.

signature WORD
structure Word8: WORD
structure LargeWord: WORD
structure SysWord: WORD
structure Word32: WORD
structure Word64: WORD

Operations on machine words treated as unsigned quantities. Functions which would overflow simply wrap round. Poly/ML implements Word.word as a 31 bit quantity on 32-bit platforms and a 63 bit quantity on 64-bit platforms. In version 5.5 and earlier LargeWord and SysWord were implemented using a double precision version. From version 5.5.1 they are implemented as 32 and 64-bit versions as Word32 and Word64 respectively. Word64 is only available on 64-bit architectures. SysWord is used in the Windows and Posix structures. Word8.word is an unsigned byte.

signature CHAR
structure Char: CHAR

Operations on values of type char.

signature STRING
structure String: STRING

Operations on values of type string.

signature STRING_CVT
structure StringCvt: STRING_CVT

Additional string functions used primarily when converting between strings and string representations.

signature SUBSTRING
structure Substring: SUBSTRING

Operations on substrings. These are segments of strings defined by a base string, an offset and a length and are designed to allow substrings to be manipulated without the storage overhead of creating the substrings themselves.

signature LIST
signature LIST_PAIR
structure List: LIST
structure ListPair: LIST_PAIR

Functions on lists and lists of pairs.

signature VECTOR
signature ARRAY
structure Vector: VECTOR
structure Array: ARRAY

Polymorphic vector and array.

signature MONO_VECTOR
signature MONO_ARRAY
structure Word8Vector: MONO_VECTOR
structure CharVector: MONO_VECTOR
structure BoolVector: MONO_VECTOR
structure IntVector: MONO_VECTOR
structure RealVector: MONO_VECTOR
structure Word8Array: MONO_ARRAY
structure CharArray: MONO_ARRAY
structure BoolArray: MONO_ARRAY
structure IntArray: MONO_ARRAY
structure RealArray: MONO_ARRAY

Monomorphic vectors and arrays. Generally these are designed to be storage-efficient at the expense of time. CharVector.vector is the same as string so provides vector operations on strings. Word8Vector.vector is used in various places throughout the library as a binary analogue of string. BoolVector and BoolArray use single bits for each value.

signature ARRAY2
structure Array2: ARRAY2
signature MONO_ARRAY2
structure Word8Array2: MONO_ARRAY2
structure CharArray2: MONO_ARRAY2
structure BoolArray2: MONO_ARRAY2
structure IntArray2: MONO_ARRAY2
structure RealArray2: MONO_ARRAY2

Two dimensional arrays.

signature BYTE
structure Byte: BYTE

Provides functions to convert between characters and Word8.word values and between strings and Word8Vector.vector values. In Poly/ML these can generally be implemented as a cast so do not incur any time or space overhead.

signature COMMAND_LINE
structure CommandLine: COMMAND_LINE

Access to the command line and arguments. Does not include arguments taken by the run-time system.

signature TIME
structure Time: TIME

Functions on times. Poly/ML implements this as microseconds since 1st January 1970 in Unix and nanoseconds since 1st January 1601 (FILETIME) in Windows.

signature DATE
structure Date: DATE

Functions on dates including conversions to and from Time.time.

signature TIMER
structure Timer: TIMER

Functions to return CPU time and garbage collection time.

signature PACK_WORD
structure Pack8Big: PACK_WORD
structure Pack8Little: PACK_WORD
structure Pack16Big: PACK_WORD
structure Pack16Little: PACK_WORD
structure Pack32Big: PACK_WORD
structure Pack32Little: PACK_WORD
signature PACK_REAL
structure PackRealBig: PACK_REAL
structure PackRealLittle: PACK_REAL

Operations to pack and unpack integers and reals into byte vectors.

signature IO
structure IO: IO

The IO structure contains types and exceptions used within the other IO structures.

structure TextIO: sig ... end

The TextIO structure is the top level of the IO stack for textual input and output. This is level likely to be used most often. Input and output are side-effecting and, if necessary, characters such as newlines are translated between the ML and operating system codes.

signature TEXT_STREAM_IO
structure TextIO.StreamIO: TEXT_STREAM_IO

This substructure access to a lower level of textual input and output. Output is not significantly different from that of TextIO but input is applicative rather than imperative. In essence this means that input functions return both a value, character or string, and a new stream. Reading from the new stream continues the input, reading from the original stream returns the previous value. This is intended to simplify backtracking in parsing and works particularly well with the scan functions in the library.

signature BIN_IO
structure BinIO: BIN_IO

BinIO is similar to TextIO but for binary input and output. While TextIO works on types char and string, BinIO works on bytes (Word8.word) and byte vectors (Word8Vector.vector). Unlike TextIO binary I/O does not perform any translation of characters.
BinIO.StreamIO: STREAM_IO
Similar to TextIO.StreamIO.

signature PRIM_IO
structure BinPrimIO: PRIM_IO
structure TextPrimIO: PRIM_IO

The primitive I/O functions are the lowest level of the stack. They provide access to the underlying readers and writers.

signature IMPERATIVE_IO
functor ImperativeIO ( ... ): IMPERATIVE_IO
signature STREAM_IO
functor StreamIO ( ... ): STREAM_IO
signature PRIM_IO
functor PrimIO ( ... ): PRIM_IO

These functors can be used to build new stacks to provide input and output on data structures other than characters and bytes.

signature OS
signature OS_FILE_SYS
signature OS_IO
signature OS_PATH
signature OS_PROCESS
structure OS: OS

The OS structure contains a large number of functions for accessing operating system facilities. Most of them are grouped into substructures. OS.FileSys contains functions for examining directories and files. OS.Path operates on file path names. OS.Process provides functions to terminate the current ML program with various results, examine the environment and to run sub-processes. OS.IO provides the ability to poll a set of file descriptors.

signature SOCKET
structure Socket: SOCKET

Operations on sockets, providing access to network facilities from ML. Socket does not actually contain functions to create sockets. Instead these are found in the INetSock, UnixSock and GenericSock structures.

signature INET_SOCK
structure INetSock: INET_SOCK

Creates internet domain sockets and provides functions on internet addresses.

signature UNIX_SOCK
structure UnixSock: UNIX_SOCK

Creates Unix domain (local) sockets. This structure is not provided in the Windows implementation.

signature GENERIC_SOCK
structure GenericSock: GENERIC_SOCK

Can be used to create sockets in any domain supported by the system.

signature NET_HOST_DB
structure NetHostDB: NET_HOST_DB
signature NET_PROT_DB
structure NetProtDB: NET_PROT_DB
signature NET_SERV_DB
structure NetServDB: NET_SERV_DB

Look up names in various tables. NetHostDB looks up an internet address using DNS. NetProtDB looks up a protocol in (on Unix) /etc/protocols. NetServDB looks up a service in (on Unix) /etc/services.

signature UNIX
structure Unix: UNIX

Provides access to Unix-specific functions, such as forking a process. This structure is not provided in the Windows implementation.

signature POSIX
signature POSIX_ERROR
signature POSIX_SIGNAL
signature POSIX_PROCESS
signature POSIX_PROC_ENV
signature POSIX_FILE_SYS
signature POSIX_IO
signature POSIX_SYS_DB
signature POSIX_TTY
structure Posix: POSIX

Provides access to a wide range of Unix system calls. This structure and the signatures are not provided in the Windows implementation.

signature WINDOWS
structure Windows: WINDOWS

Windows-specific functions. This structure is not provided in the Unix implementations.

Poly/ML Extensions

There are a number of extensions to Poly/ML. Most of these are described in greater detail in other documents.

structure Asn1: ASN1
signature ASN1

Operations on ASN1 binary encoding. There are functions to help convert between tree structures and byte vectors. This is experimental.

structure CInterface
signature CInterfaceSig

Provides a foreign-function interface. See the full documentation.

structure HashArray

Provides a hash-table type and operations.

structure PolyML

Contains a large number of operations specific to Poly/ML. See here for full information.

structure Process

This is the original implementation of parallelism in Poly/ML. It has now been reimplemented using the Thread structure. It is provided for backwards compatibility only.

structure RunCall
structure RuntimeCalls

RunCall contains various low-level operations for interface to the run-time system. RuntimeCalls contains symbolic definitions for entry points to the run-time system. These structures are intended only for use in the basis library itself and should not be used in user code unless absolutely necessary. It is very easy to use them in a way that will cause a crash or break the garbage-collector resulting in a failure at some point in the future.

structure Signal
signature SIGNAL

Provides a way of handling Unix-style signals. On Windows this deals only with the interrupt signal, SIGINT. See here for full information.

structure SingleAssignment

Provides references that can only be assigned to once. Once a variable has been assigned a value that is fixed and further attempts to assign a new value result in an exception. The main reason for providing this is that once the value has been assigned it is marked as an immutable cell and this has advantages in efficiency for the garbage collector. Locked cells that contain the same value can be shared with PolyML.shareCommonData. See here for more information.

structure SML90: SML90
signature SML90

Provides backwards compatibility with ML90. This was included in an earlier draft of the Standard Basis Library but was withdrawn before the final release.

structure Thread: THREAD
signature THREAD
structure ThreadLib

The Thread structure provides a way of creating parallel threads and synchronising between them. ThreadLib is an extension library for the Thread structure. See here for full information.

structure Universal
structure UniversalArray

The Universal structure provides support for a universal union type that can contain a value of any type. It is used in various library functions. See here for full information.

structure Weak
signature WEAK

Provides the ability to construct weak references, that is references that can be used to detect when all other pointers to the reference have been removed by the garbage collector. They are intended to allow a program to recover resources when they are no longer reachable. See here for full information.

polyml-5.6/documentation/Reference/PolyMLCodetree.html000066400000000000000000000153041265146633400232010ustar00rootroot00000000000000 The PolyML.Codetree structure

The PolyML.Codetree structure

The CodeTree sub-structure contains functions that construct and operate on the intermediate code structure of the Poly/ML compiler. It is intended for compilers for languages other than Standard ML to target the back-end.

The intermediate code-tree is untyped and almost no checking is performed on it. It is very easy to cause the compiler or garbage-collector to crash and a failure could occur at some random point.

structure CodeTree :
  sig

    type codeBinding
    type codetree
    type machineWord


    val mkConstant: machineWord -> codetree
    val mkLoadArgument: int -> codetree
    val mkLoadClosure: int -> codetree
    val mkLoadLocal: int -> codetree

    val mkEnv: codeBinding list * codetree -> codetree

    val mkFunction: codetree * int * string * codetree list * int -> codetree
    val mkInlineFunction: codetree * int * string * codetree list * int -> codetree
    val mkCall: codetree * codetree list -> codetree

    val mkTuple: codetree list -> codetree
    val mkInd: int * codetree -> codetree

    val mkIf: codetree * codetree * codetree -> codetree

    val mkBeginLoop: codetree * (int * codetree) list -> codetree
    val mkLoop: codetree list -> codetree
    val mkWhile: codetree * codetree -> codetree

    val mkRaise: codetree -> codetree
    val mkHandle: codetree * codetree -> codetree
    val Ldexc: codetree

    val mkDec: int * codetree -> codeBinding
    val mkMutualDecs: (int * codetree) list -> codeBinding
    val mkNullDec: codetree -> codeBinding

    val rtsFunction: int -> codetree

    val pretty: codetree -> pretty

    val genCode: codetree * int -> unit -> codetree
    val evalue: codetree -> machineWord option

    val encodeBinary: codetree -> Word8Vector.vector
    val decodeBinary: Word8Vector.vector -> codetree

    val unsafeMakeFunctor:
       string * NameSpace.signatureVal * NameSpace.signatureVal * codetree -> NameSpace.functorVal
  end
val encodeBinary : codetree -> Word8Vector.vector

This encodes the code-tree as a byte vector. It is intended to allow compiled code to be exported and subsequently imported by decodeBinary. There are a number of restrictions on the code-tree to allow it to be exported, primarily that it is fully self-contained. It is really only suitable for use with the code of a functor.

val decodeBinary : Word8Vector.vector -> codetree

This function imports a code-tree that has been encoded with encodeBinary.

val unsafeMakeFunctor:
       string * NameSpace.signatureVal * NameSpace.signatureVal * codetree -> NameSpace.functorVal

This function can be used to create a functor from code and signature information.

val genCode: codetree * int -> unit -> codetree

The genCode function compiles code and returns a function that, when called, will execute the compiled code. genCode(c, nBindings) takes the codetree c and an integer nBindings which is the number of binding addresses used in the top-level tree, or more specifically at least one more than the maximum binding address used. Binding addresses used within functions are not included in this; they are counted within their respective function. The result is a function of type unit -> codetree which when called executes the code. The result is a codetree. Currently this will always be a Constant node whose value can be extracted by evalue.

val evalue : codetree -> machineWord option

The evalue function extracts the value from a Constant node. If the argument is not a Constant node the result will be NONE.

val pretty: codetree -> pretty

This function formats the code-tree as a pretty data structure. It can then be printed using PolyML.prettyPrint or incorporated into another pretty structure.

val ZZZ: int ref

This function does ZZZ

val ZZZ: int ref

This function does ZZZ

val ZZZ: int ref

This function does ZZZ

polyml-5.6/documentation/Reference/PolyMLCompiler.html000066400000000000000000000772401265146633400232300ustar00rootroot00000000000000 The PolyML.Compiler structure

The PolyML.Compiler structure

The PolyML.Compiler structure contains functions associated with the compiler. For historical reasons it also contains functions and values associated with the Poly/ML top-level. Many of the values are associated with debugging the compiler itself and are not of general usefulness.

structure Compiler :
  sig
    datatype compilerParameters =
        CPOutStream of string->unit
    |   CPNameSpace of PolyML.NameSpace.nameSpace
    |   CPErrorMessageProc of
	            { message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } -> unit
    |   CPLineNo of unit -> int
    |   CPLineOffset of unit -> int
    |   CPFileName of string
	    |   CPPrintInAlphabeticalOrder of bool
    |   CPResultFun of {
            fixes: (string * fixityVal) list, values: (string * valueVal) list,
            structures: (string * structureVal) list, signatures: (string * signatureVal) list,
			 functors: (string * functorVal) list, types: (string * typeVal) list
            } -> unit
	|   CPCompilerResultFun of
	         PolyML.parseTree option *
			 ( unit -> {
			        fixes: (string * fixityVal) list, values: (string * valueVal) list,
					structures: (string * structureVal) list, signatures: (string * signatureVal) list,
					functors: (string * functorVal) list, types: (string * typeVal) list}
            ) option
            -> unit -> unit
	|   CPProfiling of int
	|   CPTiming of bool
	|   CPDebug of bool
	|   CPPrintDepth of unit->int
	|   CPPrintStream of string->unit
	|   CPErrorDepth of int
	|   CPLineLength of int
	|   CPRootTree of
	     {
		    parent: (unit -> PolyML.parseTree) option,
			next: (unit -> PolyML.parseTree) option,
			previous: (unit -> PolyML.parseTree) option
		 }
	|   CPAllocationProfiling of int
	|   CPDebuggerFunction of int * valueVal * int * string * string * nameSpace -> unit

    val compilerVersion : string
    val compilerVersionNumber : int

    val printDepth : int ref
    val errorDepth : int ref
    val lineLength : int ref

    val printInAlphabeticalOrder : bool ref

    val prompt1: string ref
    val prompt2: string ref

    val reportExhaustiveHandlers: bool ref
    val reportUnreferencedIds: bool ref

    val debug: bool ref
    val timing: bool ref
    val profiling: int ref
    val allocationProfiling: int ref

    val lowlevelOptimise: bool ref
    val inlineFunctors: bool ref
    val createPrintFunctions: bool ref
    val maxInlineSize: int ref
    val narrowOverloadFlexRecord: bool ref
    val traceCompiler: bool ref

    val parsetree: bool ref
    val codetree: bool ref
    val codetreeAfterOpt: bool ref
    val assemblyCode: bool ref
    val pstackTrace: bool ref

    val fixityNames : unit -> string list
    val functorNames : unit -> string list
    val signatureNames: unit -> string list
    val structureNames: unit -> string list
    val typeNames: unit -> string list
    val valueNames: unit -> string list

    val forgetFixity : string -> unit
    val forgetFunctor : string -> unit
    val forgetSignature : string -> unit
    val forgetStructure : string -> unit
    val forgetType : string -> unit
    val forgetValue : string -> unit
  end
datatype compilerParameters

The compilerParameters datatype is used to construct a list of options for the PolyML.compiler function. These options control various aspects of the compilation. The options are arranged so that only those options that are actually required need to be included. If the option is not included in the list the compiler uses a default value. In each case the default value is listed.

CPOutStream of string->unit

Provide an output stream for output from the compiler. It is also used for printing the results unless CPPrintStream is provided. Default use TextIO.print to print to TextIO.stdOut.

CPNameSpace of PolyML.NameSpace.nameSpace

Name space to look up and enter results. Identifiers not defined locally within the code are looked up in this name space. When the compiled code is executed the results are added to this name space by calling the appropriate enter function. Default: PolyML.globalNameSpace

CPErrorMessageProc of
{ message: PolyML.pretty, hard: bool, location: PolyML.location, context: PolyML.pretty option } -> unit

Called by the compiler to generate error and warning messages. message is the message as a pretty-print data structure. isHard indicates whether this is a fatal error or a warning; it is true if this is an error, false if a warning. location is the file-name, line number and position. context is an optional extra piece of information showing the part of the parse tree where the error was detected if that is appropriate. Default: print a message to the stream provided by th CPOutStream option or TextIO.stdOut if that is not provided.

CPLineNo of unit -> int
  CPLineOffset of unit -> int
  CPFileName of string

CPLineNo, CPLineOffset and CPFileName can be used to provide information that go to form values of the location type. These values appear in many different situations when the compiler is reporting information; examples include error messages, the debugger and parse-trees. The compiler itself makes no interpretation of the values, simply recording the information and associating it with the start and end of lexical and parsed items. This allows user code that calls compiler to make its own interpretation. However, various ML functions, such as use and make and the interactive debugger, assume that CPFileName is the name of the source file and CPLineNo the number of the line. CPFileName is fixed for a particular call to compiler whereas the compiler calls CPLineNo and CPLineOffset for each lexical item. The default values are the empty string for CPFileName and functions that return zero for CPLineNo and CPLineOffset.

CPPrintInAlphabeticalOrder of bool

This controls whether the default result function should sort the results by alphabetical order before printing them. If an alternative result function has been set using CPResultFun or CPCompilerResultFun this option is ignored. Default: value of printInAlphabeticalOrder.

CPResultFun of {
fixes: (string * fixityVal) list, values: (string * valueVal) list,
structures: (string * structureVal) list, signatures: (string * signatureVal) list,
functors: (string * functorVal) list, types: (string * typeVal) list} -> unit

Provides a function to be included in the resulting code of the compiler to apply to the results of bindings. It is only called when the top-level code has been executed and has not raised an exception. Default: print and enter the values into the name-space provided by CPNameSpace or PolyML.globalNameSpace.

CPCompilerResultFun of
PolyML.parseTree option *
( unit -> {
fixes: (string * fixityVal) list, values: (string * valueVal) list,
structures: (string * structureVal) list, signatures: (string * signatureVal) list,
functors: (string * functorVal) list, types: (string * typeVal) list}) option -> unit -> unit

Function to process the result of compilation. This can be used to capture the parse tree even if type-checking fails. Default: Execute the code and call the result function if the compilation succeeds. Raise an exception if the compilation failed.

CPProfiling of int

Control profiling. 0 is no profiling, 1 is time etc. Default is value of PolyML.profiling.

CPTiming of bool

Control whether the compiler should time various phases of the compilation and also the run time. Default : Get the current value of timing i.e. the value set by PolyML.timing.

CPDebug of bool

Control whether calls to the debugger should be inserted into the compiled code. This allows breakpoints to be set, values to be examined and printed
and functions to be traced at the cost of a significant run-time overhead. Default: value of debug.

CPPrintDepth of unit->int

This controls the depth of printing if the default CPResultFun is used. It is also bound into any use of PolyML.print in the compiled code and will
be called to get the print depth whenever that code is executed. Default: Get the current value of printDepth i.e. the value set by PolyML.print_depth.

CPPrintStream of string->unit

This is bound into any occurrence of PolyML.print and is used to produce the outut. Default: the value of CPOutStream or TextIO.print if it is not provided.

CPErrorDepth of int

Controls the depth of context to produce in error messages. Default : Get the current value of errorDepth i.e. the value set by PolyML.error_depth.

CPLineLength of int

Bound into any occurrences of PolyML.print. This is the length of a line used in the pretty printer. Default: Get the current value of lineLength i.e. the value set by PolyML.line_length.

CPRootTree of
{
parent: (unit -> PolyML.parseTree) option,
next: (unit -> PolyML.parseTree) option,
previous: (unit -> PolyML.parseTree) option
}

This can be used to provide a parent for parse trees created by the compiler. This appears as a PTparent property in the tree. The default is NONE which does not to provide a parent.

CPAllocationProfiling of int

Controls whether to add profiling information to each allocation. Currently zero means no profiling and one means add the allocating function.

CPDebuggerFunction of int * valueVal * int * string * string * nameSpace -> unit

This is no longer used and is just left for backwards compatibility.

val printDepth : int ref

printDepth controls the depth of output to produce when printing output either in the result or in PolyML.print. Its value is also set by PolyML.print_depth.

val errorDepth : int ref

errorDepth controls the depth of output to produce when printing error messages. Its value is also set by PolyML.error_depth.

val lineLength : int ref

lineLength controls the length of a line when printing output either in the result or in PolyML.print. Its value is also set by PolyML.line_length.

val parsetree: bool ref
val codetree: bool ref
val codetreeAfterOpt: bool ref
val assemblyCode: bool ref
val pstackTrace: bool ref

These switches control whether the compiler should produce debugging output. The default is false for each. parsetree controls printing of the parsed ML source, codetree controls printing of the intermediate code, codetreeAfterOpt controls printing that code after the optimiser, assemblyCode controls printing the low-level machine code and pstackTrace the printing of the low-level pseudo-stack.

val compilerVersion: string
val compilerVersionNumber: int

compilerVersion and compilerVersionNumber contain information about the version of the compiler. For version 5.5.2 these contain "5.5.2 Release" and 552 respectively.

val prompt1: string ref
val prompt2: string ref

prompt1 and prompt2 contain the prompts for input used by the default Poly/ML top-level read-eval-print loop, PolyML.shell. prompt1 contains "> " and prompt2 contains "# " by default. They are included in the Compiler structure for historical reasons.

val reportExhaustiveHandlers: bool ref

The Poly/ML compiler produce a warning message if it is given a pattern match sequence which is not exhaustive, that is there are values that are not matched by any of the patterns. This warning message is not produced in the case of a handler where unhandled values are simply reraised.

There are circumstances where it is important that certain exceptions must not be caught, or if they are caught the handler must be reraise them in order to ensure that they return control to the outer level. This reference controls whether the compiler should produce a warning if an exception handler matches all exceptions rather than only specific exceptions. It may also be helpful to check for the situation where an exception handler is intended to match a single exception but because the exception identifier has been mistyped it is treated as a variable matching all exceptions. It defaults to false.

val reportUnreferencedIds: bool ref

This reference controls whether the compiler should produce a warning for identifiers that are declared but never used. Currently it is restricted to value bindings. It defaults to false.

val printInAlphabeticalOrder: bool ref

This reference controls whether the default result function for the compiler should sort the bindings being produced into alphabetical order. It provides the default value if the CPPrintInAlphabeticalOrder is not provided. It defaults to true.

val lowlevelOptimise: bool ref

This reference controls whether the compiler should perform low-level optimisations. This defaults to true and should not normally need to be changed.

val inlineFunctors: bool ref

This reference controls whether the compiler should treat ML functors as inline functions. All type checking is performed when the functor is declared but code-generation is deferred until the functor is applied to its argument structures. This defaults to true and should not normally need to be changed.

val createPrintFunctions: bool ref

This reference controls whether the compiler should generate default print functions for datatypes. This defaults to true.

val maxInlineSize: int ref

This reference controls how the compiler chooses to implement functions. If a function is small it is treated as an inline function and its code is expanded wherever it is used. If it is large it is compiled into a separate function and a call is made to it when it is used. Certain functions, such as recursive functions that are not tail-recursive or functions that are being passed as arguments or returned as results, cannot be treated as inline. The value represents the maximum size of a small function in some notional size units. It defaults to 80. Increasing the value will make the compiler treat more functions as inline.

val narrowOverloadFlexRecord: bool ref

This reference controls the way the Poly/ML compiler treats flexible records, i.e. record patterns containing "...", and overloading. The ML Definition says that these are resolved by the context but does not define exactly what that context should be, allowing different compilers to interpret this differently. With this reference set to false, the default, the Poly/ML compiler uses the whole of the topdec as the context to find a suitable fixed record type or to find the type of an overloaded function. When it is set to true the compiler uses the immediate val or fun binding as the context. The effect of this is that it may produce an error message unless appropriate type constraints have been included. However, that may ensure that the code is portable to compilers which take a more restrictive view than Poly/ML.

val traceCompiler: bool ref

This reference controls whether the compiler should produce an exception trace if an exception occurs within the compiler. This defaults to false.

val fixityNames : unit -> string list
val functorNames : unit -> string list
val signatureNames: unit -> string list
val structureNames: unit -> string list
val typeNames: unit -> string list
val valueNames: unit -> string list

These functions return the appropriate list from PolyML.globalNameSpace. They can all be written in terms of functions in the NameSpace structure and are included in the Compiler structure for backwards compatibility only.

val forgetFixity: string -> unit
val forgetFunctor: string -> unit
val forgetSignature: string -> unit
val forgetStructure: string -> unit
val forgetType: string -> unit
val forgetValue: string -> unit

These functions delete entries from PolyML.globalNameSpace. They are included in the Compiler structure for historical reasons.

val debug: bool ref

This reference controls whether debugging information is included in the compiled code. The value of this reference is used unless the CPDebug option is provided. Setting this to true increases the run-time by many factors.

val timing: bool ref

Setting this reference to true causes the compiler to include timing information in the output after each topdec. The timing information includes information about various passes of the compiler and also the execution time of the topdec. It is used unless the CPTiming option is included. Its value is also set by the PolyML.timing function.

val profiling: int ref

If this reference is set to a non-zero value the compiler will switch on profiling during execution of the compiled code. Exactly what is profiled is controlled by the argument. It is used unless the CPProfiling option is included. Its value is also set by the PolyML.profiling function.

val allocationProfiling: int ref

This reference controls whether the compiler should add profiling information to track the allocation of memory. . It is used unless the CPAllocationProfiling option is included.

polyml-5.6/documentation/Reference/PolyMLDebug.html000066400000000000000000000030111265146633400224650ustar00rootroot00000000000000 The PolyML.Debug structure

The PolyML.Debug structure

The PolyML.Debug structure contains functions to assist with debugging. For a tutorial see here.

structure Debug :
  sig
    val breakAt : string * int -> unit
    val breakEx : exn -> unit
    val breakIn : string -> unit
    val clearAt : string * int -> unit
    val clearEx : exn -> unit
    val clearIn : string -> unit
    val continue : unit -> unit
    val continueWithEx : exn -> unit
    val down : unit -> unit
    val dump : unit -> unit
    val stack : unit -> unit
    val step : unit -> unit
    val stepOut : unit -> unit
    val stepOver : unit -> unit
    val trace : bool -> unit
    val up : unit -> unit
    val variables : unit -> unit
  end

 

polyml-5.6/documentation/Reference/PolyMLDebuggerInterface.html000066400000000000000000000225511265146633400250160ustar00rootroot00000000000000 The PolyML.DebuggerInterface structure

The PolyML.DebuggerInterface structure

The PolyML.DebuggerInterface structure provides a programmatic interface to assist with debugging programs. It is intended for use by applications that replace the default Poly/ML top-level. Most users will not need to use this and for most purposes the functions in PolyML.Debug will be more appropriate.

structure DebuggerInterface:
  sig
     val setOnEntry: (string * location -> unit) option -> unit
     val setOnExit: (string * location -> unit) option -> unit
     val setOnExitException: (string * location -> exn -> unit) option -> unit
     val setOnBreakPoint: (location * bool ref -> unit) option -> unit

     type debugState
     val debugState: Thread.Thread.thread -> debugState list
     val debugFunction: debugState -> string
     val debugFunctionArg: debugState -> PolyML.NameSpace.valueVal
     val debugFunctionResult: debugState -> PolyML.NameSpace.valueVal
     val debugLocation: debugState -> location
     val debugNameSpace: debugState -> nameSpace
  end

The Poly/ML compiler will add debugging information to a program if PolyML.Compiler.debug is set to true or CPDebug true is included among the options. By default, these options are turned off because using them greatly reduces the speed of the code and in particular optimisations such as tail-recursion are disabled. When debugging is enabled the compiler adds code to allow the debugger to be entered at various points and for the debugger then to extract information about the state of the program being debugged, the debuggee.

There are four global references that can be set by the debugger. Each of them holds an optional function and the code being debugged tests these references at various points in the program and calls the function if it is set.

val setOnEntry: (string * location -> unit) option -> unit

The function set with setOnEntry is called at the start of every function. This function is called with the name of the function and its location. It is called after the argument information has been added to the debug state but before anything else.

val setOnExit: (string * location -> unit) option -> unit

The function set with setOnExit is called at the end of every function if it returns a result. This function is called with the name of the function and its location. It is called after the function result has been added to the debug state.

val setOnExitException: (string * location -> exn -> unit) option -> unit

The function set with setOnExitException is called at the end of every function if it is returning by raising an exception. This function is called with the name of the function and its location and with the exception packet being returned.

val setOnBreakPoint: (location * bool ref -> unit) option -> unit

The function set with setOnBreakPoint is called at various break-points within the function. Currently the compiler inserts break-points at the beginning of the expression in a match, i.e. after the pattern has been discriminated and any variable bindings have been made; after each value declaration; after each expression separated by semicolons in let-expressions or parenthesised sequence of expressions; at the beginning of the then- and else-parts of an if-then-else and at the start of the body of a while-expression.

The function is called with two arguments: the location of the break-point and a break-point identifier, a boolean reference. Break-point identifiers are intended for use with an IDE that is capable of examining the parse-tree. A node in the parse-tree with a break-point associated with it will contain a PTbreakPoint property. All break-point identifiers are initially false. To set a break-point at a particular node the IDE should set the reference to true and install a break-point function that calls the debugger when it is passed a reference that is true.

All functions are called by the thread that is running the program being debugged. All the functions return unit and if they return normally the program will continue as before. It is possible for the function to raise an exception in which case this exception will be raised in place of any existing exception. This can sometimes be useful to terminate the program. Installing any function will add an overhead to the running program. It is better to set a function option to NONE if it is not actually required.

When debugging is enabled the running program maintains information about local variables that can be examined when the program has stopped by calling in to the debugger.

type debugState
val debugState: Thread.Thread.thread -> debugState list

The stack of a debuggable thread can be extracted using the debugState function. This should either be called by the thread itself or by the debugger after the thread has been paused with a condition variable. Extracting the debugging state of another thread while the thread is running will lead to unpredictable results.

val debugFunction: debugState -> string
val debugFunctionArg: debugState -> PolyML.NameSpace.valueVal
val debugFunctionResult: debugState -> PolyML.NameSpace.valueVal

Each node in the state list normally represents a function. These return the name of the function, its argument and its result. The result is only available in an exit function.

val debugLocation: debugState -> location

This function returns the location associated with a node in the list. This will either be the location of the break-point or where the function has called the next function in the list.

val debugNameSpace: debugState -> nameSpace

Access to the local variables can be obtained through the name-space. A name-space is a record of functions that can be used to look up variables and list the variables. In the general case it can also be used to add variables to the name space but that is not appropriate here and the enter functions all raise an exception. The name space can be used directly to print the values of variables using functions from PolyML.NameSpace. Alternatively the name-space can be used with the Poly/ML compiler to provide an interactive top-level in which the user can enter expressions to be evaluated with local variables as though they had been declared at the top-level. When paused at a break-point it is possible to evaluate local functions as though they were global. Any changes to local reference values will affect the program state when the program resumes.

Currently, the name space contains all the variables that were in scope at the break-point, both those local to the function itself and free variables declared in outer scopes. It excludes any variables that were declared in the outer top-level scope.

polyml-5.6/documentation/Reference/PolyMLException.html000066400000000000000000000054011265146633400234020ustar00rootroot00000000000000 The PolyML.Exception structure

The PolyML.Exception structure

The Exception sub-structure contains functions that assist in tracing exceptions.

structure Exception :
sig
    val exceptionLocation : exn -> location option
    val raiseWithLocation : exn * location -> 'a
    val reraise : exn -> 'a

    val traceException : (unit -> 'a) * (string list * exn -> 'a) -> 'a
	 val exception_trace : (unit -> 'a) -> 'a
end

Exception packets in Poly/ML normally contain information about the location, typically the file name and line number, where the exception was raised. The exceptionLocation function extracts this information if it is available. raiseWithLocation can be used to provide an explicit location and override the default. reraise is written in terms of exceptionLocation and raiseWithLocation. It is typically used where a function needs to catch an exception and wishes to raise it again after doing some clean-up. Using the raise instruction of ML would set the location to be the clean-up code whereas reraise will retain the original location.

exception_trace and traceException can be used to produce information about the stack when an exception is raised. They both take an argument that is a function to be executed and if an exception is raised within the function that is not caught they produce information from the stack. exception_trace prints this to standard-output whereas traceException uses the second argument, a function, and calls that with the list of function names and the exception packet. Note that if the function being traced handles any exceptions the trace will only show the stack from that point down.

 

polyml-5.6/documentation/Reference/PolyMLMake.html000066400000000000000000000150501265146633400223220ustar00rootroot00000000000000 The Poly/ML Make System

The Poly/ML Make System

Introduction

PolyML.make is a function to help maintain consistency of programs made up of several modules. PolyML.make works on modules (files containing functors, structures and signatures) and tries to ensure that a module is consistent with respect to the modules it uses.

The Poly/ML compiler has two modes of operation: normal mode and 'make' mode. When the compiler is operating in 'make' mode and it encounters the name of a functor, structure or signature, it determines whether it is necessary to remake that object from its source code.

The make system assumes that source code for functors, structures and signatures is kept in files whose names resemble those of the objects. The variable PolyML.Compiler.suffixes contains the list of filename suffixes recognised by the make system, in the order that the system tries them. The default list is ["", ".ML", ".sml"].

For example, if the object is called 'name', the system first tries to find a file called name, then tries name.ML, and finally tries name.sml if neither of the other files exists. Alternatively, 'name' may be a directory containing a file called 'ml_bind.ML'. If the make system fails to find any matching file then it assumes the object is pervasive and will use the existing version of it.

Example

For example, suppose we have a system in which the structure Sort is created by applying the functor SORT to the structures Combinator and List and that Combinator is itself created by applying the functor COMBINATOR to the structure List.

To use the make system, we would create a directory Sort with subdirectory Sort/Combinator and the following files:

File Contents
Sort/List.ML Code for structure List
Sort/Combinator/COMBINATOR.ML Code for functor COMBINATOR
Sort/Combinator/ml_bind.ML Code to create Combinator
Sort/SORT.ML Code for functor SORT
Sort/ml_bind.ML Code to create Sort

These files should have the following format:

Sort/List.ML

structure List =
struct (* body of List *) end;

Sort/Combinator/COMBINATOR.ML

signature LSIG =
sig (* body of LSIG, as used by COMBINATOR *) end;

functor COMBINATOR(structure L : LSIG) =
struct (* body of COMBINATOR *) end;

Sort/Combinator/ml_bind.ML

structure Combinator =
COMBINATOR(structure L = List);

Sort/SORT.ML

signature CSIG =
sig (* body of CSIG *) end;

signature LSIG =
sig (* body of LSIG, as used by SORT *) end;

functor SORT (structure C : CSIG structure L : LSIG) =
struct
(* body of SORT *)
end;

Sort/ml_bind.ML

polyml-5.6/documentation/Reference/PolyMLNameSpace.html000066400000000000000000000204651265146633400233070ustar00rootroot00000000000000 The PolyML.NameSpace structure

The PolyML.NameSpace structure

The PolyML.NameSpace structure contains functions associated with a name-space, a collection of values, types, structures, functors, signatures and infix settings. It is used primarily in connection with the compiler.

In the Standard ML language there are separate classes of identifiers for values, type constructors, structures, signatures and functors. In addition infix status is essentially another identifier class since infix status and priority can be set for an identifier whether or not there is actually a function with that name. Value identifiers include datatype and exception constructors as well as identifiers bound with val or fun bindings. Name-spaces are ways of holding and managing collections of identifiers. Nothing in the NameSpace structure assumes a particular implementation of a name-space; it is more of an interface than an implementation.

structure NameSpace:
    sig
    type typeVal
    type valueVal
    type fixityVal
    type functorVal
    type signatureVal
    type structureVal

    val displayVal: valueVal * int * nameSpace -> pretty
    val displayType: typeVal * int * nameSpace -> pretty
    val displayFix: string * fixityVal -> pretty
    val displayFunct: functorVal * int * nameSpace -> pretty
    val displaySig: signatureVal * int * nameSpace -> pretty
    val displayStruct: structureVal * int * nameSpace -> pretty

    val codeForFunct: functorVal -> CodeTree.codetree
    val codeForStruct: structureVal -> CodeTree.codetree
    val codeForValue: valueVal -> CodeTree.codetree

    type nameSpace =
       {allFix: unit -> (string * fixityVal) list,
       allFunct: unit -> (string * functorVal) list,
       allSig: unit -> (string * signatureVal) list,
       allStruct: unit -> (string * structureVal) list,
       allType: unit -> (string * typeVal) list,
       allVal: unit -> (string * valueVal) list,
       enterFix: string * fixityVal -> unit,
       enterFunct: string * functorVal -> unit,
       enterSig: string * signatureVal -> unit,
       enterStruct: string * structureVal -> unit,
       enterType: string * typeVal -> unit,
       enterVal: string * valueVal -> unit,
       lookupFix: string -> fixityVal option,
       lookupFunct: string -> functorVal option,
       lookupSig: string -> signatureVal option,
       lookupStruct: string -> structureVal option,
       lookupType: string -> typeVal option,
       lookupVal: string -> valueVal option}


    type typeExpression
    val displayTypeExpression: typeExpression * int * nameSpace -> pretty
    end

val globalNameSpace: nameSpace
type nameSpace =
    {
        allFix: unit -> (string * fixityVal) list,
        allFunct: unit -> (string * functorVal) list,
        allSig: unit -> (string * signatureVal) list,
        allStruct: unit -> (string * structureVal) list,
        allType: unit -> (string * typeVal) list,
        allVal: unit -> (string * valueVal) list,

        enterFix: string * fixityVal -> unit,
        enterFunct: string * functorVal -> unit,
        enterSig: string * signatureVal -> unit,
        enterStruct: string * structureVal -> unit,
        enterType: string * typeVal -> unit,
        enterVal: string * valueVal -> unit,

        lookupFix: string -> fixityVal option,
        lookupFunct: string -> functorVal option,
        lookupSig: string -> signatureVal option,
        lookupStruct: string -> structureVal option,
        lookupType: string -> typeVal option,
        lookupVal: string -> valueVal option
    }

The nameSpace type is a record of functions. For each class of identifier there is a lookup function that takes a string and returns an option type, an enter function that takes a string name and adds a values to the table and an "all" function that returns a list of all the identifiers of that class. It is important to note that the nameSpace type does not imply any particular implementation, it is simply an interface. Typically, it will be implemented in terms of one or more hash-tables but it is perfectly possible to implement something more complex. For example, PolyML.make, is implemented by passing to the compiler a name-space that has a side-effect of checking, and if necessary recompiling, a file when called to look-up a structure, functor or signature.

val globalNameSpace: nameSpace

globalNameSpace is the default name-space. The interactive top-level, the use function and PolyML.make, all use this.

type valueVal
type typeVal
type fixityVal
type functorVal
type signatureVal
type structureVal
Values of these types are the data structures used to represent the different kind of identifiers. Values of type valueVal are used to hold information about value identifiers, typeVal is used for type constructors, fixityVal for infix status, functorVal for functors, signatureVal for signatures and structureVal for structures. There are no constructors available to create values of these types; the only way these value can be created is by compiling ML source code.
type typeExpression

typeExpression is used to represent the type of a value. This is not really part of a name-space but is included here, along with displayTypeExpression as a convenience. Values of this type are returned as PTtype nodes in the parse-tree.

val displayVal: valueVal * int * nameSpace -> pretty

The displayVal function returns a text representation of the value as a pretty structure. The structure returned is similar to way values are printed at the top level and include both their value and their type. The int argument controls the depth when printing complex values. The nameSpace argument is used to assist in displaying appropriate type constructors in the type.

polyml-5.6/documentation/Reference/PolyMLSaveState.html000066400000000000000000000167371265146633400233610ustar00rootroot00000000000000 The PolyML.SaveState structure

PolyML.SaveState structure

The PolyML.SaveState structure provides a way for a program to save changes without the expense of exporting and building a new executable. Unlike the PolyML.export function which saves the complete state it is possible with the functions in this structure to save just the modifications. In addition it avoids the need for a linker which is needed to turn an exported object file into an executable. Because only the modifications are saved a saved state can only be loaded into the executable that created it.

structure SaveState:
sig
    val saveState : string -> unit
    val loadState : string -> unit
    val saveChild : string * int -> unit
    val renameParent : {child: string, newParent: string} -> unit
    val showHierarchy : unit -> string list
    val showParent : string -> string option
end

Simple Saved State

For many purposes the simple saved state is sufficient. This is created with saveState and loaded with loadState.

val saveState : string -> unit
Saves the current state to a file whose name is given as the argument. It saves the current values of all the mutable data (i.e. refs and arrays) that were present in the executable together with any other data that is now reachable from it
val loadState : string -> unit

Loads a saved state file. This overwrites any changes made before the load with the contents of the load file. It does not affect mutables created since the session began nor does it affect function arguments or local variables.

Hierarchical Saved States

The single level saved state created by saveState contains all the data that is accessible by the program apart from immutable data present in the executable. Hierarchical saved states extend this idea by allowing a program to save only the data that is not present in a previously loaded state. Saving a state that contains only the new data creates a "child" of the existing saved state which is the "parent". When the child is loaded in a new session the parent must also be loaded in order to provide the full state. Since the parent may itself be a child of another saved state this forms a chain of related saved states. A particular parent may have several children depending on it. When loadState is called with a file name that refers to a child saved state it automatically loads the parents using information held in each file.

The run-time system retains information about the last file that was loaded or saved and its parents. The information is updated whenever loadState, saveState or saveChild are called.

val showHierarchy : unit -> string list

Returns a list of the file names in the current hierarchy. The first item in the list is the top-most saved state, the next is the immediate child of that state and so on. The last item will be the file name that was actually given as argument to loadState, saveState or saveChild.

val saveChild : string * int -> unit

saveChild (f, n) writes out a saved state to file name f at hierarchy level n. n may be between zero and the current hierarchy level, inclusive. saveState(f) is equivalent to saveChild(f, 0). Typically, saveChild will be called with a new file name and a value for n which is the length of the current hierarchy list. This will make a new child which contains only the information added since the last call to loadState, saveState or saveChild. However, it is possible to use a different value and this will cause the saved state to include data from other saved states of the same or deeper hierarchy.

val renameParent : {child: string, newParent: string} -> unit
val showParent : string -> string option

A child saved state contains the file name of its parent so that when the child is loaded the parent can be loaded automatically. If the parent file is moved for any reason renameParent can be used to modify the parent file name held in a child so that it can be loaded from the new location. showParent returns the current value of the parent file name for a child saved state. If the saved state has no parent showParent returns NONE.

Comparison with the Persistent Store

The persistent store of earlier versions of Poly/ML was similar to this in that the commit function saved only the changes back to the database. There was also a make_database function that created a child database that contained only the changes from the parent. There are a number of differences. A saved state is read and written as a whole and is not locked once it has been read. As a rough equivalent commit and make_database can be written as

fun commit() =
    let val h = PolyML.SaveState.showHierarchy()
    in saveChild(List.last h, length h - 1) end
and make_database f =
    let val h = PolyML.SaveState.showHierarchy()
    in saveChild(f, length h) end

The definition of commit assumes that a saved state has already been loaded and will fail if it has not.

polyml-5.6/documentation/Reference/PolyMLStatistics.html000066400000000000000000000102661265146633400236030ustar00rootroot00000000000000 The PolyML.Statistics structure

PolyML.Statistics structure

The PolyML.Statistics structure provides a way for a program to read information about the run-time system. As well as getting information about the local Poly/ML process it is also possible to get information about another Poly/ML process being run by the same user.

structure Statistics:
  sig
    val getLocalStats : unit ->
       {sizeHeap: int,
       gcFullGCs: int,
       timeGCUser: Time.time,
       threadsInML: int,
       gcPartialGCs: int,
       threadsTotal: int,
       timeGCSystem: Time.time,
       userCounters: int vector,
       threadsWaitIO: int,
       timeNonGCUser: Time.time,
       sizeAllocation: int,
       timeNonGCSystem: Time.time,
       threadsWaitMutex: int,
       threadsWaitSignal: int,
       sizeAllocationFree: int,
       sizeHeapFreeLastGC: int,
       threadsWaitCondVar: int,
       sizeHeapFreeLastFullGC: int}

    val getRemoteStats : int ->
       {sizeHeap: int,
       gcFullGCs: int,
       timeGCUser: Time.time,
       threadsInML: int,
       gcPartialGCs: int,
       threadsTotal: int,
       timeGCSystem: Time.time,
       userCounters: int vector,
       threadsWaitIO: int,
       timeNonGCUser: Time.time,
       sizeAllocation: int,
       timeNonGCSystem: Time.time,
       threadsWaitMutex: int,
       threadsWaitSignal: int,
       sizeAllocationFree: int,
       sizeHeapFreeLastGC: int,
       threadsWaitCondVar: int,
       sizeHeapFreeLastFullGC: int}

    val setUserCounter : int * int -> unit
    val numUserCounters : unit -> int
end

There are two functions that return information..

val getLocalStats : unit -> { ... }
Returns information about the Poly/ML process that has called this function.
val getRemoteStats : int -> { ... }

Returns information about another Poly/ML process. The argument is the process id (pid) of the Poly/ML process for which information is requested. Raises the Fail exception if this is not a currently running Poly/ML process or the calling user does not have permission to read the statistics. The statistics are held in shared memory and on Unix systems these are memory-mapped files in the user's .polyml directory.

The actual information returned is still being determined and may well change.

In addition to information about the run-time system the statistics mechanism provides a small array of values that can be set by the ML code. This allows an ML program to set values that can be read in another process.

val numUserCounters : unit -> int

Returns the number of counters available. Currently this is eight.

val setUserCounter : int * int -> unit

setUserCounter(n, m) stores the value m in the n-th counter.

Writing to the counters is potentially an expensive operation. If the information is likely to change rapidly it will usually be best to use a separate thread to poll the information periodically and update the counter.

polyml-5.6/documentation/Reference/PolyMLStructure.html000066400000000000000000001303551265146633400234530ustar00rootroot00000000000000 The PolyML structure

The PolyML structure

Generally, the basis library of Poly/ML follows the ML standard libraries. With a few exceptions the extensions are all contained in the PolyML structure. There are a number of sub-structures that are documented separately.

structure PolyML:
sig
   type location =
       {file: string, startLine: int, endLine: int, startPosition: int, endPosition: int}

   structure CodeTree : sig ... end

   structure Compiler : sig ... end 

   val compiler: (unit -> char option) * Compiler.compilerParameters list -> unit -> unit

   structure Debug : sig ... end

   structure DebuggerInterface : sig ... end

   structure Exception : sig ... end
   val exceptionLocation: exn -> location option
   val raiseWithLocation : exn * location -> 'a
   val exception_trace: (unit -> 'a) -> 'a

   structure NameSpace : sig ... end
   val globalNameSpace: NameSpace.nameSpace

   structure SaveState : sig ... end

   structure Statistics : sig ... end

   structure IDEInterface :
   sig
      val parseTree : (string * (location * ptProperties list) list) ref
      val runIDEProtocol : unit -> unit
   end

   structure IntInf:
   sig
      val gcd : int * int -> int
      val lcm : int * int -> int
   end

   val export: string * (unit -> unit) -> unit
   val exportPortable: string * (unit -> unit) -> unit
   val shareCommonData : 'a -> unit

   val onEntry : (unit -> unit) -> unit

   val architecture : unit -> string
   val rtsArgumentHelp : unit -> string
   val rtsVersion : unit -> int

   val make: string -> unit
   val use : string -> unit
   val suffixes = ref ["", ".ML", ".sml"]: string list ref

   val objSize: 'a -> int
   val showSize : 'a -> int
   val objProfile : 'a -> int

   datatype ptProperties =
       PTbreakPoint of bool ref
   |   PTcompletions of string list
   |   PTdeclaredAt of location
   |   PTfirstChild of unit -> parseTree
   |   PTnextSibling of unit -> parseTree
   |   PTopenedAt of location
   |   PTparent of unit -> parseTree
   |   PTpreviousSibling of unit -> parseTree
   |   PTprint of int -> pretty
   |   PTreferences of bool * location list
   |   PTstructureAt of location
   |   PTtype of typeExpression

   type parseTree = location * ptProperties list

   datatype context =
       ContextLocation of location
   |   ContextProperty of string * string

   datatype pretty =
       PrettyBlock of int * bool * context list * pretty list
   |   PrettyBreak of int * int
   |   PrettyLineBreak
   |   PrettyString of string
   |   PrettyStringWithWidth of string * int

   val prettyPrint : (string -> unit) * int -> pretty -> unit
   val prettyMarkup :
       (context list -> unit) * (context list -> unit) ->
       (string -> unit) * int -> pretty -> unit
   val prettyPrintWithIDEMarkup : (string -> unit) * int -> pretty -> unit

   val addPrettyPrinter : (int -> 'a -> 'b -> pretty) -> unit

   val install_pp :
       ((string -> unit) * (int * bool -> unit) * (int * int -> unit) *
       (unit -> unit) -> int -> 'a -> 'b -> unit) -> unit

   val prettyRepresentation : 'a * int -> pretty

   val print: 'a -> 'a
   val makestring: 'a -> string
   val print_depth: int -> unit
   val error_depth: int -> unit
   val line_length: int -> unit

   val rootFunction : unit -> unit
   val shell : unit -> unit

   val sourceLocation : unit -> location

   val fullGC : unit -> unit
   val pointerEq : 'a * 'a -> bool
   val stackTrace : unit -> unit

   val profiling : int -> unit
   val timing : bool -> unit
end

The PolyML structure contains a large collection of functions, structures and types that are specific to Poly/ML.

val compiler: (unit -> char option) * Compiler.compilerParameters list -> unit -> unit

The PolyML.compiler function provides direct access to the compiler for Poly/ML. It is used by all the functions, such as use, shell and make that compile Standard ML source code into executable code.

compiler(instream, parms) takes an input stream, instream, and a set of optional parameters, parms, of type Compiler.compilerParameters. The input stream is called whenever the compiler wants to read the next character from the input. If it returns NONE the compiler assumes that it has reached an end-of-stream and does not read further. Otherwise the compiler stops when it has parsed a valid topdec, generally a declaration or expression with a final semicolon. The parameters, parms, provide a set of options to the compiler. There are default values for these options so it is possible to provide an empty list. The parameters, their meanings and the default values are listed under Compiler.compilerParameters.

If an error is detected compiler raises the Fail exception, otherwise the result of the compilation is a function of type unit->unit. This function represents the compiled code and calling this function executes the code. At that point any side-effects will be performed and bindings made by the code will be added to the name-space.

The compiler function itself is thread-safe, that is multiple instances of it can be executed in parallel without interference, provided suitable parameters are provided. In particular it may be necessary to ensure that the name-spaces passed as CPNameSpace parameters do not interfere.

structure Debug : sig ... end

Functions to aid interactive debugging. There is a reference here and a tutorial here.

structure DebuggerInterface : sig ... end

The DebuggerInterface structure contains functions to allow application code to access information about a program that has been compiled for debugging. It is intended for applications that replace the default Poly/ML top-level.

structure Exception : sig ... end
val exceptionLocation: exn -> location option
val raiseWithLocation : exn * location -> 'a
val exception_trace: (unit -> 'a) -> 'a

The Exception structure contains functions to assist with the location and tracing of exceptions. Three functions, exception_trace, exceptionLocation and raiseWithLocation were originally contained in the PolyML structure itself so for backwards compatibility they are available both in PolyML and PolyML.Exception.

structure NameSpace : sig ... end
val globalNameSpace: NameSpace.nameSpace

The NameSpace structure contains functions and types for printing the values produced by the compiler. globalNameSpace is the default name space. It contains the top-level bindings made by compiling source code with use or make or entering code at the top-level. Values in globalNameSpace can be extracted and displayed in the same way as any other values of the nameSpace type. Values can be deleted using Compiler.forgetValue etc.

structure SaveState : sig ... end

The SaveState structure contains functions to save the current state to a file and restore the previous state.

structure Statistics : sig ... end

The Statistics structure contains functions to extract information about the Poly/ML run-time system. It can also be used to query statistics about other Poly/ML processes run by the same user.

val fullGC: unit -> unit

The fullGC function forces the run-time system to execute a full garbage collection. Normally this will not be required.

val pointerEq: 'a * 'a -> bool

The pointerEq function compares two values for identity. The normal ML rules for equality state that two values are equal if they have the same contents. The exception is mutable values, such as refs and arrays, which are considered equal only if they are the same ref or array. Equality is only possible for equality types, which excludes functions and values of type real.

PolyML.pointerEq can be applied to values of any type and returns true if the values are identifical. It is intended for use in user functions that wish to test for equality in a general sense and where a potentially expensive operation can be cut short if it is known that the arguments are actually the same. It should be used with care. Poly/ML only guarantees the ML equality property and the compiler and run-time system may merge or split immutable values. For example, shareCommonData, combines immutable values with the same contents.

val shareCommonData : 'a -> unit

The shareCommonData function is intended to reduce the storage requirements by merging immutable data, such as lists and strings, that have the same contents. Since the ML equality function tests for equality of contents rather than pointer equality, running shareCommonData does not affect the behaviour of an ML program unless it relies on non-standard functions such as PolyML.pointerEq. The shareCommonData function requires extra space on the heap and sorts the data before merging so can be expensive to run when the heap is large. The argument is the root of the data that should be shared. To share everything pass PolyML.rootFunction as the argument. It is frequently used before the heap is saved with PolyML.export or PolyML.SaveState.saveState.

val export: string * (unit -> unit) -> unit
val exportPortable: string * (unit -> unit) -> unit

The export and exportPortable functions are used to create object modules or object files. They both take arguments which are the name of the file to be written and a function to use as the root. All data reachable from the root are written to the output file. export writes an object file whose format depends on the particular operating system. On Linux and other similar systems this is an ELF object file, on Windows a PECOFF file and on Mac OS a Mach-O file. It can then be linked with the Poly/ML libraries to produce an executable file. exportPortable writes an operating-system-independent text file that can be read by the polyImport program. It is intended primarily to allow the Poly/ML system itself to be distributed by avoiding the necessity of having separate object files for each operating system. Note that the file contains machine code so while it is operating-system independent it is not independent of the architecture.

val onEntry: (unit -> unit) -> unit

The onEntry function adds a function to a list of functions that are executed when a Poly/ML program begins. It is primarily intended for libraries that need to be initialised.

val make: string -> unit

The make function is used to compile and build a set of modules from source. There is a separate description and tutorial.

val use: string -> unit

PolyML.use is the same function as the top-level use function. It takes a file name as its argument and compiles and executes the Standard ML code in the file. The file-name extension may be omitted if it is one of those listed in PolyML.suffixes. The inclusion of PolyML.use is really a relic from an early version of Standard ML which did not include a use function.

val suffixes = ref ["", ".ML", ".sml"]: string list ref

PolyML.suffixes holds a list of file-name extensions of ML source files. This is used by PolyML.use and PolyML.make. If they are given a file-name as an argument and the file does not exist they attempt to open a file with a name constructed from the original argument by adding each of the extensions in turn.

datatype ptProperties =
       PTfirstChild of unit -> parseTree
   |   PTnextSibling of unit -> parseTree
   |   PTpreviousSibling of unit -> parseTree
   |   PTparent of unit -> parseTree
   |   PTtype of NameSpace.typeExpression
   |   PTdeclaredAt of location
   |   PTopenedAt of location
   |   PTreferences of bool * location list
   |   PTstructureAt of location
   |   PTprint of int -> pretty
   |   PTbreakPoint of bool ref
   |   PTcompletions of string list
withtype parseTree = location * ptProperties list

The ptProperties datatype is associated with a parse-tree that has been exported from the compiler. The parse-tree is an abstract tree where each node has a location and a set of properties. The properties associated with a particular node vary according to the underlying parse-tree and circumstances.

PTfirstChild, PTnextSibling, PTpreviousSibling and PTparent are used to move between nodes. They are only present if the appropriate node exists. PPTfirstChild is present if the node has children and returns the first (leftmost) node. PTnextSibling and PTpreviousSibling return the next (right) and previous (left) nodes at the same level. PTparent returns the parent node.

PTtype returns a value that represents the type of the node. It is present on nodes that represent values and can have a type.

PTdeclaredAt, PTopenedAt, PTstructureAt and PTreferences may be present on nodes that represent identifiers. They provide location information. PTdeclaredAt provides the location where the identifier was declared. PTopenedAt and PTstructureAt are only present if the identifier came from a structure that had been opened and give the location where the structure had been opened and where the structure itself was declared.

PTprint produces a pretty-print structure of the node. It is present on most nodes. The argument is the depth of the data structure to produce before eliding the detail.

PTbreakPoint is only present if debugging has been enabled. It returns the debugger identifier for the node.

PTcompletions returns possible completions of an invalid identifier.

datatype context =
       ContextLocation of location
   |   ContextProperty of string * string

The context type is primarily used by the IDE when providing error messages. For most purposes the context argument to PrettyBlock can be the empty list. ContextLocation provides the location associated with the item being printed, typically the location where it was declared. ContextProperty can be used by a user-supplied pretty printer to provide extra information which may be useful if the result of pretty printing is to be processed by a user function. It is not produced by Poly/ML pretty printers and the default printers ignore this item.

datatype pretty =
       PrettyBlock of int * bool * context list * pretty list
   |   PrettyBreak of int * int
   |   PrettyLineBreak
   |   PrettyString of string
   |   PrettyStringWithWidth of string * int

The pretty datatype is used in connection with formatting data for display. Rather than create text directly most display functions create values of this type. It is used with a pretty-printer based around the model described by D.C. Oppen in ACM ToPLAS Vol. 2 No. 4 Oct 1980.

PrettyString s contains a string to be printed.

PrettyStringWithWidth (s, n) is similar to PrettyString except that it contains an explicit width. It is used when the width of the displayed string is not the same as the number of characters. This may happen if the string contains UTF-8 encoded characters.

PrettyBlock(indent, consistent, context, items) defines a block of items which may be strings, breaks or blocks. The items will be retained on a single line if possible. The indent parameter is an indentation that will be added to the current indentation if the block has to be broken. Note that this does not apply to the first item in the block which will always be printed with the current indentation. The consistent parameter indicates whether the block is to be broken consistently (true) or not (false). If it is true then if the block will not all fit on a line and must be broken then it will be broken at all the breaks in the block whether this is necessary or not. If it is false it will only be broken where necessary. Neither of these parameters are used if the block will fit on a line.

PrettyBreak(blanks, breakOffset) indicates a break between items. If the line is not broken at this point then blanks is the number of space characters that will be inserted. If the line is broken at that point then instead the following item is indented by an extra breakOffset spaces.

PrettyLineBreak inserts an explicit line-break.

val prettyPrint : (string -> unit) * int -> pretty -> unit

prettyPrint provides a basic formatting of a pretty structure. prettyPrint (output, width) p formats the pretty structure p and calls the output function to display it. The width is the number of characters that can be displayed on a single line. Spaces and line-breaks are produced by calling output with strings containing spaces and the newline character "\n". Context information in PrettyBlock nodes is ignored.

val prettyMarkup :
       (context list -> unit) * (context list -> unit) ->
       (string -> unit) * int -> pretty -> unit
prettyMarkup provides the same formatting as prettyPrint except that it includes processing of context information. prettyMarkup(startC, endC) (output, width) p formats the pretty structure p using output and width with the addition that whenever a PrettyBlock is encountered with non-empty context list startC is called with the list before the block is output and endC is called with the same list when the block is complete.
val prettyPrintWithIDEMarkup : (string -> unit) * int -> pretty -> unit

prettyPrintWithIDEMarkup is the same as prettyPrint except that it adds IDE mark-up for location properties.

val addPrettyPrinter : (int -> 'a -> 'b -> pretty) -> unit

addPrettyPrinter is used to associate a printing function with a type so that it can be displayed in a more user-friendly form than the default. It appears to have a polymorphic type but is specially handled by the compiler. Pretty-printers can be installed for datatypes or types produced by opaque signature matching or returned from functors. It is not possible to install a pretty-printer for a type function (i.e. a type defined by type t = ...) unless the type function is simply giving an alternative name to a datatype.

addPrettyPrinter pp installs a pretty printer pp where pp has arguments depth printArgTypes value. The first argument, depth, is the print depth. This is a value that indicates how much of the data structure should be displayed. If this value is zero or negative the pretty printer should always print a simple string such as PrettyString "...". The intention is that the user can control how much output to produce when printing a large data structure. Larger values produce more of the structure. For values produced by the top-level this will generally be controlled by PolyML.print_depth. The third argument, value, is the actual value of the type that is to be printed. When installing a pretty printer there must be sufficient type constraint so that the compiler is able to determine the type unambiguiously.

The second argument, printArgTypes, is only used for polytypes i.e. datatypes with type parameters defined as 'a t or ('a, 'b', 'c ...) t. It is not used for monotypes. If the type takes a single argument then printArgTypes has type 'a * int -> pretty and is the function that will generate the pretty data structure for the argument type. The int argument is the adjusted print depth and should normally be one less than the value of depth. If the type takes multiple arguments then printArgTypes is a tuple with each field being a function of type 'a * int -> pretty that is used for the corresponding argument of the datatype.

val install_pp:
       ((string -> unit) * (int * bool -> unit) * (int * int -> unit) *
       (unit -> unit) -> int -> 'a -> 'b -> unit) -> unit

install_pp was previously used to install pretty-print functions. addPrettyPrinter should be used instead. This function may be removed in future releases.

val prettyRepresentation : 'a * int -> pretty

prettyRepresentation returns the pretty structure that can be used to print a value of the given type up to the specified depth. It is similar to PolyML.print in being infinitely overloaded. It can be useful when writing a pretty printer for a datatype that includes types that already have pretty printers installed or where they will be installed later since it uses any pretty printers for the types when it is actually called.

val print: 'a -> 'a

The PolyML.print function is a special infinitely overloaded function that prints its argument and returns the original result. It is treated specially by the compiler which uses type information to format the output.

val makestring: 'a -> string

The PolyML.makestring function is similar to PolyML.print in being infinitely overloaded. It returns a string representation of its argument.

val rootFunction : unit -> unit

PolyML.rootFunction is the initial function for the default Poly/ML system. It processes the command line arguments and then calls PolyML.shell to start the main top-level, read-eval-print loop. It is the root of everything in the Poly/ML system so it may be used as an argument to PolyML.shareCommonData to minimise the size of the heap before it is saved.

val shell : unit -> unit

The shell function runs the normal Poly/ML top-level read-eval-print loop (REPL). This function is provided for the situation where a user might wish to export an alternative top-level function but in some cases switch to the default. It returns only when it detects end-of-file on TextIO.stdIn. The top-level prompts the user for input using the value held in Compiler.prompt1, "> " by default, for the first line of a topdec. Subsequent lines are prompted for using the value in Compiler.prompt2, default "# ".

val architecture : unit -> string

The architecture function returns a string that identifies the computer architecture for which the current version of Poly/ML has been built and the code that the compiler generates. Currently, it returns one of the following values: "I386", "X86_64" or "Interpreted". The last is used when Poly/ML has been built for the portable byte-code version.

val rtsArgumentHelp : unit -> string

PolyML.rtsArgumentHelp returns a string that describes the command-line arguments that are used by the run-time system. The main purpose of this function is to enable Poly/ML programs that accept a command-line "help" argument to provide information to the user about arguments that will be interpreted by the run-time system in addition to information about their own arguments.

val rtsVersion : unit -> int

The rtsVersion function returns a number that identifies the version of the run-time system. For version 5.5.3 it returns 553.

val objSize: 'a -> int

PolyML.objSize returns the number of words of heap space used in its argument. It is primarily intended for debugging when the heap requirements of a program are larger than expected. It returns the total size of everything reachable from its argument. It takes account of sharing so if parts of the data structure are shared they will be counted only once.

val showSize : 'a -> int

PolyML.showSize returns the same result as objSize but as a side-effect it prints a low-level representation of the data to the standard output. It should be used with care as the output can be very large.

val objProfile : 'a -> int

PolyML.objProfile returns the same result as objSize but as a side-effect it prints a profile of the sizes of cells, the number of cells of each size. Separate profiles are produced for mutable cells i.e. refs and arrays, and immutable cells such as lists and tuples.

val stackTrace : unit -> unit

The stackTrace function prints a trace of the current stack; that is the name of the calling function and the function that called it back to the start of the thread.

val profiling : int -> unit

PolyML.profiling enables profiling for executed code. It takes an integer argument that sets the kind of profiling. Zero disables profiling; non-zero values enable different kinds of profiling.

val timing : bool -> unit

PolyML.timing enables or disables the timing of each expression typed at the top-level. For each expression figures are shown for various passes of the compiler and the execution time of the expression.

val sourceLocation : unit -> location

PolyML.sourceLocation is a function that is treated specially by the compiler. It returns the location in the source file where its call appears. Exactly what information is returned depends on what options have been provided to the compiler.

type location = {file: string, startLine: int, endLine: int, startPosition: int, endPosition: int}

The location type is associated with the compiler. It represents a position in some program source, usually a source file. The information that is included depends on the particular function that has returned the location and how the compiler was called. Generally, file will contain the source file name, startLine and endLine will contain the line numbers where the item started and ended and startPosition and endPosition the byte position in the file. The file name may be the empty string and any of the other arguments may be zero if the information is not available.

structure IntInf: sig val gcd : int * int -> int val lcm : int * int -> int end

The IntInf structure contains two functions that have been added to the arbitrary-precision arithmetic library. They compute the greatest common divisor and the lowest common multiple. If Poly/ML has been built to use the GMP library these functions will make use of that library.

val print_depth: int -> unit

PolyML.print_depth sets the depth for printing the results of each top-level expression. Passing zero or a negative value as the argument disables all printing of top-level results. When a large data structure is to be printed the print depth controls how much of the structure is displayed. PolyML.print_depth sets the value of PolyML.Compiler.printDepth.

val error_depth: int -> unit

PolyML.error_depth controls the amount of output to produce when printing information in an error message. It behaves in the same way as PolyML.print_depth. PolyML.error_depth sets the value of PolyML.Compiler.errorDepth.

val line_length: int -> unit

PolyML.line_length sets the length of a line which is used when produced pretty-printed output. PolyML.line_length sets the value of PolyML.Compiler.lineLength.

polyml-5.6/documentation/Reference/Signal.html000066400000000000000000000061101265146633400215620ustar00rootroot00000000000000 The Signal structure

Signal structure

Although the Posix structure in the Standard Basis Library provides functions which send signals to a process there is no standard method of handling signals.  The Signal structure has been added to Poly/ML to allow signals to be blocked or handled.

structure Signal:
  sig
     datatype sig_handle = SIG_DFL | SIG_IGN | SIG_HANDLE of int -> unit
	  val signal = fn : int * sig_handle -> sig_handle
  end

The Signal.signal function takes as its arguments a signal number and an action and returns the previous action.  The action may be SIG_DFL, indicating the default action, SIG_IGN, indicating that the signal should be ignored (blocked) or SIG_HANDLE, which allows a handler function to be installed.   

Signals are represented as integers using the normal Unix signal numbering.  In the Unix implementations of Poly/ML the type Posix.Signal.signal is the same as int so the constants from Posix.Signal can be used as arguments to Signal.signal.  

The default action depends on the signal.  For some signals it is to ignore the signal, for others the process is killed.  See the signal man page in Unix for a list of the default actions.  The only exception is the console interrupt signal, signal number 2.  The default action here is to run the conventional Poly/ML console interrupt handler which prompts for various actions including getting a stack trace and raising an Interrupt exception.

A handler function installed using SIG_HANDLE is run as a separate process (thread) some time after a signal arrives. 

Several signals, such as SIGSEGV, SIGFPE and SIGILL, are used internally by Poly/ML.   It is not possible to install a handler or block these signals.  Although the SIGALRM (14) signal is used internally it is treated specially and a signal handler for SIGALRM may be installed.  The handler will be run whenever the timer set up by Posix.Process.alarm expires as though the signal had been delivered. 

Signal actions installed using Signal.signal are persistent.

The Signal structure is provided in the Windows implementation but only the console interrupt signal (2) has effect.

polyml-5.6/documentation/Reference/SingleAssignment.html000066400000000000000000000117541265146633400236310ustar00rootroot00000000000000 The SingleAssignment structure

SingleAssignment structure

The SingleAssignment structure provides a reference that can be assigned a value only once.

structure SingleAssignment:
  sig
    type 'a saref
    val saref: unit -> 'a saref

    exception Locked
    val saset: 'a saref * 'a -> unit
    val savalue: 'a saref -> 'a option
  end
type 'a saref

The type of a single-assignment reference. It is similar to the standard ref type constructor.

val saref: unit -> 'a saref

Construct a single-assignment reference.

exception Locked

This exception is raised if an attempt is made to assign a value twice to the same reference.

val saset: 'a saref * 'a -> unit

Assign a value to the reference. If it has already been assigned a value this will raise Locked. Note that this function is not thread-safe. A mutex must be associated with reference if there is the possibility that two different threads may attempt to assign to the same reference.

val savalue: 'a saref -> 'a option

Extract the current value of the reference. If it has not yet been assigned a value it will return NONE. If it has, it will return SOME v where v is the value that was assigned.

The reason behind the SingleAssignment structure has to do with the way the Poly/ML storage management system deals with mutable and immutable data. Immutable memory cells are given a value when they are created and once created never change. They are used for lists, tuples, vectors and other datatypes. In contrast, refs and arrays are mutable data. They are given a value when they are created in the same way as immutable data but their contents can change by assignment. In addition Standard ML also distinguishes between mutable and immutable data in the treatment of equality. Immutable data structures are considered equal if their contents are the same, mutable cells are considered equal only if they are the pointers to the same cell.

Because of these differences mutable data has to be handled separately from immutable data by the garbage collector. Using mutable cells imposes an extra cost on each collection when compared with immutable data. In addition it is possible to reduce the heap size by merging immutable cells that have the same contents. In some circumstances the garbage collector may do this automatically; more often it is done explicitly using PolyML.shareCommonData.

The SingleAssignment structure allows for a combination of mutable and immutable data. A value of type saref is initially mutable but once it has been assigned a value it is marked as immutable. This allows the garbage-collector and sharing code to treat it as purely immutable once it has been locked.

A typical use for a single-assignment reference is when a data structure is being built by multiple threads. A saref can be used within the data structure to represent a portion of the structure to be built and a thread created to build it. When the thread completes it assigns the saref with the results of its work. The full structure is now immutable with all the advantages of immutable data.

polyml-5.6/documentation/Reference/Threads.html000066400000000000000000000433741265146633400217540ustar00rootroot00000000000000 The Thread structure and signature

Thread structure

Earlier versions of Poly/ML have provided a form of concurrent execution through the Process structure. Version 5.1 introduces new thread primitives in the Thread structure. This structure is modelled on the Posix thread (pthread) package but simplified and modified for ML. The aim is to provide an efficient implementation of parallelism particularly to enable ML programs to make use of multi-core processors while minimising the changes needed to existing code. The Process structure will continue to be available as a library written on top of these primitives but new programs should use the Thread structure directly.

The thread package differs from pthreads in a number of ways. There is no join function to wait for the completion of a thread. This can be written using mutexes and condition variables. Cancellation and signal handling are combined into the interrupt functions. (The Poly/ML Signal structure handles signals for all the threads together). The effect of explicit cancellation is achieved using the interrupt function. This causes an interrupt to be generated in a specific thread. Alternatively an interrupt can be broadcast to all threads. This is most likely to be used interactively to kill threads that appear to have gone out of control. The normal top-level handler for a console interrupt will generate this. Threads can choose how or whether they respond to these interrupts. A thread that is doing processor-intensive work probably needs to be able to be interrupted asynchronously whereas if it is communicating with other threads the presence of asynchronous interrupts makes correct programming difficult.

signature THREAD =
sig
    exception Thread of string
    
    structure Thread:
    sig
        type thread;
        
        datatype threadAttribute =
            EnableBroadcastInterrupt of bool
        |   InterruptState of interruptState
        |   MaximumMLStack of int option (* Added in 5.5.3 *) 
        
        and interruptState =
            InterruptDefer
        |   InterruptSynch
        |   InterruptAsynch
        |   InterruptAsynchOnce
        
        val fork: (unit->unit) * threadAttribute list -> thread
        val exit: unit -> unit
        val isActive: thread -> bool
        
        val equal: thread * thread -> bool
        val self: unit -> thread
        
        exception Interrupt
        val interrupt: thread -> unit
        val broadcastInterrupt: unit -> unit
        val testInterrupt: unit -> unit
        val kill: thread -> unit
       
        val getLocal: 'a Universal.tags -> 'a option
        val setLocal: 'a Universal.tag * 'a -> unit
        
        val setAttributes: threadAttribute list -> unit
        val getAttributes: unit -> threadAttribute list

        val numProcessors: unit -> int
    end

    structure Mutex:
    sig
        type mutex
        val mutex: unit -> mutex
        val lock: mutex -> unit
        val unlock: mutex -> unit
        val trylock: mutex -> bool
    end

    structure ConditionVar:
    sig
        type conditionVar
        val conditionVar: unit -> conditionVar
        val wait: conditionVar * Mutex.mutex -> unit
        val waitUntil: conditionVar * Mutex.mutex * Time.time -> bool
        val signal: conditionVar -> unit
        val broadcast: conditionVar -> unit
    end

end;

The Thread substructure

exception Thread of string
The Thread exception can be raised by various of the functions in the structure if they detect an error.
type thread
The type of a thread identifier.
datatype threadAttribute =
        EnableBroadcastInterrupt of bool
    |   InterruptState of interruptState
    |   MaximumMLStack of int option
and interruptState =
        InterruptDefer
   |    InterruptSynch
   |    InterruptAsynch
   |    InterruptAsynchOnce
The type of a thread attribute. Thread attributes are properties of the thread that are set initially when the thread is created but can subsequently be modified by the thread itself. The thread attribute type may be extended in the future to include things like scheduling priority. The current thread attributes control the way interrupt exceptions are delivered to the thread.
EnableBroadcastInterrupt controls whether the thread will receive an interrupt sent using broadcastInterrupt or as a result of pressing the console interrupt key. If this is false the thread will not receive them. The default for a new thread if this is not specified is false.

InterruptState controls when and whether interrupts are delivered to the thread. This includes broadcast interrupts and also interrupts directed at a specific thread with the interrupt call. InterruptDefer means the thread will not receive any interrupts. However, if the thread has previously been interrupted the interrupt may be delivered when the thread calls setAttributes to change its interrupt state. InterruptSynch means interrupts are delivered synchronously. An interrupt will be delayed until an interruption point. An interruption point is one of: testInterrupt, ConditionVar.wait, ConditionVar.waitUntil and various library calls that may block, such as IO calls, pause etc. N.B. Mutex.lock is not an interruption point even though it can result in a thread blocking for an indefinite period. InterruptAsynch means interrupts are delivered asynchronously i.e. at a suitable point soon after they are triggered. InterruptAsynchOnce means that only a single interrupt is delivered asynchronously after which the interrupt state is changed to InterruptSynch. It allows a thread to tidy up and if necessary indicate that it has been interrupted without the risk of a second asynchronous interrupt occurring in the handler for the first interrupt. If this attribute is not specified when a thread is created the default is InterruptSynch.

MaximumMLStack was added in version 5.5.3. It controls the maximum size the ML stack may grow to. It is an option type where NONE allows the stack to grow to the limit of the available memory whereas SOME n limits the stack to n words. This is approximate since there is some rounding involved. When the limit is reached the thread is sent an Interrupt exception.

      
val fork: (unit->unit) * threadAttribute list -> thread
Fork a thread. Starts a new thread running the function argument. The attribute list gives initial values for thread attributes which can be modified by the thread itself. Any unspecified attributes take default values. The thread is terminated when the thread function returns, if it raises an uncaught exception or if it calls "exit".
val exit: unit -> unit
Terminate this thread.
val isActive: thread -> bool
Test if a thread is still running or has terminated.
val equal: thread * thread -> bool
Test whether thread values denote the same thread.
val self: unit -> thread
Return the thread identifier for the current thread.
exception Interrupt = SML90.Interrupt
The Interrupt exception can be generated in another thread either by a broadcast to all threads or directed to a single thread.
val interrupt: thread -> unit
Send an Interrupt exception to a specific thread. When and indeed whether the exception is actually delivered will depend on the interrupt state of the target thread.
val broadcastInterrupt: unit -> unit
Send an interrupt exception to every thread which is set to accept it.
val testInterrupt: unit -> unit
If this thread is handling interrupts synchronously, test to see if it has been interrupted. If so it raises the Interrupt exception.
val kill: thread -> unit
Terminate a thread. This should be used as a last resort. Normally a thread should be allowed to clean up and terminate by using the interrupt function. Raises Thread if the thread is no longer running, so an exception handler should be used unless the thread is known to be blocked.
val getLocal: 'a Universal.tas -> 'a option
val setLocal: 'a Universal.tag * 'a -> unit
Get and set thread-local store for the calling thread. The store is a tagged associative memory which is initially empty for a new thread. A thread can call setLocal to add or replace items in its store and call getLocal to return values if they exist. The Universal structure contains functions to make new tags as well as injection, projection and test functions.
val setAttributes: threadAttribute list -> unit
Thread attributes are initially set when the thread is forked but can be changed by thread itself using this call. Unspecified attributes remain unchanged.
val getAttributes:  unit -> threadAttribute list
Get the values of attributes for the current thread.
val numProcessors: unit -> int
Return the number of processors configured on the machine.

The Mutex substructure

A mutex provides simple mutual exclusion. A thread can lock a mutex and until it unlocks it no other thread will be able to lock it. Locking and unlocking are intended to be fast in the situation when there is no other process attempting to lock the mutex. Mutexes are non-recursive: if a thread tries to lock a mutex that it has already locked it will deadlock. Note: a thread should never attempt to lock or unlock a mutex if it may receive an asynchronous interrupt. It should always set its interrupt state to either InterruptDefer or InterruptSynch before calling these functions. An asynchronous interrupt may leave the mutex in an indeterminate state.

type mutex
The type of a mutex
val mutex: unit -> mutex
Create a new mutex.
val lock: mutex -> unit
Lock a mutex. If the mutex is currently locked the thread is blocked until it is unlocked. If a thread tries to lock a mutex that it has previously locked the thread will deadlock. N.B. "lock" is not an interruption point (a point where synchronous interrupts are delivered) even though a thread can be blocked indefinitely. If the thread attempting to lock the mutex is handling interrupts asynchronously an asynchronous interrupt may be delivered before or after the lock is taken.
val unlock: mutex -> unit
Unlock a mutex and allow any waiting threads to run. The behaviour if the mutex was not previously locked by the calling thread is undefined.
val trylock: mutex -> bool
Attempt to lock the mutex without blocking. Returns true if the mutex was not previously locked and has now been locked by the calling thread. Returns false if the mutex was previously locked, including by the calling thread.

The ConditionVar substructure

Condition variables. Condition variables are used to provide communication between threads. A condition variable is used in conjunction with a mutex and usually a reference to establish and test changes in state. The normal use is for one thread to lock a mutex, test the reference and then wait on the condition variable, releasing the lock on the mutex while it does so. Another thread may then lock the mutex, update the reference, unlock the mutex, and signal the condition variable. This wakes up the first thread and reacquires the lock allowing the thread to test the updated reference with the lock held. More complex communication mechanisms, such as blocking channels, can be written in terms of condition variables.

type conditionVar
The type of a condition variable
val conditionVar: unit -> conditionVar
Make a new condition variable.
val wait: conditionVar * Mutex.mutex -> unit

Release the mutex and block until the condition variable is signalled. When wait returns the mutex will have been re-acquired.

If the thread is handling interrupts synchronously this function can be interrupted using the "Thread.interrupt" function or, if the thread is set to accept broadcast interrupts, "Thread.broadcastInterrupt". The thread will re-acquire the mutex before the exception is delivered. An exception will only be delivered in this case if the interrupt is sent before the condition variable is signalled. If the interrupt is sent after the condition variable is signalled the function will return normally even if it has not yet re-acquired the mutex. The interrupt state will be delivered on the next call to "wait", "Thread.testInterrupt" or other blocking call.

A thread should never call this function if it may receive an asynchronous interrupt. It should always set its interrupt state to either InterruptSynch or InterruptDefer beforehand. An asynchronous interrupt may leave the condition variable and the mutex in an indeterminate state and could lead to deadlock.

A condition variable should only be associated with one mutex at a time. All the threads waiting on a condition variable should pass the same mutex as argument.

val waitUntil: conditionVar * Mutex.mutex * Time.time -> bool
As wait except that it blocks until either the condition variable is signalled or the time (absolute) is reached. Either way the mutex is reacquired so there may be a further delay if it is held by another thread. Returns true if the condition variable had been signalled and false if the time had expired before the variable was signalled.
val signal: conditionVar -> unit
Wake up one thread if any are waiting on the condition variable. If there are several threads waiting for the condition variable one will be selected to run and will run as soon as it has re-acquired the lock.
val broadcast: conditionVar -> unit
Wake up all threads waiting on the condition variable.


polyml-5.6/documentation/Reference/Universal.html000066400000000000000000000061401265146633400223200ustar00rootroot00000000000000 The Universal structure

Universal structure

The Universal structure provides a universal union type. It allows value of any type to be stored in a single table without knowing in advance the types to be stored. Note that this is not the same as a dynamic type. The values are discriminated by the tag, not by the type. There may be more than one tag that can be used with values of a particular type and these are treated as completely different. Universal is built in for efficiency reasons but it is perfectly feasible to implement it in Standard ML using exception bindings.

structure Universal:
  sig
    type universal
    type 'a tag
    val tag: unit -> 'a tag
    val tagInject: 'a tag -> 'a -> universal
    val tagIs: 'a tag -> universal -> bool
    val tagProject: 'a tag -> universal -> 'a
  end
type universal

The type of the universal union.

type 'a tag

The type of a tag that can be used to mark a value of the argument type.

val tag: unit -> 'a tag

Create a tag that can be used to identify a value of a particular type.

val tagInject: 'a tag -> 'a -> universal

Inject a value into the union. This marks the value with the tag.

val tagIs: 'a tag -> universal -> bool

Test whether the value was marked with the tag.

val tagProject: 'a tag -> universal -> 'a

Project a value from the union. The tag must match the tag that was used to create union value otherwise a Match exception will be raised.

polyml-5.6/documentation/Reference/Weak.html000066400000000000000000000133251265146633400212420ustar00rootroot00000000000000 The Weak structure and signature

Weak structure

The Weak structure contains functions for constructing weak references and arrays. A weak reference is a way of detecting when a resource is no longer in use and can be recovered. It is, in effect, a way of extending the concept of garbage-collection to user code.

signature WEAK =
sig
    val weak: 'a ref option -> 'a ref option ref
    val weakArray: int * 'a ref option -> 'a ref option array
    val weakLock: Thread.Mutex.mutex
    and weakSignal: Thread.ConditionVar.conditionVar
end;

structure Weak: WEAK;
val weak: 'a ref option -> 'a ref option ref

Constructs a weak reference.

val weakArray: int * 'a ref option -> 'a ref option array

Constructs an array containing weak references.

val weakLock: Thread.Mutex.mutex
val weakSignal: Thread.ConditionVar.conditionVar

A lock and a condition variable that is broadcast when the garbage collector has recovered a token.

The idea behind weak references is to allow user library code to recover resources when they are no longer in use. This is only relevant for resources, such as file descriptors, that exist outside the Poly/ML memory and need to be recovered.

The garbage-collector recovers space in the heap by identifying cells that are reachable from roots, generally the stacks of threads, and treating everything else as garbage. This can be extended to external resources by associating a token with the resource. While the token is reachable the resource is considered to be in use. Once the token ceases to be reachable the resource can be recovered.

A weak reference is used to detect when the token is no longer accessible. To make use of this the library code must allocate a normal reference value, the token, whenever it constructs or links to the external resource and include the token within the data it returns to the client code. The contents of the reference are not relevant; it can be a unit ref, what matters is the identity of the reference. When the library creates a token it makes an entry in its own data structure within a weak reference or array. That entry is set to SOME token. Note that the type of a weak reference is 'a ref option ref i.e. it can only contain an option type holding a reference value.

Provided the client code continues to use the resource and has a reachable pointer to the token there will be no change to the state. If, though, it discards the data associated with the resource and hence the pointer to the token the resource is considered to be released and the library may recover the resource. If the garbage collector detects that there are no other pointers to the token except the weak reference it will change the weak reference from SOME token to NONE, so there are no longer any pointers at all.

To actually release the external resource the library must check the weak references or arrays within its own data structures and look for entries that have been set to NONE. Depending how the library code works it may be appropriate to do this synchronously whenever a request is made to allocate a new resource. An alternative would be to create a new thread to manage the process asynchronously. To aid this the thread should lock the weakLock mutex and suspend itself by calling Thread.ConditionVar.wait or Thread.ConditionVar.waitUntil, passing weakLock and weakSignal as arguments. The weakSignal condition variable is broadcast after a garbage-collection if the garbage collector has modified a weak reference. Because there may be several libraries using weak references the receipt of the signal does not guarantee that a resource associated with any particular library has been released.

The garbage-collector is only run when necessary and detection of released resources may happen very infrequently, depending on factors such as the size of the heap. To force a collection the library can call PolyML.fullGC.

polyml-5.6/documentation/Reference/XWindows.pdf000066400000000000000000021532261265146633400217510ustar00rootroot00000000000000%PDF-1.3 %쏢 6 0 obj <> stream x5PN0UnT(G) vvlpđURVj9 I3dJA ?d 詪 p7RmPB3 f \?$T*RBJz ՠMc Oz2A#d~ps=L\FWendstream endobj 7 0 obj 301 endobj 79 0 obj <> stream xXMoF#tv?IY\hHLRco5HIf, @U~ZIV2ztR|))V7JZhV67,M] =nA$yχʼnhL0Ӈeժq1e6iWtdK^ ťz TJ~Y 8h9_؎qʿsD=/fLԬd? g%nm^pҝÇD|"0*YipC87_0͛l/|ow'0`6A6WE m7L S* j JbO7ٺ}|euX#L:ğB˷H/t@_$K_ PX\k-&P .AH6 #7SǎH]P(JjWw`<u%6-Sع`cAMMݾoK %xq, hwLǾ-J˂+rR+^*t[ԻsֻOճPaOx.:/x8x<8 iz)Zl%,JqYK9Hy]i1s x׍tQV@ꛫ+hIC;sB9fvܵxˤf )3/YqnQ> stream xUj1 w?Uϲ5PХC.e\@_φ >K!q1Y+ǸK2Obet2%>si1;YzLdv`i?\J! I+11/]ɗ;[h%4Ynĺ68߿zsHKxm0{;vёt85gsC uU1oC&0e bendstream endobj 96 0 obj 242 endobj 100 0 obj <> stream x[[s7~WEKu[Τ0 [cVC`JGG6FO?j=ĵ?Qz}&}+tx[ Qݿ[D3x^/W:NAFRsY^m081ĉ0B Q]FiM\@Dɢm0φחIhh'Oo5T; }L)2X1✆ίI mC7F 6O֫@_ԁX1bn$PǁM֋Nƙ]'$>pU-ȿ^*WfL (؞?Οd4rTQړq Ƥ(I`` =4HV'oc!a]7$ 4JAjGMTS%cuQ`ձ~IM&Dzu(xίNEDvtȁM`ۊuFO)LC2$QQ2zd%f68hz9IS۟Mx`RMb'"ߎ[ 邬;o& Qdt 4[hBxBG,C#`r$w>e;װL:Ac1_Mr4(qYsmQ ;f-DLS_.Xa1U L9“6ui5,-uӈζHEqܮMv$Q poaI!c8ixpNXNHLrz dLo&Utc΢cpt%r$BUQ^d4990)I@$H~a a[>;kCԔpf(VmAzrU۬ T,EE8h|!^LCADSarp?ڬp/# w dx`6/m(_@fm%LUxfM2J![˞K}CldֺaL@^m_(ԯE&!Sb Mf %%7SMR$m !ԈL VeqH%lj,"CI8mѼsuh/>nU_6AԟlypDycD^dz-SEޟq;>Jׄr }TP2vECc+{Y`VXZ!HHtes+8{WG{u*u2p&. RjoQԳ/'G"g ־Vآt$J["6F0ϿS ZMU #΅u1ݼe=i9_w[Cqendstream endobj 101 0 obj 1506 endobj 120 0 obj <> stream x\S8gG7St LЏ{qbR[[ $s< 3aF^W]0"\G;wH.{;:0H*bu J@_<翝 ,;?".o:6ӑ- IJ~DqHdӢ@`E)ќvT5)w)"J5]+eX!$e_V ͘|UGBRdTԍ ػ׉'dXM ¿DJa N.1*^.aԔEՅ"dIҔxy?Ίd2f,L^$!!i!2I)ߦeǞp#/`(D%BJhQ(AT4LD+DErfӲj֦u^S5z4*Pyz6 eMT50ma տ(ֲzo\ð 4:ySB+HVY Yǭ)\/Ȧy|cW:+pؗp;slZ͐Qs*X3$ (Ƃpr{u $l5kՌy[4}ljcV&65 sx@d0qvJȘى װYzeLÇڶe۞Qm4+"&XK ~˭ˢ07'<8o63vuv[;ٱr7o_bN&wgiEu\紝Dp,Jz$p`?6RDpC`6pa~Qm $%oH`0/["Eæt) (B!!t nN`@/̭KNuyR?+te5M.g:r.T6B2\%5@ʑ()]7p" D [C>6폲##UU<8"l+<(v~@62ȑQ*sOxUx=Ӡ+)$Q2vwř!:ށ؞A(Q}N;k5BEn}‘' 5^U*]5oMY PO8[Iy\_eEn痜26H{ؾxL3wV7\E&qN, 'NG @Xvi31X(98iwYmK]Tnjɳ˓zRzNE XMR,~$Q!u-mwdg&*IH $ ICeS#Y<^uEp%^4Rj&M dg&tcr7嵔endstream endobj 121 0 obj 2019 endobj 124 0 obj <> stream x\[o6~# eomڬź!{qm5H,/M(-:Q4#@Gw<#;=?z5"vG/*Id">Hd(DJDgӟfMCKytFsyM, &) J%@1#O20źLzP؛#dX:e= {b!„CKScskMdTRrn׌Ԥ-3E\ }8/{(H%)HxDIrNFCj'v A M4뱬+Igv)࢞D aCRL3Z(xɘҍ!)0U.ju یD7F~7iLW!bb?) ?1HcЕ< #Ɉgƾ`i෺IymP9Cp\ڽ<,.H {]ΤOp\̬BNAکQNq~2^G|K JL{lYAF.b^qibX:CTa`!!kf*KRX^2Uƍ0RIi#,bW;/̒BJN<)d2wƋ2Bj, çƾ5XqåT%ңRQgAuqTOk\% AEYԐJ{|>">y\z|n.W<`Ed:'i8 c Q6WU(0-cڗGn_NSG\^|x(NWV ԍ~{>9GEEF&" }0-oDmD.Ic@!"\O>㴜 2X 2@n[ 5'61͝HYb?4^bb{Zr vRt(sو 3Oi1Iұ:q* -31i/8m/ug5,fJzڅ~Kl%8)#DYܖn!=v !zXg{3hQvr _vkQ|Mv-8Ǐz ]a\ vx=?,endstream endobj 125 0 obj 1994 endobj 128 0 obj <> stream x\S9 ?U? HBR,Y`oyؗ0cx_-H3jSETIj5|aDFo ˃:2H*" #GJ@]$y_MgZrrӕA(Rs{c ;[%˺ RͨH"nF ,Fsq6k۬go\HjJ[nnO;%4%q}G.VM €f[ $"ĉJE\7,eizmK4 -Ԡ7/t WB{Q /B;:Qh4Q7($g `DZ 8"oŽ|>#43Zr!tKKNR #f S6d:\p[ۃ Y]xioA`Qu 1{}:euw#!Lgcoq*1|o+] **׋A'>$Qg"dlG lfN@nr5]}&z ]VO#2-q0G$O!rM<G}P@O$uD aU%;432 6Eh+}_Dݯ;᯳iPw OD9wŒ`$ivv^=@%"0R~ۘA̬N (؟Ӱ q2= 2I Q8^uI9)yj@L2DBAJ|X9iҴ⦉/4> pc jm06*ఏßpj[OuMDF #YA/Qv~o{E l 5\<6*M&>X U DZvo:'uYd* <;EҘ!~ؖgSl5*o|-b lQcRX;4{0~)*L#bޔg7U@Vf э0u8Qͣy#B4WTMFl3&:,rl@g+0Q"<,(bLuol:~t,PuMH -Mt-'!z0[> zLiE5"fv*ƚ"٨  #)RWy'%QjX`}TLtU Br~_*hhyCG,*Rt\&hlK%i!&q -/%n%FJQ(C.]XG] B:eaj :M:r[(希8'=B#**uKFN6x0>c[7p.Mt9}ha4ƛ5p%\gX7yc46Qfecp/ l(^rD澩px]{dt,Id?:]@'ŏt9 ]pC$$6q4} ߋ>'F}MWzTeHp\UysmR<"Ts2aW͉^ 鉷,x"{ 0I6P!NcBпn*_;lX'H` PodL!۳I|!.λo'J{zRUz`#3OOm-Yx1~? 4#i}vPQ1u&A9+0_E׏y@ZEd.P]g_mo_o t}O?6/6k6y 4-&[S;+MgX0o=r[hRu]9::B,6u"Ⱦr~@endstream endobj 129 0 obj 2250 endobj 132 0 obj <> stream x\Ks6W(ޏ$M3ki::BKHV R"訞օ(gv%bwhOɗrm|r# &O*4R`F1MO~a%iӟ::HGPIJh2?y{Q6pL̒0 QnZ1uk6+Fa~10*iNeD˸+a|]#2h {dZWqؿ֟u?1F)l١0*W1X@=P 왬``={-B!ߜ#E>{}|~c1#@ʌ齚=FCaLU>TTm&aAVKfx0^2" crPSS,Qa(" 0c!s77YWgE֭d凵O*Y,Hfq.lM,!!Zo@rA$Rkm3Cm @e_m|Ze'qb$=i "EQ oX@Qރa?Pjb9ܨnz\fe<82nc5\M &P3uW& Id)ص$S(sHp|s:\>#r/+یJx]Ոk'K) 0J$*puBuܠN[N+w?0}=Tocpύd?ĸ0~5=J1U{ R̝(}7٧"#;a cr ^ҭ֩k+ޝ-bn^ }O"xoϮ)E(t[O2 F`1_Ms' @Xn.^ eHEqܓj7"1fg#@;3fL/ )n0E~R(zO/6.yj&a ӳE7 PwwE1"eh}*J_φĥ89Rܤb#9qN/+04e(c0YUQf5]\f\\љ4Ha_T֤☓8}i[j40zB9( LetUk<}SZ0v`>핫k`pɊg5!>(Sz$h|dP=(:F 2*b q:} ڸ.LN=;w' 0&ՄA{VjI4]j~]I&E5f\vFg{Q?35a4A1.e0qz9SXgBv}*q?uB'Ku5@ g6 X9ޏ3v[;j?$`2f43˜\=G[Et?9ꔯR5WETժ Խ3PU1[#sPH=91F|;+G=>5 lН^2p$ Qx8$=F[N B.Bܒ7Ssιo7E;'E[WAqIWW] :ƥxUOE/;O{GQgh._\lFρ骮+8U4GLsy|Wc߫7x\őendstream endobj 133 0 obj 1870 endobj 136 0 obj <> stream x[Ks7+<:U,iI%:\a/cql.pi`ɑb+#F*  t/#2|:4!n,O.qf #䓋~#HN bzT5լ|nghiT87-юUS- UW]s`.|UfWn΄sOh Grr%&[~eT:-MWeq8OO[ -t}Vf+/+_?OBs wa@LG1)"3aPCJŌ[Jʂ9^άEX|UX[ePc_(5 F* 肄k.u<+7܌Y8_(JA+ +TqQ9qIέM~.?dUI op0A. ˲9)׳ffqbI\8V aVC0C!Ȟ~S-K7m6J{NcFp|/P$3Ft s!"fiWY!^dx}M~i eDKfcrNL(lƐQIQm;_syC$7z|Ċ8}>FDLZM 'Mbߗr^6g? J_IDEiWO$%wͦ w'ۢJ9WƇ&=8s ep\6$,ލ礎%jeLJݏ2ט-^O]!YU)Q͛e=-7մQ֢x=)Z*"A閤nYjQڊ"wnnE }fv>6pDtz82ʅc 6J;ޭA)OPjdHR1J?)1.Uq 81c8=8XQZ!&?y;B:NjwIkF@%ĶCOyܝ~YQ -կJJ$ir:®]B|L=; +BFȨe7k "[H48¤ q~0r#U5G䒛Rw6/toPG׀VvPdPXelJ:$ 4[i~VT$D:MK!F<9ݝI2z了ثr"@є&I2}BSD)Bf&cfu\AB]YCas0c( ;BR[bOZ6 |DZz2QdmBsƚn+W̶|!w x]mnb]N($$5}.F;B pMݔ =StKY&%$UAJ5 \ޑ8hc>"<{=Gwiډ]r=ҎN^;{~j[nAHՆ%l R@k4'̫uqQNW0ۡbQ|ؐq_wX8V8 f[QVe2˅%swガH$c{Ҷ{]}zGhO@\큂Hb| A()G9b*lb{?u\a Jp/xxi˄Tim!ϊ*/=σ|#ƲEKO Mz֢սnNv&g<dq: il_3FE]" *K|9[ݴ~k'*Sc{D%ZYZ%4Gfc^Y=E{y>c1 *v_> 1q sK'8gNme .UhK##8CReߵQu=τgNms1^`I:lҿ$p@B^P5i/'F endstream endobj 137 0 obj 2179 endobj 140 0 obj <> stream x\Ks6k#xLg"ųѤMm$^TIՑ-:I0& <wO~]`Ȩ~/&ד k~=:pT&QEvvR*@fanɃg9ymi!Gy6uFsTy%,Š ^'/"F4jc) eTWjT,"AՍIE&IBN*MC+&3H&G }S(3¥'L8/. kw(#FdNdٔ Dp# Fqj7glCTŒςx-8Ad,RGB})Ty,:V4w1Vd6A *L*p-̊JeVU mYu &XS1U\Iew߈҈ۊ#},u)jY[&JthؖEjBeq/WlYiiM@5Ej*SuYصYtwM{Q3[hՅa1&IRh;q:[ /A/ ܙ+Q/ڼPu6QlnFCXT'0*l[ c` ݾN&c.a70@+%0C$7oBM.t(k TTLA(ed13l6W]Q0.cWz]ٺLڥq(兽mT$k(Q[ORHGbuy>v`)]XJ&ޝ|'",g3.>I3RLx0FBHYØ{}cႦD1إL‹;Tq ~WX-UChCQL׈=4\߽-OwI*k4Pzy7҄G:2, 8pg^!m ͮdmb.aB-'*A!v).m^nѭvl{U2 rOOU,mHX+k) BDQ47́AOnF/-66oڥunyEP*zigE ?uU+2DBZַdQAlDzr fL}S?bIyI(⚖at,6JSP4 Zw)3NCS;3s7{> stream xK6:@r8|lM{E+kkk߇ĴSli0`HOCjHԿzv?O˚l<_̾6,1H&y 14QEXϞf@05NRZt|@B%! wT"Qs6d\0Y=85猀fR%?++bP2~!4*o6HFu-M*~/1mFPKT4ӖD) jUc%!dΌ- &6cV_7*n?=+)S9"Jh"u1<†|5zlhqlG/J P99jN}x$G-vM*< *oBM$S靜aqM"s4h;=-+7&7۲*=i(hkcV"v[:j}2Eo/~v|P[źLfj[xqxut,ˬ B5w45 o"jAH0RG$5 2f'F/83ə( ch$y@j cGa;/vv\cn21י;9? uW!vL!QvHh:i{Pi5bk\ӝ-rCJ ^tzM(\ô4YALSRz)aqejD R"a?ɬo+k⮂t-˻ ck>fjD1*gJFxI c j &OU}m[UZ28nK,[aqG>3mqh}YdS-ͻ}!Q3ΣW=?Kihp&JAT ckAuOCM: CSLS15.l?1RA+C:wnn}gm5HQM=z녜0[jizLHaeQԆuu+^ߊo0mrK|:aq=h""e>]tendstream endobj 145 0 obj 1103 endobj 149 0 obj <> stream xZے}|_RT/9c6:,cI, $(w(vG3VA0>}tC/G$#~ߓ˓#ڭſ&G'w$:v4c#HF狓>*9\>?/|߸ ʘpulI3bh̻_?xœ+)FZm>ۧn v'tvU_yfBm3/;ݶ*x缈gD໦v |9͛2IrmC3k|#k;AegE2&DM",{%fKU Ew!6}~&lxU 'Eyq1o夻B0 sE(lҴ4-rZTs)"pz 1 A9yN {e1Q%_dz,8菺zQ۬;>J(_5up1e,x;9ìȫ**30B cDY!5h? d]֝8YSoVM5kG,CЭ-(:;lt$i$Pˤbt'UZDSߕ0\TnżPdqU=$u )*A)Oua%DWURys-}BIo Ѫ.1 .4Ѽ)|.@XPc+e>@h;nBiM6,QԫD:dZm \=wb%TH`r=| :*yr)P\@%p_MS =5"bJC'ga`C!-AhѦ˪5͹cKQ(Zo DI8r6TBḟyLMXAxX{TF#Pw/uVCI+hBo:e4EJ\Ğ*ΐoV`"8E!g(w6}JyQ7^p^6`4F*b/Q&u> vAn N*& ͨ:JĒ)m'27t9= Q"qf}ȥC!*/c7'eJDbYꦜAqxUHڷhJRl/?XAzsUZPAE7pjÈC3{}QVAA9J9xeFx viz@C\)$ja˳dgO*\6obGiyUlKЙI ykd(\tϾI?Ueu7߷nퟛZVz?uU{:s8MuQ[N싁VCbƌڗXp#G &xG 2D|ݠeLے@"Vu2w`Rm[Ɏ .GF>fn@c drO+ᆸd[\sKA* l#@^o$2MkW=bŃ,~JBTWCt1-\3i@O1/>l>/f XTL]7ӢyRN=R]sб0oJv? vendstream endobj 150 0 obj 2813 endobj 222 0 obj <> stream x\Ir}{ܗX[ly 8UnjjiU3l>؀_HfFDŮ a_|Ep5f7&DyU[no_R|ިfo-R5X.}ӽY'\#Ho\6=RÒmzd#c0Onu}jdP}Si9M:rލD(Wͩ\|ZQ Uxiۮ^Hwt[d5VgnnUL϶O~Ӟii F-qc}ݶCWV[-|-6A):n7mvWL4VxZ]nѱOC VO/NFMhuGPd lzWZUOn!&!tȀ2/rcy :ϼ8jlFD&./\FoxqFY(iy9EG Zؓ~7ŇF99REru|^XG%KAu]{W,n~]r94Nvs%3<%:yoO 5t z_˜<CC> |ؤM1i== ) ޵Xy; tskxK1ᤊ mwo| 26ԝFۿ K3aB4 _v}IW:7GsF.#B.S҉TZv(vM7G'Uw30dnMv-Q xj֍ 37ZC5&3mƭl}pV A_[sjJH$N"懫iP7b‚QVЎRhR+E'Jߵ"nmo4,\QA7p:y\G*Zd/u[^]* vg\-s'}wCwCAQXqyh,^ YPv6y }"PQq[`3&w}ιpiڡRaP.)n $Wߵ^%$u@QWdի^jיּXu$ej.. $Úȅxfus . E SW-M`\kf8S#*_Wߖ+Dڇ]i)[H͊8?6x"1HT>H;>YJZTJ%$TSC\b IuX9"RQA9z>$.#)qU +>a`Pn ? T!&qaAHE YQfTP j?gɐ3}wXjAH*lPOWT\r.} 8:඀dPRl%=3)Bkn` }4VҁߥpPԠ7%%2xMΒ Q ـ Xk9dRt#k"e4 S LW)ecwWsBJ1rw6ئeI~37KKV]0 =j $npw,h 3$g"UkI ZxlfZE|=kL[sfk9Fp?ėHpJ 'E7|ηUs%X2TB_TbĊ̰PE.UU7X2 y*y*VN1,Mș? N{,Xx>)D%.L ` >D_l$2or)Ib BI()_JTre?X U`B!.XSы "S/$ɽ}SEȀdmcY$̭s[vgА4%}E X}e5F,cIhj(NW72a26S&(S_zxw?wqOiU$̜mFsfxS*HH,Czc0~")Wio tU2v@;㦄~}B ;7e aOĊ_)fEwCJ? }#DR@mJ9y$E"QQB ȌXXMLNX,8=>jjd% RUX VPOI8,$Dr]23Hb`<=\ݠ(NEP~c\2HN$>ڊ}5&1[TZn8~ڒx5OrF]r,*?l9(!{TX6 q:Sf2ZҩW)cqkăȑyo;1 J VXd*j{)`UH0y.̫d84w YJ{X@)Pr{Ӏ4ɫΏ^x{঩T9F-2{lyn1&t)dU{Q#(xnМ,]놕VyKv4Np1^:+MHN(8'A26bsI]%lȕ 齨ʛ rWS4P5dnq: Vb; jmOKhZ8bi\#(q8lQVBS:8M.OIyKѨG#x6{/nbF 5JE#i><ۀ3ީKWe/x>x2ۉQF&D=o.o"ɊU+Cq<֟8iܰ^ X871lb,O7wc63t\8te{ ^.f&/d8}U$׃:mڢò;~&ǃ(~%P (|x>xų (h;CD5N]Wȓtb=4j+ ~)xy s2GPiLԢ(*c򇲋~O\>Bd@L8 /FIbO(i׽7dpϒ* !KS /&lbQ.R &Ug[Z ~>=E!eȯyPuiG_u)Q_YFC?ޗٚ5Pת_STML{~i<5w\ƛNrkCz\&ܯ{rWO>}sA,~t t~tFt2EuF%R6rE@JO&ɌKYWX"AȒv$ fV%/ .F"w{`UT.{Rc|ePSWd x(JN˺*IH̪C$Gb5z/Afk8uþ/nP-=KI^TLOW>*W$텽4Q@9?U2Ήⱘz^coUl}qy? ݶߜ"5Xx8lK:%Ml؞ Wnr2u{F|)yn=D) 2r^ }PˏŢ.R[> /{qqyu.^'$'̗ֆw-}-֛iVi۽;! n63߼J6|_Zendstream endobj 223 0 obj 5235 endobj 232 0 obj <> stream xZK>(9&v~?eDՎ=33+) %[S&9쮮W_U+oΓj;޷va oӋw|E!8_Xk(xFN߿cjq /z]<\y6l/K#$ly3 '7U?`顅wJ|Q2/.'ӸOZUz~ٿ f|zƽJ/Fɕ/?muSv#*mL9, Ҿ)\n_Z$D 4q]%W^B!tߤmj6u/OLK[\ P'pq]) @v[R~2ٹQ#׵ȗ8 ۊP n$n%(LAmӹ(kLN xMig 풳@0z5 , {o^qNR jz "@왜Dv`$X kBk/F> {QtI;/:̷鑕pպZI :\CFKp` `)Ovv^B{A.&+%]8`ŀkY~tn:^BّN@kx|u5"l 0zc8㲽I VjbsdפE`2"dy^8y8B$08:qNUd\I[L$@ XD,{@֐eogVhĐZb8@)Z`#&N%A97 P 0A11| 6_DL#Rۺ\>Og3.-FfXPb+I(1̌8ʗq*Xs_'S]mI*!M0#| ) y5@\#[fQƭMAp(7Yly;1TR,?\gXChB5l;'Õ փ m>kG3y ߙX苰#X e՟rN9[(ߔX䃞6XYMKeCz1v H&<[]ծvP$;?0i BdP9i9OeÔ oWIxOa`;SPAZPfW4vəjժ9t) ZNDžB!ΡqJQ}X~|f~<H:ҴPRR>GӸVL-r}{,|/&t ( * M*D7A$x{L$ EˋqJ]aș19CmQ=O䂀Q̹ ܖ1C)ޔ 83FLG4 Lgm"R1dg24OL@3vY;HJi H % rISL:*Ըah2Vl" j޻'6?TK:I8vFTLG6}!ƩώzL01Ff@:qɻ$hKUހʱ%qKo#%be }8 ~>,k%E _QyBǟralShןO 1{g25c#ɧcG$, sHN.1@>n<?)K.ැhe }HٯuB7qW>йl^U}!*n |d]b=qDArh5) eqa< 2+X@J~T|rԌs@ujY2J`0p7HrI 1dCrJJZJXx32L( qyڎ|"?-t'[5T^JJ[5FAEDŽJRDtPݣh@ MxƦgaŒڄ@JaG5#釢Sxa6JϐOI*{( =Y`&Ml(0P(camW4ơ]^Ͳo6~U'g3b̫u]FtQ(JC7e4PmPmαc Mٮcf7h?%ƾd})CZCf']ŐGUaxdP;X T7yԌ1=BֵX(HhK".1H$Nj0g:n=t|Ehi/G~q x@%.l:/uy*%ΐ gȋ^z1:b;I5Tl/YzIX87I_h~|6o599`) EAYu+ɸ*{a.JsX|e0ߦbs3|7*y"\t ‰.KK2&UmaѦH*7yk &LI(*&۠Tqi&yafӵp< En:rK-IR&z٥>%W}f.KHc&gQT*cp~C:Ty .C_I}K}GhV$W] *g5 Zl.mO|j&./:`l554;XÏPᒺ/g>&y+w.)ʴeT"JhC؞{?$;O՞jp1ߢ2pn!'SfjAvHFYϠg,E D3I7f~@|=RC?"endstream endobj 233 0 obj 3918 endobj 248 0 obj <> stream xW[oV ~ϯc_6`u[ ^8Q'K$7υ8!@RΧ+Vw{xqœ ՏXaj/g+W |_^T ^]Ѿއ}B 3̔G9+Sy+!%cȊ{Mr<\;ajk(V^!?t*'tn)!I\۩-϶_kt̠qPp&xN*T2o]ӀĽOxُVkcl^ya+:Tv4RD3M2V*|naf@Yq[NNbXb84ݮO]y RszK( V KwC}_6$66ٷԴ!$Z`]HTem x"z}fWQY#Lv|Wiicؕcteq4xP4c~#>ql!V=Xʖ9T 9u>*w_.y,&<4) {9F$vC]"pA?$rp댭-4\pA-zJM7C+hs5w:,,ӘK1Z:|?2FPqL 3CۄL= tIgLtwȔ//{lOܴmnf %\>m 4k\MV ~6P]6@'FtcF1Ck߆ˠz MOl$,zBÍԥ -ƅm{,DQ!0跥@؍F2;Ɩckr,p8np?4VZ eKW6,lȧ8? C}ӆןqM8 ̟;;h=hBo-haJȏ/1/B#L(XdwY*,>d]) *O8p~ӑZ&,ظsp˂Ѵ_# Ɓ@LjPRI#sBRJ֒Wڀ^ Bns 1qId^$Q1ȇ-J(l>DCz [(QT}6:FMG|_xR'1R 춯wY\o%\$F4^#L#zA yJt6Si ,hEq//R)qL xY1I\t\̟ktVai;GҽFE*seGcvR;e?Q9Y4ÇyJCd2d.e&.|JQϖ‘oܠUesc rQWю|Kt?0A|L(TM)llyeObޫS*iw /v7WY }WXNZ9)L'>SB>㰳4&vahfUXendstream endobj 249 0 obj 1523 endobj 255 0 obj <> stream xX[oU~TP/ipmKm :Y'^; UUR/W2 A>>;;of{F$_;2N?ED3)1YwWw{D0xy=ޕ]&gʄ&Y77n?"54޼}s{:TjH8|gcluű6^u嶣~[|et|x<:SmԻ8p2#uc qUB t tf3&]8eSajxgULl6`&' I93p"E;)B.~SHZ$!1K2y0*=P؍L7GUX=dJve?4ooGAnԄRc$H'&gDSDU'E(2_dNO)"\, ޲ !GKDoX10B =e>rJ4vȥ8L{4Ií6t CQSu_l*ӲNv6e6k(ٚ:8(DunhT4Mfec4[<\H^:lPJvpP{#.ӅzQo;K# ON4-lH}+tޑ.p[07'"91Qٍ܏>UZ\ח!BQ<5^yxǝ"!QV:lԋWor>ߛ]5 1H/2J\>endstream endobj 256 0 obj 1763 endobj 277 0 obj <> stream xX[o# ~w#qSX~٢^6:~Kc[n;#(s!gFiM`5L<ɏ?&U^SV?Q,=t)JbwÛ=ފ?FLnjLp|("1Aߨצ[aƭ 5 6D:4iVmG%>94zNem&<,<+u_&Mw\\'&˄nl(R= )E?' N\&Ii ww3.U*&g4N.s kQJ!ht&GA>Cmt*GAMCQ8Sa0kBX}=T|4Ԗ"]uu]@J7dS"BxڊBWo>W0rRvq+)|Z])m5RY悞l}U*&({%FJ[ a%kn (m}t#_kT1SVA8ϫ;p`Bqܮvԟڐ%WMs?E?ˑ˂> EE^_K65 %lKjh>Aےni0 MaW.%];&:y̔Гjxsr@b$kfg%}Kb=S|]umpk0/avYvGlbp:@pKo;p-~CjmOfN^״[lE92܍'\TW~j؟endstream endobj 278 0 obj 1979 endobj 281 0 obj <> stream xYIoF )lo-]i:> -юZr$οDIt( $ -{ǂVP,FG Erօ"V (l`3Vh\&/.F{#coGe1FCkttvƪm <ټr&@VťodPNM\-'a2 s\3)s*֔ɸv3v@qY=%Vq%i͜HiEuSzt_#,+LYܧWRb̭ 1'x7%#TBv|tBXzr\{{E j>_= n^U5\oc,&?E5m4ex:nMVU}3È R-> _b!5tZ!V Ta\ 9"M?sCs}!E!uۯ/JDp4ɿKFyܛ|qb,=[ќmؐK=ޣ씳MnjٯwV-߹%8*L7!@0Ԑ~@yt1fflW |>m=(rY9cf|><%mp-R}蚢NU2ПV2!t-'Jm'w HiGj'xh wG<71:Vj)\ xHdzUUWke"gn 'h!^3% H1WiiHmnswJ8XRf|;߾qrɺ lQY_?+ iX:57;nsT#qP@% Bm *+,3 2ob(om1oGRʬw9b# *lq Nu1"jr!jP_]@={<v9t#e8v(u.W+`0TN/2]>\|Aj2{<ƹ rPE-ANd&P} ʚ&P>}WTTLD!i?,U >'iC `X̥*fYǹN6UR{K ʤ:/>.儔n͡%ut:_cQ2nW\WSҋfQ8MS/VLi(s83gǯ[Ǎsgl]_^7<|4Mε)Ј봴 KxXANM96pbΝR-q{ #V+`(v1\&HdPbGT@ ?@/ 1g AnOF J"D LDyuP"p%b-HzJ> stream x[Y~W#~]CF,;q@ᮘάHe%OUEr83 㫯{]_Oٻg.x+Y_~+/.|0Y/<ϸog'\Th^5MlWM3?%0鰤uX)i㷫y%*Wotc3V^!_Eq*'/CAH\WC|s]>̔< {2]6; (ZKZԪb )|X[)]SoSY[)!w>|(m-FѸPEf7}ʌt,` 9k)٘6O-.\<@yuV:*mqxRq\=InWZb"8. <;T"ʐ\(n]'(2WrڱBi0`͸baP9Pmv%+ n|)BzL@:|m96 !ɋh+Nv'fJC>M@2\'ԣ b}nbU*v_ǰS IA!<("݇ KcuMԘwuq]\Jàt%[2N")23dFSlAgCY(q#%H6~&SO3[yJ J(̬Oh}Ѭ5$6e A藷}On .}r*|nN Y_]Qk./!rJ0/3)nlrZՖp[Դ\/0-)Ėt20š@1i0n=V.\ PC.6t]A0JmƆjhP2t\7 gC䟹 ͱ &%Qa,A7WeuàMK;W%Cy"pX| be4 1ZҡB"&4RA'qʜ ܶFV3ɜŝ3#l#Zںp`p'EׇW2hfeļΥ 吖P,UK3>]8XX*˗ۊ"tJo5DO?ٶWά<!ST3. -a+ \o;VyU&Dh%q )`H *8ETFc0=] !*$~HK9UX}jFP9nfDvߔl猚C=P!EnKV4Cws 3v+i]=D_b)Wc5t직r:DrB0l 5>3=隂کY]hgI1g'Z^+AšZԏ+B ?#G"LV(A&-!BY.sjc̢RO!uc` ɖ:㡸_ I"vHw5>}m ͵=}N j.Ù ˗$e&ڃ@3+g3j7,F+S 6zXȠ}+Y(F(ԻV{Foj.Xz}6"GRLOk_ȴCwL$Tˏa"üwM--U#SSa߰AzQZP9}{4`0J$]*j!F9X] ,x||a`@m]G=f}q[2`yy"M-I" zE q~ c}{KZ%w]Զ-сXd$·":GPam@M8X*sX.vӦ_4_Q;0b/l$W{x5B+N '^/DAʇ~e-; zO6/KfTrPFSy!fWW]S csSJ2Dsh! 脪v^qI+RZEߥd5#r1`t%(bD~M4NrPez .я@ JR$; a1B͌T;%VdsY3 KYI\-MJ`Ha}d*6#k Ų;@J)SZ@L]c"mW]<֟~^՛4.D6O}_PF+L@ TLU9Y%SۺGHܪ^ W`>ն(n9"9io== E#3pT@G(w[>|S_TشE:c:]SQ2JF% $$>P)-0rN%*eʀġ.,W|Jc+ю2z+ۜ8]]ԙ((2) /}K 6D5j.),Hcc# $)YLe\./BU̼nLcӖ. da]W:PKYt#[Pv6zC;\OP"MrVC I3ZX(>%n#V/[،:o Ά >26aC1|M` U\b|lo>D kϺO ;c9M33؄pٓ2-t`&75l A3N6fdƦy4j0^i BH/aQy e(ϼk9Ҡ5f y]#,j_Ġ`=Ӡ2@zԣXD>\?0,Fc<˳ܗܧ5:xPI&uh7P w6Tn,^u$X م£+c_fIO]N)x8g/`Uj@./DA7F7~UYxcfݒlJYZeIέl[9%S(p9Qرe"GZ|[ZԲԄl l~ݞ:@yC0/kbEpfC$0bVaoA}x BdQ:0x^їjh fl W5 Srg'鉯vui(ǵYBb\!$IB{?tq J7To]K N/?ɸ=T/Ti*L/cLOX= = e[ģTy/Blendstream endobj 286 0 obj 4345 endobj 289 0 obj <> stream x[Y~#~#FN0[Z@pg#ci}j^3^% &j_-7}|eZȉJ SؓȴOBkBE|cdAϨ QrUL '0ƥ7eV%ۯI lIju!QHjݚ57`L̺#HC~e]Ƈzr؂ˤ?PJeP%2IYGF -M_x~wlKzJtZg}YMT6-a埚.&x4_|Li*m\٣{d *QO=2>z -aӰb,Z!B2 aZ8 `W>,43SBכ6\|6'T Dq?V;"}5Jq5rcVզ٥ ԤWaKsW&:d">PK\ vsof@뮮X@78)se 64m[u,e~[VءvB=Ϫk])/pc%e !iѿn_ji=dnX?¦7uh9@\<8wя[tKKOC`m1[d{TO0IWة@9,*[6 nDgyS6%GFc\b6Jf잸Il¾a fSbCC 6XLe!pMxڻjbgN \1J:'mʃsl_T`zw1$;46bٳcGR 8muJۙHi5'h6][(a1@S@PF%u u~*)]/` {^`Oo?j@%]DzT E HvIGE,}b JO{A@{ ww v?wqۜQE( Pz|!OhksOh]gY k#f5b0+P'_H'XI2&LE/1ܾNe}TX7 ZB %Ia9N]%3w% ҖurLSwPb%|*"R tR@;UTϣciAJ:trV"Rf{]dbB2Yԇ>ɱ̽;BUS7w`<IlӪĴV`jzSE\"B#ZJ"|obdX^ZLOjWSEajsH vX0-Fu6,tܧl.D]LA@uq*)r}ZjbUGZ 7Ib0ⰽZfI%qxrD(#% dqwReƮ]>aZ'A qMfD&HneOv7z ͼ2V5 'sm_ d@âar{ta"B##b>ڍ͂p' ۘxxß8M<8)!$-SNT LM^0R(s" .S1u(!h}6Ta&6`mbNV}N]<y# $$:ؠ^zj!]_vUt!ukQЉg@:\nKQeU `3oZ 㦘y8gs8:\}os1Ȓi#L]^%ss8INkIlBg[F݇<':ByMfeŠBU흏,!Oڒ Lef=Lt:-KsA_,qi\Ƹ u{zPb†>RӦ6${{MIBdQW2HXңmڔ?~| nH]k|?nLF^a93`ʵ?&T`|BI"ŌaٌrUhܼB1.+F-7_ɠ&10Zο &mAhXZ6X &@ǃggboP,QEN/7&l>LZ>uʍی` YQ,P ^qTl2j4M8,gJTyG-F*N+sA7 'Q%k2 8bL,^_m6Uw|]Co/ykە"zBv L(*-˗KOLUfV?LJ2T/ 0dI rahkMS7x[o-[xfki9oQXEwm^V]8͛bi0~uU0O"AXy=`%]3@9 ~frp~H* ?XvJGrv()Xgj?6x|)%,,ϸ{8[59I׷yZj]ü6/ocOeLZpc.B.> ;[,,k d1p-Y$ifXM"Ty;yJ .AS@?#nԹ*?V׮smzr[uu  ]p]I,xǽnaz)fi7eG m5 Ñ-ɘ H,irZ*m'BRm 'f8K%1 ΈAegr7]zӫ<vMY9 Z@i^ uf~sTb϶N⑨̖@O$KrAޟ_f5WnD{gv(tCPatCegK pȎ؛?%l_ Mc71,@E^fxlliV>6R2)|6x>q\:ţzlDo%g#mlH;wO[_ƹ#XV$iU:IKbK u ^G7GN91rJ! FнR =]'iM/ mIs@ ְ#ҟ׫_^? endstream endobj 290 0 obj 4139 endobj 293 0 obj <> stream xY[k~ ޺_lY0WDfzΎ=Eϩ۩ A A\SW+~+ҟOlaSbuЕ%+-a].^0տ`0xqPV%m\vU[6QDт#^jn;YPk~&^·;׬)Z޴qnօx/Na8IۮRWM5ZWN"=^mUhMh}lD/XKQj2Ζ*a{ϒS{F CurUEL$6:0ch|V4ǥo O_ܒ(&O q6stz[y0Ul*ƥI?%SH#}J~M'rN,۪X64W ?wUic_7WKwQVk$UgzNq`Qb 5?7]J;6N*.[(I&p %1B1&[Ҡ!5Ý t|.x.! (Hd)76 )/I[?KdQ"1몘7M&o$Wc\ oQ.W#dxzuM2sq. 9QnVHvOX0Iub-jR! `>GNah_2S$(42ttOK"\}8~63:Qtv97mJ6V(&5?(撉\Y!ӝπA ρs|b3c`L? *'bpYpK [I9|; ᢔ# iA'U!_ 4}Ӛb,jdt ף( Ŵg(@) JrEMwiqa,K{O]-+V Sde_֞@i`80]a :~:ݔA2M Zt[s J#~ f3M2Căܘ8],`HՖutdۦ:6@MG\>%kNt=@'5?$@.iJz_mIdBYBi( eH*d!9sigY֊\$̥DjϺYr,)SNx߹0A9vi'n.s:tD m5"L Q!Ќ)ȱVL9HE.liYھ60H*5]uz9.]A5iyӖw]R|>4{m1{/2z!|rO)?,FdVN?&J:BIWG-F0AՇ5zJ}8c LvRΣ ҌN,=;hWfW?]2MWGv\ D0BDN E*1`emW lqu@T*D0& 2 IX-J9v[PHH(>ܨE9"8)ʟ#Cj2HYxVn<B{ y{0Wa@s?=y`zZ#T,Ǒ-%D#1cN*r4Et97!ypN1unt 4K)ﬠ!+?!D>se 0`-J {C#:brB$Ph(u0ݡiHBQe##dPZlsr z FY1m0SXTǂ`=Hr$ؗ@#lK'7b8-'wyhzJm~0\@?n0m~HSB,m Ǘql-J@-C0w;z|a;2o蛻F_ $c[])UZ38Ϥt1a ̈́!)*EL ܒ>C (b \]tR ~8鄅EgkF=XE͇8\,2܈sC2!yH+7yjL+&~\d -4D}[5dy^P;P_bp8z`L d1|hgγ/XܢB]à tbgZF`&  7Xf$.N19opg@7?_guYuLf;Fl>}_qsq_u/CmPA(NYB.Sf8z*[hXw8AwM4uNCXzvF|M 3ёEy!D:-t$YR!/$_8Svo3RHsmzDEX0re |ln^^+m[=rq]G( _Qڛendstream endobj 294 0 obj 2893 endobj 297 0 obj <> stream xYmonGM-p>C|ZlTlٷYR\.) jwg晙gfV ~Ňkjӕ UX͍\\o.`.;]\.^^^>ܿX,a56nVͺ\1ܞYέK7]R^FL\-W}\p}X{6r}\D&9[RքSdAkZ ]*\BNw0+Uj$H24\iJju!QIF.!cjd֙$WWn3S@޼Bi!i UB&`"U,V"$Y-)_,PAWZE5%TytAS]t(, Kz]\aʺ:egTѬla,t^bB$^[lcՂrCH4y 2f)%V].4O>S(+nR&r]]y` SۈݸE[(mMJ%!&U*;  }m4F;Xbe]%8,_^_R`1?>:Ko`KIRdwe8ycM:qZLci!'- ZV2ErDwxڴ>{V}pIXV^SyC.$Y}_ ]ˮV %~zxfe9J\r 9nu}CqcUDJ$P~ J)ش?3茇rwV<0q4~KҘV[ 蔮܅XNU9!_  .g&I ِxlvW)L9 ]!K&|#PuW{5)+UtXBrݪb쑂[ 9B=b\oD\O|\ @;I6e"N @RK!VTa1*c+5MŁI?tT!ytfg#;IEJl$UTI E&OCVe+*QgS.jn.@ :#("!ʑ оBe7fLj5кMYo( $>c@bӧ(obM=q ,@ʼnIpÐB:y]SVv1^w~P#;YAsBFRL i(XO HsTt֬=PɁ(dzuhJZ(uČno{2OIڧgx*OB u5[JjN?ooP`)dF N18zN^oc~N ikN>d$CKhQJ~C]rwzԣp |2R5V'9fhEO灶m3.q;J7_#t|]5OHP8# g"I4px{ 4F _g$7Q2T_O#26+vo#HRS=!$-60({(G,y`@} 'QW 7Pc638BD< N-L X,}g6EH;}Cd~%|@58.T⺺D&Pn/FeL{sHQq_I^y! Zn?.ar7_HQX)/NY=>dL%x/8mt-$ !_W|̋;vׅendstream endobj 298 0 obj 2421 endobj 301 0 obj <> stream xZێI}_XdXZ-E5j#>?I-2җY,rvVfd\N Wۛn~XP?Ymno^la+ۻ]Xv{󌱯ns̵2ͳ*Coft$yEQ'ZѰ UY͍tKrY%+j]y9s*jҋ`}ɺ\1~ũ 6)ɈcDNT\'ilUiMhm$"iZK_bNK O,̺usXۇu?_ DeR%ld9}t{h%NG]76aneM+%ܻcr"yTD􋷘(6-|_w$u5}qWnmWQVJX}fb ww!/.+ʅßC7RpX?<G,ʹjxS/* YRmNTt`R˒n$fhѯ 25éQ'!>ƇSi^U7*b7qaы(@s|Cq}]Фaю^|X>D.P]p?@*lXE7 D+5Ⴊ)S&TPy7U.ȸ4Iǰ5 ~h>Ƙ$R$wo,_^u~V/^AqnO$j .pCt0#߄Р CZ"]tg˘Fz $MuEۥùNjZrC؏} ZϺRɟCaL !O1ymnxדyj> yqE3v8R)1~%8Ǭ9$G0$.Asb !AS"I\#Hyuҿ 5ٿJte P-20)8t%9Lialun?27\;h- ;gxoؘ*U8xnIM]dUaH~lf8ĸ 1n2nݾ!$JV{%El.i HݮֲämLKT_[7_b4 ~heF3M- fH9bU}HSҸtH1 }7}H!\CrlSOLYTMm .a/YکiAW&I ߎ]%h~#ȳLj5rׅ|Q~( XW]4S(jfsҜʠ*̪09iv4s>' 1JؠPX`֣T4 gY*˜Ғ3Xd.Y&Nn~BNT*MpBNW| Jz>,=ҎSaSX`D\S]J@$z=" 1MVQ WVE-ܩ)Y W~`RMrI}(Г!v& C8 5KQB;4MQ%QsG3ӎ2r ``R9 R^]D $ට[@nvDA4舚#:Ғ @çC朮($T=}{1ӾhbX].)w9/t$6'!*(maƧ($Ÿ&*4j.w>Dӳܬ>pĐsb\~#Z&8〘csG܋{&:o`PSԌrَCGCHK. &# ȯPnFNƐ1/Qc3eisGRTsˍ,/yCbߑ6ܐ݁hlR1;mkq>dDJZs~v yөp{}uZ5cn['bi&bfRIn]ɯ,M~U0B ScW2˔6$C:zM=s<0c%>A TA΄B; gFj5: x /4e&?@ŔTs'}Bn4&!E ʹ,&e{ &2,hbgK^,fs W3ZtcK bF3l?a ;FL/ĿIub&wgX|Ȳ4U۫(\0 )^2 Ծٗ^Ò{UL;7o仭qLiP^.luwb}< ݕGͻ&Ɉm ҿy=V :gLJD_DQ #sWf#=`c׈89(UzvMu: 6!3}RC ̘#z x_o|09ͿW?/<|ϋ`S+0{Ŋs$/ ^7%x>b!sCٞ+CܵwaIW{(S_ W_ձk{LlL <_=#ĝ rf=vQ ˉ#FL~L%ps'^$y> stream xWMo#E[9f%tW/iI8@b!̎ {̌7DOg @R"^UW~((auf-f_j](b57Xf+,` c[,67|?~TstFp],.:&+s.έ2N(Pe5Dc9Uqʔv&ELDOIB6f-XJ8a8@m|2ME1BH j"3HSiJ?s$}ZujP6 [,C0:04]ֻ3YԬo rSzqWo!Hz7뫮 Ͷ};'29b9  j Td D3\ʁpLeþk{DXCy@]iNh Wm#c, }\937l´]eTn]uri.x[#NvۈU1x97P\oشKYPYȣOI6E^mEӄAn [YYJ?Fppc0\aYu`JXHU]Si@vMBRyp4=^8H_&۔3rSSr}.im'om?\6>/cBRKeN⟫/J QcJIedBTu\vI! . z), {˘k1ڪnQ4| ̢6rP8ku8MX|@ bPr(/XPcd`ꈻi)yO>;ǻ\s>gչS!ɵۇ'&r]O=wn$Yn2wF>T>fḅlw/t3S\!#5|(~_*endstream endobj 307 0 obj 1193 endobj 310 0 obj <> stream xYYo~0;} G&H,"q#šCk$=G̈#Jp u|UU˂3/\|YŻo?,Xibus7E g`,V?Hտ@ևl{ L[ҧ]ďbr[>L#[X&@ed"x\j,Lxib9gWXرTI O()/UݗE絟*T=l˜I΀/K")>N,T΃b)C<ܤ=Ifk#1٠ц]SvvMk8ޟTȀj>owic\xkt4k.$cZk3HNYJw > ٭CǼ =ɥ]嘵V-( ^i4g_A7XXA1#\'ٯ6So_fo+J|誇z%SHҚ .Qm|,H-ȾnzGъT;"`Isξv?r0rM!Vg48Ѡ&M?ZT )ߦIH5Բ(}+6h0g8'ϸ.BT)~+?)  QQd1Pt׿T_)䓔9?T%78p8Ctxb)l=ȶ9-2Uo}+G *}.K)$(_p>hfvk3l&44PwMi0(\|\85L9ft Ol\=ޜևW)WoRDjBpK G 㩏xdfO}'a1m7u@"JQ#É;#lj%zI|K'a1?5T ,㼡+6rԄ]ۗL? W\4Ř% 9Q' ҤkUơs5;0OA閄I뙫C*3saV:>0yO3s#*>5%j\;4@=SK://pyng[w <\j,)\W}l5cq3,Ic Lt2@2?RzY*!-]9ǮzDiEʳ1Oʗ$wӌ_qݒxFʧlyfߪ;6K?cxZ?әw$duY_ @_6LPq'}꓍i}un{l}d_p}HKOHv=I%o*l˓G)Ap)f;Uiu#D}hcm]xfc'f)(=j~SVu;8gc\[ivXxk2Y7 i /kW!uXG`2A .5 Rуibu@`$u6P-=Tr ~7umnA5tzz6^ u^*! vx슫'CLOڳ E|ڳܗRȉc` mi|T Ym5P, rS>saܵכ>1-65;偄 p5saT1Z= qf<.(5aJ:밀@tIn$~WhӑBX> stream x\Y~G[l`F}!81`/{a_z5%=kͯOQ$$]X4Y k /~y mox1W/ƋFp~c ͫo?yoxw{L)io^^|O/˶ w>IMz4r0\z顅㳿o򋒙9==ie\G=03=D7¨@rW?2:C{a;n|x^L6b/nG_m߽B5ss>zv1ު\#F|ٷ?i8ϯ?A%:ff^nZ yl@^E#ymN>(ϤvC+;=mp.بt^̟woL2K$'];iMVH.pyrvL"3\-"V3a5"ccdawҠ$2Qߞ]7yah9ַSoFXB@ٜN#y܁"lxI zGB40vCy <#=`OL Q3hA5&ҹPZfKdfi>gLpRD6tJS}q+3+wa<2RjFӓ y'oN xwnҸ:+Sԧ̤sf ,K4hg`< ;KWENsa~tUc=Y\fuw:))@1:^ۚoͶz[ 40:77O8ڲF8GJ_n<W]nMte5 0ǼF#啊mmoxW=jä lSh[nU{ȬS)؁hJM KCWf F9?l.-c6'n([ɴpmǠiH!Ȑ):$$Kn |\= 9gup -8W(8G8eKI ;r, @fOqp6#m3.Cl}ݖ7g޶7%zS!6rEcƛZaH:e &:,* '2H02a-HJ]e D 0@3ffئXkb{QN3xھ yXi?Fu`9$gtw  I+mQ1Џ thb|'|F7 j[J{*tnâ~ Ǘ *M`0V @u~؜"9f-?&p1m5~fMIJ}Af8% vs1Hb`؄\1kpO3}HK]Eb(+*ks(6jeJ NaK1 B׮K Ū&_ (͛}$c9L~8`8$ % g0bx6 DzF| 09:=lf* z 5+4QlV TaSk]I!"DKLj PWEe84@@ +]|Q1mRxXzI+X7p ~k=Km_gPc^`pog(KLV_"hv<d@@Tb`ڕbm EfC{PuЈKaBLabhn56 "J@d!yEiV RaE DZ ,Ȭuщ(j5в7 8WC[GcFqWsF\{`$)! }g&RK/llt ES-]4D=ʾ!KU1 g:P(knj#~IzȆr˔HSk(fN<]6%Y$29)j)j0d 4v!z}.Ja)d9z&u~o) um9!nS[ɋR`LQ-Hhߔ5o} <;j>uSf2֜ BZ p4߹Tҩ.̟7XMH>1+eH^zӴ*9q C%T p*- [DÐ2{Z$Cn`oyIlp'a*)[3dk4ʢ[/X~\bP7cٙc[`૎EF"c֙kj+@b` ʡ CH߮ݷr^)e0 . 8E=ͨkFi|RT  G 06 VvnKF-m9Nmk.m#̫vݷU3IXްnchevrUBbD*4Nӽ<j3t&:.{~QJlVx]{yI7GWk*8[Rz2k6XS! HyQ i;ҔR*#U9qH$e6U95Ҫ0#@R+rށҼvC6YqWì iVuO:`knRR E g`^$fAhU\py+"څ .yB2$!dѹgFd\0R ?ݺ9w'CM#j\ ̞V/+l z5AB(** E퀫rTJ|>m§Rc1Skvg:pϓ ݝ 4q /zI)އ`Pew8u4 u _{zj^v' 7+gZꦠN;guIdz< lE?]0//D+FU/Cw_Gn2b _ȣ5wY7ޠEԙ| SdCjݞը3_DQ.TSu]w> stream xZYo~'#~rnÁv0Dd`hwHNf]}UE.؀$h:?(a+7W,|l/#Ns-W׷q[92 pokhZ㯷!K׷u[6I B5'FX\Ҙ&DV~Iœ„\s,fW`C\qeq>t}@HNmZm_rA˲Y3 (Q$ǡ/iIW ckO]::~.bFOH#j>fTqY4 B͌aS^(&ߴw:Dj"]"^sNiƟ!zu’rz|U[pnƋәiuD oF8MvrW9la"ac0:yzZk[uoqCEai gͩooaAoFIqT>RMWP(}8l ~HJ Q֪4(N0 yz6YEUyw DBy] Z M!=0h7]+gZq.(s'u -D:T% 52`%Uqt]dSB"´u ' vA%SfDCT7&[ZuY?wO^eMhA<$\317OzYFa<HY>$@taF>.BT7B0ns@r&;YB OsPsZ Tޫs,0 eS@ qg# kJ(G$@l0T)ǼkGyA)-"DX亓fm?&Q1V>)[Cq/<(:4$0hOf,† `[|h`Mk1 Ƚ +eAs!%dQMo`g_N_.k7ˡ+)l%St"/oYE}ؑ $m)7w p@l Ȩ``-.<,.IƆ{lJ-(7P :'3EQ"dH95OX|lk*1N匋ui}Yr]ݧhp\Oe-R'|DfrX8 d40g֧J>lSiן7OCE0u4S@E1d)guqRtg $uOEP1x+G0 1q8RTo:wF[mՔ]]HE۔SV UqUDBac[y"@2?voSߑ$ F=?cabȷ Q?eiUP!1p̄n+^ܼ8|ܿQo^BE?7| <Ou?[L6L3'VW _9 J}7ej,@;~P>E>-k.|Q˿\~M&endstream endobj 319 0 obj 2934 endobj 322 0 obj <> stream xZK/ENv~? +i 5]1I =Տ&9Ѯ# H@O_}UݿXW,ۋ_/~]8o/ziTJW׷5_]o/'wr<*cjuSҮo.d3l+/Aot*}S~w7ut=w٧GCsxdL}sU’.Nr܊;}+{0(z*lw62t,+tnq¬daāF *x_bzpϤy0aPD Vx#>nsPqF;/$:/!BOĵ/V7; 6fm)}sc8?+6XHV)ٍ7+N ãgK߅N͡bxOCs̫ğaxI>#  ΐUkzv YdqI1s9%e%tA QQ o7@1e3Xx(O[$o"l<2U&`NB#2EOG#^"J!و  @j)LyGD w?+NJ/5}kXכ&'%q[DXWCއQ+ (xE7 3`r@h Ce%bG.p#yUv\(nv0T!)e•Z"T15@ӊz/sS4)>%r.Kh%&)CFgĒX)晏vf:;:}x~̨ XP:E &SECaZa~(S3:~S?'}6pJ!A%Խ.1]] (n+ֹQ-PՐ|VAeGY\zri y1ʶLMW߇EL:JE; GG첟CaDWfp SU_A!n]f9p1e/v\bf9kz0utCua M~ lk>y?_-q/!L.4+?ӹ@?Ͻ{Ԋk}Ԛ*gcUdT% *uoTѾl#~x%5dj)T ۄQWsFp|7[&$iPXb [ 1b(<>!pO9eB 4V)`N6XGKRp(K&,BJѻKx%<Ӆ/>u5S3~n`.!pz )^:,{9N yGqD0+ aC;!'ɡ0#ȝG2GVεͷFRIvqDClrr1Qwχw:AnA׬%fxnXzG78"h|%@L MJp%s*^ _1Un)xG #]~W-(w <x^Ib}sq{U,)+{a* nx~zYvt3nC@KN.[!hW:-(Í_j_$o'2YYdbhrCs\BaVpd噞b|t4{ J)Y$ >~Lp  鞯ÒIy^:ΩmQ2$O/>`ˏ32FE詧K?aK\3t@|hؤ8i:JYM g"\!u+\EQYz9w3ı^6T Mk;*^k'۝pKΏ"-ehFd-e䞆UnֈV.WE×)*`KM=^\:>ɴL'iO7R,jvCݤ-*Aˏ{~GFv`%\ΉDx]]ꬆ;N6t&:3cD1_p-,'X6 []X;٤,y"`&Оs>Aꐷ~ֹћ,(^(U_\zendstream endobj 323 0 obj 3593 endobj 326 0 obj <> stream xY[o~#-=9Kp Į~0 P+rMRطM ??snCrŕz Agff݌6']lNޝ,6O|I|jv9y֍:Nq"riu,r(#%TGx13MV#9+ {Is,f6}ۤz'4IӠBEۅ(ɩMŢKky:/^ޤUIUeاs/5c.$TUx|UN9&LC,Jeگrгwul];QD7/~D3%ӓ쮛m8BhBdAegr= FaE,X\m+I(vuS#ʡC\XfsƼ|%DJ]eEY:\mYk]:B({lb $zܦ%kDF/" acmRmI^a7 "*/&!Z/Ss;),*?TmמUWbaQ'I҃4yKbL+DEC1g 7zqߞ~Wxfj65lʓAcĠ UJa={^GfQԌT>s0ӈJ8QG2%:"iJdoNmZ)Iz{b,j R1$tEL~ /Bo Յ1S  '2|{L#f@WuN4f"bZl)2dYtXCK=Zm9fѶכM9: e,]5y. L~GEhp'rQȔjN vGK~Cc|tLA\t/&} )RWyje.^GRd U 6im^M|¡9ZEH|K8rR2퍂\u,ǂ~ *! i`dǺ+SX9jy "&Sl)^)`q~Gax[lc첁J[LUJ U0i8Itɓ}vvC|NƽRxbzn cT/)nuQ }<{+ߠB !I_R8G{C}jyU'\` zMIz›aS=شNjeRs zӹJC¹'9P|CiŇ#Ù@=:6;b`^rbkW.r%̡hK0mzx9>nS? &6k8aT):<ȸ_Gt?šO Jh:"(^)FrZU@'s>cCU>[Ż1dr?pPG񴹂5abip p> Epލ o]pV|{"\0)̝ #Q}м}h$Dn8wFϤl{ :e G%ډMc^O0AMT`m_ŸB8xl)0cl3M*ѸOD5rˁo..NM juj)D΀!72,ux|Yup mt# 8oƛwfp".A>.EODe˽ޝ[[jo.Ta)7ry#l5: Ȋ(2')]$ {7k.4u7T%`laBJC>%s\XC8/>r# xb<-f7Aù~gLrN#QKj4&} a8W=>Ao;')<{a 7In/FM$#G1݁||W#)$&"HPPBIendstream endobj 327 0 obj 2427 endobj 330 0 obj <> stream x[Y~W#-6 >#@$&P̒j8S=]5Zl:ݳO>]~,ozyǷ^[_Yk(u{|'WVr+6_: CE>8HXaJBs0 ʮ#߿j&R^!b-N5e5$:oE:nf[ ƹ^qVxHM[U>҇/v;%S3Ϟwn6* w38X_( :_V\*Ή*)K @Vaqևn/ sczwsV ± 3ɦ D&**C*;ǪK! r.^8:@mn.;<$/dX=DYtQ! 9E˪m)< 좓[hv}6ɻ4x.Fp# c.*@`H5G)Hw1%IBӨjoHd*&aDQI"f91atb ,qehа}/ ~]kJ*=IJ7B5`H C:EK`˒öL&8w|0o(2s>dBƐoXi u<8w6q(Ee ^~p81挋e mEr`]npO<Cavf.#gg ܹIRg<)rJ 5W/yɸ!O2Y n}灧#MZ ,Xe\^X jAZضD@wc܂ v:u9/a0 e~SV SGa8e9uP(̸XZZ)$)@F dTd~ޏExp{T1@Hy:;=) %e>;&vϙ# b't,e؍DMhXyDǍ%?_r,Ps yWf^9+YD~ ~6Z;˦O^ 7z&NCxW?>OdsTT %z4 !_&Ő@>?IΦ:/;JN-ְ?$~s,/_ʮ7.$bp 9Tmr$T/ı=BكX dB̛b%t*ͨ%捬}^kϻ2ZŰrzLH)(\#煸ǚDf Đn(=G ;SFC_Kň QYrW#5N=ֿV(,1⚇>M;l0,D I|Yv^ 686I4Q ~R~j$IJ ˧O>$b-c5q{>G$9?lWA/uw/KrOһ(!&Rk=-r|@+G!wP傩xu;$PdcOs9Ukh+᧢ c;QPTQpfr ԶiM, ms|R#b)ɿXwuOTf¤CbGd)yxᰶq &] !w ( DiE*@14""뭾\e0ј1ٽglTCKB7`˅ï#"gExP4 d1 ;OF#n|M*Ό_rMʌ*{Ţ͙L9L`C\DG5 $hiOd`4FwU|y;tfaQO.v 0% S d'єw]LC/{ܠ|Ů7orÌ]1S+yT\[RCv f@ma6h)m_j0PlM'^/Ӵ@\ tmP0z}W?m]rHO/dݗ\.iRWjZs̰ PQ~ FH$'}MWٓ{c^>cQX@q o@#e-{^ݗBZM< x x.J7;-R+P\g90xɖWL$x0-,6(E9>:'awc{Z!-&":t~FDh4AH5%N"ܫKN ƸSb8-=8C cb,=v,խK30f1{go@֙b6J*"LOܓ>o_J̫O1 FmTt9@jyKi kM`5/_(z4f77ʭ k!><eU|H9U4XX$(R$ .0.:zX6 /Q1G EV]"U}oz[ ? 6 @J("Q O6<FA9N /Ȑ 80, !BSumOe8*,EcU6QFQW7,z, M-MȐ& K6GyؖjGh6J[&WUa&G]%(ǹ:5؉;JC{O^_QB"T(e RyF5.=$b1?b9i07yuwD"qU=cR95_q¿ڎendstream endobj 331 0 obj 4244 endobj 334 0 obj <> stream xYnE}7}#Hv#!B H/^{`=:奄n%YJvOwթSUo ?۳ ˻ŷWg_r|\,}.u;{*WW^F{'r:{&laH\^z׾҇_)A:4f3ªpU80g0q2_.w^p,fq1g7͆8w?++\!#9yZnڏU(.wyƟO%;d+6)$Zwpy6K,EL߼. |yЋzW]oYi1x$tLXf쉽H]p arq(qެE?Z)E@W+&r k|4z[s9R*kā]4ޅ%G$ؿ<g j c|У5a_1 ϻݝPHM@_&z09<琑c?+Ay}1#0~Y?}X!ﻍa0.I 㔶,}9A68fDI\L(77p~S[oT~i[Wpc\Hw@9 eVy' .sQQ~UP LK$A\bu\_u zSub]e(F(Q# [^K5)\B7q[FP(].Q-۔s܄ &bn2垭/ +;' ;e ܑq#3%Ȝ9OAspWc(V;'!L&E ARQKs*Ug6 dc a(I`#cvB(a5Q`I'%1UXʥw/[;PYVH/!JԖ dX6x3.%fj?JN q*3I D/ŏ3{130{ p^B=SXT_0"Pr ;uf83RWC?@WlfZ,E.`H~jMwm* (wcX#`a4,{-$^ @J'М|m7(X'؇ :_ͅ ҉7ݴ]J G$S"\3bBKN_"g&(*,\\F\NE''1]8au\{LY=f"{S1,&SwOf!("vJcSA^L)OT3{RdϦp}@EI.vi*_di^GhutH#{v%Eit3M!eiCZPmiݢ(f=]c(Gzdc >>Qca@<?g c8>j,9.Uxқ'JÐ] fD0bKh3]۪IpCl@фK,X`Ůp@ >$}FIʚCZ-G>ՑRU kp^'UƩ'=@/yϩS:swr|5PgV#gpyL|Y8?PyPu~\ zZ`c~S(U iT jhYIh:'F.%@ >0o6\('89V}ߖZr6 ^!>JBvF}6zR&EadqH W`! lb/|)8LD/=ΕfHdb\9t9w{S g=bew0T)#D=HB|[@<^BsǺ՚ީj͆ڕ)w`mI)ɞ!XJOd9.sx m۬rP4Bp3d"c:}MU7RvϤendstream endobj 335 0 obj 2082 endobj 338 0 obj <> stream xW[E~D?&u^BB1 N:3fA<Dxz:" rwnwQA ĿQ,΋ۓ.YLNGPh>-&эm?vTc4Fp]Lэh5\18[DùUE2ji9F2rauOM*;;RDk "+o' U6-,) KM?JzUSD@piٶK [zT8R /Ó3?|sïuǧ/~]_^?W]Lci.m|:'¦<{`^ǣ媡pLTCESnF2( SbZ}_-} qˆ٥{ͪ#2S}qh|w0Mտx)@f| 36%o<鋁r5u=}=% EOa;дFNBAb\Ӫ׫vP9G,R;}L`ԋp$povh^6 FfZu$Da? ndn1R-f,gi?_0.Y IULm(9e'J+2JX.q3bg%!Q?䱺 j2*J&l8T֭8x~<,Shb8exa;5ǘ @J)9S]s6N@5ǴQg]˘~9 آ&3jv Q ͪ<]̗k3b+pv *UPeQDpS`j,'ҩe{h+{t{GbOTZ\Ȳ0dr#2#˄:vfzO|oTIR酡nkyL\,G|@ e:ʯ2BӴ[KűN-.Q724vI.iztx0epdΚ6ɋP̟IqP> stream xWm7n#[/P\_h!%4BZZNkzJ~|FZIk pƳ癙g4{_P]&-}Uz6e%V1%b?hl5_5vk1l>z]WnZT$9Cj](b57҇Y\*=aJӁmա&+b8 ݶ dDkYuѨ1|oLdx&@[)$ `I@C]ݪXy4QJ̻p?m֛^7PL T,=[7vDUŮ<1Ruن*w}cɸw){Ѻ^`VL2&C.:%(v`Vaq85 7SoV.\(!b}T&c<Sl EZ]=llej0%#~qsknS8u4OՓx27Gy.yTfg*B JZ8p+5 +#i0,1ڤ Mo鮪ra]IjN &euu~|"P`'X]IjߢhD> stream xYY~_G~!#ɇ'HE̒!꣪gY.8X@{>*~Zp&q}9mVr|>[|~,#˜B_0nC9!W.E`J:0(O>L[_޷}_%fķLdAI!!o !X0F&jnr!dc\|ڠXom~ U V ]?`@x7P{gЏ(0eǣnێX41Q>I>;>_*b7L^f!^(⟛llƵ9f,7OŏNK #Q |@Pi)!`=~ngNHĜ)*7?&r .QKLp+qp#wy+eV\<B豆nj^ 'ܕK䬃sBuXbk+djԈpdqw2w瓇rgK*TvXæۿ+oR ,$!`B6ܻ}ɸ[.:*黿ϕ`nؚJNiAώm v 1񔫛0RJ[M:gWn9G[J|}谬hD ( ushszs5H Bx1O{֖jp\wLDɫ 9X,r R0!9دcbZ;dhe(?Cgg6JRJiiά8;AC)=RtM$.YY!;nYLVos(̽?6mhfʻ4r.vEW=\O'DžǓÕgw?Jys! qծG! i*AU Bh_L+ )(R(M=Z Kכt@Yҏ$B M3P Iܸ9Ld՛j=5d鷛PRx9!/e!keHG\rf3# 0'ٯ\HqE)5JJz>6*~lmb`4mr0OC|Grc9u(rAQ́N#(gKPpgQLJ7]'-\Nc=*nmnjC9m%m?8CyUjrܯl^{5-} )HCOifkۧ#Q7٬06?Mq$ ~9ŭt{h= :>K)).U$gEk4ZQi}$VJԺV}`%SmwVN{$ _eDС`J"ȟSo%>uwҒ>g268Rfwo d-Wd_2xQX]L3bCL*gk=ZR ӑͮ-x:Ff}FO-jϏ'-jNƚyJ4BI@!C,.RqrhpfWh}IUIB]!G.Z&F9/)޽}]Ϭ(Fյ΍(ma +&e]bFMu"_1t>[>#ZۓJ)ĵOL9leҫ697˭)$`ڻISnP yN:? n'ju՞}ҹZǶ0eTt>8L MEsE-GG pP!qBphn< endstream endobj 355 0 obj 2474 endobj 358 0 obj <> stream xY[oW~#,@~iJT K- ,oe{9YNL"8=37%lDO{|yYk:x#Ns-GEj4]]<'8{/8Zt벞WJNb+i⌰_)d$Y)L%b_r \Ѹ'a!Nh.bpٜ6|HNm:-fm:4p}<{UdAAu>ڥSIUʲ*)"ĜcG˜6b W<)h̝\of⼼dJU/y]Wm 8ˏ!Zk>zQBnS8 W9d"yʛYb)g^P uH.QpiFB,NHcr, @~ڡC@*8?rD 9Ӱ?r3[WmɅ~s`+'rHDJ̍6 *Ϸ[  v7)F3!KL6HCrEE*J8}z~ eYf f2 .˚HJ}rPlrR2We au9k˫[ o;25YU]DEl~]' 4e)SrRa}B25D(T̉ !-wU}$BȒ$)9jꨙR$ke#989~"cY> ;9WDg4G6& <69jivuWIm>}mUVc1snX.fa-:;M[MH\&z Š1 pRgu?>%Xw(G7 %U?D kѩ:!9;c0UQPH(,߼2 ;؝SdT}X(M1m}Vu&miE!7@f jq - mᲲ2 ^i u/SkyOwՉIv4|6;\hvUhh0aN{V`eADrR+HBf?/M;6İ*eyess0r]AX.1/:[|ԫDzؿ/TW6C#v϶vPidoXmlPlXJD_%R$ЁB8yfI -#a(6&Нsė&M پx[e]Ob*K8u\  }++GNiTyirZpdFlQ̷]LMn w`qzR`)| F)0M0O;4:*GܢȱYxE7˔ 0Jh }V_v>-RԍHc2́[j0\Iٯ98U[0xڸhmhw{U93 y'T* ݒ{ut^;4N|@ U= =kAE^jBw?kGgO&Y}MMmP| vGq|>===ge$V;{Yv1 6nþcRW8> $~Wasc.70kuI"L}:,~H؜Ծ04 >JK,%tQ6<-h|Ku\m.~Hv@U=8|3S^P3!٪DŽ]NCDapqٍu[2NorˆϦ',,܆;b 'a@u =%蠀SKO=stY9tMů.endstream endobj 359 0 obj 1964 endobj 362 0 obj <> stream xWnF}W7E 8p>hHTƦd#٫H]Ia Bs9 ~0y(x3|VBl9 0B+Cbv?ޏbbrqDgwr8>|$s} eDk9Q}9Uq&ʙњ*m`-\?"Fn KbJȅ%paFjY5U=I _єWZֿ&2ea bdJl+̺wƗ 0w@h3qnw3sL/we]cyM, ib̹1T6Y~j_ǠdRōόcJlY 14W&wiJ$@z`W}'¦JOa(K&Cq@@9}CZ'X0몝7mԯǀa*ӐlU("3(#-j`H[깋_E,]TݮC܅@#E͢v+ɼYzW G7^֦x>N+dKjK_NTUMƩ%(!89Q_N훮Yj#Գjn#)7= lldL>>ғ : G(.O&3[&CW+[& 4k[m* #Y-V/ʔ+7uOi!$*,GܞEʀ~  Tϫf 9jqFQ٘fS\1Uվ)9)nӌ"wj a d\^Ȟǜ#ס~ 0ؿ|+e}{cvTj~US|xܿ.%]'ҿ㵘:͢y(o}p]at kӦ~ 6SQ~, OnCc(|k% ,-|`H3D]*]!q'w$ԗ1PO. T:}99{ d_Y4c`Q-X^Qy~tv;lARj=(*piQ86{> stream xW]oD}ϯcD^H@+6H<%M\jHvZzgNEJ33Ǔǂ3(xx~x, c/_-E7¨bu@ya5u/.}z..~ . 2'ӧlzSdp~CHk üNS!$w.ǞK cM2/b:I)ۮ%z'59Jnȸ}NVk'6ZS~ {ԐP ZD:\KCp HT8,jpI/Z]U;9y>ܸ۲* #UpIb<."'Uv_%dh Xt}$ !.p+Mfu %$Sh]~#!O2Gm,>0|N(k3p.xeM0yto.n>D A J\ݦS +lLqX꾜ANpŚUMLj{s:qBJ3M=x[-C[R3J 4\Xf0ViKTڬ= }ߗm TBY08mgGp C4m sX E)IZj@0V yQ it2☉\=%=Ӑ'o-"Nϟ3IZu.J ļ=WOe=J1s=\YV-r0h.Bω]wRur Mh!* qpF'2=)C<w"vÝ:BNi'#Tw3VꓱGy;j]elMO+pY8jY;~Hd0E5H.Q`x?ȐsI Յ+3uM /(]s"Oث6]L( 0\U<7,-sA&f'د7u+_d4ZT뿯ZU=Lqs52S SؤJc>JP.G9{| 2aVqfFN:P>ج=ZG,@ Ef&g֦a XH|_v63^5mf |LB(h9 B7v%G T'jU:endstream endobj 367 0 obj 1198 endobj 370 0 obj <> stream xXYoF~7#{)ZMk@>䅖鄍D*$e[,q0`7\|_P 3XϾ2aU1=/q+ٳ_ oT~,f ߜ={%a=6 \e"X!NG^dPNm:-C:4>Po)IS#ML .19rW84[.V$gx}UV],e bEOU2gF eac)*/fyT iɨ\޾ZtUsdޘqC<8?mGó# :$jdeP`}:` q4u6Dq̾kњ:,%Ԁ5 d}m5P>H) iN;5xѾۯ~S|ylם~nǨv;u1O V.3QJb$Yx;DIjtM q@n0^{PBY(uj "\(+wŀ3"y &WXQ_Y{(q9p[7J? $m Cl֛"&EMj0hvZ,S*D{'!6P61U_JXe|a<"P${a9`>\<=b#>::/f ?u'|#ݽIdtZ~e L^4  C\?]{ &Z>H3L " IJBsJ^\TQzd0ӄ )&JQjU'X $F{F*P>Mx/Z?4;b]-TmDr4SҸ}|\Rey$ln҉РhR*P]b0Ggߖq9Ve2ȍb&cS96 `TB7}ф,UAwG0f2=Ǖj]}ݼIZ[7ِJݕЋeHTδ60],@6UXQ#C%^S9D4I̧h\j'6eBJ뀔y10)!P`']Zm>X3`}B 8͘Tf9<ӔBD mYޤ2k(7۟IY(rQT+ IjfG y#a@:Is;.i"wov]CH=ܚ}靼TJv7qvȹQ߯^e js6ӭϽ93c*y/ױjQj*eb}Sn2n}ySޣ59EIa+[/ۍkG0\rNnXbaəց˰ {߆9 n×];6AU}qZ@ZlXGh仚̄?d:Y@PAr(|wGꪻ#_~Y/kϋ^endstream endobj 371 0 obj 1867 endobj 374 0 obj <> stream xWMo6:fE =fm(hKͿ"IE f< Π']g-Y_N9-,7F]g f jvwV..e)d\s!1fΠU>$RʇdD|r< VhS̏| sƻ 0R:>JRp岏FCerDqVtO1*)E8/9U9Kb.‘v՛nS]9кE ?n?o@l.zKNݧq)C죧hHk*M526CySDc DF˸H PYMY25:r E[%M)&s8%ssEѶpocCŅ»+%1$ 0 Pc ?: oQ"2mڗS(b7|BFP["!hx]i1Ars9AMUcyKgy§<$?]MG^H79D 0G~8ǧ&"ImΠ!23^;&946z睬щ?NQyB0*pr #q;N ^RnBEg@,2N&>B!_ikGi(}xb`WCWFyJ2j IE1Fh!]=y9a*InHSG겯VQtoU0mT)?˰lZ(RSDzP殌tzOC/" XJH8A16%UJUxvCE7V@ }^2.ۘ.R ECWɉ )Q j}F|)/ɟKe2M[E':Y)&+Ŵ=?z];lyNԄ}>)MR33GgHZ39ǸPdc]jY /z߂ȋ%MÄАBC{tCr!&^xұ;¨_V{U{!4u)4:7u7[:T|.A> stream xXKoF 5ξ7A Q^b A BKt@?OQ"em@ ofg73\Pu?ny~WWZX͍,fp (Bɓ'7/?rTSFp]'(šXK'"ܪxtE2ji9F2 r>Tw*wD<[x9I gra0{d}UVmcW49J*j" VJ+bʬIza|0oDdΝXB{XWժ*՘_S P&J)o͜(.7g{y4 *Ux8ڏ`\CRC ͑y7ҔH}'¦HOʒ`tށ !儯M4Ehԕqxo,57MܤGG>xw[Fss BzȘ *4X?[bF&D΂1L*!v̝]sVݮm?$LT&)ʗ\D.Lgʈ˫|s,!l1먓1'րaIwѭ 5V Tm4\]H  4O43C4uXmz[@faF1txyʊ]_UݮgeHݗ\VE^@4^r7U5e*:^A}^!;d\1=L|XrS^[% DC&1{ӖMp,Si~xwe1ȣv#X~+ka.3`{j\3,$.s$%rQ~4o8b."L`7QoׂPz:҉OB&e=_^۪ mHaJ˶*ɋ:++i3KED)xK!yZћ"mjR'P1:9Q:gܭ[mˋ qvW7U?!L8ˀT{`z}?1`xMt3:d <rv[Te%\2)+P]X nz~}BUO<8uS$kY~zlZe}҂Rqb:S{U%˽9^v /$dIJlڰaa;O_gۉ:endstream endobj 379 0 obj 1623 endobj 382 0 obj <> stream xZێ$G}ar/XBڋȻ#a 鮝]սk!_x#Y^!K\]qĉrA ŗ_._Ɓ'\K}8)ei-bUHfve{-0tgS0&4Koe#wtA ^odUmץ$m/ A(Z.'4 XU~1$&> &V1 J?$ÇspW/#|w!mI6AbG^W c`l)"|Ƭ3nc чB(u޷(X|jWoٽ JL:zʆ >a}O CݬƇ=nT PdlȊa/M!$9p4O#?ѬkwA"vZP5'* [b˛5zPԛU,a!8髄#VUWэ~cҮL"1OQDTS6WnVc όĤSpvn _ bi&A!=\‼QFπ'Lf4oBna{~+Xť~qer]v]& GZ'i14O7 Kl~ }9 ͦQ!8.DӾ$N(].y Q2V.r:{~R';SY:7lugrޟJ)|>CH9K V#<+W(w^B&+欀ѶpL] (|xWb>̙!PJ[\(08g=& 'V#M/PZױW/c1(u2\ 3a}C6pBI5z)$.·$DS}#il*b `F 4%;LSbnMlOvvb6Qwiժ@r"2 #qAN{XrK:-L~$daRL6DG欎I*W&ɑzig{ 1re\%gZ`\#,}}s[DHU||; >5HL:j :: mBxp9HNhzH)4:O90Rk]t<$M2En.#x)aSLupNgi]Kđ=G5jPl 9 f;-h'$)1Z%؝i"SXٔ}\wӸ\!B'=N9,Ĺ: Kp'rmĨ;0#M.P_jUR\ǀx(R^7?|-5*8?\B-Ov$}I_nbl1jeXE#"H͌2i*4j6(@Z UKt6SPW> ZA.Bx~>cEi#sSvb|C*mMF5W^TPr/1w qvXi Xͣ5j;|)ZrtO@Ur~yO.@Lp-cyj'm%q9AϠ>`uRĊ_A7@[[g]_bYR\;ڶmmg52G$i^!$f,4Cܥ\JP|F{4s&dnkuVHMD)KfS:.J܁I/Pw᭐$_/M7_??ضo|s7=𝃧;/nĭ?*\D&" >*ۧmUA)_'1]ߋ0WԂ\AQJPB:+~c;rxs{^khҤ;×4ҷ:nϿHs~hˇ$""\$U_ZmX 4:ʐLZyae:Li'{9m0<(6m,}9_Pt,XާAT),grZǚ)WLAz2 (kt㺁w,6|f DЉ׼ӠhQ1LyfC֠RV=AM(_sDžg:74 r~F\*y)#*"g,'gc zg:'mkyVX-I?{e4[gڣN(_|է7΃|x-ୢ^{"P pyOB噁 bUozrRQč.slUm ]3C%x mBѡZwY.6B!."\Ʋrm7H>$\4c3F&//adNs=EKIV]\kO:޴`UW |\}XW Bܙ >{^Pd&ؙs:Qԡ|w^Ũ[we -j.GAꖟuhwMxt%\`pcw۔6.ECʩI l&~@?Zܵal,jxX8AuzðA!pA)['qc~QU D!S|Ktq40B-)&ɪzM"qJplfٮѦ"S]]782*RTqewН*EY&nyڣPiAP8N"rڻ"]G"L]+-WOAr}*͋pƷ-7J7埨L7#h IR2O_ Rendstream endobj 383 0 obj 3584 endobj 388 0 obj <> stream xZY~_G[l@C}8@Y6 d;eܪtW5l^9QǸ gΩܒ*&Tĥ_NDٸF/?"Jn7)$1+o?LKт--oI.$ )7[nHluWoBquDR5Zp^%i(ƋIuMX7-3Y(EZ_PJ] N4B'+ye)j_?pSFÛ&jj՛жIʾzasVkU[pA?T2?uWu+>^4DE gi&22]co۠?m2oނe`2@jZ\7y_!\4H[(a)5jfM t]5UW~Gh*^Rߡ6nQ}j3>R(;!Hb1."a?}}veZs)ΗZusVl h/4u4-uKR4r J_]eOd dEiǛ{Rǵ,&:Ń[fW pXؙĠ -rnw;Nwʾ'}0HIN3O?ݫ:5iP[jm18ϰA%F*$]JF"@ z;0Z01C8l{䮎 4-$܈ I Ƞ)1uBLq$*ahe(jlVHk]xӾR w{|s <[)*elfFc~Dϖm7eM4֒"W$&,d;$8 !&x(6+wb&f+S t?BJ٬lmM̜K!Ƈ|pp Q}z@%b!G$aK%Fd4n&5G1~>o$L&g&{)*p9;sڟ2A$$&2ҌEApܘv 0Ǩs_FQ?BC}Px@P y1jXdX8'iyX8{3 1 !`LR2P )7q`P`ݓ-/E_~І9\ٳCUnG%0 nȿ RgZ1Cُw]3LuUCT,9f9+seU oCk&{H ГY4o)2. N Yj#=@^uCu5jpB]ܵĬ@=?~{h#w]}tÚɩROm3r_k3i}w_q4CkNzQ?'(vvl:#Fu$QXU:;ҘeM󹢥k(5 ")O,̧2d?D i,XLܼk*1jMm`I/#/o( h ڦ@ѪCD9FH+iÍ/@9`^GJr4P2TB*%Yw2տ>_\qcN]a;"+@(a7)y${N]8r|A ]ΩęZZ&=F x(&3<<3lѩ=hfWiMXMG*.Ҩ2\BiEe^GG+<^"8Y—FC1E  SCQQGLZA,Je\;*b$o~(N{ c~l6- =j_Gf`C@=J>iuf:\_`9F9>Rǐsj걂ee´4 "S[Ⱀ2`JD p4΍PZЙa=>G;ᒠ)s0) fI DUgG0O7CM :Ǜ*hڏ" fzRXN9N<}9y;*ȒT\)"?t 6*3gPcC'2H/Osv&\3M8mrEEPd6G9'\){J{xx@ڳ+XliYڡܿ$% Lh}uUB{iPS".8atSyuoF.*?oyi5Sendstream endobj 389 0 obj 3367 endobj 392 0 obj <> stream xZYo~g#-}Hq HD!pwHT_s-)J {{꫚"]//>\|XQl.^le ]Yj`/~ƎZV`۷n ePƥMVM~ -h8R*F#9,ݑFpn|s jҫh6nVͺ\1~) 6sA B2bj㢆_ʴq$2Vք~[$+Qk%GXs) "@Mf?ruWwn7ƃnNM_7:]{ꪰβ*类Zr,3&mK1^H{6/!6 E&}wq.&_ze!Hf-0R}gDrzD+*.J!(g o|c%MKmEXU.f9Kbl2&X}X-w i>МwN]9xWFq VP3IP ӕ*&,8mLK7}pMSX4XU8I[ )>?SjLNeCe$&"KP㙡S|BcoiuaR{l܀F(kLX.ſ]4*C[obB&-P!STm۴QxtN7i)DnQF3(.N,@&XC,p(f@P] ]yޣ6_7XdϗK8L\p"ޓ[{Rtt@% KjH +OHjQY,areJ#9Lj31IrwZdL % A0qk_5ӻ~R$ETǮl**1vWQnvE@åX?cLJ[vq ]Zy(sԩS!f%L{lA`#ӃQdCvO3W'ZNXn ddDM9uxy& Ƕr=0ܟhxZCP)1g5mۜۗץ/O B:> @TncmR>W?& [" ,g22An (ɭ`l( ª}\ زT>"Y1 6U&>O M\;s*CQtM "**s &cy :u'XX>x,P!̺u]|qg7>k\9ږgQĶґ.9--$ɻ9嚸$]É3AAR>oL~q ͅz0OZNnnFc,]jTl2 1SXB BnڂKJRG &7͎u2HN0i Ѣ1'sMGC']=։(a8%@uf ;<寘Cg8þl G!:kK޾ 4Ώ@K;OPŷ@BPή)ޥI:@,s4<'1ݽy_N?݋H !޻6W{^8QEI dٲ5/s3}_}Hp=z1U[5I{cq*/&5a:FE#(Dˮ/>&Yq!j>׃[lb[8< y_6{a6kjvO(MH 2z @X!"i}4 5lryԿ CFU{SlC ANǞLn~3bqzݜMY!O|scNq:ڍ{-ւe9$U>]f Y*̜nϐ)sL`vk_ efo V'K/vncwoP.MÒu xӞ)=*.2#ɠ|`v_o%N 2,BUmT<W'C}&{"ْ/p%ׇj6 1|Uus=4Tf}TI V7Uڢ/wgkAܛc:n϶e_ǔræm17A0qJևaΠ>匿?/ܿ^Tvendstream endobj 393 0 obj 3350 endobj 396 0 obj <> stream xZn$}>Ȑ 0`[A^JEFMUQʰݑu40cdˋ/ӊ|fӊ_7Wve oӫ9_o_ZawJmp-4Baa.ڮ!rG o.@L}¯&i*|2+nۏ3q5p~ oQaIC, etw]TM b8%дI%]+b>IcMSx*JscVk8`~4e^en6KO*:EYa0tڶ>z+Wxǒ6uyEH[CN?&O*.pS¿)^(u?? /% h.ZH:(\%w]}fYC JpKyL[~X+:mQym:GA7*3% }ijSz7HCt!K<ǥw s6]I|oB0=NB{ҧys I'`h7 eV7Z:` 0#jw-;x>y_]&*<4'ꃠږ1=_\9 id>"drX &-\/M/pފKSC >#|\vEl0')4CI^ƒ7·3N!@I[x =ܰwEs*{Ƕ `)n!!t*q2!yCWxdev2IO Khz i1>Q Myg+)Y2891DHH@ё ׳4_0s3WH>C=n#.z@^a((IN(L،$7U !̀U0t " C'(t5v¶٪z0B ~0/`!3b2)^+fy<8自l,E JХVNxrLZ`? sR*xfV Uٽ /9ehK"hE(TH^bճߣxε_C4wLi||uhݿoǿ%-@".1rpAxl{)̼ &\ 4?4DrrO4h`iB..S(^:R ̈AjTGU1ccē@fZ Z (b/K BKP>Q#J F(Hȭ/!Dc@4 ed7H)T(/[E0̐aph+h3$2F-ևy| 1ó`8M:|]1ȋUb,Ղe~V_)q1EΔ",Gbi,nnDtHЦB/Cioq+A&hY #"u SV)IVBѢJT%8G{2 !IhB<5)O<*:ciN+#"L#D 郈 [oRuTQ.V2^tH:/Bp2~W2KD'?GUp"_zM!\@$ iWSP"4Dž&mu.vYB4QCDޒHUͱi(+"M1+RFN⇺]8"#/>-ռ4\L͸ 38GQ5)70Mo/ۍHIg0E,}r-f`o,c'z٤FgP[;Wg[~-jϬ0QJGW>?S y-;(ʧoڃ~qZ=f )wcAVd|w;U0ɣz``KY1S1jE` ^Mo EeG$&Z!>޼7pc j '撓զڕu$**K=E>^E[j>9HzᭇLάa >>1/$dJFn= *+_QbLu̓lbF+@게WeTxBs4̨;M*{j] 9&K6Fp!);ɳ\~\8<zko7ؖJ!d(s}5_~(4[µRrŬ8IBVL, WCv>04F1q$h-I_h?T "4.-PoYt'@EDgNˬ42% O&^XkCn3 Pl#%y@73rk j**4'R鬡[ʄQ7Uds.0p,;Nq@ v7/^INiӿ N3yFC% fKiLIn{0͂0=}!If'Au]S}(3=W=J`$8w܉&'in[- YW)Ɍ<(\D S¿yr`4?l_\Z\:PJP2Yg *6?Ns:OM|eMUurPx:&TIuvk2~LPOMk$.+LƏh%FlLc06J?L=sswY<\Hَm+8-%bc_9_^M%B.JRN . tt ɥt$ ]|^'))]V@£ <9A8O2:6?A6y,7j/`n)> stream xZKoFO#|LߏX &{0p$f5"[&)J8,T]ϯO׬,K7|3^wxq oQ׷wo ڳkṾݾRnOzQ8'`͗. eO~C[W'- fI?OZ{m oDNI;]xJ cWi/Fȴ8ң8~x\顅g*qdnSؓigP2 oulV/xꏕԪ` >|[/6ZBh.; l_&v exdE* .GnUB Q= B6aw>+P-2>^g+qs]hoUzfpᆣ]R9`J|Qj]=׻\)( U^8 ⾐d tܢjէc۰hD/Ċs2.Wd:80Jā)೟hvu$`2iBJܿRRȔ_T~X 8b`L,,``jw[*C3 6eNpv_snZ mɏJ{IxY `Lq ۬M5@c?`,XO0:DZsJLNR0.mĀ  r8XAS$`cbϼۈx]LD+#ju$VTKbşkq,^Y/)^Hk<Y)aEsA鬔4Qը?eXJWeZT,: Jp7K%FaIAe8AtE~`jΝ#QA'8/ >s, *"P~WN+.I#;!ԧURjI{uhoR̡ej]"H$oCnI2Koym ա;Pb$MMV09m֩NC(:9<.s])z}MT5USllǾ(ҡH.88cmI\?Z$ .`<`6u=6҃m$=w}n2b%dߵQWNS$:`W=?}Oq(Jzkxwܭ]?t(QAG|p&Ӓ 5&]_iBF/7s|zq}_M|{X_tU:Yf%a' -rWe 2~Xo&2J "&sR 'rCN:?[ 6H|jZQ6QiVT1jͨI>ziV|bZg in؉*TL({x%8) u Z8(}h6B%2E?#RDޖmSĥ?7K2: ilۈF=Ek #Wa"As*Ϡ UHXH걌@ )JÊCSHX|BҺwPn w:Ɍ-/7d\z+S\%4י^2IA:SzDYKnt&܀(SESrX߯Oߣ02A8e}nBD1!!%n <`W#z5K @(&NF"6z##Le (<X-,6˳+!@fE#{7U) tj' N y< C ~ȯn}z)ύ2փx^iCHOḐ;BZFу `'6 (z[7Oʂv8A 3$ Ѐ[<59$AQPSمYG}*ЍY%`aG2^mFT!YMJkS hM2hhNfqP3[074AoJ͒0_:_4|NJqy - L.kXMHVO`cMqe-30 pQ/Ҩl8$@DQʠF[{]Ѷ z*{+$==60.$tp B|"Fg `ȐS+M-qy1; /;?HfgGy+tv ix/kl532=TO8^RŸDݕivj&YTs#80K { 4j>1'+n));#H@Nq&ɖd> stream x[Ko+s\'ߏ5Y6up$ڣYcYA~|_C5| ؅b_}UaA OwuÂg/WF*F.n. taY(]hkx7/rD, hzqxuDaօq܉pnU|.>԰|x2 r!>oSGКP}խ,^_".laS\BNweV%T7USmWcH:-hXҲB& 2Ly "ld֝IzaV Z!q[_4{YA)jz[]zi^0m74΋[W[hQܵSZ\26$4PJ1/{DgPpzq5!}U ,z-?F A?) A;u4)$W`g${g((ai+{3~6%ݻ],\Yc=lk/d B jI Dgͧg79nS a>fk_a_ s!f׊ b(ebgL=!ܨ? 6֣dZQ!e!ę'/v'6}z[v^Z)Tp}Բ&n RIc7UD燆_z&)>),ElrMZScEЋʴe@{Q*t 7)&M )ā>Ԇ]Yы8]) we_L/i,!i\܆V@]>O=:q52yzxb > {#g]xtEUͮh6&f3.~L^R z0 $rKn+AC>:-XNs|2Tez5fjJr1<)6A^ 'X0e>eđɕ逆)eGmIGjaN) IxjlblPCW(HWq4CaK{"uVŞvi36$lIeQ#+ dK&ʆU.ߞ.AF| #+hJb*> > K>ඤ1 4j%.̔hIU93TeufB]-FX&TcsBD%WѬ ic?cfBB'Di6qGAȄJC %Np0U M$Qvaҵ[i6%\W5С+M#V2P9N#rx0joDrCAQ5)_pTi(bvlڮsE0 މD\66 䉍 Љ(PD=2>t"W:\pP=?v.A2˔1+kF@c '%䚛2Ƃ-(A?vgXe8U~J wR2HF9%LÊ|rX&sܑqkTSjba{y>Qy Z' 2on$>2#ly+DAyvu^ ⅋ׯS5`re q_>.$ IG'k`P%3Ix<{(25 y% ,輽  j0wZ[:g*GuWurtB"' NiuUG=K؁а=GN#cB4Tv[O #<F&,]okK"6ʌ5&l4Nt|L-VMMIMPEhM.扐µ҂%7Asd Յ#28hCYF1#[\~kB_6.ӮQTeH$Z"c9#R4h n؜\?T 2Ҹ^l[#ɨ&z~LЊ`;Y1E|~go4l/5LrLLrNx"'i9濽 C,, ]GG=qgf.o 3O[9R@b-lp:\Cr\Uyy1/BD\qi`7$a~`?% Ѝlx@MC <i/(w{(w,mf Szc~_&(ݍ<:[yĴ跬Sf -rbE(WL&&-LLMnvN 98ތc|9&W44p^R.OxӺ;2,l]c<<:V>IC%/Ћ4čc=T-6_IJpEG{x C -c2\1! (kݘ$_/[m}*nD2G 91 {i548(f?ѴdGbKTACe4&edG6ϷO5ɳBkW^?[endstream endobj 405 0 obj 3609 endobj 408 0 obj <> stream xX[o~#_@CR/kr%mKriʲwef䒦\7K>{.sf0Lx)Wf"z9 ,Xi*gݮ^F{dKEH em}W͢br[> &, NyT W2V.]ιdKfwov,(+UyI (O)/բ/kpOeIj[/23` A\?:K. 72驜\xIg$3,D ƵwU\U`A"?IozfDf3_jte7yΓYke{Wxy[PAݫb)X'8*0ZT|jUUzz" X?oULotfBUzk\ʣ}/bG?sI;``(sqF$j*337nvs&IA0"@~~;i}v `֓)ӊ_kC"c|+bZ{<L4Mܣݱcc|?3漹\ɬ2% `hE Dˢԇe₣[~QIz|Swtz.IFHM7h) } `* qW{Ɲ+ŢUё*9cQ<D2BXFy|Ӵl)ȁSM&ox0 +@w;Ӣ߶:sԁȒo=|"";43LbbNyY2붐 4%zJc>"<b!w6g$BFo6U6+,`O!ƪAHjߋLȐr dQ!۰GU7I7 /qRu[J '(.#KBnTxXSTPb \L"'1ͮش!k 8M!OH$rOZ8R6]jA˅H6tYU(gXqA݃aי3cMFc-vͶoͫ)dm WdB(u!wAVAƅwev^dыwE;3 D+ ⃺@%ߵeHJS6U`^ (ڄca9v-E v K b1tԀQNWdpzmQ8MJbZ;VHgIr+1KkGY^y.Jєԃn2BLN"yR >MrO@+dGOVTCX_ Crnܜcj]pmlLlRܥKLCH28Wt9c cn7M Ueh^BM^!!IEGGޮM=_W?G\R`+ DͲ-TTz"0_`].bl{)ROTK*6ʕ`;y85,㇑+mȢK sGN= ]Fy\F S[+xʗ3^z{(atmU<ڄR:LRk7ܤȘTx|iZ {q-P 'ݯ_?|~y~yjC?~]sQ䑵~=paBv+.91"/RB&1kC?vendstream endobj 409 0 obj 2052 endobj 412 0 obj <> stream xZ[oF~GAM/-@o]6@KVgngD.p8sa>,HI?۫Wԯ۫zJ]XV2JZ.nW_- ?_}D, hzq}7ͺ\1=߹-4[HyI1qZqQa*mDC\;LnIZ*/%Q6Qk %vaKNraKa8[/R(~[].eW$)EKHju)QH-!%cjQ0T~z9wS y^FZres]n1j`pޫAI}pR 'ygC;̛qHcb?Cp RKmͮ=!rF=ڋT)礅4g1%OŒ/X^w~eP9Q(-UNRTe!:<`V<8MB0Jf,"Z_ylf+ ,lC`U8%(N/9q4miإGT\}ZWqP-b.ACA{1Zj%42hKUP5,3~NA %b (ic0 *GXlx g.5:k(Rģ7ȓNn7e\M,J. :,0bYROx(~77k}Ak'|?sU@~U@2!]$ BcN X:_&- =>n9pB۹rx0{}`掱ٕY"TB7P9eT7OXeenw! ,C 6Ėr!u~b g  n\|Ҽ}\#BۉVN`D,rd\]9Ej izy*>y'06ڷԧ#zH4> stream xZ[o~7#t)-Z`lEC24Hv}\(.".@sswyE "_fkǛbV1%V7wWd%0on{쵬0n eP҆_M$yAQOHW tGw.kVPÔ^'{?aoօp8Fqn~Znx2nDcX; jBkBƿa[D+Qk5GxɧXs) "@Mfr@)*r@aЄE&dT"_jA2. Ai<*`-j}[ X/f`0$W7n-ǔp##&y9܍Vt}-ou^x|߷q-[1]HNu*7x %(*3 kl!jMee U )!Cl0ᄍvP-0Bu.'(Ȩhn0vuW7M9Hx!=c;uAf|Zh3Jq( n ҈VF|r[o,ar*6܊KQhj n0ʶ 9("A_~ c(bFi[ &az!ĕWԢ\ek+-`fʠ8A"A`RY`e<9!i803p R-֠G%*r-F~#Zϯ= "=Hb I -xLB`3W"r ,L#. 2p7՘#]1D%|э@fHdPV+˻)6?Lg. 󏇐g :ݩQ.|7*0A_^d.AϹggsDžwhMT! #NVl1snCBqFP!@Xú>_s:BI .u`1u2B"S8ʦZSTK[nQR>)BL"ɃNM@wֲ$Qf;"22.~d" pbxovql F'P'֙ ܟd sWr#6ؘu %l| v!S=y{1WTf q UV,iI=`A^,1RR7 p!qv*owC ů QBSNTwkžьp̝I HvuW1-FPU^Cm*T](f]|HIH~e2,rOY&XJ˧3e i]z0,%>F k0E\'N 潮 R'cRY&>B>iKSLPր*gX(J iǦ~UEiΰ[t GXK".*=8"dی@]XiJXϩtBuFPDC%Rg,QeEJ%HAP Vܶ9Wڤ&o[7e_ubKLJzJ6 1cBZljWҨ- tJ]]u"I0R$|/ꎁ qls0֓ Tmxx qiXZ.Gд^Uj)D^ܘbr8y *#XܨzIPn@U-p:;y&5NW dq-_8`SETmٗ19&ɕ2M`IK=>\9ɡNTfC4(З)ڗli?O~嗙d7pڠ6m}ts~껈TeF\5A@Ԡ{Y.آ j[ EiY{ފ">6\jG!αtfk(X+o0HN,68/9ӹyǠ(A<=th:@Ee&Rupz E |pkyfpbb@n bJY Oy[\ 8US@ Asߞ"HBFpsE/+m>Eѧi*4G}=e Ђ)jՠF$*.| /}P35ل YK:v5 RNKYrԊ<8u<`oz/'T`ʾ^?#զB%@$nf ]ջ}y_ޚS> 9\<s|O!i WQ9<7KC]HNcX;UAyƻuORL[* ү%-:/)5?L|V6Coh2>.@?-`R3Şb24ʥ Ub5Zetg"Z½/e $ fHA՘D!R%Bg.ZIR}N {JIYu?_>#",v2DRYʇ!L=نɶܽDyݾSg"=#ȱbK}{ R;`ɜb wqHӆ$$K½yejV2g4U3ԃ/xB=pB  o(Mx؏YԠy3 J}w`M?tDBhOf-<=aN'CY]zR#S &#ϰ&{1JfDJӽ|F۹]<&ٻcFGA# 5:G/?n6G?ܿ\(_endstream endobj 417 0 obj 3158 endobj 420 0 obj <> stream xZ[o~7#&;.Rnm!~%bWm=Ù9CJ" 9|g_ ׳ :?ٟ>iP͙.,+ ..go. /}D, hzq:{}ՅjY+mܪtピV5ޯ9Qq.™DsjJ aoj'KlXsۅ-bJ8˅-4l2>Jd|S}Swn9&|ESM_I.%)lB gYTˮM!f&JKZFΝ mFO]v1]r+mw!XL~*w8'%:[:;NnJMU<ݚu)qoƧCt mvJKc۳ 1~Y}U28qђxJ3xg64n<"D(`Pŵ GG<%J,:jY\{r|/ewW[D& `R2f Qt7.=zlM}ri%Yղݎ?HțR|ْs<J CKf!T%4:aK||ܔH8"2.յ?YRt i¡^}Tb5>| %Ijh [&b9 DPWǨ`Lw>[T_}P)w@xpv7`E^ĄKß͔I"..XZ2X4V.W$C8iڰK! ɅJ#~2|UXTG:%bZ \.AVD!-_!_RRxA >ʔXy~ʖX7m p_T.ChT2 _7';MGA@VfZFo]6 `d+Z5B+aw[>qŀyb!F`i[5jzrf\*Tp<_{[^:9'8{l#̕ŏŗy t`&Z4\a!g2hBEV.Ϡĥ>Hh+S(0Ђ(*УxNE b9pɮpQ(O5팟vnq]5z 5j6LGBƠd(&!tUAyߛ~h0X`\Cg8fہq.[4"))`O,a06>@D qj(#(T T$\+mcRQTOG (5=/SMQv%ᡫЙX9ɴ'l\pczT۪-"M{fb&v] HB:ԅ8ɛ،fQ.C$M G/;CV㌉m_A]eS<$^'܁u Gts<(: ZRjCTK}2?xZ5D/7v8XNLhSE m/9y:UV`L>K5 kŜ aLᆱ51 Ft.)t8mJ*$_\G*0MmxRsޜJsbY%eLA myJ=J)&" 7 @cYq+!jpTpׅga xs3B.ytK|˦`aGrw5ؾO\FLJi(lJhR{ꔔY],RrnbbԼƹG|I'¼ R\{#0{7"T?yÌ~/ vRXpC#Z̋ Քvfjǟ`5> beMmƅM$` :鹮n5c2_ # GmMI47/L]i,<};ԥK0x@.5x#|Ί{S(o]]8qUXt!XI݄'DǍnLPѲhX f+w: PӬOc @j\˞L&@H,qcP[ ~w9`ƳrPl6Gغ~I~}T#-<\*({tq|SmP݅ h>Wax`эRԫ[`J}?_Zp0f$ H[bIC y}.c)tb?9GEG2`QKł=D!]5QjqWjGe.+Zͳ(_>FfL~<վhm&-ȭ'-ҬG_1wCu9B̎ 4p|_Tu_]0 7̨טn5 ;ľLɪn9' j@PxEw{x16.85TqkYJcU p؜=8|=N=/1qgsB{ރucmᙏ3w#Kj1^|*ǁu]yI7~KݵG__~)ar#Lc ?=ֿϗ[6endstream endobj 421 0 obj 3009 endobj 424 0 obj <> stream x[ےܶ}W#-v~[|K\8r jҫh/m\1pn9o~xᡆq '*>>M"weBkBa_D/Qk %|RD2usKoX[~x[8|M6sa:.tP}DKjNm}s?PJDզ/wa t4 f{ݪ6]coXF BlY Gʃ~i>ngJK²ʾnLB߲a} +J\ZS&2ڄ+CXa,ki"%pmv2:8+v6Ⴧ%VF#˷j ιqw ڄۧ0`"1D4j׻` p ! [X𹂳2;L4()tZjU}燲RKׅ!Edֶ/v6֜@΄#X'ø̱a,b| |l09Srf*6bZ@2`B,hܺkYN1p0/>VH5Cd 𐥴p-ܹjBje.Z߷Un o Y>ڸB,f"lH_mQh&a&6!X|WM}N03*It 7L"B8cD̬F) ;Gkc;m'eH<^IѨ`{WKuˆ BzZ"@K(-e ݌,3Nc)-(8-0q};ȂY`T%RaW6X/,!<.&|)J,e"=]U{۴ a1N)-~9󔇐)Dˮ[z=.fUK{,c(C'TG"Qm+Lʔڗ>3GriLp?ahݕ#8C3R>1=b$pm; p29:bi !u'_ $C\>XE)x> n[Z?w,M +s^$`7è@'mn_6 ǶP7.1(e[[1aǛs)sSk'Z Hz:23<-~n\9#E%"N@KIny5Lu qSgܐ:E1{ _ +Xw@;%.1%oTpd<6v}%4Z^FE 13H.>TW׼E *0ڵivO;TF.t6K"PdnnHCUsއF ::qf\r@< ^/o~bȸ}1$?%AF΂lmX#'b!-:D|צB?3 ^Iz Oq4o J%on] Yvi(JF7A #xl-/_/L|˸5`p:D;)z7x#R vK%bTwE)E\).1c`P7cyHmU/]R>p=V8<DgcC(qdu8?7͘r{ R/Z`s>xPW2 ֽ/}(q$ pFل;ީ8a;,Y^lM{ܝc'xeLȮmdEQl,'4,.ZsЛBqKy]1 s9%5d.,ҡb猹54a=2a"L[t#& ݁X%uB/b&%ǔ\@3 dS" Qm]Wnr#!Dw8W:y3Zʑ'RHT-9u]MWbgXAO1V4741x)!-ZE׶Hf[D.1seM)iM!H}~S' *]Ea]Fz~&S/i9# *Hs 0ʑ6SEZ8yUcOD Ǻ`2x^lS'0^rH L\tI-*;BXdW)QUu Ahɰp I pz9V}}w/r:YʇwPqR9A<=~nHDEA1L.ήR\s^eQ-;"n)\ J0X0,.H1sk>'?I)^2/ꃇ-Rp> @le=lh**-$@3/ lOY7lb n-}h|M=]}OE~rK,„N11@JNP[#e9ogXдBubҠ{wԓ&kMsN2;M5ҝ`nj65kM?*d(#]k_vǵ .mfCK|[2@OSr-(Z u_~"̨(ul5HiѿDKDZl8-&LNS POmPm+96[ A aǽn1xP/Jf_:xuC3jј 7d.s?Ӆ־c'cej?79"R\깡=F\$m< {V/M)ECm> stream xZߋ~_ y0KlCg;v $ChweHcI%8HH{TGgmꫪ+ V ۫o|x^_څ)N/o |E!8_X{(_ykXհ z]\ocb[xiša.ࣛ^`9|id&->S8tNZ>tg{ZF,WPNr\rxYlz3|ҥx^nɽ-45+X!YWϮ]+"ウۭnT,]F>n1*ӏciͦUa$ݰo]7( :>a-" YUM\ wb*ۮh҅,x87=5uW-Z %4WǮL΂n6F&!#QHh?\DH0,FAFsJ6my6zi"drzsoN+Y ڕK.iW@ڂYJ~mEaڬ pSqi7pRrhإuگoҵ2侐ܖ/]KGW;$|mH4xo:x;lo GC}&g|p@W~ޯ@UN(iy%F\ZFxuY"AZ ^~RvxRi7flKusi($d)J\\d;Oz!:@~__M9[̨b؟]^' 4ŐGn6Ɩ?%p>1mi8ǎc "ǴH7AnzLy&Wlۤ#02g3).3n իr&k:W]]oȍgKNu- yDt¥X.c1~B&dpV_j^th?ir#{ƅL=53B SKP eqaRVҁJ֕cc$ٟ .oܝoVoΥ6o6P-1a"7SGY3pP~TZR8ۗ6"*`՘<(k(u-tRj'/)H0;鲅r6aGZLB/lҺU6._G`Tnf2lG65` |f.sjShti\NdA {}0 $Q93G'u)u }}ƎZRX'*=(&^RV:}ߪqEtp0A}PWmhΟsȘp5"٥96fK>DwCTLg4 $쎩7$%aTK"ؼTWEi'NmmcࡳHN=lLJmXN'9Ov"%" 1*oC>cUd0*Ly|ݦ 2Y:u/vr\U|y.0;'@Dic ɫ ATN7kmb=g"Ha!["0!/>Lꀗ:KNC`&Yp1 cMb<" o9%GL eܤ'&rM(>v}(gJc\}sX~y}__￟F.1ՠ iy9oQ&4C%q{*!K[N÷WhUj*9f!U2d:fJDh\5Z!3auBh>mVV N /BSqMJ#?6 CIqfI|<_/H,8B'iYpD0gr"Vd`jD C4FWIlFd!vҏA0B&-ykZ褠 1W^ -Ύ=tH=nӐd Py7H Ϟ}\uIPv҇+ T5ajl.o6OQ7rϐϨ?S(D?_`<7߄:sju> stream xYKo9.trmߏ !,8@x,w8YS:a\ {~%mHB|;MhNޞxV&k'8͵_щQp&竓O7p׺k9?_|r0NV.}|?RPMu#,4f3ª RUIRxw)'rm&ӽleݿly|B˶2x$6]>4 >}1+pqOA'UEO4[c(+-=(^bαT(I3 Uɫu|W'Tbo:ڛ'IzE$][u~z'Nr3]޲m}qլ@KaDͦzm,HN3K EMzS!dK?fDZ:kÝ)Ӝ8ixH="?+N BAx%wc!%?@c ^ewZM#,g!90L;N1ԽUSf >5|1KsS^լ $Q @Z!HZbtΙGXSyv&zQ>H̞<.v;od|s,1Vb.1Jє B"GTf9V>}6XTu`bVu͖KuG,Uw=W6`twF9d-8MWԓ8B Sz*J]myWWh(\$:Bլoݒ*mx.sH;dwݒOrÉIbouCGQY@ER$1%*LZb ;?vUf H:Z>` QNTkRʡ/gm{|1yzP2*'tHmTK H 437aqQ:`lDJ.fL0<k>*VWASJYO>d.a9"Ә`xw}W5-Jn( )qc\  TתHRe \s6,,-Hg q?Ho'P9Q+C !a3M<B޻(GFEI,)%ߓ/gr 1A.s@%,pAm7%! [=ĠܪAp+q>+N)z}00&o Xzs;+ _#~9Sj`Ej;vf_4FdIN(zC-|Rs?(NfW95E>LT23L<- dn9,.,^} w;WI+ 690([f8GNl=$/Yendstream endobj 434 0 obj 2256 endobj 438 0 obj <> stream xYn o OdMY6IYߧH6ْFd>Nթ:ukA +.^|-X?/~ɘBgU"n`3V gHWo߯ _uT+XX.|nb=^l y(bp:} B9fۧ y!};&P&ӧ.Sj1%%pi\:"`ia3'RSySe )0_#,H Qhq WH To}KyVn3Z?6*8"x޵.DqY1/ 4MuŔ#Vb(q&omNbiHcdlͿ.bap# '(8k"!<$R) y?Kg8Jzϻ GIM .8#@.]¥R+#;y`#;uu {X Aa+whm3? qb~7P4p66l16 Ni+A("PA |5|h8B1SD2lU:KL wlˮ+w)wkn#H)y3_hϘ )+@N=JX߷RXE*_ʺlI 5cdofy㯱T|S0:q=CbHX5,H iXk`nb1%iڝzo %JKU1DH̆𝦑#cfJhPISC0ށ9!?0ۂsd6w)RzY=zL:%h*lX6Yz%ODP>Ex.}IG"A*1{dzȞ_Dx`2N S.AL ϰ |/utlN )@>6 > oK5% ߚC*bub??o- 4/[Fcrp$Rٝ'T.zw.S ]MKdDCR/Mi|6$?1tc f~J~΃Vke.3?̑00SkmvɔCs/f 1$9Yi,!&ZIm6dW.6#ob=@X-Esv(oIJc 87Q? IIV""Kt aDJG~2̵T@T MbbXITJ\W&ƹ<-rc0p^b=j2e 3ʒ1Es :V+jӪ=##d*E}2;=vSw{zgc ϫIPI̱?Zoi4 v|̺?)w@ %vnVț Z'ɥ{Hq.7U2a#SZf-wS3J8]no]NqxRT|6óT 249\&1)XX o7fۧэ ƍC?br3,uGPցTA&Ƿlgg%pHvQջRlK޲;O" 2.J4#cg({B j?wݠFP* %o5$RēCx@|:l)!GY5Ͳj?{ =͡i %h`\ȟ?.4 endstream endobj 439 0 obj 2377 endobj 442 0 obj <> stream xZn}'I/X+$!/{9% [E(vwUW:U Rq?ki,[*" KZº\<]|)n~f{-+a-BIU> -hR*F+9,ݕFpp>ݹd5L2.nVͺ\1e) 6s %1q\ qQa2mDŻ 2LrU5iÝ'JZz D3M%ڀbɬ\3Ѕ/hAպZ v2m_2](?u¿"^L&WWQCXr:)n< 8(߆R\ La|J(K+_۵`,\_& U3/_v%ɠ$bғM=o'؁Pw_6QBѡYqBV:HAPT|qK=wd?̪M.`^&?aT5N%D`[ `tf|ou椞_KWF@*֐` &1ٍ)KE붯B BJ̚eSiJM1O\@K7=c۬mi#k|HF CWn=B{{&N8;a$փ2fyV& $S\ ѓ=Cpf/9pjSJbӡ3tLPu]}=Y L6NҪ ioӰqI!$X)z[Ag6 ;PyMiH©b;I؉ӑbUtD OFP ߮zgr8qGD*7 G11GƤ"0!v %OB\jjSrŠkn;a}zNdg ϥ8$~oԜk'o<=߲qB3L8i0g+g9EzbWrۧ k' z._ޣ qK(9RĻ$dDFsm(myYr(]$?=M~°{ Dü0we,bN\zdh!m%j8Qұ>r{*_ѵʵZhicsɐaNox$b7S/#+P(e)3cuP 7uﯮB N]*˹K.M|9HNX$992" hrf>Iw'V *Ҵ1ho:LuS>xabrnvUPpԧ>-A'4bDF!ޝ-}p0(F~sA809GD#ݰEn9l4)XVxce'PxRҤ bD̲s0psodeFVJ,v~1endstream endobj 443 0 obj 2673 endobj 446 0 obj <> stream xZ[o~W#-Ne~I"U$ fX+YH{vrW g;9V+7߮~[QW\+UX͍\^ʲQ vuzGj \nWwqoօqypnU\W5־/FNTڸ}p'-BkBE\z3l>Ye^_"JnW)$Ӹ1+mU_&A|ERHGR BJ0MWVJ+՚YYDH]5|_6]]Qm ?w% הBsLJ)?q[|!jMŇ%*n4؀!/wS6OR`4*ҕvCV@Y[٭aVkJ  1rge"K^&ܤC9TqL._`0䓻/Q /ㅰҩҾcSA5Gj (5=4 -]=Hdis,$CyDe =㙀@"=نLFAܠ$a7;VwS| %ԡdVч)$ӾCVuḯ(L>N>}giHCh9NHiFRܿ }MYG5 xӝW2mrW gY V!6&h`Q lY20 X7sy cY֗AL}yt<6[ ~Ta=Ql= %7Qdo5}v#dJ7iPTϬ7ʀϴ$oʄ;d' ȅ͇ONn. 96d$10]_m!G5Qӡ%`$)<됼ֱ=@ZGUSBD{K$E0\FQhɗ(Ht!bu%L诛h)0BJ4L1I GR;Vb~@M./ȗ'fR!lڴ&!%:H n.XUDP&4J/Z$pp U:&%xd"VeI Ze 6.7\ss:f6ncc/MD/fx*v`bN}͉=7P>3ji%R]j,<.bs5ۀK(=M !ZϧKQPgmo>j8.fN ) ĸJRɊ($Mր &=7]>`:!$CL}dx3P*Ipl>`ttKP\Ĺƹ0oM[9pIj@@Z͓'C4t}}Ξ*@H}N ZsáROp?~Ui*wg"U:$%NuuT'3&j,zcҠn#R&Mo1*h&X~CU\-d!2gW3E2.qsr"ӖX5)=Qtb?]sFpb"-Yt6C{ʦKQ& a)%.* >W MpK/ 8G~YG"k:At8 XG#/ZIwEbJ ǟ*w?4"c5i* [rS׷ݶNk5fNk!ar N1e2Il9wu| YCηiҙ Ր ECyń u}XgEr ̲]ưйovUBY`X&MأִBs!{L\-Tʾ5; $rA]͏>[U H̼j.;DcyF @~r[1!nH 'V5 hSm$5]d28}!8_#<$@N1WErZc[O8 fe!&&[As(:uta4"oS]3N/^FT>rAW{Rw1ƐnB!#P!6HkڄP4rPj 醣3KW-2VKTPy<R0pHhNa>O]G ENJ;# ⳦UְC<k&]: 44 ݿn.dwSi,Gp@[vqtzgF}M{%Ϛ+GEzCSM;]12 F?i; 9NǍ{˯bkTlzן3y;xwmk7@[ſG=+um\ ^ EIB OPLTPgrMObP s5$ xo u0P: 3 m,}jN .τrLҿ/b\8 үd>>oO1}O7 k E"C JYnB {%krAhdb7ȑ@LXsG#[I_HPK|˞9ܣ:4e( 1juĽ\`9v], M68p {cXG?O&]-(K) yc<=̧yUr-jEnhՅt1|A@?E v]Oi<Ћ:Y,U}Gi䯺TDE.SJ>ݍ!xzs7S&5ԥC8Pk]BX|F ew·II+5*mYu@*M^$k%!Ü%FNEmywoFendstream endobj 447 0 obj 3156 endobj 450 0 obj <> stream xZY~W#MvK}HǧPVBjhf8p$+ȏOQ$;+[ί V wO]yڋ _y#}^]X f m7UKޅux04(p_Ge4讋O:v}"5z~A44q.!AyeT^쏸(ت"pU9Po8n*Aq?`Wunבj ⚋+΃Ē}C<v ׳2l~[5eMJh vw:ƎԐ"Cwӎ+ockwwqUiNF2vM&+94a2u}JB>3-=}~V%ÐqE`On!Ydqۦ򙎑Y 9qxYGedΡf 7'hAlQTH" f]?46z? m:9߶zS 综#Oe|8FnĈ8<䵴edd)eLQ^(I^i-}kMN)[v|E5P[3OI+k=iu7Txu_fԐֺq3n1е¥㊬#7asچ@R (pF1:v * _2(Vhrqf^]V>F7I}9e>"/?cTɔn7)Z#Rbn0u=}B ct)X9`yGY|AWKV*ʽv*! =vBr\\7owwv|\) )ѕRD<](wҁ~)>tR85Ъizy)S>uCxB9roiLn4: Bֈ7 zJp ()03z,'Ko]uO"fLsfTΥ<:/8Q @Yi~¸ENeDS BTCм,WS> [ΨF 1(^wQ(0"mL̾=>"t|B(RnjEҐ2%z!OC ܻuݯs@.D!X!#/QYaѦ˩ nTjA\ȩ)gLe PI^ըf(oO&c!̓p^jSK[=B_ 1p' 1@#qv JF e RZeg^Qs[.#,=BYrDmzh6߂ʤ#v|~(;h-71W!-KLR6m͞7YI#>gkS=W9)dq&Tc%j)0+6W#*'gӰ='`> : *qUӈG;BzHYIe3T5s: xrzcNxp" Okv OJ@2b9[y0ze.|S'bj֢Cb`,'\/;}n}~Th^Tf|#QRh2uvgۻ]rU9=fhLhu6Gi"X3PlІ9~9$ʕ(̔XXTWn4q8݉dW߿jzA̬!(JGVxGsIЈiy\]e ESs&l!!@KJMɈ2-LSȒ g da㨬4,iF: < ,xtLH М{^H{WڧNMsҪ,n$V` I91f4qO]#<5 .G=8Njp}V)Ҋʪ( u6E|<]#JԬӆJV Cl!74Ռ}UL;x4ln6i2t O.4eIn4! U[b8QI 4S?r6|m7SS8*~mqm6NK!p/Sn B՞XxaU`L|P*_Ƅaaz]`ɒϮ{NC W6NРOq9Ae*>+bcYMɾ:v7:RXSɶw̋.(0+)#mBQh0 %˘Ja!}Hy_or;FQR,Ӂxq/hm%^)(߹n7m+˗ 2-m|ܵ Ío1nϨ#ទjU|=fU.Mp8~zZYo8x˨o(D^6OӶ>{ӝzx4P/:Ui@:{$ 毧6: o}mPh*)WқTe Ҍ$ПА%'I۬n-׌P"50*lyB¸"! ,ջy〪@/BD_$Z託/N*篳lCphNI2PU)U] SSLr%9B (k[)*C9 `1=*Nڱӷu&|k` ЊP[YXhzSƵtpLN[VlAPofOaC *K,{JL,!+}Gn NS+\JInw\96~"L1gN?Q4|u),a@+MmdXrsida$`5qw|eҹZʽ~ O>'UW۔}p)ljQkW-I|5" }k ?5+4<dBIw_P^)\3'3=L xTeN Mo P ?l |F@) ՛z‡DʛzH s'_endstream endobj 451 0 obj 3808 endobj 454 0 obj <> stream xZ[~G6b~IIӴ$u+qjҚJZ;)j9|̼XK/_Yo8o[*g^T5ǫW7z':fs,NI;Y^mb_l+/ :,ѕқn^b^CgBL^bO>Mxd*kW?n_$3_y# +_)'yZ{YTi͢LC|òR^?ɽ4 mX3UB\~?ԛ&K8[l+E>@i@ V1IzC©,ִi._=6Uy57Mpf7~~Ms؆ͻ1,I}~'-F姫]x!aEK @wp^)i)qwOCOY~,,9>?lG[LVj 9SJjߤOCJJ32aV mQ\+xV.f<)ȭ3> P'AqMz^>2]]koonPLn^eJh1Dn>a)jv> _~t,Q+Z{L/f6ˈ\ XQs ­e|&F[ a)45S\uI>cl`*ڎ Klw} sE)^+>*@ʗZ95D8yճd \ c^ Hi9b+Cv1D٤gjG)`=3 BD#@#Z { u± cY68OP)ٶ(\':!,Sm=/2 }+5[q@*,]g@,>~ELCS!qK$l܈I_ǯ6⸺"@fE>Ő(ͥfp9DzJaMgW*)9g%U ;D" ؘ}{[hgTrŅtRK"Œ'49(AћT 9Jlee7j9A|j׹Yn߳ )oݲ5DJ/qɽ)u{Җţs1 fgfi&CǧfaY_np.vnj?v>5۟,%#G>#͍}>DflP&WX&ܘI)V9"?0_?)+C4C >ر^ ѱv0/L/0{I:%1Jѯ1QRdP)pZgKZNc}R&=O1v٬4C@h3MdY1H8b3D8#j}Lj.+a ƹ ؽEz4cjDy2UQ3ǭJ8V[JzO^)!#^uw@L\,*,ݨtK2)6\C#r.prHjӏM TϡOtA*@iMIB$n0Bcxݙ+?sX6?sw?W9.9w{dm'"ᄵ~A.'UwJA۟?m ̐nN}>&+<ܘx&6H)XF&'Oc)N1y^N(uʗ?L*a>,L=;[M .Ȗ\(ATLB([1Lnۡ;Lh6e8>Y pK@S$:Agyy"5s/8{h9$X PmvvjW/OIf:a)*D1ΨRYKݶȟ4q\`:oH6`(IGwߥaksv=bBi)'|> Zc%կr5 PTX-\ߕ IYj0Eq:L ¡ 6||hWF2ů yO #X4I5>w4 M@ܘg> stream xYYoF~WG: OA.G ~ š<\HoU=5 @lꪯOxq³W}꛷qk\ѕQ\6Wz?XkZljoW%K67tu_)A:bEƬ4qFXM pYy9+ k봹8\Yj}ņ8H{!Vݹ!'9iUO߫PPnSؓO[c( 9m:Xds5OFϏJ*!Lm-C6Қ]mm(dz3v o9`t)od 7P0TdMix^7%lC5C55!t swBYӮIZ;|bpFϘFiJ9$f.*6, ;J<Rʟ,p 6=s(X2Iv1b!Scz"ҙz~mX.m<4Y}L:4=)IM֎u5D'%$LD")3 ɨ9mMեMJ> r&ҞiځO.%Dkˎ1 \jO/A=I*Bp]qIӏt`^iWGu 7Av'Ge9 g; 6rBC~@8UnYG(zƔ(Nj(fKRRhamDdim]Mm߅ Mı&ž1(\(0I'A0-" "ȱn{ <3~nq4UI Df0@vgCp<厡.WU3q_8%`)WSɠ;(?$e̔Q)qpF1{xm^;IlVH9;PKD]]1dXJm:`p^{YB/&uXTe3ļОD\]N`2312EiAM^ (aXc ">z3da }&a6bA+:A Vz2Y.Z2ߤ֞dow נhSzB2:&XҞ$N矬+gi98 J$`dG#xrOSCh:HAC"Xr~$rÇ6}0SD{ $*Z8*S#MOpd;ºSdEhFcK?Y͈*fL3¥;*sQSG`k9'0? Z= $(R،y,aS(KmFvJQVD𢮻Ї@ӆӖ8i z3H=IalH@%6UYT L§ ؕ<|@b6H'YyHe@ H(iI޸ B?]7]ٸPOi)oτC2*Ta 0$ayu! ;Ҙf(witP\>BIvێ];F~ʒTdq3 öOa?`<6Dh6~!Iޡ}55?%A3o_4lem%r^pb. N 28_׻v}uȮ>wbjbf@`C߶i҂f;)!"xne~A z}J@,)~Sw:;=Y t&cŸsSq}d ň T!ۋ\-ir׷R!7NK*qr/*QcT]Ň'>i 7GzY[o9XZ _:xZ:ߓG0'hK@D6^7])#mMAi< /*eB)h&eQOKZ`5٨-(/{vaͻ26 gPӈ+7v&𖴌ܩjtڢh@;ygaFot ?\ Ys@,#7H$N@.TLu"=Yz endstream endobj 459 0 obj 2279 endobj 462 0 obj <> stream xX[o~W#О%@q SZ z0лtŕIeC$i]܆֎p.sf;|[P ۣ kx<1&Q g0dHW,/.V/9*tV S,G^6 (gNEN].2A(6>-מ:\_UIUS%MLg:Sj֘s~d+qk-H+X:z.s"ʷ_VU[5LfaQcH.$U^,.pqխs$i],?kdpYs9~gEv-nSշ!aۮ9+#\YyII4/2i75y^ k9O]zVTyu[7)E":,q|nrD|>&V03FGmr9u`!|0ё@e{fdqH @4/%C7ot4l9%Zb۪ߵM!`738 > P=祴Yºc(>0J)7AGR˺z3Rӌs a-;,#`cb@r"rd K(<$f?~nCّ`#, iL7uC ?lln}77dDzRlbRw!9v>xvZUM Y1 4TPeZAEBsYͫzHF"N R#~qlwV(a\8JN*A zv!,#ި2vqY^]%XAo`?)'͐a.]ԛC ƎP6|ɺ!ev1 0Ut cQt ZaUU$5 @LuW7ءRvQ3MOCIyN.FHDf7$P6~}ܖI:mv0`@:" Rʬ3(4(ׁ75_>n>^[T + ZޘBrÉMq(g7!o;>~9"(xz_=7jtذ4u? “ %^t030&jB|Yr߷N$=ZWeLZJ7I%@'2N(/R%iB[b7qӾ7 -_]|:N݄sžo2g|4}H;$7h,{T/!|H?y, 4bCL ́^8G}u L0,D9؞Y¡8_ʄ +T.pU%k_# 9f$Jy=@/@ Ua5 RLaTPRk~yl]M LHs&Mq~Od pG2啉Z8[fUS/(Q"A& \J%x'l`"bjX׻XPUZ/f%Ƃ$Spo>U 4%݇A9%>RU{ց^Ud@U/0P ߎ<铠L0lZI u[ Ef3~rnqtaϿ^ޣ}bGG Cַgdһ]B/UЍT:/wuG]HoNF'~w%鋄;1UZOo"[1yH.eo'RJ)F<٭vr\7oCGsȎ6LqRV/9~†U ,)Ԙ75x@n31 ~b8KDy77< C~(o$[9"CgO OR~GrDRЮy ,q~ pendstream endobj 463 0 obj 2008 endobj 468 0 obj <> stream xXnF}7zLZkKp)n, ~ #Q rD*Q;{%)ҲڅX}Fd_:zuDYoБAFRG@Fs1NKb'jӑ5iMA~2;y~iEE\ >|$AīTj$QL ªDhΔ-9h*hܑaV0IY}A1\"')4Pz. x8+M,DJa3'' 1Kr p9t!ɒi'I&Gcjr|˖NF8[.YdMQ/b.!'g#i,ڙikDu>϶H6FE8ȏcoE/M#sQ*wHΪi^6*y>QvҵO{S1κqH 8?(thͧ~}_u2O#gЇwqL4GJi"|56_Dhv©8!&-:I^U$ȼ :o0qT'{bL"w_|FB%дO]E1|Z2]eF'N&VECesM*yWuN5ps{s/>1Bڐ\wg BfLPpՅNiZ0]|uENB-ih $@$d(x'{vϤg## cQkS\7)GH Ly^=Ht]*Yr`W,qi̷{lU(Zu`ۍS u ( IV̶~\h25ݳ|9sa Ltwh"UAwoO[7bF&eeP'GnM11P7So/aVy 3G_h-ؠ")`C U&#j3`Pu,*(VƆ}{qBqi`J][U"6T<=r͇2DȄSνyȀBjcD簲"R |Jw:VhxȱYuZ֨ Q"`i»l M۬ fĦ#gCG7Jxٌg<y-LdWZ%Ι}:Nt`c{Q FӘj}8z'9?ǂ+V&I;&J\'N]Q[r}v!lp/nh*=:7'4G*{bTl8EB!"`|uz'S} $Z#z==[CDS>2zh, ;<7'_=endstream endobj 469 0 obj 1620 endobj 472 0 obj <> stream xZY~_G$F$H9dIf^)>U}ԜR$S]W_uÊ|OwpaZg[?Z2U(+k@Ջͷ7N>Vk蝒vuzIp-4B珸ENJo rY0\Z-7]Z >%3y)™Ls*\2ۆ}`Ƨ5= _aj|imX]TM8LexH/"&% _:vZx4IG5?w?P\f;\\ ^O|:jcuU_RűxXR>@KզjqY1O{-P94.3Y 4I)CAm-})[n*$weV+$SZ} VB"+P9eYV5m 1nWk?]o.eѣ+9wal.oukJHxҶT%MR*]V\}6Y )~H5gN%[Xp}6c˞΁+DbÂ-R?mHgN&g]JKYh thu߇4,1۷UJ'VxmΦ?ҚTpb!0.coQJ» G&N˱umatg1\;ɉm Ji;k)/7㰗=a+:œ\aQ!nET|iۿ4[ޔ]_VS.)ٔmHfJa!2SdǞy CrTCS]G=Gv1pyq-FD 縔 Jk =O1H1sle?iIxZU&0AnOi=A\قԺwp֞5TX9*2JSLE7EpESIJq1ȴ@j] ψ6礠\YU2Tq qh+ A hΩ|5 a)'E, ʀ P *rA&:{g(yGQr[f 8MφYB1jT)lT+"CM08f! 7NsAZYwKL:W`y6X\~Tm,^>nǜU/*FqG@WnE񴬛Jz/}MY&3'S)|=pP2r{@yff{u"@@gƪ% l{;,yL;HחOm4|D1E9i7}`n\5s^}̠8b?AchSi/ص4>w U@;%=#ަ.\ K,7h DL $b^ t(ԅ׆( `OPDrFxS;Pn )^ iZ~,p&Fo1ق$ gXǞFu{_ tz71ޔ p|! S ox(nm1rU)TE[-h0ds- ;8 <=9x\"M2DDqRN O+ 6BI{&#"/#t Kt'8C3ExI7'MQiОi} I!Q gP<]Tx!#hʈ9Xuп'_ҚnH%4Z;Wi_랔> JNg??U"d'3UD?48kLBGwNL/BO@Q4qayZ"e`KB*C \ae o,}+HQNgS_fnr20Ȍ=\t8tz ? KPT/`~8Bo,TSEU{' tqXTHce"vJL)Ȧ^fyk a`;DSn.kXtgl*@BLZ9r˧ĊK'AO)+c60fF? jdvE 'P9ߧvv"8&~21u9e /e!X8'p{F ]6 ؜"|/7D\D*BwZ0m;tH4Sl6:$#~)L+ki,.?e`ʻ nIE4QLYgn&S@z!.vSjP3s]g e}2#E4RFk5ÁcPJF==%뉤>;gpZE]Y~&Â%fs+9hyэ$8wMk5"URMACr߿2B:aC߉,HhƉx:} Yp endstream endobj 473 0 obj 2854 endobj 476 0 obj <> stream xZێ}GFVt/6bX q}H8KRY'TߪyG1 UNU )膸x櫟,*&|@7lq=|ؗ\cGs-+a0v/n ePơN$yAQ'ZаUX͍tKrY% jp07muab</Na8IRG]5,V4'ilUhMhc$"iZK?"H$PƟ Q(6[f2lXe X,K'9mRg7d A~cu6?,A{?q [F$-Լ /}(۟,U!,+U͗8Ue[>|$>o!`m6[J>_>CA}_I+7<ڮvթτPKfjrQHom}wfKZS`n avyW_i&*CBjJps&'OKk 5ɡWbj8:߱|~WW?XF߹vr889.+d9x<<A5 %6Ӿ[0 <y+$vHk kREww+*J@ rg |).kpBhBzl?B_ t -֏/S:ᒖr.g J}LAs|XWHh 6Ab979mMJSHŅ]Ee}0H 4YLHxA @Jm6M{,SnNđ/(U9%4C4tZ<#2 mBF9%_7B dT-ghq+f~Rd=.FV!I "HΔŸ0R2@2ւUdۈa# v`愮'[Go;Ks$ _9S͠/ c xD#7E~d\ԫ+F h%E 85 :+b}كI؊]w]h:1cS%d# dCG;ĦR32j8ˌAVc#NЀ׎11 \8Xj|MAn@Iɯyy7U!+ * $1ZB!߫ OdXJs^q,9 ]E$dLlDtL/.LJف(Tkb/B3icuIM&h6.)DZG(g9f^ Ļo& e~ Ž䢫e.z ][aB$BPu!%V mn0\oE2\OctU~%{:8fb4c5sc;)PgS:6hڥ5 5As޺V800UdN7Sti%鸈!"r>S>K}w=>@ NuIXh+ 8&-Ҝ*]pܱE@3|Z +աJ)SDPw}j4Kt#b R)%MԹW]UuJqwYUX}Av/P#`ʱ1NՇ2b3yzΊ:R`>q}շ·dxA:5vMǶHZ^Ȇ|MyxUe⩉ KdDe}kQxCq`8c;$RN'=>7&7?]C:Rωrlk~UۼÀU"đw| *ؑ=ԧ}q|epe2GWH}!xNM8<)fwa@6<3Gnɬ!(^vZH m7쬵 XG: 2ا6 H sdћOi ^1+T;{bꢗG8G'! N5=T]ע|pM_b߅`;IJvQG9?9]p=J@ ؋y5򫥘px[UN \8GJr'Ύ',8>+Q}=B"EЙ#Ѡ,9}64IgACC=ŧ[ӗP1 ODB+gD/<|79~|ޟC`5݄rϔI\KKgendstream endobj 477 0 obj 3343 endobj 480 0 obj <> stream x\YIr~G4K,}x0bwz2/%6ڿY1l T2#ˍhϟ?+77^{s{&@D()o5L}zߟ s3c0.|/eD픆;Wl.???JC˧gޖpŗ)lN\㽐&?߳p1?1?&<&: -8[~uy1 wJ62-UI񝙶Ѱ͙Ms6{x?$},2f L4,(dyZy%l~ܗ@ ^G$"ҙuP&A,кt<Zg@`]pz}I5"~__Y~H~f(I5m'Z藖r}?Uk%~{jͺץu gWtvuKVuڂXUld檬\~^; 2/xj H#xbe:_8[ w]/Ԋ%sjMRfݷϫC5VbS65<-~>bE|]%1edzxl `_sgxC`zQScri0i/fvsAwLQ!mvňM>bWB8yYDYЌ!QlwٕZ7ݢGZHel>V'Kb<[ISe^%^q:MdwțJ?GfZhd 2b_w?3!4?~H::6aNZOgP032ՌUJIG\RMn5^!#}# q]H<@,I>bfTqAܚ(I ϬEZ(fz,a. o'9gk8^*PH!t` tQFy;[XbJdΦ0S BzMFn2載׋N)q DfSD?NO\ԝ}]"dDpAy=g֠rpMS6{hqˁ$ @DE7{/rv]? PF(92T c' 5GN_gKG>!#ۧXZ"?Oqj$pT|6KD `]M 9!yrROީԯC0bbZ[יyXCrH%Yk:-'$wd࢖ Jn* %}1b^j}+mhqC ֜HTI  JVXGBKr&`ehxs07Vk蒖`Rֶ懬0{P!ajujSH($(5J`ZQ`nSId䫛ψ0!r0*Pyޖ`+x[f4%' K)^A|}FB|azPL[OK}ĉp&in,.d _߿pCR/N,3X@e"m! {nk,LAd1m"nF2׬z{ j] K6Y4 >~ ûG pTHN?D"/EAa^ޤ,BgwP ApGKIcI0厔e%cGnQ (ވ׬xXLD;~cѕW8iF)Ӗ 8(+}m{o, QϾ.%kV*)aZRT0+fEݵ $GFe âdθ߶sx1 q0Py%fY-']DllL1ҳRˮh-8u<_i/B:vԜ/ٞ&ˋc*lY)6w)q,E? Mtޟ}?)vH^0!#Ȏsզ87/Dq-ɰC:Nb!Pz-pA^e2p洗Uo2*1W^۝lI쎌1G9DvCXx/fDh()uzTScжclvKlk3,5N[*L|Ka.-hψB4p_3kt9**ji6cT\*2C_Rpr&.@we!* ԀtT4,Rp9+嵑YG>b4AU7塿0\ eVz̴:,jQ @7`O9iOTI)5No$ ulclQ\jB)9q )K6N߸AWsl0-|Wd(zh X'"m"BEmɬY FKw GI=4&>LhxKD ñ%oQh'Nq 1gJѭ>x]N=4XVDwaT}TQJIqKy*-.^?e`r:ws.Q,,VAj}{Wїq e ȸ盧B2'Z+'j4䨓.itt(@Y: ΡqjN@WԜdr|[8eZvn+~.8d͖6#C0ir(bYp(@ĨPsA\]pu=U4[@7`(gJC>{*@&lU0Pz=6%18@pܖ<.i,hxL;t$=l򜞺 ^Peo5w_x?d#?z}F9y?1P.yNCN]ȎyԲuҨ's=J1MW'Y+ۘ4z<G1 DA7"W4MC "@˪Ş$3x~U$W7q~xʽ9J\rF5eE W*-;= P,WeCp*7pʱp@+T. -qm +]ᚔ5P8Вqqps=T+16\/YJ8O)7tb~n#vyHX$V6xG|-NRTfXg֑Z jLGǺp?j}: uPq9/zcSV.M9da'gxBMƟ[bm?_ ӚbNky,Ov![ᰶ)ד|y=]]Xnd2$+?9WJBeBr FL?NOȾ(+-V8ƟLMϙ61Q Z!K:7ȓA^|0u1;3ja 3*f<ݕin󩘽a+飈=G+.oH)5~0MN #.::XǏĻh_=9КfDt^1B BɈG$a;2`+ߖE Nхd'%Mth2vY 6ͨqUJM o\,h;2Évos4] S}PGِXO(~DJnB,Cs<'g+|Cm}ϫtIX{X6U[8V ܹ@vXGBICߧ^=N)e6U %LY=yyفFK#Εn]rEx=/j~HI FKExgayZy+K_׫/3WEΥ)-Q_a&]E~v/2۔>X~4W;Hr`lGX7 2 <4-;N#nWY4ygv<vU52;bF_.`QBú!bOiOjH_Y p1(xBͿ!N[G1^'t>RC\2 p]- &xu+n=[Ĺ\,w TC(zEBQGFB]əe5\,&%7 W+x&^?}Lu.&[ωqjN)|ĚGZ!9G=i9(v[gA"v˵FdY.ryOhA''n.e&͟/yendstream endobj 481 0 obj 5125 endobj 484 0 obj <> stream xZY~_G~ G A>eDj'PTU=CɕlGW_}U= ]=޼yq z\_Xa&/<[X zqx¨n srN͋0JЯ}5Ue 3OiIkV:pdwJ8w7KQq'],'styOFȼ8qC!C hk(< {2kZq:` x)k ?UTqW ^!]W;y\e+03rVZyGPle8o Z8ڪaFv*y⧶BV^Y]ͣ`YAW~hӹM|GMSr!>sG+UB;t~W}FU "2JyW94St1SJp+7Y  ֣+o\JYc d9uMGSbq֎zK G M3$H0=n D*/$]FqqXCo30a)pYvL+̞yCM\s8cx@Zm%!ul1bP!2V*O9$ \owQҚ&xPpv=g#㔠~| ayjH7s,5;C}}L'8ݻK1.c`8J>7HBY(vfb<7d#O{u^3 ㏙*"q$?K27eb~ opkݡKH+#VI9Y$:Lh/g=)Ag7*bɒڄtm%$:v P m)s. G~W*8/nN6Ìhgx߶H8ѰaEΙ줼)<$(%}N lY$͈0#׿h\X"X"@D:L ),3g%/ ;ʄ`YŨJ̧`MKRj}§ $<)S_OF'P4GF ӄ#QgaQo8%5'r )%J!]sBaZ a)Aq!f!K;8 8q }e4й1dBjLcmfwpx`\cxrbQ\ϢJl=$lLH1밤`g J綞 6pH7KD.^?mQBF֟2.gO!YۮY M:qџBDNShܜ߼xUD$~jowD .QsH(]BvA-!~fN|+AH}4kSX)qA(\ÉݨP$rƐJWUtYINdó|] OD9:̗?f)؝ gj<SvZGZP'Tϛh7AmׇM\GB if._lsm}S+myQT,0W]QdR77f8FfԘE5*yMCYϩi7cswc1t~0Q*Jj=$΂P]q&O(JUz.Ga_dϬժ];SfvF+o%s Fg K_9RjY奻\:$V6`8.AʒyCfb,>/8ȕI> G}kvWEqϨ1o`,Xl׹Ũ7:D*)ѿ=#n}ʙ9ZwX>JF 8oT(5bN#sit& wa%R.pG8Z9s<7g_TQ]ΕJR1r]2sOQߥ|}2Yz &34Hb$a`feD;v7u"QW1xia`Z]tɕVh>Ɩ:nYr4Z!%3ru GJh$})GoԎJt$aYF,~Ӯ"u:u&%䠗ɸ©(3 f ײ$ Л/6YyUNjwg@8DXBȝ24-YрR谰lͮ7sPgs>+RBЮ!D"$1qIIyVˤD0Q`3P;N zT% (BM'MzyOTw AKBxD#%Eg E}yhRY D XgS{1:%x}0hSS5I>Ǯ }***'Q^S9ygՅ6H^tE U"ۍCѣż[\:rMzfHc*ge<}psTG#oE-B]IC8;zԧI^G1g~opTK=F/ 6^JEeFr!ΫSf['V$: GQ§W,K+Ɇbj> <sf"4>|p'}]wo& -xƏ*kB^޼|kیiW V|Nry5Pw隩$~h\<˂Dڐ LeC1&OwDޖ҃ѬY]r7Kendstream endobj 485 0 obj 3208 endobj 488 0 obj <> stream xZYo~#hbo ݬ~L~ˈJLx3C[_WpHI,UuQf3ncf8#-W6spfF7|+a9LtV 3[^jdݟl 4tvC&Ԧj٥ADZVy:O\}M'Uyib e2 Va"T4ƜcL'w3GZKG,M>DjuSa34 K:_9CRm*yT>iLKpg†}b,,` ڦ%,Ń~z4U_n?Jh~>.luc0yow~\pHĂTsF- N]_ guW0qWKM sFa>),?K=eipr*BK>Rhb-C pf%h#P'&rX֡OcJ$sdEf]Q%*M~ONNE` < (6}Jdqw[0Ĺ7 #\?߀"/\#="Yn&++泈+;EFE:7Ѿ>!V 1;wL|I R/7) ' d0Ubpa} GAXC0{li8a\5 &R{F$شuv A3}}nx ;W B`),SV\K2G<ʁ2@HQrX;iC% K"X~Ox焠0>L?Lx#- ϪM.\!͈o7m2]J% ,s76pSmL!P %YM{Ƴ$>Q<dT!ÕCOLC>|cRTk S\qg_L$aR&}e*cR\orDFۆy\D~|DӘ7~Xz<d)0t6[u7e(ATP ʿshB+}YfJݬ.s-o9fz@ +apWArC"[\DC _~KF* 2T;Kٱ]GHT+œ?זCFɓ4DQ =eSg ?4^%&-VX ȏ,_˖L ]Z]RoUōrΩ@b5^Zlu7o2oSJbt]a'!bR"Ox@-qئ \'Cd63lλr&.9؜Oo8r^o  7Y= FcsxGߟ¯d6ð@X8;HE -wKLBA-}8NfOLcbE&!J3|,ےF 'K#c4N? P鑶<Js$% }֣8WKsa!niv)ֽ‰c)NSc6j O`tC7[HV}'Bx#,/ ; [pvh1WWcV`ٵ&yU.oPqLS9 nus`ZѮ)JtZ [+Qn7wͫeB`u !ۺj}NaZX\( i  >&O6TnN rC&5yi `}d^O>.]h#l mʭ"Zt~ ;^WmBxd*ȾKv;ҧ8b +3 (  `AUMX]5t g'*t>u=5uƮMJcx tT$;R vW(.|@6yòkTmi,:!ФVO/hBLa'+kNJX8>-X.K& Uv!e;*FV-3*}h9՛jVS7(t(A?@x(1Ծ.QB <ڀ*K!_j"9(1>$4nϼ(ѕ:b)<4 A oU`߲KM=J \ PV> stream xXˎp)b- 6`@h`k!Q'ٜ"d?#˭ǽ&ԌH *Vݺs=& ʿwg&"?7g_]9 ,XiryIg`L.oΞY_`A2%\={ɴ5,]T˪*d`"tnbYpʛhR&d"x\;/ݝSɄMoڲnv,(+U<üRݹt'%eu6ʢynT⾬=)l˜7->,sKxThMeJ(]luqq*<8ӏMaXqǙ}~u [/tTzyVpLHCf]p^Zk9$GgLhSNrÜL!6C<*0;aVJh@U (#N! Nf׿sGɅtqQfR4,. <[,$6~Z߯җ钁~uk˻2〝isqd^g#aJ?T2`x⢾Ƨqt'W4W% p =*AhBZ7>)4B`1i5O+jjџ x8t\Z$`Q.;?k˻D@/3R0{o#d|? 9j*>Kx~=b?l*A|ݗ"s  hz?[#R\ыߝ_ScI$N_wRNp]-5&_uP[wjXb}{:#dKW*<<=M's:Ɔ۟ I w[|t9Y?\3endstream endobj 493 0 obj 2060 endobj 497 0 obj <> stream xYYoF~c X۽- hPGmB&e=I:AQlc5;>Èdgv}{T&QLl|}7PD ɔ3wg/fߌy#'y6A9Sx~Uma VҊ32,M׵H:aQ~$ 2,1X{r$R;94aC #Vsn׌n3E\*Wy9s P_hAihHbIIq,& 'Ce]TEjo"e6 Niю庘;DBшtH_ J*V>#ja%ŵ$U>'‰s6F(UՓN$y-u UQ&t<_&Q)tD9SpH>d""0pptL['H"ExˣORU!c,vo_8a"WT`:qZ)(D ojSc)'H"M& NS9 z$6f8|]^*nn۾pﺍDfM*QK87l$̿i]kQo\$\B5̽J ' C{/ǯkR[&d `./\Pi|U?馮K ~g%I$ӄ]gAr)F&"'j>o1a!06n"h8app5iS!G*X@Nq &;LtĔD{d?fLV[zIEyWVȁEzǫ+։l9櫺uqF t.]BN]A~Xjˀ  v1J{!Dg=:2еGN"8tg]Wwk"&ntCbÊAxNH̑N[CG*T.#$IS I&5`m!+yD8YTHq3ciD5<0CQ0ԲaQrҋ2(hj:<%()m-OFp8k+& us쁜 ~j7MA 15}y){[(}ـd夭LnITPomru˝\"F;0`ic>HbB>ԓiIm2=dBT;_$Se?n0bPݔ#z-c:ei_E[~TqNSt& -[ց(O=Tzz 碗}Pɵr?Q;}Ce0)?(s;`Rpί߿yP 2plVeHN'R`Վg'` m-`G`֎Pr֍Zm|٢dƤ!)①jiP @ViG֫ș l n?Pendstream endobj 498 0 obj 2036 endobj 501 0 obj <> stream xZ[o~#Av_8@ӦHH e;]*6F{!aaˠ8<|;yA OycaoZULU]X2_\ ۛkYa ۫W?)BIޖw塬7QD_тKjPH$-KdA\ wgXA Szͽ9ɪ;Y+ƃss{l6Ɉ M5,ߎ}9QqpFA&Q?*&4N|l< Z%#ڝ3BŊY߼_:0uzw|ƹ.4ݮ-qo:EKV?2V0]QRXA#~N.(oZ?#39DSymsQeΟЌR3k7]+[A 6ikM(^B+~A|q'Kn/9[N#K,*g B؜03:~l!8Cx!lϯ kk.LL8a7B㱚WY5XBČN׹}n2ˑ /^s>]$I/+ĸb8}x^O{V }4 } n7tAd_ oҼ'LoaXпရCT:t#[JAȱ?WH; \"9KO@ 1q4{?wCx(:HJ(I4w/%3^]VMnCH:E {Z4{s(&L4zw(/ 4]XFBvsЮ2"(EhHT/ֽcpRDdF17ڤUUndnE|l?a#jꆜl\Tc&M3*oqL-AE+pl %yB6` e6Pơ@&@1,M߻!K-|P[ I$*@j c nLrQIZᕋBN} {r&+,NV|CAw>kͱ7ޝԴ kL Mŀqi?Ռ]UCd%U3 mZ(:MozHx(u{W#Td Poj*L-|ltx$А,V %3Tvy}R$x J\a/ B`䧠.^(j> T`-S~9>JuO4*=$ǦErOf&G?|^.Õ҅#)=cs]aCѤsj 4Q':MDtzu@pG)a__:o-C8z÷P{R2XuToQl1|8Abj@WmxLb4oiK ) 4[)va *`.Hڝ2:$CҞ(epew9I; ӫ%es:޵FhXE'd 5SnsfOPw]<ѺnL zoGNcdpD9 #/,f f0^t(C>|ta*],|4Q#^n#J;ݍfd }S Pzi #m "\;[9ƪܠgWzA X&>}eɐfH3uN\&5DE\c.)l9ReAxl= )E'7qҙJ$ⳞN1ߛZq9MÞ}Xg3/_&9q򰏥'@!Ϲ{o@l;3p—lv eo6P ҙ!TwUKXte:^`u%> stream xZێ}H1`{üp$jRgF=շjRZX`UN*)芸?ͧO+꟥6ϫV*Fv7`=]=߼|u7|~ZBk׫ͻ..Vź\15sKda8*>z8E ˆOMj>֏O0Jx!ށwZ0M/c L ef0}M14avMi0,C 'N|TMWm(,U D'o2y=A fAӦ?YK[͜p0 B, lH"UM W2| /"$%H=Dz%LCPk4mq:VW\"IͶns>7heXF.1;,k:F Dw=):OY/Ar;E.pywPRL  WL:>#{gpoIxXN>߀lj|{y 1 M͂mT2~5Z8K82P+- qDx+8?7m,Bt}d*m6+GU!Z6BmW>>F< F8-&mѝClmc!3 ۦ{ X:mb289T:f.DX"G3-rwUcLu;DT!$.$PVmpUe5쌖@:cA:bC5D"Q$8& 7#J19ҀdpEY:5HY" Aѥ1]9Hv.8©@GTQ( LDzDHPhlCSD A=n`ך܅*mzZ]/j>/*^=IJg{>(y􎰫rYNaٙa# ,&MƝQtqk2CRX4`M(?[\r$K(NuJ=yOAzXtu!)PA+9W+|:xRUJ 5eI >jQh&FUN]&¡^m&G]'YR =PTʠBΕ\m~ LD xT>cEWyF9R5i2G,+&B4R竅9HH)YF)xrƸbjql%#3K1u4#!ˁbrp~?mtvL\M 9 SD溝 cb7 ٪ڸQ@nm<ـ[cET{:6beWy :Դq,l  5 .p}j)sJxVdASF֞&*0s]h ۡ1t?徧eZ s7PunFaWaID,P!& &X0t ݱ"7m$TbP0]AJ6 {-lQ7Y jd8PR#-4 J`09;q9D!q:RobP㝌/.ДkO֣#-o.rgޤP1)_ b~p-r"^5ΦLq; *FQOBM[z%9Ib '@CΰEs3\L((CopJK +\b9hKw"ov!"tVd$*Ŕrbs^> stream xXnrPnǘ'/ g P sZld$ÀAm6[n=I6 $xYu{ JXAO={}`~-Y/>xi*PX e={Whk1~yu™0 BI^V목UIN*>b-.t[fۮ|h (],FM4VCcM,Wyw&w^@M\-W]\Ը}Xc 9Ui.Ts|؊hMY2sw$"eYfcy >N \ nsbq*$ lqr(t0\=dm>sGqOfPmߔ[!r#E@S/q$(cS; ($JtJw^Tͮ )U,VZ6ݸ)8"x+0,âjcր zkF`*2w~"ocss)nڭvaMLjS]Ȅ%67aJe1UalmVdlu|)yKîk5N6ݍ'1 wɩfs}3n`xo<^Ǔ#2κ*v]%n#Mvqy<ʈ_6pDa%GU$|ȥ*2v&U }="2##BMN~&MϚl׆J C{[qwHHSJ#4꺩1hZ)D7e@{˟G]ӓdid.scd~HXHKqNgŧ1.+;ʻ&RP15p%;~,ʼnGqٕþlŧwc F\nfM RuH,X["ooH1Ȼ$nCΌ3n K={0(){|Pv-|iƷ6B2QOe؀U= KwLTIU4wB]*‰930SP/Z Xr)ƾ 4fw8s-/mS,Ui[t}FxA/.]†:) uUW v¢g*=ycg@f̰ ^Вr12ˮr$uyQ7m؀2;v0tU/sՉRx0`ojhoW^~D%dܷVBiԫ ֑]'UH o$@]0zmd/:d,OwQPdM~_>g_p:2yn F ,d<7r8 6*N%ZWM4ZHQ$ fׄa>@Y"XA}h*^p+S*@2 &L!2f ӭF_:dCHqu`âVXE o}_K`_?&/~׾WW~\F9 MC?cDoRպ> stream xYnF}7zN/ O ٱy%f"~VߊD& 6(vU:uyF Q./>_|,g?\|&f7w6spfFn/^σ9:+,/$c=46 86o"Vmۅ SVE l~*:.wi|R~Ic(i} vPs_2Ef8͵KG,~ s"_(ʦ\/3kb-nɜ! 4Ɇ6c8xWR9w>'9ap4Ā ,Gv2#rٔEW|00D;!X?lm ?p𢡄!RJ֚lКs.Z`~v%ux$$ ,,YT  e,K Xb)1'Qf2m6Ů]*I?Nߊ6[ NsWU8Ʌ` Djb9E0}lwv]93JN*̝wvz'&|GAw6~Z AgΞadfT>ZZh2KwdV{@&2!LyNّ'!@#<\a #'ՠr\7\vbk9#m_$๸Q.k\T_Ŭ%fX2S(˦iqElOVe7^ 3<]S PTpQ3k*rq&YvNCx<G TDK<%&\:H΍<;C9f( ~zedEAQ|aqȧqW봦/cʥ9)8T!32i:b O4PnFS?m^i. !PT7i3NEN)I\n  ^B/dszZgab B(`h+ĹY5.EW!i5kl?g~~,*E숟jݡuR緿򾩷e_Kc}?Pyuj=e\wOqT{cGG3,6c?/0jhnYW}ppWjug=T~r1M y\wf0RCYvJ׿4}ul}5I8]qʖ`Ue^"R|sl5F?7umDRqͷu=SrUm9*9Iir;oᗻ4V4;x./gq>4!7B&!m.jGoB}sˉ4L~T4Ҁ(N1e TNSAn]ȃJNH3r1%r;~|~Ţo2L0fZ!M'XEaچͱn08 s )1Q P!\!i)_5 \%p]mW ߧWjx=Uq m7ܷ%R5cXU(mXFpEsR2m#L8z,OH (.7,pTѽ+ Lh~?, 04iY~Ʒ\ćxeys]N߉K'B99c(W󮈔\X^}&i> stream x[KƑGm-c=k{[X©bwӪ*֐UcF23#1$dF/">߰߰O7||=?xq+oQ7wo ƳṾ;:?YE圀w7{XEч Ҳb'^IkoLt:|R:|)iǵ۴,WnDŝ0f3YOMV^!Fq*'|̥Z||:/䇻d:3T2iE¿T\hq@FRHs>|\ s}zwP^?^sSrwWI7Qx*m8Oߵq߀/C_J-^N_YWx=.U]wh+-tԥ$ GgL~M ԷWm>__Q`v6X mq։; у:W yB^0МcLAl#q3ra_1"$)kUVe>chEY60 ):?l@l~C5`Pmc3 :k~ic] I'D!|>ƵW=&HZLm%ƬF߁'o HftXi0T9U|OsO.MO;$#s0μv~6*+|eRbli!S|QZٶo!%zM_ΫD5tG9X:G K" l}͏]0;~J ;IvjC F԰M0(ZTv BiE> 1kJ})Yﲺ68tQR cxmc r}^w&52Ag!S̘Ͼ QiݚFDyq5EpCazA"gfRѮ2#Ќڇcv#`~ alJ]GZ3(5.,S_yJwu!/pݐ6 > A\XAr,'5A_p_+N*Obf[2xJc`&Lk]4&Fv{9%nK'vUE+ CrPY,Eq@RyS{-˾5J(C0xB^s]H6za!VMW J`̩}e"rDNZlFqɲ!śCm/EOFJ(-r \%3%ti9{ AppF7;?c҈'Wm''ΎY'pU G(һgLO'YroB_ LR 託!6r)TyI=)2YXZ'T{IE__a7XGD(øXUV0< u!(5*%TZLXC0s̐9=V*@CZu]6LJ.2)AhC}~ ~(6EwqT n8.\a JL @t>O8kf[,-.E8Q'BEE|MrC摌1ffᗔrUiLZ؝1\j41L ,rKYq ` c!2]`xAfŬHyTdiP3TLiq٬eMU0D)uhhXlq[S/19@UԧSߝ>箶rPr:ZAlY>U`8,Sطԧvwӷ23tTh>*H0?-08HlYjhQPCZP:zl~P~J\t΋Lѧˬ&V.R\R9GP,kvkiqzԟPV٥")_q|2*3:},Դ DB2~]~*%8BbT!'px-?o/w}J6U]I'Lj>ʸ By<TA߆bl۷R"nhN-7sۃKwtP1Io!~͊N%z3GسgstckO=uLv6/bאdۄH"zU ,WbQ6Œ\eycY8=Ў+#1Dg,"5)Xu2$7^Q_bv,,M~( xII>>*)ʬYPi(GtEo@(]/m S!8'ؓ SCزYn<OP"CU4]CC߅O3zpJݑCI{0!_2%ntAbuX c !Mj3rVNP 1` )O9[6܂N^G׃$hDSW*WpMirQ?ͱi)9[ċ4Rq񯝔:ߟJ՘87/3nv[}  P)j ?Ģ=J]c&zriZQ͵*s&=Jű%_3Zc^=Exkq8C3ݮg֍p3~CS[ J*Bq?A]T#)şUbpC\7P5'tfS{|{lMCsH,sjHٸ[{hĩQU>T074/1䙖pa`ka$7Bdj>tHn6y+h+yZhÛoiDqZ_隀G 69ezvShJRi F8ER[cW34} vl[Un.tE:']K$vTXNcq.n_}a>ct-!yA{<Ү T)4 d8 32¬fqdEQAYwy%wz6)2E=v}4M#W 3jj @h 1OUNН=!8~ڗ#o󦜅<#|C.]"ae]VwkOV)JeC*]tQ;F/fU3UmTi 57P5"k=λ6Ov1^t4 зnX)ꠀSK;;kus]苺+R׊yPi$ &ᢓ_g)E,mϛp{F˄x0n[F9![.[tR^ &w3ǚtWƟMR.Y'e{\e.{aj1b+5T Yvۤ;q5-%&k]Mm-A ;uېV=27؄$x7*r?T| D <ڕp充mw}]E>޻ *\WnbLϻf6u m)}1˗0 HU V?~/bpw䱒"|c,| B͊8tLK'Dc`L2 Я&JdRjJUWɻ@rn?1\!ffe_t/,,[P)4߄Yendstream endobj 521 0 obj 4948 endobj 524 0 obj <> stream xZKG-^`ZÁ;r[E+wvEH=g1EV}WE}ڐn |ziCDZaFVs#7otcY(hk}xGox>;#b77_ua'r8" ùUa}?R^FL-wC԰k'rcwS!UhMC?q,aZKovn7)v.l! aLJY!ORW]ƗIؾ"P~I%ՅMjl!cjeA=BSH=߃U]&.vqpNW0X7( Axbⴡ~qE<} f "ip2ǔGt*"e ~R_O]8nIBYݟ66&FrRp%)zc_dJξ_V-xr.M+2CT]y! :: 8l]`!8-eڢm&@ .3&<-zc ZǗ :-Ҁeζx|:EgS f]y2"q<g] 5Ję+jp t5xNeRI"'C!%B!0Bu. @IXvIAK\T Uџ+#a.G- 6Ի#~9Y;P jpFSzcByu4R|_'h!-s d}?`J 5M P>7}=!n-q:n޻!6?G3 D"OIB0NB'!oSkjAAPTh}ص]cR$Bw|$n,JBLBzFLnҁb"bC)&$,pk<@WR`^ uIYy.X!zȑ "?%zC9<%_lhݥD ~ IQtxa{뉰) bQ 'da/hpXZAeVd IZuza(LTͽ`h>EQ(Ut:i rjQcӷaXCZc}ȟitx30-MQ!񏐯 rb{qI$/Z@F1 .+ᛧnOǑOr* ; f t*yQ>9 hXTq]yxZSD)YNbEvУJ"!?^B Zm*aBzg41&_5tƁ`1[*ן/ l}-S}Ua A!ðXG;X\gbQL *fҁӐ+MJ _<"H/<*ER; Ϫ^ -`LwaH}"m N!e:R5 | _B RJ`aJB*qd I<Ց 4G*jo\SaR $漘d"3^{!Ƽ~-@ ʘ^J,dVq^ʮ\y\aM\{LHޮy&co )sd>,w 5(,?+!R^cON%'x߂O"+.eFqz*Ka m5ޝH@5 S Z4+]0AC¦+ђNU/r&{ݠUa(vOޮמ|ҁ9Y>-[/@fUyH#`ef[v*a;5vu)1e 0Njѫ#Y ~|#1dϣ>!dUiN^VRN3F1,f46p")3R2\s |FZoFlXx!@f}i*A NBy1ЌEK>櫱+@qWU.Z7̋/1WutGX&ւMoW ]5U5YHR+z$W>kPqw)bcQXK(Lpgɸc1kбcr2)dvp.-0];sPSx\r>sTlׄف0rdb{AZD ҬwĄ釪P_p H*]cf4T#=iO"ATCC'{tATbI>аPd@dQ+TC6)*I_ye"[ib:e i gK d ج\m8М b) )\7X'Lhp+ru9’~}Cڅ*Q9ܭW} ԰"G5f_(޳k? b7[wi 2.y_ډͭq}XD܁w =}u/w_|a7O'vn *;n#GKH|#˙{\)G*;}EE? V TGDn&QTƖfWXJZE03T2Rfgū40R]W7J?n?' endstream endobj 525 0 obj 3452 endobj 528 0 obj <> stream x[K{ߏ>HvlP^ 92K.rR~Uϣ9r0 Xꫯ}wA*zA݋w/]P,x}˟,ULzaɅ\^\ݽ\/~NZV`vC(6>ifnOWD Sj}*nJKnʊZ#c|+2 ճA`g-wm|uC`) ?O5%H9)_Oɬ`rfo"OJiB3}LȤH} a]q֭a3,f`%شz؋/Ŵw:rIDϮ7+q{—>0TPIEs^E ^`JKx#cC@#]{fIPs&_wJS^֕aiHy2G.tWO9P! #z6 O4Kq(:C8ک!1Ɗ?:%]9jo=MW g~* ENRA fQlsw &]Q 0(vm 6uh肕W\ Rt)HdU:dΒϲr?ԶR҅qlgQjb5s#@.GDBMzPyW$`=%p,Huqۣjg4]pBѐUݥ%0,׻]\52t_EBM7&9E ج vRkHkn /)&n?CKĆc'Q(ӴaV(GЃ0Xͮ>#TxM""PDM"Oa 3 i }ԭ#7IUH T:HD.e%3' `媯@׻Du$1kCxGTѬۗY;adVQ#Ypׇm>=;عT&tQ@jS < [y·8 -riX9H8_+ _>*Lgׁ"eJDW!w (#?۵d5OyU[cj9 3 Rv.3>W"M4/M*e"X\DUVUlCD.cʗ3CwåwNQgk]͊^D.%ca妞ԉ, iA00\H/q)[y X1jnj IQ$}&v4KBrY Oom 0DFkZI5r q2$) @hm*|hiTO#'V-g6Ͼ *rY݌t]svNGd&QtunݮdbtS;cFﰹKW. ~QP8(s}O>/Aj4"9A۲#WibdzM*Ifsrih|$f',L:9?h|x),vM{ni.ȁoac*s #+WPe;D8#)TUI%|tc=1@~E8dwMj)[.-[绤h5XkG.'Z @4Z۱c/s}׸:7YhVΞph7I3gI(TFf`l}wW 1h\ IE ]Ztܝx,ZVft62='xXS:8h5xOLe4ZL8$}mmeT?'0'gcZgX4Xwamam߬Xԙ?]}U VťfBt/ڻna7i[E h\B"sfeg5 -FP7KYPzu܇swendstream endobj 529 0 obj 4236 endobj 532 0 obj <> stream x\KƑGQb8AZE%h0$k6ze@=#dQ5]߽﮾_Y{eoW_+/5 ߽f_Z)io^}a/exi;߅Wt&??r0\~ڮϧg֖%3C~ k2]#X˸ʏqʒ+x# +('y~c(˯uq1 V6>EImQH;+X#Z Ӷ?o/ig ,~|o^]+Y-pn"oѰˊ?xm\](XQcxd/nq4p0!n=ct]WXy Ǹ ذh^6Hh#,aUY]ﮇ.*]5ܢv7ڊag[gN5Lq[d^5-Tm)sL9?^pσ_PK|V҂yY:#né,N0i]4B bl+`q{,bq JkV4MAl#_'*fʷA!;ݢ+s1mdo]7|I\Q}{8t.) 9R"BO-hp.^v"4N c]A]1X@G<@LYI0Do1[׏&KƐOY_A9?Cn6HׁP+Wsw|a{Tg'X*&9~!-h# 3d~_` Aw7?wTI'C$ `mBg\xH8_|OB!>j Rn%?ZaDBBi//¿kw7Q M|ؽ]n#Y+h^*j\rHGztC 0CpG,xCܜ8 ƅ|# At..k2=C(ӈ9gq~I!VB҆ۄY Xkd|/$k*A&q ngCj(Kv 5K!ػUe)M%* Z1{8-qHHC\'}!^O]:BGYǛ83tp9 YE=qV GK(!'3F_-{l*cp~~`ʙпK0?L Q1h5'XbI47 Ho$`i6#B@HWRzms|Ĭ%b.;]^@U qs;e M\y F) TN_ʺ:Alu2 dZ潟P޻D-ȃ4nY2@a2_J2% !p 7yXa"|^ U.1FW‡UHS>Frd9hI @O.IQl,_Q++idDNbb7h˦ þ$PvVi{mQ,)g$)_éf(܈Cٗf,5Q2tsXI גy@Hv2MnCOI`Ғ49;>cs >yHl%q9L0BJl C9v,z#'*ڧ/;PJ6tma:;Sm>ZzyR2@9S\7)2 hBU Dh&[Ri=cU 9N]ձ xQ):WVwj4oS 2 gU9W O' B\p&TF`U& `.TkQ$^8)W<2505qې3oj6D@$@en6}rih Ѧ3En`A(9|q\~L٨K4 Iiw^5&χy(wׂTp<`BP!+},au1=XS"14|  ;O ɪ}`_YؒXDu^g*id=X z:{}<œ+Š{C>U:O! #zSF ΃eC.YB x;p;Ҡm/ӏH5U8on5EM;φPU&?VI3k U/  l"8zgu+ȍ+US>Ob>5eQ7+x;y>9t76EQxx,I& O辻˽ynơYNUݽ8kNDu鹃B%N!>0fM6g:!ztOwu"Y`?|vl6~ mAXpUa(ijUvgd(U bps!by q9f0BD`w]2݇oܒz9kP,Ʃp[~I 1؟%AjO3c{8_ZD]> tYpYT.4auM5LfX~ũGB|XC*sZ2TX<x K?|*_v?){# C6&4:l(vMҪ/ߘݹI,jҮ3 0>& q$s1uH<Rjwy윌q[0eVuRT (̲_9 xF,*z췀 }ZڪjQ|KeIOC@$ FꀬpTɑK=wX4}Kl@Q+B㵛ۤaq3#-.iSUP 7/ A@E w1Ֆ>|^>.!!0R0!]阇 Cֆ$[Gp8+E)`N}hZP㠧ux؍y@Uئu.m6ܐԻ)u!G!In %g o@tgb+YE%&|VL@MJޮ$L`&h63=dA<'xAsۉ4e9t"_FaډUIPzp @1^v՘(M<1F'{@cQݰ|0^(_v?C+:}g /hi ZVL4L'w^8RYti%PՕY3w%-r="y]ՁtBak i4$Y4JP>s9 ggK<> IA|aD 4R啇/-ukuNɜqܜ C3R!7abB}meGͨv2sj)mj9u#tt,=(=Ϸ&5ٽ,..P _$Wk KȖf1s1WfN>u})ΦxӨBieqS ੤uY6%)?tb qUI2F)ZN wgLPKvl iC"iCR#]kW]W2Y]\(Ni 0/Ԁtۅv7OnkM8IW^IUmԑJA*X>Qi2_L`X AKD هsZ~ 3L~1@q* pj6&Є 9` 鎁qMM"-cai?-$/pz&q7_'صt(M+mJ6=0 C!IHf70}v3E$v8FS*ɖt1* Ewhe:3b 9]^6 ЦV8z2i,~2 N=z,,i:Ox,XEpw-HKXsB4r&3?햊gnw㺌5p dY @o V)kgZ:ܞk:YoYB C՛/#Ug2؂q.:[\Nf΂OA ^`.㢯+*`2Kh5 yB3j:>)CwvmmwTvj ?stMMq楽@`q8S}iAB1bj_V#'Tj͟]?ݦm z$Bf$RKLLW*D(2꾤¥*zs̄zaY EW',!,I &rr%+T HH#e94@x:NϠ$L#= 5}5ӈS0` "4Kc%{y_nQa6UӔFFN.gW:(]hw6+ TU?yTݗCjsh _'endstream endobj 533 0 obj 5446 endobj 536 0 obj <> stream xYێ}#f ɉ li(@^F.]%-[ vWJfΩSU3Č?3_ˋ^9 ,Xi"A9u3] >ldK_./yMdښP^Wm׮m(-#Dҹe)o .%k- /G슱=4v,(+U9EryBuݮO_pRr_VE_k?6Pq[*䦞ms\Tÿdg%S1+z6!mWownW(J͂v6yӗ.oک`>D3e kAF3o|~>EK|H[Һf\SJ`< uloVd2n7YEP 5wyOìM@>=7}Q-/)y2ݖHy LկQ:!#]~!CUП'EV[Xd<|eS%І9m)SZ]RZfR!)SxӬF0BXjb !āҦ9p) $m_Dtݮi"\FP:Kc+yeO1P|!iLs/ JҫMWJ6~⒃G<1H$-)ݑxz5R}w +)bmI=Pa5\Xn{REAwmϪXR Q! }JYb84Z m yPnȃ*iXr@5GsbpSs#Jj}I mٛmՠA]cuޓ~ %&QZbӏ 帕8mX$q5ϽM(/;ŕ'5†oWHh6m_;Bip&e(W7hZ&U[P$L6yվ]-&jݦ(՘|S6W3 nW+N:eYt}oAϋs9\Q{l샩Iq0I5s)M EvXܝ"^i^H_jN_eLeMp҂NBԸ(=+,< \OM OA^wz*UZ.v-`-ſ3Ў0M|43? 95Λ/j↥2j@IǦίP55Ut4jGy,.GsmBv}!Zυ=ӭxMCi? .'Qz y Z cc)הRN fwI-g$> stream xXnF}|tpK H"-6Ej;k6ϝYFsbvqc94V0I<`mZ4cFO].0:eg?ѐa p obߩDJaO g!rd$F ⚑`]Ko_UU[5{L@GPСKb)H U$#!K/ @I8cF^ ) a]W媾*$Z^}h]uoBpdڡ`+T s) + '4okmi)b֏MOfb>@ ~nB\Hx:F@B ]!O%Q f2n|v\\"FR{_-f#XI)bOמp=[WUgbGwTD!B;iL,L^&@(f A#T,ݴ5etuWĴn}b@H(F7*8UʶMf1GH9|@eGسR)xؔ6GN Mz_ 7f #=8iM+}GJhI9, 3-Ԯ&"bH;_HlB=r$3 ⏷ J )ه2sJv 2xxbE|ƿ>'A~HVUB&~L8qH(0M8g񕅇l:pۄ3qLE[-vWJAW{s{Gu˺yHfQ0A (~G / ‡)N㯛5G@d" !`A=!"`!IXWWc,b*44a1r7C6qO~ -Ҕ--K|hWnʀ>U|Q7E_!B$N!J<i'^I97gɍr`j&}k,q VV AbBaɀF% BaɋCCx2<[p̹W%)); ']+hUX+G5X$jU{VGfwI[|P$ީ|jPZ jT9oxLƽ@z2}Tm/}SַG uaS> stream xZk>:~lH @vC!_R{FY$ZsV43ZUyU|¿wpۛWVn |j<׫ۇoZ/*no}pQ)}zKiæ ?iY1LWWT24lĽ🊒 -VF6zJ*#j-|\GcifՇ}s/;T>뮷Wg";v\ vq^;ۦ/JTR,bvkFh'+SI.Uڣ;XPW Tƨ*9juҲ쾉W9f1mKgb:P-*5 NM,Vc,>*N1Czens |e+q.d >dArOIA|ҚFYRdIF1.ߝʆycSPvu ZKO0|shVS]1VL]'}QlN8B&$;qkq3ڽصW]CA."l%oȱBpTK}E: `aF@:ۮ.Fjx+ woi{1mmΧwooC}#/ۥPhr+OCd!ݯׄ"rJ "qˌmݗS "Ӂ_=x 8T,"R*&x)A1./8kkN}~㑃`aU@/U?4M;lnɭBUY *zeY&'Tp9l PjP g* G5H<ʰ2ǕT[|=V.ZOr XɼUwt 1c--2 =)`z6+fP&bf5nJG/8UI;gΊ9 Њd .HKŰ-)€k*tb&G .?ڋF*ϊ P',T7T j2ctx=a㮻O1|hj۴xgv0H*: _bUi2L״8_،S.`R4=RyiY R~asd L979):<:ehDȃe=(Bw{VB,xHAR,*69Lp鞘)IJf55EatFt/06>" DxnOଈ\HqF)r9̶J)5IW[L@=$T: cyA-@H+'K}n9 t^Yp͛ԗDPiGKd PAu>:́񠄎172MvCD /,/B1 fהKU|L1k)aY0x%#6Q碎tBZ?D FUTi].9^Ъ-1ĵThEEy|3i%FRkn 2DmBQ-86}GYQ&?%f XM-Z{k$ ǏۆRmg)=)R4I+vjڨnJ64{񥿜4Gޗ# )X"Ƙ@- ǟ)PhW Qu!4 lg\H]v8["&~U?8P|SvzOhS{sOm K?.r?`S:v7-qAXfi:j'bӴU`oˬvJ؆ЉN Sy˯; %9/ezJfByFLi%aUHs^vmLQ'3DpmOexKSC] |b 9Nj{S TY -ij}$*B%Lr␆:P _BC;W%%E`N]Ep7bxhCrLHոF\A"9$n.0f(]mdbh>X!zj` * CA! lѝgn>ЂϺėjfl@x2[Kt ]HZ]4g/5 Ů'hbNB)m#va*D=ڞ򎪤B~̓e+]o1cr10:l2A1X(C&Pdp/CB7'IsTv,HׂȢٷ|t˱3iKq&il%,&Lĥ.Yyr·b-\ͫq:C)m.Ѿ,/3Ӝޥ~,'kK-=wUb.!PgBZPG3#Ncl_"ID)[@mff5 }zc)pkȀ 3:BF୹A&O6)BJ`yQ 7x~-u5+Pp,GsǢd"@7.f:-^81 Ls^}᎟lN #vnuY((²y9y||[Kg)[б|8 ֙8Ix7 k^oכ_GYNR]*(hezZ_QALg'hŏifZQs_X7%Z,rЄZy}nW>*MpM>UIhQd]Tk^L+[WJSO2ܧvraUh'^P٤( a?c;RyxbXef7h5qh!Ss&rpJeHyxH) ]u|L,rX+|`mvdendstream endobj 545 0 obj 3242 endobj 548 0 obj <> stream xZn}W#q0}l{<44f2YKfwU&2n6N:UOV ߻էO>_懛vc oӛ۫xQ7onNWlawJmlƛm^ [t&-}A. &KOkQ2*i|OLa-*-tOk{~ Qr7¨`r2~[Vmu /`ax)^x#&#{ ܫVp'=lgɬwUSn ۴w+la#7a'?\}xng\u'`F, cr{ypclp6o8Wp)/mVyՍǺV,ϼrU ps^ΰ9KYˇ'~R ٕi^mW HQx{k̀ZP3M{w9Udf0^ͤxg N(#ȱծ&> aCxD.ŘI6m0Z"{iĝ"(mBJ'[&R 9g^# ʈ fZV8|oPbhī . L6b ҲȄSgu`^I2a'B JIɷUIRE[Zn mIW*pR+JD \w}=-!:GB(6TbɶX@8K+FUm|+d4ڪHrSI6ґu_G5+ש(dB(|2jlS(XaלIFf6?\'ErK|f&I6ߥI] UJz}0n^Q~0[xlttB1U52vqgܲ,m`E 9藚\Y~J2xM,%t#_"8 f31T>x[i 6D113$W]?,K=CAy(#+꾫 =@ a&E8Bz׋8~^n{ BY'ʇI՝3 ruˣ E/95oբ>h <4酣^sZJi<&".ķǂ;$c\3EmJxROE-Հs8J\A:K;4 -G/\\CqTfrZ AqD4][](X/U2Sh1C "L_kMt\lm.w86-(3Aiל/9h]` 9)L#4I},g ay.t0jkES |{+%ZRf$gsu_fpiL$C <,*Th>7%7ki= /ĿLAߨW@a2d I PAG"d!hSMyev9;GŐ|p粍cG!5>YC*IN`C|aթ@"WfE+C_G@q@O!BJPcԫБ}*g5D&8fY??S&¨rn/Όڞx%,tS$3=qߒ2h\ 䈇s;bJ?[A1Y @毸ߡGlO nQ@G/4ΣH(Nr1CzfSNZMsAMU׻x@8UJ7 Lj O~u (c*v!4p7ud@ݽNwy*(]`1!{d1|˕rw:_-z&08t$Œ\g~5iSrR|$cYoqm_FW놆.K[$^o8h)]ߓD-QhǗ(>0 (] . j0 ̒ٷeEyjcڔQ-HQ=T'<.hdJ-e9J~$B*RG<3̇7}uVv+#7?'߿B9I3dh2e w~8߶Q,ټMlH9b椩4Ħiz9S0M(n!*d.> stream xX[D~#Xzs^HHxlMLN7*Ү4>s%gPpC,[&8,s,f(/sU'-l'ZױuȬE-'x@&r覺fQGJ0As1fBVJJa":mXԦ(;nF}aVPDn|QCC7g?Γ:.SUz"U GոJ2.)Mtn^%N*"c LGb:cr'yG5^eo\  3Z%H&`?|Z&;djLA2GlMccQ4:T*|8C0):9C1tgdrz}a2n4BKB5FXCɩkG&kAH`"z'0 K>_ס26&s鋨iXid3F~Ym؅Z3l;7UQu/}j"5p? %VȤso{bɿ6i@5Ηz^?BBu |ZS /ɒ\X[SmZVT HjyV)*;SW rذwa_vrHi<-ėftE2siU2 n"׀8A61qFÐgd6 \q5…csAƒJуc8eGdV ͔oJ 4 2ONaG%Ҭ ck9F|yLh)pL`lS~?knaY@ s LJAYɜXZ:RWt?L]k$C7C2U -$685=RmG Mgȼo ] %zp|M&Bjy>giyiiק.\bTX{~MsAn3/H#0C5\đ7IXu) -NJ>Ne9p*LVI%I#DCz~ʼƸj] ^F%o#vzۍ\H t£pΫsTI{'wcuɕB,0NjZa`'!Flņɀ iL4}w*AiMeIxvU[&x7 e7C;w;CǙR]q<&0.I\OYrendstream endobj 553 0 obj 1497 endobj 556 0 obj <> stream xKo7B>bcH({襱9V[WrIj]?b,x0o D'~׳m!-}ŻOab=k! 4Cbq={]Y|#+U1'GgbΦI.>ofVJg˾ deD#R29Jn{ҝ\{*o2 M57.ڄsrW8 +ǔ"~)Oպm.$` R8d:PB05*Ptp&2\6E|fiLvuuYPjsǩt2c # JS֩h?nb$.vuRP#mHNR 4Y}]^Yg}!j<- mS>գ)4%Q]ea6IQ@N2%EN YO6An oEO d#x&[?&/޴'fIaZ1zH^=4i$Z Z0? IG;Bi@l=vY=5}O[p:#Bzkp|u;MKU,^z̳VeܝXC@]1PYc2p#^uL_;i(i puV$N4#v4X?endstream endobj 557 0 obj 1024 endobj 560 0 obj <> stream xYio͏ `N>`- _py=]sIw!@G^ҧ+suӂwk~/oXa?-ƺ^\_}ğ?b^ 쿾]EqMu[ͪ iY0LiJH uYpUT.;NXNx-4BF;s 'O߷A#sq\qB|2m̤ś L'=ݵMa-iۧ%=o*Ԫ` >ݑ%YUX\9}4BjUڇe Ǽ]-PauRPd~_ :f͵hS8Sn&y0(m-&} >䩦_.5d-!/]:QכzUr%sև Ch>x.R5?ϼNA(7Bt6t}]W{^|6VE4&NBdM#qG)ΫװbMf>VLG$`OG^0N>ڪ ,eIRrUC5RƑzRkl:p!,J|W9|ȆnjO^r f.ynӸ%ڻzt6j"?o "@ާj۶n6 gPyu.m< U RY:`x}ùJX!ih2OF@N2CeWvQ5Sob58tSzO=4yZ6.0QsxM9pzæ6P8ӃMt$-;#t] Jf> K{6z@/{9 =:5v)蓏c?M->8vIqzpﻖ r,l} pUBbA\>{jĬY}=ӎ)G 's\NMtaG4 yzm2үqΏ~D8.z=rxXIO.KC9jx[]B3A!nb|ZۖlE r҅QW~liX,'N{qh 73 YoC]g rɳ{E2ˌЃY?Og?VbΈTs&XF0Q}@ <$GB96}vx y"NP[CILJŖk'9ZGkJ bDMl<9pQfyو'G8ɠĬhRH3zƎ W ͮ " Usj &NQĔMCcÇt\s}be/όX:Trl&GoȺNex^r1qөͰG7A8 sNCaz&N07 َO7<@kL.Nw ~FnT?M~PCC { /)9{CRBKHSq4eWʚchN|~-$Kct/z?kendstream endobj 561 0 obj 2191 endobj 564 0 obj <> stream xWIs6k#xLg"aOg:M͡9HZ"RY}@Hʱg4c|o ?{}}, x֘B3gUr^!Ch!]̞,]OVAbNJajC}aÜ(ȀyEB8Mq6&Rߞ]&Au\}ddGAƣUSk9xJd9Zzϥc edRtmuY2S)(`ЪtW 0AsJaWrE bǤ02 m0%T6j.b'9peE /u3H^DgA:T +e) ,<] z0&% /),Lf;/:nz{:vL&)B)ոj klqkƩTW1BCuu.r(=$2Vo؁ߧH-4WٌjA޵41)& r+v442#HK jaӘ<-M)gr*4U? =4` G4l@ ":hzDmS;Γ1Tj*[2dV gR-rzGVyBsADtkա\o;7`M攃(M#ο+'\(6G@qP41NoZi!SڞԺ_8@ut~/IȸSk_{J|#ʲ4N<tkH{XJ'icLa 1t^k43k3?Gspidv@A]5LG5H5Q"@exüjW^mt Ռ/x H:g'qvO> stream xWn7}CrxMSzHuB7kWQ ;rZi-.z gΜ DO;]Fw63]^y#*&7(&}$hCZ[-8BB!$)w.CϱdIcq69Cg< s\M<(.Yi÷Krn8'+56Z.f4rA, +8VB Z<:\cCp`IQLiG?]U:~ >Wu0l][N5T0Ye}'WT:~IRR:MJM!!.j0Ӑq_E Y0)U1XE쾿#de/R@#Yݡ.n5oiOBQ<~rP0{]sg3 +MD 2=ŹLT ]~-^"iK8aO?@rx]=l1:}jǷ+e!&2!+eIW̦t^d* õ:ţ7mqlxh%9{xܼ>82le2_ /-Y ,Uwn[4`>gXeOn&y>f̆3qIRlMx0z `qMbȻ}љ܀i!Goq8iEMl cv"YNF(mYSv@e/bB("6ъyRpAP`z4udvRQCg`>]'GiTk=(W (p72]; :[Y}> stream xXnE}_FwW"M +Azf|CW7Q}ݝƱ,,%JTթ9/(au?|r^0fG)4#*fG+Xa4PN'~A{+ގb`0l1yc! 4xyLBGoxZλxh}8Ldx'Uib e2N!19@@s-r DZUUuT5j/S_#,풁!**p (}z%UX^L97Q¹JlJA^6q ç5_͜)#L Y G 1,:@Ep^KKs"yW`YEҘĴ~G܈^fdJ|,b8TJǓqi'6w!5,W rFRLeHd ?pyQպc j 03/x piFF3)fԍ;ч},QVDr&!J]33 MRiQ݇i1mW F7ncW]}zi (߃g/#ATj\jޗW|_U\/Nj5]({-ـO lG|(YWop :`1,O(Tdٗuvnond{죕?K p#$=+A_5ubFdry7<<1x~Yk23J>'A 8s߬Ýgש~Co]8A(u}]-(@oJ򟤔# #HؽKciZe"D>fendstream endobj 573 0 obj 1607 endobj 578 0 obj <> stream xXYoF~#v#E $=):Ba~VI*}gO-)q7͵/0"v?sݏ lY20H*y1 0PE1Y^hrjӓ5iMA~2v"".GWv5+XƯ"ARDF1-JSќ)/;YWrLTbܓ +d,~ ͘IpM/I嬍 ԇ_$ȰLlbx%R ${9HQ"Ɛ TO4cjrQw+Dٖ+;l0F X~va=7uCHJCRm$w71!l*: G-ɴ$:4~*FU)@Fiw(s?x]e'wL@bL0$)9vzΖ6D0Il%# %E%@hR) &AntRcCu`10f,% ݻ.,UЧڈw!j< .@Nz۽`T΀EO;P9NEr: 54+DoCy-9%d"{vGHHhjg7qT#Sb}D0s g7fi.dY]mjz5r(2 ÁG$۷P9DWXv[C(O-A 춱~xz':NH:3E2 ,;&eyg4<{( mg O̞`SIek9 ~h[^Vva`/P2ݺ)&#@E$ȼ4"3o=:y-uXCr[ u'ܮQsyFI\-Ww {gP>͟6e3vJYЩkG vܣEBB#Bt6r,1FɽY h{<_g' A"gAc#?J0`@Ba+:a-cx7:Ɔ6,Jyٖ^L;,rJfZrsYWckK[V* 朢ڤu2i}lXT$~7 Uǵ^3:~{6f;}01J H?yJ=7wiF܋No82s;@;VBv7f/P8Nm愚:&.tykxD^׷:PtVƝE,6Xܼ9?y7egh\C䚛~M w` }$c$o 09R;[RF㾋^eƾ$qf0 ŻC/j2e|Ur? MYC#J~3;ERF.G"e2zp~V F{/C&> stream xY[o~w#{`i6q ' -Q6[ԒwmHJ ]̙7O qŧgn/^jnzs²Q vqr}Ç%\Fp^_|S/eY[wEfsmyB3ˆgENTO'OT5"}̈ZK/% YŔp izY&LM3 "I)e'ՙD!bdŒY V %X++w4 5o>U1\LY^!qUE iyw_D k#U$$ v=pt/a̬L,?#5I^>2҃ m;)j[Z 5D]"[(MFD?-2vV'2RP]7τerd  q.KodL|gW <¤Ԫ\ s$(CEY:<}U@Tλ|*p-$A<XqNo5lŗeZ't5u焥ⵄE6pZzgq<%-7u˻1/$ʅFk|84Ѭ?Iz^32nhbCH>Ҙ !%ʱm@vDkImRB󶝲ߘ7?+] ɥSIK->v h2 N2 hnXCb'[x503ia n2 )f3IzϠq̊ wYVǐrGڥ'9LUwcWd6F|,LVk`?I =gBi'XC_y uǖR04RWGE@,諸 %1بӻSLyWVUYy/;13U|s]kvsv1EU|NXƪ.R̷pbS{}{& B?Կu[ve]O8S焐@NZ p -ѣBTU9g*[֫ԗ k$ LyFEZsC&3 :h;)2_L`^PdTgf$y5$It YM_I3Ћ%>* VnaK(ZL&UBNiu.ʙءNv(|>msw؅S.&(uU>f8o{wbr y풁/8tO{oP;~ZBY鷿ᘘC$ qF~1twZ !ԼDuUoʦ^·;+o;8.OLBp( Lm$`1Űv.D qٺ-K-y>1@^5V&[$Q_NISmGK{~4T 펏I۫rS̊S[G8qmc6oSI1k2Զᨤg 9@+#!fE57f p=|V]57Smྥ_\SǸصH+ρJ\asV%;`{^:diOS̊ .Snǽ]V28`G%Y1DKEe0:FUSf@+qD<ʼnFR~ 8~5l%4m[c#;0qNd'q!9~r:g>Ee,RKj٢(Σ%c0ߧ[ G}} mWMP& C tKonpzkw-z~ 2I8ᅰݗ.2tMPe S7ܭ9nz j21?&bNC) ; w'?M3[7_2-`3_ebY2Z=|[F :TF+`}d1ZnSpt4TUVpPR`pO_jvŮn0Xaw:Ic1E`ibſ.I1gendstream endobj 583 0 obj 2522 endobj 586 0 obj <> stream xZ[oܸ~w# xX/hl/iHu3I{(!;9/+J؊?ŗ?׫?w|\ErteGk.8ŏ~ Dj)A:|4f3*?0g0M\ w9akZg{?an6 Eu'B(Mv_d $66,8_G7 !T{:51ۧJ9v ^k$Ο\}. aP ozS~" [Vaiiظ^7ݲ"\ۨXK,Tѯ9o=e(7ի3`!t[vaUR' /v`q'T$QbãpfF)B;$[F_Gh#d4sqpQubpiYf^BIf2Iՙͱ?Ի߯69MEM?]u-5Y@x}Y4իMIݠ|Es-v'ƥ6(nJ $Do GJ511d~Z}cxA7M@G'%ݘl^~"!blHC0te 9ģ` 0NME `o[7i R{rD6I}kcmِILy'cO;1xYRNiM]u"w߇0fV; ,!>8'c3 xPUvgrL4Kk"vaO=DL 'F9JU!-&2 *3cNiWǒq45z,b{7Yv2T%2& ,.-*r9{"TdУI'f5 1c-T*,9T1餍 p4o8saDX8(rD*KAbN7oƠ)1fʜ)7uYDDRJ/B)JB$O0H*634Dy%4K%2-Դ|uic OWHd81lDBE[!}Hf(54!S.p }ΗMІ<'Nqka[8aXq˨ etbw}$b[ ,z/ 4y` FSAbse ۹TJr.AAr[TMmh@YLqSc %°O Jc͜H+Y$njzz*TLQ F~Zvgإu(Xz*jXx޶C ~2P6ByP2Yƞ*h8R [E6\Ep)];Rl 4؈yNph>kg&sxjՉ~ϵ@ۦ=OU=3ÇN(,42SNguufڣEV^Co z!?dnmq;}ͺ <&gplsA P̵|YV§VJs͚[ct6fes>vicGqI>*;w8;s X x a,Dwo/pMPrmY},sRbG]|mi"e+Z- c4a'-'&N&a1sYݝb,NOQlbaut \/l6d~jd+6J3 YEN21|\ $GǢil+U+sVR(˹ôYOj?[(FGk R4] @ﻳK&07wso5{p@C#PLj?w3CMOzste0'? q̥⸋ yXӁݶsSn-^RqQw4Y[3kl씾MV 5ڥ `ۙД7*Xqr^KI 4;) 8 #-&*U3EEoGD_. JDC:%KQ.{25`#볍CӴiӞs S m\T'7{ rh*|ShtAShB$ΐj bendstream endobj 587 0 obj 3165 endobj 590 0 obj <> stream x\[u~h%0~IlccufV-ή}NUT)cC\J?ǫ&i.\2x鏧tnTܹ7¨s$~7=,etz/S7t>7|~+M:F:a6‡OgvwC׮‡ oNy#H_uc,hƧ[p7ƺtq4߭@ڥo}{^cnsac5cT2vznvb=s[S?ůB Wa W B/~i~zZ`>wW. K8^ZaTO[EF)K۞kVto. nn[xot.T㹁-0P-j5%רx3 pk͓Ўc\-]Rqkrmyv44ntZeoOt0/ v=ty'EJ0s)9Ap<&@4[S"4 pP.eK?~=?sz*b yc(EQԠ_x@ (4[#@Ǖ.9Ad'5鷇Fo000/+.ܻJIu!P㥸wDdIU8Ž 滿}tm$x[\/ \S}8@ ´idKF8—ZťhOHYw\ט1.o%ݰhG`vH,%D<HycGlttPE$O0B, D+Q11 `֟gCQj$`Q 1tWa4xJM"S=ϯ,sJ;6t8QF5B<h>RN)ojŒՏFӅSTe@-q3i~ n6>'U t(w{h ,nf>zˑkS.ZwA cF ͖*&noMwLO=!x]q$_Fco$dU61">c6}|UA?}PĸKKofo?Fg zDӟ s"ߕb(]NtHл <&Cw:1\H4~jW ..d?Fp:sV1'$E/.1W'dPW̋JE0O0QLT |>0@/}4S C-J!/,[&*Y$jL@ݝݏ1Q8ɘ)SF[>%nDA2$H$ȧl8B`)Vg[=~)rBdlF(Wx(XV2lEEƋ3dH_F9ND'2[#U{Ypbn1Z:D1y tH rş84Zl!mp [Lơ g cX,BS/Tx/&M_0bF.q]?»bU*U>7nEY wiKfz6 Tk>"+.B,‡DB)V=ϼ/Tȳ?P)TS(t20U4;MX*#,&7 *]|)T b)H0R(v|QÁk.2@):$m4Cq(S̩*4̹^0F}xFEc3lJ OOկ50s(ԇax}FV3 , tyt>ne˃I2ŽӔɔJOS,:%HR*sdRDruA_hV  UjKd ])DPWD*kB_j챑,6lc-SX˘ek\ݸе؛LJO[j M_J!ʪ"ܝNBp2أhg%Y0 EƬLQ/HCdWe>)d~52d]-6Z,2y"얡v)aRWn*[3&@{08[2/#+U׌T@CRG:*Tub} ĤUtCJO&~ ,:hdwsEdukP^$$]]*/ĭLŏ/fA-\L1PS |GYkXg yŢvFиm:T>eH#Dl8GoI1l\zT(=U3 %Dюi54S?a35 5BV#dnu0!?uC1KР0%nطoo20K^1u:4Eb*NDUbXr05 Bm]tUM%3GR$-.e؏}ed+ir>/`e C6K6X~#!ǢZ8^8Oc"*I&{im,(Mn= d92$, ğ.ϭ/"BFJ +Z1DGP++ WCRI8 59ccYg?b15 3L%9. (ajN0i Ss&VǐkBz_,IK;"DQc]m@x:]jKd|捷L/1aB UuQu fqfFyik#fV/oPK0z-5Q~E>>q C/Dhd&SH+家ns "uV|_Hk(ee.L]62̇ {9lWiLpI.gXKgp:rYa5]]9R\V Psfk*6MP8xĜn+G4)D>bւ]2oli-N>WK'=2Z`RȔ0}ۅ,-<5WXe9sYt_E |.-: EN=Cp,z~#lRQPg`AW~lXBP=+`|5bȽXsXl$n c FU1U /`ħ2QMSNF.N`:܌ab!KS+:2˩)H8*&n=Vn0 H[W p#hWM2DܵnĐFpTfܨ?ͬp Y :$:C Aq>%/b;? 9x,#"Zo :;^8ϣ\VˑЩmP+z~QbFЦ(lQRKbU9 ^/(#x-n1K3 m.:m{,ÈQYJ癘Cn8Ao1nv"4dCK_I`W3`C{Kusq_2 p4Um9W:ie'50 DUL~(qEVQIKI"Ż;`[Y:KGcYN 8v]v7UˎpJ7i|ly[Cԙ^|mpx.02Ĩ0~N~q3 {ԌF˚Q6e ult' mĪ@nYQzOn0U 1hwk!T1:)%S!3f],8?b9p^)K /A^it؅!C:uhl3\ -{&[f'l8#˗C%7ƚ[Ըh]TW([}1kXܭdA2\4A C  DC7VԡB&fK*x+lЁshsl&Y/0]a7XZ pi 2UqX@Ds[6)ݫ;N[=6k\?4h;YhcJ󞮻Mށӷۧ9endstream endobj 591 0 obj 5218 endobj 594 0 obj <> stream xXn$W}7y~Ai/d(F!RQЮ{~,Z]/~qq3)؜taBKه;kYa ه_)BI>6U[5} 4lBVs#ݖ&KeA\x8\b96NVɺ\1>s̹zHFL-W}>L9Qip}Gq&*&4MU$H(Qk#x,pY ~o&k۪?M0ʊekJ<5`B'w?A2'Iofs ‡4gi^^z -i MR.աN`Vɽ5e6 قpejvM ತ1bK} g NUZiƣbUy7 ͖\(uǺZvM,"$Z+=ftjלWMD"*ZbygupwXF$^ 5MsAf&?u|y!("`9LR37uW_npH7.HtSdr J iں#w2Epf]{6f U6!iA GAO)#! dV{>}_E2*ČT,++.I<=G}zjfh!|S}/߄Mo?ܓo^uou_?}}mhLӅMJvh+ն_;\UGq7Li$6TB"(a2wHseYtC*n#> l)Lh76R!FN;v2my[ƚ=p wXd毛􌹉g` ۊ=CxZ ޫ9G$˘Hih? )~h>Opj](t>n1eXYtqGYYfT޴b}% U 6>+#֠utZ9_IVS^W=HD8$DZ{%M s5ҕgMoiVkX g8Թ/ժ[G'{6!̡JMю=$%T=TdF5)97fl]/kZV|olV5qt{r7a2T&w;sъ'].#EiDMDez"2˲d-IyU\oSN؁YG"4*],]v}kɪ \gf]b Yj$ O:-1 GqƇKnq@+^h 1djCJbBCiamե!9 ts%nbVtcJxK7v*ݞ7$٪m !Kxa@V4tls~Zqr|ɸg{xa څV5.wm*K}_ҖtF c(3 כ?Q ?%|I.N(:=)ޮ;=|*%> [B3s,y;I49{?4d>!!WI;& 1T]WEc4pȬiwH.d6Ht@-O+hHI+-X:o{xy8.> PV9i6<́ k>T}ÓBQ:5<t9`ᓊ߄ auaM80;Z=y3]pwY3&*C,cWF'J}+#f-~O۪I!Yǃl\}r͙/:-.endstream endobj 595 0 obj 2048 endobj 600 0 obj <> stream xYmoޏw-KjЦqu|a$:f!HqYά(Q\E;`ܝy晙gVf3/g>[g/Ͼ}cJg׷g>Ϭ3]Ͼ^|sO6z]/Ͼ~If[xi žENJoһ>`Z.h7Jfp1L=UX2Sָ~ oQr $O[oEƯTզje7 Gz}$dSӀͅ.aU}6:YscfsK1|t}WM DBTo.5k6+s`@NW 0b8vݐ \WƓMݼ/kT{/ok$Y=]E z[w 5~q[|B(qت|hbSmSI5G,:1gq_ } #!ZjX' Zp&Q%q'H _զ-tG,UPV}H@a]gY_Mg00?}y23*_ `(Zxmk* с"ƤA+m"!ub@tĀHv%T#n/RI.GX:n8l /mWWx1`jpaR˪7&C!|5U&tn ŝcBRvE멸 (!'5ZXGBafM.&eUC .k1eT/>Ud`u|U]aұ`6MEE-vUY"e,!p9*uӁ1`1r9w>yCWU^Jܮnم⡝CfB]!/bNR>AHhҮ# 烠޽M(#$@[" H 7UT K_\-,DWGM@jէEu!ۺ/ҿMT VKIUm GNNM `9t(eHa@ϭw8}@\Q T)V0RD?_C E5x! 9`~sU7@ tզO@Y Sl^Q e8KΛFՖ׉\ٻԘAPc=.xg$=AW]tb,P]A {?+Y z`p|]Ou'@~ 4o\=TN}و&p0aJ©!r)alvKaׁX)tG=Om#IwE]m.v6iT[s[SY8X=]JbD ʕR$_%ȆnccO)B! 3"|+21SaJEl(2u1 r9o>  <(6?ȡِL :ۆ:0n31l^mQA\< #&%t0qilN4Nc)ri%B$y!Ng#1f+6XlbY턛P~k9-T0}cr 91x5.`8Eo&kB@Na₎5"&=r}.OkIK0/I2-B~2u{o ]s\pT:($臊:n<П87fl $C ]^t.j鉅dxmg""笠,=~+䘁cDwZ7Na 2P7ڃ!S!{;Sk,M=@NM 2;tG os'J.1GT>p|bH"ȏx?=e͇X1kYeC`hhfW͐s;Mv4ޤAYp^wUx&kSj8+!΍#uy7S7~#nNvv?bchq=lX?p!I?m@T dzuyd/z_eؿƞ'3y,/Ze>Mi{~=#l0>mxr7Q\ rl`Iƀ+8qEs!?^p=Ywkendstream endobj 601 0 obj 2624 endobj 604 0 obj <> stream xYYo~#bo u>$ck+9X~)b29f{HB6c-(a o ox-]jq~s{uXa q"ricuUUSVj'FXҘ&TVJœ„e.vwq,fq4MfC\$ٯ: :_6]8@INmZ-.->/FAu^M ,'<[c(.>VbαCGF͹ Fw Me#*눤']g]U, <+N/MxSG'yH\>N۶-,$'q=:3>(}tGEnrO+ž"O5/ܯA>dS A(r{+5tP(%Fb0c@}hgD8!H!~7q tmWWWAJ()8!!O'?jdO, *$Q Ibpa[\K#*L$<}( wL GMu83w9…h!k6}~ fejaxɊMqwdG"ׂV#eZǴx]7Notgp8Ru]wjcd(^岮|ǐL8A,Szˢ.maM֥F4Zm03BRD$b:Ɉ''O! F(:G$lMфD&5Q?EN&hnohPaʅF`E[tU%m.F @¯'VFkѳҺY#4ke Mvpڭ/ÝPdF rm3lVNGkIf=P(!& BLb%u4٤ lN_R,N3e|؍=hRn5ܹi^+u\rHt4|k:OKll*=m)zOSѧ~#jȅ5$:r!!@XD6٥w"9ն)sz#ezY BZME˦~@#0XE,7Ў옪Q4]V52s"]Ilj&rfl&ˀ(ޓ*"n $*t/W9Dq\;t)DKY h̡U!J풒d`t X ܭ#vK!fGl_͠b^tqwٸp!jɁʳ7U)ڪK < ,`c3Vr>4ڨao/A. cίH5\`L m y^MK0>6/ 4¡/UwLRI @!aXn H caL u-M0!#\"/<RN궫TA1N{]4! ҸѮ.8\%R\US}R ;MRƧ&A)W}{!qH@GBG]*T<)ʿ/x˗> mLCFNK2i'D9SY,} -XvKj,%R'OǧQzA/E74-Q 3I3gRkOϓgJg0ߩ| "@Ys4L';?ŧ,UfѴ,16ŋ:P1sğ$t N{"CAςoUQ/˟`L//үDz85ȕc48EA`-COgղ ᶩ20Ƽq0 %SgA'(;f18E`(pEPL`OgUsNW]}u7 O~> stream x[n#}W| _YNvDePvTMwWϕ2Lwu]N.~^]|/W߾ve oӫ_yQWʯ.|sx=Vkx;%j{:l/K#$l|IM|9rY0\|ZnNóELzqžL}*|d kWO=]03=(_aJ|cQ(瀞v3  $$SۮӠZ GAq(SH.ӱN|:Jփ ǦWxƸx:*B$%nv_U >pӖ퉹-P8+t+& }|\D1c6U=yC}hb@A4I U`%Oq&Vd.Ѵydﻢ)Y'3j4Hj/fIW$C+*8#ܔZdiղ Ɓq@"lrM=VABhS4+4z@ɤ&Rmz@BJ‡sJS:`iw7 Ą势RL.P€I[b-&nd1!ɌbQT;ؿR N N4^Lͩk'v/0ۇ0$u!_hUj#ΚHZЏ=84g#Z|.vϟc+Gv>@0L}$ MYa`:g@sʳ_hm\:^+ŕYൎi鴶K}Y(ӚE]}~>NS+i R |ڎ8e{HGz}dVhM8O a_~,Q.mĶkp>N;n,GLUwL_3g9oINI "dy8Pq)]pL| $_n HKPac4X*D@uC? D Sm1A_mwդ@Kjʃ)? ]DnpO+ x$Q߇o.>.bm*J癓ˤ" 7^JbFŽMRc8ھFCq7☜}9~6S{JU(φlhJ.=jnL6 RVaĝ]P@?|t[`͠a"?l:J3,7)2r|&!vlSƜ ZIo|8lZ1snZ'@ bzqjT}V|4S{-9QFb59ٷc0ERG_ h' u`:Ȥw%aKYd)E{QGe}UN'ƮCHȯTʓ0yx$1ecr=B*ؐ2[li`)<lNJ>l(Rz$Rݲ&IZwm[!c ےZ*jw EA{<P@dx$8 `3taH~|H}?vIik|G%G:l(PP1ݲj[DCtxlu;X/>#Fp%f*bBsc32.9o9SvvZ~uY;*vsk 'A>˪P@MܻYvIItrN1XWqE.xnE a(0FϒU,4d_HgKD'dED3n&0]0I6kU ʚ QNi.Wh"OPW[yLo[kКQuq`ԗ~,m tٻ_Q 9#4x]>H>bkGJȻDZ#Q.3 O.0aI{EUȣmÞ Reo:4q6jx*f)s;H=~%C3&v ΆXb2:lPVZ@̠|:lzDM7p[!qݒe[-wL-]BBiOWi2穧ԉc44VN թe[5̷6~Kϴt'd 4i1+4u?;w>)%1=ΗM&N ~%D<39 YOۻhjx>J"SJHw- Y ;#-pp8SU^[l(GvlE}Vn$BOZxm.(ҕ+SeTێȜ6^ᤒsm7T.hu,itEJߑ2=[wAEGL:F"(oE o{@@jOvָ%B OuD6,q-_9Mp~ ]ol:K?Upb`fMJ#f8,.B=9VߛG:YK:e7GrkV9*2i$[*l Sg &jlxz/eh8V$֏{zјX ˙*y(-[9kvyAMP$`> stream xZn}G;}"dx/r crh38в$>fLeհgM ZUN݌tFOqw݌nKf)1Y]tfLKX'V<56kYa 7ˋ' K/UTE~%yAQWA3UX͍t"9,ȂZ#{r~s jҳyf]Xw_yu ùMn;Z.A|XL9QiqyWN"=٪Кд`d%j-s̹Lfl xY;iHnVQ3)uzآEQ(.y\BuLw^hXeњՇz4x"^^n6p҅t]mզZt/nz2uu3ecj|\.-,E;.ʴh,àި:"97 pzS߭켃ݬDRdڎ|P?ėUT@ HVnYE'6X^mW{! #->(} ^P1tȜs- ނ4xZYa+EAWѣ窩}2H1A8)cAl (ajȮPBAfJ˗6/!YpR8'9\o, 8I0|* љAInǮLbSn[(k>^Xa6VZ2 DPuNtxQ휉B > -pW$P+kob|_w\~nm-?ۅ O7z|ICi}6 ~]zC^Rhj.#617Bu%k(T󓂍iTtԥd}pz&QbM.|΅%MeV`<]xE:ܩ9g Ӝ8%&4% OVy \G ]ō @ ) JEH`?D(|aa24VJOm|)^oxC3rJvuo6PLSu@ v_93KЭ^VJPmg)CPv$, TP i+|3,cH<ۄF*lrՏC )pOl@YoF>wN @謃IQq@RGJT }" \UUZqU{׸^%wG> _x0 /u! Ga /Rň˼D "k*n7s/ĭB$X6ABZ{Izi#Gyb}TݾzX5$~(9F1m r\:+ id5&r_M@టhC& dc."l6^m0 X"#/$B* *zO XrJ'bp.ֻ.]`W3ժoxt(F{#D[U 2gAŤs(0' u3Qǵ̦i a"8= uB!82_vbHwiWO9i١1=y \| ʧ)m>o,dP8.F& I h췌J1d@ʋߞ]Ed_aFW`$EJ\`e'0c8!r`dBGvj1W'ZY"xIzU˱\en>-;G̶NLap޳PU\8Mo^b?|(kӍ;1sȜ/_\VsmXkT:ZW ^r՛2B&BS;c4R٫"W'r*Wwo`K6#nJj/ZLoO/z޿?p Ptm?f _dXendstream endobj 613 0 obj 2728 endobj 617 0 obj <> stream xZKG_/ ͎DӮ#HwўiL(xI;X@$78Uu_3`b)5$ W۳>[n-.wqS*x~@e҅Vpٻ.^~>"Khzq>{ U,Wܞn Vg!aĄ|ՆE q#'*n\߅U&;[RքvQ6Qk9OfV1%fp>~2d)U1 +GZ?ZIʹ.!cjd֩$USՓf\ެI%(Y>Zgbq j`Re n`c29}yDf2ɂ2ѣf畕?)⾶hnDF鸚o5)V?kaqHŨ)IwDwtɫu]$[rF3,)ueݾmݖu)uƴB0ת:F.07[eRk]ܖe064ճ`l!U\f}ޝ,2m1ط;9DyH>a%nIaɫeuL3AD?8954!' ]% 5d]W9nͩpqƽALsG 4ڌw58IHC3zn*eh: ?FG@2r`,V7?i22(RA"lQ!%,4iuMLbaFVwXbqAf -Ϙǀ$ZbP4$ం^DmQܖ݁"ԢZ$@Hn1?У#4.D\rMz,'$JCFVǼOtu))>VDz8š!s $_4x&[6N#U\_rOi8YV͍/9ЛkCN؟o#@Mƭ&4LiQFMlM6 P_V{soc-GFi?FjU]xV#hgFy/N!g8oCR#bU\g^Sfq8{&Ҧh,փ6k&XuBeNC ,8#1ϲF&e昇i.{%ݹ*MsnH{1ﴎ#8w>F ^͎@1jk54E?BNcg$i‘nXzwS|82-Q>zo9<#@ז÷&; Ԡ*Nv /2g5NgA wd5^siaHJw[9 ^[0='y3q"#Ágc#@9v=r:NX_~&VS,{it. —x*#Gbzh=AC{b&R ;QMB5ŪƅlȂ{ip6C,i=!'.N+JoUuhYk3fdӮۑi]O0c}woC,&->Vj:i;h!O.:ͺd2}ycBp* ,o-  ˧]dXK[:8#۔Nw&'>zNRӽ\XHpӳůǣmۼן|IX_Ok'_6~sy_|X|7=t᪃6#:&7B.,?-+B=RL  ܒK*o.۔H=ī](:(%a B&JGJ,LJmop i_,MA9lq@t(Aٟ& eNE;/$OnN =GhyԍiTe;>L =5ꮇS Pr֋꡹cvZzTwgm>*=**ʫ84(!ހS#~]S 9f=Ϯ@{:$ ̇G/ËܟNYendstream endobj 618 0 obj 3598 endobj 622 0 obj <> stream xZYoF~#1`>HAWo>}^Qܭ^-bJ.d%wV}kde1 _lϾt[(+6.}j6I(OJW tW߻5+aJ֓Y7rx|g/Na8I~)Ɉfk,FNTZUxW[Z6>l> X$ C,a՚YwGUC6?SS+2QXj YC 9)(/]U]_zLB>4')4D&{zEݒ!$ݲ׸* I6)Ap_ nHⶪon2cM~+(o+F a Z-8WE٤B{pk`?(Mr}PʦM}^mZ=ԓҸUákv+>rnb]HD]W 5Sn DTy}~9D$@]!C 9*iQRo!#OJ}@1vWՈMCƠߗ}e7g/r,iBf~;(9u0Y(G]DQ^ |:sthMQPBE`ϙ9D]&͑@Fq4 V(kZ |*J\FYJ*ni*>azBM۬Wug\H.XRHsnNBK-D4Dza9xaauq`vLa7E$JPJQ ЛOЁԉyQ9Oam A6nD݂%"S`]-y>ȒkG&K^{$Ȯ *r2."$~4)*R4EJEEHf(€}I\ li& jˬ6[]WEL]3 epWS$Ud,F nY!mgpΊ.HNL*C'C? ;PEĘzUQ a)%b-$AVBD Yx61f <# #ø0wb@ rL16z+;qm  i0@2j`v!L.F#r,rZiN7p"( P /`0Ϋќ B mcfo1G5],$):r(t.&bpW_7 n ]\܏ƆncE]"0hjIuSu q4Kq̔C2 V55/iiJi1!?βS٥C umuT걲 !wl4QEc1An &>㮐BFiU}'%7wT+ 1*PȄi̐i7Lz'3S%DXnnK4 ~f:,RNM牢B/ b̒ 3ej{m,_%a(5 P67^|49Fsxđ |7QLէbĺO%z)RK6\qGoq&PSW'8䘌\=RKLJTH\`)Eޑ}izC-D4% 0]G5llb#5u}9gtħMuП vܶCo@#do 1 .4UOvY@bO[c1_TiQcZXG78LXOxYˑ#@~ZJ&XN‘:V C wqC-5v޴(p$Q Gl};7wEu`Ӯ6٢`X~}JӮw8 bV̕fʂTI0l۾<,#8Ǩ1OT96u1h;8NXꕬikAM,<+}d4h`SbQ} J_/[b :uݕÉhp#bۖ4SWeFJs? NGc -Sܾȿ]t!LQ$J. ]lF:-,rU3%7?mA(WT@y!* UǓC_2D y?yVwidC(*Su+Ҝ?S͘1%Ex5v]OQ r۹W? endstream endobj 623 0 obj 2747 endobj 626 0 obj <> stream xZYo~'_"I߇ ?q &`V wĻ;Yߞz..)FfOwu_}U?HAWߛO?K6WV*Fn.teY(]ik_<||wop#bWWۋo8Y 'r8l|pnUz!arA ˇ/4&n(IdڧrCКPoMz2fYc1ߠKMV1^+W5g^eCnjeg ǚDBhb!ճHZ\n.rK-ؠ{HCX`d'"Y.(r ">!(y4?` !*#RIC]FBXXL-cbֶ-T`Lɀ?km.FcYri[C` XD%Ƞ Uh 0%TF T:FT|q_chj0wӊyt];sŊmtYǮ`.dZ(67ȤlAf%yKdZ#Nc4MGZ'/WBQفoGLݕ0X^9աl"e:޶P& 9d,[`K> jWeF.D\LƅR}mu]E:v*<޸>h-%D#h&7w2`be"3'F]8&r~NٛSw T]ٝUDAfƀ N(P#o"dz% 2oc>:@9O_Rj\"3 s_7D*Ӛ|0@|bCd qp"xkɐ.F>OO}&taI`G07, yt Ovi8Dv=DXu6j .^m@ $ Uc |8b p>(r wj<ŋ JtD{am+/60xzt5I-sYEU.t!Qd2pף:H^aCe469i-*]Pcyϟ?%S.o YORCm UzD/}\~tV:nm!I ͤ%$߻]lK_'I $rg"X($tϷwDZ^̰L_%Si[g)LWj. >DdLt!=P i_Po\mx 6 /x˅Tendstream endobj 627 0 obj 3387 endobj 630 0 obj <> stream xZ͎I9}A.ӵ${whѢ%DMwL=]n{W/7YYU3,ytVd|EXg,J?gox?gb oQYucݣxP _6 ͜Cx¿>Tݗm\rll.,dxE WN$n`kZ&Fa|DB,t\-vV0 nC:IosAٜ3@5;{KGs{g+nOGgYoH͌x왖C-Wumܬח?ϙ@k6=mer_~4 YaD2/P,ln*kџ{ UMy7C2}SL_ǥJ:@=E1!!IzK@B+5i,JR|0!#X9GA᠌]L!9U}s -!PXhulY(jʰ3 FM[pX-?oLN7UjMo;ݡ>7`SZ;WuЮ#*R[eR*K$~fݵt 9fMX=i(#-$Đ7B9'[ h9ciU٬}|&7vgi}]lmѹ].pЁ4F#z}kdm^UCmS@q-qL+t&Y2z}~U4Pžn& C^fۯܘ3(] h\_hPa,B7u HaZu"j9J&Ƙ  HJaD%$p=gL"NeIrYĢこv=Jy=t*׈#O*jyuPIp :hE'=AVC|h/൒Lm/}stM凰UPlQ=O. NB?v輴ĩ  XݦL #`Z:YGn[IK*{n&&631)5fVIv )486m{2 U=jsFqQa4XsxfꠜOkO+& De R < UsH_Cu ?> "*iG)w'x\JӘʔ zG<5OthL _#vMuf~hY#@5%5[R7ip.P{1loa|-+DzW\8Ub tN.8kT[zɁcm7z^;O/ .FMf> stream xYnE}V^}!$,"F,=t2[zz26/(!>LAl]ݫ_%۟x~UBY3'TD"ȿ@C%$Qxp͏;{5GdFsX62LR,͉%H3fdut.݋!LNqY*`>O!2N)"DJa«/ʉKSc1&1H*՜5#{".Exi6͊l1v/q0 YdIB"*i̐Ɉkp F\H^}YPA <$N@̍q XYbqTtMaLϲQM/$b:*E:3Z|gi# O h.'EMqgkgeH*E:na {&+ (dk{L5R:@ܹ(D(W}c34h# M!mfwmMiIkkEl=.rg)I UFLpZ* Y).Ɓ+= k!tq–+:]UP$A 8A$18 2qk&FY\W5KsEUbp0jmYnp7嚶S=ХyZڻ @O\A 7 hi>Jci3Kh1ge8ֳ|1Y:,3XB*|MB2Xy<*{-e *#ٚE#ܫEإ|@7mC/}64TWo~rZ//}w?6kAD`wܱk_\sSYZfJ#BTWxլDk,rn,}CJM&q|h%[h [Ka2$xTby@0qXϟ,EOq..=oCbPa!6#,1$AHoRp8M|向#"f^iۼY圔e_lJ &&!gکLXDthi )A~o7-|nhZ\jú>綴;ԕ&6Y]=KO= p<W VƴOhђV 1Ch88.S-(P6 áW٬W.bYLs%dl4w[(tEa_8k'?_e}k'c O0یΔ}mh䐞pVKa?\_%\5?7 =jAz . `>(bǛ Ө}D̬]&WWP(VCarW!CaTx<"Nw80:Q?^ CmzFo @3Ɂժ -o5|@%koZpnRA/۶aU$9 U~ʗ2vtz&vqxڔ_mJ=!9 ,3&C@S^%o1R߱G#VƐJj1\:Q(u!GBXΟ8J1~> stream x[KoF B.Iߏ{pd7@ڇ\fDNH-o5GUUukk~¿ۇ?bٵͬbJ\]%Zsy}p5%䛛bcG-ˌn eP҆GwESTI(ŸhF'VHI:+i WnXF Sz3Z[bY_dsչmE J2b|ۅ>= 9Q)<DF9*Ӛиnׯ%j-}Ē7\0YmٿX|O6،1>Kg,*-(ZX!WbV^ᙴ>GID(3Kdpy^H}9 J㫯^,#4*C@"S*oS?WLhrLJ-uҹ&zlRRȫޟ]2|82UrttEܖm'aw2= P1w^MT (%*-c@(%`p7iU0vaS#5b,v(BF_6^DҨ}'!j4b,Bg(d ^).vu$4|ČXVm+bqەS!`<>ڧ@*%r;Qh*㈞󶺏m 90MqdW428{ 8>U+ 柲 ްn )H`byKp=*&Z<_= 6 }++~cZYYPSV]q#]}싻.5@9vEA MUESeV0ӫ1F)iʄMϻ1quYepP|LR#lLaXu&ɛ !ٵ^ .q9l+wm ER 4^7&iE~yu!W" ~`ŷ^{b@~ _LJA>7ywχge1i}xWt7^v]S;ָw>X&wyvшfQu?{Q VbHH)Esl GβíBPErF@yݎ {qC5\>sw]=1ޗWʃIcl~2e1Ǣi RʦMC>#綮I+y?V;_.Xª7y: Bgژe1M}?X%]_} rѴUlcָyg /̵ӥef4Յ-x_To3n`E/Osh.p)}BAgN[wl6ƕ"c/%^/$l9lg6塃%LRNҍg`Ci <냧7l껤AFv$0 $/ݱ:M{ M)AR/nySf?;V3ߕ@=NJm$52xU\y5{ Dx{FjrqnShDO"-5)cF=Ͱ\XԷuq7 L6s\yZG論Dt`- y"Vi;"9ϐ>q][4|$86OZkHͮt h.C݂N@"_:Iڸć&dyiouS٣G+ }83qrrPk#M3N A6|İcRlǬ]hSs?iPM5P0] Dd7i ,.MF ,!Mqߖ{P7 '@ڗ2:sdp} Pp \[ĀF'ZB%&c}f m,Fm?ESZ#|Ugٽɻ4эud hWPGXݧq@S)j@m{?@YmI&SՔܟHC=wLh ɂ2sÐm*R4֍0p]ok{<ă  yi;2Eؒi9r)G/+E(J0>F;;QHLO5<"J"#iA5ĨO |OUG ٿqjkQ'm?wwkPKJmJɉɋ6$;U1\Gљĩ y:96B -݅ntU ę5˥FC ,_!a)8, Hfv!<(W |T\ϓ5Z2iV;8A1jFͩs[Qе.fSaUe:::M-8t|0.ī9*p>=K)Muȓl2Rq'g[ÒcT!LS %L+T4V.O+KALB$`dE L)>sRslO:N5!R Q~fq4bǶhw\i;U{Q8[n|b8תt;TQdrĉyCNy\E0M~H3l3aP-ΰ2o7\CU4x, &WPhpQUB@P#mr EbPEa[<r7}|+8K ١iw3F%8Mc9[MB iٱ.rrG(S&·+Bpd:w|JXДjv;汓)܌A )zDx J'{e3B{TZW[顄5?*pb}z4e`Mu1W*2\= 1 EX,WD4' Ii/c,ΟREEp12@dtI86’sPiA7r?%#endstream endobj 641 0 obj 3591 endobj 644 0 obj <> stream x[n}|Oa~q NxyfP&9++_jvW5\V`-j6rV+7O73k?Y2M|(+k`WwO7_ntxzj SҮ7_Mx-4B˜wa.ޤG]?esiC g+qdn_S&*<2~;3>=[ʕ/< exYh|jfSz1q6 ZK \ _=VKB\!-}Ve_w~ fP8eqep4afJ_an,rUB#O0VF1. ܪ Gs><]uKk5A_dN^mVkqh Kma8CӦ)#[(ez{B|z٦CR+dx />cJXXm>.CϮ#D2KܥVwՒ(6ŏa* W\Ë:qζi@L)hk, IM{Ƣ6K-jˎ)(Jv-`a=^CF1Jվja)/\.a^1oc1Lb`W^"mk܄ALE(C:b0/ܺôϻrg]C(IG4Pʑ)(= gZ#Ww}!տ8x>Դڰ5+kn[Ehxc:!4@3u&6~ D\ Xȩ5 ZЦO[y '*HvK TP|.Q(*|C*Um-.d h/'AY}Un}C7:V`4նH …bVLDl8h~1F4x&6HZ4 v ,Tub]^OVE' D.sUd@&@vCvʣ%;Fҫ>GM>ҋ` 3_ۿJVi|q専1eն+=c?.~6)cզ|/JIux9Y=e%Dʤ-J8Lf ՚Tdn Y6C`(i8ũ-2v;Ijڴ\(QW+#} î3>PSD*6}*Kgm%`[bq&:4L]cJmPBor~:霣2 /a`L1Eu ^efk}>! ܢ+S2_Z* ?":\"B\BSC⽤ ޖu+9Xq_` Ý39p()m, ZĆt+)`_),4o+ȣ1Kl: &ʼ60q\ieagyRBl cL] ~\I֪dxsh==9p/ĹѦEK A$'U/3)`Z_(þ2uM?W*io[ű]byOReun0g@8%#tj2 J##wj£sԱɎߵO~ON!GۯTy6) څd|qLJLg_3EGZJhռAP%XYb7g/5뗃Dls(󽃷r'V awD?F #i1V`9s'9g*5Y?4^#,}B )&JO@s. ()OF9Z(/ E9}8 WZeG:ZZ/]R qX BjZhc|ݡU2˱\gAӧἚy )Qt6W[iJ ?D-” , ` :vUFme=0Y~)iqJQ /İZW\@ސ"Hk=NAϞHɸFQ(>T&Ⰼ$Y̤|1cyXɉʬ_)}$:*'Kiw8[ %ς~,,"K v ˆF@DnX3݀8nW,_ N@+˽6Jid<]{\0Z?jP$V5͛뚞)-i2dDʧ&>^KvNA}xj$K)7mU< c i(™ ~ %4ji]:rlMkm, `<~ׄT8W~RbBpc+Z*f K\>B 2+ptk8}9癱j3&+R;~ bVsvNV).u#ԉ@9D4X\>Y)uCMx2Hsd蔁%WjY~";̺= }9 Kagy`j~8@uxYп:(M ʯҁ|Kҁ#t q! fAW3繤o\;M1J?VTL|:.! y1P?_X#<q ^=Ux-DQC'u:F@e;Wtb;"^>g-'k0I%f3!oZD@jY-γ^9eLQʼn{[v9p}nZAZp\r;Mt HjOSPSB2DNgᑯ\g&_"V<Ϯ}g[q r&/=W"4b EDtnɌA%Y>\P#c B8 *m)"BKq6#mztprPNj}̵ȠI"[\ҝNS+T\Ӛ?ntFLWJ<EU=mqTSfFI`GXO*}4Ĩ~оwC |% o O4!zqXV\݌M!iŚ[W:b܆'/0"DdVf#J2+s"\*̌.fA$jsVc[ 4Kj&|[<^'Kfh.69U| ҁm"Xwy}go(rT}ȏ#}$Rq* > stream xY[sD~#Fae20S -@)Mn8 qÔFrA%J{Ou0<[PC "<6M?4]WM=謹EӮ}r_m ;f671Wb*{_PM#É:lk1۴8R&J#:cֈ|Z(WoC0baVlLP$")Jpqw W>PT]# E?J'Z2";dD<$!fBGEK*t BFґަY# !pԴa;H>M(+8ƤW01@` ѐ*PUaX5C.RY(cU~R78џn qSǠ:Ps|-AacөP|K:u,ʏJlɇzgK"A<(S1Scb.]) H;N`r(rb]^][ w냩$"m\Lok$1m98GZi&4 Ká= cx$%ʃnK쯲mK@)NٵP$HSFϝ+aq`w ~݀DX+nb>9 qJ~/vM|PQʆWNXLԊq+S1Bnubө6~sNw&}xZ3>FK;J3)BU?K#ӽ<|rQ'<ɸ)Ov] o횙!2w6 mendstream endobj 649 0 obj 2021 endobj 652 0 obj <> stream xZKs#j8Ve7-{} 5CIG,#EO$ș=J[Fw_7yE "_}cWA*Fn.teY(]ikjկ0aKhzuS&d]X ܜoYέ C~0bhà8'n(IdܧrCКPoy ʆ1j-}DܮlaSI.l! a/ǬJƯnjfW$/ixI **JD d+7^ƚ%Pr/M}>m}/%%[fnZDކk0~}r6@-Lv?e_->w6j=.Mt $tA:ޯL-4SC_̛Cߵ7Y;=yƦU՛jSwպũ#/'~_RM X} Si 'a/~ջno<߹2Q$D݀F a?B ݻnage$jkcD/PA Rz? pYm"$ ]ދMuA Ɨn8XufX@ {@8nƏs2>]-a@J( F)<%.+;o]#1v~I&uVeThx5ؔCř?aWMƅMFRx !r_k_-Йí3}1_p7d Ҫ7A&A<1徉β}{BænnrI&NRx[*PޖOp iIHάwo AْJ)X@̔dO.YUPԳ͵ܞ9gU7DcW=:~qDqpSpa+jIJ/` Q\Pd/IV2D2w,\@ViF~>D0F!X}@V"N]6L@$=6װQcri(Ef s毐?}], 5fgQ]@g.!WUL~ERϬk ;%r2~S KR$ú?tUf88ص= Cm+m,U`!TH0g]}RkqH8j0{ v6옙)zbO,U4ѳ9ƅg8fDFK sSG#w];UYuotAE1t2j5Je{-A'>,Hg%?TR 1@u]g5j+uOE<vыB<@HG=rҠu 6cN9$͡ 8ݾUcrVS`\]܍BLOeq#] D\KisdvK2jd &1eMJ]ACJsۃ7̴\ ;."KHLsy]JL 'X1Sg)A8 P0lE2ʼ)y$ (2c!-x#fdrbk(4*>z1s>{eRBJ-e֨`;/m]BhbEz9i#LXڥ\&[VLKoGJQH(gm$C{j= +0cyvu\/FW\ B3 8K<(؊λ AkFR#+>3-7f2-igo`!p ;x:Zs>-jMAP0pwaC]=b+*ҞN ]nSrZ>xb/?=N,G ^c:fg+@6a5Ki71&6zwbų{!nvDtQ, Hw%> %oH7ƬYW.іratex@pz;Rs@ig]372f)MO%'=i4hΨ'lVi-!8&HvOA)Ep>z@ap},NfAs"$VO 4\OFfqz[W18}B&+-'MKj`Ҕc zI_=R1f+S+:^yϟ< ~BQCE?oNj؜$C='u>m"D LFA.icFxt+_Y|~{.g1`tӱI\W.j5@ϕL-̱Y|Gz)ڑK@k$nb*9JNlFOEE JߨC&Bz6?IOpDB>Kab0@`I)Lo0:] pMu_"=GId1pB2>WD BhE a}A8X"J6 3%TܗMyŗ6c'xՔM'uۄ92ˢ*wj3 NLI!鹻q﹜mwׅ?)Xendstream endobj 653 0 obj 3622 endobj 656 0 obj <> stream xZYo~#}fo>l z ERz8T_5xi5<ꫪj6O{x댅gO94rv}w_`3GgFs5~Qbz'(xzu_8ZsqWfY TS~b-i⌰o)f7Y)LXL9'rmfi.6 E:m0X!\6vׄɩMO&=4}|E^(WO)IU>'\[c( ٬:Xds g0%gs*-r۔Vߍ\Ǵ '>bFwhP h~+7*ƈ/Ooӥ5MSM% _)QK]4zp6#m~2" ΃֠ŋyRTu:pϜg˗)_9PX d_G2\ )Q@ZR$q.6(eh zI$e{ X /% rLmfV wS>9KÍE8%ZP2h޷,;HI“6y^-w3hN4_n6hSǬPr\W@Υ>t6Mvp+O00AMGhX.ZJ?-ᴱ( zUno۠Rzs[OϘG%ꖽT, }KUECQyR-5b5e,vzU)x8 VmAYf1VVHJN2ےtW`jE}3H{x9u͋(r&AAW*.R[@2ɏ!DOe>6y5:Pb')Td(!.H>yGŔ## A[ܥdNxzkJc.Z_Yd|lͿ6yQQxXcM83Q{@XOzJ"![ꔭMʸ!( l.Є0vv cI7T.]X4&iADhWHBG3©`*w3!G5DH^[*CƅhO9JT$⢭@]H`sYޅjZk/22~Ҿ?ET 5,ߵ[1\ޣ. 5Wґz1jh qK=}N| E@|[LpcKqrVQo^fAs|9=[GWJS ZIψBR↹i/v_T-@ ̺:2* i@4XѾwY ˢNAi9b/3C/(_E|i;(^Pm x2?9kEJMZDj& hm;3F yd&C[$V gGFS.I ԣQ3"<=ق13熏|M!5;кE~0 mZ(7r ‰}|A (ȱAaQ~./sGLAm3=} L1OBf ?#0mXi[~/'gC㩔Z_y'd\OORkweIeIg]Zuy#Ι2DaJS|S2s$6G BuZrsO"Q 22aRF ިԟU7y Zȡ@c u2j[jI# ΦGNw42xFP>8zh`9q%V爴hJ0 7_we*#~f7.Sq#: COhhϝ>_ޢ c :g0+ k.!=#,tlR$6Gh!~a&qZi&Zp԰ [OLIӚI> stream xZY~У XL߇0!@_.wՇzw<_ i}tzM2{HJ +hꃼͯmsQKu,ADxpQp]1T Es$w Hf8Qsj'YOR52] $ vR!eN0 ά3gs{{Wy\ q鎾{T@;ۄ(MR2L"Sm«X!e">VȌ ު,V$obC$#_i\ż-Aw hQ5?=D}_cl VwJr"&<ޫX Ӄr|%pM"8TOX,{Au-N ]\M2f)f` {kbc tmp$&W6d Twն/ml<I M6|Ht)gi޴EU j; 9֋Ȼ.aM7P6?ēR~eAXX>E0rBVE 7ͶiG*Н ` 40F*̝)51tnnH|'$ΧD2nQs錉e SZn ўWSxt"@ANˑa? #@4T;zڧXm`WĀXuٗ&5g4俎2՟%sb[pFDB|")kǯ}'ĄHNHw= 0輀Q;pĒa9Cpz-u׶|e198`H|'^nM[-adN-v[4ؤgEh(c!|ڶUu[CɹjmDcޗտw7ʡDOծ~]&ap\PzNyo˜n|m/o˾Z_Gd+z*~X >|tqۂ՚ёKM[ٽm@̩RCu Fd19D8wJIUY*7L*7"9'k@8rSIo AQps#-1z۪ss[s#>&4~nmXv_53",ӊ& `6'љ: {4&S2 14 g' -v3L}tb}D^9 W]8D`#@C"vp&*]sH Hkzd `ۘȮh"{Sxz)p-J 3[R)g,Ma܄}ȡ-P-r?ɮN#-OG;9Nw-XD>go/K{$uR21es0D_u0R03ĸ4Ōjswk%A~t8(4W۠ t2Ěq7lD^BIȳ}#`Gv|^ `~0 ~B Y0~s MtY ZvwA&!(b8^ OOw1PU^؄qhpM\wFE>E| G| uٌM}Dlj}wW]qn[RjVi+ϪQj=`g=c|k̒ à4 ~{?+*\W?2"l vcZ, x2v rpa?[;AT_JQ`S?=Um~"cGʩ//Sii[$oТ9L)7f?ge9vIkaz҃Z oPwudVvъrNDmuA a3\#F&jC$; ˰lo+:9v&>..M[EvB%Uvr!orL GP(8 /*ͼ=uQM^pIjX=b>=r lendstream endobj 661 0 obj 2942 endobj 664 0 obj <> stream x[[~7#)`Mx$@mu: }Kjf4~3e !;9aaOw~,|X7¨ۻ~ٍ7/hܮ^|>LRF4kflOZV0~KZ{c*oaI vAte\g.Dŝ0f16M6ɶrR,·}!`.. Z,~DL\}JؓOlSYxnE_*J>6BjU1c 'z{P & XHww\V0d+C. "5anZz ]*ǯY{?^Sh^Uw;fJS19m!D5Ul8 M/BXCB| 6ͫ~UI-2?vD94m>zݡޱtA,!-#)U\dٵӾ?AXYlzs@kMbכuaX>:rYyR"41҄]o]FʳwqO5׏MFUZ[W}hmK?FI1'(,f~M+H{F3Xnh Cm,hmŒZњfVE-1D9U&.+4dOf}\1<PY!M*Z:xҥh`aBmLHFqI[ueg@ҭSx,{(9sy<+(~:|Xvy׬-z@ (R_-n*^ٯE.CRjX6yCy j"dyTYC^v۷p&fbYyrG!B"Y\8lk"+:K< nGU 6!pagv hX󧄽@N$w=o2"Kɢ;&ѼR`.SV})WY]iz9S ƹ1 H%89GCZW-pYRe 6QFP. b~6e.6>ZhLBmVv-S}ıxLq9%,@]HD` ke|Qp:c8(w wnb-t?ca$lỌ _!BIJ=l:.?tIΙ(GD\H7TC D k{TxFJ|J2H-I)zfrEԚ v_&BXi[S<2K7J#=aݨƃ7p5e)%\R0{{QgPu$FNX5q~@dY6CXJ8@g탰_!^Ĵ G~\Ra&kœ.\xfUͅ^Hj䅜B yER~8 >pE <ȡ aesJipI)b>*CO;70 Δ C޸&%@GMhQxjQ4R%x }* ¬TMUM}rThpMvΣ5ݡ _Q淧z)NmnSPji-PCx7YJ:qӪ@Jc H J 0%'sCrLkjtMݭ?&#)>*n.c^HbM)\M2ۧd̕TCMȸbG]> u@_2S6hoAvN3wXP UBg\,kXLEtm P fge*{T;֥ELŒw!S)SLZ2mם>@FQgs*Ehb11慨%M(B1Ea_b?iq.d#`Ŝ"jm4)1Gla3 7RR?UL:tO쥈NFniM0W+PA*zUF s׮klҗqږ!eTxJsg&A)줖rꚣ%/d7Gi?hR9J Tz5,&^#p5|n=]=zF Wh'-lOfZ(Ɉ0n>&٠3e3)%d1%oȉ<~hnJŀ<7)c(/)79iw9V@$%*1tf[:?S Sg^tyiܷM*]Y`T*ZC/y[?j.,j)q=* ]'Ra‰JAKI^,$ذ F҂WkPeo3d̷ԃ9.)UhR1.]~t푕Q_2j"G0]zgV,zg CB  # >CHfVs'F^ƨ\#17\S5::S %.@^8EXCũnlTu2 &qYL\YRz}_)'y93Nj)[Ujm@y?#8(ԯ\Ue@] oi5cʴrvqU pe|"fpz}yhTiM*KPD]! =5eeEqjҚP }Lx:b 4X.~,9s$&l$hOiU0BG8,€Nt/iS+Bdf !9x9Zo2b[E?}鑫̟2*B~T1yZZ8f+P6g,L D =s7G_v6?ss24!t`Q))fAq/p^^їWiv^hWĽ"9JdwtV}=(qaK>ӛcKN`k? l_>=XFО·y/{ ${ۡ0Ů]' ;x L9~qJxfpL5 a}N=dt vaJR!p5g0=RΆu_3]{xd6J^b_?yYKendstream endobj 665 0 obj 3585 endobj 668 0 obj <> stream x[َF}#- Ծ 0q&i$~ [bKBmw0?[\%4`Y]9V+R+ݳ?qEzw?JVs#neJ+Cثݳ#j/Z#<]_Vuab&pppnU|t{.>0|x2ȉJ/n>ŧ0'i=RքnߓQ6>kGĕ+[XŔp+[1+럫k?+6E ?$KVDwŵ,zŬۓ/{OBܗqn 9ӂ3̳/) iE{d fI.Wͭ!Ezo~e%ߢˊY0i WZҞ`޻2S Iycjx0=Q]hf1j쟿ha&&!qdp&-i7U[gC\h%NR @JNWg* e&]@U( UU(!寚އ4"Dⳮjw9jSn~p+0 sR=)4,cL?td>{6_E0=jIY;32$ 8}o݄gJ_ˮ:^{3VI O4Ȧzzn%&i]& ܴ.;{0\GIaPgg6OV]sXm;\@#j) tb#)C^ȼ9 lԎ y1Y;VۻS0ف9+c09Mjz^V[ǘJc{! Æ @$39Lf %j?`4MXz<ąj R}fwO L @`FAl*{k /]([|t1ݤ0t&ʌ 9aN^;I{)w! ѻ8)'OXfϪmyUɒk9yƥHnyYn~أ Va6!Nh6͢Vd}|vG k8AӺ$ReWAmût>% afjDV yfIFTBB $-2>c7XAfNf̫^ISd7 A'vM@-BS9(.r\ W& Bΐܸ2BNWi'~NptW$H__eMD\c=2+%Ö608 )E5vVӆ,bO1ZC&]V](о-5r|'E>8id3"ŝzCZ]rkEyҰd&#>0a89T)eӝ֔>rJ1(&PFc=Nmo*;R|Q>}k,|nGW@E,Dc602re#6Eʹ-O]=`+5K,x%XևQ:H3@>n$ W7 ޘNp ājgƖEWN6YUiN/&oO,MCp5='ק7?pMF+߄N إׯNGE# Fݻto]pOxt883ue'U겊@h"H #QbM# LYC-Dc!l 9+ܩ Ǖ  l:bt\`*W3Ig(b}kPs`et]NVl2*خ} ˨^ANSw€3v鐋{xY>2PᄍFD@tY$ j[ADW,w%0f@rCi"N!s5&F>x{iVGפCnA YmR̄)3cHtTqJY42_0!߄t|xKCxS} µ*R̗Vv26 [ո >M}\ !3~Aʧq<^f.DjeezFPjI~hUHc%ԜX*j]ه9Z.!UQl 1gPM+MU*] ]x xcW.{&`e=AO͒2pX.F,ӎ< 1t: ;")&+y `vQtB@ s(8gQh 1w;Ӓy"t#O~7Pld!g "QLJX΅׵܆XZu%DhXEQt`F}Y*WRqp`p| 2T#Rs'kTYH@jz ]i9b6AEk'VhWN1Lmȶq˅◢6tةyeqOBF5tKÛ4}Y(V' ,mC|Fpq~ peMoAht>C+z|zjod UWs[Wh9+R3JG|)0]?k OB!qzt" `\lJBh8 ]G5)Scc~29-ޤy_icj~ >@!C &!u #ۦ`nKtcx=!I %9> stream xZK8ΏmfGX`2``Ic\Զ["-,mw{k44EWE~XK/W>x?-ֳ7W{f7wW>lf5_o?EᬆnW?| S(> ,3̤xLt:,)Af];%m?w6ÙsQp'ޤf8^!?NJܶ]!!si\tiq%N1žL>Ma-8nӠ _?*J~hԪ` )|X[zzXk{PlÈ*%ym~Y5MM*GB4v0pt ڨB<֛e/ 8OdXex,@ܕ_SBX,7QOv* a B5i8/VuIk&aĂsB;ZT\H8p<̚K\2+:]_tzl?M91=> F2zW0&qpW6pNcMw4(͗'wq_m^}JڒϗSz[*'Po?o7n:8+QHQ/ыeV<+*sJJJlS;n{ fqjzsf a='<1a ImEI#mq?u[Q< Mj .(H΄fK6{B )A^xVBoXRFUmgJ8" ò6"¥Q^=角Gc<yM x٫Be_HQ%+^iw ڥ\5#}ʔFKG>EX zBf/*P^wmrgo=t,.aPY7э%<0N8LjEYj<$@WBsMƏs=&h% rJW]ۄ?nzɡ]ֻ1̃0:⼃e(f8i ;wa j(.IGBQ@~㎩c,(0D9RyJ-aO>[ќ& acු5N\:)fdu!5`hն%O l\/Qw@6ܼE:q^' $_bLD?$y9d ȿB`KshG`ȴ;fm˂ΛS"X pBr&&>!5n )8ϰP y'^+칽mS赑/EKR" U"-0{̑[AslRHH %pHghPx_kFgjrxHeJҰ%P)Y>jt !cEC;m$ j?a$0&p ~\jyQ1 N"n^&V3I5g; òLQM0lIhq(3b Eڔ11@pz ɒ d`Cנ]1Tjo1`v%F CSg\H3zȗRQj2S&f .)T9G;9sSUT842b."3 X4V[(Ĉ^{;n03ÂQ*o}N͚j>Do1o1\}ԚH'?u2Ne @uUM#3s7grQLF_CxVLs%4Io?Tذ}Nc#{^p=ח)9Qzz.*?@C wx)9^Jr/Y1b/9r+%5'vx-ۉ4wAcc#>zh6|j) MX. 龜ğUlPFCbms// F8˵s_V8qS60sX:Nqm\oI`K>ܳ*P5zH!3p`69Wo]rFXꚆNS ?@j 7@t[I8{d^6 D}TI0uPfTJ`d0&4K*&r01fx|"$5U4cy- BP\7u>$|1"N]q{zw_oǖ$w&95hB:$TtO3@ޠλzBD%cJd3|BhC e݃-$Eݏ*ՊpG6TO~Sdtxs@mJy{=ǰ ["iw)C0"Ʊ^KgS<^J\4]4.$WS7Ҷ~x+*t.wmJ \NܺCѼhX.K+CP8-6"t U+ZfI#Y2n$}D%SAmxkr簱$%iwx-$EJzrPq: mn7環IbCWO.z~ sgp _/v*QeF5{rW05~80Q R5sMD`K+E>ZѬ\|GF]j(.94 .{3K@PtdZ@ݢN{6Q$M$~N?Emh 3n>x4wD7To5RǦ_ J@0X.rZPǩ  bC8NP/0uFHpq>˹sTԡ Rn̨*-{6|UR<.AK6W^%:hD 9G;`=#WHuAw9 6V$Poͨ=:#ESbK C-"T&P@{lgQU\~M a\r3U/endstream endobj 673 0 obj 3199 endobj 676 0 obj <> stream x[mon 7}ii &$wGYQ}g;$w3A-33WW,I>|Ňgj{Wzk)N_޽/+/ 5 nެx_XxͰX蝒v͇6-6Ŷ 5߅%pRz}E. &KOUZ||C %3pžL>Uxd kWѿN{ϯ/$WF$WPN(jjLx'A8aэp YįVF OTauK|qmuuV뺭j lM܍9ubzv$+< vWnB^kS$f[͕h\@`t]a;2J vTBB;ǛhE~Z"~o~Vo*O;gKn3s] XB9r|LXhg,wvgy]Rz|'#Kr_$Kޥ$}ڲ+YhprI`6m4pe}KzӖLZ&qi]Ykx=#)i.<(͂o@9 Į=-F~!Alr(~{᳨_ZO6Z౷`sIm>'RBz9SUPZ?`iܜݷ~W )rW\Czt$) {-%GD!H-qa]zLL70?8S[~-ͪRjā/vcH(Šw;#!VTnzEcCВ+^0D-WM_ yTgm s2}c q {_ ]ӓ%ӑɤ {J$r%1m5)طeKV4_@Lub M_> 2Q;}*)[@BX9b+{3/r:4"H;1ss2F* G*yWPufB;3UVkN;#nh)16Dw"y鏋UE3B҇r n?n qr4lΦ3z, |G` J< >Rwu;{&mu?r֒A%}NN@<&5pqų˻z[obBcI) YyJ R~JFpC: SsqSem$ns ;  -) x;M[Ѵj릍Á}P^(Ix2ׄ>xr<G,5Ȟ,'rԱy,!dI?5<.A>:wS4#h*R*sXI%X8,G(9@7ΨZ2}s 3T#.<]s%:%XE;4<bu׋e;Qψ\JҰ ) \ hbw}&@gŅ`(rp^b8:S:U&91 BR@s#eF~l$!7jFF(ĨmnMbU۪{Lfe9wA11E.1ڜ9.ޘ}XR71@);6SL "a1$?e4h/R1Q~VCHZꗯVgz2.bE]2or% _8,c(UWo7V<r} p*+7/[0jWŽ 4C5kD2MCmAC7XuM|~-w}E! 9nV.Hez&lZ; 5˄phfSRC@Ve܎`$_15K-[⠌">wޏffsq彼hH9*)Sܛ<|yDb5ngui7Ҍ2 ?j,]'(!x(l "rw#$zK\F52#qO_n M4.r.]r4/p-Җժ~rňg%u4J#6ψȁ8=n…C8aOÐnCkj"9pgq )P]x d %(Ȍ_-a+SnIkQ9AƳokq9˞@KHӮ6F*4<#F^Fߣ'zND; =0  Vzq#A#zf_({aOP R,H/ dD$e$e< ԨE_8iڬMԆ. |is85yw8Q0AL" |pӠ/] g%^kej^wL}zyrˊ S: :OsD!ZcVJ(۠ Bs^pB\Jn6 M)sh7ݪmr0 &E+b!ҡCv jȁئrrxIٖO8 WP-y?4.Hf쇊2ȴۄdLT4qw8ӥvZ ߟ,ҟu}nM]\4 -"ջ΢=#+{`oG, xhZsܴtz7ͮۦWf=71MBKB_3Nf-zuD߿,Ç~R0~#?3A`$ uDT\}n%o&L)7fA9B a $&̬_.@6A ݁S_]9?JM?{,ܜF5V0ZnYli-F -XΧ 2mlP\{u3 +_cF/u HL}ATT!ʞ;j6` a|ck|ؼ9V[~ fmU^,YXp /-Ӂ'd_%-?`kpWӡV*OQ{Z9ޕY ReN]wViV->oXȥ~.w@dBR/QAi6׹?B#nY†=e465>ߞG9ؑS36b Tp{*XJ:Mw]jM_RlKހc<_Zxi7qGD/optI̦Tpae6Xl)=" > stream xZێF}#Yh}d d ĀdP֒(TU%&1 ]]uԩ|Έ]ln|Q,ywwlaSbv /Й%3-Ṝmn^QJ,6vزh /=޼wK(+6>zW-.*# ? [j=SH%4tk~"+oYA Szv;XŪX+?zs ùM|h;"#1iC ۇg?i!'*=|<ħp&mUhMhZ{$"yZK- ɬ[WvageI;׫Y@h|U +Z+47] ch2 |t0+Qfx2SRtvlaq-u?BjRHj]vwЇ,]W^&P9]0iEʇ-a}2Y(Qz\LIĉp׾EuzT$D*x 7`Wp!f .%}<B3s=2)RɃvL[*73>h,܌n J M;aSf<91Bl*pHh[P eq]\-)9dS\jM["@䑠T >Ah-bN|n6oPl2d\q6Y5v3q{*ߵ)$Y}\m}qFdӛeVHm/6x]붚{KT1NBP!p2"Jx+GW2BZt0cHejDJ#͜ <&8 nQ1Ȗ=(@bQO)cMQuJ/q1JA_Ti$sٹD`8gQpɨBO8b{|BN`-&[5YXS!NXc2TSg.@)Bq,] @Wt*]h 3(S#`< oň9(+(͓) ie Azj@%B? 0@Sfo@+m Kpk;L8fST&^=}H Ur~]6mMȇ}u$B1B@qM*2G &*IAQL%hg.& D&bR0M۪҅KL6v27!! 7V4ۣ}M>Su[Q((q궆3A40 .V23+'$ XtBcN85 𱉌g{dRb4=HcDA3$ưTc2aZTnv* I`Q^wӰ+h= a`nc<0|$㹅gG>|Crq'zZ}ds|46q }ޔ(r LYFe@R;P H\K7 K26$?EMu}ay%{Ԫ@Q ?&⾲ML܌ՌK./R_"Ώ)[9 w<ܲ TG1Yc/zE9U2$We_<²qD xg#p| TRo>y4bsrǢο0Z>vqg Lb`ew?CܴkEP<ƁKeSoS7ɚoGC6:FBZ7M~=c9u$bb{Qwn|۬KMZ!wUĹ$߮c3eZ;7p8HMQMjqK%F%6:cZsC;ir}Jm qWkCn[iϫ1Āhب{A Z߱ %;<$4r<&~y[GB 08Qhw|j5>2<n+o^r S^u9C^1 J°M>#׺|/p3auo&bFf>gK+"0u *\GTo]qk ahkK 2~ @oC:T̙88h/2|j*Td4sBܯ aW>#˖k9,J̐xLHq'3 ӁIendstream endobj 681 0 obj 2745 endobj 684 0 obj <> stream x[[o~7GYb~٢m.hbS /Ljdё8{vRܦ}"@\;wfyA* OwpgW}BUVs#Wb.1]\=\Z}xK%hzqus./r8L{EVs}?"^uó"'*xœDyHUZ*⣷ݍOVDZK//Wn)V.l% cV %flW~2 W$mV4 iYH &*R:5R+leɬۓ/Jh,_C0PB&8ûzo~Yoo'oX%i5lpv;hI%)D z>5l,pNz:ly~CW1oֻfխ[o+B-LG('{>R] {b8.Sv~{SkfG%aŨ}W>eO`;Q%s rwwxhU)O>V.|%/#M8K|ff`*1sogR)c_7y|3o .j!z1yڃ# ~Je'C.wi-nގgk)MF4*wfl(pz?e{[沏:O1[KN$XSQMxy- D@O&A%o#Z3v?L)LŅI.&siUD*Gtg*g6pvq»Ċ5RI Y}o*#b{/&DTT*9LVQ͓# L848 >>s9Ҁ4GBP²p Ǹ!z/JX,`iX1ոD'~\b ?d), *d`7~[?E0 .J@=lT>&4mtèq&1 Cy`Ǣ?)dkS 2&5\SHS!˟B0C ^*: ? guhMrDDT+h(Z)uY*!{[4KR|.1ۭXT8RcA/E`r=s-c@TV&18(4 Ļ,*`BhjaUÁWus^2$}d."Q`eDlڅ}m!FE>U~}: (kr~FyS_9P^0xqK,-=.DC>q8*F1QEmJ]=fOu-/<#ٲR|إ1mڇHHLDEDpjԚ0 &OК@Z\\ o8qja[XR жMV3DX#U[C+lW 2iW b g0D.d>lUHW#Eve ';]W@XPZ:3XRGXG.(ՓA֏#5,6&@R6] C=j O#5jWp'd A`N)AEH.}"Ȅ5\˔2tQԐ^b(fk)ΜLakFHR,{7+{En:`8 =n^Lr>Sa޼mq"[ %]xZo6( p&/S:#˕bɑ=:x I#1@)Dbn_K:Cd3А9<9_rVN&;$ NPNJȸQ!u;+'!5"9=CN ?IAI*)BtUM,K+>mbvU)hB=]HDvF++y8S%ui~dtNsCmI_m j4d51RMT4kU} 'Nכ @]c#uh ?\oSy˗IQKsr``^TJ% B*y&JYd0opjPE\N(Z*a̘hc.ELbK1ɇs67"dDiȏrx>xjs;ʳ|Wɷv`GZm} )#H*Djn `~)g ]՝A.Q>1U=z0bn8dl_Uɖ6󁘛P4C/KT7!78@7N:w#xf{ =}2GzqF2wPd$C{2S (>cY8z|S|coA(` 3E7ܥ [',0lF_X]]z{ gp[0NHW41=+Neosض͸̿P(Ias ;͌Qb)iFlPdgKK0 TH`xW:{*4V\GFZ@ծЌVdr>\3XRvi*r'2#XGp|BGAԩ&>PTFV3!@H|CHؓfOLЕzNUԘM&TC֛e֎:ZΓby12 7e՚~Cm /-[pCnĝTKvӂݕ*G J_5kwc^ g5v>wǐ%s~W^?."endstream endobj 685 0 obj 3691 endobj 688 0 obj <> stream xZێ}G-0b~qNp$jĬDΒԎS&)J~4(^N:UW$+ǻ+_mβͬbJvwd%\<n6vtex}BY&һbW4E)OgD~z2֬qKFp߻ ;,)Z 7:\1_Nf8q9m?Hap5tᢆkFNT} WDfLkB?t> ^{GRdD̺wQfm\;C_(65HX(y!J3"sDɈR,1Ku`Ï8C=%FLд"y]ܗOk3&y?emLYBjt5cZB1ߟ]|dp5d7cຠi"35B#kvs7]{ܪ13& $M}|>]p?AԞ!X|6i[h}L%?g!JLR ݜ5ÄޝYA־ 2O7'~VR;~3_Cz ];1a޿3 F=j n4- &B>["#9 \"HJÌfFyu)|?H]SCj2=ኰZA㥺caD ʫ-"3֩R9)3X͒25 g e1`oYX Qj,!8_.P5OPE;UNCexD6:BGĂK4Y7BT UaTo@iTLMY̪XE_ o')GuU{ (p3]}b>\@Q;f!Fǵ;䕣H WPg.\-K#P-Ҟbg‰YAAE}YH)hM"8g2O6\ʃ#S5/]{$(9Aցr#cX˱&*PyF]S*"s[)}P_ȰZJ8-} ƶ|o;o I 蚢iĴغ^A;M@OwC ˵l>`1{x*sίS ~ `ŧ R4148d] g0Er6P~dA} %"NEh%F& HfsC[xӀ 6#ȁ,Wut + ##:WMѶ;9q T ϾU}@Ԏ_n-/e[ (bF Ē6"ͺ!I+dT%ERg]T}wjB to/EQ|1. }q h88~kB:@#H@M9}p`fJ0ofH4Le 6@Z )q5h_K664Kx3xh^NfI OuYu!QE{*Y1dT(zz*, ΂ kޚ8tr[ Ci&r,Js{?;v%`gLz<jBe",:5S ".d٪fQ{ɴS~078j5tq ;GC+zAeìͿ5\#5'6.NA0TFo]S4j\.&b1ʺ>MScR5st (y鸢V%z<@ξ*^iTztD 7/*OuEiggƗsA%XTh]ޅRznOYt _|.'2:kT@6@.?wtDgZBA'yWn_I~GP$5_ΨOAc3&wV-Y1U =3cEld:Uڐ N eQ|ٝ@Qvq ʨ­S )pˁ` 25nK薚Mg3<G4hp[VuAv+G*{7ygzf2+sח';g^." VKAn#C sm4-W٭w&{)B tYP< ʂK2>pizͻbL1Jz|fnt`TnIEŤg3!mOԌO:E1 ڢ Ɓ d08iN#2ný*qڦn"q7GD6 wUDZNgA0bAY?@8ϫ9*!eFQH(gک=EiɗD>UuKM2  P0mXؾxB4w`ES@`&6tkN>lqwoW4 }@2y+. :8!dN9I1NݔOɦ5CIMȤ uJ! 94[9LqU+1(4i+u j@ʸIsz܁X$U/1Wool@sTG?mtlpp[rnԵ'm:w'q1gÅ$<7Lls>Lvr^2>9*[:K= {5A$F[ aLԶ܉v uq' 1Ɋx~2Ԕ{liԙsGO-ҝ% )$N~r$18 00eFD|H>`pHjA\J)S'Fwi5)>g=a cʁxS@4tb ؝E};(7c(J_w TI  ҈)@'Hi`H4JkCw^?CONN2e+ = Gh+%$ڊ3A@`Z__~Kh -wƣ,BnD񓯼*R{W@I~ 3LٲjcxjS兰p=!rjx) R/c: t-'v}T9lֶx;&g#gh9x⥯>}{3Uendstream endobj 689 0 obj 3988 endobj 692 0 obj <> stream xYn$I}7'>g;eHvFڱWXb@v{ ZFAH#_D^"hhV;̈'Nfq&f<)/nOޝ4-ng>?f_,H&9 k0;=y[x}(2Z-2`< '*nqž>u9.tmL 618by:Z^2"},~S_ۺ] o9:%K9^RƢEB_bq$ Lj` ]n=Ah >- |Pp)g!#"ni188Wu{A:"Cc.-%"_^"9Ics!oE_Kq˟eƷ;LYY^ it}Ie#|9QQ0ȩ?Wx%@3tCy8ID0K'[:)A i~ҁsJ<>e~Y6^Q.vk,t~x ,nIA_Ͼ>Obendstream endobj 693 0 obj 2423 endobj 696 0 obj <> stream xZ[~_Gyr=Kp1PW/Bdn;2CRVds37|Ÿr}1k}q^|0jH ̳0g wdG(հ`q}*LPF<ڪYV'- f?-[tRF`wJ8wÙsQp'Gs?yNF|hNhΧ]r0R0Ge-l~.qd(4m klj< @/qKϤR)aoU4}? rmZߤnL32 Y` k")qD!q2.,tP'(8GVNe=K\׻*g`a~K6yUX#$̑;!%M&u bvB17L$ /n_]ڢ3e:&쨢;qh\ЎxpҩBFQ+cDy#VnzYbfh.(ջ 'wirp'v֘-okJ;L) ܣ9I!R!!|8,CmǸ%Rl\7 &2n;i l]fāτ\ K0JOB+x@ ,yw\QM 5}|r.2Oխ'A\AyMN%@QI?Ir}W(Dqg q)ڢ˩8@TReT Lo7-̜hmB?sDa8Rc _g P  '@E? հY)Y i@Q8jfW'*R{IMQ2D˞c oAGqr4!,L' X s i27Im/[.Pѻ7^+kBeݝֽvw'O-O$F ye}H}}<=cW(@|u 52x?) u(R&@@ӘA7^0#l|c <i=-`dhl u Y†G:Փ/k %4vv81pTeuxM>%;KoHQNJovN%@j $gc!iJAhLv :j:E(أuޅZsg506 XJ :>@zV7'/4eC1cWx/oeASuq?:uz"8ǩqSPzRa/+|Jωb$܎vm7m#HX*F6 ȟ#z }ƢSs6jj@!Q65㇭jsNvrR}}_A ZvjǪܥC>|k/3M<Z#ғ1eNF}F^ۜ͵ѯqߠ7uWOh\4gendstream endobj 697 0 obj 2607 endobj 700 0 obj <> stream xX]oW}#ToJ KЗ!b;޽sp"m̝9s~8?hrs%35T O~{\eYpʛjxyҽ r6tG_WUËG]=XPV*8g#y͏PKzw^tPqK/S4eq󣷋t0nC~&B?#U`Jc:0G?%˦m |Rd&Rl,E$;yU2;t4Ev2>LH#+V9Ä YpSĖiA'0W(G1 ΂/us~PII~==M{)t;iR5 EQ,))%Wu-2jLtiX(WiFUpb+?uii= (iJ \}fӋY2kW4w- {>wGDA!ƺj+'lg)YѴqʁRtiao B^P/M4r'H$*`{I,lZ0)E{f&NPB;ƔxͤW뛛^g G igz2 g{Wk`]OgqgD91; =vړ{ۿr@cX9z5laUtH{{|I6洅(XRNb[e1jD88a}jLBЕr>$:q%I^X{;wD2oCY?|R[P\@qG v<h n\247^64"`n.  MOE϶%MGKPԪeg ^#M!iò%trƳk6a(O:a!YDnE<6xѣRPJzLPr(йˍ<55f.|l/gm+EQ% _Y @T~|K%14[Cv^߱S@Z&]__6 Ǐ@8x_fUb j޵V=_XX'_j(ڕ+k(\_e=w.==Hh[+_g4-e%mvVV!|22Uz]z ^XЁ0 c t_I=[9=T,1 Zendstream endobj 701 0 obj 1882 endobj 704 0 obj <> stream xZ[o~W#4/ Zր]/kjeH\G72[0331O{qL~׫? rXE@9u3^ǫ`;d|pus/qL[қݴE2qmI0E:7,8M5>V.]p\2uof;XPVrJλm>PRr_VEW4u.R1 QFItjli00V-0{LxjbT2;x ǭ\k(!-~9qG="KOi U!beRAgb~KBdXe,3mn!qEs λQKBj\:Z1$u'U1S^ y2u@ 򘉩~ tfzLTm̜tO]ԊR;J@DS2M̢YUֈsCk7YV.:E)b"Shmy'i޹4opMlC5`)tӮ*m嶌'y%|^@fwW/E~B l#DG;dyA#6pG*(:U L7sn"OVhb#F4]lf Ud@{&& _WLpJH }l!nrc񆔰Cl¸*(nlElS>A E/T}Cěs(u;' #lSC4QCZ'OYngXUh=n ^9=HIC1&QA#G΍w%I@j7)0D- !a9ֱ_Z oVvS(38J1"i7Lư"/l_p:TCf}x5G*ԵcԌ|TP>"zR+|41Ȉh]NࣁIQ* MūQ+cr ᄯJVdQX$1\4AטxGЄg%hb(C;Ӊ'H Gi(wM %Kvs؏Rt{3RF#:+HOm '+%#KgmAK/ "1-!&G:cFKZgxoh䊦 qB`(q]5=vOs ÏZ^0+4?~7Ҥ^83B> stream xZnG}D^6޾_6^{`!ˈY&94,`?~o3á(@4{zT?(a3gg,ٿ.֘&f7g6spfF.Vg?,~췢Q9Fg0>lfl y(bp:-]u!rjjإEǵ_QP7^ߥU|O412~]}Psdqk%H+Xz>Dj~[z)_Ӭ#,xH&V:KĘw."suRayd6ŻMyâ2ج6 a 5kmتe2)$ӌH6=a]uwLRHl].CI ւ7̜X^blvMǔ\Ǵz;Ac_D!pJr޽:EY~IYk:DxCP⹰V 0E.M.AC>CdJ,<$'u_pxb<7 F̼e}w$m0{e| >%椠гS')Jˆ ?8j ӾV:)ЩzG OGJeBaĠ=D8!j7$dQS9taW{6O NӤ%x p,Oh6vraSmX~{]zo:T r0!xjCJ'?1(Q߂Q QlJhORjleZc!pq<b!|,VN겦 ]L@VgBχ]W:|`<~Ƴ%?v! =+բ]7PnպKݻ /@6\_z6{wyhQf`)fU.HT@jN*?>H-zȿ7_Wզǃ.Wx7{Nivg}~˱Yu}!Ns2d=̩Yk/c=A 8ʡV*cS|`jNަ:/I.&Zh'Z*bI H̊2¡ÊuzdUScT @\8t乍7s83HN)7qDq4 7hl{h]fE([D"4m4 Yyv gW hٔqy8o*s|7;pLl5IЬf,mz#wLbgTߞg eQJc>YF>)vWu%?f!Tx̪tPߏ)aCea6%~BK̗X$ 0rSkB S>bHâ5*jp|ڔ+JQwpL1נ̲}#A CaasX9A-k|`x)cQ bܭsQ1K=Z ZlH q٥x̣El dpڌ%A%`k{a=^`bD?Ebۨ!_rȶf+6Gb@rPJ7Rcc*g̙kOVw0,;endstream endobj 709 0 obj 2901 endobj 712 0 obj <> stream xZmʏoEI"/Y/0cTmgH'$@vT=S.>]|ZYg[py7qk/+Z].0f^[78F 7OƉGo۲-MRPMu4f3*?=ke֝ c7qq1Yj=x!Nh.χ+K۹EƧŦ L(@AuzxsšTuckb ei/0N-s%ΧY % pLjxc-NHajC4ui]Q]YGs׿:gD:wwa;lQpBy} K:b%irrJ 7ihr ZT$ M|MnmWaJ8i}.Cڼb1g9֬XǍ0fy/x^tI᠉4<L(ZXIt5ɇ>$6㵚9`zD1Ԃ/Q9/ØR2/яdؕkNqR"FI[&"FWRW0+]~dypb)ʼnE*L4sB,?6XuL䨼m ǒ`Kg, 8^V>)~)&PVU!ҋL*D[f9 Z .@3&mSˑգmH!zsϔ8qteT "WoLCdVK7؃FF=7ʇL`dS2CVdB:G:mSh%%[rt!0ii 70&a A#qudz0PnpDHvcwѤOEBda֖ uݑ,~!ZPTuS8Uپib.fgɼRY43FxfQ*"YcTE,; ݋gfɏ᠋`!$H3L$$ <iM]Ƹ8.@|vA͵C=$in( >M>s=]LN/NE&r1 $&|_m0.@-jhwf6&/?TB*3ncN- mwGG9cݠFJLP dUALo 5PswpZ8*<#vWlOQ̩vMG^7Bp1ɴuX ,U)}`f; 7ff [X). KKG;"H?`ThX'x;%g1i@1v}9b4)xt_^tO}67Nl G]d.p@Zx(KEtByQY↟ߥ" XMYtQOppEUA bAM!TbU V׺L; Ư,K t^@Kua8@j  ־O!#$B(PыG&3Emq_9(l6`Kcup«( egvi Nb|W4VZ=I ,2K-6pDB1`8w<}0G>$7id/{uwSک):A#5dᆷVʋ4}du$9@BrK)dwj+;Yendstream endobj 713 0 obj 3115 endobj 716 0 obj <> stream xZ[o~#4/ Zm@/kjem!2~;s\.%W) Xh.gbsu{Btkv񗋳?²7Xɤ gq۳oW7{zr˳oMfǂRၸUbW*شub\rV.-:\߯\半ۼ!Mn;u\9.tZg!9I,Xiu\idښ|UgA_)`bcDBwîPe)Ctն5wSWK͂vAu=TLl7W궞=3fV%H`ώMrxf_vY\:rjm[pX?ME|}mp%5O%_=X 3}c"q=u;Ҫw$x8}h~F'Uo.kJZo(^0Q{U*$NH %]:6z)V7燶&\_V]άDD$}5' کEޡr3̻fw &7;Aek .pL$qxU ū*LƋYbmS?TAD*x5b%k-E=IJsN$uqUVp{zFPݤp]d,p;mP}ֱ`S2B86O]rEo)xv#m)gQ%b.i(<5sJc#į<,!Vʡ;JyE+NӻOl&̦;yO|H\QUHZ@mc2%JpM$RP*R1:VnK4וbCRHBÐ h{誆a@i!A%7VEx2BusIA =xX}[od?jj&/S?xzz,^<դLΒmn+$8q %E%c_A 29MܦRdJop[$ ǾH=)Ƈ[x!Oe-5ĸ/EMEqOSY>OPf7S%vzzņ*նfCl0e0bCTLJV=e w[šP3!w:Oe!AMo 9*i)".3˷4dP>1M\ww7ͪur*)d|<6;V ]Pk&ܠXh hϿ91vGC7=6Hl = 4i$<[ދGژ8Gb5;N۟^N2K[|R1/8\G?Ր> stream xZn}''}8OlD:1 H~-&{w[^Ij@ꜪS5|Ÿxvٯ#Ƴ?n#x#ޟȳxGo` qVۻo>!\4hwn>OZ60 OSZ;20Ğva)iq^\G;a|0elm2}8)}:ȱI\~ڎُm()>XN_PXNOƋyEFxQ/fv~ʿH嬝84Z3z.meiʏz038[ӬT\9֫hs@#%|qa̖=),|>:|aLUy6J ђO?o z9s+^'$ZG' }ƭ[}Aӽ2bc0 殌p[sn& b1]5%bc*{iOy$f/9.gW9CJ# P#['¦WJ1xMB$BL!5J?AOLȠi%rR~g s^ {#_ 2x1np#1;߫74WK@ k0Tw77%10 kM$a\s}|Nz2Ƹ/z\.>-Ye 0`ǖBw;.9Y;~ \lElZ9eu, 1R&yX)n[@zB`euh~b; $Q}c4eZ<- 2*q_.f#Z&v&2[ܛk#?޵c>Vr# d`ȗ?\^9z7zWW}oa "M疘tRzM(,VX h䶰q1k&.CXXJ# Rdi8! -m;x:INxĭP9q1vΖLVY!/sm&C%II! sf$~_te o˳,s}<C`i[ljDR_VorĴb{l+KCpc$_ٍܼYX#e&Ϸ}NplUԲ@ UA{"@S" {@C@M)nN*QqX <)|5YH. Ȝ"mo@3',(c0t W+m*H!vsjoFqcm3HջiHL<t/E2%DYQv=C=I]?P 953dUqu|Us_K3"pM^I:fc7EN*!Ң.>!0t|u]b+'[͢ *dJ(DEs͑1혰-+?39E^% [*Z?׶eieB_RnWZ9{ f@PВ ?|u9zVSztaJbʁZQ<. 6EQ{Fs6D1K~K=kU( ;Vk]8kpA!8j'@+z#qW/ P;%:LVcAw$p{baMo=x9y n׼7PglkHMίFHNR"i`*)Sc$Oajr|\ P)kpa o 921S$lW(h惈u+2Tr3P }*JU%\y뼄 }^Ip@Vn^)IMnsbpyAv.PB=[5}b/S򧯎iPZF{}Ǥ,t<7Y>J=ڸV]/ߠj[OOv9A=a J GVpd3 H󠅜H!l0yuVKG9^&ɱT~X xFNf+N$+3fW э"@x8j[;c&-Êܴ~2=m6E[(l\(W2$%OɲP6,/N5Yjp$NrIԤTBġ֙h=d2ܸ!Y ;!dSU~DomX\0!t!f\jaRví[! fOyṫ3cH%Z,ݤû8Խd]lE}%41-a09_e6(sn CQFvSd iEV= Ef["("5U~/|ŠAA•zVq^1Ay"0>⾣?_endstream endobj 721 0 obj 3183 endobj 724 0 obj <> stream xZێ}_#N"#dؐX]@j#1!G$WS.^gfw ]SueE [Q'_|bYk_tuwƬ4qFX^t/32nuay+5tV u< qBs"V㣏M^dPNm|mݳWY:(NoSIUGC~m9Evs=Ȩ[94k.VxCxUz]a 4t|x%+4b<↭#N)+)8lYsR4'PHe>\7ſWE׹HRYxha qh'5/'8f|˚s[!\1P෪gG0IBUoR.f Zp1#P1¥Z)9ٯ.a)Fz%~.Dr"8MX-\' <we, Dt~W4!D4ߔEۅr=a_c\`  4ODDIY"ـ-e W𐁾 2*,:I8H4l8YJ7WۮH*lztC^\xn *c9@L.ޕ/QM '&И9@#q\;±"|Cw@1S~rm+bצ)4>`l򽢰T렯 bVmTRtè(IhJ% Ͱ#K2Iv7r5-ܙi g(_עcQR,?E;P^׃fStϗjI}OW]Im;g3IH?c2Ϯ0x"'}d/Mz1GyD5X<t2;1tdǦm@bpcF,J&Y]+VuKG7bmpwoʤoA!TYS ;T:{Vo3|D~7[e1k FO}QGapUqOGK*j v톶 !P~Mh[-v8nv*aZ$UYka4aaWl2$T3@nJO4fCA+Jd@"R s6/!A4kȰ D>5pT!n 1\Nu<8L< ގ>9-H޺ο+;o>e0#2rS瑆!݈@n?g"KC95!YLCw,붜@ Zx\waՔ*b{VU*B1"ؗ+갶VWe=5b8n Y{cP!N5 ^EwEpzl7n z*TDT|E\}{~ 3E?HC!<~ }ynbQ`3p 5 nP4A uRt#!z2 1pwqTcޭ'g1aYZ|MvraSL1zԠX$dw+p9Bۤ@cфf*(ѱ|'ǰQB][pKbrEC[m0ُS eO1htON[`0zFZpS2KJu$J܃iLүE)0;<蹭@{Pzʣm~p+[l(aVXmT=iEXKB%H:eNǗK穱 J; 0~ٮγp7,]Ѵ $OZXhMA5VB"i }aa#,C#pT-tJ*չ6xC?0ӴODrCM[8Lh ɡɾ.N>}Uw6qv3I7/W_UW$Heew9/&#+$~u_P"o& I>oWK(a"o[ 9u83 #C1P"M,ty>x:y7$!~ByG*ʳF`n1M~ip ayt7_j\f݅IAX?jendstream endobj 725 0 obj 2800 endobj 728 0 obj <> stream xZ[o~#shlC$)ί7;3g/\R䥆YΜ9|4b'==tigɟz17¨$Gs=ܞ|υx>;YE ˓?%\h-u'- fI?-[tRBf];%mvcQp';k?b^l /8gq~TB J-~慒>=řLskZeNCYK{~(y cU)|[ׯLn!V¦mWHWe2j}\ rEz.g|U,]ʿj^[HdL DzBAZ(בs(AzZ"gh>Lo򞛻|r6. ֫z5t (U:sr/X:UFU[$3"ﱜ&)x̏U-. %?.T9=x^ 1Ĕˏx4^eiVɜ*2}B{ܑEe~uНa2k}>yXdNfQM;G^!X;"+p&޻H'JvNK97wC'M8/+4B2BPj};Yf8M'[^Pk^,tїo:9cg^g܊,EDRB)zbwkhk8 1rEV'xߏr|krqY*2s=cySg^7HTs- !#B12 u|s[Wnu5Z?׻o͔^)ϫh$۫^ K욮bIt$G{Z8i*%N:)T~u_yCv@fQViHi|iO’+POCfݍYh,95Mκ,obB(Ab0,dʮ3oچ>y]gg;1Ipy$J */ujXԆ"8BVe+Wx"ɏP/&̭@tٸaՎkI |0T =ҢP9ibzy@&~=ț(!4H`J#4@ `ok H%`S +#04jXn!,$w{IHh۸h|B4jL 6@!b8q"٦{N tQ]ʕb}BXͬYв3BVġ,.wsvXDV .'FpsQ5~6WWo~~{usWxkBUQyQeqO] nE- &B{T-,b⬣.Js"UT*ܥUkT~$h5ul6l}S w~-UQ򅔔B7ZA ಗD0yi09B>_@tbg~C^םmʋB\i^Mm`?)y 6SB9JOQژ uM&,anՑ' )=ٛǑ^Poh|Y?u}vPÇpEЩ.V G1I-v^Og;˓ W&\@K](K~cMxv`zNHҧQHEn!t:  ı+r AtY^MxkDj}Y/"n?$IԤHV$  +_ePA`.bW벮gßLpendstream endobj 729 0 obj 2957 endobj 732 0 obj <> stream xXKoFhH6|%fa IM}g_CJl7qaֳ;o)%lJOXO>O>OY8o/j⌰j:_M6upƦFM_ oP~䨜@Y)t]5IX qBs /ttv"rjiҡ" >Nib e2AN]:cαs%n\KotDZpU\MYe 4;O:>|A1.΄Q3O*ڲyUk>(  2"8!YT??Xm¸̡fmxDPbuW\8_&\M3_YoCz9#c~eKU<_lT2&&=3Hxm5hl.ew;7*{vMC&T|| (/[@y*vwݣHUOᎲoO@GpSGQRxFA|]m}Tbػv,tF8~yD@m4KqiUkB9هWeRD I.A͈*^%Xmn]ʫa<a;L@Woߖ$Nuϡݮ$2wB;ACiUl";xX-TPspS'ͷd} H.ܖM]Ld(< Gf]mw\8(]H !=Wsa ,Ԇ1`HHNfbT6z(󡍒HfyʉP(+/{.j1_kw`$Ok+[n& o()א6QX+I)OBJYN!KKPmV%0@]T_Ҩ,Xo6ܣB_󙀱rh86!TB6˅Bדw> Y4;X4mrsm*<ntS> stream xUj1 w?ղϒ5PХC.e\@_φ>IE[q1YӸK2Ouxt2[Zi1;rC:g8ܐ&,98hi?\Je˭DHH`T1>{uʎm%):߱_-,ok{M:zM<~ގ855ﴡfToѯDz?> stream xXrD7/;NHOBQm%ؒ#i`k^[Jrwrx#aW'IDܚNA=o1HJd4ܹ:GǃQn?OLonK G}޺ƃ?C믻Gf{G7W7vMDo{?2~1hd$Z 1k4Q.ƁݫUΦ E '}TKJU@Z*Q\4qRD cg#°_r4J E]l iuw^yHf3?mL=j[p駷=HIe'j{tVp>q^g6dMzpq̓Y}`8/&񴉞3+RVoGb׶7 Rd這G YU$?+`+ħv+Twz/J2k( |8˂Mv։2 ܆>8Κ\y7o iZnk]$gKek+9 mj:' (% nQz> Nw?}=Hy%#gإ=]niȓ S8܏+8缣:DmWU )У_:8)f5' 0N?KǶH.q-7f*aALI@LBr_. $q/0($U~Ï4K٩7R6@PcrX!Y+PUH2R5Qy!FjJj53L=CN\Y S@X-Y%&Ej_e&p#&-ܚAhP @\ W}x>Dʠt є{(B[I+#J@x"M',Sšg~߭J#GW> stream xX;oG.Na{ R pl.'MIwG+J"@bӤL !ɟ}ǧoϖhE_}2K}Լ\ŋ- lOX#z~C؅Y;Ԉ4*2+f0`K99ф؅|Q O+NjA 4D@׵-XeT4 L@'ϳɥ2F-p8Q6D\ 5oh\uJޜ_2*v{2a[np]B؛L8Bwy1.*=NYZUY.}TL͓D1'M?}WwdDkPCkNI;}˛­ԑJg,Dc1ܘxx{@'y񚰷s}|f^Ŧ9$`ueQ{3SvQ )ko=K'᪦P!60hڟc˽ug6_?endstream endobj 749 0 obj 1479 endobj 754 0 obj <> stream xZKoG #xH~$HzuY{fdEXoz^$5@`@U_U}U=V+7OVԏ6JVs#W׷a]YV0JWZ aW_yD`5&NVɺ\19pSda8*ݴ_HyA1qtauȉJq$2S!UhMCv[?OD8FGēە-bJ [i/fP2~SޖMy$_t)Z ҲH **2&1Vf)n~*+fݥz[\k CЈIRjOo]n[/J47x"$myT/~2)47DSG:/чiBS':ڠVzM\,7r@{?ud'w,G~d R3eT%^KpbC`vx:Ѿ\Q*F(\ܠ82FiyFa.F@6Ԥ>,h:.LA-=%H@ Y]T&[0PC0#RX`c <1%,zzJC ponFK C&ߗYw7P̎Ptd _{$pSPPfX4!qr yg9Zӻ,4 P఍B l`M(88VIaO5- IiH řF~ ł,B;T1cFk mu!ܭʻӰ? !f1kM T2[T2A\\!^r#N ̝~IGܦ!0,橗|!WfV#.{^I]EQXG,!:eOOUU%T6ҌS,vnzDžh>ǎ؛zJJ讋_n\ e HB4ș;JD>: ɖΊ! g.A^w r(?t EF!,N͐`S|K Ng2KfH,j 6eۅW\r<ۨUraj5Uj J Iz-4bm|$Q̩݈LO7 LdΦ'+p:V`)zq% %|lʶ2+H@DjgԇmS7T.l&irJJWi;TXV E ߛ ĵO>N]2Tmz$o~+Į 49"<:$x?PgbF5I)| 3|P=94,l|WGCy:A>& s&D{9jނj)* QC-B e7TYr='w)@k|>;wl{X37bf!^ ;Xms:`c> o8Aęb QH$n<~j/܋faBh_`n66SC ~v 1S*yk1լ|X$Us|AJ*Ǩϔ\b!0YzlNʰfڏN (2LqQgu%о#)?%}؞2w$s{'O|cy]upvF8ה,ErXplCTh'H1"7Ի=(DS8(6⏢ۈ? 'w31bD԰EKڕ/G\[5*&e@~13TWc2zrI:P<$M,y!* V!1qhy՜fۅw&@x:,Ҕ0jcT H~ip.˙~r'g!BUÐ 51KBUȱؓҭ"Â8A}K X'> ک.U`rΪ )Ip.$6u-q6BlPN'i,:A"Waʺf ݹqkeG$ܷNc3}oXf7 Tb {bLp 9q4 *ؑaDS( ODʚ"KXI!e1hr@gc"qLLElq(| wv/)Fb3ŐLJ-0TM"Aև>vWi=) bx]{Ob0:T-؁3RQ@/(zqH'Ć (ǣ=9F9Ƚb^Y'Cn¦G{Dݻ-dn pbec׈صO½A-O`ņq by>SWg7Q_!R3!d>׈W b0wAWp qendstream endobj 755 0 obj 3111 endobj 758 0 obj <> stream xYKo$^"dY$e$F `!˸gjL`,PvlH?rTWwv&Ȓ-ݺsws}9 I倅 #Ns-󓸀 j0ʸ}m&[י8FƉʥye?)A:}b-h⌰o)f7Y)L[!'rm?d='479 9gu20SFIcoy:7iΤ*1剿ka_d/1)n@BIB%\;殛f1'0Q%%\2&P=+S?U5j5̫`V`v6Y#u#-TlqaɣŔAI< >'r0IF4t,޾$QxQܪ|$T5p"/: Af z/Eh@Pl|$qgӋypP@!D"2.הIE-'lFtxa@qLKuS΋ F @1;*)P 4X:!ٻjAͳLU2BJv.B`ߎ@mᆤ-(ΏtcUea >^fL16uG(Xp8/uaP52Bnܧ!>Io7O-\w?Wl1~̾|%*h6l="`^1AYU vHOBFM\/'$XEYͪyp41]RI|(F C7@|^됽 !Bbh6ˌ"baY$fgi߀ߺ=طl `\Y!AUIyL|U)piJNj \u]zۍ5vi/uqϕ0g='zX%}}:]"g;Z*cL"ID }(J\#J\ 7}"nUȐ# 2CCXUuSsisEX;)""զuY*:"I4yqdqLi4O%cQAan]\Tٳ^ |@e^~Amѻ1xBIk/+77^+,ur2#B1Id 3! -kc]IC UѵV%ͥv'%8#@QiwrJ}n\MnܾMpSJ0nmc% L[R.ٹ  `~UKrE=ԞYHy޲%>t{Ja6ܲ,׫:-6JRZf̹ybۻ$<. J$R.C&{TPtH{B+^t"KbH<.<:"Ow'wܱgk9DiLX f+ZDbw!ܲq~)4q jJVeF5i=F@j#cWC崜M^N@j5-!P-0n:c`jwr~H`K\OQBu\w߆8?oŏ_Yo`Jkґ_;=x?unV2^6ǵA?JKl|߂"xU{CgC %q~uFҪVe;[-QI is~z*-'}B}>k;-md<<&ԗ&imqm}xqQ|CB@썒{^mzs8c,8%OSa'qnAtXO+:Ȃ۾zJE>rlj> stream xZK$G>"#F7㇌d,X= {zjfX# Y 88#N>"_UՏmHRv>"#".HAWWo.KzZ*F.n`.=]<^}ͷ0Gb \/nWv'd]XܜYέC]R^FL-W}԰}L9Qi%™Ds*7 q~ɂ(ǨQrUL '0ƩobV%]?LKт--nIAR%(ala`+PS%RݴrUwBM I)w^BQP\p$fsyiN m͵^¸ 蒒  R7qt|)o7`?eL$ *"#qͦZe69,X20qխv9C3QX7+m̓G u^^Y(*} d# w0A T9-9DUXԫ P]lqG&sA [&;"[ةy`d(\R#R"D=+ Q䁥' "`{9UonƦVdc2Ļ1QV˯cQٚ1Ҳ7'[㮪>(`϶iHA@Q xf@0.FjaPW[r/- c‚{Xҵ!skVh'O Ex5ѓ`3'f]}Ӏ$~Pv)6uE]pnbT..,'lIӉ6 +Z?_,=Q K%V&]$E( >K@y)agBSIdȵEu:%pŪlwKds8 ܆=U1rΘ2MWyX3 Myd[ݧ1!x;܇ x4;J@| iQ[Nٲ4%nC`Օ.u?KU$ˁ 0Ap=% Zr9x;IWn^bQp|jA4TrlN uxO"F:*><<<)7{0G2āGsƚ RNN’B-+|oLc?՟Ym_ǟT ^Z`.ii(Aֆ):1`1qHflrO0ǃue:j2f%fF\}}Xkrt f!9*ue{O U@ nX*eE|3p{!N,y39qF 1 C% }êׄC-KM;ءDOé܇ΰ>E2?Pm!"Ůڔ}@Jcӳ Bv.egY%Ag]Ո\uU阥cCc$.N OqtړFFQf3U4i>nJ9 O}|Ÿ' AQ{vDN t˝!*>S-ɬ Sbʵ#k1)#@qAn'>fQCBm谒p”J1cq`mD{ݬ6O)wP." 3lbR1C7O=gȓA Fbk!ѐRL%QR0#UX<4s {2Pwй1{#XnW. oSJ7ȗېÆm0dB^tzڴvK+MG8odo7ܹ9pnn ]$}{ƒrCR3ILj0}T`h|^$?BrR7 Jfg=8@m*[`. ( ^.'s>"hA#Tʉ:jH!wtnR3%+FR1b)j%&MB蒹 1͓1ok1#l"(CWÃcwШ`y/%tA P旆]0\-UT jPQ`Z!8`*AUӾf[!屙wy>&Cg 9DS,j]:9ͤ? ?S3]d̬83PsUm`@Yz8J=\ũ\㶉)6Ϻ$9C)[62!e4xK Lb0jHzU~v_ :fKNri_SV)y ^7f 'S!nސ|?yaNG!_L˦Z!V:E4 8Ըƿ.4 {h6  xkBuI/dd*)z e~)Y}C4ms{f+_0Tmendstream endobj 764 0 obj 3114 endobj 767 0 obj <> stream xY͋? }mr R} El' H]4=ݻ-l:9rAoH]ĂVTz{;]N[ Of21xlqp0k36i%,;Ԋ/yinCXb"ݕJM$2iadڪn4gɦq.9h*d:}V{a.a2CҌQӺX$m뻵_%Aa_78%R Y99^"Ɛw?!v: .Xa&?*|?{gbk@K]= IYbݥv NKɴAɔw5fo6i/"jhp$}yu[ ab>K`/f:H?<Ν$pK2{ϫՂkWΪ寏jjmro˪)`08Dc4eX N)c~YYgyNAb.VqQ7o2h,_ŷ?5 (ၛd]uU[_l魈Ks$E,`]p3B5 w8 |>.]'!zvwWgS@Zu]ddddd3,ٚ]10MP hяVߜ~! )>t""'v`c|t U!*eXL]-d]" _z寲8~:} l"wfk]Dnt\"9bb%gqAmg wH)G~ 0E"O\Э>ȇTv28dm͢B>0{H#o~iā˯n@@,~7C`?g}ww"momj^6y0|߼5763P0 [n&Og/bendstream endobj 768 0 obj 2069 endobj 772 0 obj <> stream xX[k$~ OM^9>KB6֋;IZ3gt[r6k_ ~3HR\{z4FkFP}IA,O^{T!QLb8 0QB %nٯf'͙*WoayX!$e`32+0:JY ? 2G)"ٱN$R(z94QF!wGMaTr97kFw2E\.lk7&}SPpWH#.!ʄnVj캚rd\L S( b 䋭LrCS|8pH+*pdkۖRΏýT"-u>cD#HGzI(K1SmWe]Y_tN*V6e*Edte$-1."$3!Se%p:/I^-CV!qv8[*Ld  ?{z[2-J"Z,ҭ*8gj6=1U$+M QH 1TGy9&%<@!FO]62CQ')dcHQׄT'Ge]/Yٗ+h8 Ai6PYYGH瓭)& r[Qݴf|aq'NCE:״w5X PDklaUMRwB!yyW}4$;—O R8oM q]̤p2 GIw8E9&I3Dn}]=J4zCi28}PL+qr e5yU}g [PYЂow ^5;/Tk֩{n`w"Ͼ{3"Ӯ.fZ`cY"̇ami?։ʲ1%0p1+hFeSvSl B/Q6O8;a#}0H_rU3dm+/ξ{z=??:W^<]ٷマRw~5?_5ݓ}zV8~FB˾/;@fn/]^kC g=(/^= V\7&d`Wپ|gו)[qhc:\;U۟4yc4^/l[æ~P6|\嬻7KMflFh|4}ҕZnp`q7Fh, P+ʯ/hA)hxe]lғ5%gWjg#peult_PklCM]_A=s>嶺{2 StԎlBnGfv yۏ`.Wʶݎ]_˪ {O)?5`BN`3c?2߄ş%endstream endobj 773 0 obj 1904 endobj 778 0 obj <> stream x[K/ /-6K)IqM ΃Jw5[ /rɏ_K5Y)X@8z|Uu 膸v=m/>ƲͬbJlo.d%<ŧϮlYf׻O_W(˄6<)'3 ?ь)ިjnJ'5mX߼b5Lo꿬3a/;q2ù>@ B2b|ۆ~9Q!<5tVք= ZKGxədJV}*)*6W̺e7-H%e^W%殆ߋ Exu=~醂 M]_S!_nNܗu[޼?H+ڼђ'i}M?Eu<, "7eѤD+_˘eяnC2g騟E0p:mʻ/a2Y*!:՘GCYxX|ܹhl}#f:>|b0܄h=r( gmɣZ/4.iR3𨮺g,o+ѹߺG6B3\{hYV!%9H1A躙]T`xETk^38Z,/z%˴u1CS{v?SbwҙTD5!O4gohL4*vZpΣ?$=vaПB؉ ?` Η 9RrVU7'a4+[(n''Gs\qС8f$&*DE.(Auƨ0chY)B@RF&b|j<'[2"<<3&E1M7mޖJLH; X2YɛKI! 8q  'Ahmh}vTYAnaj)u9%m.~\2^BbWe|Dgzk=!ugҺukn0tOF4Px)Vӱw(<[#*N<LWjM5EDj@Sc4Hp?N"}&d 1WqZ*-vXz ͌S#P4TPqΧ8*w!pSeUe~۽m{wc]0aZT kW&/h(dEi2)",9{qQՅE+o0 STg#ʉć#A|aNj&o8H2 !) <_[UԢP 8lͭ9X2Ϸ .hoQ{/'MLOHi)ֱ8]"9\CUV^z H:Qq HC1rGR|̙1R( 2JFL4cUD ٔd)O/y:A H #l !+=wFNѓ<.v^D\Ԏj(:OeR- `Ɛa%uJJVl؃bzw̌]eBpf}6Qb? ~`!)Ɵ蹠퀀w@UQ]SEw##9rT[HCg{רf\{ZxP,>n 3"JObR036-z@?TdJ^`++EȟipӐ:[CG+8A1z2E~P31,Chn ƘHƮCiSpO8<`7k-q?\R&Kt,`XQ7'j\;UvvQQP>YW50` `iAzBLQJZHuFS1֐dz ̀ui|PX~AH\lw@9S>]\$6 wICԥ5|>N)L19¾\o?͈k]#Q?mޛkr#ۀk˹CLHQRc!Zgǩkp2 p7pc.JGEV*X?8c,8n =[LX6$]ε䤗șZ~r(Â/=;:}a6!>F9KQ~j6DPNW`r >ԡ xJAsy #BNRH,u9Fh]i5NaG qhJ? 8%ӫ=;\c~bDf ۵n_Iݡ 6 O{ʰD-&ZimgUk!`O M~{(״ƻ b .fMDk5>vh9HDo5EquDݢs@Aŏh@k/Ǚ~?NNrfzDN!D-GYDHZ qRz\!όg7'$@ONuxHM'S"l`̩=*ˠz03]}Q0L8HZ#wJ]ڐ-K_iP,D;.]߶80g1L}7VyXbۻw ,zvG:')͸Z vY1w#I|(`ŻRTMl/!Fe Ӊt^yQf~Voq;Δ{@!MtjUN7(tKxs«sa¾R# ֿiSbns7՗ն8ѴCcA>38dnߕM{?̒Yy0k#C 7cU˪g495;'H7hS, u?[ aQ,?ǎ!ݬjwUtS]w5`AA3LkEF_oBֵ} Z?qX/4jC_C6śEpomWofGǕ}WSjC(C5X)[8endstream endobj 779 0 obj 3749 endobj 782 0 obj <> stream xZKQv~$Ad[q%gwG g(r#rb9%W;_KTOwWϐCr#z|UHFG gh;F?>9#Y͍tdY(i{;:p ޝ#bt\N&.d՝3psMܪ0tlڅgFq5l>DNT8 p& LkBEzLy2#ʆ1j-=D*0_Y&gŢaH|ͨҲD,U|#A@#fݛd;A/ySf"T L - dBuCZ TZnp+0Df%{ޯ>n(dz10M`iҹn͸&<^62܏47NADѕc鴎, '=: A17 4(a0OJ*NzQ 9QEj@z@4o1DCC87AA@p-!q4:t®Ei UuHn$.7Wu~Gi/24E1s-]=>rus͝,AT~z/&v Pgz,Om/I](a6F љM3_|5yM^"\҄bTK؉ nrJGU7q${Ux0(`3.D87+_^OŤ\ΧmP` :gq6l|U.v}fB$Pxi]N+iU!I9N"ɼ`ˎ(IDKenmU` !xX>:4#Ҁ靖c. YWFqYFNT=cA;vl6ocX%H2:f`?#T|RG'1TI!s)R۳s_V,Loo(1cPß=A/˃wǧ~zޟ2yݫ_~ #ީ׿~1RM\[#0/gf> stream xZK$G>"@jN|?WGJ^55;[UBX\8 G~GCD"{dKٙ_E伙ΈX9y3~,o}pv3f)1;8 ̒0.ggG^dcG-+ly蹛BY!qj͢r?I^ET4|R*FOr89+aJ棹/8Y 'rx?Na88]R8$#&>j|L9QipyGaO">ڪК4ϓ`d%j-=D3fB\Og6AYn\ DA9Wnpj|O1hM>oթq S$|]ouZ)I-UkofYJ^֋C Af {s\֘3gs8?A-zIX57 l |n2EV7.[a쭟z$jMm%X OD dZ]nvlM~\4Jt`C0"mRv1:!8.]?8܅uN91CFx]'**+}/>:>vxI3⵿^P8ԡcjN&e8DMWu&) D1LY!sjަzS:H J۵8!d;,߹Q&o]F()&N~4Erxs'pC +1[O5PBO)\4Zzl YHL$+ ')  FGDlKؓ3RA cq*B";~Qp^o.jWKS7!uqNc,VuI\!s"b)7Zx1C0>j8Wb?01a#+ʙ7&ejyn(@b]/f2d*-32yfh>kKʷ#b(q(NT#S|n ѝA`l ^P2̝(c2H}5(>f ;o cD 5. 1F{`dkm1 "q#wpl>_ڇ6&.^R(T,1fyu2';?\zE 患tFSHg{7u\?oAhuyW}w |bGY`8% :f˵[[t; O@FNS'M__D.%8KSNa6j?vMuq>!|K)ꗡgV4|^g13VY/ci< nӎc.B8?W}W '4ן&HbG,?1|GC|dF,+?3`+m,_?]_2 /}f]nrKJ';iĤ/_W7_4m]]7dRhP¹OvQJQqP Т E< d9Pb֛,b޽80ɭ8NUR>39 GPi-U(l&Lߏ>;R:eUSL-L[&+DVcC "Z(!'o<0&@i'#]dbp{YyhTd[m۪ A-܁ZAw.qgMٿymȤܿcHGo&Kj'r_F.Czb[֌aȲ0  AgejHf䅙0z_X4YEw:wݟ6/6 #B}zTI%[쳳OOܿ vendstream endobj 789 0 obj 2875 endobj 794 0 obj <> stream xXn#] OaޏF xaX@fn[mnRV]03Yec66ruMR, fbU9T_M(aՄl9yL4qFX59=?q wH79]< oiGd LN˓'il 0(bp:-u}8ڴZha7 :M/ib e2-}ԗa"TƜcO%ϡ|/\⟇҉vTS fwnV)DyKZp NAp"X}%ќ<\- GK]UlF$ZY,)+L6,:::feo8[Tx46:z=o= g%=l󪜷lj_HPc@f,/nW).c&.tz9beObͫ:ix\Q2@7LNY2a 2Qg2Ce< Q}nThOi( E р;&EqR>Ne.p*sDIUشxظXF}8K76P?M1VՌP ZеBC1S0너-ԙ ώ\_V}YHOv=mq}y ЛCXxGHqt:*I' }KsZpbDH,''Flk&a&cF%i߈n]i܆)N:c󍛸lp ^KO r=3Vv*<q@Xln؊og뾊0Hi2=:$Z/̨i(QNj{]\|J sgy$/(FL9ôM,XmjTY/ _0R,v h<2aKjfES]G8SB;z|VrH".|Hl1.` yon(`bqEGfEUWmǡ)}Fl6ˤj?f5]ɢ՘,7c <3&@pʥ3, W+:TYA!*_sߖGԾվ5պBcxuX܇u#^kHogSQG:PyZ7 oA=;Cn>6;l# wy T"x`X9|DQ6)n!Dgx]m)PP+jw_h G," im>K$;žїF}K4O&<"ioB@@Ha]?AvòN /(~+R;0Ɖ9@$&γAk ,%pQ&R ;5u>?x;ϧ}qqT\r{R*T5[$6Hj N ,aܸ;vٌl@ U]^l9Y9z!:-'޶MV'aI=GȘ\(C8Wt~ӪE.2Pk0I ,݂b1Sa$RV7YnXĤB CS%M}9a|0!8e"u"vyŝG|W7_Uf|x|} oOp$endstream endobj 795 0 obj 1967 endobj 798 0 obj <> stream xYIIn)qArľm8[]ݝ*mX ĉ\AȈxUWW-,rd,ozf.7g^e[K,7w/>=,UL,%.'\Ǝ6[-~ ePƥswW-$yNQiRLVs#dVxѭ\w{q>ܹ`95Ll1&nV:\1'7$RWe5\~P&NmkMhv`d%j-} 9,3`dM'"W\e f2Zv[emy$xg}=#rJXZ_ $wZ}q |xH%ق FH&~Sk'oQ0C宬VZ{ Z?ly[ʶ+x1X~| }YQA ڎskl\1x(S }W2RWbPќoϢJs'Ғ19\(7 b_޸ת`̱ L̺l#om!ʟfj(I$B)+&fFNL7HT)} iRC|۸htbb*M_Be=Tqb! jnOEhe3Z$,fwjmXR֌}ȠmF-S+)|""y_ctu+*ڶ)/ݭPz c \ kкa9GdTBS1dӱ<;;;9b>z xQ/ܫh0e"HWBO!fSoLPrӗpE9!%1! @JP;6(C7GT#*LB6{׹34B5I'Q_ܯ߼ǯBJջ?oջݿO+3-_(6cgQ]l>'c(,`2*Q/n)JQx?uE$4 }Iɓ_&z7elvO3YE>\3 )v y4[0L} ')% nGMK9?<1}_TujF@O!qcҶnE034a2kIo!'nnp0i.Ϡ8+c\"{+mjqfr8ɛP}aŖbPĠ;D ˤ`'[w9`{ܵ|.@@-qE3Wendstream endobj 799 0 obj 2228 endobj 803 0 obj <> stream xYKoY^"YlY@*v_. HL#*q.la FQ`V`!,a5so{nUu YJyS%/?[,f?2aUq8q+=+̾w[џQYDg0_6qO6 qe҇£XMu~QmۺXQS^W.1M;2ܖ͋*_X86.~ P rL@XXSŜ*`qc&4 ѓOBfy?aydm m"`CZ92&VYϚlBP }C95i0Fw_VU>u7E/$ʢF ˜zeaLf ]2KbX .bZ|q0w AhH<"#H$D5hےҔKu/9UCHh.lgON>}l* 9p;i@s4`DfCa+3!b6٧ Œ L{cNGLWR̨HH]=Dwg ӈƆHt sD3=զʲ_wemtϮA?u K]k]Ev] ʹ :6"o.!lete; @iĖޭx^ Loy*7t]y,ͅʭ Gc zZ T7қCPTGJw{/HQʅBY\HHf&3j.:՝OɞKu v|O)N>ZDɟwt6XV+HzlD]$A 6%2 !wHӻNS7>,&D|oksSi/@d S a>##=0|#YfÚxaMo9't1f8ܩFir %?<Ș)ɯ5?hȉMN`пa+'Ҩw1NPSx0tܼ.fjH"逰U#WRBq_5ͨ{:в20S[v%,̘~`CQ4l+e=1qro߳Yb]5⊹5@Tork0?ŘY9^PPhia+̍ZjW 9Ys0U2$eB06#&O\vIr,lꊚ{y|/SſzwۯPχ6,W{}7/Rq)u5XRO lWy-"Z6R> LM[061%ʒ7HTZkendstream endobj 804 0 obj 2521 endobj 807 0 obj <> stream xZˎdG]"b M]a` /6vB}zMn6B|;/C͌ɣG䉈'|Ÿ|}7c|=;z17¨".&Vø\/^p~ry LpVÂŋWa 2ڧOe/72e 3'^𸥵Sx+[JhLNI̝e{T c'/iiOFt{9ң9WYH\4ha8 'JfppFLڦqzӀĽ/?j 㩴&S޺Y~y]]m7U]7 Uxnd y .o+!a2plnjlк\U– K0SdЌBء6^f&n lӖ2\^q[hƻzۅq> : 4,}Lp3mF=U )zv}D<Dh΢%8fQmL#=!Vy)~pI9z7GۺZ>zvXlq݁b 0> uF 57Y\' &ƙ0qJ+kCH`xHoA~;k !C=trhՋ_SHgW).O.x} e7*y/)T7D<=SM$o 2):tA].Nd넄clcvOjP2F.m3Slhm{hB0cOXb @RJQ[_l7?$l`zKpCz>* pыGHFP&Pdb;2P;Ԏ GnBig]ni= rih5 CBiDs_V1.PWBmђz*f|HsbT@Bզ %NY9xe:_2fH=WKCT>f\VUKu1ZhȎ7)~23!ܽ3@)Rzbj|$;P  Ѩ򿗿{Ք=oo?`7腲 $rP$h Z[{PI9jY=weEuUU7i^XNEg^3?ls [(fa76djqw8}PR搟6;6M8Ga@>FlJn(L _80ԍ/4*A\pݮ}9q{&)hRjU淸68O9XN< ^HW9pBOh@'4L|k,% Tx 8Q:!H zSG$㔁sȷ<; D8F(f:臮jTn}ue_ %gqV}rZmmQ\) !j~-K̅n/D;߮w+Hxւ7Mu#<qǎ2kPC!*ȱw3^&YP7 z^cqOGGsD eǖc8W1z.n,w:Oʻ""I5&r 0J*G:.6 %X8@o.m0Ac{_NF"F )0Nfoe|Kɷ(@ <vҭ7ң:Z̐଱Wz_ #A+a|z_BiQNe 2V9*z$L=iO˖&ncͰ 9@]mlR o+^H[$Jc s;6ErB IOHz%;/[rf#|?ui96B[)v*t>_Y>܈ۜB,INmFkNבSDIN.rѺ][ZG탛 A;_1}I.WBL9.?t>|$]wiQ{6C,\Gѯ;# ٲtcH!q=}O-\N~s@endstream endobj 808 0 obj 2625 endobj 812 0 obj <> stream xWˎE] 6Ak`4I `!kbCiD`A#PXX'x qxB^ؾU]u瞪>*0"vw:G͝NZ ZH,Ƌt?`;l˯l]~W݀T2BH#'*Jww?}awͷpڰ"\|E OFJȐ+SP52ZdKuuMTWwnK{O_O/ŌJ\m;.2/?~;{sσluMRݦaK;n=;7i;'Ϲ(G%`7x벧#m6U^ DS[kc BxRy$ MUU{UYD(Jx07letޮHI{䦛 b8d]@3bДE# aGG!1͙ CzRĩ4Hc6l(x;KJ?O I@.]JW#p.$8M )bA Sxa>3xv&!@I5S)(+YP578 ݂Ui7S&rFm`0H)vںyXo8ezLHN#}+f+4iAtH`Cr뽱xJȈFVi)jٝ/O1oP'T4efhw;.NYzsoc QQ&|[Gvbl-l6dƏv9<4M߮ajWbW2˸>)sڐG=ŽO\Qᔞ#Y9ĩ?0j9; gy~`Eܜg2h Π,@f^ِh( AM>F>5GT_SQb"*ݽOoC/OԔuQ{i'\a5K5cRXA*l7]R$8*DLscKeHsJ}? `WBʾ#cSi.#7s0`1tj5024<-1IB*x_,Eg6U7q?yt8#-6TA.Rft&6Mx \8KIV0a&ǸϿ}Dendstream endobj 813 0 obj 1229 endobj 825 0 obj <> stream xŘkU?€_*7ȷZ,jN3@b"hį-O?ܙ{$l6H`g~眻[F$;[2?^uVd$v:b>m8>_yo+~o'p{0^uppSw3)p2fj#CaX>hcŝ V‘TѬ,Nt=xn"i/lbL -!Ad*)I g!ҬHjoH+ͥ%Msi2Xd!Hj[UJ]\z߸U` Ǖ*3$ $NVP /H*<}+2EPlT5 hR'FM73iIg9jEBJP˧.%y8erヅљFO :N !Iډr3]*cEPyCꃶ +FEp+V +)X͛WcqB=oJmVC"!Z7I_b"L^ QXWrqO, ~[K4ѲQG`kZ&f$lQ+ZKsSj YP:"#A rEP[b0!cc2eD mkiW~- 8Q#JzQg?[.P-Pig*EOƌ@L #yzFR[h$i5 pzczضs$hk! ZO3 1FT L)m5.v֘/ M8nTX7L&A-T00z#sꏷa;zpup-)+hOK#~ṯ 5&ɷ]zQM0Ur~ϵbRB:OFCM&ZY\j a> U,Al)EV~,)|8/ T- ZToqT:> stream xZrX]a#j7CKsvn:6C0\%ۢՒٲdE DWQRUA8u%HFgߋNj3үzkg*9ЙetCŏn }Dvy﫸Yu7r8 Q˹/7U^:rLYLp2`-d ¹*UUd6O~@800zNzMb9~xFsav{fiPnxWmPHLגBG8'ᦼ[ v^|nIɞS Egѷ!pePdvJt ǁR|&HZMҌQɞV[؞ہ} urI+6BKk&iK#2bNИ~ܖŮy"ェ *Q2 JBQ()Pݟ4 HT 9iEͤMWնZT 2oz\UU S H@o",S%hZkz>`Yݶ˗cnZS0^VfER)OK"%86DOA%cuO9}“}TrS4XvA H'pBaױ3Ʀc-2v uv\V6.!: ϶-cSx)Ԅ23$aMU "=],|^+.W+oCI$K= 6/aNNO4ؔtzה9nh!fi?xu :3tf]5v+;8`6ARٽM{Yem_ .ƥL$gH~7mg"vd08l`@c,rVnRN&ڎ(66#=l$ 8 BB[l%V."W  z~P L?]%uy:EfGnz"_ͧ{tAlqCsmig<1n;͙B&\T drlIn5HчDԜ)tt\wӟ1 #:UX3* :_~GhP1 ډ)Onn߼] 4 m:2^Tc 5 M x "ڹ$C$IG+93{$20~I[q,=83wK)GWn进]F>W-uzrofQvZ@55?CuWk#ZJc;;IӞRO&&7ő;z^0/N(Yqxۚ4#qBco7!^*fN|Ʀu;/{}]us=&Q:ul Ql:35 ń{Qj'=<hg:OvvJ؛8 jH5rg zs ~Y _*=kzQfwgL]5$Yj>r Z(~pWPĠ&lGT#3pr)6XhD4OcHz0 wv > stream xYK$G|FNm=ƀdeg$V2ZwWVUXaa-3_O޽<{GZN.l(XWL_>cƎk|p8{Ig8Z_ڗsI B5O1MVu[ Y+۹&br \t`:]cC\wew6|INmZ۴h`Y6T˴ gR ʲ")"Ĝc ?v "'F8݅w~~tәKA.}vO?F#ևW;Kta|3M[T7gCVpIz2G1O.md6N(hd6,1!֏lӭ Cj*|Nxo9~eg :ut be҇h n wӴ|p#|A4tIQ)<-Zז>I 7(9Ze6jrB![woqƪa.߽*§Sa4ьCYz/,t-aMvuU|ߍo^|~_'7ge g(nPsi#֒8FSV{iC8[ş 8$~Z,2eժ}BNA4v)na)G|~~ADޥP֑C_G(S2mwº#gwK@kU5E[rA9ҐWVcBoV2)s_O!n@3F?%eʏYxQ<;@ ,k]3DѩT0uH 廑aPyM U2S*`W(H Qa1w2(@rHW 'W!Es,y.ru%8B>/J Ư^8bK/pfP]e\F;W]tް(&^ob1!SrakD>gvu.M 7  Σ XQgt zxf1H f?gbc8@b^5oO!0a/#7FFKsKnn~ X,2Y2/'@ :s{dՋyID`1rZfM6{K< ,A{" xI5u X >H&LgfOs֟lzPAoEx\S4mH.Rj2,?ZfycU58Ź4#]wmiucV@EpP ׳$AI-^i˾~\ p&PfQITmruơXJ܋oߛ5OYBDHYuZGC6 {TO&}XWiRsi[s > stream xYYO[WhGT*'g_^*Y c_'^$v)ÒFH!0 )8&@8X5Q|5jYp .ŃE"\&Xw)q+Yb bX)Z"^כ,PMg:cL'[!COeҒ0(0,;ԇ|ˎogMf$$,J¢ ZworMY!P.uӬ4'p);wDtchBy~Xmj?QS|dVgb'@췧u )#'K$6bU):DURτ=H88Ɠ$ /lY)/+$(؋x?ԛZ828sTCזۋMOQ[pDpƶ%1ҬGQ"pWU,T۰=z+%+ucux!4OҾTenVI:zK)n&,i7aa*8$^ysVtSqvuGy=w>͸%;dpp[ES|$D2?-\Q0bDI`*陨ٖ;ǫcD#:L!DX~}G4X}n>Dir)(HeLP{,oۺw^#fa'(}3^w3e=`'8FV]>i\UC)vQQ Oy=9_sj>|zJh$V[ 7M_"}}Z]uHlxQ'|GA y[?(3^F"巧ڛWM+|d'{%%d_qIwEj㿉eĞCvA밞7gu{M/%2q Vﭚz22)s4|ͷo}.ȵ=C[$կ#/Vendstream endobj 838 0 obj 1826 endobj 845 0 obj <> stream xZYs~wGqS7h[ޣj'vl'C^4 -j(j<䏤"\5}|YYY3dܯ;gPs:{p6*g:=<}(ÿ`T R0 xX}r]b(yPBxL$3gR$%]Z$y $1vv37B}a)$!ʩ~BJRŲk?/FRrz dN96/(k2Y )rN9V73$WvY5 E)AaK%"/9`=ywg, }Wv8*3,f`\l^9]x+R *NtZtPb8PR>֫*-:Z5xr,j^wղ`]Z pŨ(K$* p&^c? X,*#IjF罃flYzM|X7n1D%HweF`EI5'6mկw'2ޝY׋c--zoFw=:XE.P5l@yyW$}4W6ę†EaHzv]ތFܧHLYF~H ̮v<s4uD+UHPꕃË7컶F($Fne؋$lw"3{RlO .| "Jpre{GTbq40]$wgU Ƶ\¡`QA<XH_NQ少JS/u: w?R5n>zUAscY?O'Fɉqts>B#˅+j`Wbk , UI?q"jǫ<.ˀO1CK.]"TvhuNk\?AnzH(Z NCc#@Z&'48u:k= ߋ9tI}?r΂IbQCDd紈mEH xsU~ϲ"p&rNP\;r#\dӸ/B/oϤٹVKw,X[/L~)}UA G9VX/A_FNjS=^OCBâ6fQmXEY:FfZQ/W]0~rGF<Ņް ]f.dmVLZ!/Cߪo-#Ϟ`Nּ nOۮ," ! uBԾxc!|Uϧ|X1zj7_,ĪWԭ|e;-8!'*tHReKXK51[#DzirNK'{LۄW;n7Lhu> =' /q<u^>yF)qߧ~7]eLagħI#[coGxQʽkS3J9XJ[f} 2Q{O )I2C{eLJN#Sgkqs yXdc0Ǻin6 h]zi,2iREtYh.00dRɏfGjoX_W$>%VpNLwU6hB;KOp_>sJ{b)h%nv"|5}';g8endstream endobj 846 0 obj 2512 endobj 852 0 obj <> stream xZKs38:Uzޏ#EɒIC.+`Im v!p` BS׳4#';8tiF=-39J뙪Fn:bδnp?GZ#,&Va]Ỷ;"+ùU=#aj=Q9QKN"ƑT5" NVD@/,3[YŔp [ i8zY%W]iVsLDhE")Xh:3|!RJA@ :v6QTߤ>D*)FQ9TD1M LK# 9O BHoRxy6#ksMs8:ӕWGO0}j q#loFcc&TK0_3PJi#,G:0&izU!6nWhɍ < zdv FL%(2)Gm98]>(EFJ/4 b'fiWMP kJǹ2bnh6Jd D~Y"=Z/g1D.m?!Ì꿴u8)#yY Pzᒰe5VO|i3 VF)|s]L;JZq]W&$F˨2OB4 lɣLbK(U$ÉÃtx̟g7?Ut%}5QH%t?iF-vEuZjʧy=$ᕰ z( &&1Ә]fmk DWr9lVVٓ*+ǭ 2A. 8'E% D%dsvlƥŽNk_Id<f!+@.3SZ>(ХF61,lsĂi=m7h@T XLYIך1ha@M8BJBciيAʘ S\Opgrz]beZHel c89!$_p\HI#W߳{!q&`f+sVp* uM:ޕV&=Vɇm߷ARH+BH]A1\ o_uߤORM-jA) <5_%@ y`!Ƥy U|p*޷_ǠDi Ey%FUR%!~2%kv QqA1dIo(.c_",>a/A-sͩ=G$KP75o:v'/f=YAB&d1cظ5c3LD;-Sݩn˖̡U=̝ƚС.03j.]iכ>_+Dl:L6lY&}4T~\"PBhʉ?jwD hlC Ő TLڰ]t#롥",%tiŹ@D)UHwt?٤/ ًP. ҂^10A:`y;Vp̊r*ton~VUiBȵ.A,ڿ6)BR/tَCO?Wq"\Wˀ뉭HZM~f;$Cendstream endobj 853 0 obj 2400 endobj 858 0 obj <> stream xZKsӾ犣]%89rYKr#pa O繻r,f{ci`n>|n&G?:1H* 'J|G_YfCV_|Pĥ0a鴾u;G!, D)Ip"jC/%) !5pG~^mnM}X0wr‘P4#@DUf99$JBw>HB`@s0[Ok XsJ?{hڣ֞`i£b빗 V{VaQSi b01}t.+/C v2 tbz4vڪA>Tu^~ߥC, {͢k.?{IDL[&o1{yg]꣣iO+WcL'zƀxX*j ސϱ 'yA8{z^W:GSţ&#ST{pMn 0OU T u\{Gᕐ1&(6!"n0$}^,HX" DR< /"ґpu{*E'72JGdc&M/k:&)Vt˴~3!x-Eb ] cXyq=IDO<($"Fqٍ' FkwT0$ЭzJXYBCLy(ώ~jYXLjGJg!?; 0nq128r}ZR#E.Egq y;- e{^{_81"y%vƋ{} R?QjJD>$UpTUMCz uKй0544*Exdu @vTWyEb7Yvj3/o#|}BPhr^DB, L``}݄BV'mgx7Nh\D=tH_^#sDmfyܗ@b{szi}huv=`MK%fǴPuA|IeQ" 6O}S@v<.!fU6=4 W$o@T"Fd9ZgͿ({PSIs_Q^I?4y5oM`8u)]`58UGi-n¬p֮nJ1mC'co,[D䔎>_ZĚvL<-x8r?|?hg.E1b8|i k8ȗ!C{ni`JME8=/$hendstream endobj 859 0 obj 2339 endobj 868 0 obj <> stream xZIs8WS/GɤSw<̡/L'ȒCQ~<A)W%U{ZaD*lg_/Vĝf󻋟'JUŴ.2QB*%7Ok޿t0.ќߺL/+d ;W@1#=Hᴞá:\dXG) @XC?|TI%sfdw0E\yhf1s/qP I$`b!D+{c#~IAoܐ] BC__8c]b.~LWXN~qy㽠:܌Ǟ5*Eprҫc %)%c)@DL^|iI޽ NUbc'TEY> H|(=UYrRƐČ$QL;*1L 1^&ٚSsSD"ĵb9_vt l\ղ%-H-7 iۢhb>wF̔Dpug8֏pD '@Rz&+O3(1ͫo?Ҡ%yC!vBÙb$rGIwfC Acu%7ԡڄo#,}qwSU*}88q]'cFy ݫpsXǘWH$u< ~y=[.Vc)7Pb6HL9B0Xf֮b׈ 0vkM;GclD"j0u6jjKZ+! .1CJt(FmEG뛈cg<)v"0p.J I, _Vϡ- 6Otj 0юvb#LG\1m]5o|)d\ҬPMR$;l]y+kDA)Y2 ׼kNߺ@CU%R&S e>8ب[Ath%j&}keYC̈R@q2ͯ-mGo)6Q@u(FCy!!;ʴ2S!/ YR$SuOaW4W{4k;B\6%eHwUXȋe6/:۳wߠxbM TQAa&\l7C-ho߼,AN@[L\?C=ThZhfmFb?fV4CV/Th`;@6!޽IkŔ81%ϐ 1[k(h<Z䥫م?FБTŃGGCJ,%L A^5oH+!fvI)7{>RB3wZ?6R`, ݾv,{ W92BƕYs P7>$~'*I8gt5³.G]b]hDZ89ݖGf[3É@oANeG FBd`|c&l!3UK0F31iH8H%p`XORi6moa0G6n!BrʪPx@-ʏBΏ7~}_({" h!DQ(* ,[g_/U? i0Ӹ9Ihj\0+ȒˍlE["$#o,MNK3l$J/δ 6y|}%w0Il5Y@86/C0H8l ]Ҏk%\/=͛PHEk3> stream x[[S~'#Zz~y{2Y;0%Bx%tefVMϹ|t %lBOoMXXKHVbα%ȡ0%'y*||4[Z<5gE f-EavȘǫ/: , cZ-`Xvuެ*O%,"rY5ͲP||z2a Wmf]<5al?줪 {CTrfyun6yt7F4ڷB%Qi<gRfjQ9j[yϚR'sh xEtUe il7k(^vFb}# t-tt_v|Z4uPcvH=tH'X@νCϗIoTz7p9(%%@ƦNԋUsz asvzu-#\dU[gb7@%yZJ-8Rԧ'ׅlD~grz~"]+]Zvqsj>bNN^Ɂ`wo]M/ G#8MOϏyvl*]+*N &N+~[ZZV:;bڱؑ^+#A}*i{p1;"5׼VWh DxG 7*MruΧg!"gaᄃԚ#jLN4thJb8YmiP[+tP+(RηWIK'U(?nB\(Ďʾn Tek#?x_uqoGʠf:vPJx*&.C΁># H$΅7S]&gW&a?#mnmBGלDRSRk?Loom("T턒2aX@szsx : w+v-EUhAoRUψw,@#N@ȋl)DGi֢m &/1L+IL ǪVyldBBbm6e*̴$Jl%R(K XT/N?MS>].LA7%X\@#7Ffvqyz6 _Rby.Re1$X+vi MiޢyM7qZdFռԞaA"൸<=#U߄jbOx,I LlD\2)6^AuTK=9WuBysGl'̴F#opAXqw$ R&@f|Ă(SES޻3ʱQ.;*jz)ɴʷ +"fԘ5V4o4tU io)2_<-<}@($qKBpMmڈ U(5n?'q\D2U"Q9Wt9jxюY2;hf骙jHQ:䵅it͑4 ^.EǽxrVgFp5_pI>jwO *Q]tv[u} Jd7yV6Лf@7~hH0ێ=ĸ?~-eP77Xfѩ@[`T&mcoVM|Gה9!c„ָ5TDqo eop"eB@ˠ_CCt40kQid\=>6K9zrv}\vRK5g U~M`!iAI'9zZcf^`` Ff0ՃNz>+ŷ Zf쎳9た>o{r4`e˕MʓCowHߞU󳐗X.>/:r 9=711)k$J˃|WϋRA)کhvoal AC xy3x^=aT#{>7 :L801pU,brd #1&5[G8֎f (MĿ U =9=!g6ęA*]=1(LGfh*~I#^RCsnj;u8~,C2ڬ˻DDbLzKġ2_J9ŷe.!eUps[ Vnpq k>O8q60~UU; ;ۉ%1]ϛL ssga0Us#IF2_Pv<`qؒeI3[< *P{'v:Ik뚺`XFn0zVϰc.5OB / ??Ob)8`eh=b*C[b]UWzѷ(*r),{wU?4<=KZۙŷ4S:kRKaC$ϵE{rIک"\ h^/$¢WUdhgY?(؍,18>Og[M+_z7 1V7(9(~*!E`zXxݑ UЁ,ǘ}/h?#Kpewψg~U"uij oRMMw"W-`K-Bc"#u\v#` Mvr5cX+c i:6y0[< E.܄H&.endstream endobj 878 0 obj 3130 endobj 883 0 obj <> stream xZYo~ׯ&}>kW+ p2&%_Ꞿ8,rf@zΈ OW^9~-Y7f$H<hOҲ$K%%MׂAkfd槽~#MǜLzkRy7آLž)xo9)Y{|Oǵ.qP"K ٔcm6OMћ]VsSB_y)|/6yf+ZCP1`{xXLh턉E J<5xެxW>#@h6R*DY!sM8]YyT#!Q7pIƻIJ}{j>NalYL:|ktJ tiu%(MB`Q+)67fѵ=e#4alxf3{O)lmnudNq/(M%Gp~e$`)"0%J%6)vz6>B΄*W[InI$ٽkV&*EZ,qؔ]/}>2BGm~{Š[sDOOJUgUd~&zRf[62H0e9|^=宷gb%D<0m>EOwBJ8. 9eD^C8U:H B>瘈}2X_2|v"$.nAqԠzl9AlO} J =pHj8CmًRW۵?FäzWLm,I@JP$yzˤCP̤ YZ /bf +,i7PGysrM\fxs1I )F' 匽 2w#E)ZN -+ܱrchŽjFCȡT4P. }5;WXg@QL"E `Qn2@KY/U&c^YL݇.vڥc"SCU2/1vן7qn1l͌U]9SpaS/llH)v^(-84oBW_ԢErS3.KF5Ócu@7_[>HLL$a$9Ա@j6 *B o(\WDncr'h=(zo'7a'@4!hy!EyQC 9#=Pop[<ʘ8ۡBB*-u,ϔP-M:4&|Ij=}ʔ$TolPB TY7qJjAzorL5tv! EwaR zorBJFsNPL}FXy>iaHEJ䀻 DR WPDj?AfEkzB*$jӆ4R sSBU3h$Ey1$& &T/X뛭L_Ƽ- ɽ8 ^޴M AӜ*4[f{zd"Ņs"o9&ҟrxCoqЂtg3֊=+ +Eeg^ MklńNR ̕臠WjQ Q4@z˥Ò~$ĕ !sBtu*D_}5%丽fL,msC)te !-r̲^RMr0i T:[=ja uLRF:_68 cUثU_IYUk䘺D31w헐DRHW-(늵BsFG0*P:"d (䵘GQ̆\?<]H}.: >~.5%)EOYfjΣ7b;D^8Vr!bA))$-aEKq(F+#e~bw/: 6îwRթ7)Նw2Nr0sKV*\+7צ<0yf P!a,GL6x(u½1Q[@?թ(C\nU2Z).yx~^gO9n~b~?1/v`DV:8S9zX̦wgA!QnScdJ?Gʊފa8P؇LGA x_ȇ0e#U24=ֲҵ"s$ق> {y|L)_C`h,zMъ,d^C$,5OH$Mc˜3XQ.nP{)j]j9ҥ4|UbF$P%e]W0Q>VDYd .{r,R.3jp"\Eh_\0]endstream endobj 884 0 obj 2819 endobj 887 0 obj <> stream xXێG}H$+HYDeQ^=D8-qFZ[>Uu?W>>Wj[=Yvrie0 XheU0E];X8Fzq"rQPwu TSbT8#T Y+;Ư]Ebr \j~..ņ8{w%w{(](4>Ȟ/BAuolRckb eiگSEB9҅ħ.V Y"|PJ(K5pievٮ3F#449G%/ˏ5Y,f`S]U֣%1n6հhmTSZNoOO70Пt* V Uqs# @B&v;拾Er 3O+(-tEt_7SV40(>vU? b[ͲJDàjonݴ[dBK`eQjJW/tHPg4Mz\ڦ*3 /U-bc0'(ڀCω!$b F])ovJ,W-/NPJeGn|0̇J`tϣMiS۱oQ榭!Ps*n ]KL4 :Y.RYzR)w.>-ۏ1\X05mp4XF'Dѩ0* =+ \2[eR-=c(QxC8Ȑ>d)z*:Y""kjEon[ݷ@Ý"GjLmINyL&qV>SG8{NCr|] @p;s}n@gW&v W>yF64 Z.#p~|Oe vM_?izg& O Ɲ)}MI& dHٶ,Kǘ߼j\9V=b^w . UС/J7ov]_nf> /Contents 6 0 R >> endobj 78 0 obj <> /Contents 79 0 R >> endobj 94 0 obj <> /Contents 95 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 119 0 obj <> /Contents 120 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 127 0 obj <> /Contents 128 0 R >> endobj 131 0 obj <> /Contents 132 0 R >> endobj 135 0 obj <> /Contents 136 0 R >> endobj 139 0 obj <> /Contents 140 0 R >> endobj 143 0 obj <> /Contents 144 0 R >> endobj 148 0 obj <> /Contents 149 0 R >> endobj 221 0 obj <> /Contents 222 0 R >> endobj 231 0 obj <> /Contents 232 0 R >> endobj 247 0 obj <> /Contents 248 0 R >> endobj 254 0 obj <> /Contents 255 0 R >> endobj 276 0 obj <> /Contents 277 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 284 0 obj <> /Contents 285 0 R >> endobj 288 0 obj <> /Contents 289 0 R >> endobj 292 0 obj <> /Contents 293 0 R >> endobj 296 0 obj <> /Contents 297 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 305 0 obj <> /Contents 306 0 R >> endobj 309 0 obj <> /Contents 310 0 R >> endobj 313 0 obj <> /Contents 314 0 R >> endobj 317 0 obj <> /Contents 318 0 R >> endobj 321 0 obj <> /Contents 322 0 R >> endobj 325 0 obj <> /Contents 326 0 R >> endobj 329 0 obj <> /Contents 330 0 R >> endobj 333 0 obj <> /Contents 334 0 R >> endobj 337 0 obj <> /Contents 338 0 R >> endobj 349 0 obj <> /Contents 350 0 R >> endobj 353 0 obj <> /Contents 354 0 R >> endobj 357 0 obj <> /Contents 358 0 R >> endobj 361 0 obj <> /Contents 362 0 R >> endobj 365 0 obj <> /Contents 366 0 R >> endobj 369 0 obj <> /Contents 370 0 R >> endobj 373 0 obj <> /Contents 374 0 R >> endobj 377 0 obj <> /Contents 378 0 R >> endobj 381 0 obj <> /Contents 382 0 R >> endobj 387 0 obj <> /Contents 388 0 R >> endobj 391 0 obj <> /Contents 392 0 R >> endobj 395 0 obj <> /Contents 396 0 R >> endobj 399 0 obj <> /Contents 400 0 R >> endobj 403 0 obj <> /Contents 404 0 R >> endobj 407 0 obj <> /Contents 408 0 R >> endobj 411 0 obj <> /Contents 412 0 R >> endobj 415 0 obj <> /Contents 416 0 R >> endobj 419 0 obj <> /Contents 420 0 R >> endobj 423 0 obj <> /Contents 424 0 R >> endobj 427 0 obj <> /Contents 428 0 R >> endobj 432 0 obj <> /Contents 433 0 R >> endobj 437 0 obj <> /Contents 438 0 R >> endobj 441 0 obj <> /Contents 442 0 R >> endobj 445 0 obj <> /Contents 446 0 R >> endobj 449 0 obj <> /Contents 450 0 R >> endobj 453 0 obj <> /Contents 454 0 R >> endobj 457 0 obj <> /Contents 458 0 R >> endobj 461 0 obj <> /Contents 462 0 R >> endobj 467 0 obj <> /Contents 468 0 R >> endobj 471 0 obj <> /Contents 472 0 R >> endobj 475 0 obj <> /Contents 476 0 R >> endobj 479 0 obj <> /Contents 480 0 R >> endobj 483 0 obj <> /Contents 484 0 R >> endobj 487 0 obj <> /Contents 488 0 R >> endobj 491 0 obj <> /Contents 492 0 R >> endobj 496 0 obj <> /Contents 497 0 R >> endobj 500 0 obj <> /Contents 501 0 R >> endobj 504 0 obj <> /Contents 505 0 R >> endobj 508 0 obj <> /Contents 509 0 R >> endobj 515 0 obj <> /Contents 516 0 R >> endobj 519 0 obj <> /Contents 520 0 R >> endobj 523 0 obj <> /Contents 524 0 R >> endobj 527 0 obj <> /Contents 528 0 R >> endobj 531 0 obj <> /Contents 532 0 R >> endobj 535 0 obj <> /Contents 536 0 R >> endobj 539 0 obj <> /Contents 540 0 R >> endobj 543 0 obj <> /Contents 544 0 R >> endobj 547 0 obj <> /Contents 548 0 R >> endobj 551 0 obj <> /Contents 552 0 R >> endobj 555 0 obj <> /Contents 556 0 R >> endobj 559 0 obj <> /Contents 560 0 R >> endobj 563 0 obj <> /Contents 564 0 R >> endobj 567 0 obj <> /Contents 568 0 R >> endobj 571 0 obj <> /Contents 572 0 R >> endobj 577 0 obj <> /Contents 578 0 R >> endobj 581 0 obj <> /Contents 582 0 R >> endobj 585 0 obj <> /Contents 586 0 R >> endobj 589 0 obj <> /Contents 590 0 R >> endobj 593 0 obj <> /Contents 594 0 R >> endobj 599 0 obj <> /Contents 600 0 R >> endobj 603 0 obj <> /Contents 604 0 R >> endobj 607 0 obj <> /Contents 608 0 R >> endobj 611 0 obj <> /Contents 612 0 R >> endobj 616 0 obj <> /Contents 617 0 R >> endobj 621 0 obj <> /Contents 622 0 R >> endobj 625 0 obj <> /Contents 626 0 R >> endobj 629 0 obj <> /Contents 630 0 R >> endobj 634 0 obj <> /Contents 635 0 R >> endobj 639 0 obj <> /Contents 640 0 R >> endobj 643 0 obj <> /Contents 644 0 R >> endobj 647 0 obj <> /Contents 648 0 R >> endobj 651 0 obj <> /Contents 652 0 R >> endobj 655 0 obj <> /Contents 656 0 R >> endobj 659 0 obj <> /Contents 660 0 R >> endobj 663 0 obj <> /Contents 664 0 R >> endobj 667 0 obj <> /Contents 668 0 R >> endobj 671 0 obj <> /Contents 672 0 R >> endobj 675 0 obj <> /Contents 676 0 R >> endobj 679 0 obj <> /Contents 680 0 R >> endobj 683 0 obj <> /Contents 684 0 R >> endobj 687 0 obj <> /Contents 688 0 R >> endobj 691 0 obj <> /Contents 692 0 R >> endobj 695 0 obj <> /Contents 696 0 R >> endobj 699 0 obj <> /Contents 700 0 R >> endobj 703 0 obj <> /Contents 704 0 R >> endobj 707 0 obj <> /Contents 708 0 R >> endobj 711 0 obj <> /Contents 712 0 R >> endobj 715 0 obj <> /Contents 716 0 R >> endobj 719 0 obj <> /Contents 720 0 R >> endobj 723 0 obj <> /Contents 724 0 R >> endobj 727 0 obj <> /Contents 728 0 R >> endobj 731 0 obj <> /Contents 732 0 R >> endobj 735 0 obj <> /Contents 736 0 R >> endobj 739 0 obj <> /Contents 740 0 R >> endobj 747 0 obj <> /Contents 748 0 R >> endobj 753 0 obj <> /Contents 754 0 R >> endobj 757 0 obj <> /Contents 758 0 R >> endobj 762 0 obj <> /Contents 763 0 R >> endobj 766 0 obj <> /Contents 767 0 R >> endobj 771 0 obj <> /Contents 772 0 R >> endobj 777 0 obj <> /Contents 778 0 R >> endobj 781 0 obj <> /Contents 782 0 R >> endobj 787 0 obj <> /Contents 788 0 R >> endobj 793 0 obj <> /Contents 794 0 R >> endobj 797 0 obj <> /Contents 798 0 R >> endobj 802 0 obj <> /Contents 803 0 R >> endobj 806 0 obj <> /Contents 807 0 R >> endobj 811 0 obj <> /Contents 812 0 R >> endobj 824 0 obj <> /Contents 825 0 R >> endobj 828 0 obj <> /Contents 829 0 R >> endobj 832 0 obj <> /Contents 833 0 R >> endobj 836 0 obj <> /Contents 837 0 R >> endobj 844 0 obj <> /Contents 845 0 R >> endobj 851 0 obj <> /Contents 852 0 R >> endobj 857 0 obj <> /Contents 858 0 R >> endobj 867 0 obj <> /Contents 868 0 R >> endobj 876 0 obj <> /Contents 877 0 R >> endobj 882 0 obj <> /Contents 883 0 R >> endobj 886 0 obj <> /Contents 887 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R 78 0 R 94 0 R 99 0 R 119 0 R 123 0 R 127 0 R 131 0 R 135 0 R 139 0 R 143 0 R 148 0 R 221 0 R 231 0 R 247 0 R 254 0 R 276 0 R 280 0 R 284 0 R 288 0 R 292 0 R 296 0 R 300 0 R 305 0 R 309 0 R 313 0 R 317 0 R 321 0 R 325 0 R 329 0 R 333 0 R 337 0 R 349 0 R 353 0 R 357 0 R 361 0 R 365 0 R 369 0 R 373 0 R 377 0 R 381 0 R 387 0 R 391 0 R 395 0 R 399 0 R 403 0 R 407 0 R 411 0 R 415 0 R 419 0 R 423 0 R 427 0 R 432 0 R 437 0 R 441 0 R 445 0 R 449 0 R 453 0 R 457 0 R 461 0 R 467 0 R 471 0 R 475 0 R 479 0 R 483 0 R 487 0 R 491 0 R 496 0 R 500 0 R 504 0 R 508 0 R 515 0 R 519 0 R 523 0 R 527 0 R 531 0 R 535 0 R 539 0 R 543 0 R 547 0 R 551 0 R 555 0 R 559 0 R 563 0 R 567 0 R 571 0 R 577 0 R 581 0 R 585 0 R 589 0 R 593 0 R 599 0 R 603 0 R 607 0 R 611 0 R 616 0 R 621 0 R 625 0 R 629 0 R 634 0 R 639 0 R 643 0 R 647 0 R 651 0 R 655 0 R 659 0 R 663 0 R 667 0 R 671 0 R 675 0 R 679 0 R 683 0 R 687 0 R 691 0 R 695 0 R 699 0 R 703 0 R 707 0 R 711 0 R 715 0 R 719 0 R 723 0 R 727 0 R 731 0 R 735 0 R 739 0 R 747 0 R 753 0 R 757 0 R 762 0 R 766 0 R 771 0 R 777 0 R 781 0 R 787 0 R 793 0 R 797 0 R 802 0 R 806 0 R 811 0 R 824 0 R 828 0 R 832 0 R 836 0 R 844 0 R 851 0 R 857 0 R 867 0 R 876 0 R 882 0 R 886 0 R ] /Count 151 >> endobj 1 0 obj <> endobj 4 0 obj <> endobj 10 0 obj <>stream 0 0 0 0 53 66 d1 53 0 0 66 0 0 cm BI /IM true /W 53 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x4H7<z' AAMޗޯ]z~im-Km-a-#>@ EI endstream endobj 11 0 obj <>stream 0 0 0 0 123 133 d1 123 0 0 133 0 0 cm BI /IM true /W 123 /H 133 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h  e X@ @1kC5! a MM7oI/IoWooK_վ_~__oǯ&._Ku{׺_Ko׺Ku]-k[a-[ XaAa l0C.3Xh b ,0dP d @ EI endstream endobj 12 0 obj <>stream 0 0 0 0 96 102 d1 96 0 0 102 0 0 cm BI /IM true /W 96 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ?1` MnUn]k_z\{[6 ޿__z_]u~_m~ EI endstream endobj 13 0 obj <> stream 131 0 0 0 0 0 d1 endstream endobj 14 0 obj <>stream 0 0 0 2 67 104 d1 67 0 0 102 0 2 cm BI /IM true /W 67 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x25Xa#o aAҿooK.뙦a/a!xaxax\?  EI endstream endobj 15 0 obj <> stream 103 0 0 0 0 0 d1 endstream endobj 16 0 obj <>stream 0 0 0 38 46 104 d1 46 0 0 66 0 38 cm BI /IM true /W 46 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0|3Oaaz<v ;H> stream 75 0 0 0 0 0 d1 endstream endobj 18 0 obj <>stream 0 0 0 14 44 104 d1 44 0 0 90 0 14 cm BI /IM true /W 44 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pC EI endstream endobj 19 0 obj <> stream 50 0 0 0 0 0 d1 endstream endobj 20 0 obj <>stream 0 0 0 39 46 102 d1 46 0 0 63 0 39 cm BI /IM true /W 46 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID #`QD0k3TOVaza5&  EI endstream endobj 21 0 obj <> stream 53 0 0 0 0 0 d1 endstream endobj 22 0 obj <>stream 0 0 0 38 63 104 d1 63 0 0 66 0 38 cm BI /IM true /W 63 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kH%da< < hM7tNcos]~߆aafǐ0 ҟ O~ུm-iaXb EI endstream endobj 23 0 obj <>stream 0 0 0 4 90 102 d1 90 0 0 98 0 4 cm BI /IM true /W 90 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID & i` O@(T@ EI endstream endobj 24 0 obj <> stream 97 0 0 0 0 0 d1 endstream endobj 25 0 obj <> stream 101 0 0 0 0 0 d1 endstream endobj 26 0 obj <> stream 66 0 0 0 0 0 d1 endstream endobj 27 0 obj <>stream 0 0 0 2 67 104 d1 67 0 0 102 0 2 cm BI /IM true /W 67 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x0`T"n7XV>J}']mvKi{ %^x0^?r?!@ EI endstream endobj 28 0 obj <> stream 52 0 0 0 0 0 d1 endstream endobj 29 0 obj <>stream 0 0 0 40 96 104 d1 96 0 0 64 0 40 cm BI /IM true /W 96 /H 64 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\m~M]^Vzӫu}׮}^ZzW]_}Uz[^TA yDȤ EI endstream endobj 30 0 obj <> stream 70 0 0 0 0 0 d1 endstream endobj 31 0 obj <> stream 65 0 0 0 0 0 d1 endstream endobj 32 0 obj <>stream 0 0 0 38 53 104 d1 53 0 0 66 0 38 cm BI /IM true /W 53 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x4H7xDނ = M7ޓzOzMz$P rjz߽m]h- aXa`@@ EI endstream endobj 33 0 obj <>stream 0 0 0 4 74 102 d1 74 0 0 98 0 4 cm BI /IM true /W 74 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &%dc: ծ?( EI endstream endobj 34 0 obj <> stream 102 0 0 0 0 0 d1 endstream endobj 35 0 obj <> stream 81 0 0 0 0 0 d1 endstream endobj 36 0 obj <> stream 55 0 0 0 0 0 d1 endstream endobj 37 0 obj <>stream 0 0 0 0 123 169 d1 123 0 0 169 0 0 cm BI /IM true /W 123 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID !`x_$o! ~6 \`ׇ@*x0~߆oo~/_K%-B^Z`B خ"((Sav@@ EI endstream endobj 38 0 obj <>stream 0 0 0 60 95 171 d1 95 0 0 111 0 60 cm BI /IM true /W 95 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H @@A<#8x@AoH7 Mz &+'}o_+Ko_nwKo-Kzp]imXaAa l BY E0P EI endstream endobj 39 0 obj <> stream 128 0 0 0 0 0 d1 endstream endobj 40 0 obj <>stream 0 0 0 -3 42 169 d1 42 0 0 172 0 -3 cm BI /IM true /W 42 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID &B[ OJ>  EI endstream endobj 41 0 obj <> stream 104 0 0 0 0 0 d1 endstream endobj 42 0 obj <>stream 0 0 0 62 111 219 d1 111 0 0 157 0 62 cm BI /IM true /W 111 /H 157 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@!P0foAozw{>zB?ޯzW_Oz?ޯzW޿W^Oz>zW~^Oz?ޯzC{Azh<&0 h7@ EI endstream endobj 43 0 obj <> stream 45 0 0 0 0 0 d1 endstream endobj 44 0 obj <>stream 0 0 0 -16 87 231 d1 87 0 0 247 0 -16 cm BI /IM true /W 87 /H 247 /BPC 1 /D[1 0] /F/CCF /DP<> ID &<U~~~~~~~~~~~~~~~~~~~~~[P EI endstream endobj 45 0 obj <> stream 117 0 0 0 0 0 d1 endstream endobj 46 0 obj <>stream 0 0 0 0 171 169 d1 171 0 0 169 0 0 cm BI /IM true /W 171 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID %p?ɩ d BDa(kj %HOKoKo//oo/_JKo//K/_Ko_K/_V/!H@L7  EI endstream endobj 47 0 obj <> stream 107 0 0 0 0 0 d1 endstream endobj 48 0 obj <>stream 0 0 0 0 114 169 d1 114 0 0 169 0 0 cm BI /IM true /W 114 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;?![dF >?ޞB*o@ EI endstream endobj 49 0 obj <>stream 0 0 0 -5 69 169 d1 69 0 0 174 0 -5 cm BI /IM true /W 69 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A?:4m[I@O&5mka0AaXad EI endstream endobj 50 0 obj <> stream 61 0 0 0 0 0 d1 endstream endobj 51 0 obj <>stream 0 0 0 60 71 169 d1 71 0 0 109 0 60 cm BI /IM true /W 71 /H 109 /BPC 1 /D[1 0] /F/CCF /DP<> ID Q ՐJ_WO}^}o|+uo6kb5bd  EI endstream endobj 52 0 obj <>stream 0 0 0 0 159 169 d1 159 0 0 169 0 0 cm BI /IM true /W 159 /H 169 /BPC 1 /D[1 0] /F/CCF /DP<> ID %x_jA<Ea`iL,?oXtpnu[unk[iz[~^ץu]nk[iz]inu[u[iz[k^[iniw[[u]z[il{_ZZZ}Ω>Mzz^7׫zMzO}7ޯzM^7Mޗ߷MzMޗzפޭzO}77}zM}^zP@y&JD@ EI endstream endobj 53 0 obj <> stream 137 0 0 0 0 0 d1 endstream endobj 54 0 obj <>stream 0 0 0 0 148 172 d1 148 0 0 172 0 0 cm BI /IM true /W 148 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xA(('~$ߠ|&y I0~WW 3_^_}zz_^z^/Ax%5 ;p<7k 0~ ? ? ~߰ooo//_K/Ax_/KPAxKAaHmPl ހyt EI endstream endobj 55 0 obj <>stream 0 0 0 60 85 171 d1 85 0 0 111 0 60 cm BI /IM true /W 85 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P R)<#`= = ޓz &}&oK[}[[_/b5O mu[inumK [a,0a  @ EI endstream endobj 56 0 obj <> stream 147 0 0 0 0 0 d1 endstream endobj 57 0 obj <> stream 87 0 0 0 0 0 d1 endstream endobj 58 0 obj <> stream 60 0 0 0 0 0 d1 endstream endobj 59 0 obj <> stream 92 0 0 0 0 0 d1 endstream endobj 60 0 obj <> stream 74 0 0 0 0 0 d1 endstream endobj 61 0 obj <>stream 0 0 0 60 104 169 d1 104 0 0 109 0 60 cm BI /IM true /W 104 /H 109 /BPC 1 /D[1 0] /F/CCF /DP<> ID %!\ 0[Mm5(__z_nmutXuimKaNa&A)R@Ð EI endstream endobj 62 0 obj <>stream 0 0 0 60 84 171 d1 84 0 0 111 0 60 cm BI /IM true /W 84 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H 0@AAA7AM&}߷ޗޯ>}>Mׯx3@?ۭ׺vm}-Km- KaK 2 %!a EI endstream endobj 63 0 obj <> stream 113 0 0 0 0 0 d1 endstream endobj 64 0 obj <> stream 89 0 0 0 0 0 d1 endstream endobj 65 0 obj <>stream 0 0 0 60 99 171 d1 99 0 0 111 0 60 cm BI /IM true /W 99 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H 50<#X< @O@tAh'm&jM>Z_[]uo \߷~߷~ "~ !+)!?]K]߶[imiail a P EI endstream endobj 66 0 obj <> stream 100 0 0 0 0 0 d1 endstream endobj 67 0 obj <>stream 0 0 0 60 104 171 d1 104 0 0 111 0 60 cm BI /IM true /W 104 /H 111 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C> stream 108 0 0 0 0 0 d1 endstream endobj 69 0 obj <> stream 116 0 0 0 0 0 d1 endstream endobj 73 0 obj <> endobj 74 0 obj <> endobj 93 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <>stream 0 0 0 0 161 176 d1 161 0 0 176 0 0 cm BI /IM true /W 161 /H 176 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x!yQ? `JPxDL5C#`&7zzOIa>zM7ޓ7ޗM7zO_z7dFKMWY[[moo[}ko[ku[ muIO 00 . xdL4xdT3%A1 ᧃa<:1w<À EI endstream endobj 102 0 obj <>stream 0 0 0 60 117 175 d1 117 0 0 115 0 60 cm BI /IM true /W 117 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k)  y @L x xO  a oA0 7ҽ ޕ7zMW޿ޓ~^ޯW޿&]]ߺ][pvm[il0a,0 aʰpa  -R  EI endstream endobj 103 0 obj <>stream 0 0 0 61 132 173 d1 132 0 0 112 0 61 cm BI /IM true /W 132 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID )@P`B?~nVՇQ&J6l0maRj$&ZhO EI endstream endobj 104 0 obj <> stream 132 0 0 0 0 0 d1 endstream endobj 105 0 obj <>stream 0 0 0 15 84 175 d1 84 0 0 160 0 15 cm BI /IM true /W 84 /H 160 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t a0AxAzMo[տKoC\oOsQ<>}}}} EI endstream endobj 106 0 obj <> stream 135 0 0 0 0 0 d1 endstream endobj 107 0 obj <>stream 0 0 0 60 104 175 d1 104 0 0 115 0 60 cm BI /IM true /W 104 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u iCLfx D7x@z0 ނo o 7&oI/V}o}nk__B~IGU__oniw[imKaaXe@U 2U EI endstream endobj 108 0 obj <> stream 105 0 0 0 0 0 d1 endstream endobj 109 0 obj <> stream 120 0 0 0 0 0 d1 endstream endobj 110 0 obj <>stream 0 0 0 60 87 175 d1 87 0 0 115 0 60 cm BI /IM true /W 87 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5Kd v>Ѱ O`}e>A@}7~龟~=A/\W YA,A!iUe`K a,%Z,%ւZ *AlP : `Qp /ׯuw^ukav]d`l S'0A`![@ EI endstream endobj 111 0 obj <> stream 106 0 0 0 0 0 d1 endstream endobj 118 0 obj <> endobj 122 0 obj <> endobj 126 0 obj <> endobj 130 0 obj <> endobj 134 0 obj <> endobj 138 0 obj <> endobj 142 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <>stream 0 0 0 0 136 148 d1 136 0 0 148 0 0 cm BI /IM true /W 136 /H 148 /BPC 1 /D[1 0] /F/CCF /DP<> ID &{)JAh PS$ 2<"$ @&O  MސoIM7ޓ7M_O_M^c_j _[[kmmal5 vkaPO 5O`O 00"<O  -3yCP EI endstream endobj 151 0 obj <>stream 0 0 0 1 111 145 d1 111 0 0 144 0 1 cm BI /IM true /W 111 /H 144 /BPC 1 /D[1 0] /F/CCF /DP<> ID *@BZk^Ku4 4d? /kd`iqXQ9 EI endstream endobj 152 0 obj <>stream 0 0 0 51 103 147 d1 103 0 0 96 0 51 cm BI /IM true /W 103 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f kFC8 O0Hm<"@] %=>i7i>LwO_!~a~0~& d' A!-*A@ ?Oui~VIl4KaaaXaak EI endstream endobj 153 0 obj <> stream 118 0 0 0 0 0 d1 endstream endobj 154 0 obj <>stream 0 0 0 52 110 186 d1 110 0 0 134 0 52 cm BI /IM true /W 110 /H 134 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 #0,ɨ9.O0DP3xA@` ~ o_/״K]*J6 %K ([X` Px0P EI endstream endobj 155 0 obj <>stream 0 0 0 14 71 147 d1 71 0 0 133 0 14 cm BI /IM true /W 71 /H 133 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|4HjzxD @}7W}>׭m*V0 p}@ EI endstream endobj 156 0 obj <>stream 0 0 0 51 88 147 d1 88 0 0 96 0 51 cm BI /IM true /W 88 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &hR2 cX xAz `xAoAoo 7zM/<75@o+5_wK޻Ko.m-Km-a-0 ,0Y d EI endstream endobj 157 0 obj <> stream 86 0 0 0 0 0 d1 endstream endobj 158 0 obj <>stream 0 0 0 52 77 145 d1 77 0 0 93 0 52 cm BI /IM true /W 77 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID $_ɨ! WA}Ȅ}շ `ح0“Pxa@@ EI endstream endobj 159 0 obj <> stream 96 0 0 0 0 0 d1 endstream endobj 160 0 obj <>stream 0 0 0 9 78 145 d1 78 0 0 136 0 9 cm BI /IM true /W 78 /H 136 /BPC 1 /D[1 0] /F/CCF /DP<> ID &e(2.TL,ɨ?! a^|>}@ EI endstream endobj 161 0 obj <>stream 0 0 0 0 81 170 d1 81 0 0 170 0 0 cm BI /IM true /W 81 /H 170 /BPC 1 /D[1 0] /F/CCF /DP<> ID & y[ EI endstream endobj 162 0 obj <> stream 134 0 0 0 0 0 d1 endstream endobj 163 0 obj <>stream 0 0 0 61 91 173 d1 91 0 0 112 0 61 cm BI /IM true /W 91 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5 eͧkEAo[moml[ cP` EI endstream endobj 164 0 obj <>stream 0 0 0 1 130 175 d1 130 0 0 174 0 1 cm BI /IM true /W 130 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t pim'"􆨔>||'V n@ApAO>_ׯ߿~k߸]l.߰E Kix`%^axax0^ClW@> stream 140 0 0 0 0 0 d1 endstream endobj 166 0 obj <>stream 0 0 0 61 132 175 d1 132 0 0 114 0 61 cm BI /IM true /W 132 /H 114 /BPC 1 /D[1 0] /F/CCF /DP<> ID &SQ846H%A| ADaBw n@ i7^i7֭7믪Q2Qi*5Ao!` EI endstream endobj 167 0 obj <> stream 146 0 0 0 0 0 d1 endstream endobj 168 0 obj <>stream 0 0 0 60 101 175 d1 101 0 0 115 0 60 cm BI /IM true /W 101 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j I  qL^x@ H < A7ޓzM&}&oKoW~Wu?5_Z@~}~a[dia- 2ul0&,1Xaa)k EI endstream endobj 169 0 obj <>stream 0 0 0 1 57 173 d1 57 0 0 172 0 1 cm BI /IM true /W 57 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID &VAA^@ 𞞟zzY EI endstream endobj 170 0 obj <> stream 72 0 0 0 0 0 d1 endstream endobj 171 0 obj <> stream 133 0 0 0 0 0 d1 endstream endobj 172 0 obj <>stream 0 0 0 0 56 94 d1 56 0 0 94 0 0 cm BI /IM true /W 56 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ce_򀙨!c5\|>P EI endstream endobj 173 0 obj <>stream 0 0 0 75 20 94 d1 20 0 0 19 0 75 cm BI /IM true /W 20 /H 19 /BPC 1 /D[1 0] /F/CCF /DP<> ID &fP׿U EI endstream endobj 174 0 obj <> stream 79 0 0 0 0 0 d1 endstream endobj 175 0 obj <> stream 44 0 0 0 0 0 d1 endstream endobj 176 0 obj <>stream 0 0 0 -3 100 94 d1 100 0 0 97 0 -3 cm BI /IM true /W 100 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID &mO!&zzz^=v#>stream 0 0 0 -6 79 94 d1 79 0 0 100 0 -6 cm BI /IM true /W 79 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID "P5 U_ۯo0+^`/?Po EI endstream endobj 178 0 obj <> stream 110 0 0 0 0 0 d1 endstream endobj 179 0 obj <>stream 0 0 0 29 64 95 d1 64 0 0 66 0 29 cm BI /IM true /W 64 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j d4+Ѭ0o >oH7M_}5'ɪ_[k]a-ج[ F @ EI endstream endobj 180 0 obj <> stream 85 0 0 0 0 0 d1 endstream endobj 181 0 obj <>stream 0 0 0 -5 140 94 d1 140 0 0 99 0 -5 cm BI /IM true /W 140 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID "`_}rjH ) j_[[I_o&I_o_o_o'I&_? ӧ EI endstream endobj 182 0 obj <> stream 119 0 0 0 0 0 d1 endstream endobj 183 0 obj <>stream 0 0 0 -5 83 94 d1 83 0 0 99 0 -5 cm BI /IM true /W 83 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;տ5 ~#_, ?i EI endstream endobj 184 0 obj <> stream 149 0 0 0 0 0 d1 endstream endobj 185 0 obj <>stream 0 0 0 -6 34 94 d1 34 0 0 100 0 -6 cm BI /IM true /W 34 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Be+x zO^_kk @ EI endstream endobj 186 0 obj <> stream 141 0 0 0 0 0 d1 endstream endobj 187 0 obj <>stream 0 0 0 29 79 94 d1 79 0 0 65 0 29 cm BI /IM true /W 79 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID "P5 U_ۯoal50`1  EI endstream endobj 188 0 obj <>stream 0 0 0 3 51 95 d1 51 0 0 92 0 3 cm BI /IM true /W 51 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &CxOA7OWPkExd@(  EI endstream endobj 189 0 obj <> stream 80 0 0 0 0 0 d1 endstream endobj 190 0 obj <> stream 62 0 0 0 0 0 d1 endstream endobj 191 0 obj <>stream 0 0 0 29 56 94 d1 56 0 0 65 0 29 cm BI /IM true /W 56 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!t!o|ױ b@@ EI endstream endobj 192 0 obj <>stream 0 0 0 -7 54 94 d1 54 0 0 101 0 -7 cm BI /IM true /W 54 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!u5 t AO=߷ۭ6dž d*jt@ EI endstream endobj 193 0 obj <> stream 64 0 0 0 0 0 d1 endstream endobj 194 0 obj <>stream 0 0 0 29 74 95 d1 74 0 0 66 0 29 cm BI /IM true /W 74 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A  xAm>nuM z!oKg+B,_?N/~]뤶% b!@ EI endstream endobj 195 0 obj <> stream 46 0 0 0 0 0 d1 endstream endobj 196 0 obj <>stream 0 0 0 29 61 95 d1 61 0 0 66 0 29 cm BI /IM true /W 61 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j @D`7ޓzM>}7t!k5_ {a?mvna 5  @ EI endstream endobj 197 0 obj <> stream 77 0 0 0 0 0 d1 endstream endobj 198 0 obj <> stream 68 0 0 0 0 0 d1 endstream endobj 199 0 obj <>stream 0 0 0 0 64 94 d1 64 0 0 94 0 0 cm BI /IM true /W 64 /H 94 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?{/CO ÿooC4 {{{~~|&~O״/a%Ku᥷[a- l%!ma   EI endstream endobj 200 0 obj <> stream 39 0 0 0 0 0 d1 endstream endobj 201 0 obj <>stream 0 0 0 -5 114 94 d1 114 0 0 99 0 -5 cm BI /IM true /W 114 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID "Nx묚$?_____}}}~K~~~~_~_~KKKKKKKKKK%____}'CXY}kZ EI endstream endobj 202 0 obj <> stream 122 0 0 0 0 0 d1 endstream endobj 203 0 obj <>stream 0 0 0 29 124 94 d1 124 0 0 65 0 29 cm BI /IM true /W 124 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID "Qj5wΫjt{}IVՆai0ia Vaa 0Rj 2@ EI endstream endobj 204 0 obj <> stream 78 0 0 0 0 0 d1 endstream endobj 205 0 obj <> stream 129 0 0 0 0 0 d1 endstream endobj 206 0 obj <> stream 43 0 0 0 0 0 d1 endstream endobj 207 0 obj <>stream 0 0 0 28 73 123 d1 73 0 0 95 0 28 cm BI /IM true /W 73 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ Y `k  o7IoA7Mdl<5[iip lȰf !t0{`AC٨W < }7ޓ_޿wOm$Xaa؝0 k _@$ @ EI endstream endobj 208 0 obj <> stream 84 0 0 0 0 0 d1 endstream endobj 209 0 obj <> stream 125 0 0 0 0 0 d1 endstream endobj 210 0 obj <>stream 0 0 0 -6 78 95 d1 78 0 0 101 0 -6 cm BI /IM true /W 78 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`K"\!V015H5֓>O^&߶kka0E W.3f @@ EI endstream endobj 211 0 obj <> stream 69 0 0 0 0 0 d1 endstream endobj 212 0 obj <>stream 0 0 0 -6 36 94 d1 36 0 0 100 0 -6 cm BI /IM true /W 36 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &BR{ EI endstream endobj 213 0 obj <> stream 42 0 0 0 0 0 d1 endstream endobj 214 0 obj <> stream 127 0 0 0 0 0 d1 endstream endobj 215 0 obj <>stream 0 0 0 29 71 95 d1 71 0 0 66 0 29 cm BI /IM true /W 71 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k  @ѬW*A&oI&'o+_MVzu޶m-Ka- ,& $2@@ EI endstream endobj 216 0 obj <>stream 0 0 0 30 77 95 d1 77 0 0 65 0 30 cm BI /IM true /W 77 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &|4zzzRz7z>7M޿Oz7z7޿MO q*a EI endstream endobj 217 0 obj <> stream 71 0 0 0 0 0 d1 endstream endobj 218 0 obj <> stream 63 0 0 0 0 0 d1 endstream endobj 219 0 obj <>stream 0 0 0 29 52 95 d1 52 0 0 66 0 29 cm BI /IM true /W 52 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID 65 8aIø nnp5 \2d0%A]pKK uZ &2 D]_ɪap C .A`@ EI endstream endobj 220 0 obj <> endobj 224 0 obj <>stream 0 0 0 0 67 96 d1 67 0 0 96 0 0 cm BI /IM true /W 67 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`< jD0M&Azk_Z֖XAd6 5W {y ;7vpUm-KgQVaaO EI endstream endobj 225 0 obj <> stream 38 0 0 0 0 0 d1 endstream endobj 226 0 obj <>stream 0 0 0 -4 94 94 d1 94 0 0 98 0 -4 cm BI /IM true /W 94 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;V5 ~ kCSl~|B EI endstream endobj 227 0 obj <>stream 0 0 0 -5 114 94 d1 114 0 0 99 0 -5 cm BI /IM true /W 114 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID !`5 F?"@R , EI endstream endobj 228 0 obj <> stream 111 0 0 0 0 0 d1 endstream endobj 229 0 obj <> stream 123 0 0 0 0 0 d1 endstream endobj 230 0 obj <> endobj 234 0 obj <>stream 0 0 0 -1 71 94 d1 71 0 0 95 0 -1 cm BI /IM true /W 71 /H 95 /BPC 1 /D[1 0] /F/CCF /DP<> ID &cA &5oooooooo}} EI endstream endobj 235 0 obj <> stream 36 0 0 0 0 0 d1 endstream endobj 236 0 obj <>stream 0 0 0 -5 113 94 d1 113 0 0 99 0 -5 cm BI /IM true /W 113 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &W!H+Km{m-Kn-nKuۭ]m-]]m-޻Kmv߭׭-t׽=>K[ҾI[ҾVoJ~oJҽ_Io[}&0) ?>X EI endstream endobj 237 0 obj <>stream 0 0 0 -6 109 96 d1 109 0 0 102 0 -6 cm BI /IM true /W 109 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &jY QB  'ap\"(ap DŽ}A>/W^}z___ u/s]A + @@ EI endstream endobj 238 0 obj <>stream 0 0 0 -6 78 95 d1 78 0 0 101 0 -6 cm BI /IM true /W 78 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u `}D AAH0o~_KKᄻK0K^`0]r@ EI endstream endobj 239 0 obj <>stream 0 0 0 -6 98 96 d1 98 0 0 102 0 -6 cm BI /IM true /W 98 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u 9 QL<xAa%1  ސoA7ޓ^oI[}oK<{Ǟ}mww[kmmXa'Ia `A V EI endstream endobj 240 0 obj <>stream 0 0 0 0 64 96 d1 64 0 0 96 0 0 cm BI /IM true /W 64 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xA AA0վ|7ޟmkֿK5״iv@/axax2 6r,>%8e>|>}}5P|5<<@ EI endstream endobj 241 0 obj <>stream 0 0 0 -5 94 94 d1 94 0 0 99 0 -5 cm BI /IM true /W 94 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID !`PN _07>N07oK/ D(U;0L@ EI endstream endobj 242 0 obj <> stream 58 0 0 0 0 0 d1 endstream endobj 243 0 obj <>stream 0 0 0 -6 71 96 d1 71 0 0 102 0 -6 cm BI /IM true /W 71 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &flW }aD`p;7o7|/~___W_bK 4d2\p%ZZZZ KKAh. D dX( aE md+\"W}}/_}붾k] "G`B>O/S@ EI endstream endobj 244 0 obj <> stream 114 0 0 0 0 0 d1 endstream endobj 245 0 obj <> stream 82 0 0 0 0 0 d1 endstream endobj 246 0 obj <> endobj 253 0 obj <> endobj 257 0 obj <>stream 0 0 0 9 89 145 d1 89 0 0 136 0 9 cm BI /IM true /W 89 /H 136 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;U}oono~߷vlٮxa{{{{oo!!@ ~on?__\u Kmiw[Km. /ia\4 + ,0  EI endstream endobj 258 0 obj <>stream 0 0 0 0 145 170 d1 145 0 0 170 0 0 cm BI /IM true /W 145 /H 170 /BPC 1 /D[1 0] /F/CCF /DP<> ID ; _P0Lᙯ ?__}}|/_! H >C4Gԟz___ Q EI endstream endobj 259 0 obj <> stream 112 0 0 0 0 0 d1 endstream endobj 260 0 obj <>stream 0 0 0 3 184 176 d1 184 0 0 173 0 3 cm BI /IM true /W 184 /H 173 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p^C C 0+x ozM J y'$ߤߤkK////K/Az^^^AO\Ɂ睁m p/ ao~~߷~~~ׯ^_^ץxK/^APKjB;b`x7 EI endstream endobj 261 0 obj <>stream 0 0 0 -1 87 173 d1 87 0 0 174 0 -1 cm BI /IM true /W 87 /H 174 /BPC 1 /D[1 0] /F/CCF /DP<> ID &a^J5@V3߶ [ 0` ,X0 @@ EI endstream endobj 262 0 obj <>stream 0 0 0 29 79 95 d1 79 0 0 66 0 29 cm BI /IM true /W 79 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`D8 @o>F} .'V?W d'j i  EI endstream endobj 263 0 obj <>stream 0 0 0 75 21 122 d1 21 0 0 47 0 75 cm BI /IM true /W 21 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\o}o~%>Z=u&]a EI endstream endobj 264 0 obj <>stream 0 0 0 30 80 94 d1 80 0 0 64 0 30 cm BI /IM true /W 80 /H 64 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j[z,6imn[ku[[[ZZZAލ{ҽ&}&oI&&oIվI  EI endstream endobj 265 0 obj <> stream 40 0 0 0 0 0 d1 endstream endobj 266 0 obj <> stream 83 0 0 0 0 0 d1 endstream endobj 267 0 obj <>stream 0 0 0 -5 112 96 d1 112 0 0 101 0 -5 cm BI /IM true /W 112 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x$<3jx z>rj)Y??7V_//K%4|0~߷~ׯ^xKK ((SPd+ P  EI endstream endobj 268 0 obj <>stream 0 0 0 -5 99 94 d1 99 0 0 99 0 -5 cm BI /IM true /W 99 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;eÇMCk~ ? ~o^___^xK \.LV/&@akO? ~߷~~~ׯץz^PAN3CL@ EI endstream endobj 275 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 287 0 obj <> endobj 291 0 obj <> endobj 295 0 obj <> endobj 299 0 obj <> endobj 303 0 obj <>stream 0 0 0 29 78 122 d1 78 0 0 93 0 29 cm BI /IM true /W 78 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &]%~ 7 7}7߿߿zׯ]] `YJ ^х2 Ђ EI endstream endobj 304 0 obj <> endobj 308 0 obj <> endobj 312 0 obj <> endobj 316 0 obj <> endobj 320 0 obj <> endobj 324 0 obj <> endobj 328 0 obj <> endobj 332 0 obj <> endobj 336 0 obj <> endobj 340 0 obj <>stream 0 0 0 -5 108 94 d1 108 0 0 99 0 -5 cm BI /IM true /W 108 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;;8iMC8f7 ~oo^___^/Kk(PP|@@ EI endstream endobj 341 0 obj <> stream 121 0 0 0 0 0 d1 endstream endobj 342 0 obj <>stream 0 0 0 30 77 123 d1 77 0 0 93 0 30 cm BI /IM true /W 77 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &LfxA蜟o ɪOa^>zz5'}?޿M޿M}zMz7}>M޿M޿Mz6 EI endstream endobj 343 0 obj <> stream 91 0 0 0 0 0 d1 endstream endobj 344 0 obj <>stream 0 0 0 -7 80 94 d1 80 0 0 101 0 -7 cm BI /IM true /W 80 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &rί5wua%lVC4K ,|  EI endstream endobj 345 0 obj <> stream 41 0 0 0 0 0 d1 endstream endobj 346 0 obj <> stream 88 0 0 0 0 0 d1 endstream endobj 347 0 obj <> stream 67 0 0 0 0 0 d1 endstream endobj 348 0 obj <> endobj 352 0 obj <> endobj 356 0 obj <> endobj 360 0 obj <> endobj 364 0 obj <> endobj 368 0 obj <> endobj 372 0 obj <> endobj 376 0 obj <> endobj 380 0 obj <> endobj 384 0 obj <>stream 0 0 0 30 108 95 d1 108 0 0 65 0 30 cm BI /IM true /W 108 /H 65 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xM?=~O_{=~U~jN/o]~oI_[ۦVci'k/%VOIAdh  EI endstream endobj 385 0 obj <> stream 126 0 0 0 0 0 d1 endstream endobj 386 0 obj <> endobj 390 0 obj <> endobj 394 0 obj <> endobj 398 0 obj <> endobj 402 0 obj <> endobj 406 0 obj <> endobj 410 0 obj <> endobj 414 0 obj <> endobj 418 0 obj <> endobj 422 0 obj <> endobj 426 0 obj <> endobj 430 0 obj <>stream 0 0 0 0 67 96 d1 67 0 0 96 0 0 cm BI /IM true /W 67 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C 0GPAoV}[o}oo_oWW]Ju^Ii{i{ N+ ^܆?o O mo7ݭl> aqV5 , EI endstream endobj 431 0 obj <> endobj 435 0 obj <>stream 0 0 0 -3 69 96 d1 69 0 0 99 0 -3 cm BI /IM true /W 69 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\kOO~ooo|oݿo o EI endstream endobj 436 0 obj <> endobj 440 0 obj <> endobj 444 0 obj <> endobj 448 0 obj <> endobj 452 0 obj <> endobj 456 0 obj <> endobj 460 0 obj <> endobj 464 0 obj <>stream 0 0 0 0 67 96 d1 67 0 0 96 0 0 cm BI /IM true /W 67 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &t Apw@ށH7I&oIoI%^pavav  a %+k a Z OAFz7z7z 7oK7Ok[ka-:[,0U@@ EI endstream endobj 465 0 obj <>stream 0 0 0 -4 88 94 d1 88 0 0 98 0 -4 cm BI /IM true /W 88 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID *PN__ p!___KC1DG EI endstream endobj 466 0 obj <> endobj 470 0 obj <> endobj 474 0 obj <> endobj 478 0 obj <> endobj 482 0 obj <> endobj 486 0 obj <> endobj 490 0 obj <> endobj 494 0 obj <>stream 0 0 0 0 67 96 d1 67 0 0 96 0 0 cm BI /IM true /W 67 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &R DA m}{O{^+ 4xA7o=~_ɪ_~n_[ava5-X`  EI endstream endobj 495 0 obj <> endobj 499 0 obj <> endobj 503 0 obj <> endobj 507 0 obj <> endobj 511 0 obj <>stream 0 0 0 0 67 96 d1 67 0 0 96 0 0 cm BI /IM true /W 67 /H 96 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C zM ޓzM^zM7wMVw޿Km.v[iaa C+X EI endstream endobj 512 0 obj <> stream 124 0 0 0 0 0 d1 endstream endobj 513 0 obj <>stream 0 0 0 56 43 69 d1 43 0 0 13 0 56 cm BI /IM true /W 43 /H 13 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 514 0 obj <> endobj 518 0 obj <> endobj 522 0 obj <> endobj 526 0 obj <> endobj 530 0 obj <> endobj 534 0 obj <> endobj 538 0 obj <> endobj 542 0 obj <> endobj 546 0 obj <> endobj 550 0 obj <> endobj 554 0 obj <> endobj 558 0 obj <> endobj 562 0 obj <> endobj 566 0 obj <> endobj 570 0 obj <> endobj 574 0 obj <>stream 0 0 0 -5 50 94 d1 50 0 0 99 0 -5 cm BI /IM true /W 50 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID 8/D@ EI endstream endobj 575 0 obj <> stream 59 0 0 0 0 0 d1 endstream endobj 576 0 obj <> endobj 580 0 obj <> endobj 584 0 obj <> endobj 588 0 obj <> endobj 592 0 obj <> endobj 596 0 obj <> stream 90 0 0 0 0 0 d1 endstream endobj 597 0 obj <> stream 136 0 0 0 0 0 d1 endstream endobj 598 0 obj <> endobj 602 0 obj <> endobj 606 0 obj <> endobj 610 0 obj <> endobj 614 0 obj <> stream 73 0 0 0 0 0 d1 endstream endobj 615 0 obj <> endobj 619 0 obj <> stream 109 0 0 0 0 0 d1 endstream endobj 620 0 obj <> endobj 624 0 obj <> endobj 628 0 obj <> endobj 632 0 obj <>stream 0 0 0 -5 111 96 d1 111 0 0 101 0 -5 cm BI /IM true /W 111 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &jYD<< ý< D2 ނ &oI_I[o'_߯$dT7f Y1 EI endstream endobj 633 0 obj <> endobj 637 0 obj <>stream 0 0 0 -5 157 96 d1 157 0 0 101 0 -5 cm BI /IM true /W 157 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l &}~zޫzޟNSzZ_޷:_޺tZ}i?}Z?zZ_kt޿Z}i~}zӤ}i}w?Wޕ?W>?zI6KA 灣< o EI endstream endobj 638 0 obj <> endobj 642 0 obj <> endobj 646 0 obj <> endobj 650 0 obj <> endobj 654 0 obj <> endobj 658 0 obj <> endobj 662 0 obj <> endobj 666 0 obj <> endobj 670 0 obj <> endobj 674 0 obj <> endobj 678 0 obj <> endobj 682 0 obj <> endobj 686 0 obj <> endobj 690 0 obj <> endobj 694 0 obj <> endobj 698 0 obj <> endobj 702 0 obj <> endobj 706 0 obj <> endobj 710 0 obj <> endobj 714 0 obj <> endobj 718 0 obj <> endobj 722 0 obj <> endobj 726 0 obj <> endobj 730 0 obj <> endobj 734 0 obj <> endobj 738 0 obj <> endobj 742 0 obj <>stream 0 0 0 9 93 148 d1 93 0 0 139 0 9 cm BI /IM true /W 93 /H 139 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j | @L%aoD0z z^a?M^m{&]v\0k_ֽ~Z_֖ ae) \!U/ =0ao A~oO_[궗l*npK4 D1 a   !T@ EI endstream endobj 743 0 obj <>stream 0 0 0 0 156 170 d1 156 0 0 170 0 0 cm BI /IM true /W 156 /H 170 /BPC 1 /D[1 0] /F/CCF /DP<> ID 2'52 Q~~~~Cno nk__ )fCZz}|/qx  EI endstream endobj 744 0 obj <>stream 0 0 0 60 130 172 d1 130 0 0 112 0 60 cm BI /IM true /W 130 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x޽޽޿޽މ5/Ko_/~[oK}oI}+/Ko'H N$5o EI endstream endobj 745 0 obj <> stream 99 0 0 0 0 0 d1 endstream endobj 746 0 obj <> endobj 750 0 obj <>stream 0 0 0 -5 112 94 d1 112 0 0 99 0 -5 cm BI /IM true /W 112 /H 99 /BPC 1 /D[1 0] /F/CCF /DP<> ID !a pU!/K}//K//K}/K]k]t^^Wk׿{^߷o~߷o~߆o~߷o~߷o~ĉa EI endstream endobj 751 0 obj <> stream 148 0 0 0 0 0 d1 endstream endobj 752 0 obj <> endobj 756 0 obj <> endobj 760 0 obj <>stream 0 0 0 29 78 122 d1 78 0 0 93 0 29 cm BI /IM true /W 78 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID & o@ƾ5~ 7 }'I_MS^]u^uO|6a'Y^O.1x EI endstream endobj 761 0 obj <> endobj 765 0 obj <> endobj 769 0 obj <> stream 57 0 0 0 0 0 d1 endstream endobj 770 0 obj <> endobj 774 0 obj <> stream 94 0 0 0 0 0 d1 endstream endobj 775 0 obj <> stream 145 0 0 0 0 0 d1 endstream endobj 776 0 obj <> endobj 780 0 obj <> endobj 784 0 obj <>stream 0 0 0 -6 102 96 d1 102 0 0 102 0 -6 cm BI /IM true /W 102 /H 102 /BPC 1 /D[1 0] /F/CCF /DP<> ID &u P,<<x@0xA0z7ޓzM7޷O7׫7?z[__v[im[imXl %Aam  EI endstream endobj 785 0 obj <> stream 98 0 0 0 0 0 d1 endstream endobj 786 0 obj <> endobj 790 0 obj <> stream 56 0 0 0 0 0 d1 endstream endobj 791 0 obj <> stream 76 0 0 0 0 0 d1 endstream endobj 792 0 obj <> endobj 796 0 obj <> endobj 800 0 obj <>stream 0 0 0 30 60 94 d1 60 0 0 64 0 30 cm BI /IM true /W 60 /H 64 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5^S~>~ools[}{{{oo# EI endstream endobj 801 0 obj <> endobj 805 0 obj <> endobj 809 0 obj <>stream 0 0 0 -5 113 96 d1 113 0 0 101 0 -5 cm BI /IM true /W 113 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pp(={׽O׽{y޿M?^zzޓz7׫޿W~_zzMzM^~޿M7N$l4Ȑo4g@ EI endstream endobj 810 0 obj <> endobj 814 0 obj <>stream 0 0 0 8 99 145 d1 99 0 0 137 0 8 cm BI /IM true /W 99 /H 137 /BPC 1 /D[1 0] /F/CCF /DP<> ID & @e%A5Oooooooo=}}j  EI endstream endobj 815 0 obj <>stream 0 0 0 0 156 170 d1 156 0 0 170 0 0 cm BI /IM true /W 156 /H 170 /BPC 1 /D[1 0] /F/CCF /DP<> ID ;` ,Xm`ibӇe~ ? 7a~߆o_ׯ^_z_^ץxK^^AKmB() kX) EI endstream endobj 816 0 obj <>stream 0 0 0 1 59 173 d1 59 0 0 172 0 1 cm BI /IM true /W 59 /H 172 /BPC 1 /D[1 0] /F/CCF /DP<> ID &V Z]pX[  EI endstream endobj 817 0 obj <>/Length 997>>stream 2Z@70Zk^׵kԚs0<,jGdQ/ _i__ii_i__ii_i__ii_i__ii_i__ii_i__ii_i__ii_ii_i__ii_i__ii_i__ii_i__ii_i__ii_i__ii_i__ii_i__ii_ii_iקׂAKdzVd~Agd ˲ւ!#2C/j2- ! 7?_kdh2xaIHd@ endstream endobj 818 0 obj <>stream 0 0 0 60 121 175 d1 121 0 0 115 0 60 cm BI /IM true /W 121 /H 115 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uĐHC\0@OA4@"Ξ w$m 7^i77zzWMW_~߷a~002` pd3d 1"40|.AK S<"~AA~U[ %Koᄶ a %["X0X0Y @>stream 0 0 0 59 121 223 d1 121 0 0 164 0 59 cm BI /IM true /W 121 /H 164 /BPC 1 /D[1 0] /F/CCF /DP<> ID &EARCL+ еFPx@z ނoIoIo75Uuuv[av0K 2 !Makl>]h.h; 󹆭Dᕅ뮺erA7>0o`oIzM7M_k}oD3kIAAB 2 VA`Y @0AabCWL EI endstream endobj 820 0 obj <> stream 130 0 0 0 0 0 d1 endstream endobj 821 0 obj <>stream 0 0 0 -7 109 94 d1 109 0 0 101 0 -7 cm BI /IM true /W 109 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID "aMC K~o_m~>m[w[mkm[klooo~ EI endstream endobj 822 0 obj <> endobj 823 0 obj <> endobj 827 0 obj <> endobj 831 0 obj <> endobj 835 0 obj <> endobj 839 0 obj <> stream 144 0 0 0 0 0 d1 endstream endobj 840 0 obj <>stream 0 0 0 63 136 173 d1 136 0 0 110 0 63 cm BI /IM true /W 136 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID &W pޕ7߾zH= mδC( EI endstream endobj 841 0 obj <>stream 0 0 0 0 83 98 d1 83 0 0 98 0 0 cm BI /IM true /W 83 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID )@\pCfaoo_ׯ/_//K.T sXl2 $xa~__^/Aj a0(R` EI endstream endobj 842 0 obj <>stream 0 0 0 0 85 104 d1 85 0 0 104 0 0 cm BI /IM true /W 85 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H a $ Aw07A&zM7ޓ7zM~Wz>ޗׯ_^:jmmm[ko- pOaa '!<04Ch EI endstream endobj 843 0 obj <> endobj 847 0 obj <>stream 0 0 0 0 90 98 d1 90 0 0 98 0 0 cm BI /IM true /W 90 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID +R895 Ѧ07oooKK/__Kׄ/KKZd3u`  EI endstream endobj 848 0 obj <>stream 0 0 0 0 84 98 d1 84 0 0 98 0 0 cm BI /IM true /W 84 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &2DH<!_@߿~ f^?PAD/U!VF PL EI endstream endobj 849 0 obj <>stream 0 0 0 0 78 98 d1 78 0 0 98 0 0 cm BI /IM true /W 78 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ȃ0`w_ oO~__KL#@L EI endstream endobj 850 0 obj <> endobj 854 0 obj <>stream 0 0 0 0 94 104 d1 94 0 0 104 0 0 cm BI /IM true /W 94 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C y b ,d  @ \ ~IMLz '~KPDy  UFk߶.I^IK '0KO!>^ >CXC6 EI endstream endobj 855 0 obj <>stream 0 0 0 0 37 98 d1 37 0 0 98 0 0 cm BI /IM true /W 37 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID j!$/?0 EI endstream endobj 856 0 obj <> endobj 860 0 obj <>stream 0 0 0 0 55 101 d1 55 0 0 101 0 0 cm BI /IM true /W 55 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &fz'>=M7ޕޭ>MWh+ EI endstream endobj 861 0 obj <>stream 0 0 0 0 95 98 d1 95 0 0 98 0 0 cm BI /IM true /W 95 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_0`<& [Uץz_^^zz^^ץ]\4K_nkoa~߷~߷~߷?~(T"O@ EI endstream endobj 862 0 obj <>stream 0 0 0 0 111 98 d1 111 0 0 98 0 0 cm BI /IM true /W 111 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID @7\ ` Zڿ}N??_???aʰwX EI endstream endobj 863 0 obj <>stream 0 0 0 0 90 98 d1 90 0 0 98 0 0 cm BI /IM true /W 90 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S'\0^]v__!/////////_/////O?<$R`_׬@ EI endstream endobj 864 0 obj <>stream 0 0 0 0 92 104 d1 92 0 0 104 0 0 cm BI /IM true /W 92 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H AAA&o 7ނoVҽ&Iҿ~W_j_[nm[~v[u۬6Al4Kaa :,1 !# D@ EI endstream endobj 865 0 obj <>stream 0 0 0 0 79 98 d1 79 0 0 98 0 0 cm BI /IM true /W 79 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID "5Ham_h(|3to߷~/K^ PP  EI endstream endobj 866 0 obj <> endobj 870 0 obj <>stream 0 0 0 0 94 101 d1 94 0 0 101 0 0 cm BI /IM true /W 94 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xsA$\'"H ސoKQ pԷ uJ_s_zzz^^/ϧ\>a߰oK/_K/Ai1!PPR  EI endstream endobj 871 0 obj <>stream 0 0 0 0 62 104 d1 62 0 0 104 0 0 cm BI /IM true /W 62 /H 104 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0 DAuxAAF= ޾]/tX\%3I AL%\, Z A@T Fm]h.!__Wjkk]{00O B|0O( EI endstream endobj 872 0 obj <>stream 0 0 0 0 90 98 d1 90 0 0 98 0 0 cm BI /IM true /W 90 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &܅/aɪ~.<.Ρٯ@ EI endstream endobj 873 0 obj <>stream 0 0 0 0 90 101 d1 90 0 0 101 0 0 cm BI /IM true /W 90 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P@@0}zAz oI[ooK߫_ӿ<0@H  EI endstream endobj 874 0 obj <>stream 0 0 0 0 98 101 d1 98 0 0 101 0 0 cm BI /IM true /W 98 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &lzz(O_}~_߫ҿ~WoK}~W_WJ_W_o__Ozh<aL  EI endstream endobj 875 0 obj <> endobj 879 0 obj <>stream 0 0 0 0 138 101 d1 138 0 0 101 0 0 cm BI /IM true /W 138 /H 101 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`fW_>^_ _~JWWW]ozu]_]__վ}u]_ߧ_ߧ[WW}u}X}'][{OL 0!lQ? EI endstream endobj 880 0 obj <>stream 0 0 0 0 98 98 d1 98 0 0 98 0 0 cm BI /IM true /W 98 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID AR,AzwKm/Knv-Km-Koۯ]-nKo⶷-{ג7z_Mޕ?ޭzMzM?ޓz_ޓ7M_zI}a &  EI endstream endobj 881 0 obj <> endobj 885 0 obj <> endobj 889 0 obj <>stream 0 0 0 0 100 98 d1 100 0 0 98 0 0 cm BI /IM true /W 100 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID &EASᅵ_|&}oIҽ&o}+oҽ&ITLJ  EI endstream endobj 890 0 obj <>stream 0 0 0 0 70 98 d1 70 0 0 98 0 0 cm BI /IM true /W 70 /H 98 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5Dk/5~l?mow}߶{xoo߶oo|7@f EI endstream endobj 891 0 obj <> endobj 88 0 obj <> endobj 87 0 obj <>stream xyXTW]Wejv^5hb"#Rvwvҫ( "XcM藦I4cLC~hg؇s̼;2kF&`s?Nd8@&"('i`Wlj'A-қdm? iĜNL4;/|Wb H6!>["^rm ?"VEGv;'$(4*/iq_x0è-vK|%sB/yky+GnYFUoF^malczOxeQ^}A(nf0tϱ f=La^b3e+3y,g13㘡 f>3Ƭd`&0ÙƯ+f5Ȍdܘ$fYļʌf2f23Y,a01ALOz\/?cte0};Fe˺3nuF"3wrN!넮6:։^96[mBMg{5Dkzǫvvv}'! _T[k::鿪O?p@/rSU걓yԯzڥ,] ,v{-2!]`a7i &~&qp~2`aqA wzWCdCǿ4 ԙG njpނZ&N)`PǞ6X^ leoKhFq( KmH,Kxq7,2@N.BN){Fh[!I׫GD6-Vx^M Q32Q%$8wsVTS7]F=WZwn 5nC?ewn${n+ֆ)7ȬTwR%cٯC5Mm/`9vhH75Wy᳗~QB^Q.TJeR+-~.Bs%l`_ aW.(Rǁl6%؏~s;d6$3Q8(F1\~p)9n$ hz v+81$wC^JATc2J9\ka+)^%kituZ)3 jDcEm=}Pyq):]ZeQ6f%#BF\6h\E!>14ҟ\2 5&݀-2o{_ ogV)֠~KՉ fAg(;D9`)4+n`(~*@PT|2 ZB숳;ᴇJ P_Bv p$xWBqɐYn"Uo~GWwKǩ\ P5Wm6ͣA8qC7 'ᄖKb!=^]ް"p]G] +jj*Fbo:q2o[d%1}BjLOI-ZQ@WC7߿NԦ~lǐS@ jǰ|R{h )J;H/EvUSmv8Vބ N∊ :Q"xTPRvt%eRxt߯=否7.̜5c<ר Vc71Prޮ:( JF@֫:\Yv(ރb\·Ȓ=6eikH輦?ƿi8H8&D,[~s舃>\شu*t{snlV]JdQZt2 JCv7]WfGyYYQ&Sc!lݵw_ea# ElfߐrЮczJn3Y@2j}8V:0ЕPa726\QxDu CϧiHl,s 2ZJLA?)'Q[`QL )|`Al)0ǰ8 v݆_d->h*ɢHY#"t?9ܕZR}MV׭qY(RhELie"8U3F6}W\×w?1W_+*+Y8qBWKgș[W,JT{K*].4|xiܮ]5ܵq^']/R ѐ)W3ZEמzoѠ\g)0M9Pٹ%Znl=bդ oC3UYK ;mHSH[&k@P U M=Ħb=oBY\.1M-C$yy-[Ta}{w[4܊97L`|d7zltG!\ }iP/puXpe H>M9J(Vh 8 7R*tV=tH:W1aDIG9gAXKUYJC!ȪV}Iu,Cʰ>J/>񪦀;x]F^(-It|h"UDBJY+GOBఖƀ=*ߺ;3Y;"{v_R?HÎ3 56[ތ)8 ~}^؝IKVkd GG =.?&]>'˔NrRJzNq·~˾x_r$R?D*=8*BúWV{HwՎxWEnJ(^|J|,VƏ-\v"/iMX-5Cq ==72,!P`RKg׀]+hk:~J?ssPY'/ćle,x8T jOi[$J,4VGݜQW?j={]y}-7?0"d9S-)a]gWHwfHM .RFv6a 'tfŜqpĿ3 ӳ1尹3M%э0q@l-{.}-d`23tSZ']:a̜уXj[ߐ^qRmUtqB-3~Cؼ3ɘ ԗAVX`M<1'Wy{i\B(ɸrU! >>|iTf*ԑ | 'Vlr-wx?$ ?EuT kt]m,P_{YMY2C[{ZdIԿw][GAOe1`4C~&.ܹRb]U$B4̭Kt{13AY^U |cnP|zۓ?*E5G׻4z>}KccW{3%[dԡiԓb#' LbJ1m?!EƺM>/vZXG I, JHZ6RK;L|Y{r,RM;Dx&(s< xN}zD3s:zX gS|23Eͮ(jjTZ>%^,0CA[9Of&.TNKv(,0F IJ?viJRw`1 j{dN!kgfy) }u1JrX^^jZ GXo ԯQ[\:Ё2u*AX -yal2n.ñs3k2sJBI>xX9F/)J nj5< SmH\ǚiv}pT7m1j!Q@!XӺqwd += hBK\-I!Cq?4Rxa 7>G(>&7);GX!{gfu)RtC+ Itaѱl#lKpmM Yn\fp,/c_'N(sWIƱPPʦ6$#ɐ`%w7ҀΤqK%:ѻlsn4J֔;.ߨ2,L}:u jEP+LˠgdL09& _ @[颫EĞ Zha-!`7U+DP}΃"kq'jԩɬUy !xӬ5;ziȲ%"9K۟>MST}rڷS/DR@mj!@E>;m92WC˓td8x}o*x}jOnzt!_M9;YJ(;O !EiҵZځ&$?]q[n*JM&PLe3`!I&FL%߳жђs堒Ƚ1pGOݒ3U[i_6tsmu89&-Ť"N YWC`HR 'royҘ.DZ886*=>1C9ؐUQ6 A Sd Y&Cжzkt4PP^URmp?>"KzU~3~3\wI?J8u3VkC= I5f$XXYx=$g{*c7ng+a\ښ/-"H G r].TA~Zi)+@41l 1/;ʝ;b΁2,:JX;IY#ME1d:Һ߱ŧgs%z Yzv߁s 2 =Gr̴pk֨u:}>YK$PC2[wj^m-4B׎ߡ ZYD ;l>T*X\ㄇQv.+$ZOHR;޴qf*3Jk7_> endobj 84 0 obj <>stream xylwgAW҅ (вeRP ,IC !8qG#gW_8$& HBD(ǖRqvW-m7hXEj~i=$$oKI[<M΍F^b~M23☙< 8#ڄ茱xDx#[S*Ky25K/_&L.IsKٲ$NIܑe> Nx$c$Vr4?o@ޮy?YtdP@]!Pt zMzt I^}tf$0X,8;@o2f`Ǯ4 h VMx61feEx gSj\k*dkGmpꄘ1 ᅐb-U:9 ֶ># R/A_{=15v!U":lW26.J04 Ė={WG'G XBMwpkcxANS5HRsXuɭ <_y\*`2ԖK3ed?}2`ZZ)$M#x wyOɧ  6)ufNWfD\5<ך*Yw~0 Y;\=? О́D/k~ȣ Tk*5vڃFzC@WTQ./.2(eϝ<",՘F/uɍ%0 jA?QQVuyVk&FdT*yG~/lT)fr"迩 =?鋐a LeH9t ^cx;;%sOy\O h/i IqETwZ!R"z%K?ݡ6}Wsc N׿~ہ5s^ ~|?] z?_y *<_WmD삄m%=a=R a*n5U=gnP>o#/{B Oo3OM1@ v(ȕ./=#~.2V%dѪA/ =уHkkt .?8알v#m لef%ԙ+ iA1/hٜf3jFAunGwp }Ө/++\z{=j*,gnf*st8& ؐWY-Qe*)&Q`x.e&d'r}b@`u ?ulyZ1@4οx  2 cǯ:Cg 2Jx:w]FY!$Y)q"ُ'pGP~j w< {j"yKEAѶ&BުGicW)l 3,5\G 5ׇ%y$ɧEc|x Lv6cl<> endobj 81 0 obj <>stream xcd`ab`dduuw v 4 (f!C柷 ˓X~_#M3wFF74ʢ gMCKKsԢ<Ē 'G!8?93RO1'G!X!(8,5ls~nAiIjo~JjQ^rfQrNj2F^ ] @ȔY{~^ؽ_;~;{勵{I~}_}i'c,we@0w2 |%~/a-<} =yx݀ endstream endobj 894 0 obj 295 endobj 76 0 obj <> endobj 75 0 obj <>stream xcd`ab`ddv v 2H3a!\׷Mn$]3#Ws~AeQfzFcnjQfrbobIFjnb ZRQZZT9?$H7?%(1=?c|`h\}ӳY}/yChescuw9GY|wo-@(Mwu߹Onm+ p3]ɋ/fY/W>Kf}ϛ;qz[r\,y8O5w endstream endobj 895 0 obj 312 endobj 71 0 obj <> endobj 70 0 obj <>stream xuSmLSg;Dt.eF:ȌN'nCYDC>mR(ʤ@ _X(B[>JnȄ-8nۢ,3K}3|o}Y[}<99Tizni;vl[JKOL (EX$<'.ĎP]hh<0-Y*PV@|IL\&YD]V)ru\y+34jarcq2=(WezIUmN]LVqEETD82j3AR[TB!S IHQ謸 bIDv/yژ98=#i5~|y6p| xȰ3̷u[\lP-԰mQhbМd-',"KJ wҞӶpae8r-6-T S"2A{l`|4|A=>λw\dQ'#-G@k-e.Nt\vww6@nB}#*&&-E՞/ͽ.gW gad׉c]53uu ƻG:Q6$zvݍ/{䎝G;q]1UרaS:!Kٗ74dh}ېM6iZ%8.͑GE${DG_:=y平 endstream endobj 896 0 obj 1348 endobj 91 0 obj <> endobj 90 0 obj <>stream xy xUv&]-IdYdYÚ@odO:KN'$6AmEQTtqyK?O{{옮];;o/~k1W8A`8NE|YF2/ GvgŜ8#[l~F5h 4h{w{}0hmv Z#>hwwNoUDFx Z0uyn\1/6kC7\0 ,ؾvquKv;/ p_,:cCic{N7c_}cYF$N9{ʨlym 6uodv/08fY,`f0㙡f:*3Y,d`&00kEDf8YLbF0%df$,e02f*3,g^c0&W@͐nv}# ^0 L\@{ͨUU:՛BxKޫ5&lse|z.;@NO m8lwslေlpBWl즰*!`T~dAcT)p-l# ాEbؕUў\'^v}qR2q2.7]%Bp1FlXd.=i8;Z5y pj2Ɔb!< Fz;PE~81=1a:1r]e˖c*$"*21pk ϜƘ&Mo:\2z_.'v 6Fd*8OW޽x!y@͕9\4&0yS\%UG9i~;zRU*nx C"{hՁȅ2p7IW CyyɠMi:!h$O>Sq-'s/}(ho]#ƗZz]ta [ˆm[#iu4YGg)=f  x~y CsPƞ`\Nld:IO tN c=4ih\ հ rM8}qI5jL:ARdU NPEPiz*˵Y:F)Cu(>ŪȬ yGhp֞tz8kR2 T+FwLL|0d䣾튼rMa}7uJm4_*ld<@C9R(q^E³=1L£7fQkmFd)W / m]ツUݿ~5S"+P 7xҷ W߷_`ÌaJEdb>7B@Ud}<Dz&央g tM oKq}bip ʭ VSsȭۂ6Q*kddEV٥~xi~ #m[GO,lH8VP0{;}y|US!蕾B֬ h@(D %Aɢ?Kx&`xTq2D>GZ& `c#C\]>-SK:Cpʗ9V|%Å06 9sT iB&&¸bsEO^[?X ̀ڳ31@3fZ;ٹRS½UxA*{"(,9@F~M^Vk m{ShOiߕdhblXGҙ+euf1̡ql1{|ה+L>U0ZifqT+!JRmoPi).=Oq\qxYIdYBV1#0ڠSyh ŵ}%;b[WC%:o;ءоN~wcA;y09-ya*fubGC"PLR)}[<)筚/`>s43m>#DHQG63 2h㮲J||2pwRrGW{6q U`̉FKBfVj:HJֻi^֯$:RYZ8{G%uɎDWqN_C"4Q'x;GO꧈|c `vՐWNF*'*ܷD%!i$-bǐP߰}/Za)x{Z_dA>)i b`3Oxc$+)f h{%] #=˅b%ced~@~.ڟڟ:I\*Dlnh+D2,^`2{9_|j$Co$NZqk~^}bm8lw2\ ~)5vTMUSoQ )YZ%pXAnCGh2)?d{0Kp@dHh5VSiTMqЋ4WGё'/V{N:߰[GpIiߚZh8d&~rexGauKh՝܂M<^X}J{QߨKztil1?[TҶ]Z><^4sm}~rLl; O;oQ I$'0kSb%YT8c%ԤϏhHi4WH#uBJF}G~.YP0Y B(܌N9Kb(eK2l^oLd\9sx"!H 0&H{( R`Q`"Ьo='XM4PH>)^ZK&x2dc]HJ\#}Cd`DC &3B3Wz8$yL_v-FkU,vw҄`WuGq$ꦵՋଯp`wUc98r{¶WVG+ 94{8q.ߦֻP= OفtK_.똭A u$Mw$VcF5S.=quu.ߨ @v3SIX4HCgwC Ǡ@[o T Ƭ̢GҔ>r*Sb:(ծ.o.MO+Z-_Xcmomy._질S j#YT]VЅwo׾M%[eI9f ՠn8_3^>e6j.=ll^v#eBNGcoߺ٣[8#K`fi,bN/j9] 휮[B!Rj,kH֊FuQ{՞B -ց17Ʒ-R0ffqjӳҮ0LbsMi k`{3+R .9%r/;|9K%+%79Ygؙx7 PHw{ָP]`{[t9G^1q)$* s`'B$~e%\lYJUFCBR)Z[ZվM98Z))!Ҥv]}'1FJ+Ci9cLo&ѳUfqXP%,Oq=y8a%k0U->l4{"4=XRC~ɾwOT!h 0ѭ ں3{4oJְF\β%\`Z6' %uzGl7 KMe3ÑL,aBU{,jǰC X#Q%SEޤӿSH/AVGS)hEfg 1_oЩ<-ՌFÍK$M-*zg'z(Iq(cCJNHwݍfC8nGUbYyyֵO^H"XJkf;@&O\-I/jʸ0AE$BaAvuJzUq3]䎉dWdz0pt:TFyѝwr:qvXe7 ˂T 5\Z& d/ - i,)3+j̪hX>4~H^qSz_A7حB6QOr!FH%C(ėfG2ܚ“=chO|YzYڻEĪ)4ѕwݭZ\a-+kJ*pҺ1[0#}]o9[.>oq bSpT}loaKg,WnѓټvTN%%-^3osS^/XNqvF;yς7`N~5JBg]μ78K^2[9xEs _4RLȼ0S]H,~ MvRZOdxEŠe_fS'6^II|U~g'j:Ǎ$!ku>~?R۷AB矣!C5hݗ8mKOK]B}G˟> (;P>sҋ}uc`*m(_S嗪V(TYx}f[$43IdILeZ.۳4`0g+IIeg]CJwrl]E !%1ٱ3FGn\[h{`ye|rP+ 2wPsa)`~7~OA{ZZ{K?91I:t2pvm>UKT}9EJ AMF )}Oِn^1m%hׇZqԳ9+/I/Ll)p༽8{cBlID1xh!n{\v{|hSp] xž~%A2pjFMɦ,F3d2o }҇8$v Mʻ!*c.r+oa]9+/xL-nq~n`4ǰG iT iӕQ)'fXRM:%qJr-(hKN݄PScMjW{Red{&/ܑ:hԹET1˰RT N4D 1+\bMļ8URbr!%KQSOTe*q\InI!i_\X_P*tm6SkW_\ɉ͑qq/HR!&y/c5!4!7KB,B &_bi<^Ѣn=ak@EdwsޙN^$OB f}'Ohʊ$0Szh>~%InFU;'ΑCܴoUۼ5BPna;}>A+=SG_|p&8m4hSªS'qe3A}-UOon֤KFe-x M#ݨ/%N}U4W ^pȂ]\/Uf[Iu)ˉGk~{iݬ=z\60$ endstream endobj 897 0 obj 8348 endobj 116 0 obj <> endobj 115 0 obj <>stream xX XS׶>!pr< :jjZEpDQH3acŒ c$PSՠC>mbmmW}봛{ok߻/v>k#cL6p֮}/#Wdҫv_$7o^#p`F.-YqrWO=r‰#ΞH`vnj?`o5\~ckP'F QEu2xWG5MG0̜!-QXpvZ [/}YDdGT6Ϸ^{kعL̛0cIoNfיQf3ldV11c%f,ʌc012f:YLd<$ƓYǸ1 Jf!3qf0wfF`/Fd0<ӗc3)=5xAZvN xiie,QSqwLK&K߯T2 n@ ?ajaO15+# 0sqf$,3ʥ7%5ZĊj(؅?~gjtJMКR*皗ܰQ$Ёtw_] 9.W튉޷t.nfwwt wHC&(.,`cUt-GHNgU[p1tW?=U@ ;]Z׽n.}k ,!v $]d7^x*Ǡ ~jMeGyu:ϱ⾟Ğ( GT;T%ϣct7UP%."8c46BT-ű$2^t6jx8_f!0K Y6RT%AUl \6IZ%]_yjg۩a\ϢÅTHO0^v!Ԃ-ri-ƛ,(C@fEkQLL""_ 4#pPI3%"R! [PDo/Ğؿ1 !N?vhO(o2wu˗^|n].fҌfGj'b}As@ΖPwFr/4֩>`[Wlkĉ ?C{D _X5kޢvtKmk܅|#qtOh<ԨzGzK%) ,W[YTO4K] }yA.EI7R NKJIt頋Wm6SF}qrw:7AV !:1e✰mM 'Ļ:.+DeƿY`+pϝչ3&/^{2amp({#:i?uWt^WԝuWqJoy +ʥHZ}g2< "CݯfvtrFTnV a;_|+@S@U0n/ 0?<㡈:F"viʽxH H>?T ]8e=n hіm;7X6qMh4z- oY"Vvjٞncq=3qLD\Dc-T?>K_ׯu4hcDSQuCUWE5Mܠ,UlEZP%:&1V<U ^OWP yޕS[&C<$gA*$'덐 ٙٻ9G.(֔u:fnu) p),UNH"mj,B, +;kRtzߞ%GLj;lZSxS%g8I RCk{JWGeZ7%)0y^tQK\ȥw(+pߩtƿ2 x\fi4Z?|j Yt?o0AλI_,sZzFϦ*`t&[ Фp\X\՟oD`.BJHW4\˾4QC-8JlHcm'f{$n(_>"FлqdM#z-;cFpi'lhxoΌbK:J2<\ lGݺkIٔVE #6eYhQ{o4A9pBou꜄$`-a]ګ"har3u sj{[d-YХS轈kE<8YƆ8ffc5~oCJEWAd ?o$XTEQ fkՂrriuE9 imdúuƮ': /fA%DH'~B!q4HG:+rs=CqV%g`s<[I䢘r(V*ͮ8 /4FamƷm.='Yt!5AnrE R\]-u,,6V7ņ=PO-d#\\=H[ KFdܶN+ͶfmG;L]A' Zy|GԻ)[aKzuYۧe/T@A+!/ lqR {Eq>v}~{ždLf:ltAA9(_tHtgV45DB4p ߈[uRS[cc DzQn_.ISiw(}`MXx7G^t+s$gIe#! c}jW z?h.~ o^.) _6׆0-NO?&ܠVAKS,hm"hA"崧4unwAh`usi2~o1+4guDtyZȣՐҥMR??d;N-eeB|X Ŝu[|æF[£DXUMh¾8D[8M IiŕĔ5=9voٮW52Ob 4hi\eϯ9%ڮ#1 T^42ps\rr:p)s yE³g+ .ջʴ ybj%94k$2 )윜\kWGCU1勨sA87NO1-YdaMC'Șl~_ݽz:udXP:HXrkWl Bʱ8]'Tsۡ#4hrgW&drf#wȳ8_^f pjD?=FԧzPrS qqToFWwzedɐC3)ǁX2hEj|T@MAC5%͆k\5I[ݞ\%y{򡂫*f&۵Sq.f)ۖVUU_Dr9Xmk`%7|5I줁LV:` ل:J󸻤6 :"MNM g}/#MP.'J)-{ӟn>pKw $}~sg]b(m6O(9z p<}PG<7֮.KhE:%WAGqEo{Ia@&H/r=cJDC.:^QG% >m3$ab;_Mc ׊>I.L#wYSax,#uEBiAMQcVQ"2h#/-ˆ.?BgR@ڲ^8zcs ˘>T!9+ߏ6t R!v|ܐ;z) 4}|$mp:9vOEϙѓ:)R`Nx\6 8Ujdr\aJN̤JN"W%%AYS[it(6q& ix [RsSz_J6 E( E4ʳsv {# 胷Q99y`եq]8(p=%e :*[ZB[q6Ez:}AibNKh.~ <]乴_8[slB+2LG 3Z/p[2FhZhHh2JSBp&_ ]\$ L,)`ItOkܿ endstream endobj 898 0 obj 5055 endobj 113 0 obj <> endobj 112 0 obj <>stream xcd`ab`ddrr v44f!C9w߯5?XW~On&ݘ3#Os~AeQfzFcnjQfrbobIFjnb ZRQZZT9?$H7?%(ъ]?ohF_29 xq^^qq^+/^!W˦M;q*r\,y8La`YAP endstream endobj 899 0 obj 243 endobj 251 0 obj <> endobj 250 0 obj <>stream xYt׶Gh!J5z)-M\^$ f01=ƐA+uW_$03{>seFG _f5Vl۶Ptct￧+H1o6 ޟ0fnP4}<ٸse82+tS^pޮ rJ.m tv9n߸-7Bmqqswq2_, ug@Q66+vlZ)vi*nu5!^[ֆzo]'ٶ>~C߾#]Oߵ` gYYKfK?Qҹ?2oӧ(j5IRLCʉVS fj EMPk$j+C}DmSsɔ=Bm6R󨩔eM}JM)j5N6Q+%5ZJYQ(M >PC35F8j8P)AX?5@-FQ=I eN_5 1齥})p\7a.6Nh#FϧD2#xI[7 b3 끅Ftcp6sQC9k>pxp.dO9QGre +VFm=Z>s1c^}Ʋcvqqm_|ܽF|m] ]huٽN)@tWtq45! i|}j?-4^,fU~<< $[cE=kuCf[XyC~we2k? xB4zIǷDePÌV9) qõjYi@= K,ʁ )8LQSgB ĺov Τ3A7C/ʋCC5d+ riC(RPh,RD q N)L; L`dصq_?{ƒ.ht"; wEsu.2:Gc }J"?q8WCSjS4E״fЉ tȌHU84jj`>]s?ЈҢtit,û6ZDp71sNFч}A'ѷ,XXat=ΐjhI԰F H(1`@O0RLPEFhJt\Dn,G2T߼9Y&Tl6["!oS! Qc7̸ܠhܚ̂E'Η%nCZ5щB;u~M$ N#“px.b#$)^;bݯ[c^luhJ:Q#.'[T*gZB!ÏhoY$Ж,jPkq{L, ʣzc(K+IaFpX%2ER9X4d/X3&!xȋxpbW~ѕoܼl3g-zNJBU9QWO%宕ہiP_ Qt[^dƫQ0&s( $2B[b| .]TX,r@2Q^=)Sst̉/NAOhOv tl1J⼣ݵv$#u=<Y"/dJi^exH9\ AO#֢oyy`քFÑǁA/04`+l/*?lwM9.pҍ k?a݊Unߟ adwP"UW!lxxd4>Jqe#f?–߿|܄r>gVЉjPGPd;Q\GJMi]y܉[CFln4Xl2cİ@+q-t ~^4}-@DČhHx *BȄ,UQo~jE"Ev&,VҸ=tORX̌+z }@e}@ G^kv"븷ֽ{: }`꽓8ttfylqh2gx5hNKvew5hc0K5(rbOMLʍ/<ٳ v58T_*2, #II6>Z! :&R mvovtH W|7hF"7 {*@n 6DjQV[3&S9ER:+pD~X]蚔oca5mB8'WC IAT\S˝:jBnk )]f^-LMSݓ' 5m"=BXީFn_k{c?j'ZysX:˞in8 _1qx64~7z;tTU l2r|]{u }4Oi0lٲ*.92%Ck {lg=>#O` jЉKVfٲGh]mNKyTlċz$ %Jjɷ<6aK4R>(/`\оVNCS >%znks{)[?b)m[n\<i\̀ˡO~Z@Lkuٺк:^2I~]*~{56U@X9g.#lْyyq= ;Qy73Jx#x3{.wqU]u)GK^l+T 9\64=sM#~yaY+Jc3w{Lɓבxfp&_^A7_kP"[U!ǿ_aSܰ8~d港tVqKCY8q-#Y dj23]Vq$YđޫOw>FvO!܃<HU%UD+~G$8wxVނH  .u7[hBH{ioR&DP"ԍ׭&Q=נd:ᰢ̥zN@ZaMMtB5`UPpU"2C9,̅L 4hB!*޿8aCdoHh, LQERtG,=ZU=~LOvؾk=Si<ѬW=AC>Tˉif%%'Qh,(f"+#_/8 t$%uqpޅ 賉 /SJ<Rћ=bStz:& =X%D*S~5' #!z' z56'-YDxj~5τU}@`ڸIL Cl Ex%11# {zt]D+A_$8.-3͞$'1 (>"1<>6UQp8J$ e[GLOzzO뤧p=1u"c]X^]ohLƚ*z%ߖ7ue_A e@>odRnl1p҉'J#R*^Ak+`^UFiy4L $dT(za4f}͵٭wk.&<[*pHBWeJBJỴ$ d=#ۜ4aAp3 ,@MJ6Y%KL #-,oz%2?Q+nQ(Whߌ!Frq͸^2`"9O5`< j4EfE/vn0-% \u>|,bSR~*dDͤCM(lhoBH F83l&}TmpA_3T߆+ оl| DDT!4J92x]Z~?$~ViL8Ϸ6]ţѩ{)w]?!VL<POCmș.) S-)œي]-.1^V^$MFeNj.QLRJg^~qƅIk XkRT,6[*vMK Ϗ:rX?crelBshcЗo|8AX-cmw꡷:%`ύqwϣx:[txB 4 <#<]<UJ1Νݙ +nܲrP-H陔(!Vc^ױTCxk.#E摁)n endstream endobj 900 0 obj 6630 endobj 273 0 obj <> endobj 272 0 obj <>stream xcd`ab`dds utv 14f!Cwݏ?YW~ R wfFF7hʢ gMCKKsԢ<Ē 'G!8?93RO1'G!X!(8,5bs~nAiIjo~JjQ,<.؍2# ~gGI&vXP9FY)-- ݕZ&};UbR)N_0uj$߻b}IuO0y;S%Z'6usT֗UNk"}o~64vWJͭ%3{dI?O2w$\gX*y8e` endstream endobj 901 0 obj 370 endobj 270 0 obj <> endobj 269 0 obj <>stream xYw\Tg־+ &;DIb,(V"vˀ Uz"e ML11nFײ&议9{I6^cs#c02l':Mz _#$_Gr^N>0svƄA89F..t wtg?y`m^!n^^Cmٯވ_ӻKhpXTo[oxè\>/6dP\|W,0okEGY6&kݲ]Ϝ8`dӦx~2V&CČd62+33x2Bf 2qe"f*3Y,f1c5f:Ȭe23q:fryGMVZZؠx 7ľ'mlnA:nxnAڞ;0xOȆ$14ya#0|+lcmoٍFhϡVǙ(|0rp-V+>&N֓T}8-wYrS#m$QA7!L'fL.xcIN2@~٬NHjZ%KvY[aѭgtFrbHF]@ׅ ɠ6 gw/uT lLs(-i[I7(TkQ.(yW[k{=+\:s:b@~kVzm?Ԡ3]aG'9qxi]^ZmRs^w^#q-q]H8’cqj3r³HJ8w<)nOv ǬԽN3 \j Md %+O7=!Zg1!IuJV믵 .L5\glX˪BSlq1ɶ%%,(ج&8} N&ʓ4qJu D <(~gf.F \~ih$+"";$G5x2wr+cBlc%\`x x e3 `!R96{41aA/P|ix|og#rkݝyZ)}T={BWIƑx|=Y[N-^#bZ~&rq8/J ȿj2׺]aQ6EMϙfUOQQ f(F,*rCy|a2̜1 #N©8"Yɓa}u;ʚG*Vzf/FΌk[&7[6rk+1Ӊ=U;Yi:\Ϣ̺!(Dsz#ɏZ?8SzAeZhXV)5?#SWyM>+S{.L]kUjT*Rb6MPx")k:mcfW%f͸ VDVbV[=(acQd4NqM(MMyzVFj2L$W`I@+ԙ e^Md!%P 8$DUFiO&FQp_&&/{nS`ɼ'*uĖvXRt))douF|\)wkPߔvysҫ}uJWG!N G&@z^ܹtI'N) mY[+[ט{'6Ha_~wwZ-]ZG"N"Kd,#~hO0{t@?RXC}}OU@ո"7 Y\֨fޖ`Ci9۝Y\v`4s8Ox&8ѻr#H߄7/1UVa&٥Ƿc8G{xiРMJDsZbԴv/p"r_ .,qLHOQGa=C v^z,N'ly|S}2ogeޓ( C+CD{,8-d(KAj:qˎI)Y4D4}6/O+xQcbkeI`ZZJx]:Բ3aOG;|07t+$ 6כێFW"rkwHG6഻[0i a59å&p珇&(r *a]{TVŶxc:|zLa͛ qbT۫#"ab\]򭕍Eg2NeVR&J*-,氟s7o:CyxOZᅭfߩg>Re/:thkowK9"&qCj߱$85QBP#Et |^0P(@܆i6dm ['k(G)p:/!((~u173L.𕐛!SNІm7ҲL6jP6dspptheC*}VpѠTi(T*$.Bc;M1J}Ƶ W1Prp's5d*GHVBٸ Xw_QH8l6HpMHdB"=y =?qc ;S䚝M>p))ONڥOK+36E2H;z7+aLTV/Ypf yh4Cz 4`$)߂%-0Z/t[xLR Vc>G">u?K!M/l@B"X3Ω]q.G?_6qBv\%ͬõȋ:N]ֳKCVZe/SFcDov&d HA^hXM::sc"pM߿ A_gJO5)jcxCG͙Jd[7$*Oߛ8aT&81<8Uj:Q6TA_1ϰދ0ג$ '߸!z3=GXa-ӈ"ԏ~T+XCWr^KD|'칙'ןk{6Kp,dy?O+)uiz H'M?*b*|sLP)^C\jx KΛOR-Vt6KVR4 ~ȭz+J{v:B4ͨyڧҜOeP}Fx 7RJK1 z2dԂ]zq Po!/*(?vfv.NXmlQ653=SSdbWSTdJ41(:ç8@C 3%R'Eт'qQ O|J,5f%!.8}A;'nFTzU|%ސd6$Qgj#I1a{S{sn6I9):m^;% VJ֑E:>P5wk"c,ZW_aolyeyeYu'Շ%:Ɨ&!/o?v~K M@Xۏ%XmzC#[a0^R| *a[]fѳ,81[m!/0ĕ~TQD ҮO-%5M\clѥoyZ sr+9DN|}hn?,MVi4Iϴ-! 21 7o'?픒)!/ݹ{|~T*iTN6 ubZ Η/)>ݝp)Sa#8՗ e:'ǗYWLtJ^1yaZ: DR1?#Z5l__gcEiN[O{hWb9J~}f&h)jvZG"<~.3(kZ U yiGv?"5V;{N/GS:-3~mÊK>ްs}$ǛW('^+ŏZ+jo۲;Vj@7Yker]Ww}gC&E|^.B ˉS_^Yh56p玸 Oz<³$^\N(p{pegjWs7- qLZw]\AަCtw&APtX{DM4@OjTga><BDqLux}|`23y'J\̭(d&_]Q'$Ąi"{i%Jl߱h-,ߨ@a2"~إT.b(UlI!/='m :;ti@KNsOФͦ_}vqhc6M\gNmn>T#>ڕS ݎ.׹x$hR(LcY? 8du|U֌}M)T7(-@%|;[2AG%wc$Vm8qZ;MB{g`6gn3`Wgҵ\g^Eg<*8o/Sscu,=+UxLh,7Y"CyrO'qohMQ dߗPٶG EzJasFjJО Zd)ISUJFBQIk k "//y/@U|ugf|998&yigjJlkHL^)xár[~'Tj}3C!klc*`ۇ#`2{6)Y 5hh/~1m273/W A]'N?:$o;I׃b ZQضo%Qxڐ1~!5{J|TmΈJ$_L._Drqkle6('Xͬw_~(? @?K o endstream endobj 902 0 obj 6062 endobj 92 0 obj <> endobj 9 0 obj <>/FontBBox[0 -75 184 263]/FontMatrix[1 0 0 1 0 0]/FirstChar 0/LastChar 244/Widths[ 0 0 0 131 0 103 0 75 0 50 0 53 0 0 97 101 66 0 52 0 70 65 0 0 102 81 55 0 0 128 0 104 0 45 0 117 0 107 0 0 61 0 0 137 0 0 147 87 60 92 74 0 0 113 89 0 100 0 108 116 0 0 0 132 0 135 0 105 120 0 106 0 0 0 118 0 0 0 86 0 96 0 0 134 0 0 140 0 146 0 0 72 133 0 0 79 44 0 0 110 0 85 0 119 0 149 0 141 0 0 80 62 0 0 64 0 46 0 77 68 0 39 0 122 0 78 129 43 0 84 125 0 69 0 42 127 0 0 71 63 0 0 38 0 0 111 123 0 36 0 0 0 0 0 0 58 0 114 82 0 0 112 0 0 0 0 0 40 83 0 0 0 0 121 0 91 0 41 88 67 0 126 0 0 0 0 0 0 124 0 0 59 90 136 73 109 0 0 0 0 0 99 0 148 0 57 94 145 0 98 56 76 0 0 0 0 0 0 0 130 0 144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] >> endobj 89 0 obj <> endobj 86 0 obj <> endobj 83 0 obj <> endobj 77 0 obj <> endobj 72 0 obj <> endobj 274 0 obj <> endobj 271 0 obj <> endobj 252 0 obj <> endobj 117 0 obj <> endobj 114 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 903 0000000000 65535 f 0000437121 00000 n 0000561030 00000 n 0000435863 00000 n 0000437169 00000 n 0000413395 00000 n 0000000015 00000 n 0000000386 00000 n 0000559848 00000 n 0000546816 00000 n 0000437238 00000 n 0000437498 00000 n 0000437885 00000 n 0000438171 00000 n 0000438236 00000 n 0000438524 00000 n 0000438589 00000 n 0000438866 00000 n 0000438930 00000 n 0000439176 00000 n 0000439240 00000 n 0000439468 00000 n 0000439532 00000 n 0000439824 00000 n 0000440086 00000 n 0000440150 00000 n 0000440215 00000 n 0000440279 00000 n 0000440576 00000 n 0000440640 00000 n 0000440930 00000 n 0000440994 00000 n 0000441058 00000 n 0000441317 00000 n 0000441564 00000 n 0000441629 00000 n 0000441693 00000 n 0000441757 00000 n 0000442100 00000 n 0000442431 00000 n 0000442496 00000 n 0000442766 00000 n 0000442831 00000 n 0000443190 00000 n 0000443254 00000 n 0000443597 00000 n 0000443662 00000 n 0000444120 00000 n 0000444185 00000 n 0000444487 00000 n 0000444789 00000 n 0000444853 00000 n 0000445127 00000 n 0000445550 00000 n 0000445615 00000 n 0000446028 00000 n 0000446348 00000 n 0000446413 00000 n 0000446477 00000 n 0000446541 00000 n 0000446605 00000 n 0000446669 00000 n 0000446976 00000 n 0000447301 00000 n 0000447366 00000 n 0000447430 00000 n 0000447805 00000 n 0000447870 00000 n 0000448187 00000 n 0000448252 00000 n 0000514719 00000 n 0000514487 00000 n 0000554289 00000 n 0000448317 00000 n 0000448347 00000 n 0000514067 00000 n 0000513853 00000 n 0000553362 00000 n 0000413563 00000 n 0000000405 00000 n 0000002557 00000 n 0000513450 00000 n 0000513242 00000 n 0000552490 00000 n 0000510955 00000 n 0000510698 00000 n 0000551558 00000 n 0000503518 00000 n 0000503093 00000 n 0000550629 00000 n 0000516715 00000 n 0000516176 00000 n 0000545891 00000 n 0000448387 00000 n 0000413707 00000 n 0000002578 00000 n 0000002892 00000 n 0000448463 00000 n 0000448539 00000 n 0000413851 00000 n 0000002912 00000 n 0000004492 00000 n 0000448971 00000 n 0000449314 00000 n 0000449619 00000 n 0000449685 00000 n 0000449987 00000 n 0000450053 00000 n 0000450390 00000 n 0000450456 00000 n 0000450522 00000 n 0000450895 00000 n 0000530985 00000 n 0000530762 00000 n 0000558917 00000 n 0000525597 00000 n 0000525172 00000 n 0000557992 00000 n 0000450961 00000 n 0000414005 00000 n 0000004514 00000 n 0000006607 00000 n 0000451039 00000 n 0000414152 00000 n 0000006629 00000 n 0000008697 00000 n 0000451129 00000 n 0000414299 00000 n 0000008719 00000 n 0000011043 00000 n 0000451219 00000 n 0000414446 00000 n 0000011065 00000 n 0000013009 00000 n 0000451309 00000 n 0000414593 00000 n 0000013031 00000 n 0000015284 00000 n 0000451399 00000 n 0000414740 00000 n 0000015306 00000 n 0000017075 00000 n 0000451489 00000 n 0000414887 00000 n 0000017097 00000 n 0000018274 00000 n 0000451579 00000 n 0000451669 00000 n 0000415034 00000 n 0000018296 00000 n 0000021183 00000 n 0000452064 00000 n 0000452371 00000 n 0000452729 00000 n 0000452795 00000 n 0000453135 00000 n 0000453417 00000 n 0000453725 00000 n 0000453790 00000 n 0000454046 00000 n 0000454111 00000 n 0000454373 00000 n 0000454633 00000 n 0000454699 00000 n 0000454975 00000 n 0000455362 00000 n 0000455428 00000 n 0000455750 00000 n 0000455816 00000 n 0000456159 00000 n 0000456434 00000 n 0000456499 00000 n 0000456565 00000 n 0000456795 00000 n 0000456982 00000 n 0000457047 00000 n 0000457112 00000 n 0000457373 00000 n 0000457637 00000 n 0000457703 00000 n 0000457967 00000 n 0000458032 00000 n 0000458369 00000 n 0000458435 00000 n 0000458679 00000 n 0000458745 00000 n 0000458980 00000 n 0000459046 00000 n 0000459290 00000 n 0000459536 00000 n 0000459601 00000 n 0000459666 00000 n 0000459903 00000 n 0000460157 00000 n 0000460222 00000 n 0000460515 00000 n 0000460580 00000 n 0000460838 00000 n 0000460903 00000 n 0000460968 00000 n 0000461253 00000 n 0000461318 00000 n 0000461626 00000 n 0000461692 00000 n 0000461980 00000 n 0000462045 00000 n 0000462111 00000 n 0000462176 00000 n 0000462511 00000 n 0000462576 00000 n 0000462642 00000 n 0000462936 00000 n 0000463001 00000 n 0000463229 00000 n 0000463294 00000 n 0000463360 00000 n 0000463626 00000 n 0000463871 00000 n 0000463936 00000 n 0000464001 00000 n 0000464276 00000 n 0000415189 00000 n 0000021205 00000 n 0000026514 00000 n 0000464328 00000 n 0000464635 00000 n 0000464700 00000 n 0000464979 00000 n 0000465243 00000 n 0000465309 00000 n 0000465375 00000 n 0000415344 00000 n 0000026536 00000 n 0000030528 00000 n 0000465473 00000 n 0000465732 00000 n 0000465797 00000 n 0000466113 00000 n 0000466451 00000 n 0000466743 00000 n 0000467069 00000 n 0000467366 00000 n 0000467630 00000 n 0000467695 00000 n 0000468039 00000 n 0000468105 00000 n 0000468170 00000 n 0000415499 00000 n 0000030550 00000 n 0000032147 00000 n 0000531892 00000 n 0000531337 00000 n 0000557068 00000 n 0000468268 00000 n 0000415646 00000 n 0000032169 00000 n 0000034006 00000 n 0000468358 00000 n 0000468695 00000 n 0000469019 00000 n 0000469085 00000 n 0000469507 00000 n 0000469811 00000 n 0000470064 00000 n 0000470273 00000 n 0000470536 00000 n 0000470601 00000 n 0000470666 00000 n 0000470980 00000 n 0000539719 00000 n 0000539337 00000 n 0000556136 00000 n 0000538858 00000 n 0000538632 00000 n 0000555211 00000 n 0000471279 00000 n 0000415801 00000 n 0000034028 00000 n 0000036081 00000 n 0000471383 00000 n 0000415948 00000 n 0000036103 00000 n 0000038198 00000 n 0000471486 00000 n 0000416095 00000 n 0000038220 00000 n 0000042639 00000 n 0000471589 00000 n 0000416242 00000 n 0000042661 00000 n 0000046874 00000 n 0000471692 00000 n 0000416389 00000 n 0000046896 00000 n 0000049863 00000 n 0000471808 00000 n 0000416536 00000 n 0000049885 00000 n 0000052380 00000 n 0000471911 00000 n 0000416683 00000 n 0000052402 00000 n 0000055782 00000 n 0000472014 00000 n 0000472300 00000 n 0000416838 00000 n 0000055804 00000 n 0000057071 00000 n 0000472411 00000 n 0000416985 00000 n 0000057093 00000 n 0000059535 00000 n 0000472514 00000 n 0000417132 00000 n 0000059557 00000 n 0000064233 00000 n 0000472617 00000 n 0000417279 00000 n 0000064255 00000 n 0000067263 00000 n 0000472720 00000 n 0000417426 00000 n 0000067285 00000 n 0000070952 00000 n 0000472823 00000 n 0000417573 00000 n 0000070974 00000 n 0000073475 00000 n 0000472913 00000 n 0000417720 00000 n 0000073497 00000 n 0000077815 00000 n 0000473024 00000 n 0000417867 00000 n 0000077837 00000 n 0000079993 00000 n 0000473127 00000 n 0000418014 00000 n 0000080015 00000 n 0000081582 00000 n 0000473230 00000 n 0000473521 00000 n 0000473587 00000 n 0000473869 00000 n 0000473934 00000 n 0000474216 00000 n 0000474281 00000 n 0000474346 00000 n 0000474411 00000 n 0000418169 00000 n 0000081604 00000 n 0000082869 00000 n 0000474522 00000 n 0000418316 00000 n 0000082891 00000 n 0000085439 00000 n 0000474625 00000 n 0000418463 00000 n 0000085461 00000 n 0000087499 00000 n 0000474728 00000 n 0000418610 00000 n 0000087521 00000 n 0000088886 00000 n 0000474844 00000 n 0000418757 00000 n 0000088908 00000 n 0000090180 00000 n 0000474947 00000 n 0000418904 00000 n 0000090202 00000 n 0000092143 00000 n 0000475050 00000 n 0000419051 00000 n 0000092165 00000 n 0000093558 00000 n 0000475153 00000 n 0000419198 00000 n 0000093580 00000 n 0000095277 00000 n 0000475256 00000 n 0000419345 00000 n 0000095299 00000 n 0000098957 00000 n 0000475359 00000 n 0000475648 00000 n 0000475714 00000 n 0000419500 00000 n 0000098979 00000 n 0000102420 00000 n 0000475825 00000 n 0000419647 00000 n 0000102442 00000 n 0000105866 00000 n 0000475941 00000 n 0000419794 00000 n 0000105888 00000 n 0000109570 00000 n 0000476057 00000 n 0000419941 00000 n 0000109592 00000 n 0000113269 00000 n 0000476147 00000 n 0000420088 00000 n 0000113291 00000 n 0000116974 00000 n 0000476250 00000 n 0000420235 00000 n 0000116996 00000 n 0000119122 00000 n 0000476353 00000 n 0000420382 00000 n 0000119144 00000 n 0000121983 00000 n 0000476456 00000 n 0000420529 00000 n 0000122005 00000 n 0000125237 00000 n 0000476559 00000 n 0000420676 00000 n 0000125259 00000 n 0000128342 00000 n 0000476662 00000 n 0000420823 00000 n 0000128364 00000 n 0000132469 00000 n 0000476765 00000 n 0000420970 00000 n 0000132491 00000 n 0000135740 00000 n 0000476855 00000 n 0000477163 00000 n 0000421125 00000 n 0000135762 00000 n 0000138092 00000 n 0000477287 00000 n 0000477540 00000 n 0000421280 00000 n 0000138114 00000 n 0000140565 00000 n 0000477664 00000 n 0000421427 00000 n 0000140587 00000 n 0000143334 00000 n 0000477767 00000 n 0000421574 00000 n 0000143356 00000 n 0000146586 00000 n 0000477870 00000 n 0000421721 00000 n 0000146608 00000 n 0000150490 00000 n 0000477973 00000 n 0000421868 00000 n 0000150512 00000 n 0000154003 00000 n 0000478089 00000 n 0000422015 00000 n 0000154025 00000 n 0000156378 00000 n 0000478192 00000 n 0000422162 00000 n 0000156400 00000 n 0000158482 00000 n 0000478295 00000 n 0000478617 00000 n 0000478877 00000 n 0000422317 00000 n 0000158504 00000 n 0000160198 00000 n 0000478988 00000 n 0000422464 00000 n 0000160220 00000 n 0000163148 00000 n 0000479091 00000 n 0000422611 00000 n 0000163170 00000 n 0000166587 00000 n 0000479194 00000 n 0000422758 00000 n 0000166609 00000 n 0000171808 00000 n 0000479284 00000 n 0000422905 00000 n 0000171830 00000 n 0000175112 00000 n 0000479361 00000 n 0000423052 00000 n 0000175134 00000 n 0000178238 00000 n 0000479464 00000 n 0000423199 00000 n 0000178260 00000 n 0000180394 00000 n 0000479567 00000 n 0000479872 00000 n 0000423354 00000 n 0000180416 00000 n 0000182526 00000 n 0000479983 00000 n 0000423501 00000 n 0000182548 00000 n 0000186245 00000 n 0000480099 00000 n 0000423648 00000 n 0000186267 00000 n 0000189229 00000 n 0000480215 00000 n 0000423795 00000 n 0000189251 00000 n 0000191370 00000 n 0000480331 00000 n 0000480608 00000 n 0000480674 00000 n 0000480845 00000 n 0000423950 00000 n 0000191392 00000 n 0000193554 00000 n 0000480969 00000 n 0000424097 00000 n 0000193576 00000 n 0000198598 00000 n 0000481072 00000 n 0000424244 00000 n 0000198620 00000 n 0000202146 00000 n 0000481162 00000 n 0000424391 00000 n 0000202168 00000 n 0000206478 00000 n 0000481252 00000 n 0000424538 00000 n 0000206500 00000 n 0000212020 00000 n 0000481342 00000 n 0000424685 00000 n 0000212042 00000 n 0000214427 00000 n 0000481432 00000 n 0000424832 00000 n 0000214449 00000 n 0000215989 00000 n 0000481535 00000 n 0000424979 00000 n 0000216011 00000 n 0000219327 00000 n 0000481638 00000 n 0000425126 00000 n 0000219349 00000 n 0000222506 00000 n 0000481741 00000 n 0000425273 00000 n 0000222528 00000 n 0000224099 00000 n 0000481844 00000 n 0000425420 00000 n 0000224121 00000 n 0000225219 00000 n 0000481947 00000 n 0000425567 00000 n 0000225241 00000 n 0000227506 00000 n 0000482050 00000 n 0000425714 00000 n 0000227528 00000 n 0000228941 00000 n 0000482153 00000 n 0000425861 00000 n 0000228963 00000 n 0000230402 00000 n 0000482256 00000 n 0000426008 00000 n 0000230424 00000 n 0000232105 00000 n 0000482359 00000 n 0000482583 00000 n 0000482648 00000 n 0000426163 00000 n 0000232127 00000 n 0000233828 00000 n 0000482759 00000 n 0000426310 00000 n 0000233850 00000 n 0000236446 00000 n 0000482862 00000 n 0000426457 00000 n 0000236468 00000 n 0000239707 00000 n 0000482952 00000 n 0000426604 00000 n 0000239729 00000 n 0000245021 00000 n 0000483055 00000 n 0000426751 00000 n 0000245043 00000 n 0000247165 00000 n 0000483132 00000 n 0000483197 00000 n 0000483263 00000 n 0000426898 00000 n 0000247187 00000 n 0000249885 00000 n 0000483374 00000 n 0000427045 00000 n 0000249907 00000 n 0000252412 00000 n 0000483477 00000 n 0000427192 00000 n 0000252434 00000 n 0000256528 00000 n 0000483580 00000 n 0000427339 00000 n 0000256550 00000 n 0000259352 00000 n 0000483670 00000 n 0000483735 00000 n 0000427486 00000 n 0000259374 00000 n 0000263046 00000 n 0000483846 00000 n 0000483912 00000 n 0000427633 00000 n 0000263068 00000 n 0000265889 00000 n 0000484023 00000 n 0000427780 00000 n 0000265911 00000 n 0000269372 00000 n 0000484126 00000 n 0000427927 00000 n 0000269394 00000 n 0000272104 00000 n 0000484216 00000 n 0000484512 00000 n 0000428082 00000 n 0000272126 00000 n 0000274209 00000 n 0000484623 00000 n 0000484981 00000 n 0000428237 00000 n 0000274231 00000 n 0000277896 00000 n 0000485092 00000 n 0000428384 00000 n 0000277918 00000 n 0000281661 00000 n 0000485182 00000 n 0000428531 00000 n 0000281683 00000 n 0000283778 00000 n 0000485285 00000 n 0000428678 00000 n 0000283800 00000 n 0000287496 00000 n 0000485375 00000 n 0000428825 00000 n 0000287518 00000 n 0000290140 00000 n 0000485465 00000 n 0000428972 00000 n 0000290162 00000 n 0000293178 00000 n 0000485568 00000 n 0000429119 00000 n 0000293200 00000 n 0000296859 00000 n 0000485658 00000 n 0000429266 00000 n 0000296881 00000 n 0000301209 00000 n 0000485761 00000 n 0000429413 00000 n 0000301231 00000 n 0000304504 00000 n 0000485851 00000 n 0000429560 00000 n 0000304526 00000 n 0000308824 00000 n 0000485954 00000 n 0000429707 00000 n 0000308846 00000 n 0000311665 00000 n 0000486057 00000 n 0000429854 00000 n 0000311687 00000 n 0000315452 00000 n 0000486160 00000 n 0000430001 00000 n 0000315474 00000 n 0000319536 00000 n 0000486250 00000 n 0000430148 00000 n 0000319558 00000 n 0000322055 00000 n 0000486353 00000 n 0000430295 00000 n 0000322077 00000 n 0000324758 00000 n 0000486464 00000 n 0000430442 00000 n 0000324780 00000 n 0000326736 00000 n 0000486567 00000 n 0000430589 00000 n 0000326758 00000 n 0000329206 00000 n 0000486670 00000 n 0000430736 00000 n 0000329228 00000 n 0000332203 00000 n 0000486773 00000 n 0000430883 00000 n 0000332225 00000 n 0000335414 00000 n 0000486876 00000 n 0000431030 00000 n 0000335436 00000 n 0000338159 00000 n 0000486979 00000 n 0000431177 00000 n 0000338181 00000 n 0000341438 00000 n 0000487082 00000 n 0000431324 00000 n 0000341460 00000 n 0000344334 00000 n 0000487172 00000 n 0000431471 00000 n 0000344356 00000 n 0000347387 00000 n 0000487275 00000 n 0000431618 00000 n 0000347409 00000 n 0000349346 00000 n 0000487378 00000 n 0000431765 00000 n 0000349368 00000 n 0000349686 00000 n 0000487455 00000 n 0000431912 00000 n 0000349707 00000 n 0000351391 00000 n 0000487532 00000 n 0000487907 00000 n 0000488262 00000 n 0000488566 00000 n 0000488631 00000 n 0000432067 00000 n 0000351413 00000 n 0000352966 00000 n 0000488696 00000 n 0000489006 00000 n 0000489072 00000 n 0000432222 00000 n 0000352988 00000 n 0000356173 00000 n 0000489183 00000 n 0000432369 00000 n 0000356195 00000 n 0000358409 00000 n 0000489273 00000 n 0000489558 00000 n 0000432524 00000 n 0000358431 00000 n 0000361619 00000 n 0000489656 00000 n 0000432671 00000 n 0000361641 00000 n 0000363784 00000 n 0000489754 00000 n 0000489819 00000 n 0000432818 00000 n 0000363806 00000 n 0000365784 00000 n 0000489917 00000 n 0000489982 00000 n 0000490048 00000 n 0000432965 00000 n 0000365806 00000 n 0000369629 00000 n 0000490146 00000 n 0000433112 00000 n 0000369651 00000 n 0000372881 00000 n 0000490244 00000 n 0000490568 00000 n 0000490633 00000 n 0000433267 00000 n 0000372903 00000 n 0000375852 00000 n 0000490731 00000 n 0000490796 00000 n 0000490861 00000 n 0000433414 00000 n 0000375874 00000 n 0000377915 00000 n 0000490959 00000 n 0000433561 00000 n 0000377937 00000 n 0000380239 00000 n 0000491057 00000 n 0000491307 00000 n 0000433716 00000 n 0000380261 00000 n 0000382856 00000 n 0000491405 00000 n 0000433863 00000 n 0000382878 00000 n 0000385577 00000 n 0000491503 00000 n 0000491798 00000 n 0000434018 00000 n 0000385599 00000 n 0000386902 00000 n 0000491896 00000 n 0000492193 00000 n 0000492542 00000 n 0000492804 00000 n 0000493995 00000 n 0000494389 00000 n 0000494853 00000 n 0000494919 00000 n 0000495205 00000 n 0000495240 00000 n 0000434190 00000 n 0000386924 00000 n 0000388454 00000 n 0000495292 00000 n 0000434337 00000 n 0000388476 00000 n 0000391271 00000 n 0000495377 00000 n 0000434484 00000 n 0000391293 00000 n 0000393438 00000 n 0000495462 00000 n 0000434631 00000 n 0000393460 00000 n 0000395360 00000 n 0000495547 00000 n 0000495613 00000 n 0000495952 00000 n 0000496251 00000 n 0000496567 00000 n 0000434786 00000 n 0000395382 00000 n 0000397968 00000 n 0000496608 00000 n 0000496891 00000 n 0000497177 00000 n 0000497441 00000 n 0000434941 00000 n 0000397990 00000 n 0000400464 00000 n 0000497526 00000 n 0000497858 00000 n 0000498082 00000 n 0000435096 00000 n 0000400486 00000 n 0000402899 00000 n 0000498167 00000 n 0000498427 00000 n 0000498734 00000 n 0000499075 00000 n 0000499380 00000 n 0000499703 00000 n 0000499970 00000 n 0000435251 00000 n 0000402921 00000 n 0000405636 00000 n 0000500055 00000 n 0000500371 00000 n 0000500699 00000 n 0000500954 00000 n 0000501239 00000 n 0000501528 00000 n 0000435406 00000 n 0000405658 00000 n 0000408862 00000 n 0000501613 00000 n 0000501972 00000 n 0000502282 00000 n 0000435561 00000 n 0000408884 00000 n 0000411777 00000 n 0000502367 00000 n 0000435708 00000 n 0000411799 00000 n 0000413373 00000 n 0000502444 00000 n 0000502727 00000 n 0000503008 00000 n 0000510676 00000 n 0000513220 00000 n 0000513832 00000 n 0000514466 00000 n 0000516154 00000 n 0000525150 00000 n 0000530740 00000 n 0000531316 00000 n 0000538610 00000 n 0000539316 00000 n 0000545869 00000 n trailer << /Size 903 /Root 1 0 R /Info 2 0 R >> startxref 561080 %%EOF polyml-5.6/documentation/Reference/XWindows.txt000066400000000000000000014576601265146633400220270ustar00rootroot00000000000000 Oc Abstract Hardware Ltd Poly/ML for X Reference Manual Mike Crawley cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 1 Copyright (c) Abstract Hardware Limited 1991, 1994 Copyright (c) 1987 Digital Equipment Corporation Copyright (c) 1987 Massachusetts Institute of Technology All Rights Reserved. Permission to use, copy, modify, and distribute this signature and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notices appear in all copies and that both the copyright notices and this permission notice appear in supporting documentation, and that the names of Digital, MIT and AHL not be used in advertising or publicity pertaining to distribution of the signature and its documentation without specific, written prior permission. Digital, MIT and AHL disclaim all warranties with regard to this signature and its documentation, including all implied warranties of merchantability and fitness, in no event shall Digital, MIT or AHL be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this signature and its documentation. The X Window System is a Trademark of MIT. 2 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Contents 1 Introduction 11 1.1 The ML interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 11 1.2 Naming and calling conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 12 1.4 X and the Garbage Collector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5 X and Persistent Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * 13 2 Function Reference 15 2.1 Colours, Pixels and RGB values . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.1 And, Or, Xor, Not, >>, << . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.2 BlackPixel, WhitePixel . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 15 2.1.3 Pixel, RGB, XColor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 16 2.1.4 XAllocColor, XAllocColorCells, XAllocColorPlanes, XAllocNamedColor, XFreeColors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 17 2.1.5 XLookupColor, XQueryColor, XQueryColors . . . . . . . . . . . . . . . . 19 2.1.6 XParseColor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 20 2.1.7 XStoreColor, XStoreColors, XStoreNamedColor . . . . . . . . . . . . . . 21 2.2 Colormaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 22 2.2.1 DefaultColormap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * 22 2.2.2 DefaultDepth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 22 2.2.3 DisplayCells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 23 2.2.4 VisualClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 23 2.2.5 XCreateColormap, XCopyColormapAndFree, XFreeColormap, XSetWin- dowColormap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 24 3 4 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.2.6 XInstallColormap, XUninstallColormap, XListInstalledColormaps . . . . 25 2.2.7 XSetRGBColormaps, XGetRGBColormaps . . . . . . . . . . . . . . . . . 26 2.3 Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . . @ 2.3.1 XCreateFontCursor, XCreatePixmapCursor, XCreateGlyphCursor . . . . 28 2.3.2 XDefineCursor, XUndefineCursor, NoCursor . . . . . . . . . . . . . . . . 29 2.3.3 XRecolorCursor, XFreeCursor . . . . . . . . . . . . . . . . . . . . . . . . 30 2.4 Display Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 31 2.4.1 AllPlanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 31 2.4.2 BitmapBitOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 31 2.4.3 BitmapPad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 31 2.4.4 BitmapUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 32 2.4.5 ByteOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 32 2.4.6 CellsOfScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 32 2.4.7 ColormapExists, CursorExists, DrawableExists, FontExists, GCExists, Vi- sualExists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 33 2.4.8 ColormapID, CursorID, DrawableID, FontID, GCID, VisualID, Same- Drawable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 33 2.4.9 DefaultVisual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 34 2.4.10 DisplayConnected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * 34 2.4.11 DisplayHeight, DisplayHeightMM, DisplayWidth, DisplayWidthMM . . . 34 2.4.12 DisplayPlanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 35 2.4.13 DisplayString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 35 2.4.14 DoesBackingStore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * 35 2.4.15 DoesSaveUnders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 36 2.4.16 EventMaskOfScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 36 2.4.17 MinCmapsOfScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 36 2.4.18 MaxCmapsOfScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 37 2.4.19 NoColormap, NoCursor, NoDrawable, NoFont, NoVisual, ParentRelative, CopyFromParentDrawable, CopyFromParentVisual, PointerWindow, In- putFocus, PointerRoot . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 37 2.4.20 ProtocolRevision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 37 2.4.21 ProtocolVersion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 38 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 5 2.4.22 RootWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 38 2.4.23 ServerVendor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 38 2.4.24 VendorRelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 39 2.4.25 XQueryBestCursor, XQueryBestSize, XQueryBestStipple, XQueryBest- Tile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . . @ 2.5 Drawing Primitives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 40 2.5.1 XClearArea, XClearWindow . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.5.2 XCopyArea, XCopyPlane . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.5.3 XDrawArc, XDrawArcs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.5.4 XDrawImageString, XDrawImageString16 . . . . . . . . . . . . . . . . . 44 2.5.5 XDrawLine, XDrawLines, XDrawSegments . . . . . . . . . . . . . . . . . 45 2.5.6 XDrawPoint, XDrawPoints . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.5.7 XDrawRectangle, XDrawRectangles . . . . . . . . . . . . . . . . . . . . . 46 2.5.8 XDrawString, XDrawString16 . . . . . . . . . . . . . . . . . . . . . . . . 47 2.5.9 XDrawText, XDrawText16 . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.5.10 XFillArc, XFillArcs, XFillPolygon, XFillRectangle, XFillRectangles . . . 49 2.6 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 51 2.6.1 Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 51 2.6.2 XWindows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 51 2.7 Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 52 2.7.1 IsCursorKey, IsFunctionKey, IsKeypadKey, IsMiscFunctionKey, IsModi- fierKey, IsPFKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 52 2.7.2 ShiftDown, ControlDown . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 2.7.3 XLookupString, NoSymbol . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.7.4 XSelectInput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 54 2.7.5 XSetHandler, NullHandler . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.7.6 XSetInputFocus, XGetInputFocus . . . . . . . . . . . . . . . . . . . . . . 56 2.7.7 XSync, XFlush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 57 2.7.8 XSyncronise, XSynchronize . . . . . . . . . . . . . . . . . . . . . . . . . . 58 2.7.9 XTranslateCoordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 58 2.8 Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . . . @ 6 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.8.1 CharLBearing, CharRBearing, CharWidth, CharAscent, CharDescent, CharAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 59 2.8.2 FSFont, FSDirection, FSMinChar, FSMaxChar, FSMinByte1, FS- MaxByte1, FSAllCharsExist, FSAllCharsExist, FSDefaultChar, FSMin- Bounds, FSMaxBounds, PSPerChar, FSPerChar, FSAscent, FSDescent, FSAscent, FSDescent, FSMinWidth, FSMaxWidth, FSMinHeight, FS- MaxHeight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 59 2.8.3 XListFonts, XListFontsWithInfo . . . . . . . . . . . . . . . . . . . . . . . 60 2.8.4 XLoadFont, XLoadQueryFont, XQueryFont, XFreeFont, XUnloadFont . 61 2.8.5 XSetFontPath, XGetFontPath . . . . . . . . . . . . . . . . . . . . . . . . 64 2.8.6 XTextExtents, XTextExtents16 . . . . . . . . . . . . . . . . . . . . . . . 64 2.8.7 XTextWidth, XTextWidth16 . . . . . . . . . . . . . . . . . . . . . . . . . 65 2.9 Geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 66 2.9.1 AddPoint, SubtractPoint . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 2.9.2 Inside, Overlap, Within, LeftOf, RightOf, AboveOf, BelowOf, Horizon- tallyAbutting, VerticallyAbutting . . . . . . . . . . . . . . . . . . . . . . 66 2.9.3 Intersection, Union, Section . . . . . . . . . . . . . . . . . . . . . . . . . * *67 2.9.4 Left, Right, Top, Bottom, Width, Height, TopLeft, TopRight, Bottom- Left, BottomRight, XRectangle, Area, Rect, DestructRect, DestructArea, empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 67 2.9.5 MakeRect, SplitRect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 68 2.9.6 NegativePoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 69 2.9.7 OutsetRect, OffsetRect, IncludePoint . . . . . . . . . . . . . . . . . . . . 69 2.9.8 Reflect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . . 7@ 2.9.9 XPoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 70 2.10 GC - Graphics Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 70 2.10.1 DefaultGC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 70 2.10.2 XCreateGC, XChangeGC, XFreeGC . . . . . . . . . . . . . . . . . . . . . 71 2.10.3 XSetArcMode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 76 2.10.4 XSetBackground . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 76 2.10.5 XSetClipMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 77 2.10.6 XSetClipOrigin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 77 2.10.7 XSetClipRectangles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 77 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 7 2.10.8 XSetColours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 78 2.10.9 XSetDashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 79 2.10.10 XSetFillRule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 79 2.10.11 XSetFillStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 80 2.10.12 XSetFont . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 80 2.10.13 XSetForeground . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 81 2.10.14 XSetFunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 81 2.10.15 XSetGraphicsExposures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 2.10.16 XSetLineAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * 82 2.10.17 XSetPlaneMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 82 2.10.18 XSetState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 83 2.10.19 XSetStipple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 83 2.10.20 XSetSubwindowMode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 2.10.21 XSetTile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 84 2.10.22 XSetTSOrigin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 85 2.11 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . . @ 2.11.1 ImageByteOrder, ImageDepth, ImageSize . . . . . . . . . . . . . . . . . . 85 2.11.2 VisualRedMask, VisualGreenMask, VisualBlueMask . . . . . . . . . . . . 86 2.11.3 XCreateImage, XGetPixel, XPutPixel, XSubImage, XAddPixel . . . . . 86 2.11.4 XPutImage, XGetImage, XGetSubImage . . . . . . . . . . . . . . . . . . 88 2.12 Properties and Selections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 90 2.12.1 XDeleteProperty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 90 2.12.2 XInternAtom, XGetAtomName . . . . . . . . . . . . . . . . . . . . . . . 90 2.12.3 XSetProperty, XGetTextProperty . . . . . . . . . . . . . . . . . . . . . . 91 2.12.4 XSetSelectionOwner, XGetSelectionOwner, XConvertSelection, XSendSe- lectionNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 92 2.13 Screen Saver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 94 2.13.1 XSetScreenSaver, XForceScreenSaver, XActivateScreenSaver, XResetScreenSaver, XGetScreenSaver . . . . . . . . . . . . . . . . . . . . 94 2.14 Tiles, Stipples, Bitmaps and Pixmaps . . . . . . . . . . . . . . . . . . . . . . . . 95 2.14.1 XCreatePixmap, XFreePixmap . . . . . . . . . . . . . . . . . . . . . . . . 95 8 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.14.2 XReadBitmapFile, XWriteBitmapFile, XCreatePixmapFromBitmapData, XCreateBitmapFromData . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 2.15 User Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 98 2.15.1 XAutoRepeatOn, XAutoRepeatOff, XBell, XQueryKeymap . . . . . . . 98 2.15.2 XGetDefault . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 98 2.16 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 99 2.16.1 XCreateWindow, XCreateSimpleWindow . . . . . . . . . . . . . . . . . . 99 2.16.2 XDestroyWindow, XDestroySubwindows . . . . . . . . . . . . . . . . . . 101 2.16.3 XGetGeometry, XGetWindowAttributes . . . . . . . . . . . . . . . . . . 101 2.16.4 XGetWindowRoot, XGetWindowPosition, XGetWindowSize, XGetWin- dowBorderWidth, XGetWindowDepth, XGetWindowParent, XGetWin- dowChildren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 104 2.16.5 XChangeWindowAttributes, XSetWindowBackground, XSetWindow- BackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap . . 104 2.16.6 XConfigureWindow, XMoveWindow, XResizeWindow, XMoveResizeWin- dow, XSetWindowBorderWidth . . . . . . . . . . . . . . . . . . . . . . . 106 2.16.7 XMapWindow, XMapRaised, XMapSubwindows . . . . . . . . . . . . . . 108 2.16.8 XQueryPointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 109 2.16.9 XQueryTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 110 2.16.10 XRaiseWindow, XLowerWindow, XCirculateSubwindows, XCirculateSub- windowsDown, XCirculateSubwindowsUp, XRestackWindows . . . . . . 110 2.16.11 XReparentWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1* *12 2.16.12 XUnmapWindow, XUnmapSubwindows . . . . . . . . . . . . . . . . . . . 113 2.17 Window Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 113 2.17.1 XSetIconSizes, XGetIconSizes . . . . . . . . . . . . . . . . . . . . . . . . 113 2.17.2 XSetTransientForHint, XGetTransientForHint . . . . . . . . . . . . . . . 114 2.17.3 XSetWMClass, XGetWMClass . . . . . . . . . . . . . . . . . . . . . . . . 114 2.17.4 XSetWMClientMachine, XGetWMClientMachine . . . . . . . . . . . . . 115 2.17.5 XSetWMColormapWindows, XGetWMColormapWindows . . . . . . . . 116 2.17.6 XSetWMCommand, XGetWMCommand . . . . . . . . . . . . . . . . . . 116 2.17.7 XSetWMHints, XGetWMHints . . . . . . . . . . . . . . . . . . . . . . . . 117 2.17.8 XSetWMIconName, XGetWMIconName . . . . . . . . . . . . . . . . . . 118 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 9 2.17.9 XSetWMName, XGetWMName . . . . . . . . . . . . . . . . . . . . . . . 119 2.17.10 XSetWMProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *119 2.17.11 XSetWMSizeHints, XGetWMSizeHints, XSetWMNormalHints, XGetWMNormalHints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 2.17.12 XWMGeometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * 122 3 Event Reference 125 3.1 XEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . . 125 3.2 ButtonPress, ButtonRelease, KeyPress, KeyRelease, MotionNotify . . . . . . . . 126 3.3 CirculateNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 128 3.4 CirculateRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 128 3.5 ColormapNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 128 3.6 ConfigureNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 129 3.7 ConfigureRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . 130 3.8 CreateNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 130 3.9 DeleteRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 130 3.10 DestroyNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 131 3.11 EnterNotify, LeaveNotify, NotifyMode, NotifyDetail . . . . . . . . . . . . . . . . 131 3.12 Expose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . . 13@ 3.13 FocusIn, FocusOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . 133 3.14 GraphicsExpose, NoExpose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 3.15 GravityNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 134 3.16 KeymapNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . 134 3.17 MapNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 135 3.18 MapRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 135 3.19 Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . . 135 3.20 ReparentNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 135 3.21 ResizeRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 136 3.22 SelectionClear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 136 3.23 SelectionNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 137 3.24 SelectionRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 137 10 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 3.25 UnmapNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 137 3.26 VisibilityNotify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 138 4 Protocol Error Messages 139 4.1 BadAccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 139 4.2 BadAlloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 139 4.3 BadAtom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 139 4.4 BadColor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 139 4.5 BadCursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . . 140 4.6 BadDrawable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 140 4.7 BadFont . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 140 4.8 BadGC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 140 4.9 BadImplementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. 140 4.10 BadIDChoice, BadLength . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.11 BadMatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * *. . . 141 4.12 BadPixmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 142 4.13 BadRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . 142 4.14 BadValue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .* * . . . 142 4.15 BadWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * * . . 142 Chapter 1 Introduction 1.1 The ML interface We have implemented an ML interface to Xlib, the industry standard C interface for X at the lowest level, and which is widely used as the basis for many toolkits. We provide all the major function groups, so that this interface can be used to implement fully functional complex applications. We also provide a set of geometric functions for handling points and rectangles, and a set of functions for performing logical operations on plane masks and pixel values. Xlib is now widely documented, with many good reference and programming manuals available. We provide our version of the Xlib reference manual with ML signatures and types, and a more functional style to the programming interface. We provide ML example programs to show the functionality of the ML interface to Xlib. These examples range from simple line drawing applications through to colour examples and a mini text editor showing how to program with selections. The full signatures of the structures are also provided so that modules may be written for separate compilation. Because of the great similarity between our interface and the original Xlib, experienced X pro- grammers can use the skills they have already developed with very few changes. 1.2 Naming and calling conventions We have kept to the Xlib naming conventions as closely as possible. This means that standard Xlib documentation can be used along with our reference manual. Types Drawable, Cursor Functions XDrawLines, XSetWindowColormap, XLoadQueryFont Constructors FillTiled, JoinMiter, AllowExposures Constants XA__PRIMARY, XA__STRING Labels borderWidth 11 12 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Datatypes are used where possible so that arguments are strongly typed and pattern matching may be used for returned values, this is especially useful for pattern matching the different sub- types of events. Abstypes are only used for the X resource types which have no meaningful textual representation. The functions have been made more functional. Where an Xlib function modified its arguments, this has been changed so that the function returns new, modified copies of the arguments. Where values were passed in partially filled-in structures with OR-ed bit masks, now the programmer uses constructors to make the list of values. Similarly, return values of this type are now lists of constructed values. The majority of X applications use a single display and single screen. Typically, they connect to the display when initialising and then pass the display parameter into every Xlib call from then on. In release 1 we connect to the display when initialising and implicitly pass the display and screen parameters to all Xlib functions. This reduces the number of parameters that have to be supplied and simplifies the signature. Another way of looking at this is to say that we have already called XOpenDisplay for the user and have partially applied all the Xlib functions with that display. In subsequent releases every X resource value will have its display parameter implicitly built in, a display connection function will be provided, and the types of the other Xlib functions will be unchanged. 1.3 Event Handling We provide an alternative event handling scheme. In normal Xlib programs written in C the user calls XNextEvent and then has to work out which window the event is for. This soon gets unwieldy as the number of windows increases, and is very difficult to use when interfacing with toolkits of window functions. In many X toolkits each newly created window registers a function with an event handler, then events for that window are passed directly to the window function when the event reaches the head of the event queue. We implement a similar scheme. When a window is created it is initially unhandled. It can be used for drawing on, but it will not process any events. An ML function can then be registered for that window, and an initial value supplied. The registered function will transform the value to a new value every time an event arrives for that window. In other words, a functional state machine is set up for each window. We also implement strongly typed message passing between windows, and extra event types for decoding multi-click events such as double clicking, and for implementing millisecond-resolution timer events. In more detail, we have a single Poly/ML process that handles events arriving down the event queue. It reads each event in turn, finds the window, the window function and the window state, and applies the event and state to the function. This returns a new state, which replaces the original state. Because only one process handles the events, we guarantee that no other window function can run at the same time. Any messages 'sent' by this window function are queued up and processed when this event has finished, before the next event from the server. If the window function raises an exception, instead of returning a new state, then the current state is left unchanged, and the exception is reported at the terminal. In this way all events are handled in turn in a predictable order, and in the same way that C event handlers work. The Poly/ML top level shell process is still available for debugging and control. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 13 If a window has an operation that takes a long time to complete, then the programmer can use Poly/ML processes to do the computations 'in the background' and 'send' the result as a message to the window for display. However, the use of processes in this way is discouraged as they are not standard. If a window function loops, then all other windows will freeze. Since the Poly/ML top level shell is available the user can type ^C followed by 'f' to raise Interrupt in that window function. 1.4 X and the Garbage Collector The garbage collector in Poly/ML can detect when a value is no longer referenced, and can perform an action in this circumstance. This is already done with streams. If you create an instream or an outstream and forget to close it with close_in or close_out, then it would hang on to its Unix file descriptor for the rest of the session. File descriptors are considered a precious resource in Unix, you are only allowed to have a small number of files open at any one time, so the garbage collector detects out of scope streams and closes the associated file descriptor. In X there are several types of precious resources. These include Windows, GCs, Pixmaps, Fonts and Cursors. Functions are provided so that the user can explicitly reclaim the resources used by these types of object, but a similar problem occurs. If a resource is not explicitly reclaimed, and allowed to go out of scope then it can never be reclaimed by the user. The garbage collector steps in and automatically cleans up. The table below summarises the effect. Window close the window with XDestroyWindow GC free the GC with XFreeGC Pixmap free the Pixmap with XFreePixmap Font unload the Font with XUnloadFont Cursor free the Cursor with XFreeCursor XColor free the XColor with XFreeColors Colormap free the Colormap with XFreeColormap Xlib includes a function called XFree which is used to free the storage required by the return types of several of its functions. This is not required in the ML interface because the garbage collector performs this operation. 1.5 X and Persistent Store In Poly/ML, persistent store is used to carry all ML values across to the next ML session with no change, except for a couple of cases. If you have a stream open when you save your environment, and then you attempt to read or write that stream in the next session, then Poly/ML will raise the Io exception. 14 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 In X, many values such as Windows and Pixmaps are volatile, they can only be used in the session that created them. If you attempt to draw in a window that you have brought across from an earlier session then Poly/ML will raise an exception. To make things cleaner we provide the following functions on volatile objects. val DrawableExists: Drawable -> bool ; val GCExists: GC -> bool ; val FontExists: Font -> bool ; val CursorExists: Cursor -> bool ; val PixelExists: int -> bool ; and so on. These are useful for restarting applications. If an application loads fonts, generates some bitmaps, and creates some windows to work in, and then gets saved to persistent store, then when the next session is started the application can detect that its resources have evaporated and can recreate them only when needed. Chapter 2 Function Reference 2.1 Colours, Pixels and RGB values 2.1.1 And, Or, Xor, Not, >>, << Types: infix And Or Xor >> << val Not: int -> int val And: int * int -> int val Or: int * int -> int val Xor: int * int -> int val >> : int * int -> int val << : int * int -> int Description: These functions provide useful arithmetic operations on ints representing pixel values and plane masks, which, in X, are unsigned 32-bit quantities. The least significant bits of these quantities are on the right, and the most significant bits are on the left. And, Or and Xor perform bitwise boolean functions. Not performs bitwise negation, so Not 0 = 4294967295 . a >> b returns a shifted b bits to the right, where b is not negative. a << b returns a shifted b bits to the left, where b is not negative. If negative values, or values greater than 4294967295 are passed to these functions then exception Range is raised. 2.1.2 BlackPixel, WhitePixel Types: val BlackPixel: unit -> int val WhitePixel: unit -> int 15 16 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Syntax: val black = BlackPixel() ; val white = WhitePixel() ; Description: The BlackPixel function returns the black pixel value for the screen. The WhitePixel function returns the white pixel value for the screen. 2.1.3 Pixel, RGB, XColor Types: val Pixel: XColor -> int val RGB: XColor -> (int * int * int) Syntax: val pixel = Pixel colour ; val (red,green,blue) = RGB colour ; Arguments: pixel Returns the pixel field of the XColor structure red Returns the red, green and blue components of the XColor structure as num- bers in the range 0..65535. Argument Type: datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } Description: The red, green, and blue values are scaled between 0 and 65535. Full brightness in a colour is a value of 65535 independent of the number of bits actually used in the display hardware. Half brightness in a colour is a value of 32767, and off is 0. This representation gives uniform results for colour values across different screens. In some functions, the doRed, doGreen and doBlue fields control which of the red, green, and blue members are used. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 17 2.1.4 XAllocColor, XAllocColorCells, XAllocColorPlanes, XAllocNamedColor, XFreeColors Types: val XAllocColor: Colormap -> XColor -> XColor val XAllocNamedColor: Colormap -> string -> (XColor * XColor) val XFreeColors: Colormap -> int list -> int -> unit val XAllocColorCells: Colormap -> bool -> int -> int -> (int list * int list) val XAllocColorPlanes: Colormap -> bool -> int -> int -> int -> int -> (int list * int * int * int) Syntax: val real = XAllocColor cmap colour ; val (real,desired) = XAllocNamedColor cmap name ; XFreeColors cmap pixels planes ; val (masks,basePixels) = XAllocColorCells cmap contig nplanes ncolours ; val (basePixels, redMask, greenMask, blueMask) = XAllocColorPlanes cmap contig ncolours nreds ngreens nblues ; Arguments: name Specifies the colour name string (for example, red) whose colour defini- tion structure you want returned. cmap Specifies the colormap. contig Specifies a bool that indicates whether the planes must be contiguous. ncolours Specifies the number of pixel values that are to be returned. nplanes Specifies the number of plane masks that are to be returned. nreds Specifies the number of red planes. The value you pass must be nonneg- ative. ngreens Specifies the number of green planes. The value you pass must be non- negative. nblues Specifies the number of blue planes. The value you pass must be non- negative. pixels Specifies a list of pixel values. planes Specifies the planes you want to free. colour Specifies the values actually used in the colormap. desired Returns the exact RGB values. 18 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 real Returns the closest RGB values provided by the hardware. masks Returns the list of plane masks basePixels Returns the list of base pixels redMask Returns the red mask greenMask Returns the green mask blueMask Returns the blue mask Argument Type: datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } Description: The XAllocColor function allocates a read-only colormap entry corresponding to the closest RGB values supported by the hardware. XAllocColor returns the pixel value of the colour closest to the specified RGB elements supported by the hardware and returns the RGB values actually used. The corresponding colormap cell is read-only. If XAllocColor fails then exception XWindows is raised with "XAllocColor failed" . Multiple clients that request the same effective RGB values can be assigned the same read-only entry, thus, allowing entries to be shared. When the last client deallocates a shared cell, it is deallocated. XAllocColor does not use or affect the flags in the XColor structure. The XAllocNamedColor function looks up the named colour with respect to the screen that is associated with the specified colormap. It returns both the exact database definition and the closest colour supported by the screen. The allocated colour cell is read-only. You should use the ISO Latin-1 encoding; uppercase and lowercase do not matter. If XAllocNamedColor fails then exception XWindows is raised with "XAllocNamedColor failed" . The XAllocColorCells function allocates read/write colour cells. The number of colours must be positive and the number of planes nonnegative, otherwise exception Range is raised or a BadValue error results. If ncolours and nplanes are requested, then ncolours pixels and nplanes plane masks are returned. No mask will have any bits set to 1 in common with any other mask or with any of the pixels. By ORing together each pixel with zero or more masks, ncolours * 2 ^ nplanes distinct pixels can be produced. All of these are allocated writable by the request. For GrayScale or PseudoColor, each mask has exactly one bit set to 1. For DirectColor, each has exactly three bits set to 1. If contig is true and if all masks are ORed together, a single contiguous set of bits set to 1 will be formed for GrayScale or PseudoColor and three contiguous sets of bits set to 1 (one within each pixel subfield) for DirectColor. The RGB values of the allocated entries are undefined. If XAllocColorCells fails then exception XWindows is raised with "XAllocColorCells failed" . The XAllocColorPlanes function allocates read/write colour cells. The specified ncolours must be positive; and nreds, ngreens, and nblues must be nonnegative, other- wise exception Range is raised or a BadValue error results. If ncolours colours, nreds reds, ngreens greens, and nblues blues are requested, ncolours pixels are returned; and the masks have nreds, ngreens, and nblues bits set to 1, respectively. If contig is true, each cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 19 mask will have a contiguous set of bits set to 1. No mask will have any bits set to 1 in common with any other mask or with any of the pixels. For DirectColor, each mask will lie within the corresponding pixel subfield. By ORing together subsets of masks with each pixel value, ncolours * 2 ^ (nreds+ngreens+nblues) distinct pixel values can be pro- duced. All of these are allocated by the request. However, in the colormap, there are only ncolours * 2 ^ nreds independent red entries, ncolours * 2 ^ ngreens independent green entries, and ncolours * 2 ^ nblues independent blue entries. This is true even for PseudoColor. When the colormap entry of a pixel value is changed (using XStoreCol- ors, XStoreColor, or XStoreNamedColor), the pixel is decomposed according to the masks, and the corresponding independent entries are updated. If XAllocColorPlanes fails then exception XWindows is raised with "XAllocColorPlanes failed" . The XFreeColors function frees the cells represented by pixels whose values are in the pixels list. The planes argument should not have any bits set to 1 in common with any of the pixels. The set of all pixels is produced by ORing together subsets of the planes argument with the pixels. The request frees all of these pixels that were allocated by the client (using XAllocColor, XAllocNamedColor, XAllocColorCells, and XAllocColorPlanes). Note that freeing an individual pixel obtained from XAllocColorPlanes may not actually allow it to be reused until all of its related pixels are also freed. Similarly, a read-only entry is not actually freed until it has been freed by all clients, and if a client allocates the same read-only entry multiple times, it must free the entry that many times before the entry is actually freed. All specified pixels that are allocated by the client in the colormap are freed, even if one or more pixels produce an error. If a specified pixel is not a valid index into the colormap, a BadValue error results. If a specified pixel is not allocated by the client (that is, is unallocated or is only allocated by another client), a BadAccess error results. If more than one pixel is in error, the one that gets reported is arbitrary. 2.1.5 XLookupColor, XQueryColor, XQueryColors Types: val XLookupColor: Colormap -> string -> (XColor * XColor) val XQueryColor: Colormap -> int -> XColor val XQueryColors: Colormap -> int list -> XColor list Syntax: val (desired,real) = XLookupColor cmap name ; val colour = XQueryColor cmap pixel ; val colours = XQueryColors cmap pixels ; Arguments: colormap Specifies the colormap. name Specifies the colour name string (for example, red) whose colour definition structure you want returned. colour Returns the RGB values for the specified pixel. colours Returns a list of colour definition structures for the pixel specified. desired Returns the exact RGB values. 20 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 real Returns the closest RGB values provided by the hardware. Description: The XLookupColor function looks up the string name of a colour with respect to the screen associated with the specified colormap. It returns both the exact colour values and the closest values provided by the screen with respect to the visual type of the specified colormap. You should use the ISO Latin-1 encoding; uppercase and lowercase do not matter. XLookupColor raises exception XWindows with "XLookupColor failed" if the name did not exist. The XQueryColor function returns the hardware-specific RGB values for the specified pixel and sets the DoRed, DoGreen, and DoBlue flags. The XQueryColors function returns the RGB values for each pixel in the list and sets the DoRed, DoGreen, and DoBlue flags. 2.1.6 XParseColor Types: val XParseColor: Colormap -> string -> XColor Syntax: val colour = XParseColor cmap name ; Arguments: cmap Specifies the colormap. name Specifies the colour name string; case is ignored. colour Returns the exact colour value for later use and sets the doRed, doGreen, and doBlue flags. Argument Type: datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } Description: The XParseColor function provides a simple way to create a standard user interface to colour. It takes a string specification of a colour, typically from a command line or XGetDefault option, and returns the corresponding red, green, and blue values that are suitable for a subsequent call to XAllocColor or XStoreColor. The colour can be specified either as a colour name (as in XAllocNamedColor) or as an initial sharp sign character followed by a numeric specification, in one of the following formats: #RGB (4 bits each) cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 21 #RRGGBB (8 bits each) #RRRGGGBBB (12 bits each) #RRRRGGGGBBBB (16 bits each) The R, G, and B represent single hexadecimal digits (both uppercase and lowercase). When fewer than 16 bits each are specified, they represent the most-significant bits of the value. For example, #3a7 is the same as #3000a0007000. The colormap is used only to determine which screen to look up the colour on. For example, you can use the screen's default colormap. If the initial character is a sharp sign but the string otherwise fails to fit the above formats or if the initial character is not a sharp sign and the named colour does not exist in the server's database, then exception XWindows is raised with "XParseColor failed" . 2.1.7 XStoreColor, XStoreColors, XStoreNamedColor Types: val XStoreColor: Colormap -> XColor -> unit val XStoreColors: Colormap -> XColor list -> unit val XStoreNamedColor: Colormap -> string -> int -> (bool * bool * bool) -> unit Syntax: XStoreColor cmap colour ; XStoreColors cmap colours ; XStoreNamedColor cmap name pixel (doRed,doGreen,doBlue) ; Arguments: colour Specifies the pixel and RGB values colours Specifies a list of pixel and RGB values cmap Specifies the colormap. doRed Specifies if the red component is set doGreen Specifies if the green component is set doBlue Specifies if the blue component is set. name Name of colour to copy RGB values from. pixel Specifies the entry in the colormap. Argument Type: datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } 22 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The XStoreColors function changes the colormap entries of the pixel values specified in the pixel members of the XColor structures. You specify which colour components are to be changed by setting doRed, doGreen, and/or doBlue in the XColor structures. If the colormap is an installed map for its screen, the changes are visible immediately. XStoreColors changes the specified pixels if they are allocated writable in the colormap by any client, even if one or more pixels generates an error. If a specified pixel is not a valid index into the colormap, a BadValue error results. If a specified pixel either is unallocated or is allocated read-only, a BadAccess error results. If more than one pixel is in error, the one that gets reported is arbitrary. The XStoreColor function changes the colormap entry of the pixel value specified in the pixel member of the XColor structure. You specified this value in the pixel member of the XColor structure. This pixel value must be a read/write cell and a valid index into the colormap. If a specified pixel is not a valid index into the colormap, a BadValue error results. XStoreColor also changes the red, green, and/or blue colour components. You specify which colour components are to be changed by setting doRed, doGreen, and/or doBlue in the XColor structure. If the colormap is an installed map for its screen, the changes are visible immediately. The XStoreNamedColor function looks up the named colour with respect to the screen associated with the colormap and stores the result in the specified colormap. The pixel argument determines the entry in the colormap. The booleans doRed, doGreen, and doBlue determine which of the red, green, and blue components are set. If the specified pixel is not a valid index into the colormap, a BadValue error results. If the specified pixel either is unallocated or is allocated read-only, a BadAccess error results. You should use the ISO Latin-1 encoding; uppercase and lowercase do not matter. 2.2 Colormaps 2.2.1 DefaultColormap Types: val DefaultColormap: unit -> Colormap Syntax: val cmap = DefaultColormap() ; Description: The DefaultColormap function returns the default colormap for allocation on the screen. 2.2.2 DefaultDepth Types: val DefaultDepth: unit -> int cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 23 Syntax: val depth = DefaultDepth() ; Description: The DefaultDepth function returns the depth (number of planes) of the default root window for the screen. 2.2.3 DisplayCells Types: val DisplayCells: unit -> int Syntax: val cells = DisplayCells() ; Description: The DisplayCells function returns the number of entries in the default colormap. 2.2.4 VisualClass Types: val VisualClass: Visual -> VisualClass Syntax: val class = VisualClass visual ; Arguments: visual Specifies the visual. class Returns the class from the visual. Argument Type: datatype VisualClass = StaticGray | GrayScale | StaticColor | PseudoColor | TrueColor | DirectColor Description: Returns the visual class from the specified visual. 24 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.2.5 XCreateColormap, XCopyColormapAndFree, XFreeColormap, XSetWindowColormap Types: val XCreateColormap: Drawable -> Visual -> AllocType -> Colormap val XCopyColormapAndFree: Colormap -> Colormap val XFreeColormap: Colormap -> unit val XSetWindowColormap: Drawable -> Colormap -> unit Syntax: val cmap = XCreateColormap w visual alloc ; val copy = XCopyColormapAndFree cmap ; XFreeColormap cmap ; XSetWindowColormap w cmap ; Arguments: w Specifies the window visual Specifies a visual type supported on the screen. If the visual type is not one supported by the screen, a BadMatch error results. alloc Specifies the colormap entries to be allocated. You can pass AllocNone or AllocAll. cmap Specifies the colormap. copy Returns a copy of the colormap. Argument Type: datatype AllocType = AllocNone | AllocAll datatype VisualClass = StaticGray | GrayScale | StaticColor | PseudoColor | TrueColor | DirectColor datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } Argument Description: The red, green, and blue values are scaled between 0 and 65535. Full brightness in a colour is a value of 65535 independent of the number of bits actually used in the display hardware. Half brightness in a colour is a value of 32767, and off is 0. This representation gives uniform results for colour values across different screens. In some functions, the doRed, doGreen and doBlue fields control which of the red, green, and blue members are used. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 25 Description: The XCreateColormap function creates a colormap of the specified visual type for the screen on which the specified window resides and returns the colormap associated with it. Note that the specified window is only used to determine the screen. The initial values of the colormap entries are undefined for the visual classes GrayScale, PseudoColor, and DirectColor. For StaticGray, StaticColor, and TrueColor, the entries have defined values, but those values are specific to the visual and are not defined by X. For StaticGray, StaticColor, and TrueColor, alloc must be AllocNone, or a BadMatch error results. For the other visual classes, if alloc is AllocNone, the colormap initially has no allocated entries, and clients can allocate them. If alloc is AllocAll, the entire colormap is allocated writable. The initial values of all allocated entries are undefined. For GrayScale and PseudoColor, the effect is as if an XAllocColorCells call returned all pixel values from zero to N - 1, where N is the colormap entries value in the specified visual. For DirectColor, the effect is as if an XAllocColorPlanes call returned a pixel value of zero and redMask, greenMask, and blueMask values containing the same bits as the corresponding masks in the specified visual. However, in all cases, none of these entries can be freed by using XFreeColors. The XCopyColormapAndFree function creates a colormap of the same visual type and for the same screen as the specified colormap and returns the new colormap. It also moves all of the client's existing allocation from the specified colormap to the new colormap with their colour values intact and their read-only or writable characteristics intact and frees those entries in the specified colormap. Color values in other entries in the new colormap are undefined. If the specified colormap was created by the client with alloc set to AllocAll, the new colormap is also created with AllocAll, all colour values for all entries are copied from the specified colormap, and then all entries in the specified colormap are freed. If the specified colormap was not created by the client with AllocAll, the allocations to be moved are all those pixels and planes that have been allocated by the client using XAllocColor, XAllocNamedColor, XAllocColorCells, or XAllocColorPlanes and that have not been freed since they were allocated. The XFreeColormap function deletes the association between the colormap resource in the server and the ML Colormap value. However, this function has no effect on the default colormap for a screen. If the specified colormap is an installed map for a screen, it is uninstalled (see XUninstallColormap). If the specified colormap is de- fined as the colormap for a window (by XCreateWindow, XSetWindowColormap, or XChangeWindowAttributes), XFreeColormap changes the colormap associated with the window to NoColormap and generates a ColormapNotify event. X does not define the colours displayed for a window with a colormap of NoColormap. The XSetWindowColormap function sets the specified colormap of the specified win- dow. The colormap must have the same visual type as the window, or a BadMatch error results. 2.2.6 XInstallColormap, XUninstallColormap, XListInstalledColormaps Types: val XInstallColormap: Colormap -> unit val XListInstalledColormaps: Drawable -> Colormap list val XUninstallColormap: Colormap -> unit 26 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Syntax: XInstallColormap cmap ; XUninstallColormap cmap ; val cmaps = XListInstalledColormaps w ; Arguments: cmap Specifies the colormap. w Specifies the window that determines the screen. Description: The XInstallColormap function installs the specified colormap for its associated screen. All windows associated with this colormap immediately display with true colours. You associated the windows with this colormap when you created them by calling XCre- ateWindow, XCreateSimpleWindow, XChangeWindowAttributes, or XSetWin- dowColormap. If the specified colormap is not already an installed colormap, the X server generates a ColormapNotify event on each window that has that colormap. In addition, for every other colormap that is installed as a result of a call to XInstallColormap, the X server generates a ColormapNotify event on each window that has that colormap. The XUninstallColormap function removes the specified colormap from the required list for its screen. As a result, the specified colormap might be uninstalled, and the X server might implicitly install or uninstall additional colormaps. Which colormaps get installed or uninstalled is server-dependent except that the required list must remain installed. If the specified colormap becomes uninstalled, the X server generates a ColormapNotify event on each window that has that colormap. In addition, for every other colormap that is installed or uninstalled as a result of a call to XUninstallColormap, the X server generates a ColormapNotify event on each window that has that colormap. The XListInstalledColormaps function returns a list of the currently installed col- ormaps for the screen of the specified window. The order of the colormaps in the list is not significant and is no explicit indication of the required list. If XListInstalledCol- ormaps fails then exception XWindows is raised with "XListInstalledColormaps failed" . 2.2.7 XSetRGBColormaps, XGetRGBColormaps Types: val XSetRGBColormaps: Drawable -> int -> XStandardColormap list -> unit val XGetRGBColormaps: Drawable -> int -> XStandardColormap list Syntax: XSetRGBColormaps w property stdmaps ; val maps = XGetRGBColormaps w property ; Arguments: w Specifies the window. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 27 property Specifies the property atom. stdmaps Specifies the XStandardColormaps to be used maps Returns the XStandardColormap Argument Type: datatype XStandardColormap = XStandardColormap of { colormap: Colormap, redMax: int, redMult: int, greenMax: int, greenMult: int, blueMax: int, blueMult: int, basePixel: int, visual: Visual } Argument Description: The colormap member is the colormap created by the XCreateColormap function. The redMax, greenMax, and blueMax members give the maximum red, green, and blue values, respectively. Each colour coefficient ranges from zero to its max, inclusive. For example, a common colormap allocation is 3/3/2 (3 planes for red, 3 planes for green, and 2 planes for blue). This colormap would have redMax = 7, greenMax = 7, and blueMax = 3. An alternate allocation that uses only 216 colours is redMax = 5, greenMax = 5, and blueMax = 5. The redMult, greenMult, and blueMult members give the scale factors used to compose a full pixel value. (See the discussion of the basePixel members for further information.) For a 3/3/2 allocation, redMult might be 32, greenMult might be 4, and blueMult might be 1. For a 6-colours-each allocation, redMult might be 36, greenMult might be 6, and blueMult might be 1. The basePixel member gives the base pixel value used to compose a full pixel value. Usually, the basePixel is obtained from a call to the XAllocColorPlanes function. Given integer red, green, and blue coefficients in their appropriate ranges, one then can compute a corresponding pixel value by using the following expression: r * redMult + g * greenMult + b * blueMult + basePixel For GrayScale colormaps, only the colormap, redMax, redMult, and basePixel members are defined. The other members are ignored. To compute a GrayScale pixel value, use the following expression: gray * redMult + basePixel The visual member gives the the visual from which the colormap was created. The properties containing the XStandardColormap information have the type RGB__COLOR__MAP. Description: XSetRGBColormaps sets the RGB colormap definition in the specified property on the named window. The property is stored with a type of RGB__COLOR__MAP and a format of 32. Note that it is the caller's responsibility to honour the ICCCM restriction that only RGB__DEFAULT__MAP can contain more than one definition. 28 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 The XGetRGBColormaps function returns the RGB colormap definitions stored in the specified property on the named window. If the property exists, is of type RGB__COLOR__MAP, is of format 32, and is long enough to contain a colormap definition (if the visual is not present, XGetRGBColormaps assumes the default visual for the screen on which the window is located), XGetRGBColormaps re- turns the list of colormaps. Otherwise, XGetRGBColormaps returns the empty list. Note that it is the caller's responsibility to honour the ICCCM restriction that only RGB__DEFAULT__MAP can contain more than one definition. 2.3 Cursors 2.3.1 XCreateFontCursor, XCreatePixmapCursor, XCreateGlyphCursor Types: val XCreateFontCursor: int -> Cursor val XCreatePixmapCursor: Drawable -> Drawable -> XColor -> XColor -> XPoint -> Cursor val XCreateGlyphCursor: Font -> Font -> int -> int -> XColor -> XColor -> Cursor Syntax: val cursor = XCreateFontCursor shape ; val cursor = XCreatePixmapCursor source mask foreground background hotspot ; val cursor = XCreateGlyphCursor sourceFont maskFont sourceChar maskChar foreground background ; Arguments: background Specifies the RGB values for the background of the source. foreground Specifies the RGB values for the foreground of the source. mask Specifies the cursor's mask bits to be displayed or NoDrawable. maskChar Specifies the glyph character for the mask. maskFont Specifies the font for the mask glyph or NoFont. shape Specifies the shape name of the cursor. source Specifies the cursor's source bits to be displayed. sourceChar Specifies the character glyph for the source. sourceFont Specifies the font for the source glyph. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 29 hotspot Specifies the x and y coordinates, which indicate the hotspot relative to the source's origin. cursor Returns the new cursor Argument Type: datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } Description: X provides a set of standard cursor shapes in a special font named cursor. Applications are encouraged to use this interface for their cursors because the font can be customized for the individual display type. The shape argument specifies which glyph of the standard fonts to use. The hotspot comes from the information stored in the cursor font. The initial colours of a cursor are a black foreground and a white background (see XRecolorCursor). The XCreatePixmapCursor function creates and returns a cursor. The foreground and background RGB values must be specified using foreground and background, even if the X server only has a StaticGray or GrayScale screen. The foreground colour is used for the pixels set to 1 in the source, and the background colour is used for the pixels set to 0. Both source and mask, if specified, must have depth one (or a BadMatch error results) but can have any root. The mask argument defines the shape of the cursor. The pixels set to 1 in the mask define which source pixels are displayed, and the pixels set to 0 define which pixels are ignored. If no mask is given, all pixels of the source are displayed. The mask, if present, must be the same size as the pixmap defined by the source argument, or a BadMatch error results. The hotspot must be a point within the source, or a BadMatch error results. The components of the cursor can be transformed arbitrarily to meet display limitations. The pixmaps can be freed immediately if no further explicit references to them are to be made. Subsequent drawing in the source or mask pixmap has an undefined effect on the cursor. The X server might or might not make a copy of the pixmap. The XCreateGlyphCursor function is similar to XCreatePixmapCursor except that the source and mask bitmaps are obtained from the specified font glyphs. The sourceChar must be a defined glyph in sourceFont, or a BadValue error results. If maskFont is given, maskChar must be a defined glyph in maskFont, or a BadValue error results. The maskFont and maskChar are optional. The origins of the sourceChar and maskChar (if defined) glyphs are positioned coincidently and define the hotspot. The sourceChar and maskChar need not have the same bounding box metrics, and there is no restriction on the placement of the hotspot relative to the bounding boxes. If no maskChar is given, all pixels of the source are displayed. You can free the fonts immediately by calling XFreeFont if no further explicit references to them are to be made. 2.3.2 XDefineCursor, XUndefineCursor, NoCursor Types: 30 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 val XDefineCursor: Drawable -> Cursor -> unit val XUndefineCursor: Drawable -> unit val NoCursor: Cursor Syntax: XDefineCursor w cursor ; XUndefineCursor w ; Arguments: cursor Specifies the cursor that is to be displayed or NoCursor. w Specifies the window. Description: If a cursor is set, it will be used when the pointer is in the window. If the cursor is NoCursor, it is equivalent to XUndefineCursor. The XUndefineCursor undoes the effect of a previous XDefineCursor for this window. When the pointer is in the window, the parent's cursor will now be used. On the root window, the default cursor is restored. 2.3.3 XRecolorCursor, XFreeCursor Types: val XRecolorCursor: Cursor -> XColor -> XColor -> unit val XFreeCursor: Cursor -> unit Syntax: XRecolorCursor cursor fg bg ; XFreeCursor cursor ; Arguments: bg Specifies the RGB values for the background of the source. cursor Specifies the cursor. fg Specifies the RGB values for the foreground of the source. Description: The XRecolorCursor function changes the colour of the specified cursor, and if the cursor is being displayed on a screen, the change is visible immediately. The XFreeCursor function deletes the association between the Cursor value and the specified cursor in the server. The cursor storage is freed when no other resource references it. The specified cursor should not be referred to again. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 31 2.4 Display Specifications 2.4.1 AllPlanes Types: val AllPlanes: int Syntax: val planeMask = AllPlanes ; Description: AllPlanes is a value with all bits set to 1 and is suitable for use in a plane mask argument to a function. 2.4.2 BitmapBitOrder Types: val BitmapBitOrder: unit -> ImageOrder Argument Type: datatype ImageOrder = LSBFirst | MSBFirst Syntax: val order = BitmapBitOrder() ; Description: The BitmapBitOrder function returns LSBFirst or MSBFirst to indicate whether the leftmost bit in the bitmap as displayed on the screen is the least or most significant bit in the bytes comprising the bitmap data. 2.4.3 BitmapPad Types: val BitmapPad: unit -> int Syntax: val pad = BitmapPad() ; Description: The BitmapPad function returns the number of bits that each scanline must be padded. 32 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.4.4 BitmapUnit Types: val BitmapUnit: unit -> int Syntax: val scanline = BitmapUnit() ; Description: The BitmapUnit function returns the size of a bitmap's scanline unit in bits. 2.4.5 ByteOrder Types: val ByteOrder: unit -> ImageOrder Argument Type: datatype ImageOrder = LSBFirst | MSBFirst Syntax: val order = ByteOrder ; Description: The ByteOrder function specifies the required byte order for images for each scanline unit in XY format (bitmap) or for each pixel value in Z format. 2.4.6 CellsOfScreen Types: val CellsOfScreen: unit -> int Syntax: val cells = CellsOfScreen() ; Description: The CellsOfScreen function returns the number of colormap cells in the default colormap of the screen. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 33 2.4.7 ColormapExists, CursorExists, DrawableExists, FontExists, GCExists, VisualExists Types: val ColormapExists: Colormap -> bool val CursorExists: Cursor -> bool val DrawableExists: Drawable -> bool val FontExists: Font -> bool val GCExists: GC -> bool val VisualExists: Visual -> bool Description: In Poly/ML all values may be committed to the database and then referenced in future Poly/ML sessions. X resources are stored in the X server and are destroyed at the end of every Poly/ML session. If the user attempts to use an ML value corresponding to an X resource that existed in an earlier session, then exception XWindows is raised with "Non-existant resource" . To allow programmers to detect old resources these functions return true only if the ML value passed in corresponds to an X resource created in this session, and return false otherwise. 2.4.8 ColormapID, CursorID, DrawableID, FontID, GCID, VisualID, SameDrawable Types: type Colormap ; type Cursor ; type Drawable ; type Font ; type GC ; type Visual ; val ColormapID: Colormap -> int val CursorID: Cursor -> int val DrawableID: Drawable -> int val FontID: Font -> int val GCID: GC -> int val VisualID: Visual -> int val SameDrawable: Drawable -> Drawable -> bool Description: These functions return the X identifiers for the corresponding ML value. In X, unique num- bers are generated for client resources such as windows and pixmaps, and these numbers are sent in the messages between the X server and the client to identify the resources. If two resources have the same X identifier, then they are the same resource. Thus the convenience function SameDrawable is defined as: fun SameDrawable a b = (DrawableID a = DrawableID b) 34 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.4.9 DefaultVisual Types: val DefaultVisual: unit -> Visual Syntax: val visual = DefaultVisual() ; Description: The DefaultVisual function returns the default visual type for the screen. 2.4.10 DisplayConnected Types: val DisplayConnected: unit -> bool Description: In release 1 of the X Window interface in Poly/ML, the display is connected to automati- cally when Poly/ML starts. If -noDisplay was specified on the command line, or Poly/ML cannot connect to the display for whatever reason, then Poly/ML runs without a display connected. An attempt to use an X function that needs the display will raise exception XWindows with "Display not connected" . To allow programmers to avoid this situation, this function returns true only if the display is connected, and false otherwise. 2.4.11 DisplayHeight, DisplayHeightMM, DisplayWidth, DisplayWidthMM Types: val DisplayHeight: unit -> int val DisplayHeightMM: unit -> int val DisplayWidth: unit -> int val DisplayWidthMM: unit -> int Syntax: val height = DisplayHeight() ; val height = DisplayHeightMM() ; val width = DisplayWidth() ; val width = DisplayWidthMM() ; Description: The DisplayHeight function returns the height of the specified screen in pixels. The DisplayHeightMM function returns the height of the screen in millimeters. The DisplayWidth function returns the width of the screen in pixels. The DisplayWidthMM function returns the width of the specified screen in millimeters. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 35 2.4.12 DisplayPlanes Types: val DisplayPlanes: unit -> int Syntax: val planes = DisplayPlanes() ; Description: The DisplayPlanes function returns the depth of the root window of the screen. 2.4.13 DisplayString Types: val DisplayString: unit -> string Syntax: val s = DisplayString() ; Description: The DisplayString function returns the string that was passed to XOpenDisplay when the current display was opened. 2.4.14 DoesBackingStore Types: val DoesBackingStore: unit -> BackingStore Syntax: val bs = DoesBackingStore() ; Argument Type: datatype BackingStore = NotUseful | WhenMapped | Always Description: The DoesBackingStore function returns WhenMapped, NotUseful, or Always, which indicate whether the screen supports backing stores. 36 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.4.15 DoesSaveUnders Types: val DoesSaveUnders: unit -> bool Syntax: val su = DoesSaveUnders() ; Description: The DoesSaveUnders function returns a bool indicating whether the screen supports save unders. 2.4.16 EventMaskOfScreen Types: val EventMaskOfScreen: unit -> EventMask list Syntax: val mask = EventMaskOfScreen() ; Description: The EventMaskOfScreen function returns the root event mask of the root window for the screen at connection setup. 2.4.17 MinCmapsOfScreen Types: val MinCmapsOfScreen: unit -> int Syntax: val n = MinCmapsOfScreen() ; Description: The MinCmapsOfScreen function returns the minimum number of installed colormaps supported by the screen. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 37 2.4.18 MaxCmapsOfScreen Types: val MaxCmapsOfScreen: unit -> int Syntax: val n = MaxCmapsOfScreen() ; Description: The MaxCmapsOfScreen function returns the maximum number of installed colormaps supported by the screen. 2.4.19 NoColormap, NoCursor, NoDrawable, NoFont, NoVisual, ParentRelative, CopyFromParentDrawable, CopyFromParentVisual, PointerWindow, InputFocus, PointerRoot Types: val NoColormap: Colormap val NoCursor: Cursor val NoDrawable: Drawable val NoFont: Font val NoVisual: Visual val ParentRelative: Drawable val CopyFromParentDrawable: Drawable val CopyFromParentVisual: Visual val PointerWindow: Drawable val InputFocus: Drawable val PointerRoot: Drawable Description: These names refer to constant values of the indicated type that may be used instead of passing a real, live instance of one of these types. Typically they are used to indicate that some default action should take place. For example, setting the background pixmap of a window to ParentRelative specifies that the background pixmap of the window's parent is to be used. 2.4.20 ProtocolRevision Types: val ProtocolRevision: unit -> int Syntax: val rev = ProtocolRevision() ; 38 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The ProtocolRevision function returns the minor protocol revision number of the X server. 2.4.21 ProtocolVersion Types: val ProtocolVersion: unit -> int Syntax: val v = ProtocolVersion() ; Description: The ProtocolVersion function returns the major version number (11) of the X protocol associated with the connected display. 2.4.22 RootWindow Types: val RootWindow: unit -> Drawable Syntax: val root = RootWindow() ; Description: The RootWindow function returns the root window. 2.4.23 ServerVendor Types: val ServerVendor: unit -> string Syntax: val s = ServerVendor() ; Description: The ServerVendor function returns a string that provides some identification of the owner of the X server implementation. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 39 2.4.24 VendorRelease Types: val VendorRelease: unit -> int Syntax: val n = VendorRelease() ; Description: The VendorRelease function returns a number related to a vendor's release of the X server. 2.4.25 XQueryBestCursor, XQueryBestSize, XQueryBestStipple, XQueryBestTile Types: val XQueryBestSize: ShapeClass -> Drawable -> XRectangle -> XRectangle val XQueryBestCursor: Drawable -> XRectangle -> XRectangle val XQueryBestStipple: Drawable -> XRectangle -> XRectangle val XQueryBestTile: Drawable -> XRectangle -> XRectangle Syntax: val bestSize = XQueryBestCursor whichScreen area ; val bestSize = XQueryBestSize whichScreen class area ; val bestSize = XQueryBestStipple whichScreen area ; val bestSize = XQueryBestTile whichScreen area ; Argument Type: datatype ShapeClass = CursorShape | TileShape | StippleShape Arguments: class Specifies the class that you are interested in. You can pass TileShape, CursorShape, or StippleShape. whichScreen Drawable to determine which screen. area Specifies the width and height. bestSize Returns the width and height of the object best supported by the display hardware. 40 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The XQueryBestSize function returns the best or closest size to the specified size. For CursorShape, this is the largest size that can be fully displayed on the screen specified by whichScreen. For TileShape, this is the size that can be tiled fastest. For StippleShape, this is the size that can be stippled fastest. For CursorShape, the drawable indicates the desired screen. For TileShape and StippleShape, the drawable indicates the screen and possibly the window class and depth. An InputOnly window cannot be used as the drawable for TileShape or StippleShape, or a BadMatch error results. The XQueryBestTile function returns the best or closest size, that is, the size that can be tiled fastest on the screen specified by d. The drawable indicates the screen and possibly the window class and depth. If an InputOnly window is used as the drawable, a BadMatch error results. The XQueryBestStipple function returns the best or closest size, that is, the size that can be stippled fastest on the screen specified by whichScreen. The drawable indicates the screen and possibly the window class and depth. If an InputOnly window is used as the drawable, a BadMatch error results. Some displays allow larger cursors than other displays. The XQueryBestCursor function provides a way to find out what size cursors are actually possible on the display. It returns the largest size that can be displayed. Applications should be prepared to use smaller cursors on displays that cannot support large ones. 2.5 Drawing Primitives 2.5.1 XClearArea, XClearWindow Types: val XClearArea: Drawable -> XRectangle -> bool -> unit val XClearWindow: Drawable -> unit Syntax: XClearArea w area exposures ; XClearWindow w ; Arguments: exposures Specifies a bool that indicates if Expose events are to be generated. area Specifies the area to be cleared in the window. w Specifies the window. Description: The XClearArea function paints a rectangular area in the specified window according to the specified dimensions with the window's background pixel or pixmap. The subwindow- mode effectively is ClipByChildren. If width is zero, it is replaced with the current width of the window minus x. If height is zero, it is replaced with the current height of the window minus y. If the window has a defined background tile, the rectangle clipped by any children is filled with this tile. If the window has background NoDrawable, the cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 41 contents of the window are not changed. In either case, if exposures is true, one or more Expose events are generated for regions of the rectangle that are either visible or are being retained in a backing store. If you specify a window whose class is InputOnlyClass, a BadMatch error results. The XClearWindow function clears the entire area in the specified window and is equiv- alent to XClearArea w empty false . If the window has a defined background tile, the rectangle is tiled with a plane-mask of all ones and GXcopy function. If the window has background NoDrawable, the contents of the window are not changed. If you specify a window whose class is InputOnlyClass, a BadMatch error results. 2.5.2 XCopyArea, XCopyPlane Types: val XCopyArea: Drawable -> Drawable -> GC -> XPoint -> XRectangle -> unit val XCopyPlane: Drawable -> Drawable -> GC -> XPoint -> XRectangle -> int -> unit Syntax: XCopyArea src dest gc srcPoint destArea ; XCopyPlane src dest gc srcPoint destArea plane ; Arguments: destArea Specifies the destination rectangle gc Specifies the GC. plane Specifies the bit plane. You must set exactly one bit to 1. src Specifies the source dest and destination drawables to be combined. srcPoint Specifies the upper-left corner of the source rectangle. Description: The XCopyArea function combines the specified rectangle of src with the specified rect- angle of dest. The drawables must have the same root and depth, or a BadMatch error results. If regions of the source rectangle are obscured and have not been retained in backing store or if regions outside the boundaries of the source drawable are specified, those regions are not copied. Instead, the following occurs on all corresponding destination regions that are either visible or are retained in backing store. If the destination is a window with a background other than NoDrawable, corresponding regions of the destination are tiled with that background (with plane-mask of all ones and GXcopy function). Regardless of tiling or whether the destination is a window or a pixmap, if graphics-exposures is true, then GraphicsExpose events for all corresponding destination regions are generated. If graphics-exposures is true but no GraphicsExpose events are generated, a NoExpose event is generated. Note that by default graphics-exposures is true in new GCs. 42 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 This function uses these GC components: function, plane-mask, subwindow-mode, graphics-exposures, clip-origin, and clip-mask. The XCopyPlane function uses a single bit plane of the specified source rectangle com- bined with the specified GC to modify the specified rectangle of dest. The drawables must have the same root but need not have the same depth. If the drawables do not have the same root, a BadMatch error results. If plane does not have exactly one bit set to 1 and is less than 2 ^ n , where n is the depth of the drawables, a BadValue error results. Effectively, XCopyPlane forms a pixmap of the same depth as the rectangle of dest and with a size specified by the source region. It uses the foreground/background pixels in the GC (foreground everywhere the bit plane in src contains a bit set to 1, background everywhere the bit plane in src contains a bit set to 0) and the equivalent of a CopyArea protocol request is performed with all the same exposure semantics. This can also be thought of as using the specified region of the source bit plane as a stipple with a fill-style of FillOpaqueStippled for filling a rectangular area of the destination. This function uses these GC components: function, plane-mask, foreground, background, subwindow-mode, graphics-exposures, clip-origin, and clip-mask. 2.5.3 XDrawArc, XDrawArcs Types: val XDrawArc: Drawable -> GC -> XArc -> unit val XDrawArcs: Drawable -> GC -> XArc list -> unit Syntax: XDrawArc d gc (XArc (area,angle1,angle2)) ; XDrawArcs d gc arcs ; Arguments: angle1 Specifies the start of the arc relative to the three-o'clock position from the center, in units of degrees * 64. angle2 Specifies the path and extent of the arc relative to the start of the arc, in units of degrees * 64. arcs Specifies a list of arcs. d Specifies the drawable. gc Specifies the GC. area Specifies the bounding rectangle of the area. The x and y coordinates, which are relative to the origin of the drawable, specify the upper-left corner of the bounding rectangle. The width and height are the major and minor axes of the arc. Argument Type: datatype XArc = XArc of XRectangle * int * int cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 43 Description: XDrawArc draws a single circular or elliptical arc, and XDrawArcs draws multiple circular or elliptical arcs. Each arc is specified by a rectangle and two angles. The center of the circle or ellipse is the center of the rectangle, and the major and minor axes are specified by the width and height. Positive angles indicate counterclockwise motion, and negative angles indicate clockwise motion. If the magnitude of angle2 is greater than 360 degrees, XDrawArc or XDrawArcs truncates it to 360 degrees. For an arc specified as (XArc (Area {x,y,width,height}),angle1,angle2), the origin of the major and minor axes is at (x + width div 2,y + height div 2), and the infinitely thin path describing the entire circle or ellipse intersects the horizontal axis at (x,y + height div 2) and (x + width,y + height div 2) and intersects the vertical axis at (x + width div 2,y) and (x + width div 2,y + height) These coordinates can be fractional and so are not truncated to discrete coordinates. The path should be defined by the ideal mathematical path. For a wide line with line-width lw, the bounding outlines for filling are given by the two infinitely thin paths consisting of all points whose perpendicular distance from the path of the circle/ellipse is equal to lw/2 (which may be a fractional value). The cap-style and join-style are applied the same as for a line corresponding to the tangent of the circle/ellipse at the endpoint. For an arc specified as (XArc (Area {x,y,width,height}),angle1,angle2), the angles must be specified in the effectively skewed coordinate system of the ellipse (for a circle, the angles and coordinate systems are identical). The relationship between these angles and angles expressed in the normal coordinate system of the screen (as measured with a protractor) is as follows: skewed-angle = atan (tan normal-angle * width div height) + adjust The skewed-angle and normal-angle are expressed in radians (rather than in degrees scaled by 64) in the range (0,2*pi) and where atan returns a value in the range ("pi/2,pi/2) and adjust is: 0 for normal-angle in the range (0,pi/2) pi for normal-angle in the range (pi/2,3*pi/2) 2*pi for normal-angle in the range (3*pi/2,2*pi) For any given arc, XDrawArc and XDrawArcs do not draw a pixel more than once. If two arcs join correctly and if the line-width is greater than zero and the arcs intersect, XDrawArc and XDrawArcs do not draw a pixel more than once. Otherwise, the in- tersecting pixels of intersecting arcs are drawn multiple times. Specifying an arc with one 44 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 endpoint and a clockwise extent draws the same pixels as specifying the other endpoint and an equivalent counterclockwise extent, except as it affects joins. If the last point in one arc coincides with the first point in the following arc, the two arcs will join correctly. If the first point in the first arc coincides with the last point in the last arc, the two arcs will join correctly. By specifying one axis to be zero, a horizontal or vertical line can be drawn. Angles are computed based solely on the coordinate system and ignore the aspect ratio. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, dash-offset, dash-list, function, plane-mask, line-width, line-style, cap-style, join-style, fill-style, subwindow-mode, clip-origin, and clip-mask. 2.5.4 XDrawImageString, XDrawImageString16 Types: val XDrawImageString: Drawable -> GC -> XPoint -> string -> unit val XDrawImageString16: Drawable -> GC -> XPoint -> int list -> unit Syntax: XDrawImageString d gc point string ; XDrawImageString16 d gc point bigChars ; Arguments: d Specifies the drawable. gc Specifies the GC. string Specifies the character string. bigChars Specifies the character string as a list of 16 bit integers. point Specifies the x and y coordinates, which are relative to the origin of the specified drawable and define the origin of the first character. Description: The XDrawImageString16 function is similar to XDrawImageString except that it uses 16-bit characters. Both functions also use both the foreground and background pixels of the GC in the destination. The effect is first to fill a destination rectangle with the background pixel defined in the GC and then to paint the text with the foreground pixel. The upper-left corner of the filled rectangle is at (x,y-ascent), the width is overall, and the height is ascent+descent. The overall, ascent, and descent are as would be returned by XTextExtents using the font in the gc and string. The function and fill-style defined in the GC are ignored for these functions. The effective function is GXcopy, and the effective fill-style is FillSolid. For fonts defined with 16-bit matrix indexing and used with XDrawImageString, each 8-bit character in the string is used to form the least-significant 8-bits of the index, the most-significant bits are taken to be zero. Both functions use these GC components: plane-mask, foreground, background, font, subwindow-mode, clip-origin, and clip-mask. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 45 2.5.5 XDrawLine, XDrawLines, XDrawSegments Types: val XDrawLine: Drawable -> GC -> XPoint -> XPoint -> unit val XDrawLines: Drawable -> GC -> XPoint list -> CoordMode -> unit val XDrawSegments: Drawable -> GC -> (XPoint * XPoint) list -> unit Syntax: XDrawLine d gc point1 point2 ; XDrawLines d gc points mode ; XDrawSegments d gc segments ; Arguments: d Specifies the drawable. gc Specifies the GC. mode Specifies the coordinate mode. You can pass CoordModeOrigin or Co- ordModePrevious. points Specifies a list of points. segments Specifies a list of pairs of points. point1 Specifies the points point2 to be connected. Argument Type: datatype CoordMode = CoordModeOrigin | CoordModePrevious Description: The XDrawLine function uses the components of the specified GC to draw a line between the specified set of points (x1,y1) and (x2,y2). It does not perform joining at coincident endpoints. For any given line, XDrawLine does not draw a pixel more than once. If lines intersect, the intersecting pixels are drawn multiple times. The XDrawLines function uses the components of the specified GC to draw npoints-1 lines between each pair of points (point[i],point[i+1]) in the list of XPoint structures. It draws the lines in the same order as the list. The lines join correctly at all intermediate points, and if the first and last points coincide, the first and last lines also join correctly. For any given line, XDrawLines does not draw a pixel more than once. If thin (zero line-width) lines intersect, the intersecting pixels are drawn multiple times. If wide lines intersect, the intersecting pixels are drawn only once, as though the entire PolyLine pro- tocol request were a single, filled shape. CoordModeOrigin treats all coordinates as relative to the origin, and CoordModePrevious treats all coordinates after the first as relative to the previous point. The XDrawSegments function draws multiple, unconnected lines. For each segment, XDrawSegments draws a line between (x1,y1) and (x2,y2). It draws the lines in the same order as the list of pairs of points and does not perform joining at coincident endpoints. For any given line, XDrawSegments does not draw a pixel more than once. If lines intersect, the intersecting pixels are drawn multiple times. All three functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, dash-offset, dash-list, function, plane-mask, line-width, line-style, cap-style, fill-style, subwindow-mode, clip-origin, and clip-mask. The XDrawLines function also uses the join-style GC component. 46 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.5.6 XDrawPoint, XDrawPoints Types: val XDrawPoint: Drawable -> GC -> XPoint -> unit val XDrawPoints: Drawable -> GC -> XPoint list -> CoordMode -> unit Syntax: XDrawPoint d gc point ; XDrawPoints d gc points mode ; Arguments: d Specifies the drawable. gc Specifies the GC. points Specifies a list of points. point Specifies the point. mode Specifies the coordinate mode. You can pass CoordModeOrigin or Coord- ModePrevious. Argument Type: datatype CoordMode = CoordModeOrigin | CoordModePrevious Description: The XDrawPoint function uses the foreground pixel and function components of the GC to draw a single point into the specified drawable; XDrawPoints draws multiple points this way. CoordModeOrigin treats all coordinates as relative to the origin, and CoordModePrevious treats all coordinates after the first as relative to the previous point. XDrawPoints draws the points in the same order as the list. Both functions use these GC components: function, plane-mask, foreground, subwindow- mode, clip-origin, and clip-mask. 2.5.7 XDrawRectangle, XDrawRectangles Types: val XDrawRectangle: Drawable -> GC -> XRectangle -> unit val XDrawRectangles: Drawable -> GC -> XRectangle list -> unit Syntax: XDrawRectangle d gc (Area{x=x,y=y,w=width,h=height}) ; XDrawRectangles d gc rectangles ; Arguments: d Specifies the drawable. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 47 gc Specifies the GC. rectangles Specifies a list of rectangles. x,y Specifies the upper-left corner of the rectangle. width Specifies the dimensions height of the rectangle. Description: The XDrawRectangle and XDrawRectangles functions draw the outlines of the spec- ified rectangle or rectangles as if a five-point PolyLine protocol request were specified for each rectangle: [(x,y),(x+width,y),(x+width,y+height),(x,y+height),(x,y)] For the specified rectangle or rectangles, these functions do not draw a pixel more than once. XDrawRectangles draws the rectangles in the same order as the list. If rectangles intersect, the intersecting pixels are drawn multiple times. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, dash-offset, dash-list, function, plane-mask, line-width, line-style, join-style, fill-style, subwindow-mode, clip-origin, and clip-mask. 2.5.8 XDrawString, XDrawString16 Types: val XDrawString: Drawable -> GC -> XPoint -> string -> unit val XDrawString16: Drawable -> GC -> XPoint -> int list -> unit Syntax: XDrawString d gc point string ; XDrawString16 d gc point bigChars ; Arguments: d Specifies the drawable. gc Specifies the GC. string Specifies the character string. bigChars Specifies the character string as a list of 16-bit integers. point Specifies the x and y coordinates, which are relative to the origin of the specified drawable and define the origin of the first character. Description: Each character image, as defined by the font in the GC, is treated as an additional mask for a fill operation on the drawable. The drawable is modified only where the font character has a bit set to 1. For fonts with 2-byte indexing rather than 16-bit linear indexing, pass byte 1 as the most- significant 8-bits and byte 2 as the least-significant 8-bits in the bigChars argument. 48 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 For fonts defined with 16-bit linear indexing and used with XDrawString, each 8-bit character in the string is used to form the least-significant 8-bits of the index, the most- significant bits are taken to be zero. For fonts defined with 2-byte matrix indexing and used with XDrawString, each 8-bit character in the string is used to form byte 2 of the index, byte 1 is taken to be zero. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, function, plane-mask, fill-style, font, subwindow-mode, clip-origin, and clip- mask. 2.5.9 XDrawText, XDrawText16 Types: val XDrawText: Drawable -> GC -> XPoint -> XTextItem list -> unit val XDrawText16: Drawable -> GC -> XPoint -> XTextItem16 list -> unit Syntax: XDrawText d gc point items ; XDrawText16 d gc point items ; Arguments: d Specifies the drawable. gc Specifies the GC. point Specifies the x and y coordinates, which are relative to the origin of the specified drawable and define the origin of the first character. items Specifies a list of text items. Argument Type: datatype XTextItem = XTextItem of string * int * Font datatype XTextItem16 = XTextItem16 of int list * int * Font Argument Description: If the font member is not NoFont, the font is changed before printing and also is stored in the GC. If an error was generated during text drawing, the previous items may have been drawn. The baseline of the characters are drawn starting at the x and y coordinates that you pass in the text drawing functions. For example, consider the background rectangle drawn by XDrawImageString. If you want the upper-left corner of the background rectangle to be at pixel coordinate (x,y), pass the (x,y+ascent) as the baseline origin coordinates to the text functions. The ascent is the font ascent, as given in the XFontStruct structure. If you want the lower-left corner of the background rectangle to be at pixel coordinate (x,y), pass the (x,y-descent+1) as the baseline origin coordinates to the text functions. The descent is the font descent, as given in the XFontStruct structure. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 49 Description: The XDrawText16 function is similar to XDrawText except that it uses 16-bit charac- ters. Both functions allow complex spacing and font shifts between counted strings. Each text item is processed in turn. A font member other than NoFont in an item causes the font to be stored in the GC and used for subsequent text. A text element delta specifies an additional change in the position along the x axis before the string is drawn. The delta is always added to the character origin and is not dependent on any characteristics of the font. Each character image, as defined by the font in the GC, is treated as an additional mask for a fill operation on the drawable. The drawable is modified only where the font character has a bit set to 1. If a text item generates a BadFont error, the previous text items may have been drawn. For fonts with 2-byte indexing rather than 16-bit linear indexing, pass byte 1 as the high order 8-bits and byte 2 as the low order 8-bits in the XTextItem16 list. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, function, plane-mask, fill-style, font, subwindow-mode, clip-origin, and clip- mask. 2.5.10 XFillArc, XFillArcs, XFillPolygon, XFillRectangle, XFillRectangles Types: val XFillArc: Drawable -> GC -> XArc -> unit val XFillArcs: Drawable -> GC -> XArc list -> unit val XFillRectangle: Drawable -> GC -> XRectangle -> unit val XFillRectangles: Drawable -> GC -> XRectangle list -> unit val XFillPolygon: Drawable -> GC -> XPoint list -> PolyShape -> CoordMode -> unit Syntax: XFillArc d gc (XArc (area,angle1,angle2)) ; XFillArcs d gc arcs ; XFillPolygon d gc points shape mode ; XFillRectangle d gc (Area{x=x,y=y,w=width,h=height}) ; XFillRectangles d gc rectangles ; Argument Type: datatype PolyShape = Complex | Nonconvex | Convex datatype CoordMode = CoordModeOrigin | CoordModePrevious Arguments: d Specifies the drawable. gc Specifies the GC. 50 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 area Specifies the bounding rectangle of the area. The x and y coordinates, which are relative to the origin of the drawable, specify the upper-left corner of the bounding rectangle. The width and height are the major and minor axes of the arc. angle1 Specifies the start of the arc relative to the three-o'clock position from the center, in units of degrees * 64. angle2 Specifies the path and extent of the arc relative to the start of the arc, in units of degrees * 64. arcs Specifies a list of arcs. points Specifies a list of points. shape Specifies a shape that helps the server to improve performance. You can pass Complex, Convex, or Nonconvex. mode Specifies the coordinate mode. You can pass CoordModeOrigin or CoordModePrevious. x,y Specifies the upper-left corner of the rectangle. width Specifies the dimensions height of the rectangle. rectangles Specifies a list of rectangles. Description: The XFillRectangle and XFillRectangles functions fill the specified rectangle or rect- angles as if a four-point FillPolygon protocol request were specified for each rectangle: [(x,y),(x+width,y),(x+width,y+height),(x,y+height)] Each function uses the x and y coordinates, width and height dimensions, and GC you specify. XFillRectangles fills the rectangles in the same order as the list. For any given rectangle, XFillRectangle and XFillRectangles do not draw a pixel more than once. If rectangles intersect, the intersecting pixels are drawn multiple times. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, function, plane-mask, fill-style, subwindow-mode, clip-origin, and clip-mask. XFillPolygon fills the region closed by the specified path. The path is closed automati- cally if the last point in the list does not coincide with the first point. XFillPolygon does not draw a pixel of the region more than once. CoordModeOrigin treats all coordinates as relative to the origin, and CoordModePrevious treats all coordinates after the first as relative to the previous point. Depending on the specified shape, the following occurs: If shape is Complex, the path may self-intersect. Note that contiguous coincident points in the path are not treated as self-intersection. If shape is Convex, for every pair of points inside the polygon, the line segment connecting them does not intersect the path. If known by the client, specifying Convex can improve performance. If you specify Convex for a path that is not convex, the graphics results are undefined. If shape is Nonconvex, the path does not self-intersect, but the shape is not wholly convex. If known by the client, specifying Nonconvex instead of Complex may improve performance. If you specify Nonconvex for a self-intersecting path, the graphics results are undefined. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 51 The fill-rule of the GC controls the filling behavior of self-intersecting polygons. This function uses these GC components: foreground, background, tile, stipple, tile- stipple-origin, function, plane-mask, fill-style, fill-rule, subwindow-mode, clip-origin, and clip-mask. For each arc, XFillArc or XFillArcs fills the region closed by the infinitely thin path described by the specified arc and, depending on the arc-mode specified in the GC, one or two line segments. For ArcChord, the single line segment joining the endpoints of the arc is used. For ArcPieSlice, the two line segments joining the endpoints of the arc with the center point are used. XFillArcs fills the arcs in the same order as the list. For any given arc, XFillArc and XFillArcs do not draw a pixel more than once. If regions intersect, the intersecting pixels are drawn multiple times. Both functions use these GC components: foreground, background, tile, stipple, tile- stipple-origin, function, plane-mask, fill-style, arc-mode, subwindow-mode, clip-origin, and clip-mask. 2.6 Exceptions 2.6.1 Range Types: exception Range Description: Range is raised when an argument to a function is not inside the allowable range of values. There are many restricted ranges for function arguments. In brief: x and y coordinates must lie between "32768 and 32767 inclusive, width and height values must be between 0 and 65535 inclusive. This means that Rect {top,left,bottom,right} must have right >= left and bottom >= top . Similarly, Area {x,y,w,h} must have w >= 0 and h >= 0 . Where an XRectangle is used to pass width and height values only, the x and y members must both be 0. 2.6.2 XWindows Types: exception XWindows of string Arguments: "Display not connected" Attempt to use X functions with no dis- play connected. "Non-existant resource" Attempt to use a resource value from a previous session. 52 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 "Not a window" Attempt to use a pixmap Drawable as a window "Not a pixmap" Attempt to use a window Drawable as a pixmap "Handler mismatch" Attempt to send a message to a window handler when the window has had a new handler installed with XSetHandler. " failed" Xlib detected an error condition when executing "Bad in " The X server detected an error con- dition occurred when executing . This is only reported when running synchronously. For exam- ple, "BadMatch in XChangeWindowAt- tributes" . Description: exception XWindows is raised when an Xlib function returns an error condition. 2.7 Event Handling 2.7.1 IsCursorKey, IsFunctionKey, IsKeypadKey, IsMiscFunctionKey, IsModifierKey, IsPFKey Types: val IsCursorKey: int -> bool val IsFunctionKey: int -> bool val IsKeypadKey: int -> bool val IsMiscFunctionKey: int -> bool val IsModifierKey: int -> bool val IsPFKey: int -> bool Description: The IsCursorKey function returns true if the specified KeySym is a cursor key. The IsFunctionKey function returns true if the KeySym is a function key. The IsKeypadKey function returns true if the specified KeySym is a keypad key. The IsMiscFunctionKey function returns true if the specified KeySym is a miscellaneous function key. The IsModifierKey function returns true if the specified KeySym is a modifier key. The IsPFKey function returns true if the specified KeySym is a PF key. 2.7.2 ShiftDown, ControlDown Types: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 53 val ShiftDown: Modifier list -> bool val ControlDown: Modifier list -> bool Syntax: ShiftDown modifiers ControlDown modifiers Arguments: modifiers Specifies the modifiers from a key event Description: The ShiftDown convenience function returns true if ShiftMask is in the modifiers list, and false otherwise. This indicates if the Shift key was pressed when the key event was generated. The ControlDown convenience function returns true if ControlMask is in the modifiers list, and false otherwise. This indicates if the Control key was pressed when the key event was generated. 2.7.3 XLookupString, NoSymbol Types: val XLookupString: int -> Modifier list -> (string * int) val NoSymbol: int Syntax: val (string,keysym) = XLookupString keycode modifiers ; Arguments: keycode Specifies the keycode from a key event modifiers Specifies the modifiers from a key event string Returns the string for that combination keysym Returns the keysym for that combination Description: The XLookupString function translates a key event to a KeySym and a string. The KeySym is obtained by using the standard interpretation of the Shift, Lock, and group modifiers as defined in the X Protocol specification. If the KeySym has been rebound, the bound string will be returned. Otherwise, the KeySym is mapped, if possible, to an ISO Latin-1 character or (if the Control modifier is on) to an ASCII control character, and that character is returned. If no KeySym is defined for keycode, the KeySym returned is NoSymbol. 54 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.7.4 XSelectInput Types: val XSelectInput: Drawable -> EventMask list -> unit Syntax: XSelectInput w events ; Arguments: events Specifies the list of events you wish to handle. w Specifies the window. Argument Type: datatype EventMask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ResizeRedirectMask | SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask | ButtonClickMask Description: The XSelectInput function requests that the X server report the events associated with the specified event mask. Initially, X will not report any of these events. Events are reported relative to a window. If a window is not interested in a device event, it usually propagates to the closest ancestor that is interested, unless the doNotPropagate attribute prohibits it. Setting the event-mask attribute of a window overrides any previous call for the same window but not for other clients. Multiple clients can select for the same events on the same window with the following restrictions: Multiple clients can select events on the same window because their event masks are disjoint. When the X server generates an event, it reports it to all interested clients. Only one client at a time can select CirculateRequest, ConfigureRequest, or MapRequest events, which are associated with the event mask SubstructureRedi- rectMask. Only one client at a time can select a ResizeRequest event, which is associated with the event mask ResizeRedirectMask. Only one client at a time can select a ButtonPress event, which is associated with the event mask ButtonPressMask. The server reports the event to all interested clients. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 55 2.7.5 XSetHandler, NullHandler Types: val XSetHandler: Drawable -> ('a XEvent * 'state -> 'state) -> 'state -> (int -> 'a -> unit) val NullHandler: 'a XEvent * 'state -> 'state Syntax: val sender = XSetHandler w Handler initialState ; sender delay message ; Arguments: w Specifies the window. Handler Specifies the event handling function. initialState Specifies the initial state. sender Returns a function that can send a strongly typed message to the win- dow at any specified time in the future. delay Specifies a delay in milliseconds before the message is sent. message Specifies the message value. The type of the message matches the type of the XEvent processed by the event handling function. Description: When a window is created it is initially unhandled. It can be used for drawing on, but it will not process any events. An ML function can then be registered for that window, and an initial value supplied. The registered function will transform the value to a new value every time an event arrives for that window. In other words, a functional state machine is set up for each window. We also implement strongly typed message passing between windows, and millisecond-resolution timer events. XSetHandler installs a new event handling function for a window. Event handlers typ- ically pattern-match on the XEvent members, choosing to match events that they are interested in, and then finish off with a default pattern match to provide a default action for all other events. For example: fun Handler (Expose {window,region,...},state) = ... | Handler (EnterNotify {window,...},state) = ... | Handler (LeaveNotify {window,...},state) = ... | Handler (MotionNotify {window,pointer,...},state) = ... | Handler (_,state) = state ; (* default is to do nothing *) Underneath, we have a process that maintains a current state and an event handler for every window, and manages the events from the X server. As each event arrives it applies the handler for that window to the event and the current state, which returns a new state, which replaces the original state. Because only one process handles the events, 56 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 we guarantee that no other handler function can run at the same time. If the handler function raises an exception, instead of returning a new state, then the current state is left unchanged, and the exception is reported at the terminal. In this way all events are handled in turn in a predictable order, and in much the same way that other X toolkits work. The Poly/ML top level shell process is still available for debugging and control. If a window has an operation that takes a long time to complete, then the programmer can use Poly/ML processes to do the computations 'in the background' and 'send' the result as a message to the window for display. However, the use of processes in this way is discouraged as they are not standard. If a window function loops, then all other windows will freeze. Since the Poly/ML top level shell is available the user can type ^C followed by 'f' to raise Interrupt in that window function. The function returned by XSetHandler can be used to send messages to this window, if messages are not required then this function can be ignored. The message value will be wrapped up in a Message XEvent and passed to the event handling function, the type of the message value is guaranteed match the type of XEvent handled by the event handler. The time the message arrives can be modified using the delay parameter, which is the delay in milliseconds. This is often useful for implementing flashing displays, or auto-repeat functions. 2.7.6 XSetInputFocus, XGetInputFocus Types: val XSetInputFocus: Drawable -> RevertCode -> int -> unit val XGetInputFocus: unit -> (Drawable * RevertCode) Syntax: XSetInputFocus focus revertTo time ; val (focus,revertTo) = XGetInputFocus() ; Arguments: focus Specifies or returns the window, PointerRoot, or NoDrawable. revertTo Specifies or returns where the input focus reverts to if the window becomes not viewable. You can pass RevertToParent, RevertToPointerRoot, or RevertToNone. time Specifies the time. You can pass either a timestamp or CurrentTime. Argument Type: datatype RevertCode = RevertToParent | RevertToPointerRoot | RevertToNone val CurrentTime: int Description: The XSetInputFocus function changes the input focus and the last-focus-change time. It has no effect if the specified time is earlier than the current last-focus-change time or is later cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 57 than the current X server time. Otherwise, the last-focus-change time is set to the specified time (CurrentTime is replaced by the current X server time). XSetInputFocus causes the X server to generate FocusIn and FocusOut events. Depending on the focus argument, the following occurs: If focus is NoDrawable, all keyboard events are discarded until a new focus window is set, and the revertTo argument is ignored. If focus is a window, it becomes the keyboard's focus window. If a generated keyboard event would normally be reported to this window or one of its inferiors, the event is reported as usual. Otherwise, the event is reported relative to the focus window. If focus is PointerRoot, the focus window is dynamically taken to be the root window of whatever screen the pointer is on at each keyboard event. In this case, the revertTo argument is ignored. The specified focus window must be viewable at the time XSetInputFocus is called, or a BadMatch error results. If the focus window later becomes not viewable, the X server evaluates the revertTo argument to determine the new focus window as follows: If revertTo is RevertToParent, the focus reverts to the parent (or the closest view- able ancestor), and the new revertTo value is taken to be RevertToNone. If revertTo is RevertToPointerRoot or RevertToNone, the focus reverts to PointerRoot or NoDrawable, respectively. When the focus reverts, the X server generates FocusIn and FocusOut events, but the last-focus-change time is not af- fected. The XGetInputFocus function returns the focus window and the current focus state. 2.7.7 XSync, XFlush Types: val XSync: bool -> unit val XFlush: unit -> unit Syntax: XSync discard ; XFlush() ; Arguments: discard Specifies a bool that indicates whether XSync discards all events on the event queue. Description: The XSync function flushes the output buffer and then waits until all requests have been received and processed by the X server. Any errors generated must be handled by the error handler. For each error event received by Xlib, XSync calls the client application's 58 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 error handling routine. Any events generated by the server are enqueued into the library's event queue. If you passed false, XSync does not discard the events in the queue. If you passed true, XSync discards all events in the queue, including those events that were on the queue before XSync was called. Client applications seldom need to call XSync. The XFlush function flushes the output buffer. Most client applications need not use this function because the output buffer is automatically flushed internally as events are read. 2.7.8 XSyncronise, XSynchronize Types: val XSyncronise: int -> unit Syntax: XSyncronise flag ; Arguments: flag Specifies that synchronization is enabled or disabled Description: If flag is non-zero, XSynchronize turns on synchronous behavior. If flag is zero, XSynchro- nize turns off synchronous behavior. NOTE that the current release has XSynchronize misspelled as XSyncronise. 2.7.9 XTranslateCoordinates Types: val XTranslateCoordinates: Drawable -> Drawable -> XPoint -> XPoint * Drawable Syntax: val (dstPoint,child) = XTranslateCoordinates srcWindow destWindow srcPoint ; Arguments: srcWindow Specifies the source window. destWindow Specifies the destination window. srcPoint Specifies the x and y coordinates within the source window dstPoint Return the x and y coordinates within the destination window child Returns the child if the coordinates are contained in a mapped child of the destination window. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 59 Description: The XTranslateCoordinates function takes the srcPoint coordinates relative to the source window's origin and returns these coordinates to dstPoint relative to the desti- nation window's origin. If XTranslateCoordinates returns zero, srcWindow and dest- Window are on different screens, and dstPoint is (0,0). If the coordinates are contained in a mapped child of destWindow, that child is returned as child. Otherwise, child has the value NoDrawable. 2.8 Fonts 2.8.1 CharLBearing, CharRBearing, CharWidth, CharAscent, CharDescent, CharAttributes Types: val CharLBearing: XCharStruct -> int val CharRBearing: XCharStruct -> int val CharWidth: XCharStruct -> int val CharAscent: XCharStruct -> int val CharDescent: XCharStruct -> int val CharAttributes: XCharStruct -> int Argument Type: datatype XCharStruct = XCharStruct of { lbearing: int, rbearing: int, width: int, ascent: int, descent: int, attributes: int } Description: These convenience functions return the individual fields of the XCharStruct datatype. 2.8.2 FSFont, FSDirection, FSMinChar, FSMaxChar, FSMinByte1, FSMaxByte1, FSAllCharsExist, FSAllCharsExist, FSDefaultChar, FSMinBounds, FSMaxBounds, PSPerChar, FSPerChar, FSAscent, FSDescent, FSAscent, FSDescent, FSMinWidth, FSMaxWidth, FSMinHeight, FSMaxHeight Types: val FSFont: XFontStruct -> Font val FSDirection: XFontStruct -> FontDirection val FSMinChar: XFontStruct -> int val FSMaxChar: XFontStruct -> int val FSMinByte1: XFontStruct -> int val FSMaxByte1: XFontStruct -> int 60 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 val FSAllCharsExist: XFontStruct -> bool val FSDefaultChar: XFontStruct -> int val FSMinBounds: XFontStruct -> XCharStruct val FSMaxBounds: XFontStruct -> XCharStruct val PSPerChar: XFontStruct -> XCharStruct list val FSAscent: XFontStruct -> int val FSDescent: XFontStruct -> int val FSMinWidth: XFontStruct -> int val FSMaxWidth: XFontStruct -> int val FSMinHeight: XFontStruct -> int val FSMaxHeight: XFontStruct -> int Argument Type: datatype XFontStruct = XFontStruct of { font: Font, direction: FontDirection, minChar: int, maxChar: int, minByte1: int, maxByte1: int, allCharsExist: bool, defaultChar: int, minBounds: XCharStruct, maxBounds: XCharStruct, perChar: XCharStruct list, ascent: int, descent: int } Description: These convenience functions return the individual fields of the XFontStruct datatype. NOTE that the current release has FSPerChar misspelled as PSPerChar. FSMinWidth, FSMaxWidth, FSMinHeight and FSMaxHeight are defined as: fun FSMinWidth f = CharWidth (FSMinBounds f) ; fun FSMaxWidth f = CharWidth (FSMaxBounds f) ; fun FSMinHeight f = CharAscent (FSMinBounds f) + CharDescent (FSMinBounds f) ; fun FSMaxHeight f = CharAscent (FSMaxBounds f) + CharDescent (FSMaxBounds f) ; 2.8.3 XListFonts, XListFontsWithInfo Types: val XListFonts: string -> int -> string list val XListFontsWithInfo: string -> int -> (string list * XFontStruct list) Syntax: val names = XListFonts pattern maxNames ; val (names,fonts) = XListFontsWithInfo pattern maxNames ; cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 61 Arguments: pattern Specifies the pattern string that can contain wildcard characters. maxNames Specifies the maximum number of names to be returned. names Specifies the list of font names returned. fonts Specifies the list of font structures returned. Description: The XListFonts function returns a list of available font names (as controlled by the font search path; see XSetFontPath) that match the string you passed to the pattern argument. The string should be ISO Latin-1; uppercase and lowercase do not matter. The pattern string can contain any characters, but each asterisk "*" is a wildcard for any number of characters, and each question mark "?" is a wildcard for a single character. The list of names is limited to size specified by maxNames. If XListFonts fails then exception XWindows is raised with "XListFonts failed" . The XListFontsWithInfo function returns a list of font names that match the specified pattern and their associated font information. The list of names is limited to size speci- fied by maxNames. The information returned for each font is identical to what XLoad- QueryFont would return except that the per-character metrics are not returned. The pattern string can contain any characters, but each asterisk "*" is a wildcard for any number of characters, and each question mark "?" is a wildcard for a single character. If XListFontsWithInfo fails then exception XWindows is raised with "XListFontsWith- Info failed" . 2.8.4 XLoadFont, XLoadQueryFont, XQueryFont, XFreeFont, XUnloadFont Types: val XLoadFont: string -> Font val XLoadQueryFont: string -> XFontStruct val XQueryFont: Font -> XFontStruct val XFreeFont: XFontStruct -> unit val XUnloadFont: Font -> unit Syntax: val font = XLoadFont name ; val fs = XLoadQueryFont name ; val fs = XQueryFont font ; XFreeFont fs ; XUnloadFont font ; Arguments: font Specifies the font identifier. fs Specifies the font structure. name Specifies the name of the font. Argument Type: 62 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 datatype FontDirection = FontLeftToRight | FontRightToLeft datatype XCharStruct = XCharStruct of { lbearing: int, rbearing: int, width: int, ascent: int, descent: int, attributes: int } datatype XFontStruct = XFontStruct of { font: Font, direction: FontDirection, minChar: int, maxChar: int, minByte1: int, maxByte1: int, allCharsExist: bool, defaultChar: int, minBounds: XCharStruct, maxBounds: XCharStruct, perChar: XCharStruct list, ascent: int, descent: int } Argument Description: The XFontStruct structure contains all of the information for the font and consists of the font-specific information as well as a list of XCharStruct structures for the characters contained in the font. X supports single byte/character, two bytes/character matrix, and 16-bit character text op- erations. Note that any of these forms can be used with a font, but a single byte/character text request can only specify a single byte (that is, the first row of a 2-byte font). You should view 2-byte fonts as a two-dimensional matrix of defined characters: byte 1 specifies the range of defined rows and byte 2 defines the range of defined columns of the font. Single byte/character fonts have one row defined, and the byte 2 range specified in the structure defines a range of characters. The bounding box of a character is defined by the XCharStruct of that character. When characters are absent from a font, the defaultChar is used. When fonts have all characters of the same size, only the information in the XFontStruct min and max bounds are used. The members of the XFontStruct have the following semantics: The direction member can be either FontLeftToRight or FontRightToLeft. It is just a hint as to whether most XCharStruct elements have a positive (FontLeft- ToRight) or a negative (FontRightToLeft) character width metric. The core pro- tocol defines no support for vertical text. If the minByte1 and maxByte1 members are both zero, minChar specifies the linear character index corresponding to the first element of the perChar list, and maxChar specifies the linear character index of the last element. If either minByte1 or maxByte1 are non-zero, then both minChar and maxChar are less than 256, and the 2-byte character index values corresponding to the perChar list element N (counting from 0) are: byte 1 = N div D + minByte1 byte 2 = N mod D + minChar cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 63 If the perChar list is empty, all glyphs between the first and last character indexes inclusive have the same information, as given by both minBounds and maxBounds. If allCharsExist is true, all characters in the perChar list have non-zero bounding boxes. The defaultChar member specifies the character that will be used when an undefined or nonexistent character is printed. The defaultChar is a 16-bit character (not a 2- byte character). For a font using 2-byte matrix format, the defaultChar has byte 1 in the most-significant byte and byte 2 in the least-significant byte. If the defaultChar itself specifies an undefined or nonexistent character, no printing is performed for an undefined or nonexistent character. The minBounds and maxBounds members contain the most extreme values of each individual XCharStruct component over all elements of this list (and ig- nore nonexistent characters). The bounding box of the font (the smallest rect- angle enclosing the shape obtained by superimposing all of the characters at the same origin (x,y)) has its upper-left coordinate at (x+minBounds.lbearing,y- maxBounds.ascent). Its width is (maxBounds.rbearing-minBounds.lbearing) and its height is (maxBounds.ascent+maxBounds.descent). The ascent member is the logical extent of the font above the baseline that is used for determining line spacing. Specific characters may extend beyond this. The descent member is the logical extent of the font at or below the baseline that is used for determining line spacing. Specific characters may extend beyond this. If the baseline is at Y-coordinate y, the logical extent of the font is inclusive be- tween the Y-coordinate values (y-font.ascent) and (y+font.descent-1). Typically, the minimum interline spacing between rows of text is given by (ascent+descent). For a character origin at (x,y), the bounding box of a character (that is, the smallest rectangle that encloses the character's shape) described in terms of XCharStruct com- ponents is a rectangle with its upper-left corner at (x+lbearing,y-ascent). Its width is (rbearing-lbearing) and its height is (ascent+descent). The origin for the next character is defined to be (x+width,y) The lbearing member defines the extent of the left edge of the character ink from the origin. The rbearing member defines the extent of the right edge of the character ink from the origin. The ascent member defines the extent of the top edge of the character ink from the origin. The descent member defines the extent of the bottom edge of the character ink from the origin. The width member defines the logical width of the character. Description: The XLoadFont function loads the specified font and returns the Font value for it. The name should be ISO Latin-1 encoding; uppercase and lowercase do not matter. The interpretation of characters "?" and "*" in the name is not defined by the core protocol but is reserved for future definition. A structured format for font names is specified in the X Consortium standard X Logical Font Description Conventions. If the font does not exist then exception XWindows is raised with "XLoadFont failed" . Fonts are not associated with a particular screen and can be stored as a component of any GC. When the font is no longer needed, call XUnloadFont. The XQueryFont function returns an XFontStruct structure, which contains informa- tion associated with the font. If XQueryFont fails then exception XWindows is raised with "XQueryFont failed" . The XLoadQueryFont function provides the most common way for accessing a font. XLoadQueryFont both opens (loads) the specified font and returns the appropriate 64 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 XFontStruct structure. If the font does not exist then exception XWindows is raised with "XLoadQueryFont failed" . The XFreeFont function deletes the association between the Font value in the XFontStruct and the specified font in the server. The font itself will be freed when no other resource references it. The XFontStruct and the font should not be referenced again. The XUnloadFont function deletes the association between the Font value and the spec- ified font in the server. The font itself will be freed when no other resource references it. The font should not be referenced again. 2.8.5 XSetFontPath, XGetFontPath Types: val XSetFontPath: string list -> unit val XGetFontPath: unit -> string list Syntax: XSetFontPath directories ; val directories = XGetFontPath() ; Arguments: directories Specifies the directory path used to look for a font. Setting the path to the empty list restores the default path defined for the X server. Description: The XSetFontPath function defines the directory search path for font lookup. There is only one search path per X server, not one per client. The interpretation of the strings is operating system dependent, but they are intended to specify directories to be searched in the order listed. Also, the contents of these strings are operating system dependent and are not intended to be used by client applications. Usually, the X server is free to cache font information internally rather than having to read fonts from files. In addition, the X server is guaranteed to flush all cached information about fonts which are currently referenced by an application. The meaning of an error from this request is operating system dependent. The XGetFontPath function returns a list of strings containing the search path. If XGetFontPath fails then exception XWindows is raised with "XGetFontPath failed" . 2.8.6 XTextExtents, XTextExtents16 Types: val XTextExtents: XFontStruct -> string -> (FontDirection * int * int * XCharStruct) val XTextExtents16: XFontStruct -> int list -> (FontDirection * int * int * XCharStruct) cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 65 Syntax: val (direction,ascent,descent,overall) = XTextExtents fs string ; val (direction,ascent,descent,overall) = XTextExtents16 fs bigChars ; Arguments: direction Returns the value of the direction hint (FontLeftToRight or FontRight- ToLeft). fs Specifies the XFontStruct to use. ascent Returns the font ascent. descent Returns the font descent. string Specifies the character string. bigChars Specifies the character string as a list of 16 bit integers. overall Returns the overall size in a XCharStruct structure. Description: The XTextExtents and XTextExtents16 functions perform the size computation lo- cally using the XFontStruct provided. Both functions return an XCharStruct structure, whose members are set to the values as follows. The ascent member is set to the maximum of the ascent metrics of all characters in the string. The descent member is set to the maximum of the descent metrics. The width member is set to the sum of the character-width metrics of all characters in the string. For each character in the string, let W be the sum of the character-width metrics of all characters preceding it in the string. Let L be the left-side-bearing metric of the character plus W. Let R be the right-side-bearing metric of the character plus W. The lbearing member is set to the minimum L of all characters in the string. The rbearing member is set to the maximum R. For fonts defined with 2-byte matrix indexing rather than 16-bit linear indexing, the most- significant 8-bits of each int in bigChars is used as byte 1, and the least-significant 8-bits is used as byte 2. If the font has no defined default character, undefined characters in the string are taken to have all zero metrics. Characters with all zero metrics are ignored. If the font has no defined defaultChar, the undefined characters in the string are also ignored. 2.8.7 XTextWidth, XTextWidth16 Types: val XTextWidth: XFontStruct -> string -> int val XTextWidth16: XFontStruct -> int list -> int Syntax: val width = XTextWidth fs string ; val width = XTextWidth16 fs bigChars ; 66 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Arguments: fs Specifies the XFontStruct to use. string Specifies the character string. bigChars Specifies the character string as a list of 16 bit integers. width Returns the width in pixels. Description: The XTextWidth and XTextWidth16 functions return the width of the specified 8-bit or 2-byte character strings. 2.9 Geometry 2.9.1 AddPoint, SubtractPoint Types: infix AddPoint SubtractPoint val AddPoint: (XPoint * XPoint) -> XPoint val SubtractPoint: (XPoint * XPoint) -> XPoint Description: AddPoint takes two points and adds the x coordinates together and the y coordinates together to make the resulting point. In vector arithmetic this is equivalent to adding two vectors. SubtractPoint subtracts the x coordinate of the second point from the x coordinate of the first, and subtracts the y coordinate of the second point from the y coordinate of the first. In vector arithmetic this is equivalent to vector subtraction. 2.9.2 Inside, Overlap, Within, LeftOf, RightOf, AboveOf, BelowOf, HorizontallyAbutting, VerticallyAbutting Types: infix Inside Overlap Within infix LeftOf RightOf AboveOf BelowOf infix HorizontallyAbutting VerticallyAbutting val Inside: (XRectangle * XRectangle) -> bool val Overlap: (XRectangle * XRectangle) -> bool val Within: (XPoint * XRectangle) -> bool val LeftOf: (XPoint * XRectangle) -> bool val RightOf: (XPoint * XRectangle) -> bool val AboveOf: (XPoint * XRectangle) -> bool val BelowOf: (XPoint * XRectangle) -> bool val HorizontallyAbutting: (XRectangle * XRectangle) -> bool val VerticallyAbutting: (XRectangle * XRectangle) -> bool cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 67 Description: a Inside b is true if rectangle a is totally enclosed by b. a Overlap b is true if the two rectangles intersect. a Within b is true if point a is inside rectangle b. a LeftOf b is true if point a is outside and to the left of rectangle b. a RightOf b is true if point a is outside and to the right of rectangle b. a AboveOf b is true if point a is outside and above rectangle b. a BelowOf b is true if point a is outside and below rectangle b. a HorizontallyAbutting b is true if the left edge of a touches the right edge of b, or the right edge of a touches the left edge of b. a VerticallyAbutting b is true if the top edge of a touches the bottom edge of b, or the bottom edge of a touches the top edge of b. 2.9.3 Intersection, Union, Section Types: val Intersection: XRectangle -> XRectangle -> Section val Union: XRectangle -> XRectangle -> XRectangle Argument Type: datatype Section = Nothing | Section of XRectangle Description: Intersection computes the intersection of the two rectangles. If the rectangles do not intersect then it returns Nothing, otherwise it returns Section of the intersection. Union computes the bounding rectangle for the union of the two rectangles. 2.9.4 Left, Right, Top, Bottom, Width, Height, TopLeft, TopRight, BottomLeft, BottomRight, XRectangle, Area, Rect, DestructRect, DestructArea, empty Types: eqtype XRectangle val Rect: {left:int,right:int,top:int,bottom:int} -> XRectangle val Area: {x:int,y:int,w:int,h:int} -> XRectangle val DestructRect: XRectangle -> {left:int,right:int,top:int,bottom:int} val DestructArea: XRectangle -> {x:int,y:int,w:int,h:int} exception XRectangle of {top:int,left:int,bottom:int,right:int} val Left: XRectangle -> int 68 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 val Right: XRectangle -> int val Top: XRectangle -> int val Bottom: XRectangle -> int val Width: XRectangle -> int val Height: XRectangle -> int val TopLeft: XRectangle -> XPoint val TopRight: XRectangle -> XPoint val BottomLeft: XRectangle -> XPoint val BottomRight: XRectangle -> XPoint val empty = Area {x=0,y=0,w=0,h=0} Syntax: val area = Area { x = 0, y = 0, w = 100, h = 200 } ; val {x,y,w,h} = DestructArea area ; val left = Left area ; Description: XRectangles are used to represent pixel areas. For example, an Expose event on a window will contain the position and size of the rectangular area which needs refreshing. XRect- angles may also represent size only. For example, the coordinate system of a window is represented as an XRectangle which has width and height, but the top left corner of the rectangle is at (0,0). XRectangles representing pixel areas can be thought of in two ways. The first way is to call the top left pixel in the rectangle (x,y) and the width and height of the rectangle are (width,height) . Then, an empty rectangle has width = 0 and height = 0 , and the point (a,b) is in a non-empty rectangle only if a >= x and a < (x+width) and b >= y and b < (y+height) . The second way is to call the top left pixel inside the area (top,left) and to call the outside bottom right pixel (bottom,right) . Then, the empty rectangle has (top,left) = (bottom,right) , and the point (x,y) is in a non-empty rectangle if x >= left and x < right and y >= top and y < bottom . NOTE that in X, y coordi- nates increase down the screen, so top <= bottom . You should be careful not to generate coordinates out of range. x and y coordinates must lie between "32768 and 32767 inclusive, width and height values must be between 0 and 65535 inclusive. This means that Rect {top,left,bottom,right} must have right >= left and bottom >= top . Similarly, Area {x,y,w,h} must have w >= 0 and h >= 0 . If these constraints are not met then exception XRectangle is raised. Convenience functions exist to destruct XRectangles. Left, Right, Top and Bottom return the single coordinate for an edge of an XRectangle. Width and Height re- turn the width and height of an XRectangle. TopLeft, TopRight, BottomLeft and BottomRight return the coordinates of a corner of an XRectangle as points. empty is a rectangle with zero area. 2.9.5 MakeRect, SplitRect Types: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 69 val MakeRect: XPoint -> XPoint -> XRectangle val SplitRect: XRectangle -> (XPoint * XPoint) Syntax: val (topLeft,bottomRight) = SplitRect r ; val r = MakeRect corner1 corner2 ; Description: MakeRect constructs an XRectangle given two points corresponding to any pair of opposite corners of the rectangle. This is useful when the order of the two points is not known, for example when dragging a rubber-banded box on the screen. SplitRect returns the pair of points corresponding to the top-left and bottom-right corners of the XRectangle. It will always be the case that left <= right and top <= bottom . 2.9.6 NegativePoint Types: val NegativePoint: XPoint -> XPoint Description: NegativePoint negates both the x and y coordinates of the point. This is equivalent to reflecting about the x axis and the y axis. 2.9.7 OutsetRect, OffsetRect, IncludePoint Types: val OutsetRect: int -> XRectangle -> XRectangle val OffsetRect: XRectangle -> XPoint -> XRectangle val IncludePoint: XPoint -> XRectangle -> XRectangle Description: OutsetRect n R takes rectangle R and expands its area by n units in all four directions. Typically n is positive and this function is used to expand areas to incorporate borders of the same width all around. With a negative n it can be used to shrink an area towards the centre of the area. If n is more negative than half the width or height of the area then exception XRectangle is raised. OffsetRect R (XPoint{x,y}) adds x to both x coordinates and y to both y coordinates of R. This is typically used to move a rectangle by an (x,y) offset or vector. IncludePoint p R is used to expand the area of R to include the point p. If p is already inside the rectange R then R is returned unchanged. If p is outside the rectangle R then R is expanded in the direction of p so that p is now just inside R. 70 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.9.8 Reflect Types: val Reflect: XRectangle -> XRectangle Description: Reflect takes an XRectangle and swaps the x and y coordinates over; left is swapped with top and right is swapped with bottom. This is equivalent to reflecting the points about the 45-degree line that has the equation y = x. 2.9.9 XPoint Types: datatype XPoint = XPoint of { x:int,y:int } val origin = XPoint {x=0,y=0} Syntax: XPoint { x=100,y=200 } Description: XPoints are used to represent the coordinates of pixels. For example, the position of the top left pixel of a window on the screen is represented as an XPoint. You should be careful not to generate coordinates out of range. x and y coordinates must lie between "32768 and 32767 inclusive. origin is the point (0,0), and is typically used to refer to the origin of the coordinate system. In X, the origin is the top left corner of a window. 2.10 GC - Graphics Context 2.10.1 DefaultGC Types: val DefaultGC: unit -> GC Syntax: val gc = DefaultGC() ; Description: The DefaultGC function returns the default GC for the root window of the screen. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 71 2.10.2 XCreateGC, XChangeGC, XFreeGC Types: val XCreateGC: Drawable -> XGCValue list -> GC val XChangeGC: GC -> XGCValue list -> unit val XFreeGC: GC -> unit Syntax: val gc = XCreateGC d values ; XChangeGC gc values ; XFreeGC gc ; Arguments: d Specifies the drawable. gc Specifies the GC. values Specifies which components in the GC are to be set or changed. Argument Type: datatype XGCValue = GCFunction of GCFunction | GCPlaneMask of int | GCForeground of int | GCBackground of int | GCLineWidth of int | GCLineStyle of GCLineStyle | GCCapStyle of GCCapStyle | GCJoinStyle of GCJoinStyle | GCFillStyle of GCFillStyle | GCFillRule of GCFillRule | GCTile of Drawable | GCStipple of Drawable | GCTSOrigin of XPoint | GCFont of Font | GCSubwindowMode of GCSubwindowMode | GCGraphicsExposures of bool | GCClipOrigin of XPoint | GCClipMask of Drawable | GCDashOffset of int | GCDashList of int | GCArcMode of GCArcMode Argument Description: The GCFunction attributes of a GC are used when you update a section of a drawable (the destination) with bits from somewhere else (the source). The function in a GC defines how the new destination bits are to be computed from the source bits and the old destination bits. GXcopy is typically the most useful because it will work on a colour display, but special applications may use other functions, particularly in concert with particular planes of a colour display. The 16 GC functions are: 72 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 datatype GCFunction = GXclear | GXand | GXandReverse | GXcopy | GXandInverted | GXnoop | GXxor | GXor | GXnor | GXequiv | GXinvert | GXorReverse | GXcopyInverted | GXorInverted | GXnand | GXset Many graphics operations depend on either pixel values or planes in a GC. The GC- PlaneMask attribute is an int, and it specifies which planes of the destination are to be modified, one bit per plane. A monochrome display has only one plane and will be the least-significant bit of the word. As planes are added to the display hardware, they will occupy more significant bits in the plane mask. In graphics operations, given a source and destination pixel, the result is computed bitwise on corresponding bits of the pixels. That is, a Boolean operation is performed in each bit plane. The plane-mask restricts the operation to a subset of planes. The value AllPlanes can be used to refer to all planes of the screen simultaneously. The result is computed by the following: ((src GC-FUNCTION dst) AND plane-mask) OR (dst AND (NOT plane-mask)) Range checking is not performed on the values for foreground, background, or plane-mask. They are simply truncated to the appropriate number of bits. The line-width is measured in pixels and either can be greater than or equal to one (wide line) or can be the special value zero (thin line). Wide lines are drawn centered on the path described by the graphics request. Unless otherwise specified by the join-style or cap-style, the bounding box of a wide line with endpoints (x1,y1), (x2,y2) and width w is a rectangle with vertices at the following real coordinates: (x1-(w*sn/2),y1+(w*cs/2)), (x1+(w*sn/2),y1-(w*cs/2)), (x2-(w*sn/2),y2+(w*cs/2)), (x2+(w*sn/2),y2-(w*cs/2)) Here sn is the sine of the angle of the line, and cs is the cosine of the angle of the line. A pixel is part of the line and so is drawn if the center of the pixel is fully inside the bounding box (which is viewed as having infinitely thin edges). If the center of the pixel is exactly on the bounding box, it is part of the line if and only if the interior is immediately to its right (x increasing direction). Pixels with centers on a horizontal edge are a special case and are part of the line if and only if the interior or the boundary is immediately below (y increasing direction) and the interior or the boundary is immediately to the right (x increasing direction). Thin lines (zero line-width) are one-pixel-wide lines drawn using an unspecified, device- dependent algorithm. There are only two constraints on this algorithm. If a line is drawn unclipped from (x1,y1) to (x2,y2) and if another line is drawn unclipped from (x1+dx,y1+dy) to (x2+dx,y2+dy), a point (x,y) is touched by drawing the first line if and only if the point (x+dx,y+dy) is touched by drawing the second line. The effective set of points comprising a line cannot be affected by clipping. That is, a point is touched in a clipped line if and only if the point lies inside the clipping region and the point would be touched by the line when drawn unclipped. A wide line drawn from (x1,y1) to (x2,y2) always draws the same pixels as a wide line drawn from (x2,y2) to (x1,y1), not counting cap-style and join-style. It is recommended that this property be true for thin lines, but this is not required. A line-width of zero may differ from a line-width of one in which pixels are drawn. This permits the use of many cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 73 manufacturers' line drawing hardware, which may run many times faster than the more precisely specified wide lines. In general, drawing a thin line will be faster than drawing a wide line of width one. How- ever, because of their different drawing algorithms, thin lines may not mix well aesthetically with wide lines. If it is desirable to obtain precise and uniform results across all displays, a client should always use a line-width of one rather than a line-width of zero. datatype GCLineStyle = LineSolid | LineOnOffDash | LineDoubleDash The line-style defines which sections of a line are drawn: LineSolid The full path of the line is drawn. LineDoubleDash The full path of the line is drawn, but the even dashes are filled differently than the odd dashes (see fill-style) with CapButt style used where even and odd dashes meet. LineOnOffDash Only the even dashes are drawn, and cap-style applies to all inter- nal ends of the individual dashes, except CapNotLast is treated as CapButt. datatype GCCapStyle = CapNotLast | CapButt | CapRound | CapProjecting The cap-style defines how the endpoints of a path are drawn: CapNotLast This is equivalent to CapButt except that for a line-width of zero the final endpoint is not drawn. CapButt The line is square at the endpoint (perpendicular to the slope of the line) with no projection beyond. CapRound The line has a circular arc with the diameter equal to the line- width, centered on the endpoint. (This is equivalent to CapButt for line-width of zero). CapProjecting The line is square at the end, but the path continues beyond the endpoint for a distance equal to half the line-width. (This is equiv- alent to CapButt for line-width of zero). datatype GCJoinStyle = JoinMiter | JoinRound | JoinBevel The join-style defines how corners are drawn for wide lines: JoinMiter The outer edges of two lines extend to meet at an angle. However, if the angle is less than 11 degrees, then a JoinBevel join-style is used instead. JoinRound The corner is a circular arc with the diameter equal to the line-width, centered on the joinpoint. JoinBevel The corner has CapButt endpoint styles with the triangular notch filled. For a line with coincident endpoints (x1=x2,y1=y2), when the cap-style is applied to both endpoints, the semantics depends on the line-width and the cap-style: 74 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 CapNotLast thin The results are device-dependent, but the desired ef- fect is that nothing is drawn. CapButt thin The results are device-dependent, but the desired ef- fect is that a single pixel is drawn. CapRound thin The results are the same as for CapButt/thin. CapProjecting thin The results are the same as for CapButt/thin. CapButt wide nothing is drawn. CapRound wide The closed path is a circle, centered at the endpoint, and with the diameter equal to the line-width. CapProjecting wide The closed path is a square, aligned with the coor- dinate axes, centered at the endpoint, and with the sides equal to the line-width. For a line with coincident endpoints (x1=x2, y1=y2), when the join-style is applied at one or both endpoints, the effect is as if the line was removed from the overall path. However, if the total path consists of or is reduced to a single point joined with itself, the effect is the same as when the cap-style is applied at both endpoints. The tile/stipple and clip origins are interpreted relative to the origin of whatever destina- tion drawable is specified in a graphics request. The tile pixmap must have the same root and depth as the GC, or a BadMatch error results. The stipple pixmap must have depth one and must have the same root as the GC, or a BadMatch error results. For stipple operations where the fill-style is FillStippled but not FillOpaqueStippled, the stipple pattern is tiled in a single plane and acts as an additional clip mask to be ANDed with the clip-mask. Although some sizes may be faster to use than others, any size pixmap can be used for tiling or stippling. datatype GCFillStyle = FillSolid | FillTiled | FillStippled | FillOpaqueStippled The fill-style defines the contents of the source for line, text, and fill requests. For all text and fill requests, for line requests with line-style LineSolid, and for the even dashes for line requests with line-style LineOnOffDash or LineDoubleDash, the following apply: FillSolid Foreground FillTiled Tile FillOpaqueStippled A tile with the same width and height as stipple, but with background everywhere stipple has a zero and with foreground everywhere stipple has a one FillStippled Foreground masked by stipple When drawing lines with line-style LineDoubleDash, the odd dashes are controlled by the fill-style in the following manner: FillSolid Background FillTiled Same as for even dashes FillOpaqueStippled Same as for even dashes FillStippled Background masked by stipple Storing a pixmap in a GC might or might not result in a copy being made. If the pixmap is later used as the destination for a graphics request, the change might or might not be reflected in the GC. If the pixmap is used simultaneously in a graphics request both as a destination and as a tile or stipple, the results are undefined. For optimum performance, you should draw as much as possible with the same GC (with- out changing its components). The costs of changing GC components relative to using cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 75 different GCs depend upon the display hardware and the server implementation. It is quite likely that some amount of GC information will be cached in display hardware and that such hardware can only cache a small number of GCs. The dashes value is actually a simplified form of the more general patterns that can be set with XSetDashes. Specifying a value of N is equivalent to specifying the two-element list [N,N] in XSetDashes. The value must be non-zero, or a BadValue error results. The value must be less than 256 or exception Range is raised. The clip-mask restricts writes to the destination drawable. If the clip-mask is set to a pixmap, it must have depth one and have the same root as the GC, or a BadMatch error results. If clip-mask is set to NoDrawable, the pixels are always drawn regardless of the clip origin. The clip-mask also can be set by calling the XSetClipRectangles or XSetRegion functions. Only pixels where the clip-mask has a bit set to 1 are drawn. Pixels are not drawn outside the area covered by the clip-mask or where the clip-mask has a bit set to 0. The clip-mask affects all graphics requests. The clip-mask does not clip sources. The clip-mask origin is interpreted relative to the origin of whatever destination drawable is specified in a graphics request. datatype GCSubwindowMode = ClipByChildren | IncludeInferiors You can set the subwindow-mode to ClipByChildren or IncludeInferiors. For Clip- ByChildren, both source and destination windows are additionally clipped by all viewable InputOutputClass children. For IncludeInferiors, neither source nor destination win- dow is clipped by inferiors. This will result in including subwindow contents in the source and drawing through subwindow boundaries of the destination. The use of IncludeInfe- riors on a window of one depth with mapped inferiors of differing depth is not illegal, but the semantics are undefined by the core protocol. datatype GCFillRule = EvenOddRule | WindingRule The fill-rule defines what pixels are inside (drawn) for paths given in XFillPolygon re- quests and can be set to EvenOddRule or WindingRule. For EvenOddRule, a point is inside if an infinite ray with the point as origin crosses the path an odd number of times. For WindingRule, a point is inside if an infinite ray with the point as origin crosses an unequal number of clockwise and counterclockwise directed path segments. A clockwise directed path segment is one that crosses the ray from left to right as observed from the point. A counterclockwise segment is one that crosses the ray from right to left as ob- served from the point. The case where a directed line segment is coincident with the ray is uninteresting because you can simply choose a different ray that is not coincident with a segment. For both EvenOddRule and WindingRule, a point is infinitely small, and the path is an infinitely thin line. A pixel is inside if the center point of the pixel is inside and the center point is not on the boundary. If the center point is on the boundary, the pixel is inside if and only if the polygon interior is immediately to its right (x increasing direction). Pixels with centers on a horizontal edge are a special case and are inside if and only if the polygon interior is immediately below (y increasing direction). datatype GCArcMode = ArcChord | ArcPieSlice The arc-mode controls filling in the XFillArcs function and can be set to ArcPieSlice or ArcChord. For ArcPieSlice, the arcs are pie-slice filled. For ArcChord, the arcs are chord filled. The graphics-exposure flag controls GraphicsExpose event generation for XCopyArea and XCopyPlane requests (and any similar requests defined by extensions). 76 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The XCreateGC function creates a graphics context and returns a GC. The GC can be used with any destination drawable having the same root and depth as the specified drawable. Use with other drawables results in a BadMatch error. The XChangeGC function changes the components specified by values for the specified GC. The values argument contains the values to be set. The values and restrictions are the same as for XCreateGC. Changing the clip-mask overrides any previous XSetClipRect- angles request on the context. Changing the dash-offset or dash-list overrides any previous XSetDashes request on the context. The order in which components are verified and al- tered is server-dependent. If an error is generated, a subset of the components may have been altered. The XFreeGC function destroys the specified GC. 2.10.3 XSetArcMode Types: val XSetArcMode: GC -> GCArcMode -> unit Syntax: XSetArcMode gc mode ; Arguments: gc Specifies the GC. mode Specifies the arc mode. You can pass ArcChord or ArcPieSlice. Argument Type: datatype GCArcMode = ArcChord | ArcPieSlice Description: The XSetArcMode function sets the arc mode in the specified GC. 2.10.4 XSetBackground Types: val XSetBackground: GC -> int -> unit Syntax: XSetBackground gc background ; Arguments: background Specifies the background pixel. gc Specifies the GC. Description: The XSetBackground function sets the background pixel in the specified GC. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 77 2.10.5 XSetClipMask Types: val XSetClipMask: GC -> Drawable -> unit Syntax: XSetClipMask gc pixmap ; Arguments: gc Specifies the GC. pixmap Specifies the pixmap or NoDrawable. Description: The XSetClipMask function sets the clip-mask in the specified GC to the specified pixmap. If the clip-mask is set to NoDrawable, the pixels are are always drawn (regardless of the clip-origin). 2.10.6 XSetClipOrigin Types: val XSetClipOrigin: GC -> XPoint -> unit Syntax: XSetClipOrigin gc origin ; Arguments: gc Specifies the GC. origin Specifies the x and y coordinates of the clip-mask origin. Description: The XSetClipOrigin function sets the clip origin in the specified GC. The clip-mask origin is interpreted relative to the origin of whatever destination drawable is specified in the graphics request. 2.10.7 XSetClipRectangles Types: val XSetClipRectangles: GC -> XPoint -> XRectangle list -> GCOrder -> unit Syntax: 78 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 XSetClipRectangles gc origin rectangles ordering ; Arguments: gc Specifies the GC. origin Specifies the x and y coordinates of the clip-mask origin. rectangles Specifies a list of rectangles that define the clip-mask. ordering Specifies the ordering relations on the rectangles. You can pass Un- sorted, YSorted, YXSorted, or YXBanded. Argument Type: datatype GCOrder = Unsorted | YSorted | YXSorted | YXBanded Description: The XSetClipRectangles function changes the clip-mask in the specified GC to the specified list of rectangles and sets the clip origin. The output is clipped to remain con- tained within the rectangles. The clip-origin is interpreted relative to the origin of what- ever destination drawable is specified in a graphics request. The rectangle coordinates are interpreted relative to the clip-origin. The rectangles should be nonintersecting, or the graphics results will be undefined. Note that the list of rectangles can be empty, which effectively disables output. This is the opposite of passing NoDrawable as the clip-mask in XCreateGC, XChangeGC, and XSetClipMask. If known by the client, ordering relations on the rectangles can be specified with the ordering argument. This may provide faster operation by the server. If an incorrect ordering is specified, the X server may generate a BadMatch error, but it is not required to do so. If no error is generated, the graphics results are undefined. Unsorted means the rectangles are in arbitrary order. YSorted means that the rectangles are nondecreasing in their Y origin. YXSorted additionally constrains YSorted order in that all rectangles with an equal Y origin are nondecreasing in their X origin. YXBanded additionally constrains YXSorted by requiring that, for every possible Y scanline, all rectangles that include that scanline have an identical Y origins and Y extents. 2.10.8 XSetColours Types: val XSetColours: GC -> int -> int -> unit Syntax: XSetColours gc foreground background ; Arguments: background Specifies the background pixel. foreground Specifies the foreground pixel. gc Specifies the GC. Description: The XSetColours convenience function sets the foreground and background components for the specified GC. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 79 2.10.9 XSetDashes Types: val XSetDashes: GC -> int -> int list -> unit Syntax: XSetDashes offset dashes ; Arguments: dashes Specifies the dash-list for the dashed line-style you want to set for the specified GC. offset Specifies the phase of the pattern for the dashed line-style you want to set for the specified GC. Description: The XSetDashes function sets the dash-offset and dash-list attributes for dashed line styles in the specified GC. There must be at least one element in the specified dash-list, or a BadValue error results. The initial and alternating elements (second, fourth, and so on) of the dash-list are the even dashes, and the others are the odd dashes. Each element specifies a dash length in pixels. All of the elements must be non-zero, or a BadValue error results. All of the elements must be less than 256 or exception Range is raised. Specifying an odd-length list is equivalent to specifying the same list concatenated with itself to produce an even-length list. The dash-offset defines the phase of the pattern, specifying how many pixels into the dash- list the pattern should actually begin in any single graphics request. Dashing is continuous through path elements combined with a join-style but is reset to the dash-offset between each sequence of joined lines. The unit of measure for dashes is the same for the ordinary coordinate system. Ideally, a dash length is measured along the slope of the line, but implementations are only required to match this ideal for horizontal and vertical lines. Failing the ideal semantics, it is suggested that the length be measured along the major axis of the line. The major axis is defined as the x axis for lines drawn at an angle of between -45 and +45 degrees or between 315 and 225 degrees from the x axis. For all other lines, the major axis is the y axis. 2.10.10 XSetFillRule Types: val XSetFillRule: GC -> GCFillRule -> unit Syntax: XSetFillRule gc rule ; Arguments: 80 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 gc Specifies the GC. rule Specifies the fill-rule you want to set for the specified GC. You can pass Even- OddRule or WindingRule. Argument Type: datatype GCFillRule = EvenOddRule | WindingRule Description: The XSetFillRule function sets the fill-rule in the specified GC. 2.10.11 XSetFillStyle Types: val XSetFillStyle: GC -> GCFillStyle -> unit Syntax: XSetFillStyle gc style ; Arguments: gc Specifies the GC. style Specifies the fill-style you want to set for the specified GC. You can pass Fill- Solid, FillTiled, FillStippled, or FillOpaqueStippled. Argument Type: datatype GCFillStyle = FillSolid | FillTiled | FillStippled | FillOpaqueStippled Description: The XSetFillStyle function sets the fill-style in the specified GC. 2.10.12 XSetFont Types: val XSetFont: GC -> Font -> unit Syntax: XSetFont gc font ; Arguments: gc Specifies the GC. font Specifies the font. Description: The XSetFont function sets the current font in the specified GC. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 81 2.10.13 XSetForeground Types: val XSetForeground: GC -> int -> unit Syntax: XSetForeground gc foreground ; Arguments: foreground Specifies the foreground pixel. gc Specifies the GC. Description: The XSetForeground function sets the foreground pixel in the specified GC. 2.10.14 XSetFunction Types: val XSetFunction: GC -> GCFunction -> unit Syntax: XSetFunction gc function ; Arguments: function Specifies the drawing function. gc Specifies the GC. Description: XSetFunction sets the drawing function in the specified GC. 2.10.15 XSetGraphicsExposures Types: val XSetGraphicsExposures: GC -> bool -> unit Syntax: XSetGraphicsExposures gc exposures ; Arguments: 82 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 gc Specifies the GC. exposures Specifies a bool that indicates whether you want GraphicsExpose and NoExpose events to be reported when calling XCopyArea and XCopyPlane with this GC. Description: The XSetGraphicsExposures function sets the graphics-exposures flag in the specified GC. 2.10.16 XSetLineAttributes Types: val XSetLineAttributes: GC -> int -> GCLineStyle -> GCCapStyle -> GCJoinStyle -> unit Syntax: XSetLineAttributes gc lineWidth lineStyle capStyle joinStyle ; Arguments: capStyle Specifies the line-style and cap-style you want to set for the specified GC. You can pass CapNotLast, CapButt, CapRound, or CapProjecting. joinStyle Specifies the line join-style you want to set for the specified GC. You can pass JoinMiter, JoinRound, or JoinBevel. lineStyle Specifies the line-style you want to set for the specified GC. You can pass LineSolid, LineOnOffDash, or LineDoubleDash. lineWidth Specifies the line-width you want to set for the specified GC. Description: The XSetLineAttributes function sets the line drawing components in the specified GC. 2.10.17 XSetPlaneMask Types: val XSetPlaneMask: GC -> int -> unit Syntax: XSetPlaneMask gc planeMask ; Arguments: gc Specifies the GC. planeMask Specifies the plane mask. Description: The XSetPlaneMask function sets the plane mask in the specified GC. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 83 2.10.18 XSetState Types: val XSetState: GC -> int -> int -> GCFunction -> int -> unit Syntax: XSetState gc foreground background function planeMask ; Arguments: background Specifies the background pixel. foreground Specifies the foreground pixel. function Specifies the drawing function. gc Specifies the GC. planeMask Specifies the plane mask. Description: The XSetState function sets the foreground, background, plane mask, and function com- ponents for the specified GC. 2.10.19 XSetStipple Types: val XSetStipple: GC -> Drawable -> unit Syntax: XSetStipple gc stipple ; Arguments: gc Specifies the GC. stipple Specifies the stipple you want to set for the specified GC. Description: The XSetStipple function sets the stipple in the specified GC. The stipple and GC must have the same depth, or a BadMatch error results. 84 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.10.20 XSetSubwindowMode Types: val XSetSubwindowMode: GC -> GCSubwindowMode -> unit Syntax: XSetSubwindowMode gc mode ; Arguments: gc Specifies the GC. mode Specifies the subwindow mode. You can pass ClipByChildren or Include- Inferiors. Argument Type: datatype GCSubwindowMode = ClipByChildren | IncludeInferiors Description: The XSetSubwindowMode function sets the subwindow mode in the specified GC. 2.10.21 XSetTile Types: val XSetTile: GC -> Drawable -> unit Syntax: XSetTile gc tile ; Arguments: gc Specifies the GC. tile Specifies the fill tile you want to set for the specified GC. Description: The XSetTile function sets the fill tile in the specified GC. The tile and GC must have the same depth, or a BadMatch error results. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 85 2.10.22 XSetTSOrigin Types: val XSetTSOrigin: GC -> XPoint -> unit Syntax: XSetTSOrigin gc origin ; Arguments: gc Specifies the GC. origin Specifies the x and y coordinates of the tile and stipple origin. Description: The XSetTSOrigin function sets the tile/stipple origin in the specified GC. When graph- ics requests call for tiling or stippling, the parent's origin will be interpreted relative to whatever destination drawable is specified in the graphics request. 2.11 Images 2.11.1 ImageByteOrder, ImageDepth, ImageSize Types: val ImageByteOrder: XImage -> ImageOrder val ImageDepth: XImage -> int val ImageSize: XImage -> XRectangle Argument Type: datatype ImageOrder = LSBFirst | MSBFirst Syntax: val order = ImageByteOrder image ; val depth = ImageDepth image ; val area = ImageSize image ; Description: The ImageByteOrder function returns the byte order value of an XImage. The ImageSize function returns the size in pixels of an XImage. The ImageDepth function returns the depth value of an XImage. 86 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.11.2 VisualRedMask, VisualGreenMask, VisualBlueMask Types: val VisualRedMask: Visual -> int val VisualGreenMask: Visual -> int val VisualBlueMask: Visual -> int Syntax: val redMask = VisualRedMask visual ; val greenMask = VisualGreenMask visual ; val blueMask = VisualBlueMask visual ; Arguments: visual Specifies the visual. Description: These functions return the masks used for Z format images. 2.11.3 XCreateImage, XGetPixel, XPutPixel, XSubImage, XAddPixel Types: val XGetPixel: XImage -> XPoint -> int val XPutPixel: XImage -> XPoint -> int -> unit val XSubImage: XImage -> XRectangle -> XImage val XAddPixel: XImage -> int -> unit val XCreateImage: Visual -> int -> ImageFormat -> int -> string -> XRectangle -> int -> int -> XImage Syntax: val image = XCreateImage visual depth format offset data area bitmapPad bytesPerLine ; val pixel = XGetPixel image point ; val image = XSubImage image subArea ; XPutPixel image point pixel ; XAddPixel image value ; Arguments: bitmapPad Specifies the quantum of a scanline (8, 16, or 32 bits). In other words, the start of one scanline is separated in client memory from the start of the next scanline by an integer multiple of this many bits. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 87 bytesPerLine Specifies the number of bytes in the client image between the start of one scanline and the start of the next. data Specifies the image data. depth Specifies the depth of the image. format Specifies the format for the image. You can pass XYBitmap, XYP- ixmap, or ZPixmap. area Specifies the width and height of the image, in pixels. offset Specifies the number of pixels to ignore at the beginning of the scan- line. pixel Specifies the new pixel value. subArea Specifies the position and size of the new subimage, in pixels. value Specifies the constant value that is to be added. visual Specifies the visual. ximage Specifies the image. point Specifies the x and y coordinates. Argument Type: datatype ImageFormat = XYBitmap | XYPixmap | ZPixmap datatype ImageOrder = LSBFirst | MSBFirst type ImageData val Data: string -> ImageData datatype XImage = XImage of { data: ImageData, size: XRectangle, depth: int, format: ImageFormat, xoffset: int, bitmapPad: int, byteOrder: ImageOrder, bitmapUnit: int, bitsPerPixel: int, bytesPerLine: int, visualRedMask: int, bitmapBitOrder: ImageOrder, visualBlueMask: int, visualGreenMask: int } Description: The XCreateImage function initializes the XImage byteOrder, bitmapBitOrder, and bitmapUnit values from the display and returns an XImage structure. The red, green, and blue mask values are defined for Z format images only and are derived from the Visual structure passed in. Other values also are passed in. The offset permits the rapid displaying of the image without requiring each scanline to be shifted into position. If you pass a zero value in bytesPerLine, Xlib assumes that the scanlines are contiguous in memory and calculates the value of bytesPerLine itself. 88 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 The XGetPixel function returns the specified pixel from the named image. The pixel value is returned in normalized format (that is, the least-significant byte of the int is the least-significant byte of the pixel). The image must contain the x and y coordinates. The XPutPixel function overwrites the pixel in the named image with the specified pixel value. The input pixel value must be in normalized format (that is, the least-significant byte of the int is the least-significant byte of the pixel). The image must contain the x and y coordinates. The XSubImage function creates a new image that is a subsection of an existing one. The data is copied from the source image, and the image must contain the rectangle defined by subArea. If XSubImage fails then exception XWindows is raised with "XSubImage failed" . The XAddPixel function adds a constant value to every pixel in an image. It is useful when you have a base pixel value from allocating colour resources and need to manipulate the image to that form. 2.11.4 XPutImage, XGetImage, XGetSubImage Types: val XPutImage: Drawable -> GC -> XImage -> XPoint -> XRectangle -> unit val XGetImage: Drawable -> XRectangle -> int -> ImageFormat -> XImage val XGetSubImage: Drawable -> XRectangle -> int -> ImageFormat -> XImage -> XPoint -> unit Syntax: val image = XGetImage d area planeMask format ; XGetSubImage d area planeMask format destImage destPoint ; XPutImage d gc image srcPoint destArea ; Arguments: d Specifies the drawable. destImage Specifies the destination image. destPoint Specifies the x and y coordinates, which are relative to the origin of the drawable and are the coordinates of the subimage or which are relative to the origin of the destination rectangle, specify its upper-left corner, and determine where the subimage is placed in the destination image. format Specifies the format for the image. You can pass XYBitmap, XYP- ixmap, or ZPixmap. gc Specifies the GC. image Specifies the image you want combined with the rectangle. planeMask Specifies the plane mask. srcPoint Specifies the offsets from the left and top edges of the image defined by the XImage structure. area Specifies the position and size of the subimage, cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 89 destArea Specifies coordinates relative to the origin of the drawable to define the destination rectangle. Description: The XPutImage function combines an image in memory with a rectangle of the specified drawable. If XYBitmap format is used, the depth must be one, or a BadMatch error results. The foreground pixel in the GC defines the source for the one bits in the image, and the background pixel defines the source for the zero bits. For XYPixmap and ZPixmap, the depth must match the depth of the drawable, or a BadMatch error results. The section of the image defined by the srcPoint and area arguments is drawn on the specified part of the drawable at the position specified by destArea This function uses these GC components: foreground, background, function, plane-mask, subwindow-mode, clip-origin, and clip-mask. The XGetImage function returns an XImage structure. This structure provides you with the contents of the specified rectangle of the drawable in the format you specify. If the format argument is XYPixmap, the image contains only the bit planes you passed to the planeMask argument. If the planeMask argument only requests a subset of the planes of the display, the depth of the returned image will be the number of planes requested. If the format argument is ZPixmap, XGetImage returns as zero the bits in all planes not specified in the planeMask argument. The function performs no range checking on the values in planeMask and ignores extraneous bits. XGetImage returns the depth of the image to the depth member of the XImage struc- ture. The depth of the image is as specified when the drawable was created, except when getting a subset of the planes in XYPixmap format, when the depth is given by the number of bits set to 1 in planeMask. If the drawable is a pixmap, the given rectangle must be wholly contained within the pixmap, or a BadMatch error results. If the drawable is a window, the window must be viewable, and it must be the case that if there were no inferiors or overlapping windows, the specified rectangle of the window would be fully visible on the screen and wholly contained within the outside edges of the window, or a BadMatch error results. Note that the borders of the window can be included and read with this request. If the window has backing-store, the backing-store contents are returned for regions of the window that are obscured by noninferior windows. If the window does not have backing-store, the returned contents of such obscured regions are undefined. The returned contents of visible regions of inferiors of a different depth than the specified window's depth are also undefined. The pointer cursor image is not included in the returned contents. If XGetImage fails then exception XWindows is raised with "XGetImage failed" . The XGetSubImage function updates destImage with the specified subimage in the same manner as XGetImage. If the format argument is XYPixmap, the image contains only the bit planes you passed to the planeMask argument. If the format argument is ZPixmap, XGetSubImage returns as zero the bits in all planes not specified in the planeMask argument. The function performs no range checking on the values in planeMask and ignores extraneous bits. The depth of the destination XImage structure must be the same as that of the drawable. If the specified subimage does not fit at the specified location on the destination image, the right and bottom edges are clipped. If the drawable is a pixmap, the given rectangle must be wholly contained within the pixmap, or a BadMatch error results. If the drawable is a window, the window must be viewable, and it must be the case that if there were no inferiors or overlapping windows, the specified rectangle of the window would be fully visible on the screen and wholly contained within the outside edges of the window, or a BadMatch error results. If the window has backing-store, then the backing-store contents 90 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 are returned for regions of the window that are obscured by noninferior windows. If the window does not have backing-store, the returned contents of such obscured regions are undefined. The returned contents of visible regions of inferiors of a different depth than the specified window's depth are also undefined. 2.12 Properties and Selections 2.12.1 XDeleteProperty Types: val XDeleteProperty: Drawable -> int -> unit Syntax: XDeleteProperty w property ; Arguments: property Specifies the property name. w Specifies the window containing the property. Description: The XDeleteProperty function deletes the specified property only if the property was defined on the specified window and causes the X server to generate a PropertyNotify event on the window unless the property does not exist. 2.12.2 XInternAtom, XGetAtomName Types: val XInternAtom: string -> bool -> int val XGetAtomName: int -> string Syntax: val atom = XInternAtom name onlyIfExists ; val name = XGetAtomName atom ; Arguments: atom Specifies the atom whose name you want returned. name Specifies the name associated with the atom you want returned. onlyIfExists Specifies a bool that indicates whether XInternAtom creates the atom. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 91 Description: The XInternAtom function returns the atom identifier associated with the specified name string. If onlyIfExists is false, the atom is created if it does not exist, otherwise, XInternAtom returns zero. You should use an ISO Latin-1 string for name. Case matters; the strings "thing" , "Thing" , and "thinG" all designate different atoms. The atom will remain defined even after the client's connection closes. It will become undefined only when the last connection to the X server closes. The XGetAtomName function returns the name associated with the specified atom. If XGetAtomName fails then exception XWindows is raised with "XGetAtomName failed" . 2.12.3 XSetProperty, XGetTextProperty Types: val XSetProperty: Drawable -> int -> PropertyValue -> int -> unit val XGetTextProperty: Drawable -> int -> (string * int * int * int) Syntax: XSetProperty w propertyAtom propertyValue propertyTypeAtom ; val (value,encoding,format,nitems) = XGetTextProperty w propertyAtom ; Arguments: w Specifies the window propertyAtom Specifies the property name as an Atom. propertyValue Specifies the property value as one of the predefined types. propertyTypeAtom Specifies the name of the property type as an Atom. value Returns the contents of the property as chars/bytes. encoding Returns the property type atom format Returns the property format which is 1, 2 or 4 bytes per item. nitems Returns the number of items in the value Argument Type: datatype PropertyValue = PropertyArc of XArc list | PropertyAtom of int list | PropertyBitmap of Drawable list | PropertyColormap of Colormap list | PropertyCursor of Cursor list | PropertyDrawable of Drawable list | PropertyFont of Font list | PropertyInteger of int list | PropertyPixmap of Drawable list | PropertyPoint of XPoint list | PropertyRectangle of XRectangle list | PropertyRGBColormap of XStandardColormap list | PropertyString of string 92 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 | PropertyVisual of Visual list | PropertyWindow of Drawable list | PropertyWMHints of XWMHint list | PropertyWMSizeHints of XWMSizeHint list | PropertyWMIconSizes of (XRectangle * XRectangle * XRectangle) list Properties: WM__CLIENT__MACHINE The string name of the machine on which the client application is running. WM__COMMAND The command and arguments, separated by ASCII nulls, used to invoke the application. WM__ICON__NAME Name to be used in icon. WM__NAME Name of the application. Description: The XSetProperty function replaces the existing, specified property for the named win- dow with the value and type specified. If the property does not already exist, XSetProp- erty creates it for the specified window. The XGetTextProperty function reads the specified property from the window. The particular interpretation of the property's encoding and value as 'text' is left to the call- ing application. If the specified property does not exist on the window, then exception XWindows is raised with "XGetTextProperty failed" . 2.12.4 XSetSelectionOwner, XGetSelectionOwner, XConvertSelection, XSendSelectionNotify Types: val XSetSelectionOwner: int -> Drawable -> int -> unit val XGetSelectionOwner: int -> Drawable val XConvertSelection: { selection: int, target: int, property: int, requestor: Drawable, time: int } -> unit val XSendSelectionNotify: { selection: int, target: int, property: int, requestor: Drawable, time: int } -> unit Syntax: XSetSelectionOwner selection owner time ; val owner = XGetSelectionOwner selection ; XConvertSelection {selection,target,property,requestor,time} ; XSendSelectionNotify {selection,target,property,requestor,time} ; cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 93 Arguments: selection Specifies the selection atom. owner Specifies/returns the owner of the specified selection atom. You can pass a window or NoDrawable. time Specifies the time. You can pass either a timestamp or CurrentTime. target Specifies the target atom. property Specifies the property name. You also can pass zero. requestor Specifies the requestor. Argument Type: val CurrentTime: int Description: The XSetSelectionOwner function changes the owner and last-change time for the spec- ified selection and has no effect if the specified time is earlier than the current last-change time of the specified selection or is later than the current X server time. Otherwise, the last-change time is set to the specified time, with CurrentTime replaced by the current server time. If the owner window is specified as NoDrawable, then the owner of the selection becomes NoDrawable (that is, no owner). Otherwise, the owner of the selection becomes the client executing the request. If the new owner (whether a client or NoDrawable) is not the same as the current owner of the selection and the current owner is not NoDrawable, the current owner is sent a SelectionClear event. If the client that is the owner of a selection is later terminated (that is, its connection is closed) or if the owner window it has specified in the request is later destroyed, the owner of the selection automatically reverts to NoDrawable, but the last-change time is not affected. The selection atom is uninterpreted by the X server. XGetSelectionOwner returns the owner window, which is reported in SelectionRe- quest and SelectionClear events. Selections are global to the X server. The XGetSelectionOwner function returns the Drawable associated with the window that currently owns the specified selection. If no selection was specified, the function returns the constant NoDrawable. If NoDrawable is returned, there is no owner for the selection. XConvertSelection requests that the specified selection be converted to the specified target type: If the specified selection has an owner, the X server sends a SelectionRequest event to that owner. If no owner for the specified selection exists, the X server generates a SelectionNotify event to the requestor with property zero. The arguments are passed on unchanged in either of the events. There are two predefined selection atoms: XA__PRIMARY and XA__SECONDARY. XSendSelectionNotify is called when you have received a SelectionRequest event asking for the selection, which you currently own, to be converted to some desired type. When you have completed the conversion you store the converted value in the indicated property on the window. Then you call XSendSelectionNotify with the same parameters as the SelectionRequest event to indicate that the conversion was successful. If cannot 94 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 perform the conversion then you call XSendSelectionNotify with property set to zero to indicate that the conversion failed. If the conversion was successful then the requestor will read the value from the property on the window, and will delete the property to indicate that the transfer has been completed. 2.13 Screen Saver 2.13.1 XSetScreenSaver, XForceScreenSaver, XActivateScreenSaver, XResetScreenSaver, XGetScreenSaver Types: val XSetScreenSaver: int -> int -> Blanking -> Exposures -> unit val XForceScreenSaver: SaveMode -> unit val XActivateScreenSaver: unit -> unit val XResetScreenSaver: unit -> unit val XGetScreenSaver: unit -> (int * int * Blanking * Exposures) Syntax: XSetScreenSaver timeout interval preferBlanking allowExposures ; XForceScreenSaver mode ; XActivateScreenSaver() ; XResetScreenSaver() ; val (timeout,interval,preferBlanking,allowExposures) = XGetScreenSaver() ; Arguments: allowExposures Specifies/returns the screen save control values. You can pass DontAllowExposures, AllowExposures, or DefaultExpo- sures. interval Specifies/returns the interval, in seconds, between screen saver al- terations. mode Specifies the mode that is to be applied. You can pass Screen- SaverActive or ScreenSaverReset. preferBlanking Specifies/returns how to enable screen blanking. You can pass DontPreferBlanking, PreferBlanking, or DefaultBlanking. timeout Specifies the timeout, in seconds, until the screen saver turns on. Argument Type: datatype SaveMode = ScreenSaverReset | ScreenSaverActive datatype Blanking = DontPreferBlanking | PreferBlanking | DefaultBlanking datatype Exposures = DontAllowExposures | AllowExposures | DefaultExposures Description: Timeout and interval are specified in seconds. A timeout of 0 disables the screen saver (but an activated screen saver is not deactivated), and a timeout of "1 restores the de- fault. Other negative values generate a BadValue error. If the timeout value is non-zero, cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 95 XSetScreenSaver enables the screen saver. An interval of 0 disables the random-pattern motion. If no input from devices (keyboard, mouse, and so on) is generated for the specified number of timeout seconds once the screen saver is enabled, the screen saver is activated. For each screen, if blanking is preferred and the hardware supports video blanking, the screen simply goes blank. Otherwise, if either exposures are allowed or the screen can be regenerated without sending Expose events to clients, the screen is tiled with the root window background tile randomly re-origined each interval minutes. Otherwise, the screens' state do not change, and the screen saver is not activated. The screen saver is deactivated, and all screen states are restored at the next keyboard or pointer input or at the next call to XForceScreenSaver with mode ScreenSaverReset. If the server-dependent screen saver method supports periodic change, the interval argu- ment serves as a hint about how long the change period should be, and zero hints that no periodic change should be made. Examples of ways to change the screen include scram- bling the colormap periodically, moving an icon image around the screen periodically, or tiling the screen with the root window background tile, randomly re-origined periodically. If the specified mode is ScreenSaverActive and the screen saver currently is deactivated, XForceScreenSaver activates the screen saver even if the screen saver had been disabled with a timeout of zero. If the specified mode is ScreenSaverReset and the screen saver currently is enabled, XForceScreenSaver deactivates the screen saver if it was activated, and the activation timer is reset to its initial state (as if device input had been received). The XActivateScreenSaver function activates the screen saver. The XResetScreenSaver function resets the screen saver. The XGetScreenSaver function gets the current screen saver values. 2.14 Tiles, Stipples, Bitmaps and Pixmaps 2.14.1 XCreatePixmap, XFreePixmap Types: val XCreatePixmap: Drawable -> XRectangle -> int -> Drawable val XFreePixmap: Drawable -> unit Syntax: val pixmap = XCreatePixmap d area depth ; XFreePixmap pixmap ; Arguments: d Specifies which screen the pixmap is created on. depth Specifies the depth of the pixmap. pixmap Specifies the pixmap. area Specifies the width and height, which define the dimensions of the pixmap. 96 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The XCreatePixmap function creates a pixmap of the width, height, and depth you specified and returns a Drawable that identifies it. It is valid to pass an InputOnlyClass window to the drawable argument. The width and height arguments must be non-zero, or a BadValue error results. The depth argument must be one of the depths supported by the screen of the specified drawable, or a BadValue error results. The server uses the specified drawable to determine on which screen to create the pixmap. The pixmap can be used only on this screen and only with other drawables of the same depth (see XCopyPlane for an exception to this rule). The initial contents of the pixmap are undefined. The XFreePixmap function first deletes the association between the Drawable value and the pixmap in the server. Then, the X server frees the pixmap storage when there are no references to it. The pixmap should never be referenced again. 2.14.2 XReadBitmapFile, XWriteBitmapFile, XCreatePixmapFromBitmapData, XCreateBitmapFromData Types: val XReadBitmapFile: Drawable -> string -> BitmapStatus val XWriteBitmapFile: string -> Drawable -> XRectangle -> XPoint -> BitmapStatus val XCreatePixmapFromBitmapData: Drawable -> string -> XRectangle -> int -> int -> int -> Drawable val XCreateBitmapFromData: Drawable -> string -> XRectangle -> Drawable Syntax: val status = XReadBitmapFile d filename ; val status = XWriteBitmapFile filename bitmap area hotspot ; val pixmap = XCreatePixmapFromBitmapData d data area fg bg depth ; val bitmap = XCreateBitmapFromData d data area ; Arguments: bitmap Specifies the bitmap. status Returns the bitmap that is created, or an error condition. d Specifies the drawable that indicates the screen. data Specifies the data in bitmap format. depth Specifies the depth of the pixmap. fg Specifies the foreground and bg background pixel values to use. filename Specifies the file name to use. area Specifies the width and height. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 97 hotspot Specifies where to place the hotspot coordinates, or ("1,"1) if none are present in the file. Argument Type: datatype BitmapStatus = BitmapOpenFailed | BitmapFileInvalid | BitmapNoMemory | BitmapSuccess of Drawable * XRectangle * XPoint Description: The XReadBitmapFile function reads in a file containing a bitmap. The ability to read other than the standard format is implementation dependent. If the file cannot be opened, XReadBitmapFile returns BitmapOpenFailed. If the file can be opened but does not contain valid bitmap data, it returns BitmapFileInvalid. If insufficient working storage is allocated, it returns BitmapNoMemory. If the file is readable and valid, it returns BitmapSuccess. XReadBitmapFile reads the bitmap's height and width from the file. It then creates a pixmap of the appropriate size and reads the bitmap data from the file into the pixmap. The caller must free the bitmap using XFreePixmap when finished. If the hotspot is defined in the bitmap file, XReadBitmapFile returns the hotspot in the status as well, otherwise it returns ("1,"1). The XWriteBitmapFile function writes a bitmap out to a file in the X version 11 format. If the file cannot be opened for writing, it returns BitmapOpenFailed. If insufficient memory is allocated, XWriteBitmapFile returns BitmapNoMemory; otherwise, on no error, it returns BitmapSuccess. If the hotspot is not ("1,"1), XWriteBitmapFile writes it out as the hotspot coordinates for the bitmap. The XCreatePixmapFromBitmapData function creates a pixmap of the given depth and then does a bitmap-format XPutImage of the data into it. The depth must be supported by the screen of the specified drawable, or a BadMatch error results. The XCreateBitmapFromData function allows you to include a bitmap file without reading in the bitmap file. The following example creates a weave bitmap: val data = [17, 17, 184, 184, 124, 124, 58, 58, 17, 17, 163, 163, 199, 199, 139, 139, 17, 17, 184, 184, 124, 124, 58, 58, 17, 17, 163, 163, 199, 199, 139, 139] ; fun MakeData [] = "" | MakeData (H::T) = chr H ^ MakeData T ; val wideWeave = XCreateBitmapFromData root (MakeData data) (Area{x=0,y=0,w=16,h=16}) ; If insufficient working storage was allocated, XCreateBitmapFromData returns NoDrawable. It is your responsibility to free the bitmap using XFreePixmap when finished. 98 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.15 User Preferences 2.15.1 XAutoRepeatOn, XAutoRepeatOff, XBell, XQueryKeymap Types: val XAutoRepeatOff: unit -> unit val XAutoRepeatOn: unit -> unit val XBell: int -> unit val XQueryKeymap: unit -> bool list (* 256 bools *) Syntax: XAutoRepeatOn() ; XAutoRepeatOff() ; XBell percent ; val keymap = XQueryKeymap() ; Arguments: percent Specifies the volume for the bell, which can range from "100 to 100 inclusive. keymap Returns the keyboard state vector Description: The XAutoRepeatOn function turns on auto-repeat for the keyboard. The XAutoRepeatOff function turns off auto-repeat for the keyboard. The XBell function rings the bell on the keyboard on the specified display, if possible. The specified volume is relative to the base volume for the keyboard. If the value for the percent argument is not in the range "100 to 100 inclusive, a BadValue error results. The volume at which the bell rings when the percent argument is nonnegative is: base - (base * percent) / 100 + percent The volume at which the bell rings when the percent argument is negative is: base + (base * percent) / 100 To change the base volume of the bell, use XChangeKeyboardControl. The XQueryKeymap function returns a bit vector for the logical state of the keyboard. The vector is returned as a list of 256 bools, representing the keys 0 to 255 in that order. Each bool set to true indicates that the corresponding key is currently pressed. Note that the logical state of a device (as seen by client applications) may lag the physical state if device event processing is frozen. 2.15.2 XGetDefault Types: val XGetDefault: string -> string -> string cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 99 Syntax: val default = XGetDefault program option ; Arguments: option Specifies the option name. program Specifies the program name. Description: XGetDefault returns the value for the program and option entry in the user's defaults database. If XGetDefault fails then exception XWindows is raised with "XGetDefault failed" . 2.16 Windows 2.16.1 XCreateWindow, XCreateSimpleWindow Types: val XCreateWindow: Drawable -> XPoint -> XRectangle -> int -> int -> WindowClass -> Visual -> XSetWindowAttributes list -> Drawable val XCreateSimpleWindow: Drawable -> XPoint -> XRectangle -> int -> int -> int -> Drawable Syntax: val window = XCreateWindow parent point area borderWidth depth class visual attributes ; val window = XCreateSimpleWindow parent point area borderWidth borderPixel backgroundPixel ; Arguments: attributes Specifies the initial values for the window's attributes. backgroundPixel Specifies the background pixel value of the window. borderPixel Specifies the border pixel value of the window. borderWidth Specifies the width of the window's border in pixels. class Specifies the window's class. You can pass InputOutput- Class, InputOnlyClass, or CopyFromParentClass. A class of CopyFromParentClass means the class is taken from the parent. depth Specifies the window's depth. A depth of zero means the depth is taken from the parent. parent Specifies the parent window. 100 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 visual Specifies the visual type. A visual of CopyFromParentVisual means the visual type is taken from the parent. area Specifies the width and height, which are the created window's inside dimensions and do not include the created window's bor- ders. point Specifies the x and y coordinates, which are the top-left outside corner of the window's borders and are relative to the inside of the parent window's borders. Argument Type: datatype XSetWindowAttributes = CWBackPixmap of Drawable | CWBackPixel of int | CWBorderPixmap of Drawable | CWBorderPixel of int | CWBitGravity of Gravity | CWWinGravity of Gravity | CWBackingStore of BackingStore | CWBackingPlanes of int | CWBackingPixel of int | CWOverrideRedirect of bool | CWSaveUnder of bool | CWEventMask of EventMask list | CWDontPropagate of EventMask list | CWColormap of Colormap | CWCursor of Cursor datatype BackingStore = NotUseful | WhenMapped | Always datatype WindowClass = CopyFromParentClass | InputOutputClass | InputOnlyClass Description: The XCreateWindow function creates an unmapped subwindow for a specified parent window, returns the Drawable value for the created window, and causes the X server to generate a CreateNotify event. The created window is placed on top in the stacking order with respect to siblings. The borderWidth for an InputOnlyClass window must be zero, or a BadMatch error results. For class InputOutputClass, the visual type and depth must be a combination supported for the screen, or a BadMatch error results. The depth need not be the same as the parent, but the parent must not be a window of class InputOnlyClass, or a BadMatch error results. For an InputOnlyClass window, the depth must be zero, and the visual must be one supported by the screen. If either condition is not met, a BadMatch error results. The parent window, however, may have any depth and class. If you specify any invalid window attribute for a window, a BadMatch error results. The created window is not yet displayed (mapped) on the user's display. To display the window, call XMapWindow. The new window initially uses the same cursor as its parent. A new cursor can be defined for the new window by calling XDefineCursor. The window will not be visible on the screen unless it and all of its ancestors are mapped and it is not obscured by any of its ancestors. If XCreateWindow fails then exception XWindows is raised with "XCreateWindow failed" . cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 101 The XCreateSimpleWindow function creates an unmapped InputOutputClass sub- window for a specified parent window, returns the Drawable value for the created window, and causes the X server to generate a CreateNotify event. The created window is placed on top in the stacking order with respect to siblings. Any part of the window that extends outside its parent window is clipped. The borderWidth for an InputOnlyClass win- dow must be zero, or a BadMatch error results. XCreateSimpleWindow inherits its depth, class, and visual from its parent. All other window attributes, except background and border, have their default values. If XCreateSimpleWindow fails then exception XWindows is raised with "XCreateSimpleWindow failed" . 2.16.2 XDestroyWindow, XDestroySubwindows Types: val XDestroyWindow: Drawable -> unit val XDestroySubwindows: Drawable -> unit Syntax: XDestroyWindow w ; XDestroySubwindows w ; Arguments: w Specifies the window. Description: The XDestroyWindow function destroys the specified window as well as all of its sub- windows and causes the X server to generate a DestroyNotify event for each window. The window should never be referenced again. If the window specified by the w argument is mapped, it is unmapped automatically. The ordering of the DestroyNotify events is such that for any given window being destroyed, DestroyNotify is generated on any inferiors of the window before being generated on the window itself. The ordering among siblings and across subhierarchies is not otherwise constrained. If the window you specified is a root window, no windows are destroyed. Destroying a mapped window will generate Expose events on other windows that were obscured by the window being destroyed. The XDestroySubwindows function destroys all inferior windows of the specified win- dow, in bottom-to-top stacking order. It causes the X server to generate a DestroyNotify event for each window. If any mapped subwindows were actually destroyed, XDestroy- Subwindows causes the X server to generate Expose events on the specified window. This is much more efficient than deleting many windows one at a time because much of the work need be performed only once for all of the windows, rather than for each window. The subwindows should never be referenced again. If XDestroySubwindows fails then exception XWindows is raised with "XDestroySubwindows failed" . 2.16.3 XGetGeometry, XGetWindowAttributes Types: 102 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 val XGetGeometry: Drawable -> (Drawable * XPoint * XRectangle * int * int) val XGetWindowAttributes: Drawable -> XWindowAttributes Syntax: val (root,position,size,borderWidth,depth) = XGetGeometry w ; val attributes = XGetWindowAttributes w ; Arguments: d Specifies the drawable, which can be a window or a pixmap. root Returns the root window position Returns the x and y coordinates that define the location of the draw- able. For a window, these coordinates specify the upper-left outer corner relative to its parent's origin. For pixmaps, these coordinates are always zero. size Returns the drawable's dimensions (width and height). borderWidth Returns the border width in pixels. depth Returns the depth of the drawable (bits per pixel for the object). Argument Type: datatype WindowClass = CopyFromParentClass | InputOutputClass | InputOnlyClass datatype MapState = IsUnmapped | IsUnviewable | IsViewable datatype Gravity = ForgetGravity | NorthWestGravity | NorthGravity | NorthEastGravity | WestGravity | CenterGravity | EastGravity | SouthWestGravity | SouthGravity | SouthEastGravity | StaticGravity val UnmapGravity: Gravity (* same as ForgetGravity *) datatype BackingStore = NotUseful | WhenMapped | Always val NoColormap: Colormap datatype XWindowAttributes = XWindowAttributes of { position: XPoint, size: XRectangle, borderWidth: int, depth: int, visual: Visual, root: Drawable, class: WindowClass, bitGravity: Gravity, winGravity: Gravity, backingStore: BackingStore, backingPlanes: int, backingPixel: int, cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 103 saveUnder: bool, colormap: Colormap, mapInstalled: bool, mapState: MapState, allEventMasks: EventMask list, yourEventMask: EventMask list, doNotPropagateMask: EventMask list, overrideRedirect: bool } Argument Description: The position member is set to the upper-left outer corner relative to the parent window's origin. The size member is set to the inside size of the window, not including the border. The borderWidth member is set to the window's border width in pixels. The depth member is set to the depth of the window (that is, bits per pixel for the object). The visual member the screen's associated Visual structure. The root member is set to the root window of the screen containing the window. The class member is set to the window's class and can be either InputOutputClass or InputOnlyClass. The bitGravity member is set to the window's bit gravity and can be one of the following: ForgetGravity EastGravity NorthWestGravity SouthWestGravity NorthGravity SouthGravity NorthEastGravity SouthEastGravity WestGravity StaticGravity CenterGravity The winGravity member is set to the window's window gravity and can be one of the following: UnmapGravity EastGravity NorthWestGravity SouthWestGravity NorthGravity SouthGravity NorthEastGravity SouthEastGravity WestGravity StaticGravity CenterGravity The backingStore member is set to indicate how the X server should maintain the contents of a window and can be WhenMapped, Always, or NotUseful. The backingPlanes member is set to indicate (with bits set to 1) which bit planes of the window hold dynamic data that must be preserved in backing-stores and during save-unders. The backingPixel member is set to indicate what values to use for planes not set in backingPlanes. The saveUnder member is set to true or false. The colormap member is set to the colormap for the specified window and can be a Colormap or NoColormap. The mapInstalled member is set to indicate whether the colormap is currently installed and can be true or false. The mapState member is set to indicate the state of the window and can be IsUnmapped, IsUnviewable, or IsViewable. IsUnviewable is used if the window is mapped but some ancestor is unmapped. The allEventMasks member is set to the event masks selected on the window by all clients. The yourEventMask member is set to the event masks selected by the querying client. The doNotPropagateMask member is set to the list of events that should not propagate. The overrideRedirect member is set to indicate whether this window overrides structure control facilities and can be true or false. Window manager clients should ignore the window if this member is true. 104 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The XGetWindowAttributes function returns the current attributes for the specified window as an XWindowAttributes structure. If XGetWindowAttributes fails then exception XWindows is raised with "XGetWin- dowAttributes failed" . The XGetGeometry function returns the root window and the current geometry of the drawable. The geometry of the drawable includes the position as x and y coordinates, the size as width and height, the border width, and the depth. These are described in the argument list. It is legal to pass to this function a window whose class is InputOnlyClass. If XGetGeometry fails then exception XWindows is raised with "XGetGeometry failed" . 2.16.4 XGetWindowRoot, XGetWindowPosition, XGetWindowSize, XGetWindowBorderWidth, XGetWindowDepth, XGetWindowParent, XGetWindowChildren Types: val XGetWindowRoot: Drawable -> Drawable val XGetWindowPosition: Drawable -> XPoint val XGetWindowSize: Drawable -> XRectangle val XGetWindowBorderWidth: Drawable -> int val XGetWindowDepth: Drawable -> int val XGetWindowParent: Drawable -> Drawable val XGetWindowChildren: Drawable -> Drawable list Description: These convenience functions return the individual attributes returned in bulk by XGet- Geometry and XQueryTree. XGetWindowRoot returns the root window for the drawable. XGetWindowPosition returns the coordinates of the outer top left corner of the window. XGetWindowSize returns the inside size of the window. XGetWindowBorderWidth returns the border width in pixels of the window. XGetWindowDepth returns the depth of the window. XGetWindowParent returns the parent window of the specified window. XGetWin- dowChildren returns the children of the specified window. 2.16.5 XChangeWindowAttributes, XSetWindowBackground, XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap Types: val XChangeWindowAttributes: Drawable -> XSetWindowAttributes list -> unit val XSetWindowBackground: Drawable -> int -> unit val XSetWindowBackgroundPixmap: Drawable -> Drawable -> unit val XSetWindowBorder: Drawable -> int -> unit val XSetWindowBorderPixmap: Drawable -> Drawable -> unit cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 105 Syntax: XChangeWindowAttributes w attributes ; XSetWindowBackground w backgroundPixel ; XSetWindowBackgroundPixmap w backgroundPixmap ; XSetWindowBorder w borderPixel ; XSetWindowBorderPixmap w borderPixmap ; Arguments: attributes Specifies the list of attributes to change. backgroundPixel Specifies the pixel that is to be used for the background. backgroundPixmap Specifies the background pixmap, ParentRelative, or NoDrawable. borderPixel Specifies the entry in the colormap. borderPixmap Specifies the border pixmap or CopyFromParentDrawable. w Specifies the window. Argument Type: datatype XSetWindowAttributes = CWBackPixmap of Drawable | CWBackPixel of int | CWBorderPixmap of Drawable | CWBorderPixel of int | CWBitGravity of Gravity | CWWinGravity of Gravity | CWBackingStore of BackingStore | CWBackingPlanes of int | CWBackingPixel of int | CWOverrideRedirect of bool | CWSaveUnder of bool | CWEventMask of EventMask list | CWDontPropagate of EventMask list | CWColormap of Colormap | CWCursor of Cursor Description: The XChangeWindowAttributes function uses the window attributes in the XSetWindowAttributes list to change the specified window attributes. Changing the background does not cause the window contents to be changed. To repaint the window and its background, use XClearWindow. Setting the border or changing the background such that the border tile origin changes causes the border to be repainted. Changing the background of a root window to NoDrawable or ParentRelative restores the default background pixmap. Changing the border of a root window to CopyFromParentDraw- able restores the default border pixmap. Changing the win-gravity does not affect the current position of the window. Changing the backing-store of an obscured window to WhenMapped or Always, or changing the backing-planes, backing-pixel, or save-under of a mapped window may have no immediate effect. Changing the colormap of a window (that is, defining a new map, not changing the contents of the existing map) generates a ColormapNotify event. Changing the colormap of a visible window may have no imme- diate effect on the screen because the map may not be installed (see XInstallColormap). 106 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Changing the cursor of a root window to NoCursor restores the default cursor. Whenever possible, you are encouraged to share colormaps. Multiple clients can select input on the same window. Their event masks are maintained separately. When an event is generated, it is reported to all interested clients. However, only one client at a time can select for SubstructureRedirectMask, ResizeRedirect- Mask, and ButtonPressMask. If a client attempts to select any of these event masks and some other client has already selected one, a BadAccess error results. There is only one do-not-propagate-mask for a window, not one per client. The XSetWindowBackground function sets the background of the window to the spec- ified pixel value. Changing the background does not cause the window contents to be changed. XSetWindowBackground uses a pixmap of undefined size filled with the pixel value you passed. If you try to change the background of an InputOnlyClass window, a BadMatch error results. The XSetWindowBackgroundPixmap function sets the background pixmap of the window to the specified pixmap. The background pixmap can immediately be freed if no further explicit references to it are to be made. If ParentRelative is specified, the background pixmap of the window's parent is used, or on the root window, the default background is restored. If you try to change the background of an InputOnlyClass window, a BadMatch error results. If the background is set to NoDrawable, the window has no defined background. The XSetWindowBorder function sets the border of the window to the pixel value you specify. If you attempt to perform this on an InputOnlyClass window, a BadMatch error results. The XSetWindowBorderPixmap function sets the border pixmap of the window to the pixmap you specify. The border pixmap can be freed immediately if no further explicit references to it are to be made. If you specify CopyFromParentDrawable, a copy of the parent window's border pixmap is used. If you attempt to perform this on an InputOnlyClass window, a BadMatch error results. 2.16.6 XConfigureWindow, XMoveWindow, XResizeWindow, XMoveResizeWindow, XSetWindowBorderWidth Types: val XConfigureWindow: Drawable -> XWindowChanges list -> unit val XMoveWindow: Drawable -> XPoint -> unit val XResizeWindow: Drawable -> XRectangle -> unit val XMoveResizeWindow: Drawable -> XPoint -> XRectangle -> unit val XSetWindowBorderWidth: Drawable -> int -> unit Syntax: XConfigureWindow w changes ; XMoveWindow w origin ; XResizeWindow w area ; XMoveResizeWindow w origin area ; XSetWindowBorderWidth w borderWidth ; Arguments: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 107 changes Specifies a list of XWindowChanges. w Specifies the window to be reconfigured. borderWidth Specifies the width of the window border. area Specifies the interior dimensions of the window. origin Specifies the x and y coordinates, which define the new location of the top-left pixel of the window's border or the window itself if it has no border relative to its parent. Argument Type: datatype XWindowChanges = CWPosition of XPoint | CWSize of XRectangle | CWBorderWidth of int | CWStackMode of StackMode | CWSibling of Drawable datatype StackMode = Above | Below | TopIf | BottomIf | Opposite Argument Description: The CWPosition member is used to set the window's x and y coordinates, which are relative to the parent's origin and indicate the position of the upper-left outer corner of the window. The CWSize member is used to set the inside size of the window, not including the border, and must be non-zero, or a BadValue error results. Attempts to configure a root window have no effect. The CWBorderWidth member is used to set the width of the border in pixels. Note that setting just the border width leaves the outer-left corner of the window in a fixed position but moves the absolute position of the window's origin. If you attempt to set the border-width attribute of an InputOnlyClass window non-zero, a BadMatch error results. The CWSibling member is used to set the sibling window for stacking operations. The CWStackMode member is used to set how the window is to be restacked and can be set to Above, Below, TopIf, BottomIf, or Opposite. Description: The XConfigureWindow function uses the values specified in the XWindowChanges list to reconfigure a window's size, position, border, and stacking order. Values not specified are taken from the existing geometry of the window. If a sibling is specified without a stack-mode or if the window is not actually a sibling, a BadMatch error results. Note that the computations for BottomIf, TopIf, and Oppo- site are performed with respect to the window's final geometry (as controlled by the other arguments passed to XConfigureWindow), not its initial geometry. Any backing store contents of the window, its inferiors, and other newly visible windows are either discarded or changed to reflect the current screen contents (depending on the implementation). The XMoveWindow function moves the specified window to the specified x and y coor- dinates, but it does not change the window's size, raise the window, or change the mapping state of the window. Moving a mapped window may or may not lose the window's contents depending on if the window is obscured by nonchildren and if no backing store exists. If the contents of the window are lost, the X server generates Expose events. Moving a mapped window generates Expose events on any formerly obscured windows. 108 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 If the override-redirect flag of the window is false and some other client has selected Sub- structureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no further processing is performed. Otherwise, the window is moved. The XResizeWindow function changes the inside dimensions of the specified window, not including its borders. This function does not change the window's upper-left coordinate or the origin and does not restack the window. Changing the size of a mapped window may lose its contents and generate Expose events. If a mapped window is made smaller, changing its size generates Expose events on windows that the mapped window formerly obscured. If the override-redirect flag of the window is false and some other client has selected Sub- structureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no further processing is performed. If either width or height is zero, a Bad- Value error results. The XMoveResizeWindow function changes the size and location of the specified win- dow without raising it. Moving and resizing a mapped window may generate an Expose event on the window. Depending on the new size and location parameters, moving and resizing a window may generate Expose events on windows that the window formerly obscured. If the override-redirect flag of the window is false and some other client has selected Sub- structureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no further processing is performed. Otherwise, the window size and location are changed. The XSetWindowBorderWidth function sets the specified window's border width to the specified width. 2.16.7 XMapWindow, XMapRaised, XMapSubwindows Types: val XMapWindow: Drawable -> unit val XMapRaised: Drawable -> unit val XMapSubwindows: Drawable -> unit Syntax: XMapWindow w ; XMapRaised w ; XMapSubwindows w ; Arguments: w Specifies the window. Description: The XMapWindow function maps the window and all of its subwindows that have had map requests. Mapping a window that has an unmapped ancestor does not display the window but marks it as eligible for display when the ancestor becomes mapped. Such a window is called unviewable. When all its ancestors are mapped, the window becomes viewable and will be visible on the screen if it is not obscured by another window. This function has no effect if the window is already mapped. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 109 If the override-redirect of the window is false and if some other client has selected Sub- structureRedirectMask on the parent window, then the X server generates a MapRe- quest event, and the XMapWindow function does not map the window. Otherwise, the window is mapped, and the X server generates a MapNotify event. If the window becomes viewable and no earlier contents for it are remembered, the X server tiles the window with its background. If the window's background is undefined, the existing screen contents are not altered, and the X server generates zero or more Expose events. If backing-store was maintained while the window was unmapped, no Expose events are generated. If backing-store will now be maintained, a full-window exposure is always generated. Otherwise, only visible regions may be reported. Similar tiling and exposure take place for any newly viewable inferiors. If the window is an InputOutputClass window, XMapWindow generates Expose events on each InputOutputClass window that it causes to be displayed. If the client maps and paints the window and if the client begins processing events, the window is painted twice. To avoid this, first ask for Expose events and then map the window, so the client processes input events as usual. The event list will include Expose for each window that has appeared on the screen. The client's normal response to an Expose event should be to repaint the window. This method usually leads to simpler programs and to proper interaction with window managers. The XMapRaised function essentially is similar to XMapWindow in that it maps the window and all of its subwindows that have had map requests. However, it also raises the specified window to the top of the stack. The XMapSubwindows function maps all subwindows for a specified window in top-to- bottom stacking order. The X server generates Expose events on each newly displayed window. This may be much more efficient than mapping many windows one at a time because the server needs to perform much of the work only once, for all of the windows, rather than for each window. 2.16.8 XQueryPointer Types: val XQueryPointer: Drawable -> (bool * Drawable * Drawable * XPoint * XPoint * Modifier list) Syntax: val (sameScreen,root,child,rootPointer,pointer,modifiers) = XQueryPointer w ; Arguments: sameScreen Returns true if the pointer is on the same screen as the specified window. child Returns the child window that the pointer is located in, if any. modifiers Returns the current state of the modifier keys and pointer buttons. root Returns the root window that the pointer is in. rootPointer Return the pointer coordinates relative to the root window's origin. w Specifies the window. 110 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 pointer Return the pointer coordinates relative to the specified window. Description: The XQueryPointer function returns the root window the pointer is logically on and the pointer coordinates relative to the root window's origin. If sameScreen is false, the pointer is not on the same screen as the specified window, and XQueryPointer returns NoDrawable to child and (0,0) to pointer. If sameScreen is true, the pointer coordi- nates returned to pointer are relative to the origin of the specified window. In this case, XQueryPointer returns the child that contains the pointer, if any, or else NoDrawable to child. XQueryPointer returns the current logical state of the keyboard buttons and the modifier keys in modifiers. It sets modifiers to the list of button or modifier key masks to match the current state of the mouse buttons and the modifier keys. 2.16.9 XQueryTree Types: val XQueryTree: Drawable -> (Drawable * Drawable * Drawable list) Syntax: val (root,parent,children) = XQueryTree w ; Arguments: children Returns a list of children. parent Returns the parent window. root Returns the root window. w Specifies the window whose list of children, root, and parent you want to obtain. Description: The XQueryTree function returns the root window, the parent window, and a list of children windows for the specified window. The children are listed in current stacking order, from bottom-most (first) to top-most (last). If it fails, XQueryTree raises exception XWindows with "XQueryTree failed" . 2.16.10 XRaiseWindow, XLowerWindow, XCirculateSubwindows, XCirculateSubwindowsDown, XCirculateSubwindowsUp, XRestackWindows Types: val XRaiseWindow: Drawable -> unit val XLowerWindow: Drawable -> unit val XCirculateSubwindows: Drawable -> CirculateDirection -> unit val XCirculateSubwindowsDown: Drawable -> unit val XCirculateSubwindowsUp: Drawable -> unit val XRestackWindows: Drawable list -> unit cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 111 Syntax: XRaiseWindow w ; XLowerWindow w ; XCirculateSubwindows w direction ; XCirculateSubwindowsDown w ; XCirculateSubwindowsUp w ; XRestackWindows windows ; Arguments: direction Specifies the direction (up or down) that you want to circulate the window. You can pass RaiseLowest or LowerHighest. w Specifies the window. windows Specifies the list of windows to be restacked. Argument Type: datatype CirculateDirection = RaiseLowest | LowerHighest Description: The XRaiseWindow function raises the specified window to the top of the stack so that no sibling window obscures it. If the windows are regarded as overlapping sheets of paper stacked on a desk, then raising a window is analogous to moving the sheet to the top of the stack but leaving its x and y location on the desk constant. Raising a mapped window may generate Expose events for the window and any mapped subwindows that were formerly obscured. If the override-redirect attribute of the window is false and some other client has se- lected SubstructureRedirectMask on the parent, the X server generates a Configur- eRequest event, and no processing is performed. Otherwise, the window is raised. The XLowerWindow function lowers the specified window to the bottom of the stack so that it does not obscure any sibling windows. If the windows are regarded as overlapping sheets of paper stacked on a desk, then lowering a window is analogous to moving the sheet to the bottom of the stack but leaving its x and y location on the desk constant. Lowering a mapped window will generate Expose events on any windows it formerly obscured. If the override-redirect attribute of the window is false and some other client has se- lected SubstructureRedirectMask on the parent, the X server generates a Configur- eRequest event, and no processing is performed. Otherwise, the window is lowered to the bottom of the stack. The XCirculateSubwindows function circulates children of the specified window in the specified direction. If you specify RaiseLowest, XCirculateSubwindows raises the low- est mapped child (if any) that is occluded by another child to the top of the stack. If you specify LowerHighest, XCirculateSubwindows lowers the highest mapped child (if any) that occludes another child to the bottom of the stack. Exposure processing is then performed on formerly obscured windows. If some other client has selected Substructur- eRedirectMask on the window, the X server generates a CirculateRequest event, and no further processing is performed. If a child is actually restacked, the X server generates a CirculateNotify event. The XCirculateSubwindowsUp function raises the lowest mapped child of the specified window that is partially or completely occluded by another child. Completely unobscured 112 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 children are not affected. This is a convenience function equivalent to XCirculateSub- windows with RaiseLowest specified. The XCirculateSubwindowsDown function lowers the highest mapped child of the spec- ified window that partially or completely occludes another child. Completely unobscured children are not affected. This is a convenience function equivalent to XCirculateSub- windows with LowerHighest specified. The XRestackWindows function restacks the windows in the order specified, from top to bottom. The stacking order of the first window in the windows list is unaffected, but the other windows in the list are stacked underneath the first window, in the order of the list. The stacking order of the other windows is not affected. For each window in the window list that is not a child of the specified window, a BadMatch error results. If the override-redirect attribute of a window is false and some other client has selected SubstructureRedirectMask on the parent, the X server generates ConfigureRequest events for each window whose override-redirect flag is not set, and no further processing is performed. Otherwise, the windows will be restacked in top to bottom order. 2.16.11 XReparentWindow Types: val XReparentWindow: Drawable -> Drawable -> XPoint -> unit Syntax: XReparentWindow w parent topLeft ; Arguments: parent Specifies the parent window. w Specifies the window. topLeft Specifies the x and y coordinates of the position in the new parent window. Description: If the specified window is mapped, XReparentWindow automatically performs an Un- mapWindow request on it, removes it from its current position in the hierarchy, and inserts it as the child of the specified parent. The window is placed in the stacking order on top with respect to sibling windows. After reparenting the specified window, XReparentWindow causes the X server to gen- erate a ReparentNotify event. The overrideRedirect member returned in this event is set to the window's corresponding attribute. Window manager clients usually should ignore this window if this member is set to true. Finally, if the specified window was originally mapped, the X server automatically performs a MapWindow request on it. The X server performs normal exposure processing on formerly obscured windows. The X server might not generate Expose events for regions from the initial UnmapWindow request that are immediately obscured by the final MapWindow request. A BadMatch error results if the new parent window is not on the same screen as the old parent window, or if the new parent window is the specified window or an inferior of the specified window, or if the specified window has a ParentRelative background, and the new parent window is not the same depth as the specified window. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 113 2.16.12 XUnmapWindow, XUnmapSubwindows Types: val XUnmapWindow: Drawable -> unit val XUnmapSubwindows: Drawable -> unit Syntax: XUnmapWindow w ; XUnmapSubwindows w ; Arguments: w Specifies the window. Description: The XUnmapWindow function unmaps the specified window and causes the X server to generate an UnmapNotify event. If the specified window is already unmapped, XUn- mapWindow has no effect. Normal exposure processing on formerly obscured windows is performed. Any child window will no longer be visible until another map call is made on the parent. In other words, the subwindows are still mapped but are not visible until the parent is mapped. Unmapping a window will generate Expose events on windows that were formerly obscured by it. The XUnmapSubwindows function unmaps all subwindows for the specified window in bottom-to-top stacking order. It causes the X server to generate an UnmapNotify event on each subwindow and Expose events on formerly obscured windows. Using this function is much more efficient than unmapping multiple windows one at a time because the server needs to perform much of the work only once, for all of the windows, rather than for each window. 2.17 Window Manager 2.17.1 XSetIconSizes, XGetIconSizes Types: val XSetIconSizes: Drawable -> (XRectangle * XRectangle * XRectangle) list -> unit val XGetIconSizes: Drawable -> (XRectangle * XRectangle * XRectangle) list Syntax: XSetIconSizes w sizes ; val sizes = XGetIconSizes w ; Arguments: 114 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 sizes Specifies the size list. w Specifies the window. Description: The XSetIconSizes function is used only by window managers to set the supported icon sizes. The size is specified as (minimum size,maximum size,size increment). The XGetIconSizes function returns the empty list if a window manager has not set icon sizes, otherwise it returns a list of supported sizes. XGetIconSizes should be called by an application that wants to find out what icon sizes would be most appreciated by the window manager under which the application is running. The application should then use XSetWMHints to supply the window manager with an icon pixmap or window in one of the supported sizes. 2.17.2 XSetTransientForHint, XGetTransientForHint Types: val XSetTransientForHint: Drawable -> Drawable -> unit val XGetTransientForHint: Drawable -> Drawable Syntax: XSetTransientForHint transientWindow mainWindow ; val mainWindow = XGetTransientForHint transientWindow ; Arguments: transientWindow Specifies the transient window. mainWindow Specifies a more permanent window in the application. Properties: WM__TRANSIENT__FOR Set by application programs to indicate to the window manager a transient top-level window, such as a dialog box. Description: The XSetTransientForHint function sets the WM__TRANSIENT__FOR property of transientWindow to mainWindow. The XGetTransientForHint function returns the WM__TRANSIENT__FOR property for the specified transientWindow. If the property does not exist then exception XWin- dows is raised with "XGetTransientForHint failed" . 2.17.3 XSetWMClass, XGetWMClass Types: val XSetWMClass: Drawable -> string list -> unit val XGetWMClass: Drawable -> string list cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 115 Syntax: XSetWMClass w class ; val class = XGetWMClass w ; Arguments: class Specifies the class names for the window w Specifies the window Properties: WM__CLASS Set by application programs to allow window and session managers to obtain the application's resources from the resource database. Description: XSetWMClass sets the WM__CLASS property on the specified window. XGetWM- Class returns the WM__CLASS property on the specified window. 2.17.4 XSetWMClientMachine, XGetWMClientMachine Types: val XSetWMClientMachine: Drawable -> string -> unit val XGetWMClientMachine: Drawable -> string Syntax: XSetWMClientMachine w machine ; val machine = XGetWMClientMachine w ; Arguments: w Specifies the window machine Specifies the name of the machine on which the application is running. Properties: WM__CLIENT__MACHINE The string name of the machine on which the client application is running. Description: The XSetWMClientMachine convenience function performs a XSetProperty on the WM__CLIENT__MACHINE property. The XGetWMClientMachine convenience function performs an XGetTextProperty on the WM__CLIENT__MACHINE property. 116 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 2.17.5 XSetWMColormapWindows, XGetWMColormapWindows Types: val XSetWMColormapWindows: Drawable -> Drawable list -> unit val XGetWMColormapWindows: Drawable -> Drawable list Syntax: XSetWMColormapWindows topWindow colormapWindows ; val colormapWindows = XGetWMColormapWindows topWindow ; Arguments: colormapWindows Specifies the list of windows. topWindow Specifies one of the application's top level windows. Properties: WM__COLORMAP__WINDOWS List of windows that may need a different col- ormap than that of their top-level window. Description: The XSetWMColormapWin- dows function replaces the WM__COLORMAP__WINDOWS property on the specified window with the list of windows specified by the colormapWindows argument. The prop- erty is stored with a type of XA__WINDOW and a format of 32. If it cannot intern the WM__COLORMAP__WINDOWS atom, XSetWMColormapWindows raises excep- tion XWindows with "XSetWMColormapWindows failed" . The XGetWMColormapWindows function returns the list of window identifiers stored in the WM__COLORMAP__WINDOWS property on the specified window. These iden- tifiers indicate the colormaps that the window manager may need to install for this window. If the property exists, is of type WINDOW, is of format 32, and the atom WM__COLORMAP__WINDOWS can be interned, XGetWMColormapWindows returns the list of windows. Otherwise, it returns the empty list. 2.17.6 XSetWMCommand, XGetWMCommand Types: val XSetWMCommand: Drawable -> string list -> unit val XGetWMCommand: Drawable -> string list Syntax: XSetWMCommand w commands ; val commands = XGetWMCommand w ; Arguments: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 117 w Specifies the window. commands Specifies the list of strings. Description: The XSetWMCommand function sets the WM__COMMAND property on the speci- fied window. Typically it is set to the command and arguments used to invoke the appli- cation. The XGetWMCommand function reads the WM__COMMAND property from the specified window and returns a string list. If the WM__COMMAND property exists, and it is of type XA__STRING and format 8 then it is returned as a string list. Otherwise, it raises exception XWindows with "XGetWMCommand" . 2.17.7 XSetWMHints, XGetWMHints Types: val XSetWMHints: Drawable -> XWMHint list -> unit val XGetWMHints: Drawable -> XWMHint list Syntax: XSetWMHints w hints ; val hints = XGetWMHints w ; Arguments: w Specifies the window hints Specifies the list of XWMHint values Argument Type: datatype XWMStateHint = DontCareState | NormalState | ZoomState | IconicState | InactiveState datatype XWMHint = InputHint of bool | StateHint of XWMStateHint | IconPixmapHint of Drawable | IconWindowHint of Drawable | IconPositionHint of XPoint | IconMaskHint of Drawable Argument Description: The InputHint member is used to communicate to the window manager the input focus model used by the application. Applications that expect input but never explicitly set focus to any of their subwindows (that is, use the push model of focus management), such as X10-style applications that use real-estate driven focus, should set this member to true. Similarly, applications that set input focus to their subwindows only when it is given to their top-level window by a window manager should also set this member to true. Applications that manage their own input focus by explicitly setting focus to one of their subwindows whenever they want keyboard input (that is, use the pull model of 118 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 focus management) should set this member to false. Applications that never expect any keyboard input also should set this member to false. Pull model window managers should make it possible for push model applications to get input by setting input focus to the top-level windows of applications whose input member is true. Push model window managers should make sure that pull model applications do not break them by resetting input focus to PointerRoot when it is appropriate (for example, whenever an application whose input member is false sets input focus to one of its subwindows). Possible values for the StateHint member are DontCareState (* don't know or care *) NormalState (* most applications want to start this way *) ZoomState (* application wants to start zoomed *) IconicState (* application wants to start as an icon *) InactiveState (* application wants to start invisibly *) The IconMaskHint member specifies which pixels of the IconPixmapHint member should be used as the icon. This allows for nonrectangular icons. Both the Icon- PixmapHint member and the IconMaskHint member must be bitmaps. The Icon- WindowHint member lets an application provide a window for use as an icon for window managers that support such use. The IconPositionHint member specifies a position on the screen for the icon. Description: The XSetWMHints function sets the window manager hints that include icon informa- tion and location, the initial state of the window, and whether the application relies on the window manager to get keyboard input. The XGetWMHints function reads the window manager hints and returns the empty list if no WM__HINTS property was set on the window or returns a list of XWMHints if it succeeds. 2.17.8 XSetWMIconName, XGetWMIconName Types: val XSetWMIconName: Drawable -> string -> unit val XGetWMIconName: Drawable -> string Syntax: XSetWMIconName w iconName ; val iconName = XGetWMIconName w ; Arguments: iconName Specifies the icon name w Specifies the window cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 119 Description: The XSetWMIconName convenience function performs a XSetProperty on the WM__ICON__NAME property. The XSetWMIconName function sets the name to be displayed in a window's icon. The XGetWMIconName convenience function performs an XGetTextProperty on the WM__ICON__NAME property. The XGetWMIconName function returns the name to be displayed in the specified window's icon. If it succeeds, it returns the name, otherwise, if no icon name has been set for the window, it raises exception XWindows with "XGetWMIconName" . 2.17.9 XSetWMName, XGetWMName Types: val XSetWMName: Drawable -> string -> unit val XGetWMName: Drawable -> string Syntax: XSetWMName w windowName ; windowName = XGetWMName w ; Arguments: windowName Specifies the window name w Specifies the window Description: The XSetWMName convenience function performs a XSetProperty on the WM__NAME property. The XSetWMName function assigns the name passed to win- dowName to the specified window. A window manager can display the window name in some prominent place, such as the title bar, to allow users to identify windows easily. Some window managers may display a window's name in the window's icon, although they are encouraged to use the window's icon name if one is provided by the application. The XGetWMName convenience function performs an XGetTextProperty on the WM__NAME property. The XGetWMName function returns the name of the specified window. If the WM__NAME property has not been set for this window, XGetWMName raises exception XWindows with "XGetWMName" . 2.17.10 XSetWMProperties Types: val XSetWMProperties: Drawable -> string -> string -> string list -> XWMSizeHint list -> XWMHint list -> string list -> unit 120 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Syntax: XSetWMProperties w windowName iconName commands normalHints wmHints class ; Arguments: w Specifies the window windowName Specifies the window name iconName Specifies the icon name commands Specifies the list of strings used to invoke the window normalHints Specifies the list of XWMSizeHint values for the window wmHints Specifies the list of XWMHint values for the window class Specifies the class names for the window Properties: WM__CLASS Set by application programs to allow window and ses- sion managers to obtain the application's resources from the resource database. WM__CLIENT__MACHINE The string name of the machine on which the client application is running. WM__COMMAND The command and arguments, separated by ASCII nulls, used to invoke the application. WM__HINTS Additional hints set by client for use by the window manager. The ML type of this property is XWMHints. WM__ICON__NAME Name to be used in icon. WM__NAME Name of the application. WM__NORMAL__HINTS Size hints for a window in its normal state. The ML type of this property is XWMSizeHint. Description: The XSetWMProperties convenience function provides a single programming interface for setting those essential window properties that are used for communicating with other clients (particularly window and session managers). If the windowName argument is not empty, XSetWMProperties calls XSetWM- Name, which, in turn, sets the WM__NAME property. If the iconName argu- ment is not empty, XSetWMProperties calls XSetWMIconName, which sets the WM__ICON__NAME property. If the commands argument is not empty, XSetWM- Properties calls XSetWMCommand, which sets the WM__COMMAND property. If the normalHints argument is not empty, XSetWMProperties calls XSetWMNor- malHints, which sets the WM__NORMAL__HINTS property. If the wmHints argument is not empty, XSetWMProperties calls XSetWMHints, which sets the WM__HINTS property. If the class argument is not empty, XSetWMProperties calls XSetWM- Class, which sets the WM__CLASS property. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 121 2.17.11 XSetWMSizeHints, XGetWMSizeHints, XSetWMNormalHints, XGetWMNormalHints Types: val XSetWMSizeHints: Drawable -> int -> XWMSizeHint list -> unit val XGetWMSizeHints: Drawable -> int -> XWMSizeHint list val XSetWMNormalHints: Drawable -> XWMSizeHint list -> unit val XGetWMNormalHints: Drawable -> XWMSizeHint list Syntax: XSetWMSizeHints w property hints ; val hints = XGetWMSizeHints w property ; XSetWMNormalHints w hints ; val hints = XGetWMNormalHints w ; Arguments: w Specifies the window property Specifies the property atom hints Specifies the list of XWMSizeHint values Argument Type: datatype XWMSizeHint = PPosition of XPoint | PSize of XRectangle | PMinSize of XRectangle | PMaxSize of XRectangle | PResizeInc of XRectangle | PAspect of XPoint * XPoint | PBaseSize of XRectangle | PWinGravity of Gravity Argument Description: The PPosition and PSize members are now obsolete and are left solely for compatibility reasons. The PMinSize member specifies the minimum window size that still allows the application to be useful. The PMaxSize member specifies the maximum window size. The PResizeInc member defines a size increment which the window prefers to be resized to. The two points in the PAspect member give minimum and maximum aspect ratios. They are expressed as ratios of x and y, and they allow an application to specify the range of aspect ratios it prefers. The PBaseSize member defines the desired size of the window. The PWinGravity member defines the region of the window that is to be retained when it is resized. Description: The XSetWMSizeHints function replaces the size hints for the specified property on the named window. If the specified property does not already exist, XSetWMSizeHints sets the size hints for the specified property on the named window. The property is stored with a type of WM__SIZE__HINTS and a format of 32. To set a window's normal size hints, you can use the XSetWMNormalHints function. 122 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 The XGetWMSizeHints function returns the size hints stored in the specified property on the named window. If the property is of type WM__SIZE__HINTS, of format 32, and is long enough to contain either an old (pre-ICCCM) or new size hints structure, XGetWM- SizeHints returns the list of fields that were supplied by the user. Otherwise, it returns the empty list. To get a window's normal size hints, you can use the XGetWMNormalHints function. If XGetWMSizeHints returns successfully and a pre-ICCCM size hints property is read, the list returned may contain the following members: [PPosition,PSize,PMinSize,PMaxSize,PResizeInc,PAspect] If the property is large enough to contain the base size and window gravity fields as well, the list returned may contain the following members: [PBaseSize,PWinGravity] The XSetWMNormalHints function replaces the size hints for the WM__NORMAL__HINTS property on the specified window. If the property does not already exist, XSetWMNormalHints sets the size hints for the WM__NORMAL__HINTS property on the specified window. The property is stored with a type of WM__SIZE__HINTS and a format of 32. The XGetWMNormalHints function returns the size hints stored in the WM__NORMAL__HINTS property on the specified window. If the property is of type WM__SIZE__HINTS, of format 32, and is long enough to contain either an old (pre- ICCCM) or new size hints structure, XGetWMNormalHints returns the list of fields that were supplied by the user. Otherwise, it returns the empty list. If XGetWMNormalHints returns successfully and a pre-ICCCM size hints property is read, the list returned may contain the following members: [PPosition,PSize,PMinSize,PMaxSize,PResizeInc,PAspect] If the property is large enough to contain the base size and window gravity fields as well, the list returned may contain the following members: [PBaseSize,PWinGravity] 2.17.12 XWMGeometry Types: val XWMGeometry: string -> string -> int -> XWMSizeHint list -> XPoint * XRectangle * Gravity Syntax: val (topLeft,area,gravity) = XWMGeometry userGeometry defaultGeometry borderWidth sizeHints ; Arguments: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 123 userGeometry Specifies the user-specified geometry or empty string. borderWidth Specifies the border width. defaultGeometry Specifies the application's default geometry or empty string. sizeHints Specifies the size hints for the window in its normal state. topLeft Return the x and y offsets. area Return the width and height determined. gravity Returns the window gravity. Description: The XWMGeometry function combines any geometry information (given in the format used by XParseGeometry) specified by the user and by the calling program with size hints (usually the ones to be stored in WM__NORMAL__HINTS) and returns the position, size, and gravity (NorthWestGravity, NorthEastGravity, SouthEastGravity or South- WestGravity) that describe the window. If the base size is not set in the XWMSizeHint list, the minimum size is used if set. Otherwise, a base size of 0 is assumed. If no minimum size is set in the hints list, the base size is used. Note that invalid geometry specifications can cause a width or height of 0 to be returned. 124 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Chapter 3 Event Reference 3.1 XEvent Types: datatype 'a XEvent = ButtonPress of ... | ButtonRelease of ... | ButtonClick of ... | CirculateNotify of ... | CirculateRequest of ... | ColormapNotify of ... | ConfigureNotify of ... | ConfigureRequest of ... | CreateNotify of ... | DestroyNotify of ... | EnterNotify of ... | LeaveNotify of ... | Expose of ... | FocusIn of ... | FocusOut of ... | GraphicsExpose of ... | NoExpose of ... | GravityNotify of ... | KeymapNotify of ... | KeyPress of ... | KeyRelease of ... | MapNotify of ... | UnmapNotify of ... | MapRequest of ... | MotionNotify of ... | ReparentNotify of ... | ResizeRequest of ... | SelectionClear of ... | SelectionNotify of ... | SelectionRequest of ... | VisibilityNotify of ... | DeleteRequest of ... | Message of ... Description: The XEvent type is a union of the individual types returned for each different type of event. Event handlers typically pattern-match on the XEvent members, choosing to match events that they are interested in, and then a default pattern match to provide a default action for all other events. For example: fun Handler (Expose {window,region,...},state) = ... | Handler (EnterNotify {window,...},state) = ... | Handler (LeaveNotify {window,...},state) = ... | Handler (MotionNotify {window,pointer,...},state) = ... | Handler (_,state) = state ; (* default is to do nothing *) 125 126 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 All the event types have a sendEvent member which is set to true if the event came from a SendEvent protocol request. Most events also contain a time member, which is the time at which the event occurred. 3.2 ButtonPress, ButtonRelease, KeyPress, KeyRelease, MotionNotify Types: datatype Modifier = ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | AnyModifier ; datatype ButtonName = Button1 | Button2 | Button3 | Button4 | Button5 | AnyButton ; ButtonPress of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } ButtonRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } ButtonClick of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName, up: int, (* number of up transitions *) down: int } (* number of down transitions *) KeyPress of { sendEvent: bool, window: Drawable, root: Drawable, cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 127 subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } KeyRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } MotionNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, isHint: bool } Description: These structures have the following common members: window, root, subwindow, time, pointer, rootPointer, and modifiers. The window member is set to the window on which the event was generated and is referred to as the event window. The root member is set to the source window's root window. The rootPointer member is set to the pointer's coordinates relative to the root window's origin at the time of the event. If the source window is an inferior of the event window, the subwindow member of the structure is set to the child of the event window that is the source member or an ancestor of it. Otherwise, the X server sets the subwindow member to NoDrawable. The time member is set to the time when the event was generated and is expressed in milliseconds. If the event window is on the same screen as the root window, the pointer member is set to the coordinates relative to the event window's origin. Otherwise, this member is set to (0,0). The modifiers member is set to indicate the state of the pointer buttons and modifier keys just prior to the event. It is a list of button or modifier key masks: Button1Mask, But- ton2Mask, Button3Mask, Button4Mask, Button5Mask, ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask. KeyPress and KeyRelease events have a member called keycode. It is set to a number that represents a physical key on the keyboard. The keycode is an arbitrary representation for any key on the keyboard. ButtonPress and ButtonRelease events have a member called button. It represents the pointer button that changed state and can be Button1, Button2, Button3, Button4, or Button5. The ButtonClick event can be used as an alternative to the ButtonPress and Button- Release combinations. It returns the number of up and down transitions of the pointer 128 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 button in a small predetermined time interval. In this way it is easy to detect double and triple clicks. MotionNotify events have a member called isHint. It can be set to true or false. 3.3 CirculateNotify Types: datatype Placement = PlaceOnTop | PlaceOnBottom ; CirculateNotify of { sendEvent: bool, event: Drawable, window: Drawable, place: Placement } Description: The event member is set either to the restacked window or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The win- dow member is set to the window that was restacked. The place member is set to the win- dow's position after the restack occurs and is either PlaceOnTop or PlaceOnBottom. If it is PlaceOnTop, the window is now on top of all siblings. If it is PlaceOnBottom, the window is now below all siblings. 3.4 CirculateRequest Types: datatype Placement = PlaceOnTop | PlaceOnBottom ; CirculateRequest of { sendEvent: bool, parent: Drawable, window: Drawable, place: Placement } Description: The parent member is set to the parent window. The window member is set to the sub- window to be restacked. The place member is set to what the new position in the stacking order should be and is either PlaceOnTop or PlaceOnBottom. If it is PlaceOnTop, the subwindow should be on top of all siblings. If it is PlaceOnBottom, the subwindow should be below all siblings. 3.5 ColormapNotify Types: cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 129 ColormapNotify of { sendEvent: bool, window: Drawable, colormap: Colormap, new: bool, installed: bool } Description: The window member is set to the window whose associated colormap is changed, installed, or uninstalled. For a colormap that is changed, installed, or uninstalled, the colormap member is set to the colormap associated with the window. For a colormap that is changed by a call to XFreeColormap, the colormap member is set to NoColormap. The new member is set to indicate whether the colormap for the specified window was changed or installed or uninstalled and can be true or false. If it is true, the colormap was changed. If it is false, the colormap was installed or uninstalled. The installed member is always set to indicate whether the colormap is installed or uninstalled. 3.6 ConfigureNotify Types: ConfigureNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, overrideRedirect: bool } Description: The event member is set either to the reconfigured window or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The window member is set to the window whose size, position, border, and/or stacking order was changed. The position member is set to the coordinates relative to the parent window's origin and indicates the position of the upper-left outside corner of the window. The size member is set to the inside size of the window, not including the border. The borderWidth member is set to the width of the window's border, in pixels. The above member is set to the sibling window and is used for stacking operations. If the X server sets this member to NoDrawable, the window whose state was changed is on the bottom of the stack with respect to sibling windows. However, if this member is set to a sibling window, the window whose state was changed is placed on top of this sibling window. The overrideRedirect member is set to the override-redirect attribute of the window. Win- dow manager clients normally should ignore this window if the overrideRedirect member is true. 130 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 3.7 ConfigureRequest Types: datatype StackMode = Above | Below | TopIf | BottomIf | Opposite ; ConfigureRequest of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, detail: StackMode } Description: The parent member is set to the parent window. The window member is set to the window whose size, position, border width, and/or stacking order is to be reconfigured. 3.8 CreateNotify Types: CreateNotify of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, overrideRedirect: bool } Description: The parent member is set to the created window's parent. The window member specifies the created window. The position member is set to the created window's coordinates relative to the parent window's origin and indicates the position of the upper-left outside corner of the created window. The size member is set to the inside size of the created window (not including the border) and is always nonzero. The borderWidth member is set to the width of the created window's border, in pixels. The overrideRedirect member is set to the override-redirect attribute of the window. Window manager clients normally should ignore this window if the overrideRedirect member is true. 3.9 DeleteRequest Types: DeleteRequest of { window: Drawable } cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 131 Description: This event is generated when the window manager tries to destroy a top level window. Instead of the window being destroyed the window manager sends this event to the ap- plication. The application can either ignore the event, or, typically, it can will perform some save operations and then destroy the window itself. The window member is set to the window that is to be destroyed. 3.10 DestroyNotify Types: DestroyNotify of { sendEvent: bool, event: Drawable, window: Drawable } Description: The event member is set either to the destroyed window or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The win- dow member is set to the window that is destroyed. 3.11 EnterNotify, LeaveNotify, NotifyMode, NotifyDetail Types: datatype NotifyMode = NotifyNormal | NotifyGrab | NotifyUngrab | NotifyWhileGrabbed ; datatype NotifyDetail = NotifyAncestor | NotifyVirtual | NotifyInferior | NotifyNonLinear | NotifyNonLinearVirtual | NotifyPointer | NotifyPointerRoot | NotifyDetailNone ; EnterNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } LeaveNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, 132 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } Description: The window member is set to the window on which the EnterNotify or LeaveNotify event was generated and is referred to as the event window. This is the window used by the X server to report the event, and is relative to the root window on which the event occurred. The root member is set to the root window of the screen on which the event occurred. For a LeaveNotify event, if a child of the event window contains the initial position of the pointer, the subwindow component is set to that child. Otherwise, the X server sets the subwindow member to NoDrawable. For an EnterNotify event, if a child of the event window contains the final pointer position, the subwindow component is set to that child or NoDrawable. The time member is set to the time when the event was generated and is expressed in milliseconds. The pointer member is set to the coordinates of the pointer position in the event window. This position is always the pointer's final position, not its initial position. If the event window is on the same screen as the root window, pointer is the pointer coordinates relative to the event window's origin. Otherwise, pointer is set to (0,0). The rootPointer member is set to the pointer's coordinates relative to the root window's origin at the time of the event. The focus member is set to indicate whether the event window is the focus window or an inferior of the focus window. The X server can set this member to either true or false. If true, the event window is the focus window or an inferior of the focus window. If false, the event window is not the focus window or an inferior of the focus window. The modifiers member is set to indicate the state of the pointer buttons and modifier keys just prior to the event. It is a list of button or modifier key masks: Button1Mask, But- ton2Mask, Button3Mask, Button4Mask, Button5Mask, ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask. The mode member is set to indicate whether the events are normal events, pseudo-motion events when a grab activates, or pseudo-motion events when a grab deactivates. The X server can set this member to NotifyNormal, NotifyGrab, or NotifyUngrab. The detail member is set to indicate the notify detail and can be NotifyAncestor, No- tifyVirtual, NotifyInferior, NotifyNonLinear, or NotifyNonLinearVirtual. 3.12 Expose Types: Expose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int } cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 133 Description: The window member is set to the exposed (damaged) window. The region member is set to the damaged area within the window. The count member is set to the number of Expose events that are to follow. If count is zero, no more Expose events follow for this window. However, if count is nonzero, at least that number of Expose events (and possibly more) follow for this window. Simple applications that do not want to optimize redisplay by distinguishing between subareas of its window can just ignore all Expose events with nonzero counts and perform full redisplays on events with zero counts. 3.13 FocusIn, FocusOut Types: FocusIn of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } FocusOut of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } Description: The window member is set to the window on which the FocusIn or FocusOut event was generated. This is the window used by the X server to report the event. The mode mem- ber is set to indicate whether the focus events are normal focus events, focus events while grabbed, focus events when a grab activates, or focus events when a grab deactivates. The X server can set the mode member to NotifyNormal, NotifyWhileGrabbed, Notify- Grab, or NotifyUngrab. All FocusOut events caused by a window unmap are generated after any UnmapNotify event; however, the X protocol does not constrain the ordering of FocusOut events with respect to generated EnterNotify, LeaveNotify, VisibilityNotify, and Expose events. Depending on the event mode, the detail member is set to indicate the notify detail and can be NotifyAncestor, NotifyVirtual, NotifyInferior, NotifyNonLinear, Noti- fyNonLinearVirtual, NotifyPointer, NotifyPointerRoot, or NotifyDetailNone. 3.14 GraphicsExpose, NoExpose Types: datatype GraphicsCode = CopyArea | CopyPlane ; GraphicsExpose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int, code: GraphicsCode } 134 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 NoExpose of { sendEvent: bool, window: Drawable, code: GraphicsCode } Description: Both structures have drawable and code as common members. The drawable member is set to the drawable of the destination region on which the graphics request was to be performed. The code member is set to the graphics request initiated by the client and can be either CopyArea or CopyPlane. If it is CopyArea, a call to XCopyArea initiated the request. If it is CopyPlane, a call to XCopyPlane initiated the request. The GraphicsExpose structure has these additional members: region, and count. The region member is set to the area within the drawable. The count member is set to the number of GraphicsExpose events to follow. If count is zero, no more GraphicsExpose events follow for this window. However, if count is nonzero, at least that number of GraphicsExpose events (and possibly more) are to follow for this window. 3.15 GravityNotify Types: GravityNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint } Description: The event member is set either to the window that was moved or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The window member is set to the child window that was moved. The position member is set to the coordinates relative to the new parent window's origin and indicates the position of the upper-left outside corner of the window. 3.16 KeymapNotify Types: KeymapNotify of { sendEvent: bool, window: Drawable, keyVector: bool list (* 256 bools *) } Description: The keyVector member is set to the bit vector of the keyboard. The vector is returned as a list of 256 bools, representing the keys 0 to 255 in that order. Each bool set to true indicates that the corresponding key is currently pressed. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 135 3.17 MapNotify Types: MapNotify of { sendEvent: bool, event: Drawable, window: Drawable, overrideRedirect: bool } Description: The event member is set either to the window that was mapped or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The window member is set to the window that was mapped. The overrideRedirect member is set to the override-redirect attribute of the window. Window manager clients normally should ignore this window if the override-redirect attribute is true, because these events usually are generated from pop-ups, which override structure control. 3.18 MapRequest Types: MapRequest of { sendEvent: bool, parent: Drawable, window: Drawable } Description: The parent member is set to the parent window. The window member is set to the window to be mapped. 3.19 Message Types: Message of { window: Drawable, message: 'a } ; Description: This event is received when a message is sent to a window. The only way to send a message to a window is to call the message-sender function returned by XSetHandler. This will only allow a strongly typed messages to be sent. 3.20 ReparentNotify Types: 136 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 ReparentNotify of { sendEvent: bool, event: Drawable, window: Drawable, parent: Drawable, position: XPoint, overrideRedirect: bool } Description: The event member is set either to the reparented window or to the old or the new par- ent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. The window member is set to the window that was reparented. The parent member is set to the new parent window. The position member is set to the reparented window's coordinates relative to the new parent window's origin and defines the upper-left outer corner of the reparented window. The overrideRedirect member is set to the override- redirect attribute of the window specified by the window member. Window manager clients normally should ignore this window if the overrideRedirect member is true. 3.21 ResizeRequest Types: ResizeRequest of { sendEvent: bool, window: Drawable, size: XRectangle } Description: The window member is set to the window whose size another client attempted to change. The size member is set to the inside size of the window, excluding the border. 3.22 SelectionClear Types: SelectionClear of { sendEvent: bool, window: Drawable, selection: int, time: int } Description: The window member is set to the window losing ownership of the selection. The selection member is set to the selection atom. The time member is set to the last change time recorded for the selection. The owner member is the window that was specified by the current owner in its XSetSelectionOwner call. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 137 3.23 SelectionNotify Types: SelectionNotify of { sendEvent: bool, requestor: Drawable, selection: int, target: int, property: int, time: int } Description: The requestor member is set to the window associated with the requestor of the selec- tion. The selection member is set to the atom that indicates the selection. For example, XA__PRIMARY is used for the primary selection. The target member is set to the atom that indicates the converted type. For example, XA__PIXMAP is used for a pixmap. The property member is set to the atom that indicates which property the result was stored on. If the conversion failed, the property member is set to zero. The time member is set to the time the conversion took place and can be a timestamp or CurrentTime. 3.24 SelectionRequest Types: SelectionRequest of { sendEvent: bool, owner: Drawable, requestor: Drawable, selection: int, target: int, property: int, time: int } Description: The owner member is set to the window owning the selection and is the window that was specified by the current owner in its XSetSelectionOwner call. The requestor member is set to the window requesting the selection. The selection member is set to the atom that names the selection. For example, XA__PRIMARY is used to indicate the primary selection. The target member is set to the atom that indicates the type the selection is desired in. The property member can be a property name or zero. The time member is set to the time and is a timestamp or CurrentTime from the XConvertSelection request. 3.25 UnmapNotify Types: UnmapNotify of { sendEvent: bool, event: Drawable, window: Drawable, fromConfigure: bool } 138 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 Description: The event member is set either to the unmapped window or to its parent, depending on whether StructureNotifyMask or SubstructureNotifyMask was selected. This is the window used by the X server to report the event. The window member is set to the window that was unmapped. The fromConfigure member is set to true if the event was generated as a result of a resizing of the window's parent when the window itself had a winGravity of UnmapGravity. 3.26 VisibilityNotify Types: datatype Visibility = VisibilityUnobscured | VisibilityPartiallyObscured | VisibilityObscured ; VisibilityNotify of { sendEvent: bool, window: Drawable, visibility: Visibility } Description: The window member is set to the window whose visibility state changes. The state member is set to the state of the window's visibility and can be VisibilityUnobscured, Visibil- ityPartiallyObscured, or VisibilityObscured. The X server ignores all of a window's subwindows when determining the visibility state of the window and processes Visibili- tyNotify events according to the following: When the window changes state from partially obscured, fully obscured, or not view- able to viewable and completely unobscured, the X server generates the event with the state member of the VisibilityNotify structure set to VisibilityUnobscured. When the window changes state from viewable and completely unobscured or not viewable to viewable and partially obscured, the X server generates the event with the state member of the VisibilityNotify structure set to VisibilityPartiallyOb- scured. When the window changes state from viewable and completely unobscured, viewable and partially obscured, or not viewable to viewable and fully obscured, the X server generates the event with the state member of the VisibilityNotify structure set to VisibilityObscured. Chapter 4 Protocol Error Messages 4.1 BadAccess Description: XFreeColors pixel not allocated. XSelectInput selecting event that can only be selected by one client at a time, when another client already has it selected. XStoreColors pixel not allocated, or allocated read-only. XStoreNamedColor pixel not allocated, or allocated read-only. 4.2 BadAlloc Description: The server failed to allocate the requested resource. 4.3 BadAtom Description: A value for an atom argument does not name a defined atom. 4.4 BadColor Description: A value for a Colormap argument does not name a defined Colormap. ML type-checking should avoid this error. 139 140 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 4.5 BadCursor Description: A value for a Cursor argument does not name a defined Cursor. ML type-checking should avoid this error. 4.6 BadDrawable Description: A value for a Drawable argument does not name a defined Window or Pixmap. ML type-checking should avoid this error. 4.7 BadFont Description: A value for a Font argument does not name a defined Font. ML type-checking should avoid this error. 4.8 BadGC Description: A value for a GC argument does not name a defined GC. ML type-checking should avoid this error. 4.9 BadImplementation Description: The server does not implement some aspect of the request. This should never occur in Xlib since only standard requests are made. 4.10 BadIDChoice, BadLength Description: Internal Xlib error. cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 141 4.11 BadMatch Description: Some argument, or arguments, have the correct type and range, but fail to 'match' in some other way. XChangeWindowAtrributes Changing the background or border of an In- putOnlyClass window. XClearArea InputOnlyClass window specified. XClearWindow InputOnlyClass window specified. XConfigureWindow Sibling incorrectly specified, or changing the background or border of an InputOnlyClass window. XCopyArea The drawables must have the same root and depth. XCopyPlane The drawables must have the same root. XCreateColormap Visual type not supported, or bad Alloc- Type. XSetWindowColormap Colormap has different visual type to win- dow. XCreatePixmapCursor Masks must have depth of 1, and must be the same size, and the hotspot must be within that size. XChangeGC Tile pixmap must have the same root and depth as the GC. Stipple pixmap must have depth of 1 and must have the same root as the GC. Clip-mask pixmap must have depth of 1 and must have the same root as the GC. Us- ing a GC with a Drawable of different root or depth results in BadMatch. XPutImage If XYBitmap format is used, the depth must be 1. For XYPixmap and ZPixmap, the depth must match the depth of the drawable. XGetImage Specified area not within the source drawable. XGetSubImage Specified area not within the source drawable. XRestackWindows Specified window is not child window. XCreatePixmapFromBitmapData Depth must be supported by screen. XReparentWindow New parent is not on same screen as old par- ent. XSetClipRectangles Incorrect ordering. XSetInputFocus Focus window must be viewable. 142 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 4.12 BadPixmap Description: A value for a Pixmap does not name a defined Pixmap. ML type-checking should avoid this error. 4.13 BadRequest Description: This should never occur in Xlib since only standard requests are made. 4.14 BadValue Description: Some numeric value falls outside the range of values accepted by the request. XAllocColorCells Number of colours must be positive and planes must be non-negative. XAllocColorPlanes Number of colours must be positive, and reds, green and blues must be non-negative XFreeColors Specified pixel is not a valid index into the colormap. XBell Percent must be "100 to 100. XResizeWindow Window width must be non-zero. XCopyPlane Plane must have one bit set to 1, and specify an existing plane. XCreateGlyphCursor Source char and mask char must exist in the font. XSetDashes Dash elements must be positive and less than 256. XCreatePixmap Specified width must be non-zero, and depth must be sup- ported. XSetScreenSaver Incorrect timeout value. XStoreColors Specified pixel is not a valid index into the colormap. 4.15 BadWindow Description: A value for a Window does not name a defined Window. ML type-checking should avoid this error. Index A BitmapOpenFailed 97 Above 107, 130 BitmapPad 31 AboveOf 66, 67 BitmapStatus 96, 97 AddPoint 66 BitmapSuccess 97 AllocAll 24, 25 BitmapUnit 32 AllocNone 24, 25 BlackPixel 15, 16 AllocType 24, 141 Blanking 94 AllowExposures 11, 94 Bottom 67, 68 AllPlanes 31, 72 BottomIf 107, 130 Always 35, 100, 102, 103, 105 BottomLeft 67, 68 And 15 BottomRight 67, 68 AnyButton 126 Button1 126, 127 AnyModifier 126 Button1Mask 126, 127, 132 ArcChord 51, 75, 76 Button1MotionMask 54 ArcPieSlice 51, 75, 76 Button2 126, 127 Area 43, 46, 49, 51, 67, 68, 97 Button2Mask 126, 127, 132 Button2MotionMask 54 Button3 126, 127 B Button3Mask 126, 127, 132 BackingStore 35, 100, 102, 105 Button3MotionMask 54 BadAccess 19, 22, 106, 139 Button4 126, 127 BadAlloc 139 Button4Mask 126, 127, 132 BadAtom 139 Button4MotionMask 54 BadColor 139 Button5 126, 127 BadCursor 140 Button5Mask 126, 127, 132 BadDrawable 140 Button5MotionMask 54 BadFont 49, 140 ButtonClick 125, 126, 127 BadGC 140 ButtonClickMask 54 BadIDChoice 140 ButtonMotionMask 54 BadImplementation 140 ButtonName 126 BadLength 140 ButtonPress 54, 125, 126, 127 BadMatch 24, 25, 29, 40, 41, 42, 57, 74, ButtonPressMask 54, 106 75, 76, 78, 83, 84, 89, 97, 100, 101, ButtonRelease 125, 126, 127 106, 107, 112, 141 ButtonReleaseMask 54 BadPixmap 142 ByteOrder 32 BadRequest 142 BadValue 18, 19, 22, 29, 42, 75, 79, 94, 96, 98, 107, 108, 142 C BadWindow 142 CapButt 73, 74, 82 Below 107, 130 CapNotLast 73, 74, 82 BelowOf 66, 67 CapProjecting 73, 74, 82 BitmapBitOrder 31 CapRound 73, 74, 82 BitmapFileInvalid 97 CellsOfScreen 32 BitmapNoMemory 97 CenterGravity 102, 103 143 144 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 CharAscent 59, 60 CWWinGravity 100, 105 CharAttributes 59 CharDescent 59, 60 CharLBearing 59 D CharRBearing 59 Data 87 CharWidth 59, 60 DefaultBlanking 94 CirculateDirection 110, 111 DefaultColormap 22 CirculateNotify 111, 125, 128 DefaultDepth 22, 23 CirculateRequest 54, 111, 125, 128 DefaultExposures 94 ClipByChildren 40, 75, 84 DefaultGC 70 ColormapChangeMask 54 DefaultVisual 34 ColormapExists 33 DeleteRequest 125, 130 ColormapID 33 DestroyNotify 101, 125, 131 ColormapNotify 25, 26, 105, 125, 128 DestructArea 67, 68 Complex 49, 50 DestructRect 67 ConfigureNotify 125, 129 DirectColor 18, 19, 23, 24, 25 ConfigureRequest 54, 108, 111, 112, 125, DisplayCells 23 130 DisplayConnected 34 ControlDown 52, 53 DisplayHeight 34 ControlMask 53, 126, 127, 132 DisplayHeightMM 34 Convex 49, 50 DisplayPlanes 35 CoordMode 45, 46, 49 DisplayString 35 CoordModeOrigin 45, 46, 49, 50 DisplayWidth 34 CoordModePrevious 45, 46, 49, 50 DisplayWidthMM 34 CopyArea 42, 133, 134 DoesBackingStore 35 CopyFromParentClass 99, 100, 102 DoesSaveUnders 36 CopyFromParentDrawable 37, 105, 106 DontAllowExposures 94 CopyFromParentVisual 37, 100 DontCareState 117, 118 CopyPlane 133, 134 DontPreferBlanking 94 CreateNotify 100, 101, 125, 130 DrawableExists 14, 33 CurrentTime 56, 57, 93, 137 DrawableID 33 CursorExists 14, 33 CursorID 33 E CursorShape 39, 40 EastGravity 102, 103 CWBackingPixel 100, 105 EnterNotify 55, 125, 131, 132, 133 CWBackingPlanes 100, 105 EnterWindowMask 54 CWBackingStore 100, 105 EvenOddRule 75, 80 CWBackPixel 100, 105 EventMask 36, 54, 100, 102, 105 CWBackPixmap 100, 105 EventMaskOfScreen 36 CWBitGravity 100, 105 Expose 40, 41, 55, 68, 95, 101, 107, 108, CWBorderPixel 100, 105 109, 111, 112, 113, 125, 132, 133 CWBorderPixmap 100, 105 ExposureMask 54 CWBorderWidth 107 Exposures 94 CWColormap 100, 105 CWCursor 100, 105 CWDontPropagate 100, 105 F CWEventMask 100, 105 FillOpaqueStippled 42, 74, 80 CWOverrideRedirect 100, 105 FillSolid 44, 74, 80 CWPosition 107 FillStippled 74, 80 CWSaveUnder 100, 105 FillTiled 11, 74, 80 CWSibling 107 FocusChangeMask 54 CWSize 107 FocusIn 57, 125, 133 CWStackMode 107 FocusOut 57, 125, 133 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 145 FontDirection 59, 60, 61, 64 GrayScale 18, 23, 24, 25, 27, 29 FontExists 14, 33 GXand 71 FontID 33 GXandInverted 71 FontLeftToRight 61, 62, 65 GXandReverse 71 FontRightToLeft 61, 62, 65 GXclear 71 ForgetGravity 102, 103 GXcopy 41, 44, 71 FSAllCharsExist 59 GXcopyInverted 71 FSAscent 59 GXequiv 71 FSDefaultChar 59 GXinvert 71 FSDescent 59 GXnand 71 FSDirection 59 GXnoop 71 FSFont 59 GXnor 71 FSMaxBounds 59, 60 GXor 71 FSMaxByte1 59 GXorInverted 71 FSMaxChar 59 GXorReverse 71 FSMaxHeight 59, 60 GXset 71 FSMaxWidth 59, 60 GXxor 71 FSMinBounds 59, 60 FSMinByte1 59 FSMinChar 59 H FSMinHeight 59, 60 Height 67, 68 FSMinWidth 59, 60 HorizontallyAbutting 66, 67 G IconicState I 117, 118 GCArcMode 71, 75, 76 IconMaskHint 117, 118 GCBackground 71 IconPixmapHint 117, 118 GCCapStyle 71, 73, 82 IconPositionHint 117, 118 GCClipMask 71 IconWindowHint 117, 118 GCClipOrigin 71 ImageByteOrder 85 GCDashList 71 ImageData 87 GCDashOffset 71 ImageDepth 85 GCExists 14, 33 ImageFormat 86, 87, 88 GCFillRule 71, 75, 79, 80 ImageOrder 31, 32, 85, 87 GCFillStyle 71, 74, 80 ImageSize 85 GCFont 71 InactiveState 117, 118 GCForeground 71 IncludeInferiors 75, 84 GCFunction 71, 81, 83 IncludePoint 69 GCGraphicsExposures 71 InputFocus 37 GCID 33 InputHint 117 GCJoinStyle 71, 73, 82 InputOnlyClass 41, 96, 99, 100, 101, 102, GCLineStyle 71, 73, 82 103, 104, 106, 107, 141 GCLineWidth 71 InputOutputClass 75, 99, 100, 101, 102, GCOrder 77, 78 103, 109 GCPlaneMask 71, 72 Inside 66, 67 GCStipple 71 Intersection 67 GCSubwindowMode 71, 75, 84 IsCursorKey 52 GCTile 71 IsFunctionKey 52 GCTSOrigin 71 IsKeypadKey 52 GraphicsCode 133 IsMiscFunctionKey 52 GraphicsExpose 41, 75, 82, 125, 133, 134 IsModifierKey 52 Gravity 100, 102, 105, 121, 122 IsPFKey 52 GravityNotify 125, 134 IsUnmapped 102, 103 146 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 IsUnviewable 102, 103 NoDrawable 28, 37, 40, 41, 56, IsViewable 102, 103 57, 59, 75, 77, 78, 93, 97, 105, 106, 110, 127, 129, 132 NoExpose 41, 82, 125, 133 J NoFont 28, 37, 48, 49 JoinBevel 73, 82 Nonconvex 49, 50 JoinMiter 11, 73, 82 NormalState 117, 118 JoinRound 73, 82 NorthEastGravity 102, 103, 123 NorthGravity 102, 103 K NorthWestGravity 102, 103, 123 KeymapNotify 125, 134 NoSymbol 53 KeymapStateMask 54 Not 15, 52 KeyPress 125, 126, 127 Nothing 67 KeyPressMask 54 NotifyAncestor 131, 132, 133 KeyRelease 125, 126, 127 NotifyDetail 131, 133 KeyReleaseMask 54 NotifyDetailNone 131, 133 NotifyGrab 131, 132, 133 NotifyInferior 131, 132, 133 L NotifyMode 131, 133 LeaveNotify 55, 125, 131, 132, 133 NotifyNonLinear 131, 132, 133 LeaveWindowMask 54 NotifyNonLinearVirtual 131, 132, 133 Left 67, 68 NotifyNormal 131, 132, 133 LeftOf 66, 67 NotifyPointer 131, 133 LineDoubleDash 73, 74, 82 NotifyPointerRoot 131, 133 LineOnOffDash 73, 74, 82 NotifyUngrab 131, 132, 133 LineSolid 73, 74, 82 NotifyVirtual 131, 132, 133 LockMask 126, 127, 132 NotifyWhileGrabbed 131, 133 LowerHighest 111, 112 NotUseful 35, 100, 102, 103 LSBFirst 31, 32, 85, 87 NoVisual 37 NullHandler 55 M MakeRect 68, 69 O MapNotify 109, 125, 135 OffsetRect 69 MapRequest 54, 109, 125, 135 Opposite 107, 130 MapState 102 Or 15 MaxCmapsOfScreen 37 OutsetRect 69 Message 56, 125, 135 Overlap 66, 67 MinCmapsOfScreen 36 OwnerGrabButtonMask 54 Mod1Mask 126, 127, 132 Mod2Mask 126, 127, 132 P Mod3Mask 126, 127, 132 ParentRelative 37, 105, 106, 112 Mod4Mask 126, 127, 132 PAspect 121, 122 Mod5Mask 126, 127, 132 PBaseSize 121, 122 Modifier 52, 53, 109, 126, 131 Pixel 16 MotionNotify 55, 125, 126, 128 Placement 128 MSBFirst 31, 32, 85, 87 PlaceOnBottom 128 PlaceOnTop 128 N PMaxSize 121, 122 NegativePoint 69 PMinSize 121, 122 NoColormap 25, 37, 102, 103, 129 PointerMotionHintMask 54 NoCursor 29, 30, 37, 106 PointerMotionMask 54 PointerRoot 37, 56, 57, 118 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 147 PointerWindow 37 ScreenSaverActive 94, 95 PolyShape 49 ScreenSaverReset 94, 95 PPosition 121, 122 Section 67 PreferBlanking 94 SelectionClear 93, 125, 136 PResizeInc 121, 122 SelectionNotify 93, 125, 137 PropertyArc 91 SelectionRequest 93, 125, 137 PropertyAtom 91 ServerVendor 38 PropertyBitmap 91 ShapeClass 39 PropertyChangeMask 54 ShiftDown 52, 53 PropertyColormap 91 ShiftMask 53, 126, 127, 132 PropertyCursor 91 SouthEastGravity 102, 103, 123 PropertyDrawable 91 SouthGravity 102, 103 PropertyFont 91 SouthWestGravity 102, 103, 123 PropertyInteger 91 SplitRect 68, 69 PropertyPixmap 91 StackMode 107, 130 PropertyPoint 91 StateHint 117, 118 PropertyRectangle 91 StaticColor 23, 24, 25 PropertyRGBColormap 91 StaticGravity 102, 103 PropertyString 91 StaticGray 23, 24, 25, 29 PropertyValue 91 StippleShape 39, 40 PropertyVisual 91 StructureNotifyMask 54, 128, 129, 131, 134, PropertyWindow 91 135, 136, 138 PropertyWMHints 91 SubstructureNotifyMask 54, 128, 129, 131, PropertyWMIconSizes 91 134, 135, 136, 138 PropertyWMSizeHints 91 SubstructureRedirectMask 54, 106, 108, ProtocolRevision 37, 38 109, 111, 112 ProtocolVersion 38 SubtractPoint 66 PseudoColor 18, 19, 23, 24, 25 PSize 121, 122 PSPerChar 59, 60 T PWinGravity 121, 122 TileShape 39, 40 Top 67, 68 TopIf 107, 130 R TopLeft 67, 68 RaiseLowest 111, 112 TopRight 67, 68 Rect 51, 67, 68 TrueColor 23, 24, 25 Reflect 70 ReparentNotify 112, 125, 135 ResizeRedirectMask 54, 106 U ResizeRequest 54, 125, 136 Union 67 RevertCode 56 UnmapGravity 102, 103, 138 RevertToNone 56, 57 UnmapNotify 113, 125, 133, 137 RevertToParent 56, 57 Unsorted 78 RevertToPointerRoot 56, 57 RGB_COLOR_MAP 27, 28 V RGB_DEFAULT_MAP 27, 28 VendorRelease 39 Right 67, 68 VerticallyAbutting 66, 67 RightOf 66, 67 Visibility 138 RootWindow 38 VisibilityChangeMask 54 VisibilityNotify 125, 133, 138 S VisibilityObscured 138 SameDrawable 33 VisibilityPartiallyObscured 138 SaveMode 94 VisibilityUnobscured 138 148 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 VisualBlueMask 86 XConfigureWindow 106, 107, 141 VisualClass 23, 24 XConvertSelection 92, 93, 137 VisualExists 33 XCopyArea 41, 75, 82, 134, 141 VisualGreenMask 86 XCopyColormapAndFree 24, 25 VisualID 33 XCopyPlane41, 42, 75, 82, 96, 134, 141, 142 VisualRedMask 86 XCreateBitmapFromData 96, 97 XCreateColormap 24, 25, 27, 141 W XCreateFontCursorXCreateGC 28 71, 76,* * 78 WestGravity 102, 103 XCreateGlyphCursor 28, 29, 142 WhenMapped 35, 100, 102, 103, 105 XCreateImage 86, 87 WhitePixel 15, 16 XCreatePixmap 95, 96, 142 Width 67, 68 XCreatePixmapCursor 28, 29, 141 WindingRule 75, 80 XCreatePixmapFromBitmapData 96, 97, WindowClass 99, 100, 102 141 Within 66, 67 XCreateSimpleWindow 26, 99, 101 WM_CLASS 115, 120 XCreateWindow 25, 26, 99, 100 WM_CLIENT_MACHINE 92, 115, 120 XDefineCursor 29, 30, 100 WM_COLORMAP_WINDOWS 116 XDeleteProperty 90 WM_COMMAND 92, 117, 120 XDestroySubwindows 101 WM_HINTS 118, 120 XDestroyWindow 13, 101 WM_ICON_NAME 92, 119, 120 XDrawArc 42, 43 WM_NAME 92, 119, 120 XDrawArcs 42, 43 WM_NORMAL_HINTS 120, 122, 123 XDrawImageString 44, 48 WM_SIZE_HINTS 121, 122 XDrawImageString16 44 WM_TRANSIENT_FOR 114 XDrawLine 45 XDrawLines 11, 45 X XDrawPoint 46 XActivateScreenSaver 94, 95 XDrawPoints 46 XAddPixel 86, 88 XDrawRectangle 46, 47 XAllocColor 17, 18, 19, 20, 25 XDrawRectangles 46, 47 XAllocColorCells 17, 18, 19, 25, 142 XDrawSegments 45 XAllocColorPlanes 17, 18, 19, 25, 27, 142 XDrawString 47, 48 XAllocNamedColor 17, 18, 19, 20, 25 XDrawString16 47 XArc 42, 43, 49, 91 XDrawText 48, 49 XAutoRepeatOff 98 XDrawText16 48, 49 XAutoRepeatOn 98 XEvent 55, 56, 125 XA_PIXMAP 137 XFillArc 49, 51 XA_PRIMARY 11, 93, 137 XFillArcs 49, 51, 75 XA_SECONDARY 93 XFillPolygon 49, 50, 75 XA_STRING 11, 117 XFillRectangle 49, 50 XA_WINDOW 116 XFillRectangles 49, 50 XBell 98, 142 XFlush 57, 58 XChangeGC 71, 76, 78, 141 XFontStruct 48, 59, 60, 61, 62, 63, 64, 65, XChangeWindowAttributes 25, 26, 104, 105 66 XCharStruct 59, 60, 61, 62, 63, 64, 65 XForceScreenSaver 94, 95 XCirculateSubwindows 110, 111, 112 XFreeColormap 13, 24, 25, 129 XCirculateSubwindowsDown 110, 111, 112 XFreeColors 13, 17, 19, 25, 139, 142 XCirculateSubwindowsUp 110, 111 XFreeCursor 13, 30 XClearArea 40, 41, 141 XFreeFont 29, 61, 64 XClearWindow 40, 41, 105, 141 XFreeGC 13, 71, 76 XColor 13, 16, 17, 18, 19, 20, 21, 22, 24, 28, XFreePixmap 13, 95, 96, 97 29, 30 XGCValue 71 cOAbstract Hardware Ltd 1991,1994 X Reference 1.1 149 XGetAtomName 90, 91 XQueryBestStipple 39, 40 XGetDefault 20, 98, 99 XQueryBestTile 39, 40 XGetFontPath 64 XQueryColor 19, 20 XGetGeometry 101, 102, 104 XQueryColors 19, 20 XGetIconSizes 113, 114 XQueryFont 61, 63 XGetImage 88, 89, 141 XQueryKeymap 98 XGetInputFocus 56, 57 XQueryPointer 109, 110 XGetPixel 86, 88 XQueryTree 104, 110 XGetRGBColormaps 26, 28 XRaiseWindow 110, 111 XGetScreenSaver 94, 95 XReadBitmapFile 96, 97 XGetSelectionOwner 92, 93 XRecolorCursor 29, 30 XGetSubImage 88, 89, 141 XReparentWindow 112, 141 XGetTextProperty 91, 92, 115, 119 XResetScreenSaver 94, 95 XGetTransientForHint 114 XResizeWindow 106, 108, 142 XGetWindowAttributes 101, 102, 104 XRestackWindows 110, 111, 112, 141 XGetWindowBorderWidth 104 XSelectInput 54, 139 XGetWindowChildren 104 XSendSelectionNotify 92, 93, 94 XGetWindowDepth 104 XSetArcMode 76 XGetWindowParent 104 XSetBackground 76 XGetWindowPosition 104 XSetClipMask 77, 78 XGetWindowRoot 104 XSetClipOrigin 77 XGetWindowSize 104 XSetClipRectangles 75, 76, 77, 78, 141 XGetWMClass 114, 115 XSetColours 78 XGetWMClientMachine 115 XSetDashes 75, 76, 79, 142 XGetWMColormapWindows 116 XSetFillRule 79, 80 XGetWMCommand 116, 117 XSetFillStyle 80 XGetWMHints 117, 118 XSetFont 80 XGetWMIconName 118, 119 XSetFontPath 61, 64 XGetWMName 119 XSetForeground 81 XGetWMNormalHints 121, 122 XSetFunction 81 XGetWMSizeHints 121, 122 XSetGraphicsExposures 81, 82 XImage 85, 86, 87, 88, 89 XSetHandler 52, 55, 56, 135 XInstallColormap 25, 26, 105 XSetIconSizes 113, 114 XInternAtom 90, 91 XSetInputFocus 56, 57, 141 XListFonts 60, 61 XSetLineAttributes 82 XListFontsWithInfo 60, 61 XSetPlaneMask 82 XListInstalledColormaps 25, 26 XSetProperty 91, 92, 115, 119 XLoadFont 61, 63 XSetRGBColormaps 26, 27 XLoadQueryFont 11, 61, 63 XSetScreenSaver 94, 95, 142 XLookupColor 19, 20 XSetSelectionOwner 92, 93, 136, 137 XLookupString 53 XSetState 83 XLowerWindow 110, 111 XSetStipple 83 XMapRaised 108, 109 XSetSubwindowMode 84 XMapSubwindows 108, 109 XSetTile 84 XMapWindow 100, 108, 109 XSetTransientForHint 114 XMoveResizeWindow 106, 108 XSetTSOrigin 85 XMoveWindow 106, 107 XSetWindowAttributes 99, 100, 104, 105 Xor 15 XSetWindowBackground 104, 105, 106 XParseColor 20 XSetWindowBackgroundPixmap 104, 105, XPutImage 88, 89, 97, 141 106 XPutPixel 86, 88 XSetWindowBorder 104, 105, 106 XQueryBestCursor 39, 40 XSetWindowBorderPixmap 104, 105, 106 XQueryBestSize 39, 40 XSetWindowBorderWidth 106, 108 150 X Reference 1.1 Oc Abstract Hardware Ltd 1991,1994 XSetWindowColormap 11, 24, 25, 26, 141 XSetWMClass 114, 115, 120 XSetWMClientMachine 115 XSetWMColormapWindows 116 XSetWMCommand 116, 117, 120 XSetWMHints 114, 117, 118, 120 XSetWMIconName 118, 119, 120 XSetWMName 119, 120 XSetWMNormalHints 120, 121, 122 XSetWMProperties 119, 120 XSetWMSizeHints 121 XStandardColormap 26, 27, 91 XStoreColor 19, 20, 21, 22 XStoreColors 19, 21, 22, 139, 142 XStoreNamedColor 19, 21, 22, 139 XSubImage 86, 88 XSync 57, 58 XSyncronise 58 XTextExtents 44, 64, 65 XTextExtents16 64, 65 XTextItem 48 XTextItem16 48, 49 XTextWidth 65, 66 XTextWidth16 65, 66 XTranslateCoordinates 58, 59 XUndefineCursor 29, 30 XUninstallColormap 25, 26 XUnloadFont 13, 61, 63, 64 XUnmapSubwindows 113 XUnmapWindow 113 XWindowAttributes 101, 102, 104 XWindowChanges 106, 107 XWindows 18, 19, 20, 21, 26, 33, 34, 51, 52, 61, 63, 64, 88, 89, 91, 92, 99, 100, 101, 104, 110, 114, 116, 117, 119 XWMGeometry 122, 123 XWMHint 91, 117, 119, 120 XWMSizeHint 91, 119, 120, 121, 122, 123 XWMStateHint 117 XWriteBitmapFile 96, 97 XYBitmap 87, 88, 89, 141 XYPixmap 87, 88, 89, 141 Y YSorted 78 YXBanded 78 YXSorted 78 Z ZoomState 117, 118 ZPixmap 87, 88, 89, 141 polyml-5.6/documentation/Reference/docstyle.css000066400000000000000000000014241265146633400220220ustar00rootroot00000000000000ul.nav { margin:0; padding:0; list-style:none; height:36px; line-height:36px; background:#D60B22; font-family:Arial, Helvetica, sans-serif; font-size:13px; } ul.nav li { border-right:1px solid #EBB9BD; /* The divisions */ float:left; } ul.nav a { display:block; padding:0 28px; color:#F7C1C1; text-decoration:none; } ul.nav a:hover, ul.nav li.current a { background:#F7001D; } pre.mainsig { display: block; font-family: Courier New, Courier, mono; font-size: 11pt; white-space: pre; margin: 1em 0; } .identifier { font-family: Courier New, Courier, mono; font-size: 11pt; } .entryblock { } .entrycode { margin-bottom: 0; } .entrytext { margin-left: 2em; } p { margin-top: 0em; margin-bottom: 1em; }polyml-5.6/documentation/ReleaseNotes.html000066400000000000000000002203221265146633400210430ustar00rootroot00000000000000 Poly/ML Release Notes
Poly/ML Home
About Poly/ML
Support for Poly/ML
Documentation
Get Poly/ML

Poly/ML Version 5.5.1

Released September 2013

Major New Features and Changes

  • The intermediate code optimiser has been largely rewritten. The optimiser now detects various additional cases where a closures or tuples can be stored on the stack rather than requiring heap storage
  • The match compiler that processes a sequence of patterns in a case or fun-binding has been reworked. This now handles complex matches that used to result in a code blow-up
  • A"polyc" script has been added to aid compiling and linking ML code to produce a stand-alone binary. This is intended as an analogue of cc and gcc. The easiest way to build a binary is now to put the ML code into a file (foo.ML) with a function "main" that is the entry point to the code. Then run
    polyc -o foo foo.ML
    The script takes care of any libraries that may be required. It does require that the poly binary and libraries have been installed to the location that was specified in the configure script.
  • Set the default in the configure script not to build a shared library. This can be overidden with --enable-shared. The advantage of this is that binaries created from Poly/ML, including poly itself, do not require libpolyml at run-time.
  • Additions and changes to the command-line options when starting the ML top-level
    • The --eval option can be followed by a string which is compiled and executed before the top-level is entered
    • The --script option can be used to allow ML code to be run as a script (a "shell script") in Unix. It reads the file name given as the last option, skipping the first line if it begins #!. Implies -q option. Note: because of the way scripts pass their options if used this must be the only option. To use ML as a script put the ML code into a file, put
      #! /usr/local/bin/poly --script
      as the first line, modifying the path depending on where poly is installed, and set the file to have execute permission.
    • The -q option now sets the print depth to zero as well as suppressing the start-up message
    • The input prompt (> or #) is only produced if the input is a terminal. The -i option should be used to cause the prompt to be produced if, for example, the input is from a pipe.

Minor Additions and Changes

  • The -H option now sets the initial heap size rather than being a synonym for --minheap
  • Add large file support
  • When printing the fields a record print them in alphabetical order rather than the system order used in the compiler
  • Convert the representation of the statistics to use ASN1 encoding. This is byte-order and word-length independent and allows 32-bit Poly/ML to read the statistics of 64-bit Poly/ML on the same machine and vice-versa.
  • Add a substructure Exception to the PolyML structure to hold all the functions related to exceptions.
  • The default for --gc-threads is now the number of independent physical processors. Hyperthreaded cores are counted as single cores rather than dual cores.
  • Improve the GC and allocation code for very large arrays
  • Improve handling of OS.Process.system in Cygwin
  • Improved versions of Word32 and Word64. These are used for SystemWord and LargeWord.

Bug Fixes

  • Fix Word32.fromLargeInt which could return values outside the range of Word32
  • Fix segfault in PolyML.stackTrace
  • Fix errors in conversion of string to real values
  • Fix segfault when a thread created in foreign code called an ML callback
  • Fix profiler which could often report UNKNOWN function
  • Fix bug with overlapped areas in ArraySlice.copy
  • Fix InternalError exception with ML code where a fixed record type could not be found
  • Fix bug with equality on BoolVector.vector
  • Raise the correct exception (Size) for negative lengths in canInput and inputN
  • Fix Real.fromInt with an argument that was an arbitrary precision number in the long form
  • Fix error in the timing information printed with PolyML.timing true in Windows.
  • Fix occasional problem with input/output as a result of the stream token being represented by an immutable value but then being checked for equality
  • Fix bug in X86-64 code-generator with literal constants that do not fit in 32-bits. It could result in an "InternalError: gen32s: invalid word" exception. Includes regression test.
  • Fix LargWord.fromInt which was wrong for large negative values
  • Fix bug in power-of-two function in code-generator. This caused an infinite loop with Word.* when multiplying by a constant with the highest bit set and not a power of two.
  • Fix bug in structure matching code
  • Use ELF_Rela relocation structures for all relocations in X86-64. Some systems e.g. Solaris require this.

Poly/ML Version 5.5

Released September 2012

Major New Features

  • Storage management rewrite. The storage management system has been almost completely rewritten. The garbage collector is parallelised and a new mechanism has been introduced to adjust the size of the heap. When space is very short an extra pass may be triggered that merges immutable cells with the same contents. Thanks to Tobias Nipkow and the Technical University of Munich for support for this work.
  • PolyML.shareCommonData has been parallelised and now uses a dynamic stack to avoid a possible segfault if the C stack overflows with deep data structures.
  • There is now support for 64-bit on Windows using either mingw or Visual Studio.
  • Added a PolyML.Statistics structure to extract information about the current ML program or that running in another process.
  • The standard "text" and "data" areas are now used for exported object files. In particular this removes the need for --segprot when linking the object files on Mac OS X with previous versions.
  • libffi is now used for foreign function interface (CInterface). Among other things this allows the full range of types to be use on X86/64. A version of libffi is included in the source but those packaging Poly/ML may prefer to use the --with-system-libffi option to the configure script to use the version installed on the machine.
  • Withdrawn support for native-code on PPC and Sparc. The configure script will now fall back to the interpreted version on these platforms.

Minor Additions and Changes

  • Added G, M, K suffix to RTS arguments for --maxheap and --minheap.
  • Some changes to where "op" is allowed to conform more closely to the Definition.
  • --debug and --logfile options. These allow fine control of debugging information within the run-time system.
  • Added --error-exit option to terminate the top-level loop if any command raises an exception.
  • Added PolyML.IntInf with gcd and lcm functions to use GMP's gcd function if available.
  • Added PolyML.Compiler.allocationProfiling to work with PolyML.profiling 4. This causes each full GC to print a profile indicating where the currently live data has been allocated.
  • Removed NetDB structure from the library since this was in an early draft of the basis library but not in the final book.
  • Added PolyML.Codetree structure within PolyML. This allows ML code to build intermediate code data structures and generate machine code from them.
  • Added "--use FILENAME" command line argument to run a command from a file before starting the main Read-Eval-Print loop.

Bug Fixes

  • Fixes related to Word32 on X86-64 and Word.~>>.
  • Vol allocation locking issue
  • Floating point box issue
  • Fix some functions in the Windows structure to match the Basis Library definition
  • Fix a possible crash if a GC happened while another thread was in foreign code.
  • Fix error in printer function for a datatype where the effect of PolyML.print_depth depended on the posiition of a constructor in the datatype.
  • Fix bug with flexible record handling.
  • Fix Real.fmt and Real.toString to conform to the Basis Library definition.
  • Fix Real.abs with nan argument.
  • Fix IEEEReal.toString for nan argument.
  • Fix code-generator bug which resulted in incorrect result for Real.nextAfter.
  • Fix bug the produced Subscript exceptions in stream IO.

Poly/ML Version 5.4

Released September 2010

Major New Features

  • Major rewrite of the X86 code-generator and combining the 32 and 64-bit versions into a single module. It now supports the floating point instructions.
  • Changes to the way functions with polymorphic equality are handled to eliminate the "structural equality" code.
  • Uses the GMP library if that is available when Poly/ML is built otherwise falls back to the old Poly/ML code.

Minor Additions and Changes

  • Added a SingleAssignment structure
  • Support for the Itanium processor using the interpreted version.
  • Various bug fixes.

Poly/ML Version 5.3

Released November 2009

Major New Features

  • Addition of IDE interface support.
  • Changes to pretty-printing and equality. These are now inherited across module boundaries. Addition of PolyML.addPrettyPrinter to install a new-style pretty printer.
  • Reworked implementation of signatures reducing the memory requirements when a named signature is used in multiple places.
  • Improvements to printing of types and error messages.

Minor Additions and Changes

  • Support for out-of-tree builds
  • Added finalisation for foreign-function interface (CInterface)
  • Removed remaining support for ML90
  • Added PolyML.sourceLocation pseudo-function that returns the current source location, PolyML.raiseWithLocation that raises an exception with an explicit location and PolyML.exceptionLocation that returns the location where an exception was raised.
  • Added PolyML.Compiler.reportUnreferencedIds switch to enable reporting of unreferenced identifiers.
  • Added breakEx and clearEx to debugger functions. These enter the debugger when the code raises a given exception.
  • Improvement to resonsiveness to pipes especially in Windows.
  • Added X86-64 version of Word32 structure. 64-bit machines do not require 32-bit values to be "boxed".

Bug Fixes

  • Now builds on Mac OS X 10.6 (Snow Leopard)
  • Fix multi-threading on Sparc but now only supports v9 processors.
  • Fix timing-related crash when Poly/ML exits
  • Fix string argument to OS.SysErr exception
  • Fix to OS.FileSys.mkDir in Windows
  • Fix to pow(~1, n) where n is even
  • Various fixes to conform more closely to the standard.

Poly/ML Version 5.2.1

Released October 2008

Bug Fixes

  • Various fixes to the run-time system.
  • Fix in Thread.ConditionVar.waitUntil. This could deadlock if the time calculation resulted in a garbage collection.
  • Fix to Substring.isPrefix and Substring.isSuffix with single character arguments.
Minor Additions and Changes
  • X-Windows/Motif is now not included by default. The --with-x option is required for configure
  • Functional I/O has been changed to be more efficient.

Poly/ML Version 5.2

Released June 2008

Major New Features

  • Changes to PolyML.compiler. Addition of "namespaces" to allow top-level declarations to be grouped
  • Improvements to real numbers on X86 (32 and 64-bit)
  • Improvements to the source-level debugger
  • Addition of weak references in the Weak structure.

Minor Additions and Changes

  • Fixed a hot-spot in the compiler.
  • Changes to handling of signals in the Signal structure

Poly/ML Version 5.1

Released November 2007

Major New Features

  • True multi-threading
  • Saving state

Minor Additions and Changes

  • Support for building Windows version on msys.
  • Support for building interpreted version for ARM processor.
  • Changes to some message values in the Windows interface structure. The type of Windows callback functions has changed.
  • Addition of Int32 structure and TEXT_IO signature to the basis library.
  • Support for building Sparc version on Linux.
  • SIGALRM is no longer used by the run-time system.

Bug Fixes

  • Now builds on Mac OS X 10.5 (Leopard)
  • Fix for Sparc Solaris 10 which would crash because Poly/ML used the g7 register
  • Added signature constraints after structure values (strexp: sigexp)
  • Word8Array.vector produced wrong value when applied to an empty array.
  • Fix to type of Real.fromDecimal and changes to handling of overflow in conversion of strings to reals.
  • Fix to Word32.~ and addition of overload for it.
  • Fix to start-up code on PowerPC which could cause a crash under some C compilers.

Poly/ML Version 5

New Features

  • Support for stand-alone binaries
  • Support for additional platforms: AMD64, Intel Macs, Cygwin
  • No artificial limits on size of heaps or saved image
  • Uses standard GNU tools for building
  • Fixed address mmap and trap-handling removed

Version 5

Thanks to some financial support from the Verisoft project organised through the Technical University of Munich I have spent several months updating the Poly/ML run-time system. There are many internal changes detailed below but there is one major change that is likely to affect all users. The persistent storage system that has been a feature of Poly/ML almost since the beginning has finally reached its sell-by date and has been removed. In its place there is the facility to export ML functions as object files and link them to produce stand-alone executables.

Although the ML code has not been significantly changed, with the exception of a new code-generator for the 64-bit AMD/Intel processor, the run-time system has been modified substantially. The aim has been to try to produce a version that will work across a wider range of systems than before and will be much simpler to maintain. The C code has been converted to C++ and standard GNU tools: autoconf, automake and libtool are used to build the system. Memory mapping to fixed addresses, which caused problems with various Linux distributions, has been removed and the use of traps to handle arbitrary precision overflow and heap limits has been replaced by calls into the run-time system. The artificial limits on the size of the heap and of the saved database have been removed and the only limit on the size of the working heap is likely to be swap space.

To build and install Poly/ML download and unpack the source. You can then build poly with the commands

./configure
make
make install

./configure by default places installed files within /usr/local and in particular the libraries are placed in /usr/local/lib. Some Unix distributions (e.g. Fedora Core) do not include /usr/local/lib in the library search path and on those distributions it may be better to override this by specifying
./configure --prefix=/usr

You build an application by constructing your application as an ML function and calling PolyML.export. PolyML.export takes as its argument a file name for the resulting object file and a function to export. It will automatically add the normal extension for an object file (.o or .obj as appropriate) unless it already included and write out the function and any data reachable from it as a normal operating system object file. This can then be linked with the poly libraries to build an application.

Example of building an application

$ poly
Poly/ML 5.0 Release
> fun f () = print "Hello World\n";
val f = fn : unit -> unit
> PolyML.export("hello", f);
val it = () : unit
> ^D
$ cc -o hello hello.o -lpolymain -lpolyml
$ ./hello
Hello World

If you have installed the libraries in a directory that is not in the search path you may need to add this. For example
cc -o hello hello.o -L/usr/local/lib -lpolymain -lpolyml
It is possible to use the ld command rather than cc here but you may need to include some of the default C and C++ libraries on the command line. On some platforms it may be necessary to add -lstdc++ and on Mac OS X you may need to add -segprot POLY rwx rwx to prevent a Bus Error when you run your application.

It is often the case that applications built using Poly/ML will want to use the normal Poly/ML top-level but with additional ML functions or structures built in. In the old version this was achieved by compiling the new declarations and then committing the database. The new version does this slightly differently. First compile in the new declarations as before and then export the Poly/ML top level by exporting PolyML.rootFunction.

$ poly
Poly/ML 5.0 Release
> val myValue = "This is a new value";
val myValue = "This is a new value" : string
> PolyML.export("mypoly", PolyML.rootFunction);
val it = () : unit
> ^D
$ cc -o mypoly mypoly.o -lpolymain -lpolyml
$ ./mypoly
Poly/ML 5.0 Beta1
> myValue;
val it = "This is a new value" : string
>

PolyML.export writes its output to an object file in the native format on the machine on which it is running. Currently Poly/ML supports three different formats: ELF, used on Linux, FreeBSD and Solaris; PCOFF, used on Windows and Cygwin and Mach-O, used on Mac OS X. If it is necessary to distribute software in object format it would be inconvenient to have to produce versions for each combination of architecture (e.g. X86-32, X86-64, PPC and Sparc) and each possible object format. To avoid this there is a PolyML.exportPortable function which takes similar arguments to PolyML.export but writes its output to a text file in a portable format. There is a polyimport command which loads a file stored in this format and runs it.

$ poly
Poly/ML 5.0
Release
> fun f () = print "Hello World\n";
val f = fn : unit -> unit
> PolyML.exportPortable("hello", f);
val it = () : unit
> ^D
$ polyimport hello.txt
Hello World

While this is convenient for porting the portable format is not designed for efficiency. The Poly/ML build process uses the portable format within the distribution but the build script then exports the code in the native format. N.B. The portable format only avoids the need to produce different object code formats. It is not portable across different architectures (e.g. i386 to PPC) since the portable file still contains native machine instructions encoded as strings.

The previous version of Poly/ML had a command line option to compress a database by sharing immutable data. This has been replaced in the new version by the PolyML.shareCommonData function. This takes as its argument any data structure and it processes this structure replacing any multiple occurrences of the same immutable data by a pointer to a single occurrence. In effect, wherever in the data structure there are two substructures which would be equal using the ML definition of equality there will be a pointer to a single data structure.

The intended use of this is primarily to reduce the size of a data structure before it is exported. It can be used in the above example but in this case the function being exported is so simple that it is unlikely to be worthwhile.

$ poly
Poly/ML 5.0
Release
> fun f () = print "Hello World\n";
val f = fn : unit -> unit
> PolyML.shareCommonData f;
val it = () : unit
> PolyML.export("hello", f);
val it = () : unit
> ^D

The new version uses the standard GNU tools: autoconf, automake and libtool. There is no need to install these tools in order to install and run Poly/ML unless you need to make modifications to the setup which are not handled within the configure and make files. Using these tools should make porting to other versions of Unix easier and should make it fairly simple to build binary or source distributions to include in Unix distributions.

The command line arguments to Poly/ML have been simplified. There are a few command line arguments that are taken by the Poly/ML run time system and the remainder are passed to the application via the standard basis library CommandLine structure. The run-time system recognises the following arguments:

-H <Initial heap size (MB)>
--immutable <Initial size of immutable buffer (MB)>
--mutable <Initial size of mutable buffer(MB)>
--debug <Debug options>
--timeslice <Time slice (ms)>

The poly application itself recognises a few arguments:

-v Print the version of Poly/ML and exit
--help Print the list of arguments and exit
-q Suppress the start-up message

If you are building your own application that recognises --help as a command line argument you should call PolyML.rtsArgumentHelp() to retrieve the information about the run-time system arguments and include this in any help text you produce.

The heap size arguments set the initial heap size but the heap may grow beyond this if your application needs more space. If no argument is set the default size is half the physical memory available on your machine.

Release notes: Version 4.1.4 Release

New features and Changes

Converted PolyML.dsw and PolyML.dsp to binary. This simplifies building from source on Windows.

The exception PolyML.Commit now has type string->exn.

PolyML.commit now raises PolyML.Commit if the database is read-only.

Timing functions no longer fail occasionally with getrusage: EINTR on Solaris (actually a work-around for a bug/documentation error in Solaris).

Release notes: Version 4.1.3 Release

New features and Changes

Printing control switches
New switches have been added to the Poly/ML.Compiler structure to control the printing of declarations. In both cases the default setting is true. Setting PolyML.Compiler.printInAlphabeticalOrder causes declarations to be printed in the order in which they were made rather than in alphabetical order. Setting PolyML.Compiler.printTypesWithStructureName to false causes types to be printed without the structure from which they came.

Large database support
The support for large databases has been improved and it is now possible to create a database which will occupy all of the virtual memory reserved for it. The actual limits vary between operating systems and platforms but are typically around 400Mbytes.

To aid this the -S option when running the disc garbage-collector (-d option), introduced in 4.1.1, has been extended with -Smin and -Smax. The options can be written using either -s or -S and with or without a space. Setting a size is now "sticky" so if no -s/-S option is given the previous limits are retained rather than being reset to the default. The -Smax option sets the limits to the maximum space available. This space now depends only on the size reserved for any parent databases and not, as before, on the history of the database.

The -Smin option compacts the database into a size whose upper limit is set to the size actually in use before compaction. To make best use of it it is probably best to run it twice, once to compact the database and again to set the upper limits to the now reduced size. It is useful when a database has been created which will not be modified further but where child databases may be created. Compacting a database to the minimum size allows any child databases to occupy as much space as possible.

The disc garbage collection has been changed so that it is now possible to use all the address space. Previously it was always necessary to reserve a certain portion of the space to allow the database to be collected.

Bugs fixed

Mac OS X 10.2
Mac OS X 10.2 introduced a undocumented change to the kernel interface when delivering signals. This meant that the original binaries will not run on 10.2. This has now been fixed.

Crash on delivering console interrupt on PowerPC
There was a bug in the Poly/ML process (lightweight thread) code on the PowerPC which caused a crash when a process terminated. This could happen when a user-installed signal handler was called, for example the console interrupt handler in Isabelle.

Crash in equality code
An error in the compilation of the equality function meant that certain expressions involving equality could cause a crash. This has been fixed.

 

Release notes: Version 4.1.2 Release

New features and Changes

Flexible records (Pattern rows with record wildcards)
The Standard requires that a flexible record must be constrained to a fixed set of labels by the program context.  It does not specify what that context should be.   Previous versions of Poly/ML, along with most other compilers, have required the context to be the point at which the declaration containing the flexible record was generalised, often requiring a type constraint.  For example:
let fun f {a, ...} = a in f{a=1,b=2} end;
was rejected.  Poly/ML now allows the record to be constrained anywhere within the same topdec.

 

Bugs fixed

"moveToVec - invalid constant address"
The compiler failed with an exception and this message when trying to take apart a tuple which was known at compile time to be an exception.  For example: let val (x,y) = raise Fail "" in x end; .

Infinite loop with unterminated input
If an input stream contained an error (e.g. a syntax or type error) and ended without a newline Poly would go into an infinite loop.

Linux/i386 - Crashes with large heaps
There were a number of crashes when the heap grew to several hundred megabytes as a result of it overwriting other data.  The virtual address range used has now been changed.   The maximum size of the heap on this architecture has also been increased to 1.1 Gigabytes for the immutable heap and 256 Megabytes for the mutable.

Linux - Compiling
The sources would not compile on some versions of Linux due to the use of <sys/time.h> instead of <time.h>.

Syntax of specifications and signature
There were a number of cases where Poly/ML would not accept the full syntax of Standard ML 97.  Empty specifications were not accepted, signature declarations were not accepted after type declarations within the same topdec and multiple type abbreviations connected by "and" were not accepted.

Windows bitViewer example
The bitViewer example contained a reference to the Base structure which has been removed, preventing it from compiling.

Interrupt exception while running the compiler
Raising an Interrupt exception from the console at certain points within the compiler could result in confusing traceback information being printed.

 

Release notes: Version 4.1.1Release

Update on 5th November 2001(driver source only).  Bug fix: Overflowing Poly stack could cause crash.
A deeply or infinitely recursing function could result in a segmentation fault.  It will now raise an Interrupt exception.

Update on 28th October 2001 (driver source only).  Bug fix: Large heaps in Linux caused random errors.
If the heap grew very large in Linux it could overwrite local variables, causing random failures.

New features and Changes

Windows™ interface
This release includes structures to allow Windows graphical programs to be written in Poly/ML.  See the Windows Programming in Poly/ML and  Windows Interface Reference for more information.

Extensions to the Symbolic Debugger.
The symbolic debugger introduced in version 4.1 has been extended.  There are additional functions to step over a function and to step out.  The debugger attempts to print the source line when it stops at a breakpoint.  For this to work the source must have been compiled using a full path name or the debugger must be run in the same directory that the source was compiled in.  The debugger now displays values from opened structures and in abstype declarations.

Printing top-level exceptions.
When an exception is raised at the top-level the compiler now prints the parameters in the exception packet if the exception is declared at the top-level or in any top-level structure.  Previously it would only print the parameters if the exception was declared unqualified at the top-level.
This is particularly useful for exceptions raised by the Standard Basis Library such as IO.Io and OS.SysErr.  Previously if, for example, TextIO.openIn failed to open a file the only information available was that the Io exception had been raised.  Now the parameters will be printed giving much more useful information.

Large databases.
Previous versions of Poly/ML had limits on the size of the database of around 63Mbytes.  This remains the default limit but larger databases are now possible, up to around 400Mbytes.  To increase the limit it is necessary to run the disc garbage collector and specify the -S option.
e.g. poly -d -S 250 ML_dbase
This will compact the database and set the maximum size to 250Mbytes.  Attempts to set the size to a value which is too large will fail with the message "Not enough address spaces".  The limit on the size depends on the current maximum database size (the larger the current size the smaller the new size may be) and is reduced if the database is a child database.
There are actually two limits on the size of a database: the mutable data size (space for refs and arrays) and the immutable data size (everything else) and a database cannot be expanded if either of these limits is reached.  The space available is divided between these two in the ratio 1:8.  There is currently no way of changing this.

CInterface structure
Added unsigned integer conversions.  Added functions to convert between Word8Vector.vector and C arrays.  toCchar and fromCchar now convert between the ML char type and C char rather using the ML string type.

Bugs fixed

Changes to representation of datatypes.
There was a potential bug in the way datatypes were implemented.  Previously the representation of a datatype was implemented using static information about the number of constructors and their types.  Various optimisations are possible if, for example, it is known that the only non-nullary constructor takes a tuple as an argument.   These optimisations are not always possible if a datatype can be passed as an argument to a functor.  Simon Finn pointed out that datatype replication could result in a datatype being passed into a functor in circumstances that was not possible in ML90.   Rather than remove the optimisation the handling of datatypes has been changed so that constructors are passed as arguments to a functor.  In practice these are optimised away if functors are expanded inline (the default setting).  Because it is now possible to use the optimised representation in all cases the code is likely to be faster than before.

Correctly converts negative hexadecimal numbers
Previously values such as ~0x1 were always converted as zero.

Correctly prints singleton records
Singleton records (e.g. {a=1}) were previously printed as {...}.

Some functions with side-effects were not evaluated if their results were not used
For example, fun f s = (print s; true); fun p s = not (f s); val _ = p "OK\n"; did not work correctly in 4.1.  This has been fixed.

Changes to allow compilation on Solaris 6.
There was a problem compiling the sources in older versions of Solaris.

 

Release notes: Version 4.1 Experimental

Bugs fixed

Exception matching in val bindings.
Previous releases contained a bug in the processing of val bindings when the pattern was an exception constructor.

Closing Standard Output.
Closing standard output caused an infinite loop in previous versions.

Changes since Version 4.0 Release

Source Level Debugger.
This release includes a source level debugger which allows the use to set and clear breakpoints and view local variables.  Code compiled for use with the debugger can be freely mixed with other code.  See here for a full description.  A PolyML.Debug structure has been added and a PolyML.Compiler.debug flag.

Free type variables.
The language definition says that no free type variables may enter the basis but leaves it to the implementer whether to refuse elaboration or instead replace the type variables by monotypes.  Version 4.0 refused to elaborate expressions such as
fun f () = raise Fail "error"; f();
Version 4.1 allows it to elaborate but produces a warning message.  The result is bound to a unique monotype distinct from any other type in the basis.

Substantial changes to the optimiser.
The optimiser has been substantially changed so that many more cases can be compiled in-line.  Small tail-recursive functions, such as List.foldl, are now compiled as while-loops within the calling functions.   Small recursive functions which are not tail-recursive, such as List.map, are compiled as specialised functions so that the function being mapped is inserted into the specialised function.   When mapping a small function over a list this can produce big improvements by avoiding the need for a function call for each element of the list.  Applying these optimisations and a few others within the compiler itself has produced a substantial speed up.

Formatting of pretty-printed output.
The format used when printing top-level expressions, particularly structures and functors, has been improved to give a more consistent appearance.

Tuples as results.
Previous versions of the compiler allocated memory to contain tuples returned from functions or even from an if-expression.  This version now allocates store on the stack to receive the results, reducing the load on the garbage collector.

Improvement to TextIO.
The TextIO structure is defined as imperative operations on top of the functional IO layer.  Implementing it in this way, though, turned out to be inefficient if the functional layer was not used.  TextIO has now been rewritten so that if TextIO.getInstream is never called on a stream it can be handled entirely within the imperative layer.

Specialised equality functions.
Previous releases contained specialised code for equality for a few built-in types such as int and string but defaulted to the general structure equality in more general cases.   The compiler now generates functions for equality in most cases.  Because of the changes to the optimiser these will usually be compiled in-line even when operating on recursive types such as lists.  This is most successful when the compiler has specific type information so the addition of a cast may well speed up a function.   

X-Windows/Motif - new functions.
The following functions have been added to the Motif structure:

val XtGetApplicationResources: Widget -> (string * string * XmRType) list -> Arg list
val XtAddEventHandler: > Widget -> XWindows.EventMask list -> bool -> (Widget * 'a XWindows.XEvent -> unit) -> unit
val XmMenuPosition: Widget -> 'a XWindows.XEvent -> unit

Assignment to references in the database.
Older versions of the compiler always made calls to the run-time system to handle assignment.  In version 4.0 this was changed so that the assignment operation was compile in-line, speeding up imperative functions when the reference being updated was local.  If the reference was in the database assignment involved a trap and the assignment was emulated by the run-time system.  This has now been changed so that there is only a trap the first time a reference is updated.  More specifically, references in the database are packed into pages and if any of the references in a page are updated the whole page is marked "dirty" and no further traps will occur for that page.
The format of a database has changed slightly as a result so version 4.1 databases may only be used with a run-time system built for this version.

Low-level code-generation.
Various changes have been made to the low-level code-generators, particularly in the handling of constants and calls to functions which are known at compile-time.  The code-generators now generate code for more functions such as Word.* which previously required calls to the run-time system.   Functions now contain information about the registers they modify to reduce the need to save registers across calls.

Mac OS/X
Real number rounding control (IEEEReal.getRoundingMode and IEEEReal.setRoundingMode) has now been added to the Mac OS/X version  of Poly/ML 4.1.  This version has been tested with the release version of Mac OS/X.  The foreign function interface (CInterface structure), time profiling (PolyML.profiling 1) and polling (OS.IO.poll) do not work in Mac OS/X.

Update on 25th April 2001.  Slow "commit" and database compaction in Linux and Solaris
There was a problem with writing to the database which appeared in some versions of Unix.   This was particularly noticeable on machines with slow discs or where the database was accessed over a network.  A revised version of the driver sources has now been installed to correct this problem.

Update on 3rd May 2001.  Bug fix: Corrupted parent database file name.
When running the disc garbage collector on a child database in Mac OS X the parent file name became corrupted.

Update on 3rd May 2001.  Fix to allow compilation on Mac OS X with X-Windows/Motif.

Release notes: Version 4.0 Release

Bugs fixed since Version 4.0 beta1

Negative integers printed strangely.
Bug in Version 4.0 beta1: Negative numbers printed as large positive numbers.

Files were created with execute permission.
The default creation mask for files was 777 (read, write and execute permission).   This has been changed to 666 (read and write permission).

i386 code-generator bug.
A bug was found in the i386 code-generator which among other things caused Poly/ML to crash when given an integer in hexadecimal (e.g. 0x1).

Linux:  Typing control-C would sometimes cause a crash.
Poly/ML would sometimes crash if control-C was pressed.   This was highly timing-dependent and occurred only if the SIGINT arrived at the same time as another signal such as a SIGSEGV used to indicate a garbage-collection or arbitrary-precision emulation trap.

 

Changes since Version 4.0 beta1

The default for print depth is now 100.
The default value for PolyML.print_depth is now 100 instead of 1.

Power architecture version now fully supported.
The Power architecture is now supported under MacOS-X beta and LinuxPPC.

Removed various exceptions from the PolyML structure.
The Interrupt, Div, Bind, Match, Size, Overflow, Underflow and Subscript exceptions have been removed from the PolyML structure.  These are either free in the basis or are in the SML90 structure.

X-Windows/Motif now compiles with LessTif and OpenMotif.

Sparc/Solaris: Removed check that the whole of the address space was available.
The Sparc/Solaris version attempts to reserve a very large region of memory to prevent any other library from allocating within the area that Poly/ML might use for its heap.   This caused problems if there was a limit on the amount of virtual memory that a program could reserve and has been removed.

Links as "discgarb" and "changeParent" now work for path names.
For backwards compatibility it is possible to create a link to the poly executable called "discgarb" and invoke the program through that rather than specify the -d option to poly.  This previously worked only if the program was invoked as "discgarb" not as, for example, "/usr/bin/discgarb".  This has now been changed so that only the last component of the name is examined.

 

Release notes: Version 4.0 beta1

Bugs fixed since Beta 4.0

"InternalError: equality - Overloadset found raised while compiling"
This message was produced when compiling certain combinations of overloaded functions and equality.

Failed to compile properly on RedHat 6.2 and other recent versions of Linux
The SRPM version of the 4.0 beta release would compile on RedHat 6.2, provided a few changes were made to the sources but the resulting binary crashed.

StringCvt.padLeft and padRight crashed when applied to single character strings
These functions caused a page fault when applied to strings containing a single character.

Changes since Beta 4.0

Introduced the POLYPATH environment variable to allow databases to be found using a path.
When searching for a database, whether given on the command line or to find the parent of a child database, poly searches using the path given in the POLYPATH environment variable.   On most platforms it defaults to ".:/usr/lib/poly:./usr/local/lib/poly" meaning that when searching for a database called "dbase" it will first look in the current directory and if that fails look for /usr/lib/poly/dbase and finally /usr/local/lib/poly/dbase before giving up.  Setting the POLYPATH to an explicit path allows the user to specify where databases are to be found.

As a result of this change poly now defaults to searching for a database called ML_dbase in the path if no database is given on the command line.   The restriction that a child database can only be created if the parent path name is fully specified has been removed.

Removed discgarb and changeParent.
The discgarb and changeParent programs have been removed and the functionality incorporated into the poly program.  New options have been added to poly.  The '-d' option compacts a database in the manner of discgarb.  An additional option '-c' can be used to run the
common-expression elimination phase.  The '-p' option changes the parent of a database as with changeParent.   The old behaviour can be retained by creating links to the poly binary called discgarb and changeParent and invoking the binary through these names.

Changed TextIO.stdOut to use line buffering.
In Beta 4.0 this was unbuffered.

Added interruptConsoleProcesses to the Process structure.
Process.interruptConsoleProcesses() causes all console process to be sent the SML90.Interrupt exception.   Usually there will only be one console process, the top-level loop which runs the compiler and executes the code.

 

Version 4.0 beta

Features and changes in this release.

Supports ML97

The revised definition of Standard ML (ML97) introduced a   number of changes.  Poly/ML now implements this version of the language.   Some of the old (ML90) features are available by setting PolyML.Compiler.ml90 to true.  The major changes include value polymorphism, which removes the need for imperative type variables and changes to the way structure sharing is handled.  Type abbreviations in signatures and datatype replication are also included.

Supports the Standard Basis Library

The Standard Basis Library is a suite of modules which provides a standard set of functions for many purposes as well as access to many operating system facilities. 

Other changes

Linux: supports larger database size.
Values are printed in alphabetical order.
Various code-generator changes and fixes.
Windows: the console is replaced by a Windows-style console.
Signal structure allows signals to be handled or blocked.

 

polyml-5.6/documentation/Tutorials/000077500000000000000000000000001265146633400175515ustar00rootroot00000000000000polyml-5.6/documentation/Tutorials/Appl-1-4.gif000066400000000000000000000044611265146633400214400ustar00rootroot00000000000000GIF89a]]]qEEEaaaYYYiii4448AA aAaAAA˲ǚmmm,UMMM˲uuu Ӛ$ey((,aQia8 ӊ ǚiA0!(Ds:"%ꩉN$ E|As"ߤ-^LX11Lf Poly/ML Interface to the C Programming Language

Poly/ML Interface to the C Programming Language

Nick Chapman    June 6, 1994

  1. Introduction
  2. Dynamic Libraries
  3. Creating a Dynamic Library
  4. Calling Simple C-functions
  5. A family of calln functions
  6. Predefined Conversions
  7. Volatile Types: vol, sym and dylib.
  8. Calling C-functions with return-parameters
  9. A family of callnretr functions
  10. C structures
  11. A family of structn Conversionals
  12. Lower Level Calling Mechanism: call_sym
  13. Creating New Conversions
  14. Enumerated Types
  15. C Programming Primitives
  16. Example: Quicksort
  17. Volatile Implementation

1 Introduction

It is now possible for Poly/ML to call functions which have been written in the C programming language. These functions are accessed from a dynamic library, and so don't have to be statically linked into the Poly/ML runtime system. The C interface is contained in the structure CInterface, which is built into every ML database. The facilities available allow dynamic libraries to be loaded and for symbols to be extracted from these libraries. symbols which represent C-functions can be executed.

The arguments to a C-function need to be in a format which the C-function can understand. Similarly, the return value from a C-function will be in a standard C format. All such C-values are represented in ML using the abstract type vol. Values of this type are volatile because they do not persist from one ML session to the next. There are facilities to convert between ML-values and vols, together with a collection of 'C-programming' primitives to manipulate vols.

2 Dynamic Libraries

exception Foreign of string
val load_lib : string -> dylib
val load_sym : dylib -> string -> sym
val get_sym : string -> string -> sym

The function load_lib takes an ML string containing the pathname of a dynamic library. This should preferably be a full pathname. If it is a relative pathname it will be interpreted with respect to the directory in which the ML session was started from. The return value is a dylib representing the dynamic library. If the dynamic library cannot be found, the exception Foreign is raised with a string describing the problem.

If the file named by the filename exists but is not in the correct format for a dynamic library, the underlying C-function dlopen prints an error message and then kills the ML session. So far, I have been unable to catch this error.

Once a library has been opened, a symbol may be extracted from the library with the function load_sym. This takes a dylib representing the dynamic library and an ML string naming the symbol. The return value is a sym representing the symbol. If the symbol is not contained in the dynamic library, the exception Foreign is raised with a string describing the problem.

Often the return value of the function load_lib is passed directly to the function load_sym . This combination is captured by the function get_sym, which takes two strings naming the dynamic library and the symbol, and returns the sym representing the symbol, or raises the exception Foreign.

fun get_sym lib sym = load_sym (load_lib lib) sym;

Values of type dylib and sym share the volatile nature of vol ; they do not persist from one ML session to the next. This is explained in more detail in Section 7.

3 Creating a Dynamic Library

Suppose we have written a C-function called difference, which computes the difference of two integers. The function is contained in a file named sample. c.

int difference (int x, int y) {
    return x > y ? x - y : y - x;
}

To create a dynamic library containing this function we carry out the following steps at the shell prompt:

Pinky$ gcc -c sample.c -o sample.o
Pinky$ ld -o sample.so sample.o

These steps create a dynamic library named sample.so. Often many symbols will be retrieved from the same dynamic library, and so it is useful to partially apply the function get_sym to the name of the common library. Most of the examples in this document use symbols retrieved from the library samples.so.

val get = get_sym "sample.so";

4 Calling Simple C-functions

To call the C-function difference we use the function call2 from the structure CInterface. This function allows us to call C-functions that take two arguments:

val call2 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion
                -> 'a
           * 'b ->            'c

The first parameter of call2 is the sym representing the symbol that we wish to call. This is usually obtained from a call to get_sym. The second parameter is a pair of Conversions describing the two arguments to the C-function; the third parameter is a Conversion describing the return value of the C-function. The fourth parameter is a pair containing the actual arguments to be passed to the C-function. Notice how the type of each argument matches the type variable contained in the corresponding Conversion parameter.

The purpose of a Conversion is twofold. Firstly, it specifies the C-type required by the C-function. This needs to be known at the lowest level so that the correct argument passing and return conventions can be used when calling the C-function. Secondly, the Conversion performs the conversion between a C-value (in this case a C integer) and an ML-value. The conversion necessary to call the example C-function difference is INT which has type int Conversion .We can now define an ML function as a wrapper around the underlying C-function.

val diff = call2 (get "difference") (INT,INT) INT;

Because the Conversion INT has type int Conversion, the type of diff is constrained to being int->int->int - which is just what we require. We can now apply the ML function, for example: (diff (13,50)), which evaluates to 37.

5 A family of calln functions

There is a family of calln functions from call0 to call9.

val calln :
   sym -> 'a1 Conversion *  ... * 'an Conversion
       -> 'b Conversion
       -> 'a1 * ... * 'an -> 'b

We need a collection of functions because we cannot give a legal ML type to a function which takes a list of Conversions without forcing them all to have the same type parameter. C-functions with more than nine parameters can still be called, but the lower level calling mechanism must be used, see Section 12.

6 Predefined Conversions

In the structure CInterface, there are various predefined Conversions. The name of each Conversion indicates the C-type required/returned, whereas the ML type of the Conversion constrains the resulting type when the Conversion is used as an argument to a calln function.

val CHAR: char Conversion
val DOUBLE : real Conversion
val FLOAT : real Conversion
val INT : int Conversion
val LONG : int Conversion
val SHORT : int Conversion
val STRING :string Conversion
val VOID : unit Conversion
val BOOL : bool Conversion
val POINTER :vol Conversion

The Conversions CHAR, DOUBLE, FLOAT, INT, LONG and SHORT are primitive in the sense that they convert between small fixed-size C types.

The Conversion STRING converts between an ML string and a C pointer; the pointer points at a null terminated array of characters. This Conversion is built out of the CHAR Conversion and the C programming primitives, see Section 15.

The Conversion VOID is really a one way Conversion intended for the result of C-functions that return void. Attempts to use this Conversion the other way around raise the exception Foreign with an appropriate message.

The Conversion BOOL is build on top of the Conversion INT. It converts between an ML bool and a C integer.

The Conversion POINTER is basically the identity Conversion. No conversion is performed and the underlying vol becomes accessible.

7 Volatile Types: vol, sym and dylib.

There is a problem with the definition of the ML-function diff given above. The call to get_sym (within the partial application get) returns a value of type sym which like values of type vol does not persist from one ML session to the next. If after the definition of diff we were to commit the database and leave the ML session, we would find that on restarting the ML session, the function diff no longer operates as expected, but instead causes the exception Foreign to be raised:

> commit();
> diff (13,50);
val it = 3
> quit();
Pinky$ ml
> diff (13,50);
Exception- Foreign "Invalid volatile" raised

One solution is to redefine the ML function diff as:

fun diff args =
cal12 (get "difference") (INT,INT) INT args;

The new version of diff is very similar to the old version, except that the subexpression get "difference" will be executed every time the function is applied to the tuple of arguments, instead of just once. This causes the library and symbol to be reloaded on every invocation of the function diff ensuring that the vol is valid. Efficiency wise this is not as horrific as it sounds. The underlying dynamic library manipulation functions appear to cache what has already been loaded, and so do little work on a subsequent calls to load the same library or symbol.

8 Calling C-functions with return-parameters

Although C is strictly a call-by-value language, call-by-reference is often simulated with the use of parameters of a pointer type. When a function is called with a parameter that has a pointer type, the called function can then modify the value pointed at by the pointer. For example, the C-function below diff_sum computes both the difference and the sum of two integers. The function has four parameters-two input parameters and two return-parameters.

void diff_sum (int x, int y, int *diff, int *sum) {
  *diff = x > y ? x - y : y - x;
  *sum = x+y;
}

With C, this function would be invoked with something like:

{
  int diff,sum;
  diff_sum(x,y,&diff,&sum);
}

To call the C-function diff_sum from ML we use the function call4ret2. This allows us to call C-functions that have four parameters, the last two being return-parameters.

val call4ret2 : sym
  -> 'a Conversion * 'b Conversion -> 'c Conversion * 'd Conversion
  -> 'a            * 'b             -> 'c             * 'd

Now we can write an ML wrapper function:

fun diff_sum x y =
   call4ret2 (get "diff_sum") (INT,INT) (INT,INT) (x,y);

Evaluating (diff _sum 13 50) results in (37,63).

9 A family of callnretr functions

There is a limited family of callnretr functions defined to call C~functions that have n - r input-parameters followed by r return-parameters. This family contains functions for n ranging from 1 to 5, with r as either 1 or 2. (Exception: there is no call1ret2 because this makes no sense.)

val call1ret1 : sym -> unit -> 'a Conversion -> unit -> 'a
val callnretr :
   sym -> 'a1 Conversion * ... * 'an-r Conversion
       -> 'an-r+1 Conversion * ... * 'an Conversion
       -> 'a1 * ... *'an-r -> 'an-r+1 * ... 'an

For other combinations of n and r; requiring a non-final parameter in the parameter list to be a return-parameter; or requiring the actual return result together with the use of return parameters, the lower level calling mechanism can be used (Section 12).

10 C structures

C functions may be called which take/return C structure values. For example, the following piece of C defines a typedefed structure called Point, and a function which manipulates these Points called addPoint.

typedef struct {int x; int y;} Point;

Point addPoint (Point p1, Point p2) {
  p1.x += p2.x;
  p1.y += p2.y;
  return p1;
}

To create the necessary Conversion for Points we can use the Conversional, STRUCT2. This function takes a pair of Conversions and returns a new Conversion suitable for a C structure containing those types. The type of STRUCT2 is:

val STRUCT2 : 'a Conversion * 'b Conversion -> ('a * 'b) Conversion

We now define an ML wrapper function for addPoint:

val POINT = STRUCT2 (INT,INT);
fun addPoint p1 p2 =
   cal12 (get "addPoint") (POINT,POINT) POINT (p1, p2);

Now, (addPoint (5, 6) (8,9)) evaluates to (13, 15).

11 A family of structn Conversionals

There is a family of structn functions from struct2to struct9.

val structn : 'a1 Conversion * ... * 'an Conversion
               -> ('a1 *... * 'an) Conversion

Manipulation of structures with more than nine components can be achieved with the use of the lower level calling mechanism, see Section 12.

12 Lower Level Calling Mechanism: call_sym

Occasionally it is necessary to access the dynamic calling mechanism at a lower level. The collection of functions calln and callnretr are all defined in terms of the function call_sym, which has the following type:

val call_sym : sym -> (Ctype * vol) list -> Ctype -> vol

The second argument to call_sym is a list of Ctype/vol pairs, which allows C-functions of any number of arguments to be called. This function is more cumbersome to use than the calln and callnretr functions because the two stages of; specification of the C-type, and conversion between ML-values and C-values (vols) have been separated. The specification of the C-type is achieved by using a constructor of the datatype Ctype:

datatype Ctype =
Cchar | Cdouble | Cfloat | Cint | Clong | Cshort | Cvoid
| Cpointer of Ctype
| Cstruct of Ctype list
| Cfunction of Ctype list * Ctype

The following collection of functions is used to convert from and to values of type vol.

val fromCstring : vol ->string
val
fromCchar : vol ->char
val
fromCdouble : vol ->real
val
fromCfloat : vol ->real
val
fromCint : vol ->int
val
fromClong : vol ->int
val
fromCshort : vol ->int
val
toCstring : string -> vol
val
toCchar : char -> vol
val
toCdouble : real ->vol
val
toCfloat : real ->vol
val
toCint : int ->vol
val
toClong : int ->vol
val
toCshort : int ->vol

For example, this is how to define diff directly in terms of call_sym.

fun diff x y =
  fromCint (call_sym (get "difference")
    [(Cint, toCint x),(Cint, toCint y)] Cint)

Manipulation of C structures is achieved with the following two functions:

val make_struct : (Ctype * vol) list -> vol
val break_struct
: Ctype list -> vol -> vol list

13 Creating New Conversions

Recall a Conversion encapsulates three things: an underlying C-type; a function to convert from the C-value (of type vol) to an ML value of a given type; a function which converts from the ML value back into the C-value (of type vol). Sometimes it is useful to be able to create new Conversions, or to retrieve the components from an existing Conversion.

val mkConversion : (vol -> 'a) -> ('a -> vol) -> Ctype -> 'a Conversion
val breakConversion
: 'a Conversion -> (vol -> 'a) * ('a -> vol) * Ctype

The function mkConversion creates a new Conversion from its three components. The function breakConversion takes an existing Conversion and returns a triple containing the components. For example, the standard conversion INT might be defined as:

val INT = mkConversion fromCint toCint Cint

A good reason for creating a new Conversion is to give a different ML type to values of type vol which are to be used in a particular way. For example, we may be interfacing to a collection of C-functions that take/return pointers which are being used to implement a particular abstract type, for example a tree node. By creating a new conversion we can use the ML type system to avoid mixing values of this new type with other normal vols.

abstype node = Node of vol
with val NODE = mkConversion Node (fn (Node n) => n) (Cpointer Cvoid)
end

fun lookupNode s = call1 (get "lookupNode") STRING NODE s
fun printNode n = call1 (get "printNode") NODE VOID n

The types of these two functions are:

val lookupNode : string -> node
val printNode
: node -> unit

14 Enumerated Types

Another reason for creating a new Conversion is for when we want to call a C-function that takes/returns values of an enumerated type. For example, suppose colour is declared as:

typedef enum {
  white,
  red = 5,
  green,
  blue,
  /* leave room for extra colours in the future */
  black = 100
} colour;

This example shows that C enumerations are just sugar for integers, so much so, we can even specify which constructors correspond to which integer values. When an enumeration is declared that specifies integer values for just some constructors, (as in colour above): if the first constructor is unspecified, it is assigned 0; successive unspecified constructors are assigned successive integer values, e.g. green is 6.

We would like to convert C-enumerations like colour into an equivalent ML datatype, together with functions to convert between values of the datatype and ML integers. This can be achieved automatically by using the script proc-enums, contained in the scripts subdirectory of the source tree.

Usage: proc-enums <struct-name> {<filename>}+

The first parameter to proc-enums is the name of the generated ML structure. The remaining parameters specify C-files in which to search for C typedefed enumeration declarations. No formatting conventions are assumed, i.e. arbitrary white space and comments are allowed within the declaration. Other declarations and definitions are ignored. The generated file is named <struct-name>.ML.

For the colour example, we would type 'proc-enums colour colour.h' at the shell prompt. This would generate a file colour.ML containing the following ML definitions.

structure colour = struct

datatype colour
= white
| red
| green
| blue
| black

exception Int2colour

fun int2colour i = case i of
  0 => white
| 5 => red
| 6 => green
| 7 => blue
| 100 => black
| _ => raise Int2colour

fun colour2int i = case i of
  white => 0
| red => 5
| green =
| blue => 7
| black => 100

end (* struct *)

Once these definitions have been generated we can create a new Conversion:

val COLOUR =
  mkConversion (int2colour o fromCint) (toCint o colour2int) Cint;

Now, suppose we have a C-function nameOfColour,

#include "colour.h"
char* nameOfColour (colour c) {
  switch (c) {
    case white: return"white";
    case red:   return"red";
    case green: return"green";
    case blue:  return"blue";
    case black: return"black";
    default:    return"Error: No such colour";
  }
}

we can write a ML wrapper for this function as:

fun nameOfColour c =
   call1 (get "nameOfColour") COLOUR STRING c;

Now we can execute, (nameOfColour blue), which evaluates to the ML string "blue".

15 C Programming Primitives

Occasionally, we need to manipulate C-values in greater detail. The following example shows how an ML wrapper can be written for the C-function diff _sum, without using a callnretr function.

fun diff_sum x y =
    let val diff = alloc 1 Cint
        val sum = alloc 1 Cint
    in
        cal14 (get "diff_sum") (INT,INT,POINTER,POINTER) VOID
            (x, y, address diff, address sum);
        (fromCint diff, fromCint sum)
    end

This example uses two of a collection of six ML functions allowing basic C-programming.

val sizeof  : Ctype -> int
val alloc   : int -> Ctype -> vol
val address : vol -> vol
val deref   : vol -> vol
val assign  : Ctype -> vol -> vol -> unit
val offset  : int -> Ctype -> vol -> vol

These functions are intrinsically unsafe-incorrect usage can cause the ML session to die.

The application (sizeof t) returns the size (in bytes) of the Ctype t.

The application (alloc n t) returns a vol encapsulating some freshly allocated memory of size (n*sizeof t) bytes. Unlike allocation facilities in C which return a pointer to the newly allocated space,the result of alloc encapsulates the space directly.

The underlying implementation of alloc does in fact use malloc to gain some newly allocated space, and does in fact consist of a pointer to this space. However, all the above ML functions work at an extra level of indirection to the corresponding C-operation. This extra indirection is removed before the C-value is passed to a real C-function.

The application (address v) returns a new vol containing the address of v. This function corresponds to the C operator &.

The application (deref v) returns a vol which is the result of dereferencing the address contained in v. This function corresponds to the C operator *. If v is not a valid address, the ML session will die with a segmentation error.

The application (assign t v w) copies (sizeof t) bytes of data from w into v. This function corresponds to the C operator =, or the standard C function memcpy.

The application (offset i t v) returns a new vol that is offset (i*sizeof t) bytes in memory from v. The closest corresponding operator in C is structure dereferencing (.). Pointer arithmetic can be achieved by combining the function offset with the functions address and deref.

The functions address and deref create the same aliasing as the corresponding C operators. For example, the following sequence of C statements causes the final value of i to be 123:

{
  int i = 0;
  int *p = &i;
  *p = 123;
}

Likewise, the following sequence of ML statements:

> val i = toCint 0;
> val p = address i;
> assign Cint (deref p) (toCint 123);
> fromCint i;
val it = 123

16 Example: Quicksort

The following example shows how the C-programming primitives are intended to be used. The example involves interfacing to the standard C-function qsort. On many Unix systems this function can be retrieved from a dynamic library in /usr/lib.

val getC = get_sym "/usr/lib/libc.so.1.7";

The function qsort takes four parameters.

void qsort (void *base, int nel, int width, int (*compar)());

The first parameter, base, is a pointer to an array of elements to be sorted; the second parameter, nel, is the number of elements in the array; the third parameter, width, is the size (in bytes) of each element; the fourth parameter, compar is a comparison function which must return an integer less than, equal to, or greater than zero. See the qsort manual page for more details.

In our example we wish to sort pairs of strings. The first string is the key to be sorted, while the second string is arbitrary data. In C we would represent this pair as a structure, and would write the comparison function compare using strcmp.

typedef struct {
  char *key;
  char *data;
} pair;

int compare (pair x, pair y) {
   return strcmp(x.key, y.key);
}

We want to define an ML wrapper qsort which takes a list of string pairs and returns the sorted list. Other than the C-programming primitives, the only additional function needed is volOfSym. This is needed to supply the fourth argument to qsort, a pointer to a comparison function. The application (volOfSym s) returns the vol encapsulated in the symbol s.

val volOfSym : sym -> vol

We can now defined qsort, together with two auxiliary function fill and read.

val (fromPair,toPair,pairType) = breakConversion (STRUCT2 (STRING,STRING));

fun fill p [] = ()
  | fill p ((key,data)::xs) =
         (assign pairType p (toPair (key,data));
          fill (offset 1 pairType p) xs)

fun read p 0 = []
  | read p n = fromPair p :: read (offset 1 pairType p) (n-1)

fun qsort xs =
   let
      val len = length xs
      val table = alloc len pairType
      val compare = volOfSym (get "compare")
      val sort = ca114 (getc "qsort") (POINTER,INT,INT,POINTER) VOID
   in
      fill table xs;
      sort (address table, len, sizeof pairType, compare);
      read table len
   end

The function fill takes a pointer into some allocated space (which must be big enough), and a string pair list. It fills the array with structures created from the list. The function offset is used to move along the allocated area.

The function read is the inverse of fill. It takes an array of structures and an integer n and reconstructs a list of n string pairs.

The ML function qsort operates by first allocating enough space for the array of structures, then using fill to fill this array from the argument list xs. A call to the C-function qsort is made to sort this array. Notice how the first argument to sort is (address table) which generates the required array pointer for the C-function qsort. Finally, a list is reconstructed from the sorted array using read.

Now we can evaluate the following:

> qsort [("one","fred"), ("two", "dave"), ("three", "bob"), ("four", "mary")];
val it =
  [( "four", "mary"), ("one", "fred"), ("three", "bob"), ("two", "dave")]

17 Volatile Implementation

The C-data contained in a volatile is managed in a separate space from normal ML data which is stored in the heap. There are two reasons for this. Data contained in the ML heap is liable to change its address during garbage collection, and C-functions cannot cope with this. The second reason is safety. We do not want foreign C-functions to obtain a pointer into the ML heap. Because the C-function is running in the same Unix process, it is always possible for it to corrupt the ML heap; however the most usual cause of corruption is caused by off-by-one errors. If the C-data is stored in the ML heap this would cause a neighbouring heap cell to be corrupted.

Every ML value of type vol has two components: (1) An ML heap cell; (2) A slot in the vols array, a runtime system variable declared and managed in the file Driver/foreign.c . The ML heap cell indexes a slot in the vols array. This slot contains three items: (1) A back pointer, pointing at the corresponding ML heap cell. (2) A C-pointer, pointing to the actual C-data; (3) A boolean, indicating whether this volatile owns the space pointed to by the C-pointer.

The combination of vols array index and the back pointer found there enables the validity of a volatile to be checked as it is dereferenced. If the volatile is invalid then the exception Foreign is raised.

The collection of functions that convert ML values into vols (e.g. toCint and toCfloat), together with the functions alloc and address create new volatiles; that is, volatiles that own the space pointed to by the C-pointer in their vols array slot. This space is obtained from a call to malloc. There is always exactly one owner of any piece of malloced space. The deref and offset functions create vols that point to previously allocated space and so are not regarded as the owner.

Volatiles are garbage collected in such a way that malloced space is freed when there are no remaining references to the ML cell which owns that space. However, by itself this scheme is too vicious. For example:

val a = address (toCint 999);

When a garbage collection occurs, although the space owned by a (containing the pointer) will be preserved, the space allocated to hold the C-integer 999 will be reclaimed because there are no references to its owner, the anonymous expression (toCint 999)

If we now evaluate the expression (fromCint (deref a)), it will result in whatever garbage happened to be pointed to by the redundant C-pointer contained in the volatile a. What is needed is a way to ensure that the volatile a holds an ML reference to the anonymous volatile (toCint 999) for the duration of its lifetime. In a similar manner, any volatile that does not own its own space, i.e. the result of the expression (deref (address (toCint 999))), needs to hold a reference to the owner of the space it points at. This scheme of maintaining references is implemented in Volatile.ML in the directory Prelude/Foreign, and is completely transparent to the user.

In some unusual situations we might want to allocate some space which persists after all ML references to it have disappeared. For example, we might have to allocate space for a buffer, and then hand a pointer to this buffer over to a foreign C-function. This can be achieved in two ways. We could carefully maintain an ML reference to the vol encapsulating the buffer. Alternatively, we could use the dynamic library manipulation functions to use the real C-function malloc.

polyml-5.6/documentation/Tutorials/Debugging.html000066400000000000000000000336541265146633400223450ustar00rootroot00000000000000 Source Level Debugging in Poly/ML

Source Level Debugging in Poly/ML

Poly/ML includes a source-level debugger.   You can use it to set breakpoints in the program and print the values of local variables.  To turn on debugging for a particular piece of code set the compiler variable PolyML.Compiler.debug to true.  You can freely mix functions compiled with debugging on with functions compiled with debugging off, you simply can't set a breakpoint in a non-debuggable function or print its internal state.   The debugging control functions are all in the PolyML.Debug structure. It is often convenient to open this structure before debugging a program.

An Example Session.

To see how debugging works we'll follow through an example session.  We have a small function that is supposed to add together a list of pairs of integers but it has an error in it which causes it not to terminate.  We turn on debugging and compile in the program.

> PolyML.Compiler.debug := true;
val it = () : unit
> fun addList a l =
    let
        fun f (b,c) = a+b+c
    in
        case l of
              [] => a
            | (x::y) =>
                let
                    val v = f x
                    val l' = y
                in
                    addList v l
                end
    end;


val addList = fn : int -> (int * int) list -> int
> open PolyML.Debug;

We set a breakpoint in the function f using the breakIn function and apply the function to some arguments.

> breakIn "f";
val it = () : unit
> addList 0 [(1,2), (3, 4)];

The function prints the line number and stops at the breakpoint.

line:3 function:addList()f
debug>

The name addList()f is the full name of the function and we could have used this in place of f when setting the breakpoint.  The "debug>" prompt is almost identical to the normal Poly/ML ">" prompt.   The only difference is that variables which are in scope at the breakpoint are available as though they were declared globally.  So we can print the values of a, b, c and l.

debug> a;
val it = 0 : int
debug> b;
val it = 1 : int
debug> c;
val it = 2 : int
debug> l;
val it = [(1, 2), (3, 4)] : (int * int) list
debug>

In addition anything in the original top level is also available, provided it is not masked by a local declaration, so we can continue the program by calling the continue function which we opened from PolyML.Debug.

debug> continue();
val it = () : unit
line:3 function:addList()f
debug>

This continues and we find ourselves back in f at the breakpoint again.   We expect that and check the value of a.

debug> a;
val it = 3 : int
debug>

However when we check b something seems to be wrong and printing l confirms it.

debug> b;
val it = 1 : int
debug> l;
val it = [(1, 2), (3, 4)] : (int * int) list
debug>

We don't seem to be making any progress.  We go up the stack to the recursive call of addList in order to check that the value of l' is correct.  We have to go up twice because l' is not local to f nor is it available at the point where f was called.  It is only available at the point where addList was called recursively.

debug> up();
line:9 function:addList
val it = () : unit
debug> up();
line:12 function:addList
val it = () : unit
debug> l';
val it = [(3, 4)] : (int * int) list
debug>

This looks fine so the problem was not that l' had the wrong value.  We print the values of everything using the dump function to see if that helps.

debug> dump();
Function addList()f: c = 2 b = 1 l = [(1, 2), (3, 4)] a = 3
Function addList: x = (1, 2) y = [(3, 4)] f = fn l = [(1, 2), (3, 4)] a = 3
Function addList: l' = [(3, 4)] v = 3 x = (1, 2) y = [(3, 4)] f = fn
l = [(1, 2), (3, 4)] a = 0

val it = () : unit

At this stage it is clear that we are passing the original value of l rather than what we intended, l'.  We abort the function by typing control-C and f.

debug> ^C
=>f
Compilation interrupted
Pass exception to function being debugged (y/n)?y
Exception- Interrupt raised
>

This returns us to the top level.  We now fix the error and clear the breakpoint.

> fun addList a l =
    let
        fun f (b,c) = a+b+c
    in
        case l of
              [] => a
            | (x::y) =>
                let
                    val v = f x
                    val l' = y
                in
                    addList v l'
                end
    end;

val addList = fn : int -> (int * int) list -> int
> clearIn "f";
val it = () : unit

As a final check we turn on tracing to check that the values are as we expect and run the program with the same input as before.

> trace true;
val it = () : unit
> addList 0 [(1,2), (3,4)];
addList entered l = [(1, 2), (3, 4)] a = 0
  addList()f entered c = 2 b = 1 l = [(1, 2), (3, 4)] a = 0
  addList()f returned 3
  addList entered l = [(3, 4)] a = 3
   addList()f entered c = 4 b = 3 l = [(3, 4)] a = 3
   addList()f returned 10
   addList entered l = [] a = 10
   addList returned 10
  addList returned 10
addList returned 10
val it = 10 : int
>

This seems to have worked fine so we can now turn off PolyML.Compiler.debug and compile the function without debugging.

 

Reference

Tracing program execution

    val trace = fn : bool -> unit
The trace function turns on and off function tracing.  Function tracing prints the arguments and results of every debuggable function.

Breakpoints

    val breakAt = fn : string * int -> unit
    val breakIn = fn : string -> unit
    val breakEx = fn : exn -> unit
    val clearAt = fn : string * int -> unit
    val clearIn = fn : string -> unit
    val clearEx = fn : exn -> unit

Breakpoints can be set with the breakAt, breakIn or breakEx functions and cleared with clearAt, clearIn or clearExbreakAt takes a file name and line number and breakIn a function name.  The file name and line have to given exactly otherwise the breakpoint will not work.  breakIn is more flexible about the function name.  It can be the function name used in the declaration (e.g. f) or the full "path name".  The latter is useful when the program contains several functions with the same name since setting a breakpoint in f stops in any function called fbreakIn and breakAt simply record that you want a breakpoint.  There is no check when they are called that the appropriate location actually exists and you can set a breakpoint for a function and then compile it later. breakEx sets a breakpoint for a particular exception and causes the program to stop at the end of the function that raises the exception unless it is also handled there. The argument is the exception to trap. It is possible to trap exceptions that take a parameter. Just provide it with a dummy parameter to create a value of type exn that can be passed to breakEx. The actual parameter value will be ignored and the debugger will be entered whenever the exception is raised with any parameter value.

When a breakpoint is reached the program stops with a debug> prompt.   This is a normal Poly/ML top-level and you can type any ML expression.  The only difference is that local variables in the function being debugged are available as though they had been declared at the top-level.  You can print them or use them in any way that you could with a normal variable.  This includes local functions which can be applied to local values, constants or globals. You cannot change the value of a variable unless it is a reference.  At a breakpoint you can continue or single-step the program or you can raise an exception.  This is usually the most convenient way of aborting a program and getting back to the normal top-level unless the program has a handler for the exception you raise.

Single Stepping and Continuing

val continue = fn : unit -> unit
val step = fn : unit -> unit
val stepOver = fn : unit -> unit
val stepOut = fn : unit -> unit

continue runs the program to the next breakpoint.  stepstepOver and stepOut are different ways of single-stepping through a function.    step runs the program up to the next breakable point which is often the next source line.  If evaluation involves calling a function then it may stop at the beginning of the function.  By contrast stepOver stops at the next line within the current function only.  stepOut goes further and stops only within the function which called the current function.  If a called function includes a breakpoint they always stop there.

Examining and Traversing the Stack

val up = fn : unit -> unit
val down = fn : unit -> unit
val dump = fn : unit -> unit
val variables = fn : unit -> unit

up and down move the focus between called and calling functions allowing you to view local variables at different levels.  This is particularly useful for recursive functions.  The variables function prints all the variables in scope at the current point.  dump gives a complete stack trace.

Notes

The current implementation includes most values but not types or structures.     A recursive function is not available within the function itself.

The compiler adds debugging information which considerably increases the run time of the program.  It is probably best to turn debugging on only when it is needed.

The example shows debugging when all the variables have monomorphic types.  The debugger does not have access to any run-time type information so it cannot always know how to print a value inside a polymorphic type.  For example

> fun map f [] = [] | map f (a::b) = f a :: map f b;
val map = fn : ('a -> 'b) -> 'a list -> 'b list
> breakIn "map";
val it = () : unit
> map (fn i => i+1) [1,2,3];
line:1 function:map
debug> a;
val it = ? : 'a

If you know the type is int you can add a type constraint.

debug> a:int;
val it = 1 : int
debug>

It is though equally possible to use the wrong constraint and crash Poly/ML.   Future versions of Poly/ML may treat polymorphic variables as opaque which would prevent this but also prevent "safe" coercions.

 

polyml-5.6/documentation/Tutorials/Motif.html000066400000000000000000005026551265146633400215320ustar00rootroot00000000000000 Poly/ML for Motif

Poly/ML for Motif

Quick Reference Manual

Mike Crawley

Chris Read

 

Copyright (c) 2000 Cambridge University Technical Services Limited
Copyright (c) 1992 Abstract Hardware Limited.
Copyright (c) 1992 Open Software Foundation, Inc.
Copyright (c) 1989 Digital Equipment Corporation.
Copyright (c) 1988 Massachusetts Institute of Technology.
All Rights Reserved.

Permission to use, copy, modify, and distribute these signatures and their documentation for any purpose and without fee is hereby granted, provided that the above copyright notices appear in all copies and that both the copyright notices and this permission notice appear in supporting documentation, and that the names of Digital, MIT, OSF, AHL and CUTS not be used in advertising or publicity pertaining to distribution of the signatures and their documentation without specific, written prior permission. Digital, MIT, OSF, AHL and CUTS disclaim all warranties with regard to these signatures and their documentation, including all implied warranties of merchantability and fitness, in no event shall Digital, MIT, OSF, AHL or CUTS be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of these signatures and their documentation.

Motif is a Trademark of OSF.
X Window System is a Trademark of MIT.

 

Contents

1 Getting started with Motif
1.1 What is Motif
1.2 What are Widgets
1.3 Creating an application
1.4 Managing and Realizing Widgets
1.5 What are Arg lists and Resources
1.6 Changing and examining Widget state
1.7 What are Callbacks

2 Widget Classes
2.1 ArrowButton
2.2 BulletinBoard
2.3 CascadeButton
2.4 Command
2.5 ErrorDialog
2.6 FileSelectionDialog
2.7 InformationDialog
2.8 List
2.9 MainWindow
2.10 MessageDialog
2.11 OptionMenu
2.12 PanedWindow
2.13 PromptDialog
2.14 QuestionDialog
2.15 Scale

2.16 ScrollBar
2.17 ScrolledList
2.18 ScrolledText
2.19 ScrolledWindow
2.20 SelectionDialog
2.21 Text
2.22 ToggleButton
2.23 WarningDialog
2.24 WorkingDialog

3 Resource Tables
3.1 ApplicationShell
3.2 Composite
3.3 Core
3.4 Object
3.5 RectObj
3.6 Shell
3.7 TopLevelShell
3.8 TransientShell
3.9 VendorShell
3.10 WMShell
3.11 XmArrowButton
3.12 XmBulletinBoard
3.13 XmCascadeButton
3.14 XmCommand

3.15 XmDrawingArea
3.16 XmDrawnButton
3.17 XmFlleSelectionBox
3.18 XmForm
3.19 XmFrame
3.20 XmGadget
3.21 XmLabel
3.22 XmList
3.23 XmMainWindow
3.24 XmManager
3.25 XmMenuShell
3.26 XmMessageBox
3.27 XmPanedWindow
3.28 XmPrimitive
3.29 XmPushButton
3.30 XmRowColumn
3.31 XmScale
3.32 XmScrollBar
3.33 XmScrolledWindow
3.34 XmSelectionBox
3.35 XmSeparator
3.36 XmText
3.37 XmTextField
3.38 XmToggleButton

 

 

Chapter 1

Getting started with Motif

1.1 What is Motif

Motif is a user environment built on top of the X Window System and is designed to make interaction with your computer easier and more productive. Applications written for Motif are intended to follow a particular style of appearance and behaviour, so that you do not have to learn new techniques for working with each separate application program.

This document is intended to give enough information so that you can start programming Motif applications in Poly/ML without having to read all the standard OSF (Open Software Foundation) material. However, you will need more detailed information at later stages in your work and you should have the following three books at hand.

OSF/Motif Style Guide   This will guide the programmer to design and implement applications so that they are consistent with the OSF/Motif user interface.
OSF/Motif Programmer's Reference   This describes in detail each Motif function and its associated resources.
PolyML for X Reference   This describes how to use each individual function provided in the Poly/ML implementation of Xlib - the low level interface to the X Window System.

In addition to the reference material in these books, we recommend that you read a Motif programming manual from the following list.

Motif Programming Manual   Volume 6 of the well known O'Reilly set of manuals for X. Written by Dan Heller.
Programming OSF/Motif   Prentice-Hall publish this book by Douglas Young.
Visual Design with OSF/Motif   Addison-Wesley publish this book by Shiz Kobara.

1.2 What are Widgets

The Motif widget set is constructed on top of the Xt intrinsics, which are in turn constructed on top of the X Window System. A widget is an object providing a user interface abstraction, for example, a scroll bar. The Motif widget set aims to provide a set of useful abstractions that a programmer can join together to construct the application, often without having to invent any new additional behaviour or abstractions. The main advantages of the widget set are that all applications built with the same widget set provide the same set of abstractions, and the time to implement the application is drastically reduced, leaving the programmer more time to improve the program that is behind the user interface.

Each widget is a combination of an X Window, a well defined behaviour, and some state information. Each widget is a member of exactly one widget class which provides the functions and data for all members of that class. Widget classes may be inherited by subclassing.

A great deal of the visual appearance and some of the behaviour of each individual widget or an entire widget class can be customised by the user. This is typically done by using files of settings for the fields within the widget classes that affect colours, fonts, sizes, and so on. These fields are collectively known as resources, and this document contains tables of the permitted resources for each widget class.

1.3 Creating an application

An application must create a set of widgets to present to the user. First of all the application must create the application shell widget. Most applications only have one shell widget - this is the window which the window manager places and resizes on the screen. All the other widgets created by the application are typically children of this shell widget.

The structure XWindows contains all the definitions for the Xlib level of the interface. The structure Motif contains all the definitions for the Motif interface.

open XWindows ;
open Motif ;
...

val XtAppInitialise: string -> string -> string ->
                         string list -> Arg list -> Widget
...

The first parameter to XtAppInitialise is the name of the Display to open in the manner of the Xlib function X0penDisplay - this function is documented along with all the other Xlib functions in the Poly/ML for X Reference Manual. The second parameter is the name of this application, and the third parameter is the name of this class of application. Both these names are significant in loading the resource database and finding the resource values for all the widgets used inside this application. Finding resource values is discussed in more detail in a later section. The string list parameter is a list of fallback resource values and the Arg list parameter is a list of preset resource values. The preset resource values are always used in preference to resource values found in the database or in the fallback list. The fallback list provides values to use when values are not found in either the preset list or in the resource database. The resource values that each class of widget can accept are described in the sections about each individual widget class later in this document. The widget returned is an ApplicationShell widget on that display.

The following is the start of a small example program.

val shell =
    XtAppInitialise "" "xed" "Editor" [] [XmNwidth 400, XmNheight 400] ;

The display is opened and the first shell widget is created with preset width and height values.

Now that a shell widget has been created the other widgets in the application can be created. The functions to create different types of Motif widgets have differing names but they all have the same type.

val XmCreate<...>: Widget -> string -> Arg list -> Widget

The parameters specify the parent widget, the name of this widget, and any preset resource values. If no resource values are preset then they default to values in the user's resource files, or values in the fallback list, or to compiled-in defaults.

The next part of our example is as follows.

val main = XmCreateMainWindow shell "main" [] ;

val bar = XmCreateMenuBar main "bar" [] ;

val fileMenu = XmCreateCascadeButton bar "file" [XmNlabelString "File"] ;
val editMenu = XmCreateCascadeButton bar "edit" [XmNlabelString "Edit"] ;
val viewMenu = XmCreateCascadeButton bar "view" [XmNlabelString "View"] ;
val helpMenu = XmCreateCascadeButton bar "help" [XmNlabelString "Help"] ;

val command = XmCreateText main "command" [XmNeditMode XmSINGLE_LINE_EDIT] ;

val hscroll = XmCreateScrollBar main "hscroll" [XmNorientation XmHORIZONTAL] ;
val vscroll = XmCreateScrollBar main "vscroll" [XmNorientation XmVERTICAL] ;

val work = XmCreateDrawingArea main "work" [] ;

The code above creates a hierarchy of widgets. Each class of widget that can have child widgets is a subclass of Composite and provides a behaviour that manages those children. For example, in the code above, a MenuBar widget has four children which are all CascadeButtons. The MenuBar lays out the buttons horizontally and provides a behaviour for the buttons according to the movement of the mouse and the pressing of the mouse buttons. The MainWindow widget has the MenuBar, scroll bars and a drawing area as children, and provides a standard layout for these widgets.

1.4 Managing and Realizing Widgets

When a widget is managed it is added to the geometry-managed displayable subset of its parent's children. If a widget is not managed then it cannot be displayed and does not have its size and position changed by its parent. Managing and unmanaging can therefore be used to make different parts of an application appear and disappear, without the expense of creating and destroying widgets.

Realizing a widget is the process of creating and mapping an X window for the widget, and then recursively realizing the managed subset of the widget's children. Changing the managed subset will only have visible effects if the parent is already realized, or when the parent widget becomes realized later.

val XtManageChild: Widget -> unit
val XtUnmanageChild: Widget -> unit

val XtManageChildren: Widget list -> unit
val XtUnmanageChildren: Widget list -> unit

val XtRealizeWidget: Widget -> unit
val XtUnrealizeWidget: Widget -> unit

XtManageChild and XtUnmanageChild will manage and unmanage one widget at a time. XtManageChildren and XtUnmanageChildren can be given lists of widgets with a common parent and can be quicker than working on one widget at a time.

XtRealizeWidget is given the root of a widget tree and recursively creates and maps all the X windows required by the managed children in the tree.

XtUnrealizeWidget is given the root of a widget tree and recursively destroys all the X windows created by the managed children in the tree.

Our example continues with managing and realizing the widgets we have just created.

XtManageChildren [fileMenu, editMenu, viewMenu, helpMenu] ;
XtManageChildren [bar, command, hscroll, vscroll, work] ;

XmMainWindowSetAreas main bar command hscroll vscroll work ;

XtManageChild main ;
XtRealizeWidget shell ;

At this point the application becomes visible on the display and will look very similar to the application below.

Appl-1-4.gif (2353 bytes)

1.5 What are Arg lists and Resources

A resource is a named field inside a widget that can be set with a value by the user in one of several ways. These resources are used to change the behaviour or the appearance of the widget. The names of all these resources are printed in tables in this manual for every widget class that is available in Motif. For example

XmCascadeButton Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNcascadePixmap XmCPixmap Drawable
XmNcascadingCallback XmCCallback (callback)
XmNmappingDelay XmCMappingDelay int
XmNsubMenuId XmCMenuWidget Widget

The purpose of each resource is fully documented in the OSF/Motif Programmer's Reference.

1.5.1 Initialising with Arg lists

There are several ways to set the initial value of a resource. When a widget is created the user passes in an Arg list which contains preset resource values. These values are copied into the widget in preference to all other values. The Arg datatype is designed to provide an easy way of passing in values of many different types as a single Arg list. The constructors have names such as

val XmNshadowThickness: int -> Arg
val XmNsliderSize: int -> Arg

and can be used as destructors as well. Arg is actually implemented as an infinite datatype - it is the type exn - which means that signatures for functors that use only a few of the Arg destructors need not know the names of all the other destructors - which would be the case with a standard datatype. Instead they need only include the lines they need, as in the following example.

signature MOTIF_SIG = sig
   type Widget

   type Arg sharing type Arg = exn

   val XmCreateCascadeButton: Widget -> string -> Arg list -> Widget

   exception XmNshadowThickness of int
   exception XmNsliderSize of int
end ;

When compiling code that uses the signature above the compiler knows that the Arg list needed by XmCreateCascadeButton is the same type as exn list, and this will allow you to construct and destruct these lists using the exception constructors. If you pass in an exn that is not recognised by the Motif interface then it is rejected and an exception is raised.

1.5.2 Loading the resource database

If a resource value is not specified in the Arg list at creation time then the widget searches the resource database for that field.

A complicated process of merging together separate resource files into a single resource database is performed when the function XtAppInitialise is called. This process is fully documented in user manuals for X Windows, especially in Chapter 11 of Vol 1 of the O'Reilly series of X Manuals. Here we only give a simple example of how the resource files are located - which is enough for most users.

First the process attempts to load a class-specific resource file using the application class name and a search path which is stored in an environment variable. The third parameter to XtAppInitialise is the name of this class of application, and the search path is typically stored in the XFILESEARCHPATH environment variable as follows.

setenv XFILESEARCHPATH $HOME/%T/%N%S

The loading process replaces the %T component of the path with app-defaults and the %N component with the class name. The suffix component %S is not normally used here. In simpler terms, if the user has a directory called app-defaults in his home directory, and in that directory there is a file with the same name as the class name of the application, for example Editor, then that file is loaded into the resource database. Note that class names start with a capital letter by convention.

Then the process attempts to load another class-specific resource file using the application class name and a search path which is stored in the XAPPLRESDIR environment variable, which typically has a value like

/usr/motif/lib/app-defaults

If, in this directory, there is a file with the same name as the class name of the application then that file is merged into the resource database we have constructed so far.

The process then looks for a property which holds the default resources on the root window of the user's display. These defaults are often put in place by the xrdb program. These are merged into the database if they are found, otherwise the process looks for a file called $HOME/.Xdefaults and merges that into the database instead. Often the root property set by xrdb is a copy of the .Xdefaults file at the time the X server was started. If the user changes the .Xdefaults file then he should use

xrdb .Xdefaults

to copy the new version into the server.

Note the order of the merging process. The preset Arg list parameter overrides the values in the .Xdefaults file, which override the values in the XAPPLRESDIR directory, which override the values in the XFILESEARCHPATH directory, which override the values in the fallback resource list parameter.

Typically the user creates a file for each application class in his app-defaults directory. This keeps the resource settings for each application separate from one another, and keeps the .Xdefaults file small.

1.5.3 Finding resources in the database

The second and third parameters to XtAppInitialise are the name of this application instance, and name of this class of application. These names are used to construct the full names of the resource fields in the widgets.

For example, if the application name is xed and there is an XmMainWindow widget with the name main, then the resource fields XmNforeground and XmNshowSeparator have the full names

xed.main.foreground
xed.main.showSeparator

The levels in the widget hierarchy are represented by the names of the widgets from oldest parent down to youngest child with dots as separators. Therefore it is not a good idea to place dots inside the ML strings to be used for widget names.

The resource constructors/destructors have the prefix XmN in order to make them distinct from other ML identifiers. This prefix is not needed in the resource database and explains why the resource field XmNforeground of the widget main is printed as main.foreground in the example above.

If any entries in the database match these names then those values will be copied into the widget. Here are some example lines from a resource database

xed*foreground:   black
xed.main.showSeparator:   True
Editor.main.background:   wheat
*XmMainWindow.commandWindowLocation:   COMMAND_ABOVE_WORKSPACE
xed*ShowArrows:   False

The full name xed.main.foreground matches the database line xed*foreground because the * character is a wildcard character that matches any number of levels in the widget hierarchy. The value from the database is automatically converted to the correct type for the resource field. In this case, the value black is converted to a Pixel by the built-in converter that allocates named colours and returns their pixel values. If a conversion fails then a message is output to the user and the resource field defaults to a compiled-in default.

The full name xed.main.showSeparator matches the database line xed.main.showSeparator exactly and the string True is converted to the corresponding ML boolean value true.

If resources cannot be matched by name, then the search tries to match by class instead. There are three classes to be aware of: firstly the application class, secondly the widget class, and thirdly the resource class. Resource classes are listed in the resource tables for each widget class. Each class name is prefixed by XmC to make them distinct from other ML identifiers. This prefix is not needed in the resource database.

In our example the application class is Editor, which means that the database line Editor.main.background will set the XmNbackground field of the main widget to wheat. If we had other applications with different names, but they were members of the same Editor application class, then they too would have their main.background resources set to wheat. In this way it is possible to change the user preferences for a whole class of applications with one line in the resource database.

In our example the widget class for main is XmMainWindow, which means that the database line *XmMainWindow.commandWindowLocation will set the XmNcommandWindowLocation field of the main widget to XmCOMMAND_ABOVE_WORKSPACE. In fact, because of the * wildcard it will set this field in every XmMainWindow in every application we run. In this way it is possible to change the user preferences for a whole class of widgets with one line in the resource database.

Note that the resource database string COMMAND_ABOVE_WORKSPACE has a corresponding ML value called XmCOMMAND_ABOVE_WORKSPACE which is one of the constant constructors of the XmCommandWindowLocation datatype.

datatype XmCommandWindowLocation   = XmCOMMAND_ABOVE_WORKSPACE
| XmCOMMAND_BELOW_WORKSPACE

To specify one value from a range of predefined constants, remove the Xm from the ML constant and use the remaining letters and underscores in the resource database.

The last line of our example is xed*ShowArrows. This will set all resource fields in the xed application that have a class of XmCShowArrows. The resource field XmNshowArrows in the scroll bars that we manage inside the main window have this resource class. In this way it is possible to change the user preferences for a whole class of resources with one line in the resource database.

If the resource value could not be found in the resource database then it looks through the fallback resources specified with the XtAppInitialise function. If the resource value has still not been found then it is set to a compiled-in default.

1.6 Changing and examining Widget state

The current value of widget resources make up the widget's state. To get the current value of a resource, or a list of resources, use the following functions.

val XtGetValue: Widget -> string -> Arg
val XtGetValues: Widget -> string list -> Arg list

The string to pass in is the resource name corresponding to the Arg required. For example, the Arg constructor XmNforeground has the corresponding string "foreground". The code for this example would look like

val (XmNforeground pixel) = XtGetValue widget "foreground" ;

Because the Arg type is an infinite datatype - it is the type exn - you must use the exception names as destructors to get the values out. In the above example the identifier pixel will be bound to the int returned inside the XmNforeground exception packet. This allows the system to be flexible and allow any type to be packaged up and stored as a widget resource.

To set a widget's resource value use one of the following functions.

val XtSetValue: Widget -> Arg -> unit
val XtSetValues: Widget -> Arg list -> unit

Construct the Arg values by applying the Arg exception constructors to the basic ML values. The widget will decide if it wants to accept the new value, or reject it, and may decide to move, resize or redraw itself - the user does not have to do this. For example, setting the current value and slider size on a XmScale widget is done by

XtSetValues scale [XmNvalue 42,XmNsliderSize 100] ;

1.7 What are Callbacks

Callbacks are used to apply ML functions when the user performs some user interface abstraction, such as clicking on a scrollbar, or selecting from a menu. This is a much higher level of abstraction than programming at the X Event level using Xlib. Each widget typically provides several callbacks that the programmer can attach ML functions to. These functions get called when specific user actions are performed - the resource tables later in this manual indicate which callbacks are valid for each widget, and the OSF/Motif Programmer's Reference can tell you more details about the actions that trigger the callbacks. Each callback within a widget has one of the following names from the XtCallback datatype.

datatype XtCallback = XmNactivateCallback | XmNapplyCallback

| XmNarmCallback | XmNbrowseSelectionCallback

| XmNcancelCallback | XmNcascadingCallback

| XmNcommandChangedCallback | XmNcommandEnteredCallback

| XmNdecrementCallback | XmNdefaultActionCallback

| XmNdestroyCallback | XmNdisarmCallback

| XmNdragCallback | XmNentryCallback

| XmNexposeCallback | XmNextendedSelectionCallback

| XmNfocusCallback | XmNgainPrimaryCallback

| XmNhelpCallback | XmNincrementCallback

| XmNinputCallback | XmNlosePrimaryCallback

| XmNlosingFocusCallback | XmNmapCallback

| XmNmessageCallback | XmNmodifyVerifyCallback

| XmNmotionVerifyCallback | XmNmultipleSelectionCallback

| XmNnoMatchCallback | XmNokCallback

| XmNpageDecrementCallback | XmNpageIncrementCallback

| XmNpopdownCallback | XmNpopupCallback

| XmNresizeCallback | XmNsimpleCallback

| XmNsingleSelectionCallback | XmNtoBottomCallback

| XmNtoTopCallback | XmNunmapCallback

| XmNvalueChangedCallback

The function XtSetCallbacks is used to attach a list of (XtCallback,function) pairs to a Widget. It has the following interesting type

val XtSetCallbacks: Widget ->

(XtCallback * (Widget * 'a XEvent * 'b -> 'b)) list ->

'b ->

int -> 'a -> unit

The first parameter is the widget to set the callbacks on. The second parameter is a list of (XtCallback,function) pairs which will replace the current set of callbacks for this widget. This works in the following way - if the user performs an action which causes the widget to trigger its XmNvalueChangedCallback, and if there is a corresponding pair (XmNvalueChangedCallback,f) in the list then the function f will be applied. Each function in the list has the same type

Widget * 'a XEvent * 'b -> 'b

When the widget calls the function, it passes itself as the first element of the tuple followed by the 'a XEvent that triggered the callback, and lastly the 'b user defined state for the widget. The function must return a new 'b value to use as the user defined widget state.

The next parameter to XtSetCallbacks is the 'b to use as the initial state for this widget. Only one callback is ever applied at any one time - the 'b state is passed from one callback to another in a series of state transformations. If a callback function wishes to look at or change part of the widget resource state it can call XtGetValues and XtSetValues.

XtSetCallbacks then returns a function of type

int -> 'a -> unit

which can be used for sending 'a messages to the widget. If the pair (XmNmessageCallback, f) is included in the callback list then f will receive 'a XEvent messages which it can destruct with the Message XEvent destructor. This is a way of sending strongly typed message information between collections of widgets. The int parameter is the delay in milliseconds before sending the message - this is often useful for sending wakeup messages, or for performing auto-repeats.

 

 

Chapter 2

Widget Classes

This chapter describes the major widget classes available in Motif and gives a picture showing their appearance. A diagram next to each picture shows the widget class hierarchy for this class. Tables are included showing the resource names that are applicable to each class. The ML types of related Motif functions are also shown, along with a short description of how the widget is generally used.

Resource names such as XmNforeground begin with an XmN prefix when used as Arg destructors or constructors. When compiling resource files the prefix is not needed.

Resource class names such as XmCPosition begin with an XmC prefix when used as the names of ML strings. When compiling resource files the prefix is not needed.

Constant constructors in datatypes such as XmARROW_DOWN have an Xm prefix in ML, but when used as values in a resource file the prefix is not needed.

2.1 ArrowButton

Core
XmPrimitive
XmArrowButton

Description:

ArrowButton widgets are button widgets generally used to change the geometry or view of part of an application. The widget consists of an arrow indicating the direction of the desired change. Shadows are placed around the arrow to give the appearance that the ArrowButton has been pressed in when the button is selected. The XmNarrowDirection resource is used to choose which way the arrow will point.

Resources:

XmArrowButton Resources
Name   Class   Type
XmNactivateCallback   XmCCallback   (callback)
XmNarmCallback   XmCCallback   (callback)
XmNarrowDirection   XmCArrowDirection   XmArrowDirection
XmNdisarmCallback   XmCDisarmCal1back   (callback)
XmNmultiClick   XmCMultiClick   XmMultiClickType

Functions:

datatype XmArrowDirection = XmARROW_UP | XmARROW_DOWN | XmARROW_LEFT | XmARROW_RIGHT

datatype XmMultiClickType = XmMULTICLICK_DISCARD | XmMULTICLICK_KEEP

val XmCreateArrowButton: Widget -> string -> Arg list -> Widget
val XmCreateArrowButtonGadget: Widget -> string -> Arg list -> Widget

val XmIsArrowButton: Widget -> bool
val XinIsArrowButtonGadget: Widget -> bool

2.2 BulletinBoard

Core
Composite
Constraint
XmManager
XmBulletinBoard

Description:

BulletinBoard is a general container widget used as the basis for most dialog widgets. It provides simple geometry management for its children, without forcing any positioning constraints on them. It can be set to reject geometry requests that result in overlapping children by changing the XmNallowOverlap resource to false.

Resources:

XmBulletinBoard Resources
Name Class Type
XmNallowOverlap XmCAllowOverlap bool
XmNautoUnmanage XmCAutoUnmanage bool
XmNbuttonFontList XmCButtonFontList XFontStruct list
XmNcancelButton XmCWidget Widget
XmNdefaultButton XmCWidget Widget
XmNdefaultPosition XmCDefaultPosition bool
XmNdialogStyle XmCDialogStyle XmDialogStyle
XmNdialogTitle XmCDialogTitle XmString
XmNfocusCallback XmCCallback (callback)
XmNlabelFontList XmCLabelFontList XFontStruct list
XmNmapCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNnoResize XmCNoResize bool
XmNresizePolicy XmCResizePolicy XmResizePolicy
XmNshadowType XmCShadowType XmShadowType
XmNtextFontList XmCTextFontList XFontStruct list
XmNtextTranslations XmCTranslations XtTranslations
XmNunmapCallback XmCCallback (callback)

Functions:

datatype XmDialogStyle = XmDIALOG_MODELESS | XmDIALOG_PRIMARY_APPLICATION_MODAL | XmDIALOG_FULL_APPLICATION_MODAL | XmDIALOG_SYSTEM_MODAL

datatype XmResizePolicy = XmRESIZE_NONE | XmRESIZE_ANY | XmRESIZE_GROW

datatype XmShadowType = XmSHADOW_ETCHED_IN | XmSHADOW_ETCHED_OUT | XmSHADOW_IN | XmSHADOW_OUT

val XmCreateBulletinBoard: Widget -> string -> Arg list -> Widget
val XmCreateBulletinBoardDialog: Widget -> string -> Arg list -> Widget
val XmCreateForm: Widget-> string -> Arg list -> Widget
val XmCreateFormDialog: Widget-> string -> Arg list -> Widget

val XmIsBulletinBoard: Widget-> bool
val XmIsForm: Widget-> bool

2.3 CascadeButton

Core
XmPrimitive
XmLabel
XmCascadeButton

Description:

CascadeButton widgets are used to construct menu systems. It is the only widget that can have a Pulldown MenuPane attached to it as a submenu via the XmNsubMenuId resource.

To create a menu system CascadeButtons are placed inside a MenuBar. Each of these buttons has a MenuPane attached to it as a submenu. These submenus may also contain CascadeButtons which have further submenus, and so on.

CascadeButtons must have RowColumn parents - a MenuPane and a MenuBar are special cases of a RowColumn widget.

Resources:

XmCascadeButton Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNcascadePixmap XmCPixmap Drawable
XmNcascadingCallback XmCCallback (callback)
XmNmappingDelay XmCMappingDelay int
XmNsubMenuld XmCMenuWidget Widget

Functions:

val XmCreateCascadeButton: Widget-> string -> Arg list -> Widget
val XmCreateCascadeButtonGadget: Widget-> string -> Arg list -> Widget
val XmCreateSeparator: Widget-> string -> Arg list -> Widget
val XmCreateSeparatorGadget: Widget-> string -> Arg list -> Widget
val XmCreateMenuBar: Widget-> string -> Arg list -> Widget
val XmCreateOptioMenu: Widget-> string -> Arg list -> Widget
val XmCreatePopupMenu: Widget-> string -> Arg list -> Widget
val XmCreatePulldowrLMenu: Widget-> string -> Arg list -> Widget

val XmCascadeButtonHighlight: Widget-> bool -> unit

val XmIsCascadeButton: Widget-> bool
val XmIsCascadeButtonGadget: Widget-> bool

2.4 Command

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmSelectionBox
XmCommandBox

Description:

Command widgets are special purpose widgets designed for the entry of textual commands with a history mechanism for retaining previous commands. The widget allows new commands to be entered, or old commands can be selected from a history list and edited to make new commands. Each new command is automatically added to the history. The XmNcommand resource is used to get or set the current command string. The XmCommandError can be used to display an error message at the bottom of the history list.

One additional WorkArea child may be added to a command widget.

Resources:

XmCommand Resources
Name Class Type
XmNcommand XmCTextString XmString
XmNcommandChangedCallback XmCCallback (callback)
XmNcommandEnteredCallback XmCCallback (callback)
XmNhistoryItemCount XmCItemCount int
XmNhistoryItems XmCItems XmString list
XmNhistoryMaxItems XmCMaxItems int
XmNhistoryVisibleItemCount XmCVisibleItemCount int
XmNpromptString XmCPromptString XmString  

Functions:

val XmDIALOG_COMMAND: XmDialogType

val XmDIALOG_COMMAND_TEXT: XmDefaultButtonType
val XmDIALOG_PROMPT_LABEL: XmDefaultButtonType
val XmDIALOG_HISTORY list: XmDefaultButtonType

val XmCreateCommand: Widget -> string -> Arg list -> Widget

val XmCommandError: Widget -> XmString -> unit
val XmCommandGetChild: Widget -> XmDefaultButtonType -> Widget

val XmIsCommand: Widget -> bool

2.5 ErrorDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

An ErrorDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, and the error icon which resembles a Stop sign. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCal1back XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_ERROR: XmDialogType

val XmCreateErrorDialog: Widget -> string -> Arg list -> Widget

2.6 FileSelectionDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmSelectionBox
XmFileSelectionBox

Description:

A FileSelectionDialog allows the user to choose one file from among the files and directories in the file system. The dialog has the following components :-

The Filter text field is used for editing the mask which specifies both the base directory and the filter applied to display the entries in that directory. Pressing the RETURN key after editing this field resets the base directory and reapplies the filter. This is equivalent to pressing the Filter button.

The Files list shows the list of filenames that result from applying the filter to the files in the base directory. Clicking on a filename in the list copies it to the Selection field. Double clicking copies the filename to the Selection field and presses the OK button.

The Directories list shows the list of directories found in the base directory. Clicking on a directory in the list inserts that directory name into the mask in the Filter field. Double clicking inserts the directory into the mask and presses the Filter button to reapply the filter to the new base directory.

The Selection text field shows the currently selected filename appended to the current base directory. If this is not the filename that you require you may either edit it by hand, or use the methods described above to choose another filename.

The OK button does not change any of the fields, it simply causes the XmNokCallback to be applied. This function typically gets the value of the XmNtextString resource, and then performs some action with that filename. If the XmNautoUnmanage resource is set to true then the dialog automatically unmanages itself.

Pressing the Filter button reapplies the filter to the filenames found in the base directory, and updates the Files list.

Pressing the Cancel button applies the XmNcancelCallback function, and if the XmNautoUnmanage resource is set to true then the dialog automatically unmanages itself.

Pressing the Help button applies the XmNhelpCallback function.

Resources:

XmFileSelectionBox Resources
Name Class Type
XmNdirListItemCount XmCDirListItemCount int
XmNdirListItems XmCDirListItems XmString list
XmNdirListLabelString XmCDirListLabelString XmString
XmNdirMask XmCDirMask XmString
XmNdirSpec XmCDirSpec XmString
XmNdirectory XmCDirectory XmString
XmNdirectoryValid XmCDirectoryValid bool
XmNfileListltemCount XmCFileListItemCount int
XmNfileListIteme XmCFileListltems XmString list
XmNfileListLabelString XmCFileListLabeiString XmString
XmNfileTypeMask XmCFileTypeMask XmFileTypeMask
XmNfilterLabelString XmCFilterLabelString XmString
XmNlistUpdated XmCListUpdated bool
XmNnoMatchString XmCNoMatchString XmString
XmNpattem XmCpattern XmString

Functions:

datatype XmFileTypeMask = XmFILE_REGULAR | XmFILE_DIRECTORY | XmFILE_ANY_TYPE

val XmDIALOG_FILE_SELECTION: XmDialogType

val XmDIALOG_APPLY_BUTTON: XmDefaultButtonType
val XmDIALOG_CANCEL_BUTTON: XmDefaultButtonType
val XmDIALOG_DEFAULT_BUTTON: XmDefaultButtonType
val XmDIALOG_DIR_LIST: XmDefaultButtonType
val XmDIALOG_DIR_LIST_LABEL: XmDefaultButtonType
val XmDIALOG_FILTER_LABEL: XmDefaultButtonType
val XmDIALOG_FILTER_TEXT: XmDefaultButtonType
val XmDIALOG_HELP_BUTTON: XmDefaultButtonType
val XmDIALOG_LIST: XmDefaultButtonType
val XmDIALOG_LIST_LABEL: XmDefaultButtonType
val XmDIALOG_OK_BUTTON: XmDefaultButtonType
val XmDIALOG_SELECTION_LABEL: XmDefaultButtonType
val XmDIALOG_SEPARATOR: XmDefaultButtonType
val XmDIALOG_TEXT: XmDefaultButtonType

val XmCreateFileSelectionBox: Widget -> string -> Arg list -> Widget
val XmCreateFileSelectionDialog: Widget -> string -> Arg list -> Widget

val XmFileSelectionBoxGetChild: Widget -> XmDefaultButtonType -> Widget
val XmFileSelectionDoSearch: Widget -> XmString -> unit

val XmIsFileSelectionBox: Widget -> bool

2.7 InformationDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

An InformationDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, and the information icon which resembles an Information sign. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCaliback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_INFORMATION: XmDialogType

val XmCreateInformationDialog: Widget -> string -> Arg list -> Widget

2.8 List

Core
XmPrimitive
XmList

Description:

List widgets are used to select of one or more entries from a list of text strings. The XmNselectionPolicy resource determines one of several different selection modes the list may operate in. The XmNitems resource is used to pass in the list of strings to select from. The XmNselectedItems resource is used to set or get the currently selected items.

Resources:

XmList Resources
Name Class Type
XmNautomaticSelection XmCAutomaticSelection bool
XmNbrowseSelectionCallback XmCCallback (callback)
XmNdefaultActionCallback XmCCallback (callback)
XmNdoubleClickInterval XmCDoubleClickInterval int
XmNextendedSelectionCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNitemCount XmCItemCount int
XmNitems XmCItems XmString list
XmNlistMarginHeight XmCListMarginHeight int
XmNlistMarginWidth XmCListMarginWidth int
XmNlistSizePolicy XmCListSizePolicy XmVisualPolicy
XmNlistSpacing XmCListSpacing int
XmNmultipleSelectionCallback XmCCallback (callback)
XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy
XmNselectedItemCount XmCSelectedItemCount int
XmNselectedItems XmCSelectedItems XmString list
XmNselectionPolicy XmCSelectionPolicy XmSelectionPolicy
XmNsingleSelectionCallback XmCCallback (callback)
XmNstringDirection XmCStringDirection XmStringDirection
XmNtopItemPosition XmCTopItemPosition int
XmNvisibleItemCount XmCVisibleItemCount int

Functions:

datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED

datatype XmSelectionPolicy = XmSINGLE_SELECT | XmMULTIPLE_SELECT | XmEXTENDED_SELECT | XmBROWSE_SELECT

datatype XmVisualPolicy = XmVARIABLE | XmCONSTANT | XmRESIZE_IF_POSSIBLE

val XmCreateList: Widget -> string -> Arg list -> Widget
val XmCreateScrolledList: Widget -> string -> Arg list -> Widget

val XmIsList: Widget -> bool
val XmIsScrolledWindow: Widget -> bool

2.9 MainWindow

Core
Composite
Constraint
XmManager
XmScrolledWindow
XmMainWindow

Description:

The MainWindow widget can be used to manage the primary view of an application. This widget has a number of optional components including a menu bar, a command window, a message window, scroll bars, and a work area. The required components are first created and managed and are then passed to the function XmMainWindowSetAreas so that they can be organised together to create the application's primary view. The XmNcommandWindowLocation resource can be used to control the positioning of the command window relative to the other windows.

Resources:

XmMainWindow Resources
Name Class Type
XmNcommandWindow XmCCommandWindow Widget
XmNcommandWindowLocation XmCCommandWindowLocation XmCommandWindowLocation
XmNmainWindowMarginHeight XmCMainWindowMarginHeight int
XmNmainWindowMarginWidth XmCMainWindowMarginWidth int
XmNmenuBar XmCMenuBar Widget
XmNmessageWindow XmCMessageWindow Widget
XmNshowSeparator XmCShowSeparator bool

 

Functions:

datatype XmCommandWindowLocation = XmCOMMAND_ABOVE_WORKSPACE | XmCOMMAND_BELOW_WORKSPACE

val XmCreateMainWindow: Widget -> string -> Arg list -> Widget

val XmMainWindowSetAreas: Widget -> Widget -> Widget -> Widget -> Widget -> Widget -> unit

val XmMainWindowSepl: Widget -> Widget

val XmMainWindowSep2: Widget -> Widget

val XmMainWindowSep3: Widget -> Widget

val XmIsMainWindow: Widget -> bool

 

2.10 MessageDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

A MessageDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, but does not have any predefined symbol icon. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_MESSAGE: XmDialogType

val XmDIALOG_CANCEL_BUTTON: XmDefaultButtonType
val XmDIALOG_DEFAULT_BUTTON: XmDefaultButtonType
val XmDIALOG_HELP_BUTTON: XmDefaultButtonType
val XmDIALOG_MESSAGE_LABEL: XmDefaultButtonType
val XmDIALOG OK BUTTON: XmDefaultButtonType
val XmDIALOG_SEPARATOR: XmDefaultButtonType
val XmDIALOG_SYMBOL_LABEL: XmDefaultButtonType

val XmCreateMessageBox: Widget-> string -> Arg list -> Widget
val XmCreateMessageDialog: Widget-> string -> Arg list -> Widget

val XmIsMessageBox: Widget-> bool

val XmMessageBoxGetChild: Widget -> XmDefaultButtonType -> Widget

2.11 OptionMenu

Core
Composite
Constraint
XmManager
XmRowcolumn

Description:

An OptionMenu is a specific instance of a RowColumn widget containing a label and a cascade button. Pressing the cascade button pulls down a menu pane so that one of the menu pane items can be selected. The menu pane is then removed and the selected item is displayed inside the cascade button. The XmNlabelString resource is used to set the label, and the XmNsubMenuId resource is used to set the menu pane.

Resources:

XmRowColumn Resources
Name Class Type
XmNadjustLast XmCAdjustLast bool
XmNadjustMargin XmCAdjustMargin bool
XmNbuttonAcceleratorText XmCButtonAcceleratorText XmString list
XmNbuttonAccelerators XmCButtonAccelerators string list
XmNbuttonCount XmCButtonCount int
XmNbuttonMnemonicCharSets XmCButtonMnemonicCharSets XmString list
XmNbuttonMnemonics XmCButtonMnemonics KeySym list
XmNbuttonSet XmCButtonSet int
XmNbuttonType XmCButtonType XmButtonType list
XmNbuttons XmCButtons XmString list
XmNentryAlignment XmCAlignment XmAlignment
XmNentryBorder XmCEntryBorder int
XmNentryCallback XmCCallback (callback)
XmNisAligned XmCIsAligned bool
XmNisHomogeneous XmCIsHomogeneous bool
XmNlabelString XmCLabelString XmString
XmNmapCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmenuAccelerator XmCAccelerators string
XmNmenuCursor XmCCursor Cursor
XmNmenuHelpWidget XmCMenuWidget Widget
XmNmenuHistory XmCMenuWidget Widget
XmNmenuPost XmCMenuPost string
XmNmnemonic XmCMnemonic int
XmNmnemonicCharSet XmCMnemonicCharSet string
XmNnumColumns XmCNumColumns int
XmNoptionLabel XmCOptionLabel XmString
XmNoptionMnemonic XmCOptionMnemonic int
XmNorientation XmCOrientation XmOrientation
XmNpacking XmCPacking XmPacking
XmNpopupEnabled XmCPopupEnabled bool
XmNpostFromButton XmCPostFromButton int
XmNradioAlwaysOne XmCRadioAlwaysOne bool
XmNradioBehavior XmCRadioBehavior bool
XmNresizeHeight XmCResizeHeight bool
XmNresizeWidth XmCResizeWidth bool
XmNrowColumnType XmCRowColumnType XmRowColumnType
XmNsimpleCallback XmCCallback (callback)
XmNspacing XmCSpacing int
XmNsubMenuld XmCMenuWidget Widget
XmNunmapCallback XmCCallback (callback)

Functions:

val XmCreateOptionMenu: Widget-> string -> Arg list -> Widget
val XmCreateSimpleOptionMenu: Widget-> string -> Arg list -> Widget

val XmOptionButtonGadget: Widget -> Widget
val XmOptionLabelGadget: Widget -> Widget

2.12 PanedWindow

Core
Composite
Constraint
XmManager
XmPanedWindow

Description:

A PanedWindow is a composite widget that arranges its children vertically. The width of a paned window is equal to the widest child. The height of each pane can be adjusted by dragging the sash in the separators between the panes.

Resources:

XmPanedWindow Resources
Name Class Type
XmNallowResize XmCBoolean bool
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNpaneMaximum XmCPaneMaximum int
XmNpaneMinimum XmCPaneMinimum int
XmNrefigureMode XmCBoolean bool
XmNsashHeight XmCSashHeight int
XmNsashIndent XmCSashIndent int
XmNsashShadowThickness XmCShadowThickness int
XmNsashWidth XmCSashWidth int
XmNseparatorOn XmCSeparatorOn bool
XmNskipAdjust XmCBoolean bool
XmNspacing XmCSpacing int

Functions:

val XmCreatePanedWindow: Widget -> string -> Arg list -> Widget

val XmIsPanedWindow: Widget -> bool

2.13 PromptDialog

Core
Composite
Constraint
XmManager
XmBulletinboard
XmSelectionBox

Description:

A PromptDialog widget is a specific instance of a MessageBox widget. It has an editable text field, OK, Cancel and Help buttons, and a prompt label. The XmNtextString resource is used to set the editable text string, and the XmNselectionLabelString resource is used to set the prompt.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCal1back XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_PROMPT: XmDialogType

val XmCreatePromptDialog: Widget -> string -> Arg list -> Widget

2.14 QuestionDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

A QuestionDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, and the question icon which resembles a question mark. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCailback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_QUESTION: XmDialogType

val XmCreateQuestionDialog: Widget -> string -> Arg list -> Widget

2.15 Scale

Core
Composite
Constraint
XmManager
XmScale

Description:

A Scale widget is used to display and select a value from within a range of values. The XmNminimum and XmNmaximum resources set the range of the values, and the XmNvalue resource can be used to set and get the current value. The XmNtitleString resource is used to set the title label.

Resources:

XmScale Resources
Name Class Type
XmNdecimalPoints XmCDecimalPoints int
XmNdragCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNhighlightOnEnter XmCHighlightOnEnter bool
XmNhighlightThickness XmCHighlightThickness int
XmNmaximum XmCMaximum int
XmNminimum XmCMinimum int
XmNorientation XmCOrientation XmOrientation
XmNprocessingDirection XmCProcessingDirection XmProcessingDirection
XmNscaleHeight XmCScaleHeight int
XmNscaleMultiple XmCScaleMultiple int
XmNscaleWidth XmCScaleWidth int
XmNshowValue XmCShowValue bool
XmNtitleString XmCTitleString XmString
XmNvalue XmCValue int
XmNvalueChangedCallback XmCCallback (callback)

Functions:

datatype XmOrientation = XmVERTICAL | XmHORIZONTAL

datatype XmProcessingDirection = XmMAX_ON_TOP | XmMAX_ON_BOTTOM | XmMAX_ON_LEFT | XmMAX_ON_RIGHT

val XmCreateScale: Widget -> string -> Arg list -> Widget

val XmIsScale: Widget -> bool

2.16 ScrollBar

Core
XmPrimitive
XmScrollBar

Description:

A ScrollBar widget is used to indicate how much of a data set is currently being displayed in some other widget. The scrollbar can be adjusted by the user so that any part of the data set is displayed. The XmNminimum and XmNmaximum resources set the range of the data set, and the XmNvalue resource can be used to set and get the current position. The XmNsliderSize resource should be set to indicate how much of the set is currently visible.

Resources:

XmScrollBar Resources
Name Class Type
XmNdecrementCallback XmCCallback (callback)
XmNdragCallback XmCCallback (callback)
XmNincrement XmCIncrement int
XmNincrementCallback XmCCallback (callback)
XmNinitialDelay XmCInitialDelay int
XmNmaximum XmCMaximum int
XmNminimum XmCMinimum int
XmNorientation XmCOrientation XmOrientation
XmNpageDecrementCallback XmCCallback (callback)
XmNpageIncrement XmCPageIncrement int
XmNpageIncrementCallback XmCCallback (callback)
XmNprocessingDirection XmCProcessingDirection XmProcessingDirection
XmNrepeatDelay XmCRepeatDelay int
XmNshowArrows XmCShowArrows bool
XmNsliderSize XmCSliderSize int
XmNtoBottomCallback XmCCallback (callback)
XmNtoTopCallback XmCCallback (callback)
XmNtroughColor XmCtroughColor int
XmNvalue XmCValue int
XmNvalueChangedCallback XmCCallback (callback)

Functions:

datatype XmOrientation = XmVERTICAL | XmHORIZONTAL

datatype XmProcessingDirection = XmMAX_ON_TOP | XmMAX_ON_BOTTOM | XmMAX_ON_LEFT | XmMAX_ON_RIGHT

val XmCreateScrollBar: Widget -> string -> Arg list -> Widget

val XinIsScrollBar: Widget -> bool

2.17 ScrolledList

Core
Composite
Constraint
XmManager
XmScrolledWindow

Description:

A ScrolledList widget is a composite widget consisting of a list widget contained within a scrolled window. list widgets are used to select of one or more entries from a list of text strings. The XmNselectionPolicy resource determines one of several selection different modes the list may operate in. The XmNitems resource is used to pass in the list of strings to select from. The XmNselectedItems resource is used to set or get the currently selected items.

Resources:

XmScrolledWindow Resources
Name Class Type
XmNclipWindow XmCClipWindow Widget
XmNhorizontalScrollBar XmCHorizontalScrollBar Widget
XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy
XmNscrollBarPlacement XmCScrollBarPlacement XmScrollBarPlacement
XmNscrolledWindowMarginHeight XmCScrolledWindowMarginHeight int
XmNscrolledWindowMarginWidth XmCScrolledWindowMarginWidth int
XmNserollingPolicy XmCScrollingPolicy XmScrollingPolicy
XmNspacing XmCSpacing int
XmNverticalScrollBar XmCVerticalScrollBar Widget
XmNvisualPolicy XmCVisualPolicy XmVisualPolicy
XmNworkWindow XmCWorkWindow Widget

Functions:

datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED

datatype XmSelectionPolicy = XmSINGLE_SELECT | XmMULTIPLE_SELECT | XmEXTENDED_SELECT | XmBROWSE_SELECT

datatype XmVisualPolicy = XmVARIABLE | XmCONSTANT | XmRESIZE_IF_POSSIBLE

val XmCreateList: Widget -> string -> Arg list -> Widget
val XmCreateScrolledList: Widget -> string -> Arg list -> Widget

val XmIsList: Widget -> bool
val XmIsScrolledWindow: Widget -> bool

2.18 ScrolledText

Core
Composite
Constraint
XmManager
XmScrolledWindow

Description:

A ScrolledText widget is a composite widget consisting of a text widget contained within a scrolled window.

Resources:

XmText Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNautoShowCursorPosition XmCAutoShowCursorPosition bool
XmNblinkRate XmCBlinkRate int
XmNcolumns XmCColumns int
XmNcursorPosition XmCCursorPosition int
XmNcursorPositionVisible XmCCursorPositionVisible bool
XmNeditMode XmCEditMode XmEditMode
XmNeditable XmCEditable bool
XmNfocusCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNgainPrimaryCallback XmCCallback (callback)
XmNlosePrimaryCallback XmCCallback (callback)
XmNlosingFocusCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmaxLength XmCMaxLength int
XmNmodifyVerifyCallback XmCCallback (callback)
XmNmotionVerifyCallback XmCCallback (callback)
XmNpendingDelete XmCPendingDelete bool
XmNresizeHeight XmCResizeHeight bool
XmNresizeWidth XmCResizeWidth bool
XmNrows XmCRows int
XmNscrollHorizontal XmCScroll bool
XmNscrollLeftSide XmCScrollSide bool
XmNscrollTopSide XmCScrollSide bool
XmNscrollVertical XmCScroll bool
XmNselectThreshold XmCSelectThreshold int
XmNselectionArray XmCSelectionArray XmTextScanType list
XmNselectionArrayCount XmCSelectionArrayCount int
XmNtopCharacter XmCTextPosition int
XmNvalueChangedCallback XmCCallback (callback)
XmNverifyBell XmCVerifyBell bool
XmNwordWrap XmCWordWrap bool

Functions:

datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED

datatype XmScrollingPolicy = XmAUTOMATIC | XmAPPLICATION_DEFINED

datatype XmTextScanType = XmSELECT_POSITION | XmSELECT_WHITESPACE | XmSELECT_WORD | XmSELECT_LINE | XmSELECT_ALL | XmSELECT_PARAGRAPH

val XmCreateText: Widget -> string -> Arg list -> Widget
val XmCreateScrolledText: Widget -> string -> Arg list -> Widget

val XmTextGetString: Widget -> string
val XmTextSetString: Widget -> string -> unit
val XmTextSetInsertionPosition: Widget -> int -> unit

val XmIsText: Widget -> bool
val XmIsScrolledWindow: Widget -> bool

2.19 ScrolledWindow

Core
Composite
Constraint
XmManager
XmScrolledWindow

Description:

A ScrolledWindow is a widget that can manage two scroll bars and a work area. If the XmNscrollingPolicy resource is set to XmAUTOMATIC then all the scrolling behaviour is provided by the ScrolledWindow widget and the user just has to make the work area big enough to display all of the data. Other modes of operation exist for cases where this is inappropriate, such as displaying the text from a very long file.

Resources:

XmScrolledWindow Resources
Name Class Type
XmNclipWindow XmCClipWindow Widget
XmNhorizontalScrollBar XmCHorizontalScroliBar Widget
XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy
XmNscrollBarPlacement XmCScrollBarPlacement XmScrollBarPlacement
XmNserolledWindowMarginHeight XmCScrolledWindowMarginHeight int
XmNscrolledWindowMarginWidth XmCScrolledWindowMarginWidth int
XmNscrollingPolicy XmCScrollingPolicy XmScrollingPolicy
XmNspacing XmCSpacing int
XmNverticalScrollBar XmCVerticalScrollBar Widget
XmNvisualPolicy XmCVisualPolicy XmVisualPolicy
XmNworkWindow XmCWorkWindow Widget

Functions:

datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED

datatype XmScrollBarPlacement = XmBOTTOM_RIGHT | XmTOP_RIGHT | XmBOTTOM_LEFT | XmTOP_LEFT

datatype XmScrollingPolicy = XmAUTOMATIC | XmAPPLICATION_DEFINED

datatype XmVisualPolicy = XmVARIABLE | XmCONSTANT | XmRESIZE_IF_POSSIBLE

val XmCreateScrolledWindow: Widget -> string -> Arg list -> Widget

val XmScrolledWindowSetAreas: Widget -> Widget -> Widget -> Widget -> unit

val XmIsScrolledWindow: Widget -> bool

2.20 SelectionDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmSelectionBox

Description:

A SelectionDialog includes a scrolled list, an editable text field, labels and four buttons which are labelled OK, Cancel, Apply and Help by default. Use the XmNlistItems resource to set the contents of the scrolled list, and the XmNtextString resource to set and get the value of the editable text field.

Resources:

XmSelectionBox Resources
Name Class Type
XmNapplyCallback XmCCallback (callback)
XmNapplyLabelString XmCApplyLabelString XmString
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNlistItemCount XmCItemCount int
XmNlistItems XmCItems XmString list
XmNlistLabelString XmCListLabelString XmString
XmNlistVisibleltemCount XmCVisibleItemCount int
XmNminimizeButtons XmCMinimizeButtons bool
XmNmustMatch XmCMustMatch bool
XmNnoMatchCallback XmCCallback (callback)
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNselectionLabelString XmCSelectionLabelString XmString
XmNtextAccelerators XmCAccelerators XtAccelerators
XmNtextColumns XmCColumns int
XmNtextString XmCTextString XmString

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_SELECTION: XmDialogType

val XmDIALOG_APPLY_BUTTON: XmDefaultButtonType
val XmDIALOG_CANCEL_BUTTON: XmDefaultButtonType
val XmDIALOG_DEFAULT_BUTTON: XmDefaultButtonType
val XmDIALOG_HELP_BUTTON: XmDefaultButtonType
val XmDIALOG_LIST: XmDefaultButtonType
val XmDIALOG_LIST_LABEL: XmDefaultButtonType
val XmDIALOG_OK_BUTTON: XmDefaultButtonType
val XmDIALOG_SELECTION_LABEL: XmDefaultButtonType
val XmDIALOG_SEPARATOR: XmDefaultButtonType
val XmDIALOG_TEXT: XmDefaultButtonType

val XmCreateSelectionBox: Widget -> string -> Arg list -> Widget
val XmCreateSelectionDialog: Widget -> string -> Arg list -> Widget

val XmSelectionBoxGetChild: Widget -> XmDefaultButtonType -> Widget

val XmIsSelectionBox: Widget -> bool

2.21 Text

Core
XmPrimitive
XmText

Description:

The text widget provides both single and multi-line text editors with cut/copy/paste facilities. Use the XmNeditMode resource to choose single or multi-line editing. Use the function XmTextSetString to copy a string into the widget, and the function XmTextGetString to get it back again. Line breaks within multi-line strings are represented by "\n" characters.

Resources:

XmText Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNautoShowCursorPosition XmCAutoShowCursorPosition bool
XmNblinkRate XmCBlinkRate int
XmNcolumns XmCColumns int
XmNcursorPosition XmCCursorPosition int
XmNcursorPositionVisible XmCCursorPositionVisible bool
XmNeditMode XmCEditMode XmEditMode
XmNeditable XmCEditable bool
XmNfocusCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNgainPrimaryCallback XmCCallback (callback)
XmNlosePrimaryCallback XmCCallback (callback)
XmNlosingFocusCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmaxLength XmCMaxLength int
XmNmodifyVerifyCallback XmCCallback (callback)
XmNmotionVerifyCallback XmCCallback (callback)
XmNpendingDelete XmCPendingDelete bool
XmNresizeHeight XmCResizeHeight bool
XmNresizeWidth XmCResizeWidth bool
XmNrows XmCRows int
XmNscrollHorizontal XmCScroll bool
XmNscrollLeftSide XmCScrollSide bool
XmNscrollTopSide XmCScrollSide bool
XmNscrollVertical XmCScroll bool
XmNselectThreshold XmCSelectThreshold int
XmNselectionArray XmCSelectionArray XmTextScanType list
XmNselectionArrayCount XmCSelectionArrayCount int
XmNtopCharacter XmCTextPosition int
XmNvalueChangedCallback XmCCallback (callback)
XmNverifyBell XmCVerifyBell bool
XmNwordWrap XmCWordWrap bool

Functions:

datatype XmTextScanType = XmSELECT_POSITION | XmSELECT_WHITESPACE | XmSELECT_WORD | XmSELECT_LINE | XmSELECT_ALL | XmSELECT_PARAGRAPH

val XmCreateText: Widget-> string -> Arg list -> Widget
val XmCreateScrolledText: Widget-> string -> Arg list -> Widget

val XmTextGetString: Widget -> string
val XmTextSetString: Widget -> string unit
val XmTextSetInsertionPosition: Widget int -> unit

val XmIsText: Widget -> bool
val XmIsScrolledWindow: Widget -> bool

2.22 ToggleButton

Core
XmPrimitive
XmLabel
XmToggleButton

Description:

A ToggleButton is used to display and set boolean or one-of-many states. When used for boolean states the ToggleButton uses a filled or empty square indicator to show the set or unset state. When used for one-of-many states the ToggleButton uses a filled or empty diamond to show the set and unset states. Pressing a boolean ToggleButton toggles the state from set to unset. Pressing one button in a RowColumn widget that has its XmNradioBehavior resource set to true, will set that button and unset all the others. In this case all the ToggleButtons automatically set their XmNindicatorType resource to XmONE_OF_MANY.

Resources:

XmToggleButton Resources
Name Class Type
XmNarmCallback XmCCallback (callback)
XmNdisarmCallback XmCDisarmCal1back (callback)
XmNfillOnSelect XmCFillOnSelect bool
XmNindicatorOn XmCIndicatorOn bool
XmNindicatorSize XmCIndicatorSize int
XmNindicatorType XmCIndicatorType XmIndicatorType
XmNselectColor XmCSelectColor int
XmNselectInsensitivePixmap XmCSelectInsensitivePixmap Drawable
XmNselectPixmap XmCSelectPixmap Drawable
XmNset XmCset bool
XmNspacing XmCSpacing int
XmNvalueChangedCallback XmCCallback (callback)
XmNvisibleWhenOff XmCVisibleWhenOff bool

Functions:

datatype XmIndicatorType = XmN_OF_MANY | XmONE_OF_MANY

val XmCreateToggleButton: Widget -> string -> Arg list -> Widget
val XmCreateToggleButtonGadget: Widget -> string -> Arg list -> Widget

val XmIsToggleButton: Widget -> bool
val XmIsToggleButtonGadget: Widget -> bool

2.23 WarningDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

A WarningDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, and the warning icon which resembles an exclamation mark. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_WARNING: XmDialogType

val XmCreateWarningDialog: Widget -> string -> Arg list -> Widget

2.24 WorkingDialog

Core
Composite
Constraint
XmManager
XmBulletinBoard
XmMessageBox

Description:

A WorkingDialog widget is a specific instance of a MessageBox widget. It has a message field, OK, Cancel and Help buttons, and the working icon which resembles an hourglass. The XmNmessageString resource is used to set the message string.

Resources:

XmMessageBox Resources
Name Class Type
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCaliback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

Functions:

datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END

val XmDIALOG_WORKING: XmDialogType

val XmCreateWorkingDialog: Widget -> string -> Arg list -> Widget

 

Chapter 3

Resource Tables

The following type conversions are implicit in the Poly/ML implementation of the Motif library. Wherever it refers to the C type in publications about the Motif library the corresponding ML type is substituted.

Note that often the Motif documentation often incorrectly specifies the type Window instead of Widget when describing resource lists.

Note also that in the current implementation the type XmString is identical to string.

short   int
enum   datatype
int with predefined values   datatype
unsigned char with predefined values   datatype
Atom   int
Cardinal   int
Dimension   int
KeySym   int
Pixel   int
Pixmap   Drawable
Position   int
String *   string list
Window   Drawable (or Widget)
XmString   XmString = string
XmStringCharSetTable   string list
XmStringTable   XmString list
XmTextPosition   int

 

3.1 ApplicationShell

ApplicationShell Resources
Name Class Type
XmNargc XmCArgc int
XmNargv XmCArgv string list

 

3.2 Composite

Composite Resources
Name Class Type
XmNchildren XmCChildren Widget list
XmNnumChildren XmCNumChildren int

 

3.3 Core

Core Resources
Name Class Type
XmNaccelerators XmCAccelerators XtAccelerators
XmNancestorSensitive XmCBoolean bool
XmNbackground XmCBackground int
XmNbackgroundPixmap XmCBackgroundPixmap Drawable
XmNborderColor XmCBorderColor int
XmNborderPixmap XmCPixmap Drawable
XmNborderWidth XmCBorderWidth int
XmNcolormap XmCColormap Colormap
XmNdepth XmCDepth int
XmNdestroyCallback XmCCallback (callback)
XmNheight XmCHeight int
XmNinitialResourcesPersistent XmCInitialResourcesPersistent bool
XmNmappedWhenManaged XmCMappedWhenManaged bool
XmNsensitive XmCSensitive bool
XmNtranslations XmCTranslations XtTranslations
XmNwidth XmCWidth int
XmNx XmCX int
XmNy XmCY int

 

3.4 Object

Object Resources
Name Class Type
XmNdestroyCallback XmCCallback (callback)

 

3.5 RectObj

RectObj Resources
Name Class Type
XmNancestorSensitive XmCBoolean bool
XmNborderWidth XmCBorderWidth int
XmNheight XmCHeight int
XmNsensitive XmCSensitive bool
XmNwidth XmCWidth int
XmNx XmCX int
XmNy XmCY int

 

3.6 Shell

Shell Resources
Name Class Type
XmNallowShellResize XmCAllowShellResize bool
XmNgeometry XmCGeometry string
XmNoverrideRedirect XmCOverrideRedireet bool
XmNpopdownCallback XmCCallback (callback)
XmNpopupCallback XmCCallback (callback)
XmNsaveUnder XmCSaveUnder bool
XmNvisual XmCVisual Visual

 

3.7 TopLevelShell

TopLevelShell Resources
Name Class Type
XmNiconName XmCIconName string
XmNiconNameEncoding XmCIconNameEncoding int
XmNiconic XmCIconic bool

 

3.8 TransientShell

TransientShell Resources
Name Class Type
XmNtransientFor XmCTransientFor Widget

 

3.9 VendorShell

VendorShell Resources
Name Class Type
XmNdefaultFontList XmCDefaultFontList XFontStruct list
XmNdeleteResponse XmCDeleteResponse XmDeleteResponse
XmNkeyboardFocusPolicy XmCKeyboardFocusPolicy XmKeyboardFocusPolicy
XmNmwmDecorations XmCMwmDecorations int
XmNmwmFunctions XmCMwmFunctions int
XmNmwmInputMode XmCMwmInputMode int
XmNmwmMenu XmCMwmMenu string
XmNshellUnitType XmCShellUnitType XmUnitType
XmNuseAsyncGeometry XmCUseAsyncGeometry bool

 

3.10 WMShell

WMShell Resources
Name Class Type
XmNbaseHeight XmCBaseHeight int
XmNbaseWidth XmCBaseWidth int
XmNheightInc XmCHeightInc int
XmNiconMask XmCIconMask Drawable
XmNiconPixmap XmCIconPixmap Drawable
XmNiconWindow XmCIconWindow Drawable
XmNiconX XmCIconX int
XmNiconY XmCIconY int
XmNinitialState XmCInitialState XWMStateHint
XmNinput XmCInput bool
XmNmaxAspectX XmCMaxAspectX int
XmNmaxAspectY XmCMaxAspectY int
XmNmaxHeight XmCMaxHeight int
XmNmaxWidth XmCMaxWidth int
XmNminAspectX XmCMinAspectX int
XmNminAspectY XmCMinAspectY int
XmNminHeight XmCMinHeight int
XmNminWidth XmCMinWidth int
XmNtitle XmCTitle string
XmNtitleEncoding XmCTitleEncoding int
XmNtransient XmCTransient bool
XmNwaitForWm XmCWaitForWm bool
XmNwidthInc XmCWidthInc int
XmNwinGravity XmCWinGravity int
XmNwindowGroup XmCWindowGroup Drawable
XmNwmTimeout XmCWmTimeout int

 

3.11 XmArrowButton

XmArrowButton Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNarmCallback XmCCallback (callback)
XmNarrowDirection XmCArrowDirection XmArrowDirection
XmNdisarmCal1back XmCDisarmCallback (callback)
XmNmultiClick XmCMultiClick XmMultiClickType

 

3.12 XmBulletinBoard

XmBulletinBoard Resources
Name Class Type
XmNallowOverlap XmCAllowOverlap bool
XmNautoUnmanage XmCAutoUnmanage bool
XmNbuttonFontList XmCButtonFontList XFontStruct list
XmNcancelButton XmCWidget Widget
XmNdefaultButton XmCWidget Widget
XmNdefaultPosition XmCDefaultPosition bool
XmNdialogStyle XmCDialogStyle XmDialogStyle
XmNdialogTitle XmCDialogTitle XmString
XmNfocusCallback XmCCallback (callback)
XmNlabelFontList XmCLabelFontList XFontStruct list
XmNmapCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNnoResize XmCNoResize bool
XmNresizePolicy XmCResizePolicy XmResizePolicy
XmNshadowType XmCShadowType XmShadowType
XmNtextFontList XmCTextFontList XFontStruct list
XmNtextTranslations XmCTranslations XtTranslations
XmNunmapCallback XmCCallback (callback)

 

3.13 XmCascadeButton

XmCascadeButton Resources
Name Class Type
XmNactivateCallback XmCCallback (Callback)
XmNcascadePixmap XmCPixmap Drawable
XmNcascadingCallback XmCCallback (callback)
XmNmappingDelay XmCMappingDelay int
XmNsubMenuId XmCMenuWidget Widget

 

3.14 XmCommand

XmCommand Resources
Name Class Type
XmNcommand XmCTextString XmString
XmNcommandChangedCallback XmCCallback (callback)
XmNcommandEnteredCallback XmCCallback (callback)
XmNhistoryItemCount XmCItemCount int
XmNhistoryItems XmCItems XmString list  
XmNhistoryMaxItems XmCMaxItems int
XmNhistoryVisibleItemCount XmCVisibleItemCount int
XmNpromptString XmCPromptString XmString

 

3.15 XmDrawingArea

XmDrawingArea Resources
Name Class Type
XmNexposeCallback XmCCallback (callback)
XmNinputCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNresizeCallback XmCCallback (callback)
XmNresizePolicy XmCResizePolicy XmResizePolicy

 

3.16 XmDrawnButton

XmDrawnButton Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNarmCallback XmCCallback (callback)
XmNdisarmCallback XmCDisarmCallback (callback)
XmNexposeCallback XmCCallback (callback)
XmNmultiClick XmCMultiClick XmMultiClickType
XmNpushButtonEnabled XmCPushButtonEnabled bool
XmNresizeCallback XmCCallback (callback)
XmNshadowType XmCShadowType XmShadowType

 

3.17 XmFileSelectionBox

XmFileSelectionBox Resources
Name Class Type
XmNdirListItemCount XmCDirListItemCount int
XmNdirListItems XmCDirListItems XmString list
XmNdirListLabelString XmCDirListLabelString XmString
XmNdirMask XmCDirMask XmString
XmNdirSpec XmCDirSpec XmString
XmNdirectory XmCDirectory XmString
XmNdirectoryValid XmCDirectoryValid bool
XmNfileListItemCount XmCFileListItemCount int
XmNfileListItems XmCFileListItems XmString list
XmNfileListLabelString XmCFileListLabelString XmString
XmNfileTypeMask XmCFileTypeMask XmFileTypeMask
XmNfilterLabelString XmCFilterLabelString XmString
XmNlistUpdated XmCListUpdated bool
XmNnoMatchString XmCNoMatchString XmString
XmNpattern XmCPattern XmString

 

3.18 XmForm

XmForm Resources
Name Class Type
XmNbottomAttachment XmCAttachment XmAttachment
XmNbottomOffset XmCOffset int
XmNbottomPosition XmCPosition int
XmNbottomWidget XmCWidget Widget
XmNfractionBase XmCFraction int
XmNhorizontalSpacing XmCSpacing int
XmNleftAttachment XmCAttachment XmAttachment
XmNleftOffset XmCOffset int
XmNleftPosition XmCPosition int
XmNleftWidget XmCWidget Widget
XmNresizable XmCBoolean bool
XmNrightAttachment XmCAttachment XmAttachment
XmNrightOffset XmCOffset int
XmNrightPosition XmCPosition int
XmNrightWidget XmCWidget Widget
XmNrubberPositioning XmCRubberPositioning bool
XmNtopAttachment XmCAttachment XmAttachment
XmNtop0ffset XmCOffset int
XmNtopPosition XmCPosition int
XmNtopWidget XmCWidget Widget
XmNverticalSpacing XmCSpacing int

 

3.19 XmFrame

XmFrame Resources
Name Class Type
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNshadowType XmCShadowType XmShadowType

 

3.20 XmGadget

XmGadget Resources
Name Class Type
XmNhelpCallback XmCCallback (callback)
XmNhighlightOnEnter XmCHighlightOnEnter bool
XmNhighlightThickness XmCHighlightThickness int
XmNnavigationType XmCNavigationType XmNavigationType
XmNshadowThickness XmCShadowThickness int
XmNtraversalOn XmCTraversalOn bool
XmNunitType XmCUnitType XmUnitType

 

3.21 XmLabel

XmLabel Resources
Name Class Type
XmNaccelerator XmCAccelerator string
XmNacceleratorText XmCAcceleratorText XmString
XmNalignment XmCAlignment XmAlignment
XmNfontList XmCFontList XFontStruct list
XmNlabelInsensitivePixmap XmCLabelInsensitivePixmap Drawable
XmNlabelPixmap XmCLabelPixmap Drawable
XmNlabelString XmCLabelString XmString
XmNlabelType XmCLabelType XmLabelType
XmNmarginBottom XmCMarginBottom int
XmNmarginHeight XmCMarginHeight int
XmNmarginLeft XmCMarginLeft int
XmNmarginRight XmCMarginRight int
XmNmarginTop XmCMarginTop int
XmNmarginWidth XmCMarginWidth int
XmNmnemonic XmCMnemonic int
XmNmnemonicCharSet XmCMnemonicCharSet string
XmNrecomputeSize XmCRecomputeSize bool
XmNstringDirection XmCStringDirection XmStringDirection

 

3.22 XmList

XmList Resources
Name Class Type
XmNautomaticSelection XmCAutomaticSelection bool
XmNbrowseSelectionCallback XmCCallback (callback)
XmNdefaultActionCallback XmCCallback (callback)
XmNdoubleClickInterval XmCDoubleClickInterval int
XmNextendedSelectionCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNitemCount XmCItemCount int
XmNitems XmCItems XmString list
XmNlistMarginHeight XmCListMarginHeight int
XmNlistMarginWidth XmCListMarginWidth int
XmNlistSizePolicy XmCListSizePolicy XmVisualPolicy
XmNlistSpacing XmCListSpacing int
XmNmultipleSelectionCallback XmCCallback (callback)
XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy
XmNselectedItemCount XmCSelectedItemCount int
XmNselectedItems XmCSelectedItems XmString list
XmNselectionPolicy XmCSelectionPolicy XmSelectionPolicy
XmNsingleSelectionCallback XmCCallback (callback)
XmNstringDirection XmCStringDirection XmStringDirection
XmNtopItemPosition XmCTopItemPosition int
XmNvisibleItemCount XmCVisibleItemCount int

 

3.23 XmMainWindow

XmMainWindow Resources
Name Class Type
XmNcommandWindow XmCCommandWindow Widget
XmNcommandWindowLocation XmCCommandWindowLocation XmCommandWindowLocation
XmNmainWindowMarginHeight XmCMainWindowMarginHeight int
XmNmainWindowMarginWidth XmCMainWindowMarginWidth int
XmNmenuBar XmCMenuBar Widget
XmNmessageWindow XmCMessageWindow Widget
XmNshowSeparator XmCShowSeparator bool

 

3.24 XmManager

XmManager Resources
Name Class Type
XmNbottomShadowColor XmCBottomShadowColor int
XmNbottomShadowPixmap XmCBottomShadowPixmap Drawable
XmNforeground XmCForeground int
XmNhelpCallback XmCCallback (callback)
XmNhighlightColor XmCHighlightColor int
XmNhighlightPixmap XmCHighlightPixmap Drawable
XmNnavigationType XmCNavigationType XmNavigationType
XmNshadowThickness XmCShadowThickness int
XmNstringDirection XmCStringDirection XmStringDirection
XmNtopShadowColor XmCTopShadowColor int
XmNtopShadowPixmap XmCTopShadowPixmap Drawable
XmNtraversalOn XmCTraversalOn bool
XmNunitType XmCUnitType XmUnitType

 

3.25 XmMenuShell

XmMenuShell Resources
Name Class Type
XmNdefaultFontList XmCDefaultFontList XFontStruct list

 

3.26 XmMessageBox

XmMessageBox Resources
Name Class Type
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNmessageAlignment XmCAlignment XmAlignment
XmNmessageString XmCMessageString XmString
XmNminimizeButtons XmCMinimizeButtons bool
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNsymbolPixmap XmCPixmap Drawable

 

3.27 XmPanedWindow

XmPanedWindow Resources
Name Class Type
XmNallowResize XmCBoolean bool
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNpaneMaximum XmCPaneMaximum int
XmNpaneMinimum XmCPaneMinimum int
XmNrefigureMode XmCBoolean bool
XmNsashHeight XmCSashHeight int
XmNsashIndent XmCSashIndent int
XmNsashShadowThickness XmCShadowThickness int
XmNsashWidth XmCSashWidth int
XmNseparatorOn XmCSeparatorOn bool
XmNskipAdjust XmCBoolean bool
XmNspacing XmCSpacing int

 

3.28 XmPrimitive

XmPrimitive Resources
Name Class Type
XmNbottomShadowColor XmCBottomShadowColor int
XmNbottomShadowPixmap XmCBottomShadowPixmap Drawable
XmNforeground XmCForeground int
XmNhelpCallback XmCCallback (callback)
XmNhighlightColor XmCHighlightColor int
XmNhighlightOnEnter XmCHighlightOnEnter bool
XmNhighlightPixmap XmCHighlightPixmap Drawable
XmNhighlightThickness XmCHighlightThickness int
XmNnavigationType XmCNavigationType XmNavigationType
XmNshadowThickness XmCShadowThickness int
XmNtopShadowColor XmCTopShadowColor int
XmNtopShadowPixmap XmCTopShadowPixmap Drawable
XmNtraversalOn XmCTraversalOn bool
XmNunitType XmCUnitType XmUnitType

 

3.29 XmPushButton

XmPushButton Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNarmCal1back XmCCallback (callback)
XmNarmColor XmCArmColor int
XmNarmPixmap XmCArmPixmap Drawable
XmNdefaultButtonShadowThickness XmCDefaultButtonShadowThickness int
XmNdisarmCallback XmCDisarmCallback (callback)
XmNfillOnArm XmCFillOnArm bool
XmNmultiClick XmCMultiClick XmMultiClickType
XmNshowAsDefault XmCShowAsDefault int

 

3.30 XmRowColumn

XmRowColumn Resources
Name Class Type
XmNadjustLast XmCAdjustLast bool
XmNadjustMargin XmCAdjustMargin bool
XmNbuttonAcceleratorText XmCButtonAcceleratorText XmString list
XmNbuttonAccelerators XmCButtonAccelerators string list
XmNbuttonCount XmCButtonCount int
XmNbuttonMnemonicCharSets XmCButtonMnemonicCharSets XmString list
XmNbuttonMnemonics XmCButtonMnemonics KeySym list
XmNbuttonSet XmCButtonSet int
XmNbuttonType XmCButtonType XmButtonType list
XmNbuttons XmCButtons XmString list
XmNentryAlignment XmCAlignment XmAlignment
XmNentryBorder XmCEntryBorder int
XmNentryCallback XmCCallback (callback)
XmNisAligned XmClsAligned bool
XmNisHomogeneous XmCIsHomogeneous bool
XmNlabelString XmCLabelString XmString
XmNmapCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmenuAccelerator XmCAccelerators string
XmNmenuCursor XmCCursor Cursor
XmNmenuHelpWidget XmCMenuWidget Widget
XmNmenuHistory XmCMenuWidget Widget
XmNmenuPost XmCMenuPost string
XmNmnemonic XmCMnemonic int
XmNmnemonicCharSet XmCMnemonicCharSet string
XmNnumColumns XmCNumColumns int
XmNoptionLabel XmCOptionLabel XmString
XmNoptionMnemonic XmCOptionMnemonic int
XmNorientation XmCOrientation XmOrientation
XmNpacking XmCPacking XmPacking
XmNpopupEnabled XmCPopupEnabled bool
XmNpostFromButton XmCPostFromButton int
XmNradioAlwaysOne XmCRadioAlwaysOne bool
XmNradioBehavior XmCRadioBehavior bool
XmNresizeHeight XmCResizeHeight bool
XmNresizeWidth XmCResizeWidth bool
XmNrowColumnType XmCRowColumnType XmRowColumnType
XmNsimpleCallback XmCCallback (callback)
XmNspacing XmCSpacing int
XmNsubMenuId XmCMenuWidget Widget
XmNunmapCallback XmCCallback (callback)

Note that XmNwhichButton is obsoleted by XmNmenuPost.

 

3.31 XmScale

XmScale Resources
Name Class Type
XmNdecimalPoints XmCDecimalPoints int
XmNdragCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNhighlightOnEnter XmCHighlightOnEnter bool
XmNhighlightThickness XmCHighlightThickness int
XmNmaximum XmCMaximum int
XmNminimum XmCMinimum int
XmNorientation XmCOrientation XmOrientation
XmNprocessingDirection XmCProcessingDirection XmProcessingDirection
XmNscaleHeight XmCScaleHeight int
XmNscaleMultiple XmCScaleMultiple int
XmNscaleWidth XmCScaleWidth int
XmNshowValue XmCShowValue bool
XmNtitleString XmCTitleString XmString
XmNvalue XmCValue int
XmNvalueChangedCallback XmCCallback (callback)

 

3.32 XmScrollBar

XmScrollBar Resources
Name Class Type
XmNdecrementCallback XmCCallback (callback)
XmNdragCallback XmCCallback (callback)
XmNincrement XmCIncrement int
XmNincrementCallback XmCCallback (callback)
XmNinitialDelay XmCInitialDelay int
XmNmaximum XmCMaximum int
XmNminimum XmCMinimum int
XmNorientation XmCOrientation XmOrientation
XmNpageDecrementCallback XmCCallback (callback)
XmNpageIncrement XmCPageIncrement int
XmNpageIncrementCallback XmCCallback (callback)
XmNprocessingDirection XmCProcessingDirection XmProcessingDirection
XmNrepeatDelay XmCRepeatDelay int
XmNshowArrows XmCShowArrows bool
XmNsliderSize XrnCSliderSize int
XmNtoBottomCallback XmCCallback (callback)
XmNtoTopCallback XmCCallback (callback)
XmNtroughColor XmCTroughColor int
XmNvalue XmCValue int
XmNvalueChangedCallback XmCCallback (callback)

 

3.33 XmScrolledWindow

XmScrolledWindow Resources
Name Class Type
XmNclipWindow XmCclipwindow Widget
XmNhorizontalScrollBar XmCHorizontalScrollBar Widget
XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy
XmNscrollBarPlacement XmCScrollBarPlacement XmScrollBarPlacement
XmNscrolledWindowMarginHeight XmCScrolledWindowMarginHeight int
XmNscrolledWindowMarginWidth XmCScrolledWindowMarginWidth int
XmNscrollingPolicy XmCScrollingPolicy XmScrollingPolicy
XmNspacing XmCSpacing int
XmNverticalScrollBar XmCVerticalScrollBar Widget
XmNvisualPolicy XmCVisualPolicy XmVisualPolicy
XmNworkWindow XmCWorkWindow Widget

 

3.34 XmSelectionBox

XmSelectionBox Resources
Name Class Type
XmNapplyCallback XmCCallback (callback)
XmNapplyLabelString XmCApplyLabelString XmString
XmNcancelCallback XmCCallback (callback)
XmNcancelLabelString XmCCancelLabelString XmString
XmNdialogType XmCDialogType XmDialogType
XmNhelpLabelString XmCHelpLabelString XmString
XmNlistItemCount XmCItemCount int
XmNlistItems XmCItems XmString list
XmNlistLabelString XmCListLabelString XmString
XmNlistVisibleItemCount XmCVisibleItemCount int
XmNminimizeButtons XmCMinimizeButtons bool
XmNmustMatch XmCMustMatch bool
XmNnoMatchCallback XmCCallback (callback)
XmNokCallback XmCCallback (callback)
XmNokLabelString XmCOkLabelString XmString
XmNselectionLabelString XmCSelectionLabelString XmString
XmNtextAccelerators XmCAccelerators XtAccelerators
XmNtextColumns XmCColumns int
XmNtextString XmCTextString XmString

 

3.35 XmSeparator

XmSeparator Resources
Name Class Type
XmNmargin XmCMargin int
XmNorientation XmCOrientation XmOrientation
XmNseparatorType XmCSeparatorType XmShadowType

 

3.36 XmText

XmText Resources
Name Class Type
XmNactivateCal1back XmCCallback (callback)
XmNautoShowCursorPosition XmCAutoShowCursorPosition bool
XmNblinkRate XmCBlinkRate int
XmNcolumns XmCColumns int
XmNcursorPosition XmCCursorPosition int
XmNcursorPositionVisible XmCCursorPositionVisible bool
XmNeditMode XmCEditMode XmEditMode
XmNeditable XmCEditable bool
XmNfocusCallback XmCCallback (callback)
XmNfontList XmCFontList XFontStruct list
XmNgainPrimaryCallback XmCCallback (callback)
XmNlosePrimaryCallback XmCCallback (callback)
XmNlosingFocusCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmaxLength XmCMaxLength int
XmNmodifyVerifyCallback XmCCallback (callback)
XmNmotionVerifyCallback XmCCallback (callback)
XmNpendingDelete XmCPendingDelete bool
XmNresizeHeight XmCResizeHeight bool
XmNresizeWidth XmCResizeWidth bool
XmNrows XmCRows int
XmNscrollHorizontal XmCScroll bool
XmNscrollLeftSide XmCScrollSide bool
XmNscrollTopSide XmCScrollSide bool
XmNscrollVertical XmCScroll bool
XmNselectThreshold XmCSelectThreshold int
XmNselectionArray XmCSelectionArray XmTextScanType list
XmNselectionArrayCount XmCSelectionArrayCount int
XmNtopCharacter XmCTextPosition int
XmNvalueChangedCallback XmCCallback (callback)
XmNverifyBell XmCVerifyBell bool
XmNwordWrap XmCWordWrap bool

Note that XmNvalue is already declared of type int in the resource tables for XmScale and XmScrollBar, and it cannot therefore appear in the table for XmText as a string. To access this value you have to use the functions XmTextSetString and XmTextGetString instead.

 

3.37 XmTextField

XmTextField Resources
Name Class Type
XmNactivateCallback XmCCallback (callback)
XmNblinkRate XmCBlinkRate int
XmNcolumns XmCColumns int
XmNcursorPosition XmCCursorPosition int
XmNcursorPositionVisible XmCCursorPositionVisible bool
XmNeditable XmCEditable bool
XmNfontList XmCFontList XFontStruct list
XmNgainPrimaryCallback XmCCallback (callback)
XmNlosePrimaryCallback XmCCallback (callback)
XmNlosingFocusCallback XmCCallback (callback)
XmNmarginHeight XmCMarginHeight int
XmNmarginWidth XmCMarginWidth int
XmNmaxLength XmCMaxLength int
XmNmodifyVerifyCallback XmCCallback (callback)
XmNmotionVerifyCallback XmCCallback (callback)
XmNpendingDelete XmCPendingDelete bool
XmNresizeWidth XmCResizeWidth bool
XmNselectThreshold XmCSelectThreshold int
XmNselectionArray XmCSelectionArray XmTextScanType list
XmNselectionArrayCount XmCSelectionArrayCount int
XmNvalueChangedCallback XmCCallback (callback)
XmNverifyBell XmCVerifyBell bool

Note that XmNvalue is already declared of type int in the resource tables for XmScale and XmScrollBar, and it cannot therefore appear in the table for XmTextField as a string. To access this value you have to use the functions XmTextSetString and XmTextGetString instead.

 

3.38 XmToggleButton

XmToggleButtonResources
Name Class Type
XmNarmCallback XmCCallback (callback)
XmNdisarmCallback XmCDisarmCallback (callback)
XmNfillOnSelect XmCFillOnSelect bool
XmNindicatorOn XmCIndicatorOn bool
XmNindicatorSize XmCIndicatorSize int
XmNindicatorType XmCIndicatorType XmIndicatorType
XmNselectColor XmCSelectColor int
XmNselectInsensitivePixmap XmCSelectInsensitivePixmap Drawable
XmNselectPixmap XmCSelectPixmap Drawable
XmNset XmCSet bool
XmNspacing XmCSpacing int
XmNvalueChangedCallback XmCCallback (callback)
XmNvisibleWhen0fr XmCVisibleWhenOff bool
polyml-5.6/documentation/Tutorials/WindowsProgramming.html000066400000000000000000001043621265146633400243020ustar00rootroot00000000000000 Windows Programming in Poly/ML

Windows Programming in Poly/ML

David C.J. Matthews

David C.J. Matthews 2001. Updated 2009.

This is a brief introduction to programming with the Windows™ interface in Poly/ML.  It is arranged as a tutorial around the mlEdit example, a small example text editor.  It is not intended as a full description of writing programs for Windows and is no substitute for a more general guide.  If you are planning to develop an application using this interface it is probably worth purchasing a book or CD_ROM reference for Windows such as the Microsoft Developer Network library.

This introduction assumes some familiarity with programming in ML and perhaps some experience of other windowing systems, such as X-Windows.  It does not assume any experience of programming with Windows and, for experienced Windows programmers, it will cover familiar ground.  It does, though, point out some of the differences between the ML interface and that of other languages.  The interface functions in ML are very similar to the underlying C functions.  The main differences are in the types of the arguments and a few other changes necessary for ML.   For more information see the Windows Interface Reference.

Acknowledgements

The original version of the Windows interface was written at AHL by Panos Aguieris.  It uses the Poly/ML CInterface structure written by Nick Chapman to provide nearly all the interface.  It was extensively modified and expanded by David Matthews.

Index

1. Windows, Messages and Window Procedures
2. Creating the child window
3. Creating the parent window
4. Menus
5. Sending Messages
6. Dialogues
7. Common Dialogues
8. Printing and Painting

1. Windows, Messages and Window Procedures

When thinking about a window we tend to think of a top-level application or a document window.  From the point of view of programming, though, this is just one variety.   In fact each label, menu and text box is a window but because they form part of a bigger application they tend to be overlooked.  These are child windows.   Nearly every window has to deal with two main areas of concern.  There has to be a way of displaying the contents of the window and there has to be a way of handling user input, whether by the mouse or from the keyboard.

Most communication with windows is by sending messages.  A message may be sent as a result of user input, such as moving the mouse or typing a character at the keyboard.  It may also be sent by the application to change the appearance of the window or to get information from it.  There are over two hundred different message types defined by Windows and it is possible to define your own for use within an application.  Many of these are only relevant in special circumstances and only a few are used regularly.  It's worth noting in passing that messages can be sent from one process to a window in another process and that hidden windows, windows which don't appear on the screen but are only ever used to receive messages, are one of the standard ways of communicating between processes in Windows.

The appearance of a window is largely governed by how it responds to different kinds of messages.  Every window has a window procedure which processes messages sent to the window.  When you create a window you give the class of the window you want to create and the new window uses the window procedure for that class.  You can either use a standard class, such as Edit, or you can create your own class using your own window procedure using RegisterClassEx.  You will nearly always need to create at least one class for your top-level window. 

To see how this works in practice let's look at an extract from the mlEdit example.  

fun wndProc(hw: HWND, msg: Message, state as SOME{edit, fileName, ...}) =
    case msg of
    |   WM_CLOSE =>
        (if checkForSave(hw, edit, fileName) then DefWindowProc(hw, msg) else LRESINT 0, state)
    .....
    |   _ => (DefWindowProc(hw, msg), state)
    .....
and fun checkForSave ....

This extract from the window procedure, wndProc, processes the WM_CLOSE message.   This message has no parameters and is generated by the system when the user clicks in the close box of the window (the box at the top left of the window with a cross in it).   Every message is sent to the window procedure.  When writing a window procedure we are often only interested in handling a few of the possibilities so Windows performs a default action if we don't want to handle the message.  Even if we do handle it we can pass it on for default processing when we have dealt with it.  The default action for WM_CLOSE is to destroy the window by a call to DestroyWindow.  In our application we want to ask the user whether to save the window if the text being edited has been modified.  This process also gives the user the opportunity for second thoughts and they may cancel the closure.  This is handled by our function checkForSave which returns true if it is safe to close the window.   Window procedures in ML return a pair as their result.  The first field of the pair is the Windows result value.  For many messages a result of LRESINT 0 is suitable.  In this example we return SOME(LRESINT 0) if we don't want the window to be destroyed. 

The full type of a window procedure in ML is
    HWND * Message * 'a -> LRESULT * 'a
The third argument is the state of the window and an updated version of the state is returned as part of the result.  This allows the window procedure to process a message and update the state as part of the process.  It is an ML extension which is not part of the underlying message system.  In our extract we return the previous state unchanged.

The mlEdit example works by constructing a parent window using a custom class and our own window procedure and then making a child window within it using the system Edit class.   The Edit window deals with all the keyboard input so saving us the need to write this ourselves.  Our window procedure has to process messages to do with menu selection and other messages sent to top-level windows. 

    WM_SETFOCUS _ =>
        (
         SetFocus(SOME edit);
         (DefWindowProc(hw, msg), state)
        )
    
|    WM_SIZE{height, width, ...} =>
        (
         MoveWindow{hWnd=edit, x=0, y=0, height=height, width=width, repaint=true};
         (DefWindowProc(hw, msg), state)
        )

The WM_SETFOCUS message is sent when the user clicks on a window and is intended to set the keyboard focus to that window (i.e. selects the window to receive keyboard input).  The edit child window occupies the centre of our window so the WM_FOCUS message will be sent directly to it if the user clicks within that area.  Since we are not interested in receiving characters in our top-level window we set the focus to the edit window if the user clicks on the border.   While it isn't essential to process this message at all for the mlEdit application to work correctly, by doing so we improve its usability.

The WM_SIZE message is sent if the window is resized.  Among the parameters to the window are the height and width of the client area, the area excluding the border and the menu bar.  This is the area we want to use for our edit window so we use MoveWindow to set its size.  Calling MoveWindow causes the edit window to receive a WM_SIZE message.  The window procedure for the edit window uses this to adjust the format of the text within the window to suit the new size.  We do not need to be concerned about how this happens in our application.  WM_SIZE is also sent when a window is created.  This is convenient and means we do not need to set the size of the edit window when we create it.

2. Creating the child window

So far we have not described how the edit window is created.  We need it to be a child window of the top-level window and the easiest way to do that is to create it when the WM_CREATE message is received.  This message is sent as part of the process of creation of the top-level window.

fun wndProc(hw: HWND, msg: Message, NONE) =
    (
    case msg of
        WM_CREATE _ => (* Create an edit window and return it as the state. *)
        let
            val edit =
             CreateWindow{class = Class.Edit, name = "",
                style = Edit.Style.flags[Edit.Style.WS_CHILD, Edit.Style.WS_VISIBLE, Edit.Style.WS_VSCROLL,
                            Edit.Style.ES_LEFT, Edit.Style.ES_MULTILINE, Edit.Style.ES_AUTOVSCROLL],
                            x  = 0, y = 0, height = 0, width = 0, relation = ChildWindow{parent=hw, id=99},
                            instance = Globals.ApplicationInstance(), init = ()}
            (* We also set the font for the edit window here.  This has been omitted. *)
         in
            (LRESINT 0, SOME{edit=edit, devMode=NONE, devNames = NONE, fileName=""})
        end

    | _ => (DefWindowProc(hw, msg), NONE)
    )

This extract of the window procedure shows the creation of the edit window as part of processing WM_CREATE.  We use CreateWindow which makes a window of a specified class and returns a handle to it.  Once we have processed the message we set the state to SOME of a record containing a handle to the edit window.  (Instead of doing this we could use GetDlgItem to find it each time we needed it, but this is easier).  At this stage we just pass zeros for the size of the window since we will use the WM_SIZE message to set its size.   The id value for the child window (we use 99) is irrelevant in this example since we never use it.  The style does not include horizontal scrolling so the edit window uses word-wrapping.

3. Creating the parent window

It's now time to see how we create the main window itself.  Since we want to use our own window procedure we need to register a class even though we will only create a single window of this class.

val polyIcon = ...
val menu = ...
val className = "mlEditWindowClass"
val app = Globals.ApplicationInstance()
(* Register a class for the top-level window.  Use the Poly icon from the application. *)
val myWindowClass = RegisterClassEx{style = Class.Style.flags[], wndProc = wndProc, hInstance = app,
    hIcon = SOME polyIcon, hCursor = NONE, hbrBackGround = NONE, menuName = NONE,
    className = className, hIconSm = NONE};


val w = CreateWindow{class = myWindowClass, name = "mlEdit", style = Window.Style.WS_OVERLAPPEDWINDOW,
    x  = CW_USEDEFAULT, y = CW_USEDEFAULT, height = CW_USEDEFAULT, width = CW_USEDEFAULT,
    relation = PopupWindow menu, instance = app, init = NONE};
in
ShowWindow(w, SW_SHOW);
SetForegroundWindow w;

RunApplication();
UnregisterClass(className, app)
end;

In the mlEdit example we use the icon from the Poly/ML application.  It isn't necessary to provide an icon: Windows will provide a default one if NONE is given for hIcon.  We use the WS_OVERLAPPEDWINDOW style for the window which is the standard for a top-level window and gives a standard border with a system menu and minimise, maximise and close boxes.  CW_USEDEFAULT is used for the size and position of the window.   The user can always move or resize it once it has been created.   We create the window with the PopupWindow value and pass the menu to be used.  Once the window has been created we call ShowWindow to make it visible and SetForegroundWindow to make it appear above other windows.

Some messages are sent to the window procedure as a result of calling the functions such as CreateWindow.  Generally, though, messages are queued and have to be explicitly dequeued and passed to the window procedure.  In C this is done by a message loop with GetMessage and DispatchMessage.  In ML we use the RunApplication function which deals with all this.  RunApplication returns when a WM_QUIT message is received.  To ensure that this happens we have to put this message into the queue.  The easiest way to do this is to call PostQuitMessage when the window is about to go away.  We have already seen how DestroyWindow is called as a result of processing the WM_CLOSE message.  DestroyWindow sends WM_DESTROY and WM_NCDESTROY messages to the window procedure to allow it to clean up properly.  WM_NCDESTROY will be the last message to be sent to this window procedure so we call PostQuitMessage while handling it.

|    WM_NCDESTROY =>
        (
         PostQuitMessage 0;
         (DefWindowProc(hw, msg), state)
        )

We need to call UnregisterClass when RunApplication returns.  Classes are automatically unregistered when the application terminates but in this context the application is the whole Poly/ML session so if we want to run mlEdit again within the same session we need to unregister the class.   Otherwise the next time we call RegisterClassEx with the same name it will fail because the class is already registered.

4. Menus

We have already seen that a menu can be set up by passing its handle as part of the PopupWindow value to CreateWindow.  Let's see how the menu itself is created and how it is processed.

There are a number of ways a menu can be created but perhaps the simplest is to build it up using calls to CreateMenu and AppendMenu.  The structure we want for our menu is a bar containing File, Edit and Help menus each with several menu items.  In general a menu consists of multiple items, each of which may either be a command item or may pull up a sub-menu.

val menuOpen = 1
and menuQuit = 2
and menuSave = 3
...
val fileMenu =
    let
        val fileMenu = CreateMenu();
    in
        AppendMenu(fileMenu, [], MenuId menuOpen, MFT_STRING "&Open");
        AppendMenu(fileMenu, [], MenuId menuSave, MFT_STRING "&Save");
        AppendMenu(fileMenu, [], MenuId menuSaveAs, MFT_STRING "Save &As...");
        AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR);
        AppendMenu(fileMenu, [], MenuId menuPageSetup, MFT_STRING "Page Set&up...");
        AppendMenu(fileMenu, [], MenuId menuPrint, MFT_STRING "P&rint...");
        AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR);
        AppendMenu(fileMenu, [], MenuId menuQuit, MFT_STRING "&Quit");
        fileMenu
    end;

We create the file menu by calling CreateMenu and then AppendMenu for each item.   Every item, apart from separators, has a different item ID.  The values are arbitrary but we need to use different values for each because these are the values which will be passed to our window procedure when a particular menu item is selected.   Separators, which appear as horizontal lines when the menu is pulled down, are used to improve the layout.  The ampersands (&s) precede the character which will be underlined in the menu.  These provide keyboard shortcuts for menu items.  Typically the first character is used but sometimes we have to use another character in order to give all the items in a menu different characters.

val menu = CreateMenu();
val _ = AppendMenu(menu, [], MenuHandle fileMenu, MFT_STRING "&File");
val _ = AppendMenu(menu, [], MenuHandle editMenu, MFT_STRING "&Edit")
val _ = AppendMenu(menu, [], MenuHandle helpMenu, MFT_STRING "&Help")

We can create the edit and help menus in exactly the same way.  When they have been created we can build the full menu.  The argument to AppendMenu is MenuHandle rather than MenuId since these are sub-menus.

As with all other input selecting a menu item causes the system to send a message to the window.  It sends a WM_COMMAND message with information about the particular menu item.  The wId value in the messagecontains the identifier which was used when the menu was created. 

|    WM_COMMAND{notifyCode = 0, wId, control} =>

        if wId = menuQuit
        then
        (
        if checkForSave(hw, edit, fileName) then DestroyWindow hw else();
        (LRESINT 0, state)
        )
        else ...

The simplest item to process is when Quit is selected.  We process it in almost the same way as we process WM_CLOSE, except in this case we have to explicitly call DestroyWindow since the default action for this message is to do nothing.  Note that since we process WM_NCDESTROY by calling PostQuitMessage the message loop in RunApplication will exit when the window destruction is complete.

5. Sending Messages

So far we have seen how we process messages but not how our application can send them.   An application sends messages using either SendMessage or PostMessage.   The main difference between them is that SendMessage does not return until the window procedure has processed the message and so it is able to return a result to the caller.  It functions essentially as a, possibly remote, procedure call.

We can use SendMessage to process some of the menu items.

        else if wId = menuCut
        then (SendMessage(edit, WM_CUT); (LRESINT 0, state))
        else if wId = menuCopy
        then (SendMessage(edit, WM_COPY); (LRESINT 0, state))
        else if wId = menuPaste
        then (SendMessage(edit, WM_PASTE); (LRESINT 0, state))

The Cut, Copy and Paste items from the edit menu are handled by sending messages to the edit window.  The edit window processes these by copying data to and from the clipboard.  In this example we are not interested in the result that SendMessage returns but we use it rather than PostMessage to ensure that the command is fully processed before, for example, we accept any characters as input.

Another case where we can use SendMessage is to see whether the text has been modified and so whether we need to save it before quitting.

fun checkForSave(hw, edit, fileName) =
    case SendMessage(edit, EM_GETMODIFY) of
            LRESINT 0 => true (* Unmodified - continue. *)
        |    _ => ... (* Save it. *)

We send the edit window an EM_GETMODIFY message.  If the reply is LRESINT 0 (i.e. false) it has not been modified and we don't need to do anything.  Otherwise we need to save the document, or at least ask whether we should save it.

6. Dialogues

A dialogue box is a special kind of window which is used to present information to the user or to request information.  They contain one or more controls and a button usually labelled OK and often a Cancel button.  The simplest form of dialogue is the message box.  This presents a piece of text and has one or more buttons.  

let
    val res =
        MessageBox(SOME hw, "Save document?", "Confirm",
                   MessageBoxStyle.MB_YESNOCANCEL)
in
    if res = IDYES
    then .... (* Save document. *)  ...
    else if res = IDNO
    then true (* Continue anyway. *)
    else false (* Cancel - don't exit or open. *)
end

We use a message box in mlEdit to ask whether we should save the document if it has been modifed.  The MB_YESNOCANCEL value for the style means that the message box will have three buttons: Yes, No and Cancel.  The message box is an example of a modal dialogue.  Modal dialogues are those which need a response before the application can continue.  The application is disabled until the dialogue has been dismissed by clicking one of the buttons.  In contrast a modeless dialogue acts just like another window and the user can interact with either the application window or the dialogue box.   MessageBox returns with an identifier which indicates the button which was pressed.   If Yes, we need to save the document; if no, we don't.  If Cancel was pressed we need to cancel the operation which caused this dialogue to be presented.  For instance, if the user accidentally clicked on the Close box of the window and then pressed Cancel we do not pass the WM_CLOSE message to the default window procedure.  It is good interface design practice to provide some way for the user to cancel an action.

A more sophisticated dialogue is used when the user selects "About mlEdit..." from the Help menu.  MessageBox is not sufficient for this dialogue since we want to include an icon in the dialogue box so we use one of the general dialogue functions.   The layout of a dialogue can be given either in a resource file or as a template.   Resource files are often a convenient way of holding dialogues as well as menus and other strings.  They lend themselves particularly to producing localized versions of programs, i.e. programs with the user interaction tailored for a particular language and/or culture, since all the text that needs to be localized can be stored in the resource file.  A resource file is either an executable file (.EXE) or a dynamic library (.DLL).  To use a resource file you will need a suitable resource compiler which will normally form part of a development environment such as Microsoft Visual C or Borland C++.  You can then load the resource file and get a handle to it using LoadLibrary.  It is possible to make use of resources in the Poly/ML program using the instance handle returned by ApplicationInstance.  We actually do this in mlEdit to get a handle to the icon.

(* Borrow the Poly icon from the application program. It happens to be icon id 102. *)
val polyIcon = Icon.LoadIcon(app, Resource.MAKEINTRESOURCE 102);

For this example, though, we use a template for the dialogue.

val pictureId = 1000 (* Could use any number here. *)
open Static.Style
val template =
    {x = 0, y = 0, cx = 210, cy = 94, font = SOME (8, "MS Sans Serif"), menu = NONE,
     class = NONE, title = "About mlEdit", extendedStyle = 0,
     style = flags[WS_POPUP, WS_CAPTION],

     items =
      [{x = 73, y = 62, cx = 50, cy = 14, id = 1,
        class = DLG_BUTTON (flags[WS_CHILD, WS_VISIBLE, WS_TABSTOP]),
        title = DLG_TITLESTRING "OK", creationData = NONE, extendedStyle = 0},

       {x = 7, y = 7, cx = 32, cy = 32, id = pictureId,
        class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, SS_ICON]),
        title = DLG_TITLESTRING "", creationData = NONE, extendedStyle = 0},

       {x = 15, y = 39, cx = 180, cy = 21, id = 65535,
        class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, WS_GROUP]),
        title = DLG_TITLESTRING
               "mlEdit - An exmple of Windows programming in Poly/ML\
               \\nCopyright David C.J. Matthews 2001",
        creationData = NONE,  extendedStyle = 0}] }

The dialogue contains three items: a button with the title "OK", a static picture with style SS_ICON, and a piece of static text.  Along with the layout of the dialogue we also need a dialogue procedure.  A dialogue procedure is almost the same as a window procedure.  It processes messages sent to the dialogue in the same way as a window procedure does. The only difference is that a dialogue procedure does not call DefWindowProc.

fun dlgProc(dial, WM_INITDIALOG _, ()) =
    (
        (* Send a message to the picture control to set it to this icon. *)
        SendMessage(GetDlgItem(dial, pictureId), STM_SETICON{icon=polyIcon});
        (LRESINT 1, ())
    )

|    dlgProc(dial, WM_COMMAND{notifyCode = 0, wId=1 (* OK button *), ...}, ()) =
        (* When the OK button is pressed we end the dialogue. *)
        (EndDialog(dial, 1); (LRESINT 1, ()) )

|    dlgProc _ = (LRESINT 0, ())

We only process two messages here: WM_INITDIALOG and WM_COMMAND.  WM_INITDIALOG is sent when the dialogue is created.  We use GetDlgItem to get a handle to the static picture control and then send it a STM_SETICON message to set the picture.  We only need to do this when the dialogue is initialised.  The static control will take care of displaying the picture whenever the dialogue box is visible.  WM_COMMAND messages are sent by buttons as well as by menus and in this example we process the message by calling EndDialog to close the dialogue box.  The value of wId in this case is the identifier of the OK button.

To construct and display the dialogue box we call DialogBoxIndirect with the template and the dialogue procedure.   The parent of the dialogue is our main window (hw).  This window will automatically be disabled until the dialogue box has been closed.

DialogBoxIndirect(app, template, hw, dlgProc, ());

7. Common Dialogues

For many purposes a standard dialogue box can be used and Windows provides a number of these.  For instance, most applications include a way for the user to open a file and it would be tedious to have to program this from scratch for each new application.   It is far easier to use a standard dialogue.  More to the point, by using a standard dialogue the interface to the user is similar to that of other applications, reducing the learning load.

The mlEdit example uses a number of these.  GetOpenFileName and GetSaveFileName are used to select the file to open and for the Save As menu item.  FindText is used for the Find menu item.   PageSetupDlg and PrintDlg are used for the Page Setup and Print items.  They generally work in the same way, creating a modal dialogue requesting the information and returning when the OK or Cancel button is pressed.   The ML functions take a configuration structure and return an option type.  If the user cancels the operation they return NONE, if the user presses OK they return a new configuration structure with the requested information filled in. FindText works differently.  It creates a modeless dialogue and instead sends FINDMSGSTRING messages to the parent window.

8. Printing and Painting

One area we have not touched on is actually how we draw to the screen.  By using the Edit window to draw the text our application does not actually need to concern itself with exactly what happens when an area of the screen is uncovered and how characters in the text are converted into dots on the screen.  This is all dealt with by the Edit window class.

When it comes to printing the file these issues become apparent.  Printing to a printer and drawing to the screen are handled in exactly the same way in Windows.  In both cases we need to draw the document into a device context.  A device context is an abstraction used for printers, the screen and also for bitmaps and metafiles in memory.  Although there is an obvious difference in the printed page and an image on the screen in terms of the physical output as far as preparing the image is concerned they are both rectangular areas of dots (pixels).  They may differ in size, in the range of colours possible and in the number of pixels per inch (resolution).   Since we don't need to be concerned with drawing to the screen in this application we will focus on printing the file but we could easily arrange the code so that it could be used for both.

We get a device context for the printer by giving the PrintDlgFlags.PD_RETURNDC option to the print dialogue.  It would also be possible to get a device context using CreateDC.   Once we have the device context we can find the size of the page.

val _ = SetMapMode(hdc, MM_TEXT)
val pageWidth = GetDeviceCaps(hdc, HORZRES)
and pageHeight = GetDeviceCaps(hdc, VERTRES)

We now need to find a font to use.  We want a 10 point Courier font which we obtain using CreateFont.  This is a fixed width font which simplifies calculating the page width.

val charHeight = ~10 * GetDeviceCaps(hdc, LOGPIXELSY) div 72;
val hFont = CreateFont{height=charHeight, width=0, escapement=0, orientation=0,
       weight=FW_DONTCARE, italic=false, underline=false, strikeOut=false,
       charSet=ANSI_CHARSET, outputPrecision=OUT_DEFAULT_PRECIS,
       clipPrecision=CLIP_DEFAULT_PRECIS, quality=DEFAULT_QUALITY,
       pitch=FIXED_PITCH, family=FF_MODERN, faceName="Courier"}

The character height calculation looks odd, giving us a negative value, but is a pecularity of CreateFont.  All the other arguments are fairly obvious. 

val oldFont = SelectObject(hdc, hFont);

val textMetric = GetTextMetrics hdc;

We now select this as the font to use.  SelectObject can be used for various other sorts of object, such as pens, brushes and bitmaps.  Whenever you select in a particularly kind of object the previous object of that kind is returned as the result.   It's generally good practice to select it back before you finish with a device context.  Having selected this font we then call GetTextMetrics to find the width of the font.   From this and the page width we can compute the number of characters on a line.    The height of the page divided by the height of a character gives us the number of characters on a page.  We are now ready to print a page.

We get the text from the edit window using GetWindowText.   The print dialogue gives the user the option of printing the currently selected area of the window rather than the whole file or a range of pages.  To find the selection we send the edit window an EM_GETSEL message.

We prepare the page by setting the colours and filling the page with white.  These are likely to be the defaults anyway but there's no harm in making sure.

val white = RGB{red=255, blue=255, green=255}
val black = RGB{red=0, blue=0, green = 0}
val pageRect = {top=0, left=0, bottom=pageHeight, right=pageWidth}

SetBkColor(hdc, white);
SetTextColor(hdc, black);
ExtTextOut(hdc, {x=0, y=0}, [ETO_OPAQUE], SOME pageRect, "", []);

ExtTextOut is one of the ways of drawing text but it is also a convenient way of filling an area with a colour.  The ETO_OPAQUE option causes the rectangle to be filled with the background colour.

Actually drawing each line is done using the TabbedTextOut function.  We extract a line from the document and draw it .

TabbedTextOut(hdc, {x=0, y= lineNo * #height textMetric},  thisLine, [], 0);

Each line is drawn beneath the previous one until the page is full or we have drawn all the text.

All this is the same whether we are printing a file or drawing to the screen.   When printing, though there are a few extra function calls we need.  Before each page we call StartPage and after the page we call EndPage.  We also need to bracket the whole document with calls to StartDoc and EndDoc.  When the document is complete we also need to restore the original font, delete the Courier font we created and delete the device context.

val jobID = StartDoc(hdc, {docName=fileName, output=NONE, dType=NONE});
...
EndDoc hdc;
SelectObject(hdc, oldFont);
DeleteObject hFont;
DeleteDC hdc;

We could use this code to draw to the screen if we were not using the edit window.   In that case we would process the WM_PAINT message and bracket the calls with BeginPaint and EndPaint.

polyml-5.6/documentation/Tutorials/mlEdit.html000066400000000000000000000741731265146633400216710ustar00rootroot00000000000000 Source for mlEdit example
(*
    Copyright (c) 2001-7
        David C.J. Matthews

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
    
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*)
(* Example text editor. *)
fun mlEdit () =
let
    open Window Message Menu Edit Class Dialog CommonDialog MessageBox Caret
    open DeviceContext Font Printing Transform Painting Color
    open Keyboard

    (* Define values to be delivered when the menu items are selected.
       The Id is delivered as part of a WM_COMMAND message. *)
    val menuOpen = 1
    and menuQuit = 2
    and menuSave = 3
    and menuSaveAs = 4
    and menuCut = 5
    and menuCopy = 6
    and menuPaste = 7
    and menuFind = 8
    and menuPageSetup = 9
    and menuPrint = 10
    and menuAbout = 11

    val app = Globals.ApplicationInstance()

    (* Borrow the Poly icon from the application program. It happens to
       be icon id 102. If this doesn't work return NULL. *)
    val polyIcon =
        Icon.LoadIcon(app, Resource.MAKEINTRESOURCE 102) handle _ => Globals.hNull;

    local
        (* Create sub-menus. *)
        val fileMenu =
            let
                val fileMenu = CreateMenu();
            in
                AppendMenu(fileMenu, [], MenuId menuOpen, MFT_STRING "&Open");
                AppendMenu(fileMenu, [], MenuId menuSave, MFT_STRING "&Save");
                AppendMenu(fileMenu, [], MenuId menuSaveAs, MFT_STRING "Save &As...");
                AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR);
                AppendMenu(fileMenu, [], MenuId menuPageSetup, MFT_STRING "Page Set&up...");
                AppendMenu(fileMenu, [], MenuId menuPrint, MFT_STRING "P&rint...");
                AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR);
                AppendMenu(fileMenu, [], MenuId menuQuit, MFT_STRING "&Quit");
                fileMenu
            end;
    
        val editMenu =
            let
                val editMenu = CreateMenu();
            in
                AppendMenu(editMenu, [], MenuId menuCut, MFT_STRING "Cu&t");
                AppendMenu(editMenu, [], MenuId menuCopy, MFT_STRING "&Copy");
                AppendMenu(editMenu, [], MenuId menuPaste, MFT_STRING "&Paste");
                AppendMenu(editMenu, [], MenuId menuFind, MFT_STRING "&Find");
                editMenu
            end;

        val helpMenu =
            let
                val helpMenu = CreateMenu()
            in
                AppendMenu(helpMenu, [], MenuId menuAbout, MFT_STRING "&About mlEdit...");
                helpMenu
            end

    in
        (* Create the main menu and append the sub-menus. *)
        val menu = CreateMenu();
        val _ = AppendMenu(menu, [], MenuHandle fileMenu, MFT_STRING "&File");
        val _ = AppendMenu(menu, [], MenuHandle editMenu, MFT_STRING "&Edit")
        val _ = AppendMenu(menu, [], MenuHandle helpMenu, MFT_STRING "&Help")
    end;

    (* The "state" of the editor. *)
    type state = {
        edit: HWND, (* Handle to the edit window. *)
        devMode: DEVMODE option, devNames: DEVNAMES option, (* Printer settings *)
        fileName: string
        }

    fun wndProc(hw: HWND, msg: Message, NONE): LRESULT * state option =
        (
        case msg of
            WM_CREATE _ => (* Create an edit window and return it as the state. *)
            let
                val edit =
                 CreateWindow{class = Class.Edit, name = "",
                    (* The style does not include horizontal scrolling.  That causes us to use word-wrapping. *)
                    style = Edit.Style.flags[Edit.Style.WS_CHILD, Edit.Style.WS_VISIBLE, Edit.Style.WS_VSCROLL,
                                    (*Edit.Style.WS_HSCROLL, *)Edit.Style.ES_LEFT, Edit.Style.ES_MULTILINE,
                                    Edit.Style.ES_AUTOVSCROLL(*, Edit.Style.ES_AUTOHSCROLL*)],
                    x  = 0, y = 0, height = 0, width = 0, relation = ChildWindow{parent=hw, id=99},
                    instance = Globals.ApplicationInstance(), init = ()}

                (* Create a 10 point Courier font. *)
                val hDC = GetDC edit;
                val height = ~10 * GetDeviceCaps(hDC, LOGPIXELSY) div 72;
                val _ = ReleaseDC(edit, hDC);
                val hFont = CreateFont{height=height, width=0, escapement=0, orientation=0,
                       weight=FW_DONTCARE, italic=false, underline=false, strikeOut=false,
                       charSet=ANSI_CHARSET, outputPrecision=OUT_DEFAULT_PRECIS,
                       clipPrecision=CLIP_DEFAULT_PRECIS, quality=DEFAULT_QUALITY,
                       pitch=FIXED_PITCH, family=FF_MODERN, faceName="Courier"}
            in
                SendMessage(edit, WM_SETFONT{font=hFont, redrawflag=false});
                (LRESINT 0, SOME{edit=edit, devMode=NONE, devNames = NONE, fileName=""})
            end

        | _ => (DefWindowProc(hw, msg), NONE)
        )

    | wndProc(hw: HWND,
              msg: Message,
              state: state option as SOME{edit, devMode, devNames, fileName, ...}) =
        case msg of
            WM_SETFOCUS _ =>
                (* If we get a focus request we set the focus to the edit window. *)
                (SetFocus(SOME edit); (DefWindowProc(hw, msg), state))
    
        |    WM_SIZE{height, width, ...} =>
                (* If we get a size change we set the size of the edit window. *)
                (MoveWindow{hWnd=edit, x=0, y=0, height=height, width=width, repaint=true}; (DefWindowProc(hw, msg), state))
    
        |    WM_NCDESTROY =>
                (* When the window is closed we send a QUIT message which exits from the application loop. *)
                (PostQuitMessage 0; (DefWindowProc(hw, msg), state))
    
        |    WM_CLOSE =>
                (* User has pressed the Close box.  If it's ok to close we could call
                   DestroyWindow ourselves.  Just as an example we return NONE which
                   passes it to the default window procedure and does it for us. *)
                (if checkForSave(hw, edit, fileName) then DefWindowProc(hw, msg) else LRESINT 0, state)
    
        |    WM_COMMAND{notifyCode = 0, wId, control} =>
                (* Menu selections arrive here. *)

                if wId = menuQuit
                then
                    (
                    if checkForSave(hw, edit, fileName) then DestroyWindow hw else ();
                    (LRESINT 0, state)
                    )

                else if wId = menuOpen
                then
                let
                    val on = {
                        owner = SOME hw,
                        template = TemplateDefault,
                        filter =
                            [("Text Files (*.txt)", "*.txt"),
                             ("ML Files (*.sml)", "*.sml"),
                             ("All Files (*.*)", "*.*")],
                        customFilter = NONE,
                        filterIndex = 1,
                        file = "",
                        maxFile = 1000,
                        fileTitle = "",
                        initialDir = NONE,
                        title = NONE,
                        flags = OpenFileFlags.flags[OpenFileFlags.OFN_HIDEREADONLY],
                        defExt = NONE
                    }
                in
                    case GetOpenFileName on of
                        NONE => (LRESINT 0, state)
                    |    SOME {file, ...} =>
                        (* If it's been modified we need to ask before overwriting. *)
                        if checkForSave(hw, edit, fileName)
                        then
                        (let
                            val f = TextIO.openIn file
                            (* Text input will convert CRNL to \n.  We need to
                               reverse the process. *)
                            fun nlToCrnl s =
                                String.translate(fn #"\n" => "\r\n" | c => String.str c) s
                        in
                            (* Should we save any existing file? *)
                            SetWindowText(edit, nlToCrnl(TextIO.inputAll f));
                            TextIO.closeIn f;
                            SendMessage(edit, EM_SETMODIFY{modified=false});
                            (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames,
                                          fileName=file})
                        end) handle exn =>
                            (MessageBox(SOME hw,
                                concat["Unable to open - ", file, "\n"(*, exnMessage exn*)],
                                "Open failure", MessageBoxStyle.MB_OK);
                            (LRESINT 0, state))
                        else (LRESINT 0, state)
                end

                else if wId = menuSave andalso fileName <> ""
                then (* Save to the original file name if there is one. *)
                (
                    saveDocument(hw, fileName, edit);
                    (LRESINT 0, state)
                )

                else if wId = menuSaveAs orelse wId = menuSave (* andalso fileName = "" *)
                then
                (
                    case saveAsDocument(hw, edit) of
                        NONE => (LRESINT 0, state)
                    |    SOME newName =>
                            (LRESINT 0, (* Use the selected file name. *)
                                SOME{edit=edit, devMode=devMode, devNames=devNames,
                                     fileName=newName})
                )

                else if wId = menuFind
                then
                let
                    open FindReplaceFlags
                    (* Create a "Find" dialogue. *)
                    val find =
                        FindText{owner = hw, template = TemplateDefault,
                                 flags=flags[FR_DOWN, FR_HIDEWHOLEWORD],
                                 findWhat="", replaceWith="", bufferSize = 100}
                in
                    ShowWindow(find, SW_SHOW);
                    (LRESINT 0, state)
                end

                (* Cut, Copy and Paste are all handled by the Edit window. *)
                else if wId = menuCut
                then (SendMessage(edit, WM_CUT); (LRESINT 0, state))
                else if wId = menuCopy
                then (SendMessage(edit, WM_COPY); (LRESINT 0, state))
                else if wId = menuPaste
                then (SendMessage(edit, WM_PASTE); (LRESINT 0, state))

                else if wId = menuPageSetup
                then
                    (
                    (* Put up the dialogue and change the settings if necessary. *)
                    case PageSetupDlg {owner=SOME hw, devMode=devMode, devNames=devNames,
                                     flags=PageSetupFlags.flags[], paperSize={x=0,y=0},
                                     minMargin={top=0,bottom=0,left=0,right=0},
                                     margin={top=0,bottom=0,left=0,right=0}} of
                        NONE => (LRESINT 0, state)
                    |    SOME {devMode, devNames, ...} =>
                            (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames,
                                          fileName=fileName})
                    )

                else if wId = menuPrint (* "Print" menu item. *)
                then
                let
                    (* Put up the dialogue box to get the settings. *)
                    val printSettings =
                        PrintDlg {owner=SOME hw, devMode=devMode, devNames=devNames,
                                  context=NONE,
                                  flags=PrintDlgFlags.flags[PrintDlgFlags.PD_RETURNDC],
                                  fromPage=1, toPage= ~1, minPage=1, maxPage= ~1, copies=1};
                in
                    case printSettings of
                        SOME {devMode, devNames, context = SOME hdc, flags, fromPage, toPage, ...} =>
                        (let
                            (* If the "Selection" button has been pressed we only print the
                               selection. *)
                            val printWhat =
                                if PrintDlgFlags.anySet(flags, PrintDlgFlags.PD_SELECTION)
                                then
                                let
                                    val from = ref 0 and to = ref 0
                                    val _ = SendMessage(edit, EM_GETSEL{startPos = from, endPos = to})
                                    val text = GetWindowText edit
                                in
                                    if !from < 0 orelse !from > size text orelse
                                       !to < 0 orelse !from > size text
                                    then ""
                                    else String.substring(text, !from, !to - !from)
                                end
                                else (* "All" button pressed or "Pages" pressed. *)
                                    GetWindowText edit;
                            val textLength = size printWhat

                            (* Tell the spooler to start the document. *)
                            val jobID = StartDoc(hdc, {docName=fileName, output=NONE, dType=NONE})

                            (* Find out how big a character is. From this we can work out
                               how many characters fit on a line and how many lines on a
                               page. Since we're using a fixed width font this is fairly
                               easy. *)
                            val _ = SetMapMode(hdc, MM_TEXT)
                            val white = RGB{red=255, blue=255, green=255}
                            val black = RGB{red=0, blue=0, green = 0}
                            val pageWidth = GetDeviceCaps(hdc, HORZRES)
                            and pageHeight = GetDeviceCaps(hdc, VERTRES)

                            (* Create the same font as we're using on the screen. Since this is
                               a fixed width font it makes calculating the number of characters
                               fairly easy. *)
                            val charHeight = ~10 * GetDeviceCaps(hdc, LOGPIXELSY) div 72;
                            val hFont = CreateFont{height=charHeight, width=0, escapement=0, orientation=0,
                                   weight=FW_DONTCARE, italic=false, underline=false, strikeOut=false,
                                   charSet=ANSI_CHARSET, outputPrecision=OUT_DEFAULT_PRECIS,
                                   clipPrecision=CLIP_DEFAULT_PRECIS, quality=DEFAULT_QUALITY,
                                   pitch=FIXED_PITCH, family=FF_MODERN, faceName="Courier"}
                            val oldFont = SelectObject(hdc, hFont); (* Use this font. *)

                            val textMetric = GetTextMetrics hdc;

                            fun printPage pno index =
                            let
                                (* If we are printing a range of pages we need to check whether
                                   we are in the range. *)
                                val printThisPage =
                                    if PrintDlgFlags.anySet(flags, PrintDlgFlags.PD_PAGENUMS)
                                    then pno >= fromPage andalso (pno <= toPage orelse toPage < 0)
                                    else true
                                val pageRect = {top=0, left=0, bottom=pageHeight, right=pageWidth}
                                (* Calculate the number of lines and columns. *)
                                val nLines = pageHeight div #height textMetric;
                                val nCols = pageWidth div #maxCharWidth textMetric

                                (* Output the lines to fill the page. *)
                                fun outputLines lineNo p =
                                    if lineNo >= nLines
                                    then p (* Return last pointer. *)
                                    else
                                    let
                                        (* Find the point to split the line.  We stop at the end of
                                           the text, a line break, the last word break on the line
                                           or the maximum number of characters. *)
                                        fun findEnd lastBreak i =
                                            if i >= textLength then (textLength, textLength)
                                            else if i-p > nCols
                                            then
                                                (
                                                case lastBreak of
                                                    NONE => (* No breaks on the line - break just before here. *)
                                                        (i-1, i-1)
                                                |    SOME b => b (* Break at the last break. *)
                                                )
                                            else if i < textLength - 1 andalso
                                                    String.sub(printWhat, i) = #"\r" andalso
                                                    String.sub(printWhat, i+1) = #"\n"
                                            then (* End of line - stop here. *)
                                                (i, i+2)
                                            else if Char.isSpace(String.sub(printWhat, i))
                                            then (* Remember this. *)
                                                findEnd (SOME(i, i+1)) (i+1)
                                                (* Actually tabs need to be handled more carefully. *)
                                            else findEnd lastBreak (i+1)

                                        val (endLine, nextLine) = findEnd NONE p
                                        val thisLine =
                                            if p >= textLength
                                            then ""
                                            else String.substring(printWhat, p, endLine-p)
                                    in
                                        if printThisPage
                                        then
                                            (
                                            TabbedTextOut(hdc, {x=0, y= lineNo * #height textMetric},
                                                thisLine, [], 0);
                                            ()
                                            )
                                        else ();
                                        outputLines (lineNo+1) nextLine
                                    end
                                val nextPage =
                                    if printThisPage
                                    then
                                        let
                                            val _ = StartPage hdc;
                                            (* Fill the page with white. *)
                                            val _ = SetBkColor(hdc, white);
                                            val _ = SetTextColor(hdc, black);
                                            val _ = ExtTextOut(hdc, {x=0, y=0}, [ETO_OPAQUE], SOME pageRect, "", []);
                                            (* Print the text. *)
                                            val next = outputLines 0 index
                                        in
                                            EndPage hdc;
                                            next
                                        end
                                    else (* Format the page but don't print it. *) outputLines 0 index
                            in
                                if nextPage >= size printWhat
                                then ()
                                else printPage (pno+1) nextPage
                            end

                            val _: unit = printPage 1 0
                        in
                            EndDoc hdc;
                            (* Restore the original font and delete the new one. *)
                            SelectObject(hdc, oldFont);
                            DeleteObject(hFont);
                            DeleteDC hdc; (* Now delete the device context. *)
                            (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames,
                                          fileName=fileName})
                        end
                            (* If any of the functions failed simply delete the device
                               context and return the original state. *)
                            handle (exn as OS.SysErr _) => (
                                print (exnName exn); AbortDoc hdc; DeleteDC hdc; (LRESINT 0, state)))
                    |    _ => (LRESINT 0, state)
                end

                else if wId = menuAbout
                then (aboutmlEdit hw; (LRESINT 0, state))

                else (DefWindowProc(hw, msg), state)

        |  FINDMSGSTRING{flags, findWhat, ...} =>
            if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_DIALOGTERM)
            then (* The "find" box is going away. *)
                (
                    SetFocus(SOME edit);
                    (LRESINT 0, state)
                )
            else if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_FINDNEXT)
            then (* The Find Next button has been pressed. *)
            let
                (* Get the whole of the text - not very efficient. *)
                val text = GetWindowText edit
                val startPos = ref 0 and endPos = ref 0
                (* Get the starting position. *)
                val _ = SendMessage(edit, EM_GETSEL{startPos=startPos, endPos=endPos})

                val isDown = FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_DOWN)
                (* Get the starting position for the search. *)
                val startPos = if isDown then !endPos else !startPos - 1

                val findLen = size findWhat
                (* Get the options. *)
                local
                    val toLower = String.map Char.toLower
                in
                    val doMatch: string * string -> bool =
                        if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_MATCHCASE)
                        then op =
                        else fn (s1, s2) => toLower s1 = toLower s2
                end

                fun doFind p =
                let
                    val isMatch =
                        p >= 0 andalso size text - p >= size findWhat andalso
                            doMatch(String.substring(text, p, findLen), findWhat)
                in
                    if isMatch then p
                    else if isDown
                    then if p = size text then p (* Finish *) else doFind(p+1)
                    else (* Find up *) if p = 0 then ~1 (* Finish *) else doFind(p-1)
                end
                val foundAt = doFind startPos
            in
                if foundAt >= 0 andalso foundAt + findLen < size text
                then
                    (
                    SendMessage(edit, EM_SETSEL{startPos=foundAt, endPos=foundAt + findLen});
                    SendMessage(edit, EM_SCROLLCARET);
                    ()
                    )
                else MessageBeep(MessageBoxStyle.fromWord 0wxFFFFFFFF);
                (LRESINT 0, state)
            end
            else (DefWindowProc(hw, msg), state)

        |    _ => (DefWindowProc(hw, msg), state)

    (* If this document has been modified we want to ask before quitting or
       opening a new document. *)
    and checkForSave(hw, edit, fileName) =
        case SendMessage(edit, EM_GETMODIFY) of
            LRESINT 0 => true (* Unmodified - continue. *)
        |    _ => 
            let
                val res =
                    MessageBox(SOME hw, "Save document?", "Confirm",
                               MessageBoxStyle.MB_YESNOCANCEL)
            in
                if res = IDYES
                then if fileName = ""
                then saveAsDocument(hw, edit) <> NONE
                else saveDocument(hw, fileName, edit)
                else if res = IDNO
                then true (* Continue anyway. *)
                else false (* Cancel - don't exit or open. *)
            end

    and saveDocument(hw, fileName, edit) =
    (* Write the document to the given file name. *)
        let
            (* Write the file as binary.  That way we don't need to
               convert CRNL to NL before writing. *)
            val f = BinIO.openOut fileName
            val s = GetWindowText edit
        in
            BinIO.output(f, Byte.stringToBytes s);
            BinIO.closeOut f;
            (* Document is now unmodified. *)
            SendMessage(edit, EM_SETMODIFY{modified=false});
            true (* Succeeded. *)
        end handle exn =>
            (MessageBox(SOME hw,
                concat["Unable to save to - ", fileName, "\n"(*, exnMessage exn*)],
                "Open failure", MessageBoxStyle.MB_OK);
             false)

    and saveAsDocument(hw, edit) =
    (* Ask for the file name before trying to save. *)
        let
            val on = {
                owner = SOME hw,
                template = TemplateDefault,
                filter =
                    [("Text Files (*.txt)", "*.txt"),
                     ("ML Files (*.sml)", "*.sml"),
                     ("All Files (*.*)", "*.*")],
                customFilter = NONE,
                filterIndex = 1,
                file = "",
                maxFile = 1000,
                fileTitle = "",
                initialDir = NONE,
                title = NONE,
                flags = OpenFileFlags.flags[],
                defExt = NONE
            }
        in
            case GetSaveFileName on of
                NONE => NONE
            |    SOME {file, filterIndex, fileTitle, ...} =>
                let
                    (* If the user typed a file name without an extension use
                       the extension from the appropriate filter. *)
                    val suffix =
                        case filterIndex of
                            1 => ".txt"
                        |    2 => ".sml"
                        |    _ => ""
                    val fileName =
                        if Char.contains fileTitle #"."
                        then file else file ^ suffix
                in
                    if saveDocument(hw, fileName, edit)
                    then SOME file (* Return the selected name. *)
                    else NONE
                end
        end

    and aboutmlEdit hw =
    (* Called when the user selects "About..." from the help menu. *)
    let
        (* Dialogue template containing three items: an OK button, a static picture and
           a piece of text. *)
        val pictureId = 1000 (* Could use any number here. *)
        open Static.Style
        val template =
            {x = 0, y = 0, cx = 210, cy = 94, font = SOME (8, "MS Sans Serif"), menu = NONE,
             class = NONE,title = "About mlEdit", extendedStyle = 0,
             style = flags[WS_POPUP, WS_CAPTION],
             items =
              [{x = 73, y = 62, cx = 50, cy = 14, id = 1,
                class = DLG_BUTTON (flags[WS_CHILD, WS_VISIBLE, WS_TABSTOP]),
                title = DLG_TITLESTRING "OK", creationData = NONE, extendedStyle = 0},
               {x = 7, y = 7, cx = 32, cy = 32, id = pictureId,
                class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, SS_ICON]),
                title = DLG_TITLESTRING "", creationData = NONE, extendedStyle = 0},
               {x = 15, y = 39, cx = 180, cy = 21, id = 65535,
                class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, WS_GROUP]),
                title =
                    DLG_TITLESTRING
                       "mlEdit - An example of Windows programming in Poly/ML\
                       \\nCopyright David C.J. Matthews 2001-7",
                creationData = NONE,  extendedStyle = 0}] }

        (* Dialogue procedure. *)
        fun dlgProc(dial, WM_INITDIALOG _, ()) =
            (
                (* Send a message to the picture control to set it to this icon. *)
                SendMessage(GetDlgItem(dial, pictureId), STM_SETICON{icon=polyIcon});
                (LRESINT 1, ())
            )

        |    dlgProc(dial, WM_COMMAND{notifyCode = 0, wId=1 (* OK button *), ...}, ()) =
                (* When the OK button is pressed we end the dialogue. *)
                (EndDialog(dial, 1); (LRESINT 1, ()) )

        |    dlgProc _ = (LRESINT 0, ())

    in
        DialogBoxIndirect(app, template, hw, dlgProc, ());
        ()
    end

    val className = "mlEditWindowClass"
    (* Register a class for the top-level window.  Use the Poly icon from the application. *)
    val myWindowClass = RegisterClassEx{style = Class.Style.flags[],
        wndProc = wndProc, hInstance = app,
        hIcon = SOME polyIcon, hCursor = NONE, hbrBackGround = NONE, menuName = NONE,
        className = className, hIconSm = NONE};
    
    
    val w = CreateWindow{class = myWindowClass, name = "mlEdit", style = Window.Style.WS_OVERLAPPEDWINDOW,
        x  = CW_USEDEFAULT, y = CW_USEDEFAULT, height = CW_USEDEFAULT, width = CW_USEDEFAULT,
        relation = PopupWindow menu,
        instance = app, init = NONE};
in
    ShowWindow(w, SW_SHOW);
    SetForegroundWindow w;
    
    RunApplication();
    (* Must unregister the class before returning otherwise RegisterClass will
       fail if we call mlEdit again. *)
    UnregisterClass(className, app)
end;
         
polyml-5.6/documentation/Winref/000077500000000000000000000000001265146633400170155ustar00rootroot00000000000000polyml-5.6/documentation/Winref/Bitmap.html000066400000000000000000000121711265146633400211210ustar00rootroot00000000000000 Windows Interface Reference: Bitmap structure

Bitmap

The Bitmap structure contains functions and structures to create and operate on bitmaps.  Bitmaps are rectangular pictures in which the colour values for each pixel are given individually.  They are often used as the basis for icons.  There are two forms of bitmap: device-dependent bitmaps represented by the bitmap handle, HBITMAP, and device-independent bitmaps.

structure Bitmap:
  sig
    type HBITMAP and HDC
    type COLORREF = Color.COLORREF
    type RECT = { top: int, left: int, bottom: int, right: int }
    type SIZE = { cx: int, cy: int }
    datatype BitmapCompression = BI_BITFIELDS | BI_RGB | BI_RLE4 | BI_RLE8
    datatype FloodFillMode = FLOODFILLBORDER | FLOODFILLSURFACE

    type BITMAP =
	{ width: int, height: int, widthBytes: int, planes: int, bitsPerPixel: int,
	  bits: Word8Vector.vector option }

    type StretchMode
    val BLACKONWHITE : StretchMode
    val COLORONCOLOR : StretchMode
    val HALFTONE : StretchMode
    val MAXSTRETCHBLTMODE : StretchMode
    val WHITEONBLACK : StretchMode

    type RasterOpCode
    val BLACKNESS : RasterOpCode
    val DSTINVERT : RasterOpCode
    val MERGECOPY : RasterOpCode
    val MERGEPAINT : RasterOpCode
    val NOTSRCCOPY : RasterOpCode
    val NOTSRCERASE : RasterOpCode
    val PATCOPY : RasterOpCode
    val PATINVERT : RasterOpCode
    val PATPAINT : RasterOpCode
    val SRCAND : RasterOpCode
    val SRCCOPY : RasterOpCode
    val SRCERASE : RasterOpCode
    val SRCINVERT : RasterOpCode
    val SRCPAINT : RasterOpCode
    val WHITENESS : RasterOpCode

    val BitBlt : HDC * int * int * int * int * HDC * int * int * RasterOpCode -> unit
    val CreateBitmap :
       {bits: Word8Vector.vector option, width: int, height: int,
         planes: int, bitsPerPixel: int} -> HBITMAP
    val CreateBitmapIndirect : BITMAP -> HBITMAP
    val CreateCompatibleBitmap : HDC * int * int -> HBITMAP
    val ExtFloodFill : HDC * int * int * COLORREF * FloodFillMode -> unit
    val GetBitmapBits : HBITMAP * int -> Word8Vector.vector
    val GetBitmapDimensionEx : HBITMAP -> SIZE
    val GetPixel : HDC * int * int -> COLORREF
    val GetStretchBltMode : HDC -> StretchMode

    type QuaternaryRop
    val MAKEROP4 : {back: RasterOpCode, fore: RasterOpCode} -> QuaternaryRop
    val MaskBlt :
       HDC * int * int * int * int * HDC * int * int *
       HBITMAP * int * int * QuaternaryRop -> unit

    val PlgBlt : HDC * RECT * HDC * RECT * HBITMAP * int * int -> unit
    val SetBitmapBits : HBITMAP * Word8Vector.vector -> unit
    val SetBitmapDimensionEx : HBITMAP * int * int * SIZE -> SIZE
    val SetPixel : HDC * int * int * COLORREF -> COLORREF
    val SetStretchBltMode : HDC * StretchMode -> unit
    val StretchBlt :
       HDC * int * int * int * int * HDC * int * int * int * int * RasterOpCode -> unit

    type BITMAPINFOHEADER =
	{
		width: int, height: int, planes: int, bitsPerPixel: int,
		compression: BitmapCompression, sizeImage: int, xPelsPerM: int, 
		yPelsPerM: int, clrUsed: int, clrImportant: int
	}
    val getBitmapInfoHdr: Word8Vector.vector -> BITMAPINFOHEADER
    val GetDIBits: HDC * HBITMAP * int * int * BITMAPINFOHEADER option -> Word8Vector.vector
    val SetDIBits: HDC * HBITMAP * int * int * Word8Vector.vector -> unit
  end

Device-independent bitmaps.

A device-independent bitmap contains information which allows it to be written to a file and read in on a different machine with different numbers of bits per pixel.  It can also be passed on the clipboard using the CH_DIB clipboard format. A device-independent bitmap is simply a vector of bytes and is represented in ML by the Word8Vector.vector type.

getBitmapInfoHdr(vec: Word8Vector.vector): BITMAPINFOHEADER
ML Extension: Extracts the header from a vector containing a device-independent bitmap.  It is often necessary to extract the header from a device-independent bitmap in order to find the size of the bitmap needed as the argument to SetDIBits.

GetDIBits(hdc, hb, startScan, scanLines, binfo: BITMAPINFOHEADER option): Word8Vector.vector
Extracts a bitmap as a device-independent bitmap.  This function operates in two modes according to whether the binfo argument is NONE or SOME.  If NONE is passed it returns only the header.  This can be extracted with getBitmapInfoHdr and if necessary a modified copy of it can be made.  For example, the bitsPerPixel can be changed from the default for the device.  It can then be passed with SOME again to GetDIBits to extract the full device-independent bitmap.

SetDIBits(hdc, hb, startScan, scanLines, vec: Word8Vector.vector): unit
Sets a bitmap to the device-independent bitmap in the argument vector.

polyml-5.6/documentation/Winref/Brush.html000066400000000000000000000035001265146633400207640ustar00rootroot00000000000000 Windows Interface Reference: Brush structure

Brush

The Brush structure contains functions and structures to create and operate on brushes.   Brushes are used to fill areas of the screen with single colours or patterns.

structure Brush:
  sig
    type HBITMAP and HBRUSH and HDC

    datatype
      HatchStyle =
          HS_BDIAGONAL
        | HS_CROSS
        | HS_DIAGCROSS
        | HS_FDIAGONAL
        | HS_HORIZONTAL
        | HS_VERTICAL

    datatype
      BrushStyle =
          BS_HATCHED of HatchStyle
        | BS_HOLLOW
        | BS_PATTERN of HBITMAP
        | BS_SOLID

    type COLORREF = Color.COLORREF

    type LOGBRUSH = BrushStyle * COLORREF
    type POINT = {x: int, y: int}
    type RasterOpCode = Bitmap.RasterOpCode

    datatype ColorType =
		COLOR_SCROLLBAR
	|	COLOR_BACKGROUND
	|	COLOR_ACTIVECAPTION
	|	COLOR_INACTIVECAPTION
	|	COLOR_MENU
	|	COLOR_WINDOW
	|	COLOR_WINDOWFRAME
	|	COLOR_MENUTEXT
	|	COLOR_WINDOWTEXT
	|	COLOR_CAPTIONTEXT
	|	COLOR_ACTIVEBORDER
	|	COLOR_INACTIVEBORDER
	|	COLOR_APPWORKSPACE
	|	COLOR_HIGHLIGHT
	|	COLOR_HIGHLIGHTTEXT
	|	COLOR_BTNFACE
	|	COLOR_BTNSHADOW
	|	COLOR_GRAYTEXT
	|	COLOR_BTNTEXT
	|	COLOR_INACTIVECAPTIONTEXT
	|	COLOR_BTNHIGHLIGHT
	|	COLOR_3DDKSHADOW
	|	COLOR_3DLIGHT
	|	COLOR_INFOTEXT
	|	COLOR_INFOBK

    val CreateBrushIndirect : LOGBRUSH -> HBRUSH
    val CreateHatchBrush : HatchStyle * COLORREF -> HBRUSH
    val CreatePatternBrush : HBITMAP -> HBRUSH
    val CreateSolidBrush : COLORREF -> HBRUSH
    val GetSysColorBrush : ColorType -> HBRUSH
    val GetBrushOrgEx : HDC -> POINT
    val PatBlt : HDC * int * int * int * int * RasterOpCode -> unit
    val SetBrushOrgEx : HDC * POINT -> POINT
  end
polyml-5.6/documentation/Winref/Button.html000066400000000000000000000051011265146633400211530ustar00rootroot00000000000000 Windows Interface Reference: Button structure

Button

The Button structure contains the styles, notifications and state values concerned with button controls.  Buttons are windows like any other and can be constructed using CreateWindow although more usually they form part of a dialogue box.  The values from the Notification substructure are sent as the code parameter in a WM_NOTIFY message.  Specialised button messages begin with BM_. The values in the State substructure may be sent or returned in messages such as BM_GETCHECK and BM_SETSTATE.

structure Button:
sig
    structure Style:
    sig
	include BIT_FLAGS where type flags = Window.Style.flags
	val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
	and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
	and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
	and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
	and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
	and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
	and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
	and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
        and BS_3STATE: flags and BS_AUTO3STATE: flags and BS_AUTOCHECKBOX: flags
	and BS_AUTORADIOBUTTON: flags and BS_BITMAP: flags and BS_BOTTOM: flags
        and BS_CENTER: flags and BS_CHECKBOX: flags and BS_DEFPUSHBUTTON: flags
        and BS_FLAT: flags and BS_GROUPBOX: flags and BS_ICON: flags and BS_LEFT: flags
        and BS_LEFTTEXT: flags and BS_MULTILINE: flags and BS_NOTIFY: flags
        and BS_OWNERDRAW: flags and BS_PUSHBUTTON: flags and BS_PUSHLIKE: flags
        and BS_RADIOBUTTON: flags and BS_RIGHT: flags and BS_RIGHTBUTTON: flags
        and BS_TEXT: flags and BS_TOP: flags and BS_USERBUTTON: flags and BS_VCENTER: flags
    end

    structure Notifications:
    sig
	val BN_CLICKED: int
	val BN_PAINT: int
	val BN_HILITE: int
	val BN_UNHILITE: int
	val BN_DISABLE: int
	val BN_DOUBLECLICKED: int
	val BN_PUSHED: int
	val BN_UNPUSHED: int
	val BN_DBLCLK: int
	val BN_SETFOCUS: int
	val BN_KILLFOCUS: int
    end

    structure State:
    sig
	val BST_UNCHECKED: int
	val BST_CHECKED: int
	val BST_INDETERMINATE: int
	val BST_PUSHED: int
	val BST_FOCUS: int
    end
end
polyml-5.6/documentation/Winref/Caret.html000066400000000000000000000020241265146633400207370ustar00rootroot00000000000000 Windows Interface Reference: Caret structure

Caret

The Caret structure contains functions to create and manipulate the caret.  The caret is typically used in edit controls to mark the point where new characters will be inserted.  Usually it is a vertical bar which blinks on and off.

structure Caret :
  sig
    type HWND and HBITMAP
    type POINT = { x: int, y: int }
    datatype
      caretShape =
          CaretBitmap of HBITMAP
        | CaretBlack of {width: int, height: int}
        | CaretGrey of {width: int, height: int}
    val CreateCaret : HWND * caretShape -> unit
    val DestroyCaret : unit -> unit
    val GetCaretBlinkTime : unit -> Time.time
    val GetCaretPos : unit -> POINT
    val HideCaret : HWND -> unit
    val SetCaretBlinkTime : Time.time -> unit
    val SetCaretPos : POINT -> unit
    val ShowCaret : HWND -> bool
  end
polyml-5.6/documentation/Winref/Class.html000066400000000000000000000040331265146633400207500ustar00rootroot00000000000000 Windows Interface Reference: Class structure

Class

The Class structure contains functions to register custom classes as well as the definitions for the standard Windows classes.

 

structure Class:
sig
    type HWND and Message and HINSTANCE and HBRUSH and HICON and HCURSOR and HGDIOBJ

    datatype LRESULT = LRESINT of int | LRESHANDLE of HGDIOBJ

    datatype 'a ATOM =
        Registered of {proc: HWND * Message * 'a -> LRESULT option * 'a, className: string}
      | SystemClass of string

    val Button : unit ATOM
    val ComboBox : unit ATOM
    val ComboLBox : unit ATOM
    val DDEMLEvent : unit ATOM
    val Edit : unit ATOM
    val ListBox : unit ATOM
    val MDIClient : unit ATOM
    val ScrollBar : unit ATOM
    val Static : unit ATOM

    structure Style :
      sig
	include BIT_FLAGS

        val CS_BYTEALIGNCLIENT : flags
        val CS_BYTEALIGNWINDOW : flags
        val CS_CLASSDC : flags
        val CS_DBLCLKS : flags
        val CS_GLOBALCLASS : flags
        val CS_HREDRAW : flags
        val CS_KEYCVTWINDOW : flags
        val CS_NOCLOSE : flags
        val CS_NOKEYCVT : flags
        val CS_OWNDC : flags
        val CS_PARENTDC : flags
        val CS_SAVEBITS : flags
        val CS_VREDRAW : flags
      end

    type 'a WNDCLASSEX =
        {style: Style.flags, 
         wndProc: HWND * Message * 'a -> LRESULT option * 'a,
         hInstance: HINSTANCE,
         hIcon: HICON option,
         hCursor: HCURSOR option,
         hbrBackGround: HBRUSH option,
         menuName: Resource.RESID option,
         className: string,
         hIconSm: HICON option}

    val RegisterClassEx : 'a WNDCLASSEX -> 'a ATOM

    val UnregisterClass : string * HINSTANCE -> unit
    val GetClassName : HWND -> string
    val GetClassInfoEx: HINSTANCE * string -> 'a WNDCLASSEX
  end
polyml-5.6/documentation/Winref/Clipboard.html000066400000000000000000000065561265146633400216160ustar00rootroot00000000000000 Windows Interface Reference: Clipboard structure

Clipboard

The clipboard is used as a way of copying data within an application or between applications.

structure Clipboard :
  sig
    datatype ClipboardFormat =
        CF_NONE | CF_TEXT | CF_BITMAP | CF_METAFILEPICT | CF_SYLK | CF_DIF | CF_TIFF |
        CF_OEMTEXT | CF_DIB | CF_PALETTE | CF_PENDATA | CF_RIFF | CF_WAVE | CF_UNICODETEXT |
        CF_ENHMETAFILE | CF_OWNERDISPLAY | CF_DSPTEXT | CF_DSPBITMAP | CF_DSPMETAFILEPICT |
        CF_DSPENHMETAFILE | CF_PRIVATE of int | CF_GDIOBJ of int | CF_REGISTERED of int |
        CF_HDROP | CF_LOCALE

    type HBITMAP and HPALETTE and HWND and HDROP

    datatype CLIPHANDLE =
        CH_NONE |
        CH_TEXT of string |
        CH_BITMAP of HBITMAP |
        CH_METAFILEPICT of Metafile.METAFILEPICT |
        CH_SYLK of Word8Vector.vector |
        CH_DIF of Word8Vector.vector |
        CH_TIFF of Word8Vector.vector |
        CH_OEMTEXT of string |
        CH_DIB of Word8Vector.vector |
        CH_PALETTE of HPALETTE |
        CH_PENDATA of Word8Vector.vector |
        CH_RIFF of Word8Vector.vector |
        CH_WAVE of Word8Vector.vector |
        CH_UNICODETEXT of Word8Vector.vector |
        CH_ENHMETAFILE of Metafile.HENHMETAFILE |
        CH_OWNERDISPLAY of Word8Vector.vector |
        CH_DSPTEXT of Word8Vector.vector |
        CH_DSPBITMAP of Word8Vector.vector |
        CH_DSPMETAFILEPICT of Word8Vector.vector |
        CH_DSPENHMETAFILE of Word8Vector.vector |
        CH_PRIVATE of int * Word8Vector.vector |
        CH_GDIOBJ of int * Word8Vector.vector |
        CH_REGISTERED of int * Word8Vector.vector |
        CH_HDROP of HDROP |
        CH_LOCALE of Word8Vector.vector

    val ChangeClipboardChain : HWND * HWND -> bool
    val CloseClipboard : unit -> unit
    val CountClipboardFormats : unit -> int
    val EmptyClipboard : unit -> unit
    val EnumClipboardFormats : ClipboardFormat -> ClipboardFormat
    val GetClipboardData : ClipboardFormat -> CLIPHANDLE
    val GetClipboardFormatName : ClipboardFormat -> string
    val GetClipboardOwner : unit -> HWND
    val GetClipboardViewer : unit -> HWND
    val GetOpenClipboardWindow : unit -> HWND
    val GetPriorityClipboardFormat : ClipboardFormat list -> ClipboardFormat option
    val IsClipboardFormatAvailable : ClipboardFormat -> bool
    val OpenClipboard : HWND option -> unit
    val RegisterClipboardFormat : string -> ClipboardFormat
    val SetClipboardData : CLIPHANDLE -> unit
    val SetClipboardViewer : HWND -> HWND
  end

datatype ClipboardFormat
represents the various kinds of information which can be stored on the clipboard.  As well as the formats defined in Windows the ML interface defines four extra formats.   CF_NONE is used when no format is specified.  CF_PRIVATE, CF_GDIOBJ and CF_REGISTERED are used for clipboard formats in the private range, GDI object range and registered format range. 

datatype CLIPHANDLE
is used when extracting information from the clipboard or setting the clipboard contents.

 

polyml-5.6/documentation/Winref/Clipping.html000066400000000000000000000022301265146633400214450ustar00rootroot00000000000000 Windows Interface Reference: Clipping structure

Clipping

The Clipping structure contains functions and structures to create and manipulate clipping regions.

structure Clipping :
  sig
    type HDC and HRGN
    type RECT = { top: int, left: int, bottom: int, right: int }
    type RegionOperation = Region.RegionOperation
    type ResultRegion = Region.ResultRegion

    val ExcludeClipRect : HDC * RECT -> ResultRegion
    val ExtSelectClipRgn : HDC * HRGN * RegionOperation -> ResultRegion
    val GetClipBox : HDC -> ResultRegion * RECT
    val GetClipRgn : HDC * HRGN -> unit
    val GetMetaRgn : HDC * HRGN -> unit
    val IntersectClipRect : HDC * RECT -> ResultRegion
    val OffsetClipRgn : HDC * int * int -> ResultRegion
    val PtVisible : HDC * int * int * bool -> bool
    val RectVisible : HDC * RECT -> bool
    val SelectClipPath : HDC * RegionOperation -> unit
    val SelectClipRgn : HDC * HRGN -> unit
    val SetMetaRgn : HDC -> unit
  end
polyml-5.6/documentation/Winref/Color.html000066400000000000000000000033761265146633400207720ustar00rootroot00000000000000 Windows Interface Reference: Color structure

Color

The Color structure contains functions to manipulate colours and palettes.

structure Color:
  sig
    type HPALETTE and HDC

    datatype
      PaletteEntryFlag = PC_EXPLICIT | PC_NOCOLLAPSE | PC_NULL | PC_RESERVED
    type PALETTEENTRY = {red: int, green: int, blue: int, flags: PaletteEntryFlag}

    type COLORREF
    val toRGB :
       COLORREF -> {red: Int.int, blue: Int.int, green: Int.int}
    val RGB : {red: int, blue: int, green: int} -> COLORREF
    val PALETTERGB : {red: int, blue: int, green: int} -> COLORREF

    type SystemPaletteUse
    val SYSPAL_ERROR : SystemPaletteUse
    val SYSPAL_NOSTATIC : SystemPaletteUse
    val SYSPAL_STATIC : SystemPaletteUse

    val AnimatePalette : HPALETTE * int * PALETTEENTRY list -> bool
    val CreateHalftonePalette : HDC -> HPALETTE
    val CreatePalette : PALETTEENTRY list -> HPALETTE
    val GetNearestColor : HDC * COLORREF -> COLORREF
    val GetNearestPaletteIndex : HPALETTE * COLORREF -> int
    val GetPaletteEntries : HPALETTE * int * int -> PALETTEENTRY list
    val GetSystemPaletteEntries : HPALETTE * int * int -> PALETTEENTRY list
    val GetSystemPaletteUse : HDC -> SystemPaletteUse
    val RealizePalette : HDC -> int
    val ResizePalette : HPALETTE * int -> unit
    val SelectPalette : HDC * HPALETTE * bool -> HPALETTE
    val SetPaletteEntries : HPALETTE * int * PALETTEENTRY list -> unit
    val SetSystemPaletteUse : HDC * SystemPaletteUse -> SystemPaletteUse
    val UnrealizeObject : HPALETTE -> unit
    val UpdateColors : HDC -> unit
  end
polyml-5.6/documentation/Winref/Combobox.html000066400000000000000000000045441265146633400214620ustar00rootroot00000000000000 Windows Interface Reference: Combobox structure

Combobox

The Combobox structure contains the styles and options used in messages sent to a combobox.  A combobox is a combination of a list box together with an edit control.   Most control of a combobox is by means of messages.  Specialised combobox messages begin with CB_. The values from the Notification substructure are sent as the code parameter in a WM_NOTIFY message. 

structure Combobox:
sig
    structure Style:
    sig
        include BIT_FLAGS where type flags = Window.Style.flags
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW: flags and WS_CHILDWINDOW: flags
        and CBS_SIMPLE: flags and CBS_DROPDOWN: flags and CBS_DROPDOWNLIST: flags
        and CBS_OWNERDRAWFIXED: flags and CBS_OWNERDRAWVARIABLE: flags and CBS_AUTOHSCROLL: flags
        and CBS_OEMCONVERT: flags and CBS_SORT: flags and CBS_HASSTRINGS: flags
        and CBS_NOINTEGRALHEIGHT: flags and CBS_DISABLENOSCROLL: flags
        and CBS_UPPERCASE: flags and CBS_LOWERCASE: flags
    end

    structure Notifications:
    sig
        val CBN_SELCHANGE: int
        val CBN_DBLCLK: int
        val CBN_SETFOCUS: int
        val CBN_KILLFOCUS: int
        val CBN_EDITCHANGE: int
        val CBN_EDITUPDATE: int
        val CBN_DROPDOWN: int
        val CBN_CLOSEUP: int
        val CBN_SELENDOK: int
        val CBN_SELENDCANCEL: int
    end

    datatype CBDirAttr =
        DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_DIRECTORY |
        DDL_ARCHIVE | DDL_POSTMSGS | DDL_DRIVES | DDL_EXCLUSIVE
end
polyml-5.6/documentation/Winref/CommonDialog.html000066400000000000000000000222031265146633400222520ustar00rootroot00000000000000 Windows Interface Reference: CommonDialog structure

CommonDialog

The CommonDialog structure contains functions and structures to create common forms of dialogue boxes.

structure CommonDialog :
  sig
    type HWND and HDC and COLORREF = Color.COLORREF and HINSTANCE
    type POINT = { x: int, y: int }
    type RECT =  { left: int, top: int, right: int, bottom: int }

     (* Error codes *)
    datatype CDERR =
             DIALOGFAILURE
        |    GENERALCODES
        |    STRUCTSIZE
        |    INITIALIZATION
        |    NOTEMPLATE
        |    NOHINSTANCE
        |    LOADSTRFAILURE
        |    FINDRESFAILURE
        |    LOADRESFAILURE
        |    LOCKRESFAILURE
        |    MEMALLOCFAILURE
        |    MEMLOCKFAILURE
        |    NOHOOK
        |    REGISTERMSGFAIL

        |    PRINTERCODES
        |    SETUPFAILURE
        |    PARSEFAILURE
        |    RETDEFFAILURE
        |    LOADDRVFAILURE
        |    GETDEVMODEFAIL
        |    INITFAILURE
        |    NODEVICES
        |    NODEFAULTPRN
        |    DNDMMISMATCH
        |    CREATEICFAILURE
        |    PRINTERNOTFOUND
        |    DEFAULTDIFFERENT

        |    CHOOSEFONTCODES
        |    NOFONTS
        |    MAXLESSTHANMIN

        |    FILENAMECODES
        |    SUBCLASSFAILURE
        |    INVALIDFILENAME
        |    BUFFERTOOSMALL

        |    FINDREPLACECODES
        |    BUFFERLENGTHZERO

        |    CHOOSECOLORCODES

    val CommDlgExtendedError : unit -> CDERR

    (* ChooseColor *)

    structure ChooseColorFlags :
      sig
        include BIT_FLAGS
        val CC_ANYCOLOR : flags
        val CC_FULLOPEN : flags
        val CC_PREVENTFULLOPEN : flags
        val CC_RGBINIT : flags
        val CC_SHOWHELP : flags
        val CC_SOLIDCOLOR : flags
      end

    type CHOOSECOLOR =
    {
        owner: HWND option,
        result: COLORREF,
        customColors: COLORREF list,
        flags: ChooseColorFlags.flags
    }

    val ChooseColor : CHOOSECOLOR -> CHOOSECOLOR option


    (* ChooseFont *)

    structure ChooseFontFlags :
      sig
        include BIT_FLAGS
        val CF_ANSIONLY : flags
        val CF_APPLY : flags
        val CF_BOTH : flags
        val CF_EFFECTS : flags
        val CF_FIXEDPITCHONLY : flags
        val CF_FORCEFONTEXIST : flags
        val CF_NOFACESEL : flags
        val CF_NOOEMFONTS : flags
        val CF_NOSCRIPTSEL : flags
        val CF_NOSIMULATIONS : flags
        val CF_NOSIZESEL : flags
        val CF_NOSTYLESEL : flags
        val CF_NOVECTORFONTS : flags
        val CF_NOVERTFONTS : flags
        val CF_PRINTERFONTS : flags
        val CF_SCALABLEONLY : flags
        val CF_SCREENFONTS : flags
        val CF_SCRIPTSONLY : flags
        val CF_SELECTSCRIPT : flags
        val CF_SHOWHELP : flags
        val CF_TTONLY : flags
        val CF_WYSIWYG : flags
      end

    structure ChooseFontTypes :
      sig
        include BIT_FLAGS
        val BOLD_FONTTYPE : flags
        val ITALIC_FONTTYPE : flags
        val PRINTER_FONTTYPE : flags
        val REGULAR_FONTTYPE : flags
        val SCREEN_FONTTYPE : flags
        val SIMULATED_FONTTYPE : flags
      end

    type CHOOSEFONT =
    {
        owner: HWND option,
        context: HDC option,
        logFont: Font.LOGFONT option,
        pointSize: int,
        flags: ChooseFontFlags.flags,
        colors: COLORREF,
        style: string option,
        fontType: ChooseFontTypes.flags,
        size: {min: int, max: int} option
    }

    val ChooseFont : CHOOSEFONT -> CHOOSEFONT option

    (* FindText and ReplaceText *)
    structure FindReplaceFlags :
      sig
        include BIT_FLAGS
        val FR_DIALOGTERM : flags
        val FR_DOWN : flags
        val FR_FINDNEXT : flags
        val FR_HIDEMATCHCASE : flags
        val FR_HIDEUPDOWN : flags
        val FR_HIDEWHOLEWORD : flags
        val FR_MATCHCASE : flags
        val FR_NOMATCHCASE : flags
        val FR_NOUPDOWN : flags
        val FR_NOWHOLEWORD : flags
        val FR_REPLACE : flags
        val FR_REPLACEALL : flags
        val FR_SHOWHELP : flags
        val FR_WHOLEWORD : flags
      end

    datatype
      TemplateType =
          TemplateDefault
        | TemplateHandle of Dialog.DLGTEMPLATE
        | TemplateResource of HINSTANCE * Resource.RESID

    type FINDREPLACE =
    {
        owner : HWND,
        template: TemplateType,
        flags: FindReplaceFlags.flags,
        findWhat: string,
        replaceWith: string,
        bufferSize: int
    }

    val FindText : FINDREPLACE -> HWND
    val ReplaceText : FINDREPLACE -> HWND

    (* GetOpenFileName and GetSaveFileName *)

    structure OpenFileFlags :
      sig
        include BIT_FLAGS
        val OFN_ALLOWMULTISELECT : flags
        val OFN_CREATEPROMPT : flags
        val OFN_EXPLORER : flags
        val OFN_EXTENSIONDIFFERENT : flags
        val OFN_FILEMUSTEXIST : flags
        val OFN_HIDEREADONLY : flags
        val OFN_LONGNAMES : flags
        val OFN_NOCHANGEDIR : flags
        val OFN_NODEREFERENCELINKS : flags
        val OFN_NOLONGNAMES : flags
        val OFN_NONETWORKBUTTON : flags
        val OFN_NOREADONLYRETURN : flags
        val OFN_NOTESTFILECREATE : flags
        val OFN_NOVALIDATE : flags
        val OFN_OVERWRITEPROMPT : flags
        val OFN_PATHMUSTEXIST : flags
        val OFN_READONLY : flags
        val OFN_SHAREAWARE : flags
        val OFN_SHOWHELP : flags
      end

    type OPENFILENAME =
    {
        owner: HWND option,
        template: TemplateType,
        filter: (string * string) list,
        customFilter: (string * string) option,
        filterIndex: int,
        file: string,    (* Initial value of file and returned result. *)
        maxFile: int,    (* Max size of expected file name. *)
        fileTitle : string,
        initialDir: string option,
        title: string option, (* Optional title - default is Save or Open. *)
        flags: OpenFileFlags.flags,
        defExt: string option
    }

    val GetFileTitle : string -> string
    val GetOpenFileName : OPENFILENAME -> OPENFILENAME option
    val GetSaveFileName : OPENFILENAME -> OPENFILENAME option

    (* PageSetupDlg *)
    structure PageSetupFlags :
      sig
        include BIT_FLAGS
        val PSD_DEFAULTMINMARGINS : flags
        val PSD_DISABLEMARGINS : flags
        val PSD_DISABLEORIENTATION : flags
        val PSD_DISABLEPAGEPAINTING : flags
        val PSD_DISABLEPAPER : flags
        val PSD_DISABLEPRINTER : flags
        val PSD_INHUNDREDTHSOFMILLIMETERS : flags
        val PSD_INTHOUSANDTHSOFINCHES : flags
        val PSD_MARGINS : flags
        val PSD_MINMARGINS : flags
        val PSD_NONETWORKBUTTON : flags
        val PSD_NOWARNING : flags
        val PSD_RETURNDEFAULT : flags
        val PSD_SHOWHELP : flags
      end

    type PAGESETUPDLG =
    {
        owner: HWND option,
        devMode: DeviceContext.DEVMODE option,
        devNames: DeviceContext.DEVNAMES option,
        flags: PageSetupFlags.flags,
        paperSize: POINT,
        minMargin: RECT,
        margin: RECT
        (* For the moment we ignore the other options. *)
    }

    val PageSetupDlg : PAGESETUPDLG -> PAGESETUPDLG option

    (* PrintDlg *)
    structure PrintDlgFlags :
      sig
        include BIT_FLAGS
        val PD_ALLPAGES : flags
        val PD_COLLATE : flags
        val PD_DISABLEPRINTTOFILE : flags
        val PD_HIDEPRINTTOFILE : flags
        val PD_NONETWORKBUTTON : flags
        val PD_NOPAGENUMS : flags
        val PD_NOSELECTION : flags
        val PD_NOWARNING : flags
        val PD_PAGENUMS : flags
        val PD_PRINTSETUP : flags
        val PD_PRINTTOFILE : flags
        val PD_RETURNDC : flags
        val PD_RETURNDEFAULT : flags
        val PD_RETURNIC : flags
        val PD_SELECTION : flags
        val PD_SHOWHELP : flags
        val PD_USEDEVMODECOPIES : flags
        val PD_USEDEVMODECOPIESANDCOLLATE : flags
     end

    type PRINTDLG =
    {
        owner: HWND option,
        devMode: DeviceContext.DEVMODE option,
        devNames: DeviceContext.DEVNAMES option,
        context: HDC option,
        flags: PrintDlgFlags.flags,
        fromPage: int,
        toPage: int,
        minPage: int,
        maxPage: int,
        copies: int
        (* For the moment we ignore the other options. *)
    }

    val PrintDlg : PRINTDLG -> PRINTDLG option
  end

Generally these functions create modal dialogue boxes.  They take a configuration structure as an argument and return an option type.  NONE is returned if the user presses Cancel.  If the user presses OK the result is SOME with a modified structure containing the user's input. 

FindText(findReplace): HWND
ReplaceText(findReplace): HWND
These create modeless dialogues and return a handle to the window for the dialogue.   They send FINDMSGSTRING messages to the parent window to indicate various changes of state.

polyml-5.6/documentation/Winref/Cursor.html000066400000000000000000000026611265146633400211650ustar00rootroot00000000000000 Windows Interface Reference: Cursor structure

Cursor

The Cursor structure contains functions and structures to create and operate on cursors.

structure Cursor:
  sig
    type HCURSOR and HINSTANCE
    type POINT = { x : int, y: int }
    type RECT =  { left: int, top: int, right: int, bottom: int }
    val hcursorNull : HCURSOR
    val isHcursorNull : HCURSOR -> bool

    datatype
      CursorId =
          OCR_APPSTARTING
        | OCR_CROSS
        | OCR_IBEAM
        | OCR_NO
        | OCR_NORMAL
        | OCR_SIZEALL
        | OCR_SIZENESW
        | OCR_SIZENS
        | OCR_SIZENWSE
        | OCR_SIZEWE
        | OCR_UP
        | OCR_WAIT

    val ClipCursor : RECT -> unit
    val CopyCursor : HCURSOR -> HCURSOR
    val DestroyCursor : HCURSOR -> unit
    val GetClipCursor : unit -> RECT
    val GetCursor : unit -> HCURSOR
    val GetCursorPos : unit -> POINT
    val LoadCursor : HINSTANCE * Resource.RESID -> HCURSOR
    val LoadCursorFromFile : string -> HCURSOR
    val LoadSystemCursor : CursorId -> HCURSOR
    val LoadSystemCursorFromFile : CursorId -> HCURSOR
    val SetCursor : HCURSOR -> HCURSOR
    val SetCursorPos : int * int -> unit
    val SetSytemCursor : HCURSOR * CursorId -> unit
    val ShowCursor : bool -> int
  end
polyml-5.6/documentation/Winref/DeviceContext.html000066400000000000000000000250331265146633400224520ustar00rootroot00000000000000 Windows Interface Reference: DeviceContext structure

DeviceContext

The DeviceContext structure contains functions and structures to create and operate on device contexts.

structure DeviceContext:
  sig
    type BITMAP and HDC and HGDIOBJ and HWND and HRGN
    type LOGBRUSH = Brush.LOGBRUSH
    type LOGFONT = Font.LOGFONT
    type LOGPEN = Pen.LOGPEN
    type POINT = {x: int, y: int}

    type StockObjectType
    val ANSI_FIXED_FONT : StockObjectType
    val ANSI_VAR_FONT : StockObjectType
    val BLACK_BRUSH : StockObjectType
    val BLACK_PEN : StockObjectType
    val CLR_INVALID : StockObjectType
    val DEFAULT_PALETTE : StockObjectType
    val DEVICE_DEFAULT_FONT : StockObjectType
    val DKGRAY_BRUSH : StockObjectType
    val GRAY_BRUSH : StockObjectType
    val HOLLOW_BRUSH : StockObjectType
    val LTGRAY_BRUSH : StockObjectType
    val NULL_BRUSH : StockObjectType
    val NULL_PEN : StockObjectType
    val OEM_FIXED_FONT : StockObjectType
    val SYSTEM_FIXED_FONT : StockObjectType
    val SYSTEM_FONT : StockObjectType
    val WHITE_BRUSH : StockObjectType
    val WHITE_PEN : StockObjectType

    val GetStockObject : StockObjectType -> HGDIOBJ

    eqtype DeviceItem
    val ASPECTX : DeviceItem
    val ASPECTXY : DeviceItem
    val ASPECTY : DeviceItem
    val BITSPIXEL : DeviceItem
    val CLIPCAPS : DeviceItem
    val COLORRES : DeviceItem
    val CURVECAPS : DeviceItem
    val DRIVERVERSION : DeviceItem
    val HORZRES : DeviceItem
    val HORZSIZE : DeviceItem
    val LINECAPS : DeviceItem
    val LOGPIXELSX : DeviceItem
    val LOGPIXELSY : DeviceItem
    val NUMBRUSHES : DeviceItem
    val NUMCOLORS : DeviceItem
    val NUMFONTS : DeviceItem
    val NUMMARKERS : DeviceItem
    val NUMPENS : DeviceItem
    val NUMRESERVED : DeviceItem
    val PDEVICESIZE : DeviceItem
    val PHYSICALHEIGHT : DeviceItem
    val PHYSICALOFFSETX : DeviceItem
    val PHYSICALOFFSETY : DeviceItem
    val PHYSICALWIDTH : DeviceItem
    val PLANES : DeviceItem
    val POLYGONALCAPS : DeviceItem
    val RASTERCAPS : DeviceItem
    val SCALINGFACTORX : DeviceItem
    val SCALINGFACTORY : DeviceItem
    val SIZEPALETTE : DeviceItem
    val TECHNOLOGY : DeviceItem
    val TEXTCAPS : DeviceItem
    val VERTRES : DeviceItem
    val VERTSIZE : DeviceItem

    val GetDeviceCaps : HDC * DeviceItem -> int

   (* Results of various calls to GetDeviceCaps. *)
    val CC_CHORD : int
    val CC_CIRCLES : int
    val CC_ELLIPSES : int
    val CC_INTERIORS : int
    val CC_NONE : int
    val CC_PIE : int
    val CC_ROUNDRECT : int
    val CC_STYLED : int
    val CC_WIDE : int
    val CC_WIDESTYLED : int

    val CP_NONE : int
    val CP_RECTANGLE : int
    val CP_REGION : int

    val DT_CHARSTREAM : int
    val DT_DISPFILE : int
    val DT_METAFILE : int
    val DT_PLOTTER : int
    val DT_RASCAMERA : int
    val DT_RASDISPLAY : int
    val DT_RASPRINTER : int

    val LC_INTERIORS : int
    val LC_MARKER : int
    val LC_NONE : int
    val LC_POLYLINE : int
    val LC_POLYMARKER : int
    val LC_STYLED : int
    val LC_WIDE : int
    val LC_WIDESTYLED : int

    val PC_INTERIORS : int
    val PC_NONE : int
    val PC_PATHS : int
    val PC_POLYGON : int
    val PC_POLYPOLYGON : int
    val PC_RECTANGLE : int
    val PC_SCANLINE : int
    val PC_STYLED : int
    val PC_TRAPEZOID : int
    val PC_WIDE : int
    val PC_WIDESTYLED : int
    val PC_WINDPOLYGON : int

    val RC_BANDING : int
    val RC_BIGFONT : int
    val RC_BITBLT : int
    val RC_BITMAP64 : int
    val RC_DEVBITS : int
    val RC_DIBTODEV : int
    val RC_DI_BITMAP : int
    val RC_FLOODFILL : int
    val RC_GDI20_OUTPUT : int
    val RC_GDI20_STATE : int
    val RC_OP_DX_OUTPUT : int
    val RC_PALETTE : int
    val RC_SAVEBITMAP : int
    val RC_SCALING : int
    val RC_STRETCHBLT : int
    val RC_STRETCHDIB : int

    val TC_CP_STROKE : int
    val TC_CR_90 : int
    val TC_CR_ANY : int
    val TC_EA_DOUBLE : int
    val TC_IA_ABLE : int
    val TC_OP_CHARACTER : int
    val TC_OP_STROKE : int
    val TC_RA_ABLE : int
    val TC_RESERVED : int
    val TC_SA_CONTIN : int
    val TC_SA_DOUBLE : int
    val TC_SA_INTEGER : int
    val TC_SCROLLBLT : int
    val TC_SF_X_YINDEP : int
    val TC_SO_ABLE : int
    val TC_UA_ABLE : int
    val TC_VA_ABLE : int

    datatype DMColor = DMCOLOR_COLOR | DMCOLOR_MONOCHROME
    and DMDither =
          DMDITHER_COARSE
        | DMDITHER_FINE
        | DMDITHER_GRAYSCALE
        | DMDITHER_LINEART
        | DMDITHER_NONE
        | DMDITHER_OTHER of int
    and DMDuplex = DMDUP_HORIZONTAL | DMDUP_SIMPLEX | DMDUP_VERTICAL
    and DMICMIntent =
          DMICMINTENT_OTHER of int
        | DMICM_COLORMETRIC
        | DMICM_CONTRAST
        | DMICM_SATURATE
    and DMICMMethod =
          DMICMMETHOD_DEVICE
        | DMICMMETHOD_DRIVER
        | DMICMMETHOD_NONE
        | DMICMMETHOD_OTHER of int
        | DMICMMETHOD_SYSTEM
    and DMMedia =
          DMICMMEDIA_OTHER of int
        | DMMEDIA_GLOSSY
        | DMMEDIA_STANDARD
        | DMMEDIA_TRANSPARENCY
    and DMOrientation = DMORIENT_LANDSCAPE | DMORIENT_PORTRAIT
    and DMPaperSize =
          DMPAPER_10X11
        | DMPAPER_10X14
        | DMPAPER_11X17
        | DMPAPER_15X11
        | DMPAPER_9X11
        | DMPAPER_A2
        | DMPAPER_A3
        | DMPAPER_A3_EXTRA
        | DMPAPER_A3_EXTRA_TRANSVERSE
        | DMPAPER_A3_TRANSVERSE
        | DMPAPER_A4
        | DMPAPER_A4SMALL
        | DMPAPER_A4_EXTRA
        | DMPAPER_A4_PLUS
        | DMPAPER_A4_TRANSVERSE
        | DMPAPER_A5
        | DMPAPER_A5_EXTRA
        | DMPAPER_A5_TRANSVERSE
        | DMPAPER_A_PLUS
        | DMPAPER_B4
        | DMPAPER_B5
        | DMPAPER_B5_EXTRA
        | DMPAPER_B5_TRANSVERSE
        | DMPAPER_B_PLUS
        | DMPAPER_CSHEET
        | DMPAPER_DSHEET
        | DMPAPER_ENV_10
        | DMPAPER_ENV_11
        | DMPAPER_ENV_12
        | DMPAPER_ENV_14
        | DMPAPER_ENV_9
        | DMPAPER_ENV_B4
        | DMPAPER_ENV_B5
        | DMPAPER_ENV_B6
        | DMPAPER_ENV_C3
        | DMPAPER_ENV_C4
        | DMPAPER_ENV_C5
        | DMPAPER_ENV_C6
        | DMPAPER_ENV_C65
        | DMPAPER_ENV_DL
        | DMPAPER_ENV_INVITE
        | DMPAPER_ENV_ITALY
        | DMPAPER_ENV_MONARCH
        | DMPAPER_ENV_PERSONAL
        | DMPAPER_ESHEET
        | DMPAPER_EXECUTIVE
        | DMPAPER_FANFOLD_LGL_GERMAN
        | DMPAPER_FANFOLD_STD_GERMAN
        | DMPAPER_FANFOLD_US
        | DMPAPER_FOLIO
        | DMPAPER_ISO_B4
        | DMPAPER_JAPANESE_POSTCARD
        | DMPAPER_LEDGER
        | DMPAPER_LEGAL
        | DMPAPER_LEGAL_EXTRA
        | DMPAPER_LETTER
        | DMPAPER_LETTERSMALL
        | DMPAPER_LETTER_EXTRA
        | DMPAPER_LETTER_EXTRA_TRANSVERSE
        | DMPAPER_LETTER_PLUS
        | DMPAPER_LETTER_TRANSVERSE
        | DMPAPER_NOTE
        | DMPAPER_OTHER of int
        | DMPAPER_QUARTO
        | DMPAPER_RESERVED_48
        | DMPAPER_RESERVED_49
        | DMPAPER_STATEMENT
        | DMPAPER_TABLOID
        | DMPAPER_TABLOID_EXTRA
    and DMResolution =
          DMRES_DPI of int
        | DMRES_DRAFT
        | DMRES_HIGH
        | DMRES_LOW
        | DMRES_MEDIUM
    and DMSource =
          DMBIN_AUTO
        | DMBIN_CASSETTE
        | DMBIN_ENVELOPE
        | DMBIN_ENVMANUAL
        | DMBIN_FORMSOURCE
        | DMBIN_LARGECAPACITY
        | DMBIN_LARGEFMT
        | DMBIN_LOWER
        | DMBIN_MANUAL
        | DMBIN_MIDDLE
        | DMBIN_ONLYONE
        | DMBIN_SMALLFMT
        | DMBIN_TRACTOR
        | DMBIN_UPPER
        | DMSOURCE_OTHER of int
    and DMTrueType =
          DMTT_BITMAP
        | DMTT_DOWNLOAD
        | DMTT_DOWNLOAD_OUTLINE
        | DMTT_SUBDEV

    type DEVMODE = {
        deviceName: string,
        driverVersion: int,
        orientation: DMOrientation option,
        paperSize: DMPaperSize option,
        paperLength: int option,
        paperWidth: int option,
        scale: int option,
        copies: int option,
        defaultSource: DMSource option,
        printQuality: DMResolution option,
        color: DMColor option,
        duplex: DMDuplex option,
        yResolution: int option,
        ttOption: DMTrueType option,
        collate: bool option,
        formName: string option,
        logPixels: int option,
        bitsPerPixel: int option,
        pelsWidth: int option,
        pelsHeight: int option,
        displayFlags: int option, (* Apparently no longer used. *)
        displayFrequency: int option,
        icmMethod: DMICMMethod option,
        icmIntent: DMICMIntent option,
        mediaType: DMMedia option,
        ditherType: DMDither option,
        iccManufacturer: int option,
        iccModel: int option,
        panningWidth: int option,
        panningHeight: int option,
        driverPrivate: Word8Vector.vector
        }

    val CancelDC : HDC -> unit
    val CreateCompatibleDC : HDC -> HDC
    val CreateDC : string option * string option * string option * DEVMODE option -> HDC

    val DeleteDC : HDC -> unit
    val DeleteObject : HGDIOBJ -> unit

    datatype
      EnumObject =
          OBJ_BITMAP
        | OBJ_BRUSH
        | OBJ_DC
        | OBJ_ENHMETADC
        | OBJ_ENHMETAFILE
        | OBJ_EXTPEN
        | OBJ_FONT
        | OBJ_MEMDC
        | OBJ_METADC
        | OBJ_METAFILE
        | OBJ_PAL
        | OBJ_PEN
        | OBJ_REGION
    val GetCurrentObject : HDC * EnumObject -> HGDIOBJ
    val GetDC : HWND -> HDC

    datatype
      DeviceContextFlag =
          DCX_CACHE
        | DCX_CLIPCHILDREN
        | DCX_CLIPSIBLINGS
        | DCX_EXCLUDERGN
        | DCX_EXCLUDEUPDATE
        | DCX_INTERSECTRGN
        | DCX_INTERSECTUPDATE
        | DCX_LOCKWINDOWUPDATE
        | DCX_NORECOMPUTE
        | DCX_NORESETATTRS
        | DCX_PARENTCLIP
        | DCX_VALIDATE
        | DCX_WINDOW

    val GetDCEx : HWND * HRGN * DeviceContextFlag list -> HDC
    val GetDCOrgEx : HDC -> POINT

    datatype
      GetObject =
          GO_Bitmap of BITMAP
        | GO_Brush of LOGBRUSH
        | GO_Font of LOGFONT
        | GO_Palette of int
        | GO_Pen of LOGPEN

    val GetObject : HGDIOBJ -> GetObject
    val GetObjectType : HGDIOBJ -> EnumObject
    val ReleaseDC : HWND * HDC -> bool
    val ResetDC : HDC * DEVMODE -> HDC
    val RestoreDC : HDC * int -> unit
    val SaveDC : HDC -> int
    val SelectObject : HDC * HGDIOBJ -> HGDIOBJ

    type DEVNAMES = {driver: string, device: string, output: string, default: bool}

  end
polyml-5.6/documentation/Winref/Dialog.html000066400000000000000000000126701265146633400211100ustar00rootroot00000000000000 Windows Interface Reference: Dialog structure

Dialog

The Dialog structure contains functions and structures to create and operate on dialogue boxes.

structure Dialog:
sig
    type HWND and HINSTANCE 
    datatype
      DLGCLASSES =
          DLG_CLASS of string * Window.Style.flags
        | DLG_BUTTON of Button.Style.flags
        | DLG_COMBOBOX of Combobox.Style.flags
        | DLG_EDIT of Edit.Style.flags
        | DLG_LISTBOX of Listbox.Style.flags
        | DLG_SCROLLBAR of Scrollbar.Style.flags
        | DLG_STATIC of Static.Style.flags

    datatype DLGTITLE = DLG_TITLERESOURCE of int | DLG_TITLESTRING of string
 
    structure Style:
    sig
        include BIT_FLAGS
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
        and DS_3DLOOK: flags and DS_ABSALIGN: flags and DS_CENTER: flags and DS_CENTERMOUSE: flags
        and DS_CONTEXTHELP: flags and DS_CONTROL: flags and DS_FIXEDSYS: flags
        and DS_LOCALEDIT: flags and DS_MODALFRAME: flags and DS_NOFAILCREATE: flags
        and DS_NOIDLEMSG: flags and DS_SETFONT: flags and DS_SETFOREGROUND: flags
        and DS_SYSMODAL: flags
    end

    type DLGITEMTEMPLATE =
        { extendedStyle: int,
          x: int,
          y: int,
          cx : int,
          cy: int,
          id: int,
          class: DLGCLASSES,
          title: DLGTITLE,
          creationData: Word8Vector.vector option
        }
    
    type DLGTEMPLATE =
        { style: Style.flags,
          extendedStyle: int,
          x : int,
          y: int,
          cx: int,
          cy: int,
          menu: Resource.RESID option,
          class: Resource.RESID option,
          title: string,
          font: (int * string) option,
          items: DLGITEMTEMPLATE list
        }

    
    val DialogBox :
        HINSTANCE * Resource.RESID * HWND *
        (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> int
    val DialogBoxIndirect: HINSTANCE * DLGTEMPLATE * HWND *
        (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> int
    val CreateDialog : HINSTANCE * Resource.RESID * HWND *
        (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> HWND
    val CreateDialogIndirect: HINSTANCE * DLGTEMPLATE * HWND *
        (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> HWND

    val GetDialogBaseUnits : unit -> {horizontal: int, vertical: int}
    
    val GetDlgCtrlID: HWND -> int
    and GetDlgItem: HWND * int -> HWND
    and GetDlgItemText: HWND * int -> string
    and IsDialogMessage: HWND * Message.MSG -> bool
    and EndDialog: HWND * int -> unit

    val compileTemplate : DLGTEMPLATE -> Word8Vector.vector
    val decompileTemplate : Word8Vector.vector -> DLGTEMPLATE

DialogBox(hInst, resId, parent, dlgProc, dlgInit)
DialogBoxIndirect(hInst, template, parent, dlgProc, dlgInit)
CreateDialog(hInst, resId, parent, dlgProc, dlgInit)
CreateDialogIndirect(hInst, template, parent, dlgProc, dlgInit)

These four functions all create dialogues.  They all take a dialogue procedure and an initial state for the dialogue.  A dialogue procedure has the form
dlgProc(dlg, msg, state) and returns a pair consisting of the result of processing the message (LRESINT 0 if the message is not processed) and a new state.  Each time the dialogue procedure is called it is passed the state returned by the previous call.
DialogBox and DialogBoxIndirect create modal dialogues and do not return until the dialogue procedure calls EndDialog, typically as a result of the user pressing an OK or Cancel button.  CreateDialog and CreateDialogIndirect create modeless dialogues.   The ML implementation automatically ensures that IsDialogMessage is called for modeless dialogues if RunApplication is used.

compileTemplate(template)
ML Extension:  Compiles an ML dialogue template into the format used by C.  This can be stored to resource file for later use.

decompileTemplate(vector)
ML Extension: Takes a C format dialogue template structure in memory and returns an ML template.  It can be used where a dialogue template has been loaded from a resource file using LoadResource.

 

polyml-5.6/documentation/Winref/DragDrop.html000066400000000000000000000017601265146633400214110ustar00rootroot00000000000000 Windows Interface Reference: DragDrop structure

DragDrop

The DragDrop structure provides functions to allow file names to be dragged and dropped onto a window. Calling DragAcceptFiles for a window allows it to accept dropped files.   It will then receive a WM_DROPFILES message containing a drop handle when one or more files are dropped on the window.  The file names are retrieved from the drop handle using DragQueryFile and the position within the window with DragQueryPoint.   To complete processing the message call DragFinish.

structure DragDrop:
  sig
    type HDROP
    type HWND (* = Window.HWND *)
    type POINT = { x: int, y: int }
    val DragAcceptFiles : HWND * bool -> unit
    val DragFinish : HDROP -> unit
    val DragQueryFile : HDROP -> string list
    val DragQueryPoint : HDROP -> POINT * bool
  end
polyml-5.6/documentation/Winref/Edit.html000066400000000000000000000042231265146633400205710ustar00rootroot00000000000000 Windows Interface Reference: Edit structure

Edit

The Edit structure contains styles and notifications for Edit windows.  Edit windows provide simple ways of entering and editing text.  Single line edit controls are frequently used in dialogue boxes to allow strings to be entered.  Multiple line edit windows can be used as simple text editors.  Specialised edit window messages begin with EM_.   The values from the Notification substructure are sent as the code parameter in a WM_NOTIFY message. 

structure Edit:
sig
    structure Style:
    sig
        include BIT_FLAGS where type flags = Window.Style.flags
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
        and ES_LEFT: flags and ES_CENTER:flags and ES_RIGHT:flags and ES_MULTILINE:flags
        and ES_UPPERCASE: flags and ES_LOWERCASE: flags and ES_PASSWORD: flags
        and ES_AUTOVSCROLL: flags and ES_AUTOHSCROLL: flags and ES_NOHIDESEL: flags
        and ES_OEMCONVERT: flags and ES_READONLY: flags and ES_WANTRETURN: flags and ES_NUMBER: flags
    end

    structure Notifications:
    sig
        val EN_SETFOCUS: int
        val EN_KILLFOCUS: int
        val EN_CHANGE: int
        val EN_UPDATE: int
        val EN_ERRSPACE: int
        val EN_MAXTEXT: int
        val EN_HSCROLL: int
        val EN_VSCROLL: int
    end
end
polyml-5.6/documentation/Winref/Font.html000066400000000000000000000132221265146633400206110ustar00rootroot00000000000000 Windows Interface Reference: Font structure

Fonts and Text

The Font structure contains functions and structures to manipulate fonts and draw text.

structure Font :
  sig
    type HDC and HFONT
    type COLORREF = Color.COLORREF
    type POINT = {x: int, y: int}
    and  SIZE = {cx: int, cy: int }
    and  RECT = { top: int, left: int, bottom: int, right: int }

    datatype FontFamily =
          FF_DECORATIVE
        | FF_DONTCARE
        | FF_MODERN
        | FF_ROMAN
        | FF_SCRIPT
        | FF_SWISS
    and FontPitch = DEFAULT_PITCH | FIXED_PITCH | VARIABLE_PITCH
    and OutputPrecision =
          OUT_CHARACTER_PRECIS
        | OUT_DEFAULT_PRECIS
        | OUT_DEVICE_PRECIS
        | OUT_OUTLINE_PRECIS
        | OUT_RASTER_PRECIS
        | OUT_SCREEN_OUTLINE_PRECIS
        | OUT_STRING_PRECIS
        | OUT_STROKE_PRECIS
        | OUT_TT_ONLY_PRECIS
        | OUT_TT_PRECIS
    and OutputQuality =
          DEFAULT_QUALITY
        | DRAFT_QUALITY
        | OTHER_QUALITY of int
        | PROOF_QUALITY
    and CharacterSet =
          ANSI_CHARSET
        | CHINESEBIG5_CHARSET
        | DEFAULT_CHARSET
        | HANGEUL_CHARSET
        | OEM_CHARSET
        | OTHER_CHARSET of int
        | SHIFTJIS_CHARSET
        | SYMBOL_CHARSET

    type FontWeight =  int
    val FW_BLACK : FontWeight
    val FW_BOLD : FontWeight
    val FW_DEMIBOLD : FontWeight
    val FW_DONTCARE : FontWeight
    val FW_EXTRABOLD : FontWeight
    val FW_EXTRALIGHT : FontWeight
    val FW_HEAVY : FontWeight
    val FW_LIGHT : FontWeight
    val FW_MEDIUM : FontWeight
    val FW_NORMAL : FontWeight
    val FW_REGULAR : FontWeight
    val FW_SEMIBOLD : FontWeight
    val FW_THIN : FontWeight
    val FW_ULTRABOLD : FontWeight
    val FW_ULTRALIGHT : FontWeight

    type ClippingPrecision
    val CLIP_CHARACTER_PRECIS : ClippingPrecision
    val CLIP_DEFAULT_PRECIS : ClippingPrecision
    val CLIP_EMBEDDED : ClippingPrecision
    val CLIP_LH_ANGLES : ClippingPrecision
    val CLIP_MASK : ClippingPrecision
    val CLIP_STROKE_PRECIS : ClippingPrecision
    val CLIP_TT_ALWAYS : ClippingPrecision

    type LOGFONT =
    {
        height : int,
        width : int,
        escapement : int,
        orientation : int,
        weight : FontWeight,
        italic : bool,
        underline : bool,
        strikeOut : bool,
        charSet : CharacterSet,
        outputPrecision: OutputPrecision,
        clipPrecision : ClippingPrecision,
        quality : OutputQuality,
        pitch: FontPitch,
        family: FontFamily,
        faceName : string
    }

    datatype DrawTextMode =
          DT_BOTTOM
        | DT_CALCRECT
        | DT_CENTER
        | DT_EXPANDTABS
        | DT_EXTERNALLEADING
        | DT_INTERNAL
        | DT_LEFT
        | DT_NOCLIP
        | DT_NOPREFIX
        | DT_RIGHT
        | DT_SINGLELINE
        | DT_TABSTOP of int
        | DT_TOP
        | DT_VCENTER
        | DT_WORDBREAK
    and TextAlign =
          TA_BASELINE
        | TA_BOTTOM
        | TA_CENTER
        | TA_LEFT
        | TA_NOUPDATECP
        | TA_RIGHT
        | TA_TOP
        | TA_UPDATECP
    and TextMetricPitch =
          TMPF_DEVICE
        | TMPF_FIXED_PITCH
        | TMPF_TRUETYPE
        | TMPF_VECTOR
    and ExtendedTextMode =
          ETO_CLIPPED
        | ETO_GLYPH_INDEX
        | ETO_IGNORELANGUAGE
        | ETO_OPAQUE
        | ETO_RTLREADING

    type TEXTMETRIC =
            { height: int, ascent: int, descent: int, internalLeading: int, externalLeading: int,
              aveCharWidth: int, maxCharWidth: int, weight: int, overhang: int,
              digitizedAspectX: int, digitizedAspectY: int, firstChar: char, lastChar: char,
              defaultChar: char, breakChar: char, italic: bool, underlined: bool, struckOut: bool,
              pitch: TextMetricPitch list, family: FontFamily, charSet : CharacterSet }

    val AddFontResource : string -> int
    val CreateFont : LOGFONT -> HFONT
    val CreateFontIndirect : LOGFONT -> HFONT
    val CreateScalableFontResource : int * string * string * string -> unit
    val DrawText : HDC * string * RECT * DrawTextMode list -> int
    val ExtTextOut : HDC * POINT * ExtendedTextMode list *
       RECT option * string * int list -> unit
    val GetAspectRatioFilterEx : HDC -> SIZE
    val GetCharABCWidths : HDC * char * char -> (int * int * int) list
    val GetCharABCWidthsFloat : HDC * char * char -> (real * real * real) list
    val GetCharWidth32 : HDC * char * char -> int list
    val GetTabbedTextExtent : HDC * string * int list -> SIZE
    val GetCharWidthFloat : HDC * int * int -> real list
    val GetTextAlign : HDC -> TextAlign list
    val GetTextCharacterExtra : HDC -> int
    val GetTextColor : HDC -> COLORREF
    val GetTextExtentExPoint : HDC * string * int option ->
       {fit: int option, size: SIZE, extents: int list}
    val GetTextExtentPoint32 : HDC * string -> SIZE
    val GetTextFace : HDC -> string
    val GetTextMetrics : HDC -> TEXTMETRIC
    val RemoveFontResource : string -> unit
    val SetMapperFlags : HDC * bool -> bool
    val SetTextAlign : HDC * TextAlign list -> TextAlign list
    val SetTextCharacterExtra : HDC * int -> int
    val SetTextColor : HDC * COLORREF -> COLORREF
    val SetTextJustification : HDC * int * int -> unit
    val TabbedTextOut: HDC * POINT * string * int list * int -> SIZE
    val TextOut : HDC * POINT * String.string -> unit
  end
polyml-5.6/documentation/Winref/Globals.html000066400000000000000000000042361265146633400212730ustar00rootroot00000000000000 Windows Interface Reference: Globals structure

Globals

The Globals structure contains various functions to operate on handles, functions to obtain handles to the Poly/ML application and window and a function to get error information.

structure Globals :
  sig
    type 'a HANDLE
    type HINSTANCE
    type HWND
    val hNull : 'a HANDLE
    val handleOfInt : int -> 'a HANDLE
    val intOfHandle : 'a HANDLE -> int
    val isHNull : 'a HANDLE -> bool

    val ApplicationInstance : unit -> HINSTANCE
    val GetLastError : unit -> OS.syserror
    val MainWindow : unit -> HWND
  end

type 'a HANDLE
hNull : 'a HANDLE
handleOfInt(i): 'a HANDLE
intOfHandle(h): int
isHNull(h): bool

ML Extension: All handles, such as HWND and HBITMAP, are instances of the 'a HANDLE type. Generally the Windows functions which can take NULL as a valid argument or return NULL as a valid result take option types.  Occasionally it may be necessary to pass NULL in other circumstances in which case hNull can be used in ML.  There are also a few occasions where a handle has to be cast to or from int.  handleOfInt and intOfHandle can be used for this.

ApplicationInstance(): HINSTANCE
ML Extension: Returns the application instance handle passed in to the WinMain function when Poly/ML was started.

MainWindow(): HWND
ML Extension: Returns the handle to the Poly/ML window.

GetLastError(): OS.syserror
Returns the error code for the last function call.  Generally when a function fails an exception is raised including the last error as part of the exception packet.

polyml-5.6/documentation/Winref/Icon.html000066400000000000000000000016611265146633400205770ustar00rootroot00000000000000 Windows Interface Reference: Icon structure

Icon

The Icon structure contains functions and structures to create and operate on icons.

structure Icon:
  sig
    type HICON and HINSTANCE and HDC
    val CopyIcon : HICON -> HICON
    val DestroyIcon : HICON -> unit
    val DrawIcon : HDC * int * int * HICON -> unit
    val ExtractIcon : HINSTANCE * string * int -> HICON
    val IDI_APPLICATION : Resource.RESID
    val IDI_ASTERISK : Resource.RESID
    val IDI_ERROR : Resource.RESID
    val IDI_EXCLAMATION : Resource.RESID
    val IDI_HAND : Resource.RESID
    val IDI_INFORMATION : Resource.RESID
    val IDI_QUESTION : Resource.RESID
    val IDI_WARNING : Resource.RESID
    val IDI_WINLOGO : Resource.RESID
    val LoadIcon : HINSTANCE * Resource.RESID -> HICON
  end
polyml-5.6/documentation/Winref/Keyboard.html000066400000000000000000000012121265146633400214370ustar00rootroot00000000000000 Windows Interface Reference: Keyboard structure

Keyboard

The Keyboard structure contains functions to select the window to receive keyboard input.

structure Keyboard:
  sig
    type HWND
    val EnableWindow : HWND * bool -> bool
    val GetActiveWindow : unit -> HWND option
    val GetFocus : unit -> HWND option
    val IsWindowEnabled : HWND -> bool
    val SetActiveWindow : HWND -> HWND
    val SetFocus : HWND option -> HWND option
  end
polyml-5.6/documentation/Winref/Line.html000066400000000000000000000024101265146633400205670ustar00rootroot00000000000000 Windows Interface Reference: Line structure

Line

The Line structure contains functions to draw lines.

structure Line :
  sig
    type HDC
	type RECT = { top: int, left: int, bottom: int, right: int }
	type POINT = { x: int, y: int }

    datatype PointType =
          PT_BEZIERTO
        | PT_BEZIERTOANDCLOSE
        | PT_LINETO
        | PT_LINETOANDCLOSE
        | PT_MOVETO

    eqtype ArcDirection
    val AD_CLOCKWISE : ArcDirection
    val AD_COUNTERCLOCKWISE : ArcDirection

    val AngleArc : HDC * int * int * int * real * real -> unit
    val Arc : HDC * RECT * int * int * int * int -> unit
    val ArcTo : HDC * RECT * int * int * int * int -> unit
    val GetArcDirection : HDC -> ArcDirection
    val LineTo : HDC * POINT -> bool
    val MoveToEx : HDC * POINT -> POINT
    val PolyBezier : HDC * POINT list -> unit
    val PolyBezierTo : HDC * POINT list -> unit
    val PolyDraw : HDC * (PointType * POINT) list -> unit
    val Polyline : HDC * POINT list -> unit
    val PolylineTo : HDC * POINT list -> unit
    val SetArcDirection : HDC * ArcDirection -> ArcDirection
  end
polyml-5.6/documentation/Winref/ListBox.html000066400000000000000000000034071265146633400212730ustar00rootroot00000000000000 Windows Interface Reference: ListBox structure

ListBox

The ListBox structure contains styles and flags used in messages to list boxes.

structure Listbox:
sig
	structure Style:
	sig
		include BIT_FLAGS where type flags = Window.Style.flags
	    val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
		and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
		and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
		and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
		and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
		and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
		and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
		and WS_POPUPWINDOW: flags and WS_CHILDWINDOW: flags
		and LBS_NOTIFY: flags and LBS_SORT: flags and LBS_NOREDRAW: flags and LBS_MULTIPLESEL: flags
	    and LBS_OWNERDRAWFIXED: flags and LBS_OWNERDRAWVARIABLE: flags and LBS_HASSTRINGS: flags
	    and LBS_USETABSTOPS: flags and LBS_NOINTEGRALHEIGHT: flags and LBS_MULTICOLUMN: flags
	    and LBS_WANTKEYBOARDINPUT: flags and LBS_EXTENDEDSEL: flags and LBS_DISABLENOSCROLL: flags
	    and LBS_NODATA: flags and LBS_NOSEL: flags and LBS_STANDARD: flags
	end

	structure Notifications:
	sig
		val LBN_SELCHANGE: int
		val LBN_DBLCLK: int
		val LBN_SELCANCEL: int
		val LBN_SETFOCUS: int
		val LBN_KILLFOCUS: int
	end

	datatype LBDirAttr =
		DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_DIRECTORY |
		DDL_ARCHIVE | DDL_POSTMSGS | DDL_DRIVES | DDL_EXCLUSIVE
end
polyml-5.6/documentation/Winref/Locale.html000066400000000000000000000066161265146633400211130ustar00rootroot00000000000000 Windows Interface Reference: Locale structure

Locale

The Locale structure contains the definitions of language identifiers.  These are used primarily when selecting

structure Locale:
sig
    datatype PrimaryLanguage =
          LANG_AFRIKAANS | LANG_ALBANIAN | LANG_ARABIC | LANG_BASQUE | LANG_BELARUSIAN
        | LANG_BULGARIAN | LANG_CATALAN | LANG_CHINESE | LANG_CROATIAN | LANG_CZECH
        | LANG_DANISH | LANG_DUTCH | LANG_ENGLISH | LANG_ESTONIAN | LANG_FAEROESE
        | LANG_FARSI | LANG_FINNISH | LANG_FRENCH | LANG_GERMAN | LANG_GREEK | LANG_HEBREW
        | LANG_HUNGARIAN | LANG_ICELANDIC | LANG_INDONESIAN | LANG_ITALIAN | LANG_JAPANESE
        | LANG_KOREAN | LANG_LATVIAN | LANG_LITHUANIAN | LANG_NORWEGIAN | LANG_POLISH
        | LANG_PORTUGUESE | LANG_ROMANIAN | LANG_RUSSIAN | LANG_SERBIAN | LANG_SLOVAK
        | LANG_SLOVENIAN | LANG_SPANISH | LANG_SWEDISH | LANG_THAI | LANG_TURKISH
        | LANG_UKRANIAN | LANG_VIETNAMESE | LANG_NEUTRAL

    datatype SubLanguage =
          SUBLANG_ARABIC_ALGERIA | SUBLANG_ARABIC_BAHRAIN | SUBLANG_ARABIC_EGYPT
        | SUBLANG_ARABIC_IRAQ | SUBLANG_ARABIC_JORDAN | SUBLANG_ARABIC_KUWAIT
        | SUBLANG_ARABIC_LEBANON | SUBLANG_ARABIC_LIBYA | SUBLANG_ARABIC_MOROCCO
        | SUBLANG_ARABIC_OMAN | SUBLANG_ARABIC_QATAR | SUBLANG_ARABIC_SAUDI_ARABIA
        | SUBLANG_ARABIC_SYRIA | SUBLANG_ARABIC_TUNISIA | SUBLANG_ARABIC_UAE
        | SUBLANG_ARABIC_YEMEN | SUBLANG_CHINESE_HONGKONG | SUBLANG_CHINESE_SIMPLIFIED
        | SUBLANG_CHINESE_SINGAPORE | SUBLANG_CHINESE_TRADITIONAL | SUBLANG_DUTCH
        | SUBLANG_DUTCH_BELGIAN | SUBLANG_ENGLISH_AUS | SUBLANG_ENGLISH_BELIZE
        | SUBLANG_ENGLISH_CAN | SUBLANG_ENGLISH_CARIBBEAN | SUBLANG_ENGLISH_EIRE
        | SUBLANG_ENGLISH_JAMAICA | SUBLANG_ENGLISH_NZ | SUBLANG_ENGLISH_SOUTH_AFRICA
        | SUBLANG_ENGLISH_TRINIDAD | SUBLANG_ENGLISH_UK | SUBLANG_ENGLISH_US
        | SUBLANG_FRENCH | SUBLANG_FRENCH_BELGIAN | SUBLANG_FRENCH_CANADIAN
        | SUBLANG_FRENCH_LUXEMBOURG | SUBLANG_FRENCH_SWISS | SUBLANG_GERMAN
        | SUBLANG_GERMAN_AUSTRIAN | SUBLANG_GERMAN_LIECHTENSTEIN
        | SUBLANG_GERMAN_LUXEMBOURG | SUBLANG_GERMAN_SWISS | SUBLANG_ITALIAN
        | SUBLANG_ITALIAN_SWISS | SUBLANG_KOREAN | SUBLANG_KOREAN_JOHAB
        | SUBLANG_NORWEGIAN_BOKMAL | SUBLANG_NORWEGIAN_NYNORSK | SUBLANG_PORTUGUESE
        | SUBLANG_PORTUGUESE_BRAZILIAN | SUBLANG_SERBIAN_CYRILLIC | SUBLANG_SERBIAN_LATIN
        | SUBLANG_SPANISH | SUBLANG_SPANISH_ARGENTINA | SUBLANG_SPANISH_BOLIVIA
        | SUBLANG_SPANISH_CHILE | SUBLANG_SPANISH_COLOMBIA | SUBLANG_SPANISH_COSTA_RICA
        | SUBLANG_SPANISH_DOMINICAN_REPUBLIC | SUBLANG_SPANISH_ECUADOR
        | SUBLANG_SPANISH_EL_SALVADOR | SUBLANG_SPANISH_GUATEMALA | SUBLANG_SPANISH_HONDURAS
        | SUBLANG_SPANISH_MEXICAN | SUBLANG_SPANISH_MODERN | SUBLANG_SPANISH_NICARAGUA
        | SUBLANG_SPANISH_PANAMA | SUBLANG_SPANISH_PARAGUAY | SUBLANG_SPANISH_PERU
        | SUBLANG_SPANISH_PUERTO_RICO | SUBLANG_SPANISH_URUGUAY | SUBLANG_SPANISH_VENEZUELA
        | SUBLANG_SWEDISH | SUBLANG_SWEDISH_FINLAND
        | SUBLANG_NEUTRAL | SUBLANG_DEFAULT | SUBLANG_SYS_DEFAULT

 
    datatype LANGID = MAKELANGID of PrimaryLanguage * SubLanguage
    val GetUserDefaultLangID: unit -> LANGID
    and GetSystemDefaultLangID: unit -> LANGID
end
polyml-5.6/documentation/Winref/Menu.html000066400000000000000000000074211265146633400206130ustar00rootroot00000000000000 Windows Interface Reference: Menu structure

Menu

The Menu structure contains functions and structures to create and operate on menus.

structure Menu:
  sig
    type HMENU and HBITMAP and HWND and HINSTANCE
    type RECT =  { left: int, top: int, right: int, bottom: int }
	
    datatype MenuFlag =
        MF_BYCOMMAND | MF_BYPOSITION | MF_SEPARATOR | MF_ENABLED | MF_GRAYED |
        MF_DISABLED | MF_UNCHECKED | MF_CHECKED | MF_USECHECKBITMAPS | MF_STRING |
        MF_BITMAP | MF_OWNERDRAW | MF_POPUP | MF_MENUBARBREAK | MF_MENUBREAK |
        MF_UNHILITE | MF_HILITE | MF_DEFAULT | MF_SYSMENU | MF_HELP |
        MF_RIGHTJUSTIFY | MF_MOUSESELECT

    datatype MenuIdOrHandle = MenuHandle of HMENU | MenuId of int

    datatype MenuItemOptions =
          MFT_MENUBARBREAK
        | MFT_MENUBREAK
        | MFT_RADIOCHECK
        | MFT_RIGHTJUSTIFY
        | MFT_RIGHTORDER

    datatype MenuItemType =
          MFT_BITMAP of HBITMAP
        | MFT_OWNERDRAW of int
        | MFT_SEPARATOR
        | MFT_STRING of string

    datatype MenuState =
          MFS_CHECKED
        | MFS_DEFAULT
        | MFS_DISABLED
        | MFS_ENABLED
        | MFS_GRAYED
        | MFS_HILITE
        | MFS_UNCHECKED
        | MFS_UNHILITE

    type MenuItemInfo =
        {
            menuType: MenuItemType,
            menuOptions: MenuItemOptions list,
            state: MenuState list,
            wID: int,
            hSubMenu: HMENU option,
            hbmpChecked: HBITMAP option,
            hbmpUnchecked: HBITMAP option,
            itemData: int
        }

    val AppendMenu : HMENU * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit
    val CheckMenuRadioItem : HMENU * int * int * int * MenuFlag -> unit
    val CreateMenu : unit -> HMENU
    val CreatePopupMenu : unit -> HMENU
    val DeleteMenu : HMENU * int * MenuFlag -> unit
    val DestroyMenu : HMENU -> unit
    val DrawMenuBar : HWND -> unit
    val EnableMenuItem : HMENU * int * MenuFlag -> MenuFlag list
    val GetMenu : HWND -> HMENU

    datatype GMDIFlags = GMDI_GOINTOPOPUPS | GMDI_USEDISABLED
    val GetMenuDefaultItem : HMENU * bool * GMDIFlags list -> int

    val GetMenuItemCount : HMENU -> int
    val GetMenuItemID : HMENU -> int
    val GetMenuItemInfo : HMENU * int * bool -> MenuItemInfo
    val GetMenuItemRect : HWND * HMENU * int -> RECT
    val GetMenuState : HMENU * int * MenuFlag -> MenuFlag list * int
    val GetMenuString : HMENU * int * MenuFlag -> string
    val GetSubMenu : HMENU * int -> HMENU
    val GetSystemMenu : HWND * bool -> HMENU
    val HiliteMenuItem : HWND * HMENU * int * MenuFlag list -> unit
    val InsertMenu : HMENU * int * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit
    val IsMenu : HMENU -> bool
    val LoadMenu : HINSTANCE * Resource.RESID -> HMENU
    val ModifyMenu : HMENU * int * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit
    val RemoveMenu : HMENU * int * MenuFlag -> unit
    val SetMenu : HWND * HMENU option -> unit
    val SetMenuItemInfo : HMENU * int * bool * MenuItemInfo -> unit
    val InsertMenuItem : HMENU * int * bool * MenuItemInfo -> unit

    datatype TrackPopupMenuOptions =
        TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_CENTERALIGN | TPM_RIGHTALIGN |
        TPM_TOPALIGN | TPM_VCENTERALIGN | TPM_BOTTOMALIGN | (*TPM_HORIZONTAL | TPM_VERTICAL |*)
        TPM_NONOTIFY | TPM_RETURNCMD
    val TrackPopupMenu : HMENU * TrackPopupMenuOptions list * int * int * HWND -> int

    val SetMenuContextHelpId: HMENU * int -> unit
    val GetMenuContextHelpId: HMENU -> int
  end
polyml-5.6/documentation/Winref/Message.html000066400000000000000000001205631265146633400212760ustar00rootroot00000000000000 Windows Interface Reference: Message structure

Message

The Message structure contains the definition of the message datatype and functions to send and receive messages.

structure Message :
  sig
    datatype ControlType =
          ODT_BUTTON
        | ODT_COMBOBOX
        | ODT_LISTBOX
        | ODT_MENU
        | ODT_STATIC
    datatype ImageType =
          IMAGE_BITMAP
        | IMAGE_CURSOR
        | IMAGE_ENHMETAFILE
        | IMAGE_ICON

    type HGDIOBJ and HWND and HMENU and HICON and HINSTANCE and HDC
    and HFONT and HRGN and HDROP
    type RECT =  { left: int, top: int, right: int, bottom: int }
    type POINT = { x: int, y: int }

    datatype LRESULT = LRESHANDLE of HGDIOBJ | LRESINT of int
    type KeyData
    datatype MDITileFlags = MDITILE_VERTICAL | MDITILE_HORIZONTAL | MDITILE_SKIPDISABLED
    type windowFlags and findReplaceFlags
    datatype ScrollDirection =
          SB_BOTTOM
        | SB_ENDSCROLL
        | SB_LEFT
        | SB_LINEDOWN
        | SB_LINELEFT
        | SB_LINERIGHT
        | SB_LINEUP
        | SB_PAGEDOWN
        | SB_PAGELEFT
        | SB_PAGERIGHT
        | SB_PAGEUP
        | SB_RIGHT
        | SB_THUMBPOSITION
        | SB_THUMBTRACK
        | SB_TOP
    type WindowPositionStyle
    datatype MouseKeyFlags = MK_LBUTTON | MK_RBUTTON | MK_SHIFT | MK_CONTROL | MK_MBUTTON
    type ClipboardFormat and ClassType 

    datatype MarginSettings = 
        UseFontInfo | Margins of {left: int option, right: int option }
    datatype
      SystemCommand =
          SC_ARRANGE
        | SC_CLOSE
        | SC_CONTEXTHELP
        | SC_DEFAULT
        | SC_HOTKEY
        | SC_HSCROLL
        | SC_KEYMENU
        | SC_MAXIMIZE
        | SC_MINIMIZE
        | SC_MONITORPOWER
        | SC_MOUSEMENU
        | SC_MOVE
        | SC_NEXTWINDOW
        | SC_PREVWINDOW
        | SC_RESTORE
        | SC_SCREENSAVE
        | SC_SEPARATOR
        | SC_SIZE
        | SC_TASKLIST
        | SC_VSCROLL
    datatype WMActivateOptions = WA_ACTIVE | WA_CLICKACTIVE | WA_INACTIVE

    datatype
      WMPrintOption =
          PRF_CHECKVISIBLE
        | PRF_CHILDREN
        | PRF_CLIENT
        | PRF_ERASEBKGND
        | PRF_NONCLIENT
        | PRF_OWNED

    datatype WMSizeOptions =
        SIZE_MAXHIDE | SIZE_MAXIMIZED | SIZE_MAXSHOW | SIZE_MINIMIZED | SIZE_RESTORED
    datatype HelpHandle = MenuHandle of HMENU | WindowHandle of HWND

    datatype Message     =
                    WM_ACTIVATE of {active : WMActivateOptions, minimize : bool }
                      (* Indicates a change in activation state *)

                    | WM_ACTIVATEAPP of {active  : bool, threadid: int  } 
                      (* Notifies applications when a new task activates *)

                    | WM_ASKCBFORMATNAME of { length: int, formatName : string ref}    
                      (* Retrieves the name of the clipboard format *)

                    | WM_CANCELJOURNAL    
                      (* Notifies application when user cancels journaling *)

                    | WM_CANCELMODE    
                      (* Notifies a Window to cancel internal modes *)

                    | WM_CHANGECBCHAIN of { removed : HWND, next : HWND  }    
                      (* Notifies clipboard viewer of removal from chain *)

                    | WM_CHAR of {charCode : char, data : KeyData }                       
                      (* Indicates the user pressed a character key *)

                    | WM_CHARTOITEM of {key : int, caretpos : int, listbox  : HWND  }
                      (* Provides list-box keystrokes to owner Window *)

                    | WM_CHILDACTIVATE    
                      (* Notifies a child Window of activation *)

                    | WM_CHOOSEFONT_GETLOGFONT of LOGFONT ref *)
                      (* Retrieves LOGFONT structure for Font dialog box *)

                    | WM_CLEAR
                      (* Clears an edit control *)

                    | WM_CLOSE       
                      (* System Close menu command was chosen *)

                    | WM_COMMAND of {notifyCode : int,
                                  wId        : int,
                                  control    : HWND  }
                      (* Specifies a command message *)
                       
                    | WM_COMPACTING    of { compactratio : int }
                      (* Indicates a low memory condition *)

                    | WM_COMPAREITEM of {controlid : int,
                                           ctlType : ControlType,
                                           ctlID : int,
                                           hItem : HWND,
                                           itemID1 : int,
                                           itemData1 : int,
                                           itemID2 : int,
                                           itemData2 : int                                           
                                           }
                      (* Determines position of combo- or list-box item *)

                    | WM_COPY
                      (* Copies a selection to the clipboard *)

                    | WM_COPYDATA of { sender : HWND, data : int, pdata: Word8Vector.vector }
                      (* Passes data to another application  *)

                    | WM_CREATE    of { instance: HINSTANCE,
                                     creation: int,
                                     menu : HMENU,
                                     parent : HWND,
                                     cy : int,
                                     cx : int,
                                     y : int,
                                     x : int,
                                     style : windowFlags,
                                     name : string,
                                     (* The class may be a string or an atom. *)
                                     class : ClassType,
                                     extendedstyle : int                                                                          
                                     }
                      (* Indicates a Window is being created *)

                    | WM_CTLCOLORBTN of { displaycontext : HDC, button : HWND  }
                      (* Button is about to be drawn *)

                    | WM_CTLCOLORDLG of { displaycontext : HDC,
                                       dialogbox      : HWND  }
                      (* Dialog box is about to be drawn *)
                     
                    | WM_CTLCOLOREDIT of {  displaycontext : HDC, editcontrol : HWND  }
                      (* Control is about to be drawn *)

                    | WM_CTLCOLORLISTBOX of { displaycontext : HDC, listbox : HWND   }
                      (* List box is about to be drawn *)

                    | WM_CTLCOLORMSGBOX    of { displaycontext : HDC,
                                             messagebox     : HWND  }
                      (* Message box is about to be drawn *)

                    | WM_CTLCOLORSCROLLBAR of { displaycontext : HDC,
                                             scrollbar      : HWND  }
                      (* Indicates scroll bar is about to be drawn *)

                    | WM_CTLCOLORSTATIC    of { displaycontext : HDC,
                                             staticcontrol  : HWND  }
                      (* Control is about to be drawn *)
                      (* Note the return value is an HBRUSH *)

                    | WM_CUT
                      (* Deletes a selection and copies it to the clipboard *)

                    | WM_DEADCHAR of { charCode : char, data  : KeyData   }
                      (* Indicates the user pressed a dead key *)

                    | WM_DELETEITEM    of { controlid : int,
                                             ctlType : ControlType,
                                             ctlID : int,
                                             itemID : int,
                                             item : HWND,
                                             itemData : int                                         
                                           }
                      (* Indicates owner-draw item or control was altered *)

                    | WM_DESTROY    
                      (* Indicates Window is about to be destroyed *)

                    | WM_DESTROYCLIPBOARD    
                      (* Notifies owner that the clipboard was emptied *)
                     
                    | WM_DEVMODECHANGE of { devicename : string }    
                      (* Indicates the device-mode settings have changed *)
                     
                    | WM_DRAWCLIPBOARD    
                      (* Indicates the clipboard's contents have changed *) 
                    
                    | WM_DRAWITEM of { controlid : int,
                                       ctlType : ControlType,
                                       ctlID : int,
                                       itemID : int,
                                       itemAction : int,
                                       itemState : int,
                                       hItem : HWND ,
                                       hDC : HDC,
                                       rcItem : RECT,
                                       itemData : int
                                        }    
                      (* Indicates owner-draw control/menu needs redrawing *) 
                     
                    | WM_DROPFILES of { hDrop : HDROP }    
                      (* Indicates that a file has been dropped *)
                    
                    | WM_ENABLE    of { enabled : bool }
                      (* Indicates a Window's enable state is changing *)
                    
                    | WM_ENDSESSION    of { endsession : bool }
                      (* Indicates whether the Windows session is ending *)
                    
                    | WM_ENTERIDLE of { flag : int, window : HWND }
                      (* Indicates a modal dialog box or menu is idle *)
                    
                    | WM_ENTERMENULOOP of { istrack: bool }
                      (* Indicates entry into menu modal loop *)
                    
                    | WM_EXITMENULOOP of { istrack: bool }
                      (* Indicates exit from menu modal loop *)
                    
                    | WM_ERASEBKGND    of { devicecontext : HDC }
                      (* Indicates a Window's background need erasing *)
                    
                    | WM_FONTCHANGE
                      (* Indicates a change in the font-resource pool *)
                     
                    | WM_GETDLGCODE
                      (* Allows dialog procedure to process control input *)
                    
                    | WM_GETFONT    
                      (* Retrieves the font that a control is using *)
                    
                    | WM_GETHOTKEY
                      (* Gets the virtual-key code of a Window's hot key *) 
                    
                    | WM_GETMINMAXINFO of { MaxSizex      : int,
                                            MaxSizey      : int,
                                            MaxPositionx  : int,
                                            MaxPositiony  : int,
                                            MinTrackSizex : int,
                                            MinTrackSizey : int,
                                            MaxTrackSizex : int,
                                            MaxTrackSizey : int                                            
                                             }
                      (* Gets minimum and maximum sizing information *)
                    
                    | WM_GETTEXT of { length: int, text : string ref  }    
                      (* Gets the text that corresponds to a Window *)
                    
                    | WM_GETTEXTLENGTH    
                      (* Gets length of text associated with a Window *)
                    
                    | WM_HOTKEY    of { id : int }
                      (* Hot key has been detected *)
                    
                    | WM_HSCROLL of { value    : ScrollDirection,
                                       position : int,
                                       scrollbar   : HWND  }    
                      (* Indicates a click in a horizontal scroll bar *)
                    
                    | WM_HSCROLLCLIPBOARD of { viewer   : HWND,
                                               code     : int,
                                               position : int  }    
                      (* Prompts owner to scroll clipboard contents *)
                    
                    | WM_ICONERASEBKGND    of { devicecontext : HDC }
                      (* Notifies minimized Window to fill icon background *)
                    
                    | WM_INITDIALOG    of { dialog   : HWND, initdata : int  }
                      (* Initializes a dialog box *)
                    
                    | WM_INITMENU of { menu : HMENU }    
                      (* Indicates a menu is about to become active *)
                    
                    | WM_INITMENUPOPUP of { menupopup  : HMENU,
                                            itemposition : int,
                                            isSystemMenu : bool  }
                      (* Indicates a pop-up menu is being created *)
                    
                    | WM_KEYDOWN of { virtualKey : int, data : KeyData  }    
                      (* Indicates a nonsystem key was pressed *)
                    
                    | WM_KEYUP of { virtualKey : int, data : KeyData  }    
                      (* Indicates a nonsystem key was released *)
                    
                    | WM_KILLFOCUS of { receivefocus : HWND }
                      (* Indicates the Window is losing keyboard focus *)
                    
                    | WM_LBUTTONDBLCLK of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates double-click of left button *) 
                    
                    | WM_LBUTTONDOWN of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates when left mouse button is pressed *)
                    
                    | WM_LBUTTONUP of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates when left mouse button is released *)
                    
                    | WM_MBUTTONDBLCLK of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates double-click of middle mouse button *)
                    
                    | WM_MBUTTONDOWN of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates when middle mouse button is pressed *)
                    
                    | WM_MBUTTONUP of { keyflags : MouseKeyFlags list, x : int, y : int  }
                      (* Indicates when middle mouse button is released *)
                          
                    | WM_MDICASCADE of { skipDisabled : bool  }    
                      (* Arranges MDI child Windows in cascade format *)
                    
                    | WM_MDICREATE of { class : ClassType,
                                         title : string,
                                         instance: HINSTANCE,
                                         x : int,
                                         y : int,
                                         cx : int,
                                         cy : int,
                                         style : int,
                                         cdata : int }    
                      (* Prompts MDI client to create a child Window *) 
                    
                    | WM_MDIDESTROY of { child : HWND  }    
                      (* Closes an MDI child Window *) 
                    
                    | WM_MDIGETACTIVE
                      (* Retrieves data about the active MDI child Window *) 
                    
                    | WM_MDIICONARRANGE    
                      (* Arranges minimized MDI child Windows *) 
                    
                    | WM_MDIMAXIMIZE of {  child: HWND  }    
                      (* Maximizes an MDI child Window *) 
                    
                    | WM_MDINEXT of { child    : HWND, flagnext : bool  }
                      (* Activates the next MDI child Window *) 
                    
                    | WM_MDIREFRESHMENU
                      (* Refreshes an MDI frame Window's menu *) 
                     
                    | WM_MDIRESTORE    of {  child : HWND  }
                      (* Prompts MDI client to restore a child Window *) 
                    
                    | WM_MDISETMENU  of { frameMenu  : HMENU, windowMenu : HMENU  } 
                      (* Replaces an MDI frame Window's menu *) 
                    
                    | WM_MDITILE of { tilingflag : MDITileFlags list }
                      (* Arranges MDI child Windows in tiled format *) 
                    
                    | WM_MEASUREITEM of { controlid  : int,
                                          ctlType    : ControlType,
                                          ctlID      : int,
                                          itemID     : int,
                                          itemWidth  : int,
                                          itemHeight : int,
                                          itemData   : int
                                         }    
                      (* Requests dimensions of owner-draw control or item *)

                    | WM_MENUCHAR of { ch : char, menuflag : MenuBase.MenuFlag, menu : HMENU }    
                      (* Indicates an unknown menu mnemonic was pressed *)
                     
                    | WM_MENUSELECT    of { menuitem  : int,
                                         menuflags : MenuBase.MenuFlag list,
                                         menu      : HMENU  }
                      (* Indicates that the user selected a menu item *)
                    
                    | WM_MOUSEACTIVATE of { parent   : HWND,
                                            hitTest : int,
                                            message  : int  }    
                      (* Indicates a mouse click in an inactive Window *) 
                    
                    | WM_MOUSEMOVE of { keyflags : MouseKeyFlags list, x : int, y : int  }    
                      (* Indicates mouse-cursor movement *)
                    
                    | WM_MOVE of { x : int, y : int  }    
                      (* Indicates a Window's position has changed *)
                    
                    | WM_NCACTIVATE of { active : bool }
                      (* Changes the active state of nonclient area *)
                    
                    | WM_NCCALCSIZE    of { validarea     : bool,
                                             newrect       : RECT,
                                             oldrect       : RECT,
                                             oldclientarea : RECT,
                                             hwnd           : HWND,
                                             insertAfter   : HWND,
                                             x     : int,
                                             y     : int,
                                             cx    : int,
                                             cy    : int,
                                             style : WindowPositionStyle list
                                           }
                      (* Calculates the size of a Window's client area *)
                    
                    | WM_NCCREATE of { instance: HINSTANCE,
                                    creation: int,
                                       menu : HMENU,
                                       parent : HWND,
                                       cy : int,
                                       cx : int,
                                       y : int,
                                       x : int,
                                       style : windowFlags,
                                       name : string,
                                       class : ClassType,
                                       extendedstyle : int                      
                                      }    
                      (* Indicates a Window's nonclient area being created *)

                    | WM_NCDESTROY    
                      (* Indicates Window's nonclient area being destroyed *)

                    | WM_NCHITTEST of { x : int, y : int  }    
                      (* Indicates mouse-cursor movement *)
                    
                    | WM_NCLBUTTONDBLCLK of { hitTest : int,
                                              x     : int,
                                              y     : int  }    
                      (* Indicates nonclient left button double-click *)
                     
                    | WM_NCLBUTTONDOWN    of { hitTest : int, x : int, y : int  }    
                      (* Indicates left button pressed in nonclient area *)
                    
                    | WM_NCLBUTTONUP of { hitTest : int, x : int, y : int  }    
                      (* Indicates left button released in nonclient area *)
                    
                    | WM_NCMBUTTONDBLCLK of { hitTest : int, x : int, y : int  }    
                      (* Indicates nonclient middle button double-click *)
                    
                    | WM_NCMBUTTONDOWN of { hitTest : int, x : int, y : int  }    
                      (* Indicates middle button pressed in nonclient area *)
                    
                    | WM_NCMBUTTONUP of { hitTest : int, x : int, y : int  }    
                      (* Indicates middle button released in nonclient area *)
                    
                    | WM_NCMOUSEMOVE of { hitTest : int, x : int, y : int  }    
                      (* Indicates mouse-cursor movement in nonclient area *)
                    
                    | WM_NCPAINT of { region : HRGN  }    
                      (* Indicates a Window's frame needs painting *)
                    
                    | WM_NCRBUTTONDBLCLK of { hitTest : int, x : int, y : int  }    
                      (* Indicates nonclient right button double-click *)
                    
                    | WM_NCRBUTTONDOWN of { hitTest : int, x : int, y : int  }    
                      (* Indicates right button pressed in nonclient area *)
                    
                    | WM_NCRBUTTONUP of { hitTest : int, x : int, y : int  }    
                      (* Indicates right button released in nonclient area *)
                    
                    | WM_NEXTDLGCTL    of { control    : int, handleflag : bool  } 
                      (* Sets focus to different dialog box control *) 
                    
                    | WM_PAINT    
                      (* Indicates a Window's client area need painting *)
                    
                    | WM_PAINTCLIPBOARD of { clipboard : HWND }
                      (* Prompts owner to display clipboard contents *)
                    
                    | WM_PAINTICON
                      (* Icon is about to be painted *) 

                    | WM_PALETTECHANGED of { palChg : HWND  }    
                      (* Indicates the focus-Window realized its palette *)
                    
                    | WM_PALETTEISCHANGING of { realize : HWND  }    
                      (* Informs Windows that palette is changing *) 
                    
                    | WM_PARENTNOTIFY of { eventflag : int, idchild   : int, value : int }    
                      (* Notifies parent of child-Window activity *) 
                    
                    | WM_PASTE    
                      (* Inserts clipboard data into an edit control *)
                    
                    | WM_POWER of { powerevent : int  }    
                      (* Indicates the system is entering suspended mode *)
                    
                    | WM_QUERYDRAGICON    
                      (* Requests a cursor handle for a minimized Window *)
                    
                    | WM_QUERYENDSESSION of { source : int  }
                      (* Requests that the Windows session be ended *) 
                    
                    | WM_QUERYNEWPALETTE
                      (* Allows a Window to realize its logical palette *) 
                    
                    | WM_QUERYOPEN
                      (* Requests that a minimized Window be restored *) 
                    
                    | WM_QUEUESYNC
                      (* Delimits CBT messages *) 
                    
                    | WM_QUIT of { exitcode : int  }    
                      (* Requests that an application be terminated *)
                    
                    | WM_RBUTTONDBLCLK of { keyflags : MouseKeyFlags list, x: int, y: int  }    
                      (* Indicates double-click of right mouse button *)
                    
                    | WM_RBUTTONDOWN of { keyflags : MouseKeyFlags list, x: int, y: int  }    
                      (* Indicates when right mouse button is pressed *)

                    | WM_RBUTTONUP of { keyflags : MouseKeyFlags list, x: int, y: int  }
                      (* Indicates when right mouse button is released *) 
                    
                    | WM_RENDERALLFORMATS    
                      (* Notifies owner to render all clipboard formats *) 
                    
                    | WM_RENDERFORMAT of { format : ClipboardFormat  }    
                      (* Notifies owner to render clipboard data *) 
                    
                    | WM_SETCURSOR of { cursorwindow : HWND, hitTest : int, mousemessage : int  }    
                      (* Prompts a Window to set the cursor shape *) 
                    
                    | WM_SETFOCUS of { losing : HWND  }
                    
                    | WM_SETFONT of {font : HFONT, redrawflag : bool  }    
                    
                    | WM_SETHOTKEY of { virtualKey : int  }    
                    
                    | WM_SETREDRAW of { redrawflag : int  }
                    
                    | WM_SETTEXT of { text : string  }    
                    
                    | WM_SHOWWINDOW    of { showflag   : bool, statusflag : int  } 
                    
                    | WM_SIZE of { flag : WMSizeOptions, width : int, height : int  }    
                    
                    | WM_SIZECLIPBOARD of { viewer : HWND}
                    
                    | WM_SPOOLERSTATUS of { jobstatus : int, jobsleft  : int  }    
                    
                    | WM_SYSCHAR of { charCode : char, data : KeyData  }
                    
                    | WM_SYSCOLORCHANGE
                    
                    | WM_SYSCOMMAND of { commandvalue : SystemCommand, p: POINT }
                    
                    | WM_SYSDEADCHAR of { charCode : char, data : KeyData  }
                   
                    | WM_SYSKEYDOWN of { virtualKey : int, data : KeyData  }

                    | WM_SYSKEYUP of { virtualKey : int, data : KeyData  }
                    
                    | WM_TIMECHANGE    
                      (* Indicates the system time has been set *)
                    
                    | WM_TIMER of { timerid : int  }
                    
                    | WM_UNDO    
                     
                    | WM_USER of { uMsg: int, wParam: int, lParam: int }
                    | WM_APP of { uMsg: int, wParam: int, lParam: int }
                    | WM_REGISTERED of { uMsg: int, wParam: int, lParam: int }
                    
                    | WM_VKEYTOITEM    of { virtualKey : int,
                                         caretpos   : int,
                                         listbox    : HWND  }
                     
                    | WM_VSCROLL of { value     : ScrollDirection,
                                      position  : int,
                                      scrollbar : HWND  }

                    | WM_VSCROLLCLIPBOARD of { viewer   : HWND,
                                               code     : int,
                                               position : int  }
                    
                    | WM_WINDOWPOSCHANGED of { hwnd: HWND, front  : HWND,
                                               x   : int,
                                               y   : int,
                                               width  : int,
                                               height : int,
                                               flags  : WindowPositionStyle list }
                    
                    | WM_WINDOWPOSCHANGING of { hwnd: HWND, front  : HWND,
                                                x   : int,
                                                y   : int,
                                                width  : int,
                                                height : int,
                                                flags  : WindowPositionStyle list }    
                     
                    | WM_SETTINGCHANGE of { section_name : string  }    

                    | WM_NOTIFY of {from: HWND, idCtrl: int, idFrom : int, code: int }

                    | WM_CAPTURECHANGED of { newCapture: HWND }

                    | WM_ENTERSIZEMOVE

                    | WM_EXITSIZEMOVE

                    | WM_PRINT of {hdc: HDC, flags: WMPrintOption list }

                    | WM_PRINTCLIENT of {hdc: HDC, flags: WMPrintOption list }

                    | WM_HELP of { ctrlId: int, itemHandle: HelpHandle, contextId: int,
                                   mousePos: POINT }

                    | WM_GETICON of { big: bool }

                    | WM_SETICON of { big: bool, icon: HICON }

                    | WM_CONTEXTMENU of { hwnd: HWND, xPos: int, yPos: int }

                    | WM_DISPLAYCHANGE of { bitsPerPixel: int, xScreen: int, yScreen: int }

                    | EM_CANUNDO

                    | EM_CHARFROMPOS of { point: POINT }

                    | EM_EMPTYUNDOBUFFER

                    | EM_FMTLINES of {addEOL: bool}

                    | EM_GETFIRSTVISIBLELINE

                    | EM_GETLIMITTEXT

                    | EM_GETLINE of { lineNo: int, size: int, result: string ref }

                    | EM_GETLINECOUNT

                    | EM_GETMARGINS

                    | EM_GETMODIFY

                    | EM_GETPASSWORDCHAR

                    | EM_GETRECT of {rect: RECT ref}

                    | EM_GETSEL of {startPos: int ref, endPos: int ref}

                    | EM_GETTHUMB

                    | EM_LIMITTEXT of {limit: int}

                    | EM_LINEFROMCHAR of {index: int}

                    | EM_LINEINDEX of {line: int}

                    | EM_LINELENGTH of {index: int}

                    | EM_LINESCROLL of {xScroll: int, yScroll: int}

                    | EM_POSFROMCHAR of {index: int}

                    | EM_REPLACESEL of {canUndo: bool, text: string}

                    | EM_SCROLL of {action: ScrollDirection}

                    | EM_SCROLLCARET

                    | EM_SETMARGINS of {margins: MarginSettings}

                    | EM_SETMODIFY of { modified: bool }

                    | EM_SETPASSWORDCHAR of { ch: char }

                    | EM_SETREADONLY of { readOnly: bool }

                    | EM_SETRECT of {rect: RECT}

                    | EM_SETRECTNP of {rect: RECT}

                    | EM_SETSEL of {startPos: int, endPos: int}

                    | EM_SETTABSTOPS of {tabs: int list}

                    | EM_UNDO

                    | BM_CLICK

                    | BM_GETCHECK

                    | BM_GETIMAGE of {imageType: ImageType}

                    | BM_GETSTATE

                    | BM_SETCHECK of {state: int}

                    | BM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType}

                    | BM_SETSTATE of {highlight: bool }

                    | BM_SETSTYLE of {redraw: bool, style: windowFlags}

                    | CB_GETEDITSEL of {startPos: int ref, endPos: int ref}

                    | CB_LIMITTEXT of {limit: int}

                    | CB_SETEDITSEL of {startPos: int, endPos: int}

                    | CB_ADDSTRING of { text: string }

                    | CB_DELETESTRING of { index: int }

                    | CB_GETCOUNT

                    | CB_GETCURSEL

                    | CB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string }

                    | CB_GETLBTEXT of { index: int, length: int, text: string ref }

                    | CB_GETLBTEXTLEN of { index: int }

                    | CB_INSERTSTRING of { index: int, text: string }

                    | CB_RESETCONTENT

                    | CB_FINDSTRING of { indexStart: int, text: string }

                    | CB_SELECTSTRING of { indexStart: int, text: string }

                    | CB_SETCURSEL of { index: int }

                    | CB_SHOWDROPDOWN of { show: bool }

                    | CB_GETITEMDATA of { index: int }

                    | CB_SETITEMDATA of { index: int, data: int }

                    | CB_GETDROPPEDCONTROLRECT of { rect: RECT ref }

                    | CB_SETITEMHEIGHT of { index: int, height: int }

                    | CB_GETITEMHEIGHT of { index: int }

                    | CB_SETEXTENDEDUI of { extended: bool }

                    | CB_GETEXTENDEDUI

                    | CB_GETDROPPEDSTATE

                    | CB_FINDSTRINGEXACT of { indexStart: int, text: string }

                    | CB_SETLOCALE of { locale: int }

                    | CB_GETLOCALE

                    | CB_GETTOPINDEX

                    | CB_SETTOPINDEX of { index: int }

                    | CB_GETHORIZONTALEXTENT

                    | CB_SETHORIZONTALEXTENT of { extent: int }

                    | CB_GETDROPPEDWIDTH

                    | CB_SETDROPPEDWIDTH of { width: int }

                    | CB_INITSTORAGE of { items: int, bytes: int }

                    | LB_ADDSTRING of { text: string }

                    | LB_INSERTSTRING of { index: int, text: string }

                    | LB_DELETESTRING of { index: int }

                    | LB_SELITEMRANGEEX of { first: int, last: int }

                    | LB_RESETCONTENT

                    | LB_SETSEL of { select: bool, index: int }

                    | LB_SETCURSEL of { index: int }

                    | LB_GETSEL of { index: int }

                    | LB_GETCURSEL

                    | LB_GETTEXT of { index: int, length: int, text: string ref }

                    | LB_GETTEXTLEN of { index: int }

                    | LB_GETCOUNT

                    | LB_SELECTSTRING of { indexStart: int, text: string }

                    | LB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string }

                    | LB_GETTOPINDEX

                    | LB_FINDSTRING of { indexStart: int, text: string }

                    | LB_GETSELCOUNT

                    | LB_GETSELITEMS of { itemCount: int, items: int list ref }

                    | LB_SETTABSTOPS of { tabs: int list }

                    | LB_GETHORIZONTALEXTENT

                    | LB_SETHORIZONTALEXTENT of { extent: int }

                    | LB_SETCOLUMNWIDTH of { column: int }

                    | LB_ADDFILE of { fileName: string }

                    | LB_SETTOPINDEX of { index: int }

                    | LB_GETITEMRECT of { rect: RECT ref, index: int }

                    | LB_GETITEMDATA of { index: int }

                    | LB_SETITEMDATA of { index: int, data: int }

                    | LB_SELITEMRANGE of { select: bool, first: int, last: int }

                    | LB_SETANCHORINDEX of { index: int }

                    | LB_GETANCHORINDEX

                    | LB_SETCARETINDEX of { index: int, scroll: bool }

                    | LB_GETCARETINDEX

                    | LB_SETITEMHEIGHT of { index: int, height: int }

                    | LB_GETITEMHEIGHT of { index: int }

                    | LB_FINDSTRINGEXACT of { indexStart: int, text: string }

                    | LB_SETLOCALE of { locale: int } (* Should be an abstract type? *)

                    | LB_GETLOCALE (* Result will be the type used above. *)

                    | LB_SETCOUNT of { items: int }

                    | LB_INITSTORAGE of { items: int, bytes: int }

                    | LB_ITEMFROMPOINT of { point: POINT }

                    | STM_GETICON

                    | STM_GETIMAGE of {imageType: ImageType}

                    | STM_SETICON of {icon: HICON}

                    | STM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType}

                    | SBM_SETPOS of { pos: int, redraw: bool }

                    | SBM_GETPOS

                    | SBM_SETRANGE of { minPos: int, maxPos: int }

                    | SBM_SETRANGEREDRAW of { minPos: int, maxPos: int }

                    | SBM_GETRANGE of { minPos: int ref, maxPos: int ref }

                    | SBM_ENABLE_ARROWS of ScrollBase.enableArrows

                    | SBM_SETSCROLLINFO of { info: ScrollBase.SCROLLINFO,
                                             options: ScrollBase.ScrollInfoOption list }

                    | SBM_GETSCROLLINFO of { info: ScrollBase.SCROLLINFO ref,
                                             options: ScrollBase.ScrollInfoOption list }

                    | FINDMSGSTRING of
                        { flags: findReplaceFlags, findWhat: string, replaceWith: string }

                    | NULL


    type MSG = {
        msg: Message,
        hwnd: HWND,
        time: Time.time,
        pt: {x: int, y: int}
        }

    val GetInputState : unit -> bool
    val GetMessage : HWND option * int * int -> MSG
    val GetMessagePos : unit -> POINT
    val GetMessageTime : unit -> Time.time

    datatype
      QueueStatus =
          QS_ALLPOSTMESSAGE
        | QS_HOTKEY
        | QS_KEY
        | QS_MOUSEBUTTON
        | QS_MOUSEMOVE
        | QS_PAINT
        | QS_POSTMESSAGE
        | QS_SENDMESSAGE
        | QS_TIMER
    val QS_ALLEVENTS : QueueStatus list
    val QS_ALLINPUT : QueueStatus list
    val QS_INPUT : QueueStatus list
    val QS_MOUSE : QueueStatus list
    val GetQueueStatus : QueueStatus list -> QueueStatus list

    val InSendMessage : unit -> bool

    datatype PeekMessageOptions = PM_NOREMOVE | PM_REMOVE
    val PeekMessage : HWND option * int * int * PeekMessageOptions -> MSG option
    val PostQuitMessage : int -> unit
    val RegisterWindowMessage : string -> int
    val RunApplication : unit -> int
    val SendMessage : HWND * Message -> LRESULT
    val PostMessage : HWND * Message -> unit
    val HWND_BROADCAST: HWND
    val WaitMessage : unit -> bool
  end

datatype LRESULT = LRESHANDLE of HGDIOBJ | LRESINT of int
This type is used as the result of sending a message.  Most messages return integers but a few messages, such as STM_GETICON, return handles to objects. 

RunApplication(): int
ML-Extension: Processes and dispatches messages to the appropriate windows.  Returns when a WM_QUIT message is processed with the result passed in this message.  It also ensures that keyboard operations are correctly passed to modeless dialogues by calling IsDialogMessage automatically.  RunApplication should be used in preference to GetMessage. 

SendMessage:(hw, msg): LRESULT
Sends a message to a window and returns the result returned by the window procedure.   If the message contains references which are updated by the window procedure the updates will be made in the message before the function returns.

PostMessage:(hw, msg): unit
Queues a message for a window but does not wait until the window procedure processes the message before it returns.  The message is copied to the queue so any updates made by the window procedure will not affect references in the message.

 

polyml-5.6/documentation/Winref/MessageBox.html000066400000000000000000000035221265146633400217420ustar00rootroot00000000000000 Windows Interface Reference: MessageBox structure

MessageBox

The MessageBox structure contains functions and structures to create and operate on message boxes.

structure MessageBox :
sig
    type HWND

    val IDABORT : int
    val IDCANCEL : int
    val IDCLOSE : int
    val IDHELP : int
    val IDIGNORE : int
    val IDNO : int
    val IDOK : int
    val IDRETRY : int
    val IDYES : int

    structure MessageBoxStyle :
      sig
        include BIT_FLAGS
        val MB_ABORTRETRYIGNORE : flags
        val MB_APPLMODAL : flags
        val MB_DEFAULT_DESKTOP_ONLY : flags
        val MB_DEFBUTTON1 : flags
        val MB_DEFBUTTON2 : flags
        val MB_DEFBUTTON3 : flags
        val MB_DEFBUTTON4 : flags
        val MB_HELP : flags
        val MB_ICONASTERISK : flags
        val MB_ICONERROR : flags
        val MB_ICONEXCLAMATION : flags
        val MB_ICONHAND : flags
        val MB_ICONINFORMATION : flags
        val MB_ICONQUESTION : flags
        val MB_ICONSTOP : flags
        val MB_ICONWARNING : flags
        val MB_NOFOCUS : flags
        val MB_OK : flags
        val MB_OKCANCEL : flags
        val MB_RETRYCANCEL : flags
        val MB_RIGHT : flags
        val MB_RTLREADING : flags
        val MB_SERVICE_NOTIFICATION : flags
        val MB_SERVICE_NOTIFICATION_NT3X : flags
        val MB_SETFOREGROUND : flags
        val MB_SYSTEMMODAL : flags
        val MB_TASKMODAL : flags
        val MB_TOPMOST : flags
        val MB_USERICON : flags
        val MB_YESNO : flags
        val MB_YESNOCANCEL : flags
      end

    val MessageBox : HWND option * string * string * MessageBoxStyle.flags -> int
    val MessageBeep: MessageBoxStyle.flags -> unit

end
polyml-5.6/documentation/Winref/Metafile.html000066400000000000000000000050051265146633400214310ustar00rootroot00000000000000 Windows Interface Reference: Metafile structure

Metafile

The Metafile structure contains functions and structures to create and operate on metafiles. A metafile is essentially a recording of drawing operations which can be stored in a file, passed through the clipboard and replayed as needed.  There are two types of metafile: the old form represented by the HMETAFILE type and the new, enhanced metafile, represented by the HENHMETAFILE type.

structure Metafile :
  sig
    type HENHMETAFILE
    type HMETAFILE
    type HDC
    type RECT = { top: int, left: int, bottom: int, right: int }
    type SIZE = { cx: int, cy: int }
    datatype MapMode = datatype Transform.MapMode
    type METAFILEPICT = {mm: MapMode, size: SIZE, hMF: HMETAFILE}

    type ENHMETAHEADER =
        {
            bounds: RECT, frame: RECT, fileSize: int, records: int,
            handles: int, palEntries: int, resolutionPixels: SIZE,
            resolutionMM: SIZE, openGL: bool
        }

    val CloseEnhMetaFile : HDC -> HENHMETAFILE
    val CloseMetaFile : HDC -> HMETAFILE
    val CopyEnhMetaFile : HENHMETAFILE * string -> HENHMETAFILE
    val CopyMetaFile : HMETAFILE * string -> HMETAFILE
    val CreateEnhMetaFile :
       HDC * string option * RECT *
       {pictureName: string, applicationName: string} option -> HDC
    val CreateMetaFile : string option -> HDC
    val DeleteEnhMetaFile : HENHMETAFILE -> unit
    val DeleteMetaFile : HMETAFILE -> unit
    val GdiComment : HDC * Word8Vector.vector -> unit
    val GetEnhMetaFile : string -> HENHMETAFILE
    val GetEnhMetaFileBits : HENHMETAFILE -> Word8Vector.vector
    val GetEnhMetaFileDescription :
       HENHMETAFILE -> {pictureName: string, applicationName: string} option
    val GetEnhMetaFileHeader : HENHMETAFILE -> ENHMETAHEADER
    val GetMetaFile : string -> HMETAFILE
    val GetMetaFileBitsEx : HMETAFILE -> Word8Vector.vector
    val GetWinMetaFileBits :
       HENHMETAFILE * Transform.MapMode * HDC -> Word8Vector.vector
    val PlayEnhMetaFile : HDC * HENHMETAFILE * RECT -> unit
    val PlayMetaFile : HDC * HMETAFILE -> unit
    val SetEnhMetaFileBits : Word8Vector.vector -> HENHMETAFILE
    val SetMetaFileBits : Word8Vector.vector -> HMETAFILE
    val SetWinMetaFileBits :
       Word8Vector.vector * HDC * {size: SIZE, mapMode: MapMode} option -> HENHMETAFILE

  end
polyml-5.6/documentation/Winref/Mouse.html000066400000000000000000000012471265146633400207770ustar00rootroot00000000000000 Windows Interface Reference: Mouse structure

Mouse

The Mouse structure contains functions to control mouse input to a window.

structure Mouse :
  sig
    type HWND
    type POINT = { x: int, y: int }
    val DragDetect : HWND * POINT -> bool
    val GetCapture : unit -> HWND option
    val GetDoubleClickTime : unit -> Time.time
    val ReleaseCapture : unit -> unit
    val SetCapture : HWND -> HWND option
    val SetDoubleClickTime : Time.time -> unit
    val SwapMouseButton : bool -> bool
  end
polyml-5.6/documentation/Winref/Painting.html000066400000000000000000000037551265146633400214660ustar00rootroot00000000000000 Windows Interface Reference: Painting structure

Painting and Drawing

The Painting structure contains functions to control painting and drawing to a window or device context.

structure Painting :
  sig
  	type HWND and HDC and COLORREF and HRGN

    type RECT = { top: int, left: int, bottom: int, right: int }

    type BinaryRasterOperation
    val R2_BLACK : BinaryRasterOperation
    val R2_COPYPEN : BinaryRasterOperation
    val R2_MASKNOTPEN : BinaryRasterOperation
    val R2_MASKPEN : BinaryRasterOperation
    val R2_MASKPENNOT : BinaryRasterOperation
    val R2_MERGENOTPEN : BinaryRasterOperation
    val R2_MERGEPEN : BinaryRasterOperation
    val R2_MERGEPENNOT : BinaryRasterOperation
    val R2_NOP : BinaryRasterOperation
    val R2_NOT : BinaryRasterOperation
    val R2_NOTCOPYPEN : BinaryRasterOperation
    val R2_NOTMASKPEN : BinaryRasterOperation
    val R2_NOTMERGEPEN : BinaryRasterOperation
    val R2_NOTXORPEN : BinaryRasterOperation
    val R2_WHITE : BinaryRasterOperation
    val R2_XORPEN : BinaryRasterOperation

	type PAINTSTRUCT =
		{ hdc: HDC, erase: bool, paint: RECT, private: Word8Vector.vector }

    val BeginPaint : HWND -> HDC * PAINTSTRUCT
    val EndPaint : HWND * PAINTSTRUCT -> unit
    val GdiFlush : unit -> unit
    val GdiGetBatchLimit : unit -> int
    val GdiSetBatchLimit : int -> int
    val GetBkColor : HDC -> COLORREF
    val GetROP2 : HDC -> BinaryRasterOperation
    val GetUpdateRect : HWND * bool -> RECT option
    val GetUpdateRgn : HWND * HRGN * bool -> Region.ResultRegion
    val GetWindowDC : HWND -> HDC
    val InvalidateRgn : HWND * HRGN * bool -> unit
    val SetBkColor : HDC * COLORREF -> COLORREF
    val SetROP2 : HDC * BinaryRasterOperation -> BinaryRasterOperation
    val WindowFromDC : HDC -> HWND
  end
polyml-5.6/documentation/Winref/Path.html000066400000000000000000000016211265146633400205770ustar00rootroot00000000000000 Windows Interface Reference: Path structure

Path

The Path structure contains functions to create and operate on paths.

structure Path :
  sig
    type HDC and HRGN
    type POINT = {x: int, y: int}
    datatype PointType = datatype Line.PointType

    val AbortPath : HDC -> unit
    val BeginPath : HDC -> unit
    val CloseFigure : HDC -> unit
    val EndPath : HDC -> unit
    val FillPath : HDC -> unit
    val FlattenPath : HDC -> unit
    val GetMiterLimit : HDC -> real
    val GetPath : HDC -> (PointType * POINT) list
    val PathToRegion : HDC -> HRGN
    val SetMiterLimit : HDC * real -> real
    val StrokeAndFillPath : HDC -> unit
    val StrokePath : HDC -> unit
    val WidenPath : HDC -> unit

  end
polyml-5.6/documentation/Winref/Pen.html000066400000000000000000000020231265146633400204220ustar00rootroot00000000000000 Windows Interface Reference: Pen structure

Pen

The Pen structure contains functions and structures to create pens.

structure Pen :
  sig
    type HPEN 
    datatype
      PenStyle =
          PS_ALTERNATE
        | PS_COSMETIC
        | PS_DASH
        | PS_DASHDOT
        | PS_DASHDOTDOT
        | PS_DOT
        | PS_ENDCAP_FLAT
        | PS_ENDCAP_ROUND
        | PS_ENDCAP_SQUARE
        | PS_GEOMETRIC
        | PS_INSIDEFRAME
        | PS_JOIN_BEVEL
        | PS_JOIN_MITER
        | PS_JOIN_ROUND
        | PS_NULL
        | PS_SOLID
        | PS_USERSTYLE

    type COLORREF = Color.COLORREF
    type LOGBRUSH = Brush.LOGBRUSH
    type LOGPEN = PenStyle * int option * COLORREF

    val CreatePen : PenStyle list * int * COLORREF -> HPEN
    val CreatePenIndirect : LOGPEN -> HPEN
    val ExtCreatePen : PenStyle list * int * LOGBRUSH * (int * int) list -> HPEN
  end
polyml-5.6/documentation/Winref/Printing.html000066400000000000000000000014601265146633400214760ustar00rootroot00000000000000 Windows Interface Reference: Printing structure

Printing

The Printing structure contains functions to control a printer device context.

structure Printing :
  sig
    type HDC
    type DOCINFO = { docName: string, output: string option, dType: string option}

    val StartDoc : HDC * DOCINFO -> int
    val StartPage : HDC -> unit
    val AbortDoc : HDC -> unit
    val EndDoc : HDC -> unit
    val EndPage : HDC -> unit

    datatype WMPrintOption = 
		PRF_CHECKVISIBLE | PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND |
		PRF_CHILDREN | PRF_OWNED
  end 
polyml-5.6/documentation/Winref/Rectangle.html000066400000000000000000000015621265146633400216130ustar00rootroot00000000000000 Windows Interface Reference: Rectangle structure

Rectangle

The Rectangle structure contains functions to compute with rectangles.

structure Rectangle :
  sig
  	type POINT = { x: int, y: int }
	type RECT = { top: int, left: int, bottom: int, right: int }

    val EqualRect : RECT * RECT -> bool
    val InflateRect : RECT * int * int -> unit * RECT
    val IntersectRect : RECT * RECT -> bool * RECT
    val IsRectEmpty : RECT -> bool
    val OffsetRect : RECT * int * int -> RECT
    val PtInRect : RECT * POINT -> bool
    val SetRect : int * int * int * int -> RECT
    val SetRectEmpty : unit -> RECT
    val SubtractRect : RECT * RECT -> RECT
    val UnionRect : RECT * RECT -> RECT
  end
polyml-5.6/documentation/Winref/Reference.html000066400000000000000000000251241265146633400216050ustar00rootroot00000000000000 Windows Interface Reference

Windows Interface Reference

The Windows™ interface is arranged as forty structures containing several hundred functions.  It is not possible to provide documentation for all these functions and it would involve duplicating much of the Windows documentation.  Generally the functions take the same arguments and return the same result types as the corresponding function in C but there are some differences to reflect the differences in the type systems.  Functions that return a status result in C generally return unit in ML and raise an OS.Syserr exception if they fail.  Where a C function, such as GetClipBox, takes an argument by reference as a way of returning a result the corresponding ML function simply returns the appropriate result.  This often occurs with functions that extract strings.

Many objects, such as windows and fonts, are represented by handles, e.g. HWND and HFONT.  Frequently, when programming with Windows in C it is necessary to cast between handles and integers, such as when sending a message to obtain the current font for a window.  The ML interface avoids this where possible by using union types but the Globals structure includes functions to perform these casts if necessary.  It also contains a value hNull which can be used as a NULL handle.   Generally though, functions such as SetParent or GetActiveWindow which can take an optional argument or return an optional result use an option type in ML.  Although there are separate types HFONT, HBITMAP, etc for the various kinds of GDI object, these are all the same as HGDIOBJ.  This simplifies the types of functions such as GetCurrentObject and GetObjectType.

Frequently functions in C take an integer argument with constants defined.   Datatypes are used for these in ML where possible.  Where in C several options can be or-ed together in ML a list of a datatype is used.

Drawing and device contexts (GDI functions)

Drawing to a window or printing a page on a printer are handled in the same way.   An abstract device, a device context, is used and all drawing is done on one of these.

Bitmap Arbitrary bitmap patterns
Brush Coloured and patterned brushes
Clipping Clipping regions
Color Colours
DeviceContext Creating device contexts and getting their properties
Font Creating fonts and drawing text
Line Drawing lines
Metafile Recording drawing operations
Path Sequences of lines to form a path
Pen Pens used when drawing lines
Printing Functions used when drawing to a printer
Rectangle Operations on rectangles
Region Areas of a device context
Shape Various shapes
Transform Co-ordinate transforms

Window creation and communication

Class Creating custom window classes.
Window General functions on windows.
Message Sending messages to windows.
Caret The insertion point in an edit window.
Cursor Mouse cursors.
Icon Icons for windows.
Menu Pull-down and pop-up menus.
DragDrop Dragging and dropping files.
Keyboard Keyboard input control.  The input itself is by way of messages.
Mouse Mouse input control.  The input itself is by way of messages.
Painting Painting and drawing to a window.

Dialogue windows

Dialogue boxes are windows typically consisting of a number of controls and a button to confirm or cancel a selection. 

Dialog Custom dialogue boxes.
MessageBox A simple dialogue box containing a piece of text and one or more buttons.
CommonDialog Standard dialogues to select a file, print a document, etc.

Standard window classes

For many purposes a standard window class can be used.  These structures mainly contain values for the window styles which can be used to control the appearance of the window.  Most operations are performed by sending messages from the Message structure.

Button Push buttons, radio buttons and check boxes
Combobox A combination of a list box and an edit box.
Edit Single lines for text input or multiple lines for general editing.
ListBox Selection from a list of options.
Scrollbar Can be used to scroll a window.  This structure includes functions to scroll windows and device contexts..
Static Static windows can be used to display text labels or pictures.

Others

Various other structures.

Globals Various functions on handles and to obtain the handles for the Poly/ML window and application.
WinSystem System information functions.
Resource Resource files can be used to hold resources such as menus, strings, dialogues etc.
Clipboard The clipboard is used to communicate with other applications.
Locale Language definitions to be used with resource files.

Restrictions and Differences between ML and C

The interface was designed so that the definition of functions provided for C should carry over to the ML version.  This simplifies documentation and also makes it relatively easy to port programs between C and ML.  There are a few differences which are worth noting.

Messages and Window Procedures

The major difference is in the way messages are handled.  In C a message is simply an integer but each message is accompanied by two parameters, called wParam and lParam.   Each message defines how these are to interpreted and it is usually necessary to coerce one or other of them to a specific type.  Often lParam is defined to be a pointer to a particular structure.  Sometimes the parameters are pointers which are updated by the window procedure.  In ML messages are fully typed and as much as possible of the message information is made available.  This does require some conversion and it is possible that information could be lost if a message was converted to ML form and then back to C.  For this reason the handling of messages is done slightly differently from C.  In C it is necessary to call DefWindowProc to provide default processing of messages.  If it is not called a result must be returned to the caller.  In ML an option type is used.  If NONE is returned then DefWindowProc is called with the original arguments, before they were converted to ML, otherwise the value given is returned as the result. 

There are generally complications with callback functions due to differences in the notion of a function in ML and C.  In C a function is always the pointer to a piece of code whereas in ML it is a closure.  This makes it impossible to pass ML functions directly to C and instead different callbacks have to be implemented by hand.  For this reason EM_SETWORDBREAKPROC and EM_GETWORDBREAKPROC to set and get the word break procedure for an edit window are not implemented nor are various of the callbacks in the common controls.

Last updated: 28 October 2001 by David Matthews.

polyml-5.6/documentation/Winref/Region.html000066400000000000000000000033641265146633400211340ustar00rootroot00000000000000 Windows Interface Reference: Region structure

Region

The Region structure contains functions to operate on regions.

structure Region:
sig
    type HDC and HBRUSH and HRGN and HPEN
	type POINT = { x: int, y: int }
	type RECT = { top: int, left: int, bottom: int, right: int }

    type RegionOperation
    val RGN_AND : RegionOperation
    val RGN_COPY : RegionOperation
    val RGN_DIFF : RegionOperation
    val RGN_ERROR : RegionOperation
    val RGN_OR : RegionOperation
    val RGN_XOR : RegionOperation

    type ResultRegion
    val COMPLEXREGION : ResultRegion
    val NULLREGION : ResultRegion
    val ERROR : ResultRegion
    val SIMPLEREGION : ResultRegion

    type PolyFillMode
    val ALTERNATE : PolyFillMode
    val WINDING : PolyFillMode

    val CombineRgn : HRGN * HRGN * HRGN * RegionOperation -> ResultRegion
    val CreateEllipticRgn : RECT -> HRGN
    val CreatePolygonRgn : POINT list * PolyFillMode -> HPEN
    val CreateRectRgn : RECT -> HRGN
    val CreateRoundRectRgn : RECT * int * int -> HRGN
    val EqualRgn : HRGN * HRGN -> bool
    val FillRgn : HDC * HRGN * HBRUSH -> unit
    val FrameRgn : HDC * HRGN * HBRUSH * int * int -> unit
    val GetPolyFillMode : HDC -> PolyFillMode
    val GetRgnBox : HRGN -> RECT
    val InvertRgn : HDC * HRGN -> unit
    val OffsetRgn : HRGN * int * int -> ResultRegion
    val PaintRgn : HDC * HRGN -> unit
    val PtInRegion : HRGN * int * int -> bool
    val RectInRegion : HRGN * RECT -> bool
    val SetPolyFillMode : HDC * PolyFillMode -> PolyFillMode
    val SetRectRgn : HRGN * RECT -> bool
  end
polyml-5.6/documentation/Winref/Resource.html000066400000000000000000000032261265146633400214750ustar00rootroot00000000000000 Windows Interface Reference: Resource structure

Resource

The Resource structure contains functions to load resources from a resource file.   In many cases there are functions in other structures which will load the appropriate item from the resource file.

structure Resource :
  sig
   datatype ResourceType =
        RT_CURSOR | RT_BITMAP | RT_ICON | RT_MENU | RT_DIALOG | RT_STRING | RT_FONTDIR |
        RT_FONT | RT_ACCELERATOR | RT_RCDATA | RT_MESSAGETABLE | RT_GROUP_CURSOR |
        RT_GROUP_ICON | RT_VERSION | RT_DLGINCLUDE | RT_ANICURSOR | RT_ANIICON |
        RT_PLUGPLAY | RT_VXD

    type HRSRC
    type HRSRCGLOBAL
    type HINSTANCE

    datatype RESID = IdAsInt of int | IdAsString of string
    val MAKEINTRESOURCE : int -> RESID

    type HUPDATE

    val BeginUpdateResource : string * bool -> HUPDATE
    val EndUpdateResource : HUPDATE * bool -> unit
    val FindResource : HINSTANCE * RESID * ResourceType -> HRSRC
    val FindResourceEx : HINSTANCE * ResourceType * RESID * Locale.LANGID -> HRSRC
    val FreeLibrary : HINSTANCE -> bool
    val LoadLibrary : string -> HINSTANCE
    val LoadResource : HINSTANCE * HRSRC -> HRSRCGLOBAL
    val LoadString : HINSTANCE * RESID -> string
    val LockResource : HRSRCGLOBAL -> Word8Vector.vector
    val SizeofResource : HINSTANCE * HRSRC -> int
    val UpdateResource :
       HUPDATE * ResourceType * RESID * Locale.LANGID * Word8Vector.vector option -> unit
  end
polyml-5.6/documentation/Winref/Scrollbar.html000066400000000000000000000056141265146633400216340ustar00rootroot00000000000000 Windows Interface Reference: Scrollbar structure

Scrollbar

The Scrollbar structure contains functions and styles for scroll bars and functions to scroll windows.

structure Scrollbar:
sig
    type HWND and HDC and HRGN
    type RECT =  { left: int, top: int, right: int, bottom: int }

    structure Style:
    sig
        include BIT_FLAGS where type flags = Window.Style.flags
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
        and SBS_HORZ:flags and SBS_VERT:flags and SBS_TOPALIGN:flags and SBS_LEFTALIGN:flags
        and SBS_BOTTOMALIGN:flags and SBS_RIGHTALIGN:flags and SBS_SIZEBOXTOPLEFTALIGN:flags
        and SBS_SIZEBOXBOTTOMRIGHTALIGN:flags and SBS_SIZEBOX:flags and SBS_SIZEGRIP:flags
    end

    type enableArrows = { enableLeftUp: bool, enableRightDown: bool }

    val ESB_ENABLE_BOTH: enableArrows
    val ESB_DISABLE_BOTH: enableArrows
    val ESB_DISABLE_LEFT: enableArrows
    val ESB_DISABLE_RIGHT: enableArrows
    val ESB_DISABLE_UP: enableArrows
    val ESB_DISABLE_DOWN: enableArrows

    type SCROLLINFO =
        { minPos: int, maxPos: int, pageSize: int, pos: int, trackPos: int }

    datatype ScrollInfoOption =
        SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL | SIF_TRACKPOS

    val SIF_ALL : ScrollInfoOption list

    datatype ScrollBarType = SB_BOTH | SB_CTL | SB_HORZ | SB_VERT
    datatype ScrollWindowFlag = SW_ERASE | SW_INVALIDATE | SW_SCROLLCHILDREN

    val EnableScrollBar : HWND * ScrollBarType * enableArrows -> unit
    val GetScrollInfo : HWND * ScrollBarType * ScrollInfoOption list -> SCROLLINFO
    val GetScrollPos : HWND * ScrollBarType -> int
    val ScrollDC : HDC * int * int * RECT * RECT * HRGN -> RECT
    val ScrollWindow : HWND * int * int * RECT * RECT -> unit
    val ScrollWindowEx : HWND * int * int * RECT * RECT * HRGN * ScrollWindowFlag list -> RECT
    val SetScrollInfo :
        HWND * ScrollBarType * ScrollInfoOption list * SCROLLINFO * bool -> int
    val SetScrollPos : HWND * ScrollBarType * int * bool -> int
    val SetScrollRange : HWND * ScrollBarType * int * int * bool -> bool
    val ShowScrollBar : HWND * ScrollBarType * bool -> unit
end
=
polyml-5.6/documentation/Winref/Shape.html000066400000000000000000000015371265146633400207510ustar00rootroot00000000000000 Windows Interface Reference: Shape structure

Shape

The Shape structure contains functions to draw various shapes.

structure Shape:
  sig
    type HBRUSH
    type HDC
    type POINT = { x: int, y: int }
    type RECT = { top: int, left: int, bottom: int, right: int }

    val Chord : HDC * RECT * POINT * POINT -> unit
    val Ellipse : HDC * RECT -> unit
    val FillRect : HDC * RECT * HBRUSH -> unit
    val FrameRect : HDC * RECT * HBRUSH -> unit
    val InvertRect : HDC * RECT -> unit
    val Pie : HDC * RECT * POINT * POINT -> unit
    val Polygon : HDC * POINT list -> unit
    val Rectangle : HDC * RECT -> unit
    val RoundRect : HDC * RECT * int * int -> unit
  end
polyml-5.6/documentation/Winref/Static.html000066400000000000000000000046051265146633400211370ustar00rootroot00000000000000 Windows Interface Reference: Static structure

Static

The Static structure contains styles and notifications for Static windows.  A static control is often used as part of a dialogue box to display text labels or icons.   They can also be used to display pictures.  The values from the Notification substructure are sent as the code parameter in a WM_NOTIFY message.  Specialised button messages begin with STM_.

structure Static:
sig
    structure Style:
        sig
        include BIT_FLAGS where type flags = Window.Style.flags
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
        and SS_LEFT: flags and SS_CENTER: flags and SS_RIGHT: flags and SS_ICON: flags
        and SS_BLACKRECT: flags and SS_GRAYRECT: flags and SS_WHITERECT: flags
        and SS_BLACKFRAME: flags and SS_GRAYFRAME: flags and SS_WHITEFRAME: flags
        and SS_USERITEM: flags and SS_SIMPLE: flags and SS_LEFTNOWORDWRAP: flags
        and SS_OWNERDRAW: flags and SS_BITMAP: flags and SS_ENHMETAFILE: flags
        and SS_ETCHEDHORZ: flags and SS_ETCHEDVERT: flags and SS_ETCHEDFRAME: flags
        and SS_TYPEMASK: flags and SS_NOPREFIX: flags and SS_NOTIFY: flags and SS_CENTERIMAGE: flags
        and SS_RIGHTJUST: flags and SS_REALSIZEIMAGE: flags and SS_SUNKEN: flags
        and SS_ENDELLIPSIS: flags and SS_PATHELLIPSIS: flags and SS_WORDELLIPSIS: flags
        and SS_ELLIPSISMASK: flags
        end

    structure Notifications:
    sig
        val STN_CLICKED: int
        val STN_DBLCLK: int
        val STN_ENABLE: int
        val STN_DISABLE: int
    end
end
polyml-5.6/documentation/Winref/Transform.html000066400000000000000000000050511265146633400216570ustar00rootroot00000000000000 Windows Interface Reference: Transform structure

Transform

The Transform structure contains functions to apply various co-ordinate transforms within a window or device context.

structure Transform:
  sig
	type HDC
	type HWND
	type POINT = { x: int, y: int }
	type SIZE = { cx: int, cy: int }
    datatype Fraction = Fraction of {num: int, denom: int}
	
    datatype
      MapMode =
          MM_ANISOTROPIC
        | MM_HIENGLISH
        | MM_HIMETRIC
        | MM_ISOTROPIC
        | MM_LOENGLISH
        | MM_LOMETRIC
        | MM_TEXT
        | MM_TWIPS
    val MM_MAX : MapMode
    val MM_MAX_FIXEDSCALE : MapMode
    val MM_MIN : MapMode

	type XForm = { m11: real, m12: real, m21: real, m22: real, dx: real, dy: real }

    type XFormType
    val MWT_IDENTITY : XFormType
    val MWT_LEFTMULTIPLY : XFormType
    val MWT_MAX : XFormType
    val MWT_MIN : XFormType
    val MWT_RIGHTMULTIPLY : XFormType

    type GraphicsMode
    val GM_ADVANCED : GraphicsMode
    val GM_COMPATIBLE : GraphicsMode
    val GM_ERROR : GraphicsMode

    val ClientToScreen : HWND * POINT -> POINT
    val CombineTransform : XForm * XForm -> XForm
    val DPtoLP : HDC * POINT list -> POINT list
    val GetCurrentPositionEx : HDC -> POINT
    val GetGraphicsMode : HDC -> GraphicsMode
    val GetMapMode : HDC -> MapMode
    val GetViewportExtEx : HDC -> SIZE
    val GetViewportOrgEx : HDC -> POINT
    val GetWindowExtEx : HDC -> SIZE
    val GetWindowOrgEx : HDC -> POINT
    val GetWorldTransform : HDC -> XForm
    val LPtoDP : HDC * POINT list -> POINT list
    val MapWindowPoints : HWND * HWND * POINT list -> POINT list
    val ModifyWorldTransform : HDC * XForm * XFormType -> unit
    val OffsetViewportOrgEx : HDC * int * int -> unit * POINT
    val OffsetWindowOrgEx : HDC * int * int -> unit * POINT
    val ScaleViewportExtEx : HWND * Fraction * Fraction -> SIZE
    val ScaleWindowExtEx : HWND * Fraction * Fraction -> SIZE
    val ScreenToClient : HWND * POINT -> POINT
    val SetGraphicsMode : HDC * GraphicsMode -> GraphicsMode
    val SetMapMode : HDC * MapMode -> MapMode
    val SetViewportExtEx : HDC * int * int -> unit * SIZE
    val SetViewportOrgEx : HDC * int * int -> unit * POINT
    val SetWindowExtEx : HDC * int * int -> unit * SIZE
    val SetWindowOrgEx : HDC * int * int -> unit * POINT
    val SetWorldTransform : HDC * XForm -> unit

  end
polyml-5.6/documentation/Winref/WinSystem.html000066400000000000000000000065421265146633400216540ustar00rootroot00000000000000 Windows Interface Reference: WinSystem structure

WinSystem

The WinSystem structure contains functions that obtain system information.    This is quite limited because the Windows structure in the standard basis library provides much of the information in this category.

structure WinSystem :
  sig
    type SystemMetrics
    val SM_ARRANGE : SystemMetrics
    val SM_CLEANBOOT : SystemMetrics
    val SM_CMOUSEBUTTONS : SystemMetrics
    val SM_CXBORDER : SystemMetrics
    val SM_CXCURSOR : SystemMetrics
    val SM_CXDLGFRAME : SystemMetrics
    val SM_CXDOUBLECLK : SystemMetrics
    val SM_CXDRAG : SystemMetrics
    val SM_CXEDGE : SystemMetrics
    val SM_CXFIXEDFRAME : SystemMetrics
    val SM_CXFRAME : SystemMetrics
    val SM_CXFULLSCREEN : SystemMetrics
    val SM_CXHSCROLL : SystemMetrics
    val SM_CXHTHUMB : SystemMetrics
    val SM_CXICON : SystemMetrics
    val SM_CXICONSPACING : SystemMetrics
    val SM_CXMAXIMIZED : SystemMetrics
    val SM_CXMAXTRACK : SystemMetrics
    val SM_CXMENUCHECK : SystemMetrics
    val SM_CXMENUSIZE : SystemMetrics
    val SM_CXMIN : SystemMetrics
    val SM_CXMINIMIZED : SystemMetrics
    val SM_CXMINSPACING : SystemMetrics
    val SM_CXMINTRACK : SystemMetrics
    val SM_CXSCREEN : SystemMetrics
    val SM_CXSIZE : SystemMetrics
    val SM_CXSIZEFRAME : SystemMetrics
    val SM_CXSMICON : SystemMetrics
    val SM_CXSMSIZE : SystemMetrics
    val SM_CXVSCROLL : SystemMetrics
    val SM_CYBORDER : SystemMetrics
    val SM_CYCAPTION : SystemMetrics
    val SM_CYCURSOR : SystemMetrics
    val SM_CYDLGFRAME : SystemMetrics
    val SM_CYDOUBLECLK : SystemMetrics
    val SM_CYDRAG : SystemMetrics
    val SM_CYEDGE : SystemMetrics
    val SM_CYFIXEDFRAME : SystemMetrics
    val SM_CYFRAME : SystemMetrics
    val SM_CYFULLSCREEN : SystemMetrics
    val SM_CYHSCROLL : SystemMetrics
    val SM_CYICON : SystemMetrics
    val SM_CYICONSPACING : SystemMetrics
    val SM_CYKANJIWINDOW : SystemMetrics
    val SM_CYMAXIMIZED : SystemMetrics
    val SM_CYMAXTRACK : SystemMetrics
    val SM_CYMENU : SystemMetrics
    val SM_CYMENUCHECK : SystemMetrics
    val SM_CYMENUSIZE : SystemMetrics
    val SM_CYMIN : SystemMetrics
    val SM_CYMINIMIZED : SystemMetrics
    val SM_CYMINSPACING : SystemMetrics
    val SM_CYMINTRACK : SystemMetrics
    val SM_CYSCREEN : SystemMetrics
    val SM_CYSIZE : SystemMetrics
    val SM_CYSIZEFRAME : SystemMetrics
    val SM_CYSMCAPTION : SystemMetrics
    val SM_CYSMICON : SystemMetrics
    val SM_CYSMSIZE : SystemMetrics
    val SM_CYVSCROLL : SystemMetrics
    val SM_CYVTHUMB : SystemMetrics
    val SM_DBCSENABLED : SystemMetrics
    val SM_DEBUG : SystemMetrics
    val SM_MENUDROPALIGNMENT : SystemMetrics
    val SM_MIDEASTENABLED : SystemMetrics
    val SM_MOUSEPRESENT : SystemMetrics
    val SM_MOUSEWHEELPRESENT : SystemMetrics
    val SM_NETWORK : SystemMetrics
    val SM_PENWINDOWS : SystemMetrics
    val SM_RESERVED1 : SystemMetrics
    val SM_RESERVED2 : SystemMetrics
    val SM_RESERVED3 : SystemMetrics
    val SM_RESERVED4 : SystemMetrics
    val SM_SECURE : SystemMetrics
    val SM_SHOWSOUNDS : SystemMetrics
    val SM_SLOWMACHINE : SystemMetrics
    val SM_SWAPBUTTON : SystemMetrics
    val GetSystemMetrics : SystemMetrics -> int
  end
polyml-5.6/documentation/Winref/Window.html000066400000000000000000000147331265146633400211620ustar00rootroot00000000000000 Windows Interface Reference: Window structure

Window

The Window structure contains functions and structures to create and operate on windows. Many other operations are available by sending messages to windows.

structure Window :
sig
    type HWND and HINSTANCE and HMENU
    type POINT = { x: int, y: int }
    type RECT =  { left: int, top: int, right: int, bottom: int }

    structure Style:
    sig
        include BIT_FLAGS
        val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags
        and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags
        and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags
        and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags
        and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags
        and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags
        and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags
        and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags
    end

    datatype WindowPositionStyle =
            SWP_ASYNCWINDOWPOS
        |    SWP_DEFERERASE
        |    SWP_FRAMECHANGED
        |    SWP_HIDEWINDOW
        |    SWP_NOACTIVATE
        |    SWP_NOCOPYBITS
        |    SWP_NOMOVE
        |    SWP_NOOWNERZORDER
        |    SWP_NOREDRAW
        |    SWP_NOSENDCHANGING
        |    SWP_NOSIZE
        |    SWP_NOZORDER
        |    SWP_SHOWWINDOW
        |    SWP_OTHER of int

    datatype ShowWindowOptions =
        SW_HIDE
    |    SW_MAXIMIZE
    |    SW_MINIMIZE
    |    SW_RESTORE
    |    SW_SHOW
    |    SW_SHOWDEFAULT
    |    SW_SHOWMAXIMIZED
    |    SW_SHOWMINIMIZED
    |    SW_SHOWMINNOACTIVE
    |    SW_SHOWNA
    |    SW_SHOWNOACTIVATE
    |    SW_SHOWNORMAL

    val SW_NORMAL: ShowWindowOptions
    val SW_MAX: ShowWindowOptions

    val ShowWindow: HWND * ShowWindowOptions -> bool

    datatype GetWindowFlags =
        GW_CHILD
    |    GW_HWNDFIRST
    |    GW_HWNDLAST
    |    GW_HWNDNEXT
    |    GW_HWNDPREV
    |    GW_OWNER

    datatype ParentType =
          ChildWindow of {id: int, parent: HWND}
        | PopupWindow of HMENU
        | PopupWithClassMenu

    val GWL_EXSTYLE : int
    val GWL_HINSTANCE : int
    val GWL_HWNDPARENT : int
    val GWL_ID : int
    val GWL_STYLE : int
    val GWL_USERDATA : int

    val AdjustWindowRect : RECT * Style.flags * bool -> RECT
    val AdjustWindowRectEx :  RECT * Style.flags * bool * int -> RECT
    val ArrangeIconicWindows : HWND -> int
    val BringWindowToTop : HWND -> unit
    val CW_USEDEFAULT : int
    val ChildWindowFromPoint : HWND * POINT -> HWND option
    val CloseWindow : HWND -> unit
    val CreateWindow :
       {x: int, y: int, init: 'a, name: string, class: 'a Class.ATOM,
         style: Style.flags, width: int, height: int,
         instance: HINSTANCE, relation: ParentType} -> HWND
    val DestroyWindow: HWND -> unit
    val FindWindow: string * string option -> HWND
    val FindWindowEx: HWND option * HWND option * string * string option -> HWND
    val GetClassName : HWND -> string
    val GetClientRect : HWND -> RECT
    val GetDesktopWindow : unit -> HWND
    val GetForegroundWindow : unit -> HWND
    val GetLastActivePopup : HWND -> HWND
    val GetNextWindow : HWND * GetWindowFlags -> HWND
    val GetParent : HWND -> HWND option
    val GetTopWindow : HWND option-> HWND option
    val GetWindow : HWND * GetWindowFlags -> HWND option
    val GetWindowContextHelpId : HWND -> int
    val GetWindowLong : HWND * int -> int
    val GetWindowRect : HWND -> RECT
    val GetWindowText : HWND -> string
    val GetWindowTextLength : HWND -> int
    val IsChild : HWND * HWND -> bool
    val IsIconic : HWND -> bool
    val IsWindow : HWND -> bool
    val IsWindowVisible : HWND -> bool
    val IsZoomed : HWND -> bool
    val MoveWindow : {x: int, y: int, hWnd: HWND, width: int, height: int, repaint: bool} -> unit
    val OpenIcon : HWND -> unit
    val SetForegroundWindow : HWND -> bool
    val SetParent : HWND * HWND option -> HWND
    val SetWindowContextHelpId : HWND * int -> unit
    val SetWindowLong : HWND * int * int -> int
    val SetWindowPos : HWND * HWND * int * int * int * int * WindowPositionStyle list -> unit
    val SetWindowText : HWND * string -> unit
    val SubclassWindow :
       HWND *
       (HWND * Message.Message * 'a -> Message.LRESULT option * 'a) * 'a -> unit
    val WindowFromPoint : POINT -> HWND option
end

datatype ParentType = ChildWindow of {id: int, parent: HWND} | PopupWindow of HMENU   |  PopupWithClassMenu
The ParentType datatype is used as one of the arguments to CreateWindow.  PopupWithClassMenu and PopupWindow both create top-level windows.  PopupWindow provides a menu to be used whereas PopupWithClassMenu uses the menu, if any, given when the class was created.  ChildWindow creates a child of the given parent window and provides an id for the child.  All children must have different identifiers.   The identifier is used in WM_NOTIFY messages to notify the parent about changes in the child and can be used to find a child window from the parent using GetDlgItem.

 

Subclassing

It is possible to replace a window procedure for a window by subclassing the window.  This is useful where a window is required which is almost the same as, say an Edit window, but it needs to process a few messages in a special way.  A new window procedure is installed which process the particular messages but calls the original window procedure for any of the others.

(The terminology is, in my opinion confusing: subclassing a window does not create a new class of window but changes only a single window).  In C this is done using the SetWindowLong function: in ML there is a SubclassWindow function which does this and automatically calls the window procedure of the base class for any messages which are not otherwise processed.

polyml-5.6/documentation/main.css000066400000000000000000000010571265146633400172240ustar00rootroot00000000000000BODY { font-family: arial, sans-serif; font-size: 11pt; line-height: 1.4em; color: #000000; background-color: #FFFFFF; } CODE { font-size: 11pt; font-family: Courier New, Courier, mono; } .packet { margin: 4px; margin-left: 1em; padding: 2px; padding-left: 1em; padding-right: 1em; white-space: pre; font-family: Courier New, Courier, mono; font-size: 11pt; border: 1px dotted; } .packet-name { /* font-weight: bold; */ color: #770000; } .function { font-family: "Courier New", Courier, mono; } polyml-5.6/exportPoly.sml000066400000000000000000000054571265146633400156270ustar00rootroot00000000000000(* Title: Bootstrap code. Author: David Matthews Copyright David Matthews 2005-2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) val () = RunCall.addOverload Bootstrap.convString Bootstrap.convStringName; val () = RunCall.addOverload Bootstrap.convInt "convInt"; val () = RunCall.addOverload Bootstrap.convWord "convWord"; (* Build the main basis library. *) val () = Bootstrap.use "basis/build.sml"; (* We've now set up the new name space so everything has to be compiled into that rather than the old space. *) local (* Bootstrap.use adds the path given as -I path but PolyML.make and PolyML.use don't. Add the path explicitly. *) val args = CommandLine.arguments(); fun getPath [] = "." (* Default path *) | getPath ("-I" :: outFile :: _) = outFile | getPath (_::tl) = getPath tl val path = getPath args in (* FFI. *) val () = PolyML.make (OS.Path.concat(path, "mlsource/extra/CInterface")); val () = PolyML.use (OS.Path.concat(path, "mlsource/extra/CInterface/clean")); (* XWindows/Motif *) val () = let val xcall: int*int->int*int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows; (* See if the RTS supports the X GetTimeOfDay call. *) val isX = (xcall(30, 0); true) handle _ => false in if isX then ( PolyML.make "mlsource/extra/XWindows"; PolyML.make "mlsource/extra/Motif" ) else () end end; val () = PolyML.print_depth 10; (* Write out the result as an export file. *) local val args = CommandLine.arguments(); (* If we have -o filename use that as the output name. N.B. polyImport takes the first argument that is not recognised as an RTS argument and treats that as the file name so any -o must occur AFTER the import file. *) fun getFile [] = "polyexport" (* Default file name *) | getFile ("-o" :: outFile :: _) = outFile | getFile (_::tl) = getFile tl val fileName = getFile args in val () = PolyML.shareCommonData PolyML.rootFunction; val () = PolyML.export(fileName, PolyML.rootFunction) end; polyml-5.6/imports/000077500000000000000000000000001265146633400144075ustar00rootroot00000000000000polyml-5.6/imports/polymli386.txt000066400000000000000000156271231265146633400171170ustar00rootroot00000000000000Objects 20272 Root 4837 4837:O1|@4838 4838:D3,464|3b650c7303ff55248b0504e039b2909090e88a8a0000ff7504b84ee179b250896504ff7504b8cae079b250896504b8386b7ab29090e87af1170089c1b8c87892b289ca90ff12ff7504b87ae079b250896504bb01000000b827000000ff1508cd520883c40459894d04eb1b9090908b650483c4045b895d04b801000000909090ff1568ba5208ff7504b9b6e079b25189650489c1b80100000089ca90ff1283c40458894504eb0d9090908b650483c4045b895d043b650c7303ff5524eb888b650483c4045b895d04ff7504b8fee079b250896504bb01000000b8270000009090ff1508cd520883c40459894d04eb1b9090908b650483c4045b895d04b803000000909090ff1568ba5208ff7504b93ae179b25189650489c1b80100000089ca90ff1283c40458894504eb0d9090908b650483c4045b895d043b650c7303ff5524eb868b650483c4045b895d04b80300000050ff7504b886e179b250896504bb01000000b827000000ff1508cd520883c40459894d04eb179090908b650483c4045b895d048b042490ff1568ba5208ff7504b9bee179b25189650489c1b80100000089ca90ff1283c40458894504eb0d9090908b650483c4045b895d043b650c7303ff5524eb8c909000000000cc010000|@20256,2097151,@4574|10,0,@4575 18,1,@5208 26,0,$4838+322 38,0,$4838+190 47,0,@5210 54,1,@19175 61,0,@20253 74,0,$4838+110 83,0,0 88,0,19 94,0,I150 121,0,0 130,0,I1 138,0,$4838+170 149,0,0 204,0,$4838+242 213,0,0 218,0,19 226,0,I150 253,0,1 262,0,I1 270,0,$4838+302 281,0,0 333,0,1 342,0,$4838+378 351,0,0 356,0,19 362,0,I150 394,0,I1 402,0,$4838+434 413,0,0 4839:O2|@4841,@4840 4840:O2|@4845,@4844 4841:O2|@4842,@20257 4842:D3,24|8b5204c70201000000b801000000c3900000000014000000|@4843,5,@0|5,0,0 10,0,0 4843:S19|466f726569676e4d656d6f72792e5f2d283129 4844:O2|@5084,@5083 4845:O1|@4846 4846:D3,200|3b650c7303ff5524ff7504b8eee279b2508965046a01bb01000000b80100000090e8b6000000b9ffffffff33480483c10183e1050b088b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70054e579b289c3b80f000000909090ff1568c35208b80100000083c40459894d04c39090908b650483c4045b895d0483381974088b5d04909090ff138b0524f075b7bb20ef79b290e8320c00008b0524f075b78b48108b1424890c24bb983d7ab252e95446000000000000c4000000|@5082,2097151,@44|12,0,$4846+126 23,0,0 28,0,0 34,1,@4847 39,0,-1 81,0,0 90,0,@4854 97,0,7 106,0,I73 111,0,0 151,0,@20261 156,0,@4896 162,1,@4897 168,0,@20261 182,0,@5078 188,1,@5038 4847:D3,300|3b650c7303ff5524a801756b8b08833905750f8b480489c83b650c7303ff5524ebe6833903756a837904037507ba0d000000eb1f837904017507ba09000000eb12837904077407ba01000000eb05ba050000000bd38b74240483e60d83fe0174108b4804b88ce479b28b5d04909090ff138b742404eb05e98200000083ce0d8974240489de89d38b480489c8e96fffffff83790401752f8b54240483e20383fa01740e8b4804b88ce479b28b5d0490ff138b54240483ca03895424048b480489c8e93affffff89da83ca038b74240483e60383fe01740e8b4804b88ce479b28b5d0490ff138b74240483ce038974240489de89d38b480489c8e902ffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048918c2040090900000000028010000|@4853,31,@1|46,0,6 59,0,4 72,0,0 79,0,2 101,0,@4848 167,0,@4848 219,0,@4848 4848:O4|12,@4850,@4851,@4849 4849:O5|@4852,216,0,216,0 4850:S6|546872656164 4851:S53|5468652073616d65206174747269627574652061707065617273206d6f7265207468616e206f6e636520696e20746865206c697374 4852:S18|2e2f62617369732f5468726561642e736d6c 4853:S38|5468726561642e5468726561642e6174747273546f576f7264283129636f6e76657274283329 4854:O1|@4855 4855:D3,256|3b650c7303ff5524bb01000000b8030000009090ff1508c2520883f80175718b050cf075b783f803752ab90cf075b733c083c0fef00fc10183c0fe83f8017514bb03000000b801000000909090e8c2000000eb646a01bb01000000b80100000090e88afdffffb9ffffffff33480483c10183e1050b088b45008d40f03b45087303ff5520894500c740fc03000000eb05e928000000c74008010000008948049090c700f8e879b289c3b80f0000009090ff1568c35208eb30e92b000000ff7504b93ae679b2518965048b48048b1089c8ff1283c40458894504eb0d9090908b650483c4045b895d043b650c7303ff5524e913ffffff90909000000000fc000000|@4861,2097151,@4|9,0,0 14,0,1 22,0,I62 33,0,@20258 43,0,@20258 65,0,1 70,0,0 78,1,@4856 87,0,0 92,0,0 98,1,@4847 103,0,-1 152,0,0 163,0,@4858 170,0,7 178,0,I73 193,0,$4855+222 4856:D3,584|3b650c7303ff552483fb01756cb8010000008b0d0cf075b783f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc7b90cf075b733c083c0fef00fc10183c0fe83f8017422bb0cf075b7b80300000090ff1568c352083b650c730aeb05e905000000ff5524eb8a8b453c8b400483e00d83f8017507b805000000eb2083f8057507b807000000eb1483f8097407b801000000eb05b80300000083f00283f80574128b4d3c8b553c8b520483e2f383ca0589510450b8010000008b0d14f075b783f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc7b914f075b733c083c0fef00fc10183c0fe83f801741cbb14f075b7b8030000009090ff1568c352083b650c7303ff5524eb908b051cf075b7a801751bff70048b18b809000000ff1568c35208583b650c7303ff5524ebe1b80100000089051cf075b7b914f075b733c083c002f00fc10183c00283f803741cb814f075b790ff15e8c25208bb14f075b7b805000000ff1568c352088b453c833c24037421833c24017414833c24077407b901000000eb13b905000000eb0cb909000000eb05b90d0000008b553c8b520483e2f30bca894804833c24017406833c2403751b8b453c8b400c83f8017410bb01000000b817000000ff1568c35208b90cf075b783c40433c083c002f00fc10183c00283f803741bb80cf075b7ff15e8c25208bb0cf075b7b805000000ff2568c35208b801000000c30000000044020000|@4857,2097151,@2|14,0,0 20,0,@20258 30,0,0 38,0,20000 45,0,0 76,0,@20258 98,0,@20258 103,0,1 110,0,I73 146,0,2 158,0,3 170,0,0 177,0,1 209,0,0 215,0,@20259 225,0,0 233,0,20000 240,0,0 271,0,@20259 293,0,@20259 298,0,1 306,0,I73 322,0,@20260 336,0,4 342,0,I73 358,0,0 364,0,@20260 369,0,@20259 391,0,@20259 398,0,I69 403,0,@20259 408,0,2 414,0,I73 440,0,0 447,0,2 454,0,4 461,0,6 503,0,0 508,0,11 514,0,I73 519,0,@20258 544,0,@20258 550,0,I69 555,0,@20258 560,0,2 566,0,I73 571,0,0 4857:S35|5369676e616c2e73696754687265616428312962726f6164436173745765616b283229 4858:O1|@4859 4859:D3,28|3b650c7303ff5524bb01000000e95efdffff90900000000018000000|@4860,2097151,@3|9,0,0 14,1,@4856 4860:S38|5369676e616c2e73696754687265616428312962726f6164436173745765616b283129283129 4861:S19|5369676e616c2e736967546872656164283129 4862:O6|@4863,@4577,@4864,@4578,@20262,@4576 4863:O2|4096,@5 4864:O14|@4866,@4867,@4871,0,0,@4873,0,@4874,@4882,@4886,4096,0,@4889,@4865 4865:O1|@4893 4866:S6|7374644f7574 4867:O1|@4868 4868:O2|@4869,I149 4869:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b83b00000051ff25e8c1520890900000000028000000|@4870,2097151,@6|9,0,0 23,0,29 30,0,I61 4870:S50|4c696272617279494f537570706f72742e777261704f757446696c654465736372283529746578745072696d57722d283129 4871:O2|@4872,I149 4872:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b80f00000051ff25e8c1520890900000000028000000|@4870,2097151,@7|9,0,0 23,0,7 30,0,I61 4873:O1|I149 4874:O1|@4875 4875:O2|@4876,I149 4876:D3,164|3b650c7303ff55248b4808f6000174148b18f6c301740783fb017d19eb06f643ff1074118b58048b30b8a8eb79b28b5d049090ff13f640040174188b7004f7c601000000740783fe017d16eb06f646ff10740e8b7004b8a8eb79b28b5d0490ff138b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f048b5904891f8b3424893c248b5a04b81700000056ff25e8c1520890909000000000a0000000|@4881,2097151,@8|42,0,@4877 87,0,@4877 142,0,11 149,0,I61 4877:O4|11,@4879,0,@4878 4878:O5|@4880,153,0,153,0 4879:S9|537562736372697074 4880:S26|2e2f62617369732f4c696272617279537570706f72742e736d6c 4881:S49|4c696272617279494f537570706f72742e777261704f757446696c65446573637228352977726974654172726179283129 4882:O1|@4883 4883:O2|@4884,I149 4884:D3,164|3b650c7303ff5524f6000174148b08f6c101740783f9017d1ceb06f641ff1074148b48048b58088b30b8a8eb79b28b5d049090ff13f640040174158b5804f6c301740783fb017d19eb06f643ff1074118b58048b7008b8a8eb79b28b5d0490ff1383c1088b75008d76f03b75087303ff5520897500c746fc03000000895e08894e048b4808890e8b3c248934248b5a04b81700000057ff25e8c1520800000000a0000000|@4885,2097151,@9|42,0,@4877 87,0,@4877 145,0,11 152,0,I61 4885:S50|4c696272617279494f537570706f72742e777261704f757446696c6544657363722835297772697465566563746f72283129 4886:O1|@4887 4887:O2|@4888,I149 4888:D3,64|3b650c7303ff55246a018b5a04b8390000009090ff15e8c15208a801740783f8017f0eeb06f640ff107406b801000000c3b803000000c390000000003c000000|@4870,2097151,@10|14,0,28 22,0,I61 44,0,0 50,0,1 4889:O1|@4890 4890:O3|@4891,@4875,@4887 4891:D3,92|3b650c7303ff55245052b8010000008b4a0889caff1283f801742f8b04248b48048b44240489ca90ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b80100000083c408c3900000000058000000|@4892,1048575,@11|11,0,0 75,0,0 4892:S40|5072696d494f28292e6175676d656e7457726974657228312977726974654172724e42272d283129 4893:O3|@4894,@4883,@4887 4894:D3,92|3b650c7303ff55245052b8010000008b4a0889caff1283f801742f8b04248b48048b44240489ca90ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b80100000083c408c3900000000058000000|@4895,1048575,@12|11,0,0 75,0,0 4895:S40|5072696d494f28292e6175676d656e7457726974657228312977726974655665634e42272d283129 4896:S31|556e61626c6520746f20637265617465207369676e616c207468726561640a 4897:D3,588|3b650c7303ff55248b48148b0983f9037560f6c3017407b903000000eb068b0b8d4c090183f9017507b901000000eb6a89caf6c201740583ea027105ff5538ebf6f6c201740783fa017d08eb37f642ff107531f6c3017407be03000000eb068b338d743601f6c2017413f7c601000000eb05e97f01000074043bd6eb05ff5538ebf77c0d89c6b8a8f179b28b5d0490ff13f6c301740989daeb12e92e00000083c208d1ea0fb614138d54120183fa15741cf6c101740583e9027105ff5538ebf63b650c7303ff5524e957ffffff83f901754cf6c3017407b903000000eb068b0b8d4c09018b55008d52f03b55087303ff5520895500c742fc03000000894a08c7420401000000891a5268f0f179b2ff70108d5c2404e82239000083c408c38b55008d52f83b55087303ff5520895500c742fc01000000890a50535152bb010000008b442408e81a3000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b50048951088b188959048b7008893151686c3d7ab28b4c2410ff71108d5c240489c8e8b23800008b44241083c408ff7010bb983d7ab2e89e3800006a018b5c24048b44240890e8b62f00008b4d008d49f03b4d087303ff5520894d00c741fc030000008b500483c4088951088b188959048b700889315168a03d7ab28b4c2408ff71108d5c240489c890e84a38000083c40cc3f6c3017407b903000000eb068b0b8d4c09018b55008d52f03b55087303ff5520895500c742fc03000000894a08c7420401000000891a5268cc3d7ab2ff70108d5c2404e8fe37000083c408c390900000000048020000|@5081,2097151,@43|24,0,1 42,0,0 89,0,1 135,0,@4898 216,0,1 258,0,0 266,0,@4901 278,1,@5038 317,0,0 326,1,@5025 372,0,@5077 390,1,@5038 405,0,@5078 410,1,@5038 426,1,@5025 475,0,@5079 494,1,@5038 508,0,1 550,0,0 558,0,@5080 570,1,@5038 4898:O4|11,@4879,0,@4899 4899:O5|@4900,680,0,680,0 4900:S18|2e2f62617369732f537472696e672e736d6c 4901:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@5037,1048575,@33|12,1,@4902 4902:D3,248|3b650c7303ff55248b48088b500c8b1283fa0375548b55008d52dc3b55087303ff5520895500c742fc03000000c7420828f379b2c7420438f379b28b3189328d7a10c747fc04000000c7470c60f379b2895708c747049cf379b2c7072ce039b289c289f88b5d04ff138b108b7308f7c601000000740bf6020174063b327e35eb05ff5538ebf556ff7304ff3350e84e2600008b4424088b4c2410894424108b44240c8944240c8b5c24045883c40851e9e02a00008b78148b3f83ff0575148b7b048b0c24893c24568b3389f351e9c22a00008b3a8b0c24893c2456ff33ff730452508b5804b80100000051e96c32000000000000f4000000|@5036,1048575,@32|48,0,@4903 55,0,@4904 76,0,@4906 86,0,@4908 92,0,@4580 142,1,@5009 176,1,@5024 206,1,@5024 230,0,0 236,1,@5034 4903:S6|6f7574707574 4904:O4|@4579,@4905,0,0 4905:S12|436c6f73656453747265616d 4906:O5|@4907,610,0,610,0 4907:S25|2e2f62617369732f426173696353747265616d494f2e736d6c 4908:S2|496f 4909:O1|@4910 4910:O1|@4911 4911:D3,664|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba64f679b2eb5d8b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b3534e039b25089d889f2ff128b0c248b5104f6c201740783fa037d14eb06f642ff10740cbb64f679b2eb70e9bb0100008b19f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530889168b3d3ce039b25089f089fa9090ff128b4c24048b118b5904f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500eb05e9cf000000c746fc02000000895e048b1a891e8b3d3ce039b25089f089fa90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c7410468187ab289018d410cc740fc02000000894804c70000187ab28d480cc741fc02000000894104c70180187ab28d410cc740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c70100187ab28d590cc743fc02000000894b04c7039c187ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c70000187ab28d480cc741fc02000000894104c70110187ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c70100187ab28d510cc742fc02000000894a04c702bc187ab28b45008d40dc3b45087303ff5520894500c740fc02000000895004c700d8187ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000094020000|@5008,1048575,@25|30,0,@4912 87,0,@4581 123,0,@4912 185,0,@4582 262,0,@4582 301,0,@4999 322,0,@4992 341,0,@5001 360,0,@4992 379,0,@4993 428,0,@4992 447,0,@5003 483,0,@4992 502,0,@4993 554,0,@4992 573,0,@5005 606,0,@5007 628,0,0 635,0,0 642,0,1 648,0,0 4912:O2|@4913,0 4913:O2|3,@4914 4914:S4|2e2e2e7d 4915:O1|@4916 4916:D3,40|3b650c7303ff55248b48048b1424890c24bb010000008b0889c852e91c0000000000000024000000|@4958,1048575,@24|18,0,0 28,1,@4917 4917:D3,4620|3b650c7303ff5524f60001745e833805755e8b4c2404f6c101740783f9037f0feb06f641ff107407b8ec087ab2eb6ff6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b804097ab2eb708b500889cbf6c301740583eb027111ff5538eb0ae9130f0000e91c030000ebea8b75008d76f43b75087303ff5520897500c746fc02000000895e048b1a891e8b3d3ce039b2eb05e9ff000000515289f089fa909090ff12595af6c201740583ea027105ff5538ebf68b5d008d5bf4eb05e98d0000003b5d087303ff5520895d00c743fc020000008953048b4904890b8b0d4ce039b25053b820177ab289ca909090ff1289c15889ca90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e8177ab289018d410cc740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab28d410cc740fc020000008948045989088b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c7011c187ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c700010000008338017554f640100175538b48108379040174618b11833a07755f817a04b7000000745b817a04f7000000746d837a0451746c8b5d008d5bd03b5d087303ff5520895d00c743fc02000000c74304e8177ab289038d730ceb0ae91d010000e9ba000000c746fc02000000895e04c7061c187ab2eb0fe901010000e93b000000e9f70000008d460cc740fc05000000897010c7400c01000000eb0ae9dc000000e9d7000000c7400803000000c7400407000000c70001000000eb5e8b5d008d5bd03b5d087303ff5520895d00c743fc02000000c74304e8177ab289038d730cc746fc02000000895e04c7061c187ab28d460cc740fc05000000897010c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e8177ab289018d410cc740fc02000000894804c7001c187ab289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c700010000008b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70028187ab28d480cc741fc02000000894104c70138187ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c20400833815756d8b4c2404f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4808890a8b1d3ce039b2ff700489d089da9090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556eb05e9e4010000f6401001755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c20400833819756e8b4c2404f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4808890a8b1d3ce039b2ff700489d089da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556eb05e9e4010000f6401001755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c2040083382f756e8b4c2404f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4808890a8b1d3ce039b2ff700489d089da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556eb05e9e4010000f6401001755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c204008138cf000000756b8b4c2404f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4808890a8b1d3ce039b2ff700489d089daff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556eb05e9e4010000f6401001755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c20400833811756e8b4c2404f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4808890a8b1d3ce039b2ff700489d089da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556eb05e9e4010000f6401001755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c204008b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c204008b088b09f6c101756b8b542404f6c201740583ea027105ff5538ebf68b58048b70088b45008d40f43b45087303ff5520894500c740fc020000008950048930538b11909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701070000008338017556f6401001eb05e9e0010000755c8b5010837a040174588b1a833b077556817b04b70000007467817b04f70000007463837b045174628b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab2eb05e92201000089068d7e0cc747fc02000000eb0fe9b1000000e90a010000e944000000897704c7071c187ab28d470cc740fc05000000eb0fe9eb000000e9e6000000e9e1000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb5e8b75008d76d03b75087303ff5520897500c746fc02000000c74604e8177ab289068d7e0cc747fc02000000897704c7071c187ab28d470cc740fc05000000897810c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b55008d52d03b55087303ff5520895500c742fc02000000c74204e8177ab289028d420cc740fc02000000895004c7001c187ab289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c700010000008b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c70028187ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000c204008b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c20400900000000008120000|@4998,1048575,@23|41,0,@4918 81,0,@4920 152,0,@4582 232,0,@4584 239,0,@4984 285,0,@4990 306,0,@4992 325,0,@4993 374,0,@4994 394,0,0 401,0,0 408,0,1 414,0,0 448,0,91 457,0,123 496,0,@4990 529,0,@4994 566,0,0 585,0,1 592,0,3 598,0,0 631,0,@4990 652,0,@4994 672,0,0 679,0,1 686,0,3 692,0,0 730,0,@4990 751,0,@4994 773,0,0 780,0,1 787,0,3 793,0,0 824,0,0 847,0,@4995 866,0,@4996 886,0,0 893,0,0 900,0,1 906,0,0 971,0,@4582 1016,0,3 1057,0,91 1066,0,123 1105,0,@4990 1150,0,@4994 1187,0,0 1194,0,1 1201,0,3 1207,0,0 1240,0,@4990 1261,0,@4994 1281,0,0 1288,0,1 1295,0,3 1301,0,0 1339,0,@4990 1360,0,@4994 1382,0,0 1389,0,1 1396,0,3 1402,0,0 1433,0,0 1454,0,@4995 1489,0,0 1496,0,0 1503,0,1 1509,0,0 1574,0,@4582 1620,0,3 1661,0,91 1670,0,123 1709,0,@4990 1754,0,@4994 1791,0,0 1798,0,1 1805,0,3 1811,0,0 1844,0,@4990 1865,0,@4994 1885,0,0 1892,0,1 1899,0,3 1905,0,0 1943,0,@4990 1964,0,@4994 1986,0,0 1993,0,1 2000,0,3 2006,0,0 2037,0,0 2058,0,@4995 2093,0,0 2100,0,0 2107,0,1 2113,0,0 2178,0,@4582 2224,0,3 2265,0,91 2274,0,123 2313,0,@4990 2358,0,@4994 2395,0,0 2402,0,1 2409,0,3 2415,0,0 2448,0,@4990 2469,0,@4994 2489,0,0 2496,0,1 2503,0,3 2509,0,0 2547,0,@4990 2568,0,@4994 2590,0,0 2597,0,1 2604,0,3 2610,0,0 2641,0,0 2662,0,@4995 2697,0,0 2704,0,0 2711,0,1 2717,0,0 2726,0,103 2785,0,@4582 2828,0,3 2869,0,91 2878,0,123 2917,0,@4990 2962,0,@4994 2999,0,0 3006,0,1 3013,0,3 3019,0,0 3052,0,@4990 3073,0,@4994 3093,0,0 3100,0,1 3107,0,3 3113,0,0 3151,0,@4990 3172,0,@4994 3194,0,0 3201,0,1 3208,0,3 3214,0,0 3245,0,0 3266,0,@4995 3301,0,0 3308,0,0 3315,0,1 3321,0,0 3386,0,@4582 3432,0,3 3473,0,91 3482,0,123 3521,0,@4990 3566,0,@4994 3603,0,0 3610,0,1 3617,0,3 3623,0,0 3656,0,@4990 3677,0,@4994 3697,0,0 3704,0,1 3711,0,3 3717,0,0 3755,0,@4990 3776,0,@4994 3798,0,0 3805,0,1 3812,0,3 3818,0,0 3849,0,0 3870,0,@4995 3905,0,0 3912,0,0 3919,0,1 3925,0,0 3964,0,3 4072,0,3 4113,0,91 4122,0,123 4161,0,@4990 4206,0,@4994 4243,0,0 4250,0,1 4257,0,3 4263,0,0 4296,0,@4990 4317,0,@4994 4337,0,0 4344,0,1 4351,0,3 4357,0,0 4395,0,@4990 4416,0,@4994 4438,0,0 4445,0,1 4452,0,3 4458,0,0 4489,0,0 4510,0,@4995 4545,0,0 4552,0,0 4559,0,1 4565,0,0 4604,0,3 4918:O2|3,@4919 4919:S3|2e2e2e 4920:O2|@4921,0 4921:O2|3,@4922 4922:S4|2e2e2e29 4923:O1|@4924 4924:D3,128|3b650c7303ff5524bbc4097ab28b009090e8ce0500008b4d008d49e83b4d087303ff5520894d00c741fc02000000c7410454117ab289018d410cc740fc02000000894804c70045000000909090e8de07000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c39090000000007c000000|@4958,1048575,@18|9,0,@4925 18,1,@4948 49,0,@4952 70,0,34 78,1,@4953 113,0,3 4925:O1|@4926 4926:D3,260|3b650c7303ff552481f8b90000007506b8e40a7ab2c383f8457506b8f00a7ab2c383f843720881f8fd000000766383f841746383f80f7506b8fc0a7ab2c383f8117506b8080b7ab2c383f8137506b8140b7ab2c383f8157506b8200b7ab2c383f8177506b82c0b7ab2c383f8197506b8380b7ab2c383f81b7506b8440b7ab2c383f841735ca801741481c080000000eb0ae964000000e95f0000007105ff5538ebe7a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e16eb06f640ff10750e89c1b8500b7ab28b5d049090ff1389c3b8880b7ab2e9e70000006a15bb0700000090e86a02000089c3b8b9000000e9ce000000c3900000000000010000|@4947,2097151,@15|10,0,92 17,0,@4927 28,0,@4928 40,0,126 57,0,@4929 68,0,@4930 79,0,@4931 90,0,@4932 101,0,@4933 112,0,@4934 123,0,@4935 185,0,255 202,0,@4936 216,0,@4939 221,1,@4940 228,0,3 234,1,@4945 241,0,92 246,1,@4940 4927:S2|5c5c 4928:S2|5c22 4929:S2|5c61 4930:S2|5c62 4931:S2|5c74 4932:S2|5c6e 4933:S2|5c76 4934:S2|5c66 4935:S2|5c72 4936:O4|@4583,@4938,0,@4937 4937:O5|@4900,268,0,268,0 4938:S3|436872 4939:S2|5c5e 4940:D3,312|a8017407b903000000eb068b088d4c0901f6c3017407ba03000000eb068b138d54120183f901750389d8c383fa017501c389ce8d76ff03f289f783c70ec1ef0283cf0181ffffffff01720e50b8e00c7ab28b5d04909090ff13505189f9b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1ee89378d743601833c2403750f8b442404d1e88847048d440001eb238b74240489f889c78b0c24d1e983c60483c704f3a48d7c3f018d7436018d4c090189c783fa03751cb8090000008d40ff030424d1e8d1eb881c078d5c1b018d440001eb32b8090000008d40ff03042489de89f989cf89cb89d1d1e983c604d1e803f88d440001f3a48d7c3f018d7436018d4c090189df8067ffbf89f883c408c390900000000034010000|@4944,63,@13|5,0,1 23,0,1 69,0,16777215 77,0,@4941 94,0,0 215,0,4 243,0,4 4941:O4|4,@4943,0,@4942 4942:O5|@4880,182,0,182,0 4943:S4|53697a65 4944:S4|5e283229 4945:D3,424|3b650c7303ff552483fb017508b848c05208c20400f6c301740583eb027105ff5538ebf6a801740783f8017d0feb06f640ff107407b901000000eb05b9030000008b542404f6c201740783fa017d0feb06f642ff107407be01000000eb05be030000003bce750489c1eb5583fe017429f6c201740583ea027105ff5538ebf689c1f6c1017409f6c20174042bca7105ff5538ebf783c101eb27f6c201740583c2027105ff5538ebf689c1f6c1017409f6c20174042bca7105ff5538ebf783c10150538b5c240c89c8ff15e8c75208ff74240c8b5c2404909090e822ffffff508b5c24108b44240890ff1508c8520883f80174588b4c2410f6c101740783f9017d0feb06f641ff107407ba01000000eb05ba03000000a801740783f8017d0feb06f640ff107407bb01000000eb05bb030000003bd37415a801740cf6c10174078d40ff03c17105ff5538ebf4a801740583c0607105ff5538ebf6a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e17eb06f640ff10750f89c1b8500b7ab28b5d04909090ff1389c35883c4085983c40451e9d3fcffff90909000000000a4010000|@4946,2097151,@14|14,0,I48 54,0,0 61,0,1 88,0,0 95,0,1 202,0,I109 234,0,I110 266,0,0 273,0,1 295,0,0 302,0,1 368,0,255 385,0,@4936 409,1,@4940 4946:S18|436861722e6f6374496e7452657072283329 4947:S16|436861722e746f537472696e67283129 4948:D3,484|3b650c7303ff5524a8017407b903000000eb068b088d4c090183f903750489daff22ba01000000be010000005053513b3424745d89f083c00283c6088b4c2408d1ee0fb634318d743601525089f08b54240c9090ff12a8017407b903000000eb068b088d4c0901f6c1017410f64424040174098d49ff034c24047105ff5538ebf25e83c40489ca3b650c7303ff5524eb9ef6c2017412f6c201740783fa017d15eb06f642ff10740db80c117ab28b5d04909090ff133b1424750583c40858c389d083c00ec1e80283c80181f8ffffff01720f89c1b8e00c7ab28b5d04909090ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1ea89178d541201b809000000b901000000573b4c2404746c89ca83c2088b5c240cd1ea0fb614138d541201505189d08b54241090ff12a8017407b903000000eb068b088d4c090183f90375198b5424088b5c2404d1ebd1e888041a8d4400018d5c1b01eb3289c68b7c240889c889c18b542404d1e983c604d1ea03fa8d541201f3a4eb05e92e0000008d7c3f018d7436018d4c090189c15883c0028d49ff030c2489ca89c183c40489d03b650c7303ff5524e95bffffff8b04248060ffbf83c410c3909000000000e0010000|@4951,1048575,@16|13,0,1 35,0,0 40,0,0 91,0,1 169,0,@4949 204,0,16777215 213,0,@4941 228,0,0 288,0,4 293,0,0 339,0,1 4949:O4|4,@4943,0,@4950 4950:O5|@4880,148,0,148,0 4951:S19|537472696e672e746f537472696e6773283229 4952:O2|34,0 4953:D3,464|a801755e8378040175038b00c389c1ba01000000f6c101753c8b31f7c6010000007407bb03000000eb068b1e8d5c1b01f6c201740cf6c30174078d52ff03d37105ff5538ebf48b590489d93b650c7303ff5524ebbf89d183f901750bb848c05208c3e95a01000083f903754ea801740d89c1b844137ab28b5d0490ff13813848c052087425f60001752d8b30bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750d8b40043b650c7303ff5524ebb58b00c3f6c1017412f6c101740783f9017d14eb06f641ff10740c89c2b80c117ab28b5d04ff1389ca83c20ec1ea0283ca0181faffffff01720d89c3b8e00c7ab28b5d0490ff1389cb89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1eb891f8d5c1b01b80900000057f6c201756c8b1af6c3017407b903000000eb068b0b8d4c090183f90375148b3424d1e8d1eb881c068d5c1b018d440001eb2689de8b3c24518b0c24d1e983c604d1e803f88d440001f3a48d7c3f018d7436018d4c0901eb01518d40ff0304248b4a0489ca83c4043b650c7303ff5524eb8f8b04248060ffbf83c404c3b848c05208c39000000000cc010000|@4957,63,@17|16,0,0 36,0,1 93,0,I48 115,0,@4954 127,0,I48 141,0,I48 146,0,4 212,0,@4949 234,0,16777215 243,0,@4941 260,0,0 320,0,4 338,0,1 450,0,I48 4954:O4|103,@4956,I48,@4955 4955:O5|@4900,626,0,626,0 4956:S4|4661696c 4957:S16|537472696e672e636f6e636174283129 4958:S7|61646450502d31 4959:O1|@4960 4960:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f0137ab28948048060ffbfc3000000002c000000|@4983,3,@20|28,0,@4961 4961:D3,456|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8cc157ab2c38338017506b8e4157ab2c3f6c101740783f9037d0eeb06f641ff107406b8cc157ab2c38b52048b18f6c101740583e9027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008948048b1b89188b5204ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c7430468167ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c70680167ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c7039c167ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c701a8167ab28d410cc740fc020000008948049090c700b8167ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000c4010000|@4982,1048575,@19|30,0,@4962 41,0,@4964 65,0,@4962 162,0,123 171,0,91 204,0,@4972 242,0,@4974 278,0,@4976 298,0,0 305,0,1 312,0,3 318,0,0 357,0,0 378,0,@4977 399,0,@4978 421,0,0 428,0,0 435,0,1 441,0,0 4962:O2|3,@4963 4963:S3|2e2e2e 4964:O5|0,0,0,@4966,@4965 4965:O2|@4970,0 4966:O2|@4967,0 4967:O2|0,@4968 4968:O5|@4969,0,0,0,0 4969:S14|5374616e64617264204261736973 4970:O2|3,@4971 4971:S4|4e4f4e45 4972:O2|@4974,@4973 4973:O2|@4975,0 4974:O3|1,0,0 4975:O2|3,41 4976:O2|3,40 4977:O3|1,1,0 4978:O5|0,0,0,@4966,@4979 4979:O2|@4980,0 4980:O2|3,@4981 4981:S4|534f4d45 4982:S12|7072696e742d6f7074696f6e 4983:S13|7072696e746f7074696f6e2829 4984:O4|0,@4985,3,1 4985:O1|@4986 4986:D3,28|3b650c7303ff55248b0d54e039b289caff2290900000000018000000|@4989,1048575,@22|10,0,@4585 4987:O1|@4988 4988:D3,68|3b650c7303ff55248b18b80500000090ff1508cd520889c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c390900000000040000000|@4958,2097151,@21|11,0,2 18,0,I150 53,0,3 4989:S17|7072696e742d4f532e7379736572726f72 4990:O2|@4991,0 4991:O2|3,41 4992:O3|1,1,0 4993:O2|3,44 4994:O2|3,40 4995:O3|1,1,1 4996:O2|3,@4997 4997:S6|537973457272 4998:S11|65786e5072696e74283329 4999:O2|@5000,0 5000:O2|3,125 5001:O2|3,@5002 5002:S6|6e616d65203d 5003:O2|3,@5004 5004:S10|66756e6374696f6e203d 5005:O2|3,@5006 5006:S7|6361757365203d 5007:O2|3,123 5008:S14|7072696e742d6c6162656c6c6564 5009:D3,560|3b650c7303ff55248b48048b098b500883f9017506b801000000c3f6421c0174588b5d008d5bdc3b5d087303ff5520895d00c743fc03000000c74308401b7ab2c74304501b7ab28b3289338d7b10c747fc04000000c7470c801b7ab2895f08c747049cf379b2c7072ce039b28b18ff700489f88b5d0490ff138b5a1c8b7004c70601000000bf01000000ff33ff30ff325157ff7504b8f2197ab2508965048b44240ca801740cf7c70100000074042bc77105ff5538ebf783c0018b4d008d49f83b4d087303ff5520894d00c741fc0100000089015189fb8b4424189090e8ba0100008b5424189090ff1283c40459894d04eb619090908b650483c4045b895d046a016a016a0181382ce039b2751889e18b10891189e18b580489590489e18b7008897108eb66833803751c89e0c7000300000089e0c74004601d7ab289e0c7400801000000eb458b4d008d49f03b4d08730aeb05e96c000000ff5520894d00c741fc03000000c74108401b7ab28941048b442414890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c741d7ab28b4c24088948088b4c24048948045983c40889088b5d0490ff1389c1f6c101740ef604240174088d49ff030c247105ff5538ebf3f6c101750af6442404017503ff55383b4c24047509b80100000083c414c3a801740ef604240174088d40ff0304247105ff5538ebf389c783c4043b650c7303ff5524e96bfeffff9090000000002c020000|@5023,1048575,@27|22,0,0 60,0,@5010 67,0,@5011 88,0,@5013 98,0,@4908 104,0,@4580 129,0,0 134,0,0 150,0,$5009+246 222,1,@5014 264,0,@4580 303,0,1 312,0,@5021 321,0,0 361,0,@5010 378,0,@4580 387,0,@4908 423,0,@5022 501,0,0 5010:S8|666c7573684f7574 5011:O4|@4586,@5012,0,0 5012:S20|426c6f636b696e674e6f74537570706f72746564 5013:O5|@4907,514,0,515,0 5014:D3,264|f64424040175698b4c2404f6c3017412f6c301740783fb017d17eb06f643ff10740f89c2b8a8eb79b28b5d04909090ff13f6010174148b11f6c201740783fa017d17eb06f642ff10740f89c2b8a8eb79b28b5d04909090ff1389de8d76ff03f23b30761589c6b8b41c7ab28b5d04eb05e9290000009090ff1389c68b45008d40f03b45087303ff5520894500c740fc030000008970088950048918c20400f6c3017412f6c301740783fb017d14eb06f643ff10740c89c1b8a8eb79b28b5d04ff133b18760c89c1b80c1d7ab28b5d04ff138b082bcb83c10189c28b45008d40f03b45087303ff5520894500c740fc030000008950088948048918c204009090900000000004010000|@5020,31,@26|37,0,@4877 77,0,@4877 103,0,@5015 184,0,@4877 200,0,@5018 5015:O4|11,@4879,0,@5016 5016:O5|@5017,111,0,111,0 5017:S33|2e2f62617369732f566563746f72536c6963654f7065726174696f6e732e736d6c 5018:O4|11,@4879,0,@5019 5019:O5|@5017,101,0,101,0 5020:S32|566563746f72536c6963654f7065726174696f6e7328292e736c696365283329 5021:S9|496e74657272757074 5022:O5|@4907,501,0,501,0 5023:S28|426173696353747265616d494f28292e666c7573684f757427283129 5024:D3,744|3b650c7303ff55248b4808f641200175708b5120be01000000ff31ff325356ff7504b8561e7ab250896504f7c6010000007410f64424200174098d76ff037424207105ff5538ebf28b44241ca801740df64424080174062b4424087105ff5538ebf583c0018b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb05e9520100005189f38b442410e86a0200008b5424109090ff1283c40459894d04eb619090908b650483c4045b895d046a016a016a0181382ce039b2751889e18b10891189e18b580489590489e18b7008897108eb66833803751c89e0c7000300000089e0c74004601d7ab289e0c7400801000000eb458b4d008d49f03b4d08730aeb05e96c000000ff5520894d00c741fc03000000c7410828f379b28941048b442418890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400ce8217ab28b4c24088948088b4c24048948045983c40889088b5d0490ff1389c1f6c101740ef604240174088d49ff030c247105ff5538ebf3f6c101750af6442414017503ff55383b4c2414750bb80100000083c410c20800a801740ef604240174088d40ff0304247105ff5538ebf389c683c4043b650c7303ff5524e946fefffff6411c0174538b55008d52dc3b55087303ff5520895500c742fc03000000c7420828f379b2c74204501b7ab28b3189328d7a10c747fc04000000c7470c00227ab2895708c747049cf379b2c7072ce039b289f88b5d0490ff138b511c8b01b90700000089c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fb80100000083f8157317d1e8c60407208d44000183c0023b650c7303ff5524ebe48b45008d40f43b45087303ff5520894500c740fc02000000897804c700150000008b4c2404538b5c240c895c240c5b895c24048b1c24893c24ff32505689d889cb89c1b80100000051e98801000000000000e4020000|@5033,1048575,@30|21,0,0 35,0,$5024+166 142,1,@5025 184,0,@4580 223,0,1 232,0,@5021 241,0,0 281,0,@4903 298,0,@4580 307,0,@4908 343,0,@5026 421,0,0 505,0,@4903 512,0,@5011 533,0,@5027 543,0,@4908 549,0,@4580 567,0,3 574,0,0 626,0,0 687,0,10 726,0,0 732,1,@5028 5025:D3,296|f644240401756f8b4c2404a8017407ba03000000eb068b108d541201f6c3017412f6c301740783fb017d16eb06f643ff10740e89c6b8a8eb79b28b5d049090ff13f6010174178b31f7c601000000740783fe017d14eb06f646ff10740c89c6b8a8eb79b28b5d04ff1389df8d7fff03fe3bfa7615eb05e93300000089c2b8b41c7ab28b5d049090ff1389c28b45008d40f03b45087303ff5520894500c740fc030000008950088970048918c20400f6c3017412f6c301740783fb017d14eb06f643ff10740c89c1b8a8eb79b28b5d04ff13a8017407b903000000eb068b088d4c09013bd9760f89c2b80c1d7ab28b5d04909090ff132bcb83c10189c28b45008d40f03b45087303ff5520894500c740fc030000008950088948048918c20400900000000024010000|@5020,63,@28|16,0,1 54,0,@4877 96,0,@4877 126,0,@5015 200,0,@4877 214,0,1 233,0,@5018 5026:O5|@4907,577,0,577,0 5027:O5|@4907,604,0,605,0 5028:D3,692|3b650c7303ff552489d9f6c1017408a80174042bc87105ff5538ebf783c101f6c101740783f9157c0deb06f641ff107505b91500000089c2f6c2017410f64424180174098d52ff035424187105ff5538ebf28b75008d76f83b75087303ff5520897500c746fc01000000890e5350515689d38b442424909090e816feffffb9010000008d49ff03480483f91576138b48088b108b5804b8e0247ab28b5d0490ff13f64008017427b9010000008d49ff03088b40088b54241cd1e9d1e888040a8d4400018d4c0901b801000000eb2e8b0883c1088b70088b7c241c89ca8b4804d1e9d1ea03f28d541201f3a48d7c3f018d7436018d4c0901b801000000ff7504b862237ab2508965048b45008d40f83b45087303ff5520894500c740fc010000008b4c2408890850bb010000008b44242090e84af8ffff8b5424209090ff1283c40459894d04eb619090908b650483c4045b895d046a016a016a0181382ce039b2751889e18b10891189e18b580489590489e18b7008897108eb66833803751c89e0c7000300000089e0c74004601d7ab289e0c7400801000000eb458b4d008d49f03b4d08730aeb05e96c000000ff5520894d00c741fc03000000c7410828f379b28941048b44241c890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c0c257ab28b4c24088948088b4c24048948045983c40889088b5d0490ff1389c1f6c1017410f64424040174098d49ff034c24047105ff5538ebf2f6c101750af6442408017503ff55383b4c2408750bb80100000083c40cc21800a8017410f64424040174098d40ff034424047105ff5538ebf28b4c24248b5424208b5c241c8b7424188b7c2414578b7c2414894c242889542424895c24208974241c59894c2414897c241083c4085be957fdffff90909000000000b0020000|@5032,1048575,@29|50,0,10 122,1,@5025 127,0,0 151,0,@5029 168,0,0 200,0,0 248,0,0 256,0,$5028+330 296,0,0 306,1,@5014 348,0,@4580 387,0,1 396,0,@5021 405,0,0 445,0,@4903 462,0,@4580 471,0,@4908 507,0,@5031 587,0,0 5029:O4|11,@4879,0,@5030 5030:O5|@4900,1637,0,1637,0 5031:O5|@4907,595,0,595,0 5032:S38|426173696353747265616d494f28292e7772697465566563283429666f7263654f7574283129 5033:S27|426173696353747265616d494f28292e7772697465566563283429 5034:D3,876|3b650c7303ff55248b038b4c2418f6c1017408a80174042bc87105ff5538ebf783c101f6c101740ff64424140174083b4c24147e67eb05ff5538ebf38b038b4d008d49f83b4d087303ff5520894d00c741fc010000008b54241489115350518b5c24188b44241c9090e8c6faffff8b4c2410f604240174158b1424f6c201740783fa017d24eb06f642ff10741c8b50088b188b7004b8a8eb79b2eb05e9a70000008b5d04909090ff138d52ff0350043b1176128b50088b188b7004b8e0247ab28b5d04ff13f6400801741f8b14248d52ff03108b40088b5904d1ead1e88804138d4400018d541201eb318b1083c2088b70088b79048b48048b0424d1e9d1ea03f28d541201d1e803f88d440001f3a48d7c3f018d7436018d4c09018b44240483c4048b00a8017410f64424180174098d40ff034424187105ff5538ebf2598901b801000000c218008b038b4c2418f6c1017408a80174042bc87105ff5538ebf783c1018b038b55008d52f83b55087303ff5520895500c742fc01000000890a535150528b5c241c8b4424209090e8a2f9ffff8b4c2414f604240174158b1424f6c201740783fa017d1ceb06f642ff1074148b50088b188b7004b8a8eb79b28b5d049090ff138d52ff0350043b1176128b50088b188b7004b8e0247ab28b5d04ff13f6400801741f8b14248d52ff03108b40088b5904d1ead1e88804138d4400018d541201eb318b1083c2088b70088b79048b48048b0424d1e9d1ea03f28d541201d1e803f88d440001f3a48d7c3f018d7436018d4c09018b44240883c4048b00a801740ef604240174088d40ff0304247105ff5538ebf38b4c240489018b44240ce81ef1ffff8b442414a801740ef604240174088d40ff0304247105ff5538ebf38b4c241cf6c101740bf604240174052b0c247105ff5538ebf683c1018b55008d52f83b55087303ff5520895500c742fc01000000890a5289c38b44241c909090e86ef8ffff8b4c2410ba010000008d52ff0350043b1176148b50088b188b7004b8e0247ab28b5d049090ff13f64008017421ba010000008d52ff03108b40088b5904d1ead1e88804138d4400018d541201eb268b1083c2088b70088b79048b4804d1e9d1ea03f28d541201f3a48d7c3f018d7436018d4c09018b44241ca801740bf604240174052b04247105ff5538ebf683c00183c404598901b801000000c21800900000000068030000|@5035,1048575,@31|106,1,@5025 150,0,@4877 188,0,@5029 321,0,0 398,1,@5025 442,0,@4877 472,0,@5029 610,1,@5009 706,1,@5025 715,0,0 738,0,@5029 756,0,0 860,0,0 5035:S46|426173696353747265616d494f28292e6f7574707574566563746f72283229616464566563546f42756666283129 5036:S31|426173696353747265616d494f28292e6f7574707574566563746f72283229 5037:S34|426173696353747265616d494f28292e6f7574707574566563746f72283129283129 5038:D3,796|3b650c7303ff55248b4d3c8b490489ca83e20d83fa0174178b553cbef3ffffff23f183ce09897204ba01000000eb05ba01000000515053b8010000008b4c24108b0983f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc78b4c241033c083c0fef00fc10183c0fe83f801741a89cbb803000000909090ff1568c352083b650c7303ff5524eb93b801000000ff7504b8522a7ab2508965048b44240c8b542408909090ff1283c40459894d04eb669090908b650483c4045b895d048b54241033c983c102f00fc10a83c10283f903741f89c189d0909090ff15e8c25208518b5c2414b805000000ff1568c35208eb01508b453c8b4c240c89480483e10983f90975238b453c8b400c83f8017418bb01000000eb05e970010000b81700000090ff1568c352088b45008d40f83b45087303ff5520894500c740fc01000040c70001000000c700b42c7ab28b0c24b8ffffff002341fc8d44000183f809725e8b410ca80175508b55008d52e83b55087303ff5520895500c742fc050000008b5808895a108b701089720c8b7804897a088b480c894a048b38893a8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb0cbf01000000eb05bf01000000f7c701000000743c8b04248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c68387ab28b50088951088b58048959048b30893189c88b5d04909090ff138b078b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000c70180387ab28b0c248b098b14248b52045b8b5b088b75008d76d43b75087303ff5520897500c746fc050000008b780c897e108b7804897e0c8b7810897e088b7808897e048b38893e8d4618c740fc0400000089700c895808895004890890ff1508bc52088b54241083c40833c983c102f00fc10a83c10283f903741e89c189d09090ff15e8c25208518b5c240cb805000000ff1568c35208eb01508b453c8b4c240489480483e10983f909751b8b453c8b400c83f8017410bb01000000b817000000ff1568c352085883c404c204009090900000000018030000|@5076,2097151,@39|28,0,-7 41,0,0 48,0,0 56,0,0 72,0,0 80,0,20000 87,0,0 141,0,1 150,0,I73 165,0,0 173,0,$5038+206 246,0,I69 256,0,2 262,0,I73 299,0,0 311,0,11 318,0,I73 348,0,0 354,0,@5039 362,0,8388607 466,0,0 473,0,0 515,0,@5065 573,0,0 579,0,@5066 674,0,I14 710,0,I69 720,0,2 726,0,I73 763,0,0 768,0,11 774,0,I73 5039:O1|@5040 5040:D3,1060|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8f4307ab2c38338017506b800317ab2c3f6c101740783f9037d0eeb06f641ff107406b8f4307ab2c38b10f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b904097ab2eb5a89cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b1a891e8b3d3ce039b2ff721051ff720cff7208ff720489f089fa90ff128b4c240cf6c101740c83f9037d14eb0be98c020000f641ff107407b904097ab2eb5bf6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b0c24890a8b0d64e039b25089d089ca9090ff128b4c2410f6c101740783f9057d14eb06f641ff10740cb904097ab2eb60e9d3010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c2408890a8b0d64e039b25089d089ca90ff128b4c2414f6c101740783f9077d14eb06f641ff10740cb904097ab2eb70e92a010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c2410890a8b0d64e039b25089d089ca90ff128b4c2418f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e971000000894a048b4c241c890a8b0d64e039b25089d089caff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e8177ab289018d410cc740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc020000008941045883c41489018b45008d40dc3b45087303ff5520894500c740fc02000000894804c7001c187ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8018b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c70100187ab28d410cc740fc020000008948049090c700d4377ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000020040000|@5064,1048575,@37|30,0,@5041 41,0,@5042 65,0,@5041 106,0,@4920 162,0,@4582 214,0,@4920 269,0,@4587 305,0,@4920 366,0,@4587 401,0,@4920 462,0,@4587 535,0,@4587 573,0,@4990 594,0,@4992 613,0,@4993 667,0,@4992 686,0,@4993 740,0,@4992 759,0,@4993 815,0,@4992 834,0,@4993 888,0,@4994 908,0,0 915,0,0 922,0,1 928,0,0 961,0,0 982,0,@4992 1003,0,@5057 1025,0,0 1032,0,0 1039,0,1 1045,0,0 5041:O2|3,@4963 5042:O5|0,0,0,@5044,@5043 5043:O2|@5048,0 5044:O2|@5045,0 5045:O2|0,@5046 5046:O5|@5047,40,40,0,0 5047:S27|2e2f62617369732f506f6c794d4c457863657074696f6e2e736d6c 5048:O2|3,@5049 5049:S10|4e6f4c6f636174696f6e 5050:O1|@5051 5051:D3,72|3b650c7303ff5524bb030000008b00bafc317ab290e86a00000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c390900000000044000000|@4958,2097151,@36|9,0,1 16,0,@5052 22,1,@5053 57,0,3 5052:O9|@5053,268435456,7,1000000000,9,134217728,9,536870912,29 5053:D3,572|3b650c7303ff55246a016a016a0183fb05751a89e1c7012100000089e18b5a0489590489e18b7208897108eb5683fb03751a89e1c7011500000089e18b5a0c89590489e18b7210897108eb3783fb07751a89e1c7011100000089e18b5a1489590489e18b7218897108eb1889e1c7010500000089e18b5a1c89590489e18b7220897108a801740783f8017c0feb06f640ff107507b901000000eb05b903000000a801740783f8017c52eb06f640ff107553a801740df604240174073b04247d53eb05ff5538ebf4a801740783f8157d61eb06f640ff107459a801740583c0607105ff5538ebf6a801740783f8017d08eb2df640ff107527a801eb05e9850000007416eb05e97c00000081f8ff0100007e1ceb0be96d000000f640ff10750f89c1b8500b7ab28b5d04909090ff1383c40cc3a801740881c0820000007105ff5538ebf3a801740583e8147105ff5538ebf6a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e14eb06f640ff10750c89c1b8500b7ab28b5d04ff1383c40cc3a801740783f8017d24eb06f640ff10741cba01000000f6c2017408a80174042bd07105ff5538ebf783c201eb0289c26a016a01f6c20174276a016a018d4424085051ff74241cff742424ff742420bb0100000089d0909090e86e000000eb456a016a01518d442404508b5c241c89d0ff1548c75208ff742404ff7424208d44241450ff74240cff742428ff742430ff74242cbb010000008b44242490e82a00000083c40c8b04248060ffbf83c414c30000000038020000|@5056,2097151,@35|23,0,16 54,0,10 85,0,8 111,0,2 149,0,0 156,0,1 267,0,255 289,0,@4936 359,0,255 376,0,@4936 407,0,0 468,0,0 478,1,@5054 502,0,I104 536,0,0 546,1,@5054 5054:D3,796|3b650c7303ff552483f8017567837c241c017565837c241001746383c30289d883c00ec1e80283c80181f8ffffff01720c89c1b8e00c7ab28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d440001eb0fe96e010000e99a000000e9220000005fd1eb891f8d5c1b01c647047e8b4424148938c740040b000000b801000000c21c0089d883c00ec1e80283c80181f8ffffff01720d89c1b8e00c7ab28b5d0490ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1eb891f8d5c1b018b4424148938c7400409000000b801000000c21c008d5bff035c24186a016a01f64424240174266a016a018d44240850ff742424ff742424ff742424ff7424248b4424409090e8b2feffffeb496a016a01538d442404508b5c24248b4424349090ff1548c75208ff742404ff7424208d44241450ff742430ff742430ff742430ff7424308b5c241c8b4424249090e86afeffff83c40cb8010000003b44242074238b4c24048d49ff03c88b1424d1e9c6040a308d4c090183c0023b650c7303ff5524ebd78b4424048d40ff034424208b4c241c5a83c4048911894104b801000000c21c006a016a01538d4c2404518b5c2414909090ff1548c752088b442408a801740783f8157d4aeb06f640ff107442a801740583c0607105ff5538ebf6a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e55eb06f640ff10755289c1b8500b7ab28b5d04909090ff13a801740881c0820000007105ff5538ebf3a801740583e8147105ff5538ebf6a801740783f8017d08eb24f640ff10751ea801741481f8ff0100007e20eb10e919000000e914000000f640ff10750e89c1b8500b7ab28b5d049090ff135983c1028b54242083ea026a016a0150ff742430528d54240c52ff742430ff742430ff742430ff74243089cb8b442428e81afdffff588b0c248b542404d1ead1e88804118d4400018d54120183c2028b4424248908895004b80100000083c410c21c000000000018030000|@5055,2097151,@34|43,0,16777215 52,0,@4941 64,0,0 153,0,5 158,0,0 178,0,16777215 187,0,@4941 200,0,0 268,0,4 273,0,0 358,0,I104 410,0,0 480,0,0 506,0,I104 568,0,255 585,0,@4936 651,0,255 678,0,@4936 778,0,0 5055:S20|496e742e666d74283229746f4368617273283429 5056:S10|496e742e666d74283229 5057:O5|0,0,0,@5059,@5058 5058:O2|@5062,0 5059:O2|@5060,0 5060:O2|0,@5061 5061:O5|@5047,41,41,0,0 5062:O2|3,@5063 5063:S12|536f6d654c6f636174696f6e 5064:S21|7072696e742d52756e74696d654c6f636174696f6e 5065:O5|@5047,83,0,83,0 5066:O1|@5067 5067:D3,1060|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8f4307ab2c38338017506b8c03c7ab2c3f6c101740783f9037d0eeb06f641ff107406b8f4307ab2c38b10f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b904097ab2eb5a89cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b1a891e8b3d3ce039b2ff721051ff720cff7208ff720489f089fa90ff128b4c240cf6c101740c83f9037d14eb0be98c020000f641ff107407b904097ab2eb5bf6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b0c24890a8b0d64e039b25089d089ca9090ff128b4c2410f6c101740783f9057d14eb06f641ff10740cb904097ab2eb60e9d3010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c2408890a8b0d64e039b25089d089ca90ff128b4c2414f6c101740783f9077d14eb06f641ff10740cb904097ab2eb70e92a010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c2410890a8b0d64e039b25089d089ca90ff128b4c2418f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e971000000894a048b4c241c890a8b0d64e039b25089d089caff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e8177ab289018d410cc740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c70000187ab28d480cc741fc02000000894104c70110187ab289c88d490cc741fc020000008941045883c41489018b45008d40dc3b45087303ff5520894500c740fc02000000894804c7001c187ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8018b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c70100187ab28d410cc740fc020000008948049090c700083d7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000020040000|@5064,1048575,@38|30,0,@5041 41,0,@5068 65,0,@5041 106,0,@4920 162,0,@4582 214,0,@4920 269,0,@4587 305,0,@4920 366,0,@4587 401,0,@4920 462,0,@4587 535,0,@4587 573,0,@4990 594,0,@4992 613,0,@4993 667,0,@4992 686,0,@4993 740,0,@4992 759,0,@4993 815,0,@4992 834,0,@4993 888,0,@4994 908,0,0 915,0,0 922,0,1 928,0,0 961,0,0 982,0,@4992 1003,0,@5072 1025,0,0 1032,0,0 1039,0,1 1045,0,0 5068:O5|0,0,0,@5069,@5043 5069:O2|@5070,0 5070:O2|0,@5071 5071:O5|@5047,68,68,0,0 5072:O5|0,0,0,@5073,@5058 5073:O2|@5074,0 5074:O2|0,@5075 5075:O5|@5047,69,69,0,0 5076:S20|5468726561644c69622e70726f74656374283329 5077:D3,24|3b650c7303ff55248b5a04e9a0b4ffff0000000014000000|@5037,1048575,@40|12,1,@4902 5078:O1|@5009 5079:D3,24|3b650c7303ff55248b5a04e96cb4ffff0000000014000000|@5037,1048575,@41|12,1,@4902 5080:D3,24|3b650c7303ff55248b5a04e940b4ffff0000000014000000|@5037,1048575,@42|12,1,@4902 5081:S29|54657874494f2e5465787453747265616d494f2e6f7574707574283229 5082:S20|5369676e616c2e666f726b546872656164283129 5083:O2|@5100,@5099 5084:O2|@5086,@5085 5085:O3|@5088,@5090,@20263 5086:D3,32|3b650c7303ff55248b5a04b825000000ff2508cd52089090000000001c000000|@5087,2097151,@45|12,0,18 18,0,I150 5087:S28|426173696353747265616d494f28292e646f4f6e456e747279283129 5088:D3,112|3b650c7303ff55248b42088b00b90100000052a801754bff7004ff7504b9023f7ab2518965048b088b54240cff71108b5a0489c890e88eeaffff83c40459894d04eb129090908b650483c4045b895d04b80100000089c1583b650c7303ff5524ebb189c883c404c3000000006c000000|@5089,2097151,@46|14,0,0 30,0,$5088+70 54,1,@5038 81,0,0 5089:S27|426173696353747265616d494f28292e636c6f7365416c6c283129 5090:O3|@5091,@20264,@20263 5091:D3,44|3b650c7303ff55248b4808ff7108ff72088b5a0490e826000000b8010000005aff2290900000000028000000|@5098,2097151,@51|22,1,@5092 27,0,0 5092:D3,236|3b650c7303ff55248b480c8b0983f9037508b801000000c204008b480cc701030000005053ff700cb8010000008b4c24048b0983f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc78b4c240433c083c0fef00fc10183c0fe83f801741989cbb8030000009090ff1568c352083b650c7303ff5524eb948b4424108b005b9090e85e0000008b4c240c89018b142433c083c002f00fc10283c00283f803741a89d09090ff15e8c252088b1c24b8050000009090ff1568c3520883c404585983c40451e9a000000000000000e8000000|@5097,2097151,@50|19,0,0 31,0,1 41,0,0 57,0,0 65,0,20000 72,0,0 126,0,1 134,0,I73 158,1,@5093 194,0,I69 202,0,2 210,0,I73 224,1,@5095 5093:D3,88|3b650c7303ff5524a801753d8b083b590c742c518b40049090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b7ffffffb801000000c3900000000054000000|@5094,11,@47|74,0,0 5094:S16|4c6973742e66696c7465722832292829 5095:D3,560|3b650c7303ff55248b48048b098b500883f9017506b801000000c3f6421c0174588b5d008d5bdc3b5d087303ff5520895d00c743fc03000000c74308401b7ab2c74304501b7ab28b3289338d7b10c747fc04000000c7470c801b7ab2895f08c747049cf379b2c7072ce039b28b18ff700489f88b5d0490ff138b5a1c8b7004c70601000000bf01000000ff33ff30ff325157ff7504b82e427ab2508965048b44240ca801740cf7c70100000074042bc77105ff5538ebf783c0018b4d008d49f83b4d087303ff5520894d00c741fc0100000089015189fb8b4424189090e8620100008b5424189090ff1283c40459894d04eb619090908b650483c4045b895d046a016a016a0181382ce039b2751889e18b10891189e18b580489590489e18b7008897108eb66833803751c89e0c7000300000089e0c74004601d7ab289e0c7400801000000eb458b4d008d49f03b4d08730aeb05e96c000000ff5520894d00c741fc03000000c74108401b7ab28941048b442414890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c741d7ab28b4c24088948088b4c24048948045983c40889088b5d0490ff1389c1f6c101740ef604240174088d49ff030c247105ff5538ebf3f6c101750af6442404017503ff55383b4c24047509b80100000083c414c3a801740ef604240174088d40ff0304247105ff5538ebf389c783c4043b650c7303ff5524e96bfeffff9090000000002c020000|@5023,1048575,@49|22,0,0 60,0,@5010 67,0,@5011 88,0,@5013 98,0,@4908 104,0,@4580 129,0,0 134,0,0 150,0,$5095+246 222,1,@5096 264,0,@4580 303,0,1 312,0,@5021 321,0,0 361,0,@5010 378,0,@4580 387,0,@4908 423,0,@5022 501,0,0 5096:D3,264|f64424040175698b4c2404f6c3017412f6c301740783fb017d17eb06f643ff10740f89c2b8a8eb79b28b5d04909090ff13f6010174148b11f6c201740783fa017d17eb06f642ff10740f89c2b8a8eb79b28b5d04909090ff1389de8d76ff03f23b30761589c6b8b41c7ab28b5d04eb05e9290000009090ff1389c68b45008d40f03b45087303ff5520894500c740fc030000008970088950048918c20400f6c3017412f6c301740783fb017d14eb06f643ff10740c89c1b8a8eb79b28b5d04ff133b18760c89c1b80c1d7ab28b5d04ff138b082bcb83c10189c28b45008d40f03b45087303ff5520894500c740fc030000008950088948048918c204009090900000000004010000|@5020,31,@48|37,0,@4877 77,0,@4877 103,0,@5015 184,0,@4877 200,0,@5018 5097:S35|426173696353747265616d494f28292e7465726d696e61746553747265616d27283129 5098:S28|426173696353747265616d494f28292e636c6f73654f757427283129 5099:O2|@5180,0 5100:O4|@5101,@20266,@20265,I148 5101:D3,168|3b650c7303ff5524526a03bbc4457ab28b420cbad4457ab290e8ce0000008b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc010000408908ba030000008b4d008d49e83b4d087303ff5520894d00c741fc0100004889118d5108c742fc03000000894a08894204c70203000000526864607ab28b442408ff70088d5c24048b400490e8e2e3ffff83c40cc3909000000000a4000000|@5159,2097151,@75|12,0,@5102 20,0,@5103 26,1,@5105 59,0,1 76,0,1 124,0,1 130,0,@5157 150,1,@5038 5102:S5|737464496e 5103:O2|@5105,@5104 5104:O4|@5152,@5156,@5151,@5151 5105:D3,1240|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e04a7ab28941048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706d04b7ab28946048066ffbf6a016a016a016a01837c24140174438b55008d52f03b55087303ff5520895500c742fc0100000089328d7208c746fc01000000890e89e1891189e189710489e1c741080100000089e1c7410c01000000eb6d8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707444c7ab2538b5a04895f048977088067ffbf8b75008d76e83b75087303ff5520897500c746fc01000000893e8d7e08c747fc03000000c707a04c7ab2895f04894f088067ffbf8b4d008d49f83b4d08730aeb05e934000000ff5520894d00c741fc0100000089398d7c2404c707010000008d7c2404c74704010000008d7c24048977088d742404894e0ceb01536a016a016a01506a0189c3b83d00000090ff15e8c15208a801740783f8057f2aeb06f640ff1074228d442404c700010000008d442404c74004010000008d442404c7400801000000eb6eff7504b8b6477ab2508965046a018b5c240cb825000000ff15e8c15208b80300000083c40459894d04eb1e90908b650483c4045b895d0483380574088b5d04909090ff13b80100000083f801744b8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d04c7ab2eb05e9db0000008b14248951048061ffbf8b5d008d5bf83b5d087303ff5520895d00c743fc01000000890beb05bb0100000083f80174448b4d008d49f43b4d087303ff5520894d00c741fc02000000c701484d7ab28b14248951048061ffbf8b75008d76f83b75087303ff5520897500c746fc01000000890eeb05be0100000083f80174448b45008d40f43b45087303ff5520894500c740fc02000000c700bc4d7ab28b0c248948048060ffbf8b55008d52f83b55087303ff5520895500c742fc010000008902eb05ba010000008d44240489188d4424048970048d4424048950088b45008d40f43b45087303ff5520894500c740fc020000009090c700344e7ab28b0c248948048060ffbf506a0189cbb81f00000090ff15e8c152088b4d008d49f43b4d087303ff5520894d00c741fc02000000c701084f7ab28b5424048951048061ffbf8b5d008d5bec3b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc02000000c701844f7ab28951048061ffbf8b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc02000000c701d84f7ab28951048061ffbf8b7d008d7fb83b7d087303ff5520897d00c747fc0100000089178d5708c742fc0f000000508b44240c8942388b4424248942348b4424288942305889422c8972288b4424188942248b44241c8942208b44240c89421c897a188b4424088942148b442410894210894a0c895a085883c4108942045883c41089026a016a016a016a016a016a016a016a016a016a016a016a016a016a016a0189e389d0e8da0500008b45008d40c03b45087303ff5520894500c740fc0f0000008b4c24388948388b4c24348948348b4c24308948308b4c242c89482c8b4c24288948288b4c24248948248b4c24208948208b4c241c89481c8b4c24188948188b4c24148948148b4c24108948108b4c240c89480c8b4c24088948088b4c24048948045983c4388908c2040090909000000000d4040000|@5150,2097151,@72|34,0,@5106 71,0,@5108 149,0,0 158,0,0 190,0,@5110 246,0,@5112 299,0,0 310,0,0 343,0,30 350,0,I61 377,0,0 388,0,0 399,0,0 409,0,$5105+450 424,0,18 430,0,I61 435,0,1 474,0,0 509,0,@5113 559,0,0 594,0,@5115 637,0,0 672,0,@5117 715,0,0 767,0,@5119 787,0,15 794,0,I61 824,0,@5121 877,0,@5123 926,0,@5124 1094,1,@5125 5106:D3,164|3b650c7303ff55248b4808f6000174148b18f6c301740783fb017d19eb06f643ff1074118b58048b30b8a8eb79b28b5d049090ff13f640040174188b7004f7c601000000740783fe017d16eb06f646ff10740e8b7004b8a8eb79b28b5d0490ff138b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f048b5904891f8b3424893c248b5a04b81100000056ff25e8c1520890909000000000a0000000|@5107,2097151,@52|42,0,@4877 87,0,@4877 142,0,8 149,0,I61 5107:S47|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329726561644172726179283129 5108:D3,40|3b650c7303ff55248b0c248904248b5a04b81500000051ff25e8c152089090900000000024000000|@5109,2097151,@53|18,0,10 25,0,I61 5109:S48|4c696272617279494f537570706f72742e77726170496e46696c65446573637228332972656164566563746f72283129 5110:D3,28|3b650c7303ff55248b5a088b4a0489caff2290900000000018000000|@5111,1048575,@54| 5111:S34|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283129283129 5112:D3,28|3b650c7303ff55248b5a088b4a0489caff2290900000000018000000|@5111,1048575,@55| 5113:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b82500000051ff25e8c1520890900000000028000000|@5114,2097151,@56|9,0,0 23,0,18 30,0,I61 5114:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129676574506f732d283129 5115:D3,40|3b650c7303ff5524508b5a04b827000000909090ff15e8c15208b801000000c30000000024000000|@5116,2097151,@57|13,0,19 22,0,I61 27,0,0 5116:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129736574506f732d283129 5117:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b82900000051ff25e8c1520890900000000028000000|@5118,2097151,@58|9,0,0 23,0,20 30,0,I61 5118:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129656e64506f732d283129 5119:D3,140|3b650c7303ff5524ff7504b8664e7ab2508965046a018b5a04b8230000009090ff15e8c1520883c40459894d04eb1f9090908b650483c4045b895d0483380574088b5d04909090ff13b8ffffffffa801740783f8017c25eb06f640ff10751d89c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000088000000|@5120,2097151,@59|12,0,$5119+50 26,0,17 34,0,I61 74,0,-1 125,0,0 5120:S43|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329617661696c283129 5121:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b83700000051ff25e8c1520890900000000028000000|@5122,2097151,@60|9,0,0 23,0,27 30,0,I61 5122:S49|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329746578745072696d52642d283129 5123:D3,64|3b650c7303ff55246a018b5a04b8210000009090ff15e8c15208a801740783f8017f0eeb06f640ff107406b801000000c3b803000000c390000000003c000000|@5122,2097151,@61|14,0,16 22,0,I61 44,0,0 50,0,1 5124:D3,44|3b650c7303ff5524b8010000008b0c248904248b5a04b80f00000051ff25e8c1520890900000000028000000|@5122,2097151,@62|9,0,0 23,0,7 30,0,I61 5125:D3,964|83782401755983782001744c8b48208b55008d52f03b55087303ff5520895500c742fc03000000c702f0537ab28b318972048b782c897a088062ffbf8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb0abf01000000eb038b7824837820017553837824017507b901000000eb498b48248b55008d52f43b55087303ff5520895500c742fc02000000c70260567ab28b318972048062ffbf8b4d008d49f83b4d087303ff5520894d00c741fc010000008911eb038b482083783401756083783001755ff6402801755ef7c70100000075568b50288b75008d76f03b75087303ff5520897500c746fc03000000c706a0577ab2538b1f895e048b128956088066ffbf8b55008d52f83b55087303ff5520895500c742fc010000008932eb5fe95f000000e908000000ba0100000053eb568b50308b75008d76f03b75087303ff5520897500c746fc03000000c70640587ab2538b1a895e048b502c8956088066ffbf8b55008d52f83b55087303ff5520895500c742fc010000008932eb09e9040000008b50345383783001756083783401755ff6402801755ef6c10175598b58288b75008d76f03b75087303ff5520897500c746fc03000000c706905a7ab2ff7038528b118956048b1b895e088066ffbf8b5d008d5bf83b5d087303ff5520895d00c743fc010000008933eb5fe95f000000e90b000000bb01000000ff703852eb568b58348b75008d76f43b75087303ff5520897500c746fc02000000c706305b7ab2ff7038528b138956048066ffbf8b5d008d5bf83b5d087303ff5520895d00c743fc010000008933eb0ce9070000008b5830ff70385283ff017560f6400801755ff604240175598b50088b34248b7d008d7fec3b7d087303ff5520897d00c747fc04000000c707405c7ab2538b18895f048b368977088b1289570c8067ffbf8b55008d52f83b55087303ff5520895500c742fc01000000893aeb10e908000000ba0100000053eb0389fa5383f901755ff6400801755ef604240175588b48088b1c248b75008d76ec3b75087303ff5520897500c746fc04000000c706645d7ab28b38897e048b3b897e088b19895e0c8066ffbf8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb0ee907000000bf01000000eb0289cf8b4c240c8b1889198b70048971048b58088959088b4c240c8b700c89710c8b4c240c8b58108959108b4c240c8b70148971148b4c240c8b58188959188b4c240c8b701c89711c8b4c240c8979208951248b50288951288b782c89792c5b8959308b4c24085b8959345b895938b80100000083c404c390909000000000c0030000|@5149,63,@71|41,0,@5126 89,0,0 111,0,0 146,0,@5130 245,0,@5134 303,0,0 339,0,@5136 448,0,@5137 509,0,0 548,0,@5139 654,0,@5140 712,0,0 771,0,@5145 828,0,0 945,0,0 5126:D3,512|3b650c7303ff5524a801740df642080174073b42087c0aeb05ff5538ebf48b4208a8017411a801740783f8017d17eb06f640ff10740f89c1b80c117ab28b5d04909090ff1383f801742481f8f1ffff07760f89c1b804567ab28b5d04909090ff1389c183c106c1e90283c901eb05b90300000089c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fb8010000003bd87617d1e8c60407208d44000183c0023b650c7303ff5524ebe58b45008d40e43b45087303ff5520894500c740fc02000000897804891889c18d400cc740fc03000000894808895804c70001000000518b52049090ff128b4d008d49f83b4d087303ff5520894d00c741fc01000000890151bb010000008b442404909090e876c6ffff8b480883c404837804017506b848c05208c38378040375128b108b5904d1ea0fb614138d54120189d0c38b500483c20ec1ea0283ca0181faffffff0172118b188b7004b8e00c7ab28b5d049090ff138b590489d18b108b7004b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1ee89378d74360189f089de89f989cf89cb89c1d1e9d1ea03f28d54120183c704f3a48d7c3f018d7436018d4c09018063ffbf89d8c390909000000000fc010000|@5129,1048575,@63|57,0,@4949 76,0,67108856 85,0,@5127 111,0,1 118,0,0 170,0,0 250,0,0 290,0,0 302,1,@5014 319,0,I48 362,0,16777215 374,0,@4941 396,0,0 5127:O4|4,@4943,0,@5128 5128:O5|@4880,169,0,169,0 5129:S37|5072696d494f28292e6175676d656e7452656164657228312972656164566563272d283129 5130:D3,208|3b650c7303ff5524ff30ff70088b40048b520490ff128b0c24a8017407ba03000000eb068b108d541201f64424040174168b5c2404f6c301740783fb017d16eb06f643ff10740e89c3b8a8eb79b28b5d049090ff138d5bff03da3b19760f89c3b844577ab28b5d04909090ff13a80174188b49048b542404d1ead1e88804118d4400018d541201eb2689c68b790489d18b542404d1e983c604d1ea03fa8d541201f3a48d7c3f018d7436018d4c090189c1f6c1017407b803000000eb068b018d44000183c408c39000000000cc000000|@5133,1048575,@64|30,0,1 74,0,@4877 97,0,@5131 183,0,1 5131:O4|11,@4879,0,@5132 5132:O5|@4900,1182,0,1182,0 5133:S37|5072696d494f28292e6175676d656e7452656164657228312972656164417272272d283129 5134:D3,92|3b650c7303ff55245052b8010000008b4a0889caff1283f801742f8b04248b48048b44240489ca90ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b80100000083c408c3900000000058000000|@5135,1048575,@65|11,0,0 75,0,0 5135:S39|5072696d494f28292e6175676d656e74526561646572283129726561645665634e42272d283129 5136:D3,572|3b650c7303ff5524a801740df642080174073b42087c0aeb05ff5538ebf48b4208a8017411a801740783f8017d17eb06f640ff10740f89c1b80c117ab28b5d04909090ff1383f801742481f8f1ffff07760f89c1b804567ab28b5d04909090ff1389c183c106c1e90283c901eb05b90300000089c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fb8010000003bd87617d1e8c60407208d44000183c0023b650c7303ff5524ebe58b45008d40e43b45087303ff5520894500c740fc02000000897804891889c18d400cc740fc03000000894808895804c70001000000518b52049090ff12a80175678b4d008d49f83b4d087303ff5520894d00c741fc010000008b00890151bb010000008b44240490e822c2ffff8b4808837804017507ba48c05208eb678378040375118b108b5904d1ea0fb614138d541201eb728b500483c20ec1ea0283ca0181faffffff01eb05e9b200000072118b188b7004b8e00c7ab28b5d049090ff138b590489d18b108b7004b8010000008d7c0902f7df037d003b7d0872053b7d00720aeb05e958000000ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d440001eb05e9360000005fd1ee89378d74360189f089de89f989cf89cb89c1d1e9d1ea03f28d54120183c704f3a48d7c3f018d7436018d4c09018063ffbf89da8b45008d40f83b45087303ff5520894500c740fc01000000891083c404c3b80100000083c404c39090900000000038020000|@5135,1048575,@66|57,0,@4949 76,0,67108856 85,0,@5127 111,0,1 118,0,0 170,0,0 250,0,0 296,0,0 306,1,@5014 320,0,I48 363,0,16777215 382,0,@4941 404,0,0 553,0,0 5137:D3,92|3b650c7303ff55245052b8010000008b4a0889caff1283f801742f8b04248b48048b44240489ca90ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b80100000083c408c3900000000058000000|@5138,1048575,@67|11,0,0 75,0,0 5138:S39|5072696d494f28292e6175676d656e74526561646572283129726561644172724e42272d283129 5139:D3,252|3b650c7303ff5524ff30ff70088b40048b520490ff12a801756c8b0c248b18f6c3017407ba03000000eb068b138d541201f64424040174198b742404f7c601000000740783fe017d14eb06f646ff10740cb8a8eb79b28b5d049090ff138d76ff03f23b31760bb844577ab28b5d0490ff13f6c301741f8b49048b542404d1ead1eb881c11eb05e9600000008d5c1b018d541201eb2689de8b790489d18b542404d1e983c604d1ea03fa8d541201f3a48d7c3f018d7436018d4c0901f6c3017407b903000000eb068b0b8d4c09018b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b80100000083c408c300000000f8000000|@5138,1048575,@68|37,0,1 82,0,@4877 103,0,@5131 193,0,1 236,0,0 5140:D3,156|3b650c7303ff55245250b8010000008b4a0c89caff128b4424048b48085889caff12a80174678b0c248b55008d52f03b55087303ff5520895500c742fc03000000c74208f05c7ab2c74204501b7ab28b4904890a8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c005d7ab2895108c741049cf379b2c7012ce039b289c289c88b5d0490ff138b0083c404c3900000000098000000|@5144,1048575,@69|11,0,0 68,0,@5141 75,0,@5011 111,0,@5142 121,0,@4908 127,0,@4580 5141:S7|72656164566563 5142:O5|@5143,239,0,242,0 5143:S18|2e2f62617369732f5072696d494f2e736d6c 5144:S38|5072696d494f28292e6175676d656e745265616465722831297265616456656327272d283129 5145:D3,156|3b650c7303ff55245250b8010000008b4a0c89caff128b4424048b48085889caff12a80174678b0c248b55008d52f03b55087303ff5520895500c742fc03000000c74208145e7ab2c74204501b7ab28b4904890a8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c245e7ab2895108c741049cf379b2c7012ce039b289c289c88b5d0490ff138b0083c404c3900000000098000000|@5148,1048575,@70|11,0,0 68,0,@5146 75,0,@5011 111,0,@5147 121,0,@4908 127,0,@4580 5146:S7|72656164417272 5147:O5|@5143,262,0,265,0 5148:S38|5072696d494f28292e6175676d656e745265616465722831297265616441727227272d283129 5149:S25|5072696d494f28292e6175676d656e74526561646572283129 5150:S35|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329 5151:O1|11 5152:D3,288|3b650c7303ff552452ff7504b9065f7ab25189650489da90ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40459894d0483c404c3908b650483c4045b895d0483380575098b4808f6410401740b89c189c88b5d049090ff138b51048b1c24837b0c0174228b730c8b3af7c7010000007508f606017503ff55383b3e7509b80100000083c404c3837b080174228b73088b3af7c7010000007508f606017503ff55383b3e7509b80100000083c404c3837b040174198b5b048b32f7c6010000007508f603017503ff55383b3374338b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430cf85f7ab2894b088b70048973048b38893b89d88b5d04ff13b80100000083c404c39090000000001c010000|@5155,1048575,@73|13,0,$5152+66 139,0,0 179,0,0 245,0,@5153 270,0,0 5153:O5|@5154,118,0,118,0 5154:S28|2e2f62617369732f4c696272617279494f537570706f72742e736d6c 5155:S31|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283229 5156:O1|115 5157:D3,20|8b52048910b801000000c3900000000010000000|@5158,5,@74|6,0,0 5158:S37|4261736963496d7065726174697665494f28292e736574496e73747265616d283229283129 5159:S19|54657874494f2e6f6e53746172745570283129 5160:O5|0,@5162,@5161,1285,0 5161:O3|1,@4588,@20267 5162:S1286|282a0a20202020436f707972696768742028632920323030362d31302020446176696420432e204a2e204d617474686577730a0a2020202054686973206c696272617279206973206672656520736f6674776172653b20796f752063616e2072656469737472696275746520697420616e642f6f720a202020206d6f6469667920697420756e64657220746865207465726d73206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e7365206173207075626c697368656420627920746865204672656520536f66747761726520466f756e646174696f6e3b206569746865720a2020202076657273696f6e20322e31206f6620746865204c6963656e73652c206f722028617420796f7572206f7074696f6e2920616e79206c617465722076657273696f6e2e0a202020200a2020202054686973206c69627261727920697320646973747269627574656420696e2074686520686f706520746861742069742077696c6c2062652075736566756c2c0a2020202062757420574954484f555420414e592057415252414e54593b20776974686f7574206576656e2074686520696d706c6965642077617272616e7479206f660a202020204d45524348414e544142494c495459206f72204649544e45535320464f52204120504152544943554c415220505552504f53452e20205365652074686520474e550a202020204c65737365722047656e6572616c205075626c6963204c6963656e736520666f72206d6f72652064657461696c732e0a202020200a20202020596f752073686f756c642068617665207265636569766564206120636f7079206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e736520616c6f6e6720776974682074686973206c6962726172793b206966206e6f742c20777269746520746f20746865204672656520536f6674776172650a20202020466f756e646174696f6e2c20496e632e2c203531204672616e6b6c696e2053742c20466966746820466c6f6f722c20426f73746f6e2c204d41202030323131302d3133303120205553410a2a290a0a282a20436f6d70696c65722074686520636f6d70696c657220616e64206578706f7274206974206173206120706f727461626c652066696c652e20205468652072657374206f66207468650a202020626f6f7473747261702070726f63657373206973207468656e20646f6e65207768656e2074686520706f727461626c652066696c6520697320696d706f727465642e202a290a0a506f6c794d4c2e7072696e745f646570746820303b0a0a506f6c794d4c2e757365202262617369732f52756e74696d6543616c6c73223b0a0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c65722f426f6f74223b0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c6572223b0a0a506f6c794d4c2e7368617265436f6d6d6f6e44617461204d4c436f6d70696c65722e7368656c6c3b0a0a506f6c794d4c2e6578706f7274506f727461626c652822706f6c7974656d70222c0a20202020666e202829203d3e20284d4c436f6d70696c65722e7368656c6c28293b204f532e50726f636573732e65786974204f532e50726f636573732e73756363657373292068616e646c65205f203d3e204f532e50726f636573732e65786974204f532e50726f636573732e6661696c757265293b0a 5163:O2|1,@5164 5164:O15|@5102,@5166,@5167,@5169,0,0,@5170,0,@5171,@5173,@5175,4096,@5177,@5165,0 5165:O1|@5179 5166:O2|@5119,I148 5167:O1|@5168 5168:O2|@5121,I148 5169:O2|@5124,I148 5170:O1|I148 5171:O1|@5172 5172:O2|@5106,I148 5173:O1|@5174 5174:O2|@5108,I148 5175:O1|@5176 5176:O2|@5123,I148 5177:O1|@5178 5178:O3|@5137,@5172,@5176 5179:O3|@5134,@5174,@5176 5180:O2|@5182,@5181 5181:O3|@5183,@5184,@20268 5182:D3,32|3b650c7303ff55248b5a04b825000000ff2508cd52089090000000001c000000|@5087,2097151,@76|12,0,18 18,0,I150 5183:D3,112|3b650c7303ff55248b42088b00b90100000052a801754bff7004ff7504b992677ab2518965048b088b54240cff71108b5a0489c890e8fec1ffff83c40459894d04eb129090908b650483c4045b895d04b80100000089c1583b650c7303ff5524ebb189c883c404c3000000006c000000|@5089,2097151,@77|14,0,0 30,0,$5183+70 54,1,@5038 81,0,0 5184:O3|@5185,@20269,@20268 5185:D3,44|3b650c7303ff55248b4808ff7108ff72088b5a0490e826000000b8010000005aff2290900000000028000000|@5098,2097151,@80|22,1,@5186 27,0,0 5186:D3,236|3b650c7303ff55248b480c8b0983f9037508b801000000c204008b480cc701030000005053ff700cb8010000008b4c24048b0983f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc78b4c240433c083c0fef00fc10183c0fe83f801741989cbb8030000009090ff1568c352083b650c7303ff5524eb948b4424108b005b9090e85e0000008b4c240c89018b142433c083c002f00fc10283c00283f803741a89d09090ff15e8c252088b1c24b8050000009090ff1568c3520883c404585983c40451e9f8afffff00000000e8000000|@5097,2097151,@79|19,0,0 31,0,1 41,0,0 57,0,0 65,0,20000 72,0,0 126,0,1 134,0,I73 158,1,@5187 194,0,I69 202,0,2 210,0,I73 224,1,@5009 5187:D3,88|3b650c7303ff5524a801753d8b083b590c742c518b40049090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b7ffffffb801000000c3900000000054000000|@5094,11,@78|74,0,0 5188:O2|@5190,@5189 5189:O2|@4862,0 5190:O6|@5191,@4590,@5192,@4591,@20270,@4589 5191:O2|4096,@81 5192:O14|@5194,@5195,@5197,0,0,@5198,0,@5199,@5201,@5203,4096,0,@5205,@5193 5193:O1|@5207 5194:S6|737464457272 5195:O1|@5196 5196:O2|@4869,I202 5197:O2|@4872,I202 5198:O1|I202 5199:O1|@5200 5200:O2|@4876,I202 5201:O1|@5202 5202:O2|@4884,I202 5203:O1|@5204 5204:O2|@4888,I202 5205:O1|@5206 5206:O3|@4891,@5200,@5204 5207:O3|@4894,@5202,@5204 5208:D3,92|3b650c7303ff5524a8017541ff308b4004e8eaffffffff7504b8e66a7ab250896504b8010000008b54240890ff1283c40459894d0483c404c3908b650483c4045b895d04b80100000083c404c3b801000000c3900000000058000000|@5209,1048575,@82|26,0,$5208+58 35,0,0 69,0,0 78,0,0 5209:S20|506f6c794d4c2e72756e4f6e456e747279283129 5210:O2|@20271,@5211 5211:O4|1,@4593,@4594,@4592 5212:O2|@5213,80 5213:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@5217,2097151,@84|12,1,@5214 5214:D3,232|3b650c7303ff5524a8017407b903000000eb068b088d4c0901ba010000005083f901746089c883e80283e902f604240174058b0c24eb1083c1088b3424d1e90fb60c0e8d4c0901f6c10175108b31f641ff107402f7de8d743601eb0289ce89c1b80f00000083e801d1eaf7e283c0018d5412018d40ff03c689c23b650c7303ff5524eb9bf6c30175108b03f643ff107402f7d88d440001eb0289d889d189c389c883c40483eb017503ff553483e80133d2f7f383c30183c2018d440001f6c201740783fa017d15eb06f642ff10740d89d3b88c6c7ab2ff2588c7520889d0c39000000000e4000000|@5216,2097151,@83|13,0,1 26,0,0 97,0,7 210,0,@5215 216,0,I106 5215:B4|00000080 5216:S22|486173685461626c652e6861736856616c7565283229 5217:S25|486173685461626c652e6861736856616c7565283129283129 5218:O2|@5309,@20250 5219:O2|@5221,@5220 5220:O2|@5222,0 5221:S2|3c3d 5222:O4|@4596,69,@5223,0 5223:O7|@5221,2,@5230,@5231,@5229,0,0 5224:O1|@5225 5225:O1|@5226 5226:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@85|1,0,@5227 5227:O2|3,63 5228:S13|7072696e742d64656661756c74 5229:O2|@5258,0 5230:O2|3,8 5231:O3|2,@5233,@5232 5232:O5|5,0,@5244,@5243,0 5233:O3|3,@5235,@5234 5234:O3|0,@5241,1 5235:O2|@5237,@5236 5236:O2|@5240,0 5237:O2|49,@5238 5238:O3|6,@4597,79992 5239:O2|4,0 5240:O2|50,@5238 5241:O2|49,@5242 5242:O2|50,0 5243:O3|@5244,@5229,@5245 5244:S4|626f6f6c 5245:O3|@5247,@5254,@5246 5246:O3|@5244,@5256,@5255 5247:O2|1,@5248 5248:O3|2,@5249,0 5249:O4|I251,@4598,1,1 5250:O1|@5251 5251:D3,16|b8f06e7ab2c39090000000000c000000|@5253,1,@86|1,0,@5252 5252:O2|3,63 5253:S37|545950455f5452454528292e64656661756c744d6f6e6f547970655072696e746572283129 5254:O4|1,@4599,0,0 5255:S8|496e204261736973 5256:O5|@5257,0,0,0,0 5257:S14|5374616e64617264204261736973 5258:O2|0,@5256 5259:O2|@5261,@5260 5260:O2|@5262,0 5261:S2|3e3d 5262:O4|@4596,69,@5263,0 5263:O7|@5261,2,@5230,@5231,@5229,0,0 5264:O2|@5266,@5265 5265:O2|@5267,0 5266:S4|74727565 5267:O4|@4596,69,@5268,0 5268:O7|@5266,@5270,@5269,@5232,@5229,0,0 5269:O2|1,@5271 5270:O2|1,2 5271:O3|14,@5272,0 5272:O2|@5274,@5273 5273:O2|@5281,0 5274:O2|7,@5275 5275:O8|@5277,@5266,0,0,@5276,0,0,1 5276:O2|@5280,0 5277:O4|13,1,@5278,1 5278:O2|4,@5279 5279:O2|0,0 5280:O2|1,0 5281:O3|2,1,0 5282:O2|@5284,@5283 5283:O2|@5285,0 5284:S3|65786e 5285:O4|@4600,69,@5286,0 5286:O2|@5287,0 5287:O3|@5284,@5229,@5288 5288:O3|@5290,@5296,@5289 5289:O3|@5284,@5256,@5255 5290:O2|1,@5291 5291:O3|2,@5292,0 5292:O4|0,@4601,2,1 5293:O1|@5294 5294:D3,16|b8f06e7ab2c39090000000000c000000|@5295,1,@87|1,0,@5252 5295:S40|545950455f5452454528292e6d616b655479706528332964656661756c745072696e746572283129 5296:O4|1,@4602,0,0 5297:O2|@5299,@5298 5298:O2|@5300,0 5299:S3|636872 5300:O4|@4596,69,@5301,0 5301:O7|@5299,2,@5303,@5302,@5229,0,0 5302:O3|2,@5307,@5306 5303:O2|1,@5304 5304:O2|7,@5305 5305:O8|@5278,@5299,0,0,@5276,0,0,1 5306:O5|5,0,@5317,@5316,0 5307:O5|5,0,@5309,@5308,0 5308:O3|@5309,@5229,@5310 5309:S3|696e74 5310:O3|@5312,@5315,@5311 5311:O3|@5309,@5256,@5255 5312:O2|1,@5313 5313:O3|2,@5314,0 5314:O4|I113,@4603,3,1 5315:O4|1,@4604,0,0 5316:O3|@5317,@5229,@5318 5317:S6|737472696e67 5318:O3|@5320,@5462,@5319 5319:O3|@5317,@5256,@5255 5320:O2|1,@5321 5321:O3|2,@5323,@5322 5322:O2|@5328,@5327 5323:O4|@5324,@4605,3,1 5324:O1|@5325 5325:D3,92|3bc37506b803000000c3a801753ef6c3017539f6c3017407b903000000eb068b0b8d4c090183c10889c689dfd1e93bc9f3a68d7c3f018d7436018d4c09017406b801000000c3b803000000c3b801000000c390900000000058000000|@5326,59,@88|5,0,1 25,0,1 65,0,0 71,0,1 77,0,0 5326:S14|737472696e67457175616c697479 5327:O2|@5425,0 5328:O4|@4606,69,@5329,0 5329:O2|@5331,@5330 5330:O2|0,@5424 5331:O2|@5333,@5332 5332:O2|@5333,0 5333:O4|@4607,69,@5334,0 5334:O3|0,@5336,@5335 5335:O5|@5388,@5415,I49,@5421,@5387 5336:O8|@5338,@5326,0,0,@5337,0,0,1 5337:O2|@5380,@5379 5338:O4|1,@5340,@5281,@5339 5339:O4|1,@5349,@5361,@5348 5340:O4|3,@5342,@5341,1 5341:O3|2,I251,0 5342:O2|@5344,@5343 5343:O2|@5345,0 5344:O2|@5278,1 5345:O2|@5346,1 5346:O2|4,@5347 5347:O2|0,1 5348:O3|2,0,0 5349:O4|1,@5351,@5350,@5348 5350:O4|3,@5358,@5352,1 5351:O4|3,@5353,@5352,1 5352:O3|2,I218,0 5353:O2|@5354,0 5354:O2|@5355,1 5355:O4|3,@5357,@5356,1 5356:O3|2,I105,0 5357:O2|@5344,0 5358:O2|@5359,0 5359:O2|@5360,1 5360:O4|3,@5343,@5356,1 5361:O4|3,@5363,@5362,1 5362:O3|2,I154,0 5363:O2|@5344,@5364 5364:O2|@5366,@5365 5365:O2|@5345,@5367 5366:O2|@5348,1 5367:O2|@5366,@5368 5368:O2|@5369,0 5369:O2|@5370,1 5370:O4|3,@5372,@5371,1 5371:O3|2,I239,0 5372:O2|@5374,@5373 5373:O2|@5376,0 5374:O2|@5375,1 5375:O3|2,4,0 5376:O2|@5377,1 5377:O4|3,@5343,@5378,1 5378:O3|2,I223,0 5379:O2|@5385,0 5380:O2|1,@5381 5381:O2|@5383,@5382 5382:O2|@5383,@5384 5383:O1|3 5384:O2|@5383,0 5385:O2|1,@5386 5386:O2|@5383,@5381 5387:O1|@5422 5388:D3,48|3b650c7303ff5524ff7204683c787ab2ff7208ff720cff72108d5c240ce89200000083c408c39090000000002c000000|@5410,1048575,@96|12,0,@5389 30,1,@5391 5389:D3,44|3b650c7303ff5524538b5204ff128b0c248b1089118b5804895904b80100000083c404c30000000028000000|@5390,1048575,@89|28,0,0 5390:S39|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e2832292d45 5391:D3,528|3b650c7303ff55246a016a0189d989e389ca9090ff126a016a018b442408833801751189e18b5004891189e18b5808895904eb688b4804833905740db8d07a7ab28b5d04909090ff13f641040174158b5c241cbaffffff002353fc8d5412013b5104770db8cc7b7ab28b5d04909090ff138b51048b5453fe83fa01750cb8147c7ab28b5d049090ff13f6410401751a8b71048b16f646ff107409eb05e941000000f7da8d541201eb038b510483c2028b7424188b5456fe8b7904f7c701000000740583c7027105ff5538ebf65289f88b54241890ff128d4c24045a891189e18941048b44240c83380175668b4d008d49e83b4d087303ff5520894d00c741fc05000000c7016c7c7ab28b50088951048b5c241c8959088b74241889710c8b7c24148979108061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000894a088b4004894204c70201000000eb6b833805756b8b4d008d49e83b4d087303ff5520894d00c741fc05000000c701487d7ab28b50088951048b5c241c8959088b74241889710c8b7c24148979108061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000894a088b4004894204c70205000000eb0ae905000000baec7d7ab28b45008d40e43b45087303ff5520894500c740fc030000008b4c24048948085983c40c894804c7000100000089c18d4010c740fc020000008950048908c20c009090000000000c020000|@5414,1048575,@95|61,0,@5392 84,0,8388607 101,0,@5401 126,0,@5404 261,0,@5407 331,0,0 368,0,@5411 438,0,2 450,0,@5413 494,0,0 5392:O4|@4608,@5398,@5399,@5393 5393:O5|@5400,314,0,314,0 5394:O1|@5395 5395:O1|@5396 5396:D3,28|3b650c7303ff55248b0d3ce039b289caff2290900000000018000000|@5397,1048575,@90|10,0,@4582 5397:S12|7072696e742d737472696e67 5398:S13|496e7465726e616c4572726f72 5399:S43|636f646574726565206e6577456e7669726f6e3a204e6f742045787472616374206f7220436f6e73746e74 5400:S40|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245452e4d4c 5401:O4|11,@4879,0,@5402 5402:O5|@5403,114,0,114,0 5403:S18|2e2f62617369732f566563746f722e736d6c 5404:O4|@4608,@5398,@5406,@5405 5405:O5|@5400,310,0,310,0 5406:S33|5265666572656e636520746f206e6f6e2d6578697374656e742062696e64696e67 5407:D3,80|3b650c7303ff55248b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703d07c7ab28b4a04894b048063ffbf8b72088b3c24893424ff720cff7210ba107d7ab257ff2290000000004c000000|@5410,1048575,@92|34,0,@5408 64,0,@5409 5408:D3,44|3b650c7303ff5524538b5204ff128b0c248b1089118b5804895904b80100000083c404c30000000028000000|@5390,1048575,@91|28,0,0 5409:O1|@5391 5410:S40|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283129283129 5411:D3,80|3b650c7303ff55248b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703ac7d7ab28b4a04894b048063ffbf8b72088b3c24893424ff720cff7210ba107d7ab257ff2290000000004c000000|@5410,1048575,@94|34,0,@5412 64,0,@5409 5412:D3,44|3b650c7303ff5524538b5204ff128b0c248b1089118b5804895904b80100000083c404c30000000028000000|@5390,1048575,@93|28,0,0 5413:O1|1 5414:S37|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283229 5415:O2|@5416,0 5416:D3,120|8b5204f6c201740d89c1b8bc7e7ab28b5d0490ff1383f80175048b12eb1ba801740583e8027105ff5538ebf68b52043b650c7303ff5524ebca8b45008d40e83b45087303ff5520894500c740fc02000000895004c7000300000089c18d400cc740fc02000000c74004ec7d7ab28908c30000000074000000|@5420,7,@97|11,0,@5417 86,0,1 105,0,@5413 5417:O4|11,@4879,0,@5418 5418:O5|@5419,97,0,97,0 5419:S16|2e2f62617369732f4c6973742e736d6c 5420:S49|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429696e6c696e65436f64652d283129 5421:O1|@5324 5422:D3,16|b801000000c39090000000000c000000|@5423,1,@98|1,0,0 5423:S38|434f44455452454528292e67656e436f64652833292831296669656c6450726f70732d283129 5424:O2|0,@5279 5425:O4|@4607,69,@5426,0 5426:O3|2,4,@5427 5427:O5|@5429,@5431,I49,@5446,@5428 5428:O2|@5448,@5447 5429:D3,48|3b650c7303ff5524ff72046830807ab2ff7208ff720cff72108d5c240ce89ef8ffff83c408c39090000000002c000000|@5410,1048575,@100|12,0,@5430 30,1,@5391 5430:D3,44|3b650c7303ff5524538b5204ff128b0c248b1089118b5804895904b80100000083c404c30000000028000000|@5390,1048575,@99|28,0,0 5431:O2|@5433,@5432 5432:O2|@5436,@5435 5433:D3,64|8b5204f6c201740d89c1b8bc7e7ab28b5d0490ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebcb000000003c000000|@5434,7,@101|11,0,@5417 5434:S39|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129283129 5435:O2|@5439,@5438 5436:O2|@5437,@5334 5437:O3|0,@5324,@5332 5438:O2|@5442,@5441 5439:O2|@5440,@5413 5440:O3|0,@4605,0 5441:O2|@5444,0 5442:O2|@5443,@5413 5443:O3|0,3,0 5444:O2|@5445,@5413 5445:O3|0,1,0 5446:O1|@5323 5447:O2|@5449,0 5448:D3,64|8b5204f6c201740d89c1b8bc7e7ab28b5d0490ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebcb000000003c000000|@5423,7,@102|11,0,@5417 5449:O2|@5328,@5450 5450:O2|@5452,@5451 5451:O2|@5452,0 5452:O4|@4607,69,@5453,0 5453:O3|2,4,@5454 5454:O4|@5456,@5458,@5455,@5323 5455:O2|@5332,@5330 5456:D3,224|a80175108b08f640ff107402f7d98d4c0901eb0289c18b5a0c8b4c4bfe8b720889c7f7c601000000740b50b8bc7e7ab28b5d04ff1383ff0175048b36eb1ff7c701000000740583ef027105ff5538ebf68b76043b650c7303ff5524ebc58b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708894f04c707010000008b4a04f6c101740c89c6b8bc7e7ab28b5d04ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebcb8b45008d40f43b45087303ff5520894500c740fc020000008948048938c39000000000dc000000|@5457,63,@103|44,0,@5417 125,0,0 140,0,@5417 5457:S81|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c2831297475706c6550726f70732d696e6c696e6550726f702d7475706c65456e747279283129 5458:O2|@5334,@5459 5459:O2|@5413,@5460 5460:O2|@5413,@5461 5461:O2|@5413,0 5462:O4|1,@4609,0,0 5463:O2|@5465,@5464 5464:O2|@5466,0 5465:S2|3c3e 5466:O4|@4596,69,@5467,0 5467:O7|@5465,2,@5469,@5468,@5229,0,0 5468:O3|2,@5470,@5232 5469:O2|3,6 5470:O3|3,@5471,@5234 5471:O2|@5473,@5472 5472:O2|@5475,0 5473:O2|49,@5474 5474:O3|6,@4610,79996 5475:O2|50,@5474 5476:O2|@5478,@5477 5477:O2|@5479,0 5478:S3|616273 5479:O4|@4596,69,@5480,0 5480:O7|@5478,2,@5230,@5481,@5229,0,0 5481:O3|2,@5238,@5238 5482:O2|@5484,@5483 5483:O2|@5485,0 5484:S5|66616c7365 5485:O4|@4596,69,@5486,0 5486:O7|@5484,@5270,@5487,@5232,@5229,0,0 5487:O2|1,@5488 5488:O3|14,@5489,0 5489:O2|@5491,@5490 5490:O2|@5348,0 5491:O2|7,@5492 5492:O8|@5493,@5484,0,0,@5276,0,0,1 5493:O4|13,0,@5278,1 5494:O2|@5496,@5495 5495:O2|@5497,0 5496:S6|506f6c794d4c 5497:O4|@4611,69,@5498,0 5498:O4|@5496,@5500,@5499,@5229 5499:O6|@5502,I48,0,@5229,@5501,0 5500:O2|1,@5348 5501:O1|@18660 5502:O4|1,@4613,@4614,@4612 5503:O2|@5625,@18658 5504:O2|@5506,@5505 5505:O2|@5507,0 5506:S15|5072657474794c696e65427265616b 5507:O4|@4596,69,@5508,0 5508:O7|@5506,@5510,@5511,@5509,@5229,0,0 5509:O5|5,0,@5651,@5650,@5229 5510:O2|1,5 5511:O2|1,@5512 5512:O3|2,@5514,@5513 5513:O2|@5518,0 5514:O2|@5516,@5515 5515:O1|2 5516:O1|@5517 5517:D3,28|8338057406b801000000c3b803000000c39090900000000018000000|@5506,1,@104|6,0,0 12,0,1 5518:O4|@4607,69,@5519,0 5519:O3|2,2,@5520 5520:O5|@5411,@5522,@5538,@5521,@5387 5521:O22|@5540,@5544,@5547,@5543,@5542,@5552,@5555,@5551,@5550,@5516,@5514,@5560,@5563,@5559,@5558,@5567,@5570,@5566,@5541,@5573,@4616,@5539 5522:O2|@5433,@5523 5523:O2|@5525,@5524 5524:O2|@5536,0 5525:O2|@5527,@5526 5526:O3|0,@5529,@5415 5527:O2|1,@5528 5528:O2|2,8 5529:O8|@5531,@5506,0,0,@5530,0,0,1 5530:O2|@5533,0 5531:O4|13,2,@5532,4 5532:O4|6,@5278,0,0 5533:O2|1,@5534 5534:O2|@5535,0 5535:O3|2,0,@5384 5536:O2|@5537,@5413 5537:O3|0,@5515,0 5538:O21|2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2 5539:O4|@5573,@4616,3,1 5540:O6|@5539,@5542,@5550,@5514,@5558,@5541 5541:O3|@5567,@5570,@5566 5542:O3|@5544,@5547,@5543 5543:O1|@5549 5544:O1|@5545 5545:D3,28|8338017406b801000000c3b803000000c39090900000000018000000|@5546,1,@105|6,0,0 12,0,1 5546:S11|507265747479426c6f636b 5547:O1|@5548 5548:D3,64|8b480c8b50088b58048b308b45008d40e83b45087303ff5520894500c740fc0500000089481089500c895808897004c70001000000c39090000000003c000000|@5546,31,@106|49,0,0 5549:D3,56|8b48108b500c8b58088b70048b45008d40ec3b45087303ff5520894500c740fc0400000089480c8950088958048930c30000000034000000|@5546,31,@107| 5550:O3|@5552,@5555,@5551 5551:O1|@5557 5552:O1|@5553 5553:D3,28|8338037406b801000000c3b803000000c39090900000000018000000|@5554,1,@108|6,0,0 12,0,1 5554:S11|507265747479427265616b 5555:O1|@5556 5556:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c390900000000030000000|@5554,7,@109|37,0,1 5557:D3,44|8b48088b50048b45008d40f43b45087303ff5520894500c740fc020000008948048910c30000000028000000|@5554,7,@110| 5558:O3|@5560,@5563,@5559 5559:O1|@5565 5560:O1|@5561 5561:D3,28|8338077406b801000000c3b803000000c39090900000000018000000|@5562,1,@111|6,0,0 12,0,1 5562:S12|507265747479537472696e67 5563:O1|@5564 5564:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c30000000028000000|@5562,3,@112|31,0,3 5565:D3,12|8b4004c30000000008000000|@5562,1,@113| 5566:O1|@5572 5567:O1|@5568 5568:D3,28|8338097406b801000000c3b803000000c39090900000000018000000|@5569,1,@114|6,0,0 12,0,1 5569:S21|507265747479537472696e67576974685769647468 5570:O1|@5571 5571:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70009000000c390900000000030000000|@5569,7,@115|37,0,4 5572:D3,44|8b48088b50048b45008d40f43b45087303ff5520894500c740fc020000008948048910c30000000028000000|@5569,7,@116| 5573:O1|@5574 5574:D3,16|b801000000c39090000000000c000000|@5575,1,@117|1,0,0 5575:S5|6e6f2d6571 5576:O2|@5577,@4616 5577:D3,2444|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b868977ab2c38b18833b01756cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980977ab2eb6489cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b0524e239b252ff731051ff730ceb05e937030000ff73085089f85a9090ff128b4c2408f6c101740c83f9037d14eb0be945020000f641ff107407b980977ab2eb5bf6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b0c24890a8b0dfce139b25089d089ca9090ff128b4c240cf6c101740783f9057d14eb06f641ff10740cb980977ab2eb6fe98e010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c2408890a8b0dd4e339b25052b8289b7ab289ca90ff1289c15889ca90ff128b4c2410f6c101740583e9027105ff5538ebf68b55008d52e83b5508730aeb05e9d6000000ff5520895500c742fc02000000894a048b4c2414890a8b0dd4e339b28b5c24188d720cc746fc02000000c70614a47ab28b5b04895e048066ffbf89c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897004c70001000000535289ca9090ff1289c15889ca90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc02000000894104588901eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc020000008941045883c41489018b45008d40dc3b45087303ff5520894500c740fc020000008948049090c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8017507b801000000eb05b80300000083f0028b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70054a47ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3f6c101740783f9037d0eeb06f641ff107406b868977ab2c3833b037569f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980977ab2eb7589caf6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530489168b3d24e239b2ff73085189f089faeb05e970010000909090ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e96e000000894a0459890a8b0d24e239b25089d089ca9090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8017507b801000000eb05b80300000083f0028b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70084a47ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3f6c101740783f9037d0eeb06f641ff107406b868977ab2c3833b057506b8b4a47ab2c3f6c101740783f9037d0eeb06f641ff107406b868977ab2c3833b07755ef6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4b04890a8b3534e239b289d089f29090ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70000a57ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5004f6c201740783fa037d0eeb06f642ff107406b868977ab2c38b30f6c201740583ea027105ff5538ebf6f6c201740783fa017d0feb06f642ff107407ba80977ab2eb7189d7f7c701000000740583ef027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008979048b7e0489398b1d34e239b2ff76085289c889daff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a04eb05e96900000059890a8b0d24e239b25089d089ca9090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8017507b801000000eb05b80300000083f0028b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70030a57ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3900000000088090000|@5632,1048575,@123|30,0,@5578 76,0,@5580 136,0,@4603 194,0,@5580 249,0,@4598 285,0,@5580 346,0,@4617 353,0,@5601 431,0,@4617 451,0,@5631 494,0,1 501,0,3 510,0,0 557,0,@5590 578,0,@5592 597,0,@5593 651,0,@5592 670,0,@5593 724,0,@5592 743,0,@5593 799,0,@5594 819,0,0 826,0,0 833,0,1 839,0,0 848,0,0 855,0,1 889,0,0 910,0,@5592 931,0,@5633 953,0,0 960,0,0 967,0,1 973,0,0 997,0,@5578 1041,0,@5580 1098,0,@4603 1177,0,@4603 1217,0,@5590 1238,0,@5592 1257,0,@5593 1308,0,@5594 1328,0,0 1335,0,0 1342,0,1 1348,0,0 1357,0,0 1364,0,1 1398,0,0 1419,0,@5592 1438,0,@5636 1460,0,0 1467,0,0 1474,0,1 1480,0,0 1504,0,@5578 1515,0,@5639 1539,0,@5578 1598,0,@4605 1653,0,123 1662,0,91 1695,0,@5642 1735,0,@5643 1771,0,@5594 1791,0,0 1798,0,1 1805,0,3 1811,0,0 1850,0,0 1871,0,@5592 1890,0,@5644 1912,0,0 1919,0,0 1926,0,1 1932,0,0 1959,0,@5578 2000,0,@5580 2060,0,@4605 2129,0,@4603 2169,0,@5590 2190,0,@5592 2209,0,@5593 2258,0,@5594 2278,0,0 2285,0,0 2292,0,1 2298,0,0 2307,0,0 2314,0,1 2348,0,0 2369,0,@5592 2388,0,@5647 2410,0,0 2417,0,0 2424,0,1 2430,0,0 5578:O2|3,@5579 5579:S3|2e2e2e 5580:O2|@5581,0 5581:O2|3,@5582 5582:S4|2e2e2e29 5583:O2|@5584,@4617 5584:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700fc977ab28948048b52048950088060ffbfc390900000000034000000|@5600,7,@119|28,0,@5585 5585:D3,568|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b868977ab2c38338017506b8489a7ab2c3f6c101740783f9037d0eeb06f641ff107406b868977ab2c38b18f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980977ab2eb708b720489cff7c701000000740583ef027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008978048b3b893852ff7304518b56049090ff1259f6c101740583e9027105ff5538ebf68b55008d52e03b55087303ff5520895500c742fc02000000894a0459eb05e99d000000890a8b0c248b59088b1b8b710489c78d420cc740fc040000008b4e0c89480c8b4e088948088b4e04894804c70001000000575289da9090ff1289c15889ca90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc020000008941045883c40489018b45008d40a03b45087303ff5520894500c740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700c49a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3900000000034020000|@5599,1048575,@118|30,0,@5578 41,0,@5586 65,0,@5578 106,0,@5580 274,0,0 321,0,@5590 342,0,@5592 361,0,@5593 415,0,@5594 435,0,0 442,0,0 449,0,1 455,0,0 472,0,0 493,0,@5592 512,0,@5595 534,0,0 541,0,0 548,0,1 554,0,0 5586:O5|0,0,0,@5229,@5587 5587:O2|@5588,0 5588:O2|3,@5589 5589:S3|6e696c 5590:O2|@5591,0 5591:O2|3,41 5592:O3|1,1,0 5593:O2|3,44 5594:O2|3,40 5595:O5|0,0,0,@5229,@5596 5596:O2|@5597,0 5597:O2|3,@5598 5598:S2|3a3a 5599:S10|7072696e742d6c697374 5600:S11|7072696e746c6973742829 5601:O4|0,@5602,3,1 5602:O1|@5603 5603:D3,28|3b650c7303ff55248b0ddce339b289caff2290900000000018000000|@5630,1048575,@121|10,0,@4618 5604:O1|@5605 5605:D3,1776|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b868977ab2c38b10833a01756bf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5c8b5a0489cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b0524e239b2515389c2eb05e96c04000089f8ff128b4c2404f6c101740c83f9037d14eb0be994030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3524e239b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b3534e239b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3524e239b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d24e239b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab28b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8018b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c7006ca37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b868977ab2c3f6c301740583eb027105ff5538ebf6f6c301740783fb017d0feb06f643ff107407bb80977ab2eb7289def7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b720489378b0d34e239b2ff72085389f889ca90ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a04eb05e96900000059890a8b0d34e239b25089d089ca9090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d590cc743fc02000000894b045889038b45008d40dc3b45087303ff5520894500c740fc02000000895804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000a8018b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700b4a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000ec060000|@5630,1048575,@120|30,0,@5578 76,0,@5606 139,0,@4603 186,0,@5606 244,0,@4603 281,0,@5606 344,0,@4605 381,0,@5606 445,0,@4603 522,0,@4603 561,0,@5609 582,0,@5592 601,0,@5611 620,0,@5592 639,0,@5593 688,0,@5592 709,0,@5613 747,0,@5592 766,0,@5593 815,0,@5592 836,0,@5615 872,0,@5592 891,0,@5593 940,0,@5592 961,0,@5617 999,0,@5592 1018,0,@5593 1070,0,@5592 1091,0,@5619 1124,0,@5621 1144,0,0 1151,0,0 1158,0,1 1164,0,0 1197,0,0 1218,0,@5592 1239,0,@5622 1261,0,0 1268,0,0 1275,0,1 1281,0,0 1308,0,@5578 1347,0,@5580 1407,0,@4605 1477,0,@4605 1517,0,@5590 1538,0,@5592 1557,0,@5593 1606,0,@5594 1626,0,0 1633,0,0 1640,0,1 1646,0,0 1679,0,0 1700,0,@5592 1719,0,@5626 1741,0,0 1748,0,0 1755,0,1 1761,0,0 5606:O2|@5607,0 5607:O2|3,@5608 5608:S4|2e2e2e7d 5609:O2|@5610,0 5610:O2|3,125 5611:O2|3,@5612 5612:S15|7374617274506f736974696f6e203d 5613:O2|3,@5614 5614:S11|73746172744c696e65203d 5615:O2|3,@5616 5616:S6|66696c65203d 5617:O2|3,@5618 5618:S13|656e64506f736974696f6e203d 5619:O2|3,@5620 5620:S9|656e644c696e65203d 5621:O2|3,123 5622:O5|0,0,0,@5229,@5623 5623:O2|@5624,0 5624:O2|3,@5625 5625:S15|436f6e746578744c6f636174696f6e 5626:O5|0,0,0,@5229,@5627 5627:O2|@5628,0 5628:O2|3,@5629 5629:S15|436f6e7465787450726f7065727479 5630:S13|7072696e742d636f6e74657874 5631:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@5632,1048575,@122| 5632:S12|7072696e742d707265747479 5633:O5|0,0,0,@5229,@5634 5634:O2|@5635,0 5635:O2|3,@5546 5636:O5|0,0,0,@5229,@5637 5637:O2|@5638,0 5638:O2|3,@5554 5639:O5|0,0,0,@5229,@5640 5640:O2|@5641,0 5641:O2|3,@5506 5642:O2|@5643,@5590 5643:O3|1,0,0 5644:O5|0,0,0,@5229,@5645 5645:O2|@5646,0 5646:O2|3,@5562 5647:O5|0,0,0,@5229,@5648 5648:O2|@5649,0 5649:O2|3,@5569 5650:O3|@5651,@5229,@5652 5651:S6|707265747479 5652:O3|@5654,@5672,@5653 5653:O3|@5673,@5256,@5255 5654:O2|1,@5655 5655:O3|2,@5539,@5656 5656:O2|@5657,0 5657:O4|@4607,69,@5658,0 5658:O3|2,4,@5659 5659:O5|@5411,@5660,@5538,@5521,@5387 5660:O2|@5433,@5661 5661:O2|@5663,@5662 5662:O2|@5669,@5438 5663:O2|@5665,@5664 5664:O3|0,@5667,@5415 5665:O2|1,@5666 5666:O2|2,18 5667:O8|@5348,@5575,0,0,@5668,0,0,1 5668:O2|@5280,@5276 5669:O2|@5670,@5413 5670:O2|1,@5671 5671:O2|2,19 5672:O4|1,@4619,0,0 5673:S13|506f6c794d4c2e707265747479 5674:O2|@5676,@5675 5675:O2|@5677,0 5676:S12|707450726f70657274696573 5677:O4|@4600,69,@5678,0 5678:O2|@5680,@5679 5679:O2|@5692,@5691 5680:O3|@5676,@5229,@5681 5681:O3|@5683,@5689,@5682 5682:O3|@5690,@5256,@5255 5683:O2|1,@5684 5684:O3|2,@5685,0 5685:O4|0,@4620,3,1 5686:O1|@5687 5687:D3,16|b8f06e7ab2c39090000000000c000000|@5688,1,@124|1,0,@5252 5688:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f747970655072696e746572283129 5689:O4|1,@4621,0,0 5690:S19|506f6c794d4c2e707450726f70657274696573 5691:O2|@5768,@5767 5692:O7|@5694,@5695,@5696,@5693,@5229,0,0 5693:O3|2,@5713,@5712 5694:S12|5054627265616b506f696e74 5695:O2|0,14 5696:O2|1,@5697 5697:O3|14,@5698,0 5698:O2|@5700,@5699 5699:O2|@5704,@5703 5700:O2|7,@5701 5701:O8|@5702,@5694,0,0,@5276,0,0,1 5702:O4|13,0,@5532,13 5703:O2|@5709,0 5704:O2|7,@5705 5705:O8|@5706,@5694,0,0,@5276,0,0,1 5706:O3|14,@5707,1 5707:O2|@5348,@5708 5708:O2|@5278,0 5709:O2|7,@5710 5710:O8|@5711,@5694,0,0,@5276,0,0,1 5711:O4|6,@5278,1,1 5712:O5|5,0,@5676,@5680,@5229 5713:O5|5,@5715,@5716,@5714,@5229 5714:O3|@5716,@5229,@5717 5715:O2|@5232,0 5716:S3|726566 5717:O3|@5719,@5766,@5718 5718:O3|@5716,@5256,@5255 5719:O2|1,@5720 5720:O3|2,@5722,@5721 5721:O2|@5738,0 5722:O4|@5724,@4622,@5733,@5723 5723:O1|@5736 5724:O1|@5725 5725:D3,16|b8a8d95208c39090000000000c000000|@5726,1,@125|1,0,I251 5726:S11|65712d68656c7065722829 5727:O1|@5728 5728:D3,16|b8ccaa7ab2c39090000000000c000000|@5732,1,@127|1,0,@5729 5729:O1|@5730 5730:D3,16|b8f06e7ab2c39090000000000c000000|@5731,1,@126|1,0,@5252 5731:S40|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129283129 5732:S37|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129 5733:O1|@5734 5734:D3,16|b805000000c39090000000000c000000|@5735,1,@128|1,0,2 5735:S14|626f7865642d68656c7065722829 5736:D3,16|b803000000c39090000000000c000000|@5737,1,@129|1,0,1 5737:S13|73697a652d68656c7065722829 5738:O4|@4607,69,@5739,0 5739:O3|2,4,@5740 5740:O5|@5429,@5742,@5765,@5741,@5387 5741:O4|@5722,@5724,@5733,@5723 5742:O2|@5433,@5743 5743:O2|@5745,@5744 5744:O2|@5751,@5750 5745:O2|@5747,@5746 5746:O3|0,@5749,@5415 5747:O2|1,@5748 5748:O2|2,0 5749:O8|@5341,@5726,0,0,@5276,0,0,1 5750:O2|@5754,@5753 5751:O2|@5752,@5413 5752:O3|0,@4622,0 5753:O2|@5760,0 5754:O2|@5756,@5755 5755:O3|0,@5758,@5415 5756:O2|1,@5757 5757:O2|2,1 5758:O8|@5759,@5735,0,0,@5276,0,0,1 5759:O3|2,2,0 5760:O2|@5762,@5761 5761:O3|0,@5764,@5415 5762:O2|1,@5763 5763:O2|2,2 5764:O8|@5281,@5737,0,0,@5276,0,0,1 5765:O3|2,2,2 5766:O4|1,@4623,1,0 5767:O2|@5916,@5915 5768:O7|@5770,@5695,@5771,@5769,@5229,0,0 5769:O3|2,@5785,@5712 5770:S13|5054636f6d706c6574696f6e73 5771:O2|1,@5772 5772:O3|14,@5773,0 5773:O2|@5775,@5774 5774:O2|@5779,@5778 5775:O2|7,@5776 5776:O8|@5777,@5770,0,0,@5276,0,0,1 5777:O4|13,1,@5532,13 5778:O2|@5783,0 5779:O2|7,@5780 5780:O8|@5781,@5770,0,0,@5276,0,0,1 5781:O3|14,@5782,1 5782:O2|@5281,@5708 5783:O2|7,@5784 5784:O8|@5711,@5770,0,0,@5276,0,0,1 5785:O5|5,@5787,@5788,@5786,@5229 5786:O3|@5788,@5229,@5789 5787:O2|@5306,0 5788:S4|6c697374 5789:O3|@5791,@5914,@5790 5790:O3|@5788,@5256,@5255 5791:O2|1,@5792 5792:O3|2,@5794,@5793 5793:O2|@5806,0 5794:O4|@5796,@4617,@5801,@5795 5795:O1|@5804 5796:O1|@5797 5797:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70000b07ab28948048060ffbfc3000000002c000000|@5800,3,@131|28,0,@5798 5798:D3,112|3b650c7303ff5524523bc37509b80300000083c404c3a8017545f6c30175378b0c248b5104ff7304ff70048b1b8b008b3289f290ff1283f80174128b5c24045883c4043b650c7303ff5524ebbcb80100000083c40cc3b80100000083c404c3b80100000083c404c3000000006c000000|@5799,1048575,@130|14,0,1 78,0,0 87,0,0 96,0,0 5799:S10|65712d6c697374283229 5800:S13|65712d6c697374283229285029 5801:O1|@5802 5802:D3,16|b807000000c39090000000000c000000|@5803,1,@132|1,0,3 5803:S10|626f7865642d6c697374 5804:D3,16|b803000000c39090000000000c000000|@5805,1,@133|1,0,1 5805:S9|73697a652d6c697374 5806:O4|@4607,69,@5807,0 5807:O3|2,4,@5808 5808:O5|@5411,@5810,@5902,@5809,@5387 5809:O12|@5904,@5907,@5909,@5906,@5905,@5912,@5903,@5796,@4617,@5801,@5795,@5794 5810:O2|@5433,@5811 5811:O2|@5813,@5812 5812:O2|@5891,@5890 5813:O2|@5815,@5814 5814:O3|0,@5817,@5415 5815:O2|1,@5816 5816:O2|2,6 5817:O8|@5819,@5800,0,0,@5818,0,0,1 5818:O2|@5883,0 5819:O2|7,@5820 5820:O8|@5822,@5799,0,@5882,@5821,0,10,1 5821:O2|@5385,@5379 5822:O3|0,@5824,@5823 5823:O2|@5878,@5877 5824:O4|1,@5826,@5281,@5825 5825:O4|1,@5836,@5835,@5348 5826:O4|3,@5827,@5341,1 5827:O2|@5829,@5828 5828:O2|@5832,0 5829:O2|@5830,1 5830:O2|4,@5831 5831:O2|2,4 5832:O2|@5833,1 5833:O2|4,@5834 5834:O2|2,5 5835:O4|1,@5842,@5841,@5348 5836:O4|3,@5837,@5352,1 5837:O2|@5838,0 5838:O2|@5839,1 5839:O4|3,@5840,@5356,1 5840:O2|@5829,0 5841:O3|10,@5847,@5846 5842:O4|3,@5843,@5352,1 5843:O2|@5844,0 5844:O2|@5845,1 5845:O4|3,@5828,@5356,1 5846:O4|1,@5860,@5859,@5348 5847:O2|@5849,@5848 5848:O2|@5852,@5851 5849:O4|1,@5384,6,@5850 5850:O4|6,@5830,0,1 5851:O2|@5855,@5854 5852:O4|1,@5384,7,@5853 5853:O4|6,@5830,1,1 5854:O2|@5857,0 5855:O4|1,@5384,8,@5856 5856:O4|6,@5833,0,1 5857:O4|1,@5384,9,@5858 5858:O4|6,@5833,1,1 5859:O2|9,@5869 5860:O4|3,@5862,@5861,1 5861:O4|6,@5868,0,0 5862:O2|@5864,@5863 5863:O2|@5866,0 5864:O2|@5865,1 5865:O2|4,@5816 5866:O2|@5867,1 5867:O2|4,@5528 5868:O2|4,@5280 5869:O2|@5871,@5870 5870:O2|@5874,0 5871:O2|@5872,1 5872:O2|4,@5873 5873:O2|2,7 5874:O2|@5875,1 5875:O2|4,@5876 5876:O2|2,9 5877:O2|@5880,0 5878:O2|@5879,1 5879:O3|@5386,4,@5278 5880:O2|@5881,1 5881:O3|@5386,5,@5346 5882:O2|@5279,0 5883:O2|1,@5884 5884:O2|@5885,0 5885:O3|2,0,@5886 5886:O2|@5887,0 5887:O3|0,@5384,@5888 5888:O2|@5865,@5889 5889:O2|@5867,0 5890:O2|@5894,@5893 5891:O2|@5892,@5413 5892:O2|1,@5873 5893:O2|@5898,0 5894:O2|@5527,@5895 5895:O3|0,@5896,@5415 5896:O8|@5897,@5803,0,0,@5276,0,0,1 5897:O3|2,3,0 5898:O2|@5900,@5899 5899:O3|0,@5901,@5415 5900:O2|1,@5876 5901:O8|@5281,@5805,0,0,@5276,0,0,1 5902:O11|2,2,2,2,2,2,2,1,2,2,2 5903:O2|@5912,0 5904:O3|@5794,@5905,@5903 5905:O3|@5907,@5909,@5906 5906:O1|@5911 5907:O1|@5908 5908:D3,28|a8017507b801000000eb05b80300000083f002c30000000018000000|@5598,1,@134|5,0,0 12,0,1 5909:O1|@5910 5910:D3,44|8b48048b108b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000028000000|@5598,7,@135| 5911:D3,44|8b48048b108b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000028000000|@5598,7,@136| 5912:O1|@5913 5913:D3,28|83f8017406b801000000c3b803000000c39090900000000018000000|@5589,1,@137|6,0,0 12,0,1 5914:O4|1,@4624,1,0 5915:O2|@5963,@5962 5916:O7|@5918,@5695,@5919,@5917,@5229,0,0 5917:O3|2,@5933,@5712 5918:S12|50546465636c617265644174 5919:O2|1,@5920 5920:O3|14,@5921,0 5921:O2|@5923,@5922 5922:O2|@5927,@5926 5923:O2|7,@5924 5924:O8|@5925,@5918,0,0,@5276,0,0,1 5925:O4|13,2,@5532,13 5926:O2|@5931,0 5927:O2|7,@5928 5928:O8|@5929,@5918,0,0,@5276,0,0,1 5929:O3|14,@5930,1 5930:O2|@5759,@5708 5931:O2|7,@5932 5932:O8|@5711,@5918,0,0,@5276,0,0,1 5933:O5|5,0,@5935,@5934,@5229 5934:O3|@5935,@5229,@5936 5935:S8|6c6f636174696f6e 5936:O3|@5500,@5938,@5937 5937:O3|@5961,@5256,@5255 5938:O3|2,0,@5939 5939:O3|3,@5941,@5940 5940:O3|0,@5956,1 5941:O2|@5943,@5942 5942:O2|@5946,@5945 5943:O2|@5944,@5306 5944:S4|66696c65 5945:O2|@5949,@5948 5946:O2|@5947,@5307 5947:S7|656e644c696e65 5948:O2|@5952,@5951 5949:O2|@5950,@5307 5950:S9|73746172744c696e65 5951:O2|@5954,0 5952:O2|@5953,@5307 5953:S11|656e64506f736974696f6e 5954:O2|@5955,@5307 5955:S13|7374617274506f736974696f6e 5956:O2|@5944,@5957 5957:O2|@5947,@5958 5958:O2|@5950,@5959 5959:O2|@5953,@5960 5960:O2|@5955,0 5961:S15|506f6c794d4c2e6c6f636174696f6e 5962:O2|@5981,@5980 5963:O7|@5965,@5695,@5966,@5964,@5229,0,0 5964:O3|2,@5307,@5712 5965:S7|50546465664964 5966:O2|1,@5967 5967:O3|14,@5968,0 5968:O2|@5970,@5969 5969:O2|@5974,@5973 5970:O2|7,@5971 5971:O8|@5972,@5965,0,0,@5276,0,0,1 5972:O4|13,3,@5532,13 5973:O2|@5978,0 5974:O2|7,@5975 5975:O8|@5976,@5965,0,0,@5276,0,0,1 5976:O3|14,@5977,1 5977:O2|@5897,@5708 5978:O2|7,@5979 5979:O8|@5711,@5965,0,0,@5276,0,0,1 5980:O2|@6022,@6021 5981:O7|@5983,@5695,@5984,@5982,@5229,0,0 5982:O3|2,@5998,@5712 5983:S12|505466697273744368696c64 5984:O2|1,@5985 5985:O3|14,@5986,0 5986:O2|@5988,@5987 5987:O2|@5992,@5991 5988:O2|7,@5989 5989:O8|@5990,@5983,0,0,@5276,0,0,1 5990:O4|13,4,@5532,13 5991:O2|@5996,0 5992:O2|7,@5993 5993:O8|@5994,@5983,0,0,@5276,0,0,1 5994:O3|14,@5995,1 5995:O2|@5375,@5708 5996:O2|7,@5997 5997:O8|@5711,@5983,0,0,@5276,0,0,1 5998:O3|2,@6000,@5999 5999:O5|5,0,@6009,@6008,@5229 6000:O5|5,0,@6002,@6001,0 6001:O3|@6002,@5229,@6003 6002:S4|756e6974 6003:O3|@5500,@6005,@6004 6004:O3|@6002,@5256,@6002 6005:O3|2,0,@6006 6006:O3|3,0,@6007 6007:O3|0,0,1 6008:O3|@6009,@5229,@6010 6009:S9|706172736554726565 6010:O3|@5500,@6012,@6011 6011:O3|@6020,@5256,@5255 6012:O3|2,0,@6013 6013:O3|3,@6014,@5234 6014:O2|@6016,@6015 6015:O2|@6017,0 6016:O2|49,@5933 6017:O2|50,@6018 6018:O5|5,@6019,@5788,@5786,@5229 6019:O2|@5712,0 6020:S16|506f6c794d4c2e706172736554726565 6021:O2|@6040,@6039 6022:O7|@6024,@5695,@6023,@5982,@5229,0,0 6023:O2|1,@6025 6024:S13|50546e6578745369626c696e67 6025:O3|14,@6026,0 6026:O2|@6028,@6027 6027:O2|@6032,@6031 6028:O2|7,@6029 6029:O8|@6030,@6024,0,0,@5276,0,0,1 6030:O4|13,5,@5532,13 6031:O2|@6037,0 6032:O2|7,@6033 6033:O8|@6034,@6024,0,0,@5276,0,0,1 6034:O3|14,@6035,1 6035:O2|@6036,@5708 6036:O3|2,5,0 6037:O2|7,@6038 6038:O8|@5711,@6024,0,0,@5276,0,0,1 6039:O2|@6058,@6057 6040:O7|@6042,@5695,@6041,@5917,@5229,0,0 6041:O2|1,@6043 6042:S10|50546f70656e65644174 6043:O3|14,@6044,0 6044:O2|@6046,@6045 6045:O2|@6050,@6049 6046:O2|7,@6047 6047:O8|@6048,@6042,0,0,@5276,0,0,1 6048:O4|13,6,@5532,13 6049:O2|@6055,0 6050:O2|7,@6051 6051:O8|@6052,@6042,0,0,@5276,0,0,1 6052:O3|14,@6053,1 6053:O2|@6054,@5708 6054:O3|2,6,0 6055:O2|7,@6056 6056:O8|@5711,@6042,0,0,@5276,0,0,1 6057:O2|@6076,@6075 6058:O7|@6060,@5695,@6059,@5982,@5229,0,0 6059:O2|1,@6061 6060:S8|5054706172656e74 6061:O3|14,@6062,0 6062:O2|@6064,@6063 6063:O2|@6068,@6067 6064:O2|7,@6065 6065:O8|@6066,@6060,0,0,@5276,0,0,1 6066:O4|13,7,@5532,13 6067:O2|@6073,0 6068:O2|7,@6069 6069:O8|@6070,@6060,0,0,@5276,0,0,1 6070:O3|14,@6071,1 6071:O2|@6072,@5708 6072:O3|2,7,0 6073:O2|7,@6074 6074:O8|@5711,@6060,0,0,@5276,0,0,1 6075:O2|@6094,@6093 6076:O7|@6078,@5695,@6077,@5982,@5229,0,0 6077:O2|1,@6079 6078:S17|505470726576696f75735369626c696e67 6079:O3|14,@6080,0 6080:O2|@6082,@6081 6081:O2|@6086,@6085 6082:O2|7,@6083 6083:O8|@6084,@6078,0,0,@5276,0,0,1 6084:O4|13,8,@5532,13 6085:O2|@6091,0 6086:O2|7,@6087 6087:O8|@6088,@6078,0,0,@5276,0,0,1 6088:O3|14,@6089,1 6089:O2|@6090,@5708 6090:O3|2,8,0 6091:O2|7,@6092 6092:O8|@5711,@6078,0,0,@5276,0,0,1 6093:O2|@6114,@6113 6094:O7|@6096,@5695,@6097,@6095,@5229,0,0 6095:O3|2,@6112,@5712 6096:S7|50547072696e74 6097:O2|1,@6098 6098:O3|14,@6099,0 6099:O2|@6101,@6100 6100:O2|@6105,@6104 6101:O2|7,@6102 6102:O8|@6103,@6096,0,0,@5276,0,0,1 6103:O4|13,9,@5532,13 6104:O2|@6110,0 6105:O2|7,@6106 6106:O8|@6107,@6096,0,0,@5276,0,0,1 6107:O3|14,@6108,1 6108:O2|@6109,@5708 6109:O3|2,9,0 6110:O2|7,@6111 6111:O8|@5711,@6096,0,0,@5276,0,0,1 6112:O3|2,@5307,@5509 6113:O2|@6154,@6153 6114:O7|@6116,@5695,@6117,@6115,@5229,0,0 6115:O3|2,@6146,@5712 6116:S12|50547265666572656e636573 6117:O2|1,@6118 6118:O3|14,@6119,0 6119:O2|@6121,@6120 6120:O2|@6125,@6124 6121:O2|7,@6122 6122:O8|@6123,@6116,0,0,@5276,0,0,1 6123:O4|13,10,@5532,13 6124:O2|@6137,0 6125:O2|7,@6126 6126:O8|@6127,@6116,0,0,@5276,0,0,1 6127:O4|3,@5357,@6128,1 6128:O2|7,@6129 6129:O8|@6131,@6130,0,0,@5276,0,0,1 6130:S6|3c616e6f6e3e 6131:O3|14,@6132,1 6132:O2|@6134,@6133 6133:O2|@5532,@6135 6134:O3|2,10,0 6135:O2|@6136,0 6136:O4|6,@5278,1,0 6137:O2|7,@6138 6138:O8|@6139,@6116,0,0,@5276,0,0,1 6139:O4|3,@5357,@6140,1 6140:O2|7,@6141 6141:O8|@6142,@6130,0,0,@5276,0,0,1 6142:O3|14,@6143,0 6143:O2|@5711,@6144 6144:O2|@6145,0 6145:O4|6,@5278,2,1 6146:O3|3,@6147,@5234 6147:O2|@6149,@6148 6148:O2|@6150,0 6149:O2|49,@5232 6150:O2|50,@6151 6151:O5|5,@6152,@5788,@5786,@5229 6152:O2|@5933,0 6153:O2|@6172,@6171 6154:O7|@6156,@5695,@6155,@5964,@5229,0,0 6155:O2|1,@6157 6156:S7|50547265664964 6157:O3|14,@6158,0 6158:O2|@6160,@6159 6159:O2|@6164,@6163 6160:O2|7,@6161 6161:O8|@6162,@6156,0,0,@5276,0,0,1 6162:O4|13,11,@5532,13 6163:O2|@6169,0 6164:O2|7,@6165 6165:O8|@6166,@6156,0,0,@5276,0,0,1 6166:O3|14,@6167,1 6167:O2|@6168,@5708 6168:O3|2,11,0 6169:O2|7,@6170 6170:O8|@5711,@6156,0,0,@5276,0,0,1 6171:O2|@6189,0 6172:O7|@6174,@5695,@6173,@5917,@5229,0,0 6173:O2|1,@6175 6174:S13|50547374727563747572654174 6175:O3|14,@6176,0 6176:O2|@6178,@6177 6177:O2|@6182,@6181 6178:O2|7,@6179 6179:O8|@6180,@6174,0,0,@5276,0,0,1 6180:O4|13,12,@5532,13 6181:O2|@6187,0 6182:O2|7,@6183 6183:O8|@6184,@6174,0,0,@5276,0,0,1 6184:O3|14,@6185,1 6185:O2|@6186,@5708 6186:O3|2,12,0 6187:O2|7,@6188 6188:O8|@5711,@6174,0,0,@5276,0,0,1 6189:O7|@6191,@5695,@6192,@6190,@5229,0,0 6190:O3|2,@6207,@5712 6191:S6|505474797065 6192:O2|1,@6193 6193:O3|14,@6194,0 6194:O2|@6196,@6195 6195:O2|@6200,@6199 6196:O2|7,@6197 6197:O8|@6198,@6191,0,0,@5276,0,0,1 6198:O4|13,13,@5532,13 6199:O2|@6205,0 6200:O2|7,@6201 6201:O8|@6202,@6191,0,0,@5276,0,0,1 6202:O3|14,@6203,1 6203:O2|@6204,@5708 6204:O3|2,13,0 6205:O2|7,@6206 6206:O8|@5711,@6191,0,0,@5276,0,0,1 6207:O5|5,0,@6209,@6208,@5229 6208:O3|@6209,@5229,@6210 6209:S14|7479706545787072657373696f6e 6210:O3|@6212,@6215,@6211 6211:O3|@6216,@5256,@5255 6212:O2|1,@6213 6213:O3|2,@6214,0 6214:O4|0,@4625,3,1 6215:O4|1,@4626,0,0 6216:S38|506f6c794d4c2e4e616d6553706163652e56616c7565732e7479706545787072657373696f6e 6217:O2|@5554,@6218 6218:O2|@6219,0 6219:O4|@4596,69,@6220,0 6220:O7|@5554,@6222,@6223,@6221,@5229,0,0 6221:O3|2,@6269,@5509 6222:O2|0,5 6223:O2|1,@6224 6224:O3|2,@5550,@6225 6225:O2|@6226,0 6226:O4|@4607,69,@6227,0 6227:O3|2,3,@6228 6228:O5|@5411,@6229,@5538,@5521,@5387 6229:O2|@5433,@6230 6230:O2|@6232,@6231 6231:O2|@6238,@6237 6232:O2|@6234,@6233 6233:O3|0,@6235,@5415 6234:O2|1,@5831 6235:O8|@6236,@5554,0,0,@5530,0,0,1 6236:O4|13,1,@5532,4 6237:O2|@6258,0 6238:O2|@6240,@6239 6239:O3|0,@6241,@5415 6240:O2|1,@5834 6241:O8|@6243,@5554,0,0,@6242,0,2,1 6242:O2|@6254,0 6243:O3|10,@6245,@6244 6244:O3|14,@6249,1 6245:O2|@6247,@6246 6246:O2|@6248,0 6247:O4|1,@5384,0,@5532 6248:O4|1,@5384,1,@6136 6249:O2|@5281,@6250 6250:O2|@6252,@6251 6251:O2|@6253,0 6252:O2|4,@5748 6253:O2|4,@5757 6254:O2|1,@6255 6255:O2|@5535,@6256 6256:O2|@6257,0 6257:O3|2,1,@5384 6258:O2|@5815,@6259 6259:O3|0,@6260,@5415 6260:O8|@6262,@5554,0,0,@6261,0,2,1 6261:O2|@6268,0 6262:O3|10,@6264,@6263 6263:O3|14,@6250,0 6264:O2|@6266,@6265 6265:O2|@6267,0 6266:O4|1,@5461,0,@5711 6267:O4|1,@5461,1,@6145 6268:O2|1,@5382 6269:O3|3,@6270,@5234 6270:O2|@6272,@6271 6271:O2|@6273,0 6272:O2|49,@5307 6273:O2|50,@5307 6274:O2|@6156,@6275 6275:O2|@6276,0 6276:O4|@4596,69,@6154,0 6277:O2|@6078,@6278 6278:O2|@6279,0 6279:O4|@4596,69,@6076,0 6280:O2|@6282,@6281 6281:O2|@6283,0 6282:S10|6d616b65737472696e67 6283:O4|@4596,69,@6284,0 6284:O7|@6282,2,@6286,@6285,@5229,0,0 6285:O3|2,@6287,@5306 6286:O2|3,5 6287:O3|6,@4627,79993 6288:O2|@6290,@6289 6289:O2|@6291,0 6290:S9|4e616d655370616365 6291:O4|@4611,69,@6292,0 6292:O4|@6290,@5500,@6293,@5229 6293:O6|@6295,I48,0,@5229,@6294,0 6294:O1|@12709 6295:O4|1,@4629,@4630,@4628 6296:O1|@6297 6297:D3,28|3b650c7303ff5524bb15000000e9be98ffff90900000000018000000|@5217,2097151,@138|9,0,10 14,1,@5214 6298:O2|@12654,@12653 6299:O2|@6301,@6300 6300:O2|@6302,0 6301:S8|46756e63746f7273 6302:O4|@4611,69,@6303,0 6303:O4|@6301,@5500,@6304,@5229 6304:O6|@6306,I48,0,@5229,@6305,0 6305:O1|@12349 6306:O4|1,@4633,@4634,@4632 6307:O1|@6308 6308:D3,28|3b650c7303ff5524bb15000000e9f297ffff90900000000018000000|@5217,2097151,@139|9,0,10 14,1,@5214 6309:O2|@12326,@12325 6310:O2|@6312,@6311 6311:O2|@6313,0 6312:S10|70726f70657274696573 6313:O4|@4596,69,@6314,0 6314:O7|@6312,2,@6316,@6315,@5229,0,0 6315:O3|2,@6331,@6018 6316:O2|1,@6317 6317:O3|2,@6318,0 6318:O1|@6319 6319:D3,24|3b650c7303ff55248b4010e91c0000000000000014000000|@6330,31,@142|12,1,@6320 6320:D3,336|3b650c7303ff5524a80175688b0883390575368b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70217000000f6c20174638b7004b8ecd57ab28b5d04ff13833907753f8b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70219000000eb05e9c6000000f6c201746d8b7004b8ecd57ab28b5d049090ff13833903753f8b55008d52f43b5508730aeb05e96d000000ff5520895500c742fc020000008b5904895a04c7020d000000f6c201744f8b7004b8ecd57ab28b5d049090ff138b55008d52f43b55087303ff5520895500c742fc02000000eb05e9210000008b5904895a04c70205000000f6c20174108b7004b8ecd57ab28b5d04909090ff13528b700489f09090e8e2feffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c010000|@6329,31,@141|51,0,11 64,0,@6321 110,0,12 130,0,@6321 185,0,6 198,0,@6321 248,0,2 261,0,@6321 320,0,0 6321:O4|@4636,@6326,@6327,@6322 6322:O5|@6328,111,0,111,0 6323:O1|@6324 6324:O1|@6325 6325:D3,28|3b650c7303ff55248b0d3ce039b289caff2290900000000018000000|@5397,1048575,@140|10,0,@4582 6326:S4|43617374 6327:S9|746f41646472657373 6328:S35|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f416464726573732e4d4c 6329:S13|4c6973742e6d61702832292829 6330:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7246756e63746f72283129 6331:O5|5,0,@6333,@6332,@5229 6332:O3|@6333,@5229,@6334 6333:S10|66756e63746f7256616c 6334:O3|@6336,@6339,@6335 6335:O3|@6340,@5256,@5255 6336:O2|1,@6337 6337:O3|2,@6338,0 6338:O4|0,@4637,3,1 6339:O4|1,@4638,0,0 6340:S36|506f6c794d4c2e4e616d6553706163652e46756e63746f72732e66756e63746f7256616c 6341:O2|@6343,@6342 6342:O2|@6344,0 6343:S5|7072696e74 6344:O4|@4596,69,@6345,0 6345:O7|@6343,2,@6347,@6346,@5229,0,0 6346:O3|2,@12015,@5509 6347:O2|1,@6348 6348:O3|2,@6349,0 6349:O1|@6350 6350:D3,156|3b650c7303ff5524f6400801756e8b48088b55008d52f43b55087303ff5520895500c742fc02000000c70200d97ab28b19895a048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706b0d97ab2895e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048917eb05bf28da7ab28b0c24893c248b58048b1089d051e9a80100000000000098000000|@12014,2097151,@2217|43,0,@6351 82,0,@6353 125,0,@6354 144,1,@6359 6351:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@143|49,0,0 85,0,0 6352:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d616b6554797065456e76283129283129 6353:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@144|49,0,0 85,0,0 6354:O2|@6356,@6355 6355:O1|@6358 6356:O1|@6357 6357:D3,16|b801000000c39090000000000c000000|@6352,1,@145|1,0,0 6358:D3,16|b801000000c39090000000000c000000|@6352,1,@146|1,0,0 6359:D3,1864|8d7c24a03b7d0c7303ff5528f6c301740783fb017f10eb06f643ff107408b868977ab2c204008b088b5108813948c05208742df6010175248b31bf48c05208ff31b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750aeb6cff31eb04ff31eb698b4d008d49f43b4d087303ff5520894d00c741fc020000008b3424897104c70107000000f6c10174188b780cff7004ff7010ff30b8ecd57ab28b5d04909090ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c74704e8e17ab2890feb0ae96b000000e9660000008d4f0cc741fc05000000897910c7410c01000000c7410801000000c7410401000000c70101000000f6c10174168b780cff7004ff7010ff30b8ecd57ab28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c747040ce27ab2890feb05bf0100000089d9f6c101740583e9027105ff5538ebf6817a0448c05208743ff6420401752d8b7204ff7004ff7010ff3057bf48c0520851b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017418eb32ff7004ff7010ff305751eb26ff7004ff7010ff305751ff700c53ff326a01ff74242c6a018b5c241889d090e8e2050000eb3d8b480c8b45008d40f43b45087303ff5520894500c740fc020000008b7204897004c70007000000a801740e89c7b8ecd57ab28b5d049090ff135153ff328b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104186386b2890183f90175068b442410eb0d89cb8b4424109090e88a860b00817c242048c052087429f644242001756f8b742420bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090175716a016a016a016a016a016a016a016a016a016a016a016a016a01508d5c24048b442438bac0e47ab2e8c20700008b45008d40f03b45087303ff5520894500c740fc03000000c700a06386b2eb05e9640000008b4c24608948048b5424248950088060ffbf8b55008d52f03b5508730aeb05e940000000ff5520895500c742fc03000000c702586486b2894a048b5c2434895a088062ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048903eb708b4c24288b55008d52ec3b55087303ff5520895500c742fc04000000c702e06486b28b5c2414895a04894a088b5c2420895a0c8062ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b1189136a016a016a016a016a016a016a016a016a016a016a016a01eb05e9030000006a01508b442450a80175328b08833901751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebcaba01000000f6c201755d8b0283380175568b4d008d49f43b4d087303ff5520894d00c741fc020000008b7004897104c70101000000f6c101740ab8ecd57ab28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7470401000000890feb05bf010000008b45008d40f43b45087303ff5520894500c740fc020000008b4c2454894804c70007000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc0500000089481089780cc7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c741048c6586b289018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a46586b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49e83b4d087303ff5520894d00c741fc050000005a83c438895110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740d89c2b8ecd57ab28b5d0490ff138b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c70100457bb28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1359f6c101740583e9027105ff5538ebf68b1424817a0448c05208742df642040175248b7204bf48c0520851b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017406eb1951eb1651506a03536a018b5c241089d09090e82a010000eb3a89c18b45008d40f43b45087303ff5520894500c740fc020000008b5204895004c70007000000a801740f89c2b8ecd57ab28b5d04909090ff13518b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70000457bb28d480cc741fc020000008941045883c42089018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c204000000000044070000|@12013,2097151,@2216|31,0,@5578 45,0,I48 59,0,I48 66,0,4 132,0,3 153,0,@6321 192,0,@6360 226,0,0 233,0,0 240,0,0 246,0,0 267,0,@6321 304,0,@6363 313,0,0 337,0,I48 362,0,I48 368,0,4 438,1,@6365 479,0,3 490,0,@6321 532,0,@12000 558,1,@12004 566,0,I48 584,0,I48 589,0,4 649,0,@6366 654,1,@6367 684,0,@12005 746,0,@12007 825,0,@12008 974,0,0 1022,0,0 1032,0,@6321 1068,0,0 1077,0,0 1114,0,3 1125,0,@6321 1164,0,0 1189,0,0 1196,0,0 1202,0,0 1213,0,@6321 1252,0,@12009 1275,0,@5592 1294,0,@12011 1314,0,0 1321,0,0 1328,0,0 1334,0,0 1345,0,@6321 1391,0,0 1398,0,0 1405,0,0 1411,0,0 1423,0,@6321 1460,0,0 1481,0,@6583 1516,0,0 1523,0,0 1530,0,0 1536,0,0 1547,0,@6321 1579,0,I48 1595,0,I48 1601,0,4 1646,1,@6365 1686,0,3 1697,0,@6321 1737,0,0 1758,0,@6583 1811,0,0 1818,0,0 1825,0,0 1831,0,0 1842,0,@6321 6360:O2|@5643,@6361 6361:O2|@6362,0 6362:O2|3,58 6363:O2|@6364,0 6364:O3|1,1,2 6365:D3,644|8d7c24903b7d0c7303ff55288b4c24086a016a016a016a016a016a016a016a016a016a016a016a016a0153ff30ff7104ff31ff70108d5c24148b44240cbac0e47ab2909090e86e020000f644244c01754d8b44244c8b4d008d49f03b4d087303ff5520894d00c741fc03000000c70108017bb28b14248951048b108951088061ffbf8b5d008d5bf83b5d087303ff5520895d00c743fc01000000890beb1d8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b042489038b45008d40ec3b45087303ff5520894500c740fc040000009090c700101b7bb289580483c404598948088b4c242c89480c8060ffbf8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701cc1b7bb28959045a8951088b54243889510c8061ffbf8b55008d52e83b55087303ff5520895500c742fc02000000894a0489028d720cc746fc02000000894e0489068b442404a801740783f8037f0feb06f640ff107407b8541c7bb2eb6d8b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000051686c1c7bb2565253518d7c241057bb010000008b44241c909090e8e21a0000588b00bbf01c7bb2909090e8ea390000b901000000a801754f8b10ff700451ff742420bb18207bb253ff742414eb05e939000000ff742414ff7424208b5a048b029090e80a3c0000833c2401740a8b1c249090e8027e0b0089c183c404583b650c7303ff5524ebad89c883c4149090e83e7e0b008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701dc6286b28d410cc740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c43cc20c00900000000080020000|@11999,2097151,@2211|62,0,@6366 70,1,@6367 111,0,@6425 215,0,@6482 266,0,@6484 354,0,@6485 386,0,0 392,0,@6487 406,0,0 418,1,@6418 426,0,@6488 434,1,@6493 439,0,0 458,0,@6499 490,1,@6500 506,1,@11995 534,1,@11996 567,0,@11997 587,0,0 594,0,1 601,0,0 607,0,0 618,0,@6321 6366:O7|@6367,@4596,@4600,@4640,@4611,@4641,@4639 6367:D3,664|8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7018ce77ab28b72048971048941088061ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707d4eb7ab28b72088977048947088067ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c70670ec7ab2538b5a0c895e048946088066ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7030ced7ab2578b7a10897b048943088063ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707a8ed7ab2538b5a14895f048947088067ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70344ee7ab2518b4a18894b048943088063ffbf8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701e0ee7ab2894104538b5a048959088061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703a4f67ab2894304578b7a08897b088063ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70714f87ab2894704568b720c8977088067ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c70684f97ab2894604538b5a10895e088066ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703f4fa7ab2894304568b72148973088063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c70664fc7ab2894604518b4a18894e088066ffbf8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701d4fd7ab28b52048951048941088061ffbf8b44242489388958045a8950088b54240489500c8b5424088950108b54240c8950148b54241489501889701c8b54241c8950208948245983c40c8948285983c40489482c5983c404894830b80100000083c404c39090900000000094020000|@6424,63,@176|26,0,@6368 69,0,@6382 112,0,@6383 156,0,@6384 200,0,@6385 244,0,@6386 288,0,@6387 332,0,@6405 376,0,@6407 420,0,@6409 464,0,@6411 508,0,@6413 552,0,@6415 645,0,0 6368:D3,136|3b650c7303ff55245289c38b4208909090e886000000a801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@150|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6369:D3,96|3b650c7303ff5524833801752353ff70088b480489d889caff128b4c24048b542408894c24085b83c40452e9440000008b48048b098b400c8b00535089d889caff128b4c24048b542408894c24085b83c40452e94c010000000000005c000000|@6376,1048575,@149|44,1,@6370 84,1,@6372 6370:D3,248|3b650c7303ff5524a8017410b9ffffff00234bfc8d4c09013bc1720d89c1b8cc7b7ab28b5d0490ff138b4c43fef6c10175588b5424043b117455f6c2017544f60101753f8b39f7c7010000007407be03000000eb068b378d74360183c6085689d6ff7104ff318b4c2408d1e93bc9f3a68d7c3f018d7436018d4c0901741883c404eb376a01ff7104eb30e9560000006a01ff71046a018b45008d40f83b45087303ff5520894500c740fc010000008b4c2404890883c40cc2040083f801750cb8ffffff002343fc8d440001a801740583e8027105ff5538ebf68954240c83c408e91bffffffb801000000c2040090909000000000f4000000|@6371,63,@147|13,0,8388607 31,0,@5401 79,0,1 192,0,8388607 230,0,0 6371:S27|486173685461626c652e6861736853756228322966696e64283129 6372:D3,272|3b650c7303ff5524a801740783f8017d08eb1cf640ff1075168b0ba8017409f6c10174043bc1eb05ff5538ebf77c0e89c1b8f0ea7ab28b5d049090ff1389c1f6c101740583c1027105ff5538ebf68b4c4bfef6c10175588b5424043b117455f6c2017544f60101753f8b39f7c7010000007407be03000000eb068b378d74360183c6085689d6ff7104ff318b4c2408d1e93bc9f3a68d7c3f018d7436018d4c0901741883c404eb376a01ff7104eb30e94c0000006a01ff71046a018b45008d40f83b45087303ff5520894500c740fc010000008b4c2404890883c40cc2040083f80175028b03a801740583e8027105ff5538ebf68954240c83c408e900ffffffb801000000c20400000000000c010000|@6371,63,@148|50,0,@6373 116,0,1 257,0,0 6373:O4|11,@4879,0,@6374 6374:O5|@6375,143,0,143,0 6375:S17|2e2f62617369732f41727261792e736d6c 6376:S20|486173685461626c652e68617368537562283229 6377:O4|101,@6379,0,@6378 6378:O5|@6380,56,0,56,0 6379:S5|4d61746368 6380:S20|2e2f62617369732f556e6976657273616c2e4d4c 6381:S31|5354525543545f56414c5328292e6d616b654c6f6f6b283129283129283129 6382:D3,136|3b650c7303ff55245289c38b4208909090e83efcffffa801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@151|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6383:D3,136|3b650c7303ff55245289c38b4208909090e8a2fbffffa801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@152|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6384:D3,136|3b650c7303ff55245289c38b4208909090e806fbffffa801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@153|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6385:D3,136|3b650c7303ff55245289c38b4208909090e86afaffffa801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@154|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6386:D3,136|3b650c7303ff55245289c38b4208909090e8cef9ffffa801755c8b00a801754d8b088b14248b193b5a0475323b5a04740cb854eb7ab28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b7108893083c404c38b700489f03b650c7303ff5524ebafb80100000083c404c3b80100000083c404c3900000000084000000|@6381,1048575,@155|18,1,@6369 50,0,@6377 110,0,0 119,0,0 6387:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e8fef8ffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e9fa000000909000000000a8000000|@6404,2097151,@160|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6388 158,1,@6390 6388:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@156|132,0,0 6389:S36|556e6976657273616c5461626c652e756e6976456e746572283429736561726368283129 6390:D3,672|3b650c7303ff552483380374505350b830f37ab290e8fe1affffbb5cf37ab29090e8f21affff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c7cf37ab2894108c7410470137ab2c701cf00000089c88b5d0490ff138b480c8b098b118b70048b365351ff7004ff700c52ff700889d889f2909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241c8951048b5c241489195189c38b442414909090e8960200008b04248b00a801740583c0027105ff5538ebf68b0c2489018b09bb0b00000089c890ff15c8c7520850bb090000008b442408ff15c8c75208a801740df604240174073b04247d74eb05ff5538ebf48b442408a801740403c07105ff5538ebf783e801a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c14eb06f640ff10750c89c1b834f67ab28b5d04ff1389c1f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d08720ceb05e9180100003b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89178b45008d40f43b45087303ff5520894500c740fc02000000c700646b7ab28950048060ffbf8b4c240c89398b4c241089018b4424148b00a801740583e8027105ff5538ebf65752a801740783f8017d13eb06f640ff10740bb80100000083c424c20400a801740783f8017d08eb20f640ff10751a8b4c241c8b09a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8f0ea7ab28b5d04909090ff1389c1f6c101740583c1027105ff5538ebf68b54241c8b4c4afef6c101752150518b5c24088b019090e8be78ffffff342489c38b4424109090e8e2000000eb03506a0183c40458a801740583e8027105ff5538ebf63b650c7303ff5524e949ffffffb80100000083c41cc20400909090000000009c020000|@6403,2097151,@159|16,0,@6391 22,1,@4940 27,0,@6392 34,1,@4940 65,0,@6393 75,0,@4956 81,0,103 174,1,@6395 205,0,5 214,0,I108 220,0,4 230,0,I108 299,0,16777214 316,0,@6401 345,0,0 422,0,@5213 485,0,0 541,0,@6373 594,1,@5214 610,1,@6395 651,0,0 6391:S34|417474656d707420746f2073657420612076616c75652077697468206e616d652028 6392:S24|2920696e20612066726f7a656e2068617368207461626c65 6393:O5|@6394,128,0,128,0 6394:S37|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f486173685461626c652e4d4c 6395:D3,60|3b650c7303ff5524f644240401751c8b4c24048b11895424048b3424890c2489df89c389f856e925000000b801000000c20400900000000038000000|@6400,63,@158|39,1,@6396 44,0,0 6396:D3,392|3b650c7303ff5524a801740783f8017d08eb1cf640ff1075168b0ba8017409f6c10174043bc1eb05ff5538ebf77c0e89c1b8f0ea7ab28b5d049090ff1389c1f6c101740583c1027105ff5538ebf68b4c4bfef6c10175538b113b5424087440f6c2017559f64424080175578b7c2408f7c7010000007407be03000000eb068b378d74360183c6085689d659d1e93bc9f3a68d7c3f018d7436018d4c09017564a801740c83f8017d0deb2de97e000000f640ff1075228b0ba8017415eb0ae941000000e93c000000f6c10174043bc1eb05ff5538ebf77c0e89c1b8b0f57ab28b5d049090ff13a801740583c0027105ff5538ebf68b4c2404894c43feb801000000c2080083f80175028b03a801740583e8027105ff5538ebf68b4c24088b542404894c240889542404e9d3feffffa801740783f8017d08eb1cf640ff1075168b0ba8017409f6c10174043bc1eb05ff5538ebf77c0d89c1b8b0f57ab28b5d0490ff13a801740583c0027105ff5538ebf68b4c2404894c43feb801000000c20800900000000084010000|@6399,63,@157|50,0,@6373 120,0,1 218,0,@6397 252,0,0 343,0,@6397 376,0,0 6397:O4|11,@4879,0,@6398 6398:O5|@6375,148,0,148,0 6399:S39|486173685461626c652e68617368536574283329656e746572546162283329656e746572283129 6400:S31|486173685461626c652e68617368536574283329656e746572546162283329 6401:O4|4,@4943,0,@6402 6402:O5|@6375,132,0,132,0 6403:S20|486173685461626c652e68617368536574283329 6404:S32|5354525543545f56414c5328292e6d616b65456e746572283129283129283129 6405:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e83af1ffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e936f9ffff909000000000a8000000|@6404,2097151,@162|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6406 158,1,@6390 6406:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@161|132,0,0 6407:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e8caefffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e9c6f7ffff909000000000a8000000|@6404,2097151,@164|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6408 158,1,@6390 6408:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@163|132,0,0 6409:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e85aeeffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e956f6ffff909000000000a8000000|@6404,2097151,@166|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6410 158,1,@6390 6410:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@165|132,0,0 6411:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e8eaecffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e9e6f4ffff909000000000a8000000|@6404,2097151,@168|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6412 158,1,@6390 6412:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@167|132,0,0 6413:D3,172|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b0000008b72088931ff3052518b5c24088b420490e87aebffff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb118b4c2404ff34248b59088b00e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e976f3ffff909000000000a8000000|@6404,2097151,@170|35,0,0 48,0,69 70,1,@6369 106,0,0 130,1,@6414 158,1,@6390 6414:D3,156|3b650c7303ff5524a801755d8b083b1975278b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24048908c2040051ff7424088b4004e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009090900000000098000000|@6389,11,@169|132,0,0 6415:D3,48|3b650c7303ff5524ff72046818fe7ab289e050bb010000008b42089090e8ba00000083c408c39090000000002c000000|@6423,1048575,@175|12,0,@6416 20,0,0 30,1,@6418 6416:D3,84|8b4c2404f6c30175398b338b3e3b7a04751f8b75008d76f43b75087303ff5520897500c746fc02000000894e048906eb0289ce89f18b5b043b650c7303ff5524ebc289c389c8c204009090900000000050000000|@6417,63,@171| 6417:S38|556e6976657273616c5461626c652e666f6c64283329666f6c6448617368456e747279283329 6418:D3,252|3b650c7303ff55246a016a01833801753f8b5008b9ffffff00234afc8d4c09018b75008d76f43b75087303ff5520897500c746fc02000000c706c0ff7ab28956048066ffbf89e7890f89e1897104eb358b400c8b008b088b55008d52f43b55087303ff5520895500c742fc02000000c70234007bb28942048062ffbf89e0890889e0895004b801000000a801740df604240174073b04247c0feb05ff5538ebf489d883c408c2040053508b54240c9090ff12a8017516ff7424048b58048b0889c88b542418909090ff12eb048b4424045983c404f6c101740583c1027105ff5538ebf689c289c889d33b650c7303ff5524eb979000000000f8000000|@6422,1048575,@174|21,0,8388607 58,0,@6419 113,0,@6421 134,0,0 6419:D3,52|a80174138b5a04b9ffffff00234bfc8d4c09013bc1720e89c1b8cc7b7ab28b5d049090ff138b4443fec390900000000030000000|@6420,15,@172|8,0,8388607 26,0,@5401 6420:S35|486173685461626c652e666f6c642833296765744974656d7c6c656e6774682d283129 6421:D3,88|a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8f0ea7ab28b5d04909090ff13a801740583c0027105ff5538ebf68b52048b4442fec3900000000054000000|@6420,7,@173|45,0,@6373 6422:S17|486173685461626c652e666f6c64283329 6423:S35|5354525543545f56414c5328292e6d616b65416c6c4e616d6573283129283129283129 6424:S24|5354525543545f56414c5328292e6d616b65456e76283129 6425:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e91c0000000000000020000000|@6481,2097151,@198|24,1,@6426 6426:D3,40|3b650c7303ff552489da9090ff128b4c240489cb5a83c40452e91e00000090900000000024000000|@6480,2097151,@197|26,1,@6427 6427:D3,220|3b650c7303ff55248b4804833905756f8b55008d52f43b55087303ff5520895500c742fc02000000c7026c027bb2895a048062ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70304037bb28953048063ffbfff7008ff30ff710453bb701a7bb28b41089090e80a0600008b4d008d49f03b4d08730aeb05e943000000ff5520894d00c741fc0300000089410858894104c701050000008b45008d40f03b45087303ff5520894500c740fc030000008b5424048950088948045983c4048908c38339037501c38b410c89daff2200000000d8000000|@6479,2097151,@196|42,0,@6428 79,0,@6431 100,0,@6477 110,1,@6446 154,0,2 6428:D3,72|3b650c7303ff55248b48048339037506b801000000c38b5a04bac8027bb29090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3900000000044000000|@6430,1048575,@177|17,0,0 26,0,@6429 6429:O1|@6427 6430:S42|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f70794964283129 6431:D3,96|3b650c7303ff55246a016a016a016878037bb268dc037bb26a018d4c240c518b5a04909090e8d60000008b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@6476,2097151,@194|15,0,@6432 20,0,@6435 38,1,@6437 6432:O1|@6433 6433:D3,12|c39090900000000008000000|@6434,1,@178| 6434:S51|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129283129 6435:O1|@6436 6436:D3,12|c39090900000000008000000|@6434,1,@179| 6437:D3,660|3b650c7303ff55248b48088b5104833a05756b8b75008d76ec3b75087303ff5520897500c746fc04000000c706ac067bb2895e048b5c240c895e088b7c2408897e0c8066ffbf50ff7108ff31ff7204ff720856bbd0077bb28b44240490e8920300003b0424752a8b4424108b4c24188b1089118b58048959048b7008eb05e98a000000897108b80100000083c414c210008b4c2410508b018b542424ff128b4d008d49f03b4d087303ff5520894d00c741fc030000005a8951088b542404895104c701050000008b55008d52f03b55087303ff5520895500c742fc030000008b5c240c895a08894a048b4c2408890a8b4c24108b5c241889038b4904894b04895308b80100000083c414c210005089c889da9090ff12a801755d8b0c246a016a01ff308d5c24048b01e89a0d00008b442418a80175588b0851ff70048b5c24088b41089090e87e10000083f80174618b4424046a016a0189e38b0889c8e8660d00008b4424043b4424187457a8017560f644241801eb05e9ed00000075668b542418f6c201740cb903000000eb0be9720000008b0a8d4c090183c10889c689d7d1e93bc9f3a68d7c3f018d743601eb05e9080000008d4c09017408eb346a016a01eb2e8b45008d40f83b4508730aeb05e91c000000ff5520894500c740fc01000000eb05e9080000008b4c240c8908eb2183c4085883c4043b650c7303ff5524e92dffffffb8010000006a016a016a016a0183f80175318b44241c8b0889c88b54242c90ff128b4c241c8b54242489028b4904894a048b442410894208b80100000083c420c210008b088b5424248b19891a8b71048972048b7908897a08b80100000083c420c210008b04248b4c24088b1089118b58048959048b7008897108b80100000083c404c21000900000000090020000|@6475,2097151,@193|45,0,@6438 84,0,@6444 94,1,@6446 135,0,0 195,0,2 259,0,0 298,1,@6462 326,1,@6466 350,1,@6462 392,0,1 518,0,0 574,0,0 607,0,0 641,0,0 6438:D3,96|3b650c7303ff55246a016a016a016820077bb2ff7208ff720c8d4c240c518b5a04ba88077bb29090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@6443,1048575,@181|15,0,@6439 34,0,@6442 6439:O1|@6440 6440:D3,12|c39090900000000008000000|@6441,1,@180| 6441:S56|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129283129 6442:O1|@6437 6443:S53|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129 6444:O1|@6445 6445:D3,12|c39090900000000008000000|@6443,1,@182| 6446:D3,480|3b650c7303ff552453e8e6010000833809750e89c1b86c107bb28b5d049090ff138b08ba26087bb28d548afcffe2e940000000909090e943000000909090e946000000909090e9b0000000909090e913000000909090e9fe000000909090e9030000009090908b142483c4045983c40451ff22b8e4107bb283c404c20400b8ec7d7ab283c404c2040050ff7008ff7004ff7424148b5c24108b44240490e85effffff50ff7424188b5c24148b44240c9090e84affffff8b0c243b4c240475103b442408750a83c40c5883c404c2040089c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c7000500000083c414c2040050ff7008ff7004ff74240cff742418bbec107bb28b4424089090e8e20700003b0424750a83c4085883c404c2040089c18b45008d40f03b45087303ff5520894500c740fc030000008b542404895008894804c7000700000083c410c2040050ff7010ff700cff7004ff742410ff74241cbbec107bb28b44240890e86e080000508b4424088b54241c90ff128b0c243b4c240475103b442408750a83c4105883c404c2040089c28b45008d40e83b45087303ff5520894500c740fc050000008b5c240c89581089500c8b12895008894804c7000b00000083c418c204009000000000dc010000|@6461,2097151,@187|10,1,@6447 22,0,@6451 36,0,$6446+46 116,0,@6455 127,0,@5413 241,0,2 267,0,@6456 278,1,@6457 335,0,3 364,0,@6456 374,1,@6459 461,0,5 6447:D3,396|3b650c7303ff552483380d75658b48048b0950ff7004ff70085189c890e8deffffff3b042474068b4c24088901833809750583c40c58c3833807756db9010000008b5004f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b5008833a01750a8b5204eb14e90b0100008b52048b123b650c7303ff5524ebe2bb01000000f6c2017523f6c301740583c3027105ff5538ebf68b52043b650c730aeb05e9c6000000ff5524ebd889daf6c1017508f6c2017503ff55383bca752a8b480883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f901740483c410c383c40c58c38b480883390175058b4904eb0f8b49048b093b650c7303ff5524ebe7ff7008ff7424088b580489c890e8820000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108894104c701070000008b44240c8908833a0175058b5208eb0f8b52048b123b650c7303ff5524ebe783fa01740689c883c414c383c41058c3833803750583c40c58c383c410c3c3900000000088010000|@6450,2097151,@184|61,0,0 135,0,0 282,1,@6448 321,0,3 6448:D3,1148|3b650c7303ff5524a801755cf6c301755c8b0b8b30f7c6010000007407ba03000000eb068b168d5412018b31f7c6010000007407bf03000000eb068b3e8d7c3f01f6c201750bf7c7010000007503ff55383bd775613b307452f60001754af7c6010000007542eb0ae9f3030000e9c1020000f7c6010000007407ba03000000eb068b168d54120183c2088b308b39ff3189d1d1e93bc9f3a68d7c3f018d7436018d4c09017406eb1356eb1056b90100000083c404eb33e93d000000ff33ff7304ff700453ff308b5c24148b0424909090ff15a8bd520883f8017507b903000000eb61b9ffffffffeb5f6a01ff33ff7304ff700453ff30eb678b38f7c7010000007407ba03000000eb068b178d541201f7c6010000007407bf03000000eb068b3e8d7c3f01f6c201740cf7c70100000074043bd7eb05ff5538ebf77c11b903000000eb0fe917000000e912000000b9ffffffff6a01ff33ff7304ff700453ff3083f901753bff74241c8b5c24108b44240c90e88afeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2410890883c418c20400f6c101740783f9017d5feb06f641ff10745c8b44241cc1e80383c801a801740783f8017d16eb06f640ff10740e89c3b88c6c7ab290ff1588c752088b4c241c83e10983f9017407b901000000eb05b90300000083f1028b54241c83e20383fa017411ba01000000eb0fe9cb000000e9c6000000ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2a80175108b30f640ff107402f7de8d743601eb0289c68d34f5f9ffffff83f9017507b801000000eb05b8090000000bc60bc28b4d008d49e43b4d087303ff5520894d00c741fc03000000894108895904c7010d0000008d4110c740fc020000008948048b0c24890850ff7424208b5c240c8b442410e84efdffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c418c204008b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908ff74241c8b5c241090e8f6fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2410890883c418c204008b4c2404c1e90383c901f6c101740783f9017d1deb06f641ff107415ff7004ff3089cbb88c6c7ab290ff1588c75208eb098b50048b1889c852538b4c240c83e10983f9017407b901000000eb05b90300000083f1028b54240c83e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2a80175108b30f640ff107402f7de8d743601eb0289c68d34f5f9ffffff83f9017507b801000000eb05b8090000000bc60bc28b4d008d49e43b4d087303ff5520894d00c741fc03000000894108895904c7010d0000008d4110c740fc0200000089480459890850ff74240cbb010000008b442408e8c6fbffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c2040083fb017508b801000000c2040089d8c2040090900000000078040000|@6449,2097151,@183|30,0,1 53,0,1 123,0,1 173,0,0 210,0,I27 220,0,1 227,0,-1 259,0,1 280,0,1 317,0,1 334,0,-1 463,0,@5215 470,0,I106 487,0,0 494,0,1 514,0,0 531,0,1 564,0,@5413 603,0,0 610,0,4 650,0,6 855,0,@5215 862,0,I106 890,0,0 897,0,1 917,0,0 924,0,1 957,0,@5413 996,0,0 1003,0,4 1043,0,6 1069,0,0 1126,0,0 6449:S39|545950455f5452454528292e6576656e7475616c283129616464546f496e7374616e6365283229 6450:S23|545950455f5452454528292e6576656e7475616c283129 6451:O4|@4608,@5398,@6453,@6452 6452:O5|@6454,708,0,708,0 6453:S27|636f7079547970653a204f7665726c6f616453657420666f756e64 6454:S32|6d6c736f757263652f4d4c436f6d70696c65722f545950455f545245452e4d4c 6455:O1|0 6456:O1|@6446 6457:D3,168|3b650c7303ff5524a80175718b0850ff31ff7004ff710453ff7424188b5c24208b4424088b542404ff1250ff742420ff7424208b5c240c8b4424149090e8beffffff8b0c243b4c2408750d3b44240c750783c41458c208008b55008d52e83b55087303ff5520895500c742fc02000000894a048b4c2410890a89c1eb05e9150000008d420cc740fc02000000894804891083c418c20800b801000000c208009000000000a4000000|@6458,1048575,@185|152,0,0 6458:S40|545950455f5452454528292e636f707954797065283329636f70795265636f72644c697374283129 6459:D3,140|3b650c7303ff5524a801756d50ff7004ff3053ff7424148b5c241c8b4424088b54240490ff1250ff74241cff74241c8b5c240c8b4424149090e8c2ffffff8b0c243b4c2408750d3b44240c750783c41058c2080089c28b45008d40f43b45087303ff5520894500c740fc02000000895004890883c414c20800b801000000c208009090900000000088000000|@6460,1048575,@186|122,0,0 6460:S34|545950455f5452454528292e636f707954797065283329636f70794c697374283129 6461:S23|545950455f5452454528292e636f707954797065283329 6462:D3,436|3b650c7303ff5524a8017407b903000000eb068b088d4c0901ba010000008d52ff03d16a016a0183fa0175458b75008d76e03b75087303ff5520897500c746fc03000000894608c746040100000089168d5610c742fc03000000894208894a04c7020100000089e7893789e6895604eb7489d683ee02a801740489c6eb0d83c608d1ee0fb634308d74360183fe5d740d83ea023b650c7303ff5524eb8a89d68b7d008d7ff03b7d087303ff5520897d00c747fc03000000894708897704c7070100000089ce2bf283c601538b5d008d5bf03b5d087303ff5520895d00c743fc03000000eb05e91700000089430889730489138d542404893a8d542404895a04eb01538b4c24048379040175158b0c24c70148c05208894104b80100000083c40cc36a016a016a018b4104a801740783f8037d21eb06f640ff10741989e28b19891a89e2c742040100000089e28b7108897208eb1683e80289e28b19891a89e289420489e08b5108895008ff7424088b5c24088b442404909090e84a0000008b4c241483c40c50ff71088b59048b01909090e8320000008b4c24045a8911894104b80100000083c40cc390909000000000b0010000|@6465,63,@189|13,0,1 26,0,0 74,0,0 98,0,0 191,0,0 273,0,I48 281,0,0 326,0,0 378,1,@6463 402,1,@6463 417,0,0 6463:D3,228|8b542404f6c2017407b903000000eb068b0a8d4c090183f80175093bd9750589d0c2040083fb017508b848c05208c2040083fb03751083c008d1e80fb604028d440001c2040089d983c10ec1e90283c90181f9ffffff01720c89c6b8e00c7ab28b5d04ff1389c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1eb891f8d5c1b0183c60889f089d689f989cf5189d9d1e9d1e803f08d44000183c704f3a48d7c3f018d7436018d4c09018b04248060ffbf83c404c2040090909000000000e0000000|@6464,63,@188|10,0,1 42,0,I48 83,0,16777215 92,0,@4941 104,0,0 6464:S19|537562737472696e672e737472696e67283129 6465:S27|5554494c49544945535f28292e73706c6974537472696e67283129 6466:D3,152|3b650c7303ff55248b480483390575248b5304833a05751cbe78167bb28b3c248934248b5a088b4108ba80167bb257e998000000833903751c8b5304833a0375148b71043b72047406b801000000c3b803000000c3833901752d8b5304833a0175258b710cf7c6010000007509f6420c017503ff55383b720c7406b801000000c3b803000000c3b801000000c39090900000000094000000|@6474,1048575,@192|25,0,@6467 42,0,@6468 48,1,@6470 74,0,0 80,0,1 124,0,0 130,0,1 136,0,0 6467:O1|@6466 6468:O2|@6470,@6469 6469:O2|@6472,@6468 6470:D3,456|3b650c7303ff552483380b7558833b0b75588b480c8b730c52ff7304ff70048b5e088b41088b542410909090ff1283f801745c5859a801755bf6c1017546ff7104ff7004ff7424108b198b008b54240c90e8aaffffff83f801741e8b4c24045883c404eb0ae950000000e94b0000003b650c7303ff5524ebbcb80100000083c40cc20400b80100000083c404c20400e91b00000083f901740bb80100000083c404c20400b80300000083c404c20400b80100000083c40cc204008338057541833b05753c52ff7308ff7008ff7424108b5b048b4004e826ffffff83f80174168b442410894424108b5c24045883c4045ae90bffffffb80100000083c40cc20400833807755a833b07755a8b480883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f90174468b4b0883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f901741d8b4c2404894c24048b5b048b40048b5204ff22e915000000e910000000b801000000c20400b801000000c2040083380d751d833b0d75188b40043b43047408b801000000c20400b803000000c204008338037515833b037408b801000000c20400b803000000c20400b801000000c2040090909000000000c4010000|@6471,1048575,@190|122,0,0 133,0,0 154,0,0 165,0,1 176,0,0 246,0,0 362,0,0 370,0,0 396,0,0 404,0,1 422,0,0 430,0,1 438,0,0 6471:S40|545950455f5452454528292e657175616c54797065496473283229657175616c5479706573283229 6472:D3,244|3b650c7303ff5524a8017556f6c30175568b088b338b393b3e7451f7c701000000754ef606017549ff7304ff7004528b16f6c2017407bf03000000eb068b3a8d7c3f0183c7088b3189f989d7d1e93bc9f3a68d7c3f018d7436018d4c09017421eb61e96f000000e962000000e909000000ff7304ff700452eb49ff7304ff7004528b008b1b8b0c24ff7424108b5b048b40048b5104909090ff1283f80174198b442410894424108b5c24088b4424045a83c408e948ffffffb80100000083c40cc20400b80100000083c40cc20400b801000000c2040083fb017408b801000000c20400b803000000c204009000000000f0000000|@6473,1048575,@191|55,0,1 185,0,0 196,0,0 207,0,0 220,0,0 228,0,1 6473:S46|545950455f5452454528292e657175616c54797065496473283229657175616c5265636f72644c69737473283229 6474:S27|545950455f5452454528292e657175616c54797065496473283229 6475:S38|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529 6476:S48|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129 6477:O1|@6478 6478:D3,12|c39090900000000008000000|@6476,1,@195| 6479:S33|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129 6480:S26|545950455f5452454528292e636f6d706f73654d617073283329 6481:S29|545950455f5452454528292e636f6d706f73654d617073283129283129 6482:D3,116|3b650c7303ff552452508b4a0c89ca90ff12a80175448b4c24048b55008d52f43b55087303ff5520895500c742fc020000008b4904894a048b0089028b45008d40f83b45087303ff5520894500c740fc01000000891083c408c38b4424048b48088b042489ca83c408ff22900000000070000000|@6483,1048575,@199| 6483:S41|56414c55455f4f505328292e646973706c6179536967283529636f6d706f73697465456e762d283129 6484:D3,116|3b650c7303ff552452508b4a0c89ca90ff12a80175448b4c24048b55008d52f43b55087303ff5520895500c742fc020000008b4904894a048b0089028b45008d40f83b45087303ff5520894500c740fc01000000891083c408c38b4424048b48088b042489ca83c408ff22900000000070000000|@6483,1048575,@200| 6485:O2|@5592,@6486 6486:O2|@5578,0 6487:D3,112|8b4c2404f6c30175588b4d008d49f43b4d087303ff5520894d00c741fc020000008b3389710489018b7a048b3f8b75008d76f43b75087303ff5520897500c746fc02000000897e04890e8b4a048931b9010000008b5b043b650c7303ff5524eba389c389c8c20400000000006c000000|@6417,63,@201|80,0,0 6488:O1|@6489 6489:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7003c1d7bb28948048060ffbfc3000000002c000000|@6492,3,@203|28,0,@6490 6490:D3,32|3b650c7303ff55248b52048b188b02ff2588bd5208909090000000001c000000|@6491,63,@202|17,0,I26 6491:S36|56414c55455f4f505328292e646973706c61795369672835296f72646572283129283129 6492:S33|56414c55455f4f505328292e646973706c61795369672835296f72646572283129 6493:D3,36|3b650c7303ff55248b0c24891c24bb0100000051e91f0000009090900000000020000000|@6498,1048575,@206|15,0,0 21,1,@6494 6494:D3,188|3b650c7303ff5524a801756f8378040175228b088b45008d40f43b45087303ff5520894500c740fc020000008958048908c2040053ff30ff70048b4424048b5424109090ff126a016a01508d5c24048b44240c9090e876000000ff7424188b5c24148b442404909090e892ffffff8b4d008d49f43b4d08730aeb05e92c000000ff5520894d00c741fc020000008941048b44240c83c40489018b4424148944241489cb5883c40ce954ffffff89d8c2040090909000000000b8000000|@6497,1048575,@205|86,1,@6495 6495:D3,220|3b650c7303ff5524a801756c53ff30ff70048b4424048b5424109090ff126a016a0150ff74241c8d5c24088b4424109090e8caffffff833c240174448b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c241089088b4c241489018b442408894104b80100000083c418eb05e940000000c204008b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c241089088b4c24148b5424048911894104b80100000083c418c20400c70301000000c7430401000000b801000000c20400909000000000d8000000|@6496,1048575,@204|111,0,0 179,0,0 191,0,0 198,0,0 203,0,0 6496:S19|4c6973742e706172746974696f6e2832292829 6497:S22|4d6973632e717569636b536f72742832297173283229 6498:S17|4d6973632e717569636b536f7274283229 6499:O1|@6365 6500:D3,2008|3b650c7303ff5524813be4e439b2755e813be4e439b2740db854eb7ab28b5d04909090ff138b442414a801740583e8027105ff5538ebf68b4b08a801740783f8017f0feb06f640ff107407b868977ab2eb628b510cf6c20175398b32833e0175238b7d008d7ff83b7d08730aeb05e98f020000ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc2bf01000000f7c70100000075688b17833a0175618b75008d76f43b7508730aeb05e910020000ff5520897500c746fc020000008b7a04897e04c70601000000f7c601000000740b50b8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008932eb05ba010000008b75008d76f43b75087303ff5520897500c746fc020000008b4904894e04c70607000000f7c601000000740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089318d710cc746fc05000000894e1089560cc7460801000000c7460401000000c70601000000f7c601000000740f89c1b8ecd57ab28b5d04909090ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040c287bb289318d510cc742fc02000000894a04c7029c9a7ab28d4a0cc741fc02000000895104c70130287bb28d510cc742fc05000000894a10c7420c01000000c7420801000000c7420401000000c70201000000f6c201740c89c1b8ecd57ab28b5d04ff1350526a03ff7424186a018b4b0889c389c88b5424249090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab2c21400813b64e239b2755c813b64e239b2740bb854eb7ab28b5d0490ff138b442414a801740583e8027105ff5538ebf68b4b08a801740783f8017f0feb06f640ff107407b868977ab2eb628b510cf6c20175398b32833e0175238b7d008d7ff83b7d08730aeb05e913030000ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc2bf01000000f7c70100000075688b17833a0175618b75008d76f43b7508730aeb05e994020000ff5520897500c746fc020000008b5a04895e04c70601000000f7c601000000740b50b8ecd57ab28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008937eb05bf010000008b55008d52f43b55087303ff5520895500c742fc020000008b19895a04c70207000000f6c201740c89c6b8ecd57ab28b5d04ff138b75008d76dc3b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc05000000897210897a0cc7420801000000c7420401000000c70201000000f6c201740e89c6b8ecd57ab28b5d049090ff138b75008d76c43b75087303ff5520897500c746fc02000000c74604e8e17ab289168d560cc742fc02000000897204c7029c9a7ab28d720cc746fc02000000895604c70650287bb28d560cc742fc05000000897210c7420c01000000c7420801000000c7420401000000c70201000000f6c201740c89c6b8ecd57ab28b5d04ff13a801740583e8027105ff5538ebf68b7108817e0448c052087436f646040175298b7e0489fe57bf48c052088b5908b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740eeb26ff760489f3eb1fff760489f3526a03ff742418ff74241889d989c389c88b54242490ff12eb368b45008d40f43b45087303ff5520894500c740fc020000008b0c24894804c70007000000a801740d89c1b8ecd57ab28b5d0490ff13528b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab2c21400813b0ce239b27563813b0ce239b2740bb854eb7ab28b5d0490ff13ff742404ff74240c8b43088b5c241cba70287bb2e8ea0100008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab2c21400813bece139b27570813bece139b2740cb854eb7ab28b5d049090ff138b4308f64004017508b801000000c21400ff74240cff74240c8b5c241c909090e8feaa00008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab2c21400813bdce439b2755c813bdce439b2740cb854eb7ab28b5d049090ff138b43088b58048b0889c89090e83e370b008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab2c21400b801000000c2140090909000000000d4070000|@11994,2097151,@2208|10,0,@4641 18,0,@4641 25,0,@6377 76,0,@5578 148,0,0 206,0,0 220,0,@6321 256,0,0 265,0,0 301,0,3 316,0,@6321 352,0,0 377,0,0 384,0,0 390,0,0 405,0,@6321 444,0,@6501 465,0,@5592 484,0,@6504 504,0,0 511,0,0 518,0,0 524,0,0 536,0,@6321 597,0,0 618,0,@6364 671,0,0 678,0,0 685,0,0 691,0,0 702,0,@6321 740,0,0 763,0,@6364 772,0,@4611 780,0,@4611 787,0,@6377 836,0,@5578 908,0,0 966,0,0 980,0,@6321 1016,0,0 1025,0,0 1060,0,3 1072,0,@6321 1108,0,0 1133,0,0 1140,0,0 1146,0,0 1158,0,@6321 1196,0,@6360 1217,0,@5592 1236,0,@6506 1256,0,0 1263,0,0 1270,0,0 1276,0,0 1288,0,@6321 1317,0,I48 1336,0,I48 1344,0,4 1440,0,3 1451,0,@6321 1489,0,0 1510,0,@6364 1563,0,0 1570,0,0 1577,0,0 1583,0,0 1594,0,@6321 1632,0,0 1655,0,@6364 1664,0,@4600 1672,0,@4600 1679,0,@6377 1705,0,@6508 1710,1,@6510 1741,0,0 1762,0,@6364 1771,0,@4596 1779,0,@4596 1786,0,@6377 1807,0,0 1830,1,@6805 1861,0,0 1882,0,@6364 1891,0,@4640 1899,0,@4640 1906,0,@6377 1930,1,@11986 1961,0,0 1982,0,@6364 1990,0,0 6501:O2|@5592,@6502 6502:O2|@6503,0 6503:O2|3,61 6504:O2|3,@6505 6505:S9|7369676e6174757265 6506:O2|3,@6507 6507:S9|737472756374757265 6508:O4|@6510,@6596,@6694,@6509 6509:O13|@6714,@6713,@4643,@4604,@5308,@4644,@6668,@4646,@6678,@4648,@6686,@4609,@5316 6510:D3,1844|8d7c24ac3b7d0c7303ff55288378040175698b088b71088b7e04833f057561f6c301740783fb017f10eb06f643ff107408b868977ab2c2080052ff31b801000000e8020700008b4c240450ff770853508b47048b51089090ff126a016a01508d5c24048b4424189090e8a2e9ffff8b45008d40f43b4508730feb0ae960030000e952010000ff5520894500c740fc020000008b4c2408894804c70007000000a801740e89c1b8ecd57ab28b5d049090ff138b4c240cf6c101740583e9027105ff5538ebf68b54241c50ff742418ff742430ff74243089cb8b4424208b52049090ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc0200000089410458890183f90175058b0424eb0c89cb8b04249090e8620c00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f0367bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c420c20800f6c301740783fb017f10eb06f643ff107408b868977ab2c208008b71088b7e04833f05750dff30b808377bb28b5d0490ff13833f01751c8b4f08833903750c8b71048b3683fe01751beb1283790401740ceb118b4f048b0983f9017507b9fc367bb2eb05b97c377bb28b75008d76f43b75087303ff5520897500c746fc02000000894e04c70607000000f7c601000000740c8b08b8ecd57ab28b5d04ff138b088b79088b4f0483390375058b7908eb3683390175058b7904eb2cbf010000008b4904f6c101751ff7c701000000740583c7027105ff5538ebf68b49043b650c7303ff5524ebdcff30525356bb8c377bb289f8e87e0c000089c3b801000000e86e0400008b4c24085089d88b5c24088b5108ff128b4c240c6a016a01508d5c24048b01e812e7ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2408894804c70007000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890183f90175058b0424eb0a89cb8b0424e8b20d00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480483c40c5983c40c890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c208008b08f6c301740783fb017f10eb06f643ff107408b868977ab2c2080089d68b780451ff7104ff31b80100000090e8360300008b4c24088b51088b4a0483390375058b5108eb3383390175058b5104eb29ba010000008b4904f6c101751cf6c201740583c2027105ff5538ebf68b49043b650c7303ff5524ebdf56535057bb303a7bb289d090e8e20a0000509090e85a0d00008b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424188951108b54241c89510c8b5c2414895908894104c7010b0000008b44241051ff74240c8b5c24148b70088b44240889f29090ff128b4c24206a016a01508d5c24048b01e83ae5ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2408894804c70007000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040c287bb2890183f90175058b0424eb0a89cb8b0424e8120d00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c70118e27ab28d410cc740fc02000000894804c700683b7bb28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b44241c83c40ca801740583e8027105ff5538ebf6f64424080175738b5424088b1a8b74241451ff720450ff730c50ff760cff742418ff7604ff74242cff742450ff7424508b1389d3b8030000009090e8c60c000059f6c101740583e9027105ff5538ebf68b54241c50ff720cff742410ff7204ff742424ff742448ff74244889cb8b44241c9090e89a160000eb05e95c00000083f80175058b0424eb0b89c38b042490e8ee1700008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410803000000c7410405000000c70101000000f6c1017418b8ecd57ab28b5d049090ff1389c8b958477bb2506a016a018b45008d40e83b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc0200000089410483c4085883c42489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c208000000000030070000|@6595,2097151,@230|50,0,@5578 61,0,0 66,1,@6511 106,1,@6462 155,0,3 166,0,@6321 253,0,0 274,0,@5592 293,0,@6503 312,0,@5592 350,1,@6535 383,0,@5592 402,0,@6537 424,0,0 431,0,0 438,0,3 444,0,0 455,0,@6321 490,0,@5578 511,0,@6539 565,0,@6538 572,0,@6543 605,0,3 620,0,@6321 658,0,0 707,0,@6544 714,1,@6547 721,0,0 726,1,@6511 762,1,@6462 799,0,3 810,0,@6321 848,0,0 870,1,@6553 903,0,@5592 947,0,0 954,0,0 961,0,3 967,0,0 978,0,@6321 1013,0,@5578 1032,0,0 1038,1,@6511 1073,0,0 1118,0,@6554 1126,1,@6547 1134,1,@6556 1188,0,5 1234,1,@6462 1271,0,3 1282,0,@6321 1320,0,@6501 1342,1,@6557 1375,0,@6364 1394,0,@6558 1414,0,0 1421,0,0 1428,0,0 1434,0,0 1444,0,@6321 1527,0,1 1534,1,@6560 1590,1,@6590 1618,1,@6593 1652,0,0 1659,0,1 1666,0,2 1672,0,0 1682,0,@6321 1696,0,@6594 1732,0,0 1790,0,0 1797,0,0 1804,0,0 1810,0,0 1821,0,@6321 6511:D3,108|8b45008d40d83b45087303ff5520894500c740fc01000040c70001000000c70084307bb28d4008c740fc01000040c700ffffffff8d4808c741fc01000040c7010100000089c28d4108c740fc03000000c700cc337bb28948048950088060ffbfc39090900000000068000000|@6534,7,@211|26,0,0 32,0,@6512 48,0,-1 64,0,0 82,0,@6529 6512:O1|@6513 6513:D3,568|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b880a27ab2eb718b1089cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3dece439b2515289f089fa9090ff12595af6c201740583ea027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000895304eb05e9c20000008b09890b8b0d3ce039b25089d889caff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70110337bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7002c337bb28b4d008d49a03b4d087303ff5520894d00c741fc02000000894104c70160a37ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c700010000008d4818c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70148337bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000034020000|@6528,1048575,@208|30,0,@6514 69,0,@5606 128,0,@4642 199,0,@4582 237,0,@5609 258,0,@5592 277,0,@6517 296,0,@5592 315,0,@5593 364,0,@5592 383,0,@6519 416,0,@5621 436,0,0 443,0,0 450,0,1 456,0,0 473,0,0 494,0,@5592 513,0,@6521 533,0,0 540,0,0 547,0,1 553,0,0 6514:O2|3,@4963 6515:O1|@6516 6516:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@207|1,0,@5227 6517:O2|3,@6518 6518:S6|6e616d65203d 6519:O2|3,@6520 6520:S7|656e747279203d 6521:O5|0,0,0,@6523,@6522 6522:O2|@6526,0 6523:O2|@6524,0 6524:O2|0,@6525 6525:O5|@6454,1124,1124,0,0 6526:O2|3,@6527 6527:S5|4e616d6573 6528:S11|7072696e742d6e616d6573 6529:D3,228|3b650c7303ff55248b4a048b09f6c10175378b198b73048b3e3b38751e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b09890beb13ff7104593b650c7303ff5524ebc4bb01000000f6c30175058b1b8b03c38b4a088b09f6c101740583c1027105ff5538ebf68b5a08890b8b480483e10983f9017507b94f000000eb05b9c4347bb28b1b52505189d89090e86e00000089c358e82ad7feff8b4d008d49e83b4d087303ff5520894d00c741fc020000005a89510489018b14248b5a048b1b8d710cc746fc02000000895e04890e8b520483c4048932c300000000e0000000|@6533,2097151,@210|74,0,0 125,0,39 132,0,@6530 146,1,@6531 154,1,@4940 6530:S2|2727 6531:D3,280|3b650c7303ff5524a801740783f8357c63eb06f640ff10755ba801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903741189c1f6c101740583e9327107ff5538ebf689c150bb3500000089c89090ff15e8c75208a801740583e8027105ff5538ebf690e88effffffeb0889c1b848c052085150bb350000008b4424049090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0347105ff5538ebf6a801740881c0c20000007105ff5538ebf3a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e14eb06f640ff10750c89c1b8500b7ab28b5d04ff1389c35883c404e9b4d5feff0000000014010000|@6532,2097151,@209|43,0,0 50,0,1 80,0,26 90,0,I109 119,0,I48 126,0,26 138,0,I110 165,0,0 172,0,1 235,0,255 252,0,@4936 268,1,@4940 6532:S40|545950455f5452454528292e7661724e616d6553657175656e63652831292831296e616d65283129 6533:S33|545950455f5452454528292e7661724e616d6553657175656e6365283129283129 6534:S30|545950455f5452454528292e7661724e616d6553657175656e6365283129 6535:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@212| 6536:S15|4c6973742e40283229617070283129 6537:O2|3,@6538 6538:S4|74797065 6539:O4|@4608,@5398,@6541,@6540 6540:O5|@6542,345,0,345,0 6541:S18|6973457175616c6974793a2054797065466e 6542:S34|6d6c736f757263652f4d4c436f6d70696c65722f5354525543545f56414c532e4d4c 6543:S6|657174797065 6544:O1|@6545 6545:D3,60|8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f17002008908c30000000038000000|@6546,3,@213|26,0,@5413 45,0,79992 6546:S28|545950455f5452454528292e74635479706556617273283129283129 6547:D3,332|3b650c7303ff5524a801740783f8017c08eb12f640ff10740c89c1b868397bb28b5d04ff13a801740a81f8fdffff017d08eb12f640ff10750c89c1b894397bb28b5d04ff1389c1f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8917b801000000575253a801740ff64424040174083b4424047c07eb41ff5538ebf3508b5424049090ff128b0c24f6c101740583c1027105ff5538ebf68b54240c89444afe58a801740583c0027105ff5538ebf63b650c7303ff5524ebac8b44240883c4088b00b90100000083f801750689c883c404c389c283ea0283e802a801740583c0027105ff5538ebf68b1c248b4443fe8b75008d76f43b75087303ff5520897500c746fc02000000894e04890689d089f13b650c7303ff5524ebad90900000000048010000|@6552,1048575,@214|28,0,@6548 43,0,16777214 60,0,@6550 89,0,0 134,0,0 235,0,0 6548:O4|4,@4943,0,@6549 6549:O5|@6375,175,0,175,0 6550:O4|4,@4943,0,@6551 6551:O5|@6375,123,0,123,0 6552:S16|4c6973742e746162756c617465283229 6553:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@215| 6554:O1|@6555 6555:D3,60|8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f17002008908c30000000038000000|@6546,3,@216|26,0,@5413 45,0,79992 6556:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@217|51,0,6 100,0,0 6557:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@218| 6558:O2|3,@6559 6559:S8|6461746174797065 6560:D3,936|3b650c7303ff55246a016a0153508d4c240851bb403f7bb28b44243490e8f60300008b44240c909090e862080000833c24017507b801000000eb05b8050000008b4d008d49f03b4d087303ff5520894d00c741fc03000000894108c7410403000000c70103000000f6c101740cb8ecd57ab28b5d049090ff138b442408833805756b51ff70048b5c242c8b40088b542430909090ff12837c2408017507b8d0447bb2eb05b800457bb28b4c2434f6c101740783f9017f0feb06f641ff107407ba601c7bb2eb628b55008d52f43b55087303ff5520895500c742fc020000008b5c240c895a04c70207000000eb05e9a6010000f6c201740e89c3b8ecd57ab28b5d049090ff1389d38b55008d52f43b55087303ff5520895500c742fc02000000c7420410457bb2891a8b5d008d5bdc3b5d087303ff5520895d00c743fc0200000089530489038d430cc740fc05000000895810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c2b8ecd57ab28b5d04ff13f6c101740783f9017e69eb06f641ff107561f6c101740583e9027105ff5538ebf650ff742428ff742428ff74242889cb8b4424108b542438909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70028457bb2eb0889c2b801000000528b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc0200000089480459890883c410c22000833c24017507b8d0447bb2eb05b800457bb28b54242cf6c201740783fa017f0feb06f642ff107407bb74977ab2eb048b5c24048b75008d76f43b75087303ff5520897500c746fc02000000895e04c70607000000f7c601000000740d89c3b8ecd57ab28b5d0490ff138b5d008d5bd03b5d087303ff5520895d00c743fc02000000c743040100000089338d730cc746fc02000000895e0489068d460cc740fc05000000897010c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c3b8ecd57ab28b5d04ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc02000000895804890883c410c220009000000000a4030000|@6589,2097151,@226|20,0,@6561 30,1,@6564 42,1,@6579 53,0,0 60,0,2 94,0,1 100,0,1 110,0,@6321 158,0,@6580 165,0,@6583 192,0,@6486 231,0,3 250,0,@6321 290,0,@6584 341,0,0 348,0,0 355,0,0 361,0,0 372,0,@6321 469,0,0 490,0,@6586 499,0,0 567,0,0 574,0,0 581,0,0 587,0,0 598,0,@6321 636,0,0 671,0,@6580 678,0,@6583 705,0,@5579 744,0,3 759,0,@6321 796,0,0 833,0,0 840,0,0 847,0,0 853,0,0 864,0,@6321 900,0,0 6561:O1|@6562 6562:D3,16|b801000000c39090000000000c000000|@6563,1,@219|1,0,0 6563:S39|545950455f5452454528292e67656e6572616c6973652831296e65774d617463687c742d283129 6564:D3,108|3b650c7303ff55248b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c7021c407bb2894a04895a088062ffbf516894437bb289d390e80ec8ffff598b098b5424048902894a04b801000000c2040090900000000068000000|@6578,2097151,@224|34,0,0 50,0,@6565 66,0,@6575 74,1,@6446 91,0,0 6565:D3,180|3b650c7303ff552483380d756a8b4808c1e90383c901f6c101740783f9017d1ceb06f641ff1074145052ff700489cbb88c6c7ab2ff1588c75208eb0989c389c85352ff730481f81f4e0000740583c40858c38b442404ff70088b58048b44240c90e8620000008b0c248b09833907753383380d7414eb05e92d00000089c2b898427bb28b5d0490ff1350ff70046800437bb28b5c241089c890e83ec7ffff598901eb01505883c40cc3c3909000000000b0000000|@6574,2097151,@222|48,0,@5215 54,0,I106 71,0,9999 98,1,@6566 127,0,@6567 142,0,@6571 154,1,@6446 6566:D3,416|3b650c7303ff552483380d740c89c1b898427bb28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b700489318b3bf7c70100000075378b178b72048b163b5004751e8b55008d52f83b55087303ff5520895500c742fc010000008b3f893aeb128b7f043b650c7303ff5524ebc1ba0100000083fa01756c5351ff7004ff700889c88b542414909090ff1283f80175598b042483e00983f8017407b801000000eb05b80300000083f0028b0c2483e10383f9017407b901000000eb05b90300000083f1028b55008d52f83b55087303ff5520895500c742fc01000040c702ec7d7ab2eb0ae996000000e98900000083f8017507b801000000eb05b80900000081c8f17002000bc189c18b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7000d0000008b4c24048b09890a8b4d008d49e83b4d087303ff5520894d00c741fc020000008b54240889510489018b54240c8b128d590cc743fc02000000895304890b8b4c240c891983c410c204008b0083c410c204008b128b02c20400909090000000009c010000|@6570,1048575,@220|16,0,@6567 126,0,0 171,0,0 178,0,1 197,0,0 204,0,1 237,0,@5413 259,0,0 266,0,4 312,0,6 6567:O4|101,@6569,0,@6568 6568:O5|@6454,90,0,90,0 6569:S5|4d61746368 6570:S36|545950455f5452454528292e67656e6572616c6973655479706573283229747673283129 6571:O1|@6572 6572:D3,12|c39090900000000008000000|@6573,1,@221| 6573:S47|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129283129 6574:S44|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129 6575:O1|@6576 6576:D3,12|c39090900000000008000000|@6577,1,@223| 6577:S40|545950455f5452454528292e67656e6572616c6973655479706573283229636f706965642d283129 6578:S30|545950455f5452454528292e67656e6572616c6973655479706573283229 6579:D3,168|3b650c7303ff5524a80175708b088b51048b5a0483e30983fb017407bb01000000eb05bb0300000083f3028b720483e60383fe017407be01000000eb05be0300000083f6028b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f048b19891f578b700489f0e88effffff89c18b45008d40f4eb05e9190000003b45087303ff5520894500c740fc02000000894804598908c3b801000000c300000000a4000000|@6329,63,@225|29,0,0 36,0,1 55,0,0 62,0,1 155,0,0 6580:O5|0,0,0,0,@6581 6581:O2|@6582,@6363 6582:O2|3,124 6583:O3|1,0,2 6584:O2|@6586,@6585 6585:O2|@6587,0 6586:O3|1,1,4 6587:O2|3,@6588 6588:S2|6f66 6589:S53|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e737472283429 6590:D3,192|3b650c7303ff5524a8017571f6c301740783fb017d10eb06f643ff107408b801000000c218008b08ff700453ff710c53ff742428ff742428ff742428ff742428ff742428ff7424288b19b8010000009090e89ef5ffff59f6c101740583e9027105ff5538ebf650ff742420ff742420ff742420ff742420ff742420eb05e92e000000ff74242089cb8b44241c90e86effffff83f80175075883c404c2180089c38b042483c4085983c41851e924000000b801000000c2180000000000bc000000|@6592,2097151,@228|31,0,0 75,0,0 82,1,@6560 172,1,@6591 177,0,0 6591:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@227| 6592:S57|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e73747252657374283229 6593:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@229| 6594:O2|3,I48 6595:S40|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d6170283429 6596:O12|@6597,@4604,@5308,@4644,@6668,@4646,@6678,@4648,@6686,@4609,@5316,@4643 6597:D3,168|3b650c7303ff55248b4c24048b7424088b7c240c538b5a04895c24108b5a08895c240c8b5a0c895c24088b5a10508b442408895c24088b5a1453578b7c240c895c240c8b5a18578b7c240c895c240c8b5a1c895c24088b5a20578b7c2408895c24088b5a2453578b7c240c895c240c8b5a28578b7c240c895c240c8b522c895424088b542404894c24048b0c248934245289cb89c189f851e91f00000090909000000000a4000000|@6667,2097151,@254|153,1,@6598 6598:D3,3812|8d7c249c3b7d0c7303ff552853e856c1ffff8b08baa6487bb28d548afcffe2909090e946010000909090e949010000909090e94c010000909090e9c4030000909090e904060000909090e940090000909090e9030000009090908b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b580489198b1b833b03754389c88b5424089090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff1383c404c238008b4c243c8b7424388b7c24348b4424308b54242c538b5c242c538b5c242c538b5c242c538b5c242c538b5c242c538b5c242c538b5c242c538b5c242c538b5c242c894c24608974245c897c245889442454895424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b442404894424345883c41c89442410895c240c8b5c24045883c404e993feffffb87c577bb283c404c23800b894577bb283c404c238008b0c24f6c101740783f9017f13eb06f641ff10740bb868977ab283c404c23800ff70088b4004e8babfffff83380575688b4c2404f6c101740783f9037f0feb06f641ff107407b868977ab2eb70f6c101740583e9027105ff5538ebf6ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff74244089cbeb05e97d00000090e8dafdffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000eb05e9ad000000c74104849a7ab289018d410cc740fc020000008948049090c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801746189c1b8ecd57ab28b5d04ff138b4c2404f6c101740583e9027105ff5538ebf6ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff74244089cb909090e80efdffff8b4c2404f6c101740583e9027105ff5538ebf650ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff74244489cb8b44243c90e8b6fcffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab28d480cc741fc02000000894104c701b0577bb28d410cc740fc02000000894804c70018e27ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c404c238008b0c24f6c101740783f9017f13eb06f641ff10740bb868977ab283c404c23800ff7004ff7008e8160b000083f80174708b4424049090e8460c000050b86c597bb250ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244c8b5c2448b855000000909090e8620c000089c18b45008d40e83b45087303ff5520894500eb05e93b000000c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c40cc23800bbdc5e7bb28b44240490e852d0ffff8b4c2408f6c101740583e9027105ff5538ebf6ba6c597bb252ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff74244889c389c89090e8f61100008b0c2483390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f9017407b9fb000000eb13837c2404017407b9a0637bb2eb05b998a27ab28b55008d52f43b55087303ff5520895500c742fc02000000894a04c70207000000f6c201740e89c1b8ecd57ab28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891183f901740789cbe8421500008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70160a37ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c40cc2380083780401750bb894577bb283c404c238008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c243c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174208b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424388911eb608b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c24343b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424308911eb65e9340100008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c242c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424288911eb65e9cf0000008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c24243b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424208911eb65e96a0000008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c241c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424188911eb0ae905000000b90100000083f90175598b4004e82213000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c404c238008b018b55008d52e83b55087303ff5520895500c742fc05000000c742100100000089420c8b18895a08c7420401000000c7020b0000008b74243c8b7c24388b4c24348b4424308b5c242c528b54242c528b54242c528b54242c528b54242c528b54242c528b54242c528b54242c528b54242c528b54242c89742460897c245c894c245889442454895c24508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b442404894424345883c41c894424108954240c8b5c24045883c404e971f6ffff8b480c8b51088b5a04833b0375098b73043b74241474048b31eb038b70088b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000c70774677bb26a016a01ff7004518d44240850ff74242451ff742428bb0100000089f0909090e89a160000837c240c0175068b442408eb678b0424f64424200175208b48088b5104833a0175158b5c24208b420c8b13909090ff128b40088b00eb088b48088b51088b0281f848c052087424a801755b89c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901753b837c240c03752eeb05e9960000008b45008d40f43b45087303ff5520894500c740fc020000008b4c2408894804c7007f000000eb5e8b442408eb5d6a016a0189e151ff74242cff742410ff742430bb0100000090e8d6150000837c24040175058b0424eb3c837c24140375318b45008d40f43b45087303ff5520894500c740fc020000008b4c2410894804c7007f000000eb0ee90c000000e9070000008b44241083c408a801753b8378040175048b00eb368b188b400490e8a21c000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048918e89abdfeffeb05b848c052088b0c248b51088b5a04833b0375108b73043b7424247507bf01000000eb688b7104f7c60100000075328b3e833f01751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc6b901000000f6c101756c8b31833e0175658b7d008d7ff43b7d087303ff5520897d00c747fc02000000eb05e94b0000008b5604895704c70701000000f7c701000000740d89c3b8ecd57ab28b5d0490ff1389fb8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7470401000000891feb05bf010000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc0500000089411089790cc7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff13f64424040175618b44240451ff70048b1089d090e8aab4fffff6042401741550e87a02000083f80175638b04248338057505eb5e50eb608b4c241cf6c101740583e9027105ff5538ebf6ff742458ff742458ff742458ff742458ff742458ff742458ff742458eb05e9c1010000ff742458ff742458ff742458ff742458ff742458ff742458ff74245889cbeb0fe911000000e90c000000e907000000e8baf2ffffeb6e8b44241ca801740783f8037f0feb06f640ff107407b868977ab2eb70a801740583e8027105ff5538ebf6ff742410b96c597bb251ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460eb05e98200000089c3b859000000909090e826030000909090e88a1a0000eb05e96400000083f8017507b83c717bb2eb0d89c3b83c717bb290e8de1a000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000083c4085a89118b55008d52d03b55087303ff5520895500c742fc02000000894a04c7029c9a7ab28d4a0cc741fc0200000089510489018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c414c2380089c883c414c238009000000000e00e0000|@6666,2097151,@253|14,1,@6447 21,0,$6598+34 173,0,3 184,0,@6321 366,0,@6599 377,0,@6601 409,0,@5578 426,1,@6447 458,0,@5578 584,0,@5590 607,0,@5594 629,0,0 636,0,0 643,0,0 649,0,0 660,0,@6321 869,0,0 890,0,@6364 909,0,@6603 928,0,@6364 981,0,0 988,0,0 995,0,0 1001,0,0 1012,0,@6321 1049,0,@5578 1066,1,@6605 1082,1,@6607 1088,0,@6608 1154,0,42 1162,1,@6609 1205,0,0 1212,0,0 1219,0,0 1225,0,0 1236,0,@6321 1252,0,@6611 1262,1,@6493 1286,0,@6608 1354,1,@6616 1392,0,125 1406,0,@6622 1413,0,@5608 1446,0,3 1458,0,@6321 1496,0,0 1510,1,@6623 1543,0,@5621 1563,0,0 1570,0,0 1577,0,2 1583,0,0 1594,0,@6321 1618,0,@6601 1637,0,0 1666,0,1 1733,0,0 1762,0,1 1834,0,0 1863,0,1 1935,0,0 1964,0,1 2036,0,0 2065,0,1 2129,0,0 2142,1,@6624 2178,0,0 2185,0,0 2192,0,0 2198,0,0 2209,0,@6321 2256,0,0 2271,0,0 2277,0,5 2503,0,0 2509,0,@6627 2536,0,0 2546,1,@6645 2615,0,I48 2628,0,I48 2633,0,4 2704,0,63 2736,0,0 2742,1,@6645 2798,0,63 2842,1,@6660 2878,1,@4953 2885,0,I48 2913,0,0 2981,0,0 3036,0,0 3051,0,@6321 3090,0,0 3099,0,0 3132,0,3 3142,0,@6321 3180,0,0 3205,0,0 3212,0,0 3218,0,0 3228,0,@6321 3258,1,@6447 3270,1,@6605 3422,0,@5578 3447,0,@6608 3518,0,44 3526,1,@6609 3534,1,@6662 3551,0,@6663 3560,0,@6663 3566,1,@6665 3602,0,0 3609,0,0 3616,0,0 3622,0,0 3633,0,@6321 3672,0,0 3711,0,@5592 3746,0,0 3753,0,0 3760,0,0 3766,0,0 3777,0,@6321 6599:O2|3,@6600 6600:S3|626164 6601:O2|3,@6602 6602:S7|6e6f2074797065 6603:O2|3,@6604 6604:S2|2d3e 6605:D3,264|3b650c7303ff5524833807755cf6400401755b8b4804f641040175578b5008833a0175058b5208eb0f8b52048b123b650c7303ff5524ebe783fa017450ba03000000f6c10175618b01ff710452ff30bb0300000089d0bafc317ab29090e8fad9feff3b04247454eb0fe98a000000e985000000e980000000f60424017565a8017561a801740cb903000000eb0be9600000008b088d4c090183c1088b342489c7d1e93bc9f3a6eb05e93f0000008d7c3f018d7436018d4c090175288b442404a801740583c0027105ff5538ebf68b4c240889c283c40c3b650c7303ff5524e95fffffffb80100000083c40cc3b803000000c3b801000000c3b801000000c390900000000004010000|@6606,2097151,@231|62,0,1 80,0,1 87,0,@5052 94,1,@5053 135,0,1 228,0,0 237,0,1 243,0,0 249,0,0 6606:S28|545950455f5452454528292e697350726f6475637454797065283129 6607:D3,80|3b650c7303ff5524a80175338b08ff71048b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@232|64,0,0 6608:O1|@6598 6609:D3,1312|8d7c24ac3b7d0c7303ff5528f64424400175508b4c244083790401756353508b01e852b0ffff833c24557518833805741050909090e81afeffff83f8017508eb6650eb0350eb658b442408a801740783f8037f14eb06f640ff10740cb868977ab2eb6de9a5040000a801740583e8027105ff5538ebf6ff742444ff742444eb05e962010000ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444eb0ae9c6000000e9c1000000ff742444ff742444ff742444ff74244489c38b4424388b942480000000eb05e974000000909090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c40cc24000ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff7424448b5c24408b4424388b942480000000909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c40cc24000f6c301740783fb017f10eb06f643ff107408b8601c7bb2c240005350ff71048b0190e86aaeffff837c2404557517833805740f509090e832fcffff83f8017508eb6650eb0350eb658b44240ca801740783f8037f0feb06f640ff107407b968977ab2eb70a801740583e8027105ff5538ebf6ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448eb0ae991000000e98c000000ff74244889c38b4424388b9424840000009090ff128b4d008d49d03b4d08730aeb05e9b5000000ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc020000008948049090c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101745db8ecd57ab28b5d04909090ff13ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b4424388b942484000000ff1289c183c4046a01837c2408597407b801000000eb05b80300000083f0028b55008d52f03b55087303ff5520895500c742fc03000000c7420801000000894204c70203000000f6c201740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc020000008b5c240883c404895804c70007000000a801740c89c6b8ecd57ab28b5d04ff138b75008d76c43b75087303ff5520897500c746fc02000000c746040100000089068d460cc740fc0200000089700489108d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c2408f6c101740583e9027105ff5538ebf650ff742404ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff74245089cb8b4424489090e82afbffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c8908c24000b801000000c24000909090000000001c050000|@6610,2097151,@233|34,1,@6447 54,1,@6605 93,0,@5578 245,0,@5590 266,0,@5594 288,0,0 295,0,0 302,0,0 308,0,0 319,0,@6321 358,0,0 475,0,0 506,0,@6486 522,1,@6447 542,1,@6605 581,0,@5578 720,0,@5590 743,0,@5594 763,0,0 770,0,0 777,0,0 783,0,0 793,0,@6321 893,0,0 900,0,1 934,0,0 943,0,1 953,0,@6321 1001,0,3 1012,0,@6321 1048,0,0 1100,0,0 1107,0,0 1114,0,0 1120,0,0 1131,0,@6321 1267,0,@5592 1294,0,0 6610:S41|545950455f5452454528292e744469737028352964697370502832297072657474794c697374283329 6611:O1|@6612 6612:D3,48|8b088b45008d40f43b45087303ff5520894500c740fc02000000c700285f7bb28948048060ffbfc3000000002c000000|@6615,3,@235|28,0,@6613 6613:D3,28|3b650c7303ff55248b188b4204ff25e8bd5208900000000018000000|@6614,63,@234|15,0,I29 6614:S48|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283229283129 6615:S45|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283129 6616:D3,720|3b650c7303ff5524f6c301756e8b0ba801740783f8017f10eb06f640ff107408b8601c7bb2c23c00ff730450ff7104bb750000008b01909090e88eabfeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442404a801740ceb05e94002000083e8027105ff5538ebf651ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff74244889c38b44243c8b942484000000ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c4048901f6442404017507b8ac627bb2eb05b80100000083f801740b89c389c8e8c201000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008901f6442404017407b801000000eb768b0424a801740583e8027105ff5538ebf651ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c2444909090e8f2fdffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e90b000000894804c7009c9a7ab2eb015183f80175058b0424eb0d89c38b0424909090e8020100008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c40cc23c00b801000000c23c0000000000cc020000|@6621,1048575,@238|33,0,@6486 48,0,58 58,1,@4940 91,0,3 101,0,@6321 237,0,0 258,0,@5592 289,0,@6617 296,0,0 310,1,@6619 346,0,0 353,0,0 360,0,0 366,0,0 377,0,@6321 416,0,0 430,0,0 564,0,@5592 590,1,@6620 624,0,0 631,0,0 638,0,0 644,0,0 654,0,@6321 692,0,0 705,0,0 6617:O2|@5643,@6618 6618:O2|@5593,0 6619:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@236| 6620:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@237| 6621:S35|545950455f5452454528292e7444697370283529646973705028322970526563283229 6622:S6|2c202e2e2e7d 6623:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@239| 6624:D3,792|3b650c7303ff5524a80175638378040175628b088b5104f6c20175328b1a833b01751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc9be01000000f7c60100000075698b16833a0175628b5d008d5bf43b5d08730feb0ae994020000e9fa000000ff5520895d00c743fc020000008b7a04897b04c70301000000f6c301740ab8ecd57ab28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008919eb05b9010000008b008b55008d52f43b55087303ff5520895500c742fc020000008b00894204c70207000000f6c201740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc05000000894210894a0cc7420801000000c7420401000000c70201000000f6c201740ab8ecd57ab28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008910c38b088b5104f6c20175328b1a833b01751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc9be01000000f7c60100000075608b16833a0175598b5d008d5bf43b5d087303ff5520895d00c743fc020000008b7a04897b04c70301000000f6c301740dff7004b8ecd57ab28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008919eb05b9010000008b108b5d008d5bf43b5d087303ff5520895d00c743fc020000008b32897304c70307000000f6c301740e8b7804b8ecd57ab28b5d0490ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c7470401000000891f8d5f0cc743fc05000000897b10894b0cc7430801000000c7430401000000c70301000000f6c301740e8b4804b8ecd57ab28b5d0490ff13ff7004538b442404e842fdffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70134677bb28d410cc740fc02000000894804c700f0a47ab289c18d400cc740fc020000008948045983c4048908c3b801000000c390900000000014030000|@6626,63,@240|79,0,0 142,0,0 152,0,@6321 188,0,0 197,0,0 234,0,3 244,0,@6321 280,0,0 305,0,0 312,0,0 318,0,0 328,0,@6321 364,0,0 432,0,0 483,0,0 496,0,@6321 532,0,0 541,0,0 578,0,3 591,0,@6321 628,0,0 653,0,0 660,0,0 666,0,0 679,0,@6321 731,0,@6625 750,0,@5643 777,0,0 6625:O2|3,47 6626:S42|545950455f5452454528292e744469737028352964697370502832297072696e745443636f6e73283129 6627:O1|@6628 6628:D3,112|8b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b800687bb2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338037506b874687bb2c3f6c101740783f9037c0eeb06f641ff107506b8bc687bb2c3b8d8327bb2c390000000006c000000|@6644,3,@241|22,0,@6514 33,0,@6629 57,0,@6514 68,0,@6636 92,0,@6640 98,0,@6514 6629:O5|0,0,0,@6631,@6630 6630:O2|@6634,0 6631:O2|@6632,0 6632:O2|0,@6633 6633:O5|@6454,893,893,0,0 6634:O2|3,@6635 6635:S10|466f756e644d61746368 6636:O5|0,0,0,@6631,@6637 6637:O2|@6638,0 6638:O2|3,@6639 6639:S13|466f756e644e6f744d61746368 6640:O5|0,0,0,@6631,@6641 6641:O2|@6642,0 6642:O2|3,@6643 6643:S8|4e6f74466f756e64 6644:S13|7072696e742d6973466f756e64 6645:D3,336|3b650c7303ff552481f848c052087424a801753589c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090175158b4424108918c7400405000000b801000000c210006a016a01538d5c2404909090e85ea9ffff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c2404890850ff742418ff74241889c38b4424189090e8d200000083f805752f8b44241c8b4c24188b5424148b5c24108944241c894c241889542414895c24108b1c2483c4045883c404e93affffff83f80375606a016a0189e050ff742424ff742424ff7424248b5c24188b44241c909090e812ffffff837c240401751b8b4424248b0c2489088b4c2404894804b80100000083c414c210008b4424248b0c248908c7400403000000b80100000083c414c210008b44241c8b0c248908c7400401000000b80100000083c40cc210009090000000004c010000|@6659,2097151,@249|10,0,I48 23,0,I48 28,0,4 61,0,2 66,0,0 86,1,@6462 142,1,@6646 262,0,0 284,0,1 289,0,0 311,0,0 316,0,0 6646:D3,540|3b650c7303ff5524f6c301756d837b0401756c8b088b0389ca909090ff1283f8017508b805000000c208008b088b118b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703a86c7bb28b7424088973048063ffbf6a016a016a01ff32ff7104683c6d7bb2683c6d7bb26a018d7c2414578b442428eb0ae98d010000e96400000090e80299ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700906d7bb2598948048060ffbf6a016a016a01683c6d7bb2683c6d7bb26a018d4c240c5189c38b44241ce8ba98ffff83c4085b83c40c58909090e872aaffff83f002c20800ff73048b48048b0389ca9090ff1283f801750bb80500000083c404c208008b088b118b5a086a016a016a016a016a016a016a016a016a016a016a016a016a01ff7310ff71048b338d5c240889f0bac0e47ab2909090e82679ffff833c240175068b442404eb338b04248b088b45008d40f03b45087303ff5520894500c740fc030000009090c700f46d7bb28b5424048950048948088060ffbf8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7012c6e7bb289410483c4285a83c40c8951088061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c702046f7bb2894204588942088062ffbf8b45008d40f43b45087303ff5520894500c740fc0200000089500489088b4c240c8b542408894c240c895424085be9f4fdffffb805000000c208000000000018020000|@6658,2097151,@248|36,0,2 73,0,@6647 100,0,@6649 105,0,@6649 134,1,@6437 164,0,@6652 183,0,@6649 188,0,@6649 206,1,@6437 222,1,@6466 252,0,2 310,0,@6366 318,1,@6367 367,0,@6653 411,0,@6654 458,0,@6656 525,0,2 6647:D3,80|3b650c7303ff5524f642040175318b480483390175298b52048b410c8b129090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c3909090000000004c000000|@6648,1048575,@242|64,0,0 6648:S40|545950455f5452454528292e657154797065436f6e73747273283429636f70794964283129283129 6649:O1|@6650 6650:D3,12|c39090900000000008000000|@6651,1,@243| 6651:S33|545950455f5452454528292e657154797065436f6e737472732834296964283129 6652:D3,80|3b650c7303ff5524f642040175318b480483390175298b52048b410c8b129090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c3909090000000004c000000|@6648,1048575,@244|64,0,0 6653:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e93093ffff0000000020000000|@6481,2097151,@245|24,1,@6426 6654:D3,132|3b650c7303ff5524528b4a0889ca9090ff12a801755d8b0c248b55008d52f83b55087303ff5520895500c742fc010000008b4904890a8b4d008d49f43b4d087303ff5520894d00c741fc020000008951048b0089018b45008d40f83b45087303ff5520894500c740fc01000000890883c404c3b80100000083c404c30000000080000000|@6655,1048575,@246|116,0,0 6655:S55|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b757054797065283129 6656:D3,132|3b650c7303ff5524528b4a0889ca9090ff12a801755d8b0c248b55008d52f83b55087303ff5520895500c742fc010000008b4904890a8b4d008d49f43b4d087303ff5520894d00c741fc020000008951048b0089018b45008d40f83b45087303ff5520894500c740fc01000000890883c404c3b80100000083c404c30000000080000000|@6657,1048575,@247|116,0,0 6657:S57|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b7570537472756374283129 6658:S39|545950455f5452454528292e7444697370283529646973705028322966696e6454797065283229 6659:S41|545950455f5452454528292e744469737028352964697370502832296e616d65546f4c697374283229 6660:D3,100|3b650c7303ff5524a801754aff308b4004e8eaffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7005d000000c3b801000000c30000000060000000|@6661,3,@250|81,0,46 87,0,0 6661:S25|537472696e672e636f6e636174576974682832296d6b283129 6662:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@251|56,0,@5642 6663:O2|@5594,@6664 6664:O2|@5643,0 6665:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@252| 6666:S28|545950455f5452454528292e74446973702835296469737050283229 6667:S20|545950455f5452454528292e7444697370283529 6668:O3|@6670,@5229,@6669 6669:O3|@6672,@6677,@6671 6670:S4|7265616c 6671:O3|@6670,@5256,@5255 6672:O2|1,@6673 6673:O3|2,@6674,0 6674:O4|0,@4645,2,1 6675:O1|@6676 6676:D3,16|b8f06e7ab2c39090000000000c000000|@5295,1,@255|1,0,@5252 6677:O4|1,@4644,0,0 6678:O3|@6680,@5229,@6679 6679:O3|@6682,@6685,@6681 6680:S4|776f7264 6681:O3|@6680,@5256,@5255 6682:O2|1,@6683 6683:O3|2,@6684,0 6684:O4|I251,@4647,1,1 6685:O4|1,@4646,0,0 6686:O3|@6688,@5229,@6687 6687:O3|@6690,@6693,@6689 6688:S4|63686172 6689:O3|@6688,@5256,@5255 6690:O2|1,@6691 6691:O3|2,@6692,0 6692:O4|I251,@4649,1,1 6693:O4|1,@4648,0,0 6694:O2|@6695,@6596 6695:D3,348|3b650c7303ff5524a801756b83780401756a8b088b75008d76f03b75087303ff5520897500c746fc030000008b7904897e088b01894604c7060d000000ff7424046814757bb26a0189f08b5204909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c740049c757bb28908eb0ae9cd000000e903000000c20400f6c301740783fb037f10eb06f643ff107408b8601c7bb2c20400ff7204ff74240889d989c389c89090e852010000909090e8aa0300008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000c740049c757bb28908c20400b801000000c204009090900000000058010000|@6712,1048575,@261|57,0,6 66,0,@6696 111,0,@6702 151,0,@6486 174,1,@6703 182,1,@6711 215,0,@5643 234,0,@5594 254,0,0 261,0,0 268,0,0 274,0,0 284,0,@6321 320,0,@6702 330,0,0 6696:O2|@6698,@6697 6697:O1|@6701 6698:O1|@6699 6699:D3,16|b801000000c39090000000000c000000|@6700,1,@256|1,0,0 6700:S28|545950455f5452454528292e656d70747954797065456e762d283129 6701:D3,16|b801000000c39090000000000c000000|@6700,1,@257|1,0,0 6702:O2|@5592,0 6703:D3,352|3b650c7303ff5524a801740783f8017f10eb06f640ff107408b8601c7bb2c20800f6c3017408b801000000c20800f6c301740e89c1b81c777bb28b5d049090ff138b0b8b55008d52f03b55087303ff5520895500c742fc030000008b71048972088b39897a04c7020d0000005053ff74240c6814757bb26a0189c389d08b54241c909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410448717bb28901f6042401740cb858777bb28b5d049090ff138b0424f64004017407b801000000eb6fa801740cb858777bb28b5d049090ff138b542404f6c201740583ea027105ff5538ebf651ff742414ff7424148b580489d0909090e8fefeffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab2eb015183f80175075883c408c2080089c38b042483c40c5983c40851e98500000090000000005c010000|@6710,1048575,@259|26,0,@6486 39,0,0 54,0,@6704 104,0,6 115,0,@6696 161,0,@6664 174,0,@6707 195,0,0 206,0,@6707 287,0,@5592 306,0,@5593 339,1,@6709 6704:O4|@4650,@6706,0,@6705 6705:O5|@5419,84,0,84,0 6706:S5|456d707479 6707:O4|@4650,@6706,0,@6708 6708:O5|@5419,85,0,85,0 6709:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@258| 6710:S36|545950455f5452454528292e7072696e7454797065566172732833297056617273283229 6711:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8849a7ab2c39090900000000044000000|@6536,3,@260|56,0,@5590 6712:S28|545950455f5452454528292e7072696e745479706556617273283329 6713:O6|@6798,@4653,@4654,@4652,@4623,@4643 6714:D3,96|3b650c7303ff55248b4d008d49f83b4d087303ff5520894d00c741fc01000040c701010000005151ff7204ff7208ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722cff723090e822000000588b00c39090000000005c000000|@6797,2097151,@298|34,0,0 78,1,@6715 6715:D3,10924|8d7c249c3b7d0c7303ff55285350909090e8be90ffff508b4424089090e8b290ffff8b0c2483390b75178b510c8b5a088b7304833e0375098b7e043b7c2438741c83380b75228b500c8b5a088b7304833e0375148b7e043b7c2438750bb80100000083c40cc23400833901750bb80100000083c40cc23400833801750bb80100000083c40cc2340083390d756683380d75668b55008d52e83b55087303ff5520895500c742fc020000008b5908895a048b710489328d7a0cc747fc020000008b70088977048b5804891f8b59048b1b8b71043b7004750bb80100000083c40cc234008b710883e60583fe0174708b442440eb0ae9f1060000e9ec0600008b4c243c8b5424388b5c24348b742430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2428897c24648b7c242c897c24608944245cb8d8a37bb289442458894c245489542450eb05e95a000000895c244c897424488b44241c894424448b442418894424408b4424148944243c8b442410894424388b44240c894424348b4424088b4c2430894424308b4424048944242c5883c41c894424088b5c24045883c40451e90c2900008b70048b36833b07756b833e07756b578b7d008d7ff43b7d087303ff5520897d00c747fc0200000050528b53088957048b530489178b55008d52f43b55087303ff5520895500c742fc0200000056538b5e08895a048b5e04891a8b4004c700ec7d7ab28b4904c701ec7d7ab2ff3424ff742408eb0ae956010000e951010000b8d8a37bb250ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff74246089d389f8e8ae3d0000ff742418ff742420ff74245cb9d8a37bb251ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff74246089c38b442450909090e8fa2700008b44245483c4088b4c24488b5424448b5c24408b74243c8b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2430897c246c8b7c2434897c246889442464b8d8a37bb289442460894c245c89542458895c2454897424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b4424088b4c2438894424388b442404894424345883c41c894424108b5c24045883c40c51e93c270000833b097563833e097563575052ff7104ff70048b5b048b4604e87a47000083f80175718b45008d40ec3b45087303ff5520894500c740fc04000000c7400c80c57bb28b4c241c8948088b4c2418894804c700010000008b4c24548b09f6c1017517b801000000eb0ae9eb010000e9e601000083c420c234008b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb05e9110000008b4424548908b80100000083c420c234008b0c24c701ec7d7ab28b4c2404c701ec7d7ab2a801753e8378040175388b088b55008d52e83b55087303ff5520895500c742fc05000000c7421001000000894a0c8b19895a08c7420401000000c7020b000000eb4d8b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d5108c742fc03000000c74208f1700200894a04c7020d0000008d5a10c743fc02000000894304c703090000008919ff742418ff742420ff74245cb8d8a37bb250ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff74246089d38b44245090e8a22500008b4424548b4c24508b54244c8b5c24488b7424448b7c2440578b7c2440578b7c2440578b7c2440578b7c2440578b7c2440578b7c2440578b7c2440578b7c2438897c24748b7c243c897c24708944246cb8d8a37bb289442468894c246489542460895c245c897424588b44241c894424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b4424088b4c2440894424408b4424048944243c5883c41c894424188b5c240c83c4085883c40c51e9e4240000833b0375718b4c24408b5c243c8b7424388b7c2434508b442434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b54242c895424688b54243089542464894c2460b9d8a37bb2894c245c895c245889742454897c24508944244c8b44241ceb05e94e000000894424488b442418894424448b442414894424408b4424108944243c8b44240c894424388b4424088b4c2434894424348b442404894424305883c41c8944240c8b5c24045883c40851e91b240000833e0375708b4424408b4c243c8b5424388b5c24348b742430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c2428897c24648b7c242c897c24608944245cb8d8a37bb289442458894c245489542450895c244c897424488b44241ceb05e94e000000894424448b442418894424408b4424148944243c8b442410894424388b44240c894424348b4424088b4c2430894424308b4424048944242c5883c41c894424088b5c24045883c40451e9532300008b45008d40ec3b45087303ff5520894500c740fc04000000c7400ca4c57bb28b4c24088948088b4c2404894804c700010000008b4c24408b09f6c101750bb80100000083c40cc234008b4d008d49f83b4d087303ff5520894d00c741fc0100000089018b4424408908b80100000083c40cc2340083390d755d8b55008d52f43b55087303ff5520895500c742fc020000008b5908895a048b7104893283e30583fb0175078b36833e09755c83380b755c8b580c8b73088b7e04833f0375098b4f043b4c24387405833f05746683380b7566833f03eb05e91a05000075098b4f043b4c24387405833f0574718b4c24408b5c243c8b7424388b7c2434508b442434528b542434eb0ae92c040000e96a030000528b542434528b542434528b542434528b542434528b542434528b54243452eb0ae949020000e9870100008b542434528b54242c895424688b54243089542464894c2460b9d8a37bb2eb05e966000000894c245c895c245889742454897c24508944244c8b44241c894424488b442418894424448b442414894424408b4424108944243c8b44240c894424388b4424088b4c2434894424348b442404894424305883c41c8944240c8b5c24045883c40851e98c210000833f0574108b4804b888a77bb28b5d04909090ff138b58048b47049090e86a2500008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c0c57bb28941048061ffbf6a016a0189e05089cb8b47089090e8eebcffff5883c404909090e83287ffff8b4c24408b54243c8b5c24388b7424348b7c2430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430894c24608954245c895c245889742454897c24508b4c2418894c244c8b4c2414894c24488b4c2410894c24448b4c240c894c24408b4c2408894c243c8b4c2404894c24385983c418894c2418894424145b5883c408e9c8f5ffff8b4c24408b5c243c8b7424388b7c2434508b442434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b54242c895424688b54243089542464894c2460b9d8a37bb2894c245c895c245889742454897c24508944244c8b44241c894424488b442418894424448b442414894424408b4424108944243c8b44240c894424388b4424088b4c2434894424348b442404894424305883c41c8944240c8b5c24045883c40851e9d31f0000833f05740f8b4804b888a77bb28b5d049090ff138b58048b47049090e8b22300008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7014cc67bb28941048061ffbf6a016a0189e05089cb8b47089090e836bbffff5883c404909090e87a85ffff8b4c24408b54243c8b5c24388b7424348b7c2430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430894c24608954245c895c245889742454897c24508b4c2418894c244c8b4c2414894c24488b4c2410894c24448b4c240c894c24408b4c2408894c243c8b4c2404894c24385983c418894c2418894424145b5883c408e910f4ffff8b4c24408b5c243c8b7424388b7c2434508b442434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b54242c895424688b54243089542464894c2460b9d8a37bb2894c245c895c245889742454897c24508944244c8b44241c894424488b442418894424448b442414894424408b4424108944243c8b44240c894424388b4424088b4c2434894424348b442404894424305883c41c8944240c8b5c24045883c40851e91b1e00008b4c24408b5c243c8b7424388b7c2434508b442434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b54242c895424688b54243089542464894c2460b9d8a37bb2894c245c895c245889742454897c24508944244c8b44241c894424488b442418894424448b442414894424408b4424108944243c8b44240c894424388b4424088b4c2434894424348b442404894424305883c41c8944240c8b5c24045883c40851e95e1d000083380d755e8b500883e20583fa01750a8b50048b12833a09756283390b75628b510c8b5a088b7304833e0375098b7e043b7c24387405833e05746b83380d756b8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4808894f048b5004eb05e97305000089178b5c24408b74243c8b5424388b442434eb0ae9d9030000e9530200008b4c2430578b7c2430578b7c2430578b7c2430578b7c2430578b7c243057eb0ae929010000e98e0000008b7c2430578b7c2430578b7c2430578b7c2428897c24648b7c242c897c2460895c245cbbd8a37bb2895c245889742454895424508944244c894c24488b44241c894424448b442418894424408b4424148944243c8b442410894424388b44240c894424348b4424088b4c2430894424308b4424048944242c5883c41c894424088b5c24045883c40451e9201c00008b7c24408b4c243c8b5424388b5c24348b742430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430897c2460894c245c89542458895c2454897424508b4c2418894c244c8b4c2414894c24488b4c2410894c24448b4c240c894c24408b4c2408894c243c8b4c2404894c24385983c418894c2418894424145b5883c408e9c2f0ffff833e05740e89c7b888a77bb28b5d049090ff1389c7ff76088b59048b460490e8661f00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d8c67bb28941048061ffbf6a016a01578d4424045089cb8b4424109090e8e6b6ffff8b442404909090e82a81ffff8b4c24508b54244c8b5c24488b7424448b7c2440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440894c24708954246c895c246889742464897c24608b4c2418894c245c8b4c2414894c24588b4c2410894c24548b4c240c894c24508b4c2408894c244c8b4c2404894c24485983c418894c2428894424248b5c24045883c41ce9bdefffff83380d75728b55008d52f43b55087303ff5520895500c742fc020000008b5808895a048b700489328b7c24408b4c243c8b7424388b4424348b5c2430528b542430528b542430528b542430528b542430528b542430528b542430528b542430528b542430528b542428895424648b54242c89542460eb05e96f000000897c245cbad8a37bb289542458894c2454897424508944244c895c24488b44241c894424448b442418894424408b4424148944243c8b442410894424388b44240c894424348b4424088b4c2430894424308b4424048944242c5883c41c894424088b5c24045883c40451e99a1900008b5424408b5c243c8b7424388b7c24348b4c2430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b44243089542460895c245c89742458897c2454894c24508b4c2418894c244c8b4c2414894c24488b4c2410894c24448b4c240c894c24408b4c2408894c243c8b4c2404894c24385983c418894c2418894424145b5883c408e93ceeffff83380d75728b55008d52f43b55087303ff5520895500c742fc020000008b5808895a048b700489328b7c24408b4c243c8b7424388b4424348b5c2430528b542430528b542430528b542430528b542430528b542430528b542430528b542430528b542430528b542428895424648b54242c89542460eb05e96f000000897c245cbad8a37bb289542458894c2454897424508944244c895c24488b44241c894424448b442418894424408b4424148944243c8b442410894424388b44240c894424348b4424088b4c2430894424308b4424048944242c5883c41c894424088b5c24045883c40451e9191800008b5424408b5c243c8b7424388b7c24348b4c2430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b44243089542460895c245c89742458897c2454894c24508b4c2418894c244c8b4c2414894c24488b4c2410894c24448b4c240c894c24408b4c2408894c243c8b4c2404894c24385983c418894c2418894424145b5883c408e9bbecffff83390b756383380b75638b510c8b5a088b7304833e0375098b7e043b7c243874178b780c8b57088b5a04833b0375148b73043b742438750bb80100000083c40cc234008b710c8b7e088b5704833a05756f8b590c8b73088b5604833a05741989c7b888a77bb2eb0ae97c050000e9770500008b5d0490ff1389c7ff72088b59048b420490e8fa1a00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70164c77bb28941048061ffbf6a016a01578d4424045089cb8b442410eb05e99d000000909090e872b2ffff8b4424508b4c244c8b5424488b5c24448b7424408b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c8944246c894c246889542464895c24608974245c8b442418894424588b442414894424548b442410894424508b44240c8944244c8b442408894424488b442404894424445883c41889442424897c24205b5883c414e959ebffff8b580c8b73088b5604833a0575738b480c8b79088b5f04833b05740eff7004b888a77bb28b5d0490ff13ff7004ff73088b43048b5c2404909090e8e21900008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f0c77bb28941048061ffbf6a016a0189e05089cb8b44240c90e866b1ffff8b4424508b4c244ceb05e9900000008b5424488b5c24448b7424408b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c8944246c894c246889542464895c24608974245c8b442418894424588b442414894424548b442410894424508b44240c8944244c8b442408894424488b442404894424445883c41889442424897c24205b83c40c5883c408e943eaffff8b780c8b5f088b5304833a0575718b480c8b71088b7e04833f057410ff7004b888a77bb28b5d04909090ff138b58048b47049090e8d21800008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7017cc87bb28941048061ffbf6a016a0189e05089cb8b47089090e856b0ffff8b4424488b4c24448b542440eb05e98c0000008b5c243c8b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24185b83c4045883c408e933e9ffff8b710c8b780c8b56088b5a04833b03751b8b57088b5a04833b0375108b76088b76048b76043b7304755aeb358b56088b5a04833b01755c8b57088b5a04833b0175648b76088b76048b760cf7c6010000007509f6430c017503ff55383b730c75648b40048b4904f6c101755ea801755fff7104ff7004ff742448ff742448ff742448eb05e964010000ff742448ff742448eb05e955010000ff742448ff742448ff742448eb05e942010000ff742448ff742448ff742448ff742448ff7424488b188b01eb0fe923010000e993000000e91a000000e85ae8ffff8b4c24045883c4043b650c7303ff5524e979ffffff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c08c97bb28b4c24088948088b542404895004c700010000008b5c24408b1bf6c301750bb80100000083c40cc234008b5d008d5bf83b5d087303ff5520895d00c743fc0100000089038b4424408918b80100000083c40cc2340083f80174708b45008d40ec3b45087303ff5520894500c740fc04000000c7400c08c97bb28b4c24088948088b542404895004c700010000008b5c24408b1bf6c301750bb80100000083c40cc234008b5d008d5bf83b5d087303ff5520895d00c743fc0100000089038b4424408918b801000000eb05e90600000083c40cc23400b80100000083c40cc234008b55008d52e83b55087303ff5520895500c742fc050000008b580c895a108b490c894a0c8942088b0c24894a04c702030000008b4c24408b09f6c101750bb80100000083c40cc234008b4d008d49f83b4d087303ff5520894d00c741fc0100000089118b542440890ab80100000083c40cc23400833909756183380b75618b500c8b5a088b7304833e0375098b7e043b7c24387469833e057569833e0574108b7804b888a77bb28b5d04909090ff138b7e088b58048b4604909090e84e1500008b4d008d49f43b4d087303ff5520894d00c741fc02000000eb0ae9a6050000e9a1050000c70130c97bb28941048061ffbf6a016a0189e05089cb89f8eb0ae9a5000000e9a0000000909090e8baacffff8b4424488b4c24448b5424408b5c243c8b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24185b83c4045883c408e99ee5ffff833e0375148b7e043b7c2438750bb80100000083c40cc23400833e057570833e0574108b7804b888a77bb28b5d04909090ff138b7e088b58048b4604909090e8221400008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701bcc97bb28941048061ffbf6a016a0189e05089cb89f8909090e8a6abffff8b4424488b4c24448b5424408b5c243ceb05e9880000008b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24185b83c4045883c408e983e4fffff640040174598b790450ff700c83ff017507b801000000eb578b04248b178b58088b7304833e03751b8b5a088b7304833e0375108b40088b40048b40043b46047548eb3f8b58088b7304833e01753b8b5a088b7304833e0175308b4008eb05e93d0000008b40048b400ca8017510eb05e925000000f6460c017503ff55383b460c7507b803000000eb108b7f043b650c7303ff5524e973ffffff83f8017411eb045052eb0bb80100000083c414c234008b410483f8017507b801000000eb2c8b108b5a088b7304833e0375108b7c243c3b7e047507b803000000eb0f8b780489f83b650c7303ff5524ebc883f80174208b45008d40f83b45087303ff5520894500c740fc010000008b4c24388908eb608b410483f8017507b801000000eb2c8b108b5a088b7304833e0375108b7c24343b7e047507b803000000eb0f8b780489f83b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24308908eb65e9340100008b410483f8017507b801000000eb2c8b108b5a088b7304833e0375108b7c242c3b7e047507b803000000eb0f8b780489f83b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24288908eb65e9cf0000008b410483f8017507b801000000eb2c8b108b5a088b7304833e0375108b7c24243b7e047507b803000000eb0f8b780489f83b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24208908eb65e96a0000008b490483f9017507b801000000eb2c8b018b50088b5a04833b0375108b74241c3b73047507b803000000eb0f8b710489f13b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24188908eb0ae905000000b801000000a801756b8b088b55008d52d03b55087303ff5520895500c742fc05000000c7421001000000894a0c8b19895a08c7420401000000c7020b0000008d7218c746fc050000008b3c24897e10894e0c8b7c2404897e08895604c706030000008b5424488b12f6c2017512b801000000eb05e93100000083c414c234008b55008d52f83b55087303ff5520895500c742fc0100000089328b7424488916b80100000083c414c234008b45008d40ec3b45087303ff5520894500c740fc04000000c7400c48ca7bb28b4c24048948088b4c2408894804c700010000008b4c24488b09f6c101750bb80100000083c414c234008b4d008d49f83b4d087303ff5520894d00c741fc0100000089018b4424488908b80100000083c414c2340083390b756683380975668b510c8b5a088b7304833e0375098b7e043b7c2438746d833e05756d833e05740f89c7b888a77bb28b5d04909090ff1389c7ff76088b59048b460490e83e0f00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70170ca7bb2eb0ae987040000e9820400008941048061ffbf6a016a01578d4424045089cb8b442410eb0ae9a1000000e99c0000009090e8a6a6ffff8b4424508b4c244c8b5424488b5c24448b7424408b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c8944246c894c246889542464895c24608974245c8b442418894424588b442414894424548b442410894424508b44240c8944244c8b442408894424488b442404894424445883c41889442424897c24205b5883c414e98ddffffff641040174598b780450ff710c83ff017507b901000000eb588b0c248b178b59088b7304833e03751b8b5a088b7304833e0375108b49088b49048b49043b4e047549eb408b59088b7304833e01753c8b5a088b7304833e0175318b4908eb05e93e0000008b49048b490cf6c1017510eb05e925000000f6460c017503ff55383b4e0c7507b903000000eb108b7f043b650c7303ff5524e972ffffff83f9017411eb045052eb0bb80100000083c414c234008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c243c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174208b45008d40f83b45087303ff5520894500c740fc010000008b4c24388908eb608b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c24343b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24308908eb65e9340100008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c242c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24288908eb65e9cf0000008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c24243b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24208908eb65e96a0000008b400483f8017507b801000000eb2c8b088b51088b5a04833b0375108b74241c3b73047507b803000000eb0f8b700489f03b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b4c24188908eb0ae905000000b801000000a801756b8b088b55008d52d03b55087303ff5520895500c742fc05000000c7421001000000894a0c8b19895a08c7420401000000c7020b0000008d7218c746fc05000000894e108b3c24897e0c8956088b542408895604c706030000008b5424488b12f6c2017512b801000000eb05e93100000083c414c234008b55008d52f83b55087303ff5520895500c742fc0100000089328b7424488916b80100000083c414c234008b45008d40ec3b45087303ff5520894500c740fc04000000c7400c48ca7bb28b4c24048948088b4c2408894804c700010000008b4c24488b09f6c101750bb80100000083c414c234008b4d008d49f83b4d087303ff5520894d00c741fc0100000089018b4424488908b80100000083c414c234008339097512833809750d89c2b8fcca7bb28b5d0490ff1383390b75678b510c8b5a088b7304833e0375098b7e043b7c2438746f833e05756f833e05740e89c7b888a77bb28b5d049090ff1389c7ff76088b59048b460490e8360a00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70154cb7bb28941048061ffbfeb05e9240100006a016a01578d4424045089cb8b442410909090e8aea1ffffeb0ae99a000000e9950000008b4424508b4c244c8b5424488b5c24448b7424408b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c578b7c243c8944246c894c246889542464895c24608974245c8b442418894424588b442414894424548b442410894424508b44240c8944244c8b442408894424488b442404894424445883c41889442424897c24205b5883c414e989daffff8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470ca4c57bb2894708894f04c707010000008b4424408b00a801750bb80100000083c40cc234008b45008d40f83b45087303ff5520894500c740fc0100000089388b7c24408907b80100000083c40cc2340083380b75668b500c8b5a088b7304833e0375098b7e043b7c2438746e833e05756e833e05740d8b7804b888a77bb28b5d04ff138b7e088b58048b4604909090e8a20800008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e0cb7bb28941048061ffbfeb05e93b0200006a016a0189e05089cb89f8e822a0ffff8b4424488b4c2444eb0ae995000000e9900000008b5424408b5c243c8b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24185b83c4045883c408e9fad8ffff833e0375148b7e043b7c2438750bb80100000083c40cc23400833e057570833e0574108b7804b888a77bb28b5d04909090ff138b7e088b58048b4604909090e87e0700008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7016ccc7bb28941048061ffbf6a016a0189e05089cb89f8909090e8029fffff8b4424488b4c24448b5424408b5c243ceb05e9880000008b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24185b83c4045883c408e9dfd7ffff8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470ca4c57bb2894f08894704c707010000008b4c24408b09f6c101750bb80100000083c40cc234008b4d008d49f83b4d087303ff5520894d00c741fc0100000089398b7c2440890fb80100000083c40cc23400833905756b833805756bff7008ff7108ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b58048b41049090e822d7ffff8b4424488b4c24448b5424408b5c243c8b7424388b7c2434578b7c2434eb0ae980000000e97b000000578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c243489442464894c24608954245c895c2458897424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c4188944241c897c24188b5c24045883c410e97ed6ffff8339037510833803750bb80100000083c40cc23400833907756d833807756d8b55008d52e83b55087303ff5520895500c742fc020000008b5908895a048b710489328d7a0cc747fc020000008b70088977048b4804890fff342450bbd8a37bb253ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244ceb0ae92b000000e926000000ff74244cff74244cff74244cff74244c89fb89d09090e8fe150000b80100000083c40cc234008b55008d52ec3b55087303ff5520895500c742fc04000000c7420ca4c57bb2894208894a04c702010000008b4424408b00a801750bb80100000083c40cc234008b45008d40f83b45087303ff5520894500c740fc0100000089108b4c24408901b80100000083c40cc2340000000000a82a0000|@6796,2097151,@297|18,1,@6447 30,1,@6447 94,0,0 110,0,0 126,0,0 216,0,0 331,0,@6716 440,1,@6717 539,0,@5413 548,0,@5413 572,0,@6716 634,1,@6763 651,0,@6716 714,1,@6717 802,0,@6716 904,1,@6717 934,1,@6775 970,0,@6777 990,0,0 1006,0,0 1068,0,0 1083,0,@5413 1093,0,@5413 1136,0,0 1151,0,0 1157,0,5 1189,0,@5413 1206,0,79992 1215,0,6 1234,0,4 1253,0,@6716 1314,1,@6717 1399,0,@6716 1504,1,@6717 1596,0,@6716 1705,1,@6717 1796,0,@6716 1905,1,@6717 1936,0,@6778 1956,0,0 1972,0,0 2015,0,0 2251,0,@6716 2360,1,@6717 2373,0,@6718 2394,1,@6721 2424,0,@6779 2450,1,@6564 2462,1,@6447 2699,0,@6716 2801,1,@6717 2814,0,@6718 2834,1,@6721 2864,0,@6780 2890,1,@6564 2902,1,@6447 3139,0,@6716 3241,1,@6717 3328,0,@6716 3430,1,@6717 3646,0,@6716 3748,1,@6717 3910,0,@6718 3934,1,@6721 3964,0,@6781 3994,1,@6564 4006,1,@6447 4292,0,@6716 4394,1,@6717 4677,0,@6716 4779,1,@6717 4990,0,0 5031,0,@6718 5066,1,@6721 5096,0,@6782 5134,1,@6564 5319,0,@6718 5346,1,@6721 5376,0,@6783 5402,1,@6564 5597,0,@6718 5618,1,@6721 5648,0,@6784 5674,1,@6564 6102,0,@6785 6122,0,0 6138,0,0 6181,0,0 6223,0,@6785 6243,0,0 6259,0,0 6302,0,0 6320,0,0 6377,0,1 6393,0,0 6436,0,0 6493,0,@6718 6518,1,@6721 6560,0,@6786 6598,1,@6564 6769,0,0 6793,0,@6718 6818,1,@6721 6848,0,@6787 6874,1,@6564 7056,0,0 7169,0,1 7203,0,0 7222,0,0 7251,0,1 7318,0,0 7347,0,1 7419,0,0 7448,0,1 7520,0,0 7549,0,1 7621,0,0 7650,0,1 7714,0,0 7751,0,0 7766,0,0 7772,0,5 7807,0,1 7823,0,0 7873,0,0 7910,0,@6788 7930,0,0 7946,0,0 7989,0,0 8045,0,@6718 8070,1,@6721 8100,0,@6789 8154,1,@6564 8326,0,0 8440,0,1 8474,0,0 8493,0,0 8522,0,1 8589,0,0 8618,0,1 8690,0,0 8719,0,1 8791,0,0 8820,0,1 8892,0,0 8921,0,1 8985,0,0 9022,0,0 9037,0,0 9043,0,5 9078,0,1 9094,0,0 9144,0,0 9181,0,@6788 9201,0,0 9217,0,0 9260,0,0 9283,0,@6790 9334,0,@6718 9358,1,@6721 9388,0,@6793 9426,1,@6564 9618,0,@6778 9630,0,0 9645,0,0 9688,0,0 9740,0,@6718 9762,1,@6721 9792,0,@6794 9822,1,@6564 10005,0,0 10029,0,@6718 10054,1,@6721 10084,0,@6795 10110,1,@6564 10300,0,@6778 10312,0,0 10328,0,0 10371,0,0 10637,0,0 10718,0,@6716 10794,1,@6763 10799,0,0 10836,0,@6778 10848,0,0 10863,0,0 10906,0,0 6716:O1|@6715 6717:D3,916|3b650c7303ff55248b088b0989da53505189d09090e8f265ffff83380b756d8b480c8b51088b5a04833b057564833b05740f8b7004b888a77bb28b5d049090ff138b7b088b73048b580489f090e8ae0300008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70180a87bb28941048061ffbf6a016a0189e05089cb89f8909090e8329bffffeb0ae916000000e9110000005a83c4043b650c7303ff5524e96affffff83380d75198b4c24048b50043b117407bb01000000eb0cbb03000000eb05bb010000008b0c2483390975465053ff74244cff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c244489c88b54247c9090ff12eb4e83390775475053ff74244cff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c244489c88b54247c909090ff12eb025053833c2401740bb80100000083c414c240008b44240c8b480483e10583f90174708b45008d40ec3b45087303ff5520894500c740fc04000000c7400c3ca97bb28b4c24508948088b542454895004c700010000008b5c244c8b1bf6c301750bb80100000083c414c240008b5d008d5bf83b5d087303ff5520895d00c743fc0100000089038b44244c8918b801000000eb05e90600000083c414c2400050ff742458ff742458ff7424588b5c2414b8010000009090e87203000083f80174708b45008d40ec3b45087303ff5520894500c740fc04000000c7400c7caf7bb28b4c24508948088b542454895004c700010000008b5c244c8b1bf6c301750bb80100000083c414c240008b5d008d5bf83b5d087303ff5520895d00c743fc0100000089038b44244c8918b801000000eb05e90600000083c414c240008b44240c8b480483e10983f901746568b0af7bb2bba4b27bb28b4424148b54244890ff1283f80375658b45008d40ec3b45087303ff5520894500c740fc04000000c7400c08b37bb28b4c24508948088b542454895004c700010000008b5c244c8b1bf6c30174278b5d008d5bf83b5d08730aeb05e915000000ff5520895d00c743fc0100000089038b44244c89188b44240c8b480483e10383f9017423b828b37bb290e8a60e000089c18b44241089ca9090ff1289c1b80100000089ca90ff128b44244c8b00a801750bb80100000083c414c240008b44240c8b008b4c24108908b80100000083c414c2400090900000000090030000|@6762,2097151,@280|22,1,@6447 54,0,@6718 78,1,@6721 108,0,@6723 134,1,@6564 184,0,0 191,0,1 198,0,0 365,0,0 417,0,@6725 437,0,0 453,0,0 496,0,0 531,0,0 538,1,@6726 574,0,@6734 594,0,0 610,0,0 653,0,0 686,0,@6735 691,0,@6740 738,0,@6743 758,0,0 828,0,@6744 834,1,@6751 853,0,0 873,0,0 896,0,0 6718:O4|@4608,@5398,@6720,@6719 6719:O5|@6454,1533,0,1533,0 6720:S35|6d616b654571756976616c656e743a204e6f74206120747970652066756e6374696f6e 6721:D3,116|3b650c7303ff5524a8017557f6c30175528b4d008d49f43b4d087303ff5520894d00c741fc020000008b138951048b308931518b530489d38b500489d0e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6722,31,@262|100,0,0 6722:S15|4c697374506169722e7a6970283229 6723:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@263|62,0,0 72,0,0 6724:S38|545950455f5452454528292e6d616b654571756976616c656e74283229676574417267283129 6725:S42|2843616e6e6f7420756e6966792077697468206578706c696369742074797065207661726961626c6529 6726:D3,992|3b650c7303ff552483f801756889d89090e86660ffff833807752d8b4c24108b54240c8b5c24088b742404894c24108954240c895c240889742404bb64ad7bb28b4004e9b40300008338057563ff7008ff742414ff742414ff742414ff7424148b5804b80100000090e892ffffff83f8017412eb05e953030000b80300000083c404c210008b4424148b4c24108b54240c8b5c240889442414894c24108954240c895c24085bb801000000e950ffffff83380b756b8b480c8b51088b5a04833b057562833b05740d8b7004b888a77bb28b5d04ff138b7b088b73048b580489f090e88afdffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701fcad7bb28941048061ffbf6a016a0189e05089cb89f8909090e80e95ffffeb0ae960000000e92e0000008b4424188b4c24148b5424108b5c240c89442418894c241489542410895c240c5b83c404b801000000e9a8feffff8b7424108b7c240c8b4c24088b54240489742410897c240c894c240889542404bb64ad7bb28b4004e99303000083380d75658b4c24108b5104c1ea0383ca01f6c201740783fa017d1feb06f642ff107417ff7004ff700889d3b88c6c7ab29090ff1588c75208eb0a8b58048b700889d053568b0c24c1e90383c901f6c101740783f9017d1feb06f641ff1074175089cbb88c6c7ab2eb05e9d1010000ff1588c75208eb0589c289c852a801740df604240174073b04247e0aeb05ff5538ebf48b04248b4c2404c1e90383c901f6c101740783f9017d1aeb06f641ff1074125089cbb88c6c7ab29090ff1588c75208eb0589c289c852a8017509f60424017503ff55383b042474668b44240883e00583f801745f8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c00af7bb28b4c24188948088b54241c895004c700010000008b5c24148b1bf6c301745c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008903eb0ae9d7000000e9080000008b4424148918eb6c8b44240883e00983f8017407b801000000eb05b80300000083f0028b4c240883e10383f901740cb901000000eb0ae997000000b90300000083f1028b55008d52f83b55087303ff5520895500c742fc01000040c702ec7d7ab2f6042401751a8b34248b1ef646ff107409eb05e959000000f7db8d5c1b01eb038b1c248d1cddf9ffffff83f8017507b801000000eb05b8090000000bc30bc18b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895104c7010d0000008b44240c8b0089028b44240c89088b44242083c40c8b0c243b08740bb80100000083c404c21000b80300000083c404c21000b801000000c21000b803000000c2100090909000000000dc030000|@6733,2097151,@267|18,1,@6447 60,0,@6727 68,1,@6728 100,0,0 123,0,1 167,0,0 204,0,@6718 226,1,@6721 256,0,@6730 282,1,@6564 335,0,0 377,0,@6727 385,1,@6731 434,0,@5215 442,0,I106 489,0,@5215 502,0,I106 570,0,@5215 578,0,I106 646,0,@6732 666,0,0 740,0,0 747,0,1 767,0,0 779,0,1 812,0,@5413 864,0,0 871,0,4 911,0,6 944,0,0 955,0,1 966,0,0 974,0,1 6727:O1|@6726 6728:D3,100|3b650c7303ff5524a801754553ff30ff742418ff742418ff742418ff7424188b4004909090e8d6ffffff598b5424148b5c24108b74240c8b7c240889542414895c24108974240c897c24088b59045aff22b801000000c210009090900000000060000000|@6729,1048575,@264|82,0,0 6729:S15|4c6973742e666f6c64722833292829 6730:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@265|62,0,0 72,0,0 6731:D3,100|3b650c7303ff5524a8017548ff3053ff742418ff742418ff742418ff7424188b4004909090e8d6ffffff8b4c24188b5424148b5c24108b74240c894c241889542414895c24108974240c8b5c24045a83c404ff22b801000000c210000000000060000000|@6729,1048575,@266|85,0,0 6732:S44|2854797065207661726961626c65206973206672656520696e20737572726f756e64696e672073636f706529 6733:S61|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296f6363757273436865636b4661696c73283229 6734:S44|2854797065207661726961626c6520746f20626520756e6966696564206f636375727320696e207479706529 6735:O1|@6736 6736:D3,412|3b650c7303ff55248b480483e10983f9017406b805000000c38b480483e10583f9017406b803000000c38b4804c1e90383c901f6c101740783f9017d1beb06f641ff1074135089cbb88c6c7ab2909090ff1588c75208eb0589c289c8528b0c248b510483e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2a80175108b30f640ff107402f7de8d743601eb0289c68d34f5f9ffffff83ce090bd68b45008d40f03b45087303ff5520894500c740fc03000000895008895804c7000d0000008b118b128b0983c4048901833a09755a538b4204909090e8b6000000a80175728378040175498b088b55008d52e83b55087303ff5520895500c742fc05000000c7421001000000894a0c8b19895a08c7420401000000c7020b0000008b34248916b80500000083c404c3e93f0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000eb05e90e0000008b04248908b80500000083c404c3b80300000083c404c38913b805000000c30000000098010000|@6739,2097151,@269|20,0,2 37,0,1 73,0,@5215 82,0,I106 108,0,0 115,0,1 148,0,@5413 218,0,6 246,1,@6737 289,0,0 304,0,0 310,0,5 320,0,2 362,0,4 379,0,2 388,0,1 399,0,2 6737:D3,160|3b650c7303ff5524a80175618b088b51088b5a04833b0575108b7004b808377bb28b5d04909090ff13833b01751c8b7308833e03750c8b7e048b3f83ff017446eb12837e0401750ceb3c8b73048b3683fe017432518b400490e8a2ffffff89c18b45008d40f43b4508730aeb05e91e000000ff5520894500c740fc02000000894804598908c38b700489f0e970ffffffb801000000c39090000000009c000000|@6738,63,@268|29,0,@6539 145,0,0 6738:S63|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b4571547628312966696c746572283129 6739:S54|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b45715476283129 6740:O1|@6741 6741:D3,16|b803000000c39090000000000c000000|@6742,1,@270|1,0,1 6742:S45|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229283129 6743:S24|28526571756972657320657175616c697479207479706529 6744:O1|@6745 6745:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70074b37bb28948048060ffbfc3000000002c000000|@6750,3,@273|28,0,@6746 6746:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@6749,2097151,@272|12,1,@6747 6747:D3,332|3b650c7303ff5524833b0d756b8b430883e00383f8017406b801000000c38b43048b008338097506b801000000c38b4b08c1e90383c901f6c101740783f9017d1feb06f641ff10741750ff7304ff730889cbb88c6c7ab290ff1588c75208eb0b89c289c852ff7304ff73088b0c2483e10983f901740eeb05e9c0000000b901000000eb05b90300000083f1028b142483e20583fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2a80175108b30f640ff107402f7de8d743601eb0289c68d34f5f9ffffff83f9017507b801000000eb05b8090000000bc683fa017507b901000000eb05b9050000000bc183c8038b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895904c7010d00000083c404588908588903b801000000c3b801000000c3900000000048010000|@6748,2097151,@271|25,0,0 41,0,0 83,0,@5215 90,0,I106 126,0,0 133,0,1 152,0,0 159,0,1 192,0,@5413 231,0,0 238,0,4 250,0,0 257,0,2 298,0,6 312,0,0 318,0,0 6748:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283229 6749:S60|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129283129 6750:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129 6751:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70010b67bb28948048060ffbfc3000000002c000000|@6761,3,@279|28,0,@6752 6752:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c7005cb67bb28948048b52048950088060ffbfc390900000000034000000|@6760,7,@278|28,0,@6753 6753:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e91c0000000000000020000000|@6759,2097151,@277|24,1,@6754 6754:D3,268|3b650c7303ff55245089d89090e84653ffff508b54240c90ff1289c18b44240489ca9090ff128b0c248b11bbcab67bb28d5c93fcffe3e94a000000909090e948000000909090e946000000909090e960000000909090e97d000000909090e97b000000909090e9030000009090908b49048b098b54240c8954240c89cb83c408e97bffffff83c408c2040083c408c20400ff7104ff7424108b59089090e85effffff8b4c2410894c24105b83c408e94dffffff8b54240c8954240c8b5c24088944240889d8bbb4b77bb289c68b410483c40856e95000000083c408c204008b54240c8954240c8b5c24088944240889d8bbb4b77bb289c68b410483c40856e981000000900000000008010000|@6758,2097151,@276|14,1,@6447 44,0,$6754+54 198,0,@6755 212,1,@6756 241,0,@6755 255,1,@6757 6755:O1|@6754 6756:D3,72|3b650c7303ff5524a801752a53ff30ff742410ff7424108b4004909090e8deffffff598b54240c8954240c8b59045a5e83c40456ff228b442404c208009090900000000044000000|@6729,1048575,@274| 6757:D3,72|3b650c7303ff5524a801752dff3053ff742410ff7424108b4004909090e8deffffff8b4c2410894c24108b5c24045a83c4045e83c40456ff228b442404c208000000000044000000|@6729,1048575,@275| 6758:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283229 6759:S34|545950455f5452454528292e666f6c6454797065283129666f6c6454283129283129 6760:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283129 6761:S23|545950455f5452454528292e666f6c6454797065283129 6762:S42|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229 6763:D3,964|8d7c24a43b7d0c7303ff55288b480483390175058b4908eb0f8b49048b093b650c7303ff5524ebe78b5304833a0175058b5208eb0f8b52048b123b650c7303ff5524ebe783f901746b83fa01746bbe010000008b38f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd9bf01000000528b13f6c201751ff7c701000000740583c7027105ff5538ebf68b52043b650c7303ff5524ebdc89faf7c6010000007514eb0ae916000000e90e000000f6c2017503ff55383bf27463eb0652eb6352eb658b55008d52ec3b55087303ff5520895500c742fc04000000c7420c1cbd7bb28b7424408972088b7c2444897a04c702010000008b7c24388b3ff7c70100000074318b7d008d7ff83b7d087303ff5520897d00c747fc01000000eb0fe919000000e914000000e90f00000089178b542438893aba01000000eb5f51ff7304ff7004ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742444ffb4248c000000ffb4248c000000518b1b8b00e85602000089c2eb0751ff7304ff7004837c240801746e837c240c01755d8b4424048338017507b801000000eb338b48048b09833903750c89c83b650c7303ff5524ebde8b48048b45008d40f83b45087303ff5520894500c740fc01000000890883f801750e89c1b84cc37bb28b5d049090ff138b008b0c2489088b44245083c410c24000837c240c0174668b04248338017507b801000000eb338b48048b09833903750c89c83b650c7303ff5524ebde8b48048b45008d40f83b45087303ff5520894500c740fc01000000890883f801750d89c1b84cc37bb28b5d0490ff138b008b4c240489088b44244c83c410c240008b04248338017507b801000000eb338b48048b09833903750c89c83b650c7303ff5524ebde8b48048b45008d40f83b45087303ff5520894500c740fc01000000890883f801750f89c1b84cc37bb28b5d04909090ff138b4c24048339017507b901000000eb338b59048b1b833b03750c89d93b650c7303ff5524ebde8b59048b4d008d49f83b4d087303ff5520894d00c741fc01000000891983f901750c8b18b84cc37bb28b5d04ff138b183b19744c89d68b3989f0e8120700008b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410801000000894104c70101000000890b8d4110c740fc02000000895804c70003000000890789f28b45008d40f03b45087303ff5520894500c740fc030000008b0c24894808895004c7000700000083c410c2400000000000c0030000|@6774,1048575,@283|79,0,0 125,0,0 237,0,@6764 257,0,0 325,0,0 418,1,@6765 457,0,0 522,0,@6769 566,0,0 631,0,@6769 668,0,0 733,0,@6769 755,0,0 820,0,@6769 842,1,@6773 873,0,0 882,0,0 903,0,1 946,0,3 6764:S28|28446966666572656e74206e756d626572206f66206669656c647329 6765:D3,1420|8d7c24883b7d0c7303ff5528a80175628b08f6c30175608b138b39f7c7010000007407be03000000eb068b378d743601ff30ff7304ff7004ff7204ff7104508b02a8017407bf03000000eb068b388d7c3f01f7c601000000750bf7c7010000007503ff55383bf7755c3b017452f60101eb0ae96f040000e9e2030000753ba8017537a8017407be03000000eb068b308d74360183c60889f78b315789c7ff318b4c2404d1e93bc9f3a68d7c3f018d7436018d4c09017513eb346a01ff31eb0b6a01ff31eb28e92f0000005350ff3389c38b44240cff15a8bd520883f8017507b803000000eb5db8ffffffffeb5bb80100000053ff32ff33eb628b39f7c7010000007407be03000000eb068b378d743601a8017407bf03000000eb068b388d7c3f01f7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c11b803000000eb0fe913000000e90e000000b8ffffffff6a01ff3153ff32ff3383f8017570ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424708b5c24508b44244c8b9424a800000090ff12ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474eb05e956000000ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff7424748b5c246c8b442468e8fefdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2428890883c42cc24800a801740783f8017d66eb06f640ff107463837c243c0174618b5c240cb8e0c27bb290e8024cfeffbbf0c27bb29090e8f64bfeff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b4424348941088b542438895104c701010000008b5c24708b1bf6c3017431eb0fe9b4000000e9af000000e92a0000008b5d008d5bf83b5d087303ff5520895d00c743fc01000000890b8b4c2470891983c4145883c414c24800ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff7424748b5c24508b4424689090e8d6fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2428890883c42cc24800837c24300174708b5c2404b8e0c27bb29090e8ea4afeffbbf0c27bb29090e8de4afeff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b4424348941088b542438895104c701010000008b5c24708b1bf6c30174278b5d008d5bf83b5d087303ff5520895d00c743fc01000000eb05e912000000890b8b4c2470891983c4085883c420c24800ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff7424748b5c246c8b44245ce8cafbffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c42cc24800837c241001746d508b19b8e0c27bb2e8e249feffbbf0c27bb29090e8d649feff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b44240c8941088b542410895104c701010000008b5c24488b1bf6c301742a8b5d008d5bf83b5d087303ff5520895d00c743fc01000000eb05e90a000000890b8b4c24488919eb015058c24800f6c301756a8b03837c2404017466538b18b8e0c27bb290e85249feffbbf0c27bb29090e84649feff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b44240c8941088b542410895104c701010000008b5c24488b1bf6c301742f8b5d008d5bf83b5d08730feb0ae921000000e917000000ff5520895d00c743fc01000000890b8b4c24488919eb015358c24800b801000000c24800900000000088050000|@6768,1048575,@281|36,0,1 70,0,1 135,0,1 214,0,I27 224,0,1 231,0,-1 238,0,0 260,0,1 277,0,1 317,0,1 334,0,-1 584,0,@6766 590,1,@4940 595,0,@6767 602,1,@4940 649,0,0 863,0,@6766 870,1,@4940 875,0,@6767 882,1,@4940 929,0,0 1129,0,@6766 1134,1,@4940 1139,0,@6767 1146,1,@4940 1193,0,0 1272,0,@6766 1278,1,@4940 1283,0,@6767 1290,1,@4940 1337,0,0 1404,0,0 6766:S7|284669656c6420 6767:S9|206d697373696e6729 6768:S64|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f7264732834296d617463684c6162656c6c6564283229 6769:O4|@4651,@6771,0,@6770 6770:O5|@6772,52,0,52,0 6771:S6|4f7074696f6e 6772:S18|2e2f62617369732f4f7074696f6e2e736d6c 6773:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@282|60,0,0 6774:S48|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f726473283429 6775:D3,248|3b650c7303ff5524a801755889d9ff305383f9017507b901000000eb598b5424048b198b72088b7e04833f03751b8b73088b7e04833f0375108b52088b52048b52043b57047549eb408b72088b7e04833f01753c8b73088b7e04833f0175318b5208eb05e97e0000008b52048b520cf6c2017510eb05e925000000f6470c017503ff55383b570c7507b903000000eb108b49043b650c7303ff5524e971ffffff83f90174348b1c248b40049090e84effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c408c38b1c248b400483c408e919ffffffb801000000c390909000000000f4000000|@6776,63,@284|23,0,0 138,0,1 232,0,0 6776:S47|545950455f5452454528292e756e69667954797065732832296d61746368283229696e746572736563742832292829 6777:S27|28496e636f6d70617469626c65206f7665726c6f6164696e677329 6778:S20|28496e636f6d70617469626c6520747970657329 6779:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@285|62,0,0 72,0,0 6780:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@286|62,0,0 72,0,0 6781:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@287|62,0,0 72,0,0 6782:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@288|62,0,0 72,0,0 6783:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@289|62,0,0 72,0,0 6784:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@290|62,0,0 72,0,0 6785:S32|28446966666572656e74206e756d62657273206f6620617267756d656e747329 6786:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@291|62,0,0 72,0,0 6787:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@292|62,0,0 72,0,0 6788:S29|28446966666572656e74207479706520636f6e7374727563746f727329 6789:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@293|62,0,0 72,0,0 6790:O4|@4608,@5398,@6792,@6791 6791:O5|@6454,2381,0,2381,0 6792:S36|556e696669636174696f6e3a204f7665726c6f61645365742f4f7665726c6f6164536574 6793:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@294|62,0,0 72,0,0 6794:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@295|62,0,0 72,0,0 6795:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@296|62,0,0 72,0,0 6796:S33|545950455f5452454528292e756e69667954797065732832296d61746368283229 6797:S25|545950455f5452454528292e756e6966795479706573283229 6798:D3,908|3b650c7303ff55245352909090e8923cffff833803750bb80300000083c408c20400833801750bb80300000083c408c20400833809750e89c1b8e8d07bb28b5d049090ff1383380775628b4004e89e030000b905000000a801755651ff7004ff7424148b5c24108b008b54240ce88effffff83f80575128b4c24045883c4043b650c7303ff5524ebce83f8017513b9010000005883c4043b650c7303ff5524ebb6b80300000083c410c20400e90800000089c883c408c2040083380b756c8b480c8b51088b5a04833b0375168b34248b7b043b7e14750bb80300000083c408c20400833b057571833b05740d8b7004b888a77bb28b5d04ff138b7b088b73048b580489f090e88ed9ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7019cd17bb2eb05e9bf0100008941048061ffbf6a016a0189e05089cb89f8e80e71ffff8b442414894424148b5c240c5883c404eb05e9090000005a83c404e99afeffff833b03750b8b34248b7b043b7e107430833b03750b8b34248b7b043b7e0c7420833b03750b8b34248b7b043b7e087410833b0375168b34248b7b043b7e04750bb80500000083c408c20400833b05750f8b7004b808377bb28b5d049090ff13833b01751c8b7308833e03750c8b7e048b3f83ff01745ceb12837e0401750ceb628b73048b3683fe01745d8b7004bf05000000f7c601000000756757ff7604ff7424148b5c24108b068b54240c909090e8e6fdffff83f80575128b7c24045e83c4043b650c7303ff5524ebc783f8017526eb05e932000000bf010000005e83c404eb0ae922000000e91d0000003b650c7303ff5524eb9cb80300000083c410c2040089f883c408c20400ff70048b41088b542408909090ff1283f803750bb80300000083c40cc204008b0c24f6c101755250ff7104ff7424188b5c24148b018b54241090e852fdffff83f80575128b4424045983c4043b650c7303ff5524ebcc83f8017513b8010000005983c4043b650c7303ff5524ebb4b80300000083c414c2040083c40cc20400833805750bb80300000083c408c204008b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b5804891983e20983fa01740bb80500000083c408c204008b1b833b0775365389c88b5424109090ff1283f803750bb80300000083c40cc204008b442410894424108b5c24088b042483c4045a83c404e98ffcffff8b44240c89c289c883c4085983c40451ff22900000000088030000|@6804,2097151,@301|14,1,@6447 24,0,1 40,0,1 58,0,@6799 78,1,@6802 83,0,2 143,0,0 162,0,1 216,0,1 240,0,@6718 262,1,@6721 292,0,@6803 322,1,@6564 423,0,2 442,0,@6539 500,0,2 574,0,0 605,0,1 644,0,1 715,0,0 734,0,1 756,0,1 810,0,2 844,0,1 6799:O4|@4608,@5398,@6801,@6800 6800:O5|@6454,1664,0,1664,0 6801:S28|657175616c697479202d204f7665726c6f616473657420666f756e64 6802:D3,80|3b650c7303ff5524a80175338b08ff71048b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@299|64,0,0 6803:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@300|62,0,0 72,0,0 6804:S23|545950455f5452454528292e657175616c697479283329 6805:D3,1776|3b650c7303ff55248b4c24088b55008d52f43b55087303ff5520895500c742fc020000008b71048972048b39893af6c301740783fb017f10eb06f643ff107408b868977ab2c208008378040375715253ff700cff7010ff30bb03000000b84cd97bb2909090e8a606000089c3b801000000e8465dffff5350ff742410ff74241c8b5c24148b442410ba94477bb2e8ee74ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9680000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c20800f640040175715253ff700cff7010ff30bb03000000b84cdc7bb2909090e8c205000089c3b801000000e8625cffff5350ff742410ff74241c8b5c24148b442410ba94477bb2e80a74ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9680000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c2080083780401756b8b7810f7c70100000075328b0f833901751c8b75008d76f83b75087303ff5520897500c746fc01000000890eeb148b4f0489cf3b650c7303ff5524ebc6be01000000f7c601000000756c8b0e83390175658b7d008d7ff43b7d087303ff5520897d00c747fc02000000eb05e99e0200008b7104897704c70701000000f7c701000000740fff700cff30b8ecd57ab28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008939eb05b9010000008b75008d76f43b75087303ff5520897500c746fc020000008b38897e04c70607000000f7c601000000740d8b780cb8ecd57ab28b5d04ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc05000000897e10894e0cc7460801000000c7460401000000c70601000000f7c601000000740f8b480cb8ecd57ab28b5d049090ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089318d710cc746fc02000000894e04c7069c9a7ab28d4e0cc741fc02000000897104c70160dc7bb28d710cc746fc05000000894e10c7460c01000000c7460801000000c7460401000000c70601000000f7c601000000740d8b480cb8ecd57ab28b5d04ff13ff700c5253568b44240c9090e8aa33ffff833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b901000000f6c10175738b19b8010000009090e88659ffff50ff74240cff74241c89d88b5c2410ba94477bb2909090e82e71ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c70138457bb2eb05e9150000008d410cc740fc02000000894804c70090dc7bb2eb05b8010000008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c208008b7808833f03752e8b4f04833905751f8b75008d76f83b75087303ff5520897500c746fc010000008b7904893eeb0cbe01000000eb05be01000000f7c60100000075725253ff700cff36ff7010ff30bb01000000b84cd97bb2e88e01000050ff74240c8b5c240c8b4424089090e8c20400008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104f4e17ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104eb05e9080000005883c4048901eb3d5253ff700cff7010ff30bb03000000b84cd97bb2909090e80e0100008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189cbb801000000909090e88a57ffff5350ff742410ff74241c8b5c24148b442410ba94477bb2e8326fffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab283f80175058b0424eb0a89c38b0424e892850a0089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c410c208009000000000ec060000|@11985,2097151,@2206|65,0,@5578 89,0,1 94,0,@6806 102,1,@6807 109,0,0 114,1,@6511 137,0,@6596 142,1,@6597 173,0,0 203,0,@5592 256,0,0 263,0,0 270,0,3 276,0,0 287,0,@6321 317,0,1 322,0,@6809 330,1,@6807 337,0,0 342,1,@6511 365,0,@6596 370,1,@6597 401,0,0 431,0,@5592 484,0,0 491,0,0 498,0,3 504,0,0 515,0,@6321 596,0,0 654,0,0 672,0,@6321 708,0,0 717,0,0 752,0,3 768,0,@6321 804,0,0 829,0,0 836,0,0 842,0,0 858,0,@6321 896,0,0 917,0,@5592 936,0,@6810 956,0,0 963,0,0 970,0,0 976,0,0 992,0,@6321 1014,1,@6447 1055,0,0 1067,0,0 1074,1,@6511 1094,0,@6596 1102,1,@6597 1133,0,0 1154,0,@6812 1173,0,@6587 1199,0,@6813 1206,0,0 1273,0,0 1280,0,0 1287,0,0 1293,0,0 1304,0,@6321 1364,0,0 1371,0,0 1396,0,0 1401,0,@6806 1406,1,@6807 1426,1,@6814 1457,0,@6361 1478,0,@5592 1521,0,1 1526,0,@6806 1534,1,@6807 1565,0,0 1574,0,0 1582,1,@6511 1605,0,@6596 1610,1,@6597 1641,0,0 1662,0,@5592 1682,1,@11984 1718,0,0 1725,0,0 1732,0,3 1738,0,0 1749,0,@6321 6806:S3|76616c 6807:D3,688|6a016a0183fb01741389e1c7010100000089e1c7410475000000eb1189e1c7010300000089e1c741047b0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740ab8ecd57ab28b5d04ff138b442410a80175328b10833a01751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b500489d03b650c7303ff5524ebcabb01000000f6c301755f8b0383380175588b55008d52f43b55087303ff5520895500c742fc020000008b7004897204c70201000000f6c201740cb8ecd57ab28b5d049090ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008917eb05bf010000008b45008d40f43b45087303ff5520894500c740fc020000008b54240c895004c70007000000a801740f89c3b8ecd57ab28b5d04909090ff138b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc0500000089581089780cc7400801000000c7400401000000c70001000000a801740f89c3b8ecd57ab28b5d04909090ff138b5d008d5bf03b5d087303ff5520895d00c743fc03000000c74308010000005e897304c70303000000f6c301740e89c6b8ecd57ab28b5d049090ff138b75008d76f43b75087303ff5520897500c746fc020000005f897e04c70607000000f7c601000000740e89c7b8ecd57ab28b5d049090ff138b7d008d7fac3b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc02000000897e04891e8d5e0cc743fc0200000089730489038d430cc740fc02000000895804c7009c9a7ab28d580cc743fc02000000894304890b8d430cc740fc05000000895810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c2080000000000ac020000|@6808,63,@302|13,0,0 22,0,58 32,0,1 41,0,61 74,0,3 84,0,@6321 152,0,0 200,0,0 210,0,@6321 248,0,0 257,0,0 294,0,3 305,0,@6321 344,0,0 369,0,0 376,0,0 382,0,0 393,0,@6321 432,0,0 442,0,1 454,0,@6321 495,0,3 510,0,@6321 548,0,0 599,0,@5592 634,0,0 641,0,0 648,0,0 654,0,0 665,0,@6321 6808:S38|56414c55455f4f505328292e646973706c617956616c75657328342976616c50617274283229 6809:S11|636f6e7374727563746f72 6810:O2|3,@6811 6811:S9|657863657074696f6e 6812:O3|1,1,3 6813:O3|1,1,1 6814:D3,764|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000c702b0df7bb2894a048062ffbf8b75008d76d83b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc04000000c7470cd8707ab2895708c7470428e07bb289378d5714c742fc02000000c7420401000000893a6a016a0151565253508d7c241457bb60e17bb28b442408909090e85262ffff8b442418909090e86e040000909090e8ca040000ff342468d0e27bb2909090e8de050000ff7424108d4c240451bb28e07bb2bab8e37bb2e85e06000050ff742414bb28e07bb28b442414baec3f7cb2e8626200008b4d008d49d83b4d087303ff5520894d00c741fc03000000c74108010000008b54242c895104c701050000008d5910c743fc02000000c7430401000000890b8d4b0cc741fc020000008959045b83c41089198b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7430801000000894b04c7031d000000f6c101751d8b31833e05750f8b710489f13b650c7303ff5524ebe5b901000000eb05b90300000083f901740c5089d89090e85e3b0000eb0589c189d8518b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e81a1d00008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c70107000000f6042401740db8d0717cb28b5d04909090ff1383c404588b0089cbe84e930000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f801742689d98b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08894304c703150000005883c4088b005089d8bb01000000ba7c727cb2e84693000089c1b80100000089ca90ff12833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b90100000083f901750db84cc37bb28b5d04909090ff138b01c20400909000000000f8020000|@11983,2097151,@2204|34,0,0 50,0,@6815 87,0,0 104,0,@5279 114,0,@6817 133,0,0 154,0,@6827 166,1,@6564 178,1,@6830 186,1,@6831 194,0,@6832 202,1,@6834 216,0,@6817 221,0,@6835 226,1,@6837 236,0,@6817 245,0,@7206 250,1,@7207 281,0,0 294,0,2 311,0,0 363,0,0 372,0,14 404,0,0 411,0,1 426,1,@6933 464,0,0 474,1,@6881 505,0,1 518,0,3 529,0,@7307 550,1,@7310 555,0,0 650,0,10 664,0,0 669,0,@7311 674,1,@7312 681,0,0 727,0,0 737,0,@6769 6815:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@6816,15,@303| 6816:S41|56414c55455f4f505328292e7072696e7456616c7565466f72547970652833296d6b41646472283129 6817:O3|0,@6818,@4655 6818:O1|@6819 6819:D3,100|83780401750683780801740d8b08b8b8e07bb28b5d0490ff138b08f6c101740783f9017c08eb12f641ff10740cb8f8e07bb28b5d049090ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c3900000000060000000|@6826,3,@304|15,0,@6820 46,0,@6823 86,0,2 6820:O4|@4608,@5398,@6822,@6821 6821:O5|@5400,90,0,90,0 6822:S12|626f74746f6d206c6576656c 6823:O4|@4608,@5398,@6825,@6824 6824:O5|@5400,87,0,87,0 6825:S14|6c6f61643a206e65676174697665 6826:S25|434f44455452454528292e626f74746f6d4c6576656c283129 6827:O1|@6828 6828:D3,16|b801000000c39090000000000c000000|@6829,1,@305|1,0,0 6829:S46|56414c55455f4f505328292e7072696e7456616c7565466f725479706528332964756d6d7954797065732d283129 6830:D3,80|3b650c7303ff5524a80175338b08ff71048b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@306|64,0,0 6831:D3,148|3b650c7303ff5524a80175718b088b510483e20983fa017407ba01000000eb05ba0300000083f2028b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7430801000000895304c7033cbe7ab2538b480489c8909090e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e904000000598908c3b801000000c30000000090000000|@6329,15,@307|26,0,0 33,0,1 67,0,0 76,0,@6000 135,0,0 6832:D3,52|8b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b5204895004c70005000000c30000000030000000|@6833,5,@308|27,0,0 39,0,2 6833:S44|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329706f6c79436f64652d283129 6834:D3,88|3b650c7303ff5524a801753d8b0883790401742b518b400490e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b7ffffffb801000000c3900000000054000000|@5094,3,@309|74,0,0 6835:O7|@6837,@6997,@7102,@7190,@7203,@7206,@6836 6836:O2|7,@7306 6837:D3,152|3b650c7303ff552483f80175118b44240489c189d889ca5983c40851ff2253525089d88b54241090ff128b4c240450ff7108ff710cff742414ff742424ff7110ff7114ff71188b59048b442420e85a000000909090e85a17000089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000005a83c40c895008894804c70007000000c2080090900000000094000000|@6996,2097151,@361|78,1,@6838 86,1,@6881 119,0,1 135,0,3 6838:D3,168|3b650c7303ff5524a801756d8b0853ff7004ff710853ff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b59048b019090e87e00000050ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b4424209090e896ffffff89c18b45008d40f43b4508730aeb05e919000000ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c009000000000a4000000|@6329,2097151,@360|58,1,@6839 152,0,0 6839:D3,1096|3b650c7303ff552483fb017507837c242401746c83fb0174235068a8e97bb2ff742418ff74242cff74242cff74242c8b5c242c9090e87a0c0000eb0789c18b44240c515068b4287cb2ff74241cff742430ff742430ff7424308b5c24308b442418e8562e0000837c242c01741f50ff74241c8b5c24248b44240c8b542418eb05e90b010000909090ff12eb0789c18b44240c515068b4287cb2ff742424ff742438ff742438ff7424388b5c24388b442420e8323a00008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948048b4c240489088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c85983c42451e9d532000089c8c2240050ff742424ff742424ff74242489c38b4424209090e81a1b000083f801756eff742414ff742428ff742428ff742428bb030000008b44241090e842430000b9010000008b542414f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c1017408a80174042bc87105ff5538ebf783c1016a016a016a018b442420a8017416eb05e90902000089c2b8bc7e7ab28b5d04909090ff1383f901751a8b0889e28b19891a89e28b710489720489e28b7908897a08eb1cf6c101740583e9027105ff5538ebf68b40043b650c7303ff5524ebab687c2e7cb2ff742424ff742438ff742438ff7424388b5c24188b442420e82e2c0000506820307cb2ff742428ff74243cff74243cff74243c8b5c241c8b44242490e8363800008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49d83b4d087303ff5520894d00c741fc020000008941048b44241489018d510cc742fc02000000894a048b4c241c890a8d5a0cc743fc03000000c7430801000000895304c7031d000000f6c201740a89d890e822310000eb0289d850b8030000008b54240cff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52e43b55087303ff5520895500c742fc03000000894a088942048b4c240c890a8b0c248b098d5a10c743fc02000000894b0489135989198b4c24205a83c4048b19f6c3017409f6020174042b1a7105ff5538ebf783c30189c28b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089580489108b51049090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000900000083c404c224008b008b4c24188b1089c883c4045b83c42453ff22900000000044040000|@6995,2097151,@359|27,0,@6840 54,1,@6869 69,0,@6978 98,1,@6928 149,0,@6978 178,1,@6956 209,0,0 327,0,0 336,0,14 367,0,0 374,0,1 391,1,@6933 422,1,@6896 448,0,1 458,1,@6982 463,0,0 549,0,@5417 621,0,@6987 650,1,@6928 656,0,@6991 686,1,@6956 717,0,0 804,0,0 813,0,14 826,1,@6933 836,0,1 880,0,0 886,0,1 1010,0,0 1057,0,4 6840:O1|@6841 6841:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@6868,1048575,@313|16,1,@6842 6842:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9e900000089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@312|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 6843:D3,816|3b650c7303ff552483380575648b4808f6c10175358b11813a3ce239b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be01000000f7c60100000075668b0e81393ce239b274188b50048b7808b854eb7ab28b5d04eb05e9c501000090ff138b510889dff6c2017412ff7004ff7008b8bc7e7ab28b5d049090ff1383ff0175048b12eb24f7c701000000740583ef027105ff5538ebf68b52043b650c7303ff5524ebc1ba010000008b4808f6c10175338b31813e44e239b2751a813e44e239b2740d8b7804b854eb7ab28b5d04ff138b7e08eb148b710489f13b650c7303ff5524ebc8bfec7d7ab2833f05755489d88b5708ff128b08833901740c89c2b844ee7bb28b5d04ff138b71048b58048b4108909090e8a202000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c20400f6400401755df6400401740e8b4804b8ecd57ab28b5d0490ff138b70040fb64eff8d4c090183e10783f9017541f7c601000000740db8ecd57ab28b5d04909090ff13b9ffffff00234efc8d4c0901f6c30175158b3bf643ff107402f7df8d7c3f01eb07e90600000089df3bcf771c837c240401750db8b8ef7bb28b5d04909090ff13b810f07bb2c20400f7c601000000740cb8ecd57ab28b5d049090ff13f6c30175108b0bf643ff107402f7d98d4c0901eb0289d98b4c4efe8b45008d40f03b45087303ff5520894500c740fc03000000895008894804c70005000000c2040083381d75698b48083b4c240474108b4804b86cf07bb28b5d04909090ff13ba010000008b7004f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdcf6c3017409f6c20174043bdaeb05ff5538ebf77d418b5004f6c2017413b8bc7e7ab2eb05e9470000008b5d049090ff1383fb0175058b02c20400f6c301740583eb027105ff5538ebf68b52043b650c7303ff5524ebc2837c240401750bb8ccf07bb28b5d0490ff13b810f07bb2c2040089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c895808894804c7000d000000c20400909090000000002c030000|@6862,1048575,@311|25,0,@4606 75,0,0 91,0,@4606 104,0,@6377 138,0,@5417 190,0,0 206,0,@4607 214,0,@4607 224,0,@6377 254,0,@5413 280,0,@6844 302,1,@6848 340,0,2 363,0,@6321 401,0,@6321 414,0,8388607 465,0,@6850 478,0,@6853 494,0,@6321 564,0,2 589,0,@6857 602,0,0 675,0,@5417 739,0,@6860 750,0,@6853 798,0,6 6844:O4|@4608,@5398,@6846,@6845 6845:O5|@6847,309,0,309,0 6846:S30|66696e64456e747279496e426c6f636b3a206e6f7420636f6e7374616e74 6847:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f46554e4354494f4e532e736d6c 6848:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@310|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 6849:S35|434f4445545245455f46554e4354494f4e5328292e736574496e6c696e652832292829 6850:O4|@4608,@5398,@6852,@6851 6851:O5|@6847,323,0,323,0 6852:S33|66696e64456e747279496e426c6f636b3a20696e76616c69642061646472657373 6853:O2|11,@6854 6854:O3|2,@6855,0 6855:O4|@4608,@5398,@6856,0 6856:S36|496e76616c6964206c6f616420656e636f756e746572656420696e20636f6d70696c6572 6857:O4|@4608,@5398,@6859,@6858 6858:O5|@6847,281,0,281,0 6859:S41|66696e64456e747279496e426c6f636b3a207475706c652f6461746174797065206d69736d61746368 6860:O4|@4608,@5398,@6852,@6861 6861:O5|@6847,288,0,288,0 6862:S40|434f4445545245455f46554e4354494f4e5328292e66696e64456e747279496e426c6f636b283329 6863:O4|@4608,@5398,@6865,@6864 6864:O5|@6866,83,0,83,0 6865:S9|4e6f20616363657373 6866:S34|6d6c736f757263652f4d4c436f6d70696c65722f545950454944434f44452e736d6c 6867:S28|545950454944434f444528292e636f64654163636573732832292829 6868:S62|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296571436f64652d283129 6869:D3,1020|3b650c7303ff55248338077573f6400401753d8b48048379040175348b118b7424148b7c24108b44240c8b4c2408538b5c240889742418897c241489442410894c240c895c24085b8b4204e9b0ffffff8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c70210f67bb2eb05e944010000894a048b73048972088062ffbf8b3bf7c701000000740583c7027105ff5538ebf68b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08895304893b51ba14fa7bb252ff742414ff742414ff74241453ff74242cff74242cbb010000008b4004909090e82a070000598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e80a090000909090e8820900005053bb7cfd7bb2b805000000909090e8ae44ffff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104d4fd7bb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c2140083380b756b8b480c8b51088b7204833e057562833e0574108b7804b888a77bb28b5d04909090ff1389dfff76088b58048b460490e8deb3ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e8fd7bb28941048061ffbf6a016a01578d4424045089cb8b442410eb0ae982000000e9390000009090e8524bffff8b4424248b4c24208b54241c8b5c24188b74241489442424894c24208954241c895c2418897424145b5883c408e984fdffff8b7c240c8b4c24088b5424048b742410538b5c2418897c2418894c2414895424108974240c59894c2404b914fa7bb28b1424890c24538b58048b480c89c852e9b409000083380d740c89c1b8ec277cb28b5d04ff138b48048b09833903757053ff742410ff742410ff74241089c38b442420909090e81a0d000083f801750e89c1b838287cb28b5d049090ff138b008b085889caff128338057518b901000000894c2414bb010000005983c41051e9d1f5ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000eb05e91a000000c7400c01000000c7400801000000894804c7000d000000c21400833909755353bb01000000baa80b7cb2909090e8561600008b4c24108b54240c8b5c24088b7424148b7c2418894c241889542414895c24108974240c59894c2404b914fa7bb28b1424890c2457bb0100000052e9b20800008b4424148b5424108b74240c8b7c2408538b5c2408894424188954241489742410897c240c895c24085b89c8e90dfcffff9000000000f8030000|@6977,2097151,@349|106,0,0 122,0,@6870 200,0,@6879 227,0,0 238,1,@6880 246,0,0 314,1,@6883 322,1,@6884 329,0,@6888 334,0,2 342,1,@6547 373,0,1 380,0,0 387,0,1 404,0,0 411,0,@6891 450,0,7 485,0,@6718 510,1,@6721 540,0,@6892 582,1,@6564 679,0,@6879 700,1,@6893 712,0,@6971 754,1,@6896 766,0,@6974 792,0,0 801,0,0 811,1,@6843 851,0,0 858,0,0 867,0,6 881,0,0 886,0,@6907 894,1,@6908 940,0,@6879 952,0,0 958,1,@6893 6870:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9fc0000008378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@315|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 6871:O4|@4608,@5398,@6873,@6872 6872:O5|@5400,104,0,104,0 6873:S34|6d6b4c6f61643a206c6576656c206d757374206265206e6f6e2d6e65676174697665 6874:D3,484|8b0bf6c101754a8b113b0274498b32833e01752083380175538b7e04f7c7010000007509f64004017503ff55383b78047451eb54833e03752c833803754f8b7e04f7c7010000007515f6400401750feb0ae98b000000e951000000ff55383b7804755ceb47833e057538eb05e95e00000083380575598b7e04f7c701000000751aeb0fe924000000e942000000e93d000000f64004017503ff55383b7804740ceb2d833e07752883380775238b75008d76f83b75087303ff5520897500eb05e90b000000c746fc010000008916eb178b790489f93b650c7303ff5524e921ffffffbe010000008b0b83fe01756af6c101756a8b118b7204f7c601000000740583c6027105ff5538ebf68b7d008d7fe83b7d087303ff5520897d00c747fc0200000089770489078d470cc740fc02000000894804893889038b4204a801740583c0027105ff5538ebf689c38b45008d40f43b4508730feb0ae958000000e917000000ff5520894500c740fc02000000895804c70003000000c38b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000c740040100000089088903b8e4707ab2c38b368b45008d40f43b45087303ff5520894500c740fc020000008b7604897004c70003000000c39000000000e0010000|@6875,63,@314|226,0,0 371,0,1 403,0,0 422,0,0 431,0,@5280 470,0,1 6875:S36|434f4445545245455f46554e4354494f4e5328292e616464546f436c6f73757265283229 6876:O4|@4608,@5398,@6825,@6877 6877:O5|@5400,101,0,101,0 6878:S34|434f44455452454528292e6e65774c6576656c283129746869734c6576656c283129 6879:O1|@6869 6880:D3,360|3b650c7303ff5524a80175728b08ff700453ff742410ff742410ff742428ff742428ff7424288b5c24288b41048b542438909090ff128b4d008d49c03b4d087303ff5520894d00c741fc04000000c7410c010000008b1424895108c74104cc707ab2c7010d0000008d5914c743fc04000000c7430c01000000895308eb05e9d3000000c74304ac757ab2c7030d0000008d7314c746fc02000000c7460401000000891e8d5e0cc743fc02000000897304890b89c689d8909090e8be0000008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c7010700000058a801740583c0027105ff5538ebf651ff742424ff742424ff742424ff742424ff742424ff742424ff74242489c38b4424209090e8defeffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400cc4757ab28948085983c404894804c70003000000c21c00b8f0707ab2c21c0090900000000064010000|@6882,1048575,@317|81,0,0 94,0,@5278 100,0,6 117,0,0 134,0,@5346 140,0,6 157,0,0 186,1,@6881 217,0,1 229,0,3 319,0,@5348 335,0,1 343,0,@5281 6881:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@316|39,0,1 92,0,0 6882:S39|545950454944434f444528292e6d616b654571283429636f6d62696e65456e7472696573283229 6883:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70109000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@318|43,0,4 92,0,0 6884:D3,96|3b650c7303ff5524a80175438b08833909740e8b5004b83cfd7bb28b5d0490ff13ff71048b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@319|23,0,@6885 80,0,0 6885:O4|@4608,@5398,@6887,@6886 6886:O5|@5400,79,0,79,0 6887:S9|646545787472616374 6888:O1|@6889 6889:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@320|1,0,@5280 6890:S33|434f44455452454528292e6d6b53696d706c6546756e6374696f6e283629283129 6891:S10|65717b2e2e2e7d283229 6892:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@321|62,0,0 72,0,0 6893:D3,316|3b650c7303ff55248b48088b5104833a037509817a0404e439b2742a833a037509817a043ce539b2741c833a037509817a044ce539b2740e833a037511817a0444e539b27508b86c757ab2c21c008b45008d40f03b45087303ff5520894500c740fc030000008b74240c8970088958048908538b54240890ff1283380575116a01bb01000000909090e8feebffffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d000000f6042401740683c404c21c0050ff742420ff742420ff742420ff742420ff742420ff7424208b5c243c8b44241c909090e85a000000909090e826fcffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000005a895008894804c7000700000083c404c21c0090900000000038010000|@6970,2097151,@348|22,0,@4623 36,0,@4652 50,0,@4654 64,0,@4653 71,0,@5341 130,0,0 138,1,@6843 173,0,0 180,0,0 189,0,6 242,1,@6894 250,1,@6881 283,0,1 296,0,3 6894:D3,152|3b650c7303ff5524a801757153ff7004ff742420ff742420ff742420ff742420ff742420ff7424208b00909090e87a00000050ff742424ff742424ff742424ff742424ff742424ff7424248b5c24208b44241c9090e8a6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c408eb05e9050000008908c21800b801000000c21800900000000094000000|@6329,2097151,@347|46,1,@6895 136,0,0 6895:D3,396|3b650c7303ff552483380d75458b48048b09833903753b53ff74241cff74241c89c38b44241c909090e87201000083f801750e89c1b8cc137cb28b5d049090ff138b008b4c240c8b1089c85b83c41853ff225350ff74240cff74241c53ff74242cff74242c8b5c24288b542424909090ff1250ff742410ff742420ff742410ff742430ff7424308b5c242c8b4424189090e80213000050ff742414ff742424ff742414ff742434ff7424348b5c24308b44241c9090e80a1f00008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701c4757ab28d410cc740fc020000008948045983c40889088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c85983c41851e9be17000089c8c21800900000000088010000|@6969,2097151,@346|42,1,@6896 54,0,@6925 146,1,@6928 182,1,@6956 213,0,0 264,0,@5348 314,0,0 323,0,14 354,0,0 361,0,1 378,1,@6933 6896:D3,832|3b650c7303ff5524833b0575598b45008d40f43b45087303ff5520894500c740fc02000000c70064057cb28b4c240c8948048060ffbf8b55008d52ec3b55087303ff5520895500c742fc02000000c74204ffffffff89028d420cc740fc010000008910c20c00833b0b756e8b4b0c8b51088b7204833e057565833e05740f89c7b888a77bb28b5d04909090ff1389c7ff76088b430489c38b4604909090e82ea5ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701bc057cb28941048061ffbf6a016a01578d4424045089cb8b442410eb0ae960010000e92c0000009090e8a23cffff8b44241c8b4c24188b5424148944241c894c2418895424148b5c24045883c40ce9f1fefffff643040174588b7c240850f7c701000000755a8b078b088b530c8b71088b4604833803751b8b42088b7004833e0375108b49088b49048b49043b4e047560eb408b41088b7004833e0175538b42088b7004833e0175488b49088b4904eb05e9c20000008b490cf6c1017510eb05e93c000000f6460c017503ff55383b4e0c751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b3f8939eb158b7f043b650c7303ff5524e95dffffffb90100000083f90175108b042483c4045983c40c51e9610200008b098b45008d40f43b45087303ff5520894500c740fc02000000c700880b7cb28b49048948048060ffbf8b4d008d49ec3b4d087303ff5520894d00c741fc02000000c74104ffffffff89018d410cc740fc01000000890883c404c20c005f83c40c57e9fa010000833b0d756f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b53088951048b730489318b36833e0975705089d9bb0100000089c8baa80b7cb290e8460700008b4d008d49e83b4d087303ff5520894d00c741fc05000000c741100100000089410c8b00894108c7410401000000eb05e975000000c7010b0000008b4424108b54240c8b5c2408894424108954240c895c240889cb58e923fdffff833e03752bff74240489cb90e8820c000089c18b45008d40f83b45087303ff5520894500c740fc010000008908c20c008b4c240c8b7c24088b542404894c240c897c24088954240489f3e9d4fcffff5983c40c51e9020100009090000000003c030000|@6924,2097151,@333|39,0,@6897 81,0,-1 129,0,@6718 158,1,@6721 188,0,@6899 230,1,@6564 446,0,0 467,1,@6900 499,0,@6906 540,0,-1 570,1,@6900 625,0,0 632,0,@6907 638,1,@6908 669,0,0 684,0,0 697,0,5 746,1,@6920 818,1,@6900 6897:D3,12|8b4204c30000000008000000|@6898,5,@322| 6898:S48|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229283129 6899:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@323|62,0,0 72,0,0 6900:D3,304|3b650c7303ff5524a801756d8b088b118b12ff7004ff710453f6c20175478b0250ff72048b5c24088b0889c890e81201000083f80174208b45008d40f83b45087303ff5520894500c740fc010000008b4c24048908eb175a83c4043b650c7303ff5524ebb4b8010000006a016a01a801756c8b008b4d00eb05e9a40000008d49f03b4d087303ff5520894d00c741fc03000000c7015c0a7cb28b40048941048b44240c8941088061ffbfb8010000008b542410f6c201751ba801740583c0027105ff5538ebf68b52043b650c7303ff5524ebe0a801740583c002710ceb05e932000000ff5538ebef8b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c414c38b5c240883c41058e9defeffffb801000000c3000000002c010000|@6905,2097151,@326|46,1,@6901 102,0,0 149,0,@6903 171,0,0 291,0,0 6901:D3,636|3b650c7303ff552453e85202ffff508b4424049090e84602ffff8b0c2483390d753c83380d75378b51048b128b58048b1b833a03751f833b03751a8b49043b48047409b80100000083c408c3b80300000083c408c3b80100000083c408c38339057532833805752dff7008ff71088b58048b410490e886ffffff83f801740d8b5c24045883c40ce974ffffffb80100000083c410c3833907755383380775538b49048b400483f901751783f8017409b80100000083c408c3b80300000083c408c3a801755d8b118b188b323b337458f7c6010000007555f6030175508b33f7c6010000007411bf03000000eb10e984000000e97f0000008b3e8d7c3f0183c7088b32578b3bff71048b4c2404d1e93bc9f3a68d7c3f018d7436018d4c09017418eb2be946000000e9070000006a01ff7104eb1a6a01ff7104ff70048b5b048b4204e8bafeffff83f8017419eb05ff7004eb12585983c4043b650c7303ff5524e941ffffffb80100000083c414c3b80100000083c408c383390b755783380b75578b510c8b580c8b72088b7e04833f03751b8b73088b7e04833f0375108b52088b52048b52043b57047557eb3e8b72088b7e04833f01755c8b73088b7e04833f0175668b52088b52048b520cf6c2017515eb0ae992000000e98d000000f6470c017503ff55383b570c75688b49048b400483f901752383f8017410b801000000eb05e95a00000083c408c3b80300000083c408c3e948000000a801753bff7004ff71048b188b01eb05e933000000e8cefdffff83f80174128b4424045983c4043b650c7303ff5524eba7b80100000083c410c3e909000000b80100000083c408c3b80100000083c408c3b80100000083c408c390900000000078020000|@6902,2097151,@324|10,1,@6447 22,1,@6447 68,0,0 77,0,1 86,0,0 141,0,0 176,0,0 185,0,1 231,0,1 357,0,0 366,0,0 507,0,0 523,0,1 586,0,0 600,0,0 609,0,0 618,0,0 6902:S56|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322973616d6554797065283229 6903:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@6904,1048575,@325|65,0,0 113,0,4 6904:S68|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229283129 6905:S65|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229 6906:D3,12|8b4204c30000000008000000|@6898,5,@327| 6907:O11|@6908,@4604,@5308,@4644,@6668,@4646,@6678,@4648,@6686,@4609,@5316 6908:D3,116|3b650c7303ff552452e806fefeff83380575278b48048339077515f6410401750f8b51048b1a8b4304e8e6fdfeffeb0a89c8909090e8dafdfeff8b0c248b510883c4048b1c24891424ff710cff7110ff7114ff7118ff711cff7120ff7124ff712889de8b590456e91c0000000000000070000000|@6919,2097151,@330|10,1,@6447 42,1,@6447 54,1,@6447 104,1,@6909 6909:D3,868|3b650c7303ff552483380b75708b480c8b51088b7204833e05740589c8c22400833e0574108b7804b888a77bb28b5d04909090ff1389dfff76088b58048b460490e83a9bffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d80f7cb28941048061ffbf6a016a01578d4424045089cb8b442410eb05e969000000909090e8b232ffff8b4424348b4c24308b54242c8b5c24288b7424248b7c2420578b7c2420578b7c2420578b7c242089442440894c243c89542438895c2434897424308b4424088944242c8b442404894424285883c40889442418897c24145b5883c408e915ffffff83380d740d89c1b864107cb28b5d0490ff138b48048b09833909740e8b5004b8c0107cb28b5d0490ff138b51045383fa017507ba01000000eb298b1a8b73088b7e04833f03750f8b1c243b5f047507ba03000000eb0d8b52043b650c7303ff5524ebcb83fa0174208b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424288911eb5e8b510483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24243b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424208911eb63e9300100008b510483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c241c3b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424188911eb63e9cd0000008b510483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24143b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424108911eb65e96a0000008b490483f9017507b901000000eb2c8b118b5a088b7304833e0375108b7c240c3b7e047507b903000000eb0f8b790489f93b650c7303ff5524ebc883f90174258b4d008d49f83b4d087303ff5520894d00c741fc010000008b5424088911eb0ae905000000b90100000083f901750e8b5004b8ec107cb28b5d0490ff138b1183c4048b5d008d5be83b5d087303ff5520895d00c743fc05000000c743100100000089530c8b32897308c7430401000000c7030b0000008b4004891889d0c224000000000060030000|@6918,2097151,@329|41,0,@6718 66,1,@6721 96,0,@6910 134,1,@6564 243,0,@6911 267,0,@6914 287,0,0 315,0,1 380,0,0 409,0,1 479,0,0 508,0,1 578,0,0 607,0,1 677,0,0 706,0,1 770,0,0 783,0,@6916 825,0,0 840,0,0 846,0,5 6910:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@328|62,0,0 72,0,0 6911:O4|@4608,@5398,@6913,@6912 6912:O5|@6454,2708,0,2708,0 6913:S40|74797065436f6e73747246726f6d4f7665726c6f61643a204e6f206d61746368696e672074797065 6914:O4|@4608,@5398,@6913,@6915 6915:O5|@6454,2700,0,2700,0 6916:O4|@4608,@5398,@6913,@6917 6917:O5|@6454,2698,0,2698,0 6918:S48|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f61642832297072656654797065283129 6919:S37|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f6164283229 6920:D3,324|3b650c7303ff5524a80175658b088b510c833a0375608b7204f7c60100000075368b0e8b118b3a3b3b751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901751a8b4c2404894c24048b4004e98fffffffe976000000e95f0000008b09ba010000008b4004a801751cf6c201740583c2027105ff5538ebf68b40043b650c7303ff5524ebe089d0a801740583c0027105ff5538ebf689c28b45008d40f43b45087303ff5520894500c740fc020000008950048b49048908c204008b742404897424048b780489f8e914ffffff8b45008d40f43b45087303ff5520894500c740fc02000000c700d8127cb28b4c24048948048060ffbf89c28b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008910c20400900000000040010000|@6923,63,@332|88,0,0 126,0,0 262,0,@6921 306,0,0 6921:D3,12|8b4204c30000000008000000|@6922,5,@331| 6922:S70|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229283129 6923:S67|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229 6924:S45|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229 6925:O4|@4608,@5398,@6927,@6926 6926:O5|@6866,635,0,635,0 6927:S6|676574417267 6928:D3,688|3b650c7303ff55245350ff742414ff742414ff74241489c38b44242490e8e6edffff83f801755b8b04248338077558f640040175428b48048379040175398b118b5c241c8b7424188b7c24148b4424108b4c240c895c241c89742418897c241489442410894c240c8b5c24048b420483c408e989ffffffb830ad7ab283c408c21400e9b801000083380b756c8b480c8b51088b5a04833b057563833b05740e8b7004b888a77bb28b5d0490ff138b7b088b73048b580489f090e81a93ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701cc167cb28941048061ffbf6a016a0189e05089cb89f8909090e89e2affffeb0ae987000000e9350000008b4424248b4c24208b54241c8b5c24188b74241489442424894c24208954241c895c2418897424148b5c240c5883c40ce9c9feffff8b74241c8b7c24148b4c24108b54240c8b5c24188974241c8b74240489742418be58177cb289742414897c2410894c240c8b74240889542408895c24048b5804ff700c5883c40456e9d401000083380d740cb8581f7cb28b5d049090ff138b48048b09833903750ab8ac1f7cb28b5d04ff13833909755bbb01000000baa80b7cb290e812f6ffff8b4c241c8b5424148b5c24108b74240c8b7c2418894c241c8b4c2404894c2418b958177cb2894c241489542410895c240c8b4c240889742408897c2404bb0100000083c40451e94f0100008b44241c8b5424188b5c24148b7424108b7c240c8944241c89542418895c241489742410897c240c8b5c240489c883c408e9c1fdffff8b008b088b44240489ca909090ff12833805751bb901000000894c241cbb0500000083c4085983c41051e98ad4ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d00000083c408c2140090909000000000ac020000|@6955,2097151,@341|30,1,@6896 120,0,@5759 163,0,@6718 186,1,@6721 216,0,@6929 242,1,@6564 344,0,@6930 384,1,@6931 394,0,@6949 416,0,@6952 431,0,0 436,0,@6907 442,1,@6908 479,0,@6930 508,0,0 517,1,@6931 596,0,0 605,0,2 618,1,@6843 651,0,0 658,0,2 667,0,6 6929:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@334|62,0,0 72,0,0 6930:O1|@6928 6931:D3,248|3b650c7303ff55248b48088b45008d40f03b45087303ff5520894500c740fc030000008b5424188950088958048908538b542420ff1283380575116a01bb05000000909090e856d3ffffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d000000f6042401740683c404c21c0050ff742418ff742418ff742418ff74242cff742434ff7424208b5c24348b44241c909090e85a000000909090e87ee3ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000005a895008894804c7000700000083c404c21c00909000000000f4000000|@6948,1048575,@340|62,0,2 70,1,@6843 105,0,0 112,0,2 121,0,6 174,1,@6932 182,1,@6881 215,0,1 228,0,3 6932:D3,300|3b650c7303ff5524a801757253ff7004ff742410ff742410ff742428ff742428ff7424288b5c24288b008b5424189090ff128b4d008d49cc3b4d087303ff5520894d00c741fc02000000c7410470707ab289018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410ceb05e999000000c740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e87200000050ff742424ff742424ff742424ff742424ff742424ff7424248b5c24208b44241c9090e80affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21800b801000000c218000000000028010000|@6329,1048575,@339|77,0,@5273 98,0,@5348 117,0,@5348 141,0,0 150,0,14 182,0,0 189,0,1 202,1,@6933 285,0,0 6933:D3,632|3b650c7303ff552483381d7571837804017506b8c4757ab2c3b9010000008b5004f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c10175108b11f641ff107402f7da8d541201eb0289ca83fa01740881faffffff01720f8b5804b8381c7cb28b5d049090ff1389cb89d18b5004eb05e9d7010000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f5753bb641c7cb289d09090e802020000ff742404bb010000009090e85e02000089c1f6c1017519f60101740d8b49043b650c7303ff5524ebe9b901000000eb05b90300000083f9017407b801000000eb6d89c689f09090e82e03000089c1f6c101751d8b11833a03750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017407b801000000eb708b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70170827ab28941048971088b44240489410ceb05e9b40000008061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000894a088b0c24894a04c702050000008b4d008d49e03b4d087303ff5520894d00eb05e931000000c741fc04000000c7410c01000000895108c741048b000000c70144e239b28d4114c740fc02000000c740040100000089088b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c01000000897108c741048b000000c7013ce239b289c28d4114c740fc0200000089500489088b4c240483c4048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c7000500000083c404c3833805740e89c1b8881e7cb28b5d049090ff13c390900000000074020000|@6947,1048575,@338|20,0,@5348 26,0,0 96,0,16777215 106,0,@6934 132,0,0 177,0,@6936 186,1,@6937 195,0,0 202,1,@6938 232,0,0 239,0,1 249,0,0 262,1,@6943 296,0,0 303,0,1 313,0,0 345,0,@5456 408,0,2 446,0,0 456,0,69 462,0,@4607 479,0,0 512,0,0 522,0,69 528,0,@4606 594,0,2 610,0,@6944 6934:O4|4,@4943,0,@6935 6935:O5|@6328,159,0,159,0 6936:O1|@6933 6937:D3,88|3b650c7303ff5524a801753e53ff70048b0089daff12508b5c24088b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000054000000|@6329,1048575,@335|75,0,0 6938:D3,116|3b650c7303ff5524a80175558b08833905740e8b5004b8601d7cb28b5d0490ff138b5424048b710489745afe83c302ff7108528b780489f890e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400b801000000c204009090900000000070000000|@6942,63,@336|23,0,@6939 98,0,0 6939:O4|@4608,@5398,@6941,@6940 6940:O5|@6847,179,0,179,0 6941:S12|6e6f7420636f6e7374616e74 6942:S58|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129636f7079546f566563283229 6943:D3,144|3b650c7303ff5524a80175708b08f6c10175368b11813a44e239b2751d813a44e239b274108b5804b854eb7ab28b5d04909090ff138b5a08eb148b510489d13b650c7303ff5524ebc5bbec7d7ab2538b4004909090e8a6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908eb05e901000000c3b801000000c3000000008c000000|@6329,15,@337|23,0,@4607 31,0,@4607 41,0,@6377 74,0,@5413 131,0,0 6944:O4|@4608,@5398,@6946,@6945 6945:O5|@6847,210,0,210,0 6946:S31|6d616b6556616c202d206e6f7420636f6e7374616e74206f72207475706c65 6947:S46|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129 6948:S59|545950454944434f444528292e626f7865646e657373466f7254797065283429626f7865646e657373466f72436f6e737472756374696f6e283229 6949:O4|@4608,@5398,@6951,@6950 6950:O5|@6866,397,0,397,0 6951:S30|626f7865646e657373466f72547970653a20556e6b6e6f776e2074797065 6952:O4|@4608,@5398,@6954,@6953 6953:O5|@6866,381,0,381,0 6954:S43|626f7865646e6573733a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 6955:S32|545950454944434f444528292e626f7865646e657373466f7254797065283429 6956:D3,804|3b650c7303ff55245350ff742414ff742414ff74241489c38b44242490e8bae1ffff83f80175638b04248338077560f640040175428b48048379040175398b118b5c241c8b7424188b7c24148b4424108b4c240c895c241c89742418897c241489442410894c240c8b5c24048b420483c408e989ffffffb9010000008b4004a8017528f6c1017411eb0ae924020000e96500000083c1027105ff5538ebf68b40043b650c7303ff5524ebd489c8a801740783f8097f38eb06f640ff10743089c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7000500000083c408c21400b8f0707ab283c408c2140083380b756e8b480c8b51088b5a04833b057565833b0574108b7004b888a77bb28b5d04909090ff138b7b088b73048b580489f090e87a86ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7016c237cb28941048061ffbf6a016a0189e05089cb89f8909090e8fe1dffffeb0ae987000000e9350000008b4424248b4c24208b54241c8b5c24188b74241489442424894c24208954241c895c2418897424148b5c240c5883c40ce955feffff8b74241c8b7c24148b4c24108b54240c8b5c24188974241c8b74240489742418bef8237cb289742414897c2410894c240c8b74240889542408895c24048b5804ff700c5883c40456e9d401000083380d740cb8a0267cb28b5d049090ff138b48048b09833903750ab8f0267cb28b5d04ff13833909755bbb01000000baa80b7cb290e872e9ffff8b4c241c8b5424148b5c24108b74240c8b7c2418894c241c8b4c2404894c2418b9f8237cb2894c241489542410895c240c8b4c240889742408897c2404bb0100000083c40451e94f0100008b44241c8b5424188b5c24148b7424108b7c240c8944241c89542418895c241489742410897c240c8b5c240489c883c408e94dfdffff8b008b088b44240489ca909090ff12833805751bb901000000894c241cbb0700000083c4085983c41051e9eac7ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400807000000894804c7000d00000083c408c214009090900000000020030000|@6968,2097151,@345|30,1,@6896 120,0,0 219,0,0 228,0,2 239,0,@5281 277,0,@6718 302,1,@6721 332,0,@6957 358,1,@6564 460,0,@6958 500,1,@6959 510,0,@6962 532,0,@6965 547,0,0 552,0,@6907 558,1,@6908 595,0,@6958 624,0,0 633,1,@6959 712,0,0 721,0,3 734,1,@6843 767,0,0 774,0,3 783,0,6 6957:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@342|62,0,0 72,0,0 6958:O1|@6956 6959:D3,248|3b650c7303ff55248b48088b45008d40f03b45087303ff5520894500c740fc030000008b5424188950088958048908538b542420ff1283380575116a01bb07000000909090e8b6c6ffffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400807000000894804c7000d000000f6042401740683c404c21c0050ff742418ff742418ff742418ff74242cff742434ff7424208b5c24348b44241c909090e85a000000909090e8ded6ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000005a895008894804c7000700000083c404c21c00909000000000f4000000|@6961,1048575,@344|62,0,3 70,1,@6843 105,0,0 112,0,3 121,0,6 174,1,@6960 182,1,@6881 215,0,1 228,0,3 6960:D3,324|3b650c7303ff5524a801757253ff7004ff742410ff742410ff742428ff742428ff7424288b5c24288b008b5424189090ff128b4d008d49c03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410ceb05e9b1000000c740fc02000000894804c700c4757ab28d480cc741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e8bef3ffffeb0289c850ff742424ff742424ff742424ff742424ff742424ff7424248b5c24208b44241c9090e8f2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21800b801000000c218000000000040010000|@6329,1048575,@343|77,0,0 98,0,@5348 117,0,@5348 143,0,@5348 160,0,0 169,0,14 200,0,0 207,0,1 222,1,@6933 309,0,0 6961:S49|545950454944434f444528292e73697a65466f725479706528342973697a65466f72436f6e737472756374696f6e283229 6962:O4|@4608,@5398,@6964,@6963 6963:O5|@6866,459,0,459,0 6964:S25|73697a65466f72547970653a20556e6b6e6f776e2074797065 6965:O4|@4608,@5398,@6967,@6966 6966:O5|@6866,433,0,433,0 6967:S38|73697a653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 6968:S27|545950454944434f444528292e73697a65466f7254797065283429 6969:S57|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229676574417267283129 6970:S48|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229 6971:O4|@4608,@5398,@6973,@6972 6972:O5|@6866,723,0,723,0 6973:S21|457175616c69747920666f722066756e6374696f6e 6974:O4|@4608,@5398,@6976,@6975 6975:O5|@6866,687,0,687,0 6976:S40|6d616b6545713a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 6977:S22|545950454944434f444528292e6d616b654571283429 6978:O1|@6979 6979:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@6981,1048575,@351|16,1,@6980 6980:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9ddc1ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@350|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 6981:S72|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296765745479706556616c7565466f724944283129 6982:D3,520|3b650c7303ff55245350ff742414ff742414ff74241489c38b44242490e892d7ffff83f80175628b042483380775408b40048b4c2404a801752d8b10ff7004ff74241cff74241cff74241cff74241c89cb8b420490e8a6ffffff89c1583b650c7303ff5524ebcf89c883c408c2100083380b756c8b480c8b51088b5a04833b057563833b057416eb05e9430100008b7004b888a77bb28b5d049090ff138b7b088b73048b580489f090e8d67cffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701782c7cb28941048061ffbf6a016a0189e05089cb89f8eb0ae99a000000e935000000909090e84e14ffff8b4424208b4c241c8b5424188b5c241489442420894c241c89542418895c24148b5c240c5883c40ce9e1feffffff70048b5c241c89c890e87a010000a801740ff64424080174083b4424087d0beb05ff5538ebf38b44240859f6c1017529ff7104ff74241cff74241cff74241cff74241c89c38b019090e892feffff593b650c7303ff5524ebd283c408c2100083380d75468b40048b00833803750783c40458c21000833809750783c40458c210008b4c24188b5424148b5c24108b74240c894c241889542414895c24108974240c83c4045be936feffff83c40458c210008b008b4804f6c101740ff64424040174083b4c24047e0feb05ff5538ebf389c883c408c2100083c40458c2100090900000000004020000|@6986,2097151,@354|30,1,@6896 146,0,@6718 170,1,@6721 200,0,@6983 238,1,@6564 298,1,@6984 6983:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@352|62,0,0 72,0,0 6984:D3,264|3b650c7303ff5524f6c30175558b0b8b510c833a0175508b7204f7c601000000755a8b0e8b51088b7a04833f03751b8b50088b7a04833f0375108b49088b49048b49043b4f04754eeb458b51088b7a04833f0175418b50088b7a04833f017536eb0ae992000000e9830000008b49088b49048b490cf6c1017510eb05e925000000f6470c017503ff55383b4f0c7507b903000000eb158b76043b650c7303ff5524e974ffffffb90100000083f9017437b8010000008b5b04f6c301751ba801740583c0027105ff5538ebf68b5b043b650c7303ff5524ebe0a801740583c0027105ff5538ebf6c38b5b04e911ffffff8b730489f3e907ffffffb8ffffffffc3900000000004010000|@6985,63,@353|144,0,1 167,0,0 177,0,0 250,0,-1 6985:S47|545950454944434f444528292e547970655661724d61702e636865636b54797065436f6e7374727563746f72283229 6986:S27|545950454944434f444528292e6765744d61784465707468283329 6987:O1|@6988 6988:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@6990,1048575,@356|16,1,@6989 6989:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e915bcffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@355|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 6990:S65|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329626f786564436f64652d283129 6991:O1|@6992 6992:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@6994,1048575,@358|16,1,@6993 6993:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e971baffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@357|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 6994:S64|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d6574657228332973697a65436f64652d283129 6995:S52|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329 6996:S32|545950454944434f444528292e6170706c79546f496e7374616e636527283429 6997:O3|2,@6999,@6998 6998:O2|@7008,0 6999:O4|@7001,@7000,2,1 7000:O1|@7004 7001:O1|@7002 7002:D3,16|b801000000c39090000000000c000000|@7003,1,@362|1,0,0 7003:S10|6572726f72436f646532 7004:D3,16|b8c0327cb2c39090000000000c000000|@7007,1,@363|1,0,@7005 7005:O2|3,@7006 7006:S2|666e 7007:S14|7072696e742d66756e6374696f6e 7008:O4|@4607,69,@7009,0 7009:O3|2,4,@7010 7010:O5|@5411,@7012,@7027,@7028,@7011 7011:O2|@5448,@7051 7012:O2|@5433,@7013 7013:O2|@7015,@7014 7014:O2|@7021,@7020 7015:O2|@7017,@7016 7016:O3|0,@7019,@5415 7017:O2|1,@7018 7018:O2|2,3 7019:O8|@5348,@7003,0,0,@5668,0,0,1 7020:O2|@7025,@5441 7021:O2|@6234,@7022 7022:O3|0,@7023,@5415 7023:O8|@7024,@7007,0,0,@5276,0,0,1 7024:O3|2,@7005,0 7025:O2|@7026,@5413 7026:O3|0,2,0 7027:O14|2,2,2,2,2,2,2,2,2,2,2,2,2,2 7028:O15|@7030,@7034,@7033,@7032,@7001,@7000,@6999,@7039,@7038,@7043,@7042,@7046,@7031,@7048,@7029 7029:O4|I251,@7048,1,1 7030:O6|@7032,@6999,@7038,@7042,@7031,@7029 7031:O4|@5324,@7046,3,1 7032:O4|@7034,@7033,3,1 7033:O1|@7036 7034:O1|@7035 7035:D3,16|b801000000c39090000000000c000000|@7003,1,@364|1,0,0 7036:D3,16|b8f06e7ab2c39090000000000c000000|@7037,1,@365|1,0,@5252 7037:S13|7072696e742d64656661756c74 7038:O4|I113,@7039,3,1 7039:O1|@7040 7040:D3,28|3b650c7303ff55248b0d24e239b289caff2290900000000018000000|@7041,1048575,@366|10,0,@4603 7041:S9|7072696e742d696e74 7042:O4|I251,@7043,1,1 7043:O1|@7044 7044:D3,28|3b650c7303ff55248b0dfce139b289caff2290900000000018000000|@7045,1048575,@367|10,0,@4598 7045:S10|7072696e742d626f6f6c 7046:O1|@7047 7047:D3,28|3b650c7303ff55248b0d34e239b289caff2290900000000018000000|@5397,1048575,@368|10,0,@4605 7048:O1|@7049 7049:D3,28|3b650c7303ff55248b0d24e539b289caff2290900000000018000000|@7050,1048575,@369|10,0,@4649 7050:S10|7072696e742d63686172 7051:O2|@7053,@7052 7052:O2|0,@7091 7053:O2|@7055,@7054 7054:O2|@7076,0 7055:O4|@4606,69,@7056,0 7056:O2|0,@7057 7057:O2|0,@7058 7058:O2|0,@7059 7059:O2|0,@7060 7060:O2|@7061,@5279 7061:O2|@7063,@7062 7062:O2|@7071,@7070 7063:O4|@4606,69,@7064,0 7064:O2|@7065,@5330 7065:O2|@7067,@7066 7066:O2|@7067,0 7067:O4|@4607,69,@7068,0 7068:O3|0,@5336,@7069 7069:O5|@5407,@5335,I49,@5446,@5428 7070:O2|@7071,0 7071:O4|@4607,69,@7072,0 7072:O3|2,4,@7073 7073:O4|@5456,@7075,@7074,@7031 7074:O2|@7066,@5330 7075:O2|@7068,@5459 7076:O4|@4607,69,@7077,0 7077:O3|2,6,@7078 7078:O4|@5456,@7080,@7079,@7030 7079:O2|0,@7085 7080:O2|@5413,@7081 7081:O2|@5413,@7082 7082:O2|@5413,@7083 7083:O2|@5413,@7084 7084:O2|@7072,@5461 7085:O2|0,@7086 7086:O2|0,@7087 7087:O2|0,@7088 7088:O2|@7089,@5279 7089:O2|@7090,@7070 7090:O4|@4606,69,@7074,0 7091:O2|0,@7092 7092:O2|0,@7093 7093:O2|0,@7094 7094:O2|0,@7095 7095:O2|0,@7096 7096:O2|0,@7097 7097:O2|0,@7098 7098:O2|0,@7099 7099:O2|0,@7100 7100:O2|0,@7101 7101:O2|@7061,@5424 7102:O2|@7104,@7103 7103:O2|@7128,@7127 7104:O2|@5308,@7105 7105:O3|2,@7038,@7106 7106:O2|@7107,0 7107:O4|@4607,69,@7108,0 7108:O3|2,4,@7109 7109:O5|@5411,@7110,@7027,@7028,@7011 7110:O2|@5433,@7111 7111:O2|@7113,@7112 7112:O2|@7115,@5438 7113:O2|@7114,@5413 7114:O3|0,I113,0 7115:O2|@5815,@7116 7116:O3|0,@7117,@5415 7117:O8|@7119,@7041,0,0,@7118,0,0,1 7118:O2|@7126,0 7119:O4|3,@5357,@7120,1 7120:O4|3,@7122,@7121,1 7121:O3|2,I253,0 7122:O2|@7124,@7123 7123:O2|@5366,0 7124:O2|@7125,1 7125:O3|2,@4603,0 7126:O2|1,@5384 7127:O2|@7149,@7148 7128:O2|@5243,@7129 7129:O3|2,@7042,@7130 7130:O2|@7131,0 7131:O4|@4607,69,@7132,0 7132:O3|2,4,@7133 7133:O5|@5411,@7134,@7027,@7028,@7011 7134:O2|@5433,@7135 7135:O2|@7137,@7136 7136:O2|@7140,@7139 7137:O2|@7138,@5413 7138:O3|0,I251,0 7139:O2|@5444,@5441 7140:O2|@5527,@7141 7141:O3|0,@7142,@5415 7142:O8|@7143,@7045,0,0,@7118,0,0,1 7143:O4|3,@5357,@7144,1 7144:O4|3,@7145,@7121,1 7145:O2|@7146,@7123 7146:O2|@7147,1 7147:O3|2,@4598,0 7148:O2|@7171,0 7149:O2|@5316,@7150 7150:O3|2,@7031,@7151 7151:O2|@7063,@7152 7152:O2|@7153,0 7153:O4|@4607,69,@7154,0 7154:O3|2,4,@7155 7155:O5|@5411,@7156,@7027,@7028,@7011 7156:O2|@5433,@7157 7157:O2|@7159,@7158 7158:O2|@7161,@5438 7159:O2|@7160,@7068 7160:O3|0,@5324,@7066 7161:O2|@7163,@7162 7162:O3|0,@7165,@5415 7163:O2|1,@7164 7164:O2|2,10 7165:O8|@7166,@5397,0,0,@7118,0,0,1 7166:O4|3,@5357,@7167,1 7167:O4|3,@7168,@7121,1 7168:O2|@7169,@7123 7169:O2|@7170,1 7170:O3|2,@4605,0 7171:O2|@6686,@7172 7172:O3|2,@7029,@7173 7173:O2|@7174,0 7174:O4|@4607,69,@7175,0 7175:O3|2,4,@7176 7176:O5|@5411,@7177,@7027,@7028,@7011 7177:O2|@5433,@7178 7178:O2|@7137,@7179 7179:O2|@7180,@7139 7180:O2|@7182,@7181 7181:O3|0,@7184,@5415 7182:O2|1,@7183 7183:O2|2,12 7184:O8|@7185,@7050,0,0,@7118,0,0,1 7185:O4|3,@5357,@7186,1 7186:O4|3,@7187,@7121,1 7187:O2|@7188,@7123 7188:O2|@7189,1 7189:O3|2,@4649,0 7190:O3|2,@7032,@7191 7191:O2|@7192,0 7192:O4|@4607,69,@7193,0 7193:O3|2,4,@7194 7194:O5|@5411,@7195,@7027,@7028,@7011 7195:O2|@5433,@7196 7196:O2|@7198,@7197 7197:O2|@7199,@5438 7198:O2|@5747,@7016 7199:O2|@5756,@7200 7200:O3|0,@7201,@5415 7201:O8|@7202,@7037,0,0,@5276,0,0,1 7202:O3|2,@5252,0 7203:O2|7,@7204 7204:O8|@5348,@7205,0,0,@5668,1,0,1 7205:S10|6e6f457175616c697479 7206:O4|@7207,@6997,@7102,@7190 7207:D3,48|3b650c7303ff55248b4c24048b7204897424048b7a088b3424893c24ff720c5156e91e0000009090000000002c000000|@7305,2097151,@397|34,1,@7208 7208:D3,4912|3b650c7303ff55248338057572b888537cb2a801751d8b08833905750f8b480489c83b650c7303ff5524ebe6b801000000eb05b80300000083f801740fb8b0537cb2909090e81ed9ffffeb05b8b0537cb289c3b80100000090e826bcffff5053bbc0537cb2b803000000909090e852f7feff8b4d008d49dc3b4d08730aeb05e964000000ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104d8327cb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000833807756af640040175698b48048379040175658b118b75008d76e83b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc03000000c707ec537cb28977048b43048947088067ffbf8b0bf6c101740583c1027105ff5538ebf68b45008d40f03b45087314eb0fe95d0a0000e984090000e97f040000ff5520894500c740fc03000000897008897804890856ff32ff742418ff742418ff742418ff74241889c38b42049090e866feffff89c3b854a97ab2e8aeb9ffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c7010700000051bb1c557cb28b4424049090e86ec9fdff8b4d008d49c83b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000c740040100000089088d480cc741fc02000000894104c701acb67ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e8ead6ffffb928557cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b840557cb2e8aed6ffffeb0889c1b840557cb251b95c557cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740f50b884557cb29090e866d6ffffeb0889c1b884557cb2518b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948048b4c240889088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045983c40889089090e8ca110000b964567cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b88c567cb2e8a6d5ffffeb0889c1b88c567cb2518b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a89118b55008d52e43b55087303ff5520895500c742fc02000000894a0489028d420cc740fc03000000c7400801000000895004c7001d000000f6c201751d8b0a833905750f8b4a0489ca3b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e812d5ffff8b4d008d49b43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc02000000894804c700f0707ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e85ad4ffff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8aab6ffff909090e822b7ffff5053bb9c567cb2b803000000909090e84ef2feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104c8567cb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c210008b5008833a0175058b5208eb0f8b52048b123b650c7303ff5524ebe783fa01745cba0300000053ff7004f6c10175638b01ff710452ff30bb0300000089d0bafc317ab290e8b2ebfdff3b0424743ef60424017564a8017560a8017407b903000000eb068b088d4c090183c1088b342489c7d1e93bc9f3a68d7c3f01eb05e9980000008d7436018d4c0901752c8b442404eb05e92b000000a801740583c0027105ff5538ebf689c283c408593b650c7303ff5524e972ffffffb80100000083c40ceb05b80300000083f8017447b8010000008b0c24f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740783f8057d0feb06f640ff107407b801000000eb15b803000000eb0eb801000000eb07b80100000053518b4c24048b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc03000000c703e0567cb28953048b71048973088063ffbf8b39f7c701000000740583c7027105ff5538ebf68b4d008d49f03b4d087303ff5520894d00c741fc030000008951088959048939bb010000008b3424f7c601000000751cf6c301740583c3027105ff5538ebf68b76043b650c7303ff5524ebdc52505189debb10587cb289f0e80ef0feff89c38b44240cba74587cb2e876100000837c240401750dbbf4597cb2909090e8aad5feff837c2404017507b9f7000000eb05b9510000008b55008d52c83b55087303ff5520895500c742fc03000000c7420801000000894a04c702050000008d4a10c741fc02000000c741040100000089118d510cc742fc02000000894a04c702acb67ab28d4a0cc741fc03000000c7410803000000895104c7011d000000f6c201751d8b1a833b05750f8b5a0489da3b650c7303ff5524ebe5ba01000000eb05ba0300000083fa01740b5089c890e8ded0ffffeb0589c289c85250b9fc5a7cb251ff742430ff742430ff742430ff742430ff74241cff742424bb010000008b442420e8021200008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40c89088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e81ad0ffffeb0289c88b4d008d49b43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc02000000894804c700f0707ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e85ecfffff5983c4088b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8aab1ffff909090e822b2ffff5053bb90687cb2b803000000909090e84eedfeff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104c8567cb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000b8bc687cb2a801751d8b08833905750f8b480489c83b650c7303ff5524ebe6b801000000eb05b80300000083f801740fb8f0687cb2909090e846ceffffeb05b8f0687cb289c3b80100000090e84eb1ffff5053bb00697cb2b803000000909090e87aecfeff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104c8567cb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c2100083380b756b8b480c8b51088b7204833e057562833e0574108b7804b888a77bb28b5d04909090ff1389dfff76088b58048b460490e8aa5bffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7012c697cb28941048061ffbf6a016a01578d4424045089cb8b442410eb0ae9df040000e9310000009090e81ef3feff8b4424208b4c241c8b5424188b5c241489442420894c241c89542418895c24145b5883c408e99cf3ffff8b7d008d7fe83b7d087303ff5520897d00c747fc01000040c707010000008d4f08c741fc03000000c701b8697cb28979048b53048951088061ffbf8b33f7c601000000740583c6027105ff5538ebf68b55008d52f03b55087303ff5520895500c742fc03000000897a08894a0489328b480cff7004578b7908ff700852ff7304ff74240c89f38b0790e8b21d000083380575116a01bb03000000909090e8b69dffffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d00000050ff742424ff742424ff742424ff742424ff742414bbfc5a7cb28b4424249090e8fe1e0000837c24100175728b45008d40f43b45087303ff5520894500c740fc02000000c74004b4857ab28b0c248908e8c6adffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000089cbb854a97ab290e88aadffff8b4d008d49ec3b4d08730aeb05e945010000ff5520894d00c741fc04000000c7410c03000000895908894104c70107000000518b5c240cb8fc6f7cb2909090e842bdfdff8b4c24108b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8a6adffff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8e6adffff5053bb0c707cb2b803000000909090e812e9feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c414c210008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104b4857ab28b1424891189c389c8e806acffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000089ce89d8e8ceabffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c7010700000089cbb854a97ab290e896abffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c70107000000518b5c240cb8fc6f7cb29090e856bbfdff8b4c24108b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8baabffff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8faabffff5053bb38707cb2b803000000909090e826e7feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c414c2100083380d756e8b48048b09833909756953bb01000000baa80b7cb29090e866baffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000c741100100000089410c8b00894108c7410401000000c7010b0000008b4424148b5424108b5c240c8b7424088944241489542410895c240ceb0ae9cf000000e90c000000897424085b89c8e96aeeffff833903757053ff742414ff742414ff74241489c38b442414909090e816b0ffff83f801750e89c1b864707cb28b5d049090ff138b008b085889caff128338057518b901000000894c2410bb030000005983c40c51e9cd98ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000eb05e91a000000c7400c01000000c7400803000000894804c7000d000000c210008b40048b008b4c24108b54240c8b7424088b7c2404894c24108954240c89742408897c2404e9acedffffb8c8707cb2a801751d8b08833905750f8b480489c83b650c7303ff5524ebe6b801000000eb05b80300000083f801740cb800717cb2e8dac6ffffeb05b800717cb289c3b80100000090e8e2a9ffff5053bb10717cb2b803000000909090e80ee5feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741043c717cb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000909090000000002c130000|@7304,2097151,@396|14,0,@7209 45,0,0 52,0,1 62,0,@7212 70,1,@6933 77,0,@7212 84,0,0 90,1,@6884 97,0,@7213 102,0,1 110,1,@6547 148,0,1 155,0,0 162,0,1 179,0,0 186,0,@7007 225,0,7 280,0,0 296,0,@7215 413,0,@5708 418,1,@6881 449,0,1 461,0,3 467,0,@7216 478,1,@4940 509,0,0 518,0,2 535,0,0 556,0,@5897 573,0,1 582,0,14 614,0,0 621,0,1 634,1,@6933 639,0,@7217 671,0,0 678,0,1 689,0,@7219 694,1,@6933 703,0,@7219 709,0,@7221 741,0,0 748,0,1 759,0,@7224 766,1,@6933 775,0,@7224 807,0,0 898,1,@7225 903,0,@7226 935,0,0 942,0,1 953,0,@7229 958,1,@6933 967,0,@7229 999,0,0 1048,0,0 1057,0,14 1089,0,0 1096,0,1 1106,1,@6933 1137,0,0 1158,0,@5348 1177,0,@5348 1196,0,@5281 1215,0,@5348 1232,0,1 1241,0,14 1273,0,0 1280,0,1 1290,1,@6933 1298,0,0 1366,1,@6883 1374,1,@6884 1381,0,@7230 1386,0,1 1394,1,@6547 1425,0,1 1432,0,0 1439,0,1 1456,0,0 1463,0,@7232 1502,0,7 1543,0,1 1565,0,1 1572,0,@5052 1578,1,@5053 1602,0,1 1694,0,0 1704,0,1 1714,0,0 1771,0,0 1778,0,1 1785,0,0 1792,0,0 1828,0,0 1844,0,@7233 1914,0,0 1963,0,@7234 1970,1,@6547 1981,0,@7237 1986,1,@7238 1998,0,@7243 2006,1,@6493 2018,0,123 2025,0,40 2056,0,0 2065,0,2 2082,0,0 2103,0,@5897 2120,0,1 2129,0,14 2161,0,0 2168,0,1 2182,1,@6933 2195,0,@7248 2225,0,0 2234,1,@7249 2265,0,0 2317,0,0 2326,0,14 2357,0,0 2364,0,1 2378,1,@6933 2413,0,0 2434,0,@5348 2453,0,@5348 2472,0,@5281 2491,0,@5348 2508,0,1 2517,0,14 2549,0,0 2556,0,1 2566,1,@6933 2577,0,0 2646,1,@6883 2654,1,@6884 2661,0,@7271 2666,0,1 2674,1,@6547 2705,0,1 2712,0,0 2719,0,1 2736,0,0 2743,0,@7232 2782,0,7 2790,0,@7273 2821,0,0 2828,0,1 2838,0,@7277 2846,1,@6933 2853,0,@7277 2860,0,0 2866,1,@6884 2873,0,@7278 2878,0,1 2886,1,@6547 2917,0,1 2924,0,0 2931,0,1 2948,0,0 2955,0,@7232 2994,0,7 3029,0,@6718 3054,1,@6721 3084,0,@7280 3126,1,@6564 3198,0,0 3214,0,@7281 3310,1,@7282 3322,0,1 3330,1,@6843 3365,0,0 3372,0,1 3381,0,6 3407,0,@7248 3418,1,@7283 3456,0,@5490 3466,1,@6881 3497,0,1 3504,0,@7121 3513,0,3 3520,0,@5708 3526,1,@6881 3564,0,1 3576,0,3 3586,0,@7288 3594,1,@4940 3605,0,0 3674,1,@6883 3680,0,I48 3694,0,I48 3699,0,4 3724,0,@6130 3738,1,@6884 3745,0,@7289 3750,0,1 3758,1,@6547 3789,0,1 3796,0,0 3803,0,1 3820,0,0 3863,0,7 3900,0,@5490 3914,1,@6881 3945,0,1 3952,0,@7121 3961,0,3 3970,1,@6881 4001,0,1 4013,0,3 4020,0,@5708 4026,1,@6881 4057,0,1 4069,0,3 4079,0,@7288 4086,1,@4940 4097,0,0 4166,1,@6883 4172,0,I48 4186,0,I48 4191,0,4 4216,0,@6130 4230,1,@6884 4237,0,@7291 4242,0,1 4250,1,@6547 4281,0,1 4288,0,0 4295,0,1 4312,0,0 4355,0,7 4382,0,0 4387,0,@6907 4394,1,@6908 4425,0,0 4440,0,0 4446,0,5 4530,1,@6896 4542,0,@7293 4568,0,0 4577,0,1 4587,1,@6843 4627,0,0 4634,0,1 4643,0,6 4693,0,@7296 4724,0,0 4731,0,1 4741,0,@7300 4746,1,@6933 4753,0,@7300 4760,0,0 4766,1,@6884 4773,0,@7301 4778,0,1 4786,1,@6547 4817,0,1 4824,0,0 4831,0,1 4848,0,0 4855,0,@7303 4894,0,7 7209:O2|@5897,@7210 7210:O2|@7211,0 7211:O3|2,@7006,0 7212:O3|14,@7209,1 7213:O1|@7214 7214:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@370|1,0,@5280 7215:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e920a3ffff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@371|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 7216:S2|203d 7217:O2|@5281,@7218 7218:O2|@5281,@5490 7219:O3|14,@7220,1 7220:O2|@5281,@7218 7221:O2|@5897,@7222 7222:O2|@7223,0 7223:O3|2,125,0 7224:O3|14,@7221,1 7225:D3,188|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e970c3ffff89c8c3b8c4757ab2c390909000000000b8000000|@6729,1048575,@372|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 172,0,@5348 7226:O2|@5897,@7227 7227:O2|@7228,0 7228:O3|2,123,0 7229:O3|14,@7226,1 7230:O1|@7231 7231:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@373|1,0,@5280 7232:S14|7072696e742d6c6162656c6c6564 7233:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e92ca0ffff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@374|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 7234:O1|@7235 7235:D3,12|c39090900000000008000000|@7236,1,@375| 7236:S52|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296669656c64732d283129 7237:O2|@7238,@4656 7238:D3,248|3b650c7303ff552483f801754283fb0174378b45008d40ec3b45087303ff5520894500c740fc04000000c7400c8c597cb2c7400801000000c74004c0597cb28b520489108b5d04ff13b801000000c3f6c30174418b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c8c597cb2c7410801000000c74104c0597cb28b720489318b7804ff3089c88b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b338971048b38893952518b730489f38b700489f0909090e836ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3909000000000f4000000|@7242,63,@376|45,0,@7239 52,0,0 59,0,@7241 74,0,0 111,0,@7239 118,0,0 125,0,@7241 7239:O5|@7240,51,0,51,0 7240:S20|2e2f62617369732f4c697374506169722e736d6c 7241:S14|556e657175616c4c656e67746873 7242:S17|4c697374506169722e7a69704571283229 7243:O1|@7244 7244:D3,52|8b008b088b45008d40f43b45087303ff5520894500c740fc02000000c700445a7cb28948048060ffbfc390900000000030000000|@7247,3,@378|30,0,@7245 7245:D3,32|3b650c7303ff55248b008b188b4204ff25e8bd5208909090000000001c000000|@7246,63,@377|17,0,I29 7246:S59|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283229283129 7247:S56|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283129 7248:O1|@7208 7249:D3,2360|3b650c7303ff5524a801740d89c1b850647cb28b5d0490ff138378040175748b088b11ff32ff7104ff742420ff742420ff742420ff7424208b5c24208b42048b54243490ff128b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000005a895108c74104d4887ab2c7010d00000089c389ceb87c647cb29090e80ea0ffff8b4d008d49c43b4d08730aeb05e92b030000ff5520894d00c741fc04000000c7410c03000000c7410888647cb2894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc0200000089410489318d410cc740fc03000000c7400801000000894804c7001d000000f6c101740b53909090e8a2bdffffeb01538b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e8629fffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000006a016a01837c241001741389e0c7000100000089e0c7400453000000eb7351bb1c557cb28b44240c909090e802affdff8b4d008d49c83b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000c740040100000089088d480cc741fc02000000894104c701acb67ab28d410cc740fc03000000c7400803000000eb05e9c4000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e87abcffffb928557cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b898647cb2e83ebcffffeb0889c1b898647cb2518b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088d4c240489018d442404c74004fb000000eb01518b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b4c2408894804c700050000008b4d008d49d83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c700acb67ab28d480cc741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e83ebbffffeb0289c88b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc0200000089480459890883f80175058b0424eb0d89c38b0424909090e8fa05000083c40c5983c41c51e9450600008b088b116a016a01837c240c01741389e6c7060100000089e6c7460453000000eb7353ff7004ff7104ff7204bb1c557cb28b02909090e892acfdff8b4d008d49c83b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000c740040100000089088d480cc741fc02000000894104c701acb67ab28d410cc740fc03000000eb05e9cb000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e80abaffffb928557cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b8dc657cb2e8ceb9ffffeb0889c1b8dc657cb2518b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088d4c241089018d442410c74004fb000000eb0a53ff7004ff7104ff7204ff742430ff742430ff742430ff7424308b5c24308b4424108b5424449090ff128b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c0100000083c4045a895108c74104d4887ab2c7010d00000089c389ceb87c647cb2909090e8fe9affff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888647cb2894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc0200000089410489318d410cc740fc03000000c7400801000000894804c7001d000000f6c101740a539090e89ab8ffffeb01538b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e85a9affff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c70107000000b8f8657cb2a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740e51b820667cb290e806b8ffffeb06b820667cb251b928557cb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b830667cb2e8c2b7ffffeb0889c1b830667cb2518b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc0200000089410458890183f90175068b442408eb0c89cb8b44240890e8f20300008b4c2404f6c101740583c1027105ff5538ebf650ff742430ff742430ff742430ff742430ff742430ff742430ff74243089cb8b44242090e86ef8ffff89c35883c40490e802040000508b5c240cb874977ab290e8e2a8fdff8b4d008d49c83b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000c740040100000089088d480cc741fc02000000894104c701acb67ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e85eb6ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c8e8fa0300008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542404895104c701050000008b55008d52e83b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c701e0c77ab289c389c8909090e8b697ffff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410840687cb2894104c701070000008d4114c740fc040000005a83c40c89500c895808894804c70003000000c21c009090900000000034090000|@7270,1048575,@384|15,0,@7250 97,0,0 108,0,@5532 114,0,6 123,0,@7252 130,1,@6881 168,0,1 175,0,@7253 184,0,3 201,0,0 235,0,0 244,0,14 258,1,@6933 292,0,0 302,1,@6881 333,0,1 346,0,3 365,0,0 374,0,41 382,0,@7216 394,1,@4940 425,0,0 434,0,2 451,0,0 472,0,@5897 489,0,1 505,0,14 537,0,0 544,0,1 554,1,@6933 559,0,@7217 591,0,0 598,0,1 609,0,@7254 614,1,@6933 623,0,@7254 655,0,0 690,0,125 724,0,0 737,0,2 768,0,0 791,0,@5897 808,0,1 817,0,14 848,0,0 855,0,1 870,1,@6933 905,0,0 946,1,@7256 959,1,@7257 982,0,0 991,0,41 1008,0,@7216 1018,1,@4940 1049,0,0 1058,0,2 1075,0,0 1096,0,@5897 1120,0,1 1129,0,14 1161,0,0 1168,0,1 1178,1,@6933 1183,0,@7217 1215,0,0 1222,0,1 1233,0,@7258 1238,1,@6933 1247,0,@7258 1279,0,0 1314,0,125 1389,0,0 1403,0,@5532 1409,0,6 1418,0,@7252 1426,1,@6881 1457,0,1 1464,0,@7253 1473,0,3 1490,0,0 1524,0,0 1533,0,14 1546,1,@6933 1580,0,0 1590,1,@6881 1621,0,1 1634,0,3 1639,0,@7260 1670,0,0 1677,0,1 1688,0,@7263 1694,1,@6933 1701,0,@7263 1707,0,@7217 1739,0,0 1746,0,1 1757,0,@7264 1762,1,@6933 1771,0,@7264 1803,0,0 1874,1,@7266 1946,1,@7267 1956,0,@5579 1962,1,@4940 1993,0,0 2002,0,2 2019,0,0 2040,0,@5897 2057,0,1 2066,0,14 2098,0,0 2105,0,1 2118,1,@6933 2149,0,0 2158,1,@7268 2189,0,0 2202,0,2 2233,0,0 2254,0,@6136 2266,1,@6881 2297,0,1 2304,0,@7269 2313,0,3 2342,0,1 7250:O4|@4650,@6706,0,@7251 7251:O5|@6866,569,0,569,0 7252:O2|@6136,@5273 7253:O3|2,I107,0 7254:O3|14,@7255,1 7255:O2|@5281,@7218 7256:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@379| 7257:D3,188|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e9f8b3ffff89c8c3b8c4757ab2c390909000000000b8000000|@6729,1048575,@380|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 172,0,@5348 7258:O3|14,@7259,1 7259:O2|@5281,@7218 7260:O2|@5897,@7261 7261:O2|@7262,0 7262:O3|2,44,0 7263:O3|14,@7260,1 7264:O3|14,@7265,1 7265:O2|@5281,@7218 7266:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@381| 7267:D3,184|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e960b2ffff89c8c389d8c3909000000000b4000000|@6729,1048575,@382|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 7268:D3,188|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e994b1ffff89c8c3b8c4757ab2c390909000000000b8000000|@6729,1048575,@383|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 172,0,@5348 7269:O3|2,I234,0 7270:S53|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f646528322961735265636f7264283229 7271:O1|@7272 7272:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@385|1,0,@5280 7273:O2|@5897,@7274 7274:O2|@7275,0 7275:O3|2,@7276,0 7276:S2|2829 7277:O3|14,@7273,1 7278:O1|@7279 7279:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@386|1,0,@5280 7280:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@387|62,0,0 72,0,0 7281:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9548dffff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@388|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 7282:D3,420|3b650c7303ff5524833809756d8b4808ff7004ff74240cff74240c8b4104909090e8daffffff8338057519b901000000894c240c8b1c2483c4045983c40451e9d47fffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c2080083380575678b48048b098b40088b00f6c3017409f6000174042b187105ff5538ebf783c301f6c301740783fb017c08eb12f643ff10740cb840f77bb28b5d049090ff13f6c301740783fb017e59eb06f643ff107551f6c301740583eb027105ff5538ebf68b45008d40f0eb05e9990000003b45087303ff5520894500c740fc03000000c740080100000089580489088b542408909090ff128b5c2404909090e8928bffffeb3ef6c101740783f9017c08eb11f641ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c7000500000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c20800833803740c89c1b828f17bb28b5d04ff138b4004c208009000000000a0010000|@6867,1048575,@389|44,0,0 64,1,@6843 97,0,0 112,0,6 178,0,@6871 256,0,0 282,1,@6874 307,0,@6876 346,0,2 381,0,4 396,0,@6863 7283:D3,416|3b650c7303ff5524a801757053ff7004ff30ff742420ff742420ff742420ff7424208b5c24208b4424108b5424189090ff125068546e7cb2ff74241cff74242cff74242cff74242c8b5c24288b44241890e812a7ffff5068546e7cb2ff742420ff742430ff742430ff7424308b5c242c8b44241c90e81ab3ffffeb05e90f0100008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40e43b45087303ff5520894500c740fc02000000894804c700c4757ab28d480cc741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e8caabffffeb0289c850ff742420ff742420ff742420ff742420ff7424208b5c241c8b4424189090e896feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c21400000000009c010000|@6329,2097151,@392|52,0,@7284 82,1,@6928 88,0,@7284 118,1,@6956 156,0,0 240,0,@5348 257,0,0 266,0,14 297,0,0 304,0,1 318,1,@6933 401,0,0 7284:O1|@7285 7285:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@7287,1048575,@391|16,1,@7286 7286:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e93d7cffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@390|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 7287:S70|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296d616b655072696e7465724964283129636f6465466f724964283129 7288:S6|7072696e742d 7289:O1|@7290 7290:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@393|1,0,@5280 7291:O1|@7292 7292:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@394|1,0,@5280 7293:O4|@4608,@5398,@7295,@7294 7294:O5|@6866,474,0,474,0 7295:S48|7072696e746572466f72547970653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 7296:O2|@5897,@7297 7297:O2|@7298,0 7298:O3|2,@7299,0 7299:S7|3c656d7074793e 7300:O3|14,@7296,1 7301:O1|@7302 7302:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@395|1,0,@5280 7303:S11|7072696e742d656d707479 7304:S42|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f6465283229 7305:S30|545950454944434f444528292e7072696e746572466f7254797065283329 7306:O8|@7202,@7037,0,0,@5276,1,0,1 7307:O4|@4608,@5398,@7309,@7308 7308:O5|@6866,144,0,144,0 7309:S19|6765744361636865645479706556616c756573 7310:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@398|64,0,0 7311:O3|@7312,@4683,@4657 7312:D3,1500|3b650c7303ff552489d9f6c10175358b31813e6ce539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01756db97c787cb2f6c10175358b31813e6ce539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01750e89c1b8287c7cb28b5d049090ff138b0f81396ce539b2741689c6b854eb7ab28b5d04eb05e90a000000909090ff138b7108eb1a8b0f81396ce539b2740d89c6b854eb7ab28b5d0490ff138b710889d9f6c10175378b39813f24e639b2751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b09890feb148b790489f93b650c7303ff5524ebc4bf0100000083ff017507b98c7c7cb2eb1b8b0f813924e639b2740c50b854eb7ab28b5d0490ff138b790889f983fe0174195052535156bad47c7cb2e8020900008b5424049090ff12eb0c89c7b80100000057525351566a016a016a016a018b44241cff7424288d4c240451ff7004ff70088b5c24288b4424309090e86e7800008b442404909090e85ed409008338037559837c24080175058b0424eb2b8b45008d40f03b45087303ff5520894500c740fc030000008b0c248948088b4c2408894804c700150000006a016a01837c241801741c50bad47c7cb29090e8620800008b5424209090ff12eb0de96200000089c1b801000000518b442428ff7424248d4c240851ff7004ff70088b5c24288b44241090e876ee01008b45008d40f03b45087303ff5520894500c740fc03000000c700004a86b28b4c240883c4048948045983c4048948088060ffbf83c424c204008b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000c701844a86b28b4c240cf6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c17eb06f641ff10750f89c2b834f67ab28b5d04909090ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44240c8907525789fb89d0ba284c86b2909090e88ed609008b04248b0083f8017507b868c05208eb4f89c189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b342489f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf8b4c2414f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c14eb06f641ff10750c89c2b834f67ab28b5d04ff13f6c101740583c1027105ff5538ebf689c2b8c4757ab283c4048d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44241089078b4c240c5257f6c1017520ff7104ff7424048b5c240c8b01909090e83ad90900593b650c7303ff5524ebdbb8010000008b04248b00b90100000083f801744889c283ea0283e802a801740583c0027105ff5538ebf68b1c248b4443fe8b75008d76f43b75087303ff5520897500c746fc02000000894e04890689d089f13b650c7303ff5524ebb38b45008d40f43b45087303ff5520894500c740fc020000008948048b4c240c83c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e816a2ffffeb0289c8837c241001742a89c18b45008d40f03b45087303ff5520894500c740fc030000008948088b4c2410894804c700150000006a016a01837c242001741650bad47c7cb290e80e0500008b5424289090ff12eb0889c1b801000000518b442430ff74242c8d4c240851ff7004ff70088b5c24308b4424109090e826eb01008b45008d40e83b45087303ff5520894500c740fc05000000c700a85386b28b4c240c83c4048948048b4c240c8948088b4c240489480c5983c40c8948108060ffbf83c424c2040090909000000000d8050000|@11951,2097151,@2202|19,0,@4658 69,0,0 79,0,@7313 92,0,@4658 142,0,0 154,0,@7368 169,0,@4658 178,0,@6377 206,0,@4658 215,0,@6377 239,0,@4681 291,0,0 301,0,@7372 311,0,@4681 319,0,@6377 345,0,@7375 350,1,@7377 367,0,0 414,1,@7783 426,1,@11910 486,0,10 503,0,@7375 510,1,@7377 532,0,0 566,1,@8344 596,0,@11914 653,0,0 659,0,@11916 692,0,16777214 709,0,@6401 739,0,0 794,0,@11934 802,1,@11936 817,0,I49 828,0,0 931,0,16777214 948,0,@6401 975,0,@5348 1054,1,@11943 1070,0,0 1080,0,0 1224,0,0 1233,0,14 1264,0,0 1271,0,1 1286,1,@6933 1339,0,10 1356,0,@7375 1362,1,@7377 1379,0,0 1414,1,@8344 1444,0,@11946 7313:O2|@7315,@7314 7314:O2|@7320,@7319 7315:O4|@4659,69,@7316,0 7316:O1|@7317 7317:D3,16|b801000000c39090000000000c000000|@7318,1,@399|1,0,0 7318:S18|44656275672e64656661756c74732d283129 7319:O2|@7324,@7323 7320:O4|@4660,69,@7321,0 7321:O1|@7322 7322:D3,16|b801000000c39090000000000c000000|@7318,1,@400|1,0,0 7323:O2|@7326,@7325 7324:O4|@4661,69,I48,0 7325:O2|@7330,@7329 7326:O4|@4662,69,@7327,0 7327:O1|@7328 7328:D3,16|b801000000c39090000000000c000000|@7318,1,@401|1,0,0 7329:O2|@7332,@7331 7330:O4|@4663,69,1,0 7331:O2|@7334,@7333 7332:O4|@4664,69,80,0 7333:O2|@7336,@7335 7334:O4|@4665,69,0,0 7335:O2|@7338,@7337 7336:O4|@4666,69,0,0 7337:O2|@7340,@7339 7338:O4|@4658,69,0,0 7339:O2|@7342,@7341 7340:O4|@4667,69,0,0 7341:O2|@7344,@7343 7342:O4|@4668,69,1,0 7343:O2|@7346,@7345 7344:O4|@4669,69,0,0 7345:O2|@7348,@7347 7346:O4|@4670,69,0,0 7347:O2|@7350,@7349 7348:O4|@4671,69,6,0 7349:O2|@7354,@7353 7350:O4|@4672,69,@7351,0 7351:O1|@7352 7352:D3,16|b801000000c39090000000000c000000|@7318,1,@402|1,0,0 7353:O2|@7356,@7355 7354:O4|@4673,69,77,0 7355:O2|@7358,@7357 7356:O4|@4674,69,0,0 7357:O2|@7360,@7359 7358:O4|@4675,69,0,0 7359:O2|@7362,@7361 7360:O4|@4676,69,0,0 7361:O2|@7364,@7363 7362:O4|@4677,69,0,0 7363:O2|@7366,@7365 7364:O4|@4678,69,0,0 7365:O2|@7367,0 7366:O4|@4679,69,1,0 7367:O4|@4680,69,1,0 7368:O4|@4608,@5398,@7370,@7369 7369:O5|@7371,126,0,126,0 7370:S11|746167206d697373696e67 7371:S28|6d6c736f757263652f4d4c436f6d70696c65722f44656275672e4d4c 7372:O1|@7373 7373:D3,16|b801000000c39090000000000c000000|@7374,1,@403|1,0,0 7374:S19|5072657474792e676574546167283229283129 7375:O3|@7377,@7376,@4607 7376:O2|@7763,@7375 7377:D3,6180|3b650c7303ff55248b08bb067d7cb28d5c8bfcffe390e93f020000909090e96f030000909090e9d7050000909090e95b000000909090e953070000909090e95f080000909090e927090000909090e96b0a0000909090e9bf0f0000909090e9bd0f0000909090e97f100000909090e91b120000909090e992120000909090e9f7140000909090e9b71600009090908b4808833905750e52ff700489c890e85effffffeb6b833909750f52ff700489c89090e84affffffeb5c52ff700489c8909090e83affffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701b89a7ab2eb0ae93d000000e9380000008d410cc740fc05000000894810c7400c01000000c7400803000000c7400405000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13508b5c24088b442404909090e8d6160000909090e8061800008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410803000000c7410405000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c70118e27ab28d410cc740fc020000008948045983c408890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c352ff700489d38b40089090e862170000909090e8e22700008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701a0a77cb28d410cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13508b4424048b542408909090e822fdffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701b89a7ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c352ff700cff70088b400490e85efcffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701c0a77cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13508b4424048b54240c909090e8cefbffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701d8a77cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13508b44240c8b542410909090e83efbffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701f0a77cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c3f64004017467f640040175138b48048b5808b808a87cb28b5d04909090ff1383780401756a8b4808f6c10175348b198b333b7208751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000891feb148b790489f93b650c7303ff5524ebc7bf0100000083ff017551eb05e9d60000008b4004ba44a87cb290e8e628000089c18b45008d40f43b4508730aeb05e9b4000000ff5520894500c740fc02000000894804c70007000000a801740d89c1b8ecd57ab28b5d0490ff13c38b0f8b193b5a08740e8b7004b854eb7ab28b5d0490ff138b7108833e0175298b45008d40f43b45087303ff5520894500c740fc020000008b7e04897804c7000f000000e9faf8ffff8b4004ba44a87cb2909090e85228000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c38b4004ba44a87cb2909090e80e28000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c38b48048339077506b85cca7cb2c38339037555bb030000008b4104bafc317ab2909090e87eadfdff89c3b87cca7cb2e8e286fdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c38339057553bb030000008b4104bafc317ab290e826adfdff89c3b88cca7cb2e88a86fdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c3bb030000008b4104bafc317ab29090e8d2acfdff89c3b89cca7cb2e83686fdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c352ff70088b4004e852f7ffff508b4424048b5424089090e842f7ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a8ca7cb28d410cc740fc020000008948045983c40889088b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701c0ca7cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c352ff700cff70088b400490e87ef6ffff50bb030000008b442404bafc317ab2e89eabfdff837c2408017507b948c05208eb05b9dcca7cb28b55008d52d03b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c701bb0000008d510cc742fc02000000894a0489028d420cc740fc02000000895004c700b70000009090e86a8afdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c70100457bb28d410cc740fc020000008948045983c40c890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c38b4804837914017407bb48c05208eb05bbecca7cb252ff31ff7108ff710cff711853ff71048b5910b8010000009090e81a4300008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff13518b5c2404b8450000009090e85a83fdffbb450000009090e84e83fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc020000008b542408895004c70007000000a801740f89c2b8ecd57ab28b5d04909090ff135150bb030000008b442414bafc317ab2e85ea9fdffbb18d07cb29090e8c282fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389cb8b4424189090e8164700005350bb51000000b8a8d07cb2909090e86e82fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24308b442404909090e84e470000909090e85e4800008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1350bbb7000000b82cd27cb290e8aa81fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442428909090e81a480000909090e8264900008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104b4d37cb289018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40b83b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701bca57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701909a7ab28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c41489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ccd37cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400409000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b4424048b542408909090e876f0ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c3b8e4d37cb2c352ff7004bb51000000b800d47cb2909090e86e7efdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24088b442404909090e8a2460000909090e8b24700008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c352ff70088b5a048b400490e8964700008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410803000000c7410405000000c70101000000f6c101740cb8ecd57ab28b5d049090ff13518b4424048b542408909090e8aeeeffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400803000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104bcd67cb289018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c701ecd67cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40d03b45087303ff5520894500c740fc02000000894804c70018e27ab28d480cc741fc02000000894104c70104d77cb28d410cc740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c3528b4004909090e866edffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7001cd77cb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c404c38b4808bb01000000be0100000052ff7004ff700cff31ff70083b742404736489f083c0028b0c246a016a015350ff71048d54240c52bb1100000089f0909090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045e83c40c89c33b650c7303ff5524e95bffffff89d8bb03000000bafc317ab29090e856a1fdff50bb030000008b442408bafc317ab2e842a1fdff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410438d77cb289018d410cc740fc02000000894804c7005f0000008d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c70050d77cb29090e81280fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b44240c8b542414909090e85eebffff508b4424148b5424189090e84eebffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc020000008948045983c414890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c38b4804f6c101740783f9017d21eb06f641ff10741952ff7008ff700c89cbb88c6c7ab2909090ff1588c75208eb0b8b58088b700c89c8525356bb05000000bafc317ab2e8729ffdff8b0c24f6c101740783f9017d19eb06f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c852bb05000000bafc317ab29090e8369ffdff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410468d77cb289018d410cc740fc02000000894804c70044d77cb28d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c70074d77cb2909090e8027efdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b542408909090e84ee9ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c3837808017507b984d77cb2eb05b994d77cb252ff7004bb5100000089c89090e83e77fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24088b442404909090e80a430000909090e81a4400008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c390900000000020180000|@7762,2097151,@437|11,0,$7377+22 225,0,@5642 246,0,@5643 265,0,@5594 297,0,0 304,0,1 311,0,2 317,0,0 328,0,@6321 350,1,@7378 358,1,@7380 391,0,@5643 410,0,@5594 430,0,0 437,0,1 444,0,2 450,0,0 460,0,@6321 496,0,0 517,0,@6364 558,0,0 565,0,0 572,0,2 578,0,0 589,0,@6321 614,1,@7381 622,1,@7413 655,0,@7414 675,0,0 682,0,1 689,0,1 695,0,0 706,0,@6321 761,0,@5642 782,0,@5643 801,0,@5594 820,0,@5643 873,0,0 880,0,0 887,0,3 893,0,0 904,0,@6321 957,0,0 978,0,@5592 997,0,@7416 1017,0,0 1024,0,0 1031,0,2 1037,0,0 1048,0,@6321 1101,0,0 1122,0,@5592 1141,0,@7418 1161,0,0 1168,0,0 1175,0,2 1181,0,0 1192,0,@6321 1245,0,0 1266,0,@5592 1285,0,@7420 1305,0,0 1312,0,0 1319,0,2 1325,0,0 1336,0,@6321 1372,0,0 1395,0,@5592 1444,0,@5592 1497,0,0 1504,0,1 1511,0,0 1517,0,0 1528,0,@6321 1557,0,@7422 1636,0,0 1656,0,@7425 1662,1,@7427 1704,0,3 1715,0,@6321 1739,0,@6377 1789,0,7 1802,0,@7425 1810,1,@7427 1845,0,3 1856,0,@6321 1870,0,@7425 1878,1,@7427 1913,0,3 1924,0,@6321 1943,0,@7697 1954,0,1 1962,0,@5052 1970,1,@5053 1977,0,@7699 1982,1,@4940 2017,0,3 2028,0,@6321 2044,0,1 2052,0,@5052 2058,1,@5053 2065,0,@7700 2070,1,@4940 2105,0,3 2116,0,@6321 2127,0,1 2135,0,@5052 2142,1,@5053 2149,0,@7701 2154,1,@4940 2189,0,3 2200,0,@6321 2265,0,@5590 2286,0,@5592 2305,0,@7702 2357,0,@7704 2377,0,0 2384,0,0 2391,0,3 2397,0,0 2408,0,@6321 2436,0,1 2445,0,@5052 2450,1,@5053 2462,0,I48 2469,0,@7706 2500,0,0 2521,0,93 2555,0,91 2562,1,@4953 2595,0,3 2605,0,@6321 2644,0,0 2665,0,@6583 2706,0,0 2713,0,0 2720,0,2 2726,0,0 2737,0,@6321 2760,0,I48 2767,0,@7707 2791,0,0 2798,1,@7708 2832,0,0 2839,0,0 2846,0,0 2852,0,0 2862,0,@6321 2879,0,34 2886,1,@4940 2891,0,34 2898,1,@4940 2931,0,3 2941,0,@6321 2986,0,3 2997,0,@6321 3012,0,1 3021,0,@5052 3026,1,@5053 3031,0,@7722 3038,1,@4940 3071,0,3 3081,0,@6321 3102,1,@7723 3109,0,40 3114,0,@7724 3122,1,@4940 3155,0,3 3165,0,@6321 3190,1,@7725 3198,1,@7726 3265,0,0 3272,0,1 3279,0,1 3285,0,0 3296,0,@6321 3307,0,91 3312,0,@7727 3318,1,@4940 3351,0,3 3361,0,@6321 3382,1,@7728 3390,1,@7729 3454,0,0 3461,0,1 3468,0,1 3474,0,0 3485,0,@6321 3524,0,@7730 3547,0,@5592 3596,0,@5592 3647,0,@5592 3696,0,@5592 3747,0,@5592 3766,0,@7409 3787,0,@5592 3806,0,@5591 3827,0,@5592 3879,0,@5592 3898,0,@7732 3918,0,0 3925,0,0 3932,0,4 3938,0,0 3949,0,@6321 4005,0,0 4026,0,@6364 4079,0,0 4086,0,1 4093,0,2 4099,0,0 4110,0,@6321 4123,0,@7734 4133,0,40 4138,0,@7736 4146,1,@4940 4179,0,3 4189,0,@6321 4214,1,@7737 4222,1,@7738 4289,0,0 4296,0,1 4303,0,1 4309,0,0 4320,0,@6321 4342,1,@7739 4376,0,0 4383,0,1 4390,0,2 4396,0,0 4406,0,@6321 4461,0,0 4483,0,0 4490,0,1 4497,0,2 4503,0,0 4514,0,@6321 4552,0,@7743 4575,0,@6364 4594,0,@7747 4615,0,@5592 4667,0,@6364 4686,0,@7749 4706,0,0 4713,0,1 4720,0,0 4726,0,0 4737,0,@6321 4789,0,@5642 4810,0,@7751 4832,0,0 4839,0,1 4846,0,1 4852,0,0 4863,0,@6321 4881,0,0 4886,0,0 4931,0,8 4942,0,I104 4966,0,1 4979,0,31 5002,0,0 5014,0,1 5070,0,1 5075,0,@5052 5082,1,@5053 5088,0,1 5097,0,@5052 5102,1,@5053 5133,0,@7753 5154,0,47 5203,0,@7755 5210,1,@4953 5243,0,3 5253,0,@6321 5325,0,@5642 5346,0,@5592 5365,0,@5593 5384,0,@5643 5455,0,0 5462,0,0 5469,0,3 5475,0,0 5486,0,@6321 5529,0,@5215 5538,0,I106 5556,0,2 5561,0,@5052 5566,1,@5053 5595,0,@5215 5602,0,I106 5614,0,2 5619,0,@5052 5626,1,@5053 5657,0,@7756 5678,0,@7754 5730,0,@7757 5738,1,@4953 5771,0,3 5781,0,@6321 5837,0,@5642 5858,0,@5592 5911,0,0 5918,0,0 5925,0,3 5931,0,0 5942,0,@6321 5961,0,@7758 5968,0,@7759 5977,0,40 5986,1,@4940 6019,0,3 6029,0,@6321 6054,1,@7760 6062,1,@7761 6129,0,0 6136,0,1 6143,0,1 6149,0,0 6160,0,@6321 7378:D3,260|3b650c7303ff5524a801757583780401752c8b008b0089daff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b0853ff70048b0189daff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@404|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7379:S23|42617365436f6465547265652e704c6973742833292829 7380:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@405|56,0,@5642 7381:D3,1672|3b650c7303ff5524a801756e83780401756d8b008b08ff710853ff31bb030000008b4104bafc317ab2e83a9bfdff89c3b8589d7cb2e89e74fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c05208eb0ae9f8050000e98702000090e84e74fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e8e6050000909090e8ba0d00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b4424108b54240c9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49ac3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c70124287bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40c43b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70158477bb28d410cc740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b088b1153ff7004ff7208ff32bb030000008b4204bafc317ab2e83e98fdff89c3b8589d7cb2e8a271fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c0520890e85e71fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e85e0b0000909090e86a0c00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b44240c8b5424149090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49ac3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c70124287bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40c43b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70158477bb28d410cc740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c74004ac627bb289088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff13518b5c24088b442404909090e8bef9ffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000084060000|@7379,2097151,@417|29,0,1 37,0,@5052 42,1,@5053 49,0,@7382 54,1,@4940 87,0,3 97,0,@6321 111,0,91 116,0,I48 134,1,@4940 167,0,3 177,0,@6321 198,1,@7383 206,1,@7406 270,0,0 277,0,1 284,0,1 290,0,0 301,0,@6321 353,0,0 375,0,0 382,0,0 389,0,2 395,0,0 406,0,@6321 444,0,0 467,0,@6364 486,0,@6503 507,0,@5592 526,0,@7407 547,0,@5592 596,0,@5592 615,0,@6594 634,0,@7409 653,0,@5592 706,0,0 713,0,0 720,0,1 726,0,0 736,0,@6321 772,0,0 793,0,1 801,0,@5052 806,1,@5053 813,0,@7382 818,1,@4940 851,0,3 861,0,@6321 875,0,91 880,0,I48 886,1,@4940 919,0,3 929,0,@6321 950,1,@7411 958,1,@7412 1022,0,0 1029,0,1 1036,0,1 1042,0,0 1053,0,@6321 1105,0,0 1127,0,0 1134,0,0 1141,0,2 1147,0,0 1158,0,@6321 1196,0,0 1219,0,@6364 1238,0,@6503 1259,0,@5592 1278,0,@7407 1299,0,@5592 1348,0,@5592 1367,0,@6594 1386,0,@7409 1405,0,@5592 1458,0,0 1465,0,0 1472,0,1 1478,0,0 1488,0,@6321 1524,0,@6617 1546,0,0 1553,0,0 1560,0,0 1566,0,0 1576,0,@6321 1631,0,@5592 1656,0,0 7382:S9|76616c204c6f63616c 7383:D3,256|3b650c7303ff5524a801757583780401752c8b0090e8fa00000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e8ca0000008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@413|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7384:D3,540|3b650c7303ff55248338057573ff7008bb030000008b4004bafc317ab2e88293fdff89c3b8b0a07cb2e8e66cfdffbbb70000009090e8da6cfdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbc0a07cb28b4424049090e8ca010000eb05e96d000000e8d60200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c383380175768b58048b4008e8de0200005089d9bbc0a07cb289c890e89e030000909090e8ae0400008b4d008d49c43b4d087303ff5520894d00c741fc02000000894104c701b89a7ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701b0577bb28d410cc740fc02000000eb05e98f000000894804c7009c9a7ab28d480cc741fc02000000894104c701909a7ab283f90175058b0424eb0a89cb8b0424e8820400008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701b89a7ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c404c38338037406b8fca47cb2c3b808a57cb2c390900000000018020000|@7405,2097151,@412|17,0,1 25,0,@5052 30,1,@5053 37,0,@7385 42,1,@4940 47,0,91 54,1,@4940 87,0,3 97,0,@6321 111,0,@7386 122,1,@7387 134,1,@7388 201,0,0 208,0,1 215,0,1 221,0,0 232,0,@6321 254,1,@7392 262,0,@7386 270,1,@7399 278,1,@7400 311,0,@5594 330,0,@5592 349,0,@6603 375,0,@5592 394,0,@5591 414,1,@7401 447,0,@5594 467,0,0 474,0,1 481,0,1 487,0,0 498,0,@6321 519,0,@7402 525,0,@7403 7385:S8|5573654669656c64 7386:O1|@7384 7387:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@406|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7388:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@407|56,0,@7389 7389:O2|@5643,@7390 7390:O2|@7391,0 7391:O2|3,93 7392:D3,104|3b650c7303ff5524a801754b837804017506b8dca27cb2c38b40049090e8deffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f4a27cb2c3b801000000c39090900000000064000000|@7379,3,@408|19,0,@7393 63,0,@5592 82,0,@7395 88,0,0 7393:O2|@7394,0 7394:O2|3,45 7395:O5|0,0,0,0,@7396 7396:O2|@7394,@7397 7397:O2|@5643,@7398 7398:O2|@6582,0 7399:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410418a37cb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@409|55,0,0 101,0,@7397 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7400:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@410|56,0,@5642 7401:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@411| 7402:O2|3,95 7403:O2|3,@7404 7404:S6|4578706f7274 7405:S27|42617365436f6465547265652e7072657474795573616765283129 7406:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@414|56,0,@7389 7407:O2|3,@7408 7408:S2|2a29 7409:O2|3,@7410 7410:S2|282a 7411:D3,256|3b650c7303ff5524a801757583780401752c8b0090e892f8ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e862f8ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@415|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7412:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@416|56,0,@7389 7413:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@418|56,0,@5642 7414:O2|3,@7415 7415:S10|424547494e4c4f4f5028 7416:O2|3,@7417 7417:S2|6966 7418:O2|3,@7419 7419:S4|7468656e 7420:O2|3,@7421 7421:S4|656c7365 7422:O4|@4636,@6326,@7424,@7423 7423:O5|@6328,114,0,114,0 7424:S7|746f53686f7274 7425:O3|@7427,@7426,@4636 7426:O256|@7442,@7443,@7444,@7445,@7446,@7447,@7448,@7449,@7450,@7451,@7452,@7453,@7454,@7455,@7456,@7457,@7458,@7459,@7460,@7461,@7462,@7463,@7464,@7465,@7466,@7467,@7468,@7469,@7470,@7471,@7472,@7473,@7474,@7475,@7476,@7477,@7478,@7479,@7480,@7481,@7482,@7483,@7484,@7485,@7486,@7487,@7488,@7489,@7490,@7491,@7492,@7493,@7494,@7495,@7496,@7497,@7498,@7499,@7500,@7501,@7502,@7503,@7504,@7505,@7506,@7507,@7508,@7509,@7510,@7511,@7512,@7513,@7514,@7515,@7516,@7517,@7518,@7519,@7520,@7521,@7522,@7523,@7524,@7525,@7526,@7527,@7528,@7529,@7530,@7531,@7532,@7533,@7534,@7535,@7536,@7537,@7538,@7539,@7540,@7541,@7542,@7543,@7544,@7545,@7546,@7547,@7548,@7549,@7550,@7551,@7552,@7553,@7554,@7555,@7556,@7557,@7558,@7559,@7560,@7561,@7562,@7563,@7564,@7565,@7566,@7567,@7568,@7569,@7570,@7571,@7572,@7573,@7574,@7575,@7576,@7577,@7578,@7579,@7580,@7581,@7582,@7583,@7584,@7585,@7586,@7587,@7588,@7589,@7590,@7591,@7592,@7593,@7594,@7595,@7596,@7597,@7598,@7599,@7600,@7601,@7602,@7603,@7604,@7605,@7606,@7607,@7608,@7609,@7610,@7611,@7612,@7613,@7614,@7615,@7616,@7617,@7618,@7619,@7620,@7621,@7622,@7623,@7624,@7625,@7626,@7627,@7628,@7629,@7630,@7631,@7632,@7633,@7634,@7635,@7636,@7637,@7638,@7639,@7640,@7641,@7642,@7643,@7644,@7645,@7646,@7647,@7648,@7649,@7650,@7651,@7652,@7653,@7654,@7655,@7656,@7657,@7658,@7659,@7660,@7661,@7662,@7663,@7664,@7665,@7666,@7667,@7668,@7669,@7670,@7671,@7672,@7673,@7674,@7675,@7676,@7677,@7678,@7679,@7680,@7681,@7682,@7683,@7684,@7685,@7686,@7687,@7688,@7689,@7690,@7691,@7692,@7693,@7694,@7695,@7696,@7441 7427:D3,952|3b650c7303ff5524a801743aa801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208bb05000000bafc317ab290e89285fdff89c3b824b07cb2e9f65efdffa801743b8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c00d67ab2c7410864d67ab2c7410458d67ab28b5a08891989c689c88b5d04ff13505289c3b8cd0000009090ff1508cd520883f801745fb80100000081f801020000750d89c1b830b07cb28b5d0490ff13509090ff15e8d152083b442408753bf604240174188b4424048b5004b9ffffff00234afc8d4c09013b0c24770bb8cc7b7ab28b5d0490ff138b0c248b4c4afe89c883c40cc3e91900000058a801740583c0027105ff5538ebf63b650c7303ff5524eb888b4c24040fb641ff8d44000183e00783f805752789cbb8d300000090ff1508cd520889c3b878b07cb2e8f65dfdffbb4500000083c408e9e95dfdff0fb641ff8d44000183e00783f8037571b8ffffff002341fc8d440001a801740783f8017d16eb06f640ff10740e89c3b88c6c7ab290ff1588c75208bb0900000090ff15c8c75208a801740783f8217c0deb06f640ff107505b821000000ff7424046888b07cb289e39090e8da020000bbc4097ab283c408909090e8ea60fdffeb05e90f00000089c3b81cb27cb283c408e9545dfdfff6c101743c8b04248b55008d52ec3b55087303ff5520895500c742fc04000000c7420c00d67ab2c7420864d67ab2c7420458d67ab28b5808891a89d08b5d04ff130fb641ff8d44000183e00783f801755bf6c101743f8b04248b55008d52ec3b55087303ff5520895500c742fc04000000c7420c00d67ab2c7420864d67ab2c7420458d67ab28b5808891a89d08b5d04909090ff13b8ffffff002341fc8d440001a801740c83f8017d1ceb0be90b010000f640ff10740f89c3b88c6c7ab29090ff1588c75208a801740783f8037c61eb06f640ff10755ef644240401743f8b04248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c00d67ab2c7410864d67ab2c7410458d67ab28b5008891189c88b5d04909090ff138b4424048b00a801756da801744a8b0c24eb0ae987000000e9820000008b55008d52ec3b55087303ff5520895500c742fc04000000c7420c00d67ab2c7420864d67ab2c7420458d67ab28b4908890a89c189d08b5d04ff130fb648ff8d4c090183e10783f905752e89c3b8d3000000ff1508cd5208eb05e91a00000089c3b830b27cb290e8ae5bfdffbb4500000083c408e9a15bfdffb840b27cb283c408c3b840b27cb283c408c390909000000000b4030000|@7440,2097151,@421|32,0,@5215 38,0,I106 43,0,2 48,0,@5052 54,1,@5053 61,0,@7428 66,1,@4940 101,0,@6322 108,0,@6327 115,0,@6326 138,0,102 146,0,I150 156,0,0 162,0,256 171,0,@7429 186,0,I189 210,0,8388607 227,0,@5401 303,0,105 310,0,I150 317,0,@7432 322,1,@4940 327,0,34 335,1,@4940 356,0,8388607 387,0,@5215 394,0,I106 399,0,4 406,0,I108 428,0,16 437,0,@7433 446,1,@7435 451,0,@4925 462,1,@4948 476,0,@7437 484,1,@4940 523,0,@6322 530,0,@6327 537,0,@6326 604,0,@6322 611,0,@6327 618,0,@6326 638,0,8388607 674,0,@5215 682,0,I106 740,0,@6322 747,0,@6327 754,0,@6326 829,0,@6322 836,0,@6327 843,0,@6326 880,0,105 886,0,I150 900,0,@7438 906,1,@4940 911,0,34 919,1,@4940 924,0,@7439 933,0,@7439 7428:S3|4c4954 7429:O4|103,@4956,@7431,@7430 7430:O5|@6328,416,0,416,0 7431:S17|556e6b6e6f776e2052545320656e747279 7432:S6|434f44452022 7433:D3,48|a80175108b08f640ff107402f7d98d4c0901eb0289c18b5204d1e90fb60c0a8d4c090189c8c39090000000002c000000|@7434,7,@419| 7434:S31|416464726573732e737472696e674f66576f7264283129646174612d283129 7435:D3,248|3b650c7303ff552483f8037509b80100000089daff2283f8017506b848c05208c3a8017411a801740783f8017d17eb06f640ff10740f89c1b80c117ab28b5d04909090ff1389c183c10ec1e90283c90181f9ffffff01720d89c2b8e00c7ab28b5d0490ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1ea89178d541201b8010000005357523b0424733089c183c10850518b54241090ff128b4c240c5ad1ead1e88804118d4400018d5412015883c0023b650c7303ff5524ebcb8b44240483c4048060ffbf83c408c39000000000f4000000|@7436,1048575,@420|14,0,0 28,0,I48 57,0,@4949 82,0,16777215 91,0,@4941 104,0,0 164,0,0 7436:S18|537472696e672e746162756c617465283229 7437:S9|425954452064617461 7438:S5|46554e2022 7439:S20|4c4954203c6c6f6e6720776f726420646174613e 7440:S23|416464726573732e737472696e674f66576f7264283129 7441:S20|504f4c595f5359535f61737369676e5f776f7264 7442:S5|2052545330 7443:S13|504f4c595f5359535f65786974 7444:S5|2052545332 7445:S5|2052545333 7446:S5|2052545334 7447:S5|2052545335 7448:S5|2052545336 7449:S5|2052545337 7450:S5|2052545338 7451:S14|504f4c595f5359535f6368646972 7452:S6|205254533130 7453:S20|504f4c595f5359535f616c6c6f635f73746f7265 7454:S21|504f4c595f5359535f616c6c6f635f756e696e6974 7455:S6|205254533133 7456:S15|504f4c595f5359535f726169736578 7457:S19|504f4c595f5359535f6765745f6c656e677468 7458:S6|205254533136 7459:S18|504f4c595f5359535f6765745f666c616773 7460:S6|205254533138 7461:S6|205254533139 7462:S6|205254533230 7463:S6|205254533231 7464:S6|205254533232 7465:S20|504f4c595f5359535f7374725f636f6d70617265 7466:S6|205254533234 7467:S6|205254533235 7468:S19|504f4c595f5359535f74657374737472677472 7469:S19|504f4c595f5359535f746573747374726c7373 7470:S19|504f4c595f5359535f74657374737472676571 7471:S19|504f4c595f5359535f746573747374726c6571 7472:S24|504f4c595f5359535f657863657074696f6e5f7472616365 7473:S22|504f4c595f5359535f676976655f65785f7472616365 7474:S27|504f4c595f5359535f657863657074696f6e5f74726163655f666e 7475:S25|504f4c595f5359535f676976655f65785f74726163655f666e 7476:S6|205254533334 7477:S6|205254533335 7478:S6|205254533336 7479:S6|205254533337 7480:S6|205254533338 7481:S6|205254533339 7482:S6|205254533430 7483:S6|205254533431 7484:S6|205254533432 7485:S6|205254533433 7486:S6|205254533434 7487:S6|205254533435 7488:S6|205254533436 7489:S16|504f4c595f5359535f6c6f636b736567 7490:S20|504f4c595f5359535f656d707479737472696e67 7491:S19|504f4c595f5359535f6e756c6c766563746f72 7492:S6|205254533530 7493:S16|504f4c595f5359535f6e6574776f726b 7494:S20|504f4c595f5359535f6f735f7370656369666963 7495:S20|504f4c595f5359535f65715f6c6f6e67776f7264 7496:S21|504f4c595f5359535f6e65715f6c6f6e67776f7264 7497:S21|504f4c595f5359535f6765715f6c6f6e67776f7264 7498:S21|504f4c595f5359535f6c65715f6c6f6e67776f7264 7499:S20|504f4c595f5359535f67745f6c6f6e67776f7264 7500:S20|504f4c595f5359535f6c745f6c6f6e67776f7264 7501:S6|205254533539 7502:S6|205254533630 7503:S20|504f4c595f5359535f696f5f6469737061746368 7504:S23|504f4c595f5359535f7369676e616c5f68616e646c6572 7505:S6|205254533633 7506:S6|205254533634 7507:S6|205254533635 7508:S6|205254533636 7509:S6|205254533637 7510:S6|205254533638 7511:S21|504f4c595f5359535f61746f6d69635f7265736574 7512:S20|504f4c595f5359535f61746f6d69635f696e6372 7513:S20|504f4c595f5359535f61746f6d69635f64656372 7514:S20|504f4c595f5359535f7468726561645f73656c66 7515:S24|504f4c595f5359535f7468726561645f6469737061746368 7516:S22|504f4c595f5359535f706c75735f6c6f6e67776f7264 7517:S23|504f4c595f5359535f6d696e75735f6c6f6e67776f7264 7518:S21|504f4c595f5359535f6d756c5f6c6f6e67776f7264 7519:S21|504f4c595f5359535f6469765f6c6f6e67776f7264 7520:S21|504f4c595f5359535f6d6f645f6c6f6e67776f7264 7521:S22|504f4c595f5359535f616e64625f6c6f6e67776f7264 7522:S21|504f4c595f5359535f6f72625f6c6f6e67776f7264 7523:S22|504f4c595f5359535f786f72625f6c6f6e67776f7264 7524:S6|205254533832 7525:S6|205254533833 7526:S18|504f4c595f5359535f6b696c6c5f73656c66 7527:S28|504f4c595f5359535f73686966745f6c6566745f6c6f6e67776f7264 7528:S29|504f4c595f5359535f73686966745f72696768745f6c6f6e67776f7264 7529:S35|504f4c595f5359535f73686966745f72696768745f61726974685f6c6f6e67776f7264 7530:S17|504f4c595f5359535f70726f66696c6572 7531:S27|504f4c595f5359535f6c6f6e67776f72645f746f5f746167676564 7532:S27|504f4c595f5359535f7369676e65645f746f5f6c6f6e67776f7264 7533:S29|504f4c595f5359535f756e7369676e65645f746f5f6c6f6e67776f7264 7534:S16|504f4c595f5359535f66756c6c5f6763 7535:S20|504f4c595f5359535f737461636b5f7472616365 7536:S24|504f4c595f5359535f74696d696e675f6469737061746368 7537:S6|205254533935 7538:S6|205254533936 7539:S6|205254533937 7540:S6|205254533938 7541:S16|504f4c595f5359535f6f626a73697a65 7542:S17|504f4c595f5359535f73686f7773697a65 7543:S7|20525453313031 7544:S7|20525453313032 7545:S7|20525453313033 7546:S16|504f4c595f5359535f71756f7472656d 7547:S17|504f4c595f5359535f69735f73686f7274 7548:S14|504f4c595f5359535f61706c7573 7549:S15|504f4c595f5359535f616d696e7573 7550:S13|504f4c595f5359535f616d756c 7551:S13|504f4c595f5359535f61646976 7552:S13|504f4c595f5359535f616d6f64 7553:S13|504f4c595f5359535f616e6567 7554:S13|504f4c595f5359535f786f7261 7555:S15|504f4c595f5359535f657175616c61 7556:S12|504f4c595f5359535f6f7261 7557:S13|504f4c595f5359535f616e6461 7558:S7|20525453313136 7559:S17|504f4c595f5359535f5265616c5f737472 7560:S17|504f4c595f5359535f5265616c5f676571 7561:S17|504f4c595f5359535f5265616c5f6c6571 7562:S17|504f4c595f5359535f5265616c5f677472 7563:S17|504f4c595f5359535f5265616c5f6c7373 7564:S16|504f4c595f5359535f5265616c5f6571 7565:S17|504f4c595f5359535f5265616c5f6e6571 7566:S22|504f4c595f5359535f5265616c5f4469737061746368 7567:S17|504f4c595f5359535f4164645f7265616c 7568:S17|504f4c595f5359535f5375625f7265616c 7569:S17|504f4c595f5359535f4d756c5f7265616c 7570:S17|504f4c595f5359535f4469765f7265616c 7571:S17|504f4c595f5359535f4162735f7265616c 7572:S17|504f4c595f5359535f4e65675f7265616c 7573:S7|20525453313331 7574:S7|20525453313332 7575:S18|504f4c595f5359535f636f6e765f7265616c 7576:S20|504f4c595f5359535f7265616c5f746f5f696e74 7577:S20|504f4c595f5359535f696e745f746f5f7265616c 7578:S18|504f4c595f5359535f737172745f7265616c 7579:S17|504f4c595f5359535f73696e5f7265616c 7580:S17|504f4c595f5359535f636f735f7265616c 7581:S20|504f4c595f5359535f61726374616e5f7265616c 7582:S17|504f4c595f5359535f6578705f7265616c 7583:S16|504f4c595f5359535f6c6e5f7265616c 7584:S7|20525453313432 7585:S7|20525453313433 7586:S7|20525453313434 7587:S7|20525453313435 7588:S7|20525453313436 7589:S7|20525453313437 7590:S14|504f4c595f5359535f737464696e 7591:S15|504f4c595f5359535f7374646f7574 7592:S20|504f4c595f5359535f70726f636573735f656e76 7593:S26|504f4c595f5359535f7365745f737472696e675f6c656e677468 7594:S28|504f4c595f5359535f6765745f66697273745f6c6f6e675f776f7264 7595:S22|504f4c595f5359535f706f6c795f7370656369666963 7596:S19|504f4c595f5359535f627974657665635f6571 7597:S7|20525453313535 7598:S7|20525453313536 7599:S7|20525453313537 7600:S7|20525453313538 7601:S7|20525453313539 7602:S20|504f4c595f5359535f636d656d5f6c6f61645f38 7603:S21|504f4c595f5359535f636d656d5f6c6f61645f3136 7604:S21|504f4c595f5359535f636d656d5f6c6f61645f3332 7605:S21|504f4c595f5359535f636d656d5f6c6f61645f3634 7606:S24|504f4c595f5359535f636d656d5f6c6f61645f666c6f6174 7607:S25|504f4c595f5359535f636d656d5f6c6f61645f646f75626c65 7608:S21|504f4c595f5359535f636d656d5f73746f72655f38 7609:S22|504f4c595f5359535f636d656d5f73746f72655f3136 7610:S22|504f4c595f5359535f636d656d5f73746f72655f3332 7611:S22|504f4c595f5359535f636d656d5f73746f72655f3634 7612:S25|504f4c595f5359535f636d656d5f73746f72655f666c6f6174 7613:S26|504f4c595f5359535f636d656d5f73746f72655f646f75626c65 7614:S7|20525453313732 7615:S7|20525453313733 7616:S7|20525453313734 7617:S7|20525453313735 7618:S7|20525453313736 7619:S7|20525453313737 7620:S7|20525453313738 7621:S7|20525453313739 7622:S7|20525453313830 7623:S7|20525453313831 7624:S7|20525453313832 7625:S7|20525453313833 7626:S7|20525453313834 7627:S7|20525453313835 7628:S7|20525453313836 7629:S7|20525453313837 7630:S7|20525453313838 7631:S21|504f4c595f5359535f696f5f6f7065726174696f6e 7632:S12|504f4c595f5359535f666669 7633:S7|20525453313931 7634:S7|20525453313932 7635:S7|20525453313933 7636:S26|504f4c595f5359535f7365745f636f64655f636f6e7374616e74 7637:S19|504f4c595f5359535f6d6f76655f776f726473 7638:S31|504f4c595f5359535f73686966745f72696768745f61726974685f776f7264 7639:S7|20525453313937 7640:S19|504f4c595f5359535f6d6f76655f6279746573 7641:S7|20525453313939 7642:S19|504f4c595f5359535f636f64655f666c616773 7643:S21|504f4c595f5359535f736872696e6b5f737461636b 7644:S15|504f4c595f5359535f737464657272 7645:S7|20525453323033 7646:S24|504f4c595f5359535f63616c6c636f64655f7475706c6564 7647:S25|504f4c595f5359535f666f726569676e5f6469737061746368 7648:S7|20525453323036 7649:S7|20525453323037 7650:S7|20525453323038 7651:S17|504f4c595f5359535f5857696e646f7773 7652:S7|20525453323130 7653:S7|20525453323131 7654:S7|20525453323132 7655:S22|504f4c595f5359535f69735f6269675f656e6469616e 7656:S23|504f4c595f5359535f62797465735f7065725f776f7264 7657:S23|504f4c595f5359535f6f66667365745f61646472657373 7658:S25|504f4c595f5359535f73686966745f72696768745f776f7264 7659:S17|504f4c595f5359535f776f72645f6e6571 7660:S17|504f4c595f5359535f6e6f745f626f6f6c 7661:S7|20525453323139 7662:S7|20525453323230 7663:S7|20525453323231 7664:S7|20525453323232 7665:S22|504f4c595f5359535f737472696e675f6c656e677468 7666:S7|20525453323234 7667:S7|20525453323235 7668:S7|20525453323236 7669:S7|20525453323237 7670:S20|504f4c595f5359535f746f7563685f66696e616c 7671:S7|20525453323239 7672:S7|20525453323330 7673:S16|504f4c595f5359535f696e745f676571 7674:S16|504f4c595f5359535f696e745f6c6571 7675:S16|504f4c595f5359535f696e745f677472 7676:S16|504f4c595f5359535f696e745f6c7373 7677:S24|504f4c595f5359535f6c6f61645f627974655f696d6d7574 7678:S24|504f4c595f5359535f6c6f61645f776f72645f696d6d7574 7679:S7|20525453323337 7680:S17|504f4c595f5359535f6d756c5f776f7264 7681:S18|504f4c595f5359535f706c75735f776f7264 7682:S19|504f4c595f5359535f6d696e75735f776f7264 7683:S17|504f4c595f5359535f6469765f776f7264 7684:S16|504f4c595f5359535f6f725f776f7264 7685:S17|504f4c595f5359535f616e645f776f7264 7686:S17|504f4c595f5359535f786f725f776f7264 7687:S24|504f4c595f5359535f73686966745f6c6566745f776f7264 7688:S17|504f4c595f5359535f6d6f645f776f7264 7689:S17|504f4c595f5359535f776f72645f676571 7690:S17|504f4c595f5359535f776f72645f6c6571 7691:S17|504f4c595f5359535f776f72645f677472 7692:S17|504f4c595f5359535f776f72645f6c7373 7693:S16|504f4c595f5359535f776f72645f6571 7694:S18|504f4c595f5359535f6c6f61645f62797465 7695:S18|504f4c595f5359535f6c6f61645f776f7264 7696:S20|504f4c595f5359535f61737369676e5f62797465 7697:O2|3,@7698 7698:S9|526563757273697665 7699:S7|436c6f73757265 7700:S5|4c6f63616c 7701:S3|417267 7702:O2|3,@7703 7703:S4|57495448 7704:O2|3,@7705 7705:S7|48414e444c4528 7706:S5|282a562a29 7707:S7|696e6c696e652c 7708:D3,596|3b650c7303ff552483fb017506b801000000c38b0bff730450ff31ff7104bb03000000bafc317ab290e8fa66fdff89c3b89cca7cb2e85e40fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c0520890e81a40fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e8aa010000909090e8b60200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c4048901833c24017407b801000000eb05b8d4ce7cb2f6442408017507ba08cf7cb2eb05ba0100000083fa01740c89ce89d390e89602000089f183f801740b89c389c8e8de02000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400409000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c40459f6c101740583c1027105ff5538ebf6508b5c240489c89090e8dafdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c390900000000050020000|@7721,2097151,@426|14,0,0 31,0,1 36,0,@5052 42,1,@5053 49,0,@7701 54,1,@4940 87,0,3 97,0,@6321 111,0,91 116,0,I48 122,1,@4940 155,0,3 165,0,@6321 186,1,@7709 194,1,@7710 258,0,0 265,0,1 272,0,1 278,0,0 289,0,@6321 328,0,0 351,0,@5592 381,0,0 388,0,@7711 400,0,@7715 407,0,0 422,1,@7719 438,1,@7720 474,0,0 481,0,0 488,0,4 494,0,0 505,0,@6321 7709:D3,256|3b650c7303ff5524a801757583780401752c8b0090e802d1ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e8d2d0ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@422|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7710:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@423|56,0,@7389 7711:O2|@5592,@7712 7712:O2|@7713,0 7713:O2|3,@7714 7714:S5|3a7265616c 7715:O2|@5643,@7716 7716:O2|@5593,@7717 7717:O2|@7718,0 7718:O3|1,1,0 7719:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@424| 7720:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@425| 7721:S34|42617365436f6465547265652e7072657474792831297072696e7441726773283229 7722:S8|206c6f63616c732c 7723:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70109000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@427|43,0,4 92,0,0 7724:S8|636c6f737572653d 7725:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@428|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7726:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@429|56,0,@5642 7727:S14|726563757273697665207573653d 7728:D3,256|3b650c7303ff5524a801757583780401752c8b0090e822ccffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e8f2cbffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@430|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7729:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@431|56,0,@7389 7730:O2|@5592,@7731 7731:O2|@7407,0 7732:O2|3,@7733 7733:S3|666e28 7734:O2|3,@7735 7735:S5|4c44455843 7736:S4|4c4f4f50 7737:D3,260|3b650c7303ff5524a801757583780401752c8b008b0089daff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b0853ff70048b0189daff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@432|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7738:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@433|56,0,@5642 7739:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410498d67cb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@434|55,0,0 101,0,@7740 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7740:O2|@5643,@7741 7741:O2|@7742,0 7742:O2|3,59 7743:O2|@5592,@7744 7744:O2|@7745,0 7745:O2|3,@7746 7746:S3|656e64 7747:O2|3,@7748 7748:S2|696e 7749:O2|3,@7750 7750:S3|6c6574 7751:O2|3,@7752 7752:S6|524149534528 7753:O2|@7754,0 7754:S2|2c20 7755:S13|534554434f4e5441494e455228 7756:O2|44,0 7757:S8|5441475445535428 7758:S5|5455504c45 7759:S8|4441544154595045 7760:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@7379,1048575,@435|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 7761:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@436|56,0,@5642 7762:S22|42617365436f6465547265652e707265747479283129 7763:D3,1616|3b650c7303ff55248338017572ff701052ff700cff7004bb030000008b4008bafc317ab290e8c258fdff89c3b8589d7cb2e82632fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c0520890e8e231fdff8b4d00eb05e97e0200008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740ab8ecd57ab28b5d04ff13518b442408909090e8a6050000909090e8b20600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1350bb030000008b44240cbafc317ab290e8aa57fdff89c3b80ce17cb2e80e31fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442410518b50048b442418909090ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70120e17cb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40d03b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40ac3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70158477bb28d410cc740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c410890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c383380575088b40048b5204ff22833807756a8b5a048b4004909090e8de0400008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701e8ea7cb28d410cc740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c352ff700cff7004bb030000008b4008bafc317ab2909090e85255fdff89c3b8589d7cb2e8b62efdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c0520890e8722efdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e8a20d0000909090e8ae0e00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c240c508b44240c8b5104909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49ac3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c70124287bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40ac3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70158477bb28d410cc740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c39090000000004c060000|@7782,2097151,@447|24,0,1 32,0,@5052 38,1,@5053 45,0,@7382 50,1,@4940 83,0,3 93,0,@6321 107,0,91 112,0,I48 118,1,@4940 158,0,3 168,0,@6321 186,1,@7764 194,1,@7765 258,0,0 265,0,1 272,0,1 278,0,0 289,0,@6321 303,0,1 312,0,@5052 318,1,@5053 325,0,@7766 330,1,@4940 363,0,3 373,0,@6321 429,0,0 450,0,@5592 469,0,@7767 488,0,@5592 539,0,@5592 558,0,@7407 579,0,@5592 628,0,@5592 647,0,@6594 666,0,@7409 685,0,@5592 726,0,0 733,0,0 740,0,1 746,0,0 757,0,@6321 798,1,@7769 831,0,@7778 851,0,0 858,0,1 865,0,0 871,0,0 882,0,@6321 902,0,1 910,0,@5052 918,1,@5053 925,0,@7382 930,1,@4940 963,0,3 973,0,@6321 987,0,91 992,0,I48 998,1,@4940 1031,0,3 1041,0,@6321 1062,1,@7780 1070,1,@7781 1134,0,0 1141,0,1 1148,0,1 1154,0,0 1165,0,@6321 1221,0,0 1243,0,0 1250,0,0 1257,0,2 1263,0,0 1274,0,@6321 1312,0,0 1335,0,@6364 1354,0,@6503 1375,0,@5592 1394,0,@7407 1415,0,@5592 1464,0,@5592 1483,0,@6594 1502,0,@7409 1521,0,@5592 1562,0,0 1569,0,0 1576,0,1 1582,0,0 1593,0,@6321 7764:D3,256|3b650c7303ff5524a801757583780401752c8b0090e8cabeffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e89abeffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@438|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7765:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@439|56,0,@7389 7766:S12|3d20436f6e7461696e657220 7767:O2|3,@7768 7768:S4|77697468 7769:D3,1672|3b650c7303ff5524a801756e83780401756d8b08ff710853ff31bb030000008b4104bafc317ab29090e8be50fdff89c3b88cca7cb2e8222afdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c05208eb0ae9f8050000e98702000090e8d229fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e8d2050000909090e8de0600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc020000008b54240c895004c7000f000000518b54240c909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49ac3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c70124287bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b0853ff7004ff7108ff31bb030000008b4104bafc317ab29090e8c24dfdff89c3b88cca7cb2e82627fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bbb7000000b848c0520890e8e226fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442408909090e852040000909090e85e0500008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc020000008b542408895004c7000f000000518b542414909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49ac3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c70124287bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701a4a57cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc02000000894804c700bca57cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c74004b4ea7cb289088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff13518b5c24088b442404909090e8bef9ffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000084060000|@7379,2097151,@444|27,0,1 35,0,@5052 42,1,@5053 49,0,@7700 54,1,@4940 87,0,3 97,0,@6321 111,0,91 116,0,I48 134,1,@4940 167,0,3 177,0,@6321 198,1,@7770 206,1,@7771 270,0,0 277,0,1 284,0,1 290,0,0 301,0,@6321 348,0,7 389,0,0 411,0,0 418,0,0 425,0,2 431,0,0 442,0,@6321 480,0,0 503,0,@6364 522,0,@6503 543,0,@5592 562,0,@7407 583,0,@5592 632,0,@7409 651,0,@5592 704,0,0 711,0,0 718,0,0 724,0,0 734,0,@6321 772,0,0 791,0,1 799,0,@5052 806,1,@5053 813,0,@7700 818,1,@4940 851,0,3 861,0,@6321 875,0,91 880,0,I48 886,1,@4940 919,0,3 929,0,@6321 950,1,@7772 958,1,@7773 1022,0,0 1029,0,1 1036,0,1 1042,0,0 1053,0,@6321 1100,0,7 1141,0,0 1163,0,0 1170,0,0 1177,0,2 1183,0,0 1194,0,@6321 1232,0,0 1255,0,@6364 1274,0,@6503 1295,0,@5592 1314,0,@7407 1335,0,@5592 1384,0,@7409 1403,0,@5592 1456,0,0 1463,0,0 1470,0,0 1476,0,0 1486,0,@6321 1524,0,@7774 1546,0,0 1553,0,0 1560,0,0 1566,0,0 1576,0,@6321 1631,0,@5592 1656,0,0 7770:D3,256|3b650c7303ff5524a801757583780401752c8b0090e892b6ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e862b6ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@440|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7771:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@441|56,0,@7389 7772:D3,256|3b650c7303ff5524a801757583780401752c8b0090e822b5ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e8f2b4ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@442|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7773:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@443|56,0,@7389 7774:O2|@5643,@7775 7775:O2|@7776,0 7776:O2|3,@7777 7777:S5|20616e6420 7778:O2|3,@7779 7779:S8|76616c2072656320 7780:D3,256|3b650c7303ff5524a801757583780401752c8b0090e862b3ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff70048b009090e832b3ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e969000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b442404909090e846ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c390909000000000fc000000|@7379,2097151,@445|22,1,@7384 55,0,0 70,1,@7384 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 215,0,@5592 240,0,0 7781:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@446|56,0,@7389 7782:S29|42617365436f6465547265652e70726574747942696e64696e67283129 7783:D3,84|3b650c7303ff55246a016a016a038d4c24045153ff74241cff74241c8b5c242c90e8420000008b04248b4c241483c4048b1089118b58088959048b70048971085f89790cb801000000c210000000000050000000|@11909,2097151,@2191|34,1,@7784 69,0,0 7784:D3,940|3b650c7303ff55246a016a016a0189e151e8aa030000837c2420017507837c24080174628b442418a80175358b0881396ce539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa01756db87c787cb2a801753c8b0881396ce539b275238b55008d52f8eb05e9fb0200003b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc0ba0100000083fa01750bb8287c7cb28b5d0490ff138b02909081386ce539b27414b854eb7ab2eb05e90d0000008b5d04909090ff138b4808eb1a8b0281386ce539b2740db854eb7ab28b5d04909090ff138b48088b5c2418f6c30175358b33813e24e639b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b730489f33b650c7303ff5524ebc6bf0100000083ff017507bbb0ac7db2eb1b8b1f813b24e639b2740cb854eb7ab28b5d049090ff138b730889f38b34245351ff76088b1e8b46049090e856be0000833c2401741050b820ae7db28b5424089090ff12eb0889c1b80100000051837c24040174198b0424bad47c7cb29090e8368effff8b5424089090ff12eb05b8010000006848ae7db2680caf7db2ff7424186838af7db2bbe4837ab28b442410e85e560000837c240401740f50b864af7db28b54240c90ff12eb0889c1b80100000051837c24080174198b0424bad47c7cb29090e8d28dffff8b54240c9090ff12eb05b8010000008b45008d40f03b45087303ff5520894500c740fc01000040c700010000008d4808c741fc010000408b54241489118b55008d52f43b55087303ff5520895500c742fc02000000c7028caf7db2894a048062ffbf8b5d008d5be43b5d087303ff5520895d00c743fc030000008943088b74242889730489138d5310c742fc02000000c70214b07db2895a048062ffbf505189d38b4424089090e84a0a00006a016a016a018b4c24108b0983f901741c8b4c240c8b098b5424108b1289e3890389e089480489e0895008eb1f8b4c240c8b09518d4c240451ff742440ff7424408b5c244c9090e8ae660100837c241c01740fb8fc4786b28b5424209090ff12eb05b801000000837c241c0174188b0424bad47c7cb290e8aa8cffff8b5424209090ff12eb05b8010000008b4424408b4c243c8b5424388b5c24348b7424088974244489442440894c243c89542438895c24348b5c24045883c42ce97afcffff8b44241c8b0c2489088b4c2404894804b80100000083c40cc2140090909000000000a8030000|@11908,2097151,@2190|18,1,@7785 48,0,@4658 98,0,0 108,0,@7313 120,0,@4658 177,0,0 187,0,@7368 203,0,@4658 210,0,@6377 238,0,@4658 245,0,@6377 273,0,@4681 323,0,0 333,0,@8080 343,0,@4681 350,0,@6377 382,1,@8082 394,0,@8084 411,0,0 427,0,@7375 434,1,@7377 449,0,0 454,0,@8086 459,0,@8092 468,0,@8094 473,0,@5461 482,1,@7937 495,0,@8096 511,0,0 527,0,@7375 534,1,@7377 549,0,0 579,0,0 625,0,@8098 684,0,@8100 706,1,@7801 782,1,@8326 794,0,@11906 809,0,0 824,0,@7375 830,1,@7377 845,0,0 919,0,0 7785:D3,448|3b650c7303ff55248b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000f6c301740783fb017d08eb1bf643ff107515f6c301740a81fbfdffff017c14eb06f643ff10750c89c2b834f67ab28b5d04ff1389daf6c201740583c2027105ff5538ebf689ce89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891f8b45008d40f43b45087303ff5520894500c740fc02000000c70098f27cb28978048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7016cf37cb28979048061ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7033cf57cb28973048063ffbf8b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7fec3b7d087303ff5520897d00c747fc04000000895f0c894f088b0c24894f0489076a016a016a01568d4424045089fb89d0baacf57cb2909090e8ba0300008b45008d40f03b45087303ff5520894500c740fc030000008b4c240c8948088b4c24088948048b4c240489085983c40c8b095a8b128b5c24048903894b04895308b801000000c204009000000000bc010000|@8079,1048575,@594|34,0,0 63,0,16777214 80,0,@6401 113,0,0 183,0,@7786 220,0,@7788 257,0,@7794 294,0,0 354,0,@7796 362,1,@7798 432,0,0 7786:D3,136|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b580489198b30f7c601000000740783fe017d08eb26f646ff1075208b7a048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b5204894c72feb801000000c30000000084000000|@7787,63,@448|85,0,@6397 123,0,0 7787:S47|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229656e74657241646472283129 7788:D3,244|833803750c89c1b874f47cb28b5d04ff1383380775358b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000c74004ec7d7ab28908c383380175358b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000c74004ec7d7ab28908c38b4804f6c101740783f9017d08eb20f641ff10751a8b5a048b1bf6c1017409f6c30174043bcbeb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b52048b4c4afe83f901750db84cc37bb28b5d04909090ff138b01c300000000f0000000|@7793,15,@449|8,0,@7789 51,0,1 68,0,@5413 109,0,1 126,0,@5413 181,0,@6373 221,0,@6769 7789:O4|@4608,@5398,@7791,@7790 7790:O5|@7792,921,0,921,0 7791:S31|746f70206c6576656c207265616368656420696e2073696d706c6966696572 7792:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f53494d504c49464945522e736d6c 7793:S48|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296c6f6f6b757041646472283129 7794:D3,40|8b42048b008b4a048b09f6c101740583c1027105ff5538ebf68b5204890ac3900000000024000000|@7795,7,@450| 7795:S44|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296d6b41646472283129 7796:O7|@7798,@7826,@7841,@7871,@7912,@7987,@7797 7797:O7|@8023,@7796,@7826,@7841,@7871,@7912,@7987 7798:D3,932|3b650c7303ff55248b08be02f67cb28d748efcffe690e973000000909090e9af000000909090e963000000909090e9bf000000909090e9d7000000909090e94b000000909090e941010000909090e9a6020000909090e933000000909090e92b000000909090e9de020000909090e91b000000909090e913000000909090e90b000000909090e9f00200009090908b4d008d49f03b4d087303ff5520894d00c741fc03000000c701a4f97cb28b52188951048959088061ffbf89cb9090e8660300008b4c240489cb5a83c40452e9660f00008b4c24048b700c897424048b3c24891c24518b58088b700489f08b520857ff228b4c24048b700c897424048b3c24891c24518b58048b700889f08b520c57ff228b40048b5308ff128b08833901752c8b55008d52f03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c70205000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702090000008b5c24048913c74304010000008b5004895308b801000000c204006a016a016a0152ff7008ff700c8d4c240c518b4004e85afeffff8b44241483380575718b48088b44240489caff128b08833901752c8b55008d52f03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c70205000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702090000008b5c241c89138b542410895304eb05e9110000008b5004895308b80100000083c418c20400833c2401744d8b44240c833805750f6a038b5c24089090e8c2f2feffeb668b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000008b4c24048948088b4c240c894804c7000d000000eb518b44240c833805750e6a018b5c240890e876f2feffeb3a8b45008d40ec3b45087303ff5520894500c740fc04000000eb05e91b000000c7400c010000008b4c24048948088b4c240c894804c7000d0000008b4c241c89018b442410894104c74108ec7d7ab2b80100000083c418c204006a016a016a016a018d4c2408518b40048b5210ff128b45008d40f43b45087303ff5520894500c740fc0200000059894804c7000f0000008b4c24088901c741040100000058894108b801000000c204008b4d008d49f43b4d087303ff5520894d00c741fc020000008b70088971048b780489398b7c2404897c240489c88b5214ff228b4c2404895c24048b1c24890c2489de8b58088b780489f88b520456ff2290909000000000a0030000|@7825,1048575,@464|11,0,$7798+22 168,0,@7799 190,1,@7801 206,1,@7822 327,0,2 365,0,4 378,0,0 389,0,0 487,0,2 525,0,4 556,0,0 590,1,@6843 623,0,1 643,0,6 666,1,@6843 706,0,0 726,0,6 746,0,@5413 751,0,0 812,0,7 825,0,0 834,0,0 7799:D3,44|3b650c7303ff55248b4a088b59048b3424891c24ff7108ff710c8b198b7a0489fa56ff220000000028000000|@7800,1048575,@451| 7800:S39|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283129283129 7801:D3,60|3b650c7303ff5524535089daff1283f801751b8b4424048b4c240889442408bb64fa7cb25883c40451e92a0000008b0083c408c30000000038000000|@7821,1048575,@461|32,0,@7802 42,1,@7803 7802:O1|@7801 7803:D3,1164|3b650c7303ff55248b08ba82fa7cb28d548afcffe290e9c0000000909090e90c010000909090e96c010000909090e967010000909090e9bb010000909090e9b6010000909090e9fc010000909090e93b020000909090e9de020000909090e9de020000909090e923000000909090e901030000909090e92d030000909090e97f030000909090e9bf030000909090ff700853ff74240c8b4004e802040000508b5c24108b4424088b54240490ff1289c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c70015000000c2040053ff70088b5c240c8b40048b5424049090ff1250ff7424108b5c240c8b4424089090e8ee06000089c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c70001000000c2040053ff700cff70088b5c24108b40048b542408909090ff12508b5c24148b4424048b54240c90ff12508b5c24188b44240c8b54241090ff1289c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c598948085983c40c894804c70003000000c20400c2040053ff700cff70048b5c24108b40088b542408ff1250ff7424148b5c24108b4424089090e80207000089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240889500c5a83c40c895008894804c70007000000c20400c2040053ff70088b5c240c8b40048b542404ff12508b5c24108b4424048b54240890ff1289c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c7000b000000c20400ff700cff700889d98b5c240c8b400489caff1289c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c5a83c404895008894804c7000d000000c204008b480453ff711cff7118ff7114ff7110ff7108ff7104ff710c8b5c24248b018b54241c909090ff1250ff7424288b5c24248b4424089090e8960600008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241c89511c8b5424188951188b5424148951148b54241089511089410c8b44240c8941088b4424088941045883c42089018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c20400b8b4047db2c20400ff7424048b400490e80207000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70013000000c2040089d98b5c24048b400489ca90ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70017000000c2040053ff7008ff70048b5c24108b400c8b5424089090ff12508b5c24148b4424048b54240c90ff1289c18b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c5a83c404895008894804c70019000000c20400ff700cff700489d98b5c240c8b400889ca90ff1289c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c404894804c7001b000000c20400ff7008ff7424088b400490e89206000089c18b45008d40f03b45087303ff5520894500c740fc030000005a895008894804c7001d000000c204000000000088040000|@7820,1048575,@460|11,0,$7803+22 154,1,@7804 212,0,10 254,1,@7812 296,0,0 400,0,1 446,1,@7813 495,0,3 576,0,5 647,0,6 710,1,@7814 818,0,7 826,0,@7817 842,1,@7818 877,0,9 929,0,11 1019,0,12 1091,0,13 1110,1,@7819 1149,0,14 7804:D3,104|3b650c7303ff5524a801754c53ff7004ff74240c8b00909090e85e00000050ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,1048575,@454|26,1,@7805 89,0,0 7805:D3,296|3b650c7303ff55248338017554ff700cff7008ff700489d98b5c24108b401089ca909090ff1289c18b45008d40e83b45087303ff5520894500c740fc050000008948108b4c240889480c8b4c24048948085983c408894804c70001000000c20400833805753689d98b5c24048b400489ca909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c204008338077533ff7424048b400490e88e00000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c20400ff7008ff700489d98b5c240c8b400c89ca909090ff1289c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24048948085983c404894804c70003000000c2040090900000000024010000|@7811,1048575,@453|90,0,0 149,0,2 170,1,@7806 205,0,3 279,0,1 7806:D3,216|3b650c7303ff5524a80175718b088b55008d52f43b55087303ff5520895500c742fc020000008b7108897204c7020f00000053ff7004ff7104ff318b5c241489d08b54240c909090ff1283380f740e89c1b8b0017db28b5d049090ff138b4d008d49f03b4d087303ff5520894d00c741fc030000008b4004894108eb05e9460000008b4424048941045883c404890151ff7424108b5c240c8b44240890e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c2040000000000d4000000|@6329,1048575,@452|46,0,7 82,0,@7807 201,0,0 7807:O4|@4608,@5398,@7809,@7808 7808:O5|@7810,500,0,500,0 7809:S8|64654c616d626461 7810:S45|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42617365436f6465547265652e736d6c 7811:S47|42617365436f6465547265652e6d6170436f6465747265652832296d6170742831296d617062696e64696e67283129 7812:D3,192|3b650c7303ff5524a80175738b088b1153ff7004ff7104ff7204ff328b5c24188b42088b54241090ff128b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b4424048941045883c40489018b45008d40f43b45087303ff5520894500c740fc020000005a895004890850ff7424108b5c240c8b442408eb05e92c00000090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c2040000000000bc000000|@6329,1048575,@455|177,0,0 7813:D3,136|3b650c7303ff5524a801756c8b0853ff7004ff71048b5c24108b018b54240890ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000084000000|@6329,1048575,@456|121,0,0 7814:D3,168|3b650c7303ff5524a801756d8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff70048b5c240c89c88b542404909090ff12833809740e89c1b888047db28b5d049090ff13ff7004ff7424108b5c240c8b44240890e896ffffff89c18b45008d40f43b4508730aeb05e919000000ff5520894500c740fc020000008948045983c4088908c20400b801000000c204009000000000a4000000|@6329,1048575,@457|43,0,4 74,0,@7815 152,0,0 7815:O4|@4608,@5398,@6887,@7816 7816:O5|@7810,499,0,499,0 7817:O1|8 7818:D3,136|3b650c7303ff5524a801756c8b0853ff7004ff71048b5c24108b018b54240890ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000084000000|@6329,1048575,@458|121,0,0 7819:D3,104|3b650c7303ff5524a801754c53ff70048b5c240c8b008b5424049090ff1250ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,1048575,@459|89,0,0 7820:S34|42617365436f6465547265652e6d6170436f6465747265652832296d617074283129 7821:S27|42617365436f6465547265652e6d6170436f646574726565283229 7822:D3,252|3b650c7303ff552483380575708b4d008d49f03b4d087303ff5520894d00c741fc030000008b50088951088b7004897104c70105000000f6c20175318b3a813f44e239b27518813f44e239b2740bb854eb7ab28b5d0490ff138b4708eb148b7a0489fa3b650c7303ff5524ebcab8ec7d7ab2890bc7430401000000eb05e909000000894308b801000000c3833815754e6a016a016a0153ff70048d5c24088b4008e85affffff837c240c0175058b0424eb0c8b5c240c8b0424e8520000008b4c240483c4048b54240489118941048b44240c894108b80100000083c410c38903c7430401000000c74308ec7d7ab2b801000000c300000000f8000000|@7824,63,@463|51,0,2 64,0,@4607 72,0,@4607 79,0,@6377 110,0,@5413 119,0,0 134,0,0 186,1,@7823 214,0,0 227,0,0 234,0,@5413 239,0,0 7823:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@462| 7824:S44|434f4445545245455f53494d504c494649455228292e73696d705370656369616c28322973706c6974283129 7825:S36|434f4445545245455f53494d504c494649455228292e73696d705370656369616c283229 7826:O2|@7827,@7796 7827:D3,344|3b650c7303ff5524b90100000089c6f7c601000000751cf6c101740583c1027105ff5538ebf68b76043b650c7303ff5524ebdc5153ff7424108b5a0490e82a0100006a016a0189e390e8160400008b0424e8d604000089c1f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f90174348b4d008d49f03b4d087303ff5520894d00c741fc030000008b542408895108894104c7011d00000089c8909090e8fe10ffffeb2a89c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c7001d00000089c68b44240490e8be0500008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701440f7db25a83c4088951048061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000894a0859894a04c702050000008b4c24048931894104895108b801000000c208000000000054010000|@7840,1048575,@474|9,0,0 62,1,@7828 74,1,@7832 82,1,@7834 116,0,0 123,0,1 168,0,14 178,1,@6933 222,0,14 234,1,@7836 264,0,@7838 312,0,2 329,0,0 7828:D3,220|3b650c7303ff5524a80175746a016a016a0153ff70048d4c2408518b5c241c8b008b542408909090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c240889086a016a0189e1518b5c2424e88a0000008b45008d40f43b45087303ff5520894500c740fc02000000eb05e9470000008b4c24048948045983c404890850ff74241c8b5c240c8b4424089090e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c20400b801000000c2040000000000d8000000|@6329,1048575,@467|98,1,@7829 205,0,0 7829:D3,368|3b650c7303ff55248b08833909754a8b55008d52e83b55087303ff5520895500c742fc020000008b5904895a04c702030000008d720cc746fc020000008b7808897e0489168b54240489328b7004897204b801000000c2040083390575508b55008d52e43b55087303ff5520895500c742fc030000008b5908895a088b7104897204c702010000008d7a10c747fc020000008b700889770489178b542404893a8b7804897a04b801000000c2040051ff7004ff7008b8010000008b530c909090ff128b4d008d49bc3b4d087303ff5520894d00c741fc02000000894104c701050000008d510cc742fc02000000894a04c702030000008d4a0cc741fc020000005b89590489118d510cc742fc040000008b5c2404895a0c894208c7420401000000c702030000008d4214c740fc02000000c7400401000000891083f80175058b0424eb1089ce89c38b04249090e83200000089f18b54240c83c408890a894204b801000000c20400000000006c010000|@7831,1048575,@466|47,0,1 82,0,0 132,0,0 167,0,0 182,0,0 223,0,2 242,0,1 285,0,0 291,0,1 308,0,0 334,1,@7830 353,0,0 7830:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@465| 7831:S36|434f4445545245455f53494d504c494649455228292e6d616b654e65774465636c283229 7832:D3,152|3b650c7303ff552483f8017513c70301000000c7430401000000b801000000c38b086a016a0153ff7104ff318d5c240c8b480489c8e8c6ffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008b54240c8951045a89118b14248902894a04b80100000083c40cc3900000000094000000|@7833,15,@468|15,0,0 22,0,0 27,0,0 135,0,0 7833:S17|4c697374506169722e756e7a6970283129 7834:D3,180|3b650c7303ff5524a80175748b088b11833a0175378b70048b7a048b59048b4208e8a20000008b4d008d49f03b4d087303ff5520894d00c741fc03000000894108897904c70105000000eb278b4d008d49f43b4d087303ff5520894d00c741fc020000008b5204895104c701090000008b70045189f0909090e882ffffffeb05e92100000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c300000000b0000000|@6329,63,@470|34,1,@7835 70,0,2 108,0,4 167,0,0 7835:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@469|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7836:D3,52|3b650c7303ff5524a8017519ff308b4004e8eaffffff83f801750258c389c358e923000000b801000000c3900000000030000000|@6729,15,@472|33,1,@7837 38,0,0 7837:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@471| 7838:D3,64|8b5204f6c201740d89c1b8bc7e7ab28b5d0490ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebcb000000003c000000|@7839,7,@473|11,0,@5417 7839:S45|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329737065635265632d283129 7840:S34|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329 7841:O2|@7842,@7796 7842:D3,1356|3b650c7303ff55246a016a016a0152538d4c2408518b5c24208b4a0489ca9090ff128b442408833805755f8378040175068b442420eb038b04246a016a016a018b4c241089e2528b5c242c8b51049090ff12837c24040175068b442418eb0f8b5c24048b4424189090e8f20400008b4c24245a83c404891189410458894108b80100000083c414c20c00ff74241089c38b44241090e81e0500006a016a016a018b4c2410508d542404528b5c24308b4424148b5104909090ff126a016a016a018b44242089e1518b5c243c8b48048b44244089caff128b4424108338177572ff74241889c38b442418e8aa0800008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cc4757ab28941088b44240c894104c701030000008b45008d40e83b45087303ff5520894500c740fc02000000894804c700050000008d480cc741fc020000008b542404895104eb05e92000000089018b4424348b142489108948048b4c2408894808b80100000083c430c20c00833805755d837c241401755b8b0c248339057558837c24040175718b50043b5104756e8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5c240c895904c701050000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000eb0fe954020000e940010000e93b010000c7430401000000890b8b4c24348901895904c74108ec7d7ab2eb0ae91b010000e90b000000b80100000083c430c20c0083fa0375298379040175238b4c24348b5c240c8919c7410401000000c74108ec7d7ab2b80100000083c430c20c0083fa01756b83790403756a8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b5c240c891989c89090e85e0800008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410810767ab2894104c701070000008b4424348908eb0ae91e000000e919000000c7400401000000c74008ec7d7ab2b80100000083c430c20c008b5d008d5bec3b5d087303ff5520895d00c743fc04000000894b0c8943088b4c240c894b04c703030000008b4c24348919c7410401000000c74108ec7d7ab2b80100000083c430c20c008b0c248339177570ff74240889cb8b44240890e8220800008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc74108c4757ab28b44240c894104c701030000008b45008d40e83b45087303ff5520894500c740fc02000000894804c700050000008d480cc741fc020000008b542414eb05e92400000089510489018b4424348b54241089108948048b4c2418894808b80100000083c430c20c00ff74241889c38b442418e8ce08000050ff74240c8b5c24088b44240c9090e8fe0900008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c588941088b44240c894104c701030000008b4424348908c7400401000000c74008ec7d7ab2b80100000083c430c20c008b0c248339177571ff74240889cb8b4424089090e8de0a00008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc74108c4757ab28b44240c894104c701030000008b45008d40e83b45087303ff5520894500c740fc02000000894804c700050000008d480cc741fc020000008b542414eb05e92400000089510489018b4424348b54241089108948048b4c2418894808b80100000083c430c20c00ff74241889c38b442418e88a0b000050ff74240c8b5c24088b44240c9090e8ba0c00008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c588941088b44240c894104c701030000008b4424348908c7400401000000c74008ec7d7ab2b80100000083c430c20c009090900000000048050000|@7870,1048575,@495|106,1,@7843 128,0,0 150,1,@7844 234,1,@7855 265,0,@5348 281,0,1 314,0,2 364,0,0 442,0,2 490,0,0 508,0,@5413 525,0,0 559,0,0 566,0,@5413 571,0,0 619,0,0 634,1,@7857 665,0,1 672,0,@5352 681,0,3 706,0,0 713,0,@5413 718,0,0 767,0,1 780,0,0 787,0,@5413 792,0,0 822,1,@7858 856,0,@5348 869,0,1 902,0,2 953,0,0 974,1,@7860 994,1,@7862 1038,0,1 1051,0,0 1058,0,@5413 1063,0,0 1094,1,@7864 1128,0,@5348 1141,0,1 1174,0,2 1225,0,0 1246,1,@7866 1266,1,@7868 1310,0,1 1323,0,0 1330,0,@5413 1335,0,0 7843:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@475| 7844:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9d5000000900000000074000000|@7854,63,@479|30,1,@7845 68,0,2 86,0,0 107,1,@7846 7845:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@476|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7846:D3,324|3b650c7303ff552483f801750389d8c3833b09755f8b4b04833905755c89c2f6c201740d89c6b85c187db28b5d0490ff13837a040175048b12eb0d8b52043b650c7303ff5524ebd7833a03756b8b7104f7c6010000007509f64208017503ff55383b7208755ebf0100000089c3f6c301752beb0ae999000000e994000000f7c701000000740583c7027105ff5538ebf68b5b043b650c7303ff5524ebd089fbf6c301740583eb027105ff5538ebf68b7a0ce8ce000000eb05e92e00000089fbe93cffffff89c28b45008d40f03b45087303ff5520894500c740fc03000000895808895004c70015000000c389c28b45008d40f03b45087303ff5520894500c740fc03000000895808895004c70015000000c389c18b45008d40f03b45087303ff5520894500c740fc03000000895808894804c70015000000c39090900000000040010000|@7853,63,@478|39,0,@7847 103,0,0 178,1,@7849 230,0,10 269,0,10 308,0,10 7847:O4|@4650,@6706,0,@7848 7848:O5|@5419,88,0,88,0 7849:D3,104|3b650c7303ff552483fb017506b801000000c3a801740e89c1b804197db28b5d049090ff13f6c301740583eb027105ff5538ebf6ff308b4004e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000064000000|@7852,11,@477|14,0,0 26,0,@7850 7850:O4|11,@4879,0,@7851 7851:O5|@5419,108,0,108,0 7852:S12|4c6973742e74616b65283229 7853:S30|434f4445545245455f53494d504c494649455228292e6d6b456e76283229 7854:S43|434f4445545245455f53494d504c494649455228292e7370656369616c546f47656e6572616c2833292829 7855:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9f5fcffff900000000074000000|@7854,63,@481|30,1,@7856 68,0,2 86,0,0 107,1,@7846 7856:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@480|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7857:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@482|39,0,1 92,0,0 7858:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e931fbffff900000000074000000|@7854,63,@484|30,1,@7859 68,0,2 86,0,0 107,1,@7846 7859:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@483|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7860:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9edf9ffff900000000074000000|@7854,63,@486|30,1,@7861 68,0,2 86,0,0 107,1,@7846 7861:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@485|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7862:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9a9f8ffff900000000074000000|@7854,63,@488|30,1,@7863 68,0,2 86,0,0 107,1,@7846 7863:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@487|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7864:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e965f7ffff900000000074000000|@7854,63,@490|30,1,@7865 68,0,2 86,0,0 107,1,@7846 7865:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@489|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7866:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e921f6ffff900000000074000000|@7854,63,@492|30,1,@7867 68,0,2 86,0,0 107,1,@7846 7867:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@491|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7868:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9ddf4ffff900000000074000000|@7854,63,@494|30,1,@7869 68,0,2 86,0,0 107,1,@7846 7869:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@493|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 7870:S39|434f4445545245455f53494d504c494649455228292e73696d7049665468656e456c7365283429 7871:O3|@7872,@7796,@7797 7872:D3,1832|3b650c7303ff55248b4c24086a016a016a015253ff7104508d7424105689cb8b720489f2ff128b0424833809756e8b4d008d49e43b4d087303ff5520894d00c741fc02000040c701782a7db2c74104010000008d510cc742fc03000000c702fc2a7db2894a048b5804895a088062ffbf8951048061ffbf8b54240851f6c201753a8b02ff7204ff742404bb010000008b0889c89090e85a090000eb05e92100000083f801740ab80300000083c404eb195a3b650c7303ff5524ebc1b801000000eb07b8010000006a018b4c241c833901756883f80175688b4104ba010000008b5810f6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdfbb010000008b74240cf7c601000000751cf6c301740583c3027105ff5538ebf68b76043b650c7303ff5524ebdcf6c2017514f6c301eb0ae991020000e98c0200007503ff55383bd374108b108b5818b808327db28b5d0490ff138b542408c702030000008b5424288b5818f6c301740783fb017d08eb1bf643ff107515f6c301740a81fbfdffff017c14eb06f643ff10750c8b30b834f67ab28b5d04ff13f6c301740583c3027105ff5538ebf68b710889d98b188b7818b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f5889078b44241053ff720cff72045756528b58048b442424909090e81e0d00006a016a0189e390e80ee7ffff833c24017507b868c05208eb71b8010000008b0c24f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb14f640ff10750e89c1b850337db28b5d049090ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93e000000c647ff4057f3ab5fb8010000008b0c2483f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f889c683c40458e8620d00008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7011c347db25a8951048971088b142489510c8061ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7038c357db28953048063ffbf8b55008d52ec3b55087303ff5520895500c742fc040000008b74240883c40489720c894a085983c404894a04891a6a016a016a018b4c2420508d5c24045389d38b4424148b5104909090ff12837c24080175058b0424eb0c8b5c24088b0424e89a0f000083f80175068b44242ceb0d89c38b44242c9090e8da0f00008b4c243883c4045a83c40489118941045883c404894108b80100000083c420c20c008b44241483380575668b4c2410ff7004ff74242c8b59088b4424149090e8ee0f0000f6042401740d89c1b8ecd57ab28b5d0490ff13508b5c2404b8cd00000090ff1508cd520883f80174668b5c2404b8cf000000ff1568cd520881e00100006081f80100006075698b0424a801eb05e979020000751f8b088b11833a05750f8b580489d83b650c7303ff5524ebddb801000000eb05b80300000083f801746b8b0424909090e872100000f644240401eb05e9e1010000740d89c1b8ecd57ab28b5d0490ff13508b5c2408b8cd000000eb05e9c10100009090ff1508cd520883f801741d8b5c2408b8cf000000ff1568cd520881e00100006081f8010000607411b888387db28b5d04eb05e988010000ff138b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b0c24894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740690e832f1feff909090e82af1feff833805740e89c1b8cc387db28b5d049090ff13ff7504b916297db251896504f644241001740d8b4804b8ecd57ab28b5d04ff138b48048b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24108908909090ff15c8d352088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7010500000083c40458894504eb749090908b650483c4045b895d0483380375388b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c1c397db28b50088951088b58048959048b30893189c289c88b5d04ff138b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410801000000894104c70105000000eb05e94b0000008d4110c740fc02000000894804c7001700000089c1eb348b4d008d49ec3b4d087303ff5520894d00c741fc040000008b44243489410c8b54241c8951088b1424895104c701070000006a018b44243083c40c89088b4c2418894804c74008ec7d7ab2b80100000083c420c20c008b4c2410ff7424288b59088b44241090e8260f00008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54242c89510c8b5c2414895908894104c701070000008b44242489088b4c2418894804c74008ec7d7ab2b80100000083c420c20c000000000024070000|@7911,2097151,@512|72,0,@7873 79,0,0 95,0,@7875 139,0,0 150,1,@7876 167,0,1 188,0,0 195,0,0 219,0,0 260,0,0 339,0,@7882 355,0,1 391,0,16777214 408,0,@6401 443,0,0 514,1,@7885 526,1,@7832 537,0,I49 544,0,0 589,0,16777215 606,0,@7886 620,0,0 670,0,0 730,1,@7888 760,0,@7890 807,0,@7895 914,1,@7897 938,1,@7898 966,0,0 1006,1,@7899 1019,0,@6321 1035,0,102 1042,0,I150 1056,0,103 1062,0,I153 1074,0,805306368 1119,0,0 1126,0,1 1142,1,@7901 1163,0,@6321 1179,0,102 1194,0,I150 1208,0,103 1214,0,I153 1226,0,805306368 1233,0,@7902 1276,0,0 1288,0,14 1320,0,0 1327,0,1 1338,1,@6933 1346,1,@6933 1358,0,@7905 1373,0,$7872+1498 1392,0,@6321 1442,0,I204 1473,0,0 1482,0,2 1540,0,@7908 1596,0,0 1605,0,2 1631,0,11 1685,0,3 1710,0,@5413 1715,0,0 1742,1,@7909 1789,0,3 1809,0,@5413 1814,0,0 7873:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@7874,1048575,@496| 7874:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283129 7875:D3,544|3b650c7303ff552483380775228b45008d40f43b45087303ff5520894500c740fc02000000c74004030000008918c383380f75708b40048b400c52a80175408b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c701090000008b3424ff7004ff760489c8e8c201000089c3583b650c7303ff5524ebbc89d889c18b45008d40f43b45087303ff5520894500c740fc02000000c7400403000000eb05e906000000890883c404c3833809755683fb017407b803000000eb598b48043b4a087507b803000000eb59833901753b8b5a08833b0175278b7104f7c6010000007509f64304017503ff55383b73047407b801000000eb55b803000000eb53b801000000eb51e9e600000083390375538b5a08eb05e9b3000000833b03753d8b7104eb05e9a4000000f7c6010000007509f64304017503ff55383b73047407b801000000eb51b803000000eb56e97b000000e976000000e971000000b801000000eb5983390575408b5a08833b05752c8b7104f7c6010000007509f64304017503ff55383b73047407b801000000eb3db803000000eb36e931000000b801000000eb2ae925000000833907751b8b5208833a07740cb801000000eb11e90c000000b803000000eb05b80100000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c390000000001c020000|@7881,1048575,@499|40,0,1 94,0,4 110,1,@7876 158,0,1 186,0,1 201,0,1 246,0,0 253,0,1 260,0,0 324,0,0 331,0,1 353,0,0 398,0,0 405,0,1 417,0,0 442,0,0 454,0,1 461,0,0 494,0,0 528,0,0 7876:D3,100|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc020000008958048908518b542408ff1283780401751e8b4c2408baa82d7db2895424088b542404894c24048b185852e92e0000008b0083c404c2040090900000000060000000|@7880,1048575,@498|57,0,@7877 78,1,@7878 7877:O1|@7876 7878:D3,936|3b650c7303ff55248b08bac62d7db28d548afcffe290e95d010000909090e99e010000909090e9d6010000909090e9d3010000909090e905020000909090e902020000909090e923020000909090e933020000909090e992020000909090e98f020000909090e923000000909090e9a9020000909090e9b9020000909090e9db020000909090e9eb0200009090908b4804ff7008f6c101755c8b018338017514ff7104ff74240c8b481089c88b542414ff12eb628338057517ff7104ff74240c8b480489c88b542414909090ff12eb6783380775678b5004ff7104f6c20175538b028b4d008d49f43b4d087303ff5520894d00eb05e964000000c741fc020000008b7008897104c7010f000000ff7204ff742410eb05e93300000089c88b542418909090ff1289c35a3b650c7303ff5524eba889d8eb17e912000000ff7104ff74240c8b480c89c88b542414ff1289c3593b650c7303ff5524e936ffffff89d88b4c240c8b5424088954240c89c35889ca5e83c40456ff228b4808ff7004f6c10175248b018b10ff7104ff74240c8b42088b542414909090ff1289c3593b650c7303ff5524ebd789d88b4c240c8b5424088954240c89c35889ca5e83c40456ff22ff700cff7008ff74240c8b40048b5424149090ff12ff74240c89c38b4424048b542414ff128b4c241083c4048b5424088954240c89c35889ca5e83c40456ff2289d8c20800ff7004ff7424088b40088b542410ff1259f6c10175218b11ff7104ff74240889c38b028b542410909090ff12593b650c7303ff5524ebdac2080089d8c20800ff7008ff7424088b40048b54241090ff128b4c240c8b5424088954240c89c35889ca5e83c40456ff228b4c24088b542404895424088b400489ca5e83c40456ff228b48048b510cff31f6c20175408b45008d40f43b45087303ff5520894500c740fc020000008b0a894804c70009000000ff7204ff74240c8b542414909090ff1289c35a3b650c7303ff5524ebbb89d88b4c240c8b5424088954240c89c35889ca5e83c40456ff2289d8c208008b4004a801751e8b08ff7004ff7424088b018b542410ff1289c3583b650c7303ff5524ebde89d8c208008b4c24088b542404895424088b400489ca5e83c40456ff22ff7004ff7424088b400c8b5424109090ff128b4c240c8b5424088954240c89c35889ca5e83c40456ff228b4c24088b542404895424088b400889ca5e83c40456ff228b4004a801751eff7004ff7424088b008b5424109090ff1289c3583b650c7303ff5524ebde89d8c2080000000000a4030000|@7879,1048575,@497|11,0,$7878+22 265,0,7 690,0,4 7879:S32|42617365436f6465547265652e666f6c64747265652833296674726565283229 7880:S24|42617365436f6465547265652e666f6c6474726565283329 7881:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283229 7882:O4|@4608,@5398,@7884,@7883 7883:O5|@7792,589,0,589,0 7884:S35|73696d7046756e6374696f6e43616c6c3a20617267756d656e74206d69736d61746368 7885:D3,220|3b650c7303ff5524a80175748b086a016a016a0153ff70048d542408528b5c241c8b018b54240890ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c240889086a016a0189e1518b5c2424e88ed7ffff8b45008d40f43b45087303ff5520894500c740fc02000000eb05e9470000008b4c24048948045983c404890850ff74241c8b5c240c8b4424089090e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c20400b801000000c2040000000000d8000000|@6329,1048575,@500|98,1,@7829 205,0,0 7886:O4|4,@4943,0,@7887 7887:O5|@5403,124,0,124,0 7888:D3,52|3b650c7303ff5524a8017519ff308b4004e8eaffffff83f801750258c389c358e923000000b801000000c3900000000030000000|@6729,15,@502|33,1,@7889 38,0,0 7889:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@501| 7890:D3,204|3b650c7303ff5524833807750c89c1b8fc347db28b5d04ff1383380375088b40048b5204ff228338017532f640040174148b5a08b9ffffff00234bfc8d4c09013b480477108b4804b8cc7b7ab28b5d04909090ff138b40048b4443fec38b4804f6c101740783f9017d08eb20f641ff10751a8b5a0c8b1bf6c1017409f6c30174043bcbeb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b520c8b4c4afe83f901750db84cc37bb28b5d04909090ff138b01c300000000c8000000|@7894,1048575,@503|16,0,@7891 53,0,8388607 73,0,@5401 141,0,@6373 181,0,@6769 7891:O4|@4608,@5398,@7893,@7892 7892:O5|@7792,619,0,619,0 7893:S27|6c6f63616c4f6c64416464723a204c6f6164526563757273697665 7894:S56|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c2834296c6f63616c4f6c6441646472283129 7895:D3,136|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b580489198b30f7c601000000740783fe017d08eb26f646ff1075208b7a048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b5204894c72feb801000000c30000000084000000|@7896,63,@504|85,0,@6397 123,0,0 7896:S59|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429736574546162466f72496e6c696e65283129 7897:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@505| 7898:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@506| 7899:D3,184|3b650c7303ff5524a80175708b088b55008d52f03b55087303ff5520895500c742fc03000000c702e8377db2895a048b7424048972088062ffbf53ff7004ff710489d38b01e8aec2ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204009000000000b4000000|@6329,1048575,@508|40,0,@7900 70,1,@7801 168,0,0 7900:D3,44|3b650c7303ff55248b4a088b59048b3424891c24ff7108ff710c8b198b7a0489fa56ff220000000028000000|@7800,1048575,@507| 7901:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@509|60,0,0 7902:O4|@4608,@5398,@7904,@7903 7903:O5|@7792,118,0,118,0 7904:S13|6e6f74206561726c7920727473 7905:O4|@4608,@5398,@7907,@7906 7906:O5|@7792,124,0,124,0 7907:S26|6d616b65436f6e737456616c3a204e6f7420636f6e7374616e74 7908:O5|@7792,133,0,133,0 7909:D3,184|3b650c7303ff5524a80175708b088b55008d52f03b55087303ff5520895500c742fc03000000c702003a7db2895a048b7424048972088062ffbf53ff7004ff710489d38b01e896c0ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204009000000000b4000000|@6329,1048575,@511|40,0,@7910 70,1,@7801 168,0,0 7910:D3,44|3b650c7303ff55248b4a088b59048b3424891c24ff7108ff710c8b198b7a0489fa56ff220000000028000000|@7800,1048575,@510| 7911:S41|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429 7912:O2|@7913,@7797 7913:D3,772|3b650c7303ff55248b4818f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c23eb06f641ff10751b8b701c8b7810ff7004ff7014ff30ff700cb834f67ab28b5d04ff13f6c101740583c1027105ff5538ebf68b701c8b7810ff7004ff7014ff30ff700cff7018b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44240489078b45008d40f03b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c70101000000568b75008d76f43b75087303ff5520897500c746fc02000000c706983d7db2897e048066ffbf518b4d008d49dc3b4d087303ff5520894d00c741fc08000000c701683e7db2508b44242c8941048b4424048941088b042489410c8b43088941108b4424308941148b44241489411889791c8061ffbf8b45008d40ec3b45087303ff5520894500c740fc01000040c700010000008d7808c747fc02000000c70790437db28947048067ffbf508b45008d40e43b45087303ff5520894500c740fc060000009090c70000447db28b52048950048970088b5b0489580c8948108978148060ffbf89c38b44241c909090e8d2bdffff8b4c24048b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d15a83c4048b12837c2418037507bb03000000eb058b1c248b1b83fb0374205153526840447db268bc447db252681c457db2bbe4837ab290e886080000eb035153528b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241089511c5a8951188b14248951148b5c24108959108b5c240489590cc74108010000008b742424897104890183fa037507b8ec7d7ab2eb4b8b45008d40f43b45087303ff5520894500c740fc02000000c700307e7ab28958048060ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c700010000008b54242c83c428890a894204b801000000c20c009090900000000000030000|@7986,2097151,@548|36,0,16777214 68,0,@6401 113,0,0 188,0,0 204,0,0 235,0,@7914 273,0,@7916 351,0,0 367,0,@7926 407,0,@7928 446,1,@7801 457,0,0 532,0,1 552,0,@7929 557,0,@7932 563,0,@7935 568,0,@5461 574,1,@7937 641,0,0 660,0,@5413 692,0,@5416 737,0,0 754,0,0 7914:D3,136|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b580489198b30f7c601000000740783fe017d08eb26f646ff1075208b7a048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b5204894c72feb801000000c30000000084000000|@7915,63,@513|85,0,@6397 123,0,0 7915:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429736574546162283129 7916:D3,404|3b650c7303ff552483380375638b4a188b4004f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca8339057533f6421401752d8b42148b5904f6c3017508f600017503ff55383b1875168b7208eb05e93d000000c70603000000b810407db2c35289c88b4a1089ca909090ff128b0c248b510483c4048b1c24891424ff7108ff710c89de8b58048b3889f856e90e01000083380775358b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000c74004ec7d7ab28908c383380175358b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000c74004ec7d7ab28908c38b4804f6c101740783f9017d08eb20f641ff10751a8b5a1c8b1bf6c1017409f6c30174043bcbeb05ff5538ebf77c0cb8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b521c8b4c4afe83f901750db84cc37bb28b5d04909090ff138b01c30000000090010000|@7925,1048575,@517|27,0,@5417 119,0,1 124,0,@7917 174,1,@7919 212,0,1 229,0,@5413 270,0,1 287,0,@5413 342,0,@6373 381,0,@6769 7917:O2|@7918,@5413 7918:O2|1,@5383 7919:D3,448|3b650c7303ff5524833803753c8b48048339057534f644240c01752d8b54240c8b7104f7c6010000007508f602017503ff55383b3275128b7c2408c70703000000b810407db2c20c00833801752c8b4d008d49f03b4d087303ff5520894d00c741fc030000008b50088951088b7004897104c70101000000eb33538b5c24088b4004909090e8e6b6feff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb01538b04248338037507b8ec7d7ab2eb6b833801756b8b55008d52e83b55087303ff5520895500c742fc05000000c702fc417db28b5c2410895a048b74240c8972088b7c2408897a0c8b5808895a108062ffbf8b58048b45008d40f03b45087303ff5520894500c740fc03000000895008895804c70001000000eb69e9640000008b55008d52e83b55087303ff5520895500c742fc05000000c702b4427db28b5c2410895a048b74240c8972088b7c2408897a0c8b5808895a108062ffbf8b58048b45008d40f03b45087303ff5520894500c740fc03000000895008895804c7000500000089c28b45008d40f43b45087303ff5520894500c740fc02000000895004890883c404c20c00909000000000bc010000|@7924,63,@516|61,0,1 66,0,@7917 116,0,0 134,1,@6874 167,0,1 183,0,@5413 220,0,@7920 290,0,0 327,0,@7923 397,0,2 7920:D3,64|3b650c7303ff5524528b4a1089ca9090ff128b0c248b510483c4048b1c24891424ff7108ff710c89de8b58048b3889f8ba50427db256ff22000000003c000000|@7922,1048575,@514|49,0,@7921 7921:O1|@7919 7922:S82|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229636f6e76657274456e76283129283129 7923:D3,64|3b650c7303ff5524528b4a1089ca9090ff128b0c248b510483c4048b1c24891424ff7108ff710c89de8b58048b3889f8ba50427db256ff22000000003c000000|@7922,1048575,@515|49,0,@7921 7924:S66|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229 7925:S50|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129 7926:D3,40|8b42048b008b4a048b09f6c101740583c1027105ff5538ebf68b5204890ac3900000000024000000|@7927,7,@518| 7927:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296d6b41646472283129 7928:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@519| 7929:O1|@7930 7930:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c30000000028000000|@7931,3,@520|31,0,1 7931:S42|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836292d45 7932:O1|@7933 7933:D3,16|b801000000c39090000000000c000000|@7934,1,@521|1,0,0 7934:S44|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632d283429283129 7935:O1|@7936 7936:D3,16|b801000000c39090000000000c000000|@7931,1,@522|1,0,0 7937:D3,188|3b650c7303ff55248b4c2408f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c16eb06f641ff10750e89c2b834f67ab28b5d049090ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44240889078b4c240c8b7424108b44240457bf18467db2897c2414894c24108974240c89442408588b0c2489042489d051e92400000000000000b8000000|@7985,2097151,@547|37,0,16777214 54,0,@6401 83,0,0 145,0,@7938 176,1,@7939 7938:O1|@7937 7939:D3,152|3b650c7303ff552450b9cc467db251ff74241cff74241cff74241cff74241cff74241c9090e88a00000083f80175598b45008d40e43b45087303ff5520894500c740fc060000009090c70078687db28b4c24188948048b5424148950088b5c241089580c8b74240c8970108b7c24088978148060ffbf89c38b042483c4045983c41451e96cb3ffff8b0083c404c214000000000094000000|@7984,2097151,@546|10,0,@7940 38,1,@7941 75,0,@7982 132,1,@7801 7940:O1|@7939 7941:D3,1376|3b650c7303ff55248b08baea467db28d548afcffe290e97b000000909090e9fc000000909090e963000000909090e9a8010000909090e98b020000909090e94b000000909090e90d030000909090e9ad030000909090e933000000909090e92b000000909090e9e3030000909090e91b000000909090e913000000909090e90b000000909090e95c040000909090b801000000c21800ff7008ff742418ff742418ff742418ff742418ff7424188b40048b542430ff1250ff74241cff74241cff74241cff74241cff74241c8b5c24348b4424189090e89a0400008b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c404894104c701010000008b45008d40f83b45087303ff5520894500c740fc010000008908c2180053ff700cff7008ff742420ff742420ff742420ff742420ff742420bbcc777ab28b40048b5424389090ff1250ff742424ff742424ff742424ff742424ff7424248b5c24208b4424188b54243c90ff1250ff742428ff742428ff742428ff742428ff7424288b5c24248b4424208b54244090ff128b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c588941085883c40c894104c701030000008b45008d40f83b45087303ff5520894500c740fc010000008908c2180053ff700cff7008ff742420ff742420ff742420ff742420ff7424208b5c24388b4004e87604000089c389d8909090e8320500008b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b442408894104c701010000008b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890853ff742424ff742424ff742424ff742424ff74242489c38b4424188b54243c9090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240889510c8941085883c40c894104c701070000008b45008d40f83b45087303ff5520894500c740fc010000008908c218008b4804833907750f89d88b542410ff12b8c4777ab2eb4b833903750e8b41048b54240c909090ff12eb388339017510518b41048b54240c909090ff1258eb23f6c301740bb8744e7db28b5d0490ff1389cfff74240489d88b590490e80e05000089f88b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc010000008908c2180083780c0175728b4d008d49e43b4d087303ff5520894d00c741fc030000008959088b5008895104c701050000008d5910c743fc02000000c7430401000000890b52ff742418ff742418ff742418ff742418ff7424188b40048b542430ff128b4d008d49e43b4d087303ff5520894d00c741fc04000000eb05e923000000c7410c010000005a895108894104c7010d0000008d4114c740fc010000008908c21800b801000000c21800ff742414ff742414ff742414ff742414ff7424148b40049090e88e0500008b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7010f0000008d410cc740fc010000008908c21800ff7004ff742418ff742418ff742418ff742418ff7424188b40088b542430ff1250ff742420ff742420ff742420ff742420ff7424208b5c24208b4424189090e87a10000083f80175058b0424eb2989c18b45008d40f03b45087303ff5520894500c740fc030000008b1424895008894804c7001500000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c2180083780801756053ff74241cff74241cff74241cff74241cff74241cff74241cbb010000008b4004909090e83e1a00008b4d008d49e83b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d0000008d4110c740fc010000008908c21800b801000000c21800909090000000005c050000|@7981,2097151,@544|11,0,$7941+22 143,0,0 214,1,@7942 254,0,0 315,0,@5384 442,0,1 510,1,@7943 522,1,@7944 562,0,0 593,0,0 677,0,3 727,0,@5383 779,0,@7945 802,1,@7949 837,0,4 897,0,2 914,0,0 984,0,0 997,0,6 1017,0,0 1050,1,@7952 1083,0,7 1166,1,@7971 1217,0,10 1287,0,0 1298,1,@7978 1329,0,0 1338,0,14 1358,0,0 7942:D3,240|3b650c7303ff5524a80175738b088b11f6020175048b32eb05becc777ab253ff7004ff7104ff7204ff32ff742428ff742428ff742428ff742428ff74242889f38b42088b54242490ff128b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b4424048941045883c40489018b45008d40f43b4508730aeb05e95c000000ff5520894500c740fc020000005a895004890850ff742420ff742420ff742420ff742420ff7424208b5c241c8b44241890e846ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c2140000000000ec000000|@6329,1048575,@523|26,0,@5384 225,0,0 7943:D3,180|3b650c7303ff5524a80175718b0853ff7004ff7104ff742420ff742420ff742420ff742420ff742420bbcc777ab28b018b54241cff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742420ff742420ff742420ff742420ff7424208b5c241c8b442418e88affffff89c18b4500eb05e9210000008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c214009000000000b0000000|@6329,1048575,@524|42,0,@5384 164,0,0 7944:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@525|60,0,0 7945:O4|@4608,@5398,@7947,@7946 7946:O5|@7948,126,0,126,0 7947:S25|636c65616e457874726163743a20656d707479207573616765 7948:S58|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f52454d4f56455f524544554e44414e542e736d6c 7949:D3,204|3b650c7303ff5524f6c301740783fb017d08eb21f643ff10751b8b4c24048b09f6c3017409f6c10174043bd9eb05ff5538ebf77c0c89c1b8f0ea7ab28b5d04ff1389d9f6c101740583c1027105ff5538ebf68b5424048b4c4afe83f901740d89de89cb9090e87600000089f3f6c301740783fb017d08eb21f643ff10751b8b4c24048b09f6c3017409f6c10174043bd9eb05ff5538ebf77c0c89c1b8b0f57ab28b5d04ff13f6c301740583c3027105ff5538ebf68b4c2404894459feb801000000c2040000000000c8000000|@7951,31,@527|56,0,@6373 102,1,@7950 156,0,@6397 189,0,0 7950:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@526| 7951:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836296164644c6f63616c557365283229 7952:D3,1516|8d7c24b03b7d0c7303ff55288b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000ba010000008b7010f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdcf6c201740783fa017d08eb1bf642ff107515f6c201740a81fafdffff017c28eb06f642ff1075208b701c8b7818ff7014ff7004ff701050ff700cff30b834f67ab28b5d0490ff1389d6f7c601000000740583c6027105ff5538ebf689cf89f18b701cff7014ff7004ff701050ff700cff30ff7018b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89178b45008d40f43b45087303ff5520894500c740fc02000000c70080567db28978048060ffbf8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000c7020c587db2894a048062ffbf5689de57bf0100000053515052f7c60100000075658b0683380375238b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c701ec7d7ab2eb49833801751c83ff0175058b4804eb3a89fb8b480489c89090e8c606000089c1eb288b4d008d49f43b4d087303ff5520894d00c741fc02000000eb05e91b000000897904c701c4777ab289cf8b76043b650c7303ff5524e973ffffff89f88b4d008d49e03b4d087303ff5520894d00c741fc07000000c7014c597db28b5424188951048b5c24488959088b74244489710c8b7c24408979108b54243c8951148b5c24248959188061ffbf5051ff742408ff742428ff74241489c38b4424348b5424609090ff128b4c240c8b0989cabb0100000050f6c20175618b0283380375238b75008d76f43b75087303ff5520897500c746fc02000000895e04c706ec7d7ab2eb57833801752583fb0175058b7004eb1689ce8b7a048b480489c890e8ea06000089f189c6eb358b7a04eb308b75008d76f43b7508730aeb05e92f000000ff5520897500c746fc02000000895e04c706c4777ab28b7a04eb038b7a0489f389fa3b650c7303ff5524e966ffffff89d8f6c10175358b542404f6c20175228b1a833b037405833b077507be03000000eb148b5a0489da3b650c7303ff5524ebd9be0100000083fe017407b801000000eb678b542404f6c201751d8b1a833b05750f8b5a0489da3b650c7303ff5524ebe5ba01000000eb05ba0300000083fa01745e89c2f6c201751d8b1a833b05750f8b5a0489da3b650c7303ff5524ebe5ba01000000eb05ba0300000083fa017465ba01000000a801eb05e9db000000755a83fa037507ba03000000eb688b10833a0574178b5804b8745a7db28b5d04eb05e9af000000909090ff138b5c2404f6c301755b8b33833e0574108b7804b8b45a7db28b5d04909090ff138b7e04f7c701000000eb0ae97a000000e94b0000007509f64204017503ff55383b7a047415ff7304eb05e9210000005b3b650c7303ff5524ebaaff7204ba01000000eb098b5a04ba030000005383c4048b40043b650c7303ff5524e94bffffff89d083f801741c8b45008d40f83b45087303ff5520894500c740fc010000008908eb0cb801000000eb05b8e05a7db283f801756c8b4424208b00ba01000000a80175328b188b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b580489d83b650c7303ff5524ebca89d089c389ce8b44243490e88a0500008b4c24188b09ba010000005383f901745189cb83eb0283e902eb05e997000000f6c101740583c1027105ff5538ebf68b7c241c8b4c4ffe8b7d008d7ff43b7d087303ff5520897d00c747fc02000000895704890f89d989fa3b650c7303ff5524ebaa89f789d390e81652feff89c18b45008d40dc3b45087303ff5520894500c740fc080000008b54242089501c8b5424288950188b5424408950148948105989480c8978088b4c24388948048b0c24890883c440c2140083380175068b442414eb0e8b188b442414909090e81a0500008b4c24548b5424508b5c244c8b7424488b7c2444894c245489542450895c244c89742448897c244489c383c4305883c40ce91cfaffff00000000e8050000|@7970,1048575,@537|38,0,0 43,0,0 111,0,16777214 147,0,@6401 203,0,0 274,0,@7953 311,0,0 327,0,@7956 343,0,0 395,0,@5413 426,1,@7959 470,0,@5383 520,0,@7960 607,0,0 653,0,@5413 686,1,@7961 737,0,@5383 795,0,1 817,0,0 827,0,0 865,0,0 872,0,1 911,0,0 918,0,1 928,0,0 949,0,1 966,0,@7962 1005,0,@7965 1079,0,0 1089,0,1 1149,0,0 1156,0,@7967 1172,0,0 1242,1,@7968 1253,0,0 1350,1,@6721 1450,1,@7969 7953:D3,212|3b650c7303ff5524a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8f0ea7ab28b5d04909090ff1389c1f6c101740583c1027105ff5538ebf68b72048b4c4efe83f901741689d75089da89cb89d09090e87a00000089c389faeb01508b0424a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0bb8b0f57ab28b5d0490ff13a801740583c0027105ff5538ebf68b520483c404895c42feb801000000c39000000000d0000000|@7955,63,@529|53,0,@6373 106,1,@7954 163,0,@6397 198,0,0 7954:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@528| 7955:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229636865636b417267283229 7956:D3,52|3b650c7303ff55248b4a048b0983f901740e89d689cb909090e82a00000089f28b52048902b801000000c3900000000030000000|@7958,31,@531|26,1,@7957 38,0,0 7957:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@530| 7958:S63|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229616464526566283129 7959:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@532| 7960:D3,188|3b650c7303ff55248b4a18f6c101740d89c6b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca83390775135289d88b4a0889ca9090ff12b8c4777ab2eb4a833903750e528b41048b720c89f290ff12eb37833901751052518b41048b721089f290ff1258eb22f6c301740bb8744e7db28b5d0490ff1389d75751ff771489d88b5904e81af5ffff588b0c248b590483c404e99b9dfeff90909000000000b8000000|@7931,1048575,@533|19,0,@5417 83,0,@5383 135,0,@7945 158,1,@7949 173,1,@6874 7961:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@534| 7962:O4|@4608,@5398,@7964,@7963 7963:O5|@7948,101,0,101,0 7964:S12|6e6f74205573654669656c64 7965:O4|@4608,@5398,@7964,@7966 7966:O5|@7948,98,0,98,0 7967:O1|@5384 7968:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@535|60,0,0 7969:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@536| 7970:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229 7971:D3,1068|3b650c7303ff5524a801755a8b088339017558ff710cff710853ff7110ff742424ff742424ff742424ff742424ff7424248b480489c8909090e8c2ffffff8b4c2408f6c101740783f9017d08eb2df641ff1075278b5424048b12f6c1017415f6c2017410eb0ae9af030000e9eb0000003bcaeb05ff5538ebf77c0e89c2b8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b5424048b4c4afe83f9017529508b442404909090e88e03000081e0010000c081f8010000c07407b8cc777ab2eb0cb801000000eb0589c389c853a80174075883c410c2140050ff742428ff742428ff742428ff742428ff74241cbbcc777ab28b44241c8b542440ff128b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44241489410c8b44241089410858894104c701010000008b45008d40f43b45087303ff5520894500c740fc020000008b1424895004890883c414c21400833905757353ff7104ff74241cff74241cff74241cff74241cff74241c8b480489c8e87efeffff508b4424049090e8b202000081e0010000c081f8010000c075075883c408c21400ff74241cff74241cff74241cff74241cff742418bbcc777ab28b4424188b542434ff128b4d008d49e83b4d08730aeb05e92e000000ff5520894d00c741fc02000000894104c701050000008d410cc740fc020000008b1424895004890883c40cc21400833907756253ff7104ff74241cff74241cff74241cff74241cff74241c8b480489c890e8d2fdffff506a01ff74240cff742424ff742424ff742424ff742424bb010000008b44241c909090e87a0400008b5c2408909090e8ba060000a801740c5883c408c21400e9390000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc020000008b1424895004890883c40cc2140053ff7108ff710cff742420ff742420ff742420ff742420ff7424208b480489c89090e82efdffff8b4c2404f6c101740783f9017d08eb21f641ff10751b8b5424088b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b5424088b4c4afe83f9017529508b442404909090e80601000081e0010000c081f8010000c07407b8cc777ab2eb0cb801000000eb0589c389c853a80174075883c40cc214008b4c240483390f754250ff742424ff742424ff742424ff742424ff74242089c38b4104e812f1ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010f000000eb2350ff742424ff742424ff742424ff742424ff74242089c389c88b54243c9090ff1289c18b45008d40e03b45087303ff5520894500c740fc0400000089480c8b4c240c89480859894804c7000300000089c18d4014c740fc020000008b1424895004890883c410c21400b801000000c2140090900000000028040000|@7977,2097151,@541|126,0,@6373 174,1,@7972 186,0,-536870912 193,0,@5384 200,0,0 244,0,@5384 305,0,0 394,1,@7972 406,0,-536870912 440,0,@5384 490,0,2 582,0,0 594,1,@7974 606,1,@7976 655,0,3 774,0,@6373 822,1,@7972 834,0,-536870912 841,0,@5384 848,0,0 906,1,@7952 939,0,7 1020,0,1 1051,0,0 7972:D3,592|3b650c7303ff55248b08ba36607db28d548afcffe290e979000000909090e977000000909090e963000000909090e99a000000909090e953000000909090e912010000909090e92e010000909090e93b000000909090e926010000909090e924010000909090e922010000909090e98b010000909090e992010000909090e990010000909090e990010000909090b8010000e0c3b801000000c3ff700cff70088b40049090e856ffffff508b4424049090e84affffff230424508b44240c909090e83affffff23042483c410c38b48088339057563f6410401740e8b5004b8ecd57ab28b5d0490ff13ff7004ff71048b1c24b8cd00000090ff1508cd520883f80174438b1c24b8cf00000090ff1568cd52088b4c2404f6c10175278b11ff7104508b029090e8d6feffff23042483c404593b650c730aeb05e912000000ff5524ebd483c408c3b80100000083c408c3b801000000c3ff70088b40049090e89efeffff81c801000080508b442404e88efeffff23042483c408c38b4004e97ffeffffb801000000c3b801000000c3ff70048b40089090e866feffff59f6c101755d8b11833a017511ff7104508b4210909090e84afeffffeb34833a05750fff7104508b420490e836feffffeb20833a07750989c3b8010000e0eb0eff7104508b420ce81afeffffeb04ff71045323042483c404593b650c7303ff5524eb9ec38b4004e8fafdffff81e0ffffff7fc3b801000000c38b4008e9e5fdffff8b4004b9010000e0a801751eff7004518b00e8cefdffff23042489c183c404583b650c7303ff5524ebde89c8c3000000004c020000|@7973,2097151,@538|11,0,$7972+22 143,0,-268435456 149,0,0 223,0,@6321 243,0,102 250,0,I150 263,0,103 270,0,I153 327,0,0 336,0,0 386,0,0 392,0,0 468,0,-268435456 526,0,0 543,0,-268435456 7973:S33|434f4445545245455f46554e4354494f4e5328292e636f646550726f7073283129 7974:D3,464|3b650c7303ff5524a801756e8b088b5104f6c201740783fa017d08eb24f642ff10751e8b7424148b36f6c201740cf7c60100000074043bd6eb05ff5538ebf77c108b7004b8f0ea7ab28b5d04909090ff13f6c201740583c2027105ff5538ebf68b7424148b5456fe83fa0175618b55008d52f43b5508730aeb05e9fd000000ff5520895500c742fc02000000895a04890a8b5c24188b7c24108b4c240c528b54240cff70048b44240c895c24208974241c897c2418894c2414895424108944240c8b5c24045883c404e932ffffff8b7d008d7ff43b7d087303ff5520897d00c747fc02000000895704c707c4777ab2ff700453ff7104ff74241cff74241cff74241cff74241c5689fb8b410890e8beecffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104588901516a03ff742424ff742424ff742424ff742424ff7424248b5c241c8b4424209090e8aafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21800837c2418017508b801000000c218008b4424148b4c24108b54240c8b7424088b7c240453bb01000000895c241c89442418894c2414895424108974240c897c2408bb0100000058e938feffff00000000cc010000|@7975,1048575,@539|69,0,@6373 235,0,@5383 270,1,@7952 388,0,0 417,0,0 446,0,0 7975:S93|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734465637328312970726f636573734d757475616c73283329 7976:D3,196|3b650c7303ff5524a80175708b088b11f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b5453fe8b75008d76f03b75087303ff5520897500c746fc030000008b7904897e08eb05e9320000008b39897e048916568b400490e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000c0000000|@6329,63,@540|64,0,@6373 180,0,0 7977:S76|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f6365737344656373283129 7978:D3,324|3b650c7303ff5524a80175578b4c241cba01000000ff700453ff30f6c101755c8b0183380575468b5c2404f6c3017509f64004017503ff55383b5804752a83fa0175058b5008eb168b710489d38b480889c8909090e8fe00000089c2eb388b7104eb33e9cc0000008b7104eb2989d38b55008d52f43b5508730aeb05e924000000ff5520895500c742fc02000000895a0489028b710489f13b650c7303ff5524e976ffffff89d083f8017505b8cc777ab2ff742420ff742420ff742420ff742420ff74242089c38b4424148b54243890ff1283c40459f6c101740583c1027105ff5538ebf650ff742424ff742424ff742424ff742424ff742424ff742424ff74242489cb8b44242090e8f2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c21c00b801000000c21c000000000040010000|@7980,1048575,@543|17,0,0 86,1,@7979 173,0,@5384 309,0,0 7979:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@542| 7980:S77|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734669656c64283229 7981:S62|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283229 7982:D3,56|3b650c7303ff5524b9cc467db28b1c24890c24ff7204ff7208ff720cff7210ff721489d9bbcc777ab251e92ddeffff900000000034000000|@7983,2097151,@545|9,0,@7940 37,0,@5384 43,1,@7941 7983:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283129283129 7984:S52|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229 7985:S40|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629 7986:S35|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429 7987:O3|@7988,@7796,@7912 7988:D3,60|3b650c7303ff55248b4c24048b730c897424048b3b8b3424893c24ff720453ff7304ff7208ff700489cb8b0056e91e00000090900000000038000000|@8022,2097151,@562|46,1,@7989 7989:D3,2100|8d7c249c3b7d0c7303ff5528a801756b8b08833901756953ff710cff7004ff7108ff7110b8010000008b542430909090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701050000008d510cc742fc02000000894a04c702030000008d4a0cc741fc02000000c74104ec7d7ab28911eb0ae98d070000e99404000089c28d410cc740fc020000008948048b4c24048908528b54243090ff126a016a016a0189e0508b5c24388b4424148b54243c90ff128b042483381975728b480c83390975208b5104833a0575188b5a04f6c301750af644240c017503ff55383b5c240c74138b48088b5004b850727db28b5d04909090ff13ff7008ff7004b8010000008b542448ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701050000008d510ceb05e92e030000c742fc02000000894a04c702030000008d4a0cc741fc02000000c74104ec7d7ab2891189c28d410cc740fc020000008948048b4c241c8908528b5424489090ff126a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff7424588d5c241c8b44244c90e856feffffb8010000008b54245890ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241089510c894108c7410401000000c70103000000a801740783f8017c08eb15f640ff10740f89c2b8a4727db28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc02000000894204c702050000008d420cc740fc02000000895004c700090000008b542414bb010000008b32515083fe01746d89f083e80289f183e90283ee028b54241c6a016a01535051ff72048d7c241057bb1100000089f09090ff1548c752088b44241059d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae970000000b80300000083f00283f80175068b442408eb478b45008d40e03b45087303ff5520894500c740fc04000000c7400c010000008b0c248948088b4c2414894804c7000d00000089c28d4014c740fc020000008b5c2408895804891083c4045e83c40c89c33b650c7303ff5524e919ffffffb80100000089d9f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801750af644243c017503ff55383b44243c740db8f4727db28b5d04909090ff138b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804c7001d000000f6c301751d8b0b833905750f8b4b0489cb3b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e8d6abfeff8b4d008d49d43b4d087303ff5520894d00c741fc0400000089410c8b44241483c404894108c7410401000000c701030000008b44244cc700030000008d5114c742fc020000008b5c2408895a04890a8d4a0cc741fc020000008951045a891183f90175068b4c241ceb1089cb8b44241c909090e80205000089c18b4424385a83c40489108948045983c40c894808b80100000083c424c21c006a016a016a01ff74244cff74244cff74244cff74244cff74244cff74244cff74244c8d5c241c8b442440e86afbffff8b5c240c8b442410909090e856a8ffff8b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44242889410c8b442418894108c7410401000000c701010000008b45008d40f43b45087303ff5520894500c740fc020000008b54240489500489088b4c242c5a83c404891189410458894108b80100000083c424c21c0083390775716a016a0189dfff70048d5c24048b4104909090e86a040000837c24080175068b442404eb0f8b5c24088b4424049090e8360500005750ff74242c8b5c243490e87e050000ff74241cff742428ff74243489c38b44240c90e84e0600006a016a016a0150ff742440ff742440ff742440eb05e975000000ff742440ff742440ff742440ff7424408d5c24208b44243490e84efaffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c7000700000090e86e070000837c24040174098b5c2404e8e21200008b4c24105a83c40489118941045883c404894108b80100000083c410c21c0083390575706a016a016a0153ff70048d542408528b5c24288b41048b54242cff128b442408833817751f8b4c240489018b44240c8941048b442410894108b80100000083c414c21c006a016a016a01ff74243cff74243cff74243cff74243cff74243cff74243cff74243c8d5c241c8b442428eb05e97f0000009090e876f9ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2414894804c700050000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b542404895104890183f90175068b442418eb0b89cb8b442418e83e1200008b4c24105a83c404891189410458894108b80100000083c414c21c006a016a016a0153ff7004ff71088d54240c528b5c242c8b410c8b54243090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24148948088b5424108950048b5c240c8918833b1775178b4424088918895004894808b80100000083c418c21c006a016a0189e1518b5c2434e8d298ffff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240489088b542434ff126a016a016a01ff742444ff742444ff742444ff742444ff742444ff742444ff7424448d5c241c8b44243090e82ef8ffff837c24040175068b44240ceb0f8b5c24048b44240c9090e88e1100008b4c24185a83c40489118941045883c404894108b80100000083c418c21c008b4424148b4c24048b542410895c241c89d389c689c889f25e83c41856ff220000000030080000|@8021,2097151,@561|37,0,0 79,0,2 98,0,1 115,0,@5413 241,0,@7990 260,0,0 299,0,2 325,0,1 342,0,@5413 427,0,0 475,0,0 481,0,1 505,0,@7993 546,0,2 565,0,4 574,0,0 620,0,8 630,0,I104 654,0,1 667,0,31 690,0,0 702,0,1 747,0,0 766,0,6 814,0,0 873,0,@7996 912,0,0 921,0,14 953,0,0 960,0,1 970,1,@6933 1014,0,0 1020,0,1 1030,0,1 1090,1,@7999 1117,0,0 1186,1,@7846 1234,0,0 1240,0,0 1295,0,0 1330,1,@8000 1358,1,@8001 1374,1,@8002 1398,1,@8003 1488,0,3 1494,1,@8005 1510,1,@8018 1535,0,0 1608,0,0 1707,0,2 1762,1,@8019 1784,0,0 1888,0,0 1910,1,@7829 2026,1,@8020 2051,0,0 7990:O4|@4608,@5398,@7992,@7991 7991:O5|@7792,394,0,394,0 7992:S32|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e6572 7993:O4|@4608,@5398,@7995,@7994 7994:O5|@6847,247,0,247,0 7995:S27|6d6b4c6f616478783a20617267756d656e74206e65676174697665 7996:O4|@4608,@5398,@7998,@7997 7997:O5|@7792,404,0,404,0 7998:S37|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e65722073697a65 7999:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@549| 8000:D3,212|3b650c7303ff5524a801756c8b088b5108837a14017407be01000000eb05be030000006a016a015351568d5c240c8b4004e8caffffff833c240174428b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240489088b4c240889018b442410894104b80100000083c414eb05e93c000000c38b45008d40f43b45087303ff5520894500c740fc020000008b4c24108948048b4c240489088b4c24088b54240c8911894104b80100000083c414c3c70301000000c7430401000000b801000000c300000000d0000000|@6496,31,@550|24,0,0 31,0,1 111,0,0 177,0,0 187,0,0 194,0,0 199,0,0 8001:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@551| 8002:D3,212|3b650c7303ff5524a80175708b0853ff7004ff7104b80100000089daff128b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701050000008d510cc742fc02000000894a04c702030000008d4a0cc741fc02000000c74104ec7d7ab2891189c28d410cc740fc020000008948048b0c24890852eb05e9430000008b542414909090ff12ff7424148b5c24108b44240c909090e862ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c20400b801000000c2040000000000d0000000|@6329,1048575,@552|22,0,0 59,0,2 78,0,1 95,0,@5413 197,0,0 8003:D3,336|3b650c7303ff5524a8017570f6c30175708b088b55008d52f03b55087303ff5520895500c742fc010000008b710489328d7a08c747fc010000008b3389376a016a01ff7304ff700456ff710452578d442418508b5c242c8b41088b5424309090ff128b45008d40d03b45087303ff5520894500c740fc02000000eb0ae9bf000000e9ba0000008b4c2404894804c700050000008d500cc742fc02000000894204c702030000008d420cc740fc020000008b5c2414895804891089c28d400cc740fc020000008950048b142489108b54241c83c404ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c240c89480859894804c7000100000050ff742420ff742420ff7424208b5c24148b44241090e8e6feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c20c00b801000000c20c00000000004c010000|@8004,1048575,@553|143,0,2 162,0,1 251,0,0 321,0,0 8004:S17|4c697374506169722e6d61702833292829 8005:D3,684|3b650c7303ff5524833807755af6400401740e8b4804b81c777bb28b5d0490ff138b48048b118b5d008d5bf43b5d087303ff5520895d00c743fc020000008b720489730489336a016a01f6c10175708b118b7204f7c6010000007410f60301740b3b337d0ceb0ce912020000ff5538ebf08b338b7a04f7c701000000740583c7027105ff5538ebf6f7c701000000740df643040174073b7b047e07eb08ff5538ebf48b7b048b5d008d5bf43b5d087303ff5520895d00c743fc02000000eb05e917000000897b0489338b510489d13b650c7303ff5524e96fffffff89e18b13891189e18b73048971048b4c2404f6c101740bf604240174052b0c247105ff5538ebf683c101f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c15eb06f641ff10750d8b7804b834f67ab28b5d04ff1389cff7c701000000740583c7027105ff5538ebf65189f98b7804b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44240489078b0424b9107a7db257a80175738b108b5a04f6c301740df644240c0174062b5c240c7105ff5538ebf583c301f6c301740783fb017d08eb23f643ff10751d8b34248b36f6c301740cf7c60100000074043bdeeb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c301740583c3027105ff5538ebf68b34248b5c5efeeb05e93400000083fb017519ff7004ff74241056ff74241089cb89d09090e8aa000000eb068b500489c85289c1583b650c7303ff5524e950ffffff8b4108b90100000083c414a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8c389c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3909000000000a8020000|@8017,1048575,@557|23,0,@6704 286,0,16777214 304,0,@6401 340,0,0 393,0,@8006 484,0,@6373 546,1,@8007 578,0,0 667,0,0 8006:O3|0,0,0 8007:D3,820|3b650c7303ff55248b48088b55008d52f43b55087303ff5520895500c742fc020000008b730489720489028b7804f7c701000000740df644240c0174062b7c240c7105ff5538ebf583c7018b75008d76f43b75087303ff5520897500c746fc02000000ff70048b0389460489068b45008d40f83b45087303ff5520894500c740fc010000008930f7c701000000740783ff017d08eb27f647ff1075218b74240c8b36f7c701000000740cf7c60100000074043bfeeb05ff5538ebf77c0c89c6b8b0f57ab28b5d04ff1389fef7c601000000740583c6027105ff5538ebf6ff33578b7c2414894477fe8b442404a801740583c0027105ff5538ebf68b75008d76f03b75087303ff5520897500c746fc030000008b5b08895e0889560489066a016a016a018b490cf6c1017530ff7104ff742420ff74242cff74242cff742424b8687d7db25089f38b0190e80202000089c6593b650c7303ff5524ebcb89e08b0e890889e08b560489500489e08b5e088958088b44240ca801740783f8017d08eb23f640ff10751d8b7c24208b3fa801740cf7c70100000074043bc7eb05ff5538ebf77c0ab8f0ea7ab28b5d04ff13a801740583c0027105ff5538ebf68b7c24208b4447fe83f801750d50b84cc37bb28b5d049090ff138b008b4004a801750af6442410017503ff55383b44241075646a016a018b44240cb901000000a801740e89c2b810827db28b5d049090ff138b108b5a04f6c301750af644241c017503ff55383b5c241c75308b75008d76f43b75087303ff5520897500c746fc02000000894e04891689e18b7804893989e1897104eb36e9a40000008b75008d76f43b75087303ff5520897500c746fc02000000894e04891689f18b700489f03b650c7303ff5524e973ffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b742404897104c701070000008b75008d76f43b75087303ff5520897500c746fc020000008b442410894604890e8b45008d40f03b45087303ff5520894500c740fc030000008970085983c4048948048b0c24890883c418c20c008b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948048b0c24890883c418c20c000000000030030000|@8016,1048575,@556|192,0,@6397 319,0,@8008 330,1,@8009 420,0,@6373 458,0,@6769 503,0,0 514,0,@8013 681,0,3 8008:O1|@8007 8009:D3,692|3b650c7303ff552483380575688b4c2414f6c10175318b118b7004f7c6010000007509f64204017503ff55383b72047507bf03000000eb148b510489d13b650c7303ff5524ebcabf0100000083ff01746c8b4804f6c101740df64424100174062b4c24107105ff5538ebf583c101f6c101740eeb05e92d02000083f9017d08eb21f641ff10751b8b54240c8b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0f8b5004b8f0ea7ab28b5d049090ff1389caf6c201740c83c202eb05e9e00100007105ff5538ebef8b74240c8b5456fef6c20175628b5304f6c20175318b328b7804f7c7010000007509f64604017503ff55383b7e047507bf03000000eb148b720489f23b650c7303ff5524ebcabf0100000083ff017471f6c101740783f9017d08eb27f641ff1075218b44240c8b00f6c101740feb05e968000000a80174043bc8eb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b44240c8b4c48fe83f901750cb84cc37bb28b5d049090ff138b0953ff742414eb05e911000000508b198b442414909090e82a010000eb015358c214008b542414f6c20175478b328b7e04f7c7010000007509f64004017503ff55383b7804751e8b75008d76f83b75087303ff5520897500c746fc010000008b128916eb13ff72045a3b650c7303ff5524ebb4be0100000083fe01750ab84cc37bb28b5d04ff1351ff742414ff742414ff7424208b068b542414ff128b0c24f6c101740783f9017d08eb21f641ff10751b8b5424108b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0f89c2b8f0ea7ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b54241083c4048b4c4afe83f901750d89c3b84cc37bb28b5d0490ff138b0950ff742414528b59048b44241490e82a00000058c2140089d8c2140089d8c2140000000000b0020000|@8012,1048575,@555|50,0,1 72,0,0 166,0,@6373 250,0,1 272,0,0 333,0,@6373 374,0,@6769 410,1,@8010 502,0,0 512,0,@6769 593,0,@6373 639,0,@6769 666,1,@8010 8010:D3,296|a801740df64424080174062b4424087105ff5538ebf583c001a801740783f8017d08eb20f640ff10751a8b4c24048b09a8017409f6c10174043bc1eb05ff5538ebf77c0d89c1b8f0ea7ab28b5d0490ff1389c1f6c101740583c1027105ff5538ebf68b5424048b4c4afe83f901750e89c6b84cc37bb28b5d049090ff138b31f6c301740df646040174073b5e047e0aeb05ff5538ebf48b5e048b7d008d7fec3b7d087303ff5520897d00c747fc02000000895f048b1e891f8d570cc742fc01000000893aa801740783f8017d08eb23f640ff10751d8b7c24048b3fa801740cf7c70100000074043bc7eb05ff5538ebf77c0f89c7b8b0f57ab28b5d04909090ff13a801740583c0027105ff5538ebf68b7c2404895447feb801000000c20800900000000024010000|@8011,63,@554|71,0,@6373 114,0,@6769 245,0,@6397 280,0,0 8011:S60|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297570646174654d696e283229 8012:S80|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e7428322970726f636573734c696e6b283229 8013:O4|@4608,@5398,@8015,@8014 8014:O5|@6847,430,0,430,0 8015:S11|737461636b20656d707479 8016:S66|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e74283229 8017:S48|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e6773283129 8018:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@558| 8019:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@559| 8020:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@560| 8021:S46|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229636f707944656373283129 8022:S35|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229 8023:D3,2076|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc040000008b74240489710c8b7c24088979088b7c240c89790489198b38be86847db28d74befcffe69090e97b000000909090e9c2010000909090e963000000909090e905020000909090e951020000909090e94b000000909090e9d2020000909090e979040000909090e933000000909090e92b000000909090e9b1040000909090e91b000000909090e911050000909090e935060000909090e907070000909090b801000000c20c008b4c240c8b095352ff7004ff7008518b442404e8520700008b5c2408909090e8da91ffff8b4d008d49e43b4d087303ff5520894d00c741fc06000000c701008d7db28b54240c8951048b5c24108959088b74242089710c8b7c241c8979108b5424188951148061ffbf89cbe89e74ffff89c189c8909090e8be07000083f80175208b45008d40f83b45087303ff5520894500c740fc01000000890883c414c20c008b4424208b0c248908ff742410ff74241050ff7424288b5c24288b442414e82e0800008b4d008d49e43b4d087303ff5520894d00c741fc06000000c701cc8f7db28b54240c8951048b5424108951088b54242089510c8b5c241c8959108b7424188971148061ffbf5089cb8b44240c909090e8f673ffff8b4d008d49e83b4d087303ff5520894d00c741fc030000005a895108894104c701010000008d4110c740fc01000000890883c414c20c006a016a016a01ff700c518d4c2408518b58088b480489c88b520c90ff12ff7424088b5c24048b442408909090e88609000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc20c006a016a016a01ff700c518d4c2408518b58048b480889c88b52109090ff12ff7424088b5c24048b442408909090e8760a000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc20c008b40048b54240890ff128b08833901752c8b55008d52f03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c70205000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70209000000ff700489d3b8010000009090e8260b000089c18b45008d40f83b45087303ff5520894500c740fc010000008908c20c006a016a016a016a016a016a01ff7008ff700c8d5c24085389cb8b40048b5204ff128b44241083380575728b48088b44240489caff128b08833901752c8b55008d52f03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c70205000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702090000008d5c241489138d5424148b5c240ceb05e90f000000895a048d5424148b5804895a08eb61833c2401744e8b44240883380575106a038b5c2408909090e8a662feffeb618b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000008b4c24048948088b4c2408894804c7000d000000eb598b44240883380575166a01eb05e9630000008b5c24089090e85262feffeb3a8b45008d40ec3b4508730aeb05e928000000ff5520894500c740fc04000000c7400c010000008b4c24048948088b4c2408894804c7000d0000008d4c241489018d4424148b4c240c8948048d442414c74008ec7d7ab2ff74241c8b5c24188b44241c909090e8be0a000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c420c20c006a016a016a016a018d5c24085389cb8b40048b5214909090ff128b45008d40ec3b45087303ff5520894500c740fc020000005983c404894804c7000f00000089c18d400cc740fc010000008908c20c008b5d008d5bf43b5d087303ff5520895d00c743fc020000008b70088973048b7804893b6a016a016a0189e75789df89cb89f88b5218909090ff12ff7424088b5c24048b442408909090e8420b000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc20c008b75008d76e43b75087303ff5520897500c746fc06000000c70660967db2895604895e088b5c240c895e0c8b7c2408897e108b5c2404895e148066ffbf52ff700851ff700489f38b400c909090e8c66fffff6a016a016a018b4c2418508d542404528b5c24188b4424148b5104909090ff128b44240c8338057570ff700868a0967db289e38b400490e87eadfdff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000ff742410ff74242489cb8b44241090e86e0c000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c428eb05e903000000c20c00ff742408ff74241c8b5c240c8b4424089090e82e0c000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c420c20c008b4d008d49e43b4d087303ff5520894d00c741fc06000000c701c4aa7db28951048959088b54240c89510c8b5c24088959108b7424048971148061ffbfff7004ff700c89cb8b400890e89e6effff8338057539f6400401741df6400401750e8b4804b808a87cb28b5d0490ff138b40043b442404740bb804ab7db283c408c20c00b80cab7db283c408c20c008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b142489510c8941088b442404894104c7011b0000008b45008d40f83b45087303ff5520894500c740fc01000000890883c408c20c006a016a016a01518d4c2404518b58088b480489c88b5208909090ff12ff7424088b5c24048b442408909090e8e21e000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc20c000000000018080000|@8078,2097151,@593|58,0,$8023+70 191,0,0 218,1,@8024 230,1,@7846 260,0,@8025 306,1,@7801 318,1,@8026 390,1,@8028 420,0,@8030 474,1,@7801 511,0,0 578,1,@8031 662,1,@8033 755,0,2 793,0,4 803,0,0 810,1,@8035 943,0,2 981,0,4 1046,1,@6843 1079,0,1 1099,0,6 1130,1,@6843 1170,0,0 1190,0,6 1218,0,@5413 1238,1,@8037 1335,0,7 1430,1,@8039 1494,0,@8041 1546,1,@7801 1595,0,@8042 1606,1,@6547 1637,0,0 1646,0,14 1666,1,@8044 1730,1,@8044 1794,0,@8073 1842,1,@7801 1867,0,@7422 1887,0,@8074 1898,0,@8075 1950,0,13 2030,1,@8076 8024:D3,124|3b650c7303ff5524a801755f8b088b118b5d008d5bec3b5d087303ff5520895d00c743fc040000008b720889730c8b7a04897b088b0a894b04c70303000000538b40049090e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000078000000|@6329,63,@563|59,0,1 108,0,0 8025:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@564| 8026:D3,108|3b650c7303ff552483381975088b4004e9ebffffff83380b75088b4008e9deffffff833803751fff700c8b4008e8ceffffff83f8017409b80300000083c404c358e9baffffff83381575088b4008e9adffffff8338137406b801000000c3b803000000c30000000068000000|@8027,1,@565|56,0,1 89,0,0 95,0,1 8027:S46|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c2835296861734c6f6f70283129 8028:D3,384|3b650c7303ff5524a80175738b088b1153ff7004ff7104ff32ff7208ff7204b80100000089da9090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701050000008d510cc742fc02000000894a04c702030000008d4a0cc741fc02000000c74104ec7d7ab2891189c28d410cc740fc02000000eb05e9ec0000008948048b0c248908528b54242c909090ff128b45008d40e43b45087303ff5520894500c740fc06000000c7008c8f7db28b4c24288948048b54242c8950088b5c242489580c8b7424208970108b7c24188978148060ffbf89c38b442408e8366bffff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c4088941045889018b45008d40f43b45087303ff5520894500c740fc020000005a895004890850ff74241cff74241cff74241cff74241c8b5c24188b442414909090e8b6feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21000b801000000c21000000000007c010000|@6329,1048575,@567|32,0,0 71,0,2 90,0,1 107,0,@5413 176,0,@8029 226,1,@7801 369,0,0 8029:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@566| 8030:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@568| 8031:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e98986ffff900000000074000000|@7854,63,@570|30,1,@8032 68,0,2 86,0,0 107,1,@7846 8032:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@569|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8033:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e94585ffff900000000074000000|@7854,63,@572|30,1,@8034 68,0,2 86,0,0 107,1,@7846 8034:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@571|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8035:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e90184ffff900000000074000000|@7854,63,@574|30,1,@8036 68,0,2 86,0,0 107,1,@7846 8036:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@573|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8037:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9bd82ffff900000000074000000|@7854,63,@576|30,1,@8038 68,0,2 86,0,0 107,1,@7846 8038:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@575|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8039:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e97981ffff900000000074000000|@7854,63,@578|30,1,@8040 68,0,2 86,0,0 107,1,@7846 8040:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@577|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8041:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@579| 8042:D3,112|3b650c7303ff55248b520490ff128b08833901752b8b45008d40f03b45087303ff5520894500c740fc030000008b51088950088b5904895804c70005000000c38b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c70009000000c3909090000000006c000000|@8043,1048575,@580|59,0,2 96,0,4 8043:S7|6f283229283129 8044:D3,1700|3b650c7303ff55248b0bba4a977db28d548afcffe290e991000000909090e9d0000000909090e963000000909090e95b000000909090e953000000909090e91a010000909090e943000000909090e93b000000909090e933000000909090e95b010000909090e961010000909090e91b000000909090e913000000909090e90b000000909090e97b0100009090905089d88b5c2408e81e0600008b4c240889c389c85a83c40852e9247fffffff73086a01ff74240c8b5b0490e842ffffff8b4d008d49f03b4d087303ff5520894d00c741fc030000005a895108894104c701010000008b44240889cb5983c40851e9dd7effff50ff7304ff730c6a01ff7424148b5b089090e8f6feffff506a01ff7424188b5c240c8b442414e8e2feffff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c5883c4048941085883c404894104c701030000008b44240889cb5983c40851e9737effff50ff73086a01ff7424108b5b04909090e88efeffff506a01ff7424148b5c240c8b442410e87afeffff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c408894104c7010b0000008b44240889cb5983c40851e9127effff8b4424085983c40851e9047effff837b040175068b4c2408eb1889c68b7b088b5b048b44240890e85606000089c189f0eb038b7b088b542404894c24088954240489fbe9fafdffff50ff7424088b5b04b8010000009090e87e06000050ff74241089c3b801000000909090e83e08000083f801756e8b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b0c24894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e8e67ffeffb9010000008b1424f6c2017523eb05e9a5000000f6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebd86a016a01508d54240452bba4a47db289c8ba08a57db290e80a0b00008b4424088060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b44240489018b45008d40ec3b45087303ff5520894500c740fc040000008b54241089500c8948085983c408894804c700190000008b4c241089c389c883c4085a83c40852e9857cffff8b086a016a01ff318d5c24048b4104909090e8d20c00008b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b54240489108b1c24833b05756dbe03000000bf0100000050ff73043b7c240c735e89f883c0026a016a0156508d4c240851bb1100000089f89090ff1548c752088b4424088b4c2420d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801eb0ae949020000e9340000007407b801000000eb05b80300000083f00283f8017507b801000000eb048b4424045f83c40c89c63b650c7303ff5524e963ffffff8b442424b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c856a801755c8b08833901755a8b542404f6c2017509f64108017503ff55383b5108755b8b590cf6c301750af6442410017503ff55383b5c24107543833c2401743d8b75008d76ec3b75087303ff5520897500c746fc020000008b7804897e04eb0ae95e000000e91a0000008b511089168d460cc740fc010000008930eb4bb801000000eb448339037533ff70048b410c9090e8dec3ffff81e0010000c081f8010000c0750e583b650c7303ff5524e94effffffb80100000083c404eb0cb801000000eb05b80100000083f80175678b45008d40f43b45087303ff5520894500c740fc020000008b4c240c894804c700090000008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241c89510c8b542408895108894104c701190000008b44242889cb83c4205983c40851e9247affff8b088b55008d52ec3b55087303ff5520895500c742fc040000008b5c241c895a0c8b5c2404895a08c7420401000000c702030000008b5d008d5bf43b5d087303ff5520895d00c743fc020000008b71048973048913ba01000000f6c301752e8b7d008d7ff43b7d087303ff5520897d00c747fc020000008957048b13891789fa8b5b043b650c7303ff5524ebcd8b1989d083c4205a83c40852e98679ffff8b4d008d49e03b4d087303ff5520894d00c741fc02000000895904c701090000008d510cc742fc040000008b5c2410895a0c894208894a04c702190000008b44241c89d383c4145983c40851e93579ffff9000000000a0060000|@8072,2097151,@589|11,0,$8044+22 150,1,@8045 168,1,@7846 223,0,0 239,1,@7846 329,0,1 345,1,@7846 426,0,5 442,1,@7846 456,1,@7846 486,1,@8047 527,0,0 534,1,@8048 546,0,0 554,1,@8053 590,0,0 602,0,14 634,0,0 641,0,1 654,1,@6933 659,0,0 717,0,@8055 724,0,@8058 730,1,@8060 818,0,12 839,1,@7846 862,1,@8066 912,0,1 917,0,0 948,0,8 958,0,I104 985,0,1 998,0,31 1033,0,0 1040,0,1 1053,0,0 1087,0,0 1270,0,0 1290,1,@7972 1302,0,-536870912 1323,0,0 1333,0,0 1340,0,0 1382,0,4 1429,0,12 1448,1,@7846 1495,0,0 1501,0,1 1538,0,0 1606,1,@7846 1639,0,4 1668,0,12 1687,1,@7846 8045:D3,324|3b650c7303ff552483380b755253ff7008ff74240c8b400490e8e2ffffff50ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c7000b000000c204008338177503c20400833815753cff7004ff7424088b4008909090e882ffffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70015000000c20400833803755d53ff7004ff700cff7424108b40089090e83effffff50ff7424148b5c24108b4424089090e82affffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c5983c4048948085983c404894804c70003000000c2040089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c895808894804c70019000000c2040090900000000040010000|@8046,15,@581|88,0,5 161,0,10 259,0,1 307,0,12 8046:S40|434f4445545245455f46554e4354494f4e5328292e6d6b536574436f6e7461696e65722833292829 8047:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@582| 8048:D3,308|3b650c7303ff552483fb017508b801000000c204008b4c2404a801740bf6010174063b017c0feb05ff5538ebf5b801000000c20400a801740783f8017d08eb1af640ff107514a801740bf6010174063b017c16eb05ff5538ebf589c2b814a17db28b5d04909090ff136a016a01ff33ff730450ff71048d54241052bb11000000ff1548c752088b44241059d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801744a8b0424a801740583c0027105ff5538ebf6ff7424188b5c2408909090e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2408890883c414c204008b0424a801740583c0027105ff5538ebf68b4c2418894c241883c4045b83c40ce9d4feffff0000000030010000|@8052,2097151,@583|14,0,0 46,0,0 93,0,@8049 124,0,8 130,0,I104 154,0,1 167,0,31 8049:O4|11,@4879,0,@8050 8050:O5|@8051,212,0,212,0 8051:S21|2e2f62617369732f426f6f6c41727261792e736d6c 8052:S54|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e657228342973656c656374283229 8053:D3,684|3b650c7303ff552483fb017503c204008b0b833909755e8b5104833a05755b8b742404f7c60100000075598b0e83390375378b7908f7c7010000007509f64204017503ff55383b7a04751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb208b4e0489ce3b650c730feb0ae920020000e91b020000ff5524eb9fb901000000f6c10175448b11833a0375428b720c833e0d754f8b7e04833f09754c837e0c01754ba801754c8b088b113b57047448833a0175488b47048338017545ff73048b5a04f6c3017515eb0ae9bb010000e9b6010000f64004017503ff55383b58047452eb55e9a1010000e99c010000e997010000e93e010000e99d000000e905000000ff7304eb55833a0375328b4704833803751bff73048b5a04f6c3017509f64004017503ff55383b58047552eb55ff7304eb55e964000000e9ed000000833a05752f8b47048338057522ff73048b5a04f6c3017510f6400401eb05e9ca0000007503ff55383b58047432eb56ff7304eb56833a07751e8b4704833807eb0fe9a7000000e914000000e99d0000007505ff7304eb08ff7304eb6cff7304f6410401740ab81c777bb28b5d04ff138b41048b5608f6c2017415f6000174103b107e6aeb0fe963000000e95e000000ff5538ebeb8b5d008d5be03b5d087303ff5520895d00c743fc0200000089430489138d530cc742fc02000000895a048b7f04893a8d5a0ceb05e920000000c743fc0100000089138b5424088954240889de8b1c2489f083c404e9cdfdffffb80100000083c404c204008b45008d40e03b45087303ff5520894500c740fc02000000c74004010000008b4e0889088d500cc742fc020000008942048b470489028d4a0cc741fc0100000089118b542404895424048b5b0489c8e96efdffffb801000000c20400b801000000c20400909000000000a8020000|@8054,63,@584|133,0,0 428,0,@6704 564,0,0 601,0,0 659,0,0 667,0,0 8054:S59|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429636865636b4669656c6473283229 8055:O1|@8056 8056:D3,16|b803000000c39090000000000c000000|@8057,1,@585|1,0,1 8057:S48|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429283129 8058:O2|@8060,@8059 8059:B4|ffffff7f 8060:D3,460|3b650c7303ff5524a801740783f8017d14eb06f640ff10740c89c1b8fca67db28b5d04ff1383f8017507b903000000eb59a801740783f8017d08eb1cf640ff107516a801740df642040174073b42047e14eb05ff5538ebf489c1b828a77db28b5d0490ff1389c1f6c101740583c13e7105ff5538ebf65053bb4100000089c890ff15e8c7520889c1eb025053b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fb801000000b903000000ba01000000bb0100000057f6c301740ff64424080174083b5c24087d6beb05ff5538ebf35253515089d88b542414ff1283f80174098b4424040b0424eb03586a01817c240401010000754f8b4c24108b54240cd1ead1e88804118d4400018d5412018b442408a801740583c0027105ff5538ebf683c20289c3b903000000b80100000083c410eb05e93d0000003b650c7303ff5524e971ffffff8b4c2408f6c101740583c1027105ff5538ebf68b5424048d5412ff89cb89d183c40c5a3b650c7303ff5524e941ffffff83f80174128b0c24d1ead1e88804118d4400018d5412018b4424108b4c240889085983c408894804b801000000c2040000000000c8010000|@8065,2097151,@586|28,0,@8061 43,0,1 91,0,@8063 121,0,32 130,0,I109 141,0,0 193,0,0 198,0,1 203,0,0 208,0,0 271,0,128 324,0,1 329,0,0 445,0,0 8061:O4|4,@4943,0,@8062 8062:O5|@8051,114,0,114,0 8063:O4|4,@4943,0,@8064 8064:O5|@8051,64,0,64,0 8065:S12|746162756c61746527283229 8066:D3,500|3b650c7303ff552489c1bafffffffff6c1017524f6c201740bf6010174063b117d09eb05ff5538ebf58b118b49043b650c7303ff5524ebd789d1f6c101740583c1027105ff5538ebf683f901745af6c101740783f9017d08eb1ff641ff107519535150bb14a57db289c89090ff1568d7520883f8017412eb03535150b828a77db28b5d04909090ff138b442404a801740583c03e7105ff5538ebf6bb41000000ff15e8c75208eb0a89c2b80300000053515289c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f5857a80175718b08f6c101740783f9017d08eb1ff641ff107519f6c101740ff64424040174083b4c24047c15eb05ff5538ebf38b5004b870a97db28b5d0490ff136a016a01ff70048d54240452bb1100000089c8ff1548c752088b4424048b4c240cd1e80fb604018d4400018b4c2408ba03000000eb05e94200000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09010bc28b4c240c8b542404d1ead1e88804118d4400018d5412015883c4083b650c7303ff5524e944ffffffb801000000ff3424689ca97db26a016a0189e0508d5c240c8b442418ba08a57db29090e8e6fbffff8b4424048060ffbf8b4c24188b14248911894104b80100000083c41cc39000000000f0010000|@8071,2097151,@588|11,0,-1 100,0,@8059 110,0,I233 125,0,@8063 156,0,32 162,0,I109 171,0,1 181,0,0 287,0,@8067 310,0,8 318,0,I104 345,0,1 365,0,31 423,0,0 431,0,@8069 451,0,@8058 458,1,@8060 483,0,0 8067:O4|11,@4879,0,@8068 8068:O5|@8051,417,0,417,0 8069:D3,116|3b650c7303ff55246a016a01528d4c240451bb1100000090ff1548c752088b042483c404598b4004d1e90fb60c088d4c090189c859ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f8017407b801000000eb05b80300000083f002c39090900000000070000000|@8070,2097151,@587|19,0,8 26,0,I104 54,0,1 67,0,31 90,0,0 97,0,1 8070:S22|426f6f6c41727261792e766563746f72283129283129 8071:S62|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e65722834296669656c6473546f46696c746572283129 8072:S45|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429 8073:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@7800,1048575,@590| 8074:O1|@5348 8075:O1|@5281 8076:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9816bffff900000000074000000|@7854,63,@592|30,1,@8077 68,0,2 86,0,0 107,1,@7846 8077:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@591|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8078:S36|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283529 8079:S35|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229 8080:O1|@8081 8081:D3,16|b801000000c39090000000000c000000|@7374,1,@595|1,0,0 8082:D3,120|3b650c7303ff552483f8017543833b0575398b73048b43088b5c240490e86a00000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70005000000c2040089d8c2040050ff742408b801000000909090e89effffff89c3585983c40451e9b969ffff900000000074000000|@7854,63,@597|30,1,@8083 68,0,2 86,0,0 107,1,@7846 8083:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@596|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 8084:O2|3,@8085 8085:S20|4f7574707574206f662073696d706c6966696572 8086:O1|@8087 8087:D3,24|b87cae7db28b5d04909090ff139090900000000014000000|@7931,1,@598|1,0,@8088 8088:O4|@4608,@5398,@8090,@8089 8089:O5|@8091,1459,0,1459,0 8090:S30|746f70206c6576656c207265616368656420696e206f7074696d69736572 8091:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4f5054494d495345522e736d6c 8092:O1|@8093 8093:D3,16|b801000000c39090000000000c000000|@7934,1,@599|1,0,0 8094:O1|@8095 8095:D3,16|b801000000c39090000000000c000000|@7931,1,@600|1,0,0 8096:O2|3,@8097 8097:S17|4f7574707574206f6620636c65616e6572 8098:D3,40|8b42048b008b4a048b09f6c101740583c1027105ff5538ebf68b5204890ac3900000000024000000|@8099,7,@601| 8099:S66|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f63657373547265652833296d616b6541646472283129 8100:D3,44|3b650c7303ff5524b9e4837ab28b1c24890c2489d98b5a04ba54b07db251e939000000900000000028000000|@8105,1048575,@727|9,0,@5461 25,0,@8101 31,1,@8103 8101:O3|@8103,@8132,@8102 8102:O2|@8152,@8101 8103:D3,1800|3b650c7303ff55248b08be86b07db28d748efcffe690e97b000000909090e9d6000000909090e963000000909090e926010000909090e953000000909090e94b000000909090e98f040000909090e94e050000909090e933000000909090e92b000000909090e9f5050000909090e91b000000909090e913000000909090e90b000000909090e903000000909090b801000000c204008b4c2404f6c101751d8b31833e05750f8b710489f13b650c7303ff5524ebe5b901000000eb05b90300000083f901742bff7424048b5204909090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c20400b801000000c204008b4c2404f6c101751d8b31833e05750f8b710489f13b650c7303ff5524ebe5b901000000eb05b90300000083f9017428ff7424048b5204ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c20400b801000000c204008b480883390375728b7308c706030000008b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7078cb77db2895704895f088b74240489770c8067ffbf8b75008d76ec3b75087303ff5520897500c746fc04000000538b580c895e0c8b5908895e088b5804895e04c7060700000052ff7104ff700ceb05e9cf000000ff710c5389fb89f090e8be47ffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701f4b77db28b5424108951048b5424148951088b54241c89510c8061ffbf8b5d008d5bec3b5d087303ff5520895d00c743fc040000008b74240889730c8b7424048973085e83c408897304c703070000005089de89cb89f09090e84647ffff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c588941085883c408894104c701030000008b45008d40f83b45087303ff5520894500c740fc010000008908c2040083390f75725352ff700cff71045389d38b480489c890e8fe04000089c389d8909090e8fa0500008b4d008d49e43b4d087303ff5520894d00c741fc030000008941088b442414894104c701010000008d5110c742fc02000000c7420401000000890a6a016a018b4c241053ff74240c6a018d74240ceb05e9e20000005689d38b4424248b5108909090ff128b45008d40ec3b45087303ff5520894500c740fc040000008b4c241089480c8b4c240889480859894804c70007000000833c2401746d508b442404e8b60500008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc02000000c7400401000000890883f80175058b0424eb3089c18b45008d40f03b45087303ff5520894500c740fc030000008b1424895008894804eb05e909000000c7001500000083c40489c18b45008d40f83b45087303ff5520894500c740fc01000000890883c418c204005352ff700c515389d38b4004e89a05000089c389d8909090e8960600008b4d008d49d03b4d087303ff5520894d00c741fc030000008941088b442414894104c701010000008d5110c742fc02000000c7420401000000890a8d4a0cc741fc04000000c70188bb7db28b7424088971048b74240c89710889510c8061ffbf5389cb8b442404e81645ffff8b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240889510c8941085883c410894104c701070000008b45008d40f83b45087303ff5520894500c740fc010000008908c2040083780c0175708b4d008d49f03b4d087303ff5520894d00c741fc030000008b7424048971088b7808897904c701050000008b7d008d7fe03b7d087303ff5520897d00c747fc02000000c7470401000000890f8d4f0cc741fc04000000c701c4bb7db289510489590889790c8061ffbfff700889cbeb05e9440000008b400490e84644ffff8b4d008d49e43b4d087303ff5520894d00c741fc04000000c7410c010000005a895108894104c7010d0000008d4114c740fc010000008908c20400b801000000c204006a016a01ff70046a038d4424085089d88b5c24188b5208ff12833c240175068b442404eb6d8b0424e8c20500008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc02000000c7400401000000890883f80175068b442404eb3189c18b45008d40f03b45087303ff5520894500c740fc030000008b542404895008894804eb05e906000000c7001500000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c408c204005352ff700853ff720889d38b4004909090e8a20500008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7010cc27db28b5424048951048b5424088951088b54241089510c8061ffbf5089cb8b44240490e8ea42ffff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c40c894104c701150000008b45008d40f83b45087303ff5520894500c740fc010000008908c20400900000000004070000|@8131,1048575,@623|11,0,$8103+22 143,0,0 182,0,0 189,0,1 242,0,0 281,0,0 288,0,1 338,0,0 358,0,1 388,0,@8104 454,0,3 482,1,@7801 512,0,@8106 588,0,3 602,1,@7801 646,0,1 702,1,@8107 714,1,@8109 754,0,0 771,0,0 862,0,3 878,1,@8110 911,0,3 928,0,0 988,0,10 1042,1,@8111 1054,1,@8113 1094,0,0 1111,0,0 1129,0,@8114 1162,1,@7801 1209,0,3 1287,0,2 1318,0,0 1336,0,@8115 1370,1,@7801 1401,0,0 1414,0,6 1434,0,0 1482,1,@8116 1515,0,3 1532,0,0 1594,0,10 1650,1,@8117 1680,0,@8130 1718,1,@7801 1758,0,10 8104:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@602| 8105:S35|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283129283129 8106:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@603| 8107:D3,184|3b650c7303ff5524a80175708b088b55008d52f03b55087303ff5520895500c742fc03000000c702fcb87db2895a048b7424048972088062ffbf53ff7004ff710489d38b01e89a41ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204009000000000b4000000|@6329,1048575,@605|40,0,@8108 70,1,@7801 168,0,0 8108:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@604|9,0,@5384 8109:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@606|60,0,0 8110:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c70201000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@607|51,0,0 100,0,0 8111:D3,184|3b650c7303ff5524a80175708b088b55008d52f03b55087303ff5520895500c742fc03000000c702ecba7db2895a048b7424048972088062ffbf53ff7004ff710489d38b01e8aa3fffff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff7424108b5c240c8b442408e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204009000000000b4000000|@6329,1048575,@609|40,0,@8112 70,1,@7801 168,0,0 8112:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@608|9,0,@5384 8113:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@610|60,0,0 8114:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@611| 8115:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@612| 8116:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c70201000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@613|51,0,0 100,0,0 8117:D3,112|3b650c7303ff5524a801755453ff7004ff742410ff7424108b00909090e86200000050ff742414ff7424148b5c24108b44240c9090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c20800000000006c000000|@6329,1048575,@621|30,1,@8118 97,0,0 8118:D3,464|3b650c7303ff552483380175728b4d008d49f03b4d087303ff5520894d00c741fc03000000c701f0be7db28959048b5424088951088061ffbfff700cff7008ff700489cb8b40109090e8ba3cffff89c18b45008d40e83b45087303ff5520894500c740fc050000008948108b4c240889480c8b4c24048948085983c408eb05e90c000000894804c70001000000c20800833805755f8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7012cbf7db28959048b5424088951088061ffbf89cb8b4004909090e83a3cffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c2080083380775568b4004b901000000a8017522ff7004ff742408ff74241089cb8b0090e84201000089c1583b650c7303ff5524ebda89c889c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c208008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70198c17db28959048b5424088951088b580489590c8061ffbfff70085389cb8b400c909090e8763bffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24048948085983c404894804c70003000000c20800909000000000cc010000|@8129,1048575,@620|39,0,@8119 74,1,@7801 137,0,0 175,0,@8120 202,1,@7801 237,0,2 253,0,0 278,1,@8121 328,0,3 361,0,@8128 398,1,@7801 447,0,1 8119:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@614|9,0,@5384 8120:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@615|9,0,@5384 8121:D3,176|3b650c7303ff55246a016a0153ff30ff7004ff70086a058d442414508b5c24108b4424248b542428ff128b44241083380f740ab82cc07db28b5d04ff138b4d008d49f03b4d087303ff5520894d00c741fc030000008b4004894108588941048b042489015189c38b44240c9090e89e000000837c24080174098b5c2408e81201000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c2080000000000ac000000|@8127,1048575,@618|52,0,@8122 110,1,@8125 126,1,@8126 8122:O4|@4608,@5398,@8124,@8123 8123:O5|@8091,945,0,945,0 8124:S22|6d617062696e64696e673a206e6f74206c616d626461 8125:D3,112|3b650c7303ff5524a80175538b088b55008d52f03b55087303ff5520895500c742fc030000008b71048972088b39897a04891a52ff70045890e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000006c000000|@6329,63,@616|96,0,0 8126:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@617| 8127:S57|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e672831296d6170526563446563283229 8128:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@619| 8129:S45|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e67283129 8130:D3,40|3b650c7303ff55248b4a0c8b1c24890c2489de8b5a088b4a0489ca56ff2290900000000024000000|@8105,1048575,@622| 8131:S32|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283329 8132:O2|@8133,@8101 8133:D3,1408|3b650c7303ff55248b4c2404be01000000f6c10175338b39833f05751df7c601000000740df647040174073b77047d0aeb05ff5538ebf48b77048b790489f93b650c7303ff5524ebc889f189cef7c601000000740583c6027105ff5538ebf683fe017468f7c601000000740783fe017d08eb26f646ff10752053525051ff33ff730856bb14a57db289f09090ff1568d7520883f8017416eb0a53525051ff33ff730856b828a77db28b5d04ff138b0424a801740583c03e7105ff5538ebf6bb4100000090ff15e8c75208eb1189c7b80300000053525751ff33ff73085689c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b44242057a801756e8b08833905756c8b5104f6c201740783fa017d08eb1ff642ff107519f6c201740ff64424040174083b5424047c17eb05ff5538ebf38b5804b870a97db28b5d04909090ff136a016a01ff70048d5c240453bb1100000089d0ff1548c752088b4424048b4c240cd1e80fb60401eb0ae95d000000e9400000008d4400018b4c2408ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09010bc28b4c240c8b542404d1ead1e88804118d4400018d541201eb076a016a01ff70045883c4083b650c7303ff5524e92cffffffb801000000b8010000008b4c240483f901746889ca83ea0289cb83eb0283e9026a016a015052538d74240c56bb1100000089c890ff1548c752088b44240c8b4c2414d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae94b000000b80300000083f00283f80375268b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908eb048b44240883c4045983c40c3b650c7303ff5524e943ffffff83c40859c70103000000a801756c83780401756bff306810c87db2ff308d5c24048b44241490e8560300008b4c24188b55008d52f03b55087303ff5520895500c742fc03000000c702a4ca7db28b4904894a048b4c241c894a088062ffbf89d39090e87a34ffffff34245068e0ca7db28b44240ca8017411eb0ae948000000e94300000083c0027105ff5538ebf689e39090e83e72fdff89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d00000083c42cc2040050b8010000008b542404ff12b9010000008b1424f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b55008d52e83b55087303ff5520895500c742fc02000000894204c702050000008d5a0cc743fc02000000895304c70309000000ff342453684ccb7db25150538d5c240c8b4424249090e8360200008b4c24288b55008d52f03b55087303ff5520895500c742fc03000000c702b4ce7db28b4904894a048b4c242c894a088062ffbf89d39090e85a33ffff8b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44240889410c8b542404895108c7410401000000c701010000008b5c2420f6c301740583c3027105ff5538ebf6a8017508f6c3017503ff55383bc3753d5268f0ce7db2518d5c2404909090e8e270fdff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000eb466a016a0151ff742424ff742410bb01000000b8010000009090e84e0800008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d0000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000005a83c424891083f801750889c883c414c2040089c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7001500000083c414c20400000000007c050000|@8151,2097151,@634|13,0,0 132,0,@8059 142,0,I233 164,0,@8063 191,0,32 198,0,I109 207,0,1 224,0,0 341,0,@8067 366,0,8 374,0,I104 413,0,1 426,0,31 493,0,0 498,0,0 537,0,8 546,0,I104 573,0,1 586,0,31 609,0,0 621,0,1 701,0,1 718,0,@8134 734,1,@8136 768,0,@8138 794,1,@7801 803,0,@8139 842,1,@6547 875,0,0 884,0,14 896,0,0 907,0,0 976,0,2 995,0,4 1004,0,@8141 1022,1,@8136 1056,0,@8146 1082,1,@7801 1130,0,0 1136,0,0 1177,0,@8147 1190,1,@6547 1221,0,0 1230,0,14 1250,0,0 1255,0,0 1262,1,@8149 1293,0,0 1302,0,14 1333,0,0 1390,0,10 8134:D3,92|3b650c7303ff55248338057516b9010000008b1c24890c2489d98b5a0451e9cd22feff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b5204895008894804c7000d000000c30000000058000000|@8135,1048575,@624|14,0,0 31,1,@6843 64,0,0 79,0,6 8135:S42|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296669656c642d283129 8136:D3,416|3b650c7303ff55248b08bacac87db28d548afcffe290e977000000909090e9a3000000909090e963000000909090e95b000000909090e953000000909090e9d5000000909090e943000000909090e93b000000909090e933000000909090e9fe000000909090e9f7000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909089daff22ff70088b400490e862ffffff89c18b45008d40f03b45087303ff5520894500c740fc030000005a895008894804c70001000000c353ff7004ff700c8b400890e82affffff508b5c240c8b4424049090e81affffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c5983c4048948085983c404894804c70003000000c353ff70088b40049090e8dafeffff508b5c24088b4424049090e8cafeffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c7000b000000c3c3ff70048b400890e892feffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70015000000c39090000000009c010000|@8137,1048575,@625|11,0,$8136+22 193,0,0 275,0,1 348,0,5 401,0,10 8137:S49|434f4445545245455f4f5054494d4953455228292e6f70744669656c647328332970757368436f6e7461696e6572283229 8138:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@626|9,0,@5384 8139:D3,36|a8017509f64208017503ff55383b42087406b8c4757ab2c38b4204c30000000020000000|@8140,5,@627|19,0,@5348 8140:S44|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296d6b4669656c6473283129 8141:D3,80|3b650c7303ff552452508b4208e8520000008b4c240489c28b45008d40ec3b45087303ff5520894500c740fc040000008b490489480c8950085983c404894804c70019000000c390000000004c000000|@8145,2097151,@630|14,1,@8142 66,0,12 8142:D3,512|3b650c7303ff552489c1bafffffffff6c1017524f6c201740bf6010174063b117d09eb05ff5538ebf58b118b49043b650c7303ff5524ebd789d1f6c101740583c1027105ff5538ebf683f9017456f6c101740783f9017d08eb1ff641ff1075195150bb14a57db289c8909090ff1568d7520883f801740eeb025150b828a77db28b5d04ff138b442404a801740583c03e7105ff5538ebf6bb41000000ff15e8c75208eb0989c2b803000000515289c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f5857a80175728b08f6c101740783f9017d08eb1ff641ff107519f6c101740ff64424040174083b4c24047c16eb05ff5538ebf38b5004b870a97db28b5d049090ff136a016a01ff70048d54240452bb1100000089c8ff1548c752088b4424048b4c240cd1e80fb604018d4400018b4c2408ba03000000eb05e94200000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09010bc28b4c240c8b542404d1ead1e88804118d4400018d5412015883c4083b650c7303ff5524e943ffffffb801000000ff342468c4cd7db26a016a0189e0508d5c240c8b442418ba08a57db29090e8a2d7ffff8b4424048060ffbf8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4148908c300000000fc010000|@8144,2097151,@629|11,0,-1 99,0,@8059 110,0,I233 124,0,@8063 152,0,32 158,0,I109 167,0,1 176,0,0 282,0,@8067 306,0,8 314,0,I104 341,0,1 361,0,31 419,0,0 427,0,@8143 447,0,@8058 454,1,@8060 8143:D3,116|3b650c7303ff55246a016a01528d4c240451bb1100000090ff1548c752088b042483c404598b4004d1e90fb60c088d4c090189c859ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f8017407b801000000eb05b80300000083f002c39090900000000070000000|@8070,2097151,@628|19,0,8 26,0,I104 54,0,1 67,0,31 90,0,0 97,0,1 8144:S38|434f4445545245455f4f5054494d4953455228292e6669656c6473546f46696c746572283129 8145:S48|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329736574436f6e7461696e6572283129 8146:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@631|9,0,@5384 8147:D3,128|8b4a04f6c101740783f9017c08eb12f641ff10740c89c3b8a4727db28b5d04ff138b5d008d5bd43b5d087303ff5520895d00c743fc02000000894b04c703050000008d730cc746fc02000000895e04c7060900000089c38d460cc740fc04000000c7400c01000000895808897004c7000d000000c3909090000000007c000000|@8148,31,@632|24,0,@7993 62,0,2 81,0,4 100,0,0 112,0,6 8148:S47|434f4445545245455f46554e4354494f4e5328292e6d6b5475706c6546726f6d436f6e7461696e6572283229283129 8149:D3,288|3b650c7303ff5524f644240801756d8b4c2408a8017508f601017503ff55383b01755e8b55008d52ec3b55087303ff5520895500c742fc04000000c7420c01000000895a088b742404897204c7020d000000a801740583c0027105ff5538ebf6f6c301740583c3027105ff5538ebf652ff71045690e886ffffffeb0ae98d000000e92300000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20800a801740583c0027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc020000008b71048972048b39893a52ff742408909090e81affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948049090c700c4757ab2c20800b801000000c208009090000000001c010000|@8150,63,@633|62,0,0 78,0,6 263,0,@5348 271,0,0 8150:S53|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329636f6e7461696e65722d6d6b4669656c64283329 8151:S33|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329 8152:D3,3264|8d7c248c3b7d0c7303ff55288b4c240c83790801742e8b711c8b7914ff7110ff710cff7108ff7104ff3152ff7008ff7004ff7118ff3089d88b5c241c90e8920c0000eb248b70088b7804ff7110ff710cff7108ff7104ff31525657ff7118ff3089d88b711c8b7914837c2430057407b901000000eb05b9030000008b542414833a07755283f90175528b4a04bb01000000565783f9017507b903000000eb5a8b318b3e833f0975568b7704833e01754e8b318b3e8b7704f6c3017509f64604017503ff55383b5e047528f6c301740583c3027111eb0ae978010000e973010000ff5538ebea8b49043b650c7303ff5524eba1b901000000eb0ae905000000b90100000083f90174658b4a048b5c242c5083f901751383fb017407b801000000eb37b803000000eb30f6c30175268b018b338b78043b3e75148b730489f38b710489f13b650c7303ff5524ebc4b801000000eb05b80100000083f801741c8b420c3b442408740cb901000000eb19e90e000000b903000000eb0db901000000eb06b9010000005083f9017507b801000000eb698b420883380975668b480483390375638b5c242c8b7104f6c301740bb8bc7e7ab28b5d0490ff1383fe0175048b1beb1ff7c601000000740583ee027105ff5538ebf68b5b043b650c7303ff5524ebc88b75008d76ec3b75087303ff5520897500c746fc02000000eb0fe95d000000e923000000e917000000895e04c706090000008d460cc740fc010000008930eb3cb801000000eb35833805751f8b45008d40f83b45087303ff5520894500c740fc010000008b52088910eb11b801000000eb0a89c1b80100000056575183f8017566837c24040175648b0424a801751d8b088339037507ba03000000eb148b480489c83b650c7303ff5524ebdfba0100000083fa0174708b45008d40f83b45087303ff5520894500c740fc010000408b4c241089088b4d008d49f43b4d087303ff5520894d00eb0ae9cf090000e9f1000000c741fc02000000c70188de7db28941048061ffbf8b55008d52f03b55087303ff5520895500c742fc030000008b5c2418895a08eb05e9b70000008b5c2414895a04890a8b4c241c8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703fcde7db28b4904894b048953088063ffbf508b442424e86a25ffff598b098b55008d52d03b55087303ff5520895500c742fc080000008b5c2408895a1c894a188b4c2404894a148b4c2430894a108b4c242c894a0c8b4c2428894a088b4c2424894a0489028d4224c740fc02000000895004c7000f0000008b4c2438c70101000000894104b80100000083c434c20c008b45008d40f83b45087303ff5520894500c740fc010000408b4c241089088b4d008d49f43b4d087303ff5520894d00c741fc02000000c70138df7db28941048061ffbf8b55008d52e03b55087303ff5520895500c742fc030000008b5c2418895a088b742414897204890a8b4c241c8d7a10c747fc03000000c70774df7db28b4904894f048957088067ffbf5089fb8b442424909090e85a24ffff8b4c2418f6c10175358b11813a9ce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01756db97c787cb2f6c10175358b11813a9ce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750e89c1b8287c7cb28b5d049090ff138b0b81399ce539b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0b81399ce539b2740d89c2b854eb7ab28b5d0490ff138b5108be010000008b7c2434f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd983fa01740c837c2440017505bad1070000505289f3e8ce0800006a016a016a01833807751e8b4424108b0089e1c7010300000089e18b54240c89510489e1894108eb6683380375668b5004b9ffffff00234afc8d4c0901bb010000003bd97207bb01000000eb328b745afe83fe01741c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008933eb0d83c3023b650c7303ff5524ebc383fb01746cb9010000008b5c2440eb0ae9d1000000e975000000f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdf8b5c24108b1b5251ff742440ff742428538b5c24588b442420e83614000089e1c7010100000089e189410489e0c7400801000000eb688b4c24108b0989e3c7030300000089e38b74240c89730489e3894b08eb57833805752fff7004ff7424148b5c244c8b44241490e8ce2200008b4c24108b0989e2c7020100000089e289420489e0894808eb238b4424108b0089e1c7010100000089e18b54240ceb05e90800000089510489e18941088b45008d40dc3b45087303ff5520894500c740fc080000008b4c241c89481c8b4c2408894818598948148b4c24408948108b54243c89500c8b5424388950088b5424348950048b142489106a016a01837c241c03756050bb030000008b44241c9090e8e6260000833801755ef6400401755d8b4804f641040175598b51048b5c240c833b0f75598b75008d76e83b75087303ff5520897500c746fc02000000c74604010000008b3a893e8d5e0cc743fc02000000eb05e9720400008973048b318933f6420401751deb0fe98f000000e98a000000e985000000b8ec7d7ab2eb09e92a000000ff7008588b75008d76f03b75087303ff5520897500c746fc03000000894608895e04c70601000000eb518b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b39893e568b75008d76f03b75087303ff5520897500c746fc03000000c74608ec7d7ab25b895e04c70601000000eb0289c6568b44245090e8ce3300006a016a018b4c24088339017562f641040175618b51048b5c2428be01000000ff7108ff720450f6c30175538b03833801752eff7304568b480889c8e8fe3300008b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901eb0589f1ff730489ce5b3b650c730feb0ae93a010000e935010000ff5524eba889f0a801740f89c1b8240f7eb28b5d04909090ff13f6400401753c8b48048b71048b198b1089d09090e8f234000089c18b45008d40f43b45087303ff5520894500c740fc0200000089700489083b650c7303ff5524ebab8b005b909090e84a3500008b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901518b442420e8c235000083380575568b4c2404833903755e8b4c243083f9017507b901000000eb678b11833a0175518b5a04f6c301751d8b33833e057507bf03000000eb148b730489f33b650c7303ff5524ebdebf0100000083ff01740cb903000000eb2ae9310000008b510489d13b650c730aeb05e920000000ff5524eb9c8b510489d13b650c7303ff5524eb8d83f901750bb8ec7d7ab2eb048b4424048d4c24085a83c404891189e1894104eb6c8b4c2428f6c101751d8b11833a037507bb03000000eb148b510489d13b650c7303ff5524ebdebb0100000083fb0174418b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008901518b44241c909090e8be3400008d4c24045a891189e1894104eb16e91100000089e0c7000100000089e0c74004ec7d7ab2f604240175628b0424f6400401751f8b442440c700030000008d4c2410518b5c24388b44241090e80e360000eb588b4c240483390575238b442440c70003000000ff7424348d542414528b59048b4424149090e8be400000eb528b08f6c10175508b11833a01eb05e9dc000000755af642040175598b5a04837b040175158b7208833e05eb05e91c0100007506837e0801745c8b33f7c601000000753b8b3e833f057519837f08017513eb0ae9f6000000e950000000ba03000000eb208b7e0489fe3b650c730feb0ae916000000e923000000ff5524ebbdba0100000083fa01750deb12833a05750d837a08017507b903000000eb158b49043b650c7303ff5524e956ffffffb90100000083f90174228b4c2440c70103000000ff7424348d542414528b188b4424149090e82e4c0000eb5b8d4424108b4c240c89088d442410c7400401000000eb5e8b44240483380575248b4c2440c70103000000ff7424348d542414528b58048b442414909090e8a23f0000eb318d4424108b4c240c89088d442410c7400401000000eb1ae91500000089e1890189e0c74004010000006a016a016a016a018b442410837814017529837c242c037522f64424280175118b4c24288b11833a03750683790401740a8b4c2440c701030000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010f0000008b44246083c4145a83c4108910894804b80100000083c434c20c008b4c2438c701010000008b00894104b80100000083c434c20c00909000000000bc0c0000|@8325,2097151,@726|62,1,@8153 112,0,0 119,0,1 141,0,0 153,0,1 243,0,0 255,0,0 283,0,0 290,0,1 333,0,0 340,0,0 359,0,0 371,0,1 378,0,0 385,0,0 396,0,0 431,0,@5417 527,0,4 546,0,0 589,0,0 598,0,0 632,0,1 654,0,0 731,0,@8154 819,0,@8156 842,1,@7801 935,0,7 945,0,0 953,0,0 1019,0,@8157 1086,0,@8158 1114,1,@7801 1131,0,@4664 1181,0,0 1191,0,@7313 1204,0,@4664 1254,0,0 1266,0,@7368 1281,0,@4664 1290,0,@6377 1318,0,@4664 1327,0,@6377 1341,0,0 1401,0,1000 1410,1,@8159 1435,0,1 1464,0,8388607 1476,0,0 1485,0,0 1547,0,0 1626,1,@8163 1634,0,0 1648,0,0 1664,0,1 1706,1,@8190 1720,0,0 1746,0,0 1859,0,1 1870,1,@8196 1933,0,0 1989,0,@5413 2036,0,0 2069,0,0 2105,0,@5413 2115,0,0 2130,1,@8216 2161,0,0 2194,1,@8217 2269,0,@8220 2302,1,@8222 2354,1,@8223 2394,1,@8224 2422,0,0 2451,0,1 2473,0,0 2483,0,1 2537,0,@5413 2581,0,1 2603,0,0 2639,0,0 2654,1,@8224 2681,0,0 2690,0,@5413 2715,0,1 2734,1,@8229 2755,0,1 2778,1,@8248 2877,0,1 2911,0,0 2934,0,1 2957,0,0 2972,0,1 2994,1,@8268 3017,0,0 3038,0,1 3062,1,@8248 3085,0,0 3105,0,0 3164,0,1 3197,0,7 3218,0,0 3234,0,0 3244,0,0 8153:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@635| 8154:D3,40|8b42048b008b4a048b09f6c101740583c1027105ff5538ebf68b5204890ac3900000000024000000|@8155,7,@636| 8155:S47|434f4445545245455f4f5054494d4953455228292e6f70744c616d6264612834296f7074436f6e746578742d283129 8156:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@637|9,0,@5384 8157:D3,40|8b42048b008b4a048b09f6c101740583c1027105ff5538ebf68b5204890ac3900000000024000000|@8155,7,@638| 8158:D3,40|3b650c7303ff5524b9cc777ab28b1c24890c2489d98b5a088b720489f251ff220000000024000000|@8105,1048575,@639|9,0,@5384 8159:D3,544|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c70203000000f6c301740783fb017d08eb1bf643ff107515f6c301740a81fbfdffff017c14eb06f643ff10750c89c6b834f67ab28b5d04ff1389def7c601000000740583c6027105ff5538ebf689cf89f189c6b803000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891f57526a036a0357ff742414528b5c242489f09090e86a01000083f801750bb8c4777ab283c40cc204008b4424088b0083f801750bb8e4107bb283c40cc204008b04248b0083f80174718b4424048b0083f8017507b868c05208eb5089c189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74240489f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c18b45008d40f43b4508730aeb05e91c000000ff5520894500c740fc02000000894804c7000500000083c40cc204008b4424048b0083f8017507b868c05208eb5089c189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74240489f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000300000083c40cc2040090000000001c020000|@8162,63,@641|34,0,0 50,0,1 79,0,16777214 96,0,@6401 132,0,1 198,1,@8160 208,0,@5383 230,0,@6455 262,0,I49 273,0,0 386,0,2 408,0,I49 419,0,0 525,0,1 8160:D3,2444|3b650c7303ff552483fb017508b801000000c214008b08ba06e27db28d548afcffe2e9dd010000909090e943020000909090e9d7020000909090e908030000909090e9f7040000909090e934050000909090e97c050000909090e9cd050000909090e9d6060000909090e9fc060000909090e923000000909090e925070000909090e976070000909090e964080000909090e9b50800009090908b4804ff7008f6c10175678b018338017548f6c301740783fb037c17eb06f643ff10750ff6c301740583eb02710aff5538ebf6bb01000000ff71046a01ff74241cff74241cff74241cff74241c8b481089c890e80effffffeb62833805752bff71046a01ff74241cff74241cff74241ceb05e9c1000000ff74241c8b480489c8909090e8defeffffeb6483380775648b5004ff7104f6c201755e8b028b4d008d49f43b4d087303ff5520894d00c741fc020000008b7008897104eb05e967000000c7010f000000ff72046a01ff742420ff742420ff742420ff74242089c890e882feffff89c35a3b650c7314eb0fe935000000e90e000000e905000000ff5524eb9389d8eb22ff71046a01ff74241cff74241cff74241cff74241c8b480c89c8909090e83efeffff89c3593b650c7303ff5524e9cefeffff89d88b4c24188b5424148b5c24108b74240c8b7c2408894c241889542414895c24108974240c897c240889c358e9fcfdffff8b4808ff7004f6c10175308b018b10ff71046a01ff74241cff74241cff74241cff74241c8b42089090e8cefdffff89c3593b650c7303ff5524ebcb89d88b4c24148b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e98efdfffff6c301740783fb057c17eb06f643ff10750ff6c301740583eb04710aff5538ebf6bb01000000ff7004ff7008ff74241cff74241cff74241cff74241cff74241c8b400ce846fdffffff74241cff74241cff74241cff74241cff74241c89c38b44241490e826fdffff8b4c241883c4048b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e9f2fcfffff6400401752ef6c301740783fb037c1ceb06f643ff107514f6c301740583eb027105ff5538ebf689d8c21400b801000000c2140089d8c214008b480883390975568b5104833a077553837c24100375518b7004bf0100000053f7c601000000755e8b0e8b11833a09751e8b5a04833b017516f7c7010000007509f64304017503ff55383b7b047474f7c701000000741683ff017d17eb3ae902010000e9fd000000e9f8000000f647ff1075258b5c24108b1bf7c7010000007410f6c301eb05e95a00000074043bfbeb05ff5538ebf77c0e8b5804b8b0f57ab28b5d0490ff1389fbf6c301740583c3027105ff5538ebf68b4c2410c74459fe01000000f7c701000000740583c7027105ff5538ebf68b76043b650c7303ff5524e93bffffff8b4c240cc70103000000837c241801750a8b542408c702010000008b1424f6c201740783fa077c17eb06f642ff10750ff6c201740583ea06710aff5538ebf6ba010000008b400483c404a801752d8b08ff70046a016a03ff742418ff742418ff74241889d38b019090e866fbffff89c2583b650c7303ff5524ebcf89d0c21400f6c301740783fb057c17eb06f643ff10750ff6c301740583eb04710aff5538ebf6bb010000008b5004ff7008f6c201752e8b02ff72046a01ff74241cff74241cff74241cff74241c8b0889c890e802fbffff89c35a3b650c7303ff5524ebcd89d88b4c24148b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e9c2faffff8b4004833807750f837c2410037508b801000000c21400f6c301740783fb037c1ceb06f643ff107514f6c301740583eb027105ff5538ebf689d8c21400b801000000c21400ff7004ff742418ff742418ff742418ff742418ff7424188b4008e85efaffff8b4c24148b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e92dfafffff6c301740783fb037c17eb06f643ff10750ff6c301740583eb02710aff5538ebf6bb010000008b4c24108b54240c8b7424088b7c240453bb01000000895c2418894c2414895424108974240c897c24085b8b4004e9d4f9ffff8b48048b510cf6c201751d8b32833e077507bf03000000eb148b720489f23b650c7303ff5524ebdebf0100000083ff017408b801000000c21400ba010000008b7110f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdcbe010000008b790cf7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd9f6c201740ff7c60100000074078d52ff03d67105ff5538ebf4f6c3017409f6c20174043bdaeb05ff5538ebf77c18f6c3017409f6c20174042bda7105ff5538ebf783c301eb05bb010000008b54240c8b7424088b7c2404b80100000089442414b801000000894424108954240c89742408897c24048b01e9c3f8fffff6c301740783fb037c1ceb06f643ff107514f6c301740583eb027105ff5538ebf689d8c21400b801000000c214008b4004a801752d8b08ff70046a01ff742418ff742418ff742418ff7424188b019090e86ef8ffff89c3583b650c7303ff5524ebcf89d8c21400f6c301740783fb037c17eb06f643ff10750ff6c301740583eb02710aff5538ebf6bb010000008b4c24108b54240c8b7424088b7c240453bb01000000895c2418894c2414895424108974240c897c24085b8b4004e903f8ffff8b480483391d75698b5104ff700cf6c201752bff72046a01ff74241cff74241cff74241cff74241c8b029090e8d2f7ffff89c35a3b650c7303ff5524ebd089d88b4c24148b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e992f7ffff8b5008f6c301740bf6020174063b1a7c1feb05ff5538ebf5f6c3017409f6020174042b1a7105ff5538ebf783c301eb05bb01000000ff700c6a01ff742418ff742418ff742418ff74241889c8909090e83ef7ffff8b4c24148b5424108b5c240c8b742408bf01000000897c2418894c241489542410895c240c8974240889c358e90df7fffff6c301740783fb037c17eb06f643ff10750ff6c301740583eb02710aff5538ebf6bb010000008b4c24108b54240c8b7424088b7c240453bb01000000895c2418894c2414895424108974240c897c24085b8b4008e9b4f6ffff8b4004a801752cff70046a01ff742418ff742418ff742418ff7424188b00909090e88ef6ffff89c3583b650c7303ff5524ebd089d8c214000000000088090000|@8161,63,@640|14,0,0 24,0,$8160+34 206,0,0 349,0,7 594,0,0 660,0,0 750,0,0 827,0,0 866,0,0 995,0,@6397 1030,0,0 1074,0,1 1091,0,0 1132,0,0 1230,0,0 1310,0,0 1358,0,0 1404,0,0 1459,0,0 1525,0,0 1547,0,0 1599,0,1 1621,0,0 1631,0,0 1639,0,0 1683,0,0 1800,0,0 1817,0,0 1826,0,0 1892,0,0 1990,0,0 2012,0,0 2126,0,0 2207,0,0 2259,0,0 2325,0,0 2347,0,0 8161:S51|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329636865636b557365283429 8162:S40|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329 8163:D3,500|3b650c7303ff55246a016a016a0150ff7424206a016a016a016a018d4c241851ff74243c89d9bb0100000089c8e8d6010000837c240c017507b868c05208eb70b8010000008b4c240cf6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb12f640ff10750c89c1b850337db28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c240c83f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f8ff7424246838f17db289c38b4424089090e8de04000050bbe4687cb28b44242090e88a1efcff50bbb4f87db28b44242890e8ee4afdff837c240c0174098b5c240ce8160c0000508b4424149090e8620c00008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54242489511c8b5c2420895918c74114030000008941105889410cc74108cc777ab2588941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000508b442404e8760c000089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54241489500c5b83c408895808894804c70007000000c21400909000000000f0010000|@8189,1048575,@655|39,0,0 46,1,@8164 58,0,I49 65,0,0 111,0,16777215 128,0,@7886 140,0,0 190,0,0 249,0,@8166 262,1,@8170 268,0,@7276 278,1,@4940 284,0,@8183 294,1,@6547 310,1,@8186 322,1,@8187 367,0,1 381,0,@5384 424,0,7 434,1,@8188 483,0,3 8164:D3,748|3b650c7303ff552483f801756c8b442414b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4c2410ba01000000f6c10175358b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b118913eb05e96300000089da8b49043b650c7303ff5524ebc689d18b54240cbb01000000f6c201752e8b75008d76f43b75087303ff5520897500c746fc02000000895e048b1a891e89f38b52043b650c7303ff5524ebcd89da8b5c24088903894b04895308b801000000c21c008b088b55008d52f43b55087303ff5520895500c742fc02000000895a04c70201000000f6c30174148b7c2404beffffff002377fc8d7436013bde72108b7004b8cc7b7ab28b5d04909090ff138b7c5ffe83ff017470f6c301740583c3027105ff5538ebf68b74241cf7c601000000740583c6027105ff5538ebf68b7d008d7fe83b7d087303ff5520897d00c747fc020000008b4c2414894f0489178d570cc742fc020000008b4c241c894a04c702030000008b4d008d49f43b4d087303ff5520894d00eb05e958000000c741fc02000000578b7c241089790489118b54241c8b7c2414518b4c2410568b742410538b5c2404895c242c895424288b54240c89542424897c24208b5424088954241c894c2418897424145b83c40c8b4004e9fdfdfffff6c301740583c3027105ff5538ebf68b742418f7c601000000740583c6027105ff5538ebf68b7d008d7fe43b7d087303ff5520897d00c747fc02000000895704c707090000008d570cc742fc03000000ff70048b41048942088b01894204893a8b7d008d7fdc3b7d087303ff5520897d00c747fc020000008b44241489470489178d4f0cc741fc020000008b54241c895104c701010000008d410cc740fc020000008b54241089500489088b4c24208b542418508b442410578b7c2410894c2428897424248954242059894c241859894c24108944240c897c240858e91cfdffff00000000e8020000|@8165,63,@642|18,0,0 79,0,0 148,0,0 218,0,0 256,0,0 270,0,8388607 289,0,@5401 399,0,1 581,0,4 663,0,0 8165:S55|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372967657441726773283729 8166:O1|@8167 8167:D3,56|89c18b45008d40ec3b45087303ff5520894500c740fc0400000089580cc740088cf17db2894804c70007000000c390900000000034000000|@8169,11,@643|32,0,@8168 41,0,3 8168:O2|4,@5383 8169:S53|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e672834292d45 8170:D3,116|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70160f27db28959048b5424048951088b5c240889590c8061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706f4f67db2894e048066ffbf89f35983c40851e9d007ffff0000000070000000|@8182,1048575,@650|34,0,@8171 85,0,@8180 104,1,@7801 8171:D3,216|3b650c7303ff552483380975618b48048339017559f641040174148b7204bbffffff00235efc8d5c1b013b5904770ab8cc7b7ab28b5d04ff138b59048b5c5efe8b7d008d7fec3b7d087303ff5520897d00c747fc02000000895f04c707090000008d470cc740fc010000008938c383380775548b4808833909754c8b5904833b07754452ff700cff720c52bb010000008b480489c8e8520000008b4c24045b83c4048b5108909090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390909000000000d4000000|@8179,1048575,@647|31,0,8388607 48,0,@5401 93,0,4 140,0,0 150,1,@8172 200,0,0 8172:D3,284|3b650c7303ff552483f8017508b801000000c208008b08f6c30174148b742408baffffff002356fc8d5412013bda720d8b5004b8cc7b7ab28b5d04ff138b745efe83fe017429f6c301740583c3027105ff5538ebf68b5424088b74240489542408897424048b480489c8e991ffffff8b55008d52f43b55087303ff5520895500c742fc02000000c7027cf47db28b7424048972048062ffbfff700453ff710489d38b019090e81e06ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890158a801740583c0027105ff5538ebf651ff742410ff74241089c38b44240c909090e812ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c208000000000018010000|@8178,1048575,@646|14,0,0 33,0,8388607 52,0,@5401 137,0,@8173 166,1,@7801 8173:D3,196|3b650c7303ff552483380f75708b4804ff711cff7118ff7114ff7110ff7108ff7104ff318b5a048b410c909090e8a60000008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c89511089410c8b4424088941088b4424048941045883c418eb05e93200000089018b45008d40ec3b45087303ff5520894500c740fc02000000894804c7000f00000089c18d400cc740fc010000008908c38b5204ff2290909000000000c0000000|@8177,1048575,@645|46,1,@8174 161,0,7 8174:D3,152|3b650c7303ff5524a80175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff700489c8e88604ffff833809740e89c1b800f67db28b5d049090ff13ff70048b5c24088b44240490e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e9070000005983c4088908c3b801000000c3900000000094000000|@6329,1048575,@644|43,0,4 54,1,@7801 66,0,@8175 138,0,0 8175:O4|@4608,@5398,@6887,@8176 8176:O5|@8091,230,0,230,0 8177:S39|434f4445545245455f4f5054494d4953455228292e6f6e6c7946756e6374696f6e283129283129 8178:S71|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e7472792831296d6170417267283229 8179:S62|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e747279283129 8180:D3,196|3b650c7303ff552483380f75708b4804ff711cff7118ff7114ff7110ff7108ff7104ff318b5a048b410c909090e8a60000008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c89511089410c8b4424088941088b4424048941045883c418eb05e93200000089018b45008d40ec3b45087303ff5520894500c740fc02000000894804c7000f00000089c18d400cc740fc010000008908c38b5204ff2290909000000000c0000000|@8177,1048575,@649|46,1,@8181 161,0,7 8181:D3,152|3b650c7303ff5524a80175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff700489c8e80e02ffff833809740e89c1b800f67db28b5d049090ff13ff70048b5c24088b44240490e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e9070000005983c4088908c3b801000000c3900000000094000000|@6329,1048575,@648|43,0,4 54,1,@7801 66,0,@8175 138,0,0 8182:S51|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429 8183:O1|@8184 8184:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c30000000028000000|@8185,3,@651|31,0,1 8185:S60|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372973756246756e6374696f6e2d283129 8186:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@652| 8187:D3,112|3b650c7303ff5524a80175538b088b55008d52f43b55087303ff5520895500c742fc020000008b5908895a048b71048932528b780489f89090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000006c000000|@6329,63,@653|96,0,0 8188:D3,112|3b650c7303ff5524a80175538b088b55008d52f43b55087303ff5520895500c742fc020000008b5904895a048b318932528b780489f8909090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000006c000000|@6329,63,@654|96,0,0 8189:S45|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e283729 8190:D3,320|3b650c7303ff55246a016a01506a016a018d4c240c51ff742420ff74242089d9bb0100000089c89090e826010000837c2408017507b868c05208eb70b8010000008b4c2408f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb12f640ff10750c89c1b850337db28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c240883f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f8ff7424146810ff7db289c38b4424089090e8faf5ffff89c18b45008d40f03b45087303ff5520894500c740fc0300000083c4045a83c404895008894804c70001000000c208009090000000003c010000|@8195,1048575,@658|33,0,0 42,1,@8191 54,0,I49 61,0,0 107,0,16777215 124,0,@7886 136,0,0 186,0,0 245,0,@8193 258,1,@8170 303,0,0 8191:D3,648|3b650c7303ff552483f801756c8b442414b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4c2410ba01000000f6c10175358b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b118913eb05e92200000089da8b49043b650c7303ff5524ebc689d18b54240c8902894a04b801000000c214008b08f6c30174148b742408baffffff002356fc8d5412013bda720e8b5004b8cc7b7ab28b5d0490ff138b745efe83fe01747289daf6c201740583c2027105ff5538ebf68b75008d76e83b75087303ff5520897500c746fc02000000895e04c706010000008d5e0cc743fc020000008b7c2410897b0489338b7424148b4c240c8b7c2408538b5c2408897424185e89742410894c240c897c2408895c240489d38b4004eb05e905000000e9b2feffff8b5424048b128b7424048b36f7c601000000740583c6027105ff5538ebf68b7c2404893789def7c601000000740583c6027105ff5538ebf6f6c301740783fb017c08eb13f643ff10740dff7004b8a4727db28b5d04ff138b7d008d7fd83b7d087303ff5520897d00c747fc02000000895f04c707010000008d5f0cc743fc02000000897b04c703090000008d7b0cc747fc03000000895f088957048b5904891f8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b09894b04893b8b4d008d49dc3b4d087303ff5520894d00c741fc020000008b7c241489790489198d590cc743fc02000000895304c703050000008d530cc742fc020000008b7c2410897a04891a8b5c240c8b7c2408ff70048b442408894c241889542414895c2410897c240c8944240889f358e981fdffff900000000084020000|@8192,63,@656|18,0,0 79,0,0 153,0,0 172,0,8388607 191,0,@5401 256,0,0 412,0,@7993 450,0,0 469,0,4 573,0,2 8192:S62|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f702834296d617041726773283429 8193:O1|@8194 8194:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70013000000c30000000028000000|@8169,3,@657|31,0,9 8195:S52|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f70283429 8196:D3,512|3b650c7303ff5524a801756c8b08833905756a8b5104f6c201740583c2027105ff5538ebf6ff710468a8017eb26a016a0153ff70048d742408568d5c241489d0ba08a57db2e83ea5ffff8b44240c8060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b44240889018b4500eb0ae974010000e92e0000008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400801000000894804c70005000000eb67833901756783fb01740489daeb05ba050000006a016a016a016a0153ff7004ff710889d38b41049090e822ffffff6a016a01833801751189e18b5004891189e18b5808895904eb0d89e1c7010100000089e18941048b442408e876010000837c241005754aeb0ae9b0000000e9900000008b4c240850f6c1017528ff71048b0190e8565fffff81f8010000e0740ab80300000083c404eb10593b650c7303ff5524ebd3b80100000083f801740feb0350eb0ab8ec7d7ab283c404eb5d8b45008d40e43b45087303ff5520894500c740fc020000008b4c24048948048b0c24890889c18d400cc740fc030000008b542408895008894804c7000100000083c404eb188b4804b8ec7d7ab26a016a016a016a0153516a016a016a0183c40c833c2401750483c418c3508b5c24088b4424049090e81afeffff89c35883c418e95b040000b8ec7d7ab2c39000000000fc010000|@8215,2097151,@667|41,0,@8197 65,0,@8058 70,1,@8060 154,0,1 161,0,0 170,0,2 191,0,2 252,0,0 266,1,@8199 306,1,@7972 312,0,-268435456 319,0,1 340,0,0 355,0,@5413 424,0,0 437,0,@5413 493,1,@8205 498,0,@5413 8197:D3,40|a8017509f64204017503ff55383b42047406b801000000c3b803000000c390900000000024000000|@8198,5,@659|19,0,0 25,0,1 8198:S42|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e28322970312d283129 8199:D3,244|3b650c7303ff5524a801756b6a016a01ff70048d5c24048b00e8ea0000008b442404a801740783f8037f0feb06f640ff107407b8ec7d7ab2eb706a016a0189e151bb88057eb2ba08a57db29090e8b2a2ffff8b4424048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104eb05e96a0000005883c40489018b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b542408895008eb05e909000000894804c70005000000508b442404e83effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3b801000000c300000000f0000000|@6329,2097151,@662|26,1,@8200 52,0,@5413 66,0,@8202 71,0,@8058 78,1,@8060 157,0,0 180,0,2 231,0,0 8200:D3,552|3b650c7303ff55248b08ba36037eb28d548afcffe290e973000000909090e97e000000909090e9ef000000909090e95b000000909090e975010000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e958010000909090e91b000000909090e913000000909090e90b000000909090e940010000909090c70303000000c7430401000000b801000000c36a016a0153ff700c8d5c24088b400890e84affffff6a016a0189e38b44240890e83affffff8b442410a8017509f60424017503ff55383b04247524837c2414017507b901000000eb048b4c24048b54240c8902894a04b80100000083c418c38b44240cc70003000000c7400401000000b80100000083c418c3f64004017525f6400401740f8b4804b8ecd57ab28b5d049090ff138b50040fb64aff8d4c090183f9017413c70303000000c7430401000000b801000000c3f6c201740cb8ecd57ab28b5d049090ff13b9ffffff00234afc8d4c0901f6c101740783f9017d19eb06f641ff1074115389cbb88c6c7ab290ff1588c75208eb0389c8538b0c248901c7410403000000b80100000083c404c3c70303000000c7430401000000b801000000c38b4008e935feffff837808017539b9010000008b4004a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c88903c7430401000000b801000000c3c70303000000c7430401000000b801000000c39090900000000024020000|@8201,2097151,@660|11,0,$8200+22 144,0,1 151,0,0 156,0,0 228,0,0 248,0,0 262,0,1 269,0,0 274,0,0 298,0,@6321 327,0,1 334,0,0 339,0,0 350,0,@6321 362,0,8388607 395,0,@5215 402,0,I106 419,0,1 424,0,0 434,0,1 441,0,0 446,0,0 466,0,0 512,0,0 517,0,0 524,0,1 531,0,0 536,0,0 8201:S33|434f4445545245455f4f5054494d4953455228292e66696e645475706c65283129 8202:O1|@8203 8203:D3,16|b803000000c39090000000000c000000|@8204,1,@661|1,0,1 8204:S33|434f4445545245455f4f5054494d4953455228292e6d6170417267283129283129 8205:D3,976|3b650c7303ff55248338017564833b01755fff7308ff7008b9c4097eb2518b5b048b400490e8c2030000a8017409b8ec7d7ab283c408c3508b5c24088b44240490e8baffffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c7000100000083c408c38338057569833b0575698b4804ba010000008b31ff7004ff730cff700cff7308ff7008ff730483fe01747189f083e80289f183e90283ee028b5c24146a016a01525051ff73048d7c241057bb1100000089f090ff1548c752088b44241059d1e80fb604018d4400018b4c2410eb0ae9dd020000e9d8020000ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801eb05e9560000007407b801000000eb05b80300000083f00283f80375268b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908eb048b44240883c4045e83c40c89c23b650c7303ff5524e92fffffff8b0424b9010000008b185283fb01746b89d883e80289da83ea0283eb028b7424046a016a01515052ff76048d7c24105789dfbb1100000089f8909090ff1548c752088b44241059d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740eeb05e954000000b801000000eb05b80300000083f00283f80375268b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908eb048b44240883c4045b83c40c89c13b650c7303ff5524e937ffffff583bc17507b803000000eb41a8017538f6c101752c8b10f6c2017508f601017503ff55383b1175128b49048b500489d03b650c7303ff5524ebc7b801000000eb0cb801000000eb05b80100000083f8017455837c2404017507b801000000eb048b442408837c240c017507b901000000eb048b4c241089c28b45008d40ec3b45087303ff5520894500c740fc0400000089480c8950088b4c2414894804c7000500000083c418c3837c240c01746d837c241001746b8b4424148b0c248b10f6c201740bf6010174063b117e07eb07ff5538ebf58b11505168380b7eb26a016a0189e0508d5c240c89d0ba08a57db2909090e80a9cffff8b4424048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104eb0ae95c000000e9570000005883c4108901837c2404017507b801000000eb048b442408837c240c017507ba01000000eb048b54241089c38b45008d40ec3b45087303ff5520894500c740fc0400000089500c895808894804c7000500000083c418c3b8ec7d7ab283c418c3b8ec7d7ab2c39000000000cc030000|@8214,2097151,@666|25,0,@8206 38,1,@8207 47,0,@5413 105,0,0 127,0,0 189,0,8 198,0,I104 234,0,1 247,0,31 277,0,0 284,0,1 364,0,0 411,0,8 422,0,I104 446,0,1 459,0,31 489,0,0 496,0,1 578,0,1 631,0,0 638,0,0 645,0,0 662,0,0 680,0,0 731,0,2 788,0,@8212 806,0,@8058 814,1,@8060 879,0,0 897,0,0 944,0,2 953,0,@5413 962,0,@5413 8206:O1|@8205 8207:D3,112|3b650c7303ff5524a8017554f6c301754fff7304ff7004ff74240c8b1b8b009090e85e00000050ff7424108b5c240c8b4424089090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c20400000000006c000000|@8004,1048575,@664|34,1,@8208 97,0,0 8208:D3,140|3b650c7303ff552483f801751883fb01740bb8f00a7eb28b5d0490ff13b801000000c20400f6c301740f8b48048b10b8f00a7eb28b5d04ff13ff7304ff70048b1b8b008b54240c90ff1250ff7424108b5c240c8b4424089090e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c204000000000088000000|@8211,1048575,@663|19,0,@8209 30,0,0 48,0,@8209 8209:O4|@4656,@7241,0,@8210 8210:O5|@7240,68,0,68,0 8211:S19|4c697374506169722e6d617045712833292829 8212:D3,392|3b650c7303ff55248b4a08a801740bf6010174063b017d72eb05ff5538ebf5a801740783f8017d08eb1af640ff107514a801740bf6010174063b017c14eb05ff5538ebf589c3b814a17db28b5d0490ff136a016a015052ff71048d5c240c53bb11000000ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93feb05e91b0000007605b93f000000d1e9d3e283ca018d4c090123c283f8017413eb086a016a015052eb09b80300000083c410c38b04248b48048b542404f6c201740bf6010174063b117d70eb05ff5538ebf5f6c201740783fa017d08eb1bf642ff107515f6c201740bf6010174063b117c13eb05ff5538ebf5b814a17db28b5d049090ff136a016a01ff71048d5c240453bb1100000089d0ff1548c752088b4424045983c404d1e80fb604018d44000159ba0300000083ea01eb05e92f00000083f93f7605b93f000000d1e9d3e283ca018d4c090123c283f8017407b801000000eb05b80300000083f00283c410c3b80100000083c410c30000000084010000|@8213,2097151,@665|71,0,@8049 96,0,8 102,0,I104 126,0,1 146,0,31 179,0,1 258,0,@8049 282,0,8 290,0,I104 314,0,1 334,0,31 357,0,0 364,0,1 376,0,0 8213:S60|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229756e696f6e2d283129 8214:S51|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229 8215:S36|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e283229 8216:D3,92|3b650c7303ff5524a80175428b08ff7004bb010000008b4104e8f6f1ffff508b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000058000000|@6329,2097151,@668|18,0,0 26,1,@8196 79,0,0 8217:D3,244|3b650c7303ff5524a801756b6a016a01ff70048d5c24048b00e812f5ffff8b442404a801740783f8037f0feb06f640ff107407b8ec7d7ab2eb706a016a0189e151bbf80e7eb2ba08a57db29090e8da96ffff8b4424048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104eb05e96a0000005883c40489018b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b542408895008eb05e909000000894804c70005000000508b442404e83effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3b801000000c300000000f0000000|@6329,2097151,@670|26,1,@8200 52,0,@5413 66,0,@8218 71,0,@8058 78,1,@8060 157,0,0 180,0,2 231,0,0 8218:O1|@8219 8219:D3,16|b803000000c39090000000000c000000|@8204,1,@669|1,0,1 8220:O4|@4650,@6706,0,@8221 8221:O5|@8091,504,0,504,0 8222:D3,120|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b0883390574028b0b518b5b048b4004e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000074000000|@8211,15,@671|19,0,@8209 30,0,0 46,0,@8209 8223:D3,140|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b0b83390575128b10833a057407beec7d7ab2eb0689ceeb0289ce568b4b0489cb8b4004e89effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000088000000|@8211,31,@672|19,0,@8209 30,0,0 46,0,@8209 72,0,@5413 8224:D3,252|3b650c7303ff552483381575088b4008e9ebffffff833803751bff700c8b400890e8daffffff833805750483c404c358e9cbffffff83381d756d83780801756cb9010000008b4004a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c86a016a0189e151bb8c117eb2ba08a57db29090e81e94ffff8b4424048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104eb0ae941000000e9360000005883c40489018b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c70005000000c3b8ec7d7ab2c3b8ec7d7ab2c39000000000f8000000|@8228,2097151,@674|65,0,0 114,0,@8225 119,0,@8058 126,1,@8060 210,0,0 217,0,0 226,0,2 232,0,@5413 238,0,@5413 8225:O1|@8226 8226:D3,16|b803000000c39090000000000c000000|@8227,1,@673|1,0,1 8227:S43|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129283129 8228:S40|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129 8229:D3,1028|3b650c7303ff55248b0883390f740e89c2b834167eb28b5d049090ff138b5104ff701cff7010ff7004ff721cff7210ff7018ff7014ff700c5153b80100000089da909090ff1250b8010000008b542404ff12b9010000008b54240cf6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b55008d52e83b55087303ff5520895500c742fc02000000894a04c702030000008d4a0cc741fc02000000c70178167eb28951048061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70314177eb2894b048953088063ffbf508b44240ce812e7feffb9010000008b542428f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf515051bb010000008b44242890e89a0500008b4d008d49d43b4d087303ff5520894d00c741fc040000008b54242889510c5b895908894104c701070000008d4114c740fc020000008b5c2404895804c700050000008d700cc746fc02000000c7460401000000890683fe0175068b442414eb1189cf89f38b4424149090e83e06000089f9837c242001741589c689cf8b5c24208b44242c9090e87a060000eb0a89c28b44242c89d689cf8b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54242489511c8b5c241c8959188b5c241889591489411089710cc74108cc777ab28b44242889410489398b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4c2408890b53bb9c1a7eb28b44240490e8be23fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701e4707ab251bb010000008b442434e87e06000050bb010000008b44242c90e83207000083f80175058b0424eb0a89c38b0424e8d20700008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54243c83c40489510cc7410824b57ab2894104c7010700000051bb5b0000008b442434909090e8b2f6fbff8b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54243089511cc7411801000000c74114010000008b54242c8951108b54240489510cc74108cc777ab28941045883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc020000008b54240c895104c701050000008b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc080000008b5c243489591cc7411801000000c74114010000008b5c243089591089510cc74108cc777ab28b54242c89510489018d4124c740fc020000008948048b54240889108b55008d52e83b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc020000008950045a83c43489108b542404890a894204b801000000c20400900000000000040000|@8247,1048575,@685|18,0,@8230 59,0,0 72,0,0 83,0,0 153,0,1 169,0,@8233 206,0,@8235 226,1,@7801 231,0,0 276,0,0 286,1,@8237 330,0,3 353,0,2 370,0,0 398,1,@8239 426,1,@8240 496,0,@5384 544,0,@8241 554,1,@6547 587,0,@5280 593,0,0 602,1,@8244 608,0,0 618,1,@8245 638,1,@8246 679,0,@5868 688,0,3 694,0,45 706,1,@4940 744,0,0 751,0,0 772,0,@5384 814,0,7 837,0,2 868,0,0 894,0,0 901,0,0 918,0,@5384 977,0,0 1012,0,0 8230:O4|@4608,@5398,@8232,@8231 8231:O5|@8091,918,0,918,0 8232:S15|6465637572727946756e6374696f6e 8233:D3,80|833809753b8b400483380775338b45008d40ec3b45087303ff5520894500c740fc020000008b5204895004c7000900000089c18d400cc740fc010000008908c3b801000000c39090000000004c000000|@8234,7,@675|45,0,4 65,0,0 8234:S47|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229646f4d6170283129 8235:D3,260|3b650c7303ff552483380f75708b4804ff711cff7118ff7114ff7110ff7108ff7104ff318b5a048b410c909090e8e60000008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c89511089410c8b4424088941088b4424048941045883c418eb05e93200000089018b45008d40ec3b45087303ff5520894500c740fc02000000894804c7000f00000089c18d400cc740fc010000008908c3833809753b8b400483380775338b45008d40ec3b45087303ff5520894500c740fc020000008b5208895004c7000900000089c18d400cc740fc010000008908c3b801000000c390900000000000010000|@8177,1048575,@677|46,1,@8236 161,0,7 225,0,4 245,0,0 8236:D3,152|3b650c7303ff5524a80175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff700489c8e8aee1feff833809740e89c1b800f67db28b5d049090ff13ff70048b5c24088b44240490e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e9070000005983c4088908c3b801000000c3900000000094000000|@6329,1048575,@676|43,0,4 54,1,@7801 66,0,@8175 138,0,0 8237:D3,196|3b650c7303ff552483f8017508b801000000c204008b0889daf6c2017410f64424040174098d52ff035424047105ff5538ebf28b75008d76dc3b75087303ff5520897500c746fc02000000895604c706010000008d560cc742fc02000000897204c702090000008d720cc746fc020000008b39897e048916f6c301740583c3027105ff5538ebf656ff7424088b500489d0e86affffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c2040090909000000000c0000000|@8238,63,@678|14,0,0 80,0,0 99,0,4 8238:S50|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e2832296d61704172672833292829 8239:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@679| 8240:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@680| 8241:O1|@8242 8242:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c30000000028000000|@8243,3,@681|31,0,0 8243:S12|4c6f6164417267756d656e74 8244:D3,176|3b650c7303ff552483f8017506b801000000c38b0889daf6c201740583c2027105ff5538ebf68b75008d76dc3b75087303ff5520897500c746fc02000000895604c706030000008d560cc742fc02000000897204c702090000008d720cc746fc020000008b39897e048916f6c301740583c3027105ff5538ebf6568b500489d090e87affffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000ac000000|@8238,63,@682|14,0,0 67,0,1 86,0,4 8245:D3,160|3b650c7303ff552483f8017506b801000000c38b088b55008d52dc3b55087303ff5520895500c742fc02000000895a04c702010000008d720cc746fc02000000895604c706090000008d560cc742fc020000008b39897a048932f6c301740583c3027105ff5538ebf6528b700489f09090e88affffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c390000000009c000000|@8238,63,@683|14,0,0 50,0,0 69,0,4 8246:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@684| 8247:S39|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229 8248:D3,1156|3b650c7303ff5524ff701cff7010ff700453ff7014ff7018ff700cff30b8010000008b5424289090ff1250b8010000008b54242cff12b9010000008b542408f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b55008d52e83b55087303ff5520895500c742fc02000000894a04c702030000008d4a0cc741fc02000000c70190217eb28951048061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7032c227eb2894b048953088063ffbf508b442408e852dcfeffb9010000008b542420f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b55008d52d43b55087303ff5520895500c742fc02000000894a04c702010000008d4a0cc741fc02000000895104c701090000008d510cc742fc04000000894a0c8b4c2418894a08894204c7021900000089d38b4424209090e8a60500008b4d008d49e83b4d087303ff5520894d00c741fc020000008b1424895104c701050000008d710cc746fc02000000c7460401000000890e83fe0175068b4c240ceb1489c75389f38b442410e8b205000089c189f8eb01538b542414f6c201740583c2027105ff5538ebf68b5d008d5bdc3b5d087303ff5520895d00c743fc08000000c7431c030000008953188b542418895314894310894b0cc74308cc777ab28b44242089430459890b8b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b54240489118b5c2418be01000000bf0100000051ff333b3c24736589f883c0028b4c24206a016a015650ff71048d54240c52bb1100000089f8909090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045f83c40c89c63b650c7303ff5524e95bffffff56bb010000008b44242ce8ca040000909090e8ae0500008b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000c7410824b57ab2894104c701070000008d4114c740fc050000008948105983c40489480cc7400801000000c7400401000000c700010000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890151bb04267eb28b44242090e82e060000833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c700150000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54240c83c404895104c701050000008b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc080000008b5c242889591cc7411803000000c74114010000008b5c242489591089510cc74108cc777ab28b54242089510489018d4124c740fc020000008948048b54240489108b55008d52e83b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc020000008950045a83c42889108b542404890a894204b801000000c20800900000000080040000|@8267,2097151,@696|30,0,0 44,0,0 55,0,0 125,0,1 141,0,@8249 178,0,@8251 198,1,@7801 203,0,0 273,0,0 292,0,4 321,0,12 334,1,@8253 370,0,2 387,0,0 414,1,@8254 471,0,1 494,0,@5384 546,0,0 551,0,0 587,0,8 598,0,I104 622,0,1 635,0,31 658,0,0 670,0,1 725,0,0 734,1,@8255 742,1,@8257 773,0,1 780,0,@5868 789,0,3 816,0,0 823,0,0 829,0,0 860,0,0 868,0,@8260 878,1,@8263 925,0,10 965,0,2 996,0,0 1022,0,1 1029,0,0 1046,0,@5384 1105,0,0 1140,0,0 8249:D3,80|833809753b8b400483380775338b45008d40ec3b45087303ff5520894500c740fc020000008b5204895004c7000900000089c18d400cc740fc010000008908c3b801000000c39090000000004c000000|@8250,7,@686|45,0,4 65,0,0 8250:S45|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329646f4d6170283129 8251:D3,260|3b650c7303ff552483380f75708b4804ff711cff7118ff7114ff7110ff7108ff7104ff318b5a048b410c909090e8e60000008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c89511089410c8b4424088941088b4424048941045883c418eb05e93200000089018b45008d40ec3b45087303ff5520894500c740fc02000000894804c7000f00000089c18d400cc740fc010000008908c3833809753b8b400483380775338b45008d40ec3b45087303ff5520894500c740fc020000008b5208895004c7000900000089c18d400cc740fc010000008908c3b801000000c390900000000000010000|@8177,1048575,@688|46,1,@8252 161,0,7 225,0,4 245,0,0 8252:D3,152|3b650c7303ff5524a80175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff700489c8e896d6feff833809740e89c1b800f67db28b5d049090ff13ff70048b5c24088b44240490e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e9070000005983c4088908c3b801000000c3900000000094000000|@6329,1048575,@687|43,0,4 54,1,@7801 66,0,@8175 138,0,0 8253:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8ac707ab2c39090900000000044000000|@6536,3,@689|56,0,@5276 8254:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@690| 8255:D3,160|3b650c7303ff552483f8017506b801000000c38b088b55008d52dc3b55087303ff5520895500c742fc02000000895a04c702010000008d720cc746fc02000000895604c706090000008d560cc742fc020000008b39897a048932f6c301740583c3027105ff5538ebf6528b700489f09090e88affffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c390000000009c000000|@8256,63,@691|14,0,0 50,0,0 69,0,4 8256:S48|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833296d61704172672833292829 8257:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8ec257eb2c39090900000000044000000|@6536,3,@692|56,0,@8258 8258:O2|@8259,0 8259:O2|@6252,1 8260:O1|@8261 8261:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c7400404d07ab2c7000d000000c390900000000038000000|@8262,3,@693|29,0,0 39,0,@6252 45,0,6 8262:S49|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833297368696d426f64792d283129 8263:D3,128|3b650c7303ff55245053bb01000000b80100000090e87a0000008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740789c8e9a0f2fdff89c8c390000000007c000000|@8266,2097151,@695|11,0,0 16,0,0 22,1,@8264 53,0,0 62,0,14 93,0,0 100,0,1 112,1,@6933 8264:D3,360|3b650c7303ff55248b4c2408a8017508f601017503ff55383b017508b801000000c20800a801740783f8017d08eb1af640ff107514a801740bf6010174063b017c13eb05ff5538ebf589c2b814a17db28b5d04ff136a016a015350ff71048d54240c52bb11000000ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801746b8b4424048b542414909090ff128b0c24f6c101740583c1027105ff5538ebf68b542404f6c201740583c2027105ff5538ebf650ff74241cff74241c89d389c890e816ffffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c410c208008b0424a801740583c0027105ff5538ebf6ff742418ff7424188b5c240ce8cefeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948049090c700c4757ab283c410c208009090900000000064010000|@8265,2097151,@694|29,0,0 76,0,@8049 100,0,8 106,0,I104 130,0,1 143,0,31 339,0,@5348 8265:S47|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229657874417267283229 8266:S38|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229 8267:S37|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329 8268:D3,948|3b650c7303ff55248b4d008d49f83b4d087303ff5520894d00c741fc010000408b501889116a016a016a01ff701cff7010ff7004ff701451ff700c53ff306a018d7424245651ff742420bb010000008b4424149090e86e030000837c2428017507b868c05208eb70b8010000008b4c2428f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb12f640ff10750c89c1b850337db28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c242883f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f8b9010000008b542408f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b55008d52e43b55087303ff5520895500c742fc02000000894a04c702030000008d4a0cc741fc03000000c701884f7eb28951048941088061ffbf8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c70398507eb2894b0489530889430c8063ffbf58e822cffeff508b5c24188b4424049090e8c62700005089c38b442428e84e2a000050b8010000008b54243cff1250b8010000008b542440ff12837c242c0175068b4c240ceb2c8b4d008d49f03b4d087303ff5520894d00c741fc030000008b54240c8951088b54242c895104c701150000008b55008d52e83b55087303ff5520895500c742fc02000000894204c702050000008d5a0cc743fc02000000c7430401000000891383fb0175068b542414eb1689c689cf8b442414909090e85a2a000089c289f989f08b5c24188b1b8b75008d76bc3b75087303ff5520897500c746fc080000008b7c2428897e1c895e188b5c241c895e148b5c2408895e1089560cc74608cc777ab28b542420895604890e8d4e24c741fc020000008971048b1c2489198d710cc746fc04000000897e0cc7460824b57ab28b542404895604c706070000008b55008d52c43b55087303ff5520895500c742fc02000000895a04c702050000008d5a0cc743fc02000000c743040100000089138d530cc742fc08000000897a1cc7421801000000c74214010000008b7c242483c420897a10895a0cc74208cc777ab25b83c414895a0489328b5d008d5bdc3b5d087303ff5520895d00c743fc0200000089530489038d430cc740fc02000000c740040100000089188d580cc743fc02000000894304890b8b4424048910895804b801000000c2080000000000b0030000|@8324,2097151,@725|75,0,0 86,1,@8269 98,0,I49 105,0,0 151,0,16777215 168,0,@7886 180,0,0 230,0,0 285,0,0 355,0,1 371,0,@8310 411,0,@8312 430,1,@7801 446,1,@8314 458,1,@8322 464,0,0 476,0,0 539,0,10 572,0,2 589,0,0 618,1,@8323 688,0,@5384 735,0,@5868 748,0,3 781,0,2 798,0,0 820,0,0 827,0,0 847,0,@5384 902,0,0 933,0,0 8269:D3,2524|3b650c7303ff552483f80175208b44240cc70001000000c7400401000000c7400801000000b801000000c210008b08833901755cf6410401755b8b5104837a0401756c8b7108833e057569837e080175688b7d008d7ff43b7d087303ff5520897d00c747fc020000008b542410895704c707010000008b55008d52e83b55087303ff5520895500c742fc02000000eb0ae985040000e9a0030000c7420401000000893a8d7a0cc747fc02000000eb0fe927010000e922010000e91d010000895f04c70701000000ff70048b45008d40ec3b45087303ff5520894500c740fc02000000c740040100000089388d780cc747fc010000008b760489376a016a016a015350578d44240c50ff742428ff74242889d38b4104e8d608000058a801740583c0027105ff5538ebf68b4c2420f6c101740583c1027105ff5538ebf66a016a016a01518d4c240451ff74242cff74242c89c38b442428909090e8a2feffff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240889088b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048b54240889118b55008d52f43b55087303ff5520895500c742fc020000005b83c408895a045b83c404891a8b5c240c8903894b04895308b801000000c210008b32f7c60100000075238b3e833f05750d837f08017507ba03000000eb148b7e0489fe3b650c7303ff5524ebd5ba0100000083fa0174718b55008d52d03b55087303ff5520895500c742fc020000008b742410897204c702010000008d7a0cc747fc02000000c747040100000089178d570cc742fc02000000895a04c702010000008d720cc746fc02000000c746040100000089166a016a016a01ff700453566a018d442410eb05e9d400000050ff742428ff74242889fb8b4104909090e85207000058a801740583c0027105ff5538ebf68b4c2420f6c101740583c1027105ff5538ebf66a016a016a01518d4c240451ff74242cff74242c89c38b44241c909090e81efdffff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240c89088b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048b54240c89118b55008d52f43b55087303ff5520895500c742fc020000005b83c40c895a045b891a8b5c240c8903894b04895308b801000000c2100089d9f6c101740583c1027105ff5538ebf68b542410f6c201740583c2027105ff5538ebf66a016a016a0153528d54240852ff742420ff74242089cb8b4004909090e85efcffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c700010000008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc020000008b54240489500489088d480cc741fc020000008b54241c895104c701010000008d590cc743fc020000008b742408897304890b8b4c24185e83c4088931894104895908b801000000c2100089daf6c201740583c2027105ff5538ebf68b742410f7c601000000740583c6027105ff5538ebf66a016a016a0153568d74240856ff742420ff74242089d38b480489c8e87efbffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c700010000008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc020000008b54240489500489088d480cc741fc020000008b54241c895104c701010000008d590cc743fc020000008b742408897304890b8b4c24185e83c4088931894104895908b801000000c2100083390575688379080175678b5104be010000008b3aff700453ff710483ff01747289f883e80289f983e90283ef028b14246a016a01565051ff72048d5c241053bb1100000089f8909090ff1548c752088b44241059d1e80fb604018d4400018b4c2410ba0300000083ea01eb0ae966030000e98102000083f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801eb05e9560000007407b801000000eb05b80300000083f00283f80375268b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908eb048b44240883c4045f83c40c89c63b650c7303ff5524e92effffff8b442404a801740583c0027105ff5538ebf68b0c24ba01000000bb010000005650ff313b1c24736489d883c0028b4c240c6a016a015250ff71048d74240c5689debb1100000089f0ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045b83c40c89c23b650c7303ff5524e95cfffffff6c2017410f64424280174098d52ff035424287105ff5538ebf26a016a016a01528d44240450ff742434ff7424348b5c24208b442430e8f6f8ffff8b44242c8b008b4c242c8b09f6c101740583c1027105ff5538ebf68b54242c890aff74243468404d7eb2508d5c24048b442424e84ef2ffff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b0424894108c7410401000000c7010300000089cf8b5c24288b442420909090e88a1900008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54240c8951048939837c241001740e89ce8b5c241090e82e1a000089f18b55008d52f43b55087303ff5520895500c742fc020000005b83c410895a04c702050000008b5d008d5bf43b5d087303ff5520895d00c743fc020000005e83c41889730489138b54240c890a894204895a08b801000000c2100089daf6c201740583c2027105ff5538ebf68b742410f7c601000000740583c6027105ff5538ebf66a016a016a0153568d74240856ff742420ff74242089d38b480489c8e8a6f7ffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c700010000008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc020000008b54240489500489088d480cc741fc020000008b54241c895104c701010000008d590cc743fc020000008b742408897304890b8b4c24185e83c4088931894104895908b801000000c2100089daf6c201740583c2027105ff5538ebf68b742410f7c601000000740583c6027105ff5538ebf66a016a016a0153568d74240856ff742420ff74242089d38b480489c8e8c6f6ffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c700010000008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc020000008b54240489500489088d480cc741fc020000008b54241c895104c701010000008d590cc743fc020000008b742408897304890b8b4c24185e83c4088931894104895908b801000000c21000909000000000d8090000|@8309,2097151,@716|19,0,0 26,0,0 33,0,0 38,0,0 114,0,0 157,0,0 195,0,0 229,0,0 278,1,@8270 468,0,0 499,0,1 521,0,0 563,0,0 580,0,0 601,0,0 618,0,0 666,1,@8270 853,0,0 960,0,0 993,0,4 1035,0,0 1075,0,0 1184,0,0 1217,0,4 1259,0,0 1299,0,0 1321,0,0 1371,0,8 1382,0,I104 1406,0,1 1431,0,31 1461,0,0 1468,0,1 1566,0,0 1571,0,0 1610,0,8 1618,0,I104 1642,0,1 1655,0,31 1678,0,0 1690,0,1 1840,0,@8305 1854,1,@8263 1894,0,0 1900,0,1 1918,1,@8307 1970,1,@8308 2009,0,2 2059,0,0 2168,0,0 2201,0,4 2243,0,0 2283,0,0 2392,0,0 2425,0,4 2467,0,0 2507,0,0 8270:D3,944|3b650c7303ff5524a801740d89c1b81c777bb28b5d0490ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b4424088b008b5424088b12f6c201740583c2027105ff5538ebf68b74240889165051ff742418ff7424105189c8909090e8520300008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b442404894108c7410401000000c70103000000516824b57ab2bb010000008b44240890e8920d00008b4c2404ba0100000050f6c101755f8b01bb01000000ff710452a80175628b08833905756083790801755f8b5104be01000000bf01000000ff700453ff32ff71043b7c2404737189f883c0028b0c246a016a015650ff71048d54240c52bb1100000089f89090ff1548c75208eb05e9020100008b44240c59d1e80fb60401eb0fe9c4000000e992000000e98d0000008d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c2eb05e94200000083f8017407b801000000eb05b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045f83c40c89c63b650c7303ff5524e942fffffff7c6010000007410f64424080174098d76ff03742408711fff5538ebf2f6c301740583c3027105ff5538ebf689deff70046a016a016a0189f383c40c583b650c7303ff5524e9d1feffff89d8a801740ef604240174088d40ff0304247105ff5538ebf389c283c404593b650c7303ff5524e995feffff89d0f6442420017507b901000000eb05b90300000083f102a801740cf6c10174078d40ff03c17105ff5538ebf4f64424200175718b4c242089c2f6c201740583ea027105ff5538ebf6f6c201740783fa017c08eb15f642ff10740f89c3b8a4727db28b5d04909090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000895304c703010000008d530cc742fc02000000895a04c7020900000089c6528b19eb05e90b0000008b442404e82a110000eb0789c18b042489ce5056bb584c7eb28b44241c909090e8a2d1fbff50bb644c7eb28b44240490e806fefcff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44243089410cc74108cc777ab25a83c4048951045a83c40489118b55008d52e83b55087303ff5520895500c742fc02000000894a04c7020f0000008d4a0cc741fc020000008b5c2408895904c701050000008b5c24185e83c4088933895304894b08b801000000c2140090909000000000ac030000|@8304,2097151,@712|15,0,@6704 52,0,0 110,1,@8271 151,0,0 157,0,1 163,0,@5868 168,0,0 178,1,@8293 187,0,0 200,0,0 229,0,0 234,0,0 276,0,8 286,0,I104 334,0,1 347,0,31 377,0,0 384,0,1 565,0,0 572,0,1 649,0,@7993 690,0,0 709,0,4 730,1,@8299 746,0,@8300 758,1,@4940 764,0,@8301 774,1,@6547 805,0,1 812,0,0 819,0,0 836,0,@5384 882,0,7 905,0,2 926,0,0 8271:D3,932|3b650c7303ff5524a801756eb9010000008b10f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf837804017518f644240c017507ba01000000eb05ba0300000083f202eb05ba010000005253ff700451bb743e7eb28b442418909090e86ad0fbff50bb803e7eb28b442404eb05e9dc0000009090e8c6fcfcffb9010000008b54240cf6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf50bb0c3f7eb289c890e88efcfcff50bb9c1a7eb28b44240c90e87efcfcff83f80175058b0424eb0a89c38b0424e8b6030000ff742428ff742428ff74242889c38b44241c90e806ffffff8b4d008d49d03b4d087303ff5520894d00c741fc08000000c7411c030000008b54241883c404895118c74114010000005a8951108b54240c89510cc74108010000005a83c41089510489018d4124c740fc02000000894804c7000f000000c20c00f6c301740db858777bb28b5d04909090ff13538b430489c38b4424089090e872030000f644241001756c8b4c24108b11bb01000000be01000000ff3150ff323b3424736c89f083c0028b4c24086a016a015350ff71048d54240c52bb1100000089f0909090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e2eb05e94701000083ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045e83c40c89c33b650c7303ff5524e954fffffff644240c01740cb81c777bb28b5d049090ff138b44240c83c4048b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c7010900000089ce58909090e8e20600008b4d008d49c83b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c701070000008d4114c740fc0500000089481089580cc7400801000000c74004cc777ab2c700010000008d4818c741fc02000000c7410401000000890151bb88447eb28b442404909090e8dae8ffff833c2401750683c40cc20c0089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c40cc20c00f6042401740e89c1b81c777bb28b5d049090ff138b0c248b55008d52e03b55087303ff5520895500c742fc020000008b09894a04c7020900000089c18d420cc740fc04000000c7400c03000000895008894804c7000700000083c404c20c0000000000a0030000|@8292,2097151,@706|13,0,0 66,0,0 73,0,1 83,0,0 94,0,@8272 106,1,@4940 112,0,@8273 130,1,@6547 135,0,0 178,0,@8276 186,1,@6547 192,0,@8241 202,1,@6547 222,1,@8278 277,0,1 294,0,0 312,0,0 340,0,7 353,0,@6707 378,1,@8279 396,0,0 401,0,0 439,0,8 450,0,I104 474,0,1 487,0,31 517,0,0 529,0,1 590,0,@6704 639,0,4 650,1,@8289 681,0,1 693,0,3 716,0,0 723,0,@5384 729,0,0 746,0,0 754,0,@8290 766,1,@8263 819,0,10 838,0,@6704 883,0,4 902,0,1 914,0,3 8272:S2|2d50 8273:O1|@8274 8274:D3,16|b8e43a7cb2c39090000000000c000000|@8275,1,@697|1,0,@7126 8275:S88|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229283129 8276:O1|@8277 8277:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c30000000028000000|@8275,3,@698|31,0,1 8278:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@699| 8279:D3,48|3b650c7303ff5524a8017516b9f03f7eb28b1424890c24ff70048b0052e92a000000b801000000c3000000002c000000|@8288,2097151,@703|13,0,@8280 30,1,@8281 35,0,0 8280:O1|@8279 8281:D3,500|3b650c7303ff5524a801755c8b08833905755a837908017559f6c30175598b5104be010000008b3aff7304ff7004ff33ff710483ff01747289f883e80289f983e90283ef028b14246a016a01565051ff72048d5c241053bb1100000089f89090ff1548c75208eb14e96c010000e9de000000e9d9000000e9d40000008b44241059d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca01eb05e95f0000008d4c090123c283f8017407b801000000eb05b80300000083f00283f80375268b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b0c248908eb048b44240883c4045f83c40c89c63b650c7303ff5524e925ffffff83c4045b89f090e8ee00000050ff742414ff7424148b5c24108b44240c9090e8cefeffff83f80175075883c408c2080089c38b042483c40c5983c40851e96c010000f6c30174108b4804b80c437eb28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc020000008b33897204c702090000008d7a0cc747fc02000000c7470403000000891757ff74240cff74240c8b530489d38b480489c8909090e84afeffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c208008b4424088b4c240489c289c85e83c40856ff2200000000f0010000|@8287,2097151,@702|34,0,0 88,0,8 98,0,I104 144,0,1 157,0,31 187,0,0 194,0,1 278,1,@8282 332,1,@8283 345,0,@8284 388,0,4 405,0,1 8282:D3,160|3b650c7303ff5524a801756d8b4d008d49d43b4d087303ff5520894d00c741fc02000000895904c701090000008d510cc742fc04000000c7420c010000008b30897208894a04c7020d0000008d4a14c741fc02000000c74104030000008911518b500489d0e896ffffff89c18b45008d40f43b4508730aeb05e914000000ff5520894500c740fc02000000894804598908c3b801000000c3000000009c000000|@6329,31,@700|41,0,4 58,0,0 72,0,6 89,0,1 147,0,0 8283:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@701| 8284:O4|@4608,@5398,@8286,@8285 8285:O5|@8091,713,0,713,0 8286:S17|6d6170417267733a206d69736d61746368 8287:S104|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d6170417267732832296d6170417267283229 8288:S95|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d617041726773283229 8289:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8ec257eb2c39090900000000044000000|@6536,3,@704|56,0,@8258 8290:O1|@8291 8291:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c7400404d07ab2c7000d000000c390900000000038000000|@8275,3,@705|29,0,0 39,0,@6252 45,0,6 8292:S85|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229 8293:D3,440|3b650c7303ff552483f80175078b442404c20400ff700453ff308b1c248b442404e8a601000059ba0100000050f6c10175618b01833805755f83780801755e8b5804be01000000bf01000000ff710452ff33ff70043b7c2404736d89f883c0028b0c246a016a015650ff71048d54240c52bb1100000089f8ff1548c752088b44240c59d1e80fb604018d4400018b4c240ceb0fe9bc000000e98a000000e985000000ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740eeb05e93d000000b801000000eb05b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045f83c40c89c63b650c7303ff5524e94bfffffff7c6010000007410f64424080174098d76ff03742408711fff5538ebf2f6c201740583c2027105ff5538ebf689d6ff71046a016a016a0189f283c40c593b650c7303ff5524e9d9feffff89d0a8017410f64424040174098d40ff034424047105ff5538ebf28b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b5424108951085b83c404895904c70107000000894c240889c358e952feffff909000000000b4010000|@8298,2097151,@709|34,1,@8294 40,0,0 67,0,0 72,0,0 114,0,8 122,0,I104 163,0,1 176,0,31 206,0,0 213,0,1 394,0,1 414,0,3 8294:D3,544|3b650c7303ff5524f6c30175618b0b833905755f83790801755e506840497eb2ff730450ff71048d5c240c8b0424909090e856dfffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040300000089018b0424ba01000000bb0100000051ff303b1c247371eb0fe99c010000e9f6000000e9f100000089d883c0028b4c24086a016a015250ff71048d74240c5689debb1100000089f0909090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801eb05e93f0000007407b801000000eb05b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045b83c40c89c23b650c7303ff5524e946fffffff6c2017410f644240c0174098d52ff0354240c7105ff5538ebf28b5c241083c40489d090e8b6feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c3a801740783f8017c08eb14f640ff10740e89c2b8a4727db28b5d049090ff138b55008d52dc3b55087303ff5520895500c742fc02000000894204c702010000008d720cc746fc02000000895604c706090000008d560cc742fc02000000c74204030000008932a801740583c0027105ff5538ebf6528b4b0489cb90e812feffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000001c020000|@8297,2097151,@708|28,0,@8295 50,1,@8263 81,0,1 91,0,0 96,0,0 151,0,8 162,0,I104 186,0,1 199,0,31 229,0,0 236,0,1 386,0,@7993 426,0,0 445,0,4 462,0,1 528,0,0 8295:D3,116|a801740ef642040174088d40ff0342047105ff5538ebf3a801740783f8017c08eb13f640ff10740d89c1b8a4727db28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000070000000|@8296,7,@707|43,0,@7993 82,0,0 101,0,4 8296:S100|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229283129 8297:S97|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229 8298:S86|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c79283329 8299:D3,324|3b650c7303ff552483380b755253ff7008ff74240c8b400490e8e2ffffff50ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c7000b000000c204008338177503c20400833815753cff7004ff7424088b4008909090e882ffffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70015000000c20400833803755d53ff7004ff700cff7424108b40089090e83effffff50ff7424148b5c24108b4424089090e82affffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c5983c4048948085983c404894804c70003000000c2040089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c895808894804c70019000000c2040090900000000040010000|@8046,15,@710|88,0,5 161,0,10 259,0,1 307,0,12 8300:S2|2d45 8301:O1|@8302 8302:D3,16|b8e43a7cb2c39090000000000c000000|@8303,1,@711|1,0,@7126 8303:S84|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429746869734172672d283129 8304:S73|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429 8305:D3,116|a801740ef642040174088d40ff0342047105ff5538ebf3a801740783f8017c08eb13f640ff10740d89c1b8a4727db28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000070000000|@8306,7,@713|43,0,@7993 82,0,0 101,0,4 8306:S67|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e2833297475706c652d283129 8307:D3,196|3b650c7303ff5524a8017570f6c301740783fb017c08eb15f643ff10740f8b48048b10b8a4727db28b5d04ff138b4d008d49d43b4d087303ff5520894d00c741fc02000000895904c701010000008d510cc742fc02000000894a04c702090000008d4a0cc741fc04000000c7410c010000008b30897108895104eb05e932000000c7010d000000518b500489d0e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000c0000000|@6329,31,@714|36,0,@7993 74,0,0 93,0,4 110,0,0 131,0,6 180,0,0 8308:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@715| 8309:S58|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e283329 8310:D3,188|833809756d8b480483390775318b5d008d5bec3b5d087303ff5520895d00c743fc020000008b5204895304c703090000008d430cc740fc010000008918c38339017562f641040174148b7208bbffffff00235efc8d5c1b013b5904770cb8cc7b7ab28b5d049090ff138b59048b5c5efeeb05e9340000008b7d008d7fec3b7d087303ff5520897d00c747fc02000000895f04c707090000008d470cc740fc010000008938c3b801000000c3b801000000c390909000000000b8000000|@8311,63,@717|45,0,4 77,0,8388607 94,0,@5401 148,0,4 166,0,0 172,0,0 8311:S53|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329646f4d6170283129 8312:D3,368|3b650c7303ff552483380f75708b4804ff711cff7118ff7114ff7110ff7108ff7104ff318b5a048b410c909090e8520100008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c89511089410c8b4424088941088b4424048941045883c418eb05e93200000089018b45008d40ec3b45087303ff5520894500c740fc02000000894804c7000f00000089c18d400cc740fc010000008908c3833809756d8b480483390775318b5d008d5bec3b5d087303ff5520895d00c743fc020000008b5208895304c703090000008d430cc740fc010000008918c38339017562f641040174148b720cbbffffff00235efc8d5c1b013b5904770cb8cc7b7ab28b5d049090ff138b59048b5c5efeeb05e9340000008b7d008d7fec3b7d087303ff5520897d00c747fc02000000895f04c707090000008d470cc740fc010000008938c3b801000000c3b801000000c3909090000000006c010000|@8177,1048575,@719|46,1,@8313 161,0,7 225,0,4 257,0,8388607 274,0,@5401 328,0,4 346,0,0 352,0,0 8313:D3,152|3b650c7303ff5524a80175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c7010900000053ff700489c8e8bea7feff833809740e89c1b800f67db28b5d049090ff13ff70048b5c24088b44240490e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e9070000005983c4088908c3b801000000c3900000000094000000|@6329,1048575,@718|43,0,4 54,1,@7801 66,0,@8175 138,0,0 8314:D3,364|3b650c7303ff552483f801751683fb01740bb848547eb28b5d0490ff13b801000000c3f6c30174118b088b5004b848547eb28b5d049090ff13ff30ff338b5b048b40049090e8b6ffffff8b4c240483390575658379080175648b5104bb01000000be0100000050ff32ff71043b742404736e89f083c0028b0c246a016a015350ff71048d54240c52bb1100000089f090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7611eb0ae980000000e97b000000b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045e83c40c89c33b650c7303ff5524e951ffffff89d8bb74547eb283c408e816e4fcff833c2401750483c40cc35b83c408e9df00000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c408c3900000000068010000|@8321,2097151,@722|19,0,@8315 30,0,0 46,0,@8315 93,0,0 98,0,0 137,0,8 146,0,I104 170,0,1 195,0,31 218,0,0 230,0,1 286,0,@8317 294,1,@6547 313,1,@8320 8315:O4|@4656,@7241,0,@8316 8316:O5|@7240,89,0,89,0 8317:O1|@8318 8318:D3,16|b8e4707ab2c39090000000000c000000|@8319,1,@720|1,0,@5280 8319:S57|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329657870616e64283329283129 8320:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@721| 8321:S21|4c697374506169722e666f6c647245712834292829 8322:D3,152|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b0b8b55008d52f43b55087303ff5520895500c742fc020000008b318972048b38893a52ff73045b8b780489f8909090e892ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000094000000|@8211,63,@723|19,0,@8209 30,0,0 46,0,@8209 8323:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@724| 8324:S45|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329 8325:S33|434f4445545245455f4f5054494d4953455228292e6f70744c616d626461283429 8326:D3,160|3b650c7303ff55248b4d008d49d03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000040c70278577eb2c74204010000008d720cc746fc06000000c706bc5e7eb2894e04895e088b7c2408897e0c8b7c2404897e108956148066ffbf8972048062ffbf5189d3909090e8d6a2feff598b098b54240c89028b442410894204894a08b801000000c21000909090000000009c000000|@11905,1048575,@2189|34,0,0 50,0,@8327 57,0,0 73,0,@8341 118,1,@7801 142,0,0 8327:D3,420|3b650c7303ff5524833815756452ff7008ff720489d38b4004e89a010000508b5c24088b4424049090e86ea2feff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c408894104c701150000008b45008d40f83b45087303ff5520894500c740fc010000008908c383380f75658b480483790c0175618379140375608b5d008d5be43b5d087303ff5520895d00c743fc03000000894b08c7430401000000c703010000008d7310c746fc02000000c7460401000000891e6a016a0189e389f08b520490ff12833c24017556f644240401eb0fe9b3000000e9a8000000e9a300000075118b4424048b08833903750683780401740cb82c5e7eb28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b490c890883c408c38b0424837804017507837c240401740f8b08b82c5e7eb28b5d04909090ff138b008b4d008d49f43b4d087303ff5520894d00c741fc020000008b4008894104c7010f0000008b45008d40f83b45087303ff5520894500c740fc01000000890883c408c3b801000000c3b801000000c390909000000000a0010000|@8340,1048575,@733|26,1,@8328 42,1,@7801 82,0,10 163,0,0 169,0,0 186,0,0 254,0,@8337 317,0,@8337 363,0,7 398,0,0 404,0,0 8328:D3,80|3b650c7303ff5524a801753253ff30ff74240c8b4004909090e8e2ffffff8b4c240c8b5424048954240c8b542408894c240889c35883c40452e926000000b801000000c204009090000000004c000000|@6729,1048575,@732|58,1,@8329 63,0,0 8329:D3,732|3b650c7303ff5524833801757053ff700cff7008ff70048b5c24188b4010909090e85aa0feff8b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44240889410c8b4424048941085883c408894104c701010000008b45008d40f43b45087303ff5520894500c740fc020000005a8950048908c208008338057544538b5c240c8b4004909090e8ee9ffeff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc020000005a8950048908c2080083380775706a016a01538d5c24048b40048b54241090ff12f6442404017407b801000000eb3a8b45008d40e83b45087303ff5520894500c740fc020000008b4c2404894804c7000700000089c18d400cc740fc02000000c74004010000008908833c2401740a8b1c249090e8ba01000083f801eb05e91c000000750783c40858c2080089c38b44240883c40c5983c40851e9ec0100008b480c83390f756b8b55008d52f03b55087303ff5520895500c742fc030000008b71048972088b7808897a048b7804893a8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c747040100000089176a016a01538d5c240489f88b542410909090ff12837c2404017528833c2401eb05e999000000750783c40858c208008b1c248b44240883c40c5983c40851e9af0100008b442404837804017507837c240801740f8b08b88c5d7eb28b5d04909090ff138b088b55008d52d43b55087303ff5520895500c742fc020000008b5908895a04c7020f0000008d720cc746fc0400000089560c8b51048956088b39897e04c706030000008d4614c740fc020000008b3c24897804893083c40cc2080053ff7008ff70048b5c241489c8909090e8fe9dfeff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b4424048941085883c404894104c701030000008b45008d40f43b45087303ff5520894500c740fc020000005a8950048908c20800909000000000d8020000|@8336,1048575,@731|34,1,@7801 88,0,0 142,1,@7801 175,0,2 230,0,0 269,0,3 288,0,0 306,1,@8330 344,1,@8331 424,0,0 493,1,@8332 517,0,@8333 563,0,7 593,0,1 638,1,@7801 685,0,1 8330:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@728| 8331:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@729| 8332:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@730| 8333:O4|@4608,@5398,@8335,@8334 8334:O5|@8091,1424,0,1424,0 8335:S13|636865636b42696e64696e6773 8336:S81|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129636865636b42696e64696e6773283229 8337:O4|@4608,@5398,@8339,@8338 8338:O5|@8091,1411,0,1411,0 8339:S14|70726f636573734c616d62646173 8340:S65|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129 8341:D3,732|3b650c7303ff55248b4a048b098b7204c70601000000535250518b5a14e8ce0200008b4c24088b51048b12833c240174108b5904c70303000000be01000000eb05be0100000083fa01755d8b542404f6c20175218b1a8b7308837e14017507bf03000000eb148b7a0489fa3b650c7303ff5524ebdabf0100000083ff0175508b54240450f6c201756a8b028b48088b590cf6c30175628b03833805754f8b4c2408f6c101753ceb05e98d0000008b318b7e04f7c7010000007509f64004017503ff55383b7804750cb903000000eb18e963000000ff7104593b650c7303ff5524ebbfb90100000083f9017511b803000000eb1ce933000000e90d0000008b5b043b650c7303ff5524eb87b80100000083f8017407b803000000eb158b52043b650c7303ff5524e959ffffffb80100000083f801741feb0450eb01508b4424108b0c248908c7400401000000b80100000083c414c38b04249090e88a0200008b4d008d49d83b4d087303ff5520894d00c741fc020000008b1424895104c701070000008d590cc743fc02000000c7430401000000890b8d4b0cc741fc03000000c7410801000000894104c7011d000000a801751d8b30833e05750f8b700489f03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a5389c8e80eb9fdffeb0389c8538b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c701150000008b0424ba01000000a801752b8b18f6c201740df643040174073b53047d0aeb05ff5538ebf48b53048b580489d83b650c7303ff5524ebd189d0a801740583c0027105ff5538ebf66a016a018b542414ff72088d5c240453ff720cff721089c389c8e80e020000b8010000005aff128b4d008d49f03b4d087303ff5520894d00c741fc030000005a895108894104c701050000008b44240c8b4004c7000300000051bb010000008b442404909090e8d2e407008b4c2410c70101000000894104b80100000083c414c300000000d8020000|@11904,2097151,@2188|18,0,0 30,1,@8342 54,0,1 59,0,0 66,0,0 96,0,1 118,0,0 201,0,1 227,0,0 237,0,1 267,0,0 277,0,1 300,0,0 327,0,0 332,0,0 346,1,@8343 382,0,3 399,0,0 418,0,0 427,0,14 458,0,0 465,0,1 478,1,@6933 520,0,10 528,0,0 622,1,@8344 627,0,0 667,0,2 680,0,1 686,0,0 698,1,@11902 708,0,0 716,0,0 8342:D3,228|3b650c7303ff5524a80175728b088b510853ff7004ff7104ff31ff721cff7218ff7214ff7210ff720cff7208ff72048b02e83298feff8b4d008d49cc3b4d087303ff5520894d00c741fc080000008b54241889511c8b5424148951188b5424108951148b54240c8951108b54240889510c8b5424048951085a83c418eb05e95300000089510489018d4124c740fc030000008948088b4c24048948045983c4048908508b5c24088b4424049090e84effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c300000000e0000000|@6329,1048575,@734|50,1,@7801 215,0,0 8343:D3,132|3b650c7303ff5524a80175678b088b55008d52e83b55087303ff5520895500c742fc020000008b5904895a04c702050000008d720cc746fc02000000895604c70609000000568b500489d09090e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000080000000|@6329,31,@735|46,0,2 65,0,4 116,0,0 8344:D3,420|3b650c7303ff5524f6c301740783fb017d08eb1bf643ff107515f6c301740a81fbfdffff017c16eb06f643ff10750e89c1b834f67ab28b5d049090ff1389d9f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891f8b45008d40f43b45087303ff5520894500c740fc02000000c700f4647eb28978048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701b8667eb28979048061ffbf8b75008d76e43b75087303ff5520897500c746fc06000000c7069c677eb2578b7c2414897e04894608894e0c8b44240c8946108b4c2408894e148066ffbf525389f389d09090e8c695feff6a016a0168b83e86b2ff74240cbbb83e86b290e8f218000068b83e86b2ff74240cff74242cff742428ff742428bbb83e86b290e876270000ff7424248d4c240451ff742424ff7424248b5c24189090e81e4200008b5c24108b44240c909090e83ada07008b5c2404ba5c4186b29090e8a6dc07008b4c24205a83c4108911894104b801000000c210009000000000a0010000|@11901,2097151,@2186|33,0,16777214 50,0,@6401 81,0,0 151,0,@8345 188,0,@8351 225,0,@8353 270,1,@7801 279,0,@11886 288,0,@11886 294,1,@8379 299,0,@11886 320,0,@11886 326,1,@8397 354,1,@8426 370,1,@11888 379,0,@11892 386,1,@11893 404,0,0 8345:D3,192|833805740c89c1b8c8657eb28b5d04ff138b4804f6c101740783f9017d08eb20f641ff10751a8b5a048b1bf6c1017409f6c30174043bcbeb05ff5538ebf77c0d89c3b8f0ea7ab28b5d0490ff13f6c101740583c1027105ff5538ebf68b52048b4c4afef6c101752c8b018b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70001000000c389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c300000000bc000000|@8350,15,@736|8,0,@8346 67,0,@6373 143,0,0 179,0,1 8346:O4|@4608,@5398,@8348,@8347 8347:O5|@8349,246,0,246,0 8348:S33|6c6f6f6b7570436f6e7374616e743a20746f702d6c6576656c2072656163686564 8349:S68|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e532e736d6c 8350:S66|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296c6f6f6b757041646472283129 8351:D3,136|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b580489198b30f7c601000000740783fe017d08eb26f646ff1075208b7a048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b5204894c72feb801000000c30000000084000000|@8352,63,@737|85,0,@6397 123,0,0 8352:S64|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329636f6e746578742d283129 8353:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a0456e91f000000909090000000002c000000|@8357,2097151,@2176|33,1,@8354 8354:D3,1420|3b650c7303ff552483381d756b83780801746a8b4d008d49e43b4d087303ff5520894d00c741fc06000000c701806d7eb28959048b5424108951088b5c240c89590c8b7424088971108b7c24048979148061ffbf89cb8b4004e8ca0500008b4d008d49f03b4d087303ff5520894d00c741fc03000000eb0ae928010000e94a000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e806b1fdffeb6c89c8eb6d8b4d008d49e43b4d087303ff5520894d00c741fc06000000c701786e7eb28959048b5424108951088b5c240c89590c8b7424088971108b7c24048979148061ffbf89cb8b4004909090e8c20500008b4d008d49f03b4d087303ff5520894d00c741fc03000000eb0ae94d000000e948000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e84ab0fdffeb0289c889c18b45008d40f83b45087303ff5520894500c740fc010000008908c21000833815757353ff70088b4004e896050000ff742410ff742410ff74240cff742424ff742424bbc46d7eb29090e8260600008b4d008d49e43b4d087303ff5520894d00c741fc06000000c701443b86b28b5424048951048b5424188951088b5c241489590c8b7424108971108b7c240c8979148061ffbfeb05e97b0000005089cb8b442404e80690feff833c2401752289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc210008b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b0424894104c701150000008b45008d40f83b45087303ff5520894500c740fc01000000890883c40cc2100083380f75728b48048b5118f6c201740783fa017d08eb1bf642ff107515f6c201740a81fafdffff017c12eb06f642ff10750ab834f67ab28b5d04ff13f6c201740583c2027105ff5538ebf68b41188b711c8b7914ff7110ff7108ff7104ff31ff710c89d189c2b801000000578d7c0902f7df037d00eb05e9cd0100003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89178b45008d40e03b45087303ff5520894500c740fc01000040c700010000008d4808c741fc05000000c701883b86b2894104538b5c242c8959088b5c240889590c8979108061ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7035c3d86b2897b048063ffbf8b7d008d7fe43b7d087303ff5520897d00c747fc06000000c7073c3e86b2528b542404895704894f08895f0c8b4c2428894f108b5c2424895f148067ffbf565089fb8b442418909090e8428efeff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d18b55008d52d03b55087303ff5520895500c742fc080000005b895a1c8b1c24895a188b7424088972148b74241c897210894a0c8b7424188972088b74241489720489028d4224c740fc02000000895004c7000f00000083f9017536ff742404ff74242cff74242c909090e8320d000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c420c2100089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c420c2100083380975728b40048b5424109090ff1283380175398b4d008d49e83b4d087303ff5520894d00c741fc030000008b50088951088b5804895904c701050000008d4110c740fc010000008908c210008b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c701090000008b4500eb05e91a0000008d40f83b45087303ff5520894500c740fc010000008908c21000b801000000c210000000000088050000|@11885,2097151,@2175|45,0,@8355 90,1,@8358 133,0,1 142,0,14 173,0,0 180,0,1 194,1,@6933 230,0,@8359 278,1,@8360 321,0,0 330,0,14 361,0,0 368,0,1 382,1,@6933 434,1,@8361 459,0,@8356 466,1,@8363 496,0,@11879 554,1,@7801 633,0,10 705,0,16777214 720,0,@6401 772,0,0 850,0,0 866,0,@11880 921,0,@11882 958,0,@11884 1006,1,@7801 1014,0,0 1157,0,7 1182,1,@8371 1313,0,2 1364,0,4 1405,0,0 8355:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04bac46d7eb256ff2290000000002c000000|@8357,1048575,@738|32,0,@8356 8356:O1|@8354 8357:S50|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283129283129 8358:D3,92|3b650c7303ff5524a801754253ff70048b00909090e8f28bfeff508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,1048575,@739|22,1,@7801 79,0,0 8359:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04bac46d7eb256ff2290000000002c000000|@8357,1048575,@740|32,0,@8356 8360:D3,92|3b650c7303ff5524a801754253ff70048b00909090e83e8bfeff508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,1048575,@741|22,1,@7801 79,0,0 8361:D3,68|3b650c7303ff5524a8017529ff308b4004e8eaffffff508b4424049090e80208ffff833c2401750483c408c35b83c404e923000000b801000000c3900000000040000000|@6729,1048575,@743|30,1,@8005 49,1,@8362 54,0,0 8362:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@742| 8363:D3,1816|3b650c7303ff552483f8017508b801000000c214008b08833901756f8b55008d52e03b55087303ff5520895500c742fc07000000c70208777eb2895a048b74240c8972088b7c2408897a0c8b7424048972108b7c2414897a148b7424108972188062ffbf53ff7004ff710cff7108ff710489d38b4110909090e8ba89feff8b4d008d49e83b4d08730aeb05e974000000ff5520894d00c741fc050000008941108b44240889410c8b4424048941085883c408894104c7010100000051ff742420ff742420ff742420ff742420ff7424208b5c241c8b44241890e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c214008339077563f641040175628b5104837a0401755e8b328b7d008d7fe03b7d087303ff5520897d00c747fc020000008b4e08894f04c7070f0000008d570cc742fc04000000897a0c8b7e04897a088b3e897a04c70203000000ff70048b45008d40f43b45087314eb0fe977030000e947000000e942000000ff5520894500c740fc020000005f89780489108b5424148b7c24108b4c240c8b742408538b5c240889542418897c2414894c24108974240c895c24085be943feffff53ff7004ff74241cff74241cff74241cff74241cff74241c8b410490e89205000089c150f6c10175618b018b50088b5a0cf6c30175598b03833805755c8b1424f6c20175318b328b7804f7c7010000007509f64604017503ff55383b7e047507bf03000000eb148b720489f23b650c7303ff5524ebcabf0100000083ff0174198b5b043b650c730feb0ae932000000e90c000000ff5524eb98b801000000eb05b80300000083f80174108b49043b650c7303ff5524e96affffffb801000000eb05b80300000083f80174688b04249090e8ae0600008b4d008d49d83b4d087303ff5520894d00c741fc020000008b1424895104c701070000008d590cc743fc02000000c7430401000000890b8d4b0cc741fc03000000c7410801000000894104c7011d000000a80175248b30833e057516eb05e9840100008b700489f03b650c7303ff5524ebdfb801000000eb05b80300000083f801740b5389c890e8b2a6fdffeb0389c8538b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c701150000008b0424ba01000000a801752b8b18f6c201740df643040174073b53047d0aeb05ff5538ebf48b53048b580489d83b650c7303ff5524ebd189d0a801740583c0027105ff5538ebf6ff742418ff742424ff74242489c389c89090e8320600008b0c24ba0100000050f6c101756c8b01ff710452ff70046a0189d38b442410e85a77fdff833805740e89c1b82c3a86b28b5d049090ff138b4d008d49e83b4d087303ff5520894d00c741fc020000008b50088951048b580489198d410cc740fc020000008948045989088b54241cff1258a801740c83c002eb05e9170000007105ff5538ebef89c2593b650c7303ff5524e973ffffff89d08b44242483c4048b4c241c8b5424188b5c24148b74241089442420894c241c89542418895c2414897424108b5c240883c4045883c404e987fbffff8b45008d40f43b45087303ff5520894500c740fc020000008b0c24894804c7000700000050ff742424ff742424ff742424ff742424ff7424248b5c24208b44241c909090e83efbffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c40cc2140083390575738b55008d52e03b55087303ff5520895500c742fc07000000c702703a86b2895a048b74240c8972088b7c2408897a0c8b7424048972108b7c2414897a148b7424108972188062ffbf53ff700489d38b4104909090e8f284feff8b4d008d49f43b4d087303ff5520894d00c741fc02000000eb05e953000000894104c7010500000051ff742420ff742420ff742420ff742420ff7424208b5c241c8b4424189090e86efaffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c214008b55008d52e03b55087303ff5520895500c742fc07000000c702b43a86b2895a048b74240c8972088b7c2408897a0c8b7424048972108b7c2414897a148b7424108972188062ffbf53ff7004ff7108ff710489d38b410c9090e82284feff83380575708b4d008d49e83b4d087303ff5520894d00c741fc020000008b50088951048b580489198d410cc740fc020000008948048b4c240489088b542414909090ff128b4424248b4c24208b54241c8b5c24188b74241489442424894c24208954241c895c2418897424148b5c240c83c408eb05e9090000005883c404e967f9ffff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b4424048941088b0424894104c7010300000051ff742428ff742428ff742428ff742428ff7424288b5c24248b44242090e816f9ffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c410c214000000000014070000|@11878,2097151,@2170|14,0,0 54,0,@8364 122,1,@7801 183,0,0 314,0,7 344,0,1 474,1,@8365 542,0,1 564,0,0 599,0,0 606,0,1 632,0,0 639,0,1 654,1,@8370 690,0,3 707,0,0 726,0,0 735,0,14 773,0,0 780,0,1 794,1,@6933 836,0,10 844,0,0 930,1,@8371 938,0,0 966,1,@6843 978,0,@11873 1177,0,3 1287,0,@11876 1346,1,@7801 1386,0,2 1490,0,@11877 1554,1,@7801 1731,0,1 8364:D3,48|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff7214ff721889de8b5a088b4a0489ca56ff2290000000002c000000|@8357,1048575,@744| 8365:D3,300|3b650c7303ff5524a80175708b088b55008d52e03b55087303ff5520895500c742fc07000000c7028c787eb2895a048b74240c8972088b7c2408897a0c8b7424048972108b7c2414897a148b7424108972188062ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b7108897704c7070f000000eb05e99b00000053ff7004ff7104ff3189d389f8909090e83282feff83380f740e89c1b8d0787eb28b5d049090ff138b4d008d49f03b4d087303ff5520894d00c741fc030000008b40048941088b4424048941045883c404890151ff742420ff742420ff742420ff742420ff7424208b5c241c8b442418e80affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c214000000000028010000|@6329,1048575,@746|40,0,@8366 118,0,7 146,1,@7801 158,0,@8367 285,0,0 8366:D3,48|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff7214ff721889de8b5a088b4a0489ca56ff2290000000002c000000|@8357,1048575,@745| 8367:O4|@4608,@5398,@8369,@8368 8368:O5|@8349,174,0,174,0 8369:S24|70726f63657373456e7472793a206e6f74206c616d626461 8370:D3,132|3b650c7303ff5524a80175678b088b55008d52e83b55087303ff5520895500c742fc020000008b5904895a04c702050000008d720cc746fc02000000895604c70609000000568b500489d09090e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000080000000|@6329,31,@747|46,0,2 65,0,4 116,0,0 8371:D3,664|3b650c7303ff55248b4c240cf6c10175358b11813acce539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01756bb97c787cb2f6c10175358b11813acce539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01750c89c1b8287c7cb28b5d04ff138b0e8139cce539b2741689c2b854eb7ab28b5d04eb05e90d000000909090ff1383790801746aeb1e8b0e8139cce539b2740e89c2b854eb7ab28b5d049090ff138379080174628b54240cf6c20175358b3a813f24e639b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7a0489fa3b650c7303ff5524ebc6b90100000083f901751feb05e9460000005350bad47c7cb2e8f601feffb801000000eb3ce92e0000008b11813a24e639b2740d89c6b854eb7ab28b5d0490ff135350ff7208bad47c7cb29090e8c201feff5a90ff12eb0989c2b80100000053526a016a0168607c7eb2ff742410bb607c7eb28b4424109090e8fe01000068607c7eb2ff742410ff742424ff742424ff742424bb607c7eb290e882100000ff74241c8d4c240451ff742420ff7424208b5c241c9090e82a2b0000ff7504b8e67b7eb250896504b8010000008b54240890ff1289c18b45008d40f03b45087303ff5520894500c740fc030000008b54240c895008894804c7000500000083c40459894d0483c410c20c00908b650483c4045b895d04833803750c89c1b8a43986b28b5d04ff138b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000894804c7001700000083c410c20c0090900000000094020000|@11872,2097151,@2167|21,0,@4670 71,0,0 81,0,@7313 94,0,@4670 144,0,0 156,0,@7368 169,0,@4670 178,0,@6377 209,0,@4670 218,0,@6377 248,0,@4681 298,0,0 317,0,@7375 322,1,@7377 327,0,0 342,0,@4681 351,0,@6377 367,0,@7375 374,1,@7377 387,0,0 398,0,@8372 407,0,@8372 418,1,@8379 423,0,@8372 444,0,@8372 450,1,@8397 478,1,@8426 486,0,$8371+562 495,0,0 544,0,2 580,0,@11869 616,0,0 625,0,2 644,0,11 8372:O1|@8373 8373:D3,24|b8947c7eb28b5d04909090ff139090900000000014000000|@8378,1,@748|1,0,@8374 8374:O4|@4608,@5398,@8376,@8375 8375:O5|@8377,473,0,473,0 8376:S17|546f70206c6576656c2072656163686564 8377:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4c414d4244415f4c4946542e736d6c 8378:S49|434f4445545245455f4c414d4244415f4c49465428292e636f646547656e6572617465283329746f706c6576656c283129 8379:D3,248|3b650c7303ff5524837c24040174598b4c2404f6c101740783f9017d08eb1ef641ff1075185053bb14a57db289c89090ff1568d7520883f801740eeb025053b828a77db28b5d04ff138b44240ca801740583c03e7105ff5538ebf6bb41000000ff15e8c75208eb0989c1b803000000515389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b45008d40e83b45087303ff5520894500c740fc050000009090c700647e7eb2598948048b4c240c8948088b54240889500c8978108060ffbf89c3585e83c40856e9cf7bfeff90909000000000f4000000|@8396,2097151,@758|40,0,@8059 50,0,I233 64,0,@8063 92,0,32 98,0,I109 107,0,1 116,0,0 195,0,@8380 233,1,@7801 8380:D3,792|3b650c7303ff5524833815756a52ff700489d38b4008909090e8927bfeff8b4c240450ff7104ff7108ff710cff7110ba90817eb25289cb8b4424189090e8f20200008b4d008d49e83b4d087303ff5520894d00c741fc030000005a83c408895108894104c701150000008d4110c740fc010000008908c383380f75708b48048b5d008d5bec3b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc02000000c706b8897eb2895e048066ffbf8b7d008d7fe43b7d087303ff5520897d00c747fc06000000c707e4897eb28b42048947048b42088947088b421089470c8b420c894710eb05e9ab0000008b410c8947148067ffbfff711cff7118ff711050ff71045356ff74241489fb8b01ba90817eb290ff128b0c248b0983f9017507b901000000eb05b9cc777ab28b55008d52c83b55087303ff5520895500c742fc080000008b5c241483c404895a1c8b5c240c895a18c74214030000008b5c2408895a108b5c2404895a0c894a085983c410894a0489028d4224c740fc02000000895004c7000f00000089c18d400cc740fc010000008908c3833807755b8b4808833909754dff700c5189d38b4004909090e8ea0a00008b4d008d49e43b4d087303ff5520894d00c741fc040000008b54240489510c5a83c404895108894104c701070000008d4114c740fc010000008908c3b801000000c383380975518b4804833901744e833903750e508b41048b5204909090ff12eb6b833907750f50b8010000008b52089090ff12eb5c8b5904f6c301740783fb017d08eb29f643ff107523f6c3017419f6420c017413eb0ae9b1000000e98f0000003b5a0c7c14eb05ff5538ebf489c6b870a97db28b5d0490ff13506a016a01528d74240456bb11000000eb0ae960000000e95b0000008b4104ff1548c752088b04248b4c24048b5010d1e90fb60c0a8d4c090189cb8b4c2408be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bde83c4045983c404d1e9d1eb881c0a8d5c1b018d4c0901eb01508b45008d40f83b45087303ff5520894500c740fc01000000598908c3b801000000c390900000000014030000|@8395,2097151,@757|26,1,@7801 48,0,@8381 62,1,@8382 102,0,10 153,0,0 169,0,@8392 206,0,@8393 275,0,@8381 293,0,0 300,0,@5384 348,0,1 393,0,7 438,1,@8394 485,0,3 503,0,0 547,0,0 619,0,@8067 641,0,8 662,0,I104 693,0,1 706,0,31 777,0,0 8381:O1|@8379 8382:D3,740|3b650c7303ff5524a801756d8b08833901756bff710cff710853ff7110ff742424ff742424ff742424ff742424ff7424248b480489c8909090e8c2ffffff508b5c24088b4424049090e82e78feff8b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44241089410c8b44240c894108eb0ae953020000e931000000c7410401000000c701010000008b45008d40f43b45087303ff5520894500c740fc020000005a83c4108950048908c21400833905756c53ff7104ff74241cff74241cff74241cff74241cff74241c8b480489c8909090e822ffffff508b5c24088b4424049090e88e77feff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc020000005a83c4088950048908c214008339077571ff7104ff742418ff742418ff742418ff742418ff7424188b480489c8909090e8b2feffff50ff742418ff742418ff742418ff7424188b5c242c8b4424149090e88a010000ff7424108b5c2418909090e8f60400008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104eb05e91c000000c701070000008d410cc740fc020000005a83c4048950048908c2140053ff7108ff710cff742420ff742420ff742420ff742420ff7424208b480489c890e81efeffff508b5c240c8b4424049090e88a76feff8b4c2408f6c101740783f9017d08eb1ff641ff107519f6c101740ff644241c0174083b4c241c7c13eb05ff5538ebf389c2b844897eb28b5d04ff136a016a01508d54240452bb1100000089c89090ff1548c752088b4424048b4c2424d1e80fb604018d4400018b4c2408ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f8017507b801000000eb05b8cc777ab28b4d008d49e03b4d087303ff5520894d00c741fc040000005a83c40889510c8b542408895108894104c701030000008d4114c740fc020000005a83c40c8950048908c21400b801000000c2140090909000000000e0020000|@8391,2097151,@753|74,1,@7801 134,0,0 140,0,0 234,1,@7801 267,0,2 362,1,@8383 378,1,@8388 418,0,3 494,1,@7801 548,0,@8389 568,0,8 578,0,I104 605,0,1 618,0,31 641,0,0 648,0,@5384 695,0,1 722,0,0 8383:D3,388|3b650c7303ff5524a80175708b088b51088b75008d76ec3b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc02000000c70728867eb28977048067ffbf538b5d008d5be43b5d087303ff5520895d00c743fc06000000c703a0867eb2ff70048b4424048943048b4424188943088b442410eb05e9f300000089430c8b4424148943108b420c8943148063ffbfff7104ff721cff7218ff721050ff72045657ff7424148b028b542430909090ff128b0c248b0983f9017507b901000000eb05b9cc777ab28b55008d52cc3b55087303ff5520895500c742fc080000008b5c241483c404895a1c8b5c240c895a18c74214030000008b5c2408895a108b5c2404895a0c894a085983c410894a0489028d4224c740fc0300000089500859894804c7000100000050ff74241cff74241cff74241cff74241c8b5c24188b442414909090e8b2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21000b801000000c210000000000080010000|@6329,1048575,@751|43,0,0 59,0,@8384 97,0,@8386 193,0,0 200,0,@5384 248,0,1 297,0,0 373,0,0 8384:D3,24|8b5204c70203000000b801000000c3900000000014000000|@8385,5,@749|5,0,1 10,0,0 8385:S66|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f526563757273697665283129 8386:D3,272|3b650c7303ff55248b4a14f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca8339017506b801000000c383390375088b41048b5204ff22833907750ab8010000008b5208ff228b4104a801740783f8017d08eb1cf640ff107516a801740df642100174073b42107c12eb05ff5538ebf4b870a97db28b5d0490ff136a016a01528d5c240453bb11000000ff1548c752088b04248b4c24048b500cd1e90fb60c0a8d4c090189cb8b4c2408be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bde83c4045983c404d1e9d1eb881c0a8d5c1b018d4c0901b801000000c390000000000c010000|@8387,2097151,@750|19,0,@5417 71,0,0 95,0,0 147,0,@8067 168,0,8 174,0,I104 205,0,1 218,0,31 258,0,0 8387:S64|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f436c6f73757265283129 8388:D3,292|3b650c7303ff5524a80175728b088b5104f6c201740783fa017d08eb1bf642ff107515f6c2017409f6c30174043bd3eb05ff5538ebf77c0d8b7004b844897eb28b5d04ff136a016a0153ff7004ff7108528d74241056bb1100000089d0909090ff1548c752088b4424108b4c241cd1e80fb604018d4400018b4c2414eb05e991000000ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f8017507b801000000eb05b8cc777ab28b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424048951085a83c404895104890151ff7424188b5c240c8b44240890e812ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c20400b801000000c204000000000020010000|@6329,2097151,@752|60,0,@8389 87,0,8 98,0,I104 132,0,1 145,0,31 168,0,0 175,0,@5384 277,0,0 8389:O4|11,@4879,0,@8390 8390:O5|@8051,411,0,411,0 8391:S61|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f646528312970726f6365737344656373283129 8392:D3,24|8b5204c70203000000b801000000c3900000000014000000|@8385,5,@754|5,0,1 10,0,0 8393:D3,272|3b650c7303ff55248b4a14f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca8339017506b801000000c383390375088b41048b5204ff22833907750ab8010000008b5208ff228b4104a801740783f8017d08eb1cf640ff107516a801740df642100174073b42107c12eb05ff5538ebf4b870a97db28b5d0490ff136a016a01528d5c240453bb11000000ff1548c752088b04248b4c24048b500cd1e90fb60c0a8d4c090189cb8b4c2408be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bde83c4045983c404d1e9d1eb881c0a8d5c1b018d4c0901b801000000c390000000000c010000|@8387,2097151,@755|19,0,@5417 71,0,0 95,0,0 147,0,@8067 168,0,8 174,0,I104 205,0,1 218,0,31 258,0,0 8394:D3,124|3b650c7303ff5524a80175628b0853ff7004ff71048b019090e8ee6efeff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901518b5c24088b442404e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000078000000|@6329,1048575,@756|26,1,@7801 111,0,0 8395:S47|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f6465283129 8396:S35|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429 8397:D3,224|3b650c7303ff55248b4c2410f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c16eb06f641ff10750e89c2b834f67ab28b5d049090ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44241089078b4d008d49e03b4d087303ff5520894d00c741fc07000000c701f08c7eb28959048b5c241489590889790c8b7424088971108b7c24048979148b44240c8941188061ffbf89cb89d05983c41451e9436dfeff90909000000000dc000000|@11868,1048575,@2166|37,0,16777214 54,0,@6401 83,0,0 157,0,@8398 209,1,@7801 8398:D3,912|3b650c7303ff5524833815756e52ff7008ff7204ff7208ff720cb994907eb251ff7210ff7214ff721889d38b4004909090e876030000508b5c24088b4424049090e8de6cfeff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085883c408894104c701150000008b45008d40f83b4508730aeb05e910000000ff5520894500c740fc010000008908c383380f75678b4804ff7108ff710cff7110ff7114ff7118ff711cff7204ff7208ff720cbb94907eb253ff7210ff7214ff72188b59048b019090e83ea407008b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7010f0000008d410cc740fc010000008908c383380975756a016a01ff7204ff7208ff720c8d5c240c8b4004e8be0c00008b04248338037507837c240401740cb8ec3586b28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b400483c408894104c701090000008b45008d40f83b45087303ff5520894500c740fc01000000eb05e9030000008908c383380775688b480883390f75658b5904837b080175618b75008d76f43b75087303ff5520897500c746fc02000000c7460401000000891e8b780cff70048b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089305257ff7208ff720cbe94907eb2eb0fe990010000e99f000000e99400000056ff7210ff7214ff72188b5a049090e8ca070000a801740f89c1b81c777bb28b5d04909090ff138b08ff31ff71048b5c240c8b44241090e81aa7070089c658e8a2a7070083f801740d89c389f09090e826a8070089c68b45008d40e43b45087303ff5520894500c740fc040000008b4c240489480c5983c40c894808897004c7000700000089c18d4014c740fc010000008908c3b801000000c383390975616a016a0152ff700cff7004ff7204ff7208ff720c8d5c24188b410490e81e0b00006a016a018b44241483380375388b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c7010900000089e0890889e08b4c2418894804eb15e97b00000089e18b4004890189e08b4c24188948048b5c24108b4424089090e8aea7070089c68b44240490e832a8070083f801740d89c389f09090e8b6a8070089c68b45008d40e43b45087303ff5520894500c740fc040000008b4c240c89480c5983c418894808897004c7000700000089c18d4014c740fc010000008908c3b801000000c3b801000000c39090000000008c030000|@11867,2097151,@2165|27,0,@8399 50,1,@8400 66,1,@7801 106,0,10 180,0,@8399 202,1,@11849 235,0,7 278,1,@8405 298,0,@11858 344,0,4 431,0,0 470,0,0 485,0,@8399 522,1,@8402 533,0,@6704 562,1,@11861 570,1,@11862 586,1,@11863 635,0,3 655,0,0 694,1,@8405 743,0,4 794,1,@11864 806,1,@11865 822,1,@11866 871,0,3 891,0,0 897,0,0 8399:O1|@8397 8400:D3,1416|3b650c7303ff5524a801756b8b08833901756953ff7004ff710cff71088b411090e85269feff8b4d008d49e83b4d087303ff5520894d00c741fc050000008941108b44240489410c5883c404894108c7410401000000c7010100000051ff742428ff742428ff742428ff742428ff742428ff742428eb0ae9fc040000e937000000ff7424288b5c24248b442420e86effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21c00833905757553ff70048b410490e8ae68feff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010500000051ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b44242090e8eafeffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e90c0000008948045983c4088908c21c00833907756c8b5104be0300000053f6c201753e8b1a833b0175238b7b08837f0801751383fe037407be01000000eb13be03000000eb0cbe01000000eb05be010000008b5a0489da3b650c7303ff5524ebbd89f283fa01746cff7004ff71048b042490e8f2030000ff742424ff742424eb05e9ca010000ff742424ff742424ff742424ff7424248b5c2440e85a0400005983f801751183f901746bb8e43086b28b5d049090ff13f6c101740f8b50048b18b8e43086b28b5d04ff138b118b5d008d5bf8eb05e9db0000003b5d087303ff5520895d00c743fc010000008b3089338b7a04f7c701000000740783ff017d08eb2ef647ff1075288b74241c8b36f7c701000000eb05e953000000740cf7c60100000074043bfeeb05ff5538ebf77c0f8b7004b8b0f57ab28b5d049090ff13f7c701000000740583c7027105ff5538ebf68b74241c895c7efe8b510489d18b40043b650c7303ff5524e933ffffff8b4424248b4c24208b54241c8b5c24188b7424148b7c2410578b7c241089442428894c242489542420895c241c897424185889442410897c240c8b5c24045883c404e919fdffffff7004ff742420ff742420ff742420ff742420ff742420ff7424208b5c243c8b4104e8669d07008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010700000051ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b44242090e8a6fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c404890883c404c21c008379040175668b510c833a0f75638b7204837e0801755f8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b710889378b75008d76e83b75087303ff5520897500c746fc02000000897e048b520489168b50048d460cc740fc02000000c74004010000008930eb0fe9f5000000e9f0000000e9eb0000005352ff7108ff742424ff742424ff742424ff742424ff742424ff7424248b5c24409090e806020000a801740f89c1b81c777bb28b5d04909090ff138b4d008d49f83b4d087303ff5520894d00c741fc010000008b0089018b0424a801740783f8017d08eb20f640ff10751a8b5424208b12a8017409f6c20174043bc2eb05ff5538ebf77c0ab8b0f57ab28b5d04ff13a801740583c0027105ff5538ebf68b54242083c404894c42fe8b4424248b4c24208b5c24188b7424148b7c2410578b7c241089442428894c242489542420895c241c897424185889442410897c240c8b5c24045883c404e917fbffff53ff7004ff71088b410c9090e87e64feff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c58894108c7410401000000c7010300000051ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b4424209090e8aefaffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c000000000084050000|@11857,2097151,@2158|34,1,@7801 82,0,0 88,0,0 198,1,@7801 231,0,2 332,0,1 364,0,0 371,0,1 378,0,0 385,0,0 422,1,@8401 462,1,@8402 478,0,@11846 500,0,@11846 614,0,@6397 778,1,@11848 811,0,3 999,0,0 1058,1,@8402 1069,0,@6704 1156,0,@6397 1270,1,@7801 1308,0,0 1314,0,1 1401,0,0 8401:D3,124|3b650c7303ff5524a801755f8b088b55008d52ec3b55087303ff5520895500c742fc010000008b5904891a8d7208c746fc020000008956048b51088916568b780489f89090e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000078000000|@6329,63,@759|108,0,0 8402:D3,860|3b650c7303ff55248b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000089c689cf5389f0e83e03000089f1565750f6c10175698b018b108b5a0cff7104f6c301755f8b03833805753e8b4c2404f6c101752b8b11f6c2017509f64004017503ff55383b50047507be03000000eb148b510489d13b650c7303ff5524ebd0be0100000083fe0175656a016a01ff7304ff74241cff74243cff74243ceb0ae988000000e9750000008d5c24109090e8460300008b44240483380174378b5c24148b4004909090e8fe5ffdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb07e91200000089c18b5c24148b44240890e89e040000eb076a016a01ff73045b83c4083b650c7303ff5524e922ffffff593b650c7303ff5524e905ffffffb8010000008b4424048b00b901000000a80175328b108b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b89d98b500489d03b650c7303ff5524ebca89c889c389d8909090e892040000b90100000089daf6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf53ff742404ff742414ff742434ff742434ff742418ff742438ff742438ff742438ff7424385089cb8b442434909090e89604000089c68b44240c90e8020d000089c789f8909090e86a0d00008b4d008d49d83b4d087303ff5520894d00c741fc02000000897104c701070000008d510cc742fc02000000c7420401000000890a8d4a0cc741fc03000000c7410801000000894104c7011d000000a801751d8b18833b05750f8b580489d83b650c7303ff5524ebe6b801000000eb05b80300000083f801740d575289c89090e86680fdffeb0489c857528b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c7011500000058ba01000000a8017524f6c201740bf6000174063b107d09eb05ff5538ebf58b108b40043b650c7303ff5524ebd889d0a801740583c0027105ff5538ebf66a016a01ff7424208d54240452ff742430ff74243089c389c890e8f20c0000b8010000005aff128b4d008d49f03b4d087303ff5520894d00c741fc030000005a895108894104c70105000000894c242c5883c4088944241cbb010000005883c4045983c41051e99295070090900000000058030000|@11845,2097151,@2152|34,0,0 46,1,@8403 113,0,1 135,0,0 182,1,@8405 206,1,@6874 239,0,1 262,1,@8407 307,0,0 318,0,0 386,1,@8408 391,0,0 478,1,@8409 490,1,@8424 502,1,@8425 535,0,3 552,0,0 571,0,0 580,0,14 611,0,0 618,0,1 634,1,@6933 677,0,10 683,0,0 770,1,@8426 775,0,0 815,0,2 832,0,0 846,1,@11843 8403:D3,96|3b650c7303ff5524a80175438b0883790401750a8b480489c8e9e2ffffff8b5104ff328b580489d890e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@8404,15,@760|80,0,0 8404:S20|4c6973742e6d61705061727469616c2832292829 8405:D3,344|3b650c7303ff552483380175328b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000890bc7430401000000b801000000c20c008338037522538b40048b542410ff128b0c248b1089118b5804895904b80100000083c404c20c00833807752653b8010000008b54240c909090ff128b0c24c7011c407db2894104b80100000083c404c20c008b4804f6c101740783f9017d08eb21f641ff10751b8b5424048b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0c89c2b8f0ea7ab28b5d04ff13f6c101740583c1027105ff5538ebf68b5424048b4c4afe83f90175328b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000890bc7430401000000b801000000c20c008b018b75008d76f43b75087303ff5520897500c746fc020000008b38897e04c7060100000089338b7004897304b801000000c20c000000000054010000|@8406,1048575,@761|42,0,1 51,0,0 56,0,0 92,0,0 109,0,0 127,0,@7918 135,0,0 196,0,@6373 262,0,1 271,0,0 276,0,0 316,0,0 329,0,0 8406:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352966696e6442696e64696e67283129 8407:D3,92|3b650c7303ff5524a801754253ff70048b00909090e80e5bfdff508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,63,@762|22,1,@6874 79,0,0 8408:D3,76|3b650c7303ff5524a80175308b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948049090c700e4707ab2c3b801000000c390900000000048000000|@6329,3,@763|55,0,@5280 61,0,0 8409:D3,188|3b650c7303ff5524a801756d8b0853ff700453ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b59048b0190e88a00000050ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24308b44242ceb05e92e000000909090e87affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22800b801000000c2280000000000b8000000|@6329,1048575,@771|66,1,@8410 173,0,0 8410:D3,500|3b650c7303ff5524b9010000008b5010f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf516818a07eb253ff701cff7018ff7004ff7010ff30ff700c518d5c24208b442454909090e89e99fcff8b4d008d49cc3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc0a000000c702c8a07eb2894204894a085b895a0c8b5c243c895a108b7424488972148b7c2444897a188b5c2440895a1c8b74244c8972205f897a248062ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c70794a47eb28947048067ffbf5157ff742414ff742434ff742440ff74244089d38b4424188b54244c9090ff125983c4048b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d1837c24200175058b1424eb1689ce89c78b5c24208b0424e89e05000089c289f189f88b5d008d5bdc3b5d087303ff5520895d00c743fc080000008b74240c83c40489731c8b742404897318c7431403000000895310894b0cc74308010000005983c408894b048903833c24017507b801000000eb058b04248b0089c18b45008d40f03b45087303ff5520894500c740fc03000000895808894804c7000100000083c40cc22c0000000000f0010000|@8423,1048575,@770|9,0,0 51,0,@8411 86,1,@6547 116,0,0 132,0,@8413 215,0,@8420 265,0,0 350,1,@8422 404,0,1 417,0,0 437,0,0 482,0,0 8411:D3,68|a801740ef642040174088d40ff0342047105ff5538ebf389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3900000000040000000|@8412,7,@764|54,0,0 8412:S80|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563417267732d283129 8413:D3,512|3b650c7303ff55248b4a24f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca833905756b8b4220a801752b8b18f6c3017509f64104017503ff55383b59047507be03000000eb148b580489d83b650c7303ff5524ebd1be0100000083fe01745b528b5a0889c890e84256fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb05e9270000008b04248b50048b45008d40f43b45087303ff5520894500c740fc02000000895004890883c404c36a016a0152ff7214ff7218ff721c8d5c241089c8e80af9ffff8b44240483380174328b0c248b59108b400490e8c255fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb0289c18b0424518b58108b44240c909090e8ce0000008b0c24833901746f8b5104833a03740f89c3b84ca37eb28b5d04909090ff138b5c24048b7204f7c601000000740ef6430c0174088d76ff03730c7105ff5538ebf38b7d008d7fe83b7d087303ff5520897d00c747fc02000000897704c707010000008d770cc746fc02000000897e04c70603000000eb0289ce8b4c240483c40489f78b590c83c40c909090e8ea00000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048938c3909000000000fc010000|@8419,1048575,@767|19,0,@5417 99,0,1 121,0,0 138,1,@6874 171,0,1 242,1,@8405 266,1,@6874 299,0,1 322,1,@8414 345,0,@8415 420,0,0 439,0,1 466,1,@8418 8414:D3,92|3b650c7303ff5524a801754253ff70048b00909090e8a254fdff508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,63,@765|22,1,@6874 79,0,0 8415:O4|@4608,@5398,@8417,@8416 8416:O5|@8377,415,0,415,0 8417:S8|6d6170546f417267 8418:D3,156|3b650c7303ff5524a80175768b08833903740e8b5004b84ca37eb28b5d0490ff138b5104f6c201740cf6c30174078d52ff03d37105ff5538ebf48b75008d76f43b75087303ff5520897500c746fc02000000895604c70601000000568b480489c8e89affffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e907000000894804598908c3b801000000c30000000098000000|@6329,31,@766|23,0,@8415 87,0,0 143,0,0 8419:S82|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229636c6f73757265526566283129 8420:D3,12|8b4204c30000000008000000|@8421,5,@768| 8421:S84|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563757273697665526566283129 8422:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@769| 8423:S69|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229 8424:D3,96|3b650c7303ff5524a80175438b08837904017507ba01000000eb078b51048b1a89da528b480489c890e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,15,@772|21,0,0 80,0,0 8425:D3,128|3b650c7303ff5524a80175638b4d008d49e83b4d087303ff5520894d00c741fc020000008b10895104c701050000008d590cc743fc02000000894b04c70309000000538b480489c890e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000007c000000|@6329,15,@773|43,0,2 62,0,4 112,0,0 8426:D3,548|3b650c7303ff55246a016a016a0189e151ff742418ff742418e81a0200008b45008d40f83b45087303ff5520894500c740fc01000040c70001000000c70001000000ff74240489c38b44240490e8425a00008b4c241cf6c10175358b11813acce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01756db97c787cb2f6c10175358b11813acce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750e89c1b8287c7cb28b5d049090ff138b0b8139cce539b2741689c2b854eb7ab28b5d04eb05e90d000000909090ff1383790801746aeb1e8b0b8139cce539b2740e89c2b854eb7ab28b5d049090ff138379080174628b54241cf6c20175358b32813e24e639b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01751feb05e94600000050ba4c567fb290e812ae0000b801000000eb3be92e0000008b17813a24e639b2740d89c6b854eb7ab28b5d0490ff1350ff7208ba4c567fb2909090e8dead00005a90ff12eb0889c2b80100000052ff7424088b5c24248b44240490e832ea00008378040175068b4c240ceb148b308b58048b44240c9090e85a86070089c1eb028b308b44241c83c4108930894804b801000000c210000000000020020000|@11842,2097151,@2150|26,1,@8427 56,0,0 62,0,0 78,1,@8551 95,0,@4670 145,0,0 155,0,@7313 168,0,@4670 218,0,0 230,0,@7368 245,0,@4670 254,0,@6377 285,0,@4670 294,0,@6377 324,0,@4681 374,0,0 392,0,@8673 398,1,@8675 403,0,0 418,0,@4681 427,0,@6377 442,0,@8673 450,1,@8675 463,0,0 482,1,@8757 510,1,@11841 533,0,0 8427:D3,112|3b650c7303ff55248b4d008d49f83b4d087303ff5520894d00c741fc01000040c701010000006a016a0151687ca97eb253516898aa7eb28d54241452ff742428ff742428bb10ab7eb2e8fe010000588b008b4c24145a891189410458894108b801000000c20c0090000000006c000000|@8550,2097151,@824|34,0,0 44,0,@8428 51,0,@8435 69,0,@8438 74,1,@8440 96,0,0 8428:O1|@8429 8429:D3,24|b8b0a97eb28b5d04909090ff139090900000000014000000|@8434,1,@774|1,0,@8430 8430:O4|@4608,@5398,@8432,@8431 8431:O5|@8433,1431,0,1431,0 8432:S31|6f75746572206c6576656c207265616368656420696e20636f7079436f6465 8433:S63|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f5354415449435f4c494e4b5f414e445f43415345532e736d6c 8434:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229746f704c6576656c283129 8435:O1|@8436 8436:D3,16|b801000000c39090000000000c000000|@8437,1,@775|1,0,0 8437:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836292d45 8438:O1|@8439 8439:D3,24|b8b0a97eb28b5d04909090ff139090900000000014000000|@8437,1,@776|1,0,@8430 8440:D3,856|8d7c24a43b7d0c7303ff55288b4c2418f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c16eb06f641ff10750e89c2b834f67ab28b5d049090ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b4424188907a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c15eb06f640ff10750db834f67ab28b5d04909090ff13a801740583c0027105ff5538ebf689c1b80100000089fe8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b4424188907a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c14eb06f640ff10750cb834f67ab28b5d049090ff13a801740583c0027105ff5538ebf689c1b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44241c8907833a057547ff720853ff742428ff7424205657b9b0ae7eb251ff742424ff742420ff74243c8b5c243489d0bab8ae7eb29090e8e60100008b4c2414890158894104b80100000083c404c21c00833a15755e57ff720853ff74242cff7424245657b9b0ae7eb251ff742428ff742424ff7424408b5c243889d0bab8ae7eb290e89a01000050ff7424148b5c240c8b4424089090e81a5100008b4c241c5a83c4088911894104b80100000083c404c21c00833a0f75718b4a046a016a016a016a015653ff7108ff710cff7110ff7114ff7118ff711c8d5c242053ff74241cff742458ff7424505657bbb0ae7eb253ff742458ff7424588b59048b0190e82e0e00006a03ff742404ff742440ff742438ff742414ff74242c8b5c24248b44242090e84e190000eb05e96d000000f6442414017407b901000000eb488b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c010000008b542414895108c741048b0000008b542420891189cb8d4914c741fc02000000c741040100000089198b54242883c4188902894a04b80100000083c404c21c0053ff742424ff74241c5657b9b0ae7eb251ff742420ff74241cff7424388b5c243089d0bab8ae7eb2909090e8560000008b4c24108901c7410401000000b80100000083c404c21c0090900000000054030000|@8549,2097151,@823|41,0,16777214 58,0,@6401 87,0,0 158,0,16777214 173,0,@6401 202,0,0 275,0,16777214 290,0,@6401 318,0,0 387,0,@8441 411,0,@8442 418,1,@8444 433,0,0 464,0,@8441 488,0,@8442 494,1,@8444 514,1,@8545 532,0,0 598,0,@8441 618,1,@8446 654,1,@8475 673,0,0 706,0,0 720,0,69 745,0,0 764,0,0 786,0,@8441 810,0,@8442 818,1,@8444 831,0,0 836,0,0 8441:O1|@8440 8442:O2|@8444,@8443 8443:O2|@8527,@8442 8444:D3,3088|8d7c24a03b7d0c7303ff55288b08beeaae7eb28d748efcffe690e95b050000909090e918060000909090e951060000909090e95b000000909090e96e060000909090e9ad060000909090e93c070000909090e994070000909090e91a080000909090e91a080000909090e969080000909090e9d8090000909090e9280a0000909090e9c30a0000909090e9230b00009090908b480883390f7571ff700c53ff710453ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489d38b480489c8e8520b00008b0c246a016a016a016a0150ff7108ff710cff7110ff7114ff7118ff711c8d54241c52ff742460ff742460ff742460ff742460ff742460eb05e972000000ff742460ff74244cff7424648b59048b01e8ea0b0000ff74240cff742448ff742448ff742448ff742448ff74243c8b5c24208b44241c909090e80617000089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54241c89500c8948085983c41c894804c7000b000000c2240083390575668b7108ff700c53f7c60100000075368b1e8b3b3b7c2414751e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b368933eb13ff76045e3b650c7303ff5524ebc2bb01000000f6c30175248b338b3e3b7c24147415ff7004b854eb7ab28b5d04eb05e99700000090ff138b5e08eb05bb01000000ff7108ff710453ff742438ff742438ff742438ff742438ff742438ff742438ff742424ff74243cff74243c52ff7424408b5804b8010000009090e8fe1900008b4d008d49dc3b4d087303ff5520894d00c741fc030000008b5424048951085a83c408895104c7010700000089c28d4110c740fc040000005b89580c894808895004c7000b000000c22400833909756c8b7104833e077569ff700cff742428ff742428ff742428ff742428ff74241c5253ff742434ff742434ff742434ff7424308b5804b8010000009090e8261d000050ff74242cff74242cff74242cff74242cff742420bb01000000b8c4777ab2e82a1700008b4d008d49e0eb0ae9d8010000e93f0000003b4d087303ff5520894d00c741fc02000000894104c7010d0000008d410cc740fc040000008b54240489500c8948085983c404894804c7000b000000c22400833e0375286a016a01ff700c5352ff7004568d7c241457bb010000008b46048b5424449090ff128b442418eb66833e077466833e0174668b7e04f7c701000000740783ff017d08eb26f647ff1075208b7c24148b3ff7c701000000740df646040174073b7e047f1eeb05ff5538ebf48b780c6a016a01575352ff7004b8f0ea7ab28b5d04ff138b7604f7c6010000007416eb0fe955000000e93b000000e92200000083c6027105ff5538ebf68b7c24148b7477fe6a016a01ff700c5352ff700489f0eb268b780c6a016a01575352ff7004b801000000eb128b780c6a016a01575352ff7004b801000000ff710450ff742444ff742444ff742444ff742444ff742444ff742444ff742428ff742448ff742448ff742430ff74244c8b5c2434b801000000909090e8821d000050ff742444ff742444ff742444ff742444ff742438bb010000008b44241890e88a1500008b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c7010d0000008d410cc740fc040000008b54241489500c8948085983c41c894804c7000b000000c22400ff700c53525153ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff74243889d38b40049090e83e20000050ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24308b4424288b54242c9090e8bafaffff89c18b45008d40ec3b45087303ff5520894500c740fc040000008b54241089500c8948085983c410894804c7000b000000c224005352ff7008ff7004ff742428ff74241cff74242c8b5c24208b442410909090e89a20000050ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24348b4424288b5424309090e82afaffff50ff742410ff742418ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff7424448b5c24308b4424389090e84222000089c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c414894804c70001000000c22400ff700c53ff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b58088b480489c88b52049090ff125983c42451e9e02200008b48088b50048b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70007000000c22400ff742424ff742424ff742424ff742424ff742418bb030000008b4004e84e13000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000d000000c224005352ff7004ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b400890e8daf8ffff50ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24308b4424288b54242c9090e8a2f8ffff89c18b45008d40f03b45087303ff5520894500c740fc030000005a83c40c895008894804c70011000000c2240052ff7008ff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b4004909090e842f8ffff89c18b45008d40f03b45087303ff5520894500c740fc030000005a83c404895008894804c7000f000000c224008b48046a016a016a016a01ff7108ff710cff7110ff7114ff7118ff711c8d54241852ff742450ff742450ff742450ff742450ff742450ff74245053ff7424548b59048b019090e8da0400008b4424348b4c24308b54242c8b5c24288b742418bf03000000897c243489442430894c242c89542428895c2424897424208b5c24045883c40c5f83c40c57e9db0f0000b8f4de7eb2c2240053ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff74242889d38b40049090e87a27000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70017000000c224008b4d008d49e83b4d087303ff5520894d00c741fc020000008b7008897104c701050000008d790cc747fc02000000c7470401000000890f83ff0175078b480489c8eb11535289fb8b480489c890e8ee270000eb025352ff742420ff742414ff742424ff74240cff742414ff742440ff742440ff742440ff742438ff7424388b5c2434909090e80e2800006a016a01b901000000a801740e89c2b8e0f17eb28b5d049090ff1383780401755a8b10833a03740bb834f27eb28b5d0490ff13bb01000000f6c101752e8b75008d76f43b75087303ff5520897500c746fc02000000895e048b19891e89f38b49043b650c7303ff5524ebcd89d989e3890b89e18b5a04895904eb318b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524e95dffffff833c2401750a83c4045883c408c224008b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c7001900000083c410c2240052ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b40049090e882f5ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7001b00000083c404c224005352ff7008ff7004ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b400c909090e822f5ffff50ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24348b4424288b5424309090e8eaf4ffff89c18b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c5a83c408895008894804c7001d000000c2240052ff700cff7004ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b400890e882f4ffff89c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c408894804c7001f000000c2240053ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff74242889d38b400490e8e637000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70021000000c22400000000000c0c0000|@8526,2097151,@816|15,0,$8444+26 206,1,@8445 290,1,@8446 330,1,@8475 379,0,5 461,0,0 484,0,@6377 507,0,0 563,0,0 570,1,@8480 614,0,3 642,0,5 707,0,0 714,1,@8482 740,0,0 745,0,@5383 750,1,@8477 795,0,6 828,0,5 859,0,0 960,0,@6373 1045,0,0 1065,0,0 1122,0,0 1130,1,@8483 1156,0,0 1166,1,@8477 1199,0,6 1232,0,5 1290,1,@8484 1395,0,5 1434,1,@8485 1550,1,@8488 1592,0,0 1660,1,@8489 1702,0,3 1730,0,1 1738,1,@8477 1773,0,6 1924,0,8 2020,0,7 2098,1,@8446 2123,0,1 2165,1,@8475 2170,0,@8497 2222,1,@8498 2257,0,11 2296,0,2 2313,0,0 2342,1,@8499 2398,1,@8500 2407,0,0 2418,0,@8519 2443,0,@8522 2454,0,0 2629,0,12 2717,0,13 2883,0,14 2987,0,15 3038,1,@8525 3073,0,16 8445:D3,216|3b650c7303ff5524a80175738b0853ff7004ff7104ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c24588b018b54242c90ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742434ff742434ff742434ff742434ff742434ff742434eb05e944000000ff742434ff742434ff742434ff7424348b5c24308b44242c90e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22800b801000000c2280000000000d4000000|@6329,1048575,@777|201,0,0 8446:D3,748|3b650c7303ff55248b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc02000000c707e0be7eb28977048067ffbf568b75008d76f83b75087303ff5520897500c746fc01000040c70601000000c70670bf7eb2be01000000538b5c243cf6c301751ff7c601000000740583c6027105ff5538ebf68b5b043b650c7303ff5524ebdc89f3f6c301740783fb017d08eb1bf643ff107515f6c301740a81fbfdffff017c14eb06f643ff10750c89c6b834f67ab28b5d04ff1389def7c601000000740583c6027105ff5538ebf65189f189c6b805000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891f8b45008d40f83b45087303ff5520894500c740fc01000040c700010000006a016a018b5d008d5bd83b5d087303ff5520895d00c743fc09000000c70304c17eb28b4c2450894b048b4c240c894b0889530c8b5424388953108b4c2434894b148b5424308953188b4c242c894b1c8b5424288953208063ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7018cc57eb28979048061ffbf5057ff742410ff74245050518d4c241851ff74243cff74243c89f08b542448ff128b4424148b008b0c248b09ba0100000083f901745789cb83eb0289ce83ee0283e902f6c101740583c1027105ff5538ebf68b3c248b4c4ffe83f901751f8b4d008d49f43b4d087303ff5520894d00c741fc020000008951048931eb0289d189ca89d93b650c7303ff5524eba489d389c68b44245483c404e826080000598b098b55008d52e03b55087303ff5520895500c742fc07000000c74218010000008b7c2440897a14894a1089420cc74208010000008b4424108942045883c41089028b45008d40f43b45087303ff5520894500c740fc02000000895004c70013000000598b098b5424248902897204894a08895a0cb801000000c23c0000000000e8020000|@8474,1048575,@785|34,0,0 50,0,0 66,0,0 82,0,@8447 120,0,0 126,0,@8449 131,0,0 203,0,16777214 220,0,@6401 255,0,2 326,0,0 360,0,@8467 446,0,@8472 502,0,0 610,1,@8473 644,0,0 664,0,0 710,0,9 733,0,0 8447:D3,28|83f80174098b5204c70203000000b8c4777ab2c30000000018000000|@8448,5,@778|10,0,1 15,0,@5383 8448:S88|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382972656343616c6c283129 8449:O1|@8450 8450:D3,112|8b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b8fcbf7eb2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338037506b86cc07eb2c3f6c101740783f9037c0eeb06f641ff107506b8b0c07eb2c3b8d8327bb2c390000000006c000000|@8466,3,@779|22,0,@6514 33,0,@8451 57,0,@6514 68,0,@8458 92,0,@8462 98,0,@6514 8451:O5|0,0,0,@8453,@8452 8452:O2|@8456,0 8453:O2|@8454,0 8454:O2|0,@8455 8455:O5|@8433,1329,1329,0,0 8456:O2|3,@8457 8457:S7|54726943616c6c 8458:O5|0,0,0,@8453,@8459 8459:O2|@8460,0 8460:O2|3,@8461 8461:S10|547269436c6f73757265 8462:O5|0,0,0,@8453,@8463 8463:O2|@8464,0 8464:O2|3,@8465 8465:S8|547269556e726566 8466:S9|7072696e742d747269 8467:D3,68|3b650c7303ff5524ff7204ff7208ff720cff7210ff7214ff7218ff721cff722090e8320000008b4c24048b1089118b5804895904b801000000c204000000000040000000|@8437,1048575,@782|34,1,@8468 53,0,0 8468:D3,452|3b650c7303ff55248b4c2420f6c101740c89c2b8bc7e7ab28b5d04ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebcb833903751a6a016a01518d442404508b41048b54242490ff128b442408eb5883390775146a016a015189d88b54241cff12b801000000eb4f83390175176a016a01518b41048b5424189090ff12b801000000eb6d83fb01746d8b4104a801740783f8017d08eb2cf640ff1075268b5424088b12a801eb05e9a3000000740ef6c20174093bc2eb0ae993000000ff5538ebf27c0db8b0f57ab28b5d04909090ff13a801740583c0027105ff5538ebf68b542408c74442fe03000000b801000000eb0ae959000000b8010000008b4104a801740783f8017d08eb20f640ff10751a8b5424048b12a8017409f6c20174043bc2eb05ff5538ebf77c0bb8f0ea7ab28b5d0490ff13a801740583c0027105ff5538ebf68b5424048b4442fe6a016a01518b4c24288b098b5424248b1250ff742404ff742430ff74243089d389c8e8560000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc020000005a83c40c8950048908c2200090909000000000c0010000|@8471,1048575,@781|20,0,@5417 115,0,0 143,0,0 213,0,@6397 247,0,1 252,0,0 264,0,0 315,0,@6373 382,1,@8469 415,0,1 8469:D3,372|3b650c7303ff5524a80175508b083b4c240c744d83390175248b54240c833a0175508b7104f7c6010000007509f64204017503ff55383b72047455eb5883390375358b54240c833a0375578b7104f7c6010000007515f6420401eb0ae9ac000000e95b0000007503ff55383b72047558eb4fe96500000083390575378b54240c833a0575578b7104f7c601000000eb0ae92c000000e9420000007510f6420401eb05e9350000007503ff55383b72047410eb2983390775248b54240c833a07751bf6c301740ceb05e90f00000083eb027105ff5538ebf689d8c20c00f6c301740583eb027105ff5538ebf68b54240c8b7424088b7c24048954240c89742408897c24048b480489c8e9f3feffff8b4424088b008b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b44240c89018b542408890a8b4c24048b09f6c101740583c1027105ff5538ebf68b5c2404890bf6c101740583e9027105ff5538ebf689c8c20c009090900000000070010000|@8470,63,@780| 8470:S104|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829707265762832296d616b65436c6f73757265456e747279283229 8471:S85|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382970726576283229 8472:D3,204|83fb01755ca801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0e89c1b8f0ea7ab28b5d049090ff1389c1f6c101740583c1027105ff5538ebf68b5a048b4c4bfe83f903740cb901000000eb11e907000000b903000000eb05b903000000a801740783f8017d08eb1ff640ff1075198b5a048b1ba8017409f6c30174043bc3eb05ff5538ebf77c0d89c3b8b0f57ab28b5d0490ff13a801740583c0027105ff5538ebf68b5204894c42feb801000000c300000000c8000000|@8437,15,@783|50,0,@6373 91,0,0 103,0,1 110,0,1 159,0,@6397 191,0,0 8473:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@784|60,0,0 8474:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829 8475:D3,280|3b650c7303ff552483381375698b4804ff7114ff7110ff710cff7104ff31ff742424ff742424ff742424ff742424ff74243c89da8b5c243c89d0909090e8ea000000b901000000a80175358b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c730aeb05e98f000000ff5524ebc789c8837c242c017518a8017507b901000000eb05b90300000083f10283f102eb05b9030000008b55008d52e03b55087303ff5520895500c742fc07000000894a188b4c2410894a148b4c240c894a108b4c2408894a0c8942088b4424048942045883c41089028b45008d40f43b45087303ff5520894500c740fc02000000895004c70013000000c21800c218009090900000000014010000|@8479,1048575,@788|62,1,@8476 67,0,0 142,0,0 149,0,1 162,0,1 259,0,9 8476:D3,136|3b650c7303ff5524a801756c53ff700453ff742420ff742420ff742420ff7424208b5c24208b009090e86e00000050ff742420ff742420ff742420ff742420ff7424208b5c241c8b4424189090e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c214000000000084000000|@6329,1048575,@787|42,1,@8477 121,0,0 8477:D3,348|3b650c7303ff552483380375186a016a0189e1518b40048b54242090ff125883c404c2140083380775118b44241089c189d889ca5983c41451ff228338017533ff70048b04248b5424109090ff128b45008d40f43b45087303ff5520894500c740fc0200000059894804c70001000000c2140083fb01745f8b4804f6c101740783f9017d08eb21f641ff10751b8b5424088b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b542408c7444afe03000000b901000000eb05b9010000008b4804f6c101740783f9017d08eb21f641ff10751b8b5424048b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b4424048b4c48fe8b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c214000000000058010000|@8478,1048575,@786|108,0,0 169,0,@6397 204,0,1 209,0,0 216,0,0 269,0,@6373 333,0,2 8478:S75|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296c6f6361646472283229 8479:S83|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f707950726f63436c6f73757265283329 8480:D3,840|8d7c24a03b7d0c7303ff552883fb017508b801000000c230008b0b8b11833a0f75708b742430f7c6010000007524a8017508f606017503ff55383b067507be03000000eb128b76043b650c7303ff5524ebd4be0100000083f6028b7a046a016a016a016a01ff730450ff710456ff7708ff770cff7710ff7714ff7718ff771c8d44242850ff742468ff742468ff742468eb05e9d5000000ff742468ff742468ff742468ff742468ff7424688b5f048b0790e81ef0ffffff3424ff742450ff742450ff742450ff742450ff7424408b5c242c8b442428e83efbffff8b4d008d49f43b4d087303ff5520894d00c741fc0200000083c4045a895104890158a801740583c0027105ff5538ebf651ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24349090e8bafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c23000833a0975708b742430f7c6010000007524a8017508f606017503ff55383b067507be03000000eb128b76043b650c7303ff5524ebd4be0100000083f602ff730450ff7104ff742438ff742438ff742438ff742438ff74242889f38b4204e812fcffff8b4d008d49e83b4d087303ff5520894d00eb05e992000000c741fc02000000894104c7010d0000008d410cc740fc020000005a895004890859f6c101740583c1027105ff5538ebf650ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c243489c8e8aefdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c23000ff730450ff7104ff742438ff742438ff742438ff742438ff742438ff742438ff742434ff742434ff7424308b5c244489d08b542438909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890158a801740583c0027105ff5538ebf651ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c243490e8e6fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c230000000000044030000|@8481,1048575,@789|18,0,0 63,0,1 83,0,0 178,1,@8446 214,1,@8475 398,0,1 418,0,0 458,1,@8477 498,0,6 8481:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e736572742831296d617041726773283229 8482:D3,488|3b650c7303ff552483fb017508b801000000c22c008b0b8b11833a09756d8b7204833e01756aa8017509f64604017503ff55383b46047407bf01000000eb05bf0300000083f702ff730450ff7104ff742438ff742438ff742438ff742438ff74243889fb89f0909090e8baf9ffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104eb0ae98c000000e987000000c7010d0000008d410cc740fc020000005a895004890859f6c101740583c1027105ff5538ebf650ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c243089c8909090e80affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c22c00ff730450ff7104ff742438ff742438ff742438ff742438ff74242cff74242cff74242cff742444ff7424308b5c244489d08b542448909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890158a801740583c0027105ff5538ebf651ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c243090e846feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c22c0000000000e4010000|@8481,1048575,@790|14,0,0 57,0,0 64,0,1 106,1,@8477 151,0,6 8483:D3,840|8d7c24a03b7d0c7303ff552883fb017508b801000000c230008b0b8b11833a0f75708b742430f7c6010000007524a8017508f606017503ff55383b067507be03000000eb128b76043b650c7303ff5524ebd4be0100000083f6028b7a046a016a016a016a01ff730450ff710456ff7708ff770cff7710ff7714ff7718ff771c8d44242850ff742468ff742468ff742468eb05e9d5000000ff742468ff742468ff742468ff742468ff7424688b5f048b0790e86aeaffffff3424ff742450ff742450ff742450ff742450ff7424408b5c242c8b442428e88af5ffff8b4d008d49f43b4d087303ff5520894d00c741fc0200000083c4045a895104890158a801740583c0027105ff5538ebf651ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24349090e8bafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c23000833a0975708b742430f7c6010000007524a8017508f606017503ff55383b067507be03000000eb128b76043b650c7303ff5524ebd4be0100000083f602ff730450ff7104ff742438ff742438ff742438ff742438ff74242889f38b4204e85ef6ffff8b4d008d49e83b4d087303ff5520894d00eb05e992000000c741fc02000000894104c7010d0000008d410cc740fc020000005a895004890859f6c101740583c1027105ff5538ebf650ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c243489c8e8aefdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c23000ff730450ff7104ff742438ff742438ff742438ff742438ff742438ff742438ff742434ff742434ff7424308b5c244489d08b542438909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890158a801740583c0027105ff5538ebf651ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c243490e8e6fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c230000000000044030000|@8481,1048575,@791|18,0,0 63,0,1 83,0,0 178,1,@8446 214,1,@8475 398,0,1 418,0,0 458,1,@8477 498,0,6 8484:D3,216|3b650c7303ff5524a80175738b0853ff7004ff7104ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c24588b018b54242c90ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742434ff742434ff742434ff742434ff742434ff742434eb05e944000000ff742434ff742434ff742434ff7424348b5c24308b44242c90e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22800b801000000c2280000000000d4000000|@6329,1048575,@792|201,0,0 8485:D3,124|3b650c7303ff5524a80175608b088b1189dfff7004ff742410ff742410ff74241089fb8b4204909090e86200000050ff742414ff742414ff74241489fb8b442410e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c20c00b801000000c20c000000000078000000|@6329,63,@794|42,1,@8486 109,0,0 8486:D3,292|89c18b038b13f6c201740583c2027105ff5538ebf68913f6c101740783f9017d08eb21f641ff10751b8b54240c8b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0d89c2b8b0f57ab28b5d0490ff1389caf6c201740583c2027105ff5538ebf68b5c240cc74453fe01000000f6c101740783f9017d08eb21f641ff10751b8b5424088b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8b0f57ab28b5d049090ff1389caf6c201740583c2027105ff5538ebf68b742408894456fef6c101740783f9017d08eb21f641ff10751b8b5424048b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8b0f57ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b542404c7444afe01000000c20c00900000000020010000|@8487,31,@793|71,0,@6397 106,0,0 158,0,@6397 242,0,@6397 276,0,0 8487:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296d616b654465636c283129 8488:D3,248|3b650c7303ff5524a801756bf6c301756b8b088b11ff7304ff7004ff7104ff33ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c245c8b42088b54246090ff128b4d008d49f03b4d087303ff5520894d00c741fc030000008b54240489510889410458eb0ae96c000000e96700000083c404890151ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24348b4424309090e83effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22c00b801000000c22c0000000000f4000000|@8004,1048575,@795|233,0,0 8489:D3,728|3b650c7303ff55248338037563f64010017549b9010000008b5008f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740783f9097f0feb06f641ff107407b901000000eb65b903000000eb63f6400801741f8b48108b500c8b58088b7004eb05e957020000b81c777bb28b5d049090ff138b48088b118b5d008d5bf43b5d087303ff5520895d00c743fc020000008b720489730489336a016a01f6c101754e8b118b72043b33720eeb0ae997010000e9920100008b338b7a043b7b0477038b7b048b5d008d5bf43b5d087303ff5520895d00c743fc02000000897b0489338b510489d13b650c7303ff5524ebad89e18b13891189e18b7304897104b9010000008b7808f7c701000000751cf6c101740583c1027105ff5538ebf68b7f043b650c7303ff5524ebdcf6c101740783f90f7e5eeb06f641ff10755b8b7c2404f7c701000000740783ff017d26eb06f647ff10741eff7010ff700cff7008ff70045189fbb88c6c7ab29090ff1588c75208eb0fff7010ff700cff7008ff700489f8518b4c2414f6c101741183f9017d23eb10e99a000000e995000000f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c101f6c101740783f9017d0feb06f641ff107407b801000000eb05b80300000083f803740ff6c101740583e9047105ff5538ebf6bb0700000089c8ff15e8c75208a801740df604240174073b04247e0eeb05ff5538ebf4b901000000eb1ab903000000eb13b901000000ff7010ff700cff7008ff70046a0183c404eb106a016a01ff7010ff700cff7008ff700483f901743d8b45008d40e83b45087303ff5520894500c740fc050000008b4c240c8948108b4c240889480c8b4c24048948088b0c24894804c7000300000083c418c38b04248b4c2418894424188b442408894424148b5c240c83c4045883c40c51e920000000c390909000000000d4020000|@8496,2097151,@799|20,0,0 79,0,0 86,0,1 118,0,@6704 268,0,0 370,0,@5215 378,0,I106 435,0,@5215 442,0,I106 494,0,0 501,0,1 526,0,3 534,0,I109 561,0,0 568,0,1 575,0,0 672,0,1 712,1,@8490 8490:D3,480|3b650c7303ff5524a801756b8b08f6c30175328b55008d52ec3b55087303ff5520895500c742fc040000008b3389720c8b7c2408897a088b7104897204c7021f000000eb6b83fb03756b8b55008d52d83b55087303ff5520895500c742fc03000000c74208010000008b7104897204c70207000000eb05e9520100008d7a10c747fc02000000c747040100000089178d570cc742fc02000000897a048b7c2408893aff31ff700489d0e846010000eb0ae9cd000000e9310000008b55008d52ec3b55087303ff5520895500c742fc04000000c7420c03000000c7420890dd7eb2894204c7020b000000eb6c8b55008d52d83b55087303ff5520895500c742fc03000000c74208010000008b7104897204c702070000008d7a10c747fc02000000c747040100000089178d570cc742fc02000000897a048b7c2408893aff31ff700489d09090e83a0100008b55008d52ec3b5508730aeb05e92b000000ff5520895500c742fc04000000c7420c03000000c7420820de7eb2894204c7020b000000eb05ff31ff700452ff742414ff7424148b44240c90e866feffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24088948085983c408894804c70005000000c208008b442404c2080090909000000000dc010000|@8495,63,@798|63,0,15 101,0,0 113,0,3 137,0,0 170,1,@8491 213,0,1 220,0,@8492 229,0,5 262,0,0 274,0,3 291,0,0 326,1,@8493 364,0,1 371,0,@8494 380,0,5 455,0,2 8491:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@796|39,0,1 92,0,0 8492:O3|3,I251,0 8493:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@797|39,0,1 92,0,0 8494:O3|3,I113,0 8495:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e76657274436173652831297265636f6e76657274283129 8496:S81|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e7665727443617365283129 8497:O1|10 8498:D3,216|3b650c7303ff5524a80175738b0853ff7004ff7104ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c24588b018b54242c90ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742434ff742434ff742434ff742434ff742434ff742434eb05e944000000ff742434ff742434ff742434ff7424348b5c24308b44242c90e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22800b801000000c2280000000000d4000000|@6329,1048575,@800|201,0,0 8499:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@801| 8500:D3,1640|8d7c249c3b7d0c7303ff5528a801756d8b08833901756b8b790c53ff7110ff7004ff742434ff742434ff7424348b410890e822f5ffff5057ff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243c8b5c24388b44243090e892ffffff50ff74242cff74242cff74242ceb0ae9d4050000e9bc000000ff74244cff742448ff742434ff742434ff742458ff7424348b5c24548b4424348b54245890ff128b4d008d49f43b4d087303ff5520894d00c741fc020000008b542404895104c701090000008b55008d52f03b55087303ff5520895500c742fc03000000894a088b4c2408894a04c702010000008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc020000005b83c414895804890889c18d400cc740fc020000008948048910c22800833905757153ff7104ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b480489c8e882feffff50ff742420ff742420ff742420ff742440ff74243cff742428ff742428ff74244cff7424288b5c24488b4424288b54244c90ff12833819755feb05e9910000008b4d008d49e83b4d087303ff5520894d00c741fc020000008b5008895104c701030000008d590cc743fc020000008b3424897304890b83fb01750b8b480489c883c40cc228008b480489c883c40c5983c42851e9660400008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc020000008b1424895004890883c40cc22800833907757153ff7004ff7104ff742434ff742434ff7424348b44240c9090e862040000ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24308b44242c909090e856fdffff50ff742420ff742420ff742440ff74243cff742428ff74243ceb05e9da000000ff74242c8b5c24408b442420909090e8820400006a01ff74243cff74242cff74242cff74242cff742448bb01000000e8f20600006a016a0189e390e8b20a0000f604240174288b44240490e88a0b0000837c240801750683c418c228008b5c240883c4185983c42851e9f40b00008b04249090e8420c00008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70105000000518b44240890e8ea0c0000837c240c0174098b5c240ce8620d000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c418c228008b510c833a0f756d89dfff7004ff7108ff7204ff742434ff742434ff74243489fb8b442410e88af1ffff8b0c246a016a016a016a015750ff7108ff710cff7110ff7114ff7118ff711c8d54242052ff742454ff742454ff742454ff742474ff742470ff74245cff742470ff7424608b59048b01eb05e964010000909090e87ad7ffff8b44241ca801740783f8017d08eb20f640ff10751a8b4c24448b09a8017409f6c10174043bc1eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13a801740583c0027105ff5538ebf68b4c24448b542414895441feff74244cff74244c51ff74244cff74244cff74244cff74244cff74244cff74244cff74244c8b5c242c8b44244890e852fbffff837c2410017407b903000000eb548b4c241cf6c101740783f9017d08eb21f641ff10751b8b54244c8b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0c89c2b8f0ea7ab28b5d04ff13f6c101740583c1027105ff5538ebf68b54244c8b4c4afe5051ff742440ff742440ff742440ff742460ff7424608b5c24288b442424909090e8aee1ffff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b442404894104c701010000008b45008d40f43b45087303ff5520894500c740fc020000005a83c4248950048908c2280089dfff700452ff742430ff742430ff74243089fb8b4108e8baefffff5750ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff74243889fb8b442434909090e82afaffff50ff742428ff742428ff742428ff742448ff742444ff742430ff742430ff742454ff7424288b5c24508b4424308b54245490ff128b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b442404894104c701010000008b45008d40f43b45087303ff5520894500c740fc020000005a83c4108950048908c22800b801000000c2280090900000000064060000|@8518,1048575,@814|50,1,@8486 207,0,4 247,0,0 280,0,1 478,0,1 530,1,@8501 563,0,1 622,1,@8502 730,1,@8503 757,0,0 762,1,@8506 774,1,@8509 790,1,@8510 820,1,@8511 830,1,@8512 863,0,2 874,1,@8516 890,1,@8517 970,1,@8486 1058,1,@8446 1110,0,@6397 1206,0,1 1264,0,@6373 1330,1,@8475 1370,0,0 1434,1,@8486 1582,0,0 1623,0,0 8501:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@802| 8502:D3,120|3b650c7303ff5524a801755c8b0889dfff7004ff742410ff742410ff74241089fb8b410490e85aeeffff50ff742414ff742414ff74241489fb8b442410e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c20c00b801000000c20c000000000074000000|@6329,63,@803|38,1,@8486 105,0,0 8503:D3,168|3b650c7303ff5524a801756d8b0853ff7004ff710853ff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b59048b019090e87e00000050ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b4424209090e896ffffff89c18b45008d40f43b4508730aeb05e919000000ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c009000000000a4000000|@6329,1048575,@805|58,1,@8504 152,0,0 8504:D3,336|8d7c24ac3b7d0c7303ff55288b4424246a016a016a016a0153ff7008ff700cff7010ff7014ff7018ff701c8d4c241c51ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff7424508b58048b0889c89090e826d3ffff837c240c0174598b0424a801740783f8017d08eb20f640ff10751a8b4c24288b09a8017409f6c10174043bc1eb05ff5538ebf77c0ab8b0f57ab28b5d04ff13a801740583c0027105ff5538ebf68b4c2428c74441fe03000000b801000000eb05b8010000008b0424a801740783f8017d08eb20f640ff10751a8b4c24248b09a8017409f6c10174043bc1eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13a801740583c0027105ff5538ebf68b4c24248b542410895441fe8b45008d40f03b45087303ff5520894500c740fc030000008b5424088950088b5424048950045a83c4108910c224009090000000004c010000|@8505,1048575,@804|90,1,@8446 148,0,@6397 179,0,1 184,0,0 191,0,0 242,0,@6397 8505:S103|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129636f7079446563283329 8506:D3,556|3b650c7303ff5524a801756b8b088b11f6c201740783fa017d08eb24f642ff10751e8b7424148b36f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b7424148b5456fe83fa01745653ff7004ff316a03ff742420eb05e930010000ff742420ff74242056ff7424248b59088b41049090e85edcffff8b0c24f6c101740783f9017d08eb26f641ff1075208b5424108b12f6c101740ef6c20174093bcaeb0ae994000000ff5538ebf27c0e89c2b8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b54241083c4048b4c4afe8b5d008d5bf43b5d087303ff5520895d00c743fc02000000894304890b536a03ff742424ff742424ff742424ff742424528b5c24208b44241c90e8cefeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c218008b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24188b7c24108b4c240cff70048b44240c528b54240c895c24208974241c897c2418894c2414894424108954240c5b58e954feffff837c24180175328b4424108b4c240c8b5424088b7424148b7c2404894c24188954241489742410897c240c5389c3585983c40851e95b0000008b4424148b4c24108b54240c8b7424088b7c240453bb01000000895c241c89442418894c2414895424108974240c897c2408bb0100000058e9defdffff90900000000028020000|@8508,1048575,@807|68,0,@6373 146,1,@8475 206,0,@6373 481,1,@8507 507,0,0 536,0,0 8507:D3,256|3b650c7303ff5524a801756c8b0853ff7004ff316a0153ff742424ff742424ff742424ff7424248b59088b4104e882daffff8b0c24f6c101740783f9017d08eb21f641ff10751b8b5424108b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0f89c2b8f0ea7ab28b5d04909090ff13f6c101740ceb05e97300000083c1027105ff5538ebf68b54241083c4048b4c4afe8b5d008d5bf43b5d087303ff5520895d00c743fc02000000894304890b53ff74241cff74241cff74241c528b5c24188b442414e836ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21000b801000000c2100000000000fc000000|@6329,1048575,@806|46,1,@8475 101,0,@6373 241,0,0 8508:S111|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e7328312970726f63657373436c6f7375726573283329 8509:D3,212|3b650c7303ff5524a801756c8b088b5104833a137407be01000000eb05be030000006a016a015351568d5c240c8b400490e8caffffff833c240174428b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240489088b4c240889018b442410894104b80100000083c414eb05e93c000000c38b45008d40f43b45087303ff5520894500c740fc020000008b4c24108948048b4c240489088b4c24088b54240c8911894104b80100000083c414c3c70301000000c7430401000000b801000000c300000000d0000000|@6496,31,@808|23,0,0 30,0,1 111,0,0 177,0,0 187,0,0 194,0,0 199,0,0 8510:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c70201000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@809|51,0,0 100,0,0 8511:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@810| 8512:D3,132|3b650c7303ff5524a80175678b088b5104833a13740f8b5804b85cf07eb28b5d049090ff138b5d008d5bf43b5d087303ff5520895d00c743fc020000008b72048973048b39893b53ff70045890e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000080000000|@6329,63,@811|26,0,@8513 116,0,0 8513:O4|@4608,@5398,@8515,@8514 8514:O5|@8433,1024,0,1024,0 8515:S8|61734d757475616c 8516:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c70201000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@812|51,0,0 100,0,0 8517:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@813| 8518:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129 8519:O4|@4608,@5398,@8521,@8520 8520:O5|@8433,1062,0,1062,0 8521:S30|64656353657175656e63655769746846696e616c4578703a20656d707479 8522:O4|@4608,@5398,@8524,@8523 8523:O5|@8433,1064,0,1064,0 8524:S46|64656353657175656e63655769746846696e616c4578703a206c617374206973206e6f742061204e756c6c446563 8525:D3,184|3b650c7303ff5524a801757053ff7004ff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b5c24548b008b5424289090ff1250ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24308b44242c9090e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22800b801000000c228009000000000b4000000|@6329,1048575,@815|168,0,0 8526:S74|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129 8527:D3,1200|3b650c7303ff55245052ff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242c89d98b5c245489c88b4a0489ca90ff128b4c2434833903753d50ff710cff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b59088b41048b542430e87effffffeb368b142450ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c245889c88b720489f290ff128b4c240450ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c245c8b4424308b51049090ff128b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000c7027cf87eb28b5c2438895a048062ffbf891150909090e83a060000a801754b8b088b542404833a03754f8b5a048b7104833b0d7550833e0d75508b7b043b7e04744d833f0175288b460483380175588b7704f7c6010000007509f64004017503ff55383b70047458eb5be9de020000833f0375428b4604eb05e9630200008338037559eb0fe9a1000000e99c000000e96a0000008b7704f7c6010000007510f6400401750aeb05e978000000ff55383b70047557eb48833f0575368b4604eb0ae939000000e95a00000083380575558b7704f7c6010000007510eb05e943000000f64004017503ff55383b7004740feb33833f07752e8b7604833e0775268b45008d40f83b4508730aeb05e914000000ff5520894500c740fc010000008b5b048918eb4bb801000000eb44833b0f753a833e0f75358b7b08f7c7010000007509f64608017503ff55383b7e087407b801000000eb1a8b76048b7b0489fb3b650c7303ff5524e9c6feffffb8010000008b59083b5a107507be03000000eb2ef6c3017524f642100175178b72108b3b3b3e7407be01000000eb13be03000000eb0cbe01000000eb05be01000000a801756683fe0375668b45008d40f43b45087303ff5520894500c740fc020000008b318970048b7c2408893853ff720cff7204508b4208909090e8ce0600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b4508730feb0ae936000000e931000000ff5520894500c740fc050000008b5424088950108b54240489500c8948085983c408894804c7000300000083c414c22c008b45008d40f43b45087303ff5520894500c740fc020000008b118950048b74240889308b75008d76f43b75087303ff5520897500c746fc02000000c746040100000089065356ff71048b442410e8bae0ffff89c18b45008d40e83b45087303ff5520894500c740fc050000008b54240889501089480c8b4c24048948085983c408894804c7000300000083c414c22c008b5d008d5bf43b5d087303ff5520895d00c743fc020000008b318973048b7c2408893b8b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c7470401000000891f8d470cc740fc050000008b590889581089500c8978088b5104895004c7000300000083c414c22c008b44240490e806e0ffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24088948088b0c24894804c7000500000083c414c22c0000000000ac040000|@8544,2097151,@820|268,0,0 284,0,@8528 306,1,@8541 576,0,0 618,0,0 646,0,0 659,0,1 686,0,0 693,0,1 700,0,0 707,0,0 770,1,@8543 866,0,1 938,0,0 954,1,@8489 1010,0,1 1082,0,0 1118,0,1 1134,1,@8489 1182,0,2 8528:D3,460|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b85cfa7eb2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b0b890e8b52048b1289f0909090ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c700d0fa7eb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000c8010000|@8540,1048575,@817|30,0,@6514 41,0,@8529 65,0,@6514 166,0,123 175,0,91 208,0,@5642 246,0,@5643 282,0,@5594 302,0,0 309,0,1 316,0,3 322,0,0 361,0,0 382,0,@5592 403,0,@8536 425,0,0 432,0,0 439,0,1 445,0,0 8529:O5|0,0,0,@8531,@8530 8530:O2|@8534,0 8531:O2|@8532,0 8532:O2|0,@8533 8533:O5|@8433,1127,1127,0,0 8534:O2|3,@8535 8535:S9|446966666572656e74 8536:O5|0,0,0,@8531,@8537 8537:O2|@8538,0 8538:O2|3,@8539 8539:S7|53696d696c6172 8540:S16|7072696e742d73696d696c6172697479 8541:D3,496|83381f75428b4d008d49e03b4d087303ff5520894d00c741fc010000008b500c89118d5908c743fc03000000894b088b4808894b048b700489338d4310c740fc010000008918c383380b75588b4808833907755581790468c852087407ba01000000eb05ba03000000817904a8d952087407bb01000000eb05bb0300000083fa01750583fb017451f640040175508b5804f6430401755e8b7304837e0401755a8b3beb0ae936010000e92b0100008b0f83390775708b58048b73048b068b0b8b39f64704017463f64704017518ff30b808a87cb28b5d04eb0ae9f5000000e955000000ff1383f2028b5d008d5be83b5d08730feb0ae93e000000e939000000ff5520895d00c743fc030000008953088b108953048b770489338d4310c740fc01000000eb0ae90e000000e9030000008918c3b801000000c3f6400401755c8b4804f641040175588b5904837b040175678b338b3e833f0775638b01f64704017460f6470401750eff30b808a87cb28b5d049090ff1383f2028b5d008d5be83b5d087303ff5520895d00c743fc030000008953088b10895304eb0ae92e000000e9290000008b770489338d4310c740fc010000008918eb0fe911000000e90c000000e901000000c3b801000000c3b801000000c3b801000000c3b801000000c3b801000000c390909000000000ec010000|@8542,63,@818|87,0,I113 94,0,0 101,0,1 108,0,I251 115,0,0 122,0,1 208,0,@7422 307,0,0 362,0,@7422 456,0,0 462,0,0 468,0,0 474,0,0 480,0,0 8542:S87|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e6428332966696e6443617365283129 8543:D3,112|3b650c7303ff5524a80175538b088b55008d52f43b55087303ff5520895500c742fc020000008b5904895a048b318932528b780489f8909090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000006c000000|@6329,63,@819|96,0,0 8544:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e64283329 8545:D3,368|3b650c7303ff552483381d757253ff742408bbe8ff7eb28b4004909090e86a01000089c1f6c1017519f60101740d8b49043b650c7303ff5524ebe9b901000000eb05b90300000083f9017408b801000000c204008b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c01000000894108c741048b000000eb05e91c000000c7013ce239b28d4114c740fc02000000c74004010000008908c2040083380975648b480483390575618b5104f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c201740583c2027105ff5538ebf68b5453fef6c2017412b801000000c20400e952000000e9450000008b5d008d5be03b5d087303ff5520895d00c743fc04000000c7430c01000000895308c743048b0000008b54240489138d4314c740fc02000000c74004010000008918c20400b801000000c20400b801000000c20400000000006c010000|@8548,1048575,@822|19,0,@8546 30,1,@8547 60,0,0 67,0,1 77,0,0 111,0,0 121,0,69 134,0,@4606 151,0,0 221,0,@6373 258,0,0 302,0,0 312,0,69 335,0,0 345,0,0 353,0,0 8546:O1|@8545 8547:D3,112|3b650c7303ff5524a801755453ff7004ff74240c8b5c24148b008b5424089090ff1250ff742414ff7424148b5c24108b44240c9090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c20800000000006c000000|@6329,1048575,@821|97,0,0 8548:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f646528362967657450726f7073283129 8549:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629 8550:S54|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229 8551:D3,384|3b650c7303ff55248b4c2404f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c16eb06f641ff10750e89c2b834f67ab28b5d049090ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b4424048907a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c15eb06f640ff10750db834f67ab28b5d04909090ff13a801740583c0027105ff5538ebf689c1b80100000089fe8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44240489078b4d008d49f03b4d087303ff5520894d00c741fc01000040c701010000008d4108c740fc01000040c70003000000508b45008d40f83b45087303ff5520894500c740fc01000040c70001000000c700e8027fb28b442408897424088b742404895c24048b1c24890424515753bbc80a7fb289d0bad00a7fb256e9220800009090000000007c010000|@8672,2097151,@870|37,0,16777214 54,0,@6401 83,0,0 154,0,16777214 169,0,@6401 198,0,0 274,0,0 290,0,1 321,0,0 327,0,@8552 357,0,@8587 364,0,@8588 370,1,@8590 8552:O1|@8553 8553:D3,596|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b880a27ab2eb6d8b1089cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b1a891e8b3d2ce639b2515256b870097fb289fa909090ff1289c15889ca90ff12595af6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9e2000000ff5520895d00c743fc020000008953048b4904890b8b0d2ce639b25053b8bc097fb289ca909090ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701080a7fb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700240a7fb28b4d008d49a03b4d087303ff5520894d00c741fc02000000894104c70160a37ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c700010000008d4818c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701400a7fb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000050020000|@8586,1048575,@831|30,0,@6514 69,0,@5606 127,0,@4682 135,0,@8569 212,0,@4682 219,0,@8572 265,0,@5609 286,0,@5592 305,0,@8575 324,0,@5592 343,0,@5593 392,0,@5592 411,0,@8577 444,0,@5621 464,0,0 471,0,0 478,0,1 484,0,0 501,0,0 522,0,@5592 541,0,@8579 561,0,0 568,0,0 575,0,1 581,0,0 8554:O1|@8555 8555:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700a4057fb28948048060ffbfc3000000002c000000|@4958,3,@828|28,0,@8556 8556:D3,48|3b650c7303ff55248b5204ff720468e8057fb2ff70048d5c24048b0090e88600000083c408c39090000000002c000000|@8568,1048575,@827|15,0,@8557 30,1,@8559 8557:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@8558,1048575,@825| 8558:S18|566563746f722e7072657474792833292d45 8559:D3,652|3b650c7303ff5524b9ffffff002348fc8d4c0901f6c101740583e9027105ff5538ebf68b542404f6c201740783fa017f0feb06f642ff107407b8ec087fb2eb6cf6c2017409f6c10174042bd17105ff5538ebf783c2018b75008d76f43b75087303ff5520897500c746fc02000000895604c70610097fb2baffffff002350fc8d54120151505383fa0175048b06eb5a89d083e80289d183e90283ea028b5c24048b5453fe837e04017544eb05e9870100008b7604f7c601000000740583c6027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc02000000897104c701ec087fb2eb6ce9470100008b7e04f7c701000000740783ff017d3deb06f647ff107435f7c701000000740583c7027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70101000000eb6df7c701000000740583ef027105ff5538ebf650ff7604ff36eb05e9ca0000005189fb89d08b54241090ff128b0c24f6c101750af6442418017503ff55383b4c2418744f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b542404895104c70100187ab28b5500eb05e9740000008d52f43b55087303ff5520895500c742fc02000000894a04c70210187ab2eb048b5424048b4d008d49f43b4d087303ff5520894d00c741fc02000000895104890183c40858a801740583c0027105ff5538ebf689ca8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048911eb0450eb01505a89ce3b650c7303ff5524e951feffff83c40c8b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70128097fb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000c204000000000088020000|@8567,1048575,@826|9,0,8388607 58,0,@8560 115,0,@8563 120,0,8388607 227,0,@8560 309,0,0 415,0,@4992 455,0,@4993 597,0,@8565 617,0,0 624,0,0 631,0,3 637,0,0 8560:O2|@8561,0 8561:O2|3,@8562 8562:S4|2e2e2e5d 8563:O2|@8564,0 8564:O2|3,93 8565:O2|3,@8566 8566:S9|66726f6d4c6973745b 8567:S16|566563746f722e707265747479283329 8568:S7|61646450502d32 8569:O4|0,@8570,3,1 8570:O1|@8571 8571:D3,28|3b650c7303ff55248b0d64e039b289caff2290900000000018000000|@7041,1048575,@829|10,0,@4587 8572:O4|0,@8573,3,1 8573:O1|@8574 8574:D3,28|3b650c7303ff55248b0d64e039b289caff2290900000000018000000|@7041,1048575,@830|10,0,@4587 8575:O2|3,@8576 8576:S8|6c6f63616c73203d 8577:O2|3,@8578 8578:S6|61726773203d 8579:O5|0,0,0,@8581,@8580 8580:O2|@8584,0 8581:O2|@8582,0 8582:O2|0,@8583 8583:O5|@8433,218,218,0,0 8584:O2|3,@8585 8585:S8|5573616765536574 8586:S14|7072696e742d7573616765536574 8587:O1|@8551 8588:O3|@8590,@8658,@8589 8589:O2|@8666,@8588 8590:D3,4524|8d7c24ac3b7d0c7303ff55288b08be060b7fb28d748efcffe690e90f010000909090e915070000909090e9170c0000909090e9750c0000909090e99a0c0000909090e95b000000909090e9b10c0000909090e9dc0c0000909090e9280d0000909090e9a00d0000909090e9f50d0000909090e9f50d0000909090e9390e0000909090e9a00f0000909090e9e40f0000909090e967100000909090e9bb100000909090ff700c53ff70085253ff74242cff74242cff74242cff74242cff74242cff74242c89d38b400490e8f210000050ff74242cff74242cff74242cff74242cff74242cff74242c8b5c24248b4424208b54241c9090e806ffffff89c18b45008d40ec3b45087303ff5520894500c740fc040000008b54241089500c8948085983c410894804c7000b000000c218008b4c24048b09f6c101740583c1027105ff5538ebf68b742404890e8b368b4c24188b0983f9017507b968c05208eb6689cf89f9ff7008ff7004b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242489f989cf518b4c2404d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf83c40889c6eb06ff7008ff70048b44241c8b0083f8017507b868c05208eb6389cf89c150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242489f989cf518b4c2408d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89c689c883c404eb036a01518b4d008d49f43b4d087303ff5520894d00c741fc020000005f83c40489790489018b4424108b0083f8017507b868c05208eb6389cf89c150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74241889f989cf518b4c2408d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89c689c883c404eb036a01518b4c24188b09bf0100000053523bf97207ba01000000eb2a89faf6c201740583c2027105ff5538ebf68b5c2420c74453fe0300000083c7023b650c7303ff5524ebcb8b4c24248b098b542424c702030000008b5c241456f6c30175718b138b32f7c601000000740783fe017d08eb27f646ff1075218b7c24348b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0d89c7b8b0f57ab28b5d0490ff13f7c601000000740583c6027105ff5538ebf68b7c2434c74477fe010000008b32f7c601000000740eeb05e96600000083fe017d08eb24f646ff10751e8b7424248b36f7c601000000740bf6020174063b327f15eb05ff5538ebf589c6b8b0f57ab28b5d049090ff138b12f6c201740583c2027105ff5538ebf68b742424c74456fe010000008b5b043b650c7303ff5524e91fffffffba010000005051ff74243cff74243cff74243cff74243cff74243cff74243c8b5c24288b4424348b542424e8befbffff508b5c24408b4424249090e8820e00008b4c24408b0983f9017507b968c05208eb5689ca89d189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74244089f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c189d88b54243c8b1283fa017507ba68c05208eb5f89cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74243c89f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89ca83c40489d98b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b0489138b4c24348b54240489118b742408baffffff002356fc8d541201bf01000000f7c701000000740cf6c20174078d7fff03fa7105ff5538ebf48b7424308b36f7c701000000740cf7c60100000074043bfeeb05ff5538ebf77e0c89c6b8d01e7fb28b5d04ff138b7424088b7c243089d1d1e983c704f3a58d7c3f018d7436018d4c09018b4d008d49e83b4d087303ff5520894d00c741fc02000000c7410401000000891989c28d410cc740fc020000008948048b4c2418890852ff742440ff74243cff74243c8b5c2448e8fa0d0000a801750ff640040175098b480483790401740c89c1b8a8267fb28b5d04ff13f60101750f8b08b8ec267fb28b5d04909090ff138b10ff30f6c20175248b7a04ff742414ff74244c8b5c244c8b029090e8da15000089fa3b650c7303ff5524ebd7b8010000008b5c24048b44242cba74587cb290e80647fdffff74241cff74244cff74244cff74244cff74244cff74244cff74244c8b5c2434909090e86a17000089c38b44242c90e84218000089d989c389c8ba74587cb2e8c246fdff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b442408894104c70101000000f6042401740889c883c430c218008b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008948088b0c24894804c7001300000083c430c218008b4c24188b0983f9017507b968c05208eb6a89ce89f18b7810ff7004ff7008ff700cb801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242889f989cf5189c1d1e983c604f3a58d7c3f018d7436018d4c09018b04248060ffbf89c183c404eb0cff7004ff7008ff700cff70108b4424248b0083f8017507b868c05208eb6489ce89c189c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242889f989cf518b4c2404d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89c689c883c40889f153525051ff742438ff742438ff742438ff742438ff742438ff7424388b44242c909090e89ef7ffff8b4c24388b0983f9017507b968c05208eb5689ca89d189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74243889f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c189d88b5424348b1283fa017507ba68c05208eb5f89cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74243489f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89ca83c40489d98b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b0489138b1424b9ffffff00234afc8d4c0901be01000000f7c601000000740cf6c10174078d76ff03f17105ff5538ebf48b7c24388b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77e0f89c6b8d01e7fb28b5d04909090ff1389d68b7c2438d1e983c704f3a58d7c3f018d7436018d4c09018b742404b9ffffff00234efc8d4c0901bf01000000f7c701000000740cf6c10174078d7fff03f97105ff5538ebf48b5424348b12f7c7010000007409f6c20174043bfaeb05ff5538ebf77e0f89c2b8d01e7fb28b5d04909090ff138b7c2434d1e983c704f3a58d7c3f018d7436018d4c09015053ff742440ff742410ff742444ff74241cff742424ff74244cff74244cff74244cff74244c8b5c242c8b442444909090e8f21400006a016a0189e390e8eef6fdff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b5424088910ff742444ff742440ff7424408b5c244c9090e852090000a801740f89c1b858777bb28b5d04909090ff13508b58048b442404e8521700008b4d008d49f43b4d087303ff5520894d00c741fc020000008b5424088951048b54240c891150f6c1017520ff7104ff7424548b5c24548b01909090e8ca190000593b650c7303ff5524ebdbb801000000ff742450ff742450ff742450ff742450ff742450ff7424508b5c243c8b44244c8b542438909090e8a6f4fffff644240401740c89c1b81c777bb28b5d04ff138b4c240483390175068b4c2414eb6b8b542414833a1b754a89c38b72088b7a048b019090e8fa17000083ff01740d5389fb909090e8061b0000eb01538b4d008d49f03b4d087303ff5520894d00c741fc03000000897108894104c7011b000000eb3e89c38b019090e88e1800008b4d008d49f03b4d08730aeb05e920000000ff5520894d00c741fc030000008b542414895108894104c7011b00000053eb01508b45008d40e83b45087303ff5520894500c740fc050000008b54242c89501089480c8b4c24048948085983c438894804c70003000000c218008b4c24188b7424148b7c2410538b5c2410ff700cff7008ff70048b442418508b442418508b442410894424308b4424148944242c894c242889742424897c2420895c241c8b4424048b4c2418894424185883c4048944240c8b5c24045883c4088b520851ff228b48088b50048b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70007000000c218008b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c218008b4c24048b5424148b5c240c8b7424188b7c240889542418895c241489742410897c240c89cb8b40045983c40851e9d119000052ff7008ff742420ff742420ff742420ff742420ff742420ff7424208b4004909090e8a6f2ffff89c18b45008d40f03b45087303ff5520894500c740fc030000005a83c404895008894804c7000f000000c218005352ff7004ff742424ff742424ff742424ff742424ff742424ff7424248b40089090e852f2ffff50ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b44241c8b5424209090e826f2ffff89c18b45008d40f03b45087303ff5520894500c740fc030000005a83c40c895008894804c70011000000c218008b4804ff7108ff710cff7110ff7114ff711853ff742430ff742430ff742430ff742430ff742430ff7424308b59048b018b52049090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70015000000c21800b85c387fb2c2180053ff74241cff74241cff74241cff74241cff74241cff74241c89d38b4004909090e8e61e000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70019000000c218008b4d008d49e83b4d087303ff5520894d00c741fc020000008b7008897104c701030000008d790cc747fc02000000c7470401000000890f83ff0175078b480489c8eb11535289fb8b480489c890e8321f0000eb0253528b0c24ff742404ff742424ff742424ff742424ff742424ff742424ff742424ff710489cb909090e85a1f00006a016a01b901000000a801740e89c2b830497fb28b5d049090ff1383780401755a8b10833a03740bb85c497fb28b5d0490ff13bb01000000f6c101752e8b75008d76f43b75087303ff5520897500c746fc02000000895e048b19891e89f38b49043b650c7303ff5524ebcd89d989e3890b89e18b5a04895904eb318b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524e95dffffff833c2401750a83c4045883c408c218008b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c7001b00000083c410c2180052ff74241cff74241cff74241cff74241cff74241cff74241c8b40049090e8b6efffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7001d00000083c404c218005352ff7008ff7004ff742428ff742428ff742428ff742428ff742428ff7424288b400c909090e862efffff50ff74242cff74242cff74242cff74242cff74242cff74242c8b5c24288b44241c8b5424249090e836efffff89c18b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c5a83c408895008894804c7001f000000c2180052ff700cff7004ff742424ff742424ff742424ff742424ff742424ff7424248b400890e8daeeffff89c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c408894804c70021000000c2180053ff74241cff74241cff74241cff74241cff74241cff74241c89d38b400490e81e2d000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70023000000c2180000000000a8110000|@8657,2097151,@863|15,0,$8590+26 202,1,@8591 295,0,5 343,0,I49 360,0,0 469,0,I49 481,0,0 622,0,I49 634,0,0 737,0,0 748,0,0 779,0,1 808,0,1 883,0,@6397 919,0,0 986,0,@6397 1022,0,0 1043,0,0 1102,1,@8593 1118,0,I49 1131,0,0 1222,0,I49 1235,0,0 1367,0,8388607 1379,0,0 1444,0,@8594 1509,0,0 1554,1,@8596 1580,0,@8606 1597,0,@8609 1638,1,@8612 1655,0,0 1668,0,@7237 1674,1,@7238 1714,1,@8617 1726,1,@8618 1737,0,@7237 1742,1,@7238 1782,0,0 1827,0,0 1842,0,9 1864,0,I49 1887,0,0 2000,0,I49 2013,0,0 2158,0,I49 2171,0,0 2262,0,I49 2275,0,0 2396,0,8388607 2408,0,0 2473,0,@8594 2515,0,8388607 2527,0,0 2589,0,@8594 2674,1,@8619 2686,1,@7832 2746,1,@8596 2757,0,@6707 2778,1,@8620 2842,1,@8624 2858,0,0 2916,0,@6704 2962,1,@8621 2978,1,@8626 3017,0,13 3030,1,@8623 3077,0,13 3135,0,1 3282,0,3 3321,0,4 3375,1,@8627 3456,0,7 3584,0,8 3677,0,10 3685,0,@8629 3726,1,@8630 3761,0,12 3800,0,1 3817,0,0 3846,1,@8631 3894,1,@8632 3903,0,0 3914,0,@8652 3939,0,@8654 3950,0,0 4125,0,13 4201,0,14 4343,0,15 4435,0,16 4474,1,@8656 4509,0,17 8591:D3,176|3b650c7303ff5524a801757053ff30ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b4004909090e8caffffff8b0c2450ff7104ff742428ff742428ff742428ff742428ff742428ff7424288b5c24448b018b54242490ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000eb05e91c0000005a89510489018d410cc740fc020000005a83c4088950048908c21c00b801000000c21c0090909000000000ac000000|@8592,1048575,@832|158,0,0 8592:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296d617072696768742832292829 8593:D3,252|3b650c7303ff5524a80175618b088b11f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b5453fe8b31f7c601000000740c83fe017d0deb28e979000000f646ff10751d8b3bf7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c108b7804b8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf6c74473fe01000000528b480489c8e836ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000f8000000|@6329,63,@833|64,0,@6373 153,0,@6397 187,0,0 236,0,0 8594:O4|11,@4879,0,@8595 8595:O5|@6375,210,0,210,0 8596:D3,708|3b650c7303ff552483fb017507b968c05208eb70f6c301740783fb017e1deb06f643ff107515f6c301740a81fbffffff017c16eb06f643ff10750e89c1b8d4217fb28b5d049090ff1389d989c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fb801000000525753a801eb05e9ad000000740df604240174073b04247c07eb70ff5538ebf48b4c2408ba01000000f6c101754d8b19a80174138b7b04beffffff002377fc8d7436013bc6720d89c6b8cc7b7ab28b5d0490ff138b7c47fe83ff01750ff6c201740583c2027105ff5538ebf68b590489d93b650c7303ff5524ebae89d18b542404894c42fea801740ceb05e91700000083c0027105ff5538ebf63b650c7303ff5524e95cffffff8b44240483c4048060ffbf89c183c404eb01508b4424108b0083f8017507b868c05208eb71a801740783f8017e1ceb06f640ff107514a801740a81f8ffffff017c17eb06f640ff10750f89c2b8d4217fb28b5d04909090ff1389ca89c189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fb801000000525753a801eb05e9a9000000740df604240174073b04247c07eb6eff5538ebf48b4c240cba01000000f6c101754b8b19a80174128b3bbeffffff002377fc8d7436013bc6720c89c6b8cc7b7ab28b5d04ff138b7c47fe83ff01750ff6c201740583c2027105ff5538ebf68b590489d93b650c7303ff5524ebb089d18b542404894c42fea801740ceb05e91700000083c0027105ff5538ebf63b650c7303ff5524e95effffff8b44240483c4048060ffbf83c404eb0151b9010000008b542404f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b5424108b5c240c894c241489542410895c240c598b742404894c240489c35856e94b00000090909000000000c0020000|@8605,63,@837|14,0,I49 45,0,16777215 62,0,@8597 78,0,0 121,0,0 162,0,0 181,0,8388607 199,0,@5401 323,0,I49 352,0,16777215 369,0,@8597 388,0,0 431,0,0 472,0,0 490,0,8388607 508,0,@5401 618,0,0 693,1,@8599 8597:O4|4,@4943,0,@8598 8598:O5|@5403,147,0,147,0 8599:D3,128|3b650c7303ff5524a801756453ff7004ff742418ff742418ff742418ff7424188b00909090e86a00000050ff74241cff74241cff74241cff74241c8b5c24188b4424149090e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21000b801000000c21000000000007c000000|@6329,63,@836|38,1,@8600 113,0,0 8600:D3,416|3b650c7303ff5524b9ffffff00234bfc8d4c0901ba01000000be01000000ff700451ff303b742404736189f083c0028b4c73fe83f9017458f6c101750af644241c017503ff55383b4c241c745cf7c60100000074138b3c24b9ffffff00234ffc8d4c09013bf1720d89c1b8cc7b7ab28b5d0490ff138b4c77fe83f90175678b4c24188b0983f9017561eb0ae9af000000e99b00000083fe01752c89d18b55008d52f43b5508730aeb05e982000000ff5520895500c742fc02000000894a04c70248247fb2eb6af7c601000000740583ee027105ff5538ebf68b4d008d49d83b4d08730feb0ae946000000e941000000ff5520894d00c741fc02000000897104c701010000008d710cc746fc03000000c7460803000000894e04c7060d00000089d18d5610c742fc02000000894a04893289c63b650c7303ff5524e9e5feffff8b4c241083c408b8ffffff002341fc8d440001bb01000000503b1c24720889d083c408c2100089d883c0028b4c240c8b4c59fe89c652ff74241cff74240cff74241c89d889cbe83a00000089f389c23b650c7303ff5524ebc0000000009c010000|@8604,63,@835|9,0,8388607 21,0,0 26,0,0 89,0,8388607 107,0,@5401 192,0,@8601 257,0,0 274,0,1 283,0,6 327,0,8388607 339,0,0 390,1,@8602 8601:O3|6,@5383,1 8602:D3,276|83fb01745cf6c301750af644240c017503ff55383b5c240c7459a80174148b542408b9ffffff00234afc8d4c09013bc1720f89c1b8cc7b7ab28b5d04909090ff138b5442fe83fa017565a801740783f8017d08eb2ef640ff1075288b4c2404eb05e9490000008b09a8017410f6c101740beb05e9370000003bc1eb05ff5538ebf77c0e89c1b8f0ea7ab28b5d049090ff1389c1f6c101740583c1027105ff5538ebf68b5424048b4c4afe83f90174078b442410c210008b4d008d49d83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc03000000c7400803000000894804c7000d00000089c18d4010c740fc020000008b5c24108958048908c210009090900000000010010000|@8603,15,@834|35,0,8388607 53,0,@5401 134,0,@6373 211,0,2 228,0,1 237,0,6 8603:S96|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129283329 8604:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129 8605:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129 8606:O4|@4608,@5398,@8608,@8607 8607:O5|@8433,409,0,409,0 8608:S15|636f6d707574654b696c6c53657473 8609:O4|@4608,@5398,@8611,@8610 8610:O5|@8433,410,0,410,0 8611:S14|4e6f74206b696c6c4265666f7265 8612:D3,300|83380d740c89c1b870287fb28b5d04ff138b4804833907752f8b13f6c201740783fa017e08eb12f642ff10740cb8b0f57ab28b5d049090ff138b542408895304b801000000c20800833905755f8b5104f6c201740783fa017d08eb21f642ff10751b8b5c24048b1bf6c2017409f6c30174043bd3eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13f6c201740583c2027105ff5538ebf68b5c24048b742408897453feb801000000c20800833901740cb870287fb28b5d049090ff138b5104f6c201740583c2027105ff5538ebf6f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0ab8b0f57ab28b5d04ff13f6c201740583c2027105ff5538ebf68b742408897453feb801000000c208000000000028010000|@8616,31,@838|8,0,@8613 46,0,@6397 65,0,0 126,0,@6397 165,0,0 178,0,@8613 252,0,@6397 285,0,0 8613:O4|@4608,@5398,@8615,@8614 8614:O5|@8433,421,0,421,0 8615:S14|4e6f7420616e2045787472616374 8616:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129657874656e644c696665283129 8617:D3,208|3b650c7303ff5524a801756b53ff30ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b4004909090e8caffffff8b0c248b1183c40450ff7104ff32ff742428ff742428ff742428ff742428ff742428ff7424288b5c24448b42048b54242490ff128b4d008d49f03b4d08730aeb05e941000000ff5520894d00c741fc030000008b5424048951088941045883c40489018b45008d40f43b45087303ff5520894500c740fc020000005a83c4048950048908c21c00b801000000c21c0090909000000000cc000000|@8592,1048575,@839|190,0,0 8618:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@840|64,0,0 8619:D3,692|3b650c7303ff5524a80175718b08baffffff002353fc8d541201be01000000f7c601000000740cf6c20174078d76ff03f27105ff5538ebf48b7c24248b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77e108b7004b8d01e7fb28b5d04909090ff1389de8b7c2424ff7104ff3189d1d1e983c704eb05e922020000f3a58d7c3f018d7436018d4c09018b542428b9ffffff00234afc8d4c0901be01000000f7c601000000740cf6c10174078d76ff03f17105ff5538ebf48b7c24248b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77e0e8b7004b8d01e7fb28b5d0490ff1389d68b7c2424d1e983c704f3a58d7c3f018d7436018d4c090153ff7004ff742434ff742430ff742428ff742428ff742428ff7424288b5c243c8b4424208b5424409090ff128b4c24348b0983f9017507b968c05208eb5689ca89d189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74243489f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c189d88b54242c8b1283fa017507ba68c05208eb5f89cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242c89f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89ca83c40489d98b5d008d5bdc3b5d087303ff5520895d00c743fc02000000894b0489138d4b0cc741fc020000008b54240c89510489018d410cc740fc02000000895804890850ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c242c8b4424289090e882fdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c22400b801000000c2240000000000b0020000|@6329,1048575,@841|15,0,8388607 27,0,0 93,0,@8594 149,0,8388607 161,0,0 227,0,@8594 318,0,I49 331,0,0 422,0,I49 435,0,0 677,0,0 8620:D3,332|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b08833b0175048b11eb5d8b11833a1b755b8b70048b7904ff7208ff72048b03e802010000833c24017410ff73048b5c24049090e86e010000eb03ff73048b55008d52f03b55087303ff5520895500c742fc030000008b4c2408894a08894204c7021b000000eb51e93f0000008b70048b79046a016a01ff7304528b03909090e87a0100008b55008d52f03b55087303ff5520895500c742fc0300000059894a08894204c7021b000000eb0d6a016a01ff73048b79048b70048b45008d40f43b45087303ff5520894500c740fc020000008978048910508b5c240489f0909090e8e2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c390900000000048010000|@8211,63,@845|19,0,@8209 30,0,0 46,0,@8209 90,1,@8621 110,1,@8622 155,0,13 186,1,@8623 223,0,13 8621:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70103000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@842|43,0,1 92,0,0 8622:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@843| 8623:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70103000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@844|43,0,1 92,0,0 8624:D3,352|8b0bba01000000ff7004513b1424735c89d1f6c101740583c1027105ff5538ebf68b4c4bfef6c20174128b38beffffff002377fc8d7436013bd6720d8b30b8cc7b7ab28b5d0490ff138b7457fe83fe01742883f901750489f1eb1ff6c1017411f7c60100000074093bceeb0ae931000000ff5538ebf27c0289f189d6f7c601000000740583c6027105ff5538ebf6894c73fe83c2023b650c7303ff5524e969ffffff8b44240c83c4048b00b9010000003bc8720d89c1b80100000083c404c2040089caf6c201740583c2027105ff5538ebf68b5c24088b5453fef6c10174138b3c24beffffff002377fc8d7436013bce720f89c6b8cc7b7ab28b5d04909090ff138b744ffe83fe01742383fa01750489f2eb1af6c201740cf7c60100000074043bd6eb05ff5538ebf77c0289f289cef7c601000000740583c6027105ff5538ebf6895473fe83c1023b650c7303ff5524e95bffffff909090000000005c010000|@8625,63,@846|3,0,0 45,0,8388607 63,0,@5401 172,0,0 183,0,0 227,0,8388607 245,0,@5401 8625:S71|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f646528332961646446726f6d5361766564283129 8626:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@847| 8627:D3,1548|83380375688b0bf6c101740583c1027105ff5538ebf6890b8b4c24108b09f6c101740783f9017e08eb13f641ff10740d8b4804b8f0ea7ab28b5d04ff138b4c24108b490483f901750b8b4c240c8b0983f102eb05b9010000008b1b8b5424108b12f6c201740c83fa017e0deb18e9b9000000f642ff10740d8b5004b8f0ea7ab28b5d04ff138b5424108b520483fa01742083fb01750489d3eb17f6c3017409f6c20174043bdaeb05ff5538ebf77c0289d38b5424108b12f6c201740783fa017e08eb16f642ff1074108b5004b8b0f57ab28b5d04909090ff138b542410895a048b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4004894304c703030000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000d000000c2100083380775658b03a801740583c0027105ff5538ebf689038b4424108b00a801740783f8017e08eb12f640ff10740cb8f0ea7ab28b5d049090ff138b4424108b400483f801750b8b44240c8b0083f002eb05b8010000008b1b8b4c24108b09f6c101740c83f9017e0deb18e997000000f641ff10740d89c1b8f0ea7ab28b5d0490ff138b4c24108b490483f901742083fb01750489cbeb17f6c3017409f6c10174043bd9eb05ff5538ebf77c0289cb8b4c24108b09f6c101740783f9017e08eb12f641ff10740c89c1b8b0f57ab28b5d04ff138b4c241089590489c28b45008d40f03b45087303ff5520894500c740fc03000000895008c74004c4777ab2c7000d000000c21000833805756d8b0bf6c101740583c1027105ff5538ebf6890b8b4804f6c101740783f9017d08eb21f641ff10751b8b5424088b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0cb8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b5424088b4c4afe83f9017560eb05e9820100008b4804f6c101740783f9017d08eb24f641ff10751e8b7424048b36f6c101740cf7c60100000074043bceeb05ff5538ebf77c0ab8f0ea7ab28b5d04ff13f6c101740583c1027105ff5538ebf68b7424048b4c4efe83f102eb05b9010000008b1b8b7004f7c601000000740783fe017d08eb20f646ff10751a8b12f7c6010000007409f6c20174043bf2eb05ff5538ebf77c0bb8f0ea7ab28b5d0490ff13f7c601000000740583c6027105ff5538ebf68b5424088b7472fe83fe01742383fb01750489f3eb1af6c301740cf7c60100000074043bdeeb05ff5538ebf77c0289f38b7004f7c601000000740783fe017d08eb20f646ff10751a8b12f7c6010000007409f6c20174043bf2eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13f7c601000000740583c6027105ff5538ebf68b542408895c72fe8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4004894304c703050000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000d000000c210008b0bf6c101740583c1027105ff5538ebf6890b8b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017d08eb21f641ff10751b8b5424108b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0d8b5004b8f0ea7ab28b5d04ff13f6c101740583c1027105ff5538ebf68b5424108b4c4afe83f901750b8b4c240c8b0983f102eb05b9010000008b7004f7c601000000740583c6027105ff5538ebf68b1b8b7804f7c701000000740583c7027105ff5538ebf6f7c701000000740783ff017d08eb20f647ff10751a8b12f7c7010000007409f6c20174043bfaeb05ff5538ebf77c0d8b5004b8f0ea7ab28b5d04ff13f7c701000000740583c7027105ff5538ebf68b5424108b7c7afe83ff01742383fb01750489fbeb1af6c301740cf7c70100000074043bdfeb05ff5538ebf77c0289fbf7c601000000740783fe017d08eb20f646ff10751a8b12f7c6010000007409f6c20174043bf2eb05ff5538ebf77c0f8b5004b8b0f57ab28b5d049090ff13f7c601000000740583c6027105ff5538ebf68b542410895c72fe8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4004894304c703010000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000d000000c2100090900000000008060000|@8628,63,@848|52,0,@6373 85,0,0 124,0,@6373 205,0,@6397 256,0,1 292,0,6 346,0,@6373 381,0,0 419,0,@6373 500,0,@6397 548,0,@5383 554,0,6 634,0,@6373 732,0,@6373 770,0,0 827,0,@6373 954,0,@6397 1023,0,2 1059,0,6 1152,0,@6373 1201,0,0 1300,0,@6373 1426,0,@6397 1495,0,0 1531,0,6 8628:S66|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296c6f6361646472283129 8629:O1|11 8630:D3,176|3b650c7303ff5524a801757053ff30ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b4004909090e8caffffff8b0c2450ff7104ff742428ff742428ff742428ff742428ff742428ff7424288b5c24448b018b54242490ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000eb05e91c0000005a89510489018d410cc740fc020000005a83c4088950048908c21c00b801000000c21c0090909000000000ac000000|@8592,1048575,@849|158,0,0 8631:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@850| 8632:D3,1544|3b650c7303ff5524a80175688b088339037566ff710453ff742428ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b480489c890e8beffffff50ff742428ff742428ff742428ff742428ff742428ff7424288b5c24448b4424208b54241c90ff1283381b75648b4d00eb0ae97c050000e98e0000008d49e83b4d087303ff5520894d00c741fc020000008b5008895104c701030000008d590cc743fc020000008b3424897304890b83fb01750b8b480489c883c40cc220008b480489c883c40c5983c42051e9490500008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc020000008b1424895004890883c40cc2200083390575608b5104be0100000053ff7004ff7104f6c20175328b028b480483fe0175058b5908eb128b7a0489f38b410890e83205000089c3eb038b7a0489de89fa3b650c7303ff5524ebc989f08b0c24f6c101756d8b118b1af6c301740c83fb017d0deb29e91b020000f643ff10751e8b7424288b36f6c301740cf7c60100000074043bdeeb05ff5538ebf77c0f89c6b8f0ea7ab28b5d04909090ff13f6c301740583c3027105ff5538ebf68b7424288b5c5efe83fb01741489c3b84c407fb2eb05e9730000008b5d0490ff138b1af6c301740783fb017d08eb24f643ff10751e8b7c24188b3ff6c301740cf7c70100000074043bdfeb05ff5538ebf77c0e89c7b8b0f57ab28b5d049090ff13f6c301740583c3027105ff5538ebf68b7c2418c7445ffe010000008b510489d13b650c7303ff5524e916ffffffb90100000050ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c242c8b44242890e886fdffff8b4c24188b09f6c101740583c1027105ff5538ebf68b542418890a50ff742434ff742434ff742434ff742434ff742434ff742434528b5c242c8b4424209090e85a040000909090e826050000909090e88e05000050ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24388b4424289090e8e20500008b5c2434909090e8c6060000a8017422837c24040175075883c414c220008b5c24048b042483c4185983c42051e94c0800008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70105000000837c24040175058b0424eb1389ce8b5c24048b0424909090e86608000089f189c28b45008d40f43b45087303ff5520894500c740fc02000000895004890883c418c220008b5104f6c201740783fa017d08eb24f642ff10751e8b74241c8b36f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b74241c8b5456fe83fa0174108b5004b8a8457fb28b5d04909090ff138b5104f6c201740783fa017d08eb24f642ff10751e8b7c240c8b3ff6c201740cf7c70100000074043bd7eb05ff5538ebf77c0d8b7804b8b0f57ab28b5d04ff13f6c201740583c2027105ff5538ebf68b7c240cc74457fe0100000053ff7104ff7108ff74242c56ff74242cff74242cff74242c57ff74242cff74242c8b480489c8909090e87afbffff8b4c2404f6c101740783f9017d08eb21f641ff10751b8b5424288b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b5424288b4c4afe8b5c24148b1bf6c301740583c3027105ff5538ebf68b742414891e83f901751550518b442408909090e87207000083f8017410eb045051eb0a83c4045883c40cc22000ff742430ff742430ff742430ff742430ff742430ff7424308b5c244c8b4424208b54242890ff128b4c240cf6c101740783f9017d08eb21f641ff10751b8b5424308b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8b0f57ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b542430c7444afe010000008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b1c2489590c8941088b44240c894104c701010000008b45008d40f43b45087303ff5520894500c740fc020000008b5c2404895804890883c414c22000b801000000c220009090900000000004060000|@8651,2097151,@861|155,0,1 207,1,@8633 240,0,1 277,0,0 318,1,@8634 413,0,@6373 456,0,@8635 526,0,@6397 560,0,0 583,0,0 698,1,@8638 706,1,@8639 714,1,@8640 758,1,@8641 770,1,@8642 808,1,@8644 841,0,2 870,1,@8645 968,0,@6373 1009,0,@8646 1076,0,@6397 1108,0,0 1210,0,@6373 1286,1,@8649 1402,0,@6397 1436,0,0 1482,0,0 1526,0,0 8633:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@851| 8634:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@852| 8635:O4|@4608,@5398,@8637,@8636 8636:O5|@8433,500,0,500,0 8637:S21|6170706c79466e3a20416c72656164792075736564 8638:D3,192|3b650c7303ff5524a80175718b48048b108b45008d40f43b45087303ff5520894500c740fc02000000895004c7000d0000005351ff742420ff742420ff742420ff742420ff742420ff7424208b5c243c8b54241cff1250ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b442420eb05e92e000000909090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c0000000000bc000000|@6329,1048575,@853|46,0,6 177,0,0 8639:D3,92|3b650c7303ff5524a80175418b0883390d753083790803752a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,3,@854|78,0,0 8640:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70103000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@855|43,0,1 92,0,0 8641:D3,220|3b650c7303ff5524a80175728b088b510453ff7004ff31ff7208ff720cff7210ff7214ff7218ff74243cff74243cff74243cff74243cff74243cff74243cff74243c8b5a048b028b54243890ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c741080100000089410458890151ff742428ff742428eb05e949000000ff742428ff742428ff742428ff742428ff7424288b5c24248b4424209090e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c0000000000d8000000|@6329,1048575,@856|105,0,0 205,0,0 8642:D3,300|3b650c7303ff5524a801755f8b088b11f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0d8b7004b8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b5453fe83fa01750f8b480489c8e995ffffffe9ab0000008b31f7c601000000740783fe017d08eb23f646ff10751d8b3bf7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0d8b7804b8b0f57ab28b5d04ff13f7c601000000740583c6027105ff5538ebf6c74473fe010000008b75008d76f03b75087303ff5520897500c746fc030000008956088b51048956048b39893e56ff700458e806ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000028010000|@8643,63,@857|64,0,@6373 168,0,@6397 199,0,0 284,0,0 8643:S98|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129636f7079456e7472696573283129 8644:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@858| 8645:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@859| 8646:O4|@4608,@5398,@8648,@8647 8647:O5|@8433,462,0,462,0 8648:S30|636f70794465636c61726174696f6e733a20416c72656164792075736564 8649:D3,648|3b650c7303ff55248b08ba12467fb28d548afcffe290e983000000909090e97b000000909090e984000000909090e9bb000000909090e9b9000000909090e9b7000000909090e95d010000909090e95b010000909090e95b010000909090e93b000000909090e933000000909090e92b000000909090e95b010000909090e91b000000909090e913000000909090e90b000000909090e9af0100009090908338137406b801000000c3b803000000c3ff700cff70088b400490e842ffffff83f80174228b0424909090e832ffffff83f801740983c40458e924ffffffb80100000083c408c3b80100000083c408c3b803000000c3b803000000c38b48088339077562f6410401740d8b5004b8ecd57ab28b5d04ff13ff7004ff71048b1c24b8cd00000090ff1508cd520883f801745c8b1c24b8cf00000090ff1568cd520881e0010000c081f8010000c075448b442404a801752e8b08ff70048b019090e89efeffffeb05e93900000083f801740b583b650c7303ff5524ebd7b80100000083c40cc3b80300000083c408c3e909000000b80100000083c408c3b80100000083c408c3b801000000c3b803000000c38b4004e94afeffffff70088b400490e83efeffff83f801740658e933feffffb80100000083c404c38b4804ff7008f6c10175508b018338037515ff71048b480489c890e80afeffff83f801742ceb1f8338057417ff71048b480889c8909090e8eefdffff83f8017410eb03ff7104593b650c7303ff5524ebb5b80100000083c404eb05b80300000083f801740658e9bffdffffb80100000083c404c38b4004a8017526ff70048b00909090e8a2fdffff83f801740b583b650c7303ff5524ebdfb80100000083c404c3b803000000c39090900000000084020000|@8650,2097151,@860|11,0,$8649+22 164,0,0 170,0,1 221,0,0 230,0,0 239,0,1 245,0,1 268,0,@6321 287,0,102 294,0,I150 307,0,103 314,0,I153 326,0,-536870912 378,0,0 387,0,1 401,0,0 410,0,0 419,0,0 425,0,1 462,0,0 552,0,0 562,0,1 578,0,0 623,0,0 632,0,1 8650:S50|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7369646545666665637446726565283129 8651:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129 8652:O4|@4608,@5398,@8521,@8653 8653:O5|@8433,567,0,567,0 8654:O4|@4608,@5398,@8524,@8655 8655:O5|@8433,569,0,569,0 8656:D3,156|3b650c7303ff5524a8017572ff3053ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b4004909090e8caffffff50ff742424ff742424ff742424ff742424ff742424ff7424248b5c24408b4424208b54241c90ff1289c18b45008d40f43b45087303ff5520894500c740fc020000005a83c408eb05e9080000008950048908c21c00b801000000c21c00900000000098000000|@8592,1048575,@862|140,0,0 8657:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129 8658:O2|@8659,@8588 8659:D3,488|3b650c7303ff5524b9010000008b74242cf7c601000000751cf6c101740583c1027105ff5538ebf68b76043b650c7303ff5524ebdcf6c101740583c1027105ff5538ebf6f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c16eb06f641ff10750e89c6b834f67ab28b5d049090ff1389cef7c601000000740583c6027105ff5538ebf689cf89f189c6b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f588907535752ff74243489fb89f08b54242c909090ff128b0c2450ff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b59048b44245ce8fa000000909090e8c60100008b4c24088b09ba0100000083f901744a89cb83eb0283e902f6c101740583c1027105ff5538ebf68b7424088b4c4efe8b7d008d7ff43b7d087303ff5520897d00c747fc02000000895704890f89d989fa3b650c7303ff5524ebb1f6c201740c89c1b81c777bb28b5d04ff13f6c201740f89c1b858777bb28b5d04909090ff1389c18b45008d40d83b45087303ff5520894500c740fc090000008b5a048958208b74243089701c8b3a8978188b7c24348978148b5424388950108b5c243c89580c8948088b4c240c8948045983c40c8908c2300090909000000000e4010000|@8665,1048575,@866|9,0,0 93,0,16777214 110,0,@6401 148,0,0 254,1,@8660 262,1,@8661 273,0,0 364,0,@6704 381,0,@6707 8660:D3,192|3b650c7303ff5524a8017570ff3053ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b4004909090e8caffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008b542404895004c7000d00000051ff742424ff742424ff742424ff742424ff742424ff7424248b5c2440eb05e92f0000008b54241c909090ff1289c18b45008d40f43b45087303ff5520894500c740fc020000005a83c4088950048908c21c00b801000000c21c0000000000bc000000|@8592,1048575,@864|89,0,6 177,0,0 8661:D3,136|3b650c7303ff5524a801756b8b0883390d740e8b5004b8fc4d7fb28b5d0490ff138b55008d52f03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c7020d000000528b780489f8e8aaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000084000000|@6329,63,@865|23,0,@8662 71,0,6 120,0,0 8662:O4|@4608,@5398,@8664,@8663 8663:O5|@8433,647,0,647,0 8664:S11|6d617020636c6f73757265 8665:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f70794c616d626461283729 8666:D3,1604|3b650c7303ff55248b4c24188b0983f9017507b968c05208eb6089ce89f189c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74241c89f989cf5189c1d1e983c604f3a58d7c3f018d7436018d4c09018b04248060ffbf89c183c404eb01508b4424188b0083f8017507b868c05208eb6489ce89c189c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74241c89f989cf518b4c2404d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89c689c883c40889f1525051ff742428ff742428ff742428ff742428ff742428ff74242889de8b5c244489f08b720489f2909090ff128b4c24288b0983f9017507b968c05208eb5689ca89d189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74242889f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c189d88b5424248b1283fa017507ba68c05208eb5f89cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242489f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89ca83c40489d98b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b0489138b1424b9ffffff00234afc8d4c0901be01000000f7c601000000740cf6c10174078d76ff03f17105ff5538ebf48b7c24288b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77e0f89c6b8d01e7fb28b5d04909090ff1389d683c4048b7c2424d1e983c704f3a58d7c3f018d7436018d4c09018b1424b9ffffff00234afc8d4c0901be01000000f7c601000000740cf6c10174078d76ff03f17105ff5538ebf48b7c24208b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77e0e89c6b8d01e7fb28b5d049090ff1389d683c4048b7c241cd1e983c704f3a58d7c3f018d7436018d4c09018b0c245053ff742428ff742428ff742428ff742428ff742428ff7424288b5c24448b4424488b5104909090ff128b4c24288b0983f9017507b968c05208eb5689ca89d189c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74242889f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c189d88b5424248b1283fa017507ba68c05208eb5f89cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74242489f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89ca83c40489d98b5d008d5bdc3b5d087303ff5520895d00c743fc02000000894b0489138d4b0cc741fc02000000c7410401000000891989c28d410cc740fc020000008948048b0c24890852ff742428ff742424ff7424248b5c243090e80accffffa801750ff640040175098b480483790401740c89c1b8e4547fb28b5d04ff13ff31ff30ff7424348b5c24348b442410e8aedcffff8b442414ff742434ff742434ff742434ff742434ff742434ff7424348b5c24508b48048b44243089ca90ff12833c240175068b4c2410eb6d8b4c241083391b754c89c38b71088b79048b0424909090e802dbffff83ff01740d5389fb909090e886010000eb01538b4d008d49f03b4d087303ff5520894d00c741fc03000000897108894104c7011b000000eb3e89c38b042490e896dbffff8b4d008d49f03b4d08730aeb05e920000000ff5520894d00c741fc030000008b542410895108894104c7011b00000053eb0150837c24080175068b44240ceb6b8b44240c83381b754e89cb8b70088b78048b4424089090e862daffff83ff01740d5389fb909090e83e010000eb015389c18b45008d40f03b45087303ff5520894500c740fc03000000897008894804c7001b000000eb4289cb8b4424089090e8f2daffff89c18b4500eb05e9280000008d40f03b45087303ff5520894500c740fc030000008b54240c895008894804c7001b00000053eb015189c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c598948085983c41c894804c70005000000c220000000000040060000|@8671,1048575,@869|20,0,I49 33,0,0 135,0,I49 148,0,0 298,0,I49 311,0,0 402,0,I49 415,0,0 536,0,8388607 548,0,0 613,0,@8594 657,0,8388607 669,0,0 734,0,@8594 830,0,I49 843,0,0 934,0,I49 947,0,0 1077,0,0 1122,1,@8596 1148,0,@8667 1174,1,@8624 1258,1,@8621 1274,1,@8669 1313,0,13 1326,1,@8623 1373,0,13 1418,1,@8621 1434,1,@8670 1475,0,13 1490,1,@8623 1539,0,13 1589,0,2 8667:O4|@4608,@5398,@8608,@8668 8668:O5|@8433,693,0,693,0 8669:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@867| 8670:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@868| 8671:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f7079436f6e64283329 8672:S56|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329 8673:O2|@8675,@8674 8674:O2|@8748,@8673 8675:D3,6964|3b650c7303ff55248b08bb7a567fb28d5c8bfcffe390e9d7010000909090e907030000909090e933060000909090e957070000909090e993070000909090e963000000909090e9d7070000909090e9930a0000909090e96f0b0000909090e9370c0000909090e90f0e0000909090e94b130000909090e949130000909090e90b140000909090e923150000909090e99a150000909090e9ff170000909090e9bf190000909090ff700cff70085289d38b4004909090e88e1a0000909090e8121d00008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70194747fb28d410cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13508b4424088b542404909090e8d2feffff837c240c017407b9f4737fb2eb05b900747fb28b55008d52f43b55087303ff5520895500c742fc02000000c74204010000005b83c40c891a8b5d008d5bb83b5d087303ff5520895d00c743fc02000000895304c7039c9a7ab28d530cc742fc02000000895a04890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c352ff700489d38b40089090e8461c0000909090e87e2100008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701a0a77cb28d410cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13508b4424048b542408909090e88afdffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701b89a7ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c3f6401001755c8b48108b19f6c301740783fb017d21eb06f643ff10741952ff700cff7008ff7004b88c6c7ab29090ff1588c75208eb0e8b700c8b7808525657ff700489d8bb05000000bafc317ab290e842d8faff89c3b8487a7fb2e8a6b1faffeb288378100374108b480c8b58088b7004b8547a7fb2eb0e8b480c8b58088b7004b8607a7fb2525153568b4d008d49e83b4d087303ff5520894d00c741fc02000000c741046c7a7fb289018d410cc740fc02000000894804c700847a7fb290e80eb7faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b542410909090e8cefbffff508b5c24148b44240c9090e8ee1f0000508b4424148b5424189090e8aefbffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701dc7d7fb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1350bbf87d7fb2b8047e7fb290e84eb0faffbbfb0000009090e842b0faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab283f90175058b0424eb0a89cb8b0424e8122200008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700b89a7ab28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480483c4045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c41089018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c352ff700cff70088b400490e892f9ffff508b4424048b54240c9090e882f9ffff508b44240c8b5424109090e872f9ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701687e7fb28d410cc740fc020000008948045989088b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc020000008948049090c700687e7fb28d480cc741fc020000008941045883c40c89018b45008d40dc3b45087303ff5520894500c740fc02000000894804c700747e7fb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c38b4004ba44a87cb2909090e85a4efdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c3bb030000008b4004bafc317ab29090e8ded3faff89c3b88c7e7fb2e842adfaff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c38b48048339077571837808017507ba48c05208eb05baa07e7fb28b5d008d5be83b5d087303ff5520895d00c743fc02000000c74304b07e7fb289138d430cc740fc02000000895804c700bc7e7fb290e886b2faff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000eb05e912000000a801740d89c1b8ecd57ab28b5d0490ff13c38339037572837808017507ba48c05208eb05baa07e7fb252bb030000008b4104bafc317ab29090e8e2d2faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104b07e7fb25a89118b55008d52e83b55087303ff5520895500c742fc02000000894a0489028d420cc740fc02000000eb05e944000000895004c700d07e7fb29090e8beb1faff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c38339017572837808017507ba48c05208eb05baa07e7fb252bb030000008b4104bafc317ab29090e822d2faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104b07e7fb25a89118b55008d52e83b55087303ff5520895500c742fc02000000894a0489028d420cc740fc02000000eb05e944000000895004c700e07e7fb29090e8feb0faff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c3837808017507ba48c05208eb05baa07e7fb252bb030000008b4104bafc317ab2909090e866d1faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104b07e7fb25a89118b55008d52e83b55087303ff5520895500c742fc02000000894a0489028d420cc740fc02000000895004c700f07e7fb290e84ab0faff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c352ff7004bb030000008b4008bafc317ab29090e8c2d0faff89c3b8007f7fb2e826aafaffbb44d77cb29090e81aaafaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b542408909090e8a6f4ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc020000008948045983c408890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c352ff70088b4004e82af4ffff508b4424048b5424089090e81af4ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a8ca7cb28d410cc740fc020000008948045983c40889088b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701c0ca7cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c383780c017507b9147f7fb2eb05b9287f7fb28b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b04c70307000000f6c30174138b48048b7008b8ecd57ab28b5d04909090ff135253ff70048b4008e80ef3ffff50bb51000000b83c7f7fb2e82ea8faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24108b442408909090e8a21b0000909090e8b21c00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c38b48048b5d008d5bf43b5d087303ff5520895d00c743fc020000008b7104897304c70307000000f6c301740bb8ecd57ab28b5d0490ff1383791c017407bfc0807fb2eb05bfcc807fb25253ff31ff7108ff7114ff7120ff710cff7110ff711889fbb8dc807fb290e84aa6faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bb030000008b442404bafc317ab290e892ccfaff89c3b8e8807fb2e8f6a5faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1351bb030000008b44240cbafc317ab290e83eccfaff89c3b8f4807fb2e8a2a5faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389cb8b4424109090e8d21a00008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70100827fb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1353508b44241c9090e8821b00008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70190837fb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13837c2420017407b9f4737fb2eb05b900747fb28b55008d52d03b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c701b0837fb28d510cc742fc05000000894a10c7420c01000000c7420801000000c7420403000000c70201000000f6c201740c89c1b8ecd57ab28b5d04ff135052bb51000000b8c8837fb2e80ea4faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c243c8b442430909090e80e1c0000909090e81e1d00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b4424348b54243c909090e81aeeffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741044c857fb289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045983c41c89088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40489088b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70078857fb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c3b8e4d37cb2c352ff7004bb51000000b800d47cb2909090e856a1faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24088b442404909090e8121b0000909090e8521d00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c352ff7008ff7004bb51000000b838887fb29090e88aa0faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442408518b58048b442404e8fa1c0000508b44240c8b5424109090e806ebffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab283f80175058b0424eb0a89c38b0424e8ba1d00008b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c4045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c3528b4004909090e846eaffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7001cd77cb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c404c38b4808bb01000000be0100000052ff7004ff700cff31ff70083b742404736489f083c0028b0c246a016a015350ff71048d54240c52bb1100000089f0909090ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae936000000b80300000083f00283f80174128b442404a801740583c0027109ff5538ebf68b4424045e83c40c89c33b650c7303ff5524e95bffffff89d8bb03000000bafc317ab29090e8c2c4faff50bb030000008b442408bafc317ab2e8aec4faff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410438d77cb289018d410cc740fc02000000894804c7005f0000008d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c70050d77cb29090e87ea3faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b44240c8b542414909090e83ee8ffff508b4424148b5424189090e82ee8ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc020000008948045983c414890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c38b4804f6c101740783f9017d21eb06f641ff10741952ff7008ff700c89cbb88c6c7ab2909090ff1588c75208eb0b8b58088b700c89c8525356bb05000000bafc317ab2e8dec2faff8b0c24f6c101740783f9017d19eb06f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c852bb05000000bafc317ab29090e8a2c2faff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410468d77cb289018d410cc740fc02000000894804c70044d77cb28d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c70074d77cb2909090e86ea1faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b542408909090e82ee6ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c352ff7004bb51000000b8b8897fb290e8ba9afaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c24088b442404909090e8ae180000909090e8be1900008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c3909000000000301b0000|@8747,2097151,@889|11,0,$8675+22 182,1,@8676 190,1,@8680 223,0,@8681 243,0,0 250,0,1 257,0,1 263,0,0 274,0,@6321 310,0,@8677 317,0,@8678 348,0,0 387,0,@5592 421,0,@5592 456,0,0 463,0,0 470,0,3 476,0,0 487,0,@6321 510,1,@8683 518,1,@8687 551,0,@7414 571,0,0 578,0,1 585,0,1 591,0,0 602,0,@6321 657,0,@5642 678,0,@5643 697,0,@5594 716,0,@5643 769,0,0 776,0,0 783,0,3 789,0,0 800,0,@6321 850,0,@5215 858,0,I106 879,0,2 884,0,@5052 890,1,@5053 897,0,@8688 902,1,@4940 924,0,@8689 940,0,@8690 975,0,@8691 996,0,@8693 1002,1,@4953 1035,0,3 1045,0,@6321 1086,1,@8694 1133,0,0 1154,0,@5592 1173,0,@8695 1193,0,0 1200,0,0 1207,0,1 1213,0,0 1224,0,@6321 1235,0,@8697 1240,0,@8698 1246,1,@4940 1251,0,125 1258,1,@4940 1291,0,3 1301,0,@6321 1340,0,0 1361,0,@5592 1410,0,@5592 1430,1,@8699 1463,0,@5592 1482,0,@5594 1501,0,@5592 1587,0,0 1594,0,1 1601,0,1 1607,0,0 1618,0,@6321 1705,0,@5642 1726,0,@5643 1745,0,@8700 1794,0,@5643 1815,0,@8700 1867,0,@8701 1889,0,0 1896,0,1 1903,0,1 1909,0,0 1920,0,@6321 1934,0,@7425 1942,1,@7427 1977,0,3 1988,0,@6321 1999,0,1 2007,0,@5052 2014,1,@5053 2021,0,@8703 2026,1,@4940 2061,0,3 2072,0,@6321 2097,0,I48 2104,0,@8704 2135,0,@8705 2156,0,@8706 2162,1,@4953 2197,0,3 2215,0,@6321 2238,0,I48 2245,0,@8704 2251,0,1 2259,0,@5052 2266,1,@5053 2297,0,@8705 2355,0,@8707 2362,1,@4953 2397,0,3 2408,0,@6321 2430,0,I48 2437,0,@8704 2443,0,1 2451,0,@5052 2458,1,@5053 2489,0,@8705 2547,0,@8708 2554,1,@4953 2589,0,3 2600,0,@6321 2617,0,I48 2624,0,@8704 2630,0,1 2638,0,@5052 2646,1,@5053 2677,0,@8705 2728,0,@8709 2734,1,@4953 2769,0,3 2780,0,@6321 2795,0,1 2803,0,@5052 2810,1,@5053 2817,0,@8710 2822,1,@4940 2827,0,@7754 2834,1,@4940 2867,0,3 2877,0,@6321 2933,0,@5590 2976,0,0 2983,0,0 2990,0,0 2996,0,0 3007,0,@6321 3073,0,@5590 3094,0,@5592 3113,0,@7702 3165,0,@7704 3185,0,0 3192,0,0 3199,0,3 3205,0,0 3216,0,@6321 3233,0,@8711 3240,0,@8712 3273,0,3 3289,0,@6321 3316,0,40 3321,0,@8713 3326,1,@4940 3359,0,3 3369,0,@6321 3394,1,@8714 3402,1,@8715 3466,0,0 3473,0,1 3480,0,1 3486,0,0 3497,0,@6321 3536,0,@5590 3559,0,@5592 3611,0,@5592 3664,0,0 3671,0,0 3678,0,1 3684,0,0 3695,0,@6321 3741,0,3 3751,0,@6321 3768,0,@8716 3775,0,@8717 3804,0,@8718 3810,1,@4940 3843,0,3 3853,0,@6321 3867,0,1 3876,0,@5052 3882,1,@5053 3889,0,@8719 3894,1,@4940 3927,0,3 3937,0,@6321 3951,0,1 3960,0,@5052 3966,1,@5053 3973,0,@8720 3978,1,@4940 4011,0,3 4021,0,@6321 4042,1,@8721 4075,0,@8723 4095,0,0 4102,0,0 4109,0,1 4115,0,0 4126,0,@6321 4146,1,@8725 4179,0,@8727 4199,0,0 4206,0,0 4213,0,1 4219,0,0 4230,0,@6321 4249,0,@8677 4256,0,@8678 4287,0,0 4308,0,@8729 4328,0,0 4335,0,0 4342,0,1 4348,0,0 4360,0,@6321 4372,0,40 4377,0,@8731 4382,1,@4940 4415,0,3 4425,0,@6321 4450,1,@8732 4458,1,@8733 4522,0,0 4529,0,1 4536,0,1 4542,0,0 4553,0,@6321 4609,0,@8734 4630,0,@5592 4709,0,@5592 4758,0,@5592 4807,0,@5592 4919,0,@5592 4971,0,@5592 4990,0,@8737 5012,0,0 5019,0,1 5026,0,1 5032,0,0 5043,0,@6321 5055,0,@7734 5065,0,40 5070,0,@7736 5078,1,@4940 5111,0,3 5121,0,@6321 5146,1,@8739 5154,1,@8740 5221,0,0 5228,0,1 5235,0,1 5241,0,0 5252,0,@6321 5270,0,40 5275,0,@8741 5282,1,@4940 5315,0,3 5325,0,@6321 5350,1,@8742 5397,0,@5642 5418,0,@5592 5438,1,@8743 5508,0,0 5515,0,1 5522,0,1 5528,0,0 5539,0,@6321 5589,0,@5642 5610,0,@7751 5632,0,0 5639,0,1 5646,0,1 5652,0,0 5663,0,@6321 5681,0,0 5686,0,0 5731,0,8 5742,0,I104 5766,0,1 5779,0,31 5802,0,0 5814,0,1 5870,0,1 5875,0,@5052 5882,1,@5053 5888,0,1 5897,0,@5052 5902,1,@5053 5933,0,@7753 5954,0,47 6003,0,@7755 6010,1,@4953 6043,0,3 6053,0,@6321 6125,0,@5642 6146,0,@5592 6165,0,@5593 6184,0,@5643 6255,0,0 6262,0,0 6269,0,3 6275,0,0 6286,0,@6321 6329,0,@5215 6338,0,I106 6356,0,2 6361,0,@5052 6366,1,@5053 6395,0,@5215 6402,0,I106 6414,0,2 6419,0,@5052 6426,1,@5053 6457,0,@7756 6478,0,@7754 6530,0,@7757 6538,1,@4953 6571,0,3 6581,0,@6321 6637,0,@5642 6658,0,@5592 6711,0,0 6718,0,0 6725,0,3 6731,0,0 6742,0,@6321 6759,0,40 6764,0,@8744 6770,1,@4940 6803,0,3 6813,0,@6321 6838,1,@8745 6846,1,@8746 6913,0,0 6920,0,1 6927,0,1 6933,0,0 6944,0,@6321 8676:D3,564|3b650c7303ff5524a801756c83780401756b8b08ff71048b0189da90ff12833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420ceb0ae9a6010000e95e000000c740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c38b0853ff7004ff71048b0189da909090ff12833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c240c8b442408909090e812feffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c8908c3b801000000c39090900000000030020000|@8679,1048575,@871|37,0,@8677 44,0,@8678 75,0,0 96,0,@5592 143,0,0 150,0,0 157,0,1 163,0,0 174,0,@6321 214,0,0 249,0,@8677 256,0,@8678 287,0,0 308,0,@5592 343,0,0 350,0,0 357,0,1 363,0,0 374,0,@6321 412,0,@6617 434,0,0 441,0,0 448,0,0 454,0,0 465,0,@6321 523,0,@5592 548,0,0 8677:O2|3,71 8678:O2|3,70 8679:S34|4261636b656e64496e7465726d656469617465436f64652e704c6973742833292829 8680:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@872|56,0,@5642 8681:O2|3,@8682 8682:S2|2428 8683:D3,1280|3b650c7303ff5524a801757083780401756f8b088b11ff7104ff720453ff7208bb030000008b02bafc317ab290e846bdfaff50bb030000008b442404bafc317ab2e832bdfaff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104c0797fb289018d410cc740fc02000000894804c700f7000000eb0ae96e040000e9c20100008d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c700dc797fb2909090e8f29bfaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424088b5424049090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c38b088b1153ff7004ff7104ff7204ff7208bb030000008b02bafc317ab2e80ebbfaff50bb030000008b442404bafc317ab2e8fabafaff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104c0797fb289018d410cc740fc02000000894804c700f70000008d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c700dc797fb2909090e8c699faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b5424109090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c240c8b442408909090e846fbffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c8908c3b801000000c390909000000000fc040000|@8679,2097151,@873|33,0,1 40,0,@5052 46,1,@5053 52,0,1 61,0,@5052 66,1,@5053 97,0,@8684 118,0,123 182,0,@8686 190,1,@4953 223,0,3 233,0,@6321 285,0,0 306,0,@5592 359,0,0 366,0,0 373,0,1 379,0,0 390,0,@6321 408,0,@8677 415,0,@8678 446,0,0 467,0,@5592 502,0,0 509,0,0 516,0,1 522,0,0 533,0,@6321 574,0,0 602,0,1 609,0,@5052 614,1,@5053 620,0,1 629,0,@5052 634,1,@5053 665,0,@8684 686,0,123 738,0,@8686 746,1,@4953 779,0,3 789,0,@6321 841,0,0 862,0,@5592 915,0,0 922,0,0 929,0,1 935,0,0 946,0,@6321 964,0,@8677 971,0,@8678 1002,0,0 1023,0,@5592 1058,0,0 1065,0,0 1072,0,1 1078,0,0 1089,0,@6321 1128,0,@6617 1150,0,0 1157,0,0 1164,0,0 1170,0,0 1181,0,@6321 1239,0,@5592 1264,0,0 8684:O2|@8685,0 8685:S8|20757365737d203d 8686:S6|4445434c2023 8687:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@874|56,0,@5642 8688:S4|54414720 8689:S3|494e54 8690:S4|574f5244 8691:O2|@8692,0 8692:S2|2028 8693:S5|4341534520 8694:D3,820|3b650c7303ff5524a801756c83780401756b8b088b5104f6c201740783fa017d1beb06f642ff107413ff315389d3b88c6c7ab290ff1588c75208eb0589d0ff3153bb05000000bafc317ab29090e83eb7faffbb750000009090e8a290faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000eb0ae9a6020000e9db000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424088b5424049090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b088b5104f6c201740783fa017d20eb06f642ff10741853ff7004ff3189d3b88c6c7ab2909090ff1588c75208eb098b700489d05356ff31bb05000000bafc317ab29090e8eab5faffbb750000009090e84e8ffaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b54240c9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e812fdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000030030000|@8679,2097151,@875|47,0,@5215 54,0,I106 66,0,2 71,0,@5052 78,1,@5053 83,0,58 90,1,@4940 135,0,3 145,0,@6321 197,0,0 218,0,@5592 271,0,0 278,0,1 285,0,1 291,0,0 302,0,@6321 342,0,0 381,0,@5215 390,0,I106 406,0,2 411,0,@5052 418,1,@5053 423,0,58 430,1,@4940 463,0,3 473,0,@6321 525,0,0 546,0,@5592 599,0,0 606,0,1 613,0,1 619,0,0 630,0,@6321 668,0,@6617 690,0,0 697,0,0 704,0,0 710,0,0 721,0,@6321 779,0,@5592 804,0,0 8695:O2|3,@8696 8696:S5|454c53453a 8697:S4|43415345 8698:S3|29207b 8699:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@876| 8700:O2|3,@7754 8701:O2|3,@8702 8702:S3|494628 8703:S10|434f4e5441494e455220 8704:S6|2c206c617374 8705:O2|41,0 8706:S10|52454355525349564528 8707:S5|434c4f5328 8708:S6|504152414d28 8709:S6|4c4f43414c28 8710:S9|494e44495245435428 8711:S10|4b494c4c414654455228 8712:S11|4b494c4c4245464f524528 8713:S6|204b494c4c3d 8714:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@8679,1048575,@877|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 8715:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@878|56,0,@5642 8716:S4|74727565 8717:S5|66616c7365 8718:S3|434c3d 8719:S4|2043523d 8720:S8|204c4f43414c533d 8721:D3,172|3b650c7303ff5524a80175708378040175358338017407b8f4737fb2eb05b800747fb289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38338017407b9f4737fb2eb05b900747fb2518b400490e89effffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000eb05e91a000000894104c7019c9a7ab28d410cc740fc02000000894804598908c3b801000000c390909000000000a8000000|@8722,3,@879|24,0,@8677 31,0,@8678 64,0,0 77,0,@8677 84,0,@8678 134,0,@5592 156,0,0 8722:S50|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172675479706573283129 8723:O2|3,@8724 8724:S5|415247533d 8725:D3,292|3b650c7303ff5524a801756e83780401756dbb030000008b00bafc317ab2909090e8e2affaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000eb0ae994000000e9030000008908c3ff7004bb030000008b00bafc317ab2909090e86aaffaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b442404909090e822ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4048908c3b801000000c39090900000000020010000|@8726,2097151,@880|19,0,1 26,0,@5052 34,1,@5053 67,0,3 77,0,@6321 116,0,0 139,0,1 146,0,@5052 154,1,@5053 187,0,3 197,0,@6321 251,0,@5592 276,0,0 8726:S49|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172674c696665283129 8727:O2|3,@8728 8728:S9|4152474c495645533d 8729:O2|3,@8730 8730:S4|5245533d 8731:S6|20434c4f533d 8732:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@8679,1048575,@881|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 8733:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@882|56,0,@5642 8734:O2|@8735,0 8735:O2|3,@8736 8736:S9|297b4c414d4244417d 8737:O2|3,@8738 8738:S7|4c414d42444128 8739:D3,564|3b650c7303ff5524a801756c83780401756b8b08ff71048b0189da90ff12833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420ceb0ae9a6010000e95e000000c740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c38b0853ff7004ff71048b0189da909090ff12833c24017407b9f4737fb2eb05b900747fb28b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c240c8b442408909090e812feffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c8908c3b801000000c39090900000000030020000|@8679,1048575,@883|37,0,@8677 44,0,@8678 75,0,0 96,0,@5592 143,0,0 150,0,0 157,0,1 163,0,0 174,0,@6321 214,0,0 249,0,@8677 256,0,@8678 287,0,0 308,0,@5592 343,0,0 350,0,0 357,0,1 363,0,0 374,0,@6321 412,0,@6617 434,0,0 441,0,0 448,0,0 454,0,0 465,0,@6321 523,0,@5592 548,0,0 8740:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@884|56,0,@5642 8741:S5|424c4f434b 8742:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410498d67cb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@8679,1048575,@885|55,0,0 101,0,@7740 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 8743:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@886| 8744:S9|524543434f4e535452 8745:D3,260|3b650c7303ff5524a801757583780401752c8b0089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c353ff70048b0089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000eb05e96d000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e842ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000000010000|@8679,1048575,@887|55,0,0 101,0,@6617 123,0,0 137,0,0 144,0,0 150,0,0 161,0,@6321 219,0,@5592 244,0,0 8746:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@888|56,0,@5642 8747:S33|4261636b656e64496e7465726d656469617465436f64652e707265747479283129 8748:D3,616|3b650c7303ff552483380375088b40048b5204ff22833805756d52ff7004bb51000000b8e88d7fb290e8fa7ffaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442404518b58048b442404e81a020000909090e8660600008b4d008d49f43b4d08730aeb05e95e000000ff5520894d00c741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c352ff7008ff700cbb030000008b4004bafc317ab2909090e8b2a5faff50bb030000008b442404bafc317ab2e89ea5faff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104c0797fb289018d410cc740fc02000000894804c700f70000008d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c700dc797fb2909090e86a84faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442404518b50048b442404909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c390900000000064020000|@8756,2097151,@892|31,0,40 36,0,@8749 42,1,@4940 75,0,3 85,0,@6321 110,1,@8750 118,1,@8755 192,0,0 199,0,1 206,0,1 212,0,0 223,0,@6321 242,0,1 250,0,@5052 258,1,@5053 264,0,1 273,0,@5052 278,1,@5053 309,0,@8684 330,0,123 382,0,@8686 390,1,@4953 423,0,3 433,0,@6321 489,0,0 510,0,@5592 563,0,0 570,0,0 577,0,1 583,0,0 594,0,@6321 8749:S6|4d555455414c 8750:D3,1036|3b650c7303ff5524a801756c83780401756b8b08ff710453ff7108bb030000008b01bafc317ab29090e8fea3faff50bb030000008b442404bafc317ab2e8eaa3faff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104c0797fb289018d410cc740fc02000000894804c700f7000000eb0ae97e030000e94f0100008d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c700dc797fb2909090e8aa82faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc020000008b542404895004c70015000000518b54240490ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b0853ff7004ff7104ff7108bb030000008b01bafc317ab2e83ea2faff50bb030000008b442404bafc317ab2e82aa2faff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104c0797fb289018d410cc740fc02000000894804c700f70000008d480cc741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c700dc797fb2909090e8f680faff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc020000005a895004c70015000000518b542408ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410418927fb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13508b5c24088b442404909090e83afcffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c3b801000000c39090900000000008040000|@8679,2097151,@890|28,0,1 35,0,@5052 42,1,@5053 48,0,1 57,0,@5052 62,1,@5053 93,0,@8684 114,0,123 178,0,@8686 186,1,@4953 219,0,3 229,0,@6321 274,0,10 313,0,0 334,0,@5592 387,0,0 394,0,0 401,0,1 407,0,0 418,0,@6321 458,0,0 478,0,1 485,0,@5052 490,1,@5053 496,0,1 505,0,@5052 510,1,@5053 541,0,@8684 562,0,123 614,0,@8686 622,1,@4953 655,0,3 665,0,@6321 707,0,10 745,0,0 766,0,@5592 816,0,0 823,0,0 830,0,1 836,0,0 847,0,@6321 884,0,@8751 906,0,0 913,0,0 920,0,0 926,0,0 937,0,@6321 995,0,@5592 1020,0,0 8751:O2|@5643,@8752 8752:O2|@8753,0 8753:O2|3,@8754 8754:S5|20414e4420 8755:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@891|56,0,@5642 8756:S40|4261636b656e64496e7465726d656469617465436f64652e70726574747942696e64696e67283129 8757:D3,560|8d7c24a83b7d0c7303ff552883381575728b48048b41108b51148b71208b790cff31ff7104b90300000050b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f5357525657538b5c2420b8010000009090e8ce0100006a016a016a016a018b5d00eb05e9b60000008d5bf43b5d087303ff5520895d00c743fc02000000c703ac9e7fb28943048063ffbf506a01ff742428ff74241cff742424ff742438ff742430ff7424388d4c2420518b442450909090e8fe4b0000ff742408ff742410ff7424188b5c24108b44240c909090e8ae4b02008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d02d86b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c434c20400b90300000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f5352575753bb182e86b2b80100000090e8b60000006a016a016a016a01506a016a016a016a03ff742434ff742428ff7424348d4c242051bb2c2e86b28b442438e8164b0000ff742408ff742410ff7424188b5c24108b44240c909090e8c64a02008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a82e86b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c420c204009090000000002c020000|@11840,2097151,@2148|38,0,1 44,0,0 107,0,0 114,1,@8758 159,0,@8773 210,1,@8993 238,1,@9758 268,0,@11831 306,0,0 319,0,1 326,0,0 383,0,@11833 388,0,0 394,1,@8758 433,0,@11834 442,1,@8993 470,1,@9758 500,0,@11839 538,0,0 8758:D3,1120|3b650c7303ff552489c7538b442408ba90997fb290e866040000b91f00000089c2b80100000089fb8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b45008d40d43b45087303ff5520894500c740fc02000000897804c700010000008d480cc741fc0100004089018d4108c740fc01000040c700010000008d7008c746fc01000040c706010000008d7e08c747fc01000040c70701000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c707f9ffff07578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000538b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000538b5c243452f6c30175378b13813ac4e539b2751e8b55008d52f83b55087303ff5520895500c742fc010000008b1b891aeb148b530489d33b650c7303ff5524ebc4ba0100000083fa01756cba7c787cb2f6c20175378b1a813bc4e539b2751e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b128913eb148b5a0489da3b650c7303ff5524ebc4bb0100000083fb01750c89c2b8287c7cb28b5d04ff138b13813ac4e539b2741250b854eb7ab28b5d04eb05e907000000ff138b5a08eb1c8b1a813bc4e539b2740d50b854eb7ab28b5d049090ff138b530889d38b5424385053f6c20175378b0290908138bce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008903eb148b420489c23b650c7303ff5524ebc4bb0100000083fb017569b87c787cb2a80175358b10813abce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b500489d03b650c7303ff5524ebc7bb0100000083fb01750bb8287c7cb28b5d0490ff138b0390908138bce539b27414b854eb7ab28b5d04eb05e90a000000909090ff138b5008eb1a8b038138bce539b2740db854eb7ab28b5d04909090ff138b50088b45008d40a03b45087303ff5520894500c740fc01000040c7000100000089c38d4008c740fc15000000528b5424048950508b54241889504c8b5424308950485a83c4048950448b54242c8950408b54241c89503c8b5424408950388b5424208950348b54241489503089582c8b5424308950288b5424248950248b5424088950208b54241889501c8b54240c8950188b5424048950148b54243489501089700c8948088978045983c4348908c20800000000005c040000|@8772,63,@897|16,0,@8759 22,1,@8760 27,0,15 34,0,0 116,0,0 144,0,0 160,0,0 176,0,0 207,0,0 238,0,0 269,0,0 300,0,67108860 331,0,0 362,0,0 393,0,0 424,0,0 455,0,0 486,0,0 505,0,@4669 557,0,0 567,0,@7313 580,0,@4669 632,0,0 644,0,@7368 657,0,@4669 665,0,@6377 690,0,@4669 698,0,@6377 731,0,@4668 781,0,0 791,0,@7313 803,0,@4668 853,0,0 863,0,@7368 879,0,@4668 886,0,@6377 914,0,@4668 921,0,@6377 962,0,0 8759:O2|@8760,@4681 8760:D3,168|a80175348b088b193b5a04751c8b75008d76f83b75087303ff5520897500c746fc01000000890eeb148b700489f03b650c7303ff5524ebc8be0100000083fe017507b8589a7fb2eb198b068b083b4a04740bb854eb7ab28b5d0490ff138b480889c88b4d008d49e83b4d087303ff5520894d00c741fc01000040c70148c0520889c28d4108c740fc03000000c700849a7fb28948048950088060ffbfc390909000000000a4000000|@8771,31,@896|57,0,0 67,0,@8761 83,0,@6377 124,0,I48 142,0,@8763 8761:O1|@8762 8762:D3,16|b801000000c39090000000000c000000|@7374,1,@893|1,0,0 8763:D3,464|3b650c7303ff55248b4a048b095289c389c8909090e8f670faffa8017407b903000000eb068b088d4c09016a016a01ba01000000bb010000008d5bff03d93bd375458b5d008d5be03b5d087303ff5520895d00c743fc03000000894308894b04c703010000008d7310c746fc03000000894608c7460401000000891689e2891a89e2897204eb70a801751189d383c308d1eb0fb61c188d5c1b01eb0289c383fb15740d83c2023b650c7303ff5524eb8489d38b75008d76f03b75087303ff5520897500c746fc03000000894608895e04c7060100000089cb2bda83c3018b7d008d7ff03b7d087303ff5520897d00c747fc03000000eb05e911000000894708895f04891789e2893289e2897a048b4424048378040175258b0424ff70088b58048b0889c890e8e678fbff8b4c24088b49048901b80100000083c40cc38b4c24088b1424ff7108ff72088b5a048b02909090e8ba78fbff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff135a9090ff128b4424088b4804c70148c052086a01bb030000008b442408909090e836000000ff70088b58048b0889c890e85278fbff83c4085ae939feffff9000000000cc010000|@8770,1048575,@895|22,1,@4940 31,0,1 48,0,0 53,0,0 98,0,0 118,0,0 210,0,0 294,1,@6463 308,0,0 338,1,@6463 373,0,3 384,0,@6321 407,0,I48 414,0,1 426,1,@8764 442,1,@6463 8764:D3,304|f644240401756b8b4c2404f6c3017412f6c301740783fb017d1beb06f643ff1074138b50088b308b7804b8a8eb79b28b5d0490ff13f6010174148b11f6c201740783fa017d1beb06f642ff1074138b50088b308b7804b8a8eb79b28b5d0490ff1389de8d76ff03f23b700476188b7008eb05e9390000008b38b8ac9d7fb28b5d049090ff138d5bff03188b70088b45008d40f03b45087303ff5520894500c740fc030000008970088950048918c20400f6c3017412f6c301740783fb017d1aeb06f643ff1074128b48088b50048b30b8a8eb79b28b5d04ff133b580476138b48088b50048b30b8d89d7fb28b5d0490ff1389d98d49ff03088b50042bd383c2018b58088b45008d40f03b45087303ff5520894500c740fc030000008958088950048908c204009090000000002c010000|@8769,63,@894|43,0,@4877 87,0,@4877 122,0,@8765 208,0,@4877 231,0,@8767 8765:O4|11,@4879,0,@8766 8766:O5|@5017,131,0,131,0 8767:O4|11,@4879,0,@8768 8768:O5|@5017,121,0,121,0 8769:S35|566563746f72536c6963654f7065726174696f6e7328292e737562736c696365283329 8770:S40|5072657474792e67657453696d706c655072696e7465722831297072696e7453747265616d283129 8771:S26|5072657474792e67657453696d706c655072696e746572283129 8772:S29|5838364f5554505554434f444528292e636f6465437265617465283429 8773:D3,192|3b650c7303ff55248b45008d40dc3b45087303ff5520894500c740fc020000008b5204895004c700010000008b4c24088b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b4108909090e8620000008b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb9ca27fb28b44241490e8660300008b44240c83c404598908c7400401000000b801000000c208009000000000bc000000|@8992,2097151,@915|40,0,0 66,0,0 73,0,0 80,0,0 87,0,1 110,1,@8774 144,0,@8782 154,1,@8783 171,0,0 176,0,0 8774:D3,560|3b650c7303ff55248b088b0983390374108b1089c6b8c4a17fb28b5d049090ff138b51048b12f6c3017409f6c20174043bdaeb05ff5538ebf77d58f6c301740783fb017d08eb1ff643ff1075198b41048b00f6c3017408a80174043bd8eb05ff5538ebf77c0bb8b0f57ab28b5d0490ff13f6c301740583c3027105ff5538ebf68b49048b442404894459feb801000000c204008b51048b12ff710453ff30ff7004bb0700000089d0ff15c8c752088b4c2408f6c101740583c1027105ff5538ebf6a8017409f6c10174043bc1eb05ff5538ebf77f0289c8a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c15eb06f640ff10750d89c1b834f67ab28b5d0490ff1389c1f6c101740583c1027105ff5538ebf689c2588d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89178b4424088b00b901000000f6c101740ba80174078d49ff03c87105ff5538ebf48b17f6c1017409f6c20174043bcaeb05ff5538ebf77e0d89c1b850a27fb28b5d0490ff138b74240889f989cf89ca89c1d1e983c60483c704f3a58d7c3f018d7436018d4c09018b45008d40f43b45087303ff5520894500c740fc02000000895004c700030000005989018b0424a801740783f8017d08eb1cf640ff1075168b0aa8017409f6c10174043bc1eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13a801740583c0027105ff5538ebf68b4c240c83c408894c42feb801000000c204009090000000002c020000|@8781,2097151,@898|22,0,@8775 103,0,@6397 140,0,0 162,0,3 170,0,I108 238,0,16777214 255,0,@6401 332,0,0 383,0,@8779 456,0,1 506,0,@6397 543,0,0 8775:O4|103,@4956,@8777,@8776 8776:O5|@8778,93,0,93,0 8777:S39|417474656d707420746f207570646174652061206c6f636b656420737472657463684172726179 8778:S40|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f5374726574636841727261792e4d4c 8779:O4|11,@4879,0,@8780 8780:O5|@6375,200,0,200,0 8781:S22|5374726574636841727261792e757064617465283329 8782:S11|70757368436f6465526566 8783:D3,444|3b650c7303ff55248b482c8b09ff702050ff701cff700c51ff7004b81500000090e8be68faffbb150000009090e8b268faff8b5424149090ff128b44241cb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8a801751eff70048b5c24188b00ba80a47fb2e85a010000583b650c7303ff5524ebdeb854d87fb28b5424149090ff128b44240c8b00bb03000000bafc317ab2909090e8b68efaff8b5424149090ff12b860d87fb28b54241490ff128b04248b00bb03000000bafc317ab2e88e8efaff8b54241483c404909090ff12b870d87fb28b54241090ff12bb0300000058bafc317ab2e8668efaff8b54240c9090ff12b8150000008b54240c90ff12b880d87fb28b54240c90ff128b0424ff7008ff7424108b58048b0889c89090e89a340000b81500000083c4048b5424089090ff12588b00a801740783f8017f08eb3ff640ff1075398b0c2489c789fb8b410890e87a36000057ff74240889c389f89090e86a37000058a801740583e8027105ff5538ebf63b650c7303ff5524ebb6b854df7fb283c4045a5983c40451ff229000000000b8010000|@8991,2097151,@914|28,0,10 34,1,@4940 39,0,10 46,1,@4940 63,0,0 133,0,@8784 138,1,@8786 154,0,@8970 173,0,1 178,0,@5052 186,1,@5053 199,0,@8971 216,0,1 221,0,@5052 226,1,@5053 243,0,@8972 255,0,1 261,0,@5052 266,1,@5053 279,0,10 291,0,@8973 322,1,@8974 327,0,10 374,1,@8978 390,1,@8980 420,0,@8990 8784:O2|@8786,@8785 8785:O2|@8951,@8950 8786:D3,7172|3b650c7303ff55248b08beaea47fb28d748efcffe690e931020000909090e971020000909090e98e020000909090e959030000909090e919040000909090e9cd040000909090e97d050000909090e935060000909090e9e1060000909090e919070000909090e9d1070000909090e99a080000909090e9010a0000909090e9c50a0000909090e9a90b0000909090e9690c0000909090e9810c0000909090e9990c0000909090e9d20c0000909090e9ee0c0000909090e9f50c0000909090e9190d0000909090e9520d0000909090e9950d0000909090e9250e0000909090e9450e0000909090e9e90e0000909090e9d70f0000909090e9dd0f0000909090e911100000909090e9c9100000909090e919120000909090e97e120000909090e9b6120000909090e9bd120000909090e931130000909090e949130000909090e966130000909090e9b6130000909090e9bb000000909090e9e9130000909090e906140000909090e91d140000909090e941140000909090e96a140000909090e992140000909090e9a9140000909090e9b2140000909090e90d150000909090e92d150000909090e94d150000909090e9fd150000909090e952160000909090e959160000909090e9f9160000909090e962170000909090e9d1170000909090e9d5170000909090e949180000909090e9b2180000909090e9e9180000909090e96d190000909090e98519000090909053ff7008ff7004b8b0c07fb289daff12589090e8021a00008b5424049090ff12b898c37fb28b54240490ff12589090e8e61900008b1424909090ff12eb6853ff7008ff7004b8a4c37fb289da9090ff12bb0300000058bafc317ab2e81e8bfaff8b5424049090ff12b8b8c37fb28b54240490ff12589090e89e1900008b1424909090ff12eb3353ff7004b8c4c37fb289da90ff12589090e87e1900008b1424909090ff12eb58e93a1900008b4804ba66a77fb28d548afcffe2e9271900009090e92b000000909090e92a000000909090e92e000000909090e92d000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fe9e2180000b9f8c37fb2eb13b904c47fb2eb0cb910c47fb2eb05b91cc47fb253ff7010ff700cff7008bb28c47fb289c890e8ba63faff8b54240c9090ff12ff742404ff742410bb34c47fb28b4424089090e8421c0000b84100000083c4088b5424049090ff12bb0300000058bafc317ab2e80a8afaff8b1424909090ff12eb5a8b4804ba32a87fb28d548afcffe2e92b000000909090e92a000000909090e929000000909090e928000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fb9f8c37fb2eb18b904c47fb2eb11e908180000b910c47fb2eb05b91cc47fb253ff7010ff700cff7008bb28c47fb289c890e8ee62faff8b54240c9090ff12ff742404ff742410bb34c47fb28b4424089090e8761b0000b898c37fb283c4088b5424049090ff1258ba44a87cb290e87603fdff8b1424909090ff12eb5a8b4804bafaa87fb28d548afcffe2e92b000000909090e92a000000909090e929000000909090e928000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fb9f8c37fb2eb18b904c47fb2eb11e940170000b910c47fb2eb05b91cc47fb253ff700cff7008bb04c67fb289c8e82a62faff8b5424089090ff12589090e8461700008b5424049090ff12b898c37fb28b54240490ff12bb0300000058bafc317ab2e88688faff8b1424909090ff12eb5a8b4804bab6a97fb28d548afcffe2e92b000000909090e92a000000909090e929000000909090e928000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fb9f8c37fb2eb18b904c47fb2eb11e984160000b910c47fb2eb05b91cc47fb253ff700cff7008bb04c67fb289c8e86e61faff8b5424089090ff12589090e88a1600008b5424049090ff12b898c37fb28b54240490ff1258ba44a87cb290e80202fdff8b1424909090ff12eb5a8b4804ba6eaa7fb28d548afcffe2e92b000000909090e92a000000909090e929000000909090e928000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fb9f8c37fb2eb18b904c47fb2eb11e9cc150000b910c47fb2eb05b91cc47fb253ff700cff7008ff7010bb10c67fb289c890e8b260faff8b54240c9090ff12589090e8ce1500008b5424089090ff12b898c37fb28b54240890ff12ff742404ff74240cbb34c47fb28b4424089090e81e190000eb5a8b4804ba2eab7fb28d548afcffe2e92b000000909090e92a000000909090e929000000909090e928000000909090e92c000000909090e92b000000909090b9e0c37fb2eb26b9ecc37fb2eb1fb9f8c37fb2eb18b904c47fb2eb11e909150000b910c47fb2eb05b91cc47fb253ff700cff7008bb1cc67fb289c8e8f65ffaff8b5424089090ff12589090e8121500008b5424049090ff12b898c37fb28b54240490ff12589090e8f61400008b1424909090ff12eb6453ff7008ff7004b828c67fb289da9090ff12589090e8d21400008b5424049090ff12b83cc67fb28b54240490ff12589090e8b61400008b1424909090ff12eb6153ff7004b84cc67fb289da90ff128b04248338077513b864c67fb28b54240490ff12eb58e947140000833801751a8b40048b5810b87cc67fb2e8425ffaff8b5424049090ff12eb648338057534ff7004b88cc67fb28b542408909090ff1258eb05e90a140000ba44a87cb29090e8d2fffcff8b5424049090ff12eb63e9ec130000833803752bff7004b8a8d07cb28b5424089090ff1258ba44a87cb290e8a2fffcff8b5424049090ff12eb5de9bc130000b868ca7cb28b5424049090ff12eb5853ff7004b89cc67fb289da90ff12833c24497514b8acc67fb28b542404eb05e989130000ff12eb59833c2441750eb8c8c67fb28b54240490ff12eb5d833c2451751bb8dcc67fb2eb05e95f1300008b5424049090ff12eb5fe950130000833c2459750db8f8c67fb28b542404ff12eb5c833c24697516b810c77fb28b542404eb05e9271300009090ff12eb5b833c24717516b820c77fb2eb05e90f1300008b5424049090ff12eb44bb030000008b0424bafc317ab2eb05e9f112000090e88e84faff8b5424049090ff12eb25e9dc1200008b48088b51088b128b7004bfcaad7fb28d7cb7fcffe7e9c1120000e9bc120000e9b7120000e965000000909090e967000000909090e969000000909090e96b000000909090e96d000000909090e96f000000909090e971000000909090e973000000909090e984000000909090e986000000909090e997000000909090e9030000009090908b480cb834c77fb2eb508b480cb848c77fb2eb4b8b480cb85cc77fb2eb468b480cb870c77fb2eb558b480cb884c77fb2eb508b480cb898c77fb2eb4b8b480cb8b4c77fb2eb4e8b480cb8c4c77fb2eb448b480cb8dcc77fb2eb3ae935000000e930000000e92b0000008b480cb8f0c77fb2eb218b480cb808c87fb2eb17e912000000e90d000000e9080000008b480cb81cc87fb253515289da90ff12b834c87fb28b54240890ff12bb0300000058bafc317ab2e84283faff8b5424049090ff12833c24037510b840c87fb28b542404909090ff12eb22833c24057521b858c87fb28b54240490ff12eb648b4804ba2eaf7fb28d548afcffe2e95a110000e9551100009090e93b000000909090e942000000909090e944000000909090e946000000909090e948000000909090e94a000000909090e94c000000909090e94e0000009090908b4808b870c87fb2eb49e9041100008b4808b880c87fb2eb3a8b4808b894c87fb2eb308b4808b8acc87fb2eb268b4808b8bcc87fb2eb1c8b4808b8d4c87fb2eb128b4808b8e8c87fb2eb088b4808b8fcc87fb2535189da909090ff1258ba44a87cb290e882fcfcff8b1424909090ff12eb5b8b4804baeeaf7fb28d548afcffe2e93b000000909090e945000000909090e94a000000909090e94f000000909090e954000000909090e959000000909090e95e000000909090e9680000009090908b480c8b5008b870c87fb2eb53e93f1000008b480c8b5008b880c87fb2eb518b480c8b5008b894c87fb2eb448b480c8b5008b8acc87fb2eb378b480c8b5008b8bcc87fb2eb2a8b480c8b5008b8d4c87fb2eb1d8b480c8b5008b8e8c87fb2eb10e90b0000008b480c8b5008b8fcc87fb253515289da90ff12b8410000008b54240890ff12ff742404ff74240cbb34c47fb28b4424089090e872130000eb588b4804badab07fb28d548afcffe2e93b000000909090e942000000909090e944000000909090e946000000909090e948000000909090e94a000000909090e94c000000909090e94e0000009090908b4808b870c87fb2eb49e9530f00008b4808b880c87fb2eb3a8b4808b894c87fb2eb308b4808b8acc87fb2eb268b4808b8bcc87fb2eb1c8b4808b8d4c87fb2eb128b4808b8e8c87fb2eb088b4808b8fcc87fb2535189da909090ff12b8410000008b54240490ff12589090e8360f00008b1424909090ff12eb6853ff7004b818c97fb289da90ff12589090e8160f00008b1424909090ff12eb5c53ff7004b828c97fb289da90ff12589090e86e1700008b1424909090ff12eb6053ff7008ff7004b828c97fb289da9090ff12589090e8d20e00008b5424049090ff12833c2401eb05e9770e00007460b8c8ce7fb28b542404ff12eb58e9630e000053ff7004b828c97fb289daff12589090e8960e00008b1424909090ff12eb58e93f0e000053b8d8ce7fb289da909090ff12eb6853b8f8ce7fb289daff12b8f0a47ab29090e8620e00008b1424eb0ae90d0e0000e9080e0000909090ff12eb5c83780401741753ff7008b80ccf7fb289da909090ff12eb12e9e20d000053ff7008b828cf7fb289daff12589090e81a0e00008b1424909090ff12eb5ee9be0d000083780801741a53ff700cff7004b80ccf7fb289da909090ff12eb16e99e0d000053ff700cff7004b828cf7fb289da90ff12ff742404ff74240cbb34c47fb28b4424089090e83e110000eb5d8b4004b916b37fb28d4c81fcffe1e9600d0000909090e947000000909090e933000000909090e93e000000909090e93d000000909090e93c000000909090e93b000000909090e93a000000909090e939000000909090b83ccf7fb2eb34e90e0d0000b850cf7fb2eb28b860cf7fb2eb21b870cf7fb2eb1ab884cf7fb2eb13b898cf7fb2eb0cb8b0cf7fb2eb05b8c0cf7fb25389daff12eb3653ff700452b8d4cf7fb289daff128b04248b480483c4045889ca9090ff128b1424909090ff12eb5a8b4808bad6b37fb28d548afcffe2e9990c0000909090e935000000909090e93c000000909090e93e000000909090e940000000909090e942000000909090e9030000009090908b4804b8eccf7fb2eb358b4804b8f8cf7fb2eb2be94d0c00008b4804b804d07fb2eb1c8b4804b810d07fb2eb128b4804b81cd07fb2eb088b4804b828d07fb2535189da909090ff12b8410000008b54240490ff12589090e85e0c00008b1424909090ff12eb6753ff7004ff7008ff7010ff700cb834d07fb289daff12589090e8360c00008b54240c9090ff12b848d07fb28b54240c90ff12589090e81a0c00008b5424089090ff12b8150000008b54240890ff125859a801756f8b108b5a088b1bf6c101740c83f9017d23eb0be9940b0000f641ff107416ff7004515389cbb88c6c7ab29090ff1588c75208eb088b500489c8525153bb05000000bafc317ab2909090e8167dfaff8b54240c9090ff12b858d07fb28b54240c90ff12bb0300000058bafc317ab2eb05e9380b000090e8ea7cfaff8b5424089090ff12b8150000008b54240890ff125883c00289c1583b650c7303ff5524e95affffff53b868d07fb289da9090ff12eb608b40048b40088b005350b89900000089da909090ff12bb0300000058bafc317ab2e88e7cfaff8b1424909090ff12b8750000008b14249090ff12eb6153ff7004b880d07fb289da90ff128b04248338077513b864c67fb28b54240490ff12eb58e9970a0000833801751a8b40048b5810b87cc67fb2e8aa55faff8b5424049090ff12eb648338057534ff7004b88cc67fb28b542408909090ff1258eb05e95a0a0000ba44a87cb29090e83af6fcff8b5424049090ff12eb62e93c0a0000833803752bff7004b8a8d07cb28b5424089090ff1258ba44a87cb290e80af6fcff8b5424049090ff12eb6ce90c0a0000b868ca7cb28b5424049090ff12eb5d53ff7010ff7008ff700cff7004b898d07fb289daff12f60424017526eb05e9da0900008b04248b0090e8260a00008b5424109090ff12b8acd07fb28b54241090ff12bb0300000083c40458bafc317ab290e8627bfaffeb0ae9a0090000e99b0900008b5424089090ff128b0424833807752eff7004b8acd07fb28b54240c9090ff12589090e8ca0900008b5424089090ff12b8b8d07fb28b54240890ff12eb65833805752fff7004b8acd07fb28b54240c909090ff12589090e8960900008b5424089090ff12b8c4d07fb28b54240890ff12eb628338037537ff7004b8acd07fb28b54240c909090ff12589090e8620900008b5424089090ff12b8d0d07fb28b542408eb05e92c0000009090ff12eb268338017521ff7004b8acd07fb28b54240c909090ff12589090e8260900008b5424089090ff12b8b8c37fb283c4048b5424049090ff12589090e8060900008b1424909090ff12eb6853ff7008ff7004b8dcd07fb289da9090ff12589090e8e20800008b5424049090ff12b898c37fb28b54240490ff128b0424833803751a8b4004ba44a87cb2909090e84ef4fcff8b5424049090ff12eb58ff700cff7424088b58088b480489c89090e8120c0000eb64e9360800008b480453ff7008ff7110b8f0d07fb289da9090ff12588b54240490ff12b8b8c37fb28b54240490ff12589090e85e0800008b1424909090ff12eb68e9f307000053b804d17fb289da909090ff12eb5953ff7008ff7004b820d17fb289daeb05e9cf070000909090ff12589090e81e0800008b5424049090ff12b898c37fb28b54240490ff128b042483380375268b4004ba44a87cb2909090e88af3fcff8b542404eb0ae989070000e9840700009090ff12eb58ff700cff7424088b58088b480489c89090e8420b0000eb6453ff7004b830d17fb289da90ff12589090e8ae0700008b1424909090ff12eb6c53ff7004b84cd17fb289da90ff12589090e88e0700008b1424909090ff12eb58e91e07000053ff7008ff7004b860d17fb289da90ff12589090e8660700008b542404eb05e9fa060000909090ff12b870d17fb28b54240490ff12bb0300000058bafc317ab2e89e78faffeb05e9d00600008b1424ff12eb68e9c406000053ff7008ff7004b860d17fb289da90ff12589090e80e0700008b5424049090ff12b898c37fb28b54240490ff1258ba44a87cb290e886f2fcff8b1424909090ff12eb6753ff7004b87cd17fb289da90ff12589090e8ce0600008b1424909090ff12eb66e95c06000053ff7004b88cd17fb289daff12589090e8aa0600008b1424909090ff12eb5853ff7004b89cd17fb289da90ff12bb0300000058bafc317ab2e8e677faff8b1424eb05e915060000ff12eb5c53ff7004b89cd17fb289da90ff1258ba44a87cb2eb05e9f60500009090e8eaf1fcff8b1424909090ff12eb60e9e005000053ff7008ff7004b8acd17fb289da90ff12ff742404ff74240cbb34c47fb28b4424089090e896090000eb5ce9b005000053ff7004b8bcd17fb289daff12589090e8fe0500008b1424909090ff12eb5753b8f8c67fb289daff12eb50e98005000053ff7004b8ccd17fb289daff12833c24097507b8dcd17fb2eb3b833c2407750cb8f0d17fb2eb2ee951050000833c24057507b804d27fb2eb1c833c24037411b818d27fb2eb0fe92e050000e929050000b82cd27fb28b54240483c404909090ff12eb6353ff7004b840d27fb289da90ff12bb0300000058bafc317ab2e8c676faff8b1424909090ff12eb6d53ff7004b854d27fb289da90ff12bb0300000058bafc317ab2e89e76faff8b1424909090ff12eb6d83780c0375128b48048b5008b870d27fb2eb23e9ae04000083780c05740d8b48048b5008b890d27fb2eb0b8b48048b5008b8acd27fb253515289da90ff12b841000000eb05e97c0400008b5424089090ff12589090e8d60400008b5424049090ff12b8c8d27fb28b542404eb05e9540400009090ff128b0424a801740783f8017d18eb06f640ff10741089c3b88c6c7ab2909090ff1588c75208bb05000000bafc317ab290e8ea75faff8b54240483c404909090ff12eb5883780803750a8b4804b870d27fb2eb1883780805740a8b4804b890d27fb2eb088b4804b8acd27fb2535189daff12b8410000008b54240490ff12589090e8360400008b1424909090ff12b8d4d27fb28b14249090ff12eb6ce9b103000053b8e4d27fb289da909090ff12eb5d53ff7008ff7004b8f8d27fb289da9090ff128b0424833803751a8b4004ba44a87cb2909090e87aeffcff8b5424089090ff12eb16ff700cff74240c8b58088b480489c89090e83e070000b818d37fb283c4048b542404eb0ae945030000e9400300009090ff128b0424a801740783f8017d18eb06f640ff10741089c3b88c6c7ab2909090ff1588c75208bb05000000bafc317ab290e8d674faff8b54240483c404909090ff12eb6c53ff7008ff7004b828d37fb289da9090ff128b0424833803751a8b4004ba44a87cb2909090e8d2eefcff8b5424089090ff12eb16ff700cff74240c8b58088b480489c89090e896060000b898c37fb283c4048b5424049090ff12589090e8020300008b1424909090ff12eb70e98902000053ff7008ff7004b848d37fb289da90ff128b0424833803751a8b4004ba44a87cb2909090e862eefcff8b5424089090ff12eb16ff700cff74240c8b58088b480489c89090e826060000b898c37fb283c4048b5424049090ff12bb0300000058bafc317ab2e8ee73faffeb05e9190200008b1424ff12eb6e53b864d37fb289daff12eb6753ff7008ff7004b87cd37fb289da9090ff128b0424833803751a8b4004ba44a87cb2909090e8deedfcff8b5424089090ff12eb16ff700cff74240c8b58088b480489c89090e8a2050000b898c37fb283c4048b5424049090ff1258ba44a87cb2eb0ae99f010000e99a01000090e896edfcff8b1424909090ff12eb6c53ff7008ff7004b89cd37fb289da9090ff128b0424833803751a8b4004ba44a87cb2909090e862edfcff8b5424089090ff12eb16ff700cff74240c8b58088b480489c89090e826050000b898c37fb283c4048b5424049090ff12589090e8920100008b1424909090ff12eb6de91901000053ff7008ff7004b8b8d37fb289da90ff12589090e86a0100008b5424049090ff12b898c37fb28b54240490ff12589090e84e0100008b1424909090ff12eb6353ff7008ff700cff7004b8ccd37fb289da909090ff12ff742404ff742410bb34c47fb28b442408eb05e9ac000000909090e88a040000b8e0d37fb283c4088b5424049090ff128b0424a801740783f8017d1ceb06f640ff10741489c3b88c6c7ab2eb05e972000000ff1588c75208bb05000000bafc317ab290e82a72faff8b54240483c404909090ff12eb4e53ff7004b8ecd37fb289da90ff12589090e8a20000008b1424909090ff12eb2e8b40048b40088b005350b800d47fb289da909090ff12bb0300000058bafc317ab2e8d671faff8b1424909090ff126a016a0183c4086a0183c4046a0183c4046a0183c4046a016a0183c4086a0183c4046a016a0183c4086a0183c4046a016a0183c408b8150000005aff229000000000001c0000|@8949,2097151,@905|11,0,$8786+22 534,0,@8787 546,1,@8788 559,0,@8806 574,1,@8788 596,0,@8807 607,0,1 613,0,@5052 618,1,@5053 631,0,@8808 646,1,@8788 665,0,@8809 678,1,@8788 701,0,$8786+718 767,0,@8810 774,0,@8811 786,0,@8812 793,0,@8813 800,0,@8814 807,0,@8815 822,0,@8816 830,1,@4940 851,0,@8817 862,1,@8818 867,0,32 883,0,1 889,0,@5052 894,1,@5053 912,0,$8786+922 971,0,@8810 978,0,@8811 985,0,@8812 992,0,@8813 1004,0,@8814 1011,0,@8815 1026,0,@8816 1034,1,@4940 1055,0,@8817 1066,1,@8818 1071,0,@8806 1088,0,@7425 1094,1,@7427 1112,0,$8786+1122 1171,0,@8810 1178,0,@8811 1185,0,@8812 1192,0,@8813 1204,0,@8814 1211,0,@8815 1223,0,@8823 1230,1,@4940 1246,1,@8788 1259,0,@8806 1271,0,1 1277,0,@5052 1282,1,@5053 1300,0,$8786+1310 1359,0,@8810 1366,0,@8811 1373,0,@8812 1380,0,@8813 1392,0,@8814 1399,0,@8815 1411,0,@8823 1418,1,@4940 1434,1,@8788 1447,0,@8806 1460,0,@7425 1466,1,@7427 1484,0,$8786+1494 1543,0,@8810 1550,0,@8811 1557,0,@8812 1564,0,@8813 1576,0,@8814 1583,0,@8815 1598,0,@8824 1606,1,@4940 1622,1,@8788 1635,0,@8806 1655,0,@8817 1666,1,@8818 1676,0,$8786+1686 1735,0,@8810 1742,0,@8811 1749,0,@8812 1756,0,@8813 1768,0,@8814 1775,0,@8815 1787,0,@8825 1794,1,@4940 1810,1,@8788 1823,0,@8806 1838,1,@8788 1860,0,@8826 1874,1,@8788 1887,0,@8827 1902,1,@8788 1921,0,@8828 1939,0,@8829 1969,0,@8830 1974,1,@4940 1997,0,@8831 2019,0,@7425 2026,1,@7427 2054,0,@7724 2068,0,@7425 2074,1,@7427 2094,0,@7698 2113,0,@8832 2129,0,@8833 2155,0,@8834 2175,0,@8835 2208,0,@8836 2227,0,@8837 2255,0,@8838 2277,0,1 2285,0,@5052 2298,1,@5053 2329,0,$8786+2354 2454,0,@8839 2464,0,@8840 2474,0,@8841 2484,0,@8842 2494,0,@8843 2504,0,@8844 2514,0,@8845 2524,0,@8846 2534,0,@8847 2559,0,@8848 2569,0,@8849 2594,0,@8850 2607,0,@8851 2619,0,1 2625,0,@5052 2630,1,@5053 2649,0,@8852 2671,0,@8853 2688,0,$8786+2710 2778,0,@8854 2793,0,@8855 2803,0,@8856 2813,0,@8857 2823,0,@8858 2833,0,@8859 2843,0,@8860 2853,0,@8861 2868,0,@7425 2874,1,@7427 2892,0,$8786+2902 2973,0,@8854 2991,0,@8855 3004,0,@8856 3017,0,@8857 3030,0,@8858 3043,0,@8859 3056,0,@8860 3074,0,@8861 3087,0,32 3107,0,@8817 3118,1,@8818 3128,0,$8786+3138 3206,0,@8854 3221,0,@8855 3231,0,@8856 3241,0,@8857 3251,0,@8858 3261,0,@8859 3271,0,@8860 3281,0,@8861 3295,0,32 3310,1,@8788 3329,0,@8862 3342,1,@8788 3361,0,@8863 3374,1,@8864 3396,0,@8863 3410,1,@8788 3436,0,@8880 3458,0,@8863 3470,1,@8788 3491,0,@8881 3506,0,@8882 3515,0,@5643 3522,1,@8788 3559,0,@8883 3582,0,@8884 3594,1,@8788 3627,0,@8883 3653,0,@8884 3671,0,@8817 3682,1,@8818 3692,0,$8786+3710 3775,0,@8885 3787,0,@8886 3794,0,@8887 3801,0,@8888 3808,0,@8889 3815,0,@8890 3822,0,@8891 3829,0,@8892 3846,0,@8893 3884,0,$8786+3902 3954,0,@8894 3964,0,@8895 3979,0,@8896 3989,0,@8897 3999,0,@8898 4009,0,@8899 4023,0,32 4038,1,@8788 4066,0,@8900 4078,1,@8788 4091,0,@8901 4106,1,@8788 4119,0,10 4174,0,@5215 4182,0,I106 4197,0,2 4202,0,@5052 4210,1,@5053 4223,0,@8902 4235,0,1 4241,0,@5052 4254,1,@5053 4267,0,10 4300,0,@8903 4323,0,76 4335,0,1 4341,0,@5052 4346,1,@5053 4359,0,58 4377,0,@8904 4395,0,@8829 4425,0,@8830 4430,1,@4940 4453,0,@8831 4475,0,@7425 4482,1,@7427 4510,0,@7724 4524,0,@7425 4530,1,@7427 4550,0,@7698 4578,0,@8905 4606,1,@8788 4619,0,@8906 4631,0,1 4640,0,@5052 4646,1,@5053 4682,0,@8906 4698,1,@8788 4711,0,@8907 4733,0,@8906 4750,1,@8788 4763,0,@8908 4785,0,@8906 4802,1,@8788 4815,0,@8909 4845,0,@8906 4862,1,@8788 4875,0,@8808 4894,1,@8788 4916,0,@8910 4930,1,@8788 4943,0,@8806 4966,0,@7425 4974,1,@7427 5006,1,@8818 5028,0,@8911 5047,0,@8808 5062,1,@8788 5083,0,@8912 5104,0,@8913 5126,1,@8788 5139,0,@8806 5162,0,@7425 5170,1,@7427 5214,1,@8818 5225,0,@8914 5238,1,@8788 5257,0,@8915 5270,1,@8788 5297,0,@8916 5310,1,@8788 5331,0,@8917 5343,0,1 5349,0,@5052 5354,1,@5053 5385,0,@8916 5398,1,@8788 5411,0,@8806 5424,0,@7425 5430,1,@7427 5449,0,@8918 5462,1,@8788 5486,0,@8919 5498,1,@8788 5517,0,@8920 5527,0,1 5533,0,@5052 5538,1,@5053 5561,0,@8920 5572,0,@7425 5586,1,@7427 5613,0,@8921 5631,0,@8817 5642,1,@8818 5658,0,@8922 5670,1,@8788 5686,0,@8836 5706,0,@8923 5721,0,@8924 5734,0,@8925 5752,0,@8926 5765,0,@8927 5782,0,@8928 5805,0,@8929 5815,0,1 5821,0,@5052 5826,1,@5053 5845,0,@8930 5855,0,1 5861,0,@5052 5866,1,@5053 5893,0,@8931 5917,0,@8932 5930,0,@8933 5943,0,32 5966,1,@8788 5979,0,@8934 6021,0,@5215 6030,0,I106 6035,0,2 6040,0,@5052 6046,1,@5053 6074,0,@8931 6090,0,@8932 6100,0,@8933 6111,0,32 6126,1,@8788 6139,0,@8935 6159,0,@8936 6180,0,@8937 6202,0,@7425 6210,1,@7427 6242,1,@8818 6247,0,@8938 6297,0,@5215 6306,0,I106 6311,0,2 6316,0,@5052 6322,1,@5053 6348,0,@8939 6370,0,@7425 6378,1,@7427 6410,1,@8818 6415,0,@8806 6434,1,@8788 6461,0,@8940 6482,0,@7425 6490,1,@7427 6522,1,@8818 6527,0,@8806 6543,0,1 6549,0,@5052 6554,1,@5053 6574,0,@8941 6592,0,@8942 6614,0,@7425 6622,1,@7427 6654,1,@8818 6659,0,@8806 6676,0,@7425 6694,1,@7427 6716,0,@8943 6738,0,@7425 6746,1,@7427 6778,1,@8818 6783,0,@8806 6802,1,@8788 6829,0,@8944 6842,1,@8788 6855,0,@8806 6870,1,@8788 6895,0,@8945 6915,0,@8817 6934,1,@8818 6939,0,@8946 6977,0,@5215 6990,0,I106 6995,0,2 7000,0,@5052 7006,1,@5053 7029,0,@8947 7042,1,@8788 7067,0,@8948 7079,0,1 7085,0,@5052 7090,1,@5053 7156,0,10 8787:S7|4d6f7665525220 8788:D3,456|3b650c7303ff552483380175458b4804f6c101740783f9017d1aeb06f641ff10741289cbb88c6c7ab2909090ff1588c75208eb0289c8bb05000000bafc317ab290e81e71faff89c3b89cc27fb2e9824afaff81f8f0a47ab274168338017417833803751283780401750c837808017506b8a8c27fb2c381f8b4c27fb274168338017417833803751283780407750c837808017506b8c4c27fb2c381f89c9a7ab274168338017417833803751283780403750c837808017506b8d0c27fb2c381f8dcc27fb274168338017417833803751283780405750c837808017506b8ecc27fb2c381f8f8c27fb274168338017417833803751283780409750c837808017506b808c37fb2c381f814c37fb27416833801741783380375128378040b750c837808017506b824c37fb2c381f830c37fb27416833801741783380375128378040d750c837808017506b840c37fb2c381f84cc37fb27416833801741783380375128378040f750c837808017506b85cc37fb2c383380175118b4004a801740583c020711fff5538ebf68378080375118b4004a801740583c0107108ff5538ebf68b4004bb03000000bafc317ab290e8b26ffaff89c3b868c37fb2e91649faff909000000000c4010000|@8805,2097151,@899|37,0,@5215 46,0,I106 55,0,2 60,0,@5052 66,1,@5053 73,0,@8789 78,1,@4940 84,0,@5643 113,0,@8790 120,0,@8791 149,0,@8792 156,0,@5592 185,0,@8793 192,0,@8794 221,0,@8795 228,0,@8796 257,0,@8797 264,0,@8798 293,0,@8799 300,0,@8800 329,0,@8801 336,0,@8802 365,0,@8803 419,0,1 424,0,@5052 430,1,@5053 437,0,@8804 442,1,@4940 8789:S2|6670 8790:S4|25656178 8791:O3|1,3,0 8792:S4|25656278 8793:S4|25656378 8794:O3|1,2,0 8795:S4|25656478 8796:O3|1,4,0 8797:S4|25657370 8798:O3|1,5,0 8799:S4|25656270 8800:O3|1,6,0 8801:S4|25657369 8802:O3|1,7,0 8803:S4|25656469 8804:S2|2572 8805:S26|5838364f5554505554434f444528292e72656752657072283129 8806:S4|203c3d20 8807:S11|416c6c6f6353746f726520 8808:S4|203d3e20 8809:S19|416c6c6f6353746f72655661726961626c6520 8810:S3|416464 8811:S3|416e64 8812:S3|436d70 8813:S2|4f72 8814:S3|537562 8815:S3|586f72 8816:S3|4d4320 8817:O1|4 8818:D3,340|3b650c7303ff55245350bb030000008b442410bafc317ab290e8ca6dfaff8b54240c9090ff12b8510000008b54240c90ff12589090e84afcffff8b5424089090ff12b8530000008b54240890ff128b04248338077537ff7004b8b70000008b54240c9090ff12589090e816fcffff8b5424089090ff128b44240889c1b8a4c57fb289ca83c4045983c40851ff228338057537ff7004b8b70000008b54240c9090ff12589090e8dafbffff8b5424089090ff128b44240889c1b8b0c57fb289ca83c4045983c40851ff228338037537ff7004b8b70000008b54240c9090ff12589090e89efbffff8b5424089090ff128b44240889c1b8bcc57fb289ca83c4045983c40851ff228338017537ff7004b8b70000008b54240c9090ff12589090e862fbffff8b5424089090ff128b44240889c1b8bb00000089ca83c4045983c40851ff22b80100000083c404c208000000000050010000|@8822,2097151,@900|11,0,1 20,0,@5052 26,1,@5053 39,0,40 54,1,@8788 67,0,41 90,0,91 106,1,@8788 125,0,@8819 150,0,91 166,1,@8788 185,0,@8820 210,0,91 226,1,@8788 245,0,@8821 270,0,91 286,1,@8788 305,0,93 322,0,0 8819:S3|2a385d 8820:S3|2a345d 8821:S3|2a325d 8822:S51|5838364f5554505554434f444528292e7072696e744f7065726174696f6e2832297072696e74426173654f6666736574283329 8823:S3|524320 8824:S3|524d20 8825:S3|525220 8826:S12|4c6f636b6564584164642028 8827:S6|29203c3d3e20 8828:S13|43616c6c46756e6374696f6e20 8829:S14|76696120436c6f73757265526567 8830:S5|434f44452d 8831:S5|636f64653d 8832:S8|43616c6c52545320 8833:S17|537461636b4f766572666c6f7743616c6c 8834:S12|486561704f766572666c6f77 8835:S19|537461636b4f766572666c6f7743616c6c4578 8836:S14|5261697365457863657074696f6e 8837:S8|5261697365446976 8838:S12|417262456d756c6174696f6e 8839:S12|4a756d704f766572666c6f77 8840:S9|4a756d704166746572 8841:S10|4a756d704265666f7265 8842:S9|4a756d70457175616c 8843:S11|4a756d7047726561746572 8844:S18|4a756d70477265617465724f72457175616c 8845:S8|4a756d704c657373 8846:S15|4a756d704c6573734f72457175616c 8847:S12|4a756d704e6f744166746572 8848:S13|4a756d704e6f744265666f7265 8849:S12|4a756d704e6f74457175616c 8850:S15|4a756d704e6f744f766572666c6f77 8851:S2|204c 8852:S16|20507265646963744e6f7454616b656e 8853:S13|205072656469637454616b656e 8854:S5|4650416464 8855:S9|4650436f6d70617265 8856:S15|4650436f6d70617265416e64506f70 8857:S8|4650446976696465 8858:S15|465052657665727365446976696465 8859:S10|46504d756c7469706c79 8860:S10|46505375627472616374 8861:S17|4650526576657273655375627472616374 8862:S7|46504672656520 8863:S7|46504c6f616420 8864:D3,32|3b650c7303ff552489c1b819000000dd01ddd9e91c000000000000001c000000|@8879,2097151,@904|11,0,12 20,1,@8865 8865:D3,672|3b650c7303ff552489c1d9c0d8d9dfe081e00044000081f0004000008d4400017406b820cc7fb2c3d9c0dc0d2ccc7fb2ddd2dc1d2ccc7fb2dfe081e00044000081f0004000008d440001741ed9eed8d9dfe081e0004500008d4400017406b838cc7fb2c3b844cc7fb2c35151bb050000008b45008d40f43b45087303ff5520894500c740fc02000001d9c0dd18909090ff15e8c852088b10f6c2017407b903000000eb068b0a8d4c09018b5804f6c301740df604240174073b1c247e07eb17ff5538ebf4f6c301740783fbf77c08eb5ef643ff10745d83f903745dff70085352516a03bb0100000089d0909090e8f2010000bb5d0000009090e82a41faff59f6c101740583e9027105ff5538ebf65051bb030000008b442408e8c601000089c35883c40490e8fe40faff89c2eb0ee945000000e940000000ff700853bb8b00000089d09090e8de40faff59f6c101740583e9027105ff5538ebf650bb0300000089c8bafc317ab29090e84a67faff89c358e8b240faffeb5ef6c301740783fb017f46eb06f643ff10743eb901000000f6c1017409f6c30174042bcb7105ff5538ebf783c101ff70085289c89090e8ea02000089c3b87cce7fb2e86a40faff5b9090e86240faffeb6cf6c101740ef6c30174093bcbeb0ae9a3000000ff5538ebf27f3af6c3017409f6c10174042bd97105ff5538ebf783c301ff70085289d8909090e89602000089c358e81a40faffbb88ce7fb29090e80e40faffeb62ff700853525153bb0100000089d0909090e8b2000000eb05e945000000bb5d000000909090e8e23ffaff59f6c101740df64424040174062b4c24047105ff5538ebf583c10150518b5c240c8b4424089090e87200000089c35883c40890e8aa3ffaff833c2401740f89c3b8fd00000083c408e9953ffaff83c408c390000000009c020000|@8878,2097151,@903|35,0,@8866 44,0,@8867 52,0,@8867 95,0,@8868 101,0,@8869 109,0,2 146,0,I117 158,0,1 228,0,0 238,1,@8870 243,0,46 250,1,@4940 273,0,1 282,1,@8870 294,1,@4940 317,0,69 326,1,@4940 348,0,1 355,0,@5052 362,1,@5053 370,1,@4940 395,0,0 430,1,@8874 437,0,@8876 442,1,@4940 450,1,@4940 514,1,@8874 522,1,@4940 527,0,@8877 534,1,@4940 548,0,0 558,1,@8870 570,0,46 578,1,@4940 622,1,@8870 634,1,@4940 647,0,126 655,1,@4940 8866:S3|6e616e 8867:B8|0000000000000000 8868:S3|696e66 8869:S4|7e696e66 8870:D3,348|a8017407b903000000eb068b088d4c0901f6c3017412f6c301740783fb017d15eb06f643ff10740d89c2b8a8eb79b28b5d0490ff13f64424040174168b542404f6c201740783fa017d17eb06f642ff10740f89c2b8a8eb79b28b5d04909090ff138d52ff03d33bd1760f89c1b8c0cd7fb28b5d04909090ff13a8017407b903000000eb068b088d4c090183fb0175093b4c24047503c20400837c2404017508b848c05208c20400837c240403751283c308d1eb0fb61c188d5c1b0189d8c204008b4c240483c10ec1e90283c90181f9ffffff01720c89c2b8e00c7ab28b5d04ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b442404d1e889078d44000183c30889d689f989cf89ca89c1d1e9d1eb03f38d5c1b0183c704f3a48d7c3f018d7436018d4c09018062ffbf89d0c204000000000058010000|@8873,63,@901|5,0,1 43,0,@4877 85,0,@4877 109,0,@8871 126,0,1 160,0,I48 207,0,16777215 216,0,@4941 228,0,0 8871:O4|11,@4879,0,@8872 8872:O5|@4900,719,0,719,0 8873:S19|537472696e672e737562737472696e67283329 8874:D3,72|3b650c7303ff5524a801740783f8017f0eeb06f640ff107406b848c05208c3a801740583e8027105ff5538ebf6e8ceffffff89c3b861000000e94e3dfaff90900000000044000000|@8875,63,@902|26,0,I48 53,0,48 58,1,@4940 8875:S16|5265616c2e6164645a65726f73283129 8876:S2|302e 8877:S2|2e30 8878:S14|5265616c2e67656e466d74283229 8879:S17|5265616c2e67656e466d74283129283129 8880:S7|20284c41535429 8881:S22|46504c6f6164496e74416e64506f7020282545535029 8882:S9|465053746174757320 8883:S17|465053746f7265416e64506f70203d3e20 8884:S11|465053746f7265203d3e20 8885:S12|46504368616e67655369676e 8886:S5|4650416273 8887:S5|4650436f73 8888:S9|46504c6f61644f6e65 8889:S10|46504c6f61645a65726f 8890:S15|46505061727469616c41726374616e 8891:S5|465053696e 8892:S12|4650537175617265526f6f74 8893:S13|46726565526567697374657220 8894:S3|4e4f54 8895:S3|444956 8896:S4|49444956 8897:S4|494d554c 8898:S3|4d554c 8899:S3|4e4547 8900:S12|496e64657865644361736520 8901:S6|207769746820 8902:S5|203d3e204c 8903:S14|496e74657272757074436865636b 8904:S15|4a756d70546f46756e6374696f6e20 8905:S12|4c6f61644164647265737320 8906:S3|202b20 8907:S3|2a3820 8908:S3|2a3420 8909:S3|2a3220 8910:S10|4d6f7665427974655220 8911:S12|4c6f6164436f646552656620 8912:S18|4c6f616448616e646c657241646472657373 8913:S7|4d6f76654d5220 8914:S19|4c6f636b4d757461626c655365676d656e7420 8915:S9|4d616b655361666520 8916:S7|4d6f7665435220 8917:S3|203c3d 8918:S5|506f705220 8919:S6|446574616720 8920:S6|507573684320 8921:S6|507573684d20 8922:S6|507573685220 8923:S7|52657065617420 8924:S10|53746f7265576f726473 8925:S10|53746f72654279746573 8926:S9|4d6f7665576f726473 8927:S12|436f6d706172654279746573 8928:S9|4d6f76654279746573 8929:S11|5265736574537461636b20 8930:S19|52657475726e46726f6d46756e6374696f6e20 8931:S23|5368696674205269676874204172697468656d65746963 8932:S18|5368696674204c656674204c6f676963616c 8933:S19|5368696674205269676874204c6f676963616c 8934:S4|20627920 8935:S7|20627920454358 8936:S12|537461727448616e646c6572 8937:S23|53746f726542797465436f6e7374546f4d656d6f727920 8938:S6|203c3d203078 8939:S21|53746f726542797465526567546f4d656d6f727920 8940:S19|53746f7265436f6e7374546f4d656d6f727920 8941:S16|53746f7265496e697469616c69736564 8942:S23|53746f72654c6f6e67436f6e7374546f4d656d6f727920 8943:S17|53746f7265526567546f4d656d6f727920 8944:S9|54616756616c756520 8945:S12|54657374427974654d656d20 8946:S3|203078 8947:S9|546573745461675220 8948:S14|556e636f6e644272616e6368204c 8949:S33|5838364f5554505554434f444528292e7072696e744f7065726174696f6e283229 8950:O23|@5643,@5592,@8794,@8791,@8796,@8798,@8800,@8802,@8960,@6813,@8961,@8962,@8963,@8964,@8965,@8966,@5279,@5347,@8967,@8968,@8969,@6222,@8959 8951:D3,360|3b650c7303ff5524b901000000bb03000000be01000000505283f92f746b89c8a801740583c0027105ff5538ebf689da8d5412ff235c240483fb017469565250ff7504bb32d57fb253896504f6c10174178b5c24148b7304bfffffff00237efc8d7c3f013bcf720db8cc7b7ab28b5d04909090ff138b7c24148b47048b4c48fe83c4045a895504eb30e96d0000008b650483c4045b895d04833817751489c1b820d67fb2eb05e9310000008b5d0490ff138b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc020000008b5c2408895a04890aeb0889d189f26a01515089d68b5c24045983c4083b650c7303ff5524e91effffff89f083c40890e8fe000000a801753a8378040175048b00eb358b188b4004e84e01000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048918e87a3bfaffeb05b848c0520889c3b8b700000090e89a35faffbbbb000000e99035faff0000000064010000|@8958,2097151,@908|9,0,0 14,0,1 19,0,0 68,0,$8951+142 89,0,8388607 105,0,@5401 160,0,@8952 258,1,@8956 282,1,@8957 318,1,@4953 325,0,I48 332,0,91 338,1,@4940 343,0,93 348,1,@4940 8952:O4|@4608,@5398,@8954,@8953 8953:O5|@8955,520,0,520,0 8954:S19|426164207265676973746572206e756d626572 8955:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364f5554505554434f44452e4d4c 8956:D3,84|3b650c7303ff5524a801753aff70048b00e802eaffff508b4424049090e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000050000000|@6329,2097151,@906|18,1,@8788 71,0,0 8957:D3,100|3b650c7303ff5524a801754aff308b4004e8eaffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c70059000000c3b801000000c30000000060000000|@6661,3,@907|81,0,44 87,0,0 8958:S36|5838364f5554505554434f444528292e5265675365742e72656753657452657072283129 8959:O2|0,6 8960:O3|1,0,1 8961:O3|1,2,1 8962:O3|1,3,1 8963:O3|1,4,1 8964:O3|1,5,1 8965:O3|1,6,1 8966:O3|1,7,1 8967:O2|0,2 8968:O2|0,3 8969:O2|0,4 8970:S4|7073703d 8971:S5|206c696d3d 8972:S5|207273703d 8973:S5|726567733d 8974:D3,100|3b650c7303ff5524b90100000050f6c101740783f92d7e13eb06f641ff10750bb80100000083c404c2080051ff74240c8b5c240889c8909090e83a00000058a801740583c0027105ff5538ebf689c13b650c7303ff5524ebb59090900000000060000000|@8977,2097151,@910|9,0,0 33,0,0 58,1,@8975 8975:D3,308|3b650c7303ff5524a801740783f8017d08eb1cf640ff1075168b0ba8017409f6c10174043bc1eb05ff5538ebf77c0e89c1b8f0ea7ab28b5d049090ff1389c1f6c101740583c1027105ff5538ebf68b4c4bfef6c101740783f9017e67eb06f641ff1075645150b8410000008b54240c90ff12ff7504b8bad97fb250896504f6442408017407837c24082f720db8cc7b7ab28b5d04909090ff138b442408b944d47fb28b4441fe83c40459894d04eb329090908b650483c4045b895d048338177518eb0ae959000000e95400000089c1b820d67fb28b5d04ff138b5d04909090ff13e8d2e6ffff8b54240c83c404909090ff12b87b0000008b54240890ff128b44240850bb030000008b442404bafc317ab2e80658faff5a83c4045983c40451ff22b801000000c204009090900000000030010000|@8976,2097151,@909|50,0,@6373 103,0,32 118,0,$8975+178 141,0,@5401 158,0,@8950 208,0,@8952 226,1,@8788 243,0,61 260,0,1 269,0,@5052 274,1,@5053 290,0,0 8976:S39|434f444547454e5f5441424c4528292e7072696e74526567732834297072696e74526567283129 8977:S28|434f444547454e5f5441424c4528292e7072696e7452656773283429 8978:D3,208|8b088b09833901754f8b7104baffffff002356fc8d541201f6c3017409f6c20174043bdaeb05ff5538ebf77d27f6c3017410b8ffffff002346fc8d4400013bd8720bb8cc7b7ab28b5d0490ff138b5c5efe89d8c38b4004c38b51048b12f6c3017409f6c20174043bdaeb05ff5538ebf77d50f6c301740783fb017d08eb1ff643ff1075198b41048b00f6c3017408a80174043bd8eb05ff5538ebf77c0cb8f0ea7ab28b5d049090ff13f6c301740583c3027105ff5538ebf68b49048b5c59fe89d8c38b4004c3909000000000cc000000|@8979,31,@911|13,0,8388607 51,0,8388607 67,0,@5401 158,0,@6373 8979:S19|5374726574636841727261792e737562283229 8980:D3,344|3b650c7303ff5524f6c301756dff7310ff730cff7308ff33ff7304bb03000000bafc317ab2e85656faff8b5424189090ff12b8410000008b54241890ff12bb0300000058bafc317ab2e83256faff8b5424149090ff12b8410000008b54241490ff128b5c2414589090e8fe000000833c24017432833c2401eb05e9c60000007425b8ecde7fb28b5424109090ff128b0424ba8ca47fb2909090e862f8ffff8b5424109090ff12837c240401750fb8f8de7fb28b5424109090ff12eb36bb030000008b442404bafc317ab2909090e8ae55faff89c3b808df7fb2e8122ffaffbb410000009090e8062ffaff8b5424109090ff12f64424080175358b442408ff30b818df7fb28b542414ff12bb0300000058bafc317ab2e86655faff8b5424109090ff12b8530000008b54241090ff128b44241083c40c89c1b81500000089ca5983c40451ff22b801000000c204009090900000000054010000|@8989,2097151,@913|28,0,1 33,0,@5052 38,1,@5053 51,0,32 63,0,1 69,0,@5052 74,1,@5053 87,0,32 106,1,@8981 130,0,@8985 146,0,@8785 154,1,@8951 174,0,@8986 189,0,1 198,0,@5052 206,1,@5053 213,0,@8987 218,1,@4940 223,0,32 230,1,@4940 256,0,@8988 267,0,1 273,0,@5052 278,1,@5053 291,0,41 312,0,10 326,0,0 8981:D3,384|3b650c7303ff55248b08ba26dd7fb28d548afcffe290e93a000000909090e953000000909090e99e000000909090e9d7000000909090e90b000000909090e903010000909090538b4004909090e85ee3ffff5aff2253ff7004b85100000089daff12588b40108b1424909090ff12b8530000005aff2253ff7004b8b700000089da909090ff1258a8017536ff7004bb030000008b00bafc317ab2909090e87254faff8b5424049090ff12b8410000008b54240490ff12583b650c7303ff5524ebc6b8bb0000005aff2253ff70088b400490e8dae2ffff8b5424049090ff12b8a4de7fb28b54240490ff12bb0300000058bafc317ab2e81a54faff8b1424909090ff12b8530000005aff22f6400401742df6400401750f8b4804b808a87cb28b5d049090ff1353bb030000008b4004bafc317ab29090e8da53faff5aff22b87f00000089daff2253ff7004b8b0de7fb289da909090ff12bb0300000058bafc317ab2e8ae53faff8b1424909090ff12b8530000005aff229090000000007c010000|@8984,2097151,@912|11,0,$8981+22 78,1,@8788 90,0,40 111,0,41 123,0,91 143,0,1 150,0,@5052 158,1,@5053 171,0,32 194,0,93 210,1,@8788 223,0,@8982 235,0,1 241,0,@5052 246,1,@5053 259,0,41 282,0,@7422 295,0,1 303,0,@5052 310,1,@5053 318,0,63 331,0,@8983 343,0,1 349,0,@5052 354,1,@5053 367,0,41 8982:S2|4028 8983:S6|626173654028 8984:S34|434f444547454e5f5441424c4528292e7072696e74537461636b556e696f6e283229 8985:S4|20696e20 8986:S6|2074656d7020 8987:S6|206c69666520 8988:S10|20746f20626173654028 8989:S29|434f444547454e5f5441424c4528292e7072696e74456e747279283329 8990:S2|2d0a 8991:S29|434f444547454e5f5441424c4528292e7072696e74537461636b283329 8992:S28|47454e45524154455f434f444528292e636f646567656e2839292d45 8993:D3,2116|8dbc2478ffffff3b7d0c7303ff55288b4d008d49f03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c70201000000525153508b5c24188b442420e80a0800008b4c2420f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c14eb06f641ff10750c89c2b834f67ab28b5d04ff13f6c101740583c1027105ff5538ebf689c2b8ffffffff8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44242089078b4c2418f6c10175358b19813ba4e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b590489d93b650c7303ff5524ebc6be0100000083fe01756ab97c787cb2f6c10175358b19813ba4e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b590489d93b650c7303ff5524ebc6be0100000083fe01750db8287c7cb28b5d04909090ff138b0e8139a4e539b27412b854eb7ab28b5d04eb05e90800000090ff138b5908eb1a8b0e8139a4e539b2740db854eb7ab28b5d04909090ff138b590883fb037407bb01000000eb05bb030000008b422c8b008b4a2c8b09f6c101740583c1027105ff5538ebf68b722c890e8b0e8b72188b36f6c101740cf7c60100000074043bceeb05ff5538ebf77e0a8b4a2c8b098b7218890e8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010b0000008b721c8b3652538b5d008d5be03b5d087303ff5520895d00c743fc0100000089038d4308c740fc05000000895810c7400c01000000c7400801000000c740040300000089088b4c24045657ff7224ff721c5089f38b410890e85ebdffff8b44240ca801740583c0027105ff5538ebf6598901833c240174116a01bba8eb7fb28b44241490e862c0ffff8b44241083c4048b4c2440f6c101740783f9017e6ceb06f641ff107569ff7020ff7024bb09000000909090e83a09000083780401740db8e42f80b28b5d04909090ff138b4424148b481c8b0951ff7024ff701c68343080b289cb8b500889d0e8cebcffff8b442408a801740583c0027105ff5538ebf6598901833c2401741deb0ae938010000e9330100006a01bb5c3080b28b44242090e8c6bfffff8b44241c83c4048b1c248b480889c8e8a6f7ffffa801745750bb030000008b442404bafc317ab2e80e4ffaff89c3b86c3080b2e87228faff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c8c3080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc050000008b50108951108b5c244c89590c8b70088971088b78048979048b3889398b7c2418518b5c24048b4708909090e8debbffff837c240401745db8a43080b28b5424089090ff12bb030000008b0424bafc317ab29090e85a4efaff8b5424089090ff12b8c83080b28b54240890ff12bb030000008b44244cbafc317ab290e8324efaff8b5424089090ff12b8150000008b54240890ff125883c408eb05b8ffffffff8b4c24188b0983f9017507b901000000eb1389c689cbb80100000090e8aa4c000089c189f08b542418890a89c38b44243c909090e8ea4c000089df68a43180b2bbc83180b2909090e8824d000089c389d8909090e8fa4e0000b901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c88b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000c701d03380b26a016a015350578d4c240c51ff742430ff7424288b5c24588b442414e876530000837c240c017507b868c05208eb70b8010000008b4c240cf6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb12f640ff10750c89c1b850337db28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c240c83f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f8837c2448017407b901000000eb05b90300000083f10283f9017407b9f0a47ab2eb05b9d8707ab283390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389ca89d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09018b4d008d49f03b4d087303ff5520894d00c741fc0100000089198d7108c746fc010000008916535151566a01ff742428ff742438ff742448ff742474ff742424ff74242cff742444ff742460ff742450ff742478ff74244450ff74246cffb42484000000b8483d80b250bb030000008b442474ba503d80b2e8d2560000833c2401750d89c1b85cd280b28b5d0490ff13f6042401756783f801750d89c1b8b0d280b28b5d0490ff138b4c24288b118b1283fa01741e8b55008d52f83b55087303ff5520895500c742fc010000008b008902eb686a016a016a01ff7424106a038d542408528b1889c8e87a8900008b44244083c4048b0083f801750deb05e93e0000008b442404eb0d89c38b4424049090e8be4506008b4c243c89018b55008d52f83b55087303ff5520895500c742fc010000005883c4048902eb0ae905000000ba010000008b4424288b088b0983f9017530508b5c2414b801000000e8caeb00008b4c24348b0983f901740989cb9090e8b64506008b4c24348901b801000000eb05b8010000008b44243483c4288b008b0c248b51188b128b490c83c4108b49048b095b8b1b8b7424048906895604894e08895e0cb801000000c2200090900000000040080000|@11830,2097151,@2144|41,0,0 57,0,0 74,1,@8994 107,0,16777214 124,0,@6401 151,0,-1 212,0,@4665 262,0,0 272,0,@7313 285,0,@4665 335,0,0 345,0,@7368 361,0,@4665 368,0,@6377 394,0,@4665 401,0,@6377 422,0,0 429,0,1 533,0,5 586,0,0 593,0,0 600,0,1 626,1,@8774 660,0,@8996 670,1,@8783 710,0,4 718,1,@8997 729,0,@9103 758,0,@9106 770,1,@8774 816,0,@9108 826,1,@8783 846,1,@8978 856,0,1 865,0,@5052 870,1,@5053 877,0,@9109 882,1,@4940 913,0,@9110 923,0,@5398 929,0,@4608 1010,1,@8774 1022,0,@9111 1035,0,1 1043,0,@5052 1050,1,@5053 1063,0,@9112 1075,0,1 1084,0,@5052 1090,1,@5053 1103,0,10 1121,0,-1 1137,0,0 1148,0,0 1154,1,@9113 1178,1,@9114 1185,0,@9115 1190,0,@9118 1198,1,@9120 1210,1,@9122 1215,0,0 1279,0,0 1285,0,@9123 1318,1,@9138 1330,0,I49 1337,0,0 1383,0,16777215 1400,0,@7886 1412,0,0 1462,0,0 1524,0,0 1531,0,1 1544,0,@5643 1551,0,@5279 1633,0,1 1646,0,31 1762,0,@9144 1768,0,1 1777,0,@9145 1782,1,@9147 1795,0,@9310 1819,0,@9313 1894,1,@9152 1934,1,@11828 1982,0,0 2005,0,0 2010,1,@9317 2030,1,@11829 2041,0,0 2048,0,0 2099,0,0 8994:D3,872|3b650c7303ff552489df5089f8ba90997fb2909090e87eb1ffffb93100000089c2b80100000089fb8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc7072f0000008b45008d40e03b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701ffffff008d7108c746fc03000000894e08894604893e8b0424a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c15eb06f640ff10750db834f67ab28b5d04909090ff13a801740583c0027105ff5538ebf689c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f5889078b45008d40d03b45087303ff5520894500c740fc02000000897804c700030000008d480cc741fc0100004089018d4108c740fc02000000c740040100000089088d480cc741fc01000040c701010000008d7908c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70703000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000051f6c30175378b0b8139b4e539b2751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b1b8919eb148b4b0489cb3b650c7303ff5524ebc4b90100000083f901756bb97c787cb2f6c10175378b19813bb4e539b2751e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b09890beb148b590489d93b650c7303ff5524ebc4bb0100000083fb01750e89c1b8287c7cb28b5d049090ff138b0b8139b4e539b2741250b854eb7ab2eb05e90a0000008b5d04ff138b5908eb1c8b19813bb4e539b2740d50b854eb7ab28b5d049090ff138b4b0889cb89c18b45008d40cc3b45087303ff5520894500c740fc0c00000051538b5c242089582c8b5c24088958285b8958248b5c24188958208b5c241489581c8b5c24108958188b5c24088958148b5c240c89581089700c894808897804891083c420c390900000000064030000|@8995,63,@916|14,0,@8759 22,1,@8760 27,0,24 34,0,0 80,0,23 110,0,0 126,0,8388607 174,0,16777214 189,0,@6401 218,0,0 292,0,1 321,0,0 339,0,0 355,0,0 386,0,1 417,0,0 448,0,0 479,0,0 510,0,0 541,0,0 555,0,@4667 607,0,0 617,0,@7313 630,0,@4667 682,0,0 694,0,@7368 709,0,@4667 717,0,@6377 742,0,@4667 750,0,@6377 8995:S29|434f444547454e5f5441424c4528292e74746162437265617465283229 8996:S5|696e637370 8997:D3,496|3b650c7303ff552450ff702453ff700c8b04249090e8ea01000083f801756bff742404ff74240468c8f07fb289e0508b5c24148b44241c9090e8ce090000508b5c24148b4424109090e8b601000083f801756bff742414ff74241468540280b289e0506a036a038b5c242c8b442434baf80280b290e8de160000508d4c2414518b5c24288b442430eb05e9fe0000009090e876090000508b5c24288b4424249090e85e01000083f801755a508b44242cba8ca47fb2e832e8ffff89c3eb05e99c000000b8bc2e80b290e80e1ffaff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd82e80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff13837c24140175068b4c2404eb148b308b5c24148b44240490e81642000089c1eb028b3083f90175058b0424eb0c89cb8b04249090e85242000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048930eb638b088b45008d40f43b45087303ff5520894500c740fc020000008b142489500489086a016a016a016a016a01eb358b088b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089086a016a016a016a016a016a016a016a016a01837c242c01741750ff7004bba02f80b28b442438909090e81ab5ffffeb01505883c434c3909000000000ec010000|@9102,2097151,@965|22,1,@8998 40,0,@9003 58,1,@9012 74,1,@8998 92,0,@9030 112,0,@9032 118,1,@9034 146,1,@9012 162,1,@8998 177,0,@8785 182,1,@8951 196,0,@9097 202,1,@4940 233,0,@9098 243,0,@5398 249,0,@4608 286,1,@9099 314,1,@9100 426,0,0 462,0,@9101 474,1,@8783 8998:D3,648|3b650c7303ff55248b48088b0923cb83f901740583f9017506b801000000c3ba01000000bb0300000083fa2f75138b70088b7804ff30b858f07fb28b5d0490ff1389de23f183fe01751183c2028d5c1bff3b650c7303ff5524ebcef6c201740783fa017d1feb06f642ff107417ff30ff7008ff700489d3b88c6c7ab2ff1588c75208eb0d8b48088b58048b3089d0565153ff7504b986ee7fb251896504a801740583f82f720f89c1b8cc7b7ab28b5d04909090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1383380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c101740783f9017d08eb21f641ff10751b8b5424088b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0d89c2b8b0f57ab28b5d0490ff13f6c101740583c1027105ff5538ebf68b542408c7444afe0300000083380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09018b0c248b090bca5a890a8b0c248b0983380175128b5004f6c201740583c2207120ff5538ebf68378080375128b5004f6c201740583c2107108ff5538ebf68b5004f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389ca89d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c090183f3fe23d35983c404891189c18b45008d40f83b45087303ff5520894500c740fc010000008908c39090900000000084020000|@9002,2097151,@917|26,0,0 32,0,0 37,0,1 55,0,@8999 120,0,@5215 126,0,I106 149,0,$8998+202 169,0,@5401 182,0,@8950 220,0,@8952 335,0,@6397 368,0,1 448,0,1 461,0,31 569,0,1 582,0,31 8999:O4|@4608,@5398,@9001,@9000 9000:O5|@8955,599,0,599,0 9001:S12|6f6e654f663a20656d707479 9002:S40|434f444547454e5f5441424c4528292e67657441636365707461626c655265676973746572283229 9003:D3,76|3b650c7303ff5524528b5a088b42049090e8defcffffa80175218b0c248b5104ff7204ff72088b1a8b00909090e82e000000b80100000083c404c3b80300000083c404c30000000048000000|@9011,2097151,@920|18,1,@8998 46,1,@9004 51,0,0 60,0,1 9004:D3,568|3b650c7303ff552483380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c101740783f9017d08eb1df641ff1075178b13f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8f0ea7ab28b5d049090ff1389caf6c201740583c2027105ff5538ebf68b5453fe83fa01757150525351ff7504beeef17fb256896504f6c101740583f92f720cb8cc7b7ab28b5d049090ff13be44d47fb28b744efe89f083c4045e897504eb24908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13e8aaceffff89c3b874f37fb2e87219faffeb05e9380000008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c98f37fb2894108c74104507b7ab2c7014ce239b289c88b5d049090ff1389d6f7c601000000740583ee027105ff5538ebf6f6c101740783f9017d08eb20f641ff10751a8b3bf6c101740cf7c70100000074043bcfeb05ff5538ebf77c0c89c7b8b0f57ab28b5d04ff13f6c101740583c1027105ff5538ebf689744bfe83fa0375728b4c24048b0983380175128b5004f6c201740583c2207120ff5538ebf68378080375128b5004f6c201740583c2107108ff5538ebf68b5004f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389ca89d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c0901eb05e9120000000bd38b4c240489115a83c40852e9a2000000b801000000c2080090900000000034020000|@9010,2097151,@919|102,0,@6373 147,0,$9004+198 166,0,@5401 178,0,@8950 216,0,@8952 234,1,@8788 241,0,@9005 246,1,@4940 284,0,@9006 294,0,@5398 300,0,@4608 380,0,@6397 497,0,1 510,0,31 546,1,@9008 551,0,0 9005:S28|667265653a20726567697374657220616c726561647920667265653a 9006:O5|@9007,176,0,176,0 9007:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f434f444547454e5f5441424c452e4d4c 9008:D3,300|83380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090181e20100fe0083fa01746d83fa01746d83380175118b4004a801740583c020711fff5538ebf68378080375118b4004a801740583c0107108ff5538ebf68b4004a80175108b08f640ff107402f7d98d4c0901eb0289c1b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c09018b4d00eb0ae937000000e9320000008d49e83b4d087303ff5520894d00c741fc02000000894104c701310000008d410cc740fc02000000c74004010000008908c3b801000000c390900000000028010000|@9009,7,@918|76,0,1 89,0,31 191,0,1 204,0,31 260,0,24 277,0,0 285,0,0 9009:S29|5838364c4f574c4556454c28292e667265655265676973746572283129 9010:S23|434f444547454e5f5441424c4528292e66726565283429 9011:S65|434f444547454e5f5441424c4528292e6765745265676973746572496e53657428322972416e64436f64652d756e74696c536f6d657468696e6746726565283129 9012:D3,108|3b650c7303ff55248b481c8b095053ff70245053ff74241889cbb8010000009090e85a000000833c24017430508b442408ba8ca47fb2909090e8a2deffff89c3b8100280b2e88615faffff342489c38b4424109090e892acffffeb01505883c40cc204000000000068000000|@9029,2097151,@930|27,0,0 34,1,@9013 50,0,@8785 58,1,@8951 65,0,@9028 70,1,@4940 86,1,@8783 9013:D3,160|3b650c7303ff5524a8017409f6c30174043bc3eb05ff5538ebf77d5d5350508b5c24148b4424189090e88600000050b8010000008b542410ff1283f80174298b442404a801740583c0027105ff5538ebf6ff742418ff742418ff7424188b5c2414e89affffffeb05b80100000083f801750c5883c408c20c00e91200000089c38b042483c40c5983c40c51e9b00a0000b801000000c20c00000000009c000000|@9027,2097151,@929|42,1,@9014 48,0,0 105,0,0 140,1,@9026 145,0,0 9014:D3,544|3b650c7303ff552489c7538b5c24088b4708909090e892e3ffffa801755483780801740683780801750bb80100000083c404c20400b9ffffffff330c2483c1012348088b500823142483780401755c83f901745c83f901745c8b18833b05755a8b7304833e0175198b5e04f6c301740ceb05e99401000083c3207120ff5538ebf6837e080375128b5e04f6c301740583c3107108ff5538ebf68b5e04f6c30175268b33f643ff107418eb14e9e6000000e9dd000000e9d8000000e93a000000f7de8d743601eb0289de89cb89f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c090123342483fe01745683fe017456eb59833b0975598b7304833e0175128b5e04f6c301740583c3207120ff5538ebf6837e080375128b5e04f6c301740583c3107108ff5538ebf68b5e04f6c30175248b33f643ff107402f7de8d743601eb16e966000000e961000000e943000000e93200000089de89cb89f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c090123342483fe01742c83fe01750eeb2589cbeb2189cbeb0489cbeb198b442408b901000000894c240889c389f883c404e9810000008b4d008d49e83b4d087303ff5520894d00c741fc050000008b70108971108b700c89710c8959088b58048959048b18891952ff770c518b5c24148b470890e892a6ffff8b5c24045883c40483c4045983c40451e929050000b80100000083c404c204009090000000001c020000|@9025,2097151,@927|22,1,@8978 43,0,0 54,0,-1 206,0,1 219,0,31 355,0,1 368,0,31 415,0,0 431,1,@9015 498,1,@8774 519,1,@9016 524,0,0 9015:D3,1260|3b650c7303ff552489c7538b4708909090e862e1ffffa801755f6a016a0183780801740683780801751389e1c7010100000089e1c7410401000000eb5c837c24100174238b0883390b75178b5104f6c201740783fa017f0feb44f642ff107407eb3c833909753757ff30ff770cff700c8b58088b442404eb05e95a040000909090e87a0400008d4c2410c701010000008d4c2410894104eb28e91a00000089e28b5808891a89e2c74204010000005751ff770cff700ceb0957ff30ff770cff700c837c2410017407837c24100175608b44240c6a018b5c241c8b480889c8909090e86ea5ffff8b44240883380375618b4804ba01000000ff7008f6c10175568b4424108b790452ff318b1c248b480889c8e862e0ffff83f80175068b442404eb6e8b4424188b1c248b480889c8eb05e95003000090e83ee0ffffa801746d5750bb030000008b442408bafc317ab2eb0ae961020000e906010000909090e89637faff89c3b8f0ff7fb2e8fa10faff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2eb05e9b8000000894108c74104507b7ab2c7014ce239b289c88b5d04eb05e905000000909090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44242090e816feffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241857528b5c24088b4108909090e822a4ffffb801000000837c240801740f8b5c2408909090e8b2040000eb015789c25983c4083b650c7303ff5524e99afeffff89d059f6c10175678b54240c8b790450ff318b1c248b420890e8fadeffff83f80175068b442404eb6b8b4424148b1c248b480889c8e8dedeffffa801745b5750bb030000008b442408bafc317ab2909090e84236faff89c3b8f0ff7fb2e8a60ffaff8b4d008d49ec3b4d08730aeb05e921010000ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb0ae9ab000000e90f000000c7014ce239b289c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44241c90e8befcffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241457528b5c24088b4108909090e8caa2ffffb801000000837c240801740f8b5c2408909090e8b2030000eb01575983c4083b650c7303ff5524e9adfeffff83380575198b4c2404ff7104ff71088b198b4004909090e82af4ffffeb2183380975178b4c2404ff7104ff71088b198b400490e80ef4ffffeb05b801000000508b4424108b481c8b09f6c101740583e9027105ff5538ebf68b50048b12f6c1017409f6c20174043bcaeb05ff5538ebf77c2f89cfff701c89fb8b480889c890e83eddffffa8017507b801000000eb198b0424893883c4043b650c7303ff5524eb9fb8010000006a01837c240401750a83c41c5883c404c204008b5c24048b44241c83c4245983c40451e9280300008b45008d40e83b45087303ff5520894500c740fc05000000c74010010000008b0c2489480c8b4c2410894808c74004010000008b4c240889088b4c240c508b5c241c8b4108e886a1ffff83c4145883c404c20400b80100000083c404c204009000000000e8040000|@9024,2097151,@926|18,1,@8978 46,0,0 55,0,0 130,1,@9016 140,0,0 170,0,0 226,1,@8774 243,0,0 274,1,@8978 310,1,@8978 321,0,1 330,0,@5052 350,1,@5053 357,0,@9019 362,1,@4940 393,0,@9020 410,0,@5398 416,0,@4608 558,1,@8774 563,0,0 582,1,@9021 634,1,@8978 662,1,@8978 673,0,1 682,0,@5052 690,1,@5053 697,0,@9019 702,1,@4940 740,0,@9020 750,0,@5398 768,0,@4608 902,1,@8774 907,0,0 926,1,@9022 974,1,@9004 1002,1,@9004 1009,0,0 1078,1,@8978 1087,0,0 1112,0,0 1152,1,@9023 1183,0,0 1203,0,0 1226,1,@8774 1241,0,0 9016:D3,308|3b650c7303ff5524b901000000ba03000000be01000000505383f92f745589cbf6c301740583c3027105ff5538ebf689d78d7c3fff23142483fa01746d565753ff7504baa6fe7fb252896504f6c101740583f92f720bb8cc7b7ab28b5d0490ff13ba44d47fb28b4c4afe83c4045a895504eb2ae96700000090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b55008d52f43b5508730aeb05e914000000ff5520895500c742fc02000000897204890aeb0689f26a01575389d689fa89d983c40c3b650c7303ff5524e93affffffb90100000083c404f7c60100000075378b0424ff760451ff7004ff70088b188b0690e8f6f1ffff833c2401740a8b1c249090e83200000089c183c4045e3b650c7303ff5524ebc189c883c404c30000000030010000|@9018,2097151,@922|9,0,0 14,0,1 19,0,0 68,0,$9016+122 87,0,@5401 98,0,@8950 140,0,@8952 224,0,0 258,1,@9004 274,1,@9017 9017:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@921| 9018:S26|434f444547454e5f5441424c4528292e66726565536574283229 9019:S23|696e6372557365436f756e743a206e6f20656e74727920 9020:O5|@9007,464,0,464,0 9021:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@923| 9022:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@924| 9023:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@925| 9024:S30|434f444547454e5f5441424c4528292e72656d6f7665456e747279283329 9025:S34|434f444547454e5f5441424c4528292e636c6561724361636865456e747279283329 9026:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@928| 9027:S44|434f444547454e5f5441424c4528292e72656d6f766546726f6d4361636865283329636c6561722832292829 9028:S15|72656d6f766546726f6d4361636865 9029:S34|434f444547454e5f5441424c4528292e72656d6f766546726f6d4361636865283329 9030:D3,76|3b650c7303ff5524528b5a088b42049090e852ebffffa80175218b0c248b5104ff7204ff72088b1a8b00909090e8a2eeffffb80100000083c404c3b80300000083c404c30000000048000000|@9031,2097151,@931|18,1,@8998 46,1,@9004 51,0,0 60,0,1 9031:S58|434f444547454e5f5441424c4528292e6765745265676973746572496e53657428322972416e64436f64652d70757368496e737472732d283129 9032:O2|@9034,@9033 9033:O2|@9074,@9073 9034:D3,180|3b650c7303ff55245053ff7024ff701cff7018ff702cff700c52ff74241050bb01000000b801000000e89a000000bb900580b29090e87e1afbff8b0c24ff74241cff742430ff7104ff742430ff742414ff74241cff742424ff74242cff742438ff74244cbb01000000e81a030000837c241401742f508b44241cba8ca47fb29090e80ed1ffff89c3b8d42780b2e8f207faffff342489c38b4424249090e8fe9effffeb01505883c420c20c0000000000b0000000|@9072,2097151,@956|32,0,0 37,0,0 42,1,@9035 47,0,@9037 54,1,@6493 101,0,0 106,1,@9042 123,0,@8785 130,1,@8951 137,0,@9071 142,1,@4940 158,1,@8783 9035:D3,368|3b650c7303ff55248b4c24088b09a8017409f6c10174043bc1eb05ff5538ebf77c0589d8c208008b4c240489df5089c38b41089090e892d6ffffa80175678b0883390975658b1424f6c201740583c2027105ff5538ebf68b5d008d5be83b5d087303ff5520895d00c743fc020000008b34248973048b700c89338d4b0cc741fc0200000089790489198b5c240c8b7c2408895c240c897c240889cb89d083c404e95bffffffe99300000083390575608b1424f6c201740583c2027105ff5538ebf68b5d008d5be83b5d087303ff5520895d00c743fc020000008b34248973048b700c89338d4b0cc741fc0200000089790489198b5c240c8b7c2408895c240c897c240889cb89d083c404e9f1feffff8b1424f6c201740583c2027105ff5538ebf68b5c240c8b742408895c240c8974240889fb89d083c404e9c3feffff8b0424a801740583c0027105ff5538ebf68b4c240c8b542408894c240c8954240889fb83c404e998feffff000000006c010000|@9036,63,@932|54,1,@8978 9036:S44|434f444547454e5f5441424c4528292e70757368526567697374657273283529656e756d6572617465283229 9037:O1|@9038 9038:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700dc0580b28948048060ffbfc3000000002c000000|@9041,3,@934|28,0,@9039 9039:D3,68|8b52048338017506b803000000c3833a017506b801000000c38b12f6c201740bf6000174063b107e0deb05ff5538ebf5b801000000c3b803000000c30000000040000000|@9040,5,@933|9,0,1 20,0,0 49,0,0 55,0,1 9040:S41|434f444547454e5f5441424c4528292e707573685265676973746572732835296c6571283129283129 9041:S38|434f444547454e5f5441424c4528292e707573685265676973746572732835296c6571283129 9042:D3,1864|8d7c24a83b7d0c7303ff5528a801755c8b088b5424288b780453ff71048b1c248b42089090e8e2d3ffffa801755d8b08833909755b57ff700cff7004ff7008ff7104ff70108b4424188b542444909090ff1283f801750ab80100000083c414eb5e8b4424048338017519eb05e9c80600008b4804f6c101740583c120712cff5538ebf683780803751eeb0ae923060000e90a0300008b4804f6c101740583c1107108ff5538ebf68b4804f6c10175158b11f641ff107402f7da8d541201eb07e9f505000089ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09012354242883fa01740583fa017507b801000000eb62837c240c0175186a018b5c241c8b44244c9090e882f1ffffb801000000eb64837c2424017541ff742448ff74240450ff742448ff742418ff74244cff74244cff742428ff742430ff74243cff7424588b5c246cb801000000909090e802060000eb63e939020000b9ffffffff334c242883c101234c240883f901746483f9017464eb05e918020000b9ffffffff334c242883c101234c2408ba01000000bb0300000083fa2f750cb858f07fb28b5d049090ff1389de23f183fe01751883c2028d5c1bffeb05e9d60100003b650c7303ff5524ebcef6c201741183fa017d24eb10e9a5000000e9a0000000f642ff10741289d3b88c6c7ab2909090ff1588c75208eb0289d0ff7504b9ce0880b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13ff742448ff742408ff742440ff742414ff742428ff742420ff742428ff74241c8b5c244ce856080000eb7083380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090181e20100fe00eb05e9a100000083fa01740583fa017507b99f010000eb05b90100fe00baffffffff3354242883c20123ca89cb8b4424389090e8fae3ffff83f801753dff742448ff742404ff74240cff742448ff742418ff74244cff74244cff742428ff742430ff74243cff7424588b5c246cb80100000090e8f2030000eb2eff742448ff742408ff742440ff742414ff742428ff742420ff742428ff74241c8b5c244c8b00909090e83e07000083c414eb61833905756183780401742757ff700cff7004ff7008ff7010ff7108ff71048b44241c8b542448909090ff1283f8017415eb1d57ff700cff7004ff7008ff7010ff7108ff7104b80100000083c418eb708b0424833801751e8b4804f6c1017411eb0ae9b4020000e9a102000083c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9eb05e956020000d3e283ca018d4c09012354242c83fa01740583fa017507b801000000eb67837c24100175196a018b5c24208b442450909090e8faedffffb801000000eb66837c2428017545ff74244cff74240cff74241450ff742414ff742450ff742458ff742454ff742430ff742438ff742444ff7424608b5c2474b801000000909090e872100000eb63e9b9010000b9ffffffff334c242c83c101234c240c83f901746483f901eb05e99a010000745db9ffffffff334c242c83c101234c240cba01000000bb0300000083fa2f750cb858f07fb28b5d049090ff1389de23f183fe01751883c2028d5c1bffeb05e9560100003b650c7303ff5524ebcef6c201741183fa017d24eb10e9a5000000e9a0000000f642ff10741289d3b88c6c7ab2909090ff1588c75208eb0289d0ff7504b95a0c80b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13ff74243cff742410ff74240cff74241cff742424ff74241cff742464ff7424388b5c2420e896130000eb64b9ffffffff334c242c83c10181e19f01000089cb8b44243c90e8f6e0ffff83f8017546ff74244cff74240cff742414ff74240cff742414ff742450ff742458ff742454ff742430ff742438ff742444ff7424608b5c2474b80100000090e8e60e0000eb32e92d000000ff74243cff742410ff74240cff74241cff742424ff74241cff742464ff7424388b5c24208b009090e8fe12000083c418eb0eb80100000057eb06b80100000057837c240801740a8b5c240890e8e21900008b4c24348b5424308b5c242c8b7424288b7c2424508b442424508b442424508b442424508b442424508b442424894c244889542444895c24408974243c897c24388b4c240c894c24348b4c2408894c24308b4c2404894c242c5983c40c894c2418894424145b5883c408e9c7f8ffff89d8c2280090900000000044070000|@9070,2097151,@955|38,1,@8978 88,0,0 201,0,1 214,0,31 244,0,0 270,1,@9015 275,0,0 334,0,0 342,1,@9043 354,0,-1 387,0,-1 403,0,0 408,0,1 418,0,@8999 493,0,@5215 502,0,I106 514,0,$9042+566 534,0,@5401 546,0,@8950 584,0,@8952 638,1,@9047 720,0,1 733,0,31 772,0,207 779,0,8323072 784,0,-1 806,1,@8998 864,0,0 870,1,@9043 918,1,@9047 997,0,0 1097,0,1 1110,0,31 1147,0,0 1174,1,@9015 1179,0,0 1242,0,0 1250,1,@9059 1262,0,-1 1295,0,-1 1311,0,0 1316,0,1 1326,0,@8999 1401,0,@5215 1410,0,I106 1422,0,$9042+1474 1442,0,@5401 1454,0,@8950 1492,0,@8952 1546,1,@9064 1553,0,-1 1578,1,@8998 1640,0,0 1646,1,@9059 1698,1,@9064 1708,0,0 1716,0,0 1734,1,@9069 9043:D3,616|3b650c7303ff5524ff74242889d8bb0100000089c18b44243089ca90ff128b4d008d49e83b4d087303ff5520894d00c741fc020000008b542424895104c7015b0000008d590cc743fc02000000c7430401000000890b6a016a01837c2428017470833a0175128b4a04f6c101740583c1207120ff5538ebf6837a080375128b4a04f6c101740583c1107108ff5538ebf68b4a04f6c10175108b31f641ff107402f7de8d743601eb0289ce89f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010b7424245350eb05e91f00000089f38b44242890e856efffff8d4c2408c701010000008d4c2408894104eb70833a0175128b4a04f6c101740583c1207120ff5538ebf6837a080375128b4a04f6c101740583c1107108ff5538ebf68b4a04f6c10175108b31f641ff107402f7de8d743601eb0289ce89f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010b74242489e1eb05e90d000000893189e1c741040100000053508b4424248b008b4d008d49d43b4d087303ff5520894d00c741fc02000000894104c7010b0000008d510cc742fc0100000089028d4208c740fc050000008950108b54241c89500c8b5c24088958088b5c242089580489088b4c243c508b5c241c8b4108909090e8aa8fffff8b4424248b00a801740583c0027105ff5538ebf68b4c242489018b098b4424148b00f6c1017408a80174043bc8eb05ff5538ebf77e0c8b4424248b008b4c24148901833c240175068b442404eb0e8b1c248b4424049090e83e00000083f801750783c40c58c22c0089c38b44240c83c4105983c42c51e9770000009090900000000064020000|@9046,2097151,@937|15,0,0 63,0,45 80,0,0 173,0,1 186,0,31 222,1,@9016 232,0,0 321,0,1 334,0,31 369,0,0 410,0,5 478,1,@8774 570,1,@9044 601,1,@9045 9044:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@935| 9045:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@936| 9046:S72|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d736176655265674f6e537461636b283129 9047:D3,1128|3b650c7303ff552483380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09012354241483fa01740583fa0175688b4c241c833901756483380175648b55008d52c83b55087303ff5520895500c742fc03000000894208c7420403000000c7022b0000008d7210c746fc03000000c7460801000000894e04c706230000008d7e10c747fc02000000c747040100000089378d770ceb0fe9ef010000e936010000e90e000000c746fc02000000897e048916eb708b55008d926cffffff3b55087303ff5520895500c742fc04000000c7420c01000000c7420803000000894204c7022d0000008d7214c746fc03000000c7460801000000894e04c706230000008d7e10c747fc02000000c747040100000089378d770cc746fc02000000897e048916eb05e9ab0000008d560cc742fc02000000897204c702ec1580b28d720cc746fc04000000c7460cf9ffffffc7460834c47fb2894604c706010000008d7e14c747fc03000000c7470805000002897704c7076f0000008d7710c746fc03000000894608c7460405000000c706010000008d4e10c741fc02000000c741040100000089318d710cc746fc02000000894e04893e83fe01750489d6eb1589c75389f389d0909090e86a02000089c689f8eb6553eb6753eb6983380175698b55008d52cc3b55087303ff5520895500c742fc03000000894208c7420403000000c7022b0000008d7210c746fc02000000894e04c706250000008d7e0cc747fc02000000c747040100000089378d770cc746fc02000000eb14e956000000e951000000e94c000000e907000000897e048916eb378b55008d52e43b55087303ff5520895500c742fc03000000894a08894204c7024f0000008d7210c746fc02000000c7460401000000891653eb06be01000000538b4c241c5650ff7104ff71088b198b442430909090e8bedcffff8b0c2483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2fe235424205089d38b4424289090e842e9ffff50ff742434ff742434ff742434ff7424148b5c24208b4424349090e8420100008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542408895104c701090000008b55008d52e83b55087303ff5520895500c742fc050000008b5c2418895a108b74241c89720cc74208010000008b7c2420897a04890a8b4c243450528b5c242c8b4108e8028affff837c24100175068b442408eb0f8b5c24108b4424089090e8fe04000083f80175068b442404eb0d89c38b4424049090e83e05000083f80175075883c414c2200089c38b042483c4185983c42051e9780500000000000064040000|@9058,2097151,@945|84,0,1 97,0,31 170,0,1 176,0,21 193,0,0 202,0,17 219,0,0 289,0,0 296,0,1 305,0,22 322,0,0 331,0,17 348,0,0 391,0,@9048 408,0,-4 415,0,@8817 424,0,0 441,0,16777218 450,0,55 470,0,2 476,0,0 493,0,0 534,1,@9049 585,0,1 591,0,21 610,0,18 627,0,0 704,0,39 721,0,0 731,0,0 758,1,@9004 841,0,1 854,0,31 886,1,@9016 918,1,@9050 949,0,0 962,0,4 1007,0,0 1034,1,@8774 1062,1,@9055 1086,1,@9056 1116,1,@9057 9048:O1|56 9049:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@938| 9050:D3,468|3b650c7303ff55248b0ba8017409f6c10174043bc1eb05ff5538ebf77d4e8b4c241089df5089c38b4108909090e826c4ffffa801754a8b0883390575488b51043b5424107449833a0175138b5c2410833b0175578b72043b73047433eb5a833a03755a8b5c2410833b03eb05e95101000075678b72043b730475648b7208eb0ae9eb000000e9e60000003b730875708b54240c57ff7010ff700cff7008ff7004ff7108ff7204ff7208eb05e9b80000008b1a8b442430eb0ae9ab000000e9a6000000909090e812daffff8b4c242c8b510c50ff7204ff7208eb0ae989000000e9840000008b1a8b44242c909090e8f60000008b45008d40d83b4508730aeb05e964000000ff5520894500c740fc030000008b4c24048948088b4c2424894804c700050000008d5010c742fc050000008b5c2414895a108b5c2410895a0c8b5c240c895a088b5c2408895a0489028b442430528b5c24208b500889d09090e8d287ffff5883c414eb0eb80100000057eb06b801000000578b4c2404f6c101740583c1027105ff5538ebf650ff74241cff74241cff74241cff74241c8b5c241489c890e85afeffff833c2401750683c40cc210008b1c2483c40c5983c41051e9d6010000b801000000c21000909000000000d0010000|@9054,2097151,@941|46,1,@8978 198,1,@9004 238,1,@9051 289,0,2 350,1,@8774 361,0,0 369,0,0 446,1,@9053 451,0,0 9051:D3,380|83380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c101740783f9017d08eb1df641ff1075178b13f6c1017409f6c20174043bcaeb05ff5538ebf77c0e89c2b8f0ea7ab28b5d049090ff1389caf6c201740583c2027105ff5538ebf68b5453fe89d6f7c601000000740583c6027105ff5538ebf6f6c101740783f9017d08eb20f641ff10751a8b3bf6c101740cf7c70100000074043bcfeb05ff5538ebf77c0f89c7b8b0f57ab28b5d04909090ff13f6c101740583c1027105ff5538ebf689744bfe83fa0175728b4c24048b0983380175118b4004a801740583c020711fff5538ebf68378080375118b4004a801740583c0107108ff5538ebf68b4004a80175108b10f640ff107402f7da8d541201eb0289c289c889d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2feeb05e91000000023c28b4c24048901b801000000c20800b801000000c208000000000078010000|@9052,63,@939|94,0,@6373 193,0,@6397 310,0,1 323,0,31 357,0,0 365,0,0 9052:S23|434f444547454e5f5441424c4528292e696e6372283429 9053:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@940| 9054:S83|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665526567496e5265672831297265674368616e676564283129 9055:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@942| 9056:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@943| 9057:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@944| 9058:S70|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665526567496e526567283129 9059:D3,732|3b650c7303ff5524ff74242c89d8bb0100000089c18b44243489ca90ff128b4c242881e19f01000083f901746283f90174628b4c242881e19f010000ba01000000bb0300000083fa2f750e89c6b858f07fb28b5d049090ff1389de23f183fe01751183c2028d5c1bff3b650c7303ff5524ebd3f6c201740783fa017d27eb06f642ff10741f5089d3b88c6c7ab2eb0ae9a7000000e9a2000000909090ff1588c75208eb0589c189d051ff7504b9d21c80b251896504a801740583f82f720f89c1b8cc7b7ab28b5d04909090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7015b0000008d410cc740fc02000000c74004010000008908eb428b4d008d49e43b4d087303ff5520894d00c741fc030000008b5424208951088b5c2424895904c7015900000089c68d4110c740fc02000000c74004010000008908568b4c242050ff7104ff71088b198b442434909090e8a2d3ffff6a016a01837c2428017424508b5c243c8b442430909090e88ae0ffff8d4c2404c701010000008d4c2404894104eb1289e18b542438891189e1c7410401000000508b4424288b008b4d008d49d43b4d087303ff5520894d00c741fc02000000894104c7010b0000008d510cc742fc0100000089028d4208c740fc050000008950108b54242089500c8b5c24048958088b5c242489580489088b4c2444508b5c24208b4108909090e84e81ffff8b4424288b00a801740583c0027105ff5538ebf68b4c242889018b098b4424188b00f6c1017408a80174043bc8eb05ff5538ebf77e0c8b4424288b008b4c24188901837c24100175068b44240ceb0d8b5c24108b44240ce85200000083f80175058b0424eb0a89c38b0424e89600000083f801750a83c4085883c408c2300089c38b44240883c4145983c43051e9cc00000000000000d8020000|@9063,2097151,@949|15,0,0 61,0,0 66,0,1 78,0,@8999 137,0,@5215 158,0,I106 173,0,$9059+226 193,0,@5401 206,0,@8950 244,0,@8952 290,0,45 307,0,0 355,0,44 374,0,0 402,1,@9004 430,1,@9016 440,0,0 466,0,0 506,0,5 574,1,@8774 666,1,@9060 686,1,@9061 720,1,@9062 9060:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@946| 9061:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@947| 9062:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@948| 9063:S75|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d736176654469726563744f6e537461636b283129 9064:D3,1432|3b650c7303ff55248b4c24205053ff7104ff71088b198b442408909090e8cad0ffff8b4c240483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2fe235424245089d38b44242c90e84eddffff8b4c240883390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09012354242883fa01740c83fa017407b901000000eb608b4c242881e19f01000083f901745683f90174568b4c242881e19f010000ba01000000bb0300000083fa2f750d89c6b858f07fb28b5d0490ff1389de23f183fe01751183c2028d5c1bff3b650c7303ff5524ebd4f6c201741683fa017d27eb15e955030000e9c3020000e9be020000f642ff1074105089d3b88c6c7ab2ff1588c75208eb0589c189d051ff7504b9222280b251896504a801740583f82f720f89c1b8cc7b7ab28b5d04909090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13833801756d8b4c240c83390175698b55008d52c83b55087303ff5520895500c742fc03000000894a08c7420403000000c7022b0000008d5a10c743fc03000000c7430801000000894304c703230000008d4310c740fc02000000c740040100000089188d480cc741fc02000000894104eb0ae91e010000e9040000008911eb708b55008d926cffffff3b55087303ff5520895500c742fc04000000c7420c01000000c7420803000000894a04c7022d0000008d5a14c743fc03000000c7430801000000894304c703230000008d4310c740fc02000000c740040100000089188d580cc743fc020000008943048913eb05e9e00100008d430cc740fc020000008958049090c700ec1580b28d500cc742fc04000000c7420cf9ffffffc7420834c47fb2894a04c702010000008d5a14c743fc03000000c7430805000002895304c7036f0000008d5310c742fc03000000894a08c7420405000000c702010000008d7210c746fc02000000c746040100000089168d560cc742fc02000000897204891a83fa01750489c1eb6789d3e81202000089c1eb618b4c240c833901755d8b55008d52cc3b55087303ff5520895500c742fc03000000894a08c7420403000000c7022b0000008d5a10c743fc02000000894304c703250000008d430cc740fc02000000c740040100000089188d480ceb0fe9df000000e9da000000e90e000000c741fc020000008941048911eb6e8b55008d52e43b55087303ff5520895500c742fc03000000894208894a04c7024f0000008d4a10c741fc02000000c74104010000008911eb6f8b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54242489510cc7410834c47fb28b5c2404895904c70101000000eb05e9540000008b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b088b4c2408894b04c703450000008b4d008d49f43b4d08730aeb05e91a000000ff5520894d00c741fc02000000c7410401000000891950eb01508b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b54240c895004c700090000008b55008d52e83b55087303ff5520895500c742fc050000008b5c241c895a108b74242089720cc74208010000008b7c2424897a0489028b44241851528b5c241c8b500889d09090e8ee79ffff833c240175068b442408eb0c8b1c248b442408e89600000083f801750a83c4045883c40cc2200089c38b44240483c4145983c42051e9cc0000000000000094050000|@9068,2097151,@953|30,1,@9004 114,0,1 127,0,31 158,1,@9016 242,0,1 255,0,31 285,0,0 322,0,0 327,0,1 339,0,@8999 412,0,@5215 418,0,I106 433,0,$9064+486 453,0,@5401 466,0,@8950 504,0,@8952 565,0,1 571,0,21 588,0,0 597,0,17 614,0,0 679,0,0 686,0,1 695,0,22 712,0,0 721,0,17 738,0,0 783,0,@9048 800,0,-4 807,0,@8817 816,0,0 833,0,16777218 842,0,55 862,0,2 868,0,0 885,0,0 918,1,@9065 965,0,1 971,0,21 990,0,18 1007,0,0 1079,0,39 1096,0,0 1138,0,@8817 1151,0,0 1198,0,34 1236,0,0 1273,0,0 1286,0,4 1331,0,0 1362,1,@8774 1386,1,@9066 1420,1,@9067 9065:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@950| 9066:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@951| 9067:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@952| 9068:S73|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665446972656374496e526567283129 9069:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@954| 9070:S46|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e7472696573283229 9071:S13|70757368526567697374657273 9072:S32|434f444547454e5f5441424c4528292e70757368526567697374657273283529 9073:O2|@9084,@9032 9074:D3,500|3b650c7303ff5524f644240401756c8b4c24048b702c8b36f7c601000000740bf6010174063b317f07eb12ff5538ebf589c6b8282a80b28b5d0490ff138b702c8b36f7c6010000007508f601017503ff55383b31750589d8c204006a016a01535052ff702c8d5c24108b720489f29090ff12837c2410017423eb05e980000000837c240c0175068b442414eb598b5c240c8b442414e8c2010000eb4a8b04248b00a801740583c0027105ff5538ebf68b0c248901837c240c0175068b442414eb0d8b5c240c8b442414e8e601000083f8017507b82c2b80b2eb0c89c3b82c2b80b2e83e0200008b4c241c83c404894c241889c38b4424045a83c410e900ffffff8b482c8b098b701c8b36f7c601000000740583ee027105ff5538ebf6535052f7c601000000740783fe017c4ceb06f646ff1075588b44240489f75189fb8b500889d0909090e83ab1ffffa8017543f640100175338b40108b00a801740583c0027105ff5538ebf6a8017412f6042401740c3b04247e0ceb1ce93d000000ff5538ebef8b0424eb0d8b0424eb08e9290000008b0424f7c701000000740583ef027105ff5538ebf689fe83c40489c13b650c7303ff5524e965ffffff89c88b4d008d49f83b4d087303ff5520894d00c741fc010000008901894c24108b5c24088b4424045a83c408e915feffff9000000000f0010000|@9083,1048575,@960|51,0,@9075 150,1,@9078 202,1,@9079 212,0,@9080 221,0,@9080 226,1,@9082 326,1,@8978 9075:O4|@4608,@5398,@9077,@9076 9076:O5|@9007,949,0,949,0 9077:S32|707573685265676973746572733a20756e707573686564207265676973746572 9078:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@957| 9079:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@958| 9080:O2|@9081,0 9081:O2|42,1 9082:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@959| 9083:S29|434f444547454e5f5441424c4528292e616c69676e537461636b283329 9084:D3,144|3b650c7303ff55248b482c8b098b75008d76f03b75087303ff5520897500c746fc03000000c706682c80b2894e048946088066ffbf5351ff702c566a016a01bbffffff008b520490ff128b0c248b09f6c101750af6442404017503ff55383b4c24047407b901000000eb05b90300000083f1028b54240883c408890a894204b80100000083c404c3000000008c000000|@9096,1048575,@962|39,0,@9085 64,0,8388607 101,0,0 108,0,1 128,0,0 9085:D3,188|3b650c7303ff55248b4a0889d789c38b4108909090e822aeffffa801740f89c1b8382d80b28b5d04909090ff138b0883390b752b8b5104f6c201740df647040174073b57047f07eb10ff5538ebf4b8902d80b28b5d0490ff13b801000000c3f640100175478b50108b1af6c301740df647040174073b5f047c07eb11ff5538ebf4b8ec2d80b28b5d049090ff13f6c3017509f64704017503ff55383b5f047406b801000000c3b803000000c3b801000000c3909000000000b8000000|@9095,63,@961|22,1,@8978 33,0,@9086 79,0,@9089 90,0,0 130,0,@9092 161,0,0 167,0,1 173,0,0 9086:O4|@4608,@5398,@9088,@9087 9087:O5|@9007,885,0,885,0 9088:S33|70757368416e79456e747279417443757272656e7453503a206e6f20656e747279 9089:O4|@4608,@5398,@9091,@9090 9090:O5|@9007,890,0,890,0 9091:S40|70757368416e79456e747279417443757272656e7453503a20656e7472792061626f766520727370 9092:O4|@4608,@5398,@9094,@9093 9093:O5|@9007,899,0,899,0 9094:S39|70757368416e79456e747279417443757272656e7453503a20756e70757368656420656e747279 9095:S56|434f444547454e5f5441424c4528292e70757368416e79456e747279417443757272656e74535028312973656c656374456e747279283129 9096:S42|434f444547454e5f5441424c4528292e70757368416e79456e747279417443757272656e745350283129 9097:S19|4e6f2066726565207265676973746572733a20 9098:O5|@9007,1170,0,1170,0 9099:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@963| 9100:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@964| 9101:S16|6765745265676973746572496e536574 9102:S35|434f444547454e5f5441424c4528292e6765745265676973746572496e536574283229 9103:O4|@4608,@5398,@9105,@9104 9104:O5|@9007,3122,0,3122,0 9105:S27|72656769737465724172673a206e6f6e2d656d70747920636f6465 9106:O5|@9107,1,0,0,0 9107:O3|4,@8794,0 9108:S7|70757368526567 9109:S22|7365744c69666574696d653a206e6f20656e74727920 9110:O5|@9007,482,0,482,0 9111:S26|706172616d65746572496e52656769737465723a206c6f636e3d 9112:S10|206c69666554696d653d 9113:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@966| 9114:D3,92|3b650c7303ff5524a801753f8338017407b901000000eb05b90300000083f102518b400490e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000058000000|@6329,3,@967|18,0,0 25,0,1 76,0,0 9115:O2|@5279,@9116 9116:O2|@5347,@9117 9117:O2|@8967,0 9118:O2|@5643,@9119 9119:O2|@8791,0 9120:D3,324|3b650c7303ff5524a801755d833801755df644240401755b8b4c24048b55008d52f83b55087303ff5520895500c742fc010000008b31893252ff71048b40049090e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400e9c6000000e935000000ff7424048b4004909090e87effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c20400f6c30175548b4d008d49f83b4d087303ff5520894d00c741fc010000008b13891151ff7424088b530489d38b4004909090e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400ff7424048b400490e8f2feffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c20400b801000000c204000000000040010000|@9121,31,@968|161,0,0 301,0,0 309,0,0 9121:S35|5838364c4f574c4556454c28292e61726752656773283129616c6c6f63526567283329 9122:D3,88|3b650c7303ff5524a801753b833801752eff308b4004909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b4004e9b9ffffffb801000000c39090900000000054000000|@5094,3,@969|72,0,0 9123:O1|@9124 9124:D3,848|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b10833a01755df6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b3564e039b289d889f290ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7003c3780b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b8d8327bb2c38b30f6c301740583eb027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc02000000895f048b5e04891f8b0d64e039b289f889ca90ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c700ec3780b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090000000004c030000|@9137,1048575,@970|30,0,@6514 91,0,@4587 145,0,123 154,0,91 187,0,@5642 227,0,@5643 263,0,@5594 283,0,0 290,0,1 297,0,3 303,0,0 342,0,0 363,0,@5592 382,0,@9125 404,0,0 411,0,0 418,0,1 424,0,0 451,0,@6514 507,0,@4587 554,0,123 563,0,91 596,0,@5642 634,0,@5643 670,0,@5594 690,0,0 697,0,1 704,0,3 710,0,0 749,0,0 770,0,@5592 791,0,@9133 813,0,0 820,0,0 827,0,1 833,0,0 9125:O5|0,0,0,@9127,@9126 9126:O2|@9131,0 9127:O2|@9128,0 9128:O2|0,@9129 9129:O5|@9130,177,177,0,0 9130:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f47454e45524154455f434f44452e4d4c 9131:O2|3,@9132 9132:S8|417267496e526567 9133:O5|0,0,0,@9127,@9134 9134:O2|@9135,0 9135:O2|3,@9136 9136:S10|4172674f6e537461636b 9137:S17|7072696e742d6172674c6f636174696f6e 9138:D3,1036|3b650c7303ff5524a801756b833801756bf6c301740f8b4804b86c3c80b28b5d049090ff136a016a0189e151ff742414ff7424148b5b048b4004909090e8beffffff8b442404a801740583e8027105ff5538ebf68b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c70103000000eb0ae95b030000e9310000008d410cc740fc020000005a895004890859f6c101740583e9027105ff5538ebf68b54240c8902894a04b801000000c20c008b08f6c30174108b5004b86c3c80b28b5d04909090ff136a016a01ff33ff318d54240852ff74241cff74241c8b5b048b480489c8909090e812ffffff8b4424188b0083f8017507b801000000eb0e89c3b8010000009090e86a0300008b4c241889018b4424148b542404f6c201740783fa017e5beb06f642ff1075588b1c24833b0175158b7304f7c601000000740583c6207123ff5538ebf6837b080375158b7304f7c601000000740583c6107108ff5538ebf68b7304f7c601000000751a8b3ef646ff107402f7df8d7c3f01eb0ce906020000e90102000089f789f9be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c0901ff7020ff702489f390e8b2b1ffff83780401740db8e42f80b28b5d04909090ff138b45008d40d83b45087303ff5520894500c740fc03000000c74008010000008b4c2408894804c700090000008b4c241c8b511c8b128d5810c743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b41089090e8f664ffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44242890e8fa67ffff8b44242483c4048b1c248b480889c8e8da9fffffa801745750bb030000008b442404bafc317ab2e842f7f9ff89c3b86c3080b2e8a6d0f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c8c3080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc050000008b50108951108b5c241089590c8b70088971088b78048979048b1889198b5c2420518b4b088b5c240489c890e81264ffff837c240401745db8a43080b28b5424089090ff12bb030000008b0424bafc317ab29090e88ef6f9ff8b5424089090ff12b8c83080b28b54240890ff12bb030000008b442410bafc317ab290e866f6f9ff8b5424089090ff12b8150000008b54240890ff125883c408eb05b8ffffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc0200000083c4085a89500489088b4c2410890158894104b801000000c20c0083fb01740db86c3c80b28b5d04909090ff138b44240cc70001000000c7400401000000b801000000c20c0090900000000008040000|@9143,2097151,@972|26,0,@9139 113,0,1 171,0,0 189,0,@9139 250,0,0 259,0,0 266,1,@9142 400,0,1 413,0,31 438,1,@8997 449,0,@9103 488,0,0 501,0,4 527,0,0 534,0,0 541,0,0 548,0,1 570,1,@8774 604,0,@9108 614,1,@8783 634,1,@8978 644,0,1 653,0,@5052 658,1,@5053 665,0,@9109 670,1,@4940 701,0,@9110 711,0,@5398 717,0,@4608 798,1,@8774 810,0,@9111 823,0,1 831,0,@5052 838,1,@5053 851,0,@9112 863,0,1 872,0,@5052 878,1,@5053 891,0,10 909,0,-1 942,0,0 976,0,0 989,0,@9139 1007,0,0 1014,0,0 1019,0,0 9139:O4|@4608,@5398,@9141,@9140 9140:O5|@9130,188,0,188,0 9141:S35|4d69736d61746368656420617267756d656e742074797065732f6c69666574696d6573 9142:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@971| 9143:S36|47454e45524154455f434f444528292e636f646567656e2839296d617041726773283229 9144:O1|@8993 9145:O5|@9147,@9726,@10298,@9727,@9146 9146:O3|@10772,@9145,@10298 9147:D3,12536|8dbc2454ffffff3b7d0c7303ff5528837c2448037407b901000000eb05b90300000083f1028b30bfaa3d80b28d7cb7fcffe7e9e5000000909090e991010000909090e9800d0000909090e9da0d0000909090e98f0e0000909090e963000000909090e9cf0e0000909090e968100000909090e927110000909090e9981b0000909090e9461d0000909090e9ac1d0000909090e96b1e0000909090e9ca210000909090e99c230000909090e934260000909090e9ce290000909090e9d12a0000909090ff700c53ff742450ff742450ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244c8b58048b480889c88b5210909090ff12eb7152ff7004ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff74244489d38b4008e8a62f0000ff74244050ff74240cff742450ff742448ff742448ff742448ff742448ff742448ff742448eb05e93d2e0000ff742448ff742448ff742448ff742448ff742448ff742448ff742440ffb42494000000ffb424940000008b9c2488000000b80100000090e8da5d0000eb5df644244401755b8b4c24448b19833b0175158b7304f7c601000000740583c6207123ff5538ebf6837b080375158b7304f7c601000000740583c6107108ff5538ebf68b7304f7c601000000751a8b3ef646ff107402f7df8d7c3f01eb0ce99a2d0000e93d00000089f789f9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09018b4d008d49f83b4d087303ff5520894d00c741fc010000008919eb12837c24480174068b4c2448eb05b968c480b2bb010000008b7008f7c601000000751cf6c301740583c3027105ff5538ebf68b76043b650c7303ff5524ebdc5251ff700cff7010ff7004ff700889d8bb70c480b29090e8c2f7faff89c358ba74587cb2909090e82a18fcffbbd8c480b29090e866ddfaff909090e896850000909090e8ee8500006a016a016a01f644241001751e8b4c241089e2c7020300000089e2c742040100000089e28b19895a08eb70a801740c89c1b81c777bb28b5d04ff138b088b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04891a6a016a0189c6f7c60100000075498b0e8b59043b1a72028b1a8b79043b7a0477038b7a048b55008d52f43b55087303ff5520895500c742fc02000000eb05e93c000000897a04891a8b4e0489ce3b650c7303ff5524ebaf89e18b1a891989e18b72048971048d4c2408c701010000008d4c24085f8979048d4c24045f897908506a016a016a01ff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cbb030000008b4424588b542468909090e8d2fbffff83f801750e89c1b8447080b28b5d049090ff138b4c245c8b511c8b128b59048b1b8b71148b368b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f0489178b511c8b12568b710489168b512c8b128b711489166a016a016a015357689f0100006a038d542410528b188b842480000000909090e86a2e0000bb9f0100008b4424749090e882a9ffff837c242c017407b901000000eb05b903000000ff30ff7004ff742410ff74240851ff7424308b5c24388b44243c9090e81a850000837c24180175058b0c24eb1c8b70048b7808ff308b5c241c8b442404909090e80a8b000089c1eb08ff308b78088b700483f90175058b0424eb0a89cb8b0424e8428b00008b4c247c83c4088b0983f901740a89cb909090e8828b00008b4c247489018b442478568b5c24148b500889d0909090e8c297ffffa801745b5750bb030000008b44241cbafc317ab2909090e826eff9ff89c3b8f0ff7fb2e88ac8f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff107417576a038b5c241c8b8424840000009090e8b2b5ffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c247c57528b5c241c8b4108909090e8be5bffffb8010000008b4c247c8b0983f901740889cb90e8c68a00008b4c247c89018b8424800000008b500cff7204ff72088b1a8b442410909090e82aadffff8b4c247c8b0983f901740989cb9090e8e68a00008b4c247c89018b842480000000ff7020ff7024ff702c8b581c8b500889d090e85a5d00008b8c24800000008b5110c702030000008b19c703030000008b75008d76f03b75087303ff5520897500c746fc03000000c74608010000008946045f893e5089cb89f090e8d28a00008b4c247c8b0983f901740989cb9090e8c28c00008b4c247c89018b44242c8b5424048b5c242483fa017507b801000000eb5a83fb01755a8b4d008d49e83b4d087303ff5520894d00c741fc020000008b1a895904c701390000008d710cc746fc02000000c7460401000000890e8b4c247c8b0983f901741e8b7a045089cb89f0909090e8a68c000089c6eb0ee9d8000000e927000000508b7a048b84248000000089305983c102bb0100000089fa89c83b650c7303ff5524e969ffffff8b0b3b4104751883c0028b4b0489cb8b52043b650c7303ff5524e94affffff8b75008d76f43b75087303ff5520897500c746fc020000008b3a897e04c706390000008b7d008d7ff43b7d087303ff5520897d00c747fc02000000c747040100000089378b74247c8b3683fe017415ff7204505389f389f8909090e84a8c000089c7eb05ff720450538b84248800000089388b4c240483c1025b83c4045a89c83b650c7303ff5524e9bdfeffffff742440ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000bb030000008b8424840000008b94248c000000e8fef6ffff837c244001750c89c1b85cd280b28b5d04ff13f644244001756c8b4c244083f801750c89c2b8b0d280b28b5d04ff138b9424800000008b1a8b1b83fb01741e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b008903eb706a016a016a01ff316a038d5c2408538b1889d0909090e89e2900008b84248800000083c4048b00eb05e94700000083f80175068b442404eb0e89c38b442404909090e8de8b00008b8c248400000089018b5d008d5bf83b5d087303ff5520895d00c743fc010000005883c4048903eb0ae905000000bb01000000f684248c0000000175448b8424800000008b088b0983f901753489de508b5c2460b8010000009090e8d68b00008b4c247c8b0983f901740989cb9090e8da8d00008b4c247c8901b801000000eb07b80100000089de6a016a018b8424880000008b48108b0983f901741389e1c7010100000089e1c7410401000000eb7656ff7010ff7020ff7024ff702c8b581c8b480889c89090e8a65900008b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e99a000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5c24088959085e83c40489710489018d44240489088d442404895004eb01568b8424880000008b0083f80175068b442408eb0e89c38b442408909090e8be8c00008b8c24880000008901833c24017507b801000000eb6b8b04248b94248c0000008b3889fb8b4208e87291ffffa801745f5750bb0300000089f8bafc317ab290e8dae8f9ff89c3b8f0ff7fb2e83ec2f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb05e9b000000089c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a0389fb8b84249000000090e862afffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b8c248c0000005289fb8b4108909090e86e55ffffb8010000008b8c24880000008b0983f901740989cb9090e8ee8b00008b8c24880000008901b801000000ff742430ff742410ffb42494000000ffb42494000000ff742460ffb424a4000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb4249c000000ffb42494000000ffb424e4000000ffb424e40000008b5c24648b84248c000000e89e8b00006a016a0150ff7424248d442408508b9c24a00000008b4424189090e89e9400008b8424940000008b48048b54242489118b50148b5c2434891a8b9c24900000008b1b83fb0175068b5c2404eb0d8b4424049090e86ac5000089c38b84249000000089185983c458eb5dff700cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244c8b58088b480489c88b5208909090ff12eb70e99d2100008b4d008d49dc3b4d087303ff5520894d00c741fc020000008b4004894104c701070000008b4424388b501c8b128d590cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890b52ff7024ff701c5389d38b480889c8e87653ffffeb05e92b2100008b442408a801740583c0027105ff5538ebf6598901833c240174126a01bbf01081b28b4424449090e87256ffff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908eb6c8b58048b442438e89ac400008b4c24348b0983f90175058b4804eb108b3089cb8b4004e886c8000089c1eb028b308b44243489088b4d008d49f83b4d087303ff5520894d00c741fc010000008931eb6d6a016a01518d54240452ff74244cff74244cff742428ff742448eb05e96d200000ff74242cff7424548b58088b500489d09090e87ec800008b4424408b0083f80175068b442408eb0b89c38b442408e83ed100008b4c24408901833c240174278b45008d40f83b4508730aeb05e91a200000ff5520894500c740fc010000008b5424048910eb6c8b4424448b5c24048b500889d0909090e85a8dffffa801745850bb030000008b442408bafc317ab2e8c2e4f9ff89c3b8f0ff7fb2e826bef9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c8eb0ae98f1f0000e9060000008b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24088b4424489090e846abffffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2444528b5c24088b4108e85651ffffb8010000008b4c24408b0983f901740889cb90e856d000008b4c24408901b801000000eb7252ff70086a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb030000008b4004e8d6eeffff83f801750e89c1b8447080b28b5d049090ff13ff7424408b188b442404eb05e96f1e0000909090e822d000008b4c243c83c4088b0983f90175058b4804eb118b3089cb8b400490e89edb000089c1eb028b308b44243489088b4d008d49f83b4d087303ff5520894d00c741fc010000008931eb708b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b58048919ff742410ff742440ff742434ff74243c5168e42a81b252ff70085368ffffff008d5c24108b442460909090e8a6e200008b4c24588b0983f901740989cb9090e81ae600008b4c24588901eb05e9a21d00008b44245c8b500c8b5a048b1b81cbffffff008b7204891e8b582c8b1b8b781c8b3f8b48048b098b50148b128b75008d76f03b75087303ff5520897500c746fc03000000895608894e04893e8b781c8b3f528b5004893a8b782c8b3f8b5014893a8b7c245c8b3f83ff017507bff03581b2eb15515389fbb8f03581b2909090e8fee5000089c7eb0251538b44246489388b4c24688b512c8b128b592c8b1bf6c301740583c3027105ff5538ebf68b792c891f8b1f8b41188b00f6c3017408a80174043bd8eb05ff5538ebf77e078b3f8b411889388b45008d40d43b45087303ff5520894500c740fc02000000895004c7000b0000008b591c8b1b8d780cc747fc0100000089178d5708c742fc05000000897a10c7420c01000000c7420801000000c742040300000089025653ff7124ff711c528b410890e8ba4effff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bba8eb7fb28b44247890e8be51ffff8b44247483c4048b482c8b09f6c101740583c1027105ff5538ebf689cb9090e84ee500008b4c246c8b0983f90175058b4808eb148b70048b3889cb8b400890e88605010089c1eb058b70048b388b44246c89088b0083f8017507b8145781b2eb0f89c3b8145781b2909090e8e20501008b4c246c8901f644247c0175718b44247c8b10833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c30175108b0bf643ff107402f7d98d4c0901eb0289d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09018b4d00eb05e9190000008d49f83b4d087303ff5520894d00c741fc010000008919eb1883bc24800000000174098b8c2480000000eb05b968c480b2515657516a01ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000ffb4248c000000bb030000008b4424688b542470e8daeaffff837c240801750c89c1b85cd280b28b5d04ff13f644240801756b8b4c240883f801750c89c2b8b0d280b28b5d04ff138b54247c8b1a8b1b83fb01741e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b008903eb6f6a016a016a01ff316a038d5c2408538b1889d09090e87e1d00008b84248400000083c4048b0083f801eb05e94400000075068b442404eb0e89c38b442404909090e85e0401008b8c248000000089018b5d008d5bf83b5d087303ff5520895d00c743fc010000005883c4048903eb0ae905000000bb010000008b44247c89df8b1c248b480889c89090e81e87ffffa801745b5750bb030000008b442408bafc317ab2909090e882def9ff89c3b8f0ff7fb2e8e6b7f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff107417576a038b5c24088b8424840000009090e80ea5ffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c247c57528b5c24088b4108909090e81a4bffffb8010000008b4c247c8b0983f901740889cb90e8760301008b4c247c89018b5c24108b8424800000009090e8b60301008b4c247c8b0983f901740989cb9090e8aa0601008b4c247c8901f684248c0000000175418b8424800000008b108b1283fa017531508b5c2460b80100000090e87a7e00008b4c247c8b0983f901740989cb9090e8be0601008b4c247c8901b801000000eb05b8010000006a016a018b8424880000008b48108b0983f901741389e1c7010100000089e1c7410401000000eb74ff7010ff7020ff7024ff702c8b581c8b480889c890e84e4c00008b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e994000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5c24108959085e83c404897104890189e0890889e08950048b8424840000008b0083f80175068b442404eb0d89c38b4424049090e8ae0501008b8c24840000008901837c2408017507b801000000eb6e8b4424088b9424880000008b3889fb8b42089090e81e84ffffa801745f5750bb0300000089f8bafc317ab290e886dbf9ff89c3b8f0ff7fb2e8eab4f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb05e9b000000089c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a0389fb8b84248c00000090e80ea2ffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b8c24880000005289fb8b4108909090e81a48ffffb8010000008b8c24840000008b0983f901740989cb9090e8da0401008b8c24840000008901b801000000ffb424880000008b5c24248b4424149090e80e0501008b8c24840000008b0983f901740a89cb909090e8d60901008b8c24840000008901ff742414ffb42498000000ffb42498000000ffb42498000000ffb4249800000051ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000bb030000008b4424788b54247ce82ae5ffff837c241401750c89c1b85cd280b28b5d04ff13f644241401756c8b4c241483f801750c89c2b8b0d280b28b5d04ff138b9424880000008b1a8b1b83fb01741e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b008901eb706a016a016a01ff316a038d4c2408518b1889d0909090e8ca1700008b84249000000083c4048b00eb05e94700000083f80175068b442404eb0e89c38b442404909090e8fa0801008b8c248c00000089018b4d008d49f83b4d087303ff5520894d00c741fc010000005883c4048901eb0ae905000000b9010000006a016a0151ff7424288d442408508b9c249c0000008b442414909090e84e8600008b8424900000008b48048b54242c89118b50148b5c2430891a8b9c248c0000008b1b83fb0175068b5c2404eb0d8b4424049090e8c608010089c38b84248c00000089185983c454eb6783780c0174668b48045352ff7008f6c101755eff71046a036a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458bb030000008b018b542450eb0fe932130000e970000000e910000000e86ee3ffff593b650c7303ff5524eb88ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff7424548b5c24508b4424488b54244ce80ae3ffffeb6e52ff7004ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff7424508b40089090e8b2e2ffff5950f6c101756cff71046a036a01ff742454ff742454eb05e945120000ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454bb030000008b018b542450909090e84ae2ffff593b650c7303ff5524eb8f5883c4046a016a016a01eb69ff742448ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440bb9c6281b28b40048b520cff128b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb72e975110000bb030000008b44243890e8f68fffff8b4c24348b0983f90175058b4004eb0c89cb8b40049090e8220701008b4c243489018b0983f9017507b801000000eb0c89cbb801000000e85a0701008b4c243489018b4424388b501c8b1252ff7024ff701c68b06381b289d38b7008eb05e9fb10000089f09090e85243ffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44244490e85646ffff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908eb72837c24400175108b5804b8d86381b28b5d04909090ff138b5c24408b3351ff36ff7604ff760852ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff7424508b5c24408b400490e83e070100eb05e92d100000ff742448ff7424488b5c2408e85a0901005950f6c101755b8b0183380375598b5424488b5a0cff7104ff7004ff7224ff7304ff73088b3389f38b44240c909090e8f293ffff833c24017432508b442408e87a63ffff89c3b8944b81b2e842aef9ff6a0189c38b44245c909090e84e45ffffeb0be93d000000e927000000508b4424548b0083f80175058b0424eb0b89c38b042490e87a0c01008b4c245483c40c8901eb03ff7104593b650c7303ff5524e95effffff58a80175708b4c24448b7804ff308b1c248b4108909090e8e27cffffa801745a5750bb030000008b442408bafc317ab2909090e846d4f9ff89c3b8f0ff7fb2e8aaadf9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb0ae9b9000000e90800000089c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44245090e8ca9affffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c244857528b5c24088b4108909090e8d640ffffb8010000008b4c24488b0983f901740889cb90e89a0b01008b4c244889015883c4043b650c7303ff5524e9cefeffffb8010000005a90ff128b4424408b4810c701030000008b14248b1a8b1bf6c301740583c3027105ff5538ebf68b32891e8b5d008d5be83b5d087303ff5520895d00c743fc02000000895304c7037d0000008d7b0cc747fc02000000c7470401000000891f89f883c404909090e86a0b01008b4c24388b0983f901740989cb9090e8c60b01008b4c24388901833c240174708b44243c8b501c8b1252ff7024ff701c68102681b289d38b700889f0909090e8f23fffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44244890e8f642ffff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908eb61b801000000eb5f8b4c24388b59048b1b8b71148b368b791c8b3f528b5104893a8b792c8b3f8b5114893a8b7808833f0d75618b4f048339057559f644244c0175528b50088b4a048b7d008d7ff43b7d087303ff5520897d00c747fc02000000eb0ae9db0c0000e9d60c00008b54244c8957048b4904890f8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb05b9010000008b50045653ff700851f6c201755d8b442410ff7204ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff7424548b5c24408b48048b0289ca9090ff125a3b650c7303ff5524eb9eb801000000ff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cbb030000008b44244c8b5424589090e83adcffff8b4c244c83c4088b51048b1250ff711c8b04248b00f6c2017507a8017503ff55383bd07507b801000000eb328b44244c89d789fb8b480889c89090e82679fffff7c701000000740583c7027105ff5538ebf689fa3b650c7303ff5524ebb28b44244c83c4048b48048b54240489118b50148b5c2408891a5b83c40ceb72ff742424687c6b81b25251ff70048d44240c506a016a01bbffffff008b442458baf80280b290e82aa1ffff8b4c24488b0983f901740989cb9090e8ee0901008b4c244889016a016a016a01ff74245cff74245c51ff74245cff74245cff74245cff74245cff74245cff74245cff74245ceb05e9e50a0000ff74245cff74245cff74245cff74245cff74245cbb030000008b4424488b5424509090e81edbffff83f801750e89c1b8447080b28b5d049090ff136a016a016a016a036a038d4c2408518b188b442464909090e8060e0000837c2408017507b8406c81b2eb0e8b5c2408b8406c81b2e8ae0901008b4c245483c4048b0983f901740a89cb909090e8ee0901008b4c245089018b4424548b1c248b500889d090e8ce77ffffa801745750bb030000008b442404bafc317ab2e836cff9ff89c3b8f0ff7fb2e89aa8f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24048b4424589090e8c695ffffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2454528b5c24048b4108e8d63bffffb8010000008b4c245083c40c8b0983f901740989cb9090e83e0901008b4c244489018b4424488b5010c702030000008b18c70303000000833c2401746b8b701c8b3656ff7024ff701c68102681b289f38b500889d09090e87a3bffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44245490e87e3effff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908eb67be0100000089f0eb6352ff7008ff70046a016a016a01ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454bb030000008b400c90e8c6d8ffff83f801751aeb0ae954080000e94f08000089c1b8447080b28b5d049090ff138b0c24833923755bff306a01ff742410ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff74244cff742448bb010000008b4104e82a080100eb74ff306a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458bb0300000089c88b5424549090e8eed7ffff83f801750e89c1b8447080b28b5d049090ff138b4c2408baffffffffeb05e9cc000000bb01000000ff30ff313b1c24736589d883c0028b4c24106a016a01525053ff71048d74241056bb110000008b442408ff1548c752088b44241059d1e80fb604018d4400018b4c2410ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801740cb801000000eb0ae92c000000b80300000083f00283f80175068b442408eb038b042483c4045b83c40c89c23b650c7303ff5524e965ffffffff74241052ff742458ff742410ff74245cff74241cbb01000000b80100000090e8f242010083c4088b4424488b1c248b480889c8e81a74ffffa801745750bb030000008b442404bafc317ab2e882cbf9ff89c3b8f0ff7fb2e8e6a4f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24048b44244c9090e81292ffffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2448528b5c24048b4108e82238ffffb8010000008b4c244483c4108b0983f901740989cb9090e8524601008b4c24348901837c244803746f8b4424388b501c8b1252ff7024ff701c68102681b289d38b700889f09090e8d637ffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44244490e8da3affff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908eb6bb801000000eb698b4d008d49e43b4d087303ff5520894d00c741fc02000000c74104030000008b580889198d710cc746fc03000000c74608010000008b7804897e04c706070000008b7d008d7fc83b7d087303ff5520897d00c747fc02000000c74704030000008937eb0ae9a4040000e99f0400008d770cc746fc02000000c7460401000000893e8d7e0cc747fc02000000897704890f8d4f0cc741fc04000000c7410c03000000c7410890dd7eb2897904c7010b00000052ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cbb0300000089c8909090e872d4ffffeb70b9010000008b5804f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdf83f901750f8b5804b824ae81b28b5d049090ff1351ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440eb05e98a030000ff742440ff742440ff74244089d38b4004909090e8d6440100508b5c24409090e88a48010089c1f6c101751d8b11833a057507bb03000000eb148b510489d13b650c7303ff5524ebdebb0100000083fb01745a6a016a0189e050ff74244cff742434ff742434ff74241cff74246cbb010000008b44242090e86e4901008b4424448b0083f80175068b442404eb0b89c38b442404e8924f01008b4c244489018b0983f901750cb800ba81b2eb14e93500000089cbb800ba81b2909090e8ce4f01008b4c244489018b45008d40f83b45087303ff5520894500c740fc010000005a83c4048910eb6d8b4d008d49f83b4d087303ff5520894d00c741fc010000408b5424048911f6c201750e89c3b808a87cb28b5d049090ff1383fa01740881faffffff01720f89c3b8381c7cb28b5d04909090ff1389cb89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d00720aeb05e92e020000ff5520897d00d1e9894ffcc647ff4057f3ab5fb8010000005753f6c2017520ff7204ff742408ff74240889c38b0290e85a4f01005a3b650c7303ff5524ebdb8b44240883c404a801756f8b4c24448b7804ff308b1c248b41089090e86e6fffffa801745a5750bb030000008b442408bafc317ab2909090e8d2c6f9ff89c3b8f0ff7fb2e836a0f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb0ae9b9000000e90800000089c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44245090e8568dffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c244857528b5c24088b4108909090e86233ffffb8010000008b4c24488b0983f901740889cb90e8565101008b4c244889015883c4043b650c7303ff5524e9cffeffffb8010000008b45008d40dc3b45087303ff5520894500c740fc0200000059894804c700070000008b4c24408b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b4108909090e8c632ffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44244c90e8ca35ffff8b45008d40f83b45087303ff5520894500c740fc0100000083c40459890883c40483c4046a016a016a016a0189c383c41089d86a0183c40489c189c86a016a016a0189c183c40c89c86a016a016a0189c183c40c89c889c189c86a016a0183c408a8017566837c24480375648b4c24388b3889fb8b4108e8426dffffa80174635750bb0300000089f8bafc317ab290e8aac4f9ff89c3b8f0ff7fb2e80e9ef9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb0ae993000000e98b000000c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b44243ce8328bffffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c24385289fb8b41089090e84231ffffb801000000c24800c24800837c244803740db8e4bd81b28b5d04909090ff13b801000000c2480090909000000000f4300000|@9725,2097151,@1245|23,0,0 30,0,1 40,0,$9147+50 354,1,@9148 452,0,0 458,1,@9208 572,0,1 585,0,31 642,0,@9272 647,0,0 707,0,@9273 714,1,@6547 722,0,@7237 730,1,@7238 735,0,@9276 742,1,@6493 750,1,@9281 758,1,@9282 783,0,1 792,0,0 812,0,@6704 962,0,0 1050,0,1 1078,0,@9149 1170,0,207 1194,1,@9152 1199,0,207 1210,1,@8997 1222,0,0 1229,0,1 1262,1,@9284 1298,1,@9292 1330,1,@9293 1354,1,@9294 1382,1,@8978 1393,0,1 1402,0,@5052 1410,1,@5053 1417,0,@9019 1422,1,@4940 1453,0,@9020 1463,0,@5398 1469,0,@4608 1534,1,@9015 1606,1,@8774 1611,0,0 1630,1,@9295 1666,1,@9004 1686,1,@9296 1722,1,@9212 1738,0,1 1746,0,1 1777,0,0 1794,1,@9297 1814,1,@9307 1842,0,0 1884,0,28 1901,0,0 1930,1,@9308 1966,0,0 2049,0,28 2080,0,0 2110,1,@9309 2283,0,1 2316,0,@9310 2344,0,@9313 2422,1,@9152 2466,1,@9316 2517,0,0 2555,0,0 2562,1,@9317 2582,1,@9321 2593,0,0 2600,0,0 2631,0,0 2640,0,0 2670,1,@9212 2700,0,0 2716,0,67108860 2732,0,0 2748,0,0 2771,0,0 2816,0,1 2835,0,62 2852,0,0 2864,0,1 2954,1,@9322 2974,0,0 2998,1,@8978 3009,0,1 3016,0,@5052 3022,1,@5053 3029,0,@9019 3034,1,@4940 3065,0,@9020 3075,0,@5398 3081,0,@4608 3150,1,@9015 3222,1,@8774 3227,0,0 3250,1,@9323 3264,0,0 3418,1,@9324 3450,1,@9333 3506,1,@9416 3657,0,3 3683,0,0 3690,0,0 3697,0,0 3704,0,1 3726,1,@8774 3767,0,@9417 3778,1,@8783 3822,1,@9418 3850,1,@9426 3946,1,@9427 3974,1,@9433 4046,1,@8978 4056,0,1 4065,0,@5052 4070,1,@5053 4077,0,@9019 4082,1,@4940 4113,0,@9020 4123,0,@5398 4129,0,@4608 4202,1,@9015 4270,1,@8774 4275,0,0 4294,1,@9434 4305,0,0 4382,0,1 4402,0,@9149 4434,1,@9435 4466,1,@9445 4537,0,0 4564,0,@9446 4574,0,8388607 4590,1,@9452 4610,1,@9460 4735,0,@9461 4746,0,@9461 4754,1,@9463 4867,0,5 4904,0,0 4911,0,0 4918,0,1 4938,1,@8774 4972,0,@8996 4982,1,@8783 5018,1,@9464 5050,1,@9509 5077,0,@9510 5086,0,@9510 5094,1,@9513 5191,0,1 5204,0,31 5274,0,@9272 5397,0,1 5424,0,@9310 5452,0,@9313 5526,1,@9152 5570,1,@9514 5621,0,0 5642,1,@8978 5653,0,1 5662,0,@5052 5670,1,@5053 5677,0,@9019 5682,1,@4940 5713,0,@9020 5723,0,@5398 5729,0,@4608 5794,1,@9015 5866,1,@8774 5871,0,0 5890,1,@9515 5914,1,@9516 5934,1,@9521 5976,0,0 5982,1,@9317 6002,1,@9522 6013,0,0 6020,0,0 6049,0,0 6058,0,0 6086,1,@9212 6116,0,0 6132,0,67108860 6148,0,0 6164,0,0 6187,0,0 6232,0,1 6251,0,62 6268,0,0 6280,0,1 6362,1,@9523 6383,0,0 6410,1,@8978 6421,0,1 6428,0,@5052 6434,1,@5053 6441,0,@9019 6446,1,@4940 6477,0,@9020 6487,0,@5398 6493,0,@4608 6562,1,@9015 6634,1,@8774 6639,0,0 6662,1,@9524 6676,0,0 6698,1,@9525 6722,1,@9547 6853,0,1 6880,0,@9310 6908,0,@9313 6986,1,@9152 7030,1,@9548 7081,0,0 7114,1,@9333 7170,1,@9549 7282,0,1 7588,0,1 7694,0,@9550 7740,0,1 7750,1,@8997 7778,1,@9553 7796,0,0 7805,0,0 7810,1,@9554 7837,0,@9555 7858,1,@8774 7892,0,@9108 7902,1,@8783 7949,0,@9557 8046,1,@9560 8070,1,@9564 8122,1,@9004 8138,1,@8788 8145,0,@9480 8150,1,@4940 8166,1,@8783 8206,1,@9571 8262,1,@8978 8273,0,1 8282,0,@5052 8290,1,@5053 8297,0,@9019 8302,1,@4940 8333,0,@9020 8343,0,@5398 8349,0,@4608 8422,1,@9015 8494,1,@8774 8499,0,0 8518,1,@9572 8546,0,0 8563,0,1 8622,0,62 8639,0,0 8654,1,@9573 8674,1,@9576 8707,0,@9436 8722,1,@8774 8756,0,@9417 8766,1,@8783 8803,0,0 8950,0,0 9062,0,0 9139,0,1 9196,0,0 9218,1,@8978 9288,0,@9577 9307,0,8388607 9316,0,@9032 9322,1,@9034 9342,1,@9579 9423,0,1 9450,0,@9149 9486,1,@9152 9498,0,@9580 9509,0,@9580 9514,1,@9582 9538,1,@9583 9562,1,@8978 9572,0,1 9581,0,@5052 9586,1,@5053 9593,0,@9019 9598,1,@4940 9629,0,@9020 9639,0,@5398 9645,0,@4608 9706,1,@9015 9774,1,@8774 9779,0,0 9802,1,@9584 9821,0,1 9829,0,1 9852,0,@9436 9866,1,@8774 9900,0,@9417 9910,1,@8783 9947,0,0 10029,0,1 10062,0,@9149 10158,0,0 10166,1,@9585 10241,0,1 10266,0,@9149 10282,0,-1 10294,0,0 10332,0,8 10342,0,I104 10366,0,1 10379,0,31 10402,0,0 10414,0,1 10479,0,0 10484,0,0 10490,1,@9683 10510,1,@8978 10520,0,1 10529,0,@5052 10534,1,@5053 10541,0,@9019 10546,1,@4940 10577,0,@9020 10587,0,@5398 10593,0,@4608 10654,1,@9015 10722,1,@8774 10727,0,0 10750,1,@9688 10784,0,@9436 10798,1,@8774 10832,0,@9417 10842,1,@8783 10879,0,0 10912,0,1 10934,0,0 10946,0,3 10977,0,1 11008,0,0 11042,0,1 11049,0,@8492 11058,0,5 11136,0,1 11153,0,0 11202,0,@9689 11290,1,@9692 11302,1,@9698 11321,0,1 11343,0,0 11380,0,0 11390,1,@9699 11418,1,@9707 11436,0,@9708 11450,0,@9708 11458,1,@9709 11538,0,@7422 11556,0,16777215 11565,0,@6934 11584,0,0 11634,0,0 11662,1,@9710 11706,1,@8978 11717,0,1 11726,0,@5052 11734,1,@5053 11741,0,@9019 11746,1,@4940 11777,0,@9020 11787,0,@5398 11793,0,@4608 11866,1,@9015 11938,1,@8774 11943,0,0 11962,1,@9721 11990,0,0 12024,0,3 12050,0,0 12057,0,0 12064,0,0 12071,0,1 12094,1,@8774 12128,0,@9417 12138,1,@8783 12262,1,@8978 12273,0,1 12280,0,@5052 12286,1,@5053 12293,0,@9019 12298,1,@4940 12329,0,@9020 12339,0,@5398 12357,0,@4608 12414,1,@9015 12482,1,@8774 12487,0,0 12505,0,@9722 12518,0,0 9148:D3,428|8d7c249c3b7d0c7303ff5528a801756d8b088b1153ff7004ff7208ff32ff7204ff71046a016a016a01ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460bb030000008b44244c8b54245c9090ff1283f8017516eb05e91a01000089c1b8447080b28b5d04909090ff13833c24017407b99f010000eb05b90100fe006a016a016a01516a038d4c2408518b188b4424689090e84e0100008b44245883c4048b0083f80175068b442404eb0c89c38b44240490e8a62a00008b4c245489018b44240c83381575148b400483781c01750bb8609a80b28b5d0490ff13ff742414ff742460ff7424608b5c241c8b44240ce8162b0000837c2414017507b8ffffffffeb038b042450ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff7424608b5c245c8b44245890e88afeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4208908c23c00b801000000c23c0000000000a8010000|@6329,2097151,@992|102,0,1 133,0,@9149 152,0,207 159,0,8323072 186,1,@9152 218,1,@9202 247,0,@9203 278,1,@9206 290,0,-1 413,0,0 9149:O4|@4608,@5398,@9151,@9150 9150:O5|@9130,1082,0,1082,0 9151:S21|67656e546f537461636b3a206e6f20726573756c74 9152:D3,3644|8d7c249c3b7d0c7303ff552889c7538b4708909090e8fa69ffff83f801755e57ff770c50bb030000008b44240cbafc317ab2909090e85ac1f9ff89c3b8e07e80b2e8be9af9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff1357ff770cff7008ff30ff7010ff700cff70048b5c241c8b4708909090e87669ffffa801740f89c1b81c7f80b28b5d04909090ff13837804037407b801000000eb05b8030000008b4c240c83390975718b5104833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c30175108b33f643ff107402f7de8d743601eb0289de89f1bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c0901235c242ceb05e97901000083fb01746183fb017461837c242801752f8b4d008d49ec3b4d087303ff5520894d00c741fc020000008b5c241c89590489118d510cc742fc01000000890aeb6083f80174608b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000eb0ae906010000e9010100008911bb01000000f6c101755e8b31833e0175158b7e04f7c701000000740583c720712fff5538ebf6837e08037521eb0ae9c9000000e9bc0000008b7e04f7c701000000740583c7107108ff5538ebf68b7e04f7c70100000075158b37f647ff107402f7de8d743601eb07e93500000089fe8b790489f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bde89f93b650c7303ff5524e963ffffff89d9505268687f80b289cb8b442424e8ca82ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24248948045a89108b55008d52f83b55087303ff5520895500c742fc010000008902eb54ba0100000050eb5150eb53ba0100000050eb508b5424102354242c83fa01746583fa0174658b5424102354242cbb01000000be0300000083fb2f750d89c7b858f07fb28b5d0490ff1389f723fa83ff017527eb14e94c030000e947030000e942030000e93d03000083c3028d7436ff3b650c7303ff5524ebbef6c301741183fb017d21eb10e915030000e910030000f643ff10740f50b88c6c7ab290ff1588c75208eb0589c289d852ff7504b91a7480b251896504a801740583f82f720f89c1b8cc7b7ab28b5d04909090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13837c242c01747183380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2fe23542414eb05e94e0000008b4d008d49e83b4d087303ff5520894d00c741fc050000008b5c240c8959108b5c240889590c8951088b5424048951048b54241089118b5c241c50518b4b088b5c242889c89090e87a2affffeb1b8b4c241c8b510c50ff7204ff72088b1a90e816a3ffffb8010000008b45008d40d83b45087303ff5520894500c740fc03000000c74008010000008b0c24894804c700090000008b5424208b5a1c8b1b8d7010c746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890653ff7224ff721c568b4208909090e8ee29ffff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44242c90e8f22cffff8b44242883c4048b5c24288b480889c8909090e8ce64ffffa801745750bb030000008b44242cbafc317ab2e836bcf9ff89c3b8f0ff7fb2e89a95f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c242c8b4424289090e8c682ffffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2424528b5c242c8b4108e8d628ffff8b45008d40ec3b45087303ff5520894500c740fc02000000598948045989088d500cc742fc010000008902eb06ba010000005083fa01755f6a016a018b442418833805755f837c241c017407837c241c0175708b480483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c201751c8b1af642ff107409eb05e95a070000f7db8d5c1b01eb07e91b01000089d389d9ba0300000083ea0183f93f7605b93f000000d1e9eb05e9de000000d3e283ca018d4c09012354243883fa01745d83fa01745d837c240801745b8b4c24208b5004833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c301740783fb017d08eb33f643ff10752d8b318b36eb0fe96a000000e965000000e960000000f6c301740cf7c60100000074043bdeeb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c301740583c3027105ff5538ebf68b318b5c5efe83fb03752152ff7104ff710889f389d0909090e8f29fffff8d4c24045a891189e1894104eb3c8b5c24388b44242490e85a73ffff89e18b10891189e18b5804895904eb1e8b5c24388b442424909090e83a73ffff89e18b10891189e18b58048959048b4424248b5c24288b480889c8e80662ffffa801740f89c1b8cc7f80b28b5d04909090ff13837c24340175528b0883390b75258b5104f6c201740783fa017f0feb06f642ff107407bb03000000eb4e8b5c240883f302eb5483390575548b51043b14247507bb03000000eb57833a0175318b1c24833b01751d8b7204eb05e98b0000003b73047407bb01000000eb51bb03000000eb4fbb01000000eb4de971000000833a0375568b1c24eb0ae962000000e951000000833b03753b8b72043b7304eb05e93a00000075258b7a083b7b087407bb01000000eb29bb03000000eb22e91d000000e918000000e913000000bb01000000eb0cbb01000000eb05bb0100000083f302eb0cbb01000000eb05bb0100000083fb01746b8b4c24248b7810ff700cff7004ff30ff7008538b5c243c8b4108909090e8de60ffffa80174635750bb030000008b442444bafc317ab2909090e842b8f9ff89c3b8f0ff7fb2e8a691f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2eb05e99d000000894108c74104507b7ab2c7014ce239b289c88b5d049090ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24448b44244090e8ca7effffeb658b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c243857528b5c24448b4108909090e8d624ffffb801000000eb188b48108b500c8b70048b38525657ff7008b80100000053518b4c240c833903756ef6410401740d89c2b81c777bb28b5d0490ff138b51048b5c243c89c7ff328b43088b1c24909090e8a65fffff83f80175625750bb030000008b442408bafc317ab29090e80ab7f9ff89c3b8e07e80b2e86e90f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb05e93c000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d049090ff138b0883390b740db8188080b28b5d04909090ff138b510483c404eb07ba0100000089c76a015752ff7424248b5c24508b44244c90e8de0400008b4d008d49d83b4d087303ff5520894d00c741fc030000005a8951088b542420895104c701090000008b5c24448b731c8b368d7910c747fc05000000c7471001000000c7470c01000000c7470801000000c7470403000000890f5650ff7324ff731c578b4b0889f389c890e87223ffff8b44240ca801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44245490e87626ffff837c24180174728b44242c83380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09010b54241ceb05e9510100008b4d008d49e83b4d087303ff5520894d00c741fc050000008b5c24148959108b5c242889590c8951088b5424248951048b54242089118b542450518b5c24588b4208909090e87e22ffff8b4424508b480cff7104ff71088b198b442434e81a9bffff8b4424508b5c24548b480889c89090e8765dffffa801745750bb030000008b442458bafc317ab2e8deb4f9ff89c3b8f0ff7fb2e8428ef9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24588b4424549090e86e7bffffeb4e8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2450528b5c24588b4108e87e21ffffb801000000eb05b801000000508b4424549090e83e170000837c24340175068b4c2410eb1389c68b5c24348b442410e8461a000089c189f083f90175068b4c2408eb1189c689cb8b442408e8821a000089c189f083f90175058b0c24eb1289c689cb8b04249090e8be1a000089c189f083f901740789cbe8061b00008b4c246083c40c8b54242489115a83c428895104894108b80100000083c424c20c008b028b4c24288b1889198b7004897104c7410801000000b80100000083c424c20c00909000000000380e0000|@9201,2097151,@989|22,1,@8978 37,0,1 46,0,@5052 54,1,@5053 61,0,@9153 66,1,@4940 97,0,@9154 107,0,@5398 113,0,@4608 154,1,@8978 165,0,@9155 184,0,0 191,0,1 283,0,1 296,0,31 418,0,0 437,0,0 553,0,1 566,0,31 603,0,@9158 614,1,@9012 681,0,0 692,0,0 726,0,0 731,0,1 743,0,@8999 831,0,@5215 838,0,I106 853,0,$9152+906 873,0,@5401 886,0,@8950 924,0,@8952 1024,0,1 1037,0,31 1138,1,@8774 1162,1,@9051 1167,0,0 1198,0,0 1210,0,4 1236,0,0 1243,0,0 1250,0,0 1257,0,1 1278,1,@8774 1312,0,@9108 1322,1,@8783 1346,1,@8978 1356,0,1 1365,0,@5052 1370,1,@5053 1377,0,@9019 1382,1,@4940 1413,0,@9020 1423,0,@5398 1429,0,@4608 1490,1,@9015 1558,1,@8774 1608,0,0 1736,0,1 1749,0,31 1913,0,@6373 1966,1,@9051 1994,1,@8997 2026,1,@8997 2058,1,@8978 2069,0,@9161 2117,0,1 2146,0,1 2181,0,0 2188,0,1 2195,0,0 2255,0,0 2262,0,1 2284,0,0 2291,0,0 2298,0,0 2308,0,0 2315,0,0 2354,1,@8978 2365,0,1 2374,0,@5052 2382,1,@5053 2389,0,@9019 2394,1,@4940 2425,0,@9020 2442,0,@5398 2448,0,@4608 2510,1,@9015 2582,1,@8774 2587,0,0 2611,0,0 2635,0,@6704 2666,1,@8978 2678,0,1 2687,0,@5052 2694,1,@5053 2701,0,@9153 2706,1,@4940 2744,0,@9154 2754,0,@5398 2760,0,@4608 2781,0,@9164 2802,0,0 2826,1,@9167 2867,0,4 2893,0,0 2900,0,0 2907,0,0 2914,0,1 2938,1,@8774 2972,0,@9108 2982,1,@8783 3073,0,1 3086,0,31 3182,1,@8774 3206,1,@9051 3226,1,@8978 3236,0,1 3245,0,@5052 3250,1,@5053 3257,0,@9019 3262,1,@4940 3293,0,@9020 3303,0,@5398 3309,0,@4608 3370,1,@9015 3438,1,@8774 3443,0,0 3450,0,0 3462,1,@9190 3490,1,@9197 3518,1,@9198 3546,1,@9199 3562,1,@9200 3590,0,0 3619,0,0 3624,0,0 9153:S28|70737461636b5265616c456e7472793a206e6f7420656e7472793a20 9154:O5|@9007,264,0,264,0 9155:O4|@4608,@5398,@9157,@9156 9156:O5|@9007,492,0,492,0 9157:S23|6c6173745265666572656e63653a206e6f20656e747279 9158:O1|@9159 9159:D3,16|b803000000c39090000000000c000000|@9160,1,@973|1,0,1 9160:S46|434f444547454e5f5441424c4528292e72656d6f766552656769737465727346726f6d4361636865283229283129 9161:O4|@4608,@5398,@9163,@9162 9162:O5|@9007,1433,0,1433,0 9163:S24|6c6f6164456e7472793a20656e7472792064656c65746564 9164:O4|@4608,@5398,@9166,@9165 9165:O5|@9007,1464,0,1464,0 9166:S48|6c6f616450737461636b456e7472793a20636f6e7461696e657220656e747279206973206e6f74206f6e20737461636b 9167:D3,3164|3b650c7303ff552489c7538b4708909090e8125affff83f801756257ff7724ff772cff770c50bb030000008b442414bafc317ab290e86eb1f9ff89c3b8e07e80b2e8d28af9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4c240883390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123500883fa01740c83fa017407b801000000eb5d83780801745c83780801745bb901000000ba0300000083f92f750d8b5808b858f07fb28b5d04ff1389d323580883fb01751183c1028d5412ff3b650c7303ff5524ebd3f6c101740783f9017d2eeb06f641ff10742657ff772489cbeb0fe9ca090000e9b8020000e9b3020000b88c6c7ab29090ff1588c75208eb0689c857ff7724ff7504b9328280b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13833801756c8b4c241083390175688b55008d52c83b55087303ff5520895500c742fc03000000894a08c7420403000000c7022b0000008d5a10c743fc03000000c7430801000000894304c703230000008d4310c740fc02000000c7400401000000891889c38d400cc740fc02000000eb0ae919010000e9070000008958048910eb708b55008d926cffffff3b55087303ff5520895500c742fc04000000c7420c01000000c7420803000000894a04c7022d0000008d5a14c743fc03000000c7430801000000894304c703230000008d4310c740fc02000000c740040100000089188d580cc743fc020000008943048913eb05e95d0800008d430cc740fc02000000895804c700ec1580b28d500cc742fc04000000c7420cf9ffffffc7420834c47fb2894a04c702010000008d5a14c743fc03000000c7430805000002895304c7036f0000008d5310c742fc03000000894a08c7420405000000c702010000008d7210c746fc02000000c746040100000089168d560cc742fc02000000897204891a83fa01746789d3e80a090000eb638b4c2410833901755f8b55008d52cc3b55087303ff5520895500c742fc03000000894a08c7420403000000c7022b0000008d5a10c743fc02000000894304c703250000008d430cc740fc02000000c7400401000000891889c38d400ceb0fe962070000e95d070000e90e000000c740fc020000008958048910eb488b55008d52e43b55087303ff5520895500c742fc03000000894208894a04c7024f0000008d4210c740fc02000000c74004010000008910eb628b088b11bbae8480b28d5c93fcffe3e9fd0600009090e9d2020000909090e911030000909090e98b040000909090e99d040000909090e90b000000909090e9520600009090908b51043b5424087458833a01751a8b5c2408833b01752f8b7204eb05e9aa0600003b73047520eb67833a0375198b5c2408833b0375108b72043b730475088b42083b4308746a833a01756a8b44240883380175668b5d008d5bc83b5d08730aeb05e93a020000ff5520895d00c743fc03000000894308c7430403000000c7032b0000008d7310c746fc03000000eb05e90c020000c7460801000000895604c706230000008d4e10c741fc02000000eb0fe9eb010000e934010000e91a000000c741040100000089318d410cc740fc020000008948048918eb708b5d008d9b6cffffff3b5d087303ff5520895d00c743fc04000000c7430c01000000c7430803000000894304c7032d0000008d7314c746fc03000000c7460801000000895604c706230000008d4e10c741fc02000000c741040100000089318d510cc742fc02000000894a04891aeb05e9730500008d4a0cc741fc02000000895104c701ec1580b28d510cc742fc04000000c7420cf9ffffffc7420834c47fb2894204c702010000008d5a14c743fc03000000c7430805000002895304c7036f0000008d5310c742fc03000000894208c7420405000000c702010000008d7210c746fc02000000c746040100000089168d560cc742fc02000000897204891a83fa01750489c8eb6689d389c89090e87a060000eb5e8b442408833801755a8b5d008d5bcc3b5d087303ff5520895d00c743fc03000000894308c7430403000000c7032b0000008d7310c746fc02000000895604c706250000008d4e0cc741fc02000000c74104010000008931eb0fe975040000e970040000e9110000008d410cc740fc020000008948048918eb678b5d008d5be43b5d087303ff5520895d00c743fc03000000895308894304c7034f0000008d4310c740fc02000000c74004010000008918eb5eb801000000eb5c8b55008d52e43b55087303ff5520895500c742fc030000008b5c2408895a088b7104897204eb05e9ee030000c702410000008d4210c740fc02000000c74004010000008910eb67f64104017417b81c777bb28b5d04eb0ae9be030000e9b903000090ff138b510457ff7724ff328b1c248b470890e8a652ffff83f8017562ff772c50bb030000008b442408bafc317ab2e80aaaf9ff89c3b8e07e80b2e86e83f9ff8b4d008d49ec3b4d08730aeb05e961030000ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d049090ff138b0883390b740db89c8d80b28b5d04909090ff138b572c83c4048b12f6c201740bf641040174052b51047105ff5538ebf683c201f6c201740583ea027105ff5538ebf683fa0175418b55008d52e43b55087303ff5520895500c742fc03000000c74208f8c27fb28b5c2410895a04c7024f0000008d4210c740fc02000000c74004010000008910eb5bbb0900000089d0909090ff15c8c752088b4d008d49dc3b4d087303ff5520894d00c741fc050000008b54241089511089410cc7410834c47fb2c74104c88d80b2c7013d0000008d4118c740fc02000000c74004010000008908eb5ee95b02000057ff7724ff74241057ff770c8b59088b410490e86a040000eb618b542408833a01755d8b5d008d5bf03b5d087303ff5520895d00c743fc03000000895308c7430403000000c7032b000000f6410401743df64104017514eb05e9fd010000b808a87cb28b5d04909090ff13837904017416b8b49380b28b5d04eb0ae9db010000e99d000000ff13be4c9480b2eb4ff6410401740bb8ecd57ab28b5d0490ff138b41040fb670ff8d74360183fe037521a801740cb8ecd57ab28b5d049090ff13beffffff002370fc8d74360183fe05740bb8589480b28b5d0490ff1389c68b45008d40dc3b45087303ff5520894500c740fc02000000897004c700210000008d480cc741fc02000000c741040100000089018d410cc740fc020000008948048918eb6cf6410401746bf6410401750db808a87cb28b5d04909090ff138b5904f6c301740403db7105ff5538ebf783eb01f6c301740583c3027105ff5538ebf68b75008d76e43b75087303ff5520897500c746fc03000000895e08895604c7064b0000008d4610c740fc02000000eb0ae9b2000000e90b000000c74004010000008930eb688b5d008d5be43b5d087303ff5520895d00c743fc030000008b7104897308895304c7034d0000008d4310c740fc02000000c74004010000008918eb668b572c8b12f6c201740bf641040174052b51047105ff5538ebf683c201f6c201740583ea02710cff5538eb05e935000000ebef57ff7724ff770cbb0900000089d09090ff15c8c75208ff742414ff74240cff74240889c3b8f8c27fb2e84202000083c404eb1657ff7724eb1057ff7724eb0a57ff7724eb0457ff77248b4c240489c78b5c24088b4108909090e8e64effffa801745b5750bb030000008b442410bafc317ab2909090e84aa6f9ff89c3b8f0ff7fb2e8ae7ff9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24108b44240c90e8da6cffffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c240457528b5c24108b4108909090e8e612ffffb801000000833c240174098b1c2490e80e080000837c24040174135050bb149580b28b44241090e8ea15ffffeb01505883c410c2040000000000580c0000|@9189,2097151,@982|18,1,@8978 39,0,1 48,0,@5052 54,1,@5053 61,0,@9153 66,1,@4940 97,0,@9154 107,0,@5398 113,0,@4608 205,0,1 218,0,31 247,0,0 266,0,0 271,0,1 284,0,@8999 362,0,@5215 370,0,I106 386,0,$9167+438 406,0,@5401 418,0,@8950 456,0,@8952 517,0,1 523,0,21 540,0,0 549,0,17 566,0,0 633,0,0 640,0,1 649,0,22 666,0,0 675,0,17 692,0,0 735,0,@9048 752,0,-4 759,0,@8817 768,0,0 785,0,16777218 794,0,55 814,0,2 820,0,0 837,0,0 866,1,@9168 911,0,1 917,0,21 936,0,18 953,0,0 1027,0,39 1044,0,0 1057,0,$9167+1074 1243,0,1 1249,0,21 1273,0,0 1282,0,17 1316,0,0 1369,0,0 1376,0,1 1385,0,22 1402,0,0 1411,0,17 1428,0,0 1471,0,@9048 1488,0,-4 1495,0,@8817 1504,0,0 1521,0,16777218 1530,0,55 1550,0,2 1556,0,0 1573,0,0 1610,1,@9169 1655,0,1 1661,0,21 1680,0,18 1697,0,0 1769,0,39 1786,0,0 1795,0,0 1847,0,32 1864,0,0 1879,0,@6704 1918,1,@8978 1932,0,1 1941,0,@5052 1946,1,@5053 1953,0,@9153 1958,1,@4940 1996,0,@9154 2006,0,@5398 2012,0,@4608 2033,0,@9170 2124,0,@8796 2137,0,39 2154,0,0 2163,0,4 2174,0,I108 2215,0,@8817 2222,0,@9172 2228,0,30 2245,0,0 2278,1,@9173 2323,0,1 2329,0,21 2353,0,@7422 2372,0,@9179 2394,0,@9183 2407,0,@6321 2438,0,@6321 2450,0,8388607 2467,0,@9184 2508,0,16 2525,0,0 2561,0,@7422 2640,0,37 2669,0,0 2712,0,38 2729,0,0 2796,0,4 2806,0,I108 2825,0,@8796 2830,1,@9173 2878,1,@8978 2889,0,1 2898,0,@5052 2906,1,@5053 2913,0,@9019 2918,1,@4940 2949,0,@9020 2959,0,@5398 2965,0,@4608 3026,1,@9015 3098,1,@8774 3103,0,0 3118,1,@9187 3132,0,@9188 3142,1,@8783 9168:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@974| 9169:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@975| 9170:O4|@4608,@5398,@9166,@9171 9171:O5|@9007,1337,0,1337,0 9172:O1|@8796 9173:D3,1076|3b650c7303ff55248b4c240c83390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b32f642ff107402f7de8d743601eb0289d689f1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090181e20100fe0083fa01746183fa0174615350bb9f0100008b4424109090e8525dffff8b4c240cff7004ff30ff7104ff71088b198b4424089090e8a662ffff8b0c24833901756c8b54241c833a0175688b5d008d5bc83b5d087303ff5520895d00c743fc03000000895308eb0ae9e7020000e9e2020000c7430403000000c7032b0000008d7310c746fc03000000c7460801000000894e04c706230000008d7e10c747fc02000000c74704010000008937eb0ae931010000e9110000008d770cc746fc02000000897e04891eeb708b5d008d9b6cffffff3b5d087303ff5520895d00c743fc04000000c7430c01000000c7430803000000895304c7032d0000008d7314c746fc03000000c7460801000000894e04c706230000008d7e10c747fc02000000c747040100000089378d770cc746fc02000000897e04891eeb05e9560100008d5e0cc743fc02000000897304c703ec1580b28d730cc746fc04000000c7460cf9ffffffc7460834c47fb2895604c706010000008d7e14c747fc03000000c7470805000002897704c7076f0000008d7710c746fc03000000895608c7460405000000c706010000008d4e10c741fc02000000c741040100000089318d710cc746fc02000000894e04893e83fe01750489deeb6a89c789d889f39090e8f201000089c689f8eb5c8b54241c833a0175588b5d008d5bcc3b5d087303ff5520895d00c743fc03000000895308c7430403000000c7032b0000008d7310c746fc02000000894e04c706250000008d7e0cc747fc02000000c7470401000000eb0fe954000000e94f000000e91300000089378d770cc746fc02000000897e04891eeb378b5d008d5be43b5d087303ff5520895d00c743fc03000000894b08895304c7034f0000008d7310c746fc02000000c7460401000000891e8b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240c89510cc7410834c47fb28b542408895104c701010000008b55008d52f03b55087303ff5520895500c742fc03000000894a0859894a04c702450000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008911833c2401741389c78b1c2489c8909090e80601000089c189f883f901740f89c789cb89f0e84a01000089c689f883fe01750683c40cc20c0089f383c40c5983c40c51e9840100008b4d008d49d03b4d087303ff5520894d00c741fc0400000089590cc7410834c47fb2894104c701010000008d4114c740fc030000008948088b4c240c894804c7004500000089c28d4010c740fc02000000c74004010000008910c20c009090900000000030040000|@9178,2097151,@980|88,0,1 101,0,31 135,0,207 146,1,@8997 174,1,@9004 237,0,1 243,0,21 260,0,0 269,0,17 286,0,0 351,0,0 358,0,1 367,0,22 384,0,0 393,0,17 410,0,0 453,0,@9048 470,0,-4 477,0,@8817 486,0,0 503,0,16777218 512,0,55 532,0,2 538,0,0 555,0,0 594,1,@9174 643,0,1 649,0,21 668,0,18 685,0,0 757,0,39 774,0,0 814,0,@8817 827,0,0 864,0,34 895,0,0 918,1,@9175 938,1,@9176 968,1,@9177 1002,0,@8817 1011,0,0 1037,0,34 1056,0,0 9174:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@976| 9175:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@977| 9176:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@978| 9177:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@979| 9178:S51|434f444547454e5f5441424c4528292e6c6f616450737461636b456e7472792833296d6f766546726f6d4d656d6f7279283329 9179:O4|@4608,@5398,@9181,@9180 9180:O5|@9182,129,0,129,0 9181:S40|6d6f7665436f6e7374616e74546f52656769737465723a2073686f7274207265616c2076616c7565 9182:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364c4f574c4556454c2e4d4c 9183:B8|0000000000000000 9184:O4|@4608,@5398,@9186,@9185 9185:O5|@9182,132,0,132,0 9186:S48|6d6f7665436f6e7374616e74546f526567697374657220746f206670207265673a20696e76616c696420736f75726365 9187:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@981| 9188:S15|6c6f616450737461636b456e747279 9189:S34|434f444547454e5f5441424c4528292e6c6f616450737461636b456e747279283329 9190:D3,224|3b650c7303ff55248b48148b098b501c8b128b582c8b1b53ff702c525089cbb80100000090e8ca000000a801740ff64424040174083b4424047d75eb05ff5538ebf38b0c2489018b4c2404f6c1017408a80174042bc87105ff5538ebf783c10183f9017509b80100000083c408c3f6c101740783f9017c08eb13f641ff10740db8fc9780b28b5d04909090ff138b45008d40e83b45087303ff5520894500c740fc02000000894804c70061000000eb05e91900000089c18d400cc740fc02000000c7400401000000890883c408c3b80100000083c408c39000000000dc000000|@9196,63,@984|32,0,0 38,1,@9191 102,0,0 129,0,@9193 170,0,48 196,0,0 207,0,0 9191:D3,344|3b650c7303ff5524a801750af6442408017503ff55383b442408750589d8c208008b4c240489df5089c38b4108e82644ffffa801755f8b08833909755d8b1424f6c201740583c2027105ff5538ebf68b5908f6c301740583c3027105ff5538ebf6f6c301740cf7c70100000074043bdfeb05ff5538ebf77f0289fb8b74240c8b7c24088974240c897c240889d083c404e96bffffffe98b00000083390b75588b1424f6c201740583c2027105ff5538ebf68b5904f6c301740583c3027105ff5538ebf6f6c301740cf7c70100000074043bdfeb05ff5538ebf77f0289fb8b74240c8b7c24088974240c897c240889d083c404e909ffffff8b1424f6c201740583c2027105ff5538ebf68b5c240c8b742408895c240c8974240889fb89d083c404e9dbfeffff8b0424a801740583c0027105ff5538ebf68b4c240c8b542408894c240c8954240889fb83c404e9b0feffff0000000054010000|@9192,63,@983|46,1,@8978 9192:S57|434f444547454e5f5441424c4528292e72656d6f76654f6c644974656d7346726f6d5265616c537461636b2831296d6178537461636b283229 9193:O4|@4608,@5398,@9195,@9194 9194:O5|@9182,322,0,322,0 9195:S20|7265736574537461636b3a206e65676174697665 9196:S46|434f444547454e5f5441424c4528292e72656d6f76654f6c644974656d7346726f6d5265616c537461636b283129 9197:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@985| 9198:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@986| 9199:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@987| 9200:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@988| 9201:S33|434f444547454e5f5441424c4528292e6c6f6164456e747279546f536574283429 9202:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@990| 9203:O4|@4608,@5398,@9205,@9204 9204:O5|@9130,472,0,472,0 9205:S29|4c6f6f704172673a20737461746963206c696e6b2066756e6374696f6e 9206:D3,544|3b650c7303ff5524f6c301740783fb017d08eb21f643ff10751b8b4c24088b09f6c3017409f6c10174043bd9eb05ff5538ebf77c0c89c1b8b0f57ab28b5d04ff13f6c301740583c3027105ff5538ebf68b4c2408894459fe837c240c01756d8b54240489c789fb8b4208909090e87e3fffffa801745b5750bb0300000089f8bafc317ab290e8e696f9ff89c3b8f0ff7fb2e84a70f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae98d000000e90300000090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f21eb06f641ff1074198b442404b903000000894c240c89fb5983c40851e9625dffff8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c24045289fb8b4108e87603ffffb801000000c20c008b54240489c789fb8b4208e8823effffa80174575750bb0300000089f8bafc317ab290e8ea95f9ff89c3b86c3080b2e84e6ff9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c8c3080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc050000008b50108951108b5c240c89590c8b70088971088b70048971048b3089318b7424045189fb8b460890e8be02ffffb801000000c20c009090000000001c020000|@9207,2097151,@991|56,0,@6397 110,1,@8978 121,0,1 128,0,@5052 134,1,@5053 141,0,@9019 146,1,@4940 177,0,@9020 187,0,@5398 193,0,@4608 258,0,1 274,1,@9015 338,1,@8774 343,0,0 362,1,@8978 373,0,1 380,0,@5052 386,1,@5053 393,0,@9109 398,1,@4940 429,0,@9110 439,0,@5398 445,0,@4608 522,1,@8774 527,0,0 9207:S45|47454e45524154455f434f444528292e636f646567656e2839296c6f63616c4465636c61726174696f6e283329 9208:D3,1048|8d7c249c3b7d0c7303ff5528a801740783f8297f08eb12f640ff10750c89c1b84ca180b28b5d04ff138b0b8b54244c535051ff7220ff7224ff722c8b5a1c8b4208e82a040000508b5c245c8b4424589090e8c20600008b4c240c8b0983f90175058b4804eb108b3089cb8b4004e87e09000089c1eb028b308b44240c89088b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7b08c747fc01000040c707010000008d4708c740fc01000040c70001000000568b75008d76d03b75087303ff5520897500c746fc05000000895610894e0c895e08894604893e8d4618c740fc02000000897004c700390000008d480cc741fc02000000c741040100000089018b4424108b0083f801740c89c389c890e80a09000089c18b44241089088b4c24608b512c8b128b5d008d5bcc3b5d087303ff5520895d00c743fc01000040c703010000008d7b08c747fc01000040c707010000008d4708c740fc080000009090c700c0a780b28b4c24108948048950088b54246089500c8978108958148b4c24048948188b4c245c89481c8060ffbf8b55008d52e83b55087303ff5520895500c742fc0300000059894a0889420489328d4210c740fc0100000089105753ff742420ff74242050ff742464ff742474ff742428ff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cbb030000008b44246c8b9424a4000000ff128b0c248b0983f901740583f90175118b4c24048b09f6c101740683c418c24c008b4424148b4c240c89088b0c248b098b5424048b128b5c24648b731c8b36ff7310ff3352516a01566a016a038b442428909090e8920f000068e4c280b28b5c24048b4424789090e8fa55ffffff7424046840c380b289e0506a016a01bbffffff008b842488000000baf80280b29090e81e63ffff83c41059c7010100000059c701010000008b4c24148b0983f901740889cb90e8b62300008b4c241489018b442410a801740583c0027105ff5538ebf68b5424648b5c24608b74245c8b7c24588b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c24548994249c000000899c249800000089b4249400000089bc24900000008b5424348994248c0000008b542430899424880000008b54242c899424840000008b542428899424800000008b5424248954247c8b542420895424788b54241c895424748b542418895424708b5424148954246c8b542410895424688b54240c895424648b542408895424608b5424048954245c5a83c43489542420894c241c83c4145be9f3fbffff9090900000000014040000|@9271,2097151,@1022|32,0,@9209 66,1,@9212 82,1,@9216 110,1,@9223 152,0,0 168,0,67108860 184,0,0 200,0,0 216,0,0 274,0,28 291,0,0 314,1,@9224 361,0,0 377,0,0 395,0,@9225 557,0,1 658,1,@9236 663,0,@9265 678,1,@9012 687,0,@9268 699,0,8388607 711,0,@9032 718,1,@9034 728,0,0 735,0,0 754,1,@9270 9209:O4|@4608,@5398,@9211,@9210 9210:O5|@9130,492,0,492,0 9211:S13|726570726f636573734c6f6f70 9212:D3,588|3b650c7303ff55248b0b8b1b8b5424048b1283f9017507b868c05208eb71f6c101740783f9017e1deb06f641ff107515f6c101740a81f9ffffff017c14eb06f641ff10750c89c6b8d4217fb28b5d04ff1389ce89f189c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fb801000000535256a801eb05e952000000740df604240174073b04247c07eb38ff5538ebf45089c38b4424109090e85e38ffff8b0c2489444ffef6c101740583c1027105ff5538ebf689c883c4043b650c7303ff5524ebb08067ffbf89f883c404eb046a01535289c18b45008d40f03b45087303ff5520894500c740fc030000008b14248950088b5c24048958048908837c24140174735051b8f0a380b28b542420909090ff12b8150000008b54242090ff12b804a480b28b54242090ff12bb030000008b44240cbafc317ab290e83e8ff9ff8b5424209090ff12b870d87fb28b54242090ff12bb030000008b442408bafc317ab290e8168ff9ff8b5424209090ff12b815000000eb05e9a40000008b5424209090ff128b44240ca801740783f8017c6ceb06f640ff1075698b1424b9ffffff00234afc8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77d29a8017410b9ffffff00234afc8d4c09013bc1720f89c1b8cc7b7ab28b5d04909090ff138b4c42feeb05b90100000050ff74242489cb9090e80638ffff58a801eb0ae921000000e91c000000740583e8027105ff5538ebf63b650c7303ff5524e968ffffff506a0183c4045883c40cc20c00900000000048020000|@9215,2097151,@993|24,0,I49 55,0,16777215 72,0,@8597 88,0,0 132,0,0 178,1,@8978 285,0,@9213 299,0,10 311,0,@9214 323,0,1 332,0,@5052 338,1,@5053 351,0,@8972 363,0,1 372,0,@5052 378,1,@5053 391,0,10 435,0,8388607 471,0,8388607 489,0,@5401 508,0,0 522,1,@8980 9213:S9|736176655374617465 9214:S5|207073703d 9215:S28|434f444547454e5f5441424c4528292e736176655374617465283129 9216:D3,148|3b650c7303ff55245350909090e89600000059ba0100000050f6c10175458339ff7432ff710452ff31bbffffff008b442410909090e88652ffff833c2401750489c2eb0c8b1c249090e80202000089c283c404eb03ff7104593b650c7303ff5524ebb689d089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c39090900000000090000000|@9222,2097151,@996|14,1,@9217 20,0,0 42,0,8388607 54,1,@9014 74,1,@9221 9217:D3,320|3b650c7303ff5524a80175678338ff7507b9e4107bb2eb6089dfff7004ff308b1c248b4708e89a35ffff83f80175665750bb030000008b442408bafc317ab29090e8fe8cf9ff89c3b8e07e80b2e86266f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2eb0ae9ba000000e97f000000894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b0883390975268b41048b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb3383390b740ab834a680b28b5d04ff138b41048b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010500000083c40489fbeb03ff70046a0153518b44240c9090e8f2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3b801000000c3000000003c010000|@6329,2097151,@994|18,0,@6455 38,1,@8978 50,0,1 59,0,@5052 66,1,@5053 73,0,@9153 78,1,@4940 109,0,@9154 131,0,@5398 137,0,@4608 188,0,1 200,0,@9218 241,0,2 307,0,0 9218:O4|@4608,@5398,@9220,@9219 9219:O5|@9007,3016,0,3016,0 9220:S29|6765744c6f6f70446573743a2077726f6e6720656e7472792074797065 9221:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@995| 9222:S38|434f444547454e5f5441424c4528292e6765744c6f6f7044657374696e6174696f6e73283229 9223:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@997| 9224:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@998| 9225:D3,252|3b650c7303ff552452ff721c8b5a188b420c909090e8f60000008b0c248b51148b120b108b591489138b51108b1283fa0175058b4004eb0a89d38b4004e84a0600008b0c248b511089028b410c8b582c8b1bf6c301740bf641080174052b59087105ff5538ebf683c30183fb017507bb01000000eb53f6c301740783fb017c08eb13f643ff10740db8fc9780b28b5d04909090ff138b75008d76e83b75087303ff5520897500c746fc02000000895e04c706610000008d5e0cc743fc02000000c743040100000089338b71048b3683fe01740d89df89f389f8e80606000089c38b04248b400483c4048918b801000000c390909000000000f8000000|@9235,63,@1003|22,1,@9226 62,1,@9233 112,0,0 137,0,@9193 178,0,48 195,0,0 218,1,@9234 236,0,0 9226:D3,60|3b650c7303ff55248b4c2404ba01000000895424048b501c8b3424891424515053bb01000000b80100000056e91f0000009090900000000038000000|@9232,63,@1000|13,0,0 34,0,0 39,0,0 45,1,@9227 9227:D3,1132|3b650c7303ff55248b4c24108b09a8017508f6c1017503ff55383bc175248b45008d40f43b45087303ff5520894500c740fc020000008b4c24148948048918c214008b4c240cf6c1017524a8017508f601017503ff55383b017507b903000000eb128b49043b650c7303ff5524ebd7b90100000083f901743da801740583c0027105ff5538ebf68b4c24148b5424108b74240c8b7c2408538b5c2408894c24188954241489742410897c240c895c24085be94affffff8b4c240889df5089c38b4108909090e8ba30ffff8b4c24088b19baffffff002353fc8d541201f6c201740df604240174073b14247f0eeb05ff5538ebf4ba01000000eb2af60424017411baffffff002353fc8d5412013b1424770c89c2b8cc7b7ab28b5d04ff138b14248b5453fe83f8017573f6c20175468b0424a801740583c0027105ff5538ebf60b7a088b5424188b7424148b4c24108b5c240c578b7c240c8954241c89742418894c2414895c2410897c240c5b83c404e98cfeffff8b0424a801740583c0027105ff5538ebf68b5424188b7424148b4c24108b5c240c578b7c240ceb05e91d0000008954241c89742418894c2414895c2410897c240c5b83c404e942fefffff6c201755cbeffffffff33700883c6012372080bf78b388b0fbb02ab80b28d5c8bfcffe3e9a5000000909090e9b4000000909090e9cc000000909090e9dc000000909090e9f9000000909090e9030000009090908b0a83390b750b8b5c2418eb68e9fc01000083390575268b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4424188943048b3c24893beb62833909740db8a0ad80b28b5d04909090ff138b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4424188943048b3c24893beb5de9500100008b12833a01740ab8a0ad80b28b5d04ff138b4c2418eb588b12833a037413b8a0ad80b2eb05e9260100008b5d049090ff138b4c2418eb628b12833a05740bb8a0ad80b28b5d0490ff138b4c2418eb598b12833a077413eb05e9f3000000b8a0ad80b28b5d049090ff138b4c2418eb63e9da0000008b0a83390575328b5d008d5bf43b5d087303ff5520895d00c743fc020000008b442418eb05e9b00000008943048b3c24893beb52e9a1000000833909740bb8a0ad80b28b5d0490ff138b5f043b59047442833b0175198b4104833801eb05e97700000075478b53043b50047426eb3d833b0375388b410483380375308b53043b50047528eb05e94d0000008b53083b500875198b7f08f7c7010000007509f64108017503ff55383b790874268b45008d40f43b45087303ff5520894500c740fc020000008b4c24188948048b14248910eb048b44241889c389d989cb8b0424a801740583c0027105ff5538ebf68b4c24148b5424108b7c240c538b5c240c568b74240489742420894c241c89542418897c2414895c24105b83c408e9e0fbffff8b0424a801740583c0027105ff5538ebf68b5424188b7424148b4c24108b5c240c578b7c240c8954241c89742418894c2414895c2410897c240c5b83c404e99dfbffff900000000068040000|@9231,63,@999|92,0,1 112,0,0 198,1,@8978 209,0,8388607 244,0,0 257,0,8388607 276,0,@5401 452,0,-1 472,0,$9227+482 597,0,@9228 660,0,@9228 683,0,@9228 715,0,@9228 746,0,@9228 831,0,@9228 9228:O4|@4608,@5398,@9230,@9229 9229:O5|@9007,3066,0,3066,0 9230:S13|46756e6e7920656e7472696573 9231:S52|434f444547454e5f5441424c4528292e636f6d706172654c6f6f7053746174657328332970726f636573735461626c6573283329 9232:S36|434f444547454e5f5441424c4528292e636f6d706172654c6f6f70537461746573283329 9233:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1001| 9234:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1002| 9235:S67|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d726570726f636573734c6f6f702831296f6e4c6f6f70283129 9236:D3,1760|3b650c7303ff5524837b2401747053ff7324ff732cff7314ff731cff730c50ff7320ff7004ff7008b83cb680b28b542408909090ff12b8150000008b54240890ff12b804a480b28b54240890ff12bb030000008b442404bafc317ab290e87a82f9ff8b5424089090ff12b870d87fb28b54240890ff12bb0300000058eb05e9c2000000bafc317ab290e84e82f9ff8b5424049090ff12b8150000008b54240490ff1258a801740783f8017c6ceb06f640ff1075698b4c24048b19baffffff002353fc8d541201a8017409f6c20174043bc2eb05ff5538ebf77c07ba01000000eb26a8017410baffffff002353fc8d5412013bc2720c89c2b8cc7b7ab28b5d04ff138b5c43fe89da50ff74240489d3909090e8462bffffeb0ae921000000e91c00000058a801740583e8027105ff5538ebf63b650c7303ff5524e965ffffffb801000000eb1a89c1b80100000053ff7324ff732cff7314ff731cff730c516a01f64424300175658b4424308b4c2404f6000174128b19baffffff002353fc8d5412013b10770c8b10b8cc7b7ab28b5d04ff138b108b5453fef6c201740db84cb680b28b5d04909090ff138b32833e0975058b7e04eb66837a08017406837a08017514b89cb680b28b5d04eb05e9c5000000909090ff13bf01000000b80300000083ff2f750d89c1b858f07fb28b5d0490ff1389c1234a0883f901751183c7028d4400ff3b650c7303ff5524ebd3f7c701000000740c83ff017d1feb0be97a000000f647ff10741289fbb88c6c7ab2909090ff1588c75208eb0289f8ff7504b9bab180b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe89c783c40458894504eb29908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13bfdcc27fb28b44240c8b00a801740583e8027105ff5538ebf657ff7424208b5c24349090e8e204000050ff742424ff7424148b5c241cb80100000090e8e20500008b4c240c8b54241c8b5908891a8b7424148b368b7c24148b510489175056ff74242cff74241cff74243cff742444ff74242c8b5c2428b801000000e8aa0700008b4c24208b098b5424188b12f6c201740583ea027105ff5538ebf650f6c201740783fa017c4beb06f642ff1075488b44242c89d75189fb8b500889d0909090e80228ffffa80175468b0883390b75058b1424eb3df6401001752f8b50108b1af6c3017417f604240174113b1c247d15eb0fe943000000e93e000000ff5538ebea89daeb0d8b1424eb088b1424eb038b1424f7c701000000740583ef027105ff5538ebf689d089fa83c40489c13b650c7303ff5524e963ffffff89c88b4c24248b09a8017409f6c10174043bc1eb05ff5538ebf77d5f8b4c24208b09a8017409f6c10174043bc1eb05ff5538ebf77d0c89c1b8b4c080b28b5d04ff138b4c24248b098b5424248902f6c1017408a80174042bc87105ff5538ebf783c10183f9017507b801000000eb5bf6c101740c83f9017c0deb17e94f000000f641ff10740cb8fc9780b28b5d049090ff138b45008d40e83b45087303ff5520894500c740fc02000000894804c7006100000089c18d400cc740fc02000000c74004010000008908eb0ae905000000b801000000837c24080175068b4c2404eb1689c68b5c24088b442404909090e8fe0c000089c189f083f90175058b0c24eb1289c689cb8b04249090e83a0d000089c189f083f901740789cbe8820d0000837c244001752589c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000eb718b4c240c83390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09015089d3eb05e9240100008b44243090e8d636ffff8b4d008d49d83b4d087303ff5520894d00c741fc03000000c74108010000008b542410895104c701090000008b5424308b5a1c8b1b8d7110c746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890eff700453ff7224ff721c568b4208e82eeafeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44244090e832edfeff8b45008d40f83b45087303ff5520894500c740fc0100000083c404598908837c24040175058b0c24eb1289c68b5c24048b0424e85a0c000089c189f083f9017507b901000000eb1489c689cbb8010000009090e8920c000089c189f089c28b45008d40f43b45087303ff5520894500c740fc02000000894804891083c408837c242801741550ff7004bb3cb680b28b44243490e89aecfeffeb01505883c430c2100000000000dc060000|@9264,2097151,@1018|41,0,@9237 55,0,10 67,0,@9214 79,0,1 88,0,@5052 94,1,@5053 107,0,@8972 119,0,1 132,0,@5052 138,1,@5053 151,0,10 187,0,8388607 219,0,0 230,0,8388607 248,0,@5401 274,1,@8980 319,0,0 328,0,0 374,0,8388607 392,0,@5401 413,0,@9238 450,0,@9241 470,0,0 475,0,1 487,0,@8999 553,0,@5215 562,0,I106 574,0,$9236+626 594,0,@5401 606,0,@8950 644,0,@8952 662,0,@8794 698,1,@9244 716,0,0 722,1,@9247 781,0,0 786,1,@9251 854,1,@8978 1032,0,@9256 1080,0,0 1110,0,@9193 1150,0,48 1169,0,0 1183,0,0 1214,1,@9259 1242,1,@9260 1258,1,@9261 1300,0,0 1386,0,1 1399,0,31 1430,1,@8997 1461,0,0 1474,0,4 1500,0,0 1507,0,0 1514,0,0 1521,0,1 1542,1,@8774 1576,0,@9108 1586,1,@8783 1642,1,@9262 1656,0,0 1667,0,0 1674,1,@9263 1728,0,@9237 1738,1,@8783 9237:S8|7365745374617465 9238:O4|@4608,@5398,@9240,@9239 9239:O5|@9007,1116,0,1116,0 9240:S25|70537461636b5265616c456e7472793a206e6f20656e747279 9241:O4|@4608,@5398,@9243,@9242 9242:O5|@9007,1906,0,1906,0 9243:S24|73657453746174653a206e6f742061207265676973746572 9244:D3,124|3b650c7303ff5524a8017409f6c30174043bc3eb05ff5538ebf77d08b801000000c2040053506a0389c38b442410909090e80e42ffff59f6c101740583e9027105ff5538ebf650ff74240c8b5c240889c8e8aaffffff83f80175075883c404c2040089c38b042483c4085983c40451e91c0000000000000078000000|@9246,2097151,@1005|29,0,0 50,1,@9015 112,1,@9245 9245:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1004| 9246:S39|434f444547454e5f5441424c4528292e73657453746174652836296672656541626f7665283129 9247:D3,280|3b650c7303ff55248b0ba8017409f6c10174043bc1eb05ff5538ebf77c08b801000000c208008b4c240889df5089c38b4108909090e86a22ffffa801756c8b08833905751f8b54240c8b5a0c57ff7008ff7304ff73088b3389f38b4104e8c638ffffeb2e833909751f8b54240c8b5a0c57ff7008ff7304ff73088b3389f38b4104e8a238ffffeb0a8b4808b8010000005751508b5c24048b4424149090e88a45ffff833c2401741eeb05e90d0000008b1c24909090e872000000eb0ab801000000576a016a018b4c240c83c408f6c101740583c1027105ff5538ebf650ff742414ff7424148b5c240c89c89090e80effffff833c2401750683c40cc208008b1c2483c40c5983c40851e97600000090900000000014010000|@9250,2097151,@1008|31,0,0 54,1,@8978 94,1,@9004 130,1,@9004 140,0,0 158,1,@9016 182,1,@9248 189,0,0 266,1,@9249 9248:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1006| 9249:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1007| 9250:S35|434f444547454e5f5441424c4528292e73657453746174652836296672656573283129 9251:D3,1372|3b650c7303ff5524a801740df643040174073b43047c0feb05ff5538ebf4b801000000c218008b13b9ffffff00234afc8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77c07b901000000eb28a8017410b9ffffff00234afc8d4c09013bc1720e89c1b8cc7b7ab28b5d049090ff138b5442fe89d16a016a01a801740ff64424200174083b4424207c1aeb05ff5538ebf389e2c7020100000089e2c7420401000000eb468b54241c89c7535189fb8b42089090e8e21fffffa80175158d4c24088b500489118d4c24088b5810895904eb158d442408c700010000008d442408c740040100000089f8eb0253518b4c242450ff74240489c38b410890e876e4fefff64424040175668b4424048b0883390575208b542424ff700cff7008ff700451ff7204ff72088b1a8b4104e8fa5cffffeb4183390975238b542424ff700cff7008ff700451ff7204ff72088b1a8b4104909090e8d25cffffeb198b500c8b58088b7004b801000000525356eb05e99003000051b901000000ba03000000bb010000005083f92f745989cef7c601000000740583c6027105ff5538ebf689d78d7c3fff2354240c83fa01746d535756ff7504baf2bb80b252896504f6c101740583f92f720bb8cc7b7ab28b5d0490ff13ba44d47fb28b4c4afe83c4045a895504eb2ae96700000090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b55008d52f43b5508730aeb05e914000000ff5520895500c742fc02000000895a04890aeb0689da6a01575689d389fa89f183c40c3b650c7303ff5524e936ffffffb901000000f6c30175398b442438ff730451ff7004ff70088b138b1889d0e8ba5bffff833c2401740a8b1c249090e8ee02000089c183c4045b3b650c7303ff5524ebc289c8837c2434017407b901000000eb508b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424248951108b54241089510c8b54240c8951088b5424088951048b54240489118b54243c50518b5c241c8b4208e88ae2feff89c1eb01508b442418a801740583c0027105ff5538ebf6ff742444ff742444ff742444ff742444ff742444ff7424448b5c2438e8dafcffff837c243401745d8b4c24308b09f6c101740ff64424180174083b4c24187e29eb05ff5538ebf38b4c244089c78b5c24188b4108e83e1dffffa80175058b4004eb10b801000000eb0989c1b80100000089cfa8017414f644242401740d3b4424247e6feb0ae930010000ff5538ebee8b4c2424f6c1017408a80174042bc87105ff5538ebf783c1018b442440518b5c241c8b500889d09090e8da1cffffa80174635750bb030000008b442424bafc317ab2909090e83e74f9ff89c3b8f0ff7fb2e8a24df9ff8b4d008d49ec3b4d08730aeb05e9b9000000ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d049090ff138b4804f6c101740ef604240174088d49ff030c247105ff5538ebf3f6c101740783f9017f1aeb06f641ff107412576a038b5c24248b44244ce8be3affffeb468b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c244457528b5c24248b4108909090e8cae0feffb801000000eb14b8010000006a0157eb0a89c1b8010000006a0151837c240c0175068b442408eb108b5c240c8b442408909090e8e200000083f80175075883c430c2180089c38b042483c4345983c41851e91c0100008b0424a801740583c0027105ff5538ebf68b4c242c8b5424288b5c24248b7424208b7c241c578b7c241c894c24308954242c895c24288974242459894c241c897c241883c4085b83c408e9adfaffff900000000058050000|@9255,2097151,@1012|31,0,0 41,0,8388607 73,0,0 84,0,8388607 102,0,@5401 151,0,0 160,0,0 182,1,@8978 217,0,0 228,0,0 254,1,@8774 302,1,@9051 342,1,@9051 358,0,0 374,0,0 379,0,1 384,0,0 436,0,$9251+490 455,0,@5401 466,0,@8950 508,0,@8952 592,0,0 622,1,@9051 638,1,@9252 668,0,0 746,1,@8774 858,1,@8978 872,0,0 881,0,0 958,1,@8978 969,0,1 978,0,@5052 986,1,@5053 993,0,@9019 998,1,@4940 1036,0,@9020 1046,0,@5398 1052,0,@4608 1122,1,@9015 1194,1,@8774 1199,0,0 1206,0,0 1218,0,0 1250,1,@9253 1280,1,@9254 9252:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1009| 9253:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1010| 9254:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1011| 9255:S42|434f444547454e5f5441424c4528292e73657453746174652836297075744f6e456e7472696573283129 9256:O4|@4608,@5398,@9258,@9257 9257:O5|@9007,2061,0,2061,0 9258:S31|556e70757368656420656e7472792062656c6f7720737461636b206d61726b 9259:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1013| 9260:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1014| 9261:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1015| 9262:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1016| 9263:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1017| 9264:S27|434f444547454e5f5441424c4528292e7365745374617465283629 9265:O1|@9266 9266:D3,16|b803000000c39090000000000c000000|@9267,1,@1019|1,0,1 9267:S40|434f444547454e5f5441424c4528292e726573746f72654c6f6f7053746174652834295f2d283129 9268:D3,64|8b5204f6c2017525a8017508f602017503ff55383b02750889c1b803000000c38b52043b650c7303ff5524ebd689c1b801000000c3909090000000003c000000|@9269,7,@1020|27,0,1 48,0,0 9269:S45|434f444547454e5f5441424c4528292e726573746f72654c6f6f7053746174652834297075736865732d283129 9270:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1021| 9271:S58|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d726570726f636573734c6f6f70283129 9272:O1|207 9273:O1|@9274 9274:D3,12|c39090900000000008000000|@9275,1,@1023| 9275:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6f7264657265642d283129 9276:O1|@9277 9277:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70024c580b28948048060ffbfc3000000002c000000|@9280,3,@1025|28,0,@9278 9278:D3,84|8b4a048b198b308b7b043b7e0475298b7104f7c601000000740df640040174073b70047e0deb05ff5538ebf4b801000000c3b803000000c33b7e047206b801000000c3b803000000c39090900000000050000000|@9279,63,@1024|45,0,0 51,0,1 62,0,0 68,0,1 9279:S51|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6571283129283129 9280:S48|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6571283129 9281:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@1026|60,0,0 9282:D3,212|3b650c7303ff5524a801756df6400401756c8b48048b118b188b73043b7204752a538b4104e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc020000008b790489780489105390e88effffff89c18b4500eb0ae945000000e91c0000008d40f43b45087303ff5520894500c740fc02000000894804598908c38b088b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3b801000000c390909000000000d0000000|@9283,63,@1027|188,0,0 196,0,0 9283:S51|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d66696c746572283129 9284:D3,1024|3b650c7303ff55248b4d008d49e03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000538b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000508b45008d40e83b45087303ff5520894500c740fc0500000089501089480c89700889580489388b0c242b4c240483c103f6c101740783f9017d1ceb06f641ff107414505789cbb88c6c7ab2909090ff1588c75208eb0689c289c85257bb98cb80b29090e8a66ffaff837c2414017407b901000000eb6d837c241801746b8b0c24c701070000008b4d008d49c83b4d087303ff5520894d00c741fc04000000c7410c030000008b542404895108c7410405000000c701170000008d5914c743fc020000008b742420897304c7037b0000008d7b0cc747fc02000000c7470401000000eb0ae903020000e913000000891f8d5f0cc743fc02000000897b04890beb0e8b0c24c70105000000bb010000008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b542404895108c7410403000000c701170000008b74240cf7c601000000740783fe017d1ceb06f646ff10741450535189f3b88c6c7ab29090ff1588c75208eb0789c789f0575351a801740403c07105ff5538ebf783e801a801740583c0027105ff5538ebf68b4d008d49d43b4d087303ff5520894d00c741fc0400000089410c8b44242c894108c7410405000000c701090000008d5114c742fc02000000c7420401000000890a8d4a0cc741fc020000008951045a89118b55008d52ec3b55087303ff5520895500c742fc04000000c7420c030000008b5c240c895a08c7420401000000c702170000008b742410f7c601000000740783fe017d19eb06f646ff107411515289f3b88c6c7ab2ff1588c75208eb0489f05152a801740403c07105ff5538ebf783e801a801740583c0027105ff5538ebf68b4d008d49d43b4d087303ff5520894d00c741fc0400000089410c8b442430894108c7410405000000c701090000008d5114c742fc02000000c7420401000000890a8d4a0cc741fc020000008951045a8911837c24040175058b1424eb1289ce8b5c24048b0424e8a201000089c289f183fa01740d89d389c89090e8e601000089c183c408eb01508b45008d40e83b45087303ff5520894500c740fc050000008b5424208950108b5c242489580c8b34248970088b7c2410897804c700350000008b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7470401000000890783f901740b89cb89f8e8ce01000089c78b45008d40f03b45087303ff5520894500c740fc030000008b4c2408894808897004893883c414c21000909000000000fc030000|@9291,2097151,@1032|34,0,0 50,0,67108860 66,0,0 82,0,0 113,0,0 189,0,@5215 198,0,I106 211,0,@9285 218,1,@6547 230,0,0 248,0,3 279,0,1 293,0,2 299,0,11 322,0,61 339,0,0 379,0,2 384,0,0 415,0,1 429,0,1 435,0,11 470,0,@5215 478,0,I106 558,0,2 564,0,4 581,0,0 630,0,1 644,0,0 650,0,11 684,0,@5215 690,0,I106 767,0,2 773,0,4 790,0,0 834,1,@9288 854,1,@9289 919,0,26 950,0,0 966,1,@9290 9285:O1|@9286 9286:D3,136|8b45008d40c03b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c7060100000089c78d4608c740fc0500000089481089780c8950088970048918c70303000000c3900000000084000000|@9287,63,@1028|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 122,0,1 9287:S38|5838364c4f574c4556454c28292e696e6465786564436173652836296d616b654c6162283129 9288:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1029| 9289:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1030| 9290:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1031| 9291:S28|5838364c4f574c4556454c28292e696e646578656443617365283629 9292:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1033| 9293:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1034| 9294:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1035| 9295:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1036| 9296:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1037| 9297:D3,224|3b650c7303ff55248b4b108b0983f901750f89c1b844d080b28b5d04909090ff1383f8017506b801000000c3a801740d89c1b884d080b28b5d0490ff138b4b1c8b0950ff33ff73106a01516a016a018b480489c890e89edfffff59c7010100000059c70101000000f6042401740f8b4804b8b0d080b28b5d049090ff13598b55008d52f43b55087303ff5520895500c742fc020000008b09894a04c702390000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891183f90175048b4004c389cb8b4004e9b700000090909000000000dc000000|@9306,2097151,@1039|21,0,@9298 39,0,0 51,0,@9301 86,1,@9236 93,0,0 100,0,0 114,0,@9303 157,0,28 188,0,0 209,1,@9305 9298:O4|@4608,@5398,@9300,@9299 9299:O5|@9007,2662,0,2662,0 9300:S12|4e6f74206272616e63686564 9301:O4|101,@6569,0,@9302 9302:O5|@9007,1885,0,1885,0 9303:O4|101,@6569,0,@9304 9304:O5|@9007,1884,0,1884,0 9305:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1038| 9306:S24|434f444547454e5f5441424c4528292e6669787570283229 9307:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1040| 9308:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1041| 9309:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1042| 9310:O4|@4608,@5398,@9312,@9311 9311:O5|@9130,1150,0,1150,0 9312:S29|67656e546f52656769737465723a206e6f742061207265676973746572 9313:O4|@4608,@5398,@9315,@9314 9314:O5|@9130,1149,0,1149,0 9315:S24|67656e546f52656769737465723a206e6f20726573756c74 9316:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1043| 9317:D3,276|3b650c7303ff552489d8909090e816010000b901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c88b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701630000008d410cc740fc02000000c740040100000089088b4c24048b512c8b12f6c201740583ea027105ff5538ebf683fa017507ba01000000eb54f6c201740783fa017c08eb14f642ff10740e89c3b8fc9780b28b5d049090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000895304c703610000008d530cc742fc02000000c7420401000000891a83fa01740889d390e8a20000008b4c24048b5110c702030000008b19c70303000000c2040090900000000010010000|@9320,15,@1046|14,1,@9318 19,0,0 86,0,49 103,0,0 139,0,0 166,0,@9193 206,0,48 223,0,0 238,1,@9319 251,0,1 259,0,1 9318:D3,88|3b650c7303ff5524a801753b833801752eff308b4004909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b4004e9b9ffffffb801000000c39090900000000054000000|@5094,3,@1044|72,0,0 9319:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1045| 9320:S33|47454e45524154455f434f444528292e636f646567656e28392965786974283129 9321:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1047| 9322:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1048| 9323:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1049| 9324:D3,1800|8d7c24843b7d0c7303ff5528f6c3017507f644245401740d89c1b890dd80b28b5d0490ff138b4c24548b113b4204747083c0028b75008d76e83b75087303ff5520897500c746fc020000008b7a04897e048b3a893e8d560cc742fc020000008b4904894a0489328b4c24508b74244c8b7c2448528b542448ff73048b5c2448508b442448508b442448508b442448508b442448508b442448508b44244850eb05e9e60000008b442448508b442448508b442448508b442448508b442448508b442448508b442448508b442448508b442448508b4424448984249c000000898c249800000089b4249400000089bc24900000008994248c000000899c24880000008b442438898424840000008b442434898424800000008b4424308944247c8b44242c894424788b442428894424748b442424894424708b4424208944246c8b44241c894424688b442418894424648b442414894424608b4424108944245c8b44240c894424588b442408894424548b442404894424505883c438894424108b5c24045883c408e975feffff8b75008d76f03b75087303ff5520897500c746fc03000000c74608010000008b7c2450897e048b3b893eff7304ff7104ff32508b5c245c89f090e812f7ffff8b4c24588b0983f901740989cb9090e88a0500008b4c245889018b44245c8b501c8b128b58048b1b8b70148b368b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f0489178b501c8b128b480489118b502c8b128b48148911565357ff742428ff742428ff742428ff742468ff742478ff742478ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470bb030000008b4424588b9424a80000009090ff12837c242801750c89c1b85cd280b28b5d04ff13f644242801756a8b4c242883f801750c89c2b8b0d280b28b5d04ff138b5424688b1a8b1b83fb01741e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b008903eb686a016a016a01ff316a038d5c2408538b1889d09090e81e97ffff8b44247083c4048b0083f801750deb05e93e0000008b442404eb0d89c38b4424049090e89a0400008b4c246c89018b5d008d5bf83b5d087303ff5520895d00c743fc010000005883c4048903eb0ae905000000bb01000000f64424240175428b4424688b088b0983f901753589de508b5c2440b801000000909090e862f9ffff8b4c24648b0983f901740989cb9090e8860400008b4c24648901b801000000eb07b80100000089def644241401740889f083c41cc254006a016a018b4424708b48108b0983f901741389e1c7010100000089e1c7410401000000eb7656ff7010ff7020ff7024ff702c8b581c8b480889c89090e826c7ffff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e99a000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5c24088959085e83c40489710489018d44240489088d442404895004eb01568b4424708b0083f80175068b442408eb0d89c38b4424089090e8620300008b4c24708901833c24017507b801000000eb6c8b04248b5424748b3889fb8b42089090e8fafefeffa80174585750bb0300000089f8bafc317ab290e86256f9ff89c3b8f0ff7fb2e8c62ff9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c8eb0ae9a3000000e9060000008b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b442478e8ea1cffffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c24745289fb8b41089090e8fac2feffb8010000008b4c24708b0983f901740889cb90e89e0200008b4c24708901b8010000008b44241883c40483c002ff74241cff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff7424788b5c24749090e862f9ffff6a016a0150ff7424148d442408508b9c24840000008b4424149090e8620200008b4424788b48048b54241489118b50148b5c2418891a8b5c24748b1b83fb0175068b5c2404eb0b8b442404e89e32000089c38b44247489185883c428c254009090900000000004070000|@9415,2097151,@1090|27,0,@9325 422,0,0 454,1,@9297 474,1,@9328 631,0,1 660,0,@9310 688,0,@9313 762,1,@9152 802,1,@9329 850,0,0 882,0,0 890,1,@9317 910,1,@9330 921,0,0 928,0,0 971,0,0 980,0,0 1010,1,@9212 1040,0,0 1056,0,67108860 1072,0,0 1088,0,0 1111,0,0 1156,0,1 1175,0,62 1192,0,0 1204,0,1 1290,1,@9331 1307,0,0 1330,1,@8978 1341,0,1 1348,0,@5052 1354,1,@5053 1361,0,@9019 1366,1,@4940 1397,0,@9020 1407,0,@5398 1413,0,@4608 1482,1,@9015 1550,1,@8774 1555,0,0 1574,1,@9332 1585,0,0 1722,1,@9333 1770,1,@9414 9325:O4|@4608,@5398,@9327,@9326 9326:O5|@9130,884,0,884,0 9327:S24|67656e43617365202d206e756c6c2063617365206c697374 9328:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1050| 9329:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1051| 9330:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1052| 9331:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1053| 9332:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1054| 9333:D3,1136|3b650c7303ff552483f80175198b4424048b4c240c8908c7400401000000b801000000c20c008b4b108b0983f901746fa801740d89c1b884d080b28b5d0490ff13a801740c89c1b818e480b28b5d04ff138b4c240850ff33ff7310ff7008ff316a036a018b500489d0e846cfffff59c7010100000059c70101000000f6042401740f8b088b5004b8b0d080b28b5d04ff13598b55008d52f43b5508730aeb05e969000000ff5520895500c742fc020000008b09894a04c702390000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891183f90175058b4804eb138b3089cb8b4004909090e8ba03000089c1eb028b308b4424048930894804b801000000c20c00a801740c89c1b884d080b28b5d04ff13a801740c89c1b818e480b28b5d04ff136a016a016a0150ff33ff73105353ff74242cff74242c8d4c241c518b58088b480489c890e8b2030000837c241001746b6a016a018b4424088b48108b0983f901741389e1c7010100000089e1c7410401000000eb73ff7010ff7020ff7024ff702c8b581c8b480889c8909090e85ec0ffff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040eb05e914020000c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c70601000000eb05e99e0000008d7e08c747fc01000040c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5c24248959085b83c404895904890189e0890889e0895004f644241401740ab884d080b28b5d04ff138b442414a80174108b4804b818e480b28b5d04909090ff138b4c242cff7008ff316a036a018b5c24188b500489d09090e8d6ccffff8b4c2410c701010000008b4c240cc701010000006a016a01ff7004ff30ff74243c8d44240c508b5c24208b44241890e8eefcfffff644242001740cb8b0d080b28b5d049090ff138b4424208b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701390000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908837c242c0175068b4c2410eb1489c68b5c242c8b44241090e8062b000089c189f083f901740789cbe84e2b000083f80175058b0424eb0a89c38b0424e8922b000083f80175068b442408eb0d89c38b4424089090e8d22b00008b4c243483c4045a83c40c8911894104b80100000083c41cc20c00f644240c01740db8b0d080b28b5d04909090ff138b44240c8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701390000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908837c241801740a8b5c241890e8a22b00008b4c24208b5424148911894104b80100000083c41cc20c009090000000006c040000|@9413,2097151,@1088|26,0,0 31,0,0 55,0,@9301 72,0,@9334 106,1,@9236 113,0,0 120,0,0 136,0,@9303 184,0,28 215,0,0 242,1,@9336 262,0,0 276,0,@9301 292,0,@9334 338,1,@9337 371,0,0 380,0,0 410,1,@9212 440,0,0 463,0,67108860 479,0,0 495,0,0 518,0,0 563,0,1 582,0,62 599,0,0 611,0,1 672,0,@9301 693,0,@9334 730,1,@9236 740,0,0 750,0,0 794,0,@9303 840,0,28 871,0,0 902,1,@9408 918,1,@9409 938,1,@9410 962,1,@9411 983,0,0 1001,0,@9303 1048,0,28 1079,0,0 1098,1,@9412 1116,0,0 9334:O4|101,@6569,0,@9335 9335:O5|@9007,1886,0,1886,0 9336:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1055| 9337:D3,3124|8d7c248c3b7d0c7303ff55288b4c24108b55008d52f83b55087303ff5520895500c742fc01000040c7020100000083792401747052ff7124ff712c50ff710cff711c53ff7104ff71206a01bbe4f080b289c8909090e8babdfeff8b442414ff7004ff7008b8f8f080b28b542408909090ff12b8150000008b54240890ff12b804a480b28b54240890ff12bb030000008b442404bafc317ab290e8ea4cf9ff8b542408eb05e9d8000000909090ff12b870d87fb28b54240890ff12bb0300000058bafc317ab2e8be4cf9ff8b5424049090ff12b8150000008b54240490ff1258a801740783f8017c6ceb06f640ff1075698b4c24148b19baffffff002353fc8d541201a8017409f6c20174043bc2eb05ff5538ebf77c07ba01000000eb26a8017410baffffff002353fc8d5412013bc2720c89c2b8cc7b7ab28b5d04ff138b5c43fe89da50ff74240489d3909090e8b6f5feffeb0ae921000000e91c00000058a801740583e8027105ff5538ebf63b650c7303ff5524e965ffffffb801000000eb1b89c6b80100000052ff7124ff712c56ff710cff711c53ff71046a018b4424048b008b4c242ca8017508f601017503ff55383b01740bb80cf180b28b5d0490ff136a016a01837c2410017526837c243801740ab848f180b28b5d04ff1389e09090c700dcc27fb289e0c7400401000000eb678b442410f644243801740c8b10b848f180b28b5d04ff138b5424388b5c241cf6000174128b3bbeffffff002377fc8d7436013b30770d8b30b8cc7b7ab28b5d0490ff138b008b4447fea801740e89c6b84cb680b28b5d049090ff138b30833e09750a8b4e04eb63e9fe02000083780801740683780801750f8b7008b8a4f180b28b5d049090ff13b901000000bb0300000083f92f750d8b7008b858f07fb28b5d04ff1389df23780883ff01751183c1028d5c1bff3b650c7303ff5524ebd3f6c101740c83f9017d1eeb0be974000000f641ff107411ff3289cbb88c6c7ab2ff1588c75208eb0489c8ff32ff7504b9aee780b251896504a801740583f82f720c89c1b8cc7b7ab28b5d04ff13b944d47fb28b4441fe89c183c40458894504eb26908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13ff3283390175118b4104a801740583c020711fff5538ebf68379080375118b4104a801740583c0107108ff5538ebf68b4104a80175108b10f640ff107402f7da8d541201eb0289c289c889d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09016a016a016a0150526a038d4c240c518b5c241c8b44245ce83a88ffff8b4424508b5c24088b480889c89090e83af2feffa801745750bb030000008b44240cbafc317ab2e8a249f9ff89c3b8f0ff7fb2e80623f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c240c8b4424549090e83210ffffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2450528b5c240c8b4108e842b6feffb8010000008b0c2483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09015089d38b442454e8fe01ffff837c24100175058b4004eb0c8b5c24108b4004e81608000083f80175058b0424eb0a89c38b0424e85a0800008d4c241883c4045a83c410891189e18941048b4424148b00a801740583e8027105ff5538ebf68b4c2434ba01000000ff31a801740df604240174073b04247c49eb05ff5538ebf450526a0389c38b44244c9090e8ee0effff833c2401740a8b1c249090e84a08000083c40459f6c101740583e9027105ff5538ebf689c289c83b650c7303ff5524eba889d08b4c241883c4048b09f6c101740583e9027105ff5538ebf6ba0100000050f6c101740783f9017c39eb06f641ff10753151ff742444ff74242889cb89d0909090e83a08000059f6c101740583e9027105ff5538ebf689c23b650c7303ff5524ebbd89d08b4c24188b09f6c101740583e9027105ff5538ebf6ba0100000050f6c101740783f9017c4ceb06f641ff1075748b44244489cf5289fb8b480889c89090e88eeffeffa801753a8b0883390b75338b5104f6c201740583c2027105ff5538ebf6f6c2017412f6042401740c3b14247e0ceb12e938000000ff5538ebef8b1424eb038b1424f7c701000000740583ef027105ff5538ebf689f983c4043b650c730aeb05e908000000ff5524e96dffffff89d08b4c24248b54241c8b12f6c201740583ea027105ff5538ebf68b590850f6c201740783fa017c62eb06f642ff10755f8b44244889d75389fb8b500889d0e8deeefeff8b4c242c8b19baffffff002353fc8d541201f7c7010000007409f6c20174043bfaeb05ff5538ebf77c07ba01000000eb38f7c701000000741cbaffffff002353fc8d541201eb0ae9b6000000e9b10000003bfa720e89c2b8cc7b7ab28b5d049090ff138b5c7bfe89daa801754c8b0083380b75058b0424eb5bf6c20175518b0283380b754a8b5804f6c301740df604240174073b1c247d0beb05ff5538ebf489d8eb038b0424a8017414f644240401740d3b4424047c0ceb23e91b000000ff5538ebee89c2b824f780b28b5d04ff138b0424eb08e9030000008b0424f7c701000000740583ef027105ff5538ebf689fa83c40489c33b650c7303ff5524e9d9feffff89d8a801740df604240174073b04247d0aeb05ff5538ebf48b04248b54242c8b12a8017409f6c20174043bc2eb05ff5538ebf77d6b8b54242c8b12f6c2017408a80174042bd07105ff5538ebf783c20183fa017507ba01000000eb5cf6c201740783fa017c08eb15f642ff10740f89c3b8fc9780b28b5d04909090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000895304c70361000000eb05e91b0000008d530cc742fc02000000c7420401000000891a8b5c242c8903eb05ba01000000ff742448516874f780b2528d442404506a016a01bbffffff008b442464baf80280b29090e85a15ffff8b4c24308b09f6c101740583e9027105ff5538ebf650ff74245cff742440ff742440bb0100000089c89090e89a0a00008b4c24348b09f6c101740583e9027105ff5538ebf6ba0100000050f6c101740783f9017c3feb06f641ff10753751ff742464ff742448ff742448ff74245c89cb89d090e82a13000059f6c101740583e9027105ff5538ebf689c23b650c7303ff5524ebb789d08b4c24408b5424448b12f6c201740df641080174073b51087e18eb05ff5538ebf48b54244cc70203000000bb01000000eb05bb010000008b54244c8b1283fa017407b901000000eb1950ff742448ff74246889cbb801000000e84a1a000089c1eb01506a016a01837c246801751389e0c7000100000089e0c7400401000000eb738b45008d40d83b45087303ff5520894500c740fc03000000c74008010000008b542430895004c700090000008b54246c8b5a1c8b1b8d7010c746fc05000000c7461001000000c7460c01000000c7460801000000c746040300000089065153ff7224ff721c568b4208909090e842b0feffeb05e95e0000008b442408a801740583c0027105ff5538ebf6598901833c240174126a01bb5c3080b28b44247c9090e83eb3feff8b45008d40f83b45087303ff5520894500c740fc0100000083c4045989088d4c240489018d442404c7400401000000eb0151837c24580174136a01bbe4f080b28b442474909090e8f2b2feff8b44245c8b00837c24380175068b4c2430eb1589c68b5c24388b4424309090e85a1b000089c189f083f90175068b4c242ceb1189c689cb8b44242ce8961b000089c189f083f90175068b4c2418eb1189c689cb8b442418e8d21b000089c189f083f90175068b4c2414eb1189c689cb8b442414e80e1c000089c189f083f90175068b4c2410eb1189c689cb8b442410e84a1c000089c189f083f90175068b4c240ceb1189c689cb8b44240ce8861c000089c189f083f90175058b0c24eb1289c689cb8b04249090e8c21c000089c189f083f90175068b4c2408eb1189c689cb8b442408e8fe1c000089c189f08b54246483c40489025883c458894204894a08b801000000c2100090909000000000300c0000|@9407,2097151,@1082|42,0,0 76,0,@9338 86,1,@8783 101,0,@9339 115,0,10 127,0,@9214 139,0,1 148,0,@5052 154,1,@5053 175,0,@8972 187,0,1 193,0,@5052 198,1,@5053 211,0,10 247,0,8388607 279,0,0 290,0,8388607 308,0,@5401 334,1,@8980 379,0,0 388,0,0 439,0,@9340 468,0,@9343 483,0,@8794 492,0,0 512,0,@9343 537,0,8388607 555,0,@5401 578,0,@9238 622,0,@9346 634,0,0 639,0,1 652,0,@8999 716,0,@5215 722,0,I106 736,0,$9337+786 756,0,@5401 766,0,@8950 804,0,@8952 898,0,1 911,0,31 950,1,@9152 970,1,@8978 980,0,1 989,0,@5052 994,1,@5053 1001,0,@9019 1006,1,@4940 1037,0,@9020 1047,0,@5398 1053,0,@4608 1114,1,@9015 1182,1,@8774 1187,0,0 1270,0,1 1283,0,31 1306,1,@8997 1330,1,@9349 1350,1,@9350 1397,0,0 1438,1,@9015 1454,1,@9351 1518,0,0 1558,1,@9352 1614,0,0 1654,1,@8978 1830,1,@8978 1841,0,8388607 1877,0,0 1892,0,8388607 1922,0,@5401 2032,0,@9357 2178,0,0 2205,0,@9193 2246,0,48 2270,0,0 2285,0,0 2295,0,@9360 2310,0,8388607 2319,0,@9032 2326,1,@9034 2365,0,0 2374,1,@9362 2400,0,0 2446,1,@9373 2519,0,1 2524,0,0 2531,0,0 2547,0,0 2565,0,0 2570,1,@9394 2594,0,0 2603,0,0 2636,0,0 2649,0,4 2675,0,0 2682,0,0 2689,0,0 2696,0,1 2718,1,@8774 2759,0,@9108 2770,1,@8783 2817,0,0 2834,0,@9338 2846,1,@8783 2882,1,@9399 2910,1,@9400 2938,1,@9401 2966,1,@9402 2994,1,@9403 3022,1,@9404 3050,1,@9405 3078,1,@9406 3106,0,0 9338:S10|6d657267655374617465 9339:S11|7361766564207374617465 9340:O4|@4608,@5398,@9342,@9341 9341:O5|@9007,2157,0,2157,0 9342:S6|4d61726b6572 9343:O4|@4608,@5398,@9345,@9344 9344:O5|@9007,2190,0,2190,0 9345:S37|6d657267655374617465202d204d69736d61746368656420726573756c7420737461746573 9346:O4|@4608,@5398,@9348,@9347 9347:O5|@9007,2175,0,2175,0 9348:S14|4e6f742061207265676973746572 9349:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1056| 9350:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1057| 9351:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1058| 9352:D3,856|3b650c7303ff55248b4c240889c7538b4108909090e89ae7feff8b4c24088b19baffffff002353fc8d541201f6c201740df604240174073b14247f0eeb05ff5538ebf4ba01000000eb2af60424017411baffffff002353fc8d5412013b1424770c89c2b8cc7b7ab28b5d04ff138b14248b5453fea801755bf6c201755b83781001745a8b7010f642100175568b4a108b1ef6c3017508f601017503ff55383b19747057ff32ff30ff7208ff7008ff700cff700456ff7204ff31bb030000008b06bafc317ab2e86a3ef9ff89c3b85cf680b2eb14e954020000e93b020000e977000000e9750000009090e8b617f9ffbb410000009090e8aa17f9ff50bb030000008b442404bafc317ab2e8263ef9ff89c3eb05e9450000005883c4049090e88217f9ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c84f680b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b7210837804017406837a0401754d8b48083b4a0874183b4a087413576a018b5c24088b44241490e8b604ffffeb498b18833b0575478b32833e0575458b43043b4604744283380175178b4e0483390175528b50043b5104743aeb4de9d000000083380375578b4e04833903754f8b50043b51047547eb14e95c010000e950000000e94b000000e9080000008b50083b510875298b5b08f6c3017515f6460801750feb0ae914000000e90f000000ff55383b5e087507b801000000eb12576a018b5c24088b442414e81604ffffeb5857eb5a833b0b753b8b32833e0b75348b4304a8017509f64604017503ff55383b46047507b801000000eb15576a018b5c24088b442414909090e8d603ffffeb5857eb5a576a018b5c24088b442414909090e8be03ffffeb68e9ad000000e9a80000003b7010745ef6401001751ef7c60100000075168b48108b11f6c2017508f606017503ff55383b16745d8b4d008d49e83b4d08730feb0ae96d000000e968000000ff5520894d00c741fc050000008971108b500c89510c8b5808895908eb0ae945000000e91e0000008b70048971048b3089318b74240c57518b5c24088b4608e882a9feffeb0157b801000000eb1a576a018b5c24088b4424149090e81203ffffeb06b80100000057833c2401750683c408c208008b1c2483c4085983c40851e95e00000090900000000054030000|@9356,2097151,@1060|22,1,@8978 33,0,8388607 68,0,0 81,0,8388607 100,0,@5401 186,0,1 193,0,@5052 198,1,@5053 205,0,@9353 234,1,@4940 239,0,32 246,1,@4940 252,0,1 261,0,@5052 266,1,@5053 286,1,@4940 317,0,@9354 327,0,@5398 333,0,@4608 386,1,@9015 528,0,0 546,1,@9015 589,0,0 610,1,@9015 634,1,@9015 778,1,@8774 786,0,0 806,1,@9015 813,0,0 842,1,@9355 9353:S30|6d657267653a206d69736d6174636865642064657374696e6174696f6e20 9354:O5|@9007,2232,0,2232,0 9355:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1059| 9356:S40|434f444547454e5f5441424c4528292e6d657267655374617465283529666978456e747279283229 9357:O4|@4608,@5398,@9359,@9358 9358:O5|@9007,2321,0,2321,0 9359:S28|6d6572676553746174653a20756e70757368656420656e7472696573 9360:D3,200|3b650c7303ff55248b4a0889c75289fb8b41089090e816e3feff8b0c248b490483c4048b19baffffff002353fc8d541201f7c7010000007409f6c20174043bfaeb05ff5538ebf77c07ba01000000eb2bf7c7010000007410baffffff002353fc8d5412013bfa720d89c2b8cc7b7ab28b5d0490ff138b7c7bfe89faa80175198b30833e0b7512f6c201750d8b3a833f0b7506b801000000c3a801751ef6c20175138b12833a0b7406b801000000c3b803000000c3b801000000c3b801000000c300000000c4000000|@9361,63,@1061|22,1,@8978 38,0,8388607 74,0,0 89,0,8388607 107,0,@5401 147,0,0 169,0,0 175,0,1 181,0,0 187,0,0 9361:S40|434f444547454e5f5441424c4528292e6d6572676553746174652835296d75737450757368283129 9362:D3,900|3b650c7303ff5524a801740783f8017c62eb06f640ff10755f8b4c240c89df5089c38b4108e8fae1feff8b4c240c8b19baffffff002353fc8d541201f6c201740df604240174073b14247f0eeb05ff5538ebf4ba01000000eb36f60424017411baffffff002353fc8d5412013b14247718eb0ae9fc020000e9f702000089c2b8cc7b7ab28b5d04ff138b14248b5453fea801755e8b30833e0b7507ba01000000eb61f6c20175508b0a83390975498b5d008d5bf83b5d087303ff5520895d00c743fc010000008b7104893357ff30ff7008ff7004ff7010ff700cff742428ff7424248b442420909090e8aa02000089c2eb5ae92d020000833e057555f6c2017555eb05e9190200008b0a83390575618b5e08f6c3017509f64108017503ff55383b5908741857ff700cff7010ff7004ff7008b87c0081b28b5d0490ff138b5e043b59047453833b01752beb0fe9d9010000e9c3010000e9be0100008b5904833b01753c8b76048b76043b73047531eb5ee9a4010000833b0375258b5904833b03751d8b5e048b71048b4b043b4e04750f8b4b083b4e08eb05e974010000745d8b4a0823480883f901746683f90174668b5208235008b901000000bb0300000083f92f75218b700c5756ff7010eb05e93e010000ff7004ff7008ff30b858f07fb28b5d04ff1389de23f283fe01751883c1028d5c1bff3b650c730aeb05e910010000ff5524ebb9f6c101741383f901eb0ae9b8000000e9b30000007d28eb06f641ff10742057ff700cff7010ff7004ff7008ff3089cbb88c6c7ab29090ff1588c75208eb148b500c8b58108b700457525356ff7008ff3089c8ff7504b90efb80b251896504a801740583f82f720c89c1b8cc7b7ab28b5d04ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb14b90100000057ff700cff7010ff7004ff7008ff30ff3424ff742408ff742410ff742418ff742420ff74243cff74243889cb8b442434909090e88e00000089c283c414eb19ba0100000057eb11ba0100000057eb0957eb06ba01000000578b442404a801740583e8027105ff5538ebf6833c2401741089c68b1c2489d0e8fe04000089c289f08b4c241483c4088b5c24088b742404894c240c895c24088974240489d3e98cfcffff89d8c20c009090900000000080030000|@9372,2097151,@1067|38,1,@8978 49,0,8388607 84,0,0 97,0,8388607 128,0,@5401 156,0,0 234,1,@9363 307,0,@9368 438,0,0 443,0,1 476,0,@8999 566,0,@5215 574,0,I106 604,0,$9362+654 624,0,@5401 634,0,@8950 672,0,@8952 718,0,0 774,1,@9363 786,0,0 794,0,0 805,0,0 842,1,@9371 9363:D3,788|3b650c7303ff55246a016a01f6c30175588b4c242483390975398b51043b13745d833a0175118b33833e0175268b7a043b7e04745deb1c833a0375178b33833e0375108b7a043b7e0475088b4a083b4e08745e8b0b83390175198b5104f6c201740583c2207135eb05e93b010000ff5538ebef8379080375208b5104eb05e962000000f6c201740583c210710fff5538eb05e94e000000ebef8b5104f6c20175158b32f642ff107402f7de8d743601eb07e92f00000089d689f1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09012354242083fa01743683fa0174318b4c24108b510c50ff33ff7204ff72088b1a8b4424089090e81a1bffff8d4424085989088d442404c7400401000000eb718b0b83390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b32f642ff107402f7de8d743601eb0289d689f1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090150ff3389d3eb05e9400000008b44241890e80aeefeff8d4c24085a89118d4c24048b4004894104eb2350bb9f0100008b4424149090e8e6edfeff8d4c24048b1089118d4c24048b58048959048b4424148b1c248b480889c890e8aedcfeffa801753a8b0083380b75338b442410ff7004ff70088b188b44240ce812f3feff837c240801750683c40cc21c008b5c240883c40c5983c41c51e90c010000ff7424048b5c24048b44241890e83682ffff8b4c241489c78b1c248b4108909090e84adcfeffa8017512576a018b5c24088b44241ce8befafeffeb06b801000000578b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542408895104c701090000008b55008d52e83b55087303ff5520895500c742fc050000008b5c2420895a108b74241c89720cc74208010000008b7c2424897a04890a8b4c241850528b5c240c8b4108e896a0feff837c24100175068b442404eb0f8b5c24108b4424049090e89200000083f80175075883c410c21c0089c38b042483c4145983c41c51e9cc0000000000000010030000|@9367,2097151,@1065|187,0,1 200,0,31 254,1,@9051 272,0,0 356,0,1 369,0,31 402,1,@8997 427,0,207 438,1,@8997 474,1,@8978 506,1,@9004 536,1,@9364 554,1,@9167 574,1,@8978 594,1,@9015 601,0,0 633,0,0 646,0,4 691,0,0 718,1,@8774 746,1,@9365 776,1,@9366 9364:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1062| 9365:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1063| 9366:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1064| 9367:S41|434f444547454e5f5441424c4528292e6d6572676553746174652835296c6f6164546f526567283729 9368:O4|@4608,@5398,@9370,@9369 9369:O5|@9007,2487,0,2487,0 9370:S25|6d657267653a206d69736d617463686564206f666673657473 9371:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1066| 9372:S43|434f444547454e5f5441424c4528292e6d6572676553746174652835296c6f6164456e7472696573283229 9373:D3,1336|3b650c7303ff55248b4c241089c7538b4108909090e832d9feff8b4c24108b19baffffff002353fc8d541201f6c201740df604240174073b14247f0eeb05ff5538ebf4ba01000000eb2af60424017411baffffff002353fc8d5412013b1424770c89c2b8cc7b7ab28b5d04ff138b14248b5453fea8017566f6c20175668b308b0ebbe60181b28d5c8bfcffe39090e927010000909090e9b1010000909090e9c1010000909090e9fa020000909090e90b000000909090e9850300009090908b4e0483390175128b5904f6c301740583c320712cff5538ebf683790803eb0ae92b040000e92604000075128b5904f6c301740583c3107108ff5538ebf68b5904f6c30175108b03f643ff107402f7d88d440001eb0289d889c1b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c090123420883f801740583f801754e8b0283380b750cb8a40681b28b5d049090ff13833809754f8b4e043b4804745183390175128b5804833b01752e8b51043b53047526eb3a833903751f8b5804833b0375178b51043b5304750feb05e91e0000008b71083b730874168b442408c70003000000eb0a8b4c2408c70103000000b801000000eb738b0a83390174188b5808ff7010ff700cff7004b8f00681b28b5d049090ff138b5808235a088b75008d76e83b75087303ff5520897500c746fc050000008b4810894e108b500c89560c895e088b50048956048b1089168b54241457ff700853568b5c24108b4208e8029cfeffb8ffffffffeb05e9d902000033042483c0012344240489c383c4088b442410e88afafeffeb5c8b12833a03740ab8340781b28b5d04ff13b901000000eb5c8b4a083b480874053b48087507bb01000000eb588b1a833b05741a57ff7008ff7010ff700cff7004b8840781b28b5d04909090ff138b4e043b4b0474528339017523eb05e9670200008b4b0483390175588b76048b76043b7104eb05e9410200007433eb5e833903755eeb05e9cd0000008b4b0483390375678b4e048b73048b59043b5e04755e8b59083b5e08eb05e90200000075738b4808234a088b55008d52e83b5508730aeb05e97a000000ff5520895500c742fc050000008b5810895a10eb0ae960000000e95b0000008b700c89720c894a088b70048972048b30eb0ae943000000e93e00000089328b74241457ff700851528b5c24108b4608e8c29afeffb8ffffffffeb05e91a00000033042483c0012344240489c383c4088b442410e84af9feffeb128b442408c70003000000b90100000089c85789c3eb6d57eb6f8b0a83390774198b580857ff7010ff700cff7004b8d00781b28b5d049090ff138b5808235a088b75008d76e83b75087303ff5520897500c746fc050000008b4810894e108b500c89560c895e088b50048956048b1089168b54241457ff700853568b5c24108b4208eb0ae9ee000000e9e9000000e80a9afeffb8ffffffff33042483c0012344240489c383c4088b442410909090e896f8feffeb6c8b0a83390b756a8b5e04f6c3017509f64104017503ff55383b5904741857ff7008ff7010ff700cff7004b8140881b28b5d0490ff138b4808234a088b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c894a088b70048972048b30eb0ae94f000000e93a00000089328b74241457ff700851528b5c24108b4608e85a99feffb8ffffffff33042483c0012344240489c383c4088b442410909090e8e6f7feffeb108b5c2408c70303000000b8010000005789c389d9eb015789c8eb0957eb06b80100000057833c2401750683c408c210008b1c2483c4085983c41051e9e00100000000000034050000|@9393,2097151,@1069|22,1,@8978 33,0,8388607 68,0,0 81,0,8388607 100,0,@5401 130,0,$9373+142 281,0,1 294,0,31 330,0,@9374 419,0,1 431,0,1 436,0,0 462,0,@9377 546,1,@8774 551,0,-1 582,1,@9016 596,0,@9380 606,0,0 626,0,0 653,0,@9383 866,1,@8774 871,0,-1 902,1,@9016 914,0,1 919,0,0 954,0,@9386 1050,1,@8774 1055,0,-1 1082,1,@9016 1131,0,@9389 1226,1,@8774 1231,0,-1 1258,1,@9016 1270,0,1 1275,0,0 1295,0,0 1324,1,@9392 9374:O4|@4608,@5398,@9376,@9375 9375:O5|@9007,2554,0,2554,0 9376:S21|6d657267653a20756e70757368656420656e747279 9377:O4|@4608,@5398,@9379,@9378 9378:O5|@9007,2570,0,2570,0 9379:S16|436f6465726566206d69736d61746368 9380:O4|@4608,@5398,@9382,@9381 9381:O5|@9007,2604,0,2604,0 9382:S27|6d657267653a206d69736d61746368656420436f6e7461696e6572 9383:O4|@4608,@5398,@9385,@9384 9384:O5|@9007,2585,0,2585,0 9385:S24|6d657267653a206d69736d61746368656420446972656374 9386:O4|@4608,@5398,@9388,@9387 9387:O5|@9007,2564,0,2564,0 9388:S16|4c69746572616c206d69736d61746368 9389:O4|@4608,@5398,@9391,@9390 9390:O5|@9007,2594,0,2594,0 9391:S31|6d657267653a206d69736d61746368656420737461636b20656e7472696573 9392:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1068| 9393:S44|434f444547454e5f5441424c4528292e6d657267655374617465283529636865636b456e7472696573283229 9394:D3,240|3b650c7303ff55248b4c24088b09f6c101740df643080174073b4b087c0aeb05ff5538ebf4c208006a016a0150538d5c24088b442414ba142880b29090e88e22ffff837c2408017436837c24040175068b44240ceb108b5c24048b44240c909090e89e0000008b4c24188b542414894c2418895424145b83c40ce981ffffff8b4424188b00a801740583c0027105ff5538ebf68b4c2418890151ff7424188b5c2408b82c2b80b29090e852ffffff837c24040175068b4c240ceb1389c68b5c24048b44240ce89200000089c189f083f901750683c410c2080089cb83c4105983c40851e9cc00000000000000ec000000|@9398,1048575,@1073|55,0,@9073 62,1,@9084 98,1,@9395 163,0,@9080 198,1,@9396 228,1,@9397 9395:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1070| 9396:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1071| 9397:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1072| 9398:S50|434f444547454e5f5441424c4528292e6d657267655374617465283529616c69676e436f64652d616464416c69676e283129 9399:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1074| 9400:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1075| 9401:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1076| 9402:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1077| 9403:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1078| 9404:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1079| 9405:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1080| 9406:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1081| 9407:S29|434f444547454e5f5441424c4528292e6d657267655374617465283529 9408:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1083| 9409:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1084| 9410:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1085| 9411:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1086| 9412:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1087| 9413:S27|434f444547454e5f5441424c4528292e6d657267654c6162283429 9414:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1089| 9415:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d67656e4361736573283329 9416:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1091| 9417:S9|70757368436f6e7374 9418:D3,260|3b650c7303ff552450536a01bb01000000ba040380b2909090e8fe16ffff6a016a0189e151ff74241089c38b4424109090e8e20000008b45008d40d83b45087303ff5520894500c740fc03000000c740080100000059894804c700030000008b4c24088b511c8b128d5810c743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b4108e8da8dfeff8b442408a801740583c0027105ff5538ebf6598901833c24017415ff742408bbc41481b28b442414909090e8da90feff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240883c4048948045983c40c8908c3900000000000010000|@9425,2097151,@1095|13,0,0 18,0,@9033 26,1,@9074 50,1,@9419 81,0,0 91,0,1 117,0,0 124,0,0 131,0,0 138,0,1 158,1,@8774 194,0,@9424 206,1,@8783 9419:D3,40|3b650c7303ff55248b4c24088b542404895c24088954240489cbe91d000000900000000024000000|@9423,2097151,@1094|27,1,@9420 9420:D3,392|3b650c7303ff552483f8017515c703010000008b442408894304b801000000c20800a801740583e8027105ff5538ebf66a016a0153ff742414ff7424148d5c240ce8baffffff8b4424108b482c8b098b502c8b12f6c201740583c2027105ff5538ebf68b582c89138b138b70188b36f6c201740cf7c60100000074043bd6eb05ff5538ebf77e078b1b8b5018891a8b55008d52d43b55087303ff5520895500c742fc02000000894a04c7020b0000008b581c8b1b8d720cc746fc01000000890e8d4e08c741fc05000000897110c7410c01000000c7410801000000c7410403000000891153ff7024ff701c518b480889c8e8328cfeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bba8eb7fb28b44241c90e8368ffeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c83c404894804598908837c2408017507b92c2b80b2eb1589c68b5c2408b82c2b80b290e83600000089c189f08b14248902894a04b80100000083c40cc208009090900000000084010000|@9422,2097151,@1093|15,0,0 27,0,0 171,0,5 208,0,0 215,0,0 222,0,1 242,1,@8774 276,0,@8996 286,1,@8783 335,0,@9080 348,0,@9080 354,1,@9421 371,0,0 9421:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1092| 9422:S52|434f444547454e5f5441424c4528292e72657365727665537461636b537061636528322970757368456e74726965732832292829 9423:S50|434f444547454e5f5441424c4528292e72657365727665537461636b537061636528322970757368456e7472696573283229 9424:S17|72657365727665537461636b5370616365 9425:S36|434f444547454e5f5441424c4528292e72657365727665537461636b5370616365283229 9426:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1096| 9427:D3,1728|3b650c7303ff5524833805755f8b4804f6c101740783f9017d08eb21f641ff10751b8b5424188b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0cb8f0ea7ab28b5d049090ff13f6c101740583c1027105ff5538ebf68b4424188b4c48fe83fb01740cba01000000eb6be90b0100008b54241489cf89fb8b420890e8bec4feffa801745f5750bb0300000089f8bafc317ab290e8261cf9ff89c3b8f0ff7fb2e88af5f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb05e98d00000089c88b5d049090ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1deb06f641ff107415576a0389fb8b44241c909090e8aee2feff89c2eb4c8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c2414575289fb8b4108909090e8ba88feffba01000000eb01518b442420598908895004b801000000c21c00833801756af640040174158b542410b9ffffff00234afc8d4c09013b4804770d8b4804b8cc7b7ab28b5d04ff138b40048b4442fe833803756b8b4c2414bb01000000ff711cff70048b4424048b00f6c3017408a80174043bd8eb05ff5538ebf77c718b45008d40d43b4508730aeb05e94d030000ff5520894500c740fc020000008b0c24894804c7000b0000008b54241c8b5a1c8b1b8d700cc746fc01000000890eeb05e9060200008d7e08c747fc05000000897710c7470c01000000c7470801000000c7470403000000890753ff7224eb05e940000000ff721c578b42089090e8ba87feff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb381c81b28b44242890e8be8afeff83c40458eb5a8b44241c89df89fb8b480889c8e89ac2feffa80175618b0883390b755f8b5104f6c2017509f60424017503ff55383b1424756c8b5c241c8b730889fb89f0909090e866c2feffa801745a5750bb0300000089f8bafc317ab2eb05e9200100009090e8c619f9ff89c3b8f0ff7fb2e82af3f8ff8b4d00eb0ae9e2000000e9dd0000008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2eb0ae999000000e918000000894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b442424909090e83ee0feffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241c575289fb8b410890e84e86feff58eb42f7c701000000740583c7027105ff5538ebf689fb3b650c7303ff5524e9d2fdfffff7c701000000740583c7027105ff5538ebf689fb3b650c7303ff5524e9b1fdffff8b4c242483c4088901c7410401000000b801000000c21c0083fb01756c8b4c24148b780489fb8b410890e8fec0feffa801745b5750bb0300000089f8bafc317ab290e86618f9ff89c3b8f0ff7fb2e8caf1f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae983000000e90300000090ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b44241c909090e8eadefeffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c2414575289fb8b410890e8fa84feffeb03ff70048b442420598908c7400401000000b801000000c21c008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7014c1c81b28b54240c8951048b7424148971088061ffbf6a016a0153568d7c24085789cb8b54241c9090ff12833c24017469837c24100174678b4424208b5c24188b480889c890e89ebffeffa801746350bb030000008b44241cbafc317ab2e80617f9ff89c3b8f0ff7fb2e86af0f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb0ae993000000e98e000000c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c241c8b4424249090e88addfeffeb4e8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2420528b5c241c8b4108e89a83feffb801000000eb05b801000000837c24080174098b5c2408e8ba0100008b4c242883c4045a83c4048911894104b801000000c21c00909000000000bc060000|@9432,2097151,@1099|62,0,@6373 102,0,0 126,1,@8978 137,0,1 144,0,@5052 150,1,@5053 157,0,@9019 162,1,@4940 193,0,@9020 203,0,@5398 209,0,@4608 278,1,@9015 350,1,@8774 355,0,0 373,0,0 396,0,8388607 416,0,@5401 442,0,0 517,0,5 565,0,0 572,0,0 579,0,1 606,1,@8774 640,0,@9428 650,1,@8783 674,1,@8978 726,1,@8978 737,0,1 744,0,@5052 758,1,@5053 765,0,@9019 770,1,@4940 813,0,@9020 835,0,@5398 841,0,@4608 902,1,@9015 970,1,@8774 1055,0,0 1060,0,0 1086,1,@8978 1097,0,1 1104,0,@5052 1110,1,@5053 1117,0,@9019 1122,1,@4940 1153,0,@9020 1163,0,@5398 1169,0,@4608 1242,1,@9015 1310,1,@8774 1329,0,0 1334,0,0 1367,0,@9429 1438,1,@8978 1448,0,1 1457,0,@5052 1462,1,@5053 1469,0,@9019 1474,1,@4940 1505,0,@9020 1515,0,@5398 1533,0,@4608 1594,1,@9015 1662,1,@8774 1667,0,0 1674,0,0 1690,1,@9431 1711,0,0 9428:S9|70757368537461636b 9429:D3,292|3b650c7303ff55248b420889d78b5f048b480889c8e83ebefeffa80174575750bb030000008b4704bafc317ab2e8a615f9ff89c3b8f0ff7fb2e80aeff8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5f048b4708909090e836dcfeffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4f0857528b5f048b410890e84682feff8b04248b48048b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c39090900000000020010000|@9430,2097151,@1097|22,1,@8978 33,0,1 41,0,@5052 46,1,@5053 53,0,@9019 58,1,@4940 89,0,@9020 99,0,@5398 105,0,@4608 166,1,@9015 234,1,@8774 271,0,0 9430:S48|47454e45524154455f434f444528292e636f646567656e2839296c6f6361646472283229636f64657c6465632d283129 9431:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1098| 9432:S36|47454e45524154455f434f444528292e636f646567656e2839296c6f6361646472283229 9433:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1100| 9434:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1101| 9435:D3,1804|3b650c7303ff55248b4c240489c753ff711cff71288b410890e896bbfeff83f801755a5750bb030000008b442410bafc317ab29090e8fa12f9ff89c3b8e07e80b2e85eecf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b08833907756b8b54241057ff71048b5c24108b42089090e81abbfeffa801745f50bb030000008b442414bafc317ab2e88212f9ff89c3b8f0ff7fb2e8e6ebf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb05e96902000089c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24148b44241c9090e80ad9feffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2418528b5c24148b4108e81a7ffefff6042401746bf6042401750bb808a87cb28b5d0490ff13833c240175598b4424188b481c8b0951ff7024ff701c68102681b289cb8b500889d09090e8da7efeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44242490e8de81feff8b4500eb0ae92d000000e9280000008d40f43b45087303ff5520894500c740fc02000000c740040100000083c40459890883c414c20400f60424017544f6042401740cb8ecd57ab28b5d049090ff138b0c24b8ffffff002341fc8d440001f64424040175148b5c24048b13f643ff107402f7da8d541201eb048b5424043bc2770ab8342681b28b5d04ff13f6c101740bb8ecd57ab28b5d0490ff13f64424040175148b5424048b02f642ff107402f7d88d440001eb048b4424048b4441fe8b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701070000008b4424188b501c8b128d590cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890b52ff7024ff701c5389d38b480889c8e88a7dfeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44242490e88e80feff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c40459890883c414c20400833903756c8b5104f6c201740bb8bc7e7ab28b5d0490ff1383ff0175048b12eb1ff7c701000000740583ef027105ff5538ebf68b52043b650c7303ff5524ebc88b5c241089d78b530889fb89d0909090e802b8feffa801745f5750bb0300000089f8bafc317ab290e86a0ff9ff89c3eb05e9cb010000b8f0ff7fb290e8c6e8f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b442418909090e8f2d5feffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c2410575289fb8b410890e8027cfeff8b4424148b5c240c8b480889c89090e812b7feffa801745750bb030000008b442410bafc317ab2e87a0ef9ff89c3b8f0ff7fb2e8dee7f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24108b4424189090e80ad5feffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2414528b5c24108b4108e81a7bfeff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000059890883c40cc204006a016a016a0157689f0100006a018d54240c528b5c24248b44242ce8e24bffff8b4424208b5c24088b480889c89090e8e2b5feffa801745750bb030000008b44240cbafc317ab2e84a0df9ff89c3b8f0ff7fb2e8aee6f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c240c8b4424249090e8dad3feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2420528b5c240c8b4108e8ea79feffb8010000008b4424108b008b4c24148b096a01ff742424ff74240cff74241cff742424ff742414ff74242489cb9090e8c200000089c18b45008d40f43b45087303ff5520894500c740fc0200000083c40c5a895004890883c40cc20400900000000008070000|@9444,2097151,@1103|26,1,@8978 38,0,1 47,0,@5052 54,1,@5053 61,0,@9153 66,1,@4940 97,0,@9154 107,0,@5398 113,0,@4608 150,1,@8978 160,0,1 169,0,@5052 174,1,@5053 181,0,@9019 186,1,@4940 217,0,@9020 227,0,@5398 233,0,@4608 302,1,@9015 370,1,@8774 387,0,@7422 420,0,@9436 434,1,@8774 468,0,@9417 478,1,@8783 521,0,0 550,0,@6321 565,0,8388607 612,0,@9438 627,0,@6321 701,0,3 727,0,0 734,0,0 741,0,0 748,0,1 770,1,@8774 804,0,@9417 814,1,@8783 845,0,0 875,0,@5417 942,1,@8978 953,0,1 960,0,@5052 966,1,@5053 980,0,@9019 986,1,@4940 1017,0,@9020 1027,0,@5398 1033,0,@4608 1094,1,@9015 1162,1,@8774 1182,1,@8978 1192,0,1 1201,0,@5052 1206,1,@5053 1213,0,@9019 1218,1,@4940 1249,0,@9020 1259,0,@5398 1265,0,@4608 1326,1,@9015 1394,1,@8774 1425,0,0 1446,0,207 1466,1,@9152 1486,1,@8978 1496,0,1 1505,0,@5052 1510,1,@5053 1517,0,@9019 1522,1,@4940 1553,0,@9020 1563,0,@5398 1569,0,@4608 1630,1,@9015 1698,1,@8774 1703,0,0 1750,1,@9441 9436:O5|@9437,1,0,0,0 9437:O2|3,0 9438:O4|@4608,@5398,@9440,@9439 9439:O5|@9007,1772,0,1772,0 9440:S35|696e646972656374202d20696e76616c696420636f6e7374616e742061646472657373 9441:D3,908|3b650c7303ff5524a8017409f6c30174043bc3eb05ff5538ebf77c708b4424188b480cff7104ff71088b198b44241c9090e872f1feff8b4424108b008b4c240c8b09a8017409f6c10174043bc1eb05ff5538ebf77e0c8b44240c8b008b4c24108901bb090000008b44240890ff15c8c752088b4d008d49d83b4d087303ff5520894d00c741fc03000000eb05e9880000008941088b442414894104c701050000008b5424188b5a1c8b1b8d7110c746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890e53ff7224ff721c568b4208e81278feff8b442408a801740583c0027105ff5538ebf6598901833c24017415ff74240cbb2c2a81b28b442424909090e8127bfeff83c40458c21c008b4c241889c75389fb8b4108e8eeb2feffa801754d8b08833905754b837c24200175068b542414893a8b51043b5424187442833a0175138b5c2418833b0175538b72043b7304742ceb52833a0375528b5c2418833b0375588b72043b73047550eb0ae9a7010000e9a20100008b42083b4308753c57ff7108bb090000008b4424149090ff15c8c75208a801751cf6042401eb05e918000000750feb0ae90f000000e90a000000ff55383b0424756aeb05576a01eb688b4424248b5c24048b480889c89090e836b2feffa801746350bb030000008b442408bafc317ab2e89e09f9ff89c3b8f0ff7fb2e802e3f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb0ae996000000e991000000c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24088b4424289090e822d0feffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2424528b5c24088b4108e83276feff83c4045883c404c21c008b442404a801740583c0027105ff5538ebf68b4c24248b5424208b5c241c8b7424188b7c2414508b44241450b80300000089442430894c242c89542428895c242489742420897c241c58894424148b5c240c5883c40ce9d9fcfffff7c701000000740583c7027105ff5538ebf68b4424208b4c241c8b5424188b5c24148b742410578b7c2410578b7c241089442428894c242489542420895c241c897424185889442410897c240c8b5c24045883c404e97ffcffff9090900000000088030000|@9443,2097151,@1102|50,1,@9051 99,0,4 110,0,I108 157,0,2 183,0,0 190,0,0 197,0,0 204,0,1 222,1,@8774 258,0,@9442 270,1,@8783 294,1,@8978 402,0,4 414,0,I108 478,1,@8978 488,0,1 497,0,@5052 502,1,@5053 509,0,@9019 514,1,@4940 545,0,@9020 555,0,@5398 573,0,@4608 634,1,@9015 702,1,@8774 761,0,1 9442:S8|696e646972656374 9443:S36|434f444547454e5f5441424c4528292e696e646972656374283329736561726368283329 9444:S27|434f444547454e5f5441424c4528292e696e646972656374283329 9445:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1104| 9446:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a0456e91f000000909090000000002c000000|@9451,2097151,@1107|33,1,@9447 9447:D3,200|3b650c7303ff5524b90b00000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707090000008b45008d40e03b45087303ff5520894500c740fc02000000897804c700030000008d480cc741fc0100004089018d4108c740fc02000000c740040100000089085052f6c301752eff7304ff74241cff742408ff742420ff742420ff7424208b038b5c241c90e8320000005b3b650c7303ff5524ebcdb80100000083c408c2100000000000c4000000|@9450,2097151,@1106|9,0,5 16,0,0 60,0,4 93,0,1 122,0,0 166,1,@9448 182,0,0 9448:D3,1360|3b650c7303ff55248b08ba1a2c81b28d548afcffe290e993000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e9f6000000909090e951010000909090e988020000909090e9b2020000909090e943000000909090e93b000000909090e933000000909090e9e8020000909090e925030000909090e91b000000909090e913000000909090e90b000000909090e965040000909090b801000000c214008b480853ff7004f6c101754a8b018b10ff7104ff72046a038b1a8b44241090e8aa72feffff742424ff742424ff742424ff742424ff7424248b5c24208b442414909090e80affffff83c404593b650c7303ff5524ebb18b44241c8b4c24188b5424148b5c24108b74240c8944241c894c241889542414895c24108974240c8b5c24045883c404e9c7feffff53ff7004ff74241cff74241cff74241cff74241cff74241c8b400890e8a6feffff58a80175328b08ff7004ff74241cff74241cff74241cff74241cff74241c8b5c24188b01909090e87afeffff583b650c7303ff5524ebcab80100000083c404c214008b48048339037526837c24140174178378080174118b5424108b5c240c89d85983c41451ff22b801000000c2140083390575658b7808ff710489da8b1c2489d090e8beacfeff83f801756d83ff01746d8b4424148b0c24f6c101740783f9017d08eb21f641ff10751b8b54240c8b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0d89c2b8f0ea7ab28b5d0490ff13f6c101740ceb05e93900000083c1027105ff5538ebf68b54240c8b4c4afe89c389c883c404eb0ae90e000000e90900000089da5983c41451ff22b80100000083c404c21400833901755cf641040174158b5c2404baffffff002353fc8d5412013b5104770f8b5008b8cc7b7ab28b5d049090ff138b51048b5453fe833a01751e8378080174108b7424108b420489f25983c41451ff22b801000000c21400b801000000c21400b801000000c214008b4c24148b5424108b74240c8b7c2408538b5c2408894c24188954241489742410897c240c895c24085b8b4004e9f3fcffff53ff7008ff74241cff74241cff74241cff74241cff74241c8b400490e8d2fcffff8b44241c8b4c24188b5424148b5c24108b74240c8944241c894c241889542414895c24108974240c8b5c24045883c404e99dfcffff8b400453a80175328b08ff7004ff74241cff74241cff74241cff74241cff74241c8b5c24188b01909090e86efcffff583b650c7303ff5524ebcab80100000083c404c214008b480453ff7008f6c101755e8b018338037529ff7104ff742420ff742420ff742420ff742420ff7424208b5c241c8b480489c89090e81efcffffeb6883380575688b5004ff7104ff7004f6c20175258b02ff72046a038b188b44241490e8726ffeff5a3b650c730aeb05e9bc000000ff5524ebd658a80175718b088b50048b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c70015000000eb0ae974000000e92b00000052ff742424ff742424ff742424ff742424ff7424248b5c24209090e88afbffff583b650c7303ff5524eb9cff7104ff70086a038b58048b442410eb05e92e0000009090e8de6efeffff742424ff742424ff742424ff742424ff7424248b5c24208b442414909090e83efbffff83c404593b650c7303ff5524e9dcfeffff8b44241c8b4c24188b5424148b5c24108b74240c8944241c894c241889542414895c24108974240c8b5c24045883c404e9f8faffff8b400453a801752dff7004ff74241cff74241cff74241cff74241cff74241c8b5c24188b00e8cefaffff583b650c7303ff5524ebcfb80100000083c404c21400000000004c050000|@9449,2097151,@1105|11,0,$9448+22 167,0,0 206,1,@8774 402,0,0 451,0,0 478,1,@8978 547,0,@6373 616,0,0 642,0,8388607 662,0,@5401 708,0,0 716,0,0 724,0,0 926,0,0 1030,1,@8774 1094,0,10 1178,1,@8774 1342,0,0 9449:S50|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f6164732832296c6f616473283129 9450:S42|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f616473283229 9451:S45|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f616473283129283129 9452:D3,232|3b650c7303ff55248b481c8b09f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c15eb06f641ff10750d89c2b834f67ab28b5d0490ff1389caf6c201740583c2027105ff5538ebf689ce89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89378b45008d40f43b45087303ff5520894500c740fc02000000c7000c3381b28978048060ffbf525789da9090ff12ff3424ff74240868003481b289e0506a016a018b5c24248b44241cbaf80280b2909090e826d0feff83c414c2040000000000e4000000|@9459,2097151,@1110|38,0,16777214 55,0,@6401 89,0,0 159,0,@9453 186,0,@9455 206,0,@9032 214,1,@9034 9453:D3,184|a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8f0ea7ab28b5d04909090ff1389c1f6c101740583c1027105ff5538ebf68b5a048b4c4bfef6c101740583c1027105ff5538ebf6a801740783f8017d08eb1cf640ff1075168b1ba8017409f6c30174043bc3eb05ff5538ebf77c0e89c3b8b0f57ab28b5d049090ff13a801740583c0027105ff5538ebf68b5204894c42feb801000000c300000000b4000000|@9454,15,@1108|45,0,@6373 138,0,@6397 171,0,0 9454:S32|434f444547454e5f5441424c4528292e70757368416c6c427574283329283129 9455:D3,276|3b650c7303ff55248b4a0489c75289fb8b41089090e88aa6feffa801740f89c1b8283581b28b5d04909090ff13f7c701000000740783ff017d08eb26f647ff1075208b0c248b51088b12f7c7010000007409f6c20174043bfaeb05ff5538ebf77c1b8b480c8b50088b58048b30ff7010b8f0ea7ab28b5d04909090ff1389faf6c201740583c2027105ff5538ebf68b59088b5453fef6c201740df640040174073b50047d10eb05ff5538ebf4b80300000083c404c3f640100175478b55008d52e83b55087303ff5520895500c742fc05000000c74210010000008b700c89720c8b70088972088b70048972048b3089328b04248b40045289fb8b400890e87e6afeffb80100000083c404c3900000000010010000|@9454,2097151,@1109|22,1,@8978 33,0,@9456 113,0,@6373 173,0,1 214,0,0 254,1,@8774 259,0,0 9456:O4|@4608,@5398,@9458,@9457 9457:O5|@9007,998,0,998,0 9458:S20|70757368416c6c4275743a206e6f20656e747279 9459:S29|434f444547454e5f5441424c4528292e70757368416c6c427574283329 9460:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1111| 9461:O2|@9462,0 9462:O3|44,@8798,4 9463:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1112| 9464:D3,440|3b650c7303ff55245350ff701cbb9f010000909090e83ab5feff598b098b55008d52cc3b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc030000008953088b30897304c703430000008d7b10c747fc02000000c7470401000000891f8d5f0cc743fc03000000c7430801000000897304c703090000008b3424578b7e1c8b3fff70048b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c01000000c7400801000000c740040300000089188b5c2408515257ff7624ff761c508b430889fbe84268feff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44241c90e8466bfeff6a016a01ff7424248d442404508b5c24148b4424289090e8aa0000008b45008d40f43b45087303ff5520894500c740fc020000008b4c24148948048b4c24108908837c24180175068b4c241ceb1689c68b5c24188b44241c909090e81a1e000089c189f083f90175068b4c2404eb1189c689cb8b442404e8561e000089c189f089c28b45008d40f03b45087303ff5520894500c740fc030000008948088950045983c4248908c390909000000000b4010000|@9508,2097151,@1135|14,0,207 22,1,@8997 55,0,0 79,0,33 96,0,0 115,0,0 124,0,4 167,0,0 174,0,0 181,0,0 188,0,1 214,1,@8774 248,0,@9108 258,1,@8783 286,1,@9465 354,1,@9506 382,1,@9507 9465:D3,188|3b650c7303ff55248b4c2408f6c101740583e9027105ff5538ebf66a016a01ff702c50518d4c240c51e8a20000008b4424048b00a801740ff64424180174083b4424187e17eb05ff5538ebf38b5c24188b04249090e80a150000eb05b8010000008b4c24048b09f6c101750af6442418017503ff55383b4c2418740d89c1b8045581b28b5d0490ff13837c240c01740a8b5c240c90e8961c00008b4c241483c4085a83c4048911894104b801000000c20800909000000000b8000000|@9505,2097151,@1132|42,1,@9466 86,1,@9489 93,0,0 127,0,@9501 150,1,@9504 171,0,0 9466:D3,2164|3b650c7303ff55248b48148b09f6c101740ff64424080174083b4c24087c0beb05ff5538ebf389caeb048b5424088b701489168b502c8b12f6c201750af6442408017503ff55383b5424087407ba01000000eb05ba0300000089cf56ff7018ff702c5053528b480889c8909090e832a1feff83f801755a5750bb030000008b44240cbafc317ab29090e896f8f8ff89c3b8e07e80b2e8fad1f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b0883390b7568833c2401746783780801740683780801756057ff71048b5c24288b442410909090e88a0700008b4c24148b09f6c101740583e9027105ff5538ebf6f6c101740bf604240174052b0c247105ff5538ebf683c10150bb0900000089c890ff15c8c752088b4c2414eb0fe991010000e968010000e96301000089c78b5c24108b410890e846a0feffa801745b5750bb030000008b442418bafc317ab2909090e8aaf7f8ff89c3b8f0ff7fb2e80ed1f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24188b44241c90e83abefeffeb468b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241457528b5c24188b4108909090e84664feff8b44241c8b00a801740583c0027105ff5538ebf68b4c241c89018b45008d40f03b45087303ff5520894500c740fc030000005a895008c74004f8c27fb2c700590000008b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008902833c2401745a8b1c2489d0e8ca0b000089c2eb5e57ff742408ff742428ff7424188b5c2418b80100000090e8020c000089c26a016a01eb5d833905755d833c2401745c83780801740683780801756e57ff7108ff71048b5c242c8b442414eb05e96e0400009090e87e0500008b4c2414eb05e95c04000089c78b5c24108b4108909090e87e9efeffa80174725750bb03000000eb0fe939040000e987010000e95c0100008b442418bafc317ab29090e8d2f5f8ff89c3b8f0ff7fb2eb05e93e01000090e82ecff8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d04eb05e9040000009090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24188b44241c90e852bcfeffeb468b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241457528b5c24188b4108909090e85e62feff8b44241c8b00a801740583c0027105ff5538ebf68b4c241c89018b45008d40f03b45087303ff5520894500c740fc030000008b5424088950088b542404895004c700590000008b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008902833c2401745f8b1c2489d090e8020f000089c2eb6257ff742408ff742428ff7424188b5c2418b80100000090e8160a000089c26a016a016a01eb638339077563833c2401746257ff71048b5c24288b4424109090e8a60300008b4c241089c78b5c240ceb05e97b0200008b4108909090e8a69cfeffeb05e969020000a801746c5750bb030000008b442414bafc317ab2e806f4f8ff89c3b8f0ff7fb2eb0fe942020000e919020000e9f0010000909090e856cdf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24148b44241890e882bafeffeb468b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241057528b5c24148b4108909090e88e60feff8b4424188b00a801740583c0027105ff5538ebf68b4c24188901f644240401745cf644240401750bb808a87cb28b5d0490ff138b442404a801740a81f8010000807c62eb06f640ff10755fbbf44c81b29090ff1588d7520883f8017474f644240401750bb808a87cb28b5d0490ff138b442404a801740403c0710ceb05e95f000000ff5538ebf083e801a801740583c0027105ff5538ebf68b4d008d49e83b4d08730feb0ae937000000e932000000ff5520894d00c741fc02000000894104c701550000008d410cc740fc02000000eb05e90b000000c74004010000008908eb3a8b45008d40e83b45087303ff5520894500c740fc020000008b4c2404894804c7005700000089c18d400cc740fc02000000c74004010000008908833c2401750489c2eb558b1c24909090e8da0c000089c2eb4657ff742408ff742428ff7424188b5c2418b80100000090e88e07000089c26a016a01eb2257ff742408ff742428ff7424188b5c2418b80100000090e86a07000089c26a016a016a0183c4048b45008d40d43b45087303ff5520894500c740fc020000008b4c242c83c408894804c7000b0000008b5c240c8b731c8b368d780cc747fc01000000890f8d4f08c741fc05000000897910c7410c01000000c7410801000000c741040300000089018b44240c5256ff7324ff731c5189f38b480889c8909090e8925efeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb544d81b28b44241c90e89661feff8b44241c8b008b4c24208b09a8017409f6c10174043bc1eb05ff5538ebf77e0c8b44241c8b008b4c242089018b44242483c4048b4c240889088b4424285989085983c41c894804b801000000c208009090900000000070080000|@9488,2097151,@1124|78,0,0 85,0,1 110,1,@8978 122,0,1 131,0,@5052 138,1,@5053 145,0,@9153 150,1,@4940 181,0,@9154 191,0,@5398 197,0,@4608 250,1,@9467 301,0,4 310,0,I108 346,1,@8978 357,0,1 366,0,@5052 374,1,@5053 381,0,@9019 386,1,@4940 417,0,@9020 427,0,@5398 433,0,@4608 494,1,@9015 566,1,@8774 627,0,@8796 633,0,44 664,0,0 682,1,@9474 708,0,0 714,1,@9475 774,1,@9467 802,1,@8978 813,0,1 839,0,@5052 846,1,@5053 853,0,@9019 866,1,@4940 897,0,@9020 907,0,@5398 913,0,@4608 982,1,@9015 1054,1,@8774 1124,0,44 1155,0,0 1174,1,@9484 1200,0,0 1206,1,@9475 1246,1,@9467 1274,1,@8978 1292,0,1 1301,0,@5052 1306,1,@5053 1313,0,@9019 1338,1,@4940 1369,0,@9020 1379,0,@5398 1385,0,@4608 1446,1,@9015 1518,1,@8774 1563,0,@7422 1583,0,-1073741824 1598,0,@9485 1606,0,I234 1623,0,@7422 1715,0,42 1739,0,0 1780,0,43 1799,0,0 1822,1,@9486 1848,0,0 1854,1,@9475 1884,0,0 1890,1,@9475 1941,0,5 1982,0,0 1989,0,0 1996,0,1 2026,1,@8774 2060,0,@9487 2070,1,@8783 2146,0,0 9467:D3,112|3b650c7303ff5524f6c301740783fb017c50eb06f643ff1075488b482c8b09f6c3017409f6c10174043bd9eb05ff5538ebf77d2e8b481c8b09f6c101740583e9027105ff5538ebf68b142489042453ff702cff700cbb0100000089c852e922000000b801000000c3000000006c000000|@9473,2097151,@1117|86,0,0 94,1,@9468 99,0,0 9468:D3,980|3b650c7303ff5524a801740783f8017d0deb06f640ff10740589d8c210008b4c241089df5089c38b4108909090e86698feffa801755d8b0883390b755b8b5104f6c201750af6442410017503ff55383b54241075626a016a0183780801745d83780801745cbb01000000be0300000083fb2f75158b480c8b5004ff7008b858f07fb28b5d049090ff1389f123480883f901eb0ae9d0020000e9cb020000751183c3028d7436ff3b650c7303ff5524ebbff6c3017418eb0fe99c020000e9a7000000e9a200000083fb017d21eb06f643ff107419ff700857ff700cff7004b88c6c7ab29090ff1588c75208eb0f8b480c8b50048b700889d856575152ff7504b93e4381b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138d4c241089018d442410c7400401000000eb74ff700857ff700cff700452bb9f0100008b44243090e82aa8feff8b4c24288b09f6c101740583e9027105ff5538ebf6f6c101740bf604240174052b0c247105ff5538ebf683c101ff30ff7004bb0900000089c890ff15c8c752088b4d008d49d03b4d087303ff5520894d00c741fc04000000eb05e96b00000089410cc7410834c47fb2c74104f8c27fb2c701010000008d4114c740fc030000008948088b4c2404894804c700450000008d5010c742fc02000000c74204010000008902833c2401740d8b1c2489d090e8b201000089c28d44241c83c4045983c40489088d4424108950048b44241083380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2fe2354240c89d38b442420e856b9feff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542410895104c701090000008b55008d52e83b55087303ff5520895500c742fc05000000c74210010000008b5c2404895a0cc74208010000005b83c404895a04890a8b4c242450528b5c24188b4108e8365afeff837c24100175058b0424eb2c8b5c24108b0424e8ea000000eb1eb8010000006a016a016a01576a01eb0eb8010000006a016a016a01576a018b4c241483c404f6c101740583e9027105ff5538ebf6833c2401740e89ce8b1c249090e8fa00000089f18b54242483c4148b5c240c8b7424088b7c240489542410895c240c89742408897c240489c389c8e934fcffff00000000d0030000|@9472,2097151,@1116|46,1,@8978 102,0,0 107,0,1 126,0,@8999 222,0,@5215 230,0,I106 255,0,$9468+306 275,0,@5401 286,0,@8950 324,0,@8952 354,0,0 372,0,207 382,1,@8997 437,0,4 446,0,I108 487,0,@8817 494,0,@8796 500,0,0 526,0,34 543,0,0 562,1,@9469 668,0,1 681,0,31 710,1,@9016 741,0,0 754,0,4 785,0,0 799,0,0 826,1,@8774 850,1,@9470 857,0,0 873,0,0 922,1,@9471 9469:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1113| 9470:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1114| 9471:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1115| 9472:S60|434f444547454e5f5441424c4528292e6c6f6164456e7472794265666f72654f76657277726974696e6728322966696e64546865456e747279283229 9473:S45|434f444547454e5f5441424c4528292e6c6f6164456e7472794265666f72654f76657277726974696e67283229 9474:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1118| 9475:D3,824|3b650c7303ff55246a016a016a0153689f0100006a018d44240c508b5c24288b44240c9090e89628ffff8b04248b480cff7024ff7104ff71088b198b4424109090e81ed0feff833c240174288b44240890e89a78feff89c3b81c4b81b2e862c3f8ff6a0189c38b442408909090e86e5afeffeb05b8010000008b5c241c83c4048b04249090e82ef9ffff8b4c24148b09f6c101750af6442418017503ff55383b4c241875558b4c24148b09f6c101740583c1027105ff5538ebf68b542414890a8b4d008d49e83b4d087303ff5520894d00c741fc020000008b5c2404895904c7015b0000008d710cc746fc02000000c7460401000000890eeb6c8b4c24148b09f6c101740df64424180174062b4c24187105ff5538ebf583c101f6c101740583e9027105ff5538ebf650bb0900000089c8909090ff15c8c75208a801740783f8017c08eb14f640ff10740e89c1b8344b81b28b5d049090ff138b4d008d49d03b4d08730aeb05e953000000ff5520894d00c741fc0400000089410cc7410834c47fb2c74104f8c27fb2c701010000008d4114c740fc030000008b542408895008894804c700750000008d7010c746fc02000000c74604010000008906eb01508b4424048b480c56ff7024ff7104ff71088b198b442418909090e87aa7feff833c240174268b44241090e80277feff89c3b8944b81b2e8cac1f8ff6a0189c38b442410909090e8d658feff8b44240c83c4048b5c24108b480889c8909090e8b290feffa801745750bb030000008b442414bafc317ab2e81ae8f8ff89c3b8f0ff7fb2e87ec1f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24148b44240c9090e8aaaefeffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2408528b5c24148b4108e8ba54feff837c24140175068b442404eb0f8b5c24148b4424049090e8ca00000083f80175075883c414c20c0089c38b042483c4185983c40c51e9040100000000000034030000|@9483,2097151,@1121|16,0,207 38,1,@9152 66,1,@9051 82,1,@8788 89,0,@9476 94,1,@4940 110,1,@8783 117,0,0 134,1,@9467 225,0,45 242,0,0 299,0,4 310,0,I108 334,0,@9477 382,0,@8817 389,0,@8796 395,0,0 421,0,58 438,0,0 474,1,@9004 490,1,@8788 497,0,@9480 502,1,@4940 518,1,@8783 542,1,@8978 552,0,1 561,0,@5052 566,1,@5053 573,0,@9019 578,1,@4940 609,0,@9020 619,0,@5398 625,0,@4608 686,1,@9015 754,1,@8774 782,1,@9481 812,1,@9482 9476:S13|6c6f636b52656769737465723a 9477:O4|@4608,@5398,@9479,@9478 9478:O5|@9182,299,0,299,0 9479:S43|73746f72655265676973746572546f537461636b3a204e6567617469766520737461636b206f6666736574 9480:S15|756e6c6f636b52656769737465723a 9481:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1119| 9482:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1120| 9483:S53|434f444547454e5f5441424c4528292e73746f7265496e537461636b28332967656e6572616c53746f7265496e537461636b283129 9484:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1122| 9485:B4|00000040 9486:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1123| 9487:S16|7075736856616c7565546f537461636b 9488:S31|434f444547454e5f5441424c4528292e73746f7265496e537461636b283329 9489:D3,304|3b650c7303ff55248b482c8b098b501c8b12f6c201740583ea027105ff5538ebf650ff702453ff702c515053ff74240cff700cbb0100000089d0909090e8020100008b4c24048b09f6c1017509f60424017503ff55383b0c24740e89c1b8045481b28b5d049090ff138b4c240483c4048b09f6c101740df64424040174062b4c24047105ff5538ebf583c10183f9017507b901000000eb55f6c101740783f9017c08eb15f641ff10740f89c2b8fc9780b28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702610000008d4a0cc741fc02000000c7410401000000891183f801750489c8eb0c89c389c8909090e8d2050000595a8911833c240174145050bbc05481b28b44240c9090e8fe53feffeb01505883c408c39090000000002c010000|@9500,2097151,@1130|52,0,0 62,1,@9490 94,0,@9495 146,0,0 173,0,@9193 214,0,48 231,0,0 254,1,@9498 271,0,@9499 282,1,@8783 9490:D3,984|3b650c7303ff5524a801740783f8017d0deb06f640ff10740589d8c210008b4c241089df5089c38b4108909090e89a8bfeffa80175558b0883390b75538b5104f6c201740ff64424100174083b5424107c5feb05ff5538ebf36a016a01837808017464837808017463bb01000000be0300000083fb2f75218b480c8b5004ff7008b858f07fb28b5d04eb0ae9dc020000e9d70200009090ff1389f123480883f901751883c3028d7436ff3b650c730aeb05e9a6020000ff5524ebb8f6c301741183fb017d2beb10e9a0000000e99b000000f643ff107419ff700857ff700cff7004b88c6c7ab29090ff1588c75208eb0f8b480c8b50048b700889d856575152ff7504b90e5081b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138d4c241089018d442410c7400401000000eb74ff700857ff700cff700452bb9f0100008b44243090e85a9bfeff8b4c24288b095af6c2017409f6c10174042bd17105ff5538ebf783c201f6c201740583c2027105ff5538ebf6ff30ff7004bbf9ffffff89d09090ff15c8c752088b4d008d49d03b4d087303ff5520894d00c741fc04000000eb05e96800000089410cc7410834c47fb2c74104f8c27fb2c701010000008d4114c740fc030000008948088b4c2404894804c700450000008d5010c742fc02000000c74204010000008902833c2401740d8b1c2489d090e8b201000089c28d44241883c4045989088d4424108950048b44241083380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090183f2fe2354240c89d38b442420909090e886acfeff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542410895104c701090000008b55008d52e83b55087303ff5520895500c742fc05000000c74210010000008b5c2404895a0cc74208010000005b83c404895a04890a8b4c242450528b5c24188b4108e8664dfeff837c24100175058b0424eb2c8b5c24108b0424e8ea000000eb1eb8010000006a016a016a01576a01eb0eb8010000006a016a016a01576a018b4c241483c404f6c101740583e9027105ff5538ebf6833c2401740e89ce8b1c249090e8fa00000089f18b54242483c4148b5c240c8b7424088b7c240489542410895c240c89742408897c240489c389c8e930fcffff00000000d4030000|@9494,2097151,@1128|46,1,@8978 106,0,0 111,0,1 130,0,@8999 226,0,@5215 234,0,I106 259,0,$9490+310 279,0,@5401 290,0,@8950 328,0,@8952 358,0,0 376,0,207 386,1,@8997 440,0,-4 450,0,I108 491,0,@8817 498,0,@8796 504,0,0 530,0,34 547,0,0 566,1,@9491 669,0,1 682,0,31 714,1,@9016 745,0,0 758,0,4 789,0,0 803,0,0 830,1,@8774 854,1,@9492 861,0,0 877,0,0 926,1,@9493 9491:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1125| 9492:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1126| 9493:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1127| 9494:S47|434f444547454e5f5441424c4528292e726573657442757452656c6f61642832296c6f6164456e7472696573283229 9495:O4|@4608,@5398,@9497,@9496 9496:O5|@9007,1245,0,1245,0 9497:S47|726573657442757452656c6f61643a206d75737420686176652070757368656420736f6d657468696e67206d6f7265 9498:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1129| 9499:S14|726573657442757452656c6f6164 9500:S33|434f444547454e5f5441424c4528292e726573657442757452656c6f6164283229 9501:O4|@4608,@5398,@9503,@9502 9502:O5|@9007,1696,0,1696,0 9503:S40|7075736856616c7565546f537461636b3a20436f756c646e2774207075736820746f20737461636b 9504:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1131| 9505:S35|434f444547454e5f5441424c4528292e7075736856616c7565546f537461636b283329 9506:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1133| 9507:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1134| 9508:S30|434f444547454e5f5441424c4528292e7075736841646472657373283229 9509:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1136| 9510:O2|@9511,0 9511:O3|58,@9512,@8796 9512:O4|0,@8798,@8817,4 9513:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1137| 9514:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1138| 9515:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1139| 9516:D3,452|3b650c7303ff55246a016a016a0150689f0100006a018d4c240c519090e82218ffff8b45008d40f03b45087303ff5520894500c740fc030000008b4c2404894808c74004305781b2c700750000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b042489cf8b5c24088b480889c8e8d681feffa801745b5750bb030000008b442410bafc317ab2909090e83ad9f8ff89c3b8f0ff7fb2e89eb2f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24108b44240890e8ca9ffeffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b0c2457528b5c24108b4108e8da45feffb801000000508b44240890e8a23bffff837c24140175068b4c2404eb1389c68b5c24148b442404e85200000089c189f083f90175058b0c24eb1289c689cb8b04249090e88e00000089c189f083f901750483c418c389cb83c418e9cf00000090909000000000c0010000|@9520,2097151,@1143|16,0,207 30,1,@9152 68,0,@9512 74,0,58 105,0,0 126,1,@8978 137,0,1 146,0,@5052 154,1,@5053 161,0,@9019 166,1,@4940 197,0,@9020 207,0,@5398 213,0,@4608 274,1,@9015 342,1,@8774 347,0,0 358,1,@9190 386,1,@9517 414,1,@9518 437,1,@9519 9517:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1140| 9518:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1141| 9519:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1142| 9520:S32|434f444547454e5f5441424c4528292e72656c6f616448616e646c6572283229 9521:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1144| 9522:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1145| 9523:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1146| 9524:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1147| 9525:D3,248|3b650c7303ff55248b4c2404ff7004ff711cff30ff7110ff3153ff712c68c05d81b2bbffffff0089c8e8e298feff595a891159c7010100000059c7010100000089c6589090e816010000598b09f6c101740583e9027105ff5538ebf6ba010000005056f6c101740ff64424080174083b4c24087c48eb05ff5538ebf351526a0189cb8b44241c909090e8ea9bfeff833c2401740a8b1c249090e81603000083c40459f6c101740583e9027105ff5538ebf689c23b650c7303ff5524eba689d0833c240174098b1c2490e83e03000083f801750a83c4045883c404c2040089c38b44240483c40c5983c40451e97403000000000000f4000000|@9546,2097151,@1156|30,0,@9526 35,0,8388607 42,1,@9012 53,0,0 60,0,0 70,1,@9529 93,0,0 138,1,@9015 154,1,@9543 202,1,@9544 236,1,@9545 9526:O1|@9527 9527:D3,16|b803000000c39090000000000c000000|@9528,1,@1148|1,0,1 9528:S32|434f444547454e5f5441424c4528292e636c6561724361636865283129283129 9529:D3,144|3b650c7303ff55248b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701690000008d410cc740fc02000000c7400401000000890883f8017507b8b85e81b2eb0e89c3b8b85e81b29090e86a00000083f8017507b82c5f81b2eb0c89c3b82c5f81b2e8f200000083f8017506b8cc5f81b2c389c3b8cc5f81b2e94f010000909090000000008c000000|@9542,15,@1152|37,0,52 54,0,0 66,0,@9530 75,0,@9530 82,1,@9532 92,0,@9533 101,0,@9533 106,1,@9538 116,0,@9539 124,0,@9539 129,1,@9541 9530:O2|@9531,0 9531:O3|34,@8796,@9512 9532:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1149| 9533:O2|@9535,@9534 9534:O2|@9536,0 9535:O2|48,2 9536:O3|34,@8791,@9537 9537:O4|0,@8796,@8817,4 9538:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1150| 9539:O2|@9540,0 9540:O3|58,@9512,@8791 9541:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1151| 9542:S29|5838364c4f574c4556454c28292e737461727448616e646c6572283129 9543:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1153| 9544:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1154| 9545:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1155| 9546:S25|434f444547454e5f5441424c4528292e666978757048283329 9547:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1157| 9548:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1158| 9549:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1159| 9550:O1|@9551 9551:D3,16|b801000000c39090000000000c000000|@9552,1,@1160|1,0,0 9552:S45|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d283129 9553:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1161| 9554:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1162| 9555:O5|@9556,1,0,0,0 9556:O3|4,@5643,0 9557:O4|@4608,@5398,@9559,@9558 9558:O5|@9130,549,0,549,0 9559:S27|4e6f20426567696e4c6f6f7020666f72204c6f6f7020696e737472 9560:D3,472|8d7c24ac3b7d0c7303ff5528a8017554f6c30175548b088b13833a017507be01000000eb65833a057507be01000000eb5e8b7204833e0175158b7e04f7c701000000740583c720712fff5538ebf6837e080375218b7e04f7c701000000741183c710eb0ae95f010000e95a0100007108ff5538ebea8b7e04f7c701000000751c8b17f647ff10740eeb0ae954000000e949000000f7da8d541201eb0289fa8b3189d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090189f18b75008d76f83b75087303ff5520897500c746fc010000008916eb0a8b1189d1eb048b1189d1ff7304ff7004566a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb0300000089c88b942490000000ff1283f801750e89c1b8146681b28b5d049090ff13ff30ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244c8b5c24488b4424449090e85efeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c24000b801000000c2400000000000d4010000|@8004,1048575,@1163|31,0,0 43,0,0 163,0,1 176,0,31 303,0,1 326,0,@9561 457,0,0 9561:O4|@4608,@5398,@9563,@9562 9562:O5|@9130,563,0,563,0 9563:S18|6576616c4172673a206e6f20726573756c74 9564:D3,592|3b650c7303ff5524a8017559f6c30174108b088b5004b8c06881b28b5d0490ff138b0b8339017542ff30ff74240cff74240c8b4b0489cb8b4004909090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20800e9c301000083390575726a016a01ff7304ff7004ff71048d54240c528b188b4424209090e816d2ffff8b4424148b0083f80175068b44240ceb0b89c38b44240ce80e0200008b4c24148901ff742418518b5c240c8b442408e83effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e90c00000083c4085983c4048908c20800ff30ff7104ff742410ff7424108b4b0489cb8b40049090e8f2feffff8b0c2483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09016a016a016a0150526a018d4c240c518b5c24208b44242c90e89e08ffff8b44241c8b0083f80175068b44240ceb0b89c38b44240ce85e0100008b4c241c89018b4424208b500cff7024ff7204ff72088b1a8b44241c909090e802b0feff833c240174268b44241490e87e58feff89c3b81c4b81b2e846a3f8ff6a0189c38b442428909090e8523afeff8b45008d40f43b45087303ff5520894500c740fc0200000083c4045983c4048948045983c40c8908c2080083fb01740bb8c06881b28b5d0490ff13b801000000c20800909090000000004c020000|@9570,2097151,@1166|23,0,@9565 138,1,@9466 166,1,@9568 349,0,1 362,0,31 402,1,@9152 430,1,@9569 466,1,@9051 482,1,@8788 489,0,@9476 494,1,@4940 510,1,@8783 563,0,@9565 574,0,0 9565:O4|@4608,@5398,@9567,@9566 9566:O5|@9130,594,0,594,0 9567:S30|6d6f7665417267733a204d69736d61746368656420617267756d656e7473 9568:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1164| 9569:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1165| 9570:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6d6f766541726773283229 9571:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1167| 9572:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1168| 9573:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8106b81b2c39090900000000044000000|@6536,3,@1169|56,0,@9574 9574:O2|@9575,0 9575:O1|27 9576:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1170| 9577:D3,40|a8017509f64204017503ff55383b42047406b801000000c3b803000000c390900000000024000000|@9578,5,@1171|19,0,0 25,0,1 9578:S39|434f444547454e5f5441424c4528292e707573685370656369666963456e747279283229283129 9579:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1172| 9580:O2|@9581,0 9581:O1|46 9582:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1173| 9583:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1174| 9584:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1175| 9585:D3,1200|8d7c24ac3b7d0c7303ff5528a8017572ff7004536a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458bb030000008b008b942498000000ff1283f801750e89c1b8447080b28b5d049090ff138b4c24108b1424eb05e918040000f6c201740bf6010174063b117d73eb05ff5538ebf5f6c201740783fa017d08eb1bf642ff107515f6c201740bf6010174063b117c15eb05ff5538ebf58b18b814a17db28b5d049090ff136a016a01ff30ff71048d44240850bb1100000089d09090ff1548c752088b44240859d1e80fb604018d4400018b4c2408ba03000000eb05e92100000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f801746beb086a016a01ff30eb66ff742460ff7424588b5c24088b442420909090e8760300008b4c24508b0983f901740989cb9090e8ba3900008b4c245089018b44240ca801740583c0027105ff5538ebf68b542460f6c201740583c2027105ff5538ebf68b5c245c8b742458eb0ae9f9000000e9f40000008b7c2454528b542450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b4424388984249c000000899c249800000089b4249400000089bc2490000000898c248c000000899424880000008b442430898424840000008b44242c898424800000008b4424288944247c8b442424894424788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c430894424205b83c40483c41058e96bfdffff8b4424548b1c248b480889c8e8a26afeffa801745750bb030000008b442404bafc317ab2e80ac2f8ff89c3b8f0ff7fb2e86e9bf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24048b4424589090e89a88feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2454528b5c24048b4108e8aa2efeffb8010000008b4c24508b0983f901740889cb90e8e23700008b4c245089018b44240ca801740583c0027105ff5538ebf68b5424608b5c245c8b7424588b7c2454508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b44245089942498000000899c249400000089b4249000000089bc248c000000898c24880000008b4c2430898c24840000008b4c242c898c24800000008b4c2428894c247c8b4c2424894c24788b4c2420894c24748b4c241c894c24708b4c2418894c246c8b4c2414894c24688b4c2410894c24648b4c240c894c24608b4c2408894c245c8b4c2404894c24585983c430894c24208944241c5b83c41058e961fbffffb801000000c24c009000000000ac040000|@9682,2097151,@1224|87,0,1 110,0,@9149 198,0,@8049 224,0,8 234,0,I104 258,0,1 278,0,31 330,1,@9586 350,1,@9680 674,1,@8978 684,0,1 693,0,@5052 698,1,@5053 705,0,@9019 710,1,@4940 741,0,@9020 751,0,@5398 757,0,@4608 818,1,@9015 886,1,@8774 891,0,0 910,1,@9681 1184,0,0 9586:D3,1324|3b650c7303ff55248b4c240489c75389fb8b410890e86a68feffa80174575750bb0300000089f8bafc317ab290e8d2bff8ff89c3b8f0ff7fb2e83699f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b442410909090e86286feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c2408575289fb8b410890e8722cfeffb8010000008b4d008d49dc3b4d087303ff5520894d00c741fc020000008b542410895104c701070000008b5c240c8b731c8b368d790cc747fc05000000c7471001000000c7470c01000000c7470801000000c7470403000000890f5056ff7324ff731c578b4b0889f389c8e8022cfeff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44241c90e8062ffeff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c241083c40489088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948048b4c240489088b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701607781b28d510cc742fc01000000890a83fa01750e89c1b8309281b28b5d049090ff1389c1ba0100000050f6c101756b8b4424148b790452ff318b1c248b480889c890e82e66feffa80174635750bb030000008b442408bafc317ab2909090e892bdf8ff89c3b8f0ff7fb2e8f696f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb05e9b7000000c7014ce239b289c88b5d049090ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44242490e81a84feffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241c57528b5c24088b4108909090e8262afeffb801000000837c240801740c8b5c2408909090e80e1d000089c25983c4083b650c7303ff5524e9d4feffff89d08b0c24ba0100000050f6c101756c8b4424188b790452ff318b1c248b480889c89090e8f664feffa80174635750bb030000008b442408bafc317ab2909090e85abcf8ff89c3b8f0ff7fb2e8be95f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb05e9b7000000c7014ce239b289c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44242890e8e282feffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c242057528b5c24088b4108909090e8ee28feffb801000000837c240801740c8b5c2408909090e82e1c000089c25983c4083b650c7303ff5524e9d3feffff89d0ff74241868309381b289c1b8030000009090e8920000006a016a0151ff742418ff7424308d54240c528d5c241890e8f21c0000837c241c0175068b442414eb0f8b5c241c8b4424149090e83e30000083f80175058b0424eb0a89c38b0424e88230000083f801750a83c4085883c41cc2080089c38b44240883c4285983c40851e9b83000000000000028050000|@9679,2097151,@1221|22,1,@8978 33,0,1 40,0,@5052 46,1,@5053 53,0,@9019 58,1,@4940 89,0,@9020 99,0,@5398 105,0,@4608 166,1,@9015 234,1,@8774 239,0,0 276,0,3 302,0,0 309,0,0 316,0,0 323,0,1 346,1,@8774 380,0,@9417 390,1,@8783 421,0,0 526,0,@9587 550,0,@9643 564,0,0 594,1,@8978 605,0,1 614,0,@5052 622,1,@5053 629,0,@9019 634,1,@4940 665,0,@9020 675,0,@5398 688,0,@4608 750,1,@9015 822,1,@8774 827,0,0 846,1,@9646 875,0,0 906,1,@8978 917,0,1 926,0,@5052 934,1,@5053 941,0,@9019 946,1,@4940 977,0,@9020 987,0,@5398 1000,0,@4608 1062,1,@9015 1134,1,@8774 1139,0,0 1158,1,@9647 1188,0,@9648 1195,0,1 1202,1,@9588 1230,1,@9650 1258,1,@9676 1278,1,@9677 1312,1,@9678 9587:O1|@9588 9588:D3,16|b88c7781b2c39090000000000c000000|@9642,1,@1197|1,0,@9589 9589:O1|@9590 9590:D3,44|3b650c7303ff5524b9030000008b1424890c2468d47781b2bb608881b252e9b5100000900000000028000000|@9636,2097151,@1196|9,0,1 20,0,@9591 25,0,@9632 31,1,@9633 9591:O1|@9592 9592:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700207881b28948048060ffbfc3000000002c000000|@9631,3,@1190|28,0,@9593 9593:D3,476|3b650c7303ff552489c1bb03000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc983390775718b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4904894b04c703050000008b4a046a016a01506a03538d5c240c538b59048b0190e8660100008b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b54240489108b1c24be05000000f6c301eb05e9f1000000740e89c7b8bc7e7ab28b5d049090ff1383fe0175048b1beb1ff7c601000000740583ee027105ff5538ebf68b5b043b650c7303ff5524ebbe833b0775758b45008d40f43b45087303ff5520894500c740fc020000008b5b04895804c700050000006a016a016a05508d4424085089cb89d0909090e8b6000000589090e8de0200008b1c24e84e03000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000eb05e90400000083c40cc3b99f0100008b54240c894c240cb901000000894c2408b905000000894c2404b9ac8081b28b1c24890c2489d989c389c852e96a080000b99f0100008b1c24890c246a016a0368348681b289d98b5a0451e94b08000090909000000000d8010000|@9630,2097151,@1189|11,0,1 23,0,@5417 107,0,2 134,1,@9594 179,0,2 198,0,@5417 286,0,2 310,1,@9594 318,1,@9602 326,1,@9603 365,0,0 381,0,207 394,0,0 403,0,2 412,0,@9614 430,1,@9620 435,0,207 450,0,@9626 461,1,@9620 9594:D3,276|3b650c7303ff552489c18b54240cf6c101740e89c6b8bc7e7ab28b5d049090ff1383fa0175048b09eb1cf6c201740583ea027105ff5538ebf68b49043b650c7303ff5524ebc8f6c101750e89c1b8387b81b28b5d049090ff1389de89c78b5c240c89f89090e80e9efbff8b4d008d49f83b4d087303ff5520894d00c741fc010000008b54240889118b5c240cf6c301740583c3027105ff5538ebf683fb017431f7c701000000740d50b8947b81b28b5d049090ff13f6c301740583eb027105ff5538ebf68b7f043b650c7303ff5524ebca8b5d008d5bf43b5d087303ff5520895d00c743fc02000000897b04890b83fb0174079090e8b60000008b4c24048901897104b801000000c20c00900000000010010000|@9601,63,@1177|22,0,@5417 78,0,@9595 102,1,@7849 170,0,@9598 246,1,@9600 260,0,0 9595:O4|@4608,@5398,@9597,@9596 9596:O5|@9182,422,0,422,0 9597:S39|7265706c6163654f706572616e643a204f706572616e6420616c72656164792070726573656e74 9598:O4|11,@4879,0,@9599 9599:O5|@5419,112,0,112,0 9600:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1176| 9601:S31|5838364c4f574c4556454c28292e7265706c6163654f706572616e64283429 9602:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1178|23,0,@6769 84,0,0 9603:D3,756|3b650c7303ff5524a801751df640040175178b4804f6410401750e8b5104837a0401750583fb01740c89c1b8c07f81b28b5d04ff138b18833b05755f8b31833e05740ab8008081b28b5d04ff13f64604017418f6460401750cb808a87cb28b5d049090ff13837e0401740ab82c8081b28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4304894704c70703000000eb59833b03740db8008081b28b5d04909090ff138b31833e057574f6460401750bb808a87cb28b5d0490ff138b7e04f7c701000000740783ff017d24eb06f647ff10741cff32ff730489fbb88c6c7ab2909090ff1588c75208eb0ce9b900000089f8ff32ff7304bb09000000909090ff15c8c752088b7d008d7fec3b7d087303ff5520897d00c747fc04000000eb05e91600000089470cc7470834c47fb258894704c70701000000eb6a833e03740db8008081b28b5d04909090ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4604894704c70703000000ff32578b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470cfdffffff5a8957088b5b04895f04c70701000000eb07e902000000ff328b0424833801750db8588081b28b5d04909090ff13833805756cf6400401746bf6400401750f8b4804b808a87cb28b5d049090ff138b4004a801740403c07105ff5538ebf783e801a801740583c0027105ff5538ebf68b4d008d49e43b4d087303ff5520894d00c741fc03000000894108897904c7016f0000008d4110c740fc02000000eb0ae95e000000e90d000000c7400401000000890883c404c38b4d008d49f03b4d087303ff5520894d00c741fc030000008b4004894108897904c701730000008b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c38b4d008d49f03b4d087303ff5520894d00c741fc030000008b4004894108897904c701750000008b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c404c390909000000000f0020000|@9613,2097151,@1179|44,0,@9604 68,0,@9607 90,0,@7422 108,0,@9609 149,0,1 161,0,@9607 187,0,@7422 229,0,@5215 238,0,I106 257,0,4 266,0,I108 307,0,@8817 317,0,0 329,0,@9607 373,0,1 407,0,-2 423,0,0 445,0,@9611 478,0,@7422 554,0,55 583,0,0 628,0,57 659,0,0 704,0,58 735,0,0 9604:O4|@4608,@5398,@9606,@9605 9605:O5|@9182,624,0,624,0 9606:S12|67656e53746f7265576f7264 9607:O4|@4608,@5398,@9606,@9608 9608:O5|@9182,613,0,613,0 9609:O4|@4608,@5398,@9606,@9610 9610:O5|@9182,612,0,612,0 9611:O4|@4608,@5398,@9606,@9612 9612:O5|@9182,622,0,622,0 9613:S29|5838364c4f574c4556454c28292e67656e53746f7265576f7264283229 9614:O1|@9615 9615:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f88081b28948048060ffbfc3000000002c000000|@9619,3,@1182|28,0,@9616 9616:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e89efbffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,2097151,@1181|22,1,@9617 30,1,@9603 69,0,0 9617:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1180|23,0,@6769 84,0,0 9618:S42|5838364c4f574c4556454c28292e67656e6572617465496e737472756374696f6e283129283129283129 9619:S39|5838364c4f574c4556454c28292e67656e6572617465496e737472756374696f6e283129283129 9620:D3,772|3b650c7303ff55248b4c2408a801740d89c2b8bc7e7ab28b5d0490ff1383f90175048b00eb1cf6c101740583e9027105ff5538ebf68b40043b650c7303ff5524ebca8338057562837c240c0174058b4008eb038b40048b4c241023c883f901746183f901746123442410b901000000ba0300000083f92f750c89c6b858f07fb28b5d04ff1389d623f083fe01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740e83f901eb05e9970100007d24eb06f641ff10741c5389cbb88c6c7ab2eb0ae90e010000e909010000ff1588c75208eb0389c853ff7504b94a8381b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b14246a016a0150ff742418518d4c240c518b5a048b02e866f6ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b54241490ff1289c18b45008d40e83b45087303ff5520894500c740fc050000008b54241c8950108b5c241889580c8948085983c40c894804c70007000000c210008b45008d40e43b45087303ff5520894500c740fc06000000c700548581b28958048b4c24108948088b54240c89500c8b5c24088958108b7424048970148060ffbf89c78b45008d40e83b45087303ff5520894500c740fc0500000089501089480c895808897804c70005000000c210006a016a018b44241881e09f01000083f801741883f801741389e08b4c2418890889e08b542414895004eb1189e0c7009f01000089e0c74004010000008b45008d40e43b45087303ff5520894500c740fc06000000c700cc8581b28958048b4c24188948088b54241489500c8b5c24108958108b74240c8970148060ffbf89c78b45008d40e83b45087303ff5520894500c740fc050000008b4c24048948105983c40489480c895808897804c70005000000c210009090900000000000030000|@9625,2097151,@1185|19,0,@5417 107,0,0 112,0,1 124,0,@8999 188,0,@5215 206,0,I106 219,0,$9620+270 239,0,@5401 250,0,@8950 288,0,@8952 334,0,1 362,1,@9594 462,0,3 495,0,@9621 574,0,2 628,0,207 637,0,0 667,0,@9624 754,0,2 9621:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04ba988581b256ff2290000000002c000000|@9623,1048575,@1183|32,0,@9622 9622:O1|@9620 9623:S34|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283129283129283129 9624:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04ba988581b256ff2290000000002c000000|@9623,1048575,@1184|32,0,@9622 9625:S28|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283629 9626:O1|@9627 9627:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700808681b28948048060ffbfc3000000002c000000|@9631,3,@1188|28,0,@9628 9628:D3,240|3b650c7303ff552489c1bb05000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc983390775728b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c700050000008b4a046a016a016a05508d442408508b59048b019090e806f3ffff589090e8720000008b1c24e89ef5ffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804eb05e907000000c70001000000c3b99f0100008b1c24890c246a016a0568ac8081b289d98b5a0451e9d4faffff00000000ec000000|@9630,2097151,@1187|11,0,2 23,0,@5417 107,0,2 134,1,@9594 142,1,@9629 150,1,@9603 196,0,0 202,0,207 217,0,@9614 228,1,@9620 9629:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1186|23,0,@6769 84,0,0 9630:S41|5838364c4f574c4556454c28292e6c6f6164546f5265674f724c69746572616c283129283129283129 9631:S38|5838364c4f574c4556454c28292e6c6f6164546f5265674f724c69746572616c283129283129 9632:O2|@5330,0 9633:D3,1556|3b650c7303ff5524a80175578b088339077555f640040175618b50048b32833e07755cf6460401745bf6460401750e89c7b808a87cb28b5d049090ff13837e0401756c8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b5104895704eb0ae90b010000e906010000c707050000006a016a0150eb0fe9f4000000e9ef000000e95c0000006a01578d74240c568b73048b3b89f389f8909090e802f1ffff8b45008d40f43b4508730aeb05e931000000ff5520894500c740fc020000008b4c24088948048b4c240489088b5424109090ff1289c15883c40889ca5983c40851ff22837c2408037507bf01000000eb18f64304017507bf01000000eb05bf0300000083f70283f7028b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701948e81b28959048b5c24088959088b44240489410c8061ffbf8b45008d40e83b45087303ff5520894500c740fc05000000897810c7400c9f010000c7400801000000894804c70005000000c20800a801755d8b08833905755b8b510881e29f01000083fa01746a83fa01746a8b510881e29f010000ff33ff7304ff74240489d38b442414e8f2040000b901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751deb0ae9a0030000e99b03000083c1028d5412ff3b650c7303ff5524ebc9f6c1017413eb0ae982010000e97d01000083f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8ff7504b9c28a81b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff136a016a01837c241803751389e18b542408891189e1c7410401000000eb41f644240801751389e18b542408891189e1c7410401000000eb278b4d008d49f83b4d087303ff5520894d00c741fc01000000890189e2890a89e1c74104030000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000006a016a01506a01518d4c240c518b5c24188b442424909090e88eeeffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b54242090ff1289c18b45008d40e83b45087303ff5520894500c740fc050000008b542410895010c7400c010000008948085983c418894804c70007000000c208008b510481e29f01000083fa01746083fa0174608b510481e29f01000053ff3389d38b442410909090e8f6020000b901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101741183f9017d23eb10e91d010000e918010000f641ff10741189cbb88c6c7ab29090ff1588c75208eb0289c8ff7504b9b28c81b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b14246a016a01506a01518d4c240c518b5a048b029090e8feecffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b54241490ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c010000008948085983c40c894804c70007000000c208008b55008d52ec3b55087303ff5520895500c742fc04000000c7025c9181b2895a048b5c2408895a088b74240489720c8062ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000895004c70005000000c20800837c2408037507b801000000eb18f64304017507b801000000eb05b80300000083f00283f0028b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7019c9181b28959048b5424088951088b5c240489590c8061ffbf89c68b45008d40e83b45087303ff5520894500c740fc05000000897010c7400c9f010000c7400801000000894804c70005000000c208009090900000000010060000|@9641,2097151,@1195|50,0,@7422 111,0,2 158,1,@9594 237,0,0 250,0,0 257,0,1 293,0,@9634 348,0,207 355,0,0 364,0,2 426,1,@9637 431,0,0 436,0,1 448,0,@8999 528,0,@5215 534,0,I106 546,0,$9633+598 566,0,@5401 578,0,@8950 616,0,@8952 657,0,0 683,0,0 724,0,1 757,0,1 786,1,@9594 870,0,0 886,0,3 934,1,@9637 939,0,0 944,0,1 956,0,@8999 1022,0,@5215 1030,0,I106 1042,0,$9633+1094 1062,0,@5401 1074,0,@8950 1112,0,@8952 1158,0,1 1186,1,@9594 1263,0,0 1270,0,0 1286,0,3 1319,0,@9639 1371,0,1 1378,0,207 1385,0,0 1394,0,2 1409,0,0 1422,0,0 1429,0,1 1465,0,@9640 1522,0,207 1529,0,0 1538,0,2 9634:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bad48e81b256ff229090900000000028000000|@9636,1048575,@1191|26,0,@9635 9635:O1|@9633 9636:S38|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283129283129283129 9637:D3,536|3b650c7303ff5524a80175538b0023c38b4c2404ba01000000f6c1017562f6010175628b318b3e833f03755e8b7704833e0175158b7e04f7c701000000740583c720712aff5538ebf6837e0803751c8b7e04f7c701000000740c83c710eb05e9a40100007108ff5538ebef8b7e04f7c70100000075218b37f647ff107413eb0fe94c000000e935000000e930000000f7de8d743601eb0289fe8b790489f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bd6eb038b790489f93b650c7303ff5524e948ffffff89d183f1fe23c183f801745b83f801745bb901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740783f9017d21eb06f641ff10741989cbb88c6c7ab2ff1588c75208eb0ce9c6000000e9c100000089c8ff7504b9869081b251896504a801740583f82f720c89c1b8cc7b7ab28b5d04ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1383380175118b4004a801740583c020711fff5538ebf68378080375118b4004a801740583c0107108ff5538ebf68b4004a80175108b08f640ff107402f7d98d4c0901eb0289c1b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c0901c2040089d8c2040089d8c204009090900000000014020000|@9638,2097151,@1192|21,0,0 159,0,1 172,0,31 227,0,0 232,0,1 244,0,@8999 300,0,@5215 306,0,I106 328,0,$9637+378 348,0,@5401 358,0,@8950 396,0,@8952 484,0,1 497,0,31 9638:S26|5838364c4f574c4556454c28292e707265664173536574283329 9639:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bad48e81b256ff229090900000000028000000|@9636,1048575,@1193|26,0,@9635 9640:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bad48e81b256ff229090900000000028000000|@9636,1048575,@1194|26,0,@9635 9641:S32|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283429 9642:S36|5838364c4f574c4556454c28292e73746f7265576f72644e65676f746961746f72283129 9643:O4|@4608,@5398,@9645,@9644 9644:O5|@9007,2944,0,2944,0 9645:S26|6d6f7665546f5665633a204e6f7420696d706c656d656e746564 9646:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1198| 9647:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1199| 9648:D3,116|3b650c7303ff5524a80175578b4a048b590c52ff30ff7124ff7304ff73088b0389c38b44240c909090e8ca5dfeff833c240174268b44240490e8522dfeff89c3b8944b81b2e81a78f8ff8b4c24086a0189c38b4104e8260ffeffb8ffffffff83c40cc3b8ffffffffc39090900000000070000000|@9649,2097151,@1200|42,1,@9004 58,1,@8788 65,0,@9480 70,1,@4940 86,1,@8783 91,0,-1 100,0,-1 9649:S35|434f444547454e5f5441424c4528292e646174614f7028342966696e616c4f70283129 9650:D3,100|3b650c7303ff55248b4c2408ff712453508b5c241889c89090e85a0000005a90ff128b4c24148b54240c8b5c2410be0100000089742414be01000000897424108954240c8b742408895c24085f8b1424893c245289cb56e9740700000000000060000000|@9675,2097151,@1217|26,1,@9651 47,0,0 56,0,0 88,1,@9659 9651:D3,40|3b650c7303ff55248b482c8b1424890c2489de89c389f052e91f0000009090900000000024000000|@9658,2097151,@1203|25,1,@9652 9652:D3,104|3b650c7303ff5524a801754c53ff7004ff74240c8b00909090e85e00000050ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,2097151,@1202|26,1,@9653 89,0,0 9653:D3,1484|3b650c7303ff552489df5089c38b470890e87a45feff83f801755a5750bb030000008b442408bafc317ab29090e8de9cf8ff89c3b8e07e80b2e84276f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc050000008b50108951108b580c89590c8b70088971088b70048971048b3089318b75008d76e83b75087303ff5520897500c746fc050000008b5910895e108b410c89460c8b51088956088b51048956048b11891657ff7608ff368b5c240c8b4708909090e89e44feffa801740f89c1b81c7f80b28b5d04909090ff13837804037407b801000000eb05b803000000837c240401746b837c240401746983f801742e8b45008d40f03b45087303ff5520894500c740fc030000008b4c2404894808894804c7000500000083c410c204008b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b4c2404894804c7000500000083c410eb0ae908000000e903000000c204008b0c248b11bbba9681b28d5c93fcffe3e9cc010000909090e9ee010000909090e944030000909090e96c030000909090e90b000000909090e98603000090909083f80174708b410483380175128b5004f6c201740583c2207120ff5538ebf68378080375128b5004f6c201740583c2107108ff5538ebf68b5004f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c0901833801eb05e98c00000075118b4004a801740583c020711fff5538ebf68378080375118b4004a801740583c0107108ff5538ebf68b4004a80175108b08f640ff107402f7d98d4c0901eb0289c1b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c090189c18b45008d40f03b45087303ff5520894500c740fc03000000895008894804c7000500000083c410c204008b410483380175128b5004f6c201740583c2207120ff5538ebf68378080375128b5004f6c201740583c2107108ff5538ebf68b5004f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c090189c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7000500000083c410c204008b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c7000300000083c410c20400f6410401740ab81c777bb28b5d04ff138b4904ff318b1c248b470890e8ce41feff83f801755a50bb030000008b442404bafc317ab2909090e83299f8ff89c3b8e07e80b2e89672f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc050000008b501083c4048951108b580c89590c8b70088971088b78048979048b3889398b7d008d7fe83b7d087303ff5520897d00c747fc050000008b71108977108b590c895f0c8b41088947088b51048957048b1189178b17833a0b740ab8f49a81b28b5d04ff138b4424148b00a801740bf642040174052b42047105ff5538ebf683c001a801740583e8027105ff5538ebf6bb09000000909090ff15c8c7520889c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000900000083c410c204008b45008d40f03b45087303ff5520894500c740fc030000008b51088950088b5904895804c7000100000083c410c204008b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c7000700000083c410c204008b4424148b00a801740583e8027105ff5538ebf6a801740bf641040174052b41047105ff5538ebf683c001bb09000000909090ff15c8c7520889c18b45008d40f03b45087303ff5520894500c740fc03000000894808c74004f8c27fb2c7000100000083c410c20400909000000000c8050000|@9657,2097151,@1201|18,1,@8978 30,0,1 39,0,@5052 46,1,@5053 53,0,@9153 58,1,@4940 89,0,@9154 99,0,@5398 105,0,@4608 238,1,@8978 249,0,@9155 268,0,0 275,0,1 334,0,2 371,0,0 384,0,2 412,0,$9653+422 554,0,1 567,0,31 660,0,1 673,0,31 722,0,2 811,0,1 824,0,31 868,0,0 877,0,2 919,0,1 936,0,@6704 958,1,@8978 969,0,1 978,0,@5052 986,1,@5053 993,0,@9153 998,1,@4940 1029,0,@9154 1039,0,@5398 1045,0,@4608 1172,0,@9654 1225,0,4 1234,0,I108 1269,0,4 1317,0,0 1359,0,3 1413,0,4 1422,0,I108 1458,0,@8796 1464,0,0 9654:O4|@4608,@5398,@9656,@9655 9655:O5|@9007,2834,0,2834,0 9656:S44|6172674173536f757263653a20636f6e7461696e657220656e747279206973206e6f74206f6e20737461636b 9657:S46|434f444547454e5f5441424c4528292e617267734173536f75726365732832296172674173536f75726365283129 9658:S32|434f444547454e5f5441424c4528292e617267734173536f7572636573283229 9659:D3,1812|3b650c7303ff5524833803757353ff70088b58048b44241490e8e64ffeffff30ff70048b4424048b54240890ff12508b5c24108b4424209090e86af8ffff5a90ff12837c24280175058b0c24eb1489c68b5c24288b04249090e8ca06000089c189f08b55008d52f43b55087303ff5520895500c742fc020000008b5c2424eb05e93c00000083c404895a045e83c40489328b7424148b7c24108b5c240c528b54240c894c242059894c241889742414897c2410895c240c895424085be93fffffff833805757089d98b5008f6c10174198b70048b7808ff7010ff700cb8bc7e7ab28b5d04909090ff1383fa0175048b09eb1cf6c201740583ea027105ff5538ebf68b49043b650c7303ff5524ebbdff7010ff700c6a016a016a0153ff7004ff7008ff742418ff7424208d4424145089cb8b442438eb05e9120100009090e89ad3feff8b1c248b442408e8867bfbff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54241089115af6c201740583c2027105ff5538ebf68b5c240483fa01742df6c301740c89c6b8947b81b28b5d04ff13f6c201740583ea027105ff5538ebf68b5b043b650c7303ff5524ebce83fb01741089c689c8909090e8b605000089c189f083f901740789cbe8fe0500005089c38b44242ce8c2f6ffff8b5424049090ff12837c24380175068b4c2414eb1389c68b5c24388b442414e82606000089c189f08b5424348b5c24308b74242c8b7c2428518b4c2428508b442404894424408954243c895c243889742434897c2430894c242c8b5c24085883c424e9b3fdffff833807756f8b4c240c8b510c53ff7004ff7008ff7010ff7124ff7204ff72088b1a8b442414909090e8067afeff833c240174288b44240c90e88222feff89c3b81c4b81b2e84a6df8ff6a0189c38b442424909090e85604feffeb05b801000000837c240401745e8b45008d40f43b4508730aeb05e955010000ff5520894500c740fc02000000c74004010000008b4c240c8908ba01000000a80175738b0883390175128b5904f6c301740583c3207127ff5538ebf68379080375198b5904f6c301740ceb05e97100000083c3107108ff5538ebf68b5904f6c30175108b33f643ff107402f7de8d743601eb0289de89f1bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c0901eb05e9120000000bd38b40043b650c7303ff5524e972ffffff89d0683ca481b289c38b44242490e88a56feffeb05b801000000508b5c24148b442424909090e80af5ffff8b54240c9090ff12837c24300175058b0c24eb1489c68b5c24308b04249090e8f204000089c189f08b55008d52f43b55087303ff5520895500c742fc020000008b5c242c83c410895a045e89328b7424148b7c24108b5c240c528b54240c894c242059894c241889742414897c2410895c240c895424085be9e5fbffff83780401745a8b48048b54240c8b720c53ff700851ff31ff7224ff7604ff76088b1e8b44240ce83a78feff833c240174288b44240490e8b620feff89c3b81c4b81b2e87e6bf8ff6a0189c38b442424909090e88a02feffeb19b801000000eb128b48088b5004b8010000005351526a016a0183c408588b542410909090ff128b4c241cba0100000050f6c10175608b4424188b580cff710452ff31ff7024ff7304ff73088b0b89cb8b44240c9090e8a650feff833c24017428508b442408e82e20feff89c3b8944b81b2e8f66af8ff6a0189c38b442430909090e80202feffeb0150837c240c01750a8b0424eb11e91f0000008b5c240c8b0424e8f203000089c283c410593b650c7303ff5524e977ffffff89d08b4c2408ba0100000050f6c101756b8b44241c8b790452ff318b1c248b480889c890e89a39feffa80174635750bb030000008b442408bafc317ab2909090e8fe90f8ff89c3b8f0ff7fb2e8626af8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb05e9b7000000c7014ce239b289c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44242c90e88657feffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c242457528b5c24088b4108909090e892fdfdffb801000000837c240801740c8b5c2408909090e81203000089c25983c4083b650c7303ff5524e9d4feffff89d0837c2414017436837c242801741389c68b5c24288b4424089090e836030000eb0889c18b44240889ce5650bbc8a581b28b4424249090e85a00feffeb0889c1b80100000051837c242c0175068b44240ceb0d8b5c242c8b44240ce86603000083f80175068b442404eb0d89c38b4424049090e8a603000083f80175058b0424eb0a89c38b0424e8ea0300008b4c242483c4085a83c4088911894104b801000000c2180090900000000010070000|@9674,2097151,@1216|26,1,@8997 58,1,@9651 90,1,@9660 221,0,@5417 318,1,@9152 330,1,@7849 361,0,0 404,0,@9598 454,1,@9661 470,1,@9662 482,1,@9651 518,1,@9663 630,1,@9051 646,1,@8788 653,0,@9476 658,1,@4940 674,1,@8783 681,0,0 726,0,0 737,0,0 830,0,1 843,0,31 886,0,@9664 898,1,@9012 905,0,0 922,1,@9651 958,1,@9666 1090,1,@9051 1106,1,@8788 1113,0,@9476 1118,1,@4940 1134,1,@8783 1141,0,0 1154,0,0 1183,0,0 1226,1,@9004 1242,1,@8788 1249,0,@9480 1254,1,@4940 1270,1,@8783 1302,1,@9667 1332,0,0 1362,1,@8978 1373,0,1 1382,0,@5052 1390,1,@5053 1397,0,@9019 1402,1,@4940 1433,0,@9020 1443,0,@5398 1456,0,@4608 1518,1,@9015 1590,1,@8774 1595,0,0 1614,1,@9668 1666,1,@9669 1683,0,@9670 1694,1,@8783 1703,0,0 1730,1,@9671 1754,1,@9672 1774,1,@9673 1795,0,0 9660:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1204| 9661:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1205| 9662:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1206| 9663:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1207| 9664:O1|@9665 9665:D3,16|b803000000c39090000000000c000000|@9160,1,@1208|1,0,1 9666:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1209| 9667:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1210| 9668:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1211| 9669:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1212| 9670:S14|706572666f726d416374696f6e73 9671:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1213| 9672:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1214| 9673:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1215| 9674:S45|434f444547454e5f5441424c4528292e706572666f726d416374696f6e73283429756e74696c446f6e65283429 9675:S33|434f444547454e5f5441424c4528292e706572666f726d416374696f6e73283429 9676:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1218| 9677:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1219| 9678:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1220| 9679:S28|434f444547454e5f5441424c4528292e6d6f7665546f566563283429 9680:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1222| 9681:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1223| 9682:S54|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d73657456616c756573283329 9683:D3,780|3b650c7303ff55248b4c2418a801740783f8017d08eb1af640ff107514a801740bf6010174063b017c13eb05ff5538ebf589c2b814a17db28b5d04ff136a016a015350ff71048d54240c52bb11000000ff1548c752088b44240c59d1e80fb604018d4400018b4c240cba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123c283f80174678b0424a801750af6442424017503ff55383b442424746e8b4c24208b5c241c8b41089090e88630feffa801745d50bb030000008b442420bafc317ab2e8ee87f8ff89c3b8f0ff7fb2e85261f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb05e9b9010000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb0ae9ac000000e90900000089c88b5d049090ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24208b4424249090e86a4efeffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2420528b5c24208b4108e87af4fdffb8010000008b4c24188b0983f901740889cb90e86a0100008b4c24188901b801000000eb05b801000000ff7424208b5c24208b44240490e8ae73ffff8b4c24188b0983f90175058b4804eb108b3089cb8b4004e88201000089c1eb028b308b4424188908ff742404ff74242489f38b44241c90e8a2c6ffff8b4c24188b0983f901740989cb9090e8a60100008b4c241889018b0424a801750af6442424017503ff55383b442424750bb80100000083c410c21800a801740583c0027105ff5538ebf68b542404f6c201740583c2027105ff5538ebf68b5c24288b7424248b7c24208b4c241c528b54241c508b44241c895c24308974242c897c2428894c2424895424208944241c8b5c24045883c414e94efdffff8b0424a801740583c0027105ff5538ebf68b4c24288b5424248b5c24208b74241c8b7c2418508b442418894c242c89542428895c242489742420897c241c894424188b5c24085883c410e9fffcffff9090900000000008030000|@9687,2097151,@1228|52,0,@8049 76,0,8 82,0,I104 106,0,1 119,0,31 178,1,@8978 188,0,1 197,0,@5052 202,1,@5053 209,0,@9019 214,1,@4940 252,0,@9020 262,0,@5398 268,0,@4608 342,1,@9015 410,1,@8774 415,0,0 434,1,@9684 445,0,0 452,0,0 470,1,@9435 498,1,@9685 530,1,@9586 550,1,@9686 584,0,0 9684:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1225| 9685:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1226| 9686:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1227| 9687:S49|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d636f7079283229 9688:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1229| 9689:O4|@4608,@5398,@9691,@9690 9690:O5|@9130,898,0,898,0 9691:S17|5a65726f2073697a656420766563746f72 9692:D3,308|8d7c24ac3b7d0c7303ff5528a801757153ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb030000008b008b54244c909090ff1283f801750e89c1b8b4af81b28b5d049090ff138b188b442440eb05e99e000000909090e8e60000008b4c243c8b0983f90175058b4804eb108b3089cb8b4004e8be02000089c1eb028b308b44243c890856ff742448ff74244850ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b44244090e802ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c23c00b801000000c23c000000000030010000|@6329,2097151,@1232|87,0,1 110,0,@9693 138,1,@9695 166,1,@9697 293,0,0 9693:O4|@4608,@5398,@9151,@9694 9694:O5|@9130,1103,0,1103,0 9695:D3,432|3b650c7303ff552489df5089fb8b480889c8909090e8aa2afeff83f80175565750bb0300000089f8bafc317ab2e81282f8ff89c3b8e07e80b2e8765bf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b0883390975738b5104833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c30175108b33f643ff107402f7de8d743601eb0289de89f1b80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c090181e00100fe00eb05e97b00000083f801745183f801744c576a016a016a01689f0100006a018d4424085089fb8b44241c9090e892bffeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240883c4048948045983c408890883c404c38b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000893883c404c35757bb0100fe008b442408909090e89645feff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c404c3909000000000ac010000|@9696,2097151,@1230|22,1,@8978 34,0,1 41,0,@5052 46,1,@5053 53,0,@9153 58,1,@4940 89,0,@9154 99,0,@5398 105,0,@4608 203,0,1 216,0,31 262,0,207 282,1,@9152 357,0,0 370,0,8323072 382,1,@9014 9696:S37|434f444547454e5f5441424c4528292e656e737572654e6f416c6c6f636174696f6e283229 9697:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1231| 9698:D3,296|3b650c7303ff5524a801756b89dfff7004ff308b1c248b4708e85a28feff83f80175595750bb030000008b442408bafc317ab29090e8be7ff8ff89c3b8e07e80b2e82259f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b2eb0ae99e000000e90800000089c88b5d0490ff138b0883390175268b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70201000000eb3083390775268b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70203000000eb05ba60877ab2575289fb8b44240c909090e80affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3b801000000c30000000024010000|@6329,2097151,@1233|26,1,@8978 38,0,1 47,0,@5052 54,1,@5053 61,0,@9153 66,1,@4940 97,0,@9154 107,0,@5398 113,0,@4608 176,0,0 219,0,1 226,0,@5515 283,0,0 9699:D3,212|3b650c7303ff5524a801757089d9f6c101740583c1027105ff5538ebf66a016a0153ff308d54240852ff742428ff742428ff742428ff742428ff74242889cb8b4004909090e8b6ffffffff742404ff7424288b5c24088b442410909090e856beffff837c240c0174098b5c240ce8760000008b4c242883c4085aeb05e91000000083c4048911894104b801000000c218008b4424088b4c24048b5424148b5c24188b7424108b7c240c894c241889542414895c24108974240c897c2408bb010000005983c40451e97400000000000000d0000000|@9706,2097151,@1239|94,1,@9586 110,1,@9700 138,0,0 190,0,0 200,1,@9701 9700:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1234| 9701:D3,880|3b650c7303ff5524f64424140175088b4c24148b11eb05ba9f010000535089d38b44241890e8e636feff8b4d008d49d83b4d087303ff5520894d00c741fc03000000c74108010000008b10895104c701090000008b5c24188b731c8b368d7910c747fc05000000c7471001000000c7470c01000000c7470801000000c7470403000000890f56ff700452ff7324ff731c578b430889f3909090e83aeafdff8b442410a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44242c90e83eedfdff837c24200174718b45008d40dc3b45087303ff5520894500c740fc020000008b4c241c894804c700070000008b5424288b5a1c8b1b8d700cc746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890653ff7224ff721c568b4208909090e89ee9fdff8b442408a801eb05e946010000740583c0027105ff5538ebf6598901833c240174126a01bbf01081b28b4424349090e89aecfdffff742418ff7424348b5c240c8b44241c909090e8f2bbffff8b4c241883c408f6c101740583c1027105ff5538ebf68b54241483ca215051bb0100000289d0ff15c8c7520889c38b042490ff1588c852088b4d008d49cc3b4d087303ff5520894d00c741fc04000000c7410cf9ffffffc7410834c47fb28b54240c895104c701010000008d5914c743fc03000000894308894b04c7036f0000008d4310c740fc0300000089500859894804c700010000008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948048918837c240c0174098b5c240ce82601000083f80175058b0424eb0a89c38b0424e86a0100008b4c242883c4048b54240c8911894104b80100000083c418c21400bb010000028b4424149090ff15c8c7520889c38b442410ff1588c852088b4d008d49cc3b4d087303ff5520894d00c741fc04000000c7410cf9ffffffc7410834c47fb28b542404895104c701010000008d5914c743fc03000000894308894b04c7036f0000008d4310c740fc030000008950088b4c2410894804c700010000008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948048918837c240801740a8b5c240890e8e60000008b4c24248b54240c8911894104b80100000083c418c214009090000000006c030000|@9705,2097151,@1238|24,0,207 38,1,@8997 69,0,0 80,0,4 106,0,0 113,0,0 120,0,0 127,0,1 154,1,@8774 188,0,@9108 198,1,@8783 242,0,3 268,0,0 275,0,0 282,0,0 289,0,1 310,1,@8774 351,0,@9417 362,1,@8783 386,1,@9586 422,0,16777216 430,0,I108 442,0,I114 473,0,-4 480,0,@8817 493,0,0 515,0,55 538,0,0 569,0,0 602,1,@9702 622,1,@9703 643,0,0 654,0,16777216 666,0,I108 678,0,I114 709,0,-4 716,0,@8817 729,0,0 751,0,55 777,0,0 808,0,0 842,1,@9704 860,0,0 9702:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1235| 9703:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1236| 9704:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1237| 9705:S39|47454e45524154455f434f444528292e636f646567656e28392963616c6c676574766563283429 9706:S60|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6f6164536d616c6c566563746f72283229 9707:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1240| 9708:O2|@9048,0 9709:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1241| 9710:D3,340|833805750c89c1b8ccbb81b28b5d04ff13833801756c8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70114bc81b28b5424088951048b74240489710889590c8061ffbf8b78048b571c8b12f6c201755c8b128b12833a01750ab8c4bc81b28b5d04ff13f6c301750bb808a87cb28b5d0490ff138b4424088b5204eb05e969000000895458fe8b36f7c601000000740583ee027105ff5538ebf68b4c240489318b0983f90175308060ffbfeb2a8b40048b503c8b128b7d008d7ff43b7d087303ff5520897d00c747fc02000000895704890f8b403c8938f6c301740583c3027105ff5538ebf689d8c20800f6c30175108b4804b808a87cb28b5d04909090ff138b4c24088b4004894459fe8b4424048b00a801740583e8027105ff5538ebf68b54240489028b1283fa0175048061ffbff6c301740583c3027105ff5538ebf689d8c208009090900000000050010000|@9720,63,@1243|8,0,@9711 48,0,@9714 96,0,@9716 111,0,@7422 249,0,@7422 9711:O4|@4608,@5398,@9713,@9712 9712:O5|@9130,944,0,944,0 9713:S17|6164644974656d3a204e6f74436f6e7374 9714:D3,92|f6420c01750f8b4804b808a87cb28b5d049090ff138b4a048b5a0c8b4004894459fe8b42088b00a801740583e8027105ff5538ebf68b720889068b3683fe01750a8061ffbfb801000000c3b801000000c39090900000000058000000|@9715,31,@1242|10,0,@7422 70,0,0 76,0,0 9715:S55|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d7365744974656d283129283129 9716:O4|@4608,@5398,@9718,@9717 9717:O5|@9719,109,0,109,0 9718:S28|63736567416464723a206e6f74206120636f6465207365676d656e74 9719:S50|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f434f44455f41525241592e4d4c 9720:S52|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6164644974656d283229 9721:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1244| 9722:O4|@4608,@5398,@9724,@9723 9723:O5|@9130,1069,0,1069,0 9724:S39|67656e6364653a20526573756c742077616e74656420627574206e6f6e6520737570706c696564 9725:S35|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529 9726:O3|@9728,@9145,@9727 9727:O2|@9742,@9145 9728:D3,824|8d7c24ac3b7d0c7303ff552883380375596a036a016a01ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448bb030000008b40048b52049090ff12b801000000c23c0083380575728b4804f6c101756f8b198b33f7c601000000740783fe017d08eb27f646ff1075218b7c243c8b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c108b7804b8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b7c243cc74477feffffffffeb0ae9d4000000e9120000008b590489d93b650c7303ff5524e975ffffffb9010000008b4c243c8b5c24388b7424348b7c2430ff70048b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430508b442430895c2468897424648b520889542460897c245c8b542424895424588b542420895424548b54241c895424508b5424188954244c8b542414895424488b542410895424448b54240c895424408b5424088954243c8b542404895424385a83c4248954240c8944240889cb58e99201000083fb017507b901000000eb258b0b8b7004f7c6010000007508f601017503ff55383b317407b901000000eb058b590489d98b5808833b1575708b75008d76e43b75087303ff5520897500c746fc06000000c70680c481b28b7c2434897e048b7804897e088b780c897e0c8b44243c8946108b7c2438897e148066ffbf515057ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440eb05e922000000ff742440ff742440ff7424408b4b0489f389c88b52089090ff12b801000000c23c00ff700cff7004516a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb030000008b40088b5204ff1283f801750e89c1b874c581b28b5d049090ff13ff742404ff742448ff7424488b5c240c8b009090e822d9feff8b4c243c83c4088b0983f901740a89cb909090e8f60300008b4c24348901b801000000c23c000000000034030000|@9741,2097151,@1252|84,0,1 99,0,0 181,0,@6397 219,0,-1 254,0,0 438,1,@9729 448,0,0 480,0,0 525,0,@9735 643,0,0 722,0,1 742,0,@9738 774,1,@9206 798,1,@9740 809,0,0 9729:D3,272|3b650c7303ff5524a80175718b088b55008d52ac3b55087303ff5520895500c742fc14000000c702f8c281b28b7004897204895a088b7c243c897a0c8b4424388942108b7424348972148b7c2430897a188b44242c89421c8b7424288972208b7c2424897a248b4424208942288b74241c89722c8b7c2418897a30eb05e97c0000008b4424148942348b7424108972388b7c240c897a3c8b4424088942408b7424048972448b39897a488b7908897a4c8062ffbf6a0153ff742444ff742444ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440505689d38b41048b5424749090ff12b801000000c23c00b801000000c23c009090000000000c010000|@9734,1048575,@1248|40,0,@9730 247,0,0 255,0,0 9730:D3,132|3b650c7303ff552452ff724cff7208ff720c8b5a48e8a2d7feff8b0c248b51108b1283fa01740789d3e86a0000008b0c248b511089028b410c83c4048b1c2489042452ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff7140ff714489de8b59088b4104bae8c381b256ff2290900000000080000000|@9733,2097151,@1247|22,1,@9206 42,1,@9731 115,0,@9732 9731:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1246| 9732:O1|@9729 9733:S69|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e6728322967656e4d757475616c446563732831296e6578744d757475616c283129 9734:S56|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e6728322967656e4d757475616c44656373283129 9735:D3,72|3b650c7303ff552452ff720cff7210ff72148b5a08e81ad6feff8b0c248b51048b1283fa01740789d3e82e0000008b0c248b490483c4048901b801000000c3900000000044000000|@9737,2097151,@1250|22,1,@9206 42,1,@9736 58,0,0 9736:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1249| 9737:S53|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e672832296e6578744d757475616c283129 9738:O4|@4608,@5398,@9151,@9739 9739:O5|@9130,2426,0,2426,0 9740:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1251| 9741:S40|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e67283229 9742:D3,3792|8dbc246cffffff3b7d0c7303ff552853ff7010ff7014ff7020ff700cff30ff700452ff7008ff701cff7018ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff7424688b5a048b442444909090e86e0e0000508b5c24689090e89e13000089c1ba01000000f6c10175258b19833b05750ff6c201740583c2027105ff5538ebf68b590489d93b650c7303ff5524ebd689d183f9017572b90300000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f575257ff7424448b5c2424b801000000e8eacdfdff6a016a016a016a018b5d008d5bf03b5d087303ff5520895d00c743fc03000000eb05e944020000c70398db81b28b4c2410894b048943088063ffbf506a01ff74243cff742444ff74244cff742454ff74242cff74246c8d4c2420518b4424548b542470909090ff12ff742408ff742410ff7424188b5c24108b44240c909090e8c21700008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701070000008b84248400000083c41c8b501c8b128d590cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890b52ff7024ff701c5389d38b480889c8e85ed7fdff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44247490e862dafdff8b44240883c404a801756e8b4c246c8b7804ff308b1c248b410890e83612feffa801745a5750bb030000008b442408bafc317ab2909090e89a69f8ff89c3b8f0ff7fb2e8fe42f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb0ae9b9000000e90800000089c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44247890e81e30feffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c247057528b5c24088b4108909090e82ad6fdffb8010000008b4c24708b0983f901740889cb90e8feaa01008b4c247089015883c4043b650c7303ff5524e9d0feffffb8010000008b04248b542430909090ff125883c430c2400089c689cfbb0300000089f090e816ab010083f8017507b868c05208eb71b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb14f641ff10750e89c2b850337db28b5d049090ff1389c2b80100000089fb8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9eb05e940000000894ffcc647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f889dfb90300000089c2b80100000089fb8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f5652535757ff74244c8b5c242cb8030000009090e856cafdff6a016a016a016a018b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703b87583b28b4c241c894b048b5424188953088063ffbf50ff742428ff742444ff74244cff742454ff74245cff742428ff7424748d742420568b44245c8b542478ff12ff742408ff742410ff7424188b5c24108b44240c909090e8321400008b4c242483c418f6c10175198339ff7507b903000000eb128b49043b650c7303ff5524ebe2b901000000837c24140174608b1424f6c201740583c2027105ff5538ebf683f9017507b901000000eb05b9810000006a016a0150ffb42488000000ffb424840000008d5c240c53ff742470ff74247089cb89d0909090e8e2e8ffff8b44247c8b0083f801750b8b442408eb13e96b05000089c38b442408909090e866ad01008b4c247c89018b45008d40dc3b45087303ff5520894500c740fc020000005a895004c700070000008b54247c8b5a1c8b1b8d700cc746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890653ff7224ff721c568b4208909090e82ad3fdff8b442408a801740583c0027105ff5538ebf6598901833c240174156a01bbf01081b28b8424880000009090e82ad6fdff6a01ffb424880000008b5c240c8b4424109090e882a5ffff8b8c248000000083c4088b0983f901740789cbe8f2ac01008b4c247889016a01ffb42480000000ff742414ff74240c518b5c24248b442428909090e822ad01008b4424788b0083f8017507b800ba81b2eb0e89c3b800ba81b29090e8aeb001008b4c247889018b44247c8b1c248b500889d090e88e0dfeffa801745750bb030000008b442404bafc317ab2e8f664f8ff89c3b8f0ff7fb2e85a3ef8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1feb06f641ff1074176a038b5c24048b842480000000909090e8822bfeffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c247c528b5c24048b4108e892d1fdffb8010000008b4c24788b0983f901740889cb90e8feaf01008b4c247889018b04248b54244090ff128b4424246a01ff7004ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ff742450ff7424488b5c246c8b44246090e8beaf01008b44247c8b1c248b480889c8909090e8f20bfeffa801745750bb030000008b442404bafc317ab2e85a63f8ff89c3b8f0ff7fb2e8be3cf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1feb06f641ff1074176a038b5c24048b842480000000909090e8e629feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c247c528b5c24048b4108e8f6cffdffb8010000008b4c24788b0983f901740889cb90e88ab101008b4c24788901b8848183b283f801750bb8388783b28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b14248910ff74247c688c8783b26a016a0150ffb424900000008d442408508d5c2414b8c48183b290e8dac3ffff8b84248800000083c4048b0083f80175058b0424eb0a89c38b0424e8eab701008b8c248400000083c40c89018b44247c8b1c248b500889d0909090e85a0afeffa801745750bb030000008b442404bafc317ab2e8c261f8ff89c3b8f0ff7fb2e8263bf8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff1074176a038b5c24048b842480000000909090e84e28feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c247c528b5c24048b4108e85ecefdffb8010000008b4c24788b0983f901740889cb90e832b701008b4c247889015883c440c2400050ff742478ff7424788b5c24148b44241890e866b701008b4d008d49dc3b4d087303ff5520894d00c741fc020000005a895104c701070000008b5424748b5a1c8b1b8d710cc746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890e5053ff7224ff721c568b4208e8becdfdff8b442408a801740583c0027105ff5538ebf6598901833c240174156a01bbf01081b28b8424840000009090e8bed0fdff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240883c4048948045983c404890889c38b44247490e822b901008b4c24708b0983f90175058b4804eb108b3089cb8b4004e896c0010089c1eb028b308b44247089088b4c247489f789fb8b4108e84608feffa80174575750bb0300000089f8bafc317ab290e8ae5ff8ff89c3b8f0ff7fb2e81239f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b44247c909090e83e26feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c2474575289fb8b410890e84eccfdffb8010000008b4c24748b0983f901740889cb90e8e6bf01008b4c247489018b04248b54243c90ff128b4424206a01ff7004ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ffb42484000000ff74244cff7424488b5c24688b44245c90e8a6bf01008b4424788b1c248b480889c8909090e8ae06feffa801745750bb030000008b442404bafc317ab2e8165ef8ff89c3b8f0ff7fb2e87a37f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff1074136a038b5c24048b44247c9090e8a624feffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2478528b5c24048b4108e8b6cafdffb8010000008b4c24748b0983f901740889cb90e826c401008b4c247489015883c43cc240009000000000cc0e0000|@10297,2097151,@1361|114,1,@9743 126,1,@9748 133,0,0 187,0,1 194,0,0 257,0,0 262,1,@8758 307,0,@9749 394,1,@9758 427,0,3 459,0,0 466,0,0 473,0,0 480,0,1 502,1,@8774 536,0,@9417 546,1,@8783 578,1,@8978 589,0,1 598,0,@5052 606,1,@5053 613,0,@9019 618,1,@4940 649,0,@9020 659,0,@5398 665,0,@4608 738,1,@9015 810,1,@8774 815,0,0 834,1,@10217 862,0,0 890,0,1 898,1,@10218 908,0,I49 915,0,0 961,0,16777215 978,0,@7886 992,0,0 1044,0,0 1097,0,1 1104,0,0 1171,0,1 1178,1,@8758 1216,0,@10220 1306,1,@9758 1328,0,1 1348,0,0 1383,0,0 1390,0,64 1434,1,@9701 1470,1,@10225 1510,0,3 1536,0,0 1543,0,0 1550,0,0 1557,0,1 1578,1,@8774 1612,0,@9417 1626,1,@8783 1650,1,@9586 1674,1,@10226 1714,1,@10227 1730,0,@9708 1739,0,@9708 1746,1,@10231 1770,1,@8978 1780,0,1 1789,0,@5052 1794,1,@5053 1801,0,@9019 1806,1,@4940 1837,0,@9020 1847,0,@5398 1853,0,@4608 1918,1,@9015 1986,1,@8774 1991,0,0 2010,1,@10232 2162,1,@10233 2182,1,@8978 2192,0,1 2201,0,@5052 2206,1,@5053 2213,0,@9019 2218,1,@4940 2249,0,@9020 2259,0,@5398 2265,0,@4608 2330,1,@9015 2398,1,@8774 2403,0,0 2422,1,@10236 2433,0,@10237 2443,0,@10264 2480,0,0 2494,0,@10267 2520,0,@10241 2526,1,@9650 2558,1,@10268 2590,1,@8978 2600,0,1 2609,0,@5052 2614,1,@5053 2621,0,@9019 2626,1,@4940 2657,0,@9020 2667,0,@5398 2673,0,@4608 2738,1,@9015 2806,1,@8774 2811,0,0 2830,1,@10269 2866,1,@10270 2900,0,3 2926,0,0 2933,0,0 2940,0,0 2947,0,1 2966,1,@8774 3000,0,@9417 3014,1,@8783 3066,1,@10275 3094,1,@10286 3122,1,@8978 3133,0,1 3140,0,@5052 3146,1,@5053 3153,0,@9019 3158,1,@4940 3189,0,@9020 3199,0,@5398 3205,0,@4608 3266,1,@9015 3334,1,@8774 3339,0,0 3358,1,@10287 3510,1,@10288 3530,1,@8978 3540,0,1 3549,0,@5052 3554,1,@5053 3561,0,@9019 3566,1,@4940 3597,0,@9020 3607,0,@5398 3613,0,@4608 3674,1,@9015 3742,1,@8774 3747,0,0 3766,1,@10296 9743:D3,968|8d7c24ac3b7d0c7303ff5528a80175678b0883390d75658b5104833a01756253ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb0300000089c88b54244cff1283f801eb0fe93c030000e91f020000e946000000750d89c1b8b4af81b28b5d0490ff138b188b4424409090e832daffff8b4c243c8b0983f90175058b4804eb108b3089cb8b4004e81e03000089c1eb028b308b44243c8908eb6c833a05756c8b7204f7c601000000740783fe017d08eb27f646ff1075218b7c243c8b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0f8b7804b8f0ea7ab28b5d049090ff13f7c601000000740583c6027105ff5538ebf68b7c243c8b7477fe83feffeb0ae909020000e9b40000007507beffffffffeb6e53ff70046a016a016a0157ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb0300000089c88b54244c909090ff1283f801750e89c1b8b4af81b28b5d049090ff138b188b442440eb05e932000000909090e80ed9ffff8b4c243c8b0983f90175058b4804eb108b3089cb8b4004e85202000089c1eb028b308b44243c8908eb6853ff7004eb6753ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb0300000089c88b54244c90ff1283f801751a89c1b8b4af81b2eb0ae9e9000000e9e40000008b5d049090ff138b188b4424409090e85ed8ffff8b4c243c8b0983f90175058b4804eb108b3089cb8b4004e8fa01000089c1eb028b308b44243c8908eb7153ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb0300000089c88b54244c909090ff1283f801750e89c1b8b4af81b28b5d049090ff138b188b442440eb05e930000000909090e8b6d7ffff8b4c243c8b0983f90175058b4804eb108b3089cb8b4004e8aa01000089c1eb028b308b44243c890856ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b4424409090e86efcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c23c00b801000000c23c0000000000c4030000|@6329,2097151,@1257|102,0,1 139,0,@9693 158,1,@9695 186,1,@9744 270,0,@6373 325,0,-1 399,0,1 422,0,@9693 450,1,@9695 478,1,@9745 573,0,1 594,0,@9693 626,1,@9695 654,1,@9746 743,0,1 766,0,@9693 794,1,@9695 822,1,@9747 953,0,0 9744:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1253| 9745:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1254| 9746:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1255| 9747:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1256| 9748:D3,316|3b650c7303ff5524a80175678338ff7507b960877ab2eb6089dfff7004ff308b1c248b4708e83200feff83f80175665750bb030000008b442408bafc317ab29090e89657f8ff89c3b8e07e80b2e8fa30f8ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2eb0ae9b6000000e97c000000894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b0883390175268b41048b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70101000000eb3083390775268b41048b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb05b960877ab283c40489fbeb03ff70046a0153518b44240c90e8f6feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3b801000000c30000000038010000|@6329,2097151,@1258|18,0,@5515 38,1,@8978 50,0,1 59,0,@5052 66,1,@5053 73,0,@9153 78,1,@4940 109,0,@9154 131,0,@5398 137,0,@4608 188,0,0 231,0,1 238,0,@5515 303,0,0 9749:D3,56|3b650c7303ff5524ff742408ff7204ff7208909090e8320000008b4c24048b1089118b5804895904b801000000c208000000000034000000|@8992,2097151,@1260|22,1,@9750 41,0,0 9750:D3,700|3b650c7303ff5524833803756b8b4c24088b4004f6c101740c89c2b8bc7e7ab28b5d04ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebcb833905750bb8b4de81b28b5d0490ff1383390175728b45008d40dc3b45087303ff5520894500c740fc02000000eb05e9690100008b4904894804c700010000008b4c240c8b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b41089090e8cec2fdffeb05e9550000008b442408a801740583c0027105ff5538ebf6598901833c240174126a01bb9ca27fb28b4424189090e8cac5fdff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c404598908c20c008b45008d40dc3b45087303ff5520894500c740fc020000008b4904894804c700070000008b4c240c8b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b410890e80ac2fdff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44241890e80ec5fdff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c404598908c20c00833807740ab8fcde81b28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc020000008b4c2404894804c700010000008b54240c8b5a1c8b1b8d700cc746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890653ff7224ff721c568b4208909090e83ec1fdff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb9ca27fb28b44241890e842c4fdff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c404598908c20c00909000000000b8020000|@9757,2097151,@1259|28,0,@5417 79,0,@9751 133,0,0 159,0,0 166,0,0 173,0,0 180,0,1 202,1,@8774 243,0,@8782 254,1,@8783 285,0,0 330,0,3 356,0,0 363,0,0 370,0,0 377,0,1 398,1,@8774 432,0,@9417 442,1,@8783 473,0,0 492,0,@9754 534,0,0 560,0,0 567,0,0 574,0,0 581,0,1 602,1,@8774 636,0,@8782 646,1,@8783 677,0,0 9751:O4|@4608,@5398,@9753,@9752 9752:O5|@9130,1202,0,1202,0 9753:S18|70726576696f75733a204e6f74436f6e7374 9754:O4|@4608,@5398,@9756,@9755 9755:O5|@9130,1204,0,1204,0 9756:S15|70726576696f75733a206c6f63616c 9757:S47|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332970726576696f7573283329 9758:D3,416|3b650c7303ff55248b4c240cf6c101740783f9297c6ceb06f641ff107569505389cbb8f9ffffff90ff15c8c7520850bb51000000b84cc37fb2e8760100008b4d008d49e83b4d087303ff5520894d00c741fc05000000c741104cc37fb25a89510cc7410834c47fb2c74104c88d80b2c7013d0000008b55008d52f43b5508730feb0ae92f000000e92a000000ff5520895500c742fc02000000c7420401000000890a83f801743289c389d09090e84204000089c2eb23837c24040174155053bb49000000b8f8c27fb2e8e600000089c2eb07ba01000000505358b901000000a801752e8b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b08890b89d98b40043b650c7303ff5524ebce89c883f801740c89c389d090e82a04000089c2528b5c240489d0ba1ce581b290e87a0400008b4424048378440174348b0c246a016a016a018d44240450bb0100000089c8e88a050000837c240403750e5983c4043b650c7303ff5524ebd48b0424eb078b04246a016a018b4c241883c40c5a8954240c89cbbaa01a82b25e83c40856e9a0390000000000009c010000|@10216,2097151,@1313|35,0,-4 42,0,I108 48,0,40 53,0,@8802 58,1,@9759 89,0,@8802 100,0,@8817 107,0,@9172 113,0,30 156,0,0 174,1,@9764 192,0,36 197,0,@8796 202,1,@9759 211,0,0 219,0,0 286,1,@9765 300,0,@9766 306,1,@9767 335,0,0 342,1,@9770 394,0,@9814 404,1,@9815 9759:D3,484|3b650c7303ff55248b4d008d49e03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000538b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000508b45008d40983b45087303ff5520894500c740fc0500000089501089480c8970088958048938c707030000008d4818c741fc04000000c7410c05000000894108c7410411000000c701170000008d5114c742fc02000000c7420401000000890a8d4a0cc741fc0200000089410489118d410cc740fc020000008b51048950048b1989188d700cc746fc050000005f897e10c7460c19000000c7460814c37fb2c7460405000000c7060d0000008b7d008d7fe83b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc020000005b895e04c706150000008b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c743040100000089338d730cc746fc020000008b4804894e04c706390000008d560cc742fc02000000c7420401000000893283fa0174108b305389d35890e84600000089c3eb028b3083fb01740b89f09090e88a00000089c683fe01750389f8c389f389f8e9cf00000090909000000000e0010000|@9763,63,@1264|34,0,0 50,0,67108860 66,0,0 82,0,0 113,0,0 158,0,1 175,0,2 185,0,8 191,0,11 208,0,0 266,0,12 273,0,@8798 280,0,2 286,0,6 317,0,0 339,0,10 370,0,0 394,0,28 411,0,0 430,1,@9760 450,1,@9761 469,1,@9762 9760:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1261| 9761:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1262| 9762:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1263| 9763:S54|5838364c4f574c4556454c28292e636f7079436f64652835297072656c756465436f64652d74657374526567416e6454726170283229 9764:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1265| 9765:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1266| 9766:O2|@9767,@8784 9767:D3,232|3b650c7303ff5524837b5001746889c1be03000000ff732852f6c101752e8b11833a39751a8b7a048b57088932f7c601000000740583c6027105ff5538ebf68b49043b650c7303ff5524ebcd89f1817b1048c05208742ef643100175378b7310bf48c05208b909000000d1e93bc9f3a68d7c3f01eb05e95d0000008d7436018d4c0901750f50b87f0000008b54240890ff12eb0a508b43108b542408ff12b824e681b28b54240890ff1258a801751e8b0c24ff70048b5c24088b008b51049090ff12583b650c7303ff5524ebdeb81500000083c4045aff22b801000000c3909000000000e4000000|@9769,1048575,@1267|17,0,1 81,0,I48 97,0,I48 102,0,4 135,0,63 159,0,@9768 206,0,10 217,0,0 9768:S2|3a0a 9769:S36|5838364f5554505554434f444528292e7072696e744c6f774c6576656c436f6465283229 9770:D3,3844|3b650c7303ff5524a801750f8b088b11be7ee681b28d7496fcffe6e9bb0e00009090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e90c020000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e924050000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e9c1070000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e94d080000909090e97b000000909090e9c7090000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9150a00009090908b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e9adfdfffff6400401754e8b50048b32833e0975508b79083b7e08744d833f01751c8b7e08833f0175118b7908538b5e088b7f043b7b047449eb4b53eb48833f03753b8b7e08833f03752e8b7908538b5e08ff308b4704eb05e9be0200003b4304754deb0ae9b2020000e91b0000008b47083b4308754deb1353ff30eb4b5351eb4cff30eb06ff30eb495351837904017406837904097562837e04017406837e0409755b6a016a01837904097566eb05e915020000837e040975498b410ca8017424eb14e901020000e9fc010000e9f7010000e9f2010000f6460c0174088d40ff03460c7105ff5538ebf389e3c7030900000089e3894304eb60e9cb010000e9c6010000837e04017411b874f581b28b5d04eb05e970000000ff138b410ca801740df6460c0174073b460c7c32eb05ff5538ebf4a801740bf6460c0174052b460c7105ff5538ebf683c00189e3c7030900000089e3894304eb5be9fa0000008b760cf7c6010000007408a80174042bf07105ff5538ebf783c60189e3c7030100000089e3897304eb5c83790401740cb874f581b28b5d049090ff13837e0409756e8b410ca8017412f6460c01740c3b460c7c37eb0ae99f000000ff5538ebefa801740bf6460c0174052b460c7105ff5538ebf683c00189e3c7030100000089e3894304eb6ce96f0000008b760cf7c6010000007408a80174042bf07105ff5538ebf783c60189e3c70309000000eb05e90700000089e3897304eb3e837e0401740ab874f581b28b5d04ff138b410ca801740ef6460c0174088d40ff03460c7105ff5538ebf389e3c7030100000089e3eb05e9030000008943048b45008d40ec3b45087303ff5520894500c740fc040000008b5c240489580c8b49088948085983c404894804c700090000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b520489510489018b44240cba03000000895424108944240c8b5c240489c883c408e9e8faffff8b45008d40e83b45087303ff5520894500c740fc020000008b4a048948048b1a89188d700cc746fc020000008b7c2404897e048b3c24893e8b7c24108b5c240c897c2410895c240c89f383c408e996faffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e95dfafffff6400401755c8b50048b32833e7d7557f642040175568b7a048b37833e3975628b50048b328b7a04538b1fff308b43048b5908ff76048b73048b36f7c601000000750c8b1e3b650c7303ff5524ebe78b5b0c3b580c75608b442404833817755ceb0fe983020000e97e020000e9790200008b40088b108b12f6c201740e83fa01eb05e9630200007f15eb06f642ff10740d8b10b8f8f581b28b5d0490ff138b108b12f6c201740583ea027105ff5538ebf68b008910eb46e9c801000083387d753c8b40048b108b12f6c201740783fa017f14eb06f642ff10740c8b10b838f681b28b5d04ff138b108b12f6c201740583ea027105ff5538ebf68b0089108b45008d40f43b45087303ff5520894500c740fc020000008b57048950048b1f89188b7104bb2eed81b28d5cb3fcffe39090e962000000909090e961000000909090e94b000000909090e958000000909090e957000000909090e956000000909090e955000000909090e954000000909090e953000000909090e952000000909090e951000000909090e96e000000909090bb13000000eb46bb0f000000eb44bb11000000eb42bb0d000000eb40bb0b000000eb3ebb09000000eb3cbb07000000eb3fbb01000000eb38bb03000000eb31bb05000000eb2abb17000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000bb1500000083790c037507b905000000eb1283790c057407b901000000eb05b9030000008b75008d76ec3b75087303ff5520897500c746fc04000000894e0c8b0c24894e08895e04c706170000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b5c240889590489318b5c2410be0300000089742414895c241089cb83c40ce9d9f7ffff8b45008d40dc3b45087303ff5520894500c740fc020000008b4f048948048b1f89188d700cc746fc020000008946048b1289168d460cc740fc020000008b5424088950048b54240489108b5424148b5c241089542414895c241089c389f083c40ce973f7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b1089118b5c24088b742404895c24088974240489cb8b480489c8e938f7ffff8b51048b328b3683fe01751b8b742404bf03000000897c2408897424048b780489f8e911f7ffff8b72048b3683fe017567f640040175668b70048b3e833f7d75618b4f04538b59048b1b83fb0174078b5204891aeb228b4d008d49f83b4d087303ff5520894d00c741fc010000008b7f0489398b5204890a8b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048b00eb0fe946000000e941000000e93c00000089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0e89088b542404bb03000000895c24088954240489c38b4604e955f6ffff8b75008d76f43b75087303ff5520897500c746fc02000000895e04890e8b5c24088b7c2404895c2408897c240489f38b700489f0e91cf6fffff640040175638b50048b32833e69741e833e3975598b7e048b0f8b09f6c101740783f9017f08eb5cf641ff1075568b4d008d49e83b4d087303ff5520894d00c741fc020000008b7a0489790489318d710cc746fc02000000895e048b0089068b4424088b5c2404eb0ae9e3000000e91100000089442408895c240489f389c8e998f5ffff833e1775448b4e088b398b3ff7c701000000740783ff017f14eb06f647ff10740c8b38b8f8f581b28b5d04ff138b398b3ff7c701000000740583ef027105ff5538ebf68b31893eeb4a833e7d75458b4e048b398b3ff7c701000000740783ff017f17eb06f647ff10740f8b38b838f681b28b5d04909090ff138b398b3ff7c701000000740583ef027105ff5538ebf68b31893e8b4d008d49f43b4d087303ff5520894d00c741fc020000008b52048951048b0089018b442404ba03000000895424088944240489c8e9cbf4ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e992f4fffff6400401756e8b50048b32833e6175698b7904f7c701000000740ef646040174088d7fff037e047105ff5538ebf38b4d008d49e83b4d087303ff5520894d00c741fc02000000897904c701610000008d790cc747fc020000008b4204894704890f8b4c2404be0300000089742408894c2404eb0ae90c000000e90700000089f8e90df4ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e9d4f3ffff8b5104f6400401755d8b70048b3e833f3975588b4f048b520c3b510c75658b10833a17754b8b42088b088b09f6c101740783f9017f17eb06f641ff10740f8b08b8f8f581b28b5d04909090ff138b088b09f6c101740583e9027105ff5538ebf68b38890feb52e90b020000e9da000000833a7d75438b42048b088b09f6c101740eeb05e96800000083f9017f14eb06f641ff10740c8b08b838f681b28b5d04ff138b088b09f6c101740583e9027105ff5538ebf68b38890f8b45008d40f43b45087303ff5520894500c740fc020000008b4e048948048b1689108b7c2404ba0300000089542408897c2404e9e4f2ffff8b55008d52f43b55087303ff5520895500c742fc020000008b4e04894a048b3e893a8b7d008d7ff43b7d087303ff5520897d00c747fc02000000895f048b0089078b4424088b5c240489442408895c240489fb89d0e98af2ffff833f69741e833f3975638b4f048b118b12f6c201740783fa017f08eb50f642ff10754a8b4d008d49e83b4d087303ff5520894d00c741fc020000008b560489510489398d790cc747fc02000000895f048b0089078b4424088b5c240489442408895c240489fb89c8e91df2ffff833f17753e8b4f088b118b12f6c201740783fa017f14eb06f642ff10740c8b10b8f8f581b28b5d04ff138b118b12f6c201740583ea027105ff5538ebf68b398917eb42833f7d753d8b4f048b118b12f6c201740783fa017f15eb06f642ff10740d8b10b838f681b28b5d0490ff138b118b12f6c201740583ea027105ff5538ebf68b3989178b4d008d49f43b4d087303ff5520894d00c741fc020000008b76048971048b0089018b442404ba03000000895424088944240489c8e95ef1ffff8b75008d76f43b75087303ff5520897500c746fc02000000895e04890e8b5c24088b7c2404895c2408897c240489f38b700489f0e925f1ffff8b4424088b4c240489442408894c240489dabb0100000089d0e90f01000090909000000000000f0000|@9813,2097151,@1274|17,0,$9770+34 829,0,4 857,0,@9771 925,0,4 972,0,0 990,0,@9771 1064,0,0 1111,0,4 1136,0,@9771 1175,0,0 1237,0,4 1278,0,1 1591,0,@9775 1664,0,@9778 1734,0,$9770+1746 1843,0,9 1850,0,7 1857,0,8 1864,0,6 1871,0,5 1878,0,4 1885,0,3 1892,0,0 1899,0,1 1906,0,2 1913,0,11 1950,0,10 1961,0,2 1974,0,0 1981,0,1 2023,0,11 2065,0,1 2265,0,1 2453,0,1 2700,0,@9775 2773,0,@9778 2850,0,1 3001,0,48 3028,0,1 3181,0,@9775 3268,0,@9778 3339,0,1 3588,0,@9775 3655,0,@9778 3727,0,1 3822,0,0 3829,1,@9780 9771:O4|@4608,@5398,@9773,@9772 9772:O5|@9774,160,0,160,0 9773:S20|666f72776172643a20417269746852436f6e7374 9774:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364f5054494d4953452e4d4c 9775:O4|@4608,@5398,@9777,@9776 9776:O5|@9774,54,0,54,0 9777:S9|656c696d696e617465 9778:O4|@4608,@5398,@9777,@9779 9779:O5|@9774,52,0,52,0 9780:D3,5968|3b650c7303ff5524a801750f8b088b11be86f681b28d7496fcffe6e9111700009090e92c020000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e954020000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e964030000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e9f9040000909090e92b010000909090e9f0120000909090e91b010000909090e9db130000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9e51300009090908b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e9adfdffffff700453516a016a01ff7108ff7104bb010000008b4424189090e8f214000083f801753f8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b0c2489088b4c24148b542410894c24148954241089c383c40858e94afdffff8b4c2410ba0300000089542414894c241083c4045b83c404e92dfdffff8b51088b72048b36f7c601000000756c8b368b7e048b3ff7c701000000750c8b373b650c7303ff5524ebe78b3a8b3ff7c701000000740583ef027105ff5538ebf6ff70048b0289388b3e8b3ff7c701000000740783ff037d15eb06f647ff10740db83c1782b28b5d04909090ff138b3e8b3ff7c701000000740ceb05e98600000083c7027105ff5538ebf68b0689388b128b12f6c201740783fa017d15eb06f642ff10740db8841782b28b5d04909090ff138b55008d52e03b55087303ff5520895500c742fc040000008b790c897a0c8972088b7904897a04c702170000008d4a14c741fc020000005f89790489118b542404bf03000000897c24088954240489c8e926fcffff8b75008d76f43b75087303ff5520897500c746fc02000000895e04890e8b5c24088b7c2404895c2408897c240489f38b700489f0e9edfbfffff640040175488b50048b32833e2b754e837e0403754d8b79043b7e087454833f01751c8b7e08833f0175118b7904538b5e088b7f043b7b04744ceb4f53eb51833f0375518b7e08833f037535eb05e9410100008b7904538b5e08ff30eb0ae931010000e92c0100008b47043b43047559eb05e92a0000008b47083b4308755ceb2253ff30eb5ae90e000000e90d000000e9080000005351eb6eff30eb06ff30eb6b53518379080174258b44240cb903000000894c24108944240c8b5c24048b420483c408e924fbffffe9740000008b45008d40e43b4508730feb0ae962000000e95d000000ff5520894500c740fc030000008b7608897008c7400401000000c7002b000000eb0ae936000000e9310000008d4810c741fc020000008b520489510489018b44240cba03000000895424108944240c8b5c240489c883c408e9abfaffff8b45008d40e83b45087303ff5520894500c740fc020000008b4a048948048b1a89188d700cc746fc020000008b7c2404897e048b3c24893e8b7c24108b5c240c897c2410895c240c89f383c408e959faffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e920fafffff640040175128b50048b328b3ebe62fc81b28d74befcffe6e9b10d000090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e90e020000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e925020000909090e974020000909090e9c3020000909090e97b010000909090e9f8050000909090e947060000909090e963010000909090e95b010000909090e96e080000909090e9bd080000909090e943010000909090e93b010000909090e9ea0b0000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9dd0b0000909090e9cb000000909090e9c3000000909090e91c0c0000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090908b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b1089118b5c24088b742404895c24088974240489cb8b480489c8e9cff7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e978f7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e921f7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e9caf6ffff8b328b7e08833f017513538b5f04f6c301740583c3207122ff5538ebf6837f08037513538b5f04f6c301740583c3107109ff5538ebf6538b5f04f6c30175108b3bf643ff107402f7df8d7c3f01eb0289df8b590489f9bf0300000083ef0183f93f7605b93f000000d1e9d3e783cf018d4c090123fb83ff01746b83ff01746b8b460883380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b39f641ff107402f7df8d7c3f01eb0289cf89f9bf0300000083ef0183f93f7605b93f000000d1e9d3e7eb0ae903020000e9fe01000083cf018d4c090183f7fe23df83fb01740583fb01756c8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5a048959048b3a893983380175158b7804f7c701000000740583c7207123ff5538ebf68378080375158b7804f7c701000000740583c7107108ff5538ebf68b7804f7c70100000075178b17f647ff107409eb05e97a000000f7da8d541201eb0289fa89cb89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09018b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701310000008d510cc742fc020000008b3c24897a04890a8b4c240c8b7c2408894c240c897c24085389d35883c404e9daf4ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000895904c701310000008d590cc743fc020000008b7a04897b04890b8d4b0cc741fc020000008959048b1a891983380175128b5804f6c301740583c3207120ff5538ebf68378080375128b5804f6c301740583c3107108ff5538ebf68b5804f6c30175108b13f643ff107402f7da8d541201eb0289da89cb89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09018b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701310000008d510cc742fc020000008b3c24897a04890a8b4c240c8b7c2408894c240c897c24085389d35883c404e9ddf3ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5a048959048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b742408bf03000000897c240c897424085be985f3ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e92ef3ffff8b328b7e04833f017513538b5f04f6c301740583c3207122ff5538ebf6837f08037513538b5f04f6c301740583c3107109ff5538ebf6538b5f04f6c30175108b3bf643ff107402f7df8d7c3f01eb0289df8b590489f9bf0300000083ef0183f93f7605b93f000000d1e9d3e783cf018d4c090123fb83ff01746b83ff01746b8b460483380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b39f641ff107402f7df8d7c3f01eb0289cf89f9bf0300000083ef0183f93f7605b93f000000d1e9d3e7eb0ae9fd000000e9f800000083cf018d4c090183f7fe23df83fb01740583fb01755a8b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410803000000894104c701230000008d5910c743fc020000008b5204895304890b8b4c2408ba030000008954240c894c240889da8b1c2489d083c404e9cff1ffff8b4d008d49d83b4d087303ff5520894d00c741fc03000000c7410803000000894104c701230000008d7910c747fc02000000895f04c707310000008d5f0cc743fc020000008b5204895304893b8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b4c2408bb03000000895c240c894c24088b1c2489d083c404e947f1ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5a048959048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b742408bf03000000897c240c897424085be9eff0ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e998f0ffff8b328b7e08833f017513538b5f04f6c301740583c3207122ff5538ebf6837f08037513538b5f04f6c301740583c3107109ff5538ebf6538b5f04f6c30175108b3bf643ff107402f7df8d7c3f01eb0289df8b590489f9bf0300000083ef0183f93f7605b93f000000d1e9d3e783cf018d4c090123fb83ff01746b83ff01746b8b460883380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b39f641ff107402f7df8d7c3f01eb0289cf89f9bf0300000083ef0183f93f7605b93f000000d1e9d3e7eb0ae903020000e9fe01000083cf018d4c090183f7fe23df83fb01740583fb01756c8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5a048959048b3a893983380175158b7804f7c701000000740583c7207123ff5538ebf68378080375158b7804f7c701000000740583c7107108ff5538ebf68b7804f7c70100000075178b17f647ff107409eb05e97a000000f7da8d541201eb0289fa89cb89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09018b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701310000008d510cc742fc020000008b3c24897a04890a8b4c240c8b7c2408894c240c897c24085389d35883c404e9a8eeffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000895904c701310000008d590cc743fc020000008b7a04897b04890b8d4b0cc741fc020000008959048b1a891983380175128b5804f6c301740583c3207120ff5538ebf68378080375128b5804f6c301740583c3107108ff5538ebf68b5804f6c30175108b13f643ff107402f7da8d541201eb0289da89cb89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09018b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701310000008d510cc742fc020000008b3c24897a04890a8b4c240c8b7c2408894c240c897c24085389d35883c404e9abedffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5a048959048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b742408bf03000000897c240c897424085be953edffff8b028b49040b48048b75008d76e83b75087303ff5520897500c746fc02000000894e04c706310000008d4e0cc741fc020000008b7a0489790489318b742404b803000000894424088974240489c8e900edffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e9a9ecffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b72048971048b0089018b45008d40f43b45087303ff5520894500c740fc020000008948048b0a89088b7c2404b903000000894c2408897c2404e952ecffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24088b742404895c24088974240489d38b480489c8e919ecffff8b55008d52f83b55087303ff5520895500c742fc01000040c70201000000ff70045351ff7110ff710cff71045289d38b4108e84a0d00008b0c248b0983f90174708b4d008d49e83b4d087303ff5520894d00c741fc050000008b54240c8951108b54240889510c8941088b442404894104c701350000008b45008d40f43b45087303ff5520894500c740fc020000008b54241489500489088b4c2420ba0300000089542424894c242089c383c41858eb05e905000000e95eebffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24148948048b4c241089088b4c24248b542420894c24248954242089c383c41858e91eebffff8b51048b328b3683fe01751b8b742404bf03000000897c2408897424048b780489f8e9f7eaffff8b72048b36f640040175688b78048b17833a3975638b7a048b57048b1283fa01755b8b50048b3a538b5f0483fe0174078b4b048931eb228b75008d76f83b75087303ff5520897500c746fc010000008b4904890e8b4b0489318b75008d76e83b75087303ff5520897500c746fc02000000eb0fe940000000e93b000000e9360000008b7a04897e048b3a893e8d560cc742fc020000005f897a048b0089028b442404bf03000000897c24088944240489d389f0e93feaffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b1089118b5c24088b742404895c24088974240489cb8b480489c8e904eaffff8b51048b72048b36f7c601000000756b8b368b7e048b3ff7c701000000750c8b373b650c7303ff5524ebe789f18b328b36f7c601000000740583ee027105ff5538ebf68b3a89378b318b36f7c601000000740783fe037d15eb06f646ff10740d8b7004b8c01982b28b5d04ff138b318b36f7c601000000740ceb05e97c00000083c6027105ff5538ebf68b3989378b128b12f6c201740783fa017d15eb06f642ff10740d8b5004b8041a82b28b5d04ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c7027d0000008d720cc746fc020000008b400489460489168b442404ba03000000895424088944240489f0e908e9ffff8b75008d76f43b75087303ff5520897500c746fc02000000895e04890e8b5c24088b7c2404895c2408897c240489f38b700489f0e9cfe8ffff8b44240489188b4c2408894804b801000000c208009090000000004c170000|@9812,2097151,@1273|17,0,$9780+34 611,0,0 622,1,@9781 699,0,1 821,0,@9791 889,0,@9794 942,0,11 967,0,1 1217,0,1 1294,0,0 1300,0,21 1339,0,1 1518,0,$9780+1534 2167,0,1 2254,0,1 2341,0,1 2445,0,1 2458,0,31 2564,0,1 2577,0,31 2747,0,1 2760,0,31 2804,0,24 2883,0,24 3000,0,1 3013,0,31 3057,0,24 3177,0,1 3265,0,1 3369,0,1 3382,0,31 3488,0,1 3501,0,31 3570,0,1 3579,0,17 3606,0,1 3660,0,1 3669,0,17 3688,0,24 3744,0,1 3839,0,1 3927,0,1 4031,0,1 4044,0,31 4150,0,1 4163,0,31 4333,0,1 4346,0,31 4390,0,24 4469,0,24 4586,0,1 4599,0,31 4643,0,24 4763,0,1 4818,0,24 4845,0,1 4934,0,1 5021,0,1 5121,0,0 5146,1,@9797 5210,0,26 5252,0,1 5363,0,1 5548,0,1 5728,0,@9806 5796,0,@9809 5834,0,62 5861,0,1 5951,0,0 9781:D3,1944|3b650c7303ff5524a801750f8b088b11beea0d82b28d7496fcffe6e9670700009090e9fb010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9cf020000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9ab030000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e967040000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e976040000909090e9b5040000909090e90a050000909090e949050000909090e91b000000909090e913000000909090e90b000000909090e903000000909090b801000000c21000837c240c0175108b5004b8741582b28b5d04909090ff138b5108833a0175158b7204f7c601000000740583c6207123ff5538ebf6837a080375158b7204f7c601000000740583c6107108ff5538ebf68b7204f7c60100000075108b3ef646ff107402f7df8d7c3f01eb0289f78b710489f9bf0300000083ef0183f93f7605b93f000000d1e9d3e783cf018d4c0901237c241083ff01740d83ff017408b801000000c2100089f1f6c101740583c1027105ff5538ebf6ff7004535256bb0900000089c8ff15c8c752088b4d008d49e03b4d087303ff5520894d00c741fc010000008b54240489118d5908c743fc050000008b74241889731089430cc7430834c47fb2894b04c7033d0000008b442408b901000000a801752e8b7d008d7ff43b7d087303ff5520897d00c747fc02000000894f048b08890f89f98b40043b650c7303ff5524ebce89c8e8a60400008b4c2414f6c101740ef604240174088d49ff030c247105ff5538ebf3f6c101740583c1027105ff5538ebf68b55008d52e43b55087303ff5520895500c742fc0300000083c4045f83c404897a08894a04c702010000008d4a10c741fc020000005f897904891183f901740b89df89cbe89e04000089fb89c18b45008d40f43b45087303ff5520894500c740fc020000008948048918c210008b51043b5424087436833a0175138b742408833e0175308b7a043b7e047420eb26833a0375218b742408833e0375188b7a043b7e0475108b7a083b7e087508b801000000c210008b55008d52f43b55087303ff5520895500c742fc02000000895a048b18891a8b7104833e0175158b7e04f7c701000000740583c7207123ff5538ebf6837e080375158b7e04f7c701000000740583c7107108ff5538ebf68b7e04f7c70100000075108b1ff647ff107402f7db8d5c1b01eb0289fb89d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09010b5c24108b4c240c8b7424088b7c2404895c2410894c240c89742408897c240489d38b4004e9f6faffff8b51043b5424087436833a0175138b742408833e0175308b7a043b7e047420eb26833a0375218b742408833e0375188b7a043b7e0475108b7a083b7e087508b801000000c210008b55008d52f43b55087303ff5520895500c742fc02000000895a048b18891a8b7104833e0175158b7e04f7c701000000740583c7207123ff5538ebf6837e080375158b7e04f7c701000000740583c7107108ff5538ebf68b7e04f7c70100000075108b1ff647ff107402f7db8d5c1b01eb0289fb89d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09010b5c24108b4c240c8b7424088b7c2404895c2410894c240c89742408897c240489d38b4004e9f2f9ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24108b74240c8b7c24088b4c2404895c24108974240c897c2408894c240489d38b4004e9abf9ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24108b74240c8b7c24088b4c2404895c24108974240c897c2408894c240489d38b4004e964f9ffff837c240c01740e8b5004b8a01682b28b5d0490ff138b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24108b7424088b7c2404895c2410b903000000894c240c89742408897c240489d38b4004e907f9ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24108b74240c8b7c24088b4c2404895c24108974240c897c2408894c240489d38b4004e9c0f8ffff8b55008d52f43b55087303ff5520895500c742fc02000000895a04890a8b5c24108b74240c8b7c24088b4c2404895c24108974240c897c2408894c240489d38b4004e979f8ffffb801000000c21000900000000094070000|@9790,2097151,@1270|17,0,$9781+34 539,0,0 557,0,@9782 660,0,1 673,0,31 703,0,0 734,0,4 742,0,I108 799,0,@8817 808,0,30 817,0,0 874,1,@9785 960,0,0 990,1,@9786 1094,0,0 1220,0,1 1233,0,31 1354,0,0 1480,0,1 1493,0,31 1703,0,@9787 1759,0,1 1928,0,0 9782:O4|@4608,@5398,@9784,@9783 9783:O5|@9774,356,0,356,0 9784:S49|416c6c6f6353746f726520666f756e6420627574206c61737420616c6c6f636174696f6e206e6f7420636f6d706c657465 9785:D3,88|3b650c7303ff5524a801753d8b08833971742c518b40049090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b7ffffffb801000000c3900000000054000000|@5094,3,@1268|74,0,0 9786:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1269| 9787:O4|@4608,@5398,@9789,@9788 9788:O5|@9774,360,0,360,0 9789:S41|53746f7265496e697469616c6973656420666f756e642077697468206e6f20616c6c6f636174696f6e 9790:S49|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329736561726368416c6c6f63283429 9791:O4|@4608,@5398,@9793,@9792 9792:O5|@9774,215,0,215,0 9793:S18|436f6e646974696f6e616c4272616e636831 9794:O4|@4608,@5398,@9796,@9795 9795:O5|@9774,217,0,217,0 9796:S18|436f6e646974696f6e616c4272616e636832 9797:D3,88|3b650c7303ff5524a801753e89dfff700489fb8b00e8520000005089fb8b442404e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000054000000|@6329,63,@1272|22,1,@9798 75,0,0 9798:D3,176|8b48048b09f6c10175718b098b51048b12f6c201750c8b0a3b650c7303ff5524ebea8b1089c88b0af6c101740583e9027105ff5538ebf6890a8b088b09f6c101740783f9037d16eb06f641ff10740e89c1b8fc1882b28b5d049090ff138b088b09f6c101740583c1027105ff5538ebf68b30890e8b12f6c201eb05e924000000740783fa017d16eb06f642ff10740e89c1b8401982b28b5d049090ff13c70303000000c3c390909000000000ac000000|@9805,31,@1271|82,0,@9799 146,0,@9802 159,0,1 9799:O4|@4608,@5398,@9801,@9800 9800:O5|@9774,234,0,234,0 9801:S14|496e64657865644272616e636831 9802:O4|@4608,@5398,@9804,@9803 9803:O5|@9774,236,0,236,0 9804:S14|496e64657865644272616e636832 9805:S51|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329666f72776172644272616e6368283129 9806:O4|@4608,@5398,@9808,@9807 9807:O5|@9774,199,0,199,0 9808:S13|556e636f6e644272616e636831 9809:O4|@4608,@5398,@9811,@9810 9810:O5|@9774,201,0,201,0 9811:S13|556e636f6e644272616e636832 9812:S35|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329 9813:S35|5838364f5054494d49534528292e6f7074696d697365283229666f7277617264283329 9814:O3|@9815,@8785,@9766 9815:D3,2064|8d7c24a83b7d0c7303ff55285352ff72088b5c2410e80a0800008b44240c8b480c8b098b50408b12ff7028ff7050ff7018ff702451ff7038ff701052ff30ff7008ff701c8b4424088b00a801740783f8017d17eb06f640ff10740f89c3b88c6c7ab29090ff1588c75208bb0900000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0087105ff5538ebf683f8017443bb190000008b442438e802ae0000b864d182b29090e8f2b500008b4c24388b118b1289d383c3028b31891e5089d38b4108e8aeb900003b650c7303ff5524e951ffffffb8010000008b4424088b008b4c24388b118b1289d383c3088b31891e50ff7108526a0189d38b44240890e872b900008b042483c0026a0189c38b44240890e85eb900008b042483c0046a0189c38b44240890e84ab900005883c0066a0189c38b442404909090e836b900008b44241083c4048b0090ff15a8c552088b4c243c8b118b1289d383c3088b31891eff71085250bb31000000909090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e88eb800008b44241083c002ff342489c38b442418909090e876b800008b44241083c40483c004ff342489c38b442414e85eb800008b44240c83c40483c006ff342489c38b442410e846b800008b44242c83c410a801752c8b08ff7004ff7108ff742414ff742448ff7424188b59048b01909090e8c2fc0000583b650c7303ff5524ebd0b8010000008b44240c8b00c1e80283c801f64424100175148b5424108b0af642ff107402f7d98d4c0901eb048b4c24108d40ff03c183c00883f801740881f8ffffff01720f89c1b8381c7cb28b5d04909090ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b45008d40e43b45087303ff5520894500c740fc02000000897804c700010000008d480cc741fc0100004089018d4108c740fc0100000089088b54240489028b44240c8b008b5424088b12833a0175078b19833b01740f89c3b8c8d782b28b5d04909090ff138b198b7a04beffffff002377fc8d743601518b4b04bfffffff002379fc8d7c3f018d34b5fdffffff8d3cbdfdffffff2bf883c7013bf0720583ff01730f89c6b830d882b28b5d04909090ff138b720489cf89c1d1e9f3a48d7c3f018d7436018d4c09018b4424108b00c1e80283c80189c183c106f64424140175148b5c24148b13f643ff107402f7da8d541201eb048b5424148d49ff03ca8d0c8dfdffffffba07000000f6c2017410f64424140174098d52ff035424147105ff5538ebf250516a0989d38b44240ce8cefd00008b4424048b00833801740c89c1b8fc1d83b28b5d04ff13ff7004bb850000008b0424ff1548d352088b45008d40f43b45087303ff5520894500c740fc0200000059894804c700050000008b4c240489018b01833805740c89c2b8581e83b28b5d04ff138b5804baffffff002353fc8d5412013b1424770cb8b81e83b28b5d049090ff138b14248b74241c897453fe83c202bee41e83b2bf01000000f7c60100000075708b068b0883390175128b5904f6c301740583c3207120ff5538ebf68379080375128b5904f6c301740583c3107108ff5538ebf68b5904f6c30175108b0bf643ff107402f7d98d4c0901eb0289d9bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c0901235c243ceb05e91d00000083fb01740883fb0174030b78048b76043b650c7303ff5524e966ffffff89f88b4c24048b09833905740d89c3b8581e83b28b5d0490ff138b7104bbffffff00235efc8d5c1b013bda770d89c3b8b81e83b28b5d0490ff13894456fe5883c0048b14248b12833a05740e89c3b8581e83b28b5d049090ff138b7a04bbffffff00235ffc8d5c1b013bd8770d89c3b8b81e83b28b5d0490ff138b5c241c895c47fe8b442420a801755a8b088b5108833a01746d833a0375508b5a048b1b8b34248b36833e01750e8b7804b8c4bc81b28b5d0490ff138b78048b460490ff1528d552085750ff318b59048b44244ce8feff00008b4424288b0083e8028b4c24288901eb36e93f000000ff7004ff7204ff318b59048b44244c9090e8d2ff0000eb05e9110000008b4424288b0083e8028b4c24288901eb03ff7004583b650c7303ff5524e95effffffb8010000008b4424248b0083f80175558b04248b00833805740c89c1b8040983b28b5d04ff13ff7004bb050000008b0424ff1548d352088b45008d40f43b45087303ff5520894500c740fc0200000059894804c700030000008b0c248901b801000000eb05b801000000837c242801741e8b04248b00833801750f8b4804b8c4bc81b28b5d049090ff138b4004eb388b04248b00833801750d8b4804b8c4bc81b28b5d04ff138b48048b45008d40f83b45087303ff5520894500c740fc0100000089088060ffbf8b4c24408b513c8b1250f6c20175388b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b5c24448918ff72048b129090ff125a3b650c7303ff5524ebc3b801000000837c2430017443ff7424448b5c24088b44240ce806020100b8f87383b28b54243490ff128b4424388b48048b44243c89ca90ff128b5424349090ff12b8107483b28b54243490ff12eb05b8010000005883c43cc20400000000000c080000|@10215,2097151,@1312|22,1,@9816 94,0,@5215 102,0,I106 107,0,4 114,0,I110 141,0,0 148,0,1 177,0,12 186,1,@9821 191,0,@9830 198,1,@9831 226,1,@9833 244,0,0 286,1,@9833 306,1,@9833 326,1,@9833 346,1,@9833 362,0,I91 389,0,24 398,0,I86 406,0,I89 418,0,16 430,0,I86 438,0,I89 450,0,8 462,0,I86 470,0,I89 490,0,I89 514,1,@9833 538,1,@9833 562,1,@9833 586,1,@9833 630,1,@10005 646,0,0 708,0,16777215 717,0,@6934 732,0,0 812,0,0 873,0,@9840 891,0,8388607 907,0,8388607 949,0,@9843 1045,0,3 1086,1,@10010 1104,0,@10012 1117,0,66 1126,0,I200 1160,0,2 1180,0,@10015 1193,0,8388607 1210,0,@10018 1236,0,@10020 1241,0,0 1331,0,1 1344,0,31 1415,0,@10015 1429,0,8388607 1447,0,@10018 1478,0,@10015 1493,0,8388607 1511,0,@10018 1571,0,@9716 1590,0,I215 1606,1,@10064 1650,1,@10064 1696,0,0 1724,0,@9926 1737,0,2 1746,0,I200 1780,0,1 1790,0,0 1797,0,0 1822,0,@9716 1852,0,@9716 1966,0,0 1990,1,@10066 1995,0,@10213 2031,0,@10214 2045,0,0 9816:D3,48|3b650c7303ff5524ff3353508b542410ff128b442408894424108b5c24045883c408e91d00000090000000002c000000|@10004,2097151,@1303|35,1,@9817 9817:D3,42480|3b650c7303ff5524a801750f8b088b11be3a2382b28d7496fcffe6e9bea500009090e968030000909090e94c0b0000909090e91c110000909090e9f81b0000909090e96c1c0000909090e998200000909090e9d4210000909090e9fd250000909090e9fa260000909090e9b1290000909090e9cc290000909090e9802a0000909090e9be2b0000909090e90c2d0000909090e9b7310000909090e988320000909090e9c4320000909090e965340000909090e9a8340000909090e9d9360000909090e90b380000909090e978380000909090e9d0380000909090e9033d0000909090e9243e0000909090e92e3e0000909090e95c3f0000909090e9803f0000909090e960410000909090e9af410000909090e9c8410000909090e91d460000909090e9954b0000909090e92f4c0000909090e9e44c0000909090e9db000000909090e9285a0000909090e97c5a0000909090e926610000909090e9dc610000909090e9b8620000909090e960630000909090e9d4640000909090e986670000909090e900680000909090e9db6b0000909090e9dc720000909090e930740000909090e9d4740000909090e9067c0000909090e9437d0000909090e9377f0000909090e91c800000909090e9bf800000909090e9c7850000909090e9078b0000909090e923910000909090e94d910000909090e9d0920000909090e917980000909090e970980000909090e9809c0000909090e9379f00009090908b5104833a03740f8b7004b81cc982b28b5d049090ff1353ff7004ff7204ff7208bb190000008b44240c90e80ea40000833c24017426b8810000000b04248b4c240c8b118b1289d383c3028b31891e5089d38b41089090e8b6af0000b860e882b283c404909090e8ceab00008b4c24088b118b1289d383c3028b31891e5089d38b4108e88aaf0000833c240975508b4424088b088b0989ca83c2028b18891368c900000089cb8b480889c8e862af0000bb68e882b2b834c47fb290e87ec200008b4c24088b118b1289d383c3028b31891e5089d38b4108e836af0000eb36833c240f760bb8b8ea82b28b5d0490ff13b8c10000000b04248b4c24088b118b1289d383c3028b31891e5089d38b410890e8feae00008b44240883c4048b088b0989ca83c2028b18891368ff01000089cb8b480889c8909090e8d6ae00008b4424048b088b0989ca83c2028b188913687f01000089cb8b480889c89090e8b2ae00008b44240c8944240c8b5c24045883c404e971fcffff8b532c8b1283fa0174108b5004b8fcea82b28b5d04909090ff138b532cc702030000008b7104f7c601000000740583c6027105ff5538ebf653ff7004ff7108bb0900000089f0909090ff15c8c752088b0c24833903740f89c2b81cc982b28b5d04909090ff1350ff7104bb190000008b442410909090e84ea20000b854eb82b29090e83eaa00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8faad0000833c240f760db85ceb82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c240c8b118b1289d383c3028b31891e5089d38b41089090e8b2ad00008b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e892ad0000b801000000a801740bf604240174052b04247105ff5538ebf683c0018b4c2404833903740e89c2b81cc982b28b5d049090ff13833903740f89c2b81cc982b28b5d04909090ff1350ff7104bb190000008b442414909090e862a10000b8a0eb82b29090e852a900008b4c24148b118b1289d383c3028b31891e5089d38b4108e80ead0000837c2404017506833c240b753a8b442404a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570833c240f760bb85ceb82b28b5d0490ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b14248d14d5f9ffffff81e2ff0100000bc283c8098b5424148b1a8b1b89de83c6028b3a89375150eb05e9370000008b420890e83eac0000bb68e882b2b834c47fb290e85abf00008b4c24188b118b1289d383c3028b31891e5089d38b4108e812ac0000eb71833c240f760bb85ceb82b28b5d0490ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b14248d14d5f9ffffff81e2ff0100000bc20b04248b542414eb05e9180000008b1a8b1b89de83c6028b3a893751508b420890e882ab0000833c240375638b4424188b088b0989ca83c2088b188913f6442408017410ff7008518b442410ff1588c55208eb498b50088b5c24088b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442414ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e88aaa00008b44241083c002ff342489c38b442418909090e872aa00008b44241083c40483c004ff342489c38b442414e85aaa00008b44240c83c40483c006ff342489c38b442410e842aa0000eb62833c240575618b4424188b4c2408f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e892a900006a016a016a016a018b442420833803740ab81cc982b28b5d04ff13ff7004bb190000008b44242ce8929d0000b8f0eb82b29090e882a500008b4c242c8b118b1289d383c3028b31891e5089d38b4108e83ea90000833c240f760db85ceb82b28b5d04909090ff135883c4208d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b4108909090e8f2a800008b4424088b088b0989ca83c2028b1889136a1189cb8b480889c890e8d2a800008b4424088b18b884887ab2e8eaa400008b4c24088b118b1289d683c6028b398937535089d38b4108909090e8a2a800008b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e882a80000588b0083c0fe8b4c24088b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52e83b55087303ff5520895500c742fc02000000894204891a8b411489108d520cc742fc02000000c7420401000000891a52bb1900000089c8e8229c0000b800ec82b29090e812a400008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8cea700008b44240c8b088b0989ca83c2028b18891368ab00000089cb8b480889c89090e8aaa700008b44240c8b088b0989ca83c2028b1889136a4189cb8b480889c890e88aa700008b5c240c589090e8bab500008b0424833803740bb81cc982b28b5d0490ff13ff7004bb190000008b44240ce8869b0000b808ec82b29090e876a300008b4c240c8b118b1289d383c3028b31891e5089d38b4108e832a70000833c240f760db85ceb82b28b5d04909090ff135883c4048d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c24048b118b1289d383c3028b31891e5089d38b4108909090e8e6a600008b4424048b088b0989ca83c2028b1889136a0189cb8b480889c890e8c6a600008b44240c8944240c8b5c24045883c404e985f4ffff8b532c8b1283fa0174108b5004b810ec82b28b5d04909090ff138b532cc702030000008b7104833e03740f8b7804b81cc982b28b5d049090ff1353ff700456ff7604bb190000008b44240c909090e88a9a0000b85c387fb29090e87aa200008b4c240c8b118b1289d383c3028b31891e5089d38b4108e836a60000833c240f760db8b8ea82b28b5d04909090ff13b8b10100000b04248b4c240c83c4048b118b1289d383c3028b31891e5089d38b41089090e8faa500008b0424833803740bb81cc982b28b5d0490ff13ff7004bb190000008b44240ce8029a0000b83cec82b29090e8f2a100008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8aea50000833c240f760db85ceb82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b41089090e866a500008b4424088b088b0989ca83c2028b1889136a0189cb8b480889c890e846a500008b0424833803740bb81cc982b28b5d0490ff13ff7004bb190000008b44240ce84e990000b8f0eb82b29090e83ea100008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8faa40000833c240f760db85ceb82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b41089090e8b2a400008b4424088b088b0989ca83c2028b1889136a1189cb8b480889c890e892a400008b4424088b18b800ad7ab2e8aaa000008b4c24088b118b1289d683c6028b398937535089d38b4108909090e862a400008b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e842a40000588b0083c0fe8b4c24088b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52e83b55087303ff5520895500c742fc02000000894204891a8b411489108d520cc742fc02000000c7420401000000891a8b1c24833b03740cb81cc982b28b5d049090ff1352ff7304bb1900000089c890e8ca970000b8f0eb82b29090e8ba9f00008b4c24108b118b1289d383c3028b31891e5089d38b4108e876a30000833c240f760db85ceb82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c240c8b118b1289d383c3028b31891e5089d38b41089090e82ea300008b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e80ea300008b44240c8b18b800ad7ab2e8269f00008b4c240c8b118b1289d683c6028b398937535089d38b4108909090e8dea200008b4424108b088b0989ca83c2028b1889136a0189cb8b480889c890e8bea20000588b0083c0fe8b4c240c8b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52e83b55087303ff5520895500c742fc02000000894204891a8b411489108d520cc742fc02000000c7420401000000891a5289cb8b44240490e86eb00000bb190000008b4424109090e84e960000b800ec82b29090e83e9e00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8faa100008b4424108b088b0989ca83c2028b18891368ab00000089cb8b480889c89090e8d6a100008b4424108b088b0989ca83c2028b1889136a4189cb8b480889c890e8b6a100008b5c24105883c404909090e8e2af00008b0424833803740bb81cc982b28b5d0490ff13ff7004bb190000008b44240ce8ae950000b808ec82b29090e89e9d00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e85aa10000833c240f760db85ceb82b28b5d04909090ff135883c4048d04c5f9ffffff81e0ff01000081c88100000083c80b8b4c24048b118b1289d383c3028b31891e5089d38b4108909090e80ea100008b4424048b088b0989ca83c2028b1889136a0189cb8b480889c890e8eea000008b44240c8944240c8b5c24045883c404e9adeeffff8b5110f6c201740a81fa01ffffff7c51eb06f642ff10754ef6c201740a81fa010100007d46eb06f642ff107450837904057507be0f000000eb4d8379040b7507be0d000000eb40837904097507be0b000000eb33837904037516be09000000eb26e9d3040000e9ce040000e9c904000083790407740cbe01000000eb0ae9b7040000be030000008b7908833f03740fff7004b81cc982b28b5d049090ff13ff70045352ff710c56ff7704ff7708bb190000008b442414e84a940000833c24017426b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d38b41089090e8f29f0000b84cec82b283c404909090e80a9c00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8c69f0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8f69e0000bb68e882b2b834c47fb290e812b200008b4c24148b118b1289d383c3028b31891e5089d38b4108e8ca9e0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e83a9e0000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8429d00008b44241083c002ff342489c38b442418909090e82a9d00008b44241083c40483c004ff342489c38b442414e8129d00008b44240c83c40483c006ff342489c38b442410e8fa9c0000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e84a9c00006a016a016a016a018b44242483c4208b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c17eb06f641ff10750f8b50088b18b8a8eb82b28b5d04ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e8a29b0000eb73837904057507be0f000000eb398379040b7507be0d000000eb2c837904097507be0b000000eb1f837904037507be09000000eb12837904077407be01000000eb05be030000008b7908833f03740fff7004b81cc982b28b5d049090ff13ff70045352ff710c56ff7704ff7708bb19000000eb05e9210500008b44241490e84a8f0000833c24017426b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d38b41089090e8f29a0000b854ec82b283c404909090e80a9700008b4c24108b118b1289d383c3028b31891e5089d38b4108e8c69a0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8f6990000bb68e882b2b834c47fb290e812ad00008b4c24148b118b1289d383c3028b31891e5089d38b4108e8ca990000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e83a990000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8429800008b44241083c002ff342489c38b442418909090e82a9800008b44241083c40483c004ff342489c38b442414e8129800008b44240c83c40483c006ff342489c38b442410e8fa970000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e84a9700006a016a016a016a018b44242483c4208b088b0989ca83c2088b188913f60424017410ff7008518b442408ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8529600008b44241083c002ff342489c38b442418909090e83a9600008b44241083c40483c004ff342489c38b442414e8229600008b44240c83c40483c006ff342489c38b442410e80a96000083c4108b44241083c4048944240c5b58e9c9e3ffff837904057507ba0f000000eb398379040b7507ba0d000000eb2c837904097507ba0b000000eb1f837904037507ba09000000eb12837904077407ba01000000eb05ba0300000053ff700452ff710cff71086834c47fb253bb54ec82b28b4110909090e8a6ac00008b44240c8944240c8b5c24045883c404e94de3ffff8b510cf6c201740a81fa01ffffff7c51eb06f642ff10754ef6c201740a81fa010100007d46eb06f642ff107450837904057507be0f000000eb4d8379040b7507be0d000000eb40837904097507be0b000000eb33837904037516be09000000eb26e97b010000e976010000e97101000083790407740cbe01000000eb0ae95f010000be030000008b7908833f03740fff7004b81cc982b28b5d049090ff13ff70045352ff770456bb190000008b44240c9090e8ee880000b84cec82b29090e8de9000008b4c240c8b118b1289d383c3028b31891e5089d38b4108e89a940000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e83a9400008b4424048b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c1aeb06f641ff1075128b50088b18b8a8eb82b28b5d04909090ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e89a930000eb71837904057507be0f000000eb398379040b7507be0d000000eb2c837904097507be0b000000eb1f837904037507be09000000eb12837904077407be01000000eb05be030000008b7908833f03740fff7004b81cc982b28b5d049090ff13ff70045352ff770456bb190000008b44240ceb05e9cb010000909090e846870000b854ec82b29090e8368f00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8f2920000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e8929200008b4424048b088b0989ca83c2088b188913f60424017413ff7008518b442408909090ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8a29100008b44241083c002ff342489c38b442418909090e88a9100008b44241083c40483c004ff342489c38b442414e8729100008b44240c83c40483c006ff342489c38b442410e85a91000083c4108b44241083c4048944240c5b58e919dfffff8b5108833a03740e8b7004b81cc982b28b5d0490ff1353ff7004ff710cff7204ff7104bb190000008b4424109090e83e850000b854ec82b29090e82e8d00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8ea900000833c24057507b80f000000eb39833c240b7507b80d000000eb2c833c24097507b80b000000eb1f833c24037507b809000000eb12833c24077407b801000000eb05b80300000083f80f760c89c1b85ceb82b28b5d04ff13837c24040f760d89c1b8b8ea82b28b5d0490ff138d04c5f9ffffff81e0ff01000081c8810100000b4424048b4c241083c4088b118b1289d383c3028b31891e5089d38b4108909090e8469000008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e89ab400008b44240c8944240c8b5c24045883c404e9d5ddffff8b55008d52f03b55087303ff5520895500c742fc03000000c74208070000008b7104897204c702010000008b7908833f03740fff7004b81cc982b28b5d049090ff138b7110833e037410ff7004b81cc982b28b5d04909090ff13ff700453ff710cff7604ff770452bb190000008b44241090e8b6830000589090e8aa8b00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8668f0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b54240c8b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8968e0000bb68e882b2b834c47fb290e8b2a100008b4c24108b118b1289d383c3028b31891e5089d38b4108e86a8e0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b54240ceb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8da8d0000833c240375638b4424108b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8e28c00008b44241083c002ff342489c38b442418909090e8ca8c00008b44241083c40483c004ff342489c38b442414e8b28c00008b44240c83c40483c006ff342489c38b442410e89a8c0000eb62833c240575618b4424108b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8ea8b00006a016a016a016a018b44242c83c4208944240c5b58e9a4d9ffff8b55008d52f03b55087303ff5520895500c742fc03000000c74208070000008b7104897204c702010000008b790c833f03740eff7004b81cc982b28b5d0490ff138b7108833e037410ff7004b81cc982b28b5d04909090ff13ff700453ff7704ff760452bb190000008b44240ce88a7f0000589090e87e8700008b4c24088b118b1289d383c3028b31891e5089d38b4108e83a8b0000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240483c4048b118b1289d383c3028b31891e5089d38b4108909090e8da8a00008b44240c8944240c5b58e99fd8ffff8b5104833a0374108b7004b81cc982b28b5d04909090ff138b7108833e0374108b7804b81cc982b28b5d04909090ff1353ff7004ff7604ff7204bb190000008b44240c90e8ae7e00008b44240c8b088b0989ca83c2028b18891368e101000089cb8b480889c89090e85e8a0000b8c4777ab29090e87a8600008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8368a0000b814fc82b29090e8528600008b4c240c8b118b1289d383c3028b31891e5089d38b4108e80e8a0000833c240b7507b805000000eb05b801000000833c24097571837c24040f760c89c1b85ceb82b28b5d04ff1383f807741f83f803741383f8057407b901000000eb13b903000000eb0cb905000000eb05b907000000c1e10683e93f81e1ff0100008b5424048d14d5f9ffffff81e2ff0100000bca83c9098b54240c8b1a8b1b89de83c6028b3a8937eb05e93800000050518b4208e876890000bb68e882b2b834c47fb290e8929c00008b4c24108b118b1289d383c3028b31891e5089d38b4108e84a890000eb71837c24040f760e89c1b85ceb82b28b5d049090ff13833c240f760e89c1b8b8ea82b28b5d049090ff1383f807741f83f803741383f8057407b901000000eb13b903000000eb0cb905000000eb05b907000000c1e10683e93f81e1ff0100008b5424048d14d5f9ffffff81e2ff010000eb05e9200000000bca0b0c248b54240c8b1a8b1b89de83c6028b3a893750518b4208e8b2880000833c240375608b4424108b088b0989ca83c2088b188913ff7008516a0189cb8b442408e88a8800008b042483c0026a0189c38b44240890e8768800008b042483c0046a0189c38b44240890e8628800005883c0066a0189c38b442404909090e84e880000eb28833c240575208b4424108b088b0989ca83c2028b1889136a0189cb8b480889c890e8268800006a018b44241c83c4108944240c8b5c24045883c404e9e0d5ffff53ff70048b41049090e8d6ae00008b44240c8944240c8b5c24045883c404e9bdd5ffff53ff7004ff7104bb190000008b4424089090e8fe7b0000b800ec82b29090e8ee8300008b4c24088b118b1289d383c3028b31891e5089d38b4108e8aa8700008b4424088b088b0989ca83c2028b18891368ab00000089cb8b480889c89090e886870000f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff0100008b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e8428700008b44240c8944240c8b5c24045883c404e901d5ffff8b51088b72108b3681fef9ffff07740e8b7004b8700a83b28b5d0490ff138b75008d76f43b75087303ff5520897500c746fc020000008b7904897e04c7060500000053ff7004ff720c56bb190000008b44240c909090e8fe7a0000589090e8f28200008b4c24088b118b1289d383c3028b31891e5089d38b4108e8ae8600008b4424088b088b0989ca83c2028b1889136a0189cb8b480889c890e88e8600008b4424108b0083c0fe8b4c24088b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52f43b55087303ff5520895500c742fc02000000894204891a8b411489108b14248b128b75008d76f43b75087303ff5520897500c746fc02000000895604891e5a89328b54240c8954240c89cb5883c404e9bbd3ffff53ff7004ff7108ff7104bb190000008b44240c90e8fa790000b8bc0a83b29090e8ea8100008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8a68500008b0424b9ae4f82b28d4c81fcffe19090e93b000000909090e947000000909090e946000000909090e945000000909090e944000000909090e913000000909090e93b000000909090e93a000000909090833c240b7407b801000000eb2fb803000000eb28b805000000eb21b807000000eb1ab80d000000eb13b80f000000eb0cb809000000eb05b80b00000083f80f760e89c1b85ceb82b28b5d049090ff138d04c5f9ffffff81e0ff01000083c80b8b4c240c83c4048b118b1289d383c3028b31891e5089d38b41089090e8d68400008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e82aa900008b44240c8944240c8b5c24045883c404e965d2ffff8b5104bec25082b28d7496fcffe690e93b000000909090e947000000909090e946000000909090e945000000909090e944000000909090e913000000909090e93b000000909090e93a0000009090908379040b7407ba01000000eb2fba03000000eb28ba05000000eb21ba07000000eb1aba0d000000eb13ba0f000000eb0cba09000000eb05ba0b0000008b7108833e03740f8b7804b81cc982b28b5d049090ff1353ff7004ff710c52ff7604ff7608bb190000008b44241490e8fe770000833c24017426b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d38b41089090e8a6830000b8bc0a83b283c404909090e8be7f00008b4c24108b118b1289d383c3028b31891e5089d38b4108e87a830000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8aa820000bb68e882b2b834c47fb290e8c69500008b4c24148b118b1289d383c3028b31891e5089d38b4108e87e820000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8ee810000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8f68000008b44241083c002ff342489c38b442418909090e8de8000008b44241083c40483c004ff342489c38b442414e8c68000008b44240c83c40483c006ff342489c38b442410e8ae800000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8fe7f00006a016a016a016a018b44242c83c4208944240c8b5c24045883c404e9b2cdffff8b5108833a01740f8b7004b8c80a83b28b5d049090ff138b7104bf8e5582b28d7cb7fcffe7909090e93b000000909090e947000000909090e946000000909090e945000000909090e944000000909090e913000000909090e93b000000909090e93a0000009090908379040b7407be01000000eb2fbe03000000eb28be05000000eb21be07000000eb1abe0d000000eb13be0f000000eb0cbe09000000eb05be0b0000008b7a0483c70281e7ff01000053ff7004566a015389fbb807000000e8e2b400008b44240c8944240c8b5c24045883c404e9d9ccffff8b5104833a01740e8b7004b8fc0b83b28b5d0490ff1353ff70046a016a0b538b5a04b807000000909090e89eb400008b44240c8944240c8b5c24045883c404e995ccffff8b50048b7104dd06dc1d4c9480b2dfe081e00044000081f0004000008d44000175475352566a0b6a0353bb0d000000b8070000009090e84eb400008b1c24b8230000009090ff15c8c9520883f80174696a096a03ff742410bb01000000b807000000e822b40000eb6add06dc1d380c83b2dfe081e00044000081f0004000008d440001751853526a0b6a0353bb01000000b807000000e8eeb30000eb5cdd06dc1d440c83b2dfe081e00044000081f0004000008d440001eb05e9d3000000753e53526a0b6a0353bb01000000b807000000eb05e9b90000009090e8aab300006a096a03ff74240cbb01000000b80700000090e892b30000eb6be991000000535256bb190000008b442408e8de710000b8500c83b29090e8ce7900008b4c24088b118b1289d383c3028b31891e5089d38b4108e88a7d00008b4424088b088b0989ca83c2028b1889136a0b89cb8b480889c890e86a7d00008b45008d40f43b4508730aeb05e926000000ff5520894500c740fc0200000059894804c70005000000ff742404bb0100000090e8b6a100006a018b44241083c4048944240c8b5c24045883c404e9eccaffff8b5104833a01740d8b7004b85c0c83b28b5d04ff138b720481e6ff01000053ff70046a016a035389f3b807000000909090e8aab200008b44240c8944240c8b5c24045883c404e9a1caffff8b5104833a03740e8b7004b81cc982b28b5d0490ff1353ff7004ff7204ff7208bb190000008b44240c90e8ca700000833c24017426b8810000000b04248b4c240c8b118b1289d383c3028b31891e5089d38b41089090e8727c0000b8500c83b283c404909090e88a7800008b4c24088b118b1289d383c3028b31891e5089d38b4108e8467c0000833c240b7507b805000000eb05b801000000833c2409757083f807741f83f803741383f8057407b901000000eb13b903000000eb0cb905000000eb05b907000000c1e10683e93f81e1ff01000083c9098b5424088b1a8b1b89de83c6028b3a893750518b420890e8da7b0000bb68e882b2b834c47fb290e8f68e00008b4c240c8b118b1289d3eb05e91500000083c3028b31891e5089d38b410890e8a67b0000eb6a833c240f760f89c1b8b8ea82b28b5d04909090ff1383f807741f83f803741383f8057407b901000000eb13b903000000eb0cb905000000eb05b907000000c1e10683e93f81e1ff0100000b0c248b5424088b1a8b1b89de83c6028b3a893750518b42089090e83a7b0000833c240375608b44240c8b088b0989ca83c2088b188913ff7008516a0189cb8b442408e8127b00008b042483c0026a0189c38b44240890e8fe7a00008b042483c0046a0189c38b44240890e8ea7a00005883c0066a0189c38b442404909090e8d67a0000eb28833c240575208b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e8ae7a00006a018b44241883c40c8944240c8b5c24045883c404e968c8ffff53ff7004bb190000008b442404e8ae6e0000b8b4047db29090e89e7600008b4c24048b118b1289d383c3028b31891e5089d38b4108e85a7a00008b4424048b088b0989ca83c2028b1889136a7989cb8b480889c890e83a7a0000bb68e882b2b834c47fb290e8568d00008b4c24048b118b1289d383c3028b31891e5089d38b4108e80e7a0000bb190000008b4424049090e82a6e0000b8880c83b29090e81a7600008b4c24048b118b1289d383c3028b31891e5089d38b4108e8d67900008b4424048b088b0989ca83c2028b1889136a0989cb8b480889c890e8b6790000bb68e882b2b834c47fb290e8d28c00008b4c24048b118b1289d383c3028b31891e5089d38b4108e88a7900008b45008d40f43b45087303ff5520894500c740fc0200000059894804c700940c83b28b4c2408894c24085be92ec7ffff53ff7004bb190000008b4424049090e8726d0000b8a00c83b29090e8627500008b4c24048b118b1289d383c3028b31891e5089d38b4108e81e7900008b4424048b088b0989ca83c2028b18891368c101000089cb8b480889c89090e8fa7800008b44240c8944240c8b5c24045883c404e9b9c6ffff8b5108833a01740e8b7004b8ac0c83b28b5d0490ff13837904017507be05000000eb05be070000008b7a0483c70281e7ff01000053ff7004566a0b5389fbb807000000909090e862ae00008b44240c8944240c8b5c24045883c404e959c6ffff837908017507ba05000000eb05ba070000008b7104833e0374108b7804b81cc982b28b5d04909090ff1353ff7004ff710c52ff7604ff7608bb190000008b44241490e86a6c0000833c24017426b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d38b41089090e812780000b8500c83b283c404909090e82a7400008b4c24108b118b1289d383c3028b31891e5089d38b4108e8e6770000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e816770000bb68e882b2b834c47fb290e8328a00008b4c24148b118b1289d383c3028b31891e5089d38b4108e8ea760000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e85a760000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8627500008b44241083c002ff342489c38b442418909090e84a7500008b44241083c40483c004ff342489c38b442414e8327500008b44240c83c40483c006ff342489c38b442410e81a750000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e86a7400006a016a016a016a018b44242c83c4208944240c8b5c24045883c404e91ec2ffff6a016a018b5104be0e6182b28d7496fcffe69090e94e000000909090e933000000909090e951000000909090e95c000000909090e967000000909090e972000000909090e982000000909090e99900000090909089e2c7020100000089e2c7420409000000eb5f89e2c7020300000089e2c7420409000000eb5d89e2c7020f00000089e2c742040f000000eb5889e2c7020100000089e2c742040b000000eb5b89e2c7020d00000089e2c742040b000000eb4889e2c7020700000089e2c742040d000000eb35e93000000089e2c7020d00000089e2eb05e91f000000c742040f000000eb16e91100000089e2c7020500000089e2c742040f00000053ff7004ff74240c6a03538b5c2414b807000000e8fea800008b442414894424148b5c24045883c40ce9f5c0ffff8b542404895424048b480489c8e9e3c0ffff8b5108be466282b28d7496fcffe6909090e932000000909090e931000000909090e930000000909090e92f000000909090e92e000000909090e903000000909090ba05000000eb21ba0d000000eb1aba0f000000eb13ba0b000000eb0cba09000000eb05ba070000008b7104833e03740f8b7804b81cc982b28b5d049090ff1353ff7004ff760452bb190000008b44240c909090e8a2660000b85c387fb29090e8926e00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e84e720000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e8ee7100008b44240c8944240c8b5c24045883c404e9adbfffff53ff7004ff7104ff7108538b59108b410c90e856a900008b44240c8944240c8b5c24045883c404e981bfffff53ff7004bb190000008b44240490e8c6650000b8f0eb82b29090e8b66d00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8727100008b4424048b088b0989ca83c2028b18891368cb00000089cb8b480889c89090e84e7100008b4424048b088b0989ca83c2028b1889136a1989cb8b480889c890e82e7100008b4424048b18b884887ab2e8466d00008b4c24048b118b1289d683c6028b398937535089d38b4108909090e8fe7000008b4424088b088b0989ca83c2028b1889136a0189cb8b480889c890e8de700000588b0083c0fe8b4c24048b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52e83b55087303ff5520895500c742fc02000000894204891a8b411489108d520cc742fc02000000c7420401000000891a52bb1900000089c8e87e640000b800ec82b29090e86e6c00008b4c24088b118b1289d383c3028b31891e5089d38b4108e82a7000008b4424088b088b0989ca83c2028b18891368ab00000089cb8b480889c89090e8067000008b4424088b088b0989ca83c2028b1889136a4989cb8b480889c890e8e66f00008b5c2408589090e8167e00008b44240c8944240c8b5c24045883c404e999bdffff8b51048b720c8b3653ff7004ff734cff721089f09090e8e67d00008b4424048b008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889015889088b44240c8944240c8b5c24045883c404e942bdffff53ff70048b4104e816ad00008b44240c8944240c8b5c24045883c404e921bdffff8b5108833a0975718379040175108b7004b80c1783b28b5d04909090ff138b71048b3e833f03740eff7004b81cc982b28b5d0490ff138b5110833a037410ff7004b81cc982b28b5d04909090ff13ff700453ff710cff7204ff7704bb190000008b44240c9090e80e630000b8a0eb82b29090e8fe6a0000eb05e9a30300008b4c240c8b118b1289d383c3028b31891e5089d38b410890e8b26e0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b54240c8b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8e26d0000bb68e882b2b834c47fb290e8fe8000008b4c24108b118b1289d383c3028b31891e5089d38b4108e8b66d0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b54240ceb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8266d0000833c240375638b4424108b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e82e6c00008b44241083c002ff342489c38b442418909090e8166c00008b44241083c40483c004ff342489c38b442414e8fe6b00008b44240c83c40483c006ff342489c38b442410e8e66b0000eb62833c240575618b4424108b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e97b000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8366b00006a016a016a016a01eb2aff700453ff710452ff7110538b590cb8a0eb82b290e8f28800006a016a016a016a016a016a016a016a018b44242c83c4208944240c5b58e9c4b8ffff8b5108833a03756853ff7004ff7204ff7104bb190000008b44240c9090e8fa5e0000b8601783b29090e8ea6600008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8a66a00008b0424833803740bb81cc982b28b5d0490ff138378040f76168b4804b85ceb82b28b5d04eb05e97e0000009090ff138b400483c4048d04c5f9ffffff81e0ff01000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b4108909090e8426a00008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e8968e00008b44240c8944240c8b5c24045883c404e9d1b7ffff8b7208833e0975708b7a04833f03740eff7004b81cc982b28b5d0490ff138b7104833e037410ff7004b81cc982b28b5d04909090ff13ff700453ff720cff7604ff7704bb190000008b44240c9090e8d65d0000b8c4777ab29090e8c66500008b4c240c8b118b1289d383c3028b31891e5089d38b4108eb05e9b403000090e87a690000b8601783b29090e8966500008b4c240c8b118b1289d383c3028b31891e5089d38b4108e852690000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b54240c8b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e882680000bb68e882b2b834c47fb290e89e7b00008b4c24108b118b1289d383c3028b31891e5089d38b4108e856680000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b54240ceb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8c6670000833c240375638b4424108b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8ce6600008b44241083c002ff342489c38b442418909090e8b66600008b44241083c40483c004ff342489c38b442414e89e6600008b44240c83c40483c006ff342489c38b442410e886660000eb62833c240575618b4424108b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e99b000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8d66500006a016a016a016a01eb4a8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b72048937ff70045357ff7208ff710453bb01000000b8601783b29090e8728300006a016a016a016a016a016a016a016a018b44242c83c4208944240c5b58e944b3ffff8b5108833a03740d8b7004b81cc982b28b5d04ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c7062900000053ff7004ff710456bb190000008b44240c909090e84a590000589090e83e6100008b4c24088b118b1289d383c3028b31891e5089d38b4108e8fa640000ff742408bb010000008b4424049090e8ee9100008b44241083c4048944240c8b5c24045883c404e9a2b2ffff8b5104833a03740f8b7004b81cc982b28b5d049090ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c7062900000053ff7004ff710856bb190000008b44240c909090e8a6580000589090e89a6000008b4c24088b118b1289d383c3028b31891e5089d38b4108e8566400008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70003000000ff742404bb01000000e8aa8800008b44240c8944240c8b5c24045883c404e9e5b1ffff8b5104833a03754a8b7108833e0175478b7e08833f097552f640040175518b50048b32833e61755d8b79088b50048b32817f04f8c27fb274258b4704833801745d833803755d83780409755c83780801eb0ae9a2070000e99d070000755953ff7204ff7104ff7604eb0ae98a070000e985070000ff770cff7704bb090000008b442408eb05e96f070000909090ff15c8c75208a8017425f644240401eb0fe91e000000e919000000e914000000740d3b4424047e69eb1ae905000000ff5538ebee53ff7204ff7104ff7604ff770c50eb5c8b442404a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583e8067105ff5538ebf6bb09000000909090ff15e8c75208a801741bf644240801eb05e99c020000740d3b4424087c10eb0ae98d020000ff5538ebee8b44240883f8017572837c240401740f89c1b8681783b28b5d04909090ff138b4c2408f6c1017408a80174042bc87105ff5538ebf783c101f6c101740583e9027105ff5538ebf68b44240c833803740bb81cc982b28b5d0490ff138b55008d52f43b55087303ff5520895500c742fc020000008b5804895a04eb05e9bd000000c70237000000837808017507be01000000eb05beb41783b2515256bb190000008b442420909090e85a560000f6042401750db80c1083b28b5d04909090ff1383c40458e83a5e00008b4c24188b118b1289d383c3028b31891e5089d38b4108e8f6610000833c240175068b442414eb398b45008d40e83b45087303ff5520894500c740fc020000008b0c24894804c7006100000089c18d400cc740fc020000008b54241489500489088b4c242083c404894c241c83c4145be971afffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701610000005051bb0900000090ff15c8c752088b4c240cf6c1017408a80174042bc87105ff5538ebf783c1018b45008d40ec3b45087303ff5520894500c740fc0400000089480cc7400834c47fb28b4c2408894804c700010000008b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b442414894104c701450000008b442410a801750af6442404017503ff55383b44240475068b442418eb4da801740df64424040174062b4424047105ff5538ebf583c0018b55008d52e83b55087303ff5520895500c742fc02000000894204c702610000008d420cc740fc020000008b5c241889580489108b55008d52e83b55087303ff5520895500c742fc02000000894204890a8d420cc740fc020000008950045983c40489088b4c241c894c241c83c4145be926aeffff8b0424833803740bb81cc982b28b5d0490ff138b4c240c833903740f8b5004b81cc982b28b5d049090ff13ff7104ff7004bb190000008b44241c90e83e540000b854eb82b29090e82e5c00008b4c241c8b118b1289d383c3028b31891e5089d38b4108e8ea5f0000837c240c017506833c240b753a8b44240ca801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b54241c8b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e81a5f0000bb68e882b2b834c47fb290e8367200008b4c24208b118b1289d383c3028b31891e5089d38b4108e8ee5e0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b54241ceb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e85e5e0000833c240375638b4424208b088b0989ca83c2088b188913f6442410017410ff7008518b442418ff1588c55208eb498b50088b5c24108b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b44241cff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8665d00008b44241083c002ff342489c38b442418909090e84e5d00008b44241083c40483c004ff342489c38b442414e8365d00008b44240c83c40483c006ff342489c38b442410e81e5d0000eb62833c240575618b4424208b4c2410f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e86e5c00006a016a016a016a018b45008d40e83b45087303ff5520894500c740fc020000008b4c2424894804c7006100000089c18d400cc740fc020000008b54242c89500489088b4c243883c41c894c241c83c4145be9eca9ffff8b5108833a01756d8b7208833e09756a8b7a04833f03740dff7004b81cc982b28b5d04ff138b7104833e037410ff7004b81cc982b28b5d04909090ff13ff700453ff720cff7604ff7704bb190000008b44240c9090e8ea4f0000b854eb82b29090e8da5700008b4c240c8b118b1289d383c302eb0ae9aa030000e9a50300008b31891e5089d38b4108e88a5b0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b54240c8b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e8ba5a0000bb68e882b2b834c47fb290e8d66d00008b4c24108b118b1289d383c3028b31891e5089d38b4108e88e5a0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b54240ceb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8fe590000833c240375638b4424108b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8065900008b44241083c002ff342489c38b442418909090e8ee5800008b44241083c40483c004ff342489c38b442414e8d65800008b44240c83c40483c006ff342489c38b442410e8be580000eb62833c240575618b4424108b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e80e5800006a016a016a016a018b44242c83c4208944240c5b58e9c8a5ffff833a01754e8b75008d76f83b75087303ff5520897500c746fc010000008b7a04893e53ff700456ff7208ff7104538b5a0cb854eb82b2909090e8967500008b44240c8944240c8b5c24045883c404e975a5ffff53ff7004ff7104ff7204bb190000008b44240c909090e8b24b0000b854eb82b29090e8a25300008b4c240c8b118b1289d383c3028b31891e5089d38b4108e85e5700008b442404833803740ab81cc982b28b5d04ff138378040f760e8b4804b85ceb82b28b5d0490ff138b40048d04c5f9ffffff81e0ff01000083c80b8b4c240c8b118b1289d383c3028b31891e5089d38b41089090e8065700008b45008d40f43b45087303ff5520894500c740fc020000005983c404894804c70005000000ff742404bb0100000090e8567b00008b44240c8944240c8b5c24045883c404e991a4ffff8b55008d52ec3b55087303ff5520895500c742fc010000008b710489328d7a08c747fc02000000897704c7070100000053ff700452575653bb03000000b8a0eb82b2e8567400008b44240c8944240c8b5c24045883c404e935a4ffff8b5104833a0175718379080374108b7004b8d01783b28b5d04909090ff1353ff7004526a0b6a0353bb0d000000b807000000e8f28b00008b0424833801740bb8301883b28b5d0490ff138b400483c40483c00281e0ff0100006a076a0bff74240c89c3b8070000009090e8ba8b00008b44240c8944240ceb05e90d0000008b5c24045883c404e9aaa3ffff53ff700452ff7108bb050000008b04249090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0047105ff5538ebf683f801756f8b442404833803740cb81cc982b28b5d049090ff13833803740f8b4804b81cc982b28b5d049090ff13ff7004bb190000008b442410e876490000b85c1883b29090e8665100008b4c24108b118b1289d383c3028b31891e5089d38b4108e822550000833c240f7611b85ceb82b2eb05e99b0300008b5d04ff13833c240f760ab8b8ea82b28b5d04ff138b04248d04c5f9ffffff81e0ff01000081c8810100000b04248b4c241083c4048b118b1289d383c3028b31891e5089d38b410890e8c2540000833c240174598b0424a801740a81f801ffffff7c61eb06f640ff10755ea801740a81f8010100007d68eb06f640ff1074658b4c2404833903740db81cc982b28b5d04909090ff13ff7104bb190000008b442410e896480000b84cec82b2eb05e997040000909090e87e5000008b4c24108b118b12eb0ae903010000e9fe00000089d383c3028b31891e5089d38b4108eb0ae9e8000000e9e3000000e822540000833c240f760db8b8ea82b28b5d04909090ff13b8810100000b04248b4c241083c4048b118b1289d383c3028b31891e5089d38b41089090e8e65300008b44240c8b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c1aeb06f641ff1075128b50088b18b8a8eb82b28b5d04909090ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e846530000eb728b4c2404833903740cb81cc982b28b5d049090ff13ff7104bb190000008b442410e84a470000b854ec82b29090e83a4f00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8f6520000833c240f760db8b8ea82b28b5d04909090ff13b8810100000b04248b4c241083c404eb05e9060300008b118b1289d383c3028b31891e5089d38b4108909090e8b25200008b44240c8b088b0989ca83c2088b188913f60424017413ff7008518b442408909090ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8c25100008b44241083c002ff342489c38b442418909090e8aa5100008b44241083c40483c004ff342489c38b442414e8925100008b44240c83c40483c006ff342489c38b442410e87a51000083c410eb718b442404833803740db81cc982b28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c7012900000051bb190000008b4424109090e856450000589090e84a4d00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e806510000eb05e9380100008b44240c8b088b0989ca83c2088b188913f60424017410ff7008518b442408ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8125000008b44241083c002ff342489c38b442418909090e8fa4f00008b44241083c40483c004ff342489c38b442414e8e24f00008b44240c83c40483c006ff342489c38b442410e8ca4f000083c4108b44241483c4088944240c8b5c24045883c404e9839dffff8b5104833a0374108b7004b81cc982b28b5d04909090ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c7062900000053ff7004ff710856bb190000008b44240c909090e886430000589090e87a4b00008b4c24088b118b1289d383c3028b31891e5089d38b4108e8364f00008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e88a7300008b44240c8944240c8b5c24045883c404e9c59cffff8b5104833a03740e8b7004b81cc982b28b5d0490ff138b7108833e0374108b7804b81cc982b28b5d04909090ff1353ff7004ff7204ff7604bb190000008b44240c90e8d6420000b808ec82b29090e8c64a00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8824e0000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e8224e00008b44240c8944240c8b5c24045883c404e9e19bffff8b5104833a03740e8b7004b81cc982b28b5d0490ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c70637000000837a08017507b901000000eb05b9b41783b253ff70045651bb190000008b44240c909090e8d6410000f6042401750db80c1083b28b5d04909090ff1383c40458e8b64900008b4c24048b118b1289d383c3028b31891e5089d38b4108e8724d00008b44240c8944240c8b5c24045883c404e9319bffff8b5104833a03740e8b7004b81cc982b28b5d0490ff13833a03740f8b7004b81cc982b28b5d049090ff1353ff7004ff7204bb190000008b442408e84a410000b8a0eb82b29090e83a4900008b4c24088b118b1289d383c3028b31891e5089d38b4108e8f64c0000833c2409756f833c240f760bb85ceb82b28b5d0490ff138b04248d04c5f9ffffff81e0ff01000081c88100000083c8098b4c24088b118b1289d383c3028b31891e5089d38b4108e8aa4c0000bb68e882b2b834c47fb290e8c65f00008b4c24088b118b1289d383c3028b31891e5089d38b4108eb05e90800000090e8764c0000eb56833c240f760bb85ceb82b28b5d0490ff13833c240f760ab8b8ea82b28b5d04ff138b04248d04c5f9ffffff81e0ff01000081c8810000000b04248b4c24088b118b1289d383c3028b31891e5089d38b4108e81e4c00008b44240883c4048b088b0989ca83c2028b18891368ff01000089cb8b480889c8909090e8f64b00008b44240c8944240c8b5c24045883c404e9b599ffff8b5104f6c201740a81fa01ffffff7c61eb06f642ff10755ef6c201740a81fa010100007d66eb06f642ff10746353ff700452bb190000008b442408909090e8ca3f0000b86c1883b29090e8ba4700008b4c24088b118b1289d383c3028b31891e5089d38b4108e8764b00008b442408eb0ae9af000000e9aa0000008b0c24f6c101741681f901ffffffeb0ae995000000e9900000007c1deb06f641ff107515f6c101740a81f9010100007c1aeb06f641ff1075128b50088b18b8a8eb82b28b5d04909090ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e8be4a0000eb6853ff700452bb190000008b442408909090e8d23e0000b8741883b29090e8c24600008b4c24088b118b1289d383c3028b31891e5089d38b4108e87e4a00008b4424088b088b0989ca83c2088b188913f60424017418ff7008518b442408909090ff1588c55208eb49e9100100008b50088b1c248b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e88a4900008b44241083c002ff342489c38b442418909090e8724900008b44241083c40483c004ff342489c38b442414e85a4900008b44240c83c40483c006ff342489c38b442410e84249000083c4108b44241083c4048944240c8b5c24045883c404e9fb96ffff53ff7004ff7104bb190000008b442408e83e3d0000b8741883b29090e82e4500008b4c24088b118b1289d383c3028b31891e5089d38b4108e8ea4800008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e83e6d00008b44240c8944240c8b5c24045883c404e97996ffff8b5104833a03740e8b7004b81cc982b28b5d0490ff1353ff7004ff7108ff7204ff7208bb190000008b4424109090e89e3c0000833c24017426b8810000000b04248b4c24108b118b1289d383c3028b31891e5089d38b41089090e846480000b800ec82b283c404909090e85e4400008b4c240c8b118b1289d383c3028b31891e5089d38b4108e81a480000837c2404017506833c240b753a8b442404a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c2409757083f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff01000083c86183c8098b54240c8b1a8b1b89de83c6028b3a893751508b4208e872470000bb68e882b2b834c47fb290e88e5a00008b4c24108b118b12eb05e91700000089d383c3028b31891e5089d38b410890e83e470000eb6a833c240f760bb8b8ea82b28b5d0490ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff01000083c8610b04248b54240c8b1a8b1b89de83c6028b3a893751508b4208909090e8d2460000833c240375638b4424108b088b0989ca83c2088b188913f6442408017410ff7008518b442410ff1588c55208eb498b50088b5c24088b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442414ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8da4500008b44241083c002ff342489c38b442418909090e8c24500008b44241083c40483c004ff342489c38b442414e8aa4500008b44240c83c40483c006ff342489c38b442410e892450000eb62833c240575618b4424108b4c2408f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8e24400006a016a016a016a018b44242883c41c8944240c8b5c24045883c404e99692ffff8b5104833a01757153ff700452bb190000008b44240890e8d2380000b87c1883b29090e8c24000008b4c24088b118b1289d383c3028b31891e5089d38b4108e87e440000bb190000008b4424089090e89a380000b87c1883b29090e88a4000008b4c24088b118b1289d383c3028b31891e5089d38b4108eb05e9de05000090e83e4400008b0424833801740bb85c0c83b28b5d0490ff138b400483c40481e0ff0100006a016a03ff74240c89c3b80700000090e8d27900008b4424048b482c8b0983f901740d8b482cb8fcea82b28b5d04ff138b482cc70103000000bb190000009090e806380000b854eb82b29090e8f63f00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8b24300008b4424048b088b0989ca83c2028b188913688b00000089cb8b480889c89090e88e4300008b4424048b088b0989ca83c2028b1889136a0189cb8b480889c890e86e430000bb190000008b4424049090e88a370000b8a0eb82b29090e87a3f00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8364300008b4424048b088b0989ca83c2028b188913688100000089cb8b480889c89090e8124300008b4424048b088b0989ca83c2028b18891368e901000089cb8b480889c89090e8ee420000bb190000008b4424049090e80a370000b8f0eb82b29090e8fa3e00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8b64200008b4424048b088b0989ca83c2028b188913688b00000089cb8b480889c89090e8924200008b4424048b088b0989ca83c2028b1889136a1189cb8b480889c890e8724200008b4424048b18b884887ab2e88a3e00008b4c24048b118b1289d683c6028b398937535089d38b4108909090e8424200008b4424088b088b0989ca83c2028b1889136a0189cb8b480889c890e822420000588b0083c0fe8b4c24048b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52e83b55087303ff5520895500c742fc02000000894204891a8b411489108d520cc742fc02000000c7420401000000891a52bb1900000089c8e8c2350000b800ec82b29090e8b23d00008b4c24088b118b1289d383c3028b31891e5089d38b4108e86e4100008b4424088b088b0989ca83c2028b18891368ab00000089cb8b480889c89090e84a4100008b4424088b088b0989ca83c2028b1889136a4189cb8b480889c890e82a4100008b5c2408589090e85a4f0000bb190000008b4424049090e83a350000b808ec82b29090e82a3d00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8e64000008b4424048b088b0989ca83c2028b188913688b00000089cb8b480889c89090e8c24000008b4424048b088b0989ca83c2028b1889136a0189cb8b480889c890e8a2400000bb190000008b4424049090e8be340000b8881883b29090e8ae3c00008b4c24048b118b1289d383c3028b31891e5089d38b4108e86a4000008b4424048b088b0989ca83c2028b188913688100000089cb8b480889c89090e8464000008b4424048b088b0989ca83c2028b18891368f901000089cb8b480889c89090e8224000008b4424048b088b0989ca83c2088b188913ff7008516a0589cb8b4424089090e8fe3f00008b042483c0026a0189c38b44240890e8ea3f00008b042483c0046a0189c38b44240890e8d63f00005883c0066a0389c38b442404909090e8c23f0000bb1900000083c4048b442404909090e8da330000b8500c83b29090e8ca3b00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8863f00008b4424048b088b0989ca83c2028b1889136a3189cb8b480889c890e8663f0000bb190000008b4424049090e882330000b808ec82b29090e8723b00008b4c24048b118b1289d383c3028b31891e5089d38b4108e82e3f00008b4424048b088b0989ca83c2028b188913688900000089cb8b480889c89090e80a3f0000bb68e882b2b834c47fb290e8265200008b4c24048b118b1289d383c3028b31891e5089d38b4108e8de3e00008b4424048b088b0989ca83c2028b1889136a0989cb8b480889c890e8be3e0000bb190000008b4424049090e8da320000b8901883b29090e8ca3a00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8863e00008b4424048b482cc701010000008b54240c8954240c89c35883c404e93a8cffff833a03740e8b7004b81cc982b28b5d0490ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c7063d000000837a08017507b901000000eb05b9b41783b253ff70045651bb190000008b44240c909090e832320000f6042401750db80c1083b28b5d04909090ff1383c40458e8123a00008b4c24048b118b1289d383c3028b31891e5089d38b4108e8ce3d00008b44240c8944240c8b5c24045883c404e98d8bffff53ff7004bb190000008b44240490e8d2310000b854eb82b29090e8c23900008b4c24048b118b1289d383c3028b31891e5089d38b4108e87e3d00008b4424048b088b0989ca83c2028b18891368bb00000089cb8b480889c89090e85a3d00008b4424048b088b0989ca83c2028b1889136a0989cb8b480889c890e83a3d0000bb1f0000008b4424049090e8563100008b442404ff308b04248b00b9070000002bc883c10183e10783f9017441bb190000008b44240890e82a310000b864d182b29090e81a3900008b4c24088b118b1289d383c3028b31891e5089d38b4108e8d63c00003b650c7303ff5524eba8bb1900000083c4048b44240490e8e6300000b800ec82b29090e8d63800008b4c24048b118b1289d383c3028b31891e5089d38b4108e8923c00008b4424048b088b0989ca83c2028b1889136a2789cb8b480889c890e8723c00008b44240c8944240c8b5c24045883c404e9318affff53ff7004ff7104bb190000008b4424089090e872300000b89c1883b29090e8623800008b4c24088b118b1289d383c3028b31891e5089d38b4108e81e3c0000833c24097507b857010000eb2c833c24077507b855010000eb1f833c24057507b84b010000eb12833c24037407b84d010000eb05b8490100008b4c240883c4048b118b1289d383c3028b31891e5089d38b4108e8c63b00008b44240c8944240c8b5c24045883c404e98589fffff640040175628b50048b32833e3175408b7d008d7fe83b7d087303ff5520897d00c747fc020000008b4a04894f048b3089378d470cc740fc020000008978048b3289308b7c2404897c2404e93589ffff833e6175658b7904f7c7010000007415f6460401740feb05e98d0300008d7fff037e047105ff5538ebf38b4d008d49e83b4d087303ff5520894d00c741fc02000000897904c701610000008d410cc740fc020000008b7a0489780489088b4c2404894c2404e9cb88fffff641040175138b51048b3af642ff107402f7df8d7c3f01eb038b79048d3cbdfdfffffff7c701000000740783ff017d1beb06f647ff10741353ff700489fbb88c6c7ab2ff1588c75208eb078b480489f85351a801740a81f801ffffff7c62eb06f640ff10755fa801740a81f8010100007d58eb06f640ff10747150bb190000008b442408e89a2e0000b84cec82b29090e88a3600008b4c24088b118b1289d383c3028b31891e5089d38b4108e8463a00008b4424088b088b0989ca83c202eb0fe9c6000000e9c1000000e9bc0000008b188913688901000089cb8b480889c890e8123a00008b442408eb05e99b0000008b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c17eb06f641ff10750f8b50088b18b8a8eb82b28b5d04ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e86e390000eb7150bb190000008b442408909090e8862d0000b854ec82b29090e8763500008b4c24088b118b1289d383c3028b31891e5089d38b4108e8323900008b4424088b088b0989ca83c2028b188913688901000089cb8b480889c89090e80e3900008b4424088b088b0989ca83c2088b188913eb05e927010000f60424017410ff7008518b442408ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e81a3800008b44241083c002ff342489c38b442418909090e8023800008b44241083c40483c004ff342489c38b442414e8ea3700008b44240c83c40483c006ff342489c38b442410e8d237000083c4108b44241083c4048944240c8b5c24045883c404e98b85fffff641040175138b71048b16f646ff107402f7da8d541201eb038b51048d1495fdfffffff6c201740783fa017d1eeb06f642ff10741653ff700489d3b88c6c7ab2909090ff1588c75208eb078b480489d05351a801740a81f801ffffff7c62eb06f640ff10755fa801740a81f8010100007d58eb06f640ff10747150bb190000008b442408e85a2b0000b84cec82b29090e84a3300008b4c24088b118b1289d383c3028b31891e5089d38b4108e8063700008b4424088b088b0989ca83c202eb0fe9c6000000e9c1000000e9bc0000008b188913688901000089cb8b480889c890e8d23600008b442408eb05e99b0000008b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c17eb06f641ff10750f8b50088b18b8a8eb82b28b5d04ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e82e360000eb7150bb190000008b442408909090e8462a0000b854ec82b29090e8363200008b4c24088b118b1289d383c3028b31891e5089d38b4108e8f23500008b4424088b088b0989ca83c2028b188913688901000089cb8b480889c89090e8ce3500008b4424088b088b0989ca83c2088b188913eb05e927010000f60424017410ff7008518b442408ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8da3400008b44241083c002ff342489c38b442418909090e8c23400008b44241083c40483c004ff342489c38b442414e8aa3400008b44240c83c40483c006ff342489c38b442410e89234000083c4108b44241083c4048944240c8b5c24045883c404e94b82ffff83790401754153ff7004ff7304bb190000008b4424089090e886280000b8a41883b29090e8763000008b4c24088b118b1289d383c3028b31891e5089d38b4108e832340000eb7453ff7004ff7304bb090000008b410490ff15c8c75208a80175108b08f640ff107402f7d98d4c0901eb0289c151bb190000008b44240c909090e81e280000b8ac1883b29090e80e3000008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8ca3300008b0424909090ff15a8c55208eb05e969000000909090ff1568c5520881e0ff0100008b4c240c8b118b1289d383c3028b31891e5089d38b41089090e88a33000058c1e80883c801909090ff15a8c552089090ff1568c5520881e0ff0100008b4c24088b118b1289d383c3028b31891e5089d38b41089090e84e33000058c700030000008b44240c8944240c8b5c24045883c404e90681ffff83790403757083790c037507ba0f000000eb1283790c057407ba09000000eb05ba0b0000008b7108833e03740e8b7804b81cc982b28b5d0490ff1353ff7004ff760452bb190000008b44240c909090e80a270000b8b4047db29090e8fa2e00008b4c240c8b118b1289d383c3028b31891e5089d3eb05e96b0000008b410890e8ae320000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e84e320000eb7083790c037507ba0f000000eb1283790c057407ba09000000eb05ba0b0000008b7108833e03740e8b7804b81cc982b28b5d0490ff1353ff7004ff7104ff760452bb190000008b442410e82a260000b8b41883b29090e81a2e00008b4c24108b118b1289d383c3028b31891e5089d3eb05e98c0000008b410890e8ce310000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240c83c4048b118b1289d383c3028b31891e5089d38b4108909090e86e3100008b4424088b088b0989ca83c2028b188913ff342489cb8b480889c8e84e31000083c4048b44240c8944240c8b5c24045883c404e90a7fffff837908037507ba0f000000eb12837908057407ba09000000eb05ba0b0000008b7104833e0374108b7804b81cc982b28b5d04909090ff1353ff7004ff760452bb190000008b44240c909090e812250000b8f4de7eb29090e8022d00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8be300000833c240f760db85ceb82b28b5d04909090ff13837c24040f760db8b8ea82b28b5d04909090ff13588d04c5f9ffffff81e0ff01000081c8810100000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b4108909090e85e3000008b44240c8944240c8b5c24045883c404e91d7effff53ff7004ff7104ff33ff7320ff7304bb1f0000008b4424149090e8562400008b442414ff308b04248b00b9050000002bc883c10183e10783f9017441bb190000008b44241890e82a240000b864d182b29090e81a2c00008b4c24188b118b1289d383c3028b31891e5089d38b4108e8d62f00003b650c7303ff5524eba883c40458c700010000008b4424048b00598901588b005989018b44240c8944240c8b5c24045883c404e9727dffff8b5104833a03756d53ff7004ff7108ff7204bb190000008b44240ce8aa230000b8bc1883b29090e89a2b00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8562f00008b44240c8b088b0989ca83c2028b1889136a0b89cb8b480889c890e8362f00008b45008d40f43b4508730aeb05e928000000ff5520894500c740fc0200000059894804c70005000000ff742408bb0100000090e882530000eb668b7208833e0975638b7a04833f03741153ff7004b81cc982b28b5d04909090ff1353ff7004ff7108ff720cff7704ff7708bb190000008b442414909090e8e6220000833c24017432b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d3eb0ae9c8030000e9740300008b41089090e8822e0000b8bc1883b283c404909090e89a2a00008b4c24108b118b1289d383c3028b31891e5089d38b4108e8562e0000837c2404017506833c240b753a8b442404a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c2409757083f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff01000083c8098b5424108b1a8b1b89de83c6028b3a893751508b4208909090e8ae2d0000bb68e882b2b834c47fb290e8ca4000008b4c24148b118b12eb05e91700000089d383c3028b31891e5089d38b410890e87a2d0000eb66833c240f760bb8b8ea82b28b5d0490ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100000b04248b5424108b1a8b1b89de83c6028b3a893751508b42089090e8122d0000833c240375638b4424148b088b0989ca83c2088b188913f6442408017410ff7008518b442410ff1588c55208eb498b50088b5c24088b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442414ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e81a2c00008b44241083c002ff342489c38b442418909090e8022c00008b44241083c40483c004ff342489c38b442414e8ea2b00008b44240c83c40483c006ff342489c38b442410e8d22b0000eb62833c240575618b4424148b4c2408f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e99d000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8222b00006a016a016a016a01eb4c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b7204893753ff7004ff710857ff720868f0a47ab2538b5a0cb8bc1883b2909090e8ba4800006a016a016a016a016a016a016a0183c41c8b4424088b088b0989ca83c2028b188913ff342489cb8b480889c8909090e8a62a00008b44241083c4048944240c8b5c24045883c404e96278ffff8b5104833a03757653ff7004ff7204ff7108bb190000008b44240ce89a1e0000b8c41883b29090e88a2600008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8462a00008b0424833803740bb81cc982b28b5d0490ff138378040f760e8b4804b85ceb82b28b5d0490ff138b400483c4048d04c5f9ffffffeb05e95700000081e0ff01000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b4108e8e62900008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e83a4e0000eb6c8b7208833e0975698b7a04833f03741153ff7004b81cc982b28b5d04909090ff138b7108833e03741053ff7004b81cc982b28b5d049090ff1353ff7004ff720cff7604ff7704bb190000008b4424109090e88a1d0000b8c41883b29090e87a2500008b4c24108b118b12eb0ae9e8030000e99a03000089d383c3028b31891e5089d38b4108e82a290000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e85a280000bb68e882b2b834c47fb290e8763b00008b4c24148b118b1289d383c3028b31891e5089d38b4108e82e280000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e89e270000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8a62600008b44241083c002ff342489c38b442418909090e88e2600008b44241083c40483c004ff342489c38b442414e8762600008b44240c83c40483c006ff342489c38b442410e85e260000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e997000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8ae2500006a016a016a016a01eb468b7d008d7ff83b7d087303ff5520897d00c747fc010000008b7204893753ff700457ff7208ff7108538b5a0cb8c41883b2e84e4300006a016a016a016a016a016a016a016a0183c4208b44240c8944240c8b5c24045883c404e91a73ffff8b5104833a03756d53ff7004ff7108ff7204bb190000008b44240ce852190000b8881883b29090e8422100008b4c240c8b118b1289d383c3028b31891e5089d38b4108e8fe2400008b44240c8b088b0989ca83c2028b1889136a0b89cb8b480889c890e8de2400008b45008d40f43b4508730aeb05e928000000ff5520894500c740fc0200000059894804c70005000000ff742408bb0100000090e82a490000eb668b7208833e0975638b7a04833f03741153ff7004b81cc982b28b5d04909090ff1353ff7004ff7108ff720cff7704ff7708bb190000008b442414909090e88e180000833c24017432b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d3eb0ae9c8030000e9740300008b41089090e82a240000b8881883b283c404909090e8422000008b4c24108b118b1289d383c3028b31891e5089d38b4108e8fe230000837c2404017506833c240b753a8b442404a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c2409757083f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff01000083c8098b5424108b1a8b1b89de83c6028b3a893751508b4208909090e856230000bb68e882b2b834c47fb290e8723600008b4c24148b118b12eb05e91700000089d383c3028b31891e5089d38b410890e822230000eb66833c240f760bb8b8ea82b28b5d0490ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100000b04248b5424108b1a8b1b89de83c6028b3a893751508b42089090e8ba220000833c240375638b4424148b088b0989ca83c2088b188913f6442408017410ff7008518b442410ff1588c55208eb498b50088b5c24088b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442414ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8c22100008b44241083c002ff342489c38b442418909090e8aa2100008b44241083c40483c004ff342489c38b442414e8922100008b44240c83c40483c006ff342489c38b442410e87a210000eb62833c240575618b4424148b4c2408f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e99d000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8ca2000006a016a016a016a01eb4c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b7204893753ff7004ff710857ff720868f0a47ab2538b5a0cb8881883b2909090e8623e00006a016a016a016a016a016a016a0183c41c8b4424088b088b0989ca83c2088b188913f60424017412ff7008518b4424089090ff1588c55208eb458b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8821f00008b44241083c002ff342489c38b442418909090e86a1f00008b44241083c40483c004ff342489c38b442414e8521f00008b44240c83c40483c006ff342489c38b442410e83a1f00008b44242083c4148944240c8b5c24045883c404e9f66cffff8b532c8b1283fa03740d8b4804b8cc1883b28b5d04ff138b532cc702010000008b742404897424048b480489c8e9c46cffff8b5104833a03756b53ff7004ff7108ff7204bb150000008b44240c9090e8fa1200008b44240cff308b04248b00b9050000002bc883c10183e10783f9017449bb190000008b44241090e8ce120000b864d182b29090e8be1a00008b4c24108b118b1289d383c3028b31891e5089d38b4108eb05e9df00000090e8721e00003b650c7303ff5524eba0bb1900000083c4048b44240c90e882120000b8881883b29090e8721a00008b4c240c8b118b1289d383c3028b31891e5089d38b4108e82e1e00008b44240c8b088b0989ca83c2028b1889136a0b89cb8b480889c890e80e1e00008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742408bb01000000e8624200008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e8324200008b44240c8944240c8b5c24045883c404e96d6bffff53ff70046a01ff720cff7204ff720853bb881883b28b41089090e8923400008b44240c8944240c8b5c24045883c404e9396bffff8b5104833a03756953ff7004ff7204ff7108bb190000008b44240c909090e86e110000b808ec82b29090e85e1900008b4c240c8b118b1289d383c3028b31891e5089d38b4108e81a1d00008b0424833803740bb81cc982b28b5d0490ff138378040f76168b4804b85ceb82b28b5d04eb05e96b0000009090ff138b400483c4048d04c5f9ffffff81e0ff01000083c80b8b4c24088b118b1289d383c3028b31891e5089d38b4108909090e8b61c00008b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff742404bb01000000e80a410000eb6c8b7208833e0975698b7a04833f03741153ff7004b81cc982b28b5d04909090ff138b7108833e03741053ff7004b81cc982b28b5d049090ff1353ff7004ff720cff7604ff7704bb190000008b4424109090e85a100000b808ec82b29090e84a1800008b4c24108b118b12eb0ae9e8030000e99a03000089d383c3028b31891e5089d38b4108e8fa1b0000837c2408017506833c240b753a8b442408a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24040f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc283c8098b5424108b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e82a1b0000bb68e882b2b834c47fb290e8462e00008b4c24148b118b1289d383c3028b31891e5089d38b4108e8fe1a0000eb72837c24040f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424048d14d5f9ffffff81e2ff0100000bc20b04248b542410eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e86e1a0000833c240375638b4424148b088b0989ca83c2088b188913f644240c017410ff7008518b442414ff1588c55208eb498b50088b5c240c8b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442418ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8761900008b44241083c002ff342489c38b442418909090e85e1900008b44241083c40483c004ff342489c38b442414e8461900008b44240c83c40483c006ff342489c38b442410e82e190000eb62833c240575618b4424148b4c240cf6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e997000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e87e1800006a016a016a016a01eb468b7d008d7ff83b7d087303ff5520897d00c747fc010000008b7204893753ff700457ff7208ff7108538b5a0cb808ec82b2e81e3600006a016a016a016a016a016a016a016a0183c4208b44240c8944240c8b5c24045883c404e9ea65ffff8b55008d52ec3b55087303ff5520895500c742fc010000008b710889328d7a08c747fc02000000897704c7070100000053ff70045257ff710453bb03000000b8a0eb82b2909090e8aa3500008b44240c8944240c8b5c24045883c404e98965ffff8b5104833a03740e8b7004b81cc982b28b5d0490ff1353ff7004ff7108ff710cff7204ff7208bb190000008b442414909090e8aa0b0000833c24017426b8810000000b04248b4c24148b118b1289d383c3028b31891e5089d38b41089090e852170000b82c1983b283c404909090e86a1300008b4c24108b118b1289d383c3028b31891e5089d38b4108e826170000837c2404017506833c240b753a8b442404a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c2409757083f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff01000083c8098b5424108b1a8b1b89de83c6028b3a893751508b4208909090e87e160000bb68e882b2b834c47fb290e89a2900008b4c24148b118b12eb05e91700000089d383c3028b31891e5089d38b410890e84a160000eb66833c240f760bb8b8ea82b28b5d0490ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100000b04248b5424108b1a8b1b89de83c6028b3a893751508b42089090e8e2150000833c240375638b4424148b088b0989ca83c2088b188913f6442408017410ff7008518b442410ff1588c55208eb498b50088b5c24088b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442414ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8ea1400008b44241083c002ff342489c38b442418909090e8d21400008b44241083c40483c004ff342489c38b442414e8ba1400008b44240c83c40483c006ff342489c38b442410e8a2140000eb62833c240575618b4424148b4c2408f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e94f000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8f21300006a016a016a016a0183c41c589090ff15a8c552089090ff1568c5520881e0ff0100008b4c24048b118b1289d383c3028b31891e5089d38b41089090e8b21300008b44240c8944240c8b5c24045883c404e97161ffff8b5104833a03740e8b7004b81cc982b28b5d0490ff1381faf0a47ab27416833a017461833a037561837a04017560837a0801755f53ff7004bb190000008b44240490e882070000b8341983b29090e8720f00008b4c24048b118b1289d383c3028b31891e5089d38b4108e82e1300008b4424048b088b0989ca83c2028b1889136a03eb14e920000000e91b000000e916000000e91100000089cb8b480889c8909090e8f6120000eb5081fab4c27fb2744d833a017411833a03750c837a04077506837a0801744881fa9c9a7ab27440833a017411833a03750c837a04037506837a0801742a81fadcc27fb27422833a017463833a037563eb0ae9ac010000e90c000000837a0405756c837a0801756b53ff7004ff7204bb190000008b442408909090e8a2060000b82c1983b29090e8920e00008b4c24088b118b1289d383c3028b31891e5089d38b4108e84e120000833c240feb0ae96b000000e966000000760db8b8ea82b28b5d04909090ff13b881010000eb0ae94b000000e9460000000b04248b4c240883c4048b118b1289d383c3028b31891e5089d38b41089090e8fa1100008b4424048b088b0989ca83c2028b1889136a0389cb8b480889c890e8da110000eb7053ff7004ff7204bb190000008b44240890e8ee050000b85c387fb29090e8de0d00008b4c24088b118b1289d383c3028b31891e5089d38b4108e89a110000833c240f760db8b8ea82b28b5d04909090ff13b8810100000b04248b4c240883c4048b118b1289d383c3028b31891e50eb05e97000000089d38b4108909090e8561100008b4424048b088b0989ca83c2088b188913ff7008516a0389cb8b4424089090e8321100008b042483c0026a0189c38b44240890e81e1100008b042483c0046a0189c38b44240890e80a1100005883c0066a0189c38b442404909090e8f610000083c4048b44240c8944240c8b5c24045883c404e9b25effff8b51048b72108b3681fef9ffff07756b8b73308b368b7b30c707010000008b4b048b0983f9017558ff7004ff720cb8f0de82b2e8ce0c00008b0b8b0989ca83c2028b3b89175356ff730457508b430889cb9090e8861000008b44240c8b088b0989ca83c2028b1889136a0189cb8b480889c890e86610000058eb0ae9be000000e9920000008b0083c0fe8b4c24088b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52f43b55087303ff5520895500c742fc02000000894204891a8b411489105ac702030000008b75008d76f43b75087303ff5520897500c746fc020000005a895604891eeb07ff7004ff720c538b4424048b0083f801740d89c389f09090e8a253000089c68b4424048930eb58ff70046a015356bb190000008b44240490e8b60300008b4424148b008b0c24f6c101740783f9017d1beb06f641ff1074135089cbb88c6c7ab2909090ff1588c75208eb0589c289c8528b0c24f6c101740c83f9017d1eeb0be9e3020000f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c8525983c408f6c1017408a80174042bc87105ff5538ebf783c10189c8a801740583e8047105ff5538ebf6a801740a81f801ffffff7c62eb06f640ff10755fa801740a81f8010100007d58eb06f640ff10745f50bb190000008b44240490e8f2020000b8f0de82b29090e8e20a00008b4c24048b118b1289d383c3028b31891e5089d38b4108e89e0e00008b4424048b0c24f6c1017420eb0fe9a3000000e99e000000e99900000081f901ffffff7c22eb0be98a000000f641ff107515f6c101740a81f9010100007c18eb06f641ff1075108b50088b18b8a8eb82b28b5d0490ff138b108b1289d383c3028b30891ef6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c89090e8ea0d0000eb6c51bb190000008b442404909090e802020000b83ce382b29090e8f20900008b4c24048b118b1289d383c3028b31891e5089d38b4108e8ae0d000058a801740583e80a7105ff5538ebf68b0c248b118b1289d383c3088b31891ea8017414ff710852909090ff1588c55208eb4ce91401000089c38b03f643ff107402f7d88d440001ff710852539090ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8ae0c00008b44241083c002ff342489c38b442418909090e8960c00008b44241083c40483c004ff342489c38b442414e87e0c00008b44240c83c40483c006ff342489c38b442410e8660c000083c40c83c4048b442410894424105b83c40458e9225affffb801000000c20400909000000000eca50000|@10003,2097151,@1302|17,0,$9817+34 550,0,@9818 572,0,12 582,1,@9821 593,0,64 626,1,@9833 631,0,@9878 642,1,@9831 670,1,@9833 698,0,100 710,1,@9833 715,0,@9879 720,0,@8817 726,1,@9880 754,1,@9833 767,0,@9882 778,0,96 810,1,@9833 835,0,255 850,1,@9833 872,0,191 886,1,@9833 925,0,@9885 942,0,1 975,0,4 986,0,I108 1001,0,@9818 1018,0,12 1030,1,@9821 1035,0,@9888 1042,1,@9831 1070,1,@9833 1081,0,@9889 1142,1,@9833 1174,1,@9833 1179,0,0 1218,0,@9818 1237,0,@9818 1254,0,12 1266,1,@9821 1271,0,@9892 1278,1,@9831 1306,1,@9833 1333,0,-128 1353,0,128 1368,0,1 1375,0,2 1382,0,0 1399,0,@9889 1425,0,0 1432,0,1 1439,0,2 1446,0,3 1514,1,@9833 1519,0,@9879 1524,0,@8817 1530,1,@9880 1558,1,@9833 1571,0,@9889 1588,0,@9882 1613,0,0 1620,0,1 1627,0,2 1634,0,3 1702,1,@9833 1746,0,I90 1778,0,I91 1784,0,@5215 1794,0,I115 1805,0,@5215 1818,0,I80 1827,0,24 1834,0,I86 1842,0,I89 1854,0,16 1866,0,I86 1874,0,I89 1886,0,8 1898,0,I86 1906,0,I89 1926,0,I89 1950,1,@9833 1974,1,@9833 1998,1,@9833 2022,1,@9833 2049,0,-128 2070,0,128 2090,0,@9893 2198,1,@9833 2220,0,@9818 2233,0,12 2242,1,@9821 2247,0,@9896 2254,1,@9831 2282,1,@9833 2293,0,@9889 2358,1,@9833 2390,1,@9833 2401,0,@5528 2406,1,@9831 2438,1,@9833 2470,1,@9833 2513,0,1 2595,0,0 2603,0,12 2610,1,@9821 2615,0,@9897 2622,1,@9831 2650,1,@9833 2672,0,85 2686,1,@9833 2718,1,@9833 2730,1,@9865 2743,0,@9818 2757,0,12 2766,1,@9821 2771,0,@9898 2778,1,@9831 2806,1,@9833 2817,0,@9889 2882,1,@9833 2914,1,@9833 2953,0,@9899 2970,0,1 2986,0,@9818 3006,0,12 3018,1,@9821 3023,0,@8629 3030,1,@9831 3058,1,@9833 3069,0,@9882 3082,0,216 3118,1,@9833 3131,0,@9818 3145,0,12 3154,1,@9821 3159,0,@9901 3166,1,@9831 3194,1,@9833 3205,0,@9889 3266,1,@9833 3298,1,@9833 3311,0,@9818 3325,0,12 3334,1,@9821 3339,0,@9896 3346,1,@9831 3374,1,@9833 3385,0,@9889 3446,1,@9833 3478,1,@9833 3489,0,@5757 3494,1,@9831 3526,1,@9833 3558,1,@9833 3601,0,1 3683,0,0 3698,0,@9818 3714,0,12 3722,1,@9821 3727,0,@9896 3734,1,@9831 3762,1,@9833 3773,0,@9889 3834,1,@9833 3866,1,@9833 3877,0,@5757 3882,1,@9831 3914,1,@9833 3946,1,@9833 3989,0,1 4071,0,0 4086,1,@9865 4091,0,12 4102,1,@9821 4107,0,@9897 4114,1,@9831 4142,1,@9833 4164,0,85 4178,1,@9833 4210,1,@9833 4226,1,@9865 4239,0,@9818 4253,0,12 4262,1,@9821 4267,0,@9898 4274,1,@9831 4302,1,@9833 4313,0,@9889 4378,1,@9833 4410,1,@9833 4445,0,-128 4466,0,128 4487,0,7 4500,0,6 4513,0,5 4526,0,4 4554,0,0 4566,0,1 4582,0,@9818 4609,0,12 4618,1,@9821 4629,0,64 4662,1,@9833 4667,0,@9902 4678,1,@9831 4706,1,@9833 4733,0,-128 4753,0,128 4768,0,1 4775,0,2 4782,0,0 4800,0,@9889 4825,0,0 4832,0,1 4839,0,2 4846,0,3 4914,1,@9833 4919,0,@9879 4924,0,@8817 4930,1,@9880 4958,1,@9833 4972,0,@9889 4988,0,@9882 5013,0,0 5020,0,1 5027,0,2 5034,0,3 5102,1,@9833 5146,0,I90 5178,0,I91 5184,0,@5215 5194,0,I115 5205,0,@5215 5218,0,I80 5227,0,24 5234,0,I86 5242,0,I89 5254,0,16 5266,0,I86 5274,0,I89 5286,0,8 5298,0,I86 5306,0,I89 5326,0,I89 5350,1,@9833 5374,1,@9833 5398,1,@9833 5422,1,@9833 5449,0,-128 5470,0,128 5490,0,@9893 5598,1,@9833 5627,0,-128 5648,0,128 5668,0,@9893 5766,1,@9833 5779,0,7 5792,0,6 5805,0,5 5818,0,4 5831,0,0 5838,0,1 5854,0,@9818 5881,0,12 5898,1,@9821 5909,0,64 5942,1,@9833 5947,0,@9903 5958,1,@9831 5986,1,@9833 6013,0,-128 6033,0,128 6048,0,1 6055,0,2 6062,0,0 6080,0,@9889 6105,0,0 6112,0,1 6119,0,2 6126,0,3 6194,1,@9833 6199,0,@9879 6204,0,@8817 6210,1,@9880 6238,1,@9833 6252,0,@9889 6268,0,@9882 6293,0,0 6300,0,1 6307,0,2 6314,0,3 6382,1,@9833 6426,0,I90 6458,0,I91 6464,0,@5215 6474,0,I115 6485,0,@5215 6498,0,I80 6507,0,24 6514,0,I86 6522,0,I89 6534,0,16 6546,0,I86 6554,0,I89 6566,0,8 6578,0,I86 6586,0,I89 6606,0,I89 6630,1,@9833 6654,1,@9833 6678,1,@9833 6702,1,@9833 6729,0,-128 6750,0,128 6770,0,@9893 6878,1,@9833 6926,0,I90 6958,0,I91 6964,0,@5215 6974,0,I115 6985,0,@5215 6994,0,I80 7003,0,24 7010,0,I86 7018,0,I89 7030,0,16 7042,0,I86 7050,0,I89 7062,0,8 7074,0,I86 7082,0,I89 7102,0,I89 7126,1,@9833 7150,1,@9833 7174,1,@9833 7198,1,@9833 7230,0,7 7243,0,6 7256,0,5 7269,0,4 7282,0,0 7289,0,1 7305,0,@8817 7311,0,@9903 7322,1,@9904 7357,0,-128 7378,0,128 7399,0,7 7412,0,6 7425,0,5 7438,0,4 7466,0,0 7478,0,1 7494,0,@9818 7515,0,12 7526,1,@9821 7531,0,@9902 7538,1,@9831 7566,1,@9833 7577,0,@9889 7597,0,@9882 7662,1,@9833 7680,0,-128 7701,0,128 7721,0,@9893 7822,1,@9833 7835,0,7 7848,0,6 7861,0,5 7874,0,4 7887,0,0 7894,0,1 7910,0,@9818 7931,0,12 7950,1,@9821 7955,0,@9903 7962,1,@9831 7990,1,@9833 8001,0,@9889 8021,0,@9882 8086,1,@9833 8126,0,I90 8158,0,I91 8164,0,@5215 8174,0,I115 8185,0,@5215 8194,0,I80 8203,0,24 8210,0,I86 8218,0,I89 8230,0,16 8242,0,I86 8250,0,I89 8262,0,8 8274,0,I86 8282,0,I89 8302,0,I89 8326,1,@9833 8350,1,@9833 8374,1,@9833 8398,1,@9833 8435,0,@9818 8459,0,12 8470,1,@9821 8475,0,@9903 8482,1,@9831 8510,1,@9833 8521,0,7 8534,0,6 8547,0,5 8560,0,4 8573,0,0 8580,0,1 8592,0,@9889 8611,0,@9882 8674,1,@9833 8708,0,2 8717,0,0 8722,1,@9907 8774,0,3 8786,0,0 8802,0,@9818 8825,0,@9818 8852,0,12 8862,1,@9821 8870,1,@9831 8898,1,@9833 8925,0,-128 8945,0,128 8960,0,1 8967,0,2 8974,0,0 8992,0,@9889 9017,0,0 9024,0,1 9031,0,2 9038,0,3 9106,1,@9833 9111,0,@9879 9116,0,@8817 9122,1,@9880 9150,1,@9833 9164,0,@9889 9180,0,@9882 9205,0,0 9212,0,1 9219,0,2 9226,0,3 9294,1,@9833 9338,0,I90 9370,0,I91 9376,0,@5215 9386,0,I115 9397,0,@5215 9410,0,I80 9419,0,24 9426,0,I86 9434,0,I89 9446,0,16 9458,0,I86 9466,0,I89 9478,0,8 9490,0,I86 9498,0,I89 9518,0,I89 9542,1,@9833 9566,1,@9833 9590,1,@9833 9614,1,@9833 9641,0,-128 9662,0,128 9682,0,@9893 9790,1,@9833 9847,0,3 9859,0,0 9875,0,@9818 9897,0,@9818 9921,0,12 9930,1,@9821 9938,1,@9831 9966,1,@9833 9977,0,@9889 9997,0,@9882 10062,1,@9833 10093,0,@9818 10117,0,@9818 10140,0,12 10150,1,@9821 10172,0,240 10186,1,@9833 10191,0,@5383 10198,1,@9831 10226,1,@9833 10231,0,@9910 10238,1,@9831 10266,1,@9833 10277,0,2 10284,0,0 10304,0,@9889 10329,0,0 10336,0,1 10343,0,2 10350,0,3 10418,1,@9833 10423,0,@9879 10428,0,@8817 10434,1,@9880 10462,1,@9833 10478,0,@9889 10498,0,@9882 10525,0,0 10532,0,1 10539,0,2 10546,0,3 10614,1,@9833 10654,1,@9833 10674,1,@9833 10694,1,@9833 10714,1,@9833 10754,1,@9833 10794,1,@9911 10827,0,12 10838,1,@9821 10843,0,@9897 10850,1,@9831 10878,1,@9833 10900,0,85 10914,1,@9833 10982,1,@9833 11017,0,67108860 11027,0,@9936 11069,0,2 11082,0,12 11094,1,@9821 11102,1,@9831 11130,1,@9833 11162,1,@9833 11208,0,1 11344,0,12 11354,1,@9821 11359,0,@9939 11366,1,@9831 11394,1,@9833 11402,0,$9817+11414 11485,0,0 11492,0,1 11499,0,2 11506,0,3 11513,0,6 11520,0,7 11527,0,4 11534,0,5 11546,0,@9889 11602,1,@9833 11636,0,2 11645,0,0 11650,1,@9907 11679,0,$9817+11690 11761,0,0 11768,0,1 11775,0,2 11782,0,3 11789,0,6 11796,0,7 11803,0,4 11810,0,5 11826,0,@9818 11852,0,12 11862,1,@9821 11873,0,64 11906,1,@9833 11911,0,@9939 11922,1,@9831 11950,1,@9833 11977,0,-128 11997,0,128 12012,0,1 12019,0,2 12026,0,0 12044,0,@9889 12069,0,0 12076,0,1 12083,0,2 12090,0,3 12158,1,@9833 12163,0,@9879 12168,0,@8817 12174,1,@9880 12202,1,@9833 12216,0,@9889 12232,0,@9882 12257,0,0 12264,0,1 12271,0,2 12278,0,3 12346,1,@9833 12390,0,I90 12422,0,I91 12428,0,@5215 12438,0,I115 12449,0,@5215 12462,0,I80 12471,0,24 12478,0,I86 12486,0,I89 12498,0,16 12510,0,I86 12518,0,I89 12530,0,8 12542,0,I86 12550,0,I89 12570,0,I89 12594,1,@9833 12618,1,@9833 12642,1,@9833 12666,1,@9833 12693,0,-128 12714,0,128 12734,0,@9893 12842,1,@9833 12890,0,@9940 12905,0,$9817+12918 12989,0,0 12996,0,1 13003,0,2 13010,0,3 13017,0,6 13024,0,7 13031,0,4 13038,0,5 13065,0,3 13070,1,@9943 13107,0,@9945 13130,0,3 13138,1,@9943 13173,0,@9183 13206,0,6 13211,0,3 13218,1,@9943 13226,0,17 13234,0,I124 13252,0,0 13257,0,3 13262,1,@9943 13272,0,@9948 13304,0,0 13309,0,3 13314,1,@9943 13324,0,@9949 13363,0,0 13368,0,3 13382,1,@9943 13395,0,0 13400,0,3 13406,1,@9943 13421,0,12 13430,1,@9821 13435,0,@9950 13442,1,@9831 13470,1,@9833 13502,1,@9833 13543,0,2 13552,0,0 13558,1,@9907 13600,0,@9951 13630,0,3 13638,1,@9943 13675,0,@9818 13696,0,12 13706,1,@9821 13717,0,64 13750,1,@9833 13755,0,@9950 13766,1,@9831 13794,1,@9833 13805,0,2 13812,0,0 13838,0,0 13845,0,1 13852,0,2 13859,0,3 13902,1,@9833 13907,0,@9879 13912,0,@8817 13918,1,@9880 13954,1,@9833 13969,0,@9882 13997,0,0 14004,0,1 14011,0,2 14018,0,3 14062,1,@9833 14102,1,@9833 14122,1,@9833 14142,1,@9833 14162,1,@9833 14202,1,@9833 14237,0,12 14246,1,@9821 14251,0,@7817 14258,1,@9831 14286,1,@9833 14318,1,@9833 14323,0,@9879 14328,0,@8817 14334,1,@9880 14362,1,@9833 14367,0,12 14378,1,@9821 14383,0,@9953 14390,1,@9831 14418,1,@9833 14450,1,@9833 14455,0,@9879 14460,0,@8817 14466,1,@9880 14494,1,@9833 14528,0,@9954 14551,0,12 14562,1,@9821 14567,0,@9955 14574,1,@9831 14602,1,@9833 14624,0,224 14638,1,@9833 14675,0,@9956 14692,0,2 14699,0,3 14726,0,3 14734,1,@9943 14766,0,2 14773,0,3 14789,0,@9818 14816,0,12 14826,1,@9821 14837,0,64 14870,1,@9833 14875,0,@9950 14886,1,@9831 14914,1,@9833 14941,0,-128 14961,0,128 14976,0,1 14983,0,2 14990,0,0 15008,0,@9889 15033,0,0 15040,0,1 15047,0,2 15054,0,3 15122,1,@9833 15127,0,@9879 15132,0,@8817 15138,1,@9880 15166,1,@9833 15180,0,@9889 15196,0,@9882 15221,0,0 15228,0,1 15235,0,2 15242,0,3 15310,1,@9833 15354,0,I90 15386,0,I91 15392,0,@5215 15402,0,I115 15413,0,@5215 15426,0,I80 15435,0,24 15442,0,I86 15450,0,I89 15462,0,16 15474,0,I86 15482,0,I89 15494,0,8 15506,0,I86 15514,0,I89 15534,0,I89 15558,1,@9833 15582,1,@9833 15606,1,@9833 15630,1,@9833 15657,0,-128 15678,0,128 15698,0,@9893 15806,1,@9833 15850,0,$9817+15862 15930,0,0 15939,0,4 15949,0,1 15958,0,4 15968,0,7 15977,0,7 15987,0,0 15996,0,5 16006,0,6 16015,0,5 16025,0,3 16034,0,6 16049,0,6 16065,0,7 16080,0,2 16089,0,7 16109,0,3 16114,1,@9943 16161,0,$9817+16174 16223,0,2 16230,0,6 16237,0,7 16244,0,5 16251,0,4 16258,0,3 16274,0,@9818 16294,0,12 16306,1,@9821 16311,0,@8629 16318,1,@9831 16346,1,@9833 16357,0,@9889 16377,0,@9882 16442,1,@9833 16486,1,@9958 16516,0,12 16526,1,@9821 16531,0,@9896 16538,1,@9831 16566,1,@9833 16588,0,101 16602,1,@9833 16634,1,@9833 16645,0,@5528 16650,1,@9831 16682,1,@9833 16714,1,@9833 16757,0,1 16839,0,0 16847,0,12 16854,1,@9821 16859,0,@9897 16866,1,@9831 16894,1,@9833 16916,0,85 16930,1,@9833 16962,1,@9833 16974,1,@9865 17022,1,@9865 17094,1,@9969 17137,0,@9971 17163,0,@9818 17185,0,@9818 17211,0,12 17222,1,@9821 17227,0,@9892 17234,1,@9831 17270,1,@9833 17297,0,-128 17317,0,128 17332,0,1 17339,0,2 17346,0,0 17364,0,@9889 17389,0,0 17396,0,1 17403,0,2 17410,0,3 17478,1,@9833 17483,0,@9879 17488,0,@8817 17494,1,@9880 17522,1,@9833 17536,0,@9889 17552,0,@9882 17577,0,0 17584,0,1 17591,0,2 17598,0,3 17666,1,@9833 17710,0,I90 17742,0,I91 17748,0,@5215 17758,0,I115 17769,0,@5215 17782,0,I80 17791,0,24 17798,0,I86 17806,0,I89 17818,0,16 17830,0,I86 17838,0,I89 17850,0,8 17862,0,I86 17870,0,I89 17890,0,I89 17914,1,@9833 17938,1,@9833 17962,1,@9833 17986,1,@9833 18013,0,-128 18034,0,128 18054,0,@9893 18162,1,@9833 18192,0,@9892 18198,1,@9905 18255,0,12 18266,1,@9821 18271,0,@9974 18278,1,@9831 18306,1,@9833 18319,0,@9818 18339,0,@9889 18406,1,@9833 18440,0,2 18449,0,0 18454,1,@9907 18499,0,@9818 18521,0,@9818 18547,0,12 18558,1,@9821 18563,0,@5383 18570,1,@9831 18606,1,@9833 18611,0,@9974 18618,1,@9831 18646,1,@9833 18673,0,-128 18693,0,128 18708,0,1 18715,0,2 18722,0,0 18740,0,@9889 18765,0,0 18772,0,1 18779,0,2 18786,0,3 18854,1,@9833 18859,0,@9879 18864,0,@8817 18870,1,@9880 18898,1,@9833 18912,0,@9889 18928,0,@9882 18953,0,0 18960,0,1 18967,0,2 18974,0,3 19042,1,@9833 19086,0,I90 19118,0,I91 19124,0,@5215 19134,0,I115 19145,0,@5215 19158,0,I80 19167,0,24 19174,0,I86 19182,0,I89 19194,0,16 19206,0,I86 19214,0,I89 19226,0,8 19238,0,I86 19246,0,I89 19266,0,I89 19290,1,@9833 19314,1,@9833 19338,1,@9833 19362,1,@9833 19389,0,-128 19410,0,128 19430,0,@9893 19538,1,@9833 19594,0,0 19599,0,@9974 19606,1,@9905 19656,0,@9818 19697,0,20 19710,0,12 19722,1,@9821 19730,1,@9831 19758,1,@9833 19767,0,0 19778,1,@9912 19818,0,@9818 19861,0,20 19874,0,12 19886,1,@9821 19894,1,@9831 19922,1,@9833 19956,0,1 19965,0,0 19970,1,@9907 20046,0,@8796 20118,0,4 20138,0,I108 20226,0,0 20233,0,1 20257,0,4 20266,0,I109 20325,0,@9975 20387,0,@9818 20436,0,27 20447,0,0 20454,0,@9978 20462,0,12 20474,1,@9821 20485,0,@9959 20502,1,@9831 20530,1,@9833 20578,0,48 20652,0,48 20659,0,4 20666,0,I108 20725,0,@8817 20738,0,0 20778,0,34 20866,0,48 20963,0,@9818 20986,0,@9818 21004,0,12 21014,1,@9821 21019,0,@9888 21026,1,@9831 21054,1,@9833 21081,0,-128 21101,0,128 21116,0,1 21123,0,2 21130,0,0 21148,0,@9889 21173,0,0 21180,0,1 21187,0,2 21194,0,3 21262,1,@9833 21267,0,@9879 21272,0,@8817 21278,1,@9880 21306,1,@9833 21320,0,@9889 21336,0,@9882 21361,0,0 21368,0,1 21375,0,2 21382,0,3 21450,1,@9833 21494,0,I90 21526,0,I91 21532,0,@5215 21542,0,I115 21553,0,@5215 21566,0,I80 21575,0,24 21582,0,I86 21590,0,I89 21602,0,16 21614,0,I86 21622,0,I89 21634,0,8 21646,0,I86 21654,0,I89 21674,0,I89 21698,1,@9833 21722,1,@9833 21746,1,@9833 21770,1,@9833 21797,0,-128 21818,0,128 21838,0,@9893 21946,1,@9833 21991,0,48 22064,0,@9818 22085,0,@9818 22111,0,12 22122,1,@9821 22127,0,@9888 22134,1,@9831 22174,1,@9833 22201,0,-128 22221,0,128 22236,0,1 22243,0,2 22250,0,0 22268,0,@9889 22293,0,0 22300,0,1 22307,0,2 22314,0,3 22382,1,@9833 22387,0,@9879 22392,0,@8817 22398,1,@9880 22426,1,@9833 22440,0,@9889 22456,0,@9882 22481,0,0 22488,0,1 22495,0,2 22502,0,3 22570,1,@9833 22614,0,I90 22646,0,I91 22652,0,@5215 22662,0,I115 22673,0,@5215 22686,0,I80 22695,0,24 22702,0,I86 22710,0,I89 22722,0,16 22734,0,I86 22742,0,I89 22754,0,8 22766,0,I86 22774,0,I89 22794,0,I89 22818,1,@9833 22842,1,@9833 22866,1,@9833 22890,1,@9833 22917,0,-128 22938,0,128 22958,0,@9893 23066,1,@9833 23146,0,@9888 23154,1,@9905 23190,0,12 23202,1,@9821 23207,0,@9888 23214,1,@9831 23242,1,@9833 23256,0,@9818 23275,0,@9889 23330,1,@9833 23367,0,2 23376,0,0 23382,1,@9907 23451,0,0 23464,0,1 23469,0,@9892 23474,1,@9905 23517,0,@9980 23540,0,6 23545,0,3 23550,1,@9943 23563,0,@9983 23599,0,3 23606,1,@9943 23647,0,2 23658,0,I110 23685,0,0 23692,0,1 23730,0,@9818 23750,0,@9818 23765,0,12 23774,1,@9821 23779,0,@9985 23786,1,@9831 23814,1,@9833 23825,0,@9889 23848,0,@9882 23910,1,@9833 23929,0,-128 23949,0,128 23973,0,@9818 23989,0,12 23998,1,@9821 24003,0,@9902 24018,1,@9831 24070,1,@9833 24081,0,@9882 24094,0,192 24130,1,@9833 24148,0,-128 24169,0,128 24189,0,@9893 24290,1,@9833 24306,0,@9818 24321,0,12 24330,1,@9821 24335,0,@9903 24342,1,@9831 24370,1,@9833 24381,0,@9882 24394,0,192 24438,1,@9833 24478,0,I90 24510,0,I91 24516,0,@5215 24526,0,I115 24537,0,@5215 24546,0,I80 24555,0,24 24562,0,I86 24570,0,I89 24582,0,16 24594,0,I86 24602,0,I89 24614,0,8 24626,0,I86 24634,0,I89 24654,0,I89 24678,1,@9833 24702,1,@9833 24726,1,@9833 24750,1,@9833 24769,0,@9818 24813,0,20 24819,0,12 24830,1,@9821 24838,1,@9831 24866,1,@9833 24910,0,I90 24942,0,I91 24948,0,@5215 24958,0,I115 24969,0,@5215 24978,0,I80 24987,0,24 24994,0,I86 25002,0,I89 25014,0,16 25026,0,I86 25034,0,I89 25046,0,8 25058,0,I86 25066,0,I89 25086,0,I89 25110,1,@9833 25134,1,@9833 25158,1,@9833 25182,1,@9833 25225,0,@9818 25269,0,20 25282,0,12 25294,1,@9821 25302,1,@9831 25330,1,@9833 25364,0,2 25373,0,0 25378,1,@9907 25415,0,@9818 25437,0,@9818 25460,0,12 25470,1,@9821 25475,0,@9898 25482,1,@9831 25510,1,@9833 25521,0,@9889 25541,0,@9882 25606,1,@9833 25643,0,@9818 25685,0,27 25696,0,0 25703,0,@9978 25714,0,12 25726,1,@9821 25737,0,@9959 25754,1,@9831 25782,1,@9833 25819,0,@9818 25838,0,@9818 25857,0,12 25866,1,@9821 25871,0,@9892 25878,1,@9831 25906,1,@9833 25923,0,@9889 25982,1,@9833 25987,0,@9879 25992,0,@8817 25998,1,@9880 26034,1,@9833 26047,0,@9889 26064,0,@9882 26122,1,@9833 26147,0,255 26162,1,@9833 26197,0,-128 26218,0,128 26238,0,12 26250,1,@9821 26255,0,@9986 26262,1,@9831 26290,1,@9833 26320,0,-128 26353,0,128 26373,0,@9893 26474,1,@9833 26486,0,12 26498,1,@9821 26503,0,@9987 26510,1,@9831 26538,1,@9833 26578,0,I90 26614,0,I91 26620,0,@5215 26630,0,I115 26641,0,@5215 26650,0,I80 26659,0,24 26666,0,I86 26674,0,I89 26686,0,16 26698,0,I86 26706,0,I89 26718,0,8 26730,0,I86 26738,0,I89 26758,0,I89 26782,1,@9833 26806,1,@9833 26830,1,@9833 26854,1,@9833 26893,0,12 26902,1,@9821 26907,0,@9987 26914,1,@9831 26942,1,@9833 26976,0,2 26985,0,0 26990,1,@9907 27027,0,@9818 27051,0,12 27062,1,@9821 27073,0,64 27106,1,@9833 27111,0,@9897 27122,1,@9831 27150,1,@9833 27177,0,-128 27197,0,128 27212,0,1 27219,0,2 27226,0,0 27252,0,0 27259,0,1 27266,0,2 27273,0,3 27318,1,@9833 27323,0,@9879 27328,0,@8817 27334,1,@9880 27370,1,@9833 27383,0,@9882 27409,0,0 27416,0,1 27423,0,2 27430,0,3 27478,1,@9833 27522,0,I90 27554,0,I91 27560,0,@5215 27570,0,I115 27581,0,@5215 27594,0,I80 27603,0,24 27610,0,I86 27618,0,I89 27630,0,16 27642,0,I86 27650,0,I89 27662,0,8 27674,0,I86 27682,0,I89 27702,0,I89 27726,1,@9833 27750,1,@9833 27774,1,@9833 27798,1,@9833 27825,0,-128 27846,0,128 27866,0,@9893 27974,1,@9833 28024,0,12 28034,1,@9821 28039,0,@9988 28046,1,@9831 28074,1,@9833 28079,0,12 28090,1,@9821 28095,0,@9988 28102,1,@9831 28138,1,@9833 28151,0,@9951 28184,0,3 28190,1,@9943 28212,0,@9885 28226,0,1 28231,0,12 28238,1,@9821 28243,0,@9888 28250,1,@9831 28278,1,@9833 28300,0,69 28314,1,@9833 28346,1,@9833 28351,0,12 28362,1,@9821 28367,0,@9892 28374,1,@9831 28402,1,@9833 28424,0,64 28438,1,@9833 28460,0,244 28474,1,@9833 28479,0,12 28490,1,@9821 28495,0,@9896 28502,1,@9831 28530,1,@9833 28552,0,69 28566,1,@9833 28598,1,@9833 28609,0,@5528 28614,1,@9831 28646,1,@9833 28678,1,@9833 28721,0,1 28803,0,0 28811,0,12 28818,1,@9821 28823,0,@9897 28830,1,@9831 28858,1,@9833 28880,0,85 28894,1,@9833 28926,1,@9833 28938,1,@9865 28943,0,12 28954,1,@9821 28959,0,@9898 28966,1,@9831 28994,1,@9833 29016,0,69 29030,1,@9833 29062,1,@9833 29067,0,12 29078,1,@9821 29083,0,@9989 29090,1,@9831 29118,1,@9833 29140,0,64 29154,1,@9833 29176,0,252 29190,1,@9833 29226,1,@9833 29246,1,@9833 29266,1,@9833 29286,1,@9833 29291,0,12 29306,1,@9821 29311,0,@9950 29318,1,@9831 29346,1,@9833 29378,1,@9833 29383,0,12 29394,1,@9821 29399,0,@9898 29406,1,@9831 29434,1,@9833 29456,0,68 29470,1,@9833 29475,0,@9879 29480,0,@8817 29486,1,@9880 29514,1,@9833 29546,1,@9833 29551,0,12 29562,1,@9821 29567,0,@9990 29574,1,@9831 29602,1,@9833 29615,0,0 29647,0,@9818 29689,0,30 29700,0,0 29707,0,@9978 29718,0,12 29730,1,@9821 29741,0,@9959 29758,1,@9831 29786,1,@9833 29816,0,12 29826,1,@9821 29831,0,@9888 29838,1,@9831 29866,1,@9833 29888,0,93 29902,1,@9833 29934,1,@9833 29939,0,15 29950,1,@9821 29966,0,3 29984,0,12 29994,1,@9821 29999,0,@9830 30006,1,@9831 30034,1,@9833 30049,0,12 30062,1,@9821 30067,0,@9897 30074,1,@9831 30102,1,@9833 30134,1,@9833 30167,0,12 30178,1,@9821 30183,0,@9991 30190,1,@9831 30218,1,@9833 30229,0,171 30242,0,170 30255,0,165 30268,0,166 30275,0,164 30306,1,@9833 30482,0,48 30580,0,@5215 30586,0,I106 30605,0,-128 30625,0,128 30641,0,12 30650,1,@9821 30655,0,@9902 30662,1,@9831 30690,1,@9833 30729,0,196 30742,1,@9833 30767,0,-128 30788,0,128 30808,0,@9893 30906,1,@9833 30914,0,12 30926,1,@9821 30931,0,@9903 30938,1,@9831 30966,1,@9833 30988,0,196 31002,1,@9833 31046,0,I90 31078,0,I91 31084,0,@5215 31094,0,I115 31105,0,@5215 31114,0,I80 31123,0,24 31130,0,I86 31138,0,I89 31150,0,16 31162,0,I86 31170,0,I89 31182,0,8 31194,0,I86 31202,0,I89 31222,0,I89 31246,1,@9833 31270,1,@9833 31294,1,@9833 31318,1,@9833 31409,0,@5215 31418,0,I106 31437,0,-128 31457,0,128 31473,0,12 31482,1,@9821 31487,0,@9902 31494,1,@9831 31522,1,@9833 31561,0,196 31574,1,@9833 31599,0,-128 31620,0,128 31640,0,@9893 31738,1,@9833 31746,0,12 31758,1,@9821 31763,0,@9903 31770,1,@9831 31798,1,@9833 31820,0,196 31834,1,@9833 31878,0,I90 31910,0,I91 31916,0,@5215 31926,0,I115 31937,0,@5215 31946,0,I80 31955,0,24 31962,0,I86 31970,0,I89 31982,0,16 31994,0,I86 32002,0,I89 32014,0,8 32026,0,I86 32034,0,I89 32054,0,I89 32078,1,@9833 32102,1,@9833 32126,1,@9833 32150,1,@9833 32195,0,12 32206,1,@9821 32211,0,@9992 32218,1,@9831 32246,1,@9833 32260,0,4 32270,0,I108 32298,0,12 32310,1,@9821 32315,0,@9993 32322,1,@9831 32350,1,@9833 32362,0,I91 32378,0,I89 32414,1,@9833 32430,0,I91 32438,0,I89 32474,1,@9833 32481,0,1 32519,0,7 32532,0,4 32539,0,5 32555,0,@9818 32574,0,12 32586,1,@9821 32591,0,@7817 32598,1,@9831 32634,1,@9833 32645,0,@9889 32665,0,@9882 32730,1,@9833 32743,0,7 32756,0,4 32763,0,5 32779,0,@9818 32801,0,12 32810,1,@9821 32815,0,@9994 32822,1,@9831 32858,1,@9833 32869,0,@9889 32889,0,@9882 32954,1,@9833 32986,1,@9833 33021,0,7 33034,0,4 33041,0,5 33057,0,@9818 33078,0,12 33090,1,@9821 33095,0,@8497 33102,1,@9831 33130,1,@9833 33141,0,@9889 33161,0,@9882 33226,1,@9833 33267,0,15 33278,1,@9821 33294,0,2 33312,0,12 33322,1,@9821 33327,0,@9830 33334,1,@9831 33362,1,@9833 33382,0,0 33441,0,12 33450,1,@9821 33455,0,@9995 33462,1,@9831 33490,1,@9833 33522,1,@9833 33563,0,2 33572,0,0 33578,1,@9907 33605,0,@9818 33634,0,12 33646,1,@9821 33657,0,64 33702,1,@9833 33707,0,@9995 33718,1,@9831 33746,1,@9833 33773,0,-128 33793,0,128 33808,0,1 33815,0,2 33822,0,0 33848,0,0 33855,0,1 33862,0,2 33869,0,3 33914,1,@9833 33919,0,@9879 33924,0,@8817 33930,1,@9880 33966,1,@9833 33979,0,@9882 34005,0,0 34012,0,1 34019,0,2 34026,0,3 34070,1,@9833 34114,0,I90 34146,0,I91 34152,0,@5215 34162,0,I115 34173,0,@5215 34186,0,I80 34195,0,24 34202,0,I86 34210,0,I89 34222,0,16 34234,0,I86 34242,0,I89 34254,0,8 34266,0,I86 34274,0,I89 34294,0,I89 34318,1,@9833 34342,1,@9833 34366,1,@9833 34390,1,@9833 34417,0,-128 34438,0,128 34458,0,@9893 34566,1,@9833 34621,0,@5643 34630,0,@9995 34638,1,@9905 34690,1,@9833 34737,0,12 34746,1,@9821 34751,0,@9996 34758,1,@9831 34786,1,@9833 34799,0,@9818 34819,0,@9889 34882,1,@9833 34916,0,2 34925,0,0 34930,1,@9907 34957,0,@9818 34982,0,@9818 35007,0,12 35018,1,@9821 35023,0,@9996 35030,1,@9831 35070,1,@9833 35097,0,-128 35117,0,128 35132,0,1 35139,0,2 35146,0,0 35164,0,@9889 35189,0,0 35196,0,1 35203,0,2 35210,0,3 35278,1,@9833 35283,0,@9879 35288,0,@8817 35294,1,@9880 35322,1,@9833 35336,0,@9889 35352,0,@9882 35377,0,0 35384,0,1 35391,0,2 35398,0,3 35466,1,@9833 35510,0,I90 35542,0,I91 35548,0,@5215 35558,0,I115 35569,0,@5215 35582,0,I80 35591,0,24 35598,0,I86 35606,0,I89 35618,0,16 35630,0,I86 35638,0,I89 35650,0,8 35662,0,I86 35670,0,I89 35690,0,I89 35714,1,@9833 35738,1,@9833 35762,1,@9833 35786,1,@9833 35813,0,-128 35834,0,128 35854,0,@9893 35962,1,@9833 36021,0,@9996 36026,1,@9905 36089,0,12 36098,1,@9821 36103,0,@9989 36110,1,@9831 36138,1,@9833 36170,1,@9833 36211,0,2 36220,0,0 36226,1,@9907 36253,0,@9818 36282,0,12 36294,1,@9821 36305,0,64 36350,1,@9833 36355,0,@9989 36366,1,@9831 36394,1,@9833 36421,0,-128 36441,0,128 36456,0,1 36463,0,2 36470,0,0 36496,0,0 36503,0,1 36510,0,2 36517,0,3 36562,1,@9833 36567,0,@9879 36572,0,@8817 36578,1,@9880 36614,1,@9833 36627,0,@9882 36653,0,0 36660,0,1 36667,0,2 36674,0,3 36718,1,@9833 36762,0,I90 36794,0,I91 36800,0,@5215 36810,0,I115 36821,0,@5215 36834,0,I80 36843,0,24 36850,0,I86 36858,0,I89 36870,0,16 36882,0,I86 36890,0,I89 36902,0,8 36914,0,I86 36922,0,I89 36942,0,I89 36966,1,@9833 36990,1,@9833 37014,1,@9833 37038,1,@9833 37065,0,-128 37086,0,128 37106,0,@9893 37214,1,@9833 37269,0,@5643 37278,0,@9989 37286,1,@9905 37342,0,I90 37374,0,I91 37380,0,@5215 37390,0,I115 37401,0,@5215 37410,0,I80 37419,0,24 37426,0,I86 37434,0,I89 37446,0,16 37458,0,I86 37466,0,I89 37478,0,8 37490,0,I86 37498,0,I89 37518,0,I89 37542,1,@9833 37566,1,@9833 37590,1,@9833 37614,1,@9833 37656,0,@9997 37670,0,0 37711,0,10 37722,1,@9821 37738,0,2 37756,0,12 37766,1,@9821 37771,0,@9830 37778,1,@9831 37814,1,@9833 37829,0,12 37842,1,@9821 37847,0,@9989 37854,1,@9831 37882,1,@9833 37914,1,@9833 37948,0,2 37957,0,0 37962,1,@9907 37996,0,2 38005,0,0 38010,1,@9907 38052,0,@9989 38062,1,@9904 38106,0,12 38118,1,@9821 38123,0,@9898 38130,1,@9831 38158,1,@9833 38171,0,@9818 38191,0,@9889 38258,1,@9833 38292,0,2 38301,0,0 38306,1,@9907 38333,0,@9818 38358,0,@9818 38383,0,12 38394,1,@9821 38399,0,@9898 38406,1,@9831 38446,1,@9833 38473,0,-128 38493,0,128 38508,0,1 38515,0,2 38522,0,0 38540,0,@9889 38565,0,0 38572,0,1 38579,0,2 38586,0,3 38654,1,@9833 38659,0,@9879 38664,0,@8817 38670,1,@9880 38698,1,@9833 38712,0,@9889 38728,0,@9882 38753,0,0 38760,0,1 38767,0,2 38774,0,3 38842,1,@9833 38886,0,I90 38918,0,I91 38924,0,@5215 38934,0,I115 38945,0,@5215 38958,0,I80 38967,0,24 38974,0,I86 38982,0,I89 38994,0,16 39006,0,I86 39014,0,I89 39026,0,8 39038,0,I86 39046,0,I89 39066,0,I89 39090,1,@9833 39114,1,@9833 39138,1,@9833 39162,1,@9833 39189,0,-128 39210,0,128 39230,0,@9893 39338,1,@9833 39397,0,@9898 39402,1,@9905 39490,0,0 39505,0,1 39510,0,@9892 39518,1,@9905 39555,0,@9818 39582,0,12 39594,1,@9821 39605,0,64 39638,1,@9833 39643,0,@10000 39654,1,@9831 39682,1,@9833 39709,0,-128 39729,0,128 39744,0,1 39751,0,2 39758,0,0 39784,0,0 39791,0,1 39798,0,2 39805,0,3 39850,1,@9833 39855,0,@9879 39860,0,@8817 39866,1,@9880 39902,1,@9833 39915,0,@9882 39941,0,0 39948,0,1 39955,0,2 39962,0,3 40006,1,@9833 40050,0,I90 40082,0,I91 40088,0,@5215 40098,0,I115 40109,0,@5215 40122,0,I80 40131,0,24 40138,0,I86 40146,0,I89 40158,0,16 40170,0,I86 40178,0,I89 40190,0,8 40202,0,I86 40210,0,I89 40230,0,I89 40254,1,@9833 40278,1,@9833 40302,1,@9833 40326,1,@9833 40353,0,-128 40374,0,128 40394,0,@9893 40502,1,@9833 40522,0,I91 40530,0,I89 40566,1,@9833 40603,0,@9818 40615,0,@5643 40648,0,12 40658,1,@9821 40663,0,@10001 40670,1,@9831 40698,1,@9833 40754,1,@9833 40762,0,@8791 40792,0,@5592 40822,0,@8794 40870,0,12 40882,1,@9821 40887,0,@10000 40894,1,@9831 40922,1,@9833 40945,0,@9882 40958,0,192 41006,1,@9833 41038,1,@9833 41052,0,12 41062,1,@9821 41067,0,@8629 41074,1,@9831 41102,1,@9833 41113,0,@9882 41126,0,192 41170,1,@9833 41206,1,@9833 41226,1,@9833 41246,1,@9833 41266,1,@9833 41304,0,67108860 41320,0,0 41341,0,@9858 41346,1,@9831 41378,1,@9833 41410,1,@9833 41465,0,1 41537,0,1 41598,1,@10002 41620,0,12 41630,1,@9821 41665,0,@5215 41674,0,I106 41715,0,@5215 41722,0,I106 41780,0,-128 41800,0,128 41816,0,12 41826,1,@9821 41831,0,@9858 41838,1,@9831 41866,1,@9833 41901,0,-128 41927,0,128 41947,0,@9893 42046,1,@9833 42054,0,12 42066,1,@9821 42071,0,@9863 42078,1,@9831 42106,1,@9833 42154,0,I90 42190,0,I91 42196,0,@5215 42206,0,I115 42217,0,@5215 42226,0,I80 42238,0,24 42246,0,I86 42254,0,I89 42266,0,16 42278,0,I86 42286,0,I89 42298,0,8 42310,0,I86 42318,0,I89 42338,0,I89 42362,1,@9833 42386,1,@9833 42410,1,@9833 42434,1,@9833 42463,0,0 9818:O4|@4608,@5398,@9820,@9819 9819:O5|@8955,498,0,498,0 9820:S30|6765745265673a206e6f7420612067656e6572616c207265676973746572 9821:D3,244|3b650c7303ff55248b48048b0983f90175458b48308b0983f901742a8b5004c70201000000ff704cff30ff70205053ff70305289cbe8ce0000008b442404c70001000000eb20ff704cff30ff702050536a01ff7004eb0fff704cff30ff702050536a01ff70048b04248b00ff74240889c38b442410e8821000005883c408c700010000008b04248b48308b0983f901741c8b5004c70201000000ff703089cb9090e86200000058c700010000008b44240883c4048b005989018b4424048b00a80175188b0c248b098b10890a8b480489c83b650c7303ff5524ebe483c40458c70001000000b801000000c39000000000f0000000|@9877,2097151,@1287|33,0,0 54,1,@9822 64,0,0 118,1,@9856 128,0,0 150,0,0 162,1,@9822 169,0,0 225,0,0 230,0,0 9822:D3,1156|3b650c7303ff5524f6c30175648b0b8b098339017560ff730450ff7008ff7104ff7020ff308b5c240c8b442408e8660400008b0c248b09f6c101740783f9017d1beb06f641ff1074135089cbb88c6c7ab2909090ff1588c75208eb0589c289c8528b4c240cf6c101741183f9017d25eb10e900040000e90c020000f641ff1074135089cbb88c6c7ab2909090ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c101f6c101740583e9087105ff5538ebf68b4424048b008b5424088902833c2401740db808d182b28b5d04909090ff1383f9017572b864d182b29090e8060600008b4c240c83e902505089cb8b442418e8ca090000ff34248b5c24148b442418e8ba0900008b44241083c002ff342489c38b442418909090e8a20900008b44241083c004ff342489c38b442418909090e88a0900008b44241083c006ff342489c38b442418eb05e907000000e86e090000eb74f6c101740b89c890ff1588c55208eb408b01f641ff107402f7d88d4400015190ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb21000000eb05e98d0200008b442404909090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24208b442424909090e8920800008b44241c83c002ff342489c38b442424909090e87a0800008b44241c83c40483c004ff342489c38b442420e8620800008b44241883c40483c006ff342489c38b44241ce84a08000083c404eb638b50088b128b7a04beffffff002377fc8d7436018d34b5fdffffff3b7104770e89c6b8b8d082b28b5d049090ff138b7104d1ee0fb634378d743601f7c601000000740a81fe010100007c36eb06f646ff10752ef7c601000000740f81eefe010000eb05e9770100007105ff5538ebecf7c601000000740583ee027105ff5538ebf68b108b12f6c201740783fa017d2aeb06f642ff107422ff730450ff7008ff7020ff30ff71045689d3b88c6c7ab2909090ff1588c75208eb1489c789d0ff730457ff7708ff7720ff37ff7104568b4c2404f6c101740783f9017d1aeb06f641ff1074125089cbb88c6c7ab29090ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c101f6c101740583e9027105ff5538ebf68b4424088b008b54240c8902f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c15eb06f641ff10750db87cd882b28b5d04909090ff13833c2401740ab8c0d882b28b5d04ff13f6c101740783f9017d1aeb06f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b01f641ff107402f7d88d440001eb0289c881e0ff010000508b5c24088b4424149090e8820600008b5c241483c4045883c40ce81a0a00006a016a016a016a016a016a018b5c241c83c4185883c404e98afbffffb801000000c30000000080040000|@9855,2097151,@1280|46,1,@9823 77,0,@5215 86,0,I106 133,0,@5215 142,0,I106 209,0,@9827 227,0,@9830 234,1,@9831 254,1,@9833 270,1,@9833 294,1,@9833 318,1,@9833 346,1,@9833 362,0,I90 386,0,I91 392,0,@5215 402,0,I115 413,0,@5215 422,0,I80 434,0,24 442,0,I86 450,0,I89 462,0,16 482,0,I86 490,0,I89 502,0,8 514,0,I86 522,0,I89 542,0,I89 566,1,@9833 590,1,@9833 614,1,@9833 638,1,@9833 656,0,8388607 682,0,@9824 716,0,128 817,0,@5215 826,0,I106 878,0,@5215 886,0,I106 953,0,-128 974,0,128 989,0,@9846 1008,0,@9849 1094,1,@9833 1110,1,@9851 1143,0,0 9823:D3,404|3b650c7303ff55248b0b8b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff1389c2d1ea0fb614168d54120189c783c7028b0b528b5104beffffff002372fc8d7436018d34b5fdffffff3bfe720e89c6b8b8d082b28b5d049090ff13d1ef0fb63c3a8d7c3f0189c683c6048b0b578b7904baffffff002357fc8d5412018d1495fdffffff3bf2720c89c2b8b8d082b28b5d04ff13d1ee0fb634378d74360183c0068b1b8b4b04baffffff002351fc8d5412018d1495fdffffff3bc2720f89c2b8b8d082b28b5d04909090ff13d1e80fb604018d440001a801740a81f8010100007c19eb06f640ff107511a801740881e8000200007105ff5538ebf356bb010200009090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf350bb010200008b44240890ff15c8c75208a8017410f644240c0174098d40ff0344240c7105ff5538ebf250bb010002008b442404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf383c414c39090900000000090010000|@9826,2097151,@1275|14,0,8388607 39,0,@9824 73,0,8388607 98,0,@9824 131,0,8388607 156,0,@9824 184,0,8388607 209,0,@9824 237,0,128 270,0,256 278,0,I108 307,0,256 318,0,I108 349,0,65536 362,0,I108 9824:O4|11,@4879,0,@9825 9825:O5|@9719,144,0,144,0 9826:S25|5838364f5554505554434f444528292e676574333273283229 9827:O4|@4608,@5398,@9829,@9828 9828:O5|@8955,1080,0,1080,0 9829:S39|7265616c6c794669784272616e636865733a206a756d7020616c72656164792070617463686564 9830:O1|25 9831:D3,928|8b08ba7ad182b28d548afcffe290e931010000909090e98b010000909090e989010000909090e972020000909090e970020000909090e973020000909090e9fb000000909090e969020000909090e967020000909090e965020000909090e963020000909090e961020000909090e95f020000909090e95d020000909090e95b020000909090e959020000909090e957020000909090e955020000909090e953020000909090e951020000909090e94f020000909090e95b020000909090e959020000909090e957020000909090e955020000909090e953020000909090e951020000909090e94f020000909090e95b020000909090e959020000909090e957020000909090e963020000909090e961020000909090e95f020000909090e95d020000909090e95b020000909090e959020000909090e957020000909090b807010000c3837804057507b90f000000eb398378040b7507b90d000000eb2c837804097507b90b000000eb1f837804037507b909000000eb12837804077407b901000000eb05b9030000008d0ccdf9ffffff81e1ff0100008d49ff03480881e1ff01000089c8c3b8d1010000c38b4804ba26d382b28d548afcffe2e96f000000909090e96e000000909090e96d000000909090e96c000000909090e96b000000909090e96a000000909090e969000000909090e968000000909090e967000000909090e984000000909090e90b000000909090e903000000909090837804157407b801000000eb46b803000000eb44b80f000000eb42b805000000eb40b809000000eb3eb81f000000eb3cb81b000000eb3fb819000000eb38b81d000000eb31b80d000000eb2ab807000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b80b00000081c0e000000081e0ff010000c3b81f000000c3b9b10100000b480489c8c3b803010000c3b801010000c3b8a3010000c3b883010000c3b8a7010000c3b8ef010000c3b8ed010000c3b8ff010000c3b8d3010000c3b8d7010000c3b81b010000c3b883010000c3b88d010000c3b811010000c3b9710100008d49ff03480481e1ff01000089c8c3b88f010000c3b817010000c3b813010000c3b86d010000c3b821010000c3b81f010000c3b9b10000008d49ff03480481e1ff01000089c8c3b8d1000000c3b8d5000000c3b9a10000008d49ff03480481e1ff01000089c8c3b8e7010000c3b887010000c3b885010000c3b83d010000c3b8f3010000c3b851010000c3b80f010000c3000000009c030000|@9832,7,@1276|3,0,$9831+14 319,0,131 331,0,7 344,0,6 357,0,5 370,0,4 383,0,0 390,0,1 423,0,232 432,0,$9831+442 545,0,0 552,0,1 559,0,7 566,0,2 573,0,4 580,0,15 587,0,13 594,0,12 601,0,14 608,0,6 615,0,3 652,0,5 670,0,15 676,0,216 687,0,129 693,0,128 699,0,209 705,0,193 711,0,211 717,0,247 723,0,246 729,0,255 735,0,233 741,0,235 747,0,141 753,0,193 759,0,198 765,0,136 771,0,184 791,0,199 797,0,139 803,0,137 809,0,182 815,0,144 821,0,143 827,0,88 847,0,104 853,0,106 859,0,80 879,0,243 885,0,195 891,0,194 897,0,158 903,0,249 909,0,168 915,0,135 9832:S26|5838364f5554505554434f444528292e6f70546f496e74283129 9833:D3,440|8b08833903750e89c2b810d782b28b5d049090ff138b7104baffffff002356fc8d54120189d78d3cbdfdffffff3bdf731b8b442404d1ebd1e888041e8d4400018d5c1b01b801000000c20400833901740c50b870d782b28b5d0490ff1350b80700000083e801d1eaf7e283c0018d54120189dac1ea0283ca0183c2023bc2770289d083f801740881f8ffffff01720e89c2b8381c7cb28b5d049090ff1389c1b80100000089fa8d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015f8b45008d40ec3b45087303ff5520894500c740fc02000000897804c700010000008d480cc741fc0100004089018b34248b36833e01750a538b19833b017411eb015389c3b8c8d782b28b5d049090ff138b09508b4604bbffffff002358fc8d5c1b01578b7904b8ffffff002347fc8d4400018d1c9dfdffffff8d0485fdffffff2bc283c0013bda720583f801730ab830d882b28b5d04ff138b76048b410489d1d1e9f3a48d7c3f018d7436018d4c09018b442414598b542404d1ead1e88804118d4400018d5412018b4c24085a83c4088911b801000000c204009000000000b4010000|@9845,63,@1277|10,0,@9834 25,0,8388607 69,0,0 83,0,@9837 95,0,3 137,0,16777215 146,0,@6934 160,0,0 242,0,0 282,0,@9840 300,0,8388607 316,0,8388607 356,0,@9843 424,0,0 9834:O4|@4608,@5398,@9836,@9835 9835:O5|@9719,148,0,148,0 9836:S42|637365675365743a2063616e2774206368616e6765206c6f636b656420636f646520736567656d656e74 9837:O4|@4608,@5398,@9839,@9838 9838:O5|@9719,157,0,157,0 9839:S34|637365675365743a2063616e277420657874656e6420636f6465207365676d656e74 9840:O4|@4608,@5398,@9842,@9841 9841:O5|@9719,134,0,134,0 9842:S49|63736567436f70795365673a2063616e206f6e6c7920636f7079206265747765656e206279746520736567656d656e7473 9843:O4|11,@4879,0,@9844 9844:O5|@9719,130,0,130,0 9845:S21|434f44455f41525241592e63736567536574283329 9846:O4|@4608,@5398,@9848,@9847 9847:O5|@8955,1064,0,1064,0 9848:S14|6a756d7020746f6f206c61726765 9849:O4|@4608,@5398,@9829,@9850 9850:O5|@8955,1067,0,1067,0 9851:D3,56|3b650c7303ff55248b4b34c701f9ffff078b53148b128b73145189c389d0909090e8260000008906b801000000c390900000000034000000|@9854,31,@1279|13,0,67108860 34,1,@9852 41,0,0 9852:D3,152|3b650c7303ff5524a80175658b088b0983390375613b590475108b4c2404894c24048b4004e9d6ffffff8b5424048b123b510476098b5424048b4904890aff30ff7424088b40049090e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400e9100000008b4c2404894c24048b4004e97affffffb801000000c2040090900000000094000000|@9853,15,@1278|135,0,0 9853:S44|5838364f5554505554434f444528292e72656d6f76654c6162656c28322972656d6f7665456e747279283129 9854:S30|5838364f5554505554434f444528292e72656d6f76654c6162656c283229 9855:S36|5838364f5554505554434f444528292e7265616c6c794669784272616e63686573283229 9856:D3,760|3b650c7303ff552483fb017507b9ff000000eb05b9c90000008b50148b12be01000000f6c201751ff7c601000000740583c6027105ff5538ebf68b52043b650c7303ff5524ebdc89f250ff7014ff7034ff30ff7030ff7004535189d3b80b000000909090ff15c8c75208b9ff000000f6c1017408a80174042bc87105ff5538ebf783c101f6c101740df604240174073b0c247e0ceb05ff5538ebf48b0424eb0289c8a801740df64424240174062b4424247105ff5538ebf583c001837c24040174088b4c24108b09eb098b4c24108b0983c1048b54241883c4048b125051ff7424288b5c241489d090e81e0200008b4c24148b0981f9f9ffff07745c8b4c24108b098b5424148b12f6c101740783f9017d1aeb06f641ff107412505289cbb88c6c7ab290ff1588c75208eb0689c389c853528b0c24f6c101740783f9017d1eeb06f641ff1074165089cbb88c6c7ab290ff1588c75208eb0ae93700000089c289c8525983c404f6c1017408a80174042bc87105ff5538ebf783c101f6c101740ff64424040174083b4c24047e65eb08ff5538ebf350eb60837c2408017407b801000000eb578b44240cc70003000000b8f0de82b290e846f5ffff8b4c24208b118b1289d383c3028b31891e5089d38b4108e802f9ffff8b4424208b088b0989ca83c2028b1889136a0189cb8b480889c8eb0fe9eb000000e9e6000000e995000000e8d2f8ffff8b4424148b0083c0fe8b4c24208b55008d52ec3b55087303ff5520895500c742fc02000000894204c702030000008d5a0cc743fc0100004089138b51348b123bc273058b513489028b41148b008b55008d52f43b55087303ff5520895500c742fc02000000894204891a8b411489108b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089188b4c2418c701f9ffff078b54241c8b1250ff742404ff74241cff742434ff742414ff742434518b5c242c89d0909090e8c20100008b4c242089018b5c24245883c4245983c40451e932060000b80100000083c424c2040090909000000000f4020000|@9876,2097151,@1286|14,0,127 21,0,100 31,0,0 93,0,5 102,0,I108 107,0,127 234,1,@9857 246,0,67108860 287,0,@5215 294,0,I106 331,0,@5215 338,0,I106 415,0,0 427,0,1 432,0,@9858 438,1,@9831 466,1,@9833 514,1,@9833 560,0,1 656,0,0 668,0,67108860 710,1,@9859 734,1,@9865 739,0,0 9857:D3,356|3b650c7303ff5524a8017559ff3053ff742410ff7424108b4004909090e8deffffff8b4c24048b0983390375678b14248b12f6c201751e8b1a3b5c24047507be03000000eb148b5a0489da3b650c7303ff5524ebddbe0100000083fe01740b83c408c20800e9e80000008b542410f6c201740783fa017d21eb06f642ff10741950ff710489d3b88c6c7ab290ff1588c75208eb0de9b300000089c389d053ff71048b0c24f6c101740783f9017d1aeb06f641ff1074125089cbb88c6c7ab29090ff1588c75208eb0589c289c8525983c404f6c1017408a80174042bc87105ff5538ebf783c101f6c101740ef604240174088d49ff030c247105ff5538ebf3b8c9000000a801740df64424100174062b4424107105ff5538ebf583c001f6c1017408a80174043bc8eb05ff5538ebf77e1558a801740583c00a7105ff5538ebf683c408c208005883c408c2080083c408c20800b801000000c2080090900000000060010000|@6729,2097151,@1281|64,0,1 86,0,0 135,0,@5215 142,0,I106 186,0,@5215 194,0,I106 255,0,100 339,0,0 9858:O1|15 9859:D3,996|3b650c7303ff5524a8017562ff3053ff742420ff742420ff742420ff742420ff742420ff7424208b4004909090e8ceffffff8b4c24048b09833903740c89c2b8f0e282b28b5d04ff138b14248b12f6c20175258b1a3b5c24047507be03000000eb1b8b5a0489da3b650c730aeb05e95f030000ff5524ebd6be0100000083fe017462837c24200174608b54241c8b12f6c201740783fa017d1beb06f642ff10741350ff710489d3b88c6c7ab2ff1588c75208eb0889c389d053ff71048b0c24f6c101740783f9017d25eb06f641ff10741d5089cbb88c6c7ab2909090ff1588c75208eb0fe95a000000e94f00000089c289c85259f6c1017408a80174042bc87105ff5538ebf783c101b8ff000000a801740df64424280174062b4424287105ff5538ebf583c001f6c1017408a80174043bc8eb05ff5538ebf77c0eeb3750ff7104eb0650ff7104eb2b8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c240c890883c410c218008b4424248b00a801740783f8017d17eb06f640ff10740f89c3b88c6c7ab29090ff1588c752088b0c24f6c101740783f9017d19eb06f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c101b8c9000000a801740df64424200174062b4424207105ff5538ebf583c001f6c1017408a80174043bc8eb05ff5538ebf77f6d8b4424248b00a801740783f8017d16eb06f640ff10740e89c3b88c6c7ab290ff1588c752088b0c24f6c101740783f9017d19eb06f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c101f6c1017416eb05e914000000f644241c0174083b4c241c7f07eb71ff5538ebf38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c240c890889c38b442418909090e8bae8ffffb83ce382b29090e8a2efffff8b4c24188b118b1289d383c3028b31891e5089d38b4108e85ef3ffff8b4424188b088b0989ca83c2088b18eb05e98f0000008913ff7008516a0189cb8b442408909090e832f3ffff8b042483c0026a0189c38b44240890e81ef3ffff8b042483c0046a0189c38b44240890e80af3ffff5883c0066a0189c38b442404909090e8f6f2ffff8b44242883c4048b0083c0f88b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701010000008b44240c890883c4045883c408c218008b4424148b003b042476098b4424148b0c2489088b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c240c890883c410c21800b801000000c21800909000000000e0030000|@9864,2097151,@1282|64,0,@9860 92,0,1 121,0,0 168,0,@5215 174,0,I106 213,0,@5215 222,0,I106 266,0,127 398,0,@5215 406,0,I106 435,0,@5215 442,0,I106 476,0,100 551,0,@5215 558,0,I106 587,0,@5215 594,0,I106 686,0,0 706,1,@9822 711,0,@9863 718,1,@9831 746,1,@9833 790,1,@9833 810,1,@9833 830,1,@9833 850,1,@9833 895,0,0 979,0,0 9860:O4|@4608,@5398,@9862,@9861 9861:O5|@8955,1227,0,1227,0 9862:S23|4c6f6e67206a756d7020696e206c6162656c206c697374 9863:O1|14 9864:S50|5838364f5554505554434f444528292e636865636b4272616e63684c697374283329636f6e766572744c6162656c73283129 9865:D3,144|3b650c7303ff552483f8017506b801000000c38b4b308b0983f90174178b73308b7b20ff7304ff335389cb9090e872000000eb0cff7304ff33538b73308b7b2056578b4c240c8b0951ff742404ff742418ff7424148b5c241ce89e0000008b4c24108b093b0c24740d83c4043b650c7303ff5524ebcc83c4085983c40c8901b801000000c3909090000000008c000000|@9875,2097151,@1285|14,0,0 46,1,@9866 90,1,@9867 128,0,0 9866:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1283| 9867:D3,660|3b650c7303ff5524a80175658b088b0983390175618b13f6c201740783fa017d23eb06f642ff10741b53ff7004ff7104ff3089d3b88c6c7ab2909090ff1588c75208eb0d8b70048b3889d05356ff7104578b4c2404f6c101740783f9017d25eb06f641ff10741d5089cbb88c6c7ab2eb0ae90d020000e9c300000090ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c10183f90975568b44240c8b008b4c241c8b093bc1770db824e782b28b5d04909090ff138b44240483c0fe8b4c240c89018b442418c700010000008b54241c8b5c24148954241c89442418895c241489cb83c4085883c404e906ffffffff74241cff74241cff74241c8b5c24188b442414909090e8eafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c410c20c008b13f6c201740783fa017d22eb06f642ff10741a53ff7004ff30ff710489d3b88c6c7ab29090ff1588c75208eb0d8b70048b3889d0535657ff71048b0c24f6c101740783f9017d1aeb06f641ff1074125089cbb88c6c7ab29090ff1588c75208eb0589c289c85259f6c1017408a80174042bc87105ff5538ebf783c10183f903756d8b44240c8b008b4c241c8b093bc174628b44240c8b008b4c241c8b093bc1770db874e782b28b5d04909090ff138b042483c0fe8b4c240c89018b5c24148b042490e86af2ffff8b442418c700010000008b4c241c8b542414894c241c89442418895424148b5c240c83c408eb0ae90e000000e9090000005883c404e9c0fdffffff74241cff74241cff74241c8b5c24188b44241490e8a6fdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c410c20c00b801000000c20c00900000000090020000|@9874,2097151,@1284|53,0,@5215 62,0,I106 107,0,@5215 126,0,I106 181,0,@9868 212,0,0 350,0,@5215 358,0,I106 402,0,@5215 410,0,I106 481,0,@9871 514,1,@9851 524,0,0 644,0,0 9868:O4|@4608,@5398,@9870,@9869 9869:O5|@8955,1152,0,1152,0 9870:S26|4261636b696e6720757020746f6f206661722028333262697429 9871:O4|@4608,@5398,@9873,@9872 9872:O5|@8955,1138,0,1138,0 9873:S25|4261636b696e6720757020746f6f2066617220283862697429 9874:S36|5838364f5554505554434f444528292e6669787570283229636865636b4c616273283129 9875:S24|5838364f5554505554434f444528292e6669787570283229 9876:S34|5838364f5554505554434f444528292e636865636b4272616e63684c697374283329 9877:S28|5838364f5554505554434f444528292e646f50656e64696e67283229 9878:O1|7 9879:O1|@8796 9880:D3,532|83380775628b4804833903740cb81cc982b28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc020000008b71088972048b7904893a8d420cc740fc020000008b7a048978048b0a89088b008d04c5f9ffffff81e0ff01000081c881010000eb6883380575688b4804833903740db81cc982b28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc020000008b71088972048b7904893a8d420cc740fc020000008b7a048978048b0a89088b008d04c5f9ffffff81e0ff01000081c801010000eb6ce9d700000083380375678b4804833903740cb81cc982b28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc020000008b71088972048b7904893a8d420cc740fc020000008b7a048978048b0a89088b008d04c5f9ffffff81e0ff01000081c881000000eb66e96b00000083380175618b4804833903740cb81cc982b28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc020000008b71088972048b7904893a8d420cc740fc020000008b7a048978048b0a89088b008d04c5f9ffffff81e0ff010000eb0ae905000000b84100000083fb017507b90b000000eb4f8b0b833903740f89c2b81cc982b28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc020000008b71088972048b7904893a8d5a0cc743fc020000008b7a04897b048b0a890b8b0b0bc1c39090900000000010020000|@9881,63,@1288|14,0,@9818 117,0,@9818 226,0,@9818 334,0,@9818 423,0,32 433,0,5 449,0,@9818 9881:S22|5838364f5554505554434f444528292e736962283229 9882:O4|@4608,@5398,@9884,@9883 9883:O5|@8955,940,0,940,0 9884:S13|6d6f64726d3a2062616420726d 9885:O4|@4608,@5398,@9887,@9886 9886:O5|@8955,2044,0,2044,0 9887:S35|416c6c6f636174696f6e207374617274656420627574206e6f7420636f6d706c657465 9888:O1|22 9889:O4|@4608,@5398,@9891,@9890 9890:O5|@8955,939,0,939,0 9891:S13|6d6f64726d3a20626164207267 9892:O1|16 9893:O4|@4608,@5398,@9895,@9894 9894:O5|@8955,382,0,382,0 9895:S19|67656e38733a20696e76616c69642062797465 9896:O3|0,2,3 9897:O1|13 9898:O1|23 9899:O4|@4608,@5398,@9887,@9900 9900:O5|@8955,2060,0,2060,0 9901:O3|0,0,3 9902:O1|6 9903:O1|5 9904:D3,1716|3b650c7303ff55248b4c24048b542408833a097407be01000000eb05be0300000083f6028b7c2410f7c701000000740a81ff01ffffff7c20eb06f647ff107518f7c701000000740a81ff010100007c6deb06f647ff10756a505356bb1d00000089c8909090e8aadcffff833c2401752b817c2418f8c27fb274218b4424188338017411833803750c837804097506837808017407b905000000eb05b9030000008b44241083c404ff30518b4424048b008b0c242bc883c10183e107eb0ae94a000000e94500000083f901745fbb190000008b442414e83adcffffb864d182b29090e82ae4ffff8b4c24148b118b1289d383c3028b31891e5089d38b4108e8e6e7ffff3b650c7303ff5524eb9e83ff017554817c240cf0a47ab274218b54240c833a017458833a037558eb05e9cb000000837a0401755f837a0801755e83fe01755e5053ff31bb1b0000008b442410909090e8bedbffff8b04248b0083e00783f807756ceb05e98b0000008b442410ff308b04248b00b903000000eb0ae974000000e96f0000002bc883c10183e10783f901745deb0fe95b000000e956000000e951000000bb190000008b442414e862dbffffb864d182b29090e852e3ffff8b4c24148b118b1289d383c3028b31eb05e918000000891e5089d38b410890e806e7ffff3b650c7303ff5524eb846a01eb0be90600000050536a016a018b44241883380975718b4c241c833903740cb81cc982b28b5d049090ff13ff7104ff7108bb190000008b44241c90e8e6daffff833c24017426b8810000000b04248b4c241c8b118b1289d383c3028b31891e5089d38b41089090e88ee6ffff8b44241083c404e8aae2ffff8b4c24188b118b1289d383c302eb05e9960300008b31891e5089d38b410890e85ee6ffff837c2424017506833c240b753a8b442424a801740a81f801ffffff7c1ceb06f640ff107514a801740a81f8010100007c0feb06f640ff107507b903000000eb0cb905000000eb05b901000000833c24097570837c24280f760ab85ceb82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424288d14d5f9ffffff81e2ff0100000bc283c8098b5424188b1a8b1b89de83c6028b3a893751eb05e937000000508b4208e88ee5ffffbb68e882b2b834c47fb290e8aaf8ffff8b4c241c8b118b1289d383c3028b31891e5089d38b4108e862e5ffffeb72837c24280f760ab85ceb82b28b5d04ff13833c240f760ab8b8ea82b28b5d04ff1383f907741f83f903741383f9057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff0100008b5424288d14d5f9ffffff81e2ff0100000bc20b04248b542418eb05e9170000008b1a8b1b89de83c6028b3a893751508b4208e8d2e4ffff833c240375638b44241c8b088b0989ca83c2088b188913f6442428017410ff7008518b442430ff1588c55208eb498b50088b5c24288b03f643ff107402f7d88d440001525190ff15a8c5520850bb8c6c7ab28b442434ff15a8c8520883f80174155bb88c6c7ab2eb05e9d4000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8dae3ffff8b44241083c002ff342489c38b442418909090e8c2e3ffff8b44241083c40483c004ff342489c38b442414e8aae3ffff8b44240c83c40483c006ff342489c38b442410e892e3ffffeb62833c240575618b44241c8b4c2428f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101741183f9017d24eb10e9af000000e942000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff0100005389d38b480889c8e8e2e2ffff6a016a016a016a01eb5e8b4d008d49e83b4d087303ff5520894d00c741fc010000008b54241c89118d5908c743fc03000000c74308010000008b742424897304c70303000000515053ff7424208b5c24308b4424189090e8660000006a016a016a016a016a016a018b45008d40f43b45087303ff5520894500c740fc0200000083c42459894804c700050000008b4c2404894c2414bb010000005a83c41052e9c2060000909000000000b0060000|@9909,2097151,@1291|22,0,0 29,0,1 50,0,-128 74,0,128 92,0,14 102,1,@9821 116,0,@8796 149,0,2 156,0,1 205,0,12 214,1,@9821 219,0,@9830 226,1,@9831 254,1,@9833 277,0,@5643 326,0,13 338,1,@9821 374,0,1 421,0,12 430,1,@9821 435,0,@9830 442,1,@9831 478,1,@9833 526,0,@9818 544,0,12 554,1,@9821 565,0,64 598,1,@9833 610,1,@9831 646,1,@9833 673,0,-128 693,0,128 708,0,1 715,0,2 722,0,0 740,0,@9889 765,0,0 772,0,1 779,0,2 786,0,3 854,1,@9833 859,0,@9879 864,0,@8817 870,1,@9880 898,1,@9833 912,0,@9889 928,0,@9882 953,0,0 960,0,1 967,0,2 974,0,3 1042,1,@9833 1086,0,I90 1118,0,I91 1124,0,@5215 1134,0,I115 1145,0,@5215 1158,0,I80 1167,0,24 1174,0,I86 1182,0,I89 1194,0,16 1206,0,I86 1214,0,I89 1226,0,8 1238,0,I86 1246,0,I89 1266,0,I89 1290,1,@9833 1314,1,@9833 1338,1,@9833 1362,1,@9833 1389,0,-128 1410,0,128 1430,0,@9893 1538,1,@9833 1595,0,0 1608,0,1 1630,1,@9905 1679,0,2 1692,0,0 1702,1,@9907 9905:D3,1640|3b650c7303ff5524f644241001751f8b4c24108b11833a03740f89c6b81cc982b28b5d04909090ff138b7204eb05be010000008b4c240c833907753a8b5104833a03740d89c7b81cc982b28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4a08894f048b4a04890feb68833905753b8b5104833a03740e89c7b81cc982b28b5d049090ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4a08894f048b4a04890feb6083390375428b5104833a03740e89c7b81cc982b28b5d049090ff138b7d008d7ff43b7d08730aeb05e964000000ff5520897d00c747fc020000008b4a08894f048b4a04890feb4a83390175408b5104833a03741389c7b81cc982b28b5d04eb05e92c000000ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4a08894f048b4a04890feb05bfd8707ab28b4c2408833903740d89c2b81cc982b28b5d0490ff136a016a01f64424180175708b54241883fb01750583fe0b7538f6c301740a81fb01ffffff7c1deb06f643ff107515f6c301740a81fb010100007c0feb06f643ff107507be03000000eb0cbe05000000eb05be010000008b7d008d7ff83b7d087303ff5520897d00c747fc01000000538b1a891f8d5424048932eb05e9090000008d542404897a04eb1289e2c7020100000089e2c742040100000053ff710450bb190000008b442418e842d4ffff8b04248338317528b8c4777ab29090e82adcffff8b4c24188b118b1289d383c3028b31891e5089d38b4108e8e6dfffff589090e806dcffff8b4c24148b118b1289d383c3028b31891e5089d38b4108e8c2dfffff833c240f760db85ceb82b28b5d04909090ff13837c2408077423837c2408037415837c2408057407b801000000eb13b803000000eb0cb805000000eb05b807000000c1e00683e83f81e0ff010000598d0ccdf9ffffff81e1ff0100000bc183c8098b4c24108b118b1289d383c3028b31891e5089d38b4108909090e842dfffff8b5c24088b442418909090e85ef2ffff8b4c24108b118b1289d383c3028b31891e5089d38b4108e816dfffff837c240403756b8b4424108b088b0989ca83c2088b188913f60424017410ff7008518b442408ff1588c55208eb4a8b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174165bb88c6c7ab2909090ff1548c45208eb06e9d30000005850bb31000000ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e81edeffff8b44241083c002ff342489c38b442418909090e806deffff8b44241083c40483c004ff342489c38b442414e8eeddffff8b44240c83c40483c0065983c408894c242089c35883c40c5983c40c51e9ccddffff837c240405755b8b4424108b0c24f6c101740a81f901ffffff7c1deb06f641ff107515f6c101740a81f9010100007c19eb06f641ff1075118b50088b18b8a8eb82b28b5d049090ff138b108b1289d383c3028b30891ef6c101740c83f9017d1feb0be94d000000f641ff107412f6c101740881c1000200007105ff5538ebf3f6c10175108b19f641ff107402f7db8d5c1b01eb0289cb81e3ff010000895c241c89d38b480889c883c40c5983c40c51e918ddffff837c241c0175648b4424108b088b0989ca83c2088b188913f60424017412ff7008518b4424089090ff1588c55208eb498b50088b1c248b03f643ff107402f7d88d44000152519090ff15a8c5520850bb8c6c7ab28b44240cff15a8c8520883f80174155bb88c6c7ab2eb05e9dc000000ff1548c45208eb015850bb3100000090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e81edcffff8b44241083c002ff342489c38b442418909090e806dcffff8b44241083c40483c004ff342489c38b442414e8eedbffff8b44240c83c40483c0065983c408894c242089c35883c40c5983c40c51e9ccdbffffb80100000083c40cc21000900000000064060000|@9906,2097151,@1289|29,0,@9818 47,0,0 71,0,@9818 134,0,@9818 198,0,@9818 269,0,@9818 323,0,@5279 339,0,@9818 381,0,-128 402,0,128 417,0,1 424,0,2 431,0,0 490,0,0 499,0,0 509,0,12 518,1,@9821 531,0,@5383 538,1,@9831 566,1,@9833 574,1,@9831 602,1,@9833 613,0,@9889 647,0,0 654,0,1 661,0,2 668,0,3 730,1,@9833 746,1,@9880 774,1,@9833 818,0,I90 850,0,I91 856,0,@5215 866,0,I115 877,0,@5215 886,0,I80 900,0,24 906,0,I86 914,0,I89 926,0,16 938,0,I86 946,0,I89 958,0,8 970,0,I86 978,0,I89 998,0,I89 1022,1,@9833 1046,1,@9833 1070,1,@9833 1104,1,@9833 1129,0,-128 1150,0,128 1170,0,@9893 1284,1,@9833 1330,0,I90 1362,0,I91 1368,0,@5215 1378,0,I115 1389,0,@5215 1402,0,I80 1411,0,24 1418,0,I86 1426,0,I89 1438,0,16 1450,0,I86 1458,0,I89 1470,0,8 1482,0,I86 1490,0,I89 1510,0,I89 1534,1,@9833 1558,1,@9833 1582,1,@9833 1616,1,@9833 1621,0,0 9906:S31|5838364f5554505554434f444528292e67656e4f70496e6465786564283629 9907:D3,484|3b650c7303ff55248b4c2404f6c30175378b51408b12f6c201740583c2027105ff5538ebf68b714089168b368b55008d52f83b55087303ff5520895500c742fc010000008932eb0289da8b71248b3683c6028b792489378b318b368b7d008d7fe43b7d087303ff5520897d00c747fc0300000089470889770489178b410c8b008d5710c742fc02000000894204893a8b490c891183fb037407b803000000eb05b8f7ffffff8b4c24048b118b1289d383c3088b31891ea801740eff7108529090ff1588c55208eb4889c38b03f643ff107402f7d88d440001ff71085253909090ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8ead9ffff8b44241083c002ff342489c38b442418909090e8d2d9ffff8b44241083c40483c004ff342489c38b442414e8bad9ffff8b44240c83c40483c0065983c408894c240889c358e9a0d9ffff00000000e0010000|@9908,2097151,@1290|154,0,1 161,0,-5 194,0,I90 226,0,I91 232,0,@5215 242,0,I115 253,0,@5215 262,0,I80 274,0,24 282,0,I86 290,0,I89 302,0,16 314,0,I86 322,0,I89 334,0,8 346,0,I86 354,0,I89 374,0,I89 398,1,@9833 422,1,@9833 446,1,@9833 472,1,@9833 9908:S32|5838364f5554505554434f444528292e616464436f6e7374546f566563283329 9909:S36|5838364f5554505554434f444528292e67656e4d656d6f7279436f6e7374616e74283729 9910:O1|17 9911:D3,1564|3b650c7303ff5524833803756bff3353ff7004bb1f0000008b44240490e832cdffff8b442404ff308b04248b00b9010000002bc883c10183e10783f9017448bb190000008b44240890e806cdffffb864d182b29090e8f6d4ffff8b4c24088b118b1289d383c3028b31891e5089d38b4108e8b2d8ffffeb05e9970000003b650c7303ff5524eba1bb1900000083c4048b4424049090e8baccffffb800ec82b29090e8aad4ffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e866d8ffff8b4424048b088b0989ca83c2028b1889136a2b89cb8b480889c890e846d8ffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff3424bb0100000090e89afcffffeb668338057566ff3353ff7004bb1f0000008b44240490e826ccffff8b442404ff308b04248b00b9030000002bc883c10183e10783f901744dbb190000008b44240890e8facbffffb864d182b29090e8ead3ffff8b4c24088b118b1289d383c3028b31891e50eb0ae971040000e98000000089d38b4108e89ad7ffff3b650c7303ff5524eb9cbb1900000083c4048b44240490e8aacbffffb8ec7d7ab29090e89ad3ffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e856d7ffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff3424bb0300000090e8aafbffffeb668338017566ff3353ff7004bb1f0000008b44240490e836cbffff8b442404ff308b04248b00b9030000002bc883c10183e10783f901744dbb190000008b44240890e80acbffffb864d182b29090e8fad2ffff8b4c24088b118b1289d383c3028b31891e50eb0ae981030000e96400000089d38b4108e8aad6ffff3b650c7303ff5524eb9cbb1900000083c4048b44240490e8bacaffffb8ec7d7ab29090e8aad2ffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e866d6ffffff742404bb030000008b4424049090e85a030000eb678338077567ff3353bb1f0000008b042490e866caffff8b0424ff308b04248b00b9010000002bc883c10183e10783f901744ebb190000008b4424049090e83acaffffb864d182b29090e82ad2ffff8b4c24048b118b1289d383c3028b31891e5089d38b4108eb0ae9a9020000e96b000000e8dad5ffff3b650c7303ff5524eb9bbb1900000083c4048b04249090e8eac9ffffb800ec82b29090e8dad1ffff8b0c248b118b1289d383c3028b31891e5089d38b410890e896d5ffff8b04248b0883c4048b0989ca83c2028b1889136a2589cb8b400890e876d5ffffeb6dff3353bb1f0000008b04249090e88ec9ffff8b0424ff308b04248b00b9030000002bc883c10183e10783f9017449bb190000008b4424049090e862c9ffffb864d182b29090e852d1ffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e80ed5ffff3b650c730aeb05e9c3010000ff5524eba0bb1900000083c4048b0424909090e816c9ffffb8ec7d7ab29090e806d1ffff8b0c248b118b1289d383c3028b31891e5089d38b410890e8c2d4ffff8b4424048b00a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208a801740583c0087105ff5538ebf6b901000000f6c1017408a80174042bc87105ff5538ebf783c1018b04248b1083c4048b1289d383c3088b30891ef6c101740eff70085289c8ff1588c55208eb448b58088b01f641ff107402f7d88d440001535251ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e88ad3ffff8b44241083c002ff342489c38b442418909090e872d3ffff8b44241083c40483c004ff342489c38b442414e85ad3ffff8b44240c83c40483c006ff342489c38b442410e842d3ffff83c4106a016a0183c4048b4424048b0083e00783f805740bb8f40983b28b5d0490ff13b80100000083c408c390900000000018060000|@9935,2097151,@1295|20,0,15 30,1,@9821 46,0,0 64,0,12 74,1,@9821 79,0,@9830 86,1,@9831 114,1,@9833 136,0,12 150,1,@9821 155,0,@9897 162,1,@9831 190,1,@9833 222,1,@9833 256,0,2 264,0,0 270,1,@9907 288,0,15 298,1,@9821 314,0,1 332,0,12 342,1,@9821 347,0,@9830 354,1,@9831 394,1,@9833 409,0,12 422,1,@9821 427,0,@5413 434,1,@9831 462,1,@9833 496,0,2 504,0,1 510,1,@9907 528,0,15 538,1,@9821 554,0,1 572,0,12 582,1,@9821 587,0,@9830 594,1,@9831 634,1,@9833 649,0,12 662,1,@9821 667,0,@5413 674,1,@9831 702,1,@9833 711,0,1 722,1,@9912 737,0,15 746,1,@9821 761,0,0 779,0,12 790,1,@9821 795,0,@9830 802,1,@9831 842,1,@9833 857,0,12 870,1,@9821 875,0,@9897 882,1,@9831 910,1,@9833 942,1,@9833 952,0,15 962,1,@9821 977,0,1 995,0,12 1006,1,@9821 1011,0,@9830 1018,1,@9831 1046,1,@9833 1068,0,12 1082,1,@9821 1087,0,@5413 1094,1,@9831 1122,1,@9833 1152,0,@5215 1158,0,I106 1177,0,0 1234,0,I90 1262,0,I91 1268,0,@5215 1278,0,I115 1289,0,@5215 1298,0,I80 1310,0,24 1318,0,I86 1326,0,I89 1338,0,16 1350,0,I86 1358,0,I89 1370,0,8 1382,0,I86 1390,0,I89 1410,0,I89 1434,1,@9833 1458,1,@9833 1482,1,@9833 1506,1,@9833 1535,0,@9932 1546,0,0 9912:D3,300|3b650c7303ff55248b481c8b09f6c10175448b098b09833901750ab8c4bc81b28b5d04ff138b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c700050000008b4c2404894c2404e926f7ffff8b4c24048b118b128b71408b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000c7078c0383b2894f04895f0889770c8957108067ffbf8b481c8b09f6c10175298b098b09833901750d89c7b8c4bc81b28b5d0490ff135350ff74240c5356528b5904e8c6000000eb308b483c8b098b55008d52f43b55087303ff5520895500c742fc02000000894a04893a8b483c891189c1b80100000053518b45008d40f43b45087303ff5520894500c740fc0200000059894804c700010000008b4c2408894c24085be958f6ffff0000000028010000|@9931,2097151,@1294|28,0,@9716 69,0,2 82,1,@9907 125,0,@9913 167,0,@9716 190,1,@9914 238,0,0 274,0,0 288,1,@9907 9913:D3,52|3b650c7303ff55248b4a048b1c24890c24ff7208ff720cff721089de8b58048b3889f856e91f0000009090900000000030000000|@9930,2097151,@1293|37,1,@9914 9914:D3,1024|3b650c7303ff55248b4424108b088b098b501c8b12f644240c01756e8b742408f7c601000000740583c6027105ff5538ebf6f7c601000000740583ee027105ff5538ebf6f7c601000000740583c6047105ff5538ebf6f7c601000000740583c6027105ff5538ebf652ff70245351bb0900000089f0909090ff15c8c75208a80175178b08f640ff10eb05e9c50100007402f7d98d4c0901eb0289c18d49ff030c24f644240c01740db8e80783b28b5d04909090ff138b44240c83c4048b108b12833a05740c8b18b8240883b28b5d04ff138b7204bbffffff00235efc8d5c1b018d1c9dfdffffff3bd9770e8b18b8880883b28b5d049090ff13ff3051ff7424086a0189cb89f09090ff1588d25208582b44241483e807a801740783f8017d17eb06f640ff10740f89c3b88c6c7ab29090ff1588c75208a801740a9090ff1588c55208eb4489c18b01f641ff107402f7d88d44000151909090ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24288b442414909090e866cfffff8b44242483c002ff342489c38b442414909090e84ecfffff8b44242483c40483c004ff342489c38b442410e836cfffff8b44242083c40483c006ff342489c38b44240ce81ecfffffeb67837c240c05750e8b4824b8b40883b28b5d0490ff13837c240c017574f6c20174108b4824b8e80783b28b5d04909090ff138b0a8b09833905740f8b7024b8240883b28b5d049090ff138b7904beffffff002377fc8d7436018d34b5fdffffff3b7424047714eb05e99a0000008b7024b8880883b28b5d04ff1352ff7024536a018b5c241489f89090ff1588d25208eb6ef6c20174108b4824b8e80783b28b5d04909090ff138b0a8b09833905740f8b7024b8240883b28b5d049090ff138b7904beffffff002377fc8d7436018d34b5fdffffff3b74240477108b7024b8880883b28b5d04909090ff1352ff7024536a038b5c241489f89090ff1588d252086a016a016a016a018b44241083c4108b0083e8028b0c2489018b0983f9017570f644240401740cb8e80783b28b5d049090ff138b4424048b088b09833905740f8b10b8040983b28b5d04909090ff13ff30ff7104bb050000008b04249090ff1548d352088b45008d40f43b45087303ff5520894500c740fc0200000059894804c70003000000598901b801000000eb05e90600000083c408c21000b80100000083c408c2100000000000fc030000|@9929,2097151,@1292|111,0,4 122,0,I108 169,0,@9915 200,0,@9918 213,0,8388607 238,0,@9921 266,0,I194 298,0,@5215 306,0,I106 318,0,I90 346,0,I91 352,0,@5215 362,0,I115 373,0,@5215 382,0,I80 394,0,24 402,0,I86 410,0,I89 422,0,16 434,0,I86 442,0,I89 454,0,8 466,0,I86 474,0,I89 494,0,I89 518,1,@9833 542,1,@9833 566,1,@9833 590,1,@9833 607,0,@9923 633,0,@9915 658,0,@9918 673,0,8388607 708,0,@9921 734,0,I194 749,0,@9915 774,0,@9918 789,0,8388607 817,0,@9921 846,0,I194 890,0,@9915 917,0,@9926 935,0,2 946,0,I200 980,0,1 988,0,0 1006,0,0 9915:O4|@4608,@5398,@9917,@9916 9916:O5|@8955,981,0,981,0 9917:S5|7363536574 9918:O4|@4608,@5398,@9920,@9919 9919:O5|@9719,223,0,223,0 9920:S45|63736567507574436f6e7374616e743a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 9921:O4|11,@4879,0,@9922 9922:O5|@9719,219,0,219,0 9923:O4|@4608,@5398,@9925,@9924 9924:O5|@8955,1005,0,1005,0 9925:S25|6f6e436f6d706c6574696f6e3a204e6f6e4164647241726561 9926:O4|@4608,@5398,@9928,@9927 9927:O5|@9719,105,0,105,0 9928:S47|63736567436f6e76657274546f436f64653a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 9929:S43|5838364f5554505554434f444528292e636f6465436f6e73742833296f6e436f6d706c6574696f6e283229 9930:S43|5838364f5554505554434f444528292e636f6465436f6e73742833296f6e436f6d706c6574696f6e283129 9931:S28|5838364f5554505554434f444528292e636f6465436f6e7374283329 9932:O4|@4608,@5398,@9934,@9933 9933:O5|@8955,1821,0,1821,0 9934:S30|63616c6c46756e6374696f6e3a2063616c6c206e6f7420616c69676e6564 9935:S31|5838364f5554505554434f444528292e63616c6c46756e6374696f6e283229 9936:O4|@4608,@5398,@9938,@9937 9937:O5|@8955,2850,0,2850,0 9938:S21|436f6e646974696f6e616c206a756d70206261636b 9939:O2|4,4 9940:O4|@4608,@5398,@9942,@9941 9941:O5|@8955,3317,0,3317,0 9942:S14|63674f703a204650417269746852 9943:D3,180|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc020000008b542408895104c70109000000535051bb190000008b442410e826beffff589090e81ac6ffff8b4c240c8b118b1289d383c3028b31891e5089d38b4108e8d6c9ffff58c1e00683e83f81e0ff0100008b4c24108d0ccdf9ffffff81e1ff0100000bc10b04248b4c240883c4048b118b1289d383c3028b31891e8944240c89d38b41085a83c40852e98cc9ffff00000000b0000000|@9944,2097151,@1296|41,0,4 49,0,12 58,1,@9821 66,1,@9831 94,1,@9833 168,1,@9833 9944:S32|5838364f5554505554434f444528292e67656e466c6f6174696e675074283229 9945:O4|@4608,@5398,@9947,@9946 9946:O5|@8955,3359,0,3359,0 9947:S5|6670726567 9948:B8|000000000000f03f 9949:B8|000000000000f0bf 9950:O2|4,5 9951:O4|@4608,@5398,@9947,@9952 9952:O5|@8955,1948,0,1948,0 9953:O2|4,3 9954:O2|48,1 9955:O2|4,7 9956:O4|@4608,@5398,@9947,@9957 9957:O5|@8955,3300,0,3300,0 9958:D3,800|3b650c7303ff55248b4c24048b55008d52f83b55087303ff5520895500c742fc01000040c70201000000be010000008b7c2408f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd9833b03740e89c7b81cc982b28b5d049090ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000ff31528b5304895704c7072900000056ff710453ff73085057bb190000008b4424249090e8eabbffff589090e8dec3ffff8b4c24208b118b1289d383c3028b31891e5089d38b4108e89ac7ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2414894804c70003000000ff742420bb0100000090e8eaebffffbbf1ffffff8b44242890ff15c8c75208a801740583e8087105ff5538ebf68b4d008d49ec3b4d087303ff5520894d00c741fc010000008b54240889118d5908c743fc020000005e897304c70305000000515352ff74242889c3b8a0eb82b290e8e2e4ffff833c2401744e8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000c74004010000008b0c2489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb05b90100000051bb190000008b442420e8c6bafffff6042401750db80c1083b28b5d04909090ff13b800ec82b283c408e8a2c2ffff8b4c24188b118b1289d383c3028b31891e5089d38b4108e85ec6ffff8b0424833803740bb81cc982b28b5d0490ff138378040f760e8b4804b8b8ea82b28b5d0490ff13b9c101000083c4040b48048b4424148b108b1289d383c3028b30891e5189d38b480889c8e80ec6ffff58c70003000000bb110000005890ff15c8c75208a801740583c0067105ff5538ebf689c38b44240c909090e80abaffff8b4424048b0083e00783f8057440bb190000008b44240ce8eeb9ffffb864d182b29090e8dec1ffff8b4c240c8b118b1289d383c3028b31891e5089d38b4108e89ac5ffff3b650c7303ff5524ebb28b4424048b005989018b44240ca8017520ff7004ff7424048b5c24108b00909090e886000000583b650c7303ff5524ebdcb80100000083c404c20c00000000001c030000|@9968,2097151,@1299|38,0,0 43,0,0 98,0,@9818 144,0,20 159,0,12 170,1,@9821 178,1,@9831 206,1,@9833 243,0,1 252,0,0 258,1,@9907 263,0,-8 274,0,I108 338,0,2 352,0,@9892 358,1,@9905 395,0,0 402,0,0 409,0,0 447,0,0 453,0,12 462,1,@9821 473,0,@9959 486,0,@9897 494,1,@9831 522,1,@9833 535,0,@9818 555,0,@9882 566,0,224 602,1,@9833 609,0,1 614,0,8 622,0,I108 650,1,@9821 669,0,12 678,1,@9821 683,0,@9830 690,1,@9831 718,1,@9833 766,1,@9962 782,0,0 9959:O4|@4608,@5398,@9961,@9960 9960:O5|@8955,1318,0,1318,0 9961:S32|67656e6f703a207265782070726566697820696e20333220626974206d6f6465 9962:D3,408|3b650c7303ff55248b48108b0981f9f9ffff0774108b480cb80c1283b28b5d04909090ff138b700cb83ce382b2e8dac0ffff8b0b8b0989ca83c2028b3b89175356508b430889cb9090e896c4ffff8b4424048b088b0989ca83c2088b188913ff7008516a0189cb8b4424089090e872c4ffff8b042483c0026a0189c38b44240890e85ec4ffff8b042483c0046a0189c38b44240890e84ac4ffff5883c0066a0189c38b442404909090e836c4ffff8b44241083c4048b0083c0f88b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc0100004089088d4808c741fc02000000c741040100000089018b04248b0083f801740c89c389c890e8da00000089c1588908b864d182b290e8eebfffff8b0c248b118b1289d383c3028b31891e5089d38b410890e8aac3ffffb864d182b29090e8c6bfffff8b0c248b118b1289d383c3028b31891e5089d38b410890e882c3ffffb864d182b29090e89ebfffff8b0c248b1183c4048b1289d383c3028b31891e8944240489d38b4108e955c3ffff900000000094010000|@9967,63,@1298|15,0,67108860 25,0,@9963 41,0,@9863 46,1,@9831 74,1,@9833 110,1,@9833 130,1,@9833 150,1,@9833 170,1,@9833 215,0,0 244,0,0 266,1,@9966 276,0,@9830 282,1,@9831 310,1,@9833 315,0,@9830 322,1,@9831 350,1,@9833 355,0,@9830 362,1,@9831 395,1,@9833 9963:O4|@4608,@5398,@9965,@9964 9964:O5|@8955,2483,0,2483,0 9965:S7|6164644a756d70 9966:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1297| 9967:S40|5838364f5554505554434f444528292e696e6465786564436173652835296164644a756d70283129 9968:S30|5838364f5554505554434f444528292e696e646578656443617365283529 9969:D3,980|3b650c7303ff55248338037570ff730453ff7004bb190000008b442404e856b6ffffb800ec82b29090e846beffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e802c2ffff8b4424048b088b0989ca83c2028b1889136a4b89cb8b480889c890e8e2c1ffff8b45008d40f43b45087303ff5520894500eb05e922000000c740fc0200000059894804c70005000000ff3424bb010000009090e82ee6ffffeb6e833805756eff730453ff7004bb190000008b442404e8bab5ffffb83ce382b29090e8aabdffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e866c1ffff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c70005000000ff3424bb03000000eb0ae9a5020000e90800000090e8aee5ffffeb588338017558ff730453ff7004bb190000008b442404e83ab5ffffb83ce382b29090e82abdffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e8e6c0ffffff742404bb030000008b4424049090e8daedffffeb68e93b0200008338077563ff730453bb190000008b0424909090e8deb4ffffb800ec82b29090e8cebcffff8b0c248b118b1289d383c3028b31891e5089d38b410890e88ac0ffff8b04248b0883c4048b0989ca83c2028b1889136a4589cb8b400890e86ac0ffffeb6ce9d0010000ff730453ff33bb190000008b44240490e87ab4ffffb83ce382b29090e86abcffff8b4c24048b118b1289d383c3028b31891e5089d38b4108e826c0ffff8b04248b00a801740783f8017d16eb06f640ff10740e89c3b88c6c7ab290ff1588c75208a801740ceb05e96001000083c0087105ff5538ebf6b90100000083c404f6c1017408a80174042bc87105ff5538ebf783c1018b04248b1083c4048b1289d383c3088b30891ef6c1017410ff70085289c89090ff1588c55208eb448b58088b01f641ff107402f7d88d440001535251ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b442418909090e8e2beffff8b44241083c002ff342489c38b442418909090e8cabeffff8b44241083c40483c004ff342489c38b442414e8b2beffff8b44240c83c40483c006ff342489c38b442410e89abeffff83c4106a016a0183c40483c40458c70003000000b801000000c300000000d0030000|@9970,2097151,@1300|21,0,12 30,1,@9821 35,0,@9897 42,1,@9831 70,1,@9833 102,1,@9833 143,0,2 151,0,0 158,1,@9907 177,0,12 186,1,@9821 191,0,@9863 198,1,@9831 226,1,@9833 260,0,2 268,0,1 286,1,@9907 305,0,12 314,1,@9821 319,0,@9863 326,1,@9831 354,1,@9833 363,0,1 374,1,@9912 395,0,12 406,1,@9821 411,0,@9897 418,1,@9831 446,1,@9833 478,1,@9833 496,0,12 506,1,@9821 511,0,@9863 518,1,@9831 546,1,@9833 575,0,@5215 582,0,I106 608,0,0 670,0,I90 698,0,I91 704,0,@5215 714,0,I115 725,0,@5215 734,0,I80 746,0,24 754,0,I86 762,0,I89 774,0,16 786,0,I86 794,0,I89 806,0,8 818,0,I86 826,0,I89 846,0,I89 870,1,@9833 894,1,@9833 918,1,@9833 942,1,@9833 962,0,1 967,0,0 9970:S33|5838364f5554505554434f444528292e6a756d70546f46756e6374696f6e283229 9971:O4|@4608,@5398,@9973,@9972 9972:O5|@8955,2732,0,2732,0 9973:S29|4c6f6164416464726573733a206e6f2062617365206f7220696e646578 9974:O1|24 9975:O4|@4608,@5398,@9977,@9976 9976:O5|@8955,2652,0,2652,0 9977:S21|63674f703a206f6666736574206e6f6e2d7a65726f 9978:O1|@9979 9979:O4|1,0,0,0 9980:O4|@4608,@5398,@9982,@9981 9981:O5|@8955,2625,0,2625,0 9982:S44|4d6f7665204c69746572616c536f7572636520746f206670207265673a20696e76616c696420736f75726365 9983:O4|@4608,@5398,@9947,@9984 9984:O5|@8955,1957,0,1957,0 9985:O3|0,5,3 9986:O1|29 9987:O1|28 9988:O2|30,0 9989:O1|21 9990:O2|27,0 9991:O1|31 9992:O1|32 9993:O1|33 9994:O1|9 9995:O1|18 9996:O1|19 9997:O4|@4608,@5398,@9999,@9998 9998:O5|@8955,3113,0,3113,0 9999:S44|466f756e642053746f7265496e697469616c6973656420627574206e6f7420696e20616c6c6f636174696f6e 10000:O1|12 10001:O1|36 10002:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1301| 10003:S38|5838364f5554505554434f444528292e636f646547656e657261746528322963674f70283129 10004:S31|5838364f5554505554434f444528292e636f646547656e6572617465283229 10005:D3,552|3b650c7303ff552483f805756b8b44241083380575678b4c240c8b09f6400401740f8b5004b8ecd57ab28b5d049090ff138b7004baffffff002356fc8d5412018d1495fdffffff83fa11750d0fb67eff8d7c3f0183ff03740cb8281c83b28b5d049090ff13bf01000000535152ff70043b7c24047513eb0ae999010000e994010000b801000000eb3d89f88b0c24d1e80fb604018d4400018b5424188b1a8b1b89de83c6028b0a893157508b4208909090e8a2baffff5883c00289c73b650c7303ff5524ebaa83c408582b042483e807a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208a801740a9090ff1588c55208eb4489c18b01f641ff107402f7d88d44000151909090ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24148b44241c909090e896b9ffff8b44241083c002ff342489c38b44241c909090e87eb9ffff8b44241083c40483c004ff342489c38b442418e866b9ffff8b44240c83c40483c0068b4c24105a83c4088954241089c389c85a83c40c52e942b9ffffb801000000c2100090900000000024020000|@10009,2097151,@1304|38,0,@6321 53,0,8388607 90,0,@10006 102,0,0 131,0,0 178,1,@9833 228,0,@5215 234,0,I106 246,0,I90 274,0,I91 280,0,@5215 290,0,I115 301,0,@5215 310,0,I80 322,0,24 330,0,I86 338,0,I89 350,0,16 362,0,I86 370,0,I89 382,0,8 394,0,I86 402,0,I89 422,0,I89 446,1,@9833 470,1,@9833 494,1,@9833 530,1,@9833 535,0,0 10006:O4|@4608,@5398,@10008,@10007 10007:O5|@8955,4038,0,4038,0 10008:S34|7075744e6f6e41646472436f6e73743a204e6f742061207265616c206e756d626572 10009:S54|5838364f5554505554434f444528292e637265617465436f64655365676d656e742833297075744e6f6e41646472436f6e7374283329 10010:D3,260|3b650c7303ff5524837c2404017508b801000000c208005053bb010200008b0424909090ff1508c8520883f8017433a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f9037411a801740881c0000200007105ff5538ebf3a80175108b08f640ff107402f7d98d4c0901eb0289c181e1ff010000518b5c24148b4424089090e8f6b7ffff8b0424a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f9037411a801740881e8fe0100007105ff5538ebf3bb0102000083c404ff15e8c752088b4c240c83c1028b542408f6c201740583ea027105ff5538ebf6894c240c8954240889c358e904ffffff0000000000010000|@10011,2097151,@1305|16,0,0 26,0,256 38,0,I110 65,0,0 72,0,1 138,1,@9833 163,0,0 170,0,1 197,0,256 206,0,I109 10011:S27|5838364f5554505554434f444528292e7365744279746573283429 10012:O4|@4608,@5398,@10014,@10013 10013:O5|@9719,97,0,97,0 10014:S37|63736567436f6e76657274546f436f64653a206e6f7420612062797465207365676d656e74 10015:O4|@4608,@5398,@10017,@10016 10016:O5|@9719,193,0,193,0 10017:S41|63736567507574576f72643a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 10018:O4|11,@4879,0,@10019 10019:O5|@9719,190,0,190,0 10020:O2|@10022,@10021 10021:O2|@10024,@10023 10022:O2|@5643,1 10023:O2|@10026,@10025 10024:O2|@5592,2 10025:O2|@10028,@10027 10026:O2|@8794,4 10027:O2|@10030,@10029 10028:O2|@8791,8 10029:O2|@10032,@10031 10030:O2|@8800,16 10031:O2|@10035,@10034 10032:O2|@10033,32 10033:O3|1,7,0 10034:O2|@10037,@10036 10035:O2|@8960,64 10036:O2|@10039,@10038 10037:O2|@6813,128 10038:O2|@10041,@10040 10039:O2|@8961,256 10040:O2|@10043,@10042 10041:O2|@8962,512 10042:O2|@10045,@10044 10043:O2|@8963,1024 10044:O2|@10047,@10046 10045:O2|@8964,2048 10046:O2|@10049,@10048 10047:O2|@8965,4096 10048:O2|@10051,@10050 10049:O2|@5279,8192 10050:O2|@10053,@10052 10051:O2|@5347,16384 10052:O2|@10055,@10054 10053:O2|@8967,32768 10054:O2|@10057,@10056 10055:O2|@8968,65536 10056:O2|@10059,@10058 10057:O2|@8969,131072 10058:O2|@10061,@10060 10059:O2|@6222,262144 10060:O2|@10062,0 10061:O2|@8959,524288 10062:O2|@10063,1048576 10063:O2|0,7 10064:D3,824|3b650c7303ff5524f644240401756b8b4c24048b108b128b401c8b008b31f7c601000000740583ee027105ff5538ebf6f7c601000000740583c6047105ff5538ebf6f7c601000000740583c6027105ff5538ebf6535052bb0900000089f09090ff15c8c75208a80175158b08f640ff107402f7d98d4c0901eb07e9c101000089c18d49ff030c24f644240401740bb8e80783b28b5d0490ff1383c404588b108b12833a05740f8b18b8240883b28b5d04909090ff138b7204bbffffff00235efc8d5c1b018d1c9dfdffffff3bd9770e8b18b8880883b28b5d049090ff13ff3051ff7424146a0189cb89f09090ff1588d25208582b44240483e807a801740783f8017d17eb06f640ff10740f89c3b88c6c7ab29090ff1588c75208a801740a9090ff1588c55208eb4489c18b01f641ff107402f7d88d44000151909090ff15a8c5520850bb8c6c7ab28b442404ff15a8c8520883f80174115bb88c6c7ab2909090ff1548c45208eb015883c40450bb310000009090ff1508c552089090ff1568c5520881e0ff01000050bb210000008b4424049090ff1508c552089090ff1568c5520881e0ff01000050bb110000008b4424089090ff1508c552089090ff1568c5520881e0ff01000089c18b4424089090ff1568c5520881e0ff01000051508b5c24188b442414909090e85eb2ffff8b44241483c002ff342489c38b442414909090e846b2ffff8b44241483c40483c004ff342489c38b442410e82eb2ffff8b44241083c40483c0065983c404894c241089c35883c4045983c40451e90cb2ffff837c2404057508b801000000c20800837c240403756c8b401c8b00a801740e89c1b8e80783b28b5d049090ff138b008b00833805740f89c1b8240883b28b5d04909090ff138b5004b9ffffff00234afc8d4c09018d0c8dfdffffff3bcb770ab8880883b28b5d04ff138b4c2408894c2408be030000008974240489d0ff2588d252088b401c8b00a801740e89c1b8e80783b28b5d049090ff138b008b00833805740f89c1b8240883b28b5d04909090ff138b5004b9ffffff00234afc8d4c09018d0c8dfdffffff3bcb770ab8880883b28b5d04ff138b4c2408894c2408be010000008974240489d0ff2588d2520890900000000034030000|@10065,2097151,@1306|88,0,4 98,0,I108 143,0,@9915 169,0,@9918 185,0,8388607 210,0,@9921 238,0,I194 270,0,@5215 278,0,I106 290,0,I90 318,0,I91 324,0,@5215 334,0,I115 345,0,@5215 354,0,I80 366,0,24 374,0,I86 382,0,I89 394,0,16 406,0,I86 414,0,I89 426,0,8 438,0,I86 446,0,I89 466,0,I89 490,1,@9833 514,1,@9833 538,1,@9833 572,1,@9833 584,0,0 610,0,@9915 633,0,@9918 649,0,8388607 672,0,@9921 690,0,1 702,0,I194 718,0,@9915 741,0,@9918 757,0,8388607 780,0,@9921 798,0,0 810,0,I194 10065:S50|5838364f5554505554434f444528292e637265617465436f64655365676d656e74283329636f6e73744c6162656c73283429 10066:D3,15180|3b650c7303ff55248b4c24048b55008d52f83b55087303ff5520895500c742fc01000040c7020100000081791048c052087443f6411001752f8b7110bf48c05208ff7128ff7124ff710cff7110b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901741ceb2cff7128ff7124ff710cff7110eb1eff7128ff7124ff710cff7110525053b87f0000008b5424189090ff12eb0e5250538b44240c8b54241890ff12b824e681b28b54241890ff128b4424088b003b442404736f8b4424088b00a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208bb05000000bafc317ab290e8b60cf7ff8b5424189090ff12b8130000008b54241890ff128b4424088b008b0c248b098b5904baffffff002353fc8d5412018d1495fdffffff3bc27216eb05e9053a000089c2b8b8d082b28b5d04909090ff13d1e80fb604038d44000181f8e10100007521b8e05f83b28b542418ff128b4424088b0083c0028b4c24088901b801000000eb05b8010000008b4424088b008b0c248b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720f89c2b8b8d082b28b5d04909090ff13d1e80fb604038d44000181f881000000721981f89f00000077118b5424088b1283c2028b7424088916eb05b80100000089c283e21183fa017407ba01000000eb05ba0300000083f20289c683e60983fe017407be01000000eb05be0300000083f60289c783e70583ff017407bf01000000eb05bf0300000083f70289c183e10383f9017407b901000000eb05b90300000083f1028b5c24088b1b508b4424048b0056578b7804beffffff002377fc8d7436018d34b5fdffffff3bde720bb8b8d082b28b5d0490ff13d1eb0fb61c1f8d5c1b018b7424148b3683c6028b442414893089ce89d7b84cec82b29090e852aaffff3bd87420b854ec82b29090e842aaffff3bd87410b860e882b29090e832aaffff3bd875688b4424148b008b4c240c8b098b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604068d440001a801740783f8017d0feb06f640ff107407ba01000000eb05ba0300000083fa037415a801740c83e80eeb05e9ed0100007105ff5538ebef53bb11000000ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf683f80d7507b8f05f83b2eb4d83f80b7507b8fc5f83b2eb4183f8097507b8086083b2eb3583f8077507b8146083b2eb2983f8057507b8206083b2eb1d83f8037507b82c6083b2eb1183f8017407b8386083b2eb05b8446083b28b542428ff12b860e882b29090e802a9ffff3b0424750db8c50000008b542428ff12eb0eb8d90000008b542428909090ff12b8506083b28b54242890ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e8aa370000b8590000008b54242890ff12b854ec82b29090e89ea8ffff3b04247521ff742410ff742428ff742428ff7424348b5c2428b80100000090e81e3e0000eb618b4424188b008b4c24108b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720f89c2b8b8d082b28b5d04909090ff13d1e80fb604038d440001a801740a81f8010100007c2eeb06f640ff107526a801740881e8fe010000710ceb05e93b360000ff5538ebeca801740583e8027105ff5538ebf68b5424188b1283c2028b7424188916bb05000000bafc317ab2909090e89608f7ff8b5424289090ff12eb65b868ad7ab2e8caa7ffff3bd8755cb89c6883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e993350000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89607f7ff8b5424249090ff12eb65b884b57ab2e8caa6ffff3bd8755cb8ac6883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991340000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89606f7ff8b5424249090ff12eb65b8bc6883b2e8caa5ffff3bd8755cb8c86883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991330000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89605f7ff8b5424249090ff12eb65b8203d7cb2e8caa4ffff3bd8755cb8d86883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991320000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89604f7ff8b5424249090ff12eb65b808b37ab2e8caa3ffff3bd8755cb8e86883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991310000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89603f7ff8b5424249090ff12eb65b884337cb2e8caa2ffff3bd8755cb8f86883b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991300000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89602f7ff8b5424249090ff12eb65b8e4b17ab2e8caa1ffff3bd8755cb8086983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912f0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89601f7ff8b5424249090ff12eb65b8e4b27ab2e8caa0ffff3bd8755cb8186983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912e0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e89600f7ff8b5424249090ff12eb65b800ad7ab2e8ca9fffff3bd8755cb8286983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912d0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e896fff6ff8b5424249090ff12eb65b874ac7ab2e8ca9effff3bd8755cb8386983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912c0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e896fef6ff8b5424249090ff12eb65b860b57ab2e8ca9dffff3bd8755cb8486983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912b0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e896fdf6ff8b5424249090ff12eb65b884887ab2e8ca9cffff3bd8755cb8586983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e9912a0000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e896fcf6ff8b5424249090ff12eb65b8f0de82b2e8ca9bffff3bd8755cb8686983b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741481f8010100007c31eb10e991290000e991000000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b74241489168b16f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c789d057a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2e896fbf6ff8b5424249090ff12eb68b83ce382b2e8ca9affff3bd8755f8b4424148b008b5c240c90e85a98ffff8b4c24148b0983c1088b542414890a50b8786983b28b54242890ff128b4424188b00a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208a801741af6042401eb0ae98e280000e92e00000074088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2909090e8f6faf6ff8b5424249090ff12eb68b8ec7d7ab2e82a9affff3bd8755f8b4424148b008b5c240c90e8ba97ffff8b4c24148b0983c1088b542414890a50b8846983b28b54242890ff128b4424188b00a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208a801741af6042401eb0ae9ee270000e92e00000074088d40ff0304247105ff5538ebf3bb0500000083c404bafc317ab2909090e856faf6ff8b5424249090ff12eb63b854eb82b2e88a99ffff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe953270000e903010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650b8946983b28b542428909090ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e886270000b8590000008b54242890ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c70003000000909090e88687fcff8b54242883c404909090ff12eb5689d883e00f83f807755e83fb7f735e8b4424148b008b4c240c8b098b7104baffffff002356fc8d5412018d1495fdffffff3bc2720c89c2b8b8d082b28b5d04ff13d1e80fb604068d440001a801740c83f8017d1eeb0be9f0250000f640ff107411ba01000000eb0fe98b010000e986010000ba0300000083fa03740ea801740583e80e7105ff5538ebf653bb11000000ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf659c1e90383c90183e10f83f90d750989c1b8f05f83b2eb5483f90b750989c1b8fc5f83b2eb4b83f909750989c1b8086083b2eb4983f907750989c1b8146083b2eb3b83f905750989c1b8206083b2eb2d83f903750989c1b82c6083b2eb1f83f901741389c1b8386083b2eb11e90c000000e90700000089c1b8446083b2518b542428909090ff12b8130000008b54242890ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e88e250000b8590000008b54242890ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c70003000000909090e88e85fcff8b54242883c404909090ff12eb63b808ec82b2e82296ffff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe9eb230000e903010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650b8946983b28b542428909090ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c70003000000909090e84a84fcff8b54242883c404909090ff12b8590000008b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e8b2230000eb63b8a46983b2e8b294ffff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe97b220000e903010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650b8ac6983b28b542428909090ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c70003000000909090e8da82fcff8b54242883c404909090ff12b8590000008b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e842220000eb63b8c41883b2e84293ffff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe90b210000e953020000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650b8bc6983b28b542428909090ff12837c24040174438b0424a801740583c0107105ff5538ebf6bb03000000bafc317ab290e8faf2f6ff89c3b8e5000000e85eccf6ffbb850000009090e852ccf6ff8b5424289090ff12eb6d8b0424a801745783f801725283f80f774db96a3f83b28d4c81fcffe19090e96d000000909090e975000000909090e97d000000909090e985000000909090e98d000000909090e9a9000000909090e9ce000000909090e9e9000000909090bb030000008b0424bafc317ab2eb05e9f0000000909090e85ef2f6ff89c3b8e5000000e8c2cbf6ff8b5424289090ff12eb59b8cc6983b28b542428909090ff12eb5db8d86983b28b542428909090ff12eb59b8e46983b28b542428909090ff12eb5cb8f06983b28b542428909090ff12eb5f837c240c017407b8fc6983b2eb05b8086a83b28b542428eb05e9740000009090ff12eb5e837c240c017413eb05e960000000b8146a83b2eb0ae954000000b8206a83b28b54242890ff12eb46e941000000837c240c01740cb82c6a83b2eb0ae92e000000b8386a83b28b542428909090ff12eb1e837c240c01740cb8446a83b2eb0ae90b000000b8506a83b28b542428ff12b85900000083c4048b5424249090ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e8821f0000eb60b87c1883b2e88290ffff3bd87257b85c6a83b29090e87290ffff3bd8774783e30f8b45008d40f03b45087303ff5520894500c740fc03000000897008895804c70003000000e8967ffcff89c3b8686a83b2e85ecaf6ff8b5424249090ff12eb64e94e1e0000b8901883b2909090e81a90ffff3bd8725ab8786a83b29090e80a90ffff3bd8774a83e30f8b45008d40f03b45087303ff5520894500c740fc03000000897008895804c70003000000e82e7ffcff89c3b8846a83b2e8f6c9f6ff8b542424eb05e9ea1d0000909090ff12eb69b864d182b2e8b28fffff3bd8750eb8906a83b28b54242490ff12eb5db8a0eb82b2e8968fffff3bd875618b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001eb05e9751d0000a801740c83f8017d19eb0be9651d0000f640ff10740cba01000000eb0ae904010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb11000000909090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650b89c6a83b28b542428909090ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e88a1d0000b8590000008b54242890ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c70003000000909090e88a7dfcff8b54242883c404909090ff12eb64b8ac6a83b2e81e8effff3bd8725bb8b86a83b29090e80e8effff3bd8775d535657b8946983b28b5424309090ff12833c2401744c8b4424208b008b5c2418909090e83a270000bb05000000bafc317ab290e88aeef6ff8b5424309090ff128b442420eb0ae9e61b0000e9820000008b0083c0108b4c24208901eb23e970000000ff742418ff742430ff742430ff74243c8b5c2430b801000000e82e2300008b44240883e00f89c18b45008d40f03b45087303ff5520894500c740fc030000008b542404895008894804c700030000009090e8a67cfcff89c3b859000000e86ec7f6ff8b54243083c40c909090ff12eb68b8881883b2e82e8dffff3bd8755fb80c6e83b28b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e8f21b0000b8590000008b54242490ff12ff74240cff742424ff742424ff7424308b5c2424b8010000009090e876220000eb6be9f21a0000b8bc1883b2909090e8be8cffff3bd8755ab8206e83b28b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e8821b0000b8590000008b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d541201eb0ae9871a0000e97f0000008d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740a81f8010100007c27eb06f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b7424148916bb05000000bafc317ab29090e89eecf6ff8b5424249090ff12eb67b8741883b2e8d28bffff3bd8752eb8346e83b28b54242490ff12ff74240cff742424ff742424ff7424308b5c2424b8010000009090e846210000eb6bb86c1883b2e8968bffff3bd87562b8346e83b28b54242490ff128b4424148b008b4c240c8b098b5904eb05e997190000baffffff002353fc8d5412018d1495fdffffff3bc2720e89c2b8b8d082b28b5d049090ff13d1e80fb604038d440001a801741681f801010000eb0ae957190000e9530000007c27eb06f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b7424148916bb05000000bafc317ab29090e89aebf6ff8b5424249090ff12eb63b800ec82b2e8ce8affff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe997180000e9c3000000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf683f80d7507b8446e83b2eb1d83f8097507b8506e83b2eb1183f8057407b85c6e83b2eb05b8686e83b28b542424ff12b8130000008b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e89e180000eb63b85c387fb2e89e89ffff3bd8755a8b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740783f8017d19eb06f640ff107411ba01000000eb0fe967170000e92b010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf683f80f744f83f80d744183f80b743383f809742583f807741783f801740989c1b85c6e83b2eb3489c1b8746e83b2eb2b89c1b8846e83b2eb2289c1b8906e83b2eb1989c1b89c6e83b2eb1089c1b8ac6e83b2eb0789c1b8b86e83b2518b54242890ff12b8130000008b54242890ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e83a170000833c24017566b8590000008b542428909090ff12ff742410ff742428ff742428ff7424348b5c2428b8010000009090e8b61d0000eb5eb82c1983b2e80688ffff3bd875628b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc27215eb05e9f915000089c2b8b8d082b28b5d049090ff13d1e80fb604038d440001a801740c83f8017d19eb0be9d1150000f640ff10740cba01000000eb0ae96f010000ba0300000083fa03740ea801740583e80e7105ff5538ebf6bb110000009090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf683f807741783f801740989c1b85c6e83b2eb1089c1b8c86e83b2eb0789c1b8d86e83b2518b54242890ff12b8130000008b54242890ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e8d2150000833c24017559b8590000008b542428909090ff128b4424188b008b4c24108b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801740f81f8010100007c2ceb0be99e140000f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424188b1283c2028b7424188916bb05000000bafc317ab290e8eee6f6ff8b5424289090ff12eb6db8b4047db2e82286ffff3bd87420b8f4de7eb29090e81286ffff3bd87410b8b41883b29090e80286ffff3bd8755c8b4424148b008b4c240c8b098b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604068d440001eb05e9de130000a801740783f8017d14eb06f640ff10740cba01000000eb0ae9b1010000ba0300000083fa03740ea801740583e80e7105ff5538ebf653bb11000000909090ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf683f80f7507b8e46e83b2eb1d83f80b7507b8f06e83b2eb1183f8097407b85c6e83b2eb05b8fc6e83b28b542428ff12b8130000008b54242890ff12ff742410ff74242cff74242cff74242c8b5c24288b44241c909090e8ce130000b8590000008b54242890ff12b8b4047db29090e8c284ffff3b0424750db8630000008b542428ff12eb67b8f4de7eb2e8a684ffff3b0424750db8086f83b28b542428ff12eb668b4424188b008b4c24108b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720f89c2b8b8d082b28b5d04909090ff13d1e80fb604038d440001a801741181f801010000eb05e9681200007c2eeb06f640ff107526a801740f81e8fe010000eb05e94d1200007105ff5538ebeca801740583e8027105ff5538ebf68b5424188b1283c2028b7424188916bb05000000bafc317ab2e8aee4f6ff8b5424289090ff12eb6ab8c4777ab2e8e283ffff3bd875618b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d4400018b5424148b1283c2028b742414891681f86d010000741481f883010000eb0ae9a1110000e99803000075668b168b7c240c8b3f8b4f04beffffff002371fc8d7436018d34b5fdffffff3bd6720d89c3b8b8d082b28b5d0490ff13d1ea0fb614118d541201f6c201740783fa017d0feb06f642ff107407bb01000000eb05bb0300000083fb037416f6c201740c83ea0eeb05e9070100007105ff5538ebef50bb1100000089d0ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf6813c246d010000740989c1b8146f83b2eb0789c1b8246f83b2518b54242c909090ff12ff742414ff742430ff742430ff7424308b5c242c8b442420909090e866110000b8590000008b54242c90ff12f604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b54240c895008894804c70003000000909090e86671fcff8b54242c83c408909090ff12eb57a801740a81f8010100007c50eb06f640ff107557a801740a81f81f0100007f5eeb06f640ff10745b8b16508b5c241089d0e8727fffff8b4c24188b0983c1088b542418890a8b0c24f6c101743d81f901010000723aeb0ae9ca0f0000e99b01000081f91f010000772beb05e98c010000bb025083b28d9c8bfcfbffffeb0ae979010000e974010000ffe3e98b000000e986000000e98100000090e984000000909090e973000000909090e97d000000909090e97e000000909090e97f000000909090e980000000909090e981000000909090e982000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e963000000909090e969000000909090e974000000909090e97a00000090909089c1b8346f83b2eb4889c1b8406f83b2eb4d89c1b84c6f83b2eb4989c1b8586f83b2eb4e89c1b8646f83b2eb5189c1b8706f83b2eb4889c1b87c6f83b2eb3f89c1b8886f83b2eb3689c1b8946f83b2eb2de92800000089c1b8a06f83b2eb1fe91a000000e91500000089c1b8ac6f83b2eb0ce90700000089c1b8b86f83b2518b54242c909090ff128b44241c8b00a801740783f8017d15eb06f640ff10740d89c3b88c6c7ab2ff1588c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0500000083c408bafc317ab2909090e8cae0f6ff8b5424249090ff12eb6450b8c46f83b28b5424289090ff12bb0500000058bafc317ab2e8a2e0f6ff8b5424249090ff12eb60b8d06f83b2e8d67fffff3bd87533b8846a83b28b54242490ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e89a0e0000eb61e9c10d0000b8a41883b2909090e8927fffff3bd87513b8d86f83b28b54242490ff12eb67e99d0d0000b8e46f83b2909090e86e7fffff3bd8750eb8ec6f83b28b54242490ff12eb64b8ac1883b2e8527fffff3bd8755bb8f86f83b28b542424eb05e9600d00009090ff128b4424148b008b5c240c90e8c21d00008b4c24148b0983c1048b542414890aeb05e9360d0000bb05000000bafc317ab2909090e8badff6ff8b5424249090ff12eb6be9150d0000b8341983b2909090e8e67effff3bd8755ab8147183b28b54242490ff128b4424148b008b4c240c8b098b5904baffffff002353fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604038d440001a801741681f801010000eb0ae9aa0c0000e9530000007c27eb06f640ff10751fa801740881e8fe0100007105ff5538ebf3a801740583e8027105ff5538ebf68b5424148b1283c2028b7424148916bb05000000bafc317ab29090e8f2def6ff8b5424249090ff12eb68b8286e7ab2e8267effff3bd8725fb8a00c83b29090e8167effff3bd8776b8b4424148b008b4c240c8b098b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff13d1e80fb604068d44000189c2c1ea0383ca0183e20feb0ae9e50b0000e9fe0a000089df83e70f89c181e18101000081f9810100007569eb05e9e20a000089c183e10f83ff01755d83fa03755df6c101740783f9017d19eb06f641ff10741189cbb88c6c7ab29090ff1588c75208eb0289c8bb05000000bafc317ab290e816def6ff89c3b8287183b2e87ab7f6ffbb530000009090e86eb7f6ff8b542424eb0fe9ce070000e982020000e90500000090ff12eb5c83fa01755cf6c101740783f9017d19eb06f641ff10741189cbb88c6c7ab29090ff1588c75208eb0289c8bb05000000bafc317ab290e8aaddf6ff89c3b83c7183b2e80eb7f6ffbb530000009090e802b7f6ff8b5424249090ff12eb60e94d07000083fa07755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e84addf6ff89c3b8507183b2e8aeb6f6ffbb530000009090e8a2b6f6ff8b5424249090ff12eb60e9ed06000083fa0f755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e8eadcf6ff89c3b8647183b2e84eb6f6ffbb530000009090e842b6f6ff8b5424249090ff12eb60e98d06000083fa0d755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e88adcf6ff89c3b8787183b2e8eeb5f6ffbb530000009090e8e2b5f6ff8b5424249090ff12eb60e92d06000083fa0b755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e82adcf6ff89c3b88c7183b2e88eb5f6ffbb530000009090e882b5f6ff8b5424249090ff12eb60e9cd05000083fa09755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e8cadbf6ff89c3b8a07183b2e82eb5f6ffbb530000009090e822b5f6ff8b5424249090ff12eb52e96d0500005089d9bb0500000089c8bafc317ab290e88edbf6ff8b5424289090ff12bb0500000058bafc317ab2e876dbf6ff8b5424249090ff12eb6483ff0b756483fa017564f6c101740c83f9017d1ceb0be91b050000f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8bb05000000bafc317ab290e82adbf6ff89c3b8b47183b2e88eb4f6ffbb530000009090e882b4f6ff8b5424249090ff12eb64e9cd040000e9f600000083fa07755af6c101740783f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8bb05000000bafc317ab290e8c6daf6ff89c3b8c87183b2e82ab4f6ffbb530000009090e81eb4f6ff8b5424249090ff12eb60e96904000083fa05755bf6c101740783f9017d18eb06f641ff10741089cbb88c6c7ab290ff1588c75208eb0289c8bb05000000bafc317ab290e866daf6ff89c3b8d87183b2e8cab3f6ffbb530000009090e8beb3f6ff8b5424249090ff12eb58e9090400005089d9bb0500000089c8bafc317ab290e82adaf6ff8b5424289090ff12bb0500000058bafc317ab2e812daf6ff8b5424249090ff12eb5883ff0f755883fa09751783f9017512b8e87183b28b542424ff12eb57e9b10300005089d9bb0500000089c8bafc317ab290e8d2d9f6ff8b5424289090ff12bb0500000058bafc317ab2e8bad9f6ff8b5424249090ff12eb68e97503000083ff03756383fa037563f6c101740c83f9017d1feb0be95a030000f641ff10741289cbb88c6c7ab2909090ff1588c75208eb0289c8bb05000000bafc317ab290e866d9f6ff89c3b8fc7183b2e8cab2f6ffbb530000009090e8beb2f6ff8b542424eb0fe90d030000e9ca020000e90500000090ff12eb5c83fa01755cf6c101740783f9017d19eb06f641ff10741189cbb88c6c7ab29090ff1588c75208eb0289c8bb05000000bafc317ab290e8fad8f6ff89c3b80c7283b2e85eb2f6ffbb530000009090e852b2f6ff8b5424249090ff12eb5ce99d02000083fa0f756283f90f750db81c7283b28b542424ff12eb6883f905750fb8287283b28b5424249090ff12eb5983f90d750fb8387283b28b5424249090ff12eb655089d9bb0500000089c8bafc317ab29090e87ed8f6ffeb05e9410200008b542428909090ff12eb05e927000000bb0500000058bafc317ab290e856d8f6ffeb0ae919020000e9140200008b5424249090ff12eb5983fa0d755983f90f7516b8447283b2eb05e9f40100008b5424249090ff12eb6883f907750fb8547283b28b5424249090ff12eb5983f90d750fb8647283b28b5424249090ff12eb615089d9bb0500000089c8bafc317ab2eb0ae9ac010000e9350000009090e8d6d7f6ff8b5424289090ff12bb0500000058bafc317ab2e8bed7f6ff8b542424eb0ae97d010000e9780100009090ff12eb5983fa0b755983f9037516b8747283b2eb05e95c0100008b5424249090ff12eb6883f90d750fb8807283b28b5424249090ff12eb5983f901750fb88c7283b28b5424249090ff12eb615089d9bb0500000089c8bafc317ab2eb0ae914010000e9350000009090e83ed7f6ff8b5424289090ff12bb0500000058bafc317ab2e826d7f6ff8b542424eb0ae9e5000000e9e00000009090ff12eb5883fa09755883f9017516b8987283b2eb05e9c40000008b5424249090ff12eb6c5089d9bb0500000089c8bafc317ab29090e8dad6f6ff8b5424289090ff12bb0500000058bafc317ab2e8c2d6f6ff8b5424249090ff12eb6fe97d0000005089d9bb0500000089c8bafc317ab290e89ed6f6ff8b5424289090ff12bb0500000058bafc317ab2e886d6f6ffeb05e9490000008b542424909090ff12eb3e5089d9bb0500000089c8bafc317ab29090e85ed6f6ff8b5424289090ff12bb0500000058bafc317ab2eb05e90e00000090e83ed6f6ff8b5424249090ff128b4424148b0083c0028b4c24148901eb5d83ff0b755d83fa05750fb8a47283b28b5424249090ff12eb6883fa07750fb8b07283b28b5424249090ff12eb5983fa01750fb8c07283b28b5424249090ff12eb615089d9bb0500000089c8bafc317ab29090e8ced5f6ff8b542428eb0ae92d030000e92a0000009090ff12bb0500000058bafc317ab2e8aad5f6ff8b542424eb0ae905020000e9000200009090ff12eb5883ff09755883fa0f7516b8d07283b2eb05e9e40100008b5424249090ff12eb5c83fa0d750fb8e07283b28b5424249090ff12eb5d83fa09750fb8f07283b28b5424249090ff12eb6083fa07751bb8007383b28b542424eb0ae99d010000e9a30000009090ff12eb6183fa037514b8107383b28b5424249090ff12eb69e97901000083fa0b7516b8207383b28b542424eb05e9640100009090ff12eb6483fa017517b8307383b2eb05e94d0100008b542424909090ff12eb625089d9bb0500000089c8bafc317ab2eb05e92c010000909090e8bed4f6ff8b5424289090ff12bb05000000eb05e91001000058bafc317ab290e89ed4f6ff8b5424249090ff12eb5ce9f500000083ff0f755783fa0b7515b8407383b28b542424eb05e9db00000090ff12eb655089d9bb0500000089c8bafc317ab29090e85ad4f6ff8b5424289090ff12bb0500000058bafc317ab2e842d4f6ff8b5424249090ff12eb5ce99900000083ff07755783fa01750db8507383b28b542424ff12eb6f5089d9bb0500000089c8bafc317ab2eb05e96c000000909090e8fed3f6ff8b5424289090ff12bb0500000058bafc317ab2e8e6d3f6ff8b5424249090ff12eb42e93d0000005089d9bb0500000089c8bafc317ab290e8c2d3f6ff8b5424289090ff12bb0500000058bafc317ab2eb05e90e00000090e8a2d3f6ff8b5424249090ff12ff74240cff742428ff742428ff7424288b5c24248b442418909090e8b6010000eb5fb8607383b2e8b672ffff3bd8750eb8687383b28b54242490ff12eb5fb89c1883b2e89a72ffff3bd8750eb8787383b28b54242490ff12eb5f81fb490100007510b8847383b28b542424909090ff12eb5e81fb4b0100007514b8947383b2eb05e97e0000008b542424ff12eb6281fb4d0100007514b8a47383b2eb05e9620000008b542424ff12eb5a81fb550100007514b8b47383b2eb05e9460000008b542424ff12eb3e81fb570100007514eb05e92f000000b8c47383b28b542424ff12eb2289d8bb05000000bafc317ab2eb05e90f0000009090e89ed2f6ff8b5424249090ff126a0183c4046a01b81500000083c4108b542418909090ff123b650c7303ff5524e97bc5ffffb81500000083c4185a5983c40451ff229000000000483b0000|@10212,2097151,@1311|38,0,0 45,0,I48 61,0,I48 78,0,4 134,0,63 163,0,@9768 212,0,@5215 218,0,I106 223,0,2 228,0,@5052 234,1,@5053 247,0,9 273,0,8388607 305,0,@9824 329,0,240 336,0,@10067 362,0,0 369,0,0 388,0,8388607 413,0,@9824 437,0,64 445,0,79 469,0,0 484,0,0 491,0,1 509,0,0 516,0,1 534,0,0 541,0,1 559,0,0 566,0,1 592,0,8388607 615,0,@9824 655,0,@9902 662,1,@9831 671,0,@9903 678,1,@9831 687,0,@9878 694,1,@9831 718,0,8388607 743,0,@9824 781,0,0 788,0,1 820,0,8 826,0,I109 831,0,8 838,0,I110 865,0,0 872,0,1 901,0,@10068 913,0,@10069 925,0,@10070 937,0,@10071 949,0,@10072 961,0,@10073 973,0,@10074 980,0,@10075 991,0,@9878 998,1,@9831 1008,0,98 1021,0,108 1035,0,@10076 1074,1,@10077 1079,0,44 1091,0,@9903 1098,1,@9831 1128,0,0 1134,1,@10078 1156,0,8388607 1181,0,@9824 1209,0,128 1277,0,2 1282,0,@5052 1290,1,@5053 1305,0,@5763 1310,1,@9831 1319,0,@10085 1346,0,8388607 1371,0,@9824 1397,0,128 1491,0,@5215 1498,0,I106 1533,0,2 1541,0,@5052 1546,1,@5053 1561,0,@5876 1566,1,@9831 1575,0,@10086 1602,0,8388607 1627,0,@9824 1653,0,128 1747,0,@5215 1754,0,I106 1789,0,2 1797,0,@5052 1802,1,@5053 1817,0,@10087 1822,1,@9831 1831,0,@10088 1858,0,8388607 1883,0,@9824 1909,0,128 2003,0,@5215 2010,0,I106 2045,0,2 2053,0,@5052 2058,1,@5053 2073,0,@7164 2078,1,@9831 2087,0,@10089 2114,0,8388607 2139,0,@9824 2165,0,128 2259,0,@5215 2266,0,I106 2301,0,2 2309,0,@5052 2314,1,@5053 2329,0,@5834 2334,1,@9831 2343,0,@10090 2370,0,8388607 2395,0,@9824 2421,0,128 2515,0,@5215 2522,0,I106 2557,0,2 2565,0,@5052 2570,1,@5053 2585,0,@7018 2590,1,@9831 2599,0,@10091 2626,0,8388607 2651,0,@9824 2677,0,128 2771,0,@5215 2778,0,I106 2813,0,2 2821,0,@5052 2826,1,@5053 2841,0,@5816 2846,1,@9831 2855,0,@10092 2882,0,8388607 2907,0,@9824 2933,0,128 3027,0,@5215 3034,0,I106 3069,0,2 3077,0,@5052 3082,1,@5053 3097,0,@5831 3102,1,@9831 3111,0,@10093 3138,0,8388607 3163,0,@9824 3189,0,128 3283,0,@5215 3290,0,I106 3325,0,2 3333,0,@5052 3338,1,@5053 3353,0,@5757 3358,1,@9831 3367,0,@10094 3394,0,8388607 3419,0,@9824 3445,0,128 3539,0,@5215 3546,0,I106 3581,0,2 3589,0,@5052 3594,1,@5053 3609,0,@5748 3614,1,@9831 3623,0,@10095 3650,0,8388607 3675,0,@9824 3701,0,128 3795,0,@5215 3802,0,I106 3837,0,2 3845,0,@5052 3850,1,@5053 3865,0,@5873 3870,1,@9831 3879,0,@10096 3906,0,8388607 3931,0,@9824 3957,0,128 4051,0,@5215 4058,0,I106 4093,0,2 4101,0,@5052 4106,1,@5053 4121,0,@5528 4126,1,@9831 4135,0,@10097 4162,0,8388607 4187,0,@9824 4213,0,128 4307,0,@5215 4314,0,I106 4349,0,2 4357,0,@5052 4362,1,@5053 4377,0,@9858 4382,1,@9831 4391,0,@10098 4418,0,8388607 4443,0,@9824 4469,0,128 4563,0,@5215 4570,0,I106 4605,0,2 4613,0,@5052 4618,1,@5053 4633,0,@9863 4638,1,@9831 4658,1,@9823 4679,0,@10099 4716,0,@5215 4722,0,I106 4762,0,2 4770,0,@5052 4778,1,@5053 4793,0,@5413 4798,1,@9831 4818,1,@9823 4839,0,@10100 4876,0,@5215 4882,0,I106 4922,0,2 4930,0,@5052 4938,1,@5053 4953,0,@9888 4958,1,@9831 4982,0,8388607 5007,0,@9824 5045,0,0 5062,0,1 5086,0,8 5094,0,I109 5099,0,8 5106,0,I110 5133,0,0 5140,0,1 5165,0,@10101 5206,1,@10077 5211,0,44 5294,0,1 5302,1,@8788 5351,0,8388607 5376,0,@9824 5418,0,0 5435,0,1 5460,0,8 5466,0,I109 5471,0,8 5478,0,I110 5505,0,0 5512,0,1 5553,0,@10068 5567,0,@10069 5581,0,@10070 5595,0,@10071 5609,0,@10072 5623,0,@10073 5637,0,@10074 5656,0,@10075 5671,0,9 5710,1,@10077 5715,0,44 5798,0,1 5806,1,@8788 5825,0,@9898 5830,1,@9831 5854,0,8388607 5879,0,@9824 5917,0,0 5934,0,1 5958,0,8 5966,0,I109 5971,0,8 5978,0,I110 6005,0,0 6012,0,1 6037,0,@10101 6122,0,1 6130,1,@8788 6147,0,44 6186,1,@10077 6193,0,@10102 6198,1,@9831 6222,0,8388607 6247,0,@9824 6285,0,0 6302,0,1 6326,0,8 6334,0,I109 6339,0,8 6346,0,I110 6373,0,0 6380,0,1 6405,0,@10103 6490,0,1 6498,1,@8788 6515,0,44 6554,1,@10077 6561,0,@9996 6566,1,@9831 6590,0,8388607 6615,0,@9824 6653,0,0 6670,0,1 6694,0,8 6702,0,I109 6707,0,8 6714,0,I110 6741,0,0 6748,0,1 6773,0,@10104 6811,0,1 6816,0,@5052 6822,1,@5053 6829,0,114 6834,1,@4940 6839,0,66 6846,1,@4940 6878,0,$10066+6890 6955,0,1 6963,0,@5052 6978,1,@5053 6985,0,114 6990,1,@4940 7005,0,@10105 7021,0,@10106 7037,0,@10107 7053,0,@10108 7076,0,@10109 7083,0,@10110 7119,0,@10111 7131,0,@10112 7157,0,@10113 7169,0,@10114 7192,0,@10115 7204,0,@10116 7215,0,44 7258,1,@10077 7265,0,@9988 7270,1,@9831 7279,0,@10117 7286,1,@9831 7329,0,1 7334,1,@8788 7341,0,@10118 7346,1,@4940 7366,0,@9990 7374,1,@9831 7383,0,@10119 7390,1,@9831 7433,0,1 7438,1,@8788 7445,0,@10120 7450,1,@4940 7473,0,@9830 7478,1,@9831 7487,0,@10121 7501,0,@9892 7506,1,@9831 7530,0,8388607 7555,0,@9824 7605,0,0 7617,0,1 7641,0,8 7650,0,I109 7655,0,8 7662,0,I110 7689,0,0 7696,0,1 7721,0,@10122 7762,1,@10077 7767,0,44 7850,0,1 7858,1,@8788 7877,0,@10123 7882,1,@9831 7891,0,@10124 7898,1,@9831 7910,0,@10101 7942,1,@10125 7947,0,2 7952,0,@5052 7958,1,@5053 8025,0,0 8030,1,@10078 8079,0,1 8086,1,@8788 8093,0,44 8098,1,@4940 8117,0,@9989 8122,1,@9831 8131,0,@10127 8170,1,@10077 8175,0,44 8207,0,0 8214,1,@10078 8226,0,@9995 8234,1,@9831 8243,0,@10128 8282,1,@10077 8287,0,44 8314,0,8388607 8351,0,@9824 8377,0,128 8438,0,2 8443,0,@5052 8450,1,@5053 8465,0,@9987 8470,1,@9831 8479,0,@10129 8511,0,0 8518,1,@10078 8525,0,@9986 8530,1,@9831 8539,0,@10129 8573,0,8388607 8598,0,@9824 8625,0,128 8698,0,2 8703,0,@5052 8710,1,@5053 8725,0,@9897 8730,1,@9831 8754,0,8388607 8779,0,@9824 8817,0,0 8834,0,1 8858,0,8 8866,0,I109 8871,0,8 8878,0,I110 8905,0,0 8912,0,1 8941,0,@10130 8953,0,@10131 8965,0,@10132 8972,0,@10133 8983,0,9 9022,1,@10077 9029,0,@8629 9034,1,@9831 9058,0,8388607 9083,0,@9824 9121,0,0 9138,0,1 9162,0,8 9170,0,I109 9175,0,8 9182,0,I110 9209,0,0 9216,0,1 9272,0,@10132 9281,0,@10134 9290,0,@10135 9299,0,@10136 9308,0,@10137 9317,0,@10138 9326,0,@10139 9339,0,9 9378,1,@10077 9389,0,44 9423,0,0 9430,1,@10078 9437,0,@10000 9442,1,@9831 9466,0,8388607 9498,0,@9824 9542,0,0 9554,0,1 9578,0,8 9586,0,I109 9591,0,8 9598,0,I110 9625,0,0 9632,0,1 9668,0,@10132 9677,0,@10140 9686,0,@10141 9699,0,9 9738,1,@10077 9749,0,44 9778,0,8388607 9803,0,@9824 9829,0,128 9895,0,2 9900,0,@5052 9906,1,@5053 9921,0,@7817 9926,1,@9831 9935,0,@8497 9942,1,@9831 9951,0,@9994 9958,1,@9831 9982,0,8388607 10007,0,@9824 10052,0,0 10064,0,1 10089,0,8 10098,0,I109 10103,0,8 10110,0,I110 10137,0,0 10144,0,1 10173,0,@10142 10185,0,@10143 10197,0,@10132 10204,0,@10144 10215,0,9 10254,1,@10077 10259,0,44 10271,0,@7817 10278,1,@9831 10288,0,49 10301,0,@8497 10306,1,@9831 10316,0,@10145 10344,0,8388607 10369,0,@9824 10397,0,128 10472,0,2 10477,0,@5052 10482,1,@5053 10497,0,@5383 10502,1,@9831 10526,0,8388607 10551,0,@9824 10588,0,182 10596,0,193 10626,0,8388607 10651,0,@9824 10690,0,0 10697,0,1 10730,0,8 10738,0,I109 10743,0,8 10750,0,I110 10777,0,0 10784,0,1 10810,0,182 10819,0,@10146 10828,0,@10147 10870,1,@10077 10875,0,44 10958,0,1 10966,1,@8788 10990,0,128 11010,0,143 11034,1,@9823 11063,0,128 11083,0,143 11097,0,$10066+11138 11269,0,@10148 11278,0,@10149 11287,0,@10150 11296,0,@10151 11305,0,@10152 11314,0,@10153 11323,0,@10154 11332,0,@10155 11341,0,@10156 11355,0,@10157 11374,0,@10158 11388,0,@10159 11428,0,@5215 11434,0,I106 11462,0,2 11470,0,@5052 11478,1,@5053 11494,0,@10160 11507,0,2 11513,0,@5052 11518,1,@5053 11533,0,@10161 11538,1,@9831 11547,0,@10120 11586,1,@10077 11598,0,@9992 11606,1,@9831 11615,0,@10162 11634,0,@10163 11642,1,@9831 11651,0,@10164 11665,0,@9993 11670,1,@9831 11679,0,@10165 11710,1,@10166 11737,0,2 11742,0,@5052 11750,1,@5053 11770,0,@10001 11778,1,@9831 11787,0,@10168 11814,0,8388607 11839,0,@9824 11865,0,128 11938,0,2 11943,0,@5052 11950,1,@5053 11965,0,@5239 11970,1,@9831 11979,0,@9955 11986,1,@9831 12010,0,8388607 12035,0,@9824 12093,0,192 12142,0,@5215 12150,0,I106 12159,0,2 12164,0,@5052 12170,1,@5053 12177,0,@10169 12182,1,@4940 12187,0,41 12194,1,@4940 12250,0,@5215 12258,0,I106 12267,0,2 12272,0,@5052 12278,1,@5053 12285,0,@10170 12290,1,@4940 12295,0,41 12302,1,@4940 12347,0,@5215 12354,0,I106 12363,0,2 12368,0,@5052 12374,1,@5053 12381,0,@10171 12386,1,@4940 12391,0,41 12398,1,@4940 12443,0,@5215 12450,0,I106 12459,0,2 12464,0,@5052 12470,1,@5053 12477,0,@10172 12482,1,@4940 12487,0,41 12494,1,@4940 12539,0,@5215 12546,0,I106 12555,0,2 12560,0,@5052 12566,1,@5053 12573,0,@10173 12578,1,@4940 12583,0,41 12590,1,@4940 12635,0,@5215 12642,0,I106 12651,0,2 12656,0,@5052 12662,1,@5053 12669,0,@10174 12674,1,@4940 12679,0,41 12686,1,@4940 12731,0,@5215 12738,0,I106 12747,0,2 12752,0,@5052 12758,1,@5053 12765,0,@10175 12770,1,@4940 12775,0,41 12782,1,@4940 12805,0,2 12812,0,@5052 12818,1,@5053 12831,0,2 12837,0,@5052 12842,1,@5053 12892,0,@5215 12898,0,I106 12907,0,2 12912,0,@5052 12918,1,@5053 12925,0,@10176 12930,1,@4940 12935,0,41 12942,1,@4940 12992,0,@5215 12998,0,I106 13007,0,2 13012,0,@5052 13018,1,@5053 13025,0,@10177 13030,1,@4940 13035,0,41 13042,1,@4940 13087,0,@5215 13094,0,I106 13103,0,2 13108,0,@5052 13114,1,@5053 13121,0,@10178 13126,1,@4940 13131,0,41 13138,1,@4940 13161,0,2 13168,0,@5052 13174,1,@5053 13187,0,2 13193,0,@5052 13198,1,@5053 13228,0,@10179 13249,0,2 13256,0,@5052 13262,1,@5053 13275,0,2 13281,0,@5052 13286,1,@5053 13341,0,@5215 13350,0,I106 13359,0,2 13364,0,@5052 13370,1,@5053 13377,0,@10180 13382,1,@4940 13387,0,41 13394,1,@4940 13450,0,@5215 13458,0,I106 13467,0,2 13472,0,@5052 13478,1,@5053 13485,0,@10181 13490,1,@4940 13495,0,41 13502,1,@4940 13532,0,@10182 13550,0,@10183 13570,0,@10184 13588,0,2 13595,0,@5052 13602,1,@5053 13630,0,2 13636,0,@5052 13642,1,@5053 13679,0,@10185 13706,0,@10186 13726,0,@10187 13744,0,2 13751,0,@5052 13770,1,@5053 13783,0,2 13789,0,@5052 13794,1,@5053 13831,0,@10188 13858,0,@10189 13878,0,@10190 13896,0,2 13903,0,@5052 13922,1,@5053 13935,0,2 13941,0,@5052 13946,1,@5053 13983,0,@10191 14008,0,2 14015,0,@5052 14022,1,@5053 14035,0,2 14041,0,@5052 14046,1,@5053 14069,0,2 14076,0,@5052 14082,1,@5053 14095,0,2 14101,0,@5052 14106,1,@5053 14132,0,2 14139,0,@5052 14146,1,@5053 14159,0,2 14165,0,@5052 14178,1,@5053 14218,0,@10192 14238,0,@10193 14258,0,@10194 14276,0,2 14283,0,@5052 14290,1,@5053 14315,0,2 14321,0,@5052 14326,1,@5053 14363,0,@10195 14390,0,@10196 14410,0,@10197 14430,0,@10198 14462,0,@10199 14487,0,@10200 14514,0,@10201 14540,0,2 14547,0,@5052 14562,1,@5053 14575,0,2 14588,0,@5052 14594,1,@5053 14624,0,@10202 14648,0,2 14655,0,@5052 14662,1,@5053 14675,0,2 14681,0,@5052 14686,1,@5053 14716,0,@10203 14732,0,2 14739,0,@5052 14754,1,@5053 14767,0,2 14773,0,@5052 14778,1,@5053 14801,0,2 14808,0,@5052 14814,1,@5053 14827,0,2 14833,0,@5052 14846,1,@5053 14886,1,@10077 14893,0,@10204 14898,1,@9831 14907,0,@10205 14921,0,@9991 14926,1,@9831 14935,0,@10206 14950,0,164 14957,0,@10207 14974,0,165 14981,0,@10208 15002,0,166 15009,0,@10209 15030,0,170 15037,0,@10210 15058,0,171 15072,0,@10211 15087,0,2 15092,0,@5052 15106,1,@5053 15126,0,10 15156,0,10 10067:S5|6c6f636b20 10068:S3|786f72 10069:S3|737562 10070:S3|616e64 10071:S3|736262 10072:S3|616463 10073:S2|6f72 10074:S3|636d70 10075:S3|616464 10076:S5|5f72657609 10077:D3,1692|3b650c7303ff55248b0b8b5424108b128b7a04beffffff002377fc8d7436018d34b5fdffffff3bce720f89c6b8b8d082b28b5d04909090ff13d1e90fb60c0f8d4c09018b3383c6028933f6c101740783f9017d0feb06f641ff107407be01000000eb05be0300000083fe03741489cef7c601000000740583ee7e7107ff5538ebf689ce535051bb8100000089f0909090ff15e8c7520850bb110000008b442404ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf68b4c240883e10583f9017407b901000000eb05b90300000083f1028b54240883e20383fa017407ba01000000eb05ba0300000083f202833c240775568b4c241ca80175108b18f640ff107402f7db8d5c1b01eb0289c381e3ff0100008b45008d40f03b45087303ff5520894500c740fc03000000895008895804c700030000005190e8fe5efcff5a83c4105983c41051ff2283f80975648b44240c8b008b5c24208b1b8b7b04beffffff002377fc8d7436018d34b5fdffffff3bc6720d89c6b8b8d082b28b5d0490ff13d1e80fb604078d4400018b74240c8b3683c6028b5c240c8933a801740783f8017d14eb06f640ff10740cbe01000000eb0ae919030000be0300000083fe03741489c6f7c601000000740583ee7e7107ff5538ebf689c6525150bb8100000089f0909090ff15e8c752088b0c24f6c101740783f9017d0feb06f641ff107407ba01000000eb05ba0300000083fa03740ff6c101740583e90e7105ff5538ebf650bb1100000089c890ff15e8c75208bb1100000090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf650bb110000008b442408909090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0107105ff5538ebf6837c24140375618b4c24208b098b5424348b128b7204bbffffff00235efc8d5c1b018d1c9dfdffffff3bcb720d89c3b8b8d082b28b5d0490ff13d1e90fb60c0e8d4c0901f6c101740a81f9010100007c30eb06f641ff107528f6c101740881e9fe010000710ceb05e940000000ff5538ebecf6c101740583e9027105ff5538ebf68b5c24208b1b83c3028b7c2420891f50bb0500000089c8bafc317ab290e846cef6ff8b5424349090ff12eb31837c241405740583f80b752450ff742438ff742434ff742434ff7424408b5c2434b801000000909090e8fa020000eb0150b8510000008b5424349090ff12837c2418017506833c240b745bf604240175138b0c248b01f641ff107402f7d88d440001eb038b042481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542414895008894804c700030000009090e83a5cfcff8b5424349090ff12837c240409746ff64424040175148b4c24048b01f641ff107402f7d88d440001eb048b44240481e0ff01000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542410895008894804c7000300000090e8d65bfcff89c3b859000000e89ea6f6ff837c240801750cb93c6883b2eb26e931000000837c2408037507b9486883b2eb13837c2408057407b9546883b2eb05b9606883b289cb90e862a6f6ff8b5424349090ff128b44243483c41889c1b85300000089ca83c4105983c41051ff22833c2401754783f80b7542b8510000008b54241cff12ff742420ff74241cff74241cff7424288b5c241cb8010000009090e8860100008b44241c89c1b85300000089ca83c4105983c41051ff22833c240375638b4c240c8b098b5c24208b1b8b7b04beffffff002377fc8d7436018d34b5fdffffff3bce720c89c6b8b8d082b28b5d04ff13d1e90fb60c0f8d4c0901f6c101740a81f9010100007c30eb06f641ff107528f6c101740881e9fe010000710cff5538eb05e93d000000ebecf6c101740583e9027105ff5538ebf68b74240c8b3683c6028b5c240c89335250bb0500000089c8bafc317ab2e8e2cbf6ff8b5424249090ff12eb2a833c240575225250ff742428ff742424ff742424ff7424308b5c2424b801000000e89e000000eb0252508b442424f604240175138b14248b0af642ff107402f7d98d4c0901eb038b0c2481e1ff01000089c28b45008d40f03b45087303ff5520894500c740fc030000008b5c2404895808894804c70003000000529090e8f259fcff89c3b851000000e8baa4f6ffbb530000009090e8aea4f6ff5a83c40883c4105983c41051ff220000000098060000|@10084,2097151,@1308|20,0,8388607 45,0,@9824 93,0,0 100,0,1 135,0,64 146,0,I109 152,0,8 162,0,I110 189,0,0 196,0,1 232,0,0 239,0,1 259,0,0 266,0,1 343,0,1 350,1,@8788 386,0,8388607 411,0,@9824 464,0,0 476,0,1 511,0,64 522,0,I109 548,0,0 555,0,1 581,0,8 590,0,I109 595,0,8 602,0,I110 629,0,0 636,0,1 661,0,8 674,0,I110 701,0,0 708,0,1 754,0,8388607 779,0,@9824 806,0,128 877,0,2 884,0,@5052 890,1,@5053 938,0,0 946,1,@10078 954,0,40 1051,0,1 1058,1,@8788 1152,0,1 1158,1,@8788 1165,0,44 1170,1,@4940 1182,0,@10080 1201,0,@10081 1215,0,@10082 1222,0,@10083 1230,1,@4940 1252,0,41 1280,0,40 1311,0,0 1318,1,@10078 1329,0,41 1367,0,8388607 1392,0,@9824 1418,0,128 1490,0,2 1497,0,@5052 1502,1,@5053 1545,0,0 1550,1,@10078 1634,0,1 1642,1,@8788 1649,0,40 1654,1,@4940 1659,0,41 1666,1,@4940 10078:D3,232|3b650c7303ff55248b03538b5c24149090e8ea67ffff8b0c248b0983c1088b1424890a83f80375678b4c24108b0983f90174618b1283ea088b4c240c8b095250f6c10175598b198b7308833e0175348b7e043b5304751e8b442410508b5f10b87b00000090e81aa4f6ff5a83c40c5983c41051ff22ff7104593b650c7303ff5524ebbd8b790489f93b650c730feb0ae929000000e924000000ff5524eba28b4c241051bb05000000bafc317ab2e862caf6ff5a83c40c5983c41051ff228b4c240851bb05000000bafc317ab290e842caf6ff5a83c4045983c41051ff2290909000000000e4000000|@10079,2097151,@1307|18,1,@9823 96,0,61 102,1,@4940 164,0,2 169,0,@5052 174,1,@5053 195,0,2 200,0,@5052 206,1,@5053 10079:S38|5838364f5554505554434f444528292e7072696e74436f64652833297072696e743332283129 10080:S2|2c31 10081:S2|2c32 10082:S2|2c38 10083:S2|2c34 10084:S38|5838364f5554505554434f444528292e7072696e74436f64652833297072696e744541283129 10085:S5|6a65202009 10086:S6|6a6e65202009 10087:O2|2,11 10088:S5|6a6f202009 10089:S6|6a6e6f202009 10090:S5|6a6c202009 10091:S5|6a67202009 10092:S5|6a6c652009 10093:S5|6a67652009 10094:S5|6a62202009 10095:S5|6a61202009 10096:S5|6a6e612009 10097:S5|6a6e622009 10098:S5|6a6d702009 10099:S4|6a6d7009 10100:S5|63616c6c09 10101:S5|6d6f766c09 10102:O1|37 10103:S7|7863686e676c09 10104:S5|6d6f766209 10105:S3|25616c 10106:S3|25636c 10107:S3|25646c 10108:S3|25626c 10109:S4|2573696c 10110:S3|256168 10111:S4|2564696c 10112:S3|256368 10113:S4|2562706c 10114:S3|256468 10115:S4|2573706c 10116:S3|256268 10117:O2|30,7 10118:S6|707573686c09 10119:O2|27,7 10120:S4|706f7009 10121:S3|6e6f70 10122:S5|6c65616c09 10123:O2|20,0 10124:O2|20,7 10125:D3,784|3b650c7303ff55248b0b8b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff1389c2d1ea0fb614168d54120189c783c7028b0b528b5104beffffff002372fc8d7436018d34b5fdffffff3bfe720e89c6b8b8d082b28b5d049090ff13d1ef0fb63c3a8d7c3f0189c683c6048b0b578b7904baffffff002357fc8d5412018d1495fdffffff3bf2720c89c2b8b8d082b28b5d04ff13d1ee0fb634378d74360189c283c2068b0b568b7104bfffffff00237efc8d7c3f018d3cbdfdffffff3bd7720c89c7b8b8d082b28b5d04ff13d1ea0fb614168d54120189c783c7088b0b528b5104beffffff002372fc8d7436018d34b5fdffffff3bfe720c89c6b8b8d082b28b5d04ff13d1ef0fb63c3a8d7c3f0189c683c60a8b0b578b7904baffffff002357fc8d5412018d1495fdffffff3bf2720c89c2b8b8d082b28b5d04ff13d1ee0fb634378d74360189c283c20c8b0b568b7104bfffffff00237efc8d7c3f018d3cbdfdffffff3bd7720c89c7b8b8d082b28b5d04ff13d1ea0fb614168d54120183c00e8b1b8b4b04bfffffff002379fc8d7c3f018d3cbdfdffffff3bc7720f89c6b8b8d082b28b5d04909090ff13d1e80fb604018d440001a801740a81f8010100007c19eb06f640ff107511a801740881e8000200007105ff5538ebf352bb010200009090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3bb0102000083c404909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf383c404c3909090000000000c030000|@10126,2097151,@1309|14,0,8388607 39,0,@9824 73,0,8388607 98,0,@9824 131,0,8388607 156,0,@9824 187,0,8388607 212,0,@9824 243,0,8388607 268,0,@9824 299,0,8388607 324,0,@9824 355,0,8388607 380,0,@9824 408,0,8388607 433,0,@9824 461,0,128 494,0,256 502,0,I108 530,0,256 542,0,I108 570,0,256 582,0,I108 610,0,256 622,0,I108 650,0,256 662,0,I108 690,0,256 702,0,I108 730,0,256 742,0,I108 10126:S25|5838364f5554505554434f444528292e676574363473283229 10127:S9|6d6f766c5f72657609 10128:S9|6d6f76625f72657609 10129:S5|7075736809 10130:S4|70757368 10131:S4|6a6d7020 10132:S3|3f3f3f 10133:S4|63616c6c 10134:S5|746573746c 10135:S4|6e65676c 10136:S4|6d756c6c 10137:S5|696d756c6c 10138:S4|6469766c 10139:S5|696469766c 10140:S5|7465737462 10141:S4|6e656762 10142:S4|73617220 10143:S4|73687220 10144:S4|73686c20 10145:S2|636c 10146:S6|786164646c09 10147:S6|6d6f767a6c09 10148:S4|3f3f3f09 10149:S3|6a6f09 10150:S3|6a6209 10151:S4|6a6e6209 10152:S3|6a6509 10153:S4|6a6e6509 10154:S4|6a6e6109 10155:S3|6a6109 10156:S3|6a6c09 10157:S4|6a676509 10158:S4|6a6c6509 10159:S3|6a6709 10160:S4|65736309 10161:O1|26 10162:S3|726574 10163:O1|35 10164:S3|737463 10165:S4|72657409 10166:D3,204|3b650c7303ff55248b0b8b7104baffffff002356fc8d5412018d1495fdffffff3bc2720d89c2b8b8d082b28b5d0490ff1389c2d1ea0fb614168d54120183c0028b1b8b4b04bfffffff002379fc8d7c3f018d3cbdfdffffff3bc7720d89c6b8b8d082b28b5d0490ff13d1e80fb604018d440001a801740a81f8010100007c19eb06f640ff107511a801740881e8000200007105ff5538ebf352bb010200009090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf383c404c390909000000000c8000000|@10167,2097151,@1310|14,0,8388607 39,0,@9824 70,0,8388607 95,0,@9824 121,0,128 154,0,256 162,0,I108 10167:S37|5838364f5554505554434f444528292e7072696e74436f6465283329676574313673283229 10168:S10|74657374620925616c2c 10169:S11|666d756c0973742c737428 10170:S11|666164640973742c737428 10171:S9|66636f6d7009737428 10172:S12|66646976720973742c737428 10173:S11|666469760973742c737428 10174:S12|66737562720973742c737428 10175:S11|667375620973742c737428 10176:S9|666672656509737428 10177:S8|6673747009737428 10178:S8|6673742009737428 10179:S9|666e73747377096178 10180:S8|6678636809737428 10181:S8|666c642009737428 10182:S4|66636f73 10183:S5|6673717274 10184:S4|6673696e 10185:S7|66696e63737470 10186:S6|66706174616e 10187:S7|66646563737470 10188:S4|666c6631 10189:S4|666c647a 10190:S4|666c6431 10191:S4|66636873 10192:S4|66737409 10193:S5|6673747009 10194:S5|666c642009 10195:S6|666469767209 10196:S5|6664697609 10197:S5|6673756209 10198:S6|66636f6d7009 10199:S5|666d756c09 10200:S6|667375627209 10201:S5|6661646409 10202:S6|66696c647109 10203:S6|66696c646c09 10204:O1|34 10205:S5|736168660a 10206:S4|72657009 10207:S6|6d6f7673620a 10208:S6|6d6f76736c0a 10209:S6|636d7073620a 10210:S6|73746f73620a 10211:S6|73746f736c0a 10212:S28|5838364f5554505554434f444528292e7072696e74436f6465283329 10213:S15|526567697374657220736574203d20 10214:S2|0a0a 10215:S36|5838364f5554505554434f444528292e637265617465436f64655365676d656e74283329 10216:S25|5838364c4f574c4556454c28292e636f7079436f6465283529 10217:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1314| 10218:D3,168|3b650c7303ff552483f8017506b801000000c38b0883390575558b55008d52f83b55087303ff5520895500c742fc01000000891af6c301740583c3027105ff5538ebf6528b480489c8e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c890e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3909000000000a4000000|@10219,15,@1315|14,0,0 153,0,0 10219:S48|47454e45524154455f434f444528292e636f646567656e28392967656e50726f632833296d616b65496e646578283229 10220:D3,56|3b650c7303ff5524ff742408ff7204ff7208909090e8320000008b4c24048b1089118b5804895904b801000000c208000000000034000000|@8992,2097151,@1318|22,1,@10221 41,0,0 10221:D3,692|3b650c7303ff552483380375668b4c24088b5004f6c10174108b7004b8bc7e7ab28b5d04909090ff1383fa0175048b09eb1cf6c201740583ea027105ff5538ebf68b49043b650c7303ff5524ebc68339057571f640040174158b542404b9ffffff00234afc8d4c09013b480477178b4804eb05e916020000b8cc7b7ab28b5d04909090ff138b40048b4442fe83f801750c89c1b84cc37bb28b5d04ff13ff30b80100000089da9090ff12ff7004ff7424148b188b4424089090e82ea8fdff833c2401eb05e93e00000075058b4804eb128b308b1c248b400490e8ea01000089c1eb028b308b45008d40f43b45087303ff5520894500c740fc02000000894804893083c408c20c0083390175708b45008d40dc3b45087303ff5520894500c740fc020000008b4904894804c700010000008b4c240c8b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b4108909090e80628fcff8b442408eb05e951000000a801740583c0027105ff5538ebf6598901833c240174126a01bb9ca27fb28b4424189090e8022bfcff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c404598908c20c008b45008d40dc3b45087303ff5520894500c740fc020000008b4904894804c700070000008b4c240c8b511c8b128d580cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b410890e84227fcff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44241890e8462afcff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000083c404598908c20c00833807740ab8247983b28b5d04ff13b80100000089da5983c40c51ff229000000000b0020000|@9757,2097151,@1317|29,0,@5417 94,0,8388607 121,0,@5401 148,0,@6769 160,0,0 186,1,@9435 218,1,@10222 300,0,0 326,0,0 333,0,0 340,0,0 347,0,1 370,1,@8774 411,0,@8782 422,1,@8783 453,0,0 498,0,3 524,0,0 531,0,0 538,0,0 545,0,1 566,1,@8774 600,0,@9417 610,1,@8783 641,0,0 660,0,@10223 670,0,0 10222:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1316| 10223:O4|@4608,@5398,@9756,@10224 10224:O5|@9130,1248,0,1248,0 10225:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1319| 10226:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1320| 10227:D3,684|3b650c7303ff5524a801755ef6c301755e8b0b833905755c8338ff755c8b5424108b721c8b36ff7304ff700456ff7224ff721c68102681b289f38b4208e83e25fcff8b442408a801740583c0027105ff5538ebf6598901833c240174296a01bbf01081b28b442424eb14e92d020000e920020000e9ce000000e90e000000909090e82a28fcff83c40458eb0b8b50048b3089f0ff730452f644241c0174168b542414b9ffffff00234afc8d4c09013b4c241c770d89c1b8cc7b7ab28b5d0490ff138b4c241c8b4c4afe83f901750f89c3b84cc37bb28b5d04909090ff13ff31ff74241c89c38b442418e832f7fdff8b4c240c8b0983f901740989cb9090e8be0100008b4c240c89018b44241ca801740583c0027105ff5538ebf68b5424188b5c24148b7424108944241c89542418895c241489742410894c240c8b5c24045883c404e9b9feffff8b5424108b7b04ff7004ff308b1c248b4208e8465ffcffa801745b5750bb030000008b442408bafc317ab2909090e8aab6f6ff89c3b8f0ff7fb2e80e90f6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44242090e83a7dfcffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241857528b5c24088b4108909090e84623fcffb8010000008b4c24108b0983f901740889cb90e8c60000008b4c241089018b442420a801740583c0027105ff5538ebf68b54241c8b5c24188b742414894424208954241c895c241889742414894c24105b83c40458e96cfdffffb801000000c21400b801000000c2140000000000a8020000|@10230,2097151,@1323|52,0,@9436 62,1,@8774 96,0,@9417 130,1,@8783 163,0,8388607 183,0,@5401 209,0,@6769 234,1,@9586 254,1,@10228 346,1,@8978 357,0,1 366,0,@5052 374,1,@5053 381,0,@9019 386,1,@4940 417,0,@9020 427,0,@5398 433,0,@4608 494,1,@9015 566,1,@8774 571,0,0 590,1,@10229 661,0,0 669,0,0 10228:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1321| 10229:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1322| 10230:S50|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332966696c6c436c6f73757265283329 10231:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1324| 10232:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1325| 10233:D3,552|8d7c24ac3b7d0c7303ff5528a8017567f6c30175678338ff7567ff7304ff70046a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b03bb030000008b942498000000ff1283f801eb0fe999010000e994010000e984000000750d89c1b8447080b28b5d0490ff13f64424540174168b542410b9ffffff00234afc8d4c09013b4c2454770f8b08b8cc7b7ab28b5d04909090ff138b4c24548b4c4afe83f901750f8b18b84cc37bb28b5d04909090ff13ff31ff74244c8b188b442414e8d6f2fdff8b4c24448b0983f901740989cb9090e83a0100008b4c24448901eb06ff7304ff70048b442454a801740583c0027105ff5538ebf68b4c24508b54244c8b5c24488b7424448b7c2440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b4424348984248c000000898c248800000089942484000000899c24800000008974247c897c24788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088944244c8b442404894424485883c4348944240c8b5c24045883c404e9ebfdffffb801000000c24c009090900000000024020000|@10235,2097151,@1327|101,0,1 139,0,@9149 161,0,8388607 181,0,@5401 209,0,@6769 234,1,@9586 254,1,@10234 534,0,0 10234:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1326| 10235:S52|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332966696c6c526563757273697665283329 10236:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1328| 10237:O1|@10238 10238:O2|@10239,0 10239:O1|@10240 10240:D3,16|b8c48183b2c39090000000000c000000|@10263,1,@1339|1,0,@10241 10241:O1|@10242 10242:D3,88|3b650c7303ff552489c389d890e85a0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089015368948283b2bb408483b289c890e86a03000089c15889caff229090900000000054000000|@10262,1048575,@1338|14,1,@10243 45,0,0 53,0,@10244 58,0,@10251 66,1,@10257 10243:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1329|53,0,0 59,0,0 10244:O1|@10245 10245:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700e08283b28948048060ffbfc3000000002c000000|@9619,3,@1332|28,0,@10246 10246:D3,148|3b650c7303ff55248b42048b58048b0889c8909090e88e000000a80175128b08833903750b83780401750583fb01740d89c1b8008483b28b5d0490ff138b55008d52d83b55087303ff5520895500c742fc020000008b7104897204c702470000008d7a0cc747fc02000000c747040100000089178d470cc740fc03000000897808895804c70001000000c3900000000090000000|@9618,63,@1331|22,1,@10247 51,0,@10248 93,0,35 110,0,0 134,0,0 10247:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1330|23,0,@6769 84,0,0 10248:O4|@4608,@5398,@10250,@10249 10249:O5|@9182,642,0,642,0 10250:S10|67656e4c6f636b536567 10251:O1|@10252 10252:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700948483b28950048948088060ffbfc390900000000034000000|@10256,7,@1335|31,0,@10253 10253:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700e48483b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1334|28,0,@10254 10254:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e932fdfdff9090000000002c000000|@9623,2097151,@1333|9,0,207 34,1,@9620 10255:S31|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283129283129 10256:S34|5838364c4f574c4556454c28292e616c6c496e526567697374657273283229283129 10257:D3,184|3b650c7303ff55248b08ba01000000f6c1017570f60101751cf6c201740583c2027105ff5538ebf68b49043b650c7303ff5524ebda8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701488683b28959048b7424048971088061ffbf89c78b45008d40f43b45087303ff5520894500c740fc0200000089480489105753eb05e91700000089da90ff1289c18b44240489ca83c4085983c40451ff228b4c240489ca5e83c40456ff2290909000000000b4000000|@10261,1048575,@1337|11,0,0 79,0,@10258 10258:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba848683b256ff2290900000000024000000|@10260,1048575,@1336|23,0,@10259 10259:O1|@10257 10260:S37|5838364c4f574c4556454c28292e616c6c417267732833296e657874417267283229283129 10261:S24|5838364c4f574c4556454c28292e616c6c41726773283329 10262:S38|5838364c4f574c4556454c28292e6e6f726573756c744e65676f746961746f72283129283129 10263:S33|5838364c4f574c4556454c28292e696e7374724c6f636b5365672d283229283129 10264:O4|@4608,@5398,@10266,@10265 10265:O5|@9130,1338,0,1338,0 10266:S32|4c6f636b20696e737472756374696f6e206e6f7420696d706c656d656e746564 10267:D3,116|3b650c7303ff5524a80175578b4a048b590c52ff30ff7124ff7304ff73088b0389c38b44240c909090e86e69fcff833c240174268b44240490e8f638fcff89c3b8944b81b2e8be83f6ff8b4c24086a0189c38b4104e8ca1afcffb8ffffffff83c40cc3b8ffffffffc39090900000000070000000|@9649,2097151,@1340|42,1,@9004 58,1,@8788 65,0,@9480 70,1,@4940 86,1,@8783 91,0,-1 100,0,-1 10268:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1341| 10269:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1342| 10270:D3,100|3b650c7303ff5524a8017546f6c3017541ff33ff30ff742410ff7424108b5b048b40049090e8d6ffffff8b4c24108b54240c89442410894c240c8b442408895424088b5c240489c65883c40456e926000000b801000000c2080090900000000060000000|@10274,2097151,@1345|78,1,@10271 83,0,0 10271:D3,324|3b650c7303ff5524833b05752689c18b45008d40f43b45087303ff5520894500c740fc020000008b54240c8950048908c20c008b4c240889c789fb8b4108909090e82251fcffa80174575750bb0300000089f8bafc317ab290e88aa8f6ff89c3b8f0ff7fb2e8ee81f6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b44240ce81e6ffcffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c24085289fb8b41089090e82e15fcffb8010000008b4c24048b0983f901740889cb90e82a0000008b4c240489018b44240cc20c00900000000040010000|@10273,2097151,@1344|66,1,@8978 77,0,1 84,0,@5052 90,1,@5053 97,0,@9019 102,1,@4940 133,0,@9020 143,0,@5398 149,0,@4608 206,1,@9015 274,1,@8774 279,0,0 298,1,@10272 10272:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1343| 10273:S55|47454e45524154455f434f444528292e636f646567656e28392967656e50726f632833296e6f6e436f6e7374456e74726965732d283329 10274:S19|4c697374506169722e666f6c64722834292829 10275:D3,932|3b650c7303ff55246a016a0189d9bad8707ab25053f6c10175628339ff75248b45008d40f43b45087303ff5520894500c740fc020000008b5a048958048b328930eb608b4424048b7904ff7204ff32ff318b1c248b480889c8e8fe4efcffa80175668b0083380375648b4424108b1c248b480889c8e8e24efcffeb05e981010000a801746c5750bb030000008b442408bafc317ab2e842a6f6ff89c3b8f0ff7fb2eb05e93e01000090e89e7ff6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb0ae9f1000000e9ec000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c24088b44241890e8be6cfcffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c241057528b5c24088b4108909090e8ca12fcffb801000000837c240801740c8b5c2408909090e8320200008b4d008d49e83b4d087303ff5520894d00c741fc020000008b54240c8951048b542404891189c28d410cc740fc020000008948048910eb318b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c2404890857eb096a016a016a01ff710489c25983c40c3b650c7303ff5524e913feffff8d4424088b0a89088d4424088b5a048958046a01bb010000008b442408ba040380b290e8ae9afcff50bb9f0100008b44240890e8365efcff8b4c24088b510cff7004ff7204ff72088b1a8b00909090e88a63fcff6a016a0150ff7424188d5c24088b4424189090e8a20100008b45008d40d83b45087303ff5520894500c740fc030000008b4c24208948088b4c2404894804c700030000008b4c24188b511c8b128d5810c743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b410890e85a11fcff8b442408a801740583c0027105ff5538ebf6598901833c24017415ff742410bb2c9183b28b442424909090e85a14fcff837c24240175068b442418eb0f8b5c24248b4424189090e8d602000083f80175068b442414eb0d89c38b4424149090e81603000083f80175068b442408eb0d89c38b4424089090e85603000083f80175068b442410eb0d89c38b4424109090e89603000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4045983c4248908c390909000000000a0030000|@10285,2097151,@1353|15,0,@5279 90,1,@8978 118,1,@8978 136,0,1 145,0,@5052 150,1,@5053 157,0,@9019 170,1,@4940 213,0,@9020 223,0,@5398 229,0,@4608 290,1,@9015 362,1,@8774 367,0,0 386,1,@10276 535,0,0 544,0,@9033 550,1,@9074 556,0,207 566,1,@8997 594,1,@9004 618,1,@10277 662,0,1 688,0,0 695,0,0 702,0,0 709,0,1 730,1,@8774 766,0,@10280 778,1,@8783 806,1,@10281 830,1,@10282 854,1,@10283 878,1,@10284 10276:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1346| 10277:D3,300|3b650c7303ff552483f8017515c70301000000c7430401000000b801000000c204006a016a0153ff30ff7424148d5c240c8b400490e8c6ffffff8b4424148b482c8b09833c24ff75538b501c8b125152ff7024ff701c68102681b289d38b700889f0909090e8be0ffcff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44242490e8c212fcff83c40458eb048b0424515983c404f6c101740583c1027105ff5538ebf66a016a01518d4c24045189c38b4424209090e80ea8fdff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c894804598908837c240c0175058b0c24eb1289c68b5c240c8b0424e83a00000089c189f08b54240483c4048902894a04b80100000083c40cc204009090900000000028010000|@10279,2097151,@1348|15,0,0 22,0,0 27,0,0 87,0,@9436 102,1,@8774 136,0,@9417 146,1,@8783 198,1,@9465 258,1,@10278 279,0,0 10278:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1347| 10279:S49|434f444547454e5f5441424c4528292e637265617465537461636b436c6f7375726528322970757368456e747279283129 10280:S18|637265617465537461636b436c6f73757265 10281:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1349| 10282:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1350| 10283:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1351| 10284:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1352| 10285:S37|434f444547454e5f5441424c4528292e637265617465537461636b436c6f73757265283229 10286:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1354| 10287:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1355| 10288:D3,552|8d7c24ac3b7d0c7303ff5528a8017567f6c30175678338ff7567ff7304ff70046a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b03bb030000008b942498000000ff1283f801eb0fe999010000e994010000e984000000750d89c1b8447080b28b5d0490ff13f64424540174168b542410b9ffffff00234afc8d4c09013b4c2454770f8b08b8cc7b7ab28b5d04909090ff138b4c24548b4c4afe83f901750f8b18b84cc37bb28b5d04909090ff13ff31ff74244c8b188b442414e84e0100008b4c24448b0983f901740989cb9090e8260400008b4c24448901eb06ff7304ff70048b442454a801740583c0027105ff5538ebf68b4c24508b54244c8b5c24488b7424448b7c2440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b4424348984248c000000898c248800000089942484000000899c24800000008974247c897c24788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088944244c8b442404894424485883c4348944240c8b5c24045883c404e9ebfdffffb801000000c24c009090900000000024020000|@10235,2097151,@1359|101,0,1 139,0,@9149 161,0,8388607 181,0,@5401 209,0,@6769 234,1,@10289 254,1,@10295 534,0,0 10289:D3,496|3b650c7303ff55248b4c240489df5089c38b410890e8c644fcff8b4c24085089fb8b410890e8b644fcffa80174575750bb0300000089f8bafc317ab290e81e9cf6ff89c3b8f0ff7fb2e88275f6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a0389fb8b442414909090e8ae62fcffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c240c575289fb8b410890e8be08fcffb801000000f644240401750b8b4c24048b11833a03740c89c1b8c89783b28b5d04ff138b5d008d5bf43b5d087303ff5520895d00c743fc020000008b72088973048b3c24893b8b7d008d7ff03b7d087303ff5520897d00c747fc03000000895f088b5a04895f04c707030000008b5d008d5be83b5d087303ff5520895d00c743fc050000008b51108953108b710c89730c8b71088973088b7104897304893b8b7c241050538b5c24108b4708909090e80a08fcffff742418ff7424188b5c240c8b442414909090e892dafdff833c2401750683c410c208008b1c2483c4105983c40851e97a000000909000000000ec010000|@10294,2097151,@1357|22,1,@8978 38,1,@8978 49,0,1 56,0,@5052 62,1,@5053 69,0,@9019 74,1,@4940 105,0,@9020 115,0,@5398 121,0,@4608 182,1,@9015 250,1,@8774 255,0,0 280,0,@10290 359,0,1 430,1,@8774 454,1,@9586 482,1,@10293 10290:O4|@4608,@5398,@10292,@10291 10291:O5|@9007,3258,0,3258,0 10292:S39|736574526563757273697665436c6f73757265456e7472793a206e6f7420636f6e7461696e6572 10293:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1356| 10294:S43|434f444547454e5f5441424c4528292e736574526563757273697665436c6f73757265456e747279283429 10295:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1358| 10296:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1360| 10297:S36|47454e45524154455f434f444528292e636f646567656e28392967656e50726f63283329 10298:O3|@10300,@9145,@10299 10299:O3|@10315,@9145,@9726 10300:D3,3828|8d7c24843b7d0c7303ff55288b4c24388b711c8b368b79048b3f528b51148b12528b55008d52f03b55087303ff5520895500c742fc03000000578b7c2404897a088b3c24897a0489328b711c8b368b790489378b712c8b368b79148937833b1d741f833b0d7413833b077407be01000000eb13be03000000eb0cbe03000000eb05be030000006a016a016a0183fe01741889e6c7060300000089e68b4c2464894e0489e6895e08eb1689e6c7060100000089e6895e0489e38b7424648973088b4c241452ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b5c24408b510890ff1283f80175718b4424548b48048b54241089118b50148b5c2414891a8b5c24188b7424648b7c24608b4c245c8b4424588b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454528b542454eb05e9ae00000089b4249c00000089bc2498000000898c2494000000898424900000008b4424308984248c0000008b44242c898424880000008b442428898424840000008b442424898424800000008b4424208944247c8b44241c894424788b442418894424748b442414894424708b4424108944246c8b44240c894424688b442408894424648b442404894424605883c43089442428895424248b4304bb0300000089c18b44240889ca83c41c5983c40451ff228b4c24548b118b1283fa0174718b51048b5c2410891a8b59148b742414893389cb90e84a33fdff8b4c24508b0983f901740989cb9090e89a0c00008b4c245089018b4424188b5424648b5c24608b74245c8b7c24588b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454eb05e9c8000000518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c24548994249c000000899c249800000089b4249400000089bc24900000008b5424308994248c0000008b54242c899424880000008b542428899424840000008b542424899424800000008b5424208954247c8b54241c895424788b542418895424748b542414895424708b5424108954246c8b54240c895424688b542408895424648b542404895424605a83c43089542428894c2424bb030000008b50048b44240c83c41c5e83c40456ff226a016a01f64424680175708b5424688b1a833b0175158b7304f7c601000000740583c6207123ff5538ebf6837b080375158b7304f7c601000000740583c6107108ff5538ebf68b7304f7c60100000075108b3ef646ff107402f7df8d7c3f01eb0289f789f9be0300000083ee0183f93f7605b93f000000d1e9eb05e957010000d3e683ce018d4c09018b4d008d49f83b4d087303ff5520894d00c741fc0100000089318b7c24205051565152ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478bb030000008b4424648b57049090ff12837c240401750c89c1b85cd280b28b5d04ff13f644240401756683f801750c89c1b8b0d280b28b5d04ff138b4c24688b118b1283fa01741e8b55008d52f83b55087303ff5520895500c742fc010000008b008902eb686a016a016a01ff74240c6a038d542408528b1889c8e8fad1fcff8b44247083c4048b0083f801750deb05e93e0000008b442404eb0d89c38b4424049090e84e0a00008b4c246c89018b55008d52f83b55087303ff5520895500c742fc010000005883c4048902eb0ae905000000ba010000008d44240c83c40489108d44240859894804eb6b837c246c0175698b54242050ff742470ff742470ff742470ff74247051ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470bb030000008b44245c8b720489f2ff128b4c24608b118b12eb0ae956040000e91203000083fa0174138d54240489028d442404c7400401000000eb6f83f801750e89c2b864a983b28b5d049090ff138b3889fb8b410890e8f63afcff83f801755e5750bb0300000089f8bafc317ab2e85e92f6ff89c3b8e07e80b2e8c26bf6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2eb05e9c5030000c7014ce239b289c88b5d049090ff138b08833909751f8b55008d52f83b55087303ff5520895500c742fc010000008b5904891aeb05ba0100000083fa017507ba9f010000eb718b1a833b0175158b7304f7c601000000740583c6207123ff5538ebf6837b080375158b7304f7c601000000740583c6107108ff5538ebf68b7304f7c60100000075108b06f646ff107402f7d88d440001eb0289f089c1b80300000083e80183f93f7605b93f000000d1e9d3e083c801eb05e9200000008d4c090181e00100fe0083f801740583f8017507ba9f010000eb05ba0100fe00576a016a016a01526a038d4424085089fb8b44247c9090e896cffcff8b44246c83c4048b0083f80175068b442404eb0c89c38b44240490e8920800008b4c246889018b45008d40f83b45087303ff5520894500c740fc010000008b142489108b5c246c89c78b430889d390e85639fcff83f801755a5750bb030000008b442408bafc317ab29090e8ba90f6ff89c3b8e07e80b2e81e6af6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b08833909751f8b55008d52f83b55087303ff5520895500c742fc010000008b5904891aeb05ba0100000083fa01750cb84cc37bb28b5d049090ff138b1a833b0175158b7304f7c601000000740583c6207123ff5538ebf6837b080375158b7304f7c601000000740583c6107108ff5538ebf68b7304f7c60100000075108b06f646ff107402f7d88d440001eb0289f089c183c40cb80300000083e80183f93f7605b93f000000d1e9d3e083c8018d4c09018b4d008d49f83b4d087303ff5520894d00c741fc0100000089018d44240489388d442404894804eb6d8b54242050ff742470ff742470ff742470ff74247051ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470bb030000008b44245c8b720489f2ff12837c247001751489c1b85cd280b28b5d04eb05e9cd00000090ff13f644247001756a8b4c247083f801750c89c2b8b0d280b28b5d04ff138b5424608b1a8b1b83fb01741e8b5d008d5bf83b5d087303ff5520895d00c743fc010000008b008903eb686a016a016a01ff316a038d5c2408538b1889d09090e832cdfcff8b44246883c4048b0083f801750deb05e93e0000008b442404eb0d89c38b4424049090e87e0600008b4c246489018b5d008d5bf83b5d087303ff5520895d00c743fc010000005883c4048903eb0ae905000000bb010000008d44240489188d4424048b4c2470894804f644246c01753d8b4424608b088b0983f9017530508b5c2440b801000000e86a2ffdff8b4c245c8b0983f901740989cb9090e85e0600008b4c245c8901b801000000eb05b8010000006a016a018b4424688b48108b0983f901741389e1c7010100000089e1c7410401000000eb73ff7010ff7020ff7024ff702c8b581c8b480889c8e842fdfcff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e994000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5c24148959085e83c404897104890189e0890889e08950048b4424648b0083f80175068b442404eb0c89c38b44240490e8560500008b4c24648901837c240c017507b801000000eb6b8b44240c8b5424688b3889fb8b4208e81e35fcffa80174585750bb0300000089f8bafc317ab290e8868cf6ff89c3b8f0ff7fb2e8ea65f6ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c8eb0ae9a3000000e9060000008b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b44246ce80e53fcffeb478b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c24685289fb8b41089090e81ef9fbffb8010000008b4c24648b0983f901740889cb90e8920400008b4c24648901b8010000008b5c24688b442408e8be28fdff8b4c24648b0983f901740989cb9090e8be0400008b4c24648901837c24100175598b44242cff742410ff742478ff742478ff742478ff74247851ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478bb030000008b50048b442468ff12eb6d8b44242cff742410ff742478ff742478ff742478ff74247851ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478bb030000008b50048b442468909090ff12837c241001751489c1b85cd280b28b5d04eb05e9bc00000090ff13f644241001756a8b4c241083f801750c89c2b8b0d280b28b5d04ff138b5424688b1a8b1b83fb01741e8b088b45008d40f83b45087303ff5520894500c740fc010000008908eb686a016a016a01ff316a038d4c2408518b1889d09090e8aec8fcff8b44247083c4048b0083f801750deb05e93e0000008b442404eb0d89c38b4424049090e8b20300008b4c246c89018b45008d40f83b45087303ff5520894500c740fc010000005a83c4048910eb0ae905000000b8010000006a016a0150ff7424208d442408508b5c247c8b44241490e83e37fdff8b4424708b48048b54242c89118b50148b5c2430891a8b5c246c8b1b83fb0175068b5c2404eb0b8b442404e88e03000089c38b44246c89185883c434c24c0090909000000000f00e0000|@10314,2097151,@1372|109,0,0 116,0,1 123,0,1 130,0,1 149,0,1 173,0,0 541,0,1 598,1,@9297 618,1,@10301 873,0,1 996,0,1 1009,0,31 1131,0,1 1156,0,@9310 1180,0,@9313 1254,1,@9152 1294,1,@10302 1342,0,0 1447,0,1 1500,0,0 1514,0,@10303 1534,1,@8978 1546,0,1 1553,0,@5052 1558,1,@5053 1565,0,@9153 1570,1,@4940 1601,0,@9154 1611,0,@5398 1624,0,@4608 1676,0,0 1686,0,207 1779,0,1 1792,0,31 1831,0,207 1838,0,8323072 1866,1,@9152 1898,1,@10306 1950,1,@8978 1962,0,1 1971,0,@5052 1978,1,@5053 1985,0,@9153 1990,1,@4940 2021,0,@9154 2031,0,@5398 2037,0,@4608 2088,0,0 2098,0,@6769 2199,0,1 2212,0,31 2343,0,1 2368,0,@9310 2404,0,@9313 2478,1,@9152 2518,1,@10307 2566,0,0 2613,0,0 2618,1,@9317 2638,1,@10308 2649,0,0 2656,0,0 2682,0,0 2691,0,0 2718,1,@9212 2748,0,0 2764,0,67108860 2780,0,0 2796,0,0 2819,0,0 2864,0,1 2883,0,62 2900,0,0 2912,0,1 2990,1,@10309 3008,0,0 3030,1,@8978 3041,0,1 3048,0,@5052 3054,1,@5053 3061,0,@9019 3066,1,@4940 3097,0,@9020 3107,0,@5398 3113,0,@4608 3182,1,@9015 3250,1,@8774 3255,0,0 3274,1,@10310 3285,0,0 3298,1,@9297 3318,1,@10311 3409,0,1 3498,0,1 3524,0,@9310 3560,0,@9313 3634,1,@9152 3674,1,@10312 3722,0,0 3750,1,@9333 3798,1,@10313 10301:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1362| 10302:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1363| 10303:O4|@4608,@5398,@10305,@10304 10304:O5|@9130,1751,0,1751,0 10305:S18|67656e436f6e643a206e6f20726573756c74 10306:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1364| 10307:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1365| 10308:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1366| 10309:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1367| 10310:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1368| 10311:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1369| 10312:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1370| 10313:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1371| 10314:S36|47454e45524154455f434f444528292e636f646567656e28392967656e436f6e64283629 10315:D3,11984|8d7c24883b7d0c7303ff55288b08beb2ac83b28d748efcffe690e98b000000909090e953010000909090e9bf030000909090e9180b0000909090e96b000000909090e98c0c0000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e9d52b0000909090e91b000000909090e913000000909090e9d92c0000909090e9030000009090908b4c243c8b7424388b7c2434508b442434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2430895c24708b52048954246c894c246889742464897c24608944245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b4424048b4c2434894424345883c428894424045bb80100000051e96a2d0000f640080175688b48088379040175648b318b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704030000008b4804890f8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000528b5604895104c701070000008b55008d52b43b5508730feb0ae931010000e92c010000ff5520895500c742fc02000000c7420403000000890a8d4a0cc741fc02000000c741040100000089118d510cc742fc02000000894a04893a8d4a0cc741fc04000000c7410c03000000c7410820de7eb2895104c7010b0000008d5114c742fc040000008b400c89420c8b36897208894a04c702050000008b4424408b4c243c8b7424388b7c2434538b5c2434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b542434528b5424348944246c894c246889742464897c2460895c245c8b442420894424588b44241c894424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c42089442414895424108b5c24045883c4045ae9e2fcffff8b4c243c8b7424388b7c2434508b442434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2430895c24708b52048954246c894c246889742464897c24608944245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b4424048b4c2434894424345883c428894424045bb80100000051e9f62a00008b4c24388b711c8b368b79048b3f528b51148b12538b5d008d5bf03b5d087303ff5520895d00c743fc03000000895308897b0489338b711c8b36ff7008528b510489328b712c8b368b511489328b7424488b4e1c8b098b56048b12578b7e148b3f578b7d008d7ff03b7d087303ff5520897d00c747fc03000000528b5424048957088b1424895704890f8b4e1c8b098b5604890a8b4e2c8b098b5614890aff700c5357ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464bb010000008b40048b542460e822fbffff83f80175738b4424608b48048b54240c89118b50148b5c2410891a8b5c241489198b5c2418891a8b5c24648b74245c8b7c24588b4c24548b542450528b542450528b542450528b542450528b542450528b542450528b542450528b542450528b542450528b542450899c248800000089842484000000eb05e96c00000089b42480000000897c247c894c24788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c420894424308954242c8b5c24208b44241c83c4245ae939faffff8b4c24608b118b1283fa0174708b51048b5c240c891a8b59148b74241089338b74241489328b742418893389cb90e8be1cfdff8b4c245c8b0983f901740989cb9090e8f64500008b4c245c89018b4424648b5424608b5c24588b7424548b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c245057eb05e98d0000008b7c2450578b7c2450578b7c2450578b7c24508984248800000089942484000000898c2480000000895c247c897424788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c42089442430897c242c8b5c24208b44240883c4245ae92af9ffff50ff74246851ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff7424688b5c24608b44245c8b54246490e8def8ffff6a016a018b4c246c8b51108b1283fa01741389e2c7020100000089e2c7420401000000eb7550ff7110ff7120ff7124ff712c8b591c8b4108909090e896edfcff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e99a000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005b83c40489590489018d44240489088d442404895004eb01508b44246c8b0083f80175068b442408eb0d89c38b4424089090e8e24300008b4c246c89018b5c24708b44240c90e82a1afdff8b4c246c8b0983f901740989cb9090e8124400008b4c246c89018b44243083f002ff742474ff74247451ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff74247489c38b4424548b542470909090e806f7ffff6a016a01506a01ff7424208d4c240c518b9c24880000008b442418e8e229fdff8b44247c8b48048b54242889118b50148b5c242c891a8b5c24788b1b83fb0175068b5c2408eb0b8b442408e8c243000089c38b44247889186a016a018b8c24840000008b51108b1283fa01741389e2c7020100000089e2c7420401000000eb72ff7110ff7120ff7124ff712c8b591c8b410890e866ebfcff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040eb05e994000000c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005b83c404895904890189e0890889e08950048b8424800000008b0083f80175068b442404eb0d89c38b4424049090e8be4200008b8c248000000089018b9c24840000008b442418909090e8f617fdff8b8c24800000008b0983f901740a89cb909090e8e24200008b8c248000000089016a016a016a01ff7424348d442408508b9c24980000008b44241ce8fa27fdff8b84248c00000083c4048b48048b54243c89118b50148b5c2440891a8b9c24840000008b1b83fb0175058b1c24eb0b8b042490e8da42000089c38b84248400000083c40489185883c448c23c00837804037407b801000000eb05b8030000003bc3756b6a016a018b4424408b48108b0983f901741389e1c7010100000089e1c7410401000000eb73ff7010ff7020ff7024ff702c8b581c8b480889c8909090e852e9fcff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040eb05e9f6000000c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c70601000000eb05e99e0000008d7e08c747fc01000040c70701000000508b45008d40d03b45087303ff5520894500c740fc0500000089501089480c8958088978048930c706030000008d4818c741fc02000000894104c7017d0000008d510cc742fc02000000c7420401000000890a8b4c2404c701030000008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005b83c404895904890189e0890889e08950048b44243c8b0083f80175068b442404eb0d89c38b4424049090e8ae4100008b4c243c89015883c404c23c00b801000000c23c008b48088339077552f640040175518b7004f6460401755a8b7e04f64704017556528b5704f64204017519508b4204f6400401750c538b5804837b04017562eb0753eb625053eb638b42048b5804ff71048b0b8b008b128b3feb0ae95a1e0000e9851d00008b36813c2488cd5208756ceb0ae9ca170000e9310300008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c74304010000008b09890beb0fe930020000e92b020000e9260200008b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b0089018b45008d40dc3b4508730aeb05e91d010000ff5520894500c740fc020000008948048b1289108d480cc741fc020000008941048b3f89398d410cc740fc020000008948048b3689308b4c240c8b54244c8b5c24488b7424448b7c2440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b44244050b85cfb83b28944247c8b442434894424788b442438894424748b4904894c24708954246c895c246889742464897c24608b4424288944245c8b442424894424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c8b4c2440894424408b4424088944243c8b442404894424385883c42889442408bbd80c84b25883c40451e9fc5100008b44240c8b54244c8b7424488b7c24448b4c24408b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c243c538b5c2434895c24788b400489442474895424708974246c897c2468894c24648b442428894424608b4424248944245c8b442420894424588b44241c894424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048b4c243c8944243c5883c4288944240c8b5c2404b80100000083c40c51e93c1f00008b4424088b4c24488b5424448b5c24408b74243c8b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2430897c24748b400489442470894c246c89542468895c2464897424608b4424288944245c8b442424894424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b4424048b4c2438894424385883c428894424088b1c24b80100000083c40851e9651e0000528b178b36817904a8d9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52badc1284b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb441484b25851e91f4f000081790468d5520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52baac1584b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb141784b25851e9f64d000081790468c8520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba7c1884b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb6c2284b25851e9cd4c000081790428d7520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba302484b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbe03a84b25851e9a44b000081790448d7520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52baa43c84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb683e84b25851e97b4a000081790468d7520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c4084b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbf04184b25851e95249000081790488d7520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52bab44384b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb784584b25851e92948000081790428d9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba3c4784b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bba44884b25851e90047000081790448d9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba0c4a84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb744b84b25851e9d745000081790468d9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52badc4c84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb444e84b25851e9ae44000081790488d9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52baac4f84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bb145184b25851e98543000081790488c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba7c5284b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac6684b25851e95c420000817904a8c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c6984b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac6b84b25851e93341000081790408c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c6e84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac7084b25851e90a40000081790428c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c7384b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac7584b25851e9e13e000081790448c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c7884b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac7a84b25851e9b83d000081790468c9520875738b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3a89398d510cc742fc02000000894a048b3689328b0c248b7424408b7c243c508b44243c538b5c243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243c528b54243ceb05e9a8000000528b54243c528b54243c528b54243c52ba2c7d84b2895424788b542430895424748b542434895424708b4904894c246c89742468897c246489442460895c245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8b4c243c8944243c8b442408894424388b442404894424345883c42889442404bbac7f84b25851e98f3c00008b0c248b7424408b54243c8b7c2438508b442438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2438538b5c2430895c24748b4904894c24708974246c89542468897c2464894424608b4424288944245c8b442424894424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b4424048b4c2438894424385883c428894424085b83c404b80100000051e9d10900008b3e81790488d55208757283f3028b44243c8b4c24388b742434528b542434538b5c2434ff378b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c24348944246c894c24688974246489542460895c245c8b442420894424588b44241c89442454eb05e94a0000008b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c42089442414897c24108b5c24045883c4045ae921daffff81790468c7520875668b0f8339077564f641040174638b44243c8b7424388b4c24348b7c2430528b542430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c24308944246889742464894c2460897c245ceb0fe999030000e914010000e95c000000895424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b442404894424385883c42089442410895c240c5bb82c8284b25ae947d9ffff8b44243c8b7424388b4c24348b7c2430528b542430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c2430538b5c24308944246889742464894c2460897c245c895424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b442404894424385883c42089442410895c240c5bb820f483b25ae994d8ffff83fb017507be3c8284b2eb05bed48684b28b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b3f893989c78d410cc740fc02000000c74004908784b2890852575389f29090ff12a80175678b08f641040175648b5104837a040175608b5c2408ff316a016a016a01ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b7304bb030000008b0289f2eb0fe9e7000000e9e2000000e9dd000000ff1283f801750e89c1b8447080b28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b00890151b8010000008b5424049090ff126a016a01ff7004ff74240cff74245c8d4c240c51bb108884b28b00e8aebefdff8b442458ff7020ff7024ff702c8b581c8b480889c89090e83eccfcff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008948045983c40489088b4c244c8b0983f90175058b0c24eb1289c689cb8b04249090e8a2b2000089c189f08b54244c83c40c890a83c40cc23c008b4424088b4c24488b5424448b5c24408b74243c8b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2438578b7c2430897c24748b400489442470894c246c89542468895c2464897424608b4424288944245c8b442424894424588b442420894424548b44241c894424508b4424188944244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b4424048b4c2438894424385883c428894424088b1c24b80100000083c40851e9f80400008b4c243c8b7424388b7c2434508b442434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2430895c24708b52048954246c894c246889742464897c24608944245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b4424048b4c2434894424345883c428894424045bb80100000051e9280400008b74243c8b7c24388b4c2434508b442434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2430895c24708b52048954246c89742468897c2464894c24608944245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b4424048b4c2434894424345883c428894424045bb80100000051e9580300008b74243c8b7c24388b4c2434508b442434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2434538b5c2430895c24708b52048954246c89742468897c2464894c24608944245c8b442428894424588b442424894424548b442420894424508b44241c8944244c8b442418894424488b442414894424448b442410894424408b44240c8944243c8b442408894424388b4424048b4c2434894424345883c428894424045bb80100000051e9880200008b48045253ff7008f6c101755c8b442408ff7104ff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cff74244cbb010000008b50088b019090ff12593b650c7303ff5524eb9f8b4424488b4c24448b5424408b5c243c8b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c24348944246c894c246889542464895c24608974245c8b442420894424588b44241c894424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c42089442414897c24108b5c24045883c4045ae988d2ffff8b4d008d49ac3b4d087303ff5520894d00c741fc02000000c74104030000008b700889318d790cc747fc03000000c74708010000008b7004897704c707070000008d4710c740fc02000000c740040300000089388d700cc746fc02000000c746040100000089068d460cc740fc0200000089700489088d480cc741fc04000000c7410c03000000c7410890dd7eb2894104c7010b0000008b44243c8b7424388b7c2434528b542434538b5c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c2434518b4c24348944246c89742468897c246489542460895c245c8b442420894424588b44241c894424548b442418894424508b4424148944244c8b442410894424488b44240c894424448b442408894424408b4424048944243c5883c42089442414894c24108b5c24045883c4045ae93bd1ffff90909000000000cc2e0000|@10771,2097151,@1621|15,0,$10315+26 368,0,0 374,1,@10316 422,0,1 458,0,0 471,0,3 514,0,1 533,0,0 567,0,1 574,0,@8494 583,0,5 613,0,2 996,0,0 1002,1,@10316 1230,0,0 1526,1,@9297 1546,1,@10369 1848,0,0 1857,0,0 1886,1,@9212 1916,0,0 1932,0,67108860 1948,0,0 1964,0,0 1987,0,0 2032,0,1 2051,0,62 2068,0,0 2080,0,1 2111,0,0 2166,1,@10370 2186,1,@9297 2206,1,@10371 2326,1,@9333 2374,1,@10372 2411,0,0 2420,0,0 2446,1,@9212 2476,0,0 2492,0,67108860 2508,0,0 2524,0,0 2547,0,0 2592,0,1 2611,0,62 2628,0,0 2640,0,1 2671,0,0 2722,1,@10373 2750,1,@9297 2774,1,@10374 2814,1,@9333 2870,1,@10375 2902,0,0 2909,0,1 2939,0,0 2948,0,0 2978,1,@9212 3008,0,0 3031,0,67108860 3047,0,0 3063,0,0 3086,0,0 3131,0,1 3150,0,62 3167,0,0 3179,0,1 3210,0,0 3258,1,@10376 3276,0,0 3388,0,I154 3433,0,0 3638,0,@10377 3778,0,@10429 3788,1,@10433 3995,0,0 4004,1,@10316 4210,0,0 4219,1,@10316 4231,0,I251 4264,0,0 4374,0,@10445 4514,0,@10450 4521,1,@10433 4528,0,I217 4561,0,0 4671,0,@10455 4811,0,@10460 4818,1,@10433 4825,0,I113 4858,0,0 4968,0,@10465 5108,0,@10489 5115,1,@10433 5122,0,I231 5155,0,0 5265,0,@10494 5405,0,@10538 5412,1,@10433 5419,0,I232 5452,0,0 5562,0,@10543 5702,0,@10548 5709,1,@10433 5716,0,I233 5749,0,0 5859,0,@10553 5999,0,@10558 6006,1,@10433 6013,0,I234 6046,0,0 6156,0,@10563 6296,0,@10568 6303,1,@10433 6310,0,I247 6343,0,0 6453,0,@10573 6593,0,@10578 6600,1,@10433 6607,0,I248 6640,0,0 6750,0,@10583 6890,0,@10588 6897,1,@10433 6904,0,I249 6937,0,0 7047,0,@10593 7187,0,@10598 7194,1,@10433 7201,0,I250 7234,0,0 7344,0,@10603 7484,0,@10608 7491,1,@10433 7498,0,I122 7531,0,0 7641,0,@10613 7781,0,@10658 7788,1,@10433 7795,0,I123 7828,0,0 7938,0,@10666 8078,0,@10674 8085,1,@10433 8092,0,I118 8125,0,0 8235,0,@10682 8375,0,@10690 8382,1,@10433 8389,0,I119 8422,0,0 8532,0,@10698 8672,0,@10706 8679,1,@10433 8686,0,I120 8719,0,0 8829,0,@10714 8969,0,@10722 8976,1,@10433 8983,0,I121 9016,0,0 9126,0,@10730 9266,0,@10738 9273,1,@10433 9481,0,0 9487,1,@10316 9496,0,I218 9698,0,I105 9903,0,@10746 10082,0,@10350 10098,0,@10747 10105,0,@10760 10136,0,0 10159,0,@10765 10271,0,1 10306,0,@9149 10344,0,0 10354,0,0 10387,0,@10768 10394,1,@9650 10422,1,@9212 10455,0,0 10494,1,@10770 10719,0,0 10728,1,@10316 10930,0,0 10936,1,@10316 11138,0,0 11144,1,@10316 11346,0,0 11352,1,@10316 11437,0,0 11667,0,1 11689,0,0 11701,0,3 11718,0,1 11737,0,0 11771,0,1 11778,0,@8492 11787,0,5 10316:D3,460|3b650c7303ff552483fb017507b85cdd83b2eb05b878f283b28b4d008d49e83b4d087303ff5520894d00c741fc02000000c7410414f483b28b542444891189c38d410cc740fc02000000c7400430f483b2890889da909090ff1283f801750e89c1b8c0f483b28b5d049090ff138b08ff31ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff7424408b9c24800000008b41049090e8de18000089c389d8909090e8521a0000b901000000f6c30175338b1383f90175058b4a04eb1889c68b7b0489cb8b4204909090e88a1a000089c189f0eb038b7b0489fb3b650c7303ff5524ebc85150b8010000008b5424089090ff126a016a01ff7004ff74240cff7424548d4c240c51bb50f783b28b00e832b7fdff8b442450ff7020ff7024ff702c8b581c8b480889c89090e8c2c4fcff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008948045983c4048908837c24080175058b0c24eb1289c68b5c24088b0424e89e1a000089c189f08b54244483c4108b1283fa01741289c689d389c8909090e8d61a000089c189f08b542434890ac244009000000000c8010000|@10368,2097151,@1393|14,0,@10317 21,0,@10343 52,0,@10349 77,0,@10351 98,0,@10354 186,1,@10357 198,1,@10361 203,0,0 238,1,@10362 266,0,0 299,0,@10363 306,1,@9650 334,1,@9212 367,0,0 402,1,@10366 434,1,@10367 10317:O1|@10318 10318:D3,72|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701c0dd83b28b45008d40f83b45087303ff5520894500c740fc010000008908c390900000000044000000|@10342,3,@1382|31,0,@10319 10319:O1|@10320 10320:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c70094de83b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1381|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10321 10321:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0500000051e96b0000009090900000000028000000|@10333,2097151,@1380|18,0,@10322 23,0,2 29,1,@10325 10322:O1|@10323 10323:D3,12|8b00c3900000000008000000|@10324,1,@1373| 10324:S26|5838364c4f574c4556454c28292e6e6f54616754657374283129 10325:D3,4112|3b650c7303ff5524a801740d89c1b844ef83b28b5d0490ff138b088339057561f6400401740f8b5004b844ef83b28b5d049090ff138b50048b32833e05756e837a0401756d53ff7608ff76048b59088b4104909090e80a100000508b5c24088b4424049090e8fa0f00008b4c24188b118b12f6c201740583c202710cff5538eb05e939040000ebef8b1989138b55008d52d83b55087303ff5520895500c742fc04000000c7420c01000000eb0ae900010000e9fb000000894a088b74240c897204c702170000008d7a14c747fc0400000089470c8b3424897708c7470405000000c7070f0000008b75008d76e83b75087303ff5520897500c746fc02000000c7460401000000893e8d7e0cc747fc020000008b0c24894f04c707030000008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc050000008b5c24188958108b5c240c89580c8948088978048930528b542418ff128b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c41089018b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c20800833e077569837a0401756853ff76048b59088b41049090e8960e00008b4c24108b118b12f6c201740583c2027105ff5538ebf68b1989138b55008d52ec3b55087303ff5520895500c742fc04000000c7420c01000000894a088b742404897204c70217000000f60424017475eb0ae94a010000e945010000f6042401750d89c7b808a87cb28b5d0490ff138b3c24f7c701000000740403ff7105ff5538ebf783ef01f7c701000000740583c7027105ff5538ebf68b75008d76ec3b75087303ff5520897500c746fc04000000897e0c894608c7460405000000c70609000000eb2e8b75008d76ec3b75087303ff5520897500c746fc040000008b3c24897e0c894608c7460405000000c7060b0000008b7d008d7fb83b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc02000000897e0489168d560cc742fc02000000894204c702030000008d420cc740fc020000008b3c24897804c7000500000089c78d400cc740fc050000008948108b4c240489480c89780889500489308b54240c83c40890ff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c20800833e017506837a0401740bb844ef83b28b5d0490ff1353ff7608ff76048b59088b4104909090e8ca0c00008b4c24148b118b12f6c201740583c2027105ff5538ebf68b1989138b55008d52d43b55087303ff5520895500c742fc04000000c7420c01000000894a088b742408897204c702170000008d7a14c747fc050000008947108b74240489770c8b3424897708c7470405000000c7070d0000008b75008d76b43b75087303ff5520897500c746fc02000000c7460401000000893e8d7e0cc747fc0200000089770489178d570cc742fc02000000894204c702030000008d420cc740fc030000008b7424048970088b3424897004c7000100000089c68d4010c740fc050000008948108b4c240889480c89700889500489388b54241083c40cff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c208008339077565f6400401740f8b5004b844ef83b28b5d049090ff138b50048b32833e07756f837a0401756e8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c70788f083b2895f048b5c2408895f088b4c2404894f0c8067ffbf8b45008d40e83b4508730aeb05e9cd050000ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000eb0ae911000000e90c000000897804c70005000000c20800833e05753f837a0401753e53ff71048b5e088b4604e8e20a00008b4c24108b118b12f6c201740583c2027105ff5538ebf68b1989138b542404bed6e483b28d7496fcffe6e932020000e92d020000e975000000909090e974000000909090e94b000000909090e96b000000909090e96a000000909090e969000000909090e968000000909090e967000000909090e966000000909090e965000000909090e90b000000909090e903000000909090837c240405740c89c2b8f8f083b28b5d04ff13ba05000000eb3dba03000000eb36ba01000000eb2fba0b000000eb28ba0d000000eb21ba07000000eb1aba09000000eb13ba11000000eb0cba0f000000eb05ba130000008b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000894e08895604c70617000000f60424017469f6042401750d89c7b808a87cb28b5d0490ff138b3c24f7c701000000740403ff7105ff5538ebf783ef01f7c701000000740583c7027105ff5538ebf68b4d008d49ec3b4d087303ff5520894d00c741fc0400000089790c894108c7410405000000c70109000000eb2e8b4d008d49ec3b4d087303ff5520894d00c741fc040000008b1c2489590c894108c7410405000000c7010b0000008b5d008d5bb83b5d087303ff5520895d00c743fc02000000c7430401000000890b8d4b0cc741fc0200000089590489318d590cc743fc02000000894304c703030000008d430cc740fc020000008b3424897004c7000500000089c68d400cc740fc050000008b7c241089781089500c89700889580489088b54240c83c40890ff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c20800833e017506837a0401740bb844ef83b28b5d0490ff1383fb0d743683fb0b743683fb09743683fb0774368b7c24088b078b00a801740583c0027105ff5538ebf68b17890289d8ba6ae783b28d5482fcffe2e956020000e951020000e94c020000e9470200009090e971000000909090e970000000909090e94b000000909090e967000000909090e966000000909090e965000000909090e964000000909090e963000000909090e962000000909090e961000000909090e90b000000909090e90300000090909083fb05740ab8f8f083b28b5d04ff13b805000000eb3db803000000eb36b801000000eb2fb80b000000eb28b80d000000eb21b807000000eb1ab809000000eb13b811000000eb0cb80f000000eb05b8130000008b55008d52ec3b55087303ff5520895500c742fc04000000c7420c010000008b5c2408895a08894204c70217000000f64104017472f6410401750d89c7b808a87cb28b5d0490ff138b7904f7c701000000740403ff7105ff5538ebf783ef01f7c701000000740583c7027105ff5538ebf68b5d008d5be83b5d087303ff5520895d00c743fc05000000897b108b7e08897b0c8b7e04897b08c7430405000000c70305000000eb378b5d008d5be83b5d087303ff5520895d00c743fc050000008b7904897b108b7e08897b0c8b7e04897b08c7430405000000c703070000008b7d008d7fb43b7d087303ff5520897d00c747fc02000000c7470401000000891f8d5f0cc743fc02000000897b0489138d530cc742fc030000008b7e08897a088b7e04897a04c702010000008d7210c746fc020000008b4904894e04c7060500000089c18d460cc740fc050000008b7c240889781089480c89700889500489188b54240490ff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c208008b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7074cf183b2895f048b5c2408895f088b4c2404894f0c8067ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400803000000897804c70005000000c20800833901740d8b5004b844ef83b28b5d04ff13f6400401740e8b5004b844ef83b28b5d0490ff138b50048b32833e01756b837a0401756a8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7078cf183b2895f048b5c2408895f088b4c2404894f0c8067ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000897804eb0ae90e000000e909000000c70005000000c20800833e057542837a0401754153ff7108ff71048b5e088b4604e89e0400008b4c24148b118b12f6c201740583c2027105ff5538ebf68b1989138b542408be1aeb83b28d7496fcffe6e9be010000e9b9010000e975000000909090e974000000909090e94b000000909090e96b000000909090e96a000000909090e969000000909090e968000000909090e967000000909090e966000000909090e965000000909090e90b000000909090e903000000909090837c240805740c89c2b8f8f083b28b5d04ff13ba05000000eb3dba03000000eb36ba01000000eb2fba0b000000eb28ba0d000000eb21ba07000000eb1aba09000000eb13ba11000000eb0cba0f000000eb05ba130000008b75008d76d43b75087303ff5520897500c746fc04000000c7460c01000000894e08895604c706170000008d7e14c747fc050000008947108b4c2404894f0c8b1c24895f08c7470405000000c7070d0000008b5d008d5bb43b5d087303ff5520895d00c743fc02000000c7430401000000893b8d7b0cc747fc02000000895f0489378d5f0cc743fc02000000894304c703030000008d430cc740fc030000008948088b0c24894804c7000100000089c18d4010c740fc050000008b74241489701089500c89480889580489388b54241083c40cff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c20800833e077506837a0401740bb844ef83b28b5d0490ff1383fb0d745c83fb0b745c83fb09745c83fb07745c8b7c24088b078b00a801740583c0027105ff5538ebf68b1789028b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000897808895804c70017000000f64604017472eb14e96c010000e967010000e962010000e95d010000f6460401750d50b808a87cb28b5d049090ff138b5604f6c201740403d27105ff5538ebf783ea01f6c201740583c2027105ff5538ebf68b7d008d7fe83b7d087303ff5520897d00c747fc050000008957108b510889570c8b5104eb05e912000000895708c7470405000000c70705000000eb378b7d008d7fe83b7d087303ff5520897d00c747fc050000008b56048957108b510889570c8b5104895708c7470405000000c707070000008b55008d52b43b55087303ff5520895500c742fc02000000c7420401000000893a8d7a0cc747fc0200000089570489078d470cc740fc030000008b51088950088b5104895004c700010000008d4810c741fc020000008b7604897104c7010500000089c28d410cc740fc050000008b74240889701089580c89480889500489388b542404ff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c208008b7d008d7fec3b7d087303ff5520897d00c747fc04000000c707ccf183b2895f048b5c2408895f088b4c2404894f0c8067ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000897804c70005000000c2080090000000000c100000|@10340,2097151,@1379|15,0,@10326 42,0,@10326 86,1,@10329 102,1,@10329 167,0,0 195,0,11 221,0,2 227,0,7 258,0,0 282,0,1 315,0,1 421,0,0 427,0,0 458,1,@10329 516,0,0 532,0,11 563,0,@7422 647,0,2 653,0,4 695,0,2 701,0,5 732,0,0 768,0,1 790,0,2 866,0,0 872,0,0 891,0,@10326 918,1,@10329 976,0,0 992,0,11 1025,0,2 1031,0,6 1062,0,0 1098,0,1 1127,0,0 1202,0,0 1208,0,0 1230,0,@10326 1283,0,@10331 1342,0,0 1349,0,207 1356,0,0 1377,0,2 1406,1,@10329 1442,0,$10325+1462 1568,0,@10334 1578,0,2 1585,0,1 1592,0,0 1599,0,5 1606,0,6 1613,0,3 1620,0,4 1627,0,8 1634,0,7 1641,0,9 1672,0,0 1684,0,11 1703,0,@7422 1787,0,2 1793,0,4 1835,0,2 1841,0,5 1872,0,0 1908,0,1 1930,0,2 2006,0,0 2012,0,0 2031,0,@10326 2090,0,$10325+2122 2224,0,@10334 2234,0,2 2241,0,1 2248,0,0 2255,0,5 2262,0,6 2269,0,3 2276,0,4 2283,0,8 2290,0,7 2297,0,9 2328,0,0 2344,0,11 2363,0,@7422 2456,0,2 2462,0,2 2513,0,2 2519,0,3 2550,0,0 2595,0,0 2617,0,2 2690,0,0 2696,0,0 2729,0,@10337 2781,0,0 2788,0,207 2795,0,1 2804,0,2 2820,0,@10326 2839,0,@10326 2891,0,@10338 2943,0,0 2950,0,207 2957,0,0 2978,0,2 3010,1,@10329 3046,0,$10325+3066 3172,0,@10334 3182,0,2 3189,0,1 3196,0,0 3203,0,5 3210,0,6 3217,0,3 3224,0,4 3231,0,8 3238,0,7 3245,0,9 3276,0,0 3288,0,11 3321,0,2 3327,0,6 3358,0,0 3394,0,1 3419,0,0 3494,0,0 3500,0,0 3519,0,@10326 3602,0,0 3614,0,11 3654,0,@7422 3749,0,2 3755,0,2 3806,0,2 3812,0,3 3843,0,0 3888,0,0 3910,0,2 3982,0,0 3988,0,0 4021,0,@10339 4073,0,0 4080,0,207 4087,0,0 4096,0,2 10326:O4|@4608,@5398,@10328,@10327 10327:O5|@9182,1779,0,1779,0 10328:S11|74657374416374696f6e73 10329:D3,200|3b650c7303ff552481e09f010000b901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740783f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8ff7504b91ef083b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04c38b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1390909000000000c4000000|@10330,2097151,@1374|15,0,0 20,0,1 32,0,@8999 88,0,@5215 94,0,I106 106,0,$10329+154 126,0,@5401 138,0,@8950 172,0,@8952 10330:S29|5838364c4f574c4556454c28292e63686f6f736547656e526567283229 10331:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bac8f083b256ff229090900000000028000000|@10333,1048575,@1375|26,0,@10332 10332:O1|@10325 10333:S31|5838364c4f574c4556454c28292e74657374416374696f6e73283129283129 10334:O4|@4608,@5398,@10336,@10335 10335:O5|@9182,896,0,896,0 10336:S29|72657665727365546573744f703a20756e6b6e6f776e206272616e6368 10337:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bac8f083b256ff229090900000000028000000|@10333,1048575,@1376|26,0,@10332 10338:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bac8f083b256ff229090900000000028000000|@10333,1048575,@1377|26,0,@10332 10339:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04bac8f083b256ff229090900000000028000000|@10333,1048575,@1378|26,0,@10332 10340:S28|5838364c4f574c4556454c28292e74657374416374696f6e73283429 10341:S30|5838364c4f574c4556454c28292e6d616b654272616e6368283129283129 10342:S24|5838364c4f574c4556454c28292e74657374457157283129 10343:O1|@10344 10344:D3,72|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701dcf283b28b45008d40f83b45087303ff5520894500c740fc010000008908c390900000000044000000|@10348,3,@1385|31,0,@10345 10345:O1|@10346 10346:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700b0f383b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1384|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10347 10347:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb1300000051e94febffff9090900000000028000000|@10333,2097151,@1383|18,0,@10322 23,0,9 29,1,@10325 10348:S25|5838364c4f574c4556454c28292e746573744e657157283129 10349:O2|@10350,0 10350:O3|3,0,0 10351:O1|@10352 10352:D3,52|833807751e8b48048b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000030000000|@10353,3,@1386|36,0,0 10353:S55|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e4f746865725465737473283129283129 10354:O4|@4608,@5398,@10356,@10355 10355:O5|@9130,1426,0,1426,0 10356:S33|636f6d70617265416e644272616e63682072657475726e6564206661696c757265 10357:D3,292|8d7c24ac3b7d0c7303ff5528a801757153ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb010000008b008b54244c909090ff1283f801750e89c1b850f683b28b5d049090ff138b4d008d49f4eb05e98e0000003b4d087303ff5520894d00c741fc02000000c74104010000008b00890151ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b44244090e812ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c23c00b801000000c23c000000000020010000|@6329,1048575,@1387|87,0,0 110,0,@10358 155,0,0 277,0,0 10358:O4|@4608,@5398,@10360,@10359 10359:O5|@9130,1415,0,1415,0 10360:S18|67656e546573743a206e6f20726573756c74 10361:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@1388|60,0,0 10362:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1389| 10363:O1|@10364 10364:D3,16|b801000000c39090000000000c000000|@10365,1,@1390|1,0,0 10365:S43|434f444547454e5f5441424c4528292e636f6d70617265416e644272616e6368283329636f64652d283129 10366:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1391| 10367:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1392| 10368:S52|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e4f746865725465737473283129 10369:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1394| 10370:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1395| 10371:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1396| 10372:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1397| 10373:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1398| 10374:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1399| 10375:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1400| 10376:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1401| 10377:O1|@10378 10378:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701b0fb83b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1421|29,0,@10379 10379:O1|@10380 10380:D3,28|3b650c7303ff5524bb13000000e91e00000090900000000018000000|@10427,63,@1420|9,0,9 14,1,@10381 10381:D3,416|8b45008d40d83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000538b5d008d5bd43b5d087303ff5520895d00c743fc05000000894b1089430c895308897b0489338d4318c740fc040000009090c7009cfd83b28970048b0c2489480889580c8060ffbf8b55008d52e83b55087303ff5520895500c742fc05000000c702000684b2897204894a08895a0c8942108062ffbf8b7d008d7fe43b7d087303ff5520897d00c747fc06000000c707ec0784b2897704894f08895f0c8947108957148067ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700c80a84b28978048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701580b84b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700e80b84b28948048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000895804890883c404c3000000009c010000|@10426,63,@1419|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 147,0,@10382 193,0,@10412 239,0,@10415 288,0,@10418 325,0,@10420 362,0,@10422 10382:D3,68|89c18b45008d40e83b45087303ff5520894500c740fc05000000c700f4fd83b28b5a048958048b72088970088b7a0c89780c8948108060ffbfc390900000000040000000|@10411,63,@1407|28,0,@10383 10383:D3,92|3b650c7303ff55248b421089d38b0889c8e85a000000ff7308ff730c8b5b049090e8c200000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c39090900000000058000000|@10410,2097151,@1406|18,1,@10384 34,1,@10385 70,0,0 76,0,0 10384:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1402|23,0,@6769 84,0,0 10385:D3,1104|3b650c7303ff5524a801753f8b088339037538f640040175328b5004f642040175298b72048b3e833f03751ff646040175198b4e04f641040175108b51048b3a833f037506837a0401740e89c1b8400384b28b5d049090ff138b308b48048b51048b3a8b42048b5004ff318b0a817e0430c37fb274198b5604833a017446833a037546837a040d7545837a08017544817f044cc37fb274198b5704833a017449833a037544837a040f753e837a080175388179049c9a7ab2743b8b5104833a017427eb14e920000000e91b000000e916000000e911000000833a03750c837a04037506837a0801740c8b08b8840384b28b5d04ff138b0bf6c101740583c1027105ff5538ebf6890b8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c010000008b5424088951088b5c240c895904c701170000008d7114c746fc02000000c74604cc0384b2890e8b08833905756ef6410401750ab808a87cb28b5d04ff13837904017507bf01000000eb768b7904f7c701000000740783ff017d1aeb06f647ff1074125689fbb88c6c7ab29090ff1588c75208eb0389f8568b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc741084cc37fb2eb05e92c000000c7410401000000c701090000008d7914c747fc02000000c7470401000000eb05e904000000890feb6f56eb71833903740cb86c0484b28b5d049090ff138b7d008d7fa43b7d087303ff5520897d00c747fc030000008b4104894708894704c707770000008d5f10c743fc0400000089430cc743084cc37fb2c7430401000000c7030f0000008d5314c742fc04000000c7420c05000000eb0ae949000000e944000000894208c7420403000000c702650000008d4214c740fc02000000c740040100000089108d480cc741fc02000000894104891989f88d790cc747fc02000000894f048907568b4424048338057570f640040175108b4804b808a87cb28b5d04909090ff13837804017507b801000000eb728b4804f6c101740783f9017d19eb06f641ff1074115789cbb88c6c7ab290ff1588c75208eb0389c8578b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc7410830c37fb2eb05e92c000000c7410401000000c701090000008d4114c740fc02000000c7400401000000eb05e9040000008908eb6f57eb71833803740cb86c0484b28b5d049090ff138b4d008d49a43b4d087303ff5520894d00c741fc030000008b5004895108895104c701770000008d5910c743fc0400000089530cc7430830c37fb2c7430401000000c7030f0000008d7314c746fc04000000c7460c05000000eb0ae947000000e942000000895608c7460403000000c706650000008d4614c740fc02000000c740040100000089308d500cc742fc02000000894204891a8d420cc740fc0200000089500489085783f80175058b0424eb0c89c38b04249090e8aa01000083f801750a83c4045883c404c2080089c38b44240483c40c5983c40851e9e0010000000000004c040000|@10409,2097151,@1405|78,0,@10386 112,0,@8800 146,0,@8802 180,0,@5592 236,0,@10389 291,0,0 311,0,11 328,0,@10392 348,0,@7422 364,0,0 398,0,@5215 406,0,I106 445,0,@8802 459,0,0 465,0,4 482,0,0 506,0,@10404 552,0,59 572,0,@8802 579,0,0 585,0,7 602,0,2 624,0,1 630,0,50 647,0,0 705,0,@7422 724,0,0 755,0,@5215 762,0,I106 801,0,@8800 815,0,0 821,0,4 838,0,0 862,0,@10404 908,0,59 928,0,@8800 935,0,0 941,0,7 958,0,2 980,0,1 986,0,50 1003,0,0 1058,1,@10407 1092,1,@10408 10386:O4|@4608,@5398,@10388,@10387 10387:O5|@9182,1876,0,1876,0 10388:S15|67656e657261746542797465566563 10389:O4|@4608,@5398,@10391,@10390 10390:O5|@9182,1847,0,1847,0 10391:S19|496e636f727265637420726567697374657273 10392:O2|@10394,@10393 10393:O2|@10396,@10395 10394:O2|36,@5592 10395:O2|@10398,@10397 10396:O2|36,@8800 10397:O2|@10400,@10399 10398:O2|36,@8802 10399:O2|@10402,@10401 10400:O2|47,0 10401:O2|@10403,0 10402:O4|7,2,@5592,@5592 10403:O4|50,1,@5592,2 10404:O4|@4608,@5398,@10406,@10405 10405:O5|@9182,1862,0,1862,0 10406:S9|6765744f6666736574 10407:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1403| 10408:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1404| 10409:S45|5838364c4f574c4556454c28292e67656e4279746556656328322967656e657261746542797465566563283129 10410:S45|5838364c4f574c4556454c28292e67656e4279746556656328322967656e6572617465436f6465283129283129 10411:S42|5838364c4f574c4556454c28292e67656e4279746556656328322967656e6572617465436f6465283129 10412:D3,72|89c18b45008d40e43b45087303ff5520894500c740fc06000000c7005c0684b28b5a048958048b72088970088b7a0c89780c8948108b4a108948148060ffbfc30000000044000000|@9631,63,@1410|28,0,@10413 10413:D3,260|3b650c7303ff552489c1bb07000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc9833907756e8b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c700050000008b4a106a016a01526a07508d44240c508b59048b0190e82a73fdff8b442404909090e8820000008b0c24ff7108ff710c8b5904909090e8d6f7ffff89c18b45008d40f03b4508730aeb05e921000000ff5520894500c740fc03000000894808c7400401000000c7000100000083c40cc3b99f0100008b1c24890c246a016a07ff721489d98b5a1051e9e47afdff0000000000010000|@9630,2097151,@1409|11,0,3 23,0,@5417 107,0,2 134,1,@9594 146,1,@10414 166,1,@10385 209,0,0 215,0,0 224,0,207 248,1,@9620 10414:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1408|23,0,@6769 84,0,0 10415:D3,80|89c18b45008d40e03b45087303ff5520894500c740fc07000000c700500884b28b5a048958048b72088970088b7a0c89780c8b5a108958108948148b4a148948188060ffbfc39090000000004c000000|@9631,63,@1413|28,0,@10416 10416:D3,492|3b650c7303ff552489c1bb03000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc983390775718b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4904894b04c703050000008b4a146a016a0152506a03538d5c2410538b59048b01e83671fdff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b54240889108b1c24be07000000f6c301eb05e903010000740e89c7b8bc7e7ab28b5d049090ff1383fe0175048b1beb1ff7c601000000740583ee027105ff5538ebf68b5b043b650c7303ff5524ebbe833b07756b8b45008d40f43b45087303ff5520894500c740fc020000008b5b04895804c700050000006a016a016a07508d4424085089cb89d0909090e88670fdff5883c404909090e8ba0000008b4c2404ff7108ff710c8b59049090e832f5ffff89c18b45008d40f03b4508730aeb05e921000000ff5520894500c740fc03000000894808c7400401000000c7000100000083c410c38b4c2404ba9f0100008b5c241089542410ba010000008954240cba07000000895424088b4910894c240489d989c35851e92878fdffb99f0100008b1c24890c246a016a03ff721889d98b5a1451e90b78fdff90909000000000e8010000|@9630,2097151,@1412|11,0,1 23,0,@5417 107,0,2 134,1,@9594 179,0,3 198,0,@5417 286,0,2 310,1,@9594 322,1,@10417 342,1,@10385 385,0,0 391,0,0 404,0,207 417,0,0 426,0,3 448,1,@9620 453,0,207 477,1,@9620 10417:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1411|23,0,@6769 84,0,0 10418:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700140b84b28948048b52048950088060ffbfc390900000000034000000|@10255,7,@1415|28,0,@10419 10419:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a09ff720889d98b5a0451e90377fdff909090000000002c000000|@9623,2097151,@1414|9,0,2 33,1,@9620 10420:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700a40b84b28948048b52048950088060ffbfc390900000000034000000|@10255,7,@1417|28,0,@10421 10421:D3,48|3b650c7303ff5524b9010100008b1c24890c246a036a05ff720889d98b5a0451e97376fdff909090000000002c000000|@9623,2097151,@1416|9,0,128 33,1,@9620 10422:D3,48|3b650c7303ff5524b9810000008b1c24890c246a036a01ff720489d9bb2c0c84b251e92d76fdff90000000002c000000|@9623,2097151,@1418|9,0,64 29,0,@10423 35,1,@9620 10423:O2|@10424,0 10424:O2|0,@10425 10425:O2|0,@5330 10426:S27|5838364c4f574c4556454c28292e67656e42797465566563283229 10427:S30|5838364c4f574c4556454c28292e67656e42797465566563283129283129 10428:S51|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d706172652833292d45 10429:O1|@10430 10430:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7012c0d84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1423|29,0,@10431 10431:O1|@10432 10432:D3,28|3b650c7303ff5524bb05000000e9a2eeffff90900000000018000000|@10427,63,@1422|9,0,2 14,1,@10381 10433:D3,612|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701dc0f84b28959048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702481084b28b5c244c895a048062ffbf837c244801750289d189c28b45008d40f43b45087303ff5520894500c740fc02000000c74004781084b2891089caff1283f80175728b4424488b4c24448b5424408b5c243c8b7424388b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434578b7c2434894c247c89542478895c2474897424708b4c242c894c246c8b4c2428eb05e969000000894c24688b4c2424894c24648b4c2420894c24608b4c241c894c245c8b4c2418894c24588b4c2414894c24548b4c2410894c24508b4c240c894c244c8b4c2408894c24488b4c2404894c24445983c42c894c2410897c240c89c3b8010000005983c40851e9adccffff8b08ff31ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff7424408b9c24800000008b4104e8e601000050b8010000008b542404ff126a016a01ff7004ff74240cff7424508d4c240c51bb1c1284b28b00e89a84fdff8b44244cff7020ff7024ff702c8b581c8b480889c89090e82a92fcff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008948045983c40489088b4c24408b0983f90175058b0c24eb1289c689cb8b04249090e89a02000089c189f08b54244083c40c890ac24c0090900000000060020000|@10444,2097151,@1430|34,0,@10434 71,0,@10436 124,0,@10437 349,0,0 359,1,@10316 438,1,@10440 444,0,0 475,0,@10441 482,1,@9650 510,1,@9212 543,0,0 582,1,@10443 10434:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@10435,1048575,@1424| 10435:S51|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d706172652833292d50 10436:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@10435,1048575,@1425| 10437:O1|@10438 10438:D3,52|833807751e8b48048b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000030000000|@10439,3,@1426|36,0,0 10439:S52|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d70617265283329283129 10440:D3,260|8d7c24ac3b7d0c7303ff5528a801757153ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb030000008b008b54244c909090ff1283f801750e89c1b8447080b28b5d049090ff13ff30ff742448eb05e96e000000ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b442440909090e832ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c23c00b801000000c23c000000000000010000|@6329,1048575,@1427|87,0,1 110,0,@9149 245,0,0 10441:O1|@10442 10442:D3,16|b801000000c39090000000000c000000|@10365,1,@1428|1,0,0 10443:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1429| 10444:S49|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d70617265283329 10445:O1|@10446 10446:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701301384b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1433|29,0,@10447 10447:O1|@10448 10448:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700041484b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1432|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10449 10449:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb1300000051e9fbcaffff9090900000000028000000|@10333,2097151,@1431|18,0,@10322 23,0,9 29,1,@10325 10450:O1|@10451 10451:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701981484b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1436|29,0,@10452 10452:O1|@10453 10453:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c7006c1584b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1435|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10454 10454:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0500000051e993c9ffff9090900000000028000000|@10333,2097151,@1434|18,0,@10322 23,0,2 29,1,@10325 10455:O1|@10456 10456:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701001684b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1439|29,0,@10457 10457:O1|@10458 10458:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d41684b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1438|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10459 10459:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0500000051e92bc8ffff9090900000000028000000|@10333,2097151,@1437|18,0,@10322 23,0,2 29,1,@10325 10460:O1|@10461 10461:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701681784b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1442|29,0,@10462 10462:O1|@10463 10463:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c7003c1884b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1441|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10464 10464:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb1300000051e9c3c6ffff9090900000000028000000|@10333,2097151,@1440|18,0,@10322 23,0,9 29,1,@10325 10465:O1|@10466 10466:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c7002c1984b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1456|41,0,1 62,0,0 72,0,0 115,0,@10467 10467:O1|@10468 10468:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700001a84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1455|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10469 10469:D3,44|3b650c7303ff55248b52048b0c2489142468401a84b2bb1300000051e9ffc4ffff9090900000000028000000|@10333,2097151,@1454|18,0,@10470 23,0,9 29,1,@10325 10470:O1|@10471 10471:D3,44|3b650c7303ff55248b48088b1424890c24ff700cff70108b58048b0889c852e91c0000000000000028000000|@10488,63,@1453|32,1,@10472 10472:D3,1044|3b650c7303ff5524833b057513f6430401750a5983c40c51e90b040000c20c008b4c240c8339057513f6410401750a5a83c40c52e963040000c20c008b55008d52e03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4f08c741fc01000040c70101000000508b45008d40f83b45087303ff5520894500c740fc01000040c70001000000538b5d008d5ba83b5d087303ff5520895d00c743fc0500000089731089530c897b08894304890bc701030000008d4318c740fc04000000c7400c05000000895808c7400413000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc01000040c700010000008d5008c742fc01000040c702f9ffff078d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000538b5d008d5bbc3b5d087303ff5520895d00c743fc0500000089531089430c897308894b04893bc707030000008d4318c740fc04000000c7400c05000000895808c7400413000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc020000005a895004c700390000008b55008d52dc3b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895804c700390000008d580cc743fc02000000c743040100000089038b44241883380175338b75008d76ec3b75087303ff5520897500c746fc040000008b7808897e0cc74608030000008b7804897e04c70679000000eb34833803740bb8801f84b28b5d0490ff138b75008d76f43b75087303ff5520897500c746fc020000008b7804897e04c7067b0000008b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089308b742404833e0175348b7d008d7fec3b7d087303ff5520897d00c747fc04000000528b560889570cc74708030000008b5604895704c70779000000eb37833e03740d89c7b8801f84b28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b7604897704c7077b000000528b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000893a83fa0175068b542404eb1889de89cf5089d38b442408e8ce01000089c289f389f9eb015083fa0175058b0424eb1589de89cf89d38b0424909090e80202000089f389f983f801740f89de89c389c8e84602000089c189f383f9017507b80c1f84b2eb1289de89cbb80c1f84b29090e87e02000089f383f801740f89d989c389c89090e8c202000089c383fb0175068b442404eb0b8b4424049090e80203000083f801750783c41058c20c0089c38b44241083c4145983c40c51e93b0300009090900000000010040000|@10487,63,@1452|25,1,@10473 53,1,@10476 86,0,0 102,0,67108860 118,0,0 134,0,0 165,0,0 210,0,1 227,0,2 237,0,9 243,0,11 260,0,0 278,0,0 294,0,67108860 310,0,0 326,0,0 357,0,0 402,0,1 419,0,2 429,0,9 435,0,11 452,0,0 474,0,28 505,0,0 526,0,28 543,0,0 591,0,1 603,0,60 615,0,@10477 657,0,61 688,0,0 737,0,1 749,0,60 763,0,@10477 805,0,61 837,0,0 866,1,@10480 902,1,@10481 922,1,@10482 936,0,@10474 947,0,@10474 954,1,@10483 974,1,@10484 998,1,@10485 1029,1,@10486 10473:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b80c1f84b2c39090900000000044000000|@6536,3,@1443|56,0,@10474 10474:O2|@10475,0 10475:O2|10,56 10476:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b80c1f84b2c39090900000000044000000|@6536,3,@1444|56,0,@10474 10477:O4|@4608,@5398,@10479,@10478 10478:O5|@9182,844,0,844,0 10479:S8|6d616b6554657374 10480:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1445| 10481:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1446| 10482:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1447| 10483:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1448| 10484:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1449| 10485:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1450| 10486:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1451| 10487:S27|5838364c4f574c4556454c28292e65715465737454616773283529 10488:S27|5838364c4f574c4556454c28292e65715465737454616773283129 10489:O1|@10490 10490:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c7001c2384b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1459|41,0,1 62,0,0 72,0,0 115,0,@10491 10491:O1|@10492 10492:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700f02384b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1458|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10493 10493:D3,44|3b650c7303ff55248b52048b0c2489142468401a84b2bb0500000051e90fbbffff9090900000000028000000|@10333,2097151,@1457|18,0,@10470 23,0,2 29,1,@10325 10494:O1|@10495 10495:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700e02484b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1484|41,0,1 62,0,0 72,0,0 115,0,@10496 10496:O1|@10497 10497:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700b42584b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1483|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10498 10498:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0b00000051e94bb9ffff9090900000000028000000|@10333,2097151,@1482|18,0,@10499 23,0,5 29,1,@10325 10499:O1|@10500 10500:D3,44|3b650c7303ff55248b48088b1424890c24ff700cff70108b58048b0889c852e91c0000000000000028000000|@10537,63,@1481|32,1,@10501 10501:D3,1492|3b650c7303ff55248b4c240c8339057570f6410401750e89c2b8242c84b28b5d049090ff138b55008d52e03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4f08c741fc01000040c70101000000508b45008d40f83b4508730aeb05e944040000ff5520894500c740fc01000040c70001000000538b5d008d5ba83b5d087303ff5520895d00c743fc0500000089731089530c897b08894304890bc701030000008d4318c740fc04000000c7400c03000000895808c7400405000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc01000040c700010000008d5008c742fc01000040c702f9ffff078d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000538b5d008d5bd03b5d087303ff5520895d00c743fc0500000089531089430c897308894b04893bc707030000008d4318c740fc02000000895804c7007d0000008d480cc741fc02000000c741040100000089018b442408833803740cb8742c84b28b5d049090ff138b5424148b328b36f7c601000000740583c6027105ff5538ebf68b3a8937837c24180d75318b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000895608c7460413000000c70617000000eb6a837c24180b75318b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000895608c7460413000000c70617000000eb70837c24180975388b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000895608c7460405000000eb05e955000000c70617000000eb4d837c24180774108b7004b8c82c84b28b5d04909090ff138b75008d76ec3b75087303ff5520897500c746fc04000000eb05e917000000c7460c01000000895608c7460405000000c706170000008b55008d52d43b55087303ff5520895500c742fc02000000895a04c702390000008d5a0cc743fc02000000c743040100000089138d530cc742fc04000000c7420cffffffffc74208210000008b4004894204c702790000008b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc0200000089420489328d420cc740fc020000005e897004c700390000008b75008d76f43b75087303ff5520897500c746fc02000000c746040100000089068b44240483380175348b7d008d7fec3b7d087303ff5520897d00c747fc04000000538b5808895f0cc74708030000008b5804895f04c70779000000eb35833803740bb8801f84b28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4004894704c7077b000000538b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000893883f80175068b442404eb1489d75189c38b4424089090e89602000089faeb015183f80175068b442410eb1289d789c38b442410909090e8ce02000089fa83f80175058b0424eb0e89d789c38b0424e80e03000089fa83f801741189d789c389f09090e85203000089c689fa83fe01740d89f389d09090e89603000089c283fa01750a83c4045883c40cc20c0089d38b44240483c4145983c40c51e9ca030000833b05750f8b542408be222b84b28d7496fcffe6e9d1000000909090e975000000909090e974000000909090e94b000000909090e96b000000909090e96a000000909090e969000000909090e968000000909090e967000000909090e966000000909090e965000000909090e90b000000909090e903000000909090837c240805740c89c2b8f8f083b28b5d04ff13ba05000000eb3dba03000000eb36ba01000000eb2fba0b000000eb28ba0d000000eb21ba07000000eb1aba09000000eb13ba11000000eb0cba0f000000eb05ba130000008b742404895c240c895424088974240489cbe94cfaffff894c240cba01000000895424085a83c40452e9210300009000000000d0050000|@10536,63,@1480|26,0,@10502 63,0,0 79,0,67108860 95,0,0 111,0,0 149,0,0 194,0,1 211,0,1 221,0,2 227,0,11 244,0,0 262,0,0 278,0,67108860 294,0,0 310,0,0 341,0,0 386,0,1 405,0,62 422,0,0 438,0,@10505 513,0,0 523,0,9 529,0,11 569,0,0 579,0,9 585,0,11 625,0,0 635,0,2 648,0,11 665,0,@10508 711,0,0 721,0,2 727,0,11 760,0,28 777,0,0 796,0,-1 803,0,16 815,0,60 846,0,0 883,0,28 914,0,0 963,0,1 975,0,60 987,0,@10477 1029,0,61 1061,0,0 1090,1,@10511 1122,1,@10512 1146,1,@10513 1166,1,@10514 1186,1,@10515 1222,1,@10516 1236,0,$10501+1254 1360,0,@10334 1370,0,2 1377,0,1 1384,0,0 1391,0,5 1398,0,6 1405,0,3 1412,0,4 1419,0,8 1426,0,7 1433,0,9 1465,0,0 1479,1,@10517 10502:O4|@4608,@5398,@10504,@10503 10503:O5|@9182,906,0,906,0 10504:S27|7465737454616773466f72436f6d70617269736f6e3a206c6f6e67 10505:O4|@4608,@5398,@10507,@10506 10506:O5|@9182,912,0,912,0 10507:S30|7465737454616773466f72436f6d70617269736f6e3a206e6f7420726567 10508:O4|@4608,@5398,@10510,@10509 10509:O5|@9182,925,0,925,0 10510:S26|7465737454616773466f72436f6d70617269736f6e3a206f7063 10511:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1460| 10512:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1461| 10513:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1462| 10514:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1463| 10515:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1464| 10516:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1465| 10517:D3,1100|3b650c7303ff55246a016a015089d98d5c240489c8e8460400006a016a0189e38b44241c90e8360400006a016a01837c24200174708b45008d40883b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470ceb05e973000000895708897704891fc703030000008d4718c740fc04000000c7400c03000000897808c7400417000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc02000000897804c700390000008d500cc742fc02000000c7420401000000890289e0890889e0895004eb1189e0c7000100000089e0c74004010000008b45008d40883b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891fc703030000008d4718c740fc02000000897804c7007d0000008d480cc741fc02000000c741040100000089018d410cc740fc01000040c700010000008d5008c742fc01000040c702f9ffff078d5a08c743fc01000040c703010000008d7308c746fc01000040c70601000000518b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000568b75008d76b83b75087303ff5520897500c746fc0500000089561089460c895e08894e048b042489068d4e18c741fc02000000897104c701390000008d510cc742fc02000000c7420401000000890a8d4a0cc741fc02000000897904c701390000008d590cc743fc02000000c7430401000000890b8b08f6c101740583c1027105ff5538ebf689088b45008d40e83b45087303ff5520894500c740fc02000000897004c7007d0000008d480cc741fc02000000c74104010000008901837c241c0175068b442410eb1b89de89cf528b5c24208b442414909090e85e04000089f989f3eb015283f80175058b0424eb1389de89cf89c38b042490e89604000089f989f383f80175068b44241ceb1589de89cf89c38b44241c9090e8ce04000089f989f383f80175068b44240ceb1589de89cf89c38b44240c9090e80605000089f989f383f80175068b442408eb1589de89cf89c38b4424089090e83e05000089f989f383f80175068b442424eb1589de89cf89c38b4424249090e87605000089f989f383f80175068b442418eb1589de89cf89c38b4424189090e8ae05000089f989f383f80175068b442410eb1589de89cf89c38b4424109090e8e605000089f989f383f8017507b80c1f84b2eb1489de89cf89c3b80c1f84b2e81e06000089f989f383f801740f89de89c389c8e86206000089c189f383f901750889d883c428c2080089d889cb83c4285983c40851e9980600000000000048040000|@10535,63,@1479|22,1,@10518 38,1,@10518 79,0,0 95,0,67108860 111,0,0 127,0,0 143,0,0 180,0,1 197,0,1 207,0,11 213,0,11 230,0,0 251,0,28 268,0,0 289,0,0 298,0,0 328,0,0 344,0,67108860 360,0,0 376,0,0 392,0,0 422,0,1 441,0,62 458,0,0 476,0,0 492,0,67108860 508,0,0 524,0,0 555,0,0 616,0,28 633,0,0 654,0,28 671,0,0 725,0,62 742,0,0 778,1,@10524 810,1,@10525 842,1,@10526 874,1,@10527 906,1,@10528 938,1,@10529 970,1,@10530 1002,1,@10531 1016,0,@10474 1029,0,@10474 1034,1,@10532 1054,1,@10533 1088,1,@10534 10518:D3,552|3b650c7303ff55248338057523f6400401750ab8c43584b28b5d04ff13c70301000000c7430401000000b801000000c38b4d008d49e03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc01000040c702f9ffff078d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000538b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000508b45008d40b03b45087303ff5520894500c740fc0500000089501089480c8970088958048938c707030000008d4818c741fc04000000c7410c03000000894108c7410405000000c701170000008d5114c742fc02000000c7420401000000890a8d4a0cc741fc0200000089410489118d410cc740fc020000008b51048950048b1989188b3424833e0175338b7d008d7fec3b7d087303ff5520897d00c747fc040000008b5e08895f0cc74708030000008b4e04894f04c70779000000eb39833e0374108b7804ff30b8801f84b28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc020000008b7604897704c7077b0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000893983f90175048b08eb138b700489cb8b00909090e8ba00000089c1eb038b70048b45008d40e83b45087303ff5520894500c740fc02000000897004c700390000008d500cc742fc02000000c742040100000089028b44240483c4048908895004b80100000083c404c390900000000024020000|@10523,63,@1467|20,0,@10519 31,0,0 38,0,0 43,0,0 74,0,0 90,0,67108860 106,0,0 122,0,0 153,0,0 198,0,1 215,0,1 225,0,2 231,0,11 248,0,0 330,0,1 342,0,60 359,0,@10477 401,0,61 432,0,0 458,1,@10522 498,0,28 515,0,0 534,0,0 10519:O4|@4608,@5398,@10521,@10520 10520:O5|@9182,856,0,856,0 10521:S23|74657374546167733a206c6f6e6720636f6e7374616e74 10522:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1466| 10523:S36|5838364c4f574c4556454c28292e7465737454616773283429636865636b546167283129 10524:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1468| 10525:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1469| 10526:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1470| 10527:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1471| 10528:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1472| 10529:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1473| 10530:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1474| 10531:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1475| 10532:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1476| 10533:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1477| 10534:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1478| 10535:S25|5838364c4f574c4556454c28292e7465737454616773283429 10536:S38|5838364c4f574c4556454c28292e7465737454616773466f72436f6d70617269736f6e283529 10537:S38|5838364c4f574c4556454c28292e7465737454616773466f72436f6d70617269736f6e283129 10538:O1|@10539 10539:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700903b84b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1487|41,0,1 62,0,0 72,0,0 115,0,@10540 10540:O1|@10541 10541:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700643c84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1486|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10542 10542:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0900000051e99ba2ffff9090900000000028000000|@10333,2097151,@1485|18,0,@10499 23,0,4 29,1,@10325 10543:O1|@10544 10544:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700543d84b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1490|41,0,1 62,0,0 72,0,0 115,0,@10545 10545:O1|@10546 10546:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700283e84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1489|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10547 10547:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0700000051e9d7a0ffff9090900000000028000000|@10333,2097151,@1488|18,0,@10499 23,0,3 29,1,@10325 10548:O1|@10549 10549:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700183f84b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1493|41,0,1 62,0,0 72,0,0 115,0,@10550 10550:O1|@10551 10551:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700ec3f84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1492|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10552 10552:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0d00000051e9139fffff9090900000000028000000|@10333,2097151,@1491|18,0,@10499 23,0,6 29,1,@10325 10553:O1|@10554 10554:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700dc4084b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1496|41,0,1 62,0,0 72,0,0 115,0,@10555 10555:O1|@10556 10556:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700b04184b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1495|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10557 10557:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0d00000051e94f9dffff9090900000000028000000|@10333,2097151,@1494|18,0,@10499 23,0,6 29,1,@10325 10558:O1|@10559 10559:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700a04284b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1499|41,0,1 62,0,0 72,0,0 115,0,@10560 10560:O1|@10561 10561:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700744384b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1498|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10562 10562:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0700000051e98b9bffff9090900000000028000000|@10333,2097151,@1497|18,0,@10499 23,0,3 29,1,@10325 10563:O1|@10564 10564:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700644484b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1502|41,0,1 62,0,0 72,0,0 115,0,@10565 10565:O1|@10566 10566:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700384584b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1501|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10567 10567:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0900000051e9c799ffff9090900000000028000000|@10333,2097151,@1500|18,0,@10499 23,0,4 29,1,@10325 10568:O1|@10569 10569:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700284684b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10428,1048575,@1505|41,0,1 62,0,0 72,0,0 115,0,@10570 10570:O1|@10571 10571:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700fc4684b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1504|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10572 10572:D3,44|3b650c7303ff55248b52048b0c2489142468f42584b2bb0b00000051e90398ffff9090900000000028000000|@10333,2097151,@1503|18,0,@10499 23,0,5 29,1,@10325 10573:O1|@10574 10574:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701904784b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1508|29,0,@10575 10575:O1|@10576 10576:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700644884b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1507|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10577 10577:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0300000051e99b96ffff9090900000000028000000|@10333,2097151,@1506|18,0,@10322 23,0,1 29,1,@10325 10578:O1|@10579 10579:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701f84884b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1511|29,0,@10580 10580:O1|@10581 10581:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700cc4984b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1510|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10582 10582:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb1100000051e93395ffff9090900000000028000000|@10333,2097151,@1509|18,0,@10322 23,0,8 29,1,@10325 10583:O1|@10584 10584:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701604a84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1514|29,0,@10585 10585:O1|@10586 10586:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700344b84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1513|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10587 10587:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0100000051e9cb93ffff9090900000000028000000|@10333,2097151,@1512|18,0,@10322 23,0,0 29,1,@10325 10588:O1|@10589 10589:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701c84b84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1517|29,0,@10590 10590:O1|@10591 10591:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c7009c4c84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1516|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10592 10592:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0f00000051e96392ffff9090900000000028000000|@10333,2097151,@1515|18,0,@10322 23,0,7 29,1,@10325 10593:O1|@10594 10594:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701304d84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1520|29,0,@10595 10595:O1|@10596 10596:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700044e84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1519|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10597 10597:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0f00000051e9fb90ffff9090900000000028000000|@10333,2097151,@1518|18,0,@10322 23,0,7 29,1,@10325 10598:O1|@10599 10599:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701984e84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1523|29,0,@10600 10600:O1|@10601 10601:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c7006c4f84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1522|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10602 10602:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0100000051e9938fffff9090900000000028000000|@10333,2097151,@1521|18,0,@10322 23,0,0 29,1,@10325 10603:O1|@10604 10604:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701005084b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1526|29,0,@10605 10605:O1|@10606 10606:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d45084b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1525|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10607 10607:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb1100000051e92b8effff9090900000000028000000|@10333,2097151,@1524|18,0,@10322 23,0,8 29,1,@10325 10608:O1|@10609 10609:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701685184b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1529|29,0,@10610 10610:O1|@10611 10611:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c7003c5284b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10341,63,@1528|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10612 10612:D3,44|3b650c7303ff55248b52048b0c2489142468d4de83b2bb0300000051e9c38cffff9090900000000028000000|@10333,2097151,@1527|18,0,@10322 23,0,1 29,1,@10325 10613:O1|@10614 10614:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701d05284b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1545|29,0,@10615 10615:O1|@10616 10616:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700a45384b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1544|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10617 10617:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700145484b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1543|26,0,@10618 72,0,1 78,0,1 10618:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700805484b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700605b84b28948048060ffbfc30000000054000000|@10655,7,@1542|26,0,@10619 68,0,@10639 10619:D3,48|3b650c7303ff5524b9130000008b1c24890c24ff720489d98b58048b1089d051e91f000000909090000000002c000000|@10638,2097151,@1533|9,0,9 33,1,@10620 10620:D3,1172|3b650c7303ff55248b4c2404a801750ff640040175098b5004837a0401740e89c2b86c5984b28b5d049090ff136a016a01837c241011750f89e38b30893389e38b3a897b04eb4f837c241001750f89e38b30893389e38b3a897b04eb39837c241003750f89e38b32893389e38b38897b04eb23837c24100f750f89e38b32893389e38b38897b04eb0d89e38b30893389e38b3a897b048b1c24833b057561f64304017428f6430401750bb808a87cb28b5d0490ff13837b0401740ab8b49380b28b5d04ff13bb4c9480b2eb5bf6430401740bb8ecd57ab28b5d0490ff138b7b040fb677ff8d74360183fe03752df7c7010000007414b8ecd57ab28b5d04eb05e946000000909090ff13beffffff002377fc8d74360183fe05740bb8589480b28b5d0490ff1389fb8b75008d76f43b75087303ff5520897500c746fc02000000895e04c70621000000eb68833b03740ab8a85984b28b5d04ff138b7304833e0375268b75008d76f43b75087303ff5520897500c746fc020000008b5b04895e04c70625000000eb2b8b75008d76f03b75087303ff5520897500c746fc03000000c74608010000008b5b04895e04c706230000008b5c2404833b05752d8b7d008d7ff03b7d087303ff5520897d00c747fc030000008b5b04895f08c7470405000000c70719000000eb6d833b03740cb8d45984b28b5d049090ff138b7b04833f0375348b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470c010000008b5b04895f08c7470405000000c7071b000000eb328b7d008d7ff03b7d087303ff5520897d00c747fc030000008b5b04895f08eb05e90d000000c7470405000000c7071d0000008b5c2410b83a5784b28d4498fcffe0e975000000909090e974000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e94b000000909090e94a000000909090e949000000909090e90b000000909090e903000000909090837c241005740cb8005a84b28b5d049090ff13b801880000eb21b8018a0000eb1ab8018a0000eb13b8010a0000eb0cb8010a0000eb05b8018800008b1183c4088b12f6c201740583c2027105ff5538ebf68b098911837c2408137407b905000000eb05b9130000008b55008d52e03b55087303ff5520895500c742fc04000000c7420c010000008b5c2404895a08894a04c702170000008d4a14c741fc02000000c741042c5a84b28911837c240805740e837c2408137407ba01000000eb05ba445a84b2a801740783f8017d1deb06f640ff1074155152575689c3b88c6c7ab29090ff1588c75208eb04515257568b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc74108f0a47ab2c7410403000000c701090000008d4114c740fc02000000c74004010000005a89108b55008d52f43b55087303ff5520895500c742fc020000008942045889028b45008d40e83b45087303ff5520894500c740fc02000000895004c700645a84b28d500cc742fc02000000894204890a83fa0175058b0424eb0b89d38b042490e83e01000083f801750783c40458c2080089c38b44240483c4085983c40851e9770100009090900000000090040000|@10637,2097151,@1532|34,0,@10621 171,0,@7422 188,0,@9179 198,0,@9183 211,0,@6321 246,0,@6321 266,0,8388607 283,0,@9184 324,0,16 336,0,@10624 385,0,18 418,0,0 430,0,17 476,0,2 482,0,12 494,0,@10626 540,0,0 553,0,2 559,0,13 605,0,2 611,0,14 620,0,$10620+630 734,0,@10628 746,0,17408 753,0,17664 760,0,17664 767,0,1280 774,0,1280 781,0,17408 819,0,2 826,0,9 857,0,0 873,0,11 890,0,@10630 911,0,0 918,0,@10632 946,0,@5215 954,0,I106 994,0,@5643 1001,0,1 1007,0,4 1024,0,0 1090,0,@10634 1126,1,@10635 1157,1,@10636 10621:O4|@4608,@5398,@10623,@10622 10622:O5|@9182,1984,0,1984,0 10623:S7|67656e54657374 10624:O4|@4608,@5398,@10328,@10625 10625:O5|@9182,1945,0,1945,0 10626:O4|@4608,@5398,@10328,@10627 10627:O5|@9182,1951,0,1951,0 10628:O4|@4608,@5398,@10328,@10629 10629:O5|@9182,1962,0,1962,0 10630:O2|@10631,0 10631:O2|36,@5643 10632:O2|@10633,0 10633:O4|4,5,@5643,16384 10634:O1|20 10635:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1530| 10636:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1531| 10637:S24|5838364c4f574c4556454c28292e67656e54657374283429 10638:S27|5838364c4f574c4556454c28292e67656e54657374283129283129 10639:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e9280000000000000020000000|@10644,2097151,@1541|18,0,@10640 24,1,@10641 10640:O2|@5424,0 10641:D3,464|3b650c7303ff5524a801756b8b0883390175698b55008d52f03b55087303ff5520895500c742fc03000000c702885d84b2895a048b5c2404895a088062ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000895004c70005000000eb0ae9f0000000e903000000c20400f6400401756b8b50048b32833e017566837a040175658b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707fc5d84b2895f048b5c2404895f088067ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400803000000eb0fe916000000e911000000e90c000000897804c70005000000c20400ff73049090e87a01000089c18b45008d40f43b45087303ff5520894500c740fc020000008b142489500489088b542408ff1289c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c20400ff73049090e85205000089c18b45008d40f43b45087303ff5520894500c740fc020000008b142489500489088b542408ff1289c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c2040000000000cc010000|@10654,2097151,@1540|45,0,@10642 90,0,0 97,0,207 104,0,0 113,0,2 180,0,@10645 225,0,0 232,0,207 239,0,1 265,0,2 278,1,@10646 357,0,0 370,1,@10652 449,0,0 10642:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04bac45d84b256ff2290900000000024000000|@10644,1048575,@1534|23,0,@10643 10643:O1|@10641 10644:S38|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283129283129283129 10645:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04bac45d84b256ff2290900000000024000000|@10644,1048575,@1535|23,0,@10643 10646:D3,84|3b650c7303ff5524a801753aff70048b00e852000000508b4424049090e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000050000000|@6329,2097151,@1537|18,1,@10647 71,0,0 10647:D3,812|3b650c7303ff552483380775258b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c3833805740e89c1b8e06184b28b5d049090ff138b480881e10100fe0083f901745f83f901745f8b400881e00100fe00b901000000ba0300000083f92f750d89c3b858f07fb28b5d0490ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd4f6c101740783f9017d23eb06f641ff10741b89cbb88c6c7ab2eb0ae98e000000e989000000ff1588c75208eb0289c8ff7504b99e5f84b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c38b480481e10100fe0083f901745f83f901745f8b400481e00100fe00b901000000ba0300000083f92f750d89c3b858f07fb28b5d0490ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd4f6c101740783f9017d23eb06f641ff10741b89cbb88c6c7ab2eb0ae98e000000e989000000ff1588c75208eb0289c8ff7504b99e6084b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c3b901000000ba0300000083f92f750d8b5804b858f07fb28b5d04ff1389d323580483fb01751183c1028d5412ff3b650c7303ff5524ebd3f6c101740783f9017d1aeb06f641ff10741289cbb88c6c7ab2909090ff1588c75208eb0289c8ff7504b97a6184b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c39090900000000028030000|@10651,2097151,@1536|45,0,2 58,0,@10648 98,0,0 103,0,1 115,0,@8999 172,0,@5215 190,0,I106 202,0,$10647+254 222,0,@5401 234,0,@8950 272,0,@8952 320,0,1 354,0,0 359,0,1 371,0,@8999 428,0,@5215 446,0,I106 458,0,$10647+510 478,0,@5401 490,0,@8950 528,0,@8952 576,0,1 582,0,0 587,0,1 600,0,@8999 657,0,@5215 666,0,I106 678,0,$10647+730 698,0,@5401 710,0,@8950 748,0,@8952 796,0,1 10648:O4|@4608,@5398,@10650,@10649 10649:O5|@9182,1920,0,1920,0 10650:S31|6e65676f746961746546503a206e6f7420726567206f72206c69746572616c 10651:S46|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283329617267546f536f75726365283129 10652:D3,84|3b650c7303ff5524a801753aff70048b00e852000000508b4424049090e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000050000000|@6329,2097151,@1539|18,1,@10653 71,0,0 10653:D3,812|3b650c7303ff552483380775258b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c3833805740e89c1b8e06184b28b5d049090ff138b480881e10100fe0083f901745f83f901745f8b400881e00100fe00b901000000ba0300000083f92f750d89c3b858f07fb28b5d0490ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd4f6c101740783f9017d23eb06f641ff10741b89cbb88c6c7ab2eb0ae98e000000e989000000ff1588c75208eb0289c8ff7504b9d26384b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c38b480481e10100fe0083f901745f83f901745f8b400481e00100fe00b901000000ba0300000083f92f750d89c3b858f07fb28b5d0490ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd4f6c101740783f9017d23eb06f641ff10741b89cbb88c6c7ab2eb0ae98e000000e989000000ff1588c75208eb0289c8ff7504b9d26484b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c3b901000000ba0300000083f92f750d8b5804b858f07fb28b5d04ff1389d323580483fb01751183c1028d5412ff3b650c7303ff5524ebd3f6c101740783f9017d1aeb06f641ff10741289cbb88c6c7ab2909090ff1588c75208eb0289c8ff7504b9ae6584b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c39090900000000028030000|@10651,2097151,@1538|45,0,2 58,0,@10648 98,0,0 103,0,1 115,0,@8999 172,0,@5215 190,0,I106 202,0,$10653+254 222,0,@5401 234,0,@8950 272,0,@8952 320,0,1 354,0,0 359,0,1 371,0,@8999 428,0,@5215 446,0,I106 458,0,$10653+510 478,0,@5401 490,0,@8950 528,0,@8952 576,0,1 582,0,0 587,0,1 600,0,@8999 657,0,@5215 666,0,I106 678,0,$10653+730 698,0,@5401 710,0,@8950 748,0,@8952 796,0,1 10654:S32|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283329 10655:S30|5838364c4f574c4556454c28292e66705465737473283229283129283129 10656:S27|5838364c4f574c4556454c28292e66705465737473283229283129 10657:S27|5838364c4f574c4556454c28292e66705465737473283129283129 10658:O1|@10659 10659:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701006784b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1551|29,0,@10660 10660:O1|@10661 10661:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d46784b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1550|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10662 10662:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700446884b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1549|26,0,@10663 72,0,1 78,0,1 10663:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b06884b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f46884b28948048060ffbfc30000000054000000|@10655,7,@1548|26,0,@10664 68,0,@10665 10664:D3,48|3b650c7303ff5524b9050000008b1c24890c24ff720489d98b58048b1089d051e9efebffff909090000000002c000000|@10638,2097151,@1546|9,0,2 33,1,@10620 10665:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994f2ffff0000000020000000|@10644,2097151,@1547|18,0,@10640 24,1,@10641 10666:O1|@10667 10667:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701806984b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1557|29,0,@10668 10668:O1|@10669 10669:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700546a84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1556|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10670 10670:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700c46a84b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1555|26,0,@10671 72,0,1 78,0,1 10671:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700306b84b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700746b84b28948048060ffbfc30000000054000000|@10655,7,@1554|26,0,@10672 68,0,@10673 10672:D3,48|3b650c7303ff5524b9050000008b1c24890c24ff720489d98b58048b1089d051e96fe9ffff909090000000002c000000|@10638,2097151,@1552|9,0,2 33,1,@10620 10673:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e914f0ffff0000000020000000|@10644,2097151,@1553|18,0,@10640 24,1,@10641 10674:O1|@10675 10675:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701006c84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1563|29,0,@10676 10676:O1|@10677 10677:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d46c84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1562|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10678 10678:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700446d84b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1561|26,0,@10679 72,0,1 78,0,1 10679:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b06d84b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f46d84b28948048060ffbfc30000000054000000|@10655,7,@1560|26,0,@10680 68,0,@10681 10680:D3,48|3b650c7303ff5524b9130000008b1c24890c24ff720489d98b58048b1089d051e9efe6ffff909090000000002c000000|@10638,2097151,@1558|9,0,9 33,1,@10620 10681:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994edffff0000000020000000|@10644,2097151,@1559|18,0,@10640 24,1,@10641 10682:O1|@10683 10683:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701806e84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1569|29,0,@10684 10684:O1|@10685 10685:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700546f84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1568|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10686 10686:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700c46f84b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1567|26,0,@10687 72,0,1 78,0,1 10687:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700307084b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700747084b28948048060ffbfc30000000054000000|@10655,7,@1566|26,0,@10688 68,0,@10689 10688:D3,48|3b650c7303ff5524b9030000008b1c24890c24ff720489d98b58048b1089d051e96fe4ffff909090000000002c000000|@10638,2097151,@1564|9,0,1 33,1,@10620 10689:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e914ebffff0000000020000000|@10644,2097151,@1565|18,0,@10640 24,1,@10641 10690:O1|@10691 10691:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701007184b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1575|29,0,@10692 10692:O1|@10693 10693:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d47184b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1574|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10694 10694:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700447284b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1573|26,0,@10695 72,0,1 78,0,1 10695:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b07284b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f47284b28948048060ffbfc30000000054000000|@10655,7,@1572|26,0,@10696 68,0,@10697 10696:D3,48|3b650c7303ff5524b9110000008b1c24890c24ff720489d98b58048b1089d051e9efe1ffff909090000000002c000000|@10638,2097151,@1570|9,0,8 33,1,@10620 10697:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994e8ffff0000000020000000|@10644,2097151,@1571|18,0,@10640 24,1,@10641 10698:O1|@10699 10699:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701807384b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1581|29,0,@10700 10700:O1|@10701 10701:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700547484b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1580|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10702 10702:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700c47484b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1579|26,0,@10703 72,0,1 78,0,1 10703:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700307584b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700747584b28948048060ffbfc30000000054000000|@10655,7,@1578|26,0,@10704 68,0,@10705 10704:D3,48|3b650c7303ff5524b9010000008b1c24890c24ff720489d98b58048b1089d051e96fdfffff909090000000002c000000|@10638,2097151,@1576|9,0,0 33,1,@10620 10705:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e914e6ffff0000000020000000|@10644,2097151,@1577|18,0,@10640 24,1,@10641 10706:O1|@10707 10707:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701007684b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1587|29,0,@10708 10708:O1|@10709 10709:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d47684b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1586|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10710 10710:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700447784b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1585|26,0,@10711 72,0,1 78,0,1 10711:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b07784b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f47784b28948048060ffbfc30000000054000000|@10655,7,@1584|26,0,@10712 68,0,@10713 10712:D3,48|3b650c7303ff5524b90f0000008b1c24890c24ff720489d98b58048b1089d051e9efdcffff909090000000002c000000|@10638,2097151,@1582|9,0,7 33,1,@10620 10713:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994e3ffff0000000020000000|@10644,2097151,@1583|18,0,@10640 24,1,@10641 10714:O1|@10715 10715:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701807884b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1593|29,0,@10716 10716:O1|@10717 10717:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700547984b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1592|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10718 10718:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700c47984b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1591|26,0,@10719 72,0,1 78,0,1 10719:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700307a84b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700747a84b28948048060ffbfc30000000054000000|@10655,7,@1590|26,0,@10720 68,0,@10721 10720:D3,48|3b650c7303ff5524b90f0000008b1c24890c24ff720489d98b58048b1089d051e96fdaffff909090000000002c000000|@10638,2097151,@1588|9,0,7 33,1,@10620 10721:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e914e1ffff0000000020000000|@10644,2097151,@1589|18,0,@10640 24,1,@10641 10722:O1|@10723 10723:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701007b84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1599|29,0,@10724 10724:O1|@10725 10725:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d47b84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1598|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10726 10726:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700447c84b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1597|26,0,@10727 72,0,1 78,0,1 10727:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b07c84b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f47c84b28948048060ffbfc30000000054000000|@10655,7,@1596|26,0,@10728 68,0,@10729 10728:D3,48|3b650c7303ff5524b9010000008b1c24890c24ff720489d98b58048b1089d051e9efd7ffff909090000000002c000000|@10638,2097151,@1594|9,0,0 33,1,@10620 10729:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994deffff0000000020000000|@10644,2097151,@1595|18,0,@10640 24,1,@10641 10730:O1|@10731 10731:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701807d84b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1605|29,0,@10732 10732:O1|@10733 10733:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700547e84b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1604|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10734 10734:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700c47e84b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1603|26,0,@10735 72,0,1 78,0,1 10735:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700307f84b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700747f84b28948048060ffbfc30000000054000000|@10655,7,@1602|26,0,@10736 68,0,@10737 10736:D3,48|3b650c7303ff5524b9110000008b1c24890c24ff720489d98b58048b1089d051e96fd5ffff909090000000002c000000|@10638,2097151,@1600|9,0,8 33,1,@10620 10737:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e914dcffff0000000020000000|@10644,2097151,@1601|18,0,@10640 24,1,@10641 10738:O1|@10739 10739:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701008084b28d410cc740fc010000008908c390900000000034000000|@10428,3,@1611|29,0,@10740 10740:O1|@10741 10741:D3,184|8b45008d40b43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d5a08c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc05000000894f1089470c895708897704891f8d4718c740fc02000000c700d48084b28978048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc020000008978048908c390909000000000b4000000|@10657,63,@1610|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 130,0,@10742 10742:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700448184b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400403000000c70003000000c3900000000058000000|@10656,7,@1609|26,0,@10743 72,0,1 78,0,1 10743:D3,88|8b45008d40f43b45087303ff5520894500c740fc02000000c700b08184b28b52048950048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f48184b28948048060ffbfc30000000054000000|@10655,7,@1608|26,0,@10744 68,0,@10745 10744:D3,48|3b650c7303ff5524b9030000008b1c24890c24ff720489d98b58048b1089d051e9efd2ffff909090000000002c000000|@10638,2097151,@1606|9,0,1 33,1,@10620 10745:D3,36|3b650c7303ff55248b52048b0c24891424bb985b84b251e994d9ffff0000000020000000|@10644,2097151,@1607|18,0,@10640 24,1,@10641 10746:O3|3,1,0 10747:O1|@10748 10748:D3,72|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701a08284b28b45008d40f83b45087303ff5520894500c740fc010000008908c390900000000044000000|@10759,3,@1615|31,0,@10749 10749:O1|@10750 10750:D3,28|3b650c7303ff5524bb05000000e91e00000090900000000018000000|@10758,63,@1614|9,0,2 14,1,@10751 10751:D3,208|8b45008d40d83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000568b75008d76d43b75087303ff5520897500c746fc05000000894e1089460c895608897e048b042489068d4e18c741fc04000000c701bc8384b289590489710889410c8061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000897004890883c404c3909000000000cc000000|@10757,63,@1613|26,0,0 42,0,67108860 58,0,0 74,0,0 90,0,0 148,0,@10752 10752:D3,540|3b650c7303ff5524a801740d89c1b8ec8584b28b5d0490ff138b08833905756b83780401756a8b5a0c8b1bf6c301740583c3027105ff5538ebf68b720c891e8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c010000008b7a08897b088b4204894304c70317000000538b59088b41049090e84a6bffff8b4d008d49dc3b4d08730feb0ae967000000e962000000ff5520894d00c741fc02000000894104c7017b0000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70001000000c3833901756c83780401756b8b5a0c8b1bf6c301740583c3027105ff5538ebf68b720c891e8b5d008d5bd83b5d087303ff5520895d00c743fc04000000c7430c010000008b7a08897b088b4204894304c703170000008d7314c746fc040000008b410889460cc74608030000008b4104eb0ae959000000e954000000894604c706790000008b45008d40d83b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc0200000089410489198d410cc740fc03000000894808c7400401000000c70001000000c3833907750683780401740cb8ec8584b28b5d049090ff138b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000895004c70005000000c30000000018020000|@10756,2097151,@1612|15,0,@10753 90,0,0 108,0,11 122,1,@10329 167,0,61 184,0,0 236,0,0 242,0,0 310,0,0 328,0,11 351,0,1 375,0,60 406,0,0 443,0,0 449,0,0 466,0,@10753 504,0,0 511,0,207 518,0,0 527,0,2 10753:O4|@4608,@5398,@10755,@10754 10754:O5|@9182,1810,0,1810,0 10755:S17|6c656e67746854657374416374696f6e73 10756:S41|5838364c4f574c4556454c28292e6c656e6774685465737428322974657374416374696f6e73283129 10757:S27|5838364c4f574c4556454c28292e6c656e67746854657374283229 10758:S30|5838364c4f574c4556454c28292e6c656e67746854657374283129283129 10759:S21|5838364c4f574c4556454c28292e4c6f6e67283129 10760:O1|@10761 10761:D3,72|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701388784b28b45008d40f83b45087303ff5520894500c740fc010000008908c390900000000044000000|@10764,3,@1617|31,0,@10762 10762:O1|@10763 10763:D3,28|3b650c7303ff5524bb13000000e986fbffff90900000000018000000|@10758,63,@1616|9,0,9 14,1,@10751 10764:S22|5838364c4f574c4556454c28292e53686f7274283129 10765:O1|@10766 10766:D3,52|833807751e8b48048b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000030000000|@10767,3,@1618|36,0,0 10767:S39|47454e45524154455f434f444528292e636f646567656e28392967656e54657374283229283129 10768:O1|@10769 10769:D3,16|b801000000c39090000000000c000000|@10365,1,@1619|1,0,0 10770:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1620| 10771:S36|47454e45524154455f434f444528292e636f646567656e28392967656e54657374283229 10772:D3,17956|8d7c24a03b7d0c7303ff552883381575718b48048b75008d76f83b75087303ff5520897500c746fc0100000089068b7c24448b44244c528b542440538b5c2440ff711c8b4c244c568b74240cff76048b742448568b742448568b742448568b742448568b742448568b742448568b742448568b742448568b742448568b742448eb05e9c0000000568b742448568b742448568b742448568b74244089b4249400000089bc24900000008984248c00000089942488000000899c2484000000898c24800000008b4424348944247c8b442430894424788b44242c894424748b442428894424708b4424248944246c8b442420894424688b44241c894424648b442418894424608b4424148944245c8b442410894424588b44240c894424548b442408894424508b4424048944244c5883c4348b4c2410894424108b5c24045883c40c51e9f144000083380d754c8b48048339077407be01000000eb05be0300000083390575708b7904f7c701000000740783ff017d08eb2bf647ff1075258b7c243c8b3ff7c7010000007412f6410401740c3b79047f1beb0ae94f030000ff5538ebef89c7b8f0ea7ab28b5d04909090ff138b4904f6c101740583c1027105ff5538ebf68b7c243c8b4c4ffe8b7c243852535056eb05e987000000ff70085189cb8b47089090e8fa4ffbff83f801755a50bb030000008b442404bafc317ab2909090e85ea7f5ff89c3b8e07e80b2e8c280f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b008338037407b801000000eb05b80300000083f002eb1089c1b80300000052535156ff71086a01837c2408017464837c2404017562837c24480174608b4c245089c78b5c24448b41089090e84a4ffbffa801746b5750bb030000008b44244cbafc317ab2909090e8aea6f5ff89c3b8f0ff7fb2e81280f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb0fe9c5000000e9c0000000e9bb000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d04ff138b4804f6c101740583c1027105ff5538ebf6f6c101740783f9017f1beb06f641ff107413576a038b5c244c8b44245890e82e6dfbffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b4c245057528b5c244c8b4108909090e83a13fbffb8010000008b4c24508b0983f901740889cb90e8427e00008b4c24508901eb0150837c240c017407b801000000eb1e8b45008d40f83b45087303ff5520894500c740fc010000008b4c241089088b4c24608b5424688b5c24588b7424548b7c245c508b44241cff70048b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442458508b442450898424a4000000898c24a00000008994249c000000899c249800000089b4249400000089bc24900000008b4424348984248c0000008b442430898424880000008b44242c898424840000008b442428898424800000008b4424248944247c8b442420894424788b44241c894424748b442418894424708b4424148944246c8b442410894424688b44240c894424648b442408894424608b4424048944245c5883c4348b4c2420894424208b5c24045883c41c51e94c410000833807756989d689c789d89090e83a7d0000f6470401740d89c1b8ecd57ab28b5d0490ff1356535750ff77048b1c24b8cd000000ff1508cd520883f801746d813c2448c3520875698b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244ceb05e9943f0000578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244ceb0ae9243e0000e9c400000089842494000000578b7c244089bc24940000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8580b85b283c40c51e996810000813c2428bc520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8d81685b283c40c51e967800000813c2468bc520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8f41b85b283c40c51e9387f0000813c2448cd520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8042185b283c40c51e9097e0000813c2428d6520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8f42985b283c40c51e9da7c0000813c2428cd520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8ac3485b283c40c51e9ab7b0000813c2488c7520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8683985b283c40c51e97c7a0000813c24a8c7520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8085285b283c40c51e94d790000813c24c8c7520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b84c5385b283c40c51e91e780000813c2428c8520875708b45008d40f43b45087303ff5520894500c740fc020000008b4c2404894804c70020f483b28b4c24588b5424608b5c24508b74244c8b7c2454508b442414ff70048b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b44245050eb05e9d70000008b442450508b442450508b442450508b442450898c2498000000508b442444898424980000008b44244889842494000000898c24900000008994248c000000899c248800000089b4248400000089bc24800000008b4424348944247c8b442430894424788b44242c894424748b442428894424708b4424248944246c8b442420894424688b44241c894424648b442418894424608b4424148944245c8b442410894424588b44240c894424548b4424088b4c2450894424508b4424048944244c5883c434894424105bb8f06b85b283c40c51e9c9760000813c2488d5520875708b44240490e822d300008b4c24588b5424608b5c24508b74244c8b7c2454508b442414ff70048b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450898c249800000050eb05e9bc0000008b442444898424980000008b44244889842494000000898c24900000008994248c000000899c248800000089b4248400000089bc24800000008b4424348944247c8b442430894424788b44242c894424748b442428894424708b4424248944246c8b442420894424688b44241c894424648b442418894424608b4424148944245c8b442410894424588b44240c894424548b4424088b4c2450894424508b4424048944244c5883c434894424105bb8906d85b283c40c51e98f750000813c2488d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8a06e85b283c40c51e960740000813c24a8d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8886f85b283c40c51e931730000813c24c8d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8707085b283c40c51e902720000813c24e8d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b84c7185b283c40c51e9d3700000813c2448d5520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8388785b283c40c51e9a46f0000813c24c8d2520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8e48a85b283c40c51e9756e0000813c24c8d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8988e85b283c40c51e9466d0000813c2408d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8748f85b283c40c51e9176c0000813c2428d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8549c85b283c40c51e9e86a0000813c2448d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b83c9d85b283c40c51e9b9690000813c2468d8520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8249e85b283c40c51e98a680000813c2408d9520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8cca985b283c40c51e95b670000813c24c8d9520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8b0b085b283c40c51e92c660000813c24e8d9520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b840c485b283c40c51e9fd640000813c2408c3520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8d0c885b283c40c51e9ce630000813c2428c3520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8eccd85b283c40c51e99f620000813c24a8bb52087547f64424040175458b4424048b08833907754ff6400401754e8b50048b1a833b077556f642040175558b7204837e04017551f64104017450f64104017516b808a87cb28b5d04eb0ae915040000e9f1020000ff13837904037567f64304017466eb0ae9dc020000e9d7020000f64304017522b808a87cb2eb14e9c5020000e9c0020000e9bb020000e9970100008b5d049090ff13817b0481000000756e8b7c24106a016a016a01ff74245cff74245cff74245cff74245cff74245cff74245ceb0ae95e010000e959010000ff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cbb030000008b068b57049090ff1283f801751689c1b8b4af81b2eb05e9140100008b5d04909090ff138b188b44244c9090e89600fdff8b4c24488b0983f90175058b4804eb108b3089cb8b4004e86623010089c1eb028b308b44244889086a016a0156ff742464ff74245c8d4c240c51ff742448ff742448bb81000000b803000000909090e80a05fdff8b4424548b0083f80175068b442408eb0b89c38b442408e86a2301008b4c245489016a01ff74245c8b5c24088b44240c909090e84ac2fcff8b4c245483c4048b0983f901740a89cb909090e88e2301008b4c245089018b0983f9017507b800ba81b2eb0c89cbb800ba81b2e8c62301008b4c24508901837c246003750bb80100000083c41cc24c008b45008d40f83b45087303ff5520894500c740fc010000008b1424891083c41cc24c008b7c24588b4c24608b4424508b5c244c8b5424548b742410ff76048b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c568b74244c89bc2494000000568b74244089b424940000008b74244489b4249000000089bc248c000000898c248800000089842484000000899c24800000008954247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b82cd485b283c40c51e9545f00008b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc24940000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b82cd485b283c40c51e9355e0000813c2428da520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b89ce685b283c40c51e9065d0000813c2408da520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8f0e685b283c40c51e9d75b0000813c2428c0520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b85cf385b283c40c51e9a85a0000813c24e8c9520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8dcf385b283c40c51e979590000813c2408ca520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b81cfa85b283c40c51e94a580000813c2428ca520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b814fc85b283c40c51e91b570000813c2448ca520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b80cfe85b283c40c51e9ec550000813c2468ca520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8040086b283c40c51e9bd540000813c2488ca520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8940586b283c40c51e98e530000813c2428cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8880786b283c40c51e95f520000813c2408cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8d40e86b283c40c51e930510000813c2448cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8000f86b283c40c51e901500000813c2468cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8f41086b283c40c51e9d24e0000813c2488cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8e81286b283c40c51e9a34d0000813c24a8cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8dc1486b283c40c51e9744c0000813c24c8cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8b01786b283c40c51e9454b0000813c24e8cb520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8dc1786b283c40c51e9164a0000813c2408d3520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8081886b283c40c51e9e7480000813c24a8d2520875708b4424588b4c24608b5424508b5c244c8b7424548b7c2410ff77048b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c578b7c244c89842494000000578b7c244089bc2494000000eb05e9b10000008b7c244489bc24900000008984248c000000898c248800000089942484000000899c24800000008974247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088b4c244c8944244c8b442404894424485883c4348944240c8b5c2404b8d42286b283c40c51e9b8470000837c245c01744a813c24a8d952087446813c2468d55208744d813c2468c852087452813c2428d752087452813c2448d752087457813c2468d752087457813c2488d75208745c813c2428d952087458eb0ae9f5010000e9b3000000813c2448d95208745ceb05e9a3000000813c2468d95208eb05e9950000007457eb05e98c000000813c2488d95208eb05e97e0000007457eb05e975000000813c2488c95208eb0ae967000000e9620000007454813c24a8c952087450813c2408c95208eb05e9490000007447813c2428c95208743eeb05e937000000813c2448c95208742e813c2468c95208eb05e920000000741e813c2468c752087415813c2488cd5208eb0ae907000000e90200000075718b45008d40ec3b45087303ff5520894500c740fc040000008b4c246089480c8b5424088950088b54240c895004c7000b0000008b5424108b5c24588b7424548b7c24508b4c244c508b44244c508b44244c508b44244c508b44244c508b44244c508b44244c508b44244c508b44244ceb05e9c7000000508b44244c508b44244c508b44244c508b44244c508b44244c50b820f483b289842498000000899c249400000089b42490000000b8010000008984248c00000089bc2488000000898c24840000008b442430898424800000008b44242c8944247c8b442428894424788b442424894424748b442420894424708b44241c8944246c8b442418894424688b442414894424648b442410894424608b44240c8944245c8b442408894424588b442404894424545883c4308944241cbb2c8284b2588b520883c414ff228b45008d40f83b45087303ff5520894500c740fc010000008b4c240889088b4c24588b5424608b5c24508b74244c8b7c2454508b442414ff70048b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b4424488984249c000000898c249800000089942494000000899c249000000089b4248c00000089bc24880000008b442434898424840000008b442430898424800000008b44242c8944247c8b442428894424788b442424894424748b442420894424708b44241c8944246c8b442418894424688b442414894424648b442410894424608b44240c8944245c8b442408894424588b442404894424545883c4348b4c241889442418bb030000005883c41451e9770200008b45008d40f83b45087303ff5520894500c740fc010000008b4c240889088b4c24588b5424608b5c24508b74244c8b7c2454508b442414ff70048b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b4424488984249c000000898c249800000089942494000000899c249000000089b4248c00000089bc24880000008b442434898424840000008b442430898424800000008b44242c8944247c8b442428894424788b442424894424748b442420894424708b44241c8944246c8b442418894424688b442414894424648b442410894424608b44240c8944245c8b442408894424588b442404894424545883c4348b4c241889442418bb030000005883c41451e9450100008b4d008d49f83b4d087303ff5520894d00c741fc0100000089018b4424448b74244c8b7c243c528b54243c538b5c2448518b4c2408ff71048b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c2444518b4c243c898c24900000008984248c00000089b4248800000089bc248400000089942480000000895c247c8b442434894424788b442430894424748b44242c894424708b4424288944246c8b442424894424688b442420894424648b44241c894424608b4424188944245c8b442414894424588b442410894424548b44240c894424508b4424088944244c8b442404894424485883c4348b4c240c8944240cbb030000005883c40851e91e00000090900000000020460000|@11827,2097151,@2141|323,1,@10773 341,0,0 348,0,1 421,0,@6373 486,1,@8978 497,0,1 506,0,@5052 514,1,@5053 521,0,@9153 526,1,@4940 557,0,@9154 567,0,@5398 573,0,@4608 593,0,0 600,0,1 612,0,1 662,1,@8978 673,0,1 682,0,@5052 690,1,@5053 697,0,@9019 702,1,@4940 750,0,@9020 760,0,@5398 766,0,@4608 826,1,@9015 898,1,@8774 903,0,0 922,1,@10872 943,0,0 1256,1,@10773 1274,1,@10873 1287,0,@6321 1308,0,102 1314,0,I150 1326,0,I72 1625,0,@10874 1634,1,@10897 1641,0,I15 1928,0,@10905 1937,1,@10897 1944,0,I17 2231,0,@10924 2240,1,@10897 2247,0,I152 2534,0,@10943 2543,1,@10897 2550,0,I223 2837,0,@10968 2846,1,@10897 2853,0,I151 3140,0,@10995 3149,1,@10897 3156,0,I106 3443,0,@11014 3452,1,@10897 3459,0,I107 3746,0,@11060 3755,1,@10897 3762,0,I108 4049,0,@11066 4058,1,@10897 4065,0,I111 4104,0,@10350 4390,0,@11119 4399,1,@10897 4406,0,I218 4418,1,@11124 4704,0,@11126 4713,1,@10897 4720,0,I242 5007,0,@11134 5016,1,@10897 5023,0,I243 5310,0,@11140 5319,1,@10897 5326,0,I244 5613,0,@11146 5622,1,@10897 5629,0,I245 5916,0,@11151 5925,1,@10897 5932,0,I216 6219,0,@11210 6228,1,@10897 6235,0,I196 6522,0,@11223 6531,1,@10897 6538,0,I244 6825,0,@11236 6834,1,@10897 6841,0,I238 7128,0,@11241 7137,1,@10897 7144,0,I239 7431,0,@11301 7440,1,@10897 7447,0,I240 7734,0,@11307 7743,1,@10897 7750,0,I241 8037,0,@11313 8046,1,@10897 8053,0,I246 8340,0,@11363 8349,1,@10897 8356,0,I252 8643,0,@11393 8652,1,@10897 8659,0,I253 8946,0,@11430 8955,1,@10897 8962,0,I70 9249,0,@11443 9258,1,@10897 9265,0,I71 9552,0,@11462 9561,1,@10897 9568,0,I11 9636,0,@7422 9688,0,@7422 9724,0,64 9813,0,1 9834,0,@9693 9862,1,@9695 9890,1,@11478 9933,0,64 9938,0,1 9946,1,@9701 9974,1,@11479 10002,1,@9586 10026,1,@11480 10044,0,@9708 10053,0,@9708 10058,1,@11481 10076,0,0 10395,0,@11482 10404,1,@10897 10682,0,@11482 10691,1,@10897 10698,0,I255 10985,0,@11550 10994,1,@10897 11001,0,I254 11288,0,@11552 11297,1,@10897 11304,0,I47 11591,0,@11589 11600,1,@10897 11607,0,I125 11894,0,@11593 11903,1,@10897 11910,0,I126 12197,0,@11614 12206,1,@10897 12213,0,I127 12500,0,@11624 12509,1,@10897 12516,0,I128 12803,0,@11634 12812,1,@10897 12819,0,I129 13106,0,@11644 13115,1,@10897 13122,0,I130 13409,0,@11667 13418,1,@10897 13425,0,I135 13712,0,@11677 13721,1,@10897 13728,0,I134 14015,0,@11700 14024,1,@10897 14031,0,I136 14318,0,@11702 14327,1,@10897 14334,0,I137 14621,0,@11712 14630,1,@10897 14637,0,I138 14924,0,@11722 14933,1,@10897 14940,0,I139 15227,0,@11732 15236,1,@10897 15243,0,I140 15530,0,@11745 15539,1,@10897 15546,0,I141 15833,0,@11747 15842,1,@10897 15849,0,I198 16136,0,@11749 16145,1,@10897 16152,0,I195 16439,0,@11789 16448,1,@10897 16462,0,I251 16471,0,I217 16480,0,I113 16489,0,I231 16498,0,I232 16507,0,I233 16516,0,I234 16525,0,I247 16546,0,I248 16562,0,I249 16585,0,I250 16608,0,I122 16629,0,I123 16638,0,I118 16654,0,I119 16670,0,I120 16679,0,I121 16695,0,I105 16704,0,I154 16769,0,5 16867,0,@10350 16893,0,0 17026,0,@10746 17331,0,1 17341,1,@10773 17637,0,1 17647,1,@10773 17932,0,1 17942,1,@10773 10773:D3,4136|8d7c24903b7d0c7303ff552889c68b442450909090e82210000089f75368a43180b2bbc83180b29090e8ba62fbff89c389d8909090e876100000909090e8da100000837c2450037407b901000000eb05b90300000083f102837c244c017407ba01000000eb05ba0300000083f20283fa017407baf0a47ab2eb05bad8707ab2f644244001754b8b742440833c240174463b167447833a01751b528b16833a0175108b14248b36518b4a043b4e047444eb5251eb54833a037534528b16833a0375298b1424518b0e8b72043b7104755ceb0fe99f000000e98e000000e9110000008b72083b7108755feb0951eb5f5251eb6052518b4c245c535750f6c10175578b01eb0ae955000000e950000000ff7104ff742460ff7424608b58048b0889c89090e86e10000083f801eb05e92d000000740b593b650c7303ff5524ebbdb80100000083c404eb3ae911000000e90c000000e907000000b803000000eb2489c1b801000000535751eb185251535750b801000000eb0c89c6b8010000005251535756f644240401755d8b4c24048b11833a0775628b5d008d5bf43b5d087303ff5520895d00c743fc020000008b3424897304c703dcc27fb2be01000000f6c30175608b0b83390175158b7904f7c701000000740583c7207131ff5538ebf6837908037523eb05e9810000008b7904f7c701000000eb05e971000000740583c7107108ff5538ebf68b7904f7c70100000075158b0ff647ff107402f7d98d4c0901eb07e93100000089f9bf0300000083ef0183f93f7605b93f000000d1e9d3e783cf018d4c09010bf78b5b043b650c7303ff5524e965ffffff89f150518b4204909090e8ae1000000b0424eb0a89c1b8ffffff00516a01837c240c01741a8b4c24608b510c8b5a048b1b0bd88b7204891ebb01000000eb05bb01000000837c240c01746d8b4c240c8b11833a077507bbffffffffeb60506a016a016a01ff742474ff742474ff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cff74246cbb0300000089d08b9424a4000000909090ff1283f801eb0ae935010000e92d010000750e89c1b8447080b28b5d049090ff13837c240801746c8b4c24648b3889fb8b41089090e86a08fbff83f801755a5750bb0300000089f8bafc317ab2e8d25ff5ff89c3b8e07e80b2e83639f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae9a1000000e90300000090ff13576a016a018b0883390b75588b5104f6c201740783fa017d3ceb06f642ff1074346a016a016a01689f0100006a018d5c24085389fb8b842488000000e8ae9dfbff8d44240c83c4045989088d44240459894804eb1c89e3893b89e3c7430401000000eb0d89e2893a89e2c74204010000008b4424648b0083f80175068b442404eb0b89c38b442404e8221000008b4c246489015b83c408eb0d8b18eb0950eb06bbffffffff5053ff742460ff742470ff742470ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff74244c8b5c245c8b8424bc0000009090e80a100000837c240c017473b901000000f6c101740df64424500174062b4c24507105ff5538ebf583c10151ff74246cff7424648b5c2424e8f21300006a016a016a016a0150ff742428ff742470ffb42484000000ff74247cff742478ff7424288d5c241cb8010000009090e8421700008b44242c909090e8761d0000eb05e96c050000b901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c8a801750af6442464017503ff55383b4424647507b901000000eb6f6a016a016a0150689f0100006a018d4c240c518b5c247c8b842498000000e80e9cfbff8b8424800000008b0083f80175068b44240ceb0c89c38b44240c90e8561d00008b8c248000000089018b84248c0000008b5c24088b500889d09090e8e205fbffa801745f50bb03000000eb05e9180100008b44240cbafc317ab290e8425df5ff89c3b8f0ff7fb2e8a636f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff1074176a038b5c240c8b842490000000909090e8ce23fbffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b8c248c000000528b5c240c8b410890e8dac9faffb8010000008b8c24800000008b0983f901740989cb9090e88e1c00008b8c248000000089018b4d008d49f83b4d087303ff5520894d00c741fc010000008b4424048901eb076a016a016a01508b442474a801740bf604240174052b04247105ff5538ebf683c001f6c1017507ba01000000eb05ba0300000083f20283f2028b9c248c00000083c4108b732c8b36a801740ff7c60100000074078d40ff03c67105ff5538ebf4a8017409f6c20174042bc27105ff5538ebf783c00183f8017507b801000000eb51a801740783f8017c08eb12f640ff10740c89c2b8fc9780b28b5d04ff138b55008d52e83b55087303ff5520895500c742fc02000000894204c702610000008d420cc740fc02000000c740040100000089108b5424708b1283fa01740c89ce89d390e8d61b000089f18b5424708902f6c101755f8b45008d40f43b45087303ff5520894500c740fc020000008b09894804c7005b0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b1283fa01740e89d389c8909090e8ca1b000089c18b44247089088b44245cc70003000000f644240401752f8b4c2404ff74247c8b5c240c8b01e8f61b00008b4c24708b0983f901740989cb9090e8fe1f00008b4c24708901eb288b4c24708b0983f9017507b9ccf784b2eb1089cbb8ccf784b29090e84620000089c18b44247089088b442410a80175628b4c247c8b510cff7004ff30ff7124ff7204ff72088b1a8b44240ce85a19fbff833c24017428508b442408e8e2e8faff89c3b8944b81b2e8aa33f5ff6a0189c38b842490000000e8b6cafaffeb01508b8424800000008b0083f801750a8b0424eb12e92700000089c38b0424909090e81a2000008b8c248000000083c40c8901583b650c7303ff5524e96effffff837c240c0175058b0424eb0e8b5c240c8b04249090e83e200000a801756d8b4c247c8b7804ff308b1c248b4108e83602fbffa801745a5750bb030000008b442408bafc317ab2909090e89a59f5ff89c3b8f0ff7fb2e8fe32f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b2eb0ae92e040000e90800000089c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff107417576a038b5c24088b8424880000009090e81a20fbffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b8c248000000057528b5c24088b4108e826c6faffb8010000008b4c24788b0983f901740889cb90e87a1f00008b4c247889015883c4043b650c7303ff5524e9cdfeffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b1424891150ff74240889cb8b44247090e88a1f00008b4c24608b0983f90175058b4804eb108b3089cb8b4004e82a24000089c1eb028b308b44246089086a016a0156ff74247850ff7424308d5c24108b44241890e85a2400006a016a016a016a01ff742434ff74247cffb42490000000ffb42488000000ffb42484000000ff7424348d5c2418b80100000090e8161100008b442414a801740783f8017c19eb06f640ff10751189c38b84248800000090e83a73fcffeb05b8010000008b4c2468c70103000000f6042401751b8b142450ffb4248c0000008b5c240c8b02909090e85a280000eb0889c2b8f80685b252833c240174088b1c24e86e2c00008b8c248000000083c40c8b0983f901740789cbe8ae2c00008b4c24748901837c24040175068b442408eb0d8b5c24048b442408e8e62c0000a80175668b8c24800000008b510cff7004ff30ff7124ff7204ff72088b1a8b44240c90e82616fbff833c24017428508b442408e8aee5faff89c3b8944b81b2e87630f5ff6a0189c38b842494000000e882c7faffeb01508b8424840000008b0083f801750a8b0424eb12e92700000089c38b0424909090e8c22c00008b8c248400000083c40c8901583b650c7303ff5524e96affffff837c24100175058b0424eb0e8b5c24108b04249090e8e62c0000a801756b8b8c24800000008b7804ff308b1c248b410890e8fefefaffa80174635750bb030000008b442408bafc317ab2909090e86256f5ff89c3b8f0ff7fb2e8c62ff5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2eb05e9bf000000c7014ce239b289c88b5d049090ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f1feb06f641ff107417576a038b5c24088b84248c0000009090e8e61cfbffeb4b8b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7008897208894a048b08890a8b8c248400000057528b5c24088b4108e8f2c2faffb8010000008b4c247c8b0983f901740889cb90e8222c00008b4c247c89015883c4043b650c7303ff5524e9cdfeffff68200985b28b5c24208b842484000000e8f218fbff8b4c247483c4188b0983f901740a89cb909090e8622c00008b4c245c89016a016a016a016a016a018b44242c83c420a801756883380174688b088b54245c8b5a0cff7004ff31ff7224ff7304ff73088b3389f38b44240ce8fa13fbff833c24017428508b442408e882e3faff89c3b8944b81b2e84a2ef5ff6a0189c38b442470909090e856c5faffeb01508b4424608b0083f801750f8b0424eb15e92c000000e91600000089c38b042490e8222c00008b4c246083c40c8901eb03ff7004583b650c7303ff5524e963ffffff833c240174178b44245c8b4810c701030000008b10c70203000000eb588b44240ca8017550833801753d8b4c245c8b512c8b12f6c201740583ea027105ff5538ebf68b592c8913837924017415ff70046a01bbfc0985b289c89090e8b2c4faffeb08ff7004eb03ff7004583b650c7303ff5524ebac837c241001750bb80100000083c41cc250008b44245c8b480cff7104ff71088b198b44241c90e8f639fbff8b4c24508b0983f901740989cb9090e8ba2b00008b4c245089018b45008d40d83b45087303ff5520894500c740fc03000000c74008010000008b542414895004c700090000008b54245c8b5a1c8b1b8d7010c746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890653ff7224ff721c568b420890e8bac0faff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bb5c3080b28b44246890e8bec3faff8b45008d40f83b45087303ff5520894500c740fc0100000083c40459890883c41cc2500090900000000024100000|@10871,2097151,@1666|22,1,@10774 30,0,@9115 35,0,@9118 42,1,@9120 54,1,@10775 62,1,@10776 74,0,0 81,0,1 96,0,0 103,0,1 116,0,@5643 123,0,@5279 290,1,@10777 318,0,0 343,0,1 352,0,0 367,0,0 376,0,0 435,0,@8794 440,0,0 553,0,1 566,0,31 610,1,@10779 622,0,8388607 656,0,0 663,0,0 686,0,-1 760,0,1 798,0,@9149 830,1,@8978 842,0,1 849,0,@5052 854,1,@5053 861,0,@9153 866,1,@4940 897,0,@9154 907,0,@5398 913,0,@4608 977,0,207 998,1,@9152 1031,0,0 1046,0,0 1074,1,@10781 1098,0,-1 1186,1,@10782 1198,0,0 1242,1,@10787 1287,0,0 1294,1,@10794 1306,1,@10800 1318,0,0 1377,0,0 1391,0,207 1414,1,@9152 1446,1,@10801 1478,1,@8978 1488,0,1 1504,0,@5052 1510,1,@5053 1517,0,@9019 1522,1,@4940 1553,0,@9020 1563,0,@5398 1569,0,@4608 1634,1,@9015 1706,1,@8774 1711,0,0 1734,1,@10802 1819,0,0 1826,0,1 1902,0,0 1928,0,@9193 1966,0,48 1983,0,0 2006,1,@10803 2054,0,45 2085,0,0 2106,1,@10804 2124,0,1 2150,1,@10805 2170,1,@10818 2194,0,@10819 2203,0,@10819 2210,1,@10821 2258,1,@9004 2274,1,@8788 2281,0,@9480 2286,1,@4940 2302,1,@8783 2342,1,@10822 2394,1,@10823 2418,1,@8978 2429,0,1 2438,0,@5052 2446,1,@5053 2453,0,@9019 2458,1,@4940 2489,0,@9020 2499,0,@5398 2505,0,@4608 2582,1,@9015 2654,1,@8774 2659,0,0 2678,1,@10824 2750,1,@10825 2778,1,@10834 2818,1,@10835 2868,0,0 2874,1,@10794 2910,1,@9489 2917,0,0 2927,0,1 2958,1,@10844 2967,0,@10857 2982,1,@10859 3006,1,@10860 3038,1,@10861 3078,1,@9004 3094,1,@8788 3101,0,@9480 3106,1,@4940 3122,1,@8783 3162,1,@10862 3214,1,@10863 3242,1,@8978 3253,0,1 3262,0,@5052 3270,1,@5053 3277,0,@9019 3282,1,@4940 3313,0,@9020 3323,0,@5398 3336,0,@4608 3402,1,@9015 3474,1,@8774 3479,0,0 3498,1,@10864 3526,0,@10865 3542,1,@9012 3566,1,@10867 3634,1,@9004 3650,1,@8788 3657,0,@9480 3662,1,@4940 3678,1,@8783 3718,1,@10868 3765,0,1 3773,0,1 3833,0,@10869 3842,1,@8783 3875,0,0 3906,1,@9051 3926,1,@10870 3963,0,0 3976,0,4 4002,0,0 4009,0,0 4016,0,0 4023,0,1 4042,1,@8774 4076,0,@9108 4086,1,@8783 10774:D3,96|3b650c7303ff5524a80175438b08837904017407ba01000000eb05ba0300000083f202528b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@1622|21,0,0 28,0,1 80,0,0 10775:D3,88|3b650c7303ff5524a801753b833801742eff308b4004909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b4004e9b9ffffffb801000000c39090900000000054000000|@5094,3,@1623|72,0,0 10776:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1624|23,0,@6769 84,0,0 10777:D3,288|3b650c7303ff552483381575098b40048b401cc2080083380d756d8b4804833905756a8b5104f6c201740783fa017d08eb21f642ff10751b8b5c24088b1bf6c2017409f6c30174043bd3eb05ff5538ebf77c0ab8f0ea7ab28b5d04ff13f6c201740583c2027105ff5538ebf68b5c24088b5453fe8b74240489d789fb8b46089090e892f9faffeb0ae981000000e97400000083f801755650bb0300000089f8bafc317ab290e8ee50f5ff89c3b8e07e80b2e8522af5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b008338037407b801000000eb05b80300000083f002c20800b803000000c20800b803000000c208009090000000001c010000|@10778,2097151,@1625|84,0,@6373 130,1,@8978 153,0,1 160,0,@5052 166,1,@5053 173,0,@9153 178,1,@4940 209,0,@9154 219,0,@5398 225,0,@4608 245,0,0 252,0,1 263,0,1 271,0,1 10778:S65|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296e6f6e436f6e7461696e6572283229 10779:D3,252|3b650c7303ff552489c3b8cf00000090ff1568cd5208b9e41e83b2ba01000000f6c101753c8b1989c623730483fe01742189d68b55008d52f43b55087303ff5520895500c742fc020000008972048b3389328b590489d93b650c7303ff5524ebbf89d1b801000000f6c10175718b11833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c30175108b33f643ff107402f7de8d743601eb0289de8b510489f1bb0300000083eb0183f93f7605b93f000000d1e9d3e383cb018d4c09010bc3eb05e90f00000089d13b650c7303ff5524e976ffffffc39000000000f8000000|@10780,2097151,@1626|11,0,103 18,0,I153 23,0,@10020 28,0,0 100,0,0 190,0,1 203,0,31 10780:S44|434f444547454e5f5441424c4528292e6765745265676973746572536574466f7246756e6374696f6e283129 10781:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1627| 10782:D3,876|8d7c24ac3b7d0c7303ff552883f801751883fb01740bb8f00a7eb28b5d0490ff13b801000000c24400f6c301740f8b48048b10b8f00a7eb28b5d04ff138b08833b01756bff7304ff70046a016a016a01ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454bb030000008b018b9424940000009090ff1283f801751689c1b8447080b28b5d04eb05e909000000909090ff138b00eb628b138b31833e077507bf01000000eb6c8b3a833f0175158b7704f7c601000000740583c6207123ff5538ebf6837f080375158b7704f7c601000000740583c6107108ff5538ebf68b7704f7c60100000075158b16f646ff107402f7da8d541201eb07e9b300000089f28b3189d1ba0300000083ea0183f93f760ceb05e92a000000b93f000000d1e9d3e283ca018d4c09018b7d008d7ff83b7d087303ff5520897d00c747fc010000008917ff7304ff7004576a016a01ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454bb0300000089f08b942494000000909090ff1283f801750e89c1b828e784b28b5d049090ff138b00837c240c01746a8b4c244489c789fb8b4108e80ef5faff83f801755a5750bb0300000089f8bafc317ab2e8764cf5ff89c3b8e07e80b2e8da25f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae99f000000e90300000090ff13576a016a018b0883390b75588b5104f6c201740783fa017d3ceb06f642ff1074346a016a016a01689f0100006a018d5c24085389fb8b442468909090e8528afbff8d44240c83c4045989088d44240459894804eb1c89e3893b89e3c7430401000000eb0d89e2893a89e2c74204010000008b44244c8b0083f80175068b442404eb0b89c38b442404e8e60000008b4c244c89015883c40850ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff7424508b5c244c8b442448e8c2fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c244000000000068030000|@8211,2097151,@1629|23,0,@8209 34,0,0 52,0,@8209 141,0,1 166,0,@9149 199,0,0 299,0,1 319,0,31 432,0,1 458,0,@10783 490,1,@8978 502,0,1 509,0,@5052 514,1,@5053 521,0,@9153 526,1,@4940 557,0,@9154 567,0,@5398 573,0,@4608 637,0,207 658,1,@9152 691,0,0 706,0,0 734,1,@10786 10783:O4|@4608,@5398,@10785,@10784 10784:O5|@9130,1952,0,1952,0 10785:S17|6c64417267733a204e6f20726573756c74 10786:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1628| 10787:D3,552|3b650c7303ff5524a8017566f6c30174108b48048b10b804ea84b28b5d0490ff13833b0175726a016a01ff7304ff7004ff74241c8d4c240c518b188b4424209090e8f250fcff8b4424148b0083f80175068b44240ceb0b89c38b44240ce82a0200008b4c241489018b44241ca801740ceb05e98e01000083c0027105ff5538ebf650ff74241c518b5c24108b44240c9090e86affffffeb05e92900000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4085983c4048908c20c008b0bff30ff31ff742414ff742414ff7424148b4b0489cb8b400490e81affffff8b0c2483390175128b5104f6c201740583c2207120ff5538ebf68379080375128b5104f6c201740583c2107108ff5538ebf68b5104f6c20175108b1af642ff107402f7db8d5c1b01eb0289d389d9ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09016a016a016a0150526a018d4c240c518b5c24208b44242c90e85a87fbff8b44241c8b0083f80175068b44240ceb0b89c38b44240ce85a0100008b4c241c89018b4424208b500cff7024ff7204ff72088b1a8b44241c909090e8be2efbff833c240174268b44241490e83ad7faff89c3b81c4b81b2e80222f5ff6a0189c38b442428909090e80eb9faff8b45008d40f43b45087303ff5520894500c740fc0200000083c4045983c4048948045983c40c8908c20c0083fb01740bb804ea84b28b5d0490ff13b801000000c20c009090900000000024020000|@10793,2097151,@1632|23,0,@10788 66,1,@9466 94,1,@10791 309,0,1 322,0,31 362,1,@9152 390,1,@10792 426,1,@9051 442,1,@8788 449,0,@9476 454,1,@4940 470,1,@8783 523,0,@10788 534,0,0 10788:O4|@4608,@5398,@10790,@10789 10789:O5|@9130,1986,0,1986,0 10790:S25|6d6f7665417267733a204c656e677468206d69736d61746368 10791:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1630| 10792:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1631| 10793:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296d6f766541726773283329 10794:D3,1056|3b650c7303ff5524837c2418017576837c2414017523c70301000000c7430401000000c7430801000000c7430c01000000b801000000c2180053ff742414ff742414bbdcc27fb28b4424149090e8e20300008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b0424c70001000000c7400401000000eb05e915000000894808c7400c38f184b2b80100000083c404c218008b4424188b08833907756df6410401740db8ecd57ab28b5d04909090ff1353ff71048b1c24b8cd000000909090ff1508cd520883f80174718b45008d40dc3b45087303ff5520894500c740fc020000008b0c24894804c700070000008b4c24188b511c8b128d580cc743fc05000000c7431001000000eb05e9a1020000c7430c01000000c7430801000000c7430403000000890352ff7124ff711c5389d38b410890e8eeb2faffeb05e9710000008b442408a801740583c0027105ff5538ebf6598901833c240174126a01bbf01081b28b4424249090e8eab5faff8b45008d40f83b45087303ff5520894500c740fc0100000083c4045989088b4c24048901c7410403000000c7410801000000c7410c01000000b80100000083c408c218008b04248b008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701070000008b4424188b501c8b128d590cc743fc05000000c7431001000000c7430c01000000c7430801000000c7430403000000890b52ff7024ff701c5389d38b480889c890e80ab2faff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44242490e80eb5faff8b4c2408b8ffffff002341fc8d44000183f80375448b45008d40f83b45087303ff5520894500c740fc010000008b4c240489088b4c240c8901c7410401000000c7410801000000c7410c01000000b80100000083c410c218008b45008d40f83b45087303ff5520894500c740fc010000008b54240489108b55008d52dc3b55087303ff5520895500c742fc02000000894a04c702070000008b4c24208b591c8b1b8d720cc746fc05000000c7461001000000c7460c01000000c7460801000000c746040300000089165053ff7124ff711c568b41089090e802b1faff8b442408a801740583c0027105ff5538ebf6598901833c240174116a01bbf01081b28b44243090e806b4faffff74242cff74242cbbdcc27fb28b44240c9090e8be0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b44241883c4085a8910c7400401000000894808c7400c38f184b2b80100000083c410c2180053ff742414ff742414bbdcc27fb28b4424109090e85e0000008b4d008d49f83b4d087303ff5520894d00c741fc0100000089018b04248908c7400403000000c7400801000000c7400c38f184b2b80100000083c404c21800909090000000001c040000|@10799,2097151,@1635|24,0,0 31,0,0 38,0,0 45,0,0 50,0,0 67,0,@8794 78,1,@10795 109,0,0 120,0,0 127,0,0 144,0,@10798 149,0,0 177,0,@6321 197,0,102 206,0,I150 247,0,3 273,0,0 287,0,0 294,0,0 301,0,1 322,1,@8774 363,0,@9417 374,1,@8783 417,0,1 424,0,0 431,0,0 436,0,0 480,0,3 506,0,0 513,0,0 520,0,0 527,0,1 550,1,@8774 584,0,@9417 594,1,@8783 603,0,8388607 658,0,0 665,0,0 672,0,0 677,0,0 746,0,3 772,0,0 779,0,0 786,0,0 793,0,1 814,1,@8774 848,0,@9417 858,1,@8783 871,0,@8794 882,1,@10795 913,0,0 932,0,0 942,0,@10798 947,0,0 967,0,@8794 978,1,@10795 1016,0,1 1023,0,0 1030,0,@10798 1035,0,0 10795:D3,264|3b650c7303ff5524833b0175128b4b04f6c101740583c1207120ff5538ebf6837b080375128b4b04f6c101740583c1107108ff5538ebf68b4b04f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09016a016a016a0153526a018d4c240c5189c38b442424e88680fbff8b4424148b0083f80175068b44240ceb0b89c38b44240ce8760000008b4c241489018b4424188b500cff7024ff7204ff72088b1a8b44240c909090e8ea27fbff833c240174268b44240490e866d0faff89c3b81c4b81b2e82e1bf5ff6a0189c38b442420909090e83ab2faff83c40c5883c404c208000000000004010000|@10797,2097151,@1634|84,0,1 97,0,31 134,1,@9152 162,1,@10796 198,1,@9051 214,1,@8788 221,0,@9476 226,1,@4940 242,1,@8783 10796:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1633| 10797:S60|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296c6f6164526567283229 10798:O2|@8794,0 10799:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296c6f616450726f63283129 10800:D3,88|3b650c7303ff5524a801753b833801752eff308b4004909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b4004e9b9ffffffb801000000c39090900000000054000000|@5094,3,@1636|72,0,0 10801:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1637| 10802:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1638| 10803:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1639| 10804:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1640| 10805:D3,688|3b650c7303ff55248b4c240489c75389fb8b410890e832e7faff83f80175565750bb0300000089f8bafc317ab2e89a3ef5ff89c3b8e07e80b2e8fe17f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b08833909753c833c24017422817904dcc27fb274268b5104833a017411833a03750c837a04057506837a0801740db81cf684b28b5d04909090ff13b880f684b2eb618339017561833c2401740ab898f684b28b5d04ff138b55008d52dc3b55087303ff5520895500c742fc020000008b5904895a04c702010000008d720cc746fc02000000895604c7063b0000008d460cc740fc02000000c74004010000008930eb71e99a000000833907740ab8f0f684b28b5d04ff13833c240174268b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70203000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702050000008b75008d76e83b7508730aeb05e929000000ff5520897500c746fc02000000895604c7063b0000008d460cc740fc02000000c740040100000089308b4c240883c4046a01575089fb8b410890e87ee5faffa801745750bb0300000089f8bafc317ab29090e8e63cf5ff89c3b8f0ff7fb2e84a16f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b442414e87a03fbffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2410528b5c24088b4108e88aa9faff5883c408c2040090909000000000ac020000|@10817,2097151,@1641|22,1,@8978 34,0,1 41,0,@5052 46,1,@5053 53,0,@9153 58,1,@4940 89,0,@9154 99,0,@5398 105,0,@4608 133,0,@8794 165,0,@10806 178,0,@10809 196,0,@10811 237,0,0 256,0,29 273,0,0 292,0,@10814 339,0,1 377,0,2 417,0,29 434,0,0 458,1,@8978 468,0,1 475,0,@5052 482,1,@5053 489,0,@9019 494,1,@4940 525,0,@9020 535,0,@5398 541,0,@4608 598,1,@9015 666,1,@8774 10806:O4|@4608,@5398,@10808,@10807 10807:O5|@9007,2966,0,2966,0 10808:S47|6a756d70546f436f64653a204e6f7420696e646972656374696f6e207468726f75676820636c6f7375726520726567 10809:O2|@10810,0 10810:O2|29,@5383 10811:O4|@4608,@5398,@10813,@10812 10812:O5|@9007,2959,0,2959,0 10813:S36|6a756d70546f436f64653a20696e6469726563742063616c6c20746f20636f6465526566 10814:O4|@4608,@5398,@10816,@10815 10815:O5|@9007,2969,0,2969,0 10816:S38|6a756d70546f436f64653a204e6f74206120636f6e7374616e74206f72207265676973746572 10817:S29|434f444547454e5f5441424c4528292e6a756d70546f436f6465283329 10818:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1642| 10819:O2|@10820,0 10820:O2|29,@8817 10821:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1643| 10822:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1644| 10823:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1645| 10824:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1646| 10825:D3,160|3b650c7303ff5524535068f8f984b2817c2410ffffff007418817c2410ffffff007407b901000000eb0cb903000000eb05b90300000083f1025053ff701c8d54240c52516a018b5c2428baf80280b29090e87609fbff50ff742404ff74240cff742414bb01000000b801000000e8c201000089c18b45008d40f43b45087303ff5520894500c740fc020000005a83c4188950048908c20400000000009c000000|@10833,2097151,@1649|11,0,@10826 19,0,8388607 29,0,8388607 36,0,0 43,0,1 50,0,1 75,0,@9032 82,1,@9034 100,0,0 105,0,0 110,1,@10831 10826:D3,228|3b650c7303ff55248b4a0489c75289fb8b41089090e892e0faffa801740f89c1b8f0fa84b28b5d04909090ff138b4804f6c101740783f9037e08eb43f641ff10743d8b14248b5a08f6c3017528f7c7010000007508f603017503ff55383b3b7507bb03000000eb128b5b043b650c7303ff5524ebd3bb0100000083fb017509b80300000083c404c3f640100175448b5d008d5be83b5d087303ff5520895d00c743fc05000000c74310010000008b700c89730c8b5008895308894b048b08890b8b0c248b49045389fb8b410890e8b6a4faffb80100000083c404c39000000000e0000000|@10830,2097151,@1647|22,1,@8978 33,0,@10827 98,0,1 118,0,0 128,0,1 169,0,0 206,1,@8774 211,0,0 10827:O4|@4608,@5398,@10829,@10828 10828:O5|@9007,1062,0,1062,0 10829:S26|707573684e6f6e417267756d656e74733a206e6f20656e747279 10830:S45|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e7473283329696e737472732d283129 10831:D3,520|3b650c7303ff55248b4c240c8b09f6c3017409f6c10174043bd9eb05ff5538ebf77d648b4c2408f6c1017525f6c3017508f601017503ff55383b197507b903000000eb128b49043b650c7303ff5524ebd6b90100000083f9017431f6c301740583c3027105ff5538ebf68b4c240c8b5424088b742404894c240c8954240889742404e979ffffffe96f0100008b4c240489c7538b4108909090e88edefaffa80175698b0883390975678378040174668b5424088b5a0c57ff7104ff7224ff7304ff73088b3389f38b44240c9090e8ea1bfbff833c240174268b44240490e866c4faff89c3b81c4b81b2e82e0ff5ff6a0189c38b442418909090e83aa6faff8b7d008d7ff43b7d087314eb0fe9bb000000e924000000e9b1000000ff5520897d00c747fc020000008b44240883c4048947045883c4048907eb6683390575668378040174658b5424088b5a0c57ff7104ff7224ff7304ff73088b3389f38b44240c90e8561bfbff833c240174268b44240490e8d2c3faff89c3b81c4b81b2e89a0ef5ff6a0189c38b442418909090e8a6a5faff8b7d008d7ff43b7d087314eb0fe927000000e922000000e91d000000ff5520897d00c747fc020000008b44240883c4048947045883c404890758a801740583c0027105ff5538ebf68b4c240c8b5424088b5c2404894c240c89542408895c240489c389f8e905feffffc20c0090900000000004020000|@10832,2097151,@1648|62,0,1 82,0,0 154,1,@8978 206,1,@9051 222,1,@8788 229,0,@9476 234,1,@4940 250,1,@8783 354,1,@9051 370,1,@8788 377,0,@9476 382,1,@4940 398,1,@8783 10832:S53|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e747328332967657452656769737465724c697374283229 10833:S35|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e7473283329 10834:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1650| 10835:D3,60|3b650c7303ff55248b4c24048b54240c8b742408894c240c895c2408895424048b1c2489342489dfbbffffffff57e91d000000900000000038000000|@10843,2097151,@1654|41,0,-1 47,1,@10836 10836:D3,660|3b650c7303ff5524a801756cf64424100174128b48048b10b8500185b28b5d04909090ff138b4c24108339017560f6c301740783fb017d11eb06f643ff1074098b5424088b5a2c8b1b89daf6c201740583c2027105ff5538ebf66a016a01ff7104ff700453528d542410528b188b442424e81239fcffeb05e9e60100008b4424188b0083f801750b8b442410eb10e97900000089c38b442410e8560200008b4c2418890158a801740583c0027105ff5538ebf66a016a01ff74240c8d54240452ff7424285189c38b4424189090e82effffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c241089088b4c24245a83c4148911894104b801000000c210008b116a016a01ff30ff32ff71048d74240c56ff742420ff7424208b4004e8d2feffff8b042483380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c09016a016a016a01526a018d4c2408518b5c241c8b4424309090e83270fbff8b44242083c4048b0083f80175068b442404eb0c89c38b44240490e8760100008b4c241c89018b4424208b500cff7024ff7204ff72088b1a8b442414909090e89217fbff833c240174268b44240c90e80ec0faff89c3b81c4b81b2e8d60af5ff6a0189c38b442428909090e8e2a1faff8b45008d40f43b45087303ff5520894500c740fc020000008b4c241883c4048948045983c40c89088b4c24145a83c4048911894104b801000000c21000837c241001740bb8500185b28b5d0490ff138b44240c8918c7400401000000b801000000c2100090900000000090020000|@10842,2097151,@1653|25,0,@10837 114,1,@9465 154,1,@10840 261,0,0 381,0,1 394,0,31 434,1,@9152 466,1,@10841 502,1,@9051 518,1,@8788 525,0,@9476 530,1,@4940 546,1,@8783 604,0,0 619,0,@10837 638,0,0 643,0,0 10837:O4|@4608,@5398,@10839,@10838 10838:O5|@9130,2082,0,2082,0 10839:S23|6c64417267733a204c656e677468206d69736d61746368 10840:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1651| 10841:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1652| 10842:S70|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f7375726528322970757368417267732831296c6441726773283329 10843:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832297075736841726773283129 10844:D3,688|3b650c7303ff55248b4c240489c75389fb8b410890e8a6d7faff83f80175565750bb0300000089f8bafc317ab2e80e2ff5ff89c3b8e07e80b2e87208f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c047f80b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b08833909753c833c24017422817904dcc27fb274268b5104833a017411833a03750c837a04057506837a0801740db8a80585b28b5d04909090ff13b80c0685b2eb618339017561833c2401740ab8240685b28b5d04ff138b55008d52dc3b55087303ff5520895500c742fc020000008b5904895a04c702010000008d720cc746fc02000000895604c706130000008d460cc740fc02000000c74004010000008930eb71e99a000000833907740ab87c0685b28b5d04ff13833c240174268b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c70203000000eb248b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702050000008b75008d76e83b7508730aeb05e929000000ff5520897500c746fc02000000895604c706130000008d460cc740fc02000000c740040100000089308b4c240883c4046a01575089fb8b410890e8f2d5faffa801745750bb0300000089f8bafc317ab29090e85a2df5ff89c3b8f0ff7fb2e8be06f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c100080b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b4804f6c101740583c1fe7105ff5538ebf6f6c101740783f9017f17eb06f641ff10740f6a0389fb8b442414e8eef3faffeb428b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b700c89720c8b7808897a08894a048b08890a8b4c2410528b5c24088b4108e8fe99faff5883c408c2040090909000000000ac020000|@10856,2097151,@1655|22,1,@8978 34,0,1 41,0,@5052 46,1,@5053 53,0,@9153 58,1,@4940 89,0,@9154 99,0,@5398 105,0,@4608 133,0,@8794 165,0,@10845 178,0,@10848 196,0,@10850 237,0,0 256,0,9 273,0,0 292,0,@10853 339,0,1 377,0,2 417,0,9 434,0,0 458,1,@8978 468,0,1 475,0,@5052 482,1,@5053 489,0,@9019 494,1,@4940 525,0,@9020 535,0,@5398 541,0,@4608 598,1,@9015 666,1,@8774 10845:O4|@4608,@5398,@10847,@10846 10846:O5|@9007,2993,0,2993,0 10847:S45|63616c6c436f64653a204e6f7420696e646972656374696f6e207468726f75676820636c6f7375726520726567 10848:O2|@10849,0 10849:O2|9,@5383 10850:O4|@4608,@5398,@10852,@10851 10851:O5|@9007,2986,0,2986,0 10852:S34|63616c6c436f64653a20696e6469726563742063616c6c20746f20636f6465526566 10853:O4|@4608,@5398,@10855,@10854 10854:O5|@9007,2996,0,2996,0 10855:S36|63616c6c436f64653a204e6f74206120636f6e7374616e74206f72207265676973746572 10856:S27|434f444547454e5f5441424c4528292e63616c6c436f6465283329 10857:O2|@10858,0 10858:O2|9,@8817 10859:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1656| 10860:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1657| 10861:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1658| 10862:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1659| 10863:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1660| 10864:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1661| 10865:O1|@10866 10866:D3,16|b803000000c39090000000000c000000|@9160,1,@1662|1,0,1 10867:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1663| 10868:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1664| 10869:S5|6465637370 10870:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1665| 10871:S50|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f73757265283229 10872:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1667| 10873:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@1668|60,0,0 10874:O1|@10875 10875:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701ac0b85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1679|29,0,@10876 10876:O1|@10877 10877:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f80b85b28948048060ffbfc3000000002c000000|@10895,3,@1678|28,0,@10878 10878:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e8ee82fcff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e40c85b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1677|14,1,@10879 24,0,207 34,1,@9637 64,0,@10880 110,0,1 10879:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1669|53,0,0 59,0,0 10880:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b94c0d85b28b1424890c24bb080f85b252e94e78feff90900000000050000000|@10893,1048575,@1676|53,0,@10881 64,0,@10889 70,1,@10257 10881:O1|@10882 10882:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700980d85b28948048060ffbfc3000000002c000000|@9619,3,@1672|28,0,@10883 10883:D3,144|3b650c7303ff55248b42048b58048b0889c8909090e88a00000083f8017505f6c301740db8b40e85b28b5d04909090ff138b45008d40d43b45087303ff5520894500c740fc03000000c74008f40e85b28b0b894804c700450000008d5010c742fc02000000c742040100000089028d420cc740fc03000000895008895804c70001000000c3909090000000008c000000|@9618,15,@1671|22,1,@10884 37,0,@10885 76,0,@10888 87,0,34 104,0,0 128,0,0 10884:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1670|23,0,@6769 84,0,0 10885:O4|@4608,@5398,@10887,@10886 10886:O5|@9182,1541,0,1541,0 10887:S10|74687265616453656c66 10888:O4|0,@8798,@8817,60 10889:O1|@10890 10890:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c7005c0f85b28950048948088060ffbfc390900000000034000000|@10256,7,@1675|31,0,@10891 10891:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700ac0f85b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1674|28,0,@10892 10892:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e96a72fcff9090000000002c000000|@9623,2097151,@1673|9,0,207 34,1,@9620 10893:S37|5838364c4f574c4556454c28292e676574526573756c745265676973746572283629283129 10894:S37|5838364c4f574c4556454c28292e67656e6572616c4e65676f746961746f72283129283129 10895:S35|5838364c4f574c4556454c28292e696e73747254687265616453656c66283229283129 10896:S56|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e2833292d45 10897:D3,556|3b650c7303ff552489d9bbfc1285b289c289c890ff1283f80175708b45008d40f83b45087303ff5520894500c740fc010000008b4c245489088b5424508b5c244c8b7424488b7c24448b4c2440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440508b442440eb05e9b9000000508b442440508b442440508b44244089942494000000899c249000000089b4248c00000089bc2488000000898c24840000008b4c2434898c24800000008b4c2430894c247c8b4c242c894c24788b4c2428894c24748b4c2424894c24708b4c2420894c246c8b4c241c894c24688b4c2418894c24648b4c2414894c24608b4c2410894c245c8b4c240c894c24588b4c2408894c24548b4c2404894c24505983c434894c241489442410bb03000000585983c40851e9f3bcffff8b08ff31ff742448ff742448ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff7424408b5c24788b410490e83e010000ff74245cff74244868a81485b2508b44246c8b542410ff126a016a01ff742408ff7424608d4c2408518d5c24189090e85e81fcff8b4424508b0083f80175068b442404eb0b89c38b442404e89e0300008b4c24508901837c247403750bb80100000083c41cc258008b45008d40f83b45087303ff5520894500c740fc010000008b1424891083c41cc258009090900000000028020000|@10904,2097151,@1684|11,0,@10898 314,0,1 325,1,@10773 402,1,@10901 415,0,@10902 454,1,@9650 482,1,@10903 500,0,0 10898:O1|@10899 10899:D3,52|833807751e8b48048b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000030000000|@10900,3,@1680|36,0,0 10900:S57|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e283329283129 10901:D3,260|8d7c24ac3b7d0c7303ff5528a801757153ff70046a016a016a01ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450ff742450bb030000008b008b54244c909090ff1283f801750e89c1b8447080b28b5d049090ff13ff30ff742448eb05e96e000000ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b442440909090e832ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c23c00b801000000c23c000000000000010000|@6329,1048575,@1681|87,0,1 110,0,@9149 245,0,0 10902:D3,388|3b650c7303ff5524a801755b837a0803755a8b4a048b590c52ff30ff7124ff7304ff73088b0389c38b44240c90e84edcfaff833c240174268b44240490e8d6abfaff89c3b8944b81b2e89ef6f4ff8b4c24086a0189c38b4104e8aa8dfaffb8ffffffff83c40cc3e9a60000008b4d008d49d83b4d087303ff5520894d00c741fc03000000c74108010000008b00894104c701090000008b42048b581c8b1b8d7110c746fc05000000c7461001000000c7460c01000000c7460801000000c7460403000000890e5253ff7024ff701c568b480889c890e8fe89faff8b442408a801740583c0027105ff5538ebf6598901833c240174158b4424086a01bb5c3080b28b40049090e8fe8cfaff83c4045883c404c3837a08037506b8ffffffffc38b42048b481c8b095251ff7024ff701c68102681b289cb8b700889f0909090e89689faff8b442408a801740583c0027105ff5538ebf6598901833c240174158b4424086a01bbf01081b28b40049090e8968cfaff83c4045883c404c390900000000080010000|@9649,2097151,@1682|46,1,@9004 62,1,@8788 69,0,@9480 74,1,@4940 90,1,@8783 95,0,-1 135,0,0 146,0,4 171,0,0 178,0,0 185,0,0 192,0,1 214,1,@8774 252,0,@9108 262,1,@8783 281,0,-1 303,0,@9436 318,1,@8774 356,0,@9417 366,1,@8783 10903:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1683| 10904:S54|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e283329 10905:O1|@10906 10906:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7012c1785b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1695|29,0,@10907 10907:O1|@10908 10908:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700781785b28948048060ffbfc3000000002c000000|@10923,3,@1694|28,0,@10909 10909:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e86e77fcff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701641885b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1693|14,1,@10910 24,0,207 34,1,@9637 64,0,@10911 110,0,1 10910:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1685|53,0,0 59,0,0 10911:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9cc1885b28b1424890c24bbe41a85b252e9ce6cfeff90900000000050000000|@10893,1048575,@1692|53,0,@10912 64,0,@10919 70,1,@10257 10912:O1|@10913 10913:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700181985b28948048060ffbfc3000000002c000000|@9619,3,@1688|28,0,@10914 10914:D3,260|3b650c7303ff55248b42048b58048b0889c8909090e8fe000000a80175128b08833903750b837804017505f6c301740d89c1b8a81a85b28b5d0490ff138b55008d52d83b55087303ff5520895500c742fc030000008b33897208897204c702770000008d7a10c747fc05000000897710c7470cf9ffffff8b4104894708c7470403000000c7070d0000008b45008d40bc3b45087303ff5520894500c740fc03000000c74008ffffff01897004c7004b0000008d4810c741fc02000000c741040100000089018d410cc740fc0200000089480489388d480cc741fc0200000089410489118d410cc740fc03000000894808895804c70001000000c390900000000000010000|@9618,63,@1687|22,1,@10915 51,0,@10916 95,0,59 115,0,-4 128,0,1 134,0,6 165,0,16777215 174,0,37 191,0,0 245,0,0 10915:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1686|23,0,@6769 84,0,0 10916:O4|@4608,@5398,@10918,@10917 10917:O5|@9182,1532,0,1532,0 10918:S6|7665634c656e 10919:O1|@10920 10920:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700381b85b28950048948088060ffbfc390900000000034000000|@10256,7,@1691|31,0,@10921 10921:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700881b85b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1690|28,0,@10922 10922:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e98e66fcff9090000000002c000000|@9623,2097151,@1689|9,0,207 34,1,@9620 10923:S31|5838364c4f574c4556454c28292e696e7374725665636c656e283229283129 10924:O1|@10925 10925:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701481c85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1706|29,0,@10926 10926:O1|@10927 10927:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700941c85b28948048060ffbfc3000000002c000000|@10942,3,@1705|28,0,@10928 10928:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e85272fcff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701801d85b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1704|14,1,@10929 24,0,207 34,1,@9637 64,0,@10930 110,0,1 10929:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1696|53,0,0 59,0,0 10930:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9e81d85b28b1424890c24bbf01f85b252e9b267feff90900000000050000000|@10893,1048575,@1703|53,0,@10931 64,0,@10938 70,1,@10257 10931:O1|@10932 10932:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700341e85b28948048060ffbfc3000000002c000000|@9619,3,@1699|28,0,@10933 10933:D3,240|3b650c7303ff55248b42048b58048b0889c8909090e8ea000000a80175128b08833903750b837804017505f6c301740d89c1b8b01f85b28b5d0490ff138b55008d52dc3b55087303ff5520895500c742fc030000008b33897208897204c702770000008d7a10c747fc04000000c7470cffffffffc7470834c47fb28b4104894704c707010000008b45008d40c83b45087303ff5520894500c740fc03000000897808897004c7003f0000008d4810c741fc02000000c741040100000089018d410cc740fc02000000894804891089c18d400cc740fc03000000894808895804c70001000000c3909000000000ec000000|@9618,63,@1698|22,1,@10934 51,0,@10935 95,0,59 112,0,-1 119,0,@8817 131,0,0 167,0,31 184,0,0 225,0,0 10934:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1697|23,0,@6769 84,0,0 10935:O4|@4608,@5398,@10937,@10936 10936:O5|@9182,1155,0,1155,0 10937:S11|67656e566563466c616773 10938:O1|@10939 10939:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700442085b28950048948088060ffbfc390900000000034000000|@10256,7,@1702|31,0,@10940 10940:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700942085b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1701|28,0,@10941 10941:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e98261fcff9090000000002c000000|@9623,2097151,@1700|9,0,207 34,1,@9620 10942:S33|5838364c4f574c4556454c28292e696e737472566563666c616773283229283129 10943:O1|@10944 10944:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701582185b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1722|29,0,@10945 10945:O1|@10946 10946:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700a42185b28948048060ffbfc3000000002c000000|@10967,3,@1721|28,0,@10947 10947:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e8426dfcff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701902285b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1720|14,1,@10948 24,0,207 34,1,@9637 64,0,@10949 110,0,1 10948:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1707|53,0,0 59,0,0 10949:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9f82285b28b1424890c24bbdc2885b252e9a262feff90900000000050000000|@10893,1048575,@1719|53,0,@10950 64,0,@10963 70,1,@10257 10950:O1|@10951 10951:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700442385b28948048060ffbfc3000000002c000000|@9619,3,@1715|28,0,@10952 10952:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,63,@1714|22,1,@10953 30,1,@10954 69,0,0 10953:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1708|23,0,@6769 84,0,0 10954:D3,732|3b650c7303ff5524a80175128b08833903750b837804017505f6c301740f89c1b8142785b28b5d04909090ff138b55008d52e03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4708c740fc01000040c70001000000ff338b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000ff71048b4d008d49a03b4d087303ff5520894d00c741fc0500000089711089510c8979088959048901c700030000008d4118c740fc04000000c7400c01000000894808c7400405000000c700170000008d5014c742fc02000000c742040100000089028d420cc740fc0200000089480489108d480cc741fc020000008b50048951048b1889198d710cc746fc030000008b7c2404897e08897e04c706770000008b7d008d7fcc3b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc020000008b5904895e04c706390000008d460cc740fc02000000c740040100000089308d500cc742fc03000000c74208090000008b742404897204c702330000008b75008d76e03b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc04000000c7420cffffffffc74208210000008b1c24895a04c702790000008b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c01000000c7430834c47fb2578b7c2404897b04c703010000008b7d008d7ff03b7d087303ff5520897d00c747fc03000000895f088b5c2408895f04c707450000008b5d008d5be83b5d087303ff5520895d00c743fc02000000c7430401000000893b8d7b0cc747fc02000000895f04891783ff0175048b09eb115089fb8b01909090e8a600000089c1eb015083f901740c89cb89f090e8ea00000089c683fe0175058b0424eb0c89f38b04249090e82a01000083f801750883c4045883c408c389c383c4045883c408e96701000090909000000000d8020000|@10962,63,@1713|33,0,@10955 71,0,0 87,0,67108860 103,0,0 119,0,0 151,0,0 198,0,1 215,0,0 225,0,2 231,0,11 248,0,0 311,0,59 342,0,0 366,0,28 383,0,0 402,0,4 415,0,25 446,0,0 465,0,-1 472,0,16 484,0,60 515,0,0 522,0,@8817 536,0,0 576,0,34 607,0,0 646,1,@10958 666,1,@10959 690,1,@10960 717,1,@10961 10955:O4|@4608,@5398,@10957,@10956 10956:O5|@9182,1175,0,1175,0 10957:S12|67656e46697273744c6f6e67 10958:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1709| 10959:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1710| 10960:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1711| 10961:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1712| 10962:S29|5838364c4f574c4556454c28292e67656e46697273744c6f6e67283229 10963:O1|@10964 10964:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700302985b28950048948088060ffbfc390900000000034000000|@10256,7,@1718|31,0,@10965 10965:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700802985b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1717|28,0,@10966 10966:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e99658fcff9090000000002c000000|@9623,2097151,@1716|9,0,207 34,1,@9620 10967:S37|5838364c4f574c4556454c28292e696e73747247657446697273744c6f6e67283229283129 10968:O1|@10969 10969:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701482a85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1740|29,0,@10970 10970:O1|@10971 10971:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700942a85b28948048060ffbfc3000000002c000000|@10994,3,@1739|28,0,@10972 10972:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e85264fcff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701802b85b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1738|14,1,@10973 24,0,207 34,1,@9637 64,0,@10974 110,0,1 10973:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1723|53,0,0 59,0,0 10974:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9e82b85b28b1424890c24bb943385b252e9b259feff90900000000050000000|@10893,1048575,@1737|53,0,@10975 64,0,@10990 70,1,@10257 10975:O1|@10976 10976:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700342c85b28948048060ffbfc3000000002c000000|@9619,3,@1733|28,0,@10977 10977:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,63,@1732|22,1,@10978 30,1,@10979 69,0,0 10978:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1724|23,0,@6769 84,0,0 10979:D3,1008|3b650c7303ff5524a80175128b08833903750b837804017505f6c301740f89c1b8183185b28b5d04909090ff138b55008d52e03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4708c740fc01000040c70001000000ff71048b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000ff338b5d008d5b883b5d087303ff5520895d00c743fc0500000089731089530c897b08894b048903c700030000008d4318c740fc04000000c7400c05000000895808c7400405000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc0200000089580489088d480cc741fc020000008b50048951048b1889198d710cc746fc01000040c706010000008d7e08c747fc01000040c707f9ffff078d5f08c743fc01000040c703010000008d4308c740fc01000040c700010000008d5008c742fc01000040c70201000000ff31ff71048b4d008d897cffffff3b4d087303ff5520894d00c741fc0500000089791089710c8959088951048901c700030000008d4118c740fc02000000894804c7007d0000008d500cc742fc02000000c742040100000089028d420cc740fc0200000089480489108d480cc741fc020000008b50048951048b1889198d710cc746fc020000008b7904897e04c706390000008d5e0cc743fc02000000c743040100000089338d730cc746fc030000008b442408894608894604c706770000008d5610c742fc04000000c7420c01000000c7420834c47fb28b44240c894204c702010000008b45008d40f03b45087303ff5520894500c740fc030000008950088b542408895004c700450000008b55008d52dc3b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc0200000089500489308d500cc742fc020000005e897204c702390000008b75008d76e43b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc03000000c74208070000008b7c2404897a04c7024b0000008b7d008d7fe83b7d087303ff5520897d00c747fc02000000c747040100000089178d570cc742fc02000000538b5c240c895a04c7027b0000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000891383fb0175068b542404eb1050ff318b44240ce8d600000089c2eb0350ff3183fa01740e89d389f8909090e81601000089c783ff0175058b0424eb0c89fb8b04249090e85601000083f801740d89c389f09090e89e01000089c683fe0175068b442404eb0b89f38b442404e8de01000083f801750883c4085883c40cc389c383c4085883c40ce91b02000090909000000000ec030000|@10989,63,@1731|33,0,@10980 71,0,0 87,0,67108860 103,0,0 119,0,0 152,0,0 198,0,1 215,0,2 225,0,2 231,0,11 248,0,0 301,0,0 317,0,67108860 333,0,0 349,0,0 365,0,0 417,0,1 436,0,62 453,0,0 512,0,28 529,0,0 557,0,59 574,0,0 581,0,@8817 594,0,0 634,0,34 665,0,0 702,0,28 733,0,0 752,0,3 765,0,37 796,0,0 822,0,61 853,0,0 878,1,@10983 902,1,@10984 926,1,@10985 942,1,@10986 966,1,@10987 993,1,@10988 10980:O4|@4608,@5398,@10982,@10981 10981:O5|@9182,1195,0,1195,0 10982:S15|67656e537472696e674c656e677468 10983:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1725| 10984:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1726| 10985:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1727| 10986:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1728| 10987:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1729| 10988:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1730| 10989:S32|5838364c4f574c4556454c28292e67656e537472696e674c656e677468283229 10990:O1|@10991 10991:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700e83385b28950048948088060ffbfc390900000000034000000|@10256,7,@1736|31,0,@10992 10992:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700383485b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1735|28,0,@10993 10993:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e9de4dfcff9090000000002c000000|@9623,2097151,@1734|9,0,207 34,1,@9620 10994:S37|5838364c4f574c4556454c28292e696e737472537472696e674c656e677468283229283129 10995:O1|@10996 10996:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701003585b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1750|29,0,@10997 10997:O1|@10998 10998:D3,16|b82c3585b2c39090000000000c000000|@11013,1,@1749|1,0,@10999 10999:O1|@11000 11000:D3,88|3b650c7303ff552489c389d890e85a0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089015368fc3585b2bb503885b289c890e80250feff89c15889caff229090900000000054000000|@10262,1048575,@1748|14,1,@11001 45,0,0 53,0,@11002 58,0,@11009 66,1,@10257 11001:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1741|53,0,0 59,0,0 11002:O1|@11003 11003:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700483685b28948048060ffbfc3000000002c000000|@9619,3,@1744|28,0,@11004 11004:D3,304|3b650c7303ff55248b42048b58048b0889c8909090e82a010000a80175228b08833903751bf640040175158b50048b32833e03750b837a0401750583fb01740d89c1b8043885b28b5d0490ff138b7d008d7fdc3b7d087303ff5520897d00c747fc030000008b4604894708894704c707770000008d5710c742fc04000000c7420c01000000c7420834c47fb28b4904894a04c702010000008b4d008d49a83b4d087303ff5520894d00c741fc03000000894108895104c701750000008d5110c742fc04000000c7420c05000000894208c7420403000000c702650000008d4214c740fc02000000c740040100000089108d500cc742fc02000000894204890a8d420cc740fc02000000895004893889c18d400cc740fc03000000894808895804c70001000000c390000000002c010000|@9618,63,@1743|22,1,@11005 67,0,@11006 112,0,59 129,0,0 136,0,@8817 148,0,0 184,0,58 201,0,2 211,0,1 217,0,50 234,0,0 290,0,0 11005:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1742|23,0,@6769 84,0,0 11006:O4|@4608,@5398,@11008,@11007 11007:O5|@9182,1211,0,1211,0 11008:S24|67656e536574537472696e67537472696e674c656e677468 11009:O1|@11010 11010:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c700a43885b28950048948088060ffbfc390900000000034000000|@10256,7,@1747|31,0,@11011 11011:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700f43885b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1746|28,0,@11012 11012:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e92249fcff9090000000002c000000|@9623,2097151,@1745|9,0,207 34,1,@9620 11013:S40|5838364c4f574c4556454c28292e696e737472536574537472696e674c656e677468283229283129 11014:O1|@11015 11015:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700183a85b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10896,1048575,@1772|41,0,1 62,0,0 72,0,0 115,0,@11016 11016:O1|@11017 11017:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700643a85b28948048060ffbfc3000000002c000000|@11059,3,@1771|28,0,@11018 11018:D3,40|3b650c7303ff5524b9a03a85b28b1c24890c2489d98b5a0451e99200000090900000000024000000|@11026,2097151,@1770|9,0,@11019 26,1,@11023 11019:O2|0,@11020 11020:O1|@11021 11021:D3,40|3b650c7303ff55248b48088b1424890c246a038b58048b0889c852e954f4feff0000000024000000|@11022,63,@1751|28,1,@10517 11022:S28|5838364c4f574c4556454c28292e7465737454616773283129283129 11023:D3,2060|3b650c7303ff5524a80175578b088339057555f640040175628b5004837a0401755e8b32833e05755c8b7c2404833f0975058b4108eb068b41080b460883f801740583f80175718b45008d40f03b45087303ff5520894500c740fc030000009090eb0ae9d1060000e975020000c700344385b2895804897808eb0fe962020000e95d020000e9580200008060ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000eb05e913000000c7400801000000894804c70005000000c20400ff71086a0189d989c389c89090e81653fcffb901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740783f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8ff7504b9863c85b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1383380175128b4804f6c101740583c1207120ff5538ebf68378080375128b4804f6c101740583c1107108ff5538ebf68b4804f6c10175108b11f641ff107402f7da8d541201eb0289ca89d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c090123142483fa01746b83fa0174668b4d008d49f03b4d087303ff5520894d00c741fc03000000c701a84385b28b5424088951048941088061ffbf89c38b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c01000000894808895804c7000700000083c404c204008b4d008d49e83b4d087303ff5520894d00c741fc020000008941048b54240889118d590cc743fc02000000c703d84d85b2894b048063ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c03000000895808894804c7000700000083c404c204008339057561f640040175608b5004837a0401755c8379080174068379080175758b75008d76f03b75087303ff5520897500c746fc03000000c706e84f85b2895e048b5c2404895e088066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000eb0fe957010000e952010000e94d010000c7401003000000c7400c9f010000c7400801000000897004c70005000000eb05e903000000c204006a0189de8b590889f090e86a50fcffb901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740783f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8ff7504b9323f85b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f03b4d087303ff5520894d00c741fc03000000c701245085b28b5424048951048941088061ffbf89c38b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c01000000894808895804c70007000000c204008b542404833a0975618b75008d76f03b75087303ff5520897500c746fc03000000c7065c5085b2895e048956088066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000897004c70005000000c20400f640040175658b70048b3e833f057560837e0401755f837f08017406837f080175588b4d008d49f03b4d087303ff5520894d00c741fc03000000c701985085b28959048951088061ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000eb14e95a010000e955010000e950010000e91a000000c7400c9f010000c7400801000000894804c70005000000c204006a01538b5f0858909090e8424efcffb901000000ba0300000083f92f750c89c3b858f07fb28b5d04ff1389d323d883fb01751183c1028d5412ff3b650c7303ff5524ebd5f6c101740783f9017d17eb06f641ff10740f89cbb88c6c7ab2ff1588c75208eb0289c8ff7504b95a4185b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49e83b4d087303ff5520894d00c741fc020000008941048b54240489118d590cc743fc02000000c703d45085b2894b048063ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c03000000895808894804c70007000000c204008b75008d76f03b75087303ff5520897500c746fc03000000c706005185b2895e048956088066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000897004c70005000000c204008b44240483380975618b4d008d49f03b4d087303ff5520894d00c741fc03000000c7013c5185b28959048941088061ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000894804c70005000000c204008b4d008d49f03b4d087303ff5520894d00c741fc03000000c701785185b28959048941088061ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000894804c70005000000c204000000000008080000|@11058,2097151,@1769|111,0,@11024 171,0,1 178,0,207 192,0,0 201,0,2 222,1,@9637 227,0,0 232,0,1 244,0,@8999 300,0,@5215 306,0,I106 318,0,$11023+370 338,0,@5401 350,0,@8950 388,0,@8952 481,0,1 494,0,31 548,0,@11027 595,0,1 602,0,0 614,0,3 669,0,@11044 709,0,1 716,0,1 728,0,3 796,0,@11050 858,0,1 865,0,207 872,0,0 881,0,2 906,1,@9637 911,0,0 916,0,1 928,0,@8999 984,0,@5215 990,0,I106 1002,0,$11023+1054 1022,0,@5401 1034,0,@8950 1072,0,@8952 1115,0,@11051 1162,0,1 1169,0,0 1181,0,3 1223,0,@11052 1264,0,1 1271,0,207 1278,0,0 1287,0,2 1354,0,@11053 1395,0,1 1424,0,207 1431,0,0 1440,0,2 1458,1,@9637 1463,0,0 1468,0,1 1480,0,@8999 1536,0,@5215 1542,0,I106 1554,0,$11023+1606 1574,0,@5401 1586,0,@8950 1624,0,@8952 1686,0,@11054 1726,0,1 1733,0,1 1745,0,3 1778,0,@11055 1819,0,1 1826,0,207 1833,0,0 1842,0,2 1884,0,@11056 1925,0,1 1932,0,207 1939,0,0 1948,0,2 1981,0,@11057 2022,0,1 2029,0,207 2036,0,0 2045,0,2 11024:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1752|23,0,@11025 11025:O1|@11023 11026:S37|5838364c4f574c4556454c28292e776f726453656c65637444657374283129283129283129 11027:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e91c0000000000000020000000|@11041,2097151,@1757|24,1,@11028 11028:D3,1996|3b650c7303ff5524a801740d89c1b8c04b85b28b5d0490ff13f6400401740e8b4804b8c04b85b28b5d0490ff138b48048b11833a05756083790401755fbe01000000bf0300000083fe2f750db858f07fb28b5d04909090ff1389f823420483f801751183c6028d7c3fff3b650c7303ff5524ebd3f7c601000000740783fe017d2beb06f646ff107423ff33ff730489f3b88c6c7ab2eb0ae986020000e981020000909090ff1588c75208eb0789f0ff33ff7304ff7504b9ca4485b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f83b4d087303ff5520894d00c741fc010000008b54240c8911837c240405750f89c3b8004c85b28b5d04909090ff13837c24040b75448b5d008d5be03b5d087303ff5520895d00c743fc04000000c7430c03000000895308c7430401000000c703090000008d7314c746fc02000000c7460401000000891eeb59837c240403745e837c240407745c837c24040975498b5d008d5be03b5d087303ff5520895d00c743fc04000000c7430c03000000895308c7430401000000c703090000008d7314c746fc02000000c7460401000000891eeb1de918000000be01000000eb11e907000000be01000000eb05be010000008b5d008d5bec3b5d087303ff5520895d00c743fc0400000089430c8953088b7c2404897b04c7030f00000083ff0175368b7d008d7fe83b7d087303ff5520897d00c747fc02000000895704c707530000008d570cc742fc02000000c7420401000000893aeb05ba010000008b7d008d7fe83b7d087303ff5520897d00c747fc02000000895704891f8d570cc742fc020000008b5c240c895a04c702030000008b5d008d5be43b5d087303ff5520895d00c743fc02000000894304c703030000008d430cc740fc03000000895808895004893851568b5424089090ff1283f80175058b0424eb0a89c38b0424e87205000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480883c4045983c408894804c70001000000c20400833a07756083790401755ff6420401745ef6420401750cb808a87cb28b5d049090ff13833b0b75198b7204f7c601000000740403f67105ff5538ebf783ee01eb65833b03753a8b7204f7c601000000740403f67105ff5538ebf783ee01f7c601000000eb0fe9ec010000e9e7010000e97d010000740583c6027158ff5538ebf6833b0775308b7204f7c601000000740403f67105ff5538ebf783ee01f7c601000000740ceb05e95300000083c602714eff5538ebf6833b09751e8b7204f7c601000000740403f67105ff5538ebf783ee01eb2be926000000833b01740ab89c4c85b28b5d04ff138b7204f7c601000000740403f67105ff5538ebf783ee018b7d008d7ff83b7d087303ff5520897d00c747fc010000008b4424048907837a0401750c833b037407bb01000000eb758b4d008d49ec3b4d087303ff5520894d00c741fc0400000089710c8941088b33897104c701090000008b75008d76cc3b75087303ff5520897500c746fc02000000c7460401000000890e8d4e0cc741fc02000000894104c701030000008d410cc740fc020000008b5204895004c70005000000eb05e92000000089c28d400cc740fc030000008950088948048930578b53049090ff1289c3eb01578b45008d40f03b45087303ff5520894500c740fc0300000089580859894804c70001000000c204008b75008d76f03b75087303ff5520897500c746fc03000000c706e44c85b2895e048b5c2404895e088066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400803000000897004c70005000000c20400833a01750683790401740ab8c04b85b28b5d04ff138b75008d76f83b75087303ff5520897500c746fc010000008b7c2404893e833b05750db8004c85b28b5d04909090ff13833b0b75448b45008d40e03b45087303ff5520894500c740fc04000000c7400c03000000897808c7400401000000c700090000008d4814c741fc02000000c74104010000008901eb5a833b03745a833b07745a833b0975448b45008d40e03b45087303ff5520894500c740fc04000000c7400c03000000897808c7400401000000c700090000008d4814c741fc02000000c74104010000008901eb1db901000000eb16e911000000e907000000b901000000eb05b9010000008b45008d40e83b45087303ff5520894500c740fc050000008978108b7a0889780c8b7a048978088b3b897804c7000d00000083ff0175498b7d008d7ff43b7d087303ff5520897d00c747fc02000000568b742408897704c707530000008b75008d76f43b75087303ff5520897500c746fc02000000c7460401000000893eeb0656be010000008b7d008d7fe83b7d087303ff5520897d00c747fc0200000089770489078d470cc740fc020000008b742408897004c700030000008b75008d76f03b75087303ff5520897500c746fc03000000518b4a08894e088b4a04894e04c70601000000508b45008d40f03b45087303ff5520894500c740fc030000008970085e89700489388b5304ff1283f80175058b0424eb0a89c38b0424e8de01000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480883c40459894804c70001000000c204009000000000c8070000|@11043,2097151,@1756|15,0,@11029 35,0,@11029 62,0,0 67,0,1 77,0,@8999 145,0,@5215 166,0,I106 183,0,$11028+234 203,0,@5401 214,0,@8950 252,0,@8952 309,0,@11032 355,0,1 365,0,0 371,0,4 388,0,0 444,0,1 454,0,0 460,0,4 477,0,0 491,0,0 503,0,0 510,0,0 553,0,7 591,0,41 608,0,0 617,0,0 669,0,1 702,0,1 750,1,@11035 795,0,0 826,0,@7422 1024,0,@11036 1098,0,0 1141,0,4 1172,0,0 1193,0,1 1215,0,2 1292,0,0 1325,0,@11039 1370,0,0 1377,0,207 1384,0,1 1393,0,2 1412,0,@11029 1457,0,@11032 1501,0,1 1511,0,0 1517,0,4 1534,0,0 1584,0,1 1594,0,0 1600,0,4 1617,0,0 1626,0,0 1643,0,0 1650,0,0 1700,0,6 1743,0,41 1774,0,0 1784,0,0 1836,0,1 1879,0,0 1938,1,@11042 1980,0,0 11029:O4|@4608,@5398,@11031,@11030 11030:O5|@9182,1072,0,1072,0 11031:S10|616464576f7264417267 11032:O4|@4608,@5398,@11034,@11033 11033:O5|@9182,964,0,964,0 11034:S13|706f737454616741646a757374 11035:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1753| 11036:O4|@4608,@5398,@11038,@11037 11037:O5|@9182,1053,0,1053,0 11038:S18|616464576f72644172673a206f70636f6465 11039:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba204d85b256ff2290900000000024000000|@11041,1048575,@1754|23,0,@11040 11040:O1|@11028 11041:S36|5838364c4f574c4556454c28292e776f726453656c65637465644c656674283129283129 11042:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1755| 11043:S33|5838364c4f574c4556454c28292e776f726453656c65637465644c656674283329 11044:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@11048,2097151,@1760|12,1,@11045 11045:D3,316|3b650c7303ff5524a801755d8b08833907755bf6400401755a8b5004837a04017563f64104017462b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4b048b1424eb0fe978000000e973000000e96e000000890c248b0b89cb52e957f5ffffe95c0000008b75008d76f43b75087303ff5520897500c746fc02000000c706544f85b2895e048066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f010000c7400801000000897004c70005000000c3b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4b048b1424890c248b0b89cb52e9aaf4ffff90900000000038010000|@11049,2097151,@1759|41,0,0 129,1,@11028 164,0,@11046 202,0,0 209,0,207 216,0,0 225,0,2 231,0,0 302,1,@11028 11046:D3,28|3b650c7303ff55248b5a04ba844f85b2ff2290900000000018000000|@11048,1048575,@1758|12,0,@11047 11047:O1|@11045 11048:S37|5838364c4f574c4556454c28292e776f726453656c65637465645269676874283129283129 11049:S34|5838364c4f574c4556454c28292e776f726453656c65637465645269676874283229 11050:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1761|23,0,@11025 11051:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9a0f3ffff0000000020000000|@11041,2097151,@1762|24,1,@11028 11052:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1763|23,0,@11025 11053:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1764|23,0,@11025 11054:D3,24|3b650c7303ff55248b5a04e920fdffff0000000014000000|@11048,2097151,@1765|12,1,@11045 11055:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1766|23,0,@11025 11056:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1767|23,0,@11025 11057:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba704385b256ff2290900000000024000000|@11026,1048575,@1768|23,0,@11025 11058:S31|5838364c4f574c4556454c28292e776f726453656c65637444657374283329 11059:S34|5838364c4f574c4556454c28292e776f726453656c65637444657374283129283129 11060:O1|@11061 11061:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700b85285b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10896,1048575,@1775|41,0,1 62,0,0 72,0,0 115,0,@11062 11062:O1|@11063 11063:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700045385b28948048060ffbfc3000000002c000000|@11059,3,@1774|28,0,@11064 11064:D3,40|3b650c7303ff5524b9405385b28b1c24890c2489d98b5a0451e9f2e7ffff90900000000024000000|@11026,2097151,@1773|9,0,@11065 26,1,@11023 11065:O2|4,@11020 11066:O1|@11067 11067:D3,424|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b8105585b28b5d049090ff13ff30ff31e8ca010000a8017557f640040175568b480483790401755ff60101755f8b11f60201745df60201750bb808a87cb28b5d0490ff13833a0575718b5d008d5bf43b5d087303ff5520895d00c743fc02000000c74304010000008b7424048933eb0ae905010000e9520000008b75008d76ec3b75087314eb0fe940000000e93b000000e92d000000ff5520897500c746fc02000000895e04c706bc5585b28d460cc740fc010000008930eb05e90400000083c408c3b80100000083c408c3f6400401755c8b4804837904017558f6000175588b10f602017456f60201750cb808a87cb28b5d049090ff13833a05756b8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c74304010000008b342489338b75008d76ec3b75087319eb14e93e000000e939000000e934000000e926000000ff5520897500c746fc02000000895e04c706bc5585b28d460cc740fc01000000893083c408c3b80100000083c408c3b80100000083c408c3b80100000083c408c300000000a4010000|@11118,1048575,@1803|30,0,@11068 46,1,@11071 87,0,@7422 129,0,0 197,0,@11072 225,0,0 266,0,@7422 309,0,0 369,0,@11072 390,0,0 399,0,0 408,0,0 11068:O4|@4608,@5398,@11070,@11069 11069:O5|@9182,1448,0,1448,0 11070:S9|696e7374724d756c41 11071:D3,88|3b650c7303ff5524a801753e53ff70048b0089daff12508b5c24088b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000054000000|@6329,1048575,@1776|75,0,0 11072:O1|@11073 11073:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700085685b28948048060ffbfc3000000002c000000|@11117,3,@1802|28,0,@11074 11074:D3,36|3b650c7303ff55248b52048b0c24891424bb405685b251e9e40a00000000000020000000|@11114,2097151,@1801|18,0,@11075 24,1,@11094 11075:O1|@11076 11076:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@11093,63,@1789|16,1,@11077 11077:D3,1580|3b650c7303ff5524f6c301740cb8b85c85b28b5d049090ff138b45008d40d83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000ff338b5d008d5b903b5d087303ff5520895d00c743fc05000000894b1089430c895308897b048933c706030000008d4318c740fc02000000895804c7007d0000008d480cc741fc02000000c741040100000089018d410cc740fc0200000089580489088d480cc741fc020000008b50048951048b1889198d710cc746fc01000040c706010000008d7e08c747fc01000040c707f9ffff078d5f08c743fc01000040c703010000008d4308c740fc01000040c700010000008d5008c742fc01000040c70201000000ff31ff71048b4d008d49883b4d087303ff5520894d00c741fc0500000089791089710c8959088951048901c700030000008d4118c740fc04000000c7400c03000000894808c7400405000000c700170000008d5014c742fc02000000c742040100000089028d420cc740fc0200000089480489108d480cc741fc020000008b50048951048b1889198d710cc746fc01000040c706010000008d7e08c747fc01000040c707f9ffff078d5f08c743fc01000040c703010000008d4308c740fc01000040c700010000008d5008c742fc01000040c70201000000ff31ff71048b4d008d49883b4d087303ff5520894d00c741fc0500000089791089710c8959088951048901c700030000008d4118c740fc04000000c7400c03000000894808c7400417000000c700170000008d5014c742fc02000000c742040100000089028d420cc740fc0200000089480489108d480cc741fc020000008b50048951048b1889198d710cc746fc01000040c706010000008d7e08c747fc01000040c707f9ffff078d5f08c743fc01000040c703010000008d4308c740fc01000040c700010000008d5008c742fc01000040c70201000000ff31ff71048b4d008d49a43b4d087303ff5520894d00c741fc0500000089791089710c89590889510489018d4118c740fc02000000894804c700390000008d500cc742fc02000000c742040100000089028d420cc740fc0200000089480489108d480cc741fc020000008b50048951048b1889198d710cc746fc04000000c7460c030000008b7c2418897e08c7460409000000c706090000008b7d008d7fe83b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc020000008b5c2410895e04c706390000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c743040100000089338b71048b068b00a801740583c0027105ff5538ebf68b1689028b45008d40dc3b45087303ff5520894500c740fc02000000897004c7007d0000008d500cc742fc02000000c742040100000089028d420cc740fc020000008b742408897004c700390000008b75008d76e83b75087303ff5520897500c746fc02000000c746040100000089068d460cc740fc02000000578b7c2404897804c700390000008b7d008d7fe03b7d087303ff5520897d00c747fc02000000c747040100000089078d470cc740fc04000000538b5c242089580c895808c7400401000000c7000f0000008b5d008d5be83b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc02000000528b542424895004c7007b0000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890283fa0175068b442418eb1353ff3189d38b442420909090e84a010000eb0353ff3183f80175058b0424eb0d89c38b0424909090e88601000083f80175068b442404eb0d89c38b4424049090e8c601000083f80175068b442418eb0d89c38b4424189090e80602000083f80175068b442428eb0d89c38b4424289090e84602000083f801740d89c389f89090e88e02000089c783ff01740b89fb89f0e8d602000089c683fe017507b80c1f84b2eb0e89f3b80c1f84b29090e81203000083f80175068b442408eb0d89c38b4424089090e85203000083f80175068b44240ceb0d89c38b44240c9090e89203000083f801750883c4105883c41cc389c383c4105883c41ce9cf0300009090900000000028060000|@11092,63,@1788|14,0,@11078 51,0,0 67,0,67108860 83,0,0 99,0,0 115,0,0 161,0,1 180,0,62 197,0,0 250,0,0 266,0,67108860 282,0,0 298,0,0 314,0,0 363,0,1 380,0,1 390,0,2 396,0,11 413,0,0 466,0,0 482,0,67108860 498,0,0 514,0,0 530,0,0 579,0,1 596,0,1 606,0,11 612,0,11 629,0,0 682,0,0 698,0,67108860 714,0,0 730,0,0 746,0,0 808,0,28 825,0,0 879,0,1 893,0,4 899,0,4 930,0,0 955,0,28 986,0,0 1046,0,62 1063,0,0 1088,0,28 1119,0,0 1145,0,28 1176,0,0 1206,0,0 1212,0,7 1243,0,0 1269,0,61 1300,0,0 1330,1,@11081 1358,1,@11082 1382,1,@11083 1406,1,@11084 1430,1,@11085 1446,1,@11086 1462,1,@11087 1474,0,@10474 1483,0,@10474 1490,1,@11088 1514,1,@11089 1538,1,@11090 1565,1,@11091 11078:O4|@4608,@5398,@11080,@11079 11079:O5|@9182,1415,0,1415,0 11080:S10|67656e41646453656c66 11081:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1777| 11082:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1778| 11083:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1779| 11084:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1780| 11085:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1781| 11086:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1782| 11087:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1783| 11088:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1784| 11089:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1785| 11090:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1786| 11091:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1787| 11092:S27|5838364c4f574c4556454c28292e67656e41646453656c66283229 11093:S27|5838364c4f574c4556454c28292e67656e41646453656c66283129 11094:D3,688|3b650c7303ff5524a801740d89c1b8cc6385b28b5d0490ff1383780401740e8b08b8cc6385b28b5d049090ff138b08833905755e8b510881e29f01000083fa01745583fa0174558b510881e29f010000be01000000bf0300000083fe2f750ab858f07fb28b5d04ff1389f823c283f801751183c6028d7c3fff3b650c7303ff5524ebd7f7c601000000741683fe017d28eb15e997010000e91a010000e915010000f646ff1074115389f3b88c6c7ab290ff1588c75208eb0389f053ff7504b9fa6185b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49c43b4d087303ff5520894d00c741fc0100000089018d5108c742fc02000000894204c702030000008d5a0cc743fc0100000089138d5308c742fc02000000c7420401000000891a8d5a0cc743fc04000000c703246485b25e897304894b0889530c8063ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c01000000895808894804c70007000000c20400536a01bb9f0100008b44240c909090e83a2cfcff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701dc6a85b25a8951048b5424048951088061ffbf89c38b45008d40e83b45087303ff5520894500c740fc05000000c740100300000089580cc7400801000000894804c70005000000c20400536a01bb9f0100008b44240c909090e8c22bfcff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701486b85b25a8951048b5424048951088061ffbf89c38b45008d40e83b45087303ff5520894500c740fc05000000c740100300000089580cc7400801000000894804c70005000000c20400909000000000ac020000|@11116,2097151,@1800|15,0,@11095 34,0,@11095 81,0,0 86,0,1 96,0,@8999 171,0,@5215 178,0,I106 191,0,$11094+242 211,0,@5401 222,0,@8950 260,0,@8952 318,0,1 347,0,0 365,0,@11098 412,0,1 419,0,0 431,0,3 442,0,207 454,1,@9637 484,0,@11112 532,0,1 542,0,0 551,0,2 562,0,207 574,1,@9637 604,0,@11115 652,0,1 662,0,0 671,0,2 11095:O4|@4608,@5398,@11097,@11096 11096:O5|@9182,593,0,593,0 11097:S34|6c6f6164446573744172673a206e6f7420612073696e676c6520617267756d656e74 11098:D3,44|3b650c7303ff5524b99f0100008b1c24890c24ff7208ff720c89d98b5a0451e91c0000000000000028000000|@11106,2097151,@1797|9,0,207 32,1,@11099 11099:D3,68|3b650c7303ff55248b4c24048b54240c8b742408bf01000000897c240c89542408894c2404bfbc6485b28b1424893c24535689c389c852e9240000000000000040000000|@11111,2097151,@1796|21,0,0 38,0,@11100 56,1,@11101 11100:O1|@11099 11101:D3,984|3b650c7303ff5524a801756df60001756df6c301740f8b4804b8b06885b28b5d049090ff138b4c2418f6c101740583c1027105ff5538ebf68b5424148b7424108b7c240c518b4c240cff73048b5c240cff70048b44240889442424895424208974241c897c2418894c2414895c24108b5c24045883c408eb0ae9de020000e905000000e978fffffff6c30174108b4804b8b06885b28b5d04909090ff138b0b833905755e8b51042354241483fa01745783fa0174578b510423542414be01000000bf0300000083fe2f750e8b4804b858f07fb28b5d0490ff1389f923ca83f901751183c6028d7c3fff3b650c7303ff5524ebd3f7c601000000741683fe017d2ceb15e9d5010000e954010000e94f010000f646ff107415ff700489f3b88c6c7ab2909090ff1588c75208eb068b480489f051ff7504b92e6685b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff1389c68b5c241c8b4424149090e826b2f7ff8b4d008d49e03b4d087303ff5520894d00c741fc02000000897104c701030000008d510cc742fc01000000890a8d4a08c741fc020000005b895904891183f901740a89cb909090e82e0200008b4d008d49e43b4d087303ff5520894d00c741fc06000000c701346985b28b54240c8951048b5c24088959088b7c241489790c8b5424048951108941148061ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c74010010000008b5c241889580c894808897004c70007000000c218008b45008d40e43b45087303ff5520894500c740fc06000000c700986985b28b54240c8950048b7424088970088b7c241489780c8b4c24048948108b5c24108958148060ffbf508b45008d40e83b45087303ff5520894500c740fc05000000c740100100000089780c8b54241c8950085e897004c70005000000c218008b45008d40e43b45087303ff5520894500c740fc06000000c700d86985b28b54240c8950048b7424088970088b7c241489780c8b4c24048948108b5c24108958148060ffbf508b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c9f0100008b54241c8950085e897004c70005000000c2180083fb01740cb8b06885b28b5d049090ff138b442410e8de01000089c18b45008d40f43b45087303ff5520894500c740fc020000008b54240489500489088b542408909090ff1289c18b45008d40f03b45087303ff5520894500c740fc030000008948088b4c2404894804c70001000000c218009000000000d4030000|@11110,2097151,@1795|26,0,@11102 145,0,@11102 189,0,0 194,0,1 207,0,@8999 285,0,@5215 294,0,I106 310,0,$11101+362 330,0,@5401 342,0,@8950 380,0,@8952 410,1,@7849 443,0,1 486,1,@11104 516,0,@11105 582,0,0 601,0,3 634,0,@11107 705,0,0 725,0,2 758,0,@11108 829,0,0 836,0,207 853,0,2 866,0,@11102 882,1,@11109 968,0,0 11102:O4|@4650,@6706,0,@11103 11103:O5|@9182,412,0,412,0 11104:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1790| 11105:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@11106,1048575,@1791| 11106:S26|5838364c4f574c4556454c28292e676574417267283129283129 11107:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@11106,1048575,@1792| 11108:D3,44|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff721489de8b5a088b4a0489ca56ff220000000028000000|@11106,1048575,@1793| 11109:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1794|23,0,@6769 84,0,0 11110:S33|5838364c4f574c4556454c28292e6765744172672835296e657874417267283329 11111:S23|5838364c4f574c4556454c28292e676574417267283529 11112:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba186b85b256ff2290900000000024000000|@11114,1048575,@1798|23,0,@11113 11113:O1|@11094 11114:S31|5838364c4f574c4556454c28292e6c6f616444657374417267283129283129 11115:D3,40|3b650c7303ff55248b4a088b1c24890c2489de8b5a04ba186b85b256ff2290900000000024000000|@11114,1048575,@1799|23,0,@11113 11116:S28|5838364c4f574c4556454c28292e6c6f616444657374417267283329 11117:S27|5838364c4f574c4556454c28292e6d756c41436f6e737432283129 11118:S26|5838364c4f574c4556454c28292e696e7374724d756c41283229 11119:O1|@11120 11120:D3,148|3b650c7303ff552489c15053f6c101752cff71048b018b5424049090ff1283f801740ff60001750ab80300000083c404eb10593b650c7303ff5524ebcfb80100000083f8017409b80100000083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948049090c700a06c85b289c18d400cc740fc01000000890883c408c39090900000000090000000|@10896,1048575,@1806|41,0,1 62,0,0 72,0,0 115,0,@11121 11121:O1|@11122 11122:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700ec6c85b28948048060ffbfc3000000002c000000|@11059,3,@1805|28,0,@11123 11123:D3,40|3b650c7303ff5524b9405385b28b1c24890c2489d98b5a0451e90aceffff90900000000024000000|@11026,2097151,@1804|9,0,@11065 26,1,@11023 11124:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8846d85b2c39090900000000044000000|@6536,3,@1807|56,0,@11125 11125:O2|@10746,0 11126:O1|@11127 11127:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701e46d85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1811|29,0,@11128 11128:O1|@11129 11129:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700306e85b28948048060ffbfc3000000002c000000|@11059,3,@1810|28,0,@11130 11130:D3,40|3b650c7303ff5524b96c6e85b28b1c24890c2489d98b5a0451e9c6ccffff90900000000024000000|@11026,2097151,@1809|9,0,@11131 26,1,@11023 11131:O2|5,@11132 11132:O1|@11133 11133:D3,12|8b00c3900000000008000000|@10324,1,@1808| 11134:O1|@11135 11135:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701f46e85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1814|29,0,@11136 11136:O1|@11137 11137:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700406f85b28948048060ffbfc3000000002c000000|@11059,3,@1813|28,0,@11138 11138:D3,40|3b650c7303ff5524b97c6f85b28b1c24890c2489d98b5a0451e9b6cbffff90900000000024000000|@11026,2097151,@1812|9,0,@11139 26,1,@11023 11139:O2|3,@11132 11140:O1|@11141 11141:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701dc6f85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1817|29,0,@11142 11142:O1|@11143 11143:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700287085b28948048060ffbfc3000000002c000000|@11059,3,@1816|28,0,@11144 11144:D3,40|3b650c7303ff5524b9647085b28b1c24890c2489d98b5a0451e9cecaffff90900000000024000000|@11026,2097151,@1815|9,0,@11145 26,1,@11023 11145:O2|1,@11132 11146:O1|@11147 11147:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701c47085b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1820|29,0,@11148 11148:O1|@11149 11149:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700107185b28948048060ffbfc3000000002c000000|@11059,3,@1819|28,0,@11150 11150:D3,40|3b650c7303ff5524b96c6e85b28b1c24890c2489d98b5a0451e9e6c9ffff90900000000024000000|@11026,2097151,@1818|9,0,@11131 26,1,@11023 11151:O1|@11152 11152:D3,260|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b86c7285b28b5d049090ff1350ff308b0189daff1283f80175378b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c700ac7285b289c18d400cc740fc01000000890883c408c3f60001750e8b08b808a87cb28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c701887f85b28b008941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b142489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c408c39090900000000000010000|@11209,1048575,@1840|30,0,@11153 88,0,@11156 118,0,@7422 155,0,@11199 195,0,0 11153:O4|@4608,@5398,@11155,@11154 11154:O5|@9182,1338,0,1338,0 11155:S10|7368696674496e737472 11156:O1|@11157 11157:D3,84|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7011c7385b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700187f85b28948048060ffbfc3900000000050000000|@11198,3,@1835|26,0,@11158 63,0,@11197 11158:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700687385b28948048b52048950088060ffbfc390900000000034000000|@11196,7,@1833|28,0,@11159 11159:D3,44|3b650c7303ff5524b9a87385b28b1c24890c24ff720889d98b5a0451e9db0600009090900000000028000000|@11193,2097151,@1832|9,0,@11160 29,1,@11183 11160:O1|@11161 11161:D3,40|3b650c7303ff5524b9010000008b1424890c248b58048b0889c852e91c0000000000000024000000|@11182,63,@1827|9,0,0 28,1,@11162 11162:D3,832|3b650c7303ff5524a80175228b08833903751bf640040175158b50048b32833e03750b837a04017505f6c301740f89c1b8407785b28b5d04909090ff138b79043b3b743d833f0175118b0383380175268b57043b5004751eeb27833f0375178b0383380375108b57043b500475088b4f083b4808740bb8807785b28b5d0490ff13817e049c9a7ab274238b46048338017411833803750c83780403750683780801740ab8d07785b28b5d04ff138b45008d40d83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701f9ffff078d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc01000040c70701000000ff338b5d008d5b9c3b5d087303ff5520895d00c743fc05000000894b1089430c895308897b048933c706030000008d4318c740fc04000000c7400c05000000895808c740040f000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc0200000089580489088d480cc741fc020000008b50048951048b1889198d710cc746fc04000000c7460c030000008b3c24897e08c7460407000000c706090000008b7d008d7fb43b7d087303ff5520897d00c747fc030000008b5c2408895f088b0424894704c707670000008d5710c742fc02000000c74204380484b2893a8d7a0cc747fc0200000089570489378d570cc742fc02000000897a04c702e40384b28d720cc746fc020000008b7904897e04c706390000008d460cc740fc02000000c7400401000000893083fb0175558b75008d76ec3b75087303ff5520897500c746fc04000000c7460c030000008b3c24897e08c7460409000000c706090000008b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008937eb05bf0100000083ff017507be247885b2eb1a89d650ff3189fbb8247885b290e89e01000089f189c689caeb0350ff3183fe0175058b0424eb1189d789f38b0424909090e8d201000089fa83f8017507b8f47885b2eb1089d689c3b8f47885b2e82a02000089f283f80175068b442404eb1189d689c38b4424049090e86602000089f283f801750889d083c40cc2040089c389d083c40c5983c40451e99e0200009090000000003c030000|@11181,63,@1826|49,0,@11163 119,0,@11166 132,0,@5592 164,0,@11169 199,0,0 215,0,67108860 231,0,0 247,0,0 263,0,0 309,0,1 326,0,2 336,0,7 342,0,11 359,0,0 413,0,1 426,0,3 432,0,4 475,0,51 492,0,@10401 528,0,@10394 550,0,28 567,0,0 605,0,1 618,0,4 624,0,4 655,0,0 664,0,0 674,0,@11172 688,0,@11172 694,1,@11174 730,1,@11175 742,0,@11176 753,0,@11176 758,1,@11178 786,1,@11179 818,1,@11180 11163:O4|@4608,@5398,@11165,@11164 11164:O5|@9182,1327,0,1327,0 11165:S11|67656e5661725368696674 11166:O4|@4608,@5398,@11168,@11167 11167:O5|@9182,1306,0,1306,0 11168:S27|67656e56617253686966743a20646966666572656e742072656773 11169:O4|@4608,@5398,@11171,@11170 11170:O5|@9182,1307,0,1307,0 11171:S29|67656e56617253686966743a207368696674206e6f7420696e20656378 11172:O2|@11173,0 11173:O4|4,2,@5592,63 11174:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1821| 11175:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1822| 11176:O2|@11177,0 11177:O3|37,@5592,63 11178:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1823| 11179:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1824| 11180:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1825| 11181:S28|5838364c4f574c4556454c28292e67656e5661725368696674283329 11182:S31|5838364c4f574c4556454c28292e67656e5661725368696674283129283129 11183:D3,596|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b8cc7c85b28b5d049090ff138b10833a05755e8b720881e69f01000083fe01745583fe0174558b5a0881e39f010000be01000000bf0300000083fe2f750ab858f07fb28b5d04ff1389f923cb83f901751183c6028d7c3fff3b650c7303ff5524ebd7f7c601000000741683fe017d28eb15e94d010000e9dc000000e9d7000000f646ff10741189f3b88c6c7ab29090ff1588c75208eb0289f0ff7504b9527b85b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f03b4d087303ff5520894d00c741fc03000000c7011c7d85b28b5424088951048941088061ffbf89c38b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c01000000894808895804c70007000000c208008b75008d76ec3b75087303ff5520897500c746fc04000000c706107e85b2895e048b5c2408895e088b7c2404897e0c8066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000897004c70005000000c208008b75008d76ec3b75087303ff5520897500c746fc04000000c706847e85b2895e048b5c2408895e088b7c2404897e0c8066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400801000000897004c70005000000c208000000000050020000|@11195,2097151,@1831|30,0,@11184 77,0,0 82,0,1 92,0,@8999 166,0,@5215 174,0,I106 186,0,$11183+238 206,0,@5401 218,0,@8950 256,0,@8952 299,0,@11187 346,0,1 353,0,0 365,0,3 398,0,@11191 450,0,1 457,0,207 464,0,0 473,0,2 506,0,@11194 558,0,1 565,0,207 572,0,0 581,0,2 11184:O4|@4608,@5398,@11186,@11185 11185:O5|@9182,1243,0,1243,0 11186:S28|6c6f6164526573756c744172673a2062616420617267756d656e7473 11187:D3,164|3b650c7303ff55248b45008d40cc3b45087303ff5520894500c740fc010000008b4a0889088d5808c743fc02000000894b04c703030000008d730cc746fc02000000c74604d47d85b2891e8d5e0cc743fc01000000890b89c78d4308c740fc020000008958048930578b4a0489ca9090ff1289c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c3909000000000a0000000|@11190,1048575,@1828|52,0,1 69,0,@11188 149,0,0 11188:O2|@11189,0 11189:O2|1,@5592 11190:S28|5838364c4f574c4556454c28292e66696e6973686564283129283129 11191:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04ba507e85b256ff229090900000000028000000|@11193,1048575,@1829|26,0,@11192 11192:O1|@11183 11193:S36|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283129283129283129 11194:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a04ba507e85b256ff229090900000000028000000|@11193,1048575,@1830|26,0,@11192 11195:S30|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283429 11196:S33|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283129283129 11197:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a03ff720489d9bb985b84b251e9fd02fcff90000000002c000000|@9623,2097151,@1834|9,0,2 29,0,@10640 35,1,@9620 11198:S33|5838364c4f574c4556454c28292e7661726961626c655368696674283129283129 11199:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f87f85b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c700ac8685b28948048950088060ffbfc3900000000058000000|@11208,7,@1839|26,0,@11200 68,0,@11207 11200:D3,36|3b650c7303ff55248b52048b0c24891424bb0100000051e91c0000000000000020000000|@11206,2097151,@1837|18,0,0 24,1,@11201 11201:D3,1488|3b650c7303ff5524837c2404017508b801000000c2040083fb037570f6400401740f8b4804b8148685b28b5d049090ff138b40048b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b10895108c7410407000000c70109000000837c24043f7607bb3f000000eb048b5c2404515289d890ff15a8c552089090ff1568c55208eb05e95a00000081e0ff0100008b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701650000008d4114c740fc02000000c7400401000000890889c18d400cc740fc02000000894804598908c2040083fb05756cf6400401740f8b4804b8148685b28b5d049090ff138b4004837c24043f76558b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108030000008b00894104c7014b0000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908eb05e9a9000000c204008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b10895108c7410407000000c7010900000052518b44240c90ff15a8c552089090ff1568c5520881e0ff0100008b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c050000008b542404895108894104c701650000008d4114c740fc02000000c7400401000000890889c18d400cc740fc020000008948045983c4048908c20400f6400401740d8b4804b8148685b28b5d04ff138b4004837c24043f764e8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108030000008b00894104c7014b0000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c20400837c240407755d8b4d008d49d03b4d087303ff5520894d00c741fc020000008b10895104c701070000008d590cc743fc05000000895310c7430cf3ffffff894b08c7430401000000c7033d0000008d4318c740fc02000000c74004010000008918c20400837c240405755d8b4d008d49d03b4d087303ff5520894d00c741fc020000008b10895104c701050000008d590cc743fc05000000895310c7430cfbffffff894b08c7430401000000c7033d0000008d4318c740fc02000000c74004010000008918c20400837c24040375658b4d008d49c83b4d087303ff5520894d00c741fc010000008b1089118d5908c743fc02000000895304c703010000008d730cc746fc05000000895610c7460cffffffff895e08894e04c7063d0000008d4618c740fc02000000c74004010000008930c20400837c2404417364b9030000008b542404ff3083fa3f735989c889d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c0901f6c201740783fa017d19eb06f642ff1074115089d3b88c6c7ab290ff1588c75208eb0589c189d05189c358ff15c8c75208eb2be9d500000052bb8c6c7ab289c8909090ff15c8c752085983e93e89ca89c13b650c7303ff5524e97cffffffa801740583e8027105ff5538ebf68b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b0424894108c7410409000000c70109000000518b44240cff15a8c552089090ff1568c5520881e0ff0100008b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c010000008b542404895108894104c701650000008d4114c740fc02000000c7400401000000890889c18d400cc740fc020000008948045983c4048908c204008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b10895108c7410407000000c7010900000052518b44240c909090ff15a8c552089090ff1568c5520881e0ff0100008b4d008d49b43b4d087303ff5520894d00c741fc04000000c7410c010000008b542404895108894104c701650000008d4114c740fc04000000c7400c03000000895008c7400409000000c700090000008d5014c742fc02000000c742040100000089028d420cc740fc02000000895004890889c18d400cc740fc020000008948045983c4048908c20400909000000000cc050000|@11205,2097151,@1836|16,0,0 38,0,@11202 79,0,1 91,0,3 97,0,4 109,0,31 126,0,I91 134,0,I89 178,0,1 191,0,50 208,0,0 250,0,@11202 298,0,1 309,0,37 340,0,0 383,0,1 395,0,3 401,0,4 414,0,I91 422,0,I89 459,0,2 475,0,50 492,0,0 532,0,@11202 578,0,1 589,0,37 620,0,0 667,0,3 687,0,-7 697,0,0 703,0,30 720,0,0 767,0,2 787,0,-3 797,0,0 803,0,30 820,0,0 879,0,0 899,0,-1 911,0,30 928,0,0 945,0,1 965,0,1 978,0,31 1015,0,@5215 1022,0,I106 1038,0,I108 1051,0,@5215 1062,0,I108 1137,0,4 1143,0,4 1154,0,I91 1162,0,I89 1199,0,0 1215,0,50 1232,0,0 1289,0,1 1301,0,3 1307,0,4 1322,0,I91 1330,0,I89 1367,0,0 1383,0,50 1400,0,1 1410,0,4 1416,0,4 1433,0,0 11202:O4|@4608,@5398,@11204,@11203 11203:O5|@9182,1298,0,1298,0 11204:S13|67656e436f6e73745368696674 11205:S30|5838364c4f574c4556454c28292e67656e436f6e73745368696674283329 11206:S33|5838364c4f574c4556454c28292e67656e436f6e73745368696674283129283129 11207:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e940daffff0000000020000000|@11114,2097151,@1838|24,1,@11094 11208:S33|5838364c4f574c4556454c28292e636f6e7374616e745368696674283129283129 11209:S30|5838364c4f574c4556454c28292e696e7374725570736869667457283129 11210:O1|@11211 11211:D3,260|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b86c7285b28b5d049090ff1350ff308b0189daff1283f80175378b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c700588885b289c18d400cc740fc01000000890883c408c3f60001750e8b08b808a87cb28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c701dc8985b28b008941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b142489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c408c39090900000000000010000|@11222,1048575,@1849|30,0,@11153 88,0,@11212 118,0,@7422 155,0,@11219 195,0,0 11212:O1|@11213 11213:D3,84|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c88885b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700988985b28948048060ffbfc3900000000050000000|@11198,3,@1845|26,0,@11214 63,0,@11218 11214:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700148985b28948048b52048950088060ffbfc390900000000034000000|@11196,7,@1843|28,0,@11215 11215:D3,44|3b650c7303ff5524b9548985b28b1c24890c24ff720889d98b5a0451e92ff1ffff9090900000000028000000|@11193,2097151,@1842|9,0,@11216 29,1,@11183 11216:O1|@11217 11217:D3,40|3b650c7303ff5524b9050000008b1424890c248b58048b0889c852e970eaffff0000000024000000|@11182,63,@1841|9,0,2 28,1,@11162 11218:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a03ff720489d9bb985b84b251e97df8fbff90000000002c000000|@9623,2097151,@1844|9,0,2 29,0,@10640 35,1,@9620 11219:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7014c8a85b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c700848a85b28948048950088060ffbfc3900000000058000000|@11208,7,@1848|26,0,@11220 68,0,@11221 11220:D3,36|3b650c7303ff55248b52048b0c24891424bb0500000051e9c8f5ffff0000000020000000|@11206,2097151,@1846|18,0,2 24,1,@11201 11221:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e968d6ffff0000000020000000|@11114,2097151,@1847|24,1,@11094 11222:S32|5838364c4f574c4556454c28292e696e737472446f776e736869667457283129 11223:O1|@11224 11224:D3,260|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b86c7285b28b5d049090ff1350ff308b0189daff1283f80175378b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c700048c85b289c18d400cc740fc01000000890883c408c3f60001750e8b08b808a87cb28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c701888d85b28b008941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b142489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c408c39090900000000000010000|@11235,1048575,@1858|30,0,@11153 88,0,@11225 118,0,@7422 155,0,@11232 195,0,0 11225:O1|@11226 11226:D3,84|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701748c85b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700448d85b28948048060ffbfc3900000000050000000|@11198,3,@1854|26,0,@11227 63,0,@11231 11227:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700c08c85b28948048b52048950088060ffbfc390900000000034000000|@11196,7,@1852|28,0,@11228 11228:D3,44|3b650c7303ff5524b9008d85b28b1c24890c24ff720889d98b5a0451e983edffff9090900000000028000000|@11193,2097151,@1851|9,0,@11229 29,1,@11183 11229:O1|@11230 11230:D3,40|3b650c7303ff5524b9030000008b1424890c248b58048b0889c852e9c4e6ffff0000000024000000|@11182,63,@1850|9,0,1 28,1,@11162 11231:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a03ff720489d9bb985b84b251e9d1f4fbff90000000002c000000|@9623,2097151,@1853|9,0,2 29,0,@10640 35,1,@9620 11232:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f88d85b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c700308e85b28948048950088060ffbfc3900000000058000000|@11208,7,@1857|26,0,@11233 68,0,@11234 11233:D3,36|3b650c7303ff55248b52048b0c24891424bb0300000051e91cf2ffff0000000020000000|@11206,2097151,@1855|18,0,1 24,1,@11201 11234:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9bcd2ffff0000000020000000|@11114,2097151,@1856|24,1,@11094 11235:S37|5838364c4f574c4556454c28292e696e737472446f776e7368696674417269746857283129 11236:O1|@11237 11237:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701ec8e85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1861|29,0,@11238 11238:O1|@11239 11239:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700388f85b28948048060ffbfc3000000002c000000|@11059,3,@1860|28,0,@11240 11240:D3,40|3b650c7303ff5524b96c6e85b28b1c24890c2489d98b5a0451e9beabffff90900000000024000000|@11026,2097151,@1859|9,0,@11131 26,1,@11023 11241:O1|@11242 11242:D3,508|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b88c9185b28b5d049090ff13ff30ff3150909090e81a020000a8017562f640040175618b480483790401755df60101755d8b118b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703b89285b28b328973048063ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008b442408eb14e918010000e93b000000e936000000e93100000089078b45008d40ec3b45087303ff5520894500c740fc02000000897804891889c38d400cc740fc01000000891883c40cc3f640040175698b4804837904017565f6000175658b108b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703989385b28b328973048063ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008b44240489078b45008d40ec3b45087314eb0fe92e000000e929000000e924000000ff5520894500c740fc02000000897804891889c18d400cc740fc01000000890883c40cc38b45008d40ec3b45087303ff5520894500c740fc020000008b0c24894804c700789485b289c18d400cc740fc01000000890883c40cc38b45008d40ec3b45087303ff5520894500c740fc020000008b0c248948049090c700cc9b85b289c18d400cc740fc01000000890883c40cc390909000000000f8010000|@11300,1048575,@1882|30,0,@11243 50,1,@11246 106,0,@11247 146,0,0 273,0,@11250 313,0,0 419,0,@11253 475,0,@11296 11243:O4|@4608,@5398,@11245,@11244 11244:O5|@9182,1432,0,1432,0 11245:S9|696e7374724d756c57 11246:D3,216|3b650c7303ff5524a801756153ff70048b0089daff12a8017558f60001750e8b08b808a87cb28b5d049090ff138338017507b801000000eb5c8b00b90100000083f803751c8b45008d40f83b45087303ff5520894500c740fc010000008908eb3489c283e20383fa037513eb0ae958000000e919000000b801000000eb17d1e883c80183c1023b650c7303ff5524ebb0b801000000508b5c24088b442404909090e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c300000000d4000000|@6329,1048575,@1862|34,0,@7422 51,0,0 60,0,0 120,0,0 145,0,0 203,0,0 11247:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701289385b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c700609385b28948048950088060ffbfc3900000000058000000|@11208,7,@1865|26,0,@11248 68,0,@11249 11248:D3,36|3b650c7303ff55248b52048b0c24891424bb0100000051e9ececffff0000000020000000|@11206,2097151,@1863|18,0,0 24,1,@11201 11249:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e98ccdffff0000000020000000|@11114,2097151,@1864|24,1,@11094 11250:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701089485b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c700409485b28948048950088060ffbfc3900000000058000000|@11208,7,@1868|26,0,@11251 68,0,@11252 11251:D3,36|3b650c7303ff55248b52048b0c24891424bb0100000051e90cecffff0000000020000000|@11206,2097151,@1866|18,0,0 24,1,@11201 11252:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9acccffff0000000020000000|@11114,2097151,@1867|24,1,@11094 11253:O1|@11254 11254:D3,16|b8a49485b2c39090000000000c000000|@11295,1,@1879|1,0,@11255 11255:O1|@11256 11256:D3,28|3b650c7303ff5524bbdc9485b2e90a01000090900000000018000000|@11290,31,@1878|9,0,@11257 14,1,@11270 11257:O1|@11258 11258:D3,16|b8089585b2c39090000000000c000000|@11269,1,@1869|1,0,@11259 11259:O2|@11261,@11260 11260:O2|@11263,@11262 11261:O2|36,@8794 11262:O2|@11265,@11264 11263:O4|4,0,@5643,1 11264:O2|@11267,@11266 11265:O3|25,@8794,3 11266:O2|@11268,0 11267:O4|50,1,@8794,2 11268:O4|4,4,@5643,1 11269:S36|5838364c4f574c4556454c28292e67656e4d756c7469706c79556e7369676e6564283129 11270:D3,392|a8017558f640040175578b48048379040175538b10833a0575518b720883e60383fe01746b83fe01746b8b75008d76f43b75087303ff5520897500c746fc02000000c706649785b2895e048066ffbf8b45008d40e83b45087319eb14e9a3000000e99e000000e999000000e994000000ff5520894500c740fc05000000c7401003000000c7400c01000000897008eb0ae913000000e90e000000c74004f0a47ab2c70007000000c38b75008d76f43b75087303ff5520897500c746fc02000000c706c89a85b2895e048066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c03000000c7400801000000897004c70005000000c3a801750ff640040175098b400483780401740ab8249b85b28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000c700509b85b28958048060ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c03000000c7400801000000894804c70005000000c3900000000084010000|@11294,31,@1877|68,0,@11271 128,0,1 135,0,0 157,0,@5643 163,0,3 194,0,@11288 232,0,1 239,0,1 246,0,0 255,0,2 280,0,@11291 315,0,@11293 355,0,1 362,0,1 369,0,0 378,0,2 11271:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@11282,31,@1874|12,1,@11272 11272:D3,392|a8017558f640040175578b48048379040175538b11833a0575518b720883e60983fe01746b83fe01746b8b75008d76f43b75087303ff5520897500c746fc02000000c7062c9985b2895e048066ffbf8b45008d40e83b45087319eb14e9a3000000e99e000000e999000000e994000000ff5520894500c740fc05000000c7401003000000c7400c03000000897008eb0ae913000000e90e000000c74004dcc27fb2c70007000000c38b75008d76f43b75087303ff5520897500c746fc02000000c706cc9985b2895e048066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c09000000c7400803000000897004c70005000000c3a801750ff640040175098b400483780401740ab8289a85b28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000c700749a85b28958048060ffbf89c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c09000000c7400803000000894804c70005000000c3900000000084010000|@11287,31,@1873|68,0,@11273 128,0,1 135,0,1 157,0,@8794 163,0,3 194,0,@11280 232,0,1 239,0,4 246,0,1 255,0,2 280,0,@11283 315,0,@11286 355,0,1 362,0,4 369,0,1 378,0,2 11273:D3,72|3b650c7303ff5524b8889985b28b5204ff1289c18b45008d40f03b45087303ff5520894500c740fc03000000894808c74004949985b2c70001000000c39090900000000044000000|@11190,1048575,@1870|9,0,@11274 50,0,@11275 56,0,0 11274:O2|@11276,@11275 11275:O1|@5643 11276:O2|@11278,@11277 11277:O2|@11279,0 11278:O2|1,@5643 11279:O2|1,@8794 11280:D3,28|3b650c7303ff55248b5a04bafc9985b2ff2290900000000018000000|@11282,1048575,@1871|12,0,@11281 11281:O1|@11272 11282:S28|5838364c4f574c4556454c28292e6c6f616441726732283129283129 11283:O4|@4608,@5398,@11285,@11284 11284:O5|@9182,1376,0,1376,0 11285:S23|6c6f6164417267313a2062616420617267756d656e7473 11286:D3,28|3b650c7303ff55248b5a04bafc9985b2ff2290900000000018000000|@11282,1048575,@1872|12,0,@11281 11287:S25|5838364c4f574c4556454c28292e6c6f616441726732283229 11288:D3,28|3b650c7303ff55248b5a04baf89a85b2ff2290900000000018000000|@11290,1048575,@1875|12,0,@11289 11289:O1|@11270 11290:S28|5838364c4f574c4556454c28292e6c6f616441726731283129283129 11291:O4|@4608,@5398,@11285,@11292 11292:O5|@9182,1365,0,1365,0 11293:D3,28|3b650c7303ff55248b5a04baf89a85b2ff2290900000000018000000|@11290,1048575,@1876|12,0,@11289 11294:S25|5838364c4f574c4556454c28292e6c6f616441726731283229 11295:S29|5838364c4f574c4556454c28292e696e7374724d756c57283229283129 11296:O1|@11297 11297:D3,16|b8f89b85b2c39090000000000c000000|@11295,1,@1881|1,0,@11298 11298:O1|@11299 11299:D3,28|3b650c7303ff5524bbdc9485b2e9b6f9ffff90900000000018000000|@11290,31,@1880|9,0,@11257 14,1,@11270 11300:S26|5838364c4f574c4556454c28292e696e7374724d756c57283229 11301:O1|@11302 11302:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701a89c85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1885|29,0,@11303 11303:O1|@11304 11304:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700f49c85b28948048060ffbfc3000000002c000000|@11059,3,@1884|28,0,@11305 11305:D3,40|3b650c7303ff5524b9309d85b28b1c24890c2489d98b5a0451e9029effff90900000000024000000|@11026,2097151,@1883|9,0,@11306 26,1,@11023 11306:O2|0,@11132 11307:O1|@11308 11308:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701909d85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1888|29,0,@11309 11309:O1|@11310 11310:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700dc9d85b28948048060ffbfc3000000002c000000|@11059,3,@1887|28,0,@11311 11311:D3,40|3b650c7303ff5524b9189e85b28b1c24890c2489d98b5a0451e91a9dffff90900000000024000000|@11026,2097151,@1886|9,0,@11312 26,1,@11023 11312:O2|4,@11132 11313:O1|@11314 11314:D3,360|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b8a89f85b28b5d049090ff1350ff308b0189daff12a8017558f60001750e8b08b808a87cb28b5d049090ff138338017507b801000000eb558b00b90100000083f803751c8b45008d40f83b45087303ff5520894500c740fc010000008908eb2d89c283e20383fa03750cb801000000eb1ce912000000d1e883c80183c1023b650c7303ff5524ebb7b80100000083f80175378b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c700e89f85b289c18d400cc740fc01000000890883c408c38b4d008d49f43b4d087303ff5520894d00c741fc02000000c701eca885b28b008941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b142489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c408c390900000000064010000|@10896,1048575,@1907|30,0,@11315 62,0,@7422 79,0,0 88,0,0 136,0,0 166,0,0 208,0,@11318 256,0,@11360 296,0,0 11315:O4|@4608,@5398,@11317,@11316 11316:O5|@9182,1516,0,1516,0 11317:S11|636865636b506f77657232 11318:O1|@11319 11319:D3,16|b814a085b2c39090000000000c000000|@11359,1,@1903|1,0,@11320 11320:O1|@11321 11321:D3,16|b840a085b2c39090000000000c000000|@11358,1,@1902|1,0,@11322 11322:O3|1,4,@11323 11323:O1|@11324 11324:D3,16|b87ca085b2c39090000000000c000000|@11357,1,@1901|1,0,@11325 11325:O1|@11326 11326:D3,48|3b650c7303ff5524b9030000008b1424890c246a036a0168c8a085b2bb54a885b252e991e1fbff90000000002c000000|@9623,2097151,@1900|9,0,1 24,0,@11327 29,0,@11356 35,1,@9620 11327:O1|@11328 11328:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70014a185b28948048060ffbfc3000000002c000000|@10255,3,@1899|28,0,@11329 11329:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a016a036858a185b289d98b5a0451e901e1fbff90000000002c000000|@9623,2097151,@1898|9,0,207 24,0,@11330 35,1,@9620 11330:O1|@11331 11331:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700a4a185b28948048060ffbfc3000000002c000000|@9619,3,@1897|28,0,@11332 11332:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000536a03e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,63,@1896|22,1,@11333 30,1,@11334 69,0,0 11333:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1889|23,0,@6769 84,0,0 11334:D3,744|3b650c7303ff5524a8017516f640040175108b48048b11833a03750683790401740f89c1b880a585b28b5d04909090ff138b5d008d5bd83b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4708c740fc01000040c700010000008d4808c741fc01000040c70101000000ff72048b55008d52b03b55087303ff5520895500c742fc05000000897210895a0c897a08894a048902c700030000008d4218c740fc04000000c7400c05000000895008c7400413000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc0200000089500489088d480cc741fc020000008b50048951048b188919813c24f0a47ab274378b3424833e017411833e03750c837e04017506837e0801741e81fedcc27fb27416833e01741d833e037518837e04057512837e0801750cb8c0a585b28b5d049090ff13837c2408017507bfeca585b2eb05bf18a685b28b75008d76ec3b75087303ff5520897500c746fc04000000c7460c030000008b1c24895e08c7460401000000c706090000008b5d008d5bac3b5d087303ff5520895d00c743fc03000000c74308010000008b0424894304c703330000008d5310c742fc02000000c7420440a685b2891a8d5a0cc743fc0200000089530489338d530cc742fc020000008b7104897204c702390000008d420cc740fc02000000c740040100000089108d500cc742fc04000000c7420c030000005e897208c7420409000000c702090000008b75008d76f43b75087303ff5520897500c746fc02000000c7460401000000891683fe0175048b09eb12535089f38b01909090e86601000089c1eb02535083f9017507b8b8a685b2eb0e89cbb8b8a685b29090e8b601000083f80175058b0424eb0a89c38b0424e8fa01000083f80175068b442404eb0d89c38b4424049090e83a02000083f801750889f883c408c2040089c389f883c4085983c40451e97402000000000000e4020000|@11355,63,@1895|37,0,@11335 75,0,0 91,0,67108860 107,0,0 123,0,0 139,0,0 186,0,1 203,0,2 213,0,9 219,0,11 236,0,0 280,0,@5643 313,0,@8794 342,0,@11338 361,0,@11340 368,0,@11343 399,0,1 412,0,0 418,0,4 449,0,0 461,0,25 478,0,@11346 517,0,28 534,0,0 553,0,1 564,0,4 570,0,4 601,0,0 626,1,@11348 642,0,@11349 651,0,@11349 658,1,@11351 678,1,@11352 702,1,@11353 732,1,@11354 11335:O4|@4608,@5398,@11337,@11336 11336:O5|@9182,1497,0,1497,0 11337:S9|67656e4469764d6f64 11338:O4|@4608,@5398,@11337,@11339 11339:O5|@9182,1476,0,1476,0 11340:O2|@10631,@11341 11341:O2|@11342,0 11342:O4|4,0,@8794,1 11343:O2|@11261,@11344 11344:O2|@11345,0 11345:O3|59,@5643,@5643 11346:O2|@11347,@11266 11347:O4|7,5,@8794,@8794 11348:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1890| 11349:O2|@11350,0 11350:O2|10,52 11351:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1891| 11352:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1892| 11353:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1893| 11354:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1894| 11355:S26|5838364c4f574c4556454c28292e67656e4469764d6f64283329 11356:O2|@5424,@11275 11357:S38|5838364c4f574c4556454c28292e676574576f726b696e675265676973746572283429283129 11358:S41|5838364c4f574c4556454c28292e676574576f726b696e675265676973746572283129283129283129 11359:S30|5838364c4f574c4556454c28292e6469764d6f64436f6465283129283129 11360:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7015ca985b28b52048951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000c70094a985b28948048950088060ffbfc3900000000058000000|@11208,7,@1906|26,0,@11361 68,0,@11362 11361:D3,36|3b650c7303ff55248b52048b0c24891424bb0500000051e9b8d6ffff0000000020000000|@11206,2097151,@1904|18,0,2 24,1,@11201 11362:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e958b7ffff0000000020000000|@11114,2097151,@1905|24,1,@11094 11363:O1|@11364 11364:D3,360|3b650c7303ff5524a801750ff640040175098b480483790401740e89c1b8a89f85b28b5d049090ff1350ff308b0189daff12a8017558f60001750e8b08b808a87cb28b5d049090ff138338017507b801000000eb558b00b90100000083f803751c8b45008d40f83b45087303ff5520894500c740fc010000008908eb2d89c283e20383fa03750cb801000000eb1ce912000000d1e883c80183c1023b650c7303ff5524ebb7b80100000083f80175378b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c70050ab85b289c18d400cc740fc01000000890883c408c38b4d008d49f43b4d087303ff5520894d00c741fc02000000c70100ae85b28b008941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b142489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c408c390900000000064010000|@10896,1048575,@1921|30,0,@11315 62,0,@7422 79,0,0 88,0,0 136,0,0 166,0,0 208,0,@11365 256,0,@11383 296,0,0 11365:O1|@11366 11366:D3,16|b87cab85b2c39090000000000c000000|@11359,1,@1916|1,0,@11367 11367:O1|@11368 11368:D3,16|b8a8ab85b2c39090000000000c000000|@11358,1,@1915|1,0,@11369 11369:O3|1,4,@11370 11370:O1|@11371 11371:D3,16|b8e4ab85b2c39090000000000c000000|@11357,1,@1914|1,0,@11372 11372:O1|@11373 11373:D3,48|3b650c7303ff5524b9030000008b1424890c246a036a016830ac85b2bbecad85b252e929d6fbff90000000002c000000|@9623,2097151,@1913|9,0,1 24,0,@11374 29,0,@11381 35,1,@9620 11374:O1|@11375 11375:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7007cac85b28948048060ffbfc3000000002c000000|@10255,3,@1912|28,0,@11376 11376:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a016a0368c0ac85b289d98b5a0451e999d5fbff90000000002c000000|@9623,2097151,@1911|9,0,207 24,0,@11377 35,1,@9620 11377:O1|@11378 11378:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7000cad85b28948048060ffbfc3000000002c000000|@9619,3,@1910|28,0,@11379 11379:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000536a01e856f5ffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,63,@1909|22,1,@11380 30,1,@11334 69,0,0 11380:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1908|23,0,@6769 84,0,0 11381:O2|@5424,@11382 11382:O1|@8794 11383:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@11392,15,@1920|12,1,@11384 11384:D3,92|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7019cae85b28959048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc030000009090c70030b085b28948048950088060ffbfc390900000000058000000|@11391,15,@1919|26,0,@11385 67,0,@11390 11385:D3,280|3b650c7303ff5524f6400401740f8b4804b8c8af85b28b5d049090ff138b4004837a043f7606b801000000c38b520483c202b903000000ff3083fa3f735689c889d1ba0300000083ea0183f93f7605b93f000000d1e9d3e283ca018d4c0901f6c201740783fa017d1beb06f642ff1074135089d3b88c6c7ab2909090ff1588c75208eb0589c189d05189c358ff15c8c75208eb2052bb8c6c7ab289c8ff15c8c752085983e93e89ca89c13b650c7303ff5524eb85a801740583e8027105ff5538ebf68b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c58894108c7410403000000c701090000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c30000000014010000|@11389,2097151,@1917|18,0,@11386 39,0,0 51,0,1 67,0,1 80,0,31 117,0,@5215 126,0,I106 142,0,I108 150,0,@5215 158,0,I108 228,0,1 234,0,4 265,0,0 11386:O4|@4608,@5398,@11388,@11387 11387:O5|@9182,1461,0,1461,0 11388:S7|67656e4d61736b 11389:S35|5838364c4f574c4556454c28292e6d61736b4269747328322967656e4d61736b283129 11390:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9bcb0ffff0000000020000000|@11114,2097151,@1918|24,1,@11094 11391:S25|5838364c4f574c4556454c28292e6d61736b42697473283229 11392:S28|5838364c4f574c4556454c28292e6d61736b42697473283129283129 11393:O1|@11394 11394:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70104b185b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1940|29,0,@11395 11395:O1|@11396 11396:D3,132|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a4b185b28941048061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c70278bc85b2894204894a088062ffbf89c18b45008d40f03b45087303ff5520894500c740fc030000009090c70030bd85b28948048950088060ffbfc390900000000080000000|@11429,7,@1939|26,0,@11397 63,0,@11418 107,0,@11421 11397:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700f0b185b28b52048950048948088060ffbfc390900000000034000000|@11417,7,@1931|28,0,@11398 11398:D3,188|3b650c7303ff55248b4208837804017562ff30ff3424bb9f0100008b4204909090e8f6dcfbff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c0b285b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c38b58048b0889c8909090e82e090000536a01e88201000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c3909000000000b8000000|@11416,2097151,@1930|23,0,207 34,1,@9637 64,0,@11399 110,0,1 126,1,@11415 134,1,@11402 173,0,0 11399:D3,64|8b4d008d49e83b4d087303ff5520894d00c741fc0100000089018d4108c740fc03000000c70014b385b28948048b52048950088060ffbfc3000000003c000000|@10893,7,@1928|38,0,@11400 11400:D3,92|3b650c7303ff552489d38b4308e85e000000536a018b4b0489cb909090e8c60000008b0c2489c28b45008d40f03b45087303ff5520894500c740fc030000008950088b490483c404894804c70001000000c390900000000058000000|@9618,2097151,@1927|14,1,@11401 30,1,@11402 77,0,0 11401:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1922|23,0,@6769 84,0,0 11402:D3,1488|3b650c7303ff5524a801740d89c1b8e0b985b28b5d0490ff138b088339037553f6400401740f8b5004b8e0b985b28b5d049090ff138b50048b32833e057555837a04017554f6c3017554837c2404037552f6460401750ab808a87cb28b5d04ff138b7e04f7c701000000740c83ff017d37eb0be928040000f647ff10742aff33ff710489fbb88c6c7ab29090ff1588c75208eb1be98a000000e985000000e980000000e97b00000089f8ff33ff7104bb09000000ff15c8c752088b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc7410834c47fb258894104c701010000008b45008d40e43b45087303ff5520894500c740fc0300000089480859894804c7004500000089c18d4010c740fc02000000c74004010000008908c20400833e057558837a04017557f6c3017557837c24040175558b7d008d7ff03b7d087303ff5520897d00c747fc030000008b03894708894704c70777000000f6460401750bb808a87cb28b5d0490ff138b5604f6c201741b83fa017d32eb1ae9be000000e9b9000000e9b4000000e9af000000f642ff107416ff7104575089d3b88c6c7ab29090ff1588c75208eb0889d0ff710457ff338b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc7410834c47fb28b442408894104c701010000008b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c7003f0000008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c4048908c20400833e037563837a04017562f6c3017562837c24040375608b7d008d7fe03b7d087303ff5520897d00c747fc020000008b4604894704c707030000008d570cc742fc04000000c7420cfdffffff897a088b4904894a04c702010000008b4d008d49e43b4d087319eb14e940000000e93b000000e936000000e931000000ff5520894d00c741fc030000008951088b1b895904c701450000008d4110c740fc02000000c74004010000008908c20400833e037512837a0401750cf6c3017507837c240401740ab8e0b985b28b5d04ff138b7e043b3b7469833f0175118b0383380175268b57043b5004751eeb58833f0375178b0383380375108b57043b500475088b57083b500874458b45008d40e83b45087303ff5520894500c740fc020000008b5604895004c700490000008d780cc747fc02000000c7470401000000eb0ae909000000e9040000008907eb05bf010000008b45008d40f03b45087303ff5520894500c740fc030000008b13895008895004c700770000008b55008d52f43b55087303ff5520895500c742fc02000000ff71048b4e04894a04c702010000008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008951085a895104c701010000008b55008d52b83b55087303ff5520895500c742fc03000000894a088b1b895a04c7023f0000008d4a10c741fc04000000c7410c050000008b7604897108c7410403000000c701650000008d5914c743fc02000000c7430401000000890b8d4b0cc741fc0200000089590489118d510cc742fc02000000894a04890283fa01750589f8c2040089d389f85983c40451e98401000083390574108b5004b8e0b985b28b5d04909090ff13f640040175158b50048b32833e05750b837a04017505f6c301740d8b5004b8e0b985b28b5d04ff13f64604017418f6460401750cb808a87cb28b5d049090ff13837e0401740ab878ba85b28b5d04ff13837c240401744c8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4104894704c707030000008b45008d40f43b45087303ff5520894500c740fc020000008978048b1b89189090e872010000eb4a8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b4104894704c707030000008b45008d40f43b45087303ff5520894500c740fc020000008978048b1b89189090e87e01000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c2040000000000cc050000|@11414,2097151,@1926|15,0,@11403 42,0,@11403 88,0,@7422 134,0,@5215 142,0,I106 176,0,4 182,0,I108 216,0,@8817 226,0,0 263,0,34 282,0,0 348,0,59 359,0,@7422 418,0,@5215 426,0,I106 470,0,@8817 483,0,0 520,0,31 551,0,0 634,0,1 651,0,-2 666,0,0 726,0,34 743,0,0 776,0,@11403 874,0,36 891,0,0 912,0,0 950,0,59 989,0,0 1020,0,0 1033,0,0 1071,0,31 1088,0,2 1101,0,1 1107,0,50 1124,0,0 1180,1,@11406 1193,0,@11403 1236,0,@11403 1258,0,@7422 1276,0,@11407 1324,0,1 1362,1,@11410 1400,0,1 1438,1,@11412 1471,0,0 11403:O4|@4608,@5398,@11405,@11404 11404:O5|@9182,726,0,726,0 11405:S12|67656e4c6f6164496e737472 11406:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1923| 11407:O4|@4608,@5398,@11409,@11408 11408:O5|@9182,690,0,690,0 11409:S21|67656e4c6f6164576f72643a206e6f74207a65726f 11410:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70045000000c390900000000030000000|@11411,7,@1924|37,0,34 11411:S8|4c6f61644d656d52 11412:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7003f000000c390900000000030000000|@11413,7,@1925|37,0,31 11413:S9|4c6f61644279746552 11414:S29|5838364c4f574c4556454c28292e67656e4c6f6164496e737472283329 11415:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1929|23,0,@6769 84,0,0 11416:S40|5838364c4f574c4556454c28292e676574526573756c745265676973746572283129283129283129 11417:S37|5838364c4f574c4556454c28292e676574526573756c745265676973746572283129283129 11418:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700c8bc85b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@11420,15,@1933|28,0,@11419 11419:D3,40|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a0456e985cbfbff900000000024000000|@9636,2097151,@1932|27,1,@9633 11420:S35|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283129283129 11421:D3,44|3b650c7303ff55248b4a048b1c24890c246a01ff720889debb985b84b256e91d000000900000000028000000|@11425,2097151,@1938|25,0,@10640 31,1,@11422 11422:D3,1408|3b650c7303ff5524a801755af640040175598b48048b11833a0575648b720881e69f01000083fe01745b83fe01745b8b720881e69f010000ff33ff7304ff74240489f38b4424189090e84ed1fbffb901000000ba0300000083f92f751889c3b858f07fb2eb0ae997040000e97c0300008b5d04ff1389d323d883fb017522eb0fe967030000e95f010000e95a01000083c1028d5412ff3b650c7303ff5524ebb8f6c101740783f9017d1aeb06f641ff10741289cbb88c6c7ab2909090ff1588c75208eb0289c8ff7504b96ebe85b251896504a801740583f82f720e89c1b8cc7b7ab28b5d049090ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff13833c2401751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb038b0c248b55008d52f43b55087303ff5520895500c742fc02000000894204c702030000006a016a01506a03528d54240c5289cb8b44241c909090e81ebbfbff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b54241890ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c030000008948085983c410894804c70007000000c20c00837c24080174628b720481e69f01000083fe01745983fe0174598b720481e69f010000bf01000000b80300000083ff2f750e89c1b858f07fb28b5d049090ff1389c123ce83f901751183c7028d4400ff3b650c7303ff5524ebd3f7c701000000741683ff017d28eb15e922010000e91d010000e918010000f647ff1074115389fbb88c6c7ab290ff1588c75208eb0389f853ff7504b922c085b251896504a801740583f82f720d89c1b8cc7b7ab28b5d0490ff13b944d47fb28b4441fe83c40459894d04eb269090908b650483c4045b895d04833817750c89c1b820d67fb28b5d04ff138b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b14246a016a01506a03518d4c240c518b5a048b029090e88eb9fbff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b54241490ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c7401001000000c7400c030000008948085983c40c894804c70007000000c20c008b75008d76e83b75087303ff5520897500c746fc05000000c70604c385b2895e048b5c240c895e088b7c2408897e0c8b4424048946108066ffbf8b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400803000000897004c70005000000c20c00f6400401756a8b48048b11833a0775658379040175648b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c706050000006a016a01506a03568d74240c568b7304ff3389f3589090e85eb8fbff8b45008d40f43b45087303ff5520894500c740fc02000000eb0fe92c000000e927000000e9220000008b4c24088948048b4c240489088b542410ff1289c15883c40889ca5983c40c51ff228b45008d40e83b45087303ff5520894500c740fc05000000c70074c385b28958048b4c240c8948088b54240889500c8b5c24048958108060ffbf89c68b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400803000000897004c70005000000c20c008b45008d40e83b45087303ff5520894500c740fc05000000c700b4c385b28958048b4c240c8948088b54240889500c8b5c24048958108060ffbf89c68b45008d40e83b45087303ff5520894500c740fc05000000c7401003000000c7400c9f010000c7400803000000897004c70005000000c20c0090000000007c050000|@11428,2097151,@1937|74,1,@9637 79,0,0 84,0,1 96,0,@8999 181,0,@5215 190,0,I106 202,0,$11422+254 222,0,@5401 234,0,@8950 272,0,@8952 355,0,1 382,1,@9594 459,0,1 466,0,1 482,0,3 525,0,0 530,0,1 542,0,@8999 619,0,@5215 626,0,I106 639,0,$11422+690 659,0,@5401 670,0,@8950 708,0,@8952 754,0,1 782,1,@9594 859,0,0 866,0,1 882,0,3 915,0,@11423 974,0,1 981,0,207 988,0,1 997,0,2 1058,0,2 1086,1,@9594 1191,0,@11426 1252,0,1 1259,0,207 1266,0,1 1275,0,2 1308,0,@11427 1369,0,1 1376,0,207 1383,0,1 1392,0,2 11423:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720cff721089de8b5a04ba44c385b256ff220000000028000000|@11425,1048575,@1934|29,0,@11424 11424:O1|@11422 11425:S32|5838364c4f574c4556454c28292e6c6f6164496e646578283129283129283129 11426:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720cff721089de8b5a04ba44c385b256ff220000000028000000|@11425,1048575,@1935|29,0,@11424 11427:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720cff721089de8b5a04ba44c385b256ff220000000028000000|@11425,1048575,@1936|29,0,@11424 11428:S26|5838364c4f574c4556454c28292e6c6f6164496e646578283529 11429:S31|5838364c4f574c4556454c28292e67656e4c6f6164576f7264283129283129 11430:O1|@11431 11431:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70194c485b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1951|29,0,@11432 11432:O1|@11433 11433:D3,132|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70134c585b28941048061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c70204c885b2894204894a088062ffbf89c18b45008d40f03b45087303ff5520894500c740fc030000009090c70090c885b28948048950088060ffbfc390900000000080000000|@11429,7,@1950|26,0,@11434 63,0,@11440 107,0,@11442 11434:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c70080c585b28b52048950048948088060ffbfc390900000000034000000|@11417,7,@1946|28,0,@11435 11435:D3,188|3b650c7303ff55248b4208837804017562ff30ff3424bb9f0100008b4204909090e866c9fbff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70150c685b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c38b58048b0889c8909090e88a010000536a03e8f2edffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c3909000000000b8000000|@11416,2097151,@1945|23,0,207 34,1,@9637 64,0,@11436 110,0,1 126,1,@11439 134,1,@11402 173,0,0 11436:D3,64|8b4d008d49e83b4d087303ff5520894d00c741fc0100000089018d4108c740fc03000000c700a4c685b28948048b52048950088060ffbfc3000000003c000000|@10893,7,@1943|38,0,@11437 11437:D3,92|3b650c7303ff552489d38b4308e85e000000536a038b4b0489cb909090e836edffff8b0c2489c28b45008d40f03b45087303ff5520894500c740fc030000008950088b490483c404894804c70001000000c390900000000058000000|@9618,2097151,@1942|14,1,@11438 30,1,@11402 77,0,0 11438:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1941|23,0,@6769 84,0,0 11439:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1944|23,0,@6769 84,0,0 11440:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c70054c885b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@11420,15,@1948|28,0,@11441 11441:D3,40|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a0456e9f9bffbff900000000024000000|@9636,2097151,@1947|27,1,@9633 11442:D3,44|3b650c7303ff55248b4a048b1c24890c246a03ff720889debb985b84b256e9bdf4ffff900000000028000000|@11425,2097151,@1949|25,0,@10640 31,1,@11422 11443:O1|@11444 11444:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70124c985b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1962|29,0,@11445 11445:O1|@11446 11446:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70070c985b28948048060ffbfc3000000002c000000|@11461,3,@1961|28,0,@11447 11447:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e876c5fbff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7015cca85b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1960|14,1,@11448 24,0,207 34,1,@9637 64,0,@11449 110,0,1 11448:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1952|53,0,0 59,0,0 11449:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9c4ca85b28b1424890c24bbd8cc85b252e9d6bafdff90900000000050000000|@10893,1048575,@1959|53,0,@11450 64,0,@11457 70,1,@10257 11450:O1|@11451 11451:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70010cb85b28948048060ffbfc3000000002c000000|@9619,3,@1955|28,0,@11452 11452:D3,256|3b650c7303ff55248b42048b58048b0889c8909090e8fa000000a80175128b08833903750b837804017505f6c301740d89c1b89ccc85b28b5d0490ff138b55008d52dc3b55087303ff5520895500c742fc04000000c7420c050000008b33897208c7420401000000c702090000008d7a14c747fc030000008977088b4104894704c707110000008b45008d40bc3b45087303ff5520894500c740fc03000000c7400805000000897004c7004b0000008d4810c741fc02000000c741040100000089018d410cc740fc0200000089480489388d480cc741fc0200000089410489118d410cc740fc03000000894808895804c70001000000c39000000000fc000000|@9618,63,@1954|22,1,@11453 51,0,@11454 88,0,2 100,0,0 106,0,4 131,0,8 162,0,2 171,0,37 188,0,0 242,0,0 11453:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1953|23,0,@6769 84,0,0 11454:O4|@4608,@5398,@11456,@11455 11455:O5|@9182,1554,0,1554,0 11456:S8|61746f6d69634f70 11457:O1|@11458 11458:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c7002ccd85b28950048948088060ffbfc390900000000034000000|@10256,7,@1958|31,0,@11459 11459:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7007ccd85b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1957|28,0,@11460 11460:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e99ab4fbff9090000000002c000000|@9623,2097151,@1956|9,0,207 34,1,@9620 11461:S35|5838364c4f574c4556454c28292e696e73747241746f6d6963496e6372283229283129 11462:O1|@11463 11463:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70140ce85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@1973|29,0,@11464 11464:O1|@11465 11465:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7008cce85b28948048060ffbfc3000000002c000000|@11477,3,@1972|28,0,@11466 11466:D3,124|3b650c7303ff552489d3909090e87e00000050508b4b04bb9f01000089c8909090e85ac0fbff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70178cf85b25a8951048061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3900000000078000000|@10894,2097151,@1971|14,1,@11467 24,0,207 34,1,@9637 64,0,@11468 110,0,1 11467:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1963|53,0,0 59,0,0 11468:D3,84|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b52048910b9e0cf85b28b1424890c24bbb8d185b252e9bab5fdff90900000000050000000|@10893,1048575,@1970|53,0,@11469 64,0,@11473 70,1,@10257 11469:O1|@11470 11470:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7002cd085b28948048060ffbfc3000000002c000000|@9619,3,@1966|28,0,@11471 11471:D3,256|3b650c7303ff55248b42048b58048b0889c8909090e8fa000000a80175128b08833903750b837804017505f6c301740d89c1b89ccc85b28b5d0490ff138b55008d52dc3b55087303ff5520895500c742fc04000000c7420cfdffffff8b33897208c7420401000000c702090000008d7a14c747fc030000008977088b4104894704c707110000008b45008d40bc3b45087303ff5520894500c740fc03000000c74008fdffffff897004c7004b0000008d4810c741fc02000000c741040100000089018d410cc740fc0200000089480489388d480cc741fc0200000089410489118d410cc740fc03000000894808895804c70001000000c39000000000fc000000|@9618,63,@1965|22,1,@11472 51,0,@11454 88,0,-2 100,0,0 106,0,4 131,0,8 162,0,-2 171,0,37 188,0,0 242,0,0 11472:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1964|23,0,@6769 84,0,0 11473:O1|@11474 11474:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c7000cd285b28950048948088060ffbfc390900000000034000000|@10256,7,@1969|31,0,@11475 11475:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7005cd285b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@1968|28,0,@11476 11476:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e9baaffbff9090000000002c000000|@9623,2097151,@1967|9,0,207 34,1,@9620 11477:S35|5838364c4f574c4556454c28292e696e73747241746f6d696344656372283229283129 11478:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1974| 11479:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1975| 11480:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1976| 11481:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1977| 11482:O1|@11483 11483:D3,672|3b650c7303ff5524a8017518f640040175128b4804f641040175098b5104837a0401740d89c1b8e8d685b28b5d0490ff13ff30ff32ff31538b44240c89da9090ff12508b4424088b54240490ff12f6042401755aa801755b8b0c24f60101750d8b10b808a87cb28b5d0490ff1383390b7338f60001750e8b10b808a87cb28b5d049090ff13ff318b00909090ff15a8c552089090ff1568c5520881e0ff01000083e00783f8017540eb0eff31eb3ae941000000e93c000000f6042401750bb808a87cb28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b0c248908eb13b80100000083c4046a01eb07b8010000006a01508b4424108b54240cff12a801756ff60001750e8b08b808a87cb28b5d049090ff138b0090ff15a8c552089090ff1568c5520881e0ff010000833c240175728b4d008d49f43b4d087303ff5520894d00c741fc02000000c70144d785b28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000eb05e90e010000c74004010000008b54241489108b55008d52f43b55087303ff5520895500c742fc020000008942048b442418eb05e93100000089028b45008d40ec3b45087303ff5520894500c740fc02000000895004890889c18d400cc740fc01000000890883c41cc38b0c248b11f6c201740783fa017d1beb06f642ff1074135089d3b88c6c7ab2909090ff1588c75208eb0589c389d0538b4d008d49f03b4d087303ff5520894d00c741fc03000000c70120df85b2894104588941088061ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b54241489108b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc01000000891083c41cc3b80100000083c41cc3909090000000009c020000|@11549,2097151,@2005|39,0,@11484 99,0,@7422 122,0,@7422 142,0,I91 150,0,I89 191,0,@7422 233,0,0 245,0,0 274,0,@7422 290,0,I91 298,0,I89 340,0,@11487 385,0,0 509,0,@5215 518,0,I106 555,0,@11528 597,0,0 653,0,0 11484:O4|@4608,@5398,@11486,@11485 11485:O5|@9182,838,0,838,0 11486:S37|696e737472416c6c6f6353746f72653a2057726f6e67206e756d626572206f662061726773 11487:D3,132|8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701dcd785b28b52048951048941088061ffbf8b45008d40f43b45087303ff5520894500c740fc020000009090c70008de85b28948048060ffbf89c18b45008d40f43b45087303ff5520894500c740fc02000000c70098de85b28948048060ffbfc390900000000080000000|@11527,7,@1990|26,0,@11488 71,0,@11524 110,0,@11526 11488:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7002cd885b28b5a048958048b720889700889480c8060ffbfc30000000038000000|@11417,31,@1986|28,0,@11489 11489:D3,204|3b650c7303ff55248b420c83780401756eff3052ff742404bb010100008b420890e8bab6fbff8b0c248b55008d52f03b55087303ff5520895500c742fc03000000c7020cd985b28b490483c404894a0459894a088062ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000895008894804c70003000000c389d38b70048b0889c890e8d604000056ff730489f390e88a01000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c3909000000000c8000000|@11416,2097151,@1985|25,0,128 34,1,@9637 67,0,@11490 122,0,1 138,1,@11523 150,1,@11493 189,0,0 11490:D3,72|8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc04000000c70068d985b28948048b4a048948088b5a0889580c8060ffbfc390900000000044000000|@10893,15,@1983|38,0,@11491 11491:D3,92|3b650c7303ff552489d38b430ce85e00000053ff73088b4b0489cb9090e8c60000008b0c2489c28b45008d40f03b45087303ff5520894500c740fc030000008950088b490483c404894804c70001000000c390900000000058000000|@9618,63,@1982|14,1,@11492 30,1,@11493 77,0,0 11492:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1978|23,0,@6769 84,0,0 11493:D3,216|3b650c7303ff5524a80175228b08833903751bf640040175158b50048b32833e03750b837a04017505f6c301740bb83cdb85b28b5d0490ff138b5c240483e30383fb017507bb7cdb85b2eb05bb94db85b28b7d008d7fd83b7d087303ff5520897d00c747fc030000008b4c2404894f08c74704f8db85b2c7076b0000008d4710c740fc02000000c740040cdc85b289388d780cc747fc02000000894704c70798dc85b283ff01740c89d889fb90e8a201000089c383fb017508b8fcdc85b2c20400b8fcdc85b25983c40451e9f401000000000000d4000000|@11522,63,@1981|47,0,@11494 70,0,@11497 77,0,@11499 115,0,@11506 121,0,53 138,0,@11507 159,0,@11517 174,1,@11518 186,0,@11519 194,0,@11519 204,1,@11521 11494:O4|@4608,@5398,@11496,@11495 11495:O5|@9182,796,0,796,0 11496:S11|67656e566172416c6c6f63 11497:O2|@11498,0 11498:O2|47,4 11499:O2|@10631,@11500 11500:O2|@11502,@11501 11501:O2|@11504,@11503 11502:O2|47,3 11503:O2|@11505,0 11504:O4|50,1,@5643,2 11505:O4|50,2,@5592,0 11506:O4|0,@8802,@8817,-1 11507:O2|@11509,@11508 11508:O2|@10403,@11511 11509:O3|58,@11510,@5592 11510:O4|0,@8802,@8817,-4 11511:O2|@11513,@11512 11512:O2|@11514,0 11513:O2|1,@8802 11514:O5|30,@11516,@11515,2,@8802 11515:O2|0,@5592 11516:O1|@5592 11517:O2|45,@8802 11518:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1979| 11519:O2|@11520,@9708 11520:O2|40,@8802 11521:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1980| 11522:S28|5838364c4f574c4556454c28292e67656e566172416c6c6f63283329 11523:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1984|23,0,@6769 84,0,0 11524:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c70054de85b28948048b52048950088060ffbfc390900000000034000000|@10255,7,@1988|28,0,@11525 11525:D3,48|3b650c7303ff5524b9030000008b1c24890c246a036a03ff720889d98b5a0451e9c3a3fbff909090000000002c000000|@9623,2097151,@1987|9,0,1 33,1,@9620 11526:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a01ff720489d9bb985b84b251e97da3fbff90000000002c000000|@9623,2097151,@1989|9,0,2 29,0,@10640 35,1,@9620 11527:S57|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229616c6c6f6353746f72655661724c656e677468283129283129 11528:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c70070df85b28b5a048958048b720889700889480c8060ffbfc30000000038000000|@11548,31,@2004|28,0,@11529 11529:D3,176|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c70134e085b28b5a048959048b72088971088061ffbf89cf52e8da0400008b0c24505750bb9f0100008b410c90e84aaffbff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701e4e485b25a8951045a83c4048951088061ffbf89c28b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c3909000000000ac000000|@10894,2097151,@2003|34,0,@11530 58,1,@11542 69,0,207 78,1,@9637 108,0,@11543 161,0,1 11530:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c70084e085b28b5a048958048b720889700889480c8060ffbfc30000000038000000|@9619,31,@1997|28,0,@11531 11531:D3,88|3b650c7303ff55248b420c8b580489d68b0889c890e85200000053ff7604ff7608e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000054000000|@9618,2097151,@1996|22,1,@11532 34,1,@11533 73,0,0 11532:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@1991|23,0,@6769 84,0,0 11533:D3,300|3b650c7303ff5524a80175128b08833903750b837804017505f6c301740f89c1b8a8e285b28b5d04909090ff13ff33ff710468ece285b2ff338d5c24048b442418e85a56f5ff50bb010000028b442418ff15c8c7520889c38b44241cff1588c852088b4d008d49b43b4d087303ff5520894d00c741fc04000000c7410cf9ffffffc7410834c47fb28b542404895104c701010000008d5914c743fc03000000894308894b04c7036f0000008d4310c740fc030000008950088b4c241c894804c700010000008d5010c742fc02000000c742040100000089028d420cc740fc02000000895004891883f80175058b0424eb0d89c38b0424909090e84a01000083f801750bb800ba81b283c414c2080089c3b800ba81b283c4145983c40851e97e01000090900000000028010000|@11541,2097151,@1995|33,0,@11534 51,0,@11537 66,1,@6547 72,0,16777216 82,0,I108 94,0,I114 125,0,-4 132,0,@8817 145,0,0 167,0,55 193,0,0 210,0,0 250,1,@11539 260,0,@9708 273,0,@9708 286,1,@11540 11534:O4|@4608,@5398,@11536,@11535 11535:O5|@9182,755,0,755,0 11536:S13|67656e4669786564416c6c6f63 11537:D3,124|3b650c7303ff552452bb090000009090ff15c8c752088b0c248b55008d52ec3b55087303ff5520895500c742fc0400000089420cc7420834c47fb28b4108894204c702010000008b45008d40f03b45087303ff5520894500c740fc030000008b490483c404894808895004c70075000000c390900000000078000000|@11538,2097151,@1992|10,0,4 18,0,I108 55,0,@8817 67,0,0 109,0,58 11538:S44|5838364c4f574c4556454c28292e67656e4669786564416c6c6f63283429696e697469616c69736572283129 11539:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1993| 11540:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@1994| 11541:S30|5838364c4f574c4556454c28292e67656e4669786564416c6c6f63283429 11542:D3,72|3b650c7303ff5524a801752e8b40049090e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c3b801000000c30000000044000000|@6329,3,@1998|53,0,0 59,0,0 11543:D3,80|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948048b4a0889088b5a048b3424891c24bb48e585b256e950a0fdff000000004c000000|@10893,1048575,@2002|62,0,@11544 68,1,@10257 11544:O1|@11545 11545:D3,56|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000c7009ce585b28950048948088060ffbfc390900000000034000000|@10256,7,@2001|31,0,@11546 11546:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700ece585b28948048b4a048948088b5a0889580c8060ffbfc30000000038000000|@10255,15,@2000|28,0,@11547 11547:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a01ff7208ff720c89d98b5a0451e92a9cfbff9090000000002c000000|@9623,2097151,@1999|9,0,207 34,1,@9620 11548:S59|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229616c6c6f6353746f726546697865644c656e677468283129283129 11549:S32|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229 11550:O1|@11551 11551:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701607781b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2006|29,0,@9587 11552:O1|@11553 11553:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70144e785b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2022|29,0,@11554 11554:O1|@11555 11555:D3,204|b82ce885b2b901000000a80175708b10833a0175128b5a04f6c301740583c3207120ff5538ebf6837a080375128b5a04f6c301740583c3107108ff5538ebf68b5a04f6c30175108b33f643ff107402f7de8d743601eb0289de89cb89f1be0300000083ee0183f93f7605b93f000000d1e9d3e683ce018d4c09010bdeeb05e91400000089d98b500489d03b650c7303ff5524e973ffffff89c889c18b45008d40f43b45087303ff5520894500c740fc020000009090c70050e885b28948048060ffbfc39000000000c8000000|@11588,31,@2021|1,0,@11556 6,0,0 94,0,1 107,0,31 183,0,@11559 11556:O2|@5643,@11557 11557:O2|@8791,@11558 11558:O2|@5592,@10798 11559:D3,260|3b650c7303ff552489c1bb05000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc983390775738b55008d52f43b55087303ff5520895500c742fc020000008b4904894a04c702050000006a016a01506a05528d4c240c51bb01000000b8a0747ab2909090e83291fbff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c24048908b9030000008b54240ceb05e919000000894c240cb968e985b2894c240889c35883c40452e9409ffbff8b52048b0c248914246a016a056894f285b2bb20f385b251e9f398fbff9090900000000000010000|@9630,2097151,@2020|11,0,2 23,0,@5417 107,0,2 125,0,0 130,0,@5330 138,1,@9594 180,0,1 200,0,@11560 216,1,@9633 234,0,@11583 239,0,@11586 245,1,@9620 11560:O1|@11561 11561:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700b4e985b28948048060ffbfc3000000002c000000|@9631,3,@2017|28,0,@11562 11562:D3,240|3b650c7303ff552489c1bb03000000f6c101740d89c6b8bc7e7ab28b5d0490ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc983390775728b45008d40f43b45087303ff5520894500c740fc020000008b4904894804c700050000008b4a046a016a016a03508d442408508b59048b019090e8d28ffbff589090e8720000008b1c24e8e200000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804eb05e907000000c70001000000c3b99f0100008b1c24890c246a016a036868f185b289d98b5a0451e9a097fbff00000000ec000000|@9630,2097151,@2016|11,0,1 23,0,@5417 107,0,2 134,1,@9594 142,1,@11563 150,1,@11564 196,0,0 202,0,207 217,0,@11579 228,1,@9620 11563:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@2007|23,0,@6769 84,0,0 11564:D3,984|3b650c7303ff5524a801751df640040175178b4804f6410401750e8b5104837a0401750583fb01740c89c1b81cef85b28b5d04ff136a016a018b19833b0375708b75008d76ec3b75087303ff5520897500c746fc04000000c7460c050000008b7b04897e08c7460403000000c706650000008b7d008d7fe43b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc03000000ff328b5304895608895604c70677000000eb05e9300000008b55008d52f43b55087303ff5520895500c742fc02000000c742040100000089328d5c2404893b8d5c2404895304eb1389e6c7060100000089e6c7460401000000ff328b10833a0575608b19833b05740bb85cef85b28b5d0490ff13f64304017418f6430401750cb808a87cb28b5d049090ff13837b0401740ab888ef85b28b5d04ff138b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c70603000000eb67833a03740db85cef85b28b5d04909090ff138b19833b057570f6430401750bb808a87cb28b5d0490ff138b7304f7c601000000740783fe017d1beb06f646ff107413ff720489f3b88c6c7ab290ff1588c75208eb0589f0ff72048b75008d76ec3b7508730aeb05e98e000000ff5520897500c746fc0400000089460cc7460834c47fb258894604eb05e908000000c70601000000eb64833b03740bb85cef85b28b5d0490ff138b75008d76f43b75087303ff5520897500c746fc020000008b7b04897e04c70601000000568b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000588946088b5204895604c706010000008b04248338057575f6400401750e8b4804b808a87cb28b5d0490ff13568b4004909090ff15a8c552089090ff1568c5520881e0ff0100008b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c7016b0000008b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000eb05e9280000008908837c240401740a8b5c240490e89601000083f801750583c40858c389c383c40858e9d9010000833803740db864f085b28b5d04909090ff138b4d008d49a83b4d087303ff5520894d00c741fc030000008b5004895108895104c701770000008d5910c743fc03000000895308897304c7036d0000008d7310c746fc04000000c7460c05000000895608c7460403000000c706650000008d7e14c747fc02000000c747040100000089378d770cc746fc02000000897e04891e8d5e0cc743fc02000000897304890b837c240401741189d98b5c240489c89090e8a601000089c383fb01750583c40858c383c40858e9e90100009000000000d4030000|@11578,2097151,@2012|44,0,@11565 91,0,2 104,0,1 110,0,50 141,0,0 170,0,59 208,0,0 233,0,0 242,0,0 263,0,@11568 286,0,@7422 304,0,@11570 345,0,1 357,0,@11568 383,0,@7422 423,0,@5215 430,0,I106 478,0,@8817 495,0,0 507,0,@11568 549,0,0 581,0,0 597,0,0 619,0,@7422 638,0,I91 646,0,I89 689,0,53 720,0,0 746,1,@11572 767,1,@11573 777,0,@11574 824,0,59 846,0,54 863,0,2 873,0,1 879,0,50 896,0,0 950,1,@11576 971,1,@11577 11565:O4|@4608,@5398,@11567,@11566 11566:O5|@9182,1136,0,1136,0 11567:S12|67656e53746f726542797465 11568:O4|@4608,@5398,@11567,@11569 11569:O5|@9182,1119,0,1119,0 11570:O4|@4608,@5398,@11567,@11571 11571:O5|@9182,1118,0,1118,0 11572:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2008| 11573:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2009| 11574:O4|@4608,@5398,@11567,@11575 11575:O5|@9182,1133,0,1133,0 11576:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2010| 11577:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2011| 11578:S29|5838364c4f574c4556454c28292e67656e53746f726542797465283229 11579:O1|@11580 11580:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700b4f185b28948048060ffbfc3000000002c000000|@9619,3,@2015|28,0,@11581 11581:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e85af9ffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,2097151,@2014|22,1,@11582 30,1,@11564 69,0,0 11582:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@2013|23,0,@6769 84,0,0 11583:O1|@11584 11584:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700e0f285b28948048060ffbfc3000000002c000000|@11420,3,@2019|28,0,@11585 11585:D3,44|3b650c7303ff5524b9030000008b1c24890c246868e985b289d98b5a0451e96995fbff900000000028000000|@9636,2097151,@2018|9,0,1 20,0,@11560 31,1,@9633 11586:O2|@11587,0 11587:O2|0,@5424 11588:S26|5838364c4f574c4556454c28292e73746f726542797465283129 11589:O1|@11590 11590:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701b0f385b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2024|29,0,@11591 11591:O1|@11592 11592:D3,16|b8c48183b2c39090000000000c000000|@10263,1,@2023|1,0,@10241 11593:O1|@11594 11594:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70130f485b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2031|29,0,@11595 11595:O1|@11596 11596:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7007cf485b28948048060ffbfc3000000002c000000|@11613,3,@2030|28,0,@11597 11597:D3,80|3b650c7303ff552468987f7ab2bb0100fe008b4204e8769afbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008e0f485b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2029|9,0,@5424 14,0,8323072 22,1,@9637 55,0,@11598 64,0,1 11598:O1|@11599 11599:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700987f7ab289c18d400cc740fc020000009090c70050f585b28948048060ffbfc3900000000050000000|@10893,3,@2028|43,0,@5424 63,0,@11600 11600:D3,40|3b650c7303ff5524b98cf585b28b1c24890c2489d98b5a0451e93666feff90900000000024000000|@10644,2097151,@2027|9,0,@11601 26,1,@10641 11601:O1|@11602 11602:D3,44|3b650c7303ff5524b9010000008b1424890c246a018b58048b0889c852e91e00000090900000000028000000|@11612,63,@2026|9,0,0 30,1,@11603 11603:D3,812|a8017514f6400401750e8b4804837904017505f6c301740d89c1b814f985b28b5d0490ff136a016a016a018b11833a0375638b7204833e0175608b38833f0375458b5704833a01753d8b108b7a048b57043b5604771889e68b00890689e08b0989480489e08b4c2414894808eb6189e68b09890e89e18b0089410489e08b4c2410894808eb5789e28b09890a89e18b00894104eb0ae928000000e90b00000089e08b4c2410894808eb3389e78b10891789e68b09894e0489e18b742414897108eb1b89e68b38893e89e6895604eb05e90900000089e68b4424148946088b04248338057564f6400401742df640040175108b4804b808a87cb28b5d04909090ff1383780401740ab8b49380b28b5d04ff13b84c9480b2eb5bf6400401740f8b4804b8ecd57ab28b5d049090ff138b50040fb64aff8d4c090183f9037529f6c2017413b8ecd57ab2eb05e9480000008b5d049090ff13b9ffffff00234afc8d4c090183f905740bb8589480b28b5d0490ff1389d08b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70121000000eb68833803740ab854f985b28b5d04ff138b480483390375268b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c70125000000eb2b8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b4004894104c701230000008b442404833805752d8b55008d52f03b55087303ff5520895500c742fc030000008b40048942088b442408894204c70219000000eb6d833803740cb880f985b28b5d049090ff138b5004833a0375348b55008d52ec3b55087303ff5520895500c742fc04000000c7420c010000008b40048942088b442408894204c7021b000000eb328b55008d52f03b55087303ff5520895500c742fc030000008b4004894208eb05e90d0000008b442408894204c7021d0000008b45008d40f03b45087303ff5520894500c740fc030000008b1b83c40c895808c7400403000000c7002b0000008b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c7430401000000890b8d4b0cc741fc02000000895904891189c28d410cc740fc020000008948048910c208000000000028030000|@11611,63,@2025|27,0,@11604 245,0,@7422 264,0,@9179 274,0,@9183 290,0,@6321 323,0,@6321 342,0,8388607 359,0,@9184 400,0,16 412,0,@11607 461,0,18 494,0,0 506,0,17 558,0,12 570,0,@11609 616,0,0 635,0,13 687,0,14 726,0,1 732,0,21 763,0,0 11604:O4|@4608,@5398,@11606,@11605 11605:O5|@9182,2039,0,2039,0 11606:S11|67656e42696e6172794650 11607:O4|@4608,@5398,@11606,@11608 11608:O5|@9182,2025,0,2025,0 11609:O4|@4608,@5398,@11606,@11610 11610:O5|@9182,2031,0,2031,0 11611:S28|5838364c4f574c4556454c28292e67656e42696e6172794650283429 11612:S31|5838364c4f574c4556454c28292e67656e42696e6172794650283129283129 11613:S25|5838364c4f574c4556454c28292e6765744650283129283129 11614:O1|@11615 11615:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70170fa85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2037|29,0,@11616 11616:O1|@11617 11617:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700bcfa85b28948048060ffbfc3000000002c000000|@11613,3,@2036|28,0,@11618 11618:D3,80|3b650c7303ff552468987f7ab2bb0100fe008b4204e83694fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400820fb85b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2035|9,0,@5424 14,0,8323072 22,1,@9637 55,0,@11619 64,0,1 11619:O1|@11620 11620:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700987f7ab289c18d400cc740fc020000009090c70090fb85b28948048060ffbfc3900000000050000000|@10893,3,@2034|43,0,@5424 63,0,@11621 11621:D3,40|3b650c7303ff5524b9ccfb85b28b1c24890c2489d98b5a0451e9f65ffeff90900000000024000000|@10644,2097151,@2033|9,0,@11622 26,1,@10641 11622:O1|@11623 11623:D3,44|3b650c7303ff5524b90d0000008b1424890c246a0f8b58048b0889c852e9def9ffff90900000000028000000|@11612,63,@2032|9,0,6 30,1,@11603 11624:O1|@11625 11625:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70168fc85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2043|29,0,@11626 11626:O1|@11627 11627:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700b4fc85b28948048060ffbfc3000000002c000000|@11613,3,@2042|28,0,@11628 11628:D3,80|3b650c7303ff552468987f7ab2bb0100fe008b4204e83e92fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400818fd85b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2041|9,0,@5424 14,0,8323072 22,1,@9637 55,0,@11629 64,0,1 11629:O1|@11630 11630:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700987f7ab289c18d400cc740fc020000009090c70088fd85b28948048060ffbfc3900000000050000000|@10893,3,@2040|43,0,@5424 63,0,@11631 11631:D3,40|3b650c7303ff5524b9c4fd85b28b1c24890c2489d98b5a0451e9fe5dfeff90900000000024000000|@10644,2097151,@2039|9,0,@11632 26,1,@10641 11632:O1|@11633 11633:D3,44|3b650c7303ff5524b90b0000008b1424890c246a0b8b58048b0889c852e9e6f7ffff90900000000028000000|@11612,63,@2038|9,0,5 30,1,@11603 11634:O1|@11635 11635:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c70160fe85b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2049|29,0,@11636 11636:O1|@11637 11637:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700acfe85b28948048060ffbfc3000000002c000000|@11613,3,@2048|28,0,@11638 11638:D3,80|3b650c7303ff552468987f7ab2bb0100fe008b4204e84690fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400810ff85b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2047|9,0,@5424 14,0,8323072 22,1,@9637 55,0,@11639 64,0,1 11639:O1|@11640 11640:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700987f7ab289c18d400cc740fc020000009090c70080ff85b28948048060ffbfc3900000000050000000|@10893,3,@2046|43,0,@5424 63,0,@11641 11641:D3,40|3b650c7303ff5524b9bcff85b28b1c24890c2489d98b5a0451e9065cfeff90900000000024000000|@10644,2097151,@2045|9,0,@11642 26,1,@10641 11642:O1|@11643 11643:D3,44|3b650c7303ff5524b9070000008b1424890c246a098b58048b0889c852e9eef5ffff90900000000028000000|@11612,63,@2044|9,0,3 30,1,@11603 11644:O1|@11645 11645:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701580086b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2056|29,0,@11646 11646:O1|@11647 11647:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700a40086b28948048060ffbfc3000000002c000000|@11666,3,@2055|28,0,@11648 11648:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e84e8efbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008080186b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2054|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11649 64,0,1 11649:O1|@11650 11650:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700780186b28948048060ffbfc3900000000050000000|@10893,3,@2053|43,0,@5279 63,0,@11651 11651:D3,40|3b650c7303ff5524b9b40186b28b1c24890c2489d98b5a0451e90e5afeff90900000000024000000|@10644,2097151,@2052|9,0,@11652 26,1,@10641 11652:O1|@11653 11653:D3,40|3b650c7303ff5524b9010000008b1424890c248b58048b0889c852e91c0000000000000024000000|@11665,63,@2051|9,0,0 28,1,@11654 11654:D3,632|a801750b837804017505f6c301740e89c1b8840486b28b5d049090ff138b088339057563f6410401742af6410401750db808a87cb28b5d04909090ff1383790401740ab8b49380b28b5d04ff13ba4c9480b2eb5bf6410401740bb8ecd57ab28b5d0490ff138b71040fb656ff8d54120183fa03752df7c6010000007414b8ecd57ab28b5d04eb05e946000000909090ff13baffffff002356fc8d54120183fa05740bb8589480b28b5d0490ff1389f28b75008d76f43b75087303ff5520897500c746fc02000000895604c70621000000eb62833903740ab8c40486b28b5d04ff138b5104833a0375238b75008d76f43b75087303ff5520897500c746fc02000000895604c70625000000eb288b75008d76f03b75087303ff5520897500c746fc03000000c7460801000000895604c70623000000837c24040b75738b55008d52f03b55087303ff5520895500c742fc030000008b1b895a08c7420403000000c7022b0000008b5d008d5bb83b5d087303ff5520895d00c743fc02000000c743040100000089338d730cc746fc02000000895e04c706f00486b28d5e0cc743fc02000000897304c703fc0486b2eb05e9380000008d730cc746fc02000000895e04c706080586b28d5e0cc743fc02000000897304c703140586b28d430cc740fc020000008958048910c204008b55008d52f03b55087303ff5520895500c742fc030000008b1b895a08c7420403000000c7022b0000008b5d008d5bd03b5d087303ff5520895d00c743fc020000008b7c2404897b04c7032f0000008d430cc740fc02000000c740040100000089308d480cc741fc0200000089410489198d410cc740fc020000008948048910c2040090900000000074020000|@11664,63,@2050|18,0,@11655 49,0,@7422 68,0,@9179 78,0,@9183 91,0,@6321 126,0,@6321 146,0,8388607 163,0,@9184 204,0,16 216,0,@11658 262,0,18 295,0,0 304,0,17 347,0,1 353,0,21 384,0,0 405,0,@11660 424,0,@11661 450,0,@11662 469,0,@11663 523,0,1 529,0,21 566,0,23 583,0,0 11655:O4|@4608,@5398,@11657,@11656 11656:O5|@9182,2069,0,2069,0 11657:S10|67656e556e6172794650 11658:O4|@4608,@5398,@11657,@11659 11659:O5|@9182,2048,0,2048,0 11660:O2|15,@10063 11661:O2|23,3 11662:O2|24,4194304 11663:O2|23,5 11664:S27|5838364c4f574c4556454c28292e67656e556e6172794650283329 11665:S30|5838364c4f574c4556454c28292e67656e556e6172794650283129283129 11666:S30|5838364c4f574c4556454c28292e676574556e6172794650283129283129 11667:O1|@11668 11668:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701e80586b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2062|29,0,@11669 11669:O1|@11670 11670:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700340686b28948048060ffbfc3000000002c000000|@11666,3,@2061|28,0,@11671 11671:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e8be88fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008980686b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2060|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11672 64,0,1 11672:O1|@11673 11673:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700080786b28948048060ffbfc3900000000050000000|@10893,3,@2059|43,0,@5279 63,0,@11674 11674:D3,40|3b650c7303ff5524b9440786b28b1c24890c2489d98b5a0451e97e54feff90900000000024000000|@10644,2097151,@2058|9,0,@11675 26,1,@10641 11675:O1|@11676 11676:D3,40|3b650c7303ff5524b9030000008b1424890c248b58048b0889c852e98cfaffff0000000024000000|@11665,63,@2057|9,0,1 28,1,@11654 11677:O1|@11678 11678:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701dc0786b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2075|29,0,@11679 11679:O1|@11680 11680:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700280886b28948048060ffbfc3000000002c000000|@11699,3,@2074|28,0,@11681 11681:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e8ca86fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c740088c0886b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2073|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11682 64,0,1 11682:O1|@11683 11683:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700fc0886b28948048060ffbfc3900000000050000000|@10893,3,@2072|43,0,@5279 63,0,@11684 11684:D3,48|3b650c7303ff5524b99f0100008b1c24890c246a036a0168400986b289d98b5a0451e91979fbff90000000002c000000|@9623,2097151,@2071|9,0,207 24,0,@11685 35,1,@9620 11685:O1|@11686 11686:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7008c0986b28948048060ffbfc3000000002c000000|@9619,3,@2070|28,0,@11687 11687:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,63,@2069|22,1,@11688 30,1,@11689 69,0,0 11688:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@2063|23,0,@6769 84,0,0 11689:D3,600|3b650c7303ff5524a80175128b08833903750b837804017505f6c301740f89c1b8d80c86b28b5d04909090ff138b55008d52e03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c706f9ffff078d7e08c747fc01000040c707010000008d4708c740fc01000040c70001000000ff71048b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000ff338b5d008d5ba03b5d087303ff5520895d00c743fc0500000089731089530c897b08894b048903c700030000008d4318c740fc04000000c7400c05000000895808c7400413000000c700170000008d4814c741fc02000000c741040100000089018d410cc740fc0200000089580489088d480cc741fc020000008b50048951048b1889198d710cc746fc030000005f897e08c7460403000000c7062b0000008b7d008d7fd03b7d087303ff5520897d00c747fc02000000c747041c0d86b289378d770cc746fc020000008b5904895e04c706390000008d460cc740fc02000000c740040100000089308d500cc742fc020000008b3424897204c7027b0000008b75008d76f43b75087303ff5520897500c746fc020000005b895e04c7065b0000008b5d008d5be83b5d087303ff5520895d00c743fc02000000c743040100000089338d730cc746fc02000000895e04891683fe0175048b09eb0f5089f38b0190e8ba00000089c1eb015083f9017507b80c1f84b2eb0f89cbb80c1f84b2909090e8f200000083f80175058b0424eb0a89c38b0424e83601000083f801750689f883c404c389c389f883c404e9770100009090900000000054020000|@11698,63,@2068|33,0,@11690 71,0,0 87,0,67108860 103,0,0 119,0,0 152,0,0 198,0,1 215,0,2 225,0,9 231,0,11 248,0,0 306,0,1 312,0,21 343,0,@11693 367,0,28 384,0,0 408,0,61 442,0,45 473,0,0 510,1,@11694 525,0,@10474 534,0,@10474 542,1,@11695 562,1,@11696 585,1,@11697 11690:O4|@4608,@5398,@11692,@11691 11691:O5|@9182,2098,0,2098,0 11692:S15|67656e496e74546f4650496e737472 11693:O2|@9996,0 11694:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2064| 11695:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2065| 11696:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2066| 11697:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2067| 11698:S32|5838364c4f574c4556454c28292e67656e496e74546f4650496e737472283229 11699:S27|5838364c4f574c4556454c28292e67656e496e74546f4650283129 11700:O1|@11701 11701:D3,16|b801000000c39090000000000c000000|@10896,1,@2076|1,0,0 11702:O1|@11703 11703:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701540f86b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2082|29,0,@11704 11704:O1|@11705 11705:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700a00f86b28948048060ffbfc3000000002c000000|@11666,3,@2081|28,0,@11706 11706:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e8527ffbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008041086b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2080|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11707 64,0,1 11707:O1|@11708 11708:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700741086b28948048060ffbfc3900000000050000000|@10893,3,@2079|43,0,@5279 63,0,@11709 11709:D3,40|3b650c7303ff5524b9b01086b28b1c24890c2489d98b5a0451e9124bfeff90900000000024000000|@10644,2097151,@2078|9,0,@11710 26,1,@10641 11710:O1|@11711 11711:D3,40|3b650c7303ff5524b90f0000008b1424890c248b58048b0889c852e920f1ffff0000000024000000|@11665,63,@2077|9,0,7 28,1,@11654 11712:O1|@11713 11713:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701481186b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2088|29,0,@11714 11714:O1|@11715 11715:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700941186b28948048060ffbfc3000000002c000000|@11666,3,@2087|28,0,@11716 11716:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e85e7dfbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008f81186b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2086|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11717 64,0,1 11717:O1|@11718 11718:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700681286b28948048060ffbfc3900000000050000000|@10893,3,@2085|43,0,@5279 63,0,@11719 11719:D3,40|3b650c7303ff5524b9a41286b28b1c24890c2489d98b5a0451e91e49feff90900000000024000000|@10644,2097151,@2084|9,0,@11720 26,1,@10641 11720:O1|@11721 11721:D3,40|3b650c7303ff5524b90d0000008b1424890c248b58048b0889c852e92cefffff0000000024000000|@11665,63,@2083|9,0,6 28,1,@11654 11722:O1|@11723 11723:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7013c1386b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2094|29,0,@11724 11724:O1|@11725 11725:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700881386b28948048060ffbfc3000000002c000000|@11666,3,@2093|28,0,@11726 11726:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e86a7bfbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008ec1386b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2092|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11727 64,0,1 11727:O1|@11728 11728:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c7005c1486b28948048060ffbfc3900000000050000000|@10893,3,@2091|43,0,@5279 63,0,@11729 11729:D3,40|3b650c7303ff5524b9981486b28b1c24890c2489d98b5a0451e92a47feff90900000000024000000|@10644,2097151,@2090|9,0,@11730 26,1,@10641 11730:O1|@11731 11731:D3,40|3b650c7303ff5524b9050000008b1424890c248b58048b0889c852e938edffff0000000024000000|@11665,63,@2089|9,0,2 28,1,@11654 11732:O1|@11733 11733:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701301586b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2102|29,0,@11734 11734:O1|@11735 11735:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7007c1586b28948048060ffbfc3000000002c000000|@11744,3,@2101|28,0,@11736 11736:D3,92|8b45008d40f43b45087303ff5520894500c740fc02000000c700ec1586b28b52048950048060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401008000c70003000000c3900000000058000000|@11358,7,@2100|26,0,@11737 72,0,4194304 78,0,1 11737:D3,52|8b45008d40f43b45087303ff5520894500c740fc02000000c700341686b28b52048950048060ffbfc39090900000000030000000|@11357,5,@2099|26,0,@11738 11738:D3,80|3b650c7303ff552468d8707ab2bb0100fe008b4204e8be78fbff89c18b45008d40f03b45087303ff5520894500c740fc03000000c74008981686b2894804c70003000000c3909090000000004c000000|@11416,2097151,@2098|9,0,@5279 14,0,8323072 22,1,@9637 55,0,@11739 64,0,1 11739:O1|@11740 11740:D3,84|8b4d008d49e03b4d087303ff5520894d00c741fc0100000089018d4108c740fc020000008948049090c700d8707ab289c18d400cc740fc020000009090c700081786b28948048060ffbfc3900000000050000000|@10893,3,@2097|43,0,@5279 63,0,@11741 11741:D3,40|3b650c7303ff5524b9441786b28b1c24890c2489d98b5a0451e97e44feff90900000000024000000|@10644,2097151,@2096|9,0,@11742 26,1,@10641 11742:O1|@11743 11743:D3,40|3b650c7303ff5524b90b0000008b1424890c248b58048b0889c852e98ceaffff0000000024000000|@11665,63,@2095|9,0,5 28,1,@11654 11744:S31|5838364c4f574c4556454c28292e67657441726374616e4650283129283129 11745:O1|@11746 11746:D3,16|b801000000c39090000000000c000000|@10896,1,@2103|1,0,0 11747:O1|@11748 11748:D3,16|b801000000c39090000000000c000000|@10896,1,@2104|1,0,0 11749:O1|@11750 11750:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c7015c1886b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2122|29,0,@11751 11751:O1|@11752 11752:D3,16|b8881886b2c39090000000000c000000|@11788,1,@2121|1,0,@11753 11753:O1|@11754 11754:D3,48|3b650c7303ff5524b9810000008b1424890c246a036a0168d41886b2bb2c0c84b252e98569fbff90000000002c000000|@9623,2097151,@2120|9,0,64 24,0,@11755 29,0,@10423 35,1,@9620 11755:O1|@11756 11756:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700201986b28948048060ffbfc3000000002c000000|@10255,3,@2119|28,0,@11757 11757:D3,48|3b650c7303ff5524b9010100008b1c24890c246a036a0568641986b289d98b5a0451e9f568fbff90000000002c000000|@9623,2097151,@2118|9,0,128 24,0,@11758 35,1,@9620 11758:O1|@11759 11759:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700b01986b28948048060ffbfc3000000002c000000|@10255,3,@2117|28,0,@11760 11760:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a0968f41986b289d98b5a0451e96568fbff90000000002c000000|@9623,2097151,@2116|9,0,2 24,0,@11761 35,1,@9620 11761:O1|@11762 11762:D3,40|3b650c7303ff5524b9381a86b28b1424890c24bbb02086b252e9626bfdff90900000000024000000|@11787,1048575,@2115|9,0,@11763 20,0,@11782 26,1,@10257 11763:O1|@11764 11764:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700841a86b28948048060ffbfc3000000002c000000|@9619,3,@2111|28,0,@11765 11765:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,2097151,@2110|22,1,@11766 30,1,@11767 69,0,0 11766:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@2105|23,0,@6769 84,0,0 11767:D3,864|3b650c7303ff5524a801753f8b088339037538f640040175328b5004f642040175298b5a048b33833e03751ff643040175198b7b04f647040175108b4f048b11833a03750683790401740e89c1b8d81e86b28b5d049090ff138b70048b5e048b7b048b0f833905756bf6410401750ab808a87cb28b5d04ff13837904017507ba01000000eb738b5104f6c201740783fa017d19eb06f642ff107411ff3689d3b88c6c7ab2ff1588c75208eb0489d0ff368b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc741084cc37fb2eb05e92d000000c7410401000000c701090000008d5114c742fc02000000c7420401000000eb05e904000000890aeb6eff36eb6f833903740ab8181f86b28b5d04ff138b55008d52a43b55087303ff5520895500c742fc030000008b4104894208894204c702770000008d5a10c743fc0400000089430cc743084cc37fb2c7430401000000c7030f0000008d7b14c747fc04000000c7470c05000000eb0ae94a000000e945000000894708c7470403000000c707650000008d4714c740fc02000000c740040100000089388d480cc741fc02000000894104891989d08d510cc742fc02000000894a048902ff368b04248338057570f640040175108b4804b808a87cb28b5d04909090ff13837804017507b801000000eb728b4804f6c101740783f9017d19eb06f641ff1074115289cbb88c6c7ab290ff1588c75208eb0389c8528b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc7410830c37fb2eb05e92c000000c7410401000000c701090000008d4114c740fc02000000c7400401000000eb05e9040000008908eb6f52eb71833803740cb8181f86b28b5d049090ff138b4d008d49a43b4d087303ff5520894d00c741fc030000008b5804895908895904c701770000008d7110c746fc04000000895e0cc7460830c37fb2c7460401000000c7060f0000008d7e14c747fc04000000c7470c05000000eb0ae947000000e942000000895f08c7470403000000c707650000008d4714c740fc02000000c740040100000089388d580cc743fc0200000089430489338d430cc740fc0200000089580489085290e8ba00000083f80175058b0424eb0a89c38b0424e80201000083f8017509b8f81f86b283c408c389c3b8f81f86b283c408e97901000090000000005c030000|@11781,2097151,@2109|78,0,@11768 112,0,@7422 128,0,0 160,0,@5215 166,0,I106 206,0,@8802 220,0,0 226,0,4 243,0,0 268,0,@11771 312,0,59 332,0,@8802 339,0,0 345,0,7 362,0,2 384,0,1 390,0,50 407,0,0 465,0,@7422 484,0,0 515,0,@5215 522,0,I106 561,0,@8800 575,0,0 581,0,4 598,0,0 622,0,@11771 668,0,59 688,0,@8800 695,0,0 701,0,7 718,0,2 740,0,1 746,0,50 763,0,0 802,1,@11773 822,1,@11774 832,0,@11775 843,0,@11775 851,1,@11780 11768:O4|@4608,@5398,@11770,@11769 11769:O5|@9182,1585,0,1585,0 11770:S11|627974654d656d4d6f7665 11771:O4|@4608,@5398,@10406,@11772 11772:O5|@9182,1577,0,1577,0 11773:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8380484b2c39090900000000044000000|@6536,3,@2106|56,0,@10401 11774:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2107| 11775:O2|@10394,@11776 11776:O2|@10396,@11777 11777:O2|@10398,@11778 11778:O2|@11779,0 11779:O2|47,1 11780:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2108| 11781:S28|5838364c4f574c4556454c28292e627974654d656d4d6f7665283229 11782:O1|@11783 11783:D3,56|8b088b50048b45008d40f03b45087303ff5520894500c740fc03000000c700042186b28950048948088060ffbfc390900000000034000000|@11786,7,@2114|31,0,@11784 11784:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700542186b28b5a048958048b720889700889480c8060ffbfc30000000038000000|@9631,31,@2113|28,0,@11785 11785:D3,240|3b650c7303ff552489c18b5a08f6c101740f89c6b8bc7e7ab28b5d04909090ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc783390775708b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4904894b04c703050000008b4a0c6a016a0150ff7204ff7208538d5c2410538b59048b0190e82e58fbff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240889085aff1289c158eb05e90700000083c40889caff22b99f0100008b1c24890c246a01ff7208ff720489d98b5a0c51e90360fbff90909000000000ec000000|@9630,2097151,@2112|21,0,@5417 107,0,2 138,1,@9594 200,0,207 225,1,@9620 11786:S39|5838364c4f574c4556454c28292e616c6c496e526567734f724c69746572616c73283229283129 11787:S27|5838364c4f574c4556454c28292e616c6c41726773283129283129 11788:S30|5838364c4f574c4556454c28292e67656e4d656d4d6f7665283129283129 11789:O1|@11790 11790:D3,56|8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701282386b28d410cc740fc010000008908c390900000000034000000|@10896,3,@2140|29,0,@11791 11791:O1|@11792 11792:D3,16|b8542386b2c39090000000000c000000|@11788,1,@2139|1,0,@11793 11793:O1|@11794 11794:D3,48|3b650c7303ff5524b9810000008b1424890c246a036a0168a02386b2bb2c0c84b252e9b95efbff90000000002c000000|@9623,2097151,@2138|9,0,64 24,0,@11795 29,0,@10423 35,1,@9620 11795:O1|@11796 11796:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700ec2386b28948048060ffbfc3000000002c000000|@10255,3,@2137|28,0,@11797 11797:D3,48|3b650c7303ff5524b9010100008b1c24890c246a036a0568302486b289d98b5a0451e9295efbff90000000002c000000|@9623,2097151,@2136|9,0,128 24,0,@11798 35,1,@9620 11798:O1|@11799 11799:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c7007c2486b28948048060ffbfc3000000002c000000|@10255,3,@2135|28,0,@11800 11800:D3,48|3b650c7303ff5524b9050000008b1c24890c246a036a0968c02486b289d98b5a0451e9995dfbff90000000002c000000|@9623,2097151,@2134|9,0,2 24,0,@11801 35,1,@9620 11801:O1|@11802 11802:D3,40|3b650c7303ff5524b9042586b28b1424890c24bb282b86b252e99660fdff90900000000024000000|@11787,1048575,@2133|9,0,@11803 20,0,@11823 26,1,@10257 11803:O1|@11804 11804:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700502586b28948048060ffbfc3000000002c000000|@9619,3,@2129|28,0,@11805 11805:D3,84|3b650c7303ff55248b42048b58048b0889c8909090e84e000000539090e8be00000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000050000000|@9618,2097151,@2128|22,1,@11806 30,1,@11807 69,0,0 11806:D3,100|3b650c7303ff5524a801754783380175108b48048b10b84cc37bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@2123|23,0,@6769 84,0,0 11807:D3,784|3b650c7303ff5524a801753f8b088339037538f640040175328b5004f642040175298b5a048b33833e03751ff643040175198b7b04f647040175108b4f048b11833a03750683790401740e89c1b8542986b28b5d049090ff138b70048b5e048b7b048b0f833905756ff6410401750ab808a87cb28b5d04ff13837904017507ba01000000eb708b5104f6c201740783fa017d19eb06f642ff107411ff3689d3b88c6c7ab2ff1588c75208eb0489d0ff36bb09000000909090ff15c8c752088b4d008d49e03b4d087303ff5520894d00c741fc04000000eb05e93700000089410cc741084cc37fb2c7410401000000c70109000000eb05e9150000008d5114c742fc02000000c7420401000000890aeb6dff36eb6e833903740cb8802986b28b5d049090ff138b55008d52d03b55087303ff5520895500c742fc020000008b4104894204c702030000008d5a0cc743fc05000000c743104cc37fb2c7430cfdffffff895308c74304ac2986b2c7033d0000008d5318c742fc02000000eb0ae910000000e90b000000c7420401000000891aff368b0424833805756ef6400401750d8b4804b808a87cb28b5d04ff13837804017507b801000000eb768b4804f6c101740783f9017d19eb06f641ff1074115289cbb88c6c7ab290ff1588c75208eb0389c852bb09000000ff15c8c752088b4d008d49e03b4d087303ff5520894d00c741fc04000000eb05e93600000089410cc7410830c37fb2c7410401000000c701090000008d4114c740fc02000000eb05e90b000000c74004010000008908eb6b52eb6d833803740db8802986b28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c701030000008b45008d40dc3b45087303ff5520894500c740fc05000000c7401030c37fb2c7400cfdffffff894808c74004b42986b2eb0ae921000000e91c000000c7003d00000089c18d4018c740fc02000000c7400401000000890852e8b600000083f80175058b0424eb0a89c38b0424e8fe00000083f8017509b8702a86b283c408c389c3b8702a86b283c408e97501000090000000000c030000|@11822,2097151,@2127|78,0,@11808 112,0,@7422 128,0,0 160,0,@5215 166,0,I106 177,0,4 186,0,I108 227,0,@8802 234,0,0 240,0,4 264,0,0 282,0,@11810 325,0,1 342,0,@8802 349,0,-2 359,0,@11812 365,0,30 394,0,0 420,0,@7422 436,0,0 467,0,@5215 474,0,I106 484,0,4 490,0,I108 531,0,@8800 538,0,0 544,0,4 568,0,0 585,0,@11810 629,0,1 660,0,@8800 667,0,-2 677,0,@11813 695,0,30 714,0,0 722,1,@11814 742,1,@11815 752,0,@11816 763,0,@11816 771,1,@11821 11808:O4|@4608,@5398,@11770,@11809 11809:O5|@9182,1609,0,1609,0 11810:O4|@4608,@5398,@10406,@11811 11811:O5|@9182,1602,0,1602,0 11812:O1|@8802 11813:O1|@8800 11814:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8380484b2c39090900000000044000000|@6536,3,@2124|56,0,@10401 11815:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2125| 11816:O2|@10394,@11817 11817:O2|@10396,@11818 11818:O2|@10398,@11819 11819:O2|@11820,0 11820:O2|47,2 11821:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2126| 11822:S28|5838364c4f574c4556454c28292e776f72644d656d4d6f7665283229 11823:O1|@11824 11824:D3,56|8b088b50048b45008d40f03b45087303ff5520894500c740fc03000000c7007c2b86b28950048948088060ffbfc390900000000034000000|@11786,7,@2132|31,0,@11825 11825:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700cc2b86b28b5a048958048b720889700889480c8060ffbfc30000000038000000|@9631,31,@2131|28,0,@11826 11826:D3,240|3b650c7303ff552489c18b5a08f6c101740f89c6b8bc7e7ab28b5d04909090ff1383fb0175048b09eb1cf6c301740583eb027105ff5538ebf68b49043b650c7303ff5524ebc783390775708b5d008d5bf43b5d087303ff5520895d00c743fc020000008b4904894b04c703050000008b4a0c6a016a0150ff7204ff7208538d5c2410538b59048b0190e8b64dfbff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240889085aff1289c158eb05e90700000083c40889caff22b99f0100008b1c24890c246a01ff7208ff720489d98b5a0c51e98b55fbff90909000000000ec000000|@9630,2097151,@2130|21,0,@5417 107,0,2 138,1,@9594 200,0,207 225,1,@9620 11827:S36|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629 11828:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2142| 11829:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2143| 11830:S26|47454e45524154455f434f444528292e636f646567656e283929 11831:D3,12|8b4204c30000000008000000|@11832,5,@2145| 11832:S29|47454e45524154455f434f444528292e67656e636f6465283329283129 11833:S11|3c746f70206c6576656c3e 11834:O1|@11835 11835:D3,24|b8602e86b28b5d04909090ff139090900000000014000000|@8992,1,@2146|1,0,@11836 11836:O4|@4608,@5398,@11838,@11837 11837:O5|@9130,2523,0,2523,0 11838:S17|746f70206c6576656c2072656163686564 11839:D3,60|3b650c7303ff55248b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b52048910ff25c8d3520890900000000038000000|@11832,2097151,@2147|35,0,0 46,0,I204 11840:S26|47454e45524154455f434f444528292e67656e636f6465283329 11841:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2149| 11842:S48|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e636f646547656e6572617465283329 11843:D3,160|3b650c7303ff5524a8017572ff7004536a018b442414909090e836bbf5ff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b54240c895104890158a801740583c0027105ff5538ebf651ff7424105289c38b44240c909090e89effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e90c0000008948045983c4048908c20800b801000000c2080090000000009c000000|@11844,1048575,@2151|26,1,@6843 144,0,0 11844:S61|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831296765744974656d283229 11845:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d62646173283129 11846:O4|@4656,@7241,0,@11847 11847:O5|@7240,75,0,75,0 11848:D3,216|3b650c7303ff5524a80175728b088b510853ff7004ff7104ff7208ff720cff7210ff7214ff7218ff721c53ff742440ff742440ff742440ff742440ff742440ff7424408b5a048b0290e89e0000008b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c7010100000051ff742424ff742424eb05e945000000ff742424ff742424ff742424ff7424248b5c24208b44241c9090e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21800b801000000c2180000000000d4000000|@6329,1048575,@2157|74,1,@11849 111,0,0 201,0,0 11849:D3,268|3b650c7303ff55248b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc06000000c7021c3386b2894a048b74241c8972088b7c2418897a0c8b7424148972108b7c2430897a148062ffbf535168d03486b2ff742430ff742414ff742420ff74242089d38b54242c9090ff12598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c28b45008d40dc3b45087303ff5520894500c740fc080000008b5c242489581c8b742428897018c74014030000008b7c243089781089480cc7400801000000598948048910c234000000000008010000|@11856,1048575,@2156|34,0,0 50,0,@11850 92,0,@11853 126,0,0 230,0,1 247,0,0 11850:D3,216|3b650c7303ff55248b4a14f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b09eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca6a016a0152ff7208ff720cff72108d5c241089c8e85267f8ff8b44240483380174328b0c248b59048b400490e80ac4f5ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb0289c18b0424518b58048b44240c909090e84200000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c3909000000000d4000000|@11852,1048575,@2154|19,0,@5417 86,1,@8405 110,1,@6874 143,0,1 166,1,@11851 11851:D3,92|3b650c7303ff5524a801754253ff70048b00909090e876c3f5ff508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,63,@2153|22,1,@6874 79,0,0 11852:S77|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829636c6f73757265526566283129 11853:O1|@11854 11854:D3,16|b801000000c39090000000000c000000|@11855,1,@2155|1,0,0 11855:S81|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f7375726528382970726f636573736564426f64792d283129 11856:S64|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829 11857:S65|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f646528312970726f6365737344656373283129 11858:O4|@4608,@5398,@11860,@11859 11859:O5|@8377,222,0,222,0 11860:S30|4c69667465642066756e6374696f6e206f7574206f6620636f6e74657874 11861:D3,124|3b650c7303ff5524a80175628b0853ff7004ff71048b019090e8b6c3f6ff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901518b5c24088b442404e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000078000000|@6329,1048575,@2159|26,1,@7801 111,0,0 11862:D3,128|3b650c7303ff5524a80175638b4d008d49e83b4d087303ff5520894d00c741fc020000008b10895104c701090000008d590cc743fc02000000c7430403000000890b538b480489c890e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000007c000000|@6329,15,@2160|43,0,4 60,0,1 112,0,0 11863:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2161| 11864:D3,124|3b650c7303ff5524a80175628b0853ff7004ff71048b019090e83ac2f6ff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901518b5c24088b442404e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000078000000|@6329,1048575,@2162|26,1,@7801 111,0,0 11865:D3,128|3b650c7303ff5524a80175638b4d008d49e83b4d087303ff5520894d00c741fc020000008b10895104c701090000008d590cc743fc02000000c7430403000000890b538b480489c890e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000007c000000|@6329,15,@2163|43,0,4 60,0,1 112,0,0 11866:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2164| 11867:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f6465283129 11868:S37|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f6479283529 11869:O4|1,@11871,0,@11870 11870:O5|@8349,83,0,83,0 11871:S9|496e74657272757074 11872:S63|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465546f436f6e7374616e74283329 11873:O4|@4608,@5398,@11875,@11874 11874:O5|@8349,205,0,205,0 11875:S14|4e6f74206120636f6e7374616e74 11876:D3,48|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff7214ff721889de8b5a088b4a0489ca56ff2290000000002c000000|@8357,1048575,@2168| 11877:D3,48|3b650c7303ff55248b4a0c8b1c24890c24ff7210ff7214ff721889de8b5a088b4a0489ca56ff2290000000002c000000|@8357,1048575,@2169| 11878:S65|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e7328342970726f6365737342696e64696e6773283129 11879:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04bac46d7eb256ff2290000000002c000000|@8357,1048575,@2171|32,0,@8356 11880:D3,376|3b650c7303ff5524833803756c8b4a0c8b4004f6c101740d89c3b8bc7e7ab28b5d0490ff1383f80175048b01eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebca528b4a0889ca90ff12833801750483c404c38b0c248b59048b400490e8a6bbf5ff89c18b45008d40f43b4508730aeb05e91a000000ff5520894500c740fc02000000894804c7000300000083c404c3833805756b8b4804f6c101740783f9017d08eb20f641ff10751a8b5a108b1bf6c1017409f6c30174043bcbeb05ff5538ebf77c0d89c3b8f0ea7ab28b5d0490ff13f6c101740583c1027105ff5538ebf68b52108b4c4afef6c10175338b018b48048b108b45008d40f03b4508730aeb05e93e000000ff5520894500c740fc03000000894808895004c70001000000c389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c3900000000074010000|@11881,1048575,@2172|27,0,@5417 102,1,@6874 144,0,1 207,0,@6373 290,0,0 326,0,1 362,0,1 11881:S61|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e732834296c6f6f6b75704c6f63616c283129 11882:D3,136|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b580489198b30f7c601000000740783fe017d08eb26f646ff1075208b7a048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13f7c601000000740583c6027105ff5538ebf68b5204894c72feb801000000c30000000084000000|@11883,63,@2173|85,0,@6397 123,0,0 11883:S58|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429636f6e746578742d283129 11884:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a04bac46d7eb256ff2290000000002c000000|@8357,1048575,@2174|32,0,@8356 11885:S47|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429 11886:O1|@11887 11887:D3,24|b8947c7eb28b5d04909090ff139090900000000014000000|@8378,1,@2177|1,0,@8374 11888:D3,396|3b650c7303ff552483381575088b4008e9ebffffff83381d757153bb8c4086b28b40049090e87e01000089c1f6c1017519f60101740d8b49043b650c7303ff5524ebe9b901000000eb05b90300000083f9017406b801000000c38b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c01000000894108c741048b000000c7013ce239b2eb05e9140000008d4114c740fc02000000c74004010000008908c3833809756c8b4804833905740cb8c8657eb28b5d049090ff138b5104f6c201740783fa017d08eb20f642ff10751a8b33f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0db8f0ea7ab28b5d04909090ff13f6c201740583c2027105ff5538ebf68b5453fef6c20175348b1aeb05e95b0000008b75008d76f03b75087303ff5520897500c746fc030000008b7b04897e088b03894604c70601000000eb218b75008d76f43b75087303ff5520897500c746fc02000000894e04c70603000000833e0175048b4608c3b801000000c383380575048b4008c3b801000000c30000000088010000|@11891,1048575,@2179|28,0,@11889 38,1,@11890 68,0,0 75,0,1 85,0,0 117,0,0 127,0,69 133,0,@4606 157,0,0 178,0,@8346 237,0,@6373 319,0,0 354,0,1 368,0,0 383,0,0 11889:O1|@11888 11890:D3,104|3b650c7303ff5524a801754c53ff70048b5c240c8b008b5424049090ff1250ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,1048575,@2178|89,0,0 11891:S68|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296578747261637450726f7073283129 11892:O2|@11893,@4606 11893:D3,316|3b650c7303ff552483fb017501c383f801750389d8c36a016a0189c75352ff72048d5c240c89f89090e8220100006a016a018b442408ff70048d5c24048b442410e80a020000f644241001756ef6042401756d8b4424108b0c248b108b5c24088b323b7304740ab854eb7ab28b5d04ff138b398b073b4304740bb854eb7ab28b5d0490ff13ff7424088b5f088b42089090e8820200008b4c24088b55008d52ec3b55087303ff5520895500c742fc04000000c7420c01000000eb0ae957000000e952000000894208c742048b0000008b4904890a837c24040175068b442414eb1389d68b5c24048b4424149090e8c602000089f289c18b45008d40f43b45087303ff5520894500c740fc02000000894804891083c418c3837c240c01750689f883c418c38b5c240c89f883c418e9de02000090900000000038010000|@11900,1048575,@2185|42,1,@11894 66,1,@11896 104,0,@6377 123,0,@6377 146,1,@11897 181,0,0 203,0,69 238,1,@11898 302,1,@11899 11894:D3,180|3b650c7303ff5524a80175718b088b113b542404752a8b75008d76f83b75087303ff5520897500c746fc01000000890e89338b7004897304b801000000c204006a016a015351ff7424148d5c240c8b4004e8aaffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948045989088b0c24eb05e9140000008b5424048911894104b80100000083c40cc20400c70301000000c7430401000000b801000000c204009000000000b0000000|@11895,31,@2180|57,0,0 140,0,0 152,0,0 159,0,0 164,0,0 11895:S48|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e73706c697450726f70732832292829 11896:D3,180|3b650c7303ff5524a80175718b088b113b542404752a8b75008d76f83b75087303ff5520897500c746fc01000000890e89338b7004897304b801000000c204006a016a015351ff7424148d5c240c8b4004e8aaffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948045989088b0c24eb05e9140000008b5424048911894104b80100000083c40cc20400c70301000000c7430401000000b801000000c204009000000000b0000000|@11895,31,@2181|57,0,0 140,0,0 152,0,0 159,0,0 164,0,0 11897:D3,140|3b650c7303ff552483f801751883fb01740bb8f00a7eb28b5d0490ff13b801000000c20400f6c301740f8b48048b10b8f00a7eb28b5d04ff13ff7304ff70048b1b8b008b54240c90ff1250ff7424108b5c240c8b4424089090e8a2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c204000000000088000000|@8211,1048575,@2182|19,0,@8209 30,0,0 48,0,@8209 11898:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2183| 11899:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2184| 11900:S51|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e6d657267655475706c6550726f7073283229 11901:S53|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329 11902:D3,176|3b650c7303ff5524a80175708b08ff700453ff7104ff316a018b442418e892a4f5ff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b4424048941085883c404894104c7010300000058a801740583c0027105ff5538ebf651ff74240c89c38b4424089090e88effffff89c18b45008d40f4eb05e91e0000003b45087303ff5520894500c740fc020000008948045983c4048908c20400b801000000c204009000000000ac000000|@11903,1048575,@2187|30,1,@6843 77,0,1 160,0,0 11903:S83|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129676574526573756c7473283229 11904:S70|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129 11905:S53|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e283329 11906:O2|3,@11907 11907:S19|4f7574707574206f66206f7074696d69736572 11908:S55|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f6365737354726565283329 11909:S41|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d69736572283329 11910:D3,192|3b650c7303ff55248338057573ff7008686c4986b2ff70048d5c24048b04249090e84aeff4ff89c1f6c10175208b118b5a04833b03750f8b710489f13b650c7303ff5524ebe2b901000000eb05b90300000083f9017409b8ec7d7ab283c40cc38b4d008d49f43b4d087303ff5520894d00c741fc02000000c70188807ab2eb05e9320000008941048061ffbf8b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7000500000083c40cc3c300000000bc000000|@11913,1048575,@2193|17,0,@11911 34,1,@6547 71,0,0 78,0,1 88,0,@5413 122,0,@5433 175,0,2 11911:D3,76|3b650c7303ff5524528b4a0489ca9090ff12ff308b4004bacc4986b2ff1289c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c390900000000048000000|@8043,1048575,@2192|24,0,@11912 11912:O1|@11910 11913:S36|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129 11914:D3,80|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c2489c28b45008d40f03b45087303ff5520894500c740fc030000008b490483c404894808895004c70005000000c39090000000004c000000|@11915,1048575,@2194|10,0,0 65,0,2 11915:S24|434f44455452454528292e67656e436f6465283329283129 11916:O1|@11917 11917:D3,112|8b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b8104b86b2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338037506b8844b86b2c3f6c101740783f9037c0eeb06f641ff107506b8cc4b86b2c3b8d8327bb2c390000000006c000000|@11933,3,@2195|22,0,@6514 33,0,@11918 57,0,@6514 68,0,@11925 92,0,@11929 98,0,@6514 11918:O5|0,0,0,@11920,@11919 11919:O2|@11923,0 11920:O2|@11921,0 11921:O2|0,@11922 11922:O5|@5400,197,197,0,0 11923:O2|3,@11924 11924:S9|556e56697369746564 11925:O5|0,0,0,@11920,@11926 11926:O2|@11927,0 11927:O2|3,@11928 11928:S14|5669736974656447656e6572616c 11929:O5|0,0,0,@11920,@11930 11930:O2|@11931,0 11931:O2|3,@11932 11932:S14|566973697465645370656369616c 11933:S11|7072696e742d7669736974 11934:O2|@11936,@11935 11935:O2|@11938,@11934 11936:D3,216|3b650c7303ff552483380175728b4804be010000008b790cf7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd953528b580889f0909090e87aebf4ffa80175238b0c248b10ff7004ff7424088b5a048b028b51049090ff12583b650c7303ff5524ebd9b80100000083c408eb05e901000000c3833805754053528b58088b480489c890e82eebf4ffa80175238b0c248b10ff7004ff7424088b5a048b028b51049090ff12583b650c7303ff5524ebd9b80100000083c408c3b801000000c300000000d4000000|@11937,1048575,@2196|17,0,0 74,1,@6547 118,0,0 150,1,@6547 194,0,0 203,0,0 11937:S32|434f44455452454528292e67656e436f646528332966696e6444656373283129 11938:D3,500|3b650c7303ff55248338017508b801000000c204008b4804833905740cb85c4f86b28b5d049090ff138b7104f7c601000000740783fe017d08eb27f646ff1075218b7c24048b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0bb8f0ea7ab28b5d0490ff13f7c601000000740583c6027105ff5538ebf68b7c24048b7477fe83fe037571833b037508b801000000c204008b7104f7c601000000740783fe017d08eb23f646ff10751d8b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0bb8b0f57ab28b5d0490ff13f7c601000000740583c6027105ff5538ebf68b7c2404c74477fe0500000089de89fbeb05e90c00000089f08b52045983c40451ff2283fe057508b801000000c20400833b03755c8b5104f6c201740783fa017d08eb20f642ff10751a8b3ff6c201740cf7c70100000074043bd7eb05ff5538ebf77c0ab8b0f57ab28b5d04ff13f6c201740583c2027105ff5538ebf68b5c2404c74453fe03000000b801000000c204008b7104f7c601000000740783fe017d08eb23f646ff10751d8b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0cb8b0f57ab28b5d049090ff13f7c601000000740583c6027105ff5538ebf68b7c2404c74477fe0500000089de89fb89f08b52045983c40451ff229000000000f0010000|@11942,1048575,@2197|14,0,0 30,0,@11939 99,0,@6373 146,0,0 207,0,@6397 243,0,2 276,0,0 336,0,@6397 368,0,1 373,0,0 434,0,@6397 471,0,2 11939:O4|@4608,@5398,@11941,@11940 11940:O5|@5400,242,0,242,0 11941:S36|646f47656e6572616c3a206e6f74204c6f61644c6f63616c206f7220436f6e7374616e74 11942:S41|434f44455452454528292e67656e436f646528332970726f6365737347656e416e6453706563283229 11943:D3,752|3b650c7303ff55248338017572ff700868ec5286b2ff7008538d5c24088b400c90e8fae7f4ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000f64424040174158b1424b8ffffff002342fc8d4400013b442404770bb8cc7b7ab28b5d0490ff138b4424048b4442feeb05e96d00000083f801745d8b442404a801740783f8017d08eb20f640ff10751a8b5424148b12a8017409f6c20174043bc2eb05ff5538ebf77c0db8b0f57ab28b5d04909090ff13a801740583c0027105ff5538ebf68b542414894c42feb80100000083c410c20400b80100000083c410c204008338057508b801000000c2040083380775698b4004a80175678b088b5104f6c201740783fa017c08eb16f642ff1074108b7004b8a4727db28b5d04909090ff138b75008d76e83b75087303ff5520897500c746fc02000000895604c706050000008d7e0cc747fc02000000897704c70709000000f6c201741ceb0ae99d000000e990000000beffffff002373fc8d7436013bd6720f8b7004b8cc7b7ab28b5d049090ff138b7453fe83fe017456f6c201740783fa017d08eb24f642ff10751e8b7424048b36f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0f8b7004b8b0f57ab28b5d049090ff13f6c201740583c2027105ff5538ebf68b742404897c56fe8b480489c83b650c7303ff5524e900ffffffb801000000c204008b4808f6c101740783f9017c08eb10f641ff10740ab8a4727db28b5d04ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702050000008d720cc746fc02000000895604c70609000000f6c1017410baffffff002353fc8d5412013bca720bb8cc7b7ab28b5d0490ff138b5c4bfe83fb017456f6c101740783f9017d08eb21f641ff10751b8b5424048b12f6c1017409f6c20174043bcaeb05ff5538ebf77c0ab8b0f57ab28b5d04ff13f6c101740583c1027105ff5538ebf68b442404897448feb801000000c20400b801000000c2040000000000ec020000|@11945,1048575,@2199|17,0,@11944 34,1,@6547 65,0,0 74,0,14 89,0,8388607 107,0,@5401 185,0,@6397 220,0,0 231,0,0 247,0,0 293,0,@7993 334,0,2 353,0,4 375,0,8388607 394,0,@5401 466,0,@6397 519,0,0 548,0,@7993 586,0,2 605,0,4 615,0,8388607 631,0,@5401 696,0,@6397 729,0,0 737,0,0 11944:D3,128|8b4a04f6c101740783f9017c08eb12f641ff10740c89c3b8a4727db28b5d04ff138b5d008d5bd43b5d087303ff5520895d00c743fc02000000894b04c703050000008d730cc746fc02000000895e04c7060900000089c38d460cc740fc04000000c7400c01000000895808897004c7000d000000c3909090000000007c000000|@8148,31,@2198|24,0,@7993 62,0,2 81,0,4 100,0,0 112,0,6 11945:S31|434f44455452454528292e67656e436f646528332961646444656373283129 11946:D3,552|3b650c7303ff552452b8010000008b4a1089ca90ff12a801740f89c1b8e45586b28b5d04909090ff13a801740c89c1b8ecd57ab28b5d04ff138b088b14248b5a0cf6c30175358b33813e3ce239b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b730489f33b650c7303ff5524ebc6bf0100000083ff017507bb01000000eb368b1f813b3ce239b2740f89c6b854eb7ab28b5d04909090ff138b73088b5d008d5bf83b5d087303ff5520895d00c743fc010000008933f6c30175298b75008d76f43b75087303ff5520897500c746fc02000000c706b4817ab28b1b895e048066ffbfeb05bef0777ab2515650b80100000089f290ff128b4c240c8b5108833a0175648b5d008d5be83b5d087303ff5520895d00c743fc05000000c703f8777ab28b72088973048b7904897b088b342489730c8b7424048973108063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000895e088b5204895604c70601000000eb69833a0575698b5d008d5be83b5d087303ff5520895d00c743fc05000000c703ec7f7ab28b72088973048b7904897b088b342489730c8b7424048973108063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000895e088b5204895604c70605000000eb0ae905000000beec7d7ab289f383c408909090e89e00000089c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c404894804c70005000000c39090900000000024020000|@11915,1048575,@2201|10,0,0 29,0,@11947 48,0,@6321 74,0,@4606 124,0,0 134,0,0 144,0,@4606 153,0,@6377 225,0,@5448 241,0,@5387 249,0,0 296,0,@5388 364,0,0 401,0,@5429 469,0,2 481,0,@5413 494,1,@11950 536,0,2 11947:O4|@4608,@5398,@11949,@11948 11948:O5|@5400,282,0,282,0 11949:S31|526573756c7420766563746f72206973206e6f7420616e2061646472657373 11950:D3,164|3b650c7303ff552483f8017550833b037506b801000000c38b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e98fffffff518b4004e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@6849,11,@2200|19,0,0 51,0,0 61,0,69 67,0,@4607 86,0,0 97,0,@4607 11951:S21|434f44455452454528292e67656e436f6465283329 11952:O1|@11953 11953:D3,1320|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b10833a01755df6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b3564e039b289d889f290ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700545c86b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b8d8327bb2c38b30833e03755cf6c301740583eb027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc02000000895f048b5e04891f8b0d64e039b289f889caff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700cc5c86b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7804f7c701000000740783ff037d0eeb06f647ff107406b8d8327bb2c38b08833905755df7c701000000740583ef027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000897a048b7904893a8b1d64e039b289d089da9090ff128338017558f640100175578b4810f641040175628b11833a07751feb05e925010000837a04517468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700445d86b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5004f6c201740783fa037c0eeb06f642ff107506b8b85d86b2c3b8d8327bb2c390900000000024050000|@11982,1048575,@2203|30,0,@6514 91,0,@4587 145,0,123 154,0,91 187,0,@5642 227,0,@5643 263,0,@5594 283,0,0 290,0,1 297,0,3 303,0,0 342,0,0 363,0,@5592 382,0,@11954 404,0,0 411,0,0 418,0,1 424,0,0 451,0,@6514 512,0,@4587 565,0,123 574,0,91 607,0,@5642 647,0,@5643 683,0,@5594 703,0,0 710,0,1 717,0,3 723,0,0 762,0,0 783,0,@5592 802,0,@11961 824,0,0 831,0,0 838,0,1 844,0,0 874,0,@6514 938,0,@4587 993,0,123 1002,0,91 1035,0,@5642 1075,0,@5643 1111,0,@5594 1131,0,0 1138,0,1 1145,0,3 1151,0,0 1190,0,0 1211,0,@5592 1230,0,@11968 1252,0,0 1259,0,0 1266,0,1 1272,0,0 1299,0,@11975 1305,0,@6514 11954:O5|0,0,0,@11956,@11955 11955:O2|@11959,0 11956:O2|@11957,0 11957:O2|0,@11958 11958:O5|@8433,120,120,0,0 11959:O2|3,@11960 11960:S14|50324c6f6164417267756d656e74 11961:O5|0,0,0,@11963,@11962 11962:O2|@11966,0 11963:O2|@11964,0 11964:O2|0,@11965 11965:O5|@8433,121,121,0,0 11966:O2|3,@11967 11967:S13|50324c6f6164436c6f73757265 11968:O5|0,0,0,@11970,@11969 11969:O2|@11973,0 11970:O2|@11971,0 11971:O2|0,@11972 11972:O5|@8433,119,119,0,0 11973:O2|3,@11974 11974:S11|50324c6f61644c6f63616c 11975:O5|0,0,0,@11977,@11976 11976:O2|@11980,0 11977:O2|@11978,0 11978:O2|0,@11979 11979:O5|@8433,122,122,0,0 11980:O2|3,@11981 11981:S15|50324c6f6164526563757273697665 11982:S16|7072696e742d70324c6f6164466f726d 11983:S32|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329 11984:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2205| 11985:S28|56414c55455f4f505328292e646973706c617956616c756573283429 11986:D3,636|3b650c7303ff5524833b037575508b4b04bb0300000089c8bafc317ab2e816d3f3ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000eb05e956000000894104c7019c9a7ab28d410cc740fc02000000894804c7007c6186b28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101746ab8ecd57ab28b5d04909090ff13833b01755d508b4b04bb0300000089c8bafc317ab2909090e83ed2f3ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b4508730feb0ae980000000e975000000ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700986186b28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c1017412b8ecd57ab28b5d049090ff13b9b46186b2508b45008d40f43b45087303ff5520894500c740fc020000005a895004c70007000000a801740c89c2b8ecd57ab28b5d04ff138b55008d52c43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc020000008950049090c7009c9a7ab28d500cc742fc02000000894204890a8d420cc740fc05000000895010c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000078020000|@11993,2097151,@2207|18,0,1 25,0,@5052 30,1,@5053 63,0,3 73,0,@6321 112,0,0 140,0,@5592 159,0,@11987 179,0,0 186,0,0 193,0,0 199,0,0 209,0,@6321 231,0,1 238,0,@5052 246,1,@5053 279,0,3 289,0,@6321 340,0,0 361,0,@5592 380,0,@11989 400,0,0 407,0,0 414,0,0 420,0,0 430,0,@6321 442,0,@11991 477,0,3 488,0,@6321 524,0,0 547,0,@5592 582,0,0 589,0,0 596,0,0 602,0,0 613,0,@6321 11987:O2|3,@11988 11988:S6|696e66697872 11989:O2|3,@11990 11990:S5|696e666978 11991:O2|3,@11992 11992:S6|6e6f6e666978 11993:S31|56414c55455f4f505328292e646973706c6179466978537461747573283129 11994:S39|56414c55455f4f505328292e646973706c6179536967283529646973706c617953706563283229 11995:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2209| 11996:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2210|56,0,@7743 11997:O2|3,@11998 11998:S3|736967 11999:S25|56414c55455f4f505328292e646973706c6179536967283529 12000:O2|@5643,@12001 12001:O2|@12002,@6702 12002:O2|3,@12003 12003:S2|293a 12004:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2212| 12005:D3,116|3b650c7303ff552450528b4a0889ca90ff12a80175418b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc01000000890883c408c38b04248b40048b088b44240489ca83c408ff2290900000000070000000|@12006,1048575,@2213|49,0,0 12006:S40|56414c55455f4f505328292e646973706c617946756e63746f7273283329617267456e762d283129 12007:D3,116|3b650c7303ff552450528b4a0889ca90ff12a80175418b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc01000000890883c408c38b04248b40048b48048b44240489ca83c408ff22900000000070000000|@12006,1048575,@2214|49,0,0 12008:D3,152|3b650c7303ff55243b420c743aa8017568f6420c0175678b5a0cf6c3017407b903000000eb068b0b8d4c090183c10889c689dfd1e93bc9f3a68d7c3f018d7436018d4c0901753f8b45008d40ec3b45087303ff5520894500c740fc02000000c74004010000008b5204891089c18d400cc740fc01000000eb0ae908000000e9030000008908c38b52088b5204ff2290900000000094000000|@12006,1048575,@2215|32,0,1 98,0,0 12009:O2|@5592,@12010 12010:O2|@5594,0 12011:O2|3,@12012 12012:S7|66756e63746f72 12013:S30|56414c55455f4f505328292e646973706c617946756e63746f7273283329 12014:S56|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617946756e63746f7273283129 12015:O3|3,@12017,@12016 12016:O3|0,@12307,1 12017:O2|@12019,@12018 12018:O2|@6273,@12020 12019:O2|49,@6331 12020:O2|@12021,0 12021:O2|51,@12022 12022:O5|5,@12024,@12166,@12023,@5229 12023:O3|@12166,@5229,@12224 12024:O2|@12025,0 12025:O5|5,0,@12027,@12026,@5229 12026:O3|@12027,@5229,@12028 12027:S9|6e616d655370616365 12028:O3|@5500,@12030,@12029 12029:O3|@12223,@5256,@5255 12030:O3|2,0,@12031 12031:O3|3,@12033,@12032 12032:O3|0,@12205,1 12033:O2|@12035,@12034 12034:O2|@12056,@12055 12035:O2|@12037,@12036 12036:O3|2,@6000,@12038 12037:S6|616c6c466978 12038:O5|5,@12039,@5788,@5786,@5229 12039:O2|@12040,0 12040:O3|3,@12041,@5234 12041:O2|@12043,@12042 12042:O2|@12044,0 12043:O2|49,@5306 12044:O2|50,@12045 12045:O5|5,0,@12047,@12046,@5229 12046:O3|@12047,@5229,@12048 12047:S6|666978697479 12048:O3|@12050,@12053,@12049 12049:O3|@12054,@5256,@5255 12050:O2|1,@12051 12051:O3|2,@12052,0 12052:O4|0,@4684,3,1 12053:O4|1,@4685,0,0 12054:S31|506f6c794d4c2e4e616d6553706163652e496e66697865732e666978697479 12055:O2|@12076,@12075 12056:O2|@12058,@12057 12057:O3|2,@6000,@12059 12058:S6|616c6c536967 12059:O5|5,@12060,@5788,@5786,@5229 12060:O2|@12061,0 12061:O3|3,@12062,@5234 12062:O2|@12043,@12063 12063:O2|@12064,0 12064:O2|50,@12065 12065:O5|5,0,@12067,@12066,@5229 12066:O3|@12067,@5229,@12068 12067:S12|7369676e617475726556616c 12068:O3|@12070,@12073,@12069 12069:O3|@12074,@5256,@5255 12070:O2|1,@12071 12071:O3|2,@12072,0 12072:O4|0,@4686,3,1 12073:O4|1,@4687,0,0 12074:S40|506f6c794d4c2e4e616d6553706163652e5369676e6174757265732e7369676e617475726556616c 12075:O2|@12096,@12095 12076:O2|@12078,@12077 12077:O3|2,@6000,@12079 12078:S6|616c6c56616c 12079:O5|5,@12080,@5788,@5786,@5229 12080:O2|@12081,0 12081:O3|3,@12082,@5234 12082:O2|@12043,@12083 12083:O2|@12084,0 12084:O2|50,@12085 12085:O5|5,0,@12087,@12086,@5229 12086:O3|@12087,@5229,@12088 12087:S5|76616c7565 12088:O3|@12090,@12093,@12089 12089:O3|@12094,@5256,@5255 12090:O2|1,@12091 12091:O3|2,@12092,0 12092:O4|0,@4688,3,1 12093:O4|1,@4689,0,0 12094:S29|506f6c794d4c2e4e616d6553706163652e56616c7565732e76616c7565 12095:O2|@12116,@12115 12096:O2|@12098,@12097 12097:O3|2,@6000,@12099 12098:S7|616c6c54797065 12099:O5|5,@12100,@5788,@5786,@5229 12100:O2|@12101,0 12101:O3|3,@12102,@5234 12102:O2|@12043,@12103 12103:O2|@12104,0 12104:O2|50,@12105 12105:O5|5,0,@12107,@12106,@5229 12106:O3|@12107,@5229,@12108 12107:S10|74797065436f6e737472 12108:O3|@12110,@12113,@12109 12109:O3|@12114,@5256,@5255 12110:O2|1,@12111 12111:O3|2,@12112,0 12112:O4|0,@4690,3,1 12113:O4|1,@4691,0,0 12114:S39|506f6c794d4c2e4e616d6553706163652e54797065436f6e737472732e74797065436f6e737472 12115:O2|@12126,@12125 12116:O2|@12118,@12117 12117:O3|2,@6000,@12119 12118:S8|616c6c46756e6374 12119:O5|5,@12120,@5788,@5786,@5229 12120:O2|@12121,0 12121:O3|3,@12122,@5234 12122:O2|@12043,@12123 12123:O2|@12124,0 12124:O2|50,@6331 12125:O2|@12130,@12129 12126:O2|@12128,@12127 12127:O3|2,@12040,@6000 12128:S8|656e746572466978 12129:O2|@12134,@12133 12130:O2|@12132,@12131 12131:O3|2,@12061,@6000 12132:S8|656e746572536967 12133:O2|@12138,@12137 12134:O2|@12136,@12135 12135:O3|2,@12081,@6000 12136:S8|656e74657256616c 12137:O2|@12158,@12157 12138:O2|@12140,@12139 12139:O3|2,@6000,@12141 12140:S9|616c6c537472756374 12141:O5|5,@12142,@5788,@5786,@5229 12142:O2|@12143,0 12143:O3|3,@12144,@5234 12144:O2|@12043,@12145 12145:O2|@12146,0 12146:O2|50,@12147 12147:O5|5,0,@12149,@12148,@5229 12148:O3|@12149,@5229,@12150 12149:S12|73747275637475726556616c 12150:O3|@12152,@12155,@12151 12151:O3|@12156,@5256,@5255 12152:O2|1,@12153 12153:O3|2,@12154,0 12154:O4|0,@4692,3,1 12155:O4|1,@4693,0,0 12156:S40|506f6c794d4c2e4e616d6553706163652e537472756374757265732e73747275637475726556616c 12157:O2|@12162,@12161 12158:O2|@12160,@12159 12159:O3|2,@12101,@6000 12160:S9|656e74657254797065 12161:O2|@12169,@12168 12162:O2|@12164,@12163 12163:O3|2,@5306,@12165 12164:S9|6c6f6f6b7570466978 12165:O5|5,@12167,@12166,@12023,@5229 12166:S6|6f7074696f6e 12167:O2|@12045,0 12168:O2|@12175,@12174 12169:O2|@12171,@12170 12170:O3|2,@5306,@12172 12171:S9|6c6f6f6b7570536967 12172:O5|5,@12173,@12166,@12023,@5229 12173:O2|@12065,0 12174:O2|@12181,@12180 12175:O2|@12177,@12176 12176:O3|2,@5306,@12178 12177:S9|6c6f6f6b757056616c 12178:O5|5,@12179,@12166,@12023,@5229 12179:O2|@12085,0 12180:O2|@12185,@12184 12181:O2|@12183,@12182 12182:O3|2,@12121,@6000 12183:S10|656e74657246756e6374 12184:O2|@12191,@12190 12185:O2|@12187,@12186 12186:O3|2,@5306,@12188 12187:S10|6c6f6f6b757054797065 12188:O5|5,@12189,@12166,@12023,@5229 12189:O2|@12105,0 12190:O2|@12195,@12194 12191:O2|@12193,@12192 12192:O3|2,@12143,@6000 12193:S11|656e746572537472756374 12194:O2|@12200,0 12195:O2|@12197,@12196 12196:O3|2,@5306,@12198 12197:S11|6c6f6f6b757046756e6374 12198:O5|5,@12199,@12166,@12023,@5229 12199:O2|@6331,0 12200:O2|@12202,@12201 12201:O3|2,@5306,@12203 12202:S12|6c6f6f6b7570537472756374 12203:O5|5,@12204,@12166,@12023,@5229 12204:O2|@12147,0 12205:O2|@12037,@12206 12206:O2|@12058,@12207 12207:O2|@12078,@12208 12208:O2|@12098,@12209 12209:O2|@12118,@12210 12210:O2|@12128,@12211 12211:O2|@12132,@12212 12212:O2|@12136,@12213 12213:O2|@12140,@12214 12214:O2|@12160,@12215 12215:O2|@12164,@12216 12216:O2|@12171,@12217 12217:O2|@12177,@12218 12218:O2|@12183,@12219 12219:O2|@12187,@12220 12220:O2|@12193,@12221 12221:O2|@12197,@12222 12222:O2|@12202,0 12223:S26|506f6c794d4c2e4e616d6553706163652e6e616d655370616365 12224:O3|@12226,@12306,@12225 12225:O3|@12166,@5256,@5255 12226:O2|1,@12227 12227:O3|2,@12229,@12228 12228:O2|@12254,0 12229:O4|@12231,@4694,@12249,@12230 12230:O1|@12252 12231:O1|@12232 12232:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700047486b28948048060ffbfc3000000002c000000|@12235,3,@2219|28,0,@12233 12233:D3,60|3b650c7303ff55243bc37506b803000000c3a8017516f6c301750b8b52048b1b8b008b12ff22b801000000c3b801000000c390900000000038000000|@12234,1048575,@2218|13,0,1 39,0,0 45,0,0 12234:S12|65712d6f7074696f6e283229 12235:S15|65712d6f7074696f6e283229285029 12236:O1|@12237 12237:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700cc7486b28948048060ffbfc3000000002c000000|@12248,3,@2221|28,0,@12238 12238:D3,456|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b868977ab2c38338017506b8a87686b2c3f6c101740783f9037d0eeb06f641ff107406b868977ab2c38b52048b18f6c101740583e9027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008948048b1b89188b5204ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c700e47686b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000c4010000|@12247,1048575,@2220|30,0,@5578 41,0,@12239 65,0,@5578 162,0,123 171,0,91 204,0,@5642 242,0,@5643 278,0,@5594 298,0,0 305,0,1 312,0,3 318,0,0 357,0,0 378,0,@5592 399,0,@12243 421,0,0 428,0,0 435,0,1 441,0,0 12239:O5|0,0,0,@5229,@12240 12240:O2|@12241,0 12241:O2|3,@12242 12242:S4|4e4f4e45 12243:O5|0,0,0,@5229,@12244 12244:O2|@12245,0 12245:O2|3,@12246 12246:S4|534f4d45 12247:S12|7072696e742d6f7074696f6e 12248:S13|7072696e746f7074696f6e2829 12249:O1|@12250 12250:D3,16|b807000000c39090000000000c000000|@12251,1,@2222|1,0,3 12251:S12|626f7865642d6f7074696f6e 12252:D3,16|b803000000c39090000000000c000000|@12253,1,@2223|1,0,1 12253:S11|73697a652d6f7074696f6e 12254:O4|@4607,69,@12255,0 12255:O3|2,4,@12256 12256:O5|@5411,@12258,@5902,@12257,@5387 12257:O12|@12296,@12298,@12297,@12300,@12302,@12304,@12295,@12231,@4694,@12249,@12230,@12229 12258:O2|@5433,@12259 12259:O2|@12261,@12260 12260:O2|@5891,@12287 12261:O2|@5815,@12262 12262:O3|0,@12263,@5415 12263:O8|@12265,@12235,0,0,@12264,0,0,1 12264:O2|@12279,0 12265:O2|7,@12266 12266:O8|@12268,@12234,0,@5882,@12267,0,0,1 12267:O2|@5380,@12278 12268:O4|1,@5340,@5281,@12269 12269:O4|1,@5351,@12270,@5348 12270:O4|1,@5350,@12271,@5348 12271:O4|3,@12272,@5861,1 12272:O2|@12274,@12273 12273:O2|@12276,0 12274:O2|@12275,1 12275:O4|6,@5278,0,1 12276:O2|@12277,1 12277:O4|6,@5346,0,1 12278:O2|@5380,0 12279:O2|1,@12280 12280:O2|@12281,0 12281:O3|2,0,@12282 12282:O2|@12283,0 12283:O3|0,@12285,@12284 12284:O2|@12275,@12286 12285:O2|@5383,@5461 12286:O2|@12277,0 12287:O2|@12289,@12288 12288:O2|@12292,0 12289:O2|@5527,@12290 12290:O3|0,@12291,@5415 12291:O8|@5897,@12251,0,0,@5276,0,0,1 12292:O2|@5900,@12293 12293:O3|0,@12294,@5415 12294:O8|@5281,@12253,0,0,@5276,0,0,1 12295:O3|@12300,@12302,@12304 12296:O3|@12229,@12297,@12295 12297:O2|@12298,0 12298:O1|@12299 12299:D3,28|83f8017406b801000000c3b803000000c39090900000000018000000|@12242,1,@2224|6,0,0 12,0,1 12300:O1|@12301 12301:D3,28|a8017507b801000000eb05b80300000083f002c30000000018000000|@12246,1,@2225|5,0,0 12,0,1 12302:O1|@12303 12303:D3,40|89c18b45008d40f83b45087303ff5520894500c740fc010000008908c39090900000000024000000|@12246,3,@2226| 12304:O1|@12305 12305:D3,12|8b00c3900000000008000000|@12246,1,@2227| 12306:O4|1,@4695,1,0 12307:O2|49,@12308 12308:O2|50,@12309 12309:O2|51,0 12310:O2|@6333,@12311 12311:O2|@12312,0 12312:O4|@4600,69,@12313,0 12313:O2|@6332,0 12314:O2|@12316,@12315 12315:O2|@12317,0 12316:S4|6e616d65 12317:O4|@4596,69,@12318,0 12318:O7|@12316,2,@12320,@12319,@5229,0,0 12319:O3|2,@6331,@5306 12320:O2|1,@12321 12321:O3|2,@12322,0 12322:O1|@12323 12323:D3,12|8b4004c30000000008000000|@12324,1,@2228| 12324:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7246756e63746f72283129 12325:O2|@12327,0 12326:S4|636f6465 12327:O4|@4596,69,@12328,0 12328:O7|@12326,2,@12330,@12329,@5229,0,0 12329:O3|2,@6331,@12339 12330:O2|1,@12331 12331:O3|2,@12332,0 12332:O1|@12333 12333:D3,36|8b4808833903740db8a87d86b28b5d04909090ff138b4104c39090900000000020000000|@12338,3,@2229|9,0,@12334 12334:O4|103,@4956,@12336,@12335 12335:O5|@12337,1385,0,1385,0 12336:S20|4e6f74206120676c6f62616c2066756e63746f72 12337:S34|6d6c736f757263652f4d4c436f6d70696c65722f494e495449414c4953455f2e4d4c 12338:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7246756e6374283129 12339:O5|5,0,@12341,@12340,@5229 12340:O3|@12341,@5229,@12342 12341:S8|636f646574726565 12342:O3|@12344,@12347,@12343 12343:O3|@12348,@5256,@5255 12344:O2|1,@12345 12345:O3|2,@12346,0 12346:O4|0,@4696,3,1 12347:O4|1,@4697,0,0 12348:S24|506f6c794d4c2e436f6465547265652e636f646574726565 12349:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2230|1,0,@12350 12350:O4|11,@4879,0,@12351 12351:O5|@6542,533,0,533,0 12352:S35|5354525543545f56414c5328292e6d616b65456d707479476c6f62616c283129283129 12353:O2|@12027,@12354 12354:O2|@12355,0 12355:O4|@4600,69,@12356,0 12356:O2|@12026,0 12357:O2|@12359,@12358 12358:O2|@12360,0 12359:S11|54797065436f6e73747273 12360:O4|@4611,69,@12361,0 12361:O4|@12359,@5500,@12362,@5229 12362:O6|@12364,I48,0,@5229,@12363,0 12363:O1|@12411 12364:O4|1,@4699,@4700,@4698 12365:O1|@12366 12366:D3,28|3b650c7303ff5524bb15000000e91eebf3ff90900000000018000000|@5217,2097151,@2231|9,0,10 14,1,@5214 12367:O2|@12316,@12402 12368:O2|@6343,@12369 12369:O2|@12370,0 12370:O4|@4596,69,@12371,0 12371:O7|@6343,2,@12373,@12372,@5229,0,0 12372:O3|2,@12385,@5509 12373:O2|1,@12374 12374:O3|2,@12375,0 12375:O1|@12376 12376:D3,164|3b650c7303ff5524f6400801756e8b48088b55008d52f43b55087303ff5520895500c742fc02000000c702d48186b28b19895a048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c7064c8286b2895e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048917eb05bfc48286b28b0c24893c246a018b58048b1089d0ba70287bb251e905a7f4ff9000000000a0000000|@12384,2097151,@2236|43,0,@12377 82,0,@12378 125,0,@12379 145,0,@6508 151,1,@6510 12377:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2232|49,0,0 85,0,0 12378:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2233|49,0,0 85,0,0 12379:O2|@12381,@12380 12380:O1|@12383 12381:O1|@12382 12382:D3,16|b801000000c39090000000000c000000|@6352,1,@2234|1,0,0 12383:D3,16|b801000000c39090000000000c000000|@6352,1,@2235|1,0,0 12384:S58|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065436f6e737472283129 12385:O3|3,@12386,@12016 12386:O2|@12387,@12018 12387:O2|49,@12105 12388:O2|@12107,@12389 12389:O2|@12390,0 12390:O4|@4600,69,@12391,0 12391:O2|@12106,0 12392:O2|@6312,@12393 12393:O2|@12394,0 12394:O4|@4596,69,@12395,0 12395:O7|@6312,2,@12397,@12396,@5229,0,0 12396:O3|2,@12105,@6018 12397:O2|1,@12398 12398:O3|2,@12399,0 12399:O1|@12400 12400:D3,28|3b650c7303ff55248b008b4004e92a50f4ff90900000000018000000|@12401,31,@2237|14,1,@6320 12401:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7254797065436f6e737472283129 12402:O2|@12403,0 12403:O4|@4596,69,@12404,0 12404:O7|@12316,2,@12406,@12405,@5229,0,0 12405:O3|2,@12105,@5306 12406:O2|1,@12407 12407:O3|2,@12408,0 12408:O1|@12409 12409:D3,16|8b008b00c3909090000000000c000000|@12410,1,@2238| 12410:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7254797065283129 12411:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2239|1,0,@12350 12412:O2|@12414,@12413 12413:O2|@12415,0 12414:S6|56616c756573 12415:O4|@4611,69,@12416,0 12416:O4|@12414,@5500,@12417,@5229 12417:O6|@12419,I48,0,@5229,@12418,0 12418:O1|@12548 12419:O4|1,@4703,@4704,@4702 12420:O2|@5213,20 12421:O2|@12539,@12538 12422:O2|@6343,@12423 12423:O2|@12424,0 12424:O4|@4596,69,@12425,0 12425:O7|@6343,2,@12427,@12426,@5229,0,0 12426:O3|2,@12432,@5509 12427:O2|1,@12428 12428:O3|2,@12429,0 12429:O1|@12430 12430:D3,128|3b650c7303ff55248b0883790405755f8b5108833a0375578b5a04833b05751f8b75008d76f83b75087303ff5520897500c746fc010000008b7b04893eeb05be0100000083fe0175108b7804b84cc37bb28b5d04909090ff138b78048b0424893c248b590c89c78b0657e96155f5ffb858477bb2c3909090000000007c000000|@12431,2097151,@2240|64,0,0 77,0,@6769 107,1,@6814 112,0,@6594 12431:S26|56414c55455f4f505328292e7072696e7456616c756573283129 12432:O3|3,@12433,@5234 12433:O2|@12434,@6271 12434:O2|49,@12085 12435:O2|@12087,@12436 12436:O2|@12437,0 12437:O4|@4600,69,@12438,0 12438:O2|@12086,0 12439:O2|@12441,@12440 12440:O2|@12442,0 12441:S13|7072696e745769746854797065 12442:O4|@4596,69,@12443,0 12443:O7|@12441,2,@12445,@12444,@5229,0,0 12444:O3|2,@12457,@5509 12445:O2|1,@12446 12446:O3|2,@12447,0 12447:O1|@12448 12448:D3,160|3b650c7303ff5524f6400801756e8b48088b55008d52f43b55087303ff5520895500c742fc02000000c702348986b28b19895a048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706ac8986b2895e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048917eb05bf248a86b28b0c24893c246a018b58048b1089d051e93249f5ff9090000000009c000000|@12456,2097151,@2245|43,0,@12449 82,0,@12450 125,0,@12451 146,1,@6805 12449:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2241|49,0,0 85,0,0 12450:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2242|49,0,0 85,0,0 12451:O2|@12453,@12452 12452:O1|@12455 12453:O1|@12454 12454:D3,16|b801000000c39090000000000c000000|@6352,1,@2243|1,0,0 12455:D3,16|b801000000c39090000000000c000000|@6352,1,@2244|1,0,0 12456:S54|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617956616c756573283129 12457:O3|3,@12458,@12016 12458:O2|@12434,@12018 12459:O2|@12316,@12460 12460:O2|@12461,0 12461:O4|@4596,69,@12462,0 12462:O7|@12316,2,@12464,@12463,@5229,0,0 12463:O3|2,@12085,@5306 12464:O2|1,@12465 12465:O3|2,@12466,0 12466:O1|@12467 12467:D3,12|8b00c3900000000008000000|@12468,1,@2246| 12468:S24|5354525543545f56414c5328292e76616c4e616d65283129 12469:O2|@6312,@12470 12470:O2|@12471,0 12471:O4|@4596,69,@12472,0 12472:O7|@6312,2,@12474,@12473,@5229,0,0 12473:O3|2,@12085,@6018 12474:O2|1,@12475 12475:O3|2,@12476,0 12476:O1|@12477 12477:D3,120|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc020000008b500c895104c7011b000000f6c10174108b5010b8ecd57ab28b5d04909090ff1389cf8b481089c890e81648f4ff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048938c390900000000074000000|@12478,63,@2247|40,0,13 53,0,@6321 74,1,@6320 12478:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7256616c7565283129 12479:O2|@6209,@12480 12480:O2|@12481,0 12481:O4|@4600,69,@12482,0 12482:O2|@6208,0 12483:O2|@12485,@12484 12484:O2|@12486,0 12485:S9|7072696e7454797065 12486:O4|@4596,69,@12487,0 12487:O7|@12485,2,@12489,@12488,@5229,0,0 12488:O3|2,@12501,@5509 12489:O2|1,@12490 12490:O3|2,@12491,0 12491:O1|@12492 12492:D3,176|3b650c7303ff5524f6400801756e8b48088b55008d52f43b55087303ff5520895500c742fc02000000c702788e86b28b19895a048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706f08e86b2895e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048917eb05bf688f86b28b58048b30b8010000009090e8bea1f4ff8b0c24890424576a0189f0ba94477bb251e96cb9f4ff00000000ac000000|@12500,2097151,@2252|43,0,@12493 82,0,@12494 125,0,@12495 135,0,0 142,1,@6511 158,0,@6596 164,1,@6597 12493:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2248|49,0,0 85,0,0 12494:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2249|49,0,0 85,0,0 12495:O2|@12497,@12496 12496:O1|@12499 12497:O1|@12498 12498:D3,16|b801000000c39090000000000c000000|@6352,1,@2250|1,0,0 12499:D3,16|b801000000c39090000000000c000000|@6352,1,@2251|1,0,0 12500:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065457870283129 12501:O3|3,@12502,@12016 12502:O2|@12503,@12018 12503:O2|49,@6207 12504:O2|@12506,@12505 12505:O2|@12507,0 12506:S13|6973436f6e7374727563746f72 12507:O4|@4596,69,@12508,0 12508:O7|@12506,2,@12510,@12509,@5229,0,0 12509:O3|2,@12085,@5232 12510:O2|1,@12511 12511:O3|2,@12512,0 12512:O1|@12513 12513:D3,40|f64004017506b803000000c3837804017406b801000000c3b803000000c390900000000024000000|@12514,1,@2253|7,0,1 19,0,0 25,0,1 12514:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973436f6e7374727563746f72283129 12515:O2|@12517,@12516 12516:O2|@12518,0 12517:S11|6973457863657074696f6e 12518:O4|@4596,69,@12519,0 12519:O7|@12517,2,@12520,@12509,@5229,0,0 12520:O2|1,@12521 12521:O3|2,@12522,0 12522:O1|@12523 12523:D3,28|837804017406b801000000c3b803000000c390900000000018000000|@12524,1,@2254|7,0,0 13,0,1 12524:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973457863657074696f6e283129 12525:O2|@12326,@12526 12526:O2|@12527,0 12527:O4|@4596,69,@12528,0 12528:O7|@12326,2,@12530,@12529,@5229,0,0 12529:O3|2,@12085,@12339 12530:O2|1,@12531 12531:O3|2,@12532,0 12532:O1|@12533 12533:D3,44|8378040575088b4808833903740f89c1b8e89286b28b5d04909090ff138b4104c39090900000000028000000|@12537,3,@2255|17,0,@12534 12534:O4|103,@4956,@12536,@12535 12535:O5|@12337,1283,0,1283,0 12536:S18|4e6f74206120676c6f62616c2076616c7565 12537:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7256616c7565283129 12538:O2|@12540,0 12539:S6|747970656f66 12540:O4|@4596,69,@12541,0 12541:O7|@12539,2,@12543,@12542,@5229,0,0 12542:O3|2,@12085,@6207 12543:O2|1,@12544 12544:O3|2,@12545,0 12545:O1|@12546 12546:D3,12|8b400cc30000000008000000|@12547,1,@2256| 12547:S26|5354525543545f56414c5328292e76616c547970654f66283129 12548:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2257|1,0,@12350 12549:O2|@12551,@12550 12550:O2|@12552,0 12551:S10|53747275637475726573 12552:O4|@4611,69,@12553,0 12553:O4|@12551,@5500,@12554,@5229 12554:O6|@12556,I48,0,@5229,@12555,0 12555:O1|@12618 12556:O4|1,@4707,@4708,@4706 12557:O1|@12558 12558:D3,28|3b650c7303ff5524bb15000000e98ed6f3ff90900000000018000000|@5217,2097151,@2258|9,0,10 14,1,@5214 12559:O2|@12326,@12606 12560:O2|@6343,@12561 12561:O2|@12562,0 12562:O4|@4596,69,@12563,0 12563:O7|@6343,2,@12565,@12564,@5229,0,0 12564:O3|2,@12579,@5509 12565:O2|1,@12566 12566:O3|2,@12567,0 12567:O1|@12568 12568:D3,40|3b650c7303ff55248b48088b1424890c248b58048b0889c852e91e00000090900000000024000000|@12578,2097151,@2264|26,1,@12569 12569:D3,924|3b650c7303ff5524f644240401756f8b4c24048b55008d52f43b55087303ff5520895500c742fc02000000c702989986b28b318972048062ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c707109a86b28977048067ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008979048911eb05b9889a86b2f6c301740783fb017f10eb06f643ff107408b868977ab2c204008b500cf6c20175328b32833e01751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc9bf01000000f7c70100000075688b17833a0175618b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c70601000000f7c6010000007412ff7008ff30b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008932eb05ba010000008b75008d76f43b75087303ff5520897500c746fc020000008b38897e04c70607000000f7c601000000740d8b7808b8ecd57ab28b5d04ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc05000000897e1089560cc7460801000000c7460401000000c70601000000f7c601000000740f8b5008b8ecd57ab28b5d049090ff138b55008d52c43b55087303ff5520895500c742fc02000000c74204e8e17ab289328d720cc746fc02000000895604c7069c9a7ab28d560cc742fc02000000897204c70250287bb28d720cc746fc05000000895610c7460c01000000c7460801000000c7460401000000c70601000000f7c601000000740d8b5008b8ecd57ab28b5d04ff13f6c301740583eb027105ff5538ebf68b5008817a0448c052087435f6420401752b89f78b72045257bf48c0520889c8b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740c89c1eb175256eb13525689c86a03506a0189d090e87649f4ffeb358b45008d40f43b45087303ff5520894500c740fc020000008b5204895004c70007000000a801740d89c1b8ecd57ab28b5d0490ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70018e27ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c204000000000098030000|@12577,2097151,@2263|45,0,@12570 84,0,@12571 127,0,@12572 150,0,@5578 216,0,0 267,0,0 285,0,@6321 324,0,0 333,0,0 368,0,3 384,0,@6321 420,0,0 445,0,0 452,0,0 458,0,0 474,0,@6321 512,0,@6360 533,0,@5592 552,0,@6506 572,0,0 579,0,0 586,0,0 592,0,0 608,0,@6321 638,0,I48 658,0,I48 665,0,4 710,1,@6365 748,0,3 759,0,@6321 796,0,0 819,0,@6364 872,0,0 879,0,0 886,0,0 892,0,0 903,0,@6321 12570:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2259|49,0,0 85,0,0 12571:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2260|49,0,0 85,0,0 12572:O2|@12574,@12573 12573:O1|@12576 12574:O1|@12575 12575:D3,16|b801000000c39090000000000c000000|@6352,1,@2261|1,0,0 12576:D3,16|b801000000c39090000000000c000000|@6352,1,@2262|1,0,0 12577:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283329 12578:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283129 12579:O3|3,@12580,@12016 12580:O2|@12581,@12018 12581:O2|49,@12147 12582:O2|@6312,@12583 12583:O2|@12584,0 12584:O4|@4596,69,@12585,0 12585:O7|@6312,2,@12587,@12586,@5229,0,0 12586:O3|2,@12147,@6018 12587:O2|1,@12588 12588:O3|2,@12589,0 12589:O1|@12590 12590:D3,24|3b650c7303ff55248b400ce96438f4ff0000000014000000|@12591,31,@2265|12,1,@6320 12591:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72537472756374283129 12592:O2|@12316,@12593 12593:O2|@12594,0 12594:O4|@4596,69,@12595,0 12595:O7|@12316,2,@12597,@12596,@5229,0,0 12596:O3|2,@12147,@5306 12597:O2|1,@12598 12598:O3|2,@12599,0 12599:O1|@12600 12600:D3,12|8b00c3900000000008000000|@12601,1,@2266| 12601:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72537472756374283129 12602:O2|@12149,@12603 12603:O2|@12604,0 12604:O4|@4600,69,@12605,0 12605:O2|@12148,0 12606:O2|@12607,0 12607:O4|@4596,69,@12608,0 12608:O7|@12326,2,@12610,@12609,@5229,0,0 12609:O3|2,@12147,@12339 12610:O2|1,@12611 12611:O3|2,@12612,0 12612:O1|@12613 12613:D3,36|8b4804833903740db8349e86b28b5d04909090ff138b4104c39090900000000020000000|@12617,3,@2267|9,0,@12614 12614:O4|103,@4956,@12616,@12615 12615:O5|@12337,1341,0,1341,0 12616:S22|4e6f74206120676c6f62616c20737472756374757265 12617:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f72537472756374283129 12618:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2268|1,0,@12350 12619:O2|@12621,@12620 12620:O2|@12622,0 12621:S7|496e6669786573 12622:O4|@4611,69,@12623,0 12623:O4|@12621,@5500,@12624,@5229 12624:O6|@12626,I48,0,@5229,@12625,0 12625:O1|@12652 12626:O4|1,@4711,@4712,@4710 12627:O1|@12628 12628:D3,28|3b650c7303ff5524bb15000000e90accf3ff90900000000018000000|@5217,2097151,@2269|9,0,10 14,1,@5214 12629:O2|@12047,@12649 12630:O2|@6343,@12631 12631:O2|@12632,0 12632:O4|@4596,69,@12633,0 12633:O7|@6343,2,@12635,@12634,@5229,0,0 12634:O3|2,@12045,@5509 12635:O2|1,@12636 12636:O3|2,@12637,0 12637:O1|@12638 12638:D3,28|3b650c7303ff55248b58048b0889c8e9a8beffff0000000018000000|@11993,2097151,@2270|16,1,@11986 12639:O2|@12316,@12640 12640:O2|@12641,0 12641:O4|@4596,69,@12642,0 12642:O7|@12316,2,@12644,@12643,@5229,0,0 12643:O3|2,@12045,@5306 12644:O2|1,@12645 12645:O3|2,@12646,0 12646:O1|@12647 12647:D3,12|8b00c3900000000008000000|@12648,1,@2271| 12648:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72466978283129 12649:O2|@12650,0 12650:O4|@4600,69,@12651,0 12651:O2|@12046,0 12652:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2272|1,0,@12350 12653:O2|@12655,0 12654:S10|5369676e617475726573 12655:O4|@4611,69,@12656,0 12656:O4|@12654,@5500,@12657,@5229 12657:O6|@12659,I48,0,@5229,@12658,0 12658:O1|@12708 12659:O4|1,@4715,@4716,@4714 12660:O1|@12661 12661:D3,28|3b650c7303ff5524bb15000000e96ac9f3ff90900000000018000000|@5217,2097151,@2273|9,0,10 14,1,@5214 12662:O2|@12067,@12705 12663:O2|@6343,@12664 12664:O2|@12665,0 12665:O4|@4596,69,@12666,0 12666:O7|@6343,2,@12668,@12667,@5229,0,0 12667:O3|2,@12682,@5509 12668:O2|1,@12669 12669:O3|2,@12670,0 12670:O1|@12671 12671:D3,40|3b650c7303ff55248b48088b1424890c248b58048b0889c852e91e00000090900000000024000000|@12681,2097151,@2279|26,1,@12672 12672:D3,780|3b650c7303ff5524f644240401756f8b4c24048b55008d52f43b55087303ff5520895500c742fc02000000c7022ca686b28b318972048062ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c707a4a686b28977048067ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008979048911eb05b91ca786b2f6c301740783fb017f10eb06f643ff107408b868977ab2c204008b500cf6c20175328b32833e01751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc9bf01000000f7c70100000075648b17833a01755d8b75008d76f43b75087303ff5520897500c746fc020000008b7a04897e04c70601000000f7c601000000740e50ff7004b8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008932eb05ba010000008b75008d76f43b75087303ff5520897500c746fc020000008b7804897e04c70607000000f7c601000000740c89c7b8ecd57ab28b5d04ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c747040100000089378d770cc746fc05000000897e1089560cc7460801000000c7460401000000c70601000000f7c601000000740f89c2b8ecd57ab28b5d04909090ff138b55008d52c43b55087303ff5520895500c742fc02000000c742040c287bb289328d720cc746fc02000000895604c7069c9a7ab28d560cc742fc02000000897204c70230287bb28d720cc746fc05000000895610c7460c01000000c7460801000000c7460401000000c70601000000f7c601000000740d89c2b8ecd57ab28b5d0490ff1350566a03516a0190e8aa3cf4ff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70018e27ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c204000000000008030000|@12680,2097151,@2278|45,0,@12673 84,0,@12674 127,0,@12675 150,0,@5578 216,0,0 267,0,0 284,0,@6321 320,0,0 329,0,0 365,0,3 380,0,@6321 416,0,0 441,0,0 448,0,0 454,0,0 469,0,@6321 508,0,@6501 529,0,@5592 548,0,@6504 568,0,0 575,0,0 582,0,0 588,0,0 603,0,@6321 622,1,@6365 653,0,0 674,0,@6364 727,0,0 734,0,0 741,0,0 747,0,0 758,0,@6321 12673:D3,100|3b650c7303ff55248b52048b52389090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2274|49,0,0 85,0,0 12674:D3,100|3b650c7303ff55248b52048b52449090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@6352,1048575,@2275|49,0,0 85,0,0 12675:O2|@12677,@12676 12676:O1|@12679 12677:O1|@12678 12678:D3,16|b801000000c39090000000000c000000|@6352,1,@2276|1,0,0 12679:D3,16|b801000000c39090000000000c000000|@6352,1,@2277|1,0,0 12680:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283329 12681:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283129 12682:O3|3,@12683,@12016 12683:O2|@12684,@12018 12684:O2|49,@12065 12685:O2|@6312,@12686 12686:O2|@12687,0 12687:O4|@4596,69,@12688,0 12688:O7|@6312,2,@12690,@12689,@5229,0,0 12689:O3|2,@12065,@6018 12690:O2|1,@12691 12691:O3|2,@12692,0 12692:O1|@12693 12693:D3,24|3b650c7303ff55248b400ce9d82bf4ff0000000014000000|@12694,31,@2280|12,1,@6320 12694:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72536967283129 12695:O2|@12316,@12696 12696:O2|@12697,0 12697:O4|@4596,69,@12698,0 12698:O7|@12316,2,@12700,@12699,@5229,0,0 12699:O3|2,@12065,@5306 12700:O2|1,@12701 12701:O3|2,@12702,0 12702:O1|@12703 12703:D3,12|8b4004c30000000008000000|@12704,1,@2281| 12704:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72536967283129 12705:O2|@12706,0 12706:O4|@4600,69,@12707,0 12707:O2|@12066,0 12708:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2282|1,0,@12350 12709:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@2283|1,0,@12350 12710:O2|@12712,@12711 12711:O2|@12713,0 12712:S8|636f6d70696c6572 12713:O4|@4596,69,@12714,0 12714:O7|@12712,2,@12716,@12715,@5229,0,0 12715:O3|2,@17324,@17323 12716:O2|1,@12717 12717:O3|2,@12718,0 12718:O1|@12719 12719:D3,40|3b650c7303ff55248b48088b1424890c248b58048b0889c852e91e00000090900000000024000000|@17322,2097151,@4217|26,1,@12720 12720:D3,932|3b650c7303ff55245089d98b5c240889c8badcae86b2909090e8a60300008b4c2408f6c10175358b11813aece539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01756db97c787cb2f6c10175358b11813aece539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750e89c1b8287c7cb28b5d049090ff138b0b8139ece539b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0b8139ece539b2740d89c2b854eb7ab28b5d0490ff138b51088b742408f7c60100000075358b3e813f24e639b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc3b90100000083f9017507b9f0b486b2eb1a8b19813b24e639b2740d89c6b854eb7ab28b5d0490ff138b4b08515052ff7504bb42ad86b25389650483fa0174678b55008d52ec3b55087303ff5520895500c742fc04000000c7021cb586b28942048b4424148942088b44241c89420c8062ffbfff7504bbf6ac86b25389650489d0909090ff1548be520883c40459894d04eb3f9090908b650483c4045b895d0483381b7410eb05e91800000089c189c88b5d04ff138b48088b59048b01e8d24c0a00eb0eff74241c8b5c241890e82608000083c40459894d0483c410c204009090908b650483c4045b895d04833803751850b8ecfd90b28b54240c90ff12b818fe90b28b5d0490ff1381384ce239b2756850bbc4097ab28b480889c890e89261f3ff89c3b870fe90b2e8065ef3ffbb94fe90b29090e8fa5df3ff50bb1500000090e8ee5df3ff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801741489c1b8ecd57ab28b5d04eb05e94300000090ff138b542410909090ff128b45008d40ec3b45087303ff5520894500c740fc04000000c7400cb4fe90b259894808c7400470137ab2c700cf0000008b5d049090ff138b400489c3b8ccfe90b29090e8625df3ffbbe0fe90b29090e8565df3ff50bb1500000090e84a5df3ff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff138b54240c909090ff128b45008d40ec3b45087303ff5520894500c740fc04000000c7400c0cff90b259894808c7400470137ab2c700cf0000008b5d049090ff1390909000000000a0030000|@17321,2097151,@4216|18,0,@12721 26,1,@12722 43,0,@4674 93,0,0 103,0,@7313 116,0,@4674 166,0,0 178,0,@7368 193,0,@4674 202,0,@6377 230,0,@4674 239,0,@6377 268,0,@4681 318,0,0 328,0,@12731 338,0,@4681 347,0,@6377 367,0,$12720+542 406,0,@12733 435,0,$12720+466 450,0,I32 506,1,@17303 522,1,@12734 559,0,@17310 571,0,@17312 583,0,@4608 591,0,@4925 602,1,@4948 609,0,@17315 614,1,@4940 619,0,@17316 626,1,@4940 632,0,10 638,1,@4940 673,0,3 684,0,@6321 737,0,@17317 748,0,@4956 754,0,103 771,0,@17318 778,1,@4940 783,0,@17319 790,1,@4940 796,0,10 802,1,@4940 837,0,3 848,0,@6321 893,0,@17320 904,0,@4956 910,0,103 12721:O2|@12722,@4718 12722:D3,1288|3b650c7303ff552489d9f6c10175358b318b3e3b7a04751e8b75008d76f83b75087303ff5520897500c746fc010000008b09890eeb13ff7104593b650c7303ff5524ebc6be0100000083fe017507b904b486b2eb1d8b0e8b393b7a04740f89c2b854eb7ab28b5d04909090ff138b510889d189daf6c20175358b32813e74e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff017507baa8787cb2eb1b8b17813a74e539b2740c89c6b854eb7ab28b5d04ff138b720889f289def7c60100000075378b3e813f7ce539b2751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b368937eb148b7e0489fe3b650c7303ff5524ebc1bf0100000083ff01756ebe7c787cb2f7c60100000075378b3e813f7ce539b2751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b368937eb148b7e0489fe3b650c7303ff5524ebc1bf0100000083ff01750e89c6b8287c7cb28b5d049090ff138b37813e7ce539b2741250b854eb7ab2eb05e90a0000008b5d04ff138b7e08eb1a8b37813e7ce539b2740d50b854eb7ab28b5d049090ff138b7e0889de5053f7c60100000075358b1e813b84e539b2751c8b45008d40f83b45087303ff5520894500c740fc010000008918eb148b5e0489de3b650c7303ff5524ebc3b80100000083f8017568b87c787cb2a80175358b18813b84e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b580489d83b650c7303ff5524ebc7be0100000083fe01750ab8287c7cb28b5d04ff138b069090813884e539b27414b854eb7ab28b5d04eb05e90a000000909090ff138b5808eb1c8b18813b84e539b2740db854eb7ab28b5d04909090ff138b430889c351575253b80100000090ff1250b8010000008b54240cff128b4c2414f6c10175358b11813a8ce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01756db97c787cb2f6c10175358b11813a8ce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750e89c1b8287c7cb28b5d049090ff138b0b81398ce539b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0b81398ce539b2740d89c2b854eb7ab28b5d0490ff138b51088b75008d76e03b75087303ff5520897500c746fc01000040c706410000008d7e08c747fc01000040c707610000008d4f08c741fc01000040c70148c052088d5908c743fc01000040c70301000000528b55008d52f83b55087303ff5520895500c742fc01000040c70253000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000528b55008d52f83b55087303ff5520895500c742fc01000040538b5c2410891a8b5d008d5bf83b5d087303ff5520895d00c743fc01000040528b54241489138b55008d52f83b55087303ff5520895500c742fc010000408902528b55008d52b03b55087303ff5520895500c742fc0100004089028d4208c740fc11000000528b5424188950408b54240489503c5a83c4048950388b5424288950348b5424248950308b54240889502c5a8950288b5424088950248b54241c8950208b54241889501c8b5424148950188958148b5424288950105a83c42889500c8978088948048930c3900000000004050000|@12730,1048575,@2285|69,0,0 79,0,@12723 97,0,@6377 125,0,@4659 175,0,0 185,0,@7316 195,0,@4659 204,0,@6377 232,0,@4660 284,0,0 294,0,@7313 310,0,@4660 362,0,0 374,0,@7368 389,0,@4660 397,0,@6377 422,0,@4660 430,0,@6377 460,0,@4661 510,0,0 520,0,@7313 532,0,@4661 582,0,0 592,0,@7368 607,0,@4661 614,0,@6377 642,0,@4661 649,0,@6377 671,0,0 680,0,0 703,0,@4662 753,0,0 763,0,@7313 776,0,@4662 826,0,0 838,0,@7368 853,0,@4662 862,0,@6377 890,0,@4662 899,0,@6377 938,0,32 954,0,48 970,0,I48 986,0,0 1017,0,41 1048,0,0 12723:O1|@12724 12724:D3,24|b838b486b28b5d04909090ff139090900000000014000000|@12729,1,@2284|1,0,@12725 12725:O4|103,@4956,@12727,@12726 12726:O5|@12728,99,0,99,0 12727:S20|4572726f7220696e20736f7572636520636f6465 12728:S27|6d6c736f757263652f4d4c436f6d70696c65722f4c45585f2e4d4c 12729:S37|4c45585f28292e696e697469616c2832296572726f724d65737361676550726f632d283129 12730:S17|4c45585f28292e696e697469616c283229 12731:O1|@12732 12732:D3,16|b801000000c39090000000000c000000|@7374,1,@2286|1,0,0 12733:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b420451e91f0000009090900000000024000000|@17302,2097151,@4214|25,1,@12734 12734:D3,1472|3b650c7303ff55248b4c2404f6c10175358b11813a24e639b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe017507b92cbb86b2eb1b8b0e813924e639b2740c89c2b854eb7ab28b5d04ff138b510889d18b542404f6c20175358b32813eace539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756dba7c787cb2f6c20175358b32813eace539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750e89c2b8287c7cb28b5d049090ff138b17813aace539b2741689c6b854eb7ab28b5d04eb05e90a000000909090ff138b7208eb1a8b17813aace539b2740d89c6b854eb7ab28b5d0490ff138b72088b55008d52f43b55087303ff5520895500c742fc02000000c70258bb86b2895a048062ffbf8b7d008d7fc83b7d087303ff5520897d00c747fc0d000000508b43448947308b434089472c8b433c8947288957248b53388957208b533489571c8b43308947188b432c8947148b43288947108b432489470c8b431c8947088b43188947048b431489078b04248b50288b12528b503c8b12528b542408ff70188b42088b008b52248b1283fa53750289c283fa617518575156ff73288b44241cba24bc86b29090e8be040000eb0bb801000000575156ff73288b442424a80175358b0881394ce839b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa017507b8107a7db2eb1d8b02909081384ce839b2740cb854eb7ab28b5d049090ff138b480889c88b4c241c8b51088b128b59248b1b83fb53750289d383fb61740583fb0175728b410c8b0083f801740bb8d8707ab283c420c204008b41148b008b49388b098b55008d52e83b55087303ff5520895500c742fc050000008b5c2414895a10894a0c8b4c2418894a088942048b44241089028b45008d40e03b45087303ff5520894500c740fc02000000c7400401000000eb05e92700000089108d480cc741fc0100000089018d4108c740fc02000000c7400484eb86b2890883c420c204006a016a016a0189c789e3b801000000909090e8423300008b45008d40f03b45087303ff5520894500c740fc03000000c7004cef86b28b4c240c83c4048948048b4c24048948088060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c404890157518b5c2424b8b4ef86b2e8ea360000837c240801746f506848c0520868214e00008b18b8a4a188b29090e8c653020089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b542410909090ff12eb0889c1b801000000518b4424248b480c8b0983f901740bb8d8707ab283c428c20400ff74241489c38b442404ba881a89b290e8c66002008b4424248b480c8b0983f90174458b1c248b442404ba28ac8cb290e85af205008b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc02000000c7400401000000890883c428c2040089c38b0424909090e8eeb606008b4c24248b490c8b0983f90174458b1c248b442404ba28ac8cb290e8faf105008b4d008d49ec3b4d087303ff5520894d00c741fc0100000089018d4108c740fc02000000c7400401000000890883c428c20400ff70048b5c24308b00ba7c727cb29090e8f6b7f5ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701d8d390b28b14248951048941088061ffbf5189d38b442408ba28ac8cb2e876f105008b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc010000005a891089c28d4008c740fc02000000895004890883c428c2040000000000bc050000|@17301,2097151,@4213|21,0,@4681 71,0,0 81,0,@12735 91,0,@4681 100,0,@6377 127,0,@4666 177,0,0 187,0,@7313 200,0,@4666 250,0,0 262,0,@7368 277,0,@4666 286,0,@6377 314,0,@4666 323,0,@6377 362,0,@12737 527,0,@12740 534,1,@12741 541,0,0 563,0,@4720 613,0,0 623,0,@8006 635,0,@4720 642,0,@6377 700,0,@5279 797,0,0 835,0,@12891 858,0,0 866,1,@12896 896,0,@12906 961,0,@12908 966,1,@12911 979,0,I48 984,0,10000 991,0,@13409 998,1,@13557 1034,0,0 1041,0,1 1048,0,0 1054,0,0 1065,0,@6321 1091,0,0 1111,0,@5279 1132,0,@13587 1138,1,@13588 1164,0,@15312 1170,1,@15314 1213,0,0 1234,1,@15720 1260,0,@15312 1266,1,@15314 1309,0,0 1331,0,@7311 1338,1,@7312 1368,0,@17247 1393,0,@15312 1398,1,@15314 12735:O1|@12736 12736:D3,16|b801000000c39090000000000c000000|@7374,1,@2287|1,0,0 12737:D3,36|3b650c7303ff55248b5204b8010000008b520890ff12e91d000000900000000020000000|@12739,1048575,@2289|12,0,0 23,1,@12738 12738:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2288|60,0,0 12739:S42|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329676c6f62616c732d283129 12740:O2|@12741,@4719 12741:D3,176|3b650c7303ff55248b48248b0983f953740f8b4024c70053000000b801000000c38b48088b0983f901756a5250ff7008ff7038ff703cff7014ff7028ff70208b481cb80100000089ca909090ff1250b8010000008b542404ff128b4c240c8b098b542408890a8b4c240c5a83c40c89118b4c24048b095a890a598901bbf4bc86b28b442404e866000000b8c4c286b28b5d0490ff138b4808c701530000008b5a04e92e060000909000000000ac000000|@12890,2097151,@2312|23,0,41 28,0,0 67,0,0 80,0,0 125,0,@12742 134,1,@12743 139,0,@12755 154,0,41 162,1,@12758 12742:S34|756e657870656374656420656e64206f662066696c6520656e636f756e7465726564 12743:D3,296|3b650c7303ff55245053ff7038ff7014ff70208b481cb80100000089ca909090ff1250b8010000008b542404ff128b4c24085a83c40889115989018b4424048b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f57bb5cbe86b28b442404909090e80e010000909090e8ba0300008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c894808c7400401000000c700030000008b0c248b510c83c404c702030000008b5130ff220000000024010000|@12754,1048575,@2294|23,0,0 36,0,0 126,0,@12744 138,1,@12747 146,1,@12751 180,0,0 187,0,0 194,0,3 200,0,0 210,0,@6321 258,0,0 264,0,1 279,0,1 12744:O1|@12745 12745:D3,44|83f813720b83f81b7706b803000000c383f8417406b801000000c3b803000000c39090900000000028000000|@12746,1,@2290|11,0,1 22,0,0 28,0,1 12746:S15|436861722e69735370616365283129 12747:D3,60|3b650c7303ff5524a8017407b903000000eb068b088d4c09018b1424890c245053bb01000000b80100000052e91f0000009090900000000038000000|@12750,1048575,@2292|13,0,1 34,0,0 39,0,0 45,1,@12748 12748:D3,536|3b650c7303ff5524f6c301750af644240c017503ff55383b5c240c755fa8017508f6c3017503ff55383bc37508b801000000c20c00f6c3017408a80174042bd87105ff5538ebf783c3015389c38b44240ce8ee0cf9ff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c20c00f6c301740783fb017d08eb31f643ff10752b8b542408f6c2017407b903000000eb068b0a8d4c0901f6c3017409f6c10174043bd9eb05ff5538ebf77c0c89c1b8a8f179b28b5d04ff13f6c201751589d983c108d1e90fb60c0a8d4c090189c689c8eb0689c189d089ce56538b54240c90ff1283f801745d8b442404a8017509f60424017503ff55383b0424754c8b0424a801740583c0027105ff5538ebf68b0c24f6c101740583c1027105ff5538ebf68b5424148b5c24108b74240c89542414895c24108974240c89c389c883c408e9b0feffffe9870000008b0c24f6c1017408a80174042bc87105ff5538ebf783c1015189c38b44241490e8ca0bf9ff8b0c24f6c101740583c1027105ff5538ebf68b1424f6c201740583c2027105ff5538ebf650ff742418ff742418ff74241889cb89d09090e84afeffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c20c008b0424a801740583c0027105ff5538ebf68b4c24148b5424108b5c240c894c241489542410895c240c89c383c40458e9f0fdffff0000000014020000|@12749,1048575,@2291|46,0,0 82,1,@8870 115,0,0 152,0,1 188,0,@4898 374,1,@8870 12749:S23|537472696e672e746f6b656e73283229746f6b27283229 12750:S16|537472696e672e746f6b656e73283229 12751:D3,240|3b650c7303ff5524a801755b83780401755a8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3e9740000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000f6c101740d8b5004b8ecd57ab28b5d04ff13518b500489d09090e852ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804598908c3b874c286b2c3909000000000ec000000|@12753,7,@2293|49,0,3 59,0,@6321 96,0,0 139,0,3 152,0,@6321 203,0,@5592 225,0,@12752 12752:O2|@6594,0 12753:S32|4c45585f28292e627265616b576f726473283129616464427265616b73283129 12754:S18|4c45585f28292e6c65784572726f72283229 12755:O4|@4608,@5398,@12757,@12756 12756:O5|@12728,600,0,600,0 12757:S11|656e64206f662066696c65 12758:D3,2056|3b650c7303ff55245350ff7008ff30ff7004909090e8020800008b4c240c50ff7138ff713cff7114ff7128ff7120b8010000008b511c9090ff1250b8010000008b542404ff128b4c240c8b098b542408890a8b4c240c5a83c40c89118b4c24048b095a890a598901833c245d756a8b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb1fff308b4810b80100000089caff1283f8017507b809000000eb028b005989018b4424088b0083f85d74278b4424088b0089c3b8f4cb86b29090e8c647f3ff89c38b44241090e846f9ffffeb6be9280100008b442410ff7038ff7014ff70208b481cb80100000089caff1250b8010000008b542404ff128b4c24085a83c40889115989018b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb29ff308b4810b80100000089ca909090ff1283f801eb05e9940600007507b809000000eb028b005989018b4424088b0083f85d74238b4424088b0089c3b80ccc86b2909090e81a47f3ff89c38b44241090e89af8ffffeb598b44240cc700730000008b4c2410ff7138ff7114ff7120b8010000008b511c90ff1250b8010000008b542404ff128b4c24085a83c40889115989018b4424108b482c8b09f6c10175158b502c8b5904891a8b308b39893eeb59e9fa050000ff308b4810b80100000089ca9090ff1283f8017507b809000000eb028b00598901eb58813c24fb00000075548b44240cc7005d0000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb5de9a1050000ff31b8010000008b5110909090ff1283f8017507b809000000eb028b00598901eb5ce97a050000813c24f700000075538b44240cc700410000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb5ce944050000ff31b8010000008b51109090ff1283f8017507b809000000eb028b00598901eb5ce91e050000813c24bf00000075538b44240cc700790000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb5ce9e8040000ff31b8010000008b51109090ff1283f8017507b809000000eb028b00598901eb5ce9c2040000813c24bb00000075538b44240cc7005b0000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb5ce98c040000ff31b8010000008b51109090ff1283f8017507b809000000eb028b00598901eb5ce966040000813c24b700000075538b44240cc7003f0000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb59e930040000ff31b8010000008b51109090ff1283f8017507b809000000eb028b00598901eb58e90a040000833c245375528b44240cc7005f0000008b4c24108b512c8b12f6c20175158b592c8b720489338b398b028907eb63e9d7030000ff31b8010000008b511090ff1283f8017507b809000000eb028b00598901eb68e9b2030000833c245175628b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb28ff308b4810b80100000089ca9090ff1283f801eb05e9740300007507b809000000eb028b005989018b4424088b0083f85574168b44240cc70043000000eb5de94a030000e90d0000008b4424109090e882040000eb64833c2459754c8b44240cc700170000008b4c24108b512c8b12f6c20175108b592c8b720489338b398b028907eb62ff31b8010000008b5110ff1283f801750cb809000000eb07e9ed0200008b00598901eb61833c2477751d8b44240cc70061000000eb05e9cf0200008b4c2408c70141000000eb61833c244575228b5c24148b4424109090e8560600008b44240ceb05e9a3020000c70069000000eb67833c244775668b4424108b482c8b09f6c1017517eb05e9800200008b502c8b5904891a8b308b39893eeb27ff308b4810b80100000089caeb05e95d02000090ff1283f8017507b809000000eb028b005989018b4424088b0083f84575288b5c24148b442410eb0ae92f020000e92a000000909090e8ca0500008b44240cc70011000000eb58ff742410bba8d786b2b84700000090e86e0f0000eb62813c24fd000000755e8b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb25ff308b4810b80100000089ca90ff1283f801750cb809000000eb07e9b90100008b005989018b4424088b0083f861723b83f87377368b5c2410eb0ae999010000e93c000000b803000000e86e1a00008b4424048b0089c3b8fd0000009090e82a42f3ff8b4c24048901eb61ff742410bba8d786b2b8fd00000090e8c60e0000eb5d833c2409750c8b44240cc70001000000eb66833c24617218833c247377128b5c2410b8010000009090e80e1a0000eb65813c24830000007209813c24b50000007626813c24c3000000eb05e9080100007209813c24f5000000760deb05e9f6000000833c244f751cff742410bb08dc86b2b848c05208eb05e9db000000e8420e0000eb60b82900000083f801750cb801000000eb32e9be00000089c183c106ba0cd886b2d1e90fb60c0a8d4c09013b0c247507b803000000eb0d83e8023b650c7303ff5524ebc283f801741dff742410bba8d786b2b848c05208909090e8e20d0000eb6ae96f0000008b042490e8523ff3ff89c3b830eb86b2e80e41f3ffbb450000009090e80241f3ff89c38b44241090e882f2ffff8b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb24ff308b4810b80100000089caff1283f801750cb809000000eb07e9050000008b005989018b44240c8b0083f85375108b5c241483c4105883c404e909f8ffffb80100000083c418c30000000004080000|@12889,2097151,@2311|22,1,@12759 47,0,0 60,0,0 146,0,0 160,0,4 191,0,@12761 198,1,@4940 210,1,@12743 238,0,0 248,0,0 307,0,0 331,0,4 362,0,@12762 370,1,@4940 382,1,@12743 394,0,57 412,0,0 424,0,0 488,0,0 504,0,4 520,0,125 532,0,46 574,0,0 592,0,4 613,0,123 625,0,32 667,0,0 684,0,4 705,0,95 717,0,60 759,0,0 776,0,4 797,0,93 809,0,45 851,0,0 868,0,4 889,0,91 901,0,31 943,0,0 960,0,4 990,0,47 1032,0,0 1048,0,4 1108,0,0 1131,0,4 1159,0,33 1182,1,@12763 1200,0,11 1237,0,0 1252,0,4 1282,0,48 1299,0,32 1322,1,@12771 1339,0,52 1394,0,0 1416,0,4 1462,1,@12771 1472,0,8 1483,0,@12786 1488,0,35 1494,1,@12790 1503,0,126 1545,0,0 1560,0,4 1609,0,1 1614,1,@12875 1627,0,126 1634,1,@4940 1651,0,@12786 1656,0,126 1662,1,@12790 1680,0,0 1703,0,0 1710,1,@12875 1719,0,65 1728,0,90 1737,0,97 1753,0,122 1777,0,@12795 1782,0,I48 1794,1,@12790 1801,0,20 1811,0,0 1828,0,@12788 1848,0,1 1877,0,@12786 1882,0,I48 1890,1,@12790 1906,1,@4926 1913,0,@12888 1918,1,@4940 1923,0,34 1930,1,@4940 1942,1,@12743 1982,0,0 1996,0,4 2040,0,0 12759:D3,160|3b650c7303ff55248b088b0983f913720583f91b760583f941756750ff7038ff7014ff70208b481cb80100000089ca90ff1250b8010000008b542404ff128b4c24085a83c40889115989018b04248b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb24ff308b4810b80100000089caff1283f801750cb809000000eb07e90b0000008b0059890158e96effffff89c8c3909090000000009c000000|@12760,1048575,@2295|41,0,0 52,0,0 110,0,0 124,0,4 12760:S24|4c45585f28292e736b697057686974655370616365283129 12761:S16|756e6b6e6f776e2073796d626f6c202e 12762:S17|756e6b6e6f776e2073796d626f6c202e2e 12763:D3,44|3b650c7303ff5524ff30ff701089c3b80100000090e826000000598901b801000000c3900000000028000000|@12770,1048575,@2298|16,0,0 22,1,@12764 30,0,0 12764:D3,76|3b650c7303ff552453b8010000008b5424089090ff1283f8017507b809000000eb028b008b4c2408894c2408bac8cc86b28b5c24048954240489da5b52e92600000090900000000048000000|@12769,1048575,@2297|10,0,0 28,0,4 45,0,@12765 62,1,@12766 12765:O1|@12764 12766:D3,244|3b650c7303ff552483f809753d5053ff7338ff7314ff7320b8010000008b531cff1250b8010000008b542404ff128b4c24085a83c4088911598901bbd8cd86b258e80af0ffff58c208005053b8010000008b542410909090ff1283f8017507b809000000eb028b00837c240455752b83f8537526b8010000008b542410909090ff1283f801750bb80900000083c408c208008b0083c408c20800837c240451753283f855752dff7424108b5c2404b8010000008b54241090ff128b4c24108b54240c894c24108954240c5b83c404e92dffffff8b4c24108b54240c894c24108954240c5b83c404e914ffffff00000000f0000000|@12768,1048575,@2296|25,0,0 36,0,0 60,0,@12767 66,1,@12743 77,0,0 96,0,4 117,0,0 136,0,4 175,0,0 12767:S28|656e64206f662066696c6520666f756e6420696e20636f6d6d656e74 12768:S54|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129736b6970436f6d6d656e74426f6479283129 12769:S36|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129 12770:S22|4c45585f28292e7061727365436f6d6d656e74283129 12771:D3,256|3b650c7303ff55248b482c8b09f6c10175108b502c8b710489328b388b118917eb295053ff7004ff308b4810b80100000089ca90ff1283f8017507b809000000eb028b008b0c248901eb075053ff7004ff30ff7504b85acf86b250896504ff742414ff7424148b5c2410b8010000009090e89e000000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8ba10d686b290e8da0600008b4c240c8901b80100000083c40459894d0483c410c390908b650483c4045b895d048b083b4c240874058b5d04ff13bb5cd786b283c40c58e9a1edffff9000000000fc000000|@12785,2097151,@2301|45,0,0 60,0,4 86,0,$12771+210 107,0,0 114,1,@12772 119,0,0 176,0,@12781 182,1,@12782 193,0,0 234,0,@12784 243,1,@12743 12772:D3,1412|3b650c7303ff55248b0b81f9b9000000756c8b4c24088b512c8b12f6c20175158b712c8b7a04893e8b318b0a890ebe01000000eb295350ff31b8010000008b5110909090ff1283f8017507b809000000eb028b00598901be01000000eb0253508b4424048b008b4c24108b512c8b12f6c201751c8b592c8b72048933eb05e9890200008b398b0a890fbb01000000eb2650ff31b8010000008b511090ff1283f8017507b809000000eb028b00598901bb01000000eb0150833c24137206833c241b7606833c244175648b442414e8b2faffff81f8b900000074588b4424088b00bbc4097ab2e88e3ef3ff89c3b834d586b2e8023bf3ffbb54d586b29090e8f63af3ff89c38b44241490e876ecffff8b4424088b0081f8b9000000745a8b4424088b0083f84574638b442408eb0ae9b5000000e9530000008b0083f809744c8b4424148b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb24ff308b4810b80100000089caff1283f801750cb809000000eb07e90f0000008b005989013b650c7303ff5524eb848b4424148b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb1fff308b4810b80100000089caff1283f8017507b809000000eb028b005989018b4424148b4c241089442414894c24108b5c240883c4045883c404e919feffff813c24bd00000075708b4424088b008b4c24148b512c8b12f6c20175158b592c8b720489338b398b0a890fbb01000000eb2550ff31b8010000008b5110ff1283f8017507b809000000eb028b00598901bb01000000eb01508b45008d40f43b45087303ff5520894500c740fc020000008b4c2408894804eb05e955000000c700b90000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701bd0000008d410cc740fc020000008948048b0c2489088b4c241883c4048b542410894c24148954241083c4085be946fdffff8b45008d40e83b45087303ff5520894500c740fc020000008b4c2404894804c700b900000089c18d400cc740fc020000008948048b0c2489088b4c24148b542410894c24148954241083c4085be9f4fcffff83f915756c8b542408535051ff7238ff7214ff7220b8010000008b721c89f290ff1250b8010000008b542404ff128b4c24085a83c40889115989018b4424148b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb29ff308b4810b80100000089ca909090ff1283f801750eeb05e947000000b809000000eb028b005989018b45008d40ec3b45087303ff5520894500c740fc04000000c7400c68d586b2c7400801000000c7400480d586b28b4c241089088b5d04909090ff1383f945756b8b4c24086a0150ff7138ff7114ff7120b8010000008b511c9090ff1250b8010000008b542404ff128b4c24085a83c40889115989018b4424108b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb29ff308b4810b80100000089ca909090ff1283f801750eeb05e913000000b809000000eb028b005989015883c404c208008b5424088b722c8b36f7c60100000075118b7a2c538b5e04891f8b128b3e893aeb26535051ff32b8010000008b721089f29090ff1283f8017507b809000000eb028b00598901eb025051833c240975388b45008d40ec3b45087303ff5520894500c740fc04000000c7400c94d586b2c7400801000000c7400480d586b28b4c241089088b5d04ff13833c24437209813c24fd0000007606833c2441753d8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b0c2489088b4c24148b542410894c24148954241083c4085be9d5faffff8b0424909090e8fa34f3ff89c3b8acd586b2e8b636f3ffbbccd586b29090e8aa36f3ff89c38b44241490e82ae8ffff8b4424148b4c241089442414894c24108b5c240883c4045883c404e986faffff90900000000080050000|@12780,2097151,@2299|12,0,92 47,0,0 58,0,0 76,0,4 88,0,0 138,0,0 148,0,0 164,0,4 176,0,0 206,1,@12759 212,0,92 225,0,@4925 230,1,@4948 237,0,@12773 242,1,@4940 247,0,@12774 254,1,@4940 266,1,@12743 278,0,92 354,0,0 368,0,4 430,0,0 444,0,4 490,0,94 531,0,0 541,0,0 556,0,4 568,0,0 615,0,92 648,0,94 731,0,92 802,0,0 816,0,0 875,0,0 899,0,4 937,0,@12775 944,0,0 951,0,@12776 991,0,0 1004,0,0 1063,0,0 1087,0,4 1145,0,0 1164,0,4 1212,0,@12777 1219,0,0 1226,0,@12776 1250,0,126 1330,1,@4926 1337,0,@12778 1342,1,@4940 1347,0,@12779 1354,1,@4940 1366,1,@12743 12773:S21|756e65787065637465642063686172616374657220 12774:S11|20696e205c202e2e2e205c 12775:O5|@12728,350,0,350,0 12776:S9|456e644f664c696e65 12777:O5|@12728,389,0,389,0 12778:S22|756e7072696e7461626c652063686172616374657220 12779:S16|20666f756e6420696e20737472696e67 12780:S33|4c45585f28292e7061727365537472696e67283129676574537472696e67283129 12781:O2|@12782,16777215 12782:D3,260|a801756eb90100000089c3f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdff6c1017412f6c101740783f9017d16eb06f641ff10740e8b1889c6b80c117ab28b5d04ff1383f90375038b00c389cb83c30ec1eb0283cb013b5a04721489c2b8e00c7ab2eb05e97c0000008b5d0490ff1389ca89d989c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1ea89178d541201b809000000f6c30175238b0bd1e8d1e9880c078d4c09018d44000183c0028b4b0489cb3b650c7303ff5524ebd88067ffbf89f8c3b848c05208c39090900000000000010000|@12783,63,@2300|5,0,0 72,0,@4949 108,0,@4941 132,0,0 192,0,4 244,0,I48 12783:S31|4c696272617279537570706f72742e737472696e67496d706c6f6465283129 12784:S36|6e6f206d61746368696e672071756f746520666f756e64206f6e2074686973206c696e65 12785:S21|4c45585f28292e7061727365537472696e67283129 12786:O1|@12787 12787:D3,72|b92900000083f901750889c1b801000000c389ca83c206bb0cd886b2d1ea0fb614138d5412013bd0750889c1b803000000c383e9023b650c7303ff5524ebc6900000000044000000|@12789,15,@2302|1,0,20 13,0,0 24,0,@12788 45,0,1 12788:S20|3a3d3c3e2b2a215e2f7c26257e2d3f60405c2423 12789:S27|436861722e636f6e7461696e732831296d61746368283129283129 12790:D3,520|3b650c7303ff55248b4c2404ff31ff7108ff710451e8020200008b4c24088b0983f95d756a8b4c24108b512c8b12f6c20175158b592c8b720489338b398b0a890fbb01000000eb2650ff31b8010000008b511090ff1283f8017507b809000000eb028b00598901bb01000000eb01508b44240c8b0081f883000000720881f8b5000000761781f8c30000007232eb05e9c700000081f8f50000007723bb5d0000008b042490e89e32f3ff8b4c2414894c2414bb08dc86b283c410e941ffffffb92900000083f9017507b901000000eb2c89ca83c206bb0cd886b2d1ea0fb614138d5412013bd07507b903000000eb0d83e9023b650c7303ff5524ebc883f9017422bb5d0000008b0424e83a32f3ff8b4c2414894c2414bba8d786b283c410e9ddfeffff508b5c2404b89cdc86b2e81632f3ffbb5d0000009090e80a32f3ff5b9090e80232f3ff8b4c241489c389c883c4105a83c40452e979e3ffff8b0c248901a8017407b903000000eb068b088d4c0901f6c101740783f9017e56eb06f641ff10754ea8017407b903000000eb068b088d4c0901f6c101740783f9017e08eb15f641ff10740f89c1b8a8f179b28b5d04909090ff13a801750a0fb648048d4c0901eb0289c183f94f7507b875000000eb1b89c3b8b8dc86b290e8fe0df4ff83f8017507b831000000eb028b008b4c24048901b80100000083c40cc204009090900000000004020000|@12874,1048575,@2307|22,1,@12791 66,0,0 76,0,0 92,0,4 104,0,0 119,0,65 127,0,90 135,0,97 150,0,122 157,0,46 166,1,@4940 179,0,@12795 192,0,20 202,0,0 214,0,@12788 233,0,1 258,0,46 266,1,@4940 279,0,@12786 297,0,@12798 302,1,@4940 307,0,46 314,1,@4940 322,1,@4940 343,1,@12743 357,0,1 392,0,1 425,0,@4898 459,0,58 468,0,@12799 474,1,@6369 484,0,24 499,0,0 12791:D3,80|3b650c7303ff55248b4c24045053518b19b801000000909090e84600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045989085983c40451e9b036f3ff000000004c000000|@12794,1048575,@2304|18,0,0 26,1,@12792 68,1,@4953 12792:D3,232|3b650c7303ff55248b0350538b542410ff1283f801746a8b44240cff7038ff7014ff70208b481cb80100000089ca9090ff1250b8010000008b542404ff128b4c24085a83c40889115989018b44240c8b482c8b09f6c10175108b502c8b5904891a8b308b39893eeb29ff308b4810b80100000089ca909090ff1283f801750eeb05e94d000000b809000000eb028b00598901ff742410ff7424108b5c2408b8010000009090e856ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c408c20800b80100000083c408c20800909000000000e4000000|@12793,1048575,@2303|40,0,0 52,0,0 111,0,0 135,0,4 159,0,0 212,0,0 12793:S26|4c45585f28292e7265616443686172732833296c6f6f70283129 12794:S19|4c45585f28292e726561644368617273283329 12795:O1|@12796 12796:D3,88|81f883000000720881f8b5000000761a81f8c3000000720881f8f5000000760a83f861720b83f8737706b803000000c383f84f7506b803000000c381f8bf0000007406b801000000c3b803000000c3900000000054000000|@12797,1,@2305|2,0,65 10,0,90 18,0,97 26,0,122 43,0,1 54,0,1 61,0,95 68,0,0 74,0,1 12797:S24|4c45585f28292e6973416c7068614e756d65726963283129 12798:S20|696e76616c6964206964656e7469666572202d20 12799:O3|0,@12801,@12800 12800:O200|0,0,0,0,0,0,@12804,@12805,@12806,0,@12807,0,0,0,0,0,0,0,0,@12808,@12809,0,0,0,0,@12811,0,0,@12812,0,0,0,0,0,0,@12813,0,0,0,0,0,0,@12814,0,0,0,0,0,0,0,0,0,0,0,0,0,@12815,0,@12817,0,@12818,@12820,0,0,0,0,0,0,0,0,@12821,@12822,@12824,0,0,@12825,0,@12826,0,@12828,0,0,0,0,@12829,0,0,@12831,@12832,@12834,@12835,@12836,@12837,@12839,@12841,@12842,0,@12844,@12845,@12846,0,0,@12847,0,@12849,0,0,0,0,0,0,@12851,0,0,0,@12853,0,0,0,0,0,0,@12855,@12856,@12857,0,0,0,0,0,0,0,0,0,0,@12859,@12860,@12862,0,0,0,0,0,0,0,0,0,@12864,0,0,0,0,0,0,0,@12865,0,0,0,0,0,0,0,0,0,0,0,@12867,0,0,0,@12868,0,0,@12869,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,@12871,0,0,0,0,0,0,0,0,@12803 12801:O2|@12802,200 12802:D3,24|3b650c7303ff55248b5a04e9888bf3ff0000000014000000|@5217,2097151,@2306|12,1,@5214 12803:O2|@12873,63 12804:O2|@11988,29 12805:O2|@11992,36 12806:O2|@11990,28 12807:O2|@7768,65 12808:O2|@7417,25 12809:O2|@12810,49 12810:S7|73686172696e67 12811:O2|@6588,37 12812:O2|@6559,12 12813:O2|35,23 12814:O2|42,6 12815:O2|@12816,7 12816:S4|63617365 12817:O2|58,9 12818:O2|@12819,1 12819:S7|61627374797065 12820:O2|61,17 12821:O2|@6505,51 12822:O2|@12823,44 12823:S3|726563 12824:O2|@7006,19 12825:O2|@7748,26 12826:O2|@12827,13 12827:S2|646f 12828:O2|@6604,4 12829:O2|@12830,42 12830:S5|7261697365 12831:O2|@6811,18 12832:O2|@12833,22 12833:S6|68616e646c65 12834:O2|@6806,61 12835:O2|95,60 12836:O2|@6507,54 12837:O2|@12838,10 12838:S2|3a3e 12839:O2|@12840,56 12840:S2|3d3e 12841:O2|@6538,59 12842:O2|@12843,38 12843:S2|6f70 12844:O2|@11998,50 12845:O2|@6543,16 12846:O2|@7750,34 12847:O2|@12848,5 12848:S2|6173 12849:O2|@12850,66 12850:S8|7769746874797065 12851:O2|@12852,20 12852:S3|66756e 12853:O2|@12854,35 12854:S5|6c6f63616c 12855:O2|124,62 12856:O2|@7419,55 12857:O2|@12858,40 12858:S6|6f72656c7365 12859:O2|@7421,14 12860:O2|@12861,27 12861:S7|696e636c756465 12862:O2|@12863,64 12863:S5|7768696c65 12864:O2|@12012,21 12865:O2|@12866,53 12866:S6|737472756374 12867:O2|@10070,2 12868:O2|@7746,15 12869:O2|@12870,39 12870:S4|6f70656e 12871:O2|@12872,3 12872:S7|616e64616c736f 12873:S5|7768657265 12874:S20|4c45585f28292e70617273654964656e74283329 12875:D3,1544|3b650c7303ff55248b4b08c7013d000000ff73045351ff33ff732c5053bbe0e986b2b848c052089090e876f6ffff8b4c24148901833c240175618b4424088b0081f8ef00000075588b0183f86175668b4424108b502c8b12f6c20175108b582c8b720489338b388b0a890feb1eff308b5010b80100000090ff1283f8017507b809000000eb028b005989018b4424088b0081f8f1000000756ceb0ae981010000e97c0100008b4424108b482c8b09f6c1017517eb05e9670100008b502c8b5904891a8b308b39893eeb21ff308b4810b80100000089ca9090ff1283f8017507b809000000eb028b005989018b4424088b0083f861720583f873762781f8c3000000720feb05e99a00000081f8cd000000761081f883000000723781f88d000000772f8b44240cc70087000000ff742410bb38ea86b2b8c0ea86b2909090e862f5ffff8b4c24148901b80100000083c418c38b4424088b008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700f10000008b4c240489018b442408c700ef000000b80100000083c418c38b4424088b0083f861723283f873772d8b44240cc70087000000ff742410bbe0e986b2b8ccea86b290e8d2f4ffff8b4c24148901b80100000083c418c38b4424088b008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b44240489088b442408c700ef000000b80100000083c418c38b4424088b0081f8f100000075648b0183f86175628b4424108b502c8b12f6c20175108b582c8b720489338b388b0a890feb1fff308b5010b8010000009090ff1283f8017507b809000000eb028b005989018b4424088b0083f861720583f873762c81f8c3000000721481f8cd000000eb0ae979000000e974000000761081f883000000722a81f88d0000007722ff742410bb38ea86b2b8d8ea86b2e8e2f3ffff8b4c24148901b80100000083c418c38b4424088b008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b44240489088b442408c700f1000000b80100000083c418c38b4424088b0083f85d741c8b4424088b0081f88b000000740e8b4424088b0081f8cb00000075628b4424088b0083f85d755c8b44240cc700570000008b11bb5d00000089d0909090e87224f3ff8b4c241489018b4424108b502c8b12f6c20175108b582c8b720489338b388b0a890feb27ff308b5010b801000000ff1283f8017511b809000000eb0ce956020000e9640000008b005989018b4424088b0083f861720583f87376338b4424148b0089c3b8e4ea86b2909090e80224f3ff8b4c24088b0989cb909090e8f223f3ff89c38b44241090e872d5ffffeb1c8b4424148b00ff742410bbe0e986b29090e8a2f2ffff8b4c241489018b4424088b0081f88b000000740e8b4424088b0081f8cb00000075678b4424088b008b4c24108b512c8b12f6c20175108b592c8b720489338b398b0a890feb2150ff31b8010000008b511090ff1283f8017507b809000000eb028b00598901eb01508b44240c8b0081f8fd00000075678b4424148b482c8b09f6c10175178b502ceb05e95c0100008b5904891a8b308b39893eeb22ff308b4810b80100000089ca909090ff1283f8017507b809000000eb028b005989018b44240c8b0083f861724783f87377428b442410c700570000008b442418eb05e97f0000008b00bb04eb86b29090e8de22f3ffff742414bbe0e986b29090e8a2f1ffff8b4c24188901b80100000083c41cc38b44240c8b008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700fd0000008b4c240889018b44240c8b0c248908b80100000083c41cc38b44240c8b0083f861723f83f873773a8b442410c700570000008b4424188b00bb8b00000090e84222f3ffff742414bbe0e986b29090e806f1ffff8b4c24188901b80100000083c41cc38b44240c8b008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b44240889088b44240c8b0c248908b80100000083c41cc3b80100000083c418c3b80100000083c418c390900000000004060000|@12887,1048575,@2310|13,0,30 30,0,@12876 35,0,I48 42,1,@12791 66,0,119 115,0,0 128,0,4 147,0,120 208,0,0 224,0,4 253,0,97 268,0,102 276,0,65 284,0,70 296,0,67 305,0,@12879 310,0,@12882 318,1,@12791 329,0,0 370,0,0 391,0,120 407,0,119 412,0,0 442,0,67 451,0,@12876 456,0,@12883 462,1,@12791 473,0,0 514,0,0 532,0,119 537,0,0 553,0,120 602,0,0 616,0,4 645,0,97 653,0,102 673,0,65 681,0,70 692,0,@12879 697,0,@12884 702,1,@12791 713,0,0 754,0,0 772,0,120 777,0,0 804,0,69 818,0,101 841,0,43 848,0,46 858,1,@4940 904,0,0 916,0,4 962,0,@12885 970,1,@4940 986,1,@4940 998,1,@12743 1015,0,@12876 1022,1,@12791 1040,0,69 1054,0,101 1100,0,0 1116,0,4 1138,0,126 1187,0,0 1204,0,4 1237,0,43 1255,0,@12886 1262,1,@4940 1271,0,@12876 1278,1,@12791 1289,0,0 1330,0,0 1351,0,126 1371,0,0 1401,0,43 1412,0,69 1418,1,@4940 1427,0,@12876 1434,1,@12791 1445,0,0 1486,0,0 1508,0,0 1517,0,0 1526,0,0 12876:O1|@12877 12877:D3,36|83f861721183f8737606b801000000c3b803000000c3b801000000c30000000020000000|@12878,1,@2308|11,0,0 17,0,1 23,0,0 12878:S15|436861722e69734469676974283129 12879:O1|@12880 12880:D3,80|83f861720b83f8737706b803000000c381f8c3000000720e81f8cd0000007706b803000000c381f883000000721481f88d0000007606b801000000c3b803000000c3b801000000c3000000004c000000|@12881,1,@2309|11,0,1 18,0,97 26,0,102 33,0,1 40,0,65 48,0,70 55,0,0 61,0,1 67,0,0 12881:S18|436861722e69734865784469676974283129 12882:S3|307778 12883:S2|3077 12884:S2|3078 12885:S23|6d616c666f726d6564207265616c206e756d6265723a20 12886:S2|457e 12887:S21|4c45585f28292e70617273654e756d626572283229 12888:S19|756e6b6e6f776e206368617261637465722022 12889:S20|4c45585f28292e7061727365546f6b656e283129 12890:S18|4c45585f28292e696e73796d626f6c283129 12891:O1|@12892 12892:O1|@12893 12893:D3,16|b8b8eb86b2c39090000000000c000000|@12895,1,@2313|1,0,@12894 12894:O6|0,0,0,0,0,0 12895:S34|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329283129 12896:D3,152|8b45008d40ec3b45087303ff5520894500c740fc01000040c700010000008d4808c741fc02000000c701acec86b28941048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702aced86b28942048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c70644ee86b28946048066ffbf890b895304897308b801000000c39090900000000094000000|@12905,31,@2318|26,0,0 42,0,@12897 79,0,@12901 116,0,@12903 136,0,0 12897:D3,32|3b650c7303ff55248b52048b1289c389d0e91e0000009090000000001c000000|@12900,1048575,@2315|18,1,@12898 12898:D3,88|3b650c7303ff5524a801753d8b08ff7104ff31538b480489c8e8e2ffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489085a83c408ff22b801000000c3900000000054000000|@12899,1048575,@2314|74,0,0 12899:S41|5554494c49544945535f28292e7365617263684c6973742831296170706c792831296170706c283129 12900:S34|5554494c49544945535f28292e7365617263684c6973742831296170706c79283129 12901:D3,88|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b58048959048b3089318b7a048b3f8b75008d76f43b75087303ff5520897500c746fc02000000897e04890e8b52048932b801000000c3900000000054000000|@12902,63,@2316|74,0,0 12902:S34|5554494c49544945535f28292e7365617263684c697374283129656e746572283129 12903:D3,164|8b52048b12f6c20175668b0a3b017441f601017537a8017533a8017407bb03000000eb068b188d5c1b0183c3088b3189c7ff710489d9d1e93bc9f3a68d7c3f018d7436018d4c0901740aeb32ff7104eb2dff710489c18b45008d40f83b45087303ff5520894500c740fc01000000eb05e91c0000008b1424891083c404c38b520483c4043b650c7303ff5524e974ffffff89c1b801000000c390909000000000a0000000|@12904,63,@2317|30,0,1 148,0,0 12904:S35|5554494c49544945535f28292e7365617263684c6973742831296c6f6f6b7570283129 12905:S26|5554494c49544945535f28292e7365617263684c697374283129 12906:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2319| 12907:S24|4d6973632e6c6f6f6b757044656661756c74283229283129 12908:O1|@12909 12909:D3,36|83f8617506b803000000c383f8017406b801000000c3b803000000c30000000020000000|@12910,1,@2320|6,0,1 17,0,0 23,0,1 12910:S15|53796d5365742e2b2b283229283129 12911:D3,1252|3b650c7303ff55248b4c24048b55008d52f43b55087303ff5520895500c742fc02000000c70204f586b2895a048062ffbf8b75008d76f03b75087303ff5520897500c746fc030000008956088b51048956048b39893e8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7079cf786b28947048067ffbf8b4b088b098b53248b1283fa53750289ca89d157bfa6f086b28d7c8ffcffe7e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fa7b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f901751483fa47740f83fa6d740a83fa67740583fa2b75456a016a01535056ff7424148d5c2410b88cfd86b290e8160d00008b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c404890883c404c204008b4b288b098b533c8b126a016a01535251ff73186a01568d7424185650538b44242c9090e80abc00008b45008d40e43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc040000008b54241489510c8941088b442410894104c701010000008b44240c8b50088b128b58248b1b83fb53750289d383fb6174258b50088b128b58248b1b83fb53750289d383fb01740f5189c3b877000000e8ce1b0000eb06b801000000518b45008d40e83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc0300000089410858894104c701050000008b45008d40d03b45087303ff5520894500c740fc02000000c740040100000089088b4c240c8b51148b128b49388b098d580cc743fc050000008b742408897310894b0c8b4c2404894b088953045983c414890b89c18d4318c740fc02000000895804890883c404c2040090909000000000e0040000|@13408,2097151,@2579|38,0,@12912 112,0,@12916 144,0,$12911+154 704,0,0 711,0,1 718,0,1 725,0,1 732,0,1 739,0,1 746,0,1 753,0,1 760,0,1 767,0,1 774,0,1 811,0,1 856,0,@12917 862,1,@12919 946,1,@13148 976,0,0 1009,0,0 1065,0,59 1070,1,@12930 1077,0,0 1108,0,0 1131,0,2 1162,0,0 12912:D3,300|3b650c7303ff55248b42048b48288b098b58148b1b8b703c8b368b78388b3f528b55008d52e83b55087303ff5520895500c742fc05000000897210897a0c894a08895a048b4018890252bb5cbe86b2b844f686b290e85ec9ffff909090e8060100008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b51048b5a0c83c404c703030000008b4a3089caff128b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f57002008908c390900000000028010000|@12915,1048575,@2322|75,0,@12744 80,0,@12913 86,1,@12747 94,1,@12914 128,0,0 135,0,0 142,0,3 148,0,0 158,0,@6321 203,0,0 209,0,1 227,0,1 264,0,@5413 283,0,79994 12913:S31|467265652074797065207661726961626c6573206e6f7420616c6c6f776564 12914:D3,240|3b650c7303ff5524a801755b83780401755a8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3e9740000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000f6c101740d8b5004b8ecd57ab28b5d04ff13518b500489d09090e852ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804598908c3b874c286b2c3909000000000ec000000|@12753,7,@2321|49,0,3 59,0,@6321 96,0,0 139,0,3 152,0,@6321 203,0,@5592 225,0,@12752 12915:S36|50415253455f44454328292e7061727365446563283329676c6f62616c456e762d283129 12916:D3,1500|3b650c7303ff552483f82f740d89c1bbbef786b28d5c8bfcffe3e9a8050000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901753c83f823743c83f80d743c83f831743c83f841743c83f843743c83f83f743c83f84d743c83f845743c83f827743c83f80f743c81f8810000007439eb3ce904030000e9ff020000e9fa020000e9f5020000e9f0020000e9eb020000e9e6020000e9e1020000e9dc020000e9d7020000e9d2020000e9cd02000083f833741283f855741289c1bbbafa86b28d5c8bfcffe3e9b1020000e9ac020000909090e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f87b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f901750f83f867740a83f82b740583f86d7506b803000000c38b5204ff22909000000000d8050000|@12910,1048575,@2323|16,0,$12916+34 584,0,0 591,0,1 598,0,1 605,0,1 612,0,1 619,0,1 626,0,1 633,0,1 694,0,64 775,0,$12916+798 1348,0,0 1355,0,1 1362,0,1 1369,0,1 1376,0,1 1383,0,1 1390,0,1 1397,0,1 1404,0,1 1411,0,1 1418,0,1 1455,0,1 1480,0,1 12917:O1|@12918 12918:D3,732|89c1baa2fd86b28d548afcffe290e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f87b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f901750a83f847740583f86d7506b803000000c383f8677506b803000000c383f82b7406b801000000c3b803000000c300000000d8020000|@12910,7,@2324|3,0,$12918+14 564,0,0 571,0,1 578,0,1 585,0,1 592,0,1 599,0,1 606,0,1 613,0,1 620,0,1 627,0,1 634,0,1 671,0,1 691,0,1 702,0,1 713,0,0 719,0,1 12919:D3,1556|3b650c7303ff55248b4424108b48088b098b50248b1283fa53750289ca8b48288b098b70148b368b783c8b3f538b58388b1b578b7d008d7fe83b7d087303ff5520897d00c747fc05000000518b4c2404894f10895f0c8b1c24895f088977048b7018893783fa61740583fa0175188b4c2408c70101000000897904b80100000083c40cc2100089d6bb1a0187b28d5cb3fcffe3909090e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fa7b7407bb01000000eb46bb03000000eb44bb03000000eb42bb03000000eb40bb03000000eb3ebb03000000eb3cbb03000000eb3fbb03000000eb38bb03000000eb31bb03000000eb2abb03000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000bb0300000083fb01751483fa47740f83fa6d740a83fa67740583fa2b75716a016a0183fa47756dff7018ff74241cff742428ff7424308b5c24348b44242cbaac0687b2e8d60200008b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000894a08894204c702050000008d44240489108d442404c740048c8c88b2eb6de92602000083fa6d7568ff7018ff74241cff742428ff7424308b5c24348b44242cbaac0687b29090e8620200008b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000894a08894204c702050000008d44240489108d442404eb0ae931010000e909000000c740048c8c88b2eb6483fa67752bff7018ff74241cff74242c8b5c24308b442428e8a68a01008d4c240489018d442404c74004f49388b2eb6e83fa2b7534ff7018ff74241cff74242cff74242c8b5c24348b44242ce8428f01008d4c240489018d442404c7400400a188b2eb75e9ba000000ff70186a016a016a03ff74242c8d44240850ff742438ff7424408b5c24448b44243890e882aa00008b45008d40e43b4508730aeb05e980000000ff5520894500c740fc01000040c700010000008d4808c741fc040000008b54240489510c8941085883c404894104c70101000000eb05e9450000008b45008d40e83b45087303ff5520894500c740fc01000040c700010000008d5008c742fc03000000894208894a04c702050000008d44240489108d442404c740048c8c88b26a016a01ff742430ff742430ff742430ff7424308d5c24108b44242090e886faffff8b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240889088b0c248d500cc742fc050000008b5c241483c404895a108b590c895a0c8b74240c8972088b71048972045f83c408893a8b7c24088907895704b80100000083c40cc21000578b5c2420b877000000909090e8960900008b44240cc7000100000059894804b80100000083c40cc21000900000000010060000|@13407,2097151,@2578|116,0,0 124,0,0 137,0,$12919+150 700,0,0 707,0,1 714,0,1 721,0,1 728,0,1 735,0,1 742,0,1 749,0,1 756,0,1 763,0,1 770,0,1 807,0,1 869,0,@12920 874,1,@12922 904,0,0 926,0,2 943,0,@13371 983,0,@12920 990,1,@12922 1020,0,0 1042,0,2 1071,0,@13371 1102,1,@13373 1119,0,@13390 1154,1,@13393 1171,0,@13404 1218,1,@13148 1255,0,0 1288,0,0 1325,0,0 1347,0,2 1364,0,@13371 1494,0,0 1510,0,59 1518,1,@12930 1528,0,0 1537,0,0 12920:O3|@12922,@13130,@12921 12921:O2|@13145,@12920 12922:D3,928|3b650c7303ff55248b4b288b098b733c8b368b7b088b3f568b73248b3683fe53750289fe83fe6d757151ff731852505389d8ba24bc86b29090e82ab5ffff8b442408ff742420ff7004ff74240cff742428ff742410ff742438687c0a87b2ff74241c8d44240450bbbc9487b2b805000000e8b22100008b480483c4288b55008d52e83b55087303ff5520895500c742fc050000008b5c2408eb05e96a000000895a108b590c895a0c8b7424048972088b71048972045f83c404893a8b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000ff308b45008d40ec3b45087303ff5520894500c740fc0400000089780c5f897808895004c7000500000083c404c20c008b4b088b098b73248b3683fe53750289ce83fe477515525053ff3089d8ba24bc86b29090e836b4ffffeb1a89d689c7b847000000e8be090000565753ff379090e8f60700008b4424048b48288b098b503c8b128b5c24086a016a016a0189d751ff7018ff7308ff73048d5c2410b8010000009090e8b6e3ffff8b45008d40f03b45087303ff5520894500c740fc03000000c700109587b2598948048b4c24148948088060ffbf8b4d008d49e43b4d087303ff5520894d00c741fc030000008b14248951088941048b5c241089198d7110c746fc02000000c706589587b28b5424388956048066ffbf8b5c2424575056ff742440ff7424408b73088b5c243089c889f290ff128b4c24248b51088b128b59248b1b83fb53750289d383fb3575105089c8ba24bc86b290e832b3ffffeb1a89c3b8350000009090e8ba080000538b5c24289090e8f20600008b45008d40f03b45087303ff5520894500c740fc03000000c700949587b28b4c24248948048b4c241c8948088060ffbf8b4d008d49e43b4d087303ff5520894d00c741fc030000008b54240c8951088b54240489510489018d4110c740fc02000000c700fc9587b28b5424448950048060ffbf8b5c243050ff742444ff7424448b43088b5c243489c689c889f290ff128b4c24288b51148b128b59388b1b8b71088b368b79248b3f83ff53750289f783ff1f751250535289c8ba24bc86b290e852b2ffffeb1a89c689d7b81f000000e8da0700005653578b5c2434e8120600008b45008d40d43b45087303ff5520894500c740fc050000008b4c24148948108b4c240489480c8b4c24208948085983c4048948048b4c2414890889c18d4018c740fc0400000089480c8b4c24048948085983c434894804c7000300000083c404c20c00909090000000009c030000|@13129,2097151,@2428|51,0,@12740 58,1,@12741 90,0,@12923 104,0,@13121 109,0,2 114,1,@12973 213,0,0 255,0,2 295,0,@12740 302,1,@12741 313,0,35 318,1,@12931 330,1,@12930 375,0,0 382,1,@12896 412,0,@13124 482,0,@13125 556,0,@12740 562,1,@12741 571,0,26 578,1,@12931 590,1,@12930 620,0,@13126 694,0,@13128 780,0,@12740 786,1,@12741 797,0,15 802,1,@12931 814,1,@12930 907,0,1 12923:D3,64|3b650c7303ff552453ff7208ff720cff7210ff7214ff72188b5a049090e8320000008b0c248b1089118b5804895904b80100000083c404c3000000003c000000|@13035,2097151,@2422|30,1,@12924 48,0,0 12924:D3,884|3b650c7303ff55245368580e87b253ff7424208d5c2408b8980e87b290e8e603000050ff70048b5c24288b0889c8909090e80e0c00008b04248b4c24248b51088b128b59248b1b83fb53750289d383fb157575ff700489c8ba24bc86b2e8feb0ffff8b45008d40f43b45087303ff5520894500c740fc02000000c7007c1987b28b4c24088948048060ffbf6a016a01508d44240450ff7424348b5c243c8b442434bab01987b2909090e84a0e00008b45008d40f03b45087303ff5520894500c740fc03000000eb05e9300000008b4c2404894808c74004030000005983c40489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb6e83fb13756eff700489c8ba24bc86b290e84eb0ffff8b45008d40f43b45087303ff5520894500c740fc02000000c7004c9487b28b4c24088948048060ffbf6a016a01508d44240450ff7424348b5c243c8b442434bab01987b2909090e89a0d00008b45008d40f03b4508730feb0ae94a000000e93d000000ff5520894500c740fc030000008b4c2404894808c74004010000005983c40489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb08b901000000ff70048b4424288b50088b128b58248b1b83fb53750289d383fb23751051ba24bc86b2909090e87eafffffeb1a89cbb8230000009090e806050000538b5c242c9090e83e0300006a016a01ff7424148d44240450ff74242cff74243c8b5c24448b44243c8b54243890ff128b44240c8b4c24048b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8b442410f64424080175748b5c24088b3b8b4d008d49d43b4d087303ff5520894d00c741fc01000040c701010000008d7108c746fc01000040c706010000008d5e08c743fc06000000897314894b108b4f08894b0c8b77048973088b378973048b342489338b75008d76f43b75087303ff5520897500c746fc02000000eb05e90b000000895e04c70605000000eb038b3424837c2408017407b901000000eb05b90300000083f1028b5d008d5bdc3b5d087303ff5520895d00c743fc01000040c703010000008d7b08c747fc06000000528b5004895714894f10895f0c8977088b08894f048b1c24891f8b45008d40f43b45087303ff5520894500c740fc02000000895804893883c424c21400900000000070030000|@13120,2097151,@2421|10,0,@12925 24,0,@12926 30,1,@12928 50,1,@12947 89,0,@12740 94,1,@12741 124,0,@12953 162,0,@12954 170,1,@12956 215,0,1 264,0,@12740 270,1,@12741 300,0,@13119 338,0,@12954 346,1,@12956 396,0,0 435,0,0 470,0,@12740 478,1,@12741 487,0,17 494,1,@12931 506,1,@12930 649,0,0 665,0,0 743,0,2 760,0,0 767,0,1 800,0,0 12925:D3,44|3b650c7303ff552483f823740a83f815740583f8137506b803000000c38b5204ff2290900000000028000000|@12910,1048575,@2325|24,0,1 12926:O1|@12927 12927:D3,36|83f80d7506b803000000c383f8317406b801000000c3b803000000c30000000020000000|@12910,1,@2326|6,0,1 17,0,0 23,0,1 12928:D3,268|3b650c7303ff55248b4c24048b51088b128b71248b3683fe53750289d65389c289f09090ff1283f80174718b4424088b48048b098b50288b128b58148b1b8b703c8b368b78388b3f518b4d008d49e83b4d087303ff5520894d00c741fc0500000089711089790c8951088959048b40188901518b442410ba24bc86b290e8d6acffff8b45008d40f43b45087303ff5520894500c740fc02000000eb05e90d0000005989480459890883c404c204008b5c2408b8f80f87b29090e8760000008b4424088b48088b098b50248b1283fa53750289ca89d08b1424ff1283f80175198b442408ba24bc86b290e86aacffff3b650c7303ff5524ebc6b8d41687b283c404c20400900000000008010000|@12946,2097151,@2329|120,0,@12740 126,1,@12741 179,0,@12929 186,1,@12930 228,0,@12740 234,1,@12741 249,0,@12944 12929:S10|4964656e746966696572 12930:D3,424|3b650c7303ff55248b4b088b098b53248b1283fa53750289ca83fa6975228b4b048b09535089cbb84500000090e856fbf2ffbb450000009090e84afbf2ffeb568b4b088b098b53248b1283fa53750289ca83fa57740f83fa3d740a83fa75740583fa31750b8b4b048b0989c289c8eb248b4b088b098b53248b1283fa53740689c189d0eb0689c289c889d189cee82a01000089f253528b4c24048b51288b128b59148b1b8b713c8b368b79388b3f508b45008d40e83b45087303ff5520894500c740fc0500000089701089780c8950088958048b4918890850bb8c1687b28b442408909090e89efaf2ff8b5c2404909090e892faf2ffbba41687b29090e886faf2ffbb5cbe86b29090e8a2adffff909090e84ae5ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40889500c894808c7400401000000c700030000008b0c248b510c83c404c702030000008b5130ff2200000000a4010000|@12943,1048575,@2328|40,0,34 46,1,@4940 51,0,34 58,1,@4940 142,1,@12931 218,0,@12941 230,1,@4940 242,1,@4940 247,0,@12942 254,1,@4940 259,0,@12744 266,1,@12747 274,1,@12914 308,0,0 315,0,0 322,0,3 328,0,0 338,0,@6321 386,0,0 392,0,1 407,0,1 12931:D3,976|b9d61187b28d4c81fcffe1909090e91b020000909090e919020000909090e917020000909090e915020000909090e913020000909090e911020000909090e90f020000909090e90d020000909090e90b020000909090e909020000909090e907020000909090e905020000909090e903020000909090e901020000909090e9ff010000909090e9fd010000909090e9fb010000909090e9f9010000909090e9f7010000909090e9f5010000909090e9f3010000909090e9f1010000909090e9ef010000909090e9ed010000909090e9eb010000909090e9e9010000909090e9e7010000909090e9e5010000909090e9e3010000909090e9e1010000909090e9df010000909090e9dd010000909090e9db010000909090e9d9010000909090e9d7010000909090e9d5010000909090e9d3010000909090e9d1010000909090e9cf010000909090e9cd010000909090e9cb010000909090e9c9010000909090e9c7010000909090e9c5010000909090e9c3010000909090e9c1010000909090e9bf010000909090e9bd010000909090e9bb010000909090e9b9010000909090e9b7010000909090e9b5010000909090e9b3010000909090e9b1010000909090e9af010000909090e9ad010000909090e9ab010000909090e9a9010000909090e9a7010000909090e9a5010000909090e9a3010000909090e9a1010000909090e99f010000909090e99d010000909090e99b010000909090e999010000909090e997010000909090e995010000909090b80f000000c3b8e8e086b2c3b8086083b2c3b888e386b2c3b8bc577bb2c3b850e286b2c3b855000000c3b8c4e086b2c3b8ac1587b2c3b875000000c3b8d8e186b2c3b859000000c3b8743b7bb2c3b84ce186b2c3b8fca77cb2c3b8e0d67cb2c3b87c377bb2c3b87b000000c3b86cdc7bb2c3b8cc327cb2c3b884e286b2c3b8b06586b2c3b898e186b2c3b847000000c3b8c41587b2c3b8cca77cb2c3b8f8d67cb2c3b8f8e286b2c3b8a46186b2c3b8886186b2c3b8d81587b2c3b8b7000000c3b8f7000000c3b851000000c3b810d77cb2c3b89ce286b2c3b8c06186b2c3b844457bb2c3b814e286b2c3b870e386b2c3b8d0e286b2c3b8f41587b2c3b870e186b2c3b80c1687b2c3b81ce186b2c3b8bb000000c3b8fb000000c3b853000000c3b877000000c3b878e086b2c3b8e86286b2c3b83c287bb2c3b8241687b2c3b83ce386b2c3b85c287bb2c3b8e4a77cb2c3b8f0e186b2c3b874977ab2c3b8401687b2c3b8fc367bb2c3b8bf000000c3b84cd97bb2c3b8f9000000c3b898e386b2c3b814e386b2c3b82ce17cb2c3b868e286b2c3b85c1687b2c3909000000000cc030000|@12940,3,@2327|1,0,$12931+14 559,0,7 565,0,@12819 571,0,@10070 577,0,@12872 583,0,@6604 589,0,@12848 595,0,42 601,0,@12816 607,0,@12932 613,0,58 619,0,@12838 625,0,44 631,0,@6559 637,0,@12827 643,0,@7421 649,0,@7746 655,0,@6543 661,0,61 667,0,@6811 673,0,@7006 679,0,@12852 685,0,@12012 691,0,@12833 697,0,35 703,0,@12933 709,0,@7417 715,0,@7748 721,0,@12861 727,0,@11990 733,0,@11988 739,0,@12934 745,0,91 751,0,123 757,0,40 763,0,@7750 769,0,@12854 775,0,@11992 781,0,@6588 787,0,@12843 793,0,@12870 799,0,@12858 805,0,@12935 811,0,@12830 817,0,@12936 823,0,@12823 829,0,93 835,0,125 841,0,41 847,0,59 853,0,@12810 859,0,@11998 865,0,@6505 871,0,@12937 877,0,@12866 883,0,@6507 889,0,@7419 895,0,@12840 901,0,@5579 907,0,@12938 913,0,@6538 919,0,95 925,0,@6806 931,0,124 937,0,@12873 943,0,@12863 949,0,@7768 955,0,@12850 961,0,@12939 12932:S15|3c6368617220636f6e7374616e743e 12933:S12|3c6964656e7469666965723e 12934:S18|3c696e746567657220636f6e7374616e743e 12935:S14|756e6b6e6f776e2073796d626f6c 12936:S15|3c7265616c20636f6e7374616e743e 12937:S17|3c737472696e6720636f6e7374616e743e 12938:S17|3c74797065206964656e7469666965723e 12939:S15|3c776f726420636f6e7374616e743e 12940:S15|53796d626f6c732e72657072283129 12941:S14|2065787065637465642062757420 12942:S10|2077617320666f756e64 12943:S20|534b4950535f28292e6e6f74666f756e64283229 12944:O2|I48,@12945 12945:O5|I48,0,0,0,0 12946:S17|534b4950535f28292e6765746964283329 12947:D3,44|3b650c7303ff55248b4c2404894c24048b1424891c2489c3b80300000052e91d000000900000000028000000|@12952,1048575,@2331|25,0,1 31,1,@12948 12948:D3,404|3b650c7303ff5524f6c3017407b903000000eb068b0b8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77e08b801000000c2080089c1f6c101740583e9027105ff5538ebf6f6c101740783f9017d08eb2df641ff107527f6c3017407ba03000000eb068b138d541201f6c1017409f6c20174043bcaeb05ff5538ebf77c0d89c2b8a8f179b28b5d0490ff13f6c301740489d9eb0d83c108d1e90fb60c0b8d4c090183f95d756cb8fc1887b2e88ef3f2ffbb141987b29090e882f3f2ffbb5cbe86b29090e89ea6ffff909090e846deffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c1017414b8ecd57ab2eb05e94e0000008b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000008b54240889500c894808c7400401000000c700030000008b4c24048b590cc703030000008b51305e83c40856ff22a801740583c0027105ff5538ebf68b4c24088b542404894c240889542404e976feffff90900000000090010000|@12951,1048575,@2330|14,0,1 47,0,0 95,0,1 131,0,@4898 169,0,@12949 174,1,@4940 179,0,@12950 186,1,@4940 191,0,@12744 198,1,@12747 206,1,@12914 240,0,0 247,0,0 254,0,3 260,0,0 270,0,@6321 326,0,0 332,0,1 345,0,1 12949:S15|7175616c6966696564206e616d6520 12950:S13|20696c6c6567616c2068657265 12951:S36|5554494c49544945535f28292e636865636b466f72446f7473283329636865636b283129 12952:S28|5554494c49544945535f28292e636865636b466f72446f7473283329 12953:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2332|14,0,1 12954:O2|@12956,@12955 12955:O2|@13051,@12954 12956:D3,960|3b650c7303ff55248b4b088b098b73248b3683fe53750289ce83fe65745583fe0d745583fe317455535052b89c1d87b290e80ef6ffff8b4424088b48088b098b50248b1283fa53750289ca5289d08b54241c9090ff1283f8017540833c2465743a833c240d7434833c2431742e8b44240ceb0fe92d000000e928000000e923000000ba24bc86b29090e8daa1ffff83c4043b650c7303ff5524eb9bb80100000083c404eb0a89c1b8010000005351528b4424088b48288b098b503c8b128b58088b1b8b70248b3683fe53750289de83fe317573ff74241868b81d87b2508d5c2404b8980e87b2909090e822f4ffff50ff70048b5c24188b0889c8909090e84afcffff8b04248b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000894a0c8b480483c40c894a088b18895a04c70203000000eb05e9110000008d7214c746fc02000000894e048916eb6c83fe65756c5251ff7018ba24bc86b29090e8f6a0ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700ec1d87b28b4c24248948048060ffbf8b54240c50ff7424208b5c241c8b4424188b520490ff128b4c24148b51148b128b59388b1b8b75008d76e8eb0ae96f010000e9a60000003b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956045a83c40889168b51088b128b59248b1b83fb53750289d383fb1f7510565089c8ba24bc86b2e846a0ffffeb1a89c3b81f0000009090e8cef5ffff56538b5c241090e806f4ffff8b45008d40e43b45087303ff5520894500c740fc030000008b4c24048948085a895004c700010000008d7010c746fc02000000894e048906eb718b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fcc3b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f8d5718c742fc01000040c702010000008d5a08c743fc0400000089530c897b08c74304381e87b2c703030000008b50288b12eb05e94b0000008b70148b368b783c8b3f8b48388b09538b5d008d5bdc3b5d087303ff5520895d00c743fc05000000897b10894b0c8953088973048b401889038d7318c746fc02000000895e045889066a0183c4048b44240883c4088b48088b098b50248b1283fa53750289ca83fa7f754556ba24bc86b29090e8029fffff8b0424ff742404ff742410ff74241c8b58048b0889c890e8fe0000008b4c241083c4048b1089118b5804895904b80100000083c404c20c008b44240c8b0e89088b5604895004b80100000083c404c20c009000000000bc030000|@13050,2097151,@2373|44,0,@12957 50,1,@12930 131,0,@12740 138,1,@12741 156,0,0 168,0,0 216,0,@12958 226,0,@12926 234,1,@12928 254,1,@12947 287,0,0 320,0,1 359,0,@12740 366,1,@12741 396,0,@12959 537,0,@12740 542,1,@12741 551,0,15 558,1,@12931 570,1,@12930 611,0,0 705,0,0 728,0,@12960 734,0,1 859,0,@12740 866,1,@12741 894,1,@12961 916,0,0 941,0,0 12957:S18|5374617274206f66207369676e6174757265 12958:D3,32|3b650c7303ff552483f87f7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2333|14,0,1 12959:D3,56|3b650c7303ff552483f8617506b803000000c383f87f7506b803000000c383f81f7506b803000000c38b5204ff2290900000000034000000|@12910,1048575,@2334|14,0,1 25,0,1 36,0,1 12960:S5|6572726f72 12961:D3,924|3b650c7303ff55248b4c240c8b51088b128b71248b3683fe53750289d683fe777512535089c8ba24bc86b29090e8b69dffffeb1a89c6b8770000009090e83ef3ffff53568b5c241490e876f1ffff6a016a016a0189e3b8010000009090e856cdffff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b5424048950048b1c248918ff74241c89c3b80100000090e812030000ff74241868a02c87b250ff74242c8d5c2408b8d42c87b2e8d6efffff8b308b7804ff742414ff74242c8b5c24188b4424149090e8060e00008b4c242c8b51088b128b59248b1b83fb53750289d383fb23751456575089c8ba24bc86b2909090e8e69cffffeb1a89c3b8230000009090e86ef2ffff5657538b5c2438e8a6f0ffff8b4424388b48088b098b50248b1283fa53750289ca83fa41745583fa43745583fa31745583fa75745589c3b8fc367bb2909090e86ef0ffff8b4424388b48088b098b50248b1283fa53750289ca5289d08b5424349090ff1283f801754c833c24417446833c24437440833c2431eb14e93f000000e93a000000e935000000e9300000007424833c2475741e8b44243cba24bc86b2909090e82e9cffff83c4043b650c7303ff5524eb8fb80100000083c404eb05b8010000008b45008d40f43b45087303ff5520894500c740fc02000000c700782f87b28b4c24308948048060ffbf6a016a01ff7424088d542404528b5c244890e85a0f00008b45008d40e83b45087303ff5520894500c740fc05000000598948108b4c241089480c8b4c240c8948088b4c24288948048b4c240889088b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008b44242c8b14248d590cc743fc050000008b701083c4308973108b7a0c897b0c8b70088973088b72048973048b0089038b45008d40f43b45087303ff5520894500c740fc0200000089580489088b74240c8b56088b128b7e248b3f83ff53750289d783ff05757353515089f0ba24bc86b29090e8029bffff8b4424188b48088b098b50248b1283fa53750289ca83fa7775248b4c24148b54241089442418894c2414895424108b5c240883c4045883c404e9dcfcffff8b48248b0983f953740f8b4824b81c2c87b28b5d049090ff138b4824c70105000000eb05e9070000005883c408c20c0083ff7f7536535189f0ba24bc86b2909090e87e9affff8b4424148b4c24108b54240c89442414894c24108954240c8b5c24045883c404e971fcffffc20c0090900000000098030000|@13049,2097151,@2372|39,0,@12740 46,1,@12741 55,0,59 62,1,@12931 74,1,@12930 87,0,0 94,1,@12896 148,0,0 154,1,@12962 163,0,@12983 177,0,@12984 182,1,@12928 210,1,@12987 246,0,@12740 254,1,@12741 263,0,17 270,1,@12931 282,1,@12930 330,0,@6538 338,1,@12930 430,0,@12740 438,1,@12741 456,0,0 466,0,0 496,0,@12992 530,1,@12993 618,0,2 731,0,@12740 738,1,@12741 818,0,@12979 834,0,2 862,0,@12740 870,1,@12741 12962:D3,320|3b650c7303ff5524ff3350ff7304ff742410684c2387b28b4424188b48088b098b50248b1283fa53750289ca83fa437567ba24bc86b2909090e8fa99ffff8b4424188b48088b098b50248b1283fa53750289ca83fa757565508d4c240451bb9c2887b2b81700000090e88a0600008b4c24188b51088b128b59248b1b83fb53750289d383fb5f7515ff3089c8ba24bc86b2e8a299ffffeb1ee94c0000008b18b85f00000090e826efffff538b5c241c9090e85eedffff5883c414c204008b48248b0983f953740e8b4824b81c2c87b28b5d0490ff138b4824c70143000000b80100000083c414c2040083fa75753f6a016a0189e3b8010000008d542408909090ff128b45008d40f43b45087303ff5520894500c740fc02000000c74004010000005983c404890883c414c20400b80100000083c414c20400000000003c010000|@12982,2097151,@2343|19,0,@12963 50,0,@12740 58,1,@12741 95,0,@12970 100,0,11 106,1,@12973 141,0,@12740 146,1,@12741 160,0,47 166,1,@12931 178,1,@12930 203,0,@12979 218,0,33 223,0,0 245,0,0 285,0,0 302,0,0 12963:D3,684|3b650c7303ff55248b42048b48088b098b70248b3683fe53750289ce83fe7575728b48048b098b70288b368b78148b3f538b583c8b1b528b50388b12518b4d008d49e83b4d087303ff5520894d00c741fc0500000089591089510c8971088979048b401889018b4424048b50048b58108b45008d40f03b45087303ff5520894500c740fc03000000c7000c2687b28b3424eb05e9510100008970048950088060ffbf5189da909090ff128b44240883780c0174648b542404f6c2017407b903000000eb068b0a8d4c0901f6c101740783f9037e5deb06f641ff10755af6c2017407b903000000eb068b0a8d4c0901f6c101740783f9037e08eb13f641ff10740db8a8f179b28b5d04909090ff13f6c20175110fb64a05eb05e92c0000008d4c0901eb0289d183f94f7411b901000000eb1de90c000000e907000000b903000000eb0cb901000000eb05b9010000008b55008d52f83b55087303ff5520895500c742fc01000040c702ec7d7ab283f9017507b901000000eb05b90900000081c9f170020083c9058b5d008d5be83b5d087303ff5520895d00c743fc02000000894b0489138b48088d430cc740fc020000008958048b54240489105389caff128b44240c8b4004ba24bc86b2909090e81297ffff8b4424105989085983c408894804b80100000083c404c389d6b87500000090e886ecffff53568b5e049090e8beeaffff8b04248b480489c8ba24bc86b29090e8ce96ffff8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc02000000c74104fd70020089018b04248b50048b5a2883c4048b1b8b72148b368b7a3c8b3f8b42388b00518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089410c8959088971048b521889118b4424045a8910894804b80100000083c404c390909000000000a8020000|@12969,2097151,@2337|138,0,@12964 190,0,1 226,0,1 257,0,@4898 299,0,0 316,0,1 323,0,0 330,0,0 360,0,@5413 370,0,0 377,0,4 454,0,@12740 462,1,@12741 481,0,0 492,0,58 498,1,@12931 510,1,@12930 523,0,@12740 530,1,@12741 560,0,@5413 577,0,79998 665,0,0 12964:D3,44|3b650c7303ff55248b4a048b1c24890c24ff720889de8b58048b3889f856e91d000000900000000028000000|@12968,1048575,@2336|31,1,@12965 12965:D3,352|3b650c7303ff55243b442408743ca801756bf64424080175698b542408f6c2017407b903000000eb068b0a8d4c090183c10889c689d7d1e93bc9f3a68d7c3f018d7436018d4c0901756e8b4c24048b51288b128b59148b1b8b713c8b368b79388b3f508b45008d40e83b45087303ff5520894500c740fc05000000eb0ae9cd000000e9c800000089701089780c8950088958048b4918890850bbc02787b28b442404909090e89ee4f2ffbb5cbe86b29090e8ba97ffffeb05e992000000e85ecfffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c894808c7400401000000c700030000008b4c24048b510cc702030000008b51305b83c40853ff22b801000000c2080090000000005c010000|@12967,1048575,@2335|35,0,1 154,0,@12966 166,1,@4940 171,0,@12744 178,1,@12747 190,1,@12914 224,0,0 231,0,0 238,0,3 244,0,0 254,0,@6321 302,0,0 308,0,1 321,0,1 336,0,0 12966:S23|2068617320616c7265616479206265656e20757365642e 12967:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283229 12968:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283129 12969:S50|50415253455f44454328292e7061727365446563283329676574547970655661727328322967657454797065566172283129 12970:O1|@12971 12971:D3,28|83f8757406b801000000c3b803000000c39090900000000018000000|@12972,1,@2338|6,0,0 12,0,1 12972:S20|53796d5365742e747970654964656e742d283129 12973:D3,124|3b650c7303ff55248b4c24088b51288b128b71148b368b793c8b3f538b59388b1b508b45008d40e83b45087303ff5520894500c740fc0500000089781089580c8950088970048b491889088b4c240c8b542410894c24108954240c5b8b742404895c24045b5389c3b80100000056e91d000000900000000078000000|@12978,2097151,@2342|105,0,0 111,1,@12974 12974:D3,404|3b650c7303ff55246a016a0153508d5c2408b8010000008b54242090ff128b44241c8b48088b098b50248b1283fa53750289ca3b542418750fba24bc86b2909090e86a92ffffeb468b48088b098b50248b1283fa53750289ca89d08b54241490ff1283f80174718b4424189090e8d6e7ffff8b5c241c909090e80ee6ffff8b44241cba24bc86b29090e82292ffff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c2408890883f80175058b0424eb0d89c38b0424909090e8de0000008b4c24208b54241c8b5c2418eb05e9200000008b742414894c24208954241c895c24188974241483c4045b83c408e903ffffff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c2408890883f80175058b0424eb0a89c38b0424e8ca0000008b4c24048b54240c8b5d008d5bdc3b5d087303ff5520895d00c743fc050000008b71108973108b7a0c897b0c8b71088973088b72048973048b09890b89c18d4318c740fc02000000895804890883c410c210009090900000000090010000|@12977,2097151,@2341|19,0,0 58,0,@12740 66,1,@12741 110,1,@12931 122,1,@12930 131,0,@12740 138,1,@12741 169,0,0 198,1,@12975 280,0,0 306,1,@12976 12975:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2339| 12976:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2340| 12977:S29|534b4950535f28292e6765744c697374283429666f724c697374283229 12978:S19|534b4950535f28292e6765744c697374283429 12979:O4|@4608,@5398,@12981,@12980 12980:O5|@12728,612,0,612,0 12981:S31|417474656d707420746f20707573682074776f20706172656e746865736573 12982:S37|50415253455f44454328292e70617273654465632833296765745479706556617273283229 12983:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2344|14,0,1 12984:O1|@12985 12985:D3,28|83f8317406b801000000c3b803000000c39090900000000018000000|@12986,1,@2345|6,0,0 12,0,1 12986:S16|53796d5365742e6964656e742d283129 12987:D3,60|8b45008d40f03b45087303ff5520894500c740fc03000000c700742d87b28b4c24048948048b5424088950088060ffbfc20800900000000038000000|@12991,7,@2347|26,0,@12988 12988:D3,344|3b650c7303ff552452508b4a0889ca90ff1283f80175748b4424048b48048b51288b128b59148b1b8b713c8b368b79388b3f8b45008d40e83b45087303ff5520894500c740fc0500000089701089780c8950088958048b4918890850bbe02e87b28b442404e8b6ddf2ffbb5cbe86b29090e8d290ffff909090e87ac8ffff8b4d008d49e83b4d08730aeb05e9b9000000ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24048b51048b5a0cc703030000008b4a3089ca9090ff128b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f5700200890883c408c38b0083c408c3900000000054010000|@12990,1048575,@2346|93,0,@12989 102,1,@4940 107,0,@12744 114,1,@12747 122,1,@12914 163,0,0 170,0,0 177,0,3 183,0,0 193,0,@6321 239,0,0 245,0,1 261,0,1 300,0,@5413 319,0,79994 12989:S42|20686173206e6f74206265656e206465636c6172656420696e2074797065206465636c61726174696f6e 12990:S42|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329283129 12991:S39|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329 12992:D3,44|3b650c7303ff552483f8057506b803000000c383f87f7506b803000000c38b5204ff22900000000028000000|@12910,1048575,@2348|14,0,1 25,0,1 12993:D3,396|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701583187b28941048061ffbf6a016a01535053ff74241cba8c3187b2528d5c241489c890e8920100008b4424048b48088b098b50248b1283fa53750289ca83fa097572ba24bc86b2e80a8cffff6a016a01ff7424208d442404508b5c24148b4424109090e876ffffff8b4424148b4c24048b55008d52d43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc040000005b83c404eb05e92700000089580c8950088b5c2408895804c700050000008b5c24148903895304b80100000083c410c208008b48088b098b50248b1283fa53750289ca89d08b1424ff1283f80175498b5c2404b8cc4987b290e826dfffff8b4424048b48088b098b50248b1283fa53750289ca89d08b1424ff1283f80175198b442404ba24bc86b290e81a8bffff3b650c7303ff5524ebc68b4424148b4c240889088b4c240c894804b80100000083c410c208000000000088010000|@13048,2097151,@2371|34,0,@12994 57,0,@12995 70,1,@12996 101,0,@12740 106,1,@12741 234,0,2 248,0,0 292,0,@13047 298,1,@12930 340,0,@12740 346,1,@12741 378,0,0 12994:D3,32|3b650c7303ff552483f8097506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2349|14,0,1 12995:O1|@12993 12996:D3,156|3b650c7303ff55246a016a015350ff74241cff74241cff74241c8d5c2414b8010000009090e886000000f64424040175238b4424048378040175198b0c248b0089018b442408894104b80100000083c40cc20c008b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b542404895004c7000b0000008b14248902894a04b80100000083c40cc20c00900000000098000000|@13046,2097151,@2370|31,0,0 38,1,@12997 74,0,0 124,0,5 137,0,0 12997:D3,328|3b650c7303ff55248b45008d40f43b45087303ff5520894500c740fc02000000c700a03387b28b4c24108948048060ffbf6a016a0153ff742418ff742418ff7424188d5c2410909090e8420100008b4424188b48088b098b50248b1283fa53750289ca83fa0d7572ba24bc86b2e87a89ffff6a016a01ff742424ff742424ff742424ff7424248d5c2410b8010000009090e86affffff8b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240889088b4c240c8b14248d580cc743fc050000008b711083c4048973108b7a0c897b0ceb05e9230000008b71088973088b72048973048b09890b8b0c248901895904b80100000083c40cc210008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118b1424890a8b4c2408894a04b80100000083c40cc2100090900000000044010000|@13045,2097151,@2369|34,0,@12998 74,1,@12999 105,0,@12740 110,1,@12741 139,0,0 248,0,0 285,0,0 308,0,0 12998:D3,32|3b650c7303ff552483f80d7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2350|14,0,1 12999:D3,1504|3b650c7303ff55248b4c240c8b51088b128b71248b3683fe53750289d68b51288b128b79148b3f538b593c8b1b508b41388b00538b5d008d5be83b5d087303ff5520895d00c743fc05000000528b54240489531089430c8b0424894308897b048b7918893b6a016a0183fe317575ff7424248b5c2414b8d42c87b29090e882daffff8b4d008d49c43b4d087303ff5520894d00c741fc01000040c701c83987b28d5108c742fc06000000894a148b4804894a10894a0c894a088b18895a04c702010000008d721cc746fc02000000895604c706030000008d560cc742fc02000000eb05e914000000c7420401000000893289e6891689e2894a04eb6b83fe75756b8b4424248b50048b125389d08b542424909090ff128b4c24288b51088b128b59248b1b83fb53750289d383fb7575105089c8ba24bc86b290e81e87ffffeb1a89c3b8750000009090e8a6dcffff538b5c242c9090e8dedaffff8b45008d40f03b4508730feb0ae9a9030000e94e000000ff5520894500c740fc030000008b4c24048948085a895004c700070000008b55008d52f43b55087303ff5520895500c742fc02000000c742040100000089028d44240489108d442404894804eb6883fe417568578b442428ba24bc86b2909090e88686ffff8b4424288b48148b098b50388b128b58088b1b8b70248b3683fe53750289de83fe5d75755251ba24bc86b2e85686ffff8b45008d40e83b45087303ff5520894500c740fc050000008b4c2418894810eb0ae9e6020000e9cc0100008b4c240489480c8b4c24148948085983c4048948048b0c2489088b4d008d49e03b4d087303ff5520894d00c741fc0400000089410cc7410803000000eb05e92f000000c7410401000000c701090000008d5114c742fc02000000c7420401000000890a8d4c240489118d4c2404894104eb718b4d008d49f43b4d087303ff5520894d00c741fc02000000c701903a87b28941048061ffbf6a016a016a0189e389c8909090e84e050000ff742430ff742430ff74240cff742440ff74243068444087b2ff74244c8d44240450bbe84487b2b817000000909090e80ef2ffff8b4c244ceb05e9f901000083c4248b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2410897e10895e0c8b5c240c895e088956048b142489168b51088b128b59248b1b83fb53750289d383fb5d751356ff3089c8ba24bc86b29090e8de84ffffeb1a8b18b85d0000009090e866daffff56538b5c243090e89ed8ffff8b45008d40ec3b45087303ff5520894500c740fc040000008b4c240489480cc74008030000005a895004c700090000008b55008d52f43b55087303ff5520895500c742fc02000000c742040100000089028d44240889108d44240889480483c404eb6783fe437567578b442428ba24bc86b290e84a84ffffff742414ff742424ff74242c8b5c2434b8010000009090e82a0d00008b4c24288b51148b128b59388b1b8b71088b368b79248b3f83ff53750289f783ff5f751c50535289c8ba24bc86b290e8fa83ffffeb26e9a9000000e96700000089c689d7b85f0000009090e876d9ffff5653578b5c2434e8aed7ffff8b45008d40e83b45087303ff5520894500c740fc050000008b4c241c8948108b4c240489480c8b4c24188948085983c4048948048b4c240489088d4c24085a83c404891189e1894104eb3bb831000000909090e812d9ffff538b5c24289090e84ad7ffff8b442428ba24bc86b29090e85e83ffff8d442404c700010000008d442404598948046a0183c4048b4424248b48088b098b50248b1283fa53750289ca83fa3175208b4c2414894c2424894424208b5c24048b042483c4185983c40451e9390e0000f604240175668b0c2483790401751a8b5424148b09890a8b4c2404894a04b80100000083c418c20c008b19b8310000009090e86ed8ffff538b5c24289090e8a6d6ffff8b442428ba24bc86b29090e8ba82ffff8b4424185989088b4c2404894804b80100000083c418c20c008b4c2414c701e4107bb28b542404895104b80100000083c418c20c009000000000dc050000|@13044,2097151,@2368|119,0,@12984 126,1,@12928 156,0,@13000 192,0,0 211,0,1 235,0,0 308,0,@12740 314,1,@12741 323,0,58 330,1,@12931 342,1,@12930 395,0,3 426,0,0 458,0,@12740 466,1,@12741 509,0,@12740 514,1,@12741 617,0,1 631,0,0 637,0,4 654,0,0 701,0,@13011 726,1,@13015 751,0,@13027 765,0,@13036 770,0,11 778,1,@12973 883,0,@12740 890,1,@12741 899,0,46 906,1,@12931 918,1,@12930 956,0,1 966,0,4 997,0,0 1032,0,@12740 1038,1,@12741 1059,0,0 1066,1,@13039 1112,0,@12740 1118,1,@12741 1139,0,47 1146,1,@12931 1158,1,@12930 1238,0,24 1246,1,@12931 1258,1,@12930 1267,0,@12740 1274,1,@12741 1284,0,0 1355,1,@13042 1390,0,0 1403,0,24 1410,1,@12931 1422,1,@12930 1431,0,@12740 1438,1,@12741 1457,0,0 1473,0,@6455 1485,0,0 13000:O3|@13002,@5229,@13001 13001:O3|@13004,@13009,@13003 13002:S9|756e646566696e6564 13003:O3|@13002,@5256,@13010 13004:O2|1,@13005 13005:O3|2,@13006,0 13006:O4|0,@4721,3,1 13007:O1|@13008 13008:D3,16|b8f06e7ab2c39090000000000c000000|@5295,1,@2351|1,0,@5252 13009:O4|1,@4643,0,0 13010:S9|556e646566696e6564 13011:D3,208|3b650c7303ff5524525389c3b8743b87b2e8eed0f2ffbb843b87b29090e8e2d0f2ffbb5cbe86b29090e8fe83ffff909090e8a6bbffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b51048b5a0c83c404c703030000008b4a3089ca5983c40451ff229000000000cc000000|@13014,1048575,@2352|13,0,@13012 18,1,@4940 23,0,@13013 30,1,@4940 35,0,@12744 42,1,@12747 50,1,@12914 84,0,0 91,0,0 98,0,3 104,0,0 114,0,@6321 159,0,0 165,0,1 183,0,1 13012:S7|4c6162656c2028 13013:S25|292061707065617273206d6f7265207468616e206f6e63652e 13014:S75|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d7265706f7274447570283329 13015:D3,152|8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000c702a83c87b2894a048062ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706a83d87b2894e048946088066ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c700383f87b28948048060ffbf8913897304894308b801000000c30000000094000000|@13026,31,@2358|26,0,0 42,0,@13016 79,0,@13020 119,0,@13024 139,0,0 13016:D3,32|3b650c7303ff55248b52048b1289c389d0e91e0000009090000000001c000000|@13019,1048575,@2354|18,1,@13017 13017:D3,88|3b650c7303ff5524a801753d8b08ff7104ff31538b480489c8e8e2ffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489085a83c408ff22b801000000c3900000000054000000|@13018,1048575,@2353|74,0,0 13018:S43|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c792831296170706c283129 13019:S36|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c79283129 13020:D3,44|3b650c7303ff55248b4a048b1c24890c24ff720889de8b58048b3889f856e91d000000900000000028000000|@13023,1048575,@2356|31,1,@13021 13021:D3,228|3b650c7303ff55248b4c24088b09f6c10175678b113b027448f60201753ca8017538a8017407be03000000eb068b308d74360183c60889f78b325789c7ff71048b4c2404d1e93bc9f3a68d7c3f018d7436018d4c0901740eeb2c6a01ff7104eb256a01ff71048b4c240c895c241089de8b5a0489ca83c408eb05e9180000005f83c40457ff225983c4043b650c7303ff5524e977ffffff8b4d008d49e83b4d087303ff5520894d00c741fc0200000089590489018b5424088b128d710cc746fc02000000895604890e8b4c2408893189c2b801000000c2080090909000000000e0000000|@13022,1048575,@2355|39,0,1 210,0,0 13022:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283229 13023:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283129 13024:D3,164|8b52048b12f6c20175668b0a3b017441f601017537a8017533a8017407bb03000000eb068b188d5c1b0183c3088b3189c7ff710489d9d1e93bc9f3a68d7c3f018d7436018d4c0901740aeb32ff7104eb2dff710489c18b45008d40f83b45087303ff5520894500c740fc01000000eb05e91c0000008b1424891083c404c38b520483c4043b650c7303ff5524e974ffffff89c1b801000000c390909000000000a0000000|@13025,63,@2357|30,0,1 148,0,0 13025:S37|5554494c49544945535f28292e6e6f4475706c6963617465732831296c6f6f6b7570283129 13026:S28|5554494c49544945535f28292e6e6f4475706c696361746573283129 13027:D3,60|3b650c7303ff552453ff7208ff720cff7210ff72148b5a0490e8320000008b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13035,2097151,@2363|26,1,@13028 44,0,0 13028:D3,280|3b650c7303ff55245368c04187b2538b5c241c8d4424049090e84201000050ff70048b5424209090ff128b4424248b48088b098b50248b1283fa53750289ca83fa13750cba24bc86b2e84e7bffffeb16b813000000e8dad0ffff8b5c2424909090e812cfffff8b45008d40f43b45087303ff5520894500c740fc02000000c700404487b28b4c24088948048060ffbf6a016a01ff7424208d4c2404518b5c24348b54242cff128b4424088b4c24048b55008d52cc3b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc030000008950085b83c4088958045b83c40c891889c38d4010c740fc020000008950048918c210000000000014010000|@13034,2097151,@2362|10,0,@13029 26,1,@13030 69,0,@12740 74,1,@12741 81,0,9 86,1,@12931 98,1,@12930 128,0,@13033 13029:D3,32|3b650c7303ff552483f8137506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2359|14,0,1 13030:D3,504|3b650c7303ff55248b4b088b098b53248b1283fa53750289ca83fa3d75678b43048b008b4b288b098b53148b128b733c8b368b7b388b3f508b45008d40e83b45087303ff5520894500c740fc0500000089701089780c8948088950048b4b1889088b3424f7c6010000007407ba03000000eb068b168d541201f6c201740c83fa017e0deb18e953010000f642ff10740d89c2b8a8f179b28b5d0490ff13f7c601000000750a0fb656048d541201eb0289f250535289d8ba24bc86b29090e87a79ffff813c24fd0000007406833c246175738b4424048b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f57bb5cbe86b2b8004487b2e8a67bffff909090e84eb3ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000eb05e971000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24048b510cc702030000008b5130909090ff128b45008d40f43b45087303ff5520894500c740fc0200000083c40859894804598908c38b0c24891c2489c3b8980e87b251e9f4caffff00000000f4010000|@13032,2097151,@2360|109,0,1 147,0,@4898 183,0,@12740 190,1,@12741 197,0,126 276,0,@12744 281,0,@13031 286,1,@12747 294,1,@12914 335,0,0 342,0,0 349,0,3 355,0,0 365,0,@6321 411,0,0 417,0,1 430,0,1 486,0,@12926 492,1,@12928 13031:S25|4c6162656c73206d75737420626520312c322c332c2e2e2e2e 13032:S20|534b4950535f28292e6765744c6162656c283229 13033:D3,40|3b650c7303ff552483f85d740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2361|19,0,1 13034:S68|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d6c2d283129 13035:S21|534b4950535f28292e6765744c6973742834292d45 13036:O1|@13037 13037:D3,16|b801000000c39090000000000c000000|@13038,1,@2364|1,0,0 13038:S16|53796d5365742e656d7074792d283129 13039:D3,392|3b650c7303ff55248b43088b008b4b248b0983f953750289c183f941740f83f943740a83f931740583f97575438b45008d40f43b45087303ff5520894500c740fc02000000c700c84687b28b4c240c8948048060ffbf6a016a0153ff7424108d542408528b54241cff128b442404eb2bb875000000e822ccffff6a016a01539090e85acaffff8b0424ba24bc86b2909090e86e76ffffb8e4107bb28b0c248b51088b128b59248b1b83fb53750289d383fb1775105089c8ba24bc86b290e84276ffffeb4e8b51088b128b59248b1b83fb53750289d383fb41740f83fb43740a83fb31740583fb75756d89c3b81700000090e8a6cbffff538b5c24049090e8dec9ffff8b442404ba24bc86b29090e8f275ffffff74241cff74241cff74241c8b5c2410b8010000009090e8d2feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c410c20c0089c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000890883c40cc20c00900000000084010000|@13041,2097151,@2366|71,0,@13040 113,0,58 118,1,@12931 130,1,@12930 138,0,@12740 146,1,@12741 151,0,@6455 184,0,@12740 190,1,@12741 236,0,11 242,1,@12931 254,1,@12930 263,0,@12740 270,1,@12741 291,0,0 371,0,0 13040:D3,40|3b650c7303ff552483f85f740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2365|19,0,1 13041:S77|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d70726f636573734c697374283129 13042:D3,364|3b650c7303ff55248b4c24048b51048b128b71288b368b79148b3f538b593c8b1b528b51388b12508b45008d40d03b45087303ff5520894500c740fc0500000089581089500c8970088978048b491889088b4c24088d5818c743fc050000008b711089731089530c8b5108895308897b048b39893b8b7d008d7fdc3b7d087303ff5520897d00c747fc01000040c707c83987b28d5708c742fc06000000897a14895a1089420c8b4424088942088b4424048942045883c40889028b45008d40f43b45087303ff5520894500c740fc02000000895004c7000300000053508b44240cba24bc86b2909090e8e673ffff8b44240c8b48088b098b50248b1283fa53750289ca83fa31753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b142489118b542410895424108944240c8b5c240489c883c408e9bafeffff8b4c24108b142489118b542404895104b80100000083c408c208009090900000000068010000|@13043,2097151,@2367|143,0,@13000 215,0,1 226,0,@12740 234,1,@12741 291,0,0 343,0,0 13043:S64|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129636f6e7374727563746f7273283229 13044:S49|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129 13045:S50|50415253455f5459504528292e7061727365547970652833297475706c655479706528312967657450726f64756374283129 13046:S37|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129 13047:S11|456e64206f662074797065 13048:S25|50415253455f5459504528292e706172736554797065283329 13049:S56|50415253455f44454328292e706172736544656328332970617273655369676e617475726528332967657457686572655479706573283229 13050:S40|50415253455f44454328292e706172736544656328332970617273655369676e6174757265283329 13051:D3,116|3b650c7303ff55246a016a016a016a01ff70085052538d5c2410b8010000009090e8620000008b4424288b4c24048b542424894424288b4904894c24248b4c2420895424208b5c24088b74241c895c241c8b5c240c895c2418897424145b83c410b80100000051e9440200000000000070000000|@13118,2097151,@2419|27,0,0 34,1,@13052 98,0,0 104,1,@13056 13052:D3,108|3b650c7303ff55246a016a016a0189df89e3b8010000009090e8e6a0ffff8b45008d40f03b45087303ff5520894500c740fc03000000c7007c4b87b28b4c24048948048b5424088950088060ffbf5b891f894f0489570889470cb80100000083c408c3900000000068000000|@13055,63,@2375|19,0,0 26,1,@12896 56,0,@13053 91,0,0 13053:D3,304|3b650c7303ff552450528b4a0889ca90ff1283f80175618b4c2404f6c1017407b803000000eb068b018d440001a801740783f8037e5beb06f640ff107558f6c1017407b803000000eb068b018d440001a801740783f8037e08eb12f640ff10740cb8a8f179b28b5d049090ff13f6c10175110fb64105eb05e9a20000008d440001eb0289c883f84f7411b801000000eb16e90c000000e907000000b803000000eb05b8010000008b55008d52f83b55087303ff5520895500c742fc01000040c702ec7d7ab283f8017507b801000000eb05b80900000081c8f170020083c80589c38b45008d40e83b45087303ff5520894500c740fc0200000089580489108b142489c38d400cc740fc020000008958048908538b52049090ff125883c408c38b0083c408c3909090000000002c010000|@13054,1048575,@2374|33,0,1 68,0,1 98,0,@4898 139,0,0 156,0,1 163,0,0 193,0,@5413 203,0,0 210,0,4 13054:S43|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129283129 13055:S40|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129 13056:D3,4752|3b650c7303ff55248b43088b008b4b248b0983f953750289c189c8ba4a4d87b28d5482fcffe2e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9ae010000909090e993010000909090e9a5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e964010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9c3000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f9197407b801000000eb3db803000000eb36b803000000eb2fb803000000eb28b803000000eb21b803000000eb1ab803000000eb13b803000000eb0cb803000000eb05b80300000083f80175115389c88b54241c90ff1283f8017405eb4453eb468b1c24b8c85f87b290e832c0ffff8b04248b48088b098b50248b1283fa53750289ca5289d08b542420909090ff1283f80175188b0424b91e5087b28d4c81fcffe1e9b2020000e9ad020000e99e0200009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9af010000909090e993010000909090e9a6010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e965010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9c4000000909090e9c3000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a2000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e981000000909090e93b000000909090e978000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e903000000909090833c24197407b801000000eb3db803000000eb36b803000000eb2fb803000000eb28b803000000eb21b803000000eb1ab803000000eb13b803000000eb0cb803000000eb05b80300000083f801752d8b04248b542420ff1283f801751f8b442404ba24bc86b290e88669ffff83c4043b650c7303ff5524e920fdffffb80100000083c404eb05b8010000008b04248b48088b098b50248b1283fa53750289ca8b48288b098b583c8b1bbef25287b28d7496fcffe6e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9c2010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9ba020000909090e993010000909090e9b2030000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e9aa030000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9ae040000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e921060000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e97f060000909090e93b000000909090e97a070000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e903000000909090b901000000eb768b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fdc3b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f8d5718c742fc02000000c702dc5f87b28b5c241c895a048062ffbf8b7424108b45008d40f43b45087303ff5520894500c740fc02000000eb05e90b070000c700886287b28b0c248948048060ffbf8b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b46048941048b1e89196a016a016a03578d7c240857ff74242889cb89d0e81a0e00008b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948085983c404894804c700010000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008901eb6e8b55008d52f43b55087303ff5520895500c742fc02000000c7029c7987b28b74241c8972048062ffbf5351ff701852ba24bc86b2e8c665ffff6a016a01ff74242cff74242c68487c87b28d44240c50ff74243c8d5c24088b44241c90e8121d00008b45008d40f03b4508730aeb05e9fb050000ff5520894500c740fc030000008b4c241083c40c8948085a895004c700350000008b55008d52e83b55087303ff5520895500c742fc050000008b5c241083c408895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b7d008d7fe43b7d087303ff5520897d00c747fc03000000895708894704c707010000008d4710c740fc02000000c74004010000008938eb66ba24bc86b2909090e8ea64ffffff74240cff742404ff74242468987c87b2ff7424108d44240450bbe84487b2b805000000909090e87ed1ffff8b0083c410eb5e5351ff7018ba24bc86b29090e8a664ffff8b44240c8b48088b098b50248b1283fa537509eb05e9f904000089ca83fa65745883fa0d745883fa31745889c3b89c1d87b290e84ab8ffff8b44240c8b48088b098b50248b1283fa537509eb05e9c104000089ca5289d08b54242c909090ff1283f8017540833c2465743a833c240d7434833c2431742eeb0fe931000000e92c000000e9270000008b442410ba24bc86b29090e80e64ffff83c4043b650c7303ff5524eb93b80100000083c404eb05b8010000008b45008d40f43b45087303ff5520894500c740fc02000000c700e08187b28b4c24288948048060ffbf6a016a01508d44240450ff7424308b5c24208b4424308b542438909090ff126a016a01ff74241cff74243c8d5c24088b442414909090e8fa2b00008b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240489088b0c248d500cc742fc050000008b5c241483c40c895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b7d008d7fe43b7d087303ff5520897d00c747fc03000000895708894704c707050000008d4710c740fc02000000c74004010000008938eb728b48288b098b503c8b125251ff7018ba24bc86b2e8ea62ffff8b44240c8b48088b098b50248b1283fa53750289ca83fa777511ba24bc86b2e8c662ffffb803000000eb05b801000000ff74242868f48587b250ff7424188d5c2408b8980e87b2e846b5ffff8b4d008d49f43b4d08730aeb05e9f9020000ff5520894d00c741fc020000008b50048951048b1889198b7424188b7e088b3f8b5e248b1b83fb53750289fb83fb237513518b44241cba24bc86b29090e84a62ffffeb1a89cbb8230000009090e8d2b7ffff538b5c241c9090e80ab6ffffff74241cff74243c68308687b2ff7424288d44240450bbd42c87b2b823000000909090e8c6ceffff8b480483c40c8b55008d52e83b55087303ff5520895500c742fc050000008b5c2418895a108b590c895a0c8b7424148972088b71048972048b7c2410893a8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b308977045889078b45008d40e03b45087303ff5520894500c740fc0400000089780c5e83c414897008895004c700070000008d5014c742fc02000000c74204010000008902eb76ba24bc86b2e85e61ffffff742410ff742418ff742420ff742428ff74241068e08687b2ff7424188d44240450bbe84487b2b805000000909090e8eacdffff8b4d008d49e43b4d087303ff5520894d00c741fc030000008b500483c4188951088b18895904c701090000008d7110c746fc02000000eb05e958010000c7460401000000890eeb718b55008d52f43b55087303ff5520895500c742fc02000000c702b08b87b28b74241c8972048062ffbf5351ff701852ba24bc86b2909090e8a660ffff6a016a01ff74242cff74242c685c8e87b28d44240c50ff74243c8d5c24088b44241c90e8f21700008b45008d40f03b4508730aeb05e9d5000000ff5520894500c740fc030000008b4c241083c40c8948085a895004c700350000008b55008d52e83b55087303ff5520895500c742fc050000008b5c241083c408895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b7d008d7fe43b7d087303ff5520897d00c747fc03000000895708894704c707010000008d4710c740fc02000000c74004010000008938eb3eba24bc86b2909090e8ca5fffffff742408ff742404ff74242468ac8e87b2ff7424108d44240450bbe84487b2b805000000909090e85eccffff8b0083c41089c689f289d089c18b04248b50088b128b58248b1b83fb53750289d383fb61751051ba24bc86b2909090e86a5fffffeb06b801000000518b4424048b48088b098b50248b1283fa53750289ca89d1bbf25c87b28d5c8bfcffe39090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9ae010000909090e993010000909090e9a5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e964010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9c3000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fa197407b901000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017444ff742420ff742420ff742420ff742420ff742420ff74242089c3b8010000009090e89eedffff83f80175075883c404c2180089c38b042483c4085983c41851e9dc3300005883c404c2180090000000008c120000|@13117,2097151,@2418|28,0,$13056+38 588,0,0 595,0,1 602,0,1 609,0,1 616,0,1 623,0,1 630,0,1 637,0,1 644,0,1 651,0,1 684,0,@13057 690,1,@12930 735,0,$13056+762 1313,0,0 1320,0,1 1327,0,1 1334,0,1 1341,0,1 1348,0,1 1355,0,1 1362,0,1 1369,0,1 1376,0,1 1404,0,@12740 1410,1,@12741 1431,0,0 1441,0,0 1476,0,$13056+1486 2031,0,0 2110,0,@13058 2162,0,@13059 2234,1,@13061 2278,0,0 2309,0,0 2343,0,@13090 2365,0,@12740 2370,1,@12741 2387,0,@13091 2410,1,@13080 2461,0,26 2556,0,0 2573,0,0 2582,0,@12740 2590,1,@12741 2607,0,@13092 2621,0,@13036 2626,0,2 2634,1,@12973 2651,0,@12740 2658,1,@12741 2708,0,@12957 2714,1,@12930 2803,0,@12740 2810,1,@12741 2828,0,0 2838,0,0 2868,0,@13099 2938,1,@13100 3056,0,2 3073,0,0 3097,0,@12740 3102,1,@12741 3133,0,@12740 3138,1,@12741 3143,0,1 3150,0,0 3159,0,@13102 3173,0,@12926 3178,1,@12928 3255,0,@12740 3262,1,@12741 3271,0,17 3278,1,@12931 3290,1,@12930 3303,0,@13103 3317,0,@12984 3322,0,17 3330,1,@12973 3467,0,3 3484,0,0 3493,0,@12740 3498,1,@12741 3523,0,@13105 3537,0,@13036 3542,0,2 3550,1,@12973 3594,0,4 3618,0,0 3652,0,@13109 3674,0,@12740 3682,1,@12741 3699,0,@13110 3722,1,@13080 3773,0,26 3868,0,0 3885,0,0 3894,0,@12740 3902,1,@12741 3919,0,@13111 3933,0,@13036 3938,0,2 3946,1,@12973 3990,0,@12740 3998,1,@12741 4005,0,0 4034,0,$13056+4046 4596,0,0 4603,0,1 4610,0,1 4617,0,1 4624,0,1 4631,0,1 4638,0,1 4645,0,1 4652,0,1 4659,0,1 4695,0,0 4732,1,@13116 13057:S9|5369676e6174757265 13058:D3,664|3b650c7303ff552489c1bbf25f87b28d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9b6010000909090e9b5010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96b010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff22900000000094020000|@12910,1048575,@2376|11,0,$13058+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 645,0,1 13059:D3,268|3b650c7303ff55248b4a048b59288b1b8b71148b368b793c8b3f528b51388b12508b45008d40e83b45087303ff5520894500c740fc0500000089781089500c8958088970048b4918890850bbe02e87b28b44240490e8b2a8f2ffbb5cbe86b29090e8ce5bffff909090e87693ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c894808c7400401000000c700030000008b0c248b51048b5a0c83c404c703030000008b4a3089ca90ff12b8e4107bb2c30000000008010000|@13060,1048575,@2377|76,0,@12989 86,1,@4940 91,0,@12744 98,1,@12747 106,1,@12914 140,0,0 147,0,0 154,0,3 160,0,0 170,0,@6321 218,0,0 224,0,1 242,0,1 255,0,@6455 13060:S75|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d6e6577656e762d283129 13061:D3,1244|8d7c24ac3b7d0c7303ff552850538b44240cba24bc86b29090e81658ffff6a016a016a0189e3b8010000009090e8d287ffff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c408890850ff74241089c3b803000000909090e88abdffffff74240868ec6887b250ff74241c8d5c2408b8d42c87b2e84eaaffff50ff70048b5c24248b0889c8909090e876b2ffff8b04248b4c24208b51088b128b59248b1b83fb53750289d383fb237515ff30ff700489c8ba24bc86b29090e86257ffffeb1e8b188b7004b823000000909090e8e6acffff53568b5c242890e81eabffff8b4424288b48088b098b50248b1283fa53750289ca83fa19756b837c240c0174698b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f57bb5cbe86b2b8206987b29090e85e59ffff909090e80691ffff8b4d008d49e83b4d08730feb0ae950010000e97f000000ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24288b510cc702030000008b5130909090ff12eb05b8010000008b442428ba24bc86b2909090e81e56ffffff7424288b5c2424b8d42c87b29090e8b2a8ffff8b4c24308b50048b5d008d5be83b5d087303ff5520895d00c743fc050000008b71108973108b7a0c897b0c8b71088973088b72048973048b09890b8b4d008d49e83b4d087303ff5520894d00c741fc050000008959108b3089710c8b7424048971088b40048941048b042489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000d0000008b4c242c8901895904b80100000083c424c210008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7015c6987b28b5424208951048061ffbf6a016a01ff742414ff742424ff742410ff7424488d5c241053508b5c242489c8e88a0200008b4424308b48088b098b50248b1283fa53750289ca6a016a0183fa057554ba24bc86b2e8f254ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700347187b28b4c24308948048060ffbfff742438ff742448686c7187b28d54240c52ff7424488d5c2408e81e0c0000eb1789e1c7010100000089e18b54240c8951046a016a016a018b44244483c40c8b48088b098b50248b1283fa53750289ca6a016a0181fa850000007531ba24bc86b290e86254ffffff742440ff74243868c07587b28d44240c50ff7424508d5c24088b44244c90e8b20b0000eb1789e1c7010100000089e18b54240c8951046a016a016a018b44245483c40c8b4c24048b55008d52dc3b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc020000008b5c24088958048b5c241089188b5d008d5bd03b5d087303ff5520895d00c743fc01000040c703010000008d7b08c747fc06000000895f145b83c414895f10c7470c01000000894708895704c707010000008d471cc740fc02000000897804c700010000008b5c242c8903895304b80100000083c424c2100090909000000000d8040000|@13089,2097151,@2395|19,0,@12740 26,1,@12741 39,0,0 46,1,@12896 102,0,1 110,1,@12962 119,0,@13062 133,0,@12984 138,1,@12928 158,1,@12947 199,0,@12740 206,1,@12741 218,0,17 226,1,@12931 238,1,@12930 338,0,@12744 343,0,@13063 350,1,@12747 358,1,@12914 404,0,0 411,0,0 418,0,3 424,0,0 434,0,@6321 479,0,0 485,0,1 498,0,1 513,0,0 522,0,@12740 530,1,@12741 543,0,@12984 550,1,@12928 692,0,6 706,0,0 742,0,@13064 790,1,@13065 825,0,@12740 830,1,@12741 860,0,@13074 884,0,@13075 902,1,@13080 912,0,0 961,0,66 968,0,@12740 974,1,@12741 987,0,@13085 1010,1,@13080 1020,0,0 1151,0,0 1178,0,0 1190,0,0 1209,0,0 1223,0,0 13062:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2378|14,0,1 13063:S52|4461746174797065207265706c69636174696f6e206d757374206e6f7420636f6e7461696e2074797065207661726961626c6573 13064:D3,48|3b650c7303ff552483f8057506b803000000c381f8850000007506b803000000c38b5204ff229090000000002c000000|@12910,1048575,@2379|14,0,1 21,0,66 28,0,1 13065:D3,448|3b650c7303ff55248b4c24048b51088b128b71248b3683fe53750289d683fe4d745383fe0d745383fe31745383fe41745383fe43745383fe31745383fe757453535089cbb8fc367bb2e81ea6ffff8b44240c8b48088b098b50248b1283fa53750289ca5289d08b5424049090ff1283f8017551eb23e97a000000e975000000e970000000e96b000000e966000000e961000000e95c000000833c244d744c833c240d7446833c24317440833c2441743a833c24437434833c2431742e833c24757428eb05e9210000008b442410ba24bc86b2909090e8b651ffff83c4043b650c7303ff5524e964ffffffb80100000083c404eb0989c2b80100000053528b44241cff7008ff7424108b58048b0889c89090e86ec2ffff6a016a01ff742414ff742420508d5c240c8b4424149090e8a20000008b4424208b4c24048b55008d52c43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700f87087b28d5808c743fc060000008b7c2428897b148b4c2420894b1089530c5e83c4088973088943045889038b4424088918895004b801000000c218009000000000bc010000|@13073,2097151,@2384|69,0,@6538 74,1,@12930 206,0,@12740 214,1,@12741 235,0,0 247,0,0 274,1,@12987 302,1,@13066 378,0,@13072 432,0,0 13066:D3,892|3b650c7303ff55248b4c240c8b51088b128b71248b3683fe53750289d683fe4d756d837c240801746b8b51288b128b71148b368b793c8b3f538b59388b1b508b45008d40e83b45087303ff5520894500c740fc0500000089781089580c8950088970048b4918890850bb5cbe86b2b8046f87b29090e8ce52ffff909090e8560300008b4d008d49e83b4d08730feb0ae98c000000e973000000ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700010000008b4c24148b5130ff12eb0253508b442414ba24bc86b29090e89e4fffffeb0989c2b8010000005352ff342468507087b2ff74241c8d5c2404b8980e87b2909090e81ea2ffff50ff70048b5c24248b0889c8909090e846aaffff8b04248b4c242083c40c8b51088b128b59248b1b83fb53750289d36a016a0183fb4b7571ff7004ff3089c8ba24bc86b2909090e82a4fffff8b45008d40f43b45087303ff5520894500c740fc02000000c7008c7087b28b4c24108948048060ffbf6a016a01ff7424248d542404528b5c243490e872c2ffff8b45008d40f83b45087303ff5520894500c740fc01000000598908eb05e95f0000008b4d008d49d83b4d087303ff5520894d00c741fc030000008b5424048951088941048b44240889018b14248d5910c743fc050000008b701083c40c8973108b7a0c897b0c8b70088973088b72048973048b00890389e0890889e0895804eb328b55008d52f03b55087303ff5520895500c742fc030000008b18895a08c74204010000008b7004893289e7891789e28972048b44241c8b48088b098b50248b1283fa53750289ca83fa7d7572ba24bc86b290e8124effff6a016a01ff742424ff742424ff7424248d5c240c8b44241c909090e836fdffff8b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240489088b4c24088b14248d580cc743fc050000008b711083c4048973108b7a0c897b0c8b7108eb05e9210000008973088b72048973048b09890b8b4c240c8901895904b80100000083c410c20c008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b142489118b54240c890a8b4c2404894a04b80100000083c410c20c00900000000078030000|@13071,2097151,@2383|106,0,@12744 111,0,@13067 118,1,@12747 126,1,@13068 172,0,0 179,0,0 186,0,3 192,0,0 202,0,@6321 247,0,0 253,0,0 275,0,@12740 282,1,@12741 291,0,0 301,0,@13069 314,0,@12926 322,1,@12928 342,1,@12947 390,0,@12740 398,1,@12741 428,0,@13070 462,1,@12993 627,0,0 672,0,@12740 678,1,@12741 813,0,0 850,0,0 873,0,0 13067:S62|60606f702727206d6179206e6f7420617070656172206265666f7265206120636f6e7374727563746f7220696e20612073706563696669636174696f6e2e 13068:D3,240|3b650c7303ff5524a801755b83780401755a8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3e9740000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000f6c101740d8b5004b8ecd57ab28b5d04ff13518b500489d09090e852ffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804598908c3b874c286b2c3909000000000ec000000|@12753,7,@2380|49,0,3 59,0,@6321 96,0,0 139,0,3 152,0,@6321 203,0,@5592 225,0,@12752 13069:D3,40|3b650c7303ff552483f87d740583f84b7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2381|19,0,1 13070:D3,32|3b650c7303ff552483f87d7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2382|14,0,1 13071:S48|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629636f6e73747273283129 13072:O2|@13000,0 13073:S38|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629 13074:D3,36|3b650c7303ff552481f8850000007506b803000000c38b5204ff22900000000020000000|@12910,1048575,@2385|10,0,66 17,0,1 13075:D3,52|3b650c7303ff552453ff72088b5a049090e8320000008b0c248b1089118b5804895904b80100000083c404c30000000030000000|@13079,2097151,@2388|18,1,@13076 36,0,0 13076:D3,324|8d7c24ac3b7d0c7303ff55286a016a016a0189df508d5c2404b801000000909090e8267affff8b45008d40f03b45087303ff5520894500c740fc030000008b4c240c8948088b4c24088948048b4c240489085750ff74241c89c3b8030000009090e8deafffffff742408680c7387b250ff7424288d5c2408b8d42c87b2e8a29cffff50ff70048b5c24308b0889c8909090e8caa4ffff8b04248b4c242c8b51088b128b59248b1b83fb53750289d383fb237515ff7004ff3089c8ba24bc86b29090e8b649ffffeb1e8b58048b30b823000000909090e83a9fffff53568b5c243490e8729dffff6a016a01ff742414ff742424ff742414ff7424308d44241050ff7424508b5c24208b4424409090e8daf6ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4348908c2040090900000000040010000|@13078,2097151,@2387|26,0,0 34,1,@12896 91,0,1 98,1,@12962 107,0,@13077 121,0,@12984 126,1,@12928 146,1,@12947 187,0,@12740 194,1,@12741 206,0,17 214,1,@12931 226,1,@12930 270,1,@13065 13077:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2386|14,0,1 13078:S41|50415253455f44454328292e7061727365446563283329646174617479706542696e64696e67283229 13079:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292d45 13080:D3,44|3b650c7303ff55248b4c24088b542404895c24088954240489c389c8e91f0000009090900000000028000000|@13084,2097151,@2391|29,1,@13081 13081:D3,308|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c7012c7587b28959048061ffbf6a016a0150538d5c240889c88b542418909090ff128b4424148b48088b098b50248b1283fa53750289ca83fa057570ba24bc86b2e8e647ffff6a016a01ff742420ff7424208b5c24108d442408909090e87effffff8b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240c89088b4c24108b14248d580cc743fc050000008b711083c4048973108b7a0c897b0c8b7108897308eb05e91e0000008b72048973048b09890b8b4c24048901895904b80100000083c410c208008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240889118b542404890a8b4c240c894a04b80100000083c410c208000000000030010000|@13083,2097151,@2390|34,0,@13082 93,0,@12740 98,1,@12741 229,0,0 266,0,0 290,0,0 13082:D3,32|3b650c7303ff552483f8057506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2389|14,0,1 13083:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292829 13084:S37|50415253455f44454328292e7061727365446563283329616e6442696e64696e6773283229 13085:D3,60|3b650c7303ff5524536a01ff7204ff7208bb01000000909090e8320000008b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13079,2097151,@2394|18,0,0 26,1,@13086 44,0,0 13086:D3,736|3b650c7303ff55246a016a016a0189c7538d5c2404b801000000909090e8ce75ffff8b45008d40f03b45087303ff5520894500c740fc030000008b4c240c8948088b5424088950048b5c2404891857ff74241889c3b801000000909090e886abffffff342468047987b250ff7424248d5c2408b8d42c87b290e84a98ffff50ff70048b5c242c8b0889c8909090e872a0ffff8b04248b70048b38ff742420ff74242c8b5c24248b442420909090e862b6ffff6a016a01837c241c01741a8b4c24308b51088b128b59248b1b83fb53750289d383fb237507837c243801740f89e0c7000100000089e0897004eb668b4c24308b51088b128b59248b1b83fb53750289d383fb23751156575089c8ba24bc86b2e80a45ffffeb1a89c3b8230000009090e8929affff5657538b5c243ce8ca98ffff8b44243c8b48088b098b50248b1283fa53750289ca83fa41745583fa437455eb05e9e000000083fa31745a83fa75745a89c3b8fc367bb2e88e98ffff8b44243c8b48088b098b50248b1283fa53750289ca5289d08b5424289090ff1283f801754c833c24417446833c24437440eb0ae943000000e93e000000833c2431742e833c2475eb0ae92d000000e928000000741c8b442440ba24bc86b290e84e44ffff83c4043b650c7303ff5524eb8fb80100000083c404eb05b8010000006a016a01ff7424088d442404508b5c244c8b4424349090e89eb7ffff8b45008d40f83b45087303ff5520894500c740fc010000005989088d4c241089018d4424105983c404894804eb0256578b4424048b4c240c8b55008d52c03b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700f87087b28d5808c743fc070000008b7c2414897b188b7c2440897b148b4c2404894b1089530c8b4c2408894b088943045883c43089038b45008d40f43b45087303ff5520894500c740fc020000008950048918c20c0000000000dc020000|@13088,2097151,@2393|22,0,0 30,1,@12896 86,0,0 94,1,@12962 102,0,@13087 116,0,@12984 122,1,@12928 142,1,@12947 174,1,@12987 226,0,0 269,0,@12740 274,1,@12741 283,0,17 290,1,@12931 302,1,@12930 357,0,@6538 362,1,@12930 456,0,@12740 462,1,@12741 480,0,0 490,0,0 518,1,@12993 642,0,@13072 13087:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2392|14,0,1 13088:S37|50415253455f44454328292e70617273654465632833297479706542696e64696e67283429 13089:S43|50415253455f44454328292e706172736544656328332964617461747970654465634f725265706c283429 13090:D3,664|3b650c7303ff552489c1bbb27987b28d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9b6010000909090e9b5010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96b010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff22900000000094020000|@12910,1048575,@2396|11,0,$13090+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 645,0,1 13091:D3,60|3b650c7303ff5524536a03ff7204ff7208bb03000000909090e8aaf9ffff8b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13079,2097151,@2397|18,0,1 26,1,@13086 44,0,0 13092:D3,56|3b650c7303ff552453ff7208ff720c8b5a04909090e8320000008b0c248b1089118b5804895904b80100000083c404c30000000034000000|@13035,2097151,@2402|22,1,@13093 40,0,0 13093:D3,356|3b650c7303ff552453685c7e87b253ff7424148d5c2408b8907e87b290e8d291ffff50ff70048b5c241c8b0889c8909090e8fa99ffff8b04248b4c24188b51088b128b59248b1b83fb53750289d36a016a0183fb4b7570ff700489c8ba24bc86b2e8e63effff8b45008d40f43b45087303ff5520894500c740fc02000000c700dc7e87b28b4c24108948048060ffbf6a016a01ff7424288d4c2404518b5c243490e82eb2ffff8b45008d40e03b45087303ff5520894500c740fc010000005989088b4c2404eb05e9370000008b14248d5808c743fc050000008b711083c4088973108b7a0c897b0c8b71088973088b72048973048b09890b89e1890189e0895804eb1089e2c7020100000089e28b5804895a048b45008d40e03b45087303ff5520894500c740fc040000005989480c8b4c24048948088b0c24894804c7000300000089c28d4014c740fc02000000894804891083c414c208009090900000000060010000|@13098,2097151,@2401|10,0,@13094 24,0,@13095 30,1,@12928 50,1,@12947 93,0,@12740 98,1,@12741 128,0,@13097 162,1,@12993 263,0,0 318,0,1 13094:D3,32|3b650c7303ff552483f84b7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2398|14,0,1 13095:O1|@13096 13096:D3,48|83f8237506b803000000c383f80d7506b803000000c383f8317406b801000000c3b803000000c390000000002c000000|@12910,1,@2399|6,0,1 17,0,1 28,0,0 34,0,1 13097:D3,672|3b650c7303ff552489c1bbf27e87b28d5c8bfcffe390e91b020000909090e913020000909090e91e020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bd010000909090e9bc010000909090e993010000909090e9b3010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e972010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c9000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a8000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e987000000909090e93b000000909090e97e000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb44b903000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff229090000000009c020000|@12910,1048575,@2400|11,0,$13097+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 642,0,1 652,0,1 13098:S72|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f4578283129 13099:D3,680|3b650c7303ff552483f80d740583f8317506b803000000c389c1bb068287b28d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9b6010000909090e9b5010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96b010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff229000000000a4020000|@12910,1048575,@2403|19,0,1 27,0,$13099+38 588,0,0 595,0,1 602,0,1 609,0,1 616,0,1 623,0,1 630,0,1 637,0,1 644,0,1 651,0,1 661,0,1 13100:D3,240|3b650c7303ff55248b4c24088b51088b128b71248b3683fe53750289d683fe31757253518b5c240cb8980e87b2e80a8affff50ff70048b5c24148b0889c8909090e83292ffff8b04246a016a01ff742418ff7424188d5c24088b480489c8909090e89affffff8b4424088b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000eb05e93c000000894a0c8b4804894a088b18895a04c702030000008d7214c746fc020000005f897e0489168b54240889325e83c404897204b80100000083c404c20800c70301000000894304b801000000c20800909000000000ec000000|@13101,2097151,@2404|41,0,@12926 46,1,@12928 66,1,@12947 132,0,0 169,0,1 203,0,0 215,0,0 223,0,0 13101:S74|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d736967696473283129 13102:D3,40|3b650c7303ff552483f823740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2405|19,0,1 13103:D3,96|3b650c7303ff5524ff720468a48687b253ff72088d5c2408b8980e87b2e88688ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b50048951048b1889198b3424890e895604b80100000083c40cc3909090000000005c000000|@13035,2097151,@2407|12,0,@13104 25,0,@12926 30,1,@12928 77,0,0 13104:D3,40|3b650c7303ff552483f823740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2406|19,0,1 13105:D3,60|3b650c7303ff552453ff7208ff720cff7210ff72148b5a0490e8320000008b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13035,2097151,@2410|26,1,@13106 44,0,0 13106:D3,352|3b650c7303ff55245353bbe84487b2b8907e87b290e88e87ffff50ff70048b5c24088b0889c8909090e8b68fffff8b04248b4c24048b51088b128b59248b1b83fb53750289d383fb137511ff700489c8ba24bc86b2e8a634ffffeb1a8b5804b81300000090e82e8affff538b5c24089090e86688ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700a48887b28b4c241c8948048060ffbf6a016a01508d44240450ff7424248b5c241c8b4424248b54242c909090ff128b4424088b4c24048b55008d52c43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc030000008b5c2404895808c74004010000005b83c40889188b1c248d7810c747fc0400000089470c8b430483c4088947088b0b894f0489178b45008d40f43b45087303ff5520894500c740fc020000008950048938c21000000000005c010000|@13108,2097151,@2409|11,0,@13036 16,0,@13095 22,1,@12928 42,1,@12947 81,0,@12740 86,1,@12741 96,0,9 102,1,@12931 114,1,@12930 144,0,@13107 270,0,0 13107:D3,672|3b650c7303ff552489c1bbba8887b28d5c8bfcffe390e91b020000909090e913020000909090e91e020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bd010000909090e9bc010000909090e993010000909090e9b3010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e972010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c9000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a8000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e987000000909090e93b000000909090e97e000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb44b903000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff229090000000009c020000|@12910,1048575,@2408|11,0,$13107+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 642,0,1 652,0,1 13108:S79|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f537472756374757265283129 13109:D3,664|3b650c7303ff552489c1bbc68b87b28d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9b6010000909090e9b5010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96b010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c2000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e980000000909090e93b000000909090e977000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff22900000000094020000|@12910,1048575,@2411|11,0,$13109+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 645,0,1 13110:D3,60|3b650c7303ff5524536a01ff7204ff7208bb03000000909090e896e7ffff8b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13079,2097151,@2412|18,0,1 26,1,@13086 44,0,0 13111:D3,56|3b650c7303ff552453ff7208ff720c8b5a04909090e8320000008b0c248b1089118b5804895904b80100000083c404c30000000034000000|@13035,2097151,@2416|22,1,@13112 40,0,0 13112:D3,312|3b650c7303ff55245368449087b253ff7424148d5c2408b8980e87b290e8be7fffff50ff70048b5c241c8b0889c8909090e8e687ffff8b04248b4c24188b51088b128b59248b1b83fb53750289d383fb137511ff700489c8ba24bc86b2e8d62cffffeb1a8b5804b81300000090e85e82ffff538b5c241c9090e89680ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700789087b28b4c24088948048060ffbf6a016a01ff7424208d4c2404518b5c242c90e802a0ffff8b4424088b4c24048b55008d52c83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc040000005b83c40889580c5b83c40c895808895004c7000b00000089c38d4014c740fc020000008950048918c20800900000000034010000|@13115,2097151,@2415|10,0,@13113 24,0,@12926 30,1,@12928 50,1,@12947 89,0,@12740 94,1,@12741 104,0,9 110,1,@12931 122,1,@12930 152,0,@13114 186,1,@12993 279,0,5 13113:D3,32|3b650c7303ff552483f8137506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2413|14,0,1 13114:D3,672|3b650c7303ff552489c1bb8e9087b28d5c8bfcffe390e91b020000909090e913020000909090e91e020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bd010000909090e9bc010000909090e993010000909090e9b3010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e972010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c9000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a8000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e987000000909090e93b000000909090e97e000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f8197407b901000000eb44b903000000eb3db903000000eb36b903000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c38b5204ff229090000000009c020000|@12910,1048575,@2414|11,0,$13114+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 642,0,1 652,0,1 13115:S73|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f56616c283129 13116:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2417| 13117:S57|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129 13118:S39|50415253455f44454328292e70617273654465632833297369676e617475726553706563283329 13119:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2420|14,0,1 13120:S49|50415253455f44454328292e7061727365446563283329737472756374757265446563283329646f537472446563283129 13121:O1|@13122 13122:D3,28|83f86b7406b801000000c3b803000000c39090900000000018000000|@13123,1,@2423|6,0,0 12,0,1 13123:S19|53796d5365742e73747275637453792d283129 13124:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2424| 13125:D3,40|3b650c7303ff552483f81f740583f8357506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2425|19,0,1 13126:D3,40|3b650c7303ff552450528b4a0889ca90ff128b04248b480483c4045889caff220000000024000000|@13127,1048575,@2426| 13127:S35|50415253455f44454328292e6d6b4c6f63616c426f6479466978456e76283429283129 13128:D3,32|3b650c7303ff552483f81f7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2427|14,0,1 13129:S38|50415253455f44454328292e7061727365446563283329737472756374757265446563283329 13130:O2|@13131,@12921 13131:D3,3036|3b650c7303ff55248b4b088b098b73248b3683fe53750289ce83fe45745383fe0d745383fe31745383fe6b7453505352b85ca287b2e86679ffff8b4424048b48088b098b50248b1283fa53750289ca5289d08b5424209090ff1283f801754c833c24457446833c240d7440833c2431eb14e93f000000e93a000000e935000000e9300000007424833c246b741e8b442408ba24bc86b2909090e82625ffff83c4043b650c7303ff5524eb8fb80100000083c404eb0a89c1b8010000005153528b45008d40f43b45087303ff5520894500c740fc020000009090c70084a287b28b4c241c8948048060ffbf8b5424048b5a288b1b8b723c8b368b7a088b3f8b4a248b0983f953750289f96a016a0183f9457571505653ff72188b44241cba24bc86b2e89e24ffff8b4424206a016a016a018b7808ff70048d5c2404b8010000009090e84e54ffff8b45008d40f03b45087303ff5520894500c740fc03000000c700c4a287b25983c4048948048b4c24048948088060ffbf8b4d008d49f03b4d08730aeb05e9b6010000ff5520894d00c741fc030000008979088941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000c7000ca387b28b5424348950048060ffbf8b5c24185150ff742434ff7424348b43048b5c242c89c689c889f2909090ff128b4c24208b51088b128b59248b1b83fb53750289d383fb3575105089c8ba24bc86b290e8b223ffffeb1a89c3b8350000009090e83a79ffff538b5c24249090e87277ffff8b45008d40f43b45087303ff5520894500c740fc02000000c7005ca387b28b4c243c8948048060ffbf6a016a01508d44240450ff742444ff7424448b5c243c8b44241c8b542438e886fdffff8b44242c8b48148b098b50388b128b58088b1b8b70248b3683fe53750289de83fe1f750e5251ba24bc86b2e81a23ffffeb1a89d389ceb81f000000e8a278ffff53568b5c243490e8da76ffff8b45008d40e83b45087303ff5520894500c740fc050000008b4c24208948108b4c240489480c8b4c241c8948085983c4048948048b4c241089088b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c8b5424088951085a83c418895104c701030000008d542404890a8d4c2404894104eb6e83f96b756e505653ff72188b44241cba24bc86b2909090e86a22ffff8b4424206a016a016a018b7808ff70048d5c2404b8010000009090e81a52ffff8b45008d40f03b45087303ff5520894500c740fc03000000c700a8a387b25983c4048948048b4c24048948088060ffbfeb0ae9ea070000e9370100008b4d008d49f03b4d087303ff5520894d00c741fc030000008979088941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000c700f0a387b28b5424348950048060ffbf8b5c241850ff742430ff7424308b43048b5c242889c689c889f2909090ff128b4c241c8b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956045a83c40889168b51088b128b59248b1b83fb53750289d383fb1f7510565089c8ba24bc86b2e83e21ffffeb1a89c3b81f0000009090e8c676ffff56538b5c241890e8fe74ffff8b45008d40e43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc0400000089410c8b4424048941085a895104c701070000008d542408890a8d4c2408894104eb6b50ff742428683ca487b2ff7424188d5c2404b8980e87b290e86273ffff8b4c241883c4088b51288b128b593c8b1b8b71088b368b79248b3f83ff53750289f783ff43756fff7004ff305352ff711889c8ba24bc86b2909090e87a20ffffff7424108b5c24288b442410eb05e93b060000e8467bffff8b4424248b48088b098b50248b1283fa53750289ca83fa5f75728b48148b098b50388b128b5d008d5be83b5d087303ff5520895d00c743fc05000000eb05e9a80500008b74240889731089530c8b542404895308894b048b0c24890b8b4d008d49e43b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000894a0c895a08eb05e90f000000c7420401000000c70207000000eb478b4d008d49f43b4d087303ff5520894d00c741fc02000000c70188a487b28b54243c8951048061ffbf8b58088b1b8b70248b3683fe53750289de89f3bfba9c87b28d7c9ffcffe7e9d8030000e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9db000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9ba000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fe7b7407bb01000000eb46bb03000000eb44bb03000000eb42bb03000000eb40bb03000000eb3ebb03000000eb3cbb03000000eb46bb03000000eb3fbb03000000eb38bb03000000eb31bb03000000eb2ae925000000e920000000e91b000000e916000000e911000000e90c000000bb03000000eb05bb0300000083fb0174718b5c24286a016a016a0189cfff7308ff73048d5c2408b801000000909090e8824cffff8b45008d40f03b45087303ff5520894500c740fc03000000c700d8a487b2598948048b4c240c8948088060ffbf8b4d008d49f03b4d087303ff5520894d00c741fc030000005a83c404895108eb05e99b0000008941045883c40489018b44242057ff742438ff7424388b5c24308b500489c8ff128b4c24248b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956048b142489168b55008d52e43b55087303ff5520895500c742fc01000040c7020100000089d38d5208c742fc04000000895a0c897208894204c70207000000eb266a016a01518d4c240451ff742444ff74244489c38b4424408b54243890e8def5ffff5a83c4048b44242483c40c8b48148b098b58388b1b8b70088b368b78248b3f83ff53750289f783ff5f750f525351ba24bc86b2e86a1bffffeb1a89d689cfb85f000000e8f270ffff5653578b5c2424e82a6fffff8b4424108b4d008d49a43b4d087303ff5520894d00c741fc050000008b50108951108b5c240489590c8b58088959085e83c4048971048b3089318d7918c747fc01000040c707010000008d7708c746fc01000040c706010000008d5e08c743fc01000040c703010000008d4308c740fc01000040c700010000008d5008c742fc0800000089421c8b442408894218894a14897a10895a0c8972088b4424048942045883c40889028b45008d40f43b45087303ff5520894500c740fc02000000895004c700010000008d54240489028d442404894804eb498b55008d52e43b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc040000008b700489730c8953088b10895304c703090000008d7c2404891f8d5c24048973046a0183c4048b4424248b4c241c894424288b54241089542424894c24208b5424148954241c5a8b5c24148954241489da8b5c24045883c41052e9e002000000000000d80b0000|@13144,2097151,@2439|49,0,@13132 54,1,@12930 146,0,@12740 154,1,@12741 172,0,0 184,0,0 219,0,@13133 285,0,@12740 290,1,@12741 315,0,0 322,1,@12896 352,0,@13134 443,0,@13135 520,0,@12740 526,1,@12741 535,0,26 542,1,@12931 554,1,@12930 584,0,@13136 673,0,@12740 678,1,@12741 689,0,15 694,1,@12931 706,1,@12930 811,0,1 846,0,@12740 854,1,@12741 879,0,0 886,1,@12896 916,0,@13137 1012,0,@13138 1149,0,@12740 1154,1,@12741 1163,0,15 1170,1,@12931 1182,1,@12930 1212,0,0 1242,0,3 1267,0,@13139 1280,0,@12926 1286,1,@12928 1342,0,@12740 1350,1,@12741 1374,1,@12947 1496,0,0 1526,0,0 1532,0,3 1564,0,@13140 1599,0,$13131+1614 2164,0,0 2171,0,1 2178,0,1 2185,0,1 2192,0,1 2199,0,1 2206,0,1 2213,0,1 2220,0,1 2227,0,1 2234,0,1 2271,0,1 2278,0,1 2310,0,0 2318,1,@12896 2348,0,@13141 2527,0,0 2554,0,3 2641,0,@12740 2646,1,@12741 2657,0,47 2662,1,@12931 2674,1,@12930 2748,0,0 2764,0,0 2780,0,0 2796,0,0 2874,0,0 2919,0,0 2949,0,4 3024,1,@13142 13132:S29|737472756374206f722066756e63746f72206170706c69636174696f6e 13133:D3,44|3b650c7303ff552483f8157506b803000000c383f8137506b803000000c38b5204ff22900000000028000000|@12910,1048575,@2429|14,0,1 25,0,1 13134:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2430| 13135:D3,60|3b650c7303ff552483f81f740583f8357506b803000000c383f8157506b803000000c383f8137506b803000000c38b5204ff22900000000038000000|@12910,1048575,@2431|19,0,1 30,0,1 41,0,1 13136:D3,56|3b650c7303ff552483f81f7506b803000000c383f8157506b803000000c383f8137506b803000000c38b5204ff2290900000000034000000|@12910,1048575,@2432|14,0,1 25,0,1 36,0,1 13137:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2433| 13138:D3,56|3b650c7303ff552483f81f7506b803000000c383f8157506b803000000c383f8137506b803000000c38b5204ff2290900000000034000000|@12910,1048575,@2434|14,0,1 25,0,1 36,0,1 13139:D3,56|3b650c7303ff552483f8437506b803000000c383f8157506b803000000c383f8137506b803000000c38b5204ff2290900000000034000000|@12910,1048575,@2435|14,0,1 25,0,1 36,0,1 13140:D3,60|3b650c7303ff552483f817740583f85f7506b803000000c383f8157506b803000000c383f8137506b803000000c38b5204ff22900000000038000000|@12910,1048575,@2436|19,0,1 30,0,1 41,0,1 13141:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2437| 13142:D3,608|3b650c7303ff55248b4c24108b51088b128b71248b3683fe53750289d683fe157571535089c8ba24bc86b29090e8de16ffff6a016a01ff7424148d44240450ff7424248b5c242c8b442424bab01987b290e85274ffff8b45008d40d43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701010000008d5108c742fc06000000894a14eb05e99a0000008942108b44240489420cc742080300000059894a048b4c2404890a8b4d008d49dc3b4d087303ff5520894d00c741fc02000000895104c701050000008b5424088d590cc743fc050000008b721083c40c8973108b780c897b0c8b72088973088b70048973048b1289138b5424148b7424108b44240c8b7c2408538b5c2408895424188974241489442410897c240c895c24085b89c8e9cefeffff83fe137570535089c8ba24bc86b290e8ca15ffff6a016a01ff7424148d44240450ff7424248b5c242c8b442424bab01987b290e83e73ffff8b45008d40d43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c701010000008d5108c742fc06000000894a14eb05e99a0000008942108b44240489420cc742080100000059894a048b4c2404890a8b4d008d49dc3b4d087303ff5520894d00c741fc02000000895104c701050000008b5424088d590cc743fc050000008b721083c40c8973108b780c897b0c8b72088973088b70048973048b1289138b5424148b7424108b44240c8b7c2408538b5c2408895424188974241489442410897c240c895c24085b89c8e9bafdffff8b5424148902895a04b801000000c2140090000000005c020000|@13143,2097151,@2438|39,0,@12740 46,1,@12741 76,0,@12954 82,1,@12956 112,0,0 128,0,0 165,0,1 208,0,2 316,0,@12740 322,1,@12741 352,0,@12954 358,1,@12956 388,0,0 404,0,0 441,0,0 484,0,2 592,0,0 13143:S51|50415253455f44454328292e706172736544656328332973747275637456616c283329646f436f6e73747261696e7473283229 13144:S35|50415253455f44454328292e706172736544656328332973747275637456616c283329 13145:D3,64|3b650c7303ff55248b4c240c8b7424088b7c2404895c240c8b520489542408897424048b1424893c245089cbb80100000052e91d00000090000000003c000000|@13370,2097151,@2559|45,0,0 51,1,@13146 13146:D3,1152|3b650c7303ff55248b45008d40f43b45087303ff5520894500c740fc02000000c700e4ac87b28958048060ffbf8b4c24148b51088b128b71248b3683fe53750289d683fe6175425389c8ba24bc86b29090e88a13ffff8b4424188b4c24148b5424108b5c240c8b74240889442418894c241489542410895c240c897424085bb801000000e977ffffff8b51088b128b71248b3683fe53750289d683fe47740583fe6d75605350ff742414ff74241489cb8b4424148b542420ff1250ff74241cff74241cff74241cff74241cff74241c8b5c2418b80100000090e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c214008b51088b128b71248b3683fe53750289d689f2bf72a987b28d7c97fcffe7e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fe7b7407ba01000000eb46ba03000000eb44ba03000000eb42ba03000000eb40ba03000000eb3eba03000000eb3cba03000000eb3fba03000000eb38ba03000000eb31ba03000000eb2aba03000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000ba0300000083fa0174706a016a01536a03ff7424148d54240c52ff742424ff74242489cb909090e89e0300008b45008d40e43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc040000008b54240889510c8941088b442404894104c7010100000051ff742424ff742424ff742424eb05e93f000000ff742424ff7424248b5c2418b801000000909090e8b6fbffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c21400b801000000c21400000000007c040000|@13369,2097151,@2558|34,0,@13147 75,0,@12740 82,1,@12741 128,0,0 212,0,0 280,0,$13146+290 840,0,0 847,0,1 854,0,1 861,0,1 868,0,1 875,0,1 882,0,1 889,0,1 896,0,1 903,0,1 910,0,1 947,0,1 986,1,@13148 1016,0,0 1049,0,0 1086,0,0 1137,0,0 13147:D3,724|3b650c7303ff552483f86d740d89c1bb06ad87b28d5c8bfcffe3e9a2020000909090e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f87b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f901750583f8617506b803000000c38b5204ff2200000000d0020000|@12910,1048575,@2440|16,0,$13147+34 584,0,0 591,0,1 598,0,1 605,0,1 612,0,1 619,0,1 626,0,1 633,0,1 640,0,1 647,0,1 654,0,1 691,0,1 706,0,1 13148:D3,4872|8d7c24a03b7d0c7303ff55288b4c2410837c241401751e8b53088b128b73248b3683fe53750289d689f2bf06b087b28d7c97fcffe7e99a020000e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fe7b7407ba01000000eb46ba03000000eb44ba03000000eb42ba03000000eb40ba03000000eb3eba03000000eb3cba03000000eb3fba03000000eb38ba03000000eb31ba03000000eb2aba03000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000ba0300000083fa0174698b53088b128b73248b3683fe53750289d68b53288b128b7b148b3f528b533c8b12528b53388b12ff7318508b45008d40e83b45087303ff5520894500c740fc05000000538b5c240c89581089500c8b5424108950088978048b7c24088938bf0eb387b28d7cb7fcffe7e90c0e0000e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e932040000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e936040000909090e983010000909090e9d6040000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e94a060000909090e968060000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e95e060000909090e9df080000909090e9f3000000909090e9eb000000909090e9ed080000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9ae090000909090e93b000000909090e94e0a0000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090908b4c2420c701b4047db2894104b80100000083c414c214008b0424ba24bc86b2909090e8da06ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700e8c287b28b4c24048948048060ffbf6a016a01ff7424206828c387b28d54240852ff74242c8d5c2408e806beffff8b44241083c4088b48088b098b50248b1283fa53750289ca81fa850000007561ba24bc86b29090e86606ffff8b45008d40f43b45087303ff5520894500c740fc02000000c70070c387b28b4c240c8948048060ffbf6a016a01ff742428ff74243868a8c387b28d54240c52ff7424388d5c2408e88ebdffff83c40c5883c404eb05b8010000008b4c24088b51088b128b59248b1b83fb53750289d381fb83000000750f5089c8ba24bc86b2e8e205ffffeb1a89c3b8830000009090e86a5bffff538b5c240c9090e8a259ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700f8c387b28b4c24108948048060ffbfff74240cb92cc487b251ff742430ff7424308b5c2440e8860d00008b4c240c8b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2418897e10895e0c8b5c241c895e088956048b54241489168b51088b128b59248b1b83fb53750289d383fb1f7510565089c8ba24bc86b2e81e05ffffeb1a89c3b81f0000009090e8a65affff56538b5c241490e8de58ffff589090e8e21300008b4d008d49d03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc06000000894a148b4c2404894a10c7420c030000008b4c2408894a088b0c24894a0489028d421cc740fc02000000895004c700010000008b5424308902894a04b80100000083c424c214008b4c24248b5424208b5c2418be01000000897424288944242489542420895c241c89cb8b44240483c4145e83c40456e923acffff8b0424ba24bc86b2e84a04ffff6a016a01ff74242cff74240c68a4cb87b28d44240c50ff7424308d5c24088b44242090e896bbffff8b44241083c40c8b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424148951108b500c89510c8b5c24188959088b58048959048b74241089318b75008d76f03b75087303ff5520897500c746fc03000000894e085f83c404897e04c706130000008b7c24208937894f04b80100000083c414c214008b0424ba24bc86b2e89a03ffff6a016a016a016a0189e3b801000000e85292ffff6a016a016a016a0189e3b801000000e83e92ffff8b4424448b4d008d49f03b4d087303ff5520894d00c741fc03000000c70180d087b28b54241c8951048b5424088951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc03000000894b088b4804894b048b3089338d7b10c747fc030000008957088b5424048957048b1424891753ff74243c89fbb80300000090e8b668ffff6a016a01ff742444ff74244cff742410ff74243868fcd087b28d44241450ff74245c8d5c24088b44244c90e832baffff8b44241883c4148b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424388951108b500c89510c8b5c243c8959088b58048959048b74243489318b75008d76f43b75087303ff5520897500c746fc020000008b7c2414897e048b7c240c893e8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b5c2424895f048b5c241c891f8b5d008d5be83b5d087303ff5520895d00c743fc05000000894b10897b0c8973085e83c428897304c703190000008b742420891e894e04b80100000083c414c214008b4424248b4c24208b54241c894c24288954242489c38b042483c4145e83c40c56e9e5bc00008b4424248b4c24208b54241c894c24288954242489c38b042483c4145e83c40c56e9bfbc0000ff318b442404ba24bc86b290e89601ffff8b4424286a016a016a018b7808ff70048d5c2404b8010000009090e84631ffff8b45008d40f03b45087303ff5520894500c740fc03000000c700588688b25983c4048948048b4c24048948088060ffbf8b4d008d49e43b4d087303ff5520894d00c741fc030000008979088941048b142489118d5910c743fc02000000c703a08688b28b7424108973048063ffbf5750ff742414be2cc487b256ff742438ff74243889de89cb89f0909090e8ea0800008b4c24148b51088b128b59248b1b83fb53750289d383fb3575105089c8ba24bc86b290e8be00ffffeb1a89c3b8350000009090e84656ffff538b5c24189090e87e54ffff8b45008d40f03b45087303ff5520894500c740fc03000000c700dc8688b28b4c24148948048b4c240c8948088060ffbf8b4d008d49e43b4d087303ff5520894d00c741fc030000008b5424088951088b54240489510489018d4110c740fc02000000c700188788b28b54241c8950048060ffbfff742418ba2cc487b252ff74243cff74243c89cbe81a0800008b4c24188b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2424897e10895e0c8b5c2428895e088956048b54242089168b51088b128b59248b1b83fb53750289d383fb1f7510565089c8ba24bc86b2e8b2fffeffeb1a89c3b81f0000009090e83a55ffff56538b5c242090e87253ffff8b442408909090e86a97000089c358e8ee9700008b4d008d49d43b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc05000000894a108b0c24894a0cc7420803000000895a0489028d4218c740fc02000000895004c700270000008b54243c8902894a04b80100000083c430c214008b4424248b4c24208b54241c894c24288954242489c38b042483c4145e83c40c56e910ba0000508b442404ba24bc86b2909090e8e6fefeff8b4424048b48088b098b50248b1283fa53750289ca83fa23740a83fa0d740583fa3175746a016a0150ff7424148d5c24088b4424109090e8c6c900008b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424188951108b500c89510c8b5c241c8959088b58048959048b74241489318b75008d76d03b75087303ff5520897500c746fc01000040c70601000000eb05e9710000008d7e08c747fc01000040c707010000008d5f08c743fc01000040c703010000008d4308c740fc0500000089581089780c8970088948045a83c40489108b55008d52f43b55087303ff5520895500c742fc02000000894204c702290000008b4424248910894804b80100000083c418c21400b831000000e86653ffff8b5c2404909090e89e51ffff8b442404ba24bc86b29090e8b2fdfeff8b442424c700b4047db28b0c24894804b80100000083c418c214008b0424ba24bc86b2e88afdfeff6a016a01ff742420ff74243068788888b28d44240c50ff7424308d5c24088b44242090e8d6b4ffff8b44241083c40c8b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424148951108b500c89510c8b5c24188959088b58048959048b74241089318b75008d76f03b75087303ff5520897500c746fc03000000894e085f83c404897e04c706350000008b7c24208937894f04b80100000083c414c214008b0424ba24bc86b2e8dafcfeff6a016a016a016a0189e3b801000000e8928bffff6a016a016a016a0189e3b801000000e87e8bffff8b4424448b4d008d49f03b4d087303ff5520894d00c741fc03000000c701c88888b28b54241c8951048b5424088951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc03000000894b088b4804894b048b3089338d7b10c747fc030000008957088b5424048957048b1424891753ff74243c89fbb80300000090e8f661ffff8b45008d40f43b45087303ff5520894500c740fc02000000c700148988b28b4c24288948048060ffbf6a016a0189e151ff742430ff742410b92cc487b251ff742458ff742458bb01000000e8f6c800008b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424388951108b500c89510c8b5c243c8959088b58048959048b74243489318b75008d76f43b75087303ff5520897500c746fc020000008b7c2414897e048b7c240c893e8b7d008d7ff43b7d087303ff5520897d00c747fc020000008b5c2424895f048b5c241c891f8b5d008d5be83b5d087303ff5520895d00c743fc05000000894b10897b0c8973085e83c428897304c703390000008b742420891e894e04b80100000083c414c214006a016a016a016a0150538d5c2408b801000000e8ca89ffff6a016a016a016a0189e3b801000000e8b689ffff8b4424388b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424248951088b50048951048b1889196a016a0189e656ff74241cbe2cc487b256ff742444ff7424448b5c243089c8909090e84e6300008b45008d408c3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc01000040c70190cf87b28d5108c742fc01000040c702d08b88b28d5a08c743fc05000000895310c7430ce01687b2894308894b04c703fc8b88b28d4318c740fc02000000895804c7001d0000008d480cc741fc01000040c701010000008d5108c742fc05000000c7421001000000894a0c8b4c2404894a085b895a0489028d4218c740fc02000000c740040100000089108d500cc742fc020000008b5c240c895a048b5c2404891a8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b7424248973048b74241c89338b75008d76e83b75087303ff5520897500c746fc05000000894e10895e0c895608894604c706390000008b4424388930894804b80100000083c42cc214009090900000000004130000|@13368,2097151,@2557|43,0,$13148+58 608,0,0 615,0,1 622,0,1 629,0,1 636,0,1 643,0,1 650,0,1 657,0,1 664,0,1 671,0,1 678,0,1 715,0,1 819,0,$13148+834 1384,0,@7817 1392,0,0 1406,0,@12740 1414,1,@12741 1444,0,@13149 1468,0,@13150 1486,1,@13080 1516,0,66 1523,0,@12740 1530,1,@12741 1560,0,@13151 1588,0,@13152 1606,1,@13080 1620,0,0 1647,0,65 1657,0,@12740 1662,1,@12741 1671,0,65 1678,1,@12931 1690,1,@12930 1720,0,@13153 1740,0,@13154 1758,1,@13155 1853,0,@12740 1858,1,@12741 1867,0,15 1874,1,@12931 1886,1,@12930 1894,1,@13158 1924,0,0 1951,0,1 1985,0,0 1999,0,0 2022,0,0 2057,1,@13061 2065,0,@12740 2070,1,@12741 2087,0,@13159 2110,1,@13080 2213,0,9 2227,0,0 2241,0,@12740 2246,1,@12741 2261,0,0 2266,1,@13052 2281,0,0 2286,1,@13052 2320,0,@13169 2412,0,1 2418,1,@12962 2443,0,@13171 2466,1,@13080 2649,0,12 2663,0,0 2707,1,@13332 2745,1,@13332 2756,0,@12740 2762,1,@12741 2787,0,0 2794,1,@12896 2824,0,@13353 2893,0,@13354 2915,0,@13154 2938,1,@13155 2972,0,@12740 2978,1,@12741 2987,0,26 2994,1,@12931 3006,1,@12930 3036,0,@13355 3110,0,@13356 3130,0,@13154 3146,1,@13155 3241,0,@12740 3246,1,@12741 3255,0,15 3262,1,@12931 3274,1,@12930 3286,1,@13286 3294,1,@13287 3324,0,0 3350,0,1 3374,0,19 3388,0,0 3432,1,@13332 3442,0,@12740 3450,1,@12741 3510,1,@13357 3600,0,0 3623,0,0 3639,0,0 3700,0,20 3714,0,0 3725,0,24 3730,1,@12931 3742,1,@12930 3751,0,@12740 3758,1,@12741 3768,0,@7817 3779,0,0 3793,0,@12740 3798,1,@12741 3815,0,@13359 3838,1,@13080 3941,0,26 3955,0,0 3969,0,@12740 3974,1,@12741 3989,0,0 3994,1,@13052 4009,0,0 4014,1,@13052 4048,0,@13360 4140,0,1 4146,1,@12962 4176,0,@13361 4207,0,@13154 4221,0,0 4226,1,@13362 4406,0,28 4420,0,0 4445,0,0 4450,1,@13052 4465,0,0 4470,1,@13052 4531,0,@13154 4554,1,@13267 4584,0,@5413 4600,0,@13162 4616,0,@13365 4636,0,@12945 4648,0,@13367 4667,0,14 4683,0,0 4700,0,0 4733,0,0 4837,0,28 4851,0,0 13149:D3,44|3b650c7303ff552481f883000000740881f8850000007506b803000000c38b5204ff22900000000028000000|@12910,1048575,@2441|10,0,65 18,0,66 25,0,1 13150:D3,52|3b650c7303ff552453ff7204bb01000000e876aeffff8b0c248b1089118b5804895904b80100000083c404c30000000030000000|@13079,2097151,@2442|13,0,0 18,1,@13076 36,0,0 13151:D3,36|3b650c7303ff552481f8830000007506b803000000c38b5204ff22900000000020000000|@12910,1048575,@2443|10,0,65 17,0,1 13152:D3,60|3b650c7303ff5524536a01ff7204ff7208bb01000000909090e84ab2ffff8b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13079,2097151,@2444|18,0,0 26,1,@13086 44,0,0 13153:D3,32|3b650c7303ff552483f81f7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2445|14,0,1 13154:O1|@13148 13155:D3,960|3b650c7303ff55248b4c24108b51088b128b71248b3683fe53750289d683fe61753d535089c8ba24bc86b29090e8caf7feff8b4424188b4c24148b5424108b5c240c89442418894c241489542410895c240c8b5c24045883c404e9a1ffffff8b51088b128b71248b3683fe53750289d689f2bfb2c487b28d7c97fcffe790e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fe7b7407ba01000000eb46ba03000000eb44ba03000000eb42ba03000000eb40ba03000000eb3eba03000000eb3cba03000000eb3fba03000000eb38ba03000000eb31ba03000000eb2aba03000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000ba0300000083fa0174708b55008d52f43b55087303ff5520895500c742fc02000000c70208c887b28942048062ffbf6a016a0153506a03538d74241056ff742424ff74242489cb89d08b54243090ff12ff742420ff742420ff742420ff7424208b5c24148b442410909090e882fcffff89c18b45008d40f4eb05e9210000003b45087303ff5520894500c740fc0200000089480483c4085983c4048908c21000b801000000c21000909000000000bc030000|@13157,2097151,@2447|39,0,@12740 46,1,@12741 115,0,$13155+126 676,0,0 683,0,1 690,0,1 697,0,1 704,0,1 711,0,1 718,0,1 725,0,1 732,0,1 739,0,1 746,0,1 783,0,1 818,0,@13156 943,0,0 13156:D3,712|3b650c7303ff552489c1bb1ec887b28d5c8bfcffe390e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f87b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f901750583f8617506b803000000c38b5204ff2200000000c4020000|@12910,1048575,@2446|11,0,$13156+22 572,0,0 579,0,1 586,0,1 593,0,1 600,0,1 607,0,1 614,0,1 621,0,1 628,0,1 635,0,1 642,0,1 679,0,1 694,0,1 13157:S43|50415253455f44454328292e706172736544656328332964656328342964656353657175656e6365283229 13158:D3,120|3b650c7303ff5524a801755b8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000894a048b08890a528b480489c8e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000074000000|@6329,7,@2448|38,0,0 104,0,0 13159:D3,52|3b650c7303ff552453ff72088b5a049090e8320000008b0c248b1089118b5804895904b80100000083c404c30000000030000000|@13079,2097151,@2453|18,1,@13160 36,0,0 13160:D3,852|3b650c7303ff55248b4b088b098b53248b1283fa53750289ca83fa4d7512535089d8ba24bc86b29090e816f0feffeb0989c1b8010000005351ff34246854cf87b2ff74240c8d5c2404b8907e87b2909090e89642ffff50ff70048b5c24148b0889c8909090e8be4affff8b04248b4c241083c40c8b51088b128b59248b1b83fb53750289d383fb237575ff7004ff3089c8ba24bc86b2909090e8a6effeff8b44240c8b48088b098b50248b1283fa53750289ca83fa4d750cba24bc86b2e882effeffeb05b801000000ff74240c8b5c240cb8907e87b2909090e80e42ffff8b4c24048b50048b5d008d5be83b5d087303ff5520895d00c743fc05000000eb05e9d60000008b71108973108b7a0c897b0c8b71088973088b72048973048b09890b8b4d008d49943b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d7108c746fc01000040c70690cf87b28d5608c742fc01000040c702c4cf87b28d7a08c747fc050000008957108b500489570c894f088977048b08890f8d7718c746fc02000000897e04c7061d0000008d7e0cc747fc01000040c70790cf87b28d4f08c741fc060000008971148b74240489711089590cc74108010000008979045e83c40489318d411cc740fc02000000895804890883c408c2040083fb4b756cff7004ff3089c8ba24bc86b29090e852eefeff8b45008d40f43b45087303ff5520894500c740fc02000000c70014d087b28b4c24088948048060ffbf8b4c24146a016a01ff71088d542404528b5c241c9090e89661ffff8b44240c8b4c24048b55008d52e03b5508730aeb05e9a1000000ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc010000005b83c40489188b5d008d5bdc3b5d087303ff5520895d00c743fc01000040c70390cf87b28d7b08c747fc06000000c74714b4047db28b4c2404894f1089570c894708895f045883c40489078b45008d40f43b45087303ff5520894500c740fc02000000895004893883c408c204008b4d008d49d03b4d087303ff5520894d00c741fc01000040c70190cf87b28d5108c742fc06000000c74214b4047db28b5804895a10895a0cc7420801000000894a048b08890a8d421cc740fc02000000895804891083c408c204000000000050030000|@13168,2097151,@2452|35,0,@12740 42,1,@12741 51,0,0 61,0,@13161 74,0,@13095 82,1,@12928 102,1,@12947 146,0,@12740 154,1,@12741 185,0,@12740 190,1,@12741 197,0,0 210,0,@13095 218,1,@12928 314,0,@5413 330,0,@13162 346,0,@13164 394,0,14 410,0,@13162 440,0,0 487,0,@12740 494,1,@12741 524,0,@13167 562,1,@12993 675,0,@13162 692,0,@7817 779,0,@13162 796,0,@7817 812,0,0 13161:D3,40|3b650c7303ff552483f823740583f84b7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2449|19,0,1 13162:O7|@13163,2,@5500,@6455,@5229,0,0 13163:S11|3c756e646566696e65643e 13164:O1|@13165 13165:D3,16|b801000000c39090000000000c000000|@13166,1,@2450|1,0,0 13166:S26|50415253455f5452454528292e6d6b4964656e74283229283129 13167:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2451|14,0,1 13168:S48|50415253455f44454328292e7061727365446563283329646563283429657863657074696f6e42696e64696e67283129 13169:D3,56|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff228b0083c408c390900000000034000000|@13170,1048575,@2454| 13170:S39|50415253455f44454328292e70617273654465632833296465632834296e6577456e762d283129 13171:D3,64|3b650c7303ff552453ff7208b92cc487b251ff720cff72108b5a049090e8320000008b0c248b1089118b5804895904b80100000083c404c3000000003c000000|@13079,2097151,@2538|13,0,@13154 30,1,@13172 48,0,0 13172:D3,200|3b650c7303ff55246a016a015053ff742420ff742420ff742420ff7424208d5c2418b8010000009090e8ae0000008b45008d40c43b45087303ff5520894500c740fc01000040c700010000008d4808c741fc01000040c70190cf87b28d5108c742fc01000040c702e4107bb28d5a08c743fc01000040c703e4107bb28d7308c746fc06000000895e148946108b44240489460c894e0859894e0489168b45008d40f43b45087303ff5520894500c740fc02000000598948048930c2100090909000000000c4000000|@13331,2097151,@2537|35,0,0 42,1,@13173 72,0,0 88,0,@13162 104,0,@6455 120,0,@6455 13173:D3,1396|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701b4d787b28b5424188951048061ffbf6a016a015350518d4c240c51ff74242c8b5c24308b44242ce86e0500008b5c24248b442408909090e8ea3f0000833c24017507b901000000eb678b0c248b118b1a3b58047460f6c3017539f640040175338b7804f7c7010000007407be03000000eb068b378d74360183c6085689de59d1e93bc9f3a68d7c3f018d7436018d4c090174708b4c24248b71288b368b79148b3f8b593c8b1bff7008ff7004ff30eb0ae96e020000e90c0100008b41388b00ff7204ff328b55008d52e83b55087303ff5520895500c742fc05000000895a1089420c897208897a048b4918890a528b5c2410b8182488b2e84a38f2ffbb402488b2eb05e9be000000909090e83638f2ff8b5c2404909090e82a38f2ffbbc4347bb29090e81e38f2ffbb5cbe86b29090e83aebfeff909090e8e222ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40489500c894808c7400401000000c700030000008b4c24348b510cc702030000008b5130ff12eb0bff7008ff7004ff30ff72048b0424a801750af644240c017503ff55383b44240c7507b901000000eb708b4c24348b51288b128b59148b1b8b713c8b368b79388b3f8b45008d40e83b45087303ff5520894500c740fc0500000089701089780c8950088958048b5118891050bb030000008b442410bafc317ab2e8925df2ff89c3b86c2488b2e8f636f2ffbb842488b29090e8ea36f2ff50eb05e9ba000000bb030000008b442408bafc317ab290e85e5df2ff89c358e8c636f2ffbb5cbe86b29090e8e2e9feff909090e88a21ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24348b510cc702030000008b5130909090ff1289c183c404eb08ff7008ff7004ff308b4424308b48088b098b50248b1283fa53750289ca83fa23750dba24bc86b290e892e6feffeb3989c3b87b0000009090e85e3affff8b4424308b48088b098b50248b1283fa53750289ca83fa71750cba24bc86b2e85ee6feffeb05b8010000008b45008d40f43b45087303ff5520894500c740fc02000000c700b42488b28b4c24348948048060ffbf6a016a0189e252ff74243cff742438ff742438ff74243889c38b4424489090e8c24e00008b4424208b4c24048b55008d52cc3b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700010000008d5808c743fc0400000089430c895308588943048b44240489038b4424348b50088b128b78248b3f83ff53750289d76a016a0183ff7d757253ba24bc86b290e87ae5feff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24188948048b4c241489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901ff742444ff742444ff742444ff742444ff742444ff7424448d5c241c89c89090e812fbffffeb1289e2c7020100000089e28b7c2408897a04538b45008d40dc3b45087303ff5520894500c740fc020000008b4c24048948045983c40489088b4c24208b14248d580cc743fc050000008b711083c4188973108b7a0c897b0c8b71088973088b72048973048b09890b8b0c248901895904b80100000083c40cc2180090900000000070050000|@13330,2097151,@2536|34,0,@13174 74,1,@13175 90,1,@13252 101,0,0 142,0,1 277,0,@13262 282,1,@4940 287,0,@13263 302,1,@4940 314,1,@4940 319,0,@6530 326,1,@4940 331,0,@12744 338,1,@12747 346,1,@12914 380,0,0 387,0,0 394,0,3 400,0,0 410,0,@6321 458,0,0 464,0,1 477,0,1 523,0,0 596,0,1 605,0,@5052 610,1,@5053 617,0,@13264 622,1,@4940 627,0,@13265 634,1,@4940 647,0,1 656,0,@5052 662,1,@5053 670,1,@4940 675,0,@12744 682,1,@12747 690,1,@12914 724,0,0 731,0,0 738,0,3 744,0,0 754,0,@6321 799,0,0 805,0,1 818,0,1 872,0,@12740 878,1,@12741 887,0,61 894,1,@12930 925,0,@12740 930,1,@12741 937,0,0 967,0,@13266 1014,1,@13267 1090,0,0 1152,0,@12740 1158,1,@12741 1268,0,0 1376,0,0 13174:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2455|14,0,1 13175:D3,1824|3b650c7303ff55248b4b088b098b53248b1283fa53750289ca83fa4d741c83fa41741c83fa3f741c83fa43741c89d1be36d887b28d748efcffe6e9a5050000e9a0050000e99b050000e996050000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083fa317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901755383fa0d745383fa31745383fa7974535350b81cdf87b290e85a35ffff8b4424048b48088b098b50248b1283fa53750289ca5289d08b5424189090ff1283f801753c833c244d743b833c2441743a833c243feb14e9de020000e9d9020000e9d4020000e9cf0200007423833c244374228b0424b92edb87b28d4c81fcffe1e9aa020000e9a5020000e9a0020000e99b020000e9960200009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9ff010000909090e9e3010000909090e9f6010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94d010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9ec000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9ab000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93a000000909090833c24317407b801000000eb2fb803000000eb28b803000000eb21b803000000eb1ab803000000eb13b803000000eb0cb803000000eb05b80300000083f8017533833c240d742d833c24317427833c247974218b442408ba24bc86b2909090e87edefeff83c4043b650c7303ff5524e9f0fcffffb80100000083c404eb0989c1b80100000053518b45008d40f43b45087303ff5520894500c740fc02000000c7002cdf87b28b4c24148948048060ffbf8b14246a016a0152ff742418ff7424146868df87b2ff72088d5c24045368100188b268980e87b2508d44242450ff74243c8b5a048b0290e8be2500006a016a01ff74241c8d44240450ff742434ff74242cff742434b8b8df87b2508b5c24308b44244ce8da1a00008b4424248b48088b098b50248b1283fa53750289ca89d08b542434909090ff1283f80175548b5c2424b82c1288b290e87231ffff8b4424248b48088b098b50248b1283fa53750289ca89d08b542434909090ff1283f80175198b442424ba24bc86b290e862ddfeff3b650c7303ff5524ebc2b801000000eb05b8010000008b4424308b0c24890883c4045983c420894804b801000000c20c0090000000001c070000|@13251,2097151,@2485|48,0,$13175+78 628,0,0 635,0,1 642,0,1 649,0,1 656,0,1 663,0,1 670,0,1 677,0,1 704,0,@13176 710,1,@12930 801,0,$13175+838 1389,0,0 1396,0,1 1403,0,1 1410,0,1 1417,0,1 1424,0,1 1431,0,1 1438,0,1 1470,0,@12740 1478,1,@12741 1499,0,0 1511,0,0 1543,0,@13177 1575,0,@13178 1588,0,@13224 1593,0,@12926 1614,1,@13226 1644,0,@13179 1658,1,@13203 1704,0,@13250 1710,1,@12930 1756,0,@12740 1762,1,@12741 1777,0,0 1784,0,0 1808,0,0 13176:S7|5061747465726e 13177:D3,40|3b650c7303ff552483f80b740583f8137506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2456|19,0,1 13178:D3,60|3b650c7303ff552453ff7208b9b8df87b251ff720c8b5a0490e83a0000008b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13223,2097151,@2474|13,0,@13179 26,1,@13180 44,0,0 13179:O1|@13175 13180:D3,3752|3b650c7303ff55248b4b088b098b53248b1283fa53750289ca8b4b288b098b73148b368b7b3c8b3f578b7b388b3f518b4d008d49e83b4d087303ff5520894d00c741fc05000000ff7318508b44240c89411089790c8b7c24088979088971048b7424048931be32e087b28d7496fcffe69090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9aa030000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e9a9030000909090e951040000909090e964050000909090e95b070000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e99a090000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9e40a0000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e9510b0000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9620b00009090908b53088b128b73248b3683fe53750289d683fe4d740a83fe0d740583fe3175728b4b088b098b53248b1283fa53750289ca83fa4d7407b901000000eb05b90300000083f9017413515389d8ba24bc86b2909090e886d9feffeb07b80100000051538b44241c6a016a01ff7008ff74240cff74241868980e87b2ff74241c8d4c2414518b58048b0889c89090e89a0b0000eb05e9c00000008b45008d40d03b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc01000040c70190cf87b28d5108c742fc01000040c70244f087b28d5a08c743fc050000008953108b54240489530c894308894b045889038b45008d40d03b45087303ff5520894500c740fc02000000895804c7001d0000008d480cc741fc050000008b5c241883c40c8959108b5a0c89590c8b7424088971088b72048971048b7c2404893989c78d4118c740fc02000000894804893883c410c20c005351b81cdf87b290e8562cffff8b4424048b48088b098b50248b1283fa53750289ca89d08b542408909090ff1283f80175198b442404ba24bc86b290e846d8feff3b650c7303ff5524ebc28b45008d40f43b45087303ff5520894500c740fc020000005983c4048948049090c700b4047db283c410c20c008b44241c8b50048b128b58288b1b8b70148b368b783c8b3f518b48388b09528b55008d52e83b55087303ff5520895500c742fc05000000897a10894a0c895a088972048b40188902528b442428ba24bc86b29090e8b6d7feff8b45008d40d43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c7411070f087b25a89510c5a895108894104c701250000008d4118c740fc020000005a895004890883c410c20c008b44241c8b50048b128b58288b1b8b70148b368b783c8b3f518b48388b09528b55008d52e83b55087303ff5520895500c742fc05000000897a10894a0c895a088972048b40188902528b442428ba24bc86b2909090e806d7feff8b45008d40d43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110c0f087b25a89510c5a895108894104c701250000008d4118c740fc020000005a895004890883c410c20c005389d8ba24bc86b290e8a2d6feff8b04248b48088b098b50248b1283fa53750289ca83fa5b7507b901000000eb1eff74241cff742424ff742420508b5c2414b80100000090e8260b000089c18b04248b50148b128b58388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2410897e10895e0c8b5c240c895e088956048b54240889168b50088b128b58248b1b83fb53750289d383fb5b750f5651ba24bc86b290e802d6feffeb1a89cbb85b0000009090e88a2bffff56538b5c240890e8c229ffff8b45008d40d83b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc040000008b54240489510c5b895908894104c701230000008d4114c740fc02000000895004890883c418c20c005389d8ba24bc86b29090e886d5feff8b04248b48148b098b50388b128b58088b1b8b70248b3683fe53750289de83fe5d75765251ba24bc86b290e856d5feff8b45008d40e83b45087303ff5520894500c740fc050000008b4c24188948108b4c240489480c8b4c24148948085983c4048948048b4c240889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7013700000089c28d410cc740fc02000000eb05e90b000000895004890883c414c20c008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70178f287b28941048061ffbf6a016a016a0189e389c8909090e87254ffff6a016a01ff742414ff74241cff742414ff74243cff742444ff7424408d5c2418b8010000009090e8f20b00008b4424148b48148b098b50388b128b5d008d5be83b5d087303ff5520895d00c743fc050000008b74242489731089530c8b542420895308894b048b4c241c890b8b48088b098b50248b1283fa53750289ca83fa5d751053ba24bc86b2909090e816d4feffeb16b85d000000e8a229ffff538b5c24189090e8da27ffff8b45008d40e03b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc050000008b14248951108b5c240889590c8941088b442404894104c7011f0000008b45008d40f43b45087303ff5520894500c740fc02000000895004890883c42cc20c005389d8ba24bc86b2909090e886d3feff8b04248b48088b098b50248b1283fa53750289ca83fa5f75518b48148b098b50388b128b5d008d5bdc3b5d087303ff5520895d00c743fc050000008b74241089731089530c8b54240c895308894b048b4c2408890b8d7b18c747fc02000000895f04c70737000000eb6c8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70114fe87b28b5424048951048061ffbf6a016a01518d4c240451ff74243089c38b44242c8b542430909090ff128b4424088b48088b098b50248b1283fa53750289ca83fa177570ba24bc86b2e8b2d2feffeb05e9fd000000ff742424ff74242cff742428ff7424148b5c241cb801000000909090e8aa1400008b4d008d49c03b4d087303ff5520894d00c741fc020000008941048b042489018b4424088b50148b128b58388b1b8d710cc746fc050000008b7c2418eb05e941000000897e10895e0c8b5c2414895e088956048b54241089168d4618c740fc01000040c700ec7d7ab28d7808c747fc0400000089770c894708894f04c70733000000eb558b48148b098b50388b128b5d008d5bd83b5d087303ff5520895d00c743fc050000008b74241889731089530c8b542414895308894b048b4c2410890b8d7b18c747fc03000000895f088b1c24895f04c7072d00000083c4088b04248b48148b098b50388b128b5d008d5be83b5d087303ff5520895d00c743fc050000008b74241089731089530c8b54240c895308894b048b4c2408890b8b48088b098b50248b1283fa53750289ca83fa5f75115357ba24bc86b2909090e84ad1feffeb16b85f000000e8d626ffff53578b5c240890e80e25ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c408890883c410c20c008b43288b008b53148b128b733c8b368b7b388b3f53518b4d008d49e83b4d087303ff5520894d00c741fc0500000089711089790c8941088951048b5b18891951bb5cbe86b2b8d8ff87b29090e842d3feff909090e8ea0affff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24048b510cc702030000008b5130909090ff128b4424248b48048b098b50288b128b58148b1b8b703c8b368b78388b3f518b4d008d49e83b4d087303ff5520894d00c741fc0500000089711089790c8951088959048b40188901518b44242cba24bc86b29090e8cecffeff8b45008d40d43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110080088b25a89510c5a895108894104c701250000008d4118c740fc020000005a83c404895004890883c410c20c008b44241c8b50048b128b58288b1b8b70148b368b783c8b3f518b48388b09528b55008d52e83b55087303ff5520895500c742fc05000000897a10894a0c895a088972048b40188902528b442428ba24bc86b2e81ecffeff8b45008d40d43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110380088b25a89510c5a895108894104c701250000008d4118c740fc020000005a895004890883c410c20c005189d8ba24bc86b290e8bacefeff8b45008d40e83b45087303ff5520894500c740fc020000008b0c24894804c7003d00000089c28d400cc740fc02000000894804891083c414c20c008b44241c8b50048b128b58288b1b8b70148b368b783c8b3f518b48388b09528b55008d52e83b55087303ff5520895500c742fc05000000897a10894a0c895a088972048b40188902528b442428ba24bc86b29090e826cefeff8b45008d40d43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c741106c0088b25a89510c5a895108894104c701250000008d4118c740fc020000005a895004890883c410c20c0000000000a40e0000|@13222,2097151,@2473|102,0,$13180+114 713,0,0 720,0,1 734,0,@12740 742,1,@12741 749,0,0 775,0,@12926 798,1,@13181 835,0,@5413 851,0,@13162 867,0,@13184 929,0,14 1004,0,@13176 1010,1,@12930 1056,0,@12740 1062,1,@12741 1111,0,@7817 1199,0,@12740 1206,1,@12741 1236,0,@5413 1253,0,@13186 1270,0,18 1374,0,@12740 1382,1,@12741 1412,0,@5413 1429,0,@13190 1446,0,18 1476,0,@12740 1482,1,@12741 1512,0,0 1536,0,0 1542,1,@13192 1636,0,@12740 1642,1,@12741 1651,0,45 1658,1,@12931 1670,1,@12930 1700,0,@5413 1730,0,17 1759,0,@12740 1766,1,@12741 1808,0,@12740 1814,1,@12741 1905,0,27 1965,0,@13195 1990,1,@13015 2027,0,0 2034,1,@13197 2126,0,@12740 2134,1,@12741 2141,0,46 2146,1,@12931 2158,1,@12930 2188,0,@5413 2227,0,15 2270,0,@12740 2278,1,@12741 2382,0,27 2414,0,@13211 2485,0,@12740 2490,1,@12741 2522,0,0 2530,1,@13212 2635,0,@5413 2660,0,25 2747,0,22 2842,0,@12740 2850,1,@12741 2857,0,47 2862,1,@12931 2874,1,@12930 2986,0,@12744 2991,0,@13215 2998,1,@12747 3006,1,@12914 3040,0,0 3047,0,0 3054,0,3 3060,0,0 3070,0,@6321 3115,0,0 3121,0,1 3134,0,1 3223,0,@12740 3230,1,@12741 3260,0,@5413 3277,0,@13216 3294,0,18 3401,0,@12740 3406,1,@12741 3436,0,@5413 3453,0,@13218 3470,0,18 3500,0,@12740 3506,1,@12741 3542,0,30 3647,0,@12740 3654,1,@12741 3684,0,@5413 3701,0,@13220 3718,0,18 13181:D3,328|3b650c7303ff552453ff7424188b5c24188b442414e84220ffff50ff7004ff308b04248b54240c90ff12a80175248b008b48048339037507ba03000000eb188339017407ba01000000eb0cba03000000eb05ba0100000083fa01746e837c241801756c8b1c24b8510000009090e8a61cf2ffbbd8ef87b29090e89a1cf2ffbb5cbe86b29090e8b6cffeff909090e83e80ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000eb0ae94f000000e94a000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c894808c7400401000000c700010000008b4c24248b513090ff128b44240883c4088b4c240c8b1089118b580483c408895904b801000000c2180090900000000044010000|@13183,2097151,@2457|22,1,@12928 57,0,1 69,0,0 76,0,1 83,0,0 103,0,40 110,1,@4940 115,0,@13182 122,1,@4940 127,0,@12744 134,1,@12747 142,1,@13068 176,0,0 183,0,0 190,0,3 196,0,0 218,0,@6321 266,0,0 272,0,0 311,0,0 13182:S46|292068617320696e666978207374617475732062757420776173206e6f74207072656365646564206279206f702e 13183:S41|50415253455f44454328292e70617273654465632833296765744c6f6e674e6f6e496e666978283729 13184:O1|@13185 13185:D3,16|b801000000c39090000000000c000000|@13166,1,@2458|1,0,0 13186:O7|@13188,2,@5230,@13187,@5229,0,0 13187:O3|2,@5306,@13189 13188:S8|636f6e7643686172 13189:O3|6,@4722,79992 13190:O7|@13191,2,@5230,@13187,@5229,0,0 13191:S7|636f6e76496e74 13192:D3,236|3b650c7303ff55248b45008d40f43b45087303ff5520894500c740fc02000000c700f0f187b28958048060ffbf6a016a0153508d44240850ff7424208b5c241c8b4424208b542428ff128b4424108b48088b098b50248b1283fa53750289ca83fa177553ba24bc86b2e8d2cafeffff74241cff74241cff74241cff74241c8b5c2410b8010000009090e872ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c40cc210008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c2404890883c40cc21000909000000000e8000000|@13194,2097151,@2460|34,0,@13193 101,0,@12740 106,1,@12741 131,0,0 210,0,0 13193:D3,40|3b650c7303ff552483f85b740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2459|19,0,1 13194:S68|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d766172734c697374283129 13195:D3,208|3b650c7303ff5524525389c3b8743b87b2e80619f2ffbb843b87b29090e8fa18f2ffbb5cbe86b29090e816ccfeff909090e8be03ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b51048b5a0c83c404c703030000008b4a3089ca5983c40451ff229000000000cc000000|@13196,1048575,@2461|13,0,@13012 18,1,@4940 23,0,@13013 30,1,@4940 35,0,@12744 42,1,@12747 50,1,@12914 84,0,0 91,0,0 98,0,3 104,0,0 114,0,@6321 159,0,0 165,0,1 183,0,1 13196:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831297265706f7274447570283329 13197:D3,1196|3b650c7303ff55248b4424188b48088b098b50248b1283fa53750289ca83fa73752753ba24bc86b290e85ac8feff8b0424c70001000000c7400401000000b80100000083c404c218008b4d008d49f43b4d087303ff5520894d00c741fc02000000c70168f887b28b5424148951048061ffbf5268a4f887b2535189c38d44240890e8c64dffff8b48048b108b45008d40f43b45087303ff5520894500c740fc02000000894804891051528b5424289090ff128b4424308b48088b098b50248b1283fa53750289ca6a016a0183fa237528ba24bc86b2e8aec7feffff7424108d44240450ff7424308b5c24448b4424308b54243890ff12eb648b542408f6c2017407b903000000eb068b0a8d4c0901f6c101740783f9017e69eb06f641ff107566f6c2017407b903000000eb068b0a8d4c0901f6c101740783f9017e08eb13f641ff10740db8a8f179b28b5d04909090ff13f6c20175110fb64a04eb05e9010200008d4c0901eb0289d1bb6300000089c8ff15c8bd520883f801746b8b4c2408eb0ae948010000e943010000f6c1017407b803000000eb068b018d440001a801740783f8017e08eb11f640ff10740bb8a8f179b28b5d0490ff13f6c101750a0fb641048d440001eb0289c8bb7300000090ff15e8bd520883f80174708b4424388b48288b09eb05e9e30000008b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f57bb5cbe86b2b8e8f887b2909090e8dec8feff909090e88600ffff8b4d008d49e83b4d08730aeb05e97e000000ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24388b510cc702030000008b5130909090ff128b45008d40c43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc01000040c70190cf87b28d5108c742fc01000040c70214f987b28d5a08c743fc050000008953108b54240c89530c894308894b048b44240889038d4b18c741fc02000000895904c7011d000000528d5c240453ff742430ff742430ff742448ff74244089cb8b4424289090e8360200008b44240c8b4c24048b55008d52c83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700ec7d7ab28d5808c743fc050000008953105a83c40489530c8b5424048953088943045883c40889038b4424248b50088b128b78248b3f83ff53750289d783ff17757353ba24bc86b2909090e88ec4feff6a016a01ff742430ff742430ff742430ff742430ff742430ff7424308d5c2418b8010000009090e8dafbffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c240889088b4c240c5a83c4088911894104b801000000eb05e90600000083c40cc218008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000891a8b1c24c70303000000895304b80100000083c40cc21800909000000000a8040000|@13210,2097151,@2469|36,0,@12740 42,1,@12741 51,0,0 58,0,0 63,0,0 99,0,@13198 116,0,@13199 130,1,@13030 209,0,@12740 214,1,@12741 258,0,1 294,0,1 325,0,@4898 362,0,49 370,0,I28 401,0,1 431,0,@4898 459,0,57 466,0,I29 549,0,@12744 554,0,@13200 562,1,@12747 570,1,@12914 611,0,0 618,0,0 625,0,3 631,0,0 641,0,@6321 687,0,0 693,0,1 706,0,1 744,0,@5413 760,0,@13162 776,0,@13201 827,0,14 862,1,@13203 938,0,@5413 1006,0,@12740 1014,1,@12741 1051,0,0 1113,0,0 1157,0,0 1168,0,1 1176,0,0 13198:D3,40|3b650c7303ff552483f85d740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2462|19,0,1 13199:D3,48|3b650c7303ff552483f8237506b803000000c383f85d740583f8177506b803000000c38b5204ff22000000002c000000|@12910,1048575,@2463|14,0,1 30,0,1 13200:S35|203d20706174206578706563746564206166746572206e756d65726963206c6162656c 13201:O1|@13202 13202:D3,16|b801000000c39090000000000c000000|@13166,1,@2464|1,0,0 13203:D3,564|3b650c7303ff5524833b1d7407b901000000eb05b9030000008b55008d52f43b55087303ff5520895500c742fc02000000c70288fb87b28942048062ffbf6a016a01505153ff74242c8d5c241053ff74242c89d38b44242c90e81e0200008b4424188b48088b098b50248b1283fa53750289ca83fa0b756cba24bc86b2e86ec2feff833c240175618b4424188b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f57bb5cbe86b2b858fd87b290e8a2c4feff909090e84afcfeffeb0ae926010000e98a0000008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24188b510cc702030000008b5130909090ff12eb05b8010000006a016a01ff74240c8d44240450ff7424308b5c242c8b4424308b5424289090ff128b4424308b4c24048b55008d52d43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc0400000089500c5b83c4048958088b5c2408895804c700210000008b5c24248903895304b80100000083c410c218008b4c24248b54240889118b54240c895104b80100000083c410c21800900000000030020000|@13209,2097151,@2468|14,0,0 21,0,1 51,0,@13204 90,1,@13205 121,0,@12740 126,1,@12741 203,0,@12744 208,0,@13208 214,1,@12747 222,1,@12914 268,0,0 275,0,0 282,0,3 288,0,0 298,0,@6321 343,0,0 349,0,1 362,0,1 377,0,0 503,0,16 517,0,0 545,0,0 13204:D3,32|3b650c7303ff552483f80b7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2465|14,0,1 13205:D3,288|3b650c7303ff55248b4c24048b51088b128b71248b3683fe53750289d683fe1375765350ff700889c8ba24bc86b2909090e83ec0feff8b45008d40f43b45087303ff5520894500c740fc02000000c700f0fc87b28b4c24088948048060ffbf6a016a01ff7424088d542404528b5c242090e88633ffff8b4424208b4c24048b55008d52d43b55087303ff5520895500c742fc05000000eb05e9620000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc0400000089500c8b5c24248958085f83c408897804c7000b0000008b7c24108b4c240c8944241889542414897c2410894c240c8b5c24045883c404e901ffffff8b4424088b54241089108b5c240c895804b801000000c21000000000001c010000|@13207,2097151,@2467|42,0,@12740 50,1,@12741 80,0,@13206 114,1,@12993 214,0,5 273,0,0 13206:D3,32|3b650c7303ff552483f8137506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2466|14,0,1 13207:S42|50415253455f44454328292e7061727365446563283329646563283429636f6e73747261696e74283429 13208:S32|4578706563746564206964206f722069643a7479206265666f72652060617327 13209:S61|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329636f6e73747261696e744f724c617965726564283329 13210:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831296765744c6162656c73283129 13211:D3,40|3b650c7303ff552483f817740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2470|19,0,1 13212:D3,236|3b650c7303ff55248b45008d40f43b45087303ff5520894500c740fc02000000c70050ff87b28958048060ffbf6a016a0153508d44240850ff7424208b5c241c8b4424208b542428ff128b4424108b48088b098b50248b1283fa53750289ca83fa177553ba24bc86b2e872bdfeffff74241cff74241cff74241cff74241c8b5c2410b8010000009090e872ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c40cc210008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c2404890883c40cc21000909000000000e8000000|@13214,2097151,@2472|34,0,@13213 101,0,@12740 106,1,@12741 131,0,0 210,0,0 13213:D3,40|3b650c7303ff552483f817740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2471|19,0,1 13214:S66|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d7475706c6573283129 13215:S38|5265616c20636f6e7374616e7473206e6f7420616c6c6f77656420696e207061747465726e73 13216:O7|@13217,2,@5230,@13187,@5229,0,0 13217:S8|636f6e765265616c 13218:O7|@13219,2,@5230,@13187,@5229,0,0 13219:S10|636f6e76537472696e67 13220:O7|@13221,2,@5230,@13187,@5229,0,0 13221:S8|636f6e76576f7264 13222:S55|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129 13223:S44|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837292d45 13224:O1|@13225 13225:D3,716|83f84d7506b803000000c383f8417506b803000000c383f83f7506b803000000c383f8437506b803000000c389c1ba520188b28d548afcffe290e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c383f80d740583f8317506b803000000c383f8797406b801000000c3b803000000c390909000000000c8020000|@12910,7,@2475|6,0,1 17,0,1 28,0,1 39,0,1 47,0,$13225+58 608,0,0 615,0,1 622,0,1 629,0,1 636,0,1 643,0,1 650,0,1 657,0,1 667,0,1 683,0,1 694,0,0 700,0,1 13226:D3,200|3b650c7303ff55246a016a016a016a0153ff742424ff742424ff742430ff742438ff742428538d5c241cb8010000009090e8a60000008b442410a801740783f8017d25eb06f640ff10741d8b4424088b4c241c8b1089118b5804895904b80100000083c414c21c0068d41687b2ff742408ff742410ff74241850ff742438ff742438ff742444ff74244cff74243cff742428bb01000000b8ffffffff90e8b20500008b48048b54241c8b19891a8b7104897204b80100000083c414c21c00909000000000c4000000|@13249,2097151,@2484|43,0,0 50,1,@13227 94,0,0 105,0,@12944 147,0,0 152,0,-1 158,1,@13234 180,0,0 13227:D3,516|3b650c7303ff55248b45008d40f03b45087303ff5520894500c740fc03000000c700ec0688b28b4c24148948048b5424188950088060ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706380788b2894e048b7c2410897e088066ffbf6a016a0153508d5c240889f08b54241cff126a016a01ff7424088d44240450ff742428ff742434ff742440ff742430ff74243c8b5c24308b44242c9090e8120200008b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40889086a016a016a018b4c24208b51088b128b59248b1b83fb53750289d35089d88b542434909090ff1283f8017453ff7424248b5c24348b4424389090e8fa08ffffff7004ff308b04248b5424289090ff1283f801750e89c1b84cc37bb28b5d049090ff138b008d4c240c5a89118d4c24085a8951048d4c24048b4004894108eb208d442404c70048c052088d442404c74004e01687b28d442404c7400860877ab26a016a018b442414833805751389e0c700ffffffff89e0c7400401000000eb27833803751289e18b4004890189e0c7400403000000eb1089e18b4004890189e0c74004010000008b45008d40f43b45087303ff5520894500c740fc020000008b4c24108948048b4c240c89088b4c24188b54240489118b5424088951048941085883c41489410cb80100000083c40cc218000000000000020000|@13233,2097151,@2480|34,0,@13228 82,0,@13229 162,1,@13230 262,1,@12928 290,0,@6769 336,0,I48 347,0,@12945 358,0,@5515 379,0,-1 388,0,0 411,0,1 429,0,0 498,0,0 13228:D3,56|3b650c7303ff552450528b4a0889ca90ff1283f8017409b80300000083c408c38b04248b480483c4045889caff2290900000000034000000|@12910,1048575,@2476|24,0,1 13229:D3,64|3b650c7303ff552450528b4a0889ca90ff1283f8017507837c24044d7509b80300000083c408c38b04248b480483c4045889caff22909090000000003c000000|@12910,1048575,@2477|31,0,1 13230:D3,472|3b650c7303ff55248b4c24148b51088b128b71248b3683fe53750289d6535089f08b542418909090ff1283f80174618b44241c8b48088b098b50248b1283fa53750289ca89d08b5424149090ff1283f80174488b44241c8b48048b0989c88b5424109090ff12a80175318b008b4804833903740583390175228b5424208b1c24891a8b5c2404895a04b801000000eb05e91e01000083c408c21c008b45008d40f03b45087303ff5520894500c740fc030000009090c700780988b28b4c24248948048b5424188950088060ffbf6a016a0189e38b54241490ff128b44240c8b4c24048b55008d52c83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700ec7d7ab28d5808c743fc05000000895310c7430c010000008943085883c4048943048b042489038b45008d40f43b45087303ff5520894500c740fc02000000895804c700050000008b5c24248b7c24208b4c241c8b742418528b542418508b442418508b442418895c2430897c242c894c2428897424248954242059894c2418894424148b5c24045883c40ce94dfeffff8b4424208b0c2489088b4c2404894804b80100000083c408c21c00909000000000d4010000|@13232,1048575,@2479|138,0,0 183,0,@13231 290,0,@5413 310,0,0 358,0,2 452,0,0 13231:D3,56|3b650c7303ff552450528b4a0889ca90ff1283f8017409b80300000083c408c38b04248b480483c4045889caff2290900000000034000000|@12910,1048575,@2478|24,0,1 13232:S61|50415253455f44454328292e70617273654465632833296465632834297061727365496e66697828372970617273654170706c69636174696f6e283329 13233:S56|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729726561644e6578744f7073283129 13234:D3,944|3b650c7303ff55246a016a016a016a015350ff742430ff742430ff742430ff742430ff742430ff7424308d5c2420b8010000009090e84efaffff8b45008d40dc3b45087303ff5520894500c740fc040000008b4c241489480c8b5424108950088b5c240c8958048b74240889308d7814c747fc030000008b4c2434894f088b5424388957048b5c2440891f50ff74242489c389f890e82a0300008b442418a801740ff64424380174083b4424387e07eb20ff5538ebf3837c244401744fa801750af6442438017503ff55383b442438753bff74243cff742410ff742418ff74242050ff742448ff742448ff742448ff742448ff742448ff7424488b5c24708b442464909090e8f6feffffeb038b04248b4c243c83c4048b55008d52c43b55087303ff5520895500c742fc01000040c702ec7d7ab28d5a08c743fc01000040c70390cf87b28d7308c746fc01000040c7068c1188b28d7e08c747fc050000008977108b710489770c895708895f048b1189178d5f18c743fc02000000897b04c7031d0000008b7c243c8b50048b4f048b72048b7d008d7fe83b7d087303ff5520897d00c747fc050000008b51108957108b560c89570c8b51088957088b76048977048b3189378b74243c8b48048b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000508b0189028b45008d408c3b45087303ff5520894500c740fc020000008950048b3689308d480cc741fc01000040c701ec7d7ab28d5108c742fc04000000897a0c894a08894204c702330000008d4214c740fc01000040c700ec7d7ab28d4808c741fc05000000897910c7410c0300000089410889510489198d4118c740fc02000000894804c700050000008d480cc741fc0200000089790489018b04248d510cc742fc040000008b580c895a0c8b7008897208894a048b38893a8b75008d76f03b75087303ff5520897500c746fc030000008b5c2404895e088b5c2448895e048b7c2408893eff700cff700851ff3052ff7424388b5c241889f0909090e8d60000008b4424148b480cf6c101740ff64424180174083b4c24187e07eb21ff5538ebf3f6c101750af6442418017503ff55383b4c2418756b837c241c0174698b54245c8b5c24488b7424448b7c24408b44243c8b4c2438518b4c2438895424608b5424088954245c8b54240c895424588b542410895424548b54241489542450895c244c89742448897c2444894424405889442438894c24348b5c241c83c41858eb0ae90d000000e90800000083c414e960fcffff5883c42cc22c009000000000ac030000|@13248,2097151,@2483|47,0,0 54,1,@13227 150,1,@13235 304,0,@5413 320,0,@13162 336,0,@13246 384,0,14 487,0,0 539,0,@5413 564,0,25 580,0,@5413 600,0,1 627,0,2 746,1,@13235 13235:D3,604|3b650c7303ff55248b4808f6c1017509f6430c017503ff55383b4b0c75628b103b1374618b7424048b7e288b3f8b4e148b098b563c8b12538b5e388b1b508b45008d40e83b45087303ff5520894500c740fc0500000089501089580c8978088948048b761889308b0c248b51048b5c24048b73088339017511bf801088b2eb0fe9c6010000e9c1010000bf8c1088b2833b017507b9801088b2eb05b98c1088b28b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c743049c1088b2890b8d4b0cc741fc02000000895904c701c01088b28d590cc743fc02000000894b048b0e890b8b4d008d49b83b4d087303ff5520894d00c741fc02000000895904c701d01088b28d590cc743fc02000000894b04893b8d4b0cc741fc02000000895904c701c01088b28d590cc743fc02000000894b048b0a890b8d7b0cc747fc02000000895f04c707ec1088b28d5f0cc743fc02000000897b048b3689338b75008d76dc3b75087303ff5520897500c746fc02000000895e04c706141188b28d5e0cc743fc02000000897304890b89c68d430cc740fc02000000895804c700241188b2569090e8a601f2ffbb5cbe86b29090e8f6aefeff909090e89ee6feff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a83c40889500c894808c7400401000000c700030000008b4c24048b510cc702030000008b51305b83c40453ff22b801000000c20400900000000058020000|@13245,1048575,@2481|122,0,@13236 139,0,@13237 149,0,@13236 156,0,@13237 187,0,@13238 208,0,@13240 258,0,@13241 292,0,@13240 328,0,@13242 378,0,@13243 414,0,@13244 422,1,@4953 427,0,@12744 434,1,@12747 442,1,@12914 476,0,0 483,0,0 490,0,3 496,0,0 506,0,@6321 554,0,0 560,0,1 573,0,1 588,0,0 13236:S4|6c656674 13237:S5|7269676874 13238:O2|@13239,0 13239:S13|2d6173736f636961746976652e 13240:S5|2220697320 13241:S20|2d6173736f63696174697665207768696c652022 13242:S32|222068617665207468652073616d6520707265636564656e6365206275742022 13243:S7|2220616e642022 13244:S11|4f70657261746f72732022 13245:S75|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729636865636b4173736f636961746976697479283229 13246:O1|@13247 13247:D3,16|b801000000c39090000000000c000000|@13166,1,@2482|1,0,0 13248:S54|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729 13249:S42|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729 13250:S14|456e64206f66207061747465726e 13251:S39|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329 13252:D3,1872|3b650c7303ff5524833805754a6a016a016a016a01538d5c2404909090e8420700008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c8908eb6883382d75688b480483390575476a016a016a016a01538d5c2404e8ee0600008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c8908eb708b53288b128b73148b368b7b3c8b3f8b4338eb0ae931060000e99f0100008b008b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089410c8951088971048b431889015351bb5cbe86b2b8602188b290e842abfeff909090e8eae2feff8b4d008d49e83b4d08730aeb05e9d5050000ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b510cc702030000008b5130ff128b04248b482883c4048b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b401889078b45008d40b43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc03000000897908894104c70148c052088d4110c740fc030000008b51088950088b59048958048b3189308d7810c747fc030000008b70088977088b5804895f048b08890f8d4710c740fc04000000c7400c01000000c7400801000000897804c70001000000eb6183380b75618b480883392d755e8b5104833a05755b6a016a016a016a01ff7004538d5c240889c89090e8ce0400008b45008d40e43b45087303ff5520894500c740fc0100000059890889c18d4008c740fc0400000089480c8b4c2408894808eb14e927040000e9dd030000e9c4010000e90f0000008b4c24048948045983c40c8908eb708b73288b368b7b148b3f8b433c8b008b4b388b098b55008d52e83b55087303ff5520895500c742fc05000000894210894a0c897208897a048b431889025352bb5cbe86b2b8602188b2e80ea9feff909090e8b6e0feff8b4d008d49e83b4d087303ff5520894d00c741fc05000000eb05e994030000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b510cc702030000008b5130ff128b04248b482883c4048b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b401889078b45008d40b43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc03000000897908894104c70148c052088d4110c740fc030000008b51088950088b59048958048b3189308d7810c747fc030000008b70088977088b5804895f048b08890f8d4710c740fc04000000c7400c01000000c7400801000000897804c70001000000eb5e833905755e6a016a016a016a01ff7004538d5c240889c89090e8aa0200008b45008d40e43b45087303ff5520894500c740fc0100000059890889c18d4008c740fc0400000089480c8b4c24088948088b4c24048948045983c40c8908eb76e9f60100008b53288b128b73148b368b7b3c8b3f8b43388b008b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089410c8951088971048b431889015351bb5cbe86b2b8602188b290e8faa6feff909090e8a2defeff8b4d008d49e83b4d087303ff5520894d00c741fc05000000eb05e980010000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b510cc702030000008b5130ff128b04248b482883c4048b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b401889078b45008d40b43b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc03000000897908894104c70148c052088d4110c740fc030000008b51088950088b59048958048b3189308d7810c747fc030000008b70088977088b5804895f048b08890f8d4710c740fc04000000c7400c01000000c7400801000000897804c70001000000eb456a016a016a016a0189e0909090e8b20800008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c89088b4804ba010000008b18f6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdf89c38b45008d40f03b45087303ff5520894500c740fc030000008950088b098948048918c3909090000000004c070000|@13261,1048575,@2489|30,1,@13253 114,1,@13253 247,0,@12744 252,0,@13257 258,1,@12747 266,1,@12914 307,0,0 314,0,0 321,0,3 327,0,0 337,0,@6321 383,0,0 389,0,1 401,0,1 503,0,@5413 525,0,I48 594,0,0 601,0,0 610,0,0 658,1,@13253 812,0,@12744 817,0,@13257 822,1,@12747 830,1,@12914 871,0,0 878,0,0 885,0,3 891,0,0 901,0,@6321 947,0,0 953,0,1 965,0,1 1067,0,@5413 1089,0,I48 1158,0,0 1165,0,0 1174,0,0 1206,1,@13253 1343,0,@12744 1348,0,@13257 1354,1,@12747 1362,1,@12914 1403,0,0 1410,0,0 1417,0,3 1423,0,0 1433,0,@6321 1479,0,0 1485,0,1 1497,0,1 1599,0,@5413 1621,0,I48 1690,0,0 1697,0,0 1706,0,0 1726,1,@13259 1785,0,0 13253:D3,1668|3b650c7303ff552483382d755d8b4804833905755a8b51048b32833e1d756b837a0c03756a8b7e048b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc030000008b770c8971088941048b0789018b45008d40f43b4508730feb0ae979010000e940000000ff5520894500c740fc02000000c7400401000000eb0ae925000000e9200000008b520489108903894b04c7430803000000c7430c01000000b801000000c2040053ff7008bb5cbe86b2b8702088b2909090e81aa4feff909090e8c2dbfeff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000008b142489500c894808c7400401000000c700030000008b4c240c8b590cc703030000008b513090ff128b45008d40c83b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc030000005a895108894104c70148c052088d4110c740fc030000008b51088950088b59048958048b3189308d7810c747fc030000008b70088977088b5804895f048b08890f8b1424c70201000000897a04c7420801000000c7420c01000000b80100000083c404c2040083381d75578b48048b55008d52e83b55087303ff5520895500c742fc01000040c702ec7d7ab28d7208c746fc030000008b790c897e088956048b118916c70301000000897304c7430801000000c7430c01000000b801000000c2040083380575538b480483790c0375578b5104833a33755bf6420401755a8b7204f646040175568b7e04837f0401756b8b0683380575695352ff31ff720cbb5cbe86b2b8c02088b2909090e852a2feff909090e8fad9feffeb05e9370200008b4d008d49e8eb05e9a20000003b4d087314eb0fe996000000e991000000e98c000000ff5520894d00c741fc05000000894110c7410c01000000eb0ae96e000000e969000000c7410801000000c7410407000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24108b510cc702030000008b5130909090ff12eb5383790c0375528b41048338337559f640040175588b5004f642040175668b7204837e040175628b3e833f0575605350ff31ff700cbb5cbe86b2b8c02088b2909090e84ea1feff909090e8f6d8feff8b4d00eb0ae9b3000000e9a30000008d49e83b4d08730feb0ae994000000e98f000000ff5520894d00c741fc05000000894110eb0fe978000000e973000000e96e000000c7410c01000000c7410801000000c7410407000000c70101000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24108b510cc702030000008b5130909090ff12eb0bb80100000053ff7104ff316a016a016a016a01ff7424208d5c24048b4424149090e88afbffff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c2414890883f80175058b0424eb0d89c38b0424909090e87e0200008b4c241883c4048901588941045883c40c894108c7410c01000000b80100000083c404c204008b4424048b48288b098b50148b128b703c8b368b78388b3f538b5d008d5be83b5d087303ff5520895d00c743fc05000000897310897b0c894b088953048b4018890353bb5cbe86b2b8602188b2e8ba9ffeff909090e862d7feff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24088b510cc702030000008b5130909090ff128b4424088b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fb03b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f8d5718c742fc01000040c702ec7d7ab28d5a08c743fc03000000897b08895304c70348c052088d5310c742fc030000008b73088972088b7b04897a048b0389028d4a10c741fc030000008b42088941088b7a048979048b1a89198b3424c70601000000894e04c7460801000000c7460c01000000b80100000083c404c2040090900000000080060000|@13258,1048575,@2487|66,0,@5413 132,0,0 161,0,1 168,0,0 173,0,0 185,0,@12744 190,0,@13254 198,1,@12747 206,1,@12914 240,0,0 247,0,0 254,0,3 260,0,0 270,0,@6321 317,0,0 323,0,1 336,0,1 372,0,@5413 395,0,I48 456,0,0 466,0,0 473,0,0 478,0,0 522,0,@5413 551,0,0 561,0,0 568,0,0 573,0,0 641,0,@12744 646,0,@13255 654,1,@12747 662,1,@12914 727,0,0 746,0,0 753,0,3 759,0,0 769,0,@6321 815,0,0 821,0,1 834,0,1 901,0,@12744 906,0,@13255 914,1,@12747 922,1,@12914 997,0,0 1004,0,0 1011,0,3 1017,0,0 1027,0,@6321 1071,0,0 1077,0,1 1090,0,1 1105,0,0 1169,0,0 1198,1,@13256 1225,0,0 1230,0,0 1308,0,@12744 1313,0,@13257 1318,1,@12747 1326,1,@12914 1360,0,0 1367,0,0 1374,0,3 1380,0,0 1390,0,@6321 1435,0,0 1441,0,1 1454,0,1 1543,0,@5413 1565,0,I48 1626,0,0 1636,0,0 1643,0,0 1648,0,0 13254:S70|506172656e74686573657320617265206f6e6c7920616c6c6f77656420666f7220696e6669786564206170706c69636174696f6e7320696e2066756e2062696e64696e67732e 13255:S63|436f6e7374727563746f72206170706c69636174696f6e7320696e2066756e2062696e64696e6773206d75737420626520706172656e74686573697365642e 13256:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2486| 13257:S79|53796e746178206572726f723a2066756e2062696e64696e67206973206e6f7420616e206964656e746966696572206170706c69656420746f206f6e65206f72206d6f7265207061747465726e732e 13258:S37|50415253455f5452454528292e6d6b46756e5061747465726e283229756e7069636b283129 13259:D3,444|3b650c7303ff55248b4b288b098b53148b128b733c8b368b7b388b3f508b45008d40e83b45087303ff5520894500c740fc0500000089701089780c8948088950048b4b1889085350bb5cbe86b2b8602188b2909090e87a9cfeff909090e822d4feff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b510cc702030000008b5130ff128b04248b482883c4048b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b401889078b45008d40c83b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc03000000897908894104c70148c052088d4110c740fc030000008b51088950088b59048958048b3189308d7810c747fc030000008b70088977088b5804895f048b08890f8b1424c70201000000897a04c7420801000000c7420c01000000b80100000083c404c300000000b8010000|@13260,1048575,@2488|73,0,@12744 78,0,@13257 86,1,@12747 94,1,@12914 128,0,0 135,0,0 142,0,3 148,0,0 158,0,@6321 203,0,0 209,0,1 221,0,1 323,0,@5413 345,0,I48 406,0,0 416,0,0 423,0,0 428,0,0 13260:S49|50415253455f5452454528292e6d6b46756e5061747465726e283229617267737c6e616d657c756e7069636b65642d2f35 13261:S28|50415253455f5452454528292e6d6b46756e5061747465726e283229 13262:S31|5468697320636c6175736520646566696e65732066756e6374696f6e206060 13263:S36|2727206275742070726576696f757320636c6175736528732920646566696e6564206060 13264:S16|5468697320636c617573652068617320 13265:S38|20617267756d656e7473206275742070726576696f757320636c617573652873292068616420 13266:D3,32|3b650c7303ff552483f87d7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2490|14,0,1 13267:D3,2872|3b650c7303ff55248b4c24108b51088b128b71248b3683fe53750289d683fe2f740d89f2bf1e2588b28d7c97fcffe7e9520600009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083fe317407ba01000000eb2fba03000000eb28ba03000000eb21ba03000000eb1aba03000000eb13ba03000000eb0cba03000000eb05ba0300000083fa01753c83fe23743c83fe0d743c83fe31743c83fe41743c83fe43743c83fe3f743c83fe4d743c83fe45743c83fe27743c83fe0f743c81fe810000007439eb3ce9af030000e9aa030000e9a5030000e9a0030000e99b030000e996030000e991030000e98c030000e987030000e982030000e97d030000e97803000083fe33744c83fe55744c505389cbb8343088b2e8fee7feff8b4424188b48088b098b50248b1283fa53750289ca5289d08b5424049090ff1283f801751e833c242f741d8b0424b95e2888b28d4c81fcffe1e922030000e91d030000e91c030000e917030000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9ff010000909090e9e3010000909090e9f6010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94d010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9ec000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9ab000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93a000000909090833c24317407b801000000eb2fb803000000eb28b803000000eb21b803000000eb1ab803000000eb13b803000000eb0cb803000000eb05b80300000083f801753e833c2423743d833c240d743c833c2431744a833c24417449833c24437448833c243f7447833c244d7446833c24457458833c24277457833c240f7456eb0fe970000000e96b000000e966000000813c2481000000745d833c2433eb19e952000000e94d000000e948000000e943000000e93e000000743c833c245574368b44241cba24bc86b2eb0fe926000000e921000000e91c000000909090e8d290feff83c4043b650c7303ff5524e9a0fcffff50536a018b44241c8b48088b098b50248b1283fa53750289ca83fa2f740d89d1bb9e2b88b28d5c8bfcffe3e9e2020000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083fa317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901753c83fa23743c83fa0d743c83fa31743c83fa41743c83fa43743c83fa3f743c83fa4d743c83fa45743c83fa27743c83fa0f743c81fa810000007439eb3ce941000000e93c000000e937000000e932000000e92d000000e928000000e923000000e91e000000e919000000e914000000e90f000000e90a00000083fa33740583fa55756e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701483088b28b5424048951048061ffbf6a016a0150ff742414bb7c3088b253ff74242cff74242cff74242c8d5c241889c8909090e8b20100008b4424248b48088b098b50248b1283fa53750289ca83fa2d7572eb05e9d0000000ba24bc86b290e8328dfeff6a016a01ff74242cff74241cb87c3088b250ff742434ff742434ff7424348d5c24188b44242c90e8763500008b44240c8b4c24048b55008d52d03b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a08eb05e9450000008b7904897a048b18891a8d4218c740fc050000008b5c240489581089500c5b83c4048958088b1c24895804c7001b0000008b5c24288903895304b80100000083c414c214008b4c24288b142489118b542404895104b80100000083c414c214008b48288b098b50148b128b583c8b1b8b70388b368b7d008d7fe83b7d087303ff5520897d00c747fc05000000895f1089770c894f088957048b4818890f8b542420c702b4047db2897a04b80100000083c40cc2140000000000340b0000|@13329,2097151,@2535|37,0,$13267+54 604,0,0 611,0,1 618,0,1 625,0,1 632,0,1 639,0,1 646,0,1 653,0,1 714,0,64 797,0,@13268 802,1,@12930 853,0,$13267+886 1437,0,0 1444,0,1 1451,0,1 1458,0,1 1465,0,1 1472,0,1 1479,0,1 1486,0,1 1575,0,64 1625,0,@12740 1650,1,@12741 1703,0,$13267+1718 2268,0,0 2275,0,1 2282,0,1 2289,0,1 2296,0,1 2303,0,1 2310,0,1 2317,0,1 2378,0,64 2482,0,@13269 2507,0,@13270 2534,1,@13271 2572,0,@12740 2578,1,@12741 2595,0,@13270 2622,1,@13314 2728,0,13 2742,0,0 2769,0,0 2846,0,@7817 2854,0,0 13268:S10|45787072657373696f6e 13269:D3,32|3b650c7303ff552483f82d7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2491|14,0,1 13270:O1|@13267 13271:D3,80|3b650c7303ff55248b4c24188b5424148b7424108b7c240c508b44240c538b5c240c894c24208954241c89742418897c241489442410895c240c8b5c24045883c404e91d00000090000000004c000000|@13328,2097151,@2534|67,1,@13272 13272:D3,324|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701403288b28959048061ffbf6a016a015053ff742428ff742428ff742428ff742428ff742428ff7424288d5c242089c8e8360100008b4424288b48088b098b50248b1283fa53750289ca83fa517570ba24bc86b2e8ce8afeff6a016a01ff742430ff742430ff742430ff742430ff742430ff7424308b5c24208d442418909090e85affffff8b4424148b4c24048b55008d52d43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a04eb05e9390000008b18891a8d4218c740fc0400000089500c5b83c4048958088b5c2408895804c7002b0000008b5c24048903895304b80100000083c410c218008b4c24048b54240889118b54240c895104b80100000083c410c2180090900000000040010000|@13327,2097151,@2533|34,0,@13273 82,1,@13274 113,0,@12740 118,1,@12741 262,0,21 276,0,0 304,0,0 13273:D3,32|3b650c7303ff552483f8517506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2492|14,0,1 13274:D3,80|3b650c7303ff55248b4c24188b5424148b7424108b7c240c508b44240c538b5c240c894c24208954241c89742418897c241489442410895c240c8b5c24045883c404e91d00000090000000004c000000|@13326,2097151,@2532|67,1,@13275 13275:D3,324|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701303488b28959048061ffbf6a016a015053ff742428ff742428ff742428ff742428ff742428ff7424288d5c242089c8e8360100008b4424288b48088b098b50248b1283fa53750289ca83fa077570ba24bc86b2e8de88feff6a016a01ff742430ff742430ff742430ff742430ff742430ff7424308b5c24208d442418909090e85affffff8b4424148b4c24048b55008d52d43b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a04eb05e9390000008b18891a8d4218c740fc0400000089500c5b83c4048958088b5c2408895804c700030000008b5c24048903895304b80100000083c410c218008b4c24048b54240889118b54240c895104b80100000083c410c2180090900000000040010000|@13325,2097151,@2531|34,0,@13276 82,1,@13277 113,0,@12740 118,1,@12741 262,0,1 276,0,0 304,0,0 13276:D3,32|3b650c7303ff552483f8077506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2493|14,0,1 13277:D3,2564|3b650c7303ff55248b4c24188b51088b128b71248b3683fe53750289d68b51288b128b793c8b3f53bb9a3488b28d5cb3fcffe3909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9aa020000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e9e5030000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e9a5040000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e930060000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e936060000909090e913000000909090e90b000000909090e9030000009090908b4d008d49f43b4d087303ff5520894d00c741fc02000000c7017c3e88b28941048061ffbf8b5424186a016a01ff74241cff742414ff74241cff74242452ff74243868b83e88b250ff72088d5c24085368645e88b268907e87b2518d4c243451ff74245c8b5a048b029090e8ceccffff8b45008d40f43b45087303ff5520894500c740fc02000000c7005c6188b25983c41c8948048060ffbf8b4c24208b5424245b895c24205b895c24188b1c24895c24148954241089c389c883c4045e83c40856e93bc4ffff505752ff71188b44242cba24bc86b290e89a84feff8b45008d40f43b45087303ff5520894500c740fc02000000c700906188b28b4c240c8948048060ffbf6a016a0189e252ff742438ff742430ff742430ff74243089c38b4424448b542440ff128b4424348b48088b098b50248b1283fa53750289ca83fa4b750cba24bc86b2e82a84feffeb16b84b000000e8b6d9feff8b5c2434909090e8eed7feff8b45008d40f43b45087303ff5520894500c740fc02000000c7006c6488b28b4c24148948048060ffbf6a016a01ff74243cff74243cff74243cff74243cff74243cff74243c8d5c24189090e8322c00008b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424188951108b500c89510c8b5c24148959088b58048959048b74241089318b75008d76e03b75087303ff5520897500c746fc01000040c706ec7d7ab28d7e08c747fc05000000894710894f0c8977085e83c4048977045e83c41489378b75008d76f43b75087303ff5520897500c746fc02000000897e04c706070000008b3c248937894f04b80100000083c404c21800505752ff71188b44242cba24bc86b29090e8fe82feff8b45008d40f43b45087303ff5520894500c740fc02000000c7009c6e88b28b4c240c8948048060ffbf6a016a01ff742434ff742434ff742434ff742434ff742434ff7424348d5c24189090e81e2b00008b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424108951108b500c89510c8b5c240c8959088b58048959048b74240889318b75008d76e43b75087303ff5520897500c746fc01000040c706ec7d7ab28d7e08c747fc04000000894f0c5b83c414895f08897704c707170000008b1c24893b894b04b80100000083c404c21800505752ff71188b44242cba24bc86b29090e80e82feff8b45008d40f43b45087303ff5520894500c740fc02000000c700d06e88b28b4c240c8948048060ffbf6a016a0189e252ff742438ff742430ff742430ff74243089c38b4424448b542440ff128b4424348b48088b098b50248b1283fa53750289ca83fa6f750cba24bc86b2e89e81feffeb16b86f000000e82ad7feff8b5c2434909090e862d5feff8b45008d40f43b45087303ff5520894500c740fc02000000c700007288b28b4c24148948048060ffbf6a016a0189e252ff742440ff742438ff742438ff74243889c38b44244c8b542448ff128b44243c8b48088b098b50248b1283fa53750289ca83fa1d750cba24bc86b2e81681feffeb16b81d000000e8a2d6feff8b5c243c909090e8dad4feff6a016a0189e050ff742448ff742440ff742440ff7424408b5c24388b4424548b542450909090ff128b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424208951108b500c89510c8b5c241c8959088b58048959048b74241889318b75008d76d43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc01000040c707010000008d5f08c743fc06000000897314897b10894b0c8b7424088973085e83c40c8973045e83c41489338b75008d76f43b75087303ff5520897500c746fc02000000895e04c706090000008b1c248933894b04b80100000083c404c21800505752ff71188b44242cba24bc86b2909090e8fa7ffeff6a016a0189e050ff742438ff742430ff742430ff7424308b5c24288b4424448b542440909090ff128b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424108951108b500c89510c8b5c240c8959088b58048959048b74240889318b75008d76f03b75087303ff5520897500c746fc03000000894e085f83c414897e04c7062f0000008b3c248937894f04b80100000083c404c21800505752ff71188b44242cba24bc86b290e8467ffeff8b45008d40f43b45087303ff5520894500c740fc02000000c700307588b28b4c240c8948048060ffbf6a016a0189e252ff742438ff742430ff742430ff74243089c38b4424448b542440ff128b4424348b48088b098b50248b1283fa53750289ca83fa1b7570ba24bc86b2e8d67efeff6a016a0189e050ff742440ff742438ff742438ff7424388b5c24308b44244c8b542448909090ff128b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424188951108b500c89510c8b5c24148959088b58048959048b7424108931eb05e9560000008b75008d76e03b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc05000000897710894f0c8b7424088977085e83c404897704c7073b0000008b742418893e894e04b80100000083c41cc21800b81b00000090e8a2d3feff8b5c2434909090e8dad1feff8b442434ba24bc86b29090e8ee7dfeff8b4424188b0c2489088b4c2404894804b80100000083c41cc2180090909000000000000a0000|@13324,2097151,@2530|41,0,$13277+54 624,0,@13278 665,0,@13279 679,0,@13309 684,0,@13095 706,1,@13226 736,0,@13311 793,1,@13205 808,0,@12740 814,1,@12741 844,0,@13312 921,0,@12740 926,1,@12741 933,0,37 938,1,@12931 950,1,@12930 980,0,@13313 1030,1,@13314 1120,0,@5413 1185,0,3 1198,0,0 1219,0,@12740 1226,1,@12741 1256,0,@13320 1306,1,@13314 1396,0,@5413 1425,0,11 1438,0,0 1459,0,@12740 1466,1,@12741 1496,0,@13321 1573,0,@12740 1578,1,@12741 1585,0,55 1590,1,@12931 1602,1,@12930 1632,0,@13322 1709,0,@12740 1714,1,@12741 1721,0,14 1726,1,@12931 1738,1,@12930 1868,0,0 1884,0,0 1956,0,4 1969,0,0 1990,0,@12740 1998,1,@12741 2138,0,23 2151,0,0 2172,0,@12740 2178,1,@12741 2208,0,@13323 2285,0,@12740 2290,1,@12741 2427,0,0 2463,0,29 2477,0,0 2488,0,13 2494,1,@12931 2506,1,@12930 2515,0,@12740 2522,1,@12741 2543,0,0 13278:D3,40|3b650c7303ff552483f813740583f8077506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2494|19,0,1 13279:D3,64|3b650c7303ff552453ff7208ff720cff7210ff7214ff72188b5a049090e8320000008b0c248b1089118b5804895904b80100000083c404c3000000003c000000|@13223,2097151,@2518|30,1,@13280 48,0,0 13280:D3,5072|8d7c24b03b7d0c7303ff55288b4b088b098b53248b1283fa53750289ca8b4b288b098b733c8b3683fa45757350535651ff731889d8ba24bc86b2909090e8e27cfeff8b4424286a016a016a018b7808ff70048d5c2404b8010000009090e892acfeff8b45008d40f03b45087303ff5520894500c740fc03000000c700f05288b25983c4048948048b4c24048948088060ffbf8b4d008d49f03b4d08730aeb05e979020000ff5520894d00c741fc030000008979088941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000c700385388b28b5424108950048060ffbf51ff742410ff74242cff74242cff74242c89cbe82a84ffff8b4c24108b51088b128b59248b1b83fb53750289d383fb3575105089c8ba24bc86b290e8fe7bfeffeb1a89c3b8350000009090e886d1feff538b5c24149090e8becffeff8b45008d40f43b45087303ff5520894500c740fc02000000c7006c5388b28b4c24188948048060ffbfff742424ff74242cff742434ff74242050ff742418ff74243868a85388b2ff7424348d44240450bbe84487b2b86100000090e842e8feff8b4c243483c4208b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2410897e10895e0c8b5c240c895e088956048b54240889168b51088b128b59248b1b83fb53750289d383fb1f751156ff3089c8ba24bc86b2e81a7bfeffeb1a8b18b81f0000009090e8a2d0feff56538b5c241c90e8dacefeff8b44241c8b48088b098b50248b1283fa53750289ca89d08b542420909090ff1283f80175548b5c241cb8f05388b290e8a6cefeff8b44241c8b48088b098b50248b1283fa53750289ca89d08b542420909090ff1283f80175198b44241cba24bc86b290e8967afeff3b650c7303ff5524ebc2b801000000eb05b8010000008b44240890e85612000089c358e8da1200008b4d008d49c83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc05000000894a108b0c24894a0cc7420801000000895a0489028d4218c740fc02000000895004c7002700000089c28d400cc740fc02000000894804891083c420c2140083fa41756c50535651ff731889d8ba24bc86b290e8ee79feff8b44240c8b48148b098b50388b128b58088b1b8b70248b3683fe53750289de83fe5d75715251ba24bc86b2e8be79feff8b45008d40e83b45087303ff5520894500c740fc050000008b4c24108948108b4c240489480ceb05e9b20100008b4c240c8948085983c4048948048b0c2489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7013700000089c2eb05e9150000008d410cc740fc02000000895004890883c414c214008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701285588b28941048061ffbf6a016a016a0189e389c890e8d6f8feffff742434ff74242cff742434ff74243cff742434ff742418ff742430ff74243868605688b2ff74243c8d44240450bbe84487b2b817000000909090e88ae5feff8b4c243c83c4308b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956048b142489168b55008d52e03b55087303ff5520895500c742fc01000040c702ec7d7ab28d5a08c743fc050000008973108b0089430c895308c7430403000000c7031f0000008b41088b008b51248b1283fa53750289c283fa5d7512565389c8ba24bc86b29090e82278feffeb16b85d000000e8aecdfeff56538b5c241490e8e6cbfeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c404890883c414c2140083fa43756c50535651ff731889d8ba24bc86b290e8c677feff8b44240c8b48148b098b50388b128b58088b1b8b70248b3683fe53750289de83fe5f75715251ba24bc86b2e89677feff8b45008d40e83b45087303ff5520894500c740fc050000008b4c24108948108b4c240489480ceb05e9a60300008b4c240c8948085983c4048948048b0c2489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7013700000089c2eb05e9150000008d410cc740fc02000000895004890883c414c214008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f85888b28b5424108951048061ffbf6a016a0189e35350ff742434ff742434ff74243489cb8b4424448b542434ff128b4424148b48088b098b50248b1283fa53750289ca6a016a0183fa617572ba24bc86b2e8a676feff8b45008d40f43b45087303ff5520894500c740fc02000000c700385988b28b4c24208948048060ffbfff74242cff742434ff74243cff74242850ff74244cff74244068745988b2ff74243c8d44240450bbe84487b2b86100000090e806e3feff8b4d008d49dceb05e98a0000003b4d087303ff5520894d00c741fc020000008b0083c4208941048b44240889018b44241c8b50148b128b58388b1b8d710cc746fc050000008b7c2418897e10895e0c8b5c2414895e088956048b542410891689c89090e86a1300008b4d008d49f03b4d087303ff5520894d00c741fc03000000897108894104c7011500000089e0890889e0897004eb6d83fa17756dba24bc86b29090e89e75feff8b45008d40f43b45087303ff5520894500c740fc02000000c700485a88b28b4c24208948048060ffbfff74242cff742434ff74243cff74242850ff74244cff74244068845a88b2ff74243c8d44240450bbe84487b2b817000000eb0ae912010000e9a000000090e8f2e1feff8b4d008d49dc3b4d087303ff5520894d00c741fc020000008b0083c4208941048b44240889018b44241c8b50148b128b58388b1b8d710cc746fc050000008b7c2418897e10895e0c8b5c2414895e088956048b54241089168b55008d52e43b55087303ff5520895500c742fc01000040c702ec7d7ab28d5a08c743fc0400000089730c895308894b04c7033300000089e1891989e1897104eb6d8b48148b098b50388b128b5d008d5be83b5d087303ff5520895d00c743fc050000008b74241889731089530c8b542414895308894b048b4c2410890b8b4d008d49f03b4d087303ff5520894d00c741fc030000008959088b542408895104c7012d00000089e2890a89e18959048b44241c8b48088b098b50248b1283fa53750289ca83fa5f750dba24bc86b290e80674feffeb16b85f000000e892c9feff8b5c241c909090e8cac7feff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c890883c414c2140083fa3f756b50535651ff731889d8ba24bc86b290e8aa73feff8b44240c8b48088b098b50248b1283fa53750289ca83fa5b74698b4d008d49f43b4d087303ff5520894d00c741fc02000000c701cc5a88b28b5424108951048061ffbfff74241cff742424ff74242c5051ff74243ceb05e9fd000000ff74243068085b88b2508d4c240451bbe84487b2b8170000009090e8eedffeff8b0083c420eb05b8010000008b4c240c8b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956045a83c40889168b51088b128b59248b1b83fb53750289d383fb5b7510565089c8ba24bc86b2e8be72feffeb1a89c3b85b0000009090e846c8feff56538b5c240890e87ec6feff8b45008d40d83b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc040000008b54240489510c5b895908894104c701230000008d4114c740fc02000000895004890883c40cc2140083fa4d7407ba01000000eb05ba0300000083fa01741750535651ff73185289d8ba24bc86b290e82672feffeb0f89c7b80100000057535651ff7318528b4424108b48088b098b50248b1283fa53750289ca8b48288b098b58148b1b8b703c8b368b78388b3f528b55008d52e83b55087303ff5520895500c742fc05000000897210897a0c894a08895a048b401889028b0424b97e4a88b28d4c81fcffe19090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e933030000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e996030000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e9ed030000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e962040000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9f6040000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e95a050000909090833c2423740c833c240d7406833c243175718b4424306a016a01ff7008ff742420ff74242868907e87b2ff74241c8d4c2414518b58048b0889c890e89ea1ffff8b45008d40d03b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc01000040c70190cf87b28d5108c742fc01000040c702505b88b28d5a08eb05e97f000000c743fc050000008953108b54240489530c894308894b045889038b45008d40d03b45087303ff5520894500c740fc02000000895804c7001d0000008d480cc741fc050000008b5c241483c4048959108b5a0c89590c8b74240c8971088b72048971048b7c2408893989c78d4118c740fc02000000894804893883c41cc2140089d3b83100000090e816c4feff538b5c24189090e84ec2feff8b442418ba24bc86b29090e8626efeff8b45008d40f43b45087303ff5520894500c740fc0200000059894804c700b4047db283c41cc214008b4424148b48048b098b50288b128b70148b36578b783c8b3f538b58388b1b518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089590c8951088971048b40188901518b442424ba24bc86b2e8e26dfeff8b45008d40bc3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c7411070f087b25a89510c5a895108894104c701250000008d4118c740fc050000008b5424188950108b54240489500c8b5424148950085a83c4048950048b542408891089c28d4018c740fc02000000895004890883c41cc214008b442414ba24bc86b2909090e84e6dfeff8b5c24148b442418909090e802f3feff8b48048b55008d52e83b55087303ff5520895500c742fc050000008b5c2410895a108b590c895a0c8b74240c8972088b71048972048b7c2408893a5289d38b3889f890e8420c000089c18b45008d40f43b45087303ff5520894500c740fc020000005a895004890883c41cc214008b4424148b48048b098b50288b128b70148b36578b783c8b3f538b58388b1b518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089590c8951088971048b40188901518b442424ba24bc86b29090e8766cfeff8b45008d40bc3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110c0f087b25a89510c5a895108894104c701250000008d4118c740fc050000008b5424188950108b54240489500c8b5424148950085a83c4048950048b542408891089c28d4018c740fc02000000895004890883c41cc214008b4424148b48048b098b50288b128b70148b36578b783c8b3f538b58388b1b518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089590c8951088971048b40188901518b442424ba24bc86b290e89a6bfeff8b45008d40bc3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110080088b25a89510c5a895108894104c701250000008d4118c740fc050000008b5424188950108b54240489500c8b5424148950085a83c4048950048b542408891089c28d4018c740fc02000000895004890883c41cc214008b4424148b48048b098b50288b128b70148b36578b783c8b3f538b58388b1b518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089590c8951088971048b40188901518b442424ba24bc86b290e8be6afeff8b45008d40bc3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c74110380088b25a89510c5a895108894104c701250000008d4118c740fc050000008b5424188950108b54240489500c8b5424148950085a83c4048950048b542408891089c28d4018c740fc02000000895004890883c41cc214008b4424148b48048b098b50288b128b70148b36578b783c8b3f538b58388b1b518b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089590c8951088971048b40188901518b442424ba24bc86b290e8e269feff8b45008d40bc3b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc05000000c741106c0088b25a89510c5a895108894104c701250000008d4118c740fc050000008b5424188950108b54240489500c8b5424148950085a83c4048950048b542408891089c28d4018c740fc02000000895004890883c41cc2140090909000000000cc130000|@13308,2097151,@2517|54,0,@12740 62,1,@12741 87,0,0 94,1,@12896 124,0,@13281 215,0,@13282 250,1,@13155 284,0,@12740 290,1,@12741 299,0,26 306,1,@12931 318,1,@12930 348,0,@13283 389,0,@13284 403,0,@13036 408,0,48 414,1,@12973 513,0,@12740 518,1,@12741 527,0,15 534,1,@12931 546,1,@12930 592,0,@13285 598,1,@12930 644,0,@12740 650,1,@12741 665,0,0 672,0,0 682,1,@13286 690,1,@13287 720,0,0 746,0,0 770,0,19 812,0,@12740 818,1,@12741 861,0,@12740 866,1,@12741 963,0,27 1023,0,@13288 1046,1,@13015 1083,0,@13290 1097,0,@13036 1102,0,11 1110,1,@12973 1206,0,@5413 1234,0,1 1240,0,15 1271,0,@12740 1278,1,@12741 1285,0,46 1290,1,@12931 1302,1,@12930 1364,0,@12740 1370,1,@12741 1413,0,@12740 1418,1,@12741 1515,0,27 1575,0,@13295 1653,0,@12740 1658,1,@12741 1688,0,@13296 1729,0,@13297 1743,0,@13036 1748,0,48 1754,1,@12973 1858,1,@13298 1894,0,10 1915,0,@12740 1922,1,@12741 1952,0,@13299 1993,0,@13300 2007,0,@13036 2012,0,11 2030,1,@12973 2148,0,@5413 2173,0,25 2284,0,22 2324,0,@12740 2330,1,@12741 2337,0,47 2342,1,@12931 2354,1,@12930 2416,0,@12740 2422,1,@12741 2478,0,@13301 2523,0,@13302 2534,0,@13036 2539,0,11 2546,1,@12973 2558,0,0 2653,0,@12740 2658,1,@12741 2667,0,45 2674,1,@12931 2686,1,@12930 2716,0,@5413 2746,0,17 2777,0,0 2784,0,1 2804,0,@12740 2810,1,@12741 2819,0,0 2918,0,$13280+2930 3512,0,@13095 3534,1,@13181 3564,0,@5413 3580,0,@13162 3596,0,@13303 3665,0,14 3740,0,24 3746,1,@12931 3758,1,@12930 3767,0,@12740 3774,1,@12741 3808,0,@7817 3897,0,@12740 3902,1,@12741 3932,0,@5413 3949,0,@13186 3966,0,18 4042,0,@12740 4050,1,@12741 4066,1,@13030 4138,1,@13305 4259,0,@12740 4266,1,@12741 4296,0,@5413 4313,0,@13190 4330,0,18 4480,0,@12740 4486,1,@12741 4516,0,@5413 4533,0,@13216 4550,0,18 4700,0,@12740 4706,1,@12741 4736,0,@5413 4753,0,@13218 4770,0,18 4920,0,@12740 4926,1,@12741 4956,0,@5413 4973,0,@13220 4990,0,18 13281:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2495| 13282:D3,32|3b650c7303ff552483f8357506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2496|14,0,1 13283:D3,40|3b650c7303ff552483f81f740583f8617506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2497|19,0,1 13284:D3,52|3b650c7303ff55248b0424891c24ff7210ff7214ff7218ff721c8b5a0c89c18b42088b720489f251ff2290900000000030000000|@13035,1048575,@2498| 13285:S21|456e64206f66206c65742065787072657373696f6e 13286:D3,120|3b650c7303ff5524a801755b8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000894a048b08890a528b480489c8e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000074000000|@6329,7,@2499|38,0,0 104,0,0 13287:D3,120|3b650c7303ff5524a801755b8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000894a048b08890a528b480489c8e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000074000000|@6329,7,@2500|38,0,0 104,0,0 13288:D3,208|3b650c7303ff5524525389c3b8743b87b2e856b6f1ffbb843b87b29090e84ab6f1ffbb5cbe86b29090e86669feff909090e80ea1feff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b0c248b51048b5a0c83c404c703030000008b4a3089ca5983c40451ff229000000000cc000000|@13289,1048575,@2501|13,0,@13012 18,1,@4940 23,0,@13013 30,1,@4940 35,0,@12744 42,1,@12747 50,1,@12914 84,0,0 91,0,0 98,0,3 104,0,0 114,0,@6321 159,0,0 165,0,1 183,0,1 13289:S73|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e2831297265706f7274447570283329 13290:D3,68|3b650c7303ff552453ff7208ff720cff7210ff7214ff7218ff721cff72208b5a04e8320000008b0c248b1089118b5804895904b80100000083c404c30000000040000000|@13035,2097151,@2505|34,1,@13291 52,0,0 13291:D3,364|3b650c7303ff55245368385888b2538b5c24288d4424049090e81eebfeff8b48048b108b45008d40f43b45087303ff5520894500c740fc02000000894804891051528b54242c9090ff128b4424308b48088b098b50248b1283fa53750289ca83fa23750cba24bc86b2e80a65feffeb16b823000000e896bafeff8b5c2430909090e8ceb8feff8b45008d40f43b45087303ff5520894500c740fc02000000c7006c5888b28b4c24088948048060ffbf6a016a0189e151ff74243cff742434ff742434ff74243489c38b4424348b542444ff128b44240c8b4c24048b55008d52c83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700ec7d7ab28d5808c743fc050000008953105f83c404897b0c8b7c2404897b088943045883c41089038b45008d40f43b45087303ff5520894500c740fc020000008950048918c21c0090900000000068010000|@13294,2097151,@2504|10,0,@13292 26,1,@13030 101,0,@12740 106,1,@12741 113,0,17 118,1,@12931 130,1,@12930 160,0,@13293 282,0,@5413 13292:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2502|14,0,1 13293:D3,40|3b650c7303ff552483f85d740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2503|19,0,1 13294:S72|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129676574456e747279283129 13295:D3,44|3b650c7303ff552483f817740a83f861740583f85f7506b803000000c38b5204ff2290900000000028000000|@12910,1048575,@2506|24,0,1 13296:D3,40|3b650c7303ff552483f861740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2507|19,0,1 13297:D3,52|3b650c7303ff55248b0424891c24ff7210ff7214ff7218ff721c8b5a0c89c18b42088b720489f251ff2290900000000030000000|@13035,1048575,@2508| 13298:D3,120|3b650c7303ff5524a801755b8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000894a048b08890a528b480489c8e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000074000000|@6329,7,@2509|38,0,0 104,0,0 13299:D3,40|3b650c7303ff552483f817740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2510|19,0,1 13300:D3,52|3b650c7303ff55248b0424891c24ff7210ff7214ff7218ff721c8b5a0c89c18b42088b720489f251ff2290900000000030000000|@13035,1048575,@2511| 13301:D3,40|3b650c7303ff552483f85b740583f8177506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2512|19,0,1 13302:D3,52|3b650c7303ff55248b0424891c24ff7210ff7214ff7218ff721c8b5a0c89c18b42088b720489f251ff2290900000000030000000|@13035,1048575,@2513| 13303:O1|@13304 13304:D3,16|b801000000c39090000000000c000000|@13166,1,@2514|1,0,0 13305:D3,520|3b650c7303ff55248b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d5108c742fc03000000c74208f1700200894a04c7020d00000089c1535052f6c1017407b803000000eb068b018d440001a801740783f8037f08eb61f640ff107560f6c1017407b803000000eb068b018d440001a801740783f8017e08eb10f640ff10740ab8a8f179b28b5d04ff13f6c101750a0fb641048d440001eb0289c883f861754af6c1017407b803000000eb068b018d440001a8017411eb0ae92d000000e92800000083e8027105ff5538ebf650bb0300000089c89090e8ee6ff7ff89c13b650c7303ff5524e950ffffff89c88b4d008d49e83b4d087303ff5520894d00c741fc020000008b142489510489018d410cc740fc02000000c7400401000000890889c389d8909090e8e60000008b4d008d498c3b4d087303ff5520894d00c741fc03000000c7410801000000894104c701010000008d4110c740fc0100004089088d4808c741fc02000000894104c701030000008d410cc740fc03000000894808895804c700070000008d4810c741fc01000040c701ec7d7ab28d5108c742fc03000000c74208f1700200894a04c7020d00000089018d4210c740fc0300000059894808895004c7000500000089c18d4010c740fc050000008b5c240489581089500c8948085983c404894804c70031000000c39090900000000004020000|@13307,63,@2516|34,0,@5413 51,0,79992 60,0,6 75,0,1 110,0,1 140,0,@4898 177,0,1 217,0,1 226,1,@8870 292,0,0 306,1,@13306 337,0,0 346,0,0 377,0,1 399,0,3 415,0,@5413 432,0,79992 441,0,6 466,0,2 504,0,24 13306:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2515|60,0,0 13307:S26|50415253455f5452454528292e6d6b53656c6563746f72283229 13308:S61|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129 13309:O1|@13310 13310:D3,732|83f82f7506b803000000c389c1ba865e88b28d548afcffe29090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f9017406b803000000c383f823740a83f80d740583f8317506b803000000c383f8417506b803000000c383f8437506b803000000c383f83f7506b803000000c383f84d7506b803000000c383f8457406b801000000c3b803000000c3909000000000d8020000|@12910,7,@2519|6,0,1 14,0,$13310+26 576,0,0 583,0,1 590,0,1 597,0,1 604,0,1 611,0,1 618,0,1 625,0,1 635,0,1 656,0,1 667,0,1 678,0,1 689,0,1 700,0,1 711,0,0 717,0,1 13311:D3,32|3b650c7303ff552483f8077506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2520|14,0,1 13312:D3,712|3b650c7303ff552483f84d741c83f841741c83f83f741c83f843741c89c1bbce6188b28d5c8bfcffe3e984020000e97f020000e97a020000e97502000090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901751483f80d740f83f831740a83f879740583f84b7506b803000000c38b5204ff2290909000000000c4020000|@12910,1048575,@2521|31,0,$13312+62 612,0,0 619,0,1 626,0,1 633,0,1 640,0,1 647,0,1 654,0,1 661,0,1 691,0,1 13313:D3,32|3b650c7303ff552483f8617506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2522|14,0,1 13314:D3,2336|3b650c7303ff55248b4c24188b51088b128b71248b3683fe53750289d683fe4d741c83fe41741c83fe3f741c83fe43741c89f2bff26488b28d7c97fcffe7e9a9050000e9a4050000e99f050000e99a050000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083fe317407ba01000000eb2fba03000000eb28ba03000000eb21ba03000000eb1aba03000000eb13ba03000000eb0cba03000000eb05ba0300000083fa01755383fe0d745383fe31745383fe797453535089cbb8d46d88b2909090e89aa8feff8b4424208b48088b098b50248b1283fa53750289ca5289d08b5424049090ff1283f801753c833c244d743b833c2441743aeb14e9e2020000e9dd020000e9d8020000e9d3020000833c243f7423833c244374228b0424b9ee6788b28d4c81fcffe1e9aa020000e9a5020000e9a0020000e99b020000e9960200009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9ff010000909090e9e3010000909090e9f6010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94d010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9ec000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9ab000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93a000000909090833c24317407b801000000eb2fb803000000eb28b803000000eb21b803000000eb1ab803000000eb13b803000000eb0cb803000000eb05b80300000083f8017533833c240d742d833c24317427833c247974218b442424ba24bc86b2909090e8be51feff83c4043b650c7303ff5524e9f0fcffffb80100000083c404eb0989c2b80100000053528b45008d40f43b45087303ff5520894500c740fc02000000c700e46d88b28b0c248948048060ffbf6a016a01508d44240450ff7424308b5c24348b4424309090e80e6dffff8b4424288b48088b098b50248b1283fa53750289ca83fa71750cba24bc86b2e83251feffeb3989c3b8f0e186b29090e8fea4feff8b4424288b48088b098b50248b1283fa53750289ca83fa23750cba24bc86b2e8fe50feffeb05b8010000008b45008d40f43b45087303ff5520894500c740fc02000000c700186e88b28b4c24088948048060ffbf6a016a0189e252ff742434ff74242cff74242cff74242c89c38b4424408b54243c90ff128b44240c8b4c24048b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8b5d008d5bcc3b5d087303ff5520895d00c743fc01000040c703e4107bb28d7b08c747fc01000040c707e4107bb28d4f08c741fc01000040c701010000008d7108c746fc06000000894e14895610897e0c895e088b4c2408894e045983c40c890e8b4c24208b59088b1b8b79248b3f83ff53750289df83ff7d7572ff7010ff7008ff305689c8ba24bc86b2e8de4ffeff6a016a01ff742438ff742438ff742438ff742438ff742438ff7424388d5c24188b442430909090e822f8ffff8b45008d40dc3b45087303ff5520894500c740fc02000000598948048b4c240489088b0c248d500cc742fc05000000eb05e9420000008b5c241083c408895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b7d008d7ff43b7d087303ff5520897d00c747fc020000008957048907eb308b45008d40e83b45087303ff5520894500c740fc02000000c740040100000089308d780cc747fc0200000089570489078b4424208b48088b098b50248b1283fa53750289ca5789d08b5424049090ff1283f801754d8b5c2424b84c6e88b290e8b2a2feff8b4424248b48088b098b50248b1283fa53750289ca89d08b542404909090ff1283f80175198b442424ba24bc86b290e8a24efeff3b650c7303ff5524ebc28b04248b4c24088b1089118b580483c408895904b80100000083c404c2180090000000001c090000|@13319,2097151,@2525|52,0,$13314+82 632,0,0 639,0,1 646,0,1 653,0,1 660,0,1 667,0,1 674,0,1 681,0,1 710,0,@13315 718,1,@12930 809,0,$13314+846 1397,0,0 1404,0,1 1411,0,1 1418,0,1 1425,0,1 1432,0,1 1439,0,1 1446,0,1 1478,0,@12740 1486,1,@12741 1507,0,0 1519,0,0 1551,0,@13316 1590,1,@13175 1621,0,@12740 1626,1,@12741 1635,0,@12840 1642,1,@12930 1673,0,@12740 1678,1,@12741 1685,0,0 1715,0,@13317 1852,0,@6455 1868,0,@6455 1884,0,0 1961,0,@12740 1966,1,@12741 2161,0,0 2224,0,@13318 2230,1,@12930 2276,0,@12740 2282,1,@12741 2317,0,0 13315:S5|4d61746368 13316:D3,32|3b650c7303ff552483f8717506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2523|14,0,1 13317:D3,32|3b650c7303ff552483f87d7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2524|14,0,1 13318:S12|456e64206f66206d61746368 13319:S50|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296d61746368283129 13320:D3,32|3b650c7303ff552483f8617506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2526|14,0,1 13321:D3,796|3b650c7303ff552483f82f740d89c1bbf26e88b28d5c8bfcffe3e9ea020000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901753c83f823743c83f80d743c83f831743c83f841743c83f843743c83f83f743c83f84d743c83f845743c83f827743c83f80f743c81f8810000007439eb3ce946000000e941000000e93c000000e937000000e932000000e92d000000e928000000e923000000e91e000000e919000000e914000000e90f00000083f833740a83f855740583f86f7506b803000000c38b5204ff220000000018030000|@12910,1048575,@2527|16,0,$13321+34 584,0,0 591,0,1 598,0,1 605,0,1 612,0,1 619,0,1 626,0,1 633,0,1 694,0,64 778,0,1 13322:D3,796|3b650c7303ff552483f82f740d89c1bb227288b28d5c8bfcffe3e9ea020000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9fe010000909090e9e3010000909090e9f5010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e94c010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9eb000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9aa000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e93900000090909083f8317407b901000000eb2fb903000000eb28b903000000eb21b903000000eb1ab903000000eb13b903000000eb0cb903000000eb05b90300000083f901753c83f823743c83f80d743c83f831743c83f841743c83f843743c83f83f743c83f84d743c83f845743c83f827743c83f80f743c81f8810000007439eb3ce946000000e941000000e93c000000e937000000e932000000e92d000000e928000000e923000000e91e000000e919000000e914000000e90f00000083f833740a83f855740583f81d7506b803000000c38b5204ff220000000018030000|@12910,1048575,@2528|16,0,$13322+34 584,0,0 591,0,1 598,0,1 605,0,1 612,0,1 619,0,1 626,0,1 633,0,1 694,0,64 778,0,1 13323:D3,32|3b650c7303ff552483f81b7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2529|14,0,1 13324:S55|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296b6579576f7264457870283129 13325:S59|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f2831292829 13326:S57|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f283129 13327:S58|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c73652831292829 13328:S56|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c7365283129 13329:S42|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e283229 13330:S47|50415253455f44454328292e706172736544656328332964656328342966756e4228312962696e64696e6773283129 13331:S36|50415253455f44454328292e706172736544656328332964656328342966756e42283129 13332:D3,584|3b650c7303ff55248b48088b098b50248b1283fa53750289ca8b48288b098b70148b368b783c8b3f578b78388b3f518b4d008d49e83b4d087303ff5520894d00c741fc05000000ff7018538b5c240c89591089790c8b7c24088979088971048b7424048931505152ba24bc86b2e87644feff833c243b75318b5c2408b801000000e8d60100008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb4d833c243975328b5c2408b80100000090e89e0100008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70101000000eb15833c2449740ab8708488b28b5d04ff13b960877ab28b4424088b50088b128b58248b1b83fb53750289d383fb23745383fb0d745383fb3174535189c3b8c48488b2909090e89a97feff8b44240c8b48088b098b50248b1283fa53750289ca5289d08b5424289090ff1283f8017540833c2423743a833c240d7434833c2431742eeb0fe931000000e92c000000e9270000008b442410ba24bc86b29090e86643feff83c4043b650c7303ff5524eb9bb80100000083c404eb06b801000000516a016a01ff742414ff742430ff742420ff7424148d5c24108b4424209090e8ca0b00008b4424048b4d008d49e83b4d087303ff5520894d00c741fc050000008b5424248951108b500c89510c8b5c24208959088b58048959048b74241c89318b75008d76ec3b75087303ff5520897500c746fc04000000894e0c5f83c404897e085f83c41c897e04c7060f0000008b7c24088937894f04b801000000c2080090900000000044020000|@13352,2097151,@2545|105,0,@12740 110,1,@12741 125,0,0 130,1,@13333 163,0,1 180,0,0 186,1,@13333 219,0,0 232,0,@13346 242,0,@5515 286,0,@13349 294,1,@12930 375,0,@12740 382,1,@12741 400,0,0 410,0,0 446,1,@13350 553,0,7 567,0,0 13333:D3,492|3b650c7303ff55248b43088b008b4b248b0983f953750289c183f93d75588b43048b00a8017407b903000000eb068b088d4c0901515068a47b88b2536a038d5c2408b801000000ba407c88b290e872020000a80175258b008b4d008d49f83b4d087303ff5520894d00c741fc010000008b008901eb0ae960010000b90100000083f901750cb84cc37bb28b5d049090ff138b01a801740783f8017d08eb17f640ff107511a801740783f8137f08eb6df640ff10756c8b14248b5a288b1b8b72148b368b7a3c8b3f8b42388b00ff318b4d008d49e83b4d087303ff5520894d00c741fc0500000089791089410c8959088971048b521889118b4424048b50048b125189d3b8f48388b290e8e290f1ffbb088488b29090e8d690f1ffeb0ae9a3000000e99e000000bb5cbe86b29090e8e643feff909090e88e7bfeff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700030000008b4c24048b510cc702030000008b5130909090ff12eb01508b442404ba24bc86b2909090e8b640feff5883c410c3b801000000c390909000000000e8010000|@13345,2097151,@2543|40,0,1 55,0,@13334 67,0,0 72,0,@13336 78,1,@13337 124,0,0 134,0,@6769 260,0,@13343 266,1,@4940 271,0,@13344 278,1,@4940 295,0,@12744 302,1,@12747 310,1,@12914 344,0,0 351,0,0 358,0,3 364,0,0 374,0,@6321 419,0,0 425,0,1 438,0,1 458,0,@12740 466,1,@12741 476,0,0 13334:D3,96|3b42087506b801000000c3f6420401751489c183c1088b5204d1e90fb60c0a8d4c0901eb038b4a0483c0028b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc010000008910c3909090000000005c000000|@13335,7,@2539|6,0,0 13335:S29|537472696e674376742e7363616e537472696e67283229726472283129 13336:O9|@13337,268435456,7,1000000000,9,134217728,9,536870912,29 13337:D3,404|3b650c7303ff55246a016a016a01837c241005751a89e1c7012100000089e18b720489710489e18b7a08897908eb5a837c241003751a89e1c7011500000089e18b720c89710489e18b7a10897908eb39837c241007751a89e1c7011100000089e18b721489710489e18b7a18897908eb1889e1c7010500000089e18b721c89710489e18b7a2089790853525089da9090ff12a801756c8b08833913720583391b7605833941751b8b54241c8954241c8b5c24088b410483c4045a83c410e93effffff83395775178b5424088954241c8b5c240c8b410483c418e9ca00000083395b74088139fd000000756cff7424088b5c24108b4104909090e8aa000000a801eb05e97800000075568b08ba01000000f6c2017409f6010174042b117105ff5538ebf783c2018b5d008d5bec3b5d087303ff5520895d00c743fc020000008b710489730489138d430cc740fc01000000891883c418eb05e90e000000c20400b80100000083c418c204008b5424088954241c8b5c240c5883c414e929000000b80100000083c418c2040090900000000090010000|@13342,2097151,@2542|25,0,16 58,0,10 91,0,8 117,0,2 218,1,@13338 229,0,126 250,1,@13338 268,0,0 352,0,0 379,1,@13338 384,0,0 13338:D3,688|3b650c7303ff552483fb217561508b5424089090ff12a80175598b0883396174288b5424088b1c24895c24088b5c24048954240489debb01000000b80100000083c40456e97b020000ff71048b04248b54240c90ff12a801756b8b088139f100000074088139b1000000755eeb0ae9d6000000e9c6000000ff7104ff742410bb01000000b801000000e83602000083f80175448b45008d40ec3b45087303ff5520894500c740fc020000008b0c24894804c7000100000089c18d400cc740fc01000000eb0ae93c000000e90e000000890883c408c2040083c408c204008b54240c8b5c2404895c240c8b5c24088954240889debb01000000b80100000083c40856e9be0100008b45008d40ec3b45087303ff5520894500c740fc020000008b0c24894804c7000100000089c18d400cc740fc01000000890883c408c20400b80100000083c404c20400b901000000ba01000000535250518b54241490ff12a80175628b088b11f6c201740783fa617c59eb06f642ff107561bb61000000f6c3017410f644240c0174098d5bff035c240c7105ff5538ebf2f6c2017409f6c30174043bd3eb05ff5538ebf77d67ff7104528b5c24148b442410ff15c8c75208a8017421eb0ae992000000e945000000f6042401740f8d40ffeb05e9350000000304247105ff5538ebeca801740583e8607105ff5538ebf689c183c4045889cab90300000083c40c3b650c7303ff5524e941ffffff833c240174378b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc01000000891883c410c20400b80100000083c410c20400833c240174398b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc01000000890883c410c20400b80100000083c410c2040090909000000000ac020000|@13341,2097151,@2541|55,0,0 60,0,0 69,1,@13339 94,0,120 102,0,88 128,0,0 133,0,0 138,1,@13339 179,0,0 244,0,0 249,0,0 258,1,@13339 294,0,0 319,0,0 330,0,0 335,0,0 377,0,48 442,0,I108 511,0,1 593,0,0 667,0,0 13339:D3,684|3b650c7303ff552453508b4424108b54240c9090ff12a80175598b088b11f6c201740783fa617c63eb06f642ff107560f6c201740783fa737f5beb06f642ff107458ff710452bb210000008b44240c90ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740ceb05e9df01000083e8607105ff5538ebf68b4c241483c404eb14e927000000e922000000e91d000000e9180000005a89542410894c240c89c3b80300000083c408e949fffffff6c201740a81fa830000007c60eb06f642ff10755df6c201740a81fa8d0000007f6deb06f642ff10746aff710452bb210000008b44240c9090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740881e8820000007105ff5538ebf3a8017411eb0ae93a000000e93500000083c0147105ff5538ebf68b4c241483c4045a89542410eb0ae918000000e913000000894c240c89c3b80300000083c408e99dfefffff6c201740a81fac30000007c60eb06f642ff10755df6c201740a81facd0000007f6deb06f642ff10746aff710452bb210000008b44240c9090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740881e8c20000007105ff5538ebf3a8017411eb0ae93a000000e93500000083c0147105ff5538ebf68b4c241483c4045a89542410eb0ae918000000e913000000894c240c89c3b80300000083c408e9f1fdffff833c240174378b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424108973048b7c2404893b8d430cc740fc01000000891883c408c20800b80100000083c408c20800833c240174398b45008d40ec3b45087303ff5520894500c740fc020000008b4c24108948048b542404891089c28d400cc740fc01000000891083c408c20800b80100000083c408c2080090909000000000a8020000|@13340,2097151,@2540|71,0,16 82,0,I108 171,0,1 190,0,65 211,0,70 230,0,16 242,0,I108 343,0,1 362,0,97 383,0,102 402,0,16 414,0,I108 515,0,1 589,0,0 663,0,0 13340:S29|496e742e7363616e283329726561645f6865785f646967697473283329 13341:S25|496e742e7363616e283329726561645f6e756d626572283129 13342:S11|496e742e7363616e283329 13343:S11|507265636564656e636520 13344:S37|206e6f7420616c6c6f7765642c206d757374206265206265747765656e203020616e642039 13345:S48|50415253455f44454328292e7061727365446563283329666978697479283229676574507265636564656e6365283129 13346:O4|@4608,@5398,@12047,@13347 13347:O5|@13348,555,0,555,0 13348:S32|6d6c736f757263652f4d4c436f6d70696c65722f50415253455f4445432e4d4c 13349:S8|5661726961626c65 13350:D3,280|3b650c7303ff55248b4c24108b51088b128b71248b3683fe53750289d683fe23740a83fe0d740583fe31757053518b5c2414b8907e87b29090e8c689feff50ff70048b5c241c8b0889c8909090e8ee91feff8b04248b4c241083c4048b55008d52e83b55087303ff5520895500c742fc020000008b5c2408895a048b3089328b78048d420cc740fc02000000895004893056578b11909090ff12eb05e95b0000006a016a01ff742424ff742424ff742424ff7424248d5c24108b442418e83effffff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240889088b4c240c89015883c408894104b80100000083c404c21000c70301000000894304b801000000c210009090900000000014010000|@13351,2097151,@2544|51,0,@13095 58,1,@12928 78,1,@12947 242,0,0 254,0,0 262,0,0 13351:S39|50415253455f44454328292e706172736544656328332966697869747928322976617273283129 13352:S32|50415253455f44454328292e7061727365446563283329666978697479283229 13353:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2546| 13354:D3,40|3b650c7303ff552483f81f740583f8357506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2547|19,0,1 13355:D3,40|3b650c7303ff552450528b4a0889ca90ff128b04248b480483c4045889caff220000000024000000|@13127,1048575,@2548| 13356:D3,32|3b650c7303ff552483f81f7506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2549|14,0,1 13357:D3,236|3b650c7303ff55248b4c24088b51088b128b71248b3683fe53750289d683fe23740a83fe0d740583fe31757253518b5c240cb8907e87b29090e84e87feff6a016a01ff7004ff30ff74241cff74241c8d5c24108b44240c9090e8a2ffffff8b45008d40e83b45087303ff5520894500c740fc01000040c700010000008d4808c741fc030000008b5424048951088941045883c40489018b45008d40f4eb05e92d0000003b45087303ff5520894500c740fc020000005a89500489088b4c2404890158894104b80100000083c404c20800c70301000000894304b801000000c2080090909000000000e8000000|@13358,2097151,@2550|51,0,@13095 58,1,@12928 120,0,0 198,0,0 210,0,0 218,0,0 13358:S36|50415253455f44454328292e706172736544656328332964656328342976617273283129 13359:D3,60|3b650c7303ff5524536a01ff7204ff7208bb01000000909090e87aedfeff8b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13079,2097151,@2551|18,0,0 26,1,@13086 44,0,0 13360:D3,56|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff228b0083c408c390900000000034000000|@13170,1048575,@2552| 13361:D3,32|3b650c7303ff552483f8057506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2553|14,0,1 13362:D3,532|3b650c7303ff55248b4c24148b51088b128b71248b3683fe53750289d683fe59754b5089c8ba24bc86b2909090e8b632feff8b44241c8b4c24188b5424148b5c24108b74240c8b7c24088944241c894c241889542414895c24108974240c897c2408bb0300000058e993ffffff8b55008d52f43b55087303ff5520895500c742fc02000000c702708b88b28942048062ffbf6a016a015053528d54240c525189cb8b44242ce8f64dffff8b4424248b48088b098b50248b1283fa53750289ca83fa23750cba24bc86b2e81a32feffeb16b823000000e8a687feff8b5c2424909090e8de85feff6a016a0189e050ff742430ff74242cff74242cff74242c8b5c24208b44243ce8969affff8b44242c8b48088b098b50248b1283fa53750289ca6a016a0183fa057530ba24bc86b2e8b631feff89e050ff742438ff742438ff742438ff742438ff7424388b5c24288b44242ce8aafeffffeb1189e1c7010100000089e18b54240c8951048b44241c8b4c240c8b55008d52c83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8d4218c740fc01000040c700010000008d5808c743fc050000008b7c2410897b1089430c8953088b4424088943048b44241889038b45008d40f43b45087303ff5520894500c740fc020000005a89500489188b54243489025883c418894204b801000000c218000000000010020000|@13364,2097151,@2555|38,0,@12740 46,1,@12741 99,0,1 135,0,@13363 166,1,@13175 197,0,@12740 202,1,@12741 209,0,17 214,1,@12931 226,1,@12930 262,1,@13267 297,0,@12740 302,1,@12741 348,0,0 433,0,0 517,0,0 13363:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2554|14,0,1 13364:S36|50415253455f44454328292e706172736544656328332964656328342976616c42283229 13365:O1|@13366 13366:D3,16|b801000000c39090000000000c000000|@13166,1,@2556|1,0,0 13367:S2|6974 13368:S29|50415253455f44454328292e7061727365446563283329646563283429 13369:S42|50415253455f44454328292e706172736544656328332973747244656328332967657444656373283129 13370:S32|50415253455f44454328292e7061727365446563283329737472446563283329 13371:O1|@13372 13372:D3,724|89c1baa28c88b28d548afcffe290e91b020000909090e926020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9d5010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9ac010000909090e983010000909090e9a3010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e96a010000909090e969010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e940010000909090e93f010000909090e9f3000000909090e9eb000000909090e92e010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9b3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083f87b7407b901000000eb46b903000000eb44b903000000eb42b903000000eb40b903000000eb3eb903000000eb3cb903000000eb3fb903000000eb38b903000000eb31b903000000eb2ab903000000eb23e91e000000e919000000e914000000e90f000000e90a000000e905000000b90300000083f9017406b803000000c383f8477506b803000000c383f86d7406b801000000c3b803000000c3909000000000d0020000|@12910,7,@2560|3,0,$13372+14 564,0,0 571,0,1 578,0,1 585,0,1 592,0,1 599,0,1 606,0,1 613,0,1 620,0,1 627,0,1 634,0,1 671,0,1 681,0,1 692,0,1 703,0,0 709,0,1 13373:D3,184|3b650c7303ff55248b4b288b098b533c8b125251ff7318505389d8ba24bc86b290e88e2cfeffff742404ff74241cff742424ff74240c68489088b2ff7424148d44240450bbe84487b2b805000000909090e81e99feff8b480483c41c8b55008d52d83b55087303ff5520895500c742fc050000008b5c2408895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b388d4218c740fc03000000895008897804c70003000000c208009000000000b4000000|@13389,2097151,@2566|28,0,@12740 34,1,@12741 55,0,@13374 69,0,@13036 74,0,2 82,1,@12973 168,0,1 13374:D3,56|3b650c7303ff552453ff7208ff720cff72108b5a04e8320000008b0c248b1089118b5804895904b80100000083c404c30000000034000000|@13035,2097151,@2565|22,1,@13375 40,0,0 13375:D3,348|3b650c7303ff55245353bbe84487b2b8907e87b290e82a7efeff50ff70048b5c24088b0889c8909090e85286feff8b04248b4c24048b51088b128b59248b1b83fb53750289d383fb237511ff700489c8ba24bc86b2e8422bfeffeb1a8b5804b82300000090e8ca80feff538b5c24089090e8027ffeff8b45008d40f43b45087303ff5520894500c740fc02000000c700049288b28b4c24188948048060ffbf6a016a01508d44240450ff7424248b5c241c8b442424bab01987b2909090e87288feff8b4424088b4c24048b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891a8b44240c8b5d008d5bd43b5d087303ff5520895d00c743fc01000040c703409288b28d7b08c747fc050000005983c410894f108b4804894f0c895f088b18895f0489178d4718c740fc020000008950048938c20c00900000000058010000|@13388,2097151,@2564|11,0,@13036 16,0,@13095 22,1,@12928 42,1,@12947 81,0,@12740 86,1,@12741 96,0,17 102,1,@12931 114,1,@12930 144,0,@13376 182,0,@12954 190,1,@12956 284,0,@13377 13376:D3,40|3b650c7303ff552483f805740583f81f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2561|19,0,1 13377:O6|@13379,@13163,0,0,@13378,0 13378:O1|@13383 13379:O3|0,@13381,@13380 13380:O10|0,0,0,0,0,0,0,0,0,0 13381:O1|@13382 13382:D3,28|3b650c7303ff5524bb15000000e9d6d8f1ff90900000000018000000|@5217,2097151,@2562|9,0,10 14,1,@5214 13383:D3,24|b8049388b28b5d04909090ff139090900000000014000000|@13387,1,@2563|1,0,@13384 13384:O4|11,@4879,0,@13385 13385:O5|@13386,177,0,177,0 13386:S34|6d6c736f757263652f4d4c436f6d70696c65722f5349474e4154555245532e736d6c 13387:S35|5349474e41545552455328292e756e646566696e65645369676e61747572652d283129 13388:S49|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329646f536967446563283129 13389:S38|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329 13390:O1|@13391 13391:D3,28|83f8677406b801000000c3b803000000c39090900000000018000000|@13392,1,@2567|6,0,0 12,0,1 13392:S22|53796d5365742e7369676e617475726553792d283129 13393:D3,188|3b650c7303ff55248b4b288b098b533c8b125251ff7318505389d8ba24bc86b290e8be27feffff742418ff742408ff742424ff74240cff742430681c9588b2ff7424188d44240450bbbc9487b2b805000000909090e84a94feff8b480483c4208b55008d52d83b55087303ff5520895500c742fc050000008b5c2408895a108b590c895a0c8b7424048972088b71048972045f83c408893a8b388d4218c740fc03000000895008897804c70001000000c20c009000000000b8000000|@13403,2097151,@2576|28,0,@12740 34,1,@12741 59,0,@13394 73,0,@13121 78,0,2 86,1,@12973 172,0,0 13394:D3,60|3b650c7303ff552453ff7208ff720cff7210ff72148b5a0490e8320000008b0c248b1089118b5804895904b80100000083c404c30000000038000000|@13035,2097151,@2575|26,1,@13395 44,0,0 13395:D3,2476|3b650c7303ff552453682c9f88b253ff74241c8d5c2408b8980e87b290e84a79feff50ff70048b5c24248b0889c8909090e87281feff8b04248b4c24208b51088b128b59248b1b83fb53750289d383fb437515ff7004ff3089c8ba24bc86b29090e85e26feffeb1e8b58048b30b843000000909090e8e27bfeff53568b5c242890e81a7afeff8b45008d40f43b45087303ff5520894500c740fc02000000c7006c9f88b28b4c240c8948048060ffbf8b5424288b5a088b1b8b72248b3683fe53750289de83fe5f75738b42288b008b5a148b1b8b723c8b368b7a388b3f8b4d008d49c03b4d087303ff5520894d00c741fc0500000089711089790c8941088959048b421889018d5918c743fc03000000894b08c7430401000000c703010000008d4b10c741fc01000040c701010000008d7108c746fc03000000eb05e90e000000895e08894e04c70648c05208eb1e8b5a088b1b8b72248b3683fe53750289de89f3bfde9688b28d7c9ffcffe7e919040000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9ae010000909090e993010000909090e9a5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e964010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9bb000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e99a000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e979000000909090e93b000000909090e970000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909083fe197407bb01000000eb36bb03000000eb2fbb03000000eb28bb03000000eb21bb03000000eb1abb03000000eb13bb03000000eb0cbb03000000eb05bb0300000083fb0174728b5a288b1b8b723c8b365653ff721850ff74243489d38b442434babc1987b290e80ab1feff8b4c24348b51148b128b59388b1b8b75008d76e83b75087303ff5520897500c746fc050000008b7c2408897e10895e0c8b5c2404895e088956045a83c40889168b55008d52d83b5508730aeb05e941000000ff5520895500c742fc03000000897208894204c702010000008d4210c740fc01000040c700010000008d7008c746fc03000000895608894604c70648c05208eb6c5168a89f88b2528d5c2404b8980e87b2e8c674feff50ff70048b5c24388b0889c8909090e8ee7cfeff5883c4088b4c24288b51088b128b59248b1b83fb53750289d383fb137510ff3089c8ba24bc86b2e8de21feffeb228b18b8130000009090e86677feff538b5c242ceb05e989000000909090e89675feff8b45008d40f43b45087303ff5520894500c740fc02000000c700ec9f88b28b4c24108948048060ffbf6a016a01508d44240450ff7424388b5c24408b442438bab01987b2909090e8067ffeff8b45008d40e83b45087303ff5520894500c740fc01000040c700010000008d7008c746fc030000005983c404894e088946045889068b4424288b48088b098b50248b1283fa53750289ca83fa5f750f56ba24bc86b29090e81221feffeb16b85f000000e89e76feff568b5c242c9090e8d674feff8b44242c8b48088b098b50248b1283fa53750289ca83fa157570ba24bc86b2e8d620feff8b45008d40f43b45087303ff5520894500c740fc02000000c70030a088b28b4c24108948048060ffbf6a016a01508d44240450ff7424388b5c24408b442438bab01987b2909090e8227efeff8b45008d40f03b45087303ff5520894500c740fc03000000eb05e9300000008b4c2404894808c74004030000005983c40489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb6a83fa13756aba24bc86b29090e82a20feff8b45008d40f43b45087303ff5520894500c740fc02000000c70064a088b28b4c24108948048060ffbf6a016a01508d44240450ff7424388b5c24408b442438bab01987b2909090e8767dfeff8b45008d40f03b4508730feb0ae947000000e93d000000ff5520894500c740fc030000008b4c2404894808c74004010000005983c40489088b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb05b9010000008b44242c8b50088b128b58248b1b83fb53750289d383fb23750f51ba24bc86b29090e85e1ffeffeb1a89cbb8230000009090e8e674feff538b5c24309090e81e73feff6a016a01ff74241c8d44240450ff742434ff7424408b5c24488b442440ba609687b290e856f9feff8b4424148b4c24048b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b710c89720c8b7808897a088b7904897a048b18891af64424080175748b4424088b188b7d008d7fd43b7d087303ff5520897d00c747fc01000040c707010000008d4f08c741fc01000040c701010000008d7108c746fc06000000894e14897e108b4b08894e0c8b7b04897e088b038946048b042489068b45008d40f43b45087303ff5520894500c740fc02000000eb05e90b000000897004c70005000000eb038b0424837c2408017407b901000000eb05b90300000083f1028b5d008d5be83b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc01000040c706010000008d7e08c747fc01000040c70701000000528b55008d52f83b55087303ff5520895500c742fc01000040c70201000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000578b7d008d7fcc3b7d087303ff5520897d00c747fc0c000000528b54240489572c8b5424088957288b54240c8957245a83c40c8957208b54241889571c894f18895f148977108b4c2414894f0c8b0c24894f088947048b44241089078b45008d40f43b45087303ff5520894500c740fc02000000894804893883c42cc2100000000000a8090000|@13402,2097151,@2574|10,0,@13396 24,0,@12926 30,1,@12928 50,1,@12947 91,0,@12740 98,1,@12741 110,0,33 118,1,@12931 130,1,@12930 160,0,@13397 278,0,0 284,0,0 300,0,0 329,0,I48 355,0,$13395+370 920,0,0 927,0,1 934,0,1 941,0,1 948,0,1 955,0,1 962,0,1 969,0,1 976,0,1 1012,0,@12955 1018,1,@13051 1125,0,0 1141,0,0 1163,0,I48 1171,0,@13398 1181,0,@12926 1186,1,@12928 1206,1,@12947 1245,0,@12740 1250,1,@12741 1259,0,9 1266,1,@12931 1286,1,@12930 1316,0,@13399 1354,0,@12954 1362,1,@12956 1392,0,0 1447,0,@12740 1454,1,@12741 1461,0,47 1466,1,@12931 1478,1,@12930 1509,0,@12740 1514,1,@12741 1544,0,@13400 1582,0,@12954 1590,1,@12956 1635,0,1 1679,0,@12740 1686,1,@12741 1716,0,@13401 1754,0,@12954 1762,1,@12956 1812,0,0 1851,0,0 1883,0,@12740 1890,1,@12741 1899,0,17 1906,1,@12931 1918,1,@12930 1952,0,@13130 1958,1,@13131 2061,0,0 2077,0,0 2155,0,2 2172,0,0 2179,0,1 2212,0,0 2228,0,0 2244,0,0 2275,0,0 2306,0,0 2337,0,0 13396:D3,44|3b650c7303ff552483f823740a83f815740583f8137506b803000000c38b5204ff2290900000000028000000|@12910,1048575,@2568|24,0,1 13397:D3,40|3b650c7303ff552483f817740583f85f7506b803000000c38b5204ff229090900000000024000000|@12910,1048575,@2569|19,0,1 13398:D3,48|3b650c7303ff552483f8137506b803000000c383f817740583f85f7506b803000000c38b5204ff22000000002c000000|@12910,1048575,@2570|14,0,1 30,0,1 13399:D3,48|3b650c7303ff552483f8637506b803000000c383f817740583f85f7506b803000000c38b5204ff22000000002c000000|@12910,1048575,@2571|14,0,1 30,0,1 13400:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2572|14,0,1 13401:D3,32|3b650c7303ff552483f8237506b803000000c38b5204ff22000000001c000000|@12910,1048575,@2573|14,0,1 13402:S49|50415253455f44454328292e706172736544656328332966756e63746f72446563283329646f46756e6374446563283129 13403:S36|50415253455f44454328292e706172736544656328332966756e63746f72446563283329 13404:O1|@13405 13405:D3,28|83f82b7406b801000000c3b803000000c39090900000000018000000|@13406,1,@2577|6,0,0 12,0,1 13406:S20|53796d5365742e66756e63746f7253792d283129 13407:S38|50415253455f44454328292e70617273654465632833297061727365546f7044656373283129 13408:S23|50415253455f44454328292e7061727365446563283329 13409:O1|@13410 13410:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@13586,2097151,@2659|16,1,@13411 13411:D3,344|3b650c7303ff5524f6c301740783fb017f0eeb06f643ff107406b868977ab2c3833801757568086083b2538b5804b848a388b29090e8f26a00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700a46586b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000eb05e913000000a801740e89c1b8ecd57ab28b5d049090ff13c3833803757368086083b2538b5804b8d81889b2e8626a00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70030287bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000eb05e913000000a801740e89c1b8ecd57ab28b5d049090ff13c38b4004bad81089b2e9156e0000900000000054010000|@13585,2097151,@2658|27,0,@5578 38,0,@10070 47,0,@13412 54,1,@13557 87,0,@5592 106,0,@12011 128,0,0 135,0,0 142,0,3 148,0,0 166,0,@6321 184,0,@10070 193,0,@13582 198,1,@13557 231,0,@5592 250,0,@6504 272,0,0 279,0,0 286,0,3 292,0,0 310,0,@6321 326,0,@13564 331,1,@13567 13412:O1|@13413 13413:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@13581,2097151,@2656|16,1,@13414 13414:D3,1060|3b650c7303ff55248b086a016a0183781803755b8b5004833a0575538b72048b7d008d7ff03b7d087303ff5520897d00c747fc030000008b560c8957088b56088957048b560489178b55008d52f83b55087303ff5520895500c742fc01000000893a89e7891789e28b36897204eb1089e2c7020100000089e28b700489720453ff7108ff31bb510000008b400ce88267f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13813c2448c05208742df604240175308b3424bf48c0520889c8b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689c1eb0989c8b901000000eb6a51bbb8a788b28b442404909090e8fe66f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389c88b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040ce27ab28901eb01508b44240ca801740583e8027105ff5538ebf65189c38b44240cbac4a788b2e8ca0200008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890183f90175058b0424eb0d89cb8b0424909090e8c26200008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410403000000c70101000000f6c101740cb8ecd57ab28b5d049090ff13f64424140175708b4424148b10837a04017507bbb8a788b2eb05bb24bf88b28b75008d76f43b75087303ff5520897500c746fc02000000895e04c70607000000f7c601000000740cb8ecd57ab28b5d049090ff138b5c2410f6c301740583eb027105ff5538ebf651568b02bac4a788b2e8d6010000eb05e9480000008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104588901eb0889c8b901000000508b442414a801740583e8027105ff5538ebf65189c38b442420ba640889b29090e8fa6100008b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab283f80175058b0424eb0c89c38b04249090e8167100008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701909a7ab28d410cc740fc0200000089480483c4045983c40489088b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c414890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c390900000000020040000|@13580,2097151,@2655|115,0,0 134,0,40 142,1,@4940 175,0,3 185,0,@6321 200,0,I48 216,0,I48 223,0,4 254,0,0 262,0,@13415 274,1,@4940 307,0,3 317,0,@6321 358,0,@6363 393,0,@13416 398,1,@13418 429,0,0 454,1,@13553 488,0,0 495,0,0 502,0,1 508,0,0 518,0,@6321 549,0,@13415 556,0,@13445 589,0,3 602,0,@6321 637,0,@13416 642,1,@13418 680,0,0 703,0,@5592 728,0,0 759,0,@13554 766,1,@13556 797,0,0 818,0,@5592 837,0,@6503 856,0,@5592 878,1,@13579 911,0,@5591 966,0,@5592 1007,0,0 1014,0,0 1021,0,3 1027,0,0 1038,0,@6321 13415:S2|203a 13416:O2|@13418,@13417 13417:O2|@13440,@13439 13418:D3,772|3b650c7303ff5524f6c301740783fb017f0eeb06f643ff107406b868977ab2c3833805756b8b4804ff711053ff7108ff710c528b4104909090e8c2ffffff89c3b80100000083c40490e8da87f2ff53508b5c24108b442408ba98737bb2e866cbf2ff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b542408895104c70107000000f6c101741589c2eb05e995010000b8ecd57ab28b5d049090ff138b54240cf6c201740583ea027105ff5538ebf65051528b44241c9090e85602000089c3b801000000e85a87f2ff506814757bb26a0189d88b5c240cba94477bb2e8069ff2ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc0200000089410483c40458890183f90175058b0424eb0d89cb8b0424909090e8e20a00008b4d008d49a03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f0367bb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70080b488b28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480483c4045983c410890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c383380175756848c05208538b58048b42049090e86e0a0000909090e8ee0c00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700dc6286b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400401000000eb05e919000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c38b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000000030000|@13438,2097151,@2592|27,0,@5578 65,0,0 74,1,@6511 89,0,@6694 94,1,@6695 131,0,3 150,0,@6321 190,1,@13419 197,0,0 202,1,@6511 208,0,@6696 221,0,@6596 226,1,@6597 257,0,0 278,0,@5592 297,0,@6503 316,0,@5592 358,1,@13433 391,0,@5592 410,0,@6537 429,0,@5592 448,0,@13434 467,0,@5592 511,0,0 518,0,0 525,0,3 531,0,0 542,0,@6321 560,0,I48 574,1,@13435 582,1,@13437 615,0,@5592 634,0,@11997 656,0,0 663,0,1 670,0,0 683,0,0 694,0,@6321 738,0,3 749,0,@6321 13419:D3,668|3b650c7303ff55248b08ba0aab88b28d548afcffe290e9b1000000909090e923000000909090e9a7000000909090e9e2000000909090e907010000909090e9e90100009090908b48048b51148b1252ff7104ff7110bba4ad88b28b0190e8560200008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701010000008b55008d52dc3b55087303ff5520895500c742fc02000000c7420401000000890a89c18d420cc740fc050000008950108b54240489500c5a83c404895008894804c7000b000000c3b8e4107bb2c3ff700c8b400490e822ffffff508b4424049090e816ffffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c404894804c70005000000c38b48048b45008d40f03b45087303ff5520894500c740fc030000008b51048950088b19895804c7000d000000c3ff7008bba4ad88b28b4004e8d2010000909090e81603000089c389d8909090e8a60500008b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108894104c7010100000083fa01752d8b45008d40ec3b45087303ff5520894500c740fc0100004089088d4808c741fc02000000894104c701030000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000700000083fa0175408b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d000000891183c404c383c404c3bba4ad88b28b400490e832050000bb030000009090e89205000089c389d8909090e85a0600008b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c70007000000c39090900000000098020000|@13432,2097151,@2588|11,0,$13419+22 86,0,@13420 94,1,@13421 128,0,0 159,0,0 199,0,5 205,0,@6455 272,0,2 317,0,6 326,0,@13420 334,1,@13422 342,1,@13423 354,1,@13427 393,0,0 443,0,1 479,0,3 514,0,@5413 533,0,79992 542,0,6 557,0,@13420 566,1,@13428 571,0,1 578,1,@13429 590,1,@13431 621,0,1 630,0,0 652,0,3 13420:O1|@13419 13421:D3,88|3b650c7303ff5524a801753e53ff70048b0089daff12508b5c24088b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000054000000|@6329,1048575,@2580|75,0,0 13422:D3,312|3b650c7303ff5524a801755c8b088b1153ff7004ff328b410489da90ff125950f6c1017407b803000000eb068b018d440001a801740783f8037f08eb5ef640ff10755df6c1017407b803000000eb068b018d440001a801740783f8017e08eb19f640ff107413eb05e9bd000000b8a8f179b28b5d049090ff13f6c101750a0fb641048d440001eb0289c883f8617546f6c1017411b803000000eb10e935000000e9300000008b018d440001a801740583e8027105ff5538ebf650bb0300000089c8e8721df7ff89c13b650c7303ff5524e94bffffff89c88b4d008d49f43b4d087303ff5520894d00c741fc020000005a8951048901518b5c24088b442404909090e8fafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000034010000|@6329,1048575,@2581|38,0,1 73,0,1 110,0,@4898 149,0,1 187,0,1 194,1,@8870 299,0,0 13423:D3,64|3b650c7303ff5524a80175248b0851ff318b400490e8e6ffffff8b4c24048b542408894c24085b83c40452e924000000b801000000c39090000000003c000000|@13426,63,@2583|44,1,@13424 49,0,0 13424:D3,484|3b650c7303ff5524a801755a8b08f6c3017407ba03000000eb068b138d5412018b39f7c7010000007407be03000000eb068b378d743601f6c201750bf7c6010000007503ff55383bd6755a3bdf744bf6c3017543f7c701000000753bf7c701000000740eeb05e948010000ba03000000eb068b178d54120183c20889deff3189d1d1e93bc9f3a68d7c3f018d7436018d4c09017406eb1357eb1057b90100000083c404eb30e93600000050ff3053ff70048b5c24108b442404909090ff15a8bd520883f8017507b903000000eb58b9ffffffffeb646a0150ff3053ff7004eb59f6c3017407ba03000000eb068b138d541201f7c7010000007407be03000000eb068b378d743601f6c201740cf7c60100000074043bd6eb05ff5538ebf77c0cb903000000eb0ae90e000000b9ffffffff6a0150ff3053ff7004f6c101740783f9017f33eb06f641ff10742b8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c2418890883c414c20400ff7424188b5c24088b442404909090e876feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2408890883c414c204008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24048908c204009000000000e0010000|@13425,63,@2582|20,0,1 43,0,1 108,0,1 156,0,0 190,0,I27 200,0,1 207,0,-1 230,0,1 251,0,1 288,0,1 300,0,-1 462,0,0 13425:S35|545950455f5452454528292e736f72744c6162656c73283129656e7465722833292829 13426:S25|545950455f5452454528292e736f72744c6162656c73283129 13427:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2584|60,0,0 13428:D3,88|3b650c7303ff5524a801753e53ff70048b0089daff12508b5c24088b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000054000000|@6329,1048575,@2585|75,0,0 13429:D3,156|3b650c7303ff5524a8017572ff700453ff30bb030000008b442404bafc317ab290e8327ff1ff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890158a801740583c0027105ff5538ebf65189c38b442404909090e89effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e90a0000008948045983c4048908c3b801000000c3900000000098000000|@13430,2097151,@2586|19,0,1 28,0,@5052 34,1,@5053 142,0,0 13430:S26|545950455f5452454528292e6d6170746f5265636f7264283229 13431:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2587|60,0,0 13432:S32|545950455f5452454528292e7479706546726f6d547970655061727365283129 13433:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2589| 13434:O2|3,@12873 13435:D3,592|3b650c7303ff5524f6c301756c837b0401756b8b4c2404f6c101740783f9017f10eb06f641ff107408b8601c7bb2c2080089c28b45008d40f43b45087303ff5520894500c740fc020000008948048b1b89189090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000eb0ae9bf010000e9050000008908c208008b4c2404f6c101740783f9017f10eb06f641ff107408b8601c7bb2c20800837c2408597415837c2408777407ba01000000eb0cba03000000eb05ba0300000083f20289c68b45008d40f43b45087303ff5520894500c740fc020000008948048b3b893856ff73045289f29090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c70103000000f6c101740d89c2b8ecd57ab28b5d0490ff138b55008d52f43b55087303ff5520895500c742fc020000008b5c2410895a04c70207000000f6c201740e89c6b8ecd57ab28b5d049090ff138b75008d76c43b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc02000000897204890a8d4a0cc741fc0200000089510489018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c240cf6c101740583e9027105ff5538ebf65053518b5c240c8b4424109090e8fafdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c20800b801000000c20800909090000000004c020000|@13436,1048575,@2590|42,0,@6486 115,0,0 159,0,@6486 181,0,0 188,0,1 195,0,1 273,0,0 283,0,1 295,0,@6321 338,0,3 350,0,@6321 388,0,0 440,0,0 447,0,0 454,0,0 460,0,0 471,0,@6321 547,0,@5592 574,0,0 13436:S27|5349474e41545552455328292e646973706c61794c697374283429 13437:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2591|56,0,@7743 13438:S27|5349474e41545552455328292e646973706c617953696773283229 13439:O3|@13443,@13442,@13416 13440:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@13441,1048575,@2593| 13441:S28|5349474e41545552455328292e646973706c61795370656373283129 13442:O2|@13551,@13416 13443:D3,1436|3b650c7303ff5524f6c301740783fb017f0eeb06f643ff107406b868977ab2c38b08be32b888b28d748efcffe690e9ba000000909090e9ce000000909090e9cf020000909090e957030000909090e90b000000909090e9f2030000909090ff720868b4bd88b268086083b2538b58048d4424089090e80efcffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70050287bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c3f6c301740583eb027105ff5538ebf68b4004ba68bf88b2e9770600008b4808f6400c01756d8b500c53ff32bbb8a788b28b019090e86a52f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442404a801740583e8027105ff5538ebf651508b442408e87af1ffff89c3b801000000eb05e9da00000090e87676f2ff506814757bb26a0189d88b5c240cba94477bb2e8228ef2ff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc0200000089410483c4045883c40889018b45008d40d03b45087303ff5520894500c740fc020000008948049090c70090dc7bb28d480cc741fc02000000894104c70160dc7bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c38b55008d52f43b55087303ff5520895500c742fc020000008b19895a04c70207000000f6c201740bb8ecd57ab28b5d0490ff138b75008d76c43b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc02000000897204c70290dc7bb28d720cc746fc02000000895604c70660dc7bb28d460cc740fc05000000897010c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c2b8ecd57ab28b5d0490ff13c3f6c301740583eb027105ff5538ebf66848c05208538b58048b4204e856f9ffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700940689b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c3837808017407b9a00689b2eb05b901000000516a7b538b580cb8ac0689b290e8c2f8ffff83f80175058b0424eb0a89c38b0424e8524b00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700880789b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c404c38b480853ff700cbbb8a788b28b019090e82e4ff1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442404a801740583e8027105ff5538ebf651508b442408e83eeeffff89c3b801000000e84273f2ff506814757bb26a0189d88b5c240cba94477bb2e8ee8af2ff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc0200000089410483c4045883c40889018b45008d40d03b45087303ff5520894500c740fc020000008948049090c70090dc7bb28d480cc741fc02000000894104c7017c0489b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000098050000|@13550,2097151,@2638|27,0,@5578 35,0,$13443+46 98,0,@13444 103,0,@10070 118,1,@13435 151,0,@5592 170,0,@6506 192,0,0 199,0,0 206,0,3 212,0,0 223,0,@6321 256,0,@13447 261,1,@13449 281,0,@13415 290,1,@4940 323,0,3 333,0,@6321 370,1,@13419 377,0,0 390,1,@6511 396,0,@6696 409,0,@6596 414,1,@6597 445,0,0 466,0,@5592 523,0,@6813 542,0,@6810 562,0,0 569,0,0 576,0,0 582,0,0 593,0,@6321 637,0,3 647,0,@6321 684,0,0 705,0,@6813 724,0,@6810 744,0,0 751,0,0 758,0,0 764,0,0 775,0,@6321 802,0,I48 814,1,@13435 847,0,@5592 866,0,@13543 888,0,0 895,0,1 902,0,3 908,0,0 919,0,@6321 937,0,@13544 944,0,0 956,0,@13545 962,1,@13435 982,1,@13548 1015,0,@5592 1034,0,@13549 1056,0,0 1063,0,0 1070,0,3 1076,0,0 1087,0,@6321 1109,0,@13415 1118,1,@4940 1151,0,3 1161,0,@6321 1198,1,@13419 1205,0,0 1210,1,@6511 1216,0,@6696 1229,0,@6596 1234,1,@6597 1265,0,0 1286,0,@5592 1343,0,@6813 1362,0,@13533 1382,0,0 1389,0,0 1396,0,0 1402,0,0 1413,0,@6321 13444:D3,348|3b650c7303ff55248b088b590c8b75008d76f43b75087303ff5520897500c746fc020000008b7904897e04c70607000000f7c6010000007410ff7004b8ecd57ab28b5d04909090ff13837b04017507bfb8a788b2eb05bf24bf88b28b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70107000000f6c10174108b7804b8ecd57ab28b5d04909090ff138b4004a801740583e8027105ff5538ebf656518b3b89c389f88b5204909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc0200000089480459890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000058010000|@13446,1048575,@2594|45,0,3 61,0,@6321 80,0,@13415 87,0,@13445 120,0,3 133,0,@6321 205,0,0 226,0,@5592 294,0,0 301,0,0 308,0,3 314,0,0 325,0,@6321 13445:S3|203a3e 13446:S46|5349474e41545552455328292e646973706c61795370656373283229646973706c61795369677342696e64283129 13447:O3|@13449,@13537,@13448 13448:O2|@13541,@13447 13449:D3,7944|3b650c7303ff55245268a0de88b2f6c301740783fb017f11eb06f643ff107409b868977ab283c408c38b08bebabf88b28d748efcffe6e92e010000909090e97e040000909090e972050000909090e9b6070000909090e9f2080000909090e9960a0000909090e9960b0000909090e9f60c0000909090e94a0f0000909090e94b0f0000909090e9de0f0000909090e976100000909090e902110000909090e9a2110000909090e983000000909090e9d2120000909090e9ca130000909090e9be140000909090e952150000909090e996160000909090e9d2170000909090e962180000909090e956190000909090e9da190000909090e96e1a0000909090e9aa1a0000909090e94e1b0000909090e92a1c0000909090e92b1c0000909090e9ae1c0000909090e9ca1d00009090908b40048b088b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c38b480483790c03756e89daf6c201740583ea027105ff5538ebf653ff31ff7110526814df88b2bb086083b28b41089090e842210000f60424017407b901000000eb728b4c2408f6c101740583e9027105ff5538ebf6505168f8e588b2bb086083b28b44240c909090e80a210000909090e84e270000eb05e9a80100008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7010ce988b2eb01508b44240ca801740583e8027105ff5538ebf651508d44241850bb770000008b44241490e89a2000008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410803000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70020e17cb283f80175058b0424eb0c89c38b04249090e8aa26000083f8017507b89c757bb2eb0c89c3b89c757bb2e8ea26000083f80175068b442404eb0d89c38b4424049090e82a2700008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70020ea88b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c41cc389daf6c201740583ea027105ff5538ebf653ff7110526814df88b2bb086083b28b410890e82a1f0000f60424017407b901000000eb748b4c2404f6c101740583e9027105ff5538ebf6505168f8e588b2bb086083b28b44240c909090e8f21e00008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7000ce988b28d480cc741fc02000000894104c7019c9a7ab2eb015083f90175058b0424eb0c89cb8b04249090e85a2600008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700683b7bb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c414c389d9f6c101740583e9027105ff5538ebf65352ff700889cb8b400490e81efbffff8b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e8fafaffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70184ea88b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c408c38b48048b7104833e33755df6460401755c8b7e04f647040175588b7704837e040175688b7004837e0c0375648b4e048b79048b77048b400489d9f6c101740583e9027105ff5538ebf65352ff36ff3089cb8b0790e8eaf9ffff508b5c24108b4424048b54240ceb0fe903010000e9fe000000e9f900000090e8c6f9ffff8b4c2410f6c101741183e902eb0ae9e0000000e9db0000007105ff5538ebea5089cb8b44240c8b54241090e896f9ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c41089018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c38b400489def7c601000000740583ee027105ff5538ebf65352ff710489f38b00e8aef8ffff8b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e88af8ffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c408c38b480489def7c601000000740583ee027105ff5538ebf65352ff710489f38b01e8d2f7ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c7410490ea88b289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7019cea88b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4c2408f6c101740583e9027105ff5538ebf68b5424045051ff7204bbf90000008b44240c909090e8061a00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c890889c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c38b480489def7c601000000740583ee027105ff5538ebf65352ff7104ff710889f38b0190e88af6ffff8b4c240cf6c101740583e9027105ff5538ebf65089cb8b4424048b54240c90e866f6ffff8b4c2410f6c101740583e9027105ff5538ebf65089cb8b44240c8b54241090e842f6ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701f0a77cb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40d03b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701d8a77cb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c41089018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701c0a77cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c408c389d9f6c101740583e9027105ff5538ebf65352ff700489cb8b400890e8e6f4ffff508b4424049090e84ae0ffff89c3b801000000e84e65f2ff506814757bb26a0189d88b5c2418ba94477bb2e8fa7cf2ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c408c38b48048b55008d52f43b55087303ff5520895500c742fc020000008b5908895a04c70207000000f6c201740cb8ecd57ab28b5d049090ff138b75008d76f43b75087303ff5520897500c746fc020000008b790c897e04c70607000000f7c601000000740cb8ecd57ab28b5d049090ff138b45008d807cffffff3b45087303ff5520894500c740fc02000000c740040100000089308d700cc746fc02000000894604c7069c9a7ab28d460cc740fc02000000897004c700683b7bb28d700cc746fc02000000894604c7069c9a7ab28d460cc740fc020000008970049090c70024287bb28d700cc746fc02000000894604c7069c9a7ab28d460cc740fc0200000089700489108d500cc742fc02000000894204c7029c9a7ab28d420cc740fc02000000895004c700683b7bb289c28d400cc740fc05000000895010c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c2b8ecd57ab28b5d04ff1383c408c38b4804833903757253ff7008bb030000008b4104bafc317ab2909090e81665f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480ceb05e95d000000c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7007c6186b28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101746ab8ecd57ab28b5d04909090ff13833901755d53ff7008bb030000008b4104bafc317ab29090e83e64f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b4508730feb0ae983000000e975000000ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700986186b28d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c1017415b8ecd57ab28b5d049090ff13b9b46186b253ff70088b442404a801740583e8027105ff5538ebf6515068a8ea88b2bb48c052088b44240c90e88e1300008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c408890889c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c3b834eb88b283c408c3526850eb88b2f6c301740583eb027105ff5538ebf6538d4c240451bb086083b28b4004e8ea1200008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70060dc7bb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c410c3f6c301740583eb027105ff5538ebf6538d4c240451bb770000008b4004909090e852120000909090e85a1e00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc02000000894804c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c3f6c301740583eb027105ff5538ebf653ff7204bbf90000008b400890e8b61100008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700c0327cb289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c3ff72085268d0ee88b289e151684cf988b2f6c301740583eb027105ff5538ebf6538d4c240451bb086083b28b40049090e80e1100008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70024fa88b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c41cc389d9f6c101740583e9027105ff5538ebf65352ff700889cb8b400490e89aedffff8b4c2408f6c101740583e9027105ff5538ebf68b5424045051ff7204bbf90000008b44240c9090e84e1000008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70030fa88b28d480cc741fc05000000894110c7410c01000000c7410803000000c7410407000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c40c890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c408c3f6c301740583eb027105ff5538ebf6ff700cff7004528b4424089090e812270000833c24017407b9a4a27ab2eb67f6442404017507b9a0637bb2eb05b998a27ab28b55008d52f43b55087303ff5520895500c742fc02000000894a04c70207000000f6c201740d89c1b8ecd57ab28b5d0490ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891183f901740789cbe8fa2900008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70160a37ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c410c389d9f6c101740583e9027105ff5538ebf65352ff700889cb8b400490e85aebffff8b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e836ebffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701fcfd88b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c408c3f6c301740583eb027105ff5538ebf653ff7208bb590000008b400890e83e0d0000909090e8da2800008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc02000000894804c70064fe88b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c38b48108139580088b2742df6010175248b31bf580088b28b11b91d000000d1e93bc9f3a68d7c3f018d7436018d4c09017408eb538b11eb4f8b118b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410470fe88b28b400889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7004500000090e83a3bf1ffeb6b81faa0f087b27425f6c201756389d6bfa0f087b2b919000000d1e93bc9f3a68d7c3f018d7436018d4c0901755b8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410470fe88b28b400889018b45008d40f43b45087303ff5520894500c740fc02000000eb0ae91b000000e913000000894804c7007cfe88b2909090e8b23af1ffeb038b400889c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740f89c1b8ecd57ab28b5d04909090ff1383c408c38b4804837908017507ba10d77cb2eb05ba9ce286b28b75008d76f43b75087303ff5520897500c746fc02000000895604c70607000000f7c601000000740ab8ecd57ab28b5d04ff1389daf6c201740583ea027105ff5538ebf65356ff31528d54241052bb770000008b410490e8060b00008b4c2408f6c101740583e9027105ff5538ebf650518d4c241451bb770000008b44240ce8de0a0000909090e8fa26000083f8017507b8e4fe88b2eb0c89c3b8e4fe88b2e85627000083f80175058b0424eb0a89c38b0424e89a2700008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480483c4085983c404890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c408c38b4004f6c301740583eb027105ff5538ebf65368acff88b2bb48c052088b0090e80e0a00008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700440089b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c389d9f6c101740583e9027105ff5538ebf65352ff700889cb8b400490e89ae6ffff8b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e876e6ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701500089b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c408c3528b4004e8b6e5ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701b89a7ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c40cc3f6c301740583eb027105ff5538ebf6528b400490e81ae5ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7015c0089b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c40cc38b5804b847000000e89a30f1ff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff1383c408c3f6c301740583eb027105ff5538ebf653ff7208bb590000008b400490e8120700008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701f0a47ab28d410cc740fc02000000894804c700b89a7ab2909090e8da24000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c408c3f6400401750b8b48048b11837a14037407b9fc367bb2eb05b97c377bb28b55008d52f43b55087303ff5520895500c742fc02000000894a04c70207000000f6c201740d8b4804b8ecd57ab28b5d04ff13f6c301740583eb027105ff5538ebf6525368f8e588b2bb086083b28b40049090e8120600008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480459890889c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1383c408c3b8c40089b283c408c3f6c301740583eb027105ff5538ebf6528b4004e8ee2300008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7007c0489b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c389d9f6c101740583e9027105ff5538ebf65352ff700489cb8b400890e80ee2ffff8b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e8eae1ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701880489b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40c89018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701940489b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1383c408c3b8fca47cb283c408c3909000000000041f0000|@13536,2097151,@2633|10,0,@13450 33,0,@5578 44,0,$13449+54 336,0,3 347,0,@6321 395,0,@13452 400,0,@10070 410,1,@13458 421,0,0 449,0,@13463 454,0,@10070 466,1,@13458 474,1,@13469 514,0,@5592 535,0,@13470 568,0,59 578,1,@13458 612,0,0 619,0,1 626,0,3 632,0,0 642,0,@6321 680,0,0 701,0,@5592 720,0,@7767 742,1,@13471 752,0,@6702 761,0,@6702 766,1,@13472 790,1,@13473 823,0,@5592 842,0,@13474 864,0,0 871,0,1 878,0,3 884,0,0 895,0,@6321 932,0,@13452 937,0,@10070 946,1,@13458 957,0,0 985,0,@13463 990,0,@10070 1002,1,@13458 1035,0,@5592 1054,0,@13470 1073,0,@5592 1098,1,@13475 1131,0,@5592 1150,0,@6558 1172,0,0 1179,0,1 1186,0,3 1192,0,0 1203,0,@6321 1313,0,0 1334,0,@5592 1353,0,@13476 1372,0,@5592 1425,0,0 1432,0,1 1439,0,3 1445,0,0 1456,0,@6321 1669,0,0 1690,0,@5592 1739,0,@5592 1792,0,0 1799,0,0 1806,0,0 1812,0,0 1823,0,@6321 1937,0,0 1958,0,@5592 2011,0,0 2018,0,0 2025,0,0 2031,0,0 2042,0,@6321 2121,0,@13477 2142,0,@5592 2161,0,@13478 2181,0,0 2188,0,0 2195,0,0 2201,0,0 2212,0,@6321 2250,0,124 2262,1,@13458 2295,0,@5592 2336,0,0 2343,0,1 2350,0,3 2356,0,0 2367,0,@6321 2521,0,0 2542,0,@5592 2561,0,@7420 2580,0,@5592 2631,0,@5592 2650,0,@7418 2671,0,@5592 2723,0,@5592 2742,0,@7416 2762,0,0 2769,0,0 2776,0,0 2782,0,0 2793,0,@6321 2850,1,@13419 2857,0,0 2862,1,@6511 2868,0,@6696 2881,0,@6596 2886,1,@6597 2917,0,0 2938,0,@5592 2957,0,@6362 2976,0,@5592 3029,0,0 3036,0,0 3043,0,3 3049,0,0 3060,0,@6321 3108,0,3 3118,0,@6321 3161,0,3 3174,0,@6321 3215,0,0 3236,0,@5592 3255,0,@6558 3274,0,@5592 3295,0,@6503 3314,0,@5592 3348,0,@5592 3367,0,@6558 3389,0,0 3396,0,1 3403,0,3 3409,0,0 3420,0,@6321 3446,0,1 3454,0,@5052 3462,1,@5053 3495,0,3 3505,0,@6321 3544,0,0 3572,0,@5592 3591,0,@11987 3611,0,0 3618,0,0 3625,0,0 3631,0,0 3641,0,@6321 3663,0,1 3671,0,@5052 3678,1,@5053 3711,0,3 3721,0,@6321 3772,0,0 3793,0,@5592 3812,0,@11989 3832,0,0 3839,0,0 3846,0,0 3852,0,0 3862,0,@6321 3874,0,@11991 3903,0,@13479 3908,0,I48 3918,1,@13458 3951,0,@5592 3992,0,0 3999,0,1 4006,0,3 4012,0,0 4023,0,@6321 4038,0,@13482 4048,0,@13484 4074,0,@10070 4082,1,@13458 4115,0,@5592 4134,0,@6810 4156,0,0 4163,0,1 4170,0,3 4176,0,0 4187,0,@6321 4223,0,59 4234,1,@13458 4242,1,@13489 4275,0,@5643 4294,0,@5594 4316,0,0 4323,0,1 4330,0,3 4336,0,0 4347,0,@6321 4381,0,124 4390,1,@13458 4423,0,@5592 4442,0,@7005 4464,0,0 4471,0,1 4478,0,3 4484,0,0 4495,0,@6321 4514,0,@13490 4522,0,@13499 4548,0,@10070 4558,1,@13458 4591,0,@5592 4610,0,@13501 4632,0,0 4639,0,1 4646,0,3 4652,0,0 4663,0,@6321 4739,0,124 4750,1,@13458 4783,0,@5592 4802,0,@13502 4822,0,0 4829,0,1 4836,0,3 4842,0,0 4852,0,@6321 4888,0,0 4909,0,@5592 4950,0,0 4957,0,0 4964,0,0 4970,0,0 4981,0,@6321 5026,1,@13503 5037,0,@5609 5051,0,@6622 5058,0,@5608 5091,0,3 5103,0,@6321 5140,0,0 5154,1,@13505 5187,0,@5621 5207,0,0 5214,0,0 5221,0,2 5227,0,0 5238,0,@6321 5349,0,0 5370,0,@5592 5389,0,@13506 5408,0,@5592 5461,0,0 5468,0,1 5475,0,3 5481,0,0 5492,0,@6321 5525,0,44 5534,1,@13458 5542,1,@13507 5575,0,@5643 5594,0,@13508 5616,0,0 5623,0,1 5630,0,3 5636,0,0 5647,0,@6321 5666,0,@13219 5680,0,@13219 5687,0,14 5746,0,@13509 5784,0,34 5790,1,@4953 5798,0,@13188 5812,0,@13188 5817,0,12 5868,0,@13509 5918,0,@13510 5926,1,@4953 5966,0,3 5977,0,@6321 6003,0,@7750 6010,0,@12854 6043,0,3 6056,0,@6321 6093,0,59 6102,1,@13458 6133,0,59 6142,1,@13458 6150,1,@13511 6160,0,@13512 6169,0,@13512 6174,1,@13514 6194,1,@13515 6227,0,@5592 6271,0,0 6278,0,0 6285,0,3 6291,0,0 6302,0,@6321 6337,0,@13516 6342,0,I48 6350,1,@13458 6383,0,@5592 6402,0,@13519 6424,0,0 6431,0,1 6438,0,3 6444,0,0 6455,0,@6321 6565,0,0 6586,0,@5592 6605,0,@13520 6624,0,@5592 6677,0,0 6684,0,1 6691,0,3 6697,0,0 6708,0,@6321 6757,0,@5642 6778,0,@5643 6797,0,@5594 6817,0,0 6824,0,0 6831,0,0 6837,0,0 6848,0,@6321 6913,0,0 6934,0,@5592 6953,0,@13521 6973,0,0 6980,0,0 6987,0,0 6993,0,0 7004,0,@6321 7021,0,35 7026,1,@4940 7061,0,3 7072,0,@6321 7105,0,44 7114,1,@13458 7147,0,@5643 7166,0,@5594 7174,1,@13522 7210,0,0 7217,0,1 7224,0,3 7230,0,0 7241,0,@6321 7275,0,@6538 7282,0,@6543 7315,0,3 7328,0,@6321 7355,0,@13463 7360,0,@10070 7370,1,@13458 7403,0,@5592 7441,0,0 7448,0,1 7455,0,3 7461,0,0 7472,0,@6321 7486,0,@13523 7514,1,@13524 7547,0,@5592 7566,0,@13533 7588,0,0 7595,0,1 7602,0,3 7608,0,0 7619,0,@6321 7729,0,0 7750,0,@5592 7769,0,@13534 7788,0,@5592 7840,0,@5592 7859,0,@13535 7879,0,0 7886,0,0 7893,0,0 7899,0,0 7910,0,@6321 7926,0,@7402 13450:D3,28|3b650c7303ff55248b088b58048b018b5204ff220000000018000000|@13451,1048575,@2595| 13451:S60|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61794c69737457697468427074732d283129 13452:O1|@13453 13453:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@13462,1048575,@2600|16,1,@13454 13454:D3,336|3b650c7303ff55248b70088b38ff7014b801000000e89e50f2ff565357508b442410ba98737bb29090e82a94f2ff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c70107000000f6c101740c89c2b8ecd57ab28b5d04ff135af6c201740583ea027105ff5538ebf650515268b0e088b2bbf90000008b442410909090e88e0200008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70024287bb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480459890883f80175058b0424eb0b89c38b042490e8d604000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c40cc3909090000000004c010000|@13461,1048575,@2599|17,0,0 22,1,@6511 35,0,@6694 42,1,@6695 76,0,3 88,0,@6321 117,0,@13455 122,0,124 134,1,@13458 167,0,@5592 186,0,@6503 205,0,@5592 242,1,@13460 278,0,0 285,0,1 292,0,3 298,0,0 309,0,@6321 13455:O1|@13456 13456:D3,344|3b650c7303ff55248b088b55008d52f43b55087303ff5520895500c742fc020000008b5908895a04c70207000000f6c201740e8b7004b8ecd57ab28b5d0490ff13f641040175738b710452ff70048b0690e8e6c9ffff89c3b801000000e8ea4ef2ff506814757bb26a0189d88b5c240cba94477bb2e89666f2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70138457bb28d410cc740fc02000000894804c7009c9a7ab2eb08b801000000526a018b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c4045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400405000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c390900000000054010000|@13457,2097151,@2596|42,0,3 55,0,@6321 82,1,@13419 89,0,0 94,1,@6511 100,0,@6696 113,0,@6596 118,1,@6597 149,0,0 170,0,@5592 196,0,@6587 215,0,@5592 222,0,0 292,0,0 299,0,0 306,0,2 312,0,0 323,0,@6321 13457:S56|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436f6e7374727563746f72283129 13458:D3,632|3b650c7303ff55248b4c2408f6c101740783f9017f10eb06f641ff107408b8601c7bb2c20800a801757183780401754c8b108b45008d40f43b45087303ff5520894500c740fc0200000089480489108b54240490ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c208008b108b70048b45008d40f43b45087303ff5520894500c740fc02000000eb05e9c5010000894804891053568b54240c90ff12837c2404597456837c2404777454817c240448c05208743ef64424040175308b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017407b901000000eb26b903000000eb1fb901000000eb18b903000000eb11e907000000b903000000eb05b90300000083f1028b55008d52f03b55087303ff5520895500c742fc03000000c7420801000000894a04c70203000000f6c201740d89c1b8ecd57ab28b5d0490ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b5c2404895904c70107000000f6c101740e89c6b8ecd57ab28b5d049090ff138b75008d76c43b75087303ff5520897500c746fc02000000c7460401000000890e8d4e0cc741fc0200000089710489118d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c2410f6c101740583e9027105ff5538ebf65051ff7424148b44240c909090e8d2fdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c20800b801000000c208009090900000000074020000|@13459,1048575,@2597|31,0,@6486 115,0,0 192,0,I48 210,0,I48 215,0,4 240,0,0 247,0,1 254,0,0 261,0,1 273,0,1 280,0,1 314,0,0 323,0,1 335,0,@6321 378,0,3 390,0,@6321 428,0,0 480,0,0 487,0,0 494,0,0 500,0,0 511,0,@6321 587,0,@5592 614,0,0 13459:S30|5052494e545f50415253455452454528292e7072696e744c697374283429 13460:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2598| 13461:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283229 13462:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283129 13463:O1|@13464 13464:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@13468,2097151,@2603|16,1,@13465 13465:D3,404|3b650c7303ff55248b70088b38ff7018b801000000e8ba49f2ff535657508b442410ba98737bb29090e8468df2ff8b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c70107000000f6c101740c89c2b8ecd57ab28b5d04ff13f604240175738b142450518b02909090e84ec4ffff89c3b801000000e85249f2ff506814757bb26a0189d88b5c2418ba94477bb2e8fe60f2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab2eb0989c2b80100000052518b4d008d49f43b4d087303ff5520894d00c741fc0200000089410458890183f90175058b0424eb0c89cb8b04249090e86e00000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c410c39090900000000090010000|@13467,2097151,@2602|17,0,0 22,1,@6511 35,0,@6694 42,1,@6695 76,0,3 88,0,@6321 114,1,@13419 121,0,0 126,1,@6511 132,0,@6696 145,0,@6596 150,1,@6597 181,0,0 202,0,@5592 228,0,@6503 247,0,@5592 256,0,0 310,1,@13466 346,0,0 353,0,1 360,0,3 366,0,0 377,0,@6321 13466:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2601| 13467:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283229 13468:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283129 13469:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b89c757bb2c39090900000000044000000|@6536,3,@2604|56,0,@6702 13470:O2|3,@12850 13471:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2605| 13472:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2606| 13473:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2607| 13474:O2|3,@12819 13475:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2608| 13476:O2|3,@12872 13477:O2|@5592,@6585 13478:O2|3,@12816 13479:O1|@13480 13480:D3,64|8b088b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740e89c1b8ecd57ab28b5d049090ff13c39090000000003c000000|@13481,3,@2609|31,0,3 42,0,@6321 13481:S40|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229283129 13482:O2|3,@13483 13483:S7|3c456d7074793e 13484:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@13488,2097151,@2612|26,1,@13485 13485:D3,516|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000f6c10174118b50148b7008b8ecd57ab28b5d0490ff13f640080175738b700851ff7014538b06e812bfffff89c3b801000000e81644f2ff506814757bb26a0189d88b5c240cba94477bb2e8c25bf2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70138457bb28d410cc740fc02000000894804c7009c9a7ab2eb0b8b5014b8010000005152538b4c24048339117507b901000000eb738b1424f6c201740583ea027105ff5538ebf65089d389c88b54241490ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb289c88d490cc741fc02000000eb05e90b000000894104c7019c9a7ab2eb015083f90175058b0424eb0c89cb8b04249090e8860000008b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c40c5889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c204000000000000020000|@13487,2097151,@2611|39,0,3 55,0,@6321 82,1,@13419 89,0,0 94,1,@6511 100,0,@6696 113,0,@6596 118,1,@6597 149,0,0 170,0,@5592 196,0,@6587 215,0,@5592 225,0,0 242,0,0 305,0,0 326,0,@5592 345,0,@6503 373,0,@5592 398,1,@13486 465,0,0 472,0,0 479,0,0 485,0,0 496,0,@6321 13486:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2610| 13487:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283229 13488:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283129 13489:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@2613|56,0,@5642 13490:D3,272|3b650c7303ff55248b088b5804f6c301740583eb027105ff5538ebf6ff710452ff7004ff7204ff72088b019090e8f200000059f6c101740583e9027105ff5538ebf68b14245089cb8b4424088b520490ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c39090000000000c010000|@13498,2097151,@2620|46,1,@13491 109,0,0 130,0,@5592 149,0,@6503 168,0,@5592 221,0,0 228,0,1 235,0,3 241,0,0 252,0,@6321 13491:D3,1816|3b650c7303ff5524f6000175538b088b11833a33754ff6420401754e8b7204f646040175678b7e04837f040175638379040175628378080375618b480489daf6c201740583ea027105ff5538ebf6ff700c53ff37ff3189d38b068b542418eb0fe90e020000e909020000e90402000090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000eb14e9e2010000e9dd010000e9d8010000e9d30100005a895104c70107000000f6c101740e89c2b8ecd57ab28b5d049090ff138b542404f6c201740583ea027105ff5538ebf6505189d38b4424088b54241cff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c404890158a801740583e8027105ff5538ebf6f604240175738b142451508b02909090e886b9ffff89c3b801000000e88a3ef2ff506814757bb26a0189d88b5c240cba94477bb2e83656f2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab2eb08b801000000516a0183f80175068b442404eb0e89c38b442404909090e80a05000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c40cc20800f6000175578b088b11833a33755df6420401755c8b7204f646040175588b7e04837f0401756d83780803756c8b5004538b1c24f6c301740583eb027105ff5538ebf6ff700cff7104ff37ff328b068b54241c909090ff128b4d00eb05e97b0200008d49f43b4d087314eb0fe96c020000e967020000e962020000ff5520894d00c741fc020000005a895104c70107000000eb0ae944020000e93f020000f6c101740c89c2b8ecd57ab28b5d04ff138b54240cf6c201740583ea027105ff5538ebf6505189d38b4424088b542420ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104e4a47ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c700f0a47ab28d480cc741fc02000000894104c701b89a7ab28b442408a801740583e8027105ff5538ebf65150ff742418bb48c052088b44240c9090e85aeeffff8b4c240cf6c101740583e9047105ff5538ebf6f64424080175728b54240850518b0290e8c2b6ffff89c3b801000000e8c63bf2ff506814757bb26a0189d88b5c240cba94477bb2e87253f2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab2eb0a89c1b801000000516a0183f80175068b442404eb0c89c38b44240490e89e02000083f80175068b442408eb0d89c38b4424089090e8de02000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c418c208008b48048b55008d52f43b55087303ff5520895500c742fc020000008b31897204c70207000000f6c201740f8b780cff30b8ecd57ab28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c747049c757bb2891789daf6c201740583ea027105ff5538ebf6ff305357ff700c52ff742418bb48c052088b44241490e89aecffff8b4c2408f6c101740583e9047105ff5538ebf6f604240175738b142450518b02909090e802b5ffff89c3b801000000e8063af2ff506814757bb26a0189d88b5c240cba94477bb2e8b251f2ff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e91e000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab2eb0a89c1b801000000516a0183f80175068b442404eb0c89c38b44240490e88e01000083f80175068b44240ceb0d89c38b44240c9090e8ce01000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c418c20800900000000014070000|@13497,2097151,@2619|166,0,3 178,0,@6321 249,0,0 270,0,@5592 319,0,@5592 374,1,@13419 381,0,0 386,1,@6511 392,0,@6696 405,0,@6596 410,1,@6597 441,0,0 462,0,@5592 488,0,@6362 507,0,@5592 514,0,0 542,1,@13492 578,0,0 585,0,0 592,0,0 598,0,0 609,0,@6321 768,0,3 792,0,@6321 861,0,@5642 882,0,@5592 931,0,@5592 983,0,@5643 1002,0,@5594 1031,0,I48 1042,1,@13458 1082,1,@13419 1089,0,0 1094,1,@6511 1100,0,@6696 1113,0,@6596 1118,1,@6597 1149,0,0 1170,0,@5592 1196,0,@6362 1215,0,@5592 1224,0,0 1250,1,@13493 1274,1,@13494 1310,0,0 1317,0,0 1324,0,0 1330,0,0 1341,0,@6321 1393,0,3 1408,0,@6321 1444,0,@6702 1480,0,I48 1490,1,@13458 1530,1,@13419 1537,0,0 1542,1,@6511 1548,0,@6696 1561,0,@6596 1566,1,@6597 1597,0,0 1618,0,@5592 1644,0,@6362 1663,0,@5592 1672,0,0 1698,1,@13495 1722,1,@13496 1758,0,0 1765,0,0 1772,0,0 1778,0,0 1789,0,@6321 13492:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2614| 13493:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2615| 13494:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2616| 13495:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2617| 13496:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2618| 13497:S48|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446563283229 13498:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436c61757365283129 13499:D3,132|3b650c7303ff55248b088b5804f6c301740583eb027105ff5538ebf653ff7204bbf90000008b410490e8eae8ffff89c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000080000000|@13500,1048575,@2621|33,0,124 42,1,@13458 78,0,0 85,0,1 92,0,3 98,0,0 109,0,@6321 13500:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e746676616c62696e64283129 13501:O2|3,@12852 13502:O2|3,@12833 13503:D3,788|3b650c7303ff5524f6c301740783fb017f10eb06f643ff107408b8601c7bb2c20400a801756d83780401756c8b08ff710c53bb1c557cb28b01e81a11f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1358a801740583e8027105ff5538ebf65189c38b4424048b54240c90ff128b4d00eb0ae969020000e9b20000008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c204008b0853ff7004ff710cbb1c557cb28b019090e8f20ff1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b442408a801740583e8027105ff5538ebf65189c38b4424048b5424149090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104ac627bb289018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c2404f6c101740583e9027105ff5538ebf650ff74241089cb8b4424089090e836fdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c20400b801000000c204009090900000000010030000|@13504,1048575,@2622|27,0,@6486 51,0,@7216 58,1,@4940 91,0,3 101,0,@6321 181,0,0 202,0,@5592 255,0,0 262,0,0 269,0,0 275,0,0 286,0,@6321 326,0,0 345,0,@7216 354,1,@4940 387,0,3 397,0,@6321 469,0,0 490,0,@5592 543,0,0 550,0,0 557,0,0 563,0,0 574,0,@6321 612,0,@6617 634,0,0 641,0,0 648,0,0 654,0,0 665,0,@6321 743,0,@5592 770,0,0 13504:S54|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61795265634c697374283229 13505:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2623| 13506:O2|3,@12848 13507:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b83ca27cb2c39090900000000044000000|@6536,3,@2624|56,0,@7389 13508:O2|3,91 13509:O2|34,0 13510:S2|2322 13511:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2625|56,0,@7743 13512:O2|@5592,@13513 13513:O2|@7747,@6702 13514:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2626| 13515:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2627| 13516:O1|@13517 13517:D3,64|8b008b088b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c39090000000003c000000|@13518,3,@2628|33,0,3 44,0,@6321 13518:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745374724e616d65283129 13519:O2|3,@12870 13520:O2|3,@12858 13521:O2|3,@12830 13522:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4a47ab2c39090900000000044000000|@6536,3,@2629|56,0,@5642 13523:O2|3,@7276 13524:D3,624|3b650c7303ff5524a80175728b08f6c301740783fb017f10eb06f643ff107408b8601c7bb2c20400837910017507ba01000000eb05ba540389b289def7c601000000740583ee027105ff5538ebf652ff700453ff710489f38b018b5424149090ff128b4c2404f6c101740583e9027105ff5538ebf65089cb8b442404eb05e9da0100008b54241890ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70124287bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13837c24040175408b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890183f901750783c40858c2040089cb8b44240883c40c5983c40451e9180100008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104c40389b2890183f90175068b442408eb0e89cb8b442408909090e85a0100008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b0424a801740583e8027105ff5538ebf651ff74241489c38b44240ce8dafdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480459890883c40cc20400b801000000c20400909090000000006c020000|@13532,1048575,@2632|33,0,@6486 47,0,0 54,0,@13525 165,0,0 186,0,@5592 205,0,@6503 224,0,@5592 277,0,0 284,0,0 291,0,3 297,0,0 308,0,@6321 351,0,0 384,1,@13527 415,0,@13528 442,1,@13531 476,0,0 483,0,0 490,0,0 496,0,0 506,0,@6321 579,0,@5592 606,0,0 13525:O2|@13526,@6702 13526:O2|3,@12823 13527:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2630| 13528:O2|@5592,@13529 13529:O2|@13530,0 13530:O2|3,@10070 13531:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2631| 13532:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e7456616c42696e64283229 13533:O2|3,@6806 13534:O2|3,@12827 13535:O2|3,@12863 13536:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229 13537:O2|@13538,@13447 13538:D3,268|3b650c7303ff55248b088b5804f6c301740583eb027105ff5538ebf6ff3152ff70048b41048b720489f29090ff1259f6c101740583e9027105ff5538ebf68b14245089cb8b4424088b520490ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701fc0589b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c390900000000008010000|@13540,1048575,@2634|105,0,0 126,0,@5592 145,0,@13539 164,0,@5592 217,0,0 224,0,0 231,0,0 237,0,0 248,0,@6321 13539:O2|3,@12840 13540:S33|5052494e545f50415253455452454528292e646973706c61794d61746368283129 13541:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@13542,1048575,@2635| 13542:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283129 13543:O2|3,@12861 13544:O2|@6537,@6702 13545:O1|@13546 13546:D3,64|8b008b088b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740c89c1b8ecd57ab28b5d04ff13c39090000000003c000000|@13547,3,@2636|33,0,3 44,0,@6321 13547:S31|5349474e41545552455328292e646973706c61795370656373283229283129 13548:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2637| 13549:O2|3,@12810 13550:S28|5349474e41545552455328292e646973706c61795370656373283229 13551:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@13552,1048575,@2639| 13552:S27|5349474e41545552455328292e646973706c617953696773283129 13553:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2640| 13554:O2|@13556,@13555 13555:O2|@13565,@13564 13556:D3,1144|3b650c7303ff5524f6c301740783fb017f0eeb06f643ff107406b868977ab2c3833805756b8b480489def7c601000000740583ee027105ff5538ebf6ff710453ff71085289f38b0190e8b2ffffff837c2404017507b9b8a788b2eb05b924bf88b28b55008d52f43b55087303ff5520895500c742fc02000000894a04c70207000000f6c201741689c1b8ecd57ab2eb05e9cd0000008b5d04909090ff1383c40859f6c101740583e9027105ff5538ebf6505289cb8b442408bac4a788b2e89e9effff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40dc3b45087303ff5520894500c740fc020000008948045983c404890889c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c3833803757189d9f6c101740583e9027105ff5538ebf65352ff70046a77518b58088b4204909090e8fe0200008b4c2408f6c101740583e9027105ff5538ebf65089cb8b4424048b54240890e84efeffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410ceb05e9c8000000c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ecd67cb28d410cc740fc020000008948049090c7009c9a7ab29090e8f604000083f80175058b0424eb0a89c38b0424e83e0500008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70004d77cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c410c383380175768b48045352ff31bb510000008b4104e85a00f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b5c240c8b4424048b542408909090e8fafcffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000eb05e979000000c74104e4a47ab289018d410cc740fc020000008948049090c700f0a47ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c383380775756848c05208538b58048b42049090e8d6000000909090e80a0400008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700a01089b289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400403000000eb05e919000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c38b48048b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000a801740f89c1b8ecd57ab28b5d04909090ff13c390900000000074040000|@13563,2097151,@2645|27,0,@5578 86,0,@13415 93,0,@13445 126,0,3 138,0,@6321 185,0,@13416 190,1,@13418 221,0,0 242,0,@5592 313,0,0 320,0,0 327,0,0 333,0,0 344,0,@6321 394,1,@13557 461,0,0 491,0,@5592 510,0,@7747 531,0,@5592 538,1,@13559 558,1,@13560 591,0,@5592 610,0,@7749 632,0,0 639,0,0 646,0,3 652,0,0 663,0,@6321 690,0,40 698,1,@4940 731,0,3 741,0,@6321 808,0,@5642 831,0,@5643 884,0,0 891,0,0 898,0,1 904,0,0 915,0,@6321 932,0,I48 946,1,@13557 954,1,@13561 987,0,@5592 1006,0,@13562 1028,0,0 1035,0,1 1042,0,1 1055,0,0 1066,0,@6321 1110,0,3 1121,0,@6321 13557:D3,592|3b650c7303ff5524f6c301756c837b0401756b8b4c2404f6c101740783f9017f10eb06f641ff107408b8601c7bb2c2080089c28b45008d40f43b45087303ff5520894500c740fc020000008948048b1b89189090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000eb0ae9bf010000e9050000008908c208008b4c2404f6c101740783f9017f10eb06f641ff107408b8601c7bb2c20800837c2408597415837c2408777407ba01000000eb0cba03000000eb05ba0300000083f20289c68b45008d40f43b45087303ff5520894500c740fc020000008948048b3b893856ff73045289f29090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c70103000000f6c101740d89c2b8ecd57ab28b5d0490ff138b55008d52f43b55087303ff5520895500c742fc020000008b5c2410895a04c70207000000f6c201740e89c6b8ecd57ab28b5d049090ff138b75008d76c43b75087303ff5520897500c746fc02000000c746040100000089168d560cc742fc02000000897204890a8d4a0cc741fc0200000089510489018d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c240cf6c101740583e9027105ff5538ebf65053518b5c240c8b4424109090e8fafdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c20800b801000000c20800909090000000004c020000|@13558,1048575,@2641|42,0,@6486 115,0,0 159,0,@6486 181,0,0 188,0,1 195,0,1 273,0,0 283,0,1 295,0,@6321 338,0,3 350,0,@6321 388,0,0 440,0,0 447,0,0 454,0,0 460,0,0 471,0,@6321 547,0,@5592 574,0,0 13558:S28|535452554354555245535f28292e646973706c61794c697374283429 13559:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2642|56,0,@7743 13560:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2643| 13561:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2644|56,0,@7743 13562:O2|3,@12866 13563:S35|535452554354555245535f28292e646973706c617953747275637456616c7565283229 13564:O3|@13567,@13555,@13554 13565:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@13566,1048575,@2646| 13566:S30|535452554354555245535f28292e646973706c6179537472756374283129 13567:D3,476|3b650c7303ff5524f6c301740783fb017f0eeb06f643ff107406b868977ab2c3833801751cf6c301740583eb027105ff5538ebf68b4004ba68bf88b2e903aeffff833803756089d9f6c101740583e9027105ff5538ebf653ff7004526a77518b58088b4204e85efbffff8b4c2408f6c101740583e9027105ff5538ebf68b1424506a77518b5c24108b42049090e836fbffff909090e85601000083f801750cb8e4fe88b2eb14e99600000089c3b8e4fe88b2909090e89201000083f80175058b0424eb0a89c38b0424e8d60100008b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7003c1489b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c410c3ff720868481489b268086083b2538b58088d442408909090e86afaffff8b4d008d49d03b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70050287bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1383c408c390909000000000d8010000|@13578,2097151,@2653|27,0,@5578 56,0,@13447 61,1,@13449 102,1,@13557 142,1,@13557 150,1,@13568 160,0,@13512 174,0,@13512 182,1,@13569 202,1,@13570 235,0,@5592 254,0,@13571 276,0,0 283,0,0 290,0,3 296,0,0 307,0,@6321 325,0,@13572 330,0,@10070 346,1,@13557 379,0,@5592 398,0,@6506 420,0,0 427,0,0 434,0,3 440,0,0 451,0,@6321 13568:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8bcd67cb2c39090900000000044000000|@6536,3,@2647|56,0,@7743 13569:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2648| 13570:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2649| 13571:O2|3,@12854 13572:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@13577,2097151,@2652|26,1,@13573 13573:D3,620|3b650c7303ff55246a016a0183781003755b8b480883390575538b51048b75008d76f03b75087303ff5520897500c746fc030000008b7a0c897e088b4a08894e048b4a04890e8b4d008d49f83b4d087303ff5520894d00c741fc01000000893189e6890e89e18b32897104eb1089e1c7010100000089e18b50088951048b4d008d49f43b4d087303ff5520894d00c741fc020000008b4004894104c70107000000f6c101740bb8ecd57ab28b5d0490ff13f604240175718b04248b10837a04017507beb8a788b2eb05be24bf88b28b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704c70707000000f7c701000000740ab8ecd57ab28b5d04ff1389def7c601000000740583ee027105ff5538ebf651535789f38b02bac4a788b2e83292ffffeb05e9480000008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104588901eb0989c8b901000000505358a801740583e8027105ff5538ebf65189c38b44240c8b542414ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701041789b283f90175058b0424eb0b89cb8b042490e8960000008b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c4045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c204000000000068020000|@13576,2097151,@2651|113,0,0 157,0,3 167,0,@6321 195,0,@13415 202,0,@13445 235,0,3 248,0,@6321 285,0,@13416 290,1,@13418 328,0,0 351,0,@5592 376,0,0 437,0,0 458,0,@5592 477,0,@13574 498,1,@13575 568,0,0 575,0,0 582,0,3 588,0,0 599,0,@6321 13574:O2|3,@7216 13575:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2650| 13576:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283229 13577:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283129 13578:S30|535452554354555245535f28292e646973706c6179537472756374283229 13579:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2654| 13580:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283229 13581:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283129 13582:O1|@13583 13583:D3,268|3b650c7303ff55248b08ff7110ff7004bb1c557cb28b410490e896f2f0ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1358a801740583e8027105ff5538ebf65189c38b442404bac4a788b290e88a8effff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c390900000000008010000|@13584,2097151,@2657|17,0,@7216 26,1,@4940 59,0,3 69,0,@6321 104,0,@13416 110,1,@13418 141,0,0 162,0,@5592 215,0,0 222,0,0 229,0,3 235,0,0 246,0,@6321 13584:S47|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617953696742696e64283129 13585:S30|535452554354555245535f28292e646973706c6179546f70446563283229 13586:S30|535452554354555245535f28292e646973706c6179546f70446563283129 13587:O2|@13588,@4723 13588:D3,896|8dbc2444ffffff3b7d0c7303ff55286a016a016a0189d753ff308d5c2408b8010000009090e842d1fdff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b54240c8950048b5c240889186a016a016a01508d5c2404b801000000909090e8fed0fdff6a016a016a0189e3b8010000009090e8ead0fdff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b5424048950045b89186a016a016a01508d5c2404b8010000009090e8aad0fdff6a016a016a0189e3b8010000009090e896d0fdff8b44244c83c4048b4d008d49f03b4d087303ff5520894d00c741fc03000000c701281e89b28b50188951048b5c24408959088061ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706701e89b28b5820895e048b54242c8956088066ffbf8b5424488b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703b81e89b2578b7a30897b048b7c2420897b088063ffbf8b7c244cff72308b55008d52f03b55087303ff5520895500c742fc03000000c702001f89b28b7f14897a048b7c241c897a088062ffbf8b7c2450528b55008d52f03b55087303ff5520895500c742fc03000000c702481f89b28b7f2c897a048b7c2410897a088062ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707901f89b2528b5424588957048b5424488957088067ffbf8b542458ff72108b55008d52c83b55087303ff5520895500c742fc0d000000895a308b5c2404895a2c8b5c242c895a28897a248972208b74241489721c894a188b4c2408894a148b3c24897a108b5c243c895a0c8b5c2450895a088b5c2424895a04c702302189b28b5d008d5bec3b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc02000000c706882189b2895e048066ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701082289b28959048061ffbf8b7c2410ff742448535152ff742434ff742468ff7018ff74245cff7020ff742454ff742434ff742478ffb4248c000000ffb42484000000ff742474ff74243cff742448ff742458ff742474ff742450ff770456ffb4248c000000ff742478bb010000008b8424a4000000909090e8360600008b45008d40f43b45087303ff5520894500c740fc02000000c700e4a88cb28b4c245483c44c8948048060ffbf5a83c4085983c40451ff22909090000000007c030000|@15287,2097151,@3407|31,0,0 38,1,@12896 98,0,0 106,1,@12896 119,0,0 126,1,@12896 183,0,0 190,1,@12896 203,0,0 210,1,@12896 247,0,@13589 294,0,@13590 345,0,@13591 400,0,@13592 452,0,@13593 499,0,@13594 622,0,@13599 652,0,0 668,0,@13602 705,0,@13604 811,0,0 826,1,@13608 856,0,@15283 13589:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2660| 13590:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2661| 13591:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2662| 13592:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2663| 13593:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2664| 13594:D3,124|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c700202089b28948048060ffbf52518b5a0889da9090ff12588b008b0c248b490483c40450b8010000008b512490ff1283f801750258c389c358e9a30000009090900000000078000000|@13598,1048575,@2667|34,0,0 52,0,@13595 88,0,0 109,1,@13597 13595:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@13596,15,@2665|42,0,0 13596:S48|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d65732831295f2d283129 13597:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2666| 13598:S43|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d6573283129 13599:O1|@13600 13600:D3,16|b801000000c39090000000000c000000|@13601,1,@2668|1,0,0 13601:S36|535452554354555245535f28292e706173733253747275637473283329656e762d283129 13602:D3,52|8b52048b12b801000000f6c201751ba801740583c0027105ff5538ebf68b52043b650c7303ff5524ebe0c3900000000030000000|@13603,5,@2669|6,0,0 13603:S48|535452554354555245535f28292e706173733253747275637473283329746f704c6576656c49644e756d626572283129 13604:D3,300|8b52048b12b801000000f6c201752e8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b02890189c88b52043b650c7303ff5524ebcd83f8017507b868c05208eb70b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb15f641ff10750f89c2b850337db28b5d04909090ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9eb05e93e000000894ffcc647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f889c18b45008d40f43b45087303ff5520894500c740fc02000000c700482389b28948048060ffbfc30000000028010000|@13607,39,@2671|6,0,0 67,0,I49 74,0,0 120,0,16777215 137,0,@7886 152,0,0 202,0,0 280,0,@13605 13605:D3,52|a80174138b5a04b9ffffff00234bfc8d4c09013bc1720e89c1b8cc7b7ab28b5d049090ff138b4443fec390900000000030000000|@13606,15,@2670|8,0,8388607 26,0,@5401 13606:S52|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129283129 13607:S49|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129 13608:D3,2328|8dbc2458ffffff3b7d0c7303ff5528a801756c8b08833903756aff7004ff7104ff7108ff30f6c301755f8b038b088b50048b45008d40f43b45087303ff5520894500c740fc02000000c700342d89b28b7424708970048060ffbfff7304528b11ff12588b088b45008d40f43b45087303ff5520894500c740fc02000000eb0fe905080000e94e020000e926000000c700783789b28b5424748950048060ffbf89ca909090ff125b3b650c7303ff5524e971ffffffb8010000008b45008d40ec3b45087303ff5520894500c740fc04000000c700703989b2598948048b4c246c8948085a89500c8060ffbf6a016a016a0189e3909090e8fa16feff8b4424708b00b901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c850b8010000008b542470909090ff128b4c241050f6c10175418b01ff7104ff7008ff700cff7010ff742414ff742414ffb42488000000ffb42498000000ff74242c8b58048b0889c89090e862170000593b650c7303ff5524ebba8b44246c83c4085a83c40cff128b4424648b4c24608b54245c8b5c24588b7424548b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450898424ac000000898c24a8000000899424a4000000899c24a000000089b4249c0000008b442444898424980000008b442440898424940000008b44243c898424900000008b4424388984248c0000008b442434898424880000008b442430898424840000008b44242c898424800000008b4424288944247c8b442424894424788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c4448944240c897c2408bb0100000058e929fdffff833901756dff7004ff30ff7104ff7108f6c30175628b038b088b50048b45008d40f43b45087303ff5520894500c740fc020000009090c70030f88bb28b7424708970048060ffbfff7304528b11ff12588b088b45008d40f43b45087303ff5520894500c740fc02000000c70074f88bb2eb0ae9dd020000e91d0000008b5424748950048060ffbf89caff125b3b650c7303ff5524e977ffffffb8010000008b45008d40ec3b45087303ff5520894500c740fc04000000c700c8f88bb28b4c24088948048b4c24708948085a89500c8060ffbf6a016a016a0189e3e83e14feff8b4424748b00b901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c850b8010000008b542474909090ff128b4c241050f6c10175738b01ff7104ff7008ff700cff7010ff7014ff7018ff701cff7020ff7024ff7028ff702cff742430ff742430ffb424a8000000ffb424b8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000eb05e960000000ffb424cc000000ffb424ac000000ffb424ac000000ffb424ac000000ffb424ac000000ffb424ac000000ffb424ac000000ffb424ac000000ffb424ac000000ffb4248c0000008b58048b0889c8e82ad10200593b650c7303ff5524e923ffffff8b44243c83c4085a83c41090ff128b4424648b4c24608b54245c8b5c24588b7424548b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450578b7c2450898424ac000000898c24a8000000899424a4000000899c24a000000089b4249c0000008b442444898424980000008b442440898424940000008b44243c898424900000008b4424388984248c0000008b442434898424880000008b442430898424840000008b44242c898424800000008b4424288944247c8b442424894424788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c4448944240c897c2408bb0100000058e9d5f9ffff8b55008d52f03b55087303ff5520895500c742fc03000000c70210a68cb28b71088972048b7c245c897a088062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b4904890e8b4c24608b79288b3fff70048b41148b00538b593c8b1b528b51388b12568b75008d76e83b75087303ff5520897500c746fc05000000895e1089560c897e088946048b4918890eff74241cff74246cff74246cff74247c566848c05208ff7424388b5c24208b44241cba88188cb290e8426103008b4424708b480c8b0983f9017407b901000000eb3a8b4d008d49e83b4d087303ff5520894d00c741fc020000008b5424148951048b5c2418891989ce8d490cc741fc020000008b7c240889790489318b54246c83c40c8b5c245c8b7424588b7c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454518b4c2454898424b0000000899424ac000000899c24a800000089b424a400000089bc24a00000008b4424448984249c0000008b442440898424980000008b44243c898424940000008b442438898424900000008b4424348984248c0000008b442430898424880000008b44242c898424840000008b442428898424800000008b4424248944247c8b442420894424788b44241c894424748b442418894424708b4424148944246c8b442410894424688b44240c894424648b442408894424608b4424048944245c5883c44489442410894c240c5b58e977f7fffff6c30175708b038b088b50048b45008d40f43b45087303ff5520894500c740fc02000000c70018a88cb28b7424608970048060ffbfff7304528b11ff12588b088b45008d40f43b45087303ff5520894500c740fc02000000c7005ca88cb28b5424648950048060ffbf89caff125b3b650c730aeb05e905000000ff5524eb81b801000000c260000000000014090000|@15282,2097151,@3404|75,0,@13609 144,0,@13634 181,0,0 211,0,@13639 246,1,@13015 257,0,0 297,0,0 370,1,@13647 717,0,0 783,0,@14939 835,0,@14940 881,0,0 911,0,@14941 946,1,@13015 957,0,0 997,0,0 1218,1,@14944 1569,0,0 1605,0,@15278 1653,0,0 1751,0,I48 1768,0,@14980 1774,1,@15222 1793,0,0 2223,0,@15280 2275,0,@15281 2313,0,0 13609:D3,48|3b650c7303ff55248b48048b52048b1c2489142468782d89b289da8b590c8b3089f052e948020000000000002c000000|@13633,1048575,@2679|21,0,@13610 36,1,@13619 13610:O2|@13611,@6836 13611:D3,364|3b650c7303ff552489d3b8010000009090e82ecff2ff5350bb042f89b2b805000000909090e85a0af2ff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c74104302f89b2c701f0707ab28b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008b0c248d500cc742fc02000000c74204010000008b490483c404890a8b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701502f89b28d510cc742fc02000000894a04c702f0707ab289c389d09090e826cdf2ff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c74004702f89b289088d480cc741fc0200000089410489198d410cc740fc03000000c7400801000000894804c7001d000000f6c1017405e9c5eaf2ffc30000000068010000|@13618,1048575,@2673|11,0,0 18,1,@6884 25,0,@13612 30,0,2 38,1,@6547 69,0,1 76,0,0 83,0,1 97,0,0 104,0,@13614 110,0,@5281 143,0,7 163,0,0 204,0,@13615 223,0,@5281 234,1,@6881 265,0,1 272,0,@13616 281,0,3 298,0,@13617 332,0,0 341,0,14 351,1,@6933 13612:O1|@13613 13613:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@2672|1,0,@5280 13614:S21|636f6465466f72556e6971756549642d657175616c 13615:O3|2,64,0 13616:O3|2,I11,0 13617:O2|@5897,@5273 13618:S31|545950454944434f444528292e636f6465466f72556e697175654964283129 13619:D3,124|3b650c7303ff55248b4d008d49e03b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc05000000c702343089b2894a048b4c2408894a088b74240489720c8942108062ffbf89d090e8d285f2ff89c189d889caff1289c1b80100000089ca90ff12b801000000c2080090900000000078000000|@13632,1048575,@2678|34,0,0 50,0,@13620 82,1,@6751 97,0,0 107,0,0 13620:D3,72|89c18b45008d40e43b45087303ff5520894500c740fc06000000c700903089b28948048b4a048948088b5a0889580c8b720c8970108b7a108978148060ffbfc30000000044000000|@13631,63,@2677|28,0,@13621 13621:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff721489de8b5a0456e91f000000909090000000002c000000|@13630,2097151,@2676|33,1,@13622 13622:D3,860|3b650c7303ff5524833b0d75668b43048b00833803753e8b4308c1e80383c801a801740783f8017d1feb06f640ff107417ff7304ff730889c3b88c6c7ab29090ff1588c75208eb06ff7304ff730883f803756ceb08ff7304ff7308eb678b4424188b009090e80603000089c3b8bf000000eb05e9d302000090e842daf0ff8b4c24188b09f6c101740583c1027105ff5538ebf68b542418890a8b4c24148b59288b1b8b71148b368b793c8b3f8b51388b12508b45008d40e83b4508730feb0ae97c020000e977020000ff5520894500c740fc0500000089781089500c8958088970048b491889088b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108ac3589b28941048b142489115051b8010000008b54241c909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b44240c83e00983f8017407b801000000eb05b80300000083f0028b55008d52c83b55087303ff5520895500c742fc0100004089028d4208c740fc04000000c7400c01000000c7400801000000895004c700030000008d5014c742fc030000005b895a08894204890a8d4210c740fc0200000059894804c700010000008b4d008d49cc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc030000008950088948048b0c2489088d5010c742fc05000000c742100100000089420c894a08c7420401000000c7020b0000008b44241883c4048b48288b098b58148b1b8b703c8b368b78388b3f528b55008d52e83b55087303ff5520895500c742fc05000000897210897a0c894a08895a048b401889028b45008d40e83b45087303ff5520894500c740fc02000000c74004dc3589b28b4c2410890889c38d400cc740fc020000008958049090c700343689b25290e8eeddf0ffbb5cbe86b29090e83e8bfdff909090e8c63bfeff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c700010000008b4c24188b5130ff128b442408598908b80100000083c408c21000b80100000083c408c21000b801000000c21000900000000058030000|@13629,2097151,@2675|58,0,@5215 66,0,I106 102,1,@13623 109,0,95 122,1,@4940 258,0,@13625 273,0,0 315,0,1 332,0,0 339,0,1 385,0,0 392,0,0 401,0,1 440,0,0 471,0,0 511,0,0 524,0,0 530,0,5 630,0,@13626 659,0,@13628 666,1,@4953 671,0,@12744 678,1,@12747 686,1,@13068 720,0,0 727,0,0 734,0,3 740,0,0 750,0,@6321 795,0,0 801,0,0 822,0,0 833,0,0 844,0,0 13623:D3,280|3b650c7303ff5524a801740783f8357c63eb06f640ff10755ba801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903741189c1f6c101740583e9327107ff5538ebf689c150bb3500000089c89090ff15e8c75208a801740583e8027105ff5538ebf690e88effffffeb0889c1b848c052085150bb350000008b4424049090ff1508c8520883f8017430a801740783f8017d0feb06f640ff107407b901000000eb05b90300000083f903740ea801740583c0347105ff5538ebf6a801740881c0c20000007105ff5538ebf3a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e14eb06f640ff10750c89c1b8500b7ab28b5d04ff1389c35883c404e940d6f0ff0000000014010000|@13624,2097151,@2674|43,0,0 50,0,1 80,0,26 90,0,I109 119,0,I48 126,0,26 138,0,I110 165,0,0 172,0,1 235,0,255 252,0,@4936 268,1,@4940 13624:S50|545950455f5452454528292e636865636b466f7246726565547970655661726961626c657328342967656e4e616d65283129 13625:S38|436f6e73747275637465642066726f6d206120667265652074797065207661726961626c652e 13626:O2|@13627,0 13627:S65|2920636f6e7461696e73206120667265652074797065207661726961626c652e2053657474696e6720697420746f206120756e69717565206d6f6e6f747970652e 13628:S13|5468652074797065206f662028 13629:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283229 13630:S56|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129283129 13631:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129 13632:S40|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429 13633:S49|535452554354555245535f28292e706173733253747275637473283329636865636b5661726961626c6573283229283129 13634:D3,64|3b650c7303ff552452ff7004bb5d0000008b009090e802d4f0ff598b14248b520483c4048b1c2489142489da8b590852e91f000000909090000000003c000000|@13633,1048575,@2682|13,0,46 22,1,@4940 49,1,@13635 13635:D3,48|3b650c7303ff552450ff74240868103889b289e0508b03bb0100000090e8c2c6f1ff83c40cc20400000000002c000000|@13638,1048575,@2681|14,0,@13636 24,0,0 30,1,@6418 13636:D3,248|3b650c7303ff55248b4c24045052f6c301755d8b03813864e239b275588b0c24ff7304508b5c240c8b41089090e852d3f0ffbb5d0000009090e846d3f0ff8b0c24813964e239b2740c89c2b854eb7ab28b5d04ff138b490883c4048b542404ff72048b5908ba1c3989b29090ff12eb58e9700000008138ece139b275508b0c24ff7304508b5c240c8b41089090e8f2d2f0ff8b0c248139ece139b2740c89c2b854eb7ab28b5d04ff138b490883c4048b542404ff720468782d89b28b590c909090e8cef6ffffeb0de908000000b801000000ff730489c15b3b650c7303ff5524e929ffffff89c883c408c2040090909000000000f4000000|@6417,1048575,@2680|23,0,@4611 46,1,@4940 51,0,46 58,1,@4940 67,0,@4611 76,0,@6377 102,0,@13637 119,0,@4596 142,1,@4940 151,0,@4596 160,0,@6377 183,0,@13610 194,1,@13619 206,0,0 13637:O1|@13635 13638:S66|535452554354555245535f28292e706173733253747275637473283329636865636b537472756374536967466f7246726565547970655661726961626c6573283229 13639:D3,220|3b650c7303ff5524ff720468603a89b25289c3b8d03a89b290e806d2f0ffbbe43a89b29090e8fad1f0ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b04248d54240452ff700c51bb030000008b4008e8da00000083c40cc2040000000000d8000000|@13646,1048575,@2685|12,0,@13640 20,0,@13642 26,1,@4940 31,0,@13643 38,1,@4940 71,0,3 81,0,@6321 120,0,0 142,0,0 149,0,0 156,0,0 162,0,0 172,0,@6321 194,0,1 202,1,@13644 13640:D3,28|3b650c7303ff552489c38b4204e96a67ffff90900000000018000000|@13641,2097151,@2683|14,1,@13411 13641:S54|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329283129 13642:S10|5369676e617475726520 13643:S43|2068617320616c7265616479206265656e20626f756e6420696e2074686973206465636c61726174696f6e 13644:D3,336|3b650c7303ff55248b4834f6c10175358b11813ad4e539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01756cb97c787cb2f6c10175358b11813ad4e539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01750d89c1b8287c7cb28b5d0490ff138b0e8139d4e539b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0e8139d4e539b2740d89c2b854eb7ab28b5d0490ff138b5108535089d08b542414ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241089500c8b5c240c8958088948048b4c240489088b342483f90174098b4e0cc701030000008b563083c4085983c40c51ff2290000000004c010000|@13645,1048575,@2684|20,0,@4671 70,0,0 80,0,@7313 93,0,@4671 143,0,0 155,0,@7368 169,0,@4671 178,0,@6377 206,0,@4671 215,0,@6377 310,0,1 13645:S29|535452554354555245535f28292e6572726f724d73674e656172283529 13646:S51|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329 13647:D3,460|3b650c7303ff55245350ff742418ff742418ff742418508b5c242c8b442430bac03e89b290e8c20100008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701010000008b54240cff7014ff7010ff7008ff3051b8010000008b5a4089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b0424833803756c8b50048b128b400c8b008b1883fb017507b868c05208eb5989ce89d989c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f05e89f989cf5189d9d1e983c604f3a58d7c3f018d7436018d4c09018b0c24eb0ae938000000e90d0000008061ffbf89c389c883c40489d98b5d008d5bf03b5d087303ff5520895d00c743fc03000000894308895304c70301000000eb0289c38b45008d40d83b45087303ff5520894500c740fc060000008b54240c83c4048950148b54240489501089480c5983c4088948088b0c2489480489188b54242489028b5c240889c68d401cc740fc02000000897004890889da83c4045983c42051ff229000000000c8010000|@14938,2097151,@3244|32,0,@13648 38,1,@13649 72,0,0 93,0,0 135,0,2 152,0,0 200,0,I49 213,0,0 345,0,0 13648:O2|@13649,@13379 13649:D3,1596|8dbc2478ffffff3b7d0c7303ff55288b4d008d49f03b4d087303ff5520894d00c741fc01000040c70101000000c7011c4589b28d4908c741fc01000040891989ceb91700000089c7b860877ab2578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40e03b45087303ff5520894500c740fc02000000897804c700030000008d480cc741fc0100004089018d4108c740fc02000000c7400460877ab28908b91700000089c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40e03b45087303ff5520894500c740fc02000000897804c700030000008d480cc741fc0100004089018d4108c740fc02000000c740040100000089086a016a016a016a018b4c241483390175706a016a016a016a016a016a015356ff71086a016848c052088d7c24145751ff7424545653ff74245050ff742470ff742470ff7204ff7424708b5c247c8b4104ba6c5089b290e82a1000008d4424208b4c240889088d4424208b4c240c8948048d4424208b4c24148948088d442420eb05e9090000008b4c241889480ceb6c833905756c8b79046a016a016a016a016a016a015356ff7708ff7710ff37ff7424506848c0520851ff7424585653ff74245450ff742474ff742474ff7204ff7424748b5f0c8b4704ba785089b29090e8ee9702008d4c24208b1089118d4c24208b58048959048d4c2420eb0ae993000000e9120000008b700c8971088d4c24208b781089790ceb706a016a016a016a016a016a0153566a016a016a016a016a016a01ff710cff7424606848c052088d7c240c57ff74246c51ff742470ff72045653ff74247050ffb424900000008b59088b4104e8ae3000008d4424385989088d4424345983c4048948048d44242c598948088d442428eb05e9070000005983c40489480c6828ec8bb2bb010000008b44242490e80abdf1ff8b4d008d49f03b4d087303ff5520894d00c741fc010000408b54240489118d5908c743fc0100004089036a016a01ff74240852ff74244051538d5c2414b80100000090e836ac0200837c2404017507b868c05208eb70b8010000008b4c2404f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb12f640ff10750c89c1b850337db28b5d04ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c240483f90174238b11895447fea801740583c0027105ff5538ebf68b510489d13b650c7303ff5524ebd88067ffbf89f8833c24017472b9010000008b1424f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb13f641ff10750d89c2b850337db28b5d0490ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93e000000c647ff4057f3ab5fb8010000008b0c2483f90174238b19895c47fea801740583c0027105ff5538ebf68b590489d93b650c7303ff5524ebd88067ffbfeb07bf68c0520889c28b45008d40ec3b45087303ff5520894500c740fc04000000c700e4f68bb28b4c24508948048950088b5c240c89580c8060ffbfbeffffff002372fc8d743601baffffff002357fc8d541201f7c6010000007508f6c2017503ff55383bf27407ba01000000eb05ba0300000083fa0174068b442434eb2e89c28b45008d40f03b45087303ff5520894500c740fc03000000c70090f78bb28b7424348970048950088060ffbf8b542428833a03756b8b72048b368b520c8b128b3a83ff017507ba68c05208eb5889f950b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f089d689f989cf89ca59d1e983c604f3a58d7c3f018d7436018d4c09018062ffbfeb0ae930000000e90400000089c6eb01508b45008d40f03b45087303ff5520894500c740fc03000000895008897004c70001000000eb0589c689d05689c18b45008d40e43b45087303ff5520894500c740fc060000008958145a8950108b54243089500c5a83c4288950085a83c4108950048908c21000900000000038060000|@14937,2097151,@3243|41,0,0 47,0,@13650 66,0,11 73,0,@5515 118,0,10 151,0,1 180,0,@5515 187,0,11 194,0,0 239,0,10 272,0,1 301,0,0 344,0,I48 388,0,@13699 394,1,@13701 485,0,I48 523,0,@13700 530,1,@14873 620,0,I48 662,1,@13753 711,0,@14909 716,0,0 726,1,@6418 792,0,0 798,1,@14913 810,0,I49 817,0,0 863,0,16777215 880,0,@7886 892,0,0 942,0,0 1003,0,0 1050,0,16777215 1067,0,@7886 1080,0,0 1130,0,0 1184,0,I49 1216,0,@14934 1242,0,8388607 1254,0,8388607 1286,0,0 1293,0,1 1336,0,@14936 1381,0,I49 1391,0,0 1517,0,0 13650:O1|@13651 13651:D3,1472|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b10833a01755df6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b356ce839b289d889f290ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700244b89b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b8d8327bb2c38b30833e03755cf6c301740583eb027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc02000000895f048b5e04891f8b0d64e039b289f889caff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700944b89b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7804f7c701000000740783ff037d0eeb06f647ff107406b8d8327bb2c38b088339057506b8084c89b2c3f7c701000000740783ff037d0eeb06f647ff107406b8d8327bb2c3f7c701000000740583ef027105ff5538ebf6f7c701000000740783ff017d0feb06f647ff107407bf80a27ab2eb7189faf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b510489138b356ce839b2ff71085789d889f2ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a0459890aeb05e9cc0000008b0d74e839b25052b8544f89b289ca9090ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a04f89b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d790cc747fc02000000894f04c707c44f89b28b45008d40a03b45087303ff5520894500c740fc02000000897804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c700e44f89b289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000bc050000|@13698,1048575,@2692|30,0,@6514 91,0,@4724 145,0,123 154,0,91 187,0,@5642 227,0,@5643 263,0,@5594 283,0,0 290,0,1 297,0,3 303,0,0 342,0,0 363,0,@5592 382,0,@13654 404,0,0 411,0,0 418,0,1 424,0,0 451,0,@6514 512,0,@4587 565,0,123 574,0,91 607,0,@5642 647,0,@5643 683,0,@5594 703,0,0 710,0,1 717,0,3 723,0,0 762,0,0 783,0,@5592 802,0,@13661 824,0,0 831,0,0 838,0,1 844,0,0 874,0,@6514 887,0,@13668 914,0,@6514 959,0,@5606 1016,0,@4724 1085,0,@4725 1092,0,@13684 1137,0,@5609 1158,0,@5592 1177,0,@13687 1196,0,@5592 1215,0,@5593 1264,0,@5592 1283,0,@13689 1316,0,@5621 1336,0,0 1343,0,0 1350,0,1 1356,0,0 1373,0,0 1394,0,@5592 1415,0,@13691 1437,0,0 1444,0,0 1451,0,1 1457,0,0 13652:O1|@13653 13653:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@2686|1,0,@5227 13654:O5|0,0,0,@13656,@13655 13655:O2|@13659,0 13656:O2|@13657,0 13657:O2|0,@13658 13658:O5|@13386,463,463,0,0 13659:O2|3,@13660 13660:S8|46726565536c6f74 13661:O5|0,0,0,@13663,@13662 13662:O2|@13666,0 13663:O2|@13664,0 13664:O2|0,@13665 13665:O5|@13386,461,461,0,0 13666:O2|3,@13667 13667:S10|53686172656457697468 13668:O5|0,0,0,@13670,@13669 13669:O2|@13673,0 13670:O2|@13671,0 13671:O2|0,@13672 13672:O5|@13386,464,464,0,0 13673:O2|3,@13674 13674:S5|556e736574 13675:O1|@13676 13676:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700c44c89b28948048060ffbfc3000000002c000000|@4958,3,@2690|28,0,@13677 13677:D3,148|3b650c7303ff55248b52048b4804f6c101740783f9017f0feb06f641ff107407ba6c4d89b2eb11ff72048b1889c8909090e87e00000089c289d0909090e8d60100008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701484f89b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c30000000090000000|@8568,1048575,@2689|33,0,@13678 50,1,@13679 62,1,@13681 95,0,@13683 115,0,0 122,0,0 129,0,1 135,0,0 13678:O2|@4918,0 13679:D3,304|3b650c7303ff5524f6c3017563837b0401756283f8017508b86c4d89b2c2040089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b1b89188b542404909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c20400e9a900000083f8017508b86c4d89b2c2040089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b13891051ff73048b54240c90ff128b4c2404f6c101740583e9027105ff5538ebf650ff7424108b5c240889c890e82effffff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c70100187ab28d410cc740fc02000000894804c70010187ab289c18d400cc740fc020000008948045983c4088908c20400b801000000c204009090000000002c010000|@13680,1048575,@2687|25,0,@13678 103,0,0 123,0,@13678 239,0,@4992 258,0,@4993 287,0,0 13680:S21|7072696e745f6c697374283329706c697374283229 13681:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b810097fb2c39090900000000044000000|@13682,3,@2688|56,0,@8563 13682:S6|402832292829 13683:O2|3,91 13684:O4|0,@13685,3,1 13685:O1|@13686 13686:D3,28|3b650c7303ff55248b0d3ce039b289caff2290900000000018000000|@5397,1048575,@2691|10,0,@4582 13687:O2|3,@13688 13688:S14|6465736372697074696f6e73203d 13689:O2|3,@13690 13690:S9|626f756e644964203d 13691:O5|0,0,0,@13693,@13692 13692:O2|@13696,0 13693:O2|@13694,0 13694:O2|0,@13695 13695:O5|@13386,462,462,0,0 13696:O2|3,@13697 13697:S12|5661726961626c65536c6f74 13698:S11|7072696e742d7661724964 13699:O2|@13701,@13700 13700:O2|@14873,@13699 13701:D3,1260|8dbc242cffffff3b7d0c7303ff5528535250ff7504b9465189b2518965048b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000089ceb917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c701845589b28d7908c747fc0400000089470c897708894f04c7070300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e8bae0f0ff89c3b8bc5589b2e81ebaf0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a01578d5c240489f8bac0e47ab29090e8f292f1ff8b45008d40e43b45087303ff5520894500c740fc06000000c700ec5589b28b4c240c8948048b54241c8950088b5c246c89580c8b74247c8970108b7c24688978148060ffbf8b55008d52e43b55087303ff5520895500c742fc06000000c702445b89b28b4c2410894a048b4c2424894a08895a0c897210897a148062ffbf8b4d008d49e43b4d087303ff5520894d00c741fc06000000c7011c5c89b28b5c242c8959048b5c24348959088b5c246c89590c8971108979148061ffbf8b5d008d5bc83b5d087303ff5520895d00c743fc0d0000008b7424348973308b74243089732c894b288b7424288973248b742424897320c7431cf85c89b28b74241c8973188b7424188973148b74241489731089530c894308c74304805d89b2c703085e89b28b7424388b7c247853515250f7c60100000075708b44244cff7604ffb42490000000ffb42484000000ffb42498000000ffb42488000000ff742430ff742444ff74246cff742454ff742468ff74244cff742454ff742468ff74243cff742478ffb424c0000000ffb424b4000000ffb424b4000000ffb424b4000000ffb424b4000000eb05e952000000ffb424b4000000ff742474ff742464ff74245cff74246450ffb424c8000000ffb424c8000000ffb424c8000000ff7004ffb424b400000089fb8b069090e8b20a000089c75e3b650c7303ff5524e931ffffff89f88b45008d40f43b45087303ff5520894500c740fc020000008b8c248c00000083c410894804c700010000008b54246850b8010000008b5a4089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b4424648b005051ff742468ff742464ff7424648b5c2478b8010000009090e8ea5d02008b4c2408833903756b8b51048b128b490c8b098b1983fb017507b968c05208eb5889ce89d989c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c789d9d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c1eb06e927000000508b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70001000000eb0589c289c8528b4c247c8901c7410448c05208c74108010000008b44240489410c5883c4048941105883c444894114b801000000c2380000000000e8040000|@14872,2097151,@3218|22,0,$13701+194 56,0,0 63,0,11 68,0,0 112,0,10 154,0,@13702 179,0,1 211,0,1 216,0,10 221,0,@5052 226,1,@5053 233,0,@13704 238,1,@4940 269,0,@13705 279,0,@5398 285,0,@4608 351,0,@6366 358,1,@6367 388,0,@13706 457,0,@13721 514,0,@13726 607,0,@13731 641,0,@13736 647,0,@13741 850,1,@13746 911,0,0 921,0,0 963,0,2 980,0,0 1027,0,0 1034,1,@14792 1065,0,I49 1078,0,0 1192,0,0 1212,0,I48 1219,0,0 1245,0,0 13702:O1|@13703 13703:D3,28|3b650c7303ff5524bb15000000e9f215f1ff90900000000018000000|@5217,2097151,@2693|9,0,10 14,1,@5214 13704:S16|486173685461626c652e686173683a20 13705:O5|@6394,88,0,88,0 13706:D3,68|3b650c7303ff5524ff720468445689b289e151ff720868cc5689b268dc5689b2ff720cff7210ff72148b58048b0889c890e81e01000083c408c390900000000040000000|@13720,1048575,@2699|12,0,@13707 23,0,@13709 28,0,@13710 50,1,@13713 13707:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@2694| 13708:S54|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e7465722836292d45 13709:S5|56616c7565 13710:O1|@13711 13711:D3,12|8b4010c30000000008000000|@13712,1,@2695| 13712:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529737472756374456e762d283129 13713:D3,328|3b650c7303ff552453508b5424209090ff1283f80175198b4424248b5c240489c18b042489ca83c4085983c41c51ff22ff742414689c5889b28b44240c8b542420909090ff1283f80175068b442418eb1b8b0883390175058b4104eb0f8b480489c83b650c7303ff5524ebda50bb787a7fb28b442428909090e8d6b3f0ff8b5c240c909090e8cab3f0ffbb105989b29090e8beb3f0ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138d44240450ff74240451bb030000008b44242490e8c600000083c414c21c000000000044010000|@13719,1048575,@2698|53,0,@13714 110,0,@8692 122,1,@4940 134,1,@4940 139,0,@13716 146,1,@4940 179,0,3 189,0,@6321 228,0,0 250,0,0 257,0,0 264,0,0 270,0,0 280,0,@6321 300,0,1 310,1,@13717 13714:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9294fffff90000000001c000000|@13715,2097151,@2696|14,0,@13416 19,1,@13418 13715:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629283129 13716:S39|2920697320616c72656164792070726573656e7420696e2074686973207369676e61747572652e 13717:D3,336|3b650c7303ff55248b4834f6c10175358b11813ad4e539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01756cb97c787cb2f6c10175358b11813ad4e539b2751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc6be0100000083fe01750d89c1b8287c7cb28b5d0490ff138b0e8139d4e539b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0e8139d4e539b2740d89c2b854eb7ab28b5d0490ff138b5108535089d08b542414ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241089500c8b5c240c8958088948048b4c240489088b342483f90174098b4e0cc701030000008b563083c4085983c40c51ff2290000000004c010000|@13718,1048575,@2697|20,0,@4671 70,0,0 80,0,@7313 93,0,@4671 143,0,0 155,0,@7368 169,0,@4671 178,0,@6377 206,0,@4671 215,0,@6377 310,0,1 13718:S28|5349474e41545552455328292e6572726f724d73674e656172283529 13719:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629 13720:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283129283129 13721:D3,68|3b650c7303ff5524ff7204689c5b89b289e151ff720868e45b89b268f05b89b2ff720cff7210ff72148b58048b0889c890e8c6fbffff83c408c390900000000040000000|@13720,1048575,@2702|12,0,@13722 23,0,@13723 28,0,@13724 50,1,@13713 13722:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@2700| 13723:S4|54797065 13724:O1|@13725 13725:D3,16|8b008b4004c39090000000000c000000|@8043,1,@2701| 13726:D3,68|3b650c7303ff5524ff720468745c89b289e151ff720868bc5c89b268d05c89b2ff720cff7210ff72148b58048b0889c890e8eefaffff83c408c390900000000040000000|@13720,1048575,@2705|12,0,@13727 23,0,@13728 28,0,@13729 50,1,@13713 13727:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@2703| 13728:S9|537472756374757265 13729:O1|@13730 13730:D3,12|8b400cc30000000008000000|@13712,1,@2704| 13731:O1|@13732 13732:D3,24|b82c5d89b28b5d04909090ff139090900000000014000000|@13712,1,@2706|1,0,@13733 13733:O4|@4608,@5398,@13735,@13734 13734:O5|@13386,991,0,991,0 13735:S29|456e746572696e672066756e63746f7220696e207369676e6174757265 13736:O1|@13737 13737:D3,24|b8b45d89b28b5d04909090ff139090900000000014000000|@13712,1,@2707|1,0,@13738 13738:O4|@4608,@5398,@13740,@13739 13739:O5|@13386,990,0,990,0 13740:S31|456e746572696e67207369676e617475726520696e207369676e6174757265 13741:O1|@13742 13742:D3,24|b83c5e89b28b5d04909090ff139090900000000014000000|@13712,1,@2708|1,0,@13743 13743:O4|@4608,@5398,@13745,@13744 13744:O5|@13386,989,0,989,0 13745:S28|456e746572696e672066697869747920696e207369676e6174757265 13746:D3,3432|8d7c24883b7d0c7303ff55288b08baa65e89b28d548afcffe290e9d0010000909090e904040000909090e970080000909090e91c090000909090e90b000000909090e9670900009090908b4c24608b54245c8b7424588b7c244cff70048b442424538b5c2424538b5c2460538b5c2460538b5c2478538b5c2460538b5c2460538b5c2460538b5c243c538b9c249c000000538b9c2498000000538b5c246c538b5c246c538b5c246c538b5c246c538b5c246c538b5c2458538b5c2458538b5c2458538b5c2458538b9c24cc000000538b9c24c8000000538b5c2460898c24d4000000899424d000000089b424cc00000089bc24c8000000898424c40000008b442450898424c00000008b44244c898424bc0000008b442448898424b80000008b442444898424b40000008b442440898424b00000008b44243c898424ac0000008b442438898424a80000008b442434898424a40000008b442430898424a00000008b44242c8984249c0000008b442428898424980000008b442424898424940000008b442420898424900000008b44241c8984248c0000008b442418898424880000008b442414898424840000008b442410898424800000008b44240c8944247c8b442408894424788b442404894424745883c4508944241c895c24188b5c24045883c4045983c40c51e98d0b00008b4d008d49d83b4d087303ff5520894d00c741fc0100004089198d5108c742fc07000000c702147d89b28b5c2468895a048b7424648972088b7c2474897a0c8b5c2470895a108b74246c897214894a188062ffbf6a016a016a0151ff7004528d5c240cb8010000009090e8168bfdff8b4424788b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701687e89b28b50208951048b5c24748959088b74241489710c8061ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706c87e89b28b7830897e048b5424708956088066ffbf8b5d008d5bc83b5d087303ff5520895d00c743fc0d0000008973308b74245c89732c8b4424608943288b7c2464897b24894b20c7431cf85c89b28b4c247c894b188b5424688953148b54246c8953108b54241089530c5a895308c74304805d89b2c703085e89b28b55008d52e43b55087303ff5520895500c742fc06000000c702107f89b28b4c2444894a048b7c244c897a088b44244889420c8b7424508972108b4c2454894a148062ffbf8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7075c8289b28b4424408947048b7424488977088b74244c89770c8067ffbf53ffb424840000005789d38b44240cba948689b2909090e8662400008b45008d40e03b45087303ff5520894500c740fc07000000c700849e8bb28b4c243c83c4048948048b54246c8950088b9c248400000089580c8bb424800000008970108b7c247c8978148b0c248948188060ffbf8b5424049090ff125883c40c8b00c278008b48088b55008d52ec3b55087303ff5520895500c742fc04000000c70278a08bb28942048b74246c8972088b7804897a0c8062ffbff6400c0175768b780c538b5d008d5be83b5d087303ff5520895d00c743fc05000000c703d0a18bb28b7424608973048b74245c89730889530c8b5424648953108063ffbf50ff31ff7004ff7104ffb424800000008b07ba40058ab29090e8fea100008b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e912000000c7410844808ab2894104c70105000000eb0e8b1153505257ff7104b944808ab28b45008d40f43b45087303ff5520894500c740fc020000005a895004c700010000008b54247c5150b8010000008b5a4089da90ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc02000000894104588901817c2408fc6f7ab2742ff644240801752c8b742408bffc6f7ab289c8b911000000d1e93bc9f3a68d7c3f018d7436018d4c0901745889c1eb0489c8eb55817c240848857ab2742ff644240801752c8b742408bf48857ab289c8b913000000d1e93bc9f3a68d7c3f018d7436018d4c0901745d89c1eb0489c8eb5a817c2408789a7ab2743bf6442408017538eb0ae912010000e90d0100008b742408bf789a7ab289c8b90f000000d1e93bc9f3a68d7c3f018d7436018d4c0901745d89c1eb0489c8eb5a817c2408f49a7ab2743beb0ae9d0000000e9cb000000f644240801752c8b742408bff49a7ab289c8b90d000000d1e93bc9f3a68d7c3f018d7436018d4c0901745d89c1eb0489c8eb5a817c2408f0a97ab2743beb0ae987000000e982000000f644240801752c8b742408bff0a97ab289c8b90f000000d1e93bc9f3a68d7c3f018d7436018d4c0901745389c1eb0489c8eb4b817c2408fc8b88b27443eb0ae93e000000e939000000f64424080175268b742408bffc8b88b289c8b90d000000d1e93bc9f3a68d7c3f018d7436018d4c09017563eb0489c8eb6289c1eb0289c189c8508b5c240cb820a38bb290e8daa5f0ffbb34a38bb29090e8cea5f0ffff742410684ca38bb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c1017418b8ecd57ab28b5d04eb0ae97c000000e9770000009090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff74241451bb030000008b842498000000e8c2f2ffffeb05506a016a018b45008d40d43b45087303ff5520894500c740fc020000008b4c241c83c408894804c700010000008d500cc742fc07000000c7421801000000c74214010000005b895a105b83c404895a0c894208c74204010000008b04248902ff7424746880a38bb289e353ff74247c68cc5689b268dc5689b2ffb42498000000ffb42498000000ffb4249800000089d390e82af0ffff83c41058a801740583c0027105ff5538ebf6c278008b4004a8017571ff7004ff742464ff742464ff742464ff742430ff742430ff74246cff74246cffb42484000000ff742470ff742470ff742470ff742448ffb424a8000000ffb424a4000000ff742478ff742478ff742478ff742478ff742478ff742464ff742464ff742464ffb4249c000000ff742468eb05e932000000ffb424d4000000ffb42490000000ff742470ffb424d80000008b009090e8fe3b020089c3583b650c7303ff5524e954ffffff89d8c278008b4d008d49f03b4d087303ff5520894d00c741fc030000008b500c8951088b70088971048b7804893953ff742478ff74247cff742478ff74244cff74244cff742448ff742448ff7424548b5c244889c89090e88a45020058c278008b48088139fc6f7ab27433f6010175278b31bffc6f7ab28b11ff7104b911000000d1e93bc9f3a68d7c3f018d7436018d4c09017458eb0eff71048b11eb07ff71048b11eb5d81fa48857ab2745af6c201752089d6bf48857ab2b913000000d1e93bc9f3a68d7c3f018d7436018d4c0901745d81fa789a7ab2745af6c201753389d6bf789a7ab2b90f000000eb05e992000000d1e93bc9f3a68d7c3f018d743601eb0ae97d000000e9780000008d4c0901745e81faf49a7ab2745bf6c201752c89d6bff49a7ab2b90d000000d1e9eb0ae950000000e94b0000003bc9f3a68d7c3f018d7436018d4c0901743981faf0a97ab27431f6c201756689d6bff0a97ab2b90f000000d1e93bc9f3a68d7c3f01eb0ae90f000000e90a0000008d7436018d4c09017574535052ff700cff700489d3b820a38bb2909090e81ea2f0ffbb34a38bb29090e812a2f0ffff74240c68f8d48bb28b4d008d49f43b4d08730aeb05e9a3000000ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b4508730aeb05e969000000ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740bb8ecd57ab28b5d0490ff1389e050ff74240c51bb030000008b842498000000e802efffffeb1389c1b801000000535152ff710c6a016a016a018b5d008d5be43b5d087303ff5520895d00c743fc06000000c7032cd58bb28b44247c83c40c8943048b4c246c894b088b54240889530c8b9424800000008953108b7424748973148063ffbf528b442404ba40058ab290e89e9a00008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241083c404895104c701010000008b54247c5051b8010000008b5a4089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc02000000894104588901516894d78bb2bbf8d78bb28b442408e8b69cf1ff8b4d008d49d43b4d087303ff5520894d00c741fc020000008b542410895104c701010000008d590cc743fc07000000c7431801000000c74314010000005e83c40489731089430c894b08c74304050000008b04248903ff7424786820d88bb289e151ffb4248000000068cc5689b268dc5689b2ffb4249c000000ffb4249c000000ffb4249c000000909090e86eebffff83c4105883c404a801740583c0027105ff5538ebf6c27800909000000000640d0000|@14871,2097151,@3217|15,0,$13746+26 491,1,@13747 533,0,@13776 595,0,0 602,1,@12896 636,0,@13779 690,0,@13780 765,0,@13731 804,0,@13736 810,0,@13741 840,0,@13781 909,0,@13785 954,0,@13806 962,1,@13808 992,0,@14751 1096,0,@14755 1156,0,@14759 1207,0,@13964 1214,1,@13965 1252,0,@14221 1261,0,2 1277,0,@14221 1311,0,0 1322,0,0 1363,0,2 1380,0,0 1406,0,@5266 1424,0,@5266 1431,0,8 1467,0,@5484 1485,0,@5484 1492,0,9 1528,0,@5589 1558,0,@5589 1565,0,7 1601,0,@5598 1631,0,@5598 1638,0,6 1674,0,@5716 1704,0,@5716 1711,0,7 1747,0,@13367 1777,0,@13367 1784,0,6 1828,0,@14762 1834,1,@4940 1839,0,@14763 1846,1,@4940 1855,0,@14764 1888,0,3 1898,0,@6321 1948,0,0 1970,0,0 1977,0,0 1984,0,0 1990,0,0 2000,0,@6321 2018,0,1 2030,1,@13717 2077,0,0 2094,0,0 2101,0,0 2122,0,0 2136,0,@14765 2148,0,@13709 2153,0,@13710 2182,1,@13713 2362,1,@14766 2470,1,@14783 2483,0,@5266 2497,0,@5266 2507,0,8 2549,0,@5484 2563,0,@5484 2568,0,9 2594,0,@5589 2608,0,@5589 2613,0,7 2658,0,@5598 2672,0,@5598 2677,0,6 2715,0,@5716 2729,0,@5716 2734,0,7 2782,0,@14762 2790,1,@4940 2795,0,@14763 2802,1,@4940 2811,0,@14859 2851,0,3 2861,0,@6321 2907,0,0 2929,0,0 2936,0,0 2943,0,0 2949,0,0 2959,0,@6321 2978,0,1 2990,1,@13717 2999,0,0 3041,0,@14860 3096,0,@13964 3102,1,@13965 3142,0,0 3153,0,0 3195,0,2 3212,0,0 3236,0,@14865 3241,0,@14868 3250,1,@6446 3287,0,0 3304,0,0 3311,0,0 3331,0,2 3345,0,@14870 3360,0,@13709 3365,0,@13710 3394,1,@13713 13747:D3,1128|8d7c24803b7d0c7303ff5528f6c30175718b0b8b510c8b74246c8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707847089b2ff71048b4e20894f048b4c246c894f088067ffbf8b7424708b4d008d49f03b4d087303ff5520894d00c741fc03000000c701cc7089b2508b46308941048b44246c8941088061ffbfeb05e9d50300008b75008d76f03b75087303ff5520897500c746fc03000000c706147189b28b4424748946048b4424688946088066ffbf8b45008d40c83b45087303ff5520894500c740fc0d0000008948308b4c244c89482c8b4c2450894828897024897820c7401cf85c89b28b7424548970188b7c24588978148b7c245c8978108b7c246089780c8b7c2464897808c74004805d89b29090c700085e89b2ff730450ff328b5c24108b442454e85a9ef0ffbb5d0000009090e84e9ef0ff8b0c2483390175716a016a016a016a016a016a01ff71086a01508d44240c50ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff7424748b5c24548b41048b9424a000000090ff128b45008d40e43b45087303ff5520894500c740fc060000008b4c2414894814eb05e9240000008b4c24108948108b4c240c89480c8b4c24088948088b4c24048948045983c4148908eb6b83390575478b5104ff7208ff7210ff32ff74241050ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff7424608b5a0c8b42048b54246090ff12eb706a016a016a016a016a016a01ff710cff742420508d44240c50ff742458eb05e976000000ff742478ff742478ff742460ff74247cff74247cff74247cff74247cff74247c8b59088b4104909090e88e0300008b45008d40e43b45087303ff5520894500c740fc060000008b4c2414eb05e9250000008948148b4c24108948108b4c240c89480c8b4c24088948088b4c24048948045983c41489088b4c240c83c408f6c101740583c1027105ff5538ebf650ff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247c8b5c247089c89090e8aafcffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241c895104c701010000008b5c24445051b8010000008b5340909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008b54240c895004c700010000008b55008d52ec3b55087303ff5520895500c742fc04000000894a0c8b4c2404894a088942048b4424108902ff74241868887c89b289e151ffb4248400000068bc5c89b268d05c89b2ff742464ff742438ff74246889d3e8e6e6ffff83c4085883c410c26c00c26c00900000000064040000|@13775,2097151,@2722|52,0,@13748 106,0,@13749 161,0,@13750 233,0,@13731 275,0,@13736 283,0,@13741 302,1,@4940 307,0,46 314,1,@4940 634,1,@13753 887,0,0 898,0,0 939,0,2 956,0,0 1011,0,0 1063,0,@13774 1078,0,@13728 1083,0,@13729 1102,1,@13713 13748:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2709| 13749:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2710| 13750:D3,68|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c248b490483c40450b8010000008b5124ff1283f801750258c389c358e91f0000009090900000000040000000|@13752,1048575,@2712|10,0,0 33,0,0 53,1,@13751 13751:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2711| 13752:S69|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329705374727563742832296e6577456e762d283129 13753:D3,988|3b650c7303ff55246a016a016a016a016a016a018b4c243c53508b5114909090ff1283f80175708b1c24b8047689b29090e84a99f0ffbb187689b29090e83e99f0ffff74244068387689b28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40dc3b45087303ff5520894500c740fc02000000eb05e9a0000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740bb8ecd57ab28b5d0490ff1389e050ff74241051bb030000008b442450909090e836e6ffff8d44241083c4088b4c243889088d442408c74004b0cf87b28d442408c74008010000008d442408c7400c010000008d442408c740105c9288b28d442408c7401401000000eb408b088d5424088b19891a8d5424088b71048972048d5424088b7908897a088d5424088b590c895a0c8b108d7424088b52108956108b008d5424088b40148942148b44245483c4088b4c240c89088b54242c8b1252ff742448ff742434ff742434ff742434ff742434bb947689b28b442420e83603000083f8017507b868c05208eb72b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb14f641ff10750e89c2b850337db28b5d049090ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93b000000c647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f88b4c2418f6c1017509f60424017503ff55383b0c247407f644240c0174068b442414eb5d8b55008d52ec3b55087303ff5520895500c742fc04000000c702587b89b28b5c2420895a04894208894a0c8062ffbf8b45008d40f03b45087303ff5520894500c740fc030000009090c7001c7c89b28b4c24148948048950088060ffbf8b4c243083c4048b098b1424833a03756e8b5a048b1b8b520c8b128b3283fe017507ba68c05208eb5b89cf89f150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f089d689f989cf89ca89c1d1e983c604f3a58d7c3f018d7436018d4c09018062ffbfeb07e92800000050518b45008d40f03b45087303ff5520894500c740fc03000000895008895804c70001000000eb0689c389d053518b4c244889018b44240c894104c74108010000008b44241489410c8b4424048941105883c41c894114b801000000c2340000000000d8030000|@13773,2097151,@2720|43,0,@13754 50,1,@4940 55,0,@13755 62,1,@4940 71,0,@13756 104,0,3 114,0,@6321 159,0,0 181,0,0 188,0,0 195,0,0 201,0,0 211,0,@6321 230,0,1 242,1,@13717 266,0,@13163 277,0,0 288,0,0 299,0,@13378 310,0,0 421,0,@13758 430,1,@13761 440,0,I49 447,0,0 493,0,16777215 510,0,@7886 524,0,0 574,0,0 686,0,@13770 735,0,@13772 788,0,I49 800,0,0 919,0,0 947,0,0 973,0,0 13754:S11|5369676e61747572652028 13755:S23|2920686173206e6f74206265656e206465636c61726564 13756:D3,32|3b650c7303ff552489c38b4204bac4a788b2e98d31ffff90000000001c000000|@13757,2097151,@2713|14,0,@13416 19,1,@13418 13757:S31|5349474e41545552455328292e676976654572726f72283329283129283129 13758:O1|@13759 13759:D3,16|b801000000c39090000000000c000000|@13760,1,@2714|1,0,0 13760:S49|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529762d283129 13761:D3,600|3b650c7303ff5524a80175748b088b5104833a01740f8b7004b8687989b28b5d049090ff13833a05750f8b7004b808377bb28b5d049090ff13833a0175148b7208833e0375078b7e048b3feb0c8b7e04eb078b72048b3689f78b7108ff7004ff720c53ff721057ff7608ff7604ff72048b1e8b442434909090e81a94f0ffeb05e9c30100008b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424088951088b54240489510489018b5424308b128b5c24308b1bf6c301740583c3027105ff5538ebf68b742430891e89c38b45008d40e43b45087303ff5520894500c740fc060000008948148b4c24108948108b4c240c89480c895008c74004d8707ab25983c410890852539090e8aa0100008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a89118b55008d52f03b55087303ff5520895500c742fc03000000894a08894204c702070000008b0c24f6c101740df644241c0174062b4c241c7105ff5538ebf583c101505289cb8b442420e80227f6ff8b442404a801740df64424200174062b4424207105ff5538ebf583c0018b4d008d49f83b4d087303ff5520894d00c741fc010000008b142489115189c38b44241c9090e8ba26f6ff8b45008d40ec3b45087303ff5520894500c740fc04000000c7005c7a89b28b0c248948048b5424088950088b54240c89500c8060ffbfff742428ff742428ff742428ff742428ff74242889c38b442424909090e8defdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c21400b801000000c214000000000054020000|@13769,2097151,@2717|26,0,@13762 46,0,@6539 122,1,@4940 255,0,@5279 270,1,@13765 301,0,0 340,0,3 382,1,@8774 454,1,@8774 484,0,@13767 585,0,0 13762:O4|@4608,@5398,@13764,@13763 13763:O5|@13386,778,0,778,0 13764:S28|4d617020646f6573206e6f742072657475726e20426f756e64204964 13765:D3,108|8b4d008d49cc3b4d087303ff5520894d00c741fc020000008b500c895104c701010000008d590cc743fc050000008b70108973108b7808897b0c894b088b08894b04c703010000008b48148b50048d4318c740fc030000008948088958048910c39090900000000068000000|@13766,63,@2715|32,0,0 68,0,0 13766:S28|5354525543545f56414c5328292e6d616b65426f756e644964283129 13767:D3,88|3b650c7303ff55248b480483390175398b590cf6c3017509f6420c017503ff55383b5a0c751e8b45008d40f83b45087303ff5520894500c740fc010000008b52048910c38b5208ff22b801000000c3900000000054000000|@13768,1048575,@2716|74,0,0 13768:S66|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e65774964732832296e65774d6170283129 13769:S57|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e6577496473283229 13770:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@13771,1048575,@2718|66,0,8388607 84,0,@5401 13771:S59|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d61704964732d6d61704964283129 13772:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e90885f1ff0000000020000000|@6481,2097151,@2719|24,1,@6426 13773:S44|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529 13774:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@2721| 13775:S59|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332970537472756374283229 13776:D3,180|3b650c7303ff55248b48048b5a188b1b8b72188b36f7c601000000740583c6027105ff5538ebf68b7a1889378b75008d76d43b75087303ff5520897500c746fc02000000895e04c706010000008d5e0cc743fc07000000c7431801000000c74314010000008b7910897b108b790c897b0c8973088b71048973048b318933ff720468dc7d89b289e656ff720868cc5689b268dc5689b2ff720cff7210ff72148b00e886d9ffff83c408c3909000000000b0000000|@13778,1048575,@2724|73,0,0 90,0,0 97,0,0 130,0,@13777 141,0,@13709 146,0,@13710 162,1,@13713 13777:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@2723| 13778:S60|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657256616c283129 13779:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@2725| 13780:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2726| 13781:D3,568|3b650c7303ff55248b4c24088b7104833e037572bf010000008b31f7c601000000751ff7c701000000740583c7027105ff5538ebf68b76043b650c7303ff5524ebd989f98b74240452535051ff7608ff76048b1e8b42149090e8268cf0ff8b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424048951085a83c404895104eb05e92a01000089018b54240c8b5a108b1b8b72108b36f7c601000000740583c6027105ff5538ebf68b7a10893789c68b45008d40e43b45087303ff5520894500c740fc060000008948148b4c24088948108b4c240489480c895808c74004d8707ab25983c408890853569090e8560100008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a89118b55008d52f03b55087303ff5520895500c742fc03000000894a08894204c702070000008b4c24048b1c24f6c301740bf641080174052b59087105ff5538ebf683c30150528b410c90e80a1ff6ff8b4424088b4c2404f6c101740bf640080174052b48087105ff5538ebf683c1018b55008d52f83b55087303ff5520895500c742fc010000008b1c24891a5289cb8b4004e8c21ef6ff5883c408c208008b44240456ff31ff7008ff70048b188b42149090e8b68af0ff8b4d008d49d03b4d087303ff5520894d00c741fc030000008b5424048951085a83c40489510489018d4110c740fc030000008b5424048950085a83c404895004c7000500000089c28d4010c740fc03000000894808895004c70070867ab2c20800900000000034020000|@13784,2097151,@2728|21,0,0 90,1,@4940 227,0,@5279 242,1,@13782 273,0,0 312,0,3 354,1,@8774 426,1,@8774 458,1,@4940 528,0,2 552,0,@5500 13782:D3,120|8b4d008d49c43b4d087303ff5520894d00c741fc010000408b500c89118d5908c743fc02000000894b04c703030000008d4b0cc741fc050000008b70108971108b780889790c8959088b18895904c701010000008b50148b58048d4118c740fc030000008950088948048918c39090900000000074000000|@13783,63,@2727|44,0,1 80,0,0 13783:S40|5354525543545f56414c5328292e6d616b65426f756e644964576974684571557064617465283129 13784:S58|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f636573735369672833296d616b654964283429 13785:D3,520|3b650c7303ff5524a801740df6420c0174073b420c7d68eb05ff5538ebf48b5204909090ff128b4804833905752d68788489b2bbd48489b28b4108ba88787bb290e8a64af2ff83f8037407b801000000eb05b80300000083f002c3833905750db808377bb28b5d04909090ff13833901751b8b5108833a03750f8b5a04eb05e9110000008b1b89d8c38b4204c38b51048b1289d0c3a801740bf6420c0174052b420c7105ff5538ebf683c001528b0c2489c789fb8b41089090e88a57f6ff8338037537f7c701000000740df640040174073b78047e07eb15ff5538ebf48b4804b8008589b28b5d04909090ff138b40043b650c7303ff5524ebb383380775628b48048b5104833a05753068488589b2bb748589b28b4208ba88787bb290e8ca49f2ff83f8037407b801000000eb05b80300000083f00283c404c3833a05750ab808377bb28b5d04ff13833a01751f8b5a08833b0375108b73048b3689f083c404c3e9120000008b430483c404c38b5a048b1b89d883c404c3833801740c89c1b8a08589b28b5d04ff138b48048b5104833a05753268f48589b2bb208689b28b4208ba88787bb2909090e83e49f2ff83f8037407b801000000eb05b80300000083f00283c404c3833a05750ab808377bb28b5d04ff13833a01751a8b5a08833b03750b8b73048b3689f083c404c38b430483c404c38b5a048b1b89d883c404c3900000000004020000|@13805,2097151,@2735|47,0,@13786 52,0,@13789 60,0,@6713 66,1,@6798 76,0,0 83,0,1 97,0,@6539 186,1,@8978 225,0,@13791 267,0,@13794 272,0,@13796 280,0,@6713 286,1,@6798 296,0,0 303,0,1 320,0,@6539 384,0,@13798 405,0,@13801 410,0,@13803 418,0,@6713 426,1,@6798 436,0,0 443,0,1 460,0,@6539 13786:O1|@13787 13787:D3,16|b805000000c39090000000000c000000|@13788,1,@2729|1,0,2 13788:S37|545950455f5452454528292e747970655065726d697473457175616c697479283129283129 13789:O1|@13790 13790:D3,16|b803000000c39090000000000c000000|@13788,1,@2730|1,0,1 13791:O4|@4608,@5398,@13793,@13792 13792:O5|@13386,493,0,493,0 13793:S20|7265616c49643a2053686172696e67206c6f6f70 13794:O1|@13795 13795:D3,16|b805000000c39090000000000c000000|@13788,1,@2731|1,0,2 13796:O1|@13797 13797:D3,16|b803000000c39090000000000c000000|@13788,1,@2732|1,0,1 13798:O4|@4608,@5398,@13800,@13799 13799:O5|@13386,1261,0,1261,0 13800:S30|696e7465726e616c4d61703a204e6f7420626f756e64206f722046726565 13801:O1|@13802 13802:D3,16|b805000000c39090000000000c000000|@13788,1,@2733|1,0,2 13803:O1|@13804 13804:D3,16|b803000000c39090000000000c000000|@13788,1,@2734|1,0,1 13805:S64|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332966696e64457175616c697479283129 13806:O2|@13808,@13807 13807:O5|@14408,@14742,@4735,@4736,@4729 13808:D3,176|3b650c7303ff55248b4c240c8b75008d76c43b75087303ff5520897500c746fc0e0000008b7930897e34c746307c8789b28b792c897e2c8b7928897e288b7924897e248b7920897e208b791c897e1c8b7918897e188b7914897e148b7910897e108b790c897e0c8b7908897e088b7904897e048b39893e8b4c24088b7c24048974240c89442408894424048b0424890c245357ff7204bb0100000089c2b80300000052e97800000000000000ac000000|@14407,2097151,@2990|45,0,@13809 151,0,0 158,0,1 164,1,@13812 13809:O1|@13810 13810:D3,16|b801000000c39090000000000c000000|@13811,1,@2736|1,0,0 13811:S37|54595045434845434b5f50415253455452454528292e7061737332283529656e762d283129 13812:D3,232|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d48889b28b54241c8951048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c7068c8989b28956048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704890f8b4c24148b742418538b5c2414508b44241c578b7c2418578b7c2418578b7c241889542430895c242c8b54240889542428894424248b44240c89442420b8048a89b28944241c8b442404894424185883c40c8b542404894424048b0424893c245089f389c852e956010000909000000000e4000000|@14406,2097151,@2989|34,0,@13813 75,0,@13815 177,0,@13816 218,1,@13817 13813:D3,100|3b650c7303ff55248b52048b52209090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@13814,1048575,@2737|49,0,0 85,0,0 13814:S56|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352974797065456e762d283129 13815:D3,100|3b650c7303ff55248b52048b52349090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@13814,1048575,@2738|49,0,0 85,0,0 13816:O1|@13812 13817:D3,14316|8d7c24843b7d0c7303ff552883382d75728b4c24288b5424248b7424208b7c241c538b5c241cff70048b44241c508b44241c508b44241c508b44241c508b44241c894c24408954243c89742438897c2434895c24308b4c240c894c242c8b4c2408894c24288b4c2404894c24245983c40c894c24108944240c8b5c24045883c404eb05e905000000e973ffffff833811750f89c1b80cc289b28b5d04909090ff13833821750f89c1b89cc289b28b5d04909090ff1383383d750f89c1b8f4c289b28b5d04909090ff138b08bae28a89b28d548afcffe2e917020000909090e99d020000909090e9d5050000909090e93b0c0000909090e98f0f0000909090e91c150000909090e9b2180000909090e9bf1a0000909090e9b3000000909090e9111b0000909090e98a1b0000909090e94e1c0000909090e9211d0000909090e95f1d0000909090e983000000909090e9791f0000909090e973000000909090e982200000909090e9aa210000909090e9ff230000909090e9e9270000909090e91c2c0000909090e943000000909090e94d2f0000909090e9fb310000909090e9f9310000909090e987320000909090e925330000909090e925330000909090e95f330000909090e9030000009090908b48048b5424288b75008d76f43b75087303ff5520897500c746fc020000008b7a34897e048b42188906ff710c53ff74242c6844c389b2ff7110ff7104ff7108ff710cff318d4424145089f3b868c689b29090e8523a00008b4808833907751683790411751050bb01000000909090e812470000eb2a506a016a0189e252bb08d989b28b480c89c8909090e832b3f1ff8b442404909090e8924b00005883c4048b0c24f6411401752e8b51148b1a8b338b368b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b74240489378b33893ef641180175288b51188b1a8b1b8b75008d76f43b75087303ff5520897500c746fc02000000895e0489068b1a89338b54240889028b54240c890a8b4c244c83c4105a83c4108b5924891ac228008b48048b5424248b5c241c8b7424048b7c24108b442428508b442410508b44241c508b442414508b442428508b41088944243c8b410c894424388b4110894424348b4114894424308954242c895c242889742424897c24208b5424108954241c8b54240c895424188b5424088b5c2414895424148b542404895424105a83c40c5289da8b59048b0152e9a84b00008b4d008d49cc3b4d087303ff5520894d00c741fc02000000c74104010000008b500889118d590cc743fc02000000894b048b4804890b8d730cc746fc01000040c706ec7d7ab28d7e08c747fc040000008b480c894f0c897708895f04c70733000000505157ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489c389f8e8eafbffff50bb03000000b814328ab2e89a24ffff89c389d8909090e8e2a300008b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c7000700000089c38b0424ba84287bb2909090e816eaf1ffa8017575ff30ff742404ff74243cff74243c8b5c2414b880328ab2e8e6a3000089c6ff7424346884348ab28b5c243c8b442440ba94348ab2909090e8d2a500005689c18b44240489ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9b00100008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701883f8ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e88e3400005689c38b442410ba68bf88b2909090e8162fffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff12eb05b801000000b8bc6d7ab283c410c228008b48045350ff7108ff7110ff7104ff31ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff7424408b44242890e8fef8ffff50ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff7424448b5c24408b4424309090e8c6f8ffff508b4424189090e87aae000083f8017407b801000000eb708b45008d40f83b45087303ff5520894500c740fc01000040c700ec7d7ab2f64424380175148b5424388b0af642ff107402f7d98d4c0901eb048b4c24388d0ccdf9ffffff8b55008d52f03b55087303ff5520895500c742fc03000000894a08894204c7020d00000089d38b442404eb05e910000000ba84287bb290e8c6e6f1ffb8010000008b4424049090e8fe77f1ff83380575318b4d008d49ec3b4d087303ff5520894d00c741fc020000008b50088951048b580489198d710cc746fc01000000890eeb718b45008d40c03b45087303ff5520894500c740fc01000040c700ec7d7ab28d4808c741fc03000000c74108f1700200894104c7010d0000008d4110c740fc01000040c700ec7d7ab28d5008c742fc03000000c74208f1700200894204c7020d0000008d4210c740fc03000000894808eb05e9e6010000895004c7000500000051528b5c240cba84287bb2909090e8eee5f1ffa8017571ff74240cff742450ff7424508b5c241cb864438ab29090e8be9f000050ff74240cff742454ff7424548b5c2424b878438ab290e8a29f00008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741048c438ab289018d410cc740fc02000000894804c7009c9a7ab28d480ceb05e91d010000c741fc020000008941045889018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70128448ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4c244c89c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8023100005689c38b442428ba68bf88b2909090e88a2bffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241c89500c5b895808894804c700030000008b4c244c8b590cc703030000008b51309090ff12be01000000eb308b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b0c2489088d700cc746fc01000000890683c408f7c601000000756b8b06ff70048b5c24048b0889c8ba84287bb2909090e802e4f1ffa8017570ff30ff74240cff742450ff7424508b5c241cb864438ab2e8d29d000050ff74240cff742454ff7424548b5c2424b878438ab290e8b69d000089c6ff74244c6884348ab28b5c24548b442458eb05e937020000ba94348ab2e89e9f00005689c18b44240889ca90ff128b4d008d49c4eb05e9030200003b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70128448ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c244889c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e82a2e00005689c38b442424ba68bf88b2909090e8b228ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241889500c5a895008894804c700030000008b4c24488b510cc702030000008b51309090ff128b4424188b0c24890889c883c424c22800b8e4107bb283c420c228008b48048b55008d52cc3b55087303ff5520895500c742fc0c000000c70260448ab28942048b5c2424895a088b74241c89720c8b7c2418897a108b5c2420895a148b7424288972188b7c2414897a1c8b5c2410895a208b74240c8972248b7c2408897a288b5c2404895a2c8062ffbf8b75008d76d83b75087303ff5520897500c746fc03000000c74608fc718ab2c74604d00489b289168d5610c742fc050000008942108b790c897a0cc74208f9000000c74204e4758ab2c702f4758ab250ff710857ff3156ff742438ff74243889d38b410490e8c2ca000050ff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243c8b5c24388b44242c9090e8c2f1ffff508b4424049090e89671f1ff833805756cff70088b5c24048b4004ba84287bb2909090e832e0f1ffa80175718b30ff74243c6884348ab28b5c24448b442448ba94348ab2909090e80a9c000089c189f089caff128b4c244089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130eb05e97d000000ff7134ff7138ff713cff71408b59048b01e8062c00005689c3eb05e95a0000008b44241cba68bf88b2e88a26ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5a895008894804c700030000008b4c24408b510cc702030000008b51309090ff1258eb6b8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d0000008d4810c741fc030000008941088b1c24895904c701050000005089cb89d0ba84287bb2909090e8f6def1ffa8017571eb05e9d10000008b30ff74243c6884348ab28b5c24448b442448ba94348ab2e8ca9a000089c189f089caff128b4c244089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e8ca2a00005689c3eb05e95c0000008b44241cba68bf88b2e84e25ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5a895008894804c700030000008b4c24408b510cc702030000008b51309090ff12eb05b8010000005883c4105983c4048901c228008b480450ff710cff7104ff7108ff31ff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243c89c38b4424289090e832efffff50ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff742440ff7424408b5c243c8b4424309090e8faeeffff50ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff7424448b5c24408b4424389090e8c2eeffff50bbbc6d7ab28b442408ba84287bb2e846ddf1ffa8017575ff30ff74240cff74244cff74244c8b5c241cb824768ab2e81697000089c6ff7424446884348ab28b5c244c8b442450ba94348ab2909090e8029900005689c18b44240489ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9ae0100008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70130768ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c244489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8be2700005689c38b442420ba68bf88b2909090e84622ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241c89500c5b895808894804c700030000008b4c24448b590cc703030000008b51309090ff128b1c248b442404ba84287bb2909090e806dbf1ffa8017571ff30ff742408ff74244cff74244c8b5c2420b874768ab2e8d694000050ff742408ff742450ff7424508b5c2428b884768ab290e8ba94000089c6ff7424486884348ab28b5c24508b442454ba94348ab2909090e8a69600005689c18b44240889ca90ff128b4d008d49c43b4d08730aeb05e909020000ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70194768ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c244489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8322500005689c38b442420ba68bf88b2909090e8ba1fffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241c89500c5a895008894804c700030000008b4c24448b510cc702030000008b51309090ff12b8e4107bb283c420c2280083c4045883c418c2280050ff700cff7008ff7004ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b44242ce8a6e9ffff8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703d8768ab28b4c2434894b048b54240c8953088b74243889730c8063ffbf50518b442408ba40058ab290e89e6400005089c38b442404ba84287bb2909090e8e2d7f1ffa8017571ff30ff742408ff742444ff7424448b5c241cb8a05d8ab2e8b291000089c3b801000000e8168ff1ff5350ff7424446a01bb214e00008b442414ba94477bb290e8bea6f1ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9860200008948049090c7009c9a7ab28d480cc741fc02000000894104c701b05d8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c6ff7424406884348ab28b5c24488b44244cba94348ab2e8ee9200005689c18b44240889ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701d05d8ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c243c89c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8862100005689c38b442418ba68bf88b2909090e80e1cffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5a895008894804c700030000008b4c243c8b510cc702030000008b51309090ff125883c414c228008b48048b5424288b75008d76f43b75087303ff5520897500c746fc020000008b7a34897e048b7a20893eff710453ff74242c6894778ab250ff7108ff31ff7104ff710c8d4c2414518b5c240489f09090e8d64000006a016a01508d5c24048b44240c9090e89a6ef1ff817c240448c052087429f64424040175298b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b801000000eb318b442458ff742410ff742420ff74245c68d8778ab2ff7424148d4c2404518b5834b8bc5c89b2909090e82e25000083c4108b0c248b55008d52f43b55087303ff5520895500c742fc0200000083c4145b895a04c702010000008b5c243c50ff7104ff3152b8010000008b5340ff128b4d008d49cc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc02000000894104588901588d510cc742fc030000008b5808895a08894a048b74240889325252ff74240c518b4424109090e8d2d200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045a83c408891151a80175398b4c24448b108b58048b45008d40f43b45087303ff5520894500c740fc020000008950048b128910538b5108ff12583b650c7303ff5524ebc38b4424448b480c8b45008d40f43b45087303ff5520894500c740fc020000005a8950045a83c414891089caff12b8e4107bb2c228008b4808ff7004f6c101754c8b44242c8b55008d52e83b55087303ff5520895500c742fc020000008b1c24895a048b3189328b388d420cc740fc020000008950048930ff710489fa909090ff12593b650c7303ff5524ebafb8e4107bb283c404c228008b4d008d49f03b4d087303ff5520894d00c741fc03000000c701407b8ab28b5424248951048941088061ffbf6a016a016a0189c789e389c890e87e95fdff8b470483c40457a8017528ff7004ff742434ff742408ff7424108b5c24448b00909090e83ed50000583b650c7303ff5524ebd4b801000000b8e4107bb283c40cc228008b4004b9e4107bb2a80175638b08ff7004ff31ff742430ff742428ff742408ff742438ff742428ff742428ff7424288b5c24288b44243c8b542438ff12f6442404017560508b5c2430909090e876da0000a80175426a016a01ff308d442404508b5c2414b8107a7db28b542424eb05e953000000909090ff12ff742410ff742408ff742408bb010000008b4424489090e8321c0000eb1bb8010000006a016a016a01eb0e89c1b801000000516a016a016a0183c40c5983c404583b650c7303ff5524e941ffffff89c8c228008b4d008d49cc3b4d087303ff5520894d00c741fc0c000000c701e4858ab28941048b5424248951088b5c241c89590c8b7424188971108b7c24208979148b5424288951188b5c241489591c8b7424108971208b7c240c8979248b5424088951288b5c240489592c8061ffbf8b75008d76d83b75087303ff5520897500c746fc03000000c74608fc718ab2c74604d00489b2890e8d4e10c741fc050000008941108b780c89790cc74108f9000000c74104e4758ab2c70138868ab2ff700456ff74242cff74242c89cb8b480889c8909090e872ba0000598901c22800ff700cff7010ff742420ff742434ff742434ff742430ff742438ff742430ff742430ff742430ff742430ff7424308b58088b480489c8909090e8cadd0000b8e4107bb2c2280050ff700cff7008ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489c38b480489c890e822e1ffff8b4d008d49cc3b4d087303ff5520894d00c741fc0c000000c70150c18ab28b5424088951048b5c24308959088b74242889710c8b7c24248979108b54242c8951148b5c24348959188b74242089711c8b7c241c8979208b5424188951248b5c24148959288b74241089712c8061ffbf8b7d008d7fd83b7d087303ff5520897d00c747fc03000000c74708fc718ab2c74704d00489b2890f8d4f10c741fc050000008b5424088951108b54240489510cc74108f9000000c74104e4758ab2c701a4c18ab25057ff742438ff74243889cb8b442410e812b900008b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108c7410444808ab2c7010500000089cbba84287bb290e8aacef1ffa80175718b30ff7424306884348ab28b5c24388b44243cba94348ab2909090e8828a000089c189f089caff128b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e8821a00005689c38b442410eb05e958000000ba68bf88b2e80615ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff12eb05b8010000005883c40cc22800ff7008ff7004ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff74243050bbd4c18ab28b400c9090e8c6160100909090e84604ffff89c389d8909090e86eb2feff8b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108894104c7010100000083fa01752d8b45008d40ec3b45087303ff5520894500c740fc0100004089088d4808c741fc02000000894104c701030000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000700000083fa01753c8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d000000891183c404598901c228008b4d008d49cc3b4d087303ff5520894d00c741fc0c000000c701d8c28ab28941048b5424288951088b5c242489590c8b7424208971108b7c241c8979148b5424188951188b5c241489591c8b7424108971208b7c240c8979248b5424088951288b5c240489592c8061ffbf8b75008d76d83b75087303ff5520897500c746fc03000000c7460894618ab2c7460478bf88b2890e8d4e10c741fc050000008941108b780c89790cc7410859000000c7410498628ab2c701a4628ab2ff700456ff74242cff74242c89cb8b480889c8909090e80eb600008338017507b8e4107bb2eb498b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000c74010946d7ab2c7400c28af7ab2c7400844af7ab2894804c7000b000000598901c2280053ff7004ff700cbb030000008b401090e82a260000909090e8ae5cf1ff833805756cff7008bbb8727ab28b4004ba84287bb29090e84acbf1ffa80175718b30ff7424306884348ab28b5c24388b44243cba94348ab2909090e82287000089c189f089caff128b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130eb05e97d000000ff7134ff7138ff713cff71408b59048b01e81e1700005689c3eb05e95a0000008b442410ba68bf88b2e8a211ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240889500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff1258eb6b8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d0000008d4810c741fc03000000894108c74104b8727ab2c701050000005089cb89d0ba84287bb29090e80ecaf1ffa8017571eb05e9d10000008b30ff7424306884348ab28b5c24388b44243cba94348ab2e8e285000089c189f089caff128b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e8e21500005689c3eb05e95c0000008b442410ba68bf88b2e86610ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240889500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff12eb05b8010000005883c4045983c4048901c228008b48046a016a016a018b39ff7108ff7110ff71048d5c240cb8010000009090e85e3cfdff6a016a016a0189e3b8010000009090e84a3cfdff6a016a016a0189e3b8010000009090e8363cfdff837c24200175128b442434a801740583c0027109ff5538ebf68b4424348b4c245883c4048b55008d52f03b55087303ff5520895500c742fc03000000c70274c38ab28b5918895a048b7424288972088062ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706bcc38ab28b5920895e048b4c2410894e088066ffbf8b4c24548b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70304c48ab2508b41348943048b4424088943088063ffbf8b442458578b7d008d7ff03b7d087303ff5520897d00c747fc03000000c7074cc48ab2538b5c2460895f048b5c242c895f088067ffbf8b5d008d5bc43b5d087303ff5520895d00c743fc0e000000ff7030ff702c578b7c240c897b348b7c2408897b308b7c2404897b2c8b7c2418897b288b3c24897b248973208b781c897b1c8953188b7814897b148b7910897b108b7c2424897b0c8b7c243c897b088b7804897b04c703d0c58ab28b7c242c56bee4107bb252ff7014ff711053f7c70100000075448b07ff7704ff742404ff74247cff30ffb4248c000000ff74247cff74247cff74247c8b5c24488b8424900000008b94248c00000090ff1289c65f3b650c7303ff5524ebb489f08b45008d40ec3b45087303ff5520894500c740fc04000000c700fcc58ab28b8c248000000083c4048948048b54244c8950088b54244089500c8060ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c702b4c68ab2894a048b5c2434895a088062ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703f4c68ab2894b048b7424288973088063ffbf8b75008d76c43b75087303ff5520897500c746fc0e0000008b7c241c897e348b7c2418897e308b7c2414897e2c895e288b5c2410895e248b5c240c895e208b591c895e1c8b7c2408897e188b7c2404897e145f83c41c897e1089560c8946088b41048946048b1189168b7c242483f7025ab8e4107bb25756f6c20175658b02ff7204ff30ff742408ff742460ff742408ff742470ff742460ff742460ff7424608b5c242c8b4424748b5424709090ff12837c240c01745bf6442404017559508b5c2468e8a2ce0000a80175506a016a01ff308d442404508b5c2414b8107a7db2eb05e9650000008b54245c909090ff12ff742410ff742408ff742408bb010000008b842480000000909090e85a100000eb25e912000000e90d000000b8010000006a016a016a01eb0e89c1b801000000516a016a016a0183c40c5883c4045a3b650c7303ff5524e92cffffff83c438c228008b480450ff7110ff710cff7108ff31ff7504ba2eb489b2528965048b55008d52f83b55087303ff5520895500c742fc01000040c70201000000b917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c70134c78ab28d5908c743fc0400000089430c895308894b04c7030300000083c40458894504eb699090908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e8d27df0ff89c3b8bc5589b2e83657f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff1353ff7504b85ab589b2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c7016cc78ab28d7108c746fc0400000089460c895608894e04c7060300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e8a67cf0ff89c3b8bc5589b2e80a56f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff1356ff7504b886b689b2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c701a4c78ab28d7908c747fc0400000089470c895708894f04c7070300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e87a7bf0ff89c3b8bc5589b2e8de54f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff1357ff742444ff7424208b5c24508b442414909090e8c2100100a801752b8b08ff7004ff742408ff742450ff74240cff7424188b59048b0190e8f6110100583b650c7303ff5524ebd1b8010000006800d08ab2bb010000008b44240c90e84e47f1ff8b4c24108901688cd08ab2bb010000008b442404909090e83247f1ff8b4c241483c404890168d4d08ab2bb010000008b442404e81647f1ff83c4145983c4048901b8e4107bb2c228008b4d008d49cc3b4d087303ff5520894d00c741fc02000000c74104010000008b500889118d590cc743fc02000000894b048b4804890b8d730cc746fc01000040c706ec7d7ab28d7e08c747fc040000008b480c894f0c897708895f04c70733000000505157ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489c389f890e8cad1ffff50bb03000000b81cd18ab2e87afafeff89c389d8909090e8c27900008b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c7000700000089c38b0424ba84287bb2909090e8f6bff1ffa8017575ff30ff742404ff74243cff74243c8b5c2414b880328ab2e8c679000089c6ff7424346884348ab28b5c243c8b442440ba94348ab2909090e8b27b00005689c18b44240489ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9b00100008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70134d18ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e86e0a00005689c38b442410ba68bf88b2909090e8f604ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff12eb05b801000000b8bc6d7ab283c410c2280050ff7008ff7004ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489c38b442428e8e6ceffff50bb44808ab2ba84287bb2e86ebdf1ffa8017575ff30ff742404ff74243cff74243c8b5c2414b878d18ab2e83e77000089c6ff7424346884348ab28b5c243c8b442440ba94348ab2909090e82a7900005689c18b44240489ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9ae0100008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70188d18ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c243489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8e60700005689c38b442410ba68bf88b2909090e86e02ffff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24348b510cc702030000008b51309090ff128b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c410c228008b4008c22800ff7008ff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242cff74242c53bbd4c18ab28b400490e8e6130100bb030000009090e8def4feff89c389d8909090e8267400008b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c70007000000598901c228008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7019cd28ab28b5424248951048941088061ffbf6a016a016a0189c789e389c8909090e87e7dfdffff7704ff742434578b5c24408b442408909090e88a1401005983c404f6c1017535a8017531ff7004ff7104ff742434ff742424ff742410ff7424448b188b01e8ee1501008b4424045983c4043b650c7303ff5524ebc6b801000000b8e4107bb283c408c22800b83cbe7ab2c22800ff700cff74241cff742430ff742430ff74242cff742434ff74242cff74242cff74242cff74242cff74242c8b58088b480489c89090e81e190100b8e4107bb2c2280050ff7004ff700cff7008ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff74243889c38b442428909090e89ecaffff50bbbc6d7ab2ba84287bb2e826b9f1ffa8017575ff30ff742404ff742440ff7424408b5c2414b840eb8ab2e8f672000089c6ff7424386884348ab28b5c24408b442444ba94348ab2909090e8e27400005689c18b44240489ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9ae0100008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70150eb8ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4c243889c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e89e0300005689c38b442414ba68bf88b2909090e826fefeff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24388b510cc702030000008b51309090ff12ff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243c8b5c24388b442434909090e82ac8ffffb83cbe7ab283c414c2280090909000000000e8370000|@14405,2097151,@2988|149,0,@13818 169,0,@13822 189,0,@13825 204,0,$13817+214 513,0,@13828 539,0,@13834 546,1,@13835 566,0,0 574,1,@13857 589,0,@13873 602,1,@6564 614,1,@13871 892,1,@13875 923,0,0 962,0,@5413 990,0,25 1048,0,1 1053,0,@14088 1058,1,@13429 1070,1,@14089 1101,0,1 1110,0,0 1132,0,3 1142,0,@6509 1150,1,@6714 1177,0,@14090 1182,1,@14091 1193,0,@14093 1206,0,@14094 1214,1,@14095 1257,0,0 1287,0,@6812 1306,0,@14111 1326,0,0 1333,0,0 1340,0,0 1346,0,0 1357,0,@6321 1396,0,0 1419,0,@5592 1471,0,@5592 1490,0,@14113 1510,0,0 1517,0,1 1524,0,3 1530,0,0 1541,0,@6321 1610,1,@13830 1622,0,@13447 1630,1,@13449 1686,0,1 1699,0,1 1713,0,0 1718,0,@5232 1858,1,@14115 1868,0,0 1900,0,@5413 1974,0,6 1992,0,@6509 1998,1,@6714 2003,0,0 2014,1,@6447 2098,0,@5413 2115,0,79992 2124,0,6 2140,0,@5413 2157,0,79992 2166,0,6 2195,0,2 2206,0,@6509 2214,1,@6714 2239,0,@14119 2246,1,@14091 2268,0,@14120 2274,1,@14091 2305,0,@14121 2326,0,@5592 2382,0,@5592 2401,0,@14129 2421,0,0 2428,0,1 2435,0,3 2441,0,0 2452,0,@6321 2518,1,@13830 2530,0,@13447 2538,1,@13449 2594,0,1 2607,0,1 2619,0,0 2698,0,@6509 2706,1,@6714 2733,0,@14119 2738,1,@14091 2760,0,@14120 2766,1,@14091 2777,0,@14093 2797,0,@14094 2802,1,@14095 2852,0,0 2875,0,@6812 2894,0,@14111 2914,0,0 2921,0,0 2928,0,0 2934,0,0 2945,0,@6321 2984,0,0 3007,0,@5592 3056,0,@5592 3108,0,@5592 3127,0,@14129 3147,0,0 3154,0,1 3161,0,3 3167,0,0 3178,0,@6321 3246,1,@13830 3258,0,@13447 3266,1,@13449 3322,0,1 3335,0,1 3364,0,@6455 3403,0,@14131 3511,0,@14188 3518,0,@13537 3546,0,124 3553,0,@14195 3559,0,@14196 3586,1,@14170 3654,1,@6447 3674,0,@6509 3682,1,@6714 3697,0,@14093 3710,0,@14094 3718,1,@14095 3794,1,@13830 3813,0,@13447 3818,1,@13449 3874,0,1 3887,0,1 3927,0,@5413 3946,0,79992 3955,0,6 3980,0,2 3990,0,@6509 3998,1,@6714 4020,0,@14093 4033,0,@14094 4038,1,@14095 4110,1,@13830 4129,0,@13447 4134,1,@13449 4190,0,1 4203,0,1 4217,0,0 4416,0,@5232 4425,0,@6509 4430,1,@6714 4457,0,@14197 4462,1,@14091 4473,0,@14093 4486,0,@14094 4494,1,@14095 4537,0,0 4567,0,@6812 4586,0,@14111 4606,0,0 4613,0,0 4620,0,0 4626,0,0 4637,0,@6321 4676,0,0 4699,0,@5592 4751,0,@5592 4770,0,@14198 4790,0,0 4797,0,1 4804,0,3 4810,0,0 4821,0,@6321 4890,1,@13830 4902,0,@13447 4910,1,@13449 4966,0,1 4979,0,1 4998,0,@6509 5006,1,@6714 5033,0,@14200 5038,1,@14091 5060,0,@14201 5066,1,@14091 5077,0,@14093 5090,0,@14094 5098,1,@14095 5148,0,0 5171,0,@6812 5190,0,@14111 5210,0,0 5217,0,0 5224,0,0 5230,0,0 5241,0,@6321 5280,0,0 5303,0,@5592 5352,0,@5592 5404,0,@5592 5423,0,@14202 5443,0,0 5450,0,1 5457,0,3 5463,0,0 5474,0,@6321 5542,1,@13830 5554,0,@13447 5562,1,@13449 5618,0,1 5631,0,1 5643,0,@6455 5748,0,@14204 5784,0,@13964 5790,1,@13965 5802,0,@6509 5810,1,@6714 5837,0,@14148 5842,1,@14091 5849,0,0 5854,1,@6511 5867,0,10000 5876,0,@6596 5882,1,@6597 5913,0,0 5943,0,@5592 5962,0,@14149 5982,0,0 5989,0,0 5996,0,0 6002,0,0 6013,0,@6321 6032,0,@14093 6045,0,@14094 6050,1,@14095 6093,0,0 6114,0,@6812 6133,0,@14111 6153,0,0 6160,0,0 6167,0,0 6173,0,0 6184,0,@6321 6220,0,0 6243,0,@5592 6292,0,@5592 6344,0,@5592 6363,0,@14151 6383,0,0 6390,0,1 6397,0,3 6403,0,0 6414,0,@6321 6482,1,@13830 6494,0,@13447 6502,1,@13449 6558,0,1 6571,0,1 6640,0,@14206 6670,1,@13885 6690,1,@6462 6698,0,I48 6716,0,I48 6721,0,4 6746,0,0 6769,0,@14207 6786,0,@13728 6794,1,@13836 6837,0,0 6853,0,0 6891,0,2 6908,0,0 6970,1,@14208 7115,0,@6455 7210,0,@6455 7246,0,@14216 7278,1,@13015 7318,1,@14218 7334,0,0 7339,0,@6455 7353,0,@6455 7426,1,@14229 7450,0,@8006 7483,0,0 7494,1,@13829 7501,0,0 7516,0,0 7579,0,@14237 7687,0,@14188 7694,0,@13537 7722,0,124 7729,0,@14195 7735,0,@14238 7762,1,@14170 7830,1,@14239 7835,0,@6455 7928,0,@14313 8040,0,@14188 8047,0,@13537 8080,0,124 8087,0,@14195 8093,0,@14314 8114,1,@14170 8151,0,@14221 8157,0,2 8164,0,@6509 8170,1,@6714 8185,0,@14093 8198,0,@14094 8206,1,@14095 8278,1,@13830 8297,0,@13447 8302,1,@13449 8358,0,1 8371,0,1 8385,0,0 8444,0,@14315 8454,1,@14316 8462,1,@13423 8474,1,@13306 8513,0,0 8563,0,1 8599,0,3 8634,0,@5413 8653,0,79992 8662,0,6 8703,0,@14317 8811,0,@14163 8818,0,@13448 8846,0,44 8853,0,@14168 8859,0,@14169 8886,1,@14170 8896,0,@6455 8929,0,0 8948,0,@5229 8955,0,@5786 8962,0,@5788 8971,0,5 8989,0,1 8998,1,@13857 9006,1,@6447 9019,0,@5306 9027,0,@6509 9034,1,@6714 9049,0,@14093 9062,0,@14094 9070,1,@14095 9146,1,@13830 9165,0,@13447 9170,1,@13449 9226,0,1 9239,0,1 9279,0,@5413 9298,0,79992 9307,0,6 9327,0,@5306 9333,0,2 9343,0,@6509 9350,1,@6714 9372,0,@14093 9385,0,@14094 9390,1,@14095 9462,1,@13830 9481,0,@13447 9486,1,@13449 9542,0,1 9555,0,1 9569,0,0 9611,0,0 9618,1,@12896 9631,0,0 9638,1,@12896 9651,0,0 9658,1,@12896 9724,0,@14319 9771,0,@14320 9822,0,@14321 9875,0,@14322 10009,0,@14326 10019,0,@6455 10135,0,@14328 10196,0,@14330 10240,0,@14331 10372,0,@6455 10454,1,@14229 10478,0,@8006 10511,0,0 10526,1,@13829 10543,0,0 10558,0,0 10615,0,$13817+10786 10649,0,0 10654,0,11 10659,0,0 10703,0,10 10745,0,@14332 10770,0,1 10803,0,1 10808,0,10 10813,0,@5052 10818,1,@5053 10825,0,@13704 10830,1,@4940 10861,0,@13705 10871,0,@5398 10877,0,@4608 10914,0,$13817+11086 10948,0,0 10953,0,11 10960,0,0 11004,0,10 11046,0,@14334 11071,0,1 11103,0,1 11108,0,10 11113,0,@5052 11118,1,@5053 11125,0,@13704 11130,1,@4940 11161,0,@13705 11171,0,@5398 11177,0,@4608 11214,0,$13817+11386 11248,0,0 11253,0,11 11260,0,0 11304,0,10 11346,0,@14336 11371,0,1 11403,0,1 11408,0,10 11413,0,@5052 11418,1,@5053 11425,0,@13704 11430,1,@4940 11461,0,@13705 11471,0,@5398 11477,0,@4608 11530,1,@14338 11566,1,@14340 11582,0,0 11587,0,@14351 11592,0,0 11602,1,@6418 11613,0,@14354 11618,0,0 11630,1,@6418 11644,0,@14356 11649,0,0 11658,1,@6418 11672,0,@6455 11706,0,0 11745,0,@5413 11773,0,25 11832,0,1 11837,0,@14358 11842,1,@13429 11854,1,@14089 11885,0,1 11894,0,0 11916,0,3 11926,0,@6509 11934,1,@6714 11961,0,@14090 11966,1,@14091 11977,0,@14093 11990,0,@14094 11998,1,@14095 12041,0,0 12071,0,@6812 12090,0,@14111 12110,0,0 12117,0,0 12124,0,0 12130,0,0 12141,0,@6321 12180,0,0 12203,0,@5592 12255,0,@5592 12274,0,@14360 12294,0,0 12301,0,1 12308,0,3 12314,0,0 12325,0,@6321 12394,1,@13830 12406,0,@13447 12414,1,@13449 12470,0,1 12483,0,1 12497,0,0 12502,0,@5232 12572,0,@14221 12577,0,@6509 12582,1,@6714 12609,0,@14362 12614,1,@14091 12625,0,@14093 12638,0,@14094 12646,1,@14095 12689,0,0 12719,0,@6812 12738,0,@14111 12758,0,0 12765,0,0 12772,0,0 12778,0,0 12789,0,@6321 12828,0,0 12851,0,@5592 12903,0,@5592 12922,0,@14363 12942,0,0 12949,0,1 12956,0,3 12962,0,0 12973,0,@6321 13042,1,@13830 13054,0,@13447 13062,1,@13449 13118,0,1 13131,0,1 13168,0,@5413 13187,0,79992 13196,0,6 13257,0,@14315 13266,1,@14365 13271,0,1 13278,1,@13429 13290,1,@14089 13321,0,1 13330,0,0 13352,0,3 13388,0,@14366 13422,1,@13015 13446,1,@14367 13490,1,@14370 13513,0,0 13518,0,@6455 13529,0,@6000 13590,1,@14372 13595,0,@6455 13668,0,@5232 13673,0,@6509 13678,1,@6714 13705,0,@14402 13710,1,@14091 13721,0,@14093 13734,0,@14094 13742,1,@14095 13785,0,0 13815,0,@6812 13834,0,@14111 13854,0,0 13861,0,0 13868,0,0 13874,0,0 13885,0,@6321 13924,0,0 13947,0,@5592 13999,0,@5592 14018,0,@14403 14038,0,0 14045,0,1 14052,0,3 14058,0,0 14069,0,@6321 14138,1,@13830 14150,0,@13447 14158,1,@13449 14214,0,1 14227,0,1 14295,0,@6000 13818:O4|@4608,@5398,@13820,@13819 13819:O5|@13821,1406,0,1406,0 13820:S28|61737369676e54797065733a20656d7074797472656520666f756e64 13821:S53|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f54595045434845434b5f5041525345545245452e736d6c 13822:O4|@4608,@5398,@13824,@13823 13823:O5|@13821,1403,0,1403,0 13824:S34|61737369676e54797065733a206c617965726564207061747465726e20666f756e64 13825:O4|@4608,@5398,@13827,@13826 13826:O5|@13821,1400,0,1400,0 13827:S27|61737369676e54797065733a2077696c646361726420666f756e64 13828:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e91d00000090000000002c000000|@13833,2097151,@2741|24,0,1 35,1,@13829 13829:D3,332|3b650c7303ff552489de89c7ff7708ff770cff7710ff7714ff7718ff771cff7720ff7724ff7728ff772cff7730ff7734ff7738ff773cff77408b5f048b07909090e81a0100008b4d008d49f43b4d087303ff5520894d00c741fc020000008b542404895104c70107000000f6c101740d89c3b8ecd57ab28b5d0490ff138b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c7430401000000890b8d4b0cc741fc05000000895910c7410c01000000c7410801000000c7410401000000c70101000000f6c101740e89c3b8ecd57ab28b5d049090ff1356575189c38b442418ba68bf88b29090e80efbfeff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5b8958088948048b4c240489088b1c2483f90174098b4b0cc701030000008b533083c4085983c40c51ff220000000048010000|@13832,2097151,@2740|66,1,@13830 103,0,3 115,0,@6321 152,0,0 174,0,0 181,0,0 188,0,0 194,0,0 206,0,@6321 227,0,@13447 234,1,@13449 307,0,1 13830:D3,236|8b442410a80175358b088139d4e539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa017568b87c787cb2a80175358b088139d4e539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa01750ab8287c7cb28b5d04ff138b0290908138d4e539b27414b854eb7ab28b5d04eb05e90d000000909090ff138b480889c8c23c008b0290908138d4e539b2740cb854eb7ab28b5d049090ff138b480889c8c23c0090909000000000e8000000|@13831,7,@2739|12,0,@4671 62,0,0 72,0,@7313 84,0,@4671 134,0,0 144,0,@7368 159,0,@4671 166,0,@6377 199,0,@4671 206,0,@6377 13831:S21|4c45585f28292e6572726f72446570746828313729 13832:S30|5052494e545f50415253455452454528292e6572726f724e656172283529 13833:S45|54595045434845434b5f50415253455452454528292e7061737332283529676976654572726f72283329283129 13834:S20|56616c7565206f7220636f6e7374727563746f72 13835:D3,816|8d7c24943b7d0c7303ff55286a016a0150ff33ff73048d5c240c8b44241c909090e8224cf1ff817c240c48c052087429f644240c0175318b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750f8b4424108b542404909090ff12eb68ff74240cff74241c8b5c2408b8bc5c89b2e8c6020000a80175678b088b51088b590cf6c30175328b33833e01751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b730489f33b650c7303ff5524ebc9bf01000000f7c701000000754eeb05e9a70100008b1f833b0175408b75008d76e83b7508730aeb05e966010000ff5520897500c746fc020000008b4b04894e04c706070000008d7e0cc747fc02000000c74704010000008937eb05bf010000006a016a016a016a016a016a016a016a016a016a016a016a016a0157ff30ff72108d5c240c8b02bac0e47ab290e80a1df1ff8b4424508b5424249090ff1283f8017507b801000000eb728b088b55008d52f43b55087303ff5520895500c742fc02000000c702ccce89b28b1c24895a048062ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7035ccf89b28b74244c8973048953088063ffbfff7110ff7108ff7104ff3153bbc8d089b28b410c90e89a3ff1ffeb05e9980000008b4d008d49e03b4d087303ff5520894d00c741fc07000000c7411801000000c74114010000008b54240c89511089410c8b4424088941088b4424048941045883c40c8901ff7424088b5c240889c89090e83608000089c18b45008d40f83b45087303ff5520894500c740fc010000008908eb25b834d389b26a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a0183c44083f8017563bb787a7fb28b442408909090e87e42f0ff8b5c2410909090e87242f0ffbb187689b29090e86642f0ff817c240c48c052087429f644240c01752e8b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750cb948c05208eb1ae934000000508b5c2410b88cce89b29090e81642f0ff89c1eb015089cb58909090e80642f0ff8b5424189090ff12b890cf87b283c414c208008b0083c414c20800909090000000002c030000|@13856,2097151,@2753|34,1,@6462 42,0,I48 60,0,I48 65,0,4 117,0,@13728 122,1,@13836 194,0,0 259,0,3 276,0,0 285,0,0 328,0,@6366 334,1,@6367 356,0,0 390,0,@13841 430,0,@13843 461,0,@13849 470,1,@6446 508,0,0 515,0,0 562,1,@13851 597,0,@13855 642,0,@8692 654,1,@4940 666,1,@4940 671,0,@13755 678,1,@4940 686,0,I48 704,0,I48 709,0,4 734,0,I48 751,0,@13839 758,1,@4940 774,1,@4940 787,0,@13162 13836:D3,1056|8d7c24943b7d0c7303ff55286a016a0150538d5c24088b442418909090e8e248f1ff817c240848c052087429f644240801752d8b742408bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750b8b44240c8b1424ff12eb64ff742408ff7424188b5c2408b8bc5c89b2e88affffffa80175698b088b51086a016a016a016a016a016a016a016a016a016a016a016a016a0151ff7214ff7210ff710c8d5c24108b02bac0e47ab2909090e8621af1ff58a80175408b08833901752aeb05e98c0200008b55008d52f83b55087303ff5520895500c742fc01000000eb05e943020000890aeb148b480489c83b650c7303ff5524ebbcba01000000f6c20175408b0283380175398b4d008d49e83b4d087303ff5520894d00c741fc020000008b5804895904c701070000008d710cc746fc02000000c7460401000000890eeb05be01000000568b4424508b54244090ff1283f8017507b801000000eb668b088b51088b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703fccd89b28b72108973048b7c2404897b088063ffbf8b3a833f03756c8b47048b008b770c8b368b3e83ff017507be68c05208eb59ff31ff710cff710489f950b80100000057eb05e9850100008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c759d1e983c604f3a58d7c3f018d743601eb0ae941000000e90c0000008d4c09018060ffbf89c6eb09ff31ff710cff7104508b45008d40f03b45087303ff5520894500c740fc0300000089700859894804c70001000000eb0a89f8ff31ff710cff71048b4d008d49e43b4d087303ff5520894d00c741fc060000008b7424148971148959108b5a0c89590cc74108010000008b720489710489018b0424833801752d8b7d008d7ff03b7d087303ff5520897d00c747fc030000008b7424188977088b4004894704c70709000000eb0289c7837c24040175068b44240ceb1489ce8b5c24048b44240c909090e88601000089f18b55008d52ec3b55087303ff5520895500c742fc0400000089420c894a08897a0483c4085889028b45008d40f83b45087303ff5520894500c740fc010000008910eb27b8010000006a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a0183c44483f8017562bb787a7fb28b4424049090e8623ef0ff8b5c240c909090e8563ef0ffbb187689b29090e84a3ef0ff817c240848c052087429f644240801752e8b742408bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750cb948c05208eb1ae934000000508b5c240cb88cce89b29090e8fa3df0ff89c1eb015089cb58909090e8ea3df0ff8b5424149090ff12b80100000083c410c208008b088b45008d40f83b45087303ff5520894500c740fc01000000890883c410c2080090000000001c040000|@13840,1048575,@2744|30,1,@6462 38,0,I48 56,0,I48 61,0,4 109,0,@13728 170,0,@6366 178,1,@6367 252,0,0 300,0,3 317,0,0 326,0,0 348,0,0 385,0,@13837 431,0,I49 449,0,0 585,0,0 644,0,0 703,0,4 738,1,@13838 812,0,0 859,0,@8692 870,1,@4940 882,1,@4940 887,0,@13755 894,1,@4940 902,0,I48 920,0,I48 925,0,4 950,0,I48 967,0,@13839 974,1,@4940 990,1,@4940 1003,0,0 13837:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e92833f1ff0000000020000000|@6481,2097151,@2742|24,1,@6426 13838:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2743| 13839:S14|20696e2073747275637475726520 13840:S30|56414c55455f4f505328292e6c6f6f6b7570537472756374757265283429 13841:D3,72|3b650c7303ff55248b480483390175278b410c8b52049090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000044000000|@13842,1048575,@2745|56,0,0 13842:S41|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70794964283129 13843:D3,132|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f4cf89b28b5a048959048061ffbf6a016a016a016868d089b2516a018d4c240c518b5a08909090e85a34f1ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c3900000000080000000|@13848,2097151,@2748|34,0,@13844 55,0,@13846 74,1,@6437 13844:D3,36|3b650c7303ff552450bb5d0000008b4204e88a3bf0ff5be9843bf0ff0000000020000000|@13845,63,@2746|10,0,46 18,1,@4940 24,1,@4940 13845:S49|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129283129 13846:O1|@13847 13847:D3,12|c39090900000000008000000|@13845,1,@2747| 13848:S46|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129 13849:O1|@13850 13850:D3,12|c39090900000000008000000|@13848,1,@2749| 13851:D3,348|3b650c7303ff55248b480883390375708b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c702030000008378100175068b742404eb1e8b700c89d7ff7004ff308b58108b44240ce81a01000089f189c689faeb08ff7004ff308b480c8b45008d40e03b45087303ff5520894500c740fc07000000eb05e927000000c7401801000000c740140100000089701089480c8950088b4c24048948045983c4048908c2040083390175738b55008d52f03b55087303ff5520895500c742fc03000000895a088b5904895a04c702090000008378100175068b742404eb1e8b700c89d7ff7004ff308b58108b44240ce8ce00000089f189c689faeb08ff7004ff308b480c8b45008d40e03b45087303ff5520894500c740fc07000000eb05e927000000c7401801000000c740140100000089701089480c8950088b4c24048948045983c4048908c20400c20400900000000058010000|@13854,63,@2752|48,0,1 82,1,@13852 136,0,0 143,0,0 212,0,4 246,1,@13853 300,0,0 307,0,0 13852:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2750| 13853:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2751| 13854:S28|56414c55455f4f505328292e6d6b53656c6563746564566172283329 13855:O1|@13162 13856:S26|56414c55455f4f505328292e6c6f6f6b757056616c7565283429 13857:D3,448|3b650c7303ff55248b4808833907755f83790411755e8b480c8b108b057ce839b2515389d3e8aa010000909090e8c2020000833c240174208b4c2404833905740c89c2b8b4d689b28b5d04ff13508b4108e83636f1ffeb458b4c240483390575378b5104833a077523f6420401eb0ae91b010000e91601000075118b5a048b33508b460490e80236f1ffeb115089d09090e8f635f1ffeb0589c289c85283380d740f89c1b804d789b28b5d04909090ff13f604240175418b0c248379040175388b118b5d008d5be83b5d087303ff5520895d00c743fc05000000c743100100000089530c8b32897308c7430401000000c7030b000000eb508b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d5908c743fc03000000c74308f1700200894b04c7030d0000008d5310c742fc020000008b3424897204c7020900000089118b4d008d49f03b4d087303ff5520894d00c741fc03000000c70164d789b28959048b400483c4088941088061ffbf6a016a0189e05089cb8b44240c9090e8b26af1ff5883c408c36a016a0189e252bbdcd789b28b480c89c890e8966af1ff8b442404909090e8f60200005883c404c39000000000bc010000|@13872,2097151,@2759|29,0,@4726 38,1,@13858 46,1,@13860 68,0,@13861 82,1,@6447 134,1,@6447 146,1,@6447 165,0,@13864 221,0,0 236,0,0 242,0,5 274,0,@5413 291,0,79992 300,0,6 322,0,4 354,0,@13867 390,1,@6564 407,0,@13869 418,1,@6564 430,1,@13871 13858:D3,216|3b650c7303ff5524a80175678b083b19744ef6c3017541f60101753c8b31f7c6010000007407ba03000000eb068b168d54120183c20889de8b39ff7108ff710489d1d1e93bc9f3a68d7c3f018d7436018d4c09017410eb66ff7108ff7104eb5eff7108ff71048b4d008d49f43b4d08730aeb05e951000000ff5520894d00c741fc020000008b5424048951048b14248911518b4004e866ffffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c38b400483c408e937ffffffb801000000c39000000000d4000000|@13859,63,@2754|39,0,1 202,0,0 13859:S42|5052494e545f5441424c4528292e6765744f7665726c6f6164732831297365617263684c697374283129 13860:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2755|60,0,0 13861:O4|@4608,@5398,@13863,@13862 13862:O5|@6454,2522,0,2522,0 13863:S26|676574526573756c74202d206e6f7420612066756e6374696f6e 13864:O4|@4608,@5398,@13866,@13865 13865:O5|@6454,2537,0,2537,0 13866:S42|67656e6572616c6973654f7665726c6f6164202d20617267206973206e6f742061207479706520766172 13867:D3,52|8b003b4208751e8b45008d40f83b45087303ff5520894500c740fc010000008b52048910c3b801000000c3900000000030000000|@13868,5,@2756|38,0,0 13868:S38|545950455f5452454528292e67656e6572616c6973654f7665726c6f6164283329742d283129 13869:O1|@13870 13870:D3,16|b801000000c39090000000000c000000|@6563,1,@2757|1,0,0 13871:D3,168|3b650c7303ff5524a80175708b088b51048b5a0483e30983fb017407bb01000000eb05bb0300000083f3028b720483e60383fe017407be01000000eb05be0300000083f6028b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f048b19891f578b700489f0e88effffff89c18b45008d40f4eb05e9190000003b45087303ff5520894500c740fc02000000894804598908c3b801000000c300000000a4000000|@6329,63,@2758|29,0,0 36,0,1 55,0,0 62,0,1 155,0,0 13872:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296f7665726c6f616454797065283229 13873:O1|@13874 13874:D3,16|b801000000c39090000000000c000000|@6563,1,@2760|1,0,0 13875:D3,1384|8d7c24b03b7d0c7303ff55288b4d008d49f03b4d087303ff5520894d00c741fc03000000c701b0de89b28b5424248951048b5c24208959088061ffbf6a016a016a0189c789e389c890e87a62fdff57ff742428ff742438ff7424108b5c24388b4424509090e8e605000050ff742410ff74243cff74243c8b5c24348b44244c9090e8260900008b4c2440f6c101756ba801756c8b118b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7430848c052088b72108973048b3a893b8b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704c707010000008b742438ff7004ff7104ff32ff7210ff720453ff30ff721857eb0ae95c010000e957010000b8010000008b5640ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008b5424048950045a83c40489105150ff742408bb01000000b8010000008b54245090ff128b4d008d49e43b4d087303ff5520894d00c741fc030000008941088b04248941048b54241089118d5910c743fc02000000c7430401000000890b8b4c24088919a8017407b8e01687b2eb048b44240c53508b5c245c89d0e8f63bfdff8b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b54241489108b54242c9090ff128b4424488b480c8b45008d40f43b45087303ff5520894500c740fc020000005a83c4108950045a891089ca909090ff128b4424045983c4043b650c7303ff5524e92ffeffffb8010000008b45008d40f03b45087303ff5520894500c740fc03000000c700ac0e8ab28b4c24388948048b5424348950088060ffbf6a016a016a0189e390e82a60fdff6a016a016a0189e3b8010000009090e81a10fdffff742450ff742444ff742430ff742458ff742420ff742470ff74241c8b5c24348b44247c909090e85a3300008b5c243c83c404ba741a8ab2909090e85e3e0000837c24580175138b44243c8b480889c88b5424089090ff12eb736a016a016a0189e3b801000000e8ae0ffdff8b45008d40f03b45087303ff5520894500c740fc03000000c700782c8ab28b4c24488948048b5424048950088060ffbf8b55008d52ec3b55087303ff5520895500c742fc04000000c702102d8ab28b5918895a048b74241c8972088b742408eb05e9ce01000089720c8062ffbf8b75008d76ec3b75087303ff5520897500c746fc04000000c706702d8ab2894e048b7c2414897e085f83c408897e0c8066ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70750308ab2894f048b0c24894f088067ffbf8b4c243c8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703ec308ab2568b71208973048b4c2408894b088063ffbf8b4c24408b75008d76c43b75087303ff5520897500c746fc0e000000ff7134ff7130ff712cff7128538b5c2410895e348b5c240c895e308b5c2408895e2c8b5c2404895e288b5c2414895e245b83c414895e208b591c895e1c8956188b51148956148b5110895610897e0c8946088b41048946048b39893e8b542418bfe4107bb256f6c201753b8b02ff7204ff742404ff742454ff30ff742460ff742458ff742454ff7424508b5c24688b4424508b54245890ff1289c75a3b650c7303ff5524ebc08b44241883c404909090e8125300008b4c245089018b442414a80175518b088b51088b5a04833b037511837b0c03750b8b7304c70601000000eb24833b0175088b7308833e03740e8b7004b8e0298ab28b5d0490ff138b7e04c707010000008b700489f03b650c7303ff5524ebabb801000000b8e4107bb283c428c234009090900000000064050000|@14087,2097151,@2848|38,0,@13876 74,1,@13015 102,1,@13878 130,1,@13881 176,0,I48 219,0,0 261,0,0 299,0,2 316,0,0 382,0,0 387,0,0 450,0,0 467,0,@12945 486,1,@12947 604,0,0 634,0,@13978 666,1,@13015 679,0,0 686,1,@12896 730,1,@13980 742,0,@13997 750,1,@13998 789,0,0 794,1,@12896 824,0,@14073 872,0,@14075 933,0,@14076 984,0,@14083 1031,0,@14085 1178,0,@6455 1258,1,@14086 1300,0,0 1323,0,@14045 1338,0,0 1358,0,0 1363,0,@6455 13876:D3,116|3b650c7303ff55248b4c24048b198b7304f7c601000000751b8b3e833f0175058b4f04eb148b7e0489fe3b650c7303ff5524ebddb9e01687b25152bbe43a89b290e89e2cf0ff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e96fe4ffff9090900000000070000000|@13877,2097151,@2761|53,0,@12945 60,0,@13643 66,1,@4940 92,0,1 101,1,@13829 13877:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836296d657373466e283329 13878:D3,120|3b650c7303ff5524a801755c53ff7004ff742414ff742414ff7424148b00909090e86600000050ff742418ff742418ff7424188b5c24148b4424109090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c000000000074000000|@6329,1048575,@2763|34,1,@13879 105,0,0 13879:D3,620|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410848c052088b50108951048b308931bf010000008b7014f7c601000000751ff7c701000000740583c7027105ff5538ebf68b76043b650c7303ff5524ebd989fe83fb0175418b5d008d5bf43b5d087303ff5520895d00c743fc02000000c74304ec7d7ab28b70148933ff3052ff70045351bb03000000b8010000008b542420909090ff12eb738b5d008d5bc43b5d087303ff5520895d00c743fc01000040c703ffffffff8d7b08c747fc01000040c70728e07bb28d5708c742fc03000000897a08895a04c702050000008d5a10c743fc01000040c703010000008d7b08c747fc04000000c7470c03000000897708895f04c70703000000eb05e92a0000008b188b70105356ff70048b45008d40f03b45087303ff5520894500c740fc0300000089480889780489108b4d008d49f43b4d087303ff5520894d00c741fc020000008b542404895104c701010000008b5c24145051b8010000008b5340909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40d83b45087303ff5520894500c740fc030000005a8950088948048b54240889108d5810c743fc02000000c743040100000089035e891e8d5b0cc743fc02000000c74304010000008903f6c1017407b9e01687b2eb038b0c245053518b5c241c89d090e8d234fdff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240889088b542410ff125883c408c20c009090900000000068020000|@13880,1048575,@2762|35,0,I48 50,0,0 130,0,@5413 148,0,1 153,0,0 194,0,-1 210,0,@6817 232,0,2 248,0,0 265,0,1 277,0,1 363,0,0 374,0,0 415,0,2 432,0,0 504,0,0 526,0,0 538,0,@12945 558,1,@12947 13880:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629656e74657254636f6e283129 13881:D3,200|3b650c7303ff5524a801755c8b08f641080175598b510889de8b5d008d5be83b5d087303ff5520895d00c743fc05000000c703bce389b28b7c240c897b048b4c2408894b088b7c2404897b0c8973108063ffbf56ff7004518b02ba40058ab29090e806220000eb0fe94b0000008b4804b8ec7d7ab2535150ff742418ff742418ff7424188b5c24148b44241090e86effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c0000000000c4000000|@6329,2097151,@2813|51,0,@13882 91,0,@13964 98,1,@13965 113,0,@5413 185,0,0 13882:D3,152|3b650c7303ff55248b4a108b75008d76f03b75087303ff5520897500c746fc03000000c70668e489b28b7920897e048b4a04894e088066ffbf8b7a108b4d008d49f43b4d087303ff5520894d00c741fc02000000508b4734894104893153ff720cff720868b0e489b289e2528b5c241489c8909090e8be0000008b4c241883c4148b008901b801000000c204009090900000000094000000|@13963,2097151,@2805|37,0,@13883 101,0,@13884 118,1,@13885 134,0,0 13883:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2764| 13884:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9b1deffff90000000002c000000|@13833,2097151,@2765|24,0,1 35,1,@13829 13885:D3,504|8d7c24ac3b7d0c7303ff55286a016a01ff30ff700489d88d5c24089090e8b62df1ff817c240848c052087429f64424080175318b742408bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750f8b44240c8b542404909090ff12eb66ff742408ff7424188b5c2408b8bc5c89b2e85ae4ffffa801756b8b008b48086a016a016a016a016a016a016a016a016a016a016a016a016a01ff71108d5c24048b01bac0e47ab29090e83afff0ff8b4424448b5424249090ff1283f801750cb801000000eb6ce977000000ff30bb5d0000008b442444909090e8be25f0ff508b5c2408eb05e92d0000008b442404909090e81201000089c18b45008d40f83b45087303ff5520894500c740fc01000000890883c404eb28b8dc048ab26a016a016a016a016a016a016a016a016a016a01eb05e9080000006a016a016a016a0183c43883f8017561bb787a7fb2b8e4048ab2e84625f0ff8b5c240c909090e83a25f0ffbb187689b29090e82e25f0ff817c240848c052087429f644240801752e8b742408bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750cb948c05208eb1ae934000000508b5c240cb88cce89b29090e8de24f0ff89c1eb015089cb58909090e8ce24f0ff8b5424149090ff12b8f87087b283c410c204008b0083c410c2040090909000000000f4010000|@13962,2097151,@2804|30,1,@6462 38,0,I48 56,0,I48 61,0,4 113,0,@13728 118,1,@13836 167,0,@6366 174,1,@6367 196,0,0 210,0,46 222,1,@4940 246,1,@13886 284,0,@13960 332,0,@8692 337,0,@13961 342,1,@4940 354,1,@4940 359,0,@13755 366,1,@4940 374,0,I48 392,0,I48 397,0,4 422,0,I48 439,0,@13839 446,1,@4940 462,1,@4940 475,0,@13072 13886:D3,568|8d7c24a43b7d0c7303ff55285350ff7504b9bee789b2518965048b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000089cab917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c7014ce989b28d7108c746fc0400000089460c895608894e04c7060300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e8424af0ff89c3b8bc5589b2e8a623f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a01568d5c240489f0bac0e47ab29090e87afcf0ff8b4424388b088b45008d40f43b45087303ff5520894500c740fc020000008b5424388950048b0989088b54241090ff128b45008d40ec3b45087303ff5520894500c740fc01000040c700010000008d4808c741fc02000000c70184e989b28941048061ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c74208f8e989b2894a04c702c0ea89b250ff7424406a03ff7424506860eb89b26a0189d38b4424189090e8da0200005883c4408b0083f801750c89c1b84cc37bb28b5d04ff138b00c2040090900000000034020000|@13959,2097151,@2803|18,0,$13886+190 52,0,0 59,0,11 64,0,0 108,0,10 150,0,@13887 175,0,1 207,0,1 212,0,10 217,0,@5052 222,1,@5053 229,0,@13704 234,1,@4940 265,0,@13705 275,0,@5398 281,0,@4608 347,0,@6366 354,1,@6367 432,0,0 448,0,@13889 486,0,@13891 495,0,@13896 511,0,@13900 526,1,@13905 544,0,@6769 13887:O1|@13888 13888:D3,28|3b650c7303ff5524bb15000000e92a82f0ff90900000000018000000|@5217,2097151,@2766|9,0,10 14,1,@5214 13889:D3,48|8b4d008d49f83b4d087303ff5520894d00c741fc010000008b400489018b5204890ab801000000c3000000002c000000|@13890,7,@2767|35,0,0 13890:S38|434f5049455228292e66756c6c436f70794461746174797065283329726573456e762d283129 13891:O1|@13892 13892:D3,88|3b650c7303ff55248b18b86cea89b29090e87e21f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c80ea89b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff139090900000000054000000|@13890,63,@2768|11,0,@13893 18,1,@4940 49,0,@13894 59,0,@5398 65,0,@4608 13893:S12|656e74657253747275637420 13894:O5|@13895,258,0,258,0 13895:S30|6d6c736f757263652f4d4c436f6d70696c65722f434f504945522e736d6c 13896:O1|@13897 13897:D3,88|3b650c7303ff55248b18b834eb89b29090e8b620f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c48eb89b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff139090900000000054000000|@13890,63,@2769|11,0,@13898 18,1,@4940 49,0,@13899 59,0,@5398 65,0,@4608 13898:S9|656e74657256616c20 13899:O5|@13895,259,0,259,0 13900:O1|@13901 13901:D3,24|b894eb89b28b5d04909090ff139090900000000014000000|@13904,1,@2770|1,0,@13902 13902:O4|11,@4879,0,@13903 13903:O5|@13895,261,0,261,0 13904:S33|434f5049455228292e66756c6c436f707944617461747970652833295f2d283129 13905:D3,164|3b650c7303ff55245053ff74241c6a036a01ff7424188b5c2424909090e89600000050ff7424206a0150508b5c24288b4424189090e87e0000008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701e8f389b28b54242083c4048951048b5c241489590889410c8061ffbf51ff74240450ff74241c5352ff74243068f8f589b289e050bb010000008b442428e82e12f1ff83c428c2140000000000a0000000|@13958,1048575,@2802|30,1,@13906 54,1,@13906 84,0,@13925 129,0,@13933 137,0,0 146,1,@6418 13906:D3,92|3b650c7303ff552453ff74240cff742414ff74241c6814ed89b250538d4c2408518b5c2424e8e211f1ffff742424ff74242cff742434ff74240c6848ee89b289e15189c38b44241c90e8be11f1ff83c430c210000000000058000000|@13924,1048575,@2780|22,0,@13907 38,1,@6418 59,0,@13910 74,1,@6418 13907:D3,224|3b650c7303ff55248b4c24045052f6c301756f8b03813864e239b2756a813864e239b2740cb854eb7ab28b5d049090ff138b50088b72088b3c24ff730451ff36ff76108b5c24148b4710909090e82e1ef0ffbb5d0000009090e8221ef0ff8b4c24108b55008d52f03b55087303ff5520895500c742fc03000000c70208ee89b2eb0ae949000000e9280000005b895a048b5904895a088062ffbf52ff7108ff710cff74241089c38b442410ba40ee89b2ff12eb0989c8ff73046a016a0189c183c4085b3b650c7303ff5524e93effffff89c883c408c2040000000000dc000000|@6417,1048575,@2772|23,0,@4611 31,0,@4611 38,0,@6377 78,1,@4940 83,0,46 90,1,@4940 124,0,@13908 172,0,@13909 13908:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e91c13f1ff0000000020000000|@6481,2097151,@2771|24,1,@6426 13909:O1|@13906 13910:D3,80|3b650c7303ff55248b4c24045052f6c301752c8b0424ff730451ff7004ff7008ff700cff70108b1b8b44241c90e83200000089c15b3b650c7303ff5524ebcf89c883c408c2040090000000004c000000|@6417,2097151,@2779|46,1,@13911 13911:D3,572|3b650c7303ff5524813b0ce239b27571813b0ce239b2740db854eb7ab28b5d04909090ff138b5b088b45008d40f43b45087303ff5520894500c740fc02000000c700fcf089b28b4c24108948048060ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70274f189b28b74240c8972048062ffbf8b3b8b4f08eb05e9a70100008b7104833e057572837c24080174078b442414c214008b7d008d7fec3b7d087303ff5520897d00c747fc04000000c70718f289b28957048947088b44240489470c8067ffbfff33ff7108ff31ff760457bb4cf389b28b4608909090e86618f1ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e98600000089410858894104c701050000008b45008d40f03b45087303ff5520894500c740fc030000008b5424048950088948045983c40489088b0c24508b198b44241890e89e1bf0ff8b4c24048b55008d52e43b55087303ff5520895500c742fc030000005b83c404895a088b4904894a0489028d4210c740fc020000008b4c24148948048910c21400837c24080175078b442414c21400833e017528ff338b460c8b54241090ff128b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb07b901000000ff33f6c10175518b0424ff318b188b442418e8061bf0ff8b4c24048b55008d52e43b55087303ff5520895500c742fc030000005b895a088b4904894a0489028d4210c740fc020000008b4c2418894804891083c404c214008b44241883c404c214008b442414c214000000000038020000|@13923,2097151,@2778|10,0,@4600 18,0,@4600 25,0,@6377 66,0,@13912 107,0,@13914 182,0,@13916 215,0,@13921 226,1,@6446 270,0,2 326,1,@4940 455,0,0 478,1,@4940 13912:D3,28|3b650c7303ff552489c38b4204e9861af0ff90900000000018000000|@13913,63,@2773|14,1,@4940 13913:S64|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c6454797065732833296d616b654e616d65283129 13914:D3,72|3b650c7303ff55248b480483390175278b410c8b52049090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000044000000|@13915,1048575,@2774|56,0,0 13915:S62|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f70794964283129 13916:D3,92|3b650c7303ff55246a016a016a016888f289b2ff7208ff720c8d4c240c518b5a04e8c611f1ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c3900000000058000000|@13920,2097151,@2776|15,0,@13917 34,1,@6437 13917:O1|@13918 13918:D3,12|c39090900000000008000000|@13919,1,@2775| 13919:S71|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129283129 13920:S68|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129 13921:O1|@13922 13922:D3,12|c39090900000000008000000|@13920,1,@2777| 13923:S53|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329 13924:S41|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629 13925:D3,172|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a8f489b28b5a048959048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c7063cf589b28b7a08897e048066ffbf6a016a016a0168a0f589b256ff720c8d74240c5689cb909090e8a60ff1ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c39000000000a8000000|@13932,2097151,@2784|34,0,@13926 74,0,@13928 95,0,@13930 114,1,@6437 13926:D3,72|3b650c7303ff55248b480483390175278b410c8b52049090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000044000000|@13927,1048575,@2781|56,0,0 13927:S48|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129636f70794964283129 13928:D3,28|3b650c7303ff552489c38b4204e94616f0ff90900000000018000000|@13929,63,@2782|14,1,@4940 13929:S42|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129283129 13930:O1|@13931 13931:D3,12|c39090900000000008000000|@13929,1,@2783| 13932:S39|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129 13933:D3,96|3b650c7303ff55248b4c24045052f6c301753c8b0424ff730451ff7004ff7008ff700cb96cf689b251ff7010ff7014ff7018ff701c8b1b8b44242c9090e83a00000089c15b3b650c7303ff5524ebbf89c883c408c2040090000000005c000000|@6417,2097151,@2801|36,0,@13934 62,1,@13935 13934:O1|@13905 13935:D3,1760|3b650c7303ff5524813b64e239b27567813b64e239b2740d89c1b854eb7ab28b5d0490ff138b4b088b5108837c24200174688b75008d76f03b75087303ff5520897500c746fc03000000c70668fd89b28b7a10897e048b5c241c895e088066ffbf8b3a833f03756c8b5f048b1b8b7f0c8b3f508b07eb05e95904000083f8017507b868c05208eb71ff710cff7104ff3189c150b801000000eb05e9d5000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f05e89f989cf518b4c2404eb05e958000000d1e983c604f3a58d7c3f018d7436018d4c09018b0c248061ffbf89c689c8eb05e90500000083c408eb08ff710cff7104ff318b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895904c70101000000eb0b50ff710cff7104ff3189f98b45008d40e43b45087303ff5520894500c740fc060000008b5a148958148970108b720c89700cc74008010000008b7a048978048908eb7050ff710cff7104ff31ff7214ff720cff7204ff32ff7210ff7504beb2f889b2568965048b75008d76f83b75087303ff5520897500c746fc01000040c70601000000b917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057eb05e991020000f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c701a0fd89b28d5108c742fc0400000089420c897208894a04c7020300000083c40458894504eb6f8b650483c4045b895d04833809755850bb03000000b815000000bafc317ab2e84e39f0ff89c3b8bc5589b2e8b212f0ff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000c700d8fd89b28950048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70168ff89b28951048061ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703c8008ab28953048063ffbf8b75008d76e03b75087303ff5520897500c746fc03000000894e08894604891e8d4610c740fc03000000c70028028ab2598948048b4c243c8948088060ffbf5250568b5c24288b442444909090e8b211f0ffbb5d0000009090e8a611f0ffff7424046a0150ff742448ff7424488b5c24148b4424208b542454909090ff128b44240883380375708b48048b098b400c8b008b1083fa017507b868c05208eb5089cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89d98b55008d52f0eb05e9200000003b55087303ff5520895500c742fc03000000894208894a04c70201000000eb0289c28b45008d40e43b45087303ff5520894500c740fc060000008b4c241883c4108948148b4c242c8948108b5c240489580cc74008010000005b83c40889580489108b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240889510c8941088b4424048941045883c40889018b44240c8b50088b45008d40f43b45087303ff5520894500c740fc020000008948045989085983c42451ff22813b0ce239b27571813b0ce239b2740c89c1b854eb7ab28b5d04ff138b4b088b55008d52f43b55087303ff5520895500c742fc02000000c70260028ab28b74241c8972048062ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c707bc028ab28b5c2418895f048067ffbf6a016a016a01eb05e9ad00000050ff710468ec028ab257ff7424288d7c24145789d38b01909090e81e08f1ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c24088908508b5c241c8b4424049090e8f20600008b4c24208b55008d52f43b55087303ff5520895500c742fc020000008942048b042489028b45008d40f43b45087303ff5520894500c740fc020000008950048b54240889108b510483c4185b83c42453ff22813bece139b2756c813bece139b2740db854eb7ab28b5d04909090ff138b4308ff30ff7018ff7014ff7010ff7008ff700450ff700cff742424bb4c048ab28b442404909090e83a0bf1ff3b0424744d8b4d008d49e03b4d087303ff5520894d00c741fc070000008b5424188951188b542414eb05e9550000008951148b54241089511089410c8b44240c8941088b4424088941048b44241c8901eb048b4c24048b44242883c41c8b108b45008d40f43b45087303ff5520894500c740fc020000008948045989085983c42451ff22b801000000c22400909000000000dc060000|@13957,2097151,@2800|10,0,@4611 18,0,@4611 27,0,@6377 76,0,@13936 130,0,I49 148,0,0 299,0,0 358,0,0 399,0,$13935+574 433,0,0 438,0,11 443,0,0 494,0,10 536,0,@13937 561,0,1 591,0,1 596,0,10 601,0,@5052 606,1,@5053 613,0,@13704 618,1,@4940 649,0,@13705 659,0,@5398 665,0,@4608 711,0,@13939 748,0,@13942 785,0,@13944 840,0,@13946 874,1,@4940 879,0,46 886,1,@4940 949,0,I49 962,0,0 1074,0,0 1133,0,0 1239,0,@4600 1247,0,@4600 1256,0,@6377 1294,0,@13947 1335,0,@13948 1368,0,@13949 1390,1,@6437 1450,1,@13951 1538,0,@4596 1546,0,@4596 1553,0,@6377 1594,0,@13955 1606,1,@6446 1743,0,0 13936:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9bc03f1ff0000000020000000|@6481,2097151,@2785|24,1,@6426 13937:O1|@13938 13938:D3,28|3b650c7303ff5524bb15000000e9d66df0ff90900000000018000000|@5217,2097151,@2786|9,0,10 14,1,@5214 13939:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c7010ce239b2ff3052518b5c24088b4204e806eaf0ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e906f2f0ff909000000000a4000000|@13941,2097151,@2788|35,0,0 48,0,69 54,0,@4600 70,1,@6369 106,0,0 126,1,@13940 154,1,@6390 13940:D3,144|3b650c7303ff5524a80175578b0881390ce239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@2787|16,0,@4600 126,0,0 13941:S39|434f5049455228292e6c6f63616c436f70795369672837292833296e65775369672d5f2d283129 13942:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c70164e239b2ff3052518b5c24088b4204e876e8f0ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e976f0f0ff909000000000a4000000|@13941,2097151,@2790|35,0,0 48,0,69 54,0,@4611 70,1,@6369 106,0,0 126,1,@13943 154,1,@6390 13943:D3,144|3b650c7303ff5524a80175578b08813964e239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@2789|16,0,@4611 126,0,0 13944:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c701ece139b2ff3052518b5c24088b4204e816e7f0ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e916eff0ff909000000000a4000000|@13941,2097151,@2792|35,0,0 48,0,69 54,0,@4596 70,1,@6369 106,0,0 126,1,@13945 154,1,@6390 13945:D3,144|3b650c7303ff5524a80175578b088139ece139b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@2791|16,0,@4596 126,0,0 13946:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9fcfef0ff0000000020000000|@6481,2097151,@2793|24,1,@6426 13947:D3,72|3b650c7303ff55248b480483390175278b410c8b52049090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000044000000|@13927,1048575,@2794|56,0,0 13948:D3,28|3b650c7303ff552489c38b4204e9c608f0ff90900000000018000000|@13929,63,@2795|14,1,@4940 13949:O1|@13950 13950:D3,12|c39090900000000008000000|@13929,1,@2796| 13951:D3,204|3b650c7303ff5524a801756c8b0853ff7004ff7118ff7114ff7110ff7108ff7104ff3151ff710c53bbf4038ab28b442404e8ae04f1ff3b0424744d8b4d008d49e03b4d087303ff5520894d00c741fc070000008b54241c8951188b5424188951148b54241489511089410c8b4424108941088b44240ceb05e9410000008941048b4424088901eb048b4c2404518b5c24288b442424e866ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4288908c3b801000000c300000000c8000000|@6329,2097151,@2798|41,0,@13952 50,1,@6446 191,0,0 13952:O1|@13953 13953:D3,12|c39090900000000008000000|@13954,1,@2797| 13954:S37|434f5049455228292e6c6f63616c436f7079536967283729636f7079547970283129283129 13955:O1|@13956 13956:D3,12|c39090900000000008000000|@13954,1,@2799| 13957:S27|434f5049455228292e6c6f63616c436f7079536967283729283329 13958:S24|434f5049455228292e6c6f63616c436f7079536967283729 13959:S28|434f5049455228292e66756c6c436f70794461746174797065283329 13960:O1|@13072 13961:S16|5479706520636f6e7374727563746f72 13962:S24|56414c55455f4f505328292e6c6f6f6b7570547970283329 13963:S28|545950455f5452454528292e61737369676e54797065732833292d45 13964:O2|@13965,@4643 13965:D3,40|3b650c7303ff55248b4c24048b5204895424048b1424890c2452e91d000000900000000024000000|@13977,2097151,@2812|27,1,@13966 13966:D3,1312|3b650c7303ff55248b08ba9e058ab28d548afcffe290e902030000909090e923000000909090e9fa020000909090e94c030000909090e973030000909090e9650400009090908b48046a01ff7104ff711053ff31ff71148d542414528b5c24108b4424148b54240cff128b4424148b48088b5104833a0375098b5a043b5c2420746d833a0375058b5a08eb36833a0175058b5a04eb2cbb010000008b7204f7c601000000751cf6c301740583c3027105ff5538ebf68b76043b650c7303ff5524ebdcbe010000008b7c2404f7c7010000007526f7c601000000740583c6027105ff5538ebf68b7f043b650c730aeb05e998010000ff5524ebd2f6c301750bf7c6010000007503ff55383bde7470ff305689dfbb0300000089f8bafc317ab2909090e8762bf0ff50bb030000008b442404bafc317ab2e8622bf0ff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700bc0a8ab28d480cc741fc02000000894104eb05e9fe0000005883c40489018b45008d40e83b45087303ff5520894500c740fc020000008948049090c700d40a8ab28d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c700e80a8ab290e8f609f0ffbb5cbe86b29090e846b7fcff909090e8eeeefcff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000008b54240c89500c894808c7400401000000c700030000008b4c241c8b590cc703030000008b5130ff12eb118b1c248903b801000000eb05b801000000ff742408ff742424ff742424bb040b8ab28b442410909090e8d60200008b4d008d49f43b4d087303ff5520894d00c741fc0200000083c40c5a895104c701010000008b55008d52dc3b55087303ff5520895500c742fc02000000c7420401000000890a89c18d420cc740fc050000008950108b54240489500c5a83c404895008894804c7000b000000c20800b8e4107bb2c2080053ff700cff742410ff7424108b400490e8c6fcffff50ff742414ff7424148b5c24108b44240c9090e8aefcffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c70005000000c208008b48048b45008d40f03b45087303ff5520894500c740fc030000008b51048950088b19895804c7000d000000c20800ff700853ff742410ff742410bb040b8ab28b4004909090e846020000909090e80aa6feff89c389d8909090e89e0300008b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108894104c7010100000083fa01752d8b45008d40ec3b45087303ff5520894500c740fc0100004089088d4808c741fc02000000894104c701030000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000700000083fa0175428b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d000000891183c404c2080083c404c2080053ff74240cff74240cbb040b8ab28b4004e81e030000bb030000009090e87aa8feff89c389d8909090e8920300008b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c70007000000c2080090000000001c050000|@13976,2097151,@2811|11,0,$13966+22 151,0,0 195,0,0 275,0,1 282,0,@5052 290,1,@5053 296,0,1 305,0,@5052 310,1,@5053 341,0,0 362,0,@13967 423,0,@13968 472,0,@13969 478,1,@4953 483,0,@12744 490,1,@12747 498,1,@12914 532,0,0 539,0,0 546,0,3 552,0,0 562,0,@6321 610,0,0 616,0,1 629,0,1 646,0,0 653,0,0 670,0,@13970 682,1,@13971 719,0,0 750,0,0 790,0,5 798,0,@6455 888,0,2 935,0,6 955,0,@13970 966,1,@13972 974,1,@13423 986,1,@13973 1025,0,0 1075,0,1 1111,0,3 1146,0,@5413 1165,0,79992 1174,0,6 1202,0,@13970 1210,1,@13974 1215,0,1 1222,1,@13429 1234,1,@13975 1265,0,1 1274,0,0 1296,0,3 13967:S13|2074797065287329206e6f7420 13968:S11|2920726571756972657320 13969:S18|5479706520636f6e7374727563746f722028 13970:O1|@13966 13971:D3,120|3b650c7303ff5524a801755c53ff7004ff742410ff7424108b5c241c8b008b54240c9090ff1250ff742418ff742418ff7424188b5c24148b4424109090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c000000000074000000|@6329,1048575,@2806|105,0,0 13972:D3,344|3b650c7303ff5524a80175628b088b1153ff7004ff32ff742414ff7424148b5c24208b41048b542410909090ff125950f6c1017407b803000000eb068b018d440001a801740783f8037f08eb5ef640ff10755df6c1017407b803000000eb068b018d440001a801740e83f801eb05e9d50000007e08eb12f640ff10740cb8a8f179b28b5d049090ff13f6c101750a0fb641048d440001eb0289c883f8617546f6c1017411b803000000eb10e935000000e9300000008b018d440001a801740583e8027105ff5538ebf650bb0300000089c8e8e2bff5ff89c13b650c7303ff5524e94bffffff89c88b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742418ff742418ff7424188b5c24148b442410909090e8defeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c000000000054010000|@6329,1048575,@2807|54,0,1 89,0,1 126,0,@4898 165,0,1 203,0,1 210,1,@8870 329,0,0 13973:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2808|60,0,0 13974:D3,120|3b650c7303ff5524a801755c53ff7004ff742410ff7424108b5c241c8b008b54240c9090ff1250ff742418ff742418ff7424188b5c24148b4424109090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c000000000074000000|@6329,1048575,@2809|105,0,0 13975:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2810|60,0,0 13976:S46|545950455f5452454528292e61737369676e54797065732833297479706546726f6d547970655061727365283129 13977:S26|545950455f5452454528292e61737369676e5479706573283329 13978:D3,112|3b650c7303ff55248b4c24048b5910f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bb300f8ab29090e8a6fcefff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e977b4ffff909090000000006c000000|@13877,2097151,@2814|48,0,@12945 55,0,@13979 62,1,@4940 88,0,1 97,1,@13829 13979:S52|2068617320616c7265616479206265656e2075736564206173206120636f6e7374727563746f7220696e20746869732074797065 13980:D3,172|3b650c7303ff5524a801756df6c301756dff7304ff7004ff742424ff742424ff742424ff742424ff742424ff742424ff7424248b1b8b009090e88200000050ff742428ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b4424209090e896ffffff89c18b45008d40f43b4508730feb0ae91e000000e919000000ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c0000000000a8000000|@8004,2097151,@2824|58,1,@13981 157,0,0 13981:D3,524|3b650c7303ff5524b9010000008b5008f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdfff7004ff305351ff7008ff70108b4014e8da0100008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c701010000008b5424305051b8010000008b5a4089daff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc050000008948108b4c240c89480c8b5424108950085b895804c7000b00000050bbd4128ab28b4424049090e89a0cf1ffff74242cff742438ff742430ff74240cff742418ff7424388b5c2448909090e8be02000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c240c83c40c8908837c241401747189c28b45008d40f43b45087303ff5520894500c740fc020000008950048b5c24048918528b54241490ff128b4424288b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118b500c8d410cc740fc020000008948048b4c24088908909090ff12eb2e8b4c242489c28b45008d40f43b45087303ff5520894500c740fc020000008950048b5c24048918528b510c90ff128b44240c8b0c24890889c883c410c21c00900000000008020000|@13996,2097151,@2823|9,0,0 66,1,@13982 100,0,0 111,0,0 151,0,2 168,0,0 237,0,5 243,0,@13983 254,1,@6493 290,1,@13988 413,0,0 13982:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@2815|51,0,6 100,0,0 13983:O1|@13984 13984:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70020138ab28948048060ffbfc3000000002c000000|@13987,3,@2817|28,0,@13985 13985:D3,32|3b650c7303ff55248b52048b58088b4208ff25a8bd520890000000001c000000|@13986,63,@2816|19,0,I27 13986:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129283129 13987:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129 13988:D3,664|3b650c7303ff5524a801756b8b086a016a01f641040175648b510489de8b5d008d5be83b5d087303ff5520895d00c743fc05000000c703bc168ab28b7c2420897b048b7c241c897b088b7c2418897b0c8973108063ffbf56ff7004ff7108ff31ff74242c8b02ba40058ab29090e8caf0ffff8b4d00eb0ae90c020000e9380000008d49f03b4d087303ff5520894d00c741fc030000008b542424895108894104c701050000008d44241089088d442410c7400401000000eb1a89e28b742414893289e2c742040300000053ff7004ff7108ff318b45008d40f43b45087303ff5520894500c740fc020000008b0c24894804c700010000008b54242c50b8010000008b5a4089da9090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40d43b45087303ff5520894500c740fc01000040c700ffffffff8d5008c742fc01000040c70228e07bb28d5a08c743fc03000000895308894304c703050000008d4310c740fc020000008b5424208950048b74241489308b75008d76e03b75087303ff5520897500c746fc07000000c7461801000000c7461401000000894e108b4c2410894e0c895e088946048b442404890656ff7424048b5c2434909090e80e01fdffff742430ff7424086a038b5c24388b44241490e8d60100008b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b54240889108b5424209090ff12ff742434ff742434ff742434ff742434ff742434ff7424348b5c24288b442424909090e89efdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4188908c21800b801000000c218000000000094020000|@6329,2097151,@2822|55,0,@13989 103,0,@13964 110,1,@13965 162,0,2 179,0,0 198,0,1 243,0,0 253,0,0 295,0,2 312,0,0 360,0,-1 376,0,@6817 398,0,2 452,0,0 459,0,0 498,1,@12947 522,1,@13992 649,0,0 13989:D3,152|3b650c7303ff55248b4a108b75008d76f03b75087303ff5520897500c746fc03000000c70668178ab28b7920897e048b4a04894e088066ffbf8b7a108b4d008d49f43b4d087303ff5520894d00c741fc02000000508b4734894104893153ff720cff720868b0178ab289e2528b5c241489c8909090e8becdffff8b4c241883c4148b008901b801000000c204009090900000000094000000|@13963,2097151,@2820|37,0,@13990 101,0,@13991 118,1,@13885 134,0,0 13990:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2818| 13991:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9b1abffff90000000002c000000|@13833,2097151,@2819|24,0,1 35,1,@13829 13992:D3,424|3b650c7303ff552481f8fc6f7ab2745ca801752089c6bffc6f7ab2b911000000d1e93bc9f3a68d7c3f018d7436018d4c0901745f81f848857ab2745ca801752089c6bf48857ab2b913000000d1e93bc9f3a68d7c3f018d7436018d4c0901745d81f8789a7ab2745aa801eb05e9dd000000752c89c6bf789a7ab2b90f000000d1e93bc9f3a68d7c3f018d7436018d4c0901eb0ae9b6000000e9b1000000745c81f8f49a7ab27459a801752c89c6bff49a7ab2b90d000000d1e93bc9eb0ae98c000000e987000000f3a68d7c3f018d7436018d4c0901745981f8f0a97ab27456a801752c89c6bff0a97ab2b90f000000d1e93bc9f3a68d7c3f01eb0ae94e000000e9490000008d7436018d4c0901743f837c240401746781f8fc8b88b27430a801756089c6bffc8b88b2b90d000000eb0ae919000000e914000000d1e93bc9f3a68d7c3f018d7436018d4c090175495389c3b8b0198ab2909090e842f2efffbbd4198ab29090e836f2efff8b4c24108b54240c5b895c240c89542408eb0ae915000000e91000000089442404bb0300000089c8e9fda9ffffb801000000c20c009000000000a4010000|@13995,2097151,@2821|10,0,@5266 23,0,@5266 28,0,8 54,0,@5484 67,0,@5484 72,0,9 98,0,@5589 118,0,@5589 123,0,7 161,0,@5598 174,0,@5598 179,0,6 217,0,@5716 230,0,@5716 235,0,7 280,0,@13367 293,0,@13367 298,0,6 338,0,@13993 346,1,@4940 351,0,@13994 358,1,@4940 396,0,1 403,1,@13829 408,0,0 13993:S25|526562696e64696e67206f722073706563696679696e672022 13994:S12|2220697320696c6c6567616c 13995:S48|54595045434845434b5f50415253455452454528292e7061737332283529636865636b466f724275696c74496e283529 13996:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e73747273283229 13997:O3|@13998,@6713,@4727 13998:D3,340|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d7108c746fc02000000c706ec1b8ab28b7a08897e048066ffbf89316a016a015053528d5c240cb8ec208ab2909090e8b20600008b0424ff742410ff742408ff7004ff742418688c248ab28b44241ca8017520ff7004ff7424248b5c242c8b00909090e8ce0c0000583b650c7303ff5524ebdc8b44241ca80175658b088b11ff700452ff72088b04248d54240c90ff1283f80374678b45008d40f43b45087303ff5520894500c740fc02000000c7400448707ab28b0c2489088b54242c90ff128b4424048b48088b5104833a037516837a0c0375108b5a04c70303000000eb2ce938000000833a0175088b5a08833b037411b8e0298ab28b5d04eb05e90b000000ff138b7304c7060300000083c408583b650c7303ff5524e95affffffb80100000083c428c30000000050010000|@14049,1048575,@2836|34,0,0 50,0,@13999 78,0,@14021 86,1,@14024 109,0,@14032 138,1,@14044 214,0,@5270 256,0,1 281,0,@14045 302,0,1 324,0,0 13999:D3,864|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b017563f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4b04890a8b3574e839b252b8601f8ab289f290ff1289c15889ca90ff128338017558f640100175578b4810f641040175628b11833a07eb05e9270100007518837a04517468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f41f8ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38f7c601000000740583ee027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008971048b770489318b52048b1289c89090ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70064208ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090000000005c030000|@14020,1048575,@2827|30,0,@6514 91,0,@4725 97,0,@14000 157,0,123 166,0,91 199,0,@5642 239,0,@5643 275,0,@5594 295,0,0 302,0,1 309,0,3 315,0,0 354,0,0 375,0,@5592 394,0,@14006 416,0,0 423,0,0 430,0,1 436,0,0 466,0,@6514 570,0,123 579,0,91 612,0,@5642 650,0,@5643 686,0,@5594 706,0,0 713,0,1 720,0,3 726,0,0 765,0,0 786,0,@5592 807,0,@14013 829,0,0 836,0,0 843,0,1 849,0,0 14000:O4|0,@14001,3,1 14001:O1|@14002 14002:D3,28|3b650c7303ff55248b0d8ce839b289caff2290900000000018000000|@14005,1048575,@2826|10,0,@4728 14003:O1|@14004 14004:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@2825|1,0,@5227 14005:S19|7072696e742d74797065436f6e737472536574 14006:O5|0,0,0,@14008,@14007 14007:O2|@14011,0 14008:O2|@14009,0 14009:O2|0,@14010 14010:O5|@6454,1679,1679,0,0 14011:O2|3,@14012 14012:S7|4e6f745365656e 14013:O5|0,0,0,@14015,@14014 14014:O2|@14018,0 14015:O2|@14016,0 14016:O2|0,@14017 14017:O5|@6454,1678,1678,0,0 14018:O2|3,@14019 14019:S9|50726f636573736564 14020:S11|7072696e742d7374617465 14021:O1|@14022 14022:D3,100|8b4804833903751c8b5304833a0375148b71043b72047406b801000000c3b803000000c3833901752d8b5304833a0175258b710cf7c6010000007509f6420c017503ff55383b720c7406b801000000c3b803000000c3b801000000c30000000060000000|@14023,31,@2828|25,0,0 31,0,1 75,0,0 81,0,1 87,0,0 14023:S26|5554494c49544945535f28292e6d61705461626c652831292d45 14024:D3,116|8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c70218228ab2894a048942088062ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706b8238ab2894604894e088066ffbf8913897304b801000000c3900000000070000000|@14031,31,@2832|26,0,0 42,0,@14025 82,0,@14029 102,0,0 14025:D3,172|3b650c7303ff55248b4a048b0989cb5250ff3051f6c301752f8b038b4c240cff73048b5c24088b008b510890ff1283f801740ab80300000083c404eb105b3b650c7303ff5524ebccb80100000083f80174168b44240cff7424048b58088b442404e85a000000eb085883c4046a016a018b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c4085889018b04248b400483c4048908b801000000c3909000000000a8000000|@14028,1048575,@2830|52,0,1 73,0,0 98,1,@14026 157,0,0 14026:D3,120|3b650c7303ff5524a801755b8b08ff700451538b5c24108b018b1424ff1283f801740783c40858c20400ff7424108b5c24048b44240c909090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2404890883c40cc20400b801000000c20400900000000074000000|@14027,1048575,@2829|104,0,0 14027:S35|5554494c49544945535f28292e6d61705461626c6528312964656c6574652832292829 14028:S32|5554494c49544945535f28292e6d61705461626c65283129656e746572283129 14029:D3,116|3b650c7303ff55248b4a088b095052f6c101754f8b018b1424ff7004ff71048b5c240c8b0889c88b4a0489caff1283f80174228b45008d40f83b45087303ff5520894500c740fc010000008b4c2404890883c410c35983c4043b650c7303ff5524ebacb80100000083c408c30000000070000000|@14030,1048575,@2831|100,0,0 14030:S33|5554494c49544945535f28292e6d61705461626c652831296c6f6f6b7570283129 14031:S24|5554494c49544945535f28292e6d61705461626c65283129 14032:D3,512|3b650c7303ff552450528b4a1089ca90ff1283f80175568b4424048b480483390175438b14248b410c8b5a0c89da9090ff1283f8017507b803000000eb05b8050000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb09b9a0268ab2eb028b088339037518833903740cb8ac268ab28b5d049090ff138b410483c408c38b04248b50048b45008d40f43b45087303ff5520894500c740fc02000000c74004e4707ab28b5c2404891851ff128b0424833801740bb8d8268ab28b5d0490ff138b4804ba05000000f6c101756383fa037507b803000000eb5c8b018b5804ff7104f6c301755b8b038b480c833905740f8b730489f33b650c7303ff5524ebe2833905740cb804278ab28b5d049090ff138b742408ff7304526830278ab289f38b41048b56089090ff1283f8037518eb0ae954000000e93c000000b803000000eb30e92500000083f8017507b801000000eb038b04248b5c240489c283c4083b650c7303ff5524e976ffffff89d06a016a0183c408eb03ff710489c2593b650c7303ff5524e93fffffff89d08b4c240483f80174238b55008d52f43b55087303ff5520895500c742fc02000000894204c70203000000eb038b142489c38b45008d40f43b45087303ff5520894500c740fc020000008950048b5424088910538b51049090ff125883c40cc39000000000fc010000|@14043,1048575,@2834|56,0,1 63,0,2 96,0,1 103,0,@14033 122,0,@14034 173,0,@5280 195,0,@14036 209,0,2 224,0,1 274,0,@14038 294,0,@14040 328,0,1 345,0,0 446,0,1 14033:O2|1,1 14034:O4|101,@6569,0,@14035 14035:O5|@6454,1687,0,1687,0 14036:O4|101,@6569,0,@14037 14037:O5|@6454,1688,0,1688,0 14038:O4|101,@6569,0,@14039 14039:O5|@6454,93,0,93,0 14040:O1|@14041 14041:D3,16|b805000000c39090000000000c000000|@14042,1,@2833|1,0,2 14042:S57|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229636f6e737472457128332965712d283129 14043:S54|545950455f5452454528292e636f6d707574654461746174797065457175616c697469657328322967656e457175616c697479283129 14044:D3,492|3b650c7303ff55248b0851508b410889da909090ff12a80175668b08833901740cb8d8268ab28b5d049090ff138b55008d52f43b55087303ff5520895500c742fc020000008b5904895a048b342489328b7424048b7e088b4704833805750ab808377bb28b5d04ff1383380175238b5808833b0375138b73048b3683fe01eb05e9ef0000007414eb59837b04017558eb0a8b58048b1b83fb017551f6410401740cb81c777bb28b5d049090ff138b49048b098b098b49088b5904833b05750ab808377bb28b5d04ff13833b01752b8b7308833e03751b8b46048b0083f8017523eb59e91c000000e917000000e912000000837e04017469eb0a8b73048b3683fe01746289d0a80175618b088b198b73088b7e04833f037511837f0c03750b8b4f04c70103000000eb2d833f0175088b4f0883390374178b4804eb05e958000000b8e0298ab28b5d04909090ff138b5904c703030000008b40043b650c7314eb0fe933000000e92e000000e929000000ff5524eb918b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008b042489028b44240c83c4048b0c248b5d008d5be83b5d087303ff5520895d00c743fc02000000895304c7030100000089c28d430cc740fc020000008958048b4908890883c4045983c40451ff2290909000000000e8010000|@14048,1048575,@2835|34,0,@14036 96,0,@6539 162,0,@6704 192,0,@6539 291,0,1 321,0,@14045 338,0,1 399,0,0 447,0,0 14045:O4|@4608,@5398,@14047,@14046 14046:O5|@6542,352,0,352,0 14047:S41|736574457175616c6974793a2063616e27742073657420657175616c69747920617474726962757465 14048:S43|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229283129 14049:S40|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229 14050:O1|@14051 14051:D3,112|8b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b8302b8ab2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338037506b8a02b8ab2c3f6c101740783f9037c0eeb06f641ff107506b80c2c8ab2c3b8d8327bb2c390000000006c000000|@8466,3,@2837|22,0,@6514 33,0,@14052 57,0,@6514 68,0,@14059 92,0,@14066 98,0,@6514 14052:O5|0,0,0,@14054,@14053 14053:O2|@14057,0 14054:O2|@14055,0 14055:O2|0,@14056 14056:O5|@6454,1577,1577,0,0 14057:O2|3,@14058 14058:S5|4d61796265 14059:O5|0,0,0,@14061,@14060 14060:O2|@14064,0 14061:O2|@14062,0 14062:O2|0,@14063 14063:O5|@6454,1576,1576,0,0 14064:O2|3,@14065 14065:S2|4e6f 14066:O5|0,0,0,@14068,@14067 14067:O2|@14071,0 14068:O2|@14069,0 14069:O2|0,@14070 14070:O5|@6454,1575,1575,0,0 14071:O2|3,@14072 14072:S3|596573 14073:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b48085889caff22900000000028000000|@14074,1048575,@2838| 14074:S80|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657256616c466e283129 14075:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@2839| 14076:D3,228|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c700682e8ab28948048060ffbf52518b5a0c89da9090ff12588b008b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008b142489c38d4108c740fc02000000c700f82e8ab28948048060ffbf53518b720889f29090ff12588b008b4c24048b490450b8010000008b5124909090ff1283f80175058b0424eb0a89c38b0424e81601000083f801750883c4045883c404c389c383c4045883c404e95301000090909000000000e0000000|@14082,1048575,@2844|34,0,0 52,0,@14077 103,0,0 124,0,@14079 158,0,0 186,1,@14080 213,1,@14081 14077:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2840|42,0,0 14078:S57|54595045434845434b5f50415253455452454528292e7061737332283529737472696e67734f665365617263684c6973742834295f2d283129 14079:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2841|42,0,0 14080:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2842| 14081:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2843| 14082:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d616c6c56616c4e616d6573283129 14083:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b480c5889caff22900000000028000000|@14084,1048575,@2845| 14084:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657254797065466e283129 14085:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2846| 14086:D3,136|3b650c7303ff5524a801756b8b088b51088b5a04833b0575108b7004b808377bb28b5d04909090ff13833b0175148b7308833e0375078b7e048b3feb0c8b7e04eb078b73048b3689f7578b700489f09090e8aaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000084000000|@6329,63,@2847|29,0,@6539 120,0,0 14087:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629 14088:O2|@5232,@5715 14089:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@2849|60,0,0 14090:S10|417267756d656e74733a 14091:D3,420|3b650c7303ff55248b4c240889de89c7ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e80a92ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70107000000f6c101740d89c2b8ecd57ab28b5d0490ff135189c389f0ba68bf88b29090e8628cfeff89c3b801000000e8d6fcf0ff5350ff7424106a01bb214e00008b442420ba94477bb290e87e14f1ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c20c0000000000a0010000|@14092,2097151,@2850|70,1,@13830 103,0,3 115,0,@6321 131,0,@13447 138,1,@13449 145,0,0 150,1,@6511 163,0,10000 172,0,@6596 178,1,@6597 209,0,0 230,0,@5592 249,0,@6362 268,0,@5592 319,0,@5592 369,0,0 376,0,0 383,0,3 389,0,0 400,0,@6321 14092:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283529 14093:S5|756e696679 14094:O2|@14095,@6596 14095:D3,68|8b45008d40e83b45087303ff5520894500c740fc05000000c700f8348ab28b4c24088948048b52048950088b54240489500c8958108060ffbfc208000000000040000000|@14110,15,@2856|26,0,@14096 14096:D3,992|3b650c7303ff5524833803757652ff7010ff7008ff700cff70048b5a0cb8ec388ab2909090e872d6efff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b44241051ff742408ff70088b58108b44240c90e88e0300008b4c241481790c84348ab2eb05e972010000742ef6410c0175218b710cbf84348ab2b913000000d1e93bc9f3a68d7c3f018d7436018d4c09017407b9c83e8ab2eb05b92ce17cb28b55008d52f43b55087303ff5520895500c742fc02000000894a04c70207000000f6c201740e89c1b8ecd57ab28b5d049090ff138b4c24145052ff742418ff71088b59048b44241ce8fa0200008b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104d43e8ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c41489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c352ff700cff7008ff70048b5a0cb8ec388ab290e88ad4efff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389cbb80100000090e8baf8f0ff8b4c240c5350ff71106a01bbd10700008b4424108b5108909090ff1289c3b801000000e892f8f0ff8b4c24105350ff71046a01bbd10700008b4424188b5108909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000008b542410895104c70107000000f6c101740d89c2b8ecd57ab28b5d0490ff138b55008d52ac3b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc02000000895004c7009c9a7ab28d480cc741fc02000000894104c701f83e8ab28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c41089018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c3909000000000dc030000|@14109,1048575,@2855|30,0,@14097 38,1,@4940 71,0,3 81,0,@6321 114,1,@14098 125,0,@14093 148,0,@14093 153,0,9 178,0,@14104 185,0,@7768 218,0,3 230,0,@6321 262,1,@14098 293,0,@14105 314,0,@5592 363,0,@5592 412,0,@5592 465,0,0 472,0,0 479,0,3 485,0,0 496,0,@6321 520,0,@14097 526,1,@4940 559,0,3 569,0,@6321 584,0,0 590,1,@6511 606,0,1000 625,0,0 630,1,@6511 646,0,1000 695,0,3 707,0,@6321 744,0,0 765,0,@5592 799,0,@5592 818,0,@14108 839,0,@5592 888,0,@5592 941,0,0 948,0,0 955,0,3 961,0,0 972,0,@6321 14097:S6|43616e277420 14098:D3,60|3b650c7303ff55248b4c24088b51088b72088b7c24048b560889542408897c24048b142489042453518b5e048b0652e91c0000000000000038000000|@14103,1048575,@2854|48,1,@14099 14099:D3,1032|3b650c7303ff552489c6b8010000009090e8a2f6f0ff535650ff7424146a01bbd10700008b4424208b542424ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089016a016a01518d5c24048b44240c90e81ed9f0ff8b4424186a016a0189e38b0889c890e80ad9f0ff8b4424103b442404743ca8017542f644240401753b8b542404f6c2017407b903000000eb068b0a8d4c090183c10889c689d7d1e93bc9f3a68d7c3f018d7436018d4c0901750ab80100000083c408eb718b45008d40f43b45087303ff5520894500c740fc020000008b4c2418894804c70001000000a801740e89c2b8ecd57ab28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc020000008b5c2414895804c70007000000eb05e9ca000000a801740d89c3b8ecd57ab28b5d0490ff138b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc0500000089581089500cc7400801000000c7400401000000c70001000000a801740f89c2b8ecd57ab28b5d04909090ff138b55008d52d03b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc020000008950049090c7009c9a7ab28d500cc742fc02000000894204c70224287bb28d420cc740fc020000008950049090c7009c9a7ab283c408817c242848c052087429f64424280175298b742428bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b901000000eb718b4d008d49f43b4d087303ff5520894d00c741fc020000008b542410895104c70101000000f6c101740f89c2b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a50528b5c2430b8c8a57cb2e89ecfefffbbb0a57cb2eb05e9c9000000909090e88acfefff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc050000008941105889410cc7410801000000c7410401000000c70101000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40e83b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab2eb015083f90175058b0424eb0c89cb8b04249090e88600000083f80175068b442404eb0d89c38b4424049090e8c600000089c18b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1383c418c21400900000000004040000|@14102,1048575,@2853|11,0,0 18,1,@6511 32,0,1000 73,0,0 94,1,@6462 114,1,@6462 149,0,1 189,0,0 231,0,0 242,0,@6321 280,0,0 305,0,3 323,0,@6321 360,0,0 385,0,0 392,0,0 398,0,0 409,0,@6321 448,0,0 471,0,@5592 490,0,@6503 511,0,@5592 522,0,I48 540,0,I48 545,0,4 570,0,0 609,0,0 621,0,@6321 660,0,0 673,0,@7410 678,1,@4940 683,0,@7408 698,1,@4940 731,0,3 741,0,@6321 780,0,0 806,0,0 813,0,0 819,0,0 829,0,@6321 868,0,0 889,0,@5592 914,1,@14100 938,1,@14101 974,0,0 981,0,0 988,0,3 994,0,0 1005,0,@6321 14100:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2851| 14101:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2852| 14102:S87|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e7374722833297072696e745769746844657363283329 14103:S71|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e737472283329 14104:S2|746f 14105:O2|@5592,@14106 14106:O2|@14107,0 14107:O2|3,@6788 14108:O2|3,@14104 14109:S50|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129 14110:S36|545950455f5452454528292e756e69667954797065734572726f725265706f7274283429 14111:O2|3,@14112 14112:S7|526561736f6e3a 14113:O2|3,@14114 14114:S46|417267756d656e7473206f6620616e64616c736f206d7573742068617665207479706520626f6f6c2a626f6f6c2e 14115:D3,552|3b650c7303ff55248b08bae23f8ab28d548afcffe290e9f3000000909090e9eb000000909090e9f4000000909090e9db000000909090e9d3000000909090e9ff000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e9bf000000909090e9bd000000909090e973000000909090e9e6000000909090e922010000909090e95b000000909090e953000000909090e94b000000909090e908010000909090e93b000000909090e900010000909090e9fe000000909090e923000000909090e926010000909090e913000000909090e90b000000909090e9030000009090908338177406b801000000c3b803000000c38b4804ff71048b019090e80e01000083f801740658e9c7feffffb80100000083c404c38b4008e9b6feffffb803000000c38b400cb903000000a801752a8b1083f901740dff70048b420ce892feffffeb098b4804b8010000005189c1583b650c7303ff5524ebd289c8c3837808017506b803000000c38b4008b903000000a801752983f901740eff70048b009090e84efeffffeb098b4804b8010000005189c1583b650c7303ff5524ebd389c8c3b803000000c38b4004e925feffffb803000000c38b4004b903000000a801752983f901740eff70048b009090e802feffffeb098b4804b8010000005189c1583b650c7303ff5524ebd389c8c3b803000000c3900000000024020000|@14118,2097151,@2858|11,0,$14115+22 276,0,0 282,0,1 298,1,@14116 314,0,0 331,0,1 340,0,1 372,0,0 400,0,1 409,0,1 440,0,0 462,0,1 476,0,1 485,0,1 516,0,0 538,0,1 14116:D3,184|3b650c7303ff552483382d75088b4004e9ebffffff83380b75088b4008e9deffffff83381d75528b40048b40048b00837804017406f640040175588b400c909090e89ec7f0ff833805754d8b4008909090e88ec7f0ff83380b75318b400c8b48088b5104833a03751c817a0404e439b2740cbb01000000eb24e92b000000bb03000000eb18bb01000000eb11bb01000000eb0ae90b000000bb0100000083f30289d8c3b801000000c3b801000000c39000000000b4000000|@14117,2097151,@2857|66,1,@6447 82,1,@6447 108,0,@4623 115,0,0 127,0,1 134,0,0 141,0,0 153,0,0 164,0,0 170,0,0 14117:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352969734e6f6e526566436f6e7374727563746f72283129 14118:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296e6f6e457870616e73697665283129 14119:S9|46756e6374696f6e3a 14120:S9|417267756d656e743a 14121:O2|@5592,@14122 14122:O2|@14123,0 14123:O5|0,0,0,0,@14124 14124:O2|@14111,@14125 14125:O2|@6812,@14126 14126:O2|@14127,0 14127:O2|3,@14128 14128:S49|56616c7565206265696e67206170706c69656420646f6573206e6f74206861766520612066756e6374696f6e2074797065 14129:O2|3,@14130 14130:S35|54797065206572726f7220696e2066756e6374696f6e206170706c69636174696f6e2e 14131:D3,64|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722c89de8b5a0456e91d00000090000000003c000000|@14187,2097151,@2881|51,1,@14132 14132:D3,452|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c7018c468ab28b5424288951048b5c24248959088061ffbf6a016a016a018b7808ff700cff30ff70048d5c240c89c89090e8f2f6fcff8b442438a801740583c0027105ff5538ebf65750506a016890478ab26a01ff742458ff742450ff742450ff7424608b5c24388b44242890e87a0300008b4c24388b55008d52f03b55087303ff5520895500c742fc03000000c702a46f8ab28b5918895a048b74241c8972088062ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706ec6f8ab2894e048b7c2414897e088066ffbf8b7d008d7fc43b7d087303ff5520897d00c747fc0e0000008b5934895f348b5930895f308b592c895f2c8b5928895f288977248b71208977208b711c89771c8957188b51148957148b51108957108b510c89570c8b51088957088b51048957048b19891f5057ff74244cff742418ff742458ff742444ff742444ff7424448b5c24448b4424208b54245490ff128b4c241489018b4c24088b1424891189c18b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7000500000083c424c2280090909000000000c0010000|@14186,2097151,@2880|34,0,@14133 82,1,@13015 110,0,@14136 142,1,@14139 176,0,@14181 223,0,@14182 431,0,2 14133:D3,112|3b650c7303ff55248b4c24048b5910f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bb10478ab29090e8c6c4efff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e9977cffff909090000000006c000000|@14135,2097151,@2859|48,0,@12945 55,0,@14134 62,1,@4940 88,0,1 97,1,@13829 14134:S37|2068617320616c7265616479206265656e20626f756e6420696e2074686973206d61746368 14135:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d61746368547265652832296d657373466e283329 14136:O1|@14137 14137:D3,240|8b4d008d49a03b4d087303ff5520894d00c741fc01000040c701ffffffff8d5108c742fc01000040c70228e07bb28d5a08c743fc03000000895308894b04c703050000008d4b10c741fc01000040c701010000008d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc03000000897708894f0489178d4f10c741fc0100000089398d5108c742fc01000040c702010000008d7208c746fc0100000089168b50088b7804ff308b45008d40e03b45087303ff5520894500c740fc0700000089701889481489501089780c895808c7400403000000598908c300000000ec000000|@14138,63,@2860|26,0,-1 42,0,@6817 64,0,2 80,0,0 96,0,0 112,0,0 158,0,0 224,0,1 14138:S28|56414c55455f4f505328292e6d616b654c6f63616c56283129283129 14139:D3,4916|8d7c24803b7d0c7303ff55288b08bada488ab28d548afcffe290e9f3000000909090e9eb000000909090e9eb000000909090e9db000000909090e9d3000000909090e9c7040000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e916080000909090e98a0b0000909090e9920c0000909090e9d90d0000909090e9ee0e0000909090e95b000000909090e953000000909090e94b000000909090e92f110000909090e93b000000909090e933000000909090e972110000909090e923000000909090e9ef110000909090e913000000909090e90b000000909090e9df110000909090b8e4107bb2c220008b48048b11833a1d75708b72048b7c24088b5610538b5f24891a8b54240c8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b7a34897b048b7a18893bff760c50ff74241c68085c8ab250ff7108ff7110ff7104ff7608ff7604ff760cff36ff34248d4c242451b84c5c8ab2909090e8327cffffeb05e9c1000000837804017406f640040175548b4808833907751383790411750d50bb01000000e8e288ffffeb2a506a016a0189e252bb605c8ab28b480c89c8909090e802f5f0ff8b442404909090e8628dffff5883c4048b4c240c5a89118b4c240c8901eb5c8138b0cf87b2744df6000175208b30bfb0cf87b2b91f000000d1e93bc9f3a68d7c3f018d7436018d4c09017428bb8c5c8ab28b0424909090e89ec0efffff74241cff74240850bb030000008b44245090e87a78ffffb8e4107bb2eb3ee939000000536a016a016a016a0150ff7108ff7110ff710450ff74240868ac5c8ab2bb030000008b44244090e84278ffffb8e4107bb26a016a016a016a0150ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b5c24548b44243490e83efdffff508b4424049090e85ebef0ff833805756cff70088b5c24048b4004ba84287bb2909090e8fa2cf1ffa80175718b30ff74244c6884348ab28b5c24548b442458ba94348ab2909090e8d2e8ffff89c189f089caff128b4c245089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130eb05e97d000000ff7134ff7138ff713cff71408b59048b01e8ce78ffff5689c3eb05e95a0000008b44242cba68bf88b2e85273feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54242489500c5a895008894804c700030000008b4c24508b510cc702030000008b51309090ff1258eb6b8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d0000008d4810c741fc030000008941088b1c24895904c701050000005089cb89d0ba84287bb2909090e8be2bf1ffa8017571eb05e9d10000008b30ff74244c6884348ab28b5c24548b442458ba94348ab2e892e7ffff89c189f089caff128b4c245089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e89277ffff5689c3eb05e95c0000008b44242cba68bf88b2e81672feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54242489500c5a895008894804c700030000008b4c24508b510cc702030000008b51309090ff12eb05b8010000005883c4205983c4188901c2200050ff700cff7008ff7004ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b44242490e8befaffff8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703e45c8ab28b4c2420894b048b54240c8953088b74241889730c8063ffbf50518b442408ba40058ab290e802b7ffff5089c38b442404ba84287bb2909090e8462af1ffa8017571ff30ff742408ff742430ff7424308b5c241cb8a05d8ab2e816e4ffff89c3b801000000e87ae1f0ff5350ff7424306a01bb214e00008b442414ba94477bb290e822f9f0ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9860200008948049090c7009c9a7ab28d480cc741fc02000000894104c701b05d8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c6ff74242c6884348ab28b5c24348b442438ba94348ab2e852e5ffff5689c18b44240889ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701d05d8ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c242889c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8ea73ffff5689c38b442418ba68bf88b2909090e8726efeff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5a895008894804c700030000008b4c24288b510cc702030000008b51309090ff125883c414c220008b48046a016a015350ff7108ff710cff7104ff31ff71108d5c241c8b44240490e842c1f0ff837c2438017407b890cf87b2eb63817c241c48c052087429f644241c0175418b74241cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901751f8b44242c8b48188b44240489caff1283f8017507b890cf87b2eb5b8b00eb578b44242c8b4d008d49f43b4d08730aeb05e941000000ff5520894d00c741fc020000008b50348951048b58188919ff74240cff742418ff74243c68085e8ab2ff7424148d7424045689cbb84c5c8ab2e84674ffff83c4108b4c242c5a8b5924891a837804017406f6400401755d837c243c017423ff742410ff74240c684c5e8ab2bb030000008b44243c90e80e71ffffb8e4107bb2eb5d8b5424048902f640040175078b50048b32eb5e508b500c89d0909090e84ab7f0ff83380575268b4d008d49f83b4d08730aeb05e9af000000ff5520894d00c741fc010000008b40048901eb05b90100000083f901740cb801000000eb0ae9f2010000b80300000083f00283f00289c6eb015083fe0174488b04248b4808833907751583790411750fbb01000000909090e84a80ffffeb4b6a016a0189e252bb885e8ab28b480c89c8e86eecf0ff8b442404909090e8ce84ffff5883c404eb23ff742414ff74241068b45e8ab2bb030000008b442440909090e82a70ffffb8e4107bb283c404eb768b45008d40f43b45087303ff5520894500c740fc020000008b542408895004c700010000008b74243050b8010000008b56409090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc02000000eb05e9f20000008941045889018b45008d40f83b45087303ff5520894500c740fc01000040c700ec7d7ab2f64424400175148b5c24408b13f643ff107402f7da8d541201eb048b5424408d14d5f9ffffff8b5d008d5be03b5d087303ff5520895d00c743fc03000000895308894304c7030d0000008d4310c740fc030000008948088958048b0c2489088b5424389090ff1250ff74240c8b5c24388b4424089090e892c2fcffff742434ff7424106a018b5c24348b44241090e85ac3ffff8b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b54240489108b5424189090ff128b4424088b0c2489088b410c83c40483c40c5983c4108901c22000ff7008ff7004ff742418ff742418ff742418ff74241853ff74243cff74243cff74243cff74243cbbf05e8ab28b400c90e8e2090000909090e8465afeff89c389d8909090e86e08feff8b4d008d49f03b4d087303ff5520894d00c741fc030000008b1424895108894104c7010100000083fa01752d8b45008d40ec3b45087303ff5520894500c740fc0100004089088d4808c741fc02000000894104c701030000008b45008d40f03b45087303ff5520894500c740fc03000000894808895804c7000700000083fa01753c8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d000000891183c404598901c220005350ff700cff7008ff7424306a03ff742430ff742430ff742430ff742430ff742430ff7424308b480489c890e89ef2ffff50ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24308b4424249090e86ef2ffff89c38b0424ba84287bb290e84222f1ffa80175718b30ff7424206884348ab28b5c24288b44242cba94348ab2909090e81adeffff89c189f089caff128b4c242489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e81a6effff5689c38b442410eb05e958000000ba68bf88b2e89e68feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240c89500c5a895008894804c700030000008b4c24248b510cc702030000008b51309090ff12eb05b8010000005883c410c220008b4d008d49d43b4d087303ff5520894d00c741fc0a000000c701ec608ab28959048b5424208951088b5c241c89590c8b7424188971108b7c24148979148b5424108951188b5c240c89591c8b7424088971208b7c24048979248061ffbf8b55008d52d83b55087303ff5520895500c742fc03000000c7420894618ab2c7420478bf88b2890a8d4a10c741fc050000008941108b580c89590cc7410859000000c7410498628ab2c701a4628ab2ff700452ff742418ff74241889cb8b4008e8d20a00008338017507b8e4107bb2eb498b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc05000000c74010946d7ab2c7400c28af7ab2c7400844af7ab2894804c7000b000000598901c2200050ff7004ff700cbb030000008b481089c8909090e8ea7affff909090e86eb1f0ff833805756cff7008bbb8727ab28b4004ba84287bb29090e80a20f1ffa80175718b30ff74241c6884348ab28b5c24248b442428ba94348ab2909090e8e2dbffff89c189f089caff128b4c242089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130eb05e97d000000ff7134ff7138ff713cff71408b59048b01e8de6bffff5689c3eb05e95a0000008b442410ba68bf88b2e86266feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240889500c5a895008894804c700030000008b4c24208b510cc702030000008b51309090ff1258eb6b8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701ec7d7ab289c28d4108c740fc03000000c74008f1700200894804c7000d0000008d4810c741fc03000000894108c74104b8727ab2c701050000005089cb89d0ba84287bb29090e8ce1ef1ffa8017571eb05e9d10000008b30ff74241c6884348ab28b5c24248b442428ba94348ab2e8a2daffff89c189f089caff128b4c242089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e8a26affff5689c3eb05e95c0000008b442410ba68bf88b2e82665feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240889500c5a895008894804c700030000008b4c24208b510cc702030000008b51309090ff12eb05b8010000005883c4045983c4048901c220008b4c24208b54241c8b7424188b7c2414538b5c2414ff70048b442414508b442414508b442414894c24308954242c89742428897c2424895c24208b4c2404894c241c5983c404894c24108944240c8b5c24045883c404e9a7edffffff7008ff742414ff742414ff742414ff74241453ff742438ff742438ff742438ff742438bbf05e8ab28b4004e84e130000bb030000009090e87657feff89c389d8909090e8bed6ffff8b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c70007000000598901c22000b83cbe7ab2c220008b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d000000c22000900000000030130000|@14180,2097151,@2875|15,0,$14139+26 275,0,@6455 356,0,@14140 390,0,@14141 398,1,@13835 437,0,0 442,1,@13857 457,0,@14142 470,1,@6564 482,1,@13871 507,0,@13163 521,0,@13163 526,0,15 551,0,@14144 562,1,@4940 576,0,1 586,1,@13829 591,0,@6455 627,0,@14145 632,0,1 642,1,@13829 647,0,@6455 714,1,@6447 734,0,@6509 742,1,@6714 757,0,@14093 770,0,@14094 778,1,@14095 854,1,@13830 873,0,@13447 878,1,@13449 934,0,1 947,0,1 987,0,@5413 1006,0,79992 1015,0,6 1040,0,2 1050,0,@6509 1058,1,@6714 1080,0,@14093 1093,0,@14094 1098,1,@14095 1170,1,@13830 1189,0,@13447 1194,1,@13449 1250,0,1 1263,0,1 1277,0,0 1372,0,@14146 1408,0,@13964 1414,1,@13965 1426,0,@6509 1434,1,@6714 1461,0,@14148 1466,1,@14091 1473,0,0 1478,1,@6511 1491,0,10000 1500,0,@6596 1506,1,@6597 1537,0,0 1567,0,@5592 1586,0,@14149 1606,0,0 1613,0,0 1620,0,0 1626,0,0 1637,0,@6321 1656,0,@14093 1669,0,@14094 1674,1,@14095 1717,0,0 1738,0,@6812 1757,0,@14111 1777,0,0 1784,0,0 1791,0,0 1797,0,0 1808,0,@6321 1844,0,0 1867,0,@5592 1916,0,@5592 1968,0,@5592 1987,0,@14151 2007,0,0 2014,0,1 2021,0,3 2027,0,0 2038,0,@6321 2106,1,@13830 2118,0,@13447 2126,1,@13449 2182,0,1 2195,0,1 2246,1,@6462 2258,0,@13162 2268,0,I48 2286,0,I48 2291,0,4 2336,0,@13162 2405,0,@14153 2421,0,@14141 2426,1,@13835 2471,0,@14154 2476,0,1 2486,1,@13829 2491,0,@6455 2526,1,@6447 2574,0,0 2584,0,0 2596,0,1 2634,0,0 2642,1,@13857 2656,0,@14155 2666,1,@6564 2678,1,@13871 2697,0,@14157 2702,0,1 2714,1,@13829 2719,0,@6455 2761,0,0 2771,0,0 2811,0,2 2828,0,0 2883,0,@5413 2957,0,6 3006,1,@12947 3030,1,@13992 3145,0,@14158 3154,1,@14159 3162,1,@13423 3174,1,@13306 3213,0,0 3263,0,1 3299,0,3 3334,0,@5413 3353,0,79992 3362,0,6 3480,0,@6509 3486,1,@6714 3501,0,@14093 3514,0,@14094 3522,1,@14095 3594,1,@13830 3613,0,@13447 3618,1,@13449 3674,0,1 3687,0,1 3701,0,0 3738,0,@14161 3832,0,@14163 3839,0,@13448 3867,0,44 3874,0,@14168 3880,0,@14169 3902,1,@14170 3912,0,@6455 3945,0,0 3964,0,@5229 3971,0,@5786 3978,0,@5788 3987,0,5 4005,0,1 4018,1,@13857 4026,1,@6447 4039,0,@5306 4047,0,@6509 4054,1,@6714 4069,0,@14093 4082,0,@14094 4090,1,@14095 4166,1,@13830 4185,0,@13447 4190,1,@13449 4246,0,1 4259,0,1 4299,0,@5413 4318,0,79992 4327,0,6 4347,0,@5306 4353,0,2 4363,0,@6509 4370,1,@6714 4392,0,@14093 4405,0,@14094 4410,1,@14095 4482,1,@13830 4501,0,@13447 4506,1,@13449 4562,0,1 4575,0,1 4589,0,0 4734,0,@14158 4742,1,@14179 4747,0,1 4754,1,@13429 4766,1,@14089 4797,0,1 4806,0,0 4828,0,3 4839,0,@6000 4872,0,@5413 4891,0,79992 4900,0,6 14140:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e95967ffff90000000002c000000|@13833,2097151,@2861|24,0,1 35,1,@13829 14141:S11|436f6e7374727563746f72 14142:O1|@14143 14143:D3,16|b801000000c39090000000000c000000|@6563,1,@2862|1,0,0 14144:S21|206973206e6f74206120636f6e7374727563746f72 14145:S46|436f6e7374727563746f7220696e2061207061747465726e20776173206e6f7420616e206964656e746966696572 14146:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7934897e048b7920893e53ff7208ff7204685c5d8ab289e15189c389f0e8ca87ffff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@2864|54,0,@14147 66,1,@13885 82,0,0 14147:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e90566ffff90000000002c000000|@13833,2097151,@2863|24,0,1 35,1,@13829 14148:S6|56616c75653a 14149:O2|3,@14150 14150:S11|436f6e73747261696e743a 14151:O2|3,@14152 14152:S33|54797065206d69736d6174636820696e207479706520636f6e73747261696e742e 14153:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e95965ffff90000000002c000000|@13833,2097151,@2865|24,0,1 35,1,@13829 14154:S49|4964656e746966696572206265666f72652060617327206d757374206e6f74206265206120636f6e7374727563746f722e 14155:O1|@14156 14156:D3,16|b801000000c39090000000000c000000|@6563,1,@2866|1,0,0 14157:S51|436f6e7374727563746f72206d757374206265206170706c69656420746f20616e20617267756d656e74207061747465726e2e 14158:O1|@14139 14159:D3,396|3b650c7303ff5524a801755c8b0853ff7004ff31ff7104ff742420ff742420ff742420ff742420ff742444ff742444ff742444ff7424448b5c24448b410c8b54242c9090ff125989015950f6c1017407b803000000eb068b018d440001a801740c83f8037f0deb5be90f010000f640ff107566f6c1017407b803000000eb068b018d440001a801740783f8017e08eb11f640ff10740bb8a8f179b28b5d0490ff13f6c101750a0fb641048d440001eb0289c883f861754af6c101740cb803000000eb0be9390000008b018d440001a801740583e802710ceb05e923000000ff5538ebef50bb0300000089c89090e8666cf5ff89c13b650c7303ff5524e94affffff89c88b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c242c8b442428909090e8aafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22400b801000000c224000000000088010000|@14160,1048575,@2867|81,0,1 121,0,1 151,0,@4898 189,0,1 229,0,1 238,1,@8870 381,0,0 14160:S74|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e2836296d61704c6162656c73283129 14161:D3,60|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff7220ff722489de8b5a04baf05e8ab256ff22900000000038000000|@14162,1048575,@2868|44,0,@14158 14162:S79|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e28362970726f63657373456c656d656e74283129 14163:O1|@14164 14164:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700e0618ab28948048060ffbfc3000000002c000000|@14167,3,@2870|28,0,@14165 14165:D3,48|3b650c7303ff55248b4a048b58088b3424891c24ff31ff71048b58048b3889f856e98ed0ffff9090000000002c000000|@14166,2097151,@2869|34,1,@14091 14166:S50|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129283129 14167:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129 14168:S4|4974656d 14169:S40|456c656d656e747320696e2061206c697374206861766520646966666572656e742074797065732e 14170:D3,240|3b650c7303ff5524a801757183780401750f8b4c240c8b008b115b83c40c53ff228b4c240cff730cff7310ff33ff7108ff7104ff730850ff7304ff31ff70048b1089d08b54240490ff128b4c24308b54242c5b895c24305b895c2428894c24245b8b74241c895c241c5b8b7c2414895c24145b8b4c240c895c240ceb05e9260000005b578b7c2408895c24088b5c2404895424048b1424891c24575152bb0300000056e95c0000008b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d000000c20c0090909000000000ec000000|@14178,2097151,@2873|158,0,1 164,1,@14171 194,0,@5413 213,0,79992 222,0,6 14171:D3,1816|8d7c24ac3b7d0c7303ff5528f64424300175698b4c2430ff710453ff31508b4424048b54243c9090ff125089c38b442404ba84287bb2909090e88e14f1ffa801755e8b4c243c8b30ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01eb05e98a060000e88a60ffff837c240c0375185650bb046b8ab28b44244090e81ea7efffeb3ee9c80500005650bb106b8ab28b44244090e806a7efff50bb030000008b442418bafc317ab2e882cdefff89c358e8eaa6efffbb750000009090e8dea6efff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389ce8b5c24148b44243c9090e88eb3f2ff56ff742404ff74243c8b5c24449090e80e0600008b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740cb8ecd57ab28b5d049090ff1389cbb80100000090e8a2caf0ff5350ff74243c6a01bb214e00008b442420ba94477bb290e84ae2f0ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff1389c18b45008d40f43b45087303ff5520894500c740fc020000008b54242c8950048b5c24408918518b54242c909090ff128b4c2414f6c101740583c1027105ff5538ebf650bb0300000089c8bafc317ab2909090e866cbefff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104f86d8ab289018d410cc740fc02000000894804c7004100000089c18d400cc740fc020000008948048b4c244489089090e852aaefff89c18b45008d40f03b45087303ff5520894500c740fc030000008b54240c8950088b54241489500489085a909090ff1289c6ff7424306884348ab28b5c24388b44244cba94348ab2909090e842cdffff5689c18b44240889ca90ff128b4d008d49f43b4d087303ff5520894d00c741fc020000008b54242c895104c70107000000f6c101740d89c3b8ecd57ab28b5d0490ff138b5d008d5bc43b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc020000008958049090c70080dc7bb28d580cc743fc02000000894304c7036c3f8ab28d430cc740fc05000000895810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c3b8ecd57ab28b5d04909090ff138b5d008d5bdc3b5d087303ff5520895d00c743fc02000000c743040100000089038d430cc740fc020000008958049090c7009c9a7ab28d580cc743fc020000008943045889038b45008d40e83b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d580cc743fc020000008943045883c40489038b45008d40d03b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d580cc743fc02000000894304890b8d430cc740fc05000000895810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c243c89c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e8a25bffff5689c38b442420ba68bf88b2909090e82a56feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241c89500c5b895808894804c700030000008b4c243c8b590cc703030000008b51309090ff128b44240ca801740583c0027105ff5538ebf68b4c24408b54243c8b5c24388b7424348b7c2430508b442430508b442430508b442430508b442430508b442430508b442430508b44242c89442460894c245c89542458895c245489742450897c244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b442404894424385883c4148944241c5bb8e4107bb283c414e993f9ffff8b44240ca801740583c0027105ff5538ebf68b4c24408b54243c8b5c24388b7424348b7c2430508b442430508b442430508b442430508b442430508b442430508b442430508b44242c89442460894c245c89542458895c245489742450897c244c8b442414894424488b442410894424448b44240c894424408b4424088944243c8b442404894424385883c4148944241c5b83c4045883c40ce9f5f8ffffc2300090900000000014070000|@14177,2097151,@2872|50,0,@6509 58,1,@6714 130,1,@13830 144,0,@14172 154,1,@4940 168,0,@14173 178,1,@4940 184,0,1 193,0,@5052 198,1,@5053 206,1,@4940 211,0,58 218,1,@4940 251,0,3 261,0,@6321 286,1,@7849 306,1,@14174 340,0,0 347,0,0 354,0,0 360,0,0 370,0,@6321 384,0,0 390,1,@6511 403,0,10000 412,0,@6596 418,1,@6597 449,0,0 470,0,@5592 489,0,@6362 508,0,@5592 559,0,@5592 612,0,0 619,0,0 626,0,3 632,0,0 643,0,@6321 723,0,1 730,0,@5052 738,1,@5053 769,0,@14176 790,0,32 818,1,@4953 877,0,@14093 890,0,@14094 898,1,@14095 947,0,3 959,0,@6321 996,0,0 1019,0,@6812 1038,0,@14111 1058,0,0 1065,0,0 1072,0,0 1078,0,0 1089,0,@6321 1128,0,0 1151,0,@5592 1200,0,@5592 1252,0,@5592 1287,0,0 1294,0,1 1301,0,3 1307,0,0 1318,0,@6321 1386,1,@13830 1398,0,@13447 1406,1,@13449 1462,0,1 1475,0,1 1633,0,@6455 14172:S3|20313a 14173:S4|7320312d 14174:D3,632|3b650c7303ff55248b4c2408f6c101740783f9017f10eb06f641ff107408b8601c7bb2c20800a801757183780401754c8b108b45008d40f43b45087303ff5520894500c740fc0200000089480489108b54240490ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c208008b108b70048b45008d40f43b45087303ff5520894500c740fc02000000eb05e9c5010000894804891053568b54240c90ff12837c2404597456837c2404777454817c240448c05208743ef64424040175308b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017407b901000000eb26b903000000eb1fb901000000eb18b903000000eb11e907000000b903000000eb05b90300000083f1028b55008d52f03b55087303ff5520895500c742fc03000000c7420801000000894a04c70203000000f6c201740d89c1b8ecd57ab28b5d0490ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b5c2404895904c70107000000f6c101740e89c6b8ecd57ab28b5d049090ff138b75008d76c43b75087303ff5520897500c746fc02000000c7460401000000890e8d4e0cc741fc0200000089710489118d510cc742fc02000000894a0489028d420cc740fc05000000895010c7400c01000000c7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c2410f6c101740583e9027105ff5538ebf65051ff7424148b44240c909090e8d2fdffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948045983c4088908c20800b801000000c208009090900000000074020000|@14175,1048575,@2871|31,0,@6486 115,0,0 192,0,I48 210,0,I48 215,0,4 240,0,0 247,0,1 254,0,0 261,0,1 273,0,1 280,0,1 314,0,0 323,0,1 335,0,@6321 378,0,3 390,0,@6321 428,0,0 480,0,0 487,0,0 494,0,0 500,0,0 511,0,@6321 587,0,@5592 614,0,0 14175:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833297072696e744c697374283429 14176:O2|58,0 14177:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833296170706c794c697374283329 14178:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c697374283329 14179:D3,176|3b650c7303ff5524a801757053ff7004ff742418ff742418ff742418ff742418ff74243cff74243cff74243cff74243c8b5c243c8b008b5424249090ff1250ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff742430ff7424308b5c242c8b4424289090e88effffff89c18b45008d40f4eb05e91e0000003b45087303ff5520894500c740fc020000008948045983c4088908c22400b801000000c224009000000000ac000000|@6329,1048575,@2874|160,0,0 14180:S62|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e283629 14181:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2876| 14182:D3,124|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c7007c708ab28948048060ffbf52518b5a0889da9090ff12588b008b0c248b490483c40450b8010000008b512490ff1283f801750258c389c358e96b0000009090900000000078000000|@14185,1048575,@2879|34,0,0 52,0,@14183 88,0,0 109,1,@14184 14183:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2877|42,0,0 14184:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2878| 14185:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229626f6479456e762d283129 14186:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229 14187:S63|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283129283129 14188:O1|@14189 14189:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c70048728ab28948048060ffbfc3000000002c000000|@14194,3,@2884|28,0,@14190 14190:D3,48|3b650c7303ff55248b4a048b58088b3424891c24ff31ff71048b58048b3889f856e91e0000009090000000002c000000|@14193,2097151,@2883|34,1,@14191 14191:D3,656|3b650c7303ff55248b4c240889de89c7ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01909090e81252ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70107000000f6c101740d89c2b8ecd57ab28b5d0490ff1389c2f6c201740583ea027105ff5538ebf651ff365089d38b4604ba68bf88b290e8564cfeff59f6c101740583e9027105ff5538ebf65089cb8b442404ba68bf88b2909090e8324cfeff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701fc0589b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1389c3b80100000090e8f2bbf0ff5350ff7424106a01bb214e00008b442420ba94477bb290e89ad3f0ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70100e27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c20c00000000008c020000|@14192,2097151,@2882|70,1,@13830 103,0,3 115,0,@6321 152,0,@13447 158,1,@13449 186,0,@13447 194,1,@13449 225,0,0 246,0,@5592 265,0,@13539 284,0,@5592 337,0,0 344,0,0 351,0,0 357,0,0 368,0,@6321 380,0,0 386,1,@6511 399,0,10000 408,0,@6596 414,1,@6597 445,0,0 466,0,@5592 485,0,@6362 504,0,@5592 555,0,@5592 605,0,0 612,0,0 619,0,3 625,0,0 636,0,@6321 14192:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283529 14193:S52|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129283129 14194:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129 14195:S6|436c61757365 14196:S37|436c617573657320696e2063617365206861766520646966666572656e742074797065732e 14197:S3|49663a 14198:O2|3,@14199 14199:S46|436f6e646974696f6e20696e2069662d73746174656d656e74206d7573742068617665207479706520626f6f6c2e 14200:S5|5468656e3a 14201:S5|456c73653a 14202:O2|3,@14203 14203:S46|54797065206d69736d61746368206265747765656e207468656e2d7061727420616e6420656c73652d706172742e 14204:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7934897e048b7920893e53ff7208ff72046850778ab289e15189c389f0e8d66dffff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@2886|54,0,@14205 66,1,@13885 82,0,0 14205:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9114cffff90000000002c000000|@13833,2097151,@2885|24,0,1 35,1,@13829 14206:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9cd4bffff90000000002c000000|@13833,2097151,@2887|24,0,1 35,1,@13829 14207:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9894bffff90000000002c000000|@13833,2097151,@2888|24,0,1 35,1,@13829 14208:D3,120|3b650c7303ff5524a801755c53ff7004ff742414ff742414ff7424148b00909090e86600000050ff742418ff742418ff7424188b5c24148b4424109090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c000000000074000000|@6329,2097151,@2892|34,1,@14209 105,0,0 14209:D3,216|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c70194798ab28b54240c8951048959088061ffbfff7004ff30ff700851bb607a8ab28b400ce8068ff0ff8b0c248339017534837c241401742d8b5424148b59048b4d008d49f03b4d087303ff5520894d00c741fc030000008b32897108895904c7010900000089c28b45008d40e03b45087303ff5520894500c740fc07000000c7401801000000c74014010000008b5c241083c40489581089500c8948088b4c24048948045983c4048908c20c00909000000000d4000000|@14215,2097151,@2891|34,0,@14210 62,0,@14212 70,1,@6446 130,0,4 163,0,0 170,0,0 14210:D3,84|8b48088b5904833b0375158b72088b7e04833f03750a8b4b043b4f04752ceb26833b0175258b72088b7e04833f01751a8b4b0cf6c1017509f6470c017503ff55383b4f0c75048b4204c3c3900000000050000000|@14211,63,@2889| 14211:S91|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f707954797065436f6e73283129 14212:O1|@14213 14213:D3,12|c39090900000000008000000|@14214,1,@2890| 14214:S89|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f7079547970283129283129 14215:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129 14216:D3,68|3b650c7303ff552452bbe43a89b2909090e83e90efff8b0c248b54240883c4048b5908895c24048b342489142450bb030000008b410456e90c48ffff0000000040000000|@14217,2097151,@2893|10,0,@13643 18,1,@4940 47,0,1 56,1,@13829 14217:S66|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296d657373466e283329 14218:D3,912|8d7c24a83b7d0c7303ff5528f640080175758b480889da8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703887f8ab28b74240c8973048b7c2408897b0889530c8063ffbfff3052ff7010ff7004ff7014568b01ba40058ab2909090e80289ffff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410844808ab2eb05e90b000000894104c70105000000eb11b944808ab2ff3053ff7010ff7004ff70148b45008d40f43b45087303ff5520894500c740fc020000008b542408895004c700010000008b5c24205150b8010000008b534090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b44240483381d756b8b50048b5c24108b75008d76f43b75087303ff5520897500c746fc020000008b7b34897e048b43188906ff720cff742424ff74242c685c808ab251ff7210ff7208ff7204ff720cff32ff34248d44241c5089f3b8a0808ab29090e81649ffff837804017440ff700c50eb05e9d10000008b5c2408b85100000090e8068eefffbbb4808ab29090e8fa8defffff742450ff74241050bb030000008b44246090e8d645ffffeb04ff700c508b4424105989088b4424108b0c2489088b44243c8b5424148b5824891a8b55008d52c03b55087303ff5520895500c742fc01000040c702010000008d7208c746fc01000040c70628e07bb28d7e08c747fc03000000897708895704c707050000008d5710c742fc07000000c7421801000000c74214010000008b742418897210894a0c897a08c74204010000008b4c244083c42c890aeb72833811740cb8d4808ab28b5d049090ff138b45008d40c03b45087303ff5520894500c740fc01000040c700010000008d5008c742fc01000040c70228e07bb28d5a08c743fc03000000895308894304c703050000008d5310c742fc07000000c7421801000000c7421401000000894a10eb05e9160000008b042489420c895a08c74204010000008b442414890283c4085889108b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b5c24088918528b542414ff12ff7424048b5c24208b442410909090e8f297fcffff74241cff7424086a038b5c24248b44241890e8ba98ffff8b4424088b48088b45008d40f43b45087303ff5520894500c740fc020000005a83c4088950045a891089ca5983c40c51ff22000000008c030000|@14228,2097151,@2897|49,0,@14219 90,0,@13964 98,1,@13965 129,0,@14221 145,0,2 152,0,@14221 201,0,0 212,0,0 251,0,2 268,0,0 353,0,@14222 383,0,@14223 390,1,@13835 416,0,40 422,1,@4940 427,0,@14224 434,1,@4940 448,0,1 458,1,@13829 523,0,0 539,0,@6817 561,0,2 578,0,0 585,0,0 605,0,0 626,0,@14225 663,0,0 679,0,@6817 701,0,2 718,0,0 725,0,0 751,0,0 826,1,@12947 850,1,@13992 14219:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7934897e048b7920893e53ff7208ff72046800808ab289e15189c389f0e82665ffff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@2895|54,0,@14220 66,1,@13885 82,0,0 14220:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e96143ffff90000000002c000000|@13833,2097151,@2894|24,0,1 35,1,@13829 14221:O5|5,0,@5284,@5287,0 14222:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e90543ffff90000000002c000000|@13833,2097151,@2896|24,0,1 35,1,@13829 14223:S9|457863657074696f6e 14224:S22|29206973206e6f7420616e20657863657074696f6e2e 14225:O4|@4608,@5398,@14227,@14226 14226:O5|@13821,1271,0,1271,0 14227:S41|70726f63657373457863657074696f6e3a206261646c792d666f726d65642070617273652d74726565 14228:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f63657373457863657074696f6e283129 14229:D3,676|3b650c7303ff55248b5b34f6c30175358b0b81391ce639b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b4b0489cb3b650c7303ff5524ebc6ba0100000083fa01756cb97c787cb2f6c10175358b11813a1ce639b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750d89c1b8287c7cb28b5d0490ff138b0b81391ce639b2741689c2b854eb7ab28b5d04eb05e90a000000909090ff138b5108eb1a8b0a81391ce639b2740d89c3b854eb7ab28b5d0490ff138b510883fa057563e87687f0ff83380d7507b803000000eb6683380b75668b480c8b51088b5a04833b05755d833b05740f8b7004b888a77bb28b5d049090ff138b7b088b73048b580489f090e82625f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000eb05e978000000c70140848ab28941048061ffbfeb0fe953000000e930000000e9240000006a016a0189e05089cb89f8909090e892bcf0ff5883c4043b650c7303ff5524e95bffffffb801000000eb1e8338077514837804017407b801000000eb0cb803000000eb05b80100000083f8017506b8cc848ab2c3b801000000c383fa037567909090e88e86f0ff83380b755f8b480c8b51088b5a04833b057574833b05740f8b7004b888a77bb28b5d049090ff138b7b088b73048b580489f090e84a24f1ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70100858ab28941048061ffbfeb0ae959000000e9320000006a016a0189e05089cb89f8909090e8c2bbf0ff5883c4043b650c730aeb05e908000000ff5524e96cffffffb801000000eb118338057407b801000000eb05b80300000083f8017506b801000000c3b88c858ab2c3b801000000c390909000000000a0020000|@14236,2097151,@2900|20,0,@4680 70,0,0 80,0,@7313 93,0,@4680 143,0,0 155,0,@7368 169,0,@4680 178,0,@6377 206,0,@4680 215,0,@6377 234,1,@6447 244,0,1 278,0,@6718 302,1,@6721 339,0,@14230 382,1,@6564 404,0,0 422,0,0 429,0,1 436,0,0 446,0,@14231 452,0,0 466,1,@6447 498,0,@6718 522,1,@6721 552,0,@14233 590,1,@6564 619,0,0 631,0,0 638,0,1 648,0,0 654,0,@14234 660,0,0 14230:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@2898|62,0,0 72,0,0 14231:O1|@14232 14232:S36|41206e6f6e20756e69742076616c7565206973206265696e67206469736361726465642e 14233:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@2899|62,0,0 72,0,0 14234:O1|@14235 14235:S36|412066756e6374696f6e2076616c7565206973206265696e67206469736361726465642e 14236:S27|545950455f5452454528292e636865636b44697363617264283229 14237:D3,64|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722c89de8b5a0456e999beffff90000000003c000000|@14187,2097151,@2901|51,1,@14132 14238:S46|436c617573657320696e20666e2065787072657373696f6e206861766520646966666572656e742074797065732e 14239:D3,612|8d7c24a83b7d0c7303ff55288b4c2428f6c101740583c1027105ff5538ebf689c28b45008d40f43b45087303ff5520894500c740fc02000000c700e8888ab28948048060ffbf5152538b1390ff128b44243c8b088b45008d40f03b45087303ff5520894500c740fc03000000c700ec8a8ab28b5424308950048b5c24088958088060ffbf89ca9090ff128b45008d40f03b45087303ff5520894500c740fc03000000c700588e8ab28b4c242c8948048b5424288950088060ffbf6a016a016a0189e3909090e8c2b4fcff8b442410a8017527ff7004ff742418ff74243cff7424108b5c24488b009090e8d2070000583b650c7303ff5524ebd5b8010000008b442410a8017553ff7004ff74244cff742440ff742420ff742440ff742450ff74244cff742424ff742420ff742450ff742450ff742450ff742450ff742450ff7424488b5c24488b009090e82a0b0000583b650c7303ff5524eba9b80100000083c41058a80175708b088b51088b128b5a10f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b28b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70308ac8ab28b7424208973048b7424248973088063ffbfff700452ff7108ff32ff72186a0356eb05e9750000005753ff7424408b5c24288b420cbab4ac8ab2e886240000833c2401750db84cc37bb28b5d04909090ff13588b00c700010000008b4424388b48088b45008d40f43b45087303ff5520894500c740fc020000008b5424088950045b891889ca909090ff1258598908583b650c7303ff5524e912ffffffb80100000083c404c23000900000000060020000|@14312,2097151,@2935|59,0,@14240 110,0,@14244 164,0,@14248 198,1,@13015 234,1,@14250 250,0,0 330,1,@14256 346,0,0 401,0,@12945 431,0,@14293 489,0,@14295 494,1,@14296 505,0,@6769 522,0,0 593,0,0 14240:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14243,2097151,@2903|26,1,@14241 14241:D3,276|3b650c7303ff55248b45008d40f03b45087303ff5520894500c740fc030000008b4b048948088b13895004c7000d000000e89280f0ff83380d740e89c1b898427bb28b5d049090ff138b480883e10983f9017407b901000000eb05b90300000083f1028b500883e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2f64424040175148b7c24048b37f647ff107402f7de8d743601eb048b7424048d34f5f9ffffff83f9017507b901000000eb05b9090000000bce83c9050bca8b55008d52f03b55087303ff5520895500c742fc03000000894a08895a04c7020d0000008b40048910b801000000c2040090900000000010010000|@14242,2097151,@2902|45,0,6 50,1,@6447 62,0,@6567 85,0,0 92,0,1 111,0,0 118,0,1 151,0,@5413 199,0,0 206,0,4 249,0,6 259,0,0 14242:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283229 14243:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283129 14244:D3,44|3b650c7303ff55248b4a048b1c24890c24ff720889de8b58048b3889f856e91d000000900000000028000000|@14243,2097151,@2906|31,1,@14245 14245:D3,320|3b650c7303ff55248b4c2408538b5130ff1283f80175588b04248b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7000d0000009090e8767ef0ff83380d740e89c1b898427bb28b5d049090ff138b480883e10983f901740cb901000000eb0ae9b2000000b90300000083f1028b500883e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2f64424080175148b7c24088b37f647ff107402f7de8d743601eb048b7424088d34f5f9ffffff83f9017507b901000000eb05b9090000000bce83c9050bca8b55008d52f03b55087303ff5520895500c742fc03000000894a08895a04c7020d0000008b40048910b80100000083c404c208008b1c248b0083c4045983c40851e91c000000000000003c010000|@14242,2097151,@2905|63,0,6 70,1,@6447 82,0,@6567 105,0,0 117,0,1 136,0,0 143,0,1 176,0,@5413 224,0,0 231,0,4 274,0,6 284,0,0 308,1,@14246 14246:D3,416|3b650c7303ff552489c18b45008d40f03b45087303ff5520894500c740fc030000008b51048950088b31897004c7000d0000005351e8327df0ff83380d740e89c1b898427bb28b5d049090ff138b4c24048b50048b58088b45008d40f03b45087303ff5520894500c740fc030000008b71048970088b39897804c7000d0000005253909090e8e27cf0ff83380d740e89c1b898427bb28b5d049090ff138b0c24c1e90383c901f6c101740783f9017d20eb06f641ff107418ff7004ff700889cbb88c6c7ab2909090ff1588c75208eb0a8b50048b580889c8525359c1e90383c901f6c101740783f9017d19eb06f641ff1074115089cbb88c6c7ab290ff1588c75208eb0589c289c852a801740df604240174073b04247d43eb05ff5538ebf48b4424148b4d008d49f03b4d087303ff5520894d00c741fc030000008b50048951088b18895904c7010d0000008b74240c890eb80100000083c418c38b4424108b4d008d49f03b4d087303ff5520894d00c741fc030000008b50048951088b18895904c7010d0000008b742404890eb80100000083c418c390000000009c010000|@14247,2097151,@2904|47,0,6 54,1,@6447 66,0,@6567 124,0,6 134,1,@6447 146,0,@6567 193,0,@5215 202,0,I106 247,0,@5215 254,0,I106 328,0,6 339,0,0 388,0,6 399,0,0 14247:S27|545950455f5452454528292e6c696e6b5479706556617273283229 14248:D3,112|3b650c7303ff55248b4c24048b5910f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bbe43a89b29090e8fa7cefff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e9cb34ffff909090000000006c000000|@14249,2097151,@2907|48,0,@12945 55,0,@13643 62,1,@4940 88,0,1 97,1,@13829 14249:S73|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834296d7367466e283329 14250:D3,688|3b650c7303ff5524f6400401740f89c1b8f4918ab28b5d04909090ff138b48048b118b328b7e048b4d008d49f43b4d087303ff5520894d00c741fc020000008b7708897104c70101000000ff37ff7008ff720853ff7010ff3251b8010000008b53409090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40f83b45087303ff5520894500c740fc01000040c700ec7d7ab2f64424240175148b5c24248b13f643ff107402f7da8d541201eb048b5424248d14d5f9ffffff8b5d008d5bb83b5d087303ff5520895d00c743fc03000000895308894304c7030d0000008d4310c740fc01000040c700ffffffff8d5008c742fc01000040c70228e07bb28d7208c746fc03000000895608894604c706050000008d4610c740fc01000040c700010000008d5008c742fc01000040c702010000008d7a08c747fc01000040c70701000000518b4d008d49b83b4d087303ff5520894d00c741fc0300000089790889410489118d4110c740fc0100000089088d4808c741fc01000040c701010000008d5108c742fc01000000890a8d4a08c741fc070000008951188941145889411089590c897108c74104050000008b44241489015abb010000008b12f6c201751cf6c301740583c3027105ff5538ebf68b52043b650c7303ff5524ebdf89da5b891383fa01752151ff74241cff74240c6854928ab2bb030000008b442410909090e81e32ffffeb06b80100000051ff7424088b5c24088b442414909090e88e85fcffff742404ff74240c6a018b5c24288b44241c90e85686ffff8b44240c8b0c2489088b44241889c28b45008d40f43b45087303ff5520894500c740fc0200000089480483c4105989085983c40c51ff2290909000000000ac020000|@14255,2097151,@2908|17,0,@14251 71,0,0 91,0,0 131,0,2 148,0,0 196,0,@5413 270,0,6 286,0,-1 302,0,@6817 324,0,2 340,0,0 356,0,0 372,0,0 433,0,0 478,0,2 490,0,0 549,0,@14254 554,0,1 566,1,@13829 573,0,0 594,1,@12947 618,1,@13992 14251:O4|@4608,@5398,@14253,@14252 14252:O5|@13821,1668,0,1668,0 14253:S41|66696e644e616d65416e6450617474733a206261646c792d666f726d65642070617273652d74726565 14254:S46|436c617573616c2066756e6374696f6e20646f6573206e6f74206861766520616e7920706172616d65746572732e 14255:S84|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342966696e644e616d65416e645061747473283129 14256:D3,1104|8d7c24983b7d0c7303ff55288b48088b098b55008d52e83b55087303ff5520895500c742fc01000040c702ec7d7ab28d7208c746fc03000000c74608f1700200895604c7060d0000008b5004ff700c51565350ff7014ff30f6c2017560ff7204ff742458ff74241cff74245cff74245cff74245cff74245cff74245cff742420ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742444ff7424548b5c24548b02909090e8b20300005a3b650c7303ff5524eb9b8b44242083c408a8017519ff70048b5c24108b00e842150000583b650c7303ff5524ebe38b44240c8b580c8b442408ba84287bb2e8c6e4f0ffa80175728b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b142489118b55008d52e83b55087303ff5520895500c742fc050000008b5c2410895a108b74244c89720c8b7c2404897a08894a04c7021900000052ff30ff742410ff742454ff74245089d3b864438ab2eb05e9ca020000e8369effff8b4c24148b55008d52c43b55087303ff5520895500c742fc01000040c702ec7d7ab28d5a08c743fc01000040c70390cf87b28d7308c746fc01000040c706b0aa8ab28d7e08c747fc050000008977108b74241889770c895708895f048b1189178d5f18c743fc02000000897b04c7031d00000050ff710cff742458ff742454b844ab8ab2909090e8aa9dffff89c6ff74244c6884348ab28b5c24548b44245cba94348ab2909090e8969fffff5689c18b44240889ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70158ab8ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c244c89c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e82e2effff5689c38b442404ba68bf88b2909090e8b628feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241889500c5a83c404895008894804c700030000008b4c24488b510cc702030000008b513083c4145b83c43853ff22b80100000083c414c238009090000000004c040000|@14292,2097151,@2926|43,0,@5413 60,0,79992 69,0,6 174,1,@14257 210,1,@14282 237,0,@6509 242,1,@6714 277,0,0 336,0,12 358,0,@14119 370,1,@14091 404,0,@5413 420,0,@13162 436,0,@14286 485,0,14 502,0,@14289 510,1,@14091 521,0,@14093 534,0,@14094 542,1,@14095 585,0,0 606,0,@6812 625,0,@14111 645,0,0 652,0,0 659,0,0 665,0,0 676,0,@6321 712,0,0 735,0,@5592 784,0,@5592 836,0,@5592 855,0,@14290 875,0,0 882,0,1 889,0,3 895,0,0 906,0,@6321 974,1,@13830 986,0,@13447 994,1,@13449 1053,0,1 1066,0,1 1084,0,0 14257:D3,2540|8d7c248c3b7d0c7303ff55288b088b55008d52e43b55087303ff5520895500c742fc02000000c742040100000089028d720cc746fc01000040c706010000008d7e08c747fc01000040c70790cf87b2ff7008ff70048b45008d40f83b45087303ff5520894500c740fc01000040c700e4107bb2ff710c538b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703e4107bb2ff31ff71048b4d008d49c03b4d087303ff5520894d00c741fc060000008959148971108b5c241489590c89790889510489018d411cc740fc02000000c740040100000089088d480cc741fc050000008959108b54245c89510c8b742408897108894104c70119000000588b7c24548b40048b770c89308b45008d40f03b45087303ff5520894500c740fc030000009090c7004ca18ab28b5c24508958048948088060ffbf6a016a016a01518d5c240490e866a3fcff8b44245ca801740583c0027105ff5538ebf650ff74245cff74245cff74245cff742418508b5c24788b442428909090e8aa090000a801756083780401745f50bb03000000909090e8ea19feff89c389d8909090e83299ffff8b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c70007000000eb14e90700000089c18b0151eb0889c1b8e4107bb2518b4c245489018b44245c8b55008d52ec3b55087303ff5520895500c742fc04000000c70220a38ab28b5818895a048b7424508972088b7c2414897a0c8062ffbf8b7c241c8b4c24708b5d008d5bec3b5d087303ff5520895d00c743fc04000000c70380a38ab28b70308973048b71048973088b7f04897b0c8063ffbf8b7c245c8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701e0a38ab28979048b74244c8971088b74240c89710c8061ffbf8b75008d76c43b75087303ff5520897500c746fc0e000000ff7034538b5c2404895e345b83c404895e308b582c895e2c8b5f28895e28894e248b4820894e208b4f1c894e1c8956188b50148956148b50108956108b470c89460c8b57088956088b57048956048b07890656ff742428ff74242cff742474ff742454ff742454ff7424548b5c24548b4424208b542464ff12f644242001756d8b4c24208b5d008d5bec3b5d087303ff5520895d00c743fc04000000c70398a68ab28b5424688953048b7424588973088b7c245c897b0c8063ffbf50528b01ba40058ab2e8766affff5089c38b442404ba84287bb2909090e8baddf0ffa8017572ff30ff742408ff742478eb05e9fb020000ff7424748b5c243cb854a78ab290e88297ffff89c3b801000000e8e694f0ff5350ff7424746a01bb214e00008b442414ba94477bb290e88eacf0ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410ceb05e991020000c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701b05d8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c6ff7424706884348ab28b5c24788b842480000000ba94348ab290e8ba98ffff5689c18b44240889ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70168a78ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c247089c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e85227ffff5689c38b442414ba68bf88b2909090e8da21feff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54243489500c5b895808894804c700030000008b4c24708b590cc703030000008b51309090ff125883c4048b4c2434890189c35883c404909090e8a2090000508b5c242cba84287bb290e886daf0ffa8017571ff30ff742404ff74246cff7424688b5c2414b810a88ab2e85694ffff89c3b801000000e8ba91f0ff5350ff7424686a01bb214e00008b442440ba94477bb290e862a9f0ff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000eb05e9880200008948049090c7009c9a7ab28d480cc741fc02000000894104c70120a88ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389c6ff7424646884348ab28b5c246c8b442474ba94348ab2e89295ffff5689c18b44240889ca90ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70144a88ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c246489c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e82a24ffff5689c38b442408ba68bf88b2909090e8b21efeff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54242889500c5a895008894804c700030000008b4c24648b510cc702030000008b51309090ff12eb05b801000000b80100000083c428c2440000000000e8090000|@14281,2097151,@2921|41,0,0 59,0,0 75,0,@13162 111,0,@6455 145,0,@6455 212,0,0 250,0,12 295,0,@14258 326,1,@13015 378,1,@14261 394,0,1 402,1,@13429 414,1,@14089 445,0,1 454,0,0 476,0,3 497,0,@6455 538,0,@14262 600,0,@14263 656,0,@14264 863,0,@14270 897,0,@13964 902,1,@13965 914,0,@6509 922,1,@6714 956,0,@14272 962,1,@14091 969,0,0 974,1,@6511 987,0,10000 996,0,@6596 1002,1,@6597 1033,0,0 1063,0,@5592 1082,0,@14149 1102,0,0 1109,0,0 1116,0,0 1122,0,0 1133,0,@6321 1152,0,@14093 1168,0,@14094 1174,1,@14095 1217,0,0 1238,0,@6812 1257,0,@14111 1277,0,0 1284,0,0 1291,0,0 1297,0,0 1308,0,@6321 1344,0,0 1367,0,@5592 1416,0,@5592 1468,0,@5592 1487,0,@14273 1507,0,0 1514,0,1 1521,0,3 1527,0,0 1538,0,@6321 1606,1,@13830 1618,0,@13447 1626,1,@13449 1682,0,1 1695,0,1 1726,1,@14275 1736,0,@6509 1742,1,@6714 1769,0,@14276 1774,1,@14091 1781,0,0 1786,1,@6511 1799,0,10000 1808,0,@6596 1814,1,@6597 1845,0,0 1875,0,@5592 1894,0,@14277 1914,0,0 1921,0,0 1928,0,0 1934,0,0 1945,0,@6321 1964,0,@14093 1977,0,@14094 1982,1,@14095 2025,0,0 2046,0,@6812 2065,0,@14111 2085,0,0 2092,0,0 2099,0,0 2105,0,0 2116,0,@6321 2152,0,0 2175,0,@5592 2224,0,@5592 2276,0,@5592 2295,0,@14279 2315,0,0 2322,0,1 2329,0,3 2335,0,0 2346,0,@6321 2414,1,@13830 2426,0,@13447 2434,1,@13449 2490,0,1 2503,0,1 2517,0,0 2522,0,0 14258:D3,112|3b650c7303ff55248b4c24048b5910f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bbd0a18ab29090e8066aefff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e9d721ffff909090000000006c000000|@14260,2097151,@2909|48,0,@12945 55,0,@14259 62,1,@4940 88,0,1 97,1,@13829 14259:S39|2068617320616c7265616479206265656e20626f756e6420696e207468697320636c617573652e 14260:S107|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c617573652831296d657373466e283329 14261:D3,152|3b650c7303ff5524a801757153ff7004ff74240c6a016890478ab26a0153ff742430ff742430ff7424308b5c24308b0090e816a6ffff50ff742420ff742420ff742420ff742420ff7424208b5c241c8b4424189090e8a6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c408eb05e9050000008908c21400b801000000c21400900000000094000000|@6329,2097151,@2910|23,0,@14136 50,1,@14139 136,0,0 14262:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@2911| 14263:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@2912| 14264:D3,228|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c700d8a48ab28948048060ffbf52518b5a0c89da9090ff12588b008b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008b142489c38d4108c740fc02000000c70024a58ab28948048060ffbf53518b720889f29090ff12588b008b4c24048b490450b8010000008b5124909090ff1283f80175058b0424eb0a89c38b0424e8d200000083f801750883c4045883c404c389c383c4045883c404e90f01000090909000000000e0000000|@14269,1048575,@2917|34,0,0 52,0,@14265 103,0,0 124,0,@14266 158,0,0 186,1,@14267 213,1,@14268 14265:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2913|42,0,0 14266:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2914|42,0,0 14267:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2915| 14268:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2916| 14269:S109|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129626f6479456e762d283129 14270:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7934897e048b7920893e53ff7208ff72046810a78ab289e15189c389f0e8163effff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@2919|54,0,@14271 66,1,@13885 82,0,0 14271:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9511cffff90000000002c000000|@13833,2097151,@2918|24,0,1 35,1,@13829 14272:S11|45787072657373696f6e3a 14273:O2|3,@14274 14274:S51|426f6479206f662066756e2062696e64696e6720646f6573206e6f74206d61746368207479706520636f6e73747261696e742e 14275:D3,76|3b650c7303ff5524a8017532ff308b4004e8eaffffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70005000000c389d8c39090900000000048000000|@6729,11,@2920|57,0,2 14276:S7|436c617573653a 14277:O2|3,@14278 14278:S14|4f7468657220636c61757365733a 14279:O2|3,@14280 14280:S59|54797065206f6620636c6175736520646f6573206e6f74206d61746368207468652074797065206f662070726576696f757320636c61757365732e 14281:S98|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129 14282:D3,96|3b650c7303ff55248b40088b0083781401750e8b4814b84cc37bb28b5d0490ff138b40148b088b118b128b318b79088b1b89d09090e83a0000008b0f83f901740989cb9090e8a60000008907c70601000000b801000000c3000000005c000000|@14285,63,@2924|23,0,@6769 54,1,@14283 70,1,@14284 78,0,0 83,0,0 14283:D3,104|3b650c7303ff5524a801754b8b4d008d49f43b4d087303ff5520894d00c741fc020000008959048b108911518b500489d0e8caffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000064000000|@6329,15,@2922|88,0,0 14284:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2923| 14285:S93|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6f766552656673283129 14286:O1|@14287 14287:D3,16|b801000000c39090000000000c000000|@14288,1,@2925|1,0,0 14288:S95|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6b4964656e74283229283129 14289:S9|5661726961626c653a 14290:O2|3,@14291 14291:S62|54797065206f662066756e6374696f6e20646f6573206e6f74206d617463682074797065206f6620726563757273697665206170706c69636174696f6e2e 14292:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e67283129 14293:D3,96|3b650c7303ff55248b420889d6ff7008ff700cff7010ff7014ff7018ff701cff7020ff7024ff7028ff702cff7030ff7034ff7038ff703cff70408b58048b0889c8e89a18ffff89c38b4604ba68bf88b2e92713feff909090000000005c000000|@14294,2097151,@2927|66,1,@13830 76,0,@13447 81,1,@13449 14294:S45|54595045434845434b5f50415253455452454528292e7061737332283529666f756e644e656172283129283129 14295:O12|@14296,@6596,@4604,@5308,@4644,@6668,@4646,@6678,@4648,@6686,@4609,@5316 14296:D3,380|8d7c24a43b7d0c7303ff55288b4c24108b7134f7c60100000075358b3e813f0ce639b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc3b90100000083f901756db97c787cb2f6c10175358b31813e0ce639b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01750e89c1b8287c7cb28b5d049090ff138b0f81390ce639b2741689c6b854eb7ab28b5d04eb05e90a000000909090ff138b7108eb1c8b31813e0ce639b2740d89c7b854eb7ab28b5d0490ff138b4e0889ce8b4d008d49f43b4d087303ff5520894d00c741fc020000008b7c2414897904c701030000006a016a01508d4424045053ff742424ff7204ff742410ff742424ff74242cff74243456ff7208ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722c8b5c244c89c8909090e82a000000b80100000083c40cc214009090900000000078010000|@14311,2097151,@2934|31,0,@4678 81,0,0 91,0,@7313 104,0,@4678 154,0,0 166,0,@7368 181,0,@4678 190,0,@6377 218,0,@4678 227,0,@6377 275,0,1 354,1,@14297 359,0,0 14297:D3,2560|8d7c24803b7d0c7303ff552850ff7004ff3089d890e85a5bf0ff8338077570ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742450bb8cb88ab28b40049090e8a20900008b4c24588b1089118b5804895904b801000000eb05e90600000083c40cc24c0083380575706a016a01ff70048d4c240451ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff742464ff7424648b58088b442460909090e8fefeffff8b45008d40f43b4508730aeb05e919010000ff5520894500c740fc020000008b4c24088948048b4c240489088b4c24648b5424608b5c245c8b7424588b7c2454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454508b442454898c249c00000089942498000000899c249400000089b4249000000089bc248c0000008b4c2430898c24880000008b4c242c898c24840000008b4c2428898c24800000008b4c2424894c247c8b4c2420894c24788b4c241c894c24748b4c2418894c24708b4c2414894c246c8b4c2410894c24688b4c240c894c24648b4c2408894c24608b4c2404894c245c5983c430894c2424894424208b5c24045883c418e9d3fdffff83380b756b8b480c8b51088b5a04833b057562833b0574108b7004b888a77bb28b5d04909090ff138b7804ff73088b730489fb89f0909090e8fef6f0ff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701acb98ab28941048061ffbf6a016a01578d4424045089cbeb0ae961010000e9e70000008b4424109090e8728ef0ff6a016a0189e050ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424708b5c24588b44246ce8f2fcffff6a016a01b88cb88ab250ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff7424548d5c24508b44246090e84e0800008b4424785983c41c89088b4c2404894804b80100000083c40cc24c00ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742450bb8cb88ab28b700489f090e8b60900008b4c24588b1089118b5804895904b80100000083c40cc24c0083380d75668b4808c1e90383c901f6c101740783f9017d1deb06f641ff107415ff7004ff700889cbb88c6c7ab2ff1588c75208eb0a8b50048b580889c85253a801740ff644245c0174083b44245c7c5deb05ff5538ebf38b0424c1e80383c801a801740c83f8017d1aeb0be967050000f640ff10740d89c3b88c6c7ab2ff1588c7520881f81f4e0000745d8b4424048b0083380974618b44240c83f00283f801741a8b4c245cf6c101740ceb05e98301000083e902710aff5538ebf6b91f4e00008b142483e20583fa01744a83f8017445837c240801743e5150ff742460ff742460ff742460eb05e948010000ff742460ff742460eb05e939010000ff742460bb30bd8ab2b8e45b89b2e8ce090000b801000000eb0889c28b44240851528b4c240883e10983f9017407b901000000eb05b90300000083f102833c2401741d8b54240883e20583fa017407ba01000000eb05ba0300000083f202eb05ba010000008b5c240883e30383fb017407bb01000000eb05bb0300000083f3028b75008d76f83b75087303ff5520897500c746fc01000040c706ec7d7ab2f6442404017515508b4424088b38f640ff107402f7df8d7c3f01eb058b7c2404508d3cfdf9ffffff83f9017507b801000000eb05b8090000000bc783fa017507b901000000eb05b9050000000bc10bc38b4d008d49e43b4d087303ff5520894d00c741fc03000000894108897104c7010d0000008b4424108b0089068b44241089088d4910c741fc020000008b5424188951045a83c4088911eb098b4c241083c4046a018b44240483c4048b00837c243c03756383380975638b500483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24383b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa01742a8b45008d40f83b45087303ff5520894500c740fc010000008b5424348910eb68e921020000e9e40100008b500483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24303b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b45008d40f83b45087303ff5520894500c740fc010000008b54242c8910eb63e9300100008b500483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24283b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b45008d40f83b45087303ff5520894500c740fc010000008b5424248910eb63e9cd0000008b500483fa017507ba01000000eb2a8b1a8b73088b7e04833f0375108b5c24203b5f047507ba03000000eb0d8b52043b650c7303ff5524ebca83fa0174258b45008d40f83b45087303ff5520894500c740fc010000008b54241c8910eb65e96a0000008b400483f8017507b801000000eb2c8b108b5a088b7304833e0375108b7c24183b7e047507b803000000eb0f8b780489f83b650c7303ff5524ebc883f80174258b45008d40f83b45087303ff5520894500c740fc010000008b5424148910eb0ae905000000b80100000083f801750f89c2b82cc08ab28b5d04909090ff138b108b5d008d5be83b5d087303ff5520895d00c743fc05000000c743100100000089530c8b32897308c7430401000000c7030b0000008b3c24891feb35833807752d51ff742458ff742458ff742458ff742458ff742458ff742458bb7cc08ab2b8e45b89b2909090e80e060000eb0751eb0451eb01518b4424048b008b4c24608b54245c8b5c24588b7424548b7c2450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450898c249800000089942494000000899c249000000089b4248c00000089bc24880000008b4c2430898c24840000008b4c242c898c24800000008b4c2428894c247c8b4c2424894c24788b4c2420894c24748b4c241c894c24708b4c2418894c246c8b4c2414894c24688b4c2410894c24648b4c240c894c24608b4c2408894c245c8b4c2404894c24585983c430894c24208944241c5b5883c410e926f6ffff8b4424088b4c24588b1089118b5804895904b80100000083c40cc24c009000000000fc090000|@14310,2097151,@2933|22,1,@6447 108,0,@14298 118,1,@14299 137,0,0 585,0,@6718 614,1,@6721 644,0,@14300 686,1,@6564 787,0,@14298 878,1,@14301 900,0,0 987,0,@14298 998,1,@14302 1017,0,0 1068,0,@5215 1074,0,I106 1148,0,@5215 1154,0,I106 1160,0,9999 1216,0,9999 1284,0,@14303 1289,0,@13723 1294,1,@14304 1299,0,0 1326,0,0 1333,0,1 1359,0,0 1366,0,1 1376,0,0 1393,0,0 1400,0,1 1433,0,@5413 1483,0,0 1490,0,4 1502,0,0 1509,0,2 1549,0,6 1631,0,0 1660,0,1 1735,0,0 1764,0,1 1834,0,0 1863,0,1 1933,0,0 1962,0,1 2032,0,0 2061,0,1 2125,0,0 2137,0,@14306 2178,0,0 2193,0,0 2199,0,5 2241,0,@14309 2246,0,@13723 2254,1,@14304 2541,0,0 14298:O1|@14297 14299:D3,260|8d7c24a43b7d0c7303ff5528a801757053ff30ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff7424548b4004909090e896ffffff596a016a0189e252ff74245cff74245cff74245ceb05e96d000000ff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245cff74245c8b59048b542454ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4088908c24c008b442404c24c009090900000000000010000|@6729,1048575,@2928| 14300:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@2929|62,0,0 72,0,0 14301:D3,460|8d7c249c3b7d0c7303ff5528a80175736a016a0153ff30ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff7424608d5c24588b4004909090e88affffff8b45008d40f43b4508730aeb05e926010000ff5520894500c740fc020000008b4c240c8948048b4c240889088b4c24608b54245c8b5c24588b7424548b7c2450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b442450508b4424408984249c00000089942498000000899c249400000089b4249000000089bc248c0000008b442434898424880000008b442430898424840000008b44242c898424800000008b4424288944247c8b442424894424788b442420894424748b44241c894424708b4424188944246c8b442414894424688b442410894424648b44240c894424608b4424088944245c8b442404894424585883c4348944241c8b5c24045883c41089ca5983c40451ff228b4424048903c7430403000000b801000000c250009000000000c8010000|@6729,1048575,@2930|439,0,1 444,0,0 14302:D3,260|8d7c24a03b7d0c7303ff5528a8017573ff3053ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff742454ff7424548b4004909090e896ffffff6a016a0189e151ff742460ff742460ff742460ff742460eb05e96a000000ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff7424608b5c24588b542454ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c8908c24c008b442404c24c009090900000000000010000|@6729,1048575,@2931| 14303:S29|696e636c75646573206120667265652074797065207661726961626c65 14304:D3,648|3b650c7303ff552489c6b8010000009090e89672f0ff8b4c24188b5134f6c20175358b3a813fd4e539b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7a0489fa3b650c7303ff5524ebc6b90100000083f901756bb97c787cb2f6c10175358b11813ad4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb148b510489d13b650c7303ff5524ebc6bf0100000083ff01750f89c1b8287c7cb28b5d04909090ff138b0f8139d4e539b2741689c2b854eb7ab2eb05e90d0000008b5d04909090ff138b5108eb1c8b11813ad4e539b2740d89c7b854eb7ab28b5d0490ff138b4a0889ca8b4d008d49f43b4d087303ff5520894d00c741fc02000000897104c70107000000f6c101740d89c6b8ecd57ab28b5d0490ff13515350ff7424186a0189d38b4424248b542428ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c70107000000f6c101740c89c2b8ecd57ab28b5d04ff138b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c7019c9a7ab28d510cc742fc02000000894a0489028d420cc740fc02000000895004c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1350b8010000008b54240c90ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54240889500c5b895808894804c700030000008b4c24188b590cc703030000008b51305e83c41856ff229090900000000084020000|@14305,1048575,@2932|11,0,0 18,1,@6511 38,0,@4671 88,0,0 98,0,@7313 111,0,@4671 161,0,0 173,0,@7368 189,0,@4671 198,0,@6377 226,0,@4671 235,0,@6377 279,0,3 291,0,@6321 352,0,3 364,0,@6321 400,0,0 421,0,@5592 455,0,@5592 505,0,0 512,0,0 519,0,3 525,0,0 536,0,@6321 547,0,0 610,0,1 623,0,1 14305:S46|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729676976654572726f72283229 14306:O4|@4608,@5398,@14308,@14307 14307:O5|@6454,2825,0,2825,0 14308:S25|67656e6572616c3a204e6f206d61746368696e672074797065 14309:S32|697320616e20756e7265736f6c76656420666c657869626c65207265636f7264 14310:S44|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e28372967656e6572616c283229 14311:S34|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729 14312:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e283429 14313:D3,64|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722c89de8b5a0456e92d83ffff90000000003c000000|@14187,2097151,@2936|51,1,@14132 14314:S40|436c617573657320696e2068616e646c6572206861766520646966666572656e742074797065732e 14315:O1|@13817 14316:D3,232|3b650c7303ff5524a80175728b0853ff7004ff31ff7104ff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243cff74243c8b5c243c8b410c8b5424349090ff125989018b4d008d49f43b4d087303ff5520894d00c741fc0200000089410458890151ff742438ff742438ff742438eb05e955000000ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24348b4424309090e84effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22c00b801000000c22c0000000000e4000000|@6329,1048575,@2937|217,0,0 14317:D3,68|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff7220ff7224ff7228ff722c89de8b5a04bad4c18ab256ff229090900000000040000000|@14318,1048575,@2938|50,0,@14315 14318:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283129283129 14319:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2939| 14320:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2940| 14321:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2941| 14322:D3,124|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c700dcc48ab28948048060ffbf52518b5a0889da9090ff12588b008b0c248b490483c40450b8010000008b512490ff1283f801750258c389c358e96b0000009090900000000078000000|@14325,1048575,@2944|34,0,0 52,0,@14323 88,0,0 109,1,@14324 14323:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2942|42,0,0 14324:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2943| 14325:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296c6f63616c456e762d283129 14326:O1|@14327 14327:D3,16|b801000000c39090000000000c000000|@14325,1,@2945|1,0,0 14328:D3,88|3b650c7303ff55248b4a0c8b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4804890b8b720c891e50528b5a0889da909090ff128b04248b400483c4048b48085889caff22900000000054000000|@14329,1048575,@2946| 14329:S68|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229626f6479456e762d283129 14330:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b480c5889caff22900000000028000000|@14329,1048575,@2947| 14331:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b48285889caff22900000000028000000|@14329,1048575,@2948| 14332:O1|@14333 14333:D3,28|3b650c7303ff5524bb15000000e942a4efff90900000000018000000|@5217,2097151,@2949|9,0,10 14,1,@5214 14334:O1|@14335 14335:D3,28|3b650c7303ff5524bb15000000e90aa4efff90900000000018000000|@5217,2097151,@2950|9,0,10 14,1,@5214 14336:O1|@14337 14337:D3,28|3b650c7303ff5524bb15000000e9d2a3efff90900000000018000000|@5217,2097151,@2951|9,0,10 14,1,@5214 14338:D3,256|3b650c7303ff5524a801756d8b08ff7108ff742408ff74241068f0c88ab253ff7004ff7108ff318d542410528b533489d3b8bc5c89b2909090e8ae01ffff83f8017507b801000000eb438b4d008d49f43b4d087303ff5520894d00c741fc020000008b14248951048b0089018b45008d40f83b4508730aeb05e972000000ff5520894500c740fc01000000890883f80175208b4424248b4c242089442424894c24208b5c240883c4045883c414e94effffffff30ff742428ff7424288b5c24148b44241090e836ffffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c41cc20800b801000000c2080000000000fc000000|@8404,1048575,@2953|26,0,@14339 50,0,@13728 58,1,@13836 68,0,0 241,0,0 14339:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e971fafeff90000000002c000000|@13833,2097151,@2952|24,0,1 35,1,@13829 14340:D3,492|3b650c7303ff55248b480cf6c10175328b11833a01751c8b75008d76f83b75087303ff5520897500c746fc010000008916eb148b510489d13b650c7303ff5524ebc9be01000000f7c60100000075628b0e833901755b8b55008d52d03b55087303ff5520895500c742fc020000008b7904897a04c702070000008d720cc746fc02000000895e04c706030000008d5e0cc743fc02000000c743040100000089338d730cc746fc02000000895e048916eb348b4d008d49e83b4d087303ff5520894d00c741fc02000000895904c701030000008d710cc746fc02000000c7460401000000890e8b4d008d49e83b4d087303ff5520894d00c741fc05000000c70134cb8ab28b54240c8951048b5c241089590889410c8971108061ffbf8b7d008d7fe83b7d087303ff5520897d00c747fc05000000c707a4cc8ab28957048b54240889570889470c8977108067ffbf8b5d008d5be83b5d087303ff5520895d00c743fc05000000c70334cf8ab28b54240c8953048b54240489530889430c8973108063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000897e08894e04891e56ff7008bb5d0000008b00909090e8aa40efff8b0c24ff7110ff34246a0350ff74240c6a018b5c241c8b01909090e8e220ffffb80100000083c40cc2100090909000000000e8010000|@14350,1048575,@2961|67,0,0 118,0,3 137,0,1 154,0,0 206,0,1 223,0,0 255,0,@14341 309,0,@14344 359,0,@14349 424,0,46 434,1,@4940 466,1,@13905 471,0,0 14341:D3,140|3b650c7303ff55248b4804ff3052ff31ff72108b5a0c8b4104e8820000008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b042451518b5c240c8b500889d0909090e8f624f0ff8b4424048b40048b480c8b45008d40f43b45087303ff5520894500c740fc020000005a83c4048950045a891089caff2290900000000088000000|@14343,2097151,@2955|26,1,@14342 78,1,@6390 14342:D3,104|3b650c7303ff5524a801754c53ff7004ff74240c8b00909090e8fe04ffff50ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,63,@2954|26,1,@13851 89,0,0 14343:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e74726965732832295f2d283129 14344:D3,104|3b650c7303ff5524ff3052ff72108b5a0c8b400490e8620000008b0c2450508b5c240c8b4108909090e8aa23f0ff8b4424048b40048b48288b45008d40f43b45087303ff5520894500c740fc020000005a83c4048950045a891089caff2290900000000064000000|@14343,2097151,@2959|22,1,@14345 42,1,@6390 14345:D3,292|3b650c7303ff55248b480483390375708b55008d52f43b55087303ff5520895500c742fc020000008b5904895a04c7020300000083780c0175068b742404eb1e8b700889d7ff308b580c8b442408909090e8e200000089f189c689faeb05ff308b48088b45008d40ec3b45087303ff5520894500c740fc0400000089700ceb05e90c000000894808895004598908c2040083390175718b55008d52f03b55087303ff5520895500c742fc03000000895a088b5904895a04c7020900000083780c0175068b742404eb1b8b70088b38528b580c8b442408909090e8b200000089f189c6eb06528b48088b388b45008d40ec3b45087303ff5520894500c740fc0400000089700ceb05e90c000000894808598948048938c20400c20400900000000020010000|@14348,63,@2958|48,0,1 82,1,@14346 185,0,4 218,1,@14347 14346:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2956| 14347:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2957| 14348:S35|5354525543545f56414c5328292e6d616b6553656c6563746564537472756374283329 14349:D3,104|3b650c7303ff5524ff3052ff72108b5a0c8b400490e8a201ffff8b0c2450508b5c240c8b4108909090e81a21f0ff8b4424048b40048b48088b45008d40f43b45087303ff5520894500c740fc020000005a83c4048950045a891089caff2290900000000064000000|@14343,2097151,@2960|22,1,@13851 42,1,@6390 14350:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e7472696573283229 14351:O1|@14352 14352:D3,44|8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048918c204000000000028000000|@14353,11,@2962| 14353:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229283329 14354:O1|@14355 14355:D3,44|8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048918c204000000000028000000|@14353,11,@2963| 14356:O1|@14357 14357:D3,44|8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048918c204000000000028000000|@14353,11,@2964| 14358:O2|@5232,@14359 14359:O2|@5232,0 14360:O2|3,@14361 14361:S45|417267756d656e7473206f66206f72656c7365206d7573742068617665207479706520626f6f6c2a626f6f6c2e 14362:S6|52616973653a 14363:O2|3,@14364 14364:S42|457863657074696f6e20746f20626520726169736564206d757374206861766520747970652065786e2e 14365:D3,192|3b650c7303ff5524a801757153ff7004ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff7424348b5c24348b008b54242c9090ff1250ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff742438ff7424388b5c24348b442430eb05e92e000000909090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c22c00b801000000c22c0000000000bc000000|@6329,1048575,@2965|177,0,0 14366:D3,112|3b650c7303ff55248b4c24048b5904f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bbe43a89b29090e8b638efff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e987f0feff909090000000006c000000|@14217,2097151,@2966|48,0,@12945 55,0,@13643 62,1,@4940 88,0,1 97,1,@13829 14367:D3,192|3b650c7303ff5524a80175718b08f6410801754c8b510889de8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703f4d38ab28b7c2408897b048b4c2404894b0889730c8063ffbf56ff7004578b02ba40058ab290e8ce31ffffeb0a8b4804b8ec7d7ab2535150ff742414ff7424148b5c24108b44240ceb05e92e000000909090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c2080000000000bc000000|@6329,2097151,@2969|51,0,@14368 84,0,@13964 90,1,@13965 100,0,@5413 177,0,0 14368:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7934897e048b7920893e53ff7208ff7204686cd48ab289e15189c389f0e8ba10ffff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@2968|54,0,@14369 66,1,@13885 82,0,0 14369:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9f5eefeff90000000002c000000|@13833,2097151,@2967|24,0,1 35,1,@13829 14370:D3,816|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc020000008b5010895104c701010000008b742410ff30ff700452ff7014ff70185351b8010000008b56409090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b042483380375728b45008d40e43b45087303ff5520894500c740fc03000000c7400848c052088b54240c8950048b5c241489188d7010c746fc02000000c74604ec7d7ab28b7c2404893e515650bb010000008b4424148b542430909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e90f000000894108588941048b4424148901eb5583380b75558b50048b5c24045183fa01751383fb017407b901000000eb46b903000000eb3ff6c30175358b0a83390d751d8b338b79043b3e75148b730489f38b720489f23b650c7303ff5524ebbfb901000000eb0fe904010000e942000000b90100000083f9017507b801000000eb378b400c8b48088b5104833a057507b801000000eb228b45008d40f83b45087303ff5520894500c740fc010000008908eb06b8010000005183f80175708b45008d40e43b45087303ff5520894500c740fc03000000c7400848c052088b4c24108948048b54241889108d5810c743fc020000008b7424048973048b74240889335350bb010000008b4424148b5424309090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e9110000008941088b04248941048b4424188901eb298b4d008d49f03b4d087303ff5520894d00c741fc030000008b008941088b04248941048b442418890183c40451ff7424108b5c24309090e8da3ffcff8b45008d40f43b45087303ff5520894500c740fc020000008b0c248948048b54241889108b5424249090ff128b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c2489088b54241489028b4424208b55008d52e83b55087303ff5520895500c742fc02000000c7420401000000890a8b480c8d420cc740fc020000008950048b542418891089ca83c41c5983c41051ff2290000000002c030000|@14371,1048575,@2970|40,0,0 63,0,0 103,0,2 120,0,0 177,0,I48 207,0,@5413 221,0,0 308,0,0 315,0,1 363,0,0 380,0,0 390,0,0 411,0,0 446,0,0 483,0,I48 526,0,0 646,1,@12947 721,0,0 767,0,0 14371:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f6365737354797065283229 14372:D3,616|8d7c24943b7d0c7303ff55288b4c2428f6c101740583c1027105ff5538ebf689c28b45008d40f43b45087303ff5520894500c740fc02000000c700c0da8ab28948048060ffbf5152538b1390ff128b4424388b088b45008d40f03b45087303ff5520894500c740fc03000000c700c4dc8ab28b5424308950048b5c24088958088060ffbf89ca9090ff128b45008d40f03b45087303ff5520894500c740fc03000000c70058de8ab28b4c242c8948048b5424288950088060ffbf6a016a016a0189e3909090e8ee62fcff6a016a016a0189e3b8010000009090e8de12fcffff742404ff742448ff742444ff742454ff742450ff7424348b5c24288b442434909090e8e605000089c18b54241c50f6c1017562f6c201755dff7204ff7104ff742454ff742418ff74242cff742468ff74241cff742458ff742468ff74245cff74245cff74245cff742454ff742460ff742478ffb424800000008b1a8b0190e8620800008b5424045983c4043b650c7303ff5524eb99b8010000005883c40c8b4c241083f801750f83f9017470b8e43086b28b5d04ff13f6c101740f8b50048b18b8e43086b28b5d04ff138b11ff7104ff7004ff7208ff308b4204e8ca65ffff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c701c0e98ab28b5424448951048b5c24488959088061ffbf5053ff74240c51ff742450eb05e92a0000008b5c24388b442414bab4ac8ab2e892d2ffff8b4c240c83c4085883c4043b650c7303ff5524e957ffffff8b45008d40f43b45087303ff5520894500c740fc02000000c70034ea8ab28b4c243c8948048060ffbf5a83c4145b83c42c53ff2290900000000064020000|@14401,2097151,@2987|59,0,@14373 110,0,@14377 164,0,@14379 198,1,@13015 211,0,0 218,1,@12896 258,1,@14381 350,1,@14386 373,0,0 396,0,@11846 416,0,@11846 442,1,@14115 472,0,@14398 521,0,@14295 526,1,@14296 580,0,@14399 14373:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14376,2097151,@2972|26,1,@14374 14374:D3,276|3b650c7303ff55248b45008d40f03b45087303ff5520894500c740fc030000008b4b048948088b13895004c7000d000000e8ba2ef0ff83380d740e89c1b898427bb28b5d049090ff138b480883e10983f9017407b901000000eb05b90300000083f1028b500883e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2f64424040175148b7c24048b37f647ff107402f7de8d743601eb048b7424048d34f5f9ffffff83f9017507b901000000eb05b9090000000bce83c9050bca8b55008d52f03b55087303ff5520895500c742fc03000000894a08895a04c7020d0000008b40048910b801000000c2040090900000000010010000|@14375,2097151,@2971|45,0,6 50,1,@6447 62,0,@6567 85,0,0 92,0,1 111,0,0 118,0,1 151,0,@5413 199,0,0 206,0,4 249,0,6 259,0,0 14375:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283229 14376:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283129 14377:D3,44|3b650c7303ff55248b4a048b1c24890c24ff720889de8b58048b3889f856e91d000000900000000028000000|@14376,2097151,@2974|31,1,@14378 14378:D3,320|3b650c7303ff55248b4c2408538b5130ff1283f80175588b04248b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7000d0000009090e89e2cf0ff83380d740e89c1b898427bb28b5d049090ff138b480883e10983f901740cb901000000eb0ae9b2000000b90300000083f1028b500883e20383fa017407ba01000000eb05ba0300000083f2028b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703ec7d7ab2f64424080175148b7c24088b37f647ff107402f7de8d743601eb048b7424088d34f5f9ffffff83f9017507b901000000eb05b9090000000bce83c9050bca8b55008d52f03b55087303ff5520895500c742fc03000000894a08895a04c7020d0000008b40048910b80100000083c404c208008b1c248b0083c4045983c40851e944aeffff000000003c010000|@14375,2097151,@2973|63,0,6 70,1,@6447 82,0,@6567 105,0,0 117,0,1 136,0,0 143,0,1 176,0,@5413 224,0,0 231,0,4 274,0,6 284,0,0 308,1,@14246 14379:D3,112|3b650c7303ff55248b4c24048b5910f6c301751b8b33833e0175058b7e04eb148b730489f33b650c7303ff5524ebe0bfe01687b25752bbe43a89b29090e8fa2cefff8b0c248b510883c404895424085b8b3424891c2450bb030000008b410456e9cbe4feff909090000000006c000000|@14380,2097151,@2975|48,0,@12945 55,0,@13643 62,1,@4940 88,0,1 97,1,@13829 14380:S75|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833296e6577456e762d283329 14381:D3,216|3b650c7303ff5524a80175718b088b55008d52e83b55087303ff5520895500c742fc05000000c7021ce08ab28b710c8972048b7c2418897a088b711089720c895a108062ffbf53ff7004ff74240c6a0168fce08ab256ff74242cff74242cff74242cff74242c89d38b01909090e81e69ffff50ff742424ff742424eb05e946000000ff742424ff742424ff742424ff7424248b5c24208b44241c909090e85effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21800b801000000c2180000000000d4000000|@6329,2097151,@2978|40,0,@14382 81,0,@14384 110,1,@14139 201,0,0 14382:D3,108|3b650c7303ff552452ff7004508b4a1089ca9090ff128b44240883780c01740a8b48088b042489caff128b44240883c4048b48048b098b55008d52f43b55087303ff5520895500c742fc02000000894a0459890a8b400483c4048910b801000000c390900000000068000000|@14383,1048575,@2976|93,0,0 14383:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329646f56616c283129656e74657256616c73283129 14384:O1|@14385 14385:D3,240|8b4d008d49a03b4d087303ff5520894d00c741fc01000040c701ffffffff8d5108c742fc01000040c70228e07bb28d5a08c743fc03000000895308894b04c703050000008d4b10c741fc01000040c701010000008d5108c742fc01000040c702010000008d7208c746fc01000040c706010000008d7e08c747fc03000000897708894f0489178d4f10c741fc0100000089398d5108c742fc01000040c702010000008d7208c746fc0100000089168b50088b7804ff308b45008d40e03b45087303ff5520894500c740fc0700000089701889481489501089780c895808c7400405000000598908c300000000ec000000|@14138,63,@2977|26,0,-1 42,0,@6817 64,0,2 80,0,0 96,0,0 112,0,0 158,0,0 224,0,2 14386:D3,1152|8d7c24a83b7d0c7303ff5528837b100174358b4c24388b55008d52f03b55087303ff5520895500c742fc03000000c7029ce68ab28b71188972048b7c2434897a088062ffbfeb078b4c24388b51188b7424308b7c242cff7308ff7304ff7310508b45008d40ec3b45087303ff5520894500c740fc04000000c700e4e68ab2ff338b59308958048b7f048978088b760489700c8060ffbf8b74244c837c240801742e8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70744e78ab28977048b5c243c895f088067ffbfeb038b7e248b5d008d5bc43b5d087303ff5520895d00c743fc0e000000ff7134508b4424048943345883c4048943308b412c89432c8b4628894328897b248b7920897b208b7e1c897b1c8953188b51148953148b51108953108b4e0c894b0c8b56088953088b56048953048b0e890b53ff742410ff742414ff742440ff742440ff742440ff7424408b5c243c8b4424408b542454909090ff125089c38b442408ba84287bb2909090e82295f0ffa8017571ff30ff74240cff742440ff74242c8b5c2414b8d8e88ab2e8f24effff50ff742408ff742444ff7424308b5c2424b854a78ab290e8d64effff89c6ff7424286884348ab28b5c24308b442448ba94348ab2909090e8c250ffff5689c18b44240889ca90ff128b4d008d49c43b4d08730aeb05e900020000ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70080dc7bb28d480cc741fc02000000894104c7016c3f8ab28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701e8e88ab28d410cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff138b4c243889c6ff7108ff710cff7110ff7114ff7118ff711cff7120ff7124ff7128ff712cff7130ff7134ff7138ff713cff71408b59048b01e84edffeff5689c38b442420ba68bf88b2909090e8d6d9fdff8b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241889500c5b895808894804c700030000008b4c24388b590cc703030000008b51309090ff12eb05b801000000837c240c01746d8b44241083382d750d8b40043b650c7303ff5524ebee8338177507b803000000eb1783380b750d8b40083b650c7303ff5524ebd0b80100000083f801752f8b4424388b4c241c894c24508b5424148954244cba2ce98ab289542448bb0300000083c4185a83c42c52e913ddfeffb80100000083c418c23800000000007c040000|@14397,2097151,@2984|48,0,@14387 122,0,@14388 187,0,@14389 366,0,@6509 374,1,@6714 401,0,@14393 406,1,@14091 428,0,@14272 434,1,@14091 445,0,@14093 458,0,@14094 466,1,@14095 516,0,0 539,0,@6812 558,0,@14111 578,0,0 585,0,0 592,0,0 598,0,0 609,0,@6321 648,0,0 671,0,@5592 720,0,@5592 772,0,@5592 791,0,@14394 811,0,0 818,0,1 825,0,3 831,0,0 842,0,@6321 910,1,@13830 922,0,@13447 930,1,@13449 986,0,1 999,0,1 1013,0,0 1052,0,1 1077,0,0 1107,0,@14396 1116,0,1 1129,1,@13829 1134,0,0 14387:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@2979| 14388:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@2980| 14389:D3,124|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc01000040c7000100000089c18d4008c740fc02000000c700d4e78ab28948048060ffbf52518b5a0889da9090ff12588b008b0c248b490483c40450b8010000008b512490ff1283f801750258c389c358e96b0000009090900000000078000000|@14392,1048575,@2983|34,0,0 52,0,@14390 88,0,0 109,1,@14391 14390:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@14078,15,@2981|42,0,0 14391:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2982| 14392:S88|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b54797065732832296e6577456e762d283129 14393:S8|5061747465726e3a 14394:O2|3,@14395 14395:S47|5061747465726e20616e642065787072657373696f6e206861766520696e636f6d70617469626c652074797065732e 14396:S51|526563757273697665206465636c61726174696f6e206973206e6f74206f662074686520666f726d2060666e206d6174636827 14397:S78|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b5479706573283229 14398:D3,96|3b650c7303ff55248b420889d6ff7008ff700cff7010ff7014ff7018ff701cff7020ff7024ff7028ff702cff7030ff7034ff7038ff703cff70408b58048b0889c8e8e2dafeff89c38b4604ba68bf88b2e96fd5fdff909090000000005c000000|@14294,2097151,@2985|66,1,@13830 76,0,@13447 81,1,@13449 14399:D3,88|3b650c7303ff55248b480483791801750c8b18b84cc37bb28b5d04ff138b59188b33c706010000008b52048b388b45008d40f43b45087303ff5520894500c740fc0200000089480489388b5208ff22900000000054000000|@14400,1048575,@2986|20,0,@6769 36,0,0 14400:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329656e746572446563283129 14401:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329 14402:S6|5768696c653a 14403:O2|3,@14404 14404:S55|4c6f6f7020636f6e646974696f6e206f66207768696c652d65787072657373696f6e206d7573742068617665207479706520626f6f6c2e 14405:S57|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229 14406:S45|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529 14407:S30|54595045434845434b5f50415253455452454528292e7061737332283529 14408:D3,6460|3b650c7303ff5524535052ff70088b58048b0889c8e8361900008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701ec078bb28b5424088951048061ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b04c70313000000f6c301740c89c1b8ecd57ab28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891983f901740789cbe87a1b00008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701b4088bb28b14248951048b5c24048959088b74240889710c8061ffbf8b7d008d7fe43b7d087303ff5520897d00c747fc01000040c707010000008d7708c746fc04000000c7064c098bb28b5a0c895e048b5a08895e088b5a10895e0c8066ffbf89378b75008d76f43b75087303ff5520897500c746fc02000000c70660188bb28b3c24897e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c70794198bb28b14248957048067ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703dc3a8bb2508b42048943048063ffbf8b44240c8b10b8eaed8ab28d4490fcffe09090e96e030000909090e937040000909090e9c7040000909090e9ed060000909090e931080000909090e91f090000909090e9e1090000909090e9fa090000909090e9100a0000909090e9250a0000909090e9a70a0000909090e9ff0a0000909090e9b50b0000909090e9b80c0000909090e983000000909090e9a20d0000909090e97a0e0000909090e90b0f0000909090e9c50f0000909090e931100000909090e9ab100000909090e907110000909090e997110000909090e9ae110000909090e962120000909090e9cd120000909090e989130000909090e9eb130000909090e922140000909090e9b7150000909090e9741600009090908b44240c8b48048b51088b128b59048b1b6a016a016a01813bb0cf87b27439f60301752a8b33bfb0cf87b28b410cff31ff7110b91f000000d1e93bc9f3a68d7c3f018d7436018d4c09017414eb6eff31ff71108b410ceb69ff31ff71108b410c8b0c248b095052b80100000089caff128b5c240c909090e8965100008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b4508730feb0ae939000000e934000000ff5520894500c740fc02000000c740040100000089088d4c2410c701010000008d4c2410c74104010000008d4c2410894108eb2b89c75752ff73148b4310909090e89ae4efff8d4c241489018d442414598948048d442410c7400801000000f64424140175748b4424148b088b118b128b59048b1b8b71088b3689d789f0909090e8b651000083ff01740d89de89fb9090e80652000089f38b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895904c70115000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40f43b4508730aeb05e918000000ff5520894500c740fc02000000c74004010000008908eb05b8010000008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c7011b000000f6c101740e89c2b8ecd57ab28b5d049090ff13837c241401741089ce8b5c2414909090e8ae51000089f183f80175068b442418eb1189ce89c38b4424189090e8ea51000089f183f80175068b44240ceb1189ce89c38b44240c9090e82652000089f18b55008d52f43b55087303ff5520895500c742fc02000000894204890a8b44242c5983c4148908895004b80100000083c410c204008b44240c8b500489cb8b7204ff32ff72108b4208e82e520000508b4424049090e8a2520000535657508b442418909090e81253000083f80175058b0424eb0a89c38b0424e88653000083f80175068b442410eb0d89c38b4424109090e8c65300008b4d008d49f83b4d087303ff5520894d00c741fc010000008b54240c83c40489118b55008d52f43b55087303ff5520895500c742fc02000000894a0459890a89d39090e86a3a0000837c24140174098b5c2414e8c65300008b4c24285a83c4108911894104b80100000083c410c204008b44240c8b55008d52ec3b55087303ff5520895500c742fc01000000890a8b4c24048d5a08c743fc020000008953048b4904890b8b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b500889118d710cc746fc02000000894e048b4804890e8b780c89f0e8ce390000833c2401740a8b1c249090e8825300008b4c24148939894104b80100000083c410c204008b44240c8b50048b5a04833b33755cf6430401755b8b7304f6460401756b8b7e04837f04017567837a0c0375668b42088b008b5d008d5bf43b5d087303ff5520895d00c743fc02000000894304c7031b000000f6c301740bb8ecd57ab28b5d0490ff138b45008d40f8eb0ae9d3000000e9ce0000003b45087303ff5520894500c740fc01000000eb0fe9b5000000e9b0000000e9ab00000089088b4c2404ff7210538b5d008d5bd03b5d087303ff5520895d00c743fc020000008943048b4904890b8d430cc740fc02000000c74004010000008b3f89388d480cc741fc020000008941048b1289118d410cc740fc020000008948048b3689309090e8aa380000837c24080174098b5c2408e8b65200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b4424185a8910894804b80100000083c410c204008b72088b368b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704c7071b000000f7c701000000740ab8ecd57ab28b5d04ff138b75008d76ec3b75087303ff5520897500c746fc01000000890e8b4c24048d4608c740fc020000008970048b490489088b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089198d710cc746fc02000000894e048b0a890eff721089c389f0909090e8be370000837c24040174098b5c2404e8225200008b4d008d49f43b4d087303ff5520894d00c741fc0200000089410489398b4424185a8910894804b80100000083c410c204008b44240c8b50048b72088b368b7d008d7fe83b7d087303ff5520897d00c747fc05000040c7073c478bb28b4424048947048b02894708c7470c01000000894f108b45008d40e43b45087303ff5520894500c740fc06000000c70014488bb2518b4a108948048978088b0c2489480c8b4a048948108958148060ffbf89470c8067ffbf8b45008d40f43b45087303ff5520894500c740fc02000000897804c70009000000a801740e89c3b8ecd57ab28b5d049090ff138b5d008d5bf43b5d087303ff5520895d00c743fc02000000897304c7031b000000f6c301740e89c6b8ecd57ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc02000000c7460401000000891e8d5e0cc743fc020000008973048903837c24040174128b720c89d88b5c2404e85e53000089c3eb038b720c8b44241883c4048930895804b80100000083c410c204008b44240c8b50048b5d008d5bcc3b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc0200000089590489318d590cc743fc01000040c703010000008d7308c746fc02000000895e048b1a891e8d7e0cc747fc020000008b42148947048b5a08891f8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b42108943048b420489038b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089188d580cc743fc02000000894304893b8d430cc740fc0200000089580489308b7a0c89cbe85e350000833c2401740a8b1c249090e8b65200008b4c24148939894104b80100000083c410c204008b44240c8b55008d52d43b55087303ff5520895500c742fc04000040c702304a8bb28b5804895a04c7420801000000894a0c8d7214c746fc05000000c706e04a8bb28b7c2404897e048b7808897e0889560c894e108066ffbf8972088062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897104c70109000000f6c101740d8b500cb8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc020000008b3424897204890a8b4c24148b700c8931895104b80100000083c410c204008b44240c8b40048b4c24148b401089018b0424894104b80100000083c410c204008b44240c8b4c24148b400c89018b0424894104b80100000083c410c204008b4424149090c700e01687b28b0c24894804b80100000083c410c204008b44240c8b55008d52f43b55087303ff5520895500c742fc02000000c702804b8bb28b5c2404895a048062ffbf8b5d008d5bec3b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc0200000089590489118b780889cb8b4004909090e8ae330000833c2401740a8b1c249090e8325c00008b4c24148939894104b80100000083c410c204008b44240c8b55008d52ec3b55087303ff5520895500c742fc01000000890a8d4a08c741fc0200000089510489318b780889cb8b40049090e84e330000833c2401740a8b1c249090e82a5c00008b4c24148939894104b80100000083c410c204008b44240c8b50048b128b75008d76f43b75087303ff5520897500c746fc02000000895604c7061b000000f7c60100000074118b500c8b7808b8ecd57ab28b5d0490ff138b55008d52ec3b55087303ff5520895500c742fc01000000890a8d4a08c741fc0200000089510489198b780c5689cb8b40089090e8ae320000837c24040174098b5c2404e8e25b00008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b4424148938894804b80100000083c410c204008b44240c8b55008d52e83b55087303ff5520895500c742fc01000040c702010000008b5c24048d7208c746fc03000000c7060c568bb28956048b7b08897e088066ffbf89328b55008d52e43b55087303ff5520895500c742fc02000040c702f0798bb2c74204010000008d720cc746fc03000000c7065c7a8bb2895604895e088066ffbf8972048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c7065c7f8bb28956048066ffbf8b55008d52ec3b55087303ff5520895500c742fc01000000890a8d4a08c741fc020000008951048931ff701089cb8b4004e886310000837c24040174098b5c2404e8969000008b4c24185a8911894104b80100000083c410c204008b44240c8b55008d52e83b55087303ff5520895500c742fc05000040c702e88b8bb28b7424048972048b7804897a08c7420c01000000894a108b75008d76e43b75087303ff5520897500c746fc06000000c706888c8bb28b7810897e04895608894e0c8b7808897e10895e148066ffbf89720c8062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000895104c70109000000f6c101740d8b500cb8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a833c240174128b700c8b1c2489d090e8ce91000089c2eb038b700c8b4424148930895004b80100000083c410c204008b44240c8b50088b128b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703148e8bb28b7424048973048063ffbf8b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc0200000089710489198b78105289cb8b400ce8fe2f00008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c7011b000000f6c101740c89c2b8ecd57ab28b5d04ff13833c2401740d89ce8b1c2490e8e296000089f18b55008d52f43b55087303ff5520895500c742fc02000000894204890a8b4424148938895004b80100000083c410c204008b44240c8b55008d52ec3b55087303ff5520895500c742fc01000000890a8b4c24048d5a08c743fc020000008953048b4904890b8b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b500889118d710cc746fc02000000894e048b4804890e8b780c89f090e8122f0000833c2401740a8b1c249090e8829600008b4c24148939894104b80100000083c410c204008b44240c8b50048b128b5d008d5bf43b5d087303ff5520895d00c743fc02000000895304c7031b000000f6c30174108b500c8b7008b8ecd57ab28b5d04ff138b55008d52ec3b55087303ff5520895500c742fc01000000890a8b4c24048d7208c746fc020000008956048b4904890e8b780c5389f38b4008909090e86e2e0000837c24040174098b5c2404e8369600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b4424148938894804b80100000083c410c204008b44240c8b48048b098b55008d52f43b55087303ff5520895500c742fc02000000894a04c7021b000000f6c201740e8b480cb8ecd57ab28b5d0490ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b1c2489590489118b5424148b400c8902894a04b80100000083c410c204008b44240c8b50048b5d008d5bec3b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc020000008959048931833a0175058b5a04eb168b720c89cf8b1a8b420490e89e95000089c389f9eb038b720c89f789d889cbe85a2d0000833c2401740a8b1c249090e8d29500008b4c24148939894104b80100000083c410c204008b44240c8b50048b5d008d5bec3b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc02000000895904c70150958bb28b7a0489cb8b02e8f62c0000833c2401740a8b1c249090e80a9700008b4c24148939894104b80100000083c410c204008b44240c8b55008d52ec3b55087303ff5520895500c742fc01000000890a8b4c24048d5a08c743fc020000008953048b4904890b8b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104010000008b500889118d710cc746fc02000000894e048b4804890e8b780c89f0e85e2c0000833c2401740a8b1c249090e8ca9600008b4c24148939894104b80100000083c410c204008b44240c8b4c2414894c24148b58048b44240883c4045a83c408e9ebebffff8b44240c8b55008d52ec3b55087303ff5520895500c742fc04000000c70244978bb28b5c2404895a048b5804895a08894a0c8062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000895104c70109000000f6c10174108b5008b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a833c240174128b70088b1c2489d090e81697000089c2eb038b70088b4424148930895004b80100000083c410c204008b44240c8b4d008d49f43b4d087303ff5520894d00c741fc020000008b5008895104c7011b000000f6c101740f8b5010b8ecd57ab28b5d049090ff138b5d008d5bf43b5d087303ff5520895d00c743fc020000008b3424897304890b8b4c24148b70108931895904b80100000083c410c204008b44240c8b50088b128b5d008d5bf43b5d087303ff5520895d00c743fc02000000895304c7031b000000f6c30174128b500c8b7004b8ecd57ab28b5d049090ff138b55008d52ec3b55087303ff5520895500c742fc01000000890a8b4c24048d7208c746fc020000008956048b4904890e8b780c5389f38b4004909090e86a2a0000837c24040174098b5c2404e84e9600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b4424148938894804b80100000083c410c204008b44240c89cb8b70088b400490e8629600008b4d008d49ec3b4d087303ff5520894d00c741fc0100000089198d5108c742fc02000000894a04893a89f789d39090e8e2290000833c2401740a8b1c249090e89e9600008b4c24148939894104b80100000083c410c204008b44240c8b4d008d49f43b4d087303ff5520894d00c741fc020000008b1424895104c70194998bb28b5424148b40048902894a04b80100000083c410c204008b44240c8b5424048b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703a0998bb28b72048973048063ffbf8b7d008d7fec3b7d087303ff5520897d00c747fc01000000890f8d4f08c741fc0200000089790489198b7810ff700489cb8b0424e816290000f604240175558b0c248b118b1a833b1d754e8b7304813efc8b88b27432f606017527ff365e57bffc8b88b2ff7104b90d000000d1e93bc9f3a68d7c3f018d7436018d4c0901740ceb5257ff7104eb5157ff7104833c2401755ceb0fe905000000576a01eb62576a01eb628b4c24088b318b3e8b57048b5a0c8b4b10f6c1017509f6430c017503ff55383b4b0c75538b7b08f7c7010000007515eb0ae96c000000e967000000f64304017503ff55383b7b04752eeb05e9520000008b442420894424208b5e04eb0ae940000000e93b0000008b44241483c4105a83c408e905e8ffff837c240c01740c8b5c240c909090e8e69700008b4c24208b5424048911894104b80100000083c41cc20400837c240c0174098b5c240ce8169800008b4c24208b5424048911894104b80100000083c41cc204008b44240c8b55008d52cc3b55087303ff5520895500c742fc01000000890a8d4a08c741fc0200000089510489318d510cc742fc01000040c702010000008d5a08c743fc020000008953048b500889138d730cc746fc020000008b7810897e048b500489168b55008d52e83b55087303ff5520895500c742fc02000000c742040100000089328d720cc746fc02000000895604891eff700c89cb89f0e842270000837c24040174098b5c2404e8a69700008b4c24185a8911894104b80100000083c410c204008b44240c8b4c24148b400489018b0424894104b80100000083c410c204009090900000000038190000|@14741,1048575,@3154|22,1,@14409 52,0,@14413 96,0,9 108,0,@6321 144,0,0 158,1,@14415 188,0,@14416 242,0,0 258,0,@14418 312,0,@14459 352,0,@14461 392,0,@14533 414,0,$14408+426 699,0,@13163 713,0,@13163 726,0,15 778,0,0 794,1,@14545 827,0,1 837,0,@6321 888,0,0 900,0,0 911,0,0 938,1,@6320 963,0,0 1002,1,@14546 1018,1,@14547 1056,0,10 1066,0,@6321 1111,0,0 1120,0,0 1154,0,13 1166,0,@6321 1194,1,@14548 1222,1,@14549 1250,1,@14550 1299,0,0 1330,1,@14551 1342,1,@14552 1358,1,@14553 1378,1,@14554 1402,1,@14555 1474,1,@14489 1490,1,@14556 1508,0,0 1597,0,0 1630,1,@14489 1646,1,@14557 1660,0,0 1749,0,13 1759,0,@6321 1877,0,0 1922,1,@14489 1938,1,@14558 1983,0,0 2027,0,13 2040,0,@6321 2124,0,0 2158,1,@14489 2174,1,@14559 2218,0,0 2266,0,@14560 2285,0,0 2318,0,@14562 2387,0,4 2398,0,@6321 2438,0,13 2450,0,@6321 2488,0,0 2526,1,@14565 2550,0,0 2620,0,0 2724,0,0 2766,1,@14489 2782,1,@14566 2796,0,0 2836,0,@14567 2849,0,0 2868,0,@14569 2931,0,4 2944,0,@6321 2998,0,0 3031,0,0 3061,0,0 3079,0,@12945 3090,0,0 3130,0,@14570 3198,1,@14489 3214,1,@14590 3228,0,0 3294,1,@14489 3310,1,@14591 3324,0,0 3372,0,13 3391,0,@6321 3454,1,@14489 3470,1,@14592 3514,0,0 3554,0,0 3574,0,@14593 3619,0,@14660 3626,0,0 3642,0,@14662 3689,0,@14670 3750,1,@14489 3766,1,@14696 3781,0,0 3821,0,@14697 3841,0,0 3874,0,@14698 3939,0,4 3952,0,@6321 3988,0,0 4010,1,@14700 4031,0,0 4076,0,@14701 4142,1,@14489 4176,0,13 4188,0,@6321 4210,1,@14712 4255,0,0 4344,0,0 4378,1,@14489 4394,1,@14713 4408,0,0 4456,0,13 4472,0,@6321 4542,1,@14489 4558,1,@14714 4602,0,0 4650,0,13 4663,0,@6321 4718,0,0 4798,1,@14715 4818,1,@14489 4834,1,@14716 4848,0,0 4906,0,@14717 4918,1,@14489 4934,1,@14721 4948,0,0 5037,0,0 5070,1,@14489 5086,1,@14722 5100,0,0 5171,0,@14723 5224,0,4 5237,0,@6321 5276,0,0 5298,1,@14725 5319,0,0 5365,0,13 5378,0,@6321 5434,0,0 5482,0,13 5498,0,@6321 5570,1,@14489 5586,1,@14726 5630,0,0 5654,1,@14727 5706,1,@14489 5722,1,@14728 5736,0,0 5782,0,@14729 5799,0,0 5843,0,@14730 5910,1,@14489 5937,0,@13367 5953,0,@13367 5961,0,6 6154,1,@14738 6172,0,0 6194,1,@14739 6212,0,0 6279,0,0 6349,0,0 6378,1,@14489 6394,1,@14740 6409,0,0 6439,0,0 14409:D3,360|3b650c7303ff5524f6c30175578b4d008d49f43b4d087303ff5520894d00c741fc020000008b1b895904c7010f000000f6c101740c89c2b8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890aeb05ba01000000f644240401755c8b4c24048b5d008d5bf43b5d087303ff5520895d00c743fc020000008b31897304c70311000000f6c301740d89c7b8ecd57ab28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7470401000000891feb05bf01000000a80175578b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c7010b000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908eb05b80100000083f801741089d689c389f890e83a00000089c789f283ff01750589d0c2040089fb89d05983c40451e97600000090900000000064010000|@14412,63,@2993|44,0,7 56,0,@6321 92,0,0 101,0,0 147,0,8 159,0,@6321 196,0,0 205,0,0 244,0,5 254,0,@6321 292,0,0 301,0,0 318,1,@14410 346,1,@14411 14410:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2991| 14411:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2992| 14412:S37|4578706f72745472656528292e6578706f72744e617669676174696f6e50726f7073283329 14413:D3,32|3b650c7303ff552489c38b4204ba68bf88b2e981b7fdff90000000001c000000|@14414,2097151,@2994|14,0,@13447 19,1,@13449 14414:S50|4558504f52545f50415253455452454528292e6765744578706f727454726565283229636f6d6d6f6e50726f70732d283129 14415:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@2995| 14416:D3,76|3b650c7303ff55246a016a0189e0508b5a0c8b42088b4a0489ca9090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000048000000|@14417,1048575,@2996| 14417:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296173506172656e74283129 14418:D3,1332|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01755bf6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b4b04890e8b52048b1289f0ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451745aeb05e91f010000817a04f7000000746d817a04b700000074698b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb0ae954000000e94f000000c706f0a47ab28d5e0cc743fc02000000897304c703b89a7ab28d730ceb0ae92c000000e927000000c746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700940e8bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38833f03756cf7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80977ab2eb7089f1f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4f04890b8b52088b12ff77085689d8eb05e95701000090ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e978000000894a0459890a8b0d9ce839b25052b85c168bb289ca9090ff1289c15889ca90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40a03b45087303ff5520894500c740fc02000000895004c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700d0178bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4f04890b8b520c8b1289d890ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c7000c188bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000030050000|@14458,1048575,@3005|30,0,@6514 141,0,123 150,0,91 183,0,@5642 228,0,@5643 247,0,@5594 279,0,0 286,0,1 293,0,3 299,0,0 338,0,0 359,0,@5592 378,0,@14419 400,0,0 407,0,0 414,0,1 420,0,0 450,0,@6514 502,0,@5580 633,0,@4730 640,0,@14438 685,0,@5590 706,0,@5592 725,0,@5593 774,0,@5594 794,0,0 801,0,0 808,0,1 814,0,0 831,0,0 852,0,@5592 871,0,@14450 893,0,0 900,0,0 907,0,1 913,0,0 940,0,@6514 1038,0,123 1047,0,91 1080,0,@5642 1118,0,@5643 1154,0,@5594 1174,0,0 1181,0,1 1188,0,3 1194,0,0 1233,0,0 1254,0,@5592 1275,0,@14454 1297,0,0 1304,0,0 1311,0,1 1317,0,0 14419:O5|0,0,0,@14421,@14420 14420:O2|@14425,0 14421:O2|@14422,0 14422:O2|0,@14423 14423:O5|@14424,66,66,0,0 14424:S50|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4558504f52545f5041525345545245452e736d6c 14425:O2|3,@14426 14426:S5|4461746154 14427:O2|@14428,@4731 14428:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700980f8bb28b52048950048948088060ffbfc390900000000034000000|@4958,7,@3000|28,0,@14429 14429:D3,52|3b650c7303ff55248b4a08ff710468e00f8bb2ff7004ff72048d5c24088b009090e88200000083c408c390900000000030000000|@8568,1048575,@2999|15,0,@14430 34,1,@14432 14430:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@14431,1048575,@2997| 14431:S14|7072696e745f7265662833292d45 14432:D3,1444|3b650c7303ff55248b088b542408f6c201740783fa017f10eb06f642ff107408b8ec087ab2c208008b753c8b7608f7c601000000754b8b168b128b3a3b7c240475323b7c2404740d89c6b854eb7ab28b5d0490ff138b75008d76f83b75087303ff5520897500c746fc010000008b7a08893eeb128b76043b650c7303ff5524ebadbe01000000f7c60100000075048b36eb05be0100000089f2f6c20175183b027507ba03000000eb128b52043b650c7303ff5524ebe3ba0100000083fa017408b8ec087ab2c2080056ff7504bada148bb2528965048b55008d52f43b55087303ff5520895500c742fc0200000089720489028b453c8b400889c7f7c701000000754f8b378b368b363b74241075368b75008d76ec3b75087303ff5520897500c746fc04000000c7460c01000000895608c746048b000000518b4c2414890e8b3f8937eb6c8b7f043b650c7303ff5524eba98b753c8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470c01000000895708c747048b000000518b4c2414890f8b4d008d49ec3b4d087303ff5520894d00c741fc0100004089398d7908c747fc02000000894704890f897e088b442418a801740583e8027105ff5538ebf689d989c35889ca909090ff128338017554f640100175538b48108379040174618b11833a07755f817a04b7000000745b817a04f7000000746d837a0451746c8b5d008d5bd03b5d087303ff5520895d00c743fc02000000c74304e8177ab289038d730ceb0ae91d010000e9ba000000c746fc02000000895e04c7061c187ab2eb0fe901010000e93b000000e9f70000008d460cc740fc05000000897010c7400c01000000eb0ae9dc000000e9d7000000c7400803000000c7400407000000c70001000000eb5e8b5d008d5bd03b5d087303ff5520895d00c743fc02000000c74304e8177ab289038d730cc746fc02000000895e04c7061c187ab28d460cc740fc05000000897010c7400c01000000c7400803000000c7400407000000c70001000000eb63e95e0000008b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104e8177ab289018d410cc740fc02000000894804c7001c187ab289c18d400cc740fc05000000894810c7400c01000000c7400803000000c7400407000000c700010000008b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c70000187ab28d480cc741fc02000000894104c701f8158bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c700010000008b4d3c8b490889caf6c20175578b1a8b1b8b1b3b5c2410753e8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c010000008b742408897308c743048b0000008b7c2410893b8b12891aba01000000eb718b52043b650c7303ff5524eba48b553c8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c010000008b742408897308c743048b0000008b7c2410893b8b75008d76ec3b75087303ff5520897500c746fc01000040891e8d5e08c743fc02000000894b048933895a08eb05e905000000ba0100000083c40459894d0483c404c20800908b650483c4045b895d048b4d3c8b490889caf6c20175518b1a8b1b8b1b3b5c240875388b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c010000008b3424897308c743048b0000008b7c2408893b8b12891aeb6e8b52043b650c7303ff5524ebaa8b553c8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430c010000008b3424897308c743048b0000008b7c2408893b8b75008d76ec3b75087303ff5520897500c746fc01000040891e8d5e08c743fc02000000894b048933895a088b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c10168bb28b50088951088b58048959048b30893189c88b5d04ff1390909000000000a0050000|@14437,1048575,@2998|33,0,@4918 75,0,@6377 130,0,0 147,0,0 163,0,1 183,0,0 193,0,@4918 205,0,$14432+1178 297,0,0 307,0,69 367,0,0 377,0,69 492,0,91 501,0,123 540,0,@4990 573,0,@4994 610,0,0 629,0,1 636,0,3 642,0,0 675,0,@4990 696,0,@4994 716,0,0 723,0,1 730,0,3 736,0,0 774,0,@4990 795,0,@4994 817,0,0 824,0,1 831,0,3 837,0,0 868,0,0 891,0,@4992 910,0,@14433 930,0,0 937,0,0 944,0,3 950,0,0 1006,0,0 1020,0,69 1035,0,0 1084,0,0 1098,0,69 1160,0,0 1240,0,0 1253,0,69 1312,0,0 1325,0,69 1406,0,@14435 14433:O2|3,@14434 14434:S3|726566 14435:O5|@14436,117,0,117,0 14436:S22|2e2f62617369732f45786e5072696e7465722e736d6c 14437:S12|7072696e745f726566283329 14438:O4|0,@14439,3,1 14439:O1|@14440 14440:D3,44|3b650c7303ff55248b0d4ce039b250b8b8168bb289ca9090ff1289c15889caff229090900000000028000000|@12247,1048575,@3004|10,0,@4584 16,0,@14441 14441:O4|0,@14442,2,1 14442:O1|@14443 14443:D3,44|3b650c7303ff55248b0d9ce839b250b814178bb289ca9090ff1289c15889caff229090900000000028000000|@14449,1048575,@3003|10,0,@4730 16,0,@14444 14444:O4|0,@14445,1,1 14445:O1|@14446 14446:D3,28|3b650c7303ff55248b0dace839b289caff2290900000000018000000|@7045,1048575,@3002|10,0,@4732 14447:O1|@14448 14448:D3,64|8338017507b8cc807fb2eb05b8c0807fb289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c3909090000000003c000000|@4958,3,@3001|6,0,@8717 13,0,@8716 48,0,3 14449:S9|7072696e742d726566 14450:O5|0,0,0,@14421,@14451 14451:O2|@14452,0 14452:O2|3,@14453 14453:S4|4465636c 14454:O5|0,0,0,@14421,@14455 14455:O2|@14456,0 14456:O2|3,@14457 14457:S5|5479706542 14458:S11|7072696e742d6c54797065 14459:D3,224|3b650c7303ff55248b48048b59048b1bf6c30175726a016a01ff338d5c2404538b198b3089f08b5204909090ff128b45008d40f43b45087303ff5520894500c740fc0200000059894804c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc020000008b54240489510489018d410ceb05e911000000c740fc020000008948045983c4048908c36a016a0189e3538b198b3089f08b5204909090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c300000000dc000000|@14460,1048575,@3006|76,0,0 87,0,@6321 14460:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745472656557697468427074283129 14461:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14532,1048575,@3045|26,1,@14462 14462:D3,1080|3b650c7303ff5524833b03756e8b4b088b09f6c10175696a016a01ff318d4c2404518b5b048b542414909090ff128b45008d40f43b45087303ff5520894500c740fc0200000059894804c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000eb0ae95e000000e91f0000008b54240489510489018d410cc740fc020000008948045983c4048908c204006a016a0189e1518b5b048b5424109090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c20400833b05756d8b4b048379080175698b55008d52ec3b55087303ff5520895500c742fc04000000c7021c1e8bb2894204895a088b74240489720c8062ffbf8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c707ac1e8bb28b19895f048b5910895f0889570c8067ffbf8b5500eb0ae9af010000e9830000008d52f43b55087303ff5520895500c742fc02000000897a04c70209000000f6c201740c89c7b8ecd57ab28b5d04ff13ff710c52ff70088b58048b0889c89090e822eaffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b51088b75008d76ec3b75087303ff5520897500c746fc04000000c706c0218bb2894604895e088b7c2404897e0c8066ffbf8b5d008d5bec3b5d087303ff5520895d00c743fc04000040c703fc218bb28b3a897b04c743080100000089730c8b7d008d7fe83b7d087303ff5520897d00c747fc05000000c707fc368bb2508b018947048b4110894708895f0c8977108067ffbf897b088063ffbf8b55008d52f43b55087303ff5520895500c742fc02000000897a04c70209000000f6c201740cb8ecd57ab28b5d049090ff138b1c24ff710c52ff73088b73048b3b89f389f890e8fee8ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c204008b4b048b55008d52ec3b55087303ff5520895500c742fc04000000c7027c378bb2894204895a088b74240489720c8062ffbf8b7d008d7fe83b7d087303ff5520897d00c747fc05000040c707b8378bb28b590c895f04c747080100000089570c8b5908895f108b5d008d5be83b5d087303ff5520895d00c743fc05000000c703dc398bb28b318973048b7110897308897b0c8953108063ffbf895f088067ffbf8b55008d52f43b55087303ff5520895500c742fc02000000895a04c70209000000f6c201740f89c3b8ecd57ab28b5d04909090ff13ff710c52ff70088b58048b3889f89090e8d2e7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204009090900000000034040000|@14531,1048575,@3044|76,0,0 87,0,@6321 262,0,@14463 309,0,@14466 372,0,4 384,0,@6321 410,1,@14409 506,0,@14474 553,0,@14475 565,0,0 598,0,@14522 660,0,4 670,0,@6321 702,1,@14409 801,0,@14523 848,0,@14524 861,0,0 900,0,@14530 961,0,4 973,0,@6321 1002,1,@14409 14463:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba581e8bb251ff22900000000024000000|@14465,1048575,@3007|24,0,@14464 14464:O1|@14462 14465:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296173506172656e74283129 14466:D3,96|3b650c7303ff55248b45008d40e83b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc03000000c7430801000000894304c703010000008b42088b34248904246a0189df8b5a0489f856e91d00000090000000005c000000|@14473,63,@3012|50,0,0 59,0,0 83,1,@14467 14467:D3,232|3b650c7303ff552453ff70088b58048b0889c89090e856e6ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7011c208bb25a8951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000894a04c70213000000f6c201740f89c1b8ecd57ab28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000891183f901740789cbe8da00000083f80175068b442404eb0d89c38b4424049090e81a01000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b4c24088908c2080000000000e4000000|@14472,63,@3011|22,1,@14409 52,0,@14468 93,0,9 105,0,@6321 144,0,0 158,1,@14470 182,1,@14471 14468:D3,64|8b45008d40f43b45087303ff5520894500c740fc020000008b5204895004c70007000000a801740d89c1b8ecd57ab28b5d0490ff13c39090000000003c000000|@14469,7,@3008|32,0,3 43,0,@6321 14469:S34|4578706f72745472656528292e676574537472696e67417354726565283429283129 14470:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3009| 14471:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3010| 14472:S31|4578706f72745472656528292e676574537472696e67417354726565283429 14473:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296765744e616d65283129 14474:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba581e8bb251ff22900000000024000000|@14465,1048575,@3013|24,0,@14464 14475:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8ba74228bb2e93f0000009090900000000060000000|@14521,2097151,@3037|70,0,0 80,0,@14476 85,1,@14478 14476:O4|@14478,@6596,@14477,@4643 14477:O2|@14519,@14476 14478:D3,1560|3b650c7303ff552452535089d8e84e88fdff8b4c24088b55008d52f03b55087303ff5520895500c742fc03000000c702c0288bb28b5904895a048942088062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000895604c70613000000f7c601000000740f89c2b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000894204c7021b000000f6c201740e89c7b8ecd57ab28b5d049090ff138b3c24505652ff77088b5f048b079090e83ae2ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045989088b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7013c298bb28b54240c8951048b5c24048959088b5c240889590c8061ffbf8b33bfd6238bb28d7cb7fcffe7e9d9020000909090e923000000909090e9f0020000909090e98e030000909090e9ac030000909090e9330400009090908b73046a016a018b7c2408833f0b75628b570c8b5a08ff7610508b430483380375288b52088b52048b44241c8b52043b500c75168d5424088b7f08893a8d542408c7420401000000eb2d8b470c51ff760cff7608ff368b500489d0e822b0efff8d4c24188b7f0889398d4c2418894104eb2ee90b00000051ff760cff7608ff36eb1e89e7c70748c0520889e7c7470401000000ff76105051ff760cff7608ff36f6042401756e8b042483780401756a8b4d008d49e43b4d087303ff5520894d00c741fc06000040c701a0298bb28b5424188951048b5c24088959088b74241c89710cc74110010000008b7c240c8979148b7d008d7fe83b7d087303ff5520897d00c747fc05000000c707602a8bb28b5c242ceb0ae955010000e970000000895f048b18895f08894f0c8b74240c8977108067ffbf8979108061ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70109000000f6c101740ab8ecd57ab28b5d04ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890aeb708b4d008d49c83b4d087303ff5520894d00c741fc06000040c701142b8bb28b5424188951048b5c24088959088b74241c89710cc74110010000008b7c240c8979148b7c242c8d411cc740fc060000009090c700942b8bb28b5c24048958048948088b5c240c89580c8b1c24895810eb05e96f0000008b7f088978148060ffbf8941108061ffbf8b4c242c8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000f6c101740db8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890aeb048b54241c837c241001740d8b5c241089d0e8f609000089c28b45008d40f43b45087303ff5520894500c740fc0200000089500483c4145983c408890883c410c389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c700e01687b283c410c38b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc020000008971048b520889118b55008d52e83b55087303ff5520895500c742fc02000000c74204010000008b730c89328d7a0cc747fc020000008957048b5304891750ff730889cb89f8e826050000837c24040174098b5c2404e87e09000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c404890883c410c389c18b45008d40f43b45087303ff5520894500c740fc020000008948048b5b08891883c410c38b75008d76f43b75087303ff5520897500c746fc02000000c70630318bb28956048066ffbf8b55008d52ec3b55087303ff5520895500c742fc01000000890a8d4a08c741fc02000000895104893189c7ff730c8b430489cb9090e86a04000083ff01740789fbe86e0d000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c410c38b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc020000008971048b5208891189c7ff73088b430489cb90e8fe03000083ff01740789fbe85a0d000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c410c390900000000014060000|@14518,2097151,@3035|14,1,@13419 48,0,@14479 94,0,9 109,0,@6321 150,0,13 162,0,@6321 190,1,@14409 280,0,@14481 312,0,$14478+322 438,0,0 462,1,@6320 504,0,I48 513,0,0 571,0,@14483 599,0,0 636,0,@14485 714,0,4 724,0,@6321 760,0,0 794,0,@14487 822,0,0 851,0,@14488 935,0,4 945,0,@6321 984,0,0 1010,1,@14503 1087,0,@12945 1166,0,0 1202,1,@14489 1218,1,@14504 1325,0,@14505 1390,1,@14489 1402,1,@14516 1498,1,@14489 1510,1,@14517 14479:D3,52|3b650c7303ff552489c389d6b801000000e82e07f0ff8b0c248904246814757bb26a018b46088b560451ff220000000030000000|@14480,1048575,@3014|13,0,0 18,1,@6511 29,0,@6696 14480:S44|545950455f5452454528292e747970654578706f727454726565283229636f6d6d6f6e50726f70732d283129 14481:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@14482,1048575,@3015| 14482:S40|545950455f5452454528292e747970654578706f7274547265652832296173506172656e74283129 14483:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1489088d5808c743fc010000008b721089338d7b08c747fc03000000895f08894704c707010000008b42088b1c24890424ff720c538b5a0489f85f57e91df5ffff900000000068000000|@14484,63,@3016|70,0,0 95,1,@14467 14484:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d6765744e616d65283129 14485:D3,96|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b5a0889f88b4a0489caff229090000000005c000000|@14486,1048575,@3017|65,0,0 14486:S53|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d676574417267283129 14487:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1489088d5808c743fc010000008b721089338d7b08c747fc03000000895f08894704c707010000008b42088b1c24890424ff720c538b5a0489f85f57e9a9f3ffff900000000068000000|@14484,63,@3018|70,0,0 95,1,@14467 14488:D3,200|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc0100000089108d4808c741fc020000008941048b4214890189d789cb8b47109090e89a0000008b4d008d49f03b4d087303ff5520894d00c741fc010000008b570c89118d5908c743fc010000008b7708893357506a015389cb58909090e87ed9ffff83f80175058b0424eb0a89c38b0424e8c20300008b4c240483c40489c28b45008d40f43b45087303ff5520894500c740fc020000008950048b490483c4048908c39000000000c4000000|@14502,63,@3025|62,1,@14489 122,1,@14409 142,1,@14501 14489:D3,156|83f8017506b801000000c38b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701202d8bb28941048b038941088b530489510c8061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000894e04c70609000000f7c601000000740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008930c3900000000098000000|@14500,31,@3023|6,0,0 37,0,@14490 88,0,4 101,0,@6321 140,0,0 14490:D3,44|3b650c7303ff5524b9010000008b1c24890c24ff7208ff720c89d98b5a0451e91c0000000000000028000000|@14497,1048575,@3022|9,0,0 32,1,@14491 14491:D3,272|3b650c7303ff5524f6c301740cb8842e8bb28b5d049090ff138b442408837b04017507b901000000eb728b4d008d49e83b4d087303ff5520894d00c741fc05000000c701dc2e8bb28959048b54240c89510889410c8b7424048971108061ffbf8b7d008d7fe03b7d087303ff5520897d00c747fc01000000890f8d4f08c741fc05000000c701542f8bb28b53048951048979088b7c240889790ceb05e9230000008971108061ffbf518b4d008d49f83b4d087303ff5520894d00c741fc010000005a89118b55008d52e43b55087303ff5520895500c742fc030000008b74240c8972088b7c2404897a04890a89c18d4210c740fc020000008b1b895804891089ca5983c40c51ff22000000000c010000|@14499,1048575,@3021|14,0,@14492 36,0,0 68,0,@14495 134,0,@14498 14492:O4|@4650,@6706,0,@14493 14493:O5|@14494,88,0,88,0 14494:S34|6d6c736f757263652f4d4c436f6d70696c65722f4578706f7274547265652e736d6c 14495:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720cff721089de8b5a04ba1c2f8bb256ff220000000028000000|@14497,1048575,@3019|29,0,@14496 14496:O1|@14491 14497:S40|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283129283129 14498:D3,44|3b650c7303ff55248b4a088b1c24890c24ff720cff721089de8b5a04ba1c2f8bb256ff220000000028000000|@14497,1048575,@3020|29,0,@14496 14499:S37|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283329 14500:S26|4578706f72745472656528292e6578706f72744c697374283229 14501:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3024| 14502:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d67657441726773283129 14503:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3026| 14504:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3027| 14505:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14515,63,@3032|26,1,@14506 14506:D3,316|3b650c7303ff55248b0b8b55008d52ec3b55087303ff5520895500c742fc04000000c702bc328bb2894204895a088b74240489720c8062ffbf8b7d008d7fe83b7d087303ff5520897d00c747fc05000040c70740338bb28977048b7304897708c7470c010000008957108b75008d76e43b75087303ff5520897500c746fc06000000c706f4338bb2ff7308508b018946048b41048946088b430489460c897e108956148066ffbf89770c8067ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897104c70109000000f6c101740db8ecd57ab28b5d04909090ff138b142451ff72088b5a048b02e832d3ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204000000000038010000|@14514,63,@3031|36,0,@14507 83,0,@14510 99,0,0 132,0,@14512 203,0,4 213,0,@6321 238,1,@14409 14507:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204baf8328bb251ff22900000000024000000|@14509,1048575,@3028|24,0,@14508 14508:O1|@14506 14509:S54|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 14510:D3,96|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000008b5a0889f88b4a0489caff229090000000005c000000|@14511,1048575,@3029|70,0,0 14511:S53|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c6428322967657454797065283129 14512:D3,212|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1489088d5808c743fc010000008b721089338d7b08c747fc03000000c7470801000000894704891f52578b420c9090e8aa76fdff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7011b000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089088b4c24048b51088b5c2408895424088944240489d88b590489c65856e961eaffff9000000000d0000000|@14513,2097151,@3030|65,0,0 82,1,@13419 115,0,13 125,0,@6321 164,0,0 199,1,@14467 14513:S52|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296765744c6162283129 14514:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283229 14515:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283129 14516:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3033| 14517:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3034| 14518:S29|545950455f5452454528292e747970654578706f727454726565283229 14519:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@14520,1048575,@3036| 14520:S29|545950455f5452454528292e747970654578706f727454726565283129 14521:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e6728322967657454797065283129 14522:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e9c2e7ffff90900000000068000000|@14473,63,@3038|65,0,0 94,1,@14467 14523:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba581e8bb251ff22900000000024000000|@14465,1048575,@3039|24,0,@14464 14524:D3,200|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc02000000894304c70394388bb289d78b4710e876f4ffff8b4d008d49f03b4d087303ff5520894d00c741fc010000008b570c89118d5908c743fc010000008b7708893357505389cbb80100000090e85acdffff83f80175058b0424eb0a89c38b0424e8ee0000008b4c240483c40489c28b45008d40f43b45087303ff5520894500c740fc020000008950048b490483c4048908c39000000000c4000000|@14529,63,@3042|52,0,@14525 62,1,@14489 116,0,0 122,1,@14409 142,1,@14528 14525:O1|@14526 14526:D3,44|3b650c7303ff55248b48048b118b1c248914246a0189de8b59088b3889f856e960e6ffff0000000028000000|@14527,63,@3040|32,1,@14467 14527:S84|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e737472732831296578706f7274436f6e73747273283129 14528:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3041| 14529:S68|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e73747273283129 14530:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e9e2e4ffff90900000000068000000|@14473,63,@3043|65,0,0 94,1,@14467 14531:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229 14532:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283129 14533:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14544,63,@3052|26,1,@14534 14534:D3,608|3b650c7303ff55248b4b088b098b530c8b128b73148b368b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7078c3d8bb2894704895f08ff7310508b44240c89470c8067ffbff7c60100000075568b45008d40f43b45087303ff5520894500c740fc020000008b36897004c70001000000a801740c89c6b8ecd57ab28b5d04ff138b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008906eb05be010000008b45008d40f43b45087303ff5520894500c740fc02000000c700143e8bb28958048060ffbf568b75008d76f43b75087303ff5520897500c746fc02000000894604c70613000000f7c601000000740db8ecd57ab28b5d04909090ff138b45008d40e43b45087303ff5520894500c740fc03000000895008894804c700050000008d4810c741fc02000000894104c7011b000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40c83b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc0200000089410489318d410cc740fc0100000089388d5008c742fc020000008942048b44241089028d720cc746fc02000000c74604010000008b3b893e8b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b5b04891f5189d389f8909090e876efffff8b4c240850ff71088b59048b019090e882c8ffff837c24080174098b5c2408e85602000083f80175058b0424eb0a89c38b0424e89a02000083f80175068b442404eb0d89c38b4424049090e8da02000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c410598908c20400000000005c020000|@14543,63,@3051|49,0,@14535 113,0,0 124,0,@6321 160,0,0 169,0,0 199,0,@14538 240,0,9 253,0,@6321 297,0,2 316,0,13 326,0,@6321 364,0,0 429,0,0 478,1,@14489 498,1,@14409 514,1,@14540 534,1,@14541 558,1,@14542 14535:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204bac83d8bb251ff22900000000024000000|@14537,1048575,@3046|24,0,@14536 14536:O1|@14534 14537:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d617463682832296173506172656e74283129 14538:D3,272|3b650c7303ff55248b4a0489c3f6c301740583eb027105ff5538ebf6ff31508b4104ba68bf88b29090e84281fdff59f6c101740583e9027105ff5538ebf65089cb8b442404ba68bf88b2909090e81e81fdff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701fc0589b28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c39090000000000c010000|@14539,2097151,@3047|35,0,@13447 42,1,@13449 70,0,@13447 78,1,@13449 109,0,0 130,0,@5592 149,0,@13539 168,0,@5592 221,0,0 228,0,0 235,0,0 241,0,0 252,0,@6321 14539:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229283129 14540:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3048| 14541:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3049| 14542:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3050| 14543:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229 14544:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283129 14545:D3,220|3b650c7303ff5524a801755cf6c3017407b903000000eb068b0b8d4c09018b30f7c6010000007407ba03000000eb068b168d541201f6c1017409f6c20174043bcaeb05ff5538ebf77f6183f903751e83fa0375063bde7558eb310fb64e048d4c09013bd97425eb5be95e00000089de8b3883c60483c704d1e93bc9f3a68d7c3f018d7436018d4c09017538ff308b400490e86affffff89c18b45008d40f43b45087303ff5520894500eb0ae913000000e90e000000c740fc02000000894804598908c38b4004e935ffffffb801000000c390909000000000d8000000|@5094,63,@3053|18,0,1 41,0,1 204,0,0 14546:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3054|60,0,0 14547:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3055| 14548:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3056| 14549:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3057| 14550:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3058| 14551:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70101000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3059|43,0,0 92,0,0 14552:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70105000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3060|43,0,2 92,0,0 14553:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c70203000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@3061|51,0,1 100,0,0 14554:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3062| 14555:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3063| 14556:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3064| 14557:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3065| 14558:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3066| 14559:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3067| 14560:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f6a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14561,1048575,@3068|65,0,0 14561:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657445787072283129 14562:D3,200|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc0100000089108d4808c741fc020000008941048b4214890189d789cb8b47109090e81ae4ffff8b4d008d49f03b4d087303ff5520894d00c741fc010000008b570c89118d5908c743fc010000008b7708893357505389cbb80100000090e8febcffff83f80175058b0424eb0a89c38b0424e84a0000008b4c240483c40489c28b45008d40f43b45087303ff5520894500c740fc020000008950048b490483c4048908c39000000000c4000000|@14564,63,@3070|62,1,@14489 116,0,0 122,1,@14409 142,1,@14563 14563:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3069| 14564:S48|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296765744d617463686573283129 14565:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3071| 14566:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3072| 14567:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8ba74228bb2e90bd8ffff9090900000000060000000|@14568,2097151,@3073|70,0,0 80,0,@14476 85,1,@14478 14568:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657454797065283129 14569:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f6a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14561,1048575,@3074|65,0,0 14570:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14589,63,@3085|26,1,@14571 14571:D3,916|3b650c7303ff5524f6430801756c8b4b088b5314833a1175668b75008d76ec3b75087303ff5520897500c746fc04000000c706644f8bb2894604895e088b7c2404897e0c8066ffbf8b55008d52ec3b55087303ff5520895500c742fc04000040c702ec4f8bb28b39897a04c742080100000089720c8b7d00eb0ae9d6010000e9c00000008d7fe83b7d087303ff5520897d00c747fc05000000c707ac508bb2ff730c508b038947048b431089470889570c8977108067ffbf897a088062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70109000000f6c101740cb8ecd57ab28b5d049090ff138b142451ff72088b5a048b02e8d2b8ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b75008d76ec3b75087303ff5520897500c746fc04000000c70670518bb2894604895e088b7c2404897e0c8066ffbf8b4d008d49d03b4d087303ff5520894d00c741fc05000040c701ac518bb2897904895108c7410c010000008971108d5118c742fc05000000c70298528bb28b3b897a048b7b10897a08894a0c8972108062ffbf89510c8061ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000895104c70109000000f6c101740e89c2b8ecd57ab28b5d049090ff13ff730c51ff70088b58048b1089d09090e8beb7ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204008b4b14833911751c8b531089542404be18538bb28b3c248934248b0b89cb57e9ebd0ffff8b55008d52ec3b55087303ff5520895500c742fc04000000c70230538bb2894204895a088b74240489720c8062ffbf8b7d008d7fd03b7d087303ff5520897d00c747fc05000040c7076c538bb2897704894f08c7470c010000008957108d4f18c741fc05000000c7010c548bb28b338971048b731089710889790c8951108061ffbf894f0c8067ffbf8b55008d52f43b55087303ff5520895500c742fc02000000894a04c70209000000f6c201740d89c1b8ecd57ab28b5d0490ff13ff730c52ff70088b58048b0889c89090e88ab6ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204009090900000000090030000|@14588,63,@3084|51,0,@14572 98,0,@14575 110,0,0 155,0,@14577 220,0,4 230,0,@6321 254,1,@14409 350,0,@14579 397,0,@14580 410,0,0 429,0,@14582 490,0,4 502,0,@6321 530,1,@14409 613,0,@14583 629,1,@14467 659,0,@14585 706,0,@14586 719,0,0 738,0,@14587 799,0,4 811,0,@6321 838,1,@14409 14572:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204baa04f8bb251ff22900000000024000000|@14574,1048575,@3075|24,0,@14573 14573:O1|@14571 14574:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296173506172656e74283129 14575:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8ba74228bb2e94fd2ffff9090900000000060000000|@14576,2097151,@3076|70,0,0 80,0,@14476 85,1,@14478 14576:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744f6654797065283129 14577:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e912ceffff90900000000068000000|@14578,63,@3077|65,0,0 94,1,@14467 14578:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744e616d65283129 14579:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204baa04f8bb251ff22900000000024000000|@14574,1048575,@3078|24,0,@14573 14580:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000006a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14581,1048575,@3079|70,0,0 14581:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274457864656328322967657450726576696f7573457863283129 14582:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e926ccffff90900000000068000000|@14578,63,@3080|65,0,0 94,1,@14467 14583:O2|@14584,0 14584:O2|13,@14221 14585:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204baa04f8bb251ff22900000000024000000|@14574,1048575,@3081|24,0,@14573 14586:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000006a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14581,1048575,@3082|70,0,0 14587:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e9b2caffff90900000000068000000|@14578,63,@3083|65,0,0 94,1,@14467 14588:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283229 14589:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283129 14590:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3086| 14591:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3087| 14592:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3088| 14593:D3,4656|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01755df6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4b04890a8b35b4e839b289d089f290ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c7007c688bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38833f037558f7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80977ab2eb6b89f2f6c201740583ea027105ff5538ebf6f6c201740783fa017d14eb06f642ff10740cba80a27ab2eb6be9030800008b4f0489d3f6c301740583eb027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008958048b590489188b0d9ce839b2eb05e915070000ff77085652ff770450b8f4688bb289caff1289c15889ca90ff128b4c2404f6c101740eeb05e9fd05000083f9037d0feb06f641ff107407b980a27ab2eb6b8b1424f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb618b5a0889cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b1d64e039b250eb05e9f904000051ff720889f889da9090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b4424048b542408f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b0089038b053ce039b25189c289d8ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70110337bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70180698bb2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702a0698bb2eb04ff7708568b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c7010100000058a801740583e8027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc020000008942045889028b054ce039b2515289c3b8c0698bb289da9090ff1289c15889ca90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40a03b45087303ff5520894500c740fc02000000895004c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70058788bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b05756ff6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980977ab2eb7089cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b0574e839b28b75008d76f43b7508730aeb05e9c2050000ff5520897500c746fc02000000c706c8788bb28b52048956048066ffbf89c28b4500eb05e9ea0400008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897004c70001000000ff730851579090ff1289c15889ca90ff1259f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5f8b142489cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089fa90ff128b0c24f6c101740783f9037d14eb06f641ff10740cb980a27ab2eb58e98a0300008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740c83f9057d14eb0be9b0020000f641ff107407b980a27ab2eb5f8b54240cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542410f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24148b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40ac3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c74004849a7ab289088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab28d480cc741fc020000008941045883c40489018b45008d40a03b45087303ff5520894500c740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c7000c798bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38f7c601000000740583ee027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008971048b770489318b52088b1289c890ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70080798bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090000000002c120000|@14645,1048575,@3099|30,0,@6514 91,0,@4733 145,0,123 154,0,91 187,0,@5642 227,0,@5643 263,0,@5594 283,0,0 290,0,1 297,0,3 303,0,0 342,0,0 363,0,@5592 382,0,@14596 404,0,0 411,0,0 418,0,1 424,0,0 454,0,@6514 506,0,@5580 548,0,@5606 613,0,@4730 634,0,@14603 680,0,@5606 723,0,@5606 786,0,@4587 838,0,@5606 896,0,@4587 933,0,@5606 996,0,@4582 1033,0,@5606 1097,0,@4587 1174,0,@4587 1213,0,@5609 1234,0,@5592 1253,0,@5611 1272,0,@5592 1291,0,@5593 1340,0,@5592 1361,0,@5613 1399,0,@5592 1418,0,@5593 1467,0,@5592 1488,0,@5615 1524,0,@5592 1543,0,@5593 1592,0,@5592 1613,0,@5617 1651,0,@5592 1670,0,@5593 1722,0,@5592 1743,0,@5619 1779,0,@5621 1799,0,0 1806,0,0 1813,0,1 1819,0,0 1879,0,@4582 1917,0,@5609 1938,0,@5592 1957,0,@6517 1976,0,@5592 1995,0,@5593 2044,0,@5592 2065,0,@14609 2103,0,@5592 2122,0,@5593 2174,0,@5592 2193,0,@14611 2232,0,@5621 2252,0,0 2259,0,0 2266,0,1 2272,0,0 2323,0,@4584 2332,0,@14613 2377,0,@5590 2398,0,@5592 2417,0,@5593 2466,0,@5594 2486,0,0 2493,0,0 2500,0,1 2506,0,0 2523,0,0 2544,0,@5592 2563,0,@14637 2585,0,0 2592,0,0 2599,0,1 2605,0,0 2632,0,@6514 2678,0,@5580 2738,0,@4725 2775,0,@14644 2825,0,1 2832,0,3 2841,0,0 2897,0,@5606 2957,0,@4587 2992,0,@5606 3056,0,@4587 3098,0,@5606 3156,0,@4582 3193,0,@5606 3257,0,@4587 3334,0,@4587 3373,0,@5609 3394,0,@5592 3413,0,@5611 3432,0,@5592 3451,0,@5593 3500,0,@5592 3521,0,@5613 3559,0,@5592 3578,0,@5593 3627,0,@5592 3648,0,@5615 3684,0,@5592 3703,0,@5593 3752,0,@5592 3773,0,@5617 3811,0,@5592 3830,0,@5593 3882,0,@5592 3903,0,@5619 3939,0,@5621 3959,0,0 3966,0,0 3973,0,1 3979,0,0 3996,0,@5590 4017,0,@5592 4036,0,@5593 4088,0,@5594 4108,0,0 4115,0,0 4122,0,1 4128,0,0 4145,0,0 4166,0,@5592 4187,0,@14646 4209,0,0 4216,0,0 4223,0,1 4229,0,0 4259,0,@6514 4362,0,123 4371,0,91 4404,0,@5642 4442,0,@5643 4478,0,@5594 4498,0,0 4505,0,1 4512,0,3 4518,0,0 4557,0,0 4578,0,@5592 4599,0,@14653 4621,0,0 4628,0,0 4635,0,1 4641,0,0 14594:O1|@14595 14595:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3089|1,0,@5227 14596:O5|0,0,0,@14598,@14597 14597:O2|@14601,0 14598:O2|@14599,0 14599:O2|0,@14600 14600:O5|@14424,221,221,0,0 14601:O2|3,@14602 14602:S13|46756e436f6e73747261696e74 14603:O4|0,@14604,3,1 14604:O1|@14605 14605:D3,28|3b650c7303ff55248b0dbce839b289caff2290900000000018000000|@14608,1048575,@3091|10,0,@4734 14606:O1|@14607 14607:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3090|1,0,@5227 14608:S11|7072696e742d7479706573 14609:O2|3,@14610 14610:S10|6c6f636174696f6e203d 14611:O2|3,@14612 14612:S9|65787054797065203d 14613:O4|0,@14614,2,3 14614:O1|@14615 14615:D3,700|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb5c8b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b359ce839b25053b8ac6c8bb289f2ff1289c15889ca90ff128b0c248b5104f6c201740c83fa037d14eb0be9e0010000f642ff107407bb80a27ab2eb718b19f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b1389168b3d9ce839b25056b8f86c8bb289fa909090ff1289c15889ca90ff128b4c24048b118b5904f6c301740583eb027105ff5538ebf68b75008d76f43b7508730aeb05e9e1000000ff5520897500c746fc02000000895e048b5a08891e8b3d9ce839b25056b8dc718bb289faff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701f0778bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c70314788bb2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70234788bb28b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390909000000000b8020000|@5008,1048575,@3097|30,0,@5606 87,0,@4730 94,0,@14616 140,0,@5606 196,0,@4730 203,0,@14619 287,0,@4730 294,0,@14625 337,0,@5609 358,0,@5592 377,0,@14631 396,0,@5592 415,0,@5593 464,0,@5592 483,0,@14633 519,0,@5592 538,0,@5593 590,0,@5592 609,0,@14635 642,0,@5621 664,0,0 671,0,0 678,0,1 684,0,0 14616:O4|0,@14617,1,1 14617:O1|@14618 14618:D3,28|3b650c7303ff55248b0dace839b289caff2290900000000018000000|@7045,1048575,@3092|10,0,@4732 14619:O4|0,@14620,3,1 14620:O1|@14621 14621:D3,44|3b650c7303ff55248b0d74e839b250b8546d8bb289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3094|10,0,@4725 16,0,@14622 14622:O4|0,@14623,2,1 14623:O1|@14624 14624:D3,1112|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb5d8b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b3564e039b25089d889f2ff128b0c248b5104f6c201740783fa037d14eb06f642ff10740cbb80a27ab2eb58e97b0300008b19f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530c89168b3d64e039b25089f089fa9090ff128b4c24048b5104f6c201740c83fa057d14eb0be9a5020000f642ff107407bb80a27ab2eb5f8b19f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b1389168b3d3ce039b25089f089fa9090ff128b4c24088b5104f6c201740783fa077d14eb06f642ff10740cbb80a27ab2eb76e9b90100008b19f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530889168b3d64e039b25089f089fa90ff128b4c240c8b118b5904f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e9c8000000895e048b5a10891e8b3d64e039b25089f089faff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c703e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c70300a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c7031ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008958049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70240a37ab28b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000054040000|@5008,1048575,@3093|30,0,@5606 87,0,@4587 123,0,@5606 185,0,@4587 229,0,@5606 285,0,@4582 324,0,@5606 386,0,@4587 463,0,@4587 501,0,@5609 522,0,@5592 541,0,@5611 560,0,@5592 579,0,@5593 628,0,@5592 647,0,@5613 683,0,@5592 702,0,@5593 751,0,@5592 770,0,@5615 806,0,@5592 825,0,@5593 874,0,@5592 893,0,@5617 931,0,@5592 950,0,@5593 1002,0,@5592 1021,0,@5619 1054,0,@5621 1076,0,0 1083,0,0 1090,0,1 1096,0,0 14625:O4|0,@14626,3,1 14626:O1|@14627 14627:D3,44|3b650c7303ff55248b0d74e839b250b838728bb289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3096|10,0,@4725 16,0,@14628 14628:O4|0,@14629,2,2 14629:O1|@14630 14630:D3,1416|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80977ab2eb6c8b10f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb608b1a89cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b1d64e039b25051ff32eb05e99c04000089f889da909090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b04248b108b580483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d3ce039b25189f089faff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000084050000|@5008,1048575,@3095|30,0,@5580 72,0,@5606 134,0,@4587 186,0,@5606 244,0,@4587 281,0,@5606 344,0,@4582 381,0,@5606 445,0,@4587 522,0,@4587 561,0,@5609 582,0,@5592 601,0,@5611 620,0,@5592 639,0,@5593 688,0,@5592 709,0,@5613 747,0,@5592 766,0,@5593 815,0,@5592 836,0,@5615 872,0,@5592 891,0,@5593 940,0,@5592 961,0,@5617 999,0,@5592 1018,0,@5593 1070,0,@5592 1091,0,@5619 1127,0,@5621 1147,0,0 1154,0,0 1161,0,1 1167,0,0 1231,0,@4582 1269,0,@5590 1290,0,@5592 1309,0,@5593 1358,0,@5594 1380,0,0 1387,0,0 1394,0,1 1400,0,0 14631:O2|3,@14632 14632:S14|726563757273697665526566203d 14633:O2|3,@14634 14634:S10|6c6f63616c526566203d 14635:O2|3,@14636 14636:S13|6578706f72746564526566203d 14637:O5|0,0,0,@14639,@14638 14638:O2|@14642,0 14639:O2|@14640,0 14640:O2|0,@14641 14641:O5|@14424,219,219,0,0 14642:O2|3,@14643 14643:S8|46756e4964656e74 14644:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@14645,1048575,@3098| 14645:S14|7072696e742d66756e456e747279 14646:O5|0,0,0,@14648,@14647 14647:O2|@14651,0 14648:O2|@14649,0 14649:O2|0,@14650 14650:O5|@14424,222,222,0,0 14651:O2|3,@14652 14652:S10|46756e496e6669786564 14653:O5|0,0,0,@14655,@14654 14654:O2|@14658,0 14655:O2|@14656,0 14656:O2|0,@14657 14657:O5|@14424,220,220,0,0 14658:O2|3,@14659 14659:S8|46756e5074726565 14660:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@14661,1048575,@3100| 14661:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283129 14662:D3,716|3b650c7303ff5524833b0575708b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7013c7d8bb289510489410889590c8061ffbf8b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc020000008971048b520489118b7b08508b530489cb89d09090e89eb1ffff8b0c245750eb05e94b000000ff71088b59048b01909090e8a28affff83f80175058b0424eb0a89c38b0424e8b602000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4045983c4048908c3833b01750d8b5b04ba74228bb2e959a7ffff833b0775386a016a0189e1518b5b048b5208909090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c38b4b048b51048b12f643080175748b73088b3e8b1f8b1b508b47048b008b368b76088b368b7908525089f09090e86602000083fb0174079090e8ba0200008b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c70115000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b4508730aeb05e918000000ff5520894500c740fc02000000c74004010000008908eb0c89c6b80100000056528b79088b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104c7011b000000f6c101740f89c2b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000897a04c70205000000f6c201740e89c3b8ecd57ab28b5d049090ff138b1c2457505152ff73088b7304ff3389f3589090e8ea88ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc0200000089480459890883f80175058b0424eb0a89c38b0424e8d201000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4045983c4048908c390909000000000c8020000|@14669,2097151,@3106|39,0,@14663 114,1,@14489 142,1,@14409 162,1,@14665 214,0,@14476 219,1,@14478 330,1,@14666 342,1,@14667 379,0,10 389,0,@6321 435,0,0 446,0,0 485,0,13 497,0,@6321 538,0,2 550,0,@6321 582,1,@14409 662,1,@14668 14663:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@14664,1048575,@3101| 14664:S63|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e7472792832296173506172656e74283129 14665:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3102| 14666:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3103|60,0,0 14667:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3104| 14668:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3105| 14669:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283229 14670:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14695,63,@3122|26,1,@14671 14671:D3,436|3b650c7303ff5524f6430401756e8b4b0483790401756a8b53088b12ff730cff7214ff315350ff70088b58048b0889c890e8c285ffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70160818bb25a8951045a8951088b54241089510c8061ffbf5051528b5c24108b44240c909090e8d6010000eb0ae93b000000e936000000833c2401740a8b1c249090e84a07000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c40c598908c204008b4b088b095350ff730cff7114ff7304ff70088b58048b0889c8909090e81a85ffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701d0878bb28b54240c8951048b5424108951088b54241889510c8061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70350888bb28953048b7424048973088063ffbf8b75008d76ec3b75087303ff5520897500c746fc01000000890e8d4e08c741fc02000000897104891989c789cb5883c404909090e85eabffff83ff01740789fbe8aa09000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c2040000000000b0010000|@14694,63,@3121|50,1,@14409 80,0,@14672 118,1,@14675 146,1,@14682 218,1,@14409 248,0,@14683 303,0,@14685 374,1,@14489 386,1,@14693 14672:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba9c818bb251ff22900000000024000000|@14674,1048575,@3107|24,0,@14673 14673:O1|@14671 14674:S57|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274464228322961734368696c642d283129 14675:D3,824|3b650c7303ff55248b480c8b098b10837a08037559f6020175598b328b3e833f337555f647040175678b7704f646040175638b7e04837f0401755f8b328b3eff70048b4704518b4804ff720cff76048b75008d76f43b75087303ff5520897500c746fc020000008b00894604eb0fe9ea000000e9e5000000e9e0000000c706070000008b45008d40f03b45087314eb0fe9c8000000e9c3000000e9be000000ff5520894500c740fc030000008958088b5204895004c700030000008b55008d52f43b55087303ff5520895500c742fc020000008b09894a04c702070000008b4d008d49cc3b4d087303ff5520894d00c741fc02000000c741040100000089118d510cc742fc02000000894a0489028d420cc740fc0200000089500489308d480cc741fc030000008b7f0c897908894104c7010500000089cb58e80e0200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941048919eb568b75008d76f03b75087303ff5520897500c746fc03000000895e088b5a04895e04c706030000008b78045751ff720c8b02909090e8360200008b4d008d49f43b4d087303ff5520894d00c741fc020000008941048931f604240175498b04248b55008d52f43b55087303ff5520895500c742fc020000008b00894204c702010000008b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008910eb05b801000000f644240401755e8b5424048b5d008d5bf43b5d087303ff5520895d00c743fc020000008b12895304c70301000000f6c301740f89c2b8ecd57ab28b5d04909090ff138b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000891aeb05ba010000008b5d008d5be03b5d087303ff5520895d00c743fc010000008b74241483c40889338d7b08c747fc02000000895f048b5c2408891f8d770cc746fc020000005b895e04c706070000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000893383fb01740f89d651909090e86201000089f2eb015183f80175058b0424eb0f89d689c38b042490e89e01000089f25289fb9090e876a7ffff833c2401750683c408c208008b1c2483c4085983c40851e9ce01000090900000000034030000|@14681,63,@3113|127,0,3 183,0,1 218,0,3 249,0,0 306,0,2 314,1,@14676 384,0,1 402,1,@14677 475,0,0 506,0,0 515,0,0 561,0,0 573,0,@6321 612,0,0 621,0,0 693,0,3 724,0,0 742,1,@14678 770,1,@14679 782,1,@14489 810,1,@14680 14676:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3108|43,0,3 92,0,0 14677:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70107000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3109|43,0,3 92,0,0 14678:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3110| 14679:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3111| 14680:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3112| 14681:S51|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727441436c61757365283329 14682:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3114| 14683:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba9c818bb251ff22900000000024000000|@14684,1048575,@3115|24,0,@14673 14684:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f727454686973283129 14685:D3,44|3b650c7303ff55248b4a048b1c24890c24ff720889de8b58048b3889f856e91d000000900000000028000000|@14692,63,@3119|31,1,@14686 14686:D3,164|3b650c7303ff5524ff73085350ff70088b58048b0889c89090e8e27cffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000c70148898bb25a8951048b14248951088b5c241089590c8b74240c8971108061ffbf50515389f389d09090e8f2f8ffff833c2401740a8b1c249090e8da00000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c408598908c2080000000000a0000000|@14691,63,@3118|26,1,@14409 56,0,@14687 98,1,@14675 114,1,@14690 14687:D3,44|3b650c7303ff55248b420c8b0c24890424ff72108b5a088b4204ba88898bb251ff2290900000000028000000|@14689,1048575,@3116|27,0,@14688 14688:O1|@14686 14689:S72|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c6175736528322961734368696c642d283129 14690:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3117| 14691:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283229 14692:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283129 14693:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3120| 14694:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283229 14695:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283129 14696:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3123| 14697:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f6a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14561,1048575,@3124|65,0,0 14698:D3,200|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc0100000089108d4808c741fc020000008941048b4214890189d789cb8b47109090e8a69fffff8b4d008d49f03b4d087303ff5520894d00c741fc010000008b570c89118d5908c743fc010000008b7708893357505389cbb80100000090e88a78ffff83f80175058b0424eb0a89c38b0424e84a0000008b4c240483c40489c28b45008d40f43b45087303ff5520894500c740fc020000008950048b490483c4048908c39000000000c4000000|@14564,63,@3126|62,1,@14489 116,0,0 122,1,@14409 142,1,@14699 14699:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3125| 14700:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3127| 14701:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14711,1048575,@3132|26,1,@14702 14702:D3,584|3b650c7303ff55248b4b048b096a016a01ff731050ff33ff730851ff730c538d54241c528b5c24088b54242cff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24208948048b4c241c89088b5424188b193b1a743cf6c301755ef60201755e8b3af7c7010000007407be03000000eb068b378d74360183c6085689de59d1e93bc9f3a68d7c3f018d7436018d4c090175628b4c241c8b5904f6c3017509f64204017503ff55383b5a0475618b7108f7c6010000007515eb0ae94f000000e94a000000f64208017503ff55383b7208753c8b790cf7c7010000007509f6420c017503ff55383b7a0c75238b5910f6c3017510eb05e914000000f64210017503ff55383b5a10750683c424c204008b45008d40ec3b45087303ff5520894500c740fc04000000c700ac908bb28b4c24148948048b14248950088b54242889500c8060ffbf8b5d008d5bcc3b5d087303ff5520895d00c743fc05000040c70334918bb28953048b742404897308c7430c010000008943108d7b18c747fc06000000c70718928bb28b4c2410894f048b4c240c894f088b4c2408894f0c895f108947148067ffbf897b0c8063ffbf8b45008d40f43b45087303ff5520894500c740fc02000000897804c70009000000a801740e89c1b8ecd57ab28b5d049090ff138b4c241450ff71088b59048b01909090e84675ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948048b4c2418890883c424c20400900000000044020000|@14710,1048575,@3131|114,0,1 302,0,@14703 356,0,@14706 373,0,0 392,0,@14708 463,0,4 474,0,@6321 502,1,@14409 14703:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204bae8908bb251ff22900000000024000000|@14705,1048575,@3128|24,0,@14704 14704:O1|@14702 14705:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 14706:D3,140|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000006a016a0189e0508b5a0889f88b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000088000000|@14707,1048575,@3129|70,0,0 14707:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229676574457870283129 14708:D3,176|3b650c7303ff55248b45008d40d43b45087303ff5520894500c740fc010000008b4a1489088d5808c743fc010000008b721089338d7b08c747fc03000000c7470801000000894704891f8d4710c740fc020000008b5a0c895804c7001b000000a801740d50b8ecd57ab28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b42088b3424890424518b5a0489f856e9618cffff9000000000ac000000|@14709,63,@3130|65,0,0 92,0,13 102,0,@6321 140,0,0 163,1,@14467 14709:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296765744c6162283129 14710:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229 14711:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283129 14712:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3133| 14713:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3134| 14714:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3135| 14715:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3136| 14716:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3137| 14717:O1|@14718 14718:D3,144|3b650c7303ff55248b48048b51048b1283fa017507ba01000000eb168b128b7908ff308b420c909090e8023fefff89c2eb05ff308b79088b04245752ff70088b58048b0889c8909090e8ea6fffff833c2401740a8b1c249090e84600000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4045983c4048908c3909090000000008c000000|@14720,63,@3139|22,0,0 42,1,@6320 74,1,@14409 90,1,@14719 14719:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3138| 14720:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745374727563744964656e74283129 14721:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3140| 14722:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3141| 14723:D3,128|3b650c7303ff55248b45008d40e83b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc03000000c7430801000000894304c703010000006a016a0189e05089d88b5a088b4a0489caff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c3000000007c000000|@14724,1048575,@3142|50,0,0 59,0,0 14724:S44|4558504f52545f50415253455452454528292e6765744578706f727454726565283229676574457870283129 14725:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3143| 14726:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3144| 14727:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70105000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3145|43,0,2 92,0,0 14728:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3146| 14729:O2|13,@6000 14730:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@14737,63,@3150|26,1,@14731 14731:D3,244|3b650c7303ff5524ff7308ff33ff73045350ff70088b58048b0889c890e8926bffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701e49a8bb25a8951045a8951088b54241089510c8061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc01000000890b8d4b08c741fc0200000089590489118d590cc743fc02000000c74304010000005e89338b75008d76f43b75087303ff5520897500c746fc02000000895e045b891e89c789cb89f090e8da91ffff83ff01740789fbe8ca00000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c2040090909000000000f0000000|@14736,63,@3149|30,1,@14409 60,0,@14732 137,0,0 182,1,@14489 194,1,@14735 14732:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba209b8bb251ff22900000000024000000|@14734,1048575,@3147|24,0,@14733 14733:O1|@14731 14734:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727456422832296578706f727454686973283129 14735:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3148| 14736:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283229 14737:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283129 14738:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3151| 14739:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3152| 14740:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3153| 14741:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283229 14742:O2|@14743,@13807 14743:D3,76|3b650c7303ff55246a016a0189e1518b58048b0889c88b5204909090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000048000000|@14744,1048575,@3155| 14744:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283129 14745:O1|@14746 14746:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3156|1,0,@5227 14747:O1|@14748 14748:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3157|1,0,@5227 14749:O1|@14750 14750:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3158|1,0,@5227 14751:D3,124|3b650c7303ff55248b480452ff30ff318b5a188b4104909090e8720000008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b442404ff700468e49f8bb289e252ff700868e45b89b268f05b89b2ff700cff7010ff701489cb8b4424249090e84eb8fdff83c410c390900000000078000000|@14754,1048575,@3161|26,1,@14752 68,0,@14753 79,0,@13723 84,0,@13724 106,1,@13713 14752:D3,188|3b650c7303ff5524a80175728b088b138b33f7c601000000740583c6027105ff5538ebf689338b75008d76d43b75087303ff5520897500c746fc02000000895604c706010000008d560cc742fc07000000c7421801000000c74214010000008b7910897a108b790c897a0c8972088b71048972048b318932528b4004eb05e9280000009090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000b8000000|@6329,63,@3159|67,0,0 84,0,0 91,0,0 172,0,0 14753:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3160| 14754:S66|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657246696e616c54797065283129 14755:D3,188|3b650c7303ff5524ff72046848a18bb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff720c51bb030000008b420890e81ab8fdff83c408c3909000000000b8000000|@14758,1048575,@3163|12,0,@14756 45,0,3 55,0,@6321 92,0,0 114,0,0 121,0,0 128,0,0 134,0,0 144,0,@6321 161,0,1 170,1,@13717 14756:D3,32|3b650c7303ff552489c38b4204ba94b788b2e9a516fdff90000000001c000000|@14757,2097151,@3162|14,0,@13439 19,1,@13443 14757:S35|5349474e41545552455328292e67697665537065634572726f72283329283129283129 14758:S32|5349474e41545552455328292e67697665537065634572726f72283329283129 14759:D3,172|3b650c7303ff55248b4a108b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70390a28bb28b71208973048b7a04897b088063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706d8a28bb28b4930894e048b4a08894e088066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704891fff720c89c389f89090e89242feff8b4c24048b008901b801000000c20400909000000000a8000000|@13963,2097151,@3166|37,0,@14760 83,0,@14761 142,1,@13885 155,0,0 14760:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3164| 14761:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3165| 14762:S12|53706563696679696e672022 14763:S13|2220697320696c6c6567616c2e 14764:D3,32|3b650c7303ff552489c38b4204ba94b788b2e9a114fdff90000000001c000000|@14757,2097151,@3167|14,0,@13439 19,1,@13443 14765:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3168| 14766:D3,908|8d7c248c3b7d0c7303ff55288b4d008d49e83b4d087303ff5520894d00c741fc0100004089198b5424708d5908c743fc03000000c70368a78bb28b72208973048b7c246c897b088063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706b0a78bb28b52308956048b5424688956088066ffbf8b7d008d7fc83b7d087303ff5520897d00c747fc0d0000008977308b74244889772c8b54244c8957288b542450895724895f20c7471cf85c89b28b5c2454895f188b5c2458895f148b5c245c895f108b5c2460895f0c8b5c2464895f08c74704805d89b2c707085e89b26a016a0183380175686a016a016a016a016a016a0151ff70086a01ff7424448d4c241051ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff742474ff74247489fb8b40048b9424a0000000ff128d44241c8b4c240489088d44241c8b4c2414894804eb6b833805756b8b58046a016a016a016a016a016a0151ff7308ff7310ff3357ff74244cff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff7424788b430c8b7b0489c389f88b542474909090ff128d4c241c8b1089118d4c241ceb0ae995000000e9080000008b5810895904eb726a016a016a016a016a016a01516a016a016a016a016a016a01ff700c57ff74245c8d7c240c57ff742470ffb42490000000ffb42490000000ff742478ffb42494000000ffb42494000000ffb42494000000ffb42494000000ffb424940000008b58088b780489f8e80eccfdff8d442434eb05e9110000005983c40c89088d4424245983c4048948048b45008d40e03b45087303ff5520894500c740fc07000000c700f8a78bb28b4c24308948048b9424900000008950088b5c246489580c8b7424348970108b7c24608978148b0c248948188060ffbf8b4d008d49e03b4d087303ff5520894d00c741fc07000000c7018caa8bb28b54242c8951048b9c248c0000008959088b74246489710c8b7424348971108979148b34248971188061ffbf8b75008d76e03b75087303ff5520897500c746fc07000000c706f8ab8bb28b7c2428897e048b5424788956088b5c2464895e0c8b7c2434897e108b5424608956148b14248956188066ffbf8b55008d52f03b55087303ff5520895500c742fc03000000894a088942048932ff7424206a036848c05208ff74242c6a0189d38b44243090e8aa44feff5883c4208b00c27000900000000088030000|@14782,2097151,@3178|54,0,@14767 101,0,@14768 176,0,@13731 218,0,@13736 224,0,@13741 570,1,@13753 628,0,@14769 706,0,@14776 780,0,@14779 868,0,I48 886,1,@13905 14767:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3169| 14768:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3170| 14769:D3,172|3b650c7303ff55248b48048379040174598b198b75008d76f03b75087303ff5520897500c746fc030000008b7b08897e088b7b04897e048b3b893e52ff30568b5a188b4104e8760000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104588901eb0352ff308b442404ff700468eca98bb289e252ff700868e45b89b268f05b89b2ff700cff7010ff701489cb8b44242490e8aaaefdff83c410c3909000000000a8000000|@14775,1048575,@3173|70,1,@14770 117,0,@14774 128,0,@13723 133,0,@13724 154,1,@13713 14770:D3,212|3b650c7303ff5524a80175728b088b5108833a01740f8b7004b8a0a98bb28b5d049090ff138b3389f7f7c701000000740583c7027105ff5538ebf6893b8b7d008d7fd43b7d087303ff5520897d00c747fc02000000897704c707010000008d770cc746fc07000000c7461801000000c74614010000008b5110895610eb05e9400000008b510c89560c897e088b7904897e048b39893e568b4004909090e85effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000d0000000|@6329,63,@3171|26,0,@14771 90,0,0 107,0,0 114,0,0 196,0,0 14771:O4|@4608,@5398,@14773,@14772 14772:O5|@13386,1141,0,1141,0 14773:S21|6e65774163636573733a204e6f7420466f726d616c 14774:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3172| 14775:S77|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657254797065283129 14776:D3,184|3b650c7303ff55248b48048b5904833b01740e8b30b8a0a98bb28b5d049090ff138b72188b3689f7f7c701000000740583c7027105ff5538ebf68b5a18893b8b7d008d7fe03b7d087303ff5520897d00c747fc02000000897704c707010000008d770cc746fc040000008b590c895e0c8b5908895e08897e048b39893eff72046858ab8bb289e757ff720868bc5c89b268d05c89b2ff720cff7210ff721489f38b00909090e80aacfdff83c408c3909000000000b4000000|@14778,1048575,@3175|22,0,@14771 92,0,0 129,0,@14777 140,0,@13728 145,0,@13729 166,1,@13713 14777:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3174| 14778:S79|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e746572537472756374283129 14779:D3,204|3b650c7303ff55248b48048b5908833b01740e8b30b8a0a98bb28b5d049090ff138b72188b3689f7f7c701000000740583c7027105ff5538ebf68b5a18893b8b7d008d7fd43b7d087303ff5520897d00c747fc02000000897704c707010000008d770cc746fc07000000c7461801000000c74614010000008b5910895e108b590c895e0c897e088b7904897e048b39893eff720468d8ac8bb289e757ff720868cc5689b268dc5689b2ff720cff7210ff721489f38b00909090e88aaafdff83c408c3909000000000c8000000|@14781,1048575,@3177|22,0,@14771 92,0,0 109,0,0 116,0,0 149,0,@14780 160,0,@13709 165,0,@13710 186,1,@13713 14780:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3176| 14781:S76|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657256616c283129 14782:S65|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229 14783:D3,496|8d7c249c3b7d0c7303ff5528837804017471f640080174118b088b5008b8c4af8bb28b5d049090ff138b48088b118b75008d76f43b75087303ff5520897500c746fc020000008b7b30897e048b7b20893eff7204ff74241cff74242468f0af8bb2ff3053ff71048d44240c508b1a89f090e8be36feff8b088b51088b5a04833b03eb05e9fd0000007514817b04f4e439b2750bb80100000083c41cc220008b342450f7c60100000075738b068b4c24088b55008d52f43b55087303ff5520895500c742fc020000008b5930895a048b7920893aff7004ff74243cff7424446868b18bb2ff76048d742404568b1889d09090e83e36feff50ff742448ff742448ff7424488b5c2458b80100000090e8aa03000050ff74244cff74244ceb05e958000000ff74244c8b5c245cb8010000009090e886030000ff3424ff7424206848c0520850ff742438ff742470ff74246cff742468ff742460bb48c052088b44242890e88a05000083c4085e83c4103b650c7303ff5524e928ffffffb80100000083c420c22000ff30ff742420ff7424208b4008909090e8f21900008b4c24248b54241c8b5c24148b7424088b7c2418508b442414508b442414894c242c89542428895c242489742420897c241c59894c2414894424108b5c24045883c4045983c40451e9811b00009000000000ec010000|@14858,2097151,@3207|30,0,@14784 93,0,@14786 114,1,@13885 141,0,@4643 148,0,0 223,0,@14790 242,1,@13885 264,0,0 270,1,@14792 299,0,0 306,1,@14792 318,0,I48 344,0,I48 354,1,@14796 379,0,0 406,1,@14834 483,1,@14837 14784:O4|@4650,@6706,0,@14785 14785:O5|@13386,709,0,709,0 14786:D3,204|3b650c7303ff552452bbd0b08bb2909090e88e5beeff8b0c24ff710468e8b08bb28b55008d52f43b55087303ff5520895500c742fc02000000894204c70207000000f6c201740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc05000000894210c7420c01000000c7420801000000c7420401000000c70201000000f6c201740ab8ecd57ab28b5d04ff1389e050ff710c52bb030000008b410890e892a8fdff83c40cc3909000000000c8000000|@14789,1048575,@3180|10,0,@14787 18,1,@4940 29,0,@14788 62,0,3 72,0,@6321 108,0,0 130,0,0 137,0,0 144,0,0 150,0,0 160,0,@6321 177,0,1 186,1,@13717 14787:S14|20696e207369676e61747572652e 14788:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9ddf6fcff90000000001c000000|@13757,2097151,@3179|14,0,@13416 19,1,@13418 14789:S66|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e742833296c6f6f6b75704661696c757265283129283129 14790:D3,204|3b650c7303ff552452bbd0b08bb2909090e8165aeeff8b0c24ff71046848b28bb28b55008d52f43b55087303ff5520895500c742fc02000000894204c70207000000f6c201740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc05000000894210c7420c01000000c7420801000000c7420401000000c70201000000f6c201740ab8ecd57ab28b5d04ff1389e050ff710c52bb030000008b410890e81aa7fdff83c40cc3909000000000c8000000|@14789,1048575,@3182|10,0,@14787 18,1,@4940 29,0,@14791 62,0,3 72,0,@6321 108,0,0 130,0,0 137,0,0 144,0,0 150,0,0 160,0,@6321 177,0,1 186,1,@13717 14791:D3,32|3b650c7303ff552489c38b4204bac4a788b2e97df5fcff90000000001c000000|@13757,2097151,@3181|14,0,@13416 19,1,@13418 14792:D3,324|3b650c7303ff55248b1bf6c301740df644240c0174062b5c240c7105ff5538ebf583c30183fb017507b868c05208eb6ef6c301740783fb017e1deb06f643ff107515f6c301740a81fbffffff017c12eb06f643ff10750ab8d4217fb28b5d04ff1389d9b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fb80100000053a8017414f6042401eb05e95e00000074073b04247c07eb4cff5538ebf45089c38b44241090e86a27f4ff83f801750e89c1b84cc37bb28b5d049090ff138b0c248b0089444ffef6c101740583c1027105ff5538ebf689c883c4043b650c7303ff5524eb9c8067ffbf89f883c40489c18b45008d40ec3b45087303ff5520894500c740fc040000009090c700d4b38bb28b5424048950048948088b4c240c89480c8060ffbfc20c00900000000040010000|@14795,63,@3184|42,0,I49 73,0,16777215 88,0,@8597 100,0,0 143,0,0 186,1,@8978 198,0,@6769 287,0,@14793 14793:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@14794,1048575,@3183|66,0,8388607 84,0,@5401 14794:S37|5349474e41545552455328292e73696756616c283629747970654964456e76283129283129 14795:S34|5349474e41545552455328292e73696756616c283629747970654964456e76283129 14796:D3,2296|3b650c7303ff55248b4c24208b108b72088b7e04833f037509817f04f4e439b274168b118b72088b7e04833f037511817f04f4e439b27508b801000000c224008b108b72088b7e04833f0375058b5708eb36833f0175058b5704eb2cba010000008b7704f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdc8b318b7e088b7704833e0375058b7e08eb39833e0175058b7e04eb2fbf010000008b7604f7c601000000751ff7c701000000740583c7027105ff5538ebf68b76043b650c7303ff5524ebd9f6c201750bf7c7010000007503ff55383bd77472ff74241068bcbd8bb290e886080000508b5c24288b44242c9090e8760800008b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104e8bf8bb289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70174c08bb28d410cc740fc02000000eb05e9a6000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40d03b45087303ff5520894500c740fc02000000894804c70018e27ab28d480cc741fc02000000894104c70194c08bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389e151ff74242050bb030000008b442420909090e892a2fdff83c408c224008b108b72088b7e04833f017513535052ff318b470c8b542434909090ff12eb07535089f052ff318b0c248b51088b5a04833b01750f508b430c8b54242c909090ff12eb0589c689d0568b0c248b5104833a01755e8b5a0cf6c301740ff644241c0174083b5c241c7d07eb6cff5538ebf3f6c301740df644241c0174062b5c241c7105ff5538ebf583c3015089df89fb8b44241c9090e85623f4ff8338037542f7c7010000007414f6400401740e3b7804eb05e9450000007e07eb12ff5538ebed8b4804b8008589b28b5d04ff138b58043b650c730aeb05e91d000000ff5524ebaa8b0883f901741583f9077471b8bcc08bb28b5d049090ff1350eb01508b44240c8b188b4424149090e8d253eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b4424048b500851ff72088b5a048b02e8ee0800008b4d008d49c4eb05e9290200003b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c7019cc38bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13ff74242868c8c38bb2508b5c24208b44241c9090e84e050000508b5c24448b4424489090e83e0500008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118b55008d52a03b55087303ff5520895500c742fc02000000894a04c7029c9a7ab28d4a0cc741fc02000000895104c7010cc08bb28d510cc742fc02000000894a04c702f0a47ab28d4a0cc741fc0200000089510489018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70174c08bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c70018e27ab28d480cc741fc02000000894104c70194c08bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1389e151ff74243850bb030000008b442438909090e8069ffdff83c420c224008b04248b4804833901755d8b510cf6c201740ff64424200174083b5424207d07eb69ff5538ebf3f6c201740df64424200174062b5424207105ff5538ebf583c20189d789fb8b44241ce81620f4ff8338037542f7c7010000007412f6400401740c3b78047e0ceb19e940000000ff5538ebef8b4804b8008589b28b5d049090ff138b50043b650c730aeb05e91d000000ff5524ebac8b0883f901741183f9077472b8bcc08bb28b5d049090ff138b4424088b188b4424349090e89650eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b04248b500851ff72088b5a048b0290e8b20500008b4d008d49c43b4d08730aeb05e924020000ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c7019cc38bb28d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13ff74242868fcc38bb2508b5c24208b44241c9090e812020000508b5c24448b4424489090e8020200008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118b55008d52a03b55087303ff5520895500c742fc02000000894a04c7029c9a7ab28d4a0cc741fc02000000895104c7010cc08bb28d510cc742fc02000000894a04c702f0a47ab28d4a0cc741fc0200000089510489018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70174c08bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c70018e27ab28d480cc741fc02000000894104c70194c08bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1389e151ff74243850bb030000008b442438909090e8ca9bfdff83c420c224008b4424208b4c241c8944243c894c24388b1c248b44240483c4185a83c41c52e99006000000000000f4080000|@14833,2097151,@3192|28,0,@4643 50,0,@4643 57,0,0 93,0,0 165,0,0 236,0,@14797 242,1,@14799 258,1,@14799 289,0,@14801 310,0,@5592 329,0,@14808 355,0,@5592 404,0,@6364 423,0,@14810 443,0,0 450,0,0 457,0,3 463,0,0 474,0,@6321 494,0,1 506,1,@13717 666,1,@8978 712,0,@13791 754,0,@14812 782,1,@4940 815,0,3 825,0,@6321 854,1,@14815 892,0,0 915,0,@5592 934,0,@14817 955,0,@5592 1005,0,0 1012,0,0 1019,0,3 1025,0,0 1036,0,@6321 1050,0,@14819 1066,1,@14799 1082,1,@14799 1113,0,0 1152,0,@5592 1171,0,@14804 1190,0,@5643 1224,0,@5592 1243,0,@14808 1262,0,@5592 1314,0,@6364 1333,0,@14810 1353,0,0 1360,0,0 1367,0,3 1373,0,0 1384,0,@6321 1402,0,1 1414,1,@13717 1498,1,@8978 1542,0,@13791 1586,0,@14812 1610,1,@4940 1643,0,3 1653,0,@6321 1682,1,@14815 1720,0,0 1743,0,@5592 1762,0,@14817 1783,0,@5592 1833,0,0 1840,0,0 1847,0,3 1853,0,0 1864,0,@6321 1878,0,@14820 1894,1,@14799 1910,1,@14799 1941,0,0 1980,0,@5592 1999,0,@14804 2018,0,@5643 2052,0,@5592 2071,0,@14808 2090,0,@5592 2142,0,@6364 2161,0,@14810 2181,0,0 2188,0,0 2195,0,3 2201,0,0 2212,0,@6321 2230,0,1 2242,1,@13717 2284,1,@14821 14797:D3,32|3b650c7303ff552489c38b4204bac4a788b2e909eafcff90000000001c000000|@14798,2097151,@3185|14,0,@13416 19,1,@13418 14798:S50|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e745368617265283129283129 14799:D3,352|3b650c7303ff55248b088b5104f6c20175328b32833e01751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc9bf01000000f7c70100000075638b17833a01755c8b75008d76f43b75087303ff5520897500c746fc020000008b4a04894e04c70601000000f7c601000000740dff30b8ecd57ab28b5d0490ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008937eb05bf010000008b005789d98b1889c8909090e89e4ceeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c7400401000000890889c18d400cc740fc050000008948105989480cc7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13c39090000000005c010000|@14800,63,@3186|69,0,0 120,0,0 135,0,@6321 172,0,0 181,0,0 198,1,@4940 231,0,3 241,0,@6321 280,0,0 308,0,0 315,0,0 321,0,0 332,0,@6321 14800:S62|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e74536861726528312973686f7754797065436f6e73283229 14801:O2|@5643,@14802 14802:O2|@14804,@14803 14803:O2|@5592,@14805 14804:O2|3,46 14805:O2|@14806,0 14806:O2|3,@14807 14807:S58|546865207479706520636f6e7374727563746f72732074616b6520646966666572656e74206e756d62657273206f6620617267756d656e74732e 14808:O2|3,@14809 14809:S9|776974682074797065 14810:O2|3,@14811 14811:S17|43616e6e6f742073686172652074797065 14812:O4|@4608,@5398,@14814,@14813 14813:O5|@13386,504,0,504,0 14814:S5|6973566172 14815:D3,620|3b650c7303ff5524817c240448c052087429f644240401756e8b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090175728b4d008d49f43b4d087303ff5520894d00c741fc02000000895904c70101000000f6c101740c89c2b8ecd57ab28b5d04ff138b55008d52e83b55087303ff5520895500c742fc02000000eb05e990000000c7420401000000890a8d4a0cc741fc02000000894104c70107000000f6c101eb05e96a000000740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c7400401000000890889c18d400cc740fc0500000089481089500cc7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c204008b4d008d49f43b4d087303ff5520894d00c741fc02000000895904c70101000000f6c101740f89c2b8ecd57ab28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000894104c70107000000f6c101740bb8ecd57ab28b5d0490ff1352518b5c240cb8c8a57cb290e8f648eeffbbb0a57cb29090e8ea48eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc0200000089480459890889c18d400cc740fc050000008948105989480cc7400801000000c7400401000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff13c204000000000068020000|@14816,63,@3187|12,0,I48 30,0,I48 35,0,4 88,0,0 100,0,@6321 143,0,0 164,0,3 181,0,@6321 220,0,0 247,0,0 254,0,0 260,0,0 271,0,@6321 313,0,0 325,0,@6321 364,0,0 385,0,3 395,0,@6321 412,0,@7410 418,1,@4940 423,0,@7408 430,1,@4940 463,0,3 473,0,@6321 512,0,0 533,0,@5592 575,0,0 582,0,0 588,0,0 599,0,@6321 14816:S25|5349474e41545552455328292e7072696e7444657363283329 14817:O2|3,@14818 14818:S21|697320616c726561647920646566696e6564206173 14819:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9fde3fcff90000000001c000000|@14798,2097151,@3188|14,0,@13416 19,1,@13418 14820:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9c9e3fcff90000000001c000000|@14798,2097151,@3189|14,0,@13416 19,1,@13418 14821:D3,840|3b650c7303ff55248b480483390175088b5304833a01740d89c1b88cc78bb28b5d0490ff138b710cf7c601000000740df64424080174062b7424087105ff5538ebf583c601ff720c89f789fb8b44240890e81e16f4ff8338037537f7c701000000740df640040174073b78047e07eb15ff5538ebf48b4804b8008589b28b5d04909090ff138b70043b650c7303ff5524ebb689c158a801740df64424080174062b4424087105ff5538ebf583c0015189c789fb8b4424089090e8b615f4ff8338037537f7c701000000740df640040174073b78047e07eb15ff5538ebf48b4804b8008589b28b5d04909090ff138b40043b650c7303ff5524ebb58b0c24833907751b8b51048b5a04833b017510833807750b8b70048b7e04833f01740c89c2b8e0c78bb28b5d04ff138b730cf7c6010000007509f6470c017503ff55383b770c750bb80100000083c404c20800f7c601000000740df6470c0174073b770c7c0aeb05ff5538ebf48b770c568b730cf7c601000000740df6470c0174073b770c7e07eb08ff5538ebf48b770c837b1001740856be03000000eb04568b7710ff71088b4b04f6c1017509f64704017503ff55383b4f04740fff7008b838c88bb28b5d049090ff138b4b08833903750fff70088b41048b0083f8017417eb0e837904017505ff7008eb0aff7008b803000000eb168b470883380375098b48048b0989c8eb058b480489c88b4d008d49cc3b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc050000008970108b74240c89700c8948088b5b04895804c700010000008d4818c741fc030000008b5208895108894104c701d8707ab2833c240175068b442404eb1089cf8b1c248b442404e8e601000089f98b55008d52f03b55087303ff5520895500c742fc03000000894208894a04c70207000000f7c601000000740df644241c0174062b74241c7105ff5538ebf583c6015289f38b44241c90e882d8f3ff83c40858a801740df64424100174062b4424107105ff5538ebf583c00159f6c101740df644240c0174062b4c240c7105ff5538ebf583c1018b55008d52f43b55087303ff5520895500c742fc02000000894a04c702030000008b4c24088954240c89c389c883c4045a83c40452e910d8f3ff0000000044030000|@14832,2097151,@3191|27,0,@14822 82,1,@8978 121,0,@13791 186,1,@8978 225,0,@13791 288,0,@14825 323,0,0 403,0,1 442,0,@14828 491,0,1 548,0,0 583,0,0 608,0,@5279 634,1,@14831 672,0,3 714,1,@8774 803,0,1 828,1,@8774 14822:O4|@4608,@5398,@14824,@14823 14823:O5|@13386,552,0,552,0 14824:S30|6c696e6b466c657869626c65547970654964733a206e6f7420626f756e64 14825:O4|@4608,@5398,@14827,@14826 14826:O5|@13386,550,0,550,0 14827:S33|6c696e6b466c657869626c65547970654964733a206e6f74207661726961626c65 14828:O4|@4608,@5398,@14830,@14829 14829:O5|@13386,540,0,540,0 14830:S38|6c696e6b466c657869626c65547970654964733a20646966666572656e742061726974696573 14831:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3190| 14832:S44|5349474e41545552455328292e73696756616c2836296c696e6b466c657869626c6554797065496473283229 14833:S35|5349474e41545552455328292e73696756616c28362973686172655479706573283829 14834:D3,180|3b650c7303ff5524a80175718b08ff7104ff742408ff7424106814ca8bb253ff7004ff318d54240c528b533089d3b8bc5c89b29090e84200feff83f801751d8b4424208b4c241c89442420894c241c8b5c24045883c414e9a4ffffffff30ff742424ff7424248b5c24108b44240c909090e88affffff89c18b4500eb05e9210000008d40f43b45087303ff5520894500c740fc0200000089480459890883c418c20800b801000000c208009000000000b0000000|@8404,1048575,@3195|26,0,@14835 47,0,@13728 54,1,@13836 164,0,0 14835:D3,204|3b650c7303ff552452bbd0b08bb2909090e86a41eeff8b0c24ff710468f4ca8bb28b55008d52f43b55087303ff5520895500c742fc02000000894204c70207000000f6c201740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc05000000894210c7420c01000000c7420801000000c7420401000000c70201000000f6c201740ab8ecd57ab28b5d04ff1389e050ff710c52bb030000008b410890e86e8efdff83c40cc3909000000000c8000000|@14789,1048575,@3194|10,0,@14787 18,1,@4940 29,0,@14836 62,0,3 72,0,@6321 108,0,0 130,0,0 137,0,0 144,0,0 150,0,0 160,0,@6321 177,0,1 186,1,@13717 14836:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9d1dcfcff90000000001c000000|@13757,2097151,@3193|14,0,@13416 19,1,@13418 14837:D3,84|3b650c7303ff552453ff742418ff742410ff7424108b5c241ce84a0000008b4c241c8b5424188b5c24148b74242089542420895c241c5f897c24148974241089cb5f83c40c57e9e9000000900000000050000000|@14857,2097151,@3206|26,1,@14838 71,1,@14839 14838:D3,184|3b650c7303ff5524a80175708b0853ff700451bb5d0000008b01909090e8e23feeff50ff74241cff74241cff74241c8b5c2418b80100000090e8aee6ffff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941085889410458890151ff742418ff742418ff7424188b5c24148b442410e886ffffffeb05e92600000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c009000000000b4000000|@6329,63,@3196|20,0,46 30,1,@4940 52,0,0 58,1,@14792 168,0,0 14839:D3,324|3b650c7303ff55246a016a01b9d8707ab253a8017519ff700489cb8b00e83601000089c1583b650c7303ff5524ebe38d4424048b1189108d4424048b5904895804bb60d08bb28b442404909090e81a51efff6a016a01bb48c052089090e8aa04000050bba4d38bb28b44240c90e8fa50efff6a016a01bb48c052089090e88a0400005950f6c101756ff60101740bb820d48bb28b5d0490ff138b018b108b5804ff7104ff7208ff7204ff32f6c301753d8b03ff7304ff74240cff30ff7004ff7008ff74243cff74243cff742430ff742450ff7424508b5c242c8b442428e872e7ffff5b3b650c7303ff5524ebbe83c40c593b650c730aeb05e905000000ff5524eb8258a801752aff7004ff742420ff742420ff742420ff7424208b5c24148b0090e8dafeffff583b650c7303ff5524ebd2b80100000083c40cc210000000000040010000|@14856,2097151,@3205|13,0,@5279 30,1,@14840 66,0,@14844 78,1,@6493 87,0,I48 94,1,@14849 100,0,@14851 110,1,@6493 119,0,I48 126,1,@14849 143,0,@14854 222,1,@14796 306,0,0 14840:D3,92|3b650c7303ff55248b088b51088b75008d76f03b75087303ff5520897500c746fc03000000c70624ce8bb28b7a10897e048b4808894e088066ffbfff700456685cce8bb289e6568b02e8ae30efff83c40cc390900000000058000000|@14843,1048575,@3199|39,0,@14841 64,0,@14842 74,1,@6418 14841:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e90033efff0000000020000000|@6481,2097151,@3197|24,1,@6426 14842:D3,448|3b650c7303ff55248b4c24045052f6c301756b8b03813864e239b27566813864e239b2740cb854eb7ab28b5d049090ff138b1424ff7304ff31ff7104ff70088b5c24148b4208909090e8ea3ceeffbb5d0000009090e8de3ceeff8b4c24108b55008d52f03b55087303ff5520895500c742fc030000008b5904895a08eb0ae92b010000e9490000008942045889028b45008d40dc3b45087303ff5520894500c740fc020000008950048b54241089108d700cc746fc020000005f897e0489068d460cc740fc020000008970045e8930eb6b81380ce239b2756881380ce239b2740cb854eb7ab28b5d049090ff138b14248b75008d76f03b75087303ff5520897500c746fc030000008b7a04897e088b7a08897e048b400889068b45008d40f43b45087303ff5520894500c740fc020000008970048b7424048930eb0ae95d000000e9330000008b75008d76e83b75087303ff5520897500c746fc020000008b1189560489068d460cc740fc020000008b79048978048930eb228b45008d40f43b45087303ff5520894500c740fc020000008b51048950048b318930ff730489c15b3b650c7303ff5524e960feffff89c883c408c20400909000000000bc010000|@6417,63,@3198|23,0,@4611 31,0,@4611 38,0,@6377 74,1,@4940 79,0,46 86,1,@4940 211,0,@4600 219,0,@4600 226,0,@6377 14843:S40|5349474e41545552455328292e73696756616c28362973747275637473416e645479706573283229 14844:O1|@14845 14845:D3,48|8b088b45008d40f43b45087303ff5520894500c740fc02000000c700acd08bb28948048060ffbfc3000000002c000000|@14848,3,@3201|28,0,@14846 14846:D3,28|3b650c7303ff55248b188b4204ff25e8bd5208900000000018000000|@14847,63,@3200|15,0,I29 14847:S62|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283229283129 14848:S59|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283129 14849:D3,488|3b650c7303ff5524a80175648b083b19744cf6c3017540f60101753b8b31f7c6010000007407ba03000000eb068b168d54120183c20889de8b39ff7104ff3189d1d1e93bc9f3a68d7c3f018d7436018d4c0901740eeb4fff7104ff31eb48ff7104ff318b4d008d49f43b4d08730aeb05e923010000ff5520894d00c741fc020000008b5424108951048b74240489318b74240c894c24108974240c8b400483c408e95afffffff64424100175708b4c241083790401753f8b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008b5c2404891a8b5c240c89542410895c240c8b1c248b400483c408e90affffff8b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008b5c2404891aeb05e9370000008b5d008d5bf43b5d087303ff5520895d00c743fc020000008b74240c897304890b89542410895c240c8b1c248b400483c408e9a7feffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118b54240c894c24108954240c8b1c248b400483c408e968fefffff64424080175398b4424088378040175078b442404c208008b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b5424088910c208008b442404c208009000000000e4010000|@14850,63,@3202|39,0,1 210,0,0 273,0,0 372,0,0 14850:S54|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129676574457175616c73283429 14851:O1|@14852 14852:D3,48|8b088b45008d40f43b45087303ff5520894500c740fc02000000c700f0d38bb28948048060ffbfc3000000002c000000|@14848,3,@3204|28,0,@14853 14853:D3,28|3b650c7303ff55248b188b4204ff25e8bd5208900000000018000000|@14847,63,@3203|15,0,I29 14854:O4|@4650,@6706,0,@14855 14855:O5|@13386,676,0,676,0 14856:S56|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329736861726553747275637473283129 14857:S41|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329 14858:S47|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e74283329 14859:D3,32|3b650c7303ff552489c38b4204ba94b788b2e9f5e2fcff90000000001c000000|@14757,2097151,@3208|14,0,@13439 19,1,@13443 14860:D3,192|3b650c7303ff55248b4a148b75008d76f03b75087303ff5520897500c746fc03000000c70600d68bb28b7920897e048b4a04894e088066ffbf8b7a148b4d008d49f03b4d087303ff5520894d00c741fc03000000c70148d68bb2508b47308941048b42088941088061ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000894f04893753ff7210ff720c6890d68bb289e1518b5c241489f8e8260ffeff8b4c241883c4148b008901b801000000c2040090909000000000bc000000|@13963,2097151,@3213|37,0,@14861 86,0,@14862 144,0,@14863 158,1,@13885 174,0,0 14861:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3209| 14862:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3210| 14863:D3,188|3b650c7303ff5524ff72046860d78bb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff720c51bb030000008b420890e80282fdff83c408c3909000000000b8000000|@14758,1048575,@3212|12,0,@14864 45,0,3 55,0,@6321 92,0,0 114,0,0 121,0,0 128,0,0 134,0,0 144,0,@6321 161,0,1 170,1,@13717 14864:D3,32|3b650c7303ff552489c38b4204ba94b788b2e98de0fcff90000000001c000000|@14757,2097151,@3211|14,0,@13439 19,1,@13443 14865:O1|@14866 14866:D3,12|c39090900000000008000000|@14867,1,@3214| 14867:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329283129 14868:O1|@14869 14869:D3,12|c39090900000000008000000|@14867,1,@3215| 14870:D3,52|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5204ff220000000030000000|@13708,1048575,@3216| 14871:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329 14872:S36|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529 14873:D3,2416|8dbc246cffffff3b7d0c7303ff552883380175706a016a016a016a016a016a015053ff70086a01ff7424548d4c241451ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff742458ff7424588b9c24880000008b480489c88b520490ff128b45008d40e43b45087303ff5520894500c740fc06000000eb05e92b0000008b4c241c8948148b4c24188948108b4c241489480c8b4c24108948088b4c240c8948048b4c24088908eb5c833805755c8b48046a016a016a016a016a016a01505352ff7108ff7110ff31ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff742460ff7424608b590c8b4104e8f2feffffeb6fe9aa0000006a016a016a016a016a016a0150536a016a016a016a016a016a01ff700cff74246cff74246c8d4c240c51ff742454ff742474ff742474ff74245cff742478ff742478ff742478ff742478ff7424788b58088b480489c89090e8d297fdff8b45008d40e43b4508730aeb05e938000000ff5520894500c740fc060000008b4c24148948148b4c24108948108b4c240c89480c8b4c24088948088b4c24048948045983c41489086a0183c4046a016a016a016a016a016a016a016a016a016a016a016a016a0150ff70108d5c24088b0889c8bac0e47ab2909090e81e0aefffffb42490000000ffb42484000000ffb4248c0000006854e28bb28b45008d40f43b45087303ff5520894500c740fc020000008b4c24488948048b4c2438890889e1518b9c24ac0000009090e8e209feff8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703ace38bb28b8c249400000083c410894b048b9424800000008953088bb4248c00000089730c8063ffbf50528b84249c000000ba40058ab29090e8e229feff8b0c248b118b5a088b7304833e037509817e04f4e439b2745e6a016a01833e01751f508b460c8b542410ff128d4c24048b500489118d4c24048b5808895904eb1089e78b4b04890f89e78b5308895704508b44240483380175678b480cf6c101741af68424880000000174103b8c24880000007d0ceb5ee945060000ff5538ebebf6c1017413f68424880000000174092b8c24880000007105ff5538ebf283c10189cf89fb8b842484000000909090e886fef3ff8338037543f7c701000000eb05e94d0000007412f6400401740c3b78047e0ceb1ae939000000ff5538ebef8b4804b8008589b28b5d04909090ff138b48043b650c7303ff5524eba58b1083fa01741083fa077471b8bcc08bb28b5d0490ff13ff742450684ce58bb28b9c24b0000000b8b8e58bb2909090e8fa2eeeffbbc4347bb29090e8ee2eeeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b44241051ff7008eb05e9040100008b58048b1089d09090e802e4ffff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701c4e58bb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40d03b45087303ff5520894500c740fc020000008948049090c70018e27ab28d480cc741fc02000000894104c701f0e58bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff1389e151ff74247c50bb030000008b8424a4000000e8567bfdffeb628b442404833801740cb824e68bb28b5d049090ff138b400ca8017413f68424880000000174092b8424880000007105ff5538ebf283c00189c789fb8b842484000000909090e86efcf3ff833803753bf7c7010000007414f6400401740e3b7804eb05e9d50300007e07eb12ff5538ebed8b4804b8008589b28b5d04ff138b40043b650c7303ff5524ebad833807750b8b48048b5104833a01740f89c1b864e68bb28b5d04909090ff138b5a08833b03750c8b73048b3683fe01742eeb06837b04017426ff720cff7210516890e68bb2bbbce68bb28b442410ba88787bb2e87aeeefff83f8037541eb09ff720cff721051eb36ffb424a8000000ff742460ffb424bc000000ff742418ffb424ac000000ffb42490000000bbe8e68bb2b80ce78bb290e812080000eb4e8b44240c83380b75678b48048b54245883f901751383fa017407b901000000eb43b903000000eb3cf6c20175328b19833b0d75248b328b7b043b3e751b8b720489f28b710489f13b650c730aeb05e9be020000ff5524ebb8b901000000eb05b90100000083f901750cb901000000eb3be9310000008b480c8b51088b5a04833b057507b901000000eb218b4d008d49f83b4d087303ff5520894d00c741fc010000008911eb05b90100000083f901756e837c2404017435ffb424a8000000ff742460ffb424bc00000050ffb424ac000000ffb42490000000bbb8eb8bb2b8d8eb8bb2909090e826070000eb708b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410848c052088b9424ac0000008951048b9c24b4000000eb05e99d00000089198d7110c746fc030000008946088b442458894604c706050000008b45008d40f03b45087303ff5520894500c740fc03000000894808eb05e9b0010000897004c70070867ab28b4c2408f6c1017413f68424940000000174092b8c24940000007105ff5538ebf283c1018b75008d76f43b75087303ff5520897500c746fc02000000894604c706010000005689cb8b842494000000e8aebef3ffeb608b018b5004833a01755b8b5a0cf6c3017415f684249400000001740b3b9c24940000007d2aeb05ff5538ebf08b75008d76f43b75087303ff5520897500c746fc02000000894604c70601000000eb59f6c301741ff6842494000000017415eb0ae9ec000000e96b0000002b9c24940000007105ff5538ebf283c301ff3189df89fb8b84249400000090e842f9f3ff833803753bf7c7010000007412f6400401740c3b78047e0ceb19e925000000ff5538ebef8b4804b8008589b28b5d049090ff138b58043b650c7303ff5524ebaf89c6eb2550eb228b75008d76f43b75087303ff5520897500c746fc02000000894604c7060100000050833e077520ffb42498000000ffb424980000008b5c240c8b442408909090e842e2ffffeb328b44240ca8017413f68424980000000174092b8424980000007105ff5538ebf283c0015689c38b842498000000e85ebdf3ff83c40483c40483c41483c4085883c454c23c00909090000000006c090000|@14908,2097151,@3231|366,1,@13753 486,0,@6366 494,1,@6367 520,0,@14874 574,1,@13885 604,0,@14877 655,0,@13964 662,1,@13965 685,0,@4643 842,1,@8978 893,0,@13791 931,0,@14812 946,0,@14881 958,0,@14883 966,1,@4940 971,0,@6530 978,1,@4940 1011,0,3 1021,0,@6321 1058,1,@14815 1089,0,0 1110,0,@5592 1129,0,@14884 1148,0,@5592 1199,0,@6364 1218,0,@14886 1238,0,0 1245,0,0 1252,0,3 1258,0,0 1269,0,@6321 1290,0,1 1302,1,@13717 1318,0,@14888 1378,1,@8978 1424,0,@13791 1465,0,@14891 1511,0,@14893 1516,0,@14895 1525,0,@6713 1530,1,@6798 1587,0,@14897 1592,0,@14898 1598,1,@14899 1631,0,0 1638,0,1 1693,0,0 1700,0,0 1710,0,0 1736,0,0 1771,0,0 1821,0,@14906 1826,0,@14907 1834,1,@14899 1867,0,I48 1919,0,2 1962,0,@5500 2031,0,0 2046,1,@8774 2125,0,0 2190,1,@8978 2234,0,@13791 2294,0,0 2330,1,@14821 2382,1,@8774 14874:D3,204|3b650c7303ff552452bbd0b08bb2909090e82a29eeff8b0c24ff71046834e38bb28b55008d52f43b55087303ff5520895500c742fc02000000894204c70207000000f6c201740ab8ecd57ab28b5d04ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089108d500cc742fc05000000894210c7420c01000000c7420801000000c7420401000000c70201000000f6c201740ab8ecd57ab28b5d04ff1389e050ff710c52bb030000008b410890e82e76fdff83c40cc3909000000000c8000000|@14876,1048575,@3220|10,0,@14787 18,1,@4940 29,0,@14875 62,0,3 72,0,@6321 108,0,0 130,0,0 137,0,0 144,0,0 150,0,0 160,0,@6321 177,0,1 186,1,@13717 14875:D3,32|3b650c7303ff552489c38b4204bac4a788b2e991c4fcff90000000001c000000|@13757,2097151,@3219|14,0,@13416 19,1,@13418 14876:S59|5349474e41545552455328292e73696756616c2836297369676e61747572655768657265547970652837296c6f6f6b75704661696c757265283129 14877:D3,100|3b650c7303ff55248b4a0c8b75008d76f43b75087303ff5520897500c746fc020000008b7930897e048b7920893e53ff7208ff72046824e48bb289e15189c389f0e80201feff8b4c241483c4108b008901b801000000c204009090900000000060000000|@13963,2097151,@3223|54,0,@14878 66,1,@13885 82,0,0 14878:D3,188|3b650c7303ff5524ff720468f4e48bb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff720c51bb030000008b420890e86e74fdff83c408c3909000000000b8000000|@14880,1048575,@3222|12,0,@14879 45,0,3 55,0,@6321 92,0,0 114,0,0 121,0,0 128,0,0 134,0,0 144,0,@6321 161,0,1 170,1,@13717 14879:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9d1c2fcff90000000001c000000|@13757,2097151,@3221|14,0,@13416 19,1,@13418 14880:S28|5349474e41545552455328292e676976654572726f72283329283129 14881:D3,32|3b650c7303ff552489c38b4204bac4a788b2e979c2fcff90000000001c000000|@14882,2097151,@3224|14,0,@13416 19,1,@13418 14882:S46|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729283129 14883:S2|6060 14884:O2|3,@14885 14885:S24|2068617320616c7265616479206265656e2073657420746f 14886:O2|3,@14887 14887:S30|43616e6e6f74206170706c792074797065207265616c69736174696f6e2e 14888:O4|@4608,@5398,@14890,@14889 14889:O5|@13386,937,0,937,0 14890:S12|736574576865726554797065 14891:O4|@4608,@5398,@14890,@14892 14892:O5|@13386,935,0,935,0 14893:O1|@14894 14894:D3,16|b805000000c39090000000000c000000|@13788,1,@3225|1,0,2 14895:O1|@14896 14896:D3,16|b803000000c39090000000000c000000|@13788,1,@3226|1,0,1 14897:S25|646f6573206e6f74207065726d697420657175616c6974792e 14898:S16|697320616e2065717479706520627574 14899:D3,660|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701cce98bb28b5424188951048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c7068cea8bb28956048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704890fff7424146804eb8bb25357508b5c2424b8b8e58bb290e8e223eeffbbc4347bb29090e8d623eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc020000005a895004c70007000000a801740e89c2b8ecd57ab28b5d049090ff1389cb89c6b801000000909090e8ce47efff535650ff74240c6a01bbd10700008b442430ba94477bb2e8765fefff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b54240c895104c70107000000f6c101740d89c2b8ecd57ab28b5d0490ff138b55008d52c43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc02000000895104c701f0a47ab28d510cc742fc02000000894a0489028d420cc740fc02000000895004c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40d03b45087303ff5520894500c740fc02000000894804c70018e27ab28d480cc741fc02000000894104c701f0e58bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff1389e151ff74241050bb030000008b44241c909090e8966ffdff83c408c218000000000090020000|@14905,2097151,@3230|34,0,@14900 75,0,@14902 120,0,@14903 132,0,@14883 138,1,@4940 143,0,@6530 150,1,@4940 183,0,3 193,0,@6321 235,0,3 246,0,@6321 262,0,0 270,1,@6511 284,0,1000 293,0,@6596 298,1,@6597 335,0,3 347,0,@6321 384,0,0 405,0,@5643 439,0,@5592 488,0,@5592 540,0,@6364 559,0,@14886 579,0,0 586,0,0 593,0,3 599,0,0 610,0,@6321 630,0,1 642,1,@13717 14900:D3,100|3b650c7303ff55248b52048b52209090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@14901,1048575,@3227|49,0,0 85,0,0 14901:S64|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e7453657428322974797065456e762d283129 14902:D3,100|3b650c7303ff55248b52048b52309090ff12a801753e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b0089018b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c390900000000060000000|@14901,1048575,@3228|49,0,0 85,0,0 14903:D3,32|3b650c7303ff552489c38b4204bac4a788b2e9c1bcfcff90000000001c000000|@14904,2097151,@3229|14,0,@13416 19,1,@13418 14904:S56|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229283129 14905:S53|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229 14906:S21|6973206e6f7420612073696d706c6520747970652e 14907:S17|6973206120646174617479706520627574 14908:S43|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729 14909:O1|@14910 14910:D3,64|3b650c7303ff55248b4c240450f6c301751e8b7b04518b1b8b44240490e83200000089c189fb3b650c7303ff5524ebdd89c883c404c20400000000003c000000|@6417,63,@3233|30,1,@14911 14911:D3,344|813bece139b2755e813bece139b2740db854eb7ab28b5d04909090ff138b5b088b430883380175378b4804f6c101740583c1027105ff5538ebf6f6c101740ff64424040174083b4c24047e0ceb05ff5538ebf389c8c204008b442404c204008b442404c20400813b64e239b2755c813b64e239b2740bb854eb7ab28b5d0490ff138b5b088b430483380175378b4804f6c101740583c1027105ff5538ebf6f6c101740ff64424040174083b4c24047e0ceb05ff5538ebf389c8c204008b442404c204008b442404c20400813b0ce239b2755c813b0ce239b2740bb854eb7ab28b5d0490ff138b5b088b5b048b442404f6c30175528b0b8b5108833a0175358b7204f7c601000000740583c6027105ff5538ebf6f7c6010000007408a80174043bf0eb05ff5538ebf77f0b89c6eb07e91600000089c689f08b730489f33b650c7303ff5524eba9c204008b442404c204000000000054010000|@14912,31,@3232|2,0,@4596 10,0,@4596 17,0,@6377 104,0,@4611 112,0,@4611 119,0,@6377 204,0,@4600 212,0,@4600 219,0,@6377 14912:S44|434f5049455228292e6765744e65787452756e74696d654f66667365742831296765744f6666736574283329 14913:D3,1268|3b650c7303ff55248b4c24148b09f6c101740df64424100174062b4c24107105ff5538ebf583c101a8017508f6c1017503ff55383bc17515c70301000000c7430401000000b801000000c2140089c1535089cf89fb8b442414e822ecf3ff8338037537f7c701000000740df640040174073b78047e07eb15ff5538ebf48b4804b8008589b28b5d04909090ff138b48043b650c7303ff5524ebb789c2833a01756e8b42048b480483390575688b5d008d5bf03b5d087303ff5520895d00c743fc03000000c7032cf38bb28b7424148973048b7c2418897b088063ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70298f48bb2895a048062ffbfff7008ff710452bbd0f58bb2eb0ae960010000e9e60000008b410890e8b218efff8b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c701050000008b45008d40e43b45087303ff5520894500c740fc030000005a895008894804c70070867ab28d4810c741fc02000000894104c7010100000050518b5c24088b44241ce8ceaff3ff8b442404a801740583c0027105ff5538ebf66a016a01ff742428ff742428ff742428ff742428ff7424288d5c241490e83efeffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948048b4c240889088b4c24105a83c4088911894104b80100000083c408c214008b1c24f6c301740583c3027105ff5538ebf66a016a0150ff742428ff742428ff742428ff742428ff74242889da8d5c241889d0909090e8c6fdffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948045989088b4c240c5a83c4048911894104b80100000083c408c21400833a07740cb8f8f58bb28b5d049090ff138b42048b4804833901740db8f8f58bb28b5d04909090ff138b5808f6420801755c8b7208f64604017558f7c6010000007565837e040175048b3eeb4b8b7910ff7104ff71088b4604e83e05000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b36893057ff7304ff33e83e20eeff89c7eb2de939000000e934000000ff7104ff7108ff7110ff7304ff33eb13bf48c05208ff7104ff7108ff7110ff7304ff3389fbb8acf68bb2909090e8321aeeffeb118b4308ff7104ff7108ff7110ff7304ff338b4c24248b0989caf6c201740583c2027105ff5538ebf68b5c242489138b5424208b1289d6f7c601000000740583c6027105ff5538ebf68b7c242089378b75008d76f03b75087303ff5520897500c746fc030000008946088b4424048946045883c40489068b45008d40f43b45087303ff5520894500c740fc02000000895004c700010000008b542404833a0375078b52048b12eb038b52048b5d008d5bdc3b5d087303ff5520895d00c743fc02000000895304c703010000008d530cc742fc050000005f83c404897a10894a0c895a0859894a04c702010000008b4d008d49e43b4d087303ff5520894d00c741fc0300000089710889510489018d4110c740fc02000000894804c7000100000051508b5c24088b44241ce8eeacf3ff8b442404a801740583c0027105ff5538ebf66a016a01ff742428ff742428ff742428ff742428ff7424288d5c241490e85efbffff8b45008d40e83b45087303ff5520894500c740fc02000000598948048b4c240489088d500cc742fc020000005b895a04890a8b4c240883c4048901895104b80100000083c408c214009000000000f0040000|@14933,2097151,@3240|58,0,0 65,0,0 70,0,0 90,1,@8978 129,0,@13791 198,0,@14914 246,0,@14919 265,0,@14926 286,1,@6446 323,0,2 360,0,@5500 379,0,0 394,1,@8774 501,0,0 618,0,0 634,0,@14928 657,0,@14928 718,1,@14931 762,1,@4953 797,0,I48 818,0,@14932 826,1,@4940 979,0,0 1031,0,0 1064,0,0 1115,0,0 1130,1,@8774 1249,0,0 14914:D3,220|3b650c7303ff55248b480483390175628b590cf6c301740df642080174073b5a087d0deb05ff5538ebf4b801000000c3f6c301740bf642080174052b5a087105ff5538ebf683c301528b042489df89fb8b480489c8e81ee7f3ff833803753bf7c7010000007414f6400401740e3b7804eb05e9570000007e07eb12ff5538ebed8b4804b8008589b28b5d04ff138b58043b650c7303ff5524ebaf89c1833901740cb81cf48bb28b5d049090ff138b45008d40f83b45087303ff5520894500c740fc010000008b490483c4048908c3b801000000c300000000d8000000|@14918,63,@3234|43,0,0 86,1,@8978 132,0,@13791 162,0,@14915 207,0,0 14915:O4|@4608,@5398,@14917,@14916 14916:O5|@13386,1350,0,1350,0 14917:S21|6d61704964733a636f707954797065436f6e737472 14918:S40|5349474e41545552455328292e73696756616c2836296d6170496473283129636f70794964283129 14919:D3,96|3b650c7303ff55246a016a016a01680cf58bb26870f58bb26a018d4c240c518b5a04909090e8420fefff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@14925,2097151,@3237|15,0,@14920 20,0,@14923 38,1,@6437 14920:O1|@14921 14921:D3,12|c39090900000000008000000|@14922,1,@3235| 14922:S49|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129283129 14923:O1|@14924 14924:D3,12|c39090900000000008000000|@14922,1,@3236| 14925:S46|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129 14926:O1|@14927 14927:D3,12|c39090900000000008000000|@14925,1,@3238| 14928:O4|@4608,@5398,@14930,@14929 14929:O5|@13386,1376,0,1376,0 14930:S6|6d6170496473 14931:D3,100|3b650c7303ff5524a801754aff308b4004e8eaffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c70059000000c3b801000000c30000000060000000|@6661,3,@3239|81,0,44 87,0,0 14932:S8|73686172696e6720 14933:S31|5349474e41545552455328292e73696756616c2836296d6170496473283129 14934:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@14935,1048575,@3241|66,0,8388607 84,0,@5401 14935:S36|5349474e41545552455328292e73696756616c2836296d617046756e6374696f6e283129 14936:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e99409efff0000000020000000|@6481,2097151,@3242|24,1,@6426 14937:S22|5349474e41545552455328292e73696756616c283629 14938:S64|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322970617373325369676e617475726542696e64283529 14939:D3,48|3b650c7303ff55248b48048b52048b1c2489142468782d89b289da8b590c8b3089f052e94c37fdff000000002c000000|@13633,1048575,@3245|21,0,@13610 36,1,@13619 14940:D3,64|3b650c7303ff552452ff7004bb5d0000008b009090e80613eeff598b14248b520483c4048b1c2489142489da8b590852e9233ffdff909090000000003c000000|@13633,1048575,@3246|13,0,46 22,1,@4940 49,1,@13635 14941:D3,220|3b650c7303ff5524ff720468b8f98bb25289c3b8e8f98bb290e8ae12eeffbbe43a89b29090e8a212eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b04248d54240452ff700c51bb030000008b4008e88241fdff83c40cc2040000000000d8000000|@13646,1048575,@3248|12,0,@14942 20,0,@14943 26,1,@4940 31,0,@13643 38,1,@4940 71,0,3 81,0,@6321 120,0,0 142,0,0 149,0,0 156,0,0 162,0,0 172,0,@6321 194,0,1 202,1,@13644 14942:D3,28|3b650c7303ff552489c38b4204e912a8fcff90900000000018000000|@13641,2097151,@3247|14,1,@13411 14943:S8|46756e63746f7220 14944:D3,4092|8dbc2478ffffff3b7d0c7303ff55288b4d008d49f03b4d087303ff5520894d00c741fc010000408b54245889118d7108c746fc01000040c70601000000565351ff7004ff30ff742468ff742468ff742468ffb424a000000089d38b4008bac03e89b2909090e86a44fdff8b4d008d49f43b4d087303ff5520894d00c741fc020000008b942494000000895104c701010000008b5c24605051b8010000008b5340ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40cc3b45087303ff5520894500c740fc01000040c700ffffffff8d5008c742fc01000040c70228e07bb28d5a08c743fc03000000895308894304c703050000008d4310c740fc0400000089480c8b14248950088958048b74240489305051535089f38b42089090e8ba0e000083f8017507b868c05208eb72b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb14f641ff10750e89c2b850337db28b5d049090ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93b000000c647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f88b4c24188b098b54240cbb010000008b7208f7c601000000751cf6c301740583c3027105ff5538ebf68b76043b650c7303ff5524ebdcf6c101740cf6c30174078d49ff03cb7105ff5538ebf48b5c2418890b8b0b8b75008d76ec3b75087303ff5520897500c746fc04000000c706a80c8cb28b7c2478897e048946088b5c247c895e0c8066ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707940d8cb28b5a10895f048977088067ffbf8b32833e03756b8b5e048b1b8b760c8b36518b0e83f9017507b968c05208eb5b518b0c2450b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c78b4c2408d1e983c604f3a58d7c3f018d7436018d4c09018060ffbfeb05e92e00000089c1eb046a0150578b45008d40f03b45087303ff5520894500c740fc03000000894808895804c70001000000eb07516a015089f0578b4d008d49e43b4d087303ff5520894d00c741fc060000008b5c240c8959148b34248971108b7a0c89790cc74108010000008b5a0489590489015150ff7504bb52fe8bb2538965048b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000b917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c701cc0d8cb28d5108c742fc0400000089420c895a08894a04c7020300000083c40458894504eb6f8b650483c4045b895d04833809755850bb03000000b815000000bafc317ab2e8ae33eeff89c3b8bc5589b2e8120deeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0189e389d0bac0e47ab290e8f6e5eeff817c245c48c05208746ff644245c0175228b74245cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090174728b45008d40e03b45087303ff5520894500c740fc040000008b4c245089480c8b4c24388948088b4c244c8948048b4c245c89088d5014c742fc02000000c7420401000000eb05e93c00000089028b9c24d0000000891389c28b45008d40f43b45087303ff5520894500c740fc02000000eb05e91000000089500489088b542428909090ff12eb728b45008d40f03b45087303ff5520894500c740fc03000000c700040e8cb28b4c240c8948048b8c24cc0000008948088060ffbf8b55008d52ec3b55087303ff5520895500c742fc04000000c702c40e8cb28b5c2428895a048b9c24d0000000895a088b74245489720c8062ffbf8b7d00eb05e9730000008d7fec3b7d087303ff5520897d00c747fc04000000c7074c0f8cb28b7424088977048bb424d80000008977088b4c2454894f0c8067ffbf8b4d008d49f03b4d087303ff5520894d00c741fc030000008951088941048939ff74243c6a036848c05208ff7424486a0189cb8b442448e85eebfdff8b45008d40e43b45087303ff5520894500c740fc010000008b4c245483c41889088b54244889028d4008c740fc040000009090c700d40f8cb28b94249c0000008950048b9c24a00000008958085e83c40489700c8060ffbf8b75008d76ec3b75087303ff5520897500c746fc04000000c70634108cb28bbc248c000000897e048b8c2490000000894e085a89560c8066ffbf8b55008d52ec3b55087303ff5520895500c742fc04000000c70294108cb28b9c2480000000895a048bbc2484000000897a088b4c240c894a0c8062ffbf8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701f4108cb28b5c24788959048b7c247c8979085b83c41889590c8061ffbf8b5d008d5bc83b5d087303ff5520895d00c743fc0d0000008953308b54243c89532c8b7c2440897b28894b248973208b4c2444894b1c8943188b4424488943148b74244c8973108b74245089730c8b7424548973088b742458897304c7030c138cb28b75008d76f03b75087303ff5520897500c746fc03000000c70638138cb28b44242c8946048b4424248946088066ffbf8b45008d40e03b45087303ff5520894500c740fc07000000c7001c158cb28b8c24840000008948048b3c248978088b7c241889780c8b7c24088978108bbc24880000008978148b54242c8950188060ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70204188cb28b4c2424894a048062ffbf6a016a016a016a016a016a01525053ffb424a0000000ffb424d80000006848c052088d44241850ff74246c89f38b442460ba7c188cb2909090e8b61500008b45008d40e43b45087303ff5520894500c740fc060000008b4c24148948148b4c24108948108b54240c89500c8b5c24088958088b5c24048958048b342489308bbc24940000008b4f0c8b0983f9017407b801000000eb2750bba0a38cb28b8424c80000009090e84a08eeffffb424980000008b5c2404e87234fdff83c4046810a28cb2bb010000008b4424049090e83efbeeff68aca38cb2bb010000008b44240490e82afbeeff8b4c24448b09ba01000000f6c101752e8b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b11891389da8b49043b650c7303ff5524ebcd89d183f9017507b968c05208eb6bba0100000089cbf6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdff6c201740a81faffffff017d08eb14f642ff10750e89c3b850337db28b5d049090ff1389cb89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d00720aeb05e948000000ff5520897d00d1e9894ffcc647ff4057f3ab5fb80100000083fb0174238b0b894c47fea801740583c0027105ff5538ebf68b4b0489cb3b650c7303ff5524ebd88067ffbf89f989d0baffffff002351fc8d54120183fa017507b868c05208eb6689cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fb80100000053575256a801740ff64424040174083b4424047c07eb68ff5538ebf38b4c240c8b4c41fe8b5104833a01755889c3eb05e923010000f6c301740ef604240174088d5bff031c247105ff5538ebf38b75008d76f43b75087303ff5520897500c746fc02000000895e04c70601000000833a05751a89c3b808377bb28b5d04eb0ae9c4000000e9900000009090ff13833a0175148b5a08833b0375078b7b048b3feb0c8b7b04eb078b5a048b1b89df8b5d008d5bdc3b5d087303ff5520895d00c743fc02000000897b04c703010000008d7b0cc747fc05000000508b42108947108b420c89470c895f088b5a04895f04c707010000008b5d008d5bf03b5d087303ff5520895d00c743fc030000008b4908894b08897b048933eb0389cb508b44240c8b0c24895c48fef6c101740583c1027105ff5538ebf689c883c4043b650c7303ff5524e9bcfeffff8b44240883c4088060ffbf83c404eb0151b9ffffff002348fc8d4c0901ba0100000083f901743789cb83eb0283e9028b4c48fe8b75008d76f43b75087303ff5520897500c746fc02000000895604890e89d989f23b650c7303ff5524ebc48b1c24b9ffffff00234bfc8d4c0901be010000005283f901747189ca83ea0289cb83eb0283e9028b7c24048b4c4ffef6c3017410bfffffff002378fc8d7c3f013bdf720f89c7b8cc7b7ab28b5d04909090ff138b5c58fe8b7d008d7fe83b7d087303ff5520897d00c747fc02000000894f04891f8d4f0cc741fc02000000897104893989cb89d189deeb05e90d0000003b650c7303ff5524e978ffffff8b8c24c800000089318b55008d52e03b55087303ff5520895500c742fc07000000c70208a48cb28b9c24a4000000895a048b7424208972088b74243889720c8942108b4424288942148bb424a80000008972188062ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70738a58cb28b4424188947048957088067ffbf8b442408833803756e8b50048b128b400c8b008b0883f9017507b868c05208eb5b518b0c2450b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b74240489f889c78b4c2408d1e983c604f3a58d7c3f018d7436018d4c09018060ffbfeb0ae92b0000006a016a01578b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895104c70101000000eb0789c16a016a01578b45008d40e43b45087303ff5520894500c740fc060000008b5424348950145a83c4088950108b54241489500c8b14248950088b74240c897004890850e85a780000508b5c2408b80100000090e8c27b000083f80175058b0424eb0a89c38b0424e8be9c00008b8c24bc00000083c40489018b45008d40f43b45087303ff5520894500c740fc020000008b9424d4000000895004c700010000008b9c24a000000050b8010000008b53409090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40bc3b45087303ff5520894500c740fc01000040c700ffffffff8d5008c742fc01000040c70228e07bb28d5a08c743fc03000000895308894304c703050000008d4310c740fc050000008948105983c43489480c8958088b8c24980000008948045a83c418891089c28d4018c740fc020000008950048908528b54240890ff128b45008d40f83b45087303ff5520894500c740fc010000005989088b4c24748901b801000000c280009000000000f80f0000|@15277,2097151,@3400|57,0,0 94,0,@13648 102,1,@13649 142,0,0 153,0,0 191,0,2 208,0,0 256,0,-1 272,0,@6817 294,0,2 338,1,@14945 348,0,I49 355,0,0 401,0,16777215 418,0,@7886 432,0,0 482,0,0 543,0,0 642,0,@14952 693,0,@14954 736,0,I49 748,0,0 869,0,0 928,0,0 946,0,$14944+1114 980,0,0 985,0,11 990,0,0 1034,0,10 1076,0,@14955 1101,0,1 1131,0,1 1136,0,10 1141,0,@5052 1146,1,@5053 1153,0,@13704 1158,1,@4940 1189,0,@13705 1199,0,@5398 1205,0,@4608 1256,0,@6366 1262,1,@6367 1270,0,I48 1288,0,I48 1293,0,4 1381,0,0 1478,0,@14957 1529,0,@14959 1594,0,@14960 1665,0,I48 1682,1,@13905 1739,0,@14961 1800,0,@14962 1858,0,@14963 1919,0,@14964 2042,0,@14969 2072,0,@14971 2120,0,@14973 2201,0,@14977 2246,0,I48 2266,0,@14979 2274,1,@14981 2360,0,0 2368,0,@15270 2382,1,@4940 2398,1,@13635 2406,0,@15264 2411,0,0 2422,1,@6418 2427,0,@15271 2432,0,0 2442,1,@6418 2453,0,0 2516,0,I49 2523,0,0 2569,0,16777215 2586,0,@7886 2604,0,0 2654,0,0 2707,0,8388607 2724,0,I49 2737,0,0 2780,0,0 2890,0,0 2902,0,@6539 2986,0,0 3024,0,0 3130,0,8388607 3142,0,0 3210,0,8388607 3222,0,0 3259,0,8388607 3277,0,@5401 3398,0,@15273 3476,0,@15275 3521,0,I49 3533,0,0 3655,0,0 3730,1,@15189 3740,0,0 3746,1,@15198 3766,1,@15276 3818,0,0 3831,0,0 3871,0,2 3888,0,0 3936,0,-1 3952,0,@6817 3974,0,2 4076,0,0 14945:D3,104|3b650c7303ff5524a801754c53ff7004ff74240c8b00909090e85e00000050ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000064000000|@6329,63,@3250|26,1,@14946 89,0,0 14946:D3,320|3b650c7303ff55248b0883390175088b5004833a01740e89c1b8d80b8cb28b5d049090ff138b70088b7d008d7fe83b7d087303ff5520897d00c747fc050000008b42108947108b420c89470c8b42088947088b4204894704c7070100000081fb48c052087441f6c301752eff7608ff7604ff3689de57bf48c05208ff7104b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901741ceb20ff7608ff7604ff3657ff7104eb12ff7608ff7604ff3657ff71048b4c2408eb1f89d9bb5d00000089c8909090e84600eeff8b5c2408909090e83a00eeff89c18b45008d40d03b45087303ff5520894500c740fc030000008b5424108950088b54240c89500489088d4810c741fc030000008b5424188951085b895904c7010900000089c38d4110c740fc030000008958085b83c40c8958048908c204009090000000003c010000|@14951,63,@3249|26,0,@14947 90,0,0 96,0,I48 119,0,I48 127,0,4 188,0,46 198,1,@4940 210,1,@4940 279,0,4 14947:O4|@4608,@5398,@14949,@14948 14948:O5|@14950,2184,0,2184,0 14949:S29|6d6b49643a204e6f7420426f756e64206f72206e6f7420466f726d616c 14950:S34|6d6c736f757263652f4d4c436f6d70696c65722f535452554354555245535f2e4d4c 14951:S70|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296d6b4964283129 14952:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@14953,1048575,@3251|66,0,8388607 84,0,@5401 14953:S98|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296172675369675769746853656c65637465642d6d6170546f53656c6563746564283129 14954:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e990f3eeff0000000020000000|@6481,2097151,@3252|24,1,@6426 14955:O1|@14956 14956:D3,28|3b650c7303ff5524bb15000000e9aa5deeff90900000000018000000|@5217,2097151,@3253|9,0,10 14,1,@5214 14957:D3,96|3b650c7303ff55248b4a088b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4804890b8b7208891e8b188b45008d40f43b45087303ff5520894500c740fc0200000089480489188b4a0489caff22000000005c000000|@14958,1048575,@3254| 14958:S68|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132295f2d283129 14959:D3,116|3b650c7303ff5524ff30526a018b5a0c8b40049090e842befeff8b0c248b51088b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b5108891a89c38b45008d40f43b45087303ff5520894500c740fc0200000089580483c4045b89188b5104ff220000000070000000|@14958,1048575,@3255|22,1,@14345 14960:D3,116|3b650c7303ff5524ff30526a018b5a0c8b40049090e88ac1fdff8b0c248b51088b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b5108891a89c38b45008d40f43b45087303ff5520894500c740fc0200000089580483c4045b89188b5104ff220000000070000000|@14958,1048575,@3256|22,1,@13851 14961:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@3257| 14962:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@3258| 14963:D3,76|3b650c7303ff552450528b4a0c89ca90ff1283f80175298b04248b48088b44240489ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c383c408c30000000048000000|@12907,1048575,@3259| 14964:D3,176|3b650c7303ff552452b8010000008b4a0c89ca90ff128b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008b142489c38d4108c740fc020000009090c700b8118cb28948048060ffbf53518b720889f2909090ff12588b008b4c24048b490450b8010000008b5124909090ff1283f80175058b0424eb0a89c38b0424e88600000083f801750883c4045883c404c389c383c4045883c404e9c300000090909000000000ac000000|@14968,1048575,@3263|10,0,0 48,0,0 71,0,@14965 106,0,0 134,1,@14966 161,1,@14967 14965:D3,56|8b4a048b098b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0089038b5204891ab801000000c3900000000034000000|@13596,15,@3260|42,0,0 14966:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3261| 14967:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3262| 14968:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229656e7657697468417267732d283129 14969:O1|@14970 14970:D3,16|b801000000c39090000000000c000000|@14968,1,@3264|1,0,0 14971:D3,380|3b650c7303ff55248b4a088b0989cbf6c301740583c3027105ff5538ebf68b7208891e8378040174738b5d008d5be03b5d087303ff5520895d00c743fc01000040c703ffffffff8d7b08c747fc01000040c70728e07bb28d7708c746fc03000000897e08895e04c706050000008b58108b780cff7008ff308b45008d40e43b45087303ff5520894500c740fc060000008958148978108b5c2404eb05e91700000089580c8948088970045983c404890852e86e6dfdffeb708b5d008d5be03b5d087303ff5520895d00c743fc01000040c703ffffffff8d7b08c747fc01000040c70728e07bb28d7708c746fc03000000897e08895e04c706050000008b58108b780c52ff7008ff308b45008d40e43b45087303ff5520894500c740fc06000000895814897810eb05e9190000008b5c240489580c8948088970045983c404890890e83a65fdff8b0c248b51048b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b490483c4048919c30000000078010000|@14972,63,@3265|67,0,-1 83,0,@6817 105,0,2 178,1,@13782 210,0,-1 226,0,@6817 248,0,2 322,1,@13765 14972:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296e6577547970654964283129 14973:D3,332|8b42188b00b901000000a801752e8b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b08890b89d98b40043b650c7303ff5524ebce89c883f8017507b868c05208eb72b90100000089c3f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb14f641ff10750e89c3b850337db28b5d049090ff1389c3b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93b000000c647ff4057f3ab5fb80100000083fb0174238b0b894c47fea801740583c0027105ff5538ebf68b4b0489cb3b650c7303ff5524ebd88067ffbf89f889c18b45008d40e03b45087303ff5520894500c740fc07000000c7007c168cb28b5a048958048b72088970088b7a0c89780c8948108b4a108948148b5a148958188060ffbfc390900000000048010000|@14976,63,@3267|6,0,0 68,0,I49 75,0,0 121,0,16777215 138,0,@7886 152,0,0 202,0,0 280,0,@14974 14974:D3,200|3b650c7303ff5524a801740df642180174073b42187d0ceb05ff5538ebf48b5204ff22a801740df642140174073b42147d4ceb05ff5538ebf48b4a0ca801740bf641140174052b41147105ff5538ebf683c001a80174138b7208bbffffff00235efc8d5c1b013bc3720f89c3b8cc7b7ab28b5d04909090ff138b4446fec3a801740bf642140174052b42147105ff5538ebf683c001a80174138b5a10b9ffffff00234bfc8d4c09013bc1720d89c1b8cc7b7ab28b5d0490ff138b4443fec3909000000000c4000000|@14975,1048575,@3266|91,0,8388607 109,0,@5401 157,0,8388607 175,0,@5401 14975:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129283129 14976:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129 14977:D3,16|8b52048b1289d0c3000000000c000000|@14978,5,@3268| 14978:S73|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132297265735369672d283129 14979:O2|@14981,@14980 14980:O2|@15222,@14979 14981:D3,5504|8dbc2464ffffff3b7d0c7303ff55288b4d008d49f03b4d087303ff5520894d00c741fc03000000c701282e8cb28b74241c8971048b7c24188979088061ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706e02e8cb28b7c241c897e048b7c2418897e088066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000897704890f83380575718b48048b75008d76f83b75087303ff5520897500c746fc01000040c70601000000ff711053ff710cff7108ff711457ff31ff71045256b8010000008b542448ff1250b8010000008b542448ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c701682f8cb28b542404eb05e9630500008951048b5c24248959088061ffbf8b75008d76ec3b75087303ff5520897500c746fc04000000c70634308cb28946048956088b142489560c8066ffbf6a016a016a016a016a016a0150ff74246856ff742468ff742468ff742468ff7424688d74241c56ff74246889cb8b44244c8b54244490e882feffff8b45008d40e43b45087303ff5520894500c740fc060000008b4c24188948148b4c24148948108b4c241089480c8b4c240c8948088b4c24088948048b4c2404890850ff742404ff742468ff742468ff74244c8b5c24308b44243cbac03e89b2e85624fdffb9010000008b5008f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740ef640140174088d49ff0348147105ff5538ebf38b55008d52f43b55087303ff5520895500c742fc02000000c702e8318cb28b5c2430895a048062ffbf6a016a015051ff701452ff742458ff74247cff742424ff7424588d54242052ff74247c89c38b442430e8521700008b44244c8b4c24108908837c24500174658b442404a801740bf604240174052b04247105ff5538ebf683c001ff3424ff74241068e0708cb289e390e8ba1cefff8b4c241483c40c50ff74245c8b5c245c8b4108e8ee55000089c789fb589090e8725700008b4c245c890183ff01750cb868c05208eb6be915020000b80100000089f9f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb13f640ff10750d89c1b850337db28b5d0490ff1389c1b80100000089fa8d7c0902f7df037d003b7d0872053b7d00720aeb05e946000000ff5520897d00d1e9894ffcc647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f850b8010000008b94248000000090ff128b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7018c738cb2894104588941088b042489410c8061ffbf8b442408ff700cff7004ff3051ff7010b8010000008b942494000000909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70140748cb25a8951045a8951088061ffbf8b1424833a03756e8b5a048b1b8b520c8b128b3283fe017507ba68c05208eb5b89cf89f150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f089d689f989cf89ca89c1d1e983c604f3a58d7c3f018d7436018d4c09018062ffbfeb07e92800000050518b45008d40f03b45087303ff5520894500c740fc03000000895008895804c70001000000eb0689c389d053518b4c247c89018b44240c894104c74108010000008b44241089410c588941105883c40c894114b80100000083c460c22000b8010000008b54247c90ff128b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70178748cb28941048b44240c8941088b44240889410c8061ffbfff700cff7004ff3051ff7010b8010000008b942494000000909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c701fc748cb25a8951045a8951088061ffbf8b1424833a03756e8b5a048b1b8b520c8b128b3283fe017507ba68c05208eb5b89cf89f150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f089d689f989cf89ca89c1d1e983c604f3a58d7c3f018d7436018d4c09018062ffbfeb07e92800000050518b45008d40f03b45087303ff5520894500c740fc03000000895008895804c70001000000eb0689c389d053518b4c247c89018b44240c894104c74108010000008b44241089410c588941105883c40c894114b80100000083c460c2200083380375725352ff700cff7004ff7008ff7504b8c61f8cb2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b4500eb05e9950200008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c70134758cb28d7908c747fc0400000089470c897708894f04c7070300000083c40458894504eb699090908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e83a12eeff89c3b8bc5589b2e89eebedff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0189e389f8bac0e47ab290e876c4eeff8b44246083c4048b4d008d49f03b4d087303ff5520894d00c741fc03000000c7016c758cb28b50188951048b5c24148959088061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703b4758cb28b70208973048b7c241c897b088063ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707fc758cb28b50308957048b74242c8977088067ffbf8b74245c8b45008d40f03b45087303ff5520894500c740fc03000000c70044768cb28970048b5424208950088060ffbf8b55008d52c83b55087303ff5520895500c742fc0d000000897a308b7e2c897a2c8b7c2424897a28894224895a208b44241889421c894a188b76148972148b44240c8942108b44240889420c8b4424048942085883c42c894204c70224778cb28b44240c52ff742438ff74243852ff742438ff74241cff742438ff7424348b5c24308b48048b44242089ca909090ff128b4424388b4c24348b54242c8b5c24248b7424208b7c241c89442438894c24345883c40489442428895424248b44240489442420895c241c89742418897c24148b5c240c5883c4045a83c404e985f6ffff83380775725352ff7008ff700cff7004ff7504b8d6228cb2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b4500eb05e9400500008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c70150778cb28d7908c747fc0400000089470c897708894f04c7070300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e82a0feeff89c3b8bc5589b2e88ee8edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a01578d5c240489f8bac0e47ab29090e862c1eeff8b4424648b4d008d49f03b4d087303ff5520894d00c741fc03000000c70188778cb28b50188951048b5c241c8959088061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703d0778cb28b70208973048b7c2424897b088063ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70718788cb28b50308957048b7424348977088067ffbf8b7424648b45008d40f03b45087303ff5520894500c740fc030000009090c70060788cb28970048b5424288950088060ffbf8b55008d52c83b55087303ff5520895500c742fc0d000000897a308b7e2c897a2c8b7c242c897a28894224895a20c7421c40798cb2894a188b46148942148b4e10894a108b5c2410895a0c8b5c240c895a08c74204c0798cb2c702407a8cb28b5c2444ff74246cff74246c52ff74246cff74246cff74246cff7424688b53048b5c24648b442454ff12ff7504b87a258cb2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c7016c7a8cb28d5908c743fc0400000089430c895308894b04c7030300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e8860ceeff89c3b8bc5589b2e8eae5edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a01538d5c24048b0424bac0e47ab290e8bebeeeffff74240cff742430ff74241868a47a8cb289e050bbd8707ab28b44244c9090e86ad8eeff8b8c248400000083c4108b400489018b45008d40f43b45087303ff5520894500c740fc020000008b4c2478894804c700010000008b8c249800000050b8010000008b51409090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc0200000089410458890151b8010000008b9424a800000090ff1250b8010000008b9424a800000090ff128b4c2408833903756b8b51048b128b490c8b098b1983fb017507b968c05208eb5889ce89d989c7b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c789d9d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89c1eb06e927000000508b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70001000000eb0589c289c8528b8c24980000008901c7410448c05208c74108010000008b44240889410c588941105881c488000000894114b801000000c22000833801756e8b48048b74241853575250ff710cff7114ff7104ff7108ff711cff31ff7110ff71188b4424148b562c909090ff12a80175728b088b118b5d008d5bf83b5d087303ff5520895d00c743fc01000000890b8b742404891e6a016a016a016a016a016a01ff710cff7208ff742470eb05e922050000ff742470ff742470ff742470ff742448ff7424708d5c242053ff7424708b5c246c8b4424488b54246490e822f0ffffeb05e9e90300008b45008d40e43b45087303ff5520894500c740fc060000008b4c241c8948148b4c24188948108b4c241489480c8b4c24108948088b4c240c8948048b4c240889088b4d008d49f43b4d087303ff5520894d00c741fc02000000c7012c848cb28b5424408951048061ffbf5150b8010000008b5424749090ff126a016a01ff74240cff74244cff74247c50ff7424688d44241450ff74247c8b5c242c8b44242490e8420900008b4424108b5808b801000000909090e82e5b000083f80175068b442404eb0d89c38b4424049090e87e5c00008b4c243c89018b442410b9010000008b5008f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740ef640140174088d49ff0348147105ff5538ebf3f6c101740bf640140174052b48147105ff5538ebf683c101ff7014ff7424046820868cb289e389c8e8460eefff8b4c241c83c40c8b590890e8be5c00008b4c244089018b442414ff742448ff7424608b5c244c8b480889c8e8465d00008b4c244c890190e8ee5e000083f8017507b868c05208eb72b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740a81f9ffffff017d08eb14f641ff10750e89c2b850337db28b5d049090ff1389c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93b000000c647ff4057f3ab5fb80100000083fa0174238b0a894c47fea801740583c0027105ff5538ebf68b4a0489ca3b650c7303ff5524ebd88067ffbf89f88b4c24108b5424148b5914f6c301740df642140174073b5a147d07eb08ff5538ebf48b5a145350b8010000008b94248400000090ff128b4d008d49e03b4d087303ff5520894d00c741fc07000000c7014c898cb2894104588941088b44241889410c8b5424048951108b5424148951145a83c4148951188061ffbfff700cff7004ff3051b8010000008b54247c909090ff128b4c24108b55008d52f03b55087303ff5520895500c742fc03000000c702448a8cb28b4910894a0459894a088062ffbf8b0c24833903756b8b59048b1b8b490c8b098b3183fe017507b968c05208eb5889cf89f150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f05e89f989cf5189c1d1e983c604f3a58d7c3f018d7436018d4c09018b0424eb0ae937000000e90b0000008060ffbf89c183c404eb01508b45008d40f03b45087303ff5520894500c740fc03000000894808895804c70001000000eb0589c389c8538b4c246489018b442408894104c74108010000008b44240c89410c8951105883c428894114b80100000083c430c220008b5c2414b87c8a8cb29090e822dfedffbb187689b29090e816dfedffff74242068908a8cb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff74240c51bb030000008b442458909090e8ee0dfdff8b44244083c408c700649288b2c74004b0cf87b2c7400801000000c7400c01000000c740105c9288b2c7401401000000b80100000083c430c220008b4c2418ff700cff7424185068ec8a8cb2ff7008ff70048d442408508b5930b8bc5c89b2e83a9cfdff5983c410890183f80175358b442408c700649288b2c74004b0cf87b2c7400801000000c7400c01000000c740105c9288b2c7401401000000b801000000c220008b008b48088b5424088b19891a8b71048972048b7908897a088b590c895a0c8b50088b7424088b52108956108b40088b4014894614b801000000c2200090000000007c150000|@15221,2097151,@3365|41,0,@14982 89,0,@14984 174,0,0 200,0,0 212,0,0 248,0,@14985 303,0,@14987 473,0,@13648 478,1,@13649 483,0,0 573,0,@14993 630,1,@14995 686,0,@15141 694,1,@6547 718,1,@15143 730,1,@15148 746,0,I49 758,0,0 802,0,16777215 819,0,@7886 832,0,0 884,0,0 936,0,0 976,0,@15149 1014,0,0 1056,0,@15151 1098,0,I49 1110,0,0 1229,0,0 1257,0,0 1280,0,0 1291,0,0 1328,0,@15152 1366,0,0 1408,0,@15154 1450,0,I49 1462,0,0 1581,0,0 1609,0,0 1632,0,0 1662,0,$14981+1842 1696,0,0 1701,0,11 1708,0,0 1752,0,10 1801,0,@15155 1826,0,1 1859,0,1 1864,0,10 1869,0,@5052 1874,1,@5053 1881,0,@13704 1886,1,@4940 1917,0,@13705 1927,0,@5398 1933,0,@4608 1996,0,@6366 2002,1,@6367 2039,0,@15157 2086,0,@15158 2133,0,@15159 2184,0,@15160 2294,0,@15163 2447,0,$14981+2626 2481,0,0 2486,0,11 2493,0,0 2537,0,10 2586,0,@15165 2611,0,1 2643,0,1 2648,0,10 2653,0,@5052 2658,1,@5053 2665,0,@13704 2670,1,@4940 2701,0,@13705 2711,0,@5398 2717,0,@4608 2783,0,@6366 2790,1,@6367 2824,0,@15167 2871,0,@15168 2918,0,@15169 2971,0,@15170 3038,0,@15173 3074,0,@15178 3080,0,@15183 3130,0,$14981+3302 3164,0,0 3169,0,11 3176,0,0 3220,0,10 3262,0,@15185 3287,0,1 3319,0,1 3324,0,10 3329,0,@5052 3334,1,@5053 3341,0,@13704 3346,1,@4940 3377,0,@13705 3387,0,@5398 3393,0,@4608 3460,0,@6366 3466,1,@6367 3483,0,@15187 3491,0,@5279 3502,1,@6418 3554,0,0 3567,0,0 3607,0,2 3624,0,0 3648,0,0 3664,0,0 3705,0,I49 3718,0,0 3832,0,0 3855,0,I48 3862,0,0 3888,0,0 4160,0,@15197 4178,0,0 4230,1,@14995 4242,0,0 4250,1,@15198 4274,1,@15203 4289,0,0 4385,0,@15204 4394,1,@6547 4410,1,@15206 4442,1,@15207 4454,1,@15211 4464,0,I49 4471,0,0 4517,0,16777215 4534,0,@7886 4548,0,0 4598,0,0 4688,0,0 4728,0,@15212 4781,0,0 4824,0,@15214 4868,0,I49 4880,0,0 5011,0,0 5038,0,0 5060,0,0 5075,0,@15215 5082,1,@4940 5087,0,@13755 5094,1,@4940 5103,0,@15216 5136,0,3 5146,0,@6321 5184,0,0 5206,0,0 5213,0,0 5220,0,0 5226,0,0 5236,0,@6321 5254,0,1 5266,1,@13644 5279,0,@13379 5286,0,@13163 5293,0,0 5300,0,0 5307,0,@13378 5314,0,0 5319,0,0 5342,0,@15218 5361,0,@13728 5366,1,@13836 5387,0,@13379 5394,0,@13163 5401,0,0 5408,0,0 5415,0,@13378 5422,0,0 5427,0,0 5488,0,0 14982:D3,116|3b650c7303ff55248b4a08528b512090ff12a801754c8b0c24ff30b8010000008b510490ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc0200000089480459890889c18d400cc740fc01000000890883c404c3b80100000083c404c3900000000070000000|@14983,1048575,@3269|28,0,0 99,0,0 14983:S39|535452554354555245535f28292e73747275637456616c756528382974797065456e762d283129 14984:D3,116|3b650c7303ff55248b4a08528b513090ff12a801754c8b0c24ff30b8010000008b510490ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc0200000089480459890889c18d400cc740fc01000000890883c404c3b80100000083c404c3900000000070000000|@14983,1048575,@3270|28,0,0 99,0,0 14985:D3,124|3b650c7303ff55248b48108b580c8b70088b7804ff308b45008d40e83b45087303ff5520894500c740fc0500000089481089580c897008897804598908528b4a0889ca90ff128b0c248b51048b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b490483c4048919c30000000078000000|@14986,1048575,@3271| 14986:S52|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e744d616b65547970654964283129 14987:D3,64|8b45008d40ec3b45087303ff5520894500c740fc04000000c70088308cb28b4a048948048b5a088958088b720c89700c8060ffbfc3909090000000003c000000|@14992,31,@3273|26,0,@14988 14988:D3,164|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff228b52088b12f6c20175558b0a8b5904833b01740e89c6b840318cb28b5d049090ff13a8017509f6430c017503ff55383b430c751c8b75008d76f83b75087303ff5520897500c746fc01000000890eeb148b720489f23b650c7303ff5524eba6be0100000083fe01750db84cc37bb28b5d04909090ff138b06c300000000a0000000|@14991,1048575,@3272|58,0,@14989 131,0,0 141,0,@6769 14989:O4|11,@4879,0,@14990 14990:O5|@14950,1738,0,1738,0 14991:S54|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129283129 14992:S51|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129 14993:D3,32|3b650c7303ff552489c38b4204ba640889b2e97dd6fcff90000000001c000000|@14994,2097151,@3274|14,0,@13554 19,1,@13556 14994:S57|535452554354555245535f28292e73747275637456616c75652838296d61746368416374696f6e737c6d61746368526573756c74732d283129 14995:D3,588|3b650c7303ff55248378080174138b48148b501089c6b8c0348cb28b5d0490ff13817804b0cf87b27427f640040175288b7004bfb0cf87b2b91f000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b8409288b2eb1453ff70146a01ff74241c8b5810e85a020000eb01538b0c248b55008d52ec3b55087303ff5520895500c742fc04000000c702a83c8cb28b5c2414895a048b71088972088b7914897a0c8062ffbf505756528b591089c8909090e80e020000b9010000008b5008f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101740ef640140174088d49ff0348147105ff5538ebf3f6c101740bf640140174052b48147105ff5538ebf683c101f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c17eb06f641ff10750f89c2b834f67ab28b5d04909090ff1389caf6c201740583c2027105ff5538ebf689cb89d189c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891f8b45008d40f03b45087303ff5520894500c740fc03000000c7006c3d8cb28978048b4a148948088060ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703383e8cb2897b04894b088063ffbf5350526848c05208ff74242cff742438ff742438515789d38b44242490e8960a00006848c05208ff742408ff742430ff74243cff74243cff742434ff7424308b5c241c8b4424289090e82a1e00008b4c241c83c4085a83c4088911894104b801000000c21c0090900000000048020000|@15140,2097151,@3323|23,0,@14996 36,0,@13163 52,0,@13163 57,0,15 82,0,@13377 102,1,@14999 138,0,@15010 178,1,@14999 183,0,0 296,0,16777214 313,0,@6401 349,0,0 419,0,@15012 462,0,@15014 480,0,I48 506,1,@15016 511,0,I48 550,1,@15069 571,0,0 14996:O4|@4608,@5398,@14998,@14997 14997:O5|@14950,1030,0,1030,0 14998:S48|43616e646964617465207374727563747572652077697468206e6f6e2d656d70747920626f756e64204944206c697374 14999:D3,720|3b650c7303ff5524ff700cff700453ff30ff7504b8e6358cb2508965048b45008d40f83b45087303ff5520894500c740fc01000040c70001000000b91700000089c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c70108388cb28d7108c746fc0400000089460c895608894e04c7060300000083c40458894504eb699090908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e81afcedff89c3b8bc5589b2e87ed5edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000c70040388cb28970048060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c8398cb28971048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702283b8cb28972048062ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000894f08894704891756536a016848c05208ff7424246a0189fb8b442418e8e2b4fdff8b042483380375708b48048b098b400c8b008b1083fa017507b868c05208eb5089cb89d189c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f889c789d1d1e983c604f3a58d7c3f018d7436018d4c09018060ffbf89d98b55008d52f0eb05e9200000003b55087303ff5520895500c742fc03000000894208894a04c70201000000eb0289c28b45008d40e43b45087303ff5520894500c740fc060000008b4c242083c40c8948148b5c240c8958108b74240489700c8b7424108970085f83c4048978048910c20c0000000000cc020000|@15009,2097151,@3282|21,0,$14999+194 55,0,0 60,0,11 67,0,0 111,0,10 153,0,@15000 178,0,1 211,0,1 216,0,10 221,0,@5052 226,1,@5053 233,0,@13704 238,1,@4940 269,0,@13705 279,0,@5398 285,0,@4608 343,0,@15002 380,0,@15005 417,0,@15007 465,0,I48 482,1,@13905 512,0,I49 525,0,0 637,0,0 15000:O1|@15001 15001:D3,28|3b650c7303ff5524bb15000000e96e33eeff90900000000018000000|@5217,2097151,@3275|9,0,10 14,1,@5214 15002:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c7010ce239b2ff3052518b5c24088b4204e89eafeeff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e99eb7eeff909000000000a4000000|@15004,2097151,@3277|35,0,0 48,0,69 54,0,@4600 70,1,@6369 106,0,0 126,1,@15003 154,1,@6390 15003:D3,144|3b650c7303ff5524a80175578b0881390ce239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@3276|16,0,@4600 126,0,0 15004:S32|434f5049455228292e7265706c6163654d6170283529747376456e762d283129 15005:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c70164e239b2ff3052518b5c24088b4204e816aeeeff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e916b6eeff909000000000a4000000|@15004,2097151,@3279|35,0,0 48,0,69 54,0,@4611 70,1,@6369 106,0,0 126,1,@15006 154,1,@6390 15006:D3,144|3b650c7303ff5524a80175578b08813964e239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@3278|16,0,@4611 126,0,0 15007:D3,168|3b650c7303ff55248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c010000008b5804895908c741048b000000c701ece139b2ff3052518b5c24088b4204e8b6aceeff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b5424088944240883c4045b8b410452e9b6b4eeff909000000000a4000000|@15004,2097151,@3281|35,0,0 48,0,69 54,0,@4596 70,1,@6369 106,0,0 126,1,@15008 154,1,@6390 15008:D3,144|3b650c7303ff5524a80175578b088139ece139b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@3280|16,0,@4596 126,0,0 15009:S22|434f5049455228292e7265706c6163654d6170283529 15010:D3,124|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c0018b5208f6c201740f89c1b8bc7e7ab28b5d04909090ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebc90000000078000000|@15011,1048575,@3283|69,0,@5417 15011:S42|535452554354555245535f28292e6d61746368536967732837297461726765742d6e65774d6170283129 15012:D3,136|a801740df642080174073b42087d0deb05ff5538ebf4b801000000c3a801740bf642080174052b42087105ff5538ebf683c001a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0c89c1b8f0ea7ab28b5d04ff13a801740583c0027105ff5538ebf68b52048b4442fec3900000000084000000|@15013,7,@3284|23,0,0 96,0,@6373 15013:S39|535452554354555245535f28292e6d61746368536967732837296c6f6f6b757054797065283129 15014:D3,120|a801740bf642080174052b42087105ff5538ebf683c001a801740783f8017d08eb1ff640ff1075198b4a048b09a8017409f6c10174043bc1eb05ff5538ebf77c0c89c1b8f0ea7ab28b5d04ff13a801740583c0027105ff5538ebf68b52048b4442fe83f8017506b8d83987b2c38b00c30000000074000000|@15015,7,@3285|68,0,@6373 104,0,@13001 15015:S39|535452554354555245535f28292e6d6174636853696773283729726573756c7454797065283129 15016:D3,124|3b650c7303ff5524817804b0cf87b27427f640040175298b7004bfb0cf87b2b91f000000d1e93bc9f3a68d7c3f018d7436018d4c09017508b801000000c21800ff742404ff74240cff742420ff742418ff74242050ff74242c68843f8cb289e0508b03bb0100000090e84ebfeeff83c420c218000000000078000000|@15068,1048575,@3300|11,0,@13163 27,0,@13163 32,0,15 57,0,0 90,0,@15017 100,0,0 106,1,@6418 15017:D3,96|3b650c7303ff55248b4c24045052f6c301753c8b0424ff730451ff7004ff7008ff700cff7010ff7014ff7018ff701cb9f83f8cb2518b1b8b44242c9090e83a00000089c15b3b650c7303ff5524ebbf89c883c408c2040090000000005c000000|@6417,1048575,@3299|48,0,@15018 62,1,@15019 15018:O1|@15016 15019:D3,1220|3b650c7303ff5524813b0ce239b2755c813b0ce239b2740d89c1b854eb7ab28b5d0490ff138b4b08ff74242068d8448cb28b54242451ff31ff710489c38b029090e8e2a7eeffa80175608b00a80175538b0881390ce239b2753a81390ce239b27413b854eb7ab28b5d04eb05e9fd0200009090ff138b55008d52f83b55087303ff5520895500c742fc010000008b5908891aeb1b8b480489c83b650c7303ff5524eba9ba01000000eb05ba0100000083fa017524ff742434ff742430ff742430ff7424308d5c241c8b44241890e85a06000083c414c224008b028b4c24048b59088b7304833e037509817e04f4e439b27461833e0175618b388b4e0cf6c101740ff64424200174083b4c24207d07eb67ff5538ebf3f6c101740df64424200174062b4c24207105ff5538ebf583c1018b5d008d5bf83b5d087303ff5520895d00c743fc010000008b7f08893bf6c1017413eb0ae90b020000e95b00000083f9017d08eb2bf641ff1075258b74241c8b36f6c1017413eb05e93c000000f7c60100000074043bceeb05ff5538ebf77c128b308b7804b8b0f57ab28b5d04909090ff13f6c101740583c1027105ff5538ebf68b74241c895c4efe8b4c24048b59088b7304833e0375058b7e08eb36833e0175058b7e04eb2cbf010000008b4e04f6c101751ff7c701000000740583c7027105ff5538ebf68b49043b650c7303ff5524ebdc8b088b59088b7304833e0375058b4e08eb33833e0175058b4e04eb29b9010000008b5e04f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdff7c7010000007508f6c1017503ff55383bf9742d68504a8cb28d44241050ff74243cff742438ff742438ff7424388b5c24208b029090e81208000083c414c22400f60424017532f6400401742c681c4e8cb28d44241050ff74243cff742438ff742438ff7424388b5c24208b0290e8da07000083c414c224008b4c24048b59088b7304833e057456833e05750d8b38b808377bb28b5d0490ff13833e01751c8b7e08833f03750c8b4f048b0983f9017429eb12837f0401750ceb1f8b7e048b3f83ff017415ff328b00ba544e8cb2e8460b000083f8017539eb08ff32eb33ff32eb2f68e8508cb28d44241450ff742440ff74243cff74243cff74243c8b5c24248b4424189090e84207000083c418c22400b80100000083c418c22400b80100000083c414c22400813b64e239b2755c813b64e239b2740f89c1b854eb7ab28b5d04909090ff138b4c241c50ff730889c38b01e88aa4eeffa801755f8b00a80175528b08813964e239b27539813964e239b2740bb854eb7ab28b5d0490ff138b55008d52f83b5508730aeb05e9dd000000ff5520895500c742fc010000008b5908891aeb1b8b480489c83b650c7303ff5524ebaaba01000000eb05ba0100000083fa0175358b4424288b4c24208b54241c8b5c24188944242c894c242889542424895c2420bb28518cb28b042483c4085e83c41456e9ec0200008b128b0424ff7008ff72088b5c240c8b4424209090e83ac7edffbb5d0000009090e82ec7edff8b4c24148b5424308b5c24288b7424248b7c241c508b44241c508b4424048944243c89542438895c243489742430897c242c5883c404894424208b5c24045883c40489ca83c4085983c40c51ff22b801000000c2240000000000c0040000|@15067,1048575,@3298|10,0,@4600 18,0,@4600 27,0,@6377 45,0,@15020 66,1,@6369 84,0,@4600 92,0,@4600 99,0,@6377 164,0,0 171,0,0 206,1,@15030 236,0,@4643 405,0,@6397 471,0,0 543,0,0 604,0,@15046 638,1,@15048 661,0,@15050 694,1,@15048 727,0,@6539 785,0,@15052 790,1,@15053 810,0,@15062 846,1,@15048 857,0,0 868,0,0 880,0,@4611 888,0,@4611 897,0,@6377 922,1,@6369 940,0,@4611 948,0,@4611 955,0,@6377 1019,0,0 1026,0,0 1068,0,@15064 1084,1,@15030 1110,1,@4940 1115,0,46 1122,1,@4940 1205,0,0 15020:D3,60|3b650c7303ff552489c38b4204e83e000000b944468cb28b1424890c246a0189d989c389c889d1ba70287bb251e9b2e3eeff90900000000038000000|@15029,2097151,@3289|14,1,@15021 19,0,@15023 40,0,@6508 46,1,@6510 15021:D3,228|8b4034a80175358b088139d4e539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa017569b87c787cb2a80175358b088139d4e539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa01750bb8287c7cb28b5d0490ff138b0290908138d4e539b27414b854eb7ab28b5d04eb05e90b000000909090ff138b480889c8c38b028138d4e539b2740cb854eb7ab28b5d049090ff138b480889c8c39000000000e0000000|@15022,7,@3286|11,0,@4671 61,0,0 71,0,@7313 83,0,@4671 133,0,0 143,0,@7368 159,0,@4671 166,0,@6377 195,0,@4671 202,0,@6377 15022:S27|535452554354555245535f28292e6572726f724465707468283129 15023:O2|@15025,@15024 15024:O1|@15028 15025:O1|@15026 15026:D3,16|b801000000c39090000000000c000000|@15027,1,@3287|1,0,0 15027:S58|535452554354555245535f28292e6d61746368536967732837296d617463684e616d65732833292833297072696e7454797065456e762d283129 15028:D3,16|b801000000c39090000000000c000000|@15027,1,@3288|1,0,0 15029:S56|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c617954797065283129 15030:D3,488|3b650c7303ff5524817c240448c052087429f64424040175298b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b95d000000eb1450538b5c240cb828498cb2e816c4edff89c1eb02505389cbb844498cb29090e802c4edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424088b5424049090ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70170498cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49dc3b4d087303ff5520894d00c741fc02000000c7410490498cb289018d410cc740fc020000008948049090c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740d89c1b8ecd57ab28b5d0490ff138b4c24108b54240c8b5c240889542410895c240c89442408bb0300000089c85e83c40456e90ef2fcff909000000000e4010000|@15045,1048575,@3290|12,0,I48 30,0,I48 35,0,4 60,0,46 73,0,@15031 78,1,@4940 91,0,@15032 98,1,@4940 131,0,3 141,0,@6321 193,0,0 214,0,@5592 233,0,@15033 253,0,0 260,0,0 267,0,3 273,0,0 284,0,@6321 320,0,@15035 343,0,@5592 396,0,0 403,0,1 410,0,3 416,0,0 427,0,@6321 462,0,1 474,1,@13644 15031:S18|20696e207375622d73747275637475726520 15032:S34|53747275637475726520646f6573206e6f74206d61746368207369676e6174757265 15033:O2|3,@15034 15034:S10|5369676e61747572653a 15035:O2|@5592,@15036 15036:O2|@15037,0 15037:O5|0,3,0,0,@15038 15038:O2|@15040,@15039 15039:O2|@5592,@15042 15040:O2|3,@15041 15041:S10|5374727563747572653a 15042:O2|@15043,0 15043:O2|3,@15044 15044:S11|4e6f742070726573656e74 15045:S36|535452554354555245535f28292e7369675374727563744d697373696e674d7367283629 15046:O2|3,@15047 15047:S47|54797065732074616b6520646966666572656e74206e756d62657273206f66207479706520617267756d656e74732e 15048:D3,840|3b650c7303ff5524817c240448c052087429f64424040175298b742404bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b95d000000eb1450538b5c240cb828498cb2e8aec0edff89c1eb02505389cbb844498cb29090e89ac0edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff13518b4424048b5424209090ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70170498cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff13508b44240c8b5424249090ff128b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701d8498cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c74104010000008b54242889118d590cc743fc02000000894b04c7039c9a7ab28d4b0cc741fc02000000895904c7016c3f8ab28d590cc743fc05000000894b10c7430c01000000c7430801000000c7430407000000c70301000000f6c301740c89c1b8ecd57ab28b5d04ff138b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089198d590cc743fc02000000894b04c7039c9a7ab28d4b0cc741fc0200000089590489018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400407000000c70001000000a801740c89c1b8ecd57ab28b5d04ff138b4c24108b5c240c8b742408895c24188974241489442410bb0300000089c85f83c40c57e946edfcff90900000000044030000|@15049,1048575,@3291|12,0,I48 30,0,I48 35,0,4 60,0,46 73,0,@15031 78,1,@4940 91,0,@15032 98,1,@4940 131,0,3 141,0,@6321 193,0,0 214,0,@5592 233,0,@15033 253,0,0 260,0,0 267,0,3 273,0,0 284,0,@6321 333,0,0 354,0,@5592 373,0,@15040 393,0,0 400,0,0 407,0,3 413,0,0 424,0,@6321 460,0,0 485,0,@5592 504,0,@14111 524,0,0 531,0,0 538,0,3 544,0,0 556,0,@6321 592,0,0 613,0,@5592 647,0,@5592 696,0,@5592 749,0,0 756,0,1 763,0,3 769,0,0 780,0,@6321 814,0,1 826,1,@13644 15049:S34|535452554354555245535f28292e7369675374727563744d617463684d7367283829 15050:O2|3,@15051 15051:S35|5479706520696e20737472756374757265206973206e6f742061206461746174797065 15052:O2|@15053,@6713 15053:D3,276|3b650c7303ff55248b48088b5904833b057575833b0375058b7308eb39833b0175058b7304eb2fbe010000008b7b04f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd95250ff30bb884f8cb289f0e842e9eeff909090e8120100008b4d008d49e83b4d087303ff5520894d00c741fc05000000eb05e94d000000c74110010000008b54240489510c5a83c404895108894104c7010b0000008b04246868508cb2bb94508cb28b500489c8909090ff1283f8037407b801000000eb05b80300000083f00283c404c3833b05750ab808377bb28b5d04ff13833b0175148b5308833a0375088b72048b3689f0c38b4204c38b53048b1289d0c390900000000010010000|@15061,1048575,@3296|40,0,0 91,0,@15054 98,1,@6547 106,1,@15056 144,0,0 167,0,5 175,0,@15057 180,0,@15059 200,0,0 207,0,1 224,0,@6539 15054:O1|@15055 15055:D3,60|8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f17002008908c30000000038000000|@6546,3,@3292|26,0,@5413 45,0,79992 15056:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@3293|51,0,6 100,0,0 15057:O1|@15058 15058:D3,16|b805000000c39090000000000c000000|@13788,1,@3294|1,0,2 15059:O1|@15060 15060:D3,16|b803000000c39090000000000c000000|@13788,1,@3295|1,0,1 15061:S30|545950455f5452454528292e7065726d697473457175616c697479283129 15062:O2|3,@15063 15063:S41|5479706520696e20737472756374757265206973206e6f7420616e20657175616c6974792074797065 15064:O1|@15065 15065:D3,196|8b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c70180dc7bb28d410cc740fc02000000894804c70050287bb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c3909000000000c0000000|@15066,3,@3297|31,0,3 41,0,@6321 80,0,0 101,0,@6812 120,0,@6506 142,0,0 149,0,0 156,0,0 162,0,0 173,0,@6321 15066:S61|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c6179537472756374757265283129 15067:S42|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329 15068:S39|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329 15069:D3,212|8d7c24983b7d0c7303ff5528817804b0cf87b27427f640040175298b7004bfb0cf87b2b91f000000d1e93bc9f3a68d7c3f018d7436018d4c09017508b801000000c21c00ff742404ff742420ff742410ff742418ff742420ff742428ff74243050689c538cb250538d4c2408518b0bbb0100000089c8909090e87eabeeffff742440ff742438682c628cb28b4c240cff742454ff742448ff7424508d54240c52ff742450ff742460ff742468ff742458ff7424306890678cb289e25289c38b0190e836abeeff83c460c21c0000000000d0000000|@15139,1048575,@3322|15,0,@13163 31,0,@13163 36,0,15 61,0,0 98,0,@15070 112,0,0 122,1,@6418 135,0,@15110 181,0,@15113 194,1,@6418 15070:D3,100|3b650c7303ff55248b4c24045052f6c30175408b0424ff730451ff7004ff7008ff700cff7010ff7014ff7018ff701cb914548cb251ff70208b1b8b442430909090e83a00000089c15b3b650c7303ff5524ebbb89c883c408c20400900000000060000000|@6417,2097151,@3315|48,0,@15071 66,1,@15072 15071:O1|@15069 15072:D3,768|3b650c7303ff5524813b0ce239b27567813b0ce239b2740d89c1b854eb7ab28b5d0490ff138b4c2424ff730889c38b0190e8d693eeffa801755f8b00a80175528b0881390ce239b2753981390ce239b2740bb854eb7ab28b5d0490ff138b55008d52f83b55087303ff5520895500c742fc01000000eb05e9120100008b5908891aeb1b8b480489c83b650c7303ff5524ebaaba01000000eb05ba0100000083fa01750a8b44242c83c404c22800ff32ff742428ff742428ff742428ff742428ff742428ff7424288b5c241c8b4424189090e83e020000588b0c248b40048b49048b54242ca8017566f6c10175668b188b318b7e08833f01755f8b75008d76ec3b75087303ff5520897500c746fc04000000ff71048b08894e0c8b5b0c895e08c7460405000000c706050000008b5d008d5be83b5d087303ff5520895d00c743fc020000008973048b7f04893beb0fe933000000e92e000000e9110000008d730cc746fc02000000895604891eeb0589d6ff710489f2598b40043b650c7303ff5524e95effffff89d083c404c22800813b64e239b2755c813b64e239b2740f89c1b854eb7ab28b5d04909090ff138b4c242450ff730889c38b01e84e92eeffa801755f8b00a80175528b08813964e239b27539813964e239b2740bb854eb7ab28b5d0490ff138b55008d52f83b5508730aeb05e9f8000000ff5520895500c742fc010000008b5908891aeb1b8b480489c83b650c7303ff5524ebaaba01000000eb05ba0100000083fa01750a8b44243083c408c228008b028b0c2450ff7108ff70088b5c24108b442420e82ab5edffbb5d0000009090e81eb5edff50ff742438ff742438ff742438ff742438ff742438ff7424308b5c24208b44241c8b54243890ff128b4c240c83c4088b5104833a0175548b5d008d5bd83b5d087303ff5520895d00c743fc030000008b3424897308894304c703010000008d4310c740fc020000008958048b5a04891889c68d400cc740fc020000008b7c2434897804893083c40cc228008b44243483c40cc228008b442428c22800909000000000fc020000|@15109,2097151,@3314|10,0,@4600 18,0,@4600 27,0,@6377 50,1,@6369 68,0,@4600 76,0,@4600 83,0,@6377 147,0,0 154,0,0 210,1,@15073 290,0,2 296,0,2 400,0,@4611 408,0,@4611 417,0,@6377 442,1,@6369 460,0,@4611 468,0,@4611 475,0,@6377 539,0,0 546,0,0 586,1,@4940 591,0,46 598,1,@4940 692,0,0 15073:D3,712|3b650c7303ff55248b088b138b72088b7e04833f0375058b7708eb39833f0175058b7704eb2fbe010000008b7f04f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd9ff31ff7304ff70045350ff33ff32ff30bb0c5a8cb289f090e866e0eeffff74243468a05a8cb28b4c24088b51088b5a04833b0375058b7308eb39833b0175058b7304eb2fbe010000008b7b04f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd98b7c24108b4f088b5104833a0375058b5a08eb36833a0175058b5a04eb2cbb010000008b7a04f7c701000000751cf6c301740583c3027105ff5538ebf68b7f043b650c7303ff5524ebdcf7c6010000007508f6c3017503ff55383bf3740bb80100000083c428c218008b5d008d5bd03b5d087303ff5520895d00c743fc05000000c74310010000008b74240889730c8b742424897308894304c7030b0000008d7b18c747fc05000000c74710010000008b74241089770c8b74240c897708894704c7070b000000ff742440ff74244089d889fb9090e8fa020000833803756bf644242001740bb80100000083c428c21800b8010000008b4c241cf6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0b9010000008b542420f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdfa8017410eb05e959000000f6c10174043bc1eb05ff5538ebf77f0bb80100000083c428c218008b44241ca801752bff7004ff742428ff742444ff742444ff7424448b5c24348b009090e89e050000583b650c7303ff5524ebd1b80100000083c428c218008b7004ff74243068b0618cb28b5c24388b442444ba94348ab2e8e2dafdff89c189f089caff12508d44240450ff742444ff742444ff742444ff7424408b5c24308b44242c90e8aaf0ffff83c428c2180000000000c4020000|@15108,2097151,@3313|39,0,0 102,0,@15074 110,1,@6547 119,0,@15077 154,0,0 231,0,0 295,0,0 332,0,0 355,0,5 372,0,0 395,0,5 414,1,@15085 431,0,0 442,0,0 483,0,0 552,0,0 598,1,@15101 614,0,0 632,0,@15107 645,0,@14094 650,1,@14095 694,1,@15048 15074:O1|@15075 15075:D3,68|8b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d000000c3900000000040000000|@15076,3,@3301|26,0,@5413 45,0,79992 54,0,6 15076:S42|535452554354555245535f28292e636865636b54797065436f6e7374727328382974766172732d283129 15077:D3,60|3b650c7303ff552489c38b4204e876eaffffb9f05a8cb28b1424890c246a0189d989c389c889d1ba70287bb251e9eacdeeff90900000000038000000|@15084,2097151,@3304|14,1,@15021 19,0,@15078 40,0,@6508 46,1,@6510 15078:O2|@15080,@15079 15079:O1|@15083 15080:O1|@15081 15081:D3,16|b801000000c39090000000000c000000|@15082,1,@3302|1,0,0 15082:S49|535452554354555245535f28292e636865636b54797065436f6e737472732838297072696e7454797065456e762d283129 15083:D3,16|b801000000c39090000000000c000000|@15082,1,@3303|1,0,0 15084:S52|535452554354555245535f28292e636865636b54797065436f6e737472732838296572726f72496e44617461747970652d283129 15085:D3,256|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e05c8cb28b5424088951048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706485d8cb2894e048066ffbf505689d9bb7c5e8cb289c8e8c6abeeff6a016a01508d4c240451bbd85e8cb28b442410e852e3eeff8b442408909090e8b27bfdff8b1c248b442404ba84287bb2909090e83a1cefffa80175298b088b45008d40f43b45087303ff5520894500c740fc02000000894804c7000100000083c410c208008b45008d40f43b45087303ff5520894500c740fc020000008b0c24894804c7000300000083c410c2080090909000000000fc000000|@15100,2097151,@3311|34,0,@15086 75,0,@15088 91,0,@15095 98,1,@6446 113,0,@15098 122,1,@6564 134,1,@13871 146,0,@6509 154,1,@6714 193,0,0 235,0,1 15086:D3,40|3b650c7303ff55248b480483390175088b410c8b5204ff22b801000000c390900000000024000000|@15087,1048575,@3305|25,0,0 15087:S36|535452554354555245535f28292e6d617463685479706573283429636f70794964283129 15088:D3,96|3b650c7303ff55246a016a016a0168bc5d8cb2681c5e8cb26a018d4c240c518b5a04909090e892a6eeff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@15094,2097151,@3308|15,0,@15089 20,0,@15092 38,1,@6437 15089:O1|@15090 15090:D3,12|c39090900000000008000000|@15091,1,@3306| 15091:S48|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129283129 15092:O1|@15093 15093:D3,12|c39090900000000008000000|@15091,1,@3307| 15094:S45|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129 15095:O1|@15096 15096:D3,12|c39090900000000008000000|@15097,1,@3309| 15097:S43|535452554354555245535f28292e6d617463685479706573283429636f7079546172676574283129283129 15098:O1|@15099 15099:D3,16|b801000000c39090000000000c000000|@6563,1,@3310|1,0,0 15100:S27|535452554354555245535f28292e6d617463685479706573283429 15101:D3,432|3b650c7303ff5524f6c30175588b0b8b113b10743cf6c201753ef6000175398b38f7c7010000007407be03000000eb068b378d74360183c6085689d659d1e93bc9f3a68d7c3f018d7436018d4c09017507b903000000eb128b5b043b650c7303ff5524eba3b90100000083f9017408b801000000c210008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104ec608cb28b0089018b45008d40e83b45087303ff5520894500c740fc02000000894804c70038618cb28d480cc741fc020000008941048b44241089018b45008d40f43b45087303ff5520894500c740fc02000000894804c70050618cb29090e842b1edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b44240c8b5424088b5c240489542410895c240c894c2408bb030000005983c40451e948dafcff00000000ac010000|@15106,1048575,@3312|42,0,1 82,0,1 102,0,0 112,0,0 146,0,@15102 183,0,@15104 235,0,@15105 242,1,@4953 275,0,3 285,0,@6321 324,0,0 346,0,0 353,0,0 360,0,0 366,0,0 376,0,@6321 410,0,1 420,1,@13644 15102:O2|@15103,0 15103:S55|207761732070726573656e7420696e207468652073747275637475726520627574206e6f7420696e20746865207369676e61747572652e 15104:S14|3a20636f6e7374727563746f7220 15105:S30|4572726f72207768696c65206d61746368696e6720646174617479706520 15106:S48|535452554354555245535f28292e636865636b54797065436f6e73747273283829636865636b436f6e73747273283129 15107:S5|6d61746368 15108:S33|535452554354555245535f28292e636865636b54797065436f6e73747273283829 15109:S56|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d6174636853747275637475726573283329 15110:D3,1284|3b650c7303ff55248b4810f6c10175328b19833b01751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b590489d93b650c7303ff5524ebc9be01000000f7c60100000075658b0e833901755e8b5d008d5bf43b5d087303ff5520895d00c743fc020000008b7904897b04c70301000000f6c3017412ff700c50ff30b8ecd57ab28b5d049090ff138b75008d76f43b75087303ff5520897500c746fc02000000c7460401000000891eeb05be010000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b18895904c70107000000f6c10174108b580c89c7b8ecd57ab28b5d0490ff138b7d008d7fdc3b7d087303ff5520897d00c747fc02000000c7470401000000890f8d4f0cc741fc0500000089791089710cc7410801000000c7410401000000c70101000000f6c10174128b580c89c6b8ecd57ab28b5d04909090ff1383780401756fff700c51528b44240890e85ea6eeff833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b901000000f6c10175748b04248b198b480889c8909090e85ae1ffff89c6b801000000e82acceeff8b0c2450ff71046a0189d889f3ba94477bb2eb05e9030100009090e8cee3eeff8b4d008d49d03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb2eb05e9280000008d480cc741fc02000000894104c70138457bb28d410cc740fc02000000894804c70090dc7bb2eb05b8010000008b4d008d49f43b4d087303ff5520894d00c741fc0200000089410483c4045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c70160dc7bb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c3f6400401757689ce89d7ff700c8b4708909090e81ae0ffff89c3b801000000e8eacaeeff5650ff77046a018b442410ba94477bb2909090e896e2eeff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000eb05e99f000000894104c70100e27ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c70144678cb28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740f89c1b8ecd57ab28b5d04909090ff13c389ce89d7ff700c8b470890e802dfffff89c3b801000000e8d2c9eeff5650ff77046a018b442410ba94477bb2909090e87ee1eeff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c70100e27ab28d410cc740fc02000000894804c700f0a47ab28d480cc741fc020000008941045883c40489018b45008d40d03b45087303ff5520894500c740fc02000000894804c70080dc7bb28d480cc741fc02000000894104c7017c0489b28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740e89c1b8ecd57ab28b5d049090ff13c390900000000000050000|@15112,2097151,@3316|67,0,0 118,0,0 134,0,@6321 172,0,0 181,0,0 216,0,3 231,0,@6321 268,0,0 293,0,0 300,0,0 306,0,0 321,0,@6321 350,1,@6447 391,0,0 414,1,@15021 421,0,0 426,1,@6511 444,0,@6596 458,1,@6597 489,0,0 510,0,@6812 536,0,@6587 555,0,@6813 562,0,0 631,0,@6812 650,0,@6810 670,0,0 677,0,0 684,0,0 690,0,0 701,0,@6321 734,1,@15021 741,0,0 746,1,@6511 762,0,@6596 770,1,@6597 801,0,0 822,0,@5592 848,0,@6362 867,0,@5643 919,0,@6812 938,0,@15111 958,0,0 965,0,0 972,0,0 978,0,0 989,0,@6321 1014,1,@15021 1021,0,0 1026,1,@6511 1042,0,@6596 1050,1,@6597 1081,0,0 1102,0,@5592 1121,0,@6362 1140,0,@5643 1192,0,@6812 1211,0,@13533 1231,0,0 1238,0,0 1245,0,0 1251,0,0 1262,0,@6321 15111:O2|3,@6809 15112:S53|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329646973706c617956616c7565283129 15113:D3,96|3b650c7303ff55248b4c24045052f6c301753c8b0424ff730451ff7004ff7008ff700cff7010ff7014ff7018ff701cff7020ff70248b1b8b4424309090e83200000089c15b3b650c7303ff5524ebbf89c883c408c2040090000000005c000000|@6417,2097151,@3321|62,1,@15114 15114:D3,828|3b650c7303ff5524813bece139b27561813bece139b2740d89c1b854eb7ab28b5d0490ff138b4b088b54242451ff7108ff710cff710489c38b02909090e8e27feeffa801755f8b00a80175528b088139ece139b275398139ece139b2740bb854eb7ab28b5d0490ff138b55008d52f8eb05e9b60200003b55087303ff5520895500c742fc010000008b5908891aeb1b8b480489c83b650c7303ff5524ebaaba01000000eb05ba01000000f6c20175638b028b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5908c743fc02000000c703546b8cb28b7424308973048063ffbf8919833c24017514837804017407b9a46f8cb2eb47b930d87fb2eb40f6042401751bf6400401eb05e9ed0100007407b9e06f8cb2eb26b930d87fb2eb1f837804017507b9b8757ab2eb12f64004017407b930d87fb2eb05b9d8707ab2833901756d50ff7104ff742434ff7424348b5c24148b480c89c890e862f2ffff833801755c8b7004ff74242c68b0618cb28b5c24348b442438ba94348ab290e812cbfdff89c189f089caff1250ff74242cff742438ff742430ff742430ff7424308b5c242c8b44241c9090e8dae0ffffeb05e91a0100008b44244083c418c228008b4c2404f6411401750e8b51148b1a8b7304c70603000000f641180175588b51186a016a01ff7004ff328d44240850bb1c708cb28b4424089090e892d5eeff8b44240c909090e8f26dfdff8b04248b008b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b4424088901588908eb076a016a01ff70048b44241c83380175708b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241089510c8b14248951088b54240c895104c701050000008b55008d52f43b55087303ff5520895500c742fc02000000894a048b400489028b45008d40f43b45087303ff5520894500c740fc020000008b4c244ceb05e90b000000894804891083c424c228008b44244c83c424c22800ff7104ff742424ff742430ff742428ff742428ff7424288b5c2424909090e896dfffff8b44243883c410c22800ff742428ff742420ff742420ff7424208b5c24308b44241c90e806dcffff8b44243883c410c228008b442428c22800900000000038030000|@15138,2097151,@3320|10,0,@4596 18,0,@4596 27,0,@6377 62,1,@6369 80,0,@4596 88,0,@4596 95,0,@6377 159,0,0 166,0,0 203,0,0 219,0,@15115 249,0,@15130 256,0,@8967 282,0,@15133 289,0,@8967 302,0,@5347 315,0,@8967 322,0,@5279 354,1,@15085 371,0,@15107 384,0,@14094 390,1,@14095 434,1,@15048 475,0,1 503,0,@15136 514,1,@6564 526,1,@13871 635,0,2 758,1,@15048 798,1,@15030 15115:D3,844|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01755bf6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b4b04890e8b52048b1289f0ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451745aeb05e91f010000817a04f7000000746d817a04b700000074698b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb0ae954000000e94f000000c706f0a47ab28d5e0cc743fc02000000897304c703b89a7ab28d730ceb0ae92c000000e927000000c746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700b46e8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5004f6c201740783fa037d0eeb06f642ff107406b8d8327bb2c38b30f6c201740583ea027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008957048b560489178b0dd4e839b289f889ca90ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c7004c6f8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000048030000|@15129,1048575,@3318|30,0,@6514 141,0,123 150,0,91 183,0,@5642 228,0,@5643 247,0,@5594 279,0,0 286,0,1 293,0,3 299,0,0 338,0,0 359,0,@5592 378,0,@15116 400,0,0 407,0,0 414,0,1 420,0,0 447,0,@6514 503,0,@4737 550,0,123 559,0,91 592,0,@5642 630,0,@5643 666,0,@5594 686,0,0 693,0,1 700,0,3 706,0,0 745,0,0 766,0,@5592 787,0,@15125 809,0,0 816,0,0 823,0,1 829,0,0 15116:O5|0,0,0,@15118,@15117 15117:O2|@15121,0 15118:O2|@15119,0 15119:O2|0,@15120 15120:O5|@14950,1261,1261,0,0 15121:O2|3,@15122 15122:S4|49734f4b 15123:O1|@15124 15124:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3317|1,0,@5227 15125:O5|0,0,0,@15118,@15126 15126:O2|@15127,0 15127:O2|3,@15128 15128:S7|497357726f6e67 15129:S15|7072696e742d6d6174636854797065 15130:O2|1,@15131 15131:O2|3,@15132 15132:S25|56616c7565206973206e6f7420616e20657863657074696f6e 15133:O2|1,@15134 15134:O2|3,@15135 15135:S26|56616c7565206973206e6f74206120636f6e7374727563746f72 15136:O1|@15137 15137:D3,16|b801000000c39090000000000c000000|@6563,1,@3319|1,0,0 15138:S57|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d617463684c6f63616c56616c756573283329 15139:S38|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329 15140:S26|535452554354555245535f28292e6d6174636853696773283729 15141:D3,44|3b650c7303ff5524a801740ef642080174088d40ff0342087105ff5538ebf38b5204ff220000000028000000|@15142,1048575,@3324| 15142:S44|535452554354555245535f28292e73747275637456616c7565283829725369672d736f75726365732d283129 15143:D3,276|3b650c7303ff5524a80175688b088b5104833a01740f8b7004b87c728cb28b5d049090ff138b71088b7d008d7ff03b7d087303ff5520897d00c747fc03000000c74708bc728cb2895f048b0e890f8b088b7104833e05750dff7004b808377bb28b5d04ff13833e01751b8b4e08833903750eeb05e98b0000008b71048b36eb0c8b7104eb078b4e048b0989ce8b48048b45008d40e83b45087303ff5520894500c740fc050000008978108b7a1089780c897008c74004010000008b7204893051538b54240c909090ff1250ff7424108b5c24088b44240c9090e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000010010000|@6329,1048575,@3325|26,0,@15144 67,0,@15147 92,0,@6539 182,0,0 261,0,0 15144:O4|@4608,@5398,@15146,@15145 15145:O5|@14950,1765,0,1765,0 15146:S9|4e6f7420426f756e64 15147:S29|437265617465642066726f6d206f7061717565207369676e6174757265 15148:D3,148|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b108951048b338931518b730489f38b500489d0e896ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000090000000|@8211,31,@3326|19,0,@8209 30,0,0 46,0,@8209 15149:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@15150,1048575,@3327|66,0,8388607 84,0,@5401 15150:S42|535452554354555245535f28292e73747275637456616c7565283829725369672d6f6c644d6170283129 15151:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9e48ceeff0000000020000000|@6481,2097151,@3328|24,1,@6426 15152:D3,56|3b650c7303ff55248b4a0ca801740df641140174073b41147d0eeb05ff5538ebf48b4a0489caff228b4a0889caff22900000000034000000|@15153,1048575,@3329| 15153:S46|535452554354555245535f28292e73747275637456616c7565283829725369672d6d617463686564496473283129 15154:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9288ceeff0000000020000000|@6481,2097151,@3330|24,1,@6426 15155:O1|@15156 15156:D3,28|3b650c7303ff5524bb15000000e942f6edff90900000000018000000|@5217,2097151,@3331|9,0,10 14,1,@5214 15157:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3332| 15158:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3333| 15159:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3334| 15160:D3,68|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c248b490483c40450b8010000008b5124ff1283f801750258c389c358e91f0000009090900000000040000000|@15162,1048575,@3336|10,0,0 33,0,0 53,1,@15161 15161:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3335| 15162:S40|535452554354555245535f28292e73747275637456616c75652838296c6f63616c456e762d283129 15163:O1|@15164 15164:D3,16|b801000000c39090000000000c000000|@15162,1,@3337|1,0,0 15165:O1|@15166 15166:D3,28|3b650c7303ff5524bb15000000e926f4edff90900000000018000000|@5217,2097151,@3338|9,0,10 14,1,@5214 15167:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3339| 15168:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3340| 15169:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3341| 15170:D3,68|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c248b490483c40450b8010000008b5124ff1283f801750258c389c358e91f0000009090900000000040000000|@15172,1048575,@3343|10,0,0 33,0,0 53,1,@15171 15171:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3342| 15172:S38|535452554354555245535f28292e73747275637456616c75652838296e6577456e762d283129 15173:O1|@15174 15174:D3,24|b874798cb28b5d04909090ff139090900000000014000000|@15172,1,@3344|1,0,@15175 15175:O4|@4608,@5398,@15177,@15176 15176:O5|@14950,1569,0,1569,0 15177:S21|46756e63746f7220696e2053747275637420456e64 15178:O1|@15179 15179:D3,24|b8f4798cb28b5d04909090ff139090900000000014000000|@15172,1,@3345|1,0,@15180 15180:O4|@4608,@5398,@15182,@15181 15181:O5|@14950,1568,0,1568,0 15182:S23|5369676e617475726520696e2053747275637420456e64 15183:O1|@15184 15184:D3,16|b801000000c39090000000000c000000|@15172,1,@3346|1,0,0 15185:O1|@15186 15186:D3,28|3b650c7303ff5524bb15000000e90af1edff90900000000018000000|@5217,2097151,@3347|9,0,10 14,1,@5214 15187:D3,76|3b650c7303ff55248b4c24045052f6c30175288b0424ff730451ff7004ff7008ff700c8b1b8b442418e83200000089c15b3b650c7303ff5524ebd389c883c408c20400900000000048000000|@6417,1048575,@3352|42,1,@15188 15188:D3,1488|3b650c7303ff55248b4c2410813b0ce239b2756b813b0ce239b2740d89c2b854eb7ab28b5d0490ff138b5308f6420401745b89c68b45008d40f43b45087303ff5520894500c740fc020000008950048930ff7104ff318b5424149090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c2404894804eb05e9520200005983c4048908c210008b75008d76e83b75087303ff5520897500c746fc020000008b7904897e048b39893e8d4e0cc741fc02000000897104c701010000006a016a018b720450ff32f7c60100000075728b068b51048b5d008d5bf43b5d087303ff5520895d00c743fc020000008b3a897b04c703010000008b7d008d7fe03b7d087303ff5520897d00c747fc07000000ff7604ff7204ff328b50188957188b50148957148b50108957108b500c89570c895f088b5804895f048b18891f8b5d00eb05e9d10000008d5bf43b5d087303ff5520895d00c743fc020000008b09894b04893b8b0c24f6c101740583c1027105ff5538ebf68b7d008d7fec3b7d087303ff5520897d00c747fc040000008b3689770c895708c7470405000000c707050000008b75008d76f43b75087303ff5520897500c746fc02000000897e045f893e8b7d008d7ff43b7d087303ff5520897d00c747fc020000005889470489378b45008d40e83b45087303ff5520894500c740fc0200000089780489088d480cc741fc0200000089410489195e3b650c7303ff5524e9b0feffff8d4424088b1189108d4424088b59048958048b04248b75008d76f03b75087303ff5520897500c746fc030000008b780883c404897e088b50048956048b08890e8b5c2404b901000000f6c301752e8b7d008d7ff43b7d087303ff5520897d00c747fc02000000894f048b0b890f89f98b5b043b650c7303ff5524ebcd8b5d008d5be83b5d087303ff5520895d00c743fc02000000894b0489338d430cc740fc020000008958048b0c2489088b54241883c4089090ff1258c21000813b64e239b27571813b64e239b2740f89c2b854eb7ab28b5d04909090ff138b5308ff7104ff315052ff720cff72088b042490e8d60200008b4d008d49d43b4d087303ff5520894d00c741fc020000008b542410895104c701010000008d590cc743fc040000008b74240489730c8b3424897308894b04eb05e9ac0000008b4c240c890b89c68d4314c740fc020000008958048908568b542424ff128b442414a801740583c0027105ff5538ebf68b4d008d49f03b4d087303ff5520894d00c741fc030000008b54240c8951085a83c410895104c701010000008b55008d52f43b55087303ff5520895500c742fc02000000894a0459890a8b4d008d49e83b4d087303ff5520894d00c741fc020000005b895904891189c28d410cc740fc020000008948048910c21000813bece139b2756b813bece139b2740d89c2b854eb7ab28b5d0490ff138b53088b7208833e07755989c78b45008d40f43b45087303ff5520894500c740fc020000008950048938ff7104ff318b54240cff128b45008d40f43b45087303ff5520894500c740fc020000008b4c2404894804eb05e92b0100005983c4048908c210008b7d008d7ff43b7d087303ff5520897d00c747fc020000008b31897704c707010000008b75008d76e03b75087303ff5520897500c746fc07000000ff7104ff318b4a18894e188b4a14894e148b4a10894e108b4a0c894e0c897e088b7a04897e048906508b45008d40f43b45087303ff5520894500c740fc020000008970045e8930ff7308518b54241490ff128b442408a801740583c0027105ff5538ebf68b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240489510c5a83c404895108c7410405000000c701050000008b55008d52f43b55087303ff5520895500c742fc02000000894a0459890a8b4d008d49e83b4d087303ff5520894d00c741fc020000005b895904891189c28d410cc740fc020000008948048910c210008b45008d40f43b45087303ff5520894500c740fc020000008b51048950048b198918c2100000000000cc050000|@15196,1048575,@3351|14,0,@4600 22,0,@4600 31,0,@6377 190,0,0 248,0,0 412,0,2 418,0,2 609,0,0 728,0,@4611 736,0,@4611 745,0,@6377 778,1,@15189 815,0,0 940,0,0 1026,0,@4596 1034,0,@4596 1043,0,@6377 1184,0,0 1353,0,2 1359,0,2 15189:D3,40|3b650c7303ff5524b924818cb28b1424890c24bb010000008b0052e9a87deeff0000000024000000|@15195,1048575,@3350|9,0,@15190 20,0,0 28,1,@6418 15190:O1|@15191 15191:D3,72|3b650c7303ff55248b4c240450f6c3017525ff730451b888818cb2508b1b8b44240c909090e83a00000089c15b3b650c7303ff5524ebd689c883c404c20400900000000044000000|@6417,1048575,@3349|23,0,@15192 38,1,@15193 15192:O1|@15189 15193:D3,504|3b650c7303ff5524813b64e239b2756b813b64e239b2740db854eb7ab28b5d04909090ff138b43088b48048339017566ff7104508b480889c88b54240c909090ff128b4d008d49d83b4d087303ff5520894d00c741fc030000005a895108894104c701010000008d4110c740fc0200000089480459890889c1eb05e91d0000008d400cc740fc020000008b5424088950048908c208008b442408c20800813bece139b2756b813bece139b2740cb854eb7ab28b5d049090ff138b43088b4808833901755d8b55008d52d43b55087303ff5520895500c742fc0400000089420c8b700c897208c7420405000000c702050000008d7a14c747fc020000008957048b510489178d470cc740fc02000000eb05e9130000008b5c24088958048938c208008b442408c20800813b0ce239b27568813b0ce239b2740db854eb7ab28b5d04909090ff138b5b088b5b048b442408f6c301756b8b0b8b5108833a0175668b75008d76e03b75087303ff5520897500c746fc04000000894e0c8b790c897e08c7460405000000c706050000008d4e14c741fc02000000eb05e94a0000008971048b520489118b55008d52f43b55087303ff5520895500c742fc02000000eb0ae920000000e907000000894204890aeb0289c289d08b5b043b650c7303ff5524e96bffffffc208008b442408c20800909000000000f4010000|@15194,1048575,@3348|10,0,@4611 18,0,@4611 25,0,@6377 99,0,0 159,0,@4596 167,0,@4596 174,0,@6377 232,0,2 238,0,2 298,0,@4600 306,0,@4600 313,0,@6377 386,0,2 392,0,2 15194:S45|535452554354555245535f28292e6d616b65436f7079416374696f6e732831296d61746368456e747279283329 15195:S32|535452554354555245535f28292e6d616b65436f7079416374696f6e73283129 15196:S40|535452554354555245535f28292e73747275637456616c7565283829656e7465724974656d283329 15197:D3,32|3b650c7303ff552489c38b4204ba640889b2e93984fcff90000000001c000000|@14994,2097151,@3353|14,0,@13554 19,1,@13556 15198:D3,224|3b650c7303ff5524f6c30175728b0b8b11833a01740f89c6b854858cb28b5d04909090ff138b7104833e05750c89c7b808377bb28b5d04ff13833e0175148b7e08833f0375078b4f048b09eb0c8b4f04eb078b7e048b3f89f98b75008d76e43b75087303ff5520897500c746fc03000000894608894e04c70603000000eb05e94b0000008d4e10c741fc020000008971048b52048911a801740583c0027105ff5538ebf6518b5b0490e852ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000dc000000|@15202,63,@3354|25,0,@15199 48,0,@6539 121,0,1 208,0,0 15199:O4|@4608,@5398,@15201,@15200 15200:O5|@14950,1403,0,1403,0 15201:S24|6d61746368547970654964733a204e6f7420466f726d616c 15202:S29|535452554354555245535f28292e6d6174636854797065496473283229 15203:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3355| 15204:D3,44|3b650c7303ff5524a801740ef642080174088d40ff0342087105ff5538ebf38b5204ff220000000028000000|@15205,1048575,@3356| 15205:S39|535452554354555245535f28292e73747275637456616c7565283829726573756c74732d283129 15206:D3,148|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b108951048b338931518b730489f38b500489d0e896ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000090000000|@8211,31,@3357|19,0,@8209 30,0,0 46,0,@8209 15207:D3,332|3b650c7303ff5524a801756e8b088b5104833a01740f8b7004b898888cb28b5d049090ff138b710853ff700451ff7210ff7204ff36b8c4888cb2909090e81a84edff8b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b4424208941045a89118b5424088b5a04833b057512b808377bb2eb05e9bd0000008b5d0490ff13833b0175148b7308833e0375078b7e048b3feb0c8b7e04eb078b73048b3689f78b45008d40e83b45087303ff5520894500c740fc050000008948108b4c240489480c897808c74004010000008b0c2489088b54241883c408909090ff128b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890151ff742414ff7424148b5c24108b44240ce8eafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c208000000000048010000|@6329,1048575,@3358|26,0,@15208 54,0,@15210 62,1,@4940 116,0,@6539 205,0,0 317,0,0 15208:O4|@4608,@5398,@15146,@15209 15209:O5|@14950,1508,0,1508,0 15210:S30|437265617465642066726f6d206170706c79696e672066756e63746f7220 15211:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3359|60,0,0 15212:D3,172|3b650c7303ff5524a801740df642180174073b42187d0ceb05ff5538ebf48b5204ff228b4a0ca801740df641140174073b41147c49eb05ff5538ebf4a801740bf641140174052b41147105ff5538ebf683c001a80174138b7208bbffffff00235efc8d5c1b013bc3720f89c3b8cc7b7ab28b5d04909090ff138b4446fec38b5a14a801740df643140174073b43147c0eeb05ff5538ebf48b4a1089caff228b5310ff229000000000a8000000|@15213,1048575,@3360|91,0,8388607 109,0,@5401 15213:S48|535452554354555245535f28292e73747275637456616c7565283829676574436f6d62696e6564547970654964283129 15214:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9e076eeff0000000020000000|@6481,2097151,@3361|24,1,@6426 15215:S9|46756e63746f722028 15216:D3,32|3b650c7303ff552489c38b4204ba640889b2e9d57dfcff90000000001c000000|@15217,2097151,@3362|14,0,@13554 19,1,@13556 15217:S32|535452554354555245535f28292e676976654572726f72283329283129283129 15218:D3,188|3b650c7303ff5524ff720468bc8b8cb28b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740bb8ecd57ab28b5d0490ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff1389e050ff720c51bb030000008b420890e87eaffcff83c408c3909000000000b8000000|@15220,1048575,@3364|12,0,@15219 45,0,3 55,0,@6321 92,0,0 114,0,0 121,0,0 128,0,0 134,0,0 144,0,@6321 161,0,1 170,1,@13644 15219:D3,32|3b650c7303ff552489c38b4204ba640889b2e9a97cfcff90000000001c000000|@15217,2097151,@3363|14,0,@13554 19,1,@13556 15220:S29|535452554354555245535f28292e676976654572726f72283329283129 15221:S28|535452554354555245535f28292e73747275637456616c7565283829 15222:D3,216|3b650c7303ff55245352a80175668b088339017523ff7004ff742420ff74240cff74241cff7424288b59088b4104909090e8b6000000eb6b833903753cff7004ff742420ff742408ff742418ff742414ff742438ff742438ff742434ff742434ff7424348b59048b4108909090e876080000eb42e94b0000008b1424ff7004ff710cff742420ff742420ff742414ff742424ff7204ff742428ff742444ff742444eb05e90e000000ff7424448b590889c8e822100000583b650c7303ff5524e946ffffffb80100000083c408c21c009000000000d4000000|@15269,2097151,@3395|50,1,@15223 110,1,@15239 178,1,@15256 197,0,0 15223:D3,400|3b650c7303ff55248b4c24108b55008d52f03b55087303ff5520895500c742fc03000000c702cc8e8cb2895a04894a088062ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c70604908cb2895e04894e088066ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c707fc908cb2895f04894f088067ffbf508b45008d40f03b45087303ff5520894500c740fc03000000c700f4918cb28958048b5c24148958088060ffbfff7130ff712c508b45008d40c83b45087303ff5520894500c740fc0d000000ff7324ff7120ff731cff7118ff7114ff71108b4c24208948308b4c241c89482c8b4c24188948288b4c24148948248b4c24108948208b4c240c89481c8b4c24088948188b4c24048948145983c42089481089700c8950088b5b0489580489388b4d008d49f03b4d087303ff5520894d00c741fc03000000c701ec928cb28b5424108951048b5c240c8959088061ffbf50ff74240c6884948cb289cb8b44240cba948689b290e816f8fcffb80100000083c404c21000909090000000008c010000|@15238,2097151,@3376|38,0,@15224 78,0,@15227 118,0,@15229 159,0,@15231 329,0,@15233 357,0,@15235 368,0,@13806 374,1,@13808 379,0,0 15224:D3,140|3b650c7303ff55248b4a0852ff70048b51089090ff128b4424048b48048b098b55008d52f43b55087303ff5520895500c742fc020000005b895a04c702070000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000891383fb01740989c8e83200000089c18b04248b400483c4048908b801000000c39090900000000088000000|@15226,1048575,@3367|61,0,3 92,0,0 106,1,@15225 124,0,0 15225:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3366| 15226:S55|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296e6577456e762d283129 15227:D3,140|3b650c7303ff55248b4a0852ff70048b510c9090ff128b4424048b48048b098b55008d52f43b55087303ff5520895500c742fc020000005b895a04c702050000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000891383fb01740989c8e83200000089c18b04248b400483c4048908b801000000c39090900000000088000000|@15226,1048575,@3369|61,0,2 92,0,0 106,1,@15228 124,0,0 15228:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3368| 15229:D3,140|3b650c7303ff55248b4a0852508b1190ff128b4424048b48048b098b14248b5d008d5be43b5d087303ff5520895d00c743fc030000008b720483c4048973088b3a897b04c703010000008d4310c740fc02000000c7400401000000891883f801740e89c389c8909090e83200000089c18b04248b400483c4048908b801000000c39090900000000088000000|@15226,1048575,@3371|70,0,0 87,0,0 106,1,@15230 124,0,0 15230:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3370| 15231:D3,140|3b650c7303ff55248b4a0852ff70048b51289090ff128b4424048b48048b098b55008d52f43b55087303ff5520895500c742fc020000005b895a04c702030000008b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000891383fb01740989c8e83200000089c18b04248b400483c4048908b801000000c39090900000000088000000|@15226,1048575,@3373|61,0,1 92,0,0 106,1,@15232 124,0,0 15232:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3372| 15233:D3,324|3b650c7303ff55248b4c24088b7104833e0375728b7c2404be010000008b09f6c101751ff7c601000000740583c6027105ff5538ebf68b49043b650c7303ff5524ebdc89f1535051ff7708ff7704ff72048b1f8b4208909090e84a78edff8b4d008d49d83b4d087303ff5520894d00c741fc030000008b5424088951088b542404895104eb05e93500000089018d4110c740fc050000008948108b4c241489480c8b4c2410894808c74004030000008b4c240c89085a83c4145983c40851ff228b44240456ff31ff7008ff70048b188b4208909090e8ce77edff8b4d008d49d03b4d087303ff5520894d00c741fc030000008b5424048951085a83c40489510489018d4110c740fc030000008b5424048950085a83c404895004c7000500000089c28d4010c740fc03000000894808895004c70070867ab2c20800900000000040010000|@15234,1048575,@3374|25,0,0 90,1,@4940 171,0,1 214,1,@4940 284,0,2 308,0,@5500 15234:S54|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296d616b654964283429 15235:O1|@15236 15236:D3,16|b801000000c39090000000000c000000|@15237,1,@3375|1,0,0 15237:S50|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832295f2d283129 15238:S45|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e283229 15239:D3,1084|8d7c24903b7d0c7303ff55285350ff7504b9e2958cb2518965048b4d008d49f83b4d087303ff5520894d00c741fc01000040c7010100000089cab917000000b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5fc707150000008b45008d40dc3b45087303ff5520894500c740fc0100004089388d4808c741fc01000040c70174998cb28d7108c746fc0400000089460c895608894e04c7060300000083c40458894504eb6890908b650483c4045b895d04833809755c50bb03000000b815000000bafc317ab2e81e9cedff89c3b8bc5589b2e88275edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cd45589b2894108c74104507b7ab2c7014ce239b289c88b5d04eb0ae910000000e90300000090ff138b5d04909090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0189e389f0bac0e47ab290e85a4eeeff8b44246083c4048b4d008d49f03b4d087303ff5520894d00c741fc03000000c701ac998cb28b50188951048b5c24148959088061ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703f4998cb28b70208973048b7c241c897b088063ffbf8b7d008d7ff03b7d087303ff5520897d00c747fc03000000c7073c9a8cb28b50308957048b74242c8977088067ffbf8b74245c8b45008d40f03b45087303ff5520894500c740fc03000000c700849a8cb28970048b5424208950088060ffbf8b55008d52c83b55087303ff5520895500c742fc0d000000897a30578b7e2c897a2c8b7c2428897a28894224895a208b7c241c897a1c894a188b7e14897a148b7c2410897a108b7c240c897a0c8b7c2408897a088b7c2404897a04c702749b8cb2ff762c505351ff7614ff742464ff74246452ff742468ff742468ff742468ffb424840000008b9c24840000008b4424648b94248c0000009090ff128b45008d40f03b45087303ff5520894500c740fc03000000c700a09b8cb28b4c24748948048b54241c8950088060ffbf8b55008d52f03b55087303ff5520895500c742fc03000000c702209c8cb2894a048b5c2420895a088062ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703609c8cb2894b048b74243c8973088063ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706a09c8cb2894e048b7c2418897e088066ffbf8b7d008d7fc83b7d087303ff5520897d00c747fc0d0000008b4c2414894f308b4c2410894f2c895f288b4c240c894f248b4c2408894f208b4c2430894f1c8b4c2404894f185983c420894f145983c424894f1089570c894708897704c707749b8cb28b4424248b4c241c8b5424188b5c24148b742410578b7c2410578b7c2410578b7c242c89542434895c24308b5424088954242c897424288b542404895424245a83c40889542414897c241089cb89c15889ca5983c40851ff229090900000000038040000|@15255,2097151,@3388|18,0,$15239+190 52,0,0 59,0,11 64,0,0 108,0,10 150,0,@15240 175,0,1 207,0,1 212,0,10 217,0,@5052 222,1,@5053 229,0,@13704 234,1,@4940 265,0,@13705 275,0,@5398 281,0,@4608 344,0,@6366 350,1,@6367 387,0,@15242 434,0,@15243 481,0,@15244 532,0,@15245 643,0,@15248 732,0,@15250 780,0,@15252 824,0,@15253 868,0,@15254 980,0,@15248 15240:O1|@15241 15241:D3,28|3b650c7303ff5524bb15000000e902d2edff90900000000018000000|@5217,2097151,@3377|9,0,10 14,1,@5214 15242:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3378| 15243:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3379| 15244:D3,52|3b650c7303ff552450528b4a0889ca90ff1283f80175118b04248b48048b44240489ca83c408ff2283c408c30000000030000000|@12907,1048575,@3380| 15245:D3,68|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c248b490483c40450b8010000008b5124ff1283f801750258c389c358e91f0000009090900000000040000000|@15247,1048575,@3382|10,0,0 33,0,0 53,1,@15246 15246:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3381| 15247:S56|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c6465632832296c6f63616c456e762d283129 15248:O1|@15249 15249:D3,16|b801000000c39090000000000c000000|@15247,1,@3383|1,0,0 15250:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b48085889caff22900000000028000000|@15251,1048575,@3384| 15251:S55|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229626f6479456e762d283129 15252:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b480c5889caff22900000000028000000|@15251,1048575,@3385| 15253:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b48285889caff22900000000028000000|@15251,1048575,@3386| 15254:D3,44|3b650c7303ff552450528b4a0889ca90ff128b04248b400483c4048b48045889caff22900000000028000000|@15251,1048575,@3387| 15255:S44|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229 15256:D3,648|8d7c24a03b7d0c7303ff55288b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701b09f8cb28941048b4424248941088b54242089510c8061ffbf6a016a016a0189df89e389c89090e8969efaff8b45008d40f03b45087303ff5520894500c740fc03000000c7006ca18cb28b4c24348948048b5424288950088060ffbf50f7c70100000075708b07ff7704ff700cff7004ff30ff70088b5c24088b44243c9090e8d66dedffbb5d0000009090e8ca6dedff6a016a016a016a016a016a01ff742448ff742448ff742448ff74246cff74242c508d44241850ff7424688b5c244c8b4424388b542470ff128b45008d40e43b4508730aeb05e969010000ff5520894500c740fc060000008b4c24148948148b4c24108948108b4c240c89480c8b4c24088948088b4c24048948048b0c248908506810a28cb2bb0100000089c8909090e85260eeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2420894804c700010000008b4c246450b8010000008b5140ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40c03b45087303ff5520894500c740fc01000040c700ffffffff8d5008c742fc01000040c70228e07bb28d5a08c743fc03000000895308894304c703050000008d4310c740fc0400000089480c5983c4208948088958048b0c24890889c28d4014c740fc020000008950048908528b542418ff128b45008d40f83b45087303ff5520894500c740fc010000005983c40489085989015f3b650c7303ff5524e91afeffff8b44241483c4048b482889c85a83c4085983c42851ff220000000084020000|@15268,1048575,@3394|38,0,@15257 78,1,@13015 108,0,@15262 166,1,@4940 171,0,46 178,1,@4940 311,0,@15264 316,0,0 326,1,@6418 363,0,0 373,0,0 411,0,2 428,0,0 476,0,-1 492,0,@6817 514,0,2 15257:D3,220|3b650c7303ff5524ff720468a0a08cb25289c3b818a18cb290e8c66bedffbbe43a89b29090e8ba6bedff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff138b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc05000000894110c7410c01000000c7410801000000c7410401000000c70101000000f6c101740ab8ecd57ab28b5d04ff138b04248d54240452ff700c51bb030000008b4008e89a9afcff83c40cc2040000000000d8000000|@15261,1048575,@3390|12,0,@15258 20,0,@15260 26,1,@4940 31,0,@13643 38,1,@4940 71,0,3 81,0,@6321 120,0,0 142,0,0 149,0,0 156,0,0 162,0,0 172,0,@6321 194,0,1 202,1,@13644 15258:D3,32|3b650c7303ff552489c38b4204bad81089b2e98970fcff90000000001c000000|@15259,2097151,@3389|14,0,@13564 19,1,@13567 15259:S59|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329283129 15260:S10|53747275637475726520 15261:S56|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329 15262:D3,72|3b650c7303ff5524528b4a0889ca9090ff128b0c248b51048b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b490483c4048919c30000000044000000|@15263,1048575,@3391| 15263:S61|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332963617074757265496473283129 15264:O1|@15265 15265:D3,236|3b650c7303ff55248b442404f6c30175638b0390908138ece139b2755c8138ece139b2740cb854eb7ab28b5d049090ff138b4808f6411401750e8b51148b328b7e04c70703000000f641180175678b51186a016a01ff7304ff328d74240856bb18a38cb28b410c9090e8169deeff8b44240ceb0ae967000000e945000000909090e86a35fdff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c24088908598901b801000000eb1ab8010000006a016a01ff7304eb0cb8010000006a016a01ff73045b83c4083b650c7303ff5524e92cffffffc204009000000000e8000000|@6417,2097151,@3393|23,0,@4596 31,0,@4596 38,0,@6377 68,0,1 96,0,@15266 106,1,@6564 130,1,@13871 161,0,0 175,0,0 182,0,0 196,0,0 15266:O1|@15267 15267:D3,16|b801000000c39090000000000c000000|@6563,1,@3392|1,0,0 15268:S48|535452554354555245535f28292e70617373325374727563742838297061737332537472756374757265446563283329 15269:S28|535452554354555245535f28292e7061737332537472756374283829 15270:S3|28292e 15271:O1|@15272 15272:D3,64|3b650c7303ff55248b4c240450f6c301751e8b7b04518b1b8b44240490e8ae48ffff89c189fb3b650c7303ff5524ebdd89c883c404c20400000000003c000000|@6417,63,@3396|30,1,@14911 15273:D3,200|3b650c7303ff5524a801740df642180174073b42187d0ceb05ff5538ebf48b5204ff22a801740df642140174073b42147d4ceb05ff5538ebf48b4a0ca801740bf641140174052b41147105ff5538ebf683c001a80174138b7208bbffffff00235efc8d5c1b013bc3720f89c3b8cc7b7ab28b5d04909090ff138b4446fec3a801740bf642140174052b42147105ff5538ebf683c001a80174138b5a10b9ffffff00234bfc8d4c09013bc1720d89c1b8cc7b7ab28b5d0490ff138b4443fec3909000000000c4000000|@15274,1048575,@3397|91,0,8388607 109,0,@5401 157,0,8388607 175,0,@5401 15274:S76|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229726573547970654d6170283129 15275:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9ec5beeff0000000020000000|@6481,2097151,@3398|24,1,@6426 15276:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3399| 15277:S63|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229 15278:D3,440|3b650c7303ff55248b4a088b09bb01000000f6c101751cf6c301740583c3027105ff5538ebf68b49043b650c7303ff5524ebdf89d98378040174738b5d008d5be03b5d087303ff5520895d00c743fc01000040c703ffffffff8d7308c746fc01000040c70628e07bb28d7e08c747fc03000000897708895f04c707050000008b58108b700cff7008ff308b45008d40e43b45087303ff5520894500c740fc060000008958148970108b5c2404eb05e91900000089580c8948088978045983c4048908529090e882dafcffeb708b5d008d5be03b5d087303ff5520895d00c743fc01000040c703ffffffff8d7308c746fc01000040c70628e07bb28d7e08c747fc03000000897708895f04c707050000008b58108b700c52ff7008ff308b45008d40e43b45087303ff5520894500c740fc06000000895814897010eb05e9190000008b5c240489580c8948088978045983c404890890e84ed2fcff8b0c248b51088b128b5d008d5bf43b5d087303ff5520895d00c743fc0200000089530489038b5108891a8b59048b1b8b75008d76f43b75087303ff5520897500c746fc02000000895e0489068b590483c4048933c39000000000b4010000|@15279,63,@3401|14,0,0 85,0,-1 101,0,@6817 123,0,2 198,1,@13782 230,0,-1 246,0,@6817 268,0,2 342,1,@13765 15279:S52|535452554354555245535f28292e7061737332537472756374732833297061737332546f704465632832296d616b654964283129 15280:D3,48|3b650c7303ff55248b48048b52048b1c2489142468782d89b289da8b590c8b3089f052e96487fcff000000002c000000|@13633,1048575,@3402|21,0,@13610 36,1,@13619 15281:D3,64|3b650c7303ff552452ff7004bb5d0000008b009090e81e63edff598b14248b520483c4048b1c2489142489da8b590852e93b8ffcff909090000000003c000000|@13633,1048575,@3403|13,0,46 22,1,@4940 49,1,@13635 15282:S43|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229 15283:D3,164|3b650c7303ff5524ff70048b008b5204ff12a80175168b08f6411401750e8b51148b1a8b7304c706030000008b0424f6401801755d8b48186a016a01ff318d54240452bb9ca98cb28b480c89c8e86696eeff8b442408909090e8c62efdff8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c240489085983c4088901b80100000083c404c3b80100000083c404c39000000000a0000000|@15286,2097151,@3406|40,0,1 68,0,@15284 78,1,@6564 90,1,@13871 121,0,0 138,0,0 147,0,0 15284:O1|@15285 15285:D3,16|b801000000c39090000000000c000000|@6563,1,@3405|1,0,0 15286:S32|535452554354555245535f28292e706173733253747275637473283329283129 15287:S29|535452554354555245535f28292e706173733253747275637473283329 15288:O1|@15289 15289:D3,112|8b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338017506b8a4aa8cb2c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38338037506b820ab8cb2c3f6c101740783f9037c0eeb06f641ff107506b898ab8cb2c3b8d8327bb2c390000000006c000000|@15311,3,@3408|22,0,@6514 33,0,@15290 57,0,@6514 68,0,@15297 92,0,@15304 98,0,@6514 15290:O5|0,0,0,@15292,@15291 15291:O2|@15295,0 15292:O2|@15293,0 15293:O2|0,@15294 15294:O5|@14950,129,129,0,0 15295:O2|3,@15296 15296:S18|436f6e7374727563746f72546f56616c7565 15297:O5|0,0,0,@15299,@15298 15298:O2|@15302,0 15299:O2|@15300,0 15300:O2|0,@15301 15301:O5|@14950,128,128,0,0 15302:O2|3,@15303 15303:S16|457863657074696f6e546f56616c7565 15304:O5|0,0,0,@15306,@15305 15305:O2|@15309,0 15306:O2|@15307,0 15307:O2|0,@15308 15308:O5|@14950,127,127,0,0 15309:O2|3,@15310 15310:S10|4e6f436f657263696f6e 15311:S20|7072696e742d76616c7565436f657263696f6e73 15312:O3|@15314,@15409,@15313 15313:O3|@15698,@15410,@15409 15314:D3,76|3b650c7303ff55245253ff70088b58048b0889c890e82e59feff8b0c248b54240483c4048b5c2404894424048b420483c40450ff720889de8b59048b0156e91d000000900000000048000000|@15408,63,@3455|22,1,@14409 63,1,@15315 15315:D3,256|3b650c7303ff552483f80175248b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048918c20c008b4d008d49e43b4d087303ff5520894d00c741fc06000000c701bcad8cb28941048b44240c8941088b54240889510c8b7424048971108959148061ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000894f04c70709000000f7c701000000740ab8ecd57ab28b5d04ff138b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000893983f901740d89df89cb9090e80624000089fb89c18b45008d40f43b45087303ff5520894500c740fc020000008948048918c20c00909000000000fc000000|@15407,63,@3454|75,0,@15316 139,0,4 152,0,@6321 188,0,0 206,1,@15406 15316:D3,60|3b650c7303ff5524b9010000008b1c24890c24b90cae8cb251ff7208ff720cff7210ff7204ff721489d98b5a0451e925000000900000000038000000|@15325,1048575,@3452|9,0,0 20,0,@15317 47,1,@15318 15317:O1|@15315 15318:D3,432|3b650c7303ff5524f6c301740cb8d8af8cb28b5d049090ff138b45008d40e03b45087303ff5520894500c740fc07000000c70004b08cb28b4c24188948048b5424088950088b74240489700c8b7c24148978108b4c24108948148b54240c8950188060ffbf8b75008d76f83b75087303ff5520897500c746fc010000008906837b04017507b801000000eb708b45008d40d83b45087303ff5520894500c740fc09000000c70090b08cb28958048b7c241c8978088b4c241889480c8b5424148950108b5424108950148b54240c8950188b54240889501c8b7c24048978208060ffbf8b4d008d49d03b4d087303ff5520894d00c741fc01000000eb05e96500000089018d4108c740fc09000000c7002cb18cb28b53048950048948088b4c241889480c8b5424148950108b7c24108978148b4c240c8948188b54240889501c8b5424048950208060ffbf508b45008d40f83b45087303ff5520894500c740fc010000005a89108b4d008d49f03b4d087303ff5520894d00c741fc030000008b54241c89510889710489018b4424108b74240c8944241c897424188b1b89c85983c41451e9bc01000000000000ac010000|@15405,1048575,@3451|14,0,@15319 51,0,@15321 134,0,0 166,0,@15323 271,0,@15326 420,1,@15327 15319:O4|@4650,@6706,0,@15320 15320:O5|@14950,828,0,828,0 15321:D3,48|3b650c7303ff55248b42108b0c24890424ff7214ff72188b5a0c8b42088b720489f251ff22909090000000002c000000|@15322,1048575,@3409| 15322:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329283129 15323:D3,56|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff722089de8b5a04badcb08cb256ff220000000034000000|@15325,1048575,@3410|41,0,@15324 15324:O1|@15318 15325:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283129283129 15326:D3,56|3b650c7303ff55248b4a088b1c24890c24ff720cff7210ff7214ff7218ff721cff722089de8b5a04badcb08cb256ff220000000034000000|@15325,1048575,@3411|41,0,@15324 15327:D3,536|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a4b38cb28959048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000894a04c70213000000f6c201740e89c1b8ecd57ab28b5d049090ff13535052ff70088b58048b0889c8909090e8a253feff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc05000000c7000cb48cb28b14248950048b5c24048958088b74241089700c8b7c240c8978108060ffbf833b01756b8b55008d52f43b55087303ff5520895500c742fc02000000c70288b48cb28972048062ffbf8b75008d76ec3b75087303ff5520897500c746fc0100000089068d4608c740fc020000008970048910ff7308518b530489c389d09090e8c279feff833c240174128b1c24eb05e931000000909090e8d619000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c40459890883c408c20800833b0375718b55008d52ec3b55087303ff5520895500c742fc0100000089028d4208c740fc020000008950049090c700f4cc8cb251ff73088b530489c389d0909090e83a79feff837c24040174098b5c2404e8721d000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e90c0000005983c404890883c408c208008b5b0489d089fa83c4085983c40851ff22900000000014020000|@15404,1048575,@3450|34,0,@15328 74,0,9 86,0,@6321 114,1,@14409 174,0,@15330 240,0,@15333 306,1,@14489 330,1,@15390 423,0,@15391 442,1,@14489 458,1,@15403 15328:D3,28|3b650c7303ff552489c38b4204e926eefbff90900000000018000000|@15329,2097151,@3412|14,1,@13411 15329:S48|535452554354555245535f28292e746f704465634578706f727454726565283229636f6d6d6f6e50726f70732d283129 15330:D3,44|3b650c7303ff55248b420c8b0c24890424ff72108b5a088b4204ba4cb48cb251ff2290900000000028000000|@15332,1048575,@3413|27,0,@15331 15331:O1|@15327 15332:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296173506172656e74283129 15333:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@15389,63,@3442|26,1,@15334 15334:D3,556|3b650c7303ff55248b0b6a016a01837b1803755b8b5304833a0575538b72048b7d008d7ff03b7d087303ff5520897d00c747fc030000008b560c8957088b56088957048b560489178b55008d52f83b55087303ff5520895500c742fc01000000893a89e7891789e28b36897204eb1089e2c7020100000089e28b7304897204ff7308ff730cff731cff71085350ff70088b58048b0889c89090e82e50feff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70104b78cb25a8951045a8951088b54241c89510c8061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc07000040c7038cb78cb28953048b742414897308894b0cc7431001000000c74314010000008b7c2410897b188b75008d76c83b75087303ff5520897500c746fc05000040c70648b88cb2897e04895e08c7460c01000000894e108d7e18c747fc07000040c707a8ca8cb28b1424895704c7470801000000894f0c897710895f148b5424108957188b55008d52e83b55087303ff5520895500c742fc05000000c70274cb8cb2508b44240c8942048b442408894208897a0c894a108062ffbf8957088067ffbf897e0c8066ffbf897310897b148063ffbf8b45008d40f43b45087303ff5520894500c740fc02000000895004c70009000000a801740f89c1b8ecd57ab28b5d04909090ff138b4d008d49e83b4d087303ff5520894d00c741fc020000005a83c40c89510489018d410cc740fc020000008948045983c4088908c204000000000028020000|@15388,63,@3441|115,0,0 154,1,@14409 184,0,@15335 233,0,@15338 253,0,0 260,0,0 297,0,@15340 310,0,0 329,0,@15384 342,0,0 388,0,@15386 470,0,4 481,0,@6321 15335:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba40b78cb251ff22900000000024000000|@15337,1048575,@3414|24,0,@15336 15336:O1|@15334 15337:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296578706f727454686973283129 15338:D3,104|3b650c7303ff5524837a180175058b4214eb038b42108b4d008d49e03b4d087303ff5520894d00c741fc010000008b5a0c89198d7108c746fc0100000089068d4608c740fc03000000897008894804c700010000008b5a088b4a0489caff22900000000064000000|@15339,1048575,@3415|81,0,0 15339:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574426f6479283129 15340:D3,132|3b650c7303ff55248b45008d40d83b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc010000008b4a08890f8d7708c746fc03000000895e08894604893e837a0401750ab84cc37bb28b5d04ff138b42048b188b3b89fb89f0bae0b88cb2e93600000090900000000080000000|@15383,63,@3438|92,0,@6769 113,0,@15341 118,1,@15343 15341:O2|@15343,@15342 15342:O2|@15352,@15351 15343:D3,436|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c0ba8cb28959048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000894e04c70613000000f7c601000000740f89c1b8ecd57ab28b5d04909090ff1352535056ff70088b58048b0889c89090e81e4cfeff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40ec3b45087303ff5520894500c740fc04000000c70028bb8cb28b5424088950045b8958088b1c2489580c8060ffbf833b0575278b45008d40f43b45087303ff5520894500c740fc020000008948049090c700e01687b283c408c3833b01756e8b75008d76ec3b75087303ff5520897500c746fc0100000089068d4608c740fc020000008970048b5204891089cfff73088b4b0489c389c890e83e72feff83ff01740789fbe84e01000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c38b430c8b0089cfff730890e8161aeeff83ff01740789fbe86601000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c3909000000000b0010000|@15350,63,@3420|34,0,@15344 74,0,9 89,0,@6321 118,1,@14409 178,0,@15346 239,0,@12945 310,1,@14489 322,1,@15348 374,1,@6320 386,1,@15349 15344:D3,32|3b650c7303ff552489c38b4204bac4a788b2e905edfbff90000000001c000000|@15345,2097151,@3416|14,0,@13416 19,1,@13418 15345:S44|5349474e41545552455328292e7369674578706f727454726565283229636f6d6d6f6e50726f70732d283129 15346:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@15347,1048575,@3417| 15347:S40|5349474e41545552455328292e7369674578706f7274547265652832296173506172656e74283129 15348:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3418| 15349:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3419| 15350:S29|5349474e41545552455328292e7369674578706f727454726565283229 15351:O3|@15355,@15354,@15341 15352:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@15353,1048575,@3421| 15353:S30|5349474e41545552455328292e737065634578706f727454726565283129 15354:O2|@15381,@15341 15355:D3,1236|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c0c18cb28959048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000894e04c70613000000f7c601000000740f89c1b8ecd57ab28b5d04909090ff1352535056ff70088b58048b0889c89090e83e48feff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40ec3b45087303ff5520894500c740fc04000000c7002cc28cb28b5424088950048b1c248958088b74240489700c8060ffbf8b3ebab6bd8cb28d54bafcffe2909090e9c2000000909090e9fc000000909090e971020000909090e9d7020000909090e90b000000909090e9ec0200009090908b5424088b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70394c28cb28b52088953048063ffbf8b55008d52ec3b55087303ff5520895500c742fc0100000089028d4208c740fc0200000089500489188b7e085189c38b460490e8266efeff833c2401740a8b1c249090e81a08000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804893883c410c36a016a0189e0508b5e048b44240cbaa08689b290e8aa2dfeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c404890883c40cc38b5608f6460c0175718b5e0c8b7d008d7fec3b7d087303ff5520897d00c747fc04000040c707ccc68cb2518b0b894f04c747080100000089470c8b4d008d49e83b4d087303ff5520894d00c741fc05000000c70174c78cb2508b028941048b420489410889790c8b04248941108061ffbf894f088067ffbfeb05e96a0000008b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000a801740e89c1b8ecd57ab28b5d049090ff138b4d008d49e83b4d087303ff5520894d00c741fc0200000083c4045a89510489018d410cc740fc020000008948048b7604893083c40cc38b5d008d5bec3b5d087303ff5520895d00c743fc04000000c70324c88cb28b3a897b048b7a04897b0889430c8063ffbf8b45008d40f43b45087303ff5520894500c740fc02000000895804c70009000000a801740c89c3b8ecd57ab28b5d04ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000894b0489038d430cc740fc020000008958048b7604893083c40cc38b55008d52ec3b55087303ff5520895500c742fc0100000089028b4424088d5a08c743fc020000008953048b4004890389cfff76088b460490e8f66bfeff83ff01740789fbe81208000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c40cc38b45008d40f43b45087303ff5520894500c740fc02000000894804c700e01687b283c40cc38b56088b5d008d5bec3b5d087303ff5520895d00c743fc04000040c703f0c88cb28b7e0c897b04c743080100000089430c8b7d008d7fe83b7d087303ff5520897d00c747fc05000000c70768c98cb2518b0a894f048b4a04894f08895f0c8947108067ffbf897b088063ffbf8b45008d40f43b45087303ff5520894500c740fc02000000897804c70009000000a801740d89c3b8ecd57ab28b5d0490ff138b5d008d5be83b5d087303ff5520895d00c743fc020000005f897b0489038d430cc740fc020000008958048b7604893083c40cc390909000000000d0040000|@15380,1048575,@3436|34,0,@15356 74,0,9 89,0,@6321 118,1,@14409 178,0,@15358 209,0,$15355+222 300,0,@15360 366,1,@14489 382,1,@15371 436,0,@13807 442,1,@14408 525,0,@15372 538,0,0 571,0,@15374 643,0,4 654,0,@6321 746,0,@15376 797,0,4 808,0,@6321 926,1,@14489 938,1,@15377 1007,0,@12945 1044,0,@15378 1057,0,0 1090,0,@15379 1152,0,4 1163,0,@6321 15356:D3,32|3b650c7303ff552489c38b4204ba94b788b2e92df6fbff90000000001c000000|@15357,2097151,@3422|14,0,@13439 19,1,@13443 15357:S45|5349474e41545552455328292e737065634578706f727454726565283229636f6d6d6f6e50726f70732d283129 15358:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@15359,1048575,@3423| 15359:S41|5349474e41545552455328292e737065634578706f7274547265652832296173506172656e74283129 15360:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@15370,63,@3428|26,1,@15361 15361:D3,308|3b650c7303ff55248b4b0c8b55008d52ec3b55087303ff5520895500c742fc04000000c70218c48cb2894204895a088b74240489720c8062ffbf8b7d008d7fe83b7d087303ff5520897d00c747fc05000040c7079cc48cb28977048b31897708c7470c010000008957108b75008d76e83b75087303ff5520897500c746fc05000000c70650c58cb2ff33508b43048946048b4308894608897e0c8956108066ffbf89770c8067ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897104c70109000000f6c101740bb8ecd57ab28b5d0490ff138b142451ff72088b5a048b02e8d641feff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c204000000000030010000|@15369,63,@3427|37,0,@15362 84,0,@15365 99,0,0 132,0,@15367 197,0,4 207,0,@6321 230,1,@14409 15362:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba54c48cb251ff22900000000024000000|@15364,1048575,@3424|24,0,@15363 15363:O1|@15361 15364:S54|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296578706f727454686973283129 15365:D3,96|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000008b5a0889f88b4a0489caff229090000000005c000000|@15366,1048575,@3425|70,0,0 15366:S56|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229676574536967537472756374283129 15367:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e96e59feff90900000000068000000|@15368,63,@3426|65,0,0 94,1,@14467 15368:S51|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296765744e616d65283129 15369:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229 15370:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283129 15371:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3429| 15372:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8ba74228bb2e96f5bfeff9090900000000060000000|@15373,2097151,@3430|70,0,0 80,0,@14476 85,1,@14478 15373:S40|5349474e41545552455328292e737065634578706f72745472656528322967657454797065283129 15374:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e94a57feff90900000000068000000|@15375,63,@3431|65,0,0 94,1,@14467 15375:S40|5349474e41545552455328292e737065634578706f7274547265652832296765744e616d65283129 15376:D3,96|3b650c7303ff55248b45008d40e83b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc03000000c7430801000000894304c703010000008b42088b34248904246a0189df8b5a0489f856e9a556feff90000000005c000000|@15375,63,@3432|50,0,0 59,0,0 83,1,@14467 15377:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3433| 15378:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8ba74228bb2e94b59feff9090900000000060000000|@15373,2097151,@3434|70,0,0 80,0,@14476 85,1,@14478 15379:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e95655feff90900000000068000000|@15375,63,@3435|65,0,0 94,1,@14467 15380:S30|5349474e41545552455328292e737065634578706f727454726565283229 15381:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@15382,1048575,@3437| 15382:S29|5349474e41545552455328292e7369674578706f727454726565283129 15383:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574536967283129 15384:D3,120|3b650c7303ff5524837a180175058b4214eb038b42108b4d008d49d83b4d087303ff5520894d00c741fc010000008b5a0c89198d7108c746fc010000008b7a08893e8d5e08c743fc0100000089038d4308c740fc0300000089700889480489188b5a04bae0b88cb2e9e3edffff9090900000000074000000|@15385,63,@3439|100,0,@15341 105,1,@15343 15385:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574417267283129 15386:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e94a53feff90900000000068000000|@15387,63,@3440|65,0,0 94,1,@14467 15387:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296765744e616d65283129 15388:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229 15389:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283129 15390:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3443| 15391:O1|@15392 15392:D3,28|3b650c7303ff55248b58048b0889c8e91c0000000000000018000000|@15402,63,@3448|16,1,@15393 15393:D3,280|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c70158ce8cb28941048959088061ffbf8b55008d52d43b55087303ff5520895500c742fc04000040c702d8ce8cb28b7310897204c7420801000000894a0c8d7a14c747fc05000000c70790cf8cb28b73048977048b730c89770889570c894f108067ffbf897a088062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000897904c70109000000f6c101740c89c2b8ecd57ab28b5d04ff13ff3351ff70088b58048b1089d0909090e89237feff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000014010000|@15401,63,@3447|34,0,@15394 74,0,@15397 87,0,0 106,0,@15399 168,0,4 180,0,@6321 206,1,@14409 15394:D3,32|3b650c7303ff55248b5a088b4204ba8cce8cb2ff22909090000000001c000000|@15396,1048575,@3444|15,0,@15395 15395:O1|@15393 15396:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296578706f727454686973283129 15397:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8bae0b88cb2e9c7e9ffff9090900000000060000000|@15398,63,@3445|70,0,0 80,0,@15341 85,1,@15343 15398:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229676574536967283129 15399:D3,108|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b42088b1c248904246a01538b5a0489f85f57e92e4ffeff90900000000068000000|@15400,63,@3446|65,0,0 94,1,@14467 15400:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296765744e616d65283129 15401:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229 15402:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283129 15403:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3449| 15404:S33|535452554354555245535f28292e746f704465634578706f727454726565283229 15405:S58|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329 15406:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3453| 15407:S47|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229 15408:S34|535452554354555245535f28292e737472756374734578706f727454726565283229 15409:O5|@15411,@15313,@4738,@4739,@15410 15410:O2|@15696,@15313 15411:D3,1204|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c70128d78cb28959048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000894e04c70613000000f7c601000000740f89c1b8ecd57ab28b5d04909090ff1352535056ff70088b58048b0889c89090e8b632feff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40ec3b45087303ff5520894500c740fc04000000c7009cd78cb28b5424088950045b8958088b1c2489580c8060ffbf833b05756b8b73048b7d008d7fd43b7d087303ff5520897d00c747fc04000040c7070cd88cb28b5604895704c747080100000089470c8d5f14c743fc05000000c703c4d88cb28b5424048953048b16895308897b0c8943108063ffbf895f088067ffbf8b45008d40f43b4508730aeb05e95c000000ff5520894500c740fc02000000895804c70009000000a801740f89c3b8ecd57ab28b5d04909090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000894b0489038d430cc740fc020000008958048b4e0c890883c408c3833b0375728b75008d76e83b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc03000000c70778d98cb2518b4a08894f048b4a0c894f088067ffbf893e8b7424088b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70790dd8cb28b4e04894f048b542408895708eb05e9c50000008067ffbf8b55008d52ec3b55087303ff5520895500c742fc0100000089028d4208c740fc02000000895004893889c78b4308909090e8620900008b4d008d49e83b4d087303ff5520894d00c741fc020000008b5304895104c701030000008d710cc746fc02000000c7460401000000890e83fe01740eff730c89f39090e89a090000eb03ff730c89fbe86a57feff837c24040174098b5c2404e8d609000089c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c404890883c408c3833b0175718b73048b7e108b3f83ff017507bf01000000eb058b3f8b7f108b55008d52e83b55087303ff5520895500c742fc05000040c70244df8cb28b5c2404895a048b1e895a08c7420c010000008942108b5d008d5be43b5d087303ff5520895d00c743fc06000000c703f8df8cb2518b4e04eb05e985000000894b048b4e18894b08897b0c8953108943148063ffbf895a0c8062ffbf8b45008d40f43b45087303ff5520894500c740fc02000000895804c70009000000a801740f89c2b8ecd57ab28b5d04909090ff138b55008d52e83b55087303ff5520895500c742fc020000005b895a0489028d420cc740fc020000008950048b5614891083c408c3833b0775718b75008d76ec3b75087303ff5520897500c746fc0100000089068d4608c740fc020000008970048b5210891089cfff73088b4b0489c389c8909090e8ee55feff83ff01740789fbe83e0a000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408eb05e901000000c38b43088b0083f8017507b801000000eb058b008b400c89cfff730c90e8aefdedff83ff01740789fbe83e0a000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c3909000000000b0040000|@15443,63,@3469|34,0,@15412 74,0,9 89,0,@6321 118,1,@14409 178,0,@15414 237,0,@15416 250,0,0 269,0,@15418 338,0,4 349,0,@6321 443,0,0 459,0,@15420 512,0,@15432 590,1,@15434 626,0,1 643,0,0 662,1,@15435 674,1,@14489 690,1,@15436 752,0,0 789,0,@15437 808,0,0 841,0,@15439 914,0,4 925,0,@6321 1054,1,@14489 1066,1,@15441 1124,0,0 1142,1,@6320 1154,1,@15442 15412:D3,32|3b650c7303ff552489c38b4204ba640889b2e93d31fcff90000000001c000000|@15413,2097151,@3456|14,0,@13554 19,1,@13556 15413:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229636f6d6d6f6e50726f70732d283129 15414:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@15415,1048575,@3457| 15415:S49|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296173506172656e74283129 15416:D3,100|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a0c89088d5808c743fc010000008b720889338d7b08c747fc03000000895f08894704c707010000008b5a0489f8bae0b88cb2e993e0ffff9090900000000060000000|@15417,63,@3458|70,0,0 80,0,@15341 85,1,@15343 15417:S53|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296765745369676e6174757265283129 15418:D3,96|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000c7470801000000894704891f8b5a0889f88b4a0489caff229090000000005c000000|@15419,1048575,@3459|65,0,0 15419:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229676574537472756374757265283129 15420:D3,848|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01755bf6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b4b04890e8b52048b1289f0ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451745aeb05e91f010000817a04f7000000746d817a04b700000074698b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb0ae954000000e94f000000c706f0a47ab28d5e0cc743fc02000000897304c703b89a7ab28d730ceb0ae92c000000e927000000c746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700dcdc8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38f7c601000000740583ee027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008971048b770489318b52088b1289c89090ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70048dd8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090000000004c030000|@15431,1048575,@3460|30,0,@6514 141,0,123 150,0,91 183,0,@5642 228,0,@5643 247,0,@5594 279,0,0 286,0,1 293,0,3 299,0,0 338,0,0 359,0,@5592 378,0,@15421 400,0,0 407,0,0 414,0,1 420,0,0 450,0,@6514 554,0,123 563,0,91 596,0,@5642 634,0,@5643 670,0,@5594 690,0,0 697,0,1 704,0,3 710,0,0 749,0,0 770,0,@5592 791,0,@15428 813,0,0 820,0,0 827,0,1 833,0,0 15421:O5|0,0,0,@15423,@15422 15422:O2|@15426,0 15423:O2|@15424,0 15424:O2|0,@15425 15425:O5|@14950,710,710,0,0 15426:O2|3,@15427 15427:S3|446563 15428:O5|0,0,0,@15423,@15429 15429:O2|@15430,0 15430:O2|3,@13709 15431:S16|7072696e742d616c6c456e7472696573 15432:D3,48|3b650c7303ff55248b4804833901750c8b59048b3089f08b5204ff228b59048b3089f08b5208ff22000000002c000000|@15433,1048575,@3461| 15433:S54|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296578706f7274456e7472696573283129 15434:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc020000008b10895104c70101000000518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3462|43,0,0 92,0,0 15435:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3463| 15436:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3464| 15437:D3,96|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1089088d5808c743fc010000008b720c89338d7b08c747fc03000000895f08894704c707010000008b5a0889f88b4a0489caff229090000000005c000000|@15438,1048575,@3465|70,0,0 15438:S54|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f72417267283129 15439:D3,128|3b650c7303ff55248b45008d40e03b45087303ff5520894500c740fc010000008b4a1489088d5808c743fc010000008b721089338d7b08c747fc03000000c7470801000000894704891f528b420c909090e83af4edff8b0c248b510883c4048b1c248914245089d88b590489c689f856e9b33efeff909090000000007c000000|@15440,63,@3466|65,0,0 82,1,@6320 113,1,@14467 15440:S55|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f724e616d65283129 15441:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3467| 15442:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3468| 15443:S38|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229 15444:O4|@15445,@4741,@4738,@4739 15445:D3,5956|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01756cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb6089cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b05c4e839b252ff730851ff730ceb05e90b0700005089f85a90ff128b4c2404f6c101740c83f9037d14eb0be940060000f641ff107407b980a27ab2eb6af6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb598b142489cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089faeb05e94405000090ff128b0c24f6c101740c83f9037d14eb0be997030000f641ff107407b980a27ab2eb608b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b54240cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542410f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24148b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b442408a801740583e8027105ff5538ebf68b55008d52e83b55087303ff5520895500c742fc020000008942048b44240c89028b059ce839b28b5c24108d720cc746fc02000000c70618f98cb28b5b04895e048066ffbf89c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897004c70001000000515289da90ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701f8f98cb28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70180698bb2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c41089088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70114fa8cb28b45008d40a03b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70030fa8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3833b03756ff6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb7089cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b0574e839b28b75008d76f43b7508730aeb05e958070000ff5520897500c746fc02000000c706a0fa8cb252ff730c518b4a08894e048066ffbfeb05e982060000508b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897004c70001000000ff7308578b542408ff1289c15889ca90ff128b4c2408f6c101740783f9037d0feb06f641ff107407b980a27ab2eb76f6c101740583e9027105ff5538ebf68b55008d52e83b55087303ff5520895500c742fc02000000894a048b0c24890a8b0d74e839b28b5c24108d720cc746fc02000000c706e4fa8cb28b5b08895e048066ffbf89c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000eb05e92a050000c7400807000000897004c70001000000535289ca9090ff1289c15889ca90ff128b4c240cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb608b54241089cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089fa90ff128b0c24f6c101740783f9037d14eb06f641ff10740cb980a27ab2eb58e98a0300008b542418f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740c83f9057d14eb0be9b0020000f641ff107407b980a27ab2eb5f8b54241cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542420f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24248b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40943b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c74004a4a27ab289088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70010fb8cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7012cfb8cb2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c41489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70148fb8cb28b45008d40a03b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70064fb8cb289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38f7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80a27ab2eb6e89f1f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4f08890b8b0574e839b28b4d008d49f43b4d087303ff5520894d00c741fc02000000c701d4fb8cb28b520c8951048061ffbf89c28b45008d40ec3b4508730aeb05e93d060000ff5520894500c740fc04000000c7400c03000000c7400805000000894804c70001000000ff770c56ff770453ff1289c15889ca90ff128b4c2404f6c101740783f9037d0feb06f641ff107407b980a27ab2eb6af6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5a8b142489cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089faeb05e9fd0400009090ff128b0c24f6c101740c83f9037d14eb0be997030000f641ff107407b980a27ab2eb608b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b54240cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542410f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24148b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b442408a801740583e8027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc020000008942048b44240c89028b059ce839b2515289c3b8ec0a8db289da90ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a80b8db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70110fb8cb2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702d00b8db28b45008d40a03b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f00b8db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c390900000000040170000|@15461,1048575,@3480|30,0,@6514 76,0,@5606 136,0,@4735 190,0,@5606 230,0,@5606 290,0,@4587 337,0,@5606 396,0,@4587 433,0,@5606 496,0,@4582 533,0,@5606 597,0,@4587 674,0,@4587 713,0,@5609 734,0,@5592 753,0,@5611 772,0,@5592 791,0,@5593 840,0,@5592 861,0,@5613 899,0,@5592 918,0,@5593 967,0,@5592 988,0,@5615 1024,0,@5592 1043,0,@5593 1092,0,@5592 1113,0,@5617 1151,0,@5592 1170,0,@5593 1222,0,@5592 1243,0,@5619 1279,0,@5621 1299,0,0 1306,0,0 1313,0,1 1319,0,0 1376,0,@4730 1396,0,@15446 1439,0,1 1446,0,3 1455,0,0 1501,0,@5609 1522,0,@5592 1541,0,@15449 1560,0,@5592 1579,0,@5593 1628,0,@5592 1649,0,@14609 1687,0,@5592 1706,0,@5593 1758,0,@5592 1779,0,@15451 1812,0,@5621 1832,0,0 1839,0,0 1846,0,1 1852,0,0 1869,0,0 1890,0,@5592 1911,0,@15453 1933,0,0 1940,0,0 1947,0,1 1953,0,0 1977,0,@6514 2021,0,@5606 2081,0,@4725 2118,0,@15460 2172,0,1 2179,0,3 2188,0,0 2233,0,@5606 2288,0,@4725 2308,0,@15462 2351,0,1 2365,0,3 2374,0,0 2432,0,@5606 2493,0,@4587 2528,0,@5606 2592,0,@4587 2634,0,@5606 2692,0,@4582 2729,0,@5606 2793,0,@4587 2870,0,@4587 2909,0,@5609 2930,0,@5592 2949,0,@5611 2968,0,@5592 2987,0,@5593 3036,0,@5592 3057,0,@5613 3095,0,@5592 3114,0,@5593 3163,0,@5592 3184,0,@5615 3220,0,@5592 3239,0,@5593 3288,0,@5592 3309,0,@5617 3347,0,@5592 3366,0,@5593 3418,0,@5592 3439,0,@5619 3475,0,@5621 3495,0,0 3502,0,0 3509,0,1 3515,0,0 3532,0,@5609 3553,0,@5592 3572,0,@15463 3591,0,@5592 3610,0,@5593 3659,0,@5592 3678,0,@15465 3714,0,@5592 3733,0,@5593 3785,0,@5592 3806,0,@15467 3839,0,@5621 3859,0,0 3866,0,0 3873,0,1 3879,0,0 3896,0,0 3917,0,@5592 3936,0,@15469 3958,0,0 3965,0,0 3972,0,1 3978,0,0 4008,0,@6514 4055,0,@5606 4112,0,@4725 4142,0,@15476 4192,0,1 4199,0,2 4208,0,0 4253,0,@5606 4293,0,@5606 4353,0,@4587 4401,0,@5606 4460,0,@4587 4497,0,@5606 4560,0,@4582 4597,0,@5606 4661,0,@4587 4738,0,@4587 4777,0,@5609 4798,0,@5592 4817,0,@5611 4836,0,@5592 4855,0,@5593 4904,0,@5592 4925,0,@5613 4963,0,@5592 4982,0,@5593 5031,0,@5592 5052,0,@5615 5088,0,@5592 5107,0,@5593 5156,0,@5592 5177,0,@5617 5215,0,@5592 5234,0,@5593 5286,0,@5592 5307,0,@5619 5343,0,@5621 5363,0,0 5370,0,0 5377,0,1 5383,0,0 5440,0,@4730 5449,0,@15494 5493,0,@5609 5514,0,@5592 5533,0,@15501 5552,0,@5592 5571,0,@5593 5620,0,@5592 5641,0,@15463 5679,0,@5592 5698,0,@5593 5750,0,@5592 5769,0,@15503 5802,0,@5621 5822,0,0 5829,0,0 5836,0,1 5842,0,0 5859,0,0 5880,0,@5592 5899,0,@15505 5921,0,0 5928,0,0 5935,0,1 5941,0,0 15446:D3,128|3b650c7303ff55248b0d74e839b28b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703acf98cb28b52048953048063ffbf89c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000895804c700010000005289ca9090ff1289c15889caff22909090000000007c000000|@5599,1048575,@3471|10,0,@4725 40,0,@15447 83,0,1 90,0,3 99,0,0 15447:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@15448,1048575,@3470| 15448:S21|7072696e742d636f72654465636c61726174696f6e 15449:O2|3,@15450 15450:S6|76617273203d 15451:O2|3,@15452 15452:S5|646563203d 15453:O5|0,0,0,@15455,@15454 15454:O2|@15458,0 15455:O2|@15456,0 15456:O2|0,@15457 15457:O5|@14950,187,187,0,0 15458:O2|3,@15459 15459:S8|436f72654c616e67 15460:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@15461,1048575,@3472| 15461:S15|7072696e742d737472756374446563 15462:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@15461,1048575,@3473| 15463:O2|3,@15464 15464:S6|6c696e65203d 15465:O2|3,@15466 15466:S6|64656373203d 15467:O2|3,@15468 15468:S6|626f6479203d 15469:O5|0,0,0,@15471,@15470 15470:O2|@15474,0 15471:O2|@15472,0 15472:O2|0,@15473 15473:O5|@14950,194,194,0,0 15474:O2|3,@15475 15475:S8|4c6f63616c646563 15476:D3,3488|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb618b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b4b10890e8b3dace839b2525089f089fa909090ff128b0c248b5104f6c201740783fa037d14eb06f642ff10740cbb80a27ab2eb6de9be0c00008b19f6c201740583ea027105ff5538ebf6f6c201740783fa017d0feb06f642ff107407ba80a27ab2eb5e8b3389d7f7c701000000740583ef027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008979048b7e0489398b3564e039b2eb05e9d50b00005052ff3389c889f290ff128b4c2404f6c101740c83f9037d14eb0be994030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70240a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008950049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b4424048b5004f6c201740783fa057d0feb06f642ff107407bb80a27ab2eb5f8b18f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530489168b3d3ce039b25189f089fa90ff128b4c24088b5104f6c201740783fa077d14eb06f642ff10740cbb80a27ab2eb6ee9d40600008b19f6c201740583ea027105ff5538ebf6f6c201740783fa017d0feb06f642ff107407ba80a27ab2eb618b731489d7f7c701000000740583ef027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008979048b7e0489398b3564e039b2eb05e9eb0500005052ff731489c889f29090ff128b4c2404f6c101740c83f9037d14eb0be994030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70240a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008950049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b44240c8b5004f6c201740783fa097d0feb06f642ff107407bb80a27ab2eb708b18f6c201740583ea027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc020000008956048b530c89168b3d9ce839b25156b888098db289fa90ff1289c15889ca90ff128b4c24108b118b5904f6c301740583eb027105ff5538ebf68b75008d76f43b7508730aeb05e9d9000000ff5520897500c746fc02000000895e048b5a08891e8b7c24148b7f048b3f5089f089fa90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701740a8db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c703900a8db2eb01518b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c703ac0a8db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c70310337bb2eb01518b45008d40dc3b45087303ff5520894500c740fc020000008958049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d590cc743fc02000000894b04c70310fb8cb2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000895804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702cc0a8db28b45008d40dc3b45087303ff5520894500c740fc020000008950049090c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090000000009c0d0000|@5008,1048575,@3477|30,0,@5606 87,0,@4732 127,0,@5606 174,0,@5606 236,0,@4587 286,0,@5606 344,0,@4587 381,0,@5606 444,0,@4582 481,0,@5606 545,0,@4587 622,0,@4587 661,0,@5609 682,0,@5592 701,0,@5611 720,0,@5592 739,0,@5593 788,0,@5592 809,0,@5613 847,0,@5592 866,0,@5593 915,0,@5592 936,0,@5615 972,0,@5592 991,0,@5593 1040,0,@5592 1061,0,@5617 1099,0,@5592 1118,0,@5593 1170,0,@5592 1189,0,@5619 1227,0,@5621 1247,0,0 1254,0,0 1261,0,1 1267,0,0 1297,0,@5606 1354,0,@4582 1392,0,@5606 1439,0,@5606 1502,0,@4587 1554,0,@5606 1612,0,@4587 1649,0,@5606 1712,0,@4582 1749,0,@5606 1813,0,@4587 1890,0,@4587 1929,0,@5609 1950,0,@5592 1969,0,@5611 1988,0,@5592 2007,0,@5593 2056,0,@5592 2077,0,@5613 2115,0,@5592 2134,0,@5593 2183,0,@5592 2204,0,@5615 2240,0,@5592 2259,0,@5593 2308,0,@5592 2329,0,@5617 2367,0,@5592 2386,0,@5593 2438,0,@5592 2457,0,@5619 2495,0,@5621 2515,0,0 2522,0,0 2529,0,1 2535,0,0 2565,0,@5606 2622,0,@4730 2629,0,@15477 2753,0,@5609 2774,0,@5592 2793,0,@15486 2812,0,@5592 2831,0,@5593 2880,0,@5592 2899,0,@15488 2935,0,@5592 2954,0,@5593 3003,0,@5592 3022,0,@15490 3058,0,@5592 3077,0,@5593 3126,0,@5592 3145,0,@6517 3183,0,@5592 3202,0,@5593 3251,0,@5592 3270,0,@15463 3306,0,@5592 3325,0,@5593 3377,0,@5592 3396,0,@15492 3431,0,@5621 3453,0,0 3460,0,0 3467,0,1 3473,0,0 15477:O4|0,@15478,3,1 15478:O1|@15479 15479:D3,44|3b650c7303ff55248b0d4ce039b250b8e4098db289ca9090ff1289c15889caff229090900000000028000000|@12247,1048575,@3476|10,0,@4584 16,0,@15480 15480:O4|0,@15481,3,1 15481:O1|@15482 15482:D3,28|3b650c7303ff55248b0dece839b289caff2290900000000018000000|@15485,1048575,@3475|10,0,@4740 15483:O1|@15484 15484:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3474|1,0,@5227 15485:S16|7072696e742d73747275637456616c73 15486:O2|3,@15487 15487:S7|76616c7565203d 15488:O2|3,@15489 15489:S8|76616c526566203d 15490:O2|3,@15491 15491:S9|6e616d654c6f63203d 15492:O2|3,@15493 15493:S9|68617665536967203d 15494:O4|0,@15495,3,1 15495:O1|@15496 15496:D3,44|3b650c7303ff55248b0d74e839b250b8480b8db289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3479|10,0,@4725 16,0,@15497 15497:O4|0,@15498,3,1 15498:O1|@15499 15499:D3,28|3b650c7303ff55248b0d6ce839b289caff2290900000000018000000|@15500,1048575,@3478|10,0,@4724 15500:S12|7072696e742d747970654964 15501:O2|3,@15502 15502:S17|74797065496473466f724465627567203d 15503:O2|3,@15504 15504:S10|62696e64696e6773203d 15505:O5|0,0,0,@15507,@15506 15506:O2|@15510,0 15507:O2|@15508,0 15508:O2|0,@15509 15509:O5|@14950,180,180,0,0 15510:O2|3,@15511 15511:S12|537472756374757265446563 15512:O1|@15513 15513:D3,1748|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b10833a017569f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980977ab2eb7289cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d3ce039b2ff72085189f089faeb05e94e010000ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e96e000000894a0459890a8b0dfce839b25089d089ca9090ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab289c88d490cc741fc020000008941045889018b45008d40a03b45087303ff5520894500c740fc02000000894804c700b89a7ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70080138db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3833a03755cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b35ece839b289d889f2ff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f0138db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b8d8327bb2c38b30833e05755cf6c301740583eb027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc02000000895f048b5e04891f8b0d8ce839b289f889caff128338017558f640100175578b4810f641040175628b11833a07751f837a0451eb05e9210100007468817a04f70000007464817a04b700000074608b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab28903eb0ae971000000e9680000008d730cc746fc02000000895e04eb05e954000000c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70064148db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7804f7c701000000740783ff037d0eeb06f647ff107406b8d8327bb2c38b08f7c701000000740583ef027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000897a048b7904893a8b1d04e939b289d089da909090ff12833801755bf6401001755a8b4810f641040175568b11833a077518837a04517466817a04f70000007462817a04b7000000745e8b5d008d5bc43b5d087303ff5520895d00c743fc02000000c74304e4a47ab289038d730cc746fc02000000eb0fe965000000e95c000000e957000000895e04c706f0a47ab28d5e0cc743fc02000000897304eb0fe93a000000e935000000e930000000c703b89a7ab28d730cc746fc05000000895e10c7460c01000000c7460803000000c7460407000000c70601000000eb0689c6eb0289c68b45008d40c43b45087303ff5520894500c740fc02000000c740040100000089308d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70000158db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000d0060000|@15448,1048575,@3483|30,0,@6514 76,0,@5580 133,0,@4582 209,0,@4742 249,0,@5590 270,0,@5592 289,0,@5593 340,0,@5594 360,0,0 367,0,0 374,0,1 380,0,0 397,0,0 418,0,@5592 439,0,@15516 461,0,0 468,0,0 475,0,1 481,0,0 505,0,@6514 564,0,@4740 617,0,123 626,0,91 659,0,@5642 699,0,@5643 735,0,@5594 755,0,0 762,0,1 769,0,3 775,0,0 814,0,0 835,0,@5592 854,0,@15523 876,0,0 883,0,0 890,0,1 896,0,0 923,0,@6514 984,0,@4728 1037,0,123 1046,0,91 1079,0,@5642 1119,0,@5643 1155,0,@5594 1175,0,0 1182,0,1 1189,0,3 1195,0,0 1234,0,0 1255,0,@5592 1274,0,@15530 1296,0,0 1303,0,0 1310,0,1 1316,0,0 1346,0,@6514 1405,0,@4743 1454,0,123 1463,0,91 1496,0,@5642 1534,0,@5643 1570,0,@5594 1590,0,0 1597,0,1 1604,0,3 1610,0,0 1649,0,0 1670,0,@5592 1691,0,@15539 1713,0,0 1720,0,0 1727,0,1 1733,0,0 15514:O1|@15515 15515:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3481|1,0,@5227 15516:O5|0,0,0,@15518,@15517 15517:O2|@15521,0 15518:O2|@15519,0 15519:O2|0,@15520 15520:O5|@14950,114,114,0,0 15521:O2|3,@15522 15522:S7|436f7265466978 15523:O5|0,0,0,@15525,@15524 15524:O2|@15528,0 15525:O2|@15526,0 15526:O2|0,@15527 15527:O5|@14950,115,115,0,0 15528:O2|3,@15529 15529:S10|436f7265537472756374 15530:O5|0,0,0,@15532,@15531 15531:O2|@15535,0 15532:O2|@15533,0 15533:O2|0,@15534 15534:O5|@14950,113,113,0,0 15535:O2|3,@15536 15536:S8|436f726554797065 15537:O1|@15538 15538:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3482|1,0,@5227 15539:O5|0,0,0,@15541,@15540 15540:O2|@15544,0 15541:O2|@15542,0 15542:O2|0,@15543 15543:O5|@14950,112,112,0,0 15544:O2|3,@15545 15545:S9|436f726556616c7565 15546:O4|@15547,@4744,@4739,@4738 15547:D3,12736|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01756cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5c8b730489cff7c701000000740583ef027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008978048b3e89388b72088b3651ff73045289f2eb05e9d40f000090ff128b4c2408f6c101740c83f9037d14eb0be90d0f0000f641ff107407b980a27ab2eb5e8b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b359ce839b25053b85c478db289f29090ff1289c15889ca90ff128b4c240cf6c101740c83f9057d14eb0be91f0e0000f641ff107407b980a27ab2eb6b8b542408f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb628b5a1489cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b1d64e039b2eb05e9250d00005051ff721489f889da909090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b442410a801740783f8077d0feb06f640ff107407b880a27ab2eb708b54240ca801740583e8027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc020000008943048b421c89038b359ce839b28b7c24088b45008d40f43b45087303ff5520894500c740fc020000009090c700d8498db28b7f048978048060ffbf89c28b45008d40eceb05e9140800003b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000895004c70001000000515389f2909090ff1289c15889ca90ff128b4c2414f6c101740783f9097d0feb06f641ff107407b980a27ab2eb608b542410f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a04890b8b353ce039b25089d889f2909090ff128b4c2418f6c101740783f90b7d14eb06f641ff10740cb980a27ab2eb70e9dd0600008b542414f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb628b5a1889cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b1d64e039b2eb05e9f00500005051ff721889f889da909090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b44241ca801740783f80d7d0feb06f640ff107407b880a27ab2eb6f8b542418a801740583e8027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc020000008943048b420c89038b359ce839b25153b8e44b8db289f2ff1289c15889ca90ff128b4c241c8b542420f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9e2000000ff5520895d00c743fc020000008953048b4910890b8b0d9ce839b25053b8284e8db289ca90ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701900a8db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700144f8db2eb01518b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac0a8db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70110337bb2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700304f8db2eb01518b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c700ac9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701584f8db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701784f8db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701944f8db28b45008d40a03b45087303ff5520894500c740fc020000008948049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700b04f8db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38833f03756bf7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80a27ab2eb5c89f1f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4f04890b8b42088b0052ff770c56eb05e9fb060000ff77085089d85a90ff128b4c2404f6c101740c83f9037d14eb0be92d060000f641ff107407b980a27ab2eb76f6c101740583e9027105ff5538ebf68b55008d52e83b55087303ff5520895500c742fc02000000894a048b0c24890a8b0d74e839b28b5c240c8d720cc746fc02000000c70624508db28b5b0c895e048066ffbf89c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000eb05e929050000c7400807000000897004c70001000000535289ca90ff1289c15889ca90ff128b4c2408f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb608b54240c89cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089fa90ff128b0c24f6c101740783f9037d14eb06f641ff10740cb980a27ab2eb58e98a0300008b542414f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740c83f9057d14eb0be9b0020000f641ff107407b980a27ab2eb5f8b542418f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b54241cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24208b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40943b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c74004a4a27ab289088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70010fb8cb28d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7012cfb8cb2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c41089088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70248fb8cb28b45008d40a03b45087303ff5520894500c740fc020000008950049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70050508db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c3833f05756cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5f8b5f0489cef7c601000000740583ee027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008970048b730489308b1d1ce939b25251ff7704eb05e9db09000089da9090ff128b4c2404f6c101740c83f9037d14eb0be911090000f641ff107407b980a27ab2eb738b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a14890b8b359ce839b28b7c24088b4d008d49f43b4d087303ff5520894d00c741fc02000000c701ec508db28b7f048979048061ffbf89c28b45008d40ec3b4508730aeb05e90e080000ff5520894500c740fc04000000c7400c03000000c7400807000000894804c70001000000525389f2ff1289c15889ca90ff128b4c2408f6c101740783f9057d0feb06f641ff107407b980a27ab2eb608b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b35ace839b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb63e9db0600008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a10890b8b359ce839b25053b8f8528db289f29090ff1289c15889ca90ff128b4c2410f6c101740c83f9097d14eb0be9fb050000f641ff107407b980a27ab2eb6b8b54240cf6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb628b5a0c89cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b1d64e039b2eb05e9ff0400005051ff720c89f889da909090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b4424108b542414f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc020000008953048b0089038b4424188b40088b005189c289d890ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7013c558db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70158558db2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70174558db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70194558db2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701b0558db2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701d8558db28b45008d40a03b45087303ff5520894500c740fc020000008948049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700f4558db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5804f6c301740783fb037d0eeb06f643ff107406b8d8327bb2c38b30833e07756ff6c301740583eb027105ff5538ebf6f6c301740783fb017d0feb06f643ff107407ba80a27ab2eb7089dff7c701000000740583ef027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008979048b7e0489398b0574e839b28b7d008d7ff43b7d08730aeb05e969070000ff5520897d00c747fc02000000c7076c568db252ff760c538b5a0c895f048067ffbfeb05e993060000508b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897804c70001000000ff7608518b5424089090ff1289c15889ca90ff128b4c2408f6c101740783f9037d0feb06f641ff107407b980a27ab2eb6af6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb5a8b142489cbf6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000895e048b5a04891e8b3d64e039b2505189f089faeb05e9450500009090ff128b0c24f6c101740c83f9037d14eb0be997030000f641ff107407b980a27ab2eb608b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2404f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b54240cf6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c2408f6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542410f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c24148b54240cf6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b44240ca801740583e8027105ff5538ebf68b55008d52e83b55087303ff5520895500c742fc020000008942048b44241089028b059ce839b28b5c24148d720cc746fc02000000c70698568db28b5b04895e048066ffbf89c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400807000000897004c70001000000515289da90ff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a4588db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70180698bb2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c41489088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702c8588db28b45008d40a03b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700e4588db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b5004f6c201740783fa037d0eeb06f642ff107406b8d8327bb2c38b38f6c201740583ea027105ff5538ebf6f6c201740783fa017d0feb06f642ff107407ba80a27ab2eb6c89d1f6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb658b5f0c89cef7c601000000740583ee027105ff5538ebf68b45008d40f43b45087303ff5520894500c740fc020000008970048b730489308b1d64e039b2ff7708eb05e9e905000052ff770451ff770c89da9090ff128b4c2404f6c101740c83f9037d14eb0be996030000f641ff107407b980a27ab2eb5f8b1424f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a0c890b8b3564e039b25089d889f2909090ff128b4c2408f6c101740783f9057d14eb06f641ff10740cb980a27ab2eb64e9a30200008b542404f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b353ce039b25089d889f2909090ff128b4c240cf6c101740783f9077d14eb06f641ff10740cb980a27ab2eb6be9c20100008b542408f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4a08890b8b3564e039b25089d889f29090ff128b4c240c8b542410f6c201740583ea027105ff5538ebf68b5d008d5bf43b5d08730aeb05e9d8000000ff5520895d00c743fc020000008953048b4910890b8b0d64e039b25089d889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701bca27ab28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701e0a27ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70100a37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c7011ca37ab2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40889088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70140a37ab2eb07ff770852ff77048b45008d40dc3b45087303ff5520894500c740fc020000008948049090c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008b442404a801740783f8037d0feb06f640ff107407b880a27ab2eb73a801740583e8027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc020000008942048b042489028b053ce039b25189c389d089da9090ff128b4c2408f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b4c240ceb05e9ce000000890a8b0d9ce839b25052b858598db289caff1289c15889ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701900a8db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70010337bb2eb01518b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700ac9a7ab28d480cc741fc020000008941045883c40c89018b45008d40e83b45087303ff5520894500c740fc02000000894804c7009c9a7ab28d500cc742fc02000000894204c70280698bb28b45008d40a03b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c700005a8db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000bc310000|@15656,1048575,@3504|30,0,@6514 76,0,@5606 186,0,@5606 245,0,@4730 252,0,@15548 298,0,@5606 342,0,@5606 405,0,@4587 458,0,@5606 516,0,@4587 553,0,@5606 616,0,@4582 653,0,@5606 717,0,@4587 794,0,@4587 833,0,@5609 854,0,@5592 873,0,@5611 892,0,@5592 911,0,@5593 960,0,@5592 981,0,@5613 1019,0,@5592 1038,0,@5593 1087,0,@5592 1108,0,@5615 1144,0,@5592 1163,0,@5593 1212,0,@5592 1233,0,@5617 1271,0,@5592 1290,0,@5593 1342,0,@5592 1363,0,@5619 1399,0,@5621 1419,0,0 1426,0,0 1433,0,1 1439,0,0 1465,0,@5606 1523,0,@4730 1559,0,@15558 1609,0,1 1616,0,3 1625,0,0 1669,0,@5606 1728,0,@4582 1765,0,@5606 1814,0,@5606 1877,0,@4587 1930,0,@5606 1988,0,@4587 2025,0,@5606 2088,0,@4582 2125,0,@5606 2189,0,@4587 2266,0,@4587 2305,0,@5609 2326,0,@5592 2345,0,@5611 2364,0,@5592 2383,0,@5593 2432,0,@5592 2453,0,@5613 2491,0,@5592 2510,0,@5593 2559,0,@5592 2580,0,@5615 2616,0,@5592 2635,0,@5593 2684,0,@5592 2705,0,@5617 2743,0,@5592 2762,0,@5593 2814,0,@5592 2835,0,@5619 2871,0,@5621 2891,0,0 2898,0,0 2905,0,1 2911,0,0 2937,0,@5606 2995,0,@4730 3002,0,@15560 3082,0,@4730 3089,0,@15566 3133,0,@5609 3154,0,@5592 3173,0,@15488 3192,0,@5592 3211,0,@5593 3260,0,@5592 3279,0,@15575 3315,0,@5592 3334,0,@5593 3383,0,@5592 3402,0,@15490 3438,0,@5592 3457,0,@5593 3506,0,@5592 3527,0,@6517 3563,0,@5592 3582,0,@5593 3631,0,@5592 3650,0,@15577 3686,0,@5592 3707,0,@5593 3756,0,@5592 3775,0,@15579 3811,0,@5592 3830,0,@5593 3879,0,@5592 3900,0,@15581 3936,0,@5592 3955,0,@5593 4007,0,@5592 4028,0,@15583 4063,0,@5621 4083,0,0 4090,0,0 4097,0,1 4103,0,0 4120,0,0 4141,0,@5592 4160,0,@15585 4182,0,0 4189,0,0 4196,0,1 4202,0,0 4232,0,@6514 4284,0,@5606 4394,0,@5606 4449,0,@4725 4469,0,@15592 4512,0,1 4526,0,3 4535,0,0 4592,0,@5606 4653,0,@4587 4688,0,@5606 4752,0,@4587 4794,0,@5606 4852,0,@4582 4889,0,@5606 4953,0,@4587 5030,0,@4587 5069,0,@5609 5090,0,@5592 5109,0,@5611 5128,0,@5592 5147,0,@5593 5196,0,@5592 5217,0,@5613 5255,0,@5592 5274,0,@5593 5323,0,@5592 5344,0,@5615 5380,0,@5592 5399,0,@5593 5448,0,@5592 5469,0,@5617 5507,0,@5592 5526,0,@5593 5578,0,@5592 5599,0,@5619 5635,0,@5621 5655,0,0 5662,0,0 5669,0,1 5675,0,0 5692,0,@5609 5713,0,@5592 5732,0,@15463 5751,0,@5592 5770,0,@5593 5819,0,@5592 5838,0,@15465 5874,0,@5592 5893,0,@5593 5945,0,@5592 5964,0,@15467 5999,0,@5621 6019,0,0 6026,0,0 6033,0,1 6039,0,0 6056,0,0 6077,0,@5592 6096,0,@15593 6118,0,0 6125,0,0 6132,0,1 6138,0,0 6165,0,@6514 6209,0,@5606 6272,0,@4746 6322,0,@5606 6380,0,@4730 6414,0,@15602 6464,0,1 6471,0,3 6480,0,0 6521,0,@5606 6580,0,@4732 6617,0,@5606 6681,0,@4730 6688,0,@15604 6734,0,@5606 6778,0,@5606 6841,0,@4587 6894,0,@5606 6952,0,@4587 6989,0,@5606 7052,0,@4582 7089,0,@5606 7153,0,@4587 7230,0,@4587 7269,0,@5609 7290,0,@5592 7309,0,@5611 7328,0,@5592 7347,0,@5593 7396,0,@5592 7417,0,@5613 7455,0,@5592 7474,0,@5593 7523,0,@5592 7544,0,@5615 7580,0,@5592 7599,0,@5593 7648,0,@5592 7669,0,@5617 7707,0,@5592 7726,0,@5593 7778,0,@5592 7799,0,@5619 7835,0,@5621 7855,0,0 7862,0,0 7869,0,1 7875,0,0 7977,0,@5609 7998,0,@5592 8017,0,@15610 8036,0,@5592 8055,0,@5593 8104,0,@5592 8125,0,@15612 8163,0,@5592 8182,0,@5593 8231,0,@5592 8252,0,@15614 8288,0,@5592 8307,0,@5593 8356,0,@5592 8377,0,@15616 8415,0,@5592 8434,0,@5593 8483,0,@5592 8504,0,@15618 8540,0,@5592 8559,0,@5593 8611,0,@5592 8632,0,@15620 8667,0,@5621 8687,0,0 8694,0,0 8701,0,1 8707,0,0 8724,0,0 8745,0,@5592 8764,0,@15622 8786,0,0 8793,0,0 8800,0,1 8806,0,0 8833,0,@6514 8879,0,@5606 8939,0,@4725 8976,0,@15629 9030,0,1 9037,0,3 9046,0,0 9093,0,@5606 9133,0,@5606 9193,0,@4587 9241,0,@5606 9300,0,@4587 9337,0,@5606 9400,0,@4582 9437,0,@5606 9501,0,@4587 9578,0,@4587 9617,0,@5609 9638,0,@5592 9657,0,@5611 9676,0,@5592 9695,0,@5593 9744,0,@5592 9765,0,@5613 9803,0,@5592 9822,0,@5593 9871,0,@5592 9892,0,@5615 9928,0,@5592 9947,0,@5593 9996,0,@5592 10017,0,@5617 10055,0,@5592 10074,0,@5593 10126,0,@5592 10147,0,@5619 10183,0,@5621 10203,0,0 10210,0,0 10217,0,1 10223,0,0 10280,0,@4730 10300,0,@15630 10343,0,1 10350,0,3 10359,0,0 10405,0,@5609 10426,0,@5592 10445,0,@15632 10464,0,@5592 10483,0,@5593 10532,0,@5592 10553,0,@14609 10591,0,@5592 10610,0,@5593 10662,0,@5592 10681,0,@15634 10714,0,@5621 10734,0,0 10741,0,0 10748,0,1 10754,0,0 10771,0,0 10792,0,@5592 10811,0,@15636 10833,0,0 10840,0,0 10847,0,1 10853,0,0 10880,0,@6514 10921,0,@5606 10963,0,@5606 11026,0,@4587 11082,0,@5606 11140,0,@4587 11177,0,@5606 11240,0,@4582 11277,0,@5606 11341,0,@4587 11418,0,@4587 11457,0,@5609 11478,0,@5592 11497,0,@5611 11516,0,@5592 11535,0,@5593 11584,0,@5592 11605,0,@5613 11643,0,@5592 11662,0,@5593 11711,0,@5592 11732,0,@5615 11768,0,@5592 11787,0,@5593 11836,0,@5592 11857,0,@5617 11895,0,@5592 11914,0,@5593 11966,0,@5592 11987,0,@5619 12031,0,@5621 12051,0,0 12058,0,0 12065,0,1 12071,0,0 12097,0,@5606 12151,0,@4582 12227,0,@4730 12234,0,@15643 12277,0,@5609 12298,0,@5592 12317,0,@15488 12336,0,@5592 12355,0,@5593 12404,0,@5592 12423,0,@6517 12459,0,@5592 12478,0,@5593 12530,0,@5592 12549,0,@14609 12582,0,@5621 12602,0,0 12609,0,0 12616,0,1 12622,0,0 12639,0,0 12660,0,@5592 12679,0,@15649 12701,0,0 12708,0,0 12715,0,1 12721,0,0 15548:O4|0,@15549,3,1 15549:O1|@15550 15550:D3,44|3b650c7303ff55248b0d74e839b250b8b8478db289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3485|10,0,@4725 16,0,@15551 15551:O4|0,@15552,2,2 15552:O1|@15553 15553:D3,440|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb728b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b356ce839b25089d889f290ff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e9c8000000895e048b5a04891e8b3d6ce839b25089f089fa9090ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a0498db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702bc498db28b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39000000000b4010000|@5008,1048575,@3484|30,0,@5606 86,0,@4724 165,0,@4724 205,0,@5609 226,0,@5592 245,0,@15554 264,0,@5592 283,0,@5593 332,0,@5592 351,0,@15556 384,0,@5621 406,0,0 413,0,0 420,0,1 426,0,0 15554:O2|3,@15555 15555:S8|736f75726365203d 15556:O2|3,@15557 15557:S6|64657374203d 15558:D3,128|3b650c7303ff55248b0d74e839b28b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7036c4a8db28b52048953048063ffbf89c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c05000000c7400805000000895804c700010000005289ca9090ff1289c15889caff22909090000000007c000000|@5599,1048575,@3487|10,0,@4725 40,0,@15559 83,0,2 90,0,2 99,0,0 15559:D3,356|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80977ab2eb728b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b0b890e8b3d64e039b2525089f089faff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e972000000895e048b5a04891e8b3c248b7f0483c4048b3f5089f089fa90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000060010000|@5008,1048575,@3486|30,0,@5580 86,0,@4587 209,0,@5590 230,0,@5592 249,0,@5593 298,0,@5594 320,0,0 327,0,0 334,0,1 340,0,0 15560:O4|0,@15561,3,1 15561:O1|@15562 15562:D3,44|3b650c7303ff55248b0d74e839b250b8404c8db289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3489|10,0,@4725 16,0,@15563 15563:O4|0,@15564,2,2 15564:O1|@15565 15565:D3,440|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb728b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b356ce839b25089d889f290ff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e9c8000000895e048b5a04891e8b3d6ce839b25089f089fa9090ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a0498db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702bc498db28b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39000000000b4010000|@5008,1048575,@3488|30,0,@5606 86,0,@4724 165,0,@4724 205,0,@5609 226,0,@5592 245,0,@15554 264,0,@5592 283,0,@5593 332,0,@5592 351,0,@15556 384,0,@5621 406,0,0 413,0,0 420,0,1 426,0,0 15566:O4|0,@15567,3,1 15567:O1|@15568 15568:D3,44|3b650c7303ff55248b0d4ce039b250b8844e8db289ca9090ff1289c15889caff229090900000000028000000|@12247,1048575,@3492|10,0,@4584 16,0,@15569 15569:O4|0,@15570,3,1 15570:O1|@15571 15571:D3,28|3b650c7303ff55248b0d14e939b289caff2290900000000018000000|@15574,1048575,@3491|10,0,@4745 15572:O1|@15573 15573:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3490|1,0,@5227 15574:S14|7072696e742d66756e63746f7273 15575:O2|3,@15576 15576:S8|726573496473203d 15577:O2|3,@15578 15578:S17|6d61746368546f417267756d656e74203d 15579:O2|3,@15580 15580:S9|66756c6c4c6f63203d 15581:O2|3,@15582 15582:S8|617267496473203d 15583:O2|3,@15584 15584:S5|617267203d 15585:O5|0,0,0,@15587,@15586 15586:O2|@15590,0 15587:O2|@15588,0 15588:O2|0,@15589 15589:O5|@14950,150,150,0,0 15590:O2|3,@15591 15591:S11|46756e63746f724170706c 15592:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@15461,1048575,@3493| 15593:O5|0,0,0,@15595,@15594 15594:O2|@15598,0 15595:O2|@15596,0 15596:O2|0,@15597 15597:O5|@14950,162,162,0,0 15598:O2|3,@15599 15599:S6|4c6574446563 15600:O1|@15601 15601:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3494|1,0,@5227 15602:D3,128|3b650c7303ff55248b0d74e839b28b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70380518db28b52048953048063ffbf89c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c05000000c7400805000000895804c700010000005289ca9090ff1289c15889caff22909090000000007c000000|@5599,1048575,@3496|10,0,@4725 40,0,@15603 83,0,2 90,0,2 99,0,0 15603:D3,356|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80977ab2eb728b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b0b890e8b3d64e039b2525089f089faff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e972000000895e048b5a04891e8b3c248b7f0483c4048b3f5089f089fa90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000060010000|@5008,1048575,@3495|30,0,@5580 86,0,@4587 209,0,@5590 230,0,@5592 249,0,@5593 298,0,@5594 320,0,0 327,0,0 334,0,1 340,0,0 15604:O4|0,@15605,3,1 15605:O1|@15606 15606:D3,44|3b650c7303ff55248b0d74e839b250b854538db289ca9090ff1289c15889caff229090900000000028000000|@5599,1048575,@3498|10,0,@4725 16,0,@15607 15607:O4|0,@15608,2,2 15608:O1|@15609 15609:D3,440|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80a27ab2eb728b10f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b8b356ce839b25089d889f290ff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e9c8000000895e048b5a04891e8b3d6ce839b25089f089fa9090ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a0498db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702bc498db28b45008d40dc3b45087303ff5520894500c740fc02000000895004c70060a37ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39000000000b4010000|@5008,1048575,@3497|30,0,@5606 86,0,@4724 165,0,@4724 205,0,@5609 226,0,@5592 245,0,@15554 264,0,@5592 283,0,@5593 332,0,@5592 351,0,@15556 384,0,@5621 406,0,0 413,0,0 420,0,1 426,0,0 15610:O2|3,@15611 15611:S5|737472203d 15612:O2|3,@15613 15613:S8|7369674c6f63203d 15614:O2|3,@15615 15615:S11|6f7061717565496473203d 15616:O2|3,@15617 15617:S8|6f7061717565203d 15618:O2|3,@15619 15619:S19|6d61746368546f436f6e73747261696e74203d 15620:O2|3,@15621 15621:S6|63736967203d 15622:O5|0,0,0,@15624,@15623 15623:O2|@15627,0 15624:O2|@15625,0 15625:O2|0,@15626 15626:O5|@14950,169,169,0,0 15627:O2|3,@15628 15628:S13|536967436f6e73747261696e74 15629:D3,24|3b650c7303ff55248b52048b12ff22900000000014000000|@15461,1048575,@3499| 15630:D3,128|3b650c7303ff55248b0d74e839b28b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7032c578db28b52048953048063ffbf89c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c05000000c7400805000000895804c700010000005289ca9090ff1289c15889caff22909090000000007c000000|@5599,1048575,@3501|10,0,@4725 40,0,@15631 83,0,2 90,0,2 99,0,0 15631:D3,356|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80977ab2eb728b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b0b890e8b3d64e039b2525089f089faff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e972000000895e048b5a04891e8b3c248b7f0483c4048b3f5089f089fa90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000060010000|@5008,1048575,@3500|30,0,@5580 86,0,@4587 209,0,@5590 230,0,@5592 249,0,@5593 298,0,@5594 320,0,0 327,0,0 334,0,1 340,0,0 15632:O2|3,@15633 15633:S15|6d61746368546f526573756c74203d 15634:O2|3,@15635 15635:S7|616c697374203d 15636:O5|0,0,0,@15638,@15637 15637:O2|@15641,0 15638:O2|@15639,0 15639:O2|0,@15640 15640:O5|@14950,143,143,0,0 15641:O2|3,@15642 15642:S9|537472756374446563 15643:O4|0,@15644,3,1 15644:O1|@15645 15645:D3,44|3b650c7303ff55248b0d4ce039b250b8b4598db289ca9090ff1289c15889caff229090900000000028000000|@12247,1048575,@3503|10,0,@4584 16,0,@15646 15646:O4|0,@15647,3,1 15647:O1|@15648 15648:D3,28|3b650c7303ff55248b0dece839b289caff2290900000000018000000|@15485,1048575,@3502|10,0,@4740 15649:O5|0,0,0,@15651,@15650 15650:O2|@15654,0 15651:O2|@15652,0 15652:O2|0,@15653 15653:O5|@14950,136,136,0,0 15654:O2|3,@15655 15655:S14|5374727563747572654964656e74 15656:S17|7072696e742d73747275637456616c7565 15657:O3|@15658,@4744,@4723 15658:D3,2044|3b650c7303ff55248b4804f6c101740783f9037d0eeb06f641ff107406b8d8327bb2c38b18833b01756ff6c101740583e9027105ff5538ebf6f6c101740783f9017d0feb06f641ff107407b980a27ab2eb7089cef7c601000000740583ee027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008977048b730489378b0574e839b28b75008d76f43b7508730aeb05e900020000ff5520897500c746fc02000000c706b4628db28b52048956048066ffbf89c28b4500eb05e92a0100008d40ec3b45087303ff5520894500c740fc04000000c7400c05000000c7400805000000897004c70001000000ff73085157ff1289c15889ca90ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a0459890a8b0dece839b25089d089ca90ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c7012c648db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c70154648db28b45008d40a03b45087303ff5520894500c740fc02000000894804c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70078648db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c38b7004f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c38b38833f03756bf7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80a27ab2eb7389f2f6c201740583ea027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008951048b570489118b1dace839b2ff770856eb05e9ab01000089c889da90ff1259f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e9c6000000894a0459890a8b0d64e039b25089d089ca9090ff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701f0648db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c70210658db28b45008d40a03b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc020000008948049090c70030658db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3f7c601000000740783fe037d0eeb06f646ff107406b8d8327bb2c3f7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d0feb06f646ff107407ba80a27ab2eb6089f1f6c101740583e9027105ff5538ebf68b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b4f04890b8b52088b12ff770856ff770c89d89090ff128b4c2404f6c101740783f9037d14eb06f641ff10740cb980a27ab2eb70e9b9010000f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000894a048b0c24890a8b0d04e939b25089d089ca9090ff128b4c2408f6c101740583e9027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000eb05e9cb000000894a048b4c240c890a8b0dbce839b25089d089caff128b4d008d49b83b4d087303ff5520894d00c741fc02000000c74104a4a27ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a4658db28d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045989088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab289c88d490cc741fc02000000894104c701c4658db2eb01508b45008d40dc3b45087303ff5520894500c740fc020000008948049090c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d410cc740fc020000008948045983c40c89088b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c7019c9a7ab28d510cc742fc02000000894a04c702e8658db28b45008d40a03b45087303ff5520894500c740fc02000000895004c70060a37ab28d480cc741fc05000000894110c7410c01000000c7410801000000c7410403000000c701010000008d4118c740fc02000000c740040100000089088d480cc741fc02000000894104c7019c9a7ab28d410cc740fc02000000894804c70008668db289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c3909000000000f8070000|@15695,1048575,@3506|30,0,@6514 76,0,@5606 136,0,@4725 173,0,@15659 223,0,2 230,0,2 239,0,0 306,0,@4740 345,0,@5609 366,0,@5592 385,0,@15660 404,0,@5592 423,0,@5593 472,0,@5592 493,0,@15662 526,0,@5621 546,0,0 553,0,0 560,0,1 566,0,0 583,0,0 604,0,@5592 623,0,@15664 645,0,0 652,0,0 659,0,1 665,0,0 695,0,@6514 747,0,@5606 804,0,@4732 881,0,@4587 921,0,@5609 942,0,@5592 961,0,@15671 980,0,@5592 999,0,@5593 1048,0,@5592 1067,0,@15673 1100,0,@5621 1120,0,0 1127,0,0 1134,0,1 1140,0,0 1157,0,0 1178,0,@5592 1199,0,@15675 1221,0,0 1228,0,0 1235,0,1 1241,0,0 1268,0,@6514 1313,0,@5606 1409,0,@5606 1469,0,@4743 1543,0,@4734 1581,0,@5609 1602,0,@5592 1621,0,@15682 1640,0,@5592 1659,0,@5593 1708,0,@5592 1729,0,@15684 1767,0,@5592 1786,0,@5593 1838,0,@5592 1857,0,@15686 1890,0,@5621 1910,0,0 1917,0,0 1924,0,1 1930,0,0 1947,0,0 1968,0,@5592 1987,0,@15688 2009,0,0 2016,0,0 2023,0,1 2029,0,0 15659:D3,356|3b650c7303ff55248b4804f6c101740783f9017d0feb06f641ff107407ba80977ab2eb728b18f6c101740583e9027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000894e048b0b890e8b3d64e039b2525089f089faff128b0c248b118b590483c404f6c301740583eb027105ff5538ebf68b75008d76f43b75087303ff5520897500c746fc02000000eb05e972000000895e048b5a04891e8b3c248b7f0483c4048b3f5089f089fa90ff128b4d008d49d03b4d087303ff5520894d00c741fc02000000c74104849a7ab289018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701ac9a7ab28d510cc742fc02000000894a045889028b45008d40dc3b45087303ff5520894500c740fc02000000895004c700b89a7ab289c18d400cc740fc05000000894810c7400c01000000c7400801000000c7400403000000c70001000000c39090900000000060010000|@5008,1048575,@3505|30,0,@5580 86,0,@4587 209,0,@5590 230,0,@5592 249,0,@5593 298,0,@5594 320,0,0 327,0,0 334,0,1 340,0,0 15660:O2|3,@15661 15661:S17|736f75726365537472756374757265203d 15662:O2|3,@15663 15663:S15|636f6e74656e74734d61746368203d 15664:O5|0,0,0,@15666,@15665 15665:O2|@15669,0 15666:O2|@15667,0 15667:O2|0,@15668 15668:O5|@14950,121,121,0,0 15669:O2|3,@15670 15670:S14|5374727563747572654d61746368 15671:O2|3,@15672 15672:S12|736f7572636549644e6f203d 15673:O2|3,@15674 15674:S12|6973457175616c697479203d 15675:O5|0,0,0,@15677,@15676 15676:O2|@15680,0 15677:O2|@15678,0 15678:O2|0,@15679 15679:O5|@14950,123,123,0,0 15680:O2|3,@15681 15681:S11|5479706549644d61746368 15682:O2|3,@15683 15683:S12|74617267657454797065203d 15684:O2|3,@15685 15685:S13|736f7572636556616c7565203d 15686:O2|3,@15687 15687:S10|636f657263696f6e203d 15688:O5|0,0,0,@15690,@15689 15689:O2|@15693,0 15690:O2|@15691,0 15691:O2|0,@15692 15692:O5|@14950,119,119,0,0 15693:O2|3,@15694 15694:S10|56616c75654d61746368 15695:S19|7072696e742d76616c75654d61746368696e67 15696:D3,28|3b650c7303ff55248b58048b0889c88b5204ff220000000018000000|@15697,1048575,@3507| 15697:S33|535452554354555245535f28292e7374727563744578706f727454726565283129 15698:D3,592|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c70158698db28959048061ffbf8b75008d76f43b75087303ff5520897500c746fc02000000894e04c70613000000f7c601000000740f89c1b8ecd57ab28b5d04909090ff1352535056ff70088b58048b0889c89090e8229efdff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40ec3b45087303ff5520894500c740fc04000000c700c4698db28b5424088950048b1c248958088b74240489700c8060ffbf833e03756a8b5d008d5bec3b5d087303ff5520895d00c743fc0100000089038d4308c740fc020000008958048b52048910837e040175058b5608eb1689cf508b5e048b46089090e81e02000089c289f9eb01508b7e0c518b5c240489d09090e84ac4fdff833c240174128b1c24eb05e92b000000909090e84602000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804893883c414c3833e0175416a016a0189e0508b5e048b44240cbaa08689b2e8c283fdff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c404890883c40cc38b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703dc6a8db28b52088953048063ffbf8b55008d52ec3b55087303ff5520895500c742fc0100000089028d4208c740fc02000000895004891889cfff760489c38b4608909090e866c3fdff83ff01740789fbe88207000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c40cc39090000000004c020000|@15719,1048575,@3519|34,0,@15699 74,0,9 89,0,@6321 118,1,@14409 178,0,@15701 278,1,@15703 302,1,@14489 326,1,@15704 385,0,@13807 390,1,@14408 461,0,@15705 530,1,@14489 542,1,@15718 15699:D3,32|3b650c7303ff552489c38b4204bad81089b2e9d1a7fbff90000000001c000000|@15700,2097151,@3508|14,0,@13564 19,1,@13567 15700:S48|535452554354555245535f28292e7374727563744578706f727454726565283229636f6d6d6f6e50726f70732d283129 15701:D3,32|3b650c7303ff55248b5a0c8b42088b4a0489caff22909090000000001c000000|@15702,1048575,@3509| 15702:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296173506172656e74283129 15703:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3510| 15704:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3511| 15705:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@15717,63,@3517|26,1,@15706 15706:D3,512|3b650c7303ff55246a016a01837b1003755b8b4b0883390575538b51048b75008d76f03b75087303ff5520897500c746fc030000008b7a0c897e088b4a08894e048b4a04890e8b4d008d49f83b4d087303ff5520894d00c741fc01000000893189e6890e89e18b32897104eb1089e1c7010100000089e18b53088951048b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7012c6d8db28941048959088b54240c89510c8061ffbf8b75008d76e83b75087303ff5520897500c746fc05000040c706b46d8db2c7460401000000894e088b3c24897e0cc74610010000008b7d008d7fe03b7d087303ff5520897d00c747fc07000040c707ac6e8db28957048b542404895708894f0c897710c74714010000008b14248957188b55008d52e03b55087303ff5520895500c742fc07000000c702686f8db2ff33508b43048942048b4314894208894a0c897a108972148b4424088942188062ffbf8957148067ffbf895604897e108066ffbf8b45008d40f43b45087303ff5520894500c740fc02000000895004c70009000000a801740e89c1b8ecd57ab28b5d049090ff138b0c2450ff71088b59048b01e8c698fdff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c204009000000000fc010000|@15716,63,@3516|113,0,0 151,0,@15707 198,0,@15710 205,0,0 221,0,0 251,0,@15712 274,0,0 310,0,@15714 395,0,4 406,0,@6321 430,1,@14409 15707:D3,40|3b650c7303ff55248b420c8b0c248904248b5a088b4204ba686d8db251ff22900000000024000000|@15709,1048575,@3512|24,0,@15708 15708:O1|@15706 15709:S57|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296578706f727454686973283129 15710:D3,160|3b650c7303ff55248b45008d40f83b45087303ff5520894500c740fc010000008b4a108908837a0c01750e89c3b84cc37bb28b5d049090ff138b5a0c8b338b7d008d7ff03b7d087303ff5520897d00c747fc010000008b4a08890f8d5f08c743fc010000008b4a04890b8b4d008d49f03b4d087303ff5520894d00c741fc0300000089590889790489018b1e89c8bae0b88cb2e9ac4affff000000009c000000|@15711,63,@3513|46,0,@6769 143,0,@15341 148,1,@15343 15711:S59|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229676574536967537472756374283129 15712:D3,104|3b650c7303ff5524f642180174058b4214eb038b42108b4d008d49e03b4d087303ff5520894d00c741fc010000008b5a0c89198d7108c746fc0100000089068d4608c740fc03000000897008894804c700010000008b5a088b4a0489caff22900000000064000000|@15713,1048575,@3514|81,0,0 15713:S55|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f7274534228322967657456616c7565283129 15714:D3,116|3b650c7303ff5524837a180174058b4214eb038b42108b4d008d49e03b4d087303ff5520894d00c741fc010000008b5a0c89198d7108c746fc0100000089068d4608c740fc03000000c740080100000089480489308b4a088b3424890c246a018b5a0456e94faffdff9090900000000070000000|@15715,63,@3515|76,0,0 101,1,@14467 15715:S54|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296765744e616d65283129 15716:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229 15717:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283129 15718:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3518| 15719:S33|535452554354555245535f28292e7374727563744578706f727454726565283229 15720:D3,516|3b650c7303ff55248b08ff3053f6c101755c8b018338037447833801752b8b5004ff7104f6c201753a8b02ff72048b480489c8ba34738db290e8f20100005a3b650c7303ff5524ebdbff71048b480489c8ba40738db2909090e81e030000eb03ff7104593b650c7303ff5524eb9fb8010000008b45008d40ec3b45087303ff5520894500c740fc01000040c700010000008d4808c741fc02000000c70184978db28941048061ffbf6a016a01508d54240452ff742410518b5c241cb8f8978db290e8822600008b442410b901000000a801752bff7004518b00e8525d0300833c2401740a8b1c249090e84e61030089c183c404583b650c7303ff5524ebd189c8b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e8faa6eeffeb0289c8837c240401742a89c18b45008d40f03b45087303ff5520894500c740fc030000008948088b4c2404894804c700150000008b0c248b098b14248b125b83c410891389c28b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000000020000|@17246,2097151,@4184|52,0,@15721 58,1,@15723 82,0,@15722 90,1,@15727 111,0,0 141,0,0 157,0,@15782 188,0,@15784 194,1,@15788 203,0,0 218,1,@17239 234,1,@17245 257,0,0 340,0,0 349,0,14 380,0,0 387,0,1 402,1,@6933 455,0,10 15721:O2|@15723,@15722 15722:O2|@15727,@15721 15723:D3,104|3b650c7303ff5524833805750a8b40048b00e9e9ffffff833803751e52ff70088b40049090e8d6ffffff8b4424048b58045883c404e942000000833801750a8b40048b00e9b7ffffff833807750b8b5a048b4004e96b000000b801000000c3900000000064000000|@15726,1048575,@3522|54,1,@15724 85,1,@15725 90,0,0 15724:D3,52|3b650c7303ff5524a8017518ff30538b4004909090e8e6ffffff8b4424045a83c404ff22b801000000c390900000000030000000|@6729,1048575,@3520|37,0,0 15725:D3,52|3b650c7303ff5524a8017518ff30538b4004909090e8e6ffffff8b4424045a83c404ff22b801000000c390900000000030000000|@6729,1048575,@3521|37,0,0 15726:S53|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e53747275637456616c7565283129 15727:D3,112|3b650c7303ff5524833803751e52ff700889d38b4004909090e8660000008b5c24045883c404e9a100000083380175088b4004e9dc0000008b400852a801751d8b0c248b10ff70048b42088b51049090ff12583b650c7303ff5524ebdfb80100000083c404c39090000000006c000000|@15781,2097151,@3558|26,1,@15728 39,1,@15729 52,1,@15730 94,0,0 15728:D3,52|3b650c7303ff5524a8017518ff30538b4004909090e8e6ffffff8b4424045a83c404ff22b801000000c390900000000030000000|@6729,1048575,@3523|37,0,0 15729:D3,52|3b650c7303ff5524a8017518ff30538b4004909090e8e6ffffff8b4424045a83c404ff22b801000000c390900000000030000000|@6729,1048575,@3524|37,0,0 15730:D3,1272|3b650c7303ff55248b08bac2758db28d548afcffe290e9f9000000909090e900010000909090e909010000909090e915010000909090e940010000909090e959010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e939010000909090e958010000909090e974010000909090e95f020000909090e983000000909090e980020000909090e973000000909090e998020000909090e963000000909090e9ac020000909090e953000000909090e9cd020000909090e9d9020000909090e93b000000909090e933000000909090e9c9020000909090e923000000909090e91b000000909090e9d4020000909090e9dc030000909090e903000000909090b801000000c38b4004bbb87a8db28b00e9f1030000ff70088b4004e8d2feffff58e9ccfeffff8b4804ff71048b0190e8befeffff58e9b8feffff8b4804ff71048b0190e8aafeffff58a801751a8b08ff70048b01909090e896feffff583b650c7303ff5524ebe2b801000000c38b4804ff7104ff71088b01909090e872feffff589090e86afeffff58e964feffff8b4008e95cfeffff8b4004a801751a8b08ff70048b01909090e846feffff583b650c7303ff5524ebe2b801000000c38b4008a80175178b08ff70048b01e822feffff583b650c7303ff5524ebe5b801000000c38b580489d890e85e030000b90100000053a801751bff700489cb8b009090e8aa03000089c1583b650c7303ff5524ebe189c8a80175688b088b51048b128b198b75008d76f03b75087303ff5520897500c746fc030000008b7b04897e088b0b894e04c7060d000000ff700489d090e8720a000056bae0828db290e8d20a000089c358ba84287bb2909090e87a00eeff83f8017412b810968db28b5d04eb05e90e00000090ff13583b650c7303ff5524eb81b80100000058a80175328b088b5104ff7004f6c201751a8b02ff72048b480489c8e83afdffff5a3b650c7303ff5524ebe1583b650c7303ff5524ebcab801000000c3ff70088b400490e812fdffff58a801751a8b08ff70048b01909090e8fefcffff583b650c7303ff5524ebe2b801000000c38b400ca801751b8b08ff70048b410c909090e8d6fcffff583b650c7303ff5524ebe1b801000000c38b4008a8017517ff70048b009090e8b2fcffff583b650c7303ff5524ebe5b801000000c38b48048b11ff7104f6c20175198b02ff72048b0889c8e886fcffff5a3b650c7303ff5524ebe2bbb87a8db258e92c1d0000ff70088b4004909090e862fcffff58e95cfcffff8b4004e954fcffff8b4004a8017516ff70048b0090e842fcffff583b650c7303ff5524ebe6b801000000c38b4804ba01000000ff7004f6c10175308b018b580c8b1b83fa0174138b710489df89d389f890e8061d000089c3eb038b710489da89f13b650c7303ff5524ebcb89d0b901000000a8017519ff700489cb8b00e89601000089c1583b650c7303ff5524ebe389c8a80175688b088b51048b128b198b75008d76f03b75087303ff5520897500c746fc030000008b7b04897e088b0b894e04c7060d000000ff700489d090e85e08000056bae0828db290e8be08000089c358ba84287bb2909090e866feedff83f8017412b810968db28b5d04eb05e90e00000090ff13583b650c7303ff5524eb81b80100000058a801751b8b08ff70048b4104909090e832fbffff583b650c7303ff5524ebe1b801000000c3ff70048b4008e816fbffff58e910fbffff00000000f4040000|@15780,2097151,@3557|11,0,$15730+22 271,0,0 280,0,@15731 287,1,@15732 374,0,0 454,0,0 490,0,0 502,1,@15733 507,0,0 526,1,@15734 595,0,6 606,1,@15753 612,0,@15754 618,1,@15755 626,0,@6509 634,1,@6714 644,0,@15775 673,0,0 733,0,0 782,0,0 822,0,0 858,0,0 902,0,@15731 908,1,@15778 970,0,0 979,0,0 1014,1,@15779 1042,0,0 1058,1,@15734 1127,0,6 1138,1,@15753 1144,0,@15754 1150,1,@15755 1158,0,@6509 1166,1,@6714 1176,0,@15775 1205,0,0 1242,0,0 15731:O1|@15730 15732:D3,48|3b650c7303ff5524a801751453ff308b4004909090e8e6ffffff588b005aff22b801000000c39090000000002c000000|@6729,1048575,@3525|33,0,0 15733:D3,80|3b650c7303ff5524a80175338b088b51088b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3526|64,0,0 15734:D3,144|3b650c7303ff55248378180175138b480c8b5018b84cc37bb28b5d04909090ff138b48188b118b1253ff700c8b1c2489d0e86e000000909090e88e0100006a016a01508d4c240451bb107f8db28b442410e8dec3edff8b442408909090e8fa65eeffff7424108b5c2404909090e8d6030000837c241001750483c414c383c4105be9d60500009090000000008c000000|@15752,2097151,@3538|21,0,@6769 50,1,@15735 58,1,@15740 73,0,@15744 82,1,@6564 94,1,@6830 110,1,@15747 130,1,@15751 15735:D3,188|3b650c7303ff5524a80175686a016a0153ff7004ff308d44240c50bbdc7c8db28b44240c90e866c3edff8b442410909090e8c65bfcff508b5c24048b442410ba84287bb290e84efcedff83f801742a6a016a0189e050bb087d8db28b4424189090e82ac3edff83c40458909090e88a5bfcffeb08e935000000586a01508b5c24108b44240ce876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4188908c3b801000000c300000000b8000000|@6329,2097151,@3529|28,0,@15736 38,1,@6564 50,1,@13871 64,0,@6509 70,1,@6714 87,0,@15738 98,1,@6564 110,1,@13871 175,0,0 15736:O1|@15737 15737:D3,16|b801000000c39090000000000c000000|@6563,1,@3527|1,0,0 15738:O1|@15739 15739:D3,16|b801000000c39090000000000c000000|@6563,1,@3528|1,0,0 15740:D3,104|3b650c7303ff552483f8017506b801000000c38338017506b801000000c389c389d8909090e85200000089c689d8909090e8be000000569090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000064000000|@15743,31,@3532|14,0,0 25,0,0 38,1,@15741 50,1,@15742 15741:D3,100|3b650c7303ff5524a8017547f6000174108b48048b10b81c777bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@3530|23,0,@6704 84,0,0 15742:D3,100|3b650c7303ff5524a8017547f6000174108b48048b10b858777bb28b5d0490ff138b08ff71048b480489c89090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@3531|23,0,@6707 84,0,0 15743:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832297472616e73706f7365283129 15744:O1|@15745 15745:D3,16|b801000000c39090000000000c000000|@15746,1,@3533|1,0,0 15746:S107|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296f726967696e616c566172732d283129 15747:D3,112|3b650c7303ff5524a8017554f6c301754fff7304ff7004ff74240c8b1b8b009090e85e00000050ff7424108b5c240c8b4424089090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c20400000000006c000000|@8004,63,@3536|34,1,@15748 97,0,0 15748:D3,180|3b650c7303ff55248b4c2404f6c10175368b118b328b3e3b38751e8b55008d52f83b55087303ff5520895500c742fc010000008b09890aeb13ff7104593b650c7303ff5524ebc5ba01000000f6c201752d8b028b48048b0983f901741589c68b780489d889cb909090e85a00000089c3eb058b780489c6891f89f0c204008b4d008d49ec3b4d087303ff5520894d00c741fc01000040891989c28d4108c740fc020000008948048910c2040000000000b0000000|@15750,63,@3535|72,0,0 106,1,@15749 15749:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3534| 15750:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296d6572676556617273283229 15751:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3537| 15752:S91|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e6365283229 15753:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3539|60,0,0 15754:O2|@15755,@6907 15755:D3,1632|3b650c7303ff5524a80175678b0852ff700483390b75618b410c8b50088b5a04833b057558833b05740bb888a77bb28b5d0490ff138b7b088b73048b590489f090e8ae24eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70160898db28941048061ffbf6a016a0189e0eb0fe9d7050000e926000000e91d0000005089cb89f89090e822bcedff5983c4043b650c7303ff5524e973ffffff89c8eb6083390d75608b41048b0083380975488b442404bb010000008b500489c8ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c740100100000089480c8b09894808c7400401000000c7000b000000eb24833803750e89c8eb1be916000000e90f00000089c13b650c7303ff5524e9f6feffff89c8833807756e8b480883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f90174668b4c2404ff7008ff7004ff34248b59048b44240c90e8a2050000b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdfba010000008b5c2408eb05e922010000f6c3017523f6c201740583c202710cff5538eb05e9cb000000ebef8b5b043b650c7303ff5524ebd8f6c1017508f6c2017503ff55383bca756d89c38b042490e8aa08000089c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b5c240ce8e608000089c38b04249090e8b20a000089c18b45008d40f03b45087303ff5520894500c740fc030000008b542404895008894804c7000700000083c410c38b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c410c38b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c408c383380575688b4c2404ff7008ff70048b59048b442408909090e8760a0000b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdfba010000008b5c2408f6c3017523f6c201740583c2027105ff5538ebf68b5b043b650c730aeb05e9f0000000ff5524ebd8f6c1017508f6c2017503ff55383bca75716a016a0189e3909090e82286efff8b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c240489088b54241090e886fcffff89c18b45008d40f43b45087303ff5520894500c740fc020000005a8950048b5424048910518b5424109090e856fcffff89c18b4500eb05e9260000008d40f03b45087303ff5520894500c740fc0300000089480859894804c7000500000083c410c38b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c410c383380b75698b480c8b51088b1a833b037561be010000008b7804f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd98b7c2404ff701051ff7008ff700456ff770489d38b4424189090e81e0b0000b90100000089c2f6c2017528eb0ae93f010000e9fe000000f6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebd3ba010000008b5c2410f6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdff6c1017508f6c2017503ff55383bca756989c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c2489088b5c24149090e8d205000089c18b45008d40e83b45087303ff5520894500c740fc050000008b54240c8950108b54240889500c8b542404895008894804c7000b00000083c418c38b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c418c38b75008d76e83b75087303ff5520897500c746fc01000040c706ec7d7ab28d4608c740fc03000000c74008f1700200897004c7000d00000083c408c383380d753e8b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c408c38b45008d40e83b45087303ff5520894500c740fc010000409090c700ec7d7ab289c18d4008c740fc03000000c74008f1700200894804c7000d00000083c408c3b8ec7d7ab2c3909090000000005c060000|@15774,2097151,@3554|43,0,@6718 66,1,@6721 96,0,@15756 138,1,@6564 183,0,0 223,0,0 238,0,0 244,0,5 346,1,@15757 351,0,0 391,0,0 470,1,@15760 510,1,@15761 522,1,@15767 564,0,3 598,0,@5413 617,0,79992 626,0,6 660,0,@5413 679,0,79992 688,0,6 722,1,@15768 727,0,0 767,0,0 842,1,@7832 980,0,2 1014,0,@5413 1033,0,79992 1042,0,6 1069,0,0 1142,1,@15770 1147,0,0 1199,0,0 1298,1,@15761 1354,0,5 1388,0,@5413 1407,0,79992 1416,0,6 1450,0,@5413 1467,0,79992 1476,0,6 1515,0,@5413 1534,0,79992 1543,0,6 1579,0,@5413 1598,0,79992 1607,0,6 1616,0,@5413 15756:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3540|62,0,0 72,0,0 15757:D3,640|3b650c7303ff5524a80175678b0853ff700483390b75618b410c8b50088b5a04833b057558833b05740bb888a77bb28b5d0490ff138b7b088b73048b590489f090e8ae1deeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701808c8db28941048061ffbf6a016a0189e0eb0fe9f8010000e926000000e91d0000005089cb89f89090e822b5edff5983c4043b650c7303ff5524e973ffffff89c8eb6083390d75608b41048b008338097548bb0100000089c88b542404909090ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c740100100000089480c8b09894808c7400401000000c7000b000000eb24833803750e89c8eb1be916000000e90f00000089c13b650c7303ff5524e9f6feffff89c8833807754f8b4c240c8b5004ff700483f901751383fa017407b801000000eb59b803000000eb57f6c20175578b018b1a8b303b33745ef7c601000000755bf6030175568b33f7c601000000740cbf03000000eb0be99b0000008b3e8d7c3f0183c7088b3089f88b3b8b590489c1d1e93bc9f3a68d7c3f01eb0fe941000000e93c000000e9320000008d7436018d4c0901740feb1fe9050000008b5904eb158b59048b520489d93b650c7303ff5524e95cffffffb801000000eb05b80100000083f80174248b0424e8360100008b4d008d49f83b4d087303ff5520894d00c741fc010000008901eb13b90100000083c4046a01eb07b9010000006a0183f90175188b442410894424108b5c240883c4045883c404e9cafdffffff31ff7424148b5c24108b44240c90e8b6fdffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c40cc20400b801000000c20400000000007c020000|@8404,2097151,@3543|43,0,@6718 66,1,@6721 96,0,@15758 138,1,@6564 179,0,0 223,0,0 238,0,0 244,0,5 312,0,0 319,0,1 364,0,1 466,0,0 473,0,0 486,1,@15759 519,0,0 531,0,0 625,0,0 15758:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3541|62,0,0 72,0,0 15759:D3,80|3b650c7303ff5524a80175338b08ff71048b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3542|64,0,0 15760:D3,80|3b650c7303ff5524a80175338b08ff71048b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3544|64,0,0 15761:D3,120|3b650c7303ff5524a801740d89c1b8608e8db28b5d0490ff138338017506b801000000c389c689f090e88a000000535689da9090ff1289c358e8f2000000538b5c24049090e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c390900000000074000000|@15766,1048575,@3547|15,0,@15762 31,0,0 42,1,@15764 58,1,@15765 15762:O4|@4650,@6706,0,@15763 15763:O5|@6454,3041,0,3041,0 15764:D3,100|3b650c7303ff5524a8017547f6000174108b48048b10b81c777bb28b5d0490ff138b08ff318b480489c8909090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@3545|23,0,@6704 84,0,0 15765:D3,100|3b650c7303ff5524a8017547f6000174108b48048b10b858777bb28b5d0490ff138b08ff71048b480489c89090e8ceffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000060000000|@6329,7,@3546|23,0,@6707 84,0,0 15766:S39|545950455f5452454528292e6c6561737447656e6572616c2831296c6561737441726773283129 15767:D3,120|3b650c7303ff5524a801755bf6c30175568b088b55008d52f43b55087303ff5520895500c742fc020000008b338972048b39893a528b730489f38b700489f09090e8baffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000074000000|@8004,63,@3548|104,0,0 15768:D3,428|3b650c7303ff5524a80175678b0853ff700483390b75618b410c8b50088b5a04833b057558833b05740bb888a77bb28b5d0490ff138b7b088b73048b590489f090e86217eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701f8918db28941048061ffbf6a016a0189e0eb0fe926010000e926000000e91d0000005089cb89f89090e8d6aeedff5983c4043b650c7303ff5524e973ffffff89c8eb6083390d75608b41048b008338097548bb0100000089c88b542404909090ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c740100100000089480c8b09894808c7400401000000c7000b000000eb24833803750e89c8eb1be916000000e90f00000089c13b650c7303ff5524e9f6feffff89c883380575318b4d008d49ec3b4d087303ff5520894d00c741fc020000008b50088951048b580489198d710cc746fc01000000890eeb05be0100000083fe01750d8b5c24045883c404e995feffffff368b5c24088b442404e886feffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c3b801000000c300000000a8010000|@8404,2097151,@3550|43,0,@6718 66,1,@6721 96,0,@15769 138,1,@6564 179,0,0 223,0,0 238,0,0 244,0,5 341,0,0 415,0,0 15769:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3549|62,0,0 72,0,0 15770:D3,416|3b650c7303ff5524a80175678b0853ff700483390b75618b410c8b50088b5a04833b057558833b05740bb888a77bb28b5d0490ff138b7b088b73048b590489f090e81615eeff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70138948db28941048061ffbf6a016a0189e0eb0fe918010000e926000000e91d0000005089cb89f89090e88aacedff5983c4043b650c7303ff5524e973ffffff89c8eb6083390d75608b41048b008338097548bb0100000089c88b54240c909090ff1289c18b45008d40e83b45087303ff5520894500c740fc05000000c740100100000089480c8b09894808c7400401000000c7000b000000eb24833803750e89c8eb1be916000000e90f00000089c13b650c7303ff5524e9f6feffff89c8ff7424108b5c2408909090e81201000083f801751d8b4424108b4c240c89442410894c240c8b5c24045883c404e9b0feffffff30ff742414ff7424148b5c24108b44240c909090e896feffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c20800b801000000c20800000000009c010000|@8404,2097151,@3553|43,0,@6718 66,1,@6721 96,0,@15771 138,1,@6564 179,0,0 223,0,0 238,0,0 244,0,5 298,1,@15772 401,0,0 15771:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3551|62,0,0 72,0,0 15772:D3,224|83380b75588b480c8b5304833a0375158b71088b7e04833f03750a8b4a043b4f04755feb26833a01755d8b71088b7e04833f0175698b4a0cf6c1017509f6470c017503ff55383b4f0c7558b9010000008b5004f6c2017523f6c101eb05e96e000000740583c1027105ff5538ebf68b52043b650c7303ff5524ebd8f6c1017516eb0ae941000000e93c000000f6442404017503ff55383b4c2404752ceb0ae925000000e9200000008b48048b45008d40f83b45087303ff5520894500c740fc010000008908c20400b801000000c20400b801000000c2040000000000dc000000|@15773,63,@3552|76,0,0 201,0,0 209,0,0 15773:S44|545950455f5452454528292e6c6561737447656e6572616c28312967657454797065436f6e73747273283129 15774:S27|545950455f5452454528292e6c6561737447656e6572616c283129 15775:O4|@4608,@5398,@15777,@15776 15776:O5|@13821,2206,0,2206,0 15777:S36|72656475636554797065733a20556e61626c6520746f2073657420747970652076617273 15778:D3,48|3b650c7303ff5524a801751453ff308b4004909090e8e6ffffff588b005aff22b801000000c39090000000002c000000|@6729,1048575,@3555|33,0,0 15779:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3556| 15780:S59|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c54797065732832296c6561737447656e457870283129 15781:S51|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e537472756374446563283129 15782:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@15783,15,@3559| 15783:S40|535452554354555245535f28292e67656e636f6465537472756374732832296d6b41646472283129 15784:O3|@15785,@12945,0 15785:O1|@15786 15786:D3,16|b8c4757ab2c39090000000000c000000|@15787,1,@3560|1,0,@5348 15787:S37|44454255474745525f28292e696e697469616c44656275676765725374617475732d283129 15788:D3,152|3b650c7303ff5524f6c301756d6a016a01ff7304ff7424108d4c240851ff74241c8b0b89c389c89090e87e0000006a016a0189e050ff742420ff7424208b5c24148b44241ce8b6ffffff833c240175068b44240ceb0c8b1c248b44240ce82e3603008b4c242083c40489015883c40c894104b801000000c20c008b4c240cc70101000000894104b801000000c20c00900000000094000000|@17203,2097151,@4177|42,1,@15789 94,1,@17238 115,0,0 128,0,0 136,0,0 15789:D3,360|3b650c7303ff552483380375158b442408c70001000000895804b801000000c20c0083380175248b4c24088b5424048b74240c894c240c895424088974240489df8b580489f8e9310100008b4d008d49cc3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000c7420cd8707ab28b74240c897208c7420428e07bb2890a8d7a14c747fc02000000c747040100000089178d570cc742fc02000000c74204010000008b400489026a016a01515753566828e07bb2576a0168d8cd90b28d44242050ff74243089d3b848c05208bafc1b8eb2e8b2ee0000f6042401740db8d0717cb28b5d04909090ff1383c404588b009090e806d8eeffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8833c240174098b1c2490e80a3403008b4c241083c404890158894104b801000000c20c00900000000064010000|@17237,2097151,@4175|19,0,0 27,0,0 71,1,@15790 101,0,0 118,0,@5279 132,0,@6817 151,0,0 170,0,0 188,0,@6817 196,0,@17233 212,0,I48 217,0,@16049 222,1,@16235 233,0,@7307 254,1,@7310 259,0,0 326,1,@17236 344,0,0 15790:D3,152|3b650c7303ff5524f6c301756d6a016a01ff73048d4c240451ff742418ff7424188b0b89c389c89090e87e0000006a016a0189e050ff742420ff7424208b5c24148b44241ce8b6ffffff833c240175068b44240ceb0c8b1c248b44240ce8923203008b4c242083c40489015883c40c894104b801000000c20c008b4c240cc70101000000894104b801000000c20c00900000000094000000|@17203,2097151,@4172|42,1,@15791 94,1,@17232 115,0,0 128,0,0 136,0,0 15791:D3,1808|8d7c24903b7d0c7303ff55288b48108b098b50248b128b308b7e048b3f83ff01751f8b700cff7004ff702cff7020ff7028ff7014b84cc37bb28b5d04909090ff138b75008d76f83b75087303ff5520897500c746fc01000040c70603000000ff7004ff702cff7020ff7028ff7014538b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7035ca28db28973048063ffbfff700c8b45008d40f83b45087303ff5520894500c740fc01000040c70001000000568b75008d76f43b75087303ff5520897500c746fc02000000c706f0a28db28946048066ffbf508b45008d40f03b45087303ff5520894500c740fc03000000538b5c2404895808897004c700030000008b378b5e04833b05740e50b854a48db28b5d04909090ff138b7424088b3650568b7424108b36f7c601000000740583c6027105ff5538ebf68b44241089308b73048b042489068b73088b5c2404891e8b74241c8b3683fe01750ab84cc37bb28b5d04ff138b3f8b7f08ff36515253ff742448ff74241c8b5c24308b4708909090e8be0700008b4c242c8b09ff30ff742414ff74244cff7424208b580489c89090e8ba1300008b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000c7420cd8707ab28b5c2418895a088b742414897204890a8d4a14c741fc02000000c741040100000089118b5424348b12ff3056ff74245053518b580489d090e8861a00008b4c243c8b09ff30ff74241cff742454ff7424288b580489c89090e81a75000083380175058b0c24eb128b70048b188b042490e8627d000089c1eb038b700483f90175068b442404eb0e89cb8b442404909090e89a7d000083f80175068b442408eb0d89c38b4424089090e8da7d00005056bba0a38cb28b442434e8c66decff6a016a01ff742408ff742434ff7424348d4c240c51ff74247089c38b442468baf01b8eb2909090e80e7e00008b45008d40ec3b45087303ff5520894500c740fc04000000c700c4c590b28b4c24308948048b54242c8950088b5c242089580c8060ffbf505152ff74246c8b5c242c8b44241490e8aaa900008b4c24608b5134f6c20175358b1a813b94e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01756bba7c787cb2f6c20175358b1a813b94e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01750f89c2b8287c7cb28b5d04909090ff138b16813a94e539b2741689c3b854eb7ab2eb05e9100000008b5d04909090ff13837a0801745feb1e8b16813a94e539b2740e89c3b854eb7ab28b5d049090ff13837a0801745f8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430ccc707ab28b7c2428897b08c7430401000000c70303000000833c2401750b8b7c240ceb25e90101000089c7538b5c24048b442410909090e8e226030089f989c789c8eb06e9e1000000538b4d008d49f43b4d087303ff5520894d00c741fc020000008979045a891183f901742689c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c700150000008b4c24348b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8e81e5ceeff8b4c24388b098b5424388b128b742438891689c28b45008d40e83b45087303ff5520894500c740fc0500000089481089500c8b4c243c894808c7400403000000891890e84e260300eb5a8b5d008d5bec3b5d087303ff5520895d00c743fc04000000c7430ccc707ab28b7c2428897b08c7430401000000c70303000000833c240175068b7c240ceb2089c7538b5c24048b442410909090e8fa2a030089f989c789c8eb06e9df000000538b4d008d49f43b4d087303ff5520894d00c741fc020000008979045a891183f901742689c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c700150000008b4c24348b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8e8de5aeeff8b4c24388b098b5424388b128b742438891689c28b45008d40e83b45087303ff5520894500c740fc0500000089481089500c8b4c243c894808c7400403000000891890e8662a030050b8030000008b542460ff128b4c24288b5108833a05740f89c3b854a48db28b5d04909090ff138b5a0489038b7208c70628e07bb28b7d008d7fe03b7d087303ff5520897d00c747fc040000005983c440894f0c894708c7470401000000c707030000008d4714c740fc02000000c740040100000089388b4c242489015883c414894104b801000000c20c009090000000000c070000|@17231,2097151,@4170|53,0,@6769 91,0,1 137,0,@15792 177,0,0 208,0,@15794 257,0,1 273,0,@15795 352,0,@6769 390,1,@15797 422,1,@15813 452,0,0 469,0,@5279 502,0,0 530,1,@15825 562,1,@16037 586,1,@16045 618,1,@16046 642,1,@16047 649,0,@15270 658,1,@4940 694,0,@16048 702,1,@16050 732,0,@17209 778,1,@16121 798,0,@4663 848,0,0 858,0,@7313 871,0,@4663 921,0,0 933,0,@7368 949,0,@4663 958,0,@6377 989,0,@4663 998,0,@6377 1042,0,@5278 1056,0,0 1062,0,1 1098,1,@17210 1185,0,10 1196,0,0 1262,1,@6883 1326,0,1 1334,1,@17211 1367,0,@5278 1381,0,0 1387,0,1 1418,1,@17227 1505,0,10 1516,0,0 1582,1,@6883 1646,0,1 1654,1,@17228 1660,0,1 1685,0,@15795 1707,0,@6817 1748,0,0 1754,0,1 1771,0,0 1791,0,0 15792:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@15793,15,@3561| 15793:S72|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e642832296d6b41646472283129 15794:D3,336|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b188b7008b840f77bb28b5d0490ff13f6c101740783f9017e6beb06f641ff107568f6c101740583e9027105ff5538ebf683f901750683780801740c8b08b8b8e07bb28b5d04ff138b08f6c101740783f9017c08eb12f641ff10740cb8f8e07bb28b5d049090ff138b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b04eb0ae917000000e912000000c7030500000089de8b5a0489f0e9ea53eeff8378080174438b10f6c201740783fa017c08eb13f642ff10740db8bcf97bb28b5d04909090ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c390000000004c010000|@6878,63,@3562|35,0,@6871 92,0,@6820 122,0,@6823 174,0,2 186,1,@6874 217,0,@6876 258,0,0 284,0,@6876 322,0,2 15795:O4|101,@6569,0,@15796 15796:O5|@6542,509,0,509,0 15797:D3,380|3b650c7303ff55248b4c24088b5134f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756cba7c787cb2f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750d89c2b8287c7cb28b5d0490ff138b17813af4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837a08017544eb1e8b17813af4e539b2740e89c6b854eb7ab28b5d049090ff13837a080175248b45008d40f43b45087303ff5520894500c740fc02000000895804c70001000000c20c006a016a0189e656ff742418ff742414909090e8660000006a016a01ff74241cff7424188d442408508b5c24188b4424149090e8620600008b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c8908c20c0090900000000078010000|@15812,1048575,@3571|24,0,@4675 74,0,0 84,0,@7313 97,0,@4675 147,0,0 159,0,@7368 173,0,@4675 182,0,@6377 213,0,@4675 222,0,@6377 268,0,0 294,1,@15798 326,1,@15806 15798:D3,848|3b650c7303ff552483f80175158b44240cc70001000000895804b801000000c20c008b088b11833a0175348b75008d76ec3b75087303ff5520897500c746fc04000000c7460c010000008b7a04897e08c74604cc707ab2c7060d000000eb1bff7004ff7304ff730851ff338b5c241c89d0e8ee02000089c6eb0cff7004ff7304ff730851ff33568b4424208b54240490ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e87a72eeffeb0289c86a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c70194aa8db28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542420909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c701dcaa8db28941048b5424248951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b4424088b48048339017570833905750f8b5008b808377bb28b5d049090ff1383390175148b5108833a0375078b5a048b1beb0c8b5a04eb078b51048b1289d38b55008d52c43b55087303ff5520895500c742fc01000040891a8d5a08c743fc04000000c7430c010000008b7104897308895304c70303000000eb05e9310000008d5314c742fc030000008b7808897a08895a04c70270867ab28d5a10c743fc03000000894308895304c7030b000000eb248b5d008d5bf03b5d087303ff5520895d00c743fc03000000894308894304c7030b0000008b55008d52e43b55087303ff5520895500c742fc020000008b74240c897204891a8d5a0cc743fc030000008953088b5424108953048b54240489136a016a0189e252ff74242cff74242c8b442428e8eafcffff833c240175068b442408eb0c8b1c248b442408e85e0200008b4c242c83c40489015883c418894104b801000000c20c009090000000004c030000|@15805,1048575,@3567|19,0,0 27,0,0 70,0,0 83,0,@5278 89,0,6 114,1,@15799 173,0,0 225,0,1 234,0,14 265,0,0 272,0,1 286,1,@6933 329,0,@15800 344,0,0 357,0,1 396,0,@15802 448,0,0 454,0,1 478,0,0 514,0,@6539 596,0,0 611,0,1 643,0,@5500 665,0,5 703,0,5 810,1,@15804 831,0,0 15799:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e95541eeff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3563|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 15800:D3,12|8b4204c30000000008000000|@15801,5,@3564| 15801:S29|434f44455452454528292e6d756c7469706c6555736573283329283129 15802:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3565|65,0,0 113,0,4 15803:S35|434f44455452454528292e6d756c7469706c65557365732833296c6f6164466e283129 15804:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3566| 15805:S47|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529666f6c64496473283229 15806:D3,824|3b650c7303ff552489c6b8010000009090e8564feeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410878af8db2894104c701070000005356ff33ff730851b8030000008b54241c9090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52e43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc03000000c74108010000005b895904c701050000008b5c24188b33f7c6010000007409f6030174042b337105ff5538ebf783c60189c78b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089700489385257518b5304909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c702f4c17ab28d420cc740fc0200000089500489089090e8ee4deeff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c70005000000508b4424248b54240c909090ff128b4c24248b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424048910538b5104ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c70240c37ab28d420cc740fc0200000089500489089090e8e64ceeff8b4d008d49c83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c741040100000089018d410cc740fc020000008948045983c404890883f80175058b0424eb0a89c38b0424e86a00000083f80175068b442408eb0d89c38b4424089090e8aa0000008b4c241483c40c890158894104b801000000c20c00900000000034030000|@15811,1048575,@3570|11,0,0 18,1,@6881 49,0,1 56,0,@15807 65,0,3 78,0,1 124,0,0 130,0,1 161,0,0 180,0,0 190,0,2 254,0,0 303,0,4 320,0,0 356,0,@6054 378,1,@6881 409,0,1 416,0,@15808 425,0,3 444,0,2 519,0,0 567,0,4 584,0,0 620,0,@6072 642,1,@6881 673,0,1 680,0,@15808 689,0,3 708,0,2 725,0,0 766,1,@15809 790,1,@15810 808,0,0 15807:O3|2,I72,0 15808:O3|2,I255,0 15809:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3568| 15810:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3569| 15811:S26|44454255474745525f28292e7570646174655374617465283429 15812:S37|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529 15813:D3,460|3b650c7303ff55248b4c24088b5134f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756cba7c787cb2f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750d89c2b8287c7cb28b5d0490ff138b17813af4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837a08017469eb1e8b17813af4e539b2740e89c6b854eb7ab28b5d049090ff13837a080174738b75008d76f43b75087303ff5520897500c746fc02000000895e04c706010000006a016a01a801752aff7004ff742418ff74241489f38b009090e8b200000089c6583b650c730aeb05e961000000ff5524ebd289e08b0e890889e08b56048950046a016a01ff74241cff7424188d442408eb05e937000000508b5c24188b44241490e81afaffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c8908c20c008b45008d40f43b45087303ff5520894500c740fc02000000895804c70001000000c20c00909000000000c8010000|@15824,1048575,@3577|24,0,@4675 74,0,0 84,0,@7313 97,0,@4675 147,0,0 159,0,@7368 173,0,@4675 182,0,@6377 213,0,@4675 222,0,@6377 268,0,0 298,1,@15814 370,1,@15806 443,0,0 15814:D3,568|3b650c7303ff55248b4b04ff7104ff7108ff33ff700cff7008ff30ff318b5c2424e826020000508b4424288b54240490ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e86e66eeffeb0289c86a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c7015cb68db28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542428909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c7017cb68db28941048b54242c8951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b45008d40ec3b45087303ff5520894500c740fc040000008b4c241089480c8b4c240c8948088b4c2408894804c70007000000833c240175068b4c2414eb1289c68b1c248b442414e8ba02000089c189f08b55008d52d83b55087303ff5520895500c742fc020000008b5c241883c404895a0489028d420cc740fc030000008950088b5424188950045a83c418891089c28d4010c740fc020000008950048908c208000000000034020000|@15823,1048575,@3576|34,1,@15815 77,0,0 129,0,1 138,0,14 169,0,0 176,0,1 190,1,@6933 233,0,@15820 248,0,0 261,0,1 300,0,@15821 352,0,0 358,0,1 382,0,0 444,0,3 470,1,@15822 15815:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e90136eeff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3572|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 15816:O4|@4608,@5398,@6865,@15817 15817:O5|@15818,707,0,707,0 15818:S32|6d6c736f757263652f4d4c436f6d70696c65722f56414c55455f4f50532e4d4c 15819:S27|56414c55455f4f505328292e636f64655374727563742832292829 15820:D3,12|8b4204c30000000008000000|@15801,5,@3573| 15821:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3574|65,0,0 113,0,4 15822:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3575| 15823:S50|44454255474745525f28292e6d616b655374727563744465627567456e74726965732835296c6f6164537472756374283229 15824:S37|44454255474745525f28292e6d616b655374727563744465627567456e7472696573283529 15825:D3,468|3b650c7303ff55248b4c240c8b5134f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756cba7c787cb2f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750d89c2b8287c7cb28b5d0490ff138b17813af4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837a08017469eb1e8b17813af4e539b2740e89c6b854eb7ab28b5d049090ff13837a080174738b75008d76f43b75087303ff5520897500c746fc02000000895e04c706010000006a016a01a8017532ff7004ff74241cff742414ff742420ff74242089f38b009090e8b2000000eb05e96900000089c6583b650c7303ff5524ebca89e08b0e890889e08b56048950046a016a01ff742420eb05e93f000000ff74241c8d442408508b5c24188b44241490e8daf2ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c8908c210008b45008d40f43b45087303ff5520894500c740fc02000000895804c70001000000c21000909000000000d0010000|@16036,2097151,@3643|24,0,@4675 74,0,0 84,0,@7313 97,0,@4675 147,0,0 159,0,@7368 173,0,@4675 182,0,@6377 213,0,@4675 222,0,@6377 268,0,0 306,1,@15826 378,1,@15806 451,0,0 15826:D3,744|3b650c7303ff55248b4b04ff7104ff7108ff3350ff31ff7424206a01ff74242468e01687b28b5c2434bab8bc8db2909090e8de020000508b4424288b54240490ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e81e5feeffeb0289c86a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c7011c118eb28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542420909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c7013c118eb28941048b54242c8951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b442408f640040175598b48048b55008d52e83b55087303ff5520895500c742fc050000008b5810895a108b710489720c8b39897a088b780c897a048b08890a8b75008d76f43b75087303ff5520897500c746fc02000000895604c7060d000000eb668378040175318b75008d76ec3b75087303ff5520897500c746fc040000008b4810894e0c8b500c8956088b18895e04c70603000000eb2f8b75008d76ec3b75087303ff5520897500c746fc040000008b4810894e0c8b500c8956088b18895e04c7060f000000833c240175068b44240ceb0c8b1c248b44240ce8965500008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241083c40489510489318b55008d52e43b55087303ff5520895500c742fc03000000894a088b4c2410894a045983c410890a89c18d4210c740fc020000008950048908c21000909000000000e4020000|@16035,2097151,@3642|33,0,@12945 42,0,@15827 50,1,@15829 93,0,0 145,0,1 154,0,14 185,0,0 192,0,1 206,1,@6933 249,0,@16032 264,0,0 277,0,1 316,0,@16033 368,0,0 374,0,1 398,0,0 506,0,6 561,0,1 610,0,7 634,1,@16034 15827:O2|@15829,@15828 15828:O2|@15974,@15827 15829:D3,6964|3b650c7303ff55248b480883390775708b7104bfeebc8db28d7cb7fcffe7e943000000909090e9a2010000909090e933000000909090e94b0c0000909090e94b0c0000909090e9d20d0000909090e913000000909090e9d6100000909090e9030000009090908b75008d76e83b75087303ff5520897500c746fc01000040eb05e98c170000c706010000008d7e08c747fc03000000c70718d88db28977048b4b04894f088067ffbf8b0bf6c101740583c1027105ff5538ebf68b5d008d5bf03b5d087303ff5520895d00c743fc03000000897308897b04890b5653ff742418ff742418ff742418ff742418bbcc707ab28b520490ff12598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8363eeeff909090e8ae3eeeff5053bb48d98db2b803000000909090e8da79edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000f644240c0175708b54240cf642040175098b7204837e0401740ab874d98db28b5d04ff138b3e8b028b4d008d49e83b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d5108c742fc03000000c74208f1700200894a04c7020d0000005352ff37ff308b0424909090e8c61a0000a8017566eb05e9b70900008b0850ff7104bbb4db8db28b41089090e8da78edffa801756c83780401756b8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410440dc8db28b10891150bb0300000089c89090e862f3faff89c389d8909090e8aa72fcffeb05e9e30100008b4d008d49d03b4d087303ff5520894d00c741fc03000000c7410803000000eb0ae9aa000000e93b000000894104c701010000008d4110c740fc03000000894808895804c700070000008d4810c741fc030000008b542414895108894104c70105000000eb65508b5c241490e85e1c0000bb030000009090e8d2f2faff89c389d8909090e81a72fcff8b4d008d49e03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7010100000089c88d4910c741fc03000000894108895904c70107000000eb0be906000000b93cbe7ab2508b45008d40f03b45087303ff5520894500c740fc030000008b5424148950088b5c240c895804c700050000008b5d008d5bc03b5d087303ff5520895d00c743fc030000008943088b442410894304c703050000008b4424048d7310c746fc020000008b7c2420897e04c706010000008d560cc742fc02000000c742040100000089328d720cc746fc0500000089561089460c8b008946085883c404894604c7060b0000008b45008d40f03b45087303ff5520894500c740fc030000008b54240c895008897004c700050000008b55008d52f03b55087303ff5520895500c742fc03000000894208894a04c70205000000684cdd8db2ff742420576864dd8db289d889d3909090e8f21c0000eb0889c1b80100000051833c2401750bb80ce38db283c414c210008b04248b088379080175718b19b8ece38db29090e8063aeeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410824b57ab2894104c7010700000089ceb8b4857ab290e8ca39eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104eb05e9ce000000c7010700000089ceb818e48db29090e88a39eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c7010700000089ceb838e48db290e8823aeeff535056bb44e48db2b8030000009090e8ae75edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c7410470e48db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000eb63837908037462ff31ff7108bb80e48db28b04249090e82675edff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175278b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb0fe92a020000e938000000b80300000083f801740989c8e86656eeffeb0289c88b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008901eb0c8b018b5108b960e58db2505289cbb8ece38db290e81238eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410824b57ab2894104c7010700000089ce89d8e8da37eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c7010700000089cbb818e48db290e8a237eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c7010700000051bb8ce58db28b4424049090e8d673edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70124b57ab289c8e86e38eeff50bb04e68db2b803000000e89e73edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c7410430e68db25889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000089c3b838e48db29090e8ea37eeff5053bb40e68db28b442408e81a73edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c7410470e48db25883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4c24148b55008d52f83b55087303ff5520895500c742fc01000040c702010000008b19f6c301740583c3027105ff5538ebf65e8b3e833f0975555250ff7704ff7104528b4708e8c6200000833805750d6a018b5c2404e84a25eeffeb6189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d000000eb62833f0575628b77048b368b7f088b3ff6c3017409f6070174042b1f7105ff5538ebf783c301f6c301740e83fb01eb05e9080100007c08eb13f643ff10740d89c7b840f77bb28b5d0490ff13f6c301740783fb017e61eb06f643ff107559f6c301eb0ae9d5000000e9b5000000740583eb027105ff5538ebf689c78b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804893052578b5104909090ff128b5c2404909090e8fa30eeffeb46f7c601000000740783fe017c08eb12f646ff10740c89c1b8bcf97bb28b5d04ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000897004c70005000000525189c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb19833f03740d89c1b8e4b58db28b5d0490ff1389c18b470452516a0183380575116a01bb03000000909090e8c623eeffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000083c4045a89118b55008d52e83b55087303ff5520895500c742fc02000000894a04c702c4757ab28d4a0cc741fc02000000895104890189c890e8ce33eeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c70107000000588b00ba01000000a80175328b188b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b580489d83b650c7303ff5524ebca89d089cb9090e80634eeff909090e87e34eeff5053bb24e88db2b803000000909090e8aa6fedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c7410450e88db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c414c21000b801000000e8ee33eeff50bb60e88db2b803000000e81e6fedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c741048ce88db2c701a0e88db28b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000b810e98db2c21000f644240c01752f8b54240c837a0401740ab8f4e98db28b5d04ff138b328b7c2410897c24108b06baec3f7cb25983c40c51e96c76eeff8b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d7208c746fc03000000c70654ea8db28956048b7b04897e088066ffbf8b03a801740583c0027105ff5538ebf68b4d008d49f03b4d087303ff5520894d00c741fc03000000895108897104890152ff74241489cbb8e4107bb2baec3f7cb290e8ea75eeff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8e631eeff909090e85e32eeff5053bb84eb8db2b803000000909090e88a6dedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104b0eb8db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000f644240c0175728b54240c837a0401740bb8c4eb8db28b5d0490ff138b328b7d008d7fe83b7d087303ff5520897d00c747fc01000040c707010000008d4708c740fc030000009090c70024ec8db28978048b4b048948088060ffbf8b13f6c201740583c2027105ff5538ebf68b4d008d49f03b4d08730aeb05e97e010000ff5520894d00c741fc03000000897908894104891157ff74241489cb8b06baec3f7cb2909090e86a74eeff89c3b854ed8db2e8f62feeff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc02000000c7400401000000890890e8b22feeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410898ed8db2894104c70107000000588b00ba01000000a80175328b188b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b580489d83b650c7303ff5524ebca89d089cb9090e8ea2feeff909090e86230eeff5053bb84f08db2b803000000909090e88e6bedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c74104b0f08db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000b801000000909090e8d22feeff50bbc4f08db2b803000000e8026bedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c74104b0f08db2c701f0f08db28b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000089c3b801000000909090e8822300005053bb74f18db2b803000000909090e8766aedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c74104a0f18db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000f644240c01756c8b54240c837a0401740bb8b8f18db28b5d0490ff138b328b7c24088b4734a80175358b088139dce539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa01756fb87c787cb2a801753ceb05e9240400008b088139dce539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc0ba0100000083fa01750db8287c7cb28b5d04909090ff138b0290908138dce539b27414b854eb7ab2eb05e90d0000008b5d04909090ff138b4808eb1a8b028138dce539b2740db854eb7ab28b5d04909090ff138b48088b4734a80175358b10813a24e939b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb148b500489d03b650c7303ff5524ebc7bf0100000083ff017507b814f28db2eb1d8b079090813824e939b2740cb854eb7ab28b5d049090ff138b500889d08b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d7a08c747fc03000000c70740f28db2895704528b53048957088067ffbf8b13f6c201740583c2027105ff5538ebf68b5d008d5bf03b5d087303ff5520895d00c743fc03000000518b4c2404894b08897b0489138b55008d52f03b55087303ff5520895500c742fc03000000c7420801000000894204c7020500000052ff74241c8b06baec3f7cb290e8e66feeff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b542404895104c7010500000089c389ceb8b4857ab29090e8422beeff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc02000000894104c701cc707ab28d410cc740fc03000000c7400801000000894804c7001d000000f6c101740a539090e8de48eeffeb01538b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e89e2aeeff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008d4114c740fc02000000c74004010000008908e85a2aeeff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c030000005a83c404895108894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c7410401000000890183f9017507b8cc707ab2eb288b45008d40f03b45087303ff5520894500c740fc03000000c74008cc707ab2894804c70015000000598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c890e8362aeeff909090e8ae2aeeff5053bb70f38db2b803000000909090e8da65edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741049cf38db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c210008b5424088b5a34f6c30175358b33813e24e939b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b730489f33b650c7303ff5524ebc6bf0100000083ff017507bbacf38db2eb1b8b1f813b24e939b2740cb854eb7ab28b5d049090ff138b730889f38b75008d76f03b75087303ff5520897500c746fc03000000c7460801000000895e04c70605000000b8d8f38db29090e85a28eeff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000897108894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c7410401000000890183f9017507b8cc707ab2eb288b45008d40f03b45087303ff5520894500c740fc03000000c74008cc707ab2894804c7001500000089c3b801000000909090e8f628eeff5053bbe4f38db2b803000000909090e82264edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741049cf38db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000089c3b801000000e86a28eeff5053bb10f48db2b803000000909090e89663edff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741043cf48db25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c21000833901750f89c2b84cf48db28b5d04909090ff13833909756cff7108ff71046890f48db2837804017560ff71048b4108e8222100008338057519b901000000894c24208b1c2483c4105983c40c51e9cc15eeff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d000000eb0ae9c1000000e90600000083c410c21000837804037562ff71048b4108909090e8ca2100008338057519b901000000894c24208b1c2483c4105983c40c51e95815eeff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c410c21000f64004017524b801000000e85e0deeffff74241c8d4c240451bab8e37bb290e8e20deeff83c40cc210008b44241890e83a0deeffff74241c8d4c240451bab8e37bb290e8be0deeff83c40cc21000833905756c8b51048b128b71088b3656526870f88db283780401755a8b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b53049090ff1289c18b45008d40f43b4508730feb0ae9e6000000e91c000000ff5520894500c740fc02000000894804c7000900000083c40cc2100083780403756e8b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b530490ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000900000083c40cc21000f64004017527b801000000909090e8020ceeffff74241c8d4c240451bab8e37bb290e8860ceeff83c40cc210008b44241890e8de0beeffff74241c8d4c240451bab8e37bb290e8620ceeff83c40cc21000ff7104682cf98db28378040175098b410483c408c210008378040375098b410483c408c21000f64004017524b801000000e88e0beeffff7424188d4c240451bab8e37bb290e8120ceeff83c408c210008b44241490e86a0beeffff7424188d4c240451bab8e37bb290e8ee0beeff83c408c2100000000000301b0000|@15973,2097151,@3619|20,0,$15829+30 135,0,0 151,0,@15830 236,0,@5278 250,0,0 318,1,@6883 326,1,@6884 333,0,@15831 338,0,1 346,1,@6547 377,0,1 384,0,0 391,0,1 408,0,0 415,0,@6130 454,0,7 488,0,@15833 527,0,@5413 544,0,79992 553,0,6 570,1,@15836 592,0,@15839 602,1,@6547 643,0,@15842 653,0,1 662,1,@13429 674,1,@14089 712,0,1 733,0,0 755,0,3 781,0,2 794,1,@15843 799,0,1 806,1,@13429 818,1,@14089 849,0,1 858,0,0 882,0,3 894,0,@6000 939,0,2 979,0,2 1006,0,0 1023,0,0 1059,0,5 1099,0,2 1135,0,2 1140,0,@15844 1150,0,@15845 1162,1,@15850 1171,0,0 1183,0,@15857 1207,0,@15864 1214,1,@6881 1245,0,1 1252,0,@5868 1261,0,3 1268,0,@5490 1274,1,@6881 1305,0,1 1324,0,3 1331,0,@15867 1338,1,@6881 1369,0,1 1381,0,3 1388,0,@15869 1394,1,@6884 1402,0,@15870 1407,0,1 1414,1,@6547 1445,0,1 1452,0,0 1459,0,1 1476,0,0 1483,0,@15872 1522,0,7 1540,0,@15873 1550,1,@6547 1581,0,0 1590,0,14 1621,0,0 1638,0,1 1650,1,@6933 1685,0,0 1699,0,@15876 1708,0,@15864 1714,1,@6881 1745,0,1 1752,0,@5868 1761,0,3 1770,1,@6881 1801,0,1 1813,0,3 1820,0,@15867 1826,1,@6881 1857,0,1 1869,0,3 1875,0,@15879 1886,1,@6547 1919,0,@5868 1926,1,@6884 1932,0,@15881 1937,0,1 1942,1,@6547 1973,0,1 1980,0,0 1987,0,1 2001,0,0 2008,0,@15883 2044,0,7 2051,0,@15869 2058,1,@6884 2065,0,@15884 2074,1,@6547 2105,0,1 2112,0,0 2119,0,1 2136,0,0 2143,0,@15872 2182,0,7 2216,0,0 2258,1,@15886 2274,1,@6843 2309,0,0 2324,0,6 2395,0,@6871 2479,0,0 2506,1,@6874 2536,0,@6876 2576,0,2 2613,0,4 2627,0,@15816 2654,0,1 2662,1,@6843 2697,0,0 2704,0,1 2713,0,6 2744,0,0 2783,0,@5348 2806,1,@6881 2837,0,1 2844,0,@15808 2853,0,3 2861,0,0 2926,1,@6883 2934,1,@6884 2941,0,@15887 2946,0,1 2954,1,@6547 2985,0,1 2992,0,0 2999,0,1 3016,0,0 3023,0,@15889 3062,0,7 3073,0,0 3078,1,@6884 3084,0,@15890 3089,0,1 3094,1,@6547 3125,0,1 3132,0,0 3139,0,1 3153,0,0 3160,0,@15892 3166,0,@15893 3199,0,7 3207,0,@15898 3232,0,@15905 3254,0,@7206 3264,1,@7207 3294,0,0 3310,0,@15908 3383,0,@6455 3388,0,@7206 3394,1,@7207 3402,0,0 3470,1,@6883 3478,1,@6884 3485,0,@15909 3490,0,1 3498,1,@6547 3529,0,1 3536,0,0 3543,0,1 3560,0,0 3567,0,@15911 3606,0,7 3631,0,@15912 3669,0,0 3687,0,@15915 3770,0,@7206 3778,1,@7207 3785,0,@15916 3790,1,@6881 3821,0,1 3833,0,3 3850,0,0 3858,1,@6881 3889,0,1 3896,0,@15921 3905,0,3 3913,0,0 3978,1,@6883 3986,1,@6884 3993,0,@15936 3998,0,1 4006,1,@6547 4037,0,1 4044,0,0 4051,0,1 4068,0,0 4075,0,@15938 4114,0,7 4122,0,0 4130,1,@6884 4136,0,@15939 4141,0,1 4146,1,@6547 4177,0,1 4184,0,0 4191,0,1 4205,0,0 4212,0,@15938 4218,0,@15941 4251,0,7 4258,0,0 4266,1,@15942 4273,0,@15943 4278,0,1 4286,1,@6547 4317,0,1 4324,0,0 4331,0,0 4348,0,0 4355,0,@15945 4394,0,7 4419,0,@15946 4446,0,@4672 4496,0,0 4506,0,@7313 4525,0,@4672 4575,0,0 4585,0,@7368 4603,0,@4672 4610,0,@6377 4638,0,@4672 4645,0,@6377 4671,0,@4747 4721,0,0 4731,0,@15949 4743,0,@4747 4750,0,@6377 4792,0,0 4808,0,@15951 4907,0,0 4916,0,2 4928,0,@7206 4934,1,@7207 4965,0,0 4978,0,2 4987,0,@5490 4994,1,@6881 5025,0,1 5037,0,3 5054,0,0 5075,0,@5278 5092,0,0 5101,0,14 5114,1,@6933 5148,0,0 5158,1,@6881 5189,0,1 5202,0,3 5219,0,0 5226,1,@6881 5257,0,1 5273,0,3 5292,0,2 5309,0,0 5321,0,@5278 5354,0,@5278 5363,0,10 5371,0,0 5438,1,@6883 5446,1,@6884 5453,0,@15952 5458,0,1 5466,1,@6547 5497,0,1 5504,0,0 5511,0,1 5528,0,0 5535,0,@15954 5574,0,7 5597,0,@4747 5647,0,0 5657,0,@15955 5667,0,@4747 5674,0,@6377 5717,0,0 5726,0,2 5731,0,@15957 5738,1,@6881 5769,0,1 5781,0,3 5800,0,2 5817,0,0 5829,0,@5278 5862,0,@5278 5871,0,10 5878,0,0 5886,1,@6884 5893,0,@15958 5898,0,1 5906,1,@6547 5937,0,1 5944,0,0 5951,0,1 5968,0,0 5975,0,@15954 6014,0,7 6021,0,0 6026,1,@6884 6033,0,@15960 6038,0,1 6046,1,@6547 6077,0,1 6084,0,0 6091,0,1 6108,0,0 6115,0,@15962 6154,0,7 6169,0,@15963 6193,0,@15966 6210,1,@15968 6220,0,0 6240,1,@6843 6273,0,0 6288,0,6 6326,1,@15969 6336,0,0 6356,1,@6843 6389,0,0 6404,0,6 6421,0,0 6426,1,@6834 6440,0,@6835 6446,1,@6837 6462,1,@6834 6476,0,@6835 6482,1,@6837 6510,0,@15970 6574,0,0 6633,0,4 6703,0,0 6749,0,4 6766,0,0 6774,1,@6834 6788,0,@6835 6794,1,@6837 6810,1,@6834 6824,0,@6835 6830,1,@6837 6844,0,@15972 6885,0,0 6890,1,@6834 6904,0,@6835 6910,1,@6837 6926,1,@6834 6940,0,@6835 6946,1,@6837 15830:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9f41eeeff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3578|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 15831:O1|@15832 15832:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3579|1,0,@5280 15833:O4|@4608,@5398,@15835,@15834 15834:O5|@15818,1043,0,1043,0 15835:S42|4f7665726c6f6164656420416464507265747479202d2077726f6e6720696e7374616e63652074797065 15836:D3,276|3b650c7303ff552483380d75158b40048b008338037506b801000000c3e9deffffff83380b756b8b480c8b51088b5a04833b057462be010000008b7804f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd98b7d008d7fe83b7d087303ff5520897d00c747fc03000000897708894f0489178d4710c740fc010000008938eb0ae96c000000e901000000c3833b05740f8b7004b888a77bb28b5d049090ff138b7b088b73048b580489f090e84acdedff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701fcda8db28941048061ffbf6a016a0189e05089cb89f8909090e8ce64edff5883c404e9fdfeffffb801000000c39090900000000010010000|@15838,2097151,@3581|24,0,0 54,0,0 166,0,@6718 190,1,@6721 220,0,@15837 246,1,@6564 260,0,0 15837:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3580|62,0,0 72,0,0 15838:S36|56414c55455f4f505328292e636f646556616c283629666f6c6c6f775479706573283129 15839:O1|@15840 15840:D3,68|8b45008d40e83b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc03000000c7400805000000894804c7000d000000c3900000000040000000|@15841,3,@3582|26,0,@5413 45,0,2 54,0,6 15841:S36|56414c55455f4f505328292e636f646556616c2836295f2d74797065566172732d283129 15842:O2|@5307,0 15843:D3,236|3b650c7303ff5524a80175768b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410440dc8db28b10891153ff7004bb0300000089c8909090e83ed6faff89c389d8909090e88655fcff8b4d008d49d03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000eb05e957000000894808895804c700070000008d4810c741fc030000008b542404895108894104c701050000005189d38b44240490e846ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c300000000e8000000|@6329,2097151,@3583|39,0,@15842 52,0,1 62,1,@13429 74,1,@14089 105,0,1 114,0,0 143,0,3 169,0,2 223,0,0 15844:S14|6164645072657474795072696e74 15845:O1|@15846 15846:D3,16|b890dd8db2c39090000000000c000000|@15849,1,@3584|1,0,@15847 15847:O2|3,@15848 15848:S133|6164645072657474795072696e7420656c656d656e742066756e6374696f6e73206d75737420686176652074797065202761202a20696e74202d3e207072657474792c202762202a20696e74202d3e207072657474792c202e2e2e2077697468206f6e652066756e6374696f6e20666f722065616368207479706520706172616d65746572 15849:S27|56414c55455f4f505328292e636f646556616c2836295f2d283129 15850:D3,1060|3b650c7303ff55245053ba84287bb29090e83e9aedffa80175618b4c24148b5134f6c20175358b1a813bd4e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01756fba7c787cb2f6c201753c8b1a813bd4e539b27523eb05e9900300008b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebbfbe0100000083fe01750c8b10b8287c7cb28b5d04ff138b16813ad4e539b274168b18b854eb7ab2eb05e90d0000008b5d04909090ff138b5a08eb1a8b16813ad4e539b2740d8b18b854eb7ab28b5d0490ff138b5a08ff30538b5c2420b888e28db290e8322cecff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000f6c101740db8ecd57ab28b5d04909090ff1389cbb80100000090e86250edff53506814757bb26a018b5c24108b442418ba94477bb290e80a68edff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701a0e28db28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1389c3b80100000090e8ba4fedff53506814757bb26a018b5c24148b442420ba94477bb290e86267edff8b4d008d49c43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c7009c9a7ab28d480cc741fc02000000894104c701c4e28db28d410cc740fc05000000894810c7400c01000000c7400801000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1389c66814757bb26884348ab2bb14757bb28b44242cba94348ab29090e89a53fcff5689c18b44241089ca90ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70080dc7bb28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c70080dc7bb28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c70080dc7bb28d480cc741fc020000008941045883c40889018b45008d40e83b45087303ff5520894500c740fc05000000894810c7400c01000000c7400803000000c7400401000000c70001000000a801740c89c1b8ecd57ab28b5d04ff1350b8010000008b54241090ff128b4d008d49e43b4d087303ff5520894d00c741fc0100000089018d4108c740fc040000008b54241489500c5b895808894804c700030000008b4c24148b590cc703030000008b513083c4085e83c41056ff22b80100000083c408c21000900000000020040000|@15856,2097151,@3585|11,0,@6509 18,1,@6714 42,0,@4671 92,0,0 102,0,@7313 115,0,@4671 172,0,0 184,0,@7368 197,0,@4671 206,0,@6377 234,0,@4671 243,0,@6377 264,0,@15851 270,1,@4940 303,0,3 313,0,@6321 328,0,0 334,1,@6511 341,0,@6696 356,0,@6596 362,1,@6597 393,0,0 414,0,@5592 433,0,@15852 453,0,0 460,0,0 467,0,0 473,0,0 484,0,@6321 496,0,0 502,1,@6511 509,0,@6696 524,0,@6596 530,1,@6597 561,0,0 582,0,@5592 601,0,@15854 621,0,0 628,0,0 635,0,0 641,0,0 652,0,@6321 664,0,@6696 669,0,@14093 674,0,@6696 683,0,@14094 690,1,@14095 733,0,0 754,0,@6812 803,0,@6812 852,0,@6812 905,0,0 912,0,1 919,0,0 925,0,0 936,0,@6321 947,0,0 1010,0,1 1023,0,1 1041,0,0 15851:S13|417267756d656e7420666f7220 15852:O2|3,@15853 15853:S14|526571756972656420747970653a 15854:O2|3,@15855 15855:S14|417267756d656e7420747970653a 15856:S26|56414c55455f4f505328292e636865636b505054797065283629 15857:O3|2,@15858,0 15858:O1|@15859 15859:D3,24|b850e38db28b5d04909090ff139090900000000014000000|@15863,1,@3586|1,0,@15860 15860:O4|103,@4956,@15862,@15861 15861:O5|@15818,1039,0,1039,0 15862:S68|6164645072657474795072696e743a2054686520617267756d656e74207479706520776173206e6f7420612073696d706c65207479706520636f6e737472756374696f6e 15863:S25|56414c55455f4f505328292e636f646556616c283629283129 15864:O2|@15865,0 15865:O4|6,@15866,1,0 15866:O2|4,@5279 15867:O2|@15868,0 15868:O4|6,@15866,0,0 15869:O2|@15866,0 15870:O1|@15871 15871:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3587|1,0,@5280 15872:S7|61646450502d31 15873:O1|@15874 15874:D3,144|a801740583c0027105ff5538ebf6a801740783f8017c08eb14f640ff10740e89c1b8a4727db28b5d049090ff138b4d008d49d43b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000894804c7000900000089c18d400cc740fc04000000c7400c01000000c7400803000000894804c7000d000000c3909090000000008c000000|@15875,3,@3588|34,0,@7993 74,0,1 93,0,4 112,0,0 119,0,1 128,0,6 15875:S44|56414c55455f4f505328292e636f646556616c2836297072696e7446756e6374696f6e2d617267732d283129 15876:O2|@15877,0 15877:O4|6,@15878,1,0 15878:O2|4,@14033 15879:O1|@15880 15880:D3,92|a801740783f8017c08eb12f640ff10740c89c1b8a4727db28b5d04ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000058000000|@8043,3,@3589|20,0,@7993 58,0,0 77,0,4 15881:O1|@15882 15882:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3590|1,0,@5280 15883:S7|61646450502d32 15884:O1|@15885 15885:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3591|1,0,@5280 15886:D3,420|3b650c7303ff55248b4804833909756aff7104ff74240cff74240c8b4108909090e8daffffff8338057519b901000000894c240c8b1c2483c4045983c40451e95004eeff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c2080083390575678b51048b128b71088b36f6c3017409f6060174042b1e7105ff5538ebf783c301f6c301740783fb017c08eb12f643ff10740cb840f77bb28b5d049090ff13f6c301740783fb017e59eb06f643ff107551f6c301740583eb027105ff5538ebf68b45008d40f0eb05e9990000003b45087303ff5520894500c740fc03000000c740080100000089580489108b542408909090ff128b5c2404909090e80e10eeffeb3ef6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c7000500000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c20800833903740cb8e4b58db28b5d049090ff138b4104c208009000000000a0010000|@15819,1048575,@3592|44,0,0 64,1,@6843 97,0,0 112,0,6 178,0,@6871 256,0,0 282,1,@6874 307,0,@6876 346,0,2 381,0,4 394,0,@15816 15887:O1|@15888 15888:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3593|1,0,@5280 15889:S5|6164645050 15890:O1|@15891 15891:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3594|1,0,@5280 15892:S12|416464507265747479285029 15893:O3|2,@15894,0 15894:O1|@15895 15895:D3,24|b8e4e88db28b5d04909090ff139090900000000014000000|@15863,1,@3595|1,0,@15896 15896:O4|103,@4956,@15862,@15897 15897:O5|@15818,909,0,909,0 15898:O3|2,@15899,0 15899:O1|@15900 15900:D3,24|b854e98db28b5d04909090ff139090900000000014000000|@15904,1,@3596|1,0,@15901 15901:O4|103,@4956,@15903,@15902 15902:O5|@15818,1049,0,1049,0 15903:S68|546865207370656369616c2066756e6374696f6e20506f6c794d4c2e736f757263654c6f636174696f6e2063616e6e6f74206265207573656420617320612076616c7565 15904:S31|56414c55455f4f505328292e636f646556616c2836296765744c6f63283129 15905:O4|@4608,@5398,@15907,@15906 15906:O5|@15818,903,0,903,0 15907:S42|4f7665726c6f6164656420476574507265747479202d2077726f6e6720696e7374616e63652074797065 15908:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9b80ceeff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3597|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 15909:O1|@15910 15910:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3598|1,0,@5280 15911:S9|676574507265747479 15912:O4|@4608,@5398,@15914,@15913 15913:O5|@15818,888,0,888,0 15914:S43|4f7665726c6f61646564204d616b65537472696e67202d2077726f6e6720696e7374616e63652074797065 15915:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9e80aeeff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3599|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 15916:O2|@15917,0 15917:O3|14,@15918,0 15918:O2|@5278,@15919 15919:O2|@15920,0 15920:O3|2,10000,0 15921:O3|2,@15922,0 15922:O1|@15923 15923:D3,320|3b650c7303ff55248b08f6c101750e89c2b808a87cb28b5d049090ff1383f90175698b08f6c101750c89c2b808a87cb28b5d04ff1383f901740f89c1b804ef8db28b5d04909090ff138b4d008d49ec3b4d087303ff5520894d00c741fc040000008b501089510c8b580c8959088b70088971048b78048939bba8ed8db28b410c90e822010000e92523ecff8b08f6c101750f89c2b808a87cb28b5d04909090ff1383f90375628b08f6c101750c89c2b808a87cb28b5d04ff1383f903740f89c1b8c4ef8db28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b58048919bbf0ef8db28b019090e85a49edffba10d686b2e964e7f8ff8b08f6c101750e89c2b808a87cb28b5d049090ff1383f907740f89c1b83cf08db28b5d04909090ff138b4004c3909090000000003c010000|@15935,1048575,@3602|18,0,@7422 44,0,@7422 61,0,@15924 121,0,@15922 130,1,@15927 135,1,@4953 149,0,@7422 176,0,@7422 193,0,@15928 241,0,@15930 250,1,@6547 255,0,@12781 260,1,@12782 274,0,@7422 293,0,@15933 15924:O4|101,@6569,0,@15925 15925:O5|@15926,98,0,98,0 15926:S30|6d6c736f757263652f4d4c436f6d70696c65722f5072657474792e736d6c 15927:D3,88|3b650c7303ff5524a801753e53ff70048b0089daff12508b5c24088b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000054000000|@6329,1048575,@3600|75,0,0 15928:O4|101,@6569,0,@15929 15929:O5|@15926,108,0,108,0 15930:O1|@15931 15931:D3,16|b841000000c39090000000000c000000|@15932,1,@3601|1,0,32 15932:S22|5072657474792e75676c795072696e74283129283129 15933:O4|101,@6569,0,@15934 15934:O5|@15926,118,0,118,0 15935:S19|5072657474792e75676c795072696e74283129 15936:O1|@15937 15937:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3603|1,0,@5280 15938:S12|6d616b65737472696e672829 15939:O1|@15940 15940:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3604|1,0,@5280 15941:O3|2,63,0 15942:D3,96|3b650c7303ff5524a80175438b08833909740e8b5004b83cfd7bb28b5d0490ff13ff71048b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@3605|23,0,@6885 80,0,0 15943:O1|@15944 15944:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3606|1,0,@5280 15945:S13|6d616b65737472696e67285029 15946:O4|@4608,@5398,@15948,@15947 15947:O5|@15818,861,0,861,0 15948:S38|4f7665726c6f61646564205072696e74202d2077726f6e6720696e7374616e63652074797065 15949:O1|@15950 15950:D3,16|b801000000c39090000000000c000000|@7374,1,@3607|1,0,0 15951:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9cc04eeff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3608|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 15952:O1|@15953 15953:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3609|1,0,@5280 15954:S7|7072696e742829 15955:O1|@15956 15956:D3,16|b801000000c39090000000000c000000|@7374,1,@3610|1,0,0 15957:O2|@7202,0 15958:O1|@15959 15959:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3611|1,0,@5280 15960:O1|@15961 15961:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3612|1,0,@5280 15962:S8|7072696e74285029 15963:O4|@4608,@5398,@15965,@15964 15964:O5|@15818,797,0,797,0 15965:S16|636f646556616c202d20466f726d616c 15966:D3,120|3b650c7303ff55245289c38b4208909090e876000000833805751e8b0c24ba010000008b5c24048954240489da8b590483c40452e937f6edff8b0c2489c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4904894808895004c7000d00000083c404c30000000074000000|@15863,1048575,@3614|18,1,@15967 31,0,0 53,1,@6843 89,0,0 104,0,6 15967:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9adf5edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3613|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 15968:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e991f4edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3615|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 15969:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e975f3edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3616|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 15970:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15971,1048575,@3617|65,0,0 113,0,4 15971:S32|56414c55455f4f505328292e636f646556616c2836296c6f6164566172283129 15972:D3,12|8b4204c30000000008000000|@15863,5,@3618| 15973:S22|56414c55455f4f505328292e636f646556616c283629 15974:D3,1776|3b650c7303ff5524f64004017572ff742404ff74240cff74241850ff72046870008eb2b80100000090e8b2e9edff53ff74242c8d4c2408518b5c2438bab8e37bb2e832eaedff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a83c418891189c389c89090e8b601eeff89c18b45008d40eceb05e9280000003b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c214008378040175705350ff742418ff742418ff742418ff7424188b5c242c8b5204ff12598b55008d52f03b55087303ff5520895500c742fc03000000c74208010000008b09894a04c702050000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104b4857ab25b89198b5d008d5bd8eb05e9790000003b5d087303ff5520895d00c743fc02000000894b0489138d4b0cc741fc0200000089590489018d410cc740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740a5983c41451e9a21eeeffc214008b480883390775708b7104bf26fb8db28d7cb7fcffe7909090e9c3000000909090e93b000000909090e954020000909090e9df020000909090e923000000909090e91b000000909090e9f6020000909090e90b000000909090e9bf03000090909053ff742414ff742414ff742414ff7424148b5c2428eb05e9500400008b5204909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a891189c389c890e8daffedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c214006a016a01f644241401754e8b542414f642040175448b7204837e0401753b8b3e8b028b0883390d750f8b49048b093b650c7303ff5524ebec8b0783380d750f8b40048b003b650c7303ff5524ebec89e2890a89e1894104eb1189e2c702e4107bb289e2c74204e4107bb28b45008d40f03b45087303ff5520894500c740fc03000000c7002c018eb28b0c248948048b5424048950088060ffbf833b05751f8b75008d76f83b75087303ff5520897500c746fc010000008b7b04893eeb05be0100000083fe0175748b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc02000000c7400401000000891889cb909090e89efeedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000eb05e90600000083c408c214008b45008d40ec3b45087303ff5520894500c740fc04000000c700f0078eb289580489480889500c8060ffbf89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7000500000083c408c21400f644240c01750a8b54240c837a0401740db82c088eb28b5d04909090ff138b3253ff7424148b5c241c8b06ba70088eb29090e8be0a00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a891189c389c890e8a6fdedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c214008b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b4c2404894804c70005000000c21400f644240c01750a8b54240c837a0401740bb8640d8eb28b5d0490ff138b3253ff7424148b5c241c8b06ba70088eb29090e8fe0900008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a891189c389c890e8e6fcedff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc02000000c7400401000000890890e8b60e000089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400810767ab2894804c70007000000c21400f644240c01750a8b54240c837a0401740e8b08b82c0e8eb28b5d049090ff138b3253ff30bb010000008b06baa80b7cb2909090e8760ceeff68700e8eb289c38b442404ba240f8eb2909090e8b60f00008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000083c4045a891189c389c89090e8eefbedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c2140053ff742414ff742414ff742414ff7424148b5c24288b52049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a891189c389c890e876fbedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c21400909000000000ec060000|@16031,2097151,@3638|31,0,@15975 36,0,0 42,1,@6834 61,0,@6835 66,1,@6837 97,0,0 114,1,@6881 154,0,1 166,0,3 234,0,0 245,0,2 276,0,@5490 347,0,0 356,0,14 388,0,0 395,0,1 410,1,@6933 429,0,$15974+442 577,0,0 590,1,@6881 623,0,1 635,0,3 735,0,@6455 744,0,@6455 774,0,@15977 832,0,0 868,0,0 877,0,2 894,0,0 906,1,@6881 939,0,1 951,0,3 994,0,@15998 1040,0,0 1049,0,2 1077,0,@15999 1103,0,@16002 1110,1,@16003 1141,0,0 1154,1,@6881 1187,0,1 1199,0,3 1233,0,0 1246,0,2 1271,0,@16013 1295,0,@16002 1302,1,@16003 1333,0,0 1346,1,@6881 1377,0,1 1389,0,3 1406,0,0 1414,1,@16016 1447,0,1 1454,0,@5352 1463,0,3 1490,0,@16017 1507,0,0 1514,0,@6907 1522,1,@6908 1527,0,@16020 1538,0,@16026 1546,1,@16027 1577,0,0 1594,1,@6881 1627,0,1 1639,0,3 1701,0,0 1714,1,@6881 1747,0,1 1759,0,3 15975:D3,120|3b650c7303ff5524ff720c6a01ff7210ff721489c38b42088b4a0489ca909090ff128338057516b9010000008b1424890c24bb0300000052e953eaedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000c3900000000074000000|@15976,1048575,@3620|40,0,0 51,0,1 57,1,@6843 90,0,0 97,0,1 106,0,6 15976:S40|56414c55455f4f505328292e6170706c7946756e6374696f6e283729676574436f6e737472283129 15977:D3,84|8b4d008d49dc3b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008d4110c740fc04000000c70094018eb28948048b4a048948088b5a0889580c8060ffbfc30000000050000000|@15997,15,@3627|27,0,0 36,0,2 52,0,@15978 15978:D3,40|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a0456e91d000000900000000024000000|@15996,2097151,@3626|27,1,@15979 15979:D3,220|3b650c7303ff5524a8017407b903000000eb068b088d4c0901f6c101740783f9097e45eb06f641ff10753d53506a09bb0100000090e846caf1ff81f8c0028eb2742aa801752c89c6bfc0028eb2b911000000d1e93bc9f3a68d7c3f018d7436018d4c09017406eb0a5350eb068b442410eb3c8b44240c8338077533f6400401752d8b4804f641040175248b5104837a0401751b8b198b7304833e0d750f8b76048b363b650c7303ff5524ebec89f0909090e8460000008b4c2404894c241089c35883c404ba20058eb25983c40451e9890200009000000000d8000000|@15995,2097151,@3625|13,0,1 48,0,0 54,1,@8870 60,0,@15980 73,0,@15980 78,0,8 178,1,@15981 197,0,@15990 207,1,@15991 15980:S4|636f6e76 15981:D3,172|3b650c7303ff552483380b740c89c1b88c038eb28b5d04ff138b480c8b51088b5a04833b01750e8b7004b8f4038eb28b5d0490ff13833b057565833b05740e8b7004b888a77bb28b5d0490ff138b7b088b73048b580489f090e8b6a4edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70160048eb28941048061ffbf6a016a0189e05089cb89f8909090e83a3cedff5883c404e961ffffff89c8c3909000000000a8000000|@15989,2097151,@3622|16,0,@15982 43,0,@15985 67,0,@6718 90,1,@6721 120,0,@15988 146,1,@6564 15982:O4|103,@4956,@15984,@15983 15983:O5|@15818,1155,0,1155,0 15984:S52|496e76616c6964207479706520286e6f742061207479706520636f6e737472756374696f6e2920286164644f7665726c6f616429 15985:O4|103,@4956,@15987,@15986 15986:O5|@15818,1153,0,1153,0 15987:S56|43616e6e6f7420696e7374616c6c20616e206f7665726c6f61642077697468696e206120737472756374757265206f722066756e63746f72 15988:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3621|62,0,0 72,0,0 15989:S42|56414c55455f4f505328292e6170706c7946756e6374696f6e283729666f6c6c6f775479706573283129 15990:O2|@15991,@4726 15991:D3,120|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc030000008b74240489710889590489018b7a048b3f52515389c389f890e84e0000008b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b04248b400483c4048908b801000000c20400900000000074000000|@15994,63,@3624|58,1,@15992 104,0,0 15992:D3,292|3b650c7303ff5524a80175618b083b197443f601017539f6c3017534f6c3017407ba03000000eb068b138d54120183c2088b3189dfff710489d1d1e93bc9f3a68d7c3f018d7436018d4c0901740aeb58ff7104eb58ff71048b4c24085a8b71088b7e04833f0375228b7208eb05e99f0000008b7e04833f0375108b49088b49048b49043b4f047557eb458b71088b7e04833f01754a8b72088b7e04833f01753f8b49088b4904eb0ae91d000000e9180000008b490cf6c1017509f6470c017503ff55383b4f0c7407eb1583c404eb108b4c2404894c24048b4004e921ffffffff30ff7424088b400490e812ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400b801000000c204009090900000000020010000|@15993,63,@3623|34,0,1 274,0,0 15993:S37|5052494e545f5441424c4528292e6164644f7665726c6f616428332966696c746572283129 15994:S28|5052494e545f5441424c4528292e6164644f7665726c6f6164283329 15995:S45|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283229 15996:S48|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283129283129 15997:S49|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f616447656e6572616c283129 15998:D3,40|3b650c7303ff55248b4a088b1c24890c24ff720c89de8b5a0456e9c1f9ffff900000000024000000|@15996,2097151,@3628|27,1,@15979 15999:O4|@4608,@5398,@16001,@16000 16000:O5|@15818,1100,0,1100,0 16001:S14|4f7665726c6f616420457175616c 16002:O4|@16003,@6997,@7102,@7190 16003:D3,424|3b650c7303ff55248b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d7108c746fc03000000c706400a8eb2894e048b7b04897e088066ffbf8b3bf7c701000000740583c7027105ff5538ebf68b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08897304893b5168700b8eb2ff74240cff7204ff7208ff720c909090e8eae8edff89c3b8b8c77ab2e876f2edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c70107000000588b00ba01000000a80175328b188b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b580489d83b650c7303ff5524ebca89d089cb9090e8b2f2edff909090e862e7ffff5053bb000d8eb2b803000000909090e8562eedff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c741042c0d8eb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c2040090909000000000a4010000|@16012,2097151,@3633|34,0,0 50,0,@16004 121,0,@16005 142,1,@6869 149,0,@6133 154,1,@6881 185,0,1 197,0,3 205,0,0 270,1,@6883 278,1,@15942 285,0,@16009 290,0,1 298,1,@6547 329,0,1 336,0,0 343,0,0 360,0,0 367,0,@16011 406,0,7 16004:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9ccecedff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3629|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16005:O1|@16006 16006:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16008,1048575,@3631|16,1,@16007 16007:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e921dfedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3630|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16008:S45|545950454944434f444528292e657175616c697479466f7254797065283329726573756c74436f64652d283129 16009:O1|@16010 16010:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3632|1,0,@5280 16011:S8|657175616c697479 16012:S31|545950454944434f444528292e657175616c697479466f7254797065283329 16013:O4|@4608,@5398,@16015,@16014 16014:O5|@15818,1113,0,1113,0 16015:S17|4f7665726c6f6164204e6f74457175616c 16016:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3634|39,0,1 92,0,0 16017:O4|@4608,@5398,@16019,@16018 16018:O5|@15818,1126,0,1126,0 16019:S16|4f7665726c6f61642054797065446570 16020:O1|@16021 16021:D3,24|b8a40e8eb28b5d04909090ff139090900000000014000000|@16025,1,@3635|1,0,@16022 16022:O4|@4608,@5398,@16024,@16023 16023:O5|@15818,722,0,722,0 16024:S28|6765744f7665726c6f6164496e7374616e63653a204d697373696e67 16025:S37|56414c55455f4f505328292e6765744f7665726c6f6164496e7374616e6365283329283129 16026:O2|@16027,@4726 16027:D3,48|3b650c7303ff55248b52048b128b4c2404895c24048b1c24890c2489de89c389d056e91d00000090000000002c000000|@16030,1048575,@3637|35,1,@16028 16028:D3,280|3b650c7303ff5524a80175678b083b19744ef6c3017541f60101753c8b31f7c6010000007407ba03000000eb068b168d54120183c20889de8b39ff7108ff710489d1d1e93bc9f3a68d7c3f018d7436018d4c09017410eb58ff7108ff7104eb55ff7108ff71048b4c24105a8b71088b7e04eb05e984000000833f03751b8b72088b7e04833f0375108b49088b49048b49043b4f04754beb458b71088b7e04833f01753e8b72088b7e04833f017533eb0ae923000000e91e0000008b49088b49048b490cf6c1017509f6470c017503ff55383b4f0c7407eb0983c404eb0458c208008b4c240c8b542408894c240c895424088b400483c404e904ffffff8b44240489c1b80100000089ca5983c40851ff220000000014010000|@16029,1048575,@3636|39,0,1 259,0,0 16029:S41|5052494e545f5441424c4528292e6765744f7665726c6f61642833297365617263684c697374283129 16030:S28|5052494e545f5441424c4528292e6765744f7665726c6f6164283329 16031:S28|56414c55455f4f505328292e6170706c7946756e6374696f6e283729 16032:D3,12|8b4204c30000000008000000|@15801,5,@3639| 16033:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3640|65,0,0 113,0,4 16034:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3641| 16035:S44|44454255474745525f28292e6d616b6556616c4465627567456e74726965732836296c6f6164566172283229 16036:S34|44454255474745525f28292e6d616b6556616c4465627567456e7472696573283629 16037:D3,380|3b650c7303ff55248b4c24088b5134f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756cba7c787cb2f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750d89c2b8287c7cb28b5d0490ff138b17813af4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837a08017544eb1e8b17813af4e539b2740e89c6b854eb7ab28b5d049090ff13837a080175248b45008d40f43b45087303ff5520894500c740fc02000000895804c70001000000c20c006a016a0189e656ff742418ff742414909090e8660000006a016a01ff74241cff7424188d442408508b5c24188b4424149090e85a98ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40c8908c20c0090900000000078010000|@16044,1048575,@3649|24,0,@4675 74,0,0 84,0,@7313 97,0,@4675 147,0,0 159,0,@7368 173,0,@4675 182,0,@6377 213,0,@4675 222,0,@6377 268,0,0 294,1,@16038 326,1,@15806 16038:D3,1056|3b650c7303ff552483f80175158b44240cc70001000000895804b801000000c20c008b088b116a016a01ff7004ff7304ff33ff730851ff72088d5c24188b029090e86efeecff8b4424048b088b51088b5a04833b0575718b75008d76f03b75087303ff5520897500c746fc030000008946088b7c241c897e04c706090000008b7d008d7ff43b7d087303ff5520897d00c747fc020000008b44240889470489378b45008d40f03b45087303ff5520894500c740fc030000008978088b7424108970048b74240ceb05e92800000089308b74242c8b7c24288b4c24248974242c897c2428894c242489c383c4145883c408e90bffffff8b34248b5c24288b06909090e82e030000508b44242c8b54241090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a89c890e8f603eeffeb0289c86a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c7016c198eb28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542430909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c7018c198eb28941048b5424348951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b45008d40f03b45087303ff5520894500c740fc030000008b4c240c8948088b4c2424894804c700090000008b4c24088b5104833a017570833a05750f89c3b808377bb28b5d04909090ff13833a0175148b5a08833b0375078b73048b36eb0c8b7304eb078b5a048b1b89de8b5d008d5bc43b5d087303ff5520895d00c743fc0100004089338d7308c746fc04000000c7460c010000008b7a04897e08895e04c70603000000eb05e9350000008d5e14c743fc030000008b5108895308897304c70370867ab28d7310c746fc030000008b7c2408897e08895e04c7060b000000eb248b75008d76f03b75087303ff5520897500c746fc03000000894e08894e04c7060b0000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241089510489318b55008d52e43b55087303ff5520895500c742fc02000000894a0489028d420cc740fc030000008950088b4c24188948048b4c240489086a016a0189e151ff74243cff74243c89c38b44243090e81efcffff833c240175068b442408eb0c8b1c248b442408e80e0200008b4c243c83c40489015883c408894104b80100000083c420c20c00909090000000001c040000|@16043,1048575,@3648|19,0,0 27,0,0 66,1,@6462 123,0,4 258,1,@16039 301,0,0 350,0,1 359,0,14 390,0,0 397,0,1 410,1,@6933 453,0,@16040 468,0,0 481,0,1 520,0,@16041 572,0,0 578,0,1 602,0,0 657,0,4 681,0,@6539 764,0,0 779,0,1 811,0,@5500 837,0,5 875,0,5 1014,1,@16042 1035,0,0 16039:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e97dd2edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3644|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16040:D3,12|8b4204c30000000008000000|@15801,5,@3645| 16041:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3646|65,0,0 113,0,4 16042:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3647| 16043:S51|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529666f6c64496473283229 16044:S41|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529 16045:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3650| 16046:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3651| 16047:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3652| 16048:O2|@16050,@16049 16049:O2|@16235,@16048 16050:D3,2252|3b650c7303ff5524833805756b8b48048b71108b368b79148b3f6a016a01575652ff742428ff742428ff7424288d54241852ff7424288b018b54241490e8beffffff6a016a018b442418833805753b8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e8248eb28941048061ffbf89e0eb05e912010000c7000100000089e0894804eb73b8030000008b54242c90ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70108258eb28941048b5424288951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74241889730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e0894804ff7424288b5c24308b44241090e86e08000083f80175058b0424eb0a89c38b0424e85e29000083f80175068b442414eb0d89c38b4424149090e89e290000508b44242c8b54240890ff126850478eb2ff742434ff742434ff7424308b5c24249090e86e2a00008b4c24285a83c41c8911894104b801000000c2140083380775728b480c8b098b75008d76e43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc04000000c7470cd8707ab2538b5c2414895f088b5c2410895f0489378b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000893b6a016a01515653ff7004eb05e9ac010000ff742430ff742430ff742430536a016888798eb28d44242850ff74243c8b5c24208b4424388b520490ff1258b901000000a8017532ff7004518b5c242c8b00909090e8be5b0000833c2401740a8b1c249090e83e63000089c183c404583b650c7303ff5524ebca89c8b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8f6042401740e89c1b8d0717cb28b5d049090ff1383c404598b0989c389c89090e83e53eeffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8837c240401740e89de8b5c240490e8da62000089f38b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000895904c7011d000000f6c301751d8b13833a05750f8b530489d33b650c7303ff5524ebe5ba01000000eb05ba0300000083fa01740c5089c89090e826faedffeb0589c289c8526858828eb2ff742428ff742428ff7424248b5c2414909090e8462800008b4c241c5a83c4108911894104b801000000c2140083380375718b4d008d49e43b4d087303ff5520894d00c741fc01000040c701010000008d7108c746fc04000000c7460cd8707ab28b7c2410897e088b7c240c897e04890e8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c747040100000089376a016a0153525157ff7004ff742430eb05e9f0000000ff742430ff742430576a0168b8828eb28d74242c56ff74243c8b58088b4424308b720489f290ff126a016a01ff742420ff742438ff7424388d44240c50ff7424388b5c242c8b44241c8b5424289090e87afbfffff644240c01740cb8d0717cb28b5d049090ff138b4424108b009090e86a51eeffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8833c240175068b4c241ceb1389c68b1c248b44241c90e8fe61000089c189f083f901740789cbe8466200008b4c242c83c40489015883c41c894104b801000000c2140083380975388b40088b0083f801750c89c1b84cc37bb28b5d04ff138b5c240c8b009090e85e6200008b4c2408c70101000000894104b801000000c214008b48048b71088b368b790c8b3f538b59108b1b8b4804528b511c8b128b40046a016a0153575652ff742434ff742434ff7424348d4c241c51ff7424348b5c24308b008b54242ce856faffff8b45008d40ec3b45087303ff5520894500c740fc04000000c700cc848eb28b4c24308948048b54242c8950088b5c240489580c8060ffbf505152ff7424308b5c24108b44242490e8f225000050b8030000008b542434ff128b4d008d49cc3b4d087303ff5520894d00c741fc01000040c701ffffffff8d5108c742fc01000040c70228e07bb28d5a08c743fc03000000895308894b04c703050000008d7310c746fc04000000c7460c01000000c74608409288b2895e04c70648c0520889018b4c2430890a5089f38b442410909090e8ea620000ff7424348b5c243c909090e806030000837c241401750c89c1b8ac868eb28b5d04ff138b4c24148b098b5108833a09755750ff72048b5c243c8b4208909090e82e640000833805750d6a018b5c2404e826c8edffeb6789c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d000000eb6f833a05756f8b5a048b1b8b72088b368b7c24348b0ff6c1017409f6060174042b0e7105ff5538ebf783c10189c28b45008d40f0eb05e9710000003b45087303ff5520894500c740fc03000000c74008010000008948048918528b57049090ff1289c18b45008d40f43b4508730feb0ae937000000e918000000ff5520894500c740fc02000000894804c70009000000eb18833a03740d89c3b8e4b58db28b5d0490ff1389c38b4204536a018b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54240c83c404891189c389c8e8aed7edff8b4d008d49cc3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc0400000089480c8b4c2404894808c7400401000000c700030000008d5014c742fc020000005b895a04890283fa0175068b442418eb0d89d38b4424189090e8b66300008b0c24f6c101740783f9017c08eb14f641ff10740e89c2b8a4727db28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702050000008d4a0cc741fc02000000895104c701090000008b54243083c4288902894a04b801000000c2140090909000000000c8080000|@16234,2097151,@3745|105,0,@16051 127,0,0 139,0,1 176,0,@16052 231,0,0 237,0,1 261,0,0 290,1,@16053 310,1,@16114 334,1,@16115 351,0,@16116 374,1,@16121 392,0,0 435,0,0 452,0,@5279 500,0,0 539,0,@16192 568,0,0 590,1,@16195 606,1,@16213 629,0,0 694,0,@7307 718,1,@7310 723,0,0 794,1,@16214 827,0,0 836,0,14 868,0,0 875,0,1 890,1,@6933 902,0,@16215 926,1,@16121 944,0,0 982,0,0 999,0,@5279 1046,0,0 1086,0,@16219 1166,0,@7307 1186,1,@7310 1191,0,0 1270,1,@16221 1286,1,@16222 1307,0,0 1332,0,@6769 1350,1,@16223 1360,0,0 1368,0,0 1476,0,@16224 1522,1,@16121 1528,0,1 1564,0,-1 1580,0,@6817 1602,0,2 1619,0,0 1626,0,@13377 1635,0,I48 1658,1,@16225 1674,1,@16053 1688,0,@16229 1726,1,@16232 1742,1,@6843 1777,0,0 1792,0,6 1877,0,0 1937,0,4 1951,0,@15816 1996,0,0 2014,1,@6881 2045,0,1 2057,0,3 2084,0,0 2090,0,1 2130,1,@16233 2158,0,@7993 2198,0,2 2217,0,4 2234,0,0 16051:D3,12|8b4204c30000000008000000|@15801,5,@3653| 16052:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3654|65,0,0 113,0,4 16053:D3,32|3b650c7303ff55248b4c2404894c2404e91f000000909090000000001c000000|@16113,2097151,@3686|17,1,@16054 16054:D3,276|3b650c7303ff5524a80175658b088b118b32833e05740e8b7804b854a48db28b5d0490ff1353ff7004ff710452ff7608ff7604b80300000089da9090ff12598901598b5424148911598b5904833b05750c89c6b808377bb28b5d04ff13833b0175198b7308833e03750c8b7e048b3feb11e98e0000008b7e04eb078b73048b3689f750ff74240c5289fb8b44240cbaf8268eb29090e8a60000008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c5883c404894108c7410401000000c7010300000051ff7424108b5c240c8b442408909090e822ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000010010000|@6329,2097151,@3685|27,0,@15795 52,0,1 84,0,@6539 143,0,@16055 150,1,@16056 191,0,0 197,0,1 261,0,0 16055:O5|@16056,@6836,@6997,@7102,@7190 16056:D3,2656|8d7c24803b7d0c7303ff55288b4804833905756b83790401756a8b75008d76e43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc04000000c7470cd8707ab28b4424088947088b44240489470489378b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000893883fb01eb0ae9bc050000e95b0200007425525650ff71086884318eb250ff7208ff720cff72108b5c24288b44241490e842caedffeb0d89c3b8c4757ab2525653ff71088b4c240c506810338eb2ff74240cff7108ff710cff71108b5c242c8b44241890e816ecedff8b4c24105068a0348eb2ff742410ff7108ff710cff71108b5c24308b44241ce81ef8edfff644240c01740c89c1b8d0717cb28b5d04ff138b4c24108b0989c389c89090e8f20d0000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4c24148b55008d52f43b55087303ff5520895500c742fc02000000c74204010000008b4904890a8b4d008d49e83b4d087303ff5520894d00c741fc02000000895104c701502f89b28d510cc742fc02000000894a04c702f0707ab289c689d09090e8bed2edff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c740040100000089188d500cc742fc020000008942045889028b45008d40e83b45087303ff5520894500c740fc0200000089500489088d480cc741fc020000008941045883c41089018b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740856e8f6efedffeb0156833c2401750683c404c2080089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c404c208008b75008d76e43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc04000000c7470cd8707ab28b4424088947088b44240489470489378b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008938bf01000000528b5104f6c201751ff7c701000000740583c7027105ff5538ebf68b52043b650c7303ff5524ebdc89fa8b3c24ff710853ff77046890368eb25650ff710452ff74242852ff74240c50bbe8368eb28d4424209090e84e0c0000837c24180174378b4c2420ff7110ff710cff7108ff74242868e43d8eb250ff742440ff74241cff742424ff74242cbbb83f8eb28d442414e8120c0000eb1289c1b8c4757ab26a016a016a016a016a01518b4c2438ff7110ff710cff7108ff74244068cc3f8eb250ff742458ff742434ff74243cff742444bba0418eb28d442414909090e8c60b00008b4c2450ff7110ff710cff7108ff74245868b4418eb250ff742470ff74244cff742454ff74245cbb88438eb28d442414909090e88e0b0000f644245001740c89c1b8d0717cb28b5d04ff138b4c24548b0989c389c89090e802180000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c88b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54243089118b55008d52e83b55087303ff5520895500c742fc02000000894a04c702502f89b28d4a0cc741fc02000000895104c701f0707ab289c689c890e866cfedff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c740040100000089188d500cc742fc020000008942045883c41489028b45008d40e83b45087303ff5520894500c740fc0200000089500489088d480cc741fc020000008941045883c45089018b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f90174095690e89aecedffeb0156833c2401750683c404c2080089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c404c2080052508b5c240c8b0889c8909090e89a1600006a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c7011c458eb28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b54241c909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c7013c458eb28941048b5424188951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b4424148b542404909090ff128b4c24088b5104833a05750f89c3b8d0458eb28b5d04909090ff13833a0375058b5a08eb038b5a0483fb0175098b5c240c8b5b04eb7589c6b8010000009090e84eceedff565089d9bb14468eb289c8e87e09edff8b4c24148b55008d52d03b55087303ff5520895500c742fc08000000c7421c03000000c7421801000000c74214030000008942105889420cc7420801000000c74204e8368eb28b4904890a8d5a24c743fc02000000eb05e90b000000895304c7030f000000eb01508b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089188d480cc741fc02000000894104c701502f89b28d410cc740fc020000008948049090c700f0707ab29090e856ccedff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008b0424833805750f516a01bb01000000e87abbedffeb338b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c74008010000008b1424895004c7000d000000518b4c24048339057514506a01bb0500000089c8909090e82abbedffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d000000528b4c24088339057511506a01bb0700000089c8e8debaedffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400807000000894804c7000d000000528b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b44240489018b45008d40f43b45087303ff5520894500c740fc020000008948045983c40889088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e886e8edffeb0289c8833c2401750683c410c2080089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c410c20800909090000000005c0a0000|@16112,2097151,@3684|52,0,0 69,0,@5279 116,0,0 146,0,@16057 170,1,@6869 179,0,@5348 195,0,@16061 222,1,@6928 232,0,@16065 258,1,@6956 272,0,@7307 294,1,@16069 299,0,0 386,0,0 424,0,@13615 443,0,@5281 454,1,@6881 485,0,1 492,0,@13616 501,0,3 518,0,0 615,0,0 624,0,14 656,0,0 663,0,1 674,1,@6933 730,0,10 766,0,0 783,0,@5279 830,0,0 837,0,0 894,0,@16070 915,0,@16072 926,1,@16073 955,0,@16085 977,0,@16090 986,1,@16073 995,0,@5348 1028,0,@16091 1050,0,@16096 1062,1,@16073 1084,0,@16097 1106,0,@16102 1118,1,@16073 1132,0,@7307 1154,1,@16103 1159,0,0 1242,0,0 1281,0,@13615 1300,0,@5281 1310,1,@6881 1341,0,1 1348,0,@13616 1357,0,3 1374,0,0 1474,0,0 1483,0,14 1515,0,0 1522,0,1 1534,1,@6933 1590,0,10 1614,1,@16104 1653,0,@16105 1668,0,0 1681,0,1 1720,0,@16106 1772,0,0 1778,0,1 1802,0,0 1845,0,@16107 1887,0,0 1894,1,@6884 1903,0,@16110 1910,1,@6547 1945,0,1 1952,0,0 1959,0,1 1973,0,0 1980,0,@16072 2011,0,7 2045,0,0 2066,0,@13615 2087,0,@5281 2094,1,@6881 2125,0,1 2132,0,@13616 2141,0,3 2157,0,0 2162,1,@6843 2195,0,0 2202,0,0 2214,0,6 2232,0,2 2242,1,@6843 2277,0,0 2284,0,2 2293,0,6 2311,0,3 2318,1,@6843 2353,0,0 2360,0,3 2369,0,6 2401,0,0 2516,0,0 2525,0,14 2556,0,0 2563,0,1 2578,1,@6933 2635,0,10 16057:O1|@16058 16058:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16060,1048575,@3656|16,1,@16059 16059:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e90db9edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3655|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16060:S42|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283129 16061:O1|@16062 16062:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16064,1048575,@3658|16,1,@16063 16063:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e981b7edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3657|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16064:S45|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283129 16065:O1|@16066 16066:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16068,1048575,@3660|16,1,@16067 16067:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9f1b5edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3659|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16068:S44|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283129 16069:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3661|64,0,0 16070:D3,12|8b4204c30000000008000000|@16071,5,@3662| 16071:S47|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832292d45 16072:S14|7072696e742d68656c7065722829 16073:D3,756|3b650c7303ff55248b4c24108b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d7208c746fc03000000c706083a8eb28956048b7904897e088066ffbf8b39f7c701000000740583c7027105ff5538ebf68b4d008d49e83b4d087303ff5520894d00c741fc0300000089510889710489398d7110c746fc01000040c70601000000538b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703383b8eb28973048063ffbf565768bc3b8eb2525150538d5c24108b44242c90e83e00edff89c38b442428ba74587cb2e8a620eeff8b4d008d49cc3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc01000040c700010000008d5008c742fc04000000894a0c59894a088b4c2404894a0489028d5a14c743fc020000008b7424208973048913505389c88b542408ff12f6042401740d89c1b8d0717cb28b5d0490ff1383c4045983c4088b0989c389c8909090e8b2040000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f801742689d98b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08894304c703150000005883c4088b00b901000000a80175328b108b75008d76f43b75087303ff5520897500c746fc02000000894e048b0a890e89f18b500489d03b650c7303ff5524ebca89c8e832c3edff598b09813c2448c05208742df604240175308b3424bf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb0989cab98cc77ab2eb0589ca8b0c2489d689cfe862c3edff56505753bb803d8eb28b4424209090e88efeecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b54240c895118c74114030000008941108b44240889410cc74108010000008b4424048941045883c41089018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c2100090909000000000f0020000|@16084,1048575,@3669|38,0,0 54,0,@16074 135,0,0 166,0,@16075 180,0,@16077 198,1,@6547 209,0,@7237 214,1,@7238 247,0,1 263,0,0 331,0,@7307 358,1,@16081 363,0,0 458,0,10 469,0,0 530,1,@6883 540,0,I48 556,0,I48 563,0,4 594,0,@6130 610,1,@6884 619,0,@16082 630,1,@6547 661,0,1 675,0,1 692,0,0 738,0,7 16074:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e904bdedff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3663|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16075:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@16076,15,@3664| 16076:S54|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832296d6b41646472283129 16077:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700083c8eb28948048b52048950088060ffbfc390900000000034000000|@16080,7,@3666|28,0,@16078 16078:D3,128|3b650c7303ff55248b08f6c101740bf642080174052b4a087105ff5538ebf683c1018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008948048b5204891089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@16079,1048575,@3665|64,0,1 113,0,4 16079:S56|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129283129 16080:S53|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129 16081:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3667|64,0,0 16082:O1|@16083 16083:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3668|1,0,@5280 16084:S45|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229 16085:D3,48|3b650c7303ff5524b9283e8eb28b3424890c2453ff7208ff720cff721089c38b420456e9f4b3edff000000002c000000|@16071,2097151,@3672|9,0,@16086 36,1,@6869 16086:O1|@16087 16087:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16089,1048575,@3671|16,1,@16088 16088:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e969acedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3670|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16089:S45|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283229283129 16090:S10|657175616c6974792829 16091:D3,48|3b650c7303ff5524b910408eb28b3424890c2453ff7208ff720cff721089c38b420456e914d4edff000000002c000000|@16071,2097151,@3675|9,0,@16092 36,1,@6928 16092:O1|@16093 16093:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16095,1048575,@3674|16,1,@16094 16094:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e981aaedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3673|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16095:S48|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283229283129 16096:S11|626f7865646e6573732829 16097:D3,48|3b650c7303ff5524b9f8418eb28b3424890c2453ff7208ff720cff721089c38b420456e958deedff000000002c000000|@16071,2097151,@3678|9,0,@16098 36,1,@6956 16098:O1|@16099 16099:D3,28|3b650c7303ff55248b088b58088b01e91c0000000000000018000000|@16101,1048575,@3677|16,1,@16100 16100:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e999a8edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3676|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16101:S47|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283229283129 16102:S6|73697a652829 16103:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3679|64,0,0 16104:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9cda6edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3680|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16105:D3,12|8b4204c30000000008000000|@15801,5,@3681| 16106:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3682|65,0,0 113,0,4 16107:O4|@4608,@5398,@16109,@16108 16108:O5|@6866,1172,0,1172,0 16109:S15|416c726561647920636865636b6564 16110:O1|@16111 16111:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3683|1,0,@5280 16112:S32|545950454944434f444528292e636f646547656e657261746976654964283429 16113:S47|535452554354555245535f28292e67656e636f6465537472756374732832296c6f61644f7061717565496473283329 16114:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3687| 16115:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3688| 16116:O1|@16117 16117:D3,24|b884478eb28b5d04909090ff139090900000000014000000|@16120,1,@3689|1,0,@16118 16118:O4|11,@4879,0,@16119 16119:O5|@14950,2783,0,2783,0 16120:S53|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835292d45 16121:D3,56|3b650c7303ff55246a016a0189e151ff742418ff742418ff742424ff74241c9090e8260000005883c404c210009090900000000034000000|@16191,2097151,@3724|34,1,@16122 16122:D3,916|3b650c7303ff55246a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e44b8eb28941048061ffbf89e2c7020100000089e2894a04eb745053b8030000008b542420ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c701044c8eb28941048b54241c8951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74240489730c894308c7430401000000c703030000008d4314c740fc02000000eb05e918000000c740040100000089188d5c240889038d442408894804eb025053b8010000008b0c24f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe0a801740783f8017d08eb1af640ff107514a801740a81f8fdffff017c14eb06f640ff10750c89c1b834f67ab28b5d04ff1389c1f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f891758a801756b8b088b55008d52f83b55087303ff5520895500c742fc010000008b5904891a8b31f7c601000000740783fe017d08eb20f646ff10751a8b37f7c601000000740bf6010174063b317f16eb05ff5538ebf58b7004b8b0f57ab28b5d049090ff138b31f7c601000000740ceb05e91e00000083c6027105ff5538ebf6895477fe8b40043b650c7303ff5524e96effffffb8010000008b07b90100000083f801747089c283ea0289c383eb0283e802a801740583c0027105ff5538ebf68b4447fe83f801750c89c6b84cc37bb28b5d04ff138b75008d76f43b75087303ff5520897500c746fc020000008b00894604891e8b45008d40f43b45087303ff5520894500c740fc02000000894804893089c1eb05e90f00000089d03b650c7303ff5524e977ffffff6a016a01ff74241cff742424ff74242cff74241cff742428b8984c8eb2508d5c241889c8e8a2010000837c240401741c8b4424288b4c24088908c7400403000000b80100000083c414c214008b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008b0c24894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740690e82eceedff837c240c01742a89c18b45008d40f03b45087303ff5520894500c740fc030000008948088b4c240c894804c700150000008b4c24288901c7410401000000b80100000083c414c21400900000000090030000|@16190,2097151,@3723|43,0,@16123 58,0,0 72,0,1 108,0,@16124 163,0,0 169,0,1 193,0,0 217,0,0 279,0,16777214 296,0,@6401 325,0,0 458,0,@6397 517,0,0 524,0,0 572,0,@6769 690,0,@16125 702,1,@16126 726,0,1 731,0,0 768,0,0 780,0,14 812,0,0 819,0,1 830,1,@6933 879,0,10 892,0,0 897,0,0 16123:D3,12|8b4204c30000000008000000|@15801,5,@3690| 16124:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3691|65,0,0 113,0,4 16125:O1|@16122 16126:D3,208|3b650c7303ff5524a80175736a016a0153ff30ff742428ff742428ff742428ff742428ff742428ff7424288d5c24208b4004909090e8c6ffffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240889088b4c24288b5424248b5c24208b74241c8b7c2418508b442418508b44240ceb05e92c00000089442430894c242c89542428895c242489742420897c241c588b4c2414894424145b5883c40c51e934000000c70301000000c7430403000000b801000000c2180090909000000000cc000000|@6729,2097151,@3722|172,1,@16127 178,0,0 185,0,1 190,0,0 16127:D3,2456|8dbc2470ffffff3b7d0c7303ff55288b48048339037567ff338b59048b41088b54241c90ff128338097558ff70048b5c241c8b4008e872090000833805750d6a018b5c2404e8329dedffeb6789c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d000000eb6be9dd00000083380575668b48048b098b40088b008b5424188b1af6c3017409f6000174042b187105ff5538ebf783c3018b4500eb05e9720000008d40f03b45087303ff5520894500c740fc03000000c740080100000089580489088b4a0489ca9090ff1289c18b4500eb0ae93c000000e9200000008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb15833803740d89c1b8e4b58db28b5d0490ff138b40046a018b4d008d49f43b4d087303ff5520894d00c741fc0200000083c4045a89510489018b44241c8908c7400401000000b801000000c21c0083390575718b510c8b75008d76e43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc04000000c7470cd8707ab2ff7104ff7304ff338b5c241c895f088b5c2420895f0489378b5d008d5bf43b5d087303ff5520895d00c743fc02000000c7430401000000893bff742414eb05e96d06000053ff710cff742414ff720cff742434ff32ff742434684c588eb26a016a015653ff30ff710cff32ff71088d44241850bb6c658eb28b420c909090e8feefecff8b44241c909090e85e88fbff909090e8e6150000508b5c24048b44241cba84287bb290e8de28edffa8017570ff30bb24e681b28b44240ce8babbebff8b0d24f075b789c389c890e85e9febff8b0524f075b7ff7010bb983d7ab290e886d9ebffb801000000ba04668eb290e8021600008b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b042489018b0554e939b289c289c8eb05e91e00000090ff12ba88668eb283c404909090e852160000b824728eb28b5d0490ff136a016a0189e050bb74728eb28b442410e82aefecff83c40458909090e84691edff909090e8862200006a016a018b4c240889c25083f901751383fa017407b801000000eb53b803000000eb4cf6c20175428b01ff7204ff7104ff328b0889c890e82ab9ecff83380d751f8b0c248b40043b0175158b54240883c4045983c4043b650c7303ff5524ebabb80100000083c40ceb05b80100000083f80174518b4424748d5424309090ff128b4c24188b5108833a0175258b5c241cf6c3017509f64204017503ff55383b5a047407bb01000000eb0cbb03000000eb05bb010000008d74240489068d442404895804eb6bf604240174348b44240ce8f291edffff7424208d4c2434518b5c247cbab8e37bb290e87292edff8d4c240489018d442404c7400401000000eb70b8010000008b0c24f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe08b4c24748b5500eb05e91c0300008d52e83b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc03000000c7037c738eb28953048b71048973088063ffbfeb05e9dd0200008b39f7c701000000740583c7027105ff5538ebf68b4d008d49f03b4d087303ff5520894d00c741fc0300000089510889590489395768ac748eb25052518d5c240c9090e8c6e5ecff89c38b442414ba74587cb2e82e06eeff8b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc02000000c70288768eb2894a048062ffbf8b5d008d5bcc3b5d087303ff5520895d00c743fc02000000894304c703030000008d430cc740fc01000040c700010000008d7008c746fc04000000895e0c8956088b142489560489068d5e14c743fc020000008b7c2434897b04893389ce508b442424909090e85a90edff5653538d4c2454518b5c2414bab8e37bb29090e8da90edfff6042401740d89c1b8d0717cb28b5d0490ff138b4c240883c4048b0989c389c8909090e8e61eeeffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f801742689d98b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08894304c7031500000053bb48778eb28b44243490e8eeb7ebff8b4c24108b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e852a8edff8b4c24048b0981fb48c05208742bf6c301752f89debf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb0989cab98cc77ab2eb0489ca89d989d389ce90e882a8edff535056bb54778eb28b442420909090e8aee3ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542408895118c74114030000008941108b44240489410cc74108010000005883c4088941045883c41c89018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008d4c240489018d442404c7400401000000f644242001740bb8d0717cb28b5d0490ff138b44242483c4048b00909090e81e1deeffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f80175058b0424eb2989c18b45008d40f03b45087303ff5520894500c740fc030000008b1424895008894804c700150000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54245083c4048951048901837c2450017422833c24017415837c2454057407b801000000eb13b803000000eb0cb801000000eb05b8010000008b54247483c458890a894204b801000000c21c008b51086a016a018b7204833e01756aff7304ff33ff7104ff30ff76048b4424308b542428ff12833805750d6a018b5c2404e8fe94edffeb3089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d0000008b0c24f6c1017511f644240401750aeb05e927000000ff55383b4c24047407b901000000eb05b9030000008d54241483c40889028d44240c894804eb26ff7304ff33ff71048b5c242889d09090e8fa2000008d4c240c89018d44240cc74004010000006a016a0189e050ff742430ff742438ff742440ff7424348b5c241c8b4424288b5424349090ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c240c894804598908837c240c017413837c2414017507b901000000eb0a8b0c24eb05b9010000008b54243483c4188902894a04b801000000c21c00900000000094090000|@16189,2097151,@3721|54,1,@16128 70,1,@6843 105,0,0 120,0,6 208,0,0 269,0,4 283,0,@15816 340,0,0 345,0,0 386,0,0 403,0,@5279 458,0,0 497,0,@16129 523,0,@16143 534,1,@6564 546,1,@13871 554,1,@16145 568,0,@6509 574,1,@6714 585,0,@9768 594,1,@4940 600,0,@20261 610,1,@4897 616,0,@20261 624,0,@5078 630,1,@5038 635,0,0 640,0,@16146 646,1,@16147 684,0,@4753 703,0,@16151 714,1,@16153 719,0,@16171 737,0,@16174 746,1,@6564 758,1,@6830 766,1,@16177 792,0,0 799,0,1 826,1,@6447 867,0,0 877,0,0 934,0,0 941,0,1 948,0,0 978,1,@6834 996,0,@6835 1002,1,@6837 1019,0,0 1026,0,0 1102,0,0 1118,0,@16178 1196,0,@16179 1210,1,@6547 1221,0,@7237 1226,1,@7238 1256,0,0 1272,0,@16183 1312,0,1 1328,0,0 1386,1,@6834 1403,0,@6835 1410,1,@6837 1423,0,@7307 1450,1,@7310 1455,0,0 1550,0,10 1556,0,@16185 1566,1,@4940 1577,0,0 1646,1,@6883 1658,0,I48 1672,0,I48 1679,0,4 1710,0,@6130 1726,1,@6884 1734,0,@16186 1746,1,@6547 1777,0,1 1791,0,1 1808,0,0 1854,0,7 1871,0,0 1883,0,@7307 1906,1,@7310 1911,0,0 2014,0,10 2075,0,0 2082,0,1 2089,0,0 2096,0,0 2113,0,0 2170,1,@6843 2205,0,0 2220,0,6 2256,0,0 2263,0,1 2302,1,@16188 2319,0,0 2411,0,0 2423,0,0 2440,0,0 16128:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e99993edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3692|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 16129:D3,1644|3b650c7303ff55248b4a188b5908833b017569837a14017568ff73048b720489f2909090ff12833805750d6a018b5c2404e87e92edffeb3089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d0000008338057527b9010000008b542404894c2404eb0ae93e040000e943000000bb0300000083c40452e92092edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d00000083c404c3837a1403756dff730450528b42109090e8c2b0ecff833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b901000000f6c10175768b04248b480c8b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc03000000eb05e924030000c703cc5e8eb28953048b71048973088063ffbf8b39f7c701000000740583c7027105ff5538ebf68b45008d40f03b45087303ff5520894500c740fc03000000eb05e9db01000089500889580489388b1c24528b53049090ff12833805750d6a018b5c2410e80a91edffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b54240c895008894804c7000d0000008b4c24048b55008d52f03b55087303ff5520895500c742fc03000000c74208010000008b4908894a04c702050000008b4d008d49d83b4d087303ff5520894d00c741fc02000000c74104fc5f8eb289118d510cc742fc02000000894a0489028d420cc740fc03000000c7400801000000895004c7001d000000f6c201751d8b0a833905750f8b4a0489ca3b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e8d6beedff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e826a1edff909090e89ea1edff5053bb08608eb2b803000000909090e8cadcecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c40cc38b04248b48048b44240489ca9090ff12833805750d6a018b5c240ce8328fedffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b542408895008894804c7000d0000008b0c248b55008d52f03b55087303ff5520895500c742fc03000000c74208010000008b4908894a04c702050000008b4d008d49d83b4d087303ff5520894d00c741fc02000000c7410434608eb289118d510cc742fc02000000894a0489028d420cc740fc03000000c7400801000000895004c7001d000000f6c201751d8b0a833905750f8b4a0489ca3b650c7303ff5524ebe5b901000000eb05b90300000083f901740883c40ce9ffbcedff83c40cc3ff73048b720489f2909090ff128338057514b9010000008b542404894c24045b52e9298eedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c3837a1401756d8b352ce939b28b3d34e939b28b0d3ce939b28b1d44e939b2508b45008d40e83b45087303ff5520894500c740fc0500000089481089580c897008897804c70048c05208ff721c6a01ff7220508b5c24108b4218bab8bc8db2e8625fffff8338057522b9010000008b542404eb05e947000000894c2404bb0300000083c40452e96b8dedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d00000083c404c3837a1403756c8b352ce939b28b3d34e939b28b0d3ce939b28b1d44e939b2508b45008d40e83b45087303ff5520894500c740fc0500000089481089580c897008897804c70048c052088b4a1c8b5c2404894c2404be010000008b3c24893424ff72205089d889fb89c68b421856e9040200008b352ce939b28b3d34e939b28b0d3ce939b28b1d44e939b2508b45008d40e83b45087303ff5520894500c740fc0500000089481089580c897008897804c70048c052088b4a1c8b5c2404894c2404be010000008b3c24893424ff72205089d889fb89c68b4218bab8bc8db256e9235effff9090900000000068060000|@16142,2097151,@3700|50,1,@6843 85,0,0 100,0,6 110,0,0 135,0,1 144,1,@6843 177,0,0 184,0,1 193,0,6 218,1,@6447 259,0,0 300,0,0 323,0,@16130 422,1,@6843 457,0,0 473,0,6 508,0,0 520,0,2 551,0,@16131 585,0,0 594,0,14 626,0,0 633,0,1 646,1,@6933 654,0,0 722,1,@6883 730,1,@6884 737,0,@16132 742,0,1 750,1,@6547 781,0,1 788,0,0 795,0,1 812,0,0 819,0,@6130 858,0,7 894,1,@6843 929,0,0 945,0,6 979,0,0 991,0,2 1022,0,@16134 1056,0,0 1065,0,14 1097,0,0 1104,0,1 1117,1,@6933 1144,0,0 1159,1,@6843 1192,0,0 1207,0,6 1223,0,@4748 1229,0,@4749 1235,0,@4750 1241,0,@4751 1284,0,I48 1305,0,@15827 1310,1,@15829 1320,0,0 1340,0,1 1349,1,@6843 1382,0,0 1389,0,1 1398,0,6 1414,0,@4748 1420,0,@4749 1426,0,@4750 1432,0,@4751 1475,0,I48 1491,0,0 1516,1,@16135 1522,0,@4748 1528,0,@4749 1534,0,@4750 1540,0,@4751 1583,0,I48 1599,0,0 1623,0,@15827 1629,1,@15829 16130:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e94098edff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3693|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16131:O2|@5278,@5490 16132:O1|@16133 16133:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3694|1,0,@5280 16134:O2|@5348,@5490 16135:D3,540|3b650c7303ff552450538b480c89c89090e896a9ecff833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b901000000f6c10175728b04248b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c70270628eb2894a048b5804895a088062ffbf8b30f7c601000000740583c6027105ff5538ebf68b7d008d7ff03b7d087303ff5520897d00c747fc03000000894f08895704eb05e90d010000893789ce8b4424149090e8960200005657ff74242050ff742420ff742420bbcc707ab28b44241cbac4bc8db29090e83e98ffff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8ce9aedff909090e8469bedff5053bb28648eb2b803000000909090e872d6ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c408c210008b44241490e8420200008b4c24188b5424108b5c240c8b342489742418894c2414894424108954240c8b442408895c2408bbc4757ab289c68b442404bac4bc8db283c40856e91a97ffff90900000000018020000|@16141,2097151,@3699|18,1,@6447 59,0,0 97,0,0 113,0,@16136 198,1,@16137 218,0,@5278 227,0,@15828 234,1,@15974 242,0,0 310,1,@6883 318,1,@6884 325,0,@16138 330,0,1 338,1,@6547 369,0,1 376,0,0 383,0,1 400,0,0 407,0,@6130 446,0,7 462,1,@16140 506,0,@5348 517,0,@15828 526,1,@15974 16136:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e99c94edff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3695|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16137:D3,116|3b650c7303ff5524a80175578b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000c74104010000008b108911518b500489d090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,7,@3696|39,0,0 46,0,0 100,0,0 16138:O1|@16139 16139:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3697|1,0,@5280 16140:D3,116|3b650c7303ff5524a80175578b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000c74104010000008b108911518b500489d090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,7,@3698|39,0,0 46,0,0 100,0,0 16141:S29|56414c55455f4f505328292e636f6465457846756e6374696f6e283629 16142:S96|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296c6f6164436f6465283129 16143:O1|@16144 16144:D3,16|b801000000c39090000000000c000000|@6563,1,@3701|1,0,0 16145:D3,88|3b650c7303ff5524a801753d8b0883790401742b518b400490e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b7ffffffb801000000c3900000000054000000|@5094,3,@3702|74,0,0 16146:O2|@16147,@4752 16147:D3,16|8b52048b1289d0c3000000000c000000|@16148,5,@3703| 16148:S29|706f6c79436f6d70696c65722832297072696e7444657074682d283129 16149:O1|@16150 16150:D3,16|b8706d7ab2c39090000000000c000000|@5228,1,@3704|1,0,@5227 16151:O3|@16153,@16152,77 16152:O2|@16169,@20261 16153:D3,48|3b650c7303ff55248b4a088b1c24890c2468e8668eb26834678eb289de8b5a0456e9960000009090000000002c000000|@16168,1048575,@3711|18,0,@16154 23,0,@16157 34,1,@16159 16154:O1|@16155 16155:D3,16|b801000000c39090000000000c000000|@16156,1,@3705|1,0,0 16156:S22|506f6c794d4c2e7072657474795072696e742d283129 16157:O1|@16158 16158:D3,16|b801000000c39090000000000c000000|@16156,1,@3706|1,0,0 16159:D3,92|3b650c7303ff552453ff74241053ff742418ff742418ff742418bb010000009090e84a000000a801750af6442410017503ff55383b442410740db8150000005a5983c40c51ff22b80100000083c404c20c0090900000000058000000|@16167,1048575,@3710|27,0,0 34,1,@16160 59,0,10 72,0,0 16160:D3,552|3b650c7303ff552483380575078b442414c21400833809754aff70088b40048b54241490ff128b442418a801740bf604240174052b04247105ff5538ebf683c001a801740783f8017f13eb06f640ff10740bb80100000083c404c2140083c404c214008338077559ff70048b04248b5424149090ff1259f6c1017407b803000000eb068b018d4400018b4c2414f6c1017408a80174042bc87105ff5538ebf783c101f6c101740783f9017f10eb06f641ff107408b801000000c2140089c8c2140083380375658b4804ff7004f6c101740783f9017e2feb06f641ff10752751b8410000008b542418ff1258a801740583e8027105ff5538ebf689c13b650c7303ff5524ebc78b442418a801740bf604240174052b04247105ff5538ebf683c001a801740c83f8017f18eb0be917000000f640ff10740bb80100000083c404c2140083c404c21400f6c301740ef640040174088d5bff0358047105ff5538ebf38b700c8b780853ff70108b5c241ce8ca00000083f801754e565789f08b54241890ff12ff742424ff742424ff742414ff742428b8c86b8eb250ff74242cff74242cff74241cbb010000008b442428e84e020000508b4424088b54241890ff125883c410c2140056ff3089f08b5424189090ff128b4424088b4c2424a801752dff700451ff742428ff742428ff742428ff7424288b5c24248b0090e802feffff89c1583b650c7303ff5524ebcf8b4424048b54241490ff125883c40cc214009090900000000024020000|@16166,1048575,@3709|83,0,0 125,0,1 181,0,0 224,0,32 311,0,0 366,1,@16161 403,0,@16163 421,0,0 430,1,@16164 16161:D3,384|3b650c7303ff55248338057506b801000000c38338097550f6c301740df640080174073b58087c3aeb05ff5538ebf4f6c301740bf640080174052b58087105ff5538ebf683c3018b45008d40f83b45087303ff5520894500c740fc010000008918c3b801000000c3833807755a8b4004a8017407b903000000eb068b088d4c0901f6c1017409f6c30174043bcbeb05ff5538ebf77f36f6c3017409f6c10174042bd97105ff5538ebf783c3018b45008d40f83b45087303ff5520894500c740fc010000008918c3e906000000b801000000c38338037550f6c301740df640040174073b58047c3aeb05ff5538ebf4f6c301740bf640040174052b58047105ff5538ebf683c3018b45008d40f83b45087303ff5520894500c740fc010000008918c3b801000000c38b4d008d49f83b4d087303ff5520894d00c741fc0100000089198b4010a801752c83f9017507b901000000eb12ff70048b198b009090e89efeffff89c1eb03ff7004583b650c7303ff5524ebd089c8c390000000007c010000|@16162,11,@3707|14,0,0 99,0,0 117,0,1 205,0,0 290,0,0 334,0,0 16162:S32|506f6c794d4c2e7072657474794d61726b757028352967657453697a65283229 16163:O1|@16160 16164:D3,1328|3b650c7303ff5524a80175648b088339057562ff7004b8150000008b54242090ff128b44241ca801740783f8017e30eb06f640ff10752850b8410000008b542424909090ff1258a801740583e8027105ff5538ebf63b650c7303ff5524ebc78b442418a8017419f644241c017412eb0ae9aa040000e9640000002b44241c7105ff5538ebf583c0018b4c24208b54241c8b5c24188b7424148b7c2410508b442410508b442410508b44240889442430894c242c89542428895c242489742420897c241c8b442404894424185883c40889442408bb0100000058e922ffffff8339017570f6c3017410f64424180174098d5bff035c24187105ff5538ebf2ff7004ff742424ff742424ff742420ff74241cff74241c89c88b5424289090ff128b4c24208b54241c8b5c24188b7424148b7c2410508b442410508b442410508b44240889442430894c242c89542428895c2424eb05e92300000089742420897c241c8b442404894424185883c40889442408bb0100000058e985feffff8339097571ff7004ff71088b41048b542424909090ff128b442428a801740bf604240174052b04247105ff5538ebf683c0018b4c242483c4048b54241c8b5c24188b7424148b7c2410508b442410508b442410508b44240889442430894c242c89542428895c242489742420897c241c8b442404eb05e917000000894424185883c40889442408bb0100000058e9f3fdffff8339077571ff7004ff71048b04248b54242490ff1259f6c1017407b803000000eb068b018d4400018b4c2424f6c1017408a80174042bc87105ff5538ebf783c1018b4424208b54241c8b5c24188b7424148b7c2410518b4c2410518b4c2410518b4c2408894c24308944242c89542428895c2424eb05e92300000089742420897c241c8b442404894424185883c40889442408bb0100000058e955fdffff8378040175078b442420c220008b542418f6c201740ef641080174088d52ff0351087105ff5538ebf3837c240401755c8b5c2420f6c301740df641040174073b59047f07eb5cff5538ebf4f6c301740bf641040174052b59047105ff5538ebf683c3018b7004ff7004ff710852ff7104f7c60100000075518b0683380375288b4d008d49f83b4d08730aeb05e965000000ff5520894d00c741fc010000008919eb41e943000000909090e8e2faffffa801750f8b188b76043b650c7303ff5524ebaeb901000000eb1a8b4d008d49f83b4d087303ff5520894d00c741fc01000000891983f901756feb16ff7004ff710852ff7104eb0aff7004ff710852ff7104b8150000008b54242cff128b442404a801740783f8017e30eb06f640ff10752850b8410000008b542430909090ff1258a801740583e8027105ff5538ebf63b650c7303ff5524ebc78b442424a8017414f644240401eb05e96800000074062b4424047105ff5538ebf583c0018b4c242c8b5424288b5c24248b7424208b7c241c508b44241c508b44241c508b4424088944243c894c243889542434895c24308974242c897c24288b442404894424245883c408894424148b5c240883c40c58e991fbffff8b0424a801740783f8017e30eb06f640ff10752850b8410000008b542430909090ff1258a801740583e8027105ff5538ebf63b650c7303ff5524ebc78b442430a801740bf604240174052b04247105ff5538ebf683c0018b4c242c8b5424288b5c24248b7424208b7c241c508b44241c508b44241c508b4424088944243c894c243889542434895c24308974242c897c24288b442404894424245883c40889442414bb0100000083c40c58e9e1faffff8b442420c220009090000000002c050000|@16165,1048575,@3708|23,0,10 57,0,32 212,0,0 369,0,0 515,0,0 553,0,1 673,0,0 854,1,@16161 878,0,0 940,0,10 973,0,32 1157,0,32 1298,0,0 16165:S41|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329646f5072696e74283329 16166:S31|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329 16167:S22|506f6c794d4c2e7072657474794d61726b7570283529 16168:S28|506f6c794d4c2e7072657474794d61726b7570283129283129283129 16169:D3,68|3b650c7303ff55248b4a048b095289c389c8909090e87a7debff8b04248b400483c4048b008b48108b1424890c24bb983d7ab252e997b7ebff9090900000000040000000|@16170,2097151,@3712|22,1,@4897 47,0,@5078 53,1,@5038 16170:S15|54657874494f2e7072696e74283129 16171:O4|@4608,@5398,@16173,@16172 16172:O5|@14950,2601,0,2601,0 16173:S27|756e6966795479706573206661696c656420696e20706173732033 16174:O1|@16175 16175:D3,16|b801000000c39090000000000c000000|@16176,1,@3713|1,0,0 16176:S97|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e28322964657374566172732d283129 16177:D3,92|3b650c7303ff5524a80175418b088b510483e20983fa01742a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,7,@3714|78,0,0 16178:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e99083edff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3715|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16179:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700f8748eb28948048b52048950088060ffbfc390900000000034000000|@16182,7,@3717|28,0,@16180 16180:D3,128|3b650c7303ff55248b08f6c101740bf642080174052b4a087105ff5538ebf683c1018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008948048b5204891089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@16181,1048575,@3716|64,0,1 113,0,4 16181:S118|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129283129 16182:S115|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129 16183:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@16184,15,@3718| 16184:S113|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d6d6b4164647273283129 16185:S3|285029 16186:O1|@16187 16187:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3719|1,0,@5280 16188:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e94973edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3720|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 16189:S85|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e283229 16190:S71|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d61746368537562537472756374757265283229 16191:S51|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e73283529 16192:O1|@16193 16193:D3,44|8b48088b108b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000028000000|@16194,7,@3725| 16194:S61|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f646528352970726f63657373426f6479283129 16195:D3,428|3b650c7303ff5524833801756b8b40088b008b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000c7420cd8707ab2c74208d87b8eb2895a04890a8d4a14c741fc02000000c74104010000008911ba010000005153a8017528ff7004ff742404ff74240ceb05e91c00000089d38b00e8f601000089c2583b650c7303ff5524ebd489d083c408c383380375428b4004b90100000053a801752fff7004518b5c24088b00e846ffffff833c2401740a8b1c249090e83206000089c183c404583b650c7303ff5524ebcd89c883c404c38b4008b901000000a80175738b108b5a0c8b1b83fb01750d8b5004b84cc37bb28b5d04ff138b1b8b7304833e05740e8b5004b854a48db28b5d0490ff138b7e048b3ff7c701000000740783ff017c08eb14f647ff10740e8b5004b8a4727db28b5d0490ff138b55008d52dc3b55087303ff5520895500c742fc02000000eb05e93d000000897a04c702050000008d7a0cc747fc02000000895704c707090000008d570cc742fc02000000894a04893a89d18b40043b650c7303ff5524e947ffffff89c8c300000000a8010000|@16212,2097151,@3733|44,0,0 61,0,@5279 68,0,@16196 90,0,0 97,0,0 130,1,@16202 162,0,0 198,1,@16211 228,0,0 252,0,@6769 275,0,@15795 315,0,@7993 361,0,2 380,0,4 16196:O1|@16197 16197:D3,24|b80c7c8eb28b5d04909090ff139090900000000014000000|@16201,1,@3726|1,0,@16198 16198:O4|@4608,@5398,@16200,@16199 16199:O5|@14950,2889,0,2889,0 16200:S10|747970655661724d6170 16201:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229747970655661724d61702d283129 16202:D3,336|3b650c7303ff5524833805755a8b400453ff7424088b5c24108b400490e842010000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8833c2401750b83c404c20800e9100000008b1c2483c4045983c40851e94c0200008338037530538b5c240c8b4004e89202000089c18b45008d40f43b45087303ff5520894500c740fc020000005a8950048908c20800833807756f8b0d2ce939b28b1534e939b28b353ce939b28b3d44e939b2538b5d008d5be83b5d087303ff5520895d00c743fc05000000897310897b0c894b08895304c70348c05208ff7424086a0168cc7e8eb2538b5c241c8b4004bab8bc8db2e8263fffff89c18b45008d40f43b4508730aeb05e916000000ff5520894500c740fc020000005a8950048908c2080089d8c20800909090000000004c010000|@16210,2097151,@3731|30,1,@16203 35,0,0 120,1,@16208 138,1,@16209 184,0,@4748 190,0,@4749 196,0,@4750 202,0,@4751 245,0,I48 256,0,@16204 269,0,@15827 274,1,@15829 16203:D3,192|3b650c7303ff5524a80175718b0d2ce939b28b1534e939b28b353ce939b28b3d44e939b2538b5d008d5be83b5d087303ff5520895d00c743fc05000000897310897b0c894b08895304c70348c05208ff7004ff74240c6a0168cc7e8eb2538b5c24148b00bab8bc8db2e86a3effff50ff7424108b5c240c8b442408eb05e92e000000909090e876ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c2040000000000bc000000|@6329,2097151,@3728|14,0,@4748 20,0,@4749 26,0,@4750 32,0,@4751 75,0,I48 89,0,@16204 101,0,@15827 106,1,@15829 177,0,0 16204:O17|@4755,@4756,@4757,@4758,@16205,@4749,I48,@7316,@7321,@4759,@4748,@4754,@12723,0,@4751,@4750,@7327 16205:O1|@16206 16206:D3,16|b801000000c39090000000000c000000|@16207,1,@3727|1,0,0 16207:S18|4c45585f28292e6e756c6c4c65782d283129 16208:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3729| 16209:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9156bedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3730|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 16210:S60|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f6164537472646563732832296c6f616456616c73283229 16211:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3732| 16212:S49|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229 16213:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3734| 16214:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3735| 16215:O1|@16216 16216:D3,24|b88c828eb28b5d04909090ff139090900000000014000000|@16120,1,@3736|1,0,@16217 16217:O4|11,@4879,0,@16218 16218:O5|@14950,2771,0,2771,0 16219:O1|@16220 16220:D3,44|8b48088b108b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000028000000|@16194,7,@3737| 16221:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3738| 16222:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3739| 16223:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e91967edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3740|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 16224:D3,144|3b650c7303ff55248b4a0cf6c101740d89c6b8bc7e7ab28b5d0490ff1383f80175078b098b4904eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebc78b41048338057536ff7204ff720889c8baf8268eb2e8e6a1ffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c38b01c3909090000000008c000000|@16120,2097151,@3741|19,0,@5417 85,0,@16055 90,1,@16056 125,0,1 16225:D3,204|3b650c7303ff5524a80175738b088b51048b32833e01740d8b7804b850868eb28b5d04ff138b7d008d7ff03b7d087303ff5520897d00c747fc03000000895f08538b5e04895f04c707090000008b5d008d5be43b5d087303ff5520895d00c743fc030000008b72088973088b7204897304893b8d7b10c747fc02000000eb05e93a000000895f048b09890f578b5c24048b40049090e866ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c300000000c8000000|@6329,63,@3742|28,0,@16226 73,0,4 191,0,0 16226:O4|@4608,@5398,@16228,@16227 16227:O5|@14950,2717,0,2717,0 16228:S37|6d616b6553656c65637465643a204e6f7420426f756e64206f72206e6f7420466f726d616c 16229:O4|@4608,@5398,@16231,@16230 16230:O5|@14950,2726,0,2726,0 16231:S22|46756e63746f724170706c3a20756e646566696e6564 16232:D3,264|3b650c7303ff55248b4804833909755bff71048b4108909090e8e2ffffff8338057514b9010000008b542404894c24045b52e9d163edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383390575738b51048b128b71088b368b3bf7c7010000007409f6060174042b3e7105ff5538ebf783c7018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089780489108b5304ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833903740bb8e4b58db28b5d0490ff138b4104c39090900000000004010000|@15819,1048575,@3743|36,0,0 51,1,@6843 84,0,0 99,0,6 176,0,0 221,0,4 239,0,@15816 16233:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3744| 16234:S47|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f6465283529 16235:D3,1044|3b650c7303ff5524f6c30175708b0b833901756e8b75008d76b43b75087303ff5520897500c746fc01000040c706010000008d7e08c747fc020000008977048b710489378d4f0cc741fc02000000c741040100000089398d710cc746fc01000040c706010000008d7e08c747fc0800000089771cc7471803000000eb0ae92c030000e9b80000008b7424148977148b74242089771089470c8b74241c8977088b7424188977048b74240489378b75008d76dc3b75087303ff5520897500c746fc08000000c706cc8c8eb28956048946088b5b04895e0c8b44241c8946108b5424188956148b5c240c895e188b44240489461c8066ffbf6a016a0157568d74240856bb0100000089c8ba708d8eb2e8d6030000833c240175068b442418eb0c8b1c248b442418e8aa3402008b4c241083c404890158894104b801000000c2200083390375708b75008d76e83b75087303ff5520897500c746fc05000000c706d0be90b28956048b7b04897e088b5c240c895e0c8b7c2404897e108066ffbf8b5d008d5be83b5d087303ff5520895d00c743fc05000000c70388bf90b28953048b7904897b0889730c8b7424048973108063ffbfeb05e9590000008b7c24208b74241c508b44241c528b54241c538b5c241cff71088b4c2418518b4c2418897c2434897424308944242c89542428895c24248b442408894424205889442418894c24145b83c4048b4424045a83c404e9eefdffff8b710c8b366a016a01ff73045052568d7c24105750ff7204ff742428ff742444ff742444ff7424508b59088b442454e856350200ff742430ff742420ff74243c8b5c24208b44240c909090e87a19ffff8b4d008d49d83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000c7420cd8707ab28b5c243483c404895a088b74242c897204890a8d7a14c747fc02000000c747040100000089176a016a01ff305157ff70045356576a01ff7424488d44242450ff7424488b5c243c8b4424388b54243490e81afdfffff6042401740db8d0717cb28b5d04909090ff1383c404588b009090e86ee6edffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8837c240401740c8b5c2404909090e83638020083f80175058b0424eb0a89c38b0424e87a38020083f80175068b442418eb0d89c38b4424189090e8ba38020083f80175068b442430eb0d89c38b4424309090e8fa3802008b4c242883c40889015883c414894104b801000000c2200089c18b45008d40e43b45087303ff5520894500c740fc060000008b5424148950148b5c24188958108b74241c89700c8b7c24208978088948048b4c241089088b54240c909090ff128b4c24088b1089118b5804895904b801000000c220000000000010040000|@17208,2097151,@4156|46,0,0 81,0,0 99,0,0 119,0,1 198,0,@16236 258,0,0 265,0,@16238 270,1,@16240 294,1,@17192 312,0,0 350,0,@17193 407,0,@17195 578,1,@17197 606,1,@15797 636,0,0 653,0,@5279 689,0,0 749,0,@7307 770,1,@7310 775,0,0 846,1,@17204 866,1,@17205 890,1,@17206 914,1,@17207 935,0,0 1029,0,0 16236:D3,100|3b650c7303ff55248b48046a016a01ff7110ff7210ff7214ff7114ff30ff72188d5c241853ff721c8b5a0c8b42088b4a0489ca90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000060000000|@16237,1048575,@3746| 16237:S33|434f444547454e5f50415253455452454528292e67656e636f6465283829283129 16238:O3|@16240,@16592,@16239 16239:O2|@17133,@16762 16240:D3,3664|8d7c24883b7d0c7303ff5528a80175118b088b318b3ebeb28d8eb28d74befcffe6e9e50d0000e913010000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e983060000909090e9a3000000909090e99b000000909090e954070000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e9c9070000909090e946080000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e950090000909090e91b000000909090e9f1090000909090e90b000000909090e9030000009090908b4c240c8b7424088b7c2404894c240c89742408897c24048b4004e9c2feffff8b098b71048b7e148b3f8b4c240cff700452ff7114ff7108ff7104ff31ff71108b4608e8fe0c0000837e0c0175185350ff760cff3657ff7610ff7608909090e8460d0000eb1289c189f85351ff760cff3657ff7610ff760889c38b04249090e8be0d00006a016a0189e390e8227deeff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2424894804c700010000006a016a018b4c24108b54240cf6c1017534f6c201752fff7204ff710450ff742444ff742444ff7424688b1a8b0190e8a23800008b5424045983c4043b650c7303ff5524ebc789e18b10891189e18b58048959048b4c24308b7134f7c60100000075358b3e813f14e639b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc3b90100000083f9017569b97c787cb2f6c10175358b31813e14e639b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01750cb8287c7cb28b5d049090ff138b0f813914e639b27412b854eb7ab28b5d04eb05e90800000090ff138b7108eb1c8b31813e14e639b2740db854eb7ab28b5d04909090ff138b4e0889ceff742434ff742440568b5c24448b442414ba48cb8eb290e8b63a000050ff742438ff742438ff7424448b5c24148b4424349090e8be81ffff8b188b70048b4424189090e84297000053ff74243cff74243cff74244889f3e89a81ffff83380175058b0c24eb128b70048b188b042490e87a97000089c1eb038b700489cb8b44242c83c404909090e8ba9700008b4d008d49d83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc01000040c700010000008d5008c742fc04000000894a0c8b4c243c894a088b4c2438894a0489028b4d008d49f43b4d087303ff5520894d00c741fc020000008b7c24408979048911837c242401745b8b5424288b7c241c53505183fa01751883ff01740cb8e43086b28b5d049090ff13b801000000eb6ef7c701000000740db8e43086b28b5d04909090ff138b028b088b59088b4304833803751483780c03750e8b48048b1f8919eb2ee94300000083380175088b5808833b03740cb8e0298ab28b5d049090ff138b49088b49048b49088b49048b0789018b7f048b52043b650c730aeb05e912000000ff5524e968ffffff89c2b8010000005352518b4424648b4d008d49dc3b4d087303ff5520894d00c741fc080000008b501c89511c8b58188959188b3c248979148971108b700c89710c8b78088979088b78048979048b3889396a016a01516838298fb28d4c240851bb010000008b4424408b54246490e8e2faffff837c24380174618b44243ca80175528b088b118b5a088b7304833e037511837e0c03750b8b7e04c70701000000eb25833e0175088b7e08833f03740f8b7804b8e0298ab28b5d049090ff138b4f04c701010000008b40043b650c7303ff5524ebaab801000000eb05b8010000008b44246c8b4d008d49dc3b4d087303ff5520894d00c741fc080000008b501c89511c8b58188959188b7424088971148b7c24048979108b780c89790c8b70088971088b70048971048b3089316a016a0151ff7424748d4c240851bb010000008b4424708b54246c909090e806fafffff644241001740cb8d0717cb28b5d049090ff138b4424148b009090e872deedffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8833c240175068b4c2408eb1389c68b1c248b44240890e8ce95000089c189f083f901740789cbe81696000083f80175068b442418eb0d89c38b4424189090e85696000083f80175068b44241ceb0d89c38b44241c9090e89696000083f80175068b442420eb0d89c38b4424209090e8d696000083f80175068b442448eb0d89c38b4424489090e8169700008b4c246c83c40489015883c460894104b801000000c20c008b098b74240c53ff700452ff7104ff7604ff7614ff368b5e088b44240c9090e83297000089c358e8e69f00008b4c241853ff7104ff31ff7108ff71148b5910e80e23ffff83380175058b0c24eb128b70048b188b042490e81aa0000089c1eb038b700483f90175068b44240ceb0e89cb8b44240c909090e852a000008b4c241c83c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b7918897a188b7914897a148972108b710c89720c8b71088972088b71048972048b3189328b7424148b7c24108954241889742414897c241089c38b4424045a83c408e921f8ffff8b316a016a0153ff700452ff7424208d4424105089f38b46048b7a0489fa909090ff12837c240c0175068b442408eb0f8b5c240c8b4424089090e8fe9f00008b4c24208b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a148b7c2410897a108b790c897a0c8b7908897a088b7904897a048b39893a8b7c241c8b74241889542420897c241c8974241889c38b4424045a83c410e974f7ffff8b098b71048b7e108b3f8b4d008d49e43b4d087303ff5520894d00c741fc06000000c70100368fb28951048b40048941088b44240889410c8979108b7c240c8979148061ffbf833e0175058b7604eb125352518b1e8b460490e812a1000089c6eb035352518b442410897c241859894c24108944240c8b5c240489f05a83c404e9eff6ffff8b098b71048b7e088b3f538b5e0c8b1b8b49048b49108b098b742410ff7004525351ff7608ff36ff7604ff3424ff742408ff742410ff76148b5e1089f8909090e8f220ffffff30ff742404ff74240cff7424148b58048b44241c9090e88a7bffffff30ff742408ff742410ff7424188b58048b4424249090e88219ffff83380175058b0c24eb128b70048b188b042490e8aea0000089c1eb038b700483f90175068b442404eb0e89cb8b442404909090e8e6a0000083f80175068b442424eb0d89c38b4424249090e826a100008b4c243483c41c8b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b7918897a188b7914897a148972108b710c89720c8b71088972088b71048972048b3189328b7424148b7c24108954241889742414897c241089c38b4424045a83c408e9b5f5ffff8b098b74240c8b7804528b410490e8fea000005357ff7604ff36ff76088b5e109090e88a7affff83380175068b4c2404eb158b70048b188b442404909090e832a1000089c1eb038b70048b4424188b55008d52dc3b55087303ff5520895500c742fc080000008b581c895a1c8b7818897a188b7814897a148972108b700c89720c8b70088972088b70048972048b3089328b7424148b7c24108954241889742414897c241089cb5883c4045ae904f5ffff8b318b38538b5c2410ff70048b460452ff31ff7604ff7610ff7704ff33a801756f8b088b510c8b12ff7004ff7108f6c20175528b028b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701a4398fb28b5c24088959048b7424188971088b3c2489790c8061ffbfff720489cb8b480c89c8e826a100005a3b650c7303ff5524eba983c404583b650c730aeb05e905000000ff5524eb83b8010000008b44242c83c404ff7008ff30ff7004ff7424048b5c24148b481089c89090e84aa40000ff7004ff30ff742408ff742410ff7424188b5c24248b442420bad4408fb290e886a7000083f80175058b0424eb0a89c38b0424e8a6ac00008b4c243c83c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a148b3c24897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a0150ff7114ff7108ff7104528d5c24148b442434909090e892ac00008b44243c57ff7424048b5c24408b48088b44242089caff12837c2418017507b901000000eb508b4c2418ba0100000050f6c101751cff710489d38b01909090e826ad000089c2593b650c7303ff5524ebdf89d06a016a018b4c244cff7424108d542404528b5c24508b5104909090ff125983c404eb01508b44243cba01000000a80175328b188b730c8b3683fa01741689cfff700489d389f09090e81eb1000089c689f9eb03ff700489f2583b650c7303ff5524ebca89d051ff742410ff74240cff74241cff7424248b5c24389090e8121dffff83380175058b0c24eb128b70048b188b042490e82ab1000089c1eb038b700483f90175068b442404eb0e89cb8b442404909090e862b1000083f80175068b44241ceb0d89c38b44241c9090e8a2b1000083f80175068b442450eb0d89c38b4424509090e8e2b100008b4c246083c4488b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b7918897a188b7914897a148972108b710c89720c8b71088972088b71048972048b3189328b7424148b7c24108954241889742414897c241089c38b4424045a83c408e9f5f1ffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c240c89480489188b542408ff128b4c24048b1089118b5804895904b801000000c20c00000000004c0e0000|@16591,2097151,@3888|23,0,$16240+38 354,1,@16241 382,1,@16242 414,1,@16243 426,1,@7832 463,0,0 514,1,@16308 569,0,@4679 619,0,0 629,0,@7313 642,0,@4679 692,0,0 702,0,@7368 717,0,@4679 724,0,@6377 750,0,@4679 757,0,@6377 792,0,@16317 798,1,@16318 826,1,@16037 842,1,@16465 862,1,@16037 886,1,@16466 910,1,@16467 943,0,0 959,0,0 1054,0,@11846 1066,0,0 1081,0,@11846 1142,0,@14045 1198,0,0 1282,0,@16468 1292,0,0 1351,0,0 1374,0,@14045 1390,0,0 1408,0,0 1415,0,0 1510,0,0 1538,0,@7307 1558,1,@7310 1563,0,0 1642,1,@16471 1658,1,@16472 1682,1,@16473 1706,1,@16474 1730,1,@16475 1754,1,@16476 1775,0,0 1814,1,@16477 1822,1,@16539 1846,1,@15825 1870,1,@16540 1902,1,@16541 2074,1,@16542 2224,0,@16543 2278,1,@16546 2386,1,@15825 2414,1,@16037 2442,1,@15813 2466,1,@16547 2498,1,@16548 2522,1,@16549 2650,1,@16550 2670,1,@16037 2698,1,@16551 2891,0,@16552 2930,1,@16554 2967,0,0 3002,1,@16563 3032,0,@16565 3038,1,@16567 3058,1,@16573 3166,1,@16574 3202,0,0 3213,0,0 3234,1,@16575 3294,0,0 3326,1,@16586 3378,1,@15825 3402,1,@16587 3434,1,@16588 3458,1,@16589 3482,1,@16590 3649,0,0 16241:D3,80|3b650c7303ff5524a80175338b088b51048b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3747|64,0,0 16242:D3,132|3b650c7303ff5524a80175678b088b118b5a088b7304833e05750e8b7804b808377bb28b5d0490ff13833e0175148b7e08833f0375078b4f048b09eb0c8b4f04eb078b7e048b3f89f9518b4004e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000080000000|@6329,63,@3748|31,0,@6539 116,0,0 16243:D3,264|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b088b51048b12ff7304ff700452ff33ff71148b42049090e8c6000000508b4424049090e86e0100006a016a016a0189e15189c38b442410e8e20100008b45008d40ec3b45087303ff5520894500c740fc040000008b4c241889480c8b4c24048948085983c4048948048b4c240c89088b4d008d49f43b4d087303ff5520894d00c741fc020000005a83c4108951048901518b5c24088b4424049090e826ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c390900000000004010000|@8211,2097151,@3781|19,0,@8209 30,0,0 46,0,@8209 82,1,@16244 94,1,@16245 114,1,@16246 16244:D3,160|3b650c7303ff5524a801756d8b088b510c833a0575248b5d008d5bf43b5d087303ff5520895d00c743fc020000008b72048973048b39893beb238b5d008d5bf43b5d087303ff5520895d00c743fc02000000c74304ec7d7ab28b318933538b700489f09090e896ffffff89c18b45008d40f43b4508730aeb05e914000000ff5520894500c740fc02000000894804598908c3b801000000c3000000009c000000|@6329,63,@3749|85,0,@5413 147,0,0 16245:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@3750|51,0,6 100,0,0 16246:D3,472|3b650c7303ff552453e8de0100006a016a01837c240801751389e1c701acb67ab289e1c74104f0707ab2eb72b9010000008b542408f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf89c389ceb8010000009090e85651ffff5350bbcca38eb289f09090e84e98ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000eb05e904010000c74114010000008941105889410cc7410801000000c74104f8a38eb2c701acb67ab28b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000b9010000008b54240cf6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf89c389ceb801000000e89e50ffff5350bb0ca48eb289f09090e89697ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941105889410cc7410801000000c74104f8a38eb2c701f0707ab28b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008d4c24085a89118d4c2404894104eb01508b5c240c58e8420300008b4c24108b54240489115a83c408895104894108b801000000c20400909000000000d4010000|@16307,2097151,@3780|10,1,@16247 29,0,@5897 38,0,@5281 45,0,0 91,0,0 98,1,@15942 105,0,@16251 114,1,@6547 145,0,1 152,0,0 166,0,0 180,0,0 187,0,@16253 193,0,@5897 226,0,7 231,0,0 277,0,0 282,1,@15942 289,0,@16254 298,1,@6547 329,0,1 336,0,0 343,0,0 357,0,0 364,0,@16253 370,0,@5281 403,0,7 430,1,@16256 455,0,0 16247:D3,176|3b650c7303ff5524a801755e8b088b5104833a0375258b5d008d5bf43b5d087303ff5520895d00c743fc020000008b31897304c70301000000eb34ff7004ff3189d0909090e87a0000008b5d008d5bf43b5d087303ff5520895d00c743fc0200000059894b048903eb08e933000000ff7004538b4424049090e882ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c300000000ac000000|@6329,2097151,@3753|53,0,0 70,1,@16248 163,0,0 16248:D3,272|3b650c7303ff552483380b756b8b480c8b51088b5a04833b057562833b05740d8b7004b888a77bb28b5d04ff138b7b088b73048b580489f090e8ae05edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70118a38eb28941048061ffbf6a016a0189e05089cb89f8909090e8329decffeb0ae914000000e9090000005883c404e975ffffffb805000000c38338057506b803000000c38338077560f640040175138b480483790401750a8b118b4204e946ffffffb9010000008b4004a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c889c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b805000000c390000000000c010000|@16250,2097151,@3752|36,0,@6718 58,1,@6721 88,0,@16249 114,1,@6564 140,0,2 151,0,1 187,0,0 258,0,2 16249:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3751|62,0,0 72,0,0 16250:S30|44415441545950455f52455028292e6765745475706c654b696e64283129 16251:O1|@16252 16252:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3754|1,0,@5280 16253:S10|626f7865642f73697a65 16254:O1|@16255 16255:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3755|1,0,@5280 16256:D3,884|3b650c7303ff5524a80175598b088339017557837804017556ff7104bbcc707ab2b8b41883b2909090e85a030000813c2448c052087427f604240175378b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017516b98cc77ab2eb12e93c010000e937010000e9320100008b0c2489cb89c6b80100000083c4049090e83e4cffff505356bbbcac8eb2b8030000009090e83293ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbc4757ab2b8b41883b2e8960700008b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801740989c8e8f673edffeb0289c889c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3a80175408b088339057539837804017533ff7104b8c4777ab29090e81e0e000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3a80175408b088339037539837804017533ff7104b8c4777ab29090e8da0d000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3a80175408b08f601017539837804017533ff7104b8c4777ab29090e8960d000089c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c389c1ba01000000f6c10175258b31833e01740ff6c201740583c2027105ff5538ebf68b710489f13b650c7303ff5524ebd689d183f90375118b0c24890424b80100000051e9b916000083f9017555b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c10175108b11f641ff107402f7da8d541201eb0289ca83ea028b0c2489142489c3b80100000051e9531a0000b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c10175108b11f641ff107402f7da8d541201eb0289ca83ea028b0c2489042452b80100000051e96b1c00009090900000000070030000|@16306,1048575,@3779|29,0,@5278 34,0,@9994 42,1,@16257 49,0,I48 65,0,I48 70,0,4 95,0,@6130 124,0,0 134,1,@15942 142,0,@16260 147,0,1 154,1,@6547 185,0,1 192,0,0 199,0,0 216,0,0 262,0,7 268,0,@5348 273,0,@9994 278,1,@16262 309,0,0 358,0,0 367,0,14 378,1,@6933 415,0,0 443,0,@5383 450,1,@16274 483,0,0 511,0,@5383 518,1,@16274 551,0,0 579,0,@5383 586,1,@16274 619,0,0 629,0,0 689,0,0 695,1,@16293 705,0,0 779,0,0 785,1,@16298 790,0,0 863,0,0 869,1,@16302 16257:D3,1088|3b650c7303ff55248b08bad6a78eb28d548afcffe290e9ed000000909090e985010000909090e92f020000909090e955020000909090e953020000909090e951020000909090e9dd020000909090e95a030000909090e90b000000909090e9ce0300009090908b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089189090e84a53edff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c741084c767ab2894104c701070000008d4114c740fc02000000c7400401000000890890e80253edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400810767ab2894804c70007000000c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918e8aa52edff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c741084c767ab2894104c701070000008d4114c740fc02000000c7400401000000890890e86252edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400810767ab2894804c70007000000c3f640040174138b48088b5004b8ecd57ab28b5d04909090ff138b48048b09f6c101750e8b5008b808a87cb28b5d0490ff13833b057516ff7008516a0189d8bb010000009090e84e41edffeb348b50088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000895804c7000d000000525189c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c404894804c7001b000000c38b48088b50048b45008d40ec3b45087303ff5520894500c740fc0400000089480c895808895004c7001b000000c3b8f0707ab2c3b8f0707ab2c38b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b4004894104c701050000008b45008d40e83b45087303ff5520894500c740fc02000000c740040100000089188d500cc742fc02000000894204890a89d0e85e01000089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c740086c757ab2894804c70007000000c3833b057517ff7008ff70046a0189d8bb0100000090e8fe3fedffeb378b48088b50048b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000895804c7000d000000515289c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c404894804c7001b000000c3833b057516ff700cff70046a0189d8bb01000000e87a3fedffeb378b480c8b50048b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000895804c7000d000000515289c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c8948085983c404894804c7001b000000c3b8f0707ab2c390000000003c040000|@16259,1048575,@3757|11,0,$16257+22 129,0,0 138,1,@6881 169,0,1 176,0,@5356 185,0,3 202,0,0 210,1,@6881 243,0,1 250,0,@5352 259,0,3 291,0,0 298,1,@6881 329,0,1 336,0,@5356 345,0,3 362,0,0 370,1,@6881 403,0,1 410,0,@5352 419,0,3 437,0,@6321 463,0,@7422 487,0,0 494,1,@6843 530,0,0 537,0,0 546,0,6 597,0,13 643,0,13 649,0,@5281 655,0,@5281 687,0,0 699,0,2 730,0,0 754,1,@16258 787,0,1 794,0,@5341 803,0,3 824,0,0 830,1,@6843 869,0,0 876,0,0 885,0,6 936,0,13 957,0,0 962,1,@6843 1001,0,0 1008,0,0 1017,0,6 1068,0,13 1074,0,@5281 16258:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3756|39,0,1 92,0,0 16259:S29|44415441545950455f52455028292e636f6e7374724d61746368283229 16260:O1|@16261 16261:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3758|1,0,@5280 16262:D3,1400|3b650c7303ff55248b08bafeac8eb28d548afcffe290e99d010000909090e905020000909090e929020000909090e94d020000909090e948020000909090e9c1020000909090e9e5020000909090e984030000909090e90b000000909090e90505000090909083780401750389d8c353bb74b28eb28b400490e8a28aecff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e8ea6bedffeb0289c889c3b801000000e82e43ffff5053bb08b38eb2b803000000909090e8228aecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc02000000c74104010000005a891189c389c8909090e8264dedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c38b45008d40e43b45087303ff5520894500c740fc02000000c740040100000089188d480cc741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740789c8e99f6aedff89c8c38b48048b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70005000000c38b48048b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70005000000c389d8c38b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089188d480cc741fc02000000894104c701502f89b28d410cc740fc02000000894804c700f0707ab2909090e8de4bedff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c74008602f89b2894804c70007000000c38b48048b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70005000000c38b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b4004894104c701050000008b45008d40d83b45087303ff5520894500c740fc02000000c740040100000089188d500cc742fc02000000894204890a8d420cc740fc03000000c7400803000000895004c7001d000000f6c201751d8b0a833905750f8b4a0489ca3b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e9ee68edffc38b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b5004895104c701050000005351bb34b38eb28b500889d0909090e80a87ecff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740690e83668edff89c3b801000000e87e3fffff5053bbc8b38eb2b803000000909090e87286ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc02000000c74104010000005a891189c389c8909090e87649edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c3b8c4757ab2c390900000000074050000|@16273,1048575,@3763|11,0,$16262+22 113,0,@16263 122,1,@6547 153,0,1 162,0,14 193,0,0 200,0,1 214,1,@6933 225,0,0 230,1,@15942 237,0,@16266 242,0,1 250,1,@6547 281,0,1 288,0,0 295,0,0 312,0,0 319,0,@6130 358,0,7 375,0,0 390,1,@6881 423,0,1 435,0,3 467,0,0 486,0,1 495,0,14 526,0,0 533,0,1 545,1,@6933 582,0,0 591,0,2 626,0,0 635,0,2 670,0,0 691,0,@13615 710,0,@5281 718,1,@6881 751,0,1 758,0,@13616 767,0,3 802,0,0 811,0,2 843,0,0 855,0,2 886,0,0 920,0,1 929,0,14 961,0,0 968,0,1 978,1,@6933 1010,0,0 1022,0,2 1029,0,@16268 1042,1,@6547 1103,0,1 1112,0,14 1144,0,0 1151,0,1 1162,1,@6933 1169,0,0 1174,1,@15942 1181,0,@16271 1186,0,1 1194,1,@6547 1225,0,1 1232,0,0 1239,0,0 1256,0,0 1263,0,@6130 1302,0,7 1319,0,0 1334,1,@6881 1367,0,1 1379,0,3 1385,0,@5348 16263:O1|@16264 16264:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c74004cc707ab2c7000d000000c390900000000038000000|@16265,3,@3759|29,0,0 39,0,@5278 45,0,6 16265:S49|44415441545950455f52455028292e636f6e7374724170706c792832297475706c654170706c79436f6465283229283129 16266:O1|@16267 16267:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3760|1,0,@5280 16268:O1|@16269 16269:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c74004cc707ab2c7000d000000c390900000000038000000|@16270,3,@3761|29,0,0 39,0,@5278 45,0,6 16270:S52|44415441545950455f52455028292e636f6e7374724170706c792832297461675475706c654170706c79436f6465283329283129 16271:O1|@16272 16272:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3762|1,0,@5280 16273:S29|44415441545950455f52455028292e636f6e7374724170706c79283229 16274:D3,800|3b650c7303ff552450bbcc707ab2909090e88ef3ffff817c240848c05208742ff64424080175228b742408bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090174068b4c2408eb05b98cc77ab289cb89c6b801000000e8823cffff505356bb50b78eb2b8030000009090e87683ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbcc707ab28b44240490e8daf7ffff817c240c48c05208742ff644240c0175228b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090174068b4c240ceb05b98cc77ab289cb89c6b801000000e8a63bffff505356bb7cb78eb2b8030000009090e89a82ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbcc707ab28b44240890e8be010000817c241048c052087429f64424100175298b742410bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb048b4c241089cb89c6b801000000e8ca3affff505356bb50bd8eb2b8030000009090e8be81ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40dc3b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d000000f6c101740a5983c40451e97b62edffc20400000000001c030000|@16292,1048575,@3772|10,0,@5278 18,1,@16257 26,0,I48 44,0,I48 49,0,4 80,0,@6130 89,0,0 94,1,@15942 102,0,@16275 107,0,1 114,1,@6547 145,0,1 152,0,0 159,0,0 176,0,0 222,0,7 228,0,@5278 238,1,@16262 246,0,I48 264,0,I48 269,0,4 300,0,@6130 309,0,0 314,1,@15942 322,0,@16277 327,0,1 334,1,@6547 365,0,1 372,0,0 379,0,0 396,0,0 442,0,7 448,0,@5278 458,1,@16279 466,0,I48 484,0,I48 489,0,4 514,0,@6130 529,0,0 534,1,@15942 542,0,@16290 547,0,1 554,1,@6547 585,0,1 592,0,0 599,0,0 616,0,0 662,0,7 679,0,0 761,0,0 770,0,14 785,1,@6933 16275:O1|@16276 16276:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3764|1,0,@5280 16277:O1|@16278 16278:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3765|1,0,@5280 16279:D3,1048|3b650c7303ff55248b08babeb78eb28d548afcffe290e99d010000909090e9e2010000909090e9e0010000909090e9de010000909090e9d9010000909090e929020000909090e927020000909090e96c020000909090e90b000000909090e9a503000090909083780401750389d8c353bbd4bb8eb28b400490e8e27fecff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e82a61edffeb0289c889c3b801000000e86e38ffff5053bb6cbc8eb2b803000000909090e8627fecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc02000000c74104010000005a891189c389c8909090e86642edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c3833b057518b8030000008b0c2489042489d8bb0100000051e98331edff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400801000000895804c7000d000000c3b8c4757ab2c3b8c4757ab2c389d8c38b45008d40f43b45087303ff5520894500c740fc02000000c74004b4857ab28918e8b641edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c74008a03a7cb2894804c70007000000c3b8c4757ab2c3833b057518b8030000008b0c2489042489d8bb0300000051e9c930edff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c7400803000000895804c7000d000000c353bb98bc8eb28b400890e8927decff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e8da5eedffeb0289c889c3b801000000e81e36ffff5053bbfcbc8eb2b803000000909090e8127decff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c741048cc77ab25883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc02000000c74104010000005a891189c389c8909090e81640edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c3b8c4757ab2c390900000000014040000|@16289,1048575,@3770|11,0,$16279+22 113,0,@16280 122,1,@6547 153,0,0 162,0,14 193,0,0 200,0,1 214,1,@6933 225,0,0 230,1,@15942 237,0,@16283 242,0,1 250,1,@6547 281,0,1 288,0,0 295,0,0 312,0,0 319,0,@6130 358,0,7 375,0,0 390,1,@6881 423,0,1 435,0,3 446,0,1 459,0,0 465,1,@6843 496,0,1 503,0,0 512,0,6 518,0,@5348 524,0,@5348 559,0,@5490 566,1,@6881 599,0,1 606,0,@7121 615,0,3 621,0,@5348 632,0,1 645,0,1 651,1,@6843 682,0,1 689,0,1 698,0,6 705,0,@16285 714,1,@6547 745,0,0 754,0,14 785,0,0 792,0,1 806,1,@6933 817,0,0 822,1,@15942 829,0,@16287 834,0,1 842,1,@6547 873,0,1 880,0,0 887,0,0 904,0,0 911,0,@6130 950,0,7 967,0,0 982,1,@6881 1015,0,1 1027,0,3 1033,0,@5348 16280:O1|@16281 16281:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000894808c74004cc707ab2c7000d000000c390900000000038000000|@16282,3,@3766|29,0,1 39,0,@5278 45,0,6 16282:S55|44415441545950455f52455028292e636f6e73747244657374727563742832297475706c654465737472756374436f6465283329283129 16283:O1|@16284 16284:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3767|1,0,@5280 16285:O1|@16286 16286:D3,72|a801740583c0027105ff5538ebf689c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000894808c74004cc707ab2c7000d000000c30000000044000000|@16282,3,@3768|43,0,1 53,0,@5278 59,0,6 16287:O1|@16288 16288:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3769|1,0,@5280 16289:S32|44415441545950455f52455028292e636f6e7374724465737472756374283229 16290:O1|@16291 16291:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3771|1,0,@5280 16292:S40|44415441545950455f52455028292e637265617465556e617279436f6e7374727563746f72283329 16293:D3,856|3b650c7303ff5524f64424040175618b4c24048b11f60201755b8b32833e017559ff71045350ff7204b8e4107bb2909090e83af6ffff50ff74240c8b5c240c8b4424089090e8b6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c20400e9d3020000e96e0000008b7d008d7ff43b7d087303ff5520897d00c747fc02000000ff71048b0e894f04c707110000005350ff720489f89090e8c2f5ffff50ff74240c8b5c240c8b4424089090e83effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c20400833a03754fff71045350ff7204b818c18eb2909090e86ef5ffff50ff74240c8b5c240c8b4424089090e8eafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c20400833a05754fff71045350ff7204b8e4107bb2909090e81af5ffff50ff74240c8b5c240c8b4424089090e896feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c40c8908c204008b75008d76f43b75087303ff5520897500c746fc02000000894604c7060b000000ff7104535056ff7204bbcc707ab289f0e84ee8ffff813c2448c052087427f604240175288b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b0c2489cb89c6b80100000083c40490e84231ffff505356bb24c18eb2b8030000009090e83678ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbc4757ab28b44240490e89aecffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801740a89c890e8f658edffeb0289c85983c10250ff7424088b5c240889c8e8defcffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000054030000|@16297,1048575,@3774|42,0,@6455 50,1,@16274 156,0,8 170,1,@16274 246,0,@16294 254,1,@16274 330,0,@6455 338,1,@16274 429,0,5 443,0,@5278 450,1,@16257 457,0,I48 473,0,I48 478,0,4 503,0,@6130 517,0,0 526,1,@15942 534,0,@16295 539,0,1 546,1,@6547 577,0,1 584,0,0 591,0,0 608,0,0 654,0,7 660,0,@5348 670,1,@16262 701,0,0 753,0,0 762,0,14 774,1,@6933 841,0,0 16294:O2|8,0 16295:O1|@16296 16296:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3773|1,0,@5280 16297:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707231283329 16298:D3,488|3b650c7303ff5524f6c30175698b0b8b55008d52f03b55087303ff5520895500c742fc030000008b742404897208894204c70205000000ff73045052ff7104bbcc707ab289d0909090e8d2e5ffff813c2448c05208742ef6042401752f8b3424bf48c05208b909000000d1e93bc9f3a68d7c3f01eb05e95d0100008d7436018d4c09017507b98cc77ab2eb038b0c2489cb89c6b80100000083c4049090e8be2effff505356bb9cc38eb2b8030000009090e8b275ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbc4757ab28b44240490e816eaffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801740a89c890e87256edffeb0289c85983c10250ff74240c8b5c240889c8e84efeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c20400b801000000c2040000000000e4010000|@16301,1048575,@3776|51,0,2 64,0,@5278 74,1,@16257 81,0,I48 97,0,I48 102,0,4 134,0,@6130 148,0,0 158,1,@15942 166,0,@16299 171,0,1 178,1,@6547 209,0,1 216,0,0 223,0,0 240,0,0 286,0,7 292,0,@5348 302,1,@16262 333,0,0 385,0,0 394,0,14 406,1,@6933 473,0,0 16299:O1|@16300 16300:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3775|1,0,@5280 16301:S60|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963726561746552657072283229 16302:D3,820|3b650c7303ff5524f64424080175638b4c24088b11f60201755d8b328b3ef7c701000000740783ff097f3aeb06f647ff1074328b7d008d7fec3b7d087303ff5520897d00c747fc04000000ff71048b4c2408894f0c8b36897708894704c7070f000000eb378b7d008d7ff03b7d08730feb0ae9ad020000e930000000ff5520897d00c747fc030000008b742404897708894704c7070d000000ff71045350ff720489f89090e866efffffeb66833a03753b8b75008d76f03b75087303ff5520897500c746fc030000008b7c2404897e08894604c7060d000000ff71045350ff720489f09090e826efffffeb6b833a0575438b75008d76f03b75087303ff5520897500c746fc030000008b7c2404897e08eb05e9cf010000894604c7060d000000ff71045350ff720489f0909090e8deeeffffeb6d8b75008d76f83b75087303ff5520897500c746fc0100000089068066ffbf8b7d00eb05e98a0100008d7ff03b7d087303ff5520897d00c747fc03000000ff71048b4c2408894f08897704c70703000000535057ff7204bbcc707ab289f8e81ee2ffff813c2448c05208742eeb05e940010000f604240175288b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b0c2489cb89c6b80100000083c4049090e80a2bffff505356bb54c78eb2b8030000009090e8fe71ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050bbc4757ab28b44240490e862e6ffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801740a89c890e8be52edffeb0289c85983c10250ff742408ff7424148b5c240c89c8e802fdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c208000000000030030000|@16305,1048575,@3778|95,0,7 149,0,6 166,1,@16274 213,0,6 230,1,@16274 284,0,6 302,1,@16274 384,0,1 395,0,@5278 402,1,@16257 409,0,I48 432,0,I48 437,0,4 462,0,@6130 476,0,0 486,1,@15942 494,0,@16303 499,0,1 506,1,@6547 537,0,1 544,0,0 551,0,0 568,0,0 614,0,7 620,0,@5348 630,1,@16262 661,0,0 713,0,0 722,0,14 734,1,@6933 805,0,0 16303:O1|@16304 16304:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3777|1,0,@5280 16305:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707232283329 16306:S47|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f736552657072283129 16307:S34|44415441545950455f52455028292e63686f6f7365436f6e73747252657072283229 16308:D3,176|3b650c7303ff55248b40048b008b4c2410ff31ff7104ff7004ff742418ff7424188b442408e89a0000008b4c241050ff7104ff31ff7108ff71148b5c24188b442414909090e856effeff83380175068b4c240ceb158b70048b188b44240c909090e8c601000089c1eb038b700483f90175058b0424eb0b89cb8b042490e80202000089c18b45008d40f43b45087303ff5520894500c740fc02000000897004890883c410c210009000000000ac000000|@16316,2097151,@3785|38,1,@16309 70,1,@15825 98,1,@16314 126,1,@16315 16309:D3,208|3b650c7303ff5524a801756ef6c301756e8b088b5108833a05740e8b7004b8dcc98eb28b5d0490ff13ff7304ff7004ff33ff7208ff7204b8030000008b54241cff12598901598b54241089118b4d008d49ec3b4d087303ff5520894d00c741fc040000005b89590c894108c7410401000000c70103000000eb0ae941000000e93c00000051ff742414528b5c24108b44240c909090e866ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20800b801000000c2080000000000cc000000|@8004,1048575,@3782|31,0,@16310 56,0,1 110,0,0 116,0,1 193,0,0 16310:O4|@4608,@5398,@16312,@16311 16311:O5|@16313,1035,0,1035,0 16312:S18|646563436f6e733a204e6f74206c6f63616c 16313:S51|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f434f444547454e5f5041525345545245452e736d6c 16314:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3783| 16315:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3784| 16316:S48|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429646563436f6e73747273283329 16317:O6|@16318,@7206,@6836,@6997,@7102,@7190 16318:D3,236|3b650c7303ff55245250539090e8ee0000008b4c240850ff74241cff74241cff710cff7110ff711489c38b44241c909090e89e01000083f801750e89c1b8a4f88eb28b5d049090ff13e84a2d00008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010700000051ff742408ff7424248b5c240c8b44241490e8222e00008b4c241050ff7104ff742428ff742428ff71088b5c242c8b442420e83230000083f80175058b0424eb0a89c38b0424e8765b000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4045983c4108908c20c009000000000e8000000|@16464,2097151,@3842|14,1,@16319 50,1,@16320 62,0,@16373 74,1,@16376 107,0,3 130,1,@16380 162,1,@16383 182,1,@16463 16319:D3,192|3b650c7303ff5524a801755c8b088b510c8b328b7e088b4f0483390375058b5108eb3683390175058b5104eb2cba010000008b7104f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdc83fa01740f8b5004b805000000eb0de9450000008b5004b803000000535289da909090ff12508b5c24088b4424049090e872ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c300000000bc000000|@6329,1048575,@3786|46,0,0 98,0,2 113,0,1 179,0,0 16320:D3,100|3b650c7303ff5524ba74587cb2e8368bedff89c1ba0100000050f6c1017534ff7104ff74241cff74241cff74240cff742420ff742420ff74242089d38b01909090e83200000089c2593b650c7303ff5524ebc789d083c404c21400900000000060000000|@16372,2097151,@3813|9,0,@7237 14,1,@7238 21,0,0 66,1,@16321 16321:D3,3236|8d7c24943b7d0c7303ff55288b088b510c833901745d8b328b7e088b4f0483390375058b7108eb3983390175058b7104eb2fbe010000008b7904f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd98b0a8b79088b4f04833903750a8b7908eb3be9680b000083390175058b7904eb2cbf010000008b4904f6c101751ff7c701000000740583c7027105ff5538ebf68b49043b650c7303ff5524ebdc53ff7004ff3256ff7204bb68da8eb289f89090e89269ecff8b4c242c8b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc03000000c70310db8eb28953048b71048973088063ffbf8b39f7c701000000740583c7027105ff5538ebf68b75008d76f03b75087303ff5520897500c746fc03000000895608895e04893e83f8017476576840dc8eb2525056ff7104578d5c24148b4424209090e8fe68ecff89c38b44240cba74587cb2e86689edffff3424ff742408ff74241868f8dd8eb2508d5c24048b4424349090e8ce68ecff8b45008d40ec3b45087303ff5520894500c740fc01000040c700010000008d4808c741fc02000000eb05e97e000000c70198df8eb28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc020000005a83c410895004c700030000008b55008d52d83b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc0400000089430c894b088b44240889430489138d4b14c741fc020000008b5424448951048919eb108b59048b4c24286a016a0152505653578b45008d40f03b45087303ff5520894500c740fc030000009090c70040e08eb28b5424408950048b5c24488958088060ffbf89ce89c7b824e48eb2909090e8021400008b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c741086c757ab2894104c701070000005651ff74240cff74241cff74241cff742450ff742450ff742450ff74242857568b5c242c8b442448e8261400008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc74108f0707ab258894104c70103000000f64424100174758b442428518b18b864f48eb2e8ba3aebffbb70f48eb29090e8ae3aebff8b4c24188b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8122bedff81fb48c05208eb05e9ee0000007425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cbe84e2bedff5053bb7cf48eb2b805000000909090e87a66ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc020000008941048b44242c89018b45008d40f43b45087303ff5520894500c740fc020000008b542430895004890883c434c21800b8010000008b542410f6c201751ba801740583c0027105ff5538ebf68b52043b650c7303ff5524ebe08b54244c8b5d008d5bf83b5d087303ff5520895d00c743fc01000040c703010000008b32f7c601000000740583c6027105ff5538ebf68b7d008d7ff83b7d087303ff5520897d00c747fc01000040c707010000005189f1f6c101740583c1027105ff5538ebf6505651ff7204535768a8f48eb25357ff7204518d5c24108b4424289090e82665ecff8b4c245cf6c101740583c1027105ff5538ebf68b54247c5bf6c3017409f6020174042b1a7105ff5538ebf783c301f6c301740783fb017c08eb15f643ff10740f89c6b840f77bb28b5d04909090ff13f6c301740783fb017e61eb06f643ff10755ef6c301740583eb027105ff5538ebf6f6c301740783fb017c08eb13f643ff10740d89c6b840f77bb28b5d0490ff13f6c301740783fb017e61eb06f643ff107559f6c301740583eb027105ff5538ebf689c68b45008d40f0eb0ae98b000000e9860000003b45087303ff5520894500c740fc03000000c74008010000008958048908568b542404909090ff128b5c240c909090e8be23edffeb45f6c101740783f9017c08eb15f641ff10740f89c3b8bcf97bb28b5d04909090ff1389c38b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000538b5c2408e86e23edffeb45f6c101740783f9017c08eb15f641ff10740f89c3b8bcf97bb28b5d04909090ff1389c38b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000538b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000833c24017507b824e48eb2eb1189ce8b1c24b824e48eb2e80a22000089f189cb909090e8de26edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008b44245883c408518b18b864f48eb290e89a36ebffbb70f48eb29090e88e36ebff8b4c24048b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8f226edff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e86a1bffff5053bb10f78eb2b805000000909090e85e62ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4048941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4c244c508b19b864f48eb2909090e86a35ebffbb3cf78eb29090e85e35ebff8b4c24048b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8c225edff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e83a1affff5053bb4cf78eb28b442428e83261ecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4048941045883c42089018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc020000008941048b4424308901a801740583c0027105ff5538ebf6f644240401740f89c2b8d0717cb28b5d04909090ff138b5424048b128b128b1289cb89c689d0e8ea1f0000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f80175058b0424eb2989c18b45008d40f03b45087303ff5520894500c740fc030000008b1424895008894804c70015000000b90500000083c404f6c1017410f64424240174098d49ff034c24247105ff5538ebf28b542428535650518b1ab864f48eb29090e86233ebffbbe4687cb29090e85633ebff8b4c24248b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8ba23edff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8fa23edff5053bbdcf78eb28b442408e82a5fecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4088941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc020000008b542434895004890889c18d400cc740fc0200000089480459890883c434c218008b7004b80100000090e82a23edff535650bb08f88eb2b8050000009090e8565eecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c74104ac8d7ab2c701c4757ab28b45008d40e83b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000005a8950048908c2180000000000a00c0000|@16371,2097151,@3812|51,0,0 131,0,0 185,0,@16322 194,1,@6547 228,0,0 244,0,@16325 320,0,@16326 342,1,@6547 353,0,@7237 358,1,@7238 374,0,@16330 390,1,@6547 420,0,0 443,0,@16332 487,0,1 517,0,0 611,0,@16334 638,0,@16339 646,1,@16341 677,0,1 684,0,@5341 693,0,3 738,1,@16342 772,0,@5281 782,0,1 801,0,@16354 806,1,@4940 811,0,@16355 818,1,@4940 829,0,0 898,1,@6883 904,0,I48 925,0,I48 930,0,4 955,0,@6130 966,1,@6884 973,0,@16356 978,0,2 986,1,@6547 1017,0,1 1024,0,0 1031,0,1 1048,0,0 1091,0,7 1154,0,0 1224,0,0 1274,0,0 1305,0,@16358 1326,1,@6547 1397,0,@6871 1463,0,@6871 1547,0,0 1574,1,@6874 1601,0,@6876 1644,0,2 1654,1,@6874 1681,0,@6876 1724,0,2 1758,0,4 1769,0,@16339 1781,0,@16339 1786,1,@16360 1798,1,@6881 1829,0,1 1841,0,3 1856,0,@16354 1862,1,@4940 1867,0,@16355 1874,1,@4940 1885,0,0 1954,1,@6883 1960,0,I48 1974,0,I48 1979,0,4 2004,0,@6130 2018,1,@15942 2025,0,@16361 2030,0,2 2038,1,@6547 2069,0,1 2076,0,0 2083,0,0 2100,0,0 2146,0,7 2158,0,@16354 2166,1,@4940 2171,0,@16363 2178,1,@4940 2189,0,0 2258,1,@6883 2264,0,I48 2278,0,I48 2283,0,4 2308,0,@6130 2322,1,@15942 2329,0,@16364 2338,1,@6547 2369,0,1 2376,0,0 2383,0,0 2400,0,0 2446,0,7 2493,0,@7307 2522,1,@16366 2527,0,0 2630,0,10 2635,0,2 2679,0,@16354 2686,1,@4940 2691,0,@7276 2698,1,@4940 2709,0,0 2778,1,@6883 2784,0,I48 2798,0,I48 2803,0,4 2828,0,@6130 2842,1,@6884 2849,0,@16367 2858,1,@6547 2889,0,1 2896,0,0 2903,0,1 2920,0,0 2963,0,7 3044,0,0 3050,1,@6884 3058,0,@16369 3063,0,2 3070,1,@6547 3101,0,1 3108,0,0 3115,0,1 3129,0,0 3136,0,@5575 3142,0,@5348 3175,0,7 16322:O1|@16323 16323:D3,60|8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f17002008908c30000000038000000|@16324,3,@3787|26,0,@5413 45,0,79992 16324:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322961726754797065732d283129 16325:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9fc1bedff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3788|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16326:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c7008cdc8eb28b52048950048948088060ffbfc390900000000034000000|@16329,7,@3790|28,0,@16327 16327:D3,140|3b650c7303ff55248b4a08f6c101740583c1047105ff5538ebf68b18f6c301740bf642040174052b5a047105ff5538ebf683c3018b50048b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000895804890890ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c390900000000088000000|@16328,1048575,@3789|82,0,1 125,0,4 16328:S93|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129283129 16329:S90|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129 16330:D3,288|3b650c7303ff5524a801740583c0047105ff5538ebf68b4a0cf6c101740bf6420c0174052b4a0c7105ff5538ebf683c101f6c101740783f9017c08eb14f641ff10740e89c3b840f77bb28b5d049090ff13f6c101740783f9017e59eb06f641ff107551f6c101740583e9027105ff5538ebf689c38b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008948048918528b4a0889ca9090ff128b0c248b590483c4049090e8ee18edffeb40a801740783f8017c08eb12f640ff10740c89c1b8bcf97bb28b5d04ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000100000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c3000000001c010000|@16331,1048575,@3791|70,0,@6871 143,0,1 174,1,@6874 200,0,@6876 240,0,0 275,0,4 16331:S98|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6c6f63616c4172674c6973742d283129 16332:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@16333,15,@3792| 16333:S91|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6d6b41646472283129 16334:D3,48|3b650c7303ff55248b48088b1c24890c24ff7204ff720889da8b58048b0889c852e91e0000009090000000002c000000|@16338,1048575,@3795|34,1,@16335 16335:D3,452|3b650c7303ff55248b4c2408f6c10175598b118b1a8b730c8b3e8b57088b5a04833b0375128b7004833e03750a8b7b043b7e04754deb26833b0175468b7004833e01753e8b7b0cf7c7010000007509f6460c017503ff55383b7e0c75258b7d008d7ff83b7d08730aeb05e923000000ff5520897d00c747fc010000008b09890feb158b49043b650c7303ff5524e97affffffbf0100000083ff0175128b4c240c89cb8b005a83c40c52e92a0100008b078b088b54240c8b5c24048b32f7c6010000007409f6030174042b337105ff5538ebf783c6018b78048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008970048938ff7108ff71048b4a0489ca90ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52f43b55087303ff5520895500c742fc020000008942045889028b45008d40d83b45087303ff5520894500c740fc02000000895004c700c4757ab28d500cc742fc02000000894204890a8d420cc740fc03000000c7400801000000895004c7001d000000f6c201740a5983c40c51e97237edffc20c0090909000000000c0010000|@16337,1048575,@3794|147,0,0 170,1,@16336 243,0,0 295,0,4 312,0,0 378,0,@5348 410,0,0 419,0,14 434,1,@6933 16336:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e96d08edff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3793|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16337:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283329 16338:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283129 16339:O2|@5278,@16340 16340:O2|@5346,0 16341:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3796|39,0,1 92,0,0 16342:D3,2032|3b650c7303ff5524a80175678b0853ff7004ff7108ff710cff7104ff742438ff7424388b4424109090e8d6070000f6042401756f8b0c24833903756c833805750f506a01bb03000000e8f605edffeb3989c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000eb05e966070000c7400803000000894804c7000d000000518b4d008d49f43b4d087303ff5520894d00c741fc02000000eb0ae9d2010000e9cd010000c7410401000000890189c890e81e16edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c741084c767ab2894104c701070000008b0424833805750f516a01bb01000000e84205edffeb338b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c74008010000008b1424895004c7000d0000005189c3b854a97ab2909090e89615edff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc0400000089480cc74008c4757ab259894804c700030000008b0c248339057511506a01bb0100000089c8e89e04edffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d0000005289c3b830e48eb2e8f614edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c7010700000051ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff742444ff7424448b5c24408b44243c909090e8bafdffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c598948085983c404894804c7000300000083c414c22400508b4424349090e8360700008b4c240883390575088b5108833a0b740e89c2b800ef8eb28b5d049090ff13ff7104508b420490e8da0700005b9090e86ac0ecff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e0ef8eb28941048061ffbf6a016a0189e05089cb8b44240c90e8ee57ecffff74242cff74242cff742444ff742444ff7424448b5c24448b442414909090e82e0aedff50ff74244cff74244c8b5c242c8b4424249090e8b608000083380575116a01bb05000000909090e80203edffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d0000008b4c2424f6c101740df64424240174062b4c24247105ff5538ebf583c101f6c101740783f9017c08eb12f641ff10740c89c2b840f77bb28b5d04ff13f6c101740783f9017e59eb06f641ff107551f6c101740583e9027105ff5538ebf689c28b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000894804c70001000000528b542450909090ff128b5c244c909090e8ca0eedffeb0889c1b8d8707ab2518b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c7400401000000890890e88612edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c7010700000051ff742450ff7424508b5c24308b4424289090e80209000083380575116a01bb05000000909090e89601edffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d0000008b4c2428f6c101740df64424280174062b4c24287105ff5538ebf583c101f6c101740783f9017c08eb12f641ff10740c89c2b840f77bb28b5d04ff13f6c101740783f9017e59eb06f641ff107551f6c101740583e9027105ff5538ebf689c28b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000894804c70003000000528b542454909090ff128b5c2450909090e85e0dedffeb0889c1b8b8757ab2518b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c7400401000000890890e81a11edff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc0200000089410458890189c89090e8c210edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a83c40c895108894104c701070000008b0424833805750f516a01bb01000000e8e6ffecffeb338b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c74008010000008b1424895004c7000d0000005189c3b854a97ab2909090e83a10edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008b4424048338057512516a01bb01000000909090e85effecffeb348b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c74008010000008b542404895004c7000d0000005189c3b830e48eb29090e8b20fedff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc04000000c7400cc4757ab28b542404895008894804c7000300000050ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff742448ff7424488b5c24448b4424409090e856f8ffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c598948085983c408894804c7000300000083c414c22400b8c4757ab2c22400909000000000ec070000|@16353,2097151,@3803|42,1,@16343 69,0,1 74,1,@6843 109,0,0 123,0,1 132,0,6 176,0,0 186,1,@6881 217,0,1 224,0,@5356 233,0,3 249,0,0 254,1,@6843 287,0,0 294,0,0 306,0,6 314,0,@5708 322,1,@6881 353,0,1 365,0,3 385,0,@5348 395,0,1 411,0,0 418,1,@6843 453,0,0 460,0,0 469,0,6 477,0,@16340 482,1,@6881 513,0,1 525,0,3 624,0,1 642,1,@16344 666,0,@16345 686,1,@16348 694,1,@6721 724,0,@16349 750,1,@6564 786,1,@6869 810,1,@16351 822,0,2 830,1,@6843 865,0,0 872,0,2 881,0,6 936,0,@6871 1007,0,1 1016,0,0 1038,1,@6874 1047,0,@5279 1081,0,4 1098,0,0 1106,1,@6881 1137,0,1 1150,0,3 1174,1,@16352 1186,0,2 1194,1,@6843 1229,0,0 1236,0,2 1245,0,6 1300,0,@6871 1371,0,1 1380,0,1 1402,1,@6874 1411,0,@5347 1445,0,4 1462,0,0 1470,1,@6881 1501,0,1 1514,0,3 1531,0,0 1558,1,@6881 1589,0,1 1605,0,3 1621,0,0 1626,1,@6843 1659,0,0 1666,0,0 1678,0,6 1686,0,@5708 1694,1,@6881 1725,0,1 1737,0,3 1754,0,0 1762,1,@6843 1795,0,0 1802,0,0 1815,0,6 1823,0,@16340 1830,1,@6881 1861,0,1 1873,0,3 1890,0,@5348 1906,0,1 2004,0,1 2015,0,@5348 16343:D3,420|3b650c7303ff5524833809756d8b4808ff7004ff74240cff74240c8b4104909090e8daffffff8338057519b901000000894c240c8b1c2483c4045983c40451e9fcfdecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c2080083380575678b48048b098b40088b00f6c3017409f6000174042b187105ff5538ebf783c301f6c301740783fb017c08eb12f643ff10740cb840f77bb28b5d049090ff13f6c301740783fb017e59eb06f643ff107551f6c301740583eb027105ff5538ebf68b45008d40f0eb05e9990000003b45087303ff5520894500c740fc03000000c740080100000089580489088b542408909090ff128b5c2404909090e8ba09edffeb3ef6c101740783f9017c08eb11f641ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c7000500000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c20800833803740c89c1b828f17bb28b5d04ff138b4004c208009000000000a0010000|@6867,1048575,@3797|44,0,0 64,1,@6843 97,0,0 112,0,6 178,0,@6871 256,0,0 282,1,@6874 307,0,@6876 346,0,2 381,0,4 396,0,@6863 16344:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@3798|51,0,6 100,0,0 16345:O4|@4608,@5398,@16347,@16346 16346:O5|@6454,1515,0,1515,0 16347:S19|4e6f7420612066756e6374696f6e2074797065 16348:D3,132|3b650c7303ff5524a80175678b0883390d740e8b5004b898427bb28b5d0490ff138b55008d52f43b55087303ff5520895500c742fc020000008b5908895a048b71048932528b780489f8909090e8aeffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000080000000|@6329,63,@3799|23,0,@6567 116,0,0 16349:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@16350,63,@3800|62,0,0 72,0,0 16350:S41|545950455f5452454528292e636f6e7374727563746f72526573756c74283229676574417267283129 16351:D3,420|3b650c7303ff5524833809756d8b4808ff7004ff74240cff74240c8b4104909090e8daffffff8338057519b901000000894c240c8b1c2483c4045983c40451e91cfaecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c2080083380575678b48048b098b40088b00f6c3017409f6000174042b187105ff5538ebf783c301f6c301740783fb017c08eb12f643ff10740cb840f77bb28b5d049090ff13f6c301740783fb017e59eb06f643ff107551f6c301740583eb027105ff5538ebf68b45008d40f0eb05e9990000003b45087303ff5520894500c740fc03000000c740080100000089580489088b542408909090ff128b5c2404909090e8da05edffeb3ef6c101740783f9017c08eb11f641ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c7000500000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c20800833803740c89c1b828f17bb28b5d04ff138b4004c208009000000000a0010000|@6867,1048575,@3801|44,0,0 64,1,@6843 97,0,0 112,0,6 178,0,@6871 256,0,0 282,1,@6874 307,0,@6876 346,0,2 381,0,4 396,0,@6863 16352:D3,420|3b650c7303ff5524833809756d8b4808ff7004ff74240cff74240c8b4104909090e8daffffff8338057519b901000000894c240c8b1c2483c4045983c40451e964f8ecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c2080083380575678b48048b098b40088b00f6c3017409f6000174042b187105ff5538ebf783c301f6c301740783fb017c08eb12f643ff10740cb840f77bb28b5d049090ff13f6c301740783fb017e59eb06f643ff107551f6c301740583eb027105ff5538ebf68b45008d40f0eb05e9990000003b45087303ff5520894500c740fc03000000c740080100000089580489088b542408909090ff128b5c2404909090e82204edffeb3ef6c101740783f9017c08eb11f641ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c7000500000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c20800833803740c89c1b828f17bb28b5d04ff138b4004c208009000000000a0010000|@6867,1048575,@3802|44,0,0 64,1,@6843 97,0,0 112,0,6 178,0,@6871 256,0,0 282,1,@6874 307,0,@6876 346,0,2 381,0,4 396,0,@6863 16353:S75|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322970726f63657373436f6e73747273283129 16354:S3|65712d 16355:S3|283229 16356:O1|@16357 16357:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3804|1,0,@5280 16358:D3,428|3b650c7303ff55248b4a10f6c101740bf642140174052b4a147105ff5538ebf683c101f6c101740783f9017c08eb12f641ff10740c89c3b840f77bb28b5d04ff13f6c101740783f9017e61eb06f641ff10755ef6c101740583e9027105ff5538ebf6f6c101740783f9017c08eb13f641ff10740d89c3b840f77bb28b5d0490ff13f6c101740783f9017e61eb06f641ff107559f6c101740583e9027105ff5538ebf689c38b45008d40f0eb0ae98f000000e98a0000003b45087303ff5520894500c740fc03000000c74008030000008948048918528b4a0c89ca9090ff128b0c248b590890e80602edffeb41a801740783f8017c08eb12f640ff10740c89c1b8bcf97bb28b5d04ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000528b0c248b590483c404909090e8b201edffeb40a801740783f8017c08eb12f640ff10740c89c1b8bcf97bb28b5d04ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000100000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c300000000a8010000|@16359,1048575,@3805|56,0,@6871 119,0,@6871 203,0,1 230,1,@6874 256,0,@6876 296,0,0 314,1,@6874 340,0,@6876 380,0,0 415,0,4 16359:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229706f6c79417267732d283129 16360:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3806| 16361:O1|@16362 16362:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3807|1,0,@5280 16363:S6|283229285029 16364:O1|@16365 16365:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3808|1,0,@5280 16366:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3809|64,0,0 16367:O1|@16368 16368:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3810|1,0,@5280 16369:O1|@16370 16370:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3811|1,0,@5280 16371:S58|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229 16372:S36|545950454944434f444528292e657175616c697479466f72446174617479706573283429 16373:O4|@4608,@5398,@16375,@16374 16374:O5|@5400,474,0,474,0 16375:S36|6d6b4d757475616c446563733a20656d707479206465636c61726174696f6e206c697374 16376:D3,144|3b650c7303ff5524a80175708b088b5104833a0f740f8b5804b8a0f98eb28b5d049090ff138b5d008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b39897b04c7030100000053ff7004589090e8a6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908eb05e901000000c3b801000000c3000000008c000000|@6329,63,@3814|26,0,@16377 74,0,0 131,0,0 16377:O4|@4608,@5398,@16379,@16378 16378:O5|@5400,478,0,478,0 16379:S53|6d6b4d757475616c446563733a20526563757273697665206465636c61726174696f6e206973206e6f7420612066756e6374696f6e 16380:D3,516|3b650c7303ff5524a8017564f6c30175648b088b510c8b328b7e088b17833a05740fff7004b854a48db28b5d049090ff13ff7004ff7304ff7208ff7204ff7108ff7104ff33b8030000008b5424249090ff128b0c24f6c101740783f9017c08eb20f641ff10741a89c2b8a4727db2eb0ae97f010000e97a0100008b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702050000008d4a0cc741fc02000000895104c7010900000089c389ceb824fc8eb283c404e8c600edff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c74004010000005a89108b55008d52f43b55087303ff5520895500c742fc020000008942045889028b45008d40d83b45087303ff5520894500c740fc0200000089500489088d480cc741fc0200000089410489318d410cc740fc03000000c7400801000000894804c7001d000000f6c101740a539090e8261eedffeb01538b4c24048b142489118b4c24088b5c241889198b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c895108c7410401000000c7010300000051ff742420538b5c24188b44241ce832feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c20800b801000000c208000000000000020000|@8004,1048575,@3815|38,0,@15795 70,0,1 106,0,@7993 158,0,2 177,0,4 186,0,@16381 194,1,@6881 225,0,1 232,0,@13616 241,0,3 258,0,0 352,0,0 361,0,14 374,1,@6933 433,0,0 439,0,1 501,0,0 16381:O2|@5281,@16382 16382:O2|@13615,@5490 16383:D3,140|3b650c7303ff5524a80175708b0853ff7004ff7108ff710c53ff742424ff742424ff742424ff7424248b59048b01909090e86a00000050ff74241cff74241cff74241cff74241c8b5c24188b4424149090e8aaffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21000b801000000c210000000000088000000|@6329,2097151,@3840|50,1,@16384 125,0,0 16384:D3,532|3b650c7303ff55248b4424188b088b51088b5a04833b0375058b7308eb39833b0175058b7304eb2fbe010000008b7b04f7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd9837c241401741652ff74240cff7424188b5c24189090e8b6010000eb6e83fe0175068b442404eb6889d7b801000000909090e85effecff5750bbf0258fb289f09090e88e3aecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c741041c268fb2eb0ae92f000000e9290000008b44240889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000eb015259508b5c24108b01909090e83628000083380575116a01bb03000000909090e8eaececffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a89118b55008d52e83b55087303ff5520895500c742fc02000000894a04c702c4757ab28d4a0cc741fc02000000895104890189c8e8f6fcecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c70005000000c21c00900000000010020000|@16462,2097151,@3839|41,0,0 110,1,@16385 130,0,0 138,1,@6884 145,0,@16458 154,1,@6547 185,0,1 192,0,0 199,0,1 213,0,0 220,0,@16460 271,0,7 290,1,@16461 302,0,1 310,1,@6843 345,0,0 352,0,1 361,0,6 392,0,0 428,0,@5348 450,1,@6881 481,0,1 488,0,@15808 497,0,3 516,0,2 16385:D3,3748|3b650c7303ff55248b088b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d7208c746fc03000000c706bc0d8fb28956048b7b04897e088066ffbf8b3bf7c701000000740583c7027105ff5538ebf6ff318b4d008d49f03b4d087303ff5520894d00c741fc0300000089510889710489398b30528b56088b7204833e0375058b5608eb36833e0175058b5604eb2cba010000008b7604f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdc52ff70045157ff7304bbec0e8fb289d090e82a38ecff6a016a01837c241801751389e18b542410891189e18b54242c895104eb738b4d008d49e43b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc04000000c7027c0f8fb2894a048b5c241c895a088b74240889720c8062ffbf8b74240cf7c601000000740583c6027105ff5538ebf68b7d008d7ff03b7d087303ff5520897d00c747fc03000000eb05e9e0000000894f0889570489376a016a015057ff7424208d4c240c5189fbe8061100008b45008d40ec3b45087303ff5520894500c740fc01000040c700030000008d4808c741fc02000000c70198158fb28941048061ffbf8b45008d40f43b45087303ff5520894500c740fc020000008b542408895004c700030000008b55008d52e43b55087303ff5520895500c742fc01000040c702010000008d5a08c743fc0400000089430c894b088b44242089430489138b45008d40f43b45087303ff5520894500c740fc020000008b4c243c89480489188d5424105b891a8d54240c894204eb056a016a0150b838168fb2909090e832faecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c741084c767ab2894104c701070000008d4114c740fc02000000c7400401000000890890e8eaf9ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410810767ab2894104c7010700000089cbb844168fb290e8aef9ecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c741084c767ab2894104c701070000008d4114c740fc02000000c7400401000000890890e866f9ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410810767ab2894104c7010700000089ceb864168fb290e82af9ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c741086c757ab2894104c7010700000089cfb88c168fb290e8eef8ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c741086c757ab2894104c7010700000051b898168fb29090e8b2f8ecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000c741086c757ab2894104c701070000008d4114c740fc0400000089480cc74008f0707ab259894804c700030000008b4d008d49bc3b4d087303ff5520894d00c741fc0400000089410cc74108f0707ab2897904c701030000008d4114c740fc03000000894808c74004c0168fb2c700150000008d4810c741fc04000000c7410cc4757ab2894108c7410408178fb2c701030000008d4114c740fc02000000c7400401000000890890e8e6f7ecff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000c7410810767ab2894104c701070000008d4114c740fc04000000c7400cc4757ab2894808897004c700030000008d4814c741fc04000000c7410cc4757ab2894108895904c70103000000b830178fb2a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740d51b83c178fb2e85615edffeb06b83c178fb251b94c178fb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740d50b858178fb2e81215edffeb0889c1b858178fb251b94c178fb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740f50b868178fb29090e8ca14edffeb0889c1b868178fb251b984178fb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740f50b8ac178fb29090e88214edffeb0889c1b8ac178fb2518b4d008d49e43b4d087303ff5520894d00c741fc02000000c74104b4857ab289018d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f90174079090e80a14edff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a89c890e87e13edffeb0289c88b4d008d49d83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700cc707ab28d480cc741fc03000000c7410803000000894104c7011d000000a801740c89c8909090e81e13edffeb0289c88b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a89c890e88e12edffeb0289c88b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a89c890e8fe11edffeb0289c88b4d008d49b43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701f0707ab28d410cc740fc02000000894804c700acb67ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e84211edff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410ccc707ab289410858894104c701030000008b45008d40dc3b45087303ff5520894500c740fc03000000894808c74004bc178fb2c700150000008d4810c741fc04000000c7410ccc707ab2894108c74104f0178fb2c7010300000089cbb801000000909090e8daf3ecff5053bb04188fb2b803000000909090e8062fecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411805000000c74114030000008941108b44240489410cc7410801000000c7410430188fb25883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000ff74240cff742404ff74243cff74241c508b5c24408b4424349090e8b60e0000837c242401756b508b5c2430b8fc6f7cb29090e8ee01ebff8b4c24108b49088b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8e852f2ecff81fb48c05208742ceb05e9b8000000f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cbe88ef2ecff5053bbdc248fb2b803000000909090e8ba2decff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c430c20800f644241001740d89c1b8d0717cb28b5d0490ff138b4c24108b098b098b0989c389c89090e8221a0000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c853508b5c2434b8fc6f7cb2909090e86200ebff8b4c24148b49088b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8e8c6f0ecff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e806f1ecff5053bb6c258fb2b803000000909090e8322cecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941048b44240489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c70015000000508b5c2438b8d8d77ab29090e812ffeaffbbe4687cb29090e806ffeaff8b4c24348b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e86aefecff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8aaefecff5053bb98258fb28b442438e8da2aecff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4048941045883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c430c2080000000000a00e0000|@16457,2097151,@3836|36,0,0 52,0,@16386 153,0,0 206,0,@16387 214,1,@6547 274,0,0 290,0,@16390 394,1,@16391 424,0,1 440,0,@16400 484,0,1 514,0,0 598,0,@16402 606,1,@6881 637,0,1 644,0,@5356 653,0,3 670,0,0 678,1,@6881 709,0,1 716,0,@5352 725,0,3 732,0,@16403 738,1,@6881 769,0,1 776,0,@5356 785,0,3 802,0,0 810,1,@6881 841,0,1 848,0,@5352 857,0,3 864,0,@16405 870,1,@6881 901,0,1 908,0,@5341 917,0,3 924,0,@16408 930,1,@6881 961,0,1 968,0,@5341 977,0,3 983,0,@16409 990,1,@6881 1021,0,1 1028,0,@5341 1037,0,3 1057,0,@5281 1067,0,1 1101,0,@5281 1110,0,1 1130,0,@16412 1136,0,10 1153,0,@5348 1163,0,@16416 1169,0,1 1186,0,0 1194,1,@6881 1225,0,1 1232,0,@5352 1241,0,3 1258,0,@5348 1270,0,1 1287,0,@5348 1299,0,1 1304,0,@16418 1335,0,0 1342,0,1 1353,0,@16419 1358,1,@6933 1365,0,@16419 1371,0,@16420 1403,0,0 1410,0,1 1421,0,@16421 1426,1,@6933 1435,0,@16421 1441,0,@16420 1473,0,0 1480,0,1 1491,0,@16422 1498,1,@6933 1507,0,@16422 1513,0,@16424 1545,0,0 1552,0,1 1563,0,@16427 1570,1,@6933 1579,0,@16427 1611,0,@5490 1630,0,1 1639,0,14 1671,0,0 1678,0,1 1690,1,@6933 1721,0,0 1770,0,1 1779,0,14 1810,0,0 1817,0,1 1830,1,@6933 1865,0,0 1886,0,@5278 1903,0,1 1912,0,14 1926,1,@6933 1961,0,0 2010,0,1 2019,0,14 2050,0,0 2057,0,1 2070,1,@6933 2105,0,0 2154,0,1 2163,0,14 2194,0,0 2201,0,1 2214,1,@6933 2249,0,0 2270,0,@5348 2289,0,@5281 2308,0,@5897 2327,0,@5348 2344,0,1 2353,0,14 2385,0,0 2392,0,1 2402,1,@6933 2433,0,@5278 2446,0,1 2480,0,@16428 2486,0,10 2503,0,@5278 2513,0,@16431 2519,0,1 2526,0,0 2534,1,@6884 2541,0,@16432 2546,0,1 2554,1,@6547 2585,0,1 2592,0,2 2599,0,1 2616,0,0 2623,0,@16434 2662,0,7 2694,1,@16435 2711,0,@7288 2718,1,@4940 2732,0,0 2798,1,@6883 2804,0,I48 2825,0,I48 2830,0,4 2855,0,@6130 2866,1,@6884 2873,0,@16450 2878,0,1 2886,1,@6547 2917,0,1 2924,0,0 2931,0,1 2948,0,0 2991,0,7 3011,0,@7307 3038,1,@16452 3043,0,0 3106,0,@7288 3114,1,@4940 3128,0,0 3194,1,@6883 3200,0,I48 3214,0,I48 3219,0,4 3244,0,@6130 3258,1,@6884 3265,0,@16453 3270,0,1 3278,1,@6547 3309,0,1 3316,0,0 3323,0,1 3340,0,0 3386,0,7 3433,0,10 3443,0,@6343 3450,1,@4940 3455,0,@7276 3462,1,@4940 3473,0,0 3542,1,@6883 3548,0,I48 3562,0,I48 3567,0,4 3592,0,@6130 3606,1,@6884 3613,0,@16455 3622,1,@6547 3653,0,1 3660,0,0 3667,0,1 3684,0,0 3730,0,7 16386:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e950e9ecff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3816|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16387:O1|@16388 16388:D3,60|8b45008d40ec3b45087303ff5520894500c740fc01000040c700ec7d7ab289c18d4008c740fc02000000c74004f17002008908c30000000038000000|@16389,3,@3817|26,0,@5413 45,0,79992 16389:S46|545950454944434f444528292e7072696e746572466f72446174617479706528332961726754797065732d283129 16390:D3,520|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e62eb06f641ff10755ff6c101740583e9027105ff5538ebf6f6c101740783f9017c08eb17f641ff1074118b58088b30b840f77bb28b5d049090ff13f6c101740783f9017e61eb06f641ff107559f6c101740583e9027105ff5538ebf68b58088b30eb0ae9db000000e9d60000008b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0c89ca909090ff128b0c248b590890e842e7ecffeb638378080174428b08f6c101740783f9017c08eb11f641ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000eb468b08f6c101740783f9017c08eb17f641ff107411b8bcf97bb2eb05e9270000008b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000528b0c248b590483c404e9a3e6ecff8378080174408b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000004020000|@6878,1048575,@3818|35,0,@6871 102,0,@6871 214,1,@6874 247,0,@6876 286,0,0 313,0,@6876 358,0,2 373,1,@6874 404,0,@6876 442,0,0 468,0,@6876 506,0,2 16391:D3,148|3b650c7303ff5524b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf5350bb40128fb289c8e83226ecff89c68b5c241089f0909090e8ee0000005689c38b442404ba74587cb2909090e88646edff50ff7424188b5c24108b4424089090e84a0200008b4c24145a83c40c8911894104b801000000c20800900000000090000000|@16399,1048575,@3823|9,0,0 51,0,@16392 58,1,@6547 74,1,@16395 86,0,@7237 94,1,@7238 114,1,@16398 132,0,0 16392:O1|@16393 16393:D3,12|c39090900000000008000000|@16394,1,@3819| 16394:S97|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d617028332961726741646472732d283129 16395:D3,116|3b650c7303ff5524a80175578b4d008d49f03b4d087303ff5520894d00c741fc03000000c7015c138fb28b108951048959088061ffbf518b500489d090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,15,@3821|38,0,@16396 100,0,0 16396:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@16397,1048575,@3820|65,0,1 113,0,4 16397:S96|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329617267732d283129283129 16398:D3,204|3b650c7303ff5524a80175718b4c24048b13f6c2017409f6010174042b117105ff5538ebf783c2018b70048b388b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000895004893853568b53049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000eb05e93a00000051ff7424108b5c240c8b4424089090e86affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c2040000000000c8000000|@6329,1048575,@3822|72,0,1 119,0,4 189,0,0 16399:S85|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329 16400:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@16401,15,@3824| 16401:S81|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b41646472283129 16402:O2|@6252,0 16403:O2|@16404,0 16404:O4|6,@6252,1,1 16405:O2|@6253,@16406 16406:O2|@16407,0 16407:O3|2,40,0 16408:O2|@6253,@7227 16409:O2|@6253,@16410 16410:O2|@16411,0 16411:O3|2,91,0 16412:O2|@16413,0 16413:O4|1,0,1,@16414 16414:O4|6,@16415,1,1 16415:O4|6,@6252,0,1 16416:O4|13,3,@16417,4 16417:O4|6,@16415,0,0 16418:O2|@5897,@16406 16419:O3|14,@16418,1 16420:O2|@5281,@16134 16421:O3|14,@16420,1 16422:O3|14,@16423,1 16423:O2|@5281,@16134 16424:O2|@5897,@16425 16425:O2|@16426,0 16426:O3|2,41,0 16427:O3|14,@16424,1 16428:O2|@16429,0 16429:O4|1,0,0,@16430 16430:O4|6,@5278,4,1 16431:O4|13,0,@5532,4 16432:O1|@16433 16433:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3825|1,0,@5280 16434:S12|706172656e74686573697365 16435:D3,2024|3b650c7303ff5524a80175088b08f641040174455350b840208fb29090e82ef3eaff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c58208fb2894108c74104507b7ab2c7014ce239b289c88b5d0490ff138b510453ff7004ff710cff32ff31ff71108b5c242c8b4108e8b607000059ba01000000f6c101755f8b19833b01755d8b55008d52f43b55087303ff5520895500c742fc020000008b7304897204c70201000000f6c201740c89c7b8ecd57ab28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008917eb07e91300000089d789fa8b590489d93b650c7303ff5524eb8489d18b55008d52f03b55087303ff5520895500c742fc03000000c74208010000005b895a04c702050000008b5d008d5bd83b5d087303ff5520895d00c743fc02000000c743040100000089138d530cc742fc02000000895a04c702acb67ab28d5a0cc743fc03000000c7430803000000895304c7031d000000f6c201751d8b32833e05750f8b720489f23b650c7303ff5524ebe5ba01000000eb05ba0300000083fa01740b505189d8e8c2ffecffeb0689c289d852518b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c8e8760700008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c701050000008b55008d52b43b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc0200000089500489088d480cc741fc02000000894104c701c4757ab28d410cc740fc020000008948049090c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740690e8b2feecff837c2404017571508b442428909090e8520700008b4c240c83390575088b5108833a0b740e89c2b800ef8eb28b5d049090ff13ff7104508b420490e80ed4ffff5b9090e89e8cecff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701e8228fb28941048061ffbf6a016a0189e05089cbeb05e91f0300008b44240c9090e81a24ecff8b44241083380575116a01bb05000000909090e866cfecffeb338b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c74008050000008b4c2410894804c7000d00000089c3b874238fb2909090e8badfecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c70107000000b828557cb2a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740f51b880238fb29090e866fdecffeb06b880238fb25150ff7424348b5c24448b44240c8b54243c90ff1289c3b87c647cb2e82adfecff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888647cb2894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc020000008941048b44240489018b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d000000f6c101740853e8b6fcecffeb01538b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e876deecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008d4114c740fc02000000c74004010000008908e832deecff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c030000008b542430895108894104c701070000008d4114c740fc02000000c740040100000089088d480cc741fc020000008941045883c41089018b45008d40f43b45087303ff5520894500c740fc02000000894804598908e8b20500008b4d008d49b43b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700c4757ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc02000000894804c700f0707ab28d480cc741fc02000000894104c701c4757ab28d410cc740fc03000000c7400803000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017405e816fbecfff644240c0175738b0c248339057513506a01bb0100000089c89090e84accecffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d0000005289c3b874238fb2e8a2dcecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb05e966000000c7410c03000000895908894104c7010700000051ff742430ff742430ff742430ff742430ff7424308b5c242c8b442428e8faf8ffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24048948085983c404894804c70003000000b960248fb2f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901741050b888248fb2909090e8f2f9ecffeb0889c1b888248fb25189c3b87c647cb29090e8c6dbecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410840687cb2894104c701070000008d4114c740fc040000005a83c41489500c895808894804c70003000000c2140090909000000000e4070000|@16449,2097151,@3831|23,0,@16436 30,1,@4940 61,0,@16437 71,0,@5398 77,0,@4608 114,1,@16438 120,0,0 168,0,0 180,0,@6321 216,0,0 277,0,0 287,0,2 318,0,0 339,0,@5897 356,0,1 365,0,14 397,0,0 404,0,1 418,1,@6933 457,0,0 466,1,@16439 497,0,0 507,0,2 538,0,0 574,0,@5348 595,0,@5348 614,0,@5348 631,0,1 640,0,14 672,0,0 679,0,1 690,1,@6933 710,1,@16440 734,0,@16345 754,1,@16348 762,1,@6721 792,0,@16441 826,1,@6564 842,0,2 850,1,@6843 883,0,0 890,0,2 903,0,6 910,0,@16442 918,1,@6881 949,0,1 961,0,3 966,0,@7217 997,0,0 1004,0,1 1015,0,@16443 1022,1,@6933 1029,0,@16443 1057,0,@7252 1062,1,@6881 1093,0,1 1100,0,@7253 1109,0,3 1126,0,0 1178,0,0 1187,0,14 1198,1,@6933 1232,0,0 1242,1,@6881 1273,0,1 1286,0,3 1303,0,0 1310,1,@6881 1341,0,1 1357,0,3 1374,0,0 1430,1,@16444 1461,0,0 1482,0,@5348 1501,0,@5348 1520,0,@5281 1539,0,@5348 1556,0,1 1565,0,14 1597,0,0 1604,0,1 1614,1,@6933 1637,0,0 1646,1,@6843 1681,0,0 1688,0,0 1697,0,6 1705,0,@16442 1710,1,@6881 1748,0,1 1760,0,3 1843,0,1 1848,0,@16445 1880,0,0 1887,0,1 1898,0,@16448 1906,1,@6933 1915,0,@16448 1923,0,@7252 1930,1,@6881 1961,0,1 1968,0,@7269 1977,0,3 2006,0,1 16436:S16|4e6f20636f6e7374727563746f72733a 16437:O5|@6866,1063,0,1063,0 16438:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e959caecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3826|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16439:D3,188|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e974f7ecff89c8c3b8c4757ab2c390909000000000b8000000|@6729,1048575,@3827|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 172,0,@5348 16440:D3,116|3b650c7303ff5524a80175578b088b55008d52f03b55087303ff5520895500c742fc030000008b5904895a088b31897204c7020d000000528b780489f8e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,63,@3828|51,0,6 100,0,0 16441:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@16350,63,@3829|62,0,0 72,0,0 16442:O2|@5532,0 16443:O3|14,@7217,1 16444:D3,188|3b650c7303ff5524a801756bff308b4004e8eaffffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e92f000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740789c8e974f5ecff89c8c3b8c4757ab2c390909000000000b8000000|@6729,1048575,@3830|49,0,0 98,0,0 107,0,14 145,0,0 152,0,1 164,1,@6933 172,0,@5348 16445:O2|@5897,@16446 16446:O2|@16447,0 16447:O3|2,@5579,0 16448:O3|14,@16445,1 16449:S59|545950454944434f444528292e7072696e746572466f7244617461747970652833297072696e746572466f72436f6e7374727563746f7273283129 16450:O1|@16451 16451:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3832|1,0,@5280 16452:D3,80|3b650c7303ff5524a80175338b08ff71088b480489c8909090e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,3,@3833|64,0,0 16453:O1|@16454 16454:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3834|1,0,@5280 16455:O1|@16456 16456:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3835|1,0,@5280 16457:S34|545950454944434f444528292e7072696e746572466f724461746174797065283329 16458:O1|@16459 16459:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3837|1,0,@5280 16460:S18|7072696e742d7072696e7464656661756c74 16461:D3,268|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e991c4ecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575738b48048b098b40088b008b13f6c2017409f6000174042b107105ff5538ebf783c2018b45008d40f03b45087303ff5520894500c740fc03000000c740080100000089500489088b5304909090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000eb05e901000000c3833803740f89c1b828f17bb28b5d04909090ff138b4004c39090900000000008010000|@6867,1048575,@3838|36,0,0 51,1,@6843 84,0,0 99,0,6 173,0,0 221,0,4 241,0,@6863 16462:S52|545950454944434f444528292e637265617465446174617479706546756e6374696f6e732835297365745072696e746572283429 16463:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3841| 16464:S39|545950454944434f444528292e637265617465446174617479706546756e6374696f6e73283529 16465:D3,80|3b650c7303ff5524a80175338b088b51048b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3843|64,0,0 16466:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3844| 16467:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3845|60,0,0 16468:O1|@16469 16469:D3,48|8b48048b108b45008d40f43b45087303ff5520894500c740fc020000008b49108948048910c39090000000002c000000|@16470,7,@3846| 16470:S57|434f444547454e5f50415253455452454528292e636f646553657175656e63652834296e657744656275677c6c6f63616c446563732d283129 16471:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3847| 16472:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3848| 16473:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3849| 16474:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3850| 16475:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3851| 16476:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3852| 16477:D3,304|3b650c7303ff5524a801756f8b088b51048b128b7208833e05740e8b7804b81c2d8fb28b5d0490ff1353ff7004ff7114ff720cff7604ff7608b80300000089daff128b4c24048901588b54242089108b098b44240883381d752e8b58048b73048b3651ff7424206a01ff742424ff730c89d389f0bab8bc8db2eb05e9a000000090e87290feffeb26833811740cb8582d8fb28b5d049090ff1351ff74242089d38b44240cba942d8fb2e83a0100008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c5883c40c894108c7410401000000c7010300000051ff742418ff742418ff7424188b5c24148b442410909090e806ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20c00b801000000c20c00000000002c010000|@6329,2097151,@3856|31,0,@16478 58,0,1 117,0,@15827 130,1,@15829 142,0,@16481 165,0,@16484 170,1,@16486 211,0,0 217,0,1 289,0,0 16478:O4|@4608,@5398,@16480,@16479 16479:O5|@16313,963,0,963,0 16480:S6|6c7641646472 16481:O4|@4608,@5398,@16483,@16482 16482:O5|@16313,983,0,983,0 16483:S6|636f64654578 16484:O4|@16486,@16494,@16519,@16485 16485:O5|5,@16534,@12166,@12023,@5229 16486:D3,484|3b650c7303ff55248b4d008d49e43b4d087303ff5520894d00c741fc03000000c7410801000000c74104010000008b720c89318d7910c747fc02000000c7470401000000890fff720468b82f8fb2505289f8909090e832b5ecff53ff7424188d4c241051bab8e37bb2e8b6b5ecff8b4c24048b55008d52e43b55087303ff5520895500c742fc03000000c7420801000000c74204010000008b590c891a8d7210c746fc02000000c74604010000008916ff710868a0308fb289c789f090e8cab4ecff57ff7424248d4c2408518b5c2414bab8e37bb2e84ab5ecff8b4c2414833905756fff7424248b5c24108b4104baec3f7cb29090e84611edff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c8e8b6ccecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b1424895108894104c70107000000eb0289c18b45008d40dc3b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c701502f89b28d410cc740fc02000000894804c700f0707ab29090e836ccecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c74008602f89b2894804c7000700000083c420c2040090909000000000e0010000|@16493,2097151,@3855|35,0,0 42,0,0 64,0,0 74,0,@16487 86,1,@6834 101,0,@6835 106,1,@6837 141,0,0 148,0,0 170,0,0 180,0,@16491 190,1,@6834 209,0,@6835 214,1,@6837 239,0,@7206 246,1,@7207 277,0,0 286,1,@6881 317,0,1 332,0,3 367,0,0 388,0,@13615 407,0,@5281 414,1,@6881 447,0,1 454,0,@13616 463,0,3 16487:D3,120|3b650c7303ff55248b52048b4208833803740ab844308fb28b5d04ff138b48048339057518bb010000008b3424891c24bb0300000089c856e90bbbecff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000c39090900000000074000000|@16490,1048575,@3853|20,0,@16488 38,0,0 49,0,1 57,1,@6843 88,0,0 95,0,1 104,0,6 16488:O4|101,@6569,0,@16489 16489:O5|@6542,508,0,508,0 16490:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b65536f6d652d283129 16491:D3,120|3b650c7303ff55248b52048b4208833803740ab844308fb28b5d04ff138b48048339057518bb010000008b3424891c24bb0300000089c856e923baecff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000c39090900000000074000000|@16492,1048575,@3854|20,0,@16488 38,0,0 49,0,1 57,1,@6843 88,0,0 95,0,1 104,0,6 16492:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b654e6f6e652d283129 16493:S26|44415441545950455f52455028292e6d6b45784964656e283329 16494:O7|@12246,@8967,@16496,@16495,@5229,0,0 16495:O3|2,@16517,@16516 16496:O2|1,@16497 16497:O3|2,@12295,@16498 16498:O2|@16499,0 16499:O4|@4607,69,@16500,0 16500:O3|2,3,@16501 16501:O5|@5411,@16502,@5902,@12257,@5387 16502:O2|@5433,@16503 16503:O2|@16505,@16504 16504:O2|@16509,@16508 16505:O2|@5762,@16506 16506:O3|0,@16507,@5415 16507:O8|@5351,@12246,0,0,@7118,0,0,1 16508:O2|@16513,0 16509:O2|@7017,@16510 16510:O3|0,@16511,@5415 16511:O8|@16512,@12246,0,0,@7118,0,0,1 16512:O3|14,@5708,1 16513:O2|@6234,@16514 16514:O3|0,@16515,@5415 16515:O8|@12275,@12246,0,0,@7118,0,0,1 16516:O5|5,@16518,@12166,@12023,@5229 16517:O3|6,@4760,79992 16518:O2|@16517,0 16519:O7|@12242,@5270,@16520,@16516,@5229,0,0 16520:O2|1,@16521 16521:O3|2,@12297,@16522 16522:O2|@16523,0 16523:O4|@4607,69,@16524,0 16524:O3|2,2,@16525 16525:O5|@5411,@16526,@5902,@12257,@5387 16526:O2|@5433,@16527 16527:O2|@16529,@16528 16528:O2|@16533,0 16529:O2|@5747,@16530 16530:O3|0,@16531,@5415 16531:O8|@16532,@12242,0,0,@7118,0,0,1 16532:O4|13,0,@5278,0 16533:O2|@8006,@5413 16534:O2|@16535,0 16535:O3|2,@16536,@5509 16536:O3|3,@16537,@5234 16537:O2|@16538,@6271 16538:O2|49,@14221 16539:D3,80|3b650c7303ff5524a80175338b088b51048b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3857|64,0,0 16540:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3858| 16541:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3859| 16542:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3860| 16543:D3,224|3b650c7303ff55248b4a1452ff7004ff30ff7104ff31ff7108ff71148b59108b4210909090e8aa81feff83380175058b0c24eb128b70048b188b042490e8b200000089c1eb038b70048b44240483c4048b55008d52dc3b55087303ff5520895500c742fc080000008b581c83c404895a1c8b7818897a188b7814897a148972108b700c89720c8b70088972088b70048972048b3089326a016a018b74240852ff760c8d5424085289cb8b46088b560490ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4088908c300000000dc000000|@16545,2097151,@3862|38,1,@15825 62,1,@16544 16544:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3861| 16545:S49|434f444547454e5f50415253455452454528292e636f646553657175656e636528342970726f636573735461696c283129 16546:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3863| 16547:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3864| 16548:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3865| 16549:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3866| 16550:D3,80|3b650c7303ff5524a80175338b088b51048b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3867|64,0,0 16551:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3868| 16552:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9bd89faff90000000002c000000|@16553,2097151,@3869|24,0,1 35,1,@13829 16553:S53|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429636865636b56617273283129283129283129 16554:D3,88|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701943a8fb28959048061ffbf89c389c8e86e7becff89c189d889caff1289c1b80300000089ca90ff12b801000000c30000000054000000|@16562,1048575,@3873|34,0,@16555 50,1,@6751 65,0,1 75,0,0 16555:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c700e43a8fb28950048b520489500889480c8060ffbfc39090900000000038000000|@16561,7,@3872|28,0,@16556 16556:D3,264|3b650c7303ff55248b4a0c83390b756d8b590c8b73088b7e04833f05756450ff71048b4204e8be7aecff833f05740e89c1b888a77bb28b5d049090ff13508b5c24048b4704e8b26cecff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701003c8fb28941048061ffbf6a016a0189e05089cb8b4708eb0ae97c000000e91a0000009090e82a04ecff5883c4045a83c4049090ff1289c15889caff2283f80174528b0683380575458b58048b1bf6c301740783fb017d30eb06f643ff1074288b490cff72088b19b88c3c8fb2e8dacfeaffbbc03c8fb29090e8cecfeaff5a90ff12b801000000c3b803000000c3b803000000c3b801000000c3c3900000000004010000|@16560,2097151,@3871|38,1,@6751 50,0,@6718 70,1,@6721 100,0,@16557 138,1,@6564 205,0,@16558 210,1,@4940 215,0,@16559 222,1,@4940 231,0,0 237,0,1 243,0,1 249,0,0 16557:D3,120|8b5204f6c20175358b0a8b198b303b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb148b7a0489fa3b650c7303ff5524ebc6bf0100000083ff017506b801000000c38b3f8b45008d40f83b45087303ff5520894500c740fc010000008b7f048938c39090900000000074000000|@6724,63,@3870|62,0,0 72,0,0 16558:S44|54797065206f662065787072657373696f6e20636f6e7461696e73206c6f63616c2064617461747970652028 16559:S25|29206f7574736964652069747320646566696e6974696f6e2e 16560:S56|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129283129 16561:S53|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129 16562:S40|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229 16563:D3,768|3b650c7303ff55248b4c24048b5134f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01756cba7c787cb2f6c20175358b32813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebc6bf0100000083ff01750d89c2b8287c7cb28b5d0490ff138b17813af4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837a08017520eb5f8b17813af4e539b2740e89c6b854eb7ab28b5d049090ff13837a0801745d8b70048b0e3b0b7443f6c1017563f6030175638b3bf7c7010000007407ba03000000eb068b178d54120183c20889ce89d1d1e93bc9f3a68d7c3f018d743601eb05e9810000008d4c090175638b48048b5104f6c2017510f6430401eb05e9650000007503ff55383b530475628b7108eb0ae97e000000e979000000f7c6010000007509f64308017503ff55383b730875638b790cf7c7010000007509f6430c017503ff55383b7b0c754a8b5110eb05e940000000f6c2017509f64310017503ff55383b5310752d89c18b4500eb05e9210000008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c204008b70088b38b801000000e812bcecff8b4d008d49b83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410878af8db2894104c701070000008d4114c740fc03000000c7400801000000895804c700050000008d5010c742fc02000000c742040100000089028d420cc740fc020000008950049090c70098c47ab28d500cc742fc02000000894204890a89d090e88abbecff8b4d008d49b83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c741040100000089018d410cc740fc03000000897008895804893889c28d4010c740fc020000008950048908c2040090909000000000fc020000|@16564,63,@3874|24,0,@4675 74,0,0 84,0,@7313 97,0,@4675 147,0,0 159,0,@7368 173,0,@4675 182,0,@6377 213,0,@4675 222,0,@6377 269,0,1 476,0,0 489,0,0 494,1,@6881 525,0,1 532,0,@15807 541,0,3 558,0,0 567,0,2 584,0,0 607,0,@6090 630,1,@6881 661,0,1 668,0,@15808 677,0,3 696,0,2 713,0,0 16564:S34|44454255474745525f28292e75706461746544656275674c6f636174696f6e283329 16565:O2|@16567,@16566 16566:O4|3,@16570,@7121,1 16567:D3,1144|3b650c7303ff55248b4c24088b7134f7c60100000075358b3e813ff4e539b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc3b90100000083f901756db97c787cb2f6c10175358b31813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01750e89c1b8287c7cb28b5d049090ff138b0f8139f4e539b2741689c6b854eb7ab28b5d04eb05e90d000000909090ff13837908017528eb1e8b31813ef4e539b2740e89c7b854eb7ab28b5d049090ff13837e08017508b801000000c20c008b0883f901752e8b4d008d49f03b4d087303ff5520894d00c741fc01000040c701010000008d7108c746fc01000000890e8930eb028b09515352b8030000008b5424109090ff128b0c248b55008d52ec3b55087303ff5520895500c742fc040000008b490483c404894a0c894208c7420401000000c702030000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089118b5424148b1af6c3017409f6020174042b1a7105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804893051568b5a0489daff128b4d008d49d43b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc04000000c7400c01000000894808c7400401000000c7001b0000008d4814c741fc02000000c7410401000000890189c8e87acafeff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410810767ab2894104c701070000008b44241c8b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b142489105189da9090ff128b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc03000000c74008010000008b54240c895004c700050000008b55008d52f03b55087303ff5520895500c742fc03000000c74208010000008b5c2410895a04c702050000008b5d008d5bd83b5d087303ff5520895d00c743fc02000000c743040100000089138d530cc742fc02000000895a0489028d420cc740fc03000000c7400801000000895004c7001d000000f6c201751d8b1a833b05750f8b5a0489da3b650c7303ff5524ebe5ba01000000eb05ba0300000083fa0174095190e816d5ecffeb01518b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c890e8d6b6ecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008d4114c740fc04000000c7400cc4757ab28948085983c404894804c700030000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c7400401000000890883f80175075883c408c20c0089c38b042483c40c5983c40c51e91f0000009090900000000074040000|@16569,1048575,@3876|27,0,@4675 77,0,0 87,0,@7313 100,0,@4675 150,0,0 162,0,@7368 177,0,@4675 186,0,@6377 217,0,@4675 226,0,@6377 244,0,0 284,0,0 310,0,1 364,0,0 370,0,1 401,0,0 464,0,0 511,0,4 528,0,0 538,0,0 544,0,13 561,0,0 570,1,@16016 601,0,1 608,0,@5352 617,0,3 679,0,0 727,0,4 744,0,0 757,0,2 788,0,0 801,0,2 832,0,0 866,0,0 875,0,14 907,0,0 914,0,1 926,1,@6933 960,0,0 970,1,@6881 1001,0,1 1014,0,3 1031,0,@5348 1047,0,1 1080,0,2 1097,0,0 1129,1,@16568 16568:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3875| 16569:S29|44454255474745525f28292e627265616b506f696e74436f6465283529 16570:O2|@16571,@7123 16571:O2|@16572,1 16572:O3|2,@4761,0 16573:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3877| 16574:D3,196|3b650c7303ff5524a801755b8b086a016a015351ff71108d5c240c8b4004909090e8daffffff833c240174408b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240489088b4c240889018b442410894104b80100000083c414c3e93b0000008b45008d40f43b45087303ff5520894500c740fc020000008b4c24108948048b4c240489088b4c24088b54240c8911894104b80100000083c414c3c70301000000c7430401000000b801000000c3909000000000c0000000|@6496,15,@3878|95,0,0 159,0,0 169,0,0 176,0,0 181,0,0 16575:D3,136|3b650c7303ff55248b480c8b098b5004833a2d750d8b52043b650c7303ff5524ebee833a0b750d8b52083b650c7303ff5524ebdc833a1774108b7008b8f4478fb28b5d04909090ff138b520853ff70085189d09090e882000000ff74240489c38b44240490e86a01000083f801750583c40858c389c383c40858e935030000900000000084000000|@16585,2097151,@3882|61,0,@16576 86,1,@16579 102,1,@16580 123,1,@16584 16576:O4|@4608,@5398,@16578,@16577 16577:O5|@16313,1534,0,1534,0 16578:S10|6765744d617463686573 16579:D3,228|3b650c7303ff5524a80175708b088b55008d52dc3b55087303ff5520895500c742fc01000040c702ec7d7ab28d5a08c743fc030000008b7110897308895304c70348c052088d5310c742fc02000000c74204010000008b7904893a8b7d008d7fd83b7d087303ff5520897d00c747fc04000000c7470c01000000eb05e952000000c7470801000000895f0489178d5714c742fc040000008b5914895a0c8972088b31897204893a528b40049090e84effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000e0000000|@6329,63,@3879|40,0,@5413 65,0,I48 82,0,0 118,0,0 132,0,0 212,0,0 16580:D3,396|3b650c7303ff5524a80175708b088b55008d52c03b55087303ff5520895500c742fc01000040c702ec7d7ab28d7208c746fc03000000c74608f1700200895604c7060d0000008d5610c742fc01000040c702ec7d7ab28d7a08c747fc03000000c74708f1700200895704c7070d0000008d5710c742fc03000000eb05e9fb000000897a08897204c7020500000053ff700457565189d38b410cba84287bb2909090e8d22eecff83f801740ab8cc4a8fb28b5d04ff138b45008d40f03b45087303ff5520894500c740fc01000040c700030000008d4808c741fc010000405a89118b55008d52f83b55087303ff5520895500c742fc010000405b891a8b5d008d5bf83b5d087303ff5520895d00c743fc010000405e89338b75008d76e43b75087303ff5520897500c746fc06000000895e148946108b44240c89460c894e088b4c2404894e048916565089cb8b4424089090e8aafeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000088010000|@6329,2097151,@3880|40,0,@5413 57,0,79992 66,0,6 82,0,@5413 99,0,79992 108,0,6 137,0,2 154,0,@6509 162,1,@6714 172,0,@16581 207,0,1 381,0,0 16581:O4|@4608,@5398,@16583,@16582 16582:O5|@16313,1553,0,1553,0 16583:S10|6d6b4656616c42696e64 16584:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3881| 16585:S61|434f444547454e5f50415253455452454528292e636f646552656356616c42696e64696e677328332976616c42696e64546f4676616c42696e64283229 16586:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3883| 16587:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3884| 16588:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3885| 16589:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3886| 16590:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3887| 16591:S35|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429 16592:O2|@16594,@16593 16593:O3|@16763,@16762,@13807 16594:D3,908|8d7c24a03b7d0c7303ff55288b4c24088b318b79045052ff7114ff710cff710890e87a0300008b4c241056505753f6c10175528b018b50088b128b5d008d5bec3b5d087303ff5520895d00c743fc04000000c703b0518fb28b74240c8973048b3c24897b088b780c897b0c8063ffbfff71048b420ce802ecffff593b650c7303ff5524eba9b8010000008b5c24108b442420909090e8ee0300008b4c242089c283f901751b83fa01740f89c1b8e43086b28b5d04909090ff13b901000000eb4df6c201740c89c3b8e43086b28b5d04ff138b198b73088b368b7e08833f05740d50b8a4528fb28b5d049090ff138b5f048b3289338b77088b5c2404891e8b52048b49043b650c7303ff5524eb93508b5c241c8b442424909090e81e0400008b4c242050ff742404ff742420ff74241cff74241850ff742434ff74244cff742444ff742424ff742434ff7104ff74243489c38b442458e89a0600008b4c242883c4045a83c40483f901751a83fa01740e89c1b8e43086b28b5d049090ff13b901000000eb4cf6c201740c89c3b8e43086b28b5d04ff138b198b73088b368b7e08833f05740d50b8a4528fb28b5d049090ff138b5f048b3289338b77088b1c24891e8b52048b49043b650c7303ff5524eb958b4c242883c4046a0150ff7104ff31ff7108ff71148b59108b44241890e83668feff8b4c240c8b5134f6c20175358b1a813bfce539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01756eba7c787cb2f6c20175358b1a813bfce539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01750f8b50048b18b8287c7cb28b5d04ff138b16813afce539b274168b58048b38b854eb7ab2eb05e90d0000008b5d04ff13837a0801745deb228b16813afce539b274128b58048b38b854eb7ab28b5d04909090ff13837a08017439ff7004ff308b44241090e8266f00008b442410a801751bff70048b5c24188b009090e8c2730000583b650c7303ff5524ebe1b801000000eb0c8b48048b18b8010000005153837c240801750ab8a4f88eb28b5d04ff138b442408e812a8ffff8b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc020000005a89500489088b4c242c89015883c424894104b801000000c208000000000088030000|@16761,2097151,@3973|34,1,@16595 84,0,@16596 118,1,@16554 134,0,0 150,1,@16598 173,0,@11846 186,0,0 200,0,@11846 226,0,@16599 282,1,@16602 342,1,@16608 370,0,@11846 382,0,0 396,0,@11846 422,0,@16599 494,1,@15825 514,0,@4676 564,0,0 574,0,@7313 587,0,@4676 637,0,0 652,0,@7368 665,0,@4676 677,0,@6377 705,0,@4676 717,0,@6377 746,1,@16749 770,1,@16757 786,0,0 798,0,0 812,0,@16373 826,1,@16376 859,0,3 893,0,0 16595:D3,80|3b650c7303ff5524a80175338b088b51088b12528b480489c8e8e2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000004c000000|@6329,7,@3889|64,0,0 16596:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9b171faff90000000002c000000|@16597,2097151,@3890|24,0,1 35,1,@13829 16597:S53|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329636865636b56617273283129283129 16598:D3,92|3b650c7303ff5524a801754253ff7004b80500000089da90ff12508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,1048575,@3891|17,0,2 79,0,0 16599:O4|@4608,@5398,@16601,@16600 16600:O5|@16313,1150,0,1150,0 16601:S15|73657456616c756541646472657373 16602:D3,92|3b650c7303ff5524a801754253ff70048b00909090e856000000508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,2097151,@3895|22,1,@16603 79,0,0 16603:D3,96|3b650c7303ff55248b40088b008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701cc538fb28959048061ffbf6a016a0189e25289cb8b400c909090e8feebebff83c40458909090e81a8eecffe94901000090000000005c000000|@16607,2097151,@3894|39,0,@16604 66,1,@6564 78,1,@6830 83,1,@16606 16604:D3,228|8b5204f6c201756b8b0a8b590c833b0375668b7304f7c60100000075368b0e8b198b3b3b38751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901750d8b52043b650c7303ff5524eb998b098b118b5d00eb0ae95c000000e9450000008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b3a897b04c7030d000000508b45008d40f83b45087303ff5520894500c740fc01000000891883c404c38b720489f23b650c7303ff5524e92fffffff89c1b801000000c300000000e0000000|@16605,63,@3892|84,0,0 159,0,6 215,0,0 16605:S41|545950454944434f444528292e547970655661724d61702e6d61705479706556617273283129283129 16606:D3,92|3b650c7303ff5524a80175418b088b510483e20983fa01742a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,7,@3893|78,0,0 16607:S48|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329676574506f6c79283129 16608:D3,3880|8dbc24ecfeffff3b7d0c7303ff5528a8017560f6c3017560f644243001755e8b088b118b128b71088b368b79108b3fff7004ff308b41148b008b0c24ff7304ff338b5c2440ff7304ff33ff710c505257ff71048b1e8b442458e896b5eaffb9010000008b54241cf6c201752df6c1017416eb0fe9a00e0000e99b0e0000e9960e000083c1027105ff5538ebf68b52043b650c7303ff5524ebcef6042401740e89c2b8dc648fb28b5d049090ff138b14248b1a8b3350518b0690e8ca0e00008b4c2408bae4707ab250f6c1017531f6c201751a837a040175148b01ff71048b480489c8909090e8060f0000eb0589d0ff710489c2593b650c7303ff5524ebca89d08b4c24608b5134f6c20175358b1a813bf4e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01756cba7c787cb2f6c20175358b1a813bf4e539b2751c8b75008d76f83b75087303ff5520897500c746fc01000000891eeb148b5a0489da3b650c7303ff5524ebc6be0100000083fe01750d89c2b8287c7cb28b5d0490ff138b16813af4e539b2741689c3b854eb7ab28b5d04eb05e90d000000909090ff13837a08017427eb1e8b16813af4e539b2740e89c3b854eb7ab28b5d049090ff13837a08017407b8e4707ab2eb42bb0100000089c7f7c701000000751cf6c301740583c3027105ff5538ebf68b7f043b650c7303ff5524ebdcf6c301740783fb037e0deb06f643ff107505b8e4707ab2bb0100000089c7f7c701000000751cf6c301740583c3027105ff5538ebf68b7f043b650c7303ff5524ebdc6a016a01a801751783780401751189e78b00890789e0c7400401000000eb1189e0c7000300000089e0c74004030000008b442404a8017410f644240c0174098d40ff0344240c7105ff5538ebf289c78b442408909090e842160000a8017526f7c701000000740cf6000174078d7fff03387105ff5538ebf48b40043b650c7303ff5524ebd689f8837c241803754883f80375488b4c2408baac707ab2533bca7507b903000000eb51f6c1017551f6c20175518b198b323bde7507bb03000000eb53f6c3017549f7c601000000753a8b3b3b3e751eeb0ae98d000000e9800000008b76048b7b0489fb3b650c7303ff5524ebc4bb01000000eb1be941000000e937000000e92b000000bb01000000eb05bb0100000083fb0174138b52048b49043b650c7303ff5524e971ffffffb901000000eb0cb901000000eb05b90100000083f9017415837c2404037407b901000000eb1cb903000000eb15b901000000eb0eb90100000053eb06b9010000005351508b5c24248b4424209090e8a215000050ff74241cff7424108b5c2420b80100000090e8aa160000b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf8b5424748b5d008d5be83b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc03000000c7061c738fb2895e048b7a04897e088066ffbf8b3af7c701000000740583c7027105ff5538ebf6508b45008d40f03b45087303ff5520894500c740fc030000008958088970048938837c242c03756789cef7c601000000740df64424080174062b7424087105ff5538ebf583c601538b5c240cf6c301740df644241c0174062b5c241c7105ff5538ebf583c301f6c301740df64424240174062b5c24247105ff5538ebf583c30183fb037561f7c601000000740eeb05e90101000083fe017c08eb15f646ff10740f89c3b8a4727db28b5d04909090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000897304c703010000008d730cc746fc02000000895e04c70609000000eb6cf6c301740783fb017e08eb12f643ff10740c50b84c748fb28b5d0490ff135056688c748fb25157ff720489d88d5c240c9090e8dedcebff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10833a057516eb05e9320000008b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740e89c8909090e81ebeecff89c6eb6989ceeb6a506a016a015157ff7204eb638b742418f7c6010000007410f64424200174098d76ff037424207105ff5538ebf253506a016a015157ff72045189f38b44243ce8661900008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000eb0fe94c000000e947000000e942000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c890e866bdecff89c6eb0289ce8b45008d40ec3b45087303ff5520894500c740fc01000040c700030000008d4808c741fc02000000c70154788fb28941048061ffbf505156bb030000008b442430bafc317ab2909090e88ad5eaff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c74104b07e7fb289018d410cc740fc02000000894804c7005100000089c18d400cc740fc020000008948048b4c244c89089090e876b4eaff837c2438037407b901000000eb05b90300000083f102ff742414ff74244c51ff74241c68e0788fb2508d5c24048b4424609090e8e6daebff89c38b842484000000ba74587cb290e84afbecff8b8c24b4000000ba0100000050f6c101751fff7104ff74240489d38b019090e84e1d000089c2593b650c7303ff5524ebdc89d083f80175058b0424eb0b89c38b042490e80a1f00008b4d008d49cc3b4d087303ff5520894d00c741fc02000000894104c701030000008d510cc742fc01000040c702010000008d5a08c743fc04000000894b0c8b4c242083c404894b088b74243889730489138d7b14c747fc020000008bb424b0000000897704891f8b9c24ac000000837c244c017407b801000000eb465257ff33ff7310ff731cffb424c80000006a01ffb424d400000050ff74245cff742448ff742454ff742454ff7424708b9c24dc0000008b8424e00000009090e8a21e0000eb0a5257ff33ff7310ff731cffb424b4000000ff742404ff742414ff742420ff742440ff742460ff742420ff742448ff742478ffb424d0000000ffb424d8000000ff74246cff74246cff74246cffb42488000000ffb424a000000068d4818fb250ff742474ffb424d0000000ffb424d8000000ffb424e0000000ff74245cffb424a8000000ff742468ffb424940000008b9c24e00000008d442424ba18868fb2909090e85a270000b9010000008b94249c000000f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdff6c101750df68424a4000000017503ff55383b8c24a4000000740f89c1b838b18fb28b5d04909090ff13f644245401740d89c1b8d0717cb28b5d0490ff138b4c24588b0989c389c89090e8b612edffb901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8833c2401740f89de8b1c24909090e8d651000089f383f801742689d98b5d008d5bf03b5d087303ff5520895d00c743fc03000000894b08894304c703150000008b84249800000083c45c8b00b901000000a80175328b108b75008d76f43b75087303ff5520897500c746fc02000000894e048b0a890e89f18b500489d03b650c7303ff5524ebca89c890e81e9cecff8b4c24208b098b5424208b128b7424208916813c2448c05208742df604240175308b3424bf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb0989cab98cc77ab2eb0589ca8b0c2489d689cf90e852510000508b4424449090e8ba5100008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54245889511c897118c74114030000008941105883c44c89410cc741080100000089790489198b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000f64424380175708b4c246c8b5d008d5be83b5d087303ff5520895d00c743fc01000040c703010000008d7308c746fc03000000c706d0b28fb2895e048b7904897e088066ffbf8b11f6c201740583c2027105ff5538ebf68b4d008d49f03b4d087303ff5520894d00c741fc03000000895908897104eb05e9040000008911eb048b4c246c8b5424408b52088b128b5a08833b05740e89c6b8a4528fb28b5d049090ff138b73048b7c2430893e8b7b088b54246c8917833c2401746c8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b442430890151ff742438ff74247cff74247c52ff74247cff74247cff74247cff74247cff74247cff74247cff74247cff74247c8b5c24708b44247890e892f3ffff89c18b45008d40f43b4508730aeb05e919000000ff5520894500c740fc0200000089480459890883c448c230006a016a0150516800b48fb2ff7424248d44241050ff74244c5251ff74243cff742430ff7424388b5c244c89c89090e806520000f64424480174068b442408eb6db8010000008b4c2448f6c101751ba801740583c0027105ff5538ebf68b49043b650c7303ff5524ebe050bb48778eb28b44242c909090e8dea8eaff8b4c24048b49088b09ba01000000f6c10175398b198b75008d76f43b75087303ff5520897500c746fc02000000895604eb05e9dd0000008b13891689f28b590489d93b650c7303ff5524ebc289d189c389c890e83a99ecff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8b28dfeff5053bb58bf8fb28b442408e8aad4ebff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4088941048b44240889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4c244083c404f6c101740583c1027105ff5538ebf68b55008d52e83b55087303ff5520895500c742fc020000005b83c408895a04890a8d4a0cc741fc020000008941048b44243089015251ff74243cffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb424800000008b5c24748b44247c9090e82af1ffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c448c23000b801000000c2300000000000240f0000|@16748,2097151,@3965|90,1,@4940 95,0,0 162,0,@16609 186,1,@16612 195,0,@5280 230,1,@16613 272,0,@4675 322,0,0 332,0,@7313 345,0,@4675 395,0,0 407,0,@7368 421,0,@4675 430,0,@6377 461,0,@4675 470,0,@6377 488,0,@5280 495,0,0 556,0,@5280 561,0,0 628,0,0 638,0,1 647,0,1 690,1,@16629 755,0,@5276 765,0,1 790,0,1 846,0,0 868,0,0 875,0,0 904,0,0 911,0,0 918,0,0 935,0,0 942,0,1 949,0,0 956,0,0 964,0,0 982,1,@16630 1000,0,0 1006,1,@16631 1011,0,0 1080,0,0 1096,0,@16640 1297,0,@7993 1338,0,0 1357,0,4 1383,0,@16641 1396,0,@16644 1414,1,@6547 1445,0,0 1454,0,14 1492,0,0 1499,0,1 1514,1,@6933 1590,1,@16646 1621,0,0 1647,0,14 1678,0,0 1685,0,1 1698,1,@6933 1734,0,1 1750,0,@16649 1765,0,1 1774,0,@5052 1782,1,@5053 1813,0,@8705 1834,0,40 1862,1,@4953 1874,0,0 1881,0,1 1902,0,@16651 1918,1,@6547 1932,0,@7237 1938,1,@7238 1950,0,0 1974,1,@16655 2010,1,@16660 2043,0,1 2059,0,0 2132,0,0 2202,1,@16661 2298,0,@16667 2362,0,@16673 2370,1,@16675 2375,0,0 2449,0,@16718 2471,0,@7307 2494,1,@7310 2499,0,0 2570,1,@16721 2615,0,10 2632,0,0 2694,1,@6883 2719,0,I48 2735,0,I48 2742,0,4 2773,0,@6130 2790,1,@16722 2802,1,@16723 2843,0,1 2860,0,0 2898,0,7 2939,0,0 2955,0,@16724 3054,0,@16599 3234,0,@16725 3274,1,@16728 3292,0,0 3334,0,@16185 3346,1,@4940 3360,0,0 3434,1,@6883 3440,0,I48 3454,0,I48 3459,0,4 3484,0,@6130 3498,1,@15942 3505,0,@16746 3514,1,@6547 3545,0,1 3552,0,0 3559,0,0 3576,0,0 3622,0,7 3865,0,0 16609:O4|@4608,@5398,@16611,@16610 16610:O5|@16313,1205,0,1205,0 16611:S23|6261646c7920666f726d65642070617273652074726565 16612:D3,84|3b650c7303ff5524a801753aff70048b00e852000000508b4424049090e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000050000000|@6329,2097151,@3900|18,1,@16613 71,0,0 16613:D3,968|3b650c7303ff55248b08baa6658fb28d548afcffe290e9f3000000909090e9eb000000909090e9e9000000909090e91a010000909090e953010000909090e96f010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e94f010000909090e99b000000909090e993000000909090e968010000909090e968010000909090e99a010000909090e973000000909090e96b000000909090e92e020000909090e95e020000909090e953000000909090e94b000000909090e98c020000909090e93b000000909090e933000000909090e97c020000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e903000000909090b8e4707ab2c38b40048b40088b00ba6c698fb2e8e602000083f00289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b40048b4004b9e4707ab2a801752ff6c10175178379040175118b08ff70048b01909090e88afeffffeb068b500489c85289c1583b650c7303ff5524ebcd89c8c38b4804ff71048b41089090e862feffffa801750c83780401750658e952feffff83c404c38b4008e946feffff8b4004a801740c89c1b85c187db28b5d04ff138378040175068b008b00eb0d8b40043b650c7303ff5524ebd7e915feffff8b4004e90dfeffff8b40048b40088b00ba6c698fb290e80602000083f00289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b40088b0089c183390775218b490883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f102eb1983390d750f8b49048b093b650c7303ff5524ebc6b90100000083f9017406b8e4707ab2c383380b75278b400c8b40088b4804833905740cb88c6c8fb28b5d049090ff138b41083b650c7303ff5524ebd483380d750f8b40048b003b650c7303ff5524ebc0833807740e89c1b8e46c8fb28b5d049090ff138b4004e9cb0400008b40048b00ba6c698fb29090e82201000083f00289c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c38b4004833801750c8b08b8a86d8fb28b5d04ff138b00a801740e89c1b85c187db28b5d049090ff138378040175068b008b00eb0d8b40043b650c7303ff5524ebd5e9a9fcffff8b4004e9a1fcffff8b40088b0083380b75258b400c8b40088b4804833905740ab88c6c8fb28b5d04ff138b41083b650c7303ff5524ebd683380d750f8b40048b003b650c7303ff5524ebc2833807740e89c1b8e46c8fb28b5d049090ff138b4004e9ab04000090909000000000c4030000|@16628,2097151,@3899|11,0,$16613+22 271,0,@5280 285,0,@16614 290,1,@16615 326,0,0 340,0,@5280 452,0,@7847 508,0,@16614 514,1,@16615 550,0,0 623,0,0 633,0,@5280 658,0,@16617 710,0,@16620 725,1,@16623 735,0,@16614 742,1,@16615 778,0,0 796,0,@16624 814,0,@7847 888,0,@16617 938,0,@16620 953,1,@16627 16614:O11|@16615,@4644,@5308,@6668,@6678,@6686,@5316,@4609,@4648,@4646,@4604 16615:D3,696|3b650c7303ff552452e842a0ebff83380975628b480483f9017507b901000000eb2c8b118b5a088b7304833e0375128b3c248b57283b56047507b903000000eb0d8b49043b650c7303ff5524ebc883f90174278b04248b4d008d49f83b4d087303ff5520894d00c741fc010000008b50088911eb67e9e40100008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375128b3c248b57043b56047507b903000000eb0d8b49043b650c7303ff5524ebc883f90174278b04248b4d008d49f83b4d087303ff5520894d00c741fc010000008b500c8911eb67e93c0100008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375128b3c248b57243b56047507b903000000eb0d8b49043b650c7303ff5524ebc883f90174278b04248b4d008d49f83b4d087303ff5520894d00c741fc010000008b50108911eb67e9d50000008b480483f9017507b901000000eb2c8b118b5a088b7304833e0375128b3c248b57203b56047507b903000000eb0d8b49043b650c7303ff5524ebc883f90174278b04248b4d008d49f83b4d087303ff5520894d00c741fc010000008b50148911eb69e96e0000008b400483f8017507b801000000eb2e8b088b51088b5a04833b0375128b34248b7e1c3b7b047507b803000000eb0f8b700489f03b650c7303ff5524ebc683f80174278b04248b4d008d49f83b4d087303ff5520894d00c741fc010000008b50188911eb0ae905000000b90100000083f9017509b80100000083c404c38b098b41088b5004833a03751d8b1c248b72043b73047409b80100000083c404c3b80300000083c404c3b80100000083c404c383380b75438378040175348b400c8b48088b5104833a03751d8b1c248b72043b73047409b80100000083c404c3b80300000083c404c3b80100000083c404c3b80100000083c404c3b80100000083c404c39000000000b4020000|@16616,2097151,@3896|10,1,@6447 28,0,0 59,0,1 131,0,0 162,0,1 234,0,0 265,0,1 337,0,0 368,0,1 440,0,0 471,0,1 537,0,0 547,0,0 580,0,0 589,0,1 598,0,0 643,0,0 652,0,1 661,0,0 670,0,0 679,0,0 16616:S27|545950455f5452454528292e6973466c6f6174696e675074283129 16617:O4|@4608,@5398,@16619,@16618 16618:O5|@6454,97,0,97,0 16619:S33|74634571756976616c656e743a204e6f74206120747970652066756e6374696f6e 16620:O4|@4608,@5398,@16622,@16621 16621:O5|@6454,2978,0,2978,0 16622:S26|656e7472794e756d626572202d206e6f742061207265636f7264 16623:D3,96|3b650c7303ff5524a80175468b08ff70048b4104ba6c698fb2e84afcffff83f002508b442404909090e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c3000000005c000000|@6329,2097151,@3897|21,0,@16614 26,1,@16615 83,0,0 16624:O4|@4608,@5398,@16626,@16625 16625:O5|@16313,178,0,178,0 16626:S26|7475706c6557696474683a20656d707479206c6f63616c646563 16627:D3,96|3b650c7303ff5524a80175468b08ff70048b4104ba6c698fb2e886fbffff83f002508b442404909090e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c3000000005c000000|@6329,2097151,@3898|21,0,@16614 26,1,@16615 83,0,0 16628:S33|434f444547454e5f50415253455452454528292e7475706c655769647468283129 16629:D3,112|3b650c7303ff5524a8017553b9010000008b10f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf518b400490e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000006c000000|@6329,7,@3901|13,0,0 96,0,0 16630:D3,268|3b650c7303ff5524a80175628b088b1183fb03751af60201740f8b7004b81c777bb28b5d049090ff138b328b3eeb448b75008d76e43b75087303ff5520897500c746fc01000040c706ec7d7ab28d7e08c747fc04000000538b5908895f0c8977088b12895704c70733000000eb06e98b000000538b55008d52d43b55087303ff5520895500c742fc01000040c702e4107bb28d5a08c743fc01000040c703e4107bb28d7308c746fc06000000ff70048b410c8946148b4108894610895e0c895608897e048b51048916568b5c24088b442404909090e826ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000008010000|@6329,63,@3902|30,0,@6704 73,0,@5413 104,0,25 142,0,@6455 158,0,@6455 255,0,0 16631:D3,160|3b650c7303ff5524f6c301753583f80175048b03eb128b73048b0b89c389c89090e88e000000eb038b73048b4c24088b542404894c24088954240489f3e9beffffff50bb48718fb28b44240c90e87ac7ebff837c240803751b83f801750458c2080089c38b042483c4045983c40851e91801000090e86a01000083f801750458c2080089c38b042483c4045983c40851e9ab010000909090000000009c000000|@16639,1048575,@3908|34,1,@16632 68,0,@16633 78,1,@6547 112,1,@16636 118,1,@16637 145,1,@16638 16632:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3903| 16633:O1|@16634 16634:D3,16|b803000000c39090000000000c000000|@16635,1,@3904|1,0,1 16635:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229706f6c795061726d732d283129 16636:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3905| 16637:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8e4707ab2c39090900000000044000000|@6536,3,@3906|56,0,@5280 16638:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3907| 16639:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229 16640:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9f083ecff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3909|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16641:O4|@4608,@5398,@16643,@16642 16642:O5|@16313,127,0,127,0 16643:S10|6d6b4172675475706c65 16644:D3,116|a801740ef642040174088d40ff0342047105ff5538ebf3a801740783f8017c08eb13f640ff10740d89c1b8a4727db28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000070000000|@16645,7,@3910|43,0,@7993 82,0,0 101,0,4 16645:S36|434f444547454e5f50415253455452454528292e6d6b4172675475706c65283229283129 16646:D3,552|3b650c7303ff5524a801756c8b4c2404f6c1017409f6c30174042bcb7105ff5538ebf783c101ba010000008b30f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdcf6c1017409f6c20174042bca7105ff5538ebf783c101ba010000008b30f7c6010000007523eb05e99b010000f6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebd583fa037559f6c101740783f9017c08eb17f641ff1074118b50048b30b8a4727db28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702010000008d4a0cc741fc02000000895104c70109000000eb6bf6c201740783fa017e08eb16f642ff1074108b70048b38b84c748fb28b5d0490ff1351687c778fb2ff700453ff308d5c240c89d09090e896c1ebff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10eb05e933000000833a05750f8b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801741889c8909090e8d6a2ecff89c1eb0a6a016a01ff700453ff30b8010000005af6c201751ba801740583c0027105ff5538ebf68b52043b650c7303ff5524ebe0a801740ef604240174088d40ff0304247105ff5538ebf351ff74241889c38b44240c90e80efeffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4108908c20400b801000000c204000000000024020000|@16648,1048575,@3912|39,0,0 104,0,0 182,0,@7993 222,0,0 241,0,4 271,0,@16641 283,0,@16647 302,1,@6547 333,0,0 342,0,14 380,0,0 387,0,1 402,1,@6933 421,0,0 537,0,0 16647:D3,116|a801740ef642040174088d40ff0342047105ff5538ebf3a801740783f8017c08eb13f640ff10740d89c1b8a4727db28b5d0490ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000070000000|@16645,7,@3911|43,0,@7993 82,0,0 101,0,4 16648:S71|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296172674c6973742d6d616b6541726773283229 16649:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@16650,15,@3913| 16650:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329666e4d6b41646472283129 16651:D3,72|89c18b45008d40e43b45087303ff5520894500c740fc06000000c7003c798fb28b5a048958048b72088970088b7a0c89780c8948108b4a108948148060ffbfc30000000044000000|@16654,63,@3915|28,0,@16652 16652:D3,196|3b650c7303ff55248b4a10f6c101740ef642140174088d49ff034a147105ff5538ebf3f6c101740bf6420c0174052b4a0c7105ff5538ebf683c101f6c101740bf642080174052b4a087105ff5538ebf683c1018b18f6c301740bf642040174052b5a047105ff5538ebf683c3018b50048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008958048908ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c3909000000000c0000000|@16653,1048575,@3914|139,0,1 181,0,4 16653:S67|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129283129 16654:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129 16655:D3,248|a80175628b4c2404f6c10175378b118b328b388b163b17751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b09890feb128b49043b650c7303ff5524ebc4bf0100000083ff01757089d9f6c101753e8b118b328b388b163b1775258b7d00eb05e97d0000008d7ff83b7d087303ff5520897d00c747fc010000008b09890feb128b49043b650c7303ff5524ebbdbf0100000083ff01753b8b4d008d49e83b4d087303ff5520894d00c741fc02000000c74104b47b8fb2eb05e9150000008b10891189de8d590cc743fc02000000897304890b8b40043b650c7303ff5524e918ffffff89d8c2040090909000000000f4000000|@16659,63,@3917|69,0,0 148,0,0 184,0,@16656 16656:O1|@16657 16657:D3,16|b8d03e7cb2c39090000000000c000000|@16658,1,@3916|1,0,@7190 16658:S87|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229636865636b506f6c796d6f72706869736d283229283129 16659:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229 16660:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3918| 16661:D3,864|3b650c7303ff5524a8017561f6c3017561f644242401755f8b4c2424833901755b8b108b72088b368b7e08833f05740d8b5004b8a4528fb28b5d04ff138b57048b3389328b77088b54241c89168b7424208b7c2418ff71048b4c2418ff73048b5c2418ff70048b44241850eb14e95a000000e955000000e950000000e94b0000008b442418508b442418508b4424148944243c8974243889542434897c2430894c242c895c24288b442408894424248b442404894424205883c408894424108b5c24045883c408e934ffffffa8017561f6c3017561f644242401755f8b4c2424ff7104ff7304ff7004ff30ff33ff7424288b5c24308b019090e8760200008b4c24248b098b5424248b12f6c201740583c2027105ff5538ebf68b5c242489138b5424308b742420f7c601000000741aeb0fe919020000e914020000e90f020000f6020174042b327105ff5538ebf783c601f7c601000000740783fe017c08eb15f646ff10740f89c7b840f77bb28b5d04909090ff13f7c601000000740783fe017e5aeb06f646ff107552f7c601000000740583ee027105ff5538ebf689c78b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008970048b3424893051578b54242490ff128b5c2420909090e8de78ecffeb4a8b3424f7c601000000740783fe017c08eb13f646ff10740d89c7b8bcf97bb28b5d0490ff1389c78b45008d40f43b45087303ff5520894500c740fc02000000897004c7000500000051578b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b44240c8b40088b008b5008833a05740db8a4528fb28b5d04909090ff138b5a048b74240489338b7a088b7424308937518b44240490e8367cecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c030000005a83c404895108894104c701070000008d4114c740fc0400000089480c5983c408894808c7400401000000c700030000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b54242c89510489018b4424288b5c24248b7c241c8b542418518b4c2418518b4c2418518b4c2414894c243c8b4c2408894c243889442434895c24308974242c897c2428895424248b442404894424205883c408894424108b5c24045883c408e9b1fcffff8b442420c224009090000000005c030000|@16666,1048575,@3920|52,0,@16599 250,1,@16662 361,0,@6871 441,0,0 470,1,@6874 503,0,@6876 544,0,2 579,0,4 601,0,@16599 638,1,@6881 669,0,1 685,0,3 712,0,0 718,0,1 16662:D3,196|3b650c7303ff5524a801757189d9f6c10175378b118b328b388b163b17751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b09890feb128b49043b650c7303ff5524ebc4bf0100000083ff01750d8b4804b82c818fb28b5d04ff138b3f53ff70048b44240c8b57049090ff1250ff7424108b5c240ceb05e9320000008b442408909090e872ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c2040000000000c0000000|@6329,1048575,@3919|75,0,0 88,0,@16663 181,0,0 16663:O4|@4608,@5398,@16665,@16664 16664:O5|@16313,1367,0,1367,0 16665:S31|6372656174654d6174636865733a204d697373696e67207479706520766172 16666:S73|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296372656174654170706c69636174696f6e73283429 16667:D3,572|3b650c7303ff552452ff722cff7228ff7230ff723889c38b4240909090e8de35feff8b0c248b55008d52dc3b55087303ff5520895500c742fc080000008b593c895a1cc74218010000008b71388972148b7804897a108b7934897a0c8b7930897a088b792c897a048b7928893a8b3c24ff30ff77246a01528b5f208b471c8b5718909090ff12833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c700150000008b4c240483790403750483c408c38b5114f6c201740583ea027105ff5538ebf68b5910f6c301740bf641100174052b59107105ff5538ebf683c301f6c301740783fb017c08eb15f643ff10740f89c6b840f77bb28b5d04909090ff13f6c301740783fb017e51eb06f643ff107549f6c301740583eb027105ff5538ebf689c68b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008958048910568b510cff128b4c24088b5908e85a74ecffeb45f6c201740783fa017c08eb15f642ff10740f89c3b8bcf97bb28b5d04909090ff1389c38b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000538b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000006a016a018b442410518d54240452bb24848fb28b4004ba08a57db2e85621eeff8b4424088060ffbf8b4d008d49f43b4d087303ff5520894d00c741fc020000008941048b44240489015883c4088b54240c8944240c89cb5883c40852e971000000900000000038020000|@16672,2097151,@3923|30,1,@15825 70,0,0 177,0,10 261,0,@6871 335,0,1 358,1,@6874 385,0,@6876 428,0,0 462,0,4 481,0,@16668 489,0,@8058 494,1,@8060 559,1,@16671 16668:O1|@16669 16669:D3,16|b803000000c39090000000000c000000|@16670,1,@3921|1,0,1 16670:S32|434f44455452454528292e6d6b536574436f6e7461696e65722d283329283129 16671:D3,324|3b650c7303ff552483380b755253ff7008ff74240c8b400490e8e2ffffff50ff7424108b5c240c8b4424089090e8ceffffff89c18b45008d40f03b45087303ff5520894500c740fc030000008948085983c408894804c7000b000000c204008338177503c20400833815753cff7004ff7424088b4008909090e882ffffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70015000000c20400833803755d53ff7004ff700cff7424108b40089090e83effffff50ff7424148b5c24108b4424089090e82affffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c5983c4048948085983c404894804c70003000000c2040089c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c895808894804c70019000000c2040090900000000040010000|@8046,15,@3922|88,0,5 161,0,10 259,0,1 307,0,12 16672:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329636f6465426f6479283129 16673:O4|@16675,@16707,@16711,@16674 16674:O4|3,@16715,@7121,1 16675:D3,8156|8dbc247cffffff3b7d0c7303ff55288b4c24088b7134f7c60100000075358b3e813ff4e539b2751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008939eb148b7e0489fe3b650c7303ff5524ebc3b90100000083f901756bb97c787cb2f6c10175358b31813ef4e539b2751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b710489f13b650c7303ff5524ebc6bf0100000083ff01750f89c1b8287c7cb28b5d04909090ff138b0f8139f4e539b2741689c6b854eb7ab2eb05e9100000008b5d04909090ff1383790801752feb1e8b31813ef4e539b2740e89c7b854eb7ab28b5d049090ff13837e0801750f8b4c241089c289c85b83c42053ff228b4d008d49d83b4d087303ff5520894d00c741fc020000008b74241489710489198d790cc747fc03000000c7470801000000894f04c707050000008d4f10c741fc02000000c7410401000000893989c75152b801000000e8f273ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410878af8db2894104c70107000000575351b8030000008b542418909090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c241c8b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804893056528b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c7400430a68fb28908909090e8de72ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000051b8030000008b54242090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c24248b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5c2404891856528b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c740043ca68fb28908909090e8ca71ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000051b8030000008b54242890ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c242c8b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5c240c891856528b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c7400448a68fb28908909090e8b670ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000051b8030000008b54243090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c24348b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5c2414891856528b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c7400454a68fb28908909090e8a26fecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c74108a03a7cb2894104c7010700000051b8030000008b54243890ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c243c8b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5c241c891856528b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424448b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54241c89105189da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424488b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54241889105189da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b44244c8b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54241489105189da909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424508b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54241089105189da909090ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c740040100000089088d480cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000894804c7001d000000f6c10174079090e86a8aecff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c700a4c07ab28d480cc741fc0200000089410458890189c890e80a6cecff8b4d008d49d43b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c7410401000000890183f90175058b0424eb0d89cb8b0424909090e86616000083f80175068b442408eb0d89c38b4424089090e8a616000083f80175068b442410eb0d89c38b4424109090e8e616000083f80175068b442418eb0d89c38b4424189090e82617000083f80175068b442420eb0d89c38b4424209090e8661700008b4c244883c40450ff7104ff71088b44244c8b119090ff128b4d008d49d83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948048b4c246089088d500cc742fc03000000c7420803000000894204c7021d000000a801751d8b18833b05750f8b580489d83b650c7303ff5524ebe6b801000000eb05b80300000083f801740989d0e8ba88ecffeb0289d06a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c70118a88fb28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542450909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70138a88fb28941048b5424588951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b45008d40d03b45087303ff5520894500c740fc040000008b4c246489480c8b54245c8950088b5c2438895804c700050000008d7014c746fc020000008b7c2408897e0489068d460cc740fc030000008970088b7c240c8978048b7c240489388b5c24548b3bf7c7010000007409f6030174042b3b7105ff5538ebf783c701508b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008978048b7c24388938568b5304909090ff128b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc03000000c74008010000005a895004c700050000008b55008d52dc3b55087303ff5520895500c742fc02000000c742040100000089028d420cc740fc02000000895004c700f4c17ab28d500cc742fc02000000894204890a89d09090e8a268ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008b4424588b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54243889105189da90ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000518b4424608b542410ff128b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc02000000894804c70040c37ab28d480cc741fc0200000089410458890189c890e8ae67ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008b44245c8b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54243c89105189da90ff128b4d008d49c03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc03000000c74008010000008b542468895004c700050000008d5810c743fc02000000c743040100000089038d430cc740fc02000000895804c70098c47ab28d580cc743fc02000000894304890b89d890e8b666ecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c7010700000051b8030000008b54245c90ff128b4c24508b55008d52e03b55087303ff5520895500c742fc040000008b590c895a0c894208c7420401000000c702030000008d7214c746fc02000000c746040100000089168b5424648b3af7c7010000007409f6020174042b3a7105ff5538ebf783c701508b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008978048b3c24893856ff72045a90ff128b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc04000000c7400c01000000894808c7400401000000c7001b0000008b4c246c8b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424048910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010900000089cb8b442460e82a65ecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc0400000089480cc74008c4757ab259894804c700030000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b542410895104c701050000008b55008d52f43b55087303ff5520895500c742fc020000008b5c240c895a04c702050000008b5d008d5bf43b5d087303ff5520895d00c743fc020000008b742408897304c703050000008b75008d76c43b75087303ff5520897500c746fc02000000c7460401000000891e8d5e0cc743fc0200000089730489138d530cc742fc02000000895a04890a8d4a0cc741fc02000000894104c701050000008d410cc740fc02000000c7400401000000890883f80175058b0424eb0f89d689c38b042490e82a11000089f283f801740b89c389d0e87211000089c283fa0175068b442418eb0b89d38b442418e8b21100008b4c246c83c4148b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424308910538b510490ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b44245c8b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54243c89105189da909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c702f4c17ab28d420cc740fc0200000089500489089090e8a262ecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008b4c245c8b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54242c8910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424608b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54244089105189da909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c70240c37ab28d420cc740fc0200000089500489089090e83661ecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008b4c24608b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424288910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424648b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54244489105189da909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c70298c47ab28d420cc740fc0200000089500489089090e8ca5fecff8b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008b4c24648b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424248910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b4424688b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54244889105189da909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000005a89108b55008d52e83b55087303ff5520895500c742fc02000000894204c702a4c07ab28d420cc740fc0200000089500489089090e85e5eecff8b4d008d49c83b4d087303ff5520894d00c741fc04000000c7410c03000000c7410888af8db2894104c701070000008d4114c740fc02000000894804c700050000008d480cc741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc0200000089480459890850b8030000008b542458909090ff128b4d008d49e03b4d087303ff5520894d00c741fc04000000c7410cb4047db2894108c7410401000000c701030000008d5114c742fc02000000c7420401000000890a5052b8030000008b54246090ff128b4c24548b55008d52e03b55087303ff5520895500c742fc040000008b5908895a0c894208c7420401000000c702030000008d7214c746fc02000000c746040100000089168b5424688b3af7c7010000007409f6020174042b3a7105ff5538ebf783c701508b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008978048b3c24893856ff72045a90ff128b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc04000000c7400c01000000894808c7400401000000c7001b0000008b4c24708b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b5424048910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010900000089cb8b442464e80e5cecff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008b4424748b10f6c2017409f6000174042b107105ff5538ebf783c2018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b54241089105189da90ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004010000008908909090e85a5becff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008d4114c740fc0400000089480cc74008c4757ab259894804c700030000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c74004010000008908837c241001740b8b5c24109090e80609000083f80175058b0424eb0a89c38b0424e84a09000083f80175068b442408eb0d89c38b4424089090e88a0900008b4c247083c40c8b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b14248910538b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000894804c70017000000833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c70015000000508b4424148b5424549090ff128b4d008d49f03b4d087303ff5520894d00c741fc030000005a83c408895108894104c7010b00000051b8030000008b54245cff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a8b4c24608b19f6c3017409f6010174042b197105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804893056528b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000006a016a01ff74247c68dcaa8fb28d44240850ff74247cff742478ff742468ffb4249000000089cb8b842490000000e89a0800006a016a01ff742478ff7424748d442408508b5c24188b4424149090e83209feffb8030000008b54247090ff128b4c24648b55008d52ec3b55087303ff5520895500c742fc040000008b4904894a0c894208c7420401000000c702030000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089118b5424788b1af6c3017409f6020174042b1a7105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000895804893051568b5a0489da9090ff128b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc04000000c7400c01000000894808c7400401000000c7001b0000008b8c24800000008b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b14248910538b5104ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010900000089cb8b442474e83657ecff8b4d008d49d83b4d087303ff5520894d00c741fc04000000c7410c03000000895908894104c701070000008d4114c740fc0400000089480cc74008c4757ab25983c404894804c700030000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c7400401000000890883f80175058b0424eb0a89c38b0424e86609000083f80175068b442404eb0d89c38b4424049090e8a6090000837c241c0174098b5c241ce8ee09000083f80175068b442414eb0d89c38b4424149090e82e0a000083f80175068b442420eb0d89c38b4424209090e86e0a000083f80175068b442438eb0d89c38b4424389090e8ae0a00008b4c247c83c4188b11f6c2017409f6010174042b117105ff5538ebf783c20189c38b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008950048b14248910538b51049090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000833c2401750889c883c45cc220008b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c45cc22000909000000000d81f0000|@16706,1048575,@3947|34,0,@4675 84,0,0 94,0,@7313 107,0,@4675 157,0,0 169,0,@7368 185,0,@4675 194,0,@6377 225,0,@4675 234,0,@6377 312,0,0 321,0,2 338,0,0 349,0,0 354,1,@6881 385,0,1 392,0,@15807 401,0,3 409,0,1 456,0,0 462,0,1 493,0,0 556,0,0 603,0,4 620,0,@16676 630,1,@6881 661,0,1 668,0,@7121 677,0,3 683,0,1 728,0,0 734,0,1 765,0,0 828,0,0 879,0,4 896,0,@16677 906,1,@6881 937,0,1 944,0,@7121 953,0,3 959,0,1 1004,0,0 1010,0,1 1041,0,0 1104,0,0 1155,0,4 1172,0,@16678 1182,1,@6881 1213,0,1 1220,0,@7121 1229,0,3 1235,0,1 1280,0,0 1286,0,1 1317,0,0 1380,0,0 1431,0,4 1448,0,@16679 1458,1,@6881 1489,0,1 1496,0,@7121 1505,0,3 1511,0,1 1556,0,0 1562,0,1 1593,0,0 1656,0,0 1707,0,4 1769,0,0 1819,0,4 1881,0,0 1931,0,4 1993,0,0 2043,0,4 2105,0,0 2155,0,4 2172,0,0 2281,0,1 2290,0,14 2302,1,@6933 2333,0,0 2354,0,@6036 2378,1,@6881 2409,0,1 2416,0,@15808 2425,0,3 2444,0,2 2461,0,0 2486,1,@16680 2510,1,@16681 2534,1,@16682 2558,1,@16683 2582,1,@16684 2637,0,0 2675,0,1 2684,0,14 2715,0,0 2722,0,1 2734,1,@6933 2777,0,@16685 2792,0,0 2805,0,1 2844,0,@16686 2896,0,0 2902,0,1 2926,0,0 2988,0,2 3096,0,0 3147,0,4 3164,0,0 3174,0,2 3205,0,0 3226,0,@6054 3250,1,@6881 3281,0,1 3288,0,@15808 3297,0,3 3359,0,0 3407,0,4 3449,0,0 3470,0,@6072 3494,1,@6881 3525,0,1 3532,0,@15808 3541,0,3 3603,0,0 3651,0,4 3668,0,0 3681,0,2 3698,0,0 3719,0,@6090 3742,1,@6881 3773,0,1 3780,0,@15808 3789,0,3 3795,0,1 3846,0,0 3852,0,1 3869,0,0 3934,0,0 3983,0,4 4000,0,0 4010,0,0 4016,0,13 4077,0,0 4127,0,4 4138,1,@6881 4169,0,1 4181,0,3 4201,0,@5348 4211,0,1 4248,0,2 4285,0,2 4322,0,2 4353,0,0 4404,0,2 4421,0,0 4446,1,@16687 4462,1,@16688 4486,1,@16689 4550,0,0 4599,0,4 4661,0,0 4711,0,4 4728,0,0 4764,0,@6054 4786,1,@6881 4817,0,1 4824,0,@15808 4833,0,3 4852,0,2 4913,0,0 4963,0,4 5025,0,0 5075,0,4 5092,0,0 5128,0,@6072 5150,1,@6881 5181,0,1 5188,0,@15808 5197,0,3 5216,0,2 5277,0,0 5327,0,4 5389,0,0 5439,0,4 5456,0,0 5492,0,@6090 5514,1,@6881 5545,0,1 5552,0,@15808 5561,0,3 5580,0,2 5641,0,0 5691,0,4 5753,0,0 5803,0,4 5820,0,0 5856,0,@6036 5878,1,@6881 5909,0,1 5916,0,@15808 5925,0,3 5944,0,2 5961,0,0 6045,0,1 6085,0,@7817 6095,0,0 6101,0,1 6118,0,0 6127,0,1 6178,0,0 6184,0,1 6201,0,0 6266,0,0 6315,0,4 6332,0,0 6342,0,0 6348,0,13 6409,0,0 6459,0,4 6470,1,@6881 6501,0,1 6513,0,3 6575,0,0 6623,0,4 6640,0,0 6650,1,@6881 6681,0,1 6694,0,3 6714,0,@5348 6724,0,1 6757,0,2 6774,0,0 6794,1,@16690 6814,1,@16691 6838,1,@16692 6902,0,0 6951,0,4 6970,0,11 7017,0,10 7070,0,5 7076,0,1 7120,0,0 7126,0,1 7157,0,0 7220,0,0 7267,0,4 7280,0,@16693 7318,1,@16696 7350,1,@15806 7355,0,1 7406,0,0 7412,0,1 7443,0,0 7506,0,0 7555,0,4 7572,0,0 7582,0,0 7588,0,13 7652,0,0 7699,0,4 7710,1,@6881 7741,0,1 7753,0,3 7773,0,@5348 7786,0,1 7819,0,2 7836,0,0 7858,1,@16700 7882,1,@16701 7898,1,@16702 7922,1,@16703 7946,1,@16704 7970,1,@16705 8034,0,0 8083,0,4 8136,0,10 16676:O2|@6054,0 16677:O2|@6072,0 16678:O2|@6090,0 16679:O2|@6036,0 16680:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3924| 16681:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3925| 16682:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3926| 16683:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3927| 16684:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3928| 16685:D3,12|8b4204c30000000008000000|@15801,5,@3929| 16686:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3930|65,0,0 113,0,4 16687:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3931| 16688:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3932| 16689:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3933| 16690:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3934| 16691:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3935| 16692:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3936| 16693:O1|@16694 16694:D3,56|89c18b45008d40ec3b45087303ff5520894500c740fc040000008b54240489500c895808894804c70001000000c204000000000034000000|@16695,15,@3937|41,0,0 16695:S57|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e7472792834292d45 16696:D3,480|3b650c7303ff5524ff7004ff7008538b088b44241c89ca90ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410803000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740a89c890e8926decffeb0289c86a016a0183380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c70168ad8fb28941048061ffbf89e0c7000100000089e0894804eb7350b8030000008b542420909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70188ad8fb28941048b5424248951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000005e89730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e0894804ff74242c8b5c24188b44241c8b54242c909090ff128b4d008d49e43b4d087303ff5520894d00c741fc020000008b54240889510489018d410cc740fc030000008948088b4c240c8948048b4c240489088b4c24245a83c40c8911894104b801000000c21c00909000000000dc010000|@16699,1048575,@3940|53,0,0 102,0,1 111,0,14 142,0,0 149,0,1 162,1,@6933 205,0,@16697 220,0,0 233,0,1 272,0,@16698 324,0,0 330,0,1 354,0,0 463,0,0 16697:D3,12|8b4204c30000000008000000|@15801,5,@3938| 16698:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3939|65,0,0 113,0,4 16699:S55|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e747279283429 16700:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3941| 16701:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3942| 16702:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3943| 16703:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3944| 16704:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3945| 16705:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3946| 16706:S35|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029 16707:O4|3,@16708,@7121,1 16708:O2|@16709,@7123 16709:O2|@16710,1 16710:O3|2,@4762,0 16711:O4|3,@16712,@7121,1 16712:O2|@16713,@7123 16713:O2|@16714,1 16714:O3|2,@4763,0 16715:O2|@16716,@7123 16716:O2|@16717,1 16717:O3|2,@4764,0 16718:O4|@4608,@5398,@16720,@16719 16719:O5|@16313,1424,0,1424,0 16720:S23|417267756d656e74206c656e6774682070726f626c656d 16721:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3948| 16722:D3,96|3b650c7303ff5524a80175438b08833909740e8b5004b83cfd7bb28b5d0490ff13ff71048b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@3949|23,0,@6885 80,0,0 16723:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@3950|39,0,0 92,0,0 16724:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e93c44ecff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3951|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16725:O1|@16726 16726:D3,16|b801000000c39090000000000c000000|@16727,1,@3952|1,0,0 16727:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296261736546756e2d283129 16728:D3,1096|3b650c7303ff5524f64424200175708b4c24208b55008d52e83b55087303ff5520895500c742fc01000040c702010000008d7208c746fc03000000c706d0b88fb28956048b7804897e088066ffbf8b38f7c701000000740583c7027105ff5538ebf68b45008d40f03b45087303ff5520894500c740fc03000000895008eb05e9a3010000897004893852ff71045057ff3189d9bb00ba8fb289c8909090e87e56eaff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7010cba8fb28b5424388951045b8959085b89590c8061ffbf6a016a015051ff7424148d4c240c51ff74243cff74243cff74243cff74243cff74243cff74243c89c38b44243090e8fafeffff8b4424148b00b901000000a80175328b108b5d008d5bf43b5d087303ff5520895d00c743fc02000000894b048b0a890b89d98b500489d03b650c7303ff5524ebca89c8e88646ecff813c2448c052087427f604240175288b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b0c2489cb909090e8fa3afeff5053bb84bc8fb2b803000000909090e8ee81ebff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542410895118c74114010000008941108b44240489410cc74108010000005883c4088941045883c41089018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4c241c8901c7410401000000b801000000c224008b4c2418f6c101740583c1027105ff5538ebf68b5424148b18f6c3017409f6020174042b1a7105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048908568b5604ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70109000000ff3424ff74241868b0bc8fb2518d5c24048b44242090e8d680ebff508b4424148b54243c90ff12837c2420037558833c2401740b8b1c24909090e8560600008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241c89510c8b5c2404895908894104c701070000008b4424348908c7400401000000b80100000083c418c2240089c38b0424909090e85a06000083f801740d89d989c389c8e8a606000089c38b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000008b4c2404894808895804c700070000008b4d008d49dc3b4d087303ff5520894d00c741fc050000008941108b44242089410cc7410801000000c7410401000000c701010000008d5118c742fc02000000c7420401000000890a52bbb8be8fb2909090e8c67febff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000833c2401742989c88b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b0424894104c701150000008b44243883c4048908c7400403000000b80100000083c418c224000000000044040000|@16745,1048575,@3963|45,0,0 61,0,@16729 148,0,@16730 158,1,@4940 188,0,@16731 269,0,0 330,1,@6883 337,0,I48 353,0,I48 358,0,4 383,0,@6130 398,1,@15942 405,0,@16736 410,0,1 418,1,@6547 449,0,1 463,0,0 480,0,0 526,0,7 539,0,0 544,0,0 627,0,0 671,0,4 683,0,@16738 698,1,@6547 734,1,@16740 781,0,3 794,0,0 799,0,0 818,1,@16741 834,1,@16742 867,0,1 883,0,3 924,0,0 931,0,0 937,0,0 954,0,0 962,0,@16743 970,1,@6547 1001,0,0 1010,0,14 1057,0,10 1073,0,1 1078,0,0 16729:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e93c3eecff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@3953|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 16730:S3|283129 16731:D3,308|3b650c7303ff55248b08f6c101740bf6420c0174052b4a0c7105ff5538ebf683c10189c38b45008d40f03b45087303ff5520894500c740fc03000000c7400803000000894804c7000100000053528b5304909090ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701090000008b0424f6400801753d8b5008837a040175348b5d008d5be83b5d087303ff5520895d00c743fc020000008b32897304890b8d4b0cc741fc02000000c74104010000008919eb4bba010000008b5808f6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdf516854bb8fb289e389d090e8067debff8b4c240883c4088b590890e8ceecebff89c18b0424518b50048b44240890ff1283f80175055883c408c389c35883c408e9a1000000900000000030010000|@16735,1048575,@3956|63,0,1 72,0,0 115,0,4 181,0,0 190,0,0 232,0,@16732 242,1,@6547 258,1,@6721 295,1,@16734 16732:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008948088b5204895004c7000d000000c39090900000000038000000|@16733,7,@3954|29,0,0 44,0,6 16733:S43|434f444547454e5f50415253455452454528292e6c6f61644172677346726f6d5475706c65283229283129 16734:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3955| 16735:S75|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e732834296e6578745061726d73283129 16736:O1|@16737 16737:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3957|1,0,@5280 16738:D3,148|3b650c7303ff55248b4a088b5a048b31f7c6010000007409f6030174042b337105ff5538ebf783c60189c78b45008d40f03b45087303ff5520894500c740fc03000000c740080300000089700489388b51049090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701090000008d410cc740fc02000000c74004030000008908c3900000000090000000|@16739,1048575,@3958|70,0,1 115,0,4 132,0,1 16739:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429706f6c795061726d732d283129 16740:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3959| 16741:D3,72|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b8ec257eb2c39090900000000044000000|@6536,3,@3960|56,0,@8258 16742:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3961| 16743:O1|@16744 16744:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c7400404d07ab2c7000d000000c390900000000038000000|@8148,3,@3962|29,0,0 39,0,@6252 45,0,6 16745:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429 16746:O1|@16747 16747:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@3964|1,0,@5280 16748:S52|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329 16749:D3,96|3b650c7303ff55246a016a0189e3909090e85e0000008b0424b901000000a801751dff7004ff74240889cb8b00e84e01000089c1583b650c7303ff5524ebdf89c883f80174095883c404e9b1ffffffb80100000083c408c3000000005c000000|@16756,63,@3971|18,1,@16750 26,0,0 46,1,@16751 80,0,0 16750:D3,248|3b650c7303ff5524a801756e8b08f6411401752d8b51148b328b3e8b3f83ff0175188b7e048b3f83ff017407bf01000000eb13bf03000000eb0cbf01000000eb05bf010000006a016a015351578d5c240c8b400490e8a6ffffff833c240174428b45008d40f43b45087303ff5520894500c740fc02000000eb05e95e0000008b4c240c8948048b4c240489088b4c240889018b442410894104b80100000083c414c38b45008d40f43b45087303ff5520894500c740fc020000008b4c24108948048b4c240489088b4c24088b54240c8911894104b80100000083c414c3c70301000000c7430401000000b801000000c300000000f4000000|@6496,63,@3966|45,0,0 52,0,1 59,0,0 66,0,0 154,0,0 213,0,0 223,0,0 230,0,0 235,0,0 16751:D3,140|3b650c7303ff5524f6401401756e8b40148b088b51088b126a016a0153ff7108ff31ff7424188d5c241089d090e86e000000f644240c01740a83c4085883c408c204008b44240c9090e89e0100008b0c248b0983f901740a89cb909090e8ea0100008b0c2489018b4424048b4c24108908b80300000083c414c2040089d8c204009090900000000088000000|@16755,63,@3970|46,1,@16752 74,1,@16753 94,1,@16754 114,0,1 16752:D3,312|3b650c7303ff5524a801755d8b088b54240453ff7104f6c20175608b0a8b193b1c24743ef6c3017545f6042401753f8b3c24f7c7010000007407be03000000eb068b378d74360183c6085689de59d1e93bc9f3a68d7c3f018d7436018d4c0901750cb903000000eb17e9ac0000008b52043b650c7303ff5524eb9bb9010000006a016a01ff3051ff74241c8d5c240c8b4004909090e866ffffff833c2401743d8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c240489088b4c241489018b44240c894104b80100000083c418c204008b45008d40f43b45087303ff5520894500c740fc020000008b4c240c8948048b4c240489088b4c24148b5424088911894104b80100000083c418c20400c70301000000c7430401000000b801000000c20400900000000034010000|@6496,63,@3967|59,0,1 99,0,1 124,0,0 211,0,0 272,0,0 284,0,0 291,0,0 296,0,0 16753:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3968|60,0,0 16754:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3969| 16755:S68|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129757064617465283229 16756:S59|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129 16757:D3,280|3b650c7303ff5524f640140175638b48148b118b328b3683fe01755a8b72048b3683fe0175558b701083fe017507bee01687b2eb1b8b3e833f0175058b7704eb0f8b7e0489fe3b650c7303ff5524ebd953568b18b8a0c58fb2e8c246eaffbbbcc58fb29090e8b646eaffbb5cbe86b2eb0fe991000000e98c000000e98700000090e8c2f9f6ff909090e84aaaf7ff8b4d008d49e83b4d087303ff5520894d00c741fc05000000894110c7410c01000000c7410801000000c7410407000000c70101000000f6c101740cb8ecd57ab28b5d049090ff138b45008d40ec3b45087303ff5520894500c740fc040000005a89500c894808c7400401000000c70001000000598b5130ff22b801000000c39090900000000014010000|@16760,1048575,@3972|47,0,@12945 85,0,@16758 90,1,@4940 95,0,@16759 102,1,@4940 107,0,@12744 130,1,@12747 138,1,@13068 172,0,0 179,0,0 186,0,3 192,0,0 202,0,@6321 247,0,0 253,0,0 264,0,0 16758:S18|56616c7565206964656e7469666965722028 16759:S26|2920686173206e6f74206265656e207265666572656e6365642e 16760:S46|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c7565283229 16761:S38|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329 16762:O5|@17034,@16593,@13807,@16238,@17033 16763:D3,1664|8d7c24a03b7d0c7303ff55288b4c2404be0100000089dff7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd98b39528b5734f6c20175378b3a813ffce539b2751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b128917eb148b7a0489fa3b650c7303ff5524ebc4bf0100000083ff01756cba7c787cb2f6c20175378b3a813ffce539b2751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b128917eb148b7a0489fa3b650c7303ff5524ebc4bf0100000083ff01750c89c2b8287c7cb28b5d04ff138b17813afce539b2741250b854eb7ab28b5d04eb05e90a000000ff13837a08017468eb1e8b17813afce539b2740e50b854eb7ab28b5d04909090ff13837a0801746989dabf0100000050ff3153ff7114ff7108ff7104f6c201751f8b02ff720489fb8b480489c890e84605000089c75a3b650c7303ff5524ebdc89f856a8017523ff70048b5c2418eb05e91c0000008b00909090e89afcffff583b650c7303ff5524ebd9b801000000eb1350b801000000ff3153ff7114ff7108ff710456f644241001740bb82ccf8fb28b5d0490ff138b4424108b086a016a018b542434833a0575348b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70358cf8fb28953048063ffbf89e6c7060100000089e6895e04eb75ff7110b8030000008b542414ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70178cf8fb28941048b5424108951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74243889730c894308c7430401000000c703030000008d4314c740fc02000000eb05e918000000c740040100000089188d5c240489038d442404894804eb03ff71108b4424108b542408909090ff12508b4424108b54241890ff128b4c2410f6c101740783f9017d08eb1bf641ff107515f6c101740a81f9fdffff017c14eb06f641ff10750c89c2b834f67ab28b5d04ff13f6c101740583c1027105ff5538ebf689c2b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b44241089078b44242c8b4d008d49e03b4d087303ff5520894d00c741fc07000000c7010cd08fb28b58048959048b7424348971088b580889590c8951108b7424208971148979188061ffbf8b75008d76ec3b75087303ff5520897500c746fc040000008b44241c89460c8b4424188946088b4424148946048b44242489066a016a015752ff742448ff74241851568d4c2418518b5c24248b442444e86e0b0000837c240c017466837c24480174648b4424348b4834f6c10175358b11813a04e639b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01756eb97c787cb2f6c10175418b11813a04e639b2eb0ae9a7000000e99b000000751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebbabb0100000083fb01750db8287c7cb28b5d04909090ff138b0b813904e639b27412eb05e913000000b854eb7ab28b5d0490ff13837908017435eb1a8b0b813904e639b2740ab854eb7ab28b5d04ff13837908017419ff742438ff74241868b84990b2bb01000000e85ef8f9ffeb32b801000000eb2b837c2448017407b801000000eb1dff742438ff74241868e04990b2bb010000008b4424409090e82af8f9ff8b4424048b00b901000000503b0c247207b801000000eb6789c8a801740583c0027105ff5538ebf68b5424088b4442fe83f80175748b44243489cba801740c89c6b8bc7e7ab28b5d04ff1383fb0175078b008b4010eb1cf6c301740583eb027105ff5538ebf68b40043b650c7303ff5524ebc889cbf6c301740c83c302eb05e96f0000007105ff5538ebef515089debb0300000089f0bafc317ab2e82666eaff89c3b8044a90b2eb05e92c00000090e8823feaffbb144a90b29090e8763feaffff742444ff74240450bb010000008b44244c90e852f7f9ffeb03516a0183c4045883c00289c13b650c7303ff5524e919ffffff8b44244083c4046a03ff742408ff74243cff742444ff742454ff7008ff70048b5c241c8b44244c90e8ae7d000083f80175068b442418eb0d89c38b4424189090e82288000083f801750a83c4085883c434c20c0089c18b45008d40f03b45087303ff5520894500c740fc030000008b542408895008894804c7001500000083c440c20c00909090000000007c060000|@17032,2097151,@4060|17,0,0 77,0,@4676 129,0,0 139,0,@7313 152,0,@4676 204,0,0 216,0,@7368 229,0,@4676 237,0,@6377 265,0,@4676 273,0,@6377 294,0,0 330,1,@16764 374,1,@16757 390,0,0 398,0,0 423,0,@16766 478,0,@16768 493,0,0 508,0,1 544,0,@16769 599,0,0 605,0,1 629,0,0 707,0,16777214 724,0,@6401 751,0,0 829,0,@16770 950,1,@16778 984,0,@4677 1034,0,0 1044,0,@7313 1057,0,@4677 1119,0,0 1129,0,@7368 1145,0,@4677 1159,0,@6377 1181,0,@4677 1188,0,@6377 1212,0,@17013 1217,0,0 1222,1,@13829 1229,0,0 1243,0,0 1258,0,@17014 1263,0,0 1274,1,@13829 1285,0,0 1296,0,0 1344,0,@5417 1422,0,1 1429,0,@5052 1434,1,@5053 1441,0,@17015 1454,1,@4940 1459,0,@17016 1466,1,@4940 1480,0,0 1490,1,@13829 1562,1,@17017 1586,1,@17031 1643,0,10 16764:D3,496|3b650c7303ff55248b08ba0acd8fb28d548afcffe290e9f3000000909090e9eb000000909090e9e6000000909090e9db000000909090e9d3000000909090e9d9000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e999000000909090e9c8000000909090e9e7000000909090e9f3000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9ef000000909090e93b000000909090e933000000909090e9df000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909089d8c38b40048b4004e9e4feffff8b4008e9dcfeffff8b40048b40048b00837804017406f6400401750389d8c389c18b45008d40f43b45087303ff5520894500c740fc020000008958048908c38b400ca801751d8b08ff70048b410c909090e88efeffff89c3583b650c7303ff5524ebdf89d8c3ff70088b400490e872feffff89c358e96afeffff8b4008a801751aff70048b00909090e856feffff89c3583b650c7303ff5524ebe289d8c38b4004e93efeffff8b4004a801751aff70048b00909090e82afeffff89c3583b650c7303ff5524ebe289d8c3909000000000ec010000|@16765,15,@3974|11,0,$16764+22 16765:S41|434f444547454e5f50415253455452454528292e6765745661726961626c6573496e50617474283229 16766:O4|101,@6569,0,@16767 16767:O5|@16313,324,0,324,0 16768:D3,12|8b4204c30000000008000000|@15801,5,@3975| 16769:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@3976|65,0,0 113,0,4 16770:D3,868|3b650c7303ff5524a801740783f8017d08eb1ff640ff1075198b4a188b09a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8f0ea7ab28b5d04909090ff1389c1f6c101740583c1027105ff5538ebf68b5a188b4c4bfef6c101740583c1027105ff5538ebf6a801740783f8017d08eb1cf640ff1075168b1ba8017409f6c30174043bc3eb05ff5538ebf77c0e89c3b8b0f57ab28b5d049090ff1389c3f6c301740583c3027105ff5538ebf68b7218894c5efe6a016a016a018b5a1489c7f6c301740c50b8bc7e7ab28b5d0490ff1383ff0175248b3b89e650528b1789168b338d4424088b56048950048b1b8d4424088b5b14895808eb1ff7c701000000740583ef027105ff5538ebf68b5b043b650c7303ff5524eba7f6c101740783f9077f6ceb06f641ff107469bb010000008b44240c90e8aefbffff8b0c248b5108ff7204ff32ff7208ff72148b5a10909090e872e6fdff6a016a018b4c2408ff30ff70048d442408508b5c241cb8107a7db28b510cff128b4424108b4808ff7108ff31ff7104ff7424048b5c2418eb0ae903010000e9fe0000008b442410e8e66bffffff7004ff30ff742408ff742410ff7424188b5c24288b442440bad4408fb290e8226fffff83f80175058b0424eb0a89c38b0424e89e01000083f80175068b442418eb0d89c38b4424189090e8de0100008b4c242483c4048b51088b5d008d5bdc3b5d087303ff5520895d00c743fc080000008b721c89731c8b7a18897b188b4a14894b145983c41c894b108b4a0c894b0c8b4a08894b088b4a04894b048b0a890b6a016a018b4c2408508d442404508b4424188b5104ff12833c2401750883c4045883c418c38b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c7001500000083c420c3bb010000008b44240c90e842faffff909090e87a0100008b0c248b4910f6c1017410f64424040174098d49ff034c24047105ff5538ebf2f6c101740783f9017c08eb13f641ff10740d89c2b8a4727db28b5d0490ff138b55008d52e83b55087303ff5520895500c742fc02000000894a04c702050000008d4a0cc741fc02000000895104c7010900000089cb9090e86228ecff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c7000700000083c414c3900000000060030000|@16777,2097151,@3980|53,0,@6373 146,0,@6397 199,0,@5417 300,0,0 310,1,@16764 338,1,@15825 365,0,@8006 414,1,@16563 444,0,@16565 450,1,@16567 470,1,@16771 494,1,@16772 655,0,10 664,0,0 674,1,@16764 682,1,@16773 739,0,@7993 778,0,2 797,0,4 806,1,@6881 839,0,1 851,0,3 16771:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3977| 16772:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@3978| 16773:D3,196|3b650c7303ff5524a80175738b088b5108833a05740f8b5804b80cd58fb28b5d049090ff138b5a048b1bf6c301740783fb017c08eb13f643ff10740d8b7004b8a4727db28b5d04ff138b75008d76e83b75087303ff5520897500c746fc02000000895e04c706050000008d5e0cc743fc02000000897304c70309000000eb05e92f000000538b700489f0909090e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000c0000000|@6329,31,@3979|26,0,@16774 64,0,@7993 102,0,2 121,0,4 180,0,0 16774:O4|@4608,@5398,@16776,@16775 16775:O5|@16313,376,0,376,0 16776:S7|6d616b65417267 16777:S56|434f444547454e5f50415253455452454528292e636f64654d61746368283529636f64655061747465726e45787072657373696f6e283129 16778:D3,876|3b650c7303ff55248b4c2408ba0100000089c6f7c601000000751cf6c201740583c2027105ff5538ebf68b76043b650c7303ff5524ebdcbe08d98fb2bf030000005352ff31a80175748b0889faf6c201740583c2027105ff5538ebf66a016a016a01ff70045257ff7110ff7424308d5c24145389f38b410490e8120300008b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c2408890889c18b4424045f83c41089ce3b650c730aeb05e908000000ff5524e97bffffff89f089c789f890e88a3a000083f8017407b803000000eb618b04248b4034a80175358b088139f4e539b2751c8b55008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc7ba0100000083fa01756db87c787cb2a801753c8b088139f4e539b275238b5500eb05e97e0000008d52f83b55087303ff5520895500c742fc01000000890aeb148b480489c83b650c7303ff5524ebc0ba0100000083fa01750bb8287c7cb28b5d0490ff138b0290908138f4e539b27414b854eb7ab2eb05e90f0000008b5d04909090ff138b480889c8eb1a8b028138f4e539b2740bb854eb7ab28b5d0490ff138b480889c889c683c4045bb803000000e8ce3a00006a016a016a016a015668cc1290b26a018d4c240c5189c389f89090e80e3c00008b45008d40ec3b45087303ff5520894500c740fc040000008b4c241089480c8b4c240c8948088b4c24088948048b4c24048908833c240174426a016a016a016a0189e3e8e64600008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c89088b480883c41483f9017507b901000000eb5ef6c101740d89c2b81c777bb28b5d0490ff138339017507b903000000eb5af6c101740f89c2b81c777bb28b5d04909090ff138b11f6c201740783fa017e0feb06f642ff107507b901000000eb2bf6c101741489c3b858777bb28b5d04eb05e91500000090ff138b510489d13b650c7303ff5524e97cffffff83f1028b55008d52e43b55087303ff5520895500c742fc06000000c7022c2f90b28b1c24895a048b7424148972088b7c2418897a0c894a108b5c2410895a148062ffbf5152ff7424148b5c240c90e8765900008b4c240c89015883c404894104b801000000c21400900000000068030000|@17012,2097151,@4049|13,0,0 56,0,@16779 61,0,1 122,1,@16780 210,1,@16930 220,0,1 240,0,@4675 290,0,0 300,0,@7313 312,0,@4675 369,0,0 379,0,@7368 395,0,@4675 402,0,@6377 432,0,@4675 439,0,@6377 461,0,1 466,1,@16932 480,0,@16934 498,1,@16937 570,1,@16941 637,0,0 651,0,@6704 667,0,1 681,0,@6704 714,0,0 728,0,@6707 792,0,@16966 842,1,@16974 860,0,0 16779:O3|0,@8817,0 16780:D3,2288|3b650c7303ff55248b08ba2ed98fb28d548afcffe290e9f3000000909090e9eb000000909090e9ff000000909090e9db000000909090e9d3000000909090e9fd010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e9de010000909090e9e2020000909090e98d040000909090e902050000909090e9ee050000909090e95b000000909090e953000000909090e94b000000909090e9f2060000909090e93b000000909090e933000000909090e903070000909090e923000000909090e9c6070000909090e913000000909090e90b000000909090e9c40700009090908b4424048b0b89088b53048950048b7308897008b801000000c210008b48048b11833a1d756c8b72048b7e048b3f8b4e088b098b50048b7424085357ff7210ff7204ff760c89cb89f89090e8a6070000909090e8c60d0000ff742418ff742408ff742428ff74240c68a4e88fb28b4c241c83790401753bff742420ff7424388d5c240889c89090e89a0e00008b4c2428eb05e97f0000008b1089118b58048959048b7008897108b80100000083c424c21000f6410401753b8b510489e353ff742424ff74243c508b5a0489c8909090e89e1500008b4c24288b1089118b58048959048b7008897108b80100000083c424c210008b4424208b4c24288b1089118b58048959048b7008897108b80100000083c424c210008b7424048b3b893e8b43048946048b4b08894e08b801000000c210008b4c24108b5424088b742404894c24108b780c897c240c89542408897424048b780889f8e997fdffff8b48048b51048b128b71088b368b7c24085352ff770c89f389d09090e87a060000909090e846190000ff742410ff742418ff7424206850f58fb28b4c2410837904017534ff742414ff74242c8d5c240889c89090e8720d00008b4c241c8b1089118b58048959048b7008897108b80100000083c418c21000f6410401753a8b510489e353ff742418ff742430508b5a0489c89090e87e1400008b4c241c8b1089118b58048959048b7008897108b80100000083c418c210006a016a016a0189e0508b5c24248b442438909090e87e1900008b45008d40f43b45087303ff5520894500c740fc02000000598948048b4c241889088b4c242489015889410458894108b80100000083c418c210008b48088b098b54240889ce833e0775218b7608833e0175058b7608eb0f8b76048b363b650c7303ff5524ebe783f602eb19833e0d750f8b76048b363b650c7303ff5524ebc6be0100000083fe01742053ff701051ff700c50ff74240c68d0f98fb2bb030000008b02e88ee6f9ffeb0f8b70108b780cb801000000535651578b44240483380b75268b400c8b40088b4804833905740bb88c6c8fb28b5d0490ff138b41083b650c7303ff5524ebd583380d750f8b40048b003b650c7303ff5524ebc1833807740e89c1b8f8f98fb28b5d049090ff13b9010000008b4004a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089cabb24fa8fb289d0909090e86e5aebff59f6c10175348b11ff7104ff720c508b5c240c8b029090e8ca1c0000ff7424048b5c2404909090e83a1e000083c408593b650c7303ff5524ebc78b4d008d49f83b4d087303ff5520894d00c741fc010000405a89118b55008d52ec3b55087303ff5520895500c742fc040000008b1c24895a0c894a08894204c702330000008b4424188b4c24108b74240c89442418895c2414894c24108974240c83c4045b89d0e9d8faffff6a016a016a01ff7004ff742420ff700cff7424208d4c2410518b400890e8b6faffff5883380b750d8b40083b650c7303ff5524ebee83381d750a8b40048b40048b00eb05b890cf87b28b4d008d49f43b4d087303ff5520894d00c741fc020000005a89510489018b44240c89085989480459894808b801000000c210008b48048b098b55008d52c43b55087303ff5520895500c742fc01000040c702ec7d7ab28d7208c746fc03000000c74608f1700200895604c7060d0000008d5610c742fc02000000c742040100000089328d7a0cc747fc05000000c74710946d7ab2c7470c28af7ab2c7470844af7ab2895704c7070b00000053ff700cff70085689cb89f8ba84287bb2909090e85699ebff8b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000598908b918e98fb251ff742420ff74240cff742420508b5c24148b44241c9090e87e1d00008b4c241083c40c8b1089118b58048959048b7008897108b801000000c210008b48048b098b5424085350ff3251ff7008ff7010ff700cff7204bb0300000089c8baa80b7cb29090e8fa2becff8b4d008d49e83b4d087303ff5520894d00c741fc05000000c741100100000089410c8b00894108c7410401000000c7010b0000008b45008d40d83b45087303ff5520894500c740fc01000040c700010000008d5008c742fc04000000c7420cd8707ab2c74208f40490b2c7420428e07bb289028d4214c740fc02000000c74004010000008910508b5c240489c8ba70088eb290e80e28feffff742404ff74241cff74241c689c0590b250ff7424248d4c2408518b5c24288b442424e872250000ff742430ff742448ff74243089c38b44240c90e8a22800008b4c243883c4348b1089118b58048959048b7008897108b801000000c210008b4c24108b5424088b742404894c24108b7808897c240c89542408897424048b780489f8e91af8ffff8b4b04833907755bff7308ff33ba18e98fb252ff74241cff74241cff74241c8b59048b40049090e85a2d00008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701070000008b44240c5a891089480459894808b801000000c2100083390974138b50048b700cb8740f90b28b5d04909090ff13ff7308ff33ba18e98fb252ff74241cff700cff74241c8b4004909090e82e2e00008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701070000008b44240c5a891089480459894808b801000000c210008b4424108b4c2404894c24105a83c40c52e9e91300008b4424108b4c2404894c24105a83c40c52e9d313000090909000000000ec080000|@16929,2097151,@4017|11,0,$16780+22 291,0,0 346,1,@16781 354,1,@16789 375,0,@16790 406,1,@16793 438,0,0 478,1,@16805 503,0,0 538,0,0 569,0,0 646,1,@16781 654,1,@16812 671,0,@16813 702,1,@16793 727,0,0 766,1,@16805 791,0,0 822,1,@16815 875,0,0 955,0,0 978,0,@16821 983,0,1 990,1,@13829 1003,0,0 1035,0,@16617 1086,0,@16822 1098,0,0 1140,0,@16824 1150,1,@6547 1178,1,@16827 1194,1,@16833 1277,0,25 1389,0,@13162 1438,0,0 1476,0,@5413 1493,0,79992 1502,0,6 1519,0,0 1538,0,@5229 1545,0,@5786 1552,0,@5788 1561,0,5 1578,0,@6509 1586,1,@6714 1617,0,0 1625,0,@16791 1654,1,@16838 1682,0,0 1716,0,1 1723,0,@6907 1730,1,@6908 1761,0,0 1776,0,0 1782,0,5 1812,0,0 1829,0,@5279 1836,0,@16896 1843,0,@6817 1862,0,0 1876,0,@16002 1882,1,@16003 1899,0,@16902 1922,1,@16904 1946,1,@16915 1974,0,0 2036,0,@16791 2062,1,@16924 2095,0,3 2114,0,0 2133,0,@16925 2151,0,@16791 2174,1,@16928 2207,0,3 2226,0,0 2251,1,@16815 2273,1,@16815 16781:D3,540|3b650c7303ff55246a016a018b480883390775678379041175668b480c8b108b057ce839b2535189d3e802020000909090e8e60200008b0c24833905752a8b5104833a077516f642040175108b5a048b33508b4604e87627ebffeb115089d09090e86a27ebffeb0589c289c85283380d741b89c1b804d789b2eb0ae925010000e9200100008b5d04909090ff13f604240175418b0c248379040175388b118b5d008d5be83b5d087303ff5520895d00c743fc05000000c743100100000089530c8b32897308c7430401000000c7030b000000eb508b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701ec7d7ab28d5908c743fc03000000c74308f1700200894b04c7030d0000008d5310c742fc020000008b3424897204c7020900000089118b4d008d49f03b4d087303ff5520894d00c741fc03000000c70198e58fb28959048b400483c4048941088061ffbf6a016a01538d4424045089cb8b442410909090e8165cebff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000059890890e8320200008d4c24105a83c40889118d4c2404894104eb5a8b55008d52f43b55087303ff5520895500c742fc02000000c70268e68fb28b74240c8972048062ffbf536a016a0189e75789d38b480c89c8e89e5bebff8b442404909090e8560300008d4c240c5a83c40489118d4c24048941045b58ba84287bb2909090e87a94ebff58c2040090900000000018020000|@16788,2097151,@3987|33,0,@4726 42,1,@16782 50,1,@16783 86,1,@6447 98,1,@6447 117,0,@13864 185,0,0 200,0,0 206,0,5 238,0,@5413 255,0,79992 264,0,6 286,0,4 318,0,@16784 358,1,@6564 389,0,0 398,1,@16785 447,0,@16786 478,1,@6564 490,1,@16787 514,0,@6509 522,1,@6714 16782:D3,216|3b650c7303ff5524a80175678b083b19744ef6c3017541f60101753c8b31f7c6010000007407ba03000000eb068b168d54120183c20889de8b39ff7108ff710489d1d1e93bc9f3a68d7c3f018d7436018d4c09017410eb66ff7108ff7104eb5eff7108ff71048b4d008d49f43b4d08730aeb05e951000000ff5520894d00c741fc020000008b5424048951048b14248911518b4004e866ffffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c38b400483c408e937ffffffb801000000c39000000000d4000000|@13859,63,@3981|39,0,1 202,0,0 16783:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3982|60,0,0 16784:D3,52|8b003b4208751e8b45008d40f83b45087303ff5520894500c740fc010000008b52048910c3b801000000c3900000000030000000|@13868,5,@3983|38,0,0 16785:D3,116|3b650c7303ff5524a80175578b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000c74104010000008b108911518b500489d090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000070000000|@6329,7,@3984|39,0,0 46,0,0 100,0,0 16786:D3,228|8b5204f6c201756b8b0a8b590c833b0375668b7304f7c60100000075368b0e8b198b3b3b38751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901750d8b52043b650c7303ff5524eb998b098b118b5d00eb0ae95c000000e9450000008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b3a897b04c7030d000000508b45008d40f83b45087303ff5520894500c740fc01000000891883c404c38b720489f23b650c7303ff5524e92fffffff89c1b801000000c300000000e0000000|@16605,63,@3985|84,0,0 159,0,6 215,0,0 16787:D3,168|3b650c7303ff5524a80175708b088b51048b5a0483e30983fb017407bb01000000eb05bb0300000083f3028b720483e60383fe017407be01000000eb05be0300000083f6028b7d008d7ff03b7d087303ff5520897d00c747fc03000000897708895f048b19891f578b700489f0e88effffff89c18b45008d40f4eb05e9190000003b45087303ff5520894500c740fc02000000894804598908c3b801000000c300000000a4000000|@6329,63,@3986|29,0,0 36,0,1 55,0,0 62,0,1 155,0,0 16788:S30|56414c55455f4f505328292e676574506f6c796d6f72706869736d283329 16789:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3988|60,0,0 16790:D3,96|3b650c7303ff55246a016a016a01ff7208ff720cff72108d4c240c5189c38b4204ba18e98fb29090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@16792,1048575,@3989|34,0,@16791 16791:O1|@16780 16792:S36|4d415443485f434f4d50494c455228292e6275696c64416f74283529646f417267283129 16793:D3,400|3b650c7303ff55248b4c24088b5104833a037570ff7108ff315053ff72048b700889f09090e87a010000ff742418ff742408ff742424ff74241489c38b44241090e87a0200008b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc030000008b54241083c40c8950088948045983c404eb05e9050000008908c20800833a09740e89c6b8dcef8fb28b5d049090ff138b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b7c2404893e508b45008d40f03b45087303ff5520894500c740fc030000008b5108895008c7400434c47fb2c70001000000ff31565289daff128b4c240c508b4108909090e89a0000008b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241089510c5a8951088941048b44240489018b45008d40d83b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c701030000008d410cc740fc030000005a83c4048950088948045983c4048908c2080090000000008c010000|@16804,1048575,@3993|38,1,@16794 66,1,@16796 99,0,1 150,0,@16800 188,0,0 232,0,@8817 238,0,0 262,1,@16794 337,0,0 358,0,1 16794:D3,224|3b650c7303ff552483380975628b4808ff70048b4104909090e8e2ffffffa80175658b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b00894104c701050000006a018b5c240489c890e8b6ffebff833805752d8b48048b45008d40f83b4508730aeb05e92a000000ff5520894500c740fc01000000890883c404c3e909000000b80100000083c404c3b80100000083c404c3833803752c8b4804833905751e8b45008d40f83b45087303ff5520894500c740fc010000008b49048908c3b801000000c3b801000000c390909000000000dc000000|@16795,1048575,@3990|61,0,0 72,0,2 86,1,@6843 141,0,0 150,0,0 202,0,0 208,0,0 16795:S30|4d415443485f434f4d50494c455228292e74657374416363657373283129 16796:D3,444|3b650c7303ff5524a80175638b08f6c3017561f641040175608b51048b333b32755c8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c74704010000008b5424108917ff7004ff710cff7104ff71088b1989f89090e872010000508b4424048b54242090ff128b4d00eb14e999000000e957000000e952000000e94d0000008d49ec3b4d087303ff5520894d00c741fc040000008b54240c89510c8941088b4424088941045883c40c89018b45008d40f43b45087303ff5520894500c740fc020000005a8950048908c2100051ff742414ff742414ff742414ff7424148b400490e816ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c210008b45008d40e43b45087303ff5520894500c740fc02000000c74004010000008b4c241089088b54240889c68d400cc740fc030000008b7a08897808c7400434c47fb2c7000100000053568b54241490ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240c89510c8941088b4424048941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c2100090909000000000b8010000|@16799,1048575,@3992|61,0,0 90,1,@16797 296,0,0 331,0,@8817 337,0,0 424,0,0 16797:D3,408|3b650c7303ff552483f801750389d8c383fb017501c3a801740f89c1b81c777bb28b5d04909090ff13f6c301740f89c1b81c777bb28b5d04909090ff138b08f6c1017508f603017503ff55383b0b7563a801740d89c1b81c777bb28b5d0490ff13a801740c89c2b858777bb28b5d04ff13f6c301740f8b5004b858777bb28b5d049090ff13518b5b048b400490e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3a801740e89c1b81c777bb28b5d049090ff13f6c301740f89c2b81c777bb28b5d04909090ff13f6c101740bf6030174063b0b7d54eb05ff5538ebf5a801740f89c1b81c777bb28b5d04909090ff13a801740c89c2b858777bb28b5d04ff13518b4004e8e6feffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3f6c301740d89c1b81c777bb28b5d0490ff13f6c301740f89c1b858777bb28b5d04909090ff13ff338b5b04909090e892feffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000094010000|@16798,15,@3991|29,0,@6704 49,0,@6704 87,0,@6704 104,0,@6707 122,0,@6707 186,0,@6704 205,0,@6704 245,0,@6704 264,0,@6707 323,0,@6704 341,0,@6707 16798:S24|4d415443485f434f4d50494c455228292e706c7573283229 16799:S42|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429616464436c697374283129 16800:O4|@4608,@5398,@16802,@16801 16801:O5|@16803,403,0,403,0 16802:S37|6164644578636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 16803:S48|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4d415443485f434f4d50494c45522e736d6c 16804:S31|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429 16805:D3,376|3b650c7303ff55248b4c240c8b5104833a017564ff7108ff31ff7208ff742414ff742420ff7424185189c38b4204909090e8560100008b4d008d49e03b4d087303ff5520894d00c741fc030000005a895108894104c701010000008d4110c740fc030000008b5424048950088948045983c4048908c21000833a09740c89c6b870f48fb28b5d04ff138b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b7c2408893e508b45008d40f03b45087303ff5520894500c740fc030000008b5108895008c7400434c47fb2c70001000000ff315356528b54242490ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241089510c8941088b4424188941048b54240489118b55008d52d43b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc030000008b5c2408895908895104c701010000008d4110c740fc030000005a83c4088950088948045983c4048908c210009090900000000074010000|@16811,1048575,@3995|50,1,@16806 87,0,0 128,0,@16808 164,0,0 208,0,@8817 214,0,0 304,0,0 332,0,0 16806:D3,520|3b650c7303ff5524a80175558b088b510c8b323b337456f7c6010000007547f6030175428b33f7c6010000007407bf03000000eb068b3e8d7c3f0183c7088b3289fa8b3bff7108ff3189d1d1e93bc9f3a68d7c3f018d7436018d4c09017413eb6fe9f2000000ff7108ff31eb68ff7108ff318b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54241889118b700489df8b1c2489c8e812fbffff5657508b4424108b542420909090ff128b4d008d49ec3b4d087303ff5520894d00c741fc04000000eb0ae940000000e93b0000008b54240489510c8941088b44241c8941045a83c40489118b45008d40f43b45087303ff5520894500c740fc020000005a895004890883c408c21000ff30ff74241cff74241cff74241cff74241c8b4004909090e8cefeffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480459890883c408c210008b45008d40e43b45087303ff5520894500c740fc02000000c74004010000008b4c241089088b54240489c68d400cc740fc030000008b7a08897808c7400434c47fb2c7000100000053568b5424149090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240489510c8941088b4424108941045a83c40489118b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c210009090900000000004020000|@16807,1048575,@3994|47,0,1 141,0,0 162,1,@16797 371,0,0 406,0,@8817 412,0,0 500,0,0 16807:S40|4d415443485f434f4d50494c455228292e616464436f6e737472283629616464436c697374283129 16808:O4|@4608,@5398,@16810,@16809 16809:O5|@16803,318,0,318,0 16810:S35|616464436f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 16811:S29|4d415443485f434f4d50494c455228292e616464436f6e737472283629 16812:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@3996|60,0,0 16813:D3,96|3b650c7303ff55246a016a016a01ff7204ff7208ff720c8d4c240c5189c3b8c4f58fb2ba18e98fb2ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@16792,1048575,@3997|31,0,@16814 36,0,@16791 16814:O2|30,@12945 16815:D3,288|3b650c7303ff55248b4b048339037539ff33ff73085050bb04f78fb28b41049090e8160100008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70103000000eb6a833901753fff33ff730850ff710850bb04f78fb28b410490e8c60100008b4d008d49f03b4d087303ff5520894d00c741fc030000005a895108894104c70101000000eb49833907753eff33ff73085050bb04f78fb28b4104e8760200008b4d008d49f43b4d08730aeb05e91e000000ff5520894d00c741fc02000000894104c70107000000eb06ff33ff7308508b45008d40f43b45087303ff5520894500c740fc02000000c74004010000005a891089ce89c358e80af7ffff8b4c24085a8911897104894108b801000000c2040090000000001c010000|@16820,1048575,@4001|24,0,@16816 34,1,@16817 67,0,1 89,0,@16816 98,1,@16818 135,0,0 154,0,@16816 162,1,@16819 202,0,3 241,0,0 254,1,@16797 272,0,0 16816:O1|@16815 16817:D3,220|3b650c7303ff5524a80175708b086a016a016a0153ff7004ff710cff7104ff318d542414528b59088b4424288b542414ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c241c8948088b4c24188948048b4c241489088b4d008d49ec3b4d087303ff5520894d00c741fc040000008b542408eb05e94b00000089510c8941088b4424048941045883c408890151ff74241c8b5c240c8b442408e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c20400b801000000c2040000000000d8000000|@6329,1048575,@3998|205,0,0 16818:D3,220|3b650c7303ff5524a80175708b086a016a016a0153ff7004ff710cff7104ff318d542414528b59088b4424288b542414ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c241c8948088b4c24188948048b4c241489088b4d008d49ec3b4d087303ff5520894d00c741fc040000008b542408eb05e94b00000089510c8941088b4424048941045883c408890151ff74241c8b5c240c8b442408e85affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c20400b801000000c2040000000000d8000000|@6329,1048575,@3999|205,0,0 16819:D3,168|3b650c7303ff5524a801756d6a016a016a0153ff70048d4c2408518b188b44241c8b542408909090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c2408890850ff74241c8b5c240c8b4424089090e896ffffff89c18b45008d40f43b4508730aeb05e919000000ff5520894500c740fc020000008948045983c4148908c20400b801000000c204009000000000a4000000|@6329,1048575,@4000|152,0,0 16820:S30|4d415443485f434f4d50494c455228292e61646444656661756c74283229 16821:S31|43616e27742066696e642061206669786564207265636f726420747970652e 16822:O4|@4608,@5398,@16622,@16823 16823:O5|@6454,2973,0,2973,0 16824:O1|@16825 16825:D3,16|b8c4f58fb2c39090000000000c000000|@16826,1,@4002|1,0,@16814 16826:S37|4d415443485f434f4d50494c455228292e6275696c64416f7428352977696c64732d283129 16827:D3,240|3b650c7303ff5524833b0b75248b5b0c8b5b088b4b04833905740e89c2b88c6c8fb28b5d049090ff138b5908e9cfffffff833b0d750a8b5b048b1be9c0ffffff833b07740c89c1b884fb8fb28b5d04ff13b9010000008b5b0483fb01750f89c2b8b0fb8fb28b5d04909090ff138b133b027444f60201753aa8017536a8017407be03000000eb068b308d74360183c60889f78b325789c7518b4c2404d1e93bc9f3a68d7c3f018d7436018d4c0901740aeb0f6a0151eb0a6a015189c15883c404c38b0c24f6c101740583c1027105ff5538ebf68b530489d383c4083b650c7303ff5524e971ffffff00000000ec000000|@16832,63,@4003|30,0,@16617 72,0,@16828 82,0,0 97,0,@16830 129,0,1 16828:O4|@4608,@5398,@16622,@16829 16829:O5|@6454,2959,0,2959,0 16830:O4|101,@6569,0,@16831 16831:O5|@6454,2947,0,2947,0 16832:S26|545950455f5452454528292e656e7472794e756d626572283229 16833:D3,144|3b650c7303ff552483fb01750c89c1b8a4fc8fb28b5d04ff1383f80175278b45008d40f43b45087303ff5520894500c740fc020000008b5b048958048b4c24048908c20400a801740583e8027105ff5538ebf6ff33ff7424088b5b0490e89effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c20400909090000000008c000000|@16837,11,@4004|16,0,@16834 16834:O4|@4608,@5398,@16836,@16835 16835:O5|@16803,474,0,474,0 16836:S6|6d657267656e 16837:S39|4d415443485f434f4d50494c455228292e6275696c64416f742835296d657267656e2833292829 16838:D3,140|3b650c7303ff5524f6c301753fff33ff742408ff742410ff742418ff742420ff742428ff730468b0fd8fb289e15150ff742438ff742430bb05000000b8d00090b2e842f3ffff83c420c21400ff742408ff742410ff742418ff74242068380390b289e15150ff74242cff742424bb05000000b8e40390b29090e80af3ffff83c414c214000000000088000000|@16895,1048575,@4007|39,0,@16839 56,0,2 61,0,@16845 66,1,@16805 93,0,@16881 110,0,2 115,0,@16883 122,1,@16805 16839:D3,620|3b650c7303ff55248b480483390975728b5d008d5be03b5d087303ff5520895d00c743fc030000008b7008897308c7430434c47fb2c703010000008d7b10c747fc03000000897708c7470434c47fb2c707010000006a016a016a01ff30525756ff720cff7210ff72148d44241c508b421c8b4a0889ca9090ff128b45008d40f0eb05e9b80000003b45087303ff5520894500c740fc030000008b4c24188948088b4c24148948048b4c241089088b4c240850ff7108ff710cff7110ff7114ff71188b59048b44241cba300090b2909090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045989088b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc030000005a83c4088950088948045983c40c8908c3833907740d89c3b8380090b28b5d0490ff13f641040175128b5904f643040175098b7304837e0401740c89c3b8380090b28b5d04ff136a016a016a0152ff7008ff30ff36ff720cff7210ff72148d7c241c578b3389f38b421c8b4a0889ca909090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24188948088b4c24148948048b4c241089088b4c240c50ff7108ff710cff7110ff7114ff71188b59048b442418ba300090b29090ff128b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c40489088b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701070000008d410cc740fc030000008b5424048950088948045983c4148908c390900000000068020000|@16844,1048575,@4005|49,0,@8817 55,0,0 75,0,@8817 81,0,0 201,0,@16840 237,0,0 288,0,3 327,0,@16841 364,0,@16841 490,0,@16840 525,0,0 579,0,3 16840:O1|@16838 16841:O4|@4608,@5398,@16843,@16842 16842:O5|@16803,541,0,541,0 16843:S34|6d6b436f6e735061743a206261646c792d666f726d65642070617273652d74726565 16844:S54|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c6973742832296d6b436f6e73506174283129 16845:O7|@5598,@8967,@16847,@16846,@5229,0,0 16846:O3|2,@16874,@16873 16847:O2|1,@16848 16848:O3|2,@5905,@16849 16849:O2|@16850,0 16850:O4|@4607,69,@16851,0 16851:O3|2,3,@16852 16852:O5|@5411,@16853,@5902,@5809,@5387 16853:O2|@5433,@16854 16854:O2|@16856,@16855 16855:O2|@16860,@16859 16856:O2|@5747,@16857 16857:O3|0,@16858,@5415 16858:O8|@5351,@5598,0,0,@7118,0,0,1 16859:O2|@16865,0 16860:O2|@5756,@16861 16861:O3|0,@16862,@5415 16862:O8|@16863,@5598,0,0,@6242,0,2,1 16863:O3|10,@6245,@16864 16864:O3|14,@6250,1 16865:O2|@5762,@16866 16866:O3|0,@16867,@5415 16867:O8|@16868,@5598,0,0,@6261,0,2,1 16868:O3|10,@16869,@6263 16869:O2|@16871,@16870 16870:O2|@16872,0 16871:O4|1,@5461,0,@12275 16872:O4|1,@5461,1,@5711 16873:O5|5,@16880,@5788,@5786,@5229 16874:O3|3,@16875,@5234 16875:O2|@16877,@16876 16876:O2|@16879,0 16877:O2|49,@16878 16878:O3|6,@4765,79992 16879:O2|50,@16873 16880:O2|@16878,0 16881:D3,96|3b650c7303ff55246a016a016a01ff7208ff720cff72108d4c240c5189c3b8c4f58fb28b52049090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@16882,1048575,@4006|31,0,@16814 16882:S45|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229283129 16883:O7|@5589,@5270,@16884,@16873,@5229,0,0 16884:O2|1,@16885 16885:O3|2,@5903,@16886 16886:O2|@16887,0 16887:O4|@4607,69,@16888,0 16888:O3|2,2,@16889 16889:O5|@5411,@16890,@5902,@5809,@5387 16890:O2|@5433,@16891 16891:O2|@16892,@16528 16892:O2|@6234,@16893 16893:O3|0,@16894,@5415 16894:O8|@16532,@5589,0,0,@7118,0,0,1 16895:S42|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229 16896:O1|@16897 16897:D3,24|b8280590b28b5d04909090ff139090900000000014000000|@16901,1,@4008|1,0,@16898 16898:O4|@4608,@5398,@16900,@16899 16899:O5|@16803,561,0,561,0 16900:S15|657175616c697479466f7254797065 16901:S40|4d415443485f434f4d50494c455228292e6275696c64416f74283529657175616c6974792d283129 16902:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9c5bdf9ff90000000002c000000|@16903,2097151,@4009|24,0,1 35,1,@13829 16903:S40|4d415443485f434f4d50494c455228292e6275696c64416f742835296c697456616c75652d283129 16904:D3,508|3b650c7303ff552453ff30bb030000008b442410baa80b7cb2e8aa05ecff5068200890b289c38b442408ba240f8eb29090e8ea08feff5983c4048b55008d52e83b55087303ff5520895500c742fc020000008b09894a0489028d420cc740fc020000008b4a048948048b1a8918ff7004ff30ff7504b8020790b2508965048b442408833805751f8b75008d76f83b75087303ff5520897500c746fc010000008b40048906eb05be0100000083fe01750db84cc37bb28b5d04909090ff138b4424108b1690ff1289c18b45008d40f83b45087303ff5520894500c740fc01000000890883c40459894d0483c40cc208009090908b650483c4045b895d048138cb000000750bb80100000083c40cc2080083381175518b5808b8540890b290e86204eaffbb740890b29090e85604eaff8b5c2408909090e84a04eaffbb980890b29090e83e04eaff8b5c2404909090e83204eaff8b5424109090ff12b80100000083c40cc2080083380b753b8b5c2408b8a40890b29090e80a04eaffbb980890b29090e8fe03eaff8b5c2404909090e8f203eaff8b5424109090ff12b80100000083c40cc20800833803750bb8d80890b28b5d0490ff138b5c2408b8040990b2909090e8be03eaffbb980890b29090e8b203eaff8b5c2404909090e8a603eaff8b5424109090ff12b80100000083c40cc2080090909000000000f8010000|@16914,2097151,@4011|12,0,1 21,0,@6907 26,1,@6908 32,0,@16905 43,0,@16026 50,1,@16027 118,0,$16904+242 167,0,0 177,0,@6769 254,0,101 261,0,0 280,0,@16907 286,1,@4940 291,0,@16908 298,1,@4940 310,1,@4940 315,0,@16909 322,1,@4940 334,1,@4940 347,0,0 367,0,@16910 374,1,@4940 379,0,@16909 386,1,@4940 398,1,@4940 411,0,0 427,0,@16911 442,0,@16913 450,1,@4940 455,0,@16909 462,1,@4940 474,1,@4940 487,0,0 16905:O1|@16906 16906:D3,24|b8a40e8eb28b5d04909090ff139090900000000014000000|@16025,1,@4010|1,0,@16022 16907:S22|436f6e76657273696f6e20657863657074696f6e2028 16908:S26|2920726169736564207768696c6520636f6e76657274696e6720 16909:S4|20746f20 16910:S43|4f766572666c6f7720657863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 16911:O4|1,@5021,0,@16912 16912:O5|@15818,1327,0,1327,0 16913:S34|457863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 16914:S30|56414c55455f4f505328292e6765744c69746572616c56616c7565283429 16915:D3,252|3b650c7303ff55248b4c240c8b5104833a057558ff7108ff31ff74240c53ff74241889c38b42049090e8e20000008b4d008d49e43b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc030000008b5424048950088948045983c4048908c20c00833a09740c89c6b8040e90b28b5d04ff138b75008d76bc3b75087303ff5520897500c746fc02000000c74604010000008b7c2408893e8d560cc742fc03000000895a0889720489028d4210c740fc02000000c740040100000089108d500cc742fc02000000894204c702050000008d420cc740fc030000008b59088958088950048b118910c20c0000000000f8000000|@16923,2097151,@4014|42,1,@16916 75,0,2 116,0,@16920 152,0,0 193,0,0 214,0,2 16916:D3,344|3b650c7303ff5524a801756c8b08ff700453ff71045153ff7424208b59088b442420909090e84201000083f801746b8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b4c241489088b5c240490e816e3ffff8b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e9810000008b5424188951088941048b44240889018b45008d40f43b4508730aeb05e91c000000ff5520894500c740fc020000008b5c240c895804890883c410c20c00ff74241cff74241cff74241c8b5c24148b4424189090e82affffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c410c20c008b45008d40d83b45087303ff5520894500c740fc02000000c74004010000008b4c240489088d500cc742fc030000008b742408897208894204891a8d4210c740fc02000000c74004010000008910c20c00900000000054010000|@16919,2097151,@4013|38,1,@16917 74,0,0 90,1,@16797 281,0,0 326,0,0 16917:D3,432|3b650c7303ff5524a801756cf6c301756c8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b00894104c701050000008b45008d40c83b45087303ff5520894500c740fc03000000c74008010000008b1b895804c700050000008d5010c742fc02000000c7420401000000eb0ae921010000e91c01000089028d420cc740fc0200000089500489088d480cc741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740c89c8909090e8f60cecffeb0289c88b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c8e8b6eeebff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b542408895108894104c701070000008b4424046a018b583489c8ba7c727cb2e86665ecff89c1b80100000089ca90ff12833805751f8b4d008d49f83b4d087303ff5520894d00c741fc010000008b40048901eb05b90100000083f901750db84cc37bb28b5d04909090ff138b01c20800b801000000c20800909000000000ac010000|@16918,2097151,@4012|44,0,0 55,0,2 86,0,0 97,0,2 114,0,0 160,0,0 169,0,14 200,0,0 207,0,1 222,1,@6933 257,0,0 266,1,@6881 297,0,1 313,0,3 329,0,@7311 334,1,@7312 341,0,0 387,0,0 397,0,@6769 415,0,0 16918:S46|4d415443485f434f4d50494c455228292e61646453636f6e737472283529657175616c5370656369616c73283229 16919:S41|4d415443485f434f4d50494c455228292e61646453636f6e737472283529616464436c697374283129 16920:O4|@4608,@5398,@16922,@16921 16921:O5|@16803,351,0,351,0 16922:S36|61646453636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 16923:S30|4d415443485f434f4d50494c455228292e61646453636f6e737472283529 16924:D3,220|3b650c7303ff552483f801751883fb01740bb8f00a7eb28b5d0490ff13b801000000c21000f6c301740f8b48048b10b8f00a7eb28b5d04ff136a016a016a01ff7304ff7004ff742420ff742420ff7424208d4c2414518b1b8b008b5424349090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c8948048b4c2408890850ff742428ff742428ff742428ff7424288b5c24188b4424149090e852ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c2100000000000d8000000|@8211,1048575,@4015|19,0,@8209 30,0,0 48,0,@8209 16925:O4|@4608,@5398,@16927,@16926 16926:O5|@16803,448,0,448,0 16927:S31|7061747465726e206973206e6f742061207475706c6520696e20612d6f2d74 16928:D3,232|3b650c7303ff5524a80175708b4d008d49f03b4d087303ff5520894d00c741fc030000008b5308895108c7410434c47fb2c701010000006a016a016a0153ff7004ff742420ff742420ff7424208d7424145689cb8b008b5424349090ff128b45008d40f03b45087303ff5520894500c740fc030000008b4c2410eb05e9570000008948088b4c240c8948048b4c2408890850ff742428ff742428ff742428ff7424288b5c24188b442414909090e84effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4148908c21000b801000000c2100000000000e4000000|@6329,1048575,@4016|45,0,@8817 51,0,0 217,0,0 16929:S28|4d415443485f434f4d50494c455228292e6275696c64416f74283529 16930:D3,248|3b650c7303ff55248b480483390375528b5104bb01000000f6c20175428b0283fb017407b903000000eb24837804017507b903000000eb12ff72048b480889c890e8baffffff89c1eb08ff7204eb03ff720489cb5a3b650c7303ff5524ebb989d8c383390175428b5104bb01000000f6c20175328b0283fb017407b903000000eb14ff72048b480889c8909090e86effffff89c1eb03ff720489cb5a3b650c7303ff5524ebc989d8c383390775398b5104bb01000000f6c201752983fb017407b803000000eb0dff72048b0290e82effffffeb03ff720489c35a3b650c7303ff5524ebd289d8c3b801000000c390909000000000f4000000|@16931,31,@4018|20,0,0 37,0,1 50,0,1 107,0,0 124,0,1 178,0,0 193,0,1 232,0,0 16931:S45|4d415443485f434f4d50494c455228292e636f6e7461696e734e6f6e436f6e7374457863657074696f6e283129 16932:D3,104|3b650c7303ff5524a8017409f6c30174043bc3eb05ff5538ebf77e06b801000000c389c1f6c101740583c1027105ff5538ebf65089c8909090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000064000000|@16933,11,@4019|29,0,0 16933:S26|4d415443485f434f4d50494c455228292e66726f6d2832292829 16934:O1|@16935 16935:D3,108|8338017507b801000000eb15f60001740c8b08b81c777bb28b5d04ff138b008b008b4d008d49e03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc04000000c7400c03000000894808c7400401000000c70060877ab2c30000000068000000|@16936,3,@4020|6,0,0 20,0,@6704 60,0,0 79,0,1 89,0,0 95,0,@5515 16936:S47|4d415443485f434f4d50494c455228292e6275696c645061747465726e436f64652833296669726550617474283129 16937:D3,1780|8d7c24a83b7d0c7303ff55288b3089dfff700489fb8b400890e8ea0600006a016a016a016a0183ff01745689f989c23bca7507b903000000eb42f6c1017538f6c201752c8b19f6c3017508f602017503ff55383b1a75128b52048b590489d93b650c7303ff5524ebc6b901000000eb0cb901000000eb05b90100000083f90174518b45008d40f43b45087303ff5520894500c740fc020000008b4c241c8948048938568b54242490ff128d4c24048b1089118d4c24048b58048959048d4c24048b70088971088d4c24048b780c89790ceb5c8b4c2410833909755889c18b45008d40f43b45087303ff5520894500c740fc020000008b54241c8950048908568b54242490ff128d4c24048b1089118d4c24048b58048959048d4c24048b70088971088d4c24048b780c89790ceb66e97905000083390575618b4904ba01000000565750f6c101756c8b018b710489d7ff7008ff308b5c240c8b480489c8e8a605000083f80174708b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424048951088b1424895104c70105000000eb0ae913050000e9da000000518b5c240c9090e8a6d8ffff89c18b45008d40f4eb05e9760000003b45087303ff5520894500c740fc020000008b542434895004890856eb05e93d000000578b542440909090ff128b4d008d49e83b4d087303ff5520894d00c741fc020000008941048b44240889018d790cc747fc0200000058894704890feb036a015689fa5983c40c3b650c7303ff5524e914ffffff89d089c18b45008d40f43b45087303ff5520894500c740fc020000008b5424288950045b83c4048918518b542428909090ff126a018d4c240c5189c38b4424089090e8fe050000eb6183390375618b4904ba01000000565750f6c10175568b018b710489d7ff700cff70088b5c240c8b0889c8909090e85e04000083f80174728b5c24089090e896d7ffff6a016a016a016a015657ff74244cff74244c8d4c24105189c38b442424eb0fe9cb030000e9fd000000e9b000000090e812fdffff8b45008d40ec3b45087303ff5520894500c740fc040000008b4c241489480c8b4c24108948088b4c240c8948048b4c2408eb05e95600000089088b4d008d49f43b4d087303ff5520894d00c741fc020000008b54241c895104c701030000008b55008d52e83b55087303ff5520895500c742fc02000000894204890a8d7a0cc747fc02000000588947048917eb096a016a016a016a015689fa5983c4183b650c7303ff5524e9f0feffff89d089c18b45008d40f43b45087303ff5520894500c740fc020000008b5424288950045b83c4048918518b5424289090ff126a018d4c240c5189c38b4424089090e896040000eb6183390175618b5104bb01000000565750ff7108f6c201756b8b028b720489dfff7004ff700cff70088b5c24148b0889c890e8f202000083f80174718b5c24109090e82ad6ffff6a016a016a016a015657ff742454ff7424548d4c24105189c3eb0ae963020000e9090100008b4424249090e8aafbffff8b45008d40ec3b4508730aeb05e9a6000000ff5520894500c740fc040000008b4c241489480c8b4c24108948088b4c240c894804eb05e9610000008b4c240889088b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424208951088b54241c895104c701010000008b55008d52e83b55087303ff5520895500c742fc02000000894204890a8d7a0cc747fc02000000588947048917eb096a016a016a016a015689fb5a83c41c3b650c7303ff5524e9e5feffff89d889c18b45008d40f43b45087303ff5520894500c740fc020000008b54242c8950048b5c24048918518b542434ff12ff7424048d4c24185189c38b442408e822030000eb64f641040175268b410483780401751d56ff742424ff7424248d54240c5289fb8b0889c89090e882faffffeb708b44241ca801740583c0027105ff5538ebf6ba010000008b5904f6c3017523f6c201740583c2027105ff5538ebf68b5b043b650c730aeb05e9e9000000ff5524ebd889d3f6c301740583eb027105ff5538ebf6565250ff7104b801000000909090e8920d00006a016a016a016a01eb05e9a9000000508d44240450ff742448ff742424ff742420b8802790b250ff7424548b5c243089f89090e8de0d00008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b5424088950088b5c24048958045b83c40489188b5d008d5bf03b5d087303ff5520895d00c743fc030000008b742434897308894304c703010000008d44241889188d442418c74004010000008d4424188950088d44241883c40489480c83c4106a016a016a016a0183c40c83c404837c24080175058b0424eb0e8b5c24088b04249090e85e1400008b4c241c83c4045a83c4048911894104588941085883c40489410cb801000000c20c0090909000000000f0060000|@16965,1048575,@4035|26,1,@16938 52,0,1 106,0,0 113,0,0 120,0,0 316,0,0 350,1,@16938 398,0,2 422,1,@16797 626,1,@16940 641,0,0 678,1,@16938 694,1,@16797 841,0,1 986,1,@16940 1001,0,0 1042,1,@16938 1058,1,@16797 1215,0,0 1358,1,@16940 1427,0,0 1498,0,0 1506,1,@16951 1544,0,@16952 1562,1,@16953 1653,0,0 1670,0,0 1730,1,@16964 1762,0,0 16938:D3,304|3b650c7303ff552483f801740583fb017506b801000000c3a801740d89c1b81c777bb28b5d0490ff13f6c301740f89c1b81c777bb28b5d04909090ff138b08f6c1017508f603017503ff55383b0b7563a801740d89c1b81c777bb28b5d0490ff13a801740c89c2b858777bb28b5d04ff13f6c301740f8b5004b858777bb28b5d049090ff13518b5b048b400490e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3a801740e89c1b81c777bb28b5d049090ff13f6c301740f89c2b81c777bb28b5d04909090ff13f6c101740bf6030174063b0b7d24eb05ff5538ebf5a801740f89c1b858777bb28b5d04909090ff138b480489c8e9f5fefffff6c301740d89c1b858777bb28b5d0490ff138b5b04e9dbfeffff909090000000002c010000|@16939,15,@4021|19,0,0 31,0,@6704 49,0,@6704 87,0,@6704 104,0,@6707 122,0,@6707 186,0,@6704 205,0,@6704 245,0,@6707 275,0,@6707 16939:S29|4d415443485f434f4d50494c455228292e696e74657273656374283229 16940:D3,664|3b650c7303ff5524b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf6a016a01f6c101750af6442410017503ff55383b4c2410751389e1c7010100000089e1c7410401000000eb0f89e18b5308891189e18b730c89710489c1f6c10175598b118b72048b7e088b53083bfa7507ba03000000eb4df7c7010000007540f6c201752f8b37f7c6010000007508f602017503ff55383b3275128b52048b770489f73b650c7303ff5524ebc0ba01000000eb11ba01000000eb0ae91e000000ba0100000083fa01740d8b49043b650c7303ff5524eb86b901000000eb05b90300000083f90174258b44240c8b0b89088b53048950048b73088970088b7b0c89780cb80100000083c408c2080089c18b14245350f6c10175238b018b58048b71048b7b0889fb89d090e89ed0ffff89c289f13b650c7303ff5524ebd889d08b0c248b54240cf6c101752c8b198b7304f6c201740ef6460c0174088d52ff03560c7105ff5538ebf38b790489f93b650c7303ff5524ebcf89d18b55008d52ec3b55087303ff5520895500c742fc040000005b895a0c8b5c2414895a085e897204c702030000008b75008d76ec3b75087303ff5520897500c746fc04000000894e0c894608c74604010000008916f6c101740783f9037e61eb06f641ff10755ebf0100000089c3f6c301751ff7c701000000740583c7027105ff5538ebf68b5b043b650c7303ff5524ebdc89fbf6c301740403db7105ff5538ebf783eb01f6c301740583eb027105ff5538ebf6f6c1017415f6c3017410eb0ae925000000e9200000003bcbeb05ff5538ebf77c158b44240c89c389f083c4085983c40851e93b0000008b5c240c8913c7430401000000894308894b0cb80100000083c408c20800900000000094020000|@16950,63,@4027|9,0,0 77,0,0 86,0,0 130,0,1 190,0,0 197,0,0 209,0,0 232,0,0 239,0,1 275,0,0 314,1,@16797 433,0,1 470,0,0 495,0,0 621,1,@16941 634,0,0 645,0,0 16941:D3,136|3b650c7303ff552453ff7008ff700489c38b442404e8820000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70107000000b8010000008b542404f6c201751ba801740583c0027105ff5538ebf68b52043b650c7303ff5524ebe08b542408890a59894a0459894a0889420cb80100000083c404c390900000000084000000|@16949,63,@4026|22,1,@16942 55,0,3 60,0,0 118,0,0 16942:D3,236|3b650c7303ff552483f8017506b801000000c3a801740e89c1b81c777bb28b5d049090ff13ff3053508b442408e8ce0000008b4d008d49e83b4d087303ff5520894d00c741fc020000008b54240889510489018d410cc740fc02000000c7400401000000891089ce89c38b0424e8fe040000568b5c24089090e882ffffff837c240c0175378b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b1424891183f901750483c410c389cb83c410e91806000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048b0c24890883c410c3909000000000e8000000|@16948,63,@4025|14,0,0 26,0,@6704 46,1,@16943 96,0,0 110,1,@16945 160,0,0 184,1,@16947 16943:D3,1064|3b650c7303ff55248b0b833907756d8b5104f6c201753f8b32a8017509f64604017503ff55383b4604751c8b7d008d7ff83b7d087303ff5520897d00c747fc010000008937eb148b720489f23b650c7303ff5524ebbcbf0100000083ff01750db84cc37bb28b5d04909090ff138b3f8b45008d40e83b4508730aeb05e92d000000ff5520894500c740fc020000008b5304895004c700c4777ab289c68d400cc740fc020000008b3f8978048930c3833903755d8b51048b720883fe017507be01000000eb56f7c601000000740c89c7b81c777bb28b5d04ff13a8017508f606017503ff55383b067507be03000000eb61f7c601000000740d89c7b81c777bb28b5d0490ff13a8017417f606017412eb05e9e60100003b067d13eb0ae931000000ff5538ebf0be01000000eb25f7c601000000740d89c7b858777bb28b5d0490ff138b76043b650c7303ff5524e968ffffff83fe01744d8b75008d76f43b75087303ff5520897500c746fc020000008b7b04897e04c706c4777ab25689d3e87efeffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b710cf7c601000000755e8b0e8b51048b7a0883ff017507bf01000000eb55f7c701000000740b50b81c777bb28b5d04ff13a8017508f607017503ff55383b077507bf03000000eb61f7c701000000740d50b81c777bb28b5d049090ff13a8017417f607017412eb05e96f0000003b077d13eb0ae931000000ff5538ebf0bf01000000eb25f7c701000000740d50b858777bb28b5d049090ff138b7f043b650c7303ff5524e969ffffff83ff01741c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000890feb178b7e0489fe3b650c7303ff5524e926ffffffbf0100000083ff01750f89c1b84cc37bb28b5d04909090ff138b0f8b55008d52e83b55087303ff5520895500c742fc020000008b31897204c702030000008d7a0cc747fc020000008b5b04895f048917578b590490e826fdffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c383390975728b55008d52f03b55087303ff5520895500c742fc030000008b710c8972088b7908897a04c702050000008b7d008d7ff43b7d087303ff5520897d00c747fc020000008b5b04895f048917578b5904909090e8aafcffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb05e907000000894804598908c383390175608b55008d52e83b55087303ff5520895500c742fc020000008b7108897204c702010000008d7a0cc747fc020000008b73048977048917578b5904e83efcffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40e83b45087303ff5520894500c740fc020000008b5304895004c700c4777ab289c68d400cc740fc02000000c74004010000008930c39090900000000024040000|@16944,63,@4022|87,0,0 97,0,@6769 150,0,@5383 191,0,0 208,0,@6704 234,0,1 251,0,@6704 294,0,0 311,0,@6707 374,0,@5383 444,0,0 460,0,@6704 486,0,1 502,0,@6704 546,0,0 562,0,@6707 641,0,0 653,0,@6769 698,0,1 806,0,2 931,0,0 1027,0,@5383 1046,0,0 16944:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655465737473283229 16945:D3,304|3b650c7303ff552483f8017506b801000000c383fb017501c3a801740c89c1b81c777bb28b5d04ff13f6c301740f89c1b81c777bb28b5d04909090ff138b08f6c1017508f603017503ff55383b0b7532a801740d89c1b858777bb28b5d0490ff13f6c301740f8b4804b858777bb28b5d049090ff138b5b048b480489c8e97effffffa801740f89c1b81c777bb28b5d04909090ff13f6c301740f89c2b81c777bb28b5d04909090ff13f6c101740bf6030174063b0b7d54eb05ff5538ebf5a801740f89c1b81c777bb28b5d04909090ff13a801740c89c2b858777bb28b5d04ff13518b4004e816ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3f6c301740d89c1b858777bb28b5d0490ff138b5b04e9dbfeffff909090000000002c010000|@16946,15,@4023|14,0,0 32,0,@6704 49,0,@6704 87,0,@6707 106,0,@6707 137,0,@6704 157,0,@6704 197,0,@6704 216,0,@6707 275,0,@6707 16946:S24|4d415443485f434f4d50494c455228292e64696666283229 16947:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4024| 16948:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655061747473283129 16949:S29|4d415443485f434f4d50494c455228292e6d616b654e61697665283129 16950:S43|4d415443485f434f4d50494c455228292e70617474436f64652834296d616b655061747454657374283329 16951:D3,104|3b650c7303ff5524a8017409f6c30174043bc3eb05ff5538ebf77e06b801000000c389c1f6c101740583c1027105ff5538ebf65089c8909090e8c2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000064000000|@16933,11,@4028|29,0,0 16952:O1|@16937 16953:D3,464|3b650c7303ff5524837c241c01740583f801754889c18b45008d40f43b45087303ff5520894500c740fc0200000089580489088b54241490ff128b4c24188b1089118b58048959048b70088971088b780c89790cb801000000c21c005350ff742414508b5c24208b44242c9090e8720100008b4c241489c2f6c101740c89c3b8bc7e7ab28b5d04ff1383fa0175048b09eb1cf6c201740583ea027105ff5538ebf68b49043b650c7303ff5524ebca8b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890289c689cf89d38b442424e852fcffff8b4d008d49e03b4d087303ff5520894d00c741fc07000000c701ac2d90b28941048b44241c8941088b54241889510c8b5c24148959108b4424108941148b54240c8951188061ffbf6a016a016a016a015651ff74241c8d4c240c518b5c242089f88b54243090ff128b45008d40ec3b45087303ff5520894500c740fc040000008b4c241089480c8b54240c8950088b5c24088958048b5c240489188b5d008d5bec3b5d087303ff5520895d00c743fc040000005e83c40889730c8b742414897308894304c703090000008b4424288918c740040100000089500889480cb80100000083c410c21c00909000000000cc010000|@16963,1048575,@4033|85,0,0 110,1,@16954 128,0,@5417 201,0,0 218,1,@16945 248,0,@16960 420,0,4 433,0,0 444,0,0 16954:D3,68|3b650c7303ff55248b4c24088b542404be0100000089742408895c24048b1c24890424515289d8bb0100000089c6b80100000056e91f0000009090900000000040000000|@16959,63,@4031|17,0,0 40,0,0 47,0,0 53,1,@16955 16955:D3,492|3b650c7303ff5524a801750af6442410017503ff55383b442410750589d8c214008b4c240c83f9017507b901000000eb65f6c101740f89c2b81c777bb28b5d04909090ff13a8017508f601017503ff55383b017507b903000000eb55f6c101740c89c2b81c777bb28b5d04ff13a801740bf6010174063b017d0eeb05ff5538ebf5b901000000eb29f6c101741489c2b858777bb2eb05e9160000008b5d0490ff138b49043b650c7303ff5524e974ffffff83f901745f8b4c240889c2f6c101740c89c6b8bc7e7ab28b5d04ff1383fa0175048b09eb1cf6c201740583ea027105ff5538ebf68b49043b650c7303ff5524ebca89df508b5c240889c89090e8fe000000a8017414f644241801740d3b4424187e4feb0ae98b000000ff5538ebee8b0c24f6c101740583c1027105ff5538ebf68b5424148b5c24108b74240c8b7c24088944241889542414895c24108974240c897c24088b1c2489c883c404e99efeffff8b0424a801740583c0027105ff5538ebf68b4c24188b5424148b5c24108b74240c578b7c240c894c241c89542418895c241489742410897c240c5b83c404e95bfeffffa801740583c0027105ff5538ebf68b4c24148b5424108b74240c8b7c2408538b5c2408894c24188954241489742410897c240c895c24085be91efeffff909000000000e8010000|@16958,63,@4030|43,0,0 57,0,@6704 86,0,1 100,0,@6704 130,0,0 144,0,@6707 196,0,@5417 254,1,@16956 16956:D3,336|3b650c7303ff55248b4804833907754d8b5104be0100000053f6c2017539ff7204568b5c24088b0290e8d2ffffffa801740df604240174073b04247e07eb08ff5538ebf48b042489c683c4045a3b650c7303ff5524ebc289f083c404c389ce8b4008909090e866eeffff83f8017415a801740e89c1b81c777bb28b5d049090ff138b00c3833e05753ab8010000008b7604f7c601000000751ba801740583c0027105ff5538ebf68b76043b650c7303ff5524ebdda801740583c0027105ff5538ebf6c3833e03753ab8010000008b7604f7c601000000751ba801740583c0027105ff5538ebf68b76043b650c7303ff5524ebdda801740583c0027105ff5538ebf6c3833e01753ab8010000008b7604f7c601000000751ba801740583c0027105ff5538ebf68b76043b650c7303ff5524ebdda801740583c0027105ff5538ebf6c3b801000000c390000000004c010000|@16957,31,@4029|20,0,0 102,1,@16938 118,0,@6704 138,0,0 201,0,0 264,0,0 322,0,0 16957:S29|4d415443485f434f4d50494c455228292e706174744465707468283229 16958:S44|4d415443485f434f4d50494c455228292e62657374436f6c756d6e28342966696e6444656570657374283329 16959:S30|4d415443485f434f4d50494c455228292e62657374436f6c756d6e283429 16960:D3,116|3b650c7303ff55246a016a016a016a01ff72048d4c240451ff7208ff720cff7210ff7214ff72188b58048b0889c8ba342e90b290ff128b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c8908c390900000000070000000|@16962,1048575,@4032|47,0,@16961 16961:O1|@16953 16962:S51|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283129283129 16963:S48|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283329 16964:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4034| 16965:S28|4d415443485f434f4d50494c455228292e70617474436f6465283429 16966:D3,128|3b650c7303ff552483f8017556837a1001740ab8c02f90b28b5d04ff13837a0c0174258b45008d40f43b45087303ff5520894500c740fc020000008b5204895004c70017000000c38b52088b0424891424bb183090b289c1b8d46d88b251e999000000a801740583e8027105ff5538ebf68b5214ff229090000000007c000000|@16973,1048575,@4037|20,0,@16967 67,0,11 82,0,@16970 89,0,@13315 95,1,@16971 16967:O4|@4608,@5398,@16969,@16968 16968:O5|@16803,1179,0,1179,0 16969:S33|636f646544656661756c742063616c6c6564206275742065786861757374697665 16970:O3|2,101,0 16971:D3,428|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c701050000008b442404813848c05208742bf6000175368b30bf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb1089ca83780801751383781001750deb0489caeb07b9c4757ab2eb5e8b4d008d49e83b4d087303ff5520894d00c741fc050000008b700c8971108b780489790c8b78108979088b70088971048b308931518b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005e897104c701050000008b45008d40c03b45087303ff5520894500c740fc02000000c740040100000089088d480cc741fc02000000894104c701c4757ab28d410cc740fc0200000089480489108d480cc741fc0200000089410489198d410cc740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f901740690e806e8ebff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70017000000c2040000000000a8010000|@16972,1048575,@4036|35,0,0 44,0,2 54,0,I48 68,0,I48 75,0,4 124,0,@5348 210,0,0 220,0,2 251,0,0 272,0,@5348 319,0,0 328,0,14 360,0,0 367,0,1 378,1,@6933 413,0,11 16972:S34|4d415443485f434f4d50494c455228292e7261697365457863657074696f6e283329 16973:S48|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e732836296669726550617474283129 16974:D3,56|3b650c7303ff55248b4c24048b542408be0100000089742408894c24048b3424891424ff7104ff710c56e91d000000900000000034000000|@17011,2097151,@4048|17,0,0 43,1,@16975 16975:D3,788|3b650c7303ff55248b4c241053ff30ff7008ff7104ff7004b8030000008b5108ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54241089510c894108c7410401000000c70103000000a801740783f8017c08eb15f640ff10740f89c3b8a4727db28b5d04909090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000894304c703050000008d730cc746fc02000000895e04c706090000005bf6c30175308b138b7a08833f05740c50b8c03590b28b5d0490ff138b570489028b57088b3c24893a8b5b043b650c7303ff5524ebcbba010000008b442408833807751b51ff742428ff742428ff7424288b5c241c8b4004e862020000eb5a833803753351bac44690b252ff742428ff742428ff742428ff742428ff7004ff742428ff742444568b58088b500c89d090e8fa120000eb6883380975688b542424f6c201754b8b1a8b7008f7c601000000750ff60301750aeb05e950010000ff55383b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000891feb148b5a0489da3b650c7303ff5524ebb0bf0100000083ff01751e8b5004eb0ae90a010000e9820000008b580cb84cc37bb28b5d049090ff138b3f8b5704833a05751551ff70046a018b580c89d0909090e88eb6ebffeb338b58048b700c8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000897008895004c7000d0000005153ff74242cff74242cff74242cff74242cff74242c89c38b442414e8d2fdffffeb5883380175588b55008d52e83b55087303ff5520895500c742fc020000008972048b5808891a8d720cc746fc020000008b7c2424897e0489165156ff742428ff742428ff742428ff7424288b5c24248b4004e87afdffffeb26e923000000f644240401740db81c777bb28b5d04909090ff138b442404518b008b542420ff126a0183c4048b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000005a83c410891183f9017503c2140089c28b45008d40f03b45087303ff5520894500c740fc03000000895008894804c70015000000c214009090900000000010030000|@17010,2097151,@4047|25,0,1 71,0,0 77,0,1 101,0,@7993 142,0,2 161,0,4 183,0,@16976 220,0,0 254,1,@16979 267,0,@17004 310,1,@17005 406,0,0 434,0,@6769 470,1,@6843 509,0,0 521,0,6 661,0,@6704 718,0,0 770,0,10 16976:O4|@4608,@5398,@16978,@16977 16977:O5|@16803,611,0,611,0 16978:S7|73657441646472 16979:D3,248|3b650c7303ff5524a801740d89c1b8083790b28b5d0490ff138b0853ff7004ff31ff710453ff742420ff7424208b5c240c8b442410e816010000508b4424048b54241890ff12833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c70015000000f644240c01740683c414c20c0050ff742424ff7424248b5c241c8b4424149090e8f60b000050ff742428ff742428ff7424288b5c24248b4424209090e84affffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c8b4c24048948085983c404894804c7000300000083c414c20c0090909000000000f4000000|@17003,2097151,@4045|15,0,@16980 54,1,@16983 113,0,10 150,1,@17001 227,0,1 16980:O4|@4608,@5398,@16982,@16981 16981:O5|@16803,1083,0,1083,0 16982:S16|6d616b6554657374733a20656d707479 16983:D3,708|3b650c7303ff5524a80175588b088b54240453ff7004ff31ff7204ff7104b8030000008b4a0889caff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54242089510c894108c7410401000000c70103000000a801740c83f8017c0deb19e94b020000f640ff10740e89c3b8a4727db28b5d049090ff138b5d008d5be83b5d087303ff5520895d00c743fc02000000894304c703050000008d730cc746fc02000000895e04c706090000005bf6c30175308b138b7a08833f05740c50b8c03590b28b5d0490ff138b570489028b57088b3c24893a8b5b043b650c7303ff5524ebcbba010000008b44240483380375376a016a0151ff7424208d5424085289f38b400490e8ca010000ff742408ff742428ff7424288b5c24248b442420909090e8d6feffffeb6683380575668b542418f6c20175448b1a8b7004f7c6010000007508f603017503ff55383b33751c8b7d008d7ff83b7d087303ff5520897d00c747fc01000000891feb148b5a0489da3b650c7303ff5524ebb7bf0100000083ff0175198b5008b84cc37bb2eb0ae9f7000000e9700000008b5d04ff138b3f8b5704833a0575156a016a01516a018b580889d09090e8f6b1ebffeb338b58088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000895808895004c7000d0000006a016a015150ff742428ff7424288b5c24248b44242090e8f6fdffffeb6083380175608b55008d52f43b55087303ff5520895500c742fc020000008972048b400489028b45008d40f43b45087303ff5520894500c740fc020000008b5c241889580489106a016a01515650ff7424288b5c24248b442420e896fdffffeb22e91d0000006a016a015156ff742428ff7424288b5c24248b4424209090e872fdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4188908c20c00b801000000c20c0000000000c0020000|@17000,2097151,@4043|31,0,1 79,0,0 85,0,1 114,0,@7993 154,0,2 173,0,4 195,0,@16976 232,0,0 266,1,@16984 383,0,0 396,0,@6769 442,1,@6843 478,0,0 490,0,6 693,0,0 16984:D3,508|3b650c7303ff55248338057576837808017507b9c4757ab2eb2d8b48088b118b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000895104c701050000008b55008d52d83b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc0200000089510489198d510cc742fc03000000eb05e9b7000000c7420801000000894a04c7021d000000f6c101751d8b19833b05750f8b590489d93b650c7303ff5524ebe5b901000000eb05b90300000083f901740cff700489d0e8badeebffeb068b480489d0518b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890189c8e876c0ebff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c701070000008b4424048908c74004c4757ab2b801000000c2080083380375578b4c240853ff710cff7104ff700453ff742408ff742410bb010000008b44240c90e8a600000050ff742410ff74240cff742414bb010000008b44241090e8e60300008b4c24185a83c4108911894104b801000000c208008b4c240853ff710cff7104ff7008ff700453ff74240cff7424148b5c24108b44240ce84e00000050ff742414ff742410ff7424188b5c24148b4424109090e88e0300008b4c241c5a83c4148911894104b801000000c208009000000000f8010000|@16999,2097151,@4042|20,0,@5348 58,0,0 67,0,2 98,0,0 139,0,0 148,0,14 180,0,0 187,0,1 202,1,@6933 241,0,0 250,1,@6881 281,0,1 294,0,3 307,0,@5348 312,0,0 348,0,0 358,1,@16985 376,0,0 386,1,@16992 404,0,0 446,1,@16985 474,1,@16992 492,0,0 16985:D3,480|3b650c7303ff55248378040175718b4c240c8339057511506a01bb0100000089c8e8a6aeebffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d000000528b0d2ce939b28b1534e939b28b1d3ce939b28b3544e939b28b7d008d7fe83b7d08730aeb05e9ae000000ff5520897d00c747fc05000000895f1089770c894f08895704c70748c0520850ff74240c6a0168cc7e8eb2578b5c24208b442414bab8bc8db2e8da7ffdff8b4d008d49e83b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc020000008948045983c4048908909090e80aa7feff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c740086c757ab2894804c70007000000c20c00f6400401740d89c1b8283e90b28b5d0490ff13ff7424045068683e90b2b80100000090e8bea5ebffff7424108d4c2404518b5c241cbab8e37bb290e83ea6ebff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54241883c40c891189c389c8909090e8bebdebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c20c00909000000000dc010000|@16991,2097151,@4039|27,0,0 34,1,@6843 69,0,0 76,0,0 85,0,6 92,0,@4748 98,0,@4749 104,0,@4750 110,0,@4751 159,0,I48 171,0,@16204 185,0,@15827 190,1,@15829 221,0,0 250,1,@16341 283,0,1 290,0,@5341 299,0,3 315,0,@16986 331,0,@16989 336,0,0 342,1,@6834 360,0,@6835 366,1,@6837 397,0,0 418,1,@6881 451,0,1 463,0,3 16986:O4|@4608,@5398,@16988,@16987 16987:O5|@15818,1248,0,1248,0 16988:S9|6d616b654775617264 16989:D3,200|3b650c7303ff55248b0d2ce939b28b1d34e939b28b353ce939b28b3d44e939b2528b55008d52e83b55087303ff5520895500c742fc05000000897210897a0c894a08895a04c70248c052088b0c24ff71086a0168cc7e8eb25289c38b4104bab8bc8db29090e8fe7dfdff833805751bb9010000008b542404894c2404bb0100000083c40452e90eacebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d00000083c404c39000000000c4000000|@16990,2097151,@4038|10,0,@4748 16,0,@4749 22,0,@4750 28,0,@4751 71,0,I48 84,0,@16204 95,0,@15827 102,1,@15829 112,0,0 125,0,0 134,1,@6843 167,0,0 174,0,0 183,0,6 16990:S33|56414c55455f4f505328292e6d616b654775617264283529746573746572283129 16991:S24|56414c55455f4f505328292e6d616b654775617264283529 16992:D3,292|3b650c7303ff55248378040175578b44240c8338057518b903000000894c240cbb050000005983c40851e941abebff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000c74008050000008b4c240c894804c7000d000000c20c00f6400401740e89c1b8c84090b28b5d049090ff138b48048339037508b8c4757ab2c20c00ff7424045068084190b2b80100000090e81ea3ebffff7424108d4c2404518b5c241cbab8e37bb290e89ea3ebff8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b54241883c40c891189c389c8909090e81ebbebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c20c0090900000000020010000|@16998,2097151,@4041|24,0,1 33,0,2 43,1,@6843 74,0,1 81,0,2 94,0,6 110,0,@16993 130,0,@5348 143,0,@16996 148,0,0 154,1,@6834 172,0,@6835 178,1,@6837 209,0,0 230,1,@6881 263,0,1 275,0,3 16993:O4|@4608,@5398,@16995,@16994 16994:O5|@15818,1275,0,1275,0 16995:S11|6d616b65496e7665727365 16996:D3,200|3b650c7303ff55248b0d2ce939b28b1d34e939b28b353ce939b28b3d44e939b2528b55008d52e83b55087303ff5520895500c742fc05000000897210897a0c894a08895a04c70248c052088b0c24ff71086a0168cc7e8eb25289c38b4104bab8bc8db29090e85e7bfdff833805751bb9010000008b542404894c2404bb0500000083c40452e96ea9ebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d00000083c404c39000000000c4000000|@16997,2097151,@4040|10,0,@4748 16,0,@4749 22,0,@4750 28,0,@4751 71,0,I48 84,0,@16204 95,0,@15827 102,1,@15829 112,0,0 125,0,2 134,1,@6843 167,0,0 174,0,2 183,0,6 16997:S39|56414c55455f4f505328292e6d616b65496e7665727365283529676574496e7665727365283129 16998:S26|56414c55455f4f505328292e6d616b65496e7665727365283529 16999:S35|4d415443485f434f4d50494c455228292e636f6e7374727563746f72436f6465283329 17000:S29|4d415443485f434f4d50494c455228292e6d616b654c6f616473283529 17001:D3,932|3b650c7303ff5524a80175648b088b11833a0375608b742404ff7004ff720453b8030000008b5608ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c70103000000a801740783f8017c08eb20f640ff10741a89c2b8a4727db2eb0ae91d030000e9f60000008b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000894204c702050000008d420cc740fc02000000895004c700090000006a016a0151ff7424188d5424085289c38b442414e8caf6ffff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000059890850ff74241cff74241c8b5c24108b442418e8fafeffff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410cc4757ab28941088b442404894104c70103000000833c2401750889c883c414c208008b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c414c20800833a0575708b5c2408f6c30175448b338b7a04f7c7010000007508f606017503ff55383b3e751c8b4d008d49f83b4d087303ff5520894d00c741fc010000008931eb148b730489f33b650c7303ff5524ebb7b90100000083f901750d8b5804b84cc37bb28b5d04ff138b098b5904833b057519eb05e95c000000ff70046a018b5a088b4104e87aa6ebffeb328b70048b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b5208895008895804c7000d000000568b4c240c8b542408894c240c8954240889c358e9bafdffff833a0175638b742404ff700453ff7204b8030000008b56089090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240489510c894108c7410401000000c70103000000a801740783f8017c08eb19f640ff10741389c3b8a4727db28b5d04eb05e9c6000000ff138b5d008d5bd03b5d087303ff5520895d00c743fc02000000894304c703050000008d430cc740fc02000000895804c700090000008d580cc743fc02000000c7430401000000890b8d4b0cc741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc020000008b74241089700489085350ff74241489d38b442410e8c2fcffff833c2401750683c40cc2080089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c40cc208008b7424088b7c240489742408897c2404ff700458e96efcffffb8f0707ab2c20800909000000000a0030000|@17002,2097151,@4044|33,0,1 76,0,0 82,0,1 106,0,@7993 158,0,2 177,0,4 202,1,@16984 233,0,0 289,0,@5348 305,0,1 358,0,10 451,0,0 464,0,@6769 502,1,@6843 538,0,0 553,0,6 599,0,1 647,0,0 653,0,1 677,0,@7993 722,0,2 741,0,4 758,0,0 879,0,10 915,0,@5281 17002:S34|4d415443485f434f4d50494c455228292e6d616b654e616976655465737473283429 17003:S73|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d6d616b655061747465726e73283129 17004:O1|@16975 17005:D3,416|3b650c7303ff552483f801754b8b4424248b4c24108b54240c8b5c24088b7424208b7c241c578b7c241c578b7c241c895c242c897424288b5c2404895c24245b83c404895c2418897c241489d389c289c85983c41051ff228b088b11833a01756c83fb03756cf6400401750db8804890b28b5d04909090ff13ff7104ff742408ff742420ff7424208b5a088b4204909090e82ef8ffff8b4c24288b54240c8b5c24248b7424208b7c241c508b44241c8954242c895c242889742424897c24208944241c5b5889ca5983c410eb0ae908000000e90300000051ff226a016a01ff700453ff7104ff7424348d742410568b5c242089d090e85ef2ffffff74241cff742438ff742438ff742438ff7424388b5c24248b4424148b54244c9090ff1283c40459f6c101740583e9027105ff5538ebf650ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff742434ff74243489cb8b44242890e89efeffff89c18b45008d40ec3b45087303ff5520894500c740fc0400000089480c5983c4048948085983c404894804c70003000000c224009090000000009c010000|@17009,2097151,@4046|109,0,@17006 146,1,@16992 246,1,@16984 399,0,1 17006:O4|@4608,@5398,@17008,@17007 17007:O5|@16803,1060,0,1060,0 17008:S21|646f5061747465726e3a206e6f7420617420656e64 17009:S70|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d646f5061747465726e283229 17010:S49|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d61746368283329 17011:S37|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429 17012:S37|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e73283629 17013:S31|48616e646c6572206361746368657320616c6c20657863657074696f6e732e 17014:S27|4d61746368657320617265206e6f7420657868617573746976652e 17015:S8|5061747465726e20 17016:S14|20697320726564756e64616e742e 17017:D3,1544|8d7c24983b7d0c7303ff5528a801756b8b088b54240c8b74241cf7c601000000740583ee027105ff5538ebf6f7c601000000740783fe017d08eb27f646ff1075218b7c24188b3ff7c601000000740cf7c70100000074043bf7eb05ff5538ebf77c0f8b7804b8f0ea7ab28b5d049090ff13f7c601000000740ceb05e97805000083c6027105ff5538ebf68b7c24188b7477fef7c601000000740783fe077f66eb06f646ff10745e8b74241cf7c601000000740583c6027105ff5538ebf68b4c24148b542410568b742410538b5c2410ff70048b442410508b44240c8944242c897c2428894c2424895424208974241c895c241858894424108b5c24045883c408e9fbfeffff8b72048b7d008d7ff83b7d087303ff5520897d00c747fc01000040c70701000000538b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703485090b2897b04ff70048b46048943088063ffbf8b06a801740583c0027105ff5538ebf68b75008d76dc3b75087303ff5520897500c746fc03000000897e08895e0489068d4610c740fc01000040c700030000008d5808c743fc02000000c703785190b28943048063ffbf508b442418ff720cff31ff701cff701453ff30ff7114ff7010bb010000008b4104e8f680ffffb90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf51575650bb8ce58db289c8e8d2ebeaff89c68b5c24308b04249090e8b605000089c789f389f890e81a0600008b0c2483f901751a83ff01740e89c1b8e43086b28b5d049090ff13b901000000eb4df7c701000000740d89c2b8e43086b28b5d0490ff138b118b5a08833b05740e89c6b8245390b28b5d049090ff138b73048b1789168b53088b74240489328b7f048b49043b650c7303ff5524eb9450ff742408ff742420ff742428ff7424308b5c24248b442414909090e8f26afdff6a016a01ff30ff70048d442408508b5c2440b8107a7db28b54245c909090ff12ff74242c8b5c240c8b442404909090e87ef0feffff7004ff30ff742420ff742438ff7424408b5c241c8b44243cbad4408fb290e8baf3feff83f80175058b0424eb0a89c38b0424e80206000083f80175068b44240ceb0d89c38b44240c9090e84206000083f80175068b442418eb0d89c38b4424189090e8820600008b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54244083c40489511cc74118010000008b5424388951145a83c4188951108b54242889510c8b5c24188959085b8959048b5c241089196a016a01508d5c24045389cb8b4424308b542448909090ff12833c240175068b442404eb2b8b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c700150000008b4c245c83c40cf6c101740583e9027105ff5538ebf6f6c1017410f64424300174098d49ff034c24307105ff5538ebf25150bb5f0000008b44242c90e836bde9ff50bb030000008b44245cbafc317ab2e8b2e3e9ff89c358e81abde9ff8b4c24088b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e87eadebff8b4c24308b098b5424308b128b742430891681fb48c05208742bf6c301752f89debf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb0989cab98cc77ab2eb0489ca89d989d389ce90e8a2adebff535056bb585490b28b442418909090e8cee8eaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542408895118c74114030000008941108b44240489410cc74108010000005883c4088941045889018b45008d40e03b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc0400000089410c5883c42c894108c7410401000000c701030000008b442424a801740583c0027105ff5538ebf65150ff742428ff742428ff742428ff742428ff742428ff7424288b5c24248b44242090e82efaffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21c00b801000000c21c000000000004060000|@17030,2097151,@4058|102,0,@6373 290,0,0 321,0,@17018 401,0,1 417,0,@17019 454,0,0 462,1,@16764 467,0,0 511,0,@15879 518,1,@6547 534,1,@17021 546,1,@17022 566,0,@11846 578,0,0 595,0,@11846 618,0,@17023 690,1,@15825 713,0,@8006 742,1,@16563 772,0,@16565 778,1,@16567 798,1,@17025 822,1,@17026 846,1,@17027 887,0,0 1005,0,10 1060,0,47 1070,1,@4940 1076,0,1 1085,0,@5052 1090,1,@5053 1098,1,@4940 1109,0,0 1178,1,@6883 1202,0,I48 1216,0,I48 1223,0,4 1254,0,@6130 1270,1,@6884 1278,0,@17028 1290,1,@6547 1321,0,1 1335,0,1 1352,0,0 1395,0,7 1422,0,0 1428,0,1 1529,0,0 17018:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9c4a6ebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4050|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17019:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@17020,15,@4051| 17020:S53|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729666e4d6b4164647273283129 17021:D3,92|3b650c7303ff5524a801753f8b0b8b13f6c201740583c2027105ff5538ebf68913518b4004e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000058000000|@6329,15,@4052|76,0,0 17022:D3,164|3b650c7303ff552483f801751683fb01740bb8f00a7eb28b5d0490ff13b801000000c3f6c30174118b48048b10b8f00a7eb28b5d049090ff138b4d008d49ec3b4d087303ff5520894d00c741fc040000008b1389510c8b30897108c7410401000000c70103000000518b530489d38b500489d09090e886ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c39000000000a0000000|@8211,31,@4053|19,0,@8209 30,0,0 46,0,@8209 94,0,0 100,0,1 17023:O4|@4608,@5398,@16978,@17024 17024:O5|@16313,451,0,451,0 17025:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4054| 17026:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4055| 17027:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4056| 17028:O1|@17029 17029:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4057|1,0,@5280 17030:S41|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729 17031:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4059| 17032:S32|434f444547454e5f50415253455452454528292e636f64654d61746368283529 17033:O2|@17101,@16593 17034:D3,6304|8d7c24ac3b7d0c7303ff55288b08be5e5590b28d748efcffe690e9f3000000909090e903010000909090e9b9010000909090e937030000909090e983030000909090e904060000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9ec050000909090e94b060000909090e993000000909090e9c7060000909090e93b070000909090e933080000909090e973000000909090e9e9080000909090e90b0a0000909090e98e0a0000909090e953000000909090e9c70b0000909090e97d0c0000909090e9850c0000909090e938100000909090e9c5140000909090e923000000909090e951150000909090e913000000909090e959150000909090e9030000009090908b442404c700c4757ab28b5b10895804b801000000c204006a016a015352ff70088d4c240c518b40049090e8befeffff8b4424088b4d008d49dc3b4d087303ff5520894d00c741fc080000008b501c89511c8b58188959188b70148971148b7c24108979108b780c89790c8b78088979088b78048979048b3889396a016a0189e75789cb8b44240c8b542410909090e85afeffff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400cc4757ab25983c41089480859894804c700030000008b4c2408890158894104b801000000c204008b48048b31833e1d756f8b7e048b4f048b098b77088b368b78045352ff7710ff33ff7314ff730451ff7704ff74240c89f389c89090e8b68affff6a016a01508d4c2404518b5c242c8b4424108b54242890e8c2fdffffff742414ff74241cff742408ff742428ff7424308b5c24188b442424bac4bc8db2eb05e920000000909090e8baa1fdff8b4c243083c40889015883c420894104b801000000c204006a016a015352ff71048d7c240c5789f0909090e862fdffff8b4424088b4d008d49dc3b4d087303ff5520894d00c741fc080000008b501c89511c8b58188959188b70148971148b7c24108979108b780c89790c8b78088979088b78048979048b3889396a016a0189e75789cb8b44240c8b542410909090e8fefcffff8b45008d40f43b45087303ff5520894500c740fc02000000c740040100000059890890e82aa3ebff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000008b542410895108894104c701070000008b44241c89085983c414894804b801000000c204008b48046a016a01535250ff7310ff71048d742414568b01e876fcffff8b44240cff7424146a01ff7424188b5c240c8b48048b44241489ca909090ff128b4c242083c40489015883c414894104b801000000c204008b48046a016a015352ff7104ff7110ff7108ff71148d742418568b01909090e81afcffff6a016a018b44241889e1518b5c24108b4808b8107a7db289ca90ff128b44241cff7008ff30ff7004ff7424048b5c24108b442434909090e82ee4feffff7004ff30ff742408ff742410ff7424188b5c24208b442428bad4408fb290e86ae7feff83f80175058b0424eb0a89c38b0424e85a1400008b4c243083c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a145f83c418897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a01508d4424045089d38b4424108b54241c90e83efbffff6a016a018b44242089e1518b5c24208b4808b8107a7db289ca90ff128b442424ff7008ff30ff7004ff7424048b5c24108b44243c909090e852e3feffff7004ff30ff742408ff742410ff7424188b5c24208b442438bad4408fb290e88ee6feff83f80175058b0424eb0a89c38b0424e8d61300008b4c243883c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a145f83c414897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a01508d4424045089d38b4424248b54242890e862faffff837c240c0175068b442410eb2c8b45008d40f03b45087303ff5520894500c740fc030000008b4c24108948088b4c240c894804c70015000000833c240175068b4c2404eb2b8b4d008d49f03b4d087303ff5520894d00c741fc030000008b5424048951088b1424895104c701150000008b55008d52ec3b55087303ff5520895500c742fc04000000894a0c89420883c42c58894204c702030000008b442408891059894804b801000000c204008b4c2404894c24048b4008e9a5f9ffff6a016a016a0189e151ff720853528b5b108b40049090e8ee120000833c240175068b442404eb2b8b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c700150000008b4c241083c408890158894104b801000000c204008b48048b098b75008d76f43b75087303ff5520897500c746fc02000000c706b47190b28b7b14897e048066ffbf6a016a01535250ff7310ff700c8d5424145289f389c8e84ee3eaff8b442418909090e86a85ebff909090e84a1600008b4c240c50ff7424148b5c24088b4424108b51109090ff128b4c242083c40489015883c414894104b801000000c204006a016a01535250ff7310ff70088d4c2414518b480489c8e896f8ffff8b44240c68b4047db26a03ff7424188b5c240c8b48048b44241489ca9090ff128b4d008d49f03b4d087303ff5520894d00c741fc030000008941088b44241483c404894104c7010b0000008b44241c89085983c414894804b801000000c204008b48048b51048b12f642040175668b71088b36ff710cff33ff731452681c7390b2ff7310ff7314ff7304ff74240489f389d090e8d684ffffb8010000009090e8fa85ebffff7424048d4c2410518b5c2408bab8e37bb290e87a86ebff8b4c242483c40889015883c414894104b801000000c20400837a0401752cff7310ff73146a01ff33ff710c8b5b0489d0909090e89e02feff8b4c2408890158894104b801000000c204008b71088b3652ff7310ff710cff33ff7314ff7304ff74240489f389d090e84684ffffff74240450ff742410ff7424188b5c24108b442424bab8bc8db290e8da5efdff8b4c241c83c41089015883c404894104b801000000c20400f6400c01751b8b480c8379040175128b318b7c2404897c24048b460ce915f7ffff8b48088b09be010000008b780cf7c701000000751ff7c601000000740583c6027105ff5538ebf68b7f043b650c7303ff5524ebd96a016a01ff73108d7c2404575253ff7308ff730451568b580cb8e07390b2e806160000837c24040175068b442408eb2c8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c2404894804c700150000008b4c241089015883c408894104b801000000c204008b48048b0983390b750ff641040175098b7104837e040174108b700c8b7808b8987890b28b5d04ff138b7d008d7ff43b7d087303ff5520897d00c747fc02000000c7470401000000890f53528b55008d52f43b55087303ff5520895500c742fc02000000897a048b368932ff731051ff700cff33ff7304ff7314ff7008bb0300000089d090e86e53f8ff89c389d8909090e8b6d2f9ff8b4d008d49d03b4d087303ff5520894d00c741fc03000000c7410803000000894104c701010000008d4110c740fc03000000894808895804c700070000008d4810c741fc030000008b542414895108894104c70105000000ff74242051ff74240cff742414ff74241cff742424528b5c24388b44241c90e8fe1800008b4c242883c41889015883c408894104b801000000c204008b48048b09ff700c50ff3368a87b90b2ff7310518d4c2408518b58088b481089c89090e8eaa5ffff83f801751d8b4424189090c700c4757ab28b0c24894804b80100000083c414c204008b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000008b00894104c701050000008b44241889088b0c24894804b80100000083c414c204008b48048b75008d76ec3b75087303ff5520897500c746fc04000000c706ec7b90b28b7a08897e048956088b0189460c8066ffbf6a016a0153568d5c240853bb010000008b41048b720c89f2ff126a016a018b442408b901000000a801740e89c2b8a48090b28b5d049090ff1383780401755a8b10833a05740bb8d08090b28b5d0490ff13bb01000000f6c101752e8b75008d76f43b75087303ff5520897500c746fc02000000895e048b19891e89f38b49043b650c7303ff5524ebcd89d989e3890b89e18b5a04895904eb318b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524e95dffffff833c240175068b4c2404eb2b8b4d008d49f03b4d087303ff5520894d00c741fc030000008b7424048971088b3424897104c701150000008b74241483c40c890e59894e04b801000000c204006a016a015352ff70088d4c240c518b40049090e85af3ffff8b4424088b4d008d49dc3b4d087303ff5520894d00c741fc080000008b501c89511c8b58188959188b70148971148b7c24108979108b780c89790c8b78088979088b78048979048b3889396a016a0189e75789cb8b44240c8b542410909090e8f6f2ffff8b45008d40ec3b45087303ff5520894500c740fc040000005983c41089480cc74008f0707ab259894804c700030000008b4c2408890158894104b801000000c204008b4c2404894c24048b4004e9a4f2ffff6a016a0152ff7008ff7304ff73088d4c2410518b4004909090e886f2ffff6a016a018b44241883380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c701fc8090b28941048061ffbf89e0c7000100000089e0894804eb72b8030000008b542408ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c7011c8190b28941048b54240c8951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74241889730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b44240c8b542404ff128338057511506a01bb010000009090e85a87ebffeb3289c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400801000000894804c7000d000000518b0c248339057512506a01bb0300000089c890e80e87ebffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000528b4c24048339057511506a01bb0500000089c8e8c286ebffeb3289c28b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400805000000894804c7000d000000528b4c241c813948c052087445f6010175308b31bf48c052088b510c8b5904ff7110ff7108ff31b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017420eb36ff7110ff7108ff318b510c8b5904eb26ff7110ff7108ff318b510c8b5904837c2404017511837c240801750ab9c4757ab283c40ceb508b4d008d49d83b4d087303ff5520894d00c741fc0500000089511089590c8b5424088951088b5424048951048b1424891189ca8d4918c741fc03000000c7410801000000895104c7010500000083c40c8b55008d52dc3b55087303ff5520895500c742fc02000000c7420401000000890a8d4a0cc741fc0200000089510489018d410cc740fc020000008948045989088b4d008d49f43b4d087303ff5520894d00c741fc020000008941045883c40489018b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c7001d000000f6c101751d8b11833a05750f8b510489d13b650c7303ff5524ebe5b901000000eb05b90300000083f9017408909090e8b6b3ebff833c2401742989c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c700150000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701170000008b44242483c41c890859894804b801000000c204008b480c83390775218b490883390175058b4908eb0f8b49048b093b650c7303ff5524ebe783f102eb1983390d750f8b49048b093b650c7303ff5524ebc6b90100000083f901742aff7310ff7004ff730cff7008ff7314ff700c50ff701068d0f98fb28b03bb0300000090e8be5cf9ffeb1a8b48048b50088b700cb801000000ff731051ff730c52ff7314568b042483380b75288b400c8b40088b4804833905740db88c6c8fb28b5d04909090ff138b41083b650c7303ff5524ebd383380d750f8b40048b003b650c7303ff5524ebbf833807740e89c1b8f8f98fb28b5d049090ff13b9010000008b4004a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089ca83fa037507b8cc707ab2eb408b1c248b442410909090e8fe92ffff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c74004cc707ab2c7000d0000008b4d008d49f43b4d087303ff5520894d00c741fc02000000c701b08190b283c4045a8951048061ffbf6a016a01508d5424045289cb8b44241090e8aad7eaff8b442408909090e8c679ebff909090e8a21a000083f8017571bb470000008b44241090e87aa3e9ff8b5c2414909090e86ea3e9ff81f848c052087424a801752589c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017505b88cc77ab289c3b801000000909090e89a88fdff5053bb188390b2b803000000909090e88ecfeaffeb05e96d0000008b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4048941048b042489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000eb7250bb470000008b44241490e896a2e9ff8b5c2418909090e88aa2e9ff81f848c052087424a801752589c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017505b88cc77ab289c3b801000000909090e8b687fdff5053bb448390b2b803000000909090e8aaceeaffeb05e9760100008b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4048941048b44240489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000b9010000005af6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf5051bb470000008b4424189090e88aa1e9ff8b5c241c909090e87ea1e9ffbb48778eb29090e872a1e9ff81f848c052087424a801752589c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017505b88cc77ab289c3b801000000909090e89e86fdff5053bb708390b28b442408e896cdeaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4088941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4c242083c418890158894104b801000000c20400f640040175138b480483790401750ab89c8390b28b5d04ff13ff73105389d38b4004909090e8ca1800008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e836aeebffeb0289c88b4c2408890158894104b801000000c204008b442404c700c4757ab28b5b10895804b801000000c204006a016a015352ff7310ff7004ff70108d4c2414518b40089090e882e9ffff6a016a018b44241489e1518b5c24108b4808b8107a7db289ca90ff128b442418ff7008ff30ff7004ff7424048b5c24108b442430909090e896d1feffff7004ff30ff742408ff742410ff7424188b5c24208b442428bad4408fb290e8d2d4feff83f80175058b0424eb0a89c38b0424e8361800008b4c242c83c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a145f83c418897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a01508d4424045089d38b4424108b54241890e8a6e8ffff833c240175068b442404eb2b8b45008d40f03b45087303ff5520894500c740fc030000008b4c24048948088b0c24894804c700150000008b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000c7400401000000890889c3b80100000083c4109090e8aa1700008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7011300000083fb01742689c88b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895904c701150000008b45008d40ec3b45087303ff5520894500c740fc04000000c7400cc4757ab28948088b4c240c894804c7000300000050b8010000009090e8a21700008b4d008d49f03b4d087303ff5520894d00c741fc0300000089410858894104c701010000008b44241889085983c410894804b801000000c20400000000009c180000|@17100,2097151,@4096|15,0,$17034+26 280,0,@5348 291,0,0 449,0,@5348 466,0,1 481,0,0 542,1,@16781 603,0,@15828 618,1,@15974 639,0,0 797,0,0 806,1,@6881 837,0,1 853,0,3 871,0,0 955,0,0 1017,0,@8006 1054,1,@16563 1084,0,@16565 1090,1,@16567 1110,1,@17035 1237,0,@8006 1274,1,@16563 1304,0,@16565 1310,1,@16567 1330,1,@17036 1491,0,10 1546,0,10 1589,0,1 1604,0,0 1650,1,@17037 1705,0,10 1723,0,0 1761,0,@17044 1798,1,@6564 1810,1,@6830 1818,1,@17045 1863,0,0 1903,0,@7817 1969,0,5 1987,0,0 2023,0,@17046 2046,1,@16781 2051,0,0 2058,1,@6834 2076,0,@6835 2082,1,@6837 2103,0,0 2138,1,@16135 2153,0,0 2190,1,@16781 2216,0,@15827 2222,1,@15829 2243,0,0 2289,0,0 2361,0,@17048 2366,1,@17054 2423,0,10 2441,0,0 2480,0,@17061 2516,0,0 2574,0,1 2582,1,@13429 2594,1,@14089 2625,0,1 2634,0,0 2656,0,3 2682,0,2 2718,1,@17064 2739,0,0 2758,0,@17068 2782,1,@16904 2799,0,@5348 2810,0,0 2847,0,0 2858,0,2 2875,0,0 2914,0,@17069 2948,0,0 2971,0,0 2982,0,@17079 3007,0,@17081 3018,0,0 3189,0,10 3207,0,0 3372,0,@5281 3382,0,1 3397,0,0 3489,0,@17083 3504,0,0 3516,0,1 3552,0,@17084 3607,0,0 3613,0,1 3637,0,0 3671,0,0 3678,1,@6843 3713,0,0 3720,0,0 3729,0,6 3746,0,1 3754,1,@6843 3789,0,0 3796,0,1 3805,0,6 3823,0,2 3830,1,@6843 3865,0,0 3872,0,2 3881,0,6 3892,0,I48 3906,0,I48 3925,0,4 3996,0,@5348 4069,0,0 4078,0,2 4112,0,0 4209,0,0 4218,0,14 4250,0,0 4257,0,1 4270,1,@6933 4317,0,10 4350,0,11 4368,0,0 4437,0,0 4469,0,@16821 4476,0,1 4482,1,@13829 4498,0,0 4537,0,@16617 4590,0,@16822 4602,0,0 4649,0,@5278 4666,1,@16827 4699,0,0 4709,0,@5278 4715,0,6 4745,0,@17085 4778,1,@6564 4790,1,@6830 4798,1,@17086 4808,0,35 4818,1,@4940 4830,1,@4940 4836,0,I48 4849,0,I48 4854,0,4 4879,0,@6130 4886,0,0 4894,1,@15942 4901,0,@17087 4906,0,1 4914,1,@6547 4952,0,1 4959,0,0 4966,0,0 4983,0,0 5028,0,7 5036,0,35 5046,1,@4940 5058,1,@4940 5064,0,I48 5077,0,I48 5082,0,4 5107,0,@6130 5114,0,0 5122,1,@15942 5129,0,@17089 5134,0,1 5142,1,@6547 5180,0,1 5187,0,0 5194,0,0 5211,0,0 5257,0,7 5262,0,0 5303,0,35 5314,1,@4940 5326,1,@4940 5331,0,@16185 5338,1,@4940 5344,0,I48 5357,0,I48 5362,0,4 5387,0,@6130 5394,0,0 5402,1,@15942 5409,0,@17091 5418,1,@6547 5449,0,1 5456,0,0 5463,0,0 5480,0,0 5523,0,7 5541,0,0 5564,0,@17093 5586,1,@17096 5617,0,0 5626,0,14 5657,0,0 5664,0,1 5678,1,@6933 5697,0,0 5710,0,@5348 5721,0,0 5777,0,@8006 5814,1,@16563 5844,0,@16565 5850,1,@16567 5870,1,@17097 6029,0,10 6062,0,2 6079,0,0 6088,0,0 6098,1,@17098 6131,0,9 6174,0,10 6205,0,@5348 6221,0,1 6227,0,0 6234,1,@17099 6271,0,0 6289,0,0 17035:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4061| 17036:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4062| 17037:D3,452|3b650c7303ff5524a801740d89c1b8807090b28b5d0490ff138b086a016a01ff7004ff31ff7104538d542410528b5c240cb8107a7db28b5424289090ff128b442420ff7008ff30ff7004ff7424048b5c24208b442410909090e88ecefeffff7004ff30ff742408ff742410ff7424188b5c24308b442424bad4408fb290e8cad1feff83f80175058b0424eb0a89c38b0424e88e0100008b4c243483c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a145f83c414897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a01508d4424045089d38b4424108b542424ff12837c24100175228b44242c8b0c2489088b4c24048948048b4c2408894808b80100000083c41cc210006a016a016a0189e050ff742438ff742438ff7424388b5c24248b44242c90e8bafeffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c2410894804c700050000008b4d008d49f43b4d087303ff5520894d00c741fc020000005a895104890183f90175068b442408eb0e89cb8b442408909090e8da0000008b4c243489015889410458894108b80100000083c41cc210009000000000c0010000|@17043,1048575,@4065|15,0,@17038 50,0,@8006 90,1,@16563 120,0,@16565 126,1,@16567 146,1,@17041 281,0,0 359,0,2 414,1,@17042 433,0,0 17038:O4|@4608,@5398,@17040,@17039 17039:O5|@16313,697,0,697,0 17040:S22|4578705365713a20656d7074792073657175656e6365 17041:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4063| 17042:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4064| 17043:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f64654c697374283229 17044:D3,228|8b5204f6c201756b8b0a8b590c833b0375668b7304f7c60100000075368b0e8b198b3b3b38751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901750d8b52043b650c7303ff5524eb998b098b118b5d00eb0ae95c000000e9450000008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b3a897b04c7030d000000508b45008d40f83b45087303ff5520894500c740fc01000000891883c404c38b720489f23b650c7303ff5524e92fffffff89c1b801000000c300000000e0000000|@16605,63,@4066|84,0,0 159,0,6 215,0,0 17045:D3,92|3b650c7303ff5524a80175418b088b510483e20983fa01742a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,7,@4067|78,0,0 17046:D3,120|3b650c7303ff5524ff72086a01ff720cff721089c38b4204bab8bc8db2e89249fdff8338057516b9010000008b1424890c24bb0300000052e9a777ebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000c3900000000074000000|@17047,2097151,@4068|25,0,@15827 30,1,@15829 40,0,0 51,0,1 57,1,@6843 90,0,0 97,0,1 106,0,6 17047:S47|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229676574436f6e737472283129 17048:O1|@17049 17049:D3,24|b8147490b28b5d04909090ff139090900000000014000000|@17053,1,@4069|1,0,@17050 17050:O4|@4608,@5398,@17052,@17051 17051:O5|@16313,593,0,593,0 17052:S17|6d697373696e6720696e207265636f7264 17053:S38|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229283129 17054:D3,556|3b650c7303ff5524f6c30175628b0b6a016a01ff730450ff318d54240c528b5c242c8b410c8b542430909090ff126a016a018b44241483380575398b4d008d49f43b4d087303ff5520894d00c741fc02000000c701cc7690b28941048061ffbf89e0c7000100000089e0894804eb70e92e010000b8030000008b54242c909090ff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c701ec7690b28941048b5424288951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74241489730c894308c7430401000000c70303000000eb05e91c0000008d4314c740fc02000000c7400401000000891889e3890389e08948048b5c24248b44240890e8e684ffff8b4d008d49e83b4d087303ff5520894d00c741fc05000000c701807790b28b5424048951048b5424288951088b5c240c89590c8941108061ffbf6a016a0189e050ff742440ff742440ff74244052ff742440ff7424408b5c243489c8909090e88efeffff833c240175068b442408eb0c8b1c248b442408e8f20100008b4c244083c40489015883c41c894104b801000000c21c0089c38b44240490e8cec1eaff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b89c89090e816a3ebffeb0289c88b4c241cc70101000000894104b801000000c21c00900000000028020000|@17060,1048575,@4074|85,0,@17055 100,0,0 117,0,1 156,0,@17056 211,0,0 217,0,1 241,0,0 266,1,@16827 296,0,@17057 390,1,@17059 411,0,0 426,1,@6547 457,0,0 466,0,14 497,0,0 504,0,1 518,1,@6933 532,0,0 540,0,0 17055:D3,12|8b4204c30000000008000000|@15801,5,@4070| 17056:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@4071|65,0,0 113,0,4 17057:D3,52|3b650c7303ff5524a8017509f64210017503ff55383b4210750a8b42088b4a0489caff228b520cff229090900000000030000000|@17058,1048575,@4072| 17058:S54|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c6973742832296c6f6f6b466e283129 17059:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4073| 17060:S45|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c697374283229 17061:O4|@4608,@5398,@17063,@17062 17062:O5|@16313,632,0,632,0 17063:S22|4c6973743a2062616420656c656d656e742074797065 17064:D3,420|3b650c7303ff5524a80175746a016a0153ff70048d4c2408518b5c24308b008b54240890ff12ff74242cff74242cff74242cff74242cff74242cff74242cff74242c8b5c24208b44241c909090e8aeffffff50ff7424288b5c2430b8d00090b290e8d268ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000eb05e9cf000000c74104010000005a83c40889118b55008d52f43b55087303ff5520895500c742fc02000000894a045983c404890a8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000895104c7011d000000f6c201751d8b1a833b05750f8b5a0489da3b650c7303ff5524ebe5ba01000000eb05ba0300000083fa01740d5089c8909090e8b69febffeb0589c289c8528b4c24148b5424188b5c24108b74240c894c24208954241c5f897c2414895c24108974240c89c3b8d00090b2bac4bc8db25f83c40857e9347ffdffff7424148b5c2408b8e40390b2e8d267ffffff742408ff742410ff74241c689c7a90b29090e8ea68ebffff7424248d4c2404518b5c2428bab8e37bb290e86a69ebff83c410c21c0000000000a0010000|@17067,2097151,@4076|92,0,@16845 98,1,@16781 136,0,0 206,0,0 215,0,14 247,0,0 254,0,1 270,1,@6933 321,0,@16845 326,0,@15828 336,1,@15974 349,0,@16883 354,1,@16781 371,0,@17065 378,1,@6834 396,0,@6835 402,1,@6837 17065:D3,124|3b650c7303ff5524ff72046a01ff7208ff720c89c3b8e40390b2bab8bc8db29090e80e42fdff8338057516b9010000008b1424890c24bb0300000052e92370ebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000c7400803000000894804c7000d000000c3900000000078000000|@17066,2097151,@4075|22,0,@16883 27,0,@15827 34,1,@15829 44,0,0 55,0,1 61,1,@6843 94,0,0 101,0,1 110,0,6 17066:S58|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129676574436f6e737472283129 17067:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129 17068:D3,48|3b650c7303ff55248b4a088b1c24890c24ff720c5089d8bb0300000089c68b420456e9b947f9ff90000000002c000000|@17053,2097151,@4077|24,0,1 35,1,@13829 17069:D3,48|3b650c7303ff55248b4a048b1c24890c24ff7208ff720c89de8b58048b3889f856e91e0000009090000000002c000000|@17078,1048575,@4084|34,1,@17070 17070:D3,112|3b650c7303ff55246a016a01508d4c240451ff74241c53ff7424208b5b108b442420909090e85a000000837c24040175058b0424eb0c8b5c24048b0424e86203000089c18b45008d40f43b45087303ff5520894500c740fc0200000083c4085a8950048908c20c00000000006c000000|@17077,1048575,@4083|38,1,@17071 62,1,@17076 17071:D3,448|8d7c24ac3b7d0c7303ff5528a80175718b086a016a01ff7004ff31ff7104538d542410528b5c240cb8107a7db28b542428909090ff128b442420ff7008ff30ff7004ff7424048b5c24208b442410909090e88ac0feffff7004ff30ff742408ff742410ff7424188b5c24308b442424bad4408fb290e8c6c3feff83f801750ceb05e91c0100008b0424eb0b89c38b042490e83e0100008b4c243483c4048b55008d52dc3b55087303ff5520895500c742fc080000008b591c895a1c8b71188972188b7914897a148b3c24897a108b790c897a0c8b7908897a088b7904897a048b39893a6a016a01508d4424045089d38b4424288b54243c90ff128b45008d40f43b45087303ff5520894500c740fc020000008b4c2404894804c700050000006a016a01508d4c240451ff742450ff742450ff7424508b5c24288b442444e8befeffff8b45008d40f43b45087303ff5520894500c740fc02000000c7400401000000598908833c240174088b1c24e8ba00000083f80175068b442408eb0d89c38b4424089090e8fa0000008b4c244c83c40489015883c434894104b801000000c210008b442410c70001000000895804b801000000c210009000000000bc010000|@17075,1048575,@4081|41,0,@8006 82,1,@16563 112,0,@16565 118,1,@16567 146,1,@17072 283,0,2 349,0,0 366,1,@17073 390,1,@17074 411,0,0 424,0,0 432,0,0 17072:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4078| 17073:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4079| 17074:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4080| 17075:S60|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229636f64654c697374283229 17076:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4082| 17077:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229 17078:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283129 17079:O4|@4608,@5398,@8521,@17080 17080:O5|@6847,357,0,357,0 17081:O4|@4608,@5398,@8524,@17082 17082:O5|@6847,359,0,359,0 17083:D3,12|8b4204c30000000008000000|@15801,5,@4085| 17084:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@4086|65,0,0 113,0,4 17085:D3,228|8b5204f6c201756b8b0a8b590c833b0375668b7304f7c60100000075368b0e8b198b3b3b38751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901750d8b52043b650c7303ff5524eb998b098b118b5d00eb0ae95c000000e9450000008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b3a897b04c7030d000000508b45008d40f83b45087303ff5520894500c740fc01000000891883c404c38b720489f23b650c7303ff5524e92fffffff89c1b801000000c300000000e0000000|@16605,63,@4087|84,0,0 159,0,6 215,0,0 17086:D3,92|3b650c7303ff5524a80175418b088b510483e20983fa01742a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,7,@4088|78,0,0 17087:O1|@17088 17088:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4089|1,0,@5280 17089:O1|@17090 17090:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4090|1,0,@5280 17091:O1|@17092 17092:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4091|1,0,@5280 17093:O4|@4608,@5398,@17095,@17094 17094:O5|@16313,557,0,557,0 17095:S20|636f646567656e3a20556e617279207475706c65 17096:D3,116|3b650c7303ff5524a80175576a016a0153ff70048d4c2408518b5c24188b008b54240890ff12ff7424148b5c24088b442404909090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4085983c4048908c20400b801000000c20400900000000070000000|@6329,1048575,@4092|100,0,0 17097:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4093| 17098:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@4094|39,0,1 92,0,0 17099:D3,136|3b650c7303ff5524a801756b8b088b55008d52e43b55087303ff5520895500c742fc030000008b5904895a088b31897204c702010000008d7a10c747fc02000000c74704030000008917578b500489d090e8aaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000084000000|@6329,63,@4095|51,0,0 68,0,1 120,0,0 17100:S35|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229 17101:D3,3008|8dbc2468ffffff3b7d0c7303ff55288b4c240489c6833e2d750d8b76043b650c7303ff5524ebee833e1775058b7608eb21833e0b740f89c7b8e09190b28b5d04909090ff138b76083b650c7303ff5524ebc36a016a016a01f64424140174338b7904ff710cff7104ff71088d4c240c8b3f89398b4c24048d7c240c538b5904895f048b7c24088d4c24108b7f08897908eb6b8b7904ff710cff7104ff71088b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000538b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703409290b2894b04568b77048973088063ffbf8b37f7c601000000740583c602710cff5538eb05e918000000ebef8d7c241489378d742414895e048d5c2414894b08eb01568b4d008d49ec3b4d087303ff5520894d00c741fc01000040c701030000008d5908c743fc02000000c703709390b2894b048063ffbff6042401740f89c6b8e89390b28b5d04909090ff138b34248b3e518b4f088b098b3e538b5f0c8b1b8b36535150528b4604e8feddfeffb901000000a801751cf6c101740583c1027105ff5538ebf68b40043b650c7303ff5524ebe089c883f8037470f644244001746e50bb510000008b44242c9090e8be83e9ff50bb030000008b442404bafc317ab2e83aaae9ff89c358e8a283e9ffbb530000009090e89683e9ff8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c702489490b2eb0ae932060000e92d060000894a048b5c2434895a088062ffbf8b5c2430f6c301740583c3027105ff5538ebf68b75008d76f03b75087303ff5520897500c746fc03000000894e08895604891e833c240374688b1424f6c201740783fa017e08eb13f642ff10740d89c3b84c748fb28b5d0490ff13505156bb789590b289d09090e856afeaff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a80175248b10833a057516eb05e9300000008b500489d03b650c7303ff5524ebdfb801000000eb05b80300000083f801740c89c8909090e89690ebffeb0e89c8eb0a89c2b8cc707ab25251568b4c244c8b542410ff711cff7114ff742410ff74242cff742410ff3150ff742444ff742434ff720468f09590b250ff742448ff742450ff742464ff7110ff742440ff31ff7424688b5c24548d442420ba18868fb2909090e8befcfeff83c430598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e87672ebff8b4c241c8b098b54241c8b128b74241c8916813c2448c05208742df604240175308b3424bf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901740689d1eb0989cab98cc77ab2eb0589ca8b0c2489d689cf90e89672ebff56505753bbac9690b28b4424149090e8c2adeaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b54240c895118c74114030000008941108b44240889410cc74108010000008b4424048941045883c41089018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000050b8030000008b542428ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c701030000008b55008d52ec3b55087303ff5520895500c742fc02000000c7420401000000890a8b4c24288d5a0cc743fc01000040c703010000008b31f7c601000000740583c6027105ff5538ebf6f7c6010000007409f6010174042b317105ff5538ebf783c601f7c601000000740783fe017c08eb12f646ff10740c89c7b840f77bb28b5d04ff13f7c601000000740783fe017e52eb06f646ff10754af7c601000000740583ee027105ff5538ebf689c78b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000897004893852538b510490ff128b1c24e8ce6bebffeb42a801740783f8017c08eb12f640ff10740c89c1b8bcf97bb28b5d04ff1389c18b45008d40f43b45087303ff5520894500c740fc02000000894804c7000500000052538b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010900000051bbd89690b28b44240ce8caabeaffa801754c8378040175468b4d008d49f43b4d087303ff5520894d00c741fc020000008b00894104c701cc707ab28b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908eb40b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf50bb389790b289c8909090e842abeaff5b9090e8121bebff909090e8ba0a0000909090e8ba6eebff8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c030000005a895108894104c7010700000051bb00ba8fb28b44243890e87a7ee9ff8b4c24048b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8de6eebff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e85663fdff5053bbf09790b2b803000000909090e84aaaeaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc74108010000005883c4048941045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000833c2401750683c440c2080089c18b45008d40f03b45087303ff5520894500c740fc030000008948088b0c24894804c7001500000083c440c20800bb00ba8fb28b442428909090e81e7de9ff8b4d008d49e83b4d087303ff5520894d00c741fc01000040c701010000008d5108c742fc03000000c7021c9890b2894a048b5c2430895a088062ffbf8b5c242cf6c301740583c3027105ff5538ebf68b75008d76f03b75087303ff5520897500c746fc03000000894e08895604891e8b54243c8b1c24ff721cff721450ff74241c56ff32ff742430ff742420ff7304684c9990b2505168cc707ab2ff74243cff742444ff742458ff721056ff32ff74245c89c38d442428ba18868fb2909090e806f7feff598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8c26cebff8b4c24408b098b5424408b128b7424408916813c2448c052087438f604240175258b3424bf48c0520889cab909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750aeb0489caeb0489d1eb058b0c24eb0789cab98cc77ab289d689cf90e8de6cebff56505753bbd49990b2b80300000090e80aa8eaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b54240c895118c74114030000008941108b44240889410cc74108010000008b4424048941045883c40c89018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000f644246c01740683c464c20800b9010000008b54246cf6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf5051bb48778eb28b44240890e8e27ae9ff8b4c24688b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e8466bebff81fb48c052087425f6c301752789debf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb0289d989cb909090e8866bebff5053bb009a90b28b442408e8b6a6eaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941108b44240489410cc74108010000005883c4088941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000083c464c2080090909000000000bc0b0000|@17132,2097151,@4111|57,0,@17102 184,0,0 215,0,@17105 309,0,1 325,0,@17106 345,0,@17108 386,1,@16613 391,0,0 443,0,40 454,1,@4940 460,0,1 469,0,@5052 474,1,@5053 482,1,@4940 487,0,41 494,1,@4940 524,0,0 540,0,@17111 651,0,@16641 665,0,@17112 674,1,@6547 705,0,0 714,0,14 752,0,0 759,0,1 774,1,@6933 787,0,@5278 835,0,@17114 874,0,@16673 882,1,@16675 893,0,0 962,1,@6883 987,0,I48 1003,0,I48 1010,0,4 1041,0,@6130 1058,1,@6884 1067,0,@17116 1078,1,@6547 1109,0,1 1123,0,1 1140,0,0 1186,0,7 1192,0,1 1236,0,0 1242,0,1 1273,0,0 1295,0,0 1368,0,@6871 1445,0,0 1466,1,@6874 1492,0,@6876 1532,0,2 1567,0,4 1573,0,@17118 1582,1,@6547 1627,0,@5278 1658,0,0 1667,0,0 1708,0,@17121 1718,1,@6547 1726,1,@6721 1734,1,@17123 1742,1,@6881 1773,0,1 1786,0,3 1792,0,@16730 1802,1,@4940 1813,0,0 1882,1,@6883 1888,0,I48 1902,0,I48 1907,0,4 1932,0,@6130 1946,1,@15942 1953,0,@17124 1958,0,1 1966,1,@6547 1997,0,1 2004,0,0 2011,0,0 2028,0,0 2074,0,7 2127,0,10 2138,0,@16730 2150,1,@4940 2180,0,0 2196,0,@17126 2298,0,@17127 2305,0,@5278 2338,0,@16673 2346,1,@16675 2354,0,0 2422,1,@6883 2447,0,I48 2463,0,I48 2470,0,4 2512,0,@6130 2522,1,@6884 2531,0,@17128 2536,0,1 2542,1,@6547 2573,0,1 2587,0,1 2604,0,0 2650,0,7 2668,0,0 2712,0,@16185 2722,1,@4940 2733,0,0 2802,1,@6883 2808,0,I48 2822,0,I48 2827,0,4 2852,0,@6130 2866,1,@6884 2873,0,@17130 2882,1,@6547 2913,0,1 2920,0,0 2927,0,1 2944,0,0 2987,0,7 17102:O4|@4608,@5398,@17104,@17103 17103:O5|@16313,798,0,798,0 17104:S42|676574466e426f64793a206e6f74206120636f6e73747261696e656420666e2d65787072657373696f6e 17105:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9cc64ebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4097|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17106:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@17107,15,@4098| 17107:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429666e4d6b41646472283129 17108:O4|@4608,@5398,@17110,@17109 17109:O5|@16313,814,0,814,0 17110:S43|636f64654c616d6264613a20626f6479206f6620666e206973206e6f74206120636c61757365206c697374 17111:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9c462ebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4099|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17112:O1|@17113 17113:D3,92|a801740783f8017c08eb12f640ff10740c89c1b8a4727db28b5d04ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701010000008d410cc740fc02000000894804c70009000000c390900000000058000000|@16645,3,@4100|20,0,@7993 58,0,0 77,0,4 17114:D3,116|3b650c7303ff55248b4d008d49dc3b4d087303ff5520894d00c741fc080000008b5a2889591cc74118010000008b72248971148941108b422089410c8b7a1c8979088b7a188979048b7a1489398b7a108b0424893c246a01518b5a0c89c18b42088b720489f251ff229090900000000070000000|@17115,1048575,@4101|41,0,0 17115:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429636f6465416c7473283129 17116:O1|@17117 17117:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4102|1,0,@5280 17118:O1|@17119 17119:D3,16|b803000000c39090000000000c000000|@17120,1,@4103|1,0,1 17120:S44|434f444547454e5f50415253455452454528292e636f64654c616d62646128342972657350726f632d283129 17121:O1|@17122 17122:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c74004cc707ab2c7000d000000c390900000000038000000|@16733,3,@4104|29,0,0 39,0,@5278 45,0,6 17123:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@4105|60,0,0 17124:O1|@17125 17125:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4106|1,0,@5280 17126:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9f05eebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4107|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17127:D3,116|3b650c7303ff55248b4d008d49dc3b4d087303ff5520894d00c741fc080000008b5a2489591cc74118010000008b72208971148941108b421c89410c8b7a188979088b7a148979048b7a108939bfcc707ab28b0424893c246a01518b5a0c89c18b42088b720489f251ff22900000000070000000|@17115,1048575,@4108|41,0,0 78,0,@5278 17128:O1|@17129 17129:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4109|1,0,@5280 17130:O1|@17131 17131:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4110|1,0,@5280 17132:S33|434f444547454e5f50415253455452454528292e636f64654c616d626461283429 17133:D3,108|3b650c7303ff55248b4c2404be01000000ff7118ff7114ff710cff315352a80175398b0c24ff7004ff742414ff742424ff742418ff7104ff74241cff74242cff74242089f38b009090e83200000089c6583b650c7303ff5524ebc389f083c418c20400900000000068000000|@17191,2097151,@4143|13,0,0 74,1,@17134 17134:D3,2312|8dbc2470ffffff3b7d0c7303ff55288b480c8b0983f901745889ce8b38ff7008ff700489f0e8f2080000a80175488378040175048b00eb34ff308b4004e83a09000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908535657e81e76e9ffeb26535657eb21e90a000000b848c05208535657eb128b108b70088b7804b8bf0000005657535152508b5c24348b4424089090e85209000089c1ba01000000f6c101752d83fa0175048b11eb1589c68b790489d38b0190e8ca0b000089c289f0eb038b790489f93b650c7303ff5524ebce89d1ba0100000089cbf6c301751cf6c201740583c2027105ff5538ebf68b5b043b650c7303ff5524ebdf6a016a016a016a016a016a016a0183fa01754c8b5c244c89e68b3b893e89e68b7b04897e048b74244c89e38b76088973088b5c244c89e68b7b10897e0c89e68b7b14897e108b74244c89e38b76188973148b5c244c89e68b7b1c897e18eb758b5d008d5bec3b5d087303ff5520895d00c743fc01000040c703030000008d7308c746fc02000000c706c0a790b2895e048066ffbf8b5c244c8b7b048b5d008d5bf83b5d087303ff5520895d00c743fc01000040c70301000000518b4d008d49f03b4d087303ff5520894d00c741fc03000000eb05e90d010000c70178a890b2895904508b47048941088061ffbf8b07a801740583c0027105ff5538ebf68b7d008d7ff03b7d087303ff5520897d00c747fc03000000895f08894f0489075068a8a990b25256578d5c240c89d0e8fa9aeaff89c38b442418ba74587cb2e862bbebff8b4c24688b55008d52cc3b55087303ff5520895500c742fc02000000894204c702030000008d420cc740fc01000040c700010000008d5808c743fc0400000089530c8b5424048953088b342489730489038d4314c740fc020000008b791489780489188d5c241c8b1189138d5c241c8973048d5c241c83c4045e8973088d5c24148b711089730c8d5c24148943108d442414c74014010000008d4424148b591c895818eb0751506a016a01528b5c24308b44245c909090e8ba6de9ffbb5b0000009090e8ae6de9ff8b4d008d49dc3b4d087303ff5520894d00c741fc080000008b54242c89511c8b5424288951188b5424248951148b5c242089591089410c8b44241c8941088b5c24188959048b74241489316a016a0189e65689cb8b44244c8b5424649090ff126a016a018b44240883380575348b4d008d49f43b4d087303ff5520894d00c741fc02000000c70174ab90b28941048061ffbf89e0c7000100000089e0894804eb72b8030000008b54242cff128b4d008d49f03b4d087303ff5520894d00c741fc03000000c70194ab90b28941048b5424288951088061ffbf8b5d008d5be03b5d087303ff5520895d00c743fc040000008b74240889730c894308c7430401000000c703030000008d4314c740fc02000000eb05e912000000c7400401000000891889e3890389e08948048b45008d40ec3b45087303ff5520894500c740fc040000008b4c243489480c8b54242c8950088b5c24288958048b74246489305089d88b5424089090ff126a016a01ff742460ff74240c8d4c24085189c38b44245ce8be0c0000837c2404017527837c246c017520ff742468ff74246468acb290b2bb010000008b44247c909090e8f223f9ffeb05b8010000008b4424708b4834f6c10175358b11813afce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb017569b97c787cb2f6c10175358b11813afce539b2751c8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb148b510489d13b650c7303ff5524ebc6bb0100000083fb01750cb8287c7cb28b5d049090ff138b0b8139fce539b27412b854eb7ab28b5d04eb05e90b00000090ff13837908017451eb1a8b0b8139fce539b2740ab854eb7ab28b5d04ff13837908017435bb010000008b44245090e86a2cffffa801751bff70048b5c24748b009090e8d623ffff583b650c7303ff5524ebe1b801000000eb05b801000000837c241c01751c833c240175068b44240ceb648b1c248b44240c9090e8fa110000eb598b44247cff7004ff7008b8030000008b14249090ff12f644244801740c89c1b8d0717cb28b5d04ff138b4c24488b098b098b0989c389c89090e802d1ebffb901000000a801753a8b55008d52f43b5508730feb0ae983020000e97e020000ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebc289c8837c24080175068b4c2414eb1889de89c78b5c24088b44241490e8ae11000089c189f889f383f901740b89de89cbe8f211000089f389df508b4424609090e83a1200008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740b5789c890e8b277ebffeb0389c857837c240401742a89c18b45008d40f03b45087303ff5520894500c740fc030000008948088b4c2404894804c700150000008b4c24448b49088b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c89090e8c659ebff5350b8010000008b542450909090ff1289c358e8664efdff5350bbecb490b28b442438e85e95eaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542404895118c74114010000008941105883c40489410cc7410801000000c7410448778eb25889018b45008d40e03b45087303ff5520894500c740fc02000000894804c7000f0000008d480cc741fc0400000089410c8b0424894108c7410401000000c70103000000516a01ff742410ff74241850ff7424508b5c24508b44247c9090e8c611000050ff742414ff74240cff74244c8b5c2420b80100000090e82a1500008b4d008d49dc3b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc020000005a895004890889c18d400cc740fc020000008948045983c410890883f801750a83c4585883c408c21c0089c38b44245883c4645983c41c51e9d219000090900000000004090000|@17190,2097151,@4142|38,1,@17135 62,1,@17136 102,1,@4953 119,0,I48 137,0,95 158,1,@17137 165,0,0 194,1,@17142 222,0,0 382,0,1 398,0,@17143 442,0,0 480,0,@17145 548,0,@17146 562,1,@6547 573,0,@7237 578,1,@7238 615,0,1 631,0,0 731,0,0 766,1,@4940 771,0,45 778,1,@4940 917,0,@17150 932,0,0 944,0,1 980,0,@17151 1035,0,0 1041,0,1 1065,0,0 1166,1,@17152 1193,0,@17165 1198,0,0 1210,1,@13829 1217,0,0 1237,0,@4676 1287,0,0 1297,0,@7313 1310,0,@4676 1360,0,0 1370,0,@7368 1385,0,@4676 1392,0,@6377 1421,0,@4676 1428,0,@6377 1444,0,0 1454,1,@16764 1474,1,@16757 1490,0,0 1497,0,0 1530,1,@17166 1547,0,1 1568,0,@7307 1594,1,@7310 1599,0,0 1694,1,@17167 1714,1,@17168 1730,1,@17169 1761,0,0 1770,0,14 1801,0,0 1808,0,1 1822,1,@6933 1876,0,10 1890,0,0 1958,1,@6883 1965,0,0 1982,1,@15942 1989,0,@17173 1998,1,@6547 2029,0,1 2043,0,0 2060,0,0 2067,0,@16185 2103,0,7 2129,0,0 2135,0,1 2166,1,@17175 2188,0,0 2194,1,@17179 2227,0,2 2298,1,@17189 17135:D3,76|3b650c7303ff5524a801752f8b08ff318b480489c8e8e6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000048000000|@6329,3,@4112|60,0,0 17136:D3,100|3b650c7303ff5524a801754aff308b4004e8eaffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c700f9000000c3b801000000c30000000060000000|@6661,3,@4113|81,0,124 87,0,0 17137:D3,92|3b650c7303ff5524a801754253ff70048b00909090e856000000508b5c24088b4424049090e8d6ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c30000000058000000|@6329,2097151,@4117|22,1,@17138 79,0,0 17138:D3,88|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a8a590b28959048061ffbf6a016a0189e25289cb8b400ce8229aeaff83c40458909090e83e3cebffe915010000900000000054000000|@17141,2097151,@4116|34,0,@17139 58,1,@6564 70,1,@6830 75,1,@17140 17139:D3,228|8b5204f6c201756b8b0a8b590c833b0375668b7304f7c60100000075368b0e8b198b3b3b38751e8b4d008d49f83b4d087303ff5520894d00c741fc010000008b368931eb13ff76045e3b650c7303ff5524ebc2b90100000083f901750d8b52043b650c7303ff5524eb998b098b118b5d00eb0ae95c000000e9450000008d5bf03b5d087303ff5520895d00c743fc030000008b72048973088b3a897b04c7030d000000508b45008d40f83b45087303ff5520894500c740fc01000000891883c404c38b720489f23b650c7303ff5524e92fffffff89c1b801000000c300000000e0000000|@16605,63,@4114|84,0,0 159,0,6 215,0,0 17140:D3,92|3b650c7303ff5524a80175418b088b510483e20983fa01742a518b4004e8deffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b480489c8e9b3ffffffb801000000c3900000000058000000|@5094,7,@4115|78,0,0 17141:S77|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229706f6c7956617273466f7256616c732d283129 17142:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4118| 17143:D3,48|8b4a048b098b5a048b1ba801740cf6c30174078d40ff03c37105ff5538ebf48b5204890289c8c390000000002c000000|@17144,15,@4119| 17144:S106|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d666e4d6b41646472283129 17145:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9944eebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4120|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17146:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c700f4a990b28948048b52048950088060ffbfc390900000000034000000|@17149,7,@4122|28,0,@17147 17147:D3,128|3b650c7303ff55248b08f6c101740bf642080174052b4a087105ff5538ebf683c1018b58048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008948048b5204891089da9090ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@17148,1048575,@4121|64,0,1 113,0,4 17148:S110|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129283129 17149:S107|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129 17150:D3,12|8b4204c30000000008000000|@15801,5,@4123| 17151:D3,128|3b650c7303ff55248b4a088b18f6c3017409f6010174042b197105ff5538ebf783c3018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5a04891889f290ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70009000000c39090000000007c000000|@15803,1048575,@4124|65,0,0 113,0,4 17152:D3,436|3b650c7303ff55246a016a016a01536a03ff742420ff7424208d4c241051bb08d98fb29090e8c62cffff8b45008d40f03b45087303ff5520894500c740fc030000008b4c240c8948088b4c24088948048b4c2404890889c3b803000000e8660100006a016a016a016a016868ae90b26a018d4c24085189d989c389c890e8e266ffff8b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c89086a016a016a016a0189e39090e8be71ffff8b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b5424048950045a83c404891083f9017507b901000000eb60f6c101740f89c2b81c777bb28b5d04909090ff138339017507b903000000eb5af6c101740f89c2b81c777bb28b5d04909090ff138b11f6c201740783fa017e0feb06f642ff107507b901000000eb2bf6c101741489c3b858777bb28b5d04eb05e91500000090ff138b510489d13b650c7303ff5524e97affffff83f10251ff742428ff7424288b5c24149090e8320100008b4c242089015883c418894104b801000000c20c009000000000b0010000|@17164,2097151,@4129|31,0,@16779 38,1,@16780 89,0,1 94,1,@17153 107,0,@17154 126,1,@16937 194,1,@16941 255,0,0 269,0,@6704 287,0,1 301,0,@6704 334,0,0 348,0,@6707 402,1,@17156 420,0,0 17153:D3,100|3b650c7303ff5524a801740783f8037e0eeb06f640ff107506b801000000c389c1f6c101740583c1027105ff5538ebf65089c89090e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000060000000|@16933,3,@4125|26,0,0 17154:O1|@17155 17155:D3,108|8338017507b801000000eb15f60001740c8b08b81c777bb28b5d04ff138b008b008b4d008d49e03b4d087303ff5520894d00c741fc02000000c741040100000089018d410cc740fc04000000c7400c03000000894808c7400401000000c70060877ab2c30000000068000000|@16936,3,@4126|6,0,0 20,0,@6704 60,0,0 79,0,1 89,0,0 95,0,@5515 17156:D3,636|3b650c7303ff55248b088339077506f6410401740c89c1b880b190b28b5d04ff138b51048b328b7c2404ff36ff7008ff7704ff700453b8030000008b57089090ff128b4d008d49ec3b4d087303ff5520894d00c741fc040000005a89510c894108c7410401000000c70103000000a801740783f8017c08eb14f640ff10740e89c2b8a4727db28b5d049090ff138b55008d52e83b55087303ff5520895500c742fc02000000894204c702050000008d5a0cc743fc02000000895304c703090000005af6c20175308b328b7e08833f05740c50b8c03590b28b5d0490ff138b770489068b77088b3c24893e8b52043b650c7303ff5524ebcbba010000008b44240483f8017507b801000000eb65a801740d89c2b81c777bb28b5d0490ff138338017507b803000000eb52a801740c89c2b81c777bb28b5d04ff138b10f6c201740783fa017e0feb06f642ff107507b801000000eb27a801740d89c2b858777bb28b5d0490ff138b500489d03b650c730aeb05e905000000ff5524eb8583f8017507b801000000eb7051536a01ff74241c8b4424189090e80292ffff50ff742420bbe0b190b2b8f0b190b2e88a7fffff8b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410cc74108c4757ab258894104c701030000008b45008d40e83b45087303ff5520894500c740fc02000000894804eb05e91d000000c7000500000089c18d400cc740fc02000000c74004010000008908eb02515350ff7424046a01ff742424bb030000008b4424209090e82686ffff83f80175058b0424eb0a89c38b0424e8c200000089c18b45008d40f43b45087303ff5520894500c740fc0200000089480483c4085983c40c8908c20800900000000078020000|@17163,2097151,@4128|24,0,@17157 55,0,1 100,0,0 106,0,1 130,0,@7993 170,0,2 189,0,4 211,0,@16976 248,0,0 262,0,0 275,0,@6704 291,0,1 304,0,@6704 334,0,0 347,0,@6707 385,0,0 406,1,@17001 416,0,@17160 421,0,@17161 426,1,@16971 460,0,@5348 470,0,1 510,0,2 529,0,0 551,0,1 562,1,@16983 582,1,@17162 17157:O4|@4608,@5398,@17159,@17158 17158:O5|@16803,1124,0,1124,0 17159:S42|636f646542696e64696e673a2073686f756c64206265206e61697665207061747465726e206d61746368 17160:O3|2,100,0 17161:S4|42696e64 17162:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4127| 17163:S31|4d415443485f434f4d50494c455228292e636f646542696e64696e67283429 17164:S38|4d415443485f434f4d50494c455228292e636f646542696e64696e675061747465726e283429 17165:S26|5061747465726e206973206e6f7420657868617573746976652e 17166:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4130| 17167:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4131| 17168:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4132| 17169:D3,196|3b650c7303ff5524a80175738b088b5108833a05740f8b5804b8b0b490b28b5d049090ff138b5a048b1bf6c301740783fb017c08eb13f643ff10740d8b7004b8a4727db28b5d04ff138b75008d76e83b75087303ff5520897500c746fc02000000895e04c706050000008d5e0cc743fc02000000897304c70309000000eb05e92f000000538b700489f0909090e86effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000c0000000|@6329,31,@4133|26,0,@17170 64,0,@7993 102,0,2 121,0,4 180,0,0 17170:O4|@4608,@5398,@17172,@17171 17171:O5|@16313,1641,0,1641,0 17172:S7|6c6f616456616c 17173:O1|@17174 17174:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4134|1,0,@5280 17175:D3,808|3b650c7303ff5524a8017565f6c3017565ff7304ff7004ff33ff30b8030000008b542420ff12598b5108833a05740e89c3b854b890b28b5d049090ff138b5a0489038b72088b7c2418893e833c2401756a5057ff74241cff74241c89fbb801000000909090e8160300008338057519eb0ae9a2020000e99d0200006a018b5c2428e86235ebffeb6989c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b542424895008894804c7000d000000eb75b9010000008b1c24f6c301751cf6c101740583c1027105ff5538ebf68b5b043b650c7303ff5524ebdf8b5d008d5be83b5d08730aeb05e99c010000ff5520895d00c743fc01000040c703010000008d5308c742fc03000000c702ecbb90b2895a048b77048972088062ffbf8b37f7c601000000eb05e95d010000740583c6027105ff5538ebf68b7d008d7ff03b7d087303ff5520897d00c747fc03000000895f088957048937505153ff742424ff742424ff74242489fb8b442418909090e802020000833805750d6a018b5c2430e85a34ebffeb3189c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b54242c895008894804c7000d000000598b09ba01000000f6c10175328b198b75008d76f43b75087303ff5520897500c746fc020000008956048b13891689f28b590489d93b650c7303ff5524ebc989d189c389c8909090e82245ebff909090e8d239fdff5053bb1cbd90b28b442408e8ca80eaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114010000008941108b44240489410cc7410801000000c7410448778eb25883c40889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f0000008b4d008d49ec3b4d087303ff5520894d00c741fc0400000089410c5883c404894108c7410401000000c701030000008b44241ca801740583c0027105ff5538ebf65150ff742420ff742420ff742420ff7424208b5c241c8b442418e80efdffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c21400b801000000c214000000000024030000|@17188,1048575,@4140|28,0,1 50,0,@17176 94,0,0 102,1,@17179 130,1,@6843 165,0,0 181,0,6 188,0,0 261,0,0 277,0,@17185 378,1,@17179 394,1,@6843 429,0,0 445,0,6 453,0,0 522,1,@6883 530,1,@15942 537,0,@17186 546,1,@6547 577,0,1 584,0,0 591,0,0 608,0,0 615,0,@16185 654,0,7 695,0,0 701,0,1 793,0,0 17176:O4|@4608,@5398,@17178,@17177 17177:O5|@16313,1680,0,1680,0 17178:S13|6c6f616446756e6374696f6e73 17179:D3,280|3b650c7303ff5524b90100000089c2f6c201751cf6c101740583c1027105ff5538ebf68b52043b650c7303ff5524ebdf5350bbc4b990b289c8e8327feaff89c358ba74587cb2909090e89a9febff8b0c248b5424108b19f6c3017409f6020174042b1a7105ff5538ebf783c30189c68b45008d40f03b45087303ff5520894500c740fc03000000c74008010000008958048b5c240c8918568b510490ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7010900000051ff7424088b5c24088b44241490e8ea000000909090e82642ebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c030000005a83c408895008894804c70007000000c20c0090900000000014010000|@17184,1048575,@4137|9,0,0 51,0,@17180 58,1,@6547 66,0,@7237 74,1,@7238 138,0,0 187,0,4 206,1,@17183 214,1,@6881 247,0,1 263,0,3 17180:O1|@17181 17181:D3,12|c39090900000000008000000|@17182,1,@4135| 17182:S93|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e2832297661724e6f732d283129 17183:D3,296|3b650c7303ff5524a801756389d9f6c10175378b118b328b388b163b17751e8b7d008d7ff83b7d087303ff5520897d00c747fc010000008b09890feb128b49043b650c7303ff5524ebc4bf0100000083ff017507b9d03e7cb2eb718b3f8b4c24048b11f6c2017410f60101740beb05e9a40000002b117105ff5538ebf783c2018b70048b45008d40f03b45087303ff5520894500c740fc03000000c74008030000008950048b7f04893853568b510490ff128b4d008d49f43b4d087303ff5520894d00c741fc02000000eb05e90b000000894104c70109000000eb0453ff700451ff7424108b5c240c8b442408e80effffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c20400b801000000c204000000000024010000|@6329,1048575,@4136|75,0,0 85,0,@7190 158,0,1 214,0,4 281,0,0 17184:S83|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e283229 17185:D3,284|3b650c7303ff55248b4804f6c101740783f9017c08eb16f641ff1074108b58088b30b840f77bb28b5d0490ff13f6c101740783f9017e55eb06f641ff10754df6c101740583e9027105ff5538ebf68b58088b308b45008d40f03b45087303ff5520894500c740fc030000008958088948048930528b4a0889ca909090ff128b0c248b590483c404e9203bebff8378080174418b10f6c201740783fa017c08eb11f642ff10740bb8bcf97bb28b5d0490ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70001000000c38b10f6c201740783fa017c08eb10f642ff10740ab8bcf97bb28b5d04ff138b45008d40f43b45087303ff5520894500c740fc02000000895004c70005000000c3900000000018010000|@6878,1048575,@4138|35,0,@6871 136,1,@6874 167,0,@6876 206,0,0 232,0,@6876 270,0,2 17186:O1|@17187 17187:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4139|1,0,@5280 17188:S85|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6c6f616446756e6374696f6e73283329 17189:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4141| 17190:S58|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229 17191:S44|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329 17192:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4144| 17193:D3,96|3b650c7303ff55246a016a01ff7008ff700cff7010ff7014ff30ff720c8d4c241851ff72108b5a088b40048b4a0489caff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c3000000005c000000|@17194,1048575,@4145| 17194:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f636573735461696c283129 17195:D3,96|3b650c7303ff55246a016a01ff7008ff700cff7010ff7014ff30ff720c8d4c241851ff72108b5a088b40048b4a0489caff128b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c3000000005c000000|@17196,1048575,@4146| 17196:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f63657373426f6479283129 17197:D3,192|3b650c7303ff5524f6c30175696a016a01ff73048d4c240451ff742428ff742428ff742428ff742428ff742428ff7424288b0b89c389c89090e8960000006a016a0189e050ff742430ff742430ff742430ff742430ff742430ff7424308b5c24248b44242ce896ffffff833c2401750b8b44240ceb14e9270000008b1c248b44240c909090e8d60200008b4c243083c40489015883c40c894104b801000000c21c008b4c241cc70101000000894104b801000000c21c009000000000bc000000|@17203,1048575,@4151|58,1,@17198 134,1,@17202 155,0,0 168,0,0 176,0,0 17198:D3,380|3b650c7303ff55248b480c8b0983f90175138b50088b7004b84cc37bb28b5d04909090ff13ff3153ff70088b58048b442424909090e8464ae9ffbb5d0000009090e83a4ae9ff6a016a01ff74240cff742424ff7424248d4c240c51ff74243489c38b44241c8b54243c909090ff12b8030000008b54242090ff128b4c24108b5104833a05740f89c3b854a48db28b5d04909090ff138b5a0489038b72088b7c241c893e8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104010000008b5c241089195057ff74242cff74242c8b5c242889c890e8aaeefcff8b4d008d49ec3b4d087303ff5520894d00c741fc040000008b54240889510c5a895108c7410401000000c701030000008b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890a83380174128b70048b1889d09090e84e00000089c2eb038b700483fa0175058b0424eb0b89d38b042490e88a0000008b4c243083c4148901897104b801000000c21c0090900000000078010000|@17201,1048575,@4149|25,0,@6769 54,1,@4940 59,0,46 66,1,@4940 111,0,1 137,0,@15795 190,0,0 218,1,@15813 260,0,0 266,0,1 297,0,0 318,1,@17199 346,1,@17200 363,0,0 17199:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4147| 17200:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4148| 17201:S65|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829636f646553747275637475726542696e64283229 17202:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4150| 17203:S43|535452554354555245535f28292e67656e636f6465537472756374732832296d6170506169722833292829 17204:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4152| 17205:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4153| 17206:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4154| 17207:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4155| 17208:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829 17209:D3,144|3b650c7303ff55248b4a0cf6c101740d89c6b8bc7e7ab28b5d0490ff1383f80175078b098b4904eb1ba801740583e8027105ff5538ebf68b49043b650c7303ff5524ebc78b41048338057536ff7204ff720889c8baf8268eb2e8ee60fdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70003000000c38b01c3909090000000008c000000|@16120,2097151,@4157|19,0,@5417 85,0,@16055 90,1,@16056 125,0,1 17210:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4158| 17211:D3,44|3b650c7303ff55248b48088b1424890c24ff700cff70108b58048b0889c852e91c0000000000000028000000|@17226,1048575,@4166|32,1,@17212 17212:D3,504|3b650c7303ff5524837c240801756c817c240c48c052087429f644240c0175298b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb048b4c240c89ce89c78b442408e8b201000050565789d9bb80c990b289c8909090e89a70eaff8b4d008d49dc3b4d08730aeb05e9a3000000ff5520894d00c741fc08000000c7411c030000008b542410895118c74114010000008941108b44240889410cc74108010000008b4424048941045883c40889018b45008d40f03b45087303ff5520894500c740fc03000000c74008acc990b2894804c7000100000089c3b8010000009090e85602000089c18b45008d40f03b45087303ff5520894500c740fc03000000894808c7400401000000c70005000000c20c00817c240c48c052087429f644240c0175298b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb048b4c240c89c689cf8b442408e88e02000056505789d9bb70cb90b289c8909090e8866feaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542410895118c74114010000008941108b44240489410cc74108010000005883c4048941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c20c00909000000000f4010000|@17226,1048575,@4165|19,0,I48 37,0,I48 42,0,4 67,0,@6130 86,1,@17213 96,0,@17214 106,1,@6547 144,0,1 158,0,0 175,0,0 219,0,@17216 228,0,0 235,0,0 242,1,@17222 278,0,0 284,0,2 295,0,I48 313,0,I48 318,0,4 343,0,@6130 362,1,@17223 372,0,@17224 382,1,@6547 413,0,1 427,0,0 444,0,0 487,0,7 17213:D3,96|3b650c7303ff5524a80175438b08833909740e8b5004b83cfd7bb28b5d0490ff13ff71048b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@4159|23,0,@6885 80,0,0 17214:O1|@17215 17215:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4160|1,0,@5280 17216:O1|@17217 17217:D3,24|b8e0c990b28b5d04909090ff139090900000000014000000|@17221,1,@4161|1,0,@17218 17218:O4|@4608,@5398,@17220,@17219 17219:O5|@5400,362,0,362,0 17220:S20|6d6b4d6163726f50726f633a20636c6f73757265 17221:S28|434f44455452454528292e6d6b4d6163726f50726f63283129283129 17222:D3,156|3b650c7303ff552483f80175458b45008d40e03b45087303ff5520894500c740fc04000000c7400c01000000895808c740048b000000c70044e239b289c18d4014c740fc02000000c74004010000008908c38b08813944e239b2750a8b480489c8e99affffff518b4004909090e88effffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3900000000098000000|@6849,11,@4162|40,0,0 50,0,69 56,0,@4607 75,0,0 86,0,@4607 17223:D3,96|3b650c7303ff5524a80175438b08833909740e8b5004b83cfd7bb28b5d0490ff13ff71048b480489c8e8d2ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c3909090000000005c000000|@6329,7,@4163|23,0,@6885 80,0,0 17224:O1|@17225 17225:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4164|1,0,@5280 17226:S25|434f44455452454528292e6d6b4d6163726f50726f63283129 17227:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4167| 17228:D3,224|3b650c7303ff552481780848c052087427f640080175288b7008bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b48088b581089ce8b38ff70048b400c9090e85a30ebff53505657bb0ccd90b28b4424109090e8866beaff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b54240c895118c74114030000008941108b44240889410cc74108010000008b4424048941045883c41089018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c39000000000dc000000|@8043,1048575,@4169|11,0,I48 27,0,I48 32,0,4 57,0,@6130 82,1,@6884 91,0,@17229 102,1,@6547 133,0,1 147,0,1 164,0,0 210,0,7 17229:O1|@17230 17230:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4168|1,0,@5280 17231:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e64283229 17232:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4171| 17233:O1|@17234 17234:D3,44|8b48088b108b45008d40f43b45087303ff5520894500c740fc020000008948048910c3900000000028000000|@17235,7,@4173| 17235:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f706465637328332964656275677c636f64652d283129 17236:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4174| 17237:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329 17238:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4176| 17239:D3,212|3b650c7303ff55248338037506b801000000c383380175448b40049090e8c6000000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c8c38b48088b0951bb28e07bb28b4004909090e85aaafdff508b4424049090e85e010000b901000000a801752e8b55008d52f43b55087303ff5520895500c742fc02000000894a048b08890a89d18b40043b650c7303ff5524ebce89c883f80175055883c404c389c35883c404e9b002000000000000d0000000|@17244,2097151,@4182|14,0,0 30,1,@17240 35,0,0 99,0,@6817 110,1,@16195 122,1,@17241 127,0,0 200,1,@17243 17240:D3,224|3b650c7303ff5524a80175738b088b51148b1283fa01750d8b4804b84cc37bb28b5d04ff138b128b5a08833b05740e8b4804b854a48db28b5d0490ff138b73048b36f7c601000000740783fe017c08eb14f646ff10740e8b4804b8a4727db28b5d0490ff138b7d008d7fe83b7d087303ff5520897d00c747fc02000000eb05e94b000000897704c707050000008d770cc746fc02000000897e04c70609000000568b480489c8909090e852ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c390909000000000dc000000|@6329,63,@4178|28,0,@6769 51,0,@15795 91,0,@7993 137,0,2 156,0,4 208,0,0 17241:D3,88|3b650c7303ff5524a801753e8b08ff70048b019090e852000000508b4424049090e8daffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c3b801000000c30000000054000000|@6329,1048575,@4180|22,1,@17242 75,0,0 17242:D3,288|3b650c7303ff5524833809755e8b4808ff70048b4104909090e8e2ffffff8338057514b9010000008b542404894c24045b52e93519ebff89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1424895008894804c7000d00000083c404c383380575748b48048b098b40088b00ba01000000f6c2017409f6000174042b107105ff5538ebf783c20183fa01740bb8b8e07bb28b5d0490ff13f6c101740783f9017c08eb10f641ff10740ab8f8e07bb28b5d04ff138b45008d40e83b45087303ff5520894500c740fc02000000894804c70005000000eb05e91600000089c18d400cc740fc02000000894804c70009000000c3833803740d89c1b828f17bb28b5d0490ff138b4004c3909090000000001c010000|@6867,1048575,@4179|36,0,0 51,1,@6843 84,0,0 99,0,6 123,0,0 155,0,@6820 184,0,@6823 222,0,2 250,0,4 263,0,@6863 17243:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4181| 17244:S45|535452554354555245535f28292e67656e636f6465537472756374732832296c6f6164546f7064656373283129 17245:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4183| 17246:S31|535452554354555245535f28292e67656e636f646553747275637473283229 17247:D3,44|3b650c7303ff552452b8010000008b4a0889ca90ff128b0c248b590483c404e91c0000000000000028000000|@17300,2097151,@4212|10,0,0 32,1,@17248 17248:D3,300|3b650c7303ff55246a016a016a016a016a016a018b1bb958d590b250f6c301751eff7304ff7424048b0389cb90e8b201000089c15b3b650c7303ff5524ebdd8b41048d5424048b18891a8d5424048b70048972048d5424048b7808897a088d5424048b580c895a0c8b51048d7424048b52108956108b49048d5424048b4914894a14bb0100000083c404589090e84a23000050bb010000008b44240890e83a23000050bb010000008b44241890e82a23000050bb010000008b44241490e81a23000050bb010000008b44241090e80a23000050bb010000008b44242090e8fa22000089c18b45008d40e43b45087303ff5520894500c740fc060000008b5424088950148948108b4c240489480c8b4c240c8948085983c40c8948045983c4148908c390900000000028010000|@17299,2097151,@4211|23,0,@17249 46,1,@17255 131,0,0 142,1,@17296 148,0,0 158,1,@17296 164,0,0 174,1,@17296 180,0,0 190,1,@17296 196,0,0 206,1,@17296 212,0,0 222,1,@17296 17249:O4|0,@12894,0,@17250 17250:O1|@17251 17251:D3,24|b8a0d590b28b5d04909090ff139090900000000014000000|@17254,1,@4185|1,0,@17252 17252:O4|11,@4879,0,@17253 17253:O5|@14950,3255,0,3255,0 17254:S39|535452554354555245535f28292e706173733453747275637473283229726573756c742d283129 17255:D3,1248|3b650c7303ff55248b4b048338037572ff730cff7308ff33ff7114ff710cff7108ff7104ff31ff71108b5c24208b400490e8be040000833c2401740a8b1c249090e8220800008b4d008d49e43b4d087303ff5520894d00c741fc060000008b54241483c4048951148941108b44240c89410c8b4424088941088b442404894104eb05e9380000005883c41089018b45008d40ec3b45087303ff5520894500c740fc040000008b54240889500c8b5424048950088948045983c4088908c2040083380175718b55008d52f43b55087303ff5520895500c742fc020000008b710c8972048b3b893a6a016a018b4004ff730cff7308ff7114ff7108ff7104ff31ff7110a8017522ff7004ff74242cff74242089d38b0090e8a607000089c2583b650c7303ff5524ebda8d44241c8b0a89088d44241ceb05e96a0000008b5a048958048b45008d40d03b45087303ff5520894500c740fc060000008b7424108970145e8970108b74241c89700c8b7424088970088b7424048970045e83c40c893089c68d401cc740fc040000008b7c240489780c5f83c4048978088970045e83c4048930c204008b50088b128b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b3b893e6a016a01ff730cff7308ff7004ff7304f6c201756c8b028b4804833901740ab874e690b28b5d04ff138b5c241c833b057522ff7204ff7604ff36ff7008ff7104ff71086a018b5c24108b442438e8e612ebffeb4a8b78088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b1e8958088b5c241ceb05e9e5000000895804c7000d000000ff7204ff7604ff3657ff7104ff71088b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b042483380375078b40048b00eb038b40048b55008d52d43b55087303ff5520895500c742fc0100004089028d4208c740fc04000000c7400c0100000083c4045b895808895004c700030000008d5014c742fc030000005b895a08894204890a58a801740583c0027105ff5538ebf68b4d008d49e83b4d087303ff5520894d00c741fc020000005b89590489118d510cc742fc02000000894a04890289d65a3b650c7303ff5524e9a5feffff8d4424108b0e89088d4424108b5604895004837c2414017507b868c05208eb71b8010000008b5c2414f6c301751ba801740583c0027105ff5538ebf68b5b043b650c7303ff5524ebe0a801740a81f8ffffff017d08eb13f640ff10750d89c3b850337db28b5d0490ff1389c1b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffceb05e93f000000c647ff4057f3ab5fb8010000008b4c241483f90174238b19895c47fea801740583c0027105ff5538ebf68b590489d93b650c7303ff5524ebd88067ffbf89f88b4d008d49ec3b4d087303ff5520894d00c741fc04000000c701a0e690b28b5c240c8959048941088b5c240889590c8061ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc020000005b895f048b5c240c891f6a016a015150578d5c240c53ff74243089cb8b44241c9090e8ea0c000059b8ffffff002341fc8d440001a8017410f64424100174098d40ff034424107105ff5538ebf289c18b45008d40ec3b45087303ff5520894500c740fc040000005a89500c8948088b4c24048948045983c4188908c2040090909000000000dc040000|@17295,2097151,@4208|50,1,@17256 66,1,@17262 278,1,@17263 452,0,0 492,0,@17270 538,1,@6843 574,0,0 599,0,6 647,0,1 708,0,0 724,0,1 849,0,I49 856,0,0 902,0,16777215 919,0,@7886 932,0,0 982,0,0 1062,0,@17272 1146,1,@17274 1152,0,8388607 17256:D3,128|3b650c7303ff5524a80175668b088b51088b1253ff7004ff710489d090e8720000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104588901518b5c24088b442404e8b2ffffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4088908c3b801000000c3000000007c000000|@6329,63,@4189|30,1,@17257 115,0,0 17257:D3,364|8b4d008d49ec3b4d087303ff5520894d00c741fc04000000c70104dd90b28959048b50088951088b581489590c8061ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c706e4dd90b28b7810897e04894e088066ffbf8b08833903756c8b51048b128b490c8b098b3983ff017507b968c05208eb595189f9ff700cff7008ff7004b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74241089f989cf518b4c2404d1e983c604f3a58d7c3f01eb0ae94c000000e9160000008d7436018d4c09018b0c248061ffbf83c40889c6eb0b6a01ff700cff7008ff70048b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70001000000eb0c8b780c6a015752ff700489c889c18b45008d40e43b45087303ff5520894500c740fc060000008958148970108b54240889500c8b5424048950085a83c40c8950048908c30000000068010000|@17261,63,@4188|26,0,@17258 75,0,@17260 117,0,I49 136,0,0 282,0,0 17258:D3,124|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c0018b5208f6c201740f89c1b8bc7e7ab28b5d04909090ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebc90000000078000000|@17259,1048575,@4186|69,0,@5417 17259:S70|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e61747572652831296d6170494473283129 17260:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e94023eaff0000000020000000|@6481,2097151,@4187|24,1,@6426 17261:S61|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e6174757265283129 17262:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4190| 17263:D3,1100|3b650c7303ff55248b4c2408833905751bff7304ff700cff33ff70146a018b5c240889c890e81a0cebffeb398b500c8b70148b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b3b897808894804c7000d000000ff7304525756598b0983f901750c89c2b84cc37bb28b5d04ff138b118b1a8b73088b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7071ce390b28b4c2410894f048b4e08894f088b4e14894f0c8067ffbf8b4d008d49f03b4d087303ff5520894d00c741fc03000000c70100e490b2ff7210ff7204508b46108941048979088061ffbf8b3e833f03756b8b47048b008b7f0c8b3fff7614ff7608ff338b1f83fb017507bb68c05208eb645189d950b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b460c8b4e045e578b3c245189d9d1e983c604f3a58d7c3f01eb05e9480000008d7436018d4c09018b4c24048061ffbf89cbeb0a51506a01ff76048b460c8b4d008d49f03b4d087303ff5520894d00c741fc030000008959088b5c2408895904c70101000000eb15ff7614ff7608ff335189f96a016a01ff76048b460c8b5d008d5be43b5d087303ff5520895d00c743fc060000008b7424188973148b7c240c897b1089430c8b4424148943085f83c40c897b04890b8b0a8b7d008d7fcc3b7d087303ff5520897d00c747fc040000008b410c89470c895f088b5904895f048b342489378b720c8d5714c742fc07000000c70238e490b28b5e08895a048b461489420859894a0c59894a1059894a148b4c241c894a188062ffbf8b5d008d5bf03b5d087303ff5520895d00c743fc03000000c703f0e590b28b46108943048953088063ffbf8b16833a03756d8b42048b008b520c8b128b0a83f9017507b968c05208eb5a518b0c2450b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b46148b4e0cff7608ff760489d689fa89d7518b4c2414d1e983c604f3a58d7c3f01eb0ae94f000000e9100000008d7436018d4c09018062ffbf89d1eb106a015057ff7608ff7604ff760c8b46148b55008d52f03b55087303ff5520895500c742fc03000000894a088b4c2410894a04c70201000000eb116a016a0157ff7608ff7604ff760c8b46148b4d008d49e43b4d087303ff5520894d00c741fc060000008941148959105889410c8b4424048941085883c40489410489118b45008d40f43b45087303ff5520894500c740fc020000008b54240c895004c700030000008b55008d52e83b55087303ff5520895500c742fc050000008b5c2414895a10894a0c8942088b4424108942045883c414890258a801740583c0027105ff5538ebf68b4d008d49f43b4d087303ff5520894d00c741fc020000008951045a89118b55008d52e83b55087303ff5520895500c742fc020000005b895a04890a89c18d420cc740fc020000008950048908c208000000000048040000|@17269,1048575,@4195|38,1,@6843 77,0,0 91,0,6 112,0,@6769 154,0,@17264 207,0,@17266 264,0,I49 275,0,0 416,0,0 561,0,@17267 626,0,@17268 668,0,I49 680,0,0 837,0,0 943,0,1 17264:D3,124|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c0018b5208f6c201740f89c1b8bc7e7ab28b5d04909090ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebc90000000078000000|@17265,1048575,@4191|69,0,@5417 17265:S75|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e642832296e65774d6170283129 17266:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9241deaff0000000020000000|@6481,2097151,@4192|24,1,@6426 17267:D3,420|3b650c7303ff5524a801740df642080174073b42087c55eb05ff5538ebf4a801740bf642080174052b42087105ff5538ebf683c0018b5204f6c201740c89c1b8bc7e7ab28b5d04ff1383f80175038b02c3a801740583e8027105ff5538ebf68b52043b650c7303ff5524ebcca801740df642140174073b42147c59eb05ff5538ebf4a801740bf642140174052b42147105ff5538ebf683c0016a016a016a018b4a10f6c101740e89c3b8bc7e7ab28b5d049090ff1383f801751f8b0189e38b30893389e38b7804897b0489e38b4808894b08eb20e9bc000000a801740583e8027105ff5538ebf68b49043b650c7303ff5524ebae8b5c2408817a0c48c052087427f6420c0175258b720cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090175048b03eb20ff7308ff7304ff33bb5d0000008b420c90e81a26e9ff5b9090e81226e9ffeb06ff7308ff73048b4d008d49e03b4d087303ff5520894d00c741fc030000008b5424048951085a83c40489510489018d4110c740fc030000008948088b4c24048948045983c4088908c38b5218ff22909000000000a0010000|@17265,1048575,@4193|64,0,@5417 170,0,@5417 251,0,I48 267,0,I48 272,0,4 309,0,46 318,1,@4940 326,1,@4940 17268:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9341beaff0000000020000000|@6481,2097151,@4194|24,1,@6426 17269:S66|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e64283229 17270:O4|@4608,@5398,@15146,@17271 17271:O5|@14950,3162,0,3162,0 17272:D3,108|3b650c7303ff5524a801740df6420c0174073b420c7d0ceb05ff5538ebf48b5204ff22a801740bf6420c0174052b420c7105ff5538ebf683c001a80174138b5a08b9ffffff00234bfc8d4c09013bc1720c89c1b8cc7b7ab28b5d04ff138b4443fec390900000000068000000|@17273,1048575,@4196|66,0,8388607 84,0,@5401 17273:S58|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296d617054797065496473283129 17274:D3,424|3b650c7303ff55248b4c240c8b510483380175448b40088b0053a8017521ff7004ff74240cff74240889cb8b00e88a01000089c1583b650c7303ff5524ebdb8b44240c8b1189108b5904895804b80100000083c404c20c0083380375728b400453a80175526a016a01ff7004518d4c240851ff74241c8b5c24188b0090e87effffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24088948048b4c2404890889c15883c4083b650c7303ff5524ebaa8b44240c8b1189108b5904895804b80100000083c404eb05e903000000c20c008b75008d76f43b75087303ff5520897500c746fc020000008b7a14897e048b39893e6a016a018b400853ff7210ff720cff7208ff7204ff32a8017524ff7004ff742428ff74241c89f38b00909090e8e20b000089c6583b650c7303ff5524ebd88d4424188b0e89088d4424188b56048950048b45008d40e43b45087303ff5520894500c740fc060000008b5c241c8958148b5c24108958108b5c240c89580c8b5c24088958088b5c24048958045b83c41489188b5c24105f83c404893b894304b801000000c20c009000000000a4010000|@17294,2097151,@4207|46,1,@17275 78,0,0 198,0,0 294,1,@17291 408,0,0 17275:D3,2004|3b650c7303ff552483380575678b48048b53048b75008d76f43b75087303ff5520897500c746fc02000000c74604010000008b3b893e6a016a018b4104ff7214ff7210ff720cff7208ff32ff7204ff31a801756b8b088b54242c833a057529ff7004ff7604ff36ff7110ff710cff7104ff31eb05e9080200006a018b5c241489d0e85a01ebffeb478b58048b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b3e897808895004c7000d00000053ff760457eb05e9dc000000ff7110ff710cff7104ff318b4d008d49d43b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc07000000c7401801000000c74014010000008b54240c8950108b54240889500c8948088b4c24048948045983c40c890859f6c101740583c1027105ff5538ebf68b55008d52f43b55087303ff5520895500c742fc02000000c7420401000000890283fa0175058b0424eb0f89ce89d38b042490e87a06000089f18b55008d52f43b55087303ff5520895500c742fc02000000894204890a89d683c404583b650c7303ff5524e9b0feffff8d44241c8b0e89088d44241c8b56048950048b45008d40f43b45087303ff5520894500c740fc020000008b5c24208958048b1c2489186848c052088b5c242c9090e8fafbf8ff596a016a01508d5c24048b01909090e8b227eaff8b45008d40f43b45087303ff5520894500c740fc020000005983c4048948045989088b4d008d49cc3b4d087303ff5520894d00c741fc020000005a89510489018d410cc740fc060000008b5424108950148b54240c8950108b54240889500c8b5424048950088948045983c410890889c18d401cc740fc020000008948045983c4048908c2080083380175718b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b700489318b7b048b75008d76d83b75087303ff5520897500c746fc020000008b07894604890e8d4e0cc741fc060000008b57148951148b47108941108b470c89410c8b47088941088b47048941048931eb05e9220000008b45008d40f43b45087303ff5520894500c740fc020000008948048b1b8918c20800833803756a8b4b048b50048b72088b7d008d7ff03b7d087303ff5520897d00c747fc03000000c70760f190b28b56108957048b5424048957088067ffbf8b16833a03756cff7110ff710cff7108ff7104ff31ff71148b4a048b098b520c8b12ff338b1a83fb01750cba68c05208eb66e9220200005189d9ff7004b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f8b460c8b4e0489d6eb05e95500000089fa89d75189d9d1e983c604f3a58d7c3f018d7436018d4c09018062ffbfeb0b51ff700457ff76048b460c8b4d008d49f03b4d087303ff5520894d00c741fc030000008951088b54240c895104c70101000000eb21ff7110ff710cff7108ff7104ff31ff711489d1ff336a01ff700457ff76048b460c8b55008d52e43b55087303ff5520895500c742fc06000000c74214010000008b5c2404895a1089420cc74208010000005883c404894204890a8b04248b4c242c8339057512ff30526a018b5c241489c8e842fdeaffeb338b188b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b742408897008894804c7000d00000053528b4d008d49e03b4d087303ff5520894d00c741fc02000000894104c701030000008b4424088d510cc742fc040000008b400c89420c58894208894a048b042489028b4c240cf6c101740583c1027105ff5538ebf68b5d008d5be83b5d087303ff5520895d00c743fc0200000089530489038d430cc740fc0200000083c4105a89500489188b55008d52e43b55087303ff5520895500c742fc060000008942148b4424108942108b44240c89420c8b4424088942088b4424048942045883c41089028b45008d40f43b45087303ff5520894500c740fc020000008950048908c208008b48048b53048b7108833e07746b8b7c2408833f05752dff7214ff7210ff720cff7204ff32ff7208ff31ff33ff7110ff7104ff710c6a018b5c241089f8e8eafbeaffeb518b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b33897008897804c7000d000000ff7214ff7210eb05e93a000000ff720cff7204ff32ff7208ff3156ff7110ff7104ff710c8b75008d76f43b75087303ff5520897500c746fc02000000894604c70603000000eb1eff7214ff7210ff720cff7204ff32ff7208ff31ff33ff7110ff7104ff710c8b45008d40f43b45087303ff5520894500c740fc02000000c70098f190b28b4c24308948048060ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70244f290b28942048062ffbf5652bbc0f390b28b4424089090e8ee17eaff8b4d008d49e03b4d087303ff5520894d00c741fc07000000c7411801000000c74114010000008b54240c89511089410c5883c4048941085883c4048941048b44240489015af6c201740583c2027105ff5538ebf68b5d008d5be83b5d087303ff5520895d00c743fc02000000894b0489038d430cc740fc0200000083c4045989480489188b4d008d49e43b4d087303ff5520894d00c741fc060000008b5c24108959148b5c240c8959108b5c240889590c8941088b4424048941045883c41089018b45008d40f43b45087303ff5520894500c740fc020000008948048910c208009000000000d0070000|@17290,2097151,@4204|46,0,0 130,1,@6843 166,0,0 180,0,6 236,0,1 253,0,0 260,0,0 337,0,0 362,1,@17276 471,0,I48 482,1,@13886 502,1,@6462 838,0,@17277 903,0,I49 921,0,0 1058,0,0 1124,0,0 1141,0,0 1178,1,@6843 1213,0,0 1229,0,6 1264,0,1 1522,1,@6843 1555,0,0 1569,0,6 1638,0,1 1700,0,@17278 1741,0,@17280 1755,0,@17287 1766,1,@6446 1797,0,0 1804,0,0 17276:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4197| 17277:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9c40feaff0000000020000000|@6481,2097151,@4198|24,1,@6426 17278:D3,72|3b650c7303ff55248b480483390175278b410c8b52049090ff1289c18b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000044000000|@17279,1048575,@4199|56,0,0 17279:S69|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129636f70794964283129 17280:D3,96|3b650c7303ff55246a016a016a0168b8f290b2683cf390b26a018d4c240c518b5a04909090e89611eaff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@17286,2097151,@4202|15,0,@17281 20,0,@17284 38,1,@6437 17281:O1|@17282 17282:D3,12|c39090900000000008000000|@17283,1,@4200| 17283:S84|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129283129 17284:O1|@17285 17285:D3,12|c39090900000000008000000|@17283,1,@4201| 17286:S81|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129 17287:O1|@17288 17288:D3,12|c39090900000000008000000|@17289,1,@4203| 17289:S63|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129283129 17290:S56|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296d616b6544656373283229 17291:D3,636|3b650c7303ff55248b4c2408833905751fff7304ff7004ff30ff33ff700c6a018b5c240889c8909090e862f6eaffeb418b50048b308b780c8b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b0b8948088b4c2408894804c7000d000000ff73045256ff3357598b0983f901750c89c2b84cc37bb28b5d04ff138b098b51088b5d008d5bf03b5d087303ff5520895d00c743fc03000000c70300f790b28b72108973048b7c2414897b088063ffbf8b0a833903756c8b71048b368b490c8b098b3983ff017507b968c05208eb595189f950b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74240889f989cf518b4c2404d1e983c604f3a58d7c3f018d7436018d4c0901eb0ae93c000000e90e0000008b0c248061ffbf83c40889c6eb036a01508b45008d40f03b45087303ff5520894500c740fc03000000894808897004c70001000000eb056a015089c88b4d008d49e43b4d087303ff5520894d00c741fc06000000c74114010000008959108b5a0c89590cc74108010000008b720489710489018b442408a801740583c0027105ff5538ebf68b7d008d7ff43b7d087303ff5520897d00c747fc020000008b74240c897704c707010000008b75008d76e83b75087303ff5520897500c746fc02000000c7460401000000893e8d7e0cc747fc020000005a83c40c895704c707030000008b55008d52c83b55087303ff5520895500c742fc0400000089720c894a08897a048b0c24890a8d5a14c743fc02000000895304890b8d4b0cc741fc0200000083c4045a895104891989c28d410cc740fc020000008948048910c208000000000078020000|@17293,1048575,@4206|42,1,@6843 83,0,0 101,0,6 124,0,@6769 164,0,@17292 210,0,I49 221,0,0 359,0,0 397,0,0 413,0,0 476,0,0 507,0,0 532,0,1 17292:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e9240aeaff0000000020000000|@6481,2097151,@4205|24,1,@6426 17293:S68|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296578747261637453747275637475726542696e64283229 17294:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374537472756374283329 17295:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229 17296:D3,84|3b650c7303ff5524a801753a8b0853518b198b4004e84e0000008b4d008d49f43b4d087303ff5520894d00c741fc020000008b5424048951045a83c404891189cbe9baffffff89d8c39090900000000050000000|@17298,63,@4210|22,1,@17297 17297:D3,160|3b650c7303ff5524a801756a8b083b197469f6c3017539f6010175348b31f7c6010000007407ba03000000eb068b168d54120183c20889de8b3989d1d1e93bc9f3a68d7c3f018d7436018d4c09017437ff308b4004e8a6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000eb0ae914000000e907000000894804598908c38b4004e971ffffffb801000000c3909090000000009c000000|@5094,63,@4209|39,0,1 144,0,0 17298:S41|535452554354555245535f28292e70617373345374727563747328322972657646696c746572283229 17299:S29|535452554354555245535f28292e706173733453747275637473283229 17300:S45|434f4d50494c45525f424f445928292e62617365436f6d70696c657228332965786563757465436f6465283129 17301:S31|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329 17302:S30|434f4d50494c45525f424f445928292e636f6d70696c6572283329283129 17303:D3,844|3b650c7303ff55248b0d24f075b75350bb54fd90b289c89090e836f5e8ff8b4424048b40048b0d24f075b789c389c89090e81ef5e8ff8b45008d40f83b45087303ff5520894500c740fc01000040c70001000000c700b42c7ab28b4c2404b8ffffff002341fc8d44000183f809725e8b410ca80175508b55008d52e83b55087303ff5520895500c742fc050000008b5808895a108b701089720c8b7804897a088b480c894a048b38893a8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb0cbf01000000eb05bf0100000083ff01746b8b07813848c05208744bf6000175208b30bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090174268b0d24f075b7ff7008ff30bb7cfd90b289c890e836f4e8ff8b0524f075b75be82af4e8ffeb03ff7008833c2401743d8b0524f075b7bb90fd90b2eb05e92e0000009090e806f4e8ffbb030000008b0424bafc317ab29090e8ce36e9ff8b0d24f075b789c389c890e8e2f3e8ff83c4048b0524f075b7bba0fd90b290e8cef3e8ff58a801752e8b0d24f075b7ff70048b1889c890e8b6f3e8ff8b0524f075b7bb15000000e8a6f3e8ff583b650c7303ff5524ebce8b0524f075b7bbacfd90b290e88af3e8ff8b0524f075b7ff7010bb983d7ab290e8b22de9ff8b45008d40f83b45087303ff5520894500c740fc01000040c70001000000c700b42c7ab28b0c24b8ffffff002341fc8d44000183f809725e8b410ca80175508b55008d52e83b55087303ff5520895500c742fc050000008b5808895a108b701089720c8b7804897a088b480c894a048b38893a8b7d008d7ff83b7d087303ff5520897d00c747fc010000008917eb0cbf01000000eb05bf01000000f7c701000000743c8b04248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c68387ab28b50088951088b58048959048b30893189c88b5d04909090ff138b078b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000c70180387ab28b0c248b098b14248b52045b8b5b088b75008d76d43b75087303ff5520897500c746fc050000008b780c897e108b7804897e0c8b7810897e088b7808897e048b38893e8d4618c740fc0400000089700c8958088950048908ff2508bc52089090900000000048030000|@17309,2097151,@4215|10,0,@20261 17,0,@17304 26,1,@4897 39,0,@20261 50,1,@4897 80,0,0 86,0,@5039 95,0,8388607 199,0,0 206,0,0 219,0,I48 233,0,I48 238,0,4 264,0,@20261 274,0,@17305 282,1,@4897 288,0,@20261 294,1,@4897 311,0,@20261 316,0,@17306 330,1,@4897 335,0,1 343,0,@5052 350,1,@5053 356,0,@20261 366,1,@4897 375,0,@20261 380,0,@17307 386,1,@4897 397,0,@20261 410,1,@4897 416,0,@20261 421,0,10 426,1,@4897 443,0,@20261 448,0,@17308 454,1,@4897 460,0,@20261 468,0,@5078 474,1,@5038 504,0,0 510,0,@5039 518,0,8388607 622,0,0 629,0,0 671,0,@5065 729,0,0 735,0,@5066 829,0,I14 17304:S32|457863657074696f6e20747261636520666f7220657863657074696f6e202d20 17305:S11|2072616973656420696e20 17306:S6|206c696e6520 17307:S2|0a0a 17308:S14|456e64206f662074726163650a0a 17309:S30|506f6c794d4c2e457863657074696f6e2e7072696e745472616365283229 17310:O2|3,@17311 17311:S24|436f6d70696c6174696f6e20696e7465727275707465640a 17312:O4|1,@5021,0,@17313 17313:O5|@17314,220,0,220,0 17314:S36|6d6c736f757263652f4d4c436f6d70696c65722f434f4d50494c45525f424f44592e4d4c 17315:S26|457863657074696f6e2d20496e7465726e616c4572726f723a20 17316:S23|20726169736564207768696c6520636f6d70696c696e67 17317:O5|@17314,229,0,229,0 17318:S11|457863657074696f6e2d20 17319:S36|20756e65787065637465646c7920726169736564207768696c6520636f6d70696c696e67 17320:O5|@17314,238,0,238,0 17321:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283329 17322:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283129 17323:O3|3,@17346,@5234 17324:O3|3,@17325,@12016 17325:O2|@17327,@17326 17326:O2|@17329,@17328 17327:O2|49,@12025 17328:O2|@17334,0 17329:O2|50,@17330 17330:O3|2,@6000,@17331 17331:O5|5,@17332,@12166,@12023,@5229 17332:O2|@17333,0 17333:O5|5,0,@6688,@6686,0 17334:O2|51,@17335 17335:O5|5,@17336,@5788,@5786,@5229 17336:O2|@17337,0 17337:O5|5,0,@17339,@17338,@5229 17338:O3|@17339,@5229,@17340 17339:S9|756e6976657273616c 17340:O3|@17342,@17345,@17341 17341:O3|@17339,@5256,@5255 17342:O2|1,@17343 17343:O3|2,@17344,0 17344:O4|0,@4766,3,1 17345:O4|1,@4767,0,0 17346:O2|@17348,@17347 17347:O2|@17351,0 17348:O2|49,@17349 17349:O5|5,@17350,@12166,@12023,@5229 17350:O2|@5999,0 17351:O2|50,@17352 17352:O5|5,@17353,@12166,@12023,@5229 17353:O2|@17354,0 17354:O3|2,@6000,@17355 17355:O3|3,@17357,@17356 17356:O3|0,@17375,1 17357:O2|@17359,@17358 17358:O2|@17362,@17361 17359:O2|@17360,@12038 17360:S5|6669786573 17361:O2|@17365,@17364 17362:O2|@17363,@12099 17363:S5|7479706573 17364:O2|@17368,@17367 17365:O2|@17366,@12079 17366:S6|76616c756573 17367:O2|@17371,@17370 17368:O2|@17369,@12119 17369:S8|66756e63746f7273 17370:O2|@17373,0 17371:O2|@17372,@12059 17372:S10|7369676e617475726573 17373:O2|@17374,@12141 17374:S10|73747275637475726573 17375:O2|@17360,@17376 17376:O2|@17363,@17377 17377:O2|@17366,@17378 17378:O2|@17369,@17379 17379:O2|@17372,@17380 17380:O2|@17374,0 17381:O2|@6191,@17382 17382:O2|@17383,0 17383:O4|@4596,69,@6189,0 17384:O2|@5983,@17385 17385:O2|@17386,0 17386:O4|@4596,69,@5981,0 17387:O2|@5562,@17388 17388:O2|@17389,0 17389:O4|@4596,69,@17390,0 17390:O7|@5562,@6222,@17392,@17391,@5229,0,0 17391:O3|2,@5306,@5509 17392:O2|1,@17393 17393:O3|2,@5558,@17394 17394:O2|@17395,0 17395:O4|@4607,69,@17396,0 17396:O3|2,3,@17397 17397:O5|@5411,@17398,@5538,@5521,@5387 17398:O2|@5433,@17399 17399:O2|@17401,@17400 17400:O2|@17406,@17405 17401:O2|@7163,@17402 17402:O3|0,@17403,@5415 17403:O8|@17404,@5562,0,0,@5530,0,0,1 17404:O4|13,3,@5532,4 17405:O2|@17410,0 17406:O2|@17408,@17407 17407:O3|0,@17409,@5415 17408:O2|1,@10087 17409:O8|@5976,@5562,0,0,@7118,0,0,1 17410:O2|@7182,@17411 17411:O3|0,@17412,@5415 17412:O8|@5711,@5562,0,0,@7118,0,0,1 17413:O2|@6174,@17414 17414:O2|@17415,0 17415:O4|@4596,69,@6172,0 17416:O2|@5918,@17417 17417:O2|@17418,0 17418:O4|@4596,69,@5916,0 17419:O2|@17421,@17420 17420:O2|@17422,0 17421:S7|636f6e74657874 17422:O4|@4600,69,@17423,0 17423:O2|@17425,@17424 17424:O2|@17462,@17461 17425:O3|@17421,@5229,@17426 17426:O3|@17428,@17459,@17427 17427:O3|@17460,@5256,@5255 17428:O2|1,@17429 17429:O3|2,@17431,@17430 17430:O2|@17434,0 17431:O4|@17432,@4618,3,1 17432:O1|@17433 17433:D3,16|b801000000c39090000000000c000000|@5575,1,@4218|1,0,0 17434:O4|@4607,69,@17435,0 17435:O3|2,4,@17436 17436:O5|@5411,@17438,@17443,@17437,@5387 17437:O12|@17445,@17448,@17450,@17447,@17446,@17453,@17455,@17457,@17444,@17432,@4618,@17431 17438:O2|@5433,@17439 17439:O2|@17441,@17440 17440:O2|@17442,@5438 17441:O2|@5527,@5664 17442:O2|@5900,@5413 17443:O11|2,2,2,2,2,2,2,2,2,1,2 17444:O3|@17453,@17455,@17457 17445:O3|@17431,@17446,@17444 17446:O3|@17448,@17450,@17447 17447:O1|@17452 17448:O1|@17449 17449:D3,28|8338017406b801000000c3b803000000c39090900000000018000000|@5625,1,@4219|6,0,0 12,0,1 17450:O1|@17451 17451:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70001000000c30000000028000000|@5625,3,@4220|31,0,0 17452:D3,12|8b4004c30000000008000000|@5625,1,@4221| 17453:O1|@17454 17454:D3,28|8338037406b801000000c3b803000000c39090900000000018000000|@5629,1,@4222|6,0,0 12,0,1 17455:O1|@17456 17456:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70003000000c390900000000030000000|@5629,7,@4223|37,0,1 17457:O1|@17458 17458:D3,44|8b48088b50048b45008d40f43b45087303ff5520894500c740fc020000008948048910c30000000028000000|@5629,7,@4224| 17459:O4|1,@4768,0,0 17460:S14|506f6c794d4c2e636f6e74657874 17461:O2|@17485,0 17462:O7|@5625,@8967,@17464,@17463,@5229,0,0 17463:O3|2,@5933,@17484 17464:O2|1,@17465 17465:O3|2,@17446,@17466 17466:O2|@17467,0 17467:O4|@4607,69,@17468,0 17468:O3|2,3,@17469 17469:O5|@5411,@17470,@17443,@17437,@5387 17470:O2|@5433,@17471 17471:O2|@17473,@17472 17472:O2|@17478,@17477 17473:O2|@5747,@17474 17474:O3|0,@17475,@5415 17475:O8|@17476,@5625,0,0,@5530,0,0,1 17476:O4|13,0,@5532,1 17477:O2|@17481,0 17478:O2|@5756,@17479 17479:O3|0,@17480,@5415 17480:O8|@5706,@5625,0,0,@7118,0,0,1 17481:O2|@5762,@17482 17482:O3|0,@17483,@5415 17483:O8|@5711,@5625,0,0,@7118,0,0,1 17484:O5|5,0,@17421,@17425,@5229 17485:O7|@5629,@8967,@17487,@17486,@5229,0,0 17486:O3|2,@17507,@17484 17487:O2|1,@17488 17488:O3|2,@17444,@17489 17489:O2|@17490,0 17490:O4|@4607,69,@17491,0 17491:O3|2,3,@17492 17492:O5|@5411,@17493,@17443,@17437,@5387 17493:O2|@5433,@17494 17494:O2|@17496,@17495 17495:O2|@17501,@17500 17496:O2|@6234,@17497 17497:O3|0,@17498,@5415 17498:O8|@17499,@5629,0,0,@5530,0,0,1 17499:O4|13,1,@5532,1 17500:O2|@17504,0 17501:O2|@6240,@17502 17502:O3|0,@17503,@5415 17503:O8|@6243,@5629,0,0,@6242,0,2,1 17504:O2|@5815,@17505 17505:O3|0,@17506,@5415 17506:O8|@6262,@5629,0,0,@6261,0,2,1 17507:O3|3,@17508,@5234 17508:O2|@12043,@17509 17509:O2|@17510,0 17510:O2|50,@5306 17511:O2|@6009,@17512 17512:O2|@17513,0 17513:O4|@4600,69,@17514,0 17514:O2|@6008,0 17515:O2|@6116,@17516 17516:O2|@17517,0 17517:O4|@4596,69,@6114,0 17518:O2|@5770,@17519 17519:O2|@17520,0 17520:O4|@4596,69,@5768,0 17521:O2|@5965,@17522 17522:O2|@17523,0 17523:O4|@4596,69,@5963,0 17524:O2|@17526,@17525 17525:O2|@17527,0 17526:S16|6164645072657474795072696e746572 17527:O4|@4596,69,@17528,0 17528:O7|@17526,2,@17530,@17529,@5229,0,0 17529:O3|2,@17531,@6000 17530:O2|3,1 17531:O3|2,@5307,@17532 17532:O3|2,@17534,@17533 17533:O3|2,@17535,@5509 17534:O3|6,@4769,79992 17535:O3|6,@4770,79992 17536:O2|@5569,@17537 17537:O2|@17538,0 17538:O4|@4596,69,@17539,0 17539:O7|@5569,@6222,@17541,@17540,@5229,0,0 17540:O3|2,@17570,@5509 17541:O2|1,@17542 17542:O3|2,@5541,@17543 17543:O2|@17544,0 17544:O4|@4607,69,@17545,0 17545:O3|2,3,@17546 17546:O5|@5411,@17547,@5538,@5521,@5387 17547:O2|@5433,@17548 17548:O2|@17550,@17549 17549:O2|@17557,@17556 17550:O2|@17552,@17551 17551:O3|0,@17554,@5415 17552:O2|1,@17553 17553:O2|2,14 17554:O8|@17555,@5569,0,0,@5530,0,0,1 17555:O4|13,4,@5532,4 17556:O2|@17565,0 17557:O2|@17559,@17558 17558:O3|0,@17561,@5415 17559:O2|1,@17560 17560:O2|2,15 17561:O8|@17562,@5569,0,0,@6242,0,2,1 17562:O3|10,@6245,@17563 17563:O3|14,@17564,1 17564:O2|@5375,@6250 17565:O2|@17567,@17566 17566:O3|0,@17569,@5415 17567:O2|1,@17568 17568:O2|2,16 17569:O8|@6262,@5569,0,0,@6261,0,2,1 17570:O3|3,@17571,@5234 17571:O2|@12043,@6271 17572:O2|@5651,@17573 17573:O2|@17574,0 17574:O4|@4600,69,@17575,0 17575:O2|@5650,@17576 17576:O2|@17578,@17577 17577:O2|@6220,@17650 17578:O7|@5546,@6222,@17580,@17579,@5229,0,0 17579:O3|2,@17633,@5509 17580:O2|1,@17581 17581:O3|2,@5542,@17582 17582:O2|@17583,0 17583:O4|@4607,69,@17584,0 17584:O3|2,3,@17585 17585:O5|@5411,@17586,@5538,@5521,@5387 17586:O2|@5433,@17587 17587:O2|@17589,@17588 17588:O2|@17593,@17592 17589:O2|@5747,@17590 17590:O3|0,@17591,@5415 17591:O8|@16431,@5546,0,0,@5530,0,0,1 17592:O2|@17621,0 17593:O2|@5756,@17594 17594:O3|0,@17595,@5415 17595:O8|@17597,@5546,0,0,@17596,0,4,1 17596:O2|@17614,0 17597:O3|10,@17599,@17598 17598:O3|14,@17607,1 17599:O2|@6247,@17600 17600:O2|@6248,@17601 17601:O2|@17603,@17602 17602:O2|@17605,0 17603:O4|1,@5384,2,@17604 17604:O4|6,@5278,2,0 17605:O4|1,@5384,3,@17606 17606:O4|6,@5278,3,0 17607:O2|@5348,@17608 17608:O2|@6252,@17609 17609:O2|@6253,@17610 17610:O2|@17612,@17611 17611:O2|@17613,0 17612:O2|4,@5763 17613:O2|4,@7018 17614:O2|1,@17615 17615:O2|@5535,@17616 17616:O2|@6257,@17617 17617:O2|@17619,@17618 17618:O2|@17620,0 17619:O3|2,2,@5384 17620:O3|2,3,@5384 17621:O2|@5762,@17622 17622:O3|0,@17623,@5415 17623:O8|@17624,@5546,0,0,@5379,0,4,1 17624:O3|10,@17626,@17625 17625:O3|14,@17608,0 17626:O2|@6266,@17627 17627:O2|@6267,@17628 17628:O2|@17630,@17629 17629:O2|@17632,0 17630:O4|1,@5461,2,@17631 17631:O4|6,@5278,3,1 17632:O4|1,@5461,3,@16430 17633:O3|3,@17635,@17634 17634:O3|0,@17646,1 17635:O2|@6272,@17636 17636:O2|@17638,@17637 17637:O2|@17640,@17639 17638:O2|50,@5232 17639:O2|@17643,0 17640:O2|51,@17641 17641:O5|5,@17642,@5788,@5786,@5229 17642:O2|@17484,0 17643:O2|52,@17644 17644:O5|5,@17645,@5788,@5786,@5229 17645:O2|@5509,0 17646:O2|49,@17647 17647:O2|50,@17648 17648:O2|51,@17649 17649:O2|52,0 17650:O2|@5508,@17651 17651:O2|@17390,@17652 17652:O2|@17539,0 17653:O2|@17655,@17654 17654:O2|@17656,0 17655:S20|707265747479526570726573656e746174696f6e 17656:O4|@4596,69,@17657,0 17657:O7|@17655,2,@17659,@17658,@5229,0,0 17658:O3|2,@17660,@5509 17659:O2|3,4 17660:O3|3,@17661,@5234 17661:O2|@17662,@6271 17662:O2|49,@17663 17663:O3|6,@4771,79993 17664:O2|@5546,@17665 17665:O2|@17666,0 17666:O4|@4596,69,@17578,0 17667:O2|@6096,@17668 17668:O2|@17669,0 17669:O4|@4596,69,@6094,0 17670:O2|@17672,@17671 17671:O2|@17673,0 17672:S8|436f646554726565 17673:O4|@4611,69,@17674,0 17674:O4|@17672,@5500,@17675,@5229 17675:O6|@17677,I48,0,@5229,@17676,0 17676:O1|@18018 17677:O4|1,@4773,@4774,@4772 17678:O2|@5213,40 17679:O2|@18010,@18009 17680:O2|@17682,@17681 17681:O2|@17683,0 17682:S8|6d6b48616e646c65 17683:O4|@4596,69,@17684,0 17684:O7|@17682,2,@17686,@17685,@5229,0,0 17685:O3|2,@17691,@12339 17686:O2|1,@17687 17687:O3|2,@17688,0 17688:O1|@17689 17689:D3,52|8b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c7000b000000c390900000000030000000|@17690,7,@4225|37,0,5 17690:S22|434f44455452454528292e6d6b48616e646c65283129 17691:O3|3,@17692,@5234 17692:O2|@17694,@17693 17693:O2|@17695,0 17694:O2|49,@12339 17695:O2|50,@12339 17696:O2|@17698,@17697 17697:O2|@17699,0 17698:S16|6d6b496e6c696e6546756e6374696f6e 17699:O4|@4596,69,@17700,0 17700:O7|@17698,2,@17702,@17701,@5229,0,0 17701:O3|2,@17710,@12339 17702:O2|1,@17703 17703:O3|2,@17704,0 17704:O1|@17705 17705:D3,228|3b650c7303ff5524ff7010ff30ff700cff7008bb981991b28b40049090e8461feaff813c2448c052087427f604240175288b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b0c2489cb89c683c4045890e8d298feff89c789f0909090e83a99feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542404895118c741140100000089411089790cc74108010000008959045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c39000000000e0000000|@17709,1048575,@4227|20,0,@17706 30,1,@6547 37,0,I48 53,0,I48 58,0,4 83,0,@6130 102,1,@16722 114,1,@16723 145,0,1 159,0,0 172,0,0 214,0,7 17706:O1|@17707 17707:D3,16|b803000000c39090000000000c000000|@17708,1,@4226|1,0,1 17708:S50|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283529283129 17709:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283129 17710:O3|3,@17712,@17711 17711:O3|0,@17722,1 17712:O2|@17694,@17713 17713:O2|@6273,@17714 17714:O2|@17716,@17715 17715:O2|@17718,@17717 17716:O2|51,@5306 17717:O2|@17721,0 17718:O2|52,@17719 17719:O5|5,@17720,@5788,@5786,@5229 17720:O2|@12339,0 17721:O2|53,@5307 17722:O2|49,@17723 17723:O2|50,@17724 17724:O2|51,@17725 17725:O2|52,@17726 17726:O2|53,0 17727:O2|@17729,@17728 17728:O2|@17730,0 17729:S7|6d6b5475706c65 17730:O4|@4596,69,@17731,0 17731:O7|@17729,2,@17733,@17732,@5229,0,0 17732:O3|2,@17719,@12339 17733:O2|1,@17734 17734:O3|2,@17735,0 17735:O1|@17736 17736:D3,112|3b650c7303ff55248b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410801000000894104c7011d000000a801751d8b10833a05750f8b500489d03b650c7303ff5524ebe6b801000000eb05b80300000083f801740789c8e9a2fdeaff89c8c3909090000000006c000000|@17737,1048575,@4228|35,0,0 44,0,14 75,0,0 82,0,1 94,1,@6933 17737:S35|434f4445545245455f46554e4354494f4e5328292e6d6b5265636f7264283129283129 17738:O2|@17740,@17739 17739:O2|@17741,0 17740:S7|6d6b5768696c65 17741:O4|@4596,69,@17742,0 17742:O7|@17740,2,@17743,@17685,@5229,0,0 17743:O2|1,@17744 17744:O3|2,@17745,0 17745:O1|@17746 17746:D3,260|3b650c7303ff55248b4d008d49e83b4d087303ff5520894d00c741fc020000008b5004895104c701050000008d590cc743fc02000000c7430401000000890b8b30b801000000909090e89e67ffff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c7011300000083fb01742689c88b4d008d49f03b4d087303ff5520894d00c741fc03000000894108895904c701150000008b45008d40ec3b45087303ff5520894500c740fc04000000c7400cc4757ab2894808897004c7000300000050b8010000009090e89a67ffff89c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000000010000|@17747,63,@4229|40,0,2 57,0,0 66,0,0 74,1,@17098 107,0,9 150,0,10 181,0,@5348 193,0,1 199,0,0 206,1,@17099 245,0,0 17747:S21|434f44455452454528292e6d6b5768696c65283129 17748:O2|@17750,@17749 17749:O2|@17751,0 17750:S7|6d6b5261697365 17751:O4|@4596,69,@17752,0 17752:O7|@17750,2,@17754,@17753,@5229,0,0 17753:O3|2,@12339,@12339 17754:O2|1,@17755 17755:O3|2,@17756,0 17756:O1|@17757 17757:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70017000000c30000000028000000|@17758,3,@4230|31,0,11 17758:S5|5261697365 17759:O2|@12341,@17760 17760:O2|@17761,0 17761:O4|@4600,69,@17762,0 17762:O2|@12340,0 17763:O2|@17765,@17764 17764:O2|@17766,0 17765:S5|6d6b456e76 17766:O4|@4596,69,@17767,0 17767:O7|@17765,2,@17769,@17768,@5229,0,0 17768:O3|2,@17774,@12339 17769:O2|1,@17770 17770:O3|2,@17771,0 17771:O1|@17772 17772:D3,60|83380175048b4004c38b48048b108b45008d40f03b45087303ff5520894500c740fc03000000894808895004c70015000000c3900000000038000000|@17773,7,@4231|46,0,10 17773:S29|434f4445545245455f46554e4354494f4e5328292e6d6b456e76283129 17774:O3|3,@17775,@5234 17775:O2|@17776,@17693 17776:O2|49,@17777 17777:O5|5,@17778,@5788,@5786,@5229 17778:O2|@17779,0 17779:O5|5,0,@17781,@17780,@5229 17780:O3|@17781,@5229,@17782 17781:S11|636f646542696e64696e67 17782:O3|@17784,@17787,@17783 17783:O3|@17788,@5256,@5255 17784:O2|1,@17785 17785:O3|2,@17786,0 17786:O4|0,@4776,3,1 17787:O4|1,@4777,0,0 17788:S27|506f6c794d4c2e436f6465547265652e636f646542696e64696e67 17789:O2|@17791,@17790 17790:O2|@17792,0 17791:S13|6d6b4c6f6164436c6f73757265 17792:O4|@4596,69,@17793,0 17793:O7|@17791,2,@17795,@17794,@5229,0,0 17794:O3|2,@5307,@12339 17795:O2|1,@17796 17796:O3|2,@17797,0 17797:O1|@17798 17798:D3,92|a801740783f8017c08eb12f640ff10740c89c1b8a4727db28b5d04ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc02000000894804c70009000000c390900000000058000000|@8043,3,@4232|20,0,@7993 58,0,1 77,0,4 17799:O2|@5651,@17800 17800:O2|@17801,0 17801:O4|@4596,69,@17802,0 17802:O7|@5651,2,@17804,@17803,@5229,0,0 17803:O3|2,@12339,@5509 17804:O2|1,@17805 17805:O3|2,@7375,0 17806:O2|@17808,@17807 17807:O2|@17809,0 17808:S5|6d6b446563 17809:O4|@4596,69,@17810,0 17810:O7|@17808,2,@17812,@17811,@5229,0,0 17811:O3|2,@17817,@17779 17812:O2|1,@17813 17813:O3|2,@17814,0 17814:O1|@17815 17815:D3,60|8b48048b108b45008d40ec3b45087303ff5520894500c740fc0400000089480c895008c7400401000000c70003000000c39090900000000038000000|@17816,7,@4233|38,0,0 44,0,1 17816:S19|434f44455452454528292e6d6b446563283129 17817:O3|3,@17818,@5234 17818:O2|@6272,@17693 17819:O2|@17821,@17820 17820:O2|@17822,0 17821:S5|4c64657863 17822:O4|@4596,69,@17823,0 17823:O7|@17821,2,@17824,@12339,@5229,0,0 17824:O2|1,@17825 17825:O3|2,@7817,0 17826:O2|@17828,@17827 17827:O2|@17829,0 17828:S7|67656e436f6465 17829:O4|@4596,69,@17830,0 17830:O7|@17828,2,@17832,@17831,@5229,0,0 17831:O3|2,@17838,@17837 17832:O2|1,@17833 17833:O3|2,@17834,0 17834:O2|@17835,@7311 17835:D3,40|3b650c7303ff55248b48088b1c24890c2489de8b58048b0889c88b520456ff220000000024000000|@17836,1048575,@4234| 17836:S21|434f44455452454528292e67656e436f6465283129 17837:O3|2,@6000,@12339 17838:O3|3,@17839,@12016 17839:O2|@17694,@17840 17840:O2|@17842,@17841 17841:O2|@17843,0 17842:O2|50,@17335 17843:O2|51,@5307 17844:O2|@17846,@17845 17845:O2|@17847,0 17846:S4|6d6b4966 17847:O4|@4596,69,@17848,0 17848:O7|@17846,2,@17850,@17849,@5229,0,0 17849:O3|2,@17855,@12339 17850:O2|1,@17851 17851:O3|2,@17852,0 17852:O1|@17853 17853:D3,56|8b48088b50048b188b45008d40ec3b45087303ff5520894500c740fc0400000089480c895008895804c70003000000c30000000034000000|@17854,15,@4235|43,0,1 17854:S4|436f6e64 17855:O3|3,@17856,@12016 17856:O2|@17694,@17857 17857:O2|@17695,@17858 17858:O2|@17859,0 17859:O2|51,@12339 17860:O2|@17862,@17861 17861:O2|@17863,0 17862:S9|6d6b4e756c6c446563 17863:O4|@4596,69,@17864,0 17864:O7|@17862,2,@17866,@17865,@5229,0,0 17865:O3|2,@12339,@17779 17866:O2|1,@17867 17867:O3|2,@17868,0 17868:O1|@17869 17869:D3,44|89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70005000000c30000000028000000|@17870,3,@4236|31,0,2 17870:S11|4e756c6c42696e64696e67 17871:O2|@17873,@17872 17872:O2|@17874,0 17873:S11|6d6b426567696e4c6f6f70 17874:O4|@4596,69,@17875,0 17875:O7|@17873,2,@17877,@17876,@5229,0,0 17876:O3|2,@17883,@12339 17877:O2|1,@17878 17878:O3|2,@17879,0 17879:O1|@17880 17880:D3,68|3b650c7303ff5524ff308b4004e84600000089c18b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000c390900000000040000000|@17882,63,@4238|14,1,@17881 53,0,0 17881:D3,136|3b650c7303ff5524a801756b8b088b55008d52e43b55087303ff5520895500c742fc030000008b5904895a088b31897204c702010000008d7a10c747fc02000000c74704030000008917578b500489d090e8aaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000084000000|@6329,63,@4237|51,0,0 68,0,1 120,0,0 17882:S25|434f44455452454528292e6d6b426567696e4c6f6f70283129 17883:O3|3,@17884,@5234 17884:O2|@17694,@17885 17885:O2|@17886,0 17886:O2|50,@17887 17887:O5|5,@17888,@5788,@5786,@5229 17888:O2|@17817,0 17889:O2|@17891,@17890 17890:O2|@17892,0 17891:S11|6d616368696e65576f7264 17892:O4|@4600,69,@17893,0 17893:O2|@17894,0 17894:O3|@17891,@5229,@17895 17895:O3|@17897,@17900,@17896 17896:O3|@17901,@5256,@5255 17897:O2|1,@17898 17898:O3|2,@17899,0 17899:O4|0,@4778,3,1 17900:O4|1,@4779,0,0 17901:S27|506f6c794d4c2e436f6465547265652e6d616368696e65576f7264 17902:O2|@17904,@17903 17903:O2|@17905,0 17904:S5|6d6b496e64 17905:O4|@4596,69,@17906,0 17906:O7|@17904,2,@17908,@17907,@5229,0,0 17907:O3|2,@17817,@12339 17908:O2|1,@17909 17909:O3|2,@17910,0 17910:O1|@17911 17911:D3,96|3b650c7303ff55248b48048339057517ba010000008b1c2489142489da8b1889c852e9b9bfeaff8b108b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000895008894804c7000d000000c3909090000000005c000000|@17912,1048575,@4239|17,0,0 35,1,@6843 68,0,0 80,0,6 17912:S37|434f4445545245455f46554e4354494f4e5328292e6d6b496e646972656374283129283129 17913:O2|@17915,@17914 17914:O2|@17916,0 17915:S10|6d6b46756e6374696f6e 17916:O4|@4596,69,@17917,0 17917:O7|@17915,2,@17918,@17701,@5229,0,0 17918:O2|1,@17919 17919:O3|2,@17920,0 17920:O1|@17921 17921:D3,228|3b650c7303ff5524ff7010ff30ff700cff7008bb402d91b28b40049090e89e0beaff813c2448c052087427f604240175288b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017507b98cc77ab2eb038b0c2489cb89c683c4045890e82a85feff89c789f0909090e89285feff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c030000008b542404895118c741140300000089411089790cc74108010000008959045883c40489018b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f000000c39000000000e0000000|@17925,1048575,@4241|20,0,@17922 30,1,@6547 37,0,I48 53,0,I48 58,0,4 83,0,@6130 102,1,@16722 114,1,@16723 145,0,1 159,0,1 172,0,0 214,0,7 17922:O1|@17923 17923:D3,16|b803000000c39090000000000c000000|@17924,1,@4240|1,0,1 17924:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283529283129 17925:S41|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283129 17926:O2|@17928,@17927 17927:O2|@17929,0 17928:S6|6d6b4c6f6f70 17929:O4|@4596,69,@17930,0 17930:O7|@17928,2,@17931,@17732,@5229,0,0 17931:O2|1,@17932 17932:O3|2,@17933,0 17933:O1|@17934 17934:D3,60|3b650c7303ff552490e84200000089c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70013000000c390900000000038000000|@17936,7,@4243|10,1,@17935 45,0,9 17935:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@4242|39,0,1 92,0,0 17936:S20|434f44455452454528292e6d6b4c6f6f70283129 17937:O2|@17939,@17938 17938:O2|@17940,0 17939:S6|6576616c7565 17940:O4|@4596,69,@17941,0 17941:O7|@17939,2,@17943,@17942,@5229,0,0 17942:O3|2,@12339,@17948 17943:O2|1,@17944 17944:O3|2,@17945,0 17945:O1|@17946 17946:D3,52|833805751e8b48048b45008d40f83b45087303ff5520894500c740fc010000008908c3b801000000c39090900000000030000000|@17947,3,@4244|36,0,0 17947:S30|434f4445545245455f46554e4354494f4e5328292e6576616c7565283129 17948:O5|5,@17949,@12166,@12023,@5229 17949:O2|@17950,0 17950:O5|5,0,@17891,@17894,@5229 17951:O2|@17953,@17952 17952:O2|@17954,0 17953:S14|6d6b4c6f6164417267756d656e74 17954:O4|@4596,69,@17955,0 17955:O7|@17953,2,@17956,@17794,@5229,0,0 17956:O2|1,@17957 17957:O3|2,@15879,0 17958:O2|@17960,@17959 17959:O2|@17961,0 17960:S10|6d6b436f6e7374616e74 17961:O4|@4596,69,@17962,0 17962:O7|@17960,2,@17964,@17963,@5229,0,0 17963:O3|2,@17950,@12339 17964:O2|1,@17965 17965:O3|2,@17966,0 17966:O1|@17967 17967:D3,52|89c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70005000000c3900000000030000000|@17968,3,@4245|29,0,0 38,0,2 17968:S21|434f44455452454528292e6d6b436f6e7374283129 17969:O2|@17971,@17970 17970:O2|@17972,0 17971:S11|6d6b4c6f61644c6f63616c 17972:O4|@4596,69,@17973,0 17973:O7|@17971,2,@17974,@17794,@5229,0,0 17974:O2|1,@17975 17975:O3|2,@17976,0 17976:O1|@17977 17977:D3,92|a801740783f8017c08eb12f640ff10740c89c1b8a4727db28b5d04ff138b4d008d49e83b4d087303ff5520894d00c741fc02000000894104c701050000008d410cc740fc02000000894804c70009000000c390900000000058000000|@8043,3,@4246|20,0,@7993 58,0,2 77,0,4 17978:O2|@17781,@17979 17979:O2|@17980,0 17980:O4|@4600,69,@17981,0 17981:O2|@17780,0 17982:O2|@17984,@17983 17983:O2|@17985,0 17984:S6|6d6b43616c6c 17985:O4|@4596,69,@17986,0 17986:O7|@17984,2,@17988,@17987,@5229,0,0 17987:O3|2,@17994,@12339 17988:O2|1,@17989 17989:O3|2,@17990,0 17990:O1|@17991 17991:D3,72|3b650c7303ff55248b188b4004e84a00000089c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c03000000895808894804c70007000000c30000000044000000|@17993,15,@4248|14,1,@17992 47,0,1 59,0,3 17992:D3,108|3b650c7303ff5524a801754f8b4d008d49f43b4d087303ff5520894d00c741fc02000000c74104030000008b108911518b500489d0e8c6ffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c3b801000000c39090900000000068000000|@6329,7,@4247|39,0,1 92,0,0 17993:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c6543616c6c283129 17994:O3|3,@17995,@5234 17995:O2|@17694,@17996 17996:O2|@17997,0 17997:O2|50,@17719 17998:O2|@18000,@17999 17999:O2|@18001,0 18000:S12|6d6b4d757475616c44656373 18001:O4|@4596,69,@18002,0 18002:O7|@18000,2,@18004,@18003,@5229,0,0 18003:O3|2,@17887,@17779 18004:O2|1,@18005 18005:O3|2,@18006,0 18006:O1|@18007 18007:D3,76|3b650c7303ff552483f801750c89c1b8a4f88eb28b5d04ff13e852c3fdff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804c70007000000c390900000000048000000|@18008,63,@4249|16,0,@16373 26,1,@16376 61,0,3 18008:S26|434f44455452454528292e6d6b4d757475616c44656373283129 18009:O2|@18011,0 18010:S11|72747346756e6374696f6e 18011:O4|@4596,69,@18012,0 18012:O7|@18010,2,@18013,@17794,@5229,0,0 18013:O2|1,@18014 18014:O3|2,@18015,0 18015:O1|@18016 18016:D3,68|3b650c7303ff5524ff15e8d1520889c18b45008d40f03b45087303ff5520894500c740fc03000000c7400801000000894804c70005000000c39090900000000040000000|@18017,2097151,@4250|10,0,I189 43,0,0 52,0,2 18017:S25|434f44455452454528292e72747346756e6374696f6e283129 18018:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4251|1,0,@12350 18019:O2|@6024,@18020 18020:O2|@18021,0 18021:O4|@4596,69,@6022,0 18022:O2|@5629,@18023 18023:O2|@18024,0 18024:O4|@4596,69,@17485,0 18025:O2|@6343,@18026 18026:O2|@18027,0 18027:O4|@4596,69,@18028,0 18028:O7|@6343,2,@18030,@18029,@5229,0,0 18029:O3|2,@18031,@18031 18030:O2|3,7 18031:O3|6,@4780,79993 18032:O2|@6042,@18033 18033:O2|@18034,0 18034:O4|@4596,69,@6040,0 18035:O2|@18037,@18036 18036:O2|@18038,0 18037:S17|4465627567676572496e74657266616365 18038:O4|@4611,69,@18039,0 18039:O4|@18037,@5500,@18040,@5229 18040:O6|@18042,I48,0,@5229,@18041,0 18041:O1|@18640 18042:O4|1,@4782,@4783,@4781 18043:O2|@18631,@18630 18044:O2|@18046,@18045 18045:O2|@18047,0 18046:S9|456e76547970656964 18047:O4|@4596,69,@18048,0 18048:O7|@18046,@18050,@18051,@18049,@5229,0,0 18049:O3|2,@18069,@18068 18050:O2|0,8 18051:O2|1,@18052 18052:O3|14,@18053,0 18053:O2|@18055,@18054 18054:O2|@18059,@18058 18055:O2|7,@18056 18056:O8|@18057,@18046,0,0,@5276,0,0,1 18057:O4|13,5,@5532,7 18058:O2|@18066,0 18059:O2|7,@18060 18060:O8|@18061,@18046,0,0,@5276,0,0,1 18061:O4|3,@5357,@18062,1 18062:O2|7,@18063 18063:O8|@18064,@6130,0,0,@5276,0,0,1 18064:O3|14,@18065,1 18065:O2|@6036,@6133 18066:O2|7,@18067 18067:O8|@6139,@18046,0,0,@5276,0,0,1 18068:O5|5,0,@18085,@18084,@5229 18069:O3|3,@18070,@5234 18070:O2|@18072,@18071 18071:O2|@18083,0 18072:O2|49,@18073 18073:O5|5,0,@18075,@18074,@5229 18074:O3|@18075,@5229,@18076 18075:S6|747970654964 18076:O3|@18078,@18081,@18077 18077:O3|@18082,@5256,@5255 18078:O2|1,@18079 18079:O3|2,@18080,0 18080:O4|0,@4785,3,1 18081:O4|1,@4786,0,0 18082:S31|506f6c794d4c2e4465627567676572496e746572666163652e747970654964 18083:O2|50,@18073 18084:O3|@18085,@5229,@18086 18085:S12|656e7669726f6e456e747279 18086:O3|@18088,@18091,@18087 18087:O3|@18092,@5256,@5255 18088:O2|1,@18089 18089:O3|2,@18090,0 18090:O4|0,@4787,3,1 18091:O4|1,@4788,0,0 18092:S37|506f6c794d4c2e4465627567676572496e746572666163652e656e7669726f6e456e747279 18093:O2|@18095,@18094 18094:O2|@18096,0 18095:S16|6c6f636174696f6e50726f704c697374 18096:O4|@4600,69,@18097,0 18097:O2|@18098,0 18098:O3|@18095,@5229,@18099 18099:O3|@18101,@18104,@18100 18100:O3|@18105,@5256,@5255 18101:O2|1,@18102 18102:O3|2,@18103,0 18103:O4|0,@4789,3,1 18104:O4|1,@4790,0,0 18105:S41|506f6c794d4c2e4465627567676572496e746572666163652e6c6f636174696f6e50726f704c697374 18106:O2|@18085,@18107 18107:O2|@18108,0 18108:O4|@4600,69,@18109,0 18109:O2|@18084,@18110 18110:O2|@18112,@18111 18111:O2|@18159,@18158 18112:O7|@18114,@18050,@18115,@18113,@5229,0,0 18113:O3|2,@18142,@18068 18114:S14|456e76456e6446756e6374696f6e 18115:O2|1,@18116 18116:O3|14,@18117,0 18117:O2|@18119,@18118 18118:O2|@18123,@18122 18119:O2|7,@18120 18120:O8|@18121,@18114,0,0,@5276,0,0,1 18121:O4|13,0,@5532,7 18122:O2|@18133,0 18123:O2|7,@18124 18124:O8|@18125,@18114,0,0,@5276,0,0,1 18125:O4|3,@5357,@18126,1 18126:O2|7,@18127 18127:O8|@18128,@6130,0,0,@5276,0,0,1 18128:O3|14,@18129,1 18129:O2|@5348,@18130 18130:O2|@5532,@18131 18131:O2|@6136,@18132 18132:O2|@17604,0 18133:O2|7,@18134 18134:O8|@18135,@18114,0,0,@5276,0,0,1 18135:O4|3,@5357,@18136,1 18136:O2|7,@18137 18137:O8|@18138,@6130,0,0,@5276,0,0,1 18138:O3|14,@18139,0 18139:O2|@5711,@18140 18140:O2|@6145,@18141 18141:O2|@17631,0 18142:O3|3,@18143,@12016 18143:O2|@12043,@18144 18144:O2|@18146,@18145 18145:O2|@18147,0 18146:O2|50,@5933 18147:O2|51,@18148 18148:O5|5,0,@18150,@18149,@5229 18149:O3|@18150,@5229,@18151 18150:S9|6c6f63616c54797065 18151:O3|@18153,@18156,@18152 18152:O3|@18157,@5256,@5255 18153:O2|1,@18154 18154:O3|2,@18155,0 18155:O4|0,@4791,3,1 18156:O4|1,@4792,0,0 18157:S34|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065 18158:O2|@18187,@18186 18159:O7|@18161,@18050,@18162,@18160,@5229,0,0 18160:O3|2,@18179,@18068 18161:S12|456e76457863657074696f6e 18162:O2|1,@18163 18163:O3|14,@18164,0 18164:O2|@18166,@18165 18165:O2|@18170,@18169 18166:O2|7,@18167 18167:O8|@18168,@18161,0,0,@5276,0,0,1 18168:O4|13,1,@5532,7 18169:O2|@18177,0 18170:O2|7,@18171 18171:O8|@18172,@18161,0,0,@5276,0,0,1 18172:O4|3,@5357,@18173,1 18173:O2|7,@18174 18174:O8|@18175,@6130,0,0,@5276,0,0,1 18175:O3|14,@18176,1 18176:O2|@5281,@18130 18177:O2|7,@18178 18178:O8|@18135,@18161,0,0,@5276,0,0,1 18179:O3|3,@18180,@12016 18180:O2|@12043,@18181 18181:O2|@18183,@18182 18182:O2|@18184,0 18183:O2|50,@18148 18184:O2|51,@18185 18185:O5|5,0,@18095,@18098,@5229 18186:O2|@18207,@18206 18187:O7|@18189,@18050,@18188,@18113,@5229,0,0 18188:O2|1,@18190 18189:S16|456e76537461727446756e6374696f6e 18190:O3|14,@18191,0 18191:O2|@18193,@18192 18192:O2|@18197,@18196 18193:O2|7,@18194 18194:O8|@18195,@18189,0,0,@5276,0,0,1 18195:O4|13,2,@5532,7 18196:O2|@18204,0 18197:O2|7,@18198 18198:O8|@18199,@18189,0,0,@5276,0,0,1 18199:O4|3,@5357,@18200,1 18200:O2|7,@18201 18201:O8|@18202,@6130,0,0,@5276,0,0,1 18202:O3|14,@18203,1 18203:O2|@5759,@18130 18204:O2|7,@18205 18205:O8|@18135,@18189,0,0,@5276,0,0,1 18206:O2|@18242,@18241 18207:O7|@18209,@18050,@18210,@18208,@5229,0,0 18208:O3|2,@18227,@18068 18209:S12|456e76537472756374757265 18210:O2|1,@18211 18211:O3|14,@18212,0 18212:O2|@18214,@18213 18213:O2|@18218,@18217 18214:O2|7,@18215 18215:O8|@18216,@18209,0,0,@5276,0,0,1 18216:O4|13,3,@5532,7 18217:O2|@18225,0 18218:O2|7,@18219 18219:O8|@18220,@18209,0,0,@5276,0,0,1 18220:O4|3,@5357,@18221,1 18221:O2|7,@18222 18222:O8|@18223,@6130,0,0,@5276,0,0,1 18223:O3|14,@18224,1 18224:O2|@5897,@18130 18225:O2|7,@18226 18226:O8|@18135,@18209,0,0,@5276,0,0,1 18227:O3|3,@18228,@12016 18228:O2|@12043,@18229 18229:O2|@18230,@18182 18230:O2|50,@18231 18231:O5|5,0,@18233,@18232,@5229 18232:O3|@18233,@5229,@18234 18233:S8|6c6f63616c536967 18234:O3|@18236,@18239,@18235 18235:O3|@18240,@5256,@5255 18236:O2|1,@18237 18237:O3|2,@18238,0 18238:O4|0,@4793,3,1 18239:O4|1,@4794,0,0 18240:S33|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c536967 18241:O2|@18048,@18276 18242:O7|@18244,@18050,@18245,@18243,@5229,0,0 18243:O3|2,@18262,@18068 18244:S10|456e7654436f6e737472 18245:O2|1,@18246 18246:O3|14,@18247,0 18247:O2|@18249,@18248 18248:O2|@18253,@18252 18249:O2|7,@18250 18250:O8|@18251,@18244,0,0,@5276,0,0,1 18251:O4|13,4,@5532,7 18252:O2|@18260,0 18253:O2|7,@18254 18254:O8|@18255,@18244,0,0,@5276,0,0,1 18255:O4|3,@5357,@18256,1 18256:O2|7,@18257 18257:O8|@18258,@6130,0,0,@5276,0,0,1 18258:O3|14,@18259,1 18259:O2|@5375,@6133 18260:O2|7,@18261 18261:O8|@6139,@18244,0,0,@5276,0,0,1 18262:O3|3,@18263,@5234 18263:O2|@12043,@18264 18264:O2|@18265,0 18265:O2|50,@18266 18266:O5|5,0,@18268,@18267,@5229 18267:O3|@18268,@5229,@18269 18268:S15|6c6f63616c54797065436f6e737472 18269:O3|@18271,@18274,@18270 18270:O3|@18275,@5256,@5255 18271:O2|1,@18272 18272:O3|2,@18273,0 18273:O4|0,@4795,3,1 18274:O4|1,@4796,0,0 18275:S40|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065436f6e737472 18276:O2|@18278,@18277 18277:O2|@18302,0 18278:O7|@18280,@18050,@18281,@18279,@5229,0,0 18279:O3|2,@18293,@18068 18280:S10|456e7656436f6e737472 18281:O2|1,@18282 18282:O3|14,@18283,0 18283:O2|@18285,@18284 18284:O2|@18289,@18288 18285:O2|7,@18286 18286:O8|@18287,@18280,0,0,@5276,0,0,1 18287:O4|13,6,@5532,7 18288:O2|@18291,0 18289:O2|7,@18290 18290:O8|@6052,@18280,0,0,@5276,0,0,1 18291:O2|7,@18292 18292:O8|@5711,@18280,0,0,@5276,0,0,1 18293:O3|3,@18294,@17711 18294:O2|@12043,@18295 18295:O2|@18183,@18296 18296:O2|@18298,@18297 18297:O2|@18300,@18299 18298:O2|51,@5232 18299:O2|@18301,0 18300:O2|52,@5307 18301:O2|53,@18185 18302:O7|@18304,@18050,@18303,@18160,@5229,0,0 18303:O2|1,@18305 18304:S8|456e7656616c7565 18305:O3|14,@18306,0 18306:O2|@18308,@18307 18307:O2|@18312,@18311 18308:O2|7,@18309 18309:O8|@18310,@18304,0,0,@5276,0,0,1 18310:O4|13,7,@5532,7 18311:O2|@18319,0 18312:O2|7,@18313 18313:O8|@18314,@18304,0,0,@5276,0,0,1 18314:O4|3,@5357,@18315,1 18315:O2|7,@18316 18316:O8|@18317,@6130,0,0,@5276,0,0,1 18317:O3|14,@18318,1 18318:O2|@6072,@18130 18319:O2|7,@18320 18320:O8|@18135,@18304,0,0,@5276,0,0,1 18321:O2|@18323,@18322 18322:O2|@18324,0 18323:S9|6d616b6556616c7565 18324:O4|@4596,69,@18325,0 18325:O7|@18323,2,@18327,@18326,@5229,0,0 18326:O3|2,@18365,@18364 18327:O2|1,@18328 18328:O3|2,@18329,0 18329:O1|@18330 18330:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700904d91b28948048060ffbfc3000000002c000000|@18363,3,@4264|28,0,@18331 18331:D3,248|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c7019c4e91b28b52048951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702f85791b2894a048062ffbfff7008ff30ff700c52bb0c5991b28b4004909090e8fab9e9ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c701050000008b55008d52d43b55087303ff5520895500c742fc02000000894a04c7020300000089c18d420cc740fc07000000c7401801000000c74014010000008b5c240489581089480c895008c74004050000005983c4048908c390909000000000f4000000|@18362,2097151,@4263|34,0,@18332 74,0,@18353 95,0,@18360 106,1,@6446 137,0,0 147,0,2 180,0,1 199,0,0 206,0,0 226,0,2 18332:D3,88|3b650c7303ff55248b08833903750e8b5804833b037506b801000000c38b5a04ff7304ff73088b1389d3909090e83a00000089c18b45008d40f83b45087303ff5520894500c740fc010000008908c3900000000054000000|@18352,1048575,@4258|24,0,0 46,1,@18333 18333:D3,1056|3b650c7303ff552450683c5391b2508d4c24045189d98b5c241889c890e82e06000083f801756c8b04248b480483390375668b58088b7108b801000000e87eadeaff535650bb2c5791b2b8050000009090e8aae8e9ff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000eb0ae975030000e95d010000c74104302f89b2c701f0707ab28b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000089c3b8585791b2909090e8b6abeaff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c74004702f89b289088d480cc741fc0200000089410489198d410cc740fc03000000c7400801000000894804c7001d000000f6c1017408909090e852c9eaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b4424088b5004833a05750ab808377bb28b5d04ff13833a0175148b5a08833b0375078b73048b36eb0c8b7304eb078b5a048b1b89de8b5d008d5bd43b5d087303ff5520895d00c743fc0100004089338d7308c746fc04000000c7460c010000005f897e08895e04c706030000008d4614c740fc030000005a895008897004890883c40cc2080083390175718b58088b7104b801000000909090e8aeabeaff535650bb7c5791b2b8050000009090e8dae6e9ff8b4d008d49dc3b4d087303ff5520894d00c741fc08000000c7411c03000000c7411801000000c74114030000008941105889410cc7410801000000c74104302f89b2c701f0707ab2eb05e94d0100008b45008d40f43b45087303ff5520894500c740fc02000000894804c7000f00000089c3b8585791b2e8eea9eaff8b4d008d49c43b4d087303ff5520894d00c741fc04000000c7410c03000000c74108602f89b2894104c701070000008d4114c740fc02000000c74004702f89b289088d480cc741fc0200000089410489198d410cc740fc03000000c7400801000000894804c7001d000000f6c1017408909090e88ac7eaff8b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c701030000008b4424088b5004833a05750ab808377bb28b5d04ff13833a0175148b5a08833b0375078b73048b36eb0c8b7304eb078b5a048b1b89de8b5d008d5bd43b5d087303ff5520895d00c743fc0100004089338d7308c746fc04000000c7460c010000005f897e08895e04c706030000008d4614c740fc030000005a895008897004890883c40cc208008b55008d52e03b55087303ff5520895500c742fc030000008b5908895a088b7104897204c702050000008b78088d4210c740fc030000008978088950049090c70070867ab283c40cc208008b0083c40cc20800909090000000001c040000|@18351,1048575,@4257|10,0,@18334 30,1,@18342 57,0,0 62,1,@6884 70,0,@18344 75,0,2 82,1,@6547 113,0,1 120,0,0 127,0,1 141,0,0 160,0,@13614 166,0,@5281 199,0,7 206,0,@18346 214,1,@6881 245,0,1 252,0,@13616 261,0,3 278,0,@13617 312,0,0 321,0,14 334,1,@6933 367,0,1 384,0,@6539 464,0,0 477,0,1 518,0,0 526,1,@6884 534,0,@18349 539,0,2 546,1,@6547 577,0,1 584,0,0 591,0,1 605,0,0 612,0,@13614 618,0,@5281 658,0,7 665,0,@18346 670,1,@6881 701,0,1 708,0,@13616 717,0,3 734,0,@13617 768,0,0 777,0,14 790,1,@6933 823,0,1 840,0,@6539 920,0,0 933,0,1 1000,0,2 1027,0,@5500 18334:D3,40|3b650c7303ff55248b52048b0c248914248b58048b1089d051e91e00000090900000000024000000|@18341,63,@4253|26,1,@18335 18335:D3,252|83380b755a8b48088b5104833a0375168b7424048b7e04833f03750a8b4a043b4f047566eb27833a0175648b7424048b7e04833f01755d8b4a0cf6c1017509f6470c017503ff55383b4f0c75748b48048b5104833a037411b8885491b2eb05e9860000008b5d04ff138b45008d40cc3b45087303ff5520894500c740fc03000000c7400801000000eb0fe953000000e94e000000e949000000895804c700050000008d5810c743fc02000000894304c703030000008d430cc740fc03000000eb05e91c0000008b7108897008895004891889c38d4010c740fc010000008918c20400b801000000c20400b801000000c20400909000000000f8000000|@18340,63,@4252|89,0,@18336 132,0,0 158,0,2 177,0,1 227,0,0 235,0,0 18336:O4|@4608,@5398,@18338,@18337 18337:O5|@18339,160,0,160,0 18338:S24|736561726368547970653a205479706546756e6374696f6e 18339:S33|6d6c736f757263652f4d4c436f6d70696c65722f44454255474745525f2e736d6c 18340:S33|44454255474745525f28292e736561726368547970652834296d61746368283229 18341:S33|44454255474745525f28292e736561726368547970652834296d61746368283129 18342:D3,412|3b650c7303ff5524a801754bf6c301754b8b48048b108b45008d40f43b45087303ff5520894500c740fc020000008b338970048910ff73045153528b54241490ff1283f80175708b04248b00b9ba5591b28d4c81fcffe1e92f010000e92a01000090e95a000000909090e96a000000909090e97a000000909090e98a000000909090e99a000000909090e913000000909090e9a2000000909090e9b20000009090908b442414894424148b5c240c83c4085883c404eb05e9ad000000e93fffffff8b442414894424148b5c240c83c4085883c404e927ffffff8b442414894424148b5c240c83c4085883c404e90fffffff8b442414894424148b5c240c83c4085883c404e9f7feffff8b442414894424148b5c240c83c4085883c404e9dffeffff8b442414894424148b5c240483c4085883c404e9c7feffff8b442414894424148b5c240c83c4085883c404e9affeffff8b442414894424148b5c240c83c4085883c404e997feffff8b088b45008d40f83b45087303ff5520894500c740fc01000000890883c410c20400b801000000c20400900000000098010000|@18343,1048575,@4254|77,0,$18342+98 396,0,0 18343:S25|44454255474745525f28292e736561726368456e7673283329 18344:O1|@18345 18345:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4255|1,0,@5280 18346:O2|@5281,@18347 18347:O2|@13615,@18348 18348:O2|@6836,0 18349:O1|@18350 18350:D3,16|b8e4707ab2c39090000000000c000000|@6890,1,@4256|1,0,@5280 18351:S25|44454255474745525f28292e73656172636854797065283429 18352:S35|44454255474745525f28292e72756e54696d6554797065283229636f70794964283129 18353:D3,96|3b650c7303ff55246a016a016a01686c5891b268bc5891b26a018d4c240c518b5a04909090e8e2abe9ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@18359,2097151,@4261|15,0,@18354 20,0,@18357 38,1,@6437 18354:O1|@18355 18355:D3,12|c39090900000000008000000|@18356,1,@4259| 18356:S32|44454255474745525f28292e72756e54696d6554797065283229283129283129 18357:O1|@18358 18358:D3,12|c39090900000000008000000|@18356,1,@4260| 18359:S29|44454255474745525f28292e72756e54696d6554797065283229283129 18360:O1|@18361 18361:D3,12|c39090900000000008000000|@18359,1,@4262| 18362:S27|44454255474745525f28292e6d616b6556616c7565283129283129 18363:S24|44454255474745525f28292e6d616b6556616c7565283129 18364:O3|2,@18392,@12085 18365:O5|5,0,@18367,@18366,@5229 18366:O3|@18367,@5229,@18368 18367:S10|64656275675374617465 18368:O3|@5500,@18370,@18369 18369:O3|@18391,@5256,@5255 18370:O3|2,0,@18371 18371:O3|3,@18372,@12016 18372:O2|@18374,@18373 18373:O2|@18378,@18377 18374:O2|49,@18375 18375:O5|5,@18376,@5788,@5786,@5229 18376:O2|@18068,0 18377:O2|@18390,0 18378:O2|50,@18379 18379:O5|5,@18380,@5788,@5786,@5229 18380:O2|@18381,0 18381:O5|5,0,@17891,@18382,@5229 18382:O3|@17891,@5229,@18383 18383:O3|@18385,@18388,@18384 18384:O3|@18389,@5256,@5255 18385:O2|1,@18386 18386:O3|2,@18387,0 18387:O4|0,@4797,3,1 18388:O4|1,@4798,0,0 18389:S36|506f6c794d4c2e4465627567676572496e746572666163652e6d616368696e65576f7264 18390:O2|51,@5933 18391:S35|506f6c794d4c2e4465627567676572496e746572666163652e64656275675374617465 18392:O3|3,@18393,@17634 18393:O2|@12043,@18394 18394:O2|@18183,@18395 18395:O2|@18184,@18396 18396:O2|@18397,0 18397:O2|52,@18381 18398:O2|@18400,@18399 18399:O2|@18401,0 18400:S9|7365744f6e45786974 18401:O4|@4596,69,@18402,0 18402:O7|@18400,2,@18404,@18403,@5229,0,0 18403:O3|2,@18413,@6000 18404:O2|1,@18405 18405:O3|2,@18406,0 18406:O2|@18407,@4762 18407:D3,80|a80175328b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c05c91b28b008941048061ffbf8b5204890ab801000000c38b5204c70201000000b801000000c3909090000000004c000000|@18412,7,@4267|30,0,@18408 49,0,0 59,0,0 64,0,0 18408:D3,24|3b650c7303ff55248b5a04e91c0000000000000014000000|@18411,2097151,@4266|12,1,@18409 18409:D3,500|3b650c7303ff55248b4d3c8b51148b71188b791c51578b7920575652ff7504b9265d91b25189650489da9090ff1283c40458894504eb6b9090908b650483c4045b895d048b4c24108b14248951148b5c24048959188b74240c89711c8b7c24088979208b4d008d49f83b4d087303ff5520894d00c741fc01000040c70101000000c701b42c7ab2b9ffffff002348fc8d4c090183f909725f8b480cf6c101755ceb05e91f0100008b55008d52e83b55087303ff5520895500c742fc050000008b5908895a108b711089720c8b7904897a088b790c897a048b19891a8b5d008d5bf83b5d087303ff5520895d00c743fc010000008913eb11e907000000bb01000000eb05bb01000000f6c30174388b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c68387ab28b50088951088b70048971048b38893989c289c88b5d04ff138b0b8b55008d52f83b55087303ff5520895500c742fc01000040c70201000000c70280387ab28b108b70048b40088b7d008d7fd43b7d087303ff5520897d00c747fc050000008b590c895f108b5904895f0c8b5910895f088b5908895f048b19891f8d4f18c741fc0400000089790c894108897104891189c89090ff1508bc52088b44241059894814598948188b4c240489481c5983c404894820b80100000083c404c390909000000000f0010000|@18410,2097151,@4265|32,0,$18409+58 125,0,0 131,0,@5039 136,0,8388607 253,0,0 260,0,0 296,0,@5065 353,0,0 359,0,@5066 450,0,I14 481,0,0 18410:S19|44454255474745525f28292e77726170283229 18411:S22|44454255474745525f28292e77726170283129283129 18412:S24|44454255474745525f28292e7365744f6e45786974283129 18413:O5|5,@18414,@12166,@12023,@5229 18414:O2|@18415,0 18415:O3|2,@18416,@6000 18416:O3|3,@18417,@5234 18417:O2|@12043,@18418 18418:O2|@18146,0 18419:O2|@18244,@18420 18420:O2|@18421,0 18421:O4|@4596,69,@18242,0 18422:O2|@18233,@18423 18423:O2|@18424,0 18424:O4|@4600,69,@18425,0 18425:O2|@18232,0 18426:O2|@18428,@18427 18427:O2|@18429,0 18428:S15|6d616b65436f6e7374727563746f72 18429:O4|@4596,69,@18430,0 18430:O7|@18428,2,@18432,@18431,@5229,0,0 18431:O3|2,@18365,@18447 18432:O2|1,@18433 18433:O3|2,@18434,0 18434:O1|@18435 18435:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700ec6091b28948048060ffbfc3000000002c000000|@18446,3,@4274|28,0,@18436 18436:D3,268|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c7010c6291b28b52048951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702786291b2894a048062ffbfff7010ff30ff700cff7008ff701452bb3c6391b28b400490e89aa6e9ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c701050000008b55008d52c83b55087303ff5520895500c742fc02000000894a04c702030000008d4a0cc741fc020000008b5c24048959045b83c404891989c38d410cc740fc07000000c7401801000000c74014010000008b74240489701089580c8950088948045983c4048908c30000000008010000|@18445,2097151,@4273|34,0,@18437 74,0,@18438 101,0,@18443 110,1,@6446 141,0,0 151,0,2 184,0,1 226,0,0 233,0,0 18437:D3,88|3b650c7303ff55248b08833903750e8b5804833b037506b801000000c38b5a04ff7304ff73088b1389d3909090e8caecffff89c18b45008d40f83b45087303ff5520894500c740fc010000008908c3900000000054000000|@18352,1048575,@4268|24,0,0 46,1,@18333 18438:D3,96|3b650c7303ff55246a016a016a0168ec6291b268146391b26a018d4c240c518b5a04909090e862a1e9ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@18359,2097151,@4271|15,0,@18439 20,0,@18441 38,1,@6437 18439:O1|@18440 18440:D3,12|c39090900000000008000000|@18356,1,@4269| 18441:O1|@18442 18442:D3,12|c39090900000000008000000|@18356,1,@4270| 18443:O1|@18444 18444:D3,12|c39090900000000008000000|@18359,1,@4272| 18445:S33|44454255474745525f28292e6d616b65436f6e7374727563746f72283129283129 18446:S30|44454255474745525f28292e6d616b65436f6e7374727563746f72283129 18447:O3|2,@18448,@12085 18448:O3|3,@18450,@18449 18449:O3|0,@18457,1 18450:O2|@12043,@18451 18451:O2|@18183,@18452 18452:O2|@18298,@18453 18453:O2|@18300,@18454 18454:O2|@18301,@18455 18455:O2|@18456,0 18456:O2|54,@18381 18457:O2|49,@18458 18458:O2|50,@18459 18459:O2|51,@18460 18460:O2|52,@18461 18461:O2|53,@18462 18462:O2|54,0 18463:O2|@18268,@18464 18464:O2|@18465,0 18465:O4|@4600,69,@18466,0 18466:O2|@18267,0 18467:O2|@18469,@18468 18468:O2|@18470,0 18469:S18|7365744f6e45786974457863657074696f6e 18470:O4|@4596,69,@18471,0 18471:O7|@18469,2,@18473,@18472,@5229,0,0 18472:O3|2,@18481,@6000 18473:O2|1,@18474 18474:O3|2,@18475,0 18475:O2|@18476,@4763 18476:D3,80|a80175328b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c06591b28b008941048061ffbf8b5204890ab801000000c38b5204c70201000000b801000000c3909090000000004c000000|@18480,7,@4277|30,0,@18477 49,0,0 59,0,0 64,0,0 18477:D3,64|3b650c7303ff55248b520490ff1289c18b45008d40f43b45087303ff5520894500c740fc02000000c700146691b28948048060ffbfc39090000000003c000000|@18479,1048575,@4276|42,0,@18478 18478:D3,24|3b650c7303ff55248b5a04e9c8f6ffff0000000014000000|@18411,2097151,@4275|12,1,@18409 18479:S36|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129283129 18480:S33|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129 18481:O5|5,@18482,@12166,@12023,@5229 18482:O2|@18483,0 18483:O3|2,@18416,@18484 18484:O3|2,@14221,@6000 18485:O2|@18280,@18486 18486:O2|@18487,0 18487:O4|@4596,69,@18278,0 18488:O2|@18209,@18489 18489:O2|@18490,0 18490:O4|@4596,69,@18207,0 18491:O2|@18189,@18492 18492:O2|@18493,0 18493:O4|@4596,69,@18187,0 18494:O2|@18496,@18495 18495:O2|@18497,0 18496:S9|756e697456616c7565 18497:O4|@4596,69,@18498,0 18498:O7|@18496,2,@18499,@12085,@5229,0,0 18499:O2|1,@18500 18500:O3|2,@18501,0 18501:O7|I48,2,@5500,@6000,0,0,0 18502:O2|@18504,@18503 18503:O2|@18505,0 18504:S14|6d616b6554797065436f6e737472 18505:O4|@4596,69,@18506,0 18506:O7|@18504,2,@18508,@18507,@5229,0,0 18507:O3|2,@18365,@18515 18508:O2|1,@18509 18509:O3|2,@18510,0 18510:O1|@18511 18511:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700d86891b28948048060ffbfc3000000002c000000|@18514,3,@4279|28,0,@18512 18512:D3,120|3b650c7303ff55248b088b5a0451ff7304ff73088b0389c38b41089090e80ee6ffff8b0c248b55008d52f03b55087303ff5520895500c742fc030000008942088b410483c4048942048b19891a8b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008910c3900000000074000000|@18513,1048575,@4278|30,1,@18333 104,0,0 18513:S32|44454255474745525f28292e6d616b6554797065436f6e737472283129283129 18514:S29|44454255474745525f28292e6d616b6554797065436f6e737472283129 18515:O3|2,@18266,@12105 18516:O2|@18161,@18517 18517:O2|@18518,0 18518:O4|@4596,69,@18159,0 18519:O2|@18521,@18520 18520:O2|@18522,0 18521:S13|6d616b65537472756374757265 18522:O4|@4596,69,@18523,0 18523:O7|@18521,2,@18525,@18524,@5229,0,0 18524:O3|2,@18365,@18538 18525:O2|1,@18526 18526:O3|2,@18527,0 18527:O1|@18528 18528:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700cc6a91b28948048060ffbfc3000000002c000000|@18537,3,@4284|28,0,@18529 18529:D3,48|3b650c7303ff55248b48088b1c24890c24ff700cff720489da8b58048b0889c852e91e0000009090000000002c000000|@18536,63,@4283|34,1,@18530 18530:D3,412|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c701c06c91b28b5424048951048061ffbf8b75008d76f03b75087303ff5520897500c746fc03000000c7068c6d91b28b7b10897e04894e088066ffbf8b0b833903756d8b79048b3f8b490c8b098b1183fa017507b968c05208eb5a5189d150b801000000578d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4057f3ab5f89f08b74240889f989cf5189d1d1e983c604f3a58d7c3f018d7436018d4c09018b0c24eb0ae93b000000e90b0000008061ffbf83c40489c6eb046a0150578b45008d40f03b45087303ff5520894500c740fc0300000089480859894804c70001000000eb056a015089c88b4d008d49b43b4d087303ff5520894d00c741fc060000008b53148951148971108b730c89710cc74108010000008b7b0489790489018d411cc740fc03000000c74008010000008b7c2410897804c700050000008d7010c746fc02000000894604c706030000008d460cc740fc040000008b54241489500c8948088970045983c4048908c20c000000000098010000|@18535,63,@4282|26,0,@18531 67,0,@18534 109,0,I49 120,0,0 258,0,0 311,0,0 336,0,0 349,0,2 368,0,1 18531:D3,120|3b650c7303ff55248b4d008d49d83b4d087303ff5520894d00c741fc05000000c741100100000089410cc74108d8707ab2c7410401000000c701010000008d4118c740fc03000000c740084c6d91b2894804c70070867ab28b4a048b59048b3424891c24ff71088b1956e9d9e1ffff900000000074000000|@18533,1048575,@4280|35,0,0 45,0,@5279 52,0,0 58,0,0 75,0,@18532 84,0,@5500 107,1,@18333 18532:O3|I48,@5256,@5255 18533:S40|44454255474745525f28292e6d616b65537472756374757265283529676574467265654964283129 18534:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e99893e9ff0000000020000000|@6481,2097151,@4281|24,1,@6426 18535:S28|44454255474745525f28292e6d616b65537472756374757265283529 18536:S31|44454255474745525f28292e6d616b65537472756374757265283129283129 18537:S28|44454255474745525f28292e6d616b65537472756374757265283129 18538:O3|2,@18539,@12147 18539:O3|3,@18540,@17634 18540:O2|@12043,@18541 18541:O2|@18230,@18395 18542:O2|@17891,@18543 18543:O2|@18544,0 18544:O4|@4600,69,@18545,0 18545:O2|@18382,0 18546:O2|@18114,@18547 18547:O2|@18548,0 18548:O4|@4596,69,@18112,0 18549:O2|@18367,@18550 18550:O2|@18551,0 18551:O4|@4600,69,@18552,0 18552:O2|@18366,0 18553:O2|@18075,@18554 18554:O2|@18555,0 18555:O4|@4600,69,@18556,0 18556:O2|@18074,0 18557:O2|@18304,@18558 18558:O2|@18559,0 18559:O4|@4596,69,@18302,0 18560:O2|@18150,@18561 18561:O2|@18562,0 18562:O4|@4600,69,@18563,0 18563:O2|@18149,0 18564:O2|@18566,@18565 18565:O2|@18567,0 18566:S18|6d616b65416e6f6e796d6f757356616c7565 18567:O4|@4596,69,@18568,0 18568:O7|@18566,2,@18570,@18569,@5229,0,0 18569:O3|2,@18365,@18585 18570:O2|1,@18571 18571:O3|2,@18572,0 18572:O1|@18573 18573:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700847091b28948048060ffbfc3000000002c000000|@18584,3,@4291|28,0,@18574 18574:D3,240|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701887191b28b52048951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702f47191b2894a048062ffbfff700452bbb87291b28b0090e80e97e9ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c701050000008b55008d52d43b55087303ff5520895500c742fc02000000894a04c7020300000089c18d420cc740fc07000000c7401801000000c7401401000000c740100100000089480c895008c7400405000000c70048c05208c390909000000000ec000000|@18583,2097151,@4290|34,0,@18575 74,0,@18576 90,0,@18581 98,1,@6446 129,0,0 139,0,2 172,0,1 191,0,0 198,0,0 205,0,0 218,0,2 224,0,I48 18575:D3,88|3b650c7303ff55248b08833903750e8b5804833b037506b801000000c38b5a04ff7304ff73088b1389d3909090e84eddffff89c18b45008d40f83b45087303ff5520894500c740fc010000008908c3900000000054000000|@18352,1048575,@4285|24,0,0 46,1,@18333 18576:D3,96|3b650c7303ff55246a016a016a0168687291b268907291b26a018d4c240c518b5a04909090e8e691e9ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@18359,2097151,@4288|15,0,@18577 20,0,@18579 38,1,@6437 18577:O1|@18578 18578:D3,12|c39090900000000008000000|@18356,1,@4286| 18579:O1|@18580 18580:D3,12|c39090900000000008000000|@18356,1,@4287| 18581:O1|@18582 18582:D3,12|c39090900000000008000000|@18359,1,@4289| 18583:S36|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129283129 18584:S33|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129 18585:O3|2,@18586,@12085 18586:O3|3,@18587,@5234 18587:O2|@18589,@18588 18588:O2|@18590,0 18589:O2|49,@18148 18590:O2|50,@18381 18591:O2|@18593,@18592 18592:O2|@18594,0 18593:S13|6d616b65457863657074696f6e 18594:O4|@4596,69,@18595,0 18595:O7|@18593,2,@18596,@18326,@5229,0,0 18596:O2|1,@18597 18597:O3|2,@18598,0 18598:O1|@18599 18599:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700547491b28948048060ffbfc3000000002c000000|@18610,3,@4298|28,0,@18600 18600:D3,248|3b650c7303ff55248b4d008d49f43b4d087303ff5520894d00c741fc02000000c701607591b28b52048951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c702cc7591b2894a048062ffbfff7008ff30ff700c52bb907691b28b4004909090e83693e9ff8b4d008d49f03b4d087303ff5520894d00c741fc03000000c74108010000005a895104c701050000008b55008d52d43b55087303ff5520895500c742fc02000000894a04c7020300000089c18d420cc740fc07000000c7401801000000c74014010000008b5c240489581089480c895008c74004010000005983c4048908c390909000000000f4000000|@18609,2097151,@4297|34,0,@18601 74,0,@18602 95,0,@18607 106,1,@6446 137,0,0 147,0,2 180,0,1 199,0,0 206,0,0 226,0,0 18601:D3,88|3b650c7303ff55248b08833903750e8b5804833b037506b801000000c38b5a04ff7304ff73088b1389d3909090e876d9ffff89c18b45008d40f83b45087303ff5520894500c740fc010000008908c3900000000054000000|@18352,1048575,@4292|24,0,0 46,1,@18333 18602:D3,96|3b650c7303ff55246a016a016a0168407691b268687691b26a018d4c240c518b5a04909090e80e8ee9ff8b45008d40f03b45087303ff5520894500c740fc030000008b4c24088948088b4c24048948045983c4088908c390000000005c000000|@18359,2097151,@4295|15,0,@18603 20,0,@18605 38,1,@6437 18603:O1|@18604 18604:D3,12|c39090900000000008000000|@18356,1,@4293| 18605:O1|@18606 18606:D3,12|c39090900000000008000000|@18356,1,@4294| 18607:O1|@18608 18608:D3,12|c39090900000000008000000|@18359,1,@4296| 18609:S31|44454255474745525f28292e6d616b65457863657074696f6e283129283129 18610:S28|44454255474745525f28292e6d616b65457863657074696f6e283129 18611:O2|@18613,@18612 18612:O2|@18614,0 18613:S15|7365744f6e427265616b506f696e74 18614:O4|@4596,69,@18615,0 18615:O7|@18613,2,@18617,@18616,@5229,0,0 18616:O3|2,@18623,@6000 18617:O2|1,@18618 18618:O3|2,@18619,0 18619:O2|@18620,@4761 18620:D3,80|a80175328b4d008d49f43b4d087303ff5520894d00c741fc02000000c701047891b28b008941048061ffbf8b5204890ab801000000c38b5204c70201000000b801000000c3909090000000004c000000|@18622,7,@4300|30,0,@18621 49,0,0 59,0,0 64,0,0 18621:D3,24|3b650c7303ff55248b5a04e9d8e4ffff0000000014000000|@18411,2097151,@4299|12,1,@18409 18622:S30|44454255474745525f28292e7365744f6e427265616b506f696e74283129 18623:O5|5,@18624,@12166,@12023,@5229 18624:O2|@18625,0 18625:O3|2,@18626,@6000 18626:O3|3,@18627,@5234 18627:O2|@6016,@18628 18628:O2|@18629,0 18629:O2|50,@5713 18630:O2|@18632,0 18631:S10|7365744f6e456e747279 18632:O4|@4596,69,@18633,0 18633:O7|@18631,2,@18634,@18403,@5229,0,0 18634:O2|1,@18635 18635:O3|2,@18636,0 18636:O2|@18637,@4764 18637:D3,80|a80175328b4d008d49f43b4d087303ff5520894d00c741fc02000000c701a07991b28b008941048061ffbf8b5204890ab801000000c38b5204c70201000000b801000000c3909090000000004c000000|@18639,7,@4302|30,0,@18638 49,0,0 59,0,0 64,0,0 18638:D3,24|3b650c7303ff55248b5a04e93ce3ffff0000000014000000|@18411,2097151,@4301|12,1,@18409 18639:S25|44454255474745525f28292e7365744f6e456e747279283129 18640:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4303|1,0,@12350 18641:O2|@6060,@18642 18642:O2|@18643,0 18643:O4|@4596,69,@6058,0 18644:O2|@5935,@18645 18645:O2|@18646,0 18646:O4|@4600,69,@18647,0 18647:O2|@5934,0 18648:O2|@18650,@18649 18649:O2|@18651,0 18650:S14|736f757263654c6f636174696f6e 18651:O4|@4596,69,@18652,0 18652:O7|@18650,2,@18654,@18653,@5229,0,0 18653:O3|2,@6000,@5933 18654:O2|3,3 18655:O2|@5694,@18656 18656:O2|@18657,0 18657:O4|@4596,69,@5692,0 18658:O2|@18659,0 18659:O4|@4596,69,@17462,0 18660:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4304|1,0,@12350 18661:O2|@18663,@18662 18662:O2|@18664,0 18663:S3|6d6f64 18664:O4|@4596,69,@18665,0 18665:O7|@18663,2,@5230,@18666,@5229,0,0 18666:O3|2,@5233,@5238 18667:O2|@5788,@18668 18668:O2|@18669,0 18669:O4|@4600,69,@18670,0 18670:O2|@5786,@18671 18671:O2|@16845,@18672 18672:O2|@16883,0 18673:O2|@18675,@18674 18674:O2|@18676,0 18675:S5|6172726179 18676:O4|@4600,69,@18677,0 18677:O2|@18678,0 18678:O3|@18675,@5229,@18679 18679:O3|@18681,@18700,@18680 18680:O3|@18701,@5256,@5255 18681:O2|1,@18682 18682:O3|2,@18684,@18683 18683:O2|@18691,0 18684:O4|@18686,@4799,@18688,@18685 18685:O1|@18690 18686:O1|@18687 18687:D3,16|b8a8d95208c39090000000000c000000|@5726,1,@4305|1,0,I251 18688:O1|@18689 18689:D3,16|b805000000c39090000000000c000000|@5735,1,@4306|1,0,2 18690:D3,16|b803000000c39090000000000c000000|@5737,1,@4307|1,0,1 18691:O4|@4607,69,@18692,0 18692:O3|2,4,@18693 18693:O5|@5429,@18695,@5765,@18694,@5387 18694:O4|@18684,@18686,@18688,@18685 18695:O2|@5433,@18696 18696:O2|@5745,@18697 18697:O2|@18698,@5750 18698:O2|@18699,@5413 18699:O3|0,@4799,0 18700:O4|1,@4652,1,0 18701:S11|41727261792e6172726179 18702:O2|@12166,@18703 18703:O2|@18704,0 18704:O4|@4600,69,@18705,0 18705:O2|@12023,@18706 18706:O2|@16519,@18707 18707:O2|@16494,0 18708:O2|@12242,@18709 18709:O2|@18710,0 18710:O4|@4596,69,@16519,0 18711:O2|42,@18712 18712:O2|@18713,0 18713:O4|@4596,69,@18714,0 18714:O7|42,2,@5230,@18666,@5229,0,0 18715:O2|@6688,@18716 18716:O2|@18717,0 18717:O4|@4600,69,@18718,0 18718:O2|@6686,0 18719:O2|43,@18720 18720:O2|@18721,0 18721:O4|@4596,69,@18722,0 18722:O7|43,2,@5230,@18666,@5229,0,0 18723:O2|126,@18724 18724:O2|@18725,0 18725:O4|@4596,69,@18726,0 18726:O7|126,2,@5230,@5481,@5229,0,0 18727:O2|45,@18728 18728:O2|@18729,0 18729:O4|@4596,69,@18730,0 18730:O7|45,2,@5230,@18666,@5229,0,0 18731:O2|@18733,@18732 18732:O2|@18734,0 18733:S9|426f6f747374726170 18734:O4|@4611,69,@18735,0 18735:O4|@18733,@5500,@18736,@5229 18736:O6|@18738,I48,0,@5229,@18737,0 18737:O1|@19775 18738:O4|1,@4801,@4802,@4800 18739:O2|@19763,@19762 18740:O2|@18742,@18741 18741:O2|@18743,0 18742:S24|7265706f7274556e7265666572656e636564496473546167 18743:O4|@4596,69,@18744,0 18744:O7|@18742,2,@18746,@18745,@5229,0,0 18745:O5|5,@5715,@18757,@18756,@5229 18746:O2|1,@18747 18747:O3|2,@18748,0 18748:O3|@18750,@18753,@18749 18749:O2|@18755,@4676 18750:O2|@18751,@4676 18751:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4308|8,0,0 14,0,1 18752:S19|556e6976657273616c2e746167283129283129 18753:O2|@18754,@4676 18754:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4309|29,0,0 39,0,69 18755:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4310|10,0,@6377 18756:O3|@18757,@5229,@18758 18757:S3|746167 18758:O3|@18760,@18793,@18759 18759:O3|@18757,@5256,@5255 18760:O2|1,@18761 18761:O3|2,@18763,@18762 18762:O2|@18776,0 18763:O4|0,@4804,@18771,@18764 18764:O1|@18774 18765:O1|@18766 18766:D3,16|b8f08291b2c39090000000000c000000|@18770,1,@4312|1,0,@18767 18767:O1|@18768 18768:D3,16|b8f06e7ab2c39090000000000c000000|@18769,1,@4311|1,0,@5252 18769:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129283129 18770:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129 18771:O1|@18772 18772:D3,16|b807000000c39090000000000c000000|@18773,1,@4313|1,0,3 18773:S9|626f7865642d746167 18774:D3,16|b803000000c39090000000000c000000|@18775,1,@4314|1,0,1 18775:S8|73697a652d746167 18776:O4|@4607,69,@18777,0 18777:O3|2,4,@18778 18778:O5|@5429,@18780,@5763,@18779,@5387 18779:O3|@18763,@18771,@18764 18780:O2|@5433,@18781 18781:O2|@16533,@18782 18782:O2|@18784,@18783 18783:O2|@18787,@18786 18784:O2|@18785,@5413 18785:O3|0,@4804,0 18786:O2|@18790,0 18787:O2|@5747,@18788 18788:O3|0,@18789,@5415 18789:O8|@5897,@18773,0,0,@5276,0,0,1 18790:O2|@5756,@18791 18791:O3|0,@18792,@5415 18792:O8|@5281,@18775,0,0,@5276,0,0,1 18793:O4|1,@4805,1,0 18794:O2|@18796,@18795 18795:O2|@18797,0 18796:S11|726f6f7454726565546167 18797:O4|@4596,69,@18798,0 18798:O7|@18796,2,@18800,@18799,@5229,0,0 18799:O5|5,@18809,@18757,@18756,@5229 18800:O2|1,@18801 18801:O3|2,@18802,0 18802:O3|@18804,@18806,@18803 18803:O2|@18808,@4720 18804:O2|@18805,@4720 18805:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4315|8,0,0 14,0,1 18806:O2|@18807,@4720 18807:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4316|29,0,0 39,0,69 18808:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4317|10,0,@6377 18809:O2|@18810,0 18810:O3|3,@18812,@18811 18811:O3|0,@18823,1 18812:O2|@18814,@18813 18813:O2|@18819,@18818 18814:O2|@18816,@18815 18815:O5|5,@18817,@12166,@12023,@5229 18816:S4|6e657874 18817:O2|@5998,0 18818:O2|@18821,0 18819:O2|@18820,@18815 18820:S6|706172656e74 18821:O2|@18822,@18815 18822:S8|70726576696f7573 18823:O2|@18816,@18824 18824:O2|@18820,@18825 18825:O2|@18822,0 18826:O2|@18828,@18827 18827:O2|@18829,0 18828:S17|636f6d70696c65724f7574707574546167 18829:O4|@4596,69,@18830,0 18830:O7|@18828,2,@18832,@18831,@5229,0,0 18831:O5|5,@18841,@18757,@18756,@5229 18832:O2|1,@18833 18833:O3|2,@18834,0 18834:O3|@18836,@18838,@18835 18835:O2|@18840,@4681 18836:O2|@18837,@4681 18837:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4318|8,0,0 14,0,1 18838:O2|@18839,@4681 18839:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4319|29,0,0 39,0,69 18840:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4320|10,0,@6377 18841:O2|@18842,0 18842:O3|2,@5509,@6000 18843:O2|@18845,@18844 18844:O2|@18846,0 18845:S17|62696e64696e67436f756e746572546167 18846:O4|@4596,69,@18847,0 18847:O7|@18845,2,@18849,@18848,@5229,0,0 18848:O5|5,@18858,@18757,@18756,@5229 18849:O2|1,@18850 18850:O3|2,@18851,0 18851:O3|@18853,@18855,@18852 18852:O2|@18857,@4662 18853:O2|@18854,@4662 18854:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4321|8,0,0 14,0,1 18855:O2|@18856,@4662 18856:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4322|29,0,0 39,0,69 18857:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4323|10,0,@6377 18858:O2|@18859,0 18859:O3|2,@6000,@5307 18860:O2|@18862,@18861 18861:O2|@18863,0 18862:S16|6d6178496e6c696e6553697a65546167 18863:O4|@4596,69,@18864,0 18864:O7|@18862,2,@18866,@18865,@5229,0,0 18865:O5|5,@15842,@18757,@18756,@5229 18866:O2|1,@18867 18867:O3|2,@18868,0 18868:O3|@18870,@18872,@18869 18869:O2|@18874,@4664 18870:O2|@18871,@4664 18871:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4324|8,0,0 14,0,1 18872:O2|@18873,@4664 18873:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4325|29,0,0 39,0,69 18874:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4326|10,0,@6377 18875:O2|@18877,@18876 18876:O2|@18878,0 18877:S15|617373656d626c79436f6465546167 18878:O4|@4596,69,@18879,0 18879:O7|@18877,2,@18880,@18745,@5229,0,0 18880:O2|1,@18881 18881:O3|2,@18882,0 18882:O3|@18884,@18886,@18883 18883:O2|@18888,@4669 18884:O2|@18885,@4669 18885:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4327|8,0,0 14,0,1 18886:O2|@18887,@4669 18887:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4328|29,0,0 39,0,69 18888:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4329|10,0,@6377 18889:O2|@18891,@18890 18890:O2|@18892,0 18891:S14|636f6e76537472696e674e616d65 18892:O4|@4596,69,@18893,0 18893:O7|@18891,2,@18894,@5306,@5229,0,0 18894:O2|1,@18895 18895:O3|2,@13219,0 18896:O2|@18898,@18897 18897:O2|@18899,0 18898:S17|696e6c696e6546756e63746f7273546167 18899:O4|@4596,69,@18900,0 18900:O7|@18898,2,@18901,@18745,@5229,0,0 18901:O2|1,@18902 18902:O3|2,@18903,0 18903:O3|@18905,@18907,@18904 18904:O2|@18909,@4663 18905:O2|@18906,@4663 18906:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4330|8,0,0 14,0,1 18907:O2|@18908,@4663 18908:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4331|29,0,0 39,0,69 18909:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4332|10,0,@6377 18910:O2|@18912,@18911 18911:O2|@18913,0 18912:S27|7265706f72744578686175737469766548616e646c657273546167 18913:O4|@4596,69,@18914,0 18914:O7|@18912,2,@18915,@18745,@5229,0,0 18915:O2|1,@18916 18916:O3|2,@18917,0 18917:O3|@18919,@18921,@18918 18918:O2|@18923,@4677 18919:O2|@18920,@4677 18920:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4333|8,0,0 14,0,1 18921:O2|@18922,@4677 18922:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4334|29,0,0 39,0,69 18923:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4335|10,0,@6377 18924:O2|@18926,@18925 18925:O2|@18927,0 18926:S19|6c6f776c6576656c4f7074696d697365546167 18927:O4|@4596,69,@18928,0 18928:O7|@18926,2,@18929,@18745,@5229,0,0 18929:O2|1,@18930 18930:O3|2,@18931,0 18931:O3|@18933,@18935,@18932 18932:O2|@18937,@4668 18933:O2|@18934,@4668 18934:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4336|8,0,0 14,0,1 18935:O2|@18936,@4668 18936:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4337|29,0,0 39,0,69 18937:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4338|10,0,@6377 18938:O2|@18940,@18939 18939:O2|@18941,0 18940:S11|636f646574726565546167 18941:O4|@4596,69,@18942,0 18942:O7|@18940,2,@18943,@18745,@5229,0,0 18943:O2|1,@18944 18944:O3|2,@18945,0 18945:O3|@18947,@18949,@18946 18946:O2|@18951,@4658 18947:O2|@18948,@4658 18948:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4339|8,0,0 14,0,1 18949:O2|@18950,@4658 18950:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4340|29,0,0 39,0,69 18951:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4341|10,0,@6377 18952:O2|@18954,@18953 18953:O2|@18955,0 18954:S23|6372656174655072696e7446756e6374696f6e73546167 18955:O4|@4596,69,@18956,0 18956:O7|@18954,2,@18957,@18745,@5229,0,0 18957:O2|1,@18958 18958:O3|2,@18959,0 18959:O3|@18961,@18963,@18960 18960:O2|@18965,@4679 18961:O2|@18962,@4679 18962:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4342|8,0,0 14,0,1 18963:O2|@18964,@4679 18964:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4343|29,0,0 39,0,69 18965:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4344|10,0,@6377 18966:O2|@18968,@18967 18967:O2|@18969,0 18968:S12|706172736574726565546167 18969:O4|@4596,69,@18970,0 18970:O7|@18968,2,@18971,@18745,@5229,0,0 18971:O2|1,@18972 18972:O3|2,@18973,0 18973:O3|@18975,@18977,@18974 18974:O2|@18979,@4666 18975:O2|@18976,@4666 18976:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4345|8,0,0 14,0,1 18977:O2|@18978,@4666 18978:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4346|29,0,0 39,0,69 18979:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4347|10,0,@6377 18980:O2|@18982,@18981 18981:O2|@18983,0 18982:S13|6c696e654c656e677468546167 18983:O4|@4596,69,@18984,0 18984:O7|@18982,2,@18985,@18865,@5229,0,0 18985:O2|1,@18986 18986:O3|2,@18987,0 18987:O3|@18989,@18991,@18988 18988:O2|@18993,@4673 18989:O2|@18990,@4673 18990:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4348|8,0,0 14,0,1 18991:O2|@18992,@4673 18992:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4349|29,0,0 39,0,69 18993:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4350|10,0,@6377 18994:O2|@18996,@18995 18995:O2|@18997,0 18996:S14|70737461636b5472616365546167 18997:O4|@4596,69,@18998,0 18998:O7|@18996,2,@18999,@18745,@5229,0,0 18999:O2|1,@19000 19000:O3|2,@19001,0 19001:O3|@19003,@19005,@19002 19002:O2|@19007,@4667 19003:O2|@19004,@4667 19004:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4351|8,0,0 14,0,1 19005:O2|@19006,@4667 19006:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4352|29,0,0 39,0,69 19007:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4353|10,0,@6377 19008:O2|@19010,@19009 19009:O2|@19011,0 19010:S11|676c6f62616c5370616365 19011:O4|@4596,69,@19012,0 19012:O7|@19010,2,@19013,@12025,@5229,0,0 19013:O2|1,@19014 19014:O3|2,@19015,0 19015:O18|@19017,@19032,@19037,@19042,@19047,@19052,@19058,@19062,@19066,@19071,@19075,@19080,@19083,@19086,@19090,@19093,@19097,@19016 19016:O2|@19100,@5210 19017:O2|@19018,@5210 19018:D3,44|3b650c7303ff55248b4204ff700468f09a91b28b1889e09090e81a01000083c408c390900000000028000000|@19031,2097151,@4357|15,0,@19019 26,1,@19023 19019:D3,44|3b650c7303ff5524b8309b91b28b0c24890424bb010000008b420451e99f63e9ff9090900000000028000000|@19022,1048575,@4355|9,0,@19020 20,0,0 29,1,@6418 19020:O1|@19021 19021:D3,124|8b4c2404f6c30175628b13813adce439b27547813adce439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4354|13,0,@4640 21,0,@4640 30,0,@6377 19022:S22|4d414b455f28292e6462456e76416c6c283329283129 19023:D3,1436|3b650c7303ff55248b4d3cbaffffff002351fc8d54120183fa0976058b5110eb05ba0100000083fa017507ba01000000eb1c89d68b55008d52f83b55087303ff5520895500c742fc0100000089328b75008d76f43b75087303ff5520897500c746fc02000000895604c706050000008b490489cf83e70383ff037407bf01000000eb05bf03000000528b55008d52f43b55087303ff5520895500c742fc02000000897a04c7020100000083e10d83f9017507b905000000eb2083f9057507b907000000eb1483f9097407b901000000eb05b90300000083f1028b7d008d7fd03b7d087303ff5520897d00c747fc02000000894f04c707030000008d4f0cc741fc02000000c741040100000089398d790cc747fc02000000894f0489178d4f0cc741fc0200000089790489318b553c8b720489cf535052566a01bb01000000b898a191b29090e81a46e8ff8b542404b9ffffff00234afc8d4c090183f90976058b4a10eb05b901000000bb98a191b2f6c301754c8b33833e057536f646040175298b56048b1af6c301740783fb017e08eb30f643ff10742aff30ff7004b8a4a191b28b5d04909090ff13bb01000000eb118b730489f33b650c7303ff5524ebaf89cb8b4d3cbaffffffff33500483c2012314240b108951048b542404b9ffffff00234afc8d4c090183f9097707b901000000eb058b521089d1f6c3017508f6c1017503ff55383bd97413ff3057b81f000000909090ff1568c35208eb03ff30578b44240483e00983f80975248b453c8b400c83f8017412bb01000000b817000000ff1568c35208eb0cb801000000eb05b801000000b8010000008b4c24148b0983f9037507b801000000eb2781f8419c00007507b801000000eb18a801740583c0027105ff5538ebf63b650c7303ff5524ebc78b4c241433c083c0fef00fc10183c0fe83f801741989cbb8030000009090ff1568c352083b650c7303ff5524eb94b801000000ff7504b8d29e91b250896504b8010000008b5424189090ff1283c40459894d04eb6e9090908b650483c4045b895d048b54241433c983c102f00fc10a83c10283f903741f89c189d0909090ff15e8c25208518b5c2418b805000000ff1568c35208eb01508b453c8b480489c7516a01bb010000008b44240ce82244e8ffb9ffffff00234ffc8d4c090183f909760ceb05e9070100008b4f10eb05b901000000f6442408017535f64424200175278b4c24208b11f6c201740783fa017e08eb1ef642ff1074188b188b7004b8a4a191b28b5d04ff13ba01000000eb0289ca8b4d3cbbffffffff33580483c301231c240b18895904b9ffffff00234ffc8d4c090183f9097707b901000000eb058b7f1089f9f6c2017508f6c1017503ff55383bd17412ff3089d3b81f00000090ff1568c35208eb02ff308b042483e00983f809751d8b453c8b400c83f8017412bb01000000b8170000009090ff1568c352088b4424088b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c00a291b28b50088951088b58048959048b30893189c883c40c8b5d049090ff138b54241433c983c102f00fc10a83c10283f903741e89c189d09090ff15e8c25208518b5c2418b805000000ff1568c35208eb01508b453c8b480489c7516a01bb010000008b44240ce8b642e8ffb9ffffff00234ffc8d4c090183f90976058b4f10eb05b901000000f6442408017538f644242001752a8b4c24208b11f6c201740783fa017e08eb21f642ff10741b8b188b7004b8a4a191b28b5d04909090ff13ba01000000eb0289ca8b4d3cbbffffffff33580483c301231c240b18895904b9ffffff00234ffc8d4c090183f9097707b901000000eb058b7f1089f9f6c2017508f6c1017503ff55383bd17412ff3089d3b81f00000090ff1568c35208eb02ff308b042483e00983f809751d8b453c8b400c83f8017412bb01000000b8170000009090ff1568c3520883c4085883c41cc390900000000098050000|@19030,2097151,@4356|12,0,8388607 34,0,0 44,0,0 107,0,2 125,0,0 132,0,1 166,0,0 179,0,2 191,0,3 203,0,0 210,0,1 246,0,1 263,0,0 314,0,0 319,0,@19024 326,1,@4847 335,0,8388607 357,0,0 362,0,@19024 413,0,@19025 426,0,0 453,0,-1 476,0,8388607 493,0,0 525,0,15 534,0,I73 567,0,0 572,0,11 578,0,I73 585,0,0 592,0,0 597,0,0 613,0,0 621,0,20000 628,0,0 682,0,1 690,0,I73 705,0,0 713,0,$19023+746 722,0,0 786,0,I69 796,0,2 802,0,I73 821,0,0 830,1,@4847 835,0,8388607 864,0,0 912,0,@19025 922,0,0 934,0,-1 953,0,8388607 970,0,0 1003,0,15 1010,0,I73 1041,0,0 1046,0,11 1054,0,I73 1089,0,@19028 1150,0,I69 1160,0,2 1166,0,I73 1185,0,0 1194,1,@4847 1199,0,8388607 1221,0,0 1269,0,@19025 1282,0,0 1294,0,-1 1313,0,8388607 1330,0,0 1363,0,15 1370,0,I73 1401,0,0 1406,0,11 1414,0,I73 19024:O2|@5270,0 19025:O4|12,@4850,@19027,@19026 19026:O5|@4852,346,0,346,0 19027:S40|54686520737461636b2073697a65206d7573742062652067726561746572207468616e207a65726f 19028:O5|@19029,155,0,155,0 19029:S28|6d6c736f757263652f4d4c436f6d70696c65722f4d414b455f2e4d4c 19030:S18|4d414b455f28292e70726f74656374283229 19031:S25|4d414b455f28292e6462456e76416c6c283129283129283129 19032:O2|@19033,@5210 19033:D3,44|3b650c7303ff55248b4204ff700468c8a291b28b1889e09090e842f9ffff83c408c390900000000028000000|@19031,2097151,@4360|15,0,@19034 26,1,@19023 19034:D3,44|3b650c7303ff5524b808a391b28b0c24890424bb010000008b420451e9c75be9ff9090900000000028000000|@19022,1048575,@4359|9,0,@19035 20,0,0 29,1,@6418 19035:O1|@19036 19036:D3,124|8b4c2404f6c30175628b13813ae4e439b27547813ae4e439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4358|13,0,@4641 21,0,@4641 30,0,@6377 19037:O2|@19038,@5210 19038:D3,44|3b650c7303ff55248b4204ff700468eca391b28b1889e09090e81ef8ffff83c408c390900000000028000000|@19031,2097151,@4363|15,0,@19039 26,1,@19023 19039:D3,44|3b650c7303ff5524b82ca491b28b0c24890424bb010000008b420451e9a35ae9ff9090900000000028000000|@19022,1048575,@4362|9,0,@19040 20,0,0 29,1,@6418 19040:O1|@19041 19041:D3,124|8b4c2404f6c30175628b13813aece139b27547813aece139b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4361|13,0,@4596 21,0,@4596 30,0,@6377 19042:O2|@19043,@5210 19043:D3,44|3b650c7303ff55248b4204ff70046810a591b28b1889e09090e8faf6ffff83c408c390900000000028000000|@19031,2097151,@4366|15,0,@19044 26,1,@19023 19044:D3,44|3b650c7303ff5524b850a591b28b0c24890424bb010000008b420451e97f59e9ff9090900000000028000000|@19022,1048575,@4365|9,0,@19045 20,0,0 29,1,@6418 19045:O1|@19046 19046:D3,124|8b4c2404f6c30175628b13813a0ce239b27547813a0ce239b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4364|13,0,@4600 21,0,@4600 30,0,@6377 19047:O2|@19048,@5210 19048:D3,44|3b650c7303ff55248b4204ff70046834a691b28b1889e09090e8d6f5ffff83c408c390900000000028000000|@19031,2097151,@4369|15,0,@19049 26,1,@19023 19049:D3,44|3b650c7303ff5524b874a691b28b0c24890424bb010000008b420451e95b58e9ff9090900000000028000000|@19022,1048575,@4368|9,0,@19050 20,0,0 29,1,@6418 19050:O1|@19051 19051:D3,124|8b4c2404f6c30175628b13813ad4e439b27547813ad4e439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4367|13,0,@4639 21,0,@4639 30,0,@6377 19052:O2|@19053,@5210 19053:D3,48|3b650c7303ff55248b4a04ff7004ff30ff7104685ca791b28b1989e090e8aef4ffff83c410c39090000000002c000000|@19057,2097151,@4372|20,0,@19054 30,1,@19023 19054:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700dce439b252508b5a088b4204909090e88240e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e98048e9ff00000000a4000000|@19056,2097151,@4371|35,0,0 48,0,69 54,0,@4640 70,1,@6369 106,0,0 126,1,@19055 156,1,@6390 19055:D3,144|3b650c7303ff5524a80175578b088139dce439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4370|16,0,@4640 126,0,0 19056:S24|4d414b455f28292e6462456e76456e746572283429283129 19057:S27|4d414b455f28292e6462456e76456e746572283129283129283129 19058:O2|@19059,@5210 19059:D3,48|3b650c7303ff55248b4a04ff7004ff30ff71046850a991b28b1989e090e8baf2ffff83c410c39090000000002c000000|@19057,2097151,@4375|20,0,@19060 30,1,@19023 19060:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700e4e439b252508b5a088b4204909090e88e3ee9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e98c46e9ff00000000a4000000|@19056,2097151,@4374|35,0,0 48,0,69 54,0,@4641 70,1,@6369 106,0,0 126,1,@19061 156,1,@6390 19061:D3,144|3b650c7303ff5524a80175578b088139e4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4373|16,0,@4641 126,0,0 19062:O2|@19063,@5210 19063:D3,48|3b650c7303ff55248b4a04ff7004ff30ff71046800ab91b28b1989e090e80af1ffff83c410c39090000000002c000000|@19057,2097151,@4378|20,0,@19064 30,1,@19023 19064:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700ece139b252508b5a088b4204909090e8de3ce9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9dc44e9ff00000000a4000000|@19056,2097151,@4377|35,0,0 48,0,69 54,0,@4596 70,1,@6369 106,0,0 126,1,@19065 156,1,@6390 19065:D3,144|3b650c7303ff5524a80175578b088139ece139b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4376|16,0,@4596 126,0,0 19066:O2|@19067,@5210 19067:D3,44|3b650c7303ff55248b4204ff700468acac91b28b1889e09090e85eefffff83c408c390900000000028000000|@19031,2097151,@4381|15,0,@19068 26,1,@19023 19068:D3,44|3b650c7303ff5524b8ecac91b28b0c24890424bb010000008b420451e9e351e9ff9090900000000028000000|@19022,1048575,@4380|9,0,@19069 20,0,0 29,1,@6418 19069:O1|@19070 19070:D3,124|8b4c2404f6c30175628b13813a64e239b27547813a64e239b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4379|13,0,@4611 21,0,@4611 30,0,@6377 19071:O2|@19072,@5210 19072:D3,48|3b650c7303ff55248b4a04ff7004ff30ff710468d4ad91b28b1989e090e836eeffff83c410c39090000000002c000000|@19057,2097151,@4384|20,0,@19073 30,1,@19023 19073:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c7000ce239b252508b5a088b4204909090e80a3ae9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e90842e9ff00000000a4000000|@19056,2097151,@4383|35,0,0 48,0,69 54,0,@4600 70,1,@6369 106,0,0 126,1,@19074 156,1,@6390 19074:D3,144|3b650c7303ff5524a80175578b0881390ce239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4382|16,0,@4600 126,0,0 19075:O2|@19076,@5210 19076:D3,44|3b650c7303ff55248b4a0450ff71046880af91b28b1989e090e88aecffff83c40cc390900000000028000000|@19079,2097151,@4386|16,0,@19077 26,1,@19023 19077:D3,128|3b650c7303ff55248b5a088b4204909090e89238e9ffa80175568b00a801754a8b088139dce439b275318139dce439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4385|18,1,@6369 36,0,@4640 44,0,@4640 51,0,@6377 107,0,0 113,0,0 19078:S25|4d414b455f28292e6462456e764c6f6f6b7570283329283129 19079:S28|4d414b455f28292e6462456e764c6f6f6b7570283129283129283129 19080:O2|@19081,@5210 19081:D3,44|3b650c7303ff55248b4a0450ff710468a8b091b28b1989e090e862ebffff83c40cc390900000000028000000|@19079,2097151,@4388|16,0,@19082 26,1,@19023 19082:D3,128|3b650c7303ff55248b5a088b4204909090e86a37e9ffa80175568b00a801754a8b088139e4e439b275318139e4e439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4387|18,1,@6369 36,0,@4641 44,0,@4641 51,0,@6377 107,0,0 113,0,0 19083:O2|@19084,@5210 19084:D3,44|3b650c7303ff55248b4a0450ff71046888b191b28b1989e090e882eaffff83c40cc390900000000028000000|@19079,2097151,@4390|16,0,@19085 26,1,@19023 19085:D3,128|3b650c7303ff55248b5a088b4204909090e88a36e9ffa80175568b00a801754a8b088139ece139b275318139ece139b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4389|18,1,@6369 36,0,@4596 44,0,@4596 51,0,@6377 107,0,0 113,0,0 19086:O2|@19087,@5210 19087:D3,48|3b650c7303ff55248b4a04ff7004ff30ff7104686cb291b28b1989e090e89ee9ffff83c410c39090000000002c000000|@19057,2097151,@4393|20,0,@19088 30,1,@19023 19088:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700d4e439b252508b5a088b4204909090e87235e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9703de9ff00000000a4000000|@19056,2097151,@4392|35,0,0 48,0,69 54,0,@4639 70,1,@6369 106,0,0 126,1,@19089 156,1,@6390 19089:D3,144|3b650c7303ff5524a80175578b088139d4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4391|16,0,@4639 126,0,0 19090:O2|@19091,@5210 19091:D3,44|3b650c7303ff55248b4a0450ff71046818b491b28b1989e090e8f2e7ffff83c40cc390900000000028000000|@19079,2097151,@4395|16,0,@19092 26,1,@19023 19092:D3,128|3b650c7303ff55248b5a088b4204909090e8fa33e9ffa80175568b00a801754a8b0881390ce239b2753181390ce239b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4394|18,1,@6369 36,0,@4600 44,0,@4600 51,0,@6377 107,0,0 113,0,0 19093:O2|@19094,@5210 19094:D3,48|3b650c7303ff55248b4a04ff7004ff30ff710468fcb491b28b1989e090e80ee7ffff83c410c39090000000002c000000|@19057,2097151,@4398|20,0,@19095 30,1,@19023 19095:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c70064e239b252508b5a088b4204909090e8e232e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9e03ae9ff00000000a4000000|@19056,2097151,@4397|35,0,0 48,0,69 54,0,@4611 70,1,@6369 106,0,0 126,1,@19096 156,1,@6390 19096:D3,144|3b650c7303ff5524a80175578b08813964e239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4396|16,0,@4611 126,0,0 19097:O2|@19098,@5210 19098:D3,44|3b650c7303ff55248b4a0450ff710468a8b691b28b1989e090e862e5ffff83c40cc390900000000028000000|@19079,2097151,@4400|16,0,@19099 26,1,@19023 19099:D3,128|3b650c7303ff55248b5a088b4204909090e86a31e9ffa80175568b00a801754a8b088139d4e439b275318139d4e439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4399|18,1,@6369 36,0,@4639 44,0,@4639 51,0,@6377 107,0,0 113,0,0 19100:D3,44|3b650c7303ff55248b4a0450ff7104687cb791b28b1989e090e88ee4ffff83c40cc390900000000028000000|@19079,2097151,@4402|16,0,@19101 26,1,@19023 19101:D3,128|3b650c7303ff55248b5a088b4204909090e89630e9ffa80175568b00a801754a8b08813964e239b27531813964e239b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4401|18,1,@6369 36,0,@4611 44,0,@4611 51,0,@6377 107,0,0 113,0,0 19102:O2|@19104,@19103 19103:O2|@19105,0 19104:S13|6c696e654e756d626572546167 19105:O4|@4596,69,@19106,0 19106:O7|@19104,2,@19107,@18848,@5229,0,0 19107:O2|1,@19108 19108:O3|2,@19109,0 19109:O3|@19111,@19113,@19110 19110:O2|@19115,@4659 19111:O2|@19112,@4659 19112:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4403|8,0,0 14,0,1 19113:O2|@19114,@4659 19114:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4404|29,0,0 39,0,69 19115:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4405|10,0,@6377 19116:O2|@19118,@19117 19117:O2|@19119,0 19118:S12|757365576974685061726d73 19119:O4|@4596,69,@19120,0 19120:O7|@19118,2,@19122,@19121,@5229,0,0 19121:O3|2,@17335,@19331 19122:O2|1,@19123 19123:O3|2,@19124,0 19124:O2|@19125,@5210 19125:D3,56|89c18b45008d40f03b45087303ff5520894500c740fc03000000c70060ba91b28948048b52048950088060ffbfc390900000000034000000|@19330,7,@4505|28,0,@19126 19126:D3,36|3b650c7303ff55248b4a088b1c24890c2489de8b5a0456e91c0000000000000020000000|@19329,2097151,@4504|24,1,@19127 19127:D3,1348|3b650c7303ff5524535089c3b8f0bf91b2e8e650e8ffbb150000009090e8da50e8ff8b0d24f075b789c389c890e87e34e8ff8b0524f075b7ff7010bb983d7ab290e8a66ee8ffbb01000000b803000000ff1508cd5208a8017547813800c091b27425f60001752d8b30bf00c091b2b90d000000d1e93bc9f3a68d7c3f018d7436018d4c0901750df640040175078b40048b00eb128b40043b650c7303ff5524ebb5b85d0000005bba0cc091b290e8e60400006a016a01508d5c2404bad8cd91b290e886120000bb5d0000008b4424089090e82650e8ffbb68d191b29090e81a50e8fff64424040175518b4c2404813948c05208742df6010175248b31bf48c052088b11b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901741eeb088b11eb048b11eb1452bb5d00000090e8ca4fe8ff5b9090e8c24fe8ffff7504b9a2bd91b25189650450ff7504b90abc91b25189650450bb01000000b8070000009090ff15e8c1520883c40459894d04eb619090908b650483c4045b895d046a016a016a0181382ce039b2751889e18b10891189e18b580489590489e18b7008897108eb66833803751c89e0c7000300000089e0c74004601d7ab289e0c7400801000000eb458b4d008d49f03b4d08730aeb05e96c000000ff5520894d00c741fc03000000c7410874d191b28941048b44240c890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c8cd191b28b4c24088948088b4c24048948045983c40889088b5d0490ff136a038b5c2404bad4457ab290e80a89e8ff8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc010000408908ba030000008b4d008d49e03b4d087303ff5520894d00c741fc0100004889118d5108c742fc03000000894a08894204c702030000008d4210c740fc010000488910ba030000008b4d008d49e03b4d087303ff5520894d00c741fc0100004889118d5108c742fc02000000894204890a8d420cc740fc0200000059894804891083c40459894d04eb679090908b650483c4045b895d0481382ce039b274058b5d04ff13ff7504b8e6bd91b250896504ff742408bb01000000b80700000090ff15e8c1520883c40459894d04eb5b9090908b650483c4045b895d046a016a016a0181382ce039b2751f89e18b108911eb05e96d01000089e18b580489590489e18b7008897108eb64833803752189e0c7000300000089e0c74004601d7ab289e0c7400801000000eb43e9760000008b4d008d49f03b4d087303ff5520894d00c741fc03000000c7410874d191b28941048b44240c890189e2c7022ce039b289e2c742049cf379b289e2894a088b45008d40ec3b45087303ff5520894500c740fc04000000c7400c8cd191b28b4c24088948088b4c24048948045983c40889088b5d04ff136a038b5c2404bad4457ab290e82a87e8ff8b4d008d49ec3b4d087303ff5520894d00c741fc02000000894104c701030000008d410cc740fc010000408908ba030000008b4d008d49e03b4d087303ff5520894d00c741fc0100004889118d5108c742fc03000000894a08894204c702030000008d4210c740fc010000488910ba030000008b4d008d49e03b4d087303ff5520894d00c741fc0100004889118d5108c742fc02000000894204890a8d420cc740fc020000008b0c248948048910ff30ff70048b44241ce83a12000089c18b45008d40f03b45087303ff5520894500c740fc030000008b5424148950088b5424048950045b891889ca90ff128b04248b0883c414894c2404bbc41392b28b480489c8e9b369e8ff9090900000000040050000|@19328,2097151,@4503|13,0,@19128 18,1,@4940 23,0,10 30,1,@4940 36,0,@20261 46,1,@4897 52,0,@20261 60,0,@5078 66,1,@5038 71,0,0 76,0,1 82,0,I150 92,0,@19129 106,0,@19129 111,0,6 162,0,46 168,0,@19130 174,1,@19132 188,0,@19166 194,1,@19167 199,0,46 210,1,@4940 215,0,@19171 222,1,@4940 239,0,I48 253,0,I48 260,0,4 296,0,46 302,1,@4940 310,1,@4940 318,0,$19127+778 331,0,$19127+370 341,0,0 346,0,3 354,0,I61 388,0,@4580 427,0,1 436,0,@5021 445,0,0 485,0,@19172 502,0,@4580 511,0,@4908 547,0,@19173 584,0,@5103 590,1,@5105 623,0,1 640,0,1 688,0,1 705,0,1 790,0,@4580 805,0,$19127+846 818,0,0 823,0,3 830,0,I61 864,0,@4580 910,0,1 919,0,@5021 928,0,0 966,0,@19172 983,0,@4580 992,0,@4908 1028,0,@19173 1064,0,@5103 1070,1,@5105 1103,0,1 1120,0,1 1168,0,1 1185,0,1 1258,1,@19175 1323,0,@19326 1333,1,@5038 19128:S5|5573653a20 19129:S2|2d49 19130:O6|@19132,@19144,@19154,@4806,@19161,@19131 19131:O1|@19164 19132:D3,1008|3b650c7303ff55246a016a016a0181f848c052087424a801753c89c6bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901751c89e0c70048c0520889e0c740040100000089e0c7400801000000eb675253508b4a0889ca9090ff128b1424f6c2017407b903000000eb068b0a8d4c0901f6c101740bf6400c0174052b480c7105ff5538ebf683c101ff30ff7004ff7008518b580c89d0e87e0beeff8b4c24148b5914e856030000833c24017431837c240801752aeb05e9430000008b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70148c05208eb0289c18d44241883c4045a89108d4424108948048d4424105983c404894808eb0252536a016a016a01817c240c48c052087429f644240c01753e8b74240cbf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901751c89e0c70048c0520889e0c740040100000089e0c7400801000000eb6f8b4424108b48088b44240c89ca909090ff128b54240cf6c2017407b903000000eb068b0a8d4c0901f6c101740bf6400c0174052b480c7105ff5538ebf683c101ff30ff7004ff7008518b580c89d0909090e86e0aeeff8b4c241c8b5914e846020000833c24017431837c240801eb05e94000000075238b4d008d49f43b4d087303ff5520894d00c741fc02000000894104c70148c05208eb0289c18d44240c83c4045a89108d4424048948048d44240459894808837c240801743e8b4424108b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c40c691b2c7410801000000c7410470c691b28b500c891189c88b5d0490ff13813c2448c05208745df604240175218b3424bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090174648b4424108b48108b44241489ca9090ff128b4c2410508b4424048b51109090ff123b04247445f60424017544a8017540a801740eeb05e975000000b903000000eb068b088d4c090183c1088b342489c7d1e93bc9f3a68d7c3f018d7436018d4c0901eb05e947000000750583c404eb408b44241483c4048b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c7cc691b2c7410801000000c7410470c691b28b500c891189c88b5d04ff138b4424108b48088b44240c89ca9090ff12837808017466f64424040175388b4424049090813848c052087425f6000175258b30bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c090175058b4004eb048b4424048b4c24108b54241c8b5c24208954242089da89c38b44241489d68b510483c42056ff228b5c24048b442418909090e8a20200008b4c24108b54241c8b5c24208954242089da89c38b44241489d68b510483c42056ff2290909000000000ec030000|@19143,1048575,@4409|16,0,I48 29,0,I48 34,0,4 62,0,I48 71,0,0 80,0,0 107,0,1 158,1,@8870 170,1,@19133 223,0,I48 273,0,I48 291,0,I48 296,0,4 324,0,I48 333,0,0 342,0,0 376,0,1 430,1,@8870 442,1,@19133 495,0,I48 566,0,@19137 573,0,0 580,0,@19139 600,0,I48 616,0,I48 621,0,4 705,0,1 791,0,@19140 798,0,0 805,0,@19139 859,0,I48 873,0,I48 878,0,4 958,1,@19141 19133:D3,60|3b650c7303ff5524a8017407b903000000eb068b088d4c09018b1424890c245053bb01000000b80100000052e91f0000009090900000000038000000|@19136,1048575,@4407|13,0,1 34,0,0 39,0,0 45,1,@19134 19134:D3,364|3b650c7303ff5524f6c301750af644240c017503ff55383b5c240c7547f6c3017408a80174042bd87105ff5538ebf783c3015389c38b44240ce88e07eeff89c18b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c20c00f644240801751989d983c1088b542408d1e90fb60c0a8d4c090189c689c8eb0889c18b44240889ce56538b54240c9090ff1283f80174718b0424a801740df64424040174062b4424047105ff5538ebf583c001508b5c24088b44241490e80607eeff8b0c24f6c101740583c1027105ff5538ebf68b1424f6c201740583c2027105ff5538ebf650ff742418ff742418ff74241889cb89d09090e8fefeffff89c18b45008d40f4eb05e91e0000003b45087303ff5520894500c740fc0200000089480459890883c408c20c008b0424a801740583c0027105ff5538ebf68b4c24148b5424108b5c240c894c241489542410895c240c89c383c40458e99dfeffff900000000068010000|@19135,1048575,@4406|58,1,@8870 91,0,0 194,1,@8870 19135:S25|537472696e672e6669656c64732832296669656c6427283229 19136:S16|537472696e672e6669656c6473283229 19137:O5|@19138,582,0,582,0 19138:S14|2e2f62617369732f4f532e736d6c 19139:S4|50617468 19140:O5|@19138,584,0,584,0 19141:D3,164|3b650c7303ff5524a8017571837804017550813848c052087425f6000175238b30bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c0901750389d8c38b088b45008d40f43b45087303ff5520894500c740fc020000008958048908c3ff308b40049090e892ffffff89c18b45008d40f43b4508730aeb05e914000000ff5520894500c740fc02000000894804598908c389d8c390909000000000a0000000|@19142,59,@4408|20,0,I48 34,0,I48 39,0,4 19142:S32|4f532e506174682e636f6e636174283229636f6e636174417263732832292829 19143:S17|4f532e506174682e636f6e636174283229 19144:O7|@19146,@4806,@19154,47,@4807,@19157,@19145 19145:O1|@19159 19146:D3,432|3b650c7303ff552489c18b45008d40f43b45087303ff5520894500c740fc020000008b74240489700489085253518b7a1889fa90ff1283f801753e8b4424088b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c7cc991b2c7410801000000c7410470c691b28b5004891189c88b5d0490ff138b442404a801752b8b4c2408ff70048b008b5114909090ff1283f801750ab80300000083c404eb10583b650c7303ff5524ebd1b80100000083f801743f8b4424088b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c94c991b2c7410801000000c74104acc991b28b5010891189c88b5d049090ff13837c24100375148b4424088b580c8b0424909090e8ce42e8ffeb038b04248b4c240889c68b590c8b44240490e8e200000089c18b45008d40f43b45087303ff5520894500c740fc020000008948048930e85e48e8ff8b4c240883c408508b5108909090ff128b003b44240c743f8b4424048b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c94ca91b2c7410801000000c7410470c691b28b4004890189c88b5d049090ff135883c404c2040000000000ac010000|@19153,1048575,@4411|90,0,@19147 97,0,0 104,0,@19139 152,0,1 173,0,0 213,0,@19148 220,0,0 227,0,@19149 266,1,@4940 290,1,@19150 326,1,@4953 385,0,@19152 392,0,0 399,0,@19139 19147:O5|@19138,384,0,384,0 19148:O5|@19138,387,0,387,0 19149:S10|496e76616c6964417263 19150:D3,148|3b650c7303ff5524a80175718378040175248b088b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008908c3ff30538b400490e8beffffff8b4d008d49f43b4d087303ff5520894d00c741fc020000008941045889018b45008d40f43b45087303ff5520894500c740fc02000000894804eb05e904000000598908c3b801000000c30000000090000000|@19151,11,@4410|47,0,0 135,0,0 19151:S33|4f532e506174682e746f537472696e6728332961726373546f4c696e6b73283129 19152:O5|@19138,402,0,402,0 19153:S19|4f532e506174682e746f537472696e67283329 19154:O1|@19155 19155:D3,256|6a016a016a016a01a8017407b903000000eb068b088d4c0901f6c101740783f9017e67eb06f641ff107564a8017407b903000000eb068b088d4c0901f6c101740783f9017e08eb15f641ff10740f89c1b8a8f179b28b5d04909090ff13a80175080fb640048d44000183f85f753189e0c7000300000089e0c7400448c0520889e0c7400803000000eb0ae910000000e90b00000089e0c7400c03000000eb2389e0c7000100000089e0c7400448c0520889e0c740080100000089e0c7400c010000008b45008d40ec3b45087303ff5520894500c740fc040000008b4c240c89480c8b4c24088948088b4c24048948045983c40c8908c3909000000000fc000000|@19156,3,@4412|13,0,1 48,0,1 81,0,@4898 114,0,1 123,0,I48 132,0,1 153,0,1 163,0,0 172,0,I48 181,0,0 190,0,0 19156:S33|4f532e506174682e6d61746368566f6c756d65507265666978506f736978283129 19157:O1|@19158 19158:D3,140|a8017407b903000000eb068b088d4c0901ba010000003bd17207ba01000000eb4aa801751189d383c308d1eb0fb61c188d5c1b01eb0289c383fb5f740583fb01751c8b55008d52f83b55087303ff5520895500c742fc01000000891aeb0d83c2023b650c7303ff5524ebab83fa017407b801000000eb05b80300000083f00283f002c3900000000088000000|@8043,15,@4413|5,0,1 18,0,0 27,0,0 113,0,0 120,0,1 19159:D3,80|813848c052087506b803000000c3f60001752c8b30bf48c05208b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017406b801000000c3b803000000c3b801000000c3909090000000004c000000|@19160,51,@4414|2,0,I48 9,0,1 22,0,I48 27,0,4 52,0,0 58,0,1 64,0,0 19160:S23|4f532e506174682e76616c6964566f6c756d652d283129 19161:O1|@19162 19162:D3,12|c39090900000000008000000|@19163,1,@4415| 19163:S27|4f532e506174682e746f43616e6f6e6963616c436173652d283129 19164:D3,28|83f85f7406b801000000c3b803000000c39090900000000018000000|@19165,1,@4416|6,0,0 12,0,1 19165:S23|4f532e506174682e6973536570617261746f722d283129 19166:O2|@19167,@19131 19167:D3,252|3b650c7303ff5524a8017407b903000000eb068b088d4c090189cef7c601000000740583ee027105ff5538ebf653505150518b5a0489f09090e8d2000000a801756dff30ff3424bb010000008b44240c90e816feedff8b0c24f6c101740583c1027105ff5538ebf68b542404f6c201740bf604240174052b14247105ff5538ebf683c201f6c201740583ea027105ff5538ebf6505289cb8b4424109090e8cafdedff8b4d008d49f83b4d08730aeb05e925000000ff5520894d00c741fc0100000089018b44241089085983c404894804b80100000083c40cc38b442408c700010000008b4c2404894804b80100000083c40cc39000000000f8000000|@19170,1048575,@4418|13,0,1 58,1,@19168 72,0,0 82,1,@8870 158,1,@8870 209,0,0 223,0,0 235,0,0 19168:D3,536|3b650c7303ff5524a801740783f8017f10eb06f640ff107408b801000000c20800a801740783f8017d08eb30f640ff10752a8b542408f6c2017407b903000000eb068b0a8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77c0d89c1b8a8f179b28b5d0490ff13f6c201751589c183c108d1e90fb60c0a8d4c090189c689c8eb0689c189d089ce565389da909090ff1283f801740bb80100000083c408c208008b442404a801740783f8017d08eb30f640ff10752a8b542410f6c2017407b903000000eb068b0a8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77c0cb8a8f179b28b5d049090ff13f6c201750f83c008d1e80fb604028d440001eb0289d083f85d75608b44240ca801740583e8027105ff5538ebf6a801750af6442404017503ff55383b442404750bb80100000083c408c208008b442404a801740583e8027105ff5538ebf6a801740783f8017d08eb31f640ff10752bf6c201740cb903000000eb0be9790000008b0a8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77c0e89c1b8a8f179b28b5d049090ff13f6c201740489d0eb0d83c008d1e80fb604028d4400018b14249090ff1283f801740bb80100000083c408c208008b45008d40f83b45087303ff5520894500c740fc010000008b4c2404890883c408c208008b442404a801740583e8027105ff5538ebf68b4c240c89542410894c240c5b83c404e9f3fdffff9090900000000014020000|@19169,1048575,@4417|26,0,0 60,0,1 95,0,@4898 152,0,0 193,0,1 226,0,@4898 303,0,0 354,0,1 394,0,@4898 440,0,0 19169:S32|4f532e506174682e73706c697442617365457874283129676574457874283129 19170:S23|4f532e506174682e73706c697442617365457874283129 19171:S3|353630 19172:S13|54657874494f2e6f70656e496e 19173:O5|@19174,293,0,293,0 19174:S18|2e2f62617369732f54657874494f2e736d6c 19175:D3,916|8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70168d591b28941048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c7023cd691b28942048062ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70310d791b28943048063ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706e4d791b28946048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c707b8d891b28947048067ffbf508b45008d40f43b45087303ff5520894500c740fc02000000c7008cd991b2578b7c24048978048060ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c70760da91b2508b4424088947048067ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c70004dc91b2538b5c240c8958048060ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c703a8dd91b2528b5424108953048063ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c7024cdf91b2568b7424148972048062ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c706f0e091b2528b5424188956048066ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70294e291b2518b4c241c894a048062ffbf8b4d008d49f43b4d087303ff5520894d00c741fc02000000c70138e491b2528b5424208951048061ffbf8b55008d52f43b55087303ff5520895500c742fc02000000c70250e591b2538b5c2424895a048062ffbf8b5d008d5bf43b5d087303ff5520895d00c743fc02000000c70368e691b2508b4424288943048063ffbf8b45008d40f43b45087303ff5520894500c740fc02000000c70080e791b2568b74242c8970048060ffbf8b75008d76f43b75087303ff5520897500c746fc02000000c70698e891b2578b7c2430897e048066ffbf8b7d008d7ff43b7d087303ff5520897d00c747fc02000000c707b0e991b2568b7424348977048067ffbf8b75008d76b43b75087303ff5520897500c746fc12000000578b7c2434897e448b7c2430897e408b7c2420897e3c8b7c242c897e388b7c2418897e348b7c2428897e308b7c2424897e2c8b7c241c897e288b7c2414897e248b7c2404897e208b7c2410897e1c8b7c240c897e188b7c2408897e145f83c434897e10895e0c895608894604890e8b45008d40f03b45087303ff5520894500c740fc03000000c700c8ea91b2897004598948088060ffbfc30000000090030000|@19325,63,@4501|26,0,@19176 63,0,@19178 100,0,@19180 137,0,@19182 174,0,@19184 212,0,@19186 254,0,@19188 296,0,@19191 338,0,@19194 380,0,@19197 422,0,@19200 464,0,@19203 506,0,@19206 548,0,@19210 590,0,@19214 632,0,@19218 674,0,@19222 716,0,@19226 892,0,@19230 19176:D3,44|3b650c7303ff55248b4a0450ff710468a8d591b28b1989e090e862c6ffff83c40cc390900000000028000000|@19079,2097151,@4420|16,0,@19177 26,1,@19023 19177:D3,128|3b650c7303ff55248b5a088b4204909090e86a12e9ffa80175568b00a801754a8b088139dce439b275318139dce439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4419|18,1,@6369 36,0,@4640 44,0,@4640 51,0,@6377 107,0,0 113,0,0 19178:D3,44|3b650c7303ff55248b4a0450ff7104687cd691b28b1989e090e88ec5ffff83c40cc390900000000028000000|@19079,2097151,@4422|16,0,@19179 26,1,@19023 19179:D3,128|3b650c7303ff55248b5a088b4204909090e89611e9ffa80175568b00a801754a8b088139ece139b275318139ece139b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4421|18,1,@6369 36,0,@4596 44,0,@4596 51,0,@6377 107,0,0 113,0,0 19180:D3,44|3b650c7303ff55248b4a0450ff71046850d791b28b1989e090e8bac4ffff83c40cc390900000000028000000|@19079,2097151,@4424|16,0,@19181 26,1,@19023 19181:D3,128|3b650c7303ff55248b5a088b4204909090e8c210e9ffa80175568b00a801754a8b0881390ce239b2753181390ce239b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4423|18,1,@6369 36,0,@4600 44,0,@4600 51,0,@6377 107,0,0 113,0,0 19182:D3,44|3b650c7303ff55248b4a0450ff71046824d891b28b1989e090e8e6c3ffff83c40cc390900000000028000000|@19079,2097151,@4426|16,0,@19183 26,1,@19023 19183:D3,128|3b650c7303ff55248b5a088b4204909090e8ee0fe9ffa80175568b00a801754a8b088139e4e439b275318139e4e439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4425|18,1,@6369 36,0,@4641 44,0,@4641 51,0,@6377 107,0,0 113,0,0 19184:D3,44|3b650c7303ff55248b4a0450ff710468f8d891b28b1989e090e812c3ffff83c40cc390900000000028000000|@19079,2097151,@4428|16,0,@19185 26,1,@19023 19185:D3,128|3b650c7303ff55248b5a088b4204909090e81a0fe9ffa80175568b00a801754a8b08813964e239b27531813964e239b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4427|18,1,@6369 36,0,@4611 44,0,@4611 51,0,@6377 107,0,0 113,0,0 19186:D3,44|3b650c7303ff55248b4a0450ff710468ccd991b28b1989e090e83ec2ffff83c40cc390900000000028000000|@19079,2097151,@4430|16,0,@19187 26,1,@19023 19187:D3,128|3b650c7303ff55248b5a088b4204909090e8460ee9ffa80175568b00a801754a8b088139d4e439b275318139d4e439b2740bb854eb7ab28b5d0490ff138b45008d40f83b45087303ff5520894500c740fc010000008b49088908c38b480489c83b650c7303ff5524ebb2b801000000c3b801000000c39090000000007c000000|@19078,1048575,@4429|18,1,@6369 36,0,@4639 44,0,@4639 51,0,@6377 107,0,0 113,0,0 19188:D3,48|3b650c7303ff55248b4a04ff7004ff30ff710468a4da91b28b1989e090e866c1ffff83c410c39090000000002c000000|@19057,2097151,@4433|20,0,@19189 30,1,@19023 19189:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700dce439b252508b5a088b4204909090e83a0de9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e93815e9ff00000000a4000000|@19056,2097151,@4432|35,0,0 48,0,69 54,0,@4640 70,1,@6369 106,0,0 126,1,@19190 156,1,@6390 19190:D3,144|3b650c7303ff5524a80175578b088139dce439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4431|16,0,@4640 126,0,0 19191:D3,48|3b650c7303ff55248b4a04ff7004ff30ff71046848dc91b28b1989e090e8c2bfffff83c410c39090000000002c000000|@19057,2097151,@4436|20,0,@19192 30,1,@19023 19192:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700ece139b252508b5a088b4204909090e8960be9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e99413e9ff00000000a4000000|@19056,2097151,@4435|35,0,0 48,0,69 54,0,@4596 70,1,@6369 106,0,0 126,1,@19193 156,1,@6390 19193:D3,144|3b650c7303ff5524a80175578b088139ece139b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4434|16,0,@4596 126,0,0 19194:D3,48|3b650c7303ff55248b4a04ff7004ff30ff710468ecdd91b28b1989e090e81ebeffff83c410c39090000000002c000000|@19057,2097151,@4439|20,0,@19195 30,1,@19023 19195:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c7000ce239b252508b5a088b4204909090e8f209e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9f011e9ff00000000a4000000|@19056,2097151,@4438|35,0,0 48,0,69 54,0,@4600 70,1,@6369 106,0,0 126,1,@19196 156,1,@6390 19196:D3,144|3b650c7303ff5524a80175578b0881390ce239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4437|16,0,@4600 126,0,0 19197:D3,48|3b650c7303ff55248b4a04ff7004ff30ff71046890df91b28b1989e090e87abcffff83c410c39090000000002c000000|@19057,2097151,@4442|20,0,@19198 30,1,@19023 19198:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c70064e239b252508b5a088b4204909090e84e08e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e94c10e9ff00000000a4000000|@19056,2097151,@4441|35,0,0 48,0,69 54,0,@4611 70,1,@6369 106,0,0 126,1,@19199 156,1,@6390 19199:D3,144|3b650c7303ff5524a80175578b08813964e239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4440|16,0,@4611 126,0,0 19200:D3,48|3b650c7303ff55248b4a04ff7004ff30ff71046834e191b28b1989e090e8d6baffff83c410c39090000000002c000000|@19057,2097151,@4445|20,0,@19201 30,1,@19023 19201:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700e4e439b252508b5a088b4204909090e8aa06e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9a80ee9ff00000000a4000000|@19056,2097151,@4444|35,0,0 48,0,69 54,0,@4641 70,1,@6369 106,0,0 126,1,@19202 156,1,@6390 19202:D3,144|3b650c7303ff5524a80175578b088139e4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4443|16,0,@4641 126,0,0 19203:D3,48|3b650c7303ff55248b4a04ff7004ff30ff710468d8e291b28b1989e090e832b9ffff83c410c39090000000002c000000|@19057,2097151,@4448|20,0,@19204 30,1,@19023 19204:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700d4e439b252508b5a088b4204909090e80605e9ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9040de9ff00000000a4000000|@19056,2097151,@4447|35,0,0 48,0,69 54,0,@4639 70,1,@6369 106,0,0 126,1,@19205 156,1,@6390 19205:D3,144|3b650c7303ff5524a80175578b088139d4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4446|16,0,@4639 126,0,0 19206:D3,44|3b650c7303ff55248b4204ff70046878e491b28b1889e09090e892b7ffff83c408c390900000000028000000|@19031,2097151,@4451|15,0,@19207 26,1,@19023 19207:D3,44|3b650c7303ff5524b8b8e491b28b0c24890424bb010000008b420451e9171ae9ff9090900000000028000000|@19022,1048575,@4450|9,0,@19208 20,0,0 29,1,@6418 19208:O1|@19209 19209:D3,124|8b4c2404f6c30175628b13813adce439b27547813adce439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4449|13,0,@4640 21,0,@4640 30,0,@6377 19210:D3,44|3b650c7303ff55248b4204ff70046890e591b28b1889e09090e87ab6ffff83c408c390900000000028000000|@19031,2097151,@4454|15,0,@19211 26,1,@19023 19211:D3,44|3b650c7303ff5524b8d0e591b28b0c24890424bb010000008b420451e9ff18e9ff9090900000000028000000|@19022,1048575,@4453|9,0,@19212 20,0,0 29,1,@6418 19212:O1|@19213 19213:D3,124|8b4c2404f6c30175628b13813aece139b27547813aece139b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4452|13,0,@4596 21,0,@4596 30,0,@6377 19214:D3,44|3b650c7303ff55248b4204ff700468a8e691b28b1889e09090e862b5ffff83c408c390900000000028000000|@19031,2097151,@4457|15,0,@19215 26,1,@19023 19215:D3,44|3b650c7303ff5524b8e8e691b28b0c24890424bb010000008b420451e9e717e9ff9090900000000028000000|@19022,1048575,@4456|9,0,@19216 20,0,0 29,1,@6418 19216:O1|@19217 19217:D3,124|8b4c2404f6c30175628b13813a0ce239b27547813a0ce239b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4455|13,0,@4600 21,0,@4600 30,0,@6377 19218:D3,44|3b650c7303ff55248b4204ff700468c0e791b28b1889e09090e84ab4ffff83c408c390900000000028000000|@19031,2097151,@4460|15,0,@19219 26,1,@19023 19219:D3,44|3b650c7303ff5524b800e891b28b0c24890424bb010000008b420451e9cf16e9ff9090900000000028000000|@19022,1048575,@4459|9,0,@19220 20,0,0 29,1,@6418 19220:O1|@19221 19221:D3,124|8b4c2404f6c30175628b13813ae4e439b27547813ae4e439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4458|13,0,@4641 21,0,@4641 30,0,@6377 19222:D3,44|3b650c7303ff55248b4204ff700468d8e891b28b1889e09090e832b3ffff83c408c390900000000028000000|@19031,2097151,@4463|15,0,@19223 26,1,@19023 19223:D3,44|3b650c7303ff5524b818e991b28b0c24890424bb010000008b420451e9b715e9ff9090900000000028000000|@19022,1048575,@4462|9,0,@19224 20,0,0 29,1,@6418 19224:O1|@19225 19225:D3,124|8b4c2404f6c30175628b13813a64e239b27547813a64e239b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4461|13,0,@4611 21,0,@4611 30,0,@6377 19226:D3,44|3b650c7303ff55248b4204ff700468f0e991b28b1889e09090e81ab2ffff83c408c390900000000028000000|@19031,2097151,@4466|15,0,@19227 26,1,@19023 19227:D3,44|3b650c7303ff5524b830ea91b28b0c24890424bb010000008b420451e99f14e9ff9090900000000028000000|@19022,1048575,@4465|9,0,@19228 20,0,0 29,1,@6418 19228:O1|@19229 19229:D3,124|8b4c2404f6c30175628b13813ad4e439b27547813ad4e439b2740e89c6b854eb7ab28b5d049090ff138b75008d76e83b75087303ff5520897500c746fc020000008b7a08897e0489068d560cc742fc02000000894a048932eb0289ca89d18b5b043b650c7303ff5524eb9989c289c8c2040090900000000078000000|@6417,63,@4464|13,0,@4639 21,0,@4639 30,0,@6377 19230:D3,48|3b650c7303ff55248b48088b1c24890c24ff7204ff720889da8b58048b0889c852e91e0000009090000000002c000000|@19324,2097151,@4500|34,1,@19231 19231:D3,1076|3b650c7303ff55248b4d008d49dc3b4d087303ff5520894d00c741fc01000040c701030000008d5108c742fc01000040c702010000008d7208c746fc04000000c70654ef91b2895604894e08895e0c8066ffbf5356525150ff7504bf3eee91b2578965048b4424108b0083f80175718b45008d40f43b45087303ff5520894500c740fc020000009090c7004cfb91b28b4c240c8948048060ffbf8b55008d52a83b55087303ff5520895500c742fc04000000c7420c01000000894208c742048b000000c70274e539b28d4214c740fc04000000c7400c010000008b5c2408eb05e938020000895808c740048b0000009090c70084e539b28d7014c746fc02000000c74604a0fb91b289068d460cc740fc0200000089700489108d500cc742fc02000000894204c702580892b28d420cc740fc02000000895004c700b00892b283f80175068b442428eb0c89c38b44242890e8621c0000508b5c24188b4424289090e8b2bef4fff6400401740d8b4804b81c0992b28b5d04ff138b4004ff7504b9aaec91b2518965048b009090ff1548be520883c40459894d04eb2b9090908b650483c4045b895d0483381b740c89c189c88b5d04909090ff138b48088b59048b01e8220dffff8b08ff7004ff700cff7010ff7014ff7008f6c10175308b018b542434ff7004ff30ff720468600992b2ff71048b1a8d44240490e8deaeffff5983c4103b650c7303ff5524ebcb58a801752f8b088b542430ff7104ff31ff720468c00a92b2ff70048b1a8d442404e8aaaeffff5883c4103b650c7303ff5524ebcd58a801752f8b088b54242cff7104ff31ff720468200c92b2ff70048b1a8d442404e876aeffff5883c4103b650c7303ff5524ebcd58a801752f8b088b542428ff7104ff31ff720468800d92b2ff70048b1a8d442404e842aeffff5883c4103b650c7303ff5524ebcd58a801752f8b088b542424ff7104ff31ff720468e00e92b2ff70048b1a8d442404e80eaeffff5883c4103b650c7303ff5524ebcd58a801752f8b088b542420ff7104ff31ff720468401092b2ff70048b1a8d442404e8daadffff5883c4103b650c7303ff5524ebcd3b650c7303ff5524e947fdffffb80100000083c40459894d0483c414c20c009090908b650483c4045b895d048138cf00000075518b4c241050ff7008ff31bba01192b28b4104909090e81a3be8ff8b45008d40ec3b45087303ff5520894500c740fc04000000c7400cb41292b259894808c7400470137ab2c700cf0000008b5d049090ff138b48045089cbb8ccfe90b290e8e21ce8ffbbcc1292b29090e8d61ce8ff8b0d24f075b789c389c890e87a00e8ff8b0524f075b7ff7010bb983d7ab290e8a23ae8ff8b442414ff30bbdc1292b28b400490e88e3ae8ff8b04248b4d008d49ec3b4d087303ff5520894d00c741fc04000000c7410c381392b28b50088951088b58048959048b30893189c883c4048b5d04909090ff139090900000000030040000|@19323,2097151,@4499|34,0,1 50,0,0 66,0,@19232 92,0,$19231+818 139,0,@19251 181,0,0 191,0,69 197,0,@4659 214,0,0 235,0,69 243,0,@4661 260,0,@19253 296,0,@19291 315,0,@19294 338,1,@19295 354,1,@12720 368,0,@19296 384,0,$19231+414 398,0,I32 450,1,@17303 491,0,@19299 506,1,@19023 544,0,@19301 558,1,@19023 596,0,@19303 610,1,@19023 648,0,@19305 662,1,@19023 700,0,@19307 714,1,@19023 752,0,@19309 766,1,@19023 798,0,0 830,0,103 847,0,@19311 858,1,@5038 889,0,@19318 900,0,@4956 906,0,103 924,0,@17318 930,1,@4940 935,0,@19319 942,1,@4940 948,0,@20261 958,1,@4897 964,0,@20261 972,0,@5078 978,1,@5038 989,0,@19320 998,1,@5038 1032,0,@19322 19232:D3,108|3b650c7303ff55248b420c52ff30bbd4ef91b28b480489c890e8123ae8ff83f80175158b04248b4004c70003000000b80100000083c404c383381575208b0c248b51088b12f6c201740583c2027105ff5538ebf68b4908891183c404c383c404c39090900000000068000000|@19250,2097151,@4473|15,0,@19233 26,1,@5038 43,0,1 48,0,0 19233:O1|@19234 19234:D3,184|3b650c7303ff55248b086a016a01508d54240452bb0300000089c8baa8f091b290e8be0000008b442404909090e85221e8ff5983c4045a8911a8017407b903000000eb068b088d4c090183f9017506b801000000c3a8017407b903000000eb068b088d4c0901f6c101740783f9017e08eb13f641ff10740d89c1b8a8f179b28b5d0490ff13a80175080fb640048d44000189c18b45008d40f83b45087303ff5520894500c740fc010000008908c3909000000000b4000000|@19249,2097151,@4472|21,0,1 28,0,@19235 34,1,@19237 46,1,@4953 62,0,1 80,0,0 90,0,1 123,0,@4898 19235:O2|@19237,@19236 19236:O2|@19241,I48 19237:D3,720|3b650c7303ff552483380175678b7004f7c6010000007407b903000000eb068b0e8d4c090183f90175358b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089318b542404890a8b4808894a04b801000000c2040089cff7c7010000007412f6400c01740c2b780ceb05e9080200007105ff5538ebef83c701f6c301740cf7c70100000074043bdfeb05ff5538ebf77d6b8b4d008d49f83b4d087303ff5520894d00c741fc010000008919ff700856ff701053ff700c518b5c240489f09090e81e2fe8ffff70088b58048b0889c890e8060200008b4d008d49f43b4d087303ff5520894d00c741fc02000000c7410401000000890158a8017415eb05e95a000000f604240174088d40ff0304247105ff5538ebf38b55008d52e83b55087303ff5520895500c742fc0500000083c4045b895a1089420c8b4424048942085883c404894204c702010000008b4424048908895004b801000000c2040089cff7c701000000740bf6400c0174052b780c7105ff5538ebf683c701f6c301750bf7c7010000007503ff55383bdf7553ff70086a018b580c89f090e8462ee8ffff70088b58048b0889c890e82e0100008b4d008d49f43b4d087303ff5520894d00c741fc02000000c741040100000089018b442408890859894804b801000000c20400f6c101740bf6400c0174052b480c7105ff5538ebf683c101f6c3017409f6c10174042bd97105ff5538ebf783c3016a016a0156ff700c528d4c240c518b400890e8d2fdffff6a018b5c24088b44240c90e8ae2de8ffff70088b58048b0889c890e8960000008b4d008d49f43b4d087303ff5520894d00c741fc0200000083c40c5a89510489018b442408890859894804b801000000c204008b4d008d49f03b4d087303ff5520894d00c741fc030000008959088b58088959048b70048931538b5a0489c8e81236e8ff8b4c24048b1089118b5804895904b801000000c2040000000000cc020000|@19240,2097151,@4468|25,0,1 69,0,0 88,0,0 202,1,@5025 218,1,@19238 249,0,0 336,0,0 350,0,0 418,1,@5025 434,1,@19238 465,0,0 482,0,0 570,1,@5025 586,1,@19238 634,0,0 686,1,@5038 705,0,0 19238:D3,228|8b542404f6c2017407b903000000eb068b0a8d4c090183f80175093bd9750589d0c2040083fb017508b848c05208c2040083fb03751083c008d1e80fb604028d440001c2040089d983c10ec1e90283c90181f9ffffff01720c89c6b8e00c7ab28b5d04ff1389c6b8010000008d7c0902f7df037d003b7d0872053b7d007203ff5520897d00d1e9894ffcc647ff4157c1e102d1e8f3aa8d4400015fd1eb891f8d5c1b0183c60889f089d689f989cf5189d9d1e9d1e803f08d44000183c704f3a48d7c3f018d7436018d4c09018b04248060ffbf83c404c2040090909000000000e0000000|@19239,63,@4467|10,0,1 42,0,I48 83,0,16777215 92,0,@4941 104,0,0 19239:S19|537562737472696e672e766563746f72283129 19240:S29|426173696353747265616d494f28292e696e7075744e4c697374283229 19241:D3,84|3b650c7303ff55246a016a01ff70088d4c240451ff72048b58048b0889c8909090e8420000008b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c4048908c30000000050000000|@19248,1048575,@4471|34,1,@19242 19242:D3,784|3b650c7303ff55248b08833905754c8b4d008d49e43b4d087303ff5520894d00c741fc02000000c74104010000008b54240489118d710cc746fc03000000895e08894604c706030000008b4424088908897004b801000000c20c0083390175658b5104f6c2017407b803000000eb068b028d44000183f80175508b45008d40e43b45087303ff5520894500c740fc02000000c740040100000089108d700cc746fc03000000895e088b5908895e04c706030000008b7c24088907897704b801000000c20c00e9af010000a801740ff644240c0174083b44240c7e71eb05ff5538ebf38b45008d40f83b45087303ff5520894500c740fc010000008b74240c893053ff710852ff710c50bb0100000089d090e84e2ae8ffff70088b58048b0889c890e836fdffff8b4d008d49e43b4d087303ff5520894d00c741fc02000000c741040100000089018d410ceb05e95f000000c740fc030000008b54240c8950088b542408895004c700030000008b55008d52e83b55087303ff5520895500c742fc050000005b895a108b5c2418895a0c8942085883c408894204c702010000008b4424088908895004b801000000c20c00a801750af644240c017503ff55383b44240c754b8b45008d40e43b45087303ff5520894500c740fc02000000c740040100000089108d700cc746fc03000000895e088b5908895e04c706030000008b7c24088907897704b801000000c20c008b74240cf7c6010000007408a80174042bf07105ff5538ebf783c6016a016a0152568d44240850ff7424188b4108e8befdffff8b45008d40f43b45087303ff5520894500c740fc020000008b4c24048948045983c40489088b4c240c890158894104b801000000c20c006a016a0153508d4c240851ff74241890e8960000008b4c2408f6c1017407b803000000eb068b018d44000183f80175398b45008d40f43b45087303ff5520894500c740fc02000000c740040100000089088b4c241889018b44240c894104b80100000083c410c20c008b44241c8b4c24188b5424148944241c894c2418895424148b5c24045883c40ce9f9fcffff90000000000c030000|@19247,1048575,@4470|42,0,0 70,0,1 84,0,0 105,0,1 149,0,0 176,0,1 190,0,0 266,0,0 274,1,@5025 290,1,@19238 321,0,0 360,0,1 411,0,0 425,0,0 479,0,0 506,0,1 520,0,0 626,0,0 650,1,@19243 664,0,1 708,0,0 728,0,0 19243:D3,468|3b650c7303ff55248b08833903756b8b5104f642240174678b75008d76f03b75087303ff5520897500c746fc03000000c7460854fa91b2c74604501b7ab28b3a893e8b7d008d7fec3b7d087303ff5520897d00c747fc04000000c7470c64fa91b2897708c747049cf379b2c7072ce039b289c689f88b5d04eb0ae9d3000000e905000000909090ff138b7224837a14017507bf01000000eb318b7a14535051ff722cff36b8010000008b1790ff128b7d008d7ff83b7d087303ff5520897d00c747fc010000008907eb08535051ff722cff36578b4424088b54240490ff128b4d008d49f83b4d087303ff5520894d00c741fc010000408b54240c89118b55008d52dc3b55087303ff5520895500c742fc040000005b83c40c895a0c894a08894204c702010000005b89138d5214c742fc030000005b895a08894a04c702030000008b4c24088901895104b801000000c2080083390575398b4d008d49f03b4d087303ff5520894d00c741fc03000000895908894104c701030000008b4424088b5424048910894804b801000000c208008b45008d40f03b45087303ff5520894500c740fc030000008958088b5108895004c700030000008b5c24088b71048933894304b801000000c208009000000000d0010000|@19246,1048575,@4469|51,0,@19244 58,0,@5011 93,0,@19245 103,0,@4908 109,0,@4580 147,0,0 165,0,0 291,0,0 317,0,1 331,0,0 375,0,1 393,0,0 435,0,1 452,0,0 19244:S5|696e707574 19245:O5|@4907,140,0,140,0 19246:S25|426173696353747265616d494f28292e696e70757427283229 19247:S30|426173696353747265616d494f28292e696e7075744e4c69737427283329 19248:S30|426173696353747265616d494f28292e696e7075744e4c69737427283129 19249:S32|4261736963496d7065726174697665494f28292e696e70757431283129283129 19250:S41|4d414b455f28292e636f6d70696c65496e746f456e7628312975736528332967657443686172283129 19251:D3,16|8b52048b1289d0c3000000000c000000|@19252,5,@4474| 19252:S39|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329636f64652d283129 19253:O2|@19255,@19254 19254:O2|@7332,@19265 19255:O4|@4718,69,@19256,0 19256:O1|@19257 19257:D3,292|3b650c7303ff55248b480c8338017507ba0cfd91b2eb05ba1cfd91b252ff31ff7008bb030000008b4108bafc317ab29090e81a36e8ff508b4424049090e89af1fbff8b4d008d49dc3b4d087303ff5520894d00c741fc02000000c741042cfd91b289018d410cc740fc02000000894804c70038fd91b28d480cc741fc020000008941045883c40489018b45008d40e83b45087303ff5520894500c740fc02000000894804c70044fd91b28d480cc741fc020000008941045889018b45008d40e83b45087303ff5520894500c740fc02000000894804c70054fd91b289c18d400cc740fc02000000894804598908e89a14e8ff8b0d24f075b789c389c890e872f2e7ff8b0524f075b78b48108b1424890c24bb983d7ab252e9942ce8ff0000000020010000|@19264,2097151,@4475|17,0,@19258 24,0,@19259 35,0,1 43,0,@5052 50,1,@5053 62,1,@15923 93,0,@19260 114,0,@19261 166,0,@19262 215,0,@19263 238,1,@4953 244,0,@20261 254,1,@4897 260,0,@20261 274,0,@5078 280,1,@5038 19258:S8|5761726e696e672d 19259:S6|4572726f722d 19260:O2|10,0 19261:S2|2e0a 19262:S8|272c206c696e6520 19263:S5|20696e2027 19264:S43|4d414b455f28292e636f6d70696c65496e746f456e762831297573652833296572726f7250726f63283129 19265:O2|@19267,@19266 19266:O2|@7362,@19268 19267:O4|@4676,69,1,0 19268:O2|@19270,@19269 19269:O2|@19284,@19283 19270:O4|@4747,69,@19271,0 19271:O1|@19272 19272:D3,40|3b650c7303ff5524b98d0000008b1424890c24bb98668eb252e91e00000090900000000024000000|@19282,1048575,@4480|9,0,70 20,0,@16152 26,1,@19273 19273:D3,84|3b650c7303ff552453ff74240853ff742410bb010000009090e84a000000a801750af6442408017503ff55383b442408740db8150000005a5983c40451ff22b80100000083c404c2040090900000000050000000|@19281,1048575,@4479|19,0,0 26,1,@19274 51,0,10 64,0,0 19274:D3,580|3b650c7303ff55248b08f6c101750e89c2b808a87cb28b5d049090ff1383f901756b8b08f6c101750c89c2b808a87cb28b5d04ff1383f901740f89c1b804ef8db28b5d04909090ff13f6c301740ef640040174088d5bff0358047105ff5538ebf353ff7008ff70108b5c241890e8e601000083f80175468b4424188b4c24148b5424108b5c2404895c2418eb05e964000000894c24148b5c2408895c24108b5c240c8954240cbe480392b28974240889de89c35883c40456e9f70300008b0c248b542418ff30f6c1017524ff710452ff742420ff7424208b5c241c8b01e81effffff89c2593b650c7303ff5524ebd75883c40cc20c008b08f6c101750c89c2b808a87cb28b5d04ff1383f90375648b08f6c101750c89c2b808a87cb28b5d04ff1383f903740f89c1b8c4ef8db28b5d04909090ff138b4804ff7004f6c101740783f9017e37eb06f641ff10752f51b8410000008b54241090ff1258a801740583e8027105ff5538ebf689c13b650c730aeb05e942000000ff5524ebbf8b442410a801740bf604240174052b04247105ff5538ebf683c001a801740783f8017f13eb06f640ff10740bb80100000083c404c20c0083c404c20c008b08f6c101750d89c2b808a87cb28b5d0490ff1383f907740f89c1b83cf08db28b5d04909090ff13ff70048b04248b54240c90ff1259f6c1017407b803000000eb068b018d4400018b4c240cf6c1017408a80174042bc87105ff5538ebf783c101f6c101740783f9017f10eb06f641ff107408b801000000c20c0089c8c20c009090900000000040020000|@19280,1048575,@4478|18,0,@7422 44,0,@7422 61,0,@15924 110,1,@19275 167,0,@19277 185,1,@19278 256,0,@7422 280,0,@7422 297,0,@15928 335,0,32 425,0,0 451,0,@7422 469,0,@15933 501,0,1 557,0,0 19275:D3,536|3b650c7303ff55248b08f6c101750e89c2b808a87cb28b5d049090ff1383f90175708b08f6c101750c89c2b808a87cb28b5d04ff1383f901740f89c1b804ef8db28b5d04909090ff138b4d008d49ec3b4d087303ff5520894d00c741fc040000008b501089510c8b700c8971088b78088979048b780489398b7d008d7ff83b7d087303ff5520897d00c747fc01000000eb05e938000000891f8b490cf6c101752b83ff017507b801000000eb0fff71048b1f8b0190e846ffffffeb03ff710489c7593b650c7303ff5524ebd089f8c38b08f6c101750f89c2b808a87cb28b5d04909090ff1383f903755a8b08f6c101750c89c2b808a87cb28b5d04ff1383f903740f89c1b8c4ef8db28b5d04909090ff138b4d008d49f43b4d087303ff5520894d00c741fc020000008b50088951048b70048931f6c3017410f60101740b3b197c3deb0ae93c000000ff5538ebf0f6c3017409f6010174042b197105ff5538ebf783c3018b45008d40f83b45087303ff5520894500c740fc010000008918c3b801000000c38b08f6c101750d89c2b808a87cb28b5d0490ff1383f907740f89c1b83cf08db28b5d04909090ff138b4004a8017407b903000000eb068b088d4c0901f6c1017409f6c30174043bcbeb05ff5538ebf77f31f6c3017409f6c10174042bd97105ff5538ebf783c3018b45008d40f83b45087303ff5520894500c740fc010000008918c3b801000000c39090900000000014020000|@19276,63,@4476|18,0,@7422 44,0,@7422 61,0,@15924 167,0,0 217,0,@7422 244,0,@7422 261,0,@15928 384,0,0 399,0,@7422 417,0,@15933 437,0,1 520,0,0 19276:S31|5072657474792e7072657474795072696e7428332967657453697a65283229 19277:O1|@19274 19278:D3,992|3b650c7303ff5524a80175658b088b09f6c10175108b50048b30b808a87cb28b5d0490ff1383f9037559f6400401740589d8c214008b088b09f6c101750f8b50048b30b808a87cb28b5d04ff1383f903740f8b48048b10b8c4ef8db28b5d04ff138b08837c2414017563f6c3017419eb05e95c030000f6410401740c3b59047f0ceb68e938020000ff5538ebef89daf6c201740bf641040174052b51047105ff5538ebf683c2018b700453ff7004ff7108ff7104f7c601000000756d8b068b00a801751589c1b808a87cb2eb05e9840000008b5d049090ff1383f80375238b45008d40f83b4508730aeb05e95a000000ff5520894500c740fc010000008910eb42ff760489d38b0690e896fcffffa801750d8b105e3b650c7303ff5524eb95b80100000083c404eb1a8b45008d40f83b45087303ff5520894500c740fc01000000891083f8017567eb1653ff7004ff7108ff7104eb0a53ff7004ff7108ff7104b8150000008b542420909090ff128b44241ca8017410f64424040174098d40ff034424047105ff5538ebf2a801740783f8017e36eb06f640ff10752e50b8410000008b5424249090ff1258a801eb05e982000000740583e8027105ff5538ebf63b650c7303ff5524ebc18b442418a801740df644241c0174062b44241c7105ff5538ebf583c001a801740df64424040174062b4424047105ff5538ebf583c0018b4c24248b5424208b5c241c8b7424188b7c2414894c242489542420895c241c89742418897c241489c383c4085883c404e9cafdffff8b0424a801740783f8017e2deb06f640ff10752550b8410000008b542424ff1258a801740583e8027105ff5538ebf63b650c7303ff5524ebca8b44240ca801740bf604240174052b04247105ff5538ebf683c0018b4c24248b5424208b5c241c8b7424188b7c2414894c242489542420895c241c89742418897c241489c383c4085883c404e940fdffff8b088b09f6c10175108b50048b30b808a87cb28b5d0490ff1383f90775668b088b09f6c10175128b50048b30b808a87cb28b5d04909090ff1383f907740f8b48048b10b83cf08db28b5d04ff138b0853ff7004ff71048b04248b54241c909090ff1259f6c1017407b803000000eb068b018d4400018b4c2404f6c101740fa801740beb05e93f0000002bc87105ff5538ebf783c1018b44241c8b5424188b5c24148b7424108b7c240c8944241c89542418895c241489742410897c240c89cb5883c404e978fcffffff700453ff742418ff7424148b5c241c8b008b5424149090ff128b4c24188b5424148b5c24108b74240c8b7c2408894c241889542414895c24108974240c897c240889c358e92efcffff89d8c214009000000000dc030000|@19279,1048575,@4477|27,0,@7422 68,0,@7422 88,0,@15928 199,0,@7422 266,1,@19275 288,0,0 353,0,10 414,0,32 588,0,32 719,0,@7422 749,0,@7422 772,0,@15933 809,0,1 19279:S40|5072657474792e7072657474795072696e742833296c61794f7574283329646f5072696e74283229 19280:S30|5072657474792e7072657474795072696e742833296c61794f7574283329 19281:S21|5072657474792e7072657474795072696e74283329 19282:S24|5072657474792e7072657474795072696e74283129283129 19283:O2|@7336,@19287 19284:O4|@4672,69,@19285,0 19285:O1|@19286 19286:D3,16|b829000000c39090000000000c000000|@19252,1,@4481|1,0,20 19287:O2|@7338,@19288 19288:O2|@7346,@19289 19289:O2|@7340,@19290 19290:O2|@7344,0 19291:O4|@4681,69,@19292,0 19292:O1|@19293 19293:D3,40|3b650c7303ff5524b98d0000008b1424890c24bb98668eb252e9a2f5ffff90900000000024000000|@19282,1048575,@4482|9,0,70 20,0,@16152 26,1,@19273 19294:O4|@4674,69,1,0 19295:D3,68|3b650c7303ff5524a801752bff308b4004e8eaffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c389d8c390900000000040000000|@6536,11,@4483| 19296:O4|103,@4956,@19298,@19297 19297:O5|@19029,303,0,303,0 19298:S13|537461746963204572726f7273 19299:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700dce439b252508b5a088b4204909090e87edee8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e97ce6e8ff00000000a4000000|@19056,2097151,@4485|35,0,0 48,0,69 54,0,@4640 70,1,@6369 106,0,0 126,1,@19300 156,1,@6390 19300:D3,144|3b650c7303ff5524a80175578b088139dce439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4484|16,0,@4640 126,0,0 19301:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700ece139b252508b5a088b4204909090e81edde8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e91ce5e8ff00000000a4000000|@19056,2097151,@4487|35,0,0 48,0,69 54,0,@4596 70,1,@6369 106,0,0 126,1,@19302 156,1,@6390 19302:D3,144|3b650c7303ff5524a80175578b088139ece139b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4486|16,0,@4596 126,0,0 19303:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c70064e239b252508b5a088b4204909090e8bedbe8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9bce3e8ff00000000a4000000|@19056,2097151,@4489|35,0,0 48,0,69 54,0,@4611 70,1,@6369 106,0,0 126,1,@19304 156,1,@6390 19304:D3,144|3b650c7303ff5524a80175578b08813964e239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4488|16,0,@4611 126,0,0 19305:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700e4e439b252508b5a088b4204909090e85edae8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e95ce2e8ff00000000a4000000|@19056,2097151,@4491|35,0,0 48,0,69 54,0,@4641 70,1,@6369 106,0,0 126,1,@19306 156,1,@6390 19306:D3,144|3b650c7303ff5524a80175578b088139e4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4490|16,0,@4641 126,0,0 19307:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c700d4e439b252508b5a088b4204909090e8fed8e8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e9fce0e8ff00000000a4000000|@19056,2097151,@4493|35,0,0 48,0,69 54,0,@4639 70,1,@6369 106,0,0 126,1,@19308 156,1,@6390 19308:D3,144|3b650c7303ff5524a80175578b088139d4e439b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4492|16,0,@4639 126,0,0 19309:D3,168|3b650c7303ff55248b45008d40ec3b45087303ff5520894500c740fc04000000c7400c010000008b4a0c894808c740048b000000c7000ce239b252508b5a088b4204909090e89ed7e8ff83f80175268b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008b0c248908eb0d8b1c248b00909090e83a0000008b4c240483c4048b542404894424048b590883c4048b410452e99cdfe8ff00000000a4000000|@19056,2097151,@4495|35,0,0 48,0,69 54,0,@4600 70,1,@6369 106,0,0 126,1,@19310 156,1,@6390 19310:D3,144|3b650c7303ff5524a80175578b0881390ce239b275218b48048b45008d40f43b45087303ff5520894500c740fc020000008948048918c3518b40049090e8beffffff89c18b45008d40f43b45087303ff5520894500c740fc02000000894804598908c38b45008d40f43b45087303ff5520894500c740fc02000000c74004010000008918c3909090000000008c000000|@6389,11,@4494|16,0,@4600 126,0,0 19311:O1|@19312 19312:D3,64|3b650c7303ff55248b00833801750d8b40083b650c7303ff5524ebee8b48088b1424890c24bbfc1192b28b480489c852e9a717e8ff909090000000003c000000|@19317,2097151,@4497|38,0,@19313 49,1,@5038 19313:O1|@19314 19314:D3,68|3b650c7303ff55248b0883390375138b4904c7005c1292b2b8010000008b510cff228339057506b801000000c38b41083b650c7303ff5524ebce90900000000040000000|@19316,1048575,@4496|20,0,@19315 25,0,0 40,0,0 19315:O1|2 19316:S26|426173696353747265616d494f28292e646f436c6f7365283129 19317:S33|4261736963496d7065726174697665494f28292e636c6f7365496e283129283129 19318:O5|@19029,320,0,320,0 19319:S8|207261697365640a 19320:O1|@19321 19321:D3,64|3b650c7303ff55248b00833801750d8b40083b650c7303ff5524ebee8b48088b1424890c24bbfc1192b28b480489c852e96b16e8ff909090000000003c000000|@19317,2097151,@4498|38,0,@19313 49,1,@5038 19322:O5|@19029,326,0,326,0 19323:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329 19324:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283129 19325:S25|4d414b455f28292e636f6d70696c65496e746f456e76283129 19326:O1|@19327 19327:D3,64|3b650c7303ff55248b00833801750d8b40083b650c7303ff5524ebee8b48088b1424890c24bbfc1192b28b480489c852e98315e8ff909090000000003c000000|@19317,2097151,@4502|38,0,@19313 49,1,@5038 19328:S21|4d414b455f28292e757365496e746f456e76283329 19329:S27|4d414b455f28292e757365496e746f456e76283129283129283129 19330:S24|4d414b455f28292e757365496e746f456e76283129283129 19331:O3|2,@5306,@6000 19332:O2|@19334,@19333 19333:O2|@19335,0 19334:S3|757365 19335:O4|@4596,69,@19336,0 19336:O7|@19334,2,@19337,@19331,@5229,0,0 19337:O2|1,@19338 19338:O3|2,@19339,0 19339:O2|@19340,@5210 19340:D3,36|3b650c7303ff55248b52048b0c24891424bb0100000051e968a5ffff0000000020000000|@19329,2097151,@4506|18,0,0 24,1,@19127 19341:O2|@19343,@19342 19342:O2|@19344,0 19343:S8|6465627567546167 19344:O4|@4596,69,@19345,0 19345:O7|@19343,2,@19346,@18745,@5229,0,0 19346:O2|1,@19347 19347:O3|2,@19348,0 19348:O3|@19350,@19352,@19349 19349:O2|@19354,@4675 19350:O2|@19351,@4675 19351:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4507|8,0,0 14,0,1 19352:O2|@19353,@4675 19353:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4508|29,0,0 39,0,69 19354:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4509|10,0,@6377 19355:O2|@18675,@19356 19356:O2|@19357,0 19357:O4|@4600,69,@19358,0 19358:O2|@19359,0 19359:O3|@18675,@5229,@19360 19360:O3|@19362,@19381,@19361 19361:O3|@19382,@5256,@5255 19362:O2|1,@19363 19363:O3|2,@19365,@19364 19364:O2|@19372,0 19365:O4|@19367,@4808,@19369,@19366 19366:O1|@19371 19367:O1|@19368 19368:D3,16|b8a8d95208c39090000000000c000000|@5726,1,@4510|1,0,I251 19369:O1|@19370 19370:D3,16|b805000000c39090000000000c000000|@5735,1,@4511|1,0,2 19371:D3,16|b803000000c39090000000000c000000|@5737,1,@4512|1,0,1 19372:O4|@4607,69,@19373,0 19373:O3|2,4,@19374 19374:O5|@5429,@19376,@5765,@19375,@5387 19375:O4|@19365,@19367,@19369,@19366 19376:O2|@5433,@19377 19377:O2|@5745,@19378 19378:O2|@19379,@5750 19379:O2|@19380,@5413 19380:O3|0,@4808,0 19381:O4|1,@4654,1,0 19382:S12|4172726179322e6172726179 19383:O2|@19385,@19384 19384:O2|@19386,0 19385:S11|66696c654e616d65546167 19386:O4|@4596,69,@19387,0 19387:O7|@19385,2,@19389,@19388,@5229,0,0 19388:O5|5,@5787,@18757,@18756,@5229 19389:O2|1,@19390 19390:O3|2,@19391,0 19391:O3|@19393,@19395,@19392 19392:O2|@19397,@4661 19393:O2|@19394,@4661 19394:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4513|8,0,0 14,0,1 19395:O2|@19396,@4661 19396:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4514|29,0,0 39,0,69 19397:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4515|10,0,@6377 19398:O2|@19400,@19399 19399:O2|@19401,0 19400:S14|7072696e744f7574707574546167 19401:O4|@4596,69,@19402,0 19402:O7|@19400,2,@19403,@18831,@5229,0,0 19403:O2|1,@19404 19404:O3|2,@19405,0 19405:O3|@19407,@19409,@19406 19406:O2|@19411,@4747 19407:O2|@19408,@4747 19408:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4516|8,0,0 14,0,1 19409:O2|@19410,@4747 19410:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4517|29,0,0 39,0,69 19411:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4518|10,0,@6377 19412:O2|@19414,@19413 19413:O2|@19415,0 19414:S16|7072696e74446570746846756e546167 19415:O4|@4596,69,@19416,0 19416:O7|@19414,2,@19417,@18848,@5229,0,0 19417:O2|1,@19418 19418:O3|2,@19419,0 19419:O3|@19421,@19423,@19420 19420:O2|@19425,@4672 19421:O2|@19422,@4672 19422:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4519|8,0,0 14,0,1 19423:O2|@19424,@4672 19424:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4520|29,0,0 39,0,69 19425:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4521|10,0,@6377 19426:O2|@13221,@19427 19427:O2|@19428,0 19428:O4|@4596,69,@19429,0 19429:O7|@13221,2,@19431,@19430,@5229,0,0 19430:O3|2,@5306,@19449 19431:O2|1,@19432 19432:O3|2,@19433,0 19433:O1|@19434 19434:D3,372|3b650c7303ff5524a8017407b903000000eb068b088d4c0901f6c101740783f9057e52eb06f641ff10754aa8017407b903000000eb068b088d4c0901f6c101740783f9057e08eb15f641ff10740f89c1b8a8f179b28b5d04909090ff13a801750a0fb648068d4c0901eb0289c181f9f10000007407b903000000eb05b905000000a8017407ba03000000eb068b108d541201525068f01e92b2518d5c2404b8010000009090e852010000a80175708b08ff7104ff31bb14a57db28b0424909090ff1568d7520883f801740ab8f82c92b28b5d04ff13f604240175138b0c248b01f641ff107402f7d88d440001eb038b04248b4d008d49ec3b4d087303ff5520894d00c741fc0200000083c4045a89510489018d410cc740fc01000000eb05e9040000008908eb05b801000000a80175208b008b4d008d49f83b4d087303ff5520894d00c741fc010000008b008901eb05b901000000f6c101740bb8542d92b28b5d0490ff138b0183c40cc3900000000070010000|@19448,2097151,@4525|13,0,1 48,0,1 81,0,@4898 111,0,120 118,0,1 125,0,2 134,0,1 149,0,@19435 159,0,0 166,1,@19436 182,0,@8059 194,0,I233 204,0,@19440 296,0,0 337,0,0 347,0,@19444 19435:D3,96|3b42087506b801000000c3f6420401751489c183c1088b5204d1e90fb60c0a8d4c0901eb038b4a0483c0028b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc010000008910c3909090000000005c000000|@13335,7,@4522|6,0,0 19436:D3,2692|3b650c7303ff5524837c2404057423837c2404037415837c2404077407b905000000eb13b911000000eb0cb915000000eb05b92100000053515089daff12a80175558b088339617553ff71048b04248b54240c90ff12a80175578b088139ef0000007559837c2414057557ff71048b04248b542410909090ff12a80175668b088139f100000074088139b10000007559837c241805eb0ae9d3090000e91a080000752dff7104ff742414bb01000000eb05e9ba070000b801000000eb0ae986040000e9fa0200009090e8ca090000eb5aba01000000bb010000008b710453565289f0eb0ae9d1020000e9480100008b54241c9090ff12a801755f8b088b11f6c201740783fa617c56eb06f642ff107566bb61000000f6c3017417f64424180174108d5bff035c2418eb05e9480700007105ff5538ebebf6c2017409f6c30174043bd3eb05ff5538ebf77d66ff7104528b5c24208b442410eb0ae993000000e94e00000090ff15c8c75208a8017415f6042401740feb05e9360000008d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e92cffffff833c240174338b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc010000008918eb47b801000000eb40833c240174358b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc010000008908eb05b80100000083c40ceb5d837c241805751bff3424ff742414bb01000000b801000000909090e842080000eb61ba01000000bb010000008b342453565289f08b54241c9090ff12a80175628b088b11f6c201740783fa617c59eb06f642ff107568bb61000000eb05e9df050000f6c3017410f64424180174098d5bff035c24187105ff5538ebf2f6c2017410eb05e9b9050000f6c30174043bd3eb05ff5538ebf77d67ff7104528b5c2420eb0ae998000000e9530000008b4424109090ff15c8c75208a8017415eb05e93c000000f604240174088d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e930ffffff833c240174338b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc010000008918eb47b801000000eb40833c240174358b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc010000008908eb05b80100000083c40ceb54b801000000eb52837c2414057518ff7104ff742410bb01000000b801000000e8ba060000eb58ba01000000bb010000008b710453565289f08b5424189090ff12a80175618b088b11f6c201741183fa617c58eb10e964040000e95f040000f642ff107566bb61000000f6c3017417f64424140174108d5bff035c2414eb05e9070100007105ff5538ebebf6c2017409f6c30174043bd3eb05ff5538ebf77d68ff710452eb0ae99d000000e9580000008b5c241c8b442410909090ff15c8c75208a8017415f6042401eb05e93800000074088d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e92cffffff833c240174338b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc010000008918eb47b801000000eb40833c240174358b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc010000008908eb05b80100000083c40c6a01eb5c8139f100000074088139b1000000755d837c241405755b837c241405751aff7104ff742410bb01000000b8010000009090e81a050000eb58ba01000000bb010000008b710453565289f08b5424189090ff12a801755b8b088b11eb05e9ce020000f6c201741183fa617c69eb10e931010000e92c010000f642ff10755cbb61000000f6c3017417f6442414017410eb05e98f0200008d5bff035c24147105ff5538ebf2f6c201740ef6c30174093bd3eb0ae9a8000000ff5538ebf27d61ff7104528b5c241c8b442410909090ff15c8c75208eb0ae945000000e940000000a801740ef604240174088d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e927ffffff833c240174338b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc010000008918eb47b801000000eb40833c240174358b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc010000008908eb05b80100000083c40ceb5c837c241405751aff742404ff742410bb01000000b80100000090e88e030000eb61ba01000000bb010000008b74240453565289f08b54241890ff12a80175628b088b11f6c201740783fa617c59eb06f642ff107568bb61000000eb05e920010000f6c3017410f64424140174098d5bff035c24147105ff5538ebf2f6c2017410eb05e9fa000000f6c30174043bd3eb05ff5538ebf77d67ff7104528b5c241ceb0ae998000000e9530000008b4424109090ff15c8c75208a8017415eb05e93c000000f604240174088d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e931ffffff833c240174338b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc010000008918eb47b801000000eb40833c240174358b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc010000008908eb05b80100000083c40c6a01eb07b8010000006a0183f80175398b45008d40ec3b45087303ff5520894500c740fc020000008b4c2404894804c7000100000089c18d400cc740fc01000000890883c414c2040083c414c20400833913720583391b760583394175178b542410895424108b5c24088b410483c40ce91ff7ffff837c24100575288b1424895424108b5424088b5c240c8954240c89dabb01000000b80100000083c40c52e988010000ba01000000bb010000008b342453565289f08b5424149090ff12a80175628b088b11f6c201740783fa617c59eb06f642ff107561bb61000000f6c3017410f64424100174098d5bff035c24107105ff5538ebf2f6c2017409f6c30174043bd3eb05ff5538ebf77d65ff7104528b5c24188b442410ff15c8c75208a8017421eb0ae990000000e943000000f6042401740f8d40ffeb05e9330000000304247105ff5538ebeca801740583e8607105ff5538ebf683c4045e89c3ba0300000083c40c3b650c7303ff5524e940ffffff833c240174378b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424048973048b74240889338d430cc740fc01000000891883c418c20400b80100000083c418c20400833c240174398b45008d40ec3b45087303ff5520894500c740fc020000008b4c24048948048b4c2408890889c18d400cc740fc01000000890883c418c20400b80100000083c418c20400b80100000083c40cc20400909000000000800a0000|@19439,2097151,@4524|30,0,2 37,0,8 44,0,10 51,0,16 94,0,119 130,0,120 138,0,88 171,0,0 183,0,0 202,1,@19437 209,0,0 214,0,0 273,0,48 358,0,I108 413,0,1 491,0,0 557,0,0 581,0,0 586,0,0 594,1,@19437 601,0,0 606,0,0 653,0,48 746,0,I108 801,0,1 879,0,0 945,0,0 955,0,0 976,0,0 981,0,0 986,1,@19437 993,0,0 998,0,0 1055,0,48 1142,0,I108 1197,0,1 1275,0,0 1341,0,0 1354,0,120 1362,0,88 1390,0,0 1395,0,0 1402,1,@19437 1409,0,0 1414,0,0 1478,0,48 1558,0,I108 1618,0,1 1696,0,0 1762,0,0 1787,0,0 1792,0,0 1798,1,@19437 1805,0,0 1810,0,0 1857,0,48 1950,0,I108 2005,0,1 2083,0,0 2149,0,0 2161,0,0 2205,0,0 2302,0,0 2307,0,0 2316,1,@19437 2321,0,0 2326,0,0 2373,0,48 2438,0,I108 2505,0,1 2587,0,0 2661,0,0 2672,0,0 19437:D3,684|3b650c7303ff552453508b4424108b54240c9090ff12a80175598b088b11f6c201740783fa617c63eb06f642ff107560f6c201740783fa737f5beb06f642ff107458ff710452bb210000008b44240c90ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740ceb05e9df01000083e8607105ff5538ebf68b4c241483c404eb14e927000000e922000000e91d000000e9180000005a89542410894c240c89c3b80300000083c408e949fffffff6c201740a81fa830000007c60eb06f642ff10755df6c201740a81fa8d0000007f6deb06f642ff10746aff710452bb210000008b44240c9090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740881e8820000007105ff5538ebf3a8017411eb0ae93a000000e93500000083c0147105ff5538ebf68b4c241483c4045a89542410eb0ae918000000e913000000894c240c89c3b80300000083c408e99dfefffff6c201740a81fac30000007c60eb06f642ff10755df6c201740a81facd0000007f6deb06f642ff10746aff710452bb210000008b44240c9090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740881e8c20000007105ff5538ebf3a8017411eb0ae93a000000e93500000083c0147105ff5538ebf68b4c241483c4045a89542410eb0ae918000000e913000000894c240c89c3b80300000083c408e9f1fdffff833c240174378b5d008d5bec3b5d087303ff5520895d00c743fc020000008b7424108973048b7c2404893b8d430cc740fc01000000891883c408c20800b80100000083c408c20800833c240174398b45008d40ec3b45087303ff5520894500c740fc020000008b4c24108948048b542404891089c28d400cc740fc01000000891083c408c20800b80100000083c408c2080090909000000000a8020000|@19438,2097151,@4523|71,0,16 82,0,I108 171,0,1 190,0,65 211,0,70 230,0,16 242,0,I108 343,0,1 362,0,97 383,0,102 402,0,16 414,0,I108 515,0,1 589,0,0 663,0,0 19438:S29|7363616e576f7264283329726561645f6865785f646967697473283329 19439:S11|7363616e576f7264283329 19440:O4|5,@19442,0,@19441 19441:O5|@19443,297,0,297,0 19442:S8|4f766572666c6f77 19443:S21|2e2f62617369732f4c61726765576f72642e736d6c 19444:O4|8,@19446,@19447,@19445 19445:O5|@12337,548,0,548,0 19446:S10|436f6e76657273696f6e 19447:S21|496e76616c696420776f726420636f6e7374616e74 19448:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129776f72644f66537472696e67283129 19449:O5|5,0,@6680,@6678,0 19450:O2|@13219,@19451 19451:O2|@19452,0 19452:O4|@4596,69,@19453,0 19453:O7|@13219,2,@19455,@19454,@5229,0,0 19454:O3|2,@5306,@5306 19455:O2|1,@19456 19456:O3|2,@19457,0 19457:O1|@19458 19458:D3,72|3b650c7303ff5524a8017407b903000000eb068b088d4c0901515068e02e92b289e2525089cbb8010000009090e81e010000ba10d686b283c40ce959a7f4ff900000000044000000|@19473,2097151,@4531|13,0,1 28,0,@19459 39,0,0 46,1,@19461 51,0,@12781 59,1,@12782 19459:D3,188|a8017509f64208017503ff55383b42087506b801000000c3a801740783f8017d08eb2ff640ff1075298b5a04f6c3017407b903000000eb068b0b8d4c0901a8017409f6c10174043bc1eb05ff5538ebf77c0f89c1b8a8f179b28b5d04909090ff13f6c301751189c183c108d1e90fb60c0b8d4c0901eb0289d9a801740583c0027105ff5538ebf68b75008d76ec3b75087303ff5520897500c746fc02000000894604890e8d460cc740fc010000008930c390909000000000b8000000|@19460,31,@4526|19,0,0 50,0,1 85,0,@4898 19460:S28|4d6973632e756e657363617065537472696e67283129726472283129 19461:D3,492|3b650c7303ff5524a8017508f6c3017503ff55383bc37508b801000000c20800538b5c240ce8d6010000a801755d8b08813948c05208742df6010175248b31bf48c052088b11b909000000d1e93bc9f3a68d7c3f018d7436018d4c09017408eb578b11eb588b118b008b4804f6c1017509f60424017503ff55383b0c24746ef6c101740c83f9017d0deb42e900010000f641ff1075378b5c2408f6c3017407ba03000000eb068b138d541201f6c1017415f6c2017410eb0ae995000000e9900000003bcaeb05ff5538ebf77c0cb8a8f179b28b5d049090ff13f6c301751483c108d1e90fb60c0b8d4c0901eb07e93f00000089d98b5004f6c201740583c2027105ff5538ebf68b75008d76ec3b75087303ff5520897500c746fc02000000895604890e8d4e0cc741fc010000008931eb05b90100000083f9017507b801000000eb538b40043b650c7303ff5524e9cffeffff8b008b4d008d49f43b4d087303ff5520894d00c741fc020000008b400489410489118b45008d40f83b45087303ff5520894500c740fc010000008908eb05b801000000a801740c89c1b8383d92b28b5d04ff138b08ff31ff742410ff7424108b5c240c8b410490e842feffff89c18b45008d40f43b45087303ff5520894500c740fc020000008948045983c4048908c2080000000000e8010000|@19472,2097151,@4530|25,0,0 38,1,@19462 50,0,I48 64,0,I48 71,0,4 160,0,1 206,0,@4898 306,0,0 316,0,0 401,0,0 412,0,@19468 19462:D3,1368|3b650c7303ff5524535089daff12a801755e8b0883394172088139fd0000007609b80100000083c408c38139b90000007561ff71048b04248b542408ff12a80175678b088139eb0000007562ff7104ff74240cbb09000000b801000000e80a050000a801754e8b088b55008d52eceb05e9a20400003b55087303ff5520895500c742fc020000008b5904895a048b318932eb05e94d0400008d420cc740fc01000000891083c40ceb0ae92e040000e90a000000c3b80100000083c40cc38139bd00000075548b41048b542408ff12a80175538b088b11f6c201740a81fa810000007c54eb06f642ff107551f6c201740a81fabf0000007f53eb06f642ff107450f6c201740881ea800000007105ff5538ebf3f6c2017413eb05e98900000083fa017d0deb36e974000000f642ff10752bf6c2017420eb0ae959000000e95400000081faff0100007e1ceb10e945000000e940000000f642ff10750ab8500b7ab28b5d04ff138b5d008d5bec3b5d087303ff5520895d00c743fc020000008b710489730489138d430cc740fc01000000891883c40cc3b80100000083c40cc3b80100000083c40cc383394575348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702450000008d420cc740fc01000000891083c40cc38139b900000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702b90000008d420cc740fc01000000891083c40cc38139e500000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c7021b0000008d420cc740fc01000000891083c40cc38139cd00000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702190000008d420cc740fc01000000891083c40cc38139ed00000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702170000008d420cc740fc01000000891083c40cc38139dd00000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702150000008d420cc740fc01000000891083c40cc38139e900000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702130000008d420cc740fc01000000891083c40cc38139c500000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c702110000008d420cc740fc01000000891083c40cc38139c300000075348b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c7020f0000008d420cc740fc01000000891083c40cc3833913720583391b7605833941755e8b51045289d08b54240c909090ff12a80175268b08833913720583391b760583394175108b510483c4043b650c7303ff5524ebcf8b0424eb038b04248b54240c83c4049090ff12a801754c8b088139b9000000740eb80100000083c40cc3e93d0000008b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a04c70248c052088d420cc740fc01000000891083c40cc3b80100000083c40cc3833961725f833965775aff3424ff74240cbb07000000b801000000909090e89e040000a80175348b088b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a048b3189328d420cc740fc01000000891083c40cc3b80100000083c40cc3b80100000083c40cc3b80100000083c40cc38b55008d52ec3b55087303ff5520895500c742fc020000008b5904895a048b3189328d420cc740fc01000000891083c408c38b45008d40ec3b45087303ff5520894500c740fc020000008b0c24894804c70048c0520889c18d400cc740fc01000000890883c408c39090900000000054050000|@19467,2097151,@4529|27,0,126 34,0,0 44,0,92 70,0,117 84,0,4 89,0,0 94,1,@19463 181,0,0 191,0,94 221,0,64 242,0,95 323,0,255 348,0,@4936 406,0,0 415,0,0 460,0,34 482,0,92 520,0,92 542,0,114 580,0,13 602,0,102 640,0,12 662,0,118 700,0,11 722,0,110 760,0,10 782,0,116 820,0,9 842,0,98 880,0,8 902,0,97 940,0,7 1054,0,92 1061,0,0 1106,0,I48 1127,0,0 1153,0,3 1158,0,0 1166,1,@19465 1227,0,0 1236,0,0 1245,0,0 1335,0,I48 19463:D3,920|3b650c7303ff552483fb017571a801740a81f8ff0100007e10eb06f640ff107508b801000000c20800a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e17eb06f640ff10750f89c1b8500b7ab28b5d04909090ff138b4d008d49ec3b4d087303ff5520894d00c741fc020000008b542408895104eb05e91100000089018d410cc740fc010000008908c2080050538b4424108b54240c9090ff12a80175668b08833961726483397377648b1424f6c201740583ea027105ff5538ebf6ff710452ff31bb210000008b44241090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a801740583e8607105ff5538ebf68b4c241883c4048b542404eb0fe9e3010000e916000000e91100000089542418894c24145b83c40ce9d4feffff8139c300000072678139cd00000077648b1424f6c201740583ea027105ff5538ebf6ff7104ff3152bb210000008b442410909090ff15c8c75208a8017410f64424040174098d40ff034424047105ff5538ebf2a801740881e8c20000007105ff5538ebf3a801740583c0147111eb0ae923000000e91e000000ff5538ebea8b4c24188b5424088954241c894c24185b83c410e93dfeffff813983000000726781398d00000077648b1424f6c201740583ea027105ff5538ebf6ff7104ff3152bb210000008b442410ff15c8c75208a8017410f64424040174098d40ff034424047105ff5538ebf2a801740881e8820000007105ff5538ebf3a801740583c0147111ff5538eb0ae920000000e91b000000ebea8b4c24188b5424088954241c894c24185b83c410e9a9fdffff8b1424f6c201740783faff7c08eb1ff642ff1074198b542404f6c201740a81faff0100007f08eb11f642ff10750bb80100000083c408c20800f6c201740783fa017d08eb1bf642ff107515f6c201740a81faff0100007e12eb06f642ff10750ab8500b7ab28b5d04ff138b5d008d5bec3b5d087303ff5520895d00c743fc020000008b74241089730489138d430cc740fc01000000891883c408c208008b0424a801740783f8ff7c08eb1ef640ff1074188b442404a801740a81f8ff0100007f08eb11f640ff10750bb80100000083c408c20800a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e15eb06f640ff10750db8500b7ab28b5d04909090ff138b4d008d49ec3b4d087303ff5520894d00c741fc020000008b54241089510489018d410cc740fc01000000890883c408c208000000000094030000|@19464,2097151,@4527|19,0,255 34,0,0 64,0,255 81,0,@4936 203,0,16 214,0,I108 302,0,97 310,0,102 341,0,16 354,0,I108 453,0,65 461,0,70 492,0,16 502,0,I108 631,0,255 646,0,0 681,0,255 696,0,@4936 786,0,255 801,0,0 834,0,255 849,0,@4936 19464:S16|436861722e7265616448657827283429 19465:D3,496|3b650c7303ff552483fb017571a801740a81f8ff0100007e10eb06f640ff107508b801000000c20800a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e17eb06f640ff10750f89c1b8500b7ab28b5d04909090ff138b4d008d49ec3b4d087303ff5520894d00c741fc020000008b542408895104eb05e91100000089018d410cc740fc010000008908c2080050538b4424108b54240c9090ff12a80175618b08833961725f8b11f6c201740783fa737f58eb06f642ff1074708b1c24f6c301740583eb027105ff5538ebf6ff71045352bb150000008b442410909090ff15c8c75208a801740ef604240174088d40ff0304247105ff5538ebf3a8017416eb0fe942000000e932000000e92d00000083e8607105ff5538ebf68b4c241883c4048b54240489542418eb05e90d000000894c24145b83c40ce9bdfeffffb80100000083c408c208008b442404a801740a81f8ff0100007e08eb1bf640ff1074158b0c24f6c101740783f9017f08eb11f641ff10750bb80100000083c408c20800a801740783f8017d08eb1af640ff107514a801740a81f8ff0100007e12eb06f640ff10750ab8500b7ab28b5d04ff138b4d008d49ec3b4d087303ff5520894d00c741fc020000008b54241089510489018d410cc740fc01000000890883c408c2080000000000ec010000|@19466,2097151,@4528|19,0,255 34,0,0 64,0,255 81,0,@4936 217,0,10 230,0,I108 324,0,0 344,0,255 380,0,0 413,0,255 428,0,@4936 19466:S15|436861722e72656164446563283429 19467:S16|436861722e7363616e42617365283229 19468:O4|8,@19446,@19470,@19469 19469:O5|@19471,91,0,91,0 19470:S23|496e76616c696420737472696e6720636f6e7374616e74 19471:S32|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f4d6973632e4d4c 19472:S34|4d6973632e756e657363617065537472696e67283129636f6e764368617273283129 19473:S22|4d6973632e756e657363617065537472696e67283129 19474:O2|@19476,@19475 19475:O2|@19477,0 19476:S15|636f6d70696c657256657273696f6e 19477:O4|@4596,69,@19478,0 19478:O7|@19476,2,@19479,@5306,@5229,0,0 19479:O2|1,@19480 19480:O3|2,@19481,0 19481:S11|352e362052656c65617365 19482:O2|@19484,@19483 19483:O2|@19485,0 19484:S16|7472616365436f6d70696c6572546167 19485:O4|@4596,69,@19486,0 19486:O7|@19484,2,@19487,@18745,@5229,0,0 19487:O2|1,@19488 19488:O3|2,@19489,0 19489:O3|@19491,@19493,@19490 19490:O2|@19495,@4674 19491:O2|@19492,@4674 19492:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4532|8,0,0 14,0,1 19493:O2|@19494,@4674 19494:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4533|29,0,0 39,0,69 19495:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4534|10,0,@6377 19496:O2|@19498,@19497 19497:O2|@19499,0 19498:S27|6e6172726f774f7665726c6f6164466c65785265636f7264546167 19499:O4|@4596,69,@19500,0 19500:O7|@19498,2,@19501,@18745,@5229,0,0 19501:O2|1,@19502 19502:O3|2,@19503,0 19503:O3|@19505,@19507,@19504 19504:O2|@19509,@4678 19505:O2|@19506,@4678 19506:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4535|8,0,0 14,0,1 19507:O2|@19508,@4678 19508:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4536|29,0,0 39,0,69 19509:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4537|10,0,@6377 19510:O2|@19512,@19511 19511:O2|@19513,0 19512:S19|6572726f724d65737361676550726f63546167 19513:O4|@4596,69,@19514,0 19514:O7|@19512,2,@19516,@19515,@5229,0,0 19515:O5|5,@19525,@18757,@18756,@5229 19516:O2|1,@19517 19517:O3|2,@19518,0 19518:O3|@19520,@19522,@19519 19519:O2|@19524,@4718 19520:O2|@19521,@4718 19521:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4538|8,0,0 14,0,1 19522:O2|@19523,@4718 19523:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4539|29,0,0 39,0,69 19524:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4540|10,0,@6377 19525:O2|@19526,0 19526:O3|2,@19527,@6000 19527:O3|3,@19529,@19528 19528:O3|0,@19540,1 19529:O2|@19531,@19530 19530:O2|@19534,@19533 19531:O2|@19532,@5232 19532:S4|68617264 19533:O2|@19537,@19536 19534:O2|@17421,@19535 19535:O5|5,@17645,@12166,@12023,@5229 19536:O2|@19539,0 19537:O2|@19538,@5509 19538:S7|6d657373616765 19539:O2|@5935,@5933 19540:O2|@19532,@19541 19541:O2|@17421,@19542 19542:O2|@19538,@19543 19543:O2|@5935,0 19544:O2|@6680,@19545 19545:O2|@19546,0 19546:O4|@4600,69,@19547,0 19547:O2|@19548,0 19548:O3|@6680,@5229,@19549 19549:O3|@19551,@19550,@6681 19550:O4|1,@4810,0,0 19551:O2|1,@19552 19552:O3|2,@19553,0 19553:O4|I53,@4809,1,1 19554:O1|@19555 19555:D3,16|b8f06e7ab2c39090000000000c000000|@19556,1,@4541|1,0,@5252 19556:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f547970655072696e746572283129 19557:O2|@19559,@19558 19558:O2|@19560,0 19559:S21|636f6d70696c657256657273696f6e4e756d626572 19560:O4|@4596,69,@19561,0 19561:O7|@19559,2,@19562,@5307,@5229,0,0 19562:O2|1,@19563 19563:O3|2,560,0 19564:O2|@19566,@19565 19565:O2|@19567,0 19566:S9|556e6976657273616c 19567:O4|@4611,69,@19568,0 19568:O4|@19566,@5500,@19569,@5229 19569:O6|@19571,I48,0,@5229,@19570,0 19570:O1|@19621 19571:O4|1,@4812,@4813,@4811 19572:O1|@19573 19573:D3,28|3b650c7303ff5524bb15000000e96a25e8ff90900000000018000000|@5217,2097151,@4542|9,0,10 14,1,@5214 19574:O2|@17339,@19618 19575:O2|@18757,@19576 19576:O2|@19577,0 19577:O4|@4600,69,@19578,0 19578:O2|@18756,0 19579:O2|@19581,@19580 19580:O2|@19582,0 19581:S10|74616750726f6a656374 19582:O4|@4596,69,@19583,0 19583:O7|@19581,2,@19585,@19584,@5229,0,0 19584:O3|2,@19591,@19590 19585:O2|1,@19586 19586:O3|2,@19587,0 19587:O1|@19588 19588:D3,12|8b4008c30000000008000000|@19589,1,@4543| 19589:S29|556e6976657273616c2e74616750726f6a6563742d2370726f6a656374 19590:O3|2,@17337,@19593 19591:O5|5,@19592,@18757,@18756,@5229 19592:O2|@19593,0 19593:O3|6,@4815,79992 19594:O2|@19596,@19595 19595:O2|@19597,0 19596:S9|746167496e6a656374 19597:O4|@4596,69,@19598,0 19598:O7|@19596,2,@19600,@19599,@5229,0,0 19599:O3|2,@19591,@19605 19600:O2|1,@19601 19601:O3|2,@19602,0 19602:O1|@19603 19603:D3,12|8b4004c30000000008000000|@19604,1,@4544| 19604:S27|556e6976657273616c2e746167496e6a6563742d23696e6a656374 19605:O3|2,@19593,@17337 19606:O2|@19608,@19607 19607:O2|@19609,0 19608:S5|7461674973 19609:O4|@4596,69,@19610,0 19610:O7|@19608,2,@19612,@19611,@5229,0,0 19611:O3|2,@19591,@19617 19612:O2|1,@19613 19613:O3|2,@19614,0 19614:O1|@19615 19615:D3,12|8b00c3900000000008000000|@19616,1,@4545| 19616:S19|556e6976657273616c2e74616749732d236973 19617:O3|2,@17337,@5232 19618:O2|@19619,0 19619:O4|@4600,69,@19620,0 19620:O2|@17338,0 19621:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4546|1,0,@12350 19622:O2|@13191,@19623 19623:O2|@19624,0 19624:O4|@4596,69,@19625,0 19625:O7|@13191,2,@19627,@19626,@5229,0,0 19626:O3|2,@5306,@5307 19627:O2|1,@19628 19628:O3|2,@19629,0 19629:O1|@19630 19630:D3,352|3b650c7303ff5524a8017407b903000000eb068b088d4c0901f6c101740783f9077c45eb06f641ff10753d506a05bb010000009090e8d281edff81f8d8ea86b27464a801752389c6bfd8ea86b2b90d000000d1e93bc9f3a68d7c3f018d7436018d4c0901745deb01508b0c24f6c1017407b803000000eb068b018d440001a801740783f8097c51eb06f640ff1075496a07bb0100000089c890e86e81edff81f8b84b92b2eb05e9340000007432a801752789c6bfb84b92b2b90f000000d1e93bc9eb05e917000000f3a68d7c3f018d7436018d4c09017407b803000000eb05b8050000008b1424f6c2017407b903000000eb068b0a8d4c0901515268c44b92b2508d5c2404b801000000ba407c88b29090e80e31f6ffa80175208b008b4d008d49f83b4d087303ff5520894d00c741fc010000008b008901eb05b901000000f6c101740db8384c92b28b5d04909090ff138b0183c410c390000000005c010000|@19636,2097151,@4548|13,0,1 47,0,0 54,1,@8870 60,0,@12884 73,0,@12884 78,0,6 114,0,1 146,0,0 154,1,@8870 160,0,@19631 180,0,@19631 185,0,7 217,0,1 224,0,2 237,0,1 252,0,@19632 262,0,0 267,0,@13336 274,1,@13337 315,0,0 325,0,@19633 19631:S3|7e3078 19632:D3,96|3b42087506b801000000c3f6420401751489c183c1088b5204d1e90fb60c0a8d4c0901eb038b4a0483c0028b55008d52ec3b55087303ff5520895500c742fc02000000894204890a8d420cc740fc010000008910c3909090000000005c000000|@13335,7,@4547|6,0,0 19633:O4|8,@19446,@19635,@19634 19634:O5|@12337,537,0,537,0 19635:S24|496e76616c696420696e746567657220636f6e7374616e74 19636:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129696e744f66537472696e67283129 19637:O2|@19639,@19638 19638:O2|@19640,0 19639:S24|7265706f727444697363617264656456616c756573546167 19640:O4|@4596,69,@19641,0 19641:O7|@19639,2,@19642,@18865,@5229,0,0 19642:O2|1,@19643 19643:O3|2,@19644,0 19644:O3|@19646,@19648,@19645 19645:O2|@19650,@4680 19646:O2|@19647,@4680 19647:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4549|8,0,0 14,0,1 19648:O2|@19649,@4680 19649:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4550|29,0,0 39,0,69 19650:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4551|10,0,@6377 19651:O2|@19653,@19652 19652:O2|@19654,0 19653:S9|6f6666736574546167 19654:O4|@4596,69,@19655,0 19655:O7|@19653,2,@19656,@18848,@5229,0,0 19656:O2|1,@19657 19657:O3|2,@19658,0 19658:O3|@19660,@19662,@19659 19659:O2|@19664,@4660 19660:O2|@19661,@4660 19661:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4552|8,0,0 14,0,1 19662:O2|@19663,@4660 19663:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4553|29,0,0 39,0,69 19664:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4554|10,0,@6377 19665:O2|@19667,@19666 19666:O2|@19668,0 19667:S19|636f64657472656541667465724f7074546167 19668:O4|@4596,69,@19669,0 19669:O7|@19667,2,@19670,@18745,@5229,0,0 19670:O2|1,@19671 19671:O3|2,@19672,0 19672:O3|@19674,@19676,@19673 19673:O2|@19678,@4670 19674:O2|@19675,@4670 19675:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4555|8,0,0 14,0,1 19676:O2|@19677,@4670 19677:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4556|29,0,0 39,0,69 19678:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4557|10,0,@6377 19679:O2|@19681,@19680 19680:O2|@19682,0 19681:S9|627974654172726179 19682:O4|@4600,69,@19683,0 19683:O2|@19684,0 19684:O3|@19681,@5229,@19685 19685:O3|@19687,@19690,@19686 19686:O3|@19681,@5256,@5255 19687:O2|1,@19688 19688:O3|2,@19689,0 19689:O4|I251,@4816,2,1 19690:O4|1,@4653,0,0 19691:O2|@19693,@19692 19692:O2|@19694,0 19693:S10|62797465566563746f72 19694:O4|@4600,69,@19695,0 19695:O2|@19696,0 19696:O3|@19693,@5229,@19697 19697:O3|@19699,@19747,@19698 19698:O3|@19693,@5256,@5255 19699:O2|1,@19700 19700:O3|2,@19702,@19701 19701:O2|@19708,0 19702:O4|@19703,@4817,2,1 19703:O1|@19704 19704:D3,88|b9ffffff002348fc8d4c0901baffffff002353fc8d5412013bca752b8d0c8dfdffffff89c689dfd1e93bc9f3a68d7c3f018d7436018d4c09017406b801000000c3b803000000c3b801000000c39090900000000054000000|@19705,63,@4558|1,0,8388607 13,0,8388607 60,0,0 66,0,1 72,0,0 19705:S13|62797465566563746f722d6571 19706:O1|@19707 19707:D3,16|b8f06e7ab2c39090000000000c000000|@19556,1,@4559|1,0,@5252 19708:O4|@4607,69,@19709,0 19709:O3|2,4,@19710 19710:O5|@5429,@19712,@5515,@19711,@5387 19711:O2|@19702,@19703 19712:O2|@5433,@19713 19713:O2|@19715,@19714 19714:O2|@19745,@7020 19715:O2|@5747,@19716 19716:O3|0,@19717,@5415 19717:O8|@19719,@19705,0,0,@19718,0,3,1 19718:O2|@6268,@6261 19719:O3|10,@19721,@19720 19720:O4|1,@19729,@19728,@5348 19721:O2|@19723,@19722 19722:O2|@19726,0 19723:O4|1,@5382,0,@19724 19724:O4|3,@5357,@19725,1 19725:O3|2,I15,0 19726:O4|1,@5384,1,@19727 19727:O4|3,@5343,@19725,1 19728:O3|10,@19734,@19733 19729:O4|3,@19730,@5341,1 19730:O2|@8259,@19731 19731:O2|@19732,0 19732:O2|@6253,1 19733:O4|3,@19739,@5362,1 19734:O2|@19735,0 19735:O4|1,@5384,2,@19736 19736:O4|3,@19738,@19737,1 19737:O3|2,I238,0 19738:O2|@5374,@8258 19739:O2|@5344,@19740 19740:O2|@5366,@19741 19741:O2|@5345,@19742 19742:O2|@5366,@19743 19743:O2|@19744,0 19744:O2|@17612,1 19745:O2|@19746,@5413 19746:O3|0,@4817,0 19747:O4|1,@4818,0,0 19748:O2|@19750,@19749 19749:O2|@19751,0 19750:S20|70726f66696c65416c6c6f636174696f6e546167 19751:O4|@4596,69,@19752,0 19752:O7|@19750,2,@19753,@18865,@5229,0,0 19753:O2|1,@19754 19754:O3|2,@19755,0 19755:O3|@19757,@19759,@19756 19756:O2|@19761,@4665 19757:O2|@19758,@4665 19758:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4560|8,0,0 14,0,1 19759:O2|@19760,@4665 19760:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4561|29,0,0 39,0,69 19761:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4562|10,0,@6377 19762:O2|@19764,0 19763:S13|6572726f724465707468546167 19764:O4|@4596,69,@19765,0 19765:O7|@19763,2,@19766,@18865,@5229,0,0 19766:O2|1,@19767 19767:O3|2,@19768,0 19768:O3|@19770,@19772,@19769 19769:O2|@19774,@4671 19770:O2|@19771,@4671 19771:D3,28|8b003b42047406b801000000c3b803000000c3900000000018000000|@18752,5,@4563|8,0,0 14,0,1 19772:O2|@19773,@4671 19773:D3,60|89c18b45008d40ec3b45087303ff5520894500c740fc04000000c7400c01000000894808c740048b0000008b52048910c39090900000000038000000|@18752,7,@4564|29,0,0 39,0,69 19774:D3,36|8b083b4a04740e89c1b854eb7ab28b5d049090ff138b480889c8c3900000000020000000|@18752,7,@4565|10,0,@6377 19775:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4566|1,0,@12350 19776:O2|47,@19777 19777:O2|@19778,0 19778:O4|@4596,69,@19779,0 19779:O7|47,2,@5230,@18666,@5229,0,0 19780:O2|@19782,@19781 19781:O2|@19783,0 19782:S3|646976 19783:O4|@4596,69,@19784,0 19784:O7|@19782,2,@5230,@18666,@5229,0,0 19785:O2|@19787,@19786 19786:O2|@19788,0 19787:S6|766563746f72 19788:O4|@4600,69,@19789,0 19789:O2|@19790,0 19790:O3|@19787,@5229,@19791 19791:O3|@19793,@19874,@19792 19792:O3|@19787,@5256,@5255 19793:O2|1,@19794 19794:O3|2,@19796,@19795 19795:O2|@19812,0 19796:O4|@19798,@4819,@19807,@19797 19797:O1|@19810 19798:O1|@19799 19799:D3,48|89c18b45008d40f43b45087303ff5520894500c740fc02000000c700545a92b28948048060ffbfc3000000002c000000|@19802,3,@4568|28,0,@19800 19800:D3,136|3b650c7303ff5524b9ffffff002348fc8d4c0901beffffff002373fc8d7436013bce7554be01000000515053523b74240c7509b80300000083c410c38b04248b48048b5424088b5472fe8b5c24048b5c73fe5689d08b1190ff1283f80174105883c00289c63b650c7303ff5524ebbeb80100000083c414c3b801000000c390900000000084000000|@19801,1048575,@4567|9,0,8388607 21,0,8388607 37,0,0 52,0,1 112,0,0 121,0,0 19801:S9|766563746f722d6571 19802:S11|766563746f722d65712829 19803:O1|@19804 19804:D3,16|b8445b92b2c39090000000000c000000|@18770,1,@4570|1,0,@19805 19805:O1|@19806 19806:D3,16|b8f06e7ab2c39090000000000c000000|@18769,1,@4569|1,0,@5252 19807:O1|@19808 19808:D3,16|b805000000c39090000000000c000000|@19809,1,@4571|1,0,2 19809:S12|626f7865642d766563746f72 19810:D3,16|b803000000c39090000000000c000000|@19811,1,@4572|1,0,1 19811:S11|73697a652d766563746f72 19812:O4|@4607,69,@19813,0 19813:O3|2,4,@19814 19814:O5|@5429,@19816,@5765,@19815,@5387 19815:O4|@19796,@19798,@19807,@19797 19816:O2|@5433,@19817 19817:O2|@19819,@19818 19818:O2|@19865,@19864 19819:O2|@5747,@19820 19820:O3|0,@19821,@5415 19821:O8|@19823,@19802,0,0,@19822,0,0,1 19822:O2|@19851,0 19823:O2|7,@19824 19824:O8|@19825,@19801,0,@5882,@19718,0,3,1 19825:O3|10,@19721,@19826 19826:O4|1,@19729,@19827,@5348 19827:O3|0,@19829,@19828 19828:O2|@19849,0 19829:O4|1,@19831,@5281,@19830 19830:O4|1,@19834,@19833,@5348 19831:O4|3,@19832,@5341,1 19832:O2|@8259,@19743 19833:O2|9,@19843 19834:O4|3,@19835,@5861,1 19835:O2|@19837,@19836 19836:O2|@19840,0 19837:O2|@19838,1 19838:O4|3,@19839,@7121,1 19839:O2|@5344,@19743 19840:O2|@19841,1 19841:O4|3,@19842,@7121,1 19842:O2|@5345,@19743 19843:O2|@19844,0 19844:O2|@19845,1 19845:O4|3,@19846,@5371,1 19846:O2|@19744,@19847 19847:O2|@19848,0 19848:O2|@5281,1 19849:O2|@19850,1 19850:O3|@5386,2,@5348 19851:O2|1,@19852 19852:O2|@19853,0 19853:O3|2,0,@19854 19854:O2|@19855,0 19855:O3|0,@5384,@19856 19856:O2|@19858,@19857 19857:O2|@19862,0 19858:O4|3,@19859,@7121,1 19859:O2|@5344,@19860 19860:O2|@19861,0 19861:O2|@17613,1 19862:O4|3,@19863,@7121,1 19863:O2|@5345,@19860 19864:O2|@19868,@19867 19865:O2|@19866,@5413 19866:O3|0,@4819,0 19867:O2|@19871,0 19868:O2|@5756,@19869 19869:O3|0,@19870,@5415 19870:O8|@5759,@19809,0,0,@5276,0,0,1 19871:O2|@5762,@19872 19872:O3|0,@19873,@5415 19873:O8|@5281,@19811,0,0,@5276,0,0,1 19874:O4|1,@4820,1,0 19875:O2|60,@19876 19876:O2|@19877,0 19877:O4|@4596,69,@19878,0 19878:O7|60,2,@5230,@5231,@5229,0,0 19879:O2|62,@19880 19880:O2|@19881,0 19881:O4|@4596,69,@19882,0 19882:O7|62,2,@5230,@5231,@5229,0,0 19883:O2|@19885,@19884 19884:O2|@19886,0 19885:S7|52756e43616c6c 19886:O4|@4611,69,@19887,0 19887:O4|@19885,@5500,@19888,@5229 19888:O6|@19890,I48,0,@5229,@19889,0 19889:O1|@20177 19890:O4|1,@4822,@4823,@4821 19891:O2|@20173,@20172 19892:O2|@19446,@19893 19893:O2|@19894,0 19894:O4|@4596,69,@19895,0 19895:O7|@19446,0,@19897,@19896,@5229,0,0 19896:O3|2,@5306,@14221 19897:O2|1,@6090 19898:O2|@19900,@19899 19899:O2|@19901,0 19900:S9|537562736372697074 19901:O4|@4596,69,@19902,0 19902:O7|@19900,0,@19903,@14221,@5229,0,0 19903:O2|1,@6168 19904:O2|@19906,@19905 19905:O2|@19907,0 19906:S8|5857696e646f7773 19907:O4|@4596,69,@19908,0 19908:O7|@19906,0,@19909,@19896,@5229,0,0 19909:O2|1,@6134 19910:O2|@19912,@19911 19911:O2|@19913,0 19912:S11|72756e5f63616c6c324332 19913:O4|@4596,69,@19914,0 19914:O7|@19912,2,@19916,@19915,@5229,0,0 19915:O3|2,@5307,@19941 19916:O2|1,@19917 19917:O2|7,@19918 19918:O8|@19919,@19912,0,0,@5276,0,1,1 19919:O3|10,@19921,@19920 19920:O2|7,@19925 19921:O2|@19922,0 19922:O4|1,0,0,@19923 19923:O4|3,@5357,@19924,1 19924:O3|2,I189,0 19925:O8|@19927,@19940,0,@19926,@5276,0,1,1 19926:O2|@5748,0 19927:O3|10,@19929,@19928 19928:O3|14,@19936,0 19929:O2|@19930,0 19930:O5|0,0,0,2,@19931 19931:O4|3,@19932,@5868,1 19932:O2|@19934,@19933 19933:O2|@19935,@8258 19934:O2|@5532,1 19935:O2|@6136,1 19936:O2|@19938,@19937 19937:O2|@19939,0 19938:O4|6,@6252,0,0 19939:O4|6,@6252,1,0 19940:S14|72756e5f63616c6c324332283129 19941:O3|2,@19943,@19942 19942:O3|3,@19950,@5234 19943:O3|3,@19944,@5234 19944:O2|@19946,@19945 19945:O2|@19948,0 19946:O2|49,@19947 19947:O3|6,@4825,79992 19948:O2|50,@19949 19949:O3|6,@4826,79992 19950:O2|@19952,@19951 19951:O2|@19954,0 19952:O2|49,@19953 19953:O3|6,@4827,79992 19954:O2|50,@19955 19955:O3|6,@4828,79992 19956:O2|@17161,@19957 19957:O2|@19958,0 19958:O4|@4596,69,@19959,0 19959:O7|@17161,0,@19960,@14221,@5229,0,0 19960:O2|1,@17160 19961:O2|@19963,@19962 19962:O2|@19964,0 19963:S7|466f726569676e 19964:O4|@4596,69,@19965,0 19965:O7|@19963,0,@19966,@19896,@5229,0,0 19966:O2|1,@19967 19967:O3|2,23,0 19968:O2|@19970,@19969 19969:O2|@19971,0 19970:S4|4661696c 19971:O4|@4596,69,@19972,0 19972:O7|@19970,0,@19973,@19896,@5229,0,0 19973:O2|1,@19974 19974:O3|2,103,0 19975:O2|@19977,@19976 19976:O2|@19978,0 19977:S11|6164644f7665726c6f6164 19978:O4|@4596,69,@19979,0 19979:O7|@19977,2,@9437,@19980,@5229,0,0 19980:O3|2,@19981,@19331 19981:O3|2,@19983,@19982 19982:O3|6,@4830,79992 19983:O3|6,@4829,79992 19984:O2|@13315,@19985 19985:O2|@19986,0 19986:O4|@4596,69,@19987,0 19987:O7|@13315,0,@19988,@14221,@5229,0,0 19988:O2|1,@16970 19989:O2|@19991,@19990 19990:O2|@19992,0 19991:S7|45785472616365 19992:O4|@4596,69,@19993,0 19993:O7|@19991,0,@19995,@19994,@5229,0,0 19994:O3|2,@19996,@14221 19995:O2|1,@6204 19996:O3|3,@19997,@5234 19997:O2|@19999,@19998 19998:O2|@20000,0 19999:O2|49,@5785 20000:O2|50,@14221 20001:O2|@20003,@20002 20002:O2|@20004,0 20003:S6|537973457272 20004:O4|@4596,69,@20005,0 20005:O7|@20003,0,@20007,@20006,@5229,0,0 20006:O3|2,@20008,@14221 20007:O2|1,@5759 20008:O3|3,@20009,@5234 20009:O2|@12043,@20010 20010:O2|@20011,0 20011:O2|50,@20012 20012:O5|5,@15842,@12166,@12023,@5229 20013:O2|@20015,@20014 20014:O2|@20016,0 20015:S3|446976 20016:O4|@4596,69,@20017,0 20017:O7|@20015,0,@20018,@14221,@5229,0,0 20018:O2|1,@6072 20019:O2|@20021,@20020 20020:O2|@20022,0 20021:S10|756e7361666543617374 20022:O4|@4596,69,@20023,0 20023:O7|@20021,2,@20025,@20024,@5229,0,0 20024:O3|2,@20030,@20029 20025:O2|1,@20026 20026:O2|7,@20027 20027:O8|@5278,@20028,0,0,@5276,0,0,1 20028:S13|756e7361666543617374283129 20029:O3|6,@4832,79992 20030:O3|6,@4831,79992 20031:O2|@11871,@20032 20032:O2|@20033,0 20033:O4|@4596,69,@20034,0 20034:O7|@11871,0,@20035,@14221,@5229,0,0 20035:O2|1,@5281 20036:O2|@20038,@20037 20037:O2|@20039,0 20038:S8|4f766572666c6f77 20039:O4|@4596,69,@20040,0 20040:O7|@20038,0,@20041,@14221,@5229,0,0 20041:O2|1,@6036 20042:O2|@20044,@20043 20043:O2|@20045,0 20044:S9|72756e5f63616c6c30 20045:O4|@4596,69,@20046,0 20046:O7|@20044,2,@20048,@20047,@5229,0,0 20047:O3|2,@5307,@20056 20048:O2|1,@20049 20049:O2|7,@20050 20050:O8|@20051,@20044,0,0,@5276,0,1,1 20051:O3|10,@19921,@20052 20052:O2|7,@20053 20053:O8|@20055,@20054,0,@19926,@5276,0,0,1 20054:S12|72756e5f63616c6c30283129 20055:O4|3,0,@5868,1 20056:O3|2,@6000,@19947 20057:O2|@20059,@20058 20058:O2|@20060,0 20059:S9|72756e5f63616c6c31 20060:O4|@4596,69,@20061,0 20061:O7|@20059,2,@20063,@20062,@5229,0,0 20062:O3|2,@5307,@20067 20063:O2|1,@20064 20064:O2|7,@20065 20065:O8|@19923,@20066,0,0,@5276,0,0,1 20066:S12|72756e5f63616c6c31283129 20067:O3|2,@19947,@19949 20068:O2|@20070,@20069 20069:O2|@20071,0 20070:S9|72756e5f63616c6c32 20071:O4|@4596,69,@20072,0 20072:O7|@20070,2,@20074,@20073,@5229,0,0 20073:O3|2,@5307,@20084 20074:O2|1,@20075 20075:O2|7,@20076 20076:O8|@20077,@20070,0,0,@5276,0,1,1 20077:O3|10,@19921,@20078 20078:O2|7,@20079 20079:O8|@20081,@20080,0,@19926,@5276,0,0,1 20080:S12|72756e5f63616c6c32283129 20081:O4|3,@20082,@5868,1 20082:O2|@19934,@20083 20083:O2|@19935,0 20084:O3|2,@19943,@19953 20085:O2|@20087,@20086 20086:O2|@20088,0 20087:S9|72756e5f63616c6c33 20088:O4|@4596,69,@20089,0 20089:O7|@20087,2,@20091,@20090,@5229,0,0 20090:O3|2,@5307,@20103 20091:O2|1,@20092 20092:O2|7,@20093 20093:O8|@20094,@20087,0,0,@5276,0,1,1 20094:O3|10,@19921,@20095 20095:O2|7,@20096 20096:O8|@20098,@20097,0,@19926,@5276,0,0,1 20097:S12|72756e5f63616c6c33283129 20098:O4|3,@20099,@5868,1 20099:O2|@19934,@20100 20100:O2|@19935,@20101 20101:O2|@20102,0 20102:O2|@17604,1 20103:O3|2,@20104,@19955 20104:O3|3,@20105,@12016 20105:O2|@19946,@20106 20106:O2|@19948,@20107 20107:O2|@20108,0 20108:O2|51,@19953 20109:O2|@20111,@20110 20110:O2|@20112,0 20111:S9|72756e5f63616c6c34 20112:O4|@4596,69,@20113,0 20113:O7|@20111,2,@20115,@20114,@5229,0,0 20114:O3|2,@5307,@20128 20115:O2|1,@20116 20116:O2|7,@20117 20117:O8|@20118,@20111,0,0,@5276,0,1,1 20118:O3|10,@19921,@20119 20119:O2|7,@20120 20120:O8|@20122,@20121,0,@19926,@5276,0,0,1 20121:S12|72756e5f63616c6c34283129 20122:O4|3,@20123,@5868,1 20123:O2|@19934,@20124 20124:O2|@19935,@20125 20125:O2|@20102,@20126 20126:O2|@20127,0 20127:O2|@17606,1 20128:O3|2,@20130,@20129 20129:O3|6,@4833,79992 20130:O3|3,@20131,@17634 20131:O2|@19946,@20132 20132:O2|@19948,@20133 20133:O2|@20108,@20134 20134:O2|@20135,0 20135:O2|52,@19955 20136:O2|@20138,@20137 20137:O2|@20139,0 20138:S9|72756e5f63616c6c35 20139:O4|@4596,69,@20140,0 20140:O7|@20138,2,@20142,@20141,@5229,0,0 20141:O3|2,@5307,@20157 20142:O2|1,@20143 20143:O2|7,@20144 20144:O8|@20145,@20138,0,0,@5276,0,1,1 20145:O3|10,@19921,@20146 20146:O2|7,@20147 20147:O8|@20149,@20148,0,@19926,@5276,0,0,1 20148:S12|72756e5f63616c6c35283129 20149:O4|3,@20150,@5868,1 20150:O2|@19934,@20151 20151:O2|@19935,@20152 20152:O2|@20102,@20153 20153:O2|@20127,@20154 20154:O2|@20155,0 20155:O2|@20156,1 20156:O4|6,@5278,4,0 20157:O3|2,@20159,@20158 20158:O3|6,@4834,79992 20159:O3|3,@20160,@17711 20160:O2|@19946,@20161 20161:O2|@19948,@20162 20162:O2|@20108,@20163 20163:O2|@20135,@20164 20164:O2|@20165,0 20165:O2|53,@20129 20166:O2|@20168,@20167 20167:O2|@20169,0 20168:S6|546872656164 20169:O4|@4596,69,@20170,0 20170:O7|@20168,0,@20171,@19896,@5229,0,0 20171:O2|1,@6186 20172:O2|@20174,0 20173:S4|53697a65 20174:O4|@4596,69,@20175,0 20175:O7|@20173,0,@20176,@14221,@5229,0,0 20176:O2|1,@5375 20177:D3,24|b83c7f86b28b5d04909090ff139090900000000014000000|@12352,1,@4573|1,0,@12350 20178:O2|@5589,@20179 20179:O2|@20180,0 20180:O4|@4596,69,@16883,0 20181:O2|@6670,@20182 20182:O2|@20183,0 20183:O4|@4600,69,@20184,0 20184:O2|@6668,0 20185:O2|@5716,@20186 20186:O2|@20188,@20187 20187:O2|@20213,0 20188:O4|@4600,69,@20189,0 20189:O2|@5714,@20190 20190:O2|@20191,0 20191:O7|@5716,@5347,@20193,@20192,@5229,0,0 20192:O3|2,@20211,@20210 20193:O2|1,@20194 20194:O3|14,@20195,0 20195:O2|@20197,@20196 20196:O2|@20200,@20199 20197:O2|7,@20198 20198:O8|@5281,@5716,0,0,@5276,0,0,1 20199:O2|@20206,0 20200:O2|7,@20201 20201:O8|@20202,@5716,0,0,@5276,0,0,1 20202:O4|3,@20203,@13616,1 20203:O2|@19848,@20204 20204:O2|@20205,@5357 20205:O2|@13615,1 20206:O2|7,@20207 20207:O8|@20208,@5716,0,0,@5276,0,0,1 20208:O4|3,@20209,@7121,1 20209:O2|@5344,@7123 20210:O5|5,@20212,@5716,@5714,@5229 20211:O3|6,@4835,79992 20212:O2|@20211,0 20213:O4|@4596,69,@20191,0 20214:O2|@6002,@20215 20215:O2|@20216,0 20216:O4|@4600,69,@20217,0 20217:O2|@6001,0 20218:O2|61,@20219 20219:O2|@20220,0 20220:O4|@4596,69,@20221,0 20221:O7|61,2,@20223,@20222,@5229,0,0 20222:O3|2,@20224,@5232 20223:O2|3,2 20224:O3|3,@20225,@5234 20225:O2|@20227,@20226 20226:O2|@20229,0 20227:O2|49,@20228 20228:O3|6,@4836,79996 20229:O2|50,@20228 20230:O2|@6680,@20231 20231:O2|@20232,0 20232:O4|@4600,69,@20233,0 20233:O2|@6678,0 20234:O2|@5598,@20235 20235:O2|@20236,0 20236:O4|@4596,69,@16845,0 20237:O2|@12246,@20238 20238:O2|@20239,0 20239:O4|@4596,69,@16494,0 20240:O2|@5317,@20241 20241:O2|@20242,0 20242:O4|@4600,69,@20243,0 20243:O2|@5316,0 20244:O2|@5244,@20245 20245:O2|@20246,0 20246:O4|@4600,69,@20247,0 20247:O2|@5243,@20248 20248:O2|@5268,@20249 20249:O2|@5486,0 20250:O2|@20251,0 20251:O4|@4600,69,@20252,0 20252:O2|@5308,0 20253:O3|@20255,@20254,0 20254:O2|@20265,@20266 20255:S7|3c737464696e3e 20256:S24|506f6c794d4c2e72756e46756e6374696f6e283129283129 4575:MO1|@4839 4576:MO1|1 4577:MO1|0 4578:MO1|0 4579:MO1|0 4580:MO1|@4909 4581:MO1|@4915 4582:MO1|@4923 4583:MO1|0 4584:MO1|@4959 4585:MO1|@4987 4586:MO1|0 4587:MO1|@5050 4588:MO1|@5163 4589:MO1|2 4590:MO1|0 4591:MO1|0 4592:MO1|@4595 4593:MO1|@5212 4594:MO1|38 4595:MO81|80,0,0,0,0,0,0,0,@5219,0,@5259,@5264,@5282,0,@5297,@5463,0,0,0,@5476,@5482,0,@5494,0,0,0,@18661,@18667,0,0,0,0,0,0,@18673,0,@18702,0,0,0,0,@18708,@18711,@18715,@18719,@18723,@18727,@18731,@19776,0,0,0,0,@19780,@19785,@19875,@19879,@19883,@20178,@20181,@20185,@20214,@20218,@20230,0,@20234,0,0,0,0,0,0,0,0,0,0,0,@20237,@20240,@20244,@5218 4596:MO1|@5224 4597:MO1|@5239 4598:MO1|@5250 4599:MO1|1 4600:MO1|@5224 4601:MO1|@5293 4602:MO1|0 4603:MO1|@5250 4604:MO1|1 4605:MO1|@5250 4606:MO1|@5224 4607:MO1|@5224 4608:MO1|@5394 4609:MO1|1 4610:MO1|@5413 4611:MO1|@5224 4612:MO1|@4615 4613:MO1|@5212 4614:MO1|35 4615:MO81|80,0,0,0,0,0,@5504,0,0,@5674,@6217,@6274,0,0,0,0,@6277,0,@6280,0,@6288,0,0,0,0,0,@12710,0,0,0,0,0,@17381,@17384,@17387,@17413,0,0,0,@17416,@17419,0,@17511,@17515,@17518,@17521,@17524,0,0,0,@17536,@17572,0,0,@17653,0,@17664,0,@17667,@17670,@18019,@18022,@18025,0,@18032,@18035,0,@18641,@18644,0,0,0,0,@18648,0,0,@18655,@5503,0,0,0 4616:MO1|@5576 4617:MO1|@5583 4618:MO1|@5604 4619:MO1|0 4620:MO1|@5686 4621:MO1|0 4622:MO1|@5727 4623:MO1|1 4624:MO1|1 4625:MO1|@5686 4626:MO1|0 4627:MO1|@5413 4628:MO1|@4631 4629:MO1|@6296 4630:MO1|7 4631:MO11|10,@6299,@12353,0,@12357,@12412,0,0,@12549,@12619,@6298 4632:MO1|@4635 4633:MO1|@6307 4634:MO1|5 4635:MO11|10,@6310,@6341,@12310,@12314,0,0,0,0,0,@6309 4636:MO1|@6323 4637:MO1|@5686 4638:MO1|0 4639:MO1|@5224 4640:MO1|@5224 4641:MO1|@5224 4642:MO1|@6515 4643:MO1|0 4644:MO1|0 4645:MO1|@6675 4646:MO1|1 4647:MO1|@5250 4648:MO1|1 4649:MO1|@5250 4650:MO1|0 4651:MO1|0 4652:MO1|1 4653:MO1|1 4654:MO1|1 4655:MO1|0 4656:MO1|0 4657:MO1|@5224 4658:MO1|@5224 4659:MO1|@5224 4660:MO1|@5224 4661:MO1|@5224 4662:MO1|@5224 4663:MO1|@5224 4664:MO1|@5224 4665:MO1|@5224 4666:MO1|@5224 4667:MO1|@5224 4668:MO1|@5224 4669:MO1|@5224 4670:MO1|@5224 4671:MO1|@5224 4672:MO1|@5224 4673:MO1|@5224 4674:MO1|@5224 4675:MO1|@5224 4676:MO1|@5224 4677:MO1|@5224 4678:MO1|@5224 4679:MO1|@5224 4680:MO1|@5224 4681:MO1|@5224 4682:MO1|@8554 4683:MO1|@11952 4684:MO1|@5686 4685:MO1|0 4686:MO1|@5686 4687:MO1|0 4688:MO1|@5686 4689:MO1|0 4690:MO1|@5686 4691:MO1|0 4692:MO1|@5686 4693:MO1|0 4694:MO1|@12236 4695:MO1|1 4696:MO1|@5686 4697:MO1|0 4698:MO1|@4701 4699:MO1|@12365 4700:MO1|4 4701:MO11|10,@12368,@12388,@12392,@12367,0,0,0,0,0,0 4702:MO1|@4705 4703:MO1|@12420 4704:MO1|11 4705:MO21|20,@12422,@12435,0,0,0,0,0,0,0,0,0,@12439,@12459,@12469,@12479,@12483,@12504,@12515,@12525,@12421 4706:MO1|@4709 4707:MO1|@12557 4708:MO1|5 4709:MO11|10,0,@12560,@12582,@12592,0,0,0,0,@12602,@12559 4710:MO1|@4713 4711:MO1|@12627 4712:MO1|3 4713:MO11|10,0,@12630,0,@12639,0,@12629,0,0,0,0 4714:MO1|@4717 4715:MO1|@12660 4716:MO1|4 4717:MO11|10,0,@12663,@12685,@12695,0,0,0,0,0,@12662 4718:MO1|@5224 4719:MO1|0 4720:MO1|@5224 4721:MO1|@13007 4722:MO1|@5239 4723:MO1|@15288 4724:MO1|@13652 4725:MO1|@13675 4726:MO1|0 4727:MO1|@14050 4728:MO1|@14003 4729:MO1|@14749 4730:MO1|@14427 4731:MO1|@5224 4732:MO1|@14447 4733:MO1|@14594 4734:MO1|@14606 4735:MO1|@14745 4736:MO1|@14747 4737:MO1|@15123 4738:MO1|@15444 4739:MO1|@15546 4740:MO1|@15483 4741:MO1|@15512 4742:MO1|@15514 4743:MO1|@15537 4744:MO1|@15657 4745:MO1|@15572 4746:MO1|@15600 4747:MO1|@5224 4748:MO1|0 4749:MO1|0 4750:MO1|0 4751:MO1|0 4752:MO1|0 4753:MO1|@16149 4754:MO1|0 4755:MO1|32 4756:MO1|I48 4757:MO1|48 4758:MO1|0 4759:MO1|41 4760:MO1|@5413 4761:MO1|0 4762:MO1|0 4763:MO1|0 4764:MO1|0 4765:MO1|@5413 4766:MO1|@5686 4767:MO1|0 4768:MO1|0 4769:MO1|@5413 4770:MO1|@5413 4771:MO1|@5413 4772:MO1|@4775 4773:MO1|@17678 4774:MO1|27 4775:MO41|40,@17680,@17696,@17727,@17738,@17748,@17759,@17763,@17789,0,0,@17799,0,@17806,0,0,0,0,0,0,@17819,@17826,@17844,@17860,@17871,@17889,@17902,@17913,@17926,@17937,@17951,@17958,@17969,@17978,0,0,0,@17982,@17998,0,@17679 4776:MO1|@5686 4777:MO1|0 4778:MO1|@5686 4779:MO1|0 4780:MO1|@5413 4781:MO1|@4784 4782:MO1|@17678 4783:MO1|27 4784:MO41|40,@18044,@18093,@18106,@18321,0,0,0,@18398,0,@18419,@18422,@18426,@18463,0,0,@18467,@18485,0,@18488,@18491,@18494,@18502,@18516,@18519,@18542,@18546,@18549,@18553,@18557,@18560,@18564,0,0,@18591,0,0,0,0,@18611,@18043 4785:MO1|@5686 4786:MO1|0 4787:MO1|@5686 4788:MO1|0 4789:MO1|@5686 4790:MO1|0 4791:MO1|@5686 4792:MO1|0 4793:MO1|@5686 4794:MO1|0 4795:MO1|@5686 4796:MO1|0 4797:MO1|@5686 4798:MO1|0 4799:MO1|@5727 4800:MO1|@4803 4801:MO1|@5212 4802:MO1|41 4803:MO81|80,@18740,@18794,@18826,@18843,@18860,0,0,@18875,@18889,@18896,0,0,0,@18910,@18924,@18938,0,0,0,0,0,0,@18952,@18966,@18980,0,@18994,@19008,0,@19102,@19116,@19332,@19341,@19355,0,0,0,0,0,0,0,0,0,@19383,@19398,0,0,@19412,0,0,@19426,@19450,0,0,0,0,0,@19474,@19482,@19496,0,@19510,@19544,0,0,@19557,@19564,@19622,0,0,@19637,@19651,@19665,@19679,0,0,0,@19691,@19748,@18739 4804:MO1|@18765 4805:MO1|0 4806:MO1|0 4807:MO1|0 4808:MO1|@5727 4809:MO1|@19554 4810:MO1|1 4811:MO1|@4814 4812:MO1|@19572 4813:MO1|5 4814:MO11|10,0,0,@19575,0,@19579,@19594,@19606,0,0,@19574 4815:MO1|@5413 4816:MO1|@5250 4817:MO1|@19706 4818:MO1|1 4819:MO1|@19803 4820:MO1|1 4821:MO1|@4824 4822:MO1|@17678 4823:MO1|23 4824:MO41|40,0,0,@19892,@19898,0,@19904,0,@19910,0,0,0,@19956,@19961,0,0,0,0,0,@19968,@19975,0,@19984,0,@19989,@20001,@20013,@20019,@20031,0,@20036,@20042,@20057,@20068,@20085,@20109,@20136,0,0,@20166,@19891 4825:MO1|@5413 4826:MO1|@5413 4827:MO1|@5413 4828:MO1|@5413 4829:MO1|@5413 4830:MO1|@5413 4831:MO1|@5413 4832:MO1|@5413 4833:MO1|@5413 4834:MO1|@5413 4835:MO1|@5413 4836:MO1|@5413 20257:MVO1|0 20258:MVO1|1 20259:MVO1|1 20260:MVO1|0 20261:MVO1|@4862 20262:MVO1|1 20263:MVO1|0 20264:MVO1|1 20265:MVO1|1 20266:MVO1|@5160 20267:MVO1|1 20268:MVO1|@5188 20269:MVO1|1 20270:MVO1|1 20271:MVO1|1 0:MB4|00000000 1:MB4|00000000 2:MB4|00000000 3:MB4|00000000 4:MB4|00000000 5:MB4096|4372656174656420737472756374757265204d4c436f6d70696c65720a73696f6e0a0a69670a670a540a46554e4354494f4e530a202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 6:MB4|00000000 7:MB4|00000000 8:MB4|00000000 9:MB4|00000000 10:MB4|00000000 11:MB4|00000000 12:MB4|00000000 13:MB4|00000000 14:MB4|00000000 15:MB4|00000000 16:MB4|00000000 17:MB4|00000000 18:MB4|00000000 19:MB4|00000000 20:MB4|00000000 21:MB4|00000000 22:MB4|00000000 23:MB4|00000000 24:MB4|00000000 25:MB4|00000000 26:MB4|00000000 27:MB4|00000000 28:MB4|00000000 29:MB4|00000000 30:MB4|00000000 31:MB4|00000000 32:MB4|00000000 33:MB4|00000000 34:MB4|00000000 35:MB4|00000000 36:MB4|00000000 37:MB4|00000000 38:MB4|00000000 39:MB4|00000000 40:MB4|00000000 41:MB4|00000000 42:MB4|00000000 43:MB4|00000000 44:MB4|00000000 45:MB4|00000000 46:MB4|00000000 47:MB4|00000000 48:MB4|00000000 49:MB4|00000000 50:MB4|00000000 51:MB4|00000000 52:MB4|00000000 53:MB4|00000000 54:MB4|00000000 55:MB4|00000000 56:MB4|00000000 57:MB4|00000000 58:MB4|00000000 59:MB4|00000000 60:MB4|00000000 61:MB4|00000000 62:MB4|00000000 63:MB4|00000000 64:MB4|00000000 65:MB4|00000000 66:MB4|00000000 67:MB4|00000000 68:MB4|00000000 69:MB4|00000000 70:MB4|00000000 71:MB4|00000000 72:MB4|00000000 73:MB4|00000000 74:MB4|00000000 75:MB4|00000000 76:MB4|00000000 77:MB4|00000000 78:MB4|00000000 79:MB4|00000000 80:MB4|00000000 81:MB4096|20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 82:MB4|00000000 83:MB4|00000000 84:MB4|00000000 85:MB4|00000000 86:MB4|00000000 87:MB4|00000000 88:MB4|00000000 89:MB4|00000000 90:MB4|00000000 91:MB4|00000000 92:MB4|00000000 93:MB4|00000000 94:MB4|00000000 95:MB4|00000000 96:MB4|00000000 97:MB4|00000000 98:MB4|00000000 99:MB4|00000000 100:MB4|00000000 101:MB4|00000000 102:MB4|00000000 103:MB4|00000000 104:MB4|00000000 105:MB4|00000000 106:MB4|00000000 107:MB4|00000000 108:MB4|00000000 109:MB4|00000000 110:MB4|00000000 111:MB4|00000000 112:MB4|00000000 113:MB4|00000000 114:MB4|00000000 115:MB4|00000000 116:MB4|00000000 117:MB4|00000000 118:MB4|00000000 119:MB4|00000000 120:MB4|00000000 121:MB4|00000000 122:MB4|00000000 123:MB4|00000000 124:MB4|00000000 125:MB4|00000000 126:MB4|00000000 127:MB4|00000000 128:MB4|00000000 129:MB4|00000000 130:MB4|00000000 131:MB4|00000000 132:MB4|00000000 133:MB4|00000000 134:MB4|00000000 135:MB4|00000000 136:MB4|00000000 137:MB4|00000000 138:MB4|00000000 139:MB4|00000000 140:MB4|00000000 141:MB4|00000000 142:MB4|00000000 143:MB4|00000000 144:MB4|00000000 145:MB4|00000000 146:MB4|00000000 147:MB4|00000000 148:MB4|00000000 149:MB4|00000000 150:MB4|00000000 151:MB4|00000000 152:MB4|00000000 153:MB4|00000000 154:MB4|00000000 155:MB4|00000000 156:MB4|00000000 157:MB4|00000000 158:MB4|00000000 159:MB4|00000000 160:MB4|00000000 161:MB4|00000000 162:MB4|00000000 163:MB4|00000000 164:MB4|00000000 165:MB4|00000000 166:MB4|00000000 167:MB4|00000000 168:MB4|00000000 169:MB4|00000000 170:MB4|00000000 171:MB4|00000000 172:MB4|00000000 173:MB4|00000000 174:MB4|00000000 175:MB4|00000000 176:MB4|00000000 177:MB4|00000000 178:MB4|00000000 179:MB4|00000000 180:MB4|00000000 181:MB4|00000000 182:MB4|00000000 183:MB4|00000000 184:MB4|00000000 185:MB4|00000000 186:MB4|00000000 187:MB4|00000000 188:MB4|00000000 189:MB4|00000000 190:MB4|00000000 191:MB4|00000000 192:MB4|00000000 193:MB4|00000000 194:MB4|00000000 195:MB4|00000000 196:MB4|00000000 197:MB4|00000000 198:MB4|00000000 199:MB4|00000000 200:MB4|00000000 201:MB4|00000000 202:MB4|00000000 203:MB4|00000000 204:MB4|00000000 205:MB4|00000000 206:MB4|00000000 207:MB4|00000000 208:MB4|00000000 209:MB4|00000000 210:MB4|00000000 211:MB4|00000000 212:MB4|00000000 213:MB4|00000000 214:MB4|00000000 215:MB4|00000000 216:MB4|00000000 217:MB4|00000000 218:MB4|00000000 219:MB4|00000000 220:MB4|00000000 221:MB4|00000000 222:MB4|00000000 223:MB4|00000000 224:MB4|00000000 225:MB4|00000000 226:MB4|00000000 227:MB4|00000000 228:MB4|00000000 229:MB4|00000000 230:MB4|00000000 231:MB4|00000000 232:MB4|00000000 233:MB4|00000000 234:MB4|00000000 235:MB4|00000000 236:MB4|00000000 237:MB4|00000000 238:MB4|00000000 239:MB4|00000000 240:MB4|00000000 241:MB4|00000000 242:MB4|00000000 243:MB4|00000000 244:MB4|00000000 245:MB4|00000000 246:MB4|00000000 247:MB4|00000000 248:MB4|00000000 249:MB4|00000000 250:MB4|00000000 251:MB4|00000000 252:MB4|00000000 253:MB4|00000000 254:MB4|00000000 255:MB4|00000000 256:MB4|00000000 257:MB4|00000000 258:MB4|00000000 259:MB4|00000000 260:MB4|00000000 261:MB4|00000000 262:MB4|00000000 263:MB4|00000000 264:MB4|00000000 265:MB4|00000000 266:MB4|00000000 267:MB4|00000000 268:MB4|00000000 269:MB4|00000000 270:MB4|00000000 271:MB4|00000000 272:MB4|00000000 273:MB4|00000000 274:MB4|00000000 275:MB4|00000000 276:MB4|00000000 277:MB4|00000000 278:MB4|00000000 279:MB4|00000000 280:MB4|00000000 281:MB4|00000000 282:MB4|00000000 283:MB4|00000000 284:MB4|00000000 285:MB4|00000000 286:MB4|00000000 287:MB4|00000000 288:MB4|00000000 289:MB4|00000000 290:MB4|00000000 291:MB4|00000000 292:MB4|00000000 293:MB4|00000000 294:MB4|00000000 295:MB4|00000000 296:MB4|00000000 297:MB4|00000000 298:MB4|00000000 299:MB4|00000000 300:MB4|00000000 301:MB4|00000000 302:MB4|00000000 303:MB4|00000000 304:MB4|00000000 305:MB4|00000000 306:MB4|00000000 307:MB4|00000000 308:MB4|00000000 309:MB4|00000000 310:MB4|00000000 311:MB4|00000000 312:MB4|00000000 313:MB4|00000000 314:MB4|00000000 315:MB4|00000000 316:MB4|00000000 317:MB4|00000000 318:MB4|00000000 319:MB4|00000000 320:MB4|00000000 321:MB4|00000000 322:MB4|00000000 323:MB4|00000000 324:MB4|00000000 325:MB4|00000000 326:MB4|00000000 327:MB4|00000000 328:MB4|00000000 329:MB4|00000000 330:MB4|00000000 331:MB4|00000000 332:MB4|00000000 333:MB4|00000000 334:MB4|00000000 335:MB4|00000000 336:MB4|00000000 337:MB4|00000000 338:MB4|00000000 339:MB4|00000000 340:MB4|00000000 341:MB4|00000000 342:MB4|00000000 343:MB4|00000000 344:MB4|00000000 345:MB4|00000000 346:MB4|00000000 347:MB4|00000000 348:MB4|00000000 349:MB4|00000000 350:MB4|00000000 351:MB4|00000000 352:MB4|00000000 353:MB4|00000000 354:MB4|00000000 355:MB4|00000000 356:MB4|00000000 357:MB4|00000000 358:MB4|00000000 359:MB4|00000000 360:MB4|00000000 361:MB4|00000000 362:MB4|00000000 363:MB4|00000000 364:MB4|00000000 365:MB4|00000000 366:MB4|00000000 367:MB4|00000000 368:MB4|00000000 369:MB4|00000000 370:MB4|00000000 371:MB4|00000000 372:MB4|00000000 373:MB4|00000000 374:MB4|00000000 375:MB4|00000000 376:MB4|00000000 377:MB4|00000000 378:MB4|00000000 379:MB4|00000000 380:MB4|00000000 381:MB4|00000000 382:MB4|00000000 383:MB4|00000000 384:MB4|00000000 385:MB4|00000000 386:MB4|00000000 387:MB4|00000000 388:MB4|00000000 389:MB4|00000000 390:MB4|00000000 391:MB4|00000000 392:MB4|00000000 393:MB4|00000000 394:MB4|00000000 395:MB4|00000000 396:MB4|00000000 397:MB4|00000000 398:MB4|00000000 399:MB4|00000000 400:MB4|00000000 401:MB4|00000000 402:MB4|00000000 403:MB4|00000000 404:MB4|00000000 405:MB4|00000000 406:MB4|00000000 407:MB4|00000000 408:MB4|00000000 409:MB4|00000000 410:MB4|00000000 411:MB4|00000000 412:MB4|00000000 413:MB4|00000000 414:MB4|00000000 415:MB4|00000000 416:MB4|00000000 417:MB4|00000000 418:MB4|00000000 419:MB4|00000000 420:MB4|00000000 421:MB4|00000000 422:MB4|00000000 423:MB4|00000000 424:MB4|00000000 425:MB4|00000000 426:MB4|00000000 427:MB4|00000000 428:MB4|00000000 429:MB4|00000000 430:MB4|00000000 431:MB4|00000000 432:MB4|00000000 433:MB4|00000000 434:MB4|00000000 435:MB4|00000000 436:MB4|00000000 437:MB4|00000000 438:MB4|00000000 439:MB4|00000000 440:MB4|00000000 441:MB4|00000000 442:MB4|00000000 443:MB4|00000000 444:MB4|00000000 445:MB4|00000000 446:MB4|00000000 447:MB4|00000000 448:MB4|00000000 449:MB4|00000000 450:MB4|00000000 451:MB4|00000000 452:MB4|00000000 453:MB4|00000000 454:MB4|00000000 455:MB4|00000000 456:MB4|00000000 457:MB4|00000000 458:MB4|00000000 459:MB4|00000000 460:MB4|00000000 461:MB4|00000000 462:MB4|00000000 463:MB4|00000000 464:MB4|00000000 465:MB4|00000000 466:MB4|00000000 467:MB4|00000000 468:MB4|00000000 469:MB4|00000000 470:MB4|00000000 471:MB4|00000000 472:MB4|00000000 473:MB4|00000000 474:MB4|00000000 475:MB4|00000000 476:MB4|00000000 477:MB4|00000000 478:MB4|00000000 479:MB4|00000000 480:MB4|00000000 481:MB4|00000000 482:MB4|00000000 483:MB4|00000000 484:MB4|00000000 485:MB4|00000000 486:MB4|00000000 487:MB4|00000000 488:MB4|00000000 489:MB4|00000000 490:MB4|00000000 491:MB4|00000000 492:MB4|00000000 493:MB4|00000000 494:MB4|00000000 495:MB4|00000000 496:MB4|00000000 497:MB4|00000000 498:MB4|00000000 499:MB4|00000000 500:MB4|00000000 501:MB4|00000000 502:MB4|00000000 503:MB4|00000000 504:MB4|00000000 505:MB4|00000000 506:MB4|00000000 507:MB4|00000000 508:MB4|00000000 509:MB4|00000000 510:MB4|00000000 511:MB4|00000000 512:MB4|00000000 513:MB4|00000000 514:MB4|00000000 515:MB4|00000000 516:MB4|00000000 517:MB4|00000000 518:MB4|00000000 519:MB4|00000000 520:MB4|00000000 521:MB4|00000000 522:MB4|00000000 523:MB4|00000000 524:MB4|00000000 525:MB4|00000000 526:MB4|00000000 527:MB4|00000000 528:MB4|00000000 529:MB4|00000000 530:MB4|00000000 531:MB4|00000000 532:MB4|00000000 533:MB4|00000000 534:MB4|00000000 535:MB4|00000000 536:MB4|00000000 537:MB4|00000000 538:MB4|00000000 539:MB4|00000000 540:MB4|00000000 541:MB4|00000000 542:MB4|00000000 543:MB4|00000000 544:MB4|00000000 545:MB4|00000000 546:MB4|00000000 547:MB4|00000000 548:MB4|00000000 549:MB4|00000000 550:MB4|00000000 551:MB4|00000000 552:MB4|00000000 553:MB4|00000000 554:MB4|00000000 555:MB4|00000000 556:MB4|00000000 557:MB4|00000000 558:MB4|00000000 559:MB4|00000000 560:MB4|00000000 561:MB4|00000000 562:MB4|00000000 563:MB4|00000000 564:MB4|00000000 565:MB4|00000000 566:MB4|00000000 567:MB4|00000000 568:MB4|00000000 569:MB4|00000000 570:MB4|00000000 571:MB4|00000000 572:MB4|00000000 573:MB4|00000000 574:MB4|00000000 575:MB4|00000000 576:MB4|00000000 577:MB4|00000000 578:MB4|00000000 579:MB4|00000000 580:MB4|00000000 581:MB4|00000000 582:MB4|00000000 583:MB4|00000000 584:MB4|00000000 585:MB4|00000000 586:MB4|00000000 587:MB4|00000000 588:MB4|00000000 589:MB4|00000000 590:MB4|00000000 591:MB4|00000000 592:MB4|00000000 593:MB4|00000000 594:MB4|00000000 595:MB4|00000000 596:MB4|00000000 597:MB4|00000000 598:MB4|00000000 599:MB4|00000000 600:MB4|00000000 601:MB4|00000000 602:MB4|00000000 603:MB4|00000000 604:MB4|00000000 605:MB4|00000000 606:MB4|00000000 607:MB4|00000000 608:MB4|00000000 609:MB4|00000000 610:MB4|00000000 611:MB4|00000000 612:MB4|00000000 613:MB4|00000000 614:MB4|00000000 615:MB4|00000000 616:MB4|00000000 617:MB4|00000000 618:MB4|00000000 619:MB4|00000000 620:MB4|00000000 621:MB4|00000000 622:MB4|00000000 623:MB4|00000000 624:MB4|00000000 625:MB4|00000000 626:MB4|00000000 627:MB4|00000000 628:MB4|00000000 629:MB4|00000000 630:MB4|00000000 631:MB4|00000000 632:MB4|00000000 633:MB4|00000000 634:MB4|00000000 635:MB4|00000000 636:MB4|00000000 637:MB4|00000000 638:MB4|00000000 639:MB4|00000000 640:MB4|00000000 641:MB4|00000000 642:MB4|00000000 643:MB4|00000000 644:MB4|00000000 645:MB4|00000000 646:MB4|00000000 647:MB4|00000000 648:MB4|00000000 649:MB4|00000000 650:MB4|00000000 651:MB4|00000000 652:MB4|00000000 653:MB4|00000000 654:MB4|00000000 655:MB4|00000000 656:MB4|00000000 657:MB4|00000000 658:MB4|00000000 659:MB4|00000000 660:MB4|00000000 661:MB4|00000000 662:MB4|00000000 663:MB4|00000000 664:MB4|00000000 665:MB4|00000000 666:MB4|00000000 667:MB4|00000000 668:MB4|00000000 669:MB4|00000000 670:MB4|00000000 671:MB4|00000000 672:MB4|00000000 673:MB4|00000000 674:MB4|00000000 675:MB4|00000000 676:MB4|00000000 677:MB4|00000000 678:MB4|00000000 679:MB4|00000000 680:MB4|00000000 681:MB4|00000000 682:MB4|00000000 683:MB4|00000000 684:MB4|00000000 685:MB4|00000000 686:MB4|00000000 687:MB4|00000000 688:MB4|00000000 689:MB4|00000000 690:MB4|00000000 691:MB4|00000000 692:MB4|00000000 693:MB4|00000000 694:MB4|00000000 695:MB4|00000000 696:MB4|00000000 697:MB4|00000000 698:MB4|00000000 699:MB4|00000000 700:MB4|00000000 701:MB4|00000000 702:MB4|00000000 703:MB4|00000000 704:MB4|00000000 705:MB4|00000000 706:MB4|00000000 707:MB4|00000000 708:MB4|00000000 709:MB4|00000000 710:MB4|00000000 711:MB4|00000000 712:MB4|00000000 713:MB4|00000000 714:MB4|00000000 715:MB4|00000000 716:MB4|00000000 717:MB4|00000000 718:MB4|00000000 719:MB4|00000000 720:MB4|00000000 721:MB4|00000000 722:MB4|00000000 723:MB4|00000000 724:MB4|00000000 725:MB4|00000000 726:MB4|00000000 727:MB4|00000000 728:MB4|00000000 729:MB4|00000000 730:MB4|00000000 731:MB4|00000000 732:MB4|00000000 733:MB4|00000000 734:MB4|00000000 735:MB4|00000000 736:MB4|00000000 737:MB4|00000000 738:MB4|00000000 739:MB4|00000000 740:MB4|00000000 741:MB4|00000000 742:MB4|00000000 743:MB4|00000000 744:MB4|00000000 745:MB4|00000000 746:MB4|00000000 747:MB4|00000000 748:MB4|00000000 749:MB4|00000000 750:MB4|00000000 751:MB4|00000000 752:MB4|00000000 753:MB4|00000000 754:MB4|00000000 755:MB4|00000000 756:MB4|00000000 757:MB4|00000000 758:MB4|00000000 759:MB4|00000000 760:MB4|00000000 761:MB4|00000000 762:MB4|00000000 763:MB4|00000000 764:MB4|00000000 765:MB4|00000000 766:MB4|00000000 767:MB4|00000000 768:MB4|00000000 769:MB4|00000000 770:MB4|00000000 771:MB4|00000000 772:MB4|00000000 773:MB4|00000000 774:MB4|00000000 775:MB4|00000000 776:MB4|00000000 777:MB4|00000000 778:MB4|00000000 779:MB4|00000000 780:MB4|00000000 781:MB4|00000000 782:MB4|00000000 783:MB4|00000000 784:MB4|00000000 785:MB4|00000000 786:MB4|00000000 787:MB4|00000000 788:MB4|00000000 789:MB4|00000000 790:MB4|00000000 791:MB4|00000000 792:MB4|00000000 793:MB4|00000000 794:MB4|00000000 795:MB4|00000000 796:MB4|00000000 797:MB4|00000000 798:MB4|00000000 799:MB4|00000000 800:MB4|00000000 801:MB4|00000000 802:MB4|00000000 803:MB4|00000000 804:MB4|00000000 805:MB4|00000000 806:MB4|00000000 807:MB4|00000000 808:MB4|00000000 809:MB4|00000000 810:MB4|00000000 811:MB4|00000000 812:MB4|00000000 813:MB4|00000000 814:MB4|00000000 815:MB4|00000000 816:MB4|00000000 817:MB4|00000000 818:MB4|00000000 819:MB4|00000000 820:MB4|00000000 821:MB4|00000000 822:MB4|00000000 823:MB4|00000000 824:MB4|00000000 825:MB4|00000000 826:MB4|00000000 827:MB4|00000000 828:MB4|00000000 829:MB4|00000000 830:MB4|00000000 831:MB4|00000000 832:MB4|00000000 833:MB4|00000000 834:MB4|00000000 835:MB4|00000000 836:MB4|00000000 837:MB4|00000000 838:MB4|00000000 839:MB4|00000000 840:MB4|00000000 841:MB4|00000000 842:MB4|00000000 843:MB4|00000000 844:MB4|00000000 845:MB4|00000000 846:MB4|00000000 847:MB4|00000000 848:MB4|00000000 849:MB4|00000000 850:MB4|00000000 851:MB4|00000000 852:MB4|00000000 853:MB4|00000000 854:MB4|00000000 855:MB4|00000000 856:MB4|00000000 857:MB4|00000000 858:MB4|00000000 859:MB4|00000000 860:MB4|00000000 861:MB4|00000000 862:MB4|00000000 863:MB4|00000000 864:MB4|00000000 865:MB4|00000000 866:MB4|00000000 867:MB4|00000000 868:MB4|00000000 869:MB4|00000000 870:MB4|00000000 871:MB4|00000000 872:MB4|00000000 873:MB4|00000000 874:MB4|00000000 875:MB4|00000000 876:MB4|00000000 877:MB4|00000000 878:MB4|00000000 879:MB4|00000000 880:MB4|00000000 881:MB4|00000000 882:MB4|00000000 883:MB4|00000000 884:MB4|00000000 885:MB4|00000000 886:MB4|00000000 887:MB4|00000000 888:MB4|00000000 889:MB4|00000000 890:MB4|00000000 891:MB4|00000000 892:MB4|00000000 893:MB4|00000000 894:MB4|00000000 895:MB4|00000000 896:MB4|00000000 897:MB4|00000000 898:MB4|00000000 899:MB4|00000000 900:MB4|00000000 901:MB4|00000000 902:MB4|00000000 903:MB4|00000000 904:MB4|00000000 905:MB4|00000000 906:MB4|00000000 907:MB4|00000000 908:MB4|00000000 909:MB4|00000000 910:MB4|00000000 911:MB4|00000000 912:MB4|00000000 913:MB4|00000000 914:MB4|00000000 915:MB4|00000000 916:MB4|00000000 917:MB4|00000000 918:MB4|00000000 919:MB4|00000000 920:MB4|00000000 921:MB4|00000000 922:MB4|00000000 923:MB4|00000000 924:MB4|00000000 925:MB4|00000000 926:MB4|00000000 927:MB4|00000000 928:MB4|00000000 929:MB4|00000000 930:MB4|00000000 931:MB4|00000000 932:MB4|00000000 933:MB4|00000000 934:MB4|00000000 935:MB4|00000000 936:MB4|00000000 937:MB4|00000000 938:MB4|00000000 939:MB4|00000000 940:MB4|00000000 941:MB4|00000000 942:MB4|00000000 943:MB4|00000000 944:MB4|00000000 945:MB4|00000000 946:MB4|00000000 947:MB4|00000000 948:MB4|00000000 949:MB4|00000000 950:MB4|00000000 951:MB4|00000000 952:MB4|00000000 953:MB4|00000000 954:MB4|00000000 955:MB4|00000000 956:MB4|00000000 957:MB4|00000000 958:MB4|00000000 959:MB4|00000000 960:MB4|00000000 961:MB4|00000000 962:MB4|00000000 963:MB4|00000000 964:MB4|00000000 965:MB4|00000000 966:MB4|00000000 967:MB4|00000000 968:MB4|00000000 969:MB4|00000000 970:MB4|00000000 971:MB4|00000000 972:MB4|00000000 973:MB4|00000000 974:MB4|00000000 975:MB4|00000000 976:MB4|00000000 977:MB4|00000000 978:MB4|00000000 979:MB4|00000000 980:MB4|00000000 981:MB4|00000000 982:MB4|00000000 983:MB4|00000000 984:MB4|00000000 985:MB4|00000000 986:MB4|00000000 987:MB4|00000000 988:MB4|00000000 989:MB4|00000000 990:MB4|00000000 991:MB4|00000000 992:MB4|00000000 993:MB4|00000000 994:MB4|00000000 995:MB4|00000000 996:MB4|00000000 997:MB4|00000000 998:MB4|00000000 999:MB4|00000000 1000:MB4|00000000 1001:MB4|00000000 1002:MB4|00000000 1003:MB4|00000000 1004:MB4|00000000 1005:MB4|00000000 1006:MB4|00000000 1007:MB4|00000000 1008:MB4|00000000 1009:MB4|00000000 1010:MB4|00000000 1011:MB4|00000000 1012:MB4|00000000 1013:MB4|00000000 1014:MB4|00000000 1015:MB4|00000000 1016:MB4|00000000 1017:MB4|00000000 1018:MB4|00000000 1019:MB4|00000000 1020:MB4|00000000 1021:MB4|00000000 1022:MB4|00000000 1023:MB4|00000000 1024:MB4|00000000 1025:MB4|00000000 1026:MB4|00000000 1027:MB4|00000000 1028:MB4|00000000 1029:MB4|00000000 1030:MB4|00000000 1031:MB4|00000000 1032:MB4|00000000 1033:MB4|00000000 1034:MB4|00000000 1035:MB4|00000000 1036:MB4|00000000 1037:MB4|00000000 1038:MB4|00000000 1039:MB4|00000000 1040:MB4|00000000 1041:MB4|00000000 1042:MB4|00000000 1043:MB4|00000000 1044:MB4|00000000 1045:MB4|00000000 1046:MB4|00000000 1047:MB4|00000000 1048:MB4|00000000 1049:MB4|00000000 1050:MB4|00000000 1051:MB4|00000000 1052:MB4|00000000 1053:MB4|00000000 1054:MB4|00000000 1055:MB4|00000000 1056:MB4|00000000 1057:MB4|00000000 1058:MB4|00000000 1059:MB4|00000000 1060:MB4|00000000 1061:MB4|00000000 1062:MB4|00000000 1063:MB4|00000000 1064:MB4|00000000 1065:MB4|00000000 1066:MB4|00000000 1067:MB4|00000000 1068:MB4|00000000 1069:MB4|00000000 1070:MB4|00000000 1071:MB4|00000000 1072:MB4|00000000 1073:MB4|00000000 1074:MB4|00000000 1075:MB4|00000000 1076:MB4|00000000 1077:MB4|00000000 1078:MB4|00000000 1079:MB4|00000000 1080:MB4|00000000 1081:MB4|00000000 1082:MB4|00000000 1083:MB4|00000000 1084:MB4|00000000 1085:MB4|00000000 1086:MB4|00000000 1087:MB4|00000000 1088:MB4|00000000 1089:MB4|00000000 1090:MB4|00000000 1091:MB4|00000000 1092:MB4|00000000 1093:MB4|00000000 1094:MB4|00000000 1095:MB4|00000000 1096:MB4|00000000 1097:MB4|00000000 1098:MB4|00000000 1099:MB4|00000000 1100:MB4|00000000 1101:MB4|00000000 1102:MB4|00000000 1103:MB4|00000000 1104:MB4|00000000 1105:MB4|00000000 1106:MB4|00000000 1107:MB4|00000000 1108:MB4|00000000 1109:MB4|00000000 1110:MB4|00000000 1111:MB4|00000000 1112:MB4|00000000 1113:MB4|00000000 1114:MB4|00000000 1115:MB4|00000000 1116:MB4|00000000 1117:MB4|00000000 1118:MB4|00000000 1119:MB4|00000000 1120:MB4|00000000 1121:MB4|00000000 1122:MB4|00000000 1123:MB4|00000000 1124:MB4|00000000 1125:MB4|00000000 1126:MB4|00000000 1127:MB4|00000000 1128:MB4|00000000 1129:MB4|00000000 1130:MB4|00000000 1131:MB4|00000000 1132:MB4|00000000 1133:MB4|00000000 1134:MB4|00000000 1135:MB4|00000000 1136:MB4|00000000 1137:MB4|00000000 1138:MB4|00000000 1139:MB4|00000000 1140:MB4|00000000 1141:MB4|00000000 1142:MB4|00000000 1143:MB4|00000000 1144:MB4|00000000 1145:MB4|00000000 1146:MB4|00000000 1147:MB4|00000000 1148:MB4|00000000 1149:MB4|00000000 1150:MB4|00000000 1151:MB4|00000000 1152:MB4|00000000 1153:MB4|00000000 1154:MB4|00000000 1155:MB4|00000000 1156:MB4|00000000 1157:MB4|00000000 1158:MB4|00000000 1159:MB4|00000000 1160:MB4|00000000 1161:MB4|00000000 1162:MB4|00000000 1163:MB4|00000000 1164:MB4|00000000 1165:MB4|00000000 1166:MB4|00000000 1167:MB4|00000000 1168:MB4|00000000 1169:MB4|00000000 1170:MB4|00000000 1171:MB4|00000000 1172:MB4|00000000 1173:MB4|00000000 1174:MB4|00000000 1175:MB4|00000000 1176:MB4|00000000 1177:MB4|00000000 1178:MB4|00000000 1179:MB4|00000000 1180:MB4|00000000 1181:MB4|00000000 1182:MB4|00000000 1183:MB4|00000000 1184:MB4|00000000 1185:MB4|00000000 1186:MB4|00000000 1187:MB4|00000000 1188:MB4|00000000 1189:MB4|00000000 1190:MB4|00000000 1191:MB4|00000000 1192:MB4|00000000 1193:MB4|00000000 1194:MB4|00000000 1195:MB4|00000000 1196:MB4|00000000 1197:MB4|00000000 1198:MB4|00000000 1199:MB4|00000000 1200:MB4|00000000 1201:MB4|00000000 1202:MB4|00000000 1203:MB4|00000000 1204:MB4|00000000 1205:MB4|00000000 1206:MB4|00000000 1207:MB4|00000000 1208:MB4|00000000 1209:MB4|00000000 1210:MB4|00000000 1211:MB4|00000000 1212:MB4|00000000 1213:MB4|00000000 1214:MB4|00000000 1215:MB4|00000000 1216:MB4|00000000 1217:MB4|00000000 1218:MB4|00000000 1219:MB4|00000000 1220:MB4|00000000 1221:MB4|00000000 1222:MB4|00000000 1223:MB4|00000000 1224:MB4|00000000 1225:MB4|00000000 1226:MB4|00000000 1227:MB4|00000000 1228:MB4|00000000 1229:MB4|00000000 1230:MB4|00000000 1231:MB4|00000000 1232:MB4|00000000 1233:MB4|00000000 1234:MB4|00000000 1235:MB4|00000000 1236:MB4|00000000 1237:MB4|00000000 1238:MB4|00000000 1239:MB4|00000000 1240:MB4|00000000 1241:MB4|00000000 1242:MB4|00000000 1243:MB4|00000000 1244:MB4|00000000 1245:MB4|00000000 1246:MB4|00000000 1247:MB4|00000000 1248:MB4|00000000 1249:MB4|00000000 1250:MB4|00000000 1251:MB4|00000000 1252:MB4|00000000 1253:MB4|00000000 1254:MB4|00000000 1255:MB4|00000000 1256:MB4|00000000 1257:MB4|00000000 1258:MB4|00000000 1259:MB4|00000000 1260:MB4|00000000 1261:MB4|00000000 1262:MB4|00000000 1263:MB4|00000000 1264:MB4|00000000 1265:MB4|00000000 1266:MB4|00000000 1267:MB4|00000000 1268:MB4|00000000 1269:MB4|00000000 1270:MB4|00000000 1271:MB4|00000000 1272:MB4|00000000 1273:MB4|00000000 1274:MB4|00000000 1275:MB4|00000000 1276:MB4|00000000 1277:MB4|00000000 1278:MB4|00000000 1279:MB4|00000000 1280:MB4|00000000 1281:MB4|00000000 1282:MB4|00000000 1283:MB4|00000000 1284:MB4|00000000 1285:MB4|00000000 1286:MB4|00000000 1287:MB4|00000000 1288:MB4|00000000 1289:MB4|00000000 1290:MB4|00000000 1291:MB4|00000000 1292:MB4|00000000 1293:MB4|00000000 1294:MB4|00000000 1295:MB4|00000000 1296:MB4|00000000 1297:MB4|00000000 1298:MB4|00000000 1299:MB4|00000000 1300:MB4|00000000 1301:MB4|00000000 1302:MB4|00000000 1303:MB4|00000000 1304:MB4|00000000 1305:MB4|00000000 1306:MB4|00000000 1307:MB4|00000000 1308:MB4|00000000 1309:MB4|00000000 1310:MB4|00000000 1311:MB4|00000000 1312:MB4|00000000 1313:MB4|00000000 1314:MB4|00000000 1315:MB4|00000000 1316:MB4|00000000 1317:MB4|00000000 1318:MB4|00000000 1319:MB4|00000000 1320:MB4|00000000 1321:MB4|00000000 1322:MB4|00000000 1323:MB4|00000000 1324:MB4|00000000 1325:MB4|00000000 1326:MB4|00000000 1327:MB4|00000000 1328:MB4|00000000 1329:MB4|00000000 1330:MB4|00000000 1331:MB4|00000000 1332:MB4|00000000 1333:MB4|00000000 1334:MB4|00000000 1335:MB4|00000000 1336:MB4|00000000 1337:MB4|00000000 1338:MB4|00000000 1339:MB4|00000000 1340:MB4|00000000 1341:MB4|00000000 1342:MB4|00000000 1343:MB4|00000000 1344:MB4|00000000 1345:MB4|00000000 1346:MB4|00000000 1347:MB4|00000000 1348:MB4|00000000 1349:MB4|00000000 1350:MB4|00000000 1351:MB4|00000000 1352:MB4|00000000 1353:MB4|00000000 1354:MB4|00000000 1355:MB4|00000000 1356:MB4|00000000 1357:MB4|00000000 1358:MB4|00000000 1359:MB4|00000000 1360:MB4|00000000 1361:MB4|00000000 1362:MB4|00000000 1363:MB4|00000000 1364:MB4|00000000 1365:MB4|00000000 1366:MB4|00000000 1367:MB4|00000000 1368:MB4|00000000 1369:MB4|00000000 1370:MB4|00000000 1371:MB4|00000000 1372:MB4|00000000 1373:MB4|00000000 1374:MB4|00000000 1375:MB4|00000000 1376:MB4|00000000 1377:MB4|00000000 1378:MB4|00000000 1379:MB4|00000000 1380:MB4|00000000 1381:MB4|00000000 1382:MB4|00000000 1383:MB4|00000000 1384:MB4|00000000 1385:MB4|00000000 1386:MB4|00000000 1387:MB4|00000000 1388:MB4|00000000 1389:MB4|00000000 1390:MB4|00000000 1391:MB4|00000000 1392:MB4|00000000 1393:MB4|00000000 1394:MB4|00000000 1395:MB4|00000000 1396:MB4|00000000 1397:MB4|00000000 1398:MB4|00000000 1399:MB4|00000000 1400:MB4|00000000 1401:MB4|00000000 1402:MB4|00000000 1403:MB4|00000000 1404:MB4|00000000 1405:MB4|00000000 1406:MB4|00000000 1407:MB4|00000000 1408:MB4|00000000 1409:MB4|00000000 1410:MB4|00000000 1411:MB4|00000000 1412:MB4|00000000 1413:MB4|00000000 1414:MB4|00000000 1415:MB4|00000000 1416:MB4|00000000 1417:MB4|00000000 1418:MB4|00000000 1419:MB4|00000000 1420:MB4|00000000 1421:MB4|00000000 1422:MB4|00000000 1423:MB4|00000000 1424:MB4|00000000 1425:MB4|00000000 1426:MB4|00000000 1427:MB4|00000000 1428:MB4|00000000 1429:MB4|00000000 1430:MB4|00000000 1431:MB4|00000000 1432:MB4|00000000 1433:MB4|00000000 1434:MB4|00000000 1435:MB4|00000000 1436:MB4|00000000 1437:MB4|00000000 1438:MB4|00000000 1439:MB4|00000000 1440:MB4|00000000 1441:MB4|00000000 1442:MB4|00000000 1443:MB4|00000000 1444:MB4|00000000 1445:MB4|00000000 1446:MB4|00000000 1447:MB4|00000000 1448:MB4|00000000 1449:MB4|00000000 1450:MB4|00000000 1451:MB4|00000000 1452:MB4|00000000 1453:MB4|00000000 1454:MB4|00000000 1455:MB4|00000000 1456:MB4|00000000 1457:MB4|00000000 1458:MB4|00000000 1459:MB4|00000000 1460:MB4|00000000 1461:MB4|00000000 1462:MB4|00000000 1463:MB4|00000000 1464:MB4|00000000 1465:MB4|00000000 1466:MB4|00000000 1467:MB4|00000000 1468:MB4|00000000 1469:MB4|00000000 1470:MB4|00000000 1471:MB4|00000000 1472:MB4|00000000 1473:MB4|00000000 1474:MB4|00000000 1475:MB4|00000000 1476:MB4|00000000 1477:MB4|00000000 1478:MB4|00000000 1479:MB4|00000000 1480:MB4|00000000 1481:MB4|00000000 1482:MB4|00000000 1483:MB4|00000000 1484:MB4|00000000 1485:MB4|00000000 1486:MB4|00000000 1487:MB4|00000000 1488:MB4|00000000 1489:MB4|00000000 1490:MB4|00000000 1491:MB4|00000000 1492:MB4|00000000 1493:MB4|00000000 1494:MB4|00000000 1495:MB4|00000000 1496:MB4|00000000 1497:MB4|00000000 1498:MB4|00000000 1499:MB4|00000000 1500:MB4|00000000 1501:MB4|00000000 1502:MB4|00000000 1503:MB4|00000000 1504:MB4|00000000 1505:MB4|00000000 1506:MB4|00000000 1507:MB4|00000000 1508:MB4|00000000 1509:MB4|00000000 1510:MB4|00000000 1511:MB4|00000000 1512:MB4|00000000 1513:MB4|00000000 1514:MB4|00000000 1515:MB4|00000000 1516:MB4|00000000 1517:MB4|00000000 1518:MB4|00000000 1519:MB4|00000000 1520:MB4|00000000 1521:MB4|00000000 1522:MB4|00000000 1523:MB4|00000000 1524:MB4|00000000 1525:MB4|00000000 1526:MB4|00000000 1527:MB4|00000000 1528:MB4|00000000 1529:MB4|00000000 1530:MB4|00000000 1531:MB4|00000000 1532:MB4|00000000 1533:MB4|00000000 1534:MB4|00000000 1535:MB4|00000000 1536:MB4|00000000 1537:MB4|00000000 1538:MB4|00000000 1539:MB4|00000000 1540:MB4|00000000 1541:MB4|00000000 1542:MB4|00000000 1543:MB4|00000000 1544:MB4|00000000 1545:MB4|00000000 1546:MB4|00000000 1547:MB4|00000000 1548:MB4|00000000 1549:MB4|00000000 1550:MB4|00000000 1551:MB4|00000000 1552:MB4|00000000 1553:MB4|00000000 1554:MB4|00000000 1555:MB4|00000000 1556:MB4|00000000 1557:MB4|00000000 1558:MB4|00000000 1559:MB4|00000000 1560:MB4|00000000 1561:MB4|00000000 1562:MB4|00000000 1563:MB4|00000000 1564:MB4|00000000 1565:MB4|00000000 1566:MB4|00000000 1567:MB4|00000000 1568:MB4|00000000 1569:MB4|00000000 1570:MB4|00000000 1571:MB4|00000000 1572:MB4|00000000 1573:MB4|00000000 1574:MB4|00000000 1575:MB4|00000000 1576:MB4|00000000 1577:MB4|00000000 1578:MB4|00000000 1579:MB4|00000000 1580:MB4|00000000 1581:MB4|00000000 1582:MB4|00000000 1583:MB4|00000000 1584:MB4|00000000 1585:MB4|00000000 1586:MB4|00000000 1587:MB4|00000000 1588:MB4|00000000 1589:MB4|00000000 1590:MB4|00000000 1591:MB4|00000000 1592:MB4|00000000 1593:MB4|00000000 1594:MB4|00000000 1595:MB4|00000000 1596:MB4|00000000 1597:MB4|00000000 1598:MB4|00000000 1599:MB4|00000000 1600:MB4|00000000 1601:MB4|00000000 1602:MB4|00000000 1603:MB4|00000000 1604:MB4|00000000 1605:MB4|00000000 1606:MB4|00000000 1607:MB4|00000000 1608:MB4|00000000 1609:MB4|00000000 1610:MB4|00000000 1611:MB4|00000000 1612:MB4|00000000 1613:MB4|00000000 1614:MB4|00000000 1615:MB4|00000000 1616:MB4|00000000 1617:MB4|00000000 1618:MB4|00000000 1619:MB4|00000000 1620:MB4|00000000 1621:MB4|00000000 1622:MB4|00000000 1623:MB4|00000000 1624:MB4|00000000 1625:MB4|00000000 1626:MB4|00000000 1627:MB4|00000000 1628:MB4|00000000 1629:MB4|00000000 1630:MB4|00000000 1631:MB4|00000000 1632:MB4|00000000 1633:MB4|00000000 1634:MB4|00000000 1635:MB4|00000000 1636:MB4|00000000 1637:MB4|00000000 1638:MB4|00000000 1639:MB4|00000000 1640:MB4|00000000 1641:MB4|00000000 1642:MB4|00000000 1643:MB4|00000000 1644:MB4|00000000 1645:MB4|00000000 1646:MB4|00000000 1647:MB4|00000000 1648:MB4|00000000 1649:MB4|00000000 1650:MB4|00000000 1651:MB4|00000000 1652:MB4|00000000 1653:MB4|00000000 1654:MB4|00000000 1655:MB4|00000000 1656:MB4|00000000 1657:MB4|00000000 1658:MB4|00000000 1659:MB4|00000000 1660:MB4|00000000 1661:MB4|00000000 1662:MB4|00000000 1663:MB4|00000000 1664:MB4|00000000 1665:MB4|00000000 1666:MB4|00000000 1667:MB4|00000000 1668:MB4|00000000 1669:MB4|00000000 1670:MB4|00000000 1671:MB4|00000000 1672:MB4|00000000 1673:MB4|00000000 1674:MB4|00000000 1675:MB4|00000000 1676:MB4|00000000 1677:MB4|00000000 1678:MB4|00000000 1679:MB4|00000000 1680:MB4|00000000 1681:MB4|00000000 1682:MB4|00000000 1683:MB4|00000000 1684:MB4|00000000 1685:MB4|00000000 1686:MB4|00000000 1687:MB4|00000000 1688:MB4|00000000 1689:MB4|00000000 1690:MB4|00000000 1691:MB4|00000000 1692:MB4|00000000 1693:MB4|00000000 1694:MB4|00000000 1695:MB4|00000000 1696:MB4|00000000 1697:MB4|00000000 1698:MB4|00000000 1699:MB4|00000000 1700:MB4|00000000 1701:MB4|00000000 1702:MB4|00000000 1703:MB4|00000000 1704:MB4|00000000 1705:MB4|00000000 1706:MB4|00000000 1707:MB4|00000000 1708:MB4|00000000 1709:MB4|00000000 1710:MB4|00000000 1711:MB4|00000000 1712:MB4|00000000 1713:MB4|00000000 1714:MB4|00000000 1715:MB4|00000000 1716:MB4|00000000 1717:MB4|00000000 1718:MB4|00000000 1719:MB4|00000000 1720:MB4|00000000 1721:MB4|00000000 1722:MB4|00000000 1723:MB4|00000000 1724:MB4|00000000 1725:MB4|00000000 1726:MB4|00000000 1727:MB4|00000000 1728:MB4|00000000 1729:MB4|00000000 1730:MB4|00000000 1731:MB4|00000000 1732:MB4|00000000 1733:MB4|00000000 1734:MB4|00000000 1735:MB4|00000000 1736:MB4|00000000 1737:MB4|00000000 1738:MB4|00000000 1739:MB4|00000000 1740:MB4|00000000 1741:MB4|00000000 1742:MB4|00000000 1743:MB4|00000000 1744:MB4|00000000 1745:MB4|00000000 1746:MB4|00000000 1747:MB4|00000000 1748:MB4|00000000 1749:MB4|00000000 1750:MB4|00000000 1751:MB4|00000000 1752:MB4|00000000 1753:MB4|00000000 1754:MB4|00000000 1755:MB4|00000000 1756:MB4|00000000 1757:MB4|00000000 1758:MB4|00000000 1759:MB4|00000000 1760:MB4|00000000 1761:MB4|00000000 1762:MB4|00000000 1763:MB4|00000000 1764:MB4|00000000 1765:MB4|00000000 1766:MB4|00000000 1767:MB4|00000000 1768:MB4|00000000 1769:MB4|00000000 1770:MB4|00000000 1771:MB4|00000000 1772:MB4|00000000 1773:MB4|00000000 1774:MB4|00000000 1775:MB4|00000000 1776:MB4|00000000 1777:MB4|00000000 1778:MB4|00000000 1779:MB4|00000000 1780:MB4|00000000 1781:MB4|00000000 1782:MB4|00000000 1783:MB4|00000000 1784:MB4|00000000 1785:MB4|00000000 1786:MB4|00000000 1787:MB4|00000000 1788:MB4|00000000 1789:MB4|00000000 1790:MB4|00000000 1791:MB4|00000000 1792:MB4|00000000 1793:MB4|00000000 1794:MB4|00000000 1795:MB4|00000000 1796:MB4|00000000 1797:MB4|00000000 1798:MB4|00000000 1799:MB4|00000000 1800:MB4|00000000 1801:MB4|00000000 1802:MB4|00000000 1803:MB4|00000000 1804:MB4|00000000 1805:MB4|00000000 1806:MB4|00000000 1807:MB4|00000000 1808:MB4|00000000 1809:MB4|00000000 1810:MB4|00000000 1811:MB4|00000000 1812:MB4|00000000 1813:MB4|00000000 1814:MB4|00000000 1815:MB4|00000000 1816:MB4|00000000 1817:MB4|00000000 1818:MB4|00000000 1819:MB4|00000000 1820:MB4|00000000 1821:MB4|00000000 1822:MB4|00000000 1823:MB4|00000000 1824:MB4|00000000 1825:MB4|00000000 1826:MB4|00000000 1827:MB4|00000000 1828:MB4|00000000 1829:MB4|00000000 1830:MB4|00000000 1831:MB4|00000000 1832:MB4|00000000 1833:MB4|00000000 1834:MB4|00000000 1835:MB4|00000000 1836:MB4|00000000 1837:MB4|00000000 1838:MB4|00000000 1839:MB4|00000000 1840:MB4|00000000 1841:MB4|00000000 1842:MB4|00000000 1843:MB4|00000000 1844:MB4|00000000 1845:MB4|00000000 1846:MB4|00000000 1847:MB4|00000000 1848:MB4|00000000 1849:MB4|00000000 1850:MB4|00000000 1851:MB4|00000000 1852:MB4|00000000 1853:MB4|00000000 1854:MB4|00000000 1855:MB4|00000000 1856:MB4|00000000 1857:MB4|00000000 1858:MB4|00000000 1859:MB4|00000000 1860:MB4|00000000 1861:MB4|00000000 1862:MB4|00000000 1863:MB4|00000000 1864:MB4|00000000 1865:MB4|00000000 1866:MB4|00000000 1867:MB4|00000000 1868:MB4|00000000 1869:MB4|00000000 1870:MB4|00000000 1871:MB4|00000000 1872:MB4|00000000 1873:MB4|00000000 1874:MB4|00000000 1875:MB4|00000000 1876:MB4|00000000 1877:MB4|00000000 1878:MB4|00000000 1879:MB4|00000000 1880:MB4|00000000 1881:MB4|00000000 1882:MB4|00000000 1883:MB4|00000000 1884:MB4|00000000 1885:MB4|00000000 1886:MB4|00000000 1887:MB4|00000000 1888:MB4|00000000 1889:MB4|00000000 1890:MB4|00000000 1891:MB4|00000000 1892:MB4|00000000 1893:MB4|00000000 1894:MB4|00000000 1895:MB4|00000000 1896:MB4|00000000 1897:MB4|00000000 1898:MB4|00000000 1899:MB4|00000000 1900:MB4|00000000 1901:MB4|00000000 1902:MB4|00000000 1903:MB4|00000000 1904:MB4|00000000 1905:MB4|00000000 1906:MB4|00000000 1907:MB4|00000000 1908:MB4|00000000 1909:MB4|00000000 1910:MB4|00000000 1911:MB4|00000000 1912:MB4|00000000 1913:MB4|00000000 1914:MB4|00000000 1915:MB4|00000000 1916:MB4|00000000 1917:MB4|00000000 1918:MB4|00000000 1919:MB4|00000000 1920:MB4|00000000 1921:MB4|00000000 1922:MB4|00000000 1923:MB4|00000000 1924:MB4|00000000 1925:MB4|00000000 1926:MB4|00000000 1927:MB4|00000000 1928:MB4|00000000 1929:MB4|00000000 1930:MB4|00000000 1931:MB4|00000000 1932:MB4|00000000 1933:MB4|00000000 1934:MB4|00000000 1935:MB4|00000000 1936:MB4|00000000 1937:MB4|00000000 1938:MB4|00000000 1939:MB4|00000000 1940:MB4|00000000 1941:MB4|00000000 1942:MB4|00000000 1943:MB4|00000000 1944:MB4|00000000 1945:MB4|00000000 1946:MB4|00000000 1947:MB4|00000000 1948:MB4|00000000 1949:MB4|00000000 1950:MB4|00000000 1951:MB4|00000000 1952:MB4|00000000 1953:MB4|00000000 1954:MB4|00000000 1955:MB4|00000000 1956:MB4|00000000 1957:MB4|00000000 1958:MB4|00000000 1959:MB4|00000000 1960:MB4|00000000 1961:MB4|00000000 1962:MB4|00000000 1963:MB4|00000000 1964:MB4|00000000 1965:MB4|00000000 1966:MB4|00000000 1967:MB4|00000000 1968:MB4|00000000 1969:MB4|00000000 1970:MB4|00000000 1971:MB4|00000000 1972:MB4|00000000 1973:MB4|00000000 1974:MB4|00000000 1975:MB4|00000000 1976:MB4|00000000 1977:MB4|00000000 1978:MB4|00000000 1979:MB4|00000000 1980:MB4|00000000 1981:MB4|00000000 1982:MB4|00000000 1983:MB4|00000000 1984:MB4|00000000 1985:MB4|00000000 1986:MB4|00000000 1987:MB4|00000000 1988:MB4|00000000 1989:MB4|00000000 1990:MB4|00000000 1991:MB4|00000000 1992:MB4|00000000 1993:MB4|00000000 1994:MB4|00000000 1995:MB4|00000000 1996:MB4|00000000 1997:MB4|00000000 1998:MB4|00000000 1999:MB4|00000000 2000:MB4|00000000 2001:MB4|00000000 2002:MB4|00000000 2003:MB4|00000000 2004:MB4|00000000 2005:MB4|00000000 2006:MB4|00000000 2007:MB4|00000000 2008:MB4|00000000 2009:MB4|00000000 2010:MB4|00000000 2011:MB4|00000000 2012:MB4|00000000 2013:MB4|00000000 2014:MB4|00000000 2015:MB4|00000000 2016:MB4|00000000 2017:MB4|00000000 2018:MB4|00000000 2019:MB4|00000000 2020:MB4|00000000 2021:MB4|00000000 2022:MB4|00000000 2023:MB4|00000000 2024:MB4|00000000 2025:MB4|00000000 2026:MB4|00000000 2027:MB4|00000000 2028:MB4|00000000 2029:MB4|00000000 2030:MB4|00000000 2031:MB4|00000000 2032:MB4|00000000 2033:MB4|00000000 2034:MB4|00000000 2035:MB4|00000000 2036:MB4|00000000 2037:MB4|00000000 2038:MB4|00000000 2039:MB4|00000000 2040:MB4|00000000 2041:MB4|00000000 2042:MB4|00000000 2043:MB4|00000000 2044:MB4|00000000 2045:MB4|00000000 2046:MB4|00000000 2047:MB4|00000000 2048:MB4|00000000 2049:MB4|00000000 2050:MB4|00000000 2051:MB4|00000000 2052:MB4|00000000 2053:MB4|00000000 2054:MB4|00000000 2055:MB4|00000000 2056:MB4|00000000 2057:MB4|00000000 2058:MB4|00000000 2059:MB4|00000000 2060:MB4|00000000 2061:MB4|00000000 2062:MB4|00000000 2063:MB4|00000000 2064:MB4|00000000 2065:MB4|00000000 2066:MB4|00000000 2067:MB4|00000000 2068:MB4|00000000 2069:MB4|00000000 2070:MB4|00000000 2071:MB4|00000000 2072:MB4|00000000 2073:MB4|00000000 2074:MB4|00000000 2075:MB4|00000000 2076:MB4|00000000 2077:MB4|00000000 2078:MB4|00000000 2079:MB4|00000000 2080:MB4|00000000 2081:MB4|00000000 2082:MB4|00000000 2083:MB4|00000000 2084:MB4|00000000 2085:MB4|00000000 2086:MB4|00000000 2087:MB4|00000000 2088:MB4|00000000 2089:MB4|00000000 2090:MB4|00000000 2091:MB4|00000000 2092:MB4|00000000 2093:MB4|00000000 2094:MB4|00000000 2095:MB4|00000000 2096:MB4|00000000 2097:MB4|00000000 2098:MB4|00000000 2099:MB4|00000000 2100:MB4|00000000 2101:MB4|00000000 2102:MB4|00000000 2103:MB4|00000000 2104:MB4|00000000 2105:MB4|00000000 2106:MB4|00000000 2107:MB4|00000000 2108:MB4|00000000 2109:MB4|00000000 2110:MB4|00000000 2111:MB4|00000000 2112:MB4|00000000 2113:MB4|00000000 2114:MB4|00000000 2115:MB4|00000000 2116:MB4|00000000 2117:MB4|00000000 2118:MB4|00000000 2119:MB4|00000000 2120:MB4|00000000 2121:MB4|00000000 2122:MB4|00000000 2123:MB4|00000000 2124:MB4|00000000 2125:MB4|00000000 2126:MB4|00000000 2127:MB4|00000000 2128:MB4|00000000 2129:MB4|00000000 2130:MB4|00000000 2131:MB4|00000000 2132:MB4|00000000 2133:MB4|00000000 2134:MB4|00000000 2135:MB4|00000000 2136:MB4|00000000 2137:MB4|00000000 2138:MB4|00000000 2139:MB4|00000000 2140:MB4|00000000 2141:MB4|00000000 2142:MB4|00000000 2143:MB4|00000000 2144:MB4|00000000 2145:MB4|00000000 2146:MB4|00000000 2147:MB4|00000000 2148:MB4|00000000 2149:MB4|00000000 2150:MB4|00000000 2151:MB4|00000000 2152:MB4|00000000 2153:MB4|00000000 2154:MB4|00000000 2155:MB4|00000000 2156:MB4|00000000 2157:MB4|00000000 2158:MB4|00000000 2159:MB4|00000000 2160:MB4|00000000 2161:MB4|00000000 2162:MB4|00000000 2163:MB4|00000000 2164:MB4|00000000 2165:MB4|00000000 2166:MB4|00000000 2167:MB4|00000000 2168:MB4|00000000 2169:MB4|00000000 2170:MB4|00000000 2171:MB4|00000000 2172:MB4|00000000 2173:MB4|00000000 2174:MB4|00000000 2175:MB4|00000000 2176:MB4|00000000 2177:MB4|00000000 2178:MB4|00000000 2179:MB4|00000000 2180:MB4|00000000 2181:MB4|00000000 2182:MB4|00000000 2183:MB4|00000000 2184:MB4|00000000 2185:MB4|00000000 2186:MB4|00000000 2187:MB4|00000000 2188:MB4|00000000 2189:MB4|00000000 2190:MB4|00000000 2191:MB4|00000000 2192:MB4|00000000 2193:MB4|00000000 2194:MB4|00000000 2195:MB4|00000000 2196:MB4|00000000 2197:MB4|00000000 2198:MB4|00000000 2199:MB4|00000000 2200:MB4|00000000 2201:MB4|00000000 2202:MB4|00000000 2203:MB4|00000000 2204:MB4|00000000 2205:MB4|00000000 2206:MB4|00000000 2207:MB4|00000000 2208:MB4|00000000 2209:MB4|00000000 2210:MB4|00000000 2211:MB4|00000000 2212:MB4|00000000 2213:MB4|00000000 2214:MB4|00000000 2215:MB4|00000000 2216:MB4|00000000 2217:MB4|00000000 2218:MB4|00000000 2219:MB4|00000000 2220:MB4|00000000 2221:MB4|00000000 2222:MB4|00000000 2223:MB4|00000000 2224:MB4|00000000 2225:MB4|00000000 2226:MB4|00000000 2227:MB4|00000000 2228:MB4|00000000 2229:MB4|00000000 2230:MB4|00000000 2231:MB4|00000000 2232:MB4|00000000 2233:MB4|00000000 2234:MB4|00000000 2235:MB4|00000000 2236:MB4|00000000 2237:MB4|00000000 2238:MB4|00000000 2239:MB4|00000000 2240:MB4|00000000 2241:MB4|00000000 2242:MB4|00000000 2243:MB4|00000000 2244:MB4|00000000 2245:MB4|00000000 2246:MB4|00000000 2247:MB4|00000000 2248:MB4|00000000 2249:MB4|00000000 2250:MB4|00000000 2251:MB4|00000000 2252:MB4|00000000 2253:MB4|00000000 2254:MB4|00000000 2255:MB4|00000000 2256:MB4|00000000 2257:MB4|00000000 2258:MB4|00000000 2259:MB4|00000000 2260:MB4|00000000 2261:MB4|00000000 2262:MB4|00000000 2263:MB4|00000000 2264:MB4|00000000 2265:MB4|00000000 2266:MB4|00000000 2267:MB4|00000000 2268:MB4|00000000 2269:MB4|00000000 2270:MB4|00000000 2271:MB4|00000000 2272:MB4|00000000 2273:MB4|00000000 2274:MB4|00000000 2275:MB4|00000000 2276:MB4|00000000 2277:MB4|00000000 2278:MB4|00000000 2279:MB4|00000000 2280:MB4|00000000 2281:MB4|00000000 2282:MB4|00000000 2283:MB4|00000000 2284:MB4|00000000 2285:MB4|00000000 2286:MB4|00000000 2287:MB4|00000000 2288:MB4|00000000 2289:MB4|00000000 2290:MB4|00000000 2291:MB4|00000000 2292:MB4|00000000 2293:MB4|00000000 2294:MB4|00000000 2295:MB4|00000000 2296:MB4|00000000 2297:MB4|00000000 2298:MB4|00000000 2299:MB4|00000000 2300:MB4|00000000 2301:MB4|00000000 2302:MB4|00000000 2303:MB4|00000000 2304:MB4|00000000 2305:MB4|00000000 2306:MB4|00000000 2307:MB4|00000000 2308:MB4|00000000 2309:MB4|00000000 2310:MB4|00000000 2311:MB4|00000000 2312:MB4|00000000 2313:MB4|00000000 2314:MB4|00000000 2315:MB4|00000000 2316:MB4|00000000 2317:MB4|00000000 2318:MB4|00000000 2319:MB4|00000000 2320:MB4|00000000 2321:MB4|00000000 2322:MB4|00000000 2323:MB4|00000000 2324:MB4|00000000 2325:MB4|00000000 2326:MB4|00000000 2327:MB4|00000000 2328:MB4|00000000 2329:MB4|00000000 2330:MB4|00000000 2331:MB4|00000000 2332:MB4|00000000 2333:MB4|00000000 2334:MB4|00000000 2335:MB4|00000000 2336:MB4|00000000 2337:MB4|00000000 2338:MB4|00000000 2339:MB4|00000000 2340:MB4|00000000 2341:MB4|00000000 2342:MB4|00000000 2343:MB4|00000000 2344:MB4|00000000 2345:MB4|00000000 2346:MB4|00000000 2347:MB4|00000000 2348:MB4|00000000 2349:MB4|00000000 2350:MB4|00000000 2351:MB4|00000000 2352:MB4|00000000 2353:MB4|00000000 2354:MB4|00000000 2355:MB4|00000000 2356:MB4|00000000 2357:MB4|00000000 2358:MB4|00000000 2359:MB4|00000000 2360:MB4|00000000 2361:MB4|00000000 2362:MB4|00000000 2363:MB4|00000000 2364:MB4|00000000 2365:MB4|00000000 2366:MB4|00000000 2367:MB4|00000000 2368:MB4|00000000 2369:MB4|00000000 2370:MB4|00000000 2371:MB4|00000000 2372:MB4|00000000 2373:MB4|00000000 2374:MB4|00000000 2375:MB4|00000000 2376:MB4|00000000 2377:MB4|00000000 2378:MB4|00000000 2379:MB4|00000000 2380:MB4|00000000 2381:MB4|00000000 2382:MB4|00000000 2383:MB4|00000000 2384:MB4|00000000 2385:MB4|00000000 2386:MB4|00000000 2387:MB4|00000000 2388:MB4|00000000 2389:MB4|00000000 2390:MB4|00000000 2391:MB4|00000000 2392:MB4|00000000 2393:MB4|00000000 2394:MB4|00000000 2395:MB4|00000000 2396:MB4|00000000 2397:MB4|00000000 2398:MB4|00000000 2399:MB4|00000000 2400:MB4|00000000 2401:MB4|00000000 2402:MB4|00000000 2403:MB4|00000000 2404:MB4|00000000 2405:MB4|00000000 2406:MB4|00000000 2407:MB4|00000000 2408:MB4|00000000 2409:MB4|00000000 2410:MB4|00000000 2411:MB4|00000000 2412:MB4|00000000 2413:MB4|00000000 2414:MB4|00000000 2415:MB4|00000000 2416:MB4|00000000 2417:MB4|00000000 2418:MB4|00000000 2419:MB4|00000000 2420:MB4|00000000 2421:MB4|00000000 2422:MB4|00000000 2423:MB4|00000000 2424:MB4|00000000 2425:MB4|00000000 2426:MB4|00000000 2427:MB4|00000000 2428:MB4|00000000 2429:MB4|00000000 2430:MB4|00000000 2431:MB4|00000000 2432:MB4|00000000 2433:MB4|00000000 2434:MB4|00000000 2435:MB4|00000000 2436:MB4|00000000 2437:MB4|00000000 2438:MB4|00000000 2439:MB4|00000000 2440:MB4|00000000 2441:MB4|00000000 2442:MB4|00000000 2443:MB4|00000000 2444:MB4|00000000 2445:MB4|00000000 2446:MB4|00000000 2447:MB4|00000000 2448:MB4|00000000 2449:MB4|00000000 2450:MB4|00000000 2451:MB4|00000000 2452:MB4|00000000 2453:MB4|00000000 2454:MB4|00000000 2455:MB4|00000000 2456:MB4|00000000 2457:MB4|00000000 2458:MB4|00000000 2459:MB4|00000000 2460:MB4|00000000 2461:MB4|00000000 2462:MB4|00000000 2463:MB4|00000000 2464:MB4|00000000 2465:MB4|00000000 2466:MB4|00000000 2467:MB4|00000000 2468:MB4|00000000 2469:MB4|00000000 2470:MB4|00000000 2471:MB4|00000000 2472:MB4|00000000 2473:MB4|00000000 2474:MB4|00000000 2475:MB4|00000000 2476:MB4|00000000 2477:MB4|00000000 2478:MB4|00000000 2479:MB4|00000000 2480:MB4|00000000 2481:MB4|00000000 2482:MB4|00000000 2483:MB4|00000000 2484:MB4|00000000 2485:MB4|00000000 2486:MB4|00000000 2487:MB4|00000000 2488:MB4|00000000 2489:MB4|00000000 2490:MB4|00000000 2491:MB4|00000000 2492:MB4|00000000 2493:MB4|00000000 2494:MB4|00000000 2495:MB4|00000000 2496:MB4|00000000 2497:MB4|00000000 2498:MB4|00000000 2499:MB4|00000000 2500:MB4|00000000 2501:MB4|00000000 2502:MB4|00000000 2503:MB4|00000000 2504:MB4|00000000 2505:MB4|00000000 2506:MB4|00000000 2507:MB4|00000000 2508:MB4|00000000 2509:MB4|00000000 2510:MB4|00000000 2511:MB4|00000000 2512:MB4|00000000 2513:MB4|00000000 2514:MB4|00000000 2515:MB4|00000000 2516:MB4|00000000 2517:MB4|00000000 2518:MB4|00000000 2519:MB4|00000000 2520:MB4|00000000 2521:MB4|00000000 2522:MB4|00000000 2523:MB4|00000000 2524:MB4|00000000 2525:MB4|00000000 2526:MB4|00000000 2527:MB4|00000000 2528:MB4|00000000 2529:MB4|00000000 2530:MB4|00000000 2531:MB4|00000000 2532:MB4|00000000 2533:MB4|00000000 2534:MB4|00000000 2535:MB4|00000000 2536:MB4|00000000 2537:MB4|00000000 2538:MB4|00000000 2539:MB4|00000000 2540:MB4|00000000 2541:MB4|00000000 2542:MB4|00000000 2543:MB4|00000000 2544:MB4|00000000 2545:MB4|00000000 2546:MB4|00000000 2547:MB4|00000000 2548:MB4|00000000 2549:MB4|00000000 2550:MB4|00000000 2551:MB4|00000000 2552:MB4|00000000 2553:MB4|00000000 2554:MB4|00000000 2555:MB4|00000000 2556:MB4|00000000 2557:MB4|00000000 2558:MB4|00000000 2559:MB4|00000000 2560:MB4|00000000 2561:MB4|00000000 2562:MB4|00000000 2563:MB4|00000000 2564:MB4|00000000 2565:MB4|00000000 2566:MB4|00000000 2567:MB4|00000000 2568:MB4|00000000 2569:MB4|00000000 2570:MB4|00000000 2571:MB4|00000000 2572:MB4|00000000 2573:MB4|00000000 2574:MB4|00000000 2575:MB4|00000000 2576:MB4|00000000 2577:MB4|00000000 2578:MB4|00000000 2579:MB4|00000000 2580:MB4|00000000 2581:MB4|00000000 2582:MB4|00000000 2583:MB4|00000000 2584:MB4|00000000 2585:MB4|00000000 2586:MB4|00000000 2587:MB4|00000000 2588:MB4|00000000 2589:MB4|00000000 2590:MB4|00000000 2591:MB4|00000000 2592:MB4|00000000 2593:MB4|00000000 2594:MB4|00000000 2595:MB4|00000000 2596:MB4|00000000 2597:MB4|00000000 2598:MB4|00000000 2599:MB4|00000000 2600:MB4|00000000 2601:MB4|00000000 2602:MB4|00000000 2603:MB4|00000000 2604:MB4|00000000 2605:MB4|00000000 2606:MB4|00000000 2607:MB4|00000000 2608:MB4|00000000 2609:MB4|00000000 2610:MB4|00000000 2611:MB4|00000000 2612:MB4|00000000 2613:MB4|00000000 2614:MB4|00000000 2615:MB4|00000000 2616:MB4|00000000 2617:MB4|00000000 2618:MB4|00000000 2619:MB4|00000000 2620:MB4|00000000 2621:MB4|00000000 2622:MB4|00000000 2623:MB4|00000000 2624:MB4|00000000 2625:MB4|00000000 2626:MB4|00000000 2627:MB4|00000000 2628:MB4|00000000 2629:MB4|00000000 2630:MB4|00000000 2631:MB4|00000000 2632:MB4|00000000 2633:MB4|00000000 2634:MB4|00000000 2635:MB4|00000000 2636:MB4|00000000 2637:MB4|00000000 2638:MB4|00000000 2639:MB4|00000000 2640:MB4|00000000 2641:MB4|00000000 2642:MB4|00000000 2643:MB4|00000000 2644:MB4|00000000 2645:MB4|00000000 2646:MB4|00000000 2647:MB4|00000000 2648:MB4|00000000 2649:MB4|00000000 2650:MB4|00000000 2651:MB4|00000000 2652:MB4|00000000 2653:MB4|00000000 2654:MB4|00000000 2655:MB4|00000000 2656:MB4|00000000 2657:MB4|00000000 2658:MB4|00000000 2659:MB4|00000000 2660:MB4|00000000 2661:MB4|00000000 2662:MB4|00000000 2663:MB4|00000000 2664:MB4|00000000 2665:MB4|00000000 2666:MB4|00000000 2667:MB4|00000000 2668:MB4|00000000 2669:MB4|00000000 2670:MB4|00000000 2671:MB4|00000000 2672:MB4|00000000 2673:MB4|00000000 2674:MB4|00000000 2675:MB4|00000000 2676:MB4|00000000 2677:MB4|00000000 2678:MB4|00000000 2679:MB4|00000000 2680:MB4|00000000 2681:MB4|00000000 2682:MB4|00000000 2683:MB4|00000000 2684:MB4|00000000 2685:MB4|00000000 2686:MB4|00000000 2687:MB4|00000000 2688:MB4|00000000 2689:MB4|00000000 2690:MB4|00000000 2691:MB4|00000000 2692:MB4|00000000 2693:MB4|00000000 2694:MB4|00000000 2695:MB4|00000000 2696:MB4|00000000 2697:MB4|00000000 2698:MB4|00000000 2699:MB4|00000000 2700:MB4|00000000 2701:MB4|00000000 2702:MB4|00000000 2703:MB4|00000000 2704:MB4|00000000 2705:MB4|00000000 2706:MB4|00000000 2707:MB4|00000000 2708:MB4|00000000 2709:MB4|00000000 2710:MB4|00000000 2711:MB4|00000000 2712:MB4|00000000 2713:MB4|00000000 2714:MB4|00000000 2715:MB4|00000000 2716:MB4|00000000 2717:MB4|00000000 2718:MB4|00000000 2719:MB4|00000000 2720:MB4|00000000 2721:MB4|00000000 2722:MB4|00000000 2723:MB4|00000000 2724:MB4|00000000 2725:MB4|00000000 2726:MB4|00000000 2727:MB4|00000000 2728:MB4|00000000 2729:MB4|00000000 2730:MB4|00000000 2731:MB4|00000000 2732:MB4|00000000 2733:MB4|00000000 2734:MB4|00000000 2735:MB4|00000000 2736:MB4|00000000 2737:MB4|00000000 2738:MB4|00000000 2739:MB4|00000000 2740:MB4|00000000 2741:MB4|00000000 2742:MB4|00000000 2743:MB4|00000000 2744:MB4|00000000 2745:MB4|00000000 2746:MB4|00000000 2747:MB4|00000000 2748:MB4|00000000 2749:MB4|00000000 2750:MB4|00000000 2751:MB4|00000000 2752:MB4|00000000 2753:MB4|00000000 2754:MB4|00000000 2755:MB4|00000000 2756:MB4|00000000 2757:MB4|00000000 2758:MB4|00000000 2759:MB4|00000000 2760:MB4|00000000 2761:MB4|00000000 2762:MB4|00000000 2763:MB4|00000000 2764:MB4|00000000 2765:MB4|00000000 2766:MB4|00000000 2767:MB4|00000000 2768:MB4|00000000 2769:MB4|00000000 2770:MB4|00000000 2771:MB4|00000000 2772:MB4|00000000 2773:MB4|00000000 2774:MB4|00000000 2775:MB4|00000000 2776:MB4|00000000 2777:MB4|00000000 2778:MB4|00000000 2779:MB4|00000000 2780:MB4|00000000 2781:MB4|00000000 2782:MB4|00000000 2783:MB4|00000000 2784:MB4|00000000 2785:MB4|00000000 2786:MB4|00000000 2787:MB4|00000000 2788:MB4|00000000 2789:MB4|00000000 2790:MB4|00000000 2791:MB4|00000000 2792:MB4|00000000 2793:MB4|00000000 2794:MB4|00000000 2795:MB4|00000000 2796:MB4|00000000 2797:MB4|00000000 2798:MB4|00000000 2799:MB4|00000000 2800:MB4|00000000 2801:MB4|00000000 2802:MB4|00000000 2803:MB4|00000000 2804:MB4|00000000 2805:MB4|00000000 2806:MB4|00000000 2807:MB4|00000000 2808:MB4|00000000 2809:MB4|00000000 2810:MB4|00000000 2811:MB4|00000000 2812:MB4|00000000 2813:MB4|00000000 2814:MB4|00000000 2815:MB4|00000000 2816:MB4|00000000 2817:MB4|00000000 2818:MB4|00000000 2819:MB4|00000000 2820:MB4|00000000 2821:MB4|00000000 2822:MB4|00000000 2823:MB4|00000000 2824:MB4|00000000 2825:MB4|00000000 2826:MB4|00000000 2827:MB4|00000000 2828:MB4|00000000 2829:MB4|00000000 2830:MB4|00000000 2831:MB4|00000000 2832:MB4|00000000 2833:MB4|00000000 2834:MB4|00000000 2835:MB4|00000000 2836:MB4|00000000 2837:MB4|00000000 2838:MB4|00000000 2839:MB4|00000000 2840:MB4|00000000 2841:MB4|00000000 2842:MB4|00000000 2843:MB4|00000000 2844:MB4|00000000 2845:MB4|00000000 2846:MB4|00000000 2847:MB4|00000000 2848:MB4|00000000 2849:MB4|00000000 2850:MB4|00000000 2851:MB4|00000000 2852:MB4|00000000 2853:MB4|00000000 2854:MB4|00000000 2855:MB4|00000000 2856:MB4|00000000 2857:MB4|00000000 2858:MB4|00000000 2859:MB4|00000000 2860:MB4|00000000 2861:MB4|00000000 2862:MB4|00000000 2863:MB4|00000000 2864:MB4|00000000 2865:MB4|00000000 2866:MB4|00000000 2867:MB4|00000000 2868:MB4|00000000 2869:MB4|00000000 2870:MB4|00000000 2871:MB4|00000000 2872:MB4|00000000 2873:MB4|00000000 2874:MB4|00000000 2875:MB4|00000000 2876:MB4|00000000 2877:MB4|00000000 2878:MB4|00000000 2879:MB4|00000000 2880:MB4|00000000 2881:MB4|00000000 2882:MB4|00000000 2883:MB4|00000000 2884:MB4|00000000 2885:MB4|00000000 2886:MB4|00000000 2887:MB4|00000000 2888:MB4|00000000 2889:MB4|00000000 2890:MB4|00000000 2891:MB4|00000000 2892:MB4|00000000 2893:MB4|00000000 2894:MB4|00000000 2895:MB4|00000000 2896:MB4|00000000 2897:MB4|00000000 2898:MB4|00000000 2899:MB4|00000000 2900:MB4|00000000 2901:MB4|00000000 2902:MB4|00000000 2903:MB4|00000000 2904:MB4|00000000 2905:MB4|00000000 2906:MB4|00000000 2907:MB4|00000000 2908:MB4|00000000 2909:MB4|00000000 2910:MB4|00000000 2911:MB4|00000000 2912:MB4|00000000 2913:MB4|00000000 2914:MB4|00000000 2915:MB4|00000000 2916:MB4|00000000 2917:MB4|00000000 2918:MB4|00000000 2919:MB4|00000000 2920:MB4|00000000 2921:MB4|00000000 2922:MB4|00000000 2923:MB4|00000000 2924:MB4|00000000 2925:MB4|00000000 2926:MB4|00000000 2927:MB4|00000000 2928:MB4|00000000 2929:MB4|00000000 2930:MB4|00000000 2931:MB4|00000000 2932:MB4|00000000 2933:MB4|00000000 2934:MB4|00000000 2935:MB4|00000000 2936:MB4|00000000 2937:MB4|00000000 2938:MB4|00000000 2939:MB4|00000000 2940:MB4|00000000 2941:MB4|00000000 2942:MB4|00000000 2943:MB4|00000000 2944:MB4|00000000 2945:MB4|00000000 2946:MB4|00000000 2947:MB4|00000000 2948:MB4|00000000 2949:MB4|00000000 2950:MB4|00000000 2951:MB4|00000000 2952:MB4|00000000 2953:MB4|00000000 2954:MB4|00000000 2955:MB4|00000000 2956:MB4|00000000 2957:MB4|00000000 2958:MB4|00000000 2959:MB4|00000000 2960:MB4|00000000 2961:MB4|00000000 2962:MB4|00000000 2963:MB4|00000000 2964:MB4|00000000 2965:MB4|00000000 2966:MB4|00000000 2967:MB4|00000000 2968:MB4|00000000 2969:MB4|00000000 2970:MB4|00000000 2971:MB4|00000000 2972:MB4|00000000 2973:MB4|00000000 2974:MB4|00000000 2975:MB4|00000000 2976:MB4|00000000 2977:MB4|00000000 2978:MB4|00000000 2979:MB4|00000000 2980:MB4|00000000 2981:MB4|00000000 2982:MB4|00000000 2983:MB4|00000000 2984:MB4|00000000 2985:MB4|00000000 2986:MB4|00000000 2987:MB4|00000000 2988:MB4|00000000 2989:MB4|00000000 2990:MB4|00000000 2991:MB4|00000000 2992:MB4|00000000 2993:MB4|00000000 2994:MB4|00000000 2995:MB4|00000000 2996:MB4|00000000 2997:MB4|00000000 2998:MB4|00000000 2999:MB4|00000000 3000:MB4|00000000 3001:MB4|00000000 3002:MB4|00000000 3003:MB4|00000000 3004:MB4|00000000 3005:MB4|00000000 3006:MB4|00000000 3007:MB4|00000000 3008:MB4|00000000 3009:MB4|00000000 3010:MB4|00000000 3011:MB4|00000000 3012:MB4|00000000 3013:MB4|00000000 3014:MB4|00000000 3015:MB4|00000000 3016:MB4|00000000 3017:MB4|00000000 3018:MB4|00000000 3019:MB4|00000000 3020:MB4|00000000 3021:MB4|00000000 3022:MB4|00000000 3023:MB4|00000000 3024:MB4|00000000 3025:MB4|00000000 3026:MB4|00000000 3027:MB4|00000000 3028:MB4|00000000 3029:MB4|00000000 3030:MB4|00000000 3031:MB4|00000000 3032:MB4|00000000 3033:MB4|00000000 3034:MB4|00000000 3035:MB4|00000000 3036:MB4|00000000 3037:MB4|00000000 3038:MB4|00000000 3039:MB4|00000000 3040:MB4|00000000 3041:MB4|00000000 3042:MB4|00000000 3043:MB4|00000000 3044:MB4|00000000 3045:MB4|00000000 3046:MB4|00000000 3047:MB4|00000000 3048:MB4|00000000 3049:MB4|00000000 3050:MB4|00000000 3051:MB4|00000000 3052:MB4|00000000 3053:MB4|00000000 3054:MB4|00000000 3055:MB4|00000000 3056:MB4|00000000 3057:MB4|00000000 3058:MB4|00000000 3059:MB4|00000000 3060:MB4|00000000 3061:MB4|00000000 3062:MB4|00000000 3063:MB4|00000000 3064:MB4|00000000 3065:MB4|00000000 3066:MB4|00000000 3067:MB4|00000000 3068:MB4|00000000 3069:MB4|00000000 3070:MB4|00000000 3071:MB4|00000000 3072:MB4|00000000 3073:MB4|00000000 3074:MB4|00000000 3075:MB4|00000000 3076:MB4|00000000 3077:MB4|00000000 3078:MB4|00000000 3079:MB4|00000000 3080:MB4|00000000 3081:MB4|00000000 3082:MB4|00000000 3083:MB4|00000000 3084:MB4|00000000 3085:MB4|00000000 3086:MB4|00000000 3087:MB4|00000000 3088:MB4|00000000 3089:MB4|00000000 3090:MB4|00000000 3091:MB4|00000000 3092:MB4|00000000 3093:MB4|00000000 3094:MB4|00000000 3095:MB4|00000000 3096:MB4|00000000 3097:MB4|00000000 3098:MB4|00000000 3099:MB4|00000000 3100:MB4|00000000 3101:MB4|00000000 3102:MB4|00000000 3103:MB4|00000000 3104:MB4|00000000 3105:MB4|00000000 3106:MB4|00000000 3107:MB4|00000000 3108:MB4|00000000 3109:MB4|00000000 3110:MB4|00000000 3111:MB4|00000000 3112:MB4|00000000 3113:MB4|00000000 3114:MB4|00000000 3115:MB4|00000000 3116:MB4|00000000 3117:MB4|00000000 3118:MB4|00000000 3119:MB4|00000000 3120:MB4|00000000 3121:MB4|00000000 3122:MB4|00000000 3123:MB4|00000000 3124:MB4|00000000 3125:MB4|00000000 3126:MB4|00000000 3127:MB4|00000000 3128:MB4|00000000 3129:MB4|00000000 3130:MB4|00000000 3131:MB4|00000000 3132:MB4|00000000 3133:MB4|00000000 3134:MB4|00000000 3135:MB4|00000000 3136:MB4|00000000 3137:MB4|00000000 3138:MB4|00000000 3139:MB4|00000000 3140:MB4|00000000 3141:MB4|00000000 3142:MB4|00000000 3143:MB4|00000000 3144:MB4|00000000 3145:MB4|00000000 3146:MB4|00000000 3147:MB4|00000000 3148:MB4|00000000 3149:MB4|00000000 3150:MB4|00000000 3151:MB4|00000000 3152:MB4|00000000 3153:MB4|00000000 3154:MB4|00000000 3155:MB4|00000000 3156:MB4|00000000 3157:MB4|00000000 3158:MB4|00000000 3159:MB4|00000000 3160:MB4|00000000 3161:MB4|00000000 3162:MB4|00000000 3163:MB4|00000000 3164:MB4|00000000 3165:MB4|00000000 3166:MB4|00000000 3167:MB4|00000000 3168:MB4|00000000 3169:MB4|00000000 3170:MB4|00000000 3171:MB4|00000000 3172:MB4|00000000 3173:MB4|00000000 3174:MB4|00000000 3175:MB4|00000000 3176:MB4|00000000 3177:MB4|00000000 3178:MB4|00000000 3179:MB4|00000000 3180:MB4|00000000 3181:MB4|00000000 3182:MB4|00000000 3183:MB4|00000000 3184:MB4|00000000 3185:MB4|00000000 3186:MB4|00000000 3187:MB4|00000000 3188:MB4|00000000 3189:MB4|00000000 3190:MB4|00000000 3191:MB4|00000000 3192:MB4|00000000 3193:MB4|00000000 3194:MB4|00000000 3195:MB4|00000000 3196:MB4|00000000 3197:MB4|00000000 3198:MB4|00000000 3199:MB4|00000000 3200:MB4|00000000 3201:MB4|00000000 3202:MB4|00000000 3203:MB4|00000000 3204:MB4|00000000 3205:MB4|00000000 3206:MB4|00000000 3207:MB4|00000000 3208:MB4|00000000 3209:MB4|00000000 3210:MB4|00000000 3211:MB4|00000000 3212:MB4|00000000 3213:MB4|00000000 3214:MB4|00000000 3215:MB4|00000000 3216:MB4|00000000 3217:MB4|00000000 3218:MB4|00000000 3219:MB4|00000000 3220:MB4|00000000 3221:MB4|00000000 3222:MB4|00000000 3223:MB4|00000000 3224:MB4|00000000 3225:MB4|00000000 3226:MB4|00000000 3227:MB4|00000000 3228:MB4|00000000 3229:MB4|00000000 3230:MB4|00000000 3231:MB4|00000000 3232:MB4|00000000 3233:MB4|00000000 3234:MB4|00000000 3235:MB4|00000000 3236:MB4|00000000 3237:MB4|00000000 3238:MB4|00000000 3239:MB4|00000000 3240:MB4|00000000 3241:MB4|00000000 3242:MB4|00000000 3243:MB4|00000000 3244:MB4|00000000 3245:MB4|00000000 3246:MB4|00000000 3247:MB4|00000000 3248:MB4|00000000 3249:MB4|00000000 3250:MB4|00000000 3251:MB4|00000000 3252:MB4|00000000 3253:MB4|00000000 3254:MB4|00000000 3255:MB4|00000000 3256:MB4|00000000 3257:MB4|00000000 3258:MB4|00000000 3259:MB4|00000000 3260:MB4|00000000 3261:MB4|00000000 3262:MB4|00000000 3263:MB4|00000000 3264:MB4|00000000 3265:MB4|00000000 3266:MB4|00000000 3267:MB4|00000000 3268:MB4|00000000 3269:MB4|00000000 3270:MB4|00000000 3271:MB4|00000000 3272:MB4|00000000 3273:MB4|00000000 3274:MB4|00000000 3275:MB4|00000000 3276:MB4|00000000 3277:MB4|00000000 3278:MB4|00000000 3279:MB4|00000000 3280:MB4|00000000 3281:MB4|00000000 3282:MB4|00000000 3283:MB4|00000000 3284:MB4|00000000 3285:MB4|00000000 3286:MB4|00000000 3287:MB4|00000000 3288:MB4|00000000 3289:MB4|00000000 3290:MB4|00000000 3291:MB4|00000000 3292:MB4|00000000 3293:MB4|00000000 3294:MB4|00000000 3295:MB4|00000000 3296:MB4|00000000 3297:MB4|00000000 3298:MB4|00000000 3299:MB4|00000000 3300:MB4|00000000 3301:MB4|00000000 3302:MB4|00000000 3303:MB4|00000000 3304:MB4|00000000 3305:MB4|00000000 3306:MB4|00000000 3307:MB4|00000000 3308:MB4|00000000 3309:MB4|00000000 3310:MB4|00000000 3311:MB4|00000000 3312:MB4|00000000 3313:MB4|00000000 3314:MB4|00000000 3315:MB4|00000000 3316:MB4|00000000 3317:MB4|00000000 3318:MB4|00000000 3319:MB4|00000000 3320:MB4|00000000 3321:MB4|00000000 3322:MB4|00000000 3323:MB4|00000000 3324:MB4|00000000 3325:MB4|00000000 3326:MB4|00000000 3327:MB4|00000000 3328:MB4|00000000 3329:MB4|00000000 3330:MB4|00000000 3331:MB4|00000000 3332:MB4|00000000 3333:MB4|00000000 3334:MB4|00000000 3335:MB4|00000000 3336:MB4|00000000 3337:MB4|00000000 3338:MB4|00000000 3339:MB4|00000000 3340:MB4|00000000 3341:MB4|00000000 3342:MB4|00000000 3343:MB4|00000000 3344:MB4|00000000 3345:MB4|00000000 3346:MB4|00000000 3347:MB4|00000000 3348:MB4|00000000 3349:MB4|00000000 3350:MB4|00000000 3351:MB4|00000000 3352:MB4|00000000 3353:MB4|00000000 3354:MB4|00000000 3355:MB4|00000000 3356:MB4|00000000 3357:MB4|00000000 3358:MB4|00000000 3359:MB4|00000000 3360:MB4|00000000 3361:MB4|00000000 3362:MB4|00000000 3363:MB4|00000000 3364:MB4|00000000 3365:MB4|00000000 3366:MB4|00000000 3367:MB4|00000000 3368:MB4|00000000 3369:MB4|00000000 3370:MB4|00000000 3371:MB4|00000000 3372:MB4|00000000 3373:MB4|00000000 3374:MB4|00000000 3375:MB4|00000000 3376:MB4|00000000 3377:MB4|00000000 3378:MB4|00000000 3379:MB4|00000000 3380:MB4|00000000 3381:MB4|00000000 3382:MB4|00000000 3383:MB4|00000000 3384:MB4|00000000 3385:MB4|00000000 3386:MB4|00000000 3387:MB4|00000000 3388:MB4|00000000 3389:MB4|00000000 3390:MB4|00000000 3391:MB4|00000000 3392:MB4|00000000 3393:MB4|00000000 3394:MB4|00000000 3395:MB4|00000000 3396:MB4|00000000 3397:MB4|00000000 3398:MB4|00000000 3399:MB4|00000000 3400:MB4|00000000 3401:MB4|00000000 3402:MB4|00000000 3403:MB4|00000000 3404:MB4|00000000 3405:MB4|00000000 3406:MB4|00000000 3407:MB4|00000000 3408:MB4|00000000 3409:MB4|00000000 3410:MB4|00000000 3411:MB4|00000000 3412:MB4|00000000 3413:MB4|00000000 3414:MB4|00000000 3415:MB4|00000000 3416:MB4|00000000 3417:MB4|00000000 3418:MB4|00000000 3419:MB4|00000000 3420:MB4|00000000 3421:MB4|00000000 3422:MB4|00000000 3423:MB4|00000000 3424:MB4|00000000 3425:MB4|00000000 3426:MB4|00000000 3427:MB4|00000000 3428:MB4|00000000 3429:MB4|00000000 3430:MB4|00000000 3431:MB4|00000000 3432:MB4|00000000 3433:MB4|00000000 3434:MB4|00000000 3435:MB4|00000000 3436:MB4|00000000 3437:MB4|00000000 3438:MB4|00000000 3439:MB4|00000000 3440:MB4|00000000 3441:MB4|00000000 3442:MB4|00000000 3443:MB4|00000000 3444:MB4|00000000 3445:MB4|00000000 3446:MB4|00000000 3447:MB4|00000000 3448:MB4|00000000 3449:MB4|00000000 3450:MB4|00000000 3451:MB4|00000000 3452:MB4|00000000 3453:MB4|00000000 3454:MB4|00000000 3455:MB4|00000000 3456:MB4|00000000 3457:MB4|00000000 3458:MB4|00000000 3459:MB4|00000000 3460:MB4|00000000 3461:MB4|00000000 3462:MB4|00000000 3463:MB4|00000000 3464:MB4|00000000 3465:MB4|00000000 3466:MB4|00000000 3467:MB4|00000000 3468:MB4|00000000 3469:MB4|00000000 3470:MB4|00000000 3471:MB4|00000000 3472:MB4|00000000 3473:MB4|00000000 3474:MB4|00000000 3475:MB4|00000000 3476:MB4|00000000 3477:MB4|00000000 3478:MB4|00000000 3479:MB4|00000000 3480:MB4|00000000 3481:MB4|00000000 3482:MB4|00000000 3483:MB4|00000000 3484:MB4|00000000 3485:MB4|00000000 3486:MB4|00000000 3487:MB4|00000000 3488:MB4|00000000 3489:MB4|00000000 3490:MB4|00000000 3491:MB4|00000000 3492:MB4|00000000 3493:MB4|00000000 3494:MB4|00000000 3495:MB4|00000000 3496:MB4|00000000 3497:MB4|00000000 3498:MB4|00000000 3499:MB4|00000000 3500:MB4|00000000 3501:MB4|00000000 3502:MB4|00000000 3503:MB4|00000000 3504:MB4|00000000 3505:MB4|00000000 3506:MB4|00000000 3507:MB4|00000000 3508:MB4|00000000 3509:MB4|00000000 3510:MB4|00000000 3511:MB4|00000000 3512:MB4|00000000 3513:MB4|00000000 3514:MB4|00000000 3515:MB4|00000000 3516:MB4|00000000 3517:MB4|00000000 3518:MB4|00000000 3519:MB4|00000000 3520:MB4|00000000 3521:MB4|00000000 3522:MB4|00000000 3523:MB4|00000000 3524:MB4|00000000 3525:MB4|00000000 3526:MB4|00000000 3527:MB4|00000000 3528:MB4|00000000 3529:MB4|00000000 3530:MB4|00000000 3531:MB4|00000000 3532:MB4|00000000 3533:MB4|00000000 3534:MB4|00000000 3535:MB4|00000000 3536:MB4|00000000 3537:MB4|00000000 3538:MB4|00000000 3539:MB4|00000000 3540:MB4|00000000 3541:MB4|00000000 3542:MB4|00000000 3543:MB4|00000000 3544:MB4|00000000 3545:MB4|00000000 3546:MB4|00000000 3547:MB4|00000000 3548:MB4|00000000 3549:MB4|00000000 3550:MB4|00000000 3551:MB4|00000000 3552:MB4|00000000 3553:MB4|00000000 3554:MB4|00000000 3555:MB4|00000000 3556:MB4|00000000 3557:MB4|00000000 3558:MB4|00000000 3559:MB4|00000000 3560:MB4|00000000 3561:MB4|00000000 3562:MB4|00000000 3563:MB4|00000000 3564:MB4|00000000 3565:MB4|00000000 3566:MB4|00000000 3567:MB4|00000000 3568:MB4|00000000 3569:MB4|00000000 3570:MB4|00000000 3571:MB4|00000000 3572:MB4|00000000 3573:MB4|00000000 3574:MB4|00000000 3575:MB4|00000000 3576:MB4|00000000 3577:MB4|00000000 3578:MB4|00000000 3579:MB4|00000000 3580:MB4|00000000 3581:MB4|00000000 3582:MB4|00000000 3583:MB4|00000000 3584:MB4|00000000 3585:MB4|00000000 3586:MB4|00000000 3587:MB4|00000000 3588:MB4|00000000 3589:MB4|00000000 3590:MB4|00000000 3591:MB4|00000000 3592:MB4|00000000 3593:MB4|00000000 3594:MB4|00000000 3595:MB4|00000000 3596:MB4|00000000 3597:MB4|00000000 3598:MB4|00000000 3599:MB4|00000000 3600:MB4|00000000 3601:MB4|00000000 3602:MB4|00000000 3603:MB4|00000000 3604:MB4|00000000 3605:MB4|00000000 3606:MB4|00000000 3607:MB4|00000000 3608:MB4|00000000 3609:MB4|00000000 3610:MB4|00000000 3611:MB4|00000000 3612:MB4|00000000 3613:MB4|00000000 3614:MB4|00000000 3615:MB4|00000000 3616:MB4|00000000 3617:MB4|00000000 3618:MB4|00000000 3619:MB4|00000000 3620:MB4|00000000 3621:MB4|00000000 3622:MB4|00000000 3623:MB4|00000000 3624:MB4|00000000 3625:MB4|00000000 3626:MB4|00000000 3627:MB4|00000000 3628:MB4|00000000 3629:MB4|00000000 3630:MB4|00000000 3631:MB4|00000000 3632:MB4|00000000 3633:MB4|00000000 3634:MB4|00000000 3635:MB4|00000000 3636:MB4|00000000 3637:MB4|00000000 3638:MB4|00000000 3639:MB4|00000000 3640:MB4|00000000 3641:MB4|00000000 3642:MB4|00000000 3643:MB4|00000000 3644:MB4|00000000 3645:MB4|00000000 3646:MB4|00000000 3647:MB4|00000000 3648:MB4|00000000 3649:MB4|00000000 3650:MB4|00000000 3651:MB4|00000000 3652:MB4|00000000 3653:MB4|00000000 3654:MB4|00000000 3655:MB4|00000000 3656:MB4|00000000 3657:MB4|00000000 3658:MB4|00000000 3659:MB4|00000000 3660:MB4|00000000 3661:MB4|00000000 3662:MB4|00000000 3663:MB4|00000000 3664:MB4|00000000 3665:MB4|00000000 3666:MB4|00000000 3667:MB4|00000000 3668:MB4|00000000 3669:MB4|00000000 3670:MB4|00000000 3671:MB4|00000000 3672:MB4|00000000 3673:MB4|00000000 3674:MB4|00000000 3675:MB4|00000000 3676:MB4|00000000 3677:MB4|00000000 3678:MB4|00000000 3679:MB4|00000000 3680:MB4|00000000 3681:MB4|00000000 3682:MB4|00000000 3683:MB4|00000000 3684:MB4|00000000 3685:MB4|00000000 3686:MB4|00000000 3687:MB4|00000000 3688:MB4|00000000 3689:MB4|00000000 3690:MB4|00000000 3691:MB4|00000000 3692:MB4|00000000 3693:MB4|00000000 3694:MB4|00000000 3695:MB4|00000000 3696:MB4|00000000 3697:MB4|00000000 3698:MB4|00000000 3699:MB4|00000000 3700:MB4|00000000 3701:MB4|00000000 3702:MB4|00000000 3703:MB4|00000000 3704:MB4|00000000 3705:MB4|00000000 3706:MB4|00000000 3707:MB4|00000000 3708:MB4|00000000 3709:MB4|00000000 3710:MB4|00000000 3711:MB4|00000000 3712:MB4|00000000 3713:MB4|00000000 3714:MB4|00000000 3715:MB4|00000000 3716:MB4|00000000 3717:MB4|00000000 3718:MB4|00000000 3719:MB4|00000000 3720:MB4|00000000 3721:MB4|00000000 3722:MB4|00000000 3723:MB4|00000000 3724:MB4|00000000 3725:MB4|00000000 3726:MB4|00000000 3727:MB4|00000000 3728:MB4|00000000 3729:MB4|00000000 3730:MB4|00000000 3731:MB4|00000000 3732:MB4|00000000 3733:MB4|00000000 3734:MB4|00000000 3735:MB4|00000000 3736:MB4|00000000 3737:MB4|00000000 3738:MB4|00000000 3739:MB4|00000000 3740:MB4|00000000 3741:MB4|00000000 3742:MB4|00000000 3743:MB4|00000000 3744:MB4|00000000 3745:MB4|00000000 3746:MB4|00000000 3747:MB4|00000000 3748:MB4|00000000 3749:MB4|00000000 3750:MB4|00000000 3751:MB4|00000000 3752:MB4|00000000 3753:MB4|00000000 3754:MB4|00000000 3755:MB4|00000000 3756:MB4|00000000 3757:MB4|00000000 3758:MB4|00000000 3759:MB4|00000000 3760:MB4|00000000 3761:MB4|00000000 3762:MB4|00000000 3763:MB4|00000000 3764:MB4|00000000 3765:MB4|00000000 3766:MB4|00000000 3767:MB4|00000000 3768:MB4|00000000 3769:MB4|00000000 3770:MB4|00000000 3771:MB4|00000000 3772:MB4|00000000 3773:MB4|00000000 3774:MB4|00000000 3775:MB4|00000000 3776:MB4|00000000 3777:MB4|00000000 3778:MB4|00000000 3779:MB4|00000000 3780:MB4|00000000 3781:MB4|00000000 3782:MB4|00000000 3783:MB4|00000000 3784:MB4|00000000 3785:MB4|00000000 3786:MB4|00000000 3787:MB4|00000000 3788:MB4|00000000 3789:MB4|00000000 3790:MB4|00000000 3791:MB4|00000000 3792:MB4|00000000 3793:MB4|00000000 3794:MB4|00000000 3795:MB4|00000000 3796:MB4|00000000 3797:MB4|00000000 3798:MB4|00000000 3799:MB4|00000000 3800:MB4|00000000 3801:MB4|00000000 3802:MB4|00000000 3803:MB4|00000000 3804:MB4|00000000 3805:MB4|00000000 3806:MB4|00000000 3807:MB4|00000000 3808:MB4|00000000 3809:MB4|00000000 3810:MB4|00000000 3811:MB4|00000000 3812:MB4|00000000 3813:MB4|00000000 3814:MB4|00000000 3815:MB4|00000000 3816:MB4|00000000 3817:MB4|00000000 3818:MB4|00000000 3819:MB4|00000000 3820:MB4|00000000 3821:MB4|00000000 3822:MB4|00000000 3823:MB4|00000000 3824:MB4|00000000 3825:MB4|00000000 3826:MB4|00000000 3827:MB4|00000000 3828:MB4|00000000 3829:MB4|00000000 3830:MB4|00000000 3831:MB4|00000000 3832:MB4|00000000 3833:MB4|00000000 3834:MB4|00000000 3835:MB4|00000000 3836:MB4|00000000 3837:MB4|00000000 3838:MB4|00000000 3839:MB4|00000000 3840:MB4|00000000 3841:MB4|00000000 3842:MB4|00000000 3843:MB4|00000000 3844:MB4|00000000 3845:MB4|00000000 3846:MB4|00000000 3847:MB4|00000000 3848:MB4|00000000 3849:MB4|00000000 3850:MB4|00000000 3851:MB4|00000000 3852:MB4|00000000 3853:MB4|00000000 3854:MB4|00000000 3855:MB4|00000000 3856:MB4|00000000 3857:MB4|00000000 3858:MB4|00000000 3859:MB4|00000000 3860:MB4|00000000 3861:MB4|00000000 3862:MB4|00000000 3863:MB4|00000000 3864:MB4|00000000 3865:MB4|00000000 3866:MB4|00000000 3867:MB4|00000000 3868:MB4|00000000 3869:MB4|00000000 3870:MB4|00000000 3871:MB4|00000000 3872:MB4|00000000 3873:MB4|00000000 3874:MB4|00000000 3875:MB4|00000000 3876:MB4|00000000 3877:MB4|00000000 3878:MB4|00000000 3879:MB4|00000000 3880:MB4|00000000 3881:MB4|00000000 3882:MB4|00000000 3883:MB4|00000000 3884:MB4|00000000 3885:MB4|00000000 3886:MB4|00000000 3887:MB4|00000000 3888:MB4|00000000 3889:MB4|00000000 3890:MB4|00000000 3891:MB4|00000000 3892:MB4|00000000 3893:MB4|00000000 3894:MB4|00000000 3895:MB4|00000000 3896:MB4|00000000 3897:MB4|00000000 3898:MB4|00000000 3899:MB4|00000000 3900:MB4|00000000 3901:MB4|00000000 3902:MB4|00000000 3903:MB4|00000000 3904:MB4|00000000 3905:MB4|00000000 3906:MB4|00000000 3907:MB4|00000000 3908:MB4|00000000 3909:MB4|00000000 3910:MB4|00000000 3911:MB4|00000000 3912:MB4|00000000 3913:MB4|00000000 3914:MB4|00000000 3915:MB4|00000000 3916:MB4|00000000 3917:MB4|00000000 3918:MB4|00000000 3919:MB4|00000000 3920:MB4|00000000 3921:MB4|00000000 3922:MB4|00000000 3923:MB4|00000000 3924:MB4|00000000 3925:MB4|00000000 3926:MB4|00000000 3927:MB4|00000000 3928:MB4|00000000 3929:MB4|00000000 3930:MB4|00000000 3931:MB4|00000000 3932:MB4|00000000 3933:MB4|00000000 3934:MB4|00000000 3935:MB4|00000000 3936:MB4|00000000 3937:MB4|00000000 3938:MB4|00000000 3939:MB4|00000000 3940:MB4|00000000 3941:MB4|00000000 3942:MB4|00000000 3943:MB4|00000000 3944:MB4|00000000 3945:MB4|00000000 3946:MB4|00000000 3947:MB4|00000000 3948:MB4|00000000 3949:MB4|00000000 3950:MB4|00000000 3951:MB4|00000000 3952:MB4|00000000 3953:MB4|00000000 3954:MB4|00000000 3955:MB4|00000000 3956:MB4|00000000 3957:MB4|00000000 3958:MB4|00000000 3959:MB4|00000000 3960:MB4|00000000 3961:MB4|00000000 3962:MB4|00000000 3963:MB4|00000000 3964:MB4|00000000 3965:MB4|00000000 3966:MB4|00000000 3967:MB4|00000000 3968:MB4|00000000 3969:MB4|00000000 3970:MB4|00000000 3971:MB4|00000000 3972:MB4|00000000 3973:MB4|00000000 3974:MB4|00000000 3975:MB4|00000000 3976:MB4|00000000 3977:MB4|00000000 3978:MB4|00000000 3979:MB4|00000000 3980:MB4|00000000 3981:MB4|00000000 3982:MB4|00000000 3983:MB4|00000000 3984:MB4|00000000 3985:MB4|00000000 3986:MB4|00000000 3987:MB4|00000000 3988:MB4|00000000 3989:MB4|00000000 3990:MB4|00000000 3991:MB4|00000000 3992:MB4|00000000 3993:MB4|00000000 3994:MB4|00000000 3995:MB4|00000000 3996:MB4|00000000 3997:MB4|00000000 3998:MB4|00000000 3999:MB4|00000000 4000:MB4|00000000 4001:MB4|00000000 4002:MB4|00000000 4003:MB4|00000000 4004:MB4|00000000 4005:MB4|00000000 4006:MB4|00000000 4007:MB4|00000000 4008:MB4|00000000 4009:MB4|00000000 4010:MB4|00000000 4011:MB4|00000000 4012:MB4|00000000 4013:MB4|00000000 4014:MB4|00000000 4015:MB4|00000000 4016:MB4|00000000 4017:MB4|00000000 4018:MB4|00000000 4019:MB4|00000000 4020:MB4|00000000 4021:MB4|00000000 4022:MB4|00000000 4023:MB4|00000000 4024:MB4|00000000 4025:MB4|00000000 4026:MB4|00000000 4027:MB4|00000000 4028:MB4|00000000 4029:MB4|00000000 4030:MB4|00000000 4031:MB4|00000000 4032:MB4|00000000 4033:MB4|00000000 4034:MB4|00000000 4035:MB4|00000000 4036:MB4|00000000 4037:MB4|00000000 4038:MB4|00000000 4039:MB4|00000000 4040:MB4|00000000 4041:MB4|00000000 4042:MB4|00000000 4043:MB4|00000000 4044:MB4|00000000 4045:MB4|00000000 4046:MB4|00000000 4047:MB4|00000000 4048:MB4|00000000 4049:MB4|00000000 4050:MB4|00000000 4051:MB4|00000000 4052:MB4|00000000 4053:MB4|00000000 4054:MB4|00000000 4055:MB4|00000000 4056:MB4|00000000 4057:MB4|00000000 4058:MB4|00000000 4059:MB4|00000000 4060:MB4|00000000 4061:MB4|00000000 4062:MB4|00000000 4063:MB4|00000000 4064:MB4|00000000 4065:MB4|00000000 4066:MB4|00000000 4067:MB4|00000000 4068:MB4|00000000 4069:MB4|00000000 4070:MB4|00000000 4071:MB4|00000000 4072:MB4|00000000 4073:MB4|00000000 4074:MB4|00000000 4075:MB4|00000000 4076:MB4|00000000 4077:MB4|00000000 4078:MB4|00000000 4079:MB4|00000000 4080:MB4|00000000 4081:MB4|00000000 4082:MB4|00000000 4083:MB4|00000000 4084:MB4|00000000 4085:MB4|00000000 4086:MB4|00000000 4087:MB4|00000000 4088:MB4|00000000 4089:MB4|00000000 4090:MB4|00000000 4091:MB4|00000000 4092:MB4|00000000 4093:MB4|00000000 4094:MB4|00000000 4095:MB4|00000000 4096:MB4|00000000 4097:MB4|00000000 4098:MB4|00000000 4099:MB4|00000000 4100:MB4|00000000 4101:MB4|00000000 4102:MB4|00000000 4103:MB4|00000000 4104:MB4|00000000 4105:MB4|00000000 4106:MB4|00000000 4107:MB4|00000000 4108:MB4|00000000 4109:MB4|00000000 4110:MB4|00000000 4111:MB4|00000000 4112:MB4|00000000 4113:MB4|00000000 4114:MB4|00000000 4115:MB4|00000000 4116:MB4|00000000 4117:MB4|00000000 4118:MB4|00000000 4119:MB4|00000000 4120:MB4|00000000 4121:MB4|00000000 4122:MB4|00000000 4123:MB4|00000000 4124:MB4|00000000 4125:MB4|00000000 4126:MB4|00000000 4127:MB4|00000000 4128:MB4|00000000 4129:MB4|00000000 4130:MB4|00000000 4131:MB4|00000000 4132:MB4|00000000 4133:MB4|00000000 4134:MB4|00000000 4135:MB4|00000000 4136:MB4|00000000 4137:MB4|00000000 4138:MB4|00000000 4139:MB4|00000000 4140:MB4|00000000 4141:MB4|00000000 4142:MB4|00000000 4143:MB4|00000000 4144:MB4|00000000 4145:MB4|00000000 4146:MB4|00000000 4147:MB4|00000000 4148:MB4|00000000 4149:MB4|00000000 4150:MB4|00000000 4151:MB4|00000000 4152:MB4|00000000 4153:MB4|00000000 4154:MB4|00000000 4155:MB4|00000000 4156:MB4|00000000 4157:MB4|00000000 4158:MB4|00000000 4159:MB4|00000000 4160:MB4|00000000 4161:MB4|00000000 4162:MB4|00000000 4163:MB4|00000000 4164:MB4|00000000 4165:MB4|00000000 4166:MB4|00000000 4167:MB4|00000000 4168:MB4|00000000 4169:MB4|00000000 4170:MB4|00000000 4171:MB4|00000000 4172:MB4|00000000 4173:MB4|00000000 4174:MB4|00000000 4175:MB4|00000000 4176:MB4|00000000 4177:MB4|00000000 4178:MB4|00000000 4179:MB4|00000000 4180:MB4|00000000 4181:MB4|00000000 4182:MB4|00000000 4183:MB4|00000000 4184:MB4|00000000 4185:MB4|00000000 4186:MB4|00000000 4187:MB4|00000000 4188:MB4|00000000 4189:MB4|00000000 4190:MB4|00000000 4191:MB4|00000000 4192:MB4|00000000 4193:MB4|00000000 4194:MB4|00000000 4195:MB4|00000000 4196:MB4|00000000 4197:MB4|00000000 4198:MB4|00000000 4199:MB4|00000000 4200:MB4|00000000 4201:MB4|00000000 4202:MB4|00000000 4203:MB4|00000000 4204:MB4|00000000 4205:MB4|00000000 4206:MB4|00000000 4207:MB4|00000000 4208:MB4|00000000 4209:MB4|00000000 4210:MB4|00000000 4211:MB4|00000000 4212:MB4|00000000 4213:MB4|00000000 4214:MB4|00000000 4215:MB4|00000000 4216:MB4|00000000 4217:MB4|00000000 4218:MB4|00000000 4219:MB4|00000000 4220:MB4|00000000 4221:MB4|00000000 4222:MB4|00000000 4223:MB4|00000000 4224:MB4|00000000 4225:MB4|00000000 4226:MB4|00000000 4227:MB4|00000000 4228:MB4|00000000 4229:MB4|00000000 4230:MB4|00000000 4231:MB4|00000000 4232:MB4|00000000 4233:MB4|00000000 4234:MB4|00000000 4235:MB4|00000000 4236:MB4|00000000 4237:MB4|00000000 4238:MB4|00000000 4239:MB4|00000000 4240:MB4|00000000 4241:MB4|00000000 4242:MB4|00000000 4243:MB4|00000000 4244:MB4|00000000 4245:MB4|00000000 4246:MB4|00000000 4247:MB4|00000000 4248:MB4|00000000 4249:MB4|00000000 4250:MB4|00000000 4251:MB4|00000000 4252:MB4|00000000 4253:MB4|00000000 4254:MB4|00000000 4255:MB4|00000000 4256:MB4|00000000 4257:MB4|00000000 4258:MB4|00000000 4259:MB4|00000000 4260:MB4|00000000 4261:MB4|00000000 4262:MB4|00000000 4263:MB4|00000000 4264:MB4|00000000 4265:MB4|00000000 4266:MB4|00000000 4267:MB4|00000000 4268:MB4|00000000 4269:MB4|00000000 4270:MB4|00000000 4271:MB4|00000000 4272:MB4|00000000 4273:MB4|00000000 4274:MB4|00000000 4275:MB4|00000000 4276:MB4|00000000 4277:MB4|00000000 4278:MB4|00000000 4279:MB4|00000000 4280:MB4|00000000 4281:MB4|00000000 4282:MB4|00000000 4283:MB4|00000000 4284:MB4|00000000 4285:MB4|00000000 4286:MB4|00000000 4287:MB4|00000000 4288:MB4|00000000 4289:MB4|00000000 4290:MB4|00000000 4291:MB4|00000000 4292:MB4|00000000 4293:MB4|00000000 4294:MB4|00000000 4295:MB4|00000000 4296:MB4|00000000 4297:MB4|00000000 4298:MB4|00000000 4299:MB4|00000000 4300:MB4|00000000 4301:MB4|00000000 4302:MB4|00000000 4303:MB4|00000000 4304:MB4|00000000 4305:MB4|00000000 4306:MB4|00000000 4307:MB4|00000000 4308:MB4|00000000 4309:MB4|00000000 4310:MB4|00000000 4311:MB4|00000000 4312:MB4|00000000 4313:MB4|00000000 4314:MB4|00000000 4315:MB4|00000000 4316:MB4|00000000 4317:MB4|00000000 4318:MB4|00000000 4319:MB4|00000000 4320:MB4|00000000 4321:MB4|00000000 4322:MB4|00000000 4323:MB4|00000000 4324:MB4|00000000 4325:MB4|00000000 4326:MB4|00000000 4327:MB4|00000000 4328:MB4|00000000 4329:MB4|00000000 4330:MB4|00000000 4331:MB4|00000000 4332:MB4|00000000 4333:MB4|00000000 4334:MB4|00000000 4335:MB4|00000000 4336:MB4|00000000 4337:MB4|00000000 4338:MB4|00000000 4339:MB4|00000000 4340:MB4|00000000 4341:MB4|00000000 4342:MB4|00000000 4343:MB4|00000000 4344:MB4|00000000 4345:MB4|00000000 4346:MB4|00000000 4347:MB4|00000000 4348:MB4|00000000 4349:MB4|00000000 4350:MB4|00000000 4351:MB4|00000000 4352:MB4|00000000 4353:MB4|00000000 4354:MB4|00000000 4355:MB4|00000000 4356:MB4|00000000 4357:MB4|00000000 4358:MB4|00000000 4359:MB4|00000000 4360:MB4|00000000 4361:MB4|00000000 4362:MB4|00000000 4363:MB4|00000000 4364:MB4|00000000 4365:MB4|00000000 4366:MB4|00000000 4367:MB4|00000000 4368:MB4|00000000 4369:MB4|00000000 4370:MB4|00000000 4371:MB4|00000000 4372:MB4|00000000 4373:MB4|00000000 4374:MB4|00000000 4375:MB4|00000000 4376:MB4|00000000 4377:MB4|00000000 4378:MB4|00000000 4379:MB4|00000000 4380:MB4|00000000 4381:MB4|00000000 4382:MB4|00000000 4383:MB4|00000000 4384:MB4|00000000 4385:MB4|00000000 4386:MB4|00000000 4387:MB4|00000000 4388:MB4|00000000 4389:MB4|00000000 4390:MB4|00000000 4391:MB4|00000000 4392:MB4|00000000 4393:MB4|00000000 4394:MB4|00000000 4395:MB4|00000000 4396:MB4|00000000 4397:MB4|00000000 4398:MB4|00000000 4399:MB4|00000000 4400:MB4|00000000 4401:MB4|00000000 4402:MB4|00000000 4403:MB4|00000000 4404:MB4|00000000 4405:MB4|00000000 4406:MB4|00000000 4407:MB4|00000000 4408:MB4|00000000 4409:MB4|00000000 4410:MB4|00000000 4411:MB4|00000000 4412:MB4|00000000 4413:MB4|00000000 4414:MB4|00000000 4415:MB4|00000000 4416:MB4|00000000 4417:MB4|00000000 4418:MB4|00000000 4419:MB4|00000000 4420:MB4|00000000 4421:MB4|00000000 4422:MB4|00000000 4423:MB4|00000000 4424:MB4|00000000 4425:MB4|00000000 4426:MB4|00000000 4427:MB4|00000000 4428:MB4|00000000 4429:MB4|00000000 4430:MB4|00000000 4431:MB4|00000000 4432:MB4|00000000 4433:MB4|00000000 4434:MB4|00000000 4435:MB4|00000000 4436:MB4|00000000 4437:MB4|00000000 4438:MB4|00000000 4439:MB4|00000000 4440:MB4|00000000 4441:MB4|00000000 4442:MB4|00000000 4443:MB4|00000000 4444:MB4|00000000 4445:MB4|00000000 4446:MB4|00000000 4447:MB4|00000000 4448:MB4|00000000 4449:MB4|00000000 4450:MB4|00000000 4451:MB4|00000000 4452:MB4|00000000 4453:MB4|00000000 4454:MB4|00000000 4455:MB4|00000000 4456:MB4|00000000 4457:MB4|00000000 4458:MB4|00000000 4459:MB4|00000000 4460:MB4|00000000 4461:MB4|00000000 4462:MB4|00000000 4463:MB4|00000000 4464:MB4|00000000 4465:MB4|00000000 4466:MB4|00000000 4467:MB4|00000000 4468:MB4|00000000 4469:MB4|00000000 4470:MB4|00000000 4471:MB4|00000000 4472:MB4|00000000 4473:MB4|00000000 4474:MB4|00000000 4475:MB4|00000000 4476:MB4|00000000 4477:MB4|00000000 4478:MB4|00000000 4479:MB4|00000000 4480:MB4|00000000 4481:MB4|00000000 4482:MB4|00000000 4483:MB4|00000000 4484:MB4|00000000 4485:MB4|00000000 4486:MB4|00000000 4487:MB4|00000000 4488:MB4|00000000 4489:MB4|00000000 4490:MB4|00000000 4491:MB4|00000000 4492:MB4|00000000 4493:MB4|00000000 4494:MB4|00000000 4495:MB4|00000000 4496:MB4|00000000 4497:MB4|00000000 4498:MB4|00000000 4499:MB4|00000000 4500:MB4|00000000 4501:MB4|00000000 4502:MB4|00000000 4503:MB4|00000000 4504:MB4|00000000 4505:MB4|00000000 4506:MB4|00000000 4507:MB4|00000000 4508:MB4|00000000 4509:MB4|00000000 4510:MB4|00000000 4511:MB4|00000000 4512:MB4|00000000 4513:MB4|00000000 4514:MB4|00000000 4515:MB4|00000000 4516:MB4|00000000 4517:MB4|00000000 4518:MB4|00000000 4519:MB4|00000000 4520:MB4|00000000 4521:MB4|00000000 4522:MB4|00000000 4523:MB4|00000000 4524:MB4|00000000 4525:MB4|00000000 4526:MB4|00000000 4527:MB4|00000000 4528:MB4|00000000 4529:MB4|00000000 4530:MB4|00000000 4531:MB4|00000000 4532:MB4|00000000 4533:MB4|00000000 4534:MB4|00000000 4535:MB4|00000000 4536:MB4|00000000 4537:MB4|00000000 4538:MB4|00000000 4539:MB4|00000000 4540:MB4|00000000 4541:MB4|00000000 4542:MB4|00000000 4543:MB4|00000000 4544:MB4|00000000 4545:MB4|00000000 4546:MB4|00000000 4547:MB4|00000000 4548:MB4|00000000 4549:MB4|00000000 4550:MB4|00000000 4551:MB4|00000000 4552:MB4|00000000 4553:MB4|00000000 4554:MB4|00000000 4555:MB4|00000000 4556:MB4|00000000 4557:MB4|00000000 4558:MB4|00000000 4559:MB4|00000000 4560:MB4|00000000 4561:MB4|00000000 4562:MB4|00000000 4563:MB4|00000000 4564:MB4|00000000 4565:MB4|00000000 4566:MB4|00000000 4567:MB4|00000000 4568:MB4|00000000 4569:MB4|00000000 4570:MB4|00000000 4571:MB4|00000000 4572:MB4|00000000 4573:MB4|00000000 4574:MB4|00000000 polyml-5.6/imports/polymlint.txt000066400000000000000000066003261265146633400172140ustar00rootroot00000000000000Objects 14568 Root 267 267:O1|@268 268:D9,228|00801ae3003b1ae3000c00031ae1000e0e0c00027881877881481ad7001ad8000e0c00021ad5002a0e0c00025178810e28133b1aca000e0e0e0c0003050b00ff6d3b1abf000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2f3b64053600ff6d78810e28133b1a92000e0e0e0c0003050b00ff6d3c1a87000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2f3b65503b05070e0e00ff6d3c6478810c28133b1a54000e0c0003050b00ff6d2a1a4b000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2d3b66420e0e0e00000000dc00000000000000|@270,@2,I253,@667,@670,@13449,@269,I150,I1| 269:O3|@14552,@14551,0 270:S24|506f6c794d4c2e72756e46756e6374696f6e283129283129 271:O2|@273,@272 272:O2|@277,@276 273:O2|@274,@14553 274:D2,28|008056073b3b1a17000c0004503b420e000000001400000000000000|@275,I255| 275:S19|466f726569676e4d656d6f72792e5f2d283129 276:O2|@535,@534 277:O1|@278 278:D15,164|00807881413b3b3b1a9d000e0e0c000429352a361a95002a1a95000e0e0c0003293d1a8f000c00032c2a1a8b000c00031a89002a3b6a28072a1a84000e0c0003503b2707054c00ff6d2935280c1a74000e0c000303043b50020229101a69003b1a69000e0e0c0003291a64001a65000e0e0c0003501a50003b1a50000e0c000329392a1a52002b1a52000e0e0e0c00042704420e0e0e0e0e000000009c00000000000000|@280,@281,-1,I244,I243,I242,@289,I73,I251,@14557,I253,@332,@333,@457,@279| 279:O1|@492 280:S20|5369676e616c2e666f726b546872656164283129 281:O1|@282 282:D8,340|00822d291a51010e0e0c00021a4d010e0e0c000207d529352a362a353d1a40010e0c00030309292503511e273b0fca2a353c1a2b010c0003037a2a36293c1a1f010c0003030428060220293b1a11010e0e0c000303033f0211293e1a02010e0e0e0c000303033d02013b29321af5000e0e0c00033128061aee000e0e0e0c0003293b1adb000c0003641ad0000e0c000203041ad700103b503128061ac6000e0e0e0c00032d2b2b1ac600220c0e0e0e7b050c00042a36293b1aa5000e0e0c0003033e2f3c1aa1000e0e0c0003293b1a8f000c0003641a84000e0c000203041a8b00103b502f3c1a7b00020252000c00032b322b1a7a0033020241007b050a0004303c1a5f000c0003303c1a5b000c0003293b1a4b000c0003641a40000e0c000203041a4700103b50303c1a37000c00032c2b2b1a3a00347b050b00046502032d2d6964440e0e0e0e000000004c01000000000000|@284,I105,I218,I251,I242,I243,@283,@281| 283:O4|12,@286,@287,@285 284:S38|5468726561642e5468726561642e6174747273546f576f7264283129636f6e76657274283329 285:O5|@288,216,0,216,0 286:S6|546872656164 287:S53|5468652073616d65206174747269627574652061707065617273206d6f7265207468616e206f6e636520696e20746865206c697374 288:S18|2e2f62617369732f5468726561642e736d6c 289:O1|@290 290:D14,188|00802b3c3b1ab8000e0c0003293b1ab3000c000303781aaf003b1aaf000c0003293c1a9f000c00036403141a9a001a9f000c0002293b1a8b000c00036402013b030d3b3c1a8d000e0e0c000350023d3b3b3b1a83000c000429352a361a7d002a1a7d000e0e0c0003293d1a77000c00032c2a1a73000c00031a71002a3b6a28072a1a6c000e0c0003503b2608021729352a367881092b2d0e0e0c0002050500ff6d3b6426033b2502501ea63b65420e0e00000000b400000000000000|@292,I62,I251,@14554,I253,I71,@293,@281,-1,I244,I243,I242,@291,I73| 291:O1|@296 292:S19|5369676e616c2e736967546872656164283129 293:O1|@294 294:D19,724|00812b03043b5002643b1acb023b1acb020c0003293c1ac7020c00036403033b0222291b204e1abb020c000303033b0213293c1ab2020e0e0e0c0003292502501e363b64641a90021aa1020e0e0c0002293b1a8b020c000303043b50020e3c1a76021a8b020c000326031e61511a84020e0c0001293c1a63020c00032928061a76020e0e0e0c0003293b1a53020c000303033d0223293d1a46020e0e0e0c000303033e0213293f1a36020e0e0e0c00031a49020e0e0c0002293d1a23020c000303043b5002381a2b020c00011a25020e0e0c0001293c1a03020c00031a21022a1a15020e0e0c00033d2a1a17020c00032d3c2b1a12020e0e0e0c000426063b1a0a023b1ad6010e0e0e0c0003293c1acf010c00036403033b0222291b204e1ac3010c000303033b0213293c1aba010e0e0e0c0003292502501e393b64641acc011aa9010e0e0c0002293b1a93010c000303043b50020e3c1ab2011a93010c000326031e64511aa8013b1a70010e0c000329291a9f010c00021a81010e0e0c0002031929352a363f2b1a65010e0e0c000350292503511e243b6502013b641a70013b2b1a63010c0004501a60011a69010e0e0c0002293c1a27010c000303043b5002171a47011a54010e0c0002503d1a3b011a1c010e0c0003501a18010e0c00012d3c1afb000c00030304280602202d3b1aed000e0e0c000303033f02112d3e1ade000e0e0e0c000303033d02013b1ae3000c0001293c1ac3000c00031ae1002a1ad5000e0e0c00032c2a1ad7000c00032e3c2b1ad2000e0e0e0c000450323b1a9e000e0e0e0c000303033c020b323c1a8e000e0e0e0c000303311a97000c0001293e1a77000c0003293b1a77000c0003651a88000e0c0002030d280b3b1a70000e0c00035002023b5002023b501a48001a85000e0e0c0002293c1a43000c000303033b021b1a30001a71000e0e0c0002503d1a23001a380022120e0e7e120003270e430e0e0e0e0e00000000cc02000000000000|@295,@14554,I253,I251,I113,I106,I71,I73,I72,I243,I218,-7,I242,I255,@14556,@14555,I105,I70,I69| 295:S35|5369676e616c2e73696754687265616428312962726f6164436173745765616b283229 296:D2,28|00802b3b1a19002d7e0300030e0e0e0e000000001400000000000000|@297,@293| 297:S38|5369676e616c2e73696754687265616428312962726f6164436173745765616b283129283129 298:O6|@299,@4,@300,@5,@14558,@3 299:O2|4096,@0 300:O14|@302,@303,@307,0,0,@309,0,@310,@318,@322,4096,0,@325,@301 301:O1|@329 302:S6|7374644f7574 303:O1|@304 304:O2|@305,I149 305:D2,28|0080281d56173b1a16002e7b05030004000000001400000000000000|@306,I61| 306:S50|4c696272617279494f537570706f72742e777261704f757446696c654465736372283529746578745072696d57722d283129 307:O2|@308,I149 308:D2,28|0080280756173b1a16002e7b05030004000000001400000000000000|@306,I61| 309:O1|I149 310:O1|@311 311:O2|@312,I149 312:D5,108|00802b352c362d3729362c1a62000e0e0e0c0002030c2c3b1a59000e0e0c000302013b03043b5002041a4c00102b1a3f000c0002030c2b3b1a39000e0e0c000302013b03043b5002041a2c0010292d2d6a280b56672b1a2300330e7b05080004000000006400000000000000|@314,I105,I231,@313,I61| 313:O4|11,@316,0,@315 314:S49|4c696272617279494f537570706f72742e777261704f757446696c65446573637228352977726974654172726179283129 315:O5|@317,153,0,153,0 316:S9|537562736372697074 317:S26|2e2f62617369732f4c696272617279537570706f72742e736d6c 318:O1|@319 319:O2|@320,I149 320:D6,116|00802b352c362d372b1a6c000e0c0002030c2b3b1a65000e0e0c000302013b03043b5002041a5800102a1a4b000c0002030c2a3b1a45000e0e0c000302013b03043b5002041a3800102b3f1a36000e0e0e0c00032a2a2d6a280b56672b1a2800330e0e7b05080004000000006c00000000000000|@321,I105,I231,@313,I239,I61| 321:S50|4c696272617279494f537570706f72742e777261704f757446696c6544657363722835297772697465566563746f72283129 322:O1|@323 323:O2|@324,I149 324:D3,44|0080281c56173b1a26000e0e0e0c0004293b1a1f002e0e0e7e0400030e0e0e0e000000002400000000000000|@306,I61,I233| 325:O1|@326 326:O3|@327,@311,@323 327:D1,36|00803b56180c0002030c2b56170c00022968016402013b42000000001c00000000000000|@328| 328:S40|5072696d494f28292e6175676d656e7457726974657228312977726974654172724e42272d283129 329:O3|@330,@319,@323 330:D1,36|00803b56180c0002030c2b56170c00022968016402013b42000000001c00000000000000|@331| 331:S40|5072696d494f28292e6175676d656e7457726974657228312977726974655665634e42272d283129 332:S31|556e61626c6520746f20637265617465207369676e616c207468726561640a 333:O1|@334 334:D19,356|00812c3a293b1a5f010c0003293c1a5b010c000307dd2d1a56010e0e0e0c000229293b1a4e010e0e0e0c000303033b0270293c1a42010e0e0e0c0003293b1a3b010c000303033c0210301a23010c00022a2a1a2b010c00036403041a2601103b50301a23010c00020303300214293f1a1a010e0e0e0c0003312a1a13010c00036429401ae6000e0e0e0c000365030329020f293c1ae1000e0e0c000325011e7d3b64293b1acd000e0e0c000303222f1abe000e0e0e0c0002303b2b6a1ad5002a693339342b2b1acf00220d7b050c0004296801303b2b1ac3000c000429352a362b37292c2c6a1ab7002a69220e39220f2b020243002b1a9f000c000450220f3922101a9f002b1a8f000c000450220f333b1a88000e0c000429352a362b37292c2c6a1a83002a6922163922172b2b1a670022197b051800042d1a34000e0c00022e3b2b6a1a65002a693139322b2b1a4700340e7b050a0004000000005c01000000000000|@336,I253,I251,I223,I113,I107,I234,I231,@337,I105,I239,I252,@340,@279,@479,@490,@457,@491,@335| 335:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@342,@341| 336:S29|54657874494f2e5465787453747265616d494f2e6f7574707574283229 337:O4|11,@316,0,@338 338:O5|@339,680,0,680,0 339:S18|2e2f62617369732f537472696e672e736d6c 340:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@342,@341| 341:O1|@343 342:S34|426173696353747265616d494f28292e6f7574707574566563746f72283129283129 343:D12,172|00812c3729352e38293b1aa3000c0003293c1a9f000c000303152b1a9a001a9b006a1a9b001a9c002b1a9c006b64103b5030353136323a3235333634372e352a2a1a88000e0c0003031a220e1a81000e0e0c000250220e2d2d2d1a770022117b060f00052d3b1a47000c0003293d1a43000c0003640311220e2d2d2d1a550022110e0e7b060f00053b2f2b2d3030220c22151a430022157b0a0f00090e0e0e0e00000000a400000000000000|@345,I253,I251,@346,@348,@7,@454,@455,I233,@457,@475,@344| 344:O1|@488 345:S31|426173696353747265616d494f28292e6f7574707574566563746f72283229 346:O4|@6,@347,0,0 347:S12|436c6f73656453747265616d 348:S6|6f7574707574 349:O1|@350 350:O1|@351 351:D20,244|00802b363b1af0000e0c000303051aeb0002c72b35362c363c1ae4000e0c00032a2a691ade003b1ade000e0e0e0c00032a2a0e0e0e0c0002642f363c1ab9000e0e0c000303051ac30002762f353730363c1aac000e0c00032a2a691ab2003b1aa6000e0e0e0c00032a2a0e0e0e0c00026433353534363c1a86000e0e0e0c00032a2a691a8a003b1a7e000e0e0e0c00032a2a0e0e0e0c000264291a7700691a77002a691a76002a691a75002a691a74002a69322a691a70002a691a6f002a69270f1a6c002a691a6b002a692c2a691a67002a691a66002a6927091a63002a693b3c3b3b2d6805654200000000ec00000000000000|@353,I234,@354,I107,@8,I253,@354,@9,@446,@441,@448,@441,@442,@441,@450,@441,@442,@441,@452,@352| 352:O2|3,123 353:S14|7072696e742d6c6162656c6c6564 354:O2|@355,0 355:O2|3,@356 356:S4|2e2e2e7d 357:O1|@358 358:D2,36|00802b362c35293b2c1a1c00300e0e7b050500040e0e0e0e000000001c00000000000000|@360,@359| 359:O1|@361 360:S7|61646450502d31 361:D25,1980|00822d352e362f372b1ab4070e0c000207d330353d1aac070e0c000307c930372f3c1aa3070c000303051a9f07028b2f3c1a9c070e0c0003293b1a97070c000303051a930702662a352a3c1a82070e0e0e0c00032a2a691a82073b1a82070e0e0e0c00032a2a0e0e0e0c0002642e362e3c1a5c070e0c00032a2a691a66073b1a5e070e0e0e0c00031a5d072a0e0c0002642a2a0e0e0c000264291a4f07691a4f072a691a4e072a69302a69270b1a48072a693b3c3b3b2d68056629353b1a04070e0c000303aa2939291af4060e0c00021a29070e0e0c0002038129352a36293b1ae1060204bb05a0000c000303032c02672a353e1acd060e0e0c000303482a3629285b1abe060e0e0e0c000303032d023229287b1aad060e0e0c000303032d02222928281a9d060e0e0c000303032d02122d1acb06691acb062a693b3e3c3b2d6805656402122c1abe06691abe062a693b3e3c3b2d6805656502122a1ab106691ab1062a693b3e3c3b2d68056564020129293b691aa1062a691aa0062a693b3c3b3b2d680527060fdd3035401a35060e0e0c000307de30372f3c1a33060c00032a2a691a36063b1a36060e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a02060e0e0e0c000303ac2a39291af0050e0c00021a25060e0e0c0002037d29352a36293b1add050e0e0c000303032d02672a353e1acd050e0e0c000303482a3629285b1abe050e0e0e0c000303032e023229287b1aad050e0e0c000303032e02222928281a9d050e0e0c000303032e02122e1acb05691acb052a693b3e3c3b2d6805656402122d1abe05691abe052a693b3e3c3b2d6805656502162b1ab105691ab1052a02023804693b3e3c3b2d68056564020317002a293b691a9b052a692c2a693b3c3b3b2d680527090fdd3035280c1a30050e0c000307de30372f3c1a2f050c00032a2a691a32053b1a32050e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1afe040e0e0e0c000303ac2a39291aec040e0c00021a21050e0e0c0002037d29352a36293b1ad9040e0e0c000303032d02672a353e1ac9040e0e0c000303482a3629285b1aba040e0e0e0c000303032e023229287b1aa9040e0e0c000303032e02222928281a99040e0e0c000303032e02122e1ac704691ac7042a693b3e3c3b2d6805656402122d1aba04691aba042a693b3e3c3b2d6805656502162b1aad04691aad042a02023403693b3e3c3b2d68056564020317002a293b691a97042a692c2a693b3c3b3b2d680527090fdd303528171a2c040e0c000307de30372f3c1a2b040c00032a2a691a2e043b1a2e040e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1afa030e0e0e0c000303ac2a39291ae8030e0c00021a1d040e0e0c0002037d29352a36293b1ad5030e0e0c000303032d02672a353e1ac5030e0e0c000303482a3629285b1ab6030e0e0e0c000303032e023229287b1aa5030e0e0c000303032e02222928281a95030e0e0c000303032e02122e1ac303691ac3032a693b3e3c3b2d6805656402122d1ab603691ab6032a693b3e3c3b2d6805656502162b1aa903691aa9032a02023002693b3e3c3b2d68056564020317002a293b691a93032a692c2a693b3c3b3b2d680527090fdd303528671a28030e0c000307de30372f3c1a27030c00032a2a691a2a033b1a2a030e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1af6020e0e0e0c000303ac2a39291ae4020e0c00021a19030e0e0c0002037d29352a36293b1ad1020e0e0c000303032d02672a353e1ac1020e0e0c000303482a3629285b1ab2020e0e0e0c000303032e023229287b1aa1020e0e0c000303032e02222928281a91020e0e0c000303032e02122e1abf02691abf022a693b3e3c3b2d6805656402122d1ab202691ab2022a693b3e3c3b2d6805656502162b1aa502691aa5022a02022c01693b3e3c3b2d68056564020317002a293b691a8f022a692c2a693b3c3b3b2d680527090fdd303528081a24020e0c000307de30372f3c1a23020c00032a2a691a26023b1a26020e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1af2010e0e0e0c000303ac2a39291ae0010e0c00021a15020e0e0c0002037d29352a36293b1acd010e0e0c000303032d02672a353e1abd010e0e0c000303482a3629285b1aae010e0e0e0c000303032e023229287b1a9d010e0e0c000303032e02222928281a8d010e0e0c000303032e02122e1abb01691abb012a693b3e3c3b2d6805656402122d1aae01691aae012a693b3e3c3b2d6805656502162b1aa101691aa1012a02022800693b3e3c3b2d68056564020317002a293b691a8b012a692c2a693b3c3b3b2d6805270902033e2b690fdd2b3b1a39010e0e0c0003291a10010e0c00021a45010e0e0c000207dd2935303c1a0b010c00032c2a69642a0c00023e2e692a353b1aeb000c000303aa2a39291adc000e0c00021a11010e0e0c0002037d29352a36293b1ac9000e0e0c000303032d02672a353e1ab9000e0e0c000303482a3629285b1aaa000e0e0e0c000303032e023229287b1a99000e0e0c000303032e02222928281a89000e0e0c000303032e02122e1ab700691ab7002a693b3e3c3b2d6805656402122d1aaa00691aaa002a693b3e3c3b2d6805656502162b1a9d00691a9d002a693b3e3c3b020226002d6805656402012a293b691a89002a692c2a693b3c3b3b2d020206006805270702033e2c696466440e0e0e0e0e0e0e00000000b407000000000000|@363,I105,I251,I232,@364,I107,I234,@366,@9,I253,@11,@433,@439,@441,@442,@443,I218,@439,@443,@439,@443,@439,@443,@444,@362| 362:O2|3,@445 363:S11|65786e5072696e74283329 364:O2|3,@365 365:S3|2e2e2e 366:O2|@367,0 367:O2|3,@368 368:S4|2e2e2e29 369:O1|@370 370:D5,52|00802b35291a30001a31000e0e0c0003291a2c006928222a69651a27000c00023e2a6965420e0e0e000000002c00000000000000|@360,@372,@397,@402,@371| 371:O1|@403 372:O1|@373 373:D20,316|00802b285c1a38010e0c000303051a33010fcc2b28221a27010c000303051a27010fce28212c1a23010c0003030c2b287e1a18010e0c000302013b03033c020c2b28201afa000e0e0e0c000303032b0fd02b28071ae9000e0e0c000303051aef0002c52b28081ad7000c000303051ae30002b52b28091ac7000c000303051ad70002a52b401ab8000e0c000303051acb0002952b280b1aa7000c000303051abf0002852b280c1a97000c000303051ab30002752b280d1a87000c000303051aa70002652b28201aa3000c0003033e2b28401a9c000e0c0003293b1a9700020247000c000303033c020f2928ff1a8900020235000e0e0c000303041a7f00103b501a7d002a1a7d002e7e0400032b3e401a76000e0e0e0c0004285c2a1a66002e020205000e7e040003420e0e0e0e0e0e0e000000003401000000000000|@375,I251,@376,@377,I248,@378,@379,@380,@381,@382,@383,@384,I250,I106,I234,I233,@385,@388,@389,@374| 374:O1|@395 375:S16|436861722e746f537472696e67283129 376:S2|5c5c 377:S2|5c22 378:S2|5c61 379:S2|5c62 380:S2|5c74 381:S2|5c6e 382:S2|5c76 383:S2|5c66 384:S2|5c72 385:O4|@10,@387,0,@386 386:O5|@339,268,0,268,0 387:S3|436872 388:S2|5c5e 389:O1|@390 390:D14,260|00812c1a02010e0e0e0c00022c1af8000e0c00022a3b1af3000c000303032d0fca293b1ae6000e0e0e0c000303032e02c32a2a1ada000e0e0e0c00032928081ace000e0e0e0c0003293c1ac7000c0003293f1ac3000c0003291ac0001ac1000e0e0c000303041abb00103b502928413b1ab5000e0e0c0004292e1aaf000c0003502f3c1a86000e0e0e0c0003030d293f220c1a9b000c000450020e333f2b3f331a91000e0e0c0006502e3c1a5e000e0e0e0c000303193f301a55000e0e0c00032a2a220c1a69000e0e0c00045102163f301a3c000e0c0003333f2c2c331a54000e0c000651291a4f00020207000c00025029270565430e0e00000000fc00000000000000|@392,I223,I251,I239,I240,I241,16777215,I247,@391,I11,I151,I254,I198,I47| 391:O4|4,@394,0,@393 392:S4|5e283229 393:O5|@317,182,0,182,0 394:S4|53697a65 395:D14,260|00822c3b1a01010e0e0c000303051afb000fda2c3c1af8000e0c00032e3b1af3000c00032d3b1aeb000c00032a2a1ae7000c000303033002282903132e3c1acf000c0003312a1ac7000c00036402122e3c1ac8000e0c0003312a1ab3000c00036429301aba000e0e0e0c0003292e321ab2000e0e0e0c000433321aab000c0003293b1a83000c000303033c021c323b1a82000e0e0e0c00032a3b1a77000c00032a2a1a73000c000365030329020a29331a69000e0e0c00032928301a5e000e0e0e0c0003293b1a63000c000303033c020b2928ff1a59000e0e0c000303041a5300103b502c2a1a4f00220d020205000e7e0e0003440e0e0e00000000fc00000000000000|@396,I113,I48,I107,I231,I251,I106,I109,@374,I110,I234,I233,@385,@389| 396:S18|436861722e6f6374496e7452657072283329 397:O1|@398 398:D19,380|00812c1a7a010e0e0e0c0002293c1a73010c0003030a2d2d2d0e0e0e7d0500023b3b292c1a5d010e0e0c000303032a023f293c1a52010e0e0e0c00032a3f1a47010c0003312a1a43010c000364300e0e0e0c00021a29010e0e0c00022c2a1a2f010c0003292c2505250526031e4a3b6665291a1f010c0002030c293b1a19010e0e0c000302013b03043b5002041a0c0110292b1aee000e0e0e0c000303032e02cb2928081ae1000e0e0c0003293c1aef000c0003293f1aeb000c0003291ae8001ae9000e0e0c000303041ae300103b502928413b1add000e0e0c0004292e1ad7000c0003503f3b29311a98000e0c000303043b50026a293f1a8d000e0e0c0003220c2a1a86000e0e0e0c000364340e0e0e0c0002291a68000e0c0002293c1a63000c0003030d2d2d2c1a90000e0c000450020e2a3f2f2f2d1a85000e0e0c0006502b3c1a42000e0e0e0c00032d2b1a37000c0003292b2506250626041e75260451291a5f000c00025029270465430e0e000000007401000000000000|@400,I223,I251,I239,I252,I106,I105,I231,@399,I240,I241,16777215,I247,@391,I11,I151,I254,I198,I47| 399:O4|4,@394,0,@401 400:S19|537472696e672e746f537472696e6773283229 401:O5|@317,148,0,148,0 402:O2|34,0 403:D23,476|00802b1ada010e0e0e0c00021ad5010e0e0c000207d22b352c36293b1ac9010e0e0c000303032a0fd02d3b2a1ab1010e0e0c00021aad010e0e0c000203252a352b362a1aa6010e0e0e0c00022c2a1a9f010c00032b2a2506250626041e313b270402012965293b1a8a010e0e0e0c000303051a83010fce293c1a78010e0c000303602e291a59010e0e0c00021a55010e0e0c000203043b5002041a5f011029352a362a1a52011a3f010c000303033c02222a1a2b010c00021a29010e0e0c000203102a3b1a31013b3f1a34010e0c000602013b0309292503511e563b02012a660fdd291afa000202e2000e0e0e0c00020310293b1a0d010202ce000e0e0c000302013b03043b5002041afc00102928081af9000e0e0c0003293c1af3000c0003293f1aef000c0003291aec001aed000e0e0c000303041ae700103b502928413b1ae100020281000e0e0c0004292e1ad7000c0003503f33291a85000e0e0c00021a81000e0e0c0002034c29352a362a1a7a000e0e0e0c0002293c1a6b000c0003030d2e2e2d1aa4000e0c000450020e2b3f30302d1a99000e0e0c0006502d2a1a6a000e0e0e0c0003292c2506250626041e59260402023b5051291a7700020207000c000250292704646502031a29004200000000d401000000000000|@405,I105,I218,I251,I223,I106,I113,I48,@404,I154,I231,@399,I239,I240,I241,16777215,I247,@391,I11,I151,I254,I198,I47| 404:O4|103,@407,I48,@406 405:S16|537472696e672e636f6e636174283129 406:O5|@339,626,0,626,0 407:S4|4661696c 408:O1|@409 409:D2,20|00801a13002c6942000000000c00000000000000|@411,@410| 410:D14,292|00802b363c1a20010e0c000303051a1b010fde2b35293b1a16010e0e0e0c00036403051a0e010fdd2b363c1afa000e0e0e0c000303051aff0002d75607362c3529352e363c1af4000e0c00032a2a69662a0c00026429353b1ad5000e0e0c000303952939291ad8000e0c00021ad5000e0e0c0002035f29361ac5000e0e0c00021ac1000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1a79000e0e0c000202013b02013b031b2a1a6c00691a6c002a691a6b002a693b3e3c3b2d68056602031f002a64020129293b691a56002a691a550002020b002a693b3c3b3b2d68052705420e0e0e0e0e000000001c01000000000000|@413,I234,@414,I251,@416,@414,I107,I105,I218,@424,@426,@428,@429,@412| 411:S13|7072696e746f7074696f6e2829 412:O5|0,0,0,@418,@430 413:S12|7072696e742d6f7074696f6e 414:O2|3,@415 415:S3|2e2e2e 416:O5|0,0,0,@418,@417 417:O2|@422,0 418:O2|@419,0 419:O2|0,@420 420:O5|@421,0,0,0,0 421:S14|5374616e64617264204261736973 422:O2|3,@423 423:S4|4e4f4e45 424:O2|@426,@425 425:O2|@427,0 426:O3|1,0,0 427:O2|3,41 428:O2|3,40 429:O3|1,1,0 430:O2|@431,0 431:O2|3,@432 432:S4|534f4d45 433:O4|0,@434,3,1 434:O1|@435 435:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@436,@12,I253| 436:S17|7072696e742d4f532e7379736572726f72 437:O1|@438 438:D2,36|00802b353d2a1a1f000c00033e2a6965420e0e0e0e0e0e0e000000001c00000000000000|@360,I150| 439:O2|@440,0 440:O2|3,41 441:O3|1,1,0 442:O2|3,44 443:O2|3,40 444:O3|1,1,1 445:S6|537973457272 446:O2|@447,0 447:O2|3,125 448:O2|3,@449 449:S6|6e616d65203d 450:O2|3,@451 451:S10|66756e6374696f6e203d 452:O2|3,@453 453:S7|6361757365203d 454:S2|496f 455:O5|@456,610,0,610,0 456:S25|2e2f62617369732f426173696353747265616d494f2e736d6c 457:O1|@458 458:D18,292|00802b36293b1a1f010c00032d3729352f352c3b1a15010e0e0c000303033b0fca2b2307291a08010e0c00021a05010e0e0c000203043b5002152b1afa001afb006a1afb001afc002b1afc006b641029352f3b3b1af5000e0e0c0004503b788121312c1aea000e0e0e0c0003296801302e2b1adf000c0004652d0e0e0e0c0002056200ff6d0403002a351ab3001ac8000e0c0003030e2a2a2a35452a36462a37475102302a353c1aae000e0e0e0c000303101aa7002a2a35452a36462a37475102122f2b1a99006a2a1a7400451a7400462a475129352a362b372b2b2b1a84006b270410292b1a7f00020223000c000329321a37000c00036403033b0210292b1a65000e0e0c00032502501ead3b27042705420e0e0e0e0e000000001c01000000000000|@460,I253,I113,I105,I218,@461,@463,@7,@454,@464,I255,I107,@465,I251,@473,@463,@459,I106| 459:O5|@456,501,0,501,0 460:S28|426173696353747265616d494f28292e666c7573684f757427283129 461:O4|@13,@462,0,0 462:S20|426c6f636b696e674e6f74537570706f72746564 463:S8|666c7573684f7574 464:O5|@456,514,0,515,0 465:O1|@466 466:D10,220|00822b1ada000e0e0e0c00021ad5000e0e0c0002036c2b352e352e1ac2000e0e0e0c0002030c2e3b1abd000e0e0c000302013b03043b5002041ab000102a1a9f000c0002030c2a3b1a9d000e0e0c000302013b03043b5002041a9000102e2b1a8e000e0e0e0c0003292b1a87000c00036403043b5002041a7e00102e2b316a6502472c1a5a000e0e0e0c0002030c2c3b1a55000e0e0c000302013b03043b5002041a4800102d352d2a1a48000e0c000303043b5002041a430010292e1a41000e0e0c00032e2a316a65440e0e0e0e0e0e00000000d400000000000000|@468,I105,I218,I231,@313,I239,I248,@469,@467,I240| 467:O4|11,@316,0,@472 468:S32|566563746f72536c6963654f7065726174696f6e7328292e736c696365283329 469:O4|11,@316,0,@470 470:O5|@471,111,0,111,0 471:S33|2e2f62617369732f566563746f72536c6963654f7065726174696f6e732e736d6c 472:O5|@471,101,0,101,0 473:O3|1,@474,0 474:S9|496e74657272757074 475:O1|@476 476:D21,364|00832e37292308291a65010e0e0c00021a61010e0e0c000203c029352b353b78812c2b341a51010e0e0c0003332d1a4b010c0003296801220e2c2b1a42010e0e0e0c0004662e0e0e0e0c0002056200ff6d0403002a351a2b011a2c010e0c0003030e2a2a2a35452a36462a37475102302a353c1a12010e0e0e0c000303101a0b012a2a35452a36462a37475102122c2b1afd006a2a1aec00451af800462a475129352a362b372b2b2b1aec006b270410292b1ac3000c000329331adf000c00036403033b0210292b1aad000e0e0c00032502501eb43b270402822a2307291a8f000c00021a8d000e0e0c000203043b5002172b35291aa8001aa9006a1a85001a92002b1aa2006b641029352c353e28413b1a98000e0c00043b402a1a92000e0e0e0c000303043b50021a2a2a28201a83000c000450293c1a7e000e0e0e0c000325011e2950402a693b33220c220e2e312f321a670022117b0a0d0009651f040e000000006401000000000000|@478,I105,I218,I106,I107,@479,@7,I251,@473,@348,@454,@481,I113,@461,@348,@482,I11,I248,I254,I239,@477| 477:O1|@483 478:S27|426173696353747265616d494f28292e7772697465566563283429 479:O1|@480 480:D11,228|00822b1ae2000e0e0e0c00021add000e0e0c000203702b352e1ad4000e0c00022e1ac4000e0c0002030c2e3b1ac5000e0e0c000302013b03043b5002041ab800102a1aa3000c0002030c2a3b1aa5000e0e0c000302013b03043b5002041a9800102e2b1a96000e0e0e0c0003292b1a8f000c00036403043b5002041a8600102e2b316a65024b2c1a5e000e0e0e0c0002030c2c3b1a5d000e0e0c000302013b03043b5002041a5000102d1a43000c00022d2a1a4b000c000303043b5002041a470010292e1a45000e0e0c00032e2a316a65440e0e0e0e0e0e00000000dc00000000000000|@468,I105,I218,I223,I231,@313,I239,I248,@469,@467,I240| 481:O5|@456,577,0,577,0 482:O5|@456,604,0,605,0 483:D20,348|008731331a59010e0e0c000329401a53010c000303032902014034331a49010e0e0c00032a6801332b2b1a3f010c000429352a362b373b2b1a35010e0e0c000329401a2f010c00036403041a2a01103b50291a27010c000203193b2c1a11010e0e0c0003220e2a2c1a15010e0e0c00046402162b3f1af8000e0c00032a2a22103b2f1aff000c00066478811a326801220f3b2b1af2000e0e0e0c00046422100e0e0c0002056300ff6d0403002a351adb001adc000e0c0003030e2a2a2a35452a36462a37475102312a353c1ac2000e0e0e0c000303101abb002a2a35452a36462a3747510213220d2b1aac006a2a1a9b00451aa700462a475129352a362b372b2b2b1a9b006b2704102922141a59000e0e0c00032922141a8a000e0e0e0c00036403033b02222922141a3c000e0c000322132213221322132213221322131a670022147b0a140009270a1f080e0e0e0e000000005401000000000000|@485,I107,I234,I106,@479,I239,I249,@486,I105,I254,I198,@465,@7,I251,@473,@348,@454,@484,I113,@477| 484:O5|@456,595,0,595,0 485:S38|426173696353747265616d494f28292e7772697465566563283429666f7263654f7574283129 486:O4|11,@316,0,@487 487:O5|@339,1637,0,1637,0 488:D16,612|0087313b1a61020e0e0c0003312a1a5b020c0003312a1a57020c00036503bf313b1a44020e0c000330680130302b1a43020c00042f3530362b352c362d37301a36020e0e0e0c0002030c303b1a2d020e0e0c000302013b03043b5002041a200210302b1a1e020e0e0e0c0003292f1a17020c00036403041a1202103b50291af7010c00020319302c1af9010e0e0c00032d2a2c1afa010e0e0e0c00045102162b3f1ae0010e0c00032a2a2f342f1ae4010e0c00065122103b1aad010e0e0c00032922101ad2010e0e0e0c000322123b2b1ac9010e0e0c0004503b270a0fce313b1a85010e0e0c0003312a1a7f010c0003333b1a73010c00032a680132322b1a73010c0004313532362b352c362d37301a66010e0e0e0c0002030c303b1a5d010e0e0c000302013b03043b5002041a500110302b1a4e010e0e0e0c0003292f1a47010c00036403041a4201103b50291a27010c00020319302c1a29010e0e0c00032d2a2c1a2a010e0e0e0c00045102162b3f1a10010e0c00032a2a2f342f1a14010e0c00065122123b1add000e0e0c000329331a03010c000322143b2b1afd000e0e0c000450220e1af6000202a6000e0e0e0c0002502210341add000e0e0c00032213220c1aa5000e0e0c000329680122142c2b1a9e000e0e0e0c00042213352214362b352c362d373b2b1a97000c0003292f1a93000c00036403041a8e00103b50291a73000c000203193b2c1a75000e0e0c00032d2a2c1a76000e0e0e0c00045102162b3f1a5c000e0c00032a2a2f3b2f1a60000e0c000651221b22141a2c000e0c0003221e3b2b1a51000e0e0c0004503b27161f080e0e000000005c02000000000000|@489,I253,I107,I234,@479,I105,I231,@313,I239,I249,@486,I254,I198,I106,I255,@457| 489:S46|426173696353747265616d494f28292e6f7574707574566563746f72283229616464566563546f42756666283129 490:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@342,@341| 491:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@342,@341| 492:D23,732|00821adb020c0001293c1ad7020c00032928061ad2020e0e0e0c0003293b1acb020c00036403033b02271ab3020c00011abd022b1ab1020e0e0c0003293f1ab3020c00032b3c2b1aae020e0e0e0c0004663b2f3b1a8d020e0e0c0003293c1a8b020c00036403033b0222291b204e1a8b020c000303033b0213293c1a82020e0e0e0c0003292502501e363b64642f1a73020c0002293b1a53020c000303033b02103c311a62020e0e0e0c000326031e5d3b6578810933330e0e0c000209cc00ff6d301a47020c0002293c1a1f020c000303043b500217311a36020e0e0e0c0002503d321a22020e0e0e0c0003501af0010e0c0001293c301afe010e0e0e0c0004502e3f1ae2010e0e0e0c0003293f1adb010c00036403341ac6010e0e0e0c0001293e1abf010c0003293b1acf010c0003651ae0010e0c0002030d280b3b1ac8010e0c00035002023b5002023b503c28403b1ac4010e0c0004293b1abf011a98010e0c0004502c1ab7010c0002293f1ab3010c00036403033b023a2c3e1a65010e0e0c0003291aa0010202aa000e0c00021a81010e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291a70010e0c00021a55010e0e0c000203043b50020f2d352e362f372b2b2b1a56016b6610293529352a362b372c382d393c28403b1a2c010e0c0004293b1a3b011a00010e0c000450343b1ae2000e0e0e0c0003220c3c1ad6000e0e0e0c0003220d3d1aca000e0e0e0c000331302f333268052c2c2c2c6b291a04010e0c00022711301ad2000e0e0e0c0002293c1aa7000c000303043b500217311abe000e0e0e0c0002503d321aaa000e0e0e0c0003501a78000e0c0001293c301a86000e0e0e0c0004502e3f1a6a000e0e0e0c0003293f1a63000c00036403341a4e000e0e0e0c0001293e1a47000c0003293b1a57000c0003651a68000e0c0002030d280b3b1a50000e0c00035002023b5002023b502b2707440e0e0e0e0e0e0e00000000d402000000000000|@494,I72,I253,I243,I251,-7,I242,I255,I113,I106,I71,I73,I70,I69,I218,I11,@495,I15,I250,I105,@524,@493,I14| 493:O1|@525 494:S20|5468726561644c69622e70726f74656374283329 495:O1|@496 496:D31,508|00802b363c1af8010e0c000303051af3010fd12b353b2a1aee010e0e0e0c00036403051ae6010fcc2b363c1ad2010e0e0e0c000303051ad7010fcf2b3529352a362b372c382d3931363c1ac7010c0003293b1aab010c000303051abb010fd2293c1ab0010e0c00032f2a691aae013b1aae010e0e0e0c00032a2a0e0e0e0c0002642c3c1a7a010e0e0e0c000303051a93010fdd2c3c1a7c010e0c0003312a691a86013b1a7a010e0e0e0c00032a2a0e0e0e0c0002642f3d1a46010e0e0e0c000303051a670102b12f3c1a48010e0c0003332a691a52013b1a46010e0e0e0c00032a2a020206010e0e0e0c000264323e1a0e010202f6000e0e0e0c000303051a2f010262323c1a0c010202e0000e0c0003220c2a691a11013b1a05010e0e0c00032a2a0e0e0e0c000264220c3c1ae500020263000e0e0c0003220e2a691ae9003b1add000e0e0c00032a2a0e0e0e0c000264291adf00691adf002a691ade002a692f2a6927091ad8002a691ad7002a02021500692c2a6927061acd002a691acc002a692c2a6927061ac6002a691ac5002a692c2a6927061abf002a693b3c3b3b2d68052a1ab6000e0e0e0c00021ab1000e0e0c000203033b02013b0319291aa400691aa4002a691aa3002a693b3e3c3b2d680566020129293b691a94002a691a93002a693b3c3b3b2d6805270e420e0e0e00000000f401000000000000|@498,I234,@499,I251,@500,@499,I107,@366,@9,I253,@366,@14,@366,@366,@439,@441,@442,@441,@442,@441,@442,@441,@442,@443,I105,I218,@516,@517,@443,@441,@497| 497:O5|0,0,0,@519,@518 498:S21|7072696e742d52756e74696d654c6f636174696f6e 499:O2|3,@415 500:O5|0,0,0,@502,@501 501:O2|@506,0 502:O2|@503,0 503:O2|0,@504 504:O5|@505,40,40,0,0 505:S27|2e2f62617369732f506f6c794d4c457863657074696f6e2e736d6c 506:O2|3,@507 507:S10|4e6f4c6f636174696f6e 508:O1|@509 509:D2,36|00802b35293c1a1f000c00033e2a6965420e0e0e0e0e0e0e000000001c00000000000000|@360,@510| 510:O9|@511,268435456,7,1000000000,9,134217728,9,536870912,29 511:D13,372|00810403002c3d1a6e010e0e0e0c0003030d2928104556274656284750023a2c3c1a54010e0c0003030c294045562946562a475002232c3e1a3d010e0e0c0003030d29280845562b46562c4750020a293d45562d46562e475029352a362b37303b1a18010e0c0003313b1a13010c0003030c312d1a05010e0e0c000302013b037531401af6000e0e0e0c000303302830321af0000e0c0003293b1adf000c000303033c020b2928ff1add000e0e0c000303041ad700103b503b50296402362841321ac0000e0c000329401ac3000c0003293b1aa7000c000303033c020b2928ff1aa5000e0e0c000303041a9f00103b503b502965026d313b1a85000e0e0c00030303310207311a8b000c00020402002a1a85000e0e0c000203152a3b3b3b2d303333220d1a75000e0e0c000a5002270402002b2f2b1a68000e0c00045029352a36293b2c323033220d220d22101a4c000e0c000a26042935291a48000e0c00025029662705430e0e000000006c01000000000000|@513,I251,I234,I231,I106,I233,@385,I107,I111,I105,@512,I104,I47| 512:O1|@514 513:S10|496e742e666d74283229 514:D20,620|0088333b1a69020e0e0c000307cb313b1a5d020e0e0c000303b82e0366323c1a52020e0e0e0c00032928081a46020e0e0e0c0003293c1a3f020c0003293f1a3b020c0003291a38021a39020e0e0c000303041a3302103b503b502928413b1a2b020c0004292e1a27020c000350293f287e1a20020e0c000450342a452805462705024d3228081aeb010c0003293c1ae7010c0003293f1ae3010c0003291ae0011ae1010e0e0c000303041adb01103b503b502928413b1ad3010c000429220e1ace010e0e0e0c000350332a453f46270402a932311a9d010202a2000e0e0c0003040200331ab1010e0e0c00020319332b3b3b2d220c220c220c220c1a9e010e0e0e0c000a50022704020034312b1a90010e0c00045029352a36292e2c3430220f220f220f220f1a73010c000a260429352a363b29220d1a6b010c000303043b5002282a2a1a2d010e0e0c00032c2a28301a41010e0e0c0004502a3c1a16010e0e0e0c00032502501e34505029220c1a03010c0003342c452a4627050fcf040200342d2b1a1a010e0e0e0c00045029352a3629401a12010e0e0e0c0003033028302a1a08010e0c0003293b1afb000c000303033c020b2928ff1af5000e0e0c000303041aef00103b503b502964023628412a1ad8000e0c000329401adb000c0003293b1ac3000c000303033c020b2928ff1abd000e0e0c000303041ab700103b503b502965220d3c1a6a000e0e0e0c0003220c3c1a62000e0e0e0c00030402002e2c22112d2d22112211221122111a6c000e0c000a5029352a362a2a301a55000e0e0c000450293c1a2a0002020e000e0e0e0c000322102c452a46270a1f090e0e000000006402000000000000|@515,I113,I239,I240,I241,16777215,I247,@391,I11,I151,I254,I105,@512,I104,I251,I234,I106,I233,@385,I107| 515:S20|496e742e666d74283229746f4368617273283429 516:O2|@517,@439 517:O3|1,0,0 518:O2|@522,0 519:O2|@520,0 520:O2|0,@521 521:O5|@505,41,41,0,0 522:O2|3,@523 523:S12|536f6d654c6f636174696f6e 524:O5|@505,83,0,83,0 525:D31,508|00802b363c1af8010e0c000303051af3010fd12b353b2a1aee010e0e0e0c00036403051ae6010fcc2b363c1ad2010e0e0e0c000303051ad7010fcf2b3529352a362b372c382d3931363c1ac7010c0003293b1aab010c000303051abb010fd2293c1ab0010e0c00032f2a691aae013b1aae010e0e0e0c00032a2a0e0e0e0c0002642c3c1a7a010e0e0e0c000303051a93010fdd2c3c1a7c010e0c0003312a691a86013b1a7a010e0e0e0c00032a2a0e0e0e0c0002642f3d1a46010e0e0e0c000303051a670102b12f3c1a48010e0c0003332a691a52013b1a46010e0e0e0c00032a2a020206010e0e0e0c000264323e1a0e010202f6000e0e0e0c000303051a2f010262323c1a0c010202e0000e0c0003220c2a691a11013b1a05010e0e0c00032a2a0e0e0e0c000264220c3c1ae500020263000e0e0c0003220e2a691ae9003b1add000e0e0c00032a2a0e0e0e0c000264291adf00691adf002a691ade002a692f2a6927091ad8002a691ad7002a02021500692c2a6927061acd002a691acc002a692c2a6927061ac6002a691ac5002a692c2a6927061abf002a693b3c3b3b2d68052a1ab6000e0e0e0c00021ab1000e0e0c000203033b02013b0319291aa400691aa4002a691aa3002a693b3e3c3b2d680566020129293b691a94002a691a93002a693b3c3b3b2d6805270e420e0e0e00000000f401000000000000|@498,I234,@499,I251,@527,@499,I107,@366,@9,I253,@366,@14,@366,@366,@439,@441,@442,@441,@442,@441,@442,@441,@442,@443,I105,I218,@516,@517,@443,@441,@526| 526:O5|0,0,0,@531,@518 527:O5|0,0,0,@528,@501 528:O2|@529,0 529:O2|0,@530 530:O5|@505,68,68,0,0 531:O2|@532,0 532:O2|0,@533 533:O5|@505,69,69,0,0 534:O2|@555,@554 535:O2|@537,@536 536:O3|@539,@541,@14559 537:D2,28|0080281256171a17002d0e0e7e030003000000001400000000000000|@538,I150| 538:S28|426173696353747265616d494f28292e646f4f6e456e747279283129 539:D5,100|008056083b1a60000e0c0003293b2a1a5a000e0e0e0c00021a55000e0e0c0002032f2a352b367881152c392d56972b1a42000e0e0e0c00046405080e0e0e00ff6d3b642a2a2505250526031e3d3b6602012966420e0e0e0e000000005c00000000000000|@540,I253,I105,I218,@279| 540:S27|426173696353747265616d494f28292e636c6f7365416c6c283129 541:O3|@542,@14560,@14559 542:D2,44|00802b3729372d563756481a22000e0e0e0c0004503b2a2e7d0500020e0e0e0e000000002400000000000000|@544,@543| 543:O1|@545 544:S28|426173696353747265616d494f28292e636c6f73654f757427283129 545:D12,236|00822d38293b1ae7000c0003293c1ae3000c000303033b02c32a3b3c1ad9000e0e0c0004503b2f3b1ac5000e0e0c0003293c1abf000c00036403033b0222291b204e1ab7000c000303033b0213293c1aae000e0e0e0c0003292502501e363b64642f1a9f000c0002293b1a87000c000303043b50020e3c311a8d000e0e0c000326031e5d512d3b1a66000e0e0e0c0003292c1a77000c00032f3b2b1a5a000e0e0e0c000450301a67000c0002293c1a43000c000303043b500217311a56000e0e0e0c0002503d321a3e000e0e0e0c000350321a4300310e0e7d0a000265440e0e00000000e400000000000000|@547,I253,I251,I255,I113,I106,I71,I73,@548,I70,I69,@546| 546:O1|@551 547:S35|426173696353747265616d494f28292e7465726d696e61746553747265616d27283129 548:O1|@549 549:D5,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203352c352d362a38292f1a47000c00031a3d000e0e0c000264030f292e1a38000e0c00032b2a6964020a292e1a29002f7e0600036502013b430e0e0e000000005400000000000000|@550,I105,I218,I251,@548| 550:S16|4c6973742e66696c7465722832292829 551:D18,292|00802b36293b1a1f010c00032d3729352f352c3b1a15010e0e0c000303033b0fca2b2307291a08010e0c00021a05010e0e0c000203043b5002152b1afa001afb006a1afb001afc002b1afc006b641029352f3b3b1af5000e0e0c0004503b788121312c1aea000e0e0e0c0003296801302e2b1adf000c0004652d0e0e0e0c0002056200ff6d0403002a351ab3001ac8000e0c0003030e2a2a2a35452a36462a37475102302a353c1aae000e0e0e0c000303101aa7002a2a35452a36462a37475102122f2b1a99006a2a1a7400451a7400462a475129352a362b372b2b2b1a84006b270410292b1a7f00020223000c000329321a37000c00036403033b0210292b1a65000e0e0c00032502501ead3b27042705420e0e0e0e0e000000001c01000000000000|@460,I253,I113,I105,I218,@461,@463,@7,@454,@464,I255,I107,@552,I251,@473,@463,@459,I106| 552:O1|@553 553:D10,220|00822b1ada000e0e0e0c00021ad5000e0e0c0002036c2b352e352e1ac2000e0e0e0c0002030c2e3b1abd000e0e0c000302013b03043b5002041ab000102a1a9f000c0002030c2a3b1a9d000e0e0c000302013b03043b5002041a9000102e2b1a8e000e0e0e0c0003292b1a87000c00036403043b5002041a7e00102e2b316a6502472c1a5a000e0e0e0c0002030c2c3b1a55000e0e0c000302013b03043b5002041a4800102d352d2a1a48000e0c000303043b5002041a430010292e1a41000e0e0c00032e2a316a65440e0e0e0e0e0e00000000d400000000000000|@468,I105,I218,I231,@313,I239,I248,@469,@467,I240| 554:O2|@637,0 555:O4|@556,@14562,@14561,I148 556:D6,84|008056091a51003c1a51000e0e0c00043c2a693c28402b1a46000e0e0e0c00043c28483c1a39000e0e0c00043c2b2b6a1a31002a6956672a56881a2b00340e7b050900040e0e0e0e000000004c00000000000000|@558,@559,@560,I11,@557,@279| 557:D2,28|00802b3b56271a17000c0004503b420e000000001400000000000000|@616,I255| 558:S19|54657874494f2e6f6e53746172745570283129 559:S5|737464496e 560:O2|@562,@561 561:O4|@611,@615,@610,@610 562:D17,412|00821a9b012e691a9a012f690404002e03132a68012c68012b2b452a463b473b482603021f1a800156472c6a2968011a7a0156672f6a2968012d3b453b462c472a48260529352a362b372c38040300281e220d3b1a59010e0e0c0004293d1a53010c00036403101a4e012a2a35452a36462a374751026a7881142812220f3b1a2e010e0e0e0c0004503c051c0e0e00ff6d29353d1a25010e0e0c000303043b50020229103b503b6429030c1a1201220e692968016402013b2a030c1a0601220f692968016402013b2b030c1afa002210692968016402013b2d2c452b462a47260529352a362b371ae200221069280f22113b1abb000c00041ad5002212692968011ad0002214692968011acb00221669221668012216312f2d220c220f2f221022162218220c22112218221a2218680f040f002a2a1aa4000e0c00035029352a362b372c382d392e3a2f230630230731230832230933230a34230b220c230c220d230d220e230e220e220e220e220e220e220e220e220e220e220e220e220e220e220e220e680f2724440e0e0e0e0e0e000000009401000000000000|@564,@565,@567,@569,@571,I61,I232,@572,I251,@573,@575,@577,@579,@581,@583,@584,@563| 563:O1|@585 564:S35|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329 565:D5,108|00802b352c362d3729362c1a62000e0e0e0c0002030c2c3b1a59000e0e0c000302013b03043b5002041a4c00102b1a3f000c0002030c2b3b1a39000e0e0c000302013b03043b5002041a2c0010292d2d6a280856672b1a2300330e7b05080004000000006400000000000000|@566,I105,I231,@313,I61| 566:S47|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329726561644172726179283129 567:D2,28|00804056172d1a17002e0e7b05030004000000001400000000000000|@568,I61| 568:S48|4c696272617279494f537570706f72742e77726170496e46696c65446573637228332972656164566563746f72283129 569:D1,28|00802b561856272d7e0300030e0e0e0e000000001400000000000000|@570| 570:S34|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283129283129 571:D1,28|00802b561856272d7e0300030e0e0e0e000000001400000000000000|@570| 572:O3|0,0,0 573:D2,28|0080281256173b1a16002e7b05030004000000001400000000000000|@574,I61| 574:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129676574506f732d283129 575:D2,36|0080281356172d1a1e000e0e0e0c0004503b420e0e0e0e0e000000001c00000000000000|@576,I61| 576:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129736574506f732d283129 577:D2,28|0080281456173b1a16002e7b05030004000000001400000000000000|@578,I61| 578:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129656e64506f732d283129 579:D5,76|008078810d281156373b1a43000c0004051a00ff6d29353d1a39000e0e0c000303043b50020229101a2d0064293b1a2b000c0003030529680102013b64420e0e000000004400000000000000|@580,I61,I251,-1,I231| 580:S43|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329617661696c283129 581:D2,28|0080281b56173b1a16002e7b05030004000000001400000000000000|@582,I61| 582:S49|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329746578745072696d52642d283129 583:D3,44|0080281056173b1a26000e0e0e0c0004293b1a1f002e0e0e7e0400030e0e0e0e000000002400000000000000|@582,I61,I233| 584:D2,28|0080280756173b1a16002e7b05030004000000001400000000000000|@582,I61| 585:D12,548|00812c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2e3b1af4010e0c0003031d2f3b1ae9010e0e0c000303033b020c2f351ade012a2f6a2968016502012e303b1acb010c0003031c2f3b1ac1010e0e0c000303033b020b2f351aba012a69296801650201302c3b1aa4010e0c000303582d3b1a99010e0e0c0003033e2f1a9a010e0e0e0c00021a95010e0e0c000203142a1a86010e0e0e0c00021a81010e0e0c000202013b03102f352b351a74012a2c6a2968016602013b020c2d351a67012a316a2968016502012c2e3b1a40010e0c000303572d3b1a35010e0e0c0003033e301a36010e0e0e0c00021a31010e0e0c000203142a1a22010e0e0e0c00021a1d010e0e0c000202013b031030352b351a18012a2c6a2968016602013b020b2d351a0b012a692968016502012e2c3b1add000e0e0c0003034122101add000e0e0c00021ad9000e0e0c000203142a1aca000e0e0e0c00021ac5000e0e0c000202013b03132210352b351ac70022152b2d6b2968016602013b02012c2c3b1a8f000c0003034122111a91000e0e0c00021a8d000e0e0c000203142a1a7e000e0e0e0c00021a79000e0e0c000202013b03132211352b351a7f0022162b2d6b2968016602013b02012c221722154522144622134722124822114922104a220f4b220e4c2a24082b240934240a33240b2c240c2d240d30240e2715430e0e0e0e0e0e000000001c02000000000000|@587,I251,@588,@592,I105,I218,@596,@598,@599,@601,@602,@586| 586:D8,76|00803b56190c0002502b56180e0c0002291a3c000e0c00021a39000e0e0c000203043b50021656171a2d001a2e006a1a2e001a2f002b1a2f006b641029356442000000004400000000000000|@608,I105,I218,@461,@609,@7,@454,@607| 587:S25|5072696d494f28292e6175676d656e74526561646572283129 588:D25,356|00802b56181a60010e0c000303032b02025608291a55010e0e0c0002030c293b1a4d010e0e0c000302013b03043b5002041a400110293b1a3e010e0e0e0c000303033c022c291a33011a34010e0c000303041a2f01103b50293f1a2b010c0003293c1a27010c0003293f1a23010c0003652928413b1a1c010e0c00043b2c2a1a16010e0e0e0c000303043b50021a2a2a28201a07010c000450293c1aea000e0e0e0c000325011e29502b2a693b2d2b6a56570e0e0e0c00022968012b3b2b1adf000c000429352a362b3729362b3b1ad3000c000303051acf0002752b3c1ac4000e0c0003030e292d1ac100220f0e0e0e7e0e00032b28081a8e000e0e0e0c0003293c1a87000c0003293f1a83000c0003291a9c001a9d000e0e0c000303041a9700103b502928413b1a69000e0e0c000429301a87000c0003502d312b3f331a7f000c000650291a7b000c000250292704270b420e0e0e0e0e000000005c01000000000000|@590,I234,I105,I231,@399,I251,67108856,I249,@589,I239,I240,I241,I11,I248,I254,@465,I113,I48,I252,16777215,I247,@391,I151,I198,I47| 589:O4|4,@394,0,@591 590:S37|5072696d494f28292e6175676d656e7452656164657228312972656164566563272d283129 591:O5|@317,169,0,169,0 592:D10,148|00802b352c362d372a56470e0e0c00022a352b362b1a80000e0c00022f1a7c000e0c0002030c2f3b1a75000e0e0c000302013b03043b5002041a6800102f2a1a66000e0e0e0c0003292d1a5f000c00036403041a5a00103b502c1a3f000c0002030d2a302e1a4c000e0c000450020e2c3f2c322d1a41000e0e0c0006502c1a1700330e0e7d0a0002000000008c00000000000000|@594,I223,I105,I231,@313,I239,I249,@593,I254,I198| 593:O4|11,@316,0,@595 594:S37|5072696d494f28292e6175676d656e7452656164657228312972656164417272272d283129 595:O5|@339,1182,0,1182,0 596:D1,36|00803b56180c0002030c2b56170c00022968016402013b42000000001c00000000000000|@597| 597:S39|5072696d494f28292e6175676d656e74526561646572283129726561645665634e42272d283129 598:D26,380|00802b56181a78010e0c000303032b02025608291a6d010e0e0c0002030c293b1a65010e0e0c000302013b03043b5002041a580110293b1a56010e0e0e0c000303033c022c291a4b011a4c010e0c000303041a4701103b50293f1a43010c0003293c1a3f010c0003293f1a3b010c0003652928413b1a34010e0c00043b2c2a1a2e010e0e0e0c000303043b50021a2a2a28201a1f010c000450293c1a02010e0e0e0c000325011e29502b2a693b2d2b6a56570e0e0e0c0002291ac8000e0c00021af5000e0e0c0002039d29352968012c3b2b1ae7000c000429352a362b3729362b3b1adb000c000303051ad70002712b3c1acc000e0c0003030c292d1ac9000e0e0c0003025a2b28081a94000e0c0003293c1a8f000c0003293f1a8b000c0003291aa8001aa9000e0e0c000303041aa300103b502928413b1a71000e0e0c000429301a93000c0003502d312b3f331a8b000c000650291a87000c000250292704296801270802013b2705420e0e0e0e0e000000007401000000000000|@597,I234,I105,I231,@399,I251,67108856,I249,@589,I239,I240,I241,I11,I248,I254,I218,@465,I113,I48,I252,16777215,I247,@391,I151,I198,I47| 599:D1,36|00803b56180c0002030c2b56170c00022968016402013b42000000001c00000000000000|@600| 600:S39|5072696d494f28292e6175676d656e74526561646572283129726561644172724e42272d283129 601:D11,180|00802b352c362d372a56470e0e0c0002291aa4000e0c00021aa1000e0e0c0002037d29352b352c362b1a94000e0c0002301a84000e0c0002030c303b1a85000e0e0c000302013b03043b5002041a780010302a1a76000e0e0e0c0003292d1a6f000c00036403041a6a00103b502c1a47000c0002030d2a312e1a5c000e0c000450020e2c3f2c332d1a51000e0e0c0006502c1a2b000c0002296801270502013b2704420e0e0e0e0e00000000ac00000000000000|@600,I105,I218,I223,I231,@313,I239,I249,@593,I254,I198| 602:D8,76|00803b56190c0002502b56180e0c0002291a3c000e0c00021a39000e0e0c000203043b50021656171a2d001a2e006a1a2e001a2f002b1a2f006b641029356442000000004400000000000000|@604,I105,I218,@461,@605,@7,@454,@603| 603:O5|@606,239,0,242,0 604:S38|5072696d494f28292e6175676d656e745265616465722831297265616456656327272d283129 605:S7|72656164566563 606:S18|2e2f62617369732f5072696d494f2e736d6c 607:O5|@606,262,0,265,0 608:S38|5072696d494f28292e6175676d656e745265616465722831297265616441727227272d283129 609:S7|72656164417272 610:O1|11 611:D6,212|008178810d2e2e0e0e0c00022968016405b100ff6d29353d1abd000e0e0c0003031929372936291ab2000e0e0e0c00021aad000e0e0c00026502013b03043b50020229103b5029372936293556493b1a86000e0e0e0c000303033b020c5649352a2a1a7f000c00036403033b025356483b1a64000e0c000303033b020c5648352a2a1a5f000c00036403033b023356473b1a44000e0c000303033b020c5647352a2a1a3f000c00036403043b50020f2c352d362e372b2b2b1a2d006b66103b503b2704430e0e0e0e00000000cc00000000000000|@613,I251,I105,I218,I113,@612| 612:O5|@614,118,0,118,0 613:S31|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283229 614:S28|2e2f62617369732f4c696272617279494f537570706f72742e736d6c 615:O1|115 616:S37|4261736963496d7065726174697665494f28292e736574496e73747265616d283229283129 617:O5|0,@619,@618,1285,0 618:O3|1,@15,@14563 619:S1286|282a0a20202020436f707972696768742028632920323030362d31302020446176696420432e204a2e204d617474686577730a0a2020202054686973206c696272617279206973206672656520736f6674776172653b20796f752063616e2072656469737472696275746520697420616e642f6f720a202020206d6f6469667920697420756e64657220746865207465726d73206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e7365206173207075626c697368656420627920746865204672656520536f66747761726520466f756e646174696f6e3b206569746865720a2020202076657273696f6e20322e31206f6620746865204c6963656e73652c206f722028617420796f7572206f7074696f6e2920616e79206c617465722076657273696f6e2e0a202020200a2020202054686973206c69627261727920697320646973747269627574656420696e2074686520686f706520746861742069742077696c6c2062652075736566756c2c0a2020202062757420574954484f555420414e592057415252414e54593b20776974686f7574206576656e2074686520696d706c6965642077617272616e7479206f660a202020204d45524348414e544142494c495459206f72204649544e45535320464f52204120504152544943554c415220505552504f53452e20205365652074686520474e550a202020204c65737365722047656e6572616c205075626c6963204c6963656e736520666f72206d6f72652064657461696c732e0a202020200a20202020596f752073686f756c642068617665207265636569766564206120636f7079206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e736520616c6f6e6720776974682074686973206c6962726172793b206966206e6f742c20777269746520746f20746865204672656520536f6674776172650a20202020466f756e646174696f6e2c20496e632e2c203531204672616e6b6c696e2053742c20466966746820466c6f6f722c20426f73746f6e2c204d41202030323131302d3133303120205553410a2a290a0a282a20436f6d70696c65722074686520636f6d70696c657220616e64206578706f7274206974206173206120706f727461626c652066696c652e20205468652072657374206f66207468650a202020626f6f7473747261702070726f63657373206973207468656e20646f6e65207768656e2074686520706f727461626c652066696c6520697320696d706f727465642e202a290a0a506f6c794d4c2e7072696e745f646570746820303b0a0a506f6c794d4c2e757365202262617369732f52756e74696d6543616c6c73223b0a0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c65722f426f6f74223b0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c6572223b0a0a506f6c794d4c2e7368617265436f6d6d6f6e44617461204d4c436f6d70696c65722e7368656c6c3b0a0a506f6c794d4c2e6578706f7274506f727461626c652822706f6c7974656d70222c0a20202020666e202829203d3e20284d4c436f6d70696c65722e7368656c6c28293b204f532e50726f636573732e65786974204f532e50726f636573732e73756363657373292068616e646c65205f203d3e204f532e50726f636573732e65786974204f532e50726f636573732e6661696c757265293b0a 620:O2|1,@621 621:O15|@559,@623,@624,@626,0,0,@627,0,@628,@630,@632,4096,@634,@622,0 622:O1|@636 623:O2|@579,I148 624:O1|@625 625:O2|@581,I148 626:O2|@584,I148 627:O1|I148 628:O1|@629 629:O2|@565,I148 630:O1|@631 631:O2|@567,I148 632:O1|@633 633:O2|@583,I148 634:O1|@635 635:O3|@599,@629,@633 636:O3|@596,@631,@633 637:O2|@639,@638 638:O3|@640,@641,@14564 639:D2,28|0080281256171a17002d0e0e7e030003000000001400000000000000|@538,I150| 640:D5,100|008056083b1a60000e0c0003293b2a1a5a000e0e0e0c00021a55000e0e0c0002032f2a352b367881152c392d56972b1a42000e0e0e0c00046405080e0e0e00ff6d3b642a2a2505250526031e3d3b6602012966420e0e0e0e000000005c00000000000000|@540,I253,I105,I218,@279| 641:O3|@642,@14565,@14564 642:D2,44|00802b3729372d563756481a22000e0e0e0c0004503b2a2e7d0500020e0e0e0e000000002400000000000000|@544,@643| 643:O1|@644 644:D12,236|00822d38293b1ae7000c0003293c1ae3000c000303033b02c32a3b3c1ad9000e0e0c0004503b2f3b1ac5000e0e0c0003293c1abf000c00036403033b0222291b204e1ab7000c000303033b0213293c1aae000e0e0e0c0003292502501e363b64642f1a9f000c0002293b1a87000c000303043b50020e3c311a8d000e0e0c000326031e5d512d3b1a66000e0e0e0c0003292c1a77000c00032f3b2b1a5a000e0e0e0c000450301a67000c0002293c1a43000c000303043b500217311a56000e0e0e0c0002503d321a3e000e0e0e0c000350321a4300310e0e7d0a000265440e0e00000000e400000000000000|@547,I253,I251,I255,I113,I106,I71,I73,@645,I70,I69,@457| 645:O1|@646 646:D5,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203352c352d362a38292f1a47000c00031a3d000e0e0c000264030f292e1a38000e0c00032b2a6964020a292e1a29002f7e0600036502013b430e0e0e000000005400000000000000|@550,I105,I218,I251,@645| 647:O2|@649,@648 648:O2|@298,0 649:O6|@650,@17,@651,@18,@14566,@16 650:O2|4096,@1 651:O14|@653,@654,@656,0,0,@657,0,@658,@660,@662,4096,0,@664,@652 652:O1|@666 653:S6|737464457272 654:O1|@655 655:O2|@305,I202 656:O2|@308,I202 657:O1|I202 658:O1|@659 659:O2|@312,I202 660:O1|@661 661:O2|@320,I202 662:O1|@663 663:O2|@324,I202 664:O1|@665 665:O3|@327,@659,@663 666:O3|@330,@661,@663 667:O1|@668 668:D4,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203242b352c36291a3a000e0e0e0c00025078810a3b2d0e0e0e0c0002050500ff6d3b646502013b420e0e0e0e000000004400000000000000|@669,I105,I218,@667| 669:S20|506f6c794d4c2e72756e4f6e456e747279283129 670:O2|@14567,@671 671:O4|1,@20,@21,@19 672:O2|@673,80 673:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@675,@674| 674:O1|@676 675:S25|486173685461626c652e6861736856616c7565283129283129 676:D13,204|00812c1aca000e0e0e0c00023b2a293b1ac1000e0e0c000303032a0268293c1ab6000e0e0e0c00032a3c1aab000c0003311aa8000e0c00020303310214293f1a9e000e0e0e0c0003322a1a97000c000364291a87000c00020303290207291a87000c000228072f1a82000e0e0e0c00032a2a1a6b000c0003292f2508250826061e723b2706652d1a52000e0e0e0c000203032d02072d1a4f000c00022a2a1a4f000c0003293b1a4b000c0003030e1a47002a1a4700310e0e7e0800032927044300000000c400000000000000|@678,I223,I251,I240,I105,I239,I252,I152,I238,I246,I234,@677,I106| 677:B4|00000080 678:S22|486173685461626c652e6861736856616c7565283229 679:O2|@770,@14548 680:O2|@682,@681 681:O2|@683,0 682:S2|3c3d 683:O4|@23,69,@684,0 684:O7|@682,2,@691,@692,@690,0,0 685:O1|@686 686:O1|@687 687:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 688:O2|3,63 689:S13|7072696e742d64656661756c74 690:O2|@719,0 691:O2|3,8 692:O3|2,@694,@693 693:O5|5,0,@705,@704,0 694:O3|3,@696,@695 695:O3|0,@702,1 696:O2|@698,@697 697:O2|@701,0 698:O2|49,@699 699:O3|6,@24,79992 700:O2|4,0 701:O2|50,@699 702:O2|49,@703 703:O2|50,0 704:O3|@705,@690,@706 705:S4|626f6f6c 706:O3|@708,@715,@707 707:O3|@705,@717,@716 708:O2|1,@709 709:O3|2,@710,0 710:O4|I251,@25,1,1 711:O1|@712 712:D2,20|00801a1300420e0e000000000c00000000000000|@714,@713| 713:O2|3,63 714:S37|545950455f5452454528292e64656661756c744d6f6e6f547970655072696e746572283129 715:O4|1,@26,0,0 716:S8|496e204261736973 717:O5|@718,0,0,0,0 718:S14|5374616e64617264204261736973 719:O2|0,@717 720:O2|@722,@721 721:O2|@723,0 722:S2|3e3d 723:O4|@23,69,@724,0 724:O7|@722,2,@691,@692,@690,0,0 725:O2|@727,@726 726:O2|@728,0 727:S4|74727565 728:O4|@23,69,@729,0 729:O7|@727,@731,@730,@693,@690,0,0 730:O2|1,@732 731:O2|1,2 732:O3|14,@733,0 733:O2|@735,@734 734:O2|@742,0 735:O2|7,@736 736:O8|@738,@727,0,0,@737,0,0,1 737:O2|@741,0 738:O4|13,1,@739,1 739:O2|4,@740 740:O2|0,0 741:O2|1,0 742:O3|2,1,0 743:O2|@745,@744 744:O2|@746,0 745:S3|65786e 746:O4|@27,69,@747,0 747:O2|@748,0 748:O3|@745,@690,@749 749:O3|@751,@757,@750 750:O3|@745,@717,@716 751:O2|1,@752 752:O3|2,@753,0 753:O4|0,@28,2,1 754:O1|@755 755:D2,20|00801a1300420e0e000000000c00000000000000|@756,@713| 756:S40|545950455f5452454528292e6d616b655479706528332964656661756c745072696e746572283129 757:O4|1,@29,0,0 758:O2|@760,@759 759:O2|@761,0 760:S3|636872 761:O4|@23,69,@762,0 762:O7|@760,2,@764,@763,@690,0,0 763:O3|2,@768,@767 764:O2|1,@765 765:O2|7,@766 766:O8|@739,@760,0,0,@737,0,0,1 767:O5|5,0,@778,@777,0 768:O5|5,0,@770,@769,0 769:O3|@770,@690,@771 770:S3|696e74 771:O3|@773,@776,@772 772:O3|@770,@717,@716 773:O2|1,@774 774:O3|2,@775,0 775:O4|I113,@30,3,1 776:O4|1,@31,0,0 777:O3|@778,@690,@779 778:S6|737472696e67 779:O3|@781,@923,@780 780:O3|@778,@717,@716 781:O2|1,@782 782:O3|2,@784,@783 783:O2|@789,@788 784:O4|@785,@32,3,1 785:O1|@786 786:D7,108|00812c2c1a69000e0e0c000303033c024c2c1a5f000c00021a5d000e0e0c000203142b1a4e000e0e0e0c00021a49000e0e0c000202013b03232c3b2d3b3f301a3a000e0e0e0c00021a35000e0e0c00031a3100300e0e0e7b070400063b430e0e000000006400000000000000|@787,I251,I105,I218,I223,I239,I154| 787:S14|737472696e67457175616c697479 788:O2|@886,0 789:O4|@33,69,@790,0 790:O2|@792,@791 791:O2|0,@885 792:O2|@794,@793 793:O2|@794,0 794:O4|@34,69,@795,0 795:O3|0,@797,@796 796:O5|@849,@876,I49,@882,@848 797:O8|@799,@787,0,0,@798,0,0,1 798:O2|@841,@840 799:O4|1,@801,@742,@800 800:O4|1,@810,@822,@809 801:O4|3,@803,@802,1 802:O3|2,I251,0 803:O2|@805,@804 804:O2|@806,0 805:O2|@739,1 806:O2|@807,1 807:O2|4,@808 808:O2|0,1 809:O3|2,0,0 810:O4|1,@812,@811,@809 811:O4|3,@819,@813,1 812:O4|3,@814,@813,1 813:O3|2,I218,0 814:O2|@815,0 815:O2|@816,1 816:O4|3,@818,@817,1 817:O3|2,I105,0 818:O2|@805,0 819:O2|@820,0 820:O2|@821,1 821:O4|3,@804,@817,1 822:O4|3,@824,@823,1 823:O3|2,I154,0 824:O2|@805,@825 825:O2|@827,@826 826:O2|@806,@828 827:O2|@809,1 828:O2|@827,@829 829:O2|@830,0 830:O2|@831,1 831:O4|3,@833,@832,1 832:O3|2,I239,0 833:O2|@835,@834 834:O2|@837,0 835:O2|@836,1 836:O3|2,4,0 837:O2|@838,1 838:O4|3,@804,@839,1 839:O3|2,I223,0 840:O2|@846,0 841:O2|1,@842 842:O2|@844,@843 843:O2|@844,@845 844:O1|3 845:O2|@844,0 846:O2|1,@847 847:O2|@844,@842 848:O1|@883 849:D3,36|00802b1a220056276956285639564a1a1a00307b07030006000000001c00000000000000|@851,@852,@850| 850:O1|@854 851:S40|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283129283129 852:D1,36|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000001c00000000000000|@853| 853:S39|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e2832292d45 854:D17,332|0084040200302a310e0c00035029352a360402002b353b1a36010e0e0e0c0003030d2b362c372b2b452a46260302ac2b3629353d1a19010e0e0c000303043b5002041a0f01103b502936291a0a010e0e0e0c00021a05010e0e0c000203033c0210331afb000c00022a2a1af7000c00036403041af200103b503b50332a1aec000e0c0003293b1ac7000c0003641acc000e0c000203043b5002041ad300103b50291ab4000e0c00020303290207291ac3000c0002293c1abf000c0003342a1aab000c00032c3c1ab3000c0003220c0e0e0e0c00022f2b452a46260729352a362c353b1a6b000c0003031a2c362d371a8f001a90002b220f220f220f68063b2c2b6a66022b2c353d1a46000e0e0e0c0003031a2c362d371a6f001a68002b220f220f220f68063d2c2b6a6602031a5d003b2c2c6a292b6927081f050e0e0e0e0e0e000000004401000000000000|@856,I251,@857,I105,I218,I15,I247,@866,I253,@869,I152,I239,I106,@872,@850,@874,@855| 855:O1|1 856:S37|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283229 857:O4|@35,@863,@864,@858 858:O5|@865,314,0,314,0 859:O1|@860 860:O1|@861 861:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@862,@9,I253| 862:S12|7072696e742d737472696e67 863:S13|496e7465726e616c4572726f72 864:S43|636f646574726565206e6577456e7669726f6e3a204e6f742045787472616374206f7220436f6e73746e74 865:S40|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245452e4d4c 866:O4|11,@316,0,@867 867:O5|@868,114,0,114,0 868:S18|2e2f62617369732f566563746f722e736d6c 869:O4|@35,@863,@871,@870 870:O5|@865,310,0,310,0 871:S33|5265666572656e636520746f206e6f6e2d6578697374656e742062696e64696e67 872:D2,36|00802b1a22005628695629563a564b5657300e7b07030006000000001c00000000000000|@851,@873| 873:D1,36|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000001c00000000000000|@853| 874:D2,36|00802b1a22005628695629563a564b5657300e7b07030006000000001c00000000000000|@851,@875| 875:D1,36|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000001c00000000000000|@853| 876:O2|@877,0 877:D7,100|008056072c2a1a5f000c00021a5d000e0e0c000203043b5002041a5300102a352b362b3b1a4d000e0e0c000303032a02172b3c1a42000e0e0e0c00032a2a2505250526031e3f3b6427043c2a69291a2b006965420e0e0e0e000000005c00000000000000|@879,I105,I218,@878,I113,I107,@855| 878:O4|11,@316,0,@880 879:S49|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429696e6c696e65436f64652d283129 880:O5|@881,97,0,97,0 881:S16|2e2f62617369732f4c6973742e736d6c 882:O1|@785 883:D1,20|00803b420e0e0e0e000000000c00000000000000|@884| 884:S38|434f44455452454528292e67656e436f64652833292831296669656c6450726f70732d283129 885:O2|0,@740 886:O4|@34,69,@887,0 887:O3|2,4,@888 888:O5|@890,@892,I49,@907,@889 889:O2|@909,@908 890:D3,36|00802b1a220056276956285639564a1a1a00307b07030006000000001c00000000000000|@851,@891,@850| 891:D1,36|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000001c00000000000000|@853| 892:O2|@894,@893 893:O2|@897,@896 894:D6,92|008056072c2a1a57000c00021a55000e0e0c000203043b5002041a4b00102a352b362b3b1a45000e0e0c000303032a02172b3c1a3a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000005400000000000000|@895,I105,I218,@878,I113,I107| 895:S39|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129283129 896:O2|@900,@899 897:O2|@898,@795 898:O3|0,@785,@793 899:O2|@903,@902 900:O2|@901,@855 901:O3|0,@32,0 902:O2|@905,0 903:O2|@904,@855 904:O3|0,3,0 905:O2|@906,@855 906:O3|0,1,0 907:O1|@784 908:O2|@910,0 909:D6,92|008056072c2a1a57000c00021a55000e0e0c000203043b5002041a4b00102a352b362b3b1a45000e0e0c000303032a02172b3c1a3a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000005400000000000000|@884,I105,I218,@878,I113,I107| 910:O2|@789,@911 911:O2|@913,@912 912:O2|@913,0 913:O4|@34,69,@914,0 914:O3|2,4,@915 915:O4|@917,@919,@916,@784 916:O2|@793,@791 917:D8,204|00802b1aca000e0e0e0c000203032b02072b1abf000c000256192a1aba000e0e0e0c000356282e2a1aa5000e0e0c00021aa9000e0e0c000203043b5002041a9f00102a352b362b3b1a99000e0e0c000303032a02172b3c1a8e000e0e0e0c00032a2a2505250526031e413b6427043b2b2b6a5647302a1a57000c00021a5d000e0e0c000203043b5002041a5300102a352b362b3b1a4d000e0e0c000303032a02172b3c1a42000e0e0e0c00032a2a2505250526031e3f3b6427042a2a6927054200000000c400000000000000|@918,I105,I152,I253,I218,@878,I113,I107| 918:S81|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c2831297475706c6550726f70732d696e6c696e6550726f702d7475706c65456e747279283129 919:O2|@795,@920 920:O2|@855,@921 921:O2|@855,@922 922:O2|@855,0 923:O4|1,@36,0,0 924:O2|@926,@925 925:O2|@927,0 926:S2|3c3e 927:O4|@23,69,@928,0 928:O7|@926,2,@930,@929,@690,0,0 929:O3|2,@931,@693 930:O2|3,6 931:O3|3,@932,@695 932:O2|@934,@933 933:O2|@936,0 934:O2|49,@935 935:O3|6,@37,79996 936:O2|50,@935 937:O2|@939,@938 938:O2|@940,0 939:S3|616273 940:O4|@23,69,@941,0 941:O7|@939,2,@691,@942,@690,0,0 942:O3|2,@699,@699 943:O2|@945,@944 944:O2|@946,0 945:S5|66616c7365 946:O4|@23,69,@947,0 947:O7|@945,@731,@948,@693,@690,0,0 948:O2|1,@949 949:O3|14,@950,0 950:O2|@952,@951 951:O2|@809,0 952:O2|7,@953 953:O8|@954,@945,0,0,@737,0,0,1 954:O4|13,0,@739,1 955:O2|@957,@956 956:O2|@958,0 957:S6|506f6c794d4c 958:O4|@38,69,@959,0 959:O4|@957,@961,@960,@690 960:O6|@963,I48,0,@690,@962,0 961:O2|1,@809 962:O1|@12914 963:O4|1,@40,@41,@39 964:O2|@1092,@12912 965:O2|@967,@966 966:O2|@968,0 967:S15|5072657474794c696e65427265616b 968:O4|@23,69,@969,0 969:O7|@967,@971,@972,@970,@690,0,0 970:O5|5,0,@1112,@1111,@690 971:O2|1,5 972:O2|1,@973 973:O3|2,@975,@974 974:O2|@979,0 975:O2|@977,@976 976:O1|2 977:O1|@978 978:D2,28|00802b353d1a18002d0e0e0e7e030003000000001400000000000000|@967,I251| 979:O4|@34,69,@980,0 980:O3|2,2,@981 981:O6|@874,@850,@983,@999,@982,@848 982:O22|@1001,@1005,@1008,@1004,@1003,@1013,@1016,@1012,@1011,@977,@975,@1021,@1024,@1020,@1019,@1028,@1031,@1027,@1002,@1034,@43,@1000 983:O2|@894,@984 984:O2|@986,@985 985:O2|@997,0 986:O2|@988,@987 987:O3|0,@990,@876 988:O2|1,@989 989:O2|2,8 990:O8|@992,@967,0,0,@991,0,0,1 991:O2|@994,0 992:O4|13,2,@993,4 993:O4|6,@739,0,0 994:O2|1,@995 995:O2|@996,0 996:O3|2,0,@845 997:O2|@998,@855 998:O3|0,@976,0 999:O21|2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2 1000:O4|@1034,@43,3,1 1001:O6|@1000,@1003,@1011,@975,@1019,@1002 1002:O3|@1028,@1031,@1027 1003:O3|@1005,@1008,@1004 1004:O1|@1010 1005:O1|@1006 1006:D2,28|00802b353b1a18002d0e0e0e7e030003000000001400000000000000|@1007,I251| 1007:S11|507265747479426c6f636b 1008:O1|@1009 1009:D1,36|00802b352c362d372e383b2d2d2d2d68052704420e0e0e0e000000001c00000000000000|@1007| 1010:D1,36|00802b362c372d382e392c2c2c2c6b2704420e0e0e0e0e0e000000001c00000000000000|@1007| 1011:O3|@1013,@1016,@1012 1012:O1|@1018 1013:O1|@1014 1014:D2,28|00802b353c1a18002d0e0e0e7e030003000000001400000000000000|@1015,I251| 1015:S11|507265747479427265616b 1016:O1|@1017 1017:D1,28|00802b352c363c2b2b6a65420e0e0e0e000000001400000000000000|@1015| 1018:D1,28|00802b362c372a2a6965420e0e0e0e0e000000001400000000000000|@1015| 1019:O3|@1021,@1024,@1020 1020:O1|@1026 1021:O1|@1022 1022:D2,28|00802b353e1a18002d0e0e0e7e030003000000001400000000000000|@1023,I251| 1023:S12|507265747479537472696e67 1024:O1|@1025 1025:D1,20|00803e2c69420e0e000000000c00000000000000|@1023| 1026:D1,20|00802b36420e0e0e000000000c00000000000000|@1023| 1027:O1|@1033 1028:O1|@1029 1029:D2,28|00802b353f1a18002d0e0e0e7e030003000000001400000000000000|@1030,I251| 1030:S21|507265747479537472696e67576974685769647468 1031:O1|@1032 1032:D1,28|00802b352c363f2b2b6a65420e0e0e0e000000001400000000000000|@1030| 1033:D1,28|00802b362c372a2a6965420e0e0e0e0e000000001400000000000000|@1030| 1034:O1|@1035 1035:D1,20|00813b430e0e0e0e000000000c00000000000000|@1036| 1036:S5|6e6f2d6571 1037:O2|@1038,@43 1038:D51,1124|00802b363c1a60040e0c000303051a5b040fcd2b3529353b1a55040e0e0c00036407d12b3529362a372b382c3930363c1a41040e0e0c0003293b1a2b040c000303051a33040fd2293c1a28040e0c00032e2a691a26043b1a26040e0e0e0c00032a2a0e0e0e0c0002642c3c1afa030e0e0e0c000303051a0b0402c92c3c1af4030e0c0003302a691afe033b1af2030e0e0e0c00032a2a0e0e0e0c0002642f3d1ac6030e0e0e0c000303051adf0302862f3c1ac0030e0c0003322a691ad2033b1abe030e0e0e0c00031ac9032a0e0c0002642a2a0e0e0c000264323c1a9603020275030e0e0e0c0003342a691aa2033b1a8e03020293000e0e0e0c00031a990312140001000100693b2a3e3c6b642a0e0e0e0c0002642a2a020238000e0e0c000264291a7703691a77032a691a76032a692f2a6927091a70032a691a6f032a692c2a6927061a69032a691a68032a692c2a6927061a62032a693b3c3b3b2d68052a1a59030e0e0c00021a55030e0e0c000250293b691a4d032a691a4c032a693b3c3b3b2d6805270c0fd82b363c1ad9020e0e0c000303051a33030fc82b3529353c1acd020e0e0c00036403ae2b3529362a372e363c1abd020e0e0c0003293b1aa7020c000303051a0703025a293c1aa4020e0c00032c2a691aa2023b1aa2020e0e0e0c00032a2a0e0e0e0c0002642c3c1a82020e0e0e0c00032e2a691a7e023b1a7e020e0e0e0c00032a2a0e0e0e0c000264291abf02691abf022a691abe022a692f2a6927091ab8022a693b3c3b3b2d68052a1a87020c00021a85020e0e0c000250293b691a9d022a691a9c022a693b3c3b3b2d6805270a0fd02b363c1a09020204f401f2010c000303051a7f020fce2b3529353d1af9010e0e0c00036403051a6e020fdb2b363c1ade010e0e0e0c000303051a5f020fde2b3529353e1ad1010e0e0c00036407dd2b3529362d363c1ac3010c00032a2a691a3e023b1ac2010e0e0e0c00032a2a0e0e0e0c00026429353b1a9d010e0e0c000303a12939291adc010e0c00021ad9010e0e0c0002036729361ac9010e0e0c00021ac5010e0e0c000203502935353e1a67010c000303392935362928281a59010e0e0c000303033c022329287b1a490102022c010e0e0c000303033c020f29285b1a3501020218010e0e0c00036402013b1a75010e0e0c000202013b02013b031f2a1aa001690202f6001a9c012a691a9b012a693b3e3c3b2d6805660203e0002a64020129293b691a8601020212002a691a81012a693b3c3b3b2d6805270902bf2b363c1aca000e0e0e0c000303051a670102ac2b3529362a372e363c1abd000e0e0c0003293b1aa7000c000303051a4b01025a293c1aa4000e0c00032c2a691a1e013b1aa2000e0e0e0c00032a2a0e0e0e0c0002642c3c1a82000e0e0e0c00032e2a691a7e003b1a7e000e0e0e0c00032a2a0e0e0e0c000264291a0301691a03012a691a02012a692f2a6927091afc002a693b3c3b3b2d68052a1a87000c00021a85000e0e0c000250293b691ae1002a691ae0002a693b3c3b3b2d6805270a42000000005c04000000000000|@1040,I234,@1041,I251,I107,@1043,@30,I253,@1043,@25,@1043,@44,@1064,@1096,@1056,@1058,@1059,@1058,@1059,@1058,@1059,@1060,I105,I218,@1058,@1097,@1041,@1043,@1056,@1058,@1059,@1060,@1058,@1100,@1041,@1103,@1041,@32,@1087,@1088,@1060,@1058,@1106,@1041,@1043,@1056,@1058,@1059,@1060,@1058,@1039| 1039:O5|0,0,0,@690,@1109 1040:S12|7072696e742d707265747479 1041:O2|3,@1042 1042:S3|2e2e2e 1043:O2|@1044,0 1044:O2|3,@1045 1045:S4|2e2e2e29 1046:O2|@1047,@44 1047:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@1049,@1048| 1048:D15,236|00802b363c1ae8000e0c000303051ae30002c82b35293b1ade000e0e0e0c00036403051ad60002b32b363c1ac2000e0e0e0c000303051ac70002a02b3529352a362e363c1abd000e0e0c0003293b1a9f000c000303051aaf00025e5647362a3c1aa1000e0e0c00032d2a69642a0c0002642a3c1a8e000e0e0e0c00032c2a6956783b1a87000c000356873656973756a7383b2c2c2c6b662a0e0c0002642a2a0e0e0c000264291a6700691a67002a691a66002a692f2a6927071a60002a693b3c3b3b2d6805293b691a55002a691a54002a693b3c3b3b2d6805270a420e0e0e0e00000000e400000000000000|@1051,I234,@1041,I251,@1052,@1041,I107,@1043,I253,@1056,@1058,@1059,@1060,@1058,@1050| 1049:S11|7072696e746c6973742829 1050:O5|0,0,0,@690,@1061 1051:S10|7072696e742d6c697374 1052:O5|0,0,0,@690,@1053 1053:O2|@1054,0 1054:O2|3,@1055 1055:S3|6e696c 1056:O2|@1057,0 1057:O2|3,41 1058:O3|1,1,0 1059:O2|3,44 1060:O2|3,40 1061:O2|@1062,0 1062:O2|3,@1063 1063:S2|3a3a 1064:O4|0,@1065,3,1 1065:O1|@1066 1066:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@1067,@45,I253| 1067:S13|7072696e742d636f6e74657874 1068:O1|@1069 1069:D47,772|00802b363c1a00030e0c000303051afb020fca2b3529353b1af5020e0e0c00036407d32b3529362d363c1ae7020c0003293b1ad3020c000303051adb020fd12a362a3c1ace020e0e0e0c00032a2a691aca023b1aca020e0e0e0c00032a2a0e0e0e0c0002642d3c1a9e020e0e0e0c000303051aaf020fdb2e382e3c1a96020e0e0e0c00032a2a691a92023b1a92020e0e0e0c00032a2a0e0e0e0c000264313d1a66020e0e0e0c000303051a7b0202d73235323c1a5e020e0e0e0c00032a2a691a6a023b1a5a020e0e0e0c00032a2a0e0e0e0c000264220c3e1a2d02020211020e0e0c000303051a47020282220d37220d3c1a2002020216010e0c00032a2a691a1a023b1a1a020e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1af2010e0e0e0c00032a2a691aee013b1aee010e0e0e0c00032a2a0e0e0e0c000264291aef01691aef012a691aee012a6902024b001ae9012a691ae8012a69322a691ae4012a691ae3012a69270f1ae0012a691adf012a692c2a691adb012a691ada012a6927091ad7012a691ad6012a692c2a691ad2012a691ad1012a6927091ace012a691acd012a692c2a691ac9012a691ac8012a6927091ac5012a693b3c3b3b2d68052a1abc010e0c00021ab9010e0e0c000203033b02013b0319291aac01691aac012a691aab012a693b3e3c3b2d680566020129293b691a9c012a691a9b012a693b3c3b3b2d6805270a0fdc2b363c1af4000e0c000303051a830102d12b3529362a372e363c1ae9000e0e0c0003293b1ad3000c000303051a6701025a293c1ad0000e0c00032c2a691ade003b1ace000e0e0e0c00032a2a0e0e0e0c0002642c3c1aae000e0e0e0c00032e2a691aba003b1aaa000e0e0e0c00032a2a0e0e0e0c000264291a1f01691a1f012a691a1e012a692f2a6927091a18012a693b3c3b3b2d68052a1adb000c00021ad9000e0e0c000203033b02013b0319291acc00691acc002a691acb002a693b3e3c3b2d680566020129293b691adc002a691adb002a693b3c3b3b2d020204006805270b420e0e0e0e0e0e0e00000000fc02000000000000|@1067,I234,@1041,I251,I107,@1071,@30,I253,@1071,@1071,@32,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,I105,I218,@1087,@1088,@1060,@1058,@1089,@1041,@1043,@1056,@1058,@1059,@1060,@1058,@1070| 1070:O5|0,0,0,@690,@1093 1071:O2|@1072,0 1072:O2|3,@1073 1073:S4|2e2e2e7d 1074:O2|@1075,0 1075:O2|3,125 1076:O2|3,@1077 1077:S15|7374617274506f736974696f6e203d 1078:O2|3,@1079 1079:S11|73746172744c696e65203d 1080:O2|3,@1081 1081:S6|66696c65203d 1082:O2|3,@1083 1083:S13|656e64506f736974696f6e203d 1084:O2|3,@1085 1085:S9|656e644c696e65203d 1086:O2|3,123 1087:O2|@1088,@1056 1088:O3|1,0,0 1089:O5|0,0,0,@690,@1090 1090:O2|@1091,0 1091:O2|3,@1092 1092:S15|436f6e746578744c6f636174696f6e 1093:O2|@1094,0 1094:O2|3,@1095 1095:S15|436f6e7465787450726f7065727479 1096:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@1040,I253| 1097:O5|0,0,0,@690,@1098 1098:O2|@1099,0 1099:O2|3,@1007 1100:O5|0,0,0,@690,@1101 1101:O2|@1102,0 1102:O2|3,@1015 1103:O5|0,0,0,@690,@1104 1104:O2|@1105,0 1105:O2|3,@967 1106:O5|0,0,0,@690,@1107 1107:O2|@1108,0 1108:O2|3,@1023 1109:O2|@1110,0 1110:O2|3,@1030 1111:O3|@1112,@690,@1113 1112:S6|707265747479 1113:O3|@1115,@1133,@1114 1114:O3|@1134,@717,@716 1115:O2|1,@1116 1116:O3|2,@1000,@1117 1117:O2|@1118,0 1118:O4|@34,69,@1119,0 1119:O3|2,4,@1120 1120:O6|@874,@850,@1121,@999,@982,@848 1121:O2|@894,@1122 1122:O2|@1124,@1123 1123:O2|@1130,@899 1124:O2|@1126,@1125 1125:O3|0,@1128,@876 1126:O2|1,@1127 1127:O2|2,18 1128:O8|@809,@1036,0,0,@1129,0,0,1 1129:O2|@741,@737 1130:O2|@1131,@855 1131:O2|1,@1132 1132:O2|2,19 1133:O4|1,@46,0,0 1134:S13|506f6c794d4c2e707265747479 1135:O2|@1137,@1136 1136:O2|@1138,0 1137:S12|707450726f70657274696573 1138:O4|@27,69,@1139,0 1139:O2|@1141,@1140 1140:O2|@1153,@1152 1141:O3|@1137,@690,@1142 1142:O3|@1144,@1150,@1143 1143:O3|@1151,@717,@716 1144:O2|1,@1145 1145:O3|2,@1146,0 1146:O4|0,@47,3,1 1147:O1|@1148 1148:D2,20|00801a1300420e0e000000000c00000000000000|@1149,@713| 1149:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f747970655072696e746572283129 1150:O4|1,@48,0,0 1151:S19|506f6c794d4c2e707450726f70657274696573 1152:O2|@1229,@1228 1153:O7|@1155,@1156,@1157,@1154,@690,0,0 1154:O3|2,@1174,@1173 1155:S12|5054627265616b506f696e74 1156:O2|0,14 1157:O2|1,@1158 1158:O3|14,@1159,0 1159:O2|@1161,@1160 1160:O2|@1165,@1164 1161:O2|7,@1162 1162:O8|@1163,@1155,0,0,@737,0,0,1 1163:O4|13,0,@993,13 1164:O2|@1170,0 1165:O2|7,@1166 1166:O8|@1167,@1155,0,0,@737,0,0,1 1167:O3|14,@1168,1 1168:O2|@809,@1169 1169:O2|@739,0 1170:O2|7,@1171 1171:O8|@1172,@1155,0,0,@737,0,0,1 1172:O4|6,@739,1,1 1173:O5|5,0,@1137,@1141,@690 1174:O5|5,@1176,@1177,@1175,@690 1175:O3|@1177,@690,@1178 1176:O2|@693,0 1177:S3|726566 1178:O3|@1180,@1227,@1179 1179:O3|@1177,@717,@716 1180:O2|1,@1181 1181:O3|2,@1183,@1182 1182:O2|@1199,0 1183:O4|@1185,@49,@1194,@1184 1184:O1|@1197 1185:O1|@1186 1186:D2,20|00801a1300420e0e000000000c00000000000000|@1187,I251| 1187:S11|65712d68656c7065722829 1188:O1|@1189 1189:D2,20|00801a1300420e0e000000000c00000000000000|@1191,@1190| 1190:O1|@1192 1191:S37|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129 1192:D2,20|00801a1300420e0e000000000c00000000000000|@1193,@713| 1193:S40|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129283129 1194:O1|@1195 1195:D1,20|00803d420e0e0e0e000000000c00000000000000|@1196| 1196:S14|626f7865642d68656c7065722829 1197:D1,20|00803c420e0e0e0e000000000c00000000000000|@1198| 1198:S13|73697a652d68656c7065722829 1199:O4|@34,69,@1200,0 1200:O3|2,4,@1201 1201:O5|@890,@1203,@1226,@1202,@848 1202:O4|@1183,@1185,@1194,@1184 1203:O2|@894,@1204 1204:O2|@1206,@1205 1205:O2|@1212,@1211 1206:O2|@1208,@1207 1207:O3|0,@1210,@876 1208:O2|1,@1209 1209:O2|2,0 1210:O8|@802,@1187,0,0,@737,0,0,1 1211:O2|@1215,@1214 1212:O2|@1213,@855 1213:O3|0,@49,0 1214:O2|@1221,0 1215:O2|@1217,@1216 1216:O3|0,@1219,@876 1217:O2|1,@1218 1218:O2|2,1 1219:O8|@1220,@1196,0,0,@737,0,0,1 1220:O3|2,2,0 1221:O2|@1223,@1222 1222:O3|0,@1225,@876 1223:O2|1,@1224 1224:O2|2,2 1225:O8|@742,@1198,0,0,@737,0,0,1 1226:O3|2,2,2 1227:O4|1,@50,1,0 1228:O2|@1377,@1376 1229:O7|@1231,@1156,@1232,@1230,@690,0,0 1230:O3|2,@1246,@1173 1231:S13|5054636f6d706c6574696f6e73 1232:O2|1,@1233 1233:O3|14,@1234,0 1234:O2|@1236,@1235 1235:O2|@1240,@1239 1236:O2|7,@1237 1237:O8|@1238,@1231,0,0,@737,0,0,1 1238:O4|13,1,@993,13 1239:O2|@1244,0 1240:O2|7,@1241 1241:O8|@1242,@1231,0,0,@737,0,0,1 1242:O3|14,@1243,1 1243:O2|@742,@1169 1244:O2|7,@1245 1245:O8|@1172,@1231,0,0,@737,0,0,1 1246:O5|5,@1248,@1249,@1247,@690 1247:O3|@1249,@690,@1250 1248:O2|@767,0 1249:S4|6c697374 1250:O3|@1252,@1375,@1251 1251:O3|@1249,@717,@716 1252:O2|1,@1253 1253:O3|2,@1255,@1254 1254:O2|@1267,0 1255:O4|@1257,@44,@1262,@1256 1256:O1|@1265 1257:O1|@1258 1258:D2,20|00801a13002c6942000000000c00000000000000|@1260,@1259| 1259:D4,116|00812c2c2a2a1a6f000c000303033c02502a1a67000c00021a65000e0e0c0002033e291a56000e0e0e0c00021a51000e0e0c000203272a352b362b352c365667352d2c2b0e0c000364030d2b2a2506250626041e4f3b02013b270402013b02013b65430e0e0e0e0e000000006c00000000000000|@1261,I251,I105,I218| 1260:S13|65712d6c697374283229285029 1261:S10|65712d6c697374283229 1262:O1|@1263 1263:D1,20|00803e420e0e0e0e000000000c00000000000000|@1264| 1264:S10|626f7865642d6c697374 1265:D1,20|00803c420e0e0e0e000000000c00000000000000|@1266| 1266:S9|73697a652d6c697374 1267:O4|@34,69,@1268,0 1268:O3|2,4,@1269 1269:O6|@874,@850,@1271,@1363,@1270,@848 1270:O12|@1365,@1368,@1370,@1367,@1366,@1373,@1364,@1257,@44,@1262,@1256,@1255 1271:O2|@894,@1272 1272:O2|@1274,@1273 1273:O2|@1352,@1351 1274:O2|@1276,@1275 1275:O3|0,@1278,@876 1276:O2|1,@1277 1277:O2|2,6 1278:O8|@1280,@1260,0,0,@1279,0,0,1 1279:O2|@1344,0 1280:O2|7,@1281 1281:O8|@1283,@1261,0,@1343,@1282,0,10,1 1282:O2|@846,@840 1283:O3|0,@1285,@1284 1284:O2|@1339,@1338 1285:O4|1,@1287,@742,@1286 1286:O4|1,@1297,@1296,@809 1287:O4|3,@1288,@802,1 1288:O2|@1290,@1289 1289:O2|@1293,0 1290:O2|@1291,1 1291:O2|4,@1292 1292:O2|2,4 1293:O2|@1294,1 1294:O2|4,@1295 1295:O2|2,5 1296:O4|1,@1303,@1302,@809 1297:O4|3,@1298,@813,1 1298:O2|@1299,0 1299:O2|@1300,1 1300:O4|3,@1301,@817,1 1301:O2|@1290,0 1302:O3|10,@1308,@1307 1303:O4|3,@1304,@813,1 1304:O2|@1305,0 1305:O2|@1306,1 1306:O4|3,@1289,@817,1 1307:O4|1,@1321,@1320,@809 1308:O2|@1310,@1309 1309:O2|@1313,@1312 1310:O4|1,@845,6,@1311 1311:O4|6,@1291,0,1 1312:O2|@1316,@1315 1313:O4|1,@845,7,@1314 1314:O4|6,@1291,1,1 1315:O2|@1318,0 1316:O4|1,@845,8,@1317 1317:O4|6,@1294,0,1 1318:O4|1,@845,9,@1319 1319:O4|6,@1294,1,1 1320:O2|9,@1330 1321:O4|3,@1323,@1322,1 1322:O4|6,@1329,0,0 1323:O2|@1325,@1324 1324:O2|@1327,0 1325:O2|@1326,1 1326:O2|4,@1277 1327:O2|@1328,1 1328:O2|4,@989 1329:O2|4,@741 1330:O2|@1332,@1331 1331:O2|@1335,0 1332:O2|@1333,1 1333:O2|4,@1334 1334:O2|2,7 1335:O2|@1336,1 1336:O2|4,@1337 1337:O2|2,9 1338:O2|@1341,0 1339:O2|@1340,1 1340:O3|@847,4,@739 1341:O2|@1342,1 1342:O3|@847,5,@807 1343:O2|@740,0 1344:O2|1,@1345 1345:O2|@1346,0 1346:O3|2,0,@1347 1347:O2|@1348,0 1348:O3|0,@845,@1349 1349:O2|@1326,@1350 1350:O2|@1328,0 1351:O2|@1355,@1354 1352:O2|@1353,@855 1353:O2|1,@1334 1354:O2|@1359,0 1355:O2|@988,@1356 1356:O3|0,@1357,@876 1357:O8|@1358,@1264,0,0,@737,0,0,1 1358:O3|2,3,0 1359:O2|@1361,@1360 1360:O3|0,@1362,@876 1361:O2|1,@1337 1362:O8|@742,@1266,0,0,@737,0,0,1 1363:O11|2,2,2,2,2,2,2,1,2,2,2 1364:O2|@1373,0 1365:O3|@1255,@1366,@1364 1366:O3|@1368,@1370,@1367 1367:O1|@1372 1368:O1|@1369 1369:D3,36|00802b1a22000e0e0e0c00021a1d002c0e8000020e0e0e0e000000001c00000000000000|@1063,I105,I218| 1370:O1|@1371 1371:D1,28|00802b352c362a2a6965420e0e0e0e0e000000001400000000000000|@1063| 1372:D1,28|00802b352c362a2a6965420e0e0e0e0e000000001400000000000000|@1063| 1373:O1|@1374 1374:D2,28|00802b3b1a19002d7e0300030e0e0e0e000000001400000000000000|@1055,I251| 1375:O4|1,@51,1,0 1376:O2|@1424,@1423 1377:O7|@1379,@1156,@1380,@1378,@690,0,0 1378:O3|2,@1394,@1173 1379:S12|50546465636c617265644174 1380:O2|1,@1381 1381:O3|14,@1382,0 1382:O2|@1384,@1383 1383:O2|@1388,@1387 1384:O2|7,@1385 1385:O8|@1386,@1379,0,0,@737,0,0,1 1386:O4|13,2,@993,13 1387:O2|@1392,0 1388:O2|7,@1389 1389:O8|@1390,@1379,0,0,@737,0,0,1 1390:O3|14,@1391,1 1391:O2|@1220,@1169 1392:O2|7,@1393 1393:O8|@1172,@1379,0,0,@737,0,0,1 1394:O5|5,0,@1396,@1395,@690 1395:O3|@1396,@690,@1397 1396:S8|6c6f636174696f6e 1397:O3|@961,@1399,@1398 1398:O3|@1422,@717,@716 1399:O3|2,0,@1400 1400:O3|3,@1402,@1401 1401:O3|0,@1417,1 1402:O2|@1404,@1403 1403:O2|@1407,@1406 1404:O2|@1405,@767 1405:S4|66696c65 1406:O2|@1410,@1409 1407:O2|@1408,@768 1408:S7|656e644c696e65 1409:O2|@1413,@1412 1410:O2|@1411,@768 1411:S9|73746172744c696e65 1412:O2|@1415,0 1413:O2|@1414,@768 1414:S11|656e64506f736974696f6e 1415:O2|@1416,@768 1416:S13|7374617274506f736974696f6e 1417:O2|@1405,@1418 1418:O2|@1408,@1419 1419:O2|@1411,@1420 1420:O2|@1414,@1421 1421:O2|@1416,0 1422:S15|506f6c794d4c2e6c6f636174696f6e 1423:O2|@1442,@1441 1424:O7|@1426,@1156,@1427,@1425,@690,0,0 1425:O3|2,@768,@1173 1426:S7|50546465664964 1427:O2|1,@1428 1428:O3|14,@1429,0 1429:O2|@1431,@1430 1430:O2|@1435,@1434 1431:O2|7,@1432 1432:O8|@1433,@1426,0,0,@737,0,0,1 1433:O4|13,3,@993,13 1434:O2|@1439,0 1435:O2|7,@1436 1436:O8|@1437,@1426,0,0,@737,0,0,1 1437:O3|14,@1438,1 1438:O2|@1358,@1169 1439:O2|7,@1440 1440:O8|@1172,@1426,0,0,@737,0,0,1 1441:O2|@1483,@1482 1442:O7|@1444,@1156,@1445,@1443,@690,0,0 1443:O3|2,@1459,@1173 1444:S12|505466697273744368696c64 1445:O2|1,@1446 1446:O3|14,@1447,0 1447:O2|@1449,@1448 1448:O2|@1453,@1452 1449:O2|7,@1450 1450:O8|@1451,@1444,0,0,@737,0,0,1 1451:O4|13,4,@993,13 1452:O2|@1457,0 1453:O2|7,@1454 1454:O8|@1455,@1444,0,0,@737,0,0,1 1455:O3|14,@1456,1 1456:O2|@836,@1169 1457:O2|7,@1458 1458:O8|@1172,@1444,0,0,@737,0,0,1 1459:O3|2,@1461,@1460 1460:O5|5,0,@1470,@1469,@690 1461:O5|5,0,@1463,@1462,0 1462:O3|@1463,@690,@1464 1463:S4|756e6974 1464:O3|@961,@1466,@1465 1465:O3|@1463,@717,@1463 1466:O3|2,0,@1467 1467:O3|3,0,@1468 1468:O3|0,0,1 1469:O3|@1470,@690,@1471 1470:S9|706172736554726565 1471:O3|@961,@1473,@1472 1472:O3|@1481,@717,@716 1473:O3|2,0,@1474 1474:O3|3,@1475,@695 1475:O2|@1477,@1476 1476:O2|@1478,0 1477:O2|49,@1394 1478:O2|50,@1479 1479:O5|5,@1480,@1249,@1247,@690 1480:O2|@1173,0 1481:S16|506f6c794d4c2e706172736554726565 1482:O2|@1501,@1500 1483:O7|@1485,@1156,@1484,@1443,@690,0,0 1484:O2|1,@1486 1485:S13|50546e6578745369626c696e67 1486:O3|14,@1487,0 1487:O2|@1489,@1488 1488:O2|@1493,@1492 1489:O2|7,@1490 1490:O8|@1491,@1485,0,0,@737,0,0,1 1491:O4|13,5,@993,13 1492:O2|@1498,0 1493:O2|7,@1494 1494:O8|@1495,@1485,0,0,@737,0,0,1 1495:O3|14,@1496,1 1496:O2|@1497,@1169 1497:O3|2,5,0 1498:O2|7,@1499 1499:O8|@1172,@1485,0,0,@737,0,0,1 1500:O2|@1519,@1518 1501:O7|@1503,@1156,@1502,@1378,@690,0,0 1502:O2|1,@1504 1503:S10|50546f70656e65644174 1504:O3|14,@1505,0 1505:O2|@1507,@1506 1506:O2|@1511,@1510 1507:O2|7,@1508 1508:O8|@1509,@1503,0,0,@737,0,0,1 1509:O4|13,6,@993,13 1510:O2|@1516,0 1511:O2|7,@1512 1512:O8|@1513,@1503,0,0,@737,0,0,1 1513:O3|14,@1514,1 1514:O2|@1515,@1169 1515:O3|2,6,0 1516:O2|7,@1517 1517:O8|@1172,@1503,0,0,@737,0,0,1 1518:O2|@1537,@1536 1519:O7|@1521,@1156,@1520,@1443,@690,0,0 1520:O2|1,@1522 1521:S8|5054706172656e74 1522:O3|14,@1523,0 1523:O2|@1525,@1524 1524:O2|@1529,@1528 1525:O2|7,@1526 1526:O8|@1527,@1521,0,0,@737,0,0,1 1527:O4|13,7,@993,13 1528:O2|@1534,0 1529:O2|7,@1530 1530:O8|@1531,@1521,0,0,@737,0,0,1 1531:O3|14,@1532,1 1532:O2|@1533,@1169 1533:O3|2,7,0 1534:O2|7,@1535 1535:O8|@1172,@1521,0,0,@737,0,0,1 1536:O2|@1555,@1554 1537:O7|@1539,@1156,@1538,@1443,@690,0,0 1538:O2|1,@1540 1539:S17|505470726576696f75735369626c696e67 1540:O3|14,@1541,0 1541:O2|@1543,@1542 1542:O2|@1547,@1546 1543:O2|7,@1544 1544:O8|@1545,@1539,0,0,@737,0,0,1 1545:O4|13,8,@993,13 1546:O2|@1552,0 1547:O2|7,@1548 1548:O8|@1549,@1539,0,0,@737,0,0,1 1549:O3|14,@1550,1 1550:O2|@1551,@1169 1551:O3|2,8,0 1552:O2|7,@1553 1553:O8|@1172,@1539,0,0,@737,0,0,1 1554:O2|@1575,@1574 1555:O7|@1557,@1156,@1558,@1556,@690,0,0 1556:O3|2,@1573,@1173 1557:S7|50547072696e74 1558:O2|1,@1559 1559:O3|14,@1560,0 1560:O2|@1562,@1561 1561:O2|@1566,@1565 1562:O2|7,@1563 1563:O8|@1564,@1557,0,0,@737,0,0,1 1564:O4|13,9,@993,13 1565:O2|@1571,0 1566:O2|7,@1567 1567:O8|@1568,@1557,0,0,@737,0,0,1 1568:O3|14,@1569,1 1569:O2|@1570,@1169 1570:O3|2,9,0 1571:O2|7,@1572 1572:O8|@1172,@1557,0,0,@737,0,0,1 1573:O3|2,@768,@970 1574:O2|@1615,@1614 1575:O7|@1577,@1156,@1578,@1576,@690,0,0 1576:O3|2,@1607,@1173 1577:S12|50547265666572656e636573 1578:O2|1,@1579 1579:O3|14,@1580,0 1580:O2|@1582,@1581 1581:O2|@1586,@1585 1582:O2|7,@1583 1583:O8|@1584,@1577,0,0,@737,0,0,1 1584:O4|13,10,@993,13 1585:O2|@1598,0 1586:O2|7,@1587 1587:O8|@1588,@1577,0,0,@737,0,0,1 1588:O4|3,@818,@1589,1 1589:O2|7,@1590 1590:O8|@1592,@1591,0,0,@737,0,0,1 1591:S6|3c616e6f6e3e 1592:O3|14,@1593,1 1593:O2|@1595,@1594 1594:O2|@993,@1596 1595:O3|2,10,0 1596:O2|@1597,0 1597:O4|6,@739,1,0 1598:O2|7,@1599 1599:O8|@1600,@1577,0,0,@737,0,0,1 1600:O4|3,@818,@1601,1 1601:O2|7,@1602 1602:O8|@1603,@1591,0,0,@737,0,0,1 1603:O3|14,@1604,0 1604:O2|@1172,@1605 1605:O2|@1606,0 1606:O4|6,@739,2,1 1607:O3|3,@1608,@695 1608:O2|@1610,@1609 1609:O2|@1611,0 1610:O2|49,@693 1611:O2|50,@1612 1612:O5|5,@1613,@1249,@1247,@690 1613:O2|@1394,0 1614:O2|@1633,@1632 1615:O7|@1617,@1156,@1616,@1425,@690,0,0 1616:O2|1,@1618 1617:S7|50547265664964 1618:O3|14,@1619,0 1619:O2|@1621,@1620 1620:O2|@1625,@1624 1621:O2|7,@1622 1622:O8|@1623,@1617,0,0,@737,0,0,1 1623:O4|13,11,@993,13 1624:O2|@1630,0 1625:O2|7,@1626 1626:O8|@1627,@1617,0,0,@737,0,0,1 1627:O3|14,@1628,1 1628:O2|@1629,@1169 1629:O3|2,11,0 1630:O2|7,@1631 1631:O8|@1172,@1617,0,0,@737,0,0,1 1632:O2|@1650,0 1633:O7|@1635,@1156,@1634,@1378,@690,0,0 1634:O2|1,@1636 1635:S13|50547374727563747572654174 1636:O3|14,@1637,0 1637:O2|@1639,@1638 1638:O2|@1643,@1642 1639:O2|7,@1640 1640:O8|@1641,@1635,0,0,@737,0,0,1 1641:O4|13,12,@993,13 1642:O2|@1648,0 1643:O2|7,@1644 1644:O8|@1645,@1635,0,0,@737,0,0,1 1645:O3|14,@1646,1 1646:O2|@1647,@1169 1647:O3|2,12,0 1648:O2|7,@1649 1649:O8|@1172,@1635,0,0,@737,0,0,1 1650:O7|@1652,@1156,@1653,@1651,@690,0,0 1651:O3|2,@1668,@1173 1652:S6|505474797065 1653:O2|1,@1654 1654:O3|14,@1655,0 1655:O2|@1657,@1656 1656:O2|@1661,@1660 1657:O2|7,@1658 1658:O8|@1659,@1652,0,0,@737,0,0,1 1659:O4|13,13,@993,13 1660:O2|@1666,0 1661:O2|7,@1662 1662:O8|@1663,@1652,0,0,@737,0,0,1 1663:O3|14,@1664,1 1664:O2|@1665,@1169 1665:O3|2,13,0 1666:O2|7,@1667 1667:O8|@1172,@1652,0,0,@737,0,0,1 1668:O5|5,0,@1670,@1669,@690 1669:O3|@1670,@690,@1671 1670:S14|7479706545787072657373696f6e 1671:O3|@1673,@1676,@1672 1672:O3|@1677,@717,@716 1673:O2|1,@1674 1674:O3|2,@1675,0 1675:O4|0,@52,3,1 1676:O4|1,@53,0,0 1677:S38|506f6c794d4c2e4e616d6553706163652e56616c7565732e7479706545787072657373696f6e 1678:O2|@1015,@1679 1679:O2|@1680,0 1680:O4|@23,69,@1681,0 1681:O7|@1015,@1683,@1684,@1682,@690,0,0 1682:O3|2,@1730,@970 1683:O2|0,5 1684:O2|1,@1685 1685:O3|2,@1011,@1686 1686:O2|@1687,0 1687:O4|@34,69,@1688,0 1688:O3|2,3,@1689 1689:O6|@874,@850,@1690,@999,@982,@848 1690:O2|@894,@1691 1691:O2|@1693,@1692 1692:O2|@1699,@1698 1693:O2|@1695,@1694 1694:O3|0,@1696,@876 1695:O2|1,@1292 1696:O8|@1697,@1015,0,0,@991,0,0,1 1697:O4|13,1,@993,4 1698:O2|@1719,0 1699:O2|@1701,@1700 1700:O3|0,@1702,@876 1701:O2|1,@1295 1702:O8|@1704,@1015,0,0,@1703,0,2,1 1703:O2|@1715,0 1704:O3|10,@1706,@1705 1705:O3|14,@1710,1 1706:O2|@1708,@1707 1707:O2|@1709,0 1708:O4|1,@845,0,@993 1709:O4|1,@845,1,@1597 1710:O2|@742,@1711 1711:O2|@1713,@1712 1712:O2|@1714,0 1713:O2|4,@1209 1714:O2|4,@1218 1715:O2|1,@1716 1716:O2|@996,@1717 1717:O2|@1718,0 1718:O3|2,1,@845 1719:O2|@1276,@1720 1720:O3|0,@1721,@876 1721:O8|@1723,@1015,0,0,@1722,0,2,1 1722:O2|@1729,0 1723:O3|10,@1725,@1724 1724:O3|14,@1711,0 1725:O2|@1727,@1726 1726:O2|@1728,0 1727:O4|1,@922,0,@1172 1728:O4|1,@922,1,@1606 1729:O2|1,@843 1730:O3|3,@1731,@695 1731:O2|@1733,@1732 1732:O2|@1734,0 1733:O2|49,@768 1734:O2|50,@768 1735:O2|@1617,@1736 1736:O2|@1737,0 1737:O4|@23,69,@1615,0 1738:O2|@1539,@1739 1739:O2|@1740,0 1740:O4|@23,69,@1537,0 1741:O2|@1743,@1742 1742:O2|@1744,0 1743:S10|6d616b65737472696e67 1744:O4|@23,69,@1745,0 1745:O7|@1743,2,@1747,@1746,@690,0,0 1746:O3|2,@1748,@767 1747:O2|3,5 1748:O3|6,@54,79993 1749:O2|@1751,@1750 1750:O2|@1752,0 1751:S9|4e616d655370616365 1752:O4|@38,69,@1753,0 1753:O4|@1751,@961,@1754,@690 1754:O6|@1756,I48,0,@690,@1755,0 1755:O1|@6135 1756:O4|1,@56,@57,@55 1757:O1|@1758 1758:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 1759:O2|@6079,@6078 1760:O2|@1762,@1761 1761:O2|@1763,0 1762:S8|46756e63746f7273 1763:O4|@38,69,@1764,0 1764:O4|@1762,@961,@1765,@690 1765:O6|@1767,I48,0,@690,@1766,0 1766:O1|@5773 1767:O4|1,@60,@61,@59 1768:O1|@1769 1769:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 1770:O2|@5750,@5749 1771:O2|@1773,@1772 1772:O2|@1774,0 1773:S10|70726f70657274696573 1774:O4|@23,69,@1775,0 1775:O7|@1773,2,@1777,@1776,@690,0,0 1776:O3|2,@1793,@1479 1777:O2|1,@1778 1778:O3|2,@1779,0 1779:O1|@1780 1780:D2,28|00802b39291a18002d0e0e0e7d040002000000001400000000000000|@1782,@1781| 1781:O1|@1783 1782:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7246756e63746f72283129 1783:D6,204|00802b1aca000e0e0e0c00021ac5000e0e0c000203a12b352c362a353d1ab8000e0c0003031a2a36280b2a69291aa0000e0c000203041aa300103b50296502662a353e1a92000e0e0e0c0003031a2a36280c2a69291a78000e0c000203041a7b00103b502965023e2a353c1a6a000e0e0e0c0003031a2a3628062a69291a50000e0c000203041a5300103b50296502162a363d2a69291a37000c000203041a3b00103b5029652a1a36000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e00000000c400000000000000|@1785,I105,I218,I251,@1784,@1781| 1784:O4|@63,@1790,@1791,@1786 1785:S13|4c6973742e6d61702832292829 1786:O5|@1792,111,0,111,0 1787:O1|@1788 1788:O1|@1789 1789:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@862,@9,I253| 1790:S4|43617374 1791:S9|746f41646472657373 1792:S35|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f416464726573732e4d4c 1793:O5|5,0,@1795,@1794,@690 1794:O3|@1795,@690,@1796 1795:S10|66756e63746f7256616c 1796:O3|@1798,@1801,@1797 1797:O3|@1802,@717,@716 1798:O2|1,@1799 1799:O3|2,@1800,0 1800:O4|0,@64,3,1 1801:O4|1,@65,0,0 1802:S36|506f6c794d4c2e4e616d6553706163652e46756e63746f72732e66756e63746f7256616c 1803:O2|@1805,@1804 1804:O2|@1806,0 1805:S5|7072696e74 1806:O4|@23,69,@1807,0 1807:O7|@1805,2,@1809,@1808,@690,0,0 1808:O3|2,@5439,@970 1809:O2|1,@1810 1810:O3|2,@1811,0 1811:O1|@1812 1812:D7,76|00802b352c362d37291a44000e0c00021a41000e0e0c0002031229351a39002a691a38002b692a2a696602031a31002c2c2b1a2f00320e7b050700040e0e0e0e000000004400000000000000|@1814,I105,I218,@1815,@1817,@1818,@1813| 1813:O1|@1823 1814:S56|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617946756e63746f7273283129 1815:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 1816:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d616b6554797065456e76283129283129 1817:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 1818:O2|@1820,@1819 1819:O1|@1822 1820:O1|@1821 1821:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 1822:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 1823:D25,820|00822d352e362f383039303b1a29030e0e0c000303051a23030fd42c3729352e35291a1b031a1c030e0c000303033c0222291a13030c00021a11030e0e0c00020310293b1af9023b3f1a04030e0c000602013b1af6020e0e0e0c000203363e2a69291ae3020c000203041ae702103b50291ae402693b3b3b3b2d6805291ac8020e0c000203041acb02103b50291acc02696602013b343c1ac6020e0e0e0c00032d36291a9a021a9b020c000303033c0222291a93020c00021a91020e0e0c00020310293b1a79023b3f1a84020e0c000602013b03112e2b3b220f3b1a86020e0e0e0c000602183e2a69291a5b02020232020c000203041a5b02103b502964291a660269293b1a3c020e0c000303032d020b2d2a1a56020e0e0e0c00032f1a20021a21020e0e0c000303033c02222f1a17020c00021a15020e0e0c000203102f3b1afd013b3f1a08020e0c000602013b0327040d00312a1a17020c0003502923082a230c1a0e0222132c6a1a0b0222142c6a2a2a6927050210220f351afe01220e2212336b2a2a696533291abb010c00021ab9010e0e0c0002031f29352a362a353b1aa0010e0c000303052a68010207292503511e2a3b6502013b64291a89010e0e0c00021a85010e0e0c00020311293529353b1a6e010e0e0e0c00036402013b031c293529363b2a69291a5b010c000203041a8b01103b50293b696602013b3e220f69291a41010e0e0c000203041a4301103b50293b693b3b3b2e2d6805291a26010e0e0e0c000203041a2701103b50291a5001691a50012a691a4f012a693b3b3b3b2d6805291afe000e0e0e0c000203041aff00103b503b3b3b3b220e6805291ae4000e0c000203041ae700103b50293b691a1a012a692c2a693b3b3b3b2d6805291ac2000e0e0e0c000203041ac300103b50221f3c1ac6000e0e0e0c0003221a36291a99001a9a000e0e0e0c000303033c0222291a8f000c00021a8d000e0e0c00020310293b1a75003b3f1a80000e0c000602013b0311221b2b3c22133b1a81000e0e0c000602143e2a69291a57000c000203041a5b00103b502964293b691a90002a692e2a693b3b3b3b2d6805291a34000e0c000203041a3700103b5029271f2704440e0e000000002c03000000000000|@1825,I232,@1041,I48,I251,I105,I218,I154,@1784,@1826,@1829,I107,@1831,@5425,@5429,@1835,@5431,@5433,@5434,@1784,@5435,@1058,@5437,@1824,@1824| 1824:O3|1,0,2 1825:S30|56414c55455f4f505328292e646973706c617946756e63746f7273283329 1826:O2|@1088,@1827 1827:O2|@1828,0 1828:O2|3,58 1829:O2|@1830,0 1830:O3|1,1,2 1831:O1|@1832 1832:D22,308|00842f3530392e352f36040d002d2a1a26010e0e0e0c0003502923082a230c321a19010e0e0c00021a15010e0e0c0002030e32351a0d01302b6a2968016502032e68011a02012a302e6b1aff002b302e6b2a2a692b2b6922113c1af3000c000303051aef00028f3c28403b1aea000e0e0e0c00041ae5002a69220d3b2b1ae0000e0c0004502a3b1ada000e0e0e0c0003291ad4001ad5000e0e0c0003293b2a1a9a000e0e0e0c00021a95000e0e0c000203412a352b362a352b36221b1ab100220d2211220e1aac000e0c00082c3b1aa7000c0003030329020b292d1a9e000e0e0e0c00032b2a2506250626041e4e3b27040201292706291a86000e0e0e0c00021a81002a693b3b3c3b2d6805291a2c000e0c000203041a6f00103b502927101f050e0e0e0e0e0e0e000000002c01000000000000|@1834,@1835,I105,I218,@1907,@1971,@1973,I232,@1974,I11,@1976,@1898,I253,@1977,@1982,@1831,@1992,I251,@5420,@5422,@1833,@1784| 1833:O2|3,@5424 1834:S25|56414c55455f4f505328292e646973706c6179536967283529 1835:O7|@1836,@23,@27,@67,@38,@68,@66 1836:D14,148|00811a930056172e6a1a900056282f6a1a8d005639306a1a8a00564a316a1a8700565b326a1a8400566c336a1a81003356876a1a7e003456986a1a7b00220c56a96a1a7700220d56ba6a1a7300220e56cb6a1a6f00220f56dc6a1a6b0056d722116a220f2e452c4630472f483449324a220d4b2b4c220c24082a24092d240a31240b33240c270d43000000008c00000000000000|@1838,@1839,@1856,@1857,@1858,@1859,@1860,@1861,@1883,@1886,@1889,@1892,@1895,@1837| 1837:D3,36|00801a230056176956183b2b1a1d002f0e0e0e7b05040004000000001c00000000000000|@1899,@1900,@1898| 1838:S24|5354525543545f56414c5328292e6d616b65456e76283129 1839:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1840:O4|101,@1854,0,@1853 1841:S31|5354525543545f56414c5328292e6d616b654c6f6f6b283129283129283129 1842:O1|@1843 1843:D5,92|00812c353b1a58000e0c000303162c362d372d2b0e0c00022a2f1a4700300e7b050600042c362d382a3b1a3b000c00032a3b1a33000c00032f2b0e0e0e0c00022a311a2700320e7b050800040e0e0e0e000000005400000000000000|@1845,I251,@1846,I253,@1844| 1844:O1|@1849 1845:S20|486173685461626c652e68617368537562283229 1846:O1|@1847 1847:D14,244|00822d1af2000e0e0e0c00021aed000e0e0c000203033c02102c1ae3000c00022e2a1adf000c00036403041ada00103b502c2e1ad6000e0e0e0c0003291ab8000e0c00021ab5000e0e0c0002039529352a362e2b1ab9000e0e0c000303033c024a2e1a93000c00021a91000e0e0c000203142a1a82000e0e0e0c00021a7d000e0e0c000202013b03212e3b2c3b3f2f1a82000e0e0e0c00021a7d000e0e0c00031a79000e0e0c000602013b0305296801022e303b1a69000e0e0c0003030c2f1a3e000e0e0e0c0002020130293c1a54000e0c00036430301a4e00317b050800046502013b64440e0e00000000ec00000000000000|@1848,I105,I218,I15,I247,@866,I253,I251,I223,I239,I154,I113,I107,@1846| 1848:S27|486173685461626c652e6861736853756228322966696e64283129 1849:D15,252|00822d3b1af9000e0e0c000303033c02142c3b1aee000e0e0e0c00032e2a1ae7000c00036403041ae200103b502d3c1ade000e0e0e0c00032d2a1ac7000c0003291ad0000e0c00021acd000e0e0c0002039529352a362f2b1ac1000e0e0c000303033c024a2f1aab000c00021aa9000e0e0c000203142a1a9a000e0e0e0c00021a95000e0e0c000202013b03212f3b2c3b3f2f1a8a000e0e0e0c00021a85000e0e0c00031a81000e0e0c000602013b0305296801022e313b1a71000e0e0c0003030c303b1a3d000e0e0c0003020131293c1a5c000e0c00036431311a5600327b050900046502013b65440e0e0e0e0e0e00000000f400000000000000|@1848,I234,I253,I231,@1850,I106,I105,I218,I251,I223,I239,I154,I113,I107,@1844| 1850:O4|11,@316,0,@1851 1851:O5|@1852,143,0,143,0 1852:S17|2e2f62617369732f41727261792e736d6c 1853:O5|@1855,56,0,56,0 1854:S5|4d61746368 1855:S20|2e2f62617369732f556e6976657273616c2e4d4c 1856:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1857:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1858:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1859:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1860:D6,132|008056082c1a80000e0c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a352956771a56000e0e0e0c000364031f2a3556671a46000e0e0e0c000303043b5002041a3b00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@1841,@1842,I105,I218,I251,@1840| 1861:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1864,@1862| 1862:O1|@1867 1863:S32|5354525543545f56414c5328292e6d616b65456e746572283129283129283129 1864:O1|@1865 1865:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1864| 1866:S36|556e6976657273616c5461626c652e756e6976456e746572283429736561726368283129 1867:D24,468|00822d353c1ad0010e0c000303043b5002221ac7012d1ac7010c0003291ac4011abd010e0e0c000328671abb012b1abb016b65102d362e372f38293b1ab1010e0e0c0003293b1aa7010c00032d3b1a9f010c0003322a0e0e0e0c00023333692d2b2b1a8f010c0004303b1a83010c0003293c1a83010c0003323b2b1a7e010e0e0e0c000450323b1a66010e0e0e0c00032928051a6a010e0e0e0c0003313f1a5f010c00032a2a1a5b010c00036607d32f3d1a4c010e0c0003293b1a4b010c000303033c020b291a43011a44010e0c000303041a3f01103b50293c1a1b010c00032928403b1a31010e0e0c0004293b2d1a0a010e0e0e0c0004501a20012c69220c3b2c1af7000c000450220e3b2b1aec000e0c000450343b1ad6000e0e0e0c0003293c1afb000c000329293b1ada000e0e0e0c000303033b0286293b1aca000e0e0e0c000303033c0214220e3b1aa1000e0e0c00032a2a1ab7000c00036403041ac200103b50293c1a8e000e0e0e0c0003220f2a1a7a000e0e0e0c0003291aa80002023f000e0c00021aa1000e0e0c0002031a293529331a97000c0003312a2d1a52000e0e0e0c0004260302023b502b3c1a6d000e0e0c00032503511e923b65270702013b270b440e00000000cc01000000000000|@1869,I251,@1870,@389,@1871,@407,@1872,I253,@1874,I106,I255,I108,I233,I234,16777214,I231,@1868,I11,@673,I107,@1850,I105,I218,@674| 1868:O4|4,@394,0,@1882 1869:S20|486173685461626c652e68617368536574283329 1870:S34|417474656d707420746f2073657420612076616c75652077697468206e616d652028 1871:S24|2920696e20612066726f7a656e2068617368207461626c65 1872:O5|@1873,128,0,128,0 1873:S37|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f486173685461626c652e4d4c 1874:O1|@1875 1875:D4,60|00822b1a3a000e0e0e0c00021a35000e0e0c000203122b352d2f2b2f1a2900300e0e0e7b060600053b440e0e0e0e0e0e000000003400000000000000|@1877,I105,I218,@1876| 1876:O1|@1878 1877:S31|486173685461626c652e68617368536574283329656e746572546162283329 1878:D17,364|00832e3b1a69010e0e0c000303033c02142d3b1a5e010e0e0e0c00032f2a1a57010c00036403041a5201103b502e3c1a4e010e0e0e0c00032e2a1a37010c0003291a40010e0c00021a3d010e0e0c000203ce293529301a33010c000303033c024a291a1f010c00021a1d010e0e0c000203142f1a0e010e0e0e0c00021a09010e0e0c000202013b0321293b313b3f341afe000e0e0e0c00021af9000e0e0c00031af5000e0e0c000602013b0343313b1abe000e0e0e0c000303033c0214303b1ab2000e0e0e0c0003322a1aab000c00036403041ac600103b50313c1aa2000e0e0e0c0003312a311ab600327b050a0004313b1aaf000c0003030c303b1a75000e0e0c0003020131293c1a9c000e0c0003643131311a9500320e0e0e7b06090005303b1a4b000c000303033c02142f3b1a42000e0e0e0c0003312a1a3b000c00036403041a5600103b50303c1a32000e0e0e0c0003302a301a4600317b05090004000000006401000000000000|@1880,I234,I253,I231,@1850,I106,I105,I218,I251,I223,I239,I154,@1879,I255,I113,I107,@1876| 1879:O4|11,@316,0,@1881 1880:S39|486173685461626c652e68617368536574283329656e746572546162283329656e746572283129 1881:O5|@1852,148,0,148,0 1882:O5|@1852,132,0,132,0 1883:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1884,@1862| 1884:O1|@1885 1885:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1884| 1886:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1887,@1862| 1887:O1|@1888 1888:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1887| 1889:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1890,@1862| 1890:O1|@1891 1891:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1890| 1892:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1893,@1862| 1893:O1|@1894 1894:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1893| 1895:D5,84|00802b352c36562828452b3b6b56372c1a45000e0e0c0003293b1a3f000c000303052a3b69020e29352956682d1a30000e0c00046456572e2b1a2800330e0e7b050800040e0e0e0e000000004c00000000000000|@1863,@1842,I251,@1896,@1862| 1896:O1|@1897 1897:D5,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a3529301a3f000c00036403052d2a690210292f2f1a32000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000004c00000000000000|@1866,I105,I218,I251,@1896| 1898:O1|@1902 1899:S35|5354525543545f56414c5328292e6d616b65416c6c4e616d6573283129283129283129 1900:D4,84|00822c2c2a1a50000e0c00021a4d000e0e0c000203292a352b362a352956671a3e000e0e0e0c0003640305312c6902012b2a2a2505250526031e353b6602012965440e0e0e0e0e0e000000004c00000000000000|@1901,I105,I218,I251| 1901:S38|556e6976657273616c5461626c652e666f6c64283329666f6c6448617368456e747279283329 1902:D10,172|00820402002e353b1aa5000e0e0c000303182e37291a9c000e0c00021a99002b692c2b452a462604021e2e38293b1a8b000c0003293b1a83000c00031a81002b692d2b452a46260529352a362f3b292d1a71000e0e0c000303032a023f292c0e0e0c0002291a60000e0c00021a5d000e0e0c0002031129352a362a2a2f220d0e0e0c00046502012b2b3c1a43000c00032a2a2505250526031e4a3b662705440e00000000a400000000000000|@1904,I251,I15,@1905,I253,@1903,I231,I105,I218,I106| 1903:D6,84|00802b3b1a51000e0e0c000303033c021456073b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356172a1a1e002e0e7e0400030e0e0e0e000000004c00000000000000|@1906,I234,I253,I231,@1850,I106| 1904:S17|486173685461626c652e666f6c64283329 1905:D7,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203033c021456071a3a000e0e0e0c00022c2a1a33000c00036403041a2e00103b5056072c1a29002d7e030003000000004400000000000000|@1906,I105,I218,I15,I247,@866,I253| 1906:S35|486173685461626c652e666f6c642833296765744974656d7c6c656e6774682d283129 1907:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 1908:O1|@1910 1909:S29|545950455f5452454528292e636f6d706f73654d617073283129283129 1910:D2,36|00822d2d0e0c00022c1a1c002d0e0e0e7e0500030e0e0e0e000000001c00000000000000|@1912,@1911| 1911:O1|@1913 1912:S26|545950455f5452454528292e636f6d706f73654d617073283329 1913:D7,108|00812c3629353d1a66000e0e0e0c0003032e29362a372f3530371a57001a5800326a1a57002a692d1a55002b1a55000e0e0c00043d302b6a2e2a2f6a2708021c29353c1a2a000e0e0e0c000303032d020b2938292e2e0e0e7d06000264430e0e000000006400000000000000|@1915,I251,@1916,@1911,@1918,@1950,@1914| 1914:O1|@1952 1915:S33|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129 1916:D2,52|00802b3629353c1a2e000e0e0e0c000303033b020f2c562856370e0e0e0c00032968016464420e0e000000002c00000000000000|@1917,I251| 1917:S42|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f70794964283129 1918:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@1920,@1921,@1924,@1919| 1919:O1|@1926 1920:S48|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129 1921:O1|@1922 1922:D1,20|00802b420e0e0e0e000000000c00000000000000|@1923| 1923:S51|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129283129 1924:O1|@1925 1925:D1,20|00802b420e0e0e0e000000000c00000000000000|@1923| 1926:D13,412|00853037293629353d1a94010e0c0003035f29362a372c352d371a87011a8801220e220d220d68052c1a80012b1a80010e0c00042d2a1a67010c0003030f220f342a35452a36462a3747640220220f35220d0e0e0e0c00023d302c6a2e2a2f6a221236220e2d452a462b47270427060fd82a320e0e0c0002291a38010e0c00021a35010e0e0c000207cf293534350402002a2a1a26010e0e0e0c000350293633291a10010e0c00021a0d010e0e0c0002038e29352a362a3729311a03010c000364036b2a350402002a2a1aef000c000350293629301ac8000e0c000303033c024a291acf000c00021acd000e0e0c000203142f1abe000e0e0e0c00021ab9000e0e0c000202013b0321293b313b3f341ab2000e0e0e0c00021aad000e0e0c00031aa9000e0e0c000602013b6602013b03052a68010207292503511e9a3b6502013b64293b1a5900020241000e0e0c0003031c220f35220d020224000e0e0c0002221036220c2b452a46304765020d2935342a35452a36462a3747642705020c332f2a35452a36462a37476464651f060e000000009401000000000000|@1928,I251,@1929,@1919,@1934,@1914,I105,I218,@1936,@1927,I223,I239,I154| 1927:O1|@1942 1928:S38|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529 1929:D2,52|00800403002c56281a2d005649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@1931,@1930| 1930:O1|@1932 1931:S53|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129 1932:D1,20|00802b420e0e0e0e000000000c00000000000000|@1933| 1933:S56|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129283129 1934:O1|@1935 1935:D1,20|00802b420e0e0e0e000000000c00000000000000|@1931| 1936:O1|@1937 1937:D11,300|00812c1a2a010e0e0e0c00023b2a1a23010c00030402002a293b1a1b010c00030311293b326a3b2e336a2c2b452a4626030279293c1a04010e0c0003311a00010e0c00020303310214293f1ae6000e0e0e0c0003322a1aeb000c00036429282e1ad5000e0e0c00031add000e0e0c000265030f293c1ac4000e0c000325011e66022a293b1ab5000e0e0c00033b2a336a2e3b1a9f000c0003292d1a9f000c00032d2a220d6a2f2d452a4626065029352a362a36293b1a80000e0c0003640309301a890045324602542a352b362c370403003c2c1a7a000e0e0e0c0003030a292d453b462b475002102b3c1a4f000c00032a2e452a462c475129352a362b372b2b2b1a50000e0c00043135323633371a43000c000422102b452a4627092705430e000000002401000000000000|@1939,I223,I239,I251,I240,I105,I252,I218,I48,I233,@1938| 1938:O1|@1940 1939:S27|5554494c49544945535f28292e73706c6974537472696e67283129 1940:D15,212|00822b1ad2000e0e0e0c00022e3b1acb000c0003030c2d2a1ac1000e0e0c000302013b03032c02982d3b1aaf000c000303051aab0002892d3c1aa0000e0c000303162e3f1a9d000e0e0c00032d2a1a97002f0e0e7e0700032d28081a86000e0e0e0c0003293c1a83000c0003293f1a7f000c0003291a7c001a7d000e0e0c000303041a7700103b502928413b1a71000e0e0c000429321a6b000c0003503f331a42000e0e0e0c0003312a2c3f220d1a57000c0006502a1a53000c0002502a270564440e0e0e0e0e0e00000000cc00000000000000|@1941,I223,I251,I48,I239,I252,I240,I241,16777215,I247,@391,I11,I151,I198,I47| 1941:S19|537562737472696e672e737472696e67283129 1942:D5,196|00812c3629353d1abe000e0e0e0c000303112c3629353d1aae000e0e0e0c00036402013b6403192c3629372d3629372b2a1a98001a9900320e0e0e7b050800042c3629353c1a80000e0c000303112c3629353c1a72000e0e0e0c00036402013b6403152c3629362d3629362b2a1a5800310e0e0e7e0800032c3629353b1a48000e0c000303112c3629353b1a3a000e0e0e0c00036402013b6403152c3629382d3629382b2a1a2c00310e0e0e7e0800033b430e0e0e0e0e0e00000000bc00000000000000|@1944,I251,@1927,@1943,I113| 1943:O2|@1946,@1945 1944:S27|545950455f5452454528292e657175616c54797065496473283229 1945:O2|@1948,@1943 1946:D5,444|00822d3528051ab7010c0003030c2c3528051aab010c000302013b037b2d362e382e362f382b372a372a2a330e0c00036503602c2b2a1a8b010c00021a89010e0e0c0002033d2a352b362b1a76010e0e0e0c00021a71010e0e0c000203212b352c362c2b220e220d0e0c0004030d2b2a2506250626041e413b02013b6502013b65020d293b1a3801330e0e0e7e0b00036502013b27040fcd2d353d1a22010e0e0e0c0003030c2c353d1a14010e0c000302013b03202d362e372e362f372c2b31300c0004030a2b2a3130327b050900043b27040fce2d353e1ae5000e0e0c0003030c2c353e1ad8000e0c000302013b036b2d362e372e362f372b29353b1ac0000e0c00030304293702122936293b1abb000c0003292503511e1e3b656403382929353b1a9a000e0e0e0c00030304293702122936293b1a93000c0003292503511e203b6564030d2c2b315677320e0e7b050900043b02013b270402512d3528061a5d00020246000e0e0c0003030c2c3528061a4b000c000302013b030f2d362d362a2a1a3a002f0e7e0700032d353c1a2e000e0e0e0c000303122c353c1a20002d020208000e0e0e7e0500033b440e0e00000000b401000000000000|@1947,I251,I105,I218,I253| 1947:S40|545950455f5452454528292e657175616c54797065496473283229657175616c5479706573283229 1948:D7,220|00822d1ada000e0e0e0c00021ad5000e0e0c000203a52d352e362e1ac2000e0e0e0c00021abd000e0e0c000203892e352f362c352b352a2a1aad000e0e0c000303033c024a2a1a97000c00021a95000e0e0c00020314291a86000e0e0e0c00021a81000e0e0c000202013b03212a3b2b3b3f2e1a76000e0e0e0c00021a71000e0e0c00031a6d000e0e0c000602013b6503212c362b362a2a3356970e0e0c000465030d2b2a3130320e0e0e7b050900043b02013b6502013b65020d2c3b1a28002d0e0e0e7e050003440e0e0e0e0e0e0e00000000d400000000000000|@1949,I105,I218,I251,I223,I239,I154| 1949:S46|545950455f5452454528292e657175616c54797065496473283229657175616c5265636f72644c69737473283229 1950:O1|@1951 1951:D1,20|00802b420e0e0e0e000000000c00000000000000|@1920| 1952:D9,260|00822d1a02010e0e0e0c000229353f1afa000e0e0e0c000303041af300103b5029350a060019001e00470023000e0087000e00292e2d0e0e7d06000202b41ad30002af1ad20002aa29362a372a1acc0031311acb000c0005292c1aaf000c000303032c02043e2a2c6a66028629362a372a30301aa6000e0e0e0c00042a31311a9a000e0e0e0c00042a2d1a7f000c0003030c292c1a75000e0e0c000302013b03032d02043d2b2b6a2704024629362a382b392b1a660032321a69000e0e0c00052b310e0e0e0c000229352b2f1a3d000e0e0c0003030c2a2e1a31000e0e0c000302013b03032f020828052c2b2d306805270664440e0e0e0e00000000fc00000000000000|@1954,@1955,I251,@1961,@1965,@855,@1914,@1966,@1953| 1953:O1|@1969 1954:S23|545950455f5452454528292e636f707954797065283329 1955:O1|@1956 1956:D10,436|00802b3528061aaf010c000307d82b362c372a3b1aa5010e0e0c0003291aa0010e0c00022a2a1a8f010c000303043b50020d2c3b2b1a8c010e0c0004503b5029353f1a73010c000303032f0fd929353e1a65010e0e0c000307ce29362a373b2b291a64010e0c00021a61010e0e0c0002031729362b3c1a57010c0003292b25042504511e233b6502012a652a29353b1a26010e0e0e0c00030304293602122936293b1a17010c0003292503511e203b65643b2a291a11010e0e0c00021a0d010e0e0c0002031729362b3c1a03010c0003292b25042504511e243b6502012a652b2a1af0000202be000e0c000366032e2929353b1ac2000e0e0e0c00030304293702122936293b1ab3000c0003292503511e203b656403032b02013102732929353b1a940002047a0069000e0e0e0c00030304293602122936293b1a7f000c0003292503511e263b6564292c301a89000e0e0c00043e2a2d6a313b2b1a66000e0e0e0c0004502c29353b1a4c000e0c00030304293702122936293b1a3f000c0003292503511e1e3b65640303290201346665020f29353c1a1f000c000303032f020129270402012b4200000000ac01000000000000|@1958,I251,I253,@1955,I255,I105,I218,I106,I113,@1957| 1957:O1|@1959 1958:S23|545950455f5452454528292e6576656e7475616c283129 1959:D21,692|00822d1ab2020e0e0e0c00021aad020e0e0c000207d22d352e362e1a9a020e0e0e0c00021a95020e0e0c000207cc2e352f362a352d1a88020e0c00022a1a80020e0c00022a2a1a7b020c000365036f2d2a1a74020e0c000303033c024a2d1a57020c00021a55020e0e0c00020314291a46020e0e0e0c00021a41020e0e0c000202013b03212d3b2b3b3f2e1a32020e0e0e0c00021a35020e0e0c00031a31020e0e0c000602013b03033b02102d2a1a23020c000303051a1f0202013c02232d1afe010e0e0e0c00022a1af4010e0c00022a2a1a07020c00036503051afa0102013c293b1ade010202ae010e0e0e0c000303142d2c331ae8010202e8000e0c00042d2a69640fd0293b1ad1010e0e0c000303b9313e1acd010e0e0c0003293b1abb010c0003030c1abf012a1abf010c0003020129333f1ab8010e0c0003293b1a87010c0003641a74010e0c0002343c1a9f010c0003293b1a6f010c0003641a5c010e0c00023c28401a8a011a8b010c00042c1a44010e0c000203032c02072c1a7b010c0002293e1a77010c00032d03033f02013b2a2a1a6c010e0c0003293b1a63010c000329301a5b010c00032806302b6a22112a692211221722171a22010e0e0e0c00042a2a69270e02152e2e69292d341a0c01020208000e0c00042e2a6965270402b12d3e1afb000c0003293b1aeb000c0003030c1aef002a1aef000c00030201292f3f1ae8000e0c0003293b1ab7000c0003641aa4000e0c0002303c1acf000c0003293b1a9f000c0003641a8c000e0c00023c28401aba001abb000c00042c1a74000e0c000203032c02072c1aab000c0002293e1aa7000c00032d03033f02013b2a2a1a9c000e0c0003293b1a93000c000329301a8b000c00032806302b6a220d2a69220d3b22131a53000c00042a2a69270e65020e2c3b1a2b000c000303033b02012c440e00000000ac02000000000000|@1960,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,@1957,I216,@677,I106,I243,@855,I11,I152,I245,I242| 1960:S39|545950455f5452454528292e6576656e7475616c283129616464546f496e7374616e6365283229 1961:O4|@35,@863,@1963,@1962 1962:O5|@1964,708,0,708,0 1963:S27|636f7079547970653a204f7665726c6f616453657420666f756e64 1964:S32|6d6c736f757263652f4d4c436f6d70696c65722f545950455f545245452e4d4c 1965:O1|0 1966:O1|@1967 1967:D5,108|00832e1a6a000e0e0e0c00021a65000e0e0c000203452e352f362a352b36293131340e0e0e0c00042c3333331a49000e0e0c00052a2c1a43000c0003030c292e1a39000e0e0c000302013b03033402072c2b69292b6964270602013b1f040e0e000000006400000000000000|@1968,I105,I218,@1966,I251| 1968:S40|545950455f5452454528292e636f707954797065283329636f70795265636f72644c697374283129 1969:D5,100|00832e1a62000e0e0e0c00021a5d000e0e0c0002033d2e352f362a2f2f320e0e0e0c00042a3131311a45000e0e0c00052a2d1a3f000c0003030c292c1a35000e0e0c000302013b03033202032a2a69270402013b1f040e0e000000005c00000000000000|@1970,I105,I218,@1953,I251| 1970:S34|545950455f5452454528292e636f707954797065283329636f70794c697374283129 1971:D3,68|00802b56190c0002291a3c000e0c00021a39000e0e0c0002030c29352956376929680165020a2c56282d0e0e7d04000264420e0e0e0e0e0e000000003c00000000000000|@1972,I105,I218| 1972:S41|56414c55455f4f505328292e646973706c6179536967283529636f6d706f73697465456e762d283129 1973:D3,68|00802b56190c0002291a3c000e0c00021a39000e0e0c0002030c29352956376929680165020a2c56282d0e0e7d04000264420e0e0e0e0e0e000000003c00000000000000|@1972,I105,I218| 1974:O2|@1058,@1975 1975:O2|@1041,0 1976:D5,92|00822c2c2a1a58000e0c00021a55000e0e0c000203322a352b36312b6956573b1a45000e0e0c00032a2a6956773b2b1a3a000e0e0e0c0004502c3b2507250726051e3d3b270502012965440e0e0e0e0e000000005400000000000000|@1901,I105,I218,I253,I255| 1977:O1|@1978 1978:D2,20|00801a13002c6942000000000c00000000000000|@1980,@1979| 1979:D2,36|00802b35561735292b1a1c002f0e0e0e7e0500030e0e0e0e000000001c00000000000000|@1981,I26| 1980:S33|56414c55455f4f505328292e646973706c61795369672835296f72646572283129 1981:S36|56414c55455f4f505328292e646973706c61795369672835296f72646572283129283129 1982:O1|@1983 1983:D2,28|00812c3b2d1a18002e0e0e7b05040004000000001400000000000000|@1985,@1984| 1984:O1|@1986 1985:S17|4d6973632e717569636b536f7274283229 1986:D6,116|00822d1a72000e0e0e0c00021a6d000e0e0c0002034d2d352e36293b1a61000e0e0c000303052a2f6902352a2e0c00020402002b2a2c1a4b000c00045029352a362a33331a41000e0e0c00042f2a692b2a220c1a3200220d0e0e0e7b050d00046502012c440e0e0e000000006c00000000000000|@1988,I105,I218,I251,@1987,@1984| 1987:O1|@1989 1988:S22|4d6973632e717569636b536f72742832297173283229 1989:D5,100|00822d1a62000e0e0e0c00021a5d000e0e0c000203362d352e362a2e0e0c00020402002b2a311a47000c00045029352a362c030b2e2b69332a452b466402092e2a69332c452a46642706020b1a25002d2a35452a36466444000000005c00000000000000|@1991,I105,I218,@1987,@1990| 1990:O2|0,0 1991:S19|4c6973742e706172746974696f6e2832292829 1992:O1|@1993 1993:D34,1036|00863035291a08041a09040e0e0c00036407d130351af8031af9030e0e0c000303043b5002041aef03103037303c1aeb030c00032a362b382b3b1ae3030c000303051adf030fdc29291adc030e0c00021ad9030e0e0c0002031f29352a362a353b1ab0030e0c000303052a68010207292503511e2b3b6502013b64291aa9030e0e0c00021aa5030e0e0c00020311293529353b1a7e030e0e0e0c00036402013b031c293529363b2a69291a7b030c000203041a7b03103b50293b696602013b3e2d69291a62030e0e0e0c000203041a6303103b50293b693b3b3b2e2d6805291a460302027d000e0e0e0c000203041a4303103b50291a4003691a40032a691a3f032a693b3b3b3b2d6805291a1a030e0e0e0c000203041a1b03103b50220c220c3c0202320022143b22170e0e0e0c0006293b691a0e032a692c2a693b3b3b3b2d6805291ae2020e0e0e0c000203041ae302103b5029270e293b691aeb022a6927060fdd3035291ae3021aa8020e0c00036407d930351ad4021a99020e0e0c000303043b5002041a8f02103037303c1a8b020c00032a352b372c382c3b1a81020e0e0c000303051aa7020fcd29291a78020e0c00021a75020e0e0c0002031f29352a362a353b1a4c020e0c000303052a68010207292503511e2b3b6502013b64291a45020e0e0c00021a41020e0e0c00020311293529353b1a1a020e0e0e0c00036402013b031c293529363b2a69291a17020c000203041a1702103b50293b696602013b3e2e69291afe010e0e0e0c000203041aff01103b50293b693b3b3b0202ba012e2d6805291ade010202d1000e0e0e0c000203041adb01103b50291af401691af4012a691af3012a693b3b3b3b2d6805291ab201020299000e0e0e0c000203041aaf01103b50220c3c1a8e010e0e0e0c00033436291ac6011a77010c000303033c0222291a7f010c00021a7d010e0e0c00020310293b1aa5013b3f1aa4010e0c000602013b0311220c2b3c22172217221a0e0e0c000602143e2a69291a47010c000203041a4b01103b502964293b691a74012a692e2a693b3b3b3b2d6805291a24010e0c000203041a2701103b50292710293b691a53012a6927070fca3035291a4b011aec000e0c000364033030351a3c011add000e0e0c000303043b5002041ad30010303729312e301a25010e0e0c0005293b691a1e012a6966029d3035291a17011aac000e0c000364034930351a08011a9d000e0e0c000303043b5002041a93001030372936291a9a000e0e0e0c00021a95000e0e0c000203033b02142a3231311ad8000e0c0005293b691ad2002a69656502443035291aca001a53000c000364033430351abc001a45000e0e0c000303043b5002041a3b0010303729352a361aa500020211000e0e0c0003293b691a9a002a696602013b1f070e0e000000000404000000000000|@1995,@68,I251,@1840,I107,I232,@1041,I105,I218,@1784,@1784,@1996,@1058,@1999,@1830,@1830,@38,@1041,@1826,@1058,@2001,I48,I154,@1830,@1830,@27,@2003,@1830,@23,@2343,@1830,@67,@1994,@1830| 1994:O1|@5412 1995:S39|56414c55455f4f505328292e646973706c6179536967283529646973706c617953706563283229 1996:O2|@1058,@1997 1997:O2|@1998,0 1998:O2|3,61 1999:O2|3,@2000 2000:S9|7369676e6174757265 2001:O2|3,@2002 2002:S9|737472756374757265 2003:O4|@2005,@2104,@2215,@2004 2004:O13|@2238,@2237,@70,@31,@769,@71,@2189,@73,@2199,@75,@2207,@36,@777 2005:D37,1100|00832e36293b1a47040c000307dd2f352937293629353d1a36040e0e0e0c000303c629362a372d35343b1a27040c000303051a230402ae3b1a21040e0e0c00022c220d2b56b80e0e0e0c00040402002c2a1a0c040e0c00035029363e2a69291a02040e0e0e0c000203041afb03103b503b5022103c1af4030e0c0003302a3022132213121300010001000e0e0e0c0006293b691ada032a691ad9032a691ad8032a692f2a69293b1aa6030e0e0e0c0003030333020b332a1ac2030e0e0e0c00031abd032a691abc032a693b3e3b3b2d6805291a8f030c000203041a8b03103b503b50292710660fcb3102026f013b1a63030c000303051a8f030fd52b37293629353d1a4b030c000303041a7f03103b503b5029353b1a38030e0c00030322293729353c1a2a030e0e0e0c0003030d2936293b1a5b030c0003640202293664020d2936293b1a49030e0e0c0003646503051a410302031a40033e2a69291a05030e0e0c000203041aff02103b503b502d37293629353c1ad8020e0c000303042937024529353b1ac8020e0c000303042936023529363b2a291aca020e0e0e0c00021af9020e0e0c0002031b29362b3c1aef020202a4000c0003292b25042504511e293b6502012a66291ad9021ada02020287000e0e0e0c00033b1a80020e0c00022a22102b56e80e0e0e0c000433350402002a2a1a6a020e0e0e0c00035029363e2a69291a5e020e0e0e0c000203041a5702103b503b50293b69293b1a32020e0e0e0c000303032e020b2e2a1a7e020e0e0e0c00031a79022a69220d2a693b3e3b3b2d6805291a1c020e0c000203041a1702103b503b50292711660fd62f3529352a36313b1aed010e0e0c000303051a43020fd13b1ae5010e0e0c00022c37293629353c1aca010e0e0e0c000303042937024129353b1ab8010e0c000303042936023129363b2a291aba010e0e0e0c00021ae9010e0e0c0002031729362b3c1adf010c0003292b25042504511e253b6502012a66291ae1011ace010e0e0e0c0003291ad8010e0c000228052a32343368052b22103156e80e0e0e0c000433350402002a2a1a5a010e0e0e0c00035029363e2a69291a4e010e0e0e0c000203041a4701103b503b50291a960169293b1a2001020206010e0c000303032e020f2e2a1a82010202f3000e0e0e0c00031a79012a691a78012a693b3b3b3b2d6805291a03010c000203041aff00103b503b5022193c1af8000e0c000322151ae7000c00021a19010e0e0c000203892215352216362a352b383c2b2b30121f0001000300221412210001000100221c222522251a1f010c000b2e3c1ab3000c00032d2a121f0001000300221412210001000100221c222522251afd000e0e0c0009293b1a6f000c000303032b020b2b2a1aea000e0e0e0c00033b3d3c3b2d6805291a65000e0e0c000203041a5f00103b503b5029270902031ac600293b692c2a693b3b3b3b2d6805291a3d000e0e0c000203041a3700103b503b5029271666641f040e0e0e000000004404000000000000|@2007,I251,I232,@1041,@2008,@1936,I105,@1784,I107,@1058,@1998,@1058,@2034,@1058,@2037,@1041,@2039,I253,@2043,@2038,I218,I106,@2044,@2047,@2054,@1058,@1041,@2056,@2058,@1996,@2060,@1830,@2062,@2064,@2097,@2102,@2006| 2006:O2|3,I48 2007:S40|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d6170283429 2008:O1|@2009 2009:D6,76|00803c28403b1a47000c0004293b1a43001a44000e0c0004503c28401a3d001a2e000e0e0e0c00043c28403b1a21000e0e0c00041a29002a2c6a66420e0e0e0e000000004400000000000000|@2011,I11,@2012,I255,-1,@2010| 2010:D11,236|008056073b1ae8000e0c000329291ae3000c00021ae1000e0e0c0002032429352a362a36293531352a2a1acf000c00036603052a68010207292503511e2f3b6502013b64291aac000e0c00021aa9000e0e0c000203072935293564027f56283b1a8d000e0e0c0003293c1a93000c000356483b2b1a8d000e0e0c0004502f36293f1a84000e0c0003293b1a6f000c0003641a64000e0c00026403051a6e000202282756583b1a48000e0c00031a61000e0e0c00022a2a1a5b000c000329336956873b1a2b000c00032a2a6956a73b2b1a32000e0e0e0c0004502c270865420e0e00000000e400000000000000|@2030,I253,I105,I218,I251,I106,I255,I243,@2031,@2029,@389| 2011:S30|545950455f5452454528292e7661724e616d6553657175656e6365283129 2012:O1|@2013 2013:D18,212|00802b363c1ad0000e0c000303051acb0002b02b352c363c1ac5000e0e0c0003293b1ab3000c000303051ab70002722a362a3c1aaa000e0e0e0c00032a2a691aa6003b1aa6000e0e0e0c00032a2a0e0e0e0c0002642e352e3c1a84000e0c00032a2a691a8a003b1a82000e0e0e0c00032a2a0e0e0e0c000264291a7700691a77002a691a76002a691a75002a691a74002a69322a691a70002a691a6f002a69270f1a6c002a693b3c3b3b2d6805293b691a61002a691a60002a693b3c3b3b2d68052708420e0e0e0e00000000cc00000000000000|@2015,I234,@2016,I107,@1071,@69,I253,@9,@1074,@1058,@2019,@1058,@1059,@1058,@2021,@1086,@1058,@2014| 2014:O5|0,0,0,@2024,@2023 2015:S11|7072696e742d6e616d6573 2016:O2|3,@415 2017:O1|@2018 2018:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 2019:O2|3,@2020 2020:S6|6e616d65203d 2021:O2|3,@2022 2022:S7|656e747279203d 2023:O2|@2027,0 2024:O2|@2025,0 2025:O2|0,@2026 2026:O5|@1964,1124,1124,0,0 2027:O2|3,@2028 2028:S5|4e616d6573 2029:O1|@2032 2030:S33|545950455f5452454528292e7661724e616d6553657175656e6365283129283129 2031:S2|2727 2032:D14,212|00802b281a1ad0000e0c000303402b3b1ac5000e0e0c0003293c1abf000c000303032c020b2c28191ab5000e0e0c000329281a1aae000e0e0e0c0003293c1a9f000c0003661aa0000e0c000202031a9b002c281a1a99000e0e0c0003293b1a93000c000303033c0214293b1a6a000e0e0e0c00033c2a1a63000c000364030329020a29281a1a70000e0c00032928611a66000e0e0e0c0003293b1a5f000c000303033c020b2928ff1a55000e0e0c000303041a4f00103b502c2a1a4b00310e0e7e0700030e0e0e0e00000000cc00000000000000|@2033,I231,I251,I107,I109,@2029,I48,I110,I113,I106,I234,I233,@385,@389| 2033:S40|545950455f5452454528292e7661724e616d6553657175656e63652831292831296e616d65283129 2034:O1|@2035 2035:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2034| 2036:S15|4c6973742e40283229617070283129 2037:O2|3,@2038 2038:S4|74797065 2039:O4|@35,@863,@2041,@2040 2040:O5|@2042,345,0,345,0 2041:S18|6973457175616c6974793a2054797065466e 2042:S34|6d6c736f757263652f4d4c436f6d70696c65722f5354525543545f56414c532e4d4c 2043:S6|657174797065 2044:O1|@2045 2045:D4,36|00803c28401a20001a21000e0e0c0004291a1c006964420e000000001c00000000000000|@2046,@855,I11,79992| 2046:S28|545950455f5452454528292e74635479706556617273283129283129 2047:O1|@2048 2048:D13,228|00812c3b1ae1000e0e0c000303041adb00103b502c1ad8001ad9000e0e0c000303041ad300103b502c3c1acf000c00032928403b1ac9000e0e0c0004293b301ac2000e0e0e0c0004503b2f2a1ab9000e0e0c000303043b50022c292f0e0c00022a3c1a97000c00032c2a2c1a96000e0e0e0c0004502b3c1a82000e0e0e0c00032503511e395150293b1a80000e0c00033b2a293b1a79000e0e0c000303032a0233293c1a6e000e0e0e0c00032a3c1a63000c0003293c1a43000c00032f2a1a4b000c0003292f69292e2507250726051e3d3b27052705430e00000000dc00000000000000|@2050,I234,@2051,16777214,I231,@2049,I106,I11,I255,I232,I253,I251,I240| 2049:O4|4,@394,0,@2053 2050:S16|4c6973742e746162756c617465283229 2051:O4|4,@394,0,@2052 2052:O5|@1852,175,0,175,0 2053:O5|@1852,123,0,123,0 2054:O1|@2055 2055:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2054| 2056:O1|@2057 2057:D4,36|00803c28401a20001a21000e0e0c0004291a1c006964420e000000001c00000000000000|@2046,@855,I11,79992| 2058:O1|@2059 2059:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@2058| 2060:O1|@2061 2061:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2060| 2062:O2|3,@2063 2063:S8|6461746174797065 2064:O1|@2065 2065:D18,380|0089040200331a77012b1a77010c00045029352a36291a6f010c0002220f03033d02013b3c3c2b6a291a60010e0c000203041a5b01103b503b502d353d1a54010e0c000303c22d362e3729220f22110e0e0c0003221403051a3d0102031a3c0122123b1a3a010e0e0e0c000303051a3301021d3e221569291a11010e0e0c000203041a0b01103b503b50291a1a0169642a2a693b3b3b3b2d6805291aee000e0e0e0c000203041ae700103b503b5022153b1af8000e0c0003032522153c1af0000e0c0003302a22142214221422180e0e0e0c0006293b691ada002a696602013b2a2a693b3b3b3b2d6805291a9e000e0e0e0c000203041a9700103b503b50293b69342a69270b025e221103051aa90002031aa800220f3b1a86000e0e0e0c000303051a9b00020222113e2a69291a5c000e0c000203041a5700103b503b50293b692c2a693b3b3b3b2d6805291a3d000e0e0c000203041a3700103b503b50293b69302a69270727061f0a0e0e0e0e0e0e000000007401000000000000|@2067,@2068,@2071,@2088,I105,@1784,I251,@1824,@2066,I232,@1975,@2090,I233,I107,@2092,@1824,@2066,@1042| 2066:O5|0,0,0,0,@2095 2067:S53|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e737472283429 2068:O1|@2069 2069:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 2070:S39|545950455f5452454528292e67656e6572616c6973652831296e65774d617463687c742d283129 2071:O1|@2072 2072:D6,60|00823c28403b1a37000c00041a35002a2f6a2f2a1a31001a32000e0e0e0c00042b3b1a2b000c00032f2b452a46270444000000003400000000000000|@2074,I11,@2075,@2073,@1914,I253| 2073:O1|@2086 2074:S30|545950455f5452454528292e67656e6572616c6973655479706573283229 2075:D14,188|00802b3528061ab7000c0003039b2b362c37293e1aad000e0e0c0003293b1aa7000c0003030c1aa3002a1aa3000c0003020129291b0f271a9a000e0e0e0c0003651a94000e0c000203032d02592d563756481a87000c00042b3b1a83000c000329353e1a5a000e0e0e0c000303342a3528061a4b000c000303043b5002041a6300102a362a2f1a5f001a60000e0c00042a3b2b1a5a000e0e0e0c0004503b260302023b502a656502012b420e0e0e0e0e00000000b400000000000000|@2077,I251,I216,I234,@677,I106,I113,I218,@2078,I253,@2080,@2076,@1914,I255| 2076:O1|@2084 2077:S44|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129 2078:O1|@2079 2079:D12,316|00822d3528061a37010c000303043b5002041a2f01102d362e372a2a692f3b1a26010e0e0e0c000329291a1f010c00021a1d010e0e0c0002032429352a362a36293529321af9000e0e0c00036503052a68010207292503511e2f3b6502013b64293b1adb000c000303b92b310e0c0002293b1acb000c000303a42d3f1ad5000e0e0c0003293b1ab7000c0003641ac0000e0c00022e3c1abb000c0003293b1a9f000c0003641aa8000e0c00023c28401aa6001aa7000c00042b03033f02013b1a9e002a1a9e000e0e0e0c0003293b1a93000c0003292e1a8b000c000328062e2b6a220d3b1a61000e0e0c00032f3b2b1a76000e0e0e0c0004502a220d6922133b1a45000e0e0c00032a2a6922153b2b1a56000e0e0e0c0004502d270c0202293564020529352935642705440e0e0e0e0e000000003401000000000000|@2081,I251,@2080,I253,I105,I218,I243,@855,I11,79992,I242,I255| 2080:O4|101,@2083,0,@2082 2081:S36|545950455f5452454528292e67656e6572616c6973655479706573283229747673283129 2082:O5|@1964,90,0,90,0 2083:S5|4d61746368 2084:D1,20|00802b420e0e0e0e000000000c00000000000000|@2085| 2085:S47|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129283129 2086:D1,20|00802b420e0e0e0e000000000c00000000000000|@2087| 2087:S40|545950455f5452454528292e67656e6572616c6973655479706573283229636f706965642d283129 2088:O1|@2089 2089:D6,124|00802b1a7a000e0e0e0c00021a75000e0e0c000203512b352c362a352b362936293f1a63000c0003293b1a5f000c0003641a50000e0c00022b36293c1a49000e0e0c0003293b1a43000c0003641a34000e0c00022e2c2b6a301a34000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,I243,I251,@2088| 2090:O2|@2092,@2091 2091:O2|@2093,0 2092:O3|1,1,4 2093:O2|3,@2094 2094:S2|6f66 2095:O2|@2096,@1829 2096:O2|3,124 2097:O1|@2098 2098:D9,148|0087321a92000e0e0e0c00021a8d000e0e0c0002036b32353336333b1a81000e0e0c000303033b02552a352b383b2b2b220f220f220f220f220f220f220f1a63000c000b220d3c1a5e000e0e0e0c00032d2a220f220f220f220f220f220f1a4b000c0009293b1a47000c000303032b020b2b2a1a3e00340e7e11000327056502013b1f080e0e0e0e000000008c00000000000000|@2100,I105,I218,I234,@2064,I107,@2097,I251,@2099| 2099:O1|@2101 2100:S57|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e73747252657374283229 2101:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2099| 2102:O1|@2103 2103:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2102| 2104:O12|@2105,@31,@769,@71,@2189,@73,@2199,@75,@2207,@36,@777,@70 2105:D2,68|00842f2f562756385649565a566b567c568d569e56af120c0001000a00120d0001000b00220f221122131a1b0022127b120700110e0e0e0e000000003c00000000000000|@2107,@2106| 2106:O1|@2108 2107:S20|545950455f5452454528292e7444697370283529 2108:D46,2260|008f22111ad1080e0e0c000229350a06007b008000e303930285000f050e0029362a372a2a692b3b1ab1080e0e0c000329353c1aaa080e0e0e0c000303202a310e0c00023e2a69291a99080e0e0c000203041a9308103b503b502965022a292216221622162216221622162216221622162216221622162216221622161a6c0822170e7b1217001127040fd11a61080fce1a60080fcb2936293b1a43080c000303051a53080fd029293b1a33080c000303033b023529352a362a37293629353c1a1d080e0e0c00036403102936293622172a1a0b080c00036502013b6403033c0207292503511e3e3b65640306221068010fd429293b1ae7070c000303033b023529352a362a37293629353c1ad1070e0e0c00036403102936293622152a1abf070c00036502013b6403033c0207292503511e3e3b65640306220e68010fd829293b1a9b070c000303033b024129352a362a37293629353c1a850702065f075d075b070e0e0c00036403142936293622132a1a6b07020228010c00036502013b6403033c0207292503511e4a3b65640306220c680102a029293b1a43070c000303033b023929352a362a37293629353c1a2d070e0e0c00036403142936293622112a1a1b0702026e000c00036502013b6403033c0207292503511e423b65640305336801025129293b1af4060e0c000303033b023929352a362a37293629353c1add060e0e0c000364031429362936220f2a1acb0602021e000c00036502013b6403033c0207292503511e433b6564030531680102013b293b1aa4060e0c000303282a1ab6060e0e0e0c00023b3b3b3b2d6805291a8d060e0e0c000203041a8706103b503b50296502362935293528053b2b2d3b6805292217221722172217221722172217221722172217221722172217221722171a540622180e7b1218001164640fcf29362a3722133b1a52060e0e0e0c000303051a4b060fd32b1a49060e0e0c000203542a1a42060e0e0e0c0002282a22152b1a1406221722172217221722172217221722172217221722172217221722171a19060e0e0c00133b3b3b3b2d6805291add050e0e0c000203041ad705103b503b50296602d72a1af6051af7050c000322143c1af2050e0e0e0c0003292b1ab705221722172217221722172217221722172217221722172217221722171acc050e0c00122c29353b1a81050e0e0c00030304293702162936293b1a6b05020249050c0003292503511e233b65640304287d02172d3b1a5405020261000e0c000303051a8b0502031a8a053e2a69291a3f050c000203041a3b05103b503b50293b69293b1a26050e0e0e0c000303032c020b2c2a1a62050e0e0e0c00031a5d052a693b3d3b3b2d6805291a04050e0c000203041aff04103b503b50292709650fdc29362a3722133b1a02050e0e0e0c000303051a2b050fdc2a1ac9040e0e0c000229353d1ac6040e0e0e0c0003036522143c1ad8040e0c000303051a0705025222143c1ae3040c00032a2a221622162216221622162216221622162216221622162216221622161a8f040c0011291ad804691ad8042a693b3b3b3b2d6805291a6f040c000203041a6b04103b503b50292705022e22143c1a8f040c00032a2a221622162216221622162216221622162216221622162216221622161a3b040c00116422153c1a61040e0e0c00032c2a2217221722172217221722170202ec03221722172217221722172217221722171a0704020234000c0011293b691a52042a691a51042a691a50042a692f2a693b3b3b3b2d6805291ad8030e0c000203041ad303103b503b5029270a650fcd29362a372b382937293629353c1ab0030e0c00036403102936293629220d1a9f030c00036502013b6403032a020229353c28403b1af9030e0e0c0004293b1af3031af4030e0c0004500402002b3b2b220e30220f1ae5030e0e0c00075029352a36293b1a5a030e0e0e0c000303032a02ce2e37220e1a4c030e0c00021ac1030e0e0c00020311293629353b1a32030e0e0e0c00036402013b0313220e352a362938292c0e0e0c00023735660203293735291a90031a09030e0e0c000303033c0226291aff020c00021a75030202cf020e0e0c00020310293b1a69033b3f1a68030e0c000602013b03162b3c1ad2020e0e0e0c00030306283f2d6902012c023f0402002a3b2b2213220c22141a2e030e0e0e0c00075029352a36293b1aa2020e0e0e0c000303032a02142e3c1a92020e0e0e0c00030306283f306902012f6665291a81020e0e0c00021af5020e0e0c0002032929352a36293b1a65020e0e0c000303032a0213291ae3020c00022b2a69641add020e0e0c00026502031ac6023037293629353c1a38020e0c0003640310293629362922141a27020c00036502013b6403033b027c303629291a17020c00021a8d020e0e0c0002031f29352a362a353b1afc010e0c000303052a68010207292503511e2a3b6502013b64291ae5010e0e0c00021a59020e0e0c00020311293529353b1aca010e0e0e0c00036402013b031e293529363b2a69291ab7010c000203041a3f02103b503b50293b696602013b653e2b69291a9b010c000203041a9701103b503b50293b693b3b3b2e2d6805291a80010e0c000203041a7b01103b503b50220d1a6d010e0e0c00021ae1010e0e0c000207cc220d35220e362a1a48010e0c00022a1a4c010e0c00021ac1010e0e0c00021ab9010e0e0c00020324291a56010e0e0e0c000203033c020b29353d1a1d010e0e0c00031a95010e0e0c000202013b033222223c1a41010e0e0c00032a2a222422242224222422242224222422242224222422242224222422241aeb000c001164028a22223c1af3000c000303051a6301027a22223c1aff000c0003282c2a22131ac400222622262226222622262226222622262226222622262226222622261ac9000e0e0c0013291a2c01020267000e0c0002293b1a83000c000303051a1b01020d1a16012a1a16010e0e0e0c00033b3b3b3b2d6805291a65000e0e0c000203041a5f00103b503b502927052d3b691af1002a692b2a693b3b3b3b2d6805291a3d000e0e0c000203041a3700103b503b50292708020129270e641f100e0e0e0e0e0e0e00000000cc08000000000000|@2110,@1955,I253,I251,I105,@1784,@2106,@2111,@2113,@2113,@2115,I232,@1041,@2119,@2122,@2124,@2127,@1982,I107,@2132,@1073,@2141,@2142,@1086,@1041,@1041,@1056,@1060,@1830,@2144,@1830,I11,@2146,I255,@2164,I218,I48,I154,@2181,@371,@1784,@1041,@2184,@2186,@2109,@1058| 2109:O1|@2188 2110:S28|545950455f5452454528292e74446973702835296469737050283229 2111:O2|3,@2112 2112:S3|626164 2113:O2|3,@2114 2114:S7|6e6f2074797065 2115:O1|@2116 2116:D9,436|00802b1ab2010e0e0e0c00021aad010e0e0c000207ca2b352c36293b1aa1010e0e0c000303b12a3629291a8b010c00021a89010e0e0c0002031f29352a362a353b1a7c010e0c000303052a68010207292503511e2a3b6502013b64291a59010e0e0c00021a55010e0e0c00020311293529353b1a4a010e0e0e0c00036402013b031c293529363b2a69291a2b010c000203041a2f01103b50293b696602013b2d353e2a69291a10010e0c000203041a1701103b50293b693b3b3b2f2d6805291af6000e0e0e0c000203041afb00103b50293b69270702c82a3629291ada000202c0000e0e0e0c00021ad1000e0e0c0002031f29352a362a353b1ac4000e0c000303052a68010207292503511e313b6502013b64291aa1000e0e0c00021a9d000e0e0c00020311293529353b1a92000e0e0e0c00036402013b031c293529363b2a69291a73000c000203041a7700103b50293b696602013b2d353e2a69291a58000e0c000203041a5f00103b50293b693b3b3b2f2d6805291a3e000e0e0e0c000203041a4300103b50301a40000e0c00021a3d002a691a3c002a692c2a69270a6502013b420e0e0e0e00000000ac01000000000000|@2118,I105,I218,I251,@1784,@1784,@2115,@2117,@1088| 2117:O2|3,47 2118:S42|545950455f5452454528292e744469737028352964697370502832297072696e745443636f6e73283129 2119:O1|@2120 2120:D10,276|00802b353e1a10010e0c0003032d2b36291a08010e0c00021a05010e0e0c000203152936291af4000e0c00021af1000e0e0c00026402013b6402013b03c82b362c372929353b1acf000c00030304293702122936293b1acb000c0003292503511e1d3b6564039b3c2b291aaf000c00021aad000e0e0c0002038429352a362a352d3c1aa3000c00032a2a1a8b000c000303033c024a2a1a83000c00021a81000e0e0c00020314291a72000e0e0e0c00021a6d000e0e0c000202013b03212a3b2b3b3f2e1a66000e0e0e0c00021a61000e0e0c00031a5d000e0e0c000602013b6403182d3c1a51000e0e0c0003292c2506250626041e8b3b6402013b6602013c6502013b6502013b42000000000c01000000000000|@2121,I251,I105,I218,I253,@510,I223,I239,I154,I106| 2121:S28|545950455f5452454528292e697350726f6475637454797065283129 2122:O1|@2123 2123:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a362a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2122| 2124:O1|@2125 2125:D15,644|009122111a81020e0e0c00021a7d020e0e0c000207d0221135221236293b1a6f020c000303cd2a1a6a020e0e0e0c00022216282a1a59020e0e0c0003031829353d1a4c020e0c000303033c0207291a47020c000202013b036a22153c1a3d020e0e0c000303051a3702025222153c1a33020c00032a2a2215221522152215221522152215221522152215221522152215221522240e0c0011291a0c02691a0c022a693b3b3b3b2d6805291adb010c000203041afb01103b503b50292705293b6964022d292216221422142214221422142214221422142214221422142214221422142223020289010e0c0011293b6964640fcb22143b1aa3010c000303051ab3010fca2a1a8d010e0e0c00022216282a1a7d010e0e0c0003031829353d1a70010e0c000303033c0207291a6b010c000202013b036622153c1a61010e0e0c000303051a5b01025222153c1a57010c00032a2a2215221522152215221522152215221522152215221522152215221522240e0c0011291a3001691a30012a693b3b3b3b2d6805291aff000c000203041a1f01103b503b5029270502292922162214221422142214221422142214221422142214221422142214221422230202ae000e0c00112217282c1ac50002029f000e0e0c00031ab5000e0e0c00023c2a3b6a291aa4000e0c000203041ac300103b503b503e221a69291a8e000e0e0e0c000203041aab00103b503b50293b692b2a692e2a693b3b3b3b2d6805291a6a000e0e0e0c000203041a8700103b503b50221d3c1a70000e0c0003221f2a220c221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f1a5a000e0e0e0c00131a55002a692c2a69270c6502013b1f120e0e0e0e000000007c02000000000000|@2126,I105,I218,I251,@1955,@2119,I232,@1041,I107,@1056,@1060,@1784,@1975,@2124,@1058| 2126:S41|545950455f5452454528292e744469737028352964697370502832297072657474794c697374283329 2127:O1|@2128 2128:D2,28|00802b351a19002a6964420e0e0e0e0e000000001400000000000000|@2130,@2129| 2129:D2,28|00802b3556172a1a16002e0e7e040003000000001400000000000000|@2131,I29| 2130:S45|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283129 2131:S48|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283229283129 2132:O1|@2133 2133:D15,404|009022111a91010e0e0c00021a8d010e0e0c000207d22211352212362a352b3622163b1a7a010e0e0e0c000303051a73010fca2a283a1a6f010c00033e2a69291a55010e0e0c000203041a5f01103b503b5022183c1a58010e0c00032c2a2218221822182218221822182218221822182218221822182218221822270e0c0011293b691a2e012a692d2a69321a09010e0e0c00021a05010e0e0c00021afd000e0e0c000203033b02031a0c01293b1a0b010c000303032a020b2a2a1a02010e0e0e0c00033b3b3b3b2d6805291ac9000e0e0c000203041ad300103b503b50293b69220d1ab200020295000e0e0e0c00021aa9000e0e0c00021aa10002027c000e0e0c000203033b023922213c1aa1000e0e0c000329220f2222222222222222222222222222222222222222222222222222222222221a8c000e0c00121a89002a6965293b1a75000e0e0c000303032a020b2a2a1a76000e0e0e0c00033b3b3b3b2d6805291a31000e0e0c000203041a3b00103b503b50293b69270e270402013b1f110e0e0e0e0e0e000000008c01000000000000|@2135,I105,I218,I232,@1975,@389,@1784,I107,@1058,@2136,I251,@2138,@2132,@1058,@2134| 2134:O1|@2140 2135:S35|545950455f5452454528292e7444697370283529646973705028322970526563283229 2136:O2|@1088,@2137 2137:O2|@1059,0 2138:O1|@2139 2139:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2138| 2140:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2134| 2141:S6|2c202e2e2e7d 2142:O1|@2143 2143:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2142| 2144:O2|3,@2145 2145:S2|2d3e 2146:O1|@2147 2147:D9,116|00802b363c1a70000e0c000303051a6b0002532b35293b1a66000e0e0e0c00036403051a5e00023e2b363c1a4a000e0e0e0c000303051a4f00022b2b35293c1a3e000e0e0e0c00036403051a3e0002162b363c1a22000e0e0e0c000303051a2f0002031a2e00420e000000006c00000000000000|@2149,I234,@2016,I251,@2150,@2016,@2157,@2016,@2148| 2148:O5|0,0,0,@2152,@2161 2149:S13|7072696e742d6973466f756e64 2150:O5|0,0,0,@2152,@2151 2151:O2|@2155,0 2152:O2|@2153,0 2153:O2|0,@2154 2154:O5|@1964,893,893,0,0 2155:O2|3,@2156 2156:S10|466f756e644d61746368 2157:O5|0,0,0,@2152,@2158 2158:O2|@2159,0 2159:O2|3,@2160 2160:S13|466f756e644e6f744d61746368 2161:O2|@2162,0 2162:O2|3,@2163 2163:S8|4e6f74466f756e64 2164:O1|@2165 2165:D9,212|0085301ad2001ad3000c000303033c0222301acb000c00021ac9000e0e0c00020310303b1ab1003b3f1abc000e0c000602013b03072e30453d460286040200312a1aa8000e0c00035029352a362933692f2a33331a99000e0e0c0005293d1a7b000c000303162c2b220c220c220c220c1a8100220d0e0e7b080d0007293c1a5b000c000303350402002d2c2b220d220d220d1a5f000c00075029352a36293b1a3a000e0e0e0c00030308220d2b452a460206220d2b453c46660205332b453b4627051f060e0e0e0e00000000cc00000000000000|@2167,I48,I251,I105,I218,I154,@1936,@2166,@2164| 2166:O1|@2168 2167:S41|545950455f5452454528292e744469737028352964697370502832296e616d65546f4c697374283229 2168:D14,284|00832d1a1a010e0e0e0c00021a15010e0e0c000207dd2d352e36293b1a09010e0e0c0003037130352b2a0e0e0e0c0002293b1af3000c000303033d0257293529352a362a351ae400220c69040300220c2b1adc001ad9003b2e1ad8000e0c00075029371ad2002e690403002e2b1ac0001abd003b2e1abc000e0c00075029372c2a1ab8000e0c000327071a9700330e0e7d0d000265027230362b2a0e0e0c0002293b1a83000c000303033d025b2935293529372b362a352b39040d002b2a1a7f000c0003502923082a230c2e3b1a58000e0c000303032c02092e351a66002e2b6a641a63002a2d6a1a61002b2d6a2a2a6902021700292210221622161a510022170e0e7b06170005656502013d1f040e000000001401000000000000|@2170,I105,I218,I251,@2171,@2173,@1919,@2176,@1927,@1835,@2177,@2178,@2169,@2166| 2169:D3,60|00802b56180c0002291a34000e0c00021a31000e0e0c0002030f2935562768012a2a692968016602013b64420e0e0e0e000000003400000000000000|@2180,I105,I218| 2170:S39|545950455f5452454528292e7444697370283529646973705028322966696e6454797065283229 2171:D4,84|008056071a51000e0e0c00021a4d000e0e0c000203112b3629353b1a42000e0e0e0c00036402013b03155607352c362938292c0e0e0c0002296801270402013b420e0e0e0e0e0e0e000000004c00000000000000|@2172,I105,I218,I251| 2172:S40|545950455f5452454528292e657154797065436f6e73747273283429636f70794964283129283129 2173:O1|@2174 2174:D1,20|00802b420e0e0e0e000000000c00000000000000|@2175| 2175:S33|545950455f5452454528292e657154797065436f6e737472732834296964283129 2176:D4,84|008056071a51000e0e0c00021a4d000e0e0c000203112b3629353b1a42000e0e0e0c00036402013b03155607352c362938292c0e0e0c0002296801270402013b420e0e0e0e0e0e0e000000004c00000000000000|@2172,I105,I218,I251| 2177:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 2178:D3,60|00802b56180c0002291a34000e0c00021a31000e0e0c0002030f2935562768012a2a692968016602013b64420e0e0e0e000000003400000000000000|@2179,I105,I218| 2179:S55|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b757054797065283129 2180:S57|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b7570537472756374283129 2181:O1|@2182 2182:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c36291a32000e0e0e0c00022b2a69282e2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@2183,I105,I218,@2181| 2183:S25|537472696e672e636f6e636174576974682832296d6b283129 2184:O1|@2185 2185:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2184,@1087| 2186:O2|@1060,@2187 2187:O2|@1088,0 2188:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2109| 2189:O3|@2191,@690,@2190 2190:O3|@2193,@2198,@2192 2191:S4|7265616c 2192:O3|@2191,@717,@716 2193:O2|1,@2194 2194:O3|2,@2195,0 2195:O4|0,@72,2,1 2196:O1|@2197 2197:D2,20|00801a1300420e0e000000000c00000000000000|@756,@713| 2198:O4|1,@71,0,0 2199:O3|@2201,@690,@2200 2200:O3|@2203,@2206,@2202 2201:S4|776f7264 2202:O3|@2201,@717,@716 2203:O2|1,@2204 2204:O3|2,@2205,0 2205:O4|I251,@74,1,1 2206:O4|1,@73,0,0 2207:O3|@2209,@690,@2208 2208:O3|@2211,@2214,@2210 2209:S4|63686172 2210:O3|@2209,@717,@716 2211:O2|1,@2212 2212:O3|2,@2213,0 2213:O4|I251,@76,1,1 2214:O4|1,@75,0,0 2215:O2|@2216,@2104 2216:D14,172|00822d1aaa000e0e0e0c00021aa5000e0e0c000203822d352e36293b1a99000e0e0c0003031f2a352b3628062b2b6a2932321a87003b56a70e0c0006291a800069270402502e3c1a7a000e0e0e0c000303051a7300023e2e305647301a6d000e0e0c0005291a68000e0c00021a65002a691a64002a693b3b3b3b2d6805291a2f000c000203041a5300103b503b50291a4e006927056502013b440e0e0e0e0e0e00000000a400000000000000|@2218,I105,I218,I251,@2219,@2217,I232,@1975,@2225,@2235,@1088,@1060,@1784,@2217| 2217:O2|@1058,0 2218:S28|545950455f5452454528292e7072696e745479706556617273283329 2219:O2|@2221,@2220 2220:O1|@2224 2221:O1|@2222 2222:D1,20|00803b420e0e0e0e000000000c00000000000000|@2223| 2223:S28|545950455f5452454528292e656d70747954797065456e762d283129 2224:D1,20|00803b420e0e0e0e000000000c00000000000000|@2223| 2225:O1|@2226 2226:D16,284|00832e3b1a19010e0e0c000303051a13010fdc2d1a11010e0e0c00021a0d010e0e0c00021a05010e0e0c000203033b0fd02d1af3000c00021af1000e0e0c000203043b5002041ae700103b502d3529352a3628062b2b6a2933311ad7003b220c0e0c0006291ad00069331abb000c00021ab9000e0e0c000203043b5002041abb00103b503336291a9e000e0e0e0c00021a99000e0e0c00021a91000e0e0c00026403033b0242331a7e000e0e0e0c00021a79000e0e0c000203043b5002041a7f00103b503336220c3c1a78000e0c0003292b220d220d1a6f000c00051a6d002a691a6c002a692704293b1a6700020219000c000303032a020f2a2a1a5a0034020207000e7e0d000327071f040e0e0e0e000000001401000000000000|@2228,I232,@1975,I105,I218,@2229,@2219,@2187,@2232,@2232,I107,@2225,@1058,@1059,I251,@2227| 2227:O1|@2234 2228:S36|545950455f5452454528292e7072696e7454797065566172732833297056617273283229 2229:O4|@77,@2231,0,@2230 2230:O5|@881,84,0,84,0 2231:S5|456d707479 2232:O4|@77,@2231,0,@2233 2233:O5|@881,85,0,85,0 2234:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2227| 2235:O1|@2236 2236:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2235,@1056| 2237:O6|@2335,@80,@81,@79,@50,@70 2238:D4,84|00813c28403b1a4f000c00042d2d2b564756585669567a568b569c56ad56be56cf120e0001000a00120f0001000b0012100001000c001a23000c001050293b1a1e002e0e7e050003000000004c00000000000000|@2240,I11,@2239,I253| 2239:O1|@2241 2240:S25|545950455f5452454528292e756e6966795479706573283229 2241:D41,6324|008e22101ab1180e0e0c000222101aa7180c00022a3528051aa1180e0e0c000303292a382937293629353c1a8e180e0e0e0c0003640310293629362922131a7b180c00036502013b6502013b03033c0237293528051a64180e0c0003032929382937293629353c1a52180e0e0e0c0003640310293629362922131a3f180c00036502013b6502013b03033b0fdd2a353b1a29180e0e0c000303033b0fdc29353b1a19180e0e0c000303033b0fce2a3528061a08180e0c0003030c293528061afb170c000302013b07dd2a362b372a2a692c362d372a2a692e3b1ae4170e0c00032f2d1ad7170c000303033b0fce2e3d1ad2170e0e0e0c0003293b1abf170c0003641ac4170e0c0002032e2a32221b221b221b1ab717221c221c221c221c221c221c221c221c221c221c221c221c1aa017221d0e7b141a00132c3b1a83170c00032a353e1a76170e0e0e0c0003030c29353e1a68170e0c000302013b03bf2a362b372a2a692c362d37020238172a2a69333b1a60171a61170204291727170c000450220d3b1a4d171a4e170e0e0e0c0004502c2a32321a34172223222322232223222322230202710222232223222322232223222322231a2317020258020c0013322a2223222322231a01172224222422242224222422242224222422242224222422241aea160e0e0e0c001350220c22102223222322231ad2162224222422242224222422242224222422242224222422241abb1622257b142200132a353f1a9a160e0e0e0c0003030c29353f1a8c160e0c000302013b07dd2a362a36292b1a9e160e0e0e0c0003293b1a6f160c0003033c3b221e221e1a8a166b221c3b1a5f160c0003291a80160e0c00021a59160e0e0c000203033b02122a6801221e3b2b1a55160e0e0c0004503b64650fca303b1a41161a42160e0e0e0c000450333b1a32161a33160c000450291a3b160c00021a15160e0e0c0002030d2936293b1afb150c00036402013b030f2935293528053b2b2d3b68056502263c28401af5151a0a160e0e0e0c000428062a1a02166a3f2c692b3b2b1ae0150e0c0004502a662f2a2220222022201ac2152221222122212221222102024b0022212221222122212221222122211aa7150c00135032220d2220222022201a93152221222122212221222122212221222122212221222122211a7c152222020206000e7b141f00136602b12a353c1a53150c0003032e2e32221c221c221c1a5315221d221d221d221d221d221d221d221d221d221d221d221d1a3c15221e0e7b141b001329353c1a1a150e0e0e0c0003032e2b33221c221c221c1a1715221d221d221d221d221d221d221d221d221d221d221d221d1a0015221e0e7b141b00133b221b221b1a14156b22193b1ad9140e0e0c0003291af8140e0c00021ad1140e0e0c000203033b02122a6801221b3b2b1acd140e0e0c0004503b64656427070fce2a3528061a9c140e0c000307dc2a362b372a2a692a3d1a92140e0e0e0c0003293b1a7f140c0003641a84140e0c000203033c02182b3b1a6e140e0e0e0c000329353f1a5e140e0e0e0c00036407d52c3528051a4e140e0e0e0c000307c82c362d382937293629353c1a38140e0c0003640310293629362922171a27140c00036502013b6403033c02162937293629353d1a10140e0c0003651a14140e0c000207d42e3528051afb130c000307ca2e362f382937293629353c1ae8130e0c0003640314293629362922191ad7130202bb130c00036502013b6403033c021a2937293629353d1abc130202bc010e0c0003651abc130e0c000203362d31221b221b221b1aaf13221c221c221c221c221c221c221c221c221c221c221c221c1a9813221d0204520120010e0e0e7b141a00132937293629353d1a6a130e0e0e0c000303043b5002041a9713103b5029362a372a2f1a8f130c00031a8d132a690402002c2b2b1a86130e0e0e0c000450293527071a2c13020460002e000e0e0e0c0002322a221a221a221a221a221a221a221a221a221a221a221a221a221a1a1513221b0e0e7b111b00102b2f2219221922191a0113221a221a221a221a221a221a221a221a221a221a221a221a1aea12221b0e0e0e7b141800132937293629353d1ac2120e0e0e0c000303043b5002041aef12103b5029362a372a2f1ae7120c00031aed122a690402002c2b2b1ade120e0e0e0c000450293527071a84120e0c0002302a22182218221822182218221822182218221822182218221822181a751222190e0e7b11190010292d2217221722171a61122218221822182218221822182218221822182218221822181a4a1222190e0e0e7b14160013292d2217221722171a31122218221822182218221822182218221822182218221822181a1a1222190e0e0e7b14160013293528061af5110e0e0c000307cd29362a37293d1aed110e0e0c0003293b1adb110c0003641ae0110e0c000203033c02182a3b1aca110e0e0e0c000329353f1aba110e0e0e0c00036407cd2c3528051aaa110e0e0e0c000307dd2c362d382937293629353c1a94110e0c0003640310293629362922161a83110c00036502013b6403033c02162937293629353d1a6c110e0c0003651a70110e0c0002036e2d3528061a57110c0003033a2d362e372a2a692932221b221b221b1a5011221c221c221c221c221c221c221c221c221c221c221c221c1a3911221d02027f010e0e7b141a00132e2e22162216221622162216221622162216221622162216221622161a091122170e0e7b111700102937293629353d1ae6100202d6000e0e0e0c000303043b5002041a0f11103b5029362a372a2f1a071102024b000c00031a0d112a690402002c2b2b1afa100e0e0e0c000450293527071aa0100e0c0002292f22172217221722172217221722172217221722172217221722171a911022180e0e7b111800102b3528061a71100e0e0c000303362b362c372a2a6929302219221922191a6810221a221a221a221a221a221a221a221a221a221a221a221a1a5110221b0e0e7b141800132c2c22142214221422142214221422142214221422142214221422141a251022150e0e7b111500102b3528061a05100e0e0c000303362b362c372a2a6929302219221922191afc0f221a221a221a221a221a221a221a221a221a221a221a221a1ae50f221b0e0e7b141800132c2c22142214221422142214221422142214221422142214221422141ab90f22150e0e7b111500102a3528051a990f0e0e0c0003030c293528051a8b0f0c000302013b07ca2a362b382b362c382b37293629353c1a710f0e0e0c0003640310293629362922161a5f0f0c00036502013b6403033c02232937293629353c1a480f0e0c0003640310293629362922161a370f0c00036502013b6403033b0fdc2b37293629353d1a200f0e0c00036503692b37293629353d1a0f0f0c000303043b5002041a3f0f103b5029362a372a311a370f0c00031a450f2a690402002c2b2b1a2e0f0e0e0e0c000450293529220d221e221e221e221e221e221e221e221e221e221e221e221e221e1acd0e221f0202a3020e0e7b111f00102937293629353d1aa60e0e0e0e0c00036503692937293629353d1a930e0c000303043b5002041ac30e103b5029362a372a2f1abb0e0c00031acd0e2a690402002c2b2b1ab20e0e0e0e0c0004502935220d2a221e221e221e221e221e221e221e02023402221e221e221e221e221e221e1a4d0e221f0e0e7b111f00102937293629353d1a2a0e0e0e0e0c00036503652937293629353d1a170e0c000303043b5002041a470e103b5029362a372a2f1a3f0e0c00031a550e2a690402002c2b2b1a360e0e0e0e0c0004502935220d2a221e221e221e221e221e221e221e221e221e221e221e221e221e1ad50d221f0e0e7b111f00102b372a372a3629353c1ab00d0e0c000303112a3629353c1aa20d0e0e0e0c00036402013b6403152a3629362b3629362b2a1a880d0e0c0003270402392a3629353b1a780d0e0c000303112a3629353b1a6a0d0e0e0e0c00036402013b6403152a3629382b3629382b2a1ab00d0e0c0003270402013b6507ca2a2d291a6a0d0e0e0e0c00021a410d0e0e0c0002038d29352a362c1a520d0e0e0e0c00021a290d0e0e0c000203352c352d362c2b221c221c221c221c221c221c221c221c221c221c221c221c221c1a030d0c001050292c2506250626041e5b3b65023d3b221b221b1a3d0d6b22193b1ad60c0e0e0e0c0003291af40c0e0c00021acd0c0e0e0c000203033b02122a6801221b3b2b1ac90c0e0e0c0004503b646565024d2a3b1a9c0c0e0c000303033b023f3b221922191af30c6b22173b1a880c0e0c0003291aa80c020227000e0c00021a7d0c0e0e0c000203033b02122a680122193b2b1a790c0e0e0c0004503b64656502393c2f2f2e2d680522153b1a480c0e0c0003291a680c0e0c00021a410c0e0e0c000203033b02122a680122173b2b1a3d0c0e0e0c0004503b646527040fcb2a353f1a0e0c0e0e0e0c0003030c293528051aff0b0c000302013b07d62a362a362b382937293629353c1ae70b0c0003640310293629362922151ad70b0c00036502013b6403033c02162937293629353d1ac00b0e0c0003651ac40b0e0c00021abd0b0e0e0c0002036a2937293629353d1aa00b0e0c000303043b5002041acf0b103b5029362a372a2f1ac70b0c00031aed0b2a690402002c2b2b1abe0b0e0e0e0c0004502935220c2a221d221d221d221d221d221d221d221d221d221d221d221d221d1a5d0b221e02022f0b0e0e7b111e00102937293629353c1a360b0e0e0e0c0003640314293629362922151a230b020263030c00036502013b6403033b0fd82937293629353d1a080b0e0c00036503652937293629353d1af70a0c000303043b5002041a270b103b5029362a372a2f1a1f0b0c00031a490b2a690402002c2b2b1a160b0e0e0e0c0004502935220c2a221d221d221d221d221d221d221d221d221d221d221d221d221d1ab50a221e0e0e7b111e00102a1ac40a0e0c00021a9d0a0e0e0c00021a950a0e0e0c0002039c2b293b1a7c0a0e0c000303033b028a29352a362c372b372a3629353c1a630a0c000303112a3629353c1a560a0e0e0e0c00036402013b6403192a3629362b3629362b2a1a3c0a020279020e0c0003270402392a3629353b1a280a0e0c000303112a3629353b1a1a0a0e0e0e0c00036402013b6403152a3629382b3629382b2a1a600a0e0c0003270402013b6503033c0207292503511e943b656402013b03033b0fcb2b293b1ada090e0e0e0c000303033b023529352a362a37293629353c1ac1090e0e0c00036403102936293622162a1aaf090c00036502013b6403033c0207292503511e413b65640306220f68010fcc2b293b1a8b090c000303033b023529352a362a37293629353c1a75090e0e0c00036403102936293622142a1a63090c00036502013b6403033c0207292503511e3e3b65640306220d68010fd02b293b1a3f090c000303033b023929352a362a37293629353c1a29090e0e0c00036403142936293622122a1a1709020254010c00036502013b6403033c0207292503511e423b6564030534680102a12b293b1af0080e0c000303033b023929352a362a37293629353c1ad9080e0e0c00036403142936293622102a1ac70802026e000c00036502013b6403033c0207292503511e433b6564030532680102512b293b1aa0080e0c000303033b023929352a362a37293629353c1a89080e0e0c000364031429362936220e2a1a770802021e000c00036502013b6403033c0207292503511e433b6564030530680102013b291a7d080e0e0c00021a55080e0e0c000203492935293528053b2b2d3b68053c2a322e31680522183b1a2d080e0e0c0003291a4c080e0c00021a25080e0e0c000203033b02122a6801221a3b2b1a21080e0e0c0004503b64270502393b2f2f1a67086b22153b1af0070e0c0003291a10080e0c00021ae9070e0e0c000203033b02122a680122173b2b1ae5070e0e0c0004503b646564660fcb2a3528051ab5070e0e0c0003030c29353f1aa8070e0c000302013b07cc2a362b382b362a37293629353c1a8f070c0003640310293629362922151a7f070c00036502013b6403033c02162a37293629353d1a68070e0c0003651a6c070e0c00021a65070e0e0c0002036a2a37293629353d1a48070e0c000303043b5002041a7707103b5029362a372a301a6f070c00031aa1072a690402002c2b2b1a66070e0e0e0c000450293529220c221d221d221d221d221d221d221d221d221d221d221d221d221d1a0507221e0202d7060e0e7b111e00102b1a10070e0c00021ae9060e0e0c00021ae1060202c9020e0e0c0002039829293b1ac4060e0c000303033b028629352a362d372b372a3629353c1aab060c000303112a3629353c1a9e060e0e0e0c00036402013b6403152a3629362b3629362b2a1a84060e0c0003270402392a3629353b1a74060e0c000303112a3629353b1a66060e0e0e0c00036402013b6403152a3629382b3629382b2a1aac060e0c0003270402013b6503033c0207292503511e903b656402013b03033b0fcb29293b1a26060e0e0e0c000303033b023529352a362a37293629353c1a0d060e0e0c00036403102936293622162a1afb050c00036502013b6403033c0207292503511e413b65640306220f68010fcc29293b1ad7050c000303033b023529352a362a37293629353c1ac1050e0e0c00036403102936293622142a1aaf050c00036502013b6403033c0207292503511e3e3b65640306220d68010fd029293b1a8b050c000303033b023929352a362a37293629353c1a75050e0e0c00036403142936293622122a1a6305020254010c00036502013b6403033c0207292503511e423b6564030534680102a129293b1a3c050e0c000303033b023929352a362a37293629353c1a25050e0e0c00036403142936293622102a1a130502026e000c00036502013b6403033c0207292503511e433b65640305326801025129293b1aec040e0c000303033b023929352a362a37293629353c1ad5040e0e0c000364031429362936220e2a1ac30402021e000c00036502013b6403033c0207292503511e433b6564030530680102013b291ac9040e0e0c00021aa1040e0e0c000203492935293528053b2b2d3b68053c322b312f680522183b1a79040e0e0c0003291a98040e0c00021a71040e0e0c000203033b02122a6801221a3b2b1a6d040e0e0c0004503b64270502393b2f2f1abb046b22153b1a3c040e0c0003291a5c040e0c00021a35040e0e0c000203033b02122a680122173b2b1a31040e0e0c0004503b646564660fdc2a353f1a02040e0e0e0c0003030c29353f1af4030e0c000302013b03041a6804103b503b502a3528051adc030e0c000307cc2a362b382937293629353c1ac8030e0c0003640310293629362922141ab7030c00036502013b6403033c02162937293629353d1aa0030e0c0003651aa4030e0c00021a9d030e0e0c0002036a2937293629353d1a80030e0c000303043b5002041aaf03103b5029362a372a2f1aa7030c00031ae5032a690402002c2b2b1a9e030e0e0e0c00045029352934221c221c221c221c221c221c221c221c221c221c221c221c221c1a3e0302021203221d0e0e0e7b111d00103b2d2d1aa2036b22133b1a17030c0003291a3803020227000e0c00021a0d030e0e0c000203033b02122a680122153b2b1a09030e0e0c0004503b6427040fcd293528051ada020e0e0e0c000307d529362a382937293629353c1ac4020e0c0003640310293629362922141ab3020c00036502013b6403033c02162937293629353d1a9c020e0c0003651aa0020e0c00021a99020e0e0c000203662937293629353d1a7c020e0c000303043b5002041aab02103b5029362a372a2f1aa3020c00031ae9022a690402002c2b2b1a9a020e0e0e0c0004502935342a221c221c221c221c221c221c221c221c221c221c221c221c221c1a3a02221d0e0e0e7b111d00102937293629353c1a16020202fa010e0e0e0c0003640314293629362922141aff010202be000c00036502013b6403033b02ae2937293629353d1ae4010e0c00036503652937293629353d1ad3010c000303043b5002041a0302103b5029362a372a2f1afb010c00031a45022a690402002c2b2b1af2010e0e0e0c0004502935342a221c221c221c221c221c221c221c221c221c221c221c221c221c1a9201221d0e0e0e7b111d00103b2c2e1a06026b22133b1a6f010c0003291a90010e0c00021a69010e0e0c000203033b02122a680122153b2b1a65010e0e0c0004503b6465650fdb2a353d1a37010c0003030c29353d1a2c010e0c000302013b03532a362b372b362c372c2b22162216221622162216221622162216221622162216221622161a0c010e0c0010502b2a22162216221622162216221622162216221622162216221622161ae80022170e7b111700102a353c1aca000e0e0e0c0003030c29353c1abc000e0c000302013b03033b02982a353e1aaa000e0e0e0c0003030c29353e1a9c000e0c000302013b03412a362b372a2a692c362d372a2a692c2a32321a8e00221b221b221b221b221b221b221b221b221b221b221b221b221b020248001a7d000e0e0c0013503b2706023a3b2b2b1ae4006b22113b1a49000e0e0c0003291a68000e0c00021a41000e0e0c000203033b02122a680122133b2b1a3d000e0e0c0004503b6465651f0f0e00000000ac18000000000000|@2243,@1955,I251,I253,I243,I218,@2239,@2244,@855,I255,@2299,@2314,@2317,I105,I11,79992,@2242,@2248,@2251,@2318,@2071,@2319,@2320,@2321,@2322,@2323,I113,@2324,@2324,@2325,@2326,@2327,@2328,@2327,@2329,@2332,@2242,@2333,@2334,@2242,@2242| 2242:S20|28496e636f6d70617469626c6520747970657329 2243:S33|545950455f5452454528292e756e69667954797065732832296d61746368283229 2244:O1|@2245 2245:D20,716|0091221335293b1ac6020e0e0e0c00032214291abe020e0e0e0c0002293528051ab5020e0e0c0003036029362a382937293629353d1aa0020e0c00036503472937293629353d1a8f020c000303043b5002041a8702103b5029362a372a2f1a7f020c00031a7d022a690402002c2b2b1a76020e0e0e0c00045029352707250426031e6f3b02012b6502012965293528061a45020e0e0c0003031129362217352a2a1a34020e0c00036502013b2b353f1a26020e0e0e0c000303252b2217221522142214221422142214221422142214221422142214221422210c00105002322b353e1af3010c000303252b2217221522142214221422142214221422142214221422142214221422210c00105002023b502903033b0fcb221736293d1acd010e0e0c0003293b1aaf010c0003641ac0010e0c000264033f3b221622161ab5016b22143b1a8a010e0e0e0c0003291aa8010e0c00021a99010e0e0c000203033b02122a680122163b2b1a91010e0e0c0004503b64650fd83b2b22192218221822181a7d010e0e0c0007033c3b221622161a72016b22143b1a37010c0003291a58010e0c00021a49010e0e0c000203033b02122a680122163b2b1a41010e0e0c0004503b64650fd0221736293f1a1e010e0e0e0c0003293b1aff000c0003641a10010202d8000e0c000264031822161a18011a190122140c0004293c1adb000c00036402013b033c3b221622161a02016b22143b1abb000c0003291adc000e0c00021acd000e0e0c000203043b5002112a680122163b2b1ac4000e0c0004503b515102023b50221736293c1aa00002026c000e0c0003293b1a7f000c0003641a90000e0c000264031c1aaa001aab000c000222172a0e0e0c0002643b2a0e0e0c00025102023b5022133b1a45000e0e0c0003291a6400020224000e0c00021a51000e0e0c000203033b0212221835293b221a1a49000e0e0c0004503b646427041f1200000000c402000000000000|@2247,I253,@1955,I251,@2248,@2251,@2254,@2071,I243,I218,@2256,I105,I255,@2257,@2267,@2268,@2271,@2277,@2278,@2246| 2246:O1|@2286 2247:S42|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229 2248:O4|@35,@863,@2250,@2249 2249:O5|@1964,1533,0,1533,0 2250:S35|6d616b654571756976616c656e743a204e6f74206120747970652066756e6374696f6e 2251:O1|@2252 2252:D4,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203142b1a46000e0e0e0c00021a41000e0e0c000202013b031a2c352d362d352e362c2b692c2b1a2b000c00032a2a69270602013b430e0e0e0e0e0e0e000000005400000000000000|@2253,I105,I218,@2251| 2253:S15|4c697374506169722e7a6970283229 2254:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2255:S38|545950455f5452454528292e6d616b654571756976616c656e74283229676574417267283129 2256:S42|2843616e6e6f7420756e6966792077697468206578706c696369742074797065207661726961626c6529 2257:O1|@2258 2258:D26,716|0085303b1ac9020e0e0c000307d62f1ac2020e0e0e0c000229353e1ab2020e0e0e0c000303162936291aac02323232321aa902330e0e0e7b080a000729353d1a8e020e0e0e0c0003032929362a373b2b333333331a81020e0e0c000703033c020f3b2a333333331a6e02347b080b0007650fd0293528051a56020e0e0e0c0003037e29362a382937293629353d1a40020e0c00036503552937293629353d1a2f020c000303043b5002041a3302103b5029362a372a2f1a2b020c00031a29022a690402002c2b2b1a22020e0e0e0c00045029353b2a22122212221222121af80122130202d2010e7b081300072a1ae801333333331af901340e0e0e7b080b0007293528061ac9010e0e0c000307dc29362a373136293e1adb010c0003293b1ad7010c0003030c1ad3012a1ad3010c00030201292c3e1abc010e0c0003293b1ab701020270010c0003030c1aaf012a1aaf010c00030201292b2a1a9c010e0c000303032b0201292f3e1a89010e0e0c0003293b1a83010c0003030c1a7f012a1a7f010c0003020129292c1a78010e0c0003651a74010e0c000207cd2f3d1a6d010e0e0c0003293b1a27010c0003641a58010e0c000203403b220e220e1a52016b220c3b1a4f010c0003291a4c010e0c00021a35010e0e0c000203043b5002152a6801220e3b2b1a34010202c8000e0c0004503b515102aa2f3f1a11010e0e0c0003293b1acb000c0003641afc000e0c0002303c1af7000c0003293b1ab3000c0003641ae4000e0c00023c28401af2001af3000c00042c1ae0000e0c000203032c02072c1ae3000c0002293e1adf000c00032d03033f02013b2a2a1ad4000e0c0003293b1acb00020239000c000329301abf000c00032806302b6a22113b1a95000e0e0c0003313b2b1a92000e0e0e0c00045022123b2c1a84000e0c0004503b260c02023b50220e35312a1a2400220e0e0e7e1200033b6402013c1f060e0e0e0e0e00000000c402000000000000|@2260,I251,@1955,@2257,@2261,@2248,@2251,@2264,@2071,@2265,I216,I234,@677,I106,I113,I218,I243,@2259,I253,I105,I255,@855,I11,I152,I245,I242| 2259:S44|2854797065207661726961626c65206973206672656520696e20737572726f756e64696e672073636f706529 2260:S61|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296f6363757273436865636b4661696c73283229 2261:O1|@2262 2262:D4,76|0085301a4a000e0e0e0c00021a45000e0e0c00020326303531362932323232321a35000e0e0c00072b362a2a343434342210220c0e0e0e7b080c00073b1f060e000000004400000000000000|@2263,I105,I218,@2261| 2263:S15|4c6973742e666f6c64722833292829 2264:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2265:O1|@2266 2266:D4,76|0085301a4a000e0e0e0c00021a45000e0e0c00020322303531362932323232321a35000e0e0c0007292c33333333220f340e0e7b080b00073b1f060e0e0e0e0e000000004400000000000000|@2263,I105,I218,@2265| 2267:S44|2854797065207661726961626c6520746f20626520756e6966696564206f636375727320696e207479706529 2268:O1|@2269 2269:D1,20|00803c420e0e0e0e000000000c00000000000000|@2270| 2270:S45|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229283129 2271:O1|@2272 2272:D17,372|00802b36293f1a6f010c0003293b1a6b010c0003641a68010e0c00026403033d0fd02b36293d1a4f010c0003293b1a4b010c0003641a48010e0c00026403033c0fd32b36293e1a3b010c0003293b1a37010c0003030c1a33012a1a33010c00030201292e36293c1a0e010e0e0e0c0003293b1a07010c0003641a04010e0c00023c28401a0e011a0f010c00042c1a0c010e0c000203032c02072c1a03010c0002293e1aff000c0003293f1afb000c0003293b1af3000c0003292f1aeb000c000328062f2b6a220e35293b1adf000c0003221035293b2e1ad7000c0004502a353f1a99000e0e0c000303682a36291ac40002026c000e0c0002291aa0000e0c00021a7d000e0e0c0002034429352a36293b1a6900020249000e0e0c0003031b2a3528053b2b2e3b6805220f3b2b1a81000e0e0c0004503d6502123f2c69220e3b2b1a6d000e0e0c0004503d646502013c65020c323b2c1a58000e0c0004503d270f420e0e0e0e0e0e0e000000006c01000000000000|@2274,I243,I251,I218,I216,I234,@677,I106,@855,I11,I105,I152,I245,I242,I253,I255,@2273| 2273:O1|@2275 2274:S54|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b45715476283129 2275:D7,156|00802b1a9a000e0e0e0c00021a95000e0e0c000203752b352c362a37293629353d1a84000e0c000303041a7f00103b5029353b1a72000e0e0e0c00030322293729353c1a62000e0e0e0c0003030d2936293b1a5b000c0003640202293664020d2936293b1a49000e0e0c00036465030e291a40000e0c00022b2a6964020a291a32002e0e7d0500026502013b420e0e0e000000009400000000000000|@2276,I105,I218,I251,@2039,I253,@2273| 2276:S63|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b4571547628312966696c746572283129 2277:S24|28526571756972657320657175616c697479207479706529 2278:O1|@2279 2279:D2,20|00801a13002c6942000000000c00000000000000|@2281,@2280| 2280:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@2283,@2282| 2281:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129 2282:O1|@2284 2283:S60|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129283129 2284:D16,300|00812b3528061a27010c000307d82b362c37293c1a1d010e0e0c0003293b1a0f010c0003641a10010e0c000203033b0fd12a3b1a06010e0e0e0c000329353f1aee000e0e0e0c000303033b02cb2a3e1aee000e0e0e0c0003293b1ae7000c0003030c1ae3002a1ae3000c00030201292c3f1ac0000e0c0003293b1ab3000c0003641ab4000e0c00022d3d1aa7000c0003293b1a9b000c0003641a9c000e0c00023c28401aaa001aab000c00042c1aa8000e0c000203032c02072c1a9f000c0002293e1a9b000c00032d03033f02013b2a2a1a90000e0c00032e03033d02013b2a2a1a8000020234000e0c0003293c1a73000c00032806312b6a220f3b2b1a6800020215000e0c000450313b220f1a58000e0c0004503b270d646502013b430e0e000000002401000000000000|@2285,I251,I243,I218,I253,I216,I234,@677,I106,@855,I11,I105,I152,I245,I242,I255| 2285:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283229 2286:D2,28|00801a1b002c692964420e0e0e0e0e0e000000001400000000000000|@2288,@2287| 2287:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@2290,@2289| 2288:S23|545950455f5452454528292e666f6c6454797065283129 2289:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@2292,@2291| 2290:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283129 2291:O1|@2293 2292:S34|545950455f5452454528292e666f6c6454797065283129666f6c6454283129283129 2293:D6,164|00822c1aa2000e0e0e0c0002292d0e0e0e0c00022f2a0e0e0e0c0002642a350a06002e002b004200310028005e000e002a36293b1a75000e0e0c00032b2a311a6e00327b05090004024a2902472902442902412a36291a5700302d1a5600327b060800052a362b372b2a311a42000e0e0e0c0004292c321a3600337b050a00042a36291a2a00302d1a2d00320e0e0e7b0608000565440e0e000000009c00000000000000|@2295,@1955,I253,@2291,@2296,@2294| 2294:O1|@2298 2295:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283229 2296:O1|@2297 2297:D4,68|00832e1a42000e0e0e0c00021a3d000e0e0c0002031a2e352f36293030301a2f000c00052b362a2a3234327b050a00042b1f040e0e0e0e0e000000003c00000000000000|@2263,I105,I218,@2296| 2298:D4,68|00832e1a42000e0e0e0c00021a3d000e0e0c0002031a2e352f36293030301a2f000c0005292c3133310e0e7b050900042b1f040e0e0e0e0e000000003c00000000000000|@2263,I105,I218,@2294| 2299:O1|@2300 2300:D15,764|00912213352214362214352215362217362929353b1ae8020e0c00030304293702122936293b1adb020c0003292503511e1e3b65642218362929353b1ac1020e0e0c00030304293702122936293b1ab3020c0003292503511e1f3b65642b037129036b3b31291a9f020c00021a9d020e0e0c0002031729362b3c1a93020c0003292b25042504511e223b6502012a653b30291a73020c00021a71020e0e0c0002031729362b3c1a67020c0003292b25042504511e223b6502012a652a2a1a54020e0c0003651a44020e0c000202013b02013b033f3b221a221a1a3c026b22173b1a21020e0e0c0003291a1c020e0c00021a19020e0e0c000203043b5002112a680122193b2b1a14020e0c0004503b513b65022d302f221922192219221922192219221922192219221922192219221922192210222a222a22151ae4010e0c00152c03652a03043b50025a2e29353b1aaf010c000303033b02262936293b1aa4010e0c000329353c1a96010e0e0e0c00030309292503511e2b3b02032a68016564293b1a7b010c000303041a9701103b503b502935293b341a82010e0e0e0c0004503b2603221a0fd02a035f3029353b1a4e010e0e0e0c000303033b02262936293b1a40010e0c000329353c1a32010e0e0e0c00030309292503511e2e3b02032a68016564293b1a17010c000303041a3701103b503b502935293b321a1e010e0e0e0c000450221b650fce3029353b1aef000c000303033b02262936293b1ae4000e0c000329353c1ad6000e0e0e0c00030309292503511e2b3b02032a68016564293b1abb000c000303041adf00103b503b5029353029353b1aa5000e0e0c000303033b022a2936293b1a98000e0c000329353c1a8a00020271000e0e0e0c00030309292503511e313b02032a68016564293b1a6b000c000303041a9300103b503b5029352b2a1a57000c000303043b5002322d1a7e000e0e0e0c00023b2a3b6a2d3b2b1a56000e0e0e0c0004503c2e692c3b2b1a4600020211000e0e0e0c0004503b26043e2e220d6a270427091f120e00000000f402000000000000|@2302,I251,I253,I105,I218,I106,I113,@2303,I255,@2304,@2309,@2309,@2309,@2309,@2301| 2301:O1|@2313 2302:S48|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f726473283429 2303:S28|28446966666572656e74206e756d626572206f66206669656c647329 2304:O1|@2305 2305:D23,868|009322151a61030e0e0c00021a5d030e0e0c000207da2215352216362a352b3622181a43030c00021a41030e0e0c000207dc2218352219362a352b362e1a30030e0c00022b1a28030e0c00022a2a1a23030c000365036f2e2b1a1c030e0c000303033c024a2e1aff020c00021afd020e0e0c000203142a1aee020e0e0e0c00021ae9020e0e0c000202013b03212e3b2c3b3f2f1ada020e0e0e0c00021add020e0e0c00031ad9020e0e0c000602013b03033b02102e2b1acb020c000303051ac70202013c02232e1aa6020e0e0e0c00022b1a9c020e0c00022a2a1aaf020c00036503051aa20202013c293b1a86020202ed010e0e0e0c0003035c2e2b221d221d221d221d221d221d221d221d02027001221d221d221d221d221d222b0e0c001050302d221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a46020e0e0e0c0015322a69640fcf293b1a31020e0e0c0003038c220e03531a2b02301a2b020c0003291a28021a21020e0e0c00033b221022102c6b221e3b1a17020c0003291ad8010e0c00021ad5010e0e0c000203043b5002112a680122203b2b1af8010e0c0004503b5122222704023330221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1aad010e0e0c0015322a6964028e3403581ab4012c1aa0010e0c0003291aac011a95010e0e0c00033b221022102c6b221e3b1a8b010c0003291a4c010e0c00021a4901020255000e0e0c000203043b5002112a680122203b2b1a68010e0c0004503b51222127040233221e2d221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a1d010e0e0c00152e2a69642705025b3203541a2a012b1a0e010e0e0e0c0003291a20011a01010e0e0c00033b34342c6b22193b1af9000e0e0c0003291ab8000e0c00021ab5000e0e0c000203043b5002112a6801221b3b2b1ad8000e0c0004503b51260402023b5022192704027422141a84000e0c00021a81000e0e0c0002036022143529352d03511abb002a1a97000c0003291ab4001a8d000e0e0c00033b32322c6b22173b1a85000e0e0c0003291a44000e0c00021a41000e0e0c000203043b5002112a680122193b2b1a64000e0c0004503b51260402023b5022166502013b1f140e0e0e000000005c03000000000000|@2307,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,@2304,@2308,@389,@2306,I253,I255,@2308,@2306,@2308,@2306,@2308,@2306| 2306:S9|206d697373696e6729 2307:S64|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f7264732834296d617463684c6162656c6c6564283229 2308:S7|284669656c6420 2309:O4|@78,@2311,0,@2310 2310:O5|@2312,52,0,52,0 2311:S6|4f7074696f6e 2312:S18|2e2f62617369732f4f7074696f6e2e736d6c 2313:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2301| 2314:O1|@2315 2315:D6,228|00812c1ae2000e0e0e0c00021add000e0e0c000203b92c352d362d293b1ad0000e0c000303033b028629352a362d372b372a3629353c1ab7000c000303112a3629353c1aaa000e0e0e0c00036402013b6403152a3629362b3629362b2a1a90000e0c0003270402392a3629353b1a80000e0c000303112a3629353b1a72000e0e0e0c00036402013b6403152a3629382b3629382b2a1a5c000e0c0003270402013b6503033c0207292503511e903b65640310292e1a41000e0e0c00032b2a6964020a292e1a31002f7e0600036502013b430e0e0e0e0e0e0e00000000dc00000000000000|@2316,I105,I218,I251,I113,@2314| 2316:S47|545950455f5452454528292e756e69667954797065732832296d61746368283229696e746572736563742832292829 2317:S27|28496e636f6d70617469626c65206f7665726c6f6164696e677329 2318:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2319:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2320:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2321:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2322:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2323:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2324:S32|28446966666572656e74206e756d62657273206f6620617267756d656e747329 2325:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2326:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2327:S29|28446966666572656e74207479706520636f6e7374727563746f727329 2328:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2329:O4|@35,@863,@2331,@2330 2330:O5|@1964,2381,0,2381,0 2331:S36|556e696669636174696f6e3a204f7665726c6f61645365742f4f7665726c6f6164536574 2332:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2333:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2334:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2335:D14,932|00822d1aa2030e0e0e0c000229353c1a9a030e0e0e0c000303033c0fdd29353b1a89030e0e0c000303033c0fcf29353f1a79030e0e0c000303041a7303103b503b5029353e1a64030e0c000303662936291a60030e0c0002293d2a1a5a030e0e0e0c00021a55030e0e0c000203412a352b362a3434330e0e0e0c0004293d1a2b030c0003030d2a2d2505250526031e343b0219293b1a14030e0c0003030d2a3b2505250526031e4c3b02013c6602012927040fd1293528051af1020e0e0c000307d629362a382937293629353c1adc020e0c00036403102936293629567b1acb020c00036502013b6403033c0fd22937293629353d1ab40202049a0298020e0e0e0c000365034d2937293629353d1a9b020c000303043b5002041aa302103b5029362a372a2f1a9b020c00031a99022a690402002c2b2b1a92020e0e0e0c000450293529220f220f220e22100e0e0e7b051000042937293629353c1a4e020e0e0e0c00030311293629567a1a3e020e0e0e0c00036402013b03033c027329353c1a290202020f020e0e0c0003031529362956791a1602020283010e0e0e0c00036402013b03033c024729353c1afd010e0e0c0003031529362956781aee01020258010e0e0e0c00036402013b03033c021f29353c1ad5010e0e0c0003031129362956771ac6010e0e0e0c00036402013b6503033d0fcf2937293629353d1aac010e0c000303041ac701103b503b5029353b1a98010e0c00030322293729353c1a8a010e0e0e0c0003030d2936293b1aa3010c0003640202293664020d2936293b1a91010e0e0c00036465035b2a3d2a1a66010e0e0e0c00021a61010e0e0c000203412a352b362a3434330e0e0e0c0004293d1a37010c0003030d2a2d2505250526031e343b0219293b1a20010e0c0003030d2a3b2505250526031e4c3b02013c660201296502732937300e0e0e0c0002293c1af7000c000303033c025c2b2a2a1af500020253000e0e0c00021aed000e0e0c000203412a352b362a220c220c340e0c0004293d1ac3000c0003030d2a2d2505250526031e373b0219293b1aac000e0c0003030d2a3b2505250526031e4f3b02013c66020129656465027929353d1a89000e0e0c000303033c026929362a372a2a692a3f1a9f000c0003293b1a6b000c0003641a74000e0c000203033d02442b3b1a7e000e0e0e0c000329353e1a4a000e0e0e0c000303212a310e0c0002293c1a37000c000303033c020b2a333332340e7b050b00046402092a31310e0e7d0a000264666444000000009c03000000000000|@2337,@1955,I251,@2338,@2341,I105,I218,@2248,@2251,@2336,@2071,@2039,I253,I243| 2336:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2337:S23|545950455f5452454528292e657175616c697479283329 2338:O4|@35,@863,@2340,@2339 2339:O5|@1964,1664,0,1664,0 2340:S28|657175616c697479202d204f7665726c6f616473657420666f756e64 2341:O1|@2342 2342:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a362a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2341| 2343:O1|@2344 2344:D28,812|00832e352f36303731383239313532362a2a69220c3b1a17030c000303051a13030fce2f3c1a10030e0c0003034f1a0b033c2e331a09030e0e0c00053b1a04030e0c00022f220f2b2e22101afa020e0e0e0c0006293b691af2022a692d2a693b3e3b3b2d6805291ae6020e0e0e0c000203041adf02103b502927070fda2f1acf020c00021ad1020e0e0c0002034f1acb023c2e331aa9020e0e0c00053b1aa4020e0c00022f220f2b2e22101a9a020e0e0e0c0006293b691aa6022a692d2a693b3e3b3b2d6805291a86020e0e0e0c000203041a7f02103b502927070fd92f3b1a56020e0e0e0c000307ce2c291a6102020228020e0e0c00021a5d020e0e0c0002031f29352a362a353b1a2c020e0c000303052a68010207292503511e303b6502013b64291a29020e0e0c00021a29020e0e0c00020311293529353b1afa010e0e0e0c00036402013b0320293529363b2a69291afb010202c2010c000203041a0302103b50293b696602013b3e3369291ade010e0e0e0c000203041ad701103b50293b693b3b3b2e2d6805291ac2010e0e0e0c000203041abb01103b50293b691ac6012a691ac5012a693b3b3b3b2d6805291a9c01020463018f000e0e0e0c000203041a8f01103b50220d1aa3010c000229353d1a62010e0e0e0c0003030829362968016402013b291a65010e0e0c00021a65010e0e0c0002033029353b1a44010e0c00022a221a2b2210221b1a39010e0e0c0006293b691a5a012a691a59012a691a58012a69270602013b2c2a693b3b3b3b2d6805291a17010c000203041a1301103b5029270e02d22e353c1ae9000e0e0c0003031c2e3629353d1ada000e0e0e0c0003030829362968016402013b6402013b291ad9000e0e0c00021ad9000e0e0c0002032f29351af5003b30220c1aae000e0e0e0c00052a3122111ae5000e0e0c0004291ae000691ae0002a692c2a69270502131ad8003c2f341a82000e0e0e0c0005293b69643b1a78000e0c00023022102b2f22111a6e000e0e0e0c0006293b691aae002a69293b1a4b000c000303032d020b2d2a1a9e000e0e0e0c00033b3e3b3b2d6805291a45000e0e0c000203041a3f00103b5029270827081f040e000000002403000000000000|@2346,I232,@1041,I251,@2347,@2348,@2008,@2104,@1058,I105,@1784,I218,@2353,@1058,@1784,@1058,@2354,@1955,@2356,@2093,@2357,@2347,@2358,@1827,@1058,@2347,@1058,@2345| 2345:O1|@5411 2346:S28|56414c55455f4f505328292e646973706c617956616c756573283429 2347:S3|76616c 2348:O1|@2349 2349:D9,324|00830402002e030d1a3d012a2a35452a364651020b1a34012a2a35452a36465129352a363e3269291a25010e0e0c000203041a1f01103b5030291a13010c00021a15010e0e0c0002031f29352a362a353b1a08010e0c000303052a68010207292503511e2a3b6502013b64291ae1000e0e0c00021ae1000e0e0c00020311293529353b1ad6000e0e0e0c00036402013b031c293529363b2a69291ab3000c000203041abb00103b50293b696602013b3e3269291a9a000e0e0e0c000203041a9300103b50293b693b3b3b2e2d6805291a7e000e0e0e0c000203041a7700103b503c313b6a291a68000e0c000203041a6300103b503e3169291a55000e0e0c000203041a4f00103b50293b692b2a692d2a691a50002a69342a693b3b3b3b2d6805291a2c000e0c000203041a2700103b502927111f040e0e0e000000003c01000000000000|@2351,@2352,@2350,I105,@1784,I218,I251,@1784,@1058| 2350:O2|1,61 2351:S38|56414c55455f4f505328292e646973706c617956616c75657328342976616c50617274283229 2352:O2|0,58 2353:S11|636f6e7374727563746f72 2354:O2|3,@2355 2355:S9|657863657074696f6e 2356:O3|1,1,3 2357:O3|1,1,1 2358:O1|@2359 2359:D23,420|00823c28403b1a9f010c00041a9d012a693c28403b1a90010e0c0004291a90012c1a90016b293b69040200321a89012b1a89010e0e0c0004502936291a81010e0e0c0002291a7c010e0c00021a7901220e692a1a76010e0e0e0c0002291a5001312d1a6b010c0005220f1a4301321a63010c00043d22103b6a293b692c2a69280e2a3b6a2a291a4f010c00021a4d010e0e0c0002031d29352a362a353d1a40010e0c00030309292503511e253b02013b6502013c64030b291a29010e0e0c0002020129293b69291a1e010e0e0e0c00023e2a323c6b22101afe000e0e0e0c00021af9000e0e0c000203043b5002041afb001022123b1af8000e0c0003291af4000e0c0002293b2a1ace000e0e0e0c00021ac9000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1aaa000e0e0e0c000303032c0204402a2e6a22183b1aa5000e0e0c00032a3b2b1aa2000e0e0e0c00043b2a0e0e0e0c00026429353d1a75000e0e0c0003030829362968016402013b293b1a60000e0c000303041a7300103b502935271c440e0e0e0e0e0e0e000000009c01000000000000|@2361,I11,@2362,@2364,@740,@2374,@2071,@2377,@2379,@2381,@2383,@2385,@2786,I105,I218,I251,@2464,@2388,@2892,I253,@2895,@2360,@2309| 2360:O3|@2897,@113,@84 2361:S32|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329 2362:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@2363,I253,I106,I255| 2363:S41|56414c55455f4f505328292e7072696e7456616c7565466f72547970652833296d6b41646472283129 2364:O3|0,@2365,@82 2365:O1|@2366 2366:D6,84|00802b352c362d372a3b1a4b000c0003030c293b1a45000e0e0c000302013b03043b5002041a3800102b3b1a36000e0e0e0c000303041a2f00103b503d2c6966420e0e0e0e0e0e0e000000004c00000000000000|@2368,I113,I251,@2369,I234,@2367| 2367:O4|@35,@863,@2373,@2372 2368:S25|434f44455452454528292e626f74746f6d4c6576656c283129 2369:O4|@35,@863,@2371,@2370 2370:O5|@865,90,0,90,0 2371:S12|626f74746f6d206c6576656c 2372:O5|@865,87,0,87,0 2373:S14|6c6f61643a206e65676174697665 2374:O1|@2375 2375:D1,20|00803b420e0e0e0e000000000c00000000000000|@2376| 2376:S46|56414c55455f4f505328292e7072696e7456616c7565466f725479706528332964756d6d7954797065732d283129 2377:O1|@2378 2378:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a362a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2377| 2379:O1|@2380 2380:D7,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203352b352c362a36293f1a47000c0003293b1a43000c0003641a34000e0c00021a39002a3b6a2c1a36000e0e0e0c00022a2a69270602013b420e0e0e000000005400000000000000|@1785,I105,I218,I243,I251,@1461,@2379| 2381:D1,20|00803d56173b6a42000000000c00000000000000|@2382| 2382:S44|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329706f6c79436f64652d283129 2383:O1|@2384 2384:D4,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203252b352c362a360310291a36000e0e0e0c00022b2a6964020a291a26002e0e7d0500026502013b420e0e0e000000004400000000000000|@550,I105,I218,@2383| 2385:O7|@2387,@2577,@2682,@2770,@2783,@2786,@2386 2386:O2|7,@2891 2387:D4,84|00832e3b1a51000e0e0c0003030a2d2c2c0e0e0e7d0600022d2c0e0e0e0c00022f5627563856493232567a568b569c1a2a000e0e0e0c000a291a24000e0c00023e2a2d3c6b661f04000000004c00000000000000|@2389,I251,@2390,@2388| 2388:O1|@2576 2389:S32|545950454944434f444528292e6170706c79546f496e7374616e636527283429 2390:O1|@2391 2391:D5,108|0088331a6a000e0e0e0c00021a65000e0e0c00020341333534362a352b362c37220e220e220e220e220e220e220e220e1a45000e0e0c000c2a220d220d220d220d220d220d220d220d1a30000e0c000a2a2a69270402013b1f090e0e0e0e0e0e000000006400000000000000|@1785,I105,I218,@2392,@2390| 2392:O1|@2393 2393:D20,588|008a3403033c02013303ae340318220c301a3c0231220d220d220d1a36020e0e0e0c000802012d220d311a2b0232220e220e220e1a25020e0e0c0008220c030a220e3232310c000402012d220f331a0702342210221022101a05020e0e0c0008293b692c2a692c2a692f2a69280e2a3b6a2a291aee010e0e0e0c00021ae9010e0e0c0002031d29352a362a353d1adc010e0c00030309292503511e283b02013b6502013c64030d291ac501220c0e0e0e7d1600022927090fcd2e220d3434341ab2010e0e0e0c0006293b1a9f010c000307cd220d3c31220d220d220d1a99010e0e0c00073b31291a7a010e0e0e0c00021a75010e0e0c0002031729362b3c1a7b010c0003292b25042504511e253b6502012a65292b1a68010e0c0003040300332b2a1a3f010c00021a3d010e0e0c000203043b5002041a4b01103b502a352b362b3b1a43010c0003030e2a2e2a35452a36462a37475102132b3c1a23010c00032a2a2505250526031e4750260429352a362b3722142b1a130122102215221522151ad8000202b5000e0c000822152c1afe0022112216221622161ac30002028e000c0008293b692b2a69220e2a6922112a69280e2a3b6a2a1aa9000e0e0c00021aa5000e0e0c00021a9d000e0e0c0002030c291a9a000e0e0e0c00020201293c320c00023c3b2b2d6b221e2b2b6a220d3b1aa0000e0c00032a2a69220f3b2b1a96000e0e0e0c000450221b35221c362210352b2a1a69000e0e0c0003312a3b6a642b0e0e0e0c00023f2a692718020d29352935322a2f0e0e7d100002641f0b0e000000004402000000000000|@2395,@2396,@2428,@2555,@2489,@2504,I105,I218,I251,@2464,@2466,@2560,I106,I107,@878,I113,@2567,@2394,I253,I255| 2394:O1|@2572 2395:S52|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329 2396:O1|@2397 2397:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@2399,@2398| 2398:O1|@2400 2399:S62|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296571436f64652d283129 2400:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@2398,@2403,I253,I107,@2401| 2401:O4|@35,@863,@2426,@2425 2402:S28|545950454944434f444528292e636f64654163636573732832292829 2403:O1|@2404 2404:D28,748|00822d353d1ae8020e0c000307db2d362e3729291add020e0e0c00021ad9020e0e0c0002032429352a362a35291acc021abd020e0e0c00036403052a68010207292503511e313b6502013b64291aa4020e0c00021aa1020e0e0c00020366293529351a97021a88020e0c000303043b5002041a8b0210293729322a1a76020e0e0e0c00021a71020e0e0c000203043b5002041a6f02102a352b362b3b1a69020e0e0c000303032a02172b3c1a5e020e0e0e0c00032a2a2505250526031e423b64270602013b2b291a2a020e0e0e0c00021a25020e0e0c0002033e29352a362a35291a2c021a0902020232010e0e0c000364031b2a351a18021af5010e0e0c000303043b5002041af701102a370207292503511e4c3b6502031af9016429353d1ace010e0e0e0c000303362937322a0e0e0e0c0002293529353b1ab4010e0c000303043b5002041acf011029362a372c362a2a1ac7010c00033d2d2b6a270702b92d1a90010e0c000203033c02682d1a83010c000203041aa701103b502d1aa4010e0c0002293e1a9f010c0003293b1a5f010c0003651a60010e0c000203033c02342d1a4f010c000203041a7f01103b502d1a7c010e0c0002321a38010e0c00020303320207321a6b010c00022a2a1a67010c00036503103003043b5002041a5b01101a5b0102322d1a09010e0e0c000203041a4f01103b50311af8000e0c00020303310207311a2b010c00022e2a1a37010c00033d2a2e6a65270502be2d35280e1acc000e0c000303ab2d362e37292e1abd000e0e0c000303043b5002041a0b01103b2b291aac000e0c00021aa9000e0e0c0002031729362b3c1af3000c0003292b25042504511e233b6502012a652f2a1ae0000e0c00036403492a2f2a1a73000c00021a71000e0e0c000203043b5002041a6f00102a352b362b3b1a69000e0e0c000303032a02172b3c1a5e000e0e0e0c00032a2a2505250526031e3f3b642704020e2d03043b5002041a8a00101a6e0065020628062e2e2e6b440e0e0e0e00000000e402000000000000|@2406,I251,I105,I218,@33,@1840,@878,I113,I107,@34,@855,@2407,@2411,@1784,I17,I243,@1784,I15,I152,I248,@2414,@2417,@1784,I253,@2421,I106,I234,@2405| 2405:O4|@35,@863,@2416,@2424 2406:S40|434f4445545245455f46554e4354494f4e5328292e66696e64456e747279496e426c6f636b283329 2407:O4|@35,@863,@2409,@2408 2408:O5|@2410,309,0,309,0 2409:S30|66696e64456e747279496e426c6f636b3a206e6f7420636f6e7374616e74 2410:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f46554e4354494f4e532e736d6c 2411:O1|@2412 2412:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@2411| 2413:S35|434f4445545245455f46554e4354494f4e5328292e736574496e6c696e652832292829 2414:O4|@35,@863,@2416,@2415 2415:O5|@2410,323,0,323,0 2416:S33|66696e64456e747279496e426c6f636b3a20696e76616c69642061646472657373 2417:O2|11,@2418 2418:O3|2,@2419,0 2419:O4|@35,@863,@2420,0 2420:S36|496e76616c6964206c6f616420656e636f756e746572656420696e20636f6d70696c6572 2421:O4|@35,@863,@2423,@2422 2422:O5|@2410,281,0,281,0 2423:S41|66696e64456e747279496e426c6f636b3a207475706c652f6461746174797065206d69736d61746368 2424:O5|@2410,288,0,288,0 2425:O5|@2427,83,0,83,0 2426:S9|4e6f20616363657373 2427:S34|6d6c736f757263652f4d4c436f6d70696c65722f545950454944434f44452e736d6c 2428:O1|@2429 2429:D25,596|008631353e1a50020e0c000307de3136291a48020e0c00021a45020e0e0c0002030d2936293b1a2f020c00036402013b031629352936293434343434341a2402220c0e7b090c0008313532363c28403b1a15020e0e0c00041a11022a2c6a2c3c1a0d020e0e0c0003292b2d6a2f3b1af301220e220e220e2f221422141af5010e0e0c000a2d3b1aef010c0003293b2a1aca010e0e0e0c00021ac5010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291abc010e0c0002291ab8010e0c00023d1ab4011ab5010e0e0c00032e1ab0013b2d2d3c3b3c680828072a69270e0fcc0000313528051a63010c00030382313632382937293629353d1a50010e0c00036503552937293629353d1a3f010c000303043b5002041a6b01103b5029362a372a2f1a63010c00031a61012a690402002c2b2b1a5a010e0e0e0c0004502935292212221222122212221222121a090122130e0e7b09130008292b313131220c220f1af40022101a2b01220d7b0b0b000a313528061ad5000e0e0c000303043b5002041a1301103b503136293b1add000e0e0c000329353c1ab2000e0e0e0c0003035430343131311af200020287000e0e0e0c0006293b1a93000c000303041adf00103b503b5029352935220c2a0c000229353d1a76000e0e0e0c0003030e293b3b1ac000340e0e7b050f000428062a3b3b6b2704023e29353f1a50000e0c00030322333b1aa1000e0e0c0003293b323232220d22101a400022111a7700220e7b0b0c000a293333333333331a2a00347b090b0008651f070e0e0e0e0e000000004c02000000000000|@2431,I251,I105,I218,@2428,I11,@2432,I106,@2442,I253,@2445,@2447,@2452,@2047,@2455,@2248,@2251,@2456,@2071,@2457,@2536,@2466,@2539,@2403,@2430| 2430:O11|@2542,@31,@769,@71,@2189,@73,@2199,@75,@2207,@36,@777 2431:S22|545950454944434f444528292e6d616b654571283429 2432:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 2433:O4|@35,@863,@2373,@2441 2434:S34|434f44455452454528292e6e65774c6576656c283129746869734c6576656c283129 2435:O4|@35,@863,@2437,@2436 2436:O5|@865,104,0,104,0 2437:S34|6d6b4c6f61643a206c6576656c206d757374206265206e6f6e2d6e65676174697665 2438:O1|@2439 2439:D9,356|00812b3b1a61010e0e0c000329291a5b010c00021a59010e0e0c000203b729352a362a3529321a4b010c000303033c029229353b1a3d010e0e0c0003031b31353b1a30010e0c0003030c293632361a27010c000302013b026a29353c1a15010e0e0c0003031b31353c1a08010e0c0003030c293632361aff000c000302013b024229353d1aed000e0e0c0003031b31353d1ae0000e0c0003030c293632361ad7000c000302013b021a29353e1ac5000e0e0c0003030c31353e1ab8000e0c000302013b6403052a68010207292503511ec23b6502013b642d3b1a8c000e0c00032a3b1a8f000c0003035d291a7e000e0e0e0c00021a79000e0e0c0002033129352936293c1a75000e0e0c0003322a69292e69333b2b1a68000e0c0004502c3c1a5a000e0e0e0c00033c2a69270602162f3b69293b69303b2b1a45000e0e0c0004501a40006502082a3529363c2a696566430e0e0e0e0e0e0e000000005c01000000000000|@2440,I253,I105,I218,I251,I113,I106,I255,@741| 2440:S36|434f4445545245455f46554e4354494f4e5328292e616464546f436c6f73757265283229 2441:O5|@865,101,0,101,0 2442:O1|@2443 2443:D10,148|0088331a92000e0e0e0c00021a8d000e0e0c00020369333534362a3629313131220e220e220e22120e0c000828061a6f00220f3b6b28061a6a0022103b6b293b692b2a69291a60000e0c00023e2a303c6b22133c1a55000e0e0c0003322a22152215221522152215221522151a41000e0e0c000a3c2c2b1a3a006b270c02031a36001f090e0e0e0e000000008c00000000000000|@2444,I105,I218,@739,@807,@2388,I106,@2442,@809,@742| 2444:S39|545950454944434f444528292e6d616b654571283429636f6d62696e65456e7472696573283229 2445:O1|@2446 2446:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363f2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2445| 2447:O1|@2448 2448:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c362a353f1a40000e0c000303043b5002041a3700102a362a1a34000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2449,@2447| 2449:O4|@35,@863,@2451,@2450 2450:O5|@865,79,0,79,0 2451:S9|646545787472616374 2452:O1|@2453 2453:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2454:S33|434f44455452454528292e6d6b53696d706c6546756e6374696f6e283629283129 2455:S10|65717b2e2e2e7d283229 2456:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2457:O1|@2458 2458:D12,284|00883337293629353c1a14010e0c000303112936291a0c011a05010e0e0c00036402013b03033c026729353c1af1000e0e0c000303112936291aec001ae1000e0e0c00036402013b03033c024329353c1acd000e0e0c000303112936291acc001abd000e0e0c00036402013b03033c021f29353c1aa9000e0e0c000303112936291aac001a99000e0e0c00036402013b6403051a9e00026f343729220c316a642d0c000229353d1a76000e0e0e0c0003030c293b3b1a80000e0c0004020628062a3b3b6b220c1a73000c00021a71000e0e0c00021a69000e0e0c00020303290225220c220c220c220c220c220c220c220c1a50000e0c0009291a4c000e0c00023e2a2d3c6b6565641f090e0e0e0e0e0e000000001401000000000000|@2460,I251,@50,@79,@81,@80,@802,@2403,I105,I218,@2459,@2388| 2459:O1|@2461 2460:S48|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229 2461:D5,92|0087321a5a000e0e0e0c00021a55000e0e0c00020331323533362a343434343434341a43000c00092a220c220c220c220c220c220c220c1a32000e0e0e0c00092a2a69270402013b1f080e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@2462,@2459| 2462:O1|@2463 2463:D11,236|0087323528061ae7000c000303193236293b1adf000c000329353c1ad2000e0e0e0c00036502013b032e2e333333331ac6000e0e0e0c0006293b1ab3000c000303041ab700103b503b5029352935302a2f0e0e0e7d0d0002322e2d31220c220c220c330e0e0c0008332f2e32220d220d220d1a8b000c000834302f33220e220e220e1a7f000c0008293b692b2a691a77002a692e2a69280e2a3b6a2a291a6c000e0c00021a69000e0e0c0002031d29352a362a353d1a38000e0c00030309292503511e263b02013b6502013c640309291a4100347d1200022927081f080e0e0e00000000e400000000000000|@2465,I251,I253,@2466,@2486,@2489,@2504,@809,I105,I218,@2464| 2464:O1|@2519 2465:S57|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229676574417267283129 2466:O1|@2467 2467:D17,564|00842e353d1a30020e0c000303101a2b022e69291a290269296801650fdc2e3528051a13020c000307d22e362f382937293629353d1a00020e0c00036503512937293629353d1aef010c000303043b5002041aef01103b5029362a372a2f1ae7010c00031ae5012a690402002c2b2b1ade010e0e0e0c000450293522102a2210221022101acd0122110e0e7b071100062a1ac4010e0c00021ac1010e0e0c00021ab9010e0e0c000203d72e291aa9010e0e0c00021aa5010e0e0c0002039529352a362a3529372e372a3629353c1a68010e0c000303112a3629353c1a5a010e0e0e0c00036402013b64031d2a3629362b3629362b2a1a40010204280191000e0e0e0c0003270402392a3629353b1a28010e0c000303112a3629353b1a1a010e0e0e0c00036402013b6403152a3629382b3629382b2a1a28010e0c0003270402013b6603052a68010207292503511ea23b6502013b64293b1ade000e0e0e0c0003030a32321afd00307e0a0003293529361af5002a69291ac700692968012705020b31311ade002f0e7e0900036502952e3528061aa2000e0e0e0c0003037a2e362f372a2a692b3b1ac2000e0e0e0c000329353f1a82000e0e0e0c0003032a323b1aad000e0e0c0003293528053b2b2d3b6805220d2a220d220d220d1a7600220e0e0e0e7b070e000629353c1a4a000e0e0e0c00030310332b311a78000e0c000429680164020e332a3333331a4600347b070b00062704020c2f2f1a47002d0e0e7e0700031f050e0e000000002c02000000000000|@2469,I251,@2470,-1,@2248,@2251,@2472,@2071,@2466,I105,I218,I113,@2473,@2481,I253,@2430,@2468| 2468:O1|@2482 2469:S45|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229 2470:D1,20|00805607420e0e0e000000000c00000000000000|@2471| 2471:S48|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229283129 2472:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2473:O1|@2474 2474:D8,220|00812c1ada000e0e0e0c00021ad5000e0e0c000203b62c352d362a35293b1ac7000c00032c362a291ab5000e0e0c00021ab1000e0e0c0002032429352a362a3529220c1aa6000e0e0e0c00036403052a68010207292503511e313b6502013b64291a7c000e0c00021a79000e0e0c0002034c293529361a77002a2e6a3b31291a5e000e0e0e0c00021a59000e0e0c0002031729362b3c1a5b000c0003292b25042504511e253b6502012a65293c1a44000e0c00032b2a692968012706020a2d321a3500337e0a0003270602013b430e0e00000000d400000000000000|@2476,I105,I218,I253,@2477,@2475,I106,@2473| 2475:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@2480,I107| 2476:S65|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229 2477:O1|@2478 2478:D11,684|00812c1aaa020e0e0e0c00022c1aa0020e0c00022a3528061a99020e0e0c0003030c293528061a8b020c000302013b03442a362a362a3b1a7e020e0e0e0c00032a3b1a73020c00032a353c1a66020e0e0e0c0003030c29353c1a58020e0c000302013b030b2c2c1a4a02330e7e0a00033b27040fdb2a353d1a39020e0e0c0003030c29353d1a2c020e0c000302013b03242a362b372b362c372c2b1a1e020e0e0e0c0003030a2b2a1a1102337e0a00033b27040fdd2a353e1af9010e0e0c0003030c29353e1aec010e0c000302013b03c82a362a362a2a2a3b1ad8010e0c0003030a293b1acd01337e0a00032a352b362b1acc010e0c00021ac9010e0e0c0002038e2b352c362c352d362c352d362c2b1aa1010e0e0c000303033c024e2c1a9f010c00021a9d010e0e0c000203142a1a8e010e0e0e0c00021a89010e0e0c000202013b03252c3b2c3b3f2f1a7a01020248010e0e0e0c00021a71010e0e0c00031a6d010e0e0c000602013b030d2b2a1a4a010e0e0e0c000302013b2704030d2b2a2506250626041eb03b02013b650205020206013b27060fd82a3528051a14010e0c0003030c293528051a07010c000302013b07dd2a362b382b362c382b372a372a3629353c1aeb000c000303112a3629353c1ade000e0e0e0c00036402013b6403152a3629362b3629362b2a1ac4000e0c0003270402392a3629353b1ab4000e0c000303112a3629353b1aa6000e0e0e0c00036402013b6403152a3629382b3629382b2a1aac000e0c0003270402013b65035c2c2b2a3b1a79000e0e0c0003030e293b1a6d00220c0e0e0e7e0c00032a352b362b1a68000e0c00021a65000e0e0c000203252b352c362c2b1a4d00020227000e0e0c0003030d2b2a2506250626041e4c3b02013b6502013b27040205020205003b270402013b65430e0e0e0e00000000a402000000000000|@2479,@1955,I251,I253,@2477,I105,I218,I223,I239,I154,I113| 2479:S56|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322973616d6554797065283229 2480:S68|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229283129 2481:D1,20|00805607420e0e0e000000000c00000000000000|@2471| 2482:D7,236|00822d1aea000e0e0e0c00021ae5000e0e0c000203bd2d352e362a3829353c1ad6000e0e0e0c00030399293629291abf000c00021abd000e0e0c0002032829352a362a352935220c352a2a1aaa000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a8b000c0003030e2c32321a8400330e0e7b050a0004293529363b2f291a66000e0e0e0c00021a61000e0e0c0002031729362b3c1a5f000c0003292b25042504511e253b6502012a65293c1a48000e0c00032b2a692706020d2a30301a3300310e7b050800046602091a2e002c69293b6964440e0e0e00000000e400000000000000|@2484,I105,I218,I251,@2468,I106,@2483| 2483:D1,20|00805607420e0e0e000000000c00000000000000|@2485| 2484:S67|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229 2485:S70|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229283129 2486:O4|@35,@863,@2488,@2487 2487:O5|@2427,635,0,635,0 2488:S6|676574417267 2489:O1|@2490 2490:D17,460|00862e322f2f2f1ac6010e0e0e0c0006293b1abf010c000307dc32353e1ab4010e0c000303483236291aac010e0c00021aa9010e0e0c0002030d2936293b1a93010c00036402013b031e2935293629220c220c220c220c220c220c1a8201220d0e0e0e7b090d00081a7901640fd8323528051a5f010c0003038a323633382937293629353d1a4c010e0c00036503552937293629353d1a3b010c000303043b5002041a4301103b5029362a372a2f1a3b010c00031a39012a690402002c2b2b1a32010e0e0e0c0004502935292213221322132213221322131a050122140e0e7b09140008292b34220d1af400220c220c220c2210020292001afd00220e0e0e7b0b0c000a323528061ac9000e0e0c000303043b5002041ae300103b503236293b1add000e0e0c000329353c1aa6000e0e0e0c000303041acb00103b503b5029353f1a9000020240000e0c00030326343b1ab5000e0e0c0003293b220c220e1a7f00220d220d220d22111a8c00220f0e7b0b0d000a293434343434341a6200220c0e0e0e7b090c0008022d29352935332a0e0c000229353d1a3a000e0e0e0c0003030e293d3b1a6400320e0e7b050d000428062a3d3b6b66641f070e0e0e0e0e0e00000000c401000000000000|@2492,@2466,I251,I105,I218,@2489,@1220,@2248,@2251,@2493,@2071,@2494,@2499,I253,@2491,@2430,@2403| 2491:O4|@35,@863,@2503,@2502 2492:S32|545950454944434f444528292e626f7865646e657373466f7254797065283429 2493:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2494:O1|@2495 2495:D7,132|008833372934336a64320e0e0e0c000229353d1a72000e0e0e0c0003030c293d3b1a68000e0c0004020628062a3d3b6b341a5c000e0c00021a59000e0e0c00021a51000e0e0c000203032902213432323232220e2210341a3e000e0e0e0c0009291a38000e0c00023e2a2d3c6b65651f090e0e0e0e0e0e0e000000007c00000000000000|@2497,I251,@2403,I105,I218,@2496,@2388| 2496:O1|@2498 2497:S59|545950454944434f444528292e626f7865646e657373466f7254797065283429626f7865646e657373466f72436f6e737472756374696f6e283229 2498:D8,172|0087321aaa000e0e0e0c00021aa5000e0e0c00020385323533362a303030220d220d220d22110e0e0e0c0008291a8800691a88002a691a83002a69280e2a3b6a2a291a6b000c00021a69000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e253b02013b6502013c64030b291a4d000e0e0c00020201292f22112211221122112211221122111a37000c00092a2a69270902013b1f080e0e00000000a400000000000000|@1785,I105,I218,@734,@809,I251,@2464,@2496| 2499:O4|@35,@863,@2501,@2500 2500:O5|@2427,397,0,397,0 2501:S30|626f7865646e657373466f72547970653a20556e6b6e6f776e2074797065 2502:O5|@2427,381,0,381,0 2503:S43|626f7865646e6573733a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2504:O1|@2505 2505:D19,524|00862e322f2f2f1a06020e0e0e0c0006293b1aff010c000307d932353e1af4010e0c000303883236291aec010e0c00021ae9010e0e0c0002030d2936293b1ad3010c00036402013b031e2935293629220c220c220c220c220c220c1ac201220d0e0e0e7b090d00083b2a291aaa010e0e0e0c00021aa5010e0e0c0002031729362b3c1a9f010c0003292b25042504511e253b6502012a65293f1a8c010e0c000303063d2a3b6a02031a8101650fd8323528051a5f010c0003038a323633382937293629353d1a4c010e0c00036503592937293629353d1a3b010c000303043b5002041a4b01103b5029362a372a2f1a43010202d5000c00031a3d012a690402002c2b2b1a36010e0e0e0c0004502935292213221322132213221322131a010122140e0e7b09140008292b34220d1af000220c220c220c22101a0501220e0e0e7b0b0c000a323528061ac9000e0e0c000303043b5002041aeb00103b503236293b1ae5000e0e0c000329353c1aa6000e0e0e0c000303041ad300103b503b5029353f1a9000020240000e0c00030326343b1abd000e0e0c0003293b220c220e1a7f00220d220d220d22111a9400220f0e7b0b0d000a293434343434341a6200220c0e0e0e7b090c0008022d29352935332a0e0c000229353d1a3a000e0e0e0c0003030e293e3b1a6c00320e0e7b050d000428062a3e3b6b66641f070e0e0e0e0e0e000000000402000000000000|@2507,@2466,I251,I105,I218,@2504,I106,I232,@742,@2248,@2251,@2508,@2071,@2509,@2514,I253,@2506,@2430,@2403| 2506:O4|@35,@863,@2518,@2517 2507:S27|545950454944434f444528292e73697a65466f7254797065283429 2508:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2509:O1|@2510 2510:D7,132|008833372934336a64320e0e0e0c000229353d1a72000e0e0e0c0003030c293e3b1a68000e0c0004020628062a3e3b6b341a5c000e0c00021a59000e0e0c00021a51000e0e0c000203032902213432323232220e2210341a3e000e0e0e0c0009291a38000e0c00023e2a2d3c6b65651f090e0e0e0e0e0e0e000000007c00000000000000|@2512,I251,@2403,I105,I218,@2511,@2388| 2511:O1|@2513 2512:S49|545950454944434f444528292e73697a65466f725479706528342973697a65466f72436f6e737472756374696f6e283229 2513:D7,180|0087321ab2000e0e0e0c00021aad000e0e0c00020389323533362a303030220d220d220d22110e0e0e0c0008293b691a8e002a691a89002a691a84002a69280e2a3b6a2a291a70000e0c00021a6d000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c64030b291a4d000e0e0c00020201293022122212221222122212221222121a37000c00092a2a69270a02013b1f080e0e0e0e0e0e00000000ac00000000000000|@1785,I105,I218,@809,I251,@2464,@2511| 2514:O4|@35,@863,@2516,@2515 2515:O5|@2427,459,0,459,0 2516:S25|73697a65466f72547970653a20556e6b6e6f776e2074797065 2517:O5|@2427,433,0,433,0 2518:S38|73697a653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2519:D20,388|00802b35280e1a7f010c000307dc2b36293b1a73010c000303051a6f010fd33b2a291a6b010c00021a69010e0e0c0002031729362b3c1a5f010c0003292b25042504511e223b6502012a65291a41010e0e0c00020303290207291a3f010c0002293b1a23010c000303033c020b291a2f011a30010e0c000303041a2b01103b502928403b1a25010e0e0c00042c1a20011a21010e0e0c0003293b2c1a1a010e0e0e0c000429291ae7000c00021ae5000e0e0c0002032d29352a362a1ad2000e0e0e0c00021acd000e0e0c00021ac5000e0e0c00020309292503511e353b02013b6502013c6403053b02677600291acc0002026b000e0c000229291a93000c00021a91000e0e0c0002031d29352a362a353c1a74000e0c00030309292503511e253b02013b6502013c6403033b02171a8f002a2c2f6b3d302b6a1a880028452b3b6b293b69661a800028452d3b6b292b69662c1a77000c0002503d2d2b6a27066402152b353d1a20000e0c000303043b5002041a5b00102b42000000007c01000000000000|@2521,I251,@809,I105,I218,I106,I152,16777215,I247,@2522,I11,@2464,@2524,@2526,@2532,@917,@34,@33,I47,@2520| 2520:O4|@35,@863,@2535,@2534 2521:S46|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129 2522:O4|4,@394,0,@2523 2523:O5|@1792,159,0,159,0 2524:O1|@2525 2525:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d362a2e0e0c00022a2f1a2b000c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@2524| 2526:O1|@2527 2527:D8,108|00822d1a6a000e0e0e0c00021a65000e0e0c000203452d352e362a353d1a58000e0c000303043b5002041a4f00102a362b372f312c1a48000e0c000450303c1a42000e0e0e0c00032c2a321a3a000e0e0e0c00042b2a69270602013b440e0e0e000000006400000000000000|@2529,I105,I218,I251,@2528,I255,I239,@2526| 2528:O4|@35,@863,@2531,@2530 2529:S58|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129636f7079546f566563283229 2530:O5|@2410,179,0,179,0 2531:S12|6e6f7420636f6e7374616e74 2532:O1|@2533 2533:D8,140|00802b1a8a000e0e0e0c00021a85000e0e0c000203652b352c362a291a71000e0e0c00021a6d000e0e0c0002033a29352a362a35291a60001a61000e0e0c000364031b2a351a50001a51000e0e0c000303043b5002041a4700102a370207292503511e473b6502031a3900642a1a38000e0c00022a2a69270402013b420e0e0e000000008400000000000000|@1785,I105,I218,@34,I251,@1840,@855,@2532| 2534:O5|@2410,210,0,210,0 2535:S31|6d616b6556616c202d206e6f7420636f6e7374616e74206f72207475706c65 2536:O4|@35,@863,@2538,@2537 2537:O5|@2427,723,0,723,0 2538:S21|457175616c69747920666f722066756e6374696f6e 2539:O4|@35,@863,@2541,@2540 2540:O5|@2427,687,0,687,0 2541:S40|6d616b6545713a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2542:D6,148|00812c1a92000e0e0e0c000229353d1a8a000e0e0e0c00030345293629353e1a7a000e0e0e0c000303152936291a70000e0c00021a6d000e0e0c00026402013b0311293629352936291a4c000e0c0002660209291a41000e0e0c00026402012964561756285639564a565b566c567d568e569f120b0001000a001a2b00220d7b0d04000c0e0e0e0e000000008c00000000000000|@2544,@1955,I251,I105,I218,@2543| 2543:O1|@2545 2544:S37|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f6164283229 2545:D13,668|008a220c3528051a96020e0e0e0c00030385220c36220d382937293629353d1a7e020e0e0e0c0003651a78020e0c0002030329025f2937293629353d1a61020e0e0c000303043b5002041a5b02103b5029362a372a2f1a53020c00031a51022a690402002c2b2b1a4a020e0e0e0c00045029352707220e220e220e220e220e220e220e220e220e220e1a2c02220f0e7b0d0f000c650fdc220c3528061a01020e0e0c000303043b5002041a0f02103b50220c36293b1a08020e0c000329353f1ade010e0e0e0c000303043b5002041af301103b50293629293b1ac4010e0c000303033b023529352a362a37293629353c1aad010e0e0c00036403102936293622142a1a9b010c00036502013b6403033c0207292503511e3f3b65640306220d68010fcc29293b1a77010c000303033b023529352a362a37293629353c1a61010e0e0c00036403102936293622122a1a4f010c00036502013b6403033c0207292503511e3e3b656403053468010fd129293b020217011a28010e0c000303033b023529352a362a37293629353c1a11010e0e0c00036403102936293622102a1aff000c00036502013b6403033c0207292503511e433b6564030532680102a129293b1adc000e0c000303033b023929352a362a37293629353c1ac5000e0e0c000364031429362936220e2a1ab30002026e000c00036502013b6403033c0207292503511e433b65640305306801025129293b1a8c000e0c000303033b023929352a362a37293629353c1a75000e0e0c000364031429362936220c2a1a630002021e000c00036502013b6403033c0207292503511e433b656403052e680102013b293b1a3c000e0c000303041a5b00103b503b502935293528053b2b2d3b68052f3b2b1a48000e0c0004502b27071f0b0e0e000000009402000000000000|@2547,I251,I218,@2248,@2251,@2548,@2071,@2543,@2549,I253,@2552,@2546,I255| 2546:O4|@35,@863,@2551,@2554 2547:S48|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f61642832297072656654797065283129 2548:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2549:O4|@35,@863,@2551,@2550 2550:O5|@1964,2708,0,2708,0 2551:S40|74797065436f6e73747246726f6d4f7665726c6f61643a204e6f206d61746368696e672074797065 2552:O4|@35,@863,@2551,@2553 2553:O5|@1964,2700,0,2700,0 2554:O5|@1964,2698,0,2698,0 2555:O1|@2556 2556:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@2558,@2557| 2557:O1|@2559 2558:S72|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296765745479706556616c7565466f724944283129 2559:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@2557,@2403,I253,I107,@2401| 2560:O1|@2561 2561:D13,428|00852e312f2f2f1aa6010e0e0e0c0006293b1a9f010c000307d131353e1a94010e0c00030341313629322a1a8a010e0e0e0c00021a85010e0e0c000203252a352b362a36292d220e220e220e220e1a6f010c00072b2a2506250626041e323b2704020129660fd5313528051a46010e0e0e0c000303bd313632382937293629353d1a30010e0c00036503512937293629353d1a1f010c000303043b5002041a2301103b5029362a372a2f1a1b010c00031a19012a690402002c2b2b1a12010e0e0e0c000450293529221222122212221222121aeb0022137b0813000729321af3000c0003332a1aef00020299000c00030303330201292c2a2a1abc000e0c00021ab9000e0e0c000203242a352b362a2c22102210221022101aa5000e0e0c00072a2a2505250526031e303b6602012927060251313528061a7a00020246000e0e0e0c0003033d3136293b1a8f000c000329353c1a5e000e0e0e0c0003030332021f29353f1a4d000e0e0c0003030332020f2933333333331a4600347b080b00076502013002152935293629331a49000e0e0c000303032902013265641f060e0e00000000a401000000000000|@2563,@2466,I251,I105,I218,@2560,@2248,@2251,@2564,@2071,@2562,I233,I253| 2562:O1|@2565 2563:S27|545950454944434f444528292e6765744d61784465707468283329 2564:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2565:D8,316|00812b1a3a010e0e0e0c00021a35010e0e0c000207d52b352c362a3829353b1a26010e0e0e0c000307dd293629291a0f010c00021a0d010e0e0c0002038b29352a362a3734372a3629353c1afa000e0e0e0c000303112a3629353c1aea000e0e0e0c00036402013b6403152a3629362b3629362b2a1ad0000e0c0003270402392a3629353b1ac0000e0c000303112a3629353b1ab2000e0e0e0c00036402013b6403152a3629382b3629382b2a1a9c000e0c0003270402013b6503033c0207292503511e963b6502013b6403433b2c291a6d000e0e0c00021a69000e0e0c0002031b29362b3c1a670002023b000c0003292b25042504511e283b6502012a65293c1a4c0032020213000e0e0e7e090003302c1a3f00310e0e7e0800032f2b1a3300300e0e7e0700031a2d00430e0e0e0e000000003401000000000000|@2566,I105,I218,I251,I113,I106,@2562,-1| 2566:S47|545950454944434f444528292e547970655661724d61702e636865636b54797065436f6e7374727563746f72283229 2567:O1|@2568 2568:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@2570,@2569| 2569:O1|@2571 2570:S65|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329626f786564436f64652d283129 2571:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@2569,@2403,I253,I107,@2401| 2572:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@2574,@2573| 2573:O1|@2575 2574:S64|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d6574657228332973697a65436f64652d283129 2575:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@2573,@2403,I253,I107,@2401| 2576:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2388| 2577:O3|2,@2579,@2578 2578:O2|@2588,0 2579:O4|@2581,@2580,2,1 2580:O1|@2584 2581:O1|@2582 2582:D1,20|00813b430e0e0e0e000000000c00000000000000|@2583| 2583:S10|6572726f72436f646532 2584:D2,20|00801a1300420e0e000000000c00000000000000|@2586,@2585| 2585:O2|3,@2587 2586:S14|7072696e742d66756e6374696f6e 2587:S2|666e 2588:O4|@34,69,@2589,0 2589:O3|2,4,@2590 2590:O6|@874,@850,@2592,@2607,@2608,@2591 2591:O2|@909,@2631 2592:O2|@894,@2593 2593:O2|@2595,@2594 2594:O2|@2601,@2600 2595:O2|@2597,@2596 2596:O3|0,@2599,@876 2597:O2|1,@2598 2598:O2|2,3 2599:O8|@809,@2583,0,0,@1129,0,0,1 2600:O2|@2605,@902 2601:O2|@1695,@2602 2602:O3|0,@2603,@876 2603:O8|@2604,@2586,0,0,@737,0,0,1 2604:O3|2,@2585,0 2605:O2|@2606,@855 2606:O3|0,2,0 2607:O14|2,2,2,2,2,2,2,2,2,2,2,2,2,2 2608:O15|@2610,@2614,@2613,@2612,@2581,@2580,@2579,@2619,@2618,@2623,@2622,@2626,@2611,@2628,@2609 2609:O4|I251,@2628,1,1 2610:O6|@2612,@2579,@2618,@2622,@2611,@2609 2611:O4|@785,@2626,3,1 2612:O4|@2614,@2613,3,1 2613:O1|@2616 2614:O1|@2615 2615:D1,20|00813b430e0e0e0e000000000c00000000000000|@2583| 2616:D2,20|00801a1300420e0e000000000c00000000000000|@2617,@713| 2617:S13|7072696e742d64656661756c74 2618:O4|I113,@2619,3,1 2619:O1|@2620 2620:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2621,@30,I253| 2621:S9|7072696e742d696e74 2622:O4|I251,@2623,1,1 2623:O1|@2624 2624:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2625,@25,I253| 2625:S10|7072696e742d626f6f6c 2626:O1|@2627 2627:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@862,@32,I253| 2628:O1|@2629 2629:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2630,@76,I253| 2630:S10|7072696e742d63686172 2631:O2|@2633,@2632 2632:O2|0,@2671 2633:O2|@2635,@2634 2634:O2|@2656,0 2635:O4|@33,69,@2636,0 2636:O2|0,@2637 2637:O2|0,@2638 2638:O2|0,@2639 2639:O2|0,@2640 2640:O2|@2641,@740 2641:O2|@2643,@2642 2642:O2|@2651,@2650 2643:O4|@33,69,@2644,0 2644:O2|@2645,@791 2645:O2|@2647,@2646 2646:O2|@2647,0 2647:O4|@34,69,@2648,0 2648:O3|0,@797,@2649 2649:O6|@872,@850,@796,I49,@907,@889 2650:O2|@2651,0 2651:O4|@34,69,@2652,0 2652:O3|2,4,@2653 2653:O4|@917,@2655,@2654,@2611 2654:O2|@2646,@791 2655:O2|@2648,@920 2656:O4|@34,69,@2657,0 2657:O3|2,6,@2658 2658:O4|@917,@2660,@2659,@2610 2659:O2|0,@2665 2660:O2|@855,@2661 2661:O2|@855,@2662 2662:O2|@855,@2663 2663:O2|@855,@2664 2664:O2|@2652,@922 2665:O2|0,@2666 2666:O2|0,@2667 2667:O2|0,@2668 2668:O2|@2669,@740 2669:O2|@2670,@2650 2670:O4|@33,69,@2654,0 2671:O2|0,@2672 2672:O2|0,@2673 2673:O2|0,@2674 2674:O2|0,@2675 2675:O2|0,@2676 2676:O2|0,@2677 2677:O2|0,@2678 2678:O2|0,@2679 2679:O2|0,@2680 2680:O2|0,@2681 2681:O2|@2641,@885 2682:O2|@2684,@2683 2683:O2|@2708,@2707 2684:O2|@769,@2685 2685:O3|2,@2618,@2686 2686:O2|@2687,0 2687:O4|@34,69,@2688,0 2688:O3|2,4,@2689 2689:O6|@874,@850,@2690,@2607,@2608,@2591 2690:O2|@894,@2691 2691:O2|@2693,@2692 2692:O2|@2695,@899 2693:O2|@2694,@855 2694:O3|0,I113,0 2695:O2|@1276,@2696 2696:O3|0,@2697,@876 2697:O8|@2699,@2621,0,0,@2698,0,0,1 2698:O2|@2706,0 2699:O4|3,@818,@2700,1 2700:O4|3,@2702,@2701,1 2701:O3|2,I253,0 2702:O2|@2704,@2703 2703:O2|@827,0 2704:O2|@2705,1 2705:O3|2,@30,0 2706:O2|1,@845 2707:O2|@2729,@2728 2708:O2|@704,@2709 2709:O3|2,@2622,@2710 2710:O2|@2711,0 2711:O4|@34,69,@2712,0 2712:O3|2,4,@2713 2713:O6|@874,@850,@2714,@2607,@2608,@2591 2714:O2|@894,@2715 2715:O2|@2717,@2716 2716:O2|@2720,@2719 2717:O2|@2718,@855 2718:O3|0,I251,0 2719:O2|@905,@902 2720:O2|@988,@2721 2721:O3|0,@2722,@876 2722:O8|@2723,@2625,0,0,@2698,0,0,1 2723:O4|3,@818,@2724,1 2724:O4|3,@2725,@2701,1 2725:O2|@2726,@2703 2726:O2|@2727,1 2727:O3|2,@25,0 2728:O2|@2751,0 2729:O2|@777,@2730 2730:O3|2,@2611,@2731 2731:O2|@2643,@2732 2732:O2|@2733,0 2733:O4|@34,69,@2734,0 2734:O3|2,4,@2735 2735:O6|@874,@850,@2736,@2607,@2608,@2591 2736:O2|@894,@2737 2737:O2|@2739,@2738 2738:O2|@2741,@899 2739:O2|@2740,@2648 2740:O3|0,@785,@2646 2741:O2|@2743,@2742 2742:O3|0,@2745,@876 2743:O2|1,@2744 2744:O2|2,10 2745:O8|@2746,@862,0,0,@2698,0,0,1 2746:O4|3,@818,@2747,1 2747:O4|3,@2748,@2701,1 2748:O2|@2749,@2703 2749:O2|@2750,1 2750:O3|2,@32,0 2751:O2|@2207,@2752 2752:O3|2,@2609,@2753 2753:O2|@2754,0 2754:O4|@34,69,@2755,0 2755:O3|2,4,@2756 2756:O6|@874,@850,@2757,@2607,@2608,@2591 2757:O2|@894,@2758 2758:O2|@2717,@2759 2759:O2|@2760,@2719 2760:O2|@2762,@2761 2761:O3|0,@2764,@876 2762:O2|1,@2763 2763:O2|2,12 2764:O8|@2765,@2630,0,0,@2698,0,0,1 2765:O4|3,@818,@2766,1 2766:O4|3,@2767,@2701,1 2767:O2|@2768,@2703 2768:O2|@2769,1 2769:O3|2,@76,0 2770:O3|2,@2612,@2771 2771:O2|@2772,0 2772:O4|@34,69,@2773,0 2773:O3|2,4,@2774 2774:O6|@874,@850,@2775,@2607,@2608,@2591 2775:O2|@894,@2776 2776:O2|@2778,@2777 2777:O2|@2779,@899 2778:O2|@1208,@2596 2779:O2|@1217,@2780 2780:O3|0,@2781,@876 2781:O8|@2782,@2617,0,0,@737,0,0,1 2782:O3|2,@713,0 2783:O2|7,@2784 2784:O8|@809,@2785,0,0,@1129,1,0,1 2785:S10|6e6f457175616c697479 2786:O4|@2787,@2577,@2682,@2770 2787:D2,36|00822d2d562756385649301a1a00317b080500070e0e0e0e000000001c00000000000000|@2789,@2788| 2788:O1|@2790 2789:S30|545950454944434f444528292e7072696e746572466f7254797065283329 2790:D82,2756|008530353d1ac00a0e0c0003036a1abb0a291abb0a0c00021ab90a0e0e0c0002031d29352a362a353d1a9c0a0e0c00030309292503511e253b02013b6502013c64030b1a920a1a930a0c000202031a870a3b1a8b0a0c00023c1a880a1a890a0e0e0c00032b1a840a3b2d2d3c3b3c680828072a6927040fd930353e1a4a0a0e0e0e0c000307cd303631372a1a420a0e0e0e0c00021a3d0a0e0e0c000207cf2a352b36293b1a210a0e0e0c000307d42a352b36220c35220d363c28403b1a310a0e0e0c00041a2d0a2a2c6a2c3c1a290a0e0e0c0003292b2d6a2f2a22132213221322131a170a0c00071a150a1a160a0e0e0e0c00023e2a2c3c6b331a0b0a1a0c0a0e0c00033d2a3b6a293b691a020a2a69280e2a3c6a2a291ab6090e0e0e0c00021ab1090e0e0c0002031d29352a362a353d1a94090e0c00030309292503511e283b02013b6502013c64030f291a8d090204630974050c00020201291ab609291a6e090e0e0e0c00021a69090202ee040e0e0c0002032129352a362a353d1a48090202d0010e0c00030309292503511e303b02013b6502013c64030b1a7a091a3b090c000202031a6f091a7009291a20090e0c00021a1d090e0e0c0002031d29352a362a353d1a00090e0c00030309292503511e263b02013b6502013c64030b1a3e091af7080c000202031a3309293b69322a692c2a692e2a69291a27090c00021a2509291ac9080e0e0c00021ac5080e0e0c0002031d29352a362a353d1aa8080e0c00030309292503511e273b02013b6502013c64030b1af2081a9f080c000202031ae7082a3b692a2a69280e2a3b6a2a291a7b080c00021a79080e0e0c0002031d29352a362a353d1a5c080e0c00030309292503511e253b02013b6502013c64030b291a55080e0e0c0002020129293b691a9b082a691a9a082a691a99082a691a98082a69280e2a3c6a2a291a20080e0c00021a1d080e0e0c0002031d29352a362a353d1a00080e0c00030309292503511e263b02013b6502013c64030b291af9070e0e0c0002020129221f3b1a4f080c0003293b2a1ad6070e0e0e0c00021ad1070e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a1c080e0c0002291ab0070e0c00023c1a10081aad070e0e0c00032e1a08083b2d2d3c3b3c680828072a69272a0fca2b29353b1a6d070e0e0c00030304293702122936293b1ad3070c0003292503511e1f3b656407d32c3c2a1a4f070c00021a4d070e0e0c000203842a352b362a352c3c1ab7070c00032a2a1a27070c000303033c024a2a1a23070c00021a21070e0e0c00020314291a12070e0e0e0c00021a0d070e0e0c000202013b03212a3b2b3b3f2e1a7a070e0e0e0c00021a75070e0e0c00031a71070e0e0c000602013b6403182c3c1afd060e0e0c00032b2a2506250626041e8b3b6402013b6602013c6503413b2d291ab40602023a020e0c00021aad060e0e0c0002031729362b3c1ac3060c0003292b25042504511e273b6502012a65293d1a140702020a000e0c00036402013b02013b3435220c363c28403b1a89060e0e0c00041af5062a2c6a2c3c1a81060e0e0c0003292b2d6a3b34291a4a060e0e0e0c00021a45060e0e0c0002031729362b3c1a5b060c0003292b25042504511e253b6502012a65291ab5061a32060e0e0e0c0003220c2a1aaa060e0e0e0c000332030329020a291a9e061a9f060c000333030428280202287b3d2a3b6a293b691a25062a69280e2a3c6a2a291ad9050e0e0c00021ad5050e0e0c0002031d29352a362a353d1ab8050e0c00030309292503511e273b02013b6502013c64030b291ab1050e0e0c00020201292f3b1ac405221d221d221d221d221122181a31060e0e0c000a293b692b2a69280e2a3b6a2a291a74050e0c00021a71050e0e0c0002031d29352a362a353d1a54050e0c00030309292503511e263b02013b6502013c64030b291a4d050e0e0c0002020129293b691adf052a691ade052a691add052a691a90052a69280e2a3c6a2a291a18050e0c00021a15050e0e0c0002031d29352a362a353d1af8040e0c00030309292503511e263b02013b6502013c64030b291af1040e0e0c000202012922193b1a47050c0003293b2a1ace040e0e0e0c00021ac9040e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a14050e0c0002291aa8040e0c00023c1a48051aa5040e0e0c00032e1a40053b2d2d3c3b3c680828072a6927236502691a3005291a6c040e0c00021a69040e0e0c0002031d29352a362a353d1a4c040e0c00030309292503511e263b02013b6502013c64030b1afe041a43040c000202031af3043b1a3b040c00023c1aec041a39040e0e0c00032b1ae4043b2d2d3c3b3c680828072a692704650fdb303528051af8030e0c000307d53036313732382937293629353d1ae2030e0e0e0c00036503512937293629353d1acf030c000303043b5002041a9b04103b5029362a372a301a93040c00031a91042a690402002c2b2b1a8a040e0e0e0c000450293529221222122212221222121ac30322137b08130007323533363c28403b1aa5030e0e0c00041a5d042a2c6a2c3c1a9d030e0e0c0003292b2d6a2f372935292d31311a45040e0e0c000529353d1a4e030e0e0e0c0003030c293c3b1a30040e0c0004020628062a3c3b6b220c1a6303221422142214221433020210031a13040202cf010c0008220d3b1a12030e0e0e0c000303d42a1afe0369291a3d030e0e0c00023e2a1af3033c6b1af2031a2b030c00023e2a2c3c6b1ae80322121a23030c0003220e3b1a4e030e0e0e0c0003293b2a1ad2020e0e0e0c00021acd020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a18030e0c00022c1a9c031a91020e0e0c000303033c02222c1a8b020c00021a89020e0e0c000203102c3b1a79033b3f1a00030e0c000602013b03051a6c0302012c2a1a71020e0e0c00023c1a60031a6d020e0e0c0003302c3b2d2d3c3b3c680828072a69270d0fcf2a1a460369291a69020e0e0c00023e2a1a3b033c6b2c1a59020e0e0c00023e2a2c3c6b1a2c031a49020e0e0c00023e2a2c3c6b1a200322141a3f020c000322103b1a6a020e0e0e0c0003293b2a1aee010e0e0e0c00021ae9010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a34020e0c00022c1ab8021aad010e0e0c000303033c02222c1aa7010c00021aa5010e0e0c000203102c3b1a95023b3f1a1c020e0c000602013b03051a880202012c2a1a8d010e0e0c00023c1a90021a8901020215000e0e0c0003302c3b2d2d3c3b3c680828072a69270f270e0fd4303528061a45010e0e0c000303bd3036293b1aaf010c000329353f1a2e010e0e0e0c0003032a323b1a49020e0e0c0003293528053b2b2d3b680529220c220c220c220c220c1a3801220d0e7b080d000729353c1af6000e0e0e0c000303502d333232321a12020e0e0e0c0006293b1adb000c000303041a0302103b503b5029352935342a0e0c000229353d1abe000e0e0e0c0003030e293c3b1aa001340e0e7b050e000428062a3c3b6b2704021a2a3b1a11010e0e0c00032933333333331abf00340e7b080b000765026f1ab201291a8200020264000e0e0e0c00021a79000e0e0c0002031d29352a362a353d1a5c000e0c00030309292503511e2c3b02013b6502013c64030b1a7a011a53000c000202031a6f013b1a4b000c00023c1a68011a49000e0e0c00032b1a60013b2d2d3c3b3c680828072a6927041f0600000000bc0a000000000000|@2792,I251,@2793,I105,I218,@2796,@2464,@2447,@2797,@2047,@2586,I11,@2799,I106,@2788,@1169,@2388,@2800,@389,@1358,@2801,@2803,@2804,@2807,@2808,@2810,@2813,@809,@809,@742,@809,I253,@2445,@2814,@2816,@510,I223,I239,I154,I231,@2817,@2818,@2821,@2827,@1982,@2832,@809,@809,@742,@2856,@2816,@2858,@2862,@2863,@2816,@2248,@2251,@2865,@2071,@2866,@2867,@2403,@2869,@951,@2701,@1169,@2876,I48,@1591,@2877,@951,@2701,@1169,@2876,@2879,@2430,@2466,@2881,@2884,@2888,@2889,@2791| 2791:S11|7072696e742d656d707479 2792:S42|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f6465283229 2793:O2|@1358,@2794 2794:O2|@2795,0 2795:O3|2,@2587,0 2796:O3|14,@2793,1 2797:O1|@2798 2798:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2799:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 2800:S2|203d 2801:O2|@742,@2802 2802:O2|@742,@951 2803:O3|14,@2801,1 2804:O2|@1358,@2805 2805:O2|@2806,0 2806:O3|2,125,0 2807:O3|14,@2804,1 2808:O1|@2809 2809:D7,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36291a72000e0e0e0c0002293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d09000229270602031a2800420e0e0e000000007c00000000000000|@2263,I105,I218,@2808,I251,@2464,@809| 2810:O2|@1358,@2811 2811:O2|@2812,0 2812:O3|2,123,0 2813:O3|14,@2810,1 2814:O1|@2815 2815:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2816:S14|7072696e742d6c6162656c6c6564 2817:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 2818:O1|@2819 2819:D1,20|00802b420e0e0e0e000000000c00000000000000|@2820| 2820:S52|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296669656c64732d283129 2821:O2|@2822,@83 2822:D7,124|00812c3b1a79000e0e0c000303202b3b1a6d000e0e0c000303043b50020b56071a61003b1a61006b103b503b023b2c352d362d1a56000e0e0e0c00021a51000e0e0c000203043b50020b56271a35003b1a41006b103b502d352e362c2b692c2b300c00032a2a692706430e0e0e0e0e0e000000007400000000000000|@2824,I251,@2825,@2823,I105,I218,@2823| 2823:O5|@2826,51,0,51,0 2824:S17|4c697374506169722e7a69704571283229 2825:S14|556e657175616c4c656e67746873 2826:S20|2e2f62617369732f4c697374506169722e736d6c 2827:O1|@2828 2828:D2,28|00802b3529351a17002a6965420e0e0e000000001400000000000000|@2830,@2829| 2829:D2,36|00802b35293556272a1a1c002f0e0e0e7e0500030e0e0e0e000000001c00000000000000|@2831,I29| 2830:S56|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283129 2831:S59|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283229283129 2832:O1|@2833 2833:D35,1204|0088331ab2040e0e0e0c00021aad040e0e0c000203043b5002041aa304103b5033353436293b1a9b040c000307cc2a3529352a362d362a33220f220f220f220f22140e0e0e0c000728061a7b042c3b6b1a79041a7a040e0e0e0c00023e2a1a73043c6b293b692c2a69280e2a3b6a2a1a46040e0e0e0c00021a41040e0e0c00021a39040e0e0c0002030c291a4a040e0e0e0c0002020129293b69291a32040e0e0e0c00023e2a343c6b0402002214030d1a29042a2a35452a36465102b6220e1a1e041a1f040c00033d2a3b6a293b691a16042a69280e2a3c6a2a291ada030e0e0e0c00021ad5030e0e0c0002032129352a362a353d1acc030202f8000e0c00030309292503511e2c3b02013b6502013c64030b291ac1030e0e0c00020201291aca03291a92030e0e0e0c00021a8d030e0e0c0002031d29352a362a353d1a84030e0c00030309292503511e283b02013b6502013c64030b1a96031a7b030c000202031a8b03293b692b2a69322a45287d46260a29352a363d2a3b6a293b691a67032a69280e2a3c6a2a291a2b030c00021a29030e0e0c0002031d29352a362a353d1a20030e0c00030309292503511e253b02013b6502013c64030b291a19030e0e0c0002020129293b69322a69293b1af2020e0e0e0c0003030331020b312a1a12030e0e0e0c0003291a0c03221f0e0e7d2700022a3529352a362d3604020032030d1af7022a2a35452a36465102b42c1aed021ace020e0e0e0c00033d2a3b6a293b691ac2022a69280e2a3c6a2a291a86020e0e0e0c00021a81020e0e0c0002031d29352a362a353d1a78020e0c00030309292503511e283b02013b6502013c64030b291a71020e0e0c00020201291a9202291a42020e0e0e0c00021a3d020e0e0c0002031d29352a362a353d1a34020e0c00030309292503511e283b02013b6502013c64030b1a5e021a2b020c000202031a5302293b692b2a69322a45287d46260a29352a362d220d221222122212221222170e0c000728061aeb012f3b6b1a29021aea010e0e0e0c00023e2a1ae3013c6b293b692c2a69280e2a3b6a2a1ab6010e0e0e0c00021ab1010e0e0c00021aa9010e0e0c0002030c291aba010e0e0e0c0002020129293b69291aa2010e0e0e0c00023e2a343c6b1ad401291a78010e0c00021a75010e0e0c0002031d29352a362a353d1a6c010e0c00030309292503511e263b02013b6502013c64030b1aa2011a63010c000202031a97011a9801291a34010e0c00021a31010e0e0c0002031d29352a362a353d1a28010e0c00030309292503511e263b02013b6502013c64030b1a66011a1f010c000202031a5b01293b692b2a692d2a69293b1af5000e0e0c000303042211020a22112a1a40010e0c000322233c1a3a010e0e0e0c000322192a22252225222522252225222522251a24010e0c000a2b2a1a1f010c00031a1d0122151acc000e0c00033d2a3b6a293b691ac2002a69280e2a3c6a2a291a86000e0e0e0c00021a81000e0e0c0002031d29352a362a353d1a78000e0c00030309292503511e283b02013b6502013c64030b291a71000e0e0c0002020129293b69291abe000e0e0e0c00023d222f3b6a293b691ab1002a69291a43000c00023e2a1aa7003c6b3c2a3022106b272a1f090e0e0e0e0e0e0e00000000ac04000000000000|@2835,I105,I218,@2836,I251,@993,@2838,@2388,@2840,@2464,@2841,@2800,@389,@1358,@2801,@2803,@2842,@2844,@2841,@2800,@2801,@2803,@2838,@2846,@2849,@2801,@2803,@2850,I106,@2832,@2852,@1042,@2854,@1597,@2834| 2834:O3|2,I234,0 2835:S53|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f646528322961735265636f7264283229 2836:O4|@77,@2231,0,@2837 2837:O5|@2427,569,0,569,0 2838:O2|@2839,@734 2839:O4|6,@739,1,0 2840:O3|2,I107,0 2841:O2|0,41 2842:O1|@2843 2843:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2842| 2844:O1|@2845 2845:D7,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36291a72000e0e0e0c0002293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d09000229270602031a2800420e0e0e000000007c00000000000000|@2263,I105,I218,@2844,I251,@2464,@809| 2846:O2|@1358,@2847 2847:O2|@2848,0 2848:O3|2,44,0 2849:O3|14,@2846,1 2850:O1|@2851 2851:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2850| 2852:O1|@2853 2853:D6,132|00812c1a82000e0e0e0c00021a7d000e0e0c0002035b2c352d36292e1a71000e0e0c0003293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d0a000229270602012b430e0e0e0e0e000000007c00000000000000|@2263,I105,I218,@2852,I251,@2464| 2854:O1|@2855 2855:D7,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36291a72000e0e0e0c0002293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d09000229270602031a2800420e0e0e000000007c00000000000000|@2263,I105,I218,@2854,I251,@2464,@809| 2856:O1|@2857 2857:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2858:O2|@1358,@2859 2859:O2|@2860,0 2860:O3|2,@2861,0 2861:S2|2829 2862:O3|14,@2858,1 2863:O1|@2864 2864:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2865:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 2866:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 2867:O1|@2868 2868:D12,252|00832e353f1af8000e0c000303382e362f372936293131311ae9000e0e0c000529353d1ada000e0e0e0c0003030e292d3b1ad400320e0e7b050a000428062a2e3b6b270402a42e353d1ab4000e0c0003037e2e362f372a3b1ab1000e0e0c00032a3b1aa7000c00032935322a1aa1000e0e0c0003293b1a9b000c000303041a9700103b503b50293b1a91000e0e0c00030321293c1a79000e0e0c00032d2a3b6a64330e0e0e0c000229331a73000c00036402162c3b1a5c000e0c000303041a6300103b503b503d2d693f2a692707021a2e353c1a2a000e0e0e0c000303043b5002041a4300103b502e361f040e0e0e0e00000000f400000000000000|@2402,I251,@2867,@2403,I253,I107,I234,@2435,I233,@2438,@2433,@2401| 2869:O1|@2870 2870:D10,212|0086311ad2000e0e0e0c00021acd000e0e0c000203a9313532362a2e33333333220f0e0e0e0c00072b2f1ab30032220d220d220d1aad000e0e0c00082c301a9f0033220e220e220e1a9d000e0e0c0008293b692b2a692d2a691a90002a69280e2a3b6a2a291a70000e0c00021a6d000e0e0c0002031d29352a362a353d1a70000e0c00030309292503511e263b02013b6502013c64030b291a59000e0e0c0002020129322213221322132213221322131a45000e0e0c00082a2a69270c02013b1f070e0e0e0e0e0e00000000cc00000000000000|@1785,I105,I218,@2871,@2489,@2504,@809,I251,@2464,@2869| 2871:O1|@2872 2872:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@2874,@2873| 2873:O1|@2875 2874:S70|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296d616b655072696e7465724964283129636f6465466f724964283129 2875:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@2873,@2403,I253,I107,@2401| 2876:S6|7072696e742d 2877:O1|@2878 2878:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2879:O1|@2880 2880:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2881:O4|@35,@863,@2883,@2882 2882:O5|@2427,474,0,474,0 2883:S48|7072696e746572466f72547970653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2884:O2|@1358,@2885 2885:O2|@2886,0 2886:O3|2,@2887,0 2887:S7|3c656d7074793e 2888:O3|14,@2884,1 2889:O1|@2890 2890:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 2891:O8|@2782,@2617,0,0,@737,1,0,1 2892:O4|@35,@863,@2894,@2893 2893:O5|@2427,144,0,144,0 2894:S19|6765744361636865645479706556616c756573 2895:O1|@2896 2896:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@2895| 2897:D34,1012|00822c291af1030e0e0c00021aed030e0e0c0002032429352a362a35291ae0031ae1030e0e0c00036403052a68010207292503511e313b6502013b64293b1ac3030c0003036b1abf03291aab030c00021aa9030e0e0c0002032429352a362a35291a9c031a9d030e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a7f030c000303041a7f03103b503b50293529351a67031a68030e0c000303043b5002041a6703103b50293765021e293529351a48031a49030e0e0c000303043b5002041a4703103b502937642e291a24030e0c00021a21030e0e0c0002032429352a362a35291a28031a15030e0e0c00036403052a68010207292503511e303b6502013b64293b1af7020c000303051a0303021c293529351af6021ae3020c000303043b5002041ae302103b502937642b0310311ae2020e0e0e0c00022a0c000202013b0404003333332c56a756b81acb020c00075029352a362b372c382b1abf020c000229353c1a96020e0e0e0c000303512b3b1a89020e0e0c000303032d0204402c2f6a04020034030f2a1a89020e0e0c0002330c000202013b2b2e22132d12130001000100121400010002001a73020c0007502a352b361a6c022a2c6a27050fd23c28403b1a62020e0e0e0c0004293b1a5b021a5c020e0c0004502b3b1a56020e0e0e0c000303033c020b2b1a4b021a4c020e0c000303041a4702103b503b502b3c1a41020e0e0c00032928403b1a19020e0e0c0004293b2f1a16020e0e0e0c0004502c2a1a22020e0e0e0c00032a3b1a1b020c0003293b1a17020c000303051a130202242928403b1ade010e0e0e0c00042c3c2b3b2e1a00020e0c000650291afb010c0002502964303b1ac8010e0c000303033c020b301abf011ac0010e0c000303041abb01103b503b50303c1ab501020243010e0e0c00032928401ac2011a87010c0004293b341a86010e0e0e0c00045033291a3a010e0e0e0c00021a35010e0e0c0002031929352a362a2f2e1a94010e0c000450292503511e273b6502013b642a3b1a66010e0e0e0c00033b2a293b1a09010e0e0c000303032a0233293c1a66010e0e0e0c00032a3c1a5b010c0003293c1a2f010c0003302a1a2f010c0003292f69292e2507250726051e3d3b270565220f2a69280e2a3b6a2a291ab1000e0e0c00021aad000e0e0c0002031d29352a362a353d1aa4000e0c00030309292503511e273b02013b6502013c64030b291af9000e0e0c000202012922103b1a7b000c000303032902054022112b6a040200221903112a1a7b000c000222180e0e0e0c000202013b2b221322212d12210001000100122200010002001a62000e0e0e0c0007502a352b361aa400220e22152c2e68052713270b440e0e0e0e0e0e0e00000000ec03000000000000|@2899,I105,I218,@85,I251,@2900,@2955,@1840,@108,@2959,@2962,@3407,@5338,@4161,@5342,I11,@5344,I255,I234,16777214,I231,@1868,I106,@5362,I253,I113,I49,I195,I47,@809,@5371,I240,@2464,@2898| 2898:D15,308|00803b561a0c0002291a2c010e0c000203041a2701103b503b50291a1a010e0e0e0c000203041a1701103b503b50293b1a11010e0e0c00035629291afa000e0e0e0c00021a01010e0e0c0002032429352a362a35291af4001af5000e0e0c00036403052a68010207292503511e323b6502013b64293b1ad7000c000303033b0221293529351ac4001ac5000e0e0c000303043b5002041abb00103b50293729680165291a92000e0e0e0c00021a99000e0e0c0002030a29351a9d002a696402031a99003b2a0c00025668353b1a81000e0e0c000303175668365678371a81002a56a7333068053b2c2b6a6602275668353d1a5c000e0c000303175668365678371a61002a56a7333068053d2c2b6a6602031a54002a2a1a53000c00033d302b6a2708420e0e0e0e0e000000002c01000000000000|@5343,I105,@5376,@1784,I253,I218,@33,I251,@1840,@909,@848,@849,@890,@855,@5375| 2899:S21|434f44455452454528292e67656e436f6465283329 2900:O2|@2902,@2901 2901:O2|@2907,@2906 2902:O4|@86,69,@2903,0 2903:O1|@2904 2904:D1,20|00803b420e0e0e0e000000000c00000000000000|@2905| 2905:S18|44656275672e64656661756c74732d283129 2906:O2|@2911,@2910 2907:O4|@87,69,@2908,0 2908:O1|@2909 2909:D1,20|00803b420e0e0e0e000000000c00000000000000|@2905| 2910:O2|@2913,@2912 2911:O4|@88,69,I48,0 2912:O2|@2917,@2916 2913:O4|@89,69,@2914,0 2914:O1|@2915 2915:D1,20|00803b420e0e0e0e000000000c00000000000000|@2905| 2916:O2|@2919,@2918 2917:O4|@90,69,1,0 2918:O2|@2921,@2920 2919:O4|@91,69,80,0 2920:O2|@2923,@2922 2921:O4|@92,69,0,0 2922:O2|@2925,@2924 2923:O4|@93,69,0,0 2924:O2|@2927,@2926 2925:O4|@85,69,0,0 2926:O2|@2929,@2928 2927:O4|@94,69,0,0 2928:O2|@2931,@2930 2929:O4|@95,69,1,0 2930:O2|@2933,@2932 2931:O4|@96,69,0,0 2932:O2|@2935,@2934 2933:O4|@97,69,0,0 2934:O2|@2937,@2936 2935:O4|@98,69,6,0 2936:O2|@2941,@2940 2937:O4|@99,69,@2938,0 2938:O1|@2939 2939:D1,20|00803b420e0e0e0e000000000c00000000000000|@2905| 2940:O2|@2943,@2942 2941:O4|@100,69,77,0 2942:O2|@2945,@2944 2943:O4|@101,69,0,0 2944:O2|@2947,@2946 2945:O4|@102,69,0,0 2946:O2|@2949,@2948 2947:O4|@103,69,0,0 2948:O2|@2951,@2950 2949:O4|@104,69,0,0 2950:O2|@2953,@2952 2951:O4|@105,69,0,0 2952:O2|@2954,0 2953:O4|@106,69,1,0 2954:O4|@107,69,1,0 2955:O4|@35,@863,@2957,@2956 2956:O5|@2958,126,0,126,0 2957:S11|746167206d697373696e67 2958:S28|6d6c736f757263652f4d4c436f6d70696c65722f44656275672e4d4c 2959:O1|@2960 2960:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 2961:S19|5072657474792e676574546167283229283129 2962:O3|@2964,@2963,@34 2963:O2|@3378,@2962 2964:D92,2604|00802b350a0e00e603f404b4051e0050090d03d808d40608038c03600458038801dc00a4022b362c3729353d1a010a0e0e0c00030308292c0e0c0002024729353f1aec090e0c00030308292c0e0c00020233292c0e0c0002291ad809691ad8092a691ad7092a693b3d3c3b2d6805291ace090e0e0e0c000203041ac709103b503b502927052b2d1abe090e0e0e0c0003291ab8090e0c00021ab5092a691ab4092a693b3d3c3b2d6805291a93090c000203041a8f09103b503b50293b691a98092a69302a693b3d3b3b2d6805291a70090e0c000203041a6b09103b503b5029270c0fcd2b362c372d382b3b1a6e090e0e0e0c0003030c1a67092c1a67090c000302012b293d1a60090e0c00032b3b1a4b090c0003030c1a47092c1a47090c000302012b293d1a40090e0c0003291a3c09691a3c092a692d2a691a38092a6927071a35090e0e0c00023e2a69291af1080e0e0c000203041aeb08103b503b502c2f0e0c0002291a1409691a14092a692c2a693b3e3b3b2d6805291ac4080e0c000203041abf08103b503b5029270a0fd72b362c372d382a352b353b3b292c1ae4080e0c000303032a0274293c1ada08020268080e0e0e0c00032f360402002c28082b1ac8080e0c00045029352a362c2b1abe080e0e0e0c00033c2b1ab7080c00032a2a1ab3080c0003293b1a43080c0003641aa8080e0c0002293b1a33080c0003030332020b323c1a5a080e0e0e0c00032932250b250b26091e7d3b270965293c1a45080e0e0c00032c3c1a3b080c0003291a6c0869282f2a692c2a691a65082a6927051a32080e0e0e0c00023e2a69291aed070e0e0c000203041ae707103b503b502e320202b2070e0c000231330e0e0e0c0002291a3008691a30082a691a2f082a691a2e082a692e2a69302a693b3e3b3b2d6805291aa7070c000203041aa307103b503b502927110fd42b362c372903051a030802031a02082928281a00080e0c00033e2a69291a75070e0e0c000203041a6f07103b503b502d2f1ae5070e0e0c0003291ae0070e0c00022b2a693b3c3c3b2d6805291a46070e0e0e0c000203041a3f07103b503b502927090fdc1aba070fdd2b362c372a2c0e0e0e0c00022a2d0e0e0e0c0002291aa407691aa4072a691aa3072a692d2a691a9f072a693b3e3b3b2d6805291af6060e0e0e0c000203041aef06103b503b5029270a0fcb2b36292b0e0e0c0002291a7407691a74072a693b3c3c3b2d6805291ac306020299060c000203041abb06103b503b502927050fdd2b361a500728281a23070c00033e2a69291a99060e0e0c000203041a9306103b503b502b2d1a31070e0e0c0003291a2c070e0c00022b2a693b3c3c3b2d6805291a6a060e0e0e0c000203041a6306103b503b502927070fdc2d062b36020227062c37292c1afa060e0e0e0c0003291af4060e0c00021af1062a693b3c3c3b2d6805291a28060e0c000203041a2306103b503b502e300202ee050e0c0002291acc06691acc062a691acb062a691aca062a692e2a693b3e3b3b2d6805291aee050e0e0e0c000203041ae705103b503b5029270d0fcb2b362c372a56370202a8051a9b060c00033b3d3c3b2d6805291abd050e0e0c000203041ab705103b503b502b2e0e0c0002293b693b3d3c3b2d6805291a9a050e0e0e0c000203041a9305103b503b50291a5a06691a5a062a691a59062a69020251051a54062a69302a691a50062a691a4f062a693b3b3c3b2d6805291a5a050e0e0e0c000203041a5305103b503b5029270f0fca2b362c372d382b2d0e0e0c0002293b691a12062a691a19062a693b3d3b3b2d6805291a20050e0c000203041a1b05103b503b502f320202e6040e0c0002293b691ae2052a691aed052a693b3d3b3b2d6805291af0040e0c000203041aeb04103b503b5033220e0c0002293b691ab6052a691ac5052a693b3d3b3b2d6805291ac4040e0c000203041abf04103b503b50293b691a90052a69302a691a88052a69220e2a693b3b3c3b2d6805291a97040c000203041a9304103b503b502927180fd12b362c372a1a7d04020253040e0e0c000203202a1a6e040e0e0e0c000203043b5002041a5705103b502a3b1a47040c000302013b03c729291a4a040e0e0e0c00021a9d040e0e0c0002032429352a362a352956781a1e040e0e0e0c00036403052a68010207292503511e323b6502013b64293b1aff030c000303242b1a02050e0e0e0c00023e2a69291af9030e0e0c000203041af303103b503b502965025b2935293556581acd030e0e0c000303043b5002041acf04103b50293729353b1ab4030e0c00030312293628072a69303202028c030e0e7d0900022d1aa4040e0c00023e2a69291a9d030e0e0c000203041a9703103b503b502927046402202a1a80040e0c00023e2a69291a79030e0e0c000203041a7303103b503b502965650fd22b3629352a362b372c382d392e3a2f23062a3b1a3f030c000303051a4b0402031a4a043b2d1a49040e0e0c00033b3b3b3b2d6805291a2d030e0e0c000203041a2703103b503b502822321a98030e0c00032928221a8e030e0e0e0c00033e2a69291a01030e0e0c000203041afb02103b503b503e2f69291aeb020c000203041ae702103b503b50303c1a01030e0e0c0003291ae0031a4d030e0e0c00033e2a69291ac1020e0e0c000203041abb02103b503b50220d1ac1030e0e0c00021abd0328281a20030e0c00033e2a69291a950202026b020e0e0c000203041a8b02103b503b502b22161a98030e0c0003291a94030e0c00022b2a693b3c3c3b2d6805291a62020e0e0e0c000203041a5b02103b503b501a7303285b1aca020e0e0e0c00033e2a69291a3d020e0e0c000203041a3702103b503b5022171a51030e0e0c0002291a4c030e0c00022b2a693b3c3c3b2d6805291a0e020e0e0e0c000203041a0702103b503b50291a2a03691ad6022a69312a691ace022a6922112a691ac5022a6922162a691abc022a6922192a691ab3022a691a02032a691aa9022a691afc022a691a9f022a6922222a691a96022a691aed022a693b3f3b3b2d6805291aa4010e0c000203041a9f01103b503b50222f22320e0e0e0c0002293b691ac6022a692c2a693b3d3c3b2d6805291a76010e0e0e0c000203041a6f01103b503b502927360fd02b362c372d382b2d0e0e0c00022b3c1a77010c00032b03051a8a0202031a4902293b69285d2a692c2a69285b2a6927051a66010e0e0e0c00023e2a69291a21010e0e0c000203041a1b01103b503b50293b691a54022a692d2a693b3d3b3b2d6805291afc000e0c000203041af700103b503b5029270a02c32b3629353e1ad1000e0e0c000303051a230202ae29353c1abf000c000303312936293c1aeb000c00031a0d022a1a39010e0e0c00033e2a69291aad000e0e0c000203041aa700103b503b50292704027229353d1a8300020269000c000303312936293c1aab000c00031ad1012a1af9000e0e0c00033e2a69291a6d000e0e0c000203041a6700103b503b5029270402322936293c1a7a000e0e0e0c00031aa1012a1ac5000e0e0c00033e2a69291a39000e0e0c000203041a3300103b503b5029270464420e0e0e0e0e00000000240a000000000000|@2966,I251,@1087,@1088,@1060,I105,@1784,@2967,@2970,@1088,@1060,@1830,I234,@677,I106,@510,@2972,@2973,@2974,@371,@1087,@1058,I247,I239,I104,I252,I245,I243,I218,@2975,@2976,@1087,@1058,@1059,@1088,@2977,@2978,@389,@2979,@2981,@2983,@1056,@1058,@2985,@2987,@1087,@2989,@2991,@2992,@2994,@2996,@3039,@3041,@1087,@1088,@1060,@1088,@3043,@3048,@1830,@3052,@1058,@1830,@3054,@3056,@3058,@3060,@3062,@3065,@1840,@3338,I48,@3339,@3356,@3357,@3359,@3360,@3362,@3364,@3365,@3367,@3369,@3034,@1057,@3371,@1830,@3373,@1824,@3374,@3376,@3377,@2965| 2965:S3|417267 2966:S22|42617365436f6465547265652e707265747479283129 2967:O1|@2968 2968:D8,132|00812c1a82000e0e0e0c00021a7d000e0e0c0002035f2c352d36293b1a71000e0e0c000303102a35292f0e0e0e0c0002293b6965023c2a35292f0e0e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b503b502d321a39000e0e0c00031a35002a692b2a6927066502013b430e000000007c00000000000000|@2969,I105,I218,I251,@2136,@1784,@2967,@1058| 2969:S23|42617365436f6465547265652e704c6973742833292829 2970:O1|@2971 2971:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2970,@1087| 2972:O2|44,0 2973:S2|2c20 2974:S8|5441475445535428 2975:O2|@2973,0 2976:S13|534554434f4e5441494e455228 2977:S8|4441544154595045 2978:S5|5455504c45 2979:O1|@2980 2980:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203572c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b503b502c311a39000e0e0c00031a35002a692b2a6927056502013b430e000000007400000000000000|@2969,I105,I218,I251,@2136,@1784,@2979,@1058| 2981:O1|@2982 2982:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2981,@1087| 2983:O2|3,@2984 2984:S5|4c44455843 2985:O2|3,@2986 2986:S4|57495448 2987:O2|3,@2988 2988:S7|48414e444c4528 2989:O2|3,@2990 2990:S6|524149534528 2991:S4|4c4f4f50 2992:O1|@2993 2993:D8,132|00812c1a82000e0e0e0c00021a7d000e0e0c0002035f2c352d36293b1a71000e0e0c000303102a35292f0e0e0e0c0002293b6965023c2a35292f0e0e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b503b502d321a39000e0e0c00031a35002a692b2a6927066502013b430e000000007c00000000000000|@2969,I105,I218,I251,@2136,@1784,@2992,@1058| 2994:O1|@2995 2995:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2994,@1087| 2996:O1|@2997 2997:D22,636|00812c1a7a020e0e0e0c00021a75020e0e0c000207dd2c352d36293b1a69020e0e0c000307db2a3529352a362b372a3c1a59020e0e0c00031a55022a1a55020e0e0c00033e2a69291a35020e0e0c000203041a4302103b503b501a3f02285b1a32020e0e0e0c00033e2a69291a11020e0e0c000203041a1f02103b503b50301a1e020e0e0e0c0002291a18020e0c00022b2a693b3c3c3b2d6805291ae2010e0e0e0c000203041aef01103b503b503222120c0002293b693b3d3b3b2d6805291abe010e0e0e0c000203041acb01103b503b50293b691ad0012a691acf012a691ace012a691acd012a691ac4012a69322a69020274011ab8012a691abb012a6902022e001ab6012a691aa5012a6922142a693b3c3b3b2d6805291a64010e0c000203041a7301103b503b50293b69271d0fdd2a3529352a362b372a3c1a4e010e0e0e0c00031a49012a1a49010e0e0c00033e2a69291a29010e0e0c000203041a3701103b503b501a3301285b1a26010e0e0e0c00033e2a69291a05010e0e0c000203041a1301103b503b50301a32010e0e0e0c0002291a2c010e0c00022b2a693b3c3c3b2d6805291ad6000e0e0e0c000203041ae300103b503b503222120c0002293b693b3d3b3b2d6805291ab2000e0e0e0c000203041abf00103b503b50293b691ac4002a691ac3002a691ac2002a691ac1002a691ab8002a69322a691ab0002a691ab3002a691ab2002a69020256001a9d002a6922142a693b3c3b3b2d6805291a5c000e0c000203041a6b00103b503b50291a9200693b3b3b3b2d6805291a3e000e0e0e0c000203041a4b00103b503b50221f22241a73000c00031a71002a692b2a6927216502013b430e0e0e0e0e000000007402000000000000|@2969,I105,I218,I251,@510,@2999,@389,@1784,I48,@3000,@3030,@1830,@1998,@1058,@3032,@2006,@3034,@3036,@2998,@2136,@2996,@1058| 2998:O1|@3038 2999:S9|76616c204c6f63616c 3000:O1|@3001 3001:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3000,@1058| 3002:O1|@3003 3003:D21,292|00802b353d1a20010e0c0003036f2b362c372a3c1a15010e0e0c00031a11012a1a11010e0e0c000329285b1a06010e0e0e0c00033e2a69291afd000e0e0c000203041af700103b502d1af4001af5000e0e0c0003291af0000e0c00022b2a693b3c3c3b2d6805291ace000e0e0e0c000203041ac700103b5029270a02992b353b1aa5000e0e0c000303772b362c37291aba000e0e0e0c00022b1aa4001ab1000e0e0c0003291aac000e0c00021aa9002a691aa8002a691aa7002a691a9e002a691aa1002a69293b1a5e000e0e0e0c0003030330020b302a1a8e000e0e0e0c00031a89002a693b3c3c3b2d6805291a48000e0c000203041a4300103b5029270d02152b353c1a21000e0e0c000303051a5f0002031a5e00420e000000001c01000000000000|@3005,I251,@510,@3006,@389,I105,@1784,@3002,@3007,@3009,@3014,@3022,@3024,@1060,@1058,@2144,@1057,@3026,@1060,@3028,@3004| 3004:O2|3,95 3005:S27|42617365436f6465547265652e7072657474795573616765283129 3006:S8|5573654669656c64 3007:O1|@3008 3008:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@2969,I105,I218,I251,@2136,@1784,@3007,@1058| 3009:O1|@3010 3010:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3009,@3011| 3011:O2|@1088,@3012 3012:O2|@3013,0 3013:O2|3,93 3014:O1|@3015 3015:D8,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203282b36293b1a3b000c000303051a37000214291a35000e0e0c00021a31002a691a30002a69656402013b42000000004400000000000000|@2969,I105,I218,I251,@3017,@3014,@1058,@3016| 3016:O5|0,0,0,0,@3019 3017:O2|@3018,0 3018:O2|3,45 3019:O2|@3018,@3020 3020:O2|@1088,@3021 3021:O2|@2096,0 3022:O1|@3023 3023:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@2969,I105,I218,I251,@3020,@1784,@3022,@1058| 3024:O1|@3025 3025:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3024,@1087| 3026:O1|@3027 3027:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3026| 3028:O2|3,@3029 3029:S6|4578706f7274 3030:O1|@3031 3031:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3030,@3011| 3032:O2|3,@3033 3033:S2|2a29 3034:O2|3,@3035 3035:S2|282a 3036:O1|@3037 3037:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3036,@1058| 3038:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@2998,@3011| 3039:O1|@3040 3040:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3039,@1087| 3041:O2|3,@3042 3042:S10|424547494e4c4f4f5028 3043:O1|@3044 3044:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203572c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b503b502c311a39000e0e0c00031a35002a692b2a6927056502013b430e000000007400000000000000|@2969,I105,I218,I251,@3045,@1784,@3043,@1058| 3045:O2|@1088,@3046 3046:O2|@3047,0 3047:O2|3,59 3048:O2|@1058,@3049 3049:O2|@3050,0 3050:O2|3,@3051 3051:S3|656e64 3052:O2|3,@3053 3053:S2|696e 3054:O2|3,@3055 3055:S3|6c6574 3056:O2|3,@3057 3057:S2|6966 3058:O2|3,@3059 3059:S4|7468656e 3060:O2|3,@3061 3061:S4|656c7365 3062:O4|@63,@1790,@3064,@3063 3063:O5|@1792,114,0,114,0 3064:S7|746f53686f7274 3065:O3|@3067,@3066,@63 3066:O256|@3083,@3084,@3085,@3086,@3087,@3088,@3089,@3090,@3091,@3092,@3093,@3094,@3095,@3096,@3097,@3098,@3099,@3100,@3101,@3102,@3103,@3104,@3105,@3106,@3107,@3108,@3109,@3110,@3111,@3112,@3113,@3114,@3115,@3116,@3117,@3118,@3119,@3120,@3121,@3122,@3123,@3124,@3125,@3126,@3127,@3128,@3129,@3130,@3131,@3132,@3133,@3134,@3135,@3136,@3137,@3138,@3139,@3140,@3141,@3142,@3143,@3144,@3145,@3146,@3147,@3148,@3149,@3150,@3151,@3152,@3153,@3154,@3155,@3156,@3157,@3158,@3159,@3160,@3161,@3162,@3163,@3164,@3165,@3166,@3167,@3168,@3169,@3170,@3171,@3172,@3173,@3174,@3175,@3176,@3177,@3178,@3179,@3180,@3181,@3182,@3183,@3184,@3185,@3186,@3187,@3188,@3189,@3190,@3191,@3192,@3193,@3194,@3195,@3196,@3197,@3198,@3199,@3200,@3201,@3202,@3203,@3204,@3205,@3206,@3207,@3208,@3209,@3210,@3211,@3212,@3213,@3214,@3215,@3216,@3217,@3218,@3219,@3220,@3221,@3222,@3223,@3224,@3225,@3226,@3227,@3228,@3229,@3230,@3231,@3232,@3233,@3234,@3235,@3236,@3237,@3238,@3239,@3240,@3241,@3242,@3243,@3244,@3245,@3246,@3247,@3248,@3249,@3250,@3251,@3252,@3253,@3254,@3255,@3256,@3257,@3258,@3259,@3260,@3261,@3262,@3263,@3264,@3265,@3266,@3267,@3268,@3269,@3270,@3271,@3272,@3273,@3274,@3275,@3276,@3277,@3278,@3279,@3280,@3281,@3282,@3283,@3284,@3285,@3286,@3287,@3288,@3289,@3290,@3291,@3292,@3293,@3294,@3295,@3296,@3297,@3298,@3299,@3300,@3301,@3302,@3303,@3304,@3305,@3306,@3307,@3308,@3309,@3310,@3311,@3312,@3313,@3314,@3315,@3316,@3317,@3318,@3319,@3320,@3321,@3322,@3323,@3324,@3325,@3326,@3327,@3328,@3329,@3330,@3331,@3332,@3333,@3334,@3335,@3336,@3337,@3082 3067:D34,716|00802b1aca020e0e0e0c0002032e2b3b1ac1020e0e0c0003030c1abb022c1abb020c000302012b293d1ab4020e0c00031ab1022a1ab1022f7e0500032b1a90020e0c0002030d56081aa1021aa2021aa3026b103b503b5028662c1a9b020c0003037e3b291b00011a92020e0e0e0c000303041a8b02103b503b50291a86020e0e0e0c00022d2a1a7f020c0003640341291a3d020e0e0c00021a71020e0e0c000203033c021456171a66020e0e0e0c00022a2a1a5f020c00036403041a5a02103b503b5056172a1a53022e0e0e7e040003293c1a07020c000325011e773b640fd92b1a3c020e0c0002293e1a37020c0003293d1a13020c000365032128692c1af7010c00031a21022a1add010e0e0c00032928221ad2012f0e7e0500032b1a00020e0c0002293e1afb010c0003293c1ad7010c00036503612b1ad5010e0e0c0002293b1a8f010c0003030c1a8b012a1a8b010c0003020129293f1ad0010e0c00032928101a6e010e0e0e0c0003030329020228101aba0130692a2a1ab7010c0003291ab4011ab5010e0e0c00031ab1012a1a5501347e0a00032b1a34010e0c0002030d56081a45011a46011a47016b103b503b502b1a6901020202010e0e0c0002293e1a5f010c0003293b1a3b010c00036503482b1af9000e0e0c0002030d56081a09011a0a011a0b016b103b503b502b1a1d010e0e0c0002293b1ad7000c0003030c1ad3002a1ad3000c0003020129293c1a30010e0c00036502013b039c2b1aae000e0e0e0c0002030d56081abd001abe001abf006b103b503b502b3b1adc000e0c0003291a88000e0c00021abd000e0e0c00020339291a76000e0e0e0c0002030d56181a85001a86001a87006b103b503b50291aa9000e0e0c0002293e1aa3000c0003293d1a7f000c00036502013b032228692a1a60000e0c00031aa9002a1a45000e0e0c00032928221a3a00300e7e0600031a95006402031a9300420e0e00000000c402000000000000|@3069,I105,I234,@677,I106,@510,@3070,@389,@1790,@1791,@1786,I150,I113,@3071,I189,I251,I218,I15,I247,@866,I253,I17,I243,@3074,I108,@3075,@3077,@372,@397,@3080,I231,@3081,@3068,@3068| 3068:S20|4c4954203c6c6f6e6720776f726420646174613e 3069:S23|416464726573732e737472696e674f66576f7264283129 3070:S3|4c4954 3071:O4|103,@407,@3073,@3072 3072:O5|@1792,416,0,416,0 3073:S17|556e6b6e6f776e2052545320656e747279 3074:S6|434f44452022 3075:D4,52|00802b1a32000e0e0e0c000203032b02072b1a27000c000256172a1a22002e0e7e0400030e0e0e0e000000002c00000000000000|@3076,I105,I152,I252| 3076:S31|416464726573732e737472696e674f66576f7264283129646174612d283129 3077:O1|@3078 3078:D17,236|00812c3c1ae9000e0e0c0003030a3b2c2c0e0e0e7d0400022c3b1ad3000c000303051acf0002b52c1acd000e0e0c0002030c2c3b1ac5000e0e0c000302013b03043b5002041ab800102c28081ab5000e0e0c0003293c1aaf000c0003293f1aab000c0003291aa8001aa9000e0e0c000303041aa300103b502928413b1a9d000e0e0c000429311a97000c0003503b312a1a91000e0e0c000303043b500230293f1a61000e0e0c00032a320e0e0e0c00022c2b2b1a72000e0e0e0c0004502b3c1a42000e0e0e0c00032503511e3d5150291a59000e0e0c000250292704430e0e0e00000000e400000000000000|@3079,I113,I48,I105,I231,@399,I239,I240,I241,16777215,I247,@391,I11,I151,I248,I254,I47| 3079:S18|537472696e672e746162756c617465283229 3080:S9|425954452064617461 3081:S5|46554e2022 3082:S20|504f4c595f5359535f61737369676e5f776f7264 3083:S5|2052545330 3084:S13|504f4c595f5359535f65786974 3085:S5|2052545332 3086:S5|2052545333 3087:S5|2052545334 3088:S5|2052545335 3089:S5|2052545336 3090:S5|2052545337 3091:S5|2052545338 3092:S14|504f4c595f5359535f6368646972 3093:S6|205254533130 3094:S20|504f4c595f5359535f616c6c6f635f73746f7265 3095:S21|504f4c595f5359535f616c6c6f635f756e696e6974 3096:S6|205254533133 3097:S15|504f4c595f5359535f726169736578 3098:S19|504f4c595f5359535f6765745f6c656e677468 3099:S6|205254533136 3100:S18|504f4c595f5359535f6765745f666c616773 3101:S6|205254533138 3102:S6|205254533139 3103:S6|205254533230 3104:S6|205254533231 3105:S6|205254533232 3106:S20|504f4c595f5359535f7374725f636f6d70617265 3107:S6|205254533234 3108:S6|205254533235 3109:S19|504f4c595f5359535f74657374737472677472 3110:S19|504f4c595f5359535f746573747374726c7373 3111:S19|504f4c595f5359535f74657374737472676571 3112:S19|504f4c595f5359535f746573747374726c6571 3113:S24|504f4c595f5359535f657863657074696f6e5f7472616365 3114:S22|504f4c595f5359535f676976655f65785f7472616365 3115:S27|504f4c595f5359535f657863657074696f6e5f74726163655f666e 3116:S25|504f4c595f5359535f676976655f65785f74726163655f666e 3117:S6|205254533334 3118:S6|205254533335 3119:S6|205254533336 3120:S6|205254533337 3121:S6|205254533338 3122:S6|205254533339 3123:S6|205254533430 3124:S6|205254533431 3125:S6|205254533432 3126:S6|205254533433 3127:S6|205254533434 3128:S6|205254533435 3129:S6|205254533436 3130:S16|504f4c595f5359535f6c6f636b736567 3131:S20|504f4c595f5359535f656d707479737472696e67 3132:S19|504f4c595f5359535f6e756c6c766563746f72 3133:S6|205254533530 3134:S16|504f4c595f5359535f6e6574776f726b 3135:S20|504f4c595f5359535f6f735f7370656369666963 3136:S20|504f4c595f5359535f65715f6c6f6e67776f7264 3137:S21|504f4c595f5359535f6e65715f6c6f6e67776f7264 3138:S21|504f4c595f5359535f6765715f6c6f6e67776f7264 3139:S21|504f4c595f5359535f6c65715f6c6f6e67776f7264 3140:S20|504f4c595f5359535f67745f6c6f6e67776f7264 3141:S20|504f4c595f5359535f6c745f6c6f6e67776f7264 3142:S6|205254533539 3143:S6|205254533630 3144:S20|504f4c595f5359535f696f5f6469737061746368 3145:S23|504f4c595f5359535f7369676e616c5f68616e646c6572 3146:S6|205254533633 3147:S6|205254533634 3148:S6|205254533635 3149:S6|205254533636 3150:S6|205254533637 3151:S6|205254533638 3152:S21|504f4c595f5359535f61746f6d69635f7265736574 3153:S20|504f4c595f5359535f61746f6d69635f696e6372 3154:S20|504f4c595f5359535f61746f6d69635f64656372 3155:S20|504f4c595f5359535f7468726561645f73656c66 3156:S24|504f4c595f5359535f7468726561645f6469737061746368 3157:S22|504f4c595f5359535f706c75735f6c6f6e67776f7264 3158:S23|504f4c595f5359535f6d696e75735f6c6f6e67776f7264 3159:S21|504f4c595f5359535f6d756c5f6c6f6e67776f7264 3160:S21|504f4c595f5359535f6469765f6c6f6e67776f7264 3161:S21|504f4c595f5359535f6d6f645f6c6f6e67776f7264 3162:S22|504f4c595f5359535f616e64625f6c6f6e67776f7264 3163:S21|504f4c595f5359535f6f72625f6c6f6e67776f7264 3164:S22|504f4c595f5359535f786f72625f6c6f6e67776f7264 3165:S6|205254533832 3166:S6|205254533833 3167:S18|504f4c595f5359535f6b696c6c5f73656c66 3168:S28|504f4c595f5359535f73686966745f6c6566745f6c6f6e67776f7264 3169:S29|504f4c595f5359535f73686966745f72696768745f6c6f6e67776f7264 3170:S35|504f4c595f5359535f73686966745f72696768745f61726974685f6c6f6e67776f7264 3171:S17|504f4c595f5359535f70726f66696c6572 3172:S27|504f4c595f5359535f6c6f6e67776f72645f746f5f746167676564 3173:S27|504f4c595f5359535f7369676e65645f746f5f6c6f6e67776f7264 3174:S29|504f4c595f5359535f756e7369676e65645f746f5f6c6f6e67776f7264 3175:S16|504f4c595f5359535f66756c6c5f6763 3176:S20|504f4c595f5359535f737461636b5f7472616365 3177:S24|504f4c595f5359535f74696d696e675f6469737061746368 3178:S6|205254533935 3179:S6|205254533936 3180:S6|205254533937 3181:S6|205254533938 3182:S16|504f4c595f5359535f6f626a73697a65 3183:S17|504f4c595f5359535f73686f7773697a65 3184:S7|20525453313031 3185:S7|20525453313032 3186:S7|20525453313033 3187:S16|504f4c595f5359535f71756f7472656d 3188:S17|504f4c595f5359535f69735f73686f7274 3189:S14|504f4c595f5359535f61706c7573 3190:S15|504f4c595f5359535f616d696e7573 3191:S13|504f4c595f5359535f616d756c 3192:S13|504f4c595f5359535f61646976 3193:S13|504f4c595f5359535f616d6f64 3194:S13|504f4c595f5359535f616e6567 3195:S13|504f4c595f5359535f786f7261 3196:S15|504f4c595f5359535f657175616c61 3197:S12|504f4c595f5359535f6f7261 3198:S13|504f4c595f5359535f616e6461 3199:S7|20525453313136 3200:S17|504f4c595f5359535f5265616c5f737472 3201:S17|504f4c595f5359535f5265616c5f676571 3202:S17|504f4c595f5359535f5265616c5f6c6571 3203:S17|504f4c595f5359535f5265616c5f677472 3204:S17|504f4c595f5359535f5265616c5f6c7373 3205:S16|504f4c595f5359535f5265616c5f6571 3206:S17|504f4c595f5359535f5265616c5f6e6571 3207:S22|504f4c595f5359535f5265616c5f4469737061746368 3208:S17|504f4c595f5359535f4164645f7265616c 3209:S17|504f4c595f5359535f5375625f7265616c 3210:S17|504f4c595f5359535f4d756c5f7265616c 3211:S17|504f4c595f5359535f4469765f7265616c 3212:S17|504f4c595f5359535f4162735f7265616c 3213:S17|504f4c595f5359535f4e65675f7265616c 3214:S7|20525453313331 3215:S7|20525453313332 3216:S18|504f4c595f5359535f636f6e765f7265616c 3217:S20|504f4c595f5359535f7265616c5f746f5f696e74 3218:S20|504f4c595f5359535f696e745f746f5f7265616c 3219:S18|504f4c595f5359535f737172745f7265616c 3220:S17|504f4c595f5359535f73696e5f7265616c 3221:S17|504f4c595f5359535f636f735f7265616c 3222:S20|504f4c595f5359535f61726374616e5f7265616c 3223:S17|504f4c595f5359535f6578705f7265616c 3224:S16|504f4c595f5359535f6c6e5f7265616c 3225:S7|20525453313432 3226:S7|20525453313433 3227:S7|20525453313434 3228:S7|20525453313435 3229:S7|20525453313436 3230:S7|20525453313437 3231:S14|504f4c595f5359535f737464696e 3232:S15|504f4c595f5359535f7374646f7574 3233:S20|504f4c595f5359535f70726f636573735f656e76 3234:S26|504f4c595f5359535f7365745f737472696e675f6c656e677468 3235:S28|504f4c595f5359535f6765745f66697273745f6c6f6e675f776f7264 3236:S22|504f4c595f5359535f706f6c795f7370656369666963 3237:S19|504f4c595f5359535f627974657665635f6571 3238:S7|20525453313535 3239:S7|20525453313536 3240:S7|20525453313537 3241:S7|20525453313538 3242:S7|20525453313539 3243:S20|504f4c595f5359535f636d656d5f6c6f61645f38 3244:S21|504f4c595f5359535f636d656d5f6c6f61645f3136 3245:S21|504f4c595f5359535f636d656d5f6c6f61645f3332 3246:S21|504f4c595f5359535f636d656d5f6c6f61645f3634 3247:S24|504f4c595f5359535f636d656d5f6c6f61645f666c6f6174 3248:S25|504f4c595f5359535f636d656d5f6c6f61645f646f75626c65 3249:S21|504f4c595f5359535f636d656d5f73746f72655f38 3250:S22|504f4c595f5359535f636d656d5f73746f72655f3136 3251:S22|504f4c595f5359535f636d656d5f73746f72655f3332 3252:S22|504f4c595f5359535f636d656d5f73746f72655f3634 3253:S25|504f4c595f5359535f636d656d5f73746f72655f666c6f6174 3254:S26|504f4c595f5359535f636d656d5f73746f72655f646f75626c65 3255:S7|20525453313732 3256:S7|20525453313733 3257:S7|20525453313734 3258:S7|20525453313735 3259:S7|20525453313736 3260:S7|20525453313737 3261:S7|20525453313738 3262:S7|20525453313739 3263:S7|20525453313830 3264:S7|20525453313831 3265:S7|20525453313832 3266:S7|20525453313833 3267:S7|20525453313834 3268:S7|20525453313835 3269:S7|20525453313836 3270:S7|20525453313837 3271:S7|20525453313838 3272:S21|504f4c595f5359535f696f5f6f7065726174696f6e 3273:S12|504f4c595f5359535f666669 3274:S7|20525453313931 3275:S7|20525453313932 3276:S7|20525453313933 3277:S26|504f4c595f5359535f7365745f636f64655f636f6e7374616e74 3278:S19|504f4c595f5359535f6d6f76655f776f726473 3279:S31|504f4c595f5359535f73686966745f72696768745f61726974685f776f7264 3280:S7|20525453313937 3281:S19|504f4c595f5359535f6d6f76655f6279746573 3282:S7|20525453313939 3283:S19|504f4c595f5359535f636f64655f666c616773 3284:S21|504f4c595f5359535f736872696e6b5f737461636b 3285:S15|504f4c595f5359535f737464657272 3286:S7|20525453323033 3287:S24|504f4c595f5359535f63616c6c636f64655f7475706c6564 3288:S25|504f4c595f5359535f666f726569676e5f6469737061746368 3289:S7|20525453323036 3290:S7|20525453323037 3291:S7|20525453323038 3292:S17|504f4c595f5359535f5857696e646f7773 3293:S7|20525453323130 3294:S7|20525453323131 3295:S7|20525453323132 3296:S22|504f4c595f5359535f69735f6269675f656e6469616e 3297:S23|504f4c595f5359535f62797465735f7065725f776f7264 3298:S23|504f4c595f5359535f6f66667365745f61646472657373 3299:S25|504f4c595f5359535f73686966745f72696768745f776f7264 3300:S17|504f4c595f5359535f776f72645f6e6571 3301:S17|504f4c595f5359535f6e6f745f626f6f6c 3302:S7|20525453323139 3303:S7|20525453323230 3304:S7|20525453323231 3305:S7|20525453323232 3306:S22|504f4c595f5359535f737472696e675f6c656e677468 3307:S7|20525453323234 3308:S7|20525453323235 3309:S7|20525453323236 3310:S7|20525453323237 3311:S20|504f4c595f5359535f746f7563685f66696e616c 3312:S7|20525453323239 3313:S7|20525453323330 3314:S16|504f4c595f5359535f696e745f676571 3315:S16|504f4c595f5359535f696e745f6c6571 3316:S16|504f4c595f5359535f696e745f677472 3317:S16|504f4c595f5359535f696e745f6c7373 3318:S24|504f4c595f5359535f6c6f61645f627974655f696d6d7574 3319:S24|504f4c595f5359535f6c6f61645f776f72645f696d6d7574 3320:S7|20525453323337 3321:S17|504f4c595f5359535f6d756c5f776f7264 3322:S18|504f4c595f5359535f706c75735f776f7264 3323:S19|504f4c595f5359535f6d696e75735f776f7264 3324:S17|504f4c595f5359535f6469765f776f7264 3325:S16|504f4c595f5359535f6f725f776f7264 3326:S17|504f4c595f5359535f616e645f776f7264 3327:S17|504f4c595f5359535f786f725f776f7264 3328:S24|504f4c595f5359535f73686966745f6c6566745f776f7264 3329:S17|504f4c595f5359535f6d6f645f776f7264 3330:S17|504f4c595f5359535f776f72645f676571 3331:S17|504f4c595f5359535f776f72645f6c6571 3332:S17|504f4c595f5359535f776f72645f677472 3333:S17|504f4c595f5359535f776f72645f6c7373 3334:S16|504f4c595f5359535f776f72645f6571 3335:S18|504f4c595f5359535f6c6f61645f62797465 3336:S18|504f4c595f5359535f6c6f61645f776f7264 3337:S20|504f4c595f5359535f61737369676e5f62797465 3338:S7|696e6c696e652c 3339:O1|@3340 3340:D18,324|00812b3b1a41010e0e0c000303033b0fcf2b352c362a352b36303c1a2e010e0e0e0c00031a29012a1a29010e0e0c00033e2a69291a21010e0e0c000203041a1b01103b501a1901285b1a08010e0c00033e2a69291a01010e0e0c000203041afb00103b502e1afc000e0c0002291af8000e0c00022b2a693b3c3c3b2d6805291ad6000e0e0e0c000203041acf00103b50293b691ad6002a69312a69220d3b1aa7000c000303051ac70002013b220f1aa7000c00021abd000e0e0c00021ab5000e0e0c000203033b02031aac00293b1a77000c000303032a020f2a2a1a9e00020253000e0e0e0c0003293b1a5b000c000303032c020b2c2a1a86000e0e0e0c00033b3f3b3b2d6805291a4d000e0e0c000203041a4700103b5022183c1a66000e0e0e0c00032922151a5e000e0e0e0c00032b2a692717430e0e000000003c01000000000000|@3342,I251,@510,@2965,@389,I105,@1784,I48,@3343,@3345,@1058,@3347,I218,@3351,@3353,@3341,I106,@3339| 3341:O1|@3355 3342:S34|42617365436f6465547265652e7072657474792831297072696e7441726773283229 3343:O1|@3344 3344:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3343,@1058| 3345:O1|@3346 3346:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3345,@3011| 3347:O2|@1058,@3348 3348:O2|@3349,0 3349:O2|3,@3350 3350:S5|3a7265616c 3351:O2|@1088,@3352 3352:O2|@1059,@2217 3353:O1|@3354 3354:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3353| 3355:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3341| 3356:S8|206c6f63616c732c 3357:O1|@3358 3358:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363f2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3357| 3359:S8|636c6f737572653d 3360:O1|@3361 3361:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203572c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b503b502c311a39000e0e0c00031a35002a692b2a6927056502013b430e000000007400000000000000|@2969,I105,I218,I251,@2136,@1784,@3360,@1058| 3362:O1|@3363 3363:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3362,@1087| 3364:S14|726563757273697665207573653d 3365:O1|@3366 3366:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3365,@1058| 3367:O1|@3368 3368:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3367,@3011| 3369:O2|@1058,@3370 3370:O2|@3032,0 3371:O2|3,@3372 3372:S3|666e28 3373:S5|282a562a29 3374:O2|3,@3375 3375:S9|526563757273697665 3376:S7|436c6f73757265 3377:S5|4c6f63616c 3378:D26,668|00802b353b1a98020e0c000307dd2b362c372d382e392b3c1a89020e0e0c00031a85022a1a85020e0e0c00033e2a69291a7d020e0e0c000203041a7702103b503b501a7302285b1a62020e0e0e0c00033e2a69291a59020e0e0c000203041a5302103b503b50311a52020e0e0e0c0002291a4c020e0c00022b2a693b3c3c3b2d6805291a2a020e0e0e0c000203041a2302103b503b50333c1a09020e0e0c00031a21022a1a05020e0e0c00033e2a69291afd010e0e0c000203041af701103b503b50220c121200010001000e0e0c0002293b691af2012a691af1012a691ae8012a692e2a691ae0012a02024600691adf012a691ad2012a69220c2a691ac9012a691ad0012a691acf012a691aba012a6922172a693b3c3b3b2d6805291a91010e0e0c000203041a8b01103b503b502927200fcd2b353d1a67010c0003030a2b362956272d7d0400022b353e1a52010e0e0e0c000303312b362956271a7e010e0e0e0c00031a79012a693b3b3c3b2d6805291a3c010e0c000203041a3701103b503b502927040fdd2b362c372d382a3c1a12010e0e0e0c00031a49012a1a0d010e0e0c00033e2a69291a05010e0e0c000203041aff00103b503b501afb00285b1aea000e0e0e0c00033e2a69291ae1000e0e0c000203041adb00103b503b50301a06010e0e0e0c0002291a00010e0c00022b2a693b3c3c3b2d6805291ab20002028b000e0e0e0c000203041aa700103b503b503256d70c0002293b693b3d3b3b2d6805291a8a000e0e0e0c000203041a8300103b503b50293b691ab4002a691ab3002a691a82002a691aad002a691a78002a69322a691a70002a691a9f002a691a9e00020227002a691a5d002a6922142a693b3c3b3b2d6805291a34000e0c000203041a2f00103b503b5029271c420e0e000000009402000000000000|@3380,I251,@510,@2999,@389,I105,@1784,I48,@3381,@3383,@3385,@1058,@3386,@3032,@2006,@3034,@3388,@3402,@2999,@3404,@3379,@1830,@1998,@3032,@2006,@3034| 3379:O1|@3406 3380:S29|42617365436f6465547265652e70726574747942696e64696e67283129 3381:O1|@3382 3382:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3381,@1058| 3383:O1|@3384 3384:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3383,@3011| 3385:S12|3d20436f6e7461696e657220 3386:O2|3,@3387 3387:S4|77697468 3388:O1|@3389 3389:D21,620|00812c1a6a020e0e0e0c00021a65020e0e0c000207dd2c352d36293b1a59020e0e0c000307dd2a352b362c372a3c1a4b020c00031a49022a1a49020e0e0c00033e2a69291a29020e0e0c000203041a3702103b503b501a3302285b1a26020e0e0e0c00033e2a69291a05020e0e0c000203041a1302103b503b50301a12020e0e0e0c0002291a0c020e0c00022b2a693b3c3c3b2d6805291ad6010e0e0e0c000203041ae301103b503b502807336922110e0c0002293b693b3d3b3b2d6805291aae010e0e0e0c000203041abb01103b503b50293b691ac0012a691abf012a691abe012a691abd012a691ab4012a69322a69020264011ab0012a691aa3012a692212020224002a693b3b3b3b2d6805291a5e010e0e0e0c000203041a6b01103b503b50293b69271a0fdd2a352b362c372a3c1a48010e0c00031a45012a1a45010e0e0c00033e2a69291a25010e0e0c000203041a3301103b503b501a2f01285b1a22010e0e0e0c00033e2a69291a01010e0e0c000203041a0f01103b503b50301a2a010e0e0e0c0002291a24010e0c00022b2a693b3c3c3b2d6805291ad2000e0e0e0c000203041adf00103b503b502807336922110e0c0002293b693b3d3b3b2d6805291aaa000e0e0e0c000203041ab700103b503b50293b691abc002a691abb002a691aba002a691ab9002a691ab0002a69322a691ab0002a691aa3002a6922122a693b02024e003b3b3b2d6805291a5e000e0e0e0c000203041a6b00103b503b50291a8e00693b3b3b3b2d6805291a3e000e0e0e0c000203041a4b00103b503b50221c22211a6f000c00031a6d002a692b2a69271e6502013b430e0e0e0e0e000000006402000000000000|@2969,I105,I218,I251,@510,@3377,@389,@1784,I48,@3391,@3393,@1830,@1998,@1058,@3032,@3034,@3395,@3397,@3390,@3388,@1058| 3390:O2|@1088,@3399 3391:O1|@3392 3392:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3391,@1058| 3393:O1|@3394 3394:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3393,@3011| 3395:O1|@3396 3396:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3395,@1058| 3397:O1|@3398 3398:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3397,@3011| 3399:O2|@3400,0 3400:O2|3,@3401 3401:S5|20616e6420 3402:O2|3,@3403 3403:S8|76616c2072656320 3404:O1|@3405 3405:D9,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36293b1a71000e0e0c000303102a1a6a000e0e0e0c0002293b696402382a1a5a000e0e0e0c0002291a5400693b3b3b3b2d6805291a38000e0c000203041a4300103b502c1a40000e0c00021a3d002a692b2a6927056502013b420e0e0e0e0e000000007c00000000000000|@2969,I105,I218,I251,@3002,@2136,@1784,@3404,@1058| 3406:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@3379,@3011| 3407:O1|@3408 3408:D2,60|008504020031303c2c3432321a31000e0e0c00085029352a362a352b362c37332c452a462b472d4827061f060e0e0e0e000000003400000000000000|@3410,@3409| 3409:O1|@3411 3410:S41|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d69736572283329 3411:D28,660|008604030032322b1a8d020e0e0c00045029352a362b373303033c02012907d231291a77020c00021a75020e0e0c0002032429352a362a35291a68021a69020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a4b020c0003036b1a4702291a33020c00021a31020e0e0c0002032429352a362a35291a24021a25020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a07020c000303041a0702103b503b50293529351aef011af0010e0c000303043b5002041aef01103b50293765021e293529351ad0011ad1010e0e0c000303043b5002041acf01103b5029376433291aac01020284010e0c00021aa5010e0e0c0002032429352a362a35291aac011a99010e0e0c00036403052a68010207292503511e343b6502013b64293b1a7b010c000303051a8701021c293529351a7a011a67010c000303043b5002041a6701103b502937642f35303631372a2c2b1a61010e0e0c00042f030b1a5a012e0e0e0c000202013b3003102a1a4e010e0e0e0c00022f0c000202013b2b1a41011a42011a4301220f1a42011a43010c000732030b1a3e01310e0e0c000202013b3303102a1a16010e0e0e0c0002320c000202013b3c28403b1a1e010e0e0e0c00043c284022111a10010e0c00041a0d012a692922192d6a1a07012a69302a1a04010e0c00030403002f3b1afc000e0c0003031d2e3b1af1000e0e0c0003303b1ae7000c00032b2d452b462a472603021a2e3b1ad4000e0c00032b221e2b2d222022201ac8000e0c00075129352a362b372215030b1aba0022140e0c000202013b221603132c1a75000e0e0c000222150e0e0e0c000202013b2d2d2d22252225222522251a8f0022267b09260008322c452b4627041f070e0e0e0e0e0e0e000000008c02000000000000|@3413,@3414,I105,I218,@85,I251,@2900,@2955,@1840,@108,@3810,@3812,@3816,@2962,@922,@3818,@3824,@3826,@3593,@3828,I11,@3830,@3832,@3434,I253,@4132,@3412,@3409| 3412:O2|3,@5337 3413:S55|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f6365737354726565283329 3414:O1|@3415 3415:D13,180|00823c28403b1aaf000c00042d3b1aab000c000303033c020b2d1aa3001aa4000e0c000303041a9f00103b502d3c1a9b000c00032928403b1a7d000e0e0c0004293b311a8a000e0e0e0c0004501a84002a691a83002b691a82002e693c28403b1a55000e0e0c00042c2a2d2d6b040300220d2b2b1a69000e0e0c00045029352a362b372b2b2b6a220c3b1a57000c0003303b1a4f000c000322112c452b462a47270f440e0e0e0e0e00000000ac00000000000000|@3417,I11,I234,16777214,I231,@1868,I106,I255,@3418,@3420,@3426,@3416,I253| 3416:O7|@3429,@3468,@3491,@3541,@3591,@3685,@3428 3417:S35|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229 3418:D7,92|00802b352c362968012b3b1a52000e0e0e0c000303033c021456373b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356472a2c1a2d00320e0e0e7b05070004000000005400000000000000|@3419,I234,I253,I231,@1879,I106,I255| 3419:S47|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229656e74657241646472283129 3420:D10,172|00802b353c1aa8000e0c000303041aa300103b502b353e1a96000e0e0e0c0003030b3c2c69291a8f006964026e2b353b1a7d000e0e0c0003030b3c2c69291a7700696402562b36293b1a70000e0c000303033c021456173b1a65000e0e0c00032a2a1a5f000c00036403041a5a00103b50293c1a56000e0e0e0c000356272a1a3e000e0e0e0c0003293b1a23000c000303041a3b00103b50293566420e0e0e0e00000000a400000000000000|@3422,I251,@3421,@855,I234,I253,I231,@1850,I106,@2309| 3421:O4|@35,@863,@3424,@3423 3422:S48|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296c6f6f6b757041646472283129 3423:O5|@3425,921,0,921,0 3424:S31|746f70206c6576656c207265616368656420696e2073696d706c6966696572 3425:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f53494d504c49464945522e736d6c 3426:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003293c1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@3427,I253,I106,I255| 3427:S44|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296d6b41646472283129 3428:O7|@3733,@3416,@3468,@3491,@3541,@3591,@3685 3429:D7,428|00822d350a0e001e00f9001e0011015d011e003b0025011e001e0049011e001e001e00e7001a8801561c2e6a2e2a1a83010c0003292e1a7f012f0e0e7e0700030fce2d362e372f380403002c312b300e0e0c00045029352a362b3729353d1a5b010c0003033929372f2a0e0e0e0c000229352a362a353b1a42010e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964220e2a4530462b472705024b2d03202b353d1a14010e0c0003030c2b2f3c1a0c010e0c0004020628062c303c6b021e2b353d1af4000e0c0003030c2b2f3b1aec000e0c0004020628062c303b6b332a452c461adc004764270702ae2d362e372a2a30305667310e0e7b060700052d362e372f382b2b2b323256883302028a000e7b070800062d362e372f382a2c2b32325689330e7b070800062d360402002a2f3b3b2d567a0e0c00065029352a3628072b69302a453b462b472705024c2d362e372a2a69293030566b310e0e7b050800042d362d372a2a0e0e0e0c000229352a362a353b1a42000e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964312a453b462b472706440e0e0e00000000a401000000000000|@3431,@3432,@3434,@3430,I251,@2403,@855| 3430:O1|@3464 3431:S36|434f4445545245455f53494d504c494649455228292e73696d705370656369616c283229 3432:D1,36|00802b5618355628365638375648385657300e7b07030006000000001c00000000000000|@3433| 3433:S39|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283129283129 3434:O1|@3435 3435:D4,52|00812c2c0e0c0002293b1a2b000c0003030e2d1a26002e1a26002f7b05050004293564430e0e0e0e000000002c00000000000000|@3437,I251,@3434,@3436| 3436:O1|@3438 3437:S27|42617365436f6465547265652e6d6170436f646574726565283229 3438:D8,452|00822d350a0e00d000f100aa015f01a70189008a011a01a600bc001e00ab0053003d0073002d362e372a2f2f1a99010e0e0c00042a2f310e0e0c0003402b2b6a27040fcd2d362e372f382a2f310c0003280d2d2b2d6b27040fdd2d362e372f38292f310e0e0c00032c30320e0e0c0003280c2a2e2d6b27050fd42d362e372a2f2f1a48010e0c0004280e2a2c6a660fdd2d362e372a2e300e0e0c00032a2f310e0e0c000328052b2b6a27040fd31a20010fd02d36292d2f0e0e0c0003280b2a69650fd92d36292e2e1a09010e0e0c000428092a696502db2d362e372a2e300e0e0e0c00032a30301aee000e0e0e0c00043b2b2b6a270402ba2d362e372f382b2f310c00032b30320e0e0c00032b313302029f000e0e0c00033c2c2c2c6b270602912d3629352a362b372c382d392e3a2f23063023070202790030220c220e0e0e0e0c00032e220e220e1a9000020262000e0c00042a32322c32323232680828072a69270c024c2d362e372f02024300382a2f310e0e0c00032c31311a6200020430002e000e0c00043e2a2c2e6b270502212d362e372f382b2f31020214000e0e0e0c000328062a2d2d6b270402042d02012d440e0e0e0e0e00000000bc01000000000000|@3440,@3441,@3452,@3454,@3455,@3457,@3459,@3439| 3439:O1|@3463 3440:S34|42617365436f6465547265652e6d6170436f6465747265652832296d617074283129 3441:O1|@3442 3442:D5,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e362a2f2f1a38000e0c00042a30301a32000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@3443,@3441| 3443:O1|@3444 3444:D3,132|00822d353b1a80000e0c000303192d362e372f3830392930320c00033b2e2e2e2d6805270502502d353d1a5b000c000303102d36292d2f0e0e0c00033d2a696502352d353e1a40000e0c000303142d36292e2e1a36000e0e0e0c00043e2a696502152d362e372f38292f310e0e0c00033c2d2d2c6b270444000000007c00000000000000|@3446,I251,@3445| 3445:O1|@3447 3446:S47|42617365436f6465547265652e6d6170436f6465747265652832296d6170742831296d617062696e64696e67283129 3447:D6,108|00822d1a6a000e0e0e0c00021a65000e0e0c000203452d352e362a352b362c3728072a692932340e0e0c0003293528071a45000e0e0c000303043b5002041a3b001029362e2e2b6a30220d220d1a30000e0c00042a2a69270a02013b440e0e0e000000006400000000000000|@1785,I105,I218,I251,@3448,@3445| 3448:O4|@35,@863,@3450,@3449 3449:O5|@3451,500,0,500,0 3450:S8|64654c616d626461 3451:S45|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42617365436f6465547265652e736d6c 3452:O1|@3453 3453:D4,68|00822d1a42000e0e0e0c00021a3d000e0e0c0002031d2d352e362a2e300c00032a30301a2a000e0e0e0c00042a2a69270402013b440e0e0e000000003c00000000000000|@1785,I105,I218,@3452| 3454:O1|8 3455:O1|@3456 3456:D4,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e362a352b362a30320c0003292b692d33331a2b000c00042a2a69270702013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@3455| 3457:O1|@3458 3458:D4,92|00822d1a5a000e0e0e0c00021a55000e0e0c000203312d352e362a352b362a352b362c372933220c0e0c00032c2c2b6a292f6931220e220e1a2d000e0e0c00042a2a69270b02013b440e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@3457| 3459:O1|@3460 3460:D6,100|00822d1a62000e0e0e0c00021a5d000e0e0c000203392d352e363f2b69292f310e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c32321a36000e0e0e0c00042a2a69270602013b440e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,I251,@3461,@3459| 3461:O4|@35,@863,@2451,@3462 3462:O5|@3451,499,0,499,0 3463:D4,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e362a352b362a30320c0003292b692d33331a2b000c00042a2a69270702013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@3439| 3464:D9,212|00812c353d1ad0000e0c000303652c362d373d2b2b6a2a291ac1000e0e0c00021abd000e0e0c0002033a29352a362a35291ab0001aa1000e0e0c000364031b2a351aa0001a91000e0e0c000303043b5002041a9300102a370207292503511e473b6502031a8500642f2b453b462a47270402512c35401a5f000c0003033d2c362d370403002a2a1a66000e0e0e0c00035029352a362b372a3b1a3c000e0c000303032e020b2e2b1a4a000e0e0e0c0003322d452a462b47270702092b2d453b461a290047430e0e0e00000000cc00000000000000|@3466,I251,I105,I218,@34,@1840,@855,@3430,@3465| 3465:O1|@3467 3466:S44|434f4445545245455f53494d504c494649455228292e73696d705370656369616c28322973706c6974283129 3467:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3465| 3468:O2|@3469,@3416 3469:D11,204|00833b2f291ac8000e0c00021ac5000e0e0c0002031729362b3c1abb000c0003292b25042504511e233b6502012a652f56272f1aa6000e0e0e0c00040402002a2a1a9c000e0c00035029352a362a1a93000c000229291a77000c00021a75000e0e0c0002031d29352a362a353d1a78000e0c00030309292503511e253b02013b6502013c640310280e2a220c6a291a5b000c0002640206280e2a220c6a2b1a4f000c00021a4d002e693d322b6a220c2d452c462a47270a1f040e0e0e0e0e0e0e00000000c400000000000000|@3471,I105,I218,I106,@3472,@3479,@3482,I251,@2464,@3486,@3470| 3470:D6,92|008056072c2a1a57000c00021a55000e0e0c000203043b5002041a4b00102a352b362b3b1a45000e0e0c000303032a02172b3c1a3a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000005400000000000000|@3490,I105,I218,@878,I113,I107| 3471:S34|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329 3472:O1|@3473 3473:D5,108|00822d1a6a000e0e0e0c00021a65000e0e0c000203412d352e360403002b2f2b320c00045029352a362b372b2b2b6a0402002a342b1a40000e0c00045029352a362a2a6932220f220f1a30000e0c00042a2a69270c02013b440e0e0e0e0e0e0e000000006400000000000000|@1785,I105,I218,@3474,@3472| 3474:O1|@3475 3475:D3,156|00822d3529353f1a96000e0e0e0c0003031529362f3630373c2c69292b69312a452d462705026529353d1a73000c0003031829362a37303631373b2d2d6a292b69322a452d46270602422e362f372f383b2a0e0e0e0c00023d2a693c2a69292e693c3b2e336b293b69293b1a32000e0e0e0c0003030331020b312a1a26000e0e0e0c0003220d2d452a46270a64440e0e000000009400000000000000|@3477,I251,@3476| 3476:O1|@3478 3477:S36|434f4445545245455f53494d504c494649455228292e6d616b654e65774465636c283229 3478:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3476| 3479:O1|@3480 3480:D4,84|00812c3b1a51000e0e0c0003030d1a4b002c2a35452a36466402272c352d362a352b360402002c2a1a35000e0e0c00035029352a362d2b692d2b69342b452a462709430e0e0e0e0e000000004c00000000000000|@3481,I251,@1990,@3479| 3481:S17|4c697374506169722e756e7a6970283129 3482:O1|@3483 3483:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a352b362a353b1a4c000e0c000303152a362b37292c1a41000e0e0c00033d2c2b6a6602062a363f2a69642c1a2f000c00022a2a69270602013b420e0e0e000000005c00000000000000|@1785,I105,I218,I251,@3484,@3482| 3484:O1|@3485 3485:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3484| 3486:O1|@3487 3487:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c36291a42000e0e0e0c0002293b1a3b000c000303032b020b2b2a1a3200300e7e0600036602013b420e0e0e0e0e0e0e000000004c00000000000000|@2263,I105,I218,@3486,I251,@3488| 3488:O1|@3489 3489:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3488| 3490:S45|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329737065635265632d283129 3491:O2|@3492,@3416 3492:D15,628|0084040300302e2b56470e0e0e0c00045029352a362b372b353d1a5b020c0003034a2b36293b1a4f020c00030303320201330403002a342b56a70e0e0e0c00045029352a362b372a3b1a2c020e0c0003030330020b302b1a22020e0e0e0c0003220d2d452a462b4727070fd12a2c2b1a0e020e0e0e0c000404030034332b56970e0c00045029352a362b37040300220e220e2b56d70c00045029352a362b372f35280b1ad2010e0e0e0c000303232e302f1ad0010e0c00043c332b1aca016b3d2a69292e69221330452a462e4727040fdb2f353d1aa1010e0e0c000307d02f362f3b1a93010c0003031b2c353d1a88010e0c0003030c2b3b1a7d010e0e0c000302013b02013b039b2c362a2a1a69010e0e0c000303133d3469293b69221334452a461a6701476502772a3c1a4a010e0e0e0c00030310293b1a3d0102021f010e0e0c000302013b030c221134453b461a3a0147024b2a3b1a1e010e0e0e0c0003030c293c1a11010e0e0c000302013b031f333b69291a18010e0c00023e2a1a13013c6b22142a453b461a0001476602103c3433306b22122a453b461aee00476464025e2c35280b1ace000204ae0054000e0c000303242b2d2c1adc000e0c00043c341ac3002c6b3d2a692933692214220c452a463347270402272f31301abc000e0c00042c2e2d1ab6000e0e0e0c00043c220c2c2c6b22132a453b461a8d0047666402582b35280b1a6d000e0e0c000303232a2c2b1a8c000e0c00043c331a67002c6b3d2a69293269221334452a463247270402272e302f1a6d000e0e0c00042b2d2c1a66000e0e0e0c00043c342c2c6b22122a453b461a32004766270927041f050e0e0e0e0e0e000000006c02000000000000|@3494,I251,@3495,@3497,@3512,@809,@855,@3516,@813,@3518,@3522,@3526,@3530,@3534,@3493| 3493:O1|@3538 3494:S39|434f4445545245455f53494d504c494649455228292e73696d7049665468656e456c7365283429 3495:O1|@3496 3496:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3495| 3497:O1|@3498 3498:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3501,@3497,@3499| 3499:O1|@3503 3500:S43|434f4445545245455f53494d504c494649455228292e7370656369616c546f47656e6572616c2833292829 3501:O1|@3502 3502:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3501| 3503:D10,244|00812c3b1af1000e0e0c000303032b02d52b353f1ae1000e0e0c000303112b3629353d1ad2000e0e0e0c00036402013b03b02b3629362e291ac1000e0e0c00021abd000e0e0c000203043b5002041ab3001029352a36293b1a9d000e0e0c000303032a0207292503511e323b6629353c1a85000e0e0c0003036129372a382c2b1a85000e0e0c0003034a3b32291a6c000e0c00021a69000e0e0c0002031729362b3c1a67000c0003292b25042504511e233b6502012a65293c1a54000e0c0003332a1a4f000c0003292d1a4b00220c0e7e0c00034032326a6502044030306a660204402d2d6a430e00000000ec00000000000000|@3505,I251,I105,I218,@3506,I113,I106,I107,@3504,@3499| 3504:O1|@3508 3505:S30|434f4445545245455f53494d504c494649455228292e6d6b456e76283229 3506:O4|@77,@2231,0,@3507 3507:O5|@881,88,0,88,0 3508:D7,84|00812b3b1a51000e0e0c000303033b02342c1a47000c00021a45000e0e0c000203043b5002041a3b00102c352d362d3c1a35000e0e0c00032a2a1a2f000c00032c2a692704430e0e000000004c00000000000000|@3510,I113,I105,I218,@3509,I107,@3504| 3509:O4|11,@316,0,@3511 3510:S12|4c6973742e74616b65283229 3511:O5|@881,108,0,108,0 3512:O1|@3513 3513:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3514,@3512,@3499| 3514:O1|@3515 3515:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3514| 3516:O1|@3517 3517:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3516| 3518:O1|@3519 3519:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3520,@3518,@3499| 3520:O1|@3521 3521:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3520| 3522:O1|@3523 3523:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3524,@3522,@3499| 3524:O1|@3525 3525:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3524| 3526:O1|@3527 3527:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3528,@3526,@3499| 3528:O1|@3529 3529:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3528| 3530:O1|@3531 3531:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3532,@3530,@3499| 3532:O1|@3533 3533:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3532| 3534:O1|@3535 3535:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3536,@3534,@3499| 3536:O1|@3537 3537:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3536| 3538:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3539,@3493,@3499| 3539:O1|@3540 3540:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3539| 3541:O3|@3542,@3416,@3428 3542:D43,1180|00842c36040300312f2b56570e0c00045029352a362b3734353f1a83040c000303533436521a7c0445531a7b0445292b462c476c502a2a466c50220d291a6c040e0c00021a69040e0e0c0002032229352a362a35293b301a5a040e0e0e0c00046403033c0207292503511e2e3b6502013b270402013b2a353b1a24040e0c0003030c293b1a19040e0e0c000302013b07cb2a362b372a352b392c23063b2b291a0a040e0e0e0c00021a05040e0e0c0002031729362b3c1aff030c0003292b25042504511e253b6502012a653b2212291ada030e0e0e0c00021ad5030e0e0c0002031729362b3c1acf030c0003292b25042504511e253b6502012a652a2a1abc030e0c00036503043b5002041ab20310333b3c1aaf030c000450220e36220f382b3b1aa4030e0c000303033c020b2b1a9b031a9c030e0c000303041a9703103b502b3c1a73030c00032928403b1a89030e0e0c0004293b2f1a6a03020242010e0e0e0c00045022141211000100010022141a69030e0e0c00040402002a2a1a60030e0c00035029352a362a3b1a12030e0e0e0c000303051a4b0302903b2b291a0b030c00021a09030e0e0c0002031729362b3c1a03030c0003292b25042504511e223b6502012a65291a1d031a02030e0e0e0c000303041a1303103b502928403b1af5020e0e0c00043b2d293b1ab1020e0e0c000303043b50022629352a362d2d2c1ac0020e0c0004502c3c1aaa020e0e0e0c0003292b2505250526031e32260351291acb020c00025029652a1ac5020e0e0c00021ac102220e2c326b1abd02316929220c2c220d6b04030022102b2b121d00010001000e0e0e0c00045029352a362b372a3b1a38020e0c0003030330020b302b1a8a020e0e0e0c0003293b1a1f020c000303042219020a22192a1a74020e0c000322202e452a462c4727180fce2c353d1afa010e0e0e0c000307cf2c36220c5688220c1a4f020c00042a1aec010e0c000203041a4302103b5028662b1a3e020e0e0e0c0003036128672b1a34020e0c0003291a30021a31020e0e0c0003291a24021aa9010e0e0c000365033929291aa8010e0c00021aa5010e0e0c0002032229352a362a3529353d1a82010e0e0e0c0003640309292503511e2b3b02013b6502013c6402013b02013b07cf291ade010e0e0e0c00022b1a60010e0c000203041acf01103b5028662c1ab2010e0e0e0c0003032d28672c1aa80102021c010e0c0003291aa0011aa1010202f3000e0e0c0003291a90011a15010e0e0c00036502013b03043b5002041a8b0110280e2a3b6a2a291a04010e0c00021a01010e0e0c0002031d29352a362a353d1ae0000e0c00030309292503511e263b02013b6502013c64030b291a51010e0e0c0002020129291a45010e0e0c000229353d1aae000e0e0e0c000303043b5002041a2f0110293678812b311aa100020251000e0e0c000203041a1b01103b50312c691a16010e0e0e0c00023d2a3b6a64052d0e0e0e00ff6d29353c1a65000e0e0c0003030f29352a362b372b2b2b1aee006b66103b503d2a3b6a280b2a6965270502063e2a30220f6b342a452f461ad2004766021a345678341acb000c00043e2a2f220e6b332a452e461ab600476527061f05000000009404000000000000|@3544,I251,@3545,@3547,I105,I218,@3548,I106,I113,@3555,I255,I234,16777214,I231,@1868,I11,@3558,@3479,I49,16777215,@3560,I47,@3562,@3566,@3571,@3573,@3575,@3577,@1784,I150,I153,805306368,I243,@3580,@1784,@3582,@2464,@3585,@1784,I204,@3588,@855,@3543| 3543:O1|@3589 3544:S41|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429 3545:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@3546| 3546:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283129 3547:D6,324|00812c353e1a40010e0c000303052b3c690fd22c3528071a2e010e0e0e0c000303412c362938292e2a1a20010e0c00021a1d010e0e0c000203212a352b363f2b69292d56971a0c010e0c00042b2a2506250626041e2c3b270402012965293c696602cd2c353f1adf000c000303bf2c362c03033c02b12956281acc000e0c000303033c02a229353b1abd000e0e0c0003031f5618353b1aaf000c0003031029365628361ab2000e0e0e0c000302013b027629353c1a91000e0e0c0003031f5618353c1a83000c0003031029365628361a86000e0e0e0c000302013b024a29353d1a6500020249000e0e0c0003031f5618353d1a53000c0003031029365628361a56000e0e0e0c000302013b021a29353e1a35000e0e0c0003030c5618353e1a27000c000302013b293b696502032b3b69430e0e0e0e0e0e0e000000003c01000000000000|@3549,I251,I105,I218,@3548,I113| 3548:O1|@3550 3549:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283229 3550:D4,60|00822d2d692c0e0e0e0c00022936293b1a2d000e0e0c000303122a35302a1a2300311a2300320e7b060800052a356544000000003400000000000000|@3552,I251,@3548,@3551| 3551:O1|@3553 3552:S24|42617365436f6465547265652e666f6c6474726565283329 3553:D4,724|00832e350a0e00a001e901b8025d02b5023f01a9020d02590169011e005c01f100e30009012e362f372a302a1aa9020e0e0c00021aa5020e0e0c0002039d2a352b362a353b1a98020e0c0003030d2a39292d34220d0c00046402722a353d1a7f020c0003030d2a36292d34220d0c000464025a2a353e1a67020c000303412a36292d2a1a52020e0e0e0c00021a4d020e0e0c000203252a352b362a3728072a69292e221122130e0e0e0c00042c2a2507250726051e323b270502012966020e2a38292d34220d0e0e0e0c0004642a2a2505250526031eaa3b66020129652a2a3032310e7b050900040fcf2e37292f2e302f0e0e7b050700042e362f3829302f310e0c00042b2a3032310e0e7b050900042e36292f2a1ac0010e0c00021abd010e0e0c0002031c2a352b362a2c32340e0e0e0c00042a2a2505250526031e283b66020129660fdc2e362f372a302f310e0e0e0c00042a2a3032310e0e7b050900042d0fca2e36292f2e302f0e7b050700042e36292f2a1a60010e0c00021a5d010e0e0c0002031d2a352b362a35292d33220c0c00042b2a2506250626041e283b2704020129660fd12e362f3729302a1a27010c00021a2501020205010e0e0c000203212a352b362a352937292e220c220e0e0c00042c2a2507250726051e2f3b2705020129652b2a3032310e7b050900042e362f3730382b3130320e0e0e0c00042b2a31330e0c00042b2a3234330e0e7b050b00042e3629352a3829312a1ab80002029c000e0c00021ab100020291000e0e0c000203212a352b363f2b69292d220c220e0e0e0c00042b2a2506250626041e343b2704020129652b2a3133320e7b050a00042e362f3729302f310e0c00042b2a2a1a6200020246000e0e0e0c00021a59000e0e0c000203212a352b362a35292d220c220e0e0e0e0c00042b2a2506250626041e323b2704020129270502102e36292f2e302f7b050700042d02012d1f040e0e0e0e0e0e00000000cc02000000000000|@3554,I105,I218,I251| 3554:S32|42617365436f6465547265652e666f6c64747265652833296674726565283229 3555:O4|@35,@863,@3557,@3556 3556:O5|@3425,589,0,589,0 3557:S35|73696d7046756e6374696f6e43616c6c3a20617267756d656e74206d69736d61746368 3558:O1|@3559 3559:D5,108|00822d1a6a000e0e0e0c00021a65000e0e0c000203452d352e362a350403002a302b330e0e0c00045029352a362b372b2b2b6a0402002a220c2b1a3b000c00045029352a362a2a6933221022101a2c000e0c00042a2a69270d02013b440e0e0e000000006400000000000000|@1785,I105,I218,@3474,@3558| 3560:O4|4,@394,0,@3561 3561:O5|@868,124,0,124,0 3562:O1|@3563 3563:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c36291a42000e0e0e0c0002293b1a3b000c000303032b020b2b2a1a3200300e7e0600036602013b420e0e0e0e0e0e0e000000004c00000000000000|@2263,I105,I218,@3562,I251,@3564| 3564:O1|@3565 3565:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3564| 3566:D14,220|00802b353e1ad8000e0c000303041ad300103b502b353c1ac6000e0e0e0c0003030a2b362956272d7d0400022b353b1aae000e0e0e0c0003033e2b36291aa8000e0c00021aa5000e0e0c000203033c021456181a9a000e0e0e0c00022a2a1a93000c00036403041a8e00103b5056182a1a89002e7e0400032b36293b1a81000e0e0c000303033c021456193b1a6d000e0e0c00032a2a1a6b000c00036403041a6600103b50293c1a62000e0e0e0c000356292a1a46000e0e0e0c0003293b1a1f000c000303041a4700103b502935664200000000d400000000000000|@3568,I251,@3567,I105,I218,I15,I247,@866,I253,I234,I231,@1850,I106,@2309| 3567:O4|@35,@863,@3570,@3569 3568:S56|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c2834296c6f63616c4f6c6441646472283129 3569:O5|@3425,619,0,619,0 3570:S27|6c6f63616c4f6c64416464723a204c6f6164526563757273697665 3571:D7,92|00802b352c362968012b3b1a52000e0e0e0c000303033c021456373b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356472a2c1a2d00320e0e0e7b05070004000000005400000000000000|@3572,I234,I253,I231,@1879,I106,I255| 3572:S59|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429736574546162466f72496e6c696e65283129 3573:O1|@3574 3574:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3573| 3575:O1|@3576 3576:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3575| 3577:O1|@3578 3578:D6,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a352b361a3f0031316a2b2a1a3b000c0003292c692e34341a33000c00042a2a69270802013b440e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@3579,@3434,@3577| 3579:D1,36|00802b5618355628365638375648385657300e7b07030006000000001c00000000000000|@3433| 3580:O1|@3581 3581:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3580| 3582:O4|@35,@863,@3584,@3583 3583:O5|@3425,118,0,118,0 3584:S13|6e6f74206561726c7920727473 3585:O4|@35,@863,@3587,@3586 3586:O5|@3425,124,0,124,0 3587:S26|6d616b65436f6e737456616c3a204e6f7420636f6e7374616e74 3588:O5|@3425,133,0,133,0 3589:D6,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a352b361a3f0031316a2b2a1a3b000c0003292c692e34341a33000c00042a2a69270802013b440e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@3590,@3434,@3543| 3590:D1,36|00802b5618355628365638375648385657300e7b07030006000000001c00000000000000|@3433| 3591:O2|@3592,@3428 3592:D24,372|00842f35303631383239333a342306220c2307220c36220d372c3b1a5a010e0e0e0c000303033c020b2c1a4f011a50010e0c000303041a4b01103b502c3c1a47010c00032928403b1a41010e0e0c0004293b301a3a010e0e0e0c0004503c28403b1a28010e0c00043c28403b1a1d010e0e0c00041a1d012c691a1c0122122c2e32221722113368083c28403b1afd000e0e0c00041a05012a691a0401121300010001002e220c2f2e680622112a1af4000e0c0003303b1aef000c0003293b2a1aea000e0e0e0c00021ae5000e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652e3b1ab7000c000322113c1aba000e0e0e0c000303033c020b323b1a9e000e0e0e0c0003293c1a9f000c000303032d02172d1a97001a98001a99002e1a99001a9a000e0e0e0c00072922173b2f22182f31221868082b3c1a6e000e0e0e0c000303051a7b00020a1a7a002e693b2b2b6a64221c2b452a46271a1f050e000000006c01000000000000|@3594,I234,16777214,I231,@1868,I106,I11,I255,@3595,@3597,@3607,@3609,@3434,I253,I105,I218,I251,@922,@3610,@3613,@3616,@3593,@855,@877| 3593:O1|@3618 3594:S35|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429 3595:D7,92|00802b352c362968012b3b1a52000e0e0e0c000303033c021456373b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356472a2c1a2d00320e0e0e7b05070004000000005400000000000000|@3596,I234,I253,I231,@1879,I106,I255| 3596:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429736574546162283129 3597:D17,348|00802b353c1a58010e0c000303b92b36561c2a2a1a4d010e0e0c00021a49010e0e0c000203043b5002041a3f01102a352b362b3b1a39010e0e0c000303032a02172b3c1a2e010e0e0e0c00032a2a2505250526031e413b64270429353d1a00010e0c00030314562b1af9000e0e0c00021af5000e0e0c000202013b03232936563b352a2a1ae9000e0e0c0003030e56483b3c1ae3000c0004503c02013b6502013b03051ad600021c29563a0e0e0c000229352a365657566856791ac300330e7b070600066502842b353e1a93000c0003030b3c2c69291aab006964026e2b353b1a7d000e0e0c0003030b3c2c69291a9300696402562b36293b1a8c000e0c000303033c0214561d3b1a81000e0e0c00032a2a1a7b000c00036403041a7600103b50293c1a72000e0e0e0c0003562d2a1a5a000e0e0e0c0003293b1a23000c000303041a5700103b50293566420e0e0e0e000000005401000000000000|@3599,I251,I105,I218,@878,I113,I107,I255,@3600,@3598,@855,I234,I253,I231,@1850,I106,@2309| 3598:O1|@3602 3599:S50|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129 3600:O2|@3601,@855 3601:O2|1,@844 3602:D12,236|00842f353c1ae8000e0c000303282f3629353d1ada000e0e0e0c000303142e1ad2000e0e0e0c00021acd000e0e0c000202013b6402013b03232f3629362f352a2a1ab8000e0c0003030e2f3b3c1ab0000e0c0004503c02013b6602013b03051aa20002762f353b1a86000e0e0e0c0003030b2f3630373b2b2b6a65020f2f36292d1a84000e0c00033c2a69652f353c1a5e000e0e0e0c000303051a6f0002372f353b1a4b000c000303172f3630371a5f001a60003232322e68063b2c2b6a6602152f3630371a50001a49003232322e68063d2c2b6a662a2a69651f050e0e0e0e00000000e400000000000000|@3604,I251,I105,I218,I113,I255,@3600,@2438,@855,@3605,@3598,@3603| 3603:D1,44|00802b561b0c000229352a362a2a56585669567a5687337b070600060e0e0e0e000000002400000000000000|@3606| 3604:S66|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229 3605:D1,44|00802b561b0c000229352a362a2a56585669567a5687337b070600060e0e0e0e000000002400000000000000|@3606| 3606:S82|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229636f6e76657274456e76283129283129 3607:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003293c1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@3608,I253,I106,I255| 3608:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296d6b41646472283129 3609:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3610:O1|@3611 3611:D1,20|00813c2d69430e0e000000000c00000000000000|@3612| 3612:S42|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836292d45 3613:O1|@3614 3614:D1,20|00803b420e0e0e0e000000000c00000000000000|@3615| 3615:S44|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632d283429283129 3616:O1|@3617 3617:D1,20|00813b430e0e0e0e000000000c00000000000000|@3612| 3618:D10,100|00852c3b1a61000e0e0c000303033c020b2c1a57001a58000e0c000303041a5300103b502c3c1a4f000c00032928403b1a49000e0e0c0004293b301a42000e0e0e0c00045032321a3a003234322f1a3700340e7b090a0008000000005c00000000000000|@3620,I234,16777214,I231,@1868,I106,I11,I255,@3593,@3619| 3619:O1|@3621 3620:S40|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629 3621:D6,76|008631311a490032323232321a45000e0e0c0009293b1a3f000c0003031a1a3b001a2c0032323232326807332a1a30002f0e0e0e7e0b00032935641f070e0e0e000000004400000000000000|@3623,@3619,@3624,I251,@3622,@3434| 3622:D3,44|00802b1a2a00562756385649565a566b567c1a1f00330e7b0a0300090e0e0e0e000000002400000000000000|@3684,@845,@3624| 3623:S52|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229 3624:O1|@3625 3625:D14,596|008732350a0e0021004c001e0095006e011e003001d9001e001e0001021e001e001e00f3003b0fdd323633372a34333333333322100c00082a3434343434341a16020e0e0e0c00083b2b2b6a29680127050fd03236333734382b1aff01343434343422110e0c00082b220d220c220c220c220c220c22120e0e0c00082b220e220d220d220d220d220d22130e0e0c00083c2c2c2c6b29680127070fdd3236333734382b3434343434341ab4010e0c0008291ab0010e0c00023b220e2b6a293b692e2a220f220f220f220f220f22150e0e0e0c00083e2e2b316b29680127090fd33236293332323232321a7c010e0c000828072a69296801660fd732363337293b1a690102023f010e0e0c000303252a3b220c220c220c220c220c220c220c1a4f01020221010c000a280e2a3b6a2968016502013b650fdd323633373438293b1a2a010e0e0e0c000303273d2b220d6a293b692d2a220d220d220d220d220d22130e0c000828062a2f3b6b296801270402013b6602d132360202cb0029353e1aeb000c0003030c32300e0c0002501ae400026d29353c1ad4000e0c0003030d29362934310e0e0c000364025429353b1abb00020291000c0003030f29362934300e0e0c0003502a6402362936331aa900020273000e0e0c00021aa1000e0e0c00021a99000e0e0c000203041a9300103b50332a2f1a8e000e0e0e0c0004502a643f2a6929680166023e32363337293433333333020230003322100c00082b2f220c220c220c220c220c1a5d000e0e0c0008293b1a37000c000303032a0204402a2c6a29680127051f08000000004c02000000000000|@3627,@3628,@845,@3630,@3632,@3634,I251,@3669,@844,I105,I218,@3650,@3649,@3626| 3626:O1|@3674 3627:S62|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283229 3628:O1|@3629 3629:D5,140|0086311a8a000e0e0e0c00021a85000e0e0c00020365313532362a352b362a352b362c372b1a68000e0c00021a65000e0e0c00021a5d000e0e0c000203051a570002012b2a2a2210221022102210221022160e0e0e0c00082d2d2b6a293069322213221322132213221322131a2d000e0e0c00082a2a69270c02013b1f070e0e000000008400000000000000|@1785,I105,I218,@845,@3628| 3630:O1|@3631 3631:D5,100|0086311a62000e0e0e0c00021a5d000e0e0c0002033d313532362a352b362a1a4e00220c220c220c220c220c22120e0e0e0c0008292b692d220e220e220e220e220e220e1a2d000e0e0c00082a2a69270702013b1f070e0e000000005c00000000000000|@1785,I105,I218,@845,@3630| 3632:O1|@3633 3633:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3632| 3634:O1|@3635 3635:D28,1052|00863135323633383439220c3a220d2306220e23073c28403b1a04040e0c00043b2e291afe030e0e0e0c00021af9030e0e0c0002031729362b3c1aef030c0003292b25042504511e253b6502012a65293b1adc030e0c000303033c020b291ad3031ad4030e0c000303041acf03103b50293c1ab7030c00032928403b1aa1030e0e0c0004293b2d1ab6030e0e0e0c0004501ab0032a693c28403b1a83030c00041aa5032a6922153b2a1a78030e0c00021a75030e0e0c000203542a352b362a353c1a88030e0c000303071a83032c69022f2a353b1a75030e0e0c0003031d2a362c3b1a67030c0003030329020b292d1a62030e0e0e0c00036402051a5a032c692a2a2505250526031e603b6602012965220e2a1a4603332218221822182218221468072d220d31221b0c00072c3b1a2f030c0003293b2a1aea020e0e0e0c00021ae5020e0e0c000203542a352b362a353c1af8020e0c000303071af3022c69022f2a353b1ae5020e0e0c0003031d2a362c3b1ad7020c0003030329020b292d1ae2020e0e0e0c00036402051aca022c692a2a2505250526031e623b66020129652a1a80020e0c00021a7d020e0e0c00021a75020e0e0c000203033c02442c291a62020e0e0e0c00021a5d020e0e0c0002032d29352a362a353c1a70020e0c000303033c020b2a353e1a61020e0e0c000303033c0207292503511e3b3b6502013b6403033b0fdd2c291a19020e0e0c00021a15020e0e0c0002031d29352a362a353d1a28020e0c00030309292503511e273b02013b6502013c64033429291ae4010e0c00021ae1010e0e0c0002031d29352a362a353d1af4010e0c00030309292503511e263b02013b6502013c6402013b03aa293b2a1aac010e0c00021aa9010e0e0c0002038a2a352b362b3c1abd010e0e0c000303033c02692a353d1aad010e0e0c000303043b5002041abb01102a3631291a6f010c00021a6d010e0e0c0002033e29352a362a353d1a80010e0c000303043b5002041a9301102a36292e1a8f0102023a000c00031a3d010e0e0c0002640309292503511e463b02013b6502013c652a2a2505250526031e963b660201296503052a680102013b02031a5501293b1a28010e0c000303b0343b1a31010e0e0c0003293b2a1aea000e0e0e0c00021ae5000e0e0c000203182a352b362a35292d692b2a2506250626041e253b27040201296522111a0f010c0002343b1aef000c00033b2a293b1ad1000e0e0c000303032a0237293c1af2000e0e0e0c00032a3c1ae7000c0003293c1a8f000c000322112a1aba000e0e0e0c0003292f69292e2507250726051e413b2705652b2a1abe000e0e0e0c000332221833302d2219221922196808270602322935293b1a6b000c00030304221b020a221b2a1a94000e0c0003221d2a221d221d221d221d221d1a8400221e0e7b091e000827131f07000000001404000000000000|@3637,I11,I105,I218,I106,I234,16777214,I231,@1868,I255,@3638,@3642,I251,@855,@3646,@844,@3648,I253,@3658,@3660,@3663,I113,@3665,@3666,I240,@2251,@3636,@3634| 3636:O1|@3668 3637:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229 3638:D10,172|00812c3b1aa9000e0e0c000303033c021456073b1a9d000e0e0c00032d2a1a97000c00036403041a9200103b502c3c1a8e000e0e0e0c000356172a1a76000e0e0e0c0003293b1a7b000c000303032d020b2d2a1a72000e0e0e0c00032f3b1a4f000c000303033c021456373b1a45000e0e0c0003302a1a3f000c00036403041a4a00103b502f3c1a36000e0e0e0c000356472a2c1a3900320e0e0e7b0508000400000000a400000000000000|@3640,I234,I253,I231,@1850,I106,I251,@3639,@1879,I255| 3639:O1|@3641 3640:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229636865636b417267283229 3641:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3639| 3642:D5,68|008056073b1a40000e0c0003293b1a3b000c000303032c020b2c2a1a32000e0e0e0c000356273b2b1a29000e0e0c0004503b65420e0e0e0e000000003c00000000000000|@3644,I253,I251,@3643,I255| 3643:O1|@3645 3644:S63|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229616464526566283129 3645:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3643| 3646:O1|@3647 3647:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3646| 3648:D11,228|0081560c2d2a1adf000c00021add000e0e0c000203043b5002041ad300102a352b362b3b1acd000e0e0c000303032a02172b3c1ac2000e0e0e0c00032a2a2505250526031e3f3b64270429353e1aac000e0c0003030c2c56280c0002501aa000026529353c1a94000e0c0003030d2936292e56490e0c000364024c29353b1a7b000c0003030f2936292e564a0e0c0003502a64023229362d1a4d000e0e0c00021a49000e0e0c00021a41000e0e0c000203041a4f00103b502d2a564b1a49000e0e0c0004502a642956371a3f002f0e0e7e0600030e0e0e0e00000000dc00000000000000|@3612,I105,I218,@878,I113,I107,I251,@844,@3650,@3649,@2438| 3649:O1|@3654 3650:O4|@35,@863,@3652,@3651 3651:O5|@3653,126,0,126,0 3652:S25|636c65616e457874726163743a20656d707479207573616765 3653:S58|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f52454d4f56455f524544554e44414e542e736d6c 3654:D10,164|00822c3b1aa1000e0e0c000303033c02142b3b1a96000e0e0e0c00032d2a1a8f000c00036403041a8a00103b502c3c1a86000e0e0e0c00032c2a1a6f000c0003293b1a77000c000303032f020b2f2a1a6e000e0e0e0c00032f3b1a4b000c000303033c02142e3b1a42000e0e0e0c0003302a1a3b000c00036403041a4600103b502f3c1a32000e0e0e0c00032f2a2c1a3600327b05090004000000009c00000000000000|@3656,I234,I253,I231,@1850,I106,I251,@3655,@1879,I255| 3655:O1|@3657 3656:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836296164644c6f63616c557365283229 3657:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3655| 3658:O1|@3659 3659:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3658| 3660:O4|@35,@863,@3662,@3661 3661:O5|@3653,101,0,101,0 3662:S12|6e6f74205573654669656c64 3663:O4|@35,@863,@3662,@3664 3664:O5|@3653,98,0,98,0 3665:O1|@845 3666:O1|@3667 3667:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3666| 3668:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3636| 3669:O1|@3670 3670:D9,228|0088331ae2000e0e0e0c00021add000e0e0c000203bd33353436333b2a1ac8000e0c00021ac5000e0e0c000203512a352b362a353d1ab8000e0c000303302a362b3722112b1aac000e0c0003031c2d3b1a9d000e0e0c0003030329020b292e1a96000e0e0e0c000302012d6502032a2c692a2a2505250526031e5d3b6602012965293b1a6a000e0e0e0c000303051a6b000201292c2a220c220c220c220c220c22120e0e0e0c0008220e3c1a52000e0e0e0c00032d2a22102210221022102210221022101a3d000e0e0c000a2b2a69270702013b1f090e0e00000000dc00000000000000|@3672,I105,I218,I251,I113,@3671,@845,I106,@3669| 3671:O1|@3673 3672:S77|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734669656c64283229 3673:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3671| 3674:D20,724|0086311ad2020e0e0e0c00021acd020e0e0c000207d1313532362a353b1ac0020e0c000303d52a372b382c392c220d220d220d220d220d220d1aa8020e0c00082c3b1aa3020c000303033c0214220d3b1a99020e0e0c00032d2a1a93020c00036403041a8e02103b502c3c1a8a020e0e0e0c0003220e2a1a72020e0e0e0c0003293b1a5b020c0003032d2c1a6e020e0e0e0c0002291a68021a69020e0e0c0003291a5c021a39020e0e0c00036503033b02031a5302020129291a1c020e0c00021a19020e0e0c00021a11020e0e0c000203032c02222d1a33022210221022102210221622160202d9010c00083b2b32322d6805292f696527070fdb2a353d1adf010c000303542a362a3434343434341ad2010e0e0e0c00082a1ae0010e0c0002291adc011add010e0e0c0003291ad0011aad010e0e0c00036503032902192a1ace0134343434221122110e0e0e0c00083d2a69292c6965650fd22a353e1a80010e0c0003035a2a362a3434343434341a72010e0e0e0c00082a3b3b220e220d220d220d220d1a8c010e0c000929220d1a86010e0e0e0c0003291a3c010e0c00021a39010e0e0c00021a31010e0e0c000203032b02073e2a69292d696427040fd52a372b382b220c220c220c220c220c220c1a10010202e7000e0c00082b3b1a07010c000303033c0214220c3b1afd000e0e0c00032c2a1af7000c00036403041af200103b502b3c1aee000e0e0e0c0003220d2a1ad6000e0e0e0c0003293b1abf000c000303312c1ad200020291000e0e0e0c0002291ac8001ac9000e0e0c0003291abc001a99000e0e0c00036503033b02031ac700020129291a7c000e0c00021a79000e0e0c00021a71000e0e0c000203032c02482d3528071a64000e0c000303212d36292b221022102210221022161a8d00020228000e0e0c000828072a696502112d2a220f220f220f220f221522150c00083c2b312c6b292f696527066502013b1f070e0e0e00000000cc02000000000000|@3676,I105,I218,I251,@3626,I234,I253,I231,@1850,I106,@3677,-536870912,I243,@845,@845,@845,@3680,@3675,@845,@3634| 3675:O1|@3683 3676:S76|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f6365737344656373283129 3677:O1|@3678 3678:D13,580|00802b350a0e002c00e5011e0045001e002401c8001e002600290051012f0023001d02d5001a20020fd63b0fd53b0fd43b0fd33b0fd22b36291a10020e0c0002291a0c021a0d022f7e0500032b362c3729353d1a02020e0e0e0c0003036d2936291af8010e0c000203041af301103b5028662a1aee010e0e0e0c0003034928672a1ae4010e0c00032c2a2a1ace010e0e0e0c00021ad5010e0e0c000203252a352b362a35291aa4010e0c0002292e1aa3010c00032c2a2507250726051e323b27050201296602013b6402013b650fd02b36291a77012d0e0e7d0400022b36291a66012a1a76010e0e0e0c00021a7d010e0e0c000203312a352b362a1a4e01020a2e012c012a01280126010e0e0e0c0002292d1a3f010c00032b2a2506250626041e3e3b2704020129660fcd2b362c372a1a19010e0e0c0002291a34011a35010e0e0c00032b1a04010e0c00022a2a1a0301320e0e7e0800032b362c37291aec000e0c00022b2a2a1af2000e0e0e0c00021af9000e0e0c0002036d2a352b362a353b1ad4000e0c0003030d2a39291abc000e0c00026402362a353d1abb0002028f000c0003030d2a36291aa0000e0c000264021a2a353e1a9f000c000303051a8700020a2a38291a83000c000264292d1a82000e0e0e0c00032b2a2506250626041e7a3b2704020129270502442b362c372d382b1a5600020236000e0e0e0c00022b1a48000e0c00022a2a1a47000c00032c1a38000e0c00022a2a1a3700340e0e7e0a00032b37291a22002d0e7d040002420e0e0e0e0e0e0e000000003c02000000000000|@3679,-268435456,@3677,1073741823,I243,I251,I105,@1784,I150,I153,I218,-1073741824,I242| 3679:S33|434f4445545245455f46554e4354494f4e5328292e636f646550726f7073283129 3680:O1|@3681 3681:D12,236|0087321aea000e0e0e0c00021ae5000e0e0c000203a5323533362a362b372a3b1ad5000e0e0c000303033c0214333b1aca000e0e0e0c00032b2a1ac3000c00036403041abe00103b502a3c1aba000e0e0e0c0003342a1aa3000c0003293b1aab000c0003031e2e220f692e2a2210221022102210221022101a950022110e0e7b0a1100091a8d002a692c2a220e220e220e220e22131a80000e0c00082e2a693022123c221222122212221222121a60000e0c00092a2a69270a0221303b1a4c000e0c000303033b0213313b3b32323232321a3c00330e0e7b0a0a00091f080e0e00000000e400000000000000|@3682,I105,I218,I234,I253,I231,@1850,I106,I251,@3680,@844,@3634| 3682:S93|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734465637328312970726f636573734d757475616c73283329 3683:D9,132|00812c1a82000e0e0e0c00021a7d000e0e0c000203592c352d362a352b362a3b1a6d000e0e0c000303033c02142f3b1a62000e0e0e0c00032b2a1a5b000c00036403041a5600103b502a3c1a52000e0e0e0c0003302a1a3b000c0003292d2d6a2e331a3f000c00032a2a69270802013b430e0e0e0e0e0e0e000000007c00000000000000|@1785,I105,I218,I234,I253,I231,@1850,I106,@3675| 3684:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283129283129 3685:O3|@3686,@3416,@3591 3686:D2,52|00822d352e362e352f3630382d312b2e5697220d3056c8341a1d0022100e0e7b0b0a000a0e0e0e0e000000002c00000000000000|@3688,@3687| 3687:O1|@3689 3688:S35|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229 3689:D30,1204|0088331ab2040e0e0e0c00021aad040e0e0c000207cb333534362a353b1aa0040e0c000307ce2a372b382c393b220e0e0e0c00023d2a693c2a69291a8604692f2a6966220e0c00020403002c220e2b22110c00045029352a362a35280c1a60040e0c000307ce2a362b372c3829353f1a4e040e0e0e0c00030311293629353d1a3e040e0e0e0c00036402013b03112936293629331a31040e0e0c00036502013b03043b5002041a2304103b22160c00023d2a693c2a69291a0a0469220e2a696622160e0e0e0c0002040300220e2a221a221a221a221a221a221a221a1af1030202b4030e0e0c000a5029352a362b373b221c0202c3010e0e0e0c00023c3b2b220c6b2a3b1acd030e0e0c000303041ac703103b503d2b693f2a6934353b2a293b1a9d030e0e0c000303032a0285293c1aaa03020240010e0e0e0c00032a3c1a9b030c00032b3c1a93030c00032211360402002b28082b1a87030c00045029352a362c2b1a7e030e0e0e0c00033c2b1a77030c00032a2a1a73030c0003293b1a3f030c0003641a34030e0c0002293b1a2f030c0003030334020c2806220e333b6b29220d69642934250d250d260b1e8f3b270b653b2a291aff020c00021afd020e0e0c0002031729362b3c1a23030c0003292b25042504511e223b6502012a652922171ae3020c00036403043b5002041a020310280e2a3b6a2a291abb020c00021ab9020e0e0c0002031d29352a362a353d1aac020e0c00030309292503511e253b02013b6502013c64030b291ac9020e0e0c00020201293c3b220f2c6b22203b3c1ab8020e0c000450293469312a69293b1a6c020e0c000303042214020a22142a1a9c020e0c00032228220f452a46220d472715023f040300322a22152215221522152215221522151a44020e0c000a5029352a362b372d2f1a68020e0c00033b3b34220e2d6805292d69221a2f452a462d47270727080fd32a353e1a01020e0e0c0003039a2a360402002a2a1a38020e0c00035029352a36293b1ae2010e0e0e0c000303032a020b2a2a1a1e020e0e0e0c000329221022101a14020e0c00042a2a220d221022131a09020e0e0c0006040300312a22142214221422142214221422141aaa010e0e0e0c000a5029352a362b373e2e691adf010c00022b3b1a7f010c0003030329020b292c1ace010e0e0e0c000322182e452a462c47270d0fd42a353d1a5a010e0e0e0c000303842a360403002a332b220d0e0c00045029352a362b372b35280b1a3601020206010e0e0e0c0003030a22102c452b462a47024e0403002f2a22122212221222122212221222121a1a010e0e0e0c000a5029352a362b373d3069292c69293b1af2000e0e0e0c0003030330020b302a1a42010e0e0e0c000322172f452a462d472707270502a22a372b380403002a342b220e0e0e0e0c00045029352a362b372b2b2b6a2c35280b1aaa000e0e0e0c0003030a22122d452c462b47026a0402002a22102b1af20002025e000e0e0e0c00045029352a36322b6922140e0e0e0c0002040300220c2a22182218221822182218221822181a6d000e0e0c000a5029352a362b372a3b1a4c000e0c000303032e020b2e2b1aa6000e0e0e0c0003221b2d452a462b472709270765020d2b2f34322e0e0e0e7b050b00041f090e0e00000000ac04000000000000|@3691,I105,I218,I251,@855,I113,@3692,@3687,I234,@3695,I240,I104,I252,I245,I243,I106,@3698,@2464,I255,@3701,@3499,@3703,@3705,@3707,@3709,@3712,@3728,@3730,@3474,@3690| 3690:O1|@3732 3691:S46|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229636f707944656373283129 3692:O4|@35,@863,@3694,@3693 3693:O5|@3425,394,0,394,0 3694:S32|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e6572 3695:O4|@35,@863,@3697,@3696 3696:O5|@2410,247,0,247,0 3697:S27|6d6b4c6f616478783a20617267756d656e74206e65676174697665 3698:O4|@35,@863,@3700,@3699 3699:O5|@3425,404,0,404,0 3700:S37|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e65722073697a65 3701:O1|@3702 3702:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3701| 3703:O1|@3704 3704:D6,108|00812c1a6a000e0e0e0c00021a65000e0e0c0002033e2c352d362a37293a293b1a55000e0e0c00030402002d2a1a4c000e0c00035029352a362c030b302b69342a452b46640209302a69342c452a46642708020b1a29002c2a35452a36466443000000006400000000000000|@1991,I105,I218,I251,@3703,@1990| 3705:O1|@3706 3706:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3705| 3707:O1|@3708 3708:D5,92|00822d1a5a000e0e0e0c00021a55000e0e0c000203352d352e362a363b300e0e0e0c00023d2a693c2a69291a3a00692d2a6966300e0c0002502b31311a2d000e0e0c00042a2a69270502013b440e0e0e000000005400000000000000|@1785,I105,I218,@855,@3707| 3709:O1|@3710 3710:D4,148|00842f1a92000e0e0e0c00021a8d000e0e0c000203142e1a7e000e0e0e0c00021a79000e0e0c000202013b03562f353036303531362c362d372a68012d68010402002c220d2d2d2d22120e0e0e0c00065029352a363d32693c2a69292c69322a6966220e0e0c00023b332d6a34332213221322131a29000e0e0c00062a2a69270e02013b1f050e0e000000008c00000000000000|@3711,I105,I218,@3709| 3711:S17|4c697374506169722e6d61702833292829 3712:O1|@3713 3713:D18,436|00802b353e1ab0010e0c000307d22b36291aa8010e0c00021aa5010e0e0c000203043b5002041a9b011029352936292a690402002d2b2a1a82010e0e0e0c00021a7d010e0e0c000203412a352b362a362c352d362b2b1a6f010c000303032b02012a2c3c1a65010e0e0c0003292c1a5f010c000303032902012b2b2a69302a250b250b26091e4f26090209292c2a35452a3646515129352a36292b1a36010e0e0e0c0003293b1a1f010c000303033c020b291a23011a24010e0c000303041a1f01103b50293c1a03010c00032928403b1a11010e0e0c0004293b2d1a0a010202c2000e0e0e0c000450321aff002a1acb000c00021ac9000e0e0c000203742a352b362a3629331acb000c0003293b1ab7000c000303033c02142f3b1ad2000e0e0e0c00032a2a1ab3000c00036403041ac200103b50293c1a92000e0e0e0c0003302a1aab000c0003293b1a6b000c000303102e30220e3422151a9c000e0c000602012f2e2a2509250926071e7e3b27070202293765293b2a1a41000e0e0c00021a3d000e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129270d02032b3b694200000000ac01000000000000|@3715,I251,I105,I218,@2229,I234,I106,I233,I107,16777214,I231,@1868,I11,I255,@3716,I253,@1850,@3714| 3714:O1|@3717 3715:S48|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e6773283129 3716:O3|0,0,0 3717:D17,420|00842f3630372938313532363337220c2b692f220c1a90010e0c00032d2e692968012b3b1a85010e0e0c000303033c0214220d3b1a79010e0e0c00032c2a1a73010c00036403041a6e01103b502b3c1a6a010e0e0e0c0003220e2a2c1a61010e0e0c0004313c1a53010c00032930326a040300220c2b2a1a4a010e0e0e0c00021a45010e0e0c000203282a352b362a2c2217221a221a22171a31011a32010e0e0e0c00082a2a2505250526031e362603020c292c2a35452a36462a3747515129352a362b37333b1ae2000e0e0e0c000303033c021422153b1ad5000e0e0c0003342a1acf000c00036403041ae600103b50333c1ac6000e0e0e0c000322162a1aae000e0e0e0c0003293b1acb000c000303041ac700103b50293529362922131abe000e0e0e0c00032704035f0402002b3b2a1a8f000c00021a8d000e0e0c000203043b5002041a9b00102a352b362a362922181a8a000e0e0e0c0003030b2b2d692f2c452a4651020e2b2d692b2a2506250626041e4350260529352a363e2a69292e69302d2b6a270502042b2b2b6a27121f050e0e0e0e0e000000009c01000000000000|@3719,I107,I234,I253,I231,@1879,I106,I255,I105,I218,@3714,@3720,@1850,I251,@2309,I113,@3718| 3718:O4|@35,@863,@3727,@3726 3719:S66|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e74283229 3720:O1|@3721 3721:D15,540|008631353d1a18020e0c000307cd3136313631291a0d020e0e0c00021a09020e0e0c0002031e29352a362a362e2a1afb010c00036403033c0207292503511e2b3b6502013b6407cb2a311ae3010c0003293b1adf010c000303033c0214303b1ad6010e0e0e0c00032a2a1acf010c00036403041aca01103b50293c1ac6010e0e0e0c0003312a1aaf010c0003291a94010e0c00021a91010e0e0c000203a82c291a81010e0e0c00021a7d010e0e0c0002031e29352a362a36312a1a6f010c00036403033c0207292503511e2b3b6502013b64036c2b3b1a5b0102022e010c000303033c0214323b1a4e010e0e0e0c00032c2a1a47010c00036403041a4201103b502b3c1a3e010e0e0e0c0003332a1a27010202f2000c0003293b1a03010c000303041a2301103b5029352935220c2a221022101a16010e0e0e0c0005260502023b50220c02be34291ad9000e0e0c00021ad5000e0e0c0002032029352a362a3629321ac7000c00036403052a68010207292503511e2d3b6502013b64293b1a9f000c000303041ac700103b50293529220f220e220e2211220e0c00062e3b1a93000c000303033c0214220c3b1a89000e0e0c00032f2a1a83000c00036403041a7e00103b502e3c1a7a000e0e0e0c0003220d2a1a62000e0e0e0c0003293b1a3f000c000303041a6b00103b5029352936220f2a221322131a52000e0e0e0c0005502d270766020132650201301f070e0e000000001402000000000000|@3723,I251,I105,I218,I113,I107,I234,I253,I231,@1850,I106,@2309,@3722,@2309,@2309| 3722:O1|@3724 3723:S80|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e7428322970726f636573734c696e6b283229 3724:D11,196|00832e2d1ac1000e0e0c0003293b1abb000c000303033c02142c3b1ab2000e0e0e0c00032a2a1aab000c00036403041aa600103b50293c1aa2000e0e0e0c00032d2a1a8b000c0003293b1a93000c000303041a8f00103b50293529352a3629341a69000e0e0c00030303290201332b2a69296801313b1a53000c000303033c0214343b1a4a000e0e0e0c0003322a1a43000c00036403041a4e00103b50313c1a3a000e0e0e0c0003220c2a2c1a3d00220f0e0e7b0510000400000000bc00000000000000|@3725,I107,I234,I253,I231,@1850,I106,I251,@2309,@1879,I255| 3725:S60|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297570646174654d696e283229 3726:O5|@2410,430,0,430,0 3727:S11|737461636b20656d707479 3728:O1|@3729 3729:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3728| 3730:O1|@3731 3731:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3730| 3732:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3690| 3733:D29,916|00842e2e2e2e6b30350a0e00920093021e00bf0233031e00a001eb021e001e000a031e002501210067023b0fda3036313732381a62032e3434343468062b2a1a5a030e0e0e0c000329353d1a52030e0e0e0c0003033a2936291a48030e0c00020320291a3e030e0e0e0c000203043b5002041a330310292f1a25030e0e0c000302013b03051a240302031a230364020a280d2e2b2e6b2968016427050fdc30363137303b1a0d030e0e0c00032a1a08030e0c0002292d1a03030c00031a010330220d220d220d220d68062a2a1acd020e0e0c0003291aec020e0c00021ae9020e0e0c000203052968010242220c3b2f1ada020e0e0e0c0004502e34220f34221022101acb02020278020c00071ac5023322102210221022106806312a1a7d020e0e0c00033b2a2d6a296801270427070fdc3036313732381a9e022e3434343468062a2a1a56020e0e0e0c00030403002e302b56a70e0c00045029352a362b3729353d1a3b020c0003032d29362a371a6b022a692b2a1a6802020205020e0c0003280e2a3b6a322a31220f1a57020c0005296801270602112d2c2c331a46020e0e0e0c00052968016427090fd63036313732380403000403002d2f2b56970c00045029352a362b3729353d1ad3010c000303382937302a0e0e0e0c000229352a362a353b1aba010e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964322a4530462b47260602502e0202720103212b353d1a89010e0e0c0003030c2b303c1ac4010e0c0004020628062c313c6b021e2b353d1a68010e0c0003030c2b303b1aa4010e0c0004020628062c313b6b2e2a452c461a940147512d352e362f372a2c2b1a8a010e0e0e0c0004296801270c0fd2303631370403002b2b2e2c56880202fd000e0c00055029352a362b372a2c2b1a5f010c000429680127070fd83036313732380403002c2c2c302d56a90e0e0c00065029352a362b372a2c2b1a37010c0004296801270802b63036313732380403002b2d2c302d56aa0e0e0c00065029352a362b372a2c2b1a0f010c00042968012708028a30360402002a2c3b3b2d568b0e0e0c000650293528072a692968012704026b303631372a2a690403002a2e2b568c0c00045029352a362b372a2c2b1acb000c0004296801270802423036292f02023a000e0e0c000229352a362a353b1a4a000e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a69643b2a2c1a8f00020208000c00042968012706641f050e0e0e0e000000008c03000000000000|@3735,@3736,@3434,I251,I105,@3062,@3737,@3738,I253,@3739,@3499,@3741,@3742,I218,I255,@3745,@3748,@3749,@3750,@2047,@3752,@2403,@855,@3787,@3791,@3795,@3799,@3803,@3734| 3734:O1|@3807 3735:S36|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283529 3736:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3737:O1|@742 3738:O1|@809 3739:O1|@3740 3740:D4,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203212b352c362a3529352a362b373c2c2c2c6b2e1a2d000e0e0c00022a2a69270802013b420e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@3739| 3741:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3742:O1|@3743 3743:D3,156|00802b35280c1a97000c0003030e2b36291a90002d0e0e0e7d0400022b3528051a7d000e0e0c0003030e2b37291a74002d0e0e0e7d0400022b353c1a62000e0e0e0c000303212b372c382a1a56000e0e0e0c000203033c020b291a47002e0e0e7d0500026502252b35401a33000c0003030e2b37291a2c002d0e0e0e7d0400022b3528091a19002d7e030003420e0e0e000000009400000000000000|@3744,I251,@3742| 3744:S46|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c2835296861734c6f6f70283129 3745:O1|@3746 3746:D7,140|0085301a8a000e0e0e0c00021a85000e0e0c00020361303531362a352b362a352b362c373b220e0e0e0c00023d2a693c2a69291a6200692e2a6966220e0c0002501a5800220d220f220e220e221368062b2a1a4b000c00032e2c2b6a29316933221322132213221322131a37000c00072a2a69270d02013b1f060e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,@855,@3747,@3434,@3745| 3747:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3748:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3749:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@3433| 3750:D2,60|00802b56170c0002293529353b1a30000e0c0003030b29362a373d2b2b6a65020629363f2a696465420e0e0e0e0e0e0e000000003400000000000000|@3751,I251| 3751:S7|6f283229283129 3752:O1|@3753 3753:D25,988|00832d3528051ad7030c0003032a2d362e37302b3b301acb030c0005312b3b311ac1030e0e0c000528052b2b6a312a1ab603320e7e0b00032d3528091aa1030e0e0c0003030a2c2e1a9d032d7e0600032d353b1a8a030e0e0e0c0003031e2d362e37302b3b301a7b030c00053b2a2c6a302a1a7303310e0e7e0a00032d35401a5e030e0e0e0c0003032e2d362e372a3b1a4d030e0e0c000303032e020b2e2b1a4a030e0e0e0c0003312b2b311a3503320e0e0e7b060900052d353c1a22030e0e0e0c0003032e2d362e372f38312b3b311a11030e0e0c0005322b3b321a05030e0e0c00053c2e2c2c6b322a1afa02330e7e0c00032d35280e1ae5020e0e0c000307da2d363b2a2e1ae6020e0e0e0c00043b2a301ade020e0e0e0c0004293b1abf020c000303a6280e2b3b6a2b291ac8020e0c00021ac5020e0e0c0002031d29352a362a353d1a98020e0c00030309292503511e263b02013b6502013c64030b291a9d020e0e0c00020201293b2d291a87020c00021a85020e0e0c0002031729362b3c1a7f020c0003292b25042504511e223b6502012a650402002a1a6a022b1a6a020e0e0e0c00045029352a36291a5f020c0002502a2a69280c2f2b22126b220e2a1a2302220f0e7e110003293529352a360402002a2a1a3a020202da010e0e0e0c00035029352a362a2a692e353d1aee010e0e0e0c000307d12e363c3b292f1a15020e0e0c000303032a025f293c1a0a020e0e0e0c00030402002b28082b1afe010e0e0e0c00045029352a36312b1af2010e0e0e0c00033c2b1aeb010c00032a2a1ae7010c0003293b1a93010c0003641aa8010e0c00022903033102013b2931250a250a26081e693b270865220f3b2a1a84010e0c00021a81010e0e0c000203152a352b362a2c692a2a2505250526031e213b660201296529291a5a010e0e0e0c00021a55010e0e0c0002038b29352a362a353b1a28010e0c000303362a372b382c39312c1a67010202d3000c000303122a220c1a58010e0c000303033002013b02013b0309292d692968016402013b6602422a353c1ae6000e0e0e0c000303332a38291a2c010e0c0002291a28011a19010e0e0c0003291a1c011ac1000e0e0c000365030a2a250426031e923b02013b6402013b6502013b64293b1aa0000e0c000303163f3369280c2a3022176b22132a1a920022147e160003293529352a363c3b3122196b292b69293b2a1a87000c00021a85000e0e0c000203152a352b362a2c692a2a2505250526031e203b6602012965292e1a4e0022187e1a00033f2f69280c2a2c22136b220f2a1a380022100e0e7e1200032d2c301a7e000e0e0e0c00042d2a1a1f002e0e0e7e07000300000000d403000000000000|@3755,I251,@3752,@3499,@3756,@3758,@3764,I105,I218,@2464,I106,@3767,@3770,I47,@3778,I247,I239,I104,I252,I245,I243,I113,@3677,-536870912,@3754| 3754:O1|@3785 3755:S45|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429 3756:O1|@3757 3757:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3756| 3758:O1|@3759 3759:D12,212|00822c3b1ad1000e0e0c000303033b02b02c352d362d35302a1ac0000e0c00036403033b029a2d352e36313b1ab1000e0e0c000303033c020b312b1a9e000e0e0e0c000303041a9b00103b500402003228082b1a92000e0e0e0c00045029352a362c2b1a86000e0e0e0c00033c2b1a7f000c00032a2a1a7b000c0003293b1a57000c0003641a70000e0c00022707031a2f3c1a67000c0003292b301a62000e0e0e0c00042c2a696502162f3c1a4d000e0e0c0003292b301a4600317b0508000465440e0e0e0e0e0e00000000cc00000000000000|@3761,I251,I231,I234,@3760,I104,I252,I245,I243,I218,I106,@3758| 3760:O4|11,@316,0,@3762 3761:S54|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e657228342973656c656374283229 3762:O5|@3763,212,0,212,0 3763:S21|2e2f62617369732f426f6f6c41727261792e736d6c 3764:O1|@3765 3765:D8,556|00822c3b1a29020e0e0c000303032d0fdd2c352d362a353f1a15020e0e0c000303112a3629353d1a06020e0e0e0c00036402013b07d62a3629362f291af5010e0e0c00021af1010e0e0c0002032f29352a362a353c1ad8010e0c0003030d2a37292e1ad7010c00036402013b03052a68010207292503511e3c3b6502013b64291ab1010e0e0c00021aad010e0e0c00020348293529353c1a96010e0e0e0c000303342938293528061a85010e0e0c0003032029362a382a353f1a74010e0c0003030c293b1a69010e0e0c000302013b6502013b6402013b6402013b07d62935293829362a372a36220e1a480102022e010e0c00021a41010e0e0c000207d5220e3529352a362a2d1a260102020e010e0e0e0c000303033c02922a353b1a11010e0e0c0003031b2c353b1a04010e0c0003030c2a362d361a03010c000302013b026a2a353c1ae9000e0e0c0003031b2c353c1adc000e0c0003030c2a362d361adb000c000302013b02422a353d1ac1000e0e0c0003031b2c353d1ab4000e0c0003030c2a362d361ab3000c000302013b021a2a353e1a99000e0e0c0003030c2c353e1a8c000e0c000302013b032e291a8300020263000c00021a7d000e0e0c000203043b5002041a77001029352e2a1a7300020227000c00036402013b031a2d2a692d2a6929680129220f22141a590022150e0e7b051500043b6602182a3b692a2a6929680129220c22111a3b0022127b05120004270502013b6602013b65440e000000002402000000000000|@3766,I251,I105,I218,I113,@2229,I233,@3764| 3766:S59|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429636865636b4669656c6473283229 3767:O1|@3768 3768:D1,20|00803c420e0e0e0e000000000c00000000000000|@3769| 3769:S48|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429283129 3770:O2|@3772,@3771 3771:B4|ffffff7f 3772:D15,292|00822d3b1a21010e0e0c000303043b5002041a1701103b502d3b1a13010c000303033c023c2d3b1a0a010e0e0e0c000303033c020b2d56171afd000e0e0c000303041af700103b503b502d281f1af0000e0c00032928201aea000e0e0e0c0003642928413b1ae0000e0c00043b3c3b3b29341abf000c0003037629330e0c0002030c2b2d1ac5000e0e0c000302012c2c28801abb000c000303312e2c2b1ab4000e0c0004502a3c1a96000e0e0e0c00032c3c1aa3000c00033b3c2b2d250725072507250726031e565102222a3c1a70000e0c00032d3c1a83000c00032b2a2f2d250725072507250726031e7a515002192c3b1a5b000c000303043b50020b2d2b2e1a50000e0c00045026042d30452a4665440e0e0e0e0e0e000000001c01000000000000|@3774,I231,@3775,I113,I234,I233,@3773,I106,I109,I11,I242,I251,I254,I239,I245| 3773:O4|4,@394,0,@3777 3774:S12|746162756c61746527283229 3775:O4|4,@394,0,@3776 3776:O5|@3763,114,0,114,0 3777:O5|@3763,64,0,64,0 3778:O1|@3779 3779:D22,340|00812c1a52012a1a52010e0e0e0c00021a4d010e0e0c000203222a352b362a2c1a41010e0e0c000303032a02012b2a2a2505250526031e303b6602012965293c1a25010e0e0c0003293b1a1f010c000303033c023c293b1a16010e0e0e0c000303033c020b291a0b011af8000e0c000303041a0301103b5029281f1aea000e0e0e0c00032928201af2000e0e0e0c0003642928413b1ae8000e0c000430291abb000c00021ab9000e0e0c0002036f29352a362a3b1ab9000e0e0c000303033c020b2a2f1abe000e0e0e0c000303041ab700103b500402002b28082b1aae000e0e0e0c00045029352a362f2b1aa2000e0e0e0c00033c2b1a9b000c00032a2a1a97000c0003322e2b1a92000e0e0e0c0004502f250926081e793b270802013b641a7e002b690402002e2b2b1a77000c0004502936291a71000e0e0c0002502a342a35452a3646270943000000004c01000000000000|@3781,-1,I105,I218,I233,I106,I113,I234,@3771,@3773,I109,I11,I231,@3782,I104,I252,I245,I242,I254,@3780,@3770,I47| 3780:D7,84|00800402002c28082b1a4c000e0c00045029352a3656372b1a41000e0e0c00033c2b1a3b000c00032a2a1a37000c0003293b1a33000c0003641a3000310e0e0e7d0800020e0e0e0e000000004c00000000000000|@3784,I104,I252,I245,I243,I251,I218| 3781:S62|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e65722834296669656c6473546f46696c746572283129 3782:O4|11,@316,0,@3783 3783:O5|@3763,417,0,417,0 3784:S22|426f6f6c41727261792e766563746f72283129283129 3785:D3,172|00822d3528051aa7000c000303232d362e372a2f2f1a9c000e0c00042a30301a92000e0e0e0c000428052b2b6a2704026a2d35280b1a78000e0c000303032d025a2d35401a69000e0e0c000303152d362e37292f2f1a5c000e0c0004402c2b6a6602382d353c1a47000c000303272d362e372f382a30301a3a000e0e0e0c00042a31311a2e000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e00000000a400000000000000|@3786,I251,@3754| 3786:S40|434f4445545245455f46554e4354494f4e5328292e6d6b536574436f6e7461696e65722833292829 3787:O1|@3788 3788:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3789,@3787,@3499| 3789:O1|@3790 3790:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3789| 3791:O1|@3792 3792:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3793,@3791,@3499| 3793:O1|@3794 3794:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3793| 3795:O1|@3796 3796:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3797,@3795,@3499| 3797:O1|@3798 3798:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3797| 3799:O1|@3800 3800:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3801,@3799,@3499| 3801:O1|@3802 3802:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3801| 3803:O1|@3804 3804:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3805,@3803,@3499| 3805:O1|@3806 3806:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3805| 3807:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3808,@3734,@3499| 3808:O1|@3809 3809:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3808| 3810:O1|@3811 3811:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 3812:O1|@3813 3813:D5,92|00822d3b1a59000e0e0c000303242c353d1a4c000e0c000303152c362d37292e1a41000e0e0c00033d2c2b6a6602012c02163b2d2d1a30000e0c00042e2a1a2b002e0e0e7e060003440e0e0e0e0e0e0e000000005400000000000000|@3500,I251,@3814,@3812,@3499| 3814:O1|@3815 3815:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@3814| 3816:O2|3,@3817 3817:S20|4f7574707574206f662073696d706c6966696572 3818:O1|@3819 3819:D2,20|00811a1300100e0e000000000c00000000000000|@3612,@3820| 3820:O4|@35,@863,@3822,@3821 3821:O5|@3823,1459,0,1459,0 3822:S30|746f70206c6576656c207265616368656420696e206f7074696d69736572 3823:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4f5054494d495345522e736d6c 3824:O1|@3825 3825:D1,20|00803b420e0e0e0e000000000c00000000000000|@3615| 3826:O1|@3827 3827:D1,20|00813b430e0e0e0e000000000c00000000000000|@3612| 3828:O2|3,@3829 3829:S17|4f7574707574206f6620636c65616e6572 3830:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003293c1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@3831,I253,I106,I255| 3831:S66|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f63657373547265652833296d616b6541646472283129 3832:D3,36|00802b56171a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@3834,@922,@3833| 3833:O3|@3836,@3875,@3835 3834:S35|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283129283129 3835:O2|@3898,@3833 3836:D18,716|00822d353b1ac8020e0c000303472b291ac1020e0e0c00021abd020e0e0c0002031d29352a362a353d1aa4020e0c00030309292503511e273b02013b6502013c64030f2d2d2d56370e0c00042968016402013b0fdd2d353c1a75020e0e0c000303472b291a6d020e0e0c00021a69020e0e0c0002031d29352a362a353d1a50020e0c00030309292503511e273b02013b6502013c64030f2d2d2d56370e0c00042968016402013b0fcf2d3528061a20020e0c000303372d362e372f38293b1a0f020c000303233d2b306a293b691a0c022f332c6b2e2a1a07020c000328062a303b6b296801270502013b660fd22d353e1add010e0e0c000307d72d362e372f382a353c1aca010e0e0e0c000303522a362b372c383237293b3c1ac8010e0c0004501ac40131220c220c6b3e312e316b29020286012b1aa8010e0c00031aad0134220f220f6b3e3430346b292b1a91010e0e0c00033c332e2c6b296801270b02be2a3528071a69010e0e0c0003037b2a362c2e321a7a01020240010e0e0e0c0004291a70010e0c00023b322b6a293b69040200220c2b303b2d56e80e0e0e0c00065029352a363e302b346b2b3b1a21010e0e0c000303032902292b1a3b010202f9000c00023e2a69293b69293b1a010102024e000e0e0c000303032c0204402a2e6a66296801270a02352b2d311a0d010e0e0c0004291a08010e0c00023b312b6a293b691afe0031220c2c6b2f2a1ad0000e0c00033e2f2b326b29680127076602992d35401aa9000e0e0c0003032d2d362e372a2c3056581ace000e0e0e0c00051ac9002d31316b2b2a1a94000e0c0003402c2b6a2968012706025f2d3528071a6e000e0e0e0c0003034f2d360402002e2e2c3c2d56780e0e0e0c00065029352a362a3b1a4a000e0e0e0c000303032902212a1a7b000c00023e2a69293b69293b1a2d000e0e0c000303032c0204402a2e6a66296801270502013b440e0e0e0e0e00000000c402000000000000|@3838,I251,I105,I218,@3839,@3434,I255,@3840,@3841,@3842,@3845,@3847,@3849,@3852,@3854,@3855,@3873,@3837| 3837:O1|@3874 3838:S32|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283329 3839:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3840:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3841:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3842:O1|@3843 3843:D6,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a352b361a3f0031316a2b2a1a3b000c0003292c692e34341a33000c00042a2a69270802013b440e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@3844,@3434,@3842| 3844:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3845:O1|@3846 3846:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3845| 3847:O1|@3848 3848:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@3847| 3849:O1|@3850 3850:D6,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e362a352b361a3f0031316a2b2a1a3b000c0003292c692e34341a33000c00042a2a69270802013b440e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@3851,@3434,@3849| 3851:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3852:O1|@3853 3853:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@3852| 3854:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3855:O1|@3856 3856:D5,76|00832e1a4a000e0e0e0c00021a45000e0e0c000203212e352f362a3030301a37000c00052a3131311a31000e0e0c00052a2a69270402013b1f040e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@3857,@3855| 3857:O1|@3858 3858:D9,204|00832e353b1ac8000e0c000303212e362f37303831391abb0032326a2a2a1ab7000c00033b2f2f2f2d6805270602882e353d1a9b000c000303182e361a9d002f2f6a2a2a1a91000e0e0c00033d2a696602652e353e1a78000e0c0003033c2e36293b2a1a7a000e0e0e0c00021a75000e0e0c0002031c2a352b362a2c32341a67000c00052a2a2505250526031e2a3b66020129653e2a6965021d2e362f3730381a490031312e6b2a2a1a2c000e0c00033c2e2e2c6b27051f040e0e0e0e0e0e0e00000000c400000000000000|@3860,I251,@3861,@3434,@3862,I105,I218,@3863,@3859| 3859:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3860:S45|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e67283129 3861:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3862:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3863:O1|@3864 3864:D5,116|00832e352f3630370402002f2d2c3d2d220c0e0e0e0c00065029352a36293528071a54000e0c000303043b5002041a4b001029362f2f2b6a2c311a43000c0003220d3b1a32000e0e0e0c0003030329020b29220e1a2d000e0e0c00032b2a69270a1f040e0e0e0e0e000000006c00000000000000|@3866,I251,@3867,@3870,@3865| 3865:O1|@3872 3866:S57|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e672831296d6170526563446563283229 3867:O4|@35,@863,@3869,@3868 3868:O5|@3823,945,0,945,0 3869:S22|6d617062696e64696e673a206e6f74206c616d626461 3870:O1|@3871 3871:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a352b362f2b2b6a2c311a29000e0e0c00032a2a69270602013b430e0e0e000000003c00000000000000|@1785,I105,I218,@3870| 3872:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3865| 3873:D1,28|00802b5618562956372e0e7b05030004000000001400000000000000|@3834| 3874:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@3837| 3875:O2|@3876,@3833 3876:D32,764|00822c352d372d3b2a1af4020e0c00021af1020e0e0c000203322a352b362a353d1ae4020e0c000303132a36292d1adb020c000303032902012c6402012b2a2a2505250526031e3e3b6602012965293c1abd020e0e0c0003293b1ab7020c000303033c023c293b1aae020e0e0e0c000303033c020b291aa3021a90020e0c000303041a9b02103b5029281f1a82020e0e0e0c00032928201a8a020e0e0e0c0003642928413b1a80020e0c000431291a4f020c00021a4d020e0e0c0002037e29352a362a353d1a40020e0c000303622a36293b1a43020c000303033c020b29301a4a020e0e0e0c000303041a4302103b500402002a28082b1a3a020e0e0e0c00045029352a36302b1a2e020e0e0e0c00033c2b1a27020c00032a2a1a23020c0003332e2b1a1e020e0e0e0c0004260802023b50292503511e893b6502013b643b2d293b1ac3010c000303032a0278293c1af6010e0e0e0c00032a3c1aeb010c00032b3c1ae3010c00030402002a28082b1ac2010e0e0e0c00045029352a36322b1ab6010e0e0e0c00033c2b1aaf010c00032a2a1ab7010c0003293b1a6b010c0003641a60010e0c0002293c1a5b010c000303053034690201332933250c250c260a1e803b270a652f3b3c1a84010e0c000450291a2b010c00021a29010e0e0c0002030d2936293b1a1f010c00036402013b034329351a5d012a69220e2a1a59010e0e0c00031a550156c722106a2a2a1a4f010c00031a4d012a2f6a2e3c1af1000e0e0c0003292b1a3f010c0003280e2a3b6a270802b63b310e0e0c00023b2b291abe000e0e0e0c00021ab9000e0e0c0002031729362b3c1ab7000c0003292b25042504511e253b6502012a653d2b693f2a691af8002a2f6a22112a1adb000c00031aed0056f722136a2a2a1ad3000c00033b3b32322d6805220e3c1a73000c0003312a1a6f000c00036403151ac6003269312a1ab3000c0003280e2a3b6a6502123b3b34311ab1000e0e0c0005280e2a3b6a642a3b69293b1a2e000e0e0e0c000303032a0204402a2c6a270b2708440e0e00000000f402000000000000|@3878,I105,I218,I251,I233,I106,I113,I234,@3771,@3773,I109,I11,I231,@3782,I104,I252,I245,I242,I254,I240,I243,I255,@3879,@3881,@3884,@3434,@3885,@2047,@3887,@3893,@3894,@3877| 3877:O1|@3896 3878:S33|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329 3879:D3,52|00802b353d1a30000e0c0003030e2b56173b1a27002e0e7b0503000428062c56273b6b420e0e0e0e000000002c00000000000000|@3880,I251,@2403| 3880:S42|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296669656c642d283129 3881:O1|@3882 3882:D3,196|00812c3528051abf000c0003031f2c362d372a2e1ab5000e0e0c00032a2f1aab000c000328052b2b6a270402832c3528091a94000e0c000303032c02732c353b1a85000e0e0c000303152c362d372a2e1a79000e0e0c00033b2a2c6a6602512c35401a63000c000303152c362d37292e1a59000e0e0c0003402c2b6a6602312c353c1a43000c0003031f2c362d372e382a2f1a37000c00032a301a2f000c00033c2e2c2c6b270502072c2c2c7d040002430e0e0e0e0e0e0e00000000bc00000000000000|@3883,I251,@3881| 3883:S49|434f4445545245455f4f5054494d4953455228292e6f70744669656c647328332970757368436f6e7461696e6572283229 3884:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3885:D3,36|00802b56181a20000e0c00030304560702031a1700420e0e000000001c00000000000000|@3886,I113,@809| 3886:S44|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296d6b4669656c6473283129 3887:D2,36|008056081a21000e0e0c0002280c2d2b56476b64420e0e0e000000001c00000000000000|@3889,@3888| 3888:O1|@3890 3889:S48|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329736574436f6e7461696e6572283129 3890:D22,340|00802b1a52012a1a52010e0e0e0c00021a4d010e0e0c000203222a352b362a2c1a41010e0e0c000303032a02012b2a2a2505250526031e303b6602012965293c1a25010e0e0c0003293b1a1f010c000303033c023c293b1a16010e0e0e0c000303033c020b291a0b011af8000e0c000303041a0301103b5029281f1aea000e0e0e0c00032928201af2000e0e0e0c0003642928413b1ae8000e0c00042f291abb000c00021ab9000e0e0c0002036f29352a362a3b1ab9000e0e0c000303033c020b2a2f1abe000e0e0e0c000303041ab700103b500402002b28082b1aae000e0e0e0c00045029352a362f2b1aa2000e0e0e0c00033c2b1a9b000c00032a2a1a97000c0003322e2b1a92000e0e0e0c0004502f250926081e793b270802013b641a7e002b690402002e2b2b1a77000c00045029352a36291a6f000c0002502a2a692709420e0e0e0e0e000000004c01000000000000|@3892,-1,I105,I218,I233,I106,I113,I234,@3771,@3773,I109,I11,I231,@3782,I104,I252,I245,I242,I254,@3891,@3770,I47| 3891:D7,84|00800402002c28082b1a4c000e0c00045029352a3656372b1a41000e0e0c00033c2b1a3b000c00032a2a1a37000c0003293b1a33000c0003641a3000310e0e0e7d0800020e0e0e0e000000004c00000000000000|@3784,I104,I252,I245,I243,I251,I218| 3892:S38|434f4445545245455f4f5054494d4953455228292e6669656c6473546f46696c746572283129 3893:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3894:D3,52|008056073b1a30000e0c000303041a2b00103b503d5617693f2a6928062a2f3b6b65420e0e0e0e0e000000002c00000000000000|@3895,I234,@3695| 3895:S47|434f4445545245455f46554e4354494f4e5328292e6d6b5475706c6546726f6d436f6e7461696e6572283229283129 3896:D7,132|00832c1a82000e0e0e0c00021a7d000e0e0c0002035b2c352d36302b1a71000e0e0c0003032928062e313b6b313c1a63000c0003313c1a5b000c00032a2a2e331a55000e0e0c00052c2a692704021f303c1a40000e0c00032b2b692a322b321a36000e0e0e0c00051a31002a69666502013b1f040e0e0e0e000000007c00000000000000|@3897,I105,I218,I113,I106,@3877,@809| 3897:S53|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329636f6e7461696e65722d6d6b4669656c64283329 3898:D39,2572|00842f353036313730353136323733383439220c3a220d2306220e23072e3b1aee090e0e0e0c000303042210020a22102f1ae0090e0c0003220f3d1ad2090e0e0e0c000332353e1ac6090e0e0e0c0003030c293b1ab9090e0e0c000302013b07d73236333734382b3b2a3b1aa2090e0e0e0c000303033c02572a352b362a3529353f1a8b090c00030311293629353b1a7e090e0e0e0c00036402013b64032f2a3529362936292f1a6e090e0e0e0c000303182e3c1a65090e0e0c00032d2a2508250826061e5b3b6402013b6602013b656503722b322a3b1a36090e0e0e0c0003030c293b1a29090e0e0c000302402a352b362b1a2a090e0e0e0c00021a25090e0e0c000203262b352c362c362b352a2a1afd080e0e0c000365030d2b2a2506250626041e4e3b02013b6502013b65650311292f1ada080202a6000e0e0e0c000302013b02013b291ada080e0e0e0c000203033b02872b353f1ab5080e0e0c000303692b3629353c1aa6080e0e0e0c000303552936220c2a2a1aa5080e0e0c00021aa1080e0e0c000203043b5002041a9708102a352b362b3b1a7d080e0e0c000303032a02172b3c1a82080e0e0e0c00032a2a2505250526031e413b6427043f2a692968016602013b6402112b353d1a3f080c000303052b680102013b270402013b293b1a2a080e0e0e0c000307cf2e3b1a1d080e0e0c000303352b291a21080e0e0c00021a1d080e0e0c0002031d29352a362a353c1af8070e0c000303033c0207292503511e2a3b6502013b6402013b03503c28402f1af7070c00041af5072a6929220f220f6a1aee07121300010001002b6a220e2a1ae3070c00032d3b1adf070c00032a221022102210221022102f2210680828072a6922183b452a4627080fca3c28402f1aa7070c00041ab5072a6929220f220f6a1aae07121300010001002b6a220e2a1a93070c00032211291a6e070e0e0e0c00021a6907020232070e0e0c0002032429352a362a35291a7c071a3d070e0e0c00036403052a68010207292503511e363b6502013b64293b1a1f070c0003036d1a5707291a23070c00021a21070e0e0c0002032429352a362a35291a38071af9060e0e0c00036403052a68010207292503511e2f3b6502013b64293b1adb060c000303041a1707103b50293529351a05071ac6060202a1060e0e0e0c000303043b5002041afb0610293765021a293529351ae2061aa3060c000303043b5002041adf06102937643b220e291a9c060e0c00021a99060e0e0c0002031729362b3c1a83060c0003292b25042504511e233b6502012a652a3b1a68060e0c00031a6d060e0e0c0002030c22193b1a4c060e0c000302013b03051be80302012a2d2b2b1a83060c00040403002a353e1a2b060c00030314333b1a51060e0e0c00032a3c4531462a47510fcd2a353c1a0c060e0c000303b92a36291a50060e0c00023b292b1a4a060e0e0e0c000303033b02222b2a1a16060e0e0e0c0003290305296801020e2a3c1a2b060c00032502501e2e3b6464293b1ac3050c00031ad1050e0e0c00026503543b2214291abe050e0e0e0c00021ab9050e0e0c0002031729362b3c1aa3050c0003292b25042504511e253b6502012a65220c3b1aaf050c00033222152d2d221b22162f1acb050c00082d3b452a463b4726040211343b1a8c050e0c00032b3c4532462a47515002452a353d1a470502023b000c000303252a363022132b220e1a93050c0005220c3b1a5a050e0e0e0c00032c3b452b462a4726040211333b1a44050e0c00032a3b4531462a475129352a362b372a2218221822182218302f2218680804020022153c1aea040e0e0e0c000307db22123c1a40050e0c000329353b1ad2040e0e0e0c0003032d2936291ad4040e0c00021ad1040e0e0c000203152936291ac0040e0c00021abd040e0e0c00026402013b6402013b035329362a372a352b3629352a36333528071a87040c0003032d2a3b692d2a692b1a88040e0c00021a85040e0e0c00021a7d040e0e0c000203032f02031ac4043b2b2b6a66020a2c3b693b2a1ab5046a64270602012922181aad040e0e0c00020402002b353b1a33040c000303152b36291a38040e0c00021a35040e0e0c00026402013b07cc2b362c372a3622193b2a1a1904020256030e0e0c00021a11040e0e0c0002032f2a352b362a353b1aec030e0c000303102a37291a50040e0c0002292e696502012b2a2a2505250526031e403b660201296529291ad0030e0c00021acd030e0e0c000203043b5002041a1f041029352a36291ab2030e0e0e0c00021aad030e0e0c0002031c29352a362c2b1a01040e0e0c0003292b6964250526041e483b6502012a6629301aeb030c0003292d69220e1ae4030e0c000229353d1a5a030e0e0e0c000303102f353c1a4c0302028a000e0c000302013b0377221e293b1a38030e0c000303033b025c29352a362a353b1a25030e0e0c000303432a3629291a27030c00021a25030e0e0c0002031d29352a362a353d1a00030e0c000303033c0207292503511e283b6502013b6403033c02082a250426031e5c3b640207292503511e663b656403032902031a320302012f322c452a46260a02562216291ac8020e0c00021ac5020e0e0c0002031d29352a362a353c1aa0020e0c000303033c0207292503511e293b6502013b6403162a3b69311a02030e0e0e0c00022b2b452a462603020b1af4022a2a35452a36465129352a362a1a70020e0c00021a6d020e0e0c000207d12a352b36291a5a020e0e0e0c00021a55020e0e0c0002031922233b3c1abb020c000450322226331ab4020e0c0004500fdc2b353d1a1b020c000303212b3622243b3c1a95020e0e0c000450332a2228220c1a8e020e0e0e0c0005510fd02a291a00020e0c00021afd010e0e0c000203d529352a362a353b1ad8010e0c000303982a362b372a1ada010e0e0e0c00021ad5010e0e0c0002037c2a352b36293b1ab1010e0e0c0003031c2b353d1aa4010e0c0003030d2b37293b1a97010c00036402013b02013b03033c02472a291a930102029b000c00021a8d010e0e0c0002032f29352a362a353d1a68010e0c0003030d2a37293b1a5b010c00036402013b03033c0207292503511e3c3b6502035c003b646502013b65021e2a353d1a34010e0c000303112a37293b1a270102023c000c00036402013b03033c0207292503511ee13b6502013b64031c22233b3c1a8a010e0e0e0c000450322b2227341a87010c00055002063133453b465051023129353d1ade000e0e0e0c0003031d293622223b3c1a55010e0e0c000450312a2226331a4f010c00055102062f31453b465026060206292b453b465029352a362a3a293b1a9e000e0e0e0c000364035222173c1a8f000c0003034422141a95000e0e0c00021a91000e0e0c000203242214352215362a353c1a6a000e0e0e0c0003030c293b1a5d000e0e0c000302013b6502013b1a62000e0e0e0c000202013b02013b0311221d3b3c1ac1000e0e0c0004503b5002023b5028072b6922232b452a4627130209293522113b452a4664270e1f050e0e00000000040a000000000000|@3900,I251,@3901,I113,I106,I105,I218,@878,I107,I11,@3903,@3905,@3434,I253,@3906,@3907,@91,@2900,@2955,@1840,@3908,I15,I247,I239,@3914,@3950,@3958,@855,@3983,@3985,@3989,@3991,@3993,@3995,@4001,I255,@4002,@4029,@3899| 3899:O1|@4057 3900:S33|434f4445545245455f4f5054494d4953455228292e6f70744c616d626461283429 3901:O1|@3902 3902:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3901| 3903:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003293c1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@3904,I253,I106,I255| 3904:S47|434f4445545245455f4f5054494d4953455228292e6f70744c616d6264612834296f7074436f6e746578742d283129 3905:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3906:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003293c1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@3904,I253,I106,I255| 3907:D2,28|00802b56181a180056372e7b05030004000000001400000000000000|@3834,@845| 3908:O1|@3909 3909:D17,308|00823c28403b1a2f010c00043c28403c1a25010e0e0c00042e3b1a1f010c000303033c020b2e1a17011a18010e0c000303041a1301103b502e3c1a0f010c00032928403c1af1000e0e0c0004293b321afe000e0e0e0c00045031303c3c2d31311af1000e0e0c0008293b1aeb000c000303051ae70002a82d3b1ae4000e0c00031ae1000e0e0c000203051adb0002902c3b1acc000e0c000303432a3b1ac1000e0e0c0003293b1aaf000c000303051abb0002242928403b1a7e000e0e0e0c00042c3c2b3b2e1aa8000e0c000650291aa3000c00025029643d2a696502422a3b1a7e000e0e0e0c0003293b1a6b000c000303051a770002242928403b1a3a000e0e0e0c00042c3c2b3b2e1a64000e0c000650291a5f000c00025029643c2a69652705440e0e0e0e0e0e000000002c01000000000000|@3911,I11,I234,16777214,I231,@1868,I106,I255,@3910,I113,@844,I253,I218,@1965,I49,I195,I47| 3910:O1|@3912 3911:S40|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329 3912:D13,1812|0086303b1a11070e0e0c000303033b0fdb31350a0e00f5024e03c506b2038a0648025e0685056e02b2021e0085025a0130010a02313632372a332a1ade060e0e0e0c00021ad9060e0e0c000207cb2a352b362a353b1acc060e0c0003032d2a392c3c1ac3060c0003030c2c3c1abd060e0e0c000302013b2a2a3b22102210221022101aab060c00086502962a353d1a93060c000303192a36292d3b220f220f220f220f1a8a060e0e0e0c00086402722a353e1a6f060c0003034d2a36292d2a1a5a060e0e0e0c00021a55060e0e0c000203312a352b362a3728072a69292e3b22152215221522151a4606020214060e0e0e0c00082c2a2507250726051e3e3b270502012966021a2a38292d3b220f220f220f220f1a1906020214000e0e0c0008642a2a2505250526031eef3b66020129652a2a34343434341af505220c0e0e7b090c00080fd03137313c1adb050c0003030c313c1ad5050e0e0c000302013b2a2a3b333333331ac705340e7b090b00083136323733382b35280e1aa7050c000303562b3629220c2a1a91050e0e0c00021a8d050e0e0c000203242a352b362a2c3b22102210221022101a84050e0c00082a2a2505250526031e313b66020129652b2a3b220d220d220d220d1a6205220e0e0e0e7b090e00082a35342a1a49050e0e0c0003030c342a1a41050e0e0c000302013b2d2a3b220d220d220d220d1a2f050c00082c2a3b220e220e220e220e1a1e05220f0202ea040e0e0e7b090f0008313629322a1af4040e0c00021af1040e0e0c000203242a352b362a2c3b220d220d220d220d1ae8040e0c00082a2a2505250526031e303b66020129660fdc31363237293333333333331ac4040e0c00082b2a3b343434341ab604220c0e0e0e7b090c0008303c1a9f040c0003030a303c1a99042d7e0900033b0fd63136313c1a86040e0e0e0c0003030c313c1a7d040e0e0c000302013b2a2a3b333333331a6f04340e7b090b0008313629322a1a4c040e0c00021a49040e0e0c000203292a352b362a35292d3b220e220e220e220e1a3e040e0e0e0c00082b2a2506250626041e343b2704020129660fd93136323729332a1a07040c00021a05040e0e0c0002032d2a352b362a352937292e3b22102210221022101af8030202c6030e0c00082c2a2507250726051e373b2705020129652b2a3b343434341ad503220c0e0e7b090c0008313632373338333d1ab90302028f030e0e0c0003030c333d1aad030e0e0c000302013b2a2a220c220c220c220c220c1a9a030e0e0e0c00082c2a220d220d220d220d220d1a85030e0e0c00082e2a3b220e220e220e220e1a7203220f0e0e0e7b090f00083136323729353f1a52030e0e0e0c00030324293629353e1a420302021c030e0e0e0c0003030c313c1a31030e0e0c000302013b6402013b07cb2a3b2a1a15030e0e0c00021a11030e0e0c0002039c2a352b362a3529353f1a02030e0e0e0c00030311293629353b1af2020e0e0e0c00036402013b0311293629362e2a1ad1020e0e0c00036502013b03043b5002432c3b1ad9020e0e0c000303033c0214343b1ace020e0e0e0c00032d2a1ab3020c00036403041abe02103b502c3c1aba020e0e0e0c0003220c2a3b1ab1020e0e0c0004512c3c1aa2020e0e0e0c00032b2a2506250626041ea926040200512e3b3c1a8b020c0004503103043b5002132d3b3b1a7a0202025d000e0e0e0c0004503b50323e1a4c020e0c0003030c323e1a45020e0e0c000302013b2b2a2a1a27020c00021a25020e0e0c000203252a352b362a35292d3b3c2210221022101a1b020c00082b2a2506250626041e2f3b270402012966026d323d1af8010e0c0003030c323d1af1010e0e0c000302013b2b2a2a1ad3010c00021ad1010e0e0c000203292a352b362a35292d3b22102210221022101ac6010e0e0e0c00082b2a2506250626041e333b2704020129652b2a3b220c220c220c220c1aa101220d0e0e7b090d0008650fcd313629352a382b392a291a74010e0c00021a71010e0e0c0002031d29352a362a353e1a64010e0c000303033c0207292503511e293b6502013b6403033b02963b2a291a3c010e0c00021a39010e0e0c0002031729362b3c1a4b010c0003292b25042504511e233b6502012a653b2c291a0f010c00021a0d010e0e0c0002031729362b3c1a1f010c0003292b25042504511e223b6502012a652a2a1a08010e0c0003220e2a1ae6000e0e0e0c0003030c220e2a1adc000e0c000302013b2f2a3b3b2210221022101acc002211020298000e7b091100082704028e3136313c1aad000e0e0c0003030c313c1aa5000e0e0c000302013b2a2a3b333333331a9700340e7b090b0008313629353e1a7c000e0c0003030c2f3c1a71000e0e0c000302013b6403033b0218303c1a62000e0e0e0c0003030a303c1a59002d7e0900033b02273136291a3b000c00020303310218313c1a3a000e0e0e0c0003030a313c1a31002e7e0a00033b641f070e0e0e0e000000000c07000000000000|@3913,I113,I105,I218,I251,I231,I107,@3910,I234,I253,@1879,I106,I255| 3913:S51|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329636865636b557365283429 3914:O1|@3915 3915:D23,316|0086040300313b313b3b3b3b30220f1a2e010e0e0e0c000a5029352a362b37293b1a20010e0c000303051a1b0102903b2a291a17010c00021a15010e0e0c0002031729362b3c1a0b010c0003292b25042504511e223b6502012a65291af9001afa000e0e0e0c000303041af300103b502928403b1aed000e0e0c00043b2c293b1ac1000e0e0c000303043b50022629352a362d2d2c1ad0000e0c0004502c3c1ab2000e0e0e0c0003292b2505250526031e32260351291ab3000c0002502965220d2a220d1aa9001aaa000e0e0e0c0005331aa4001aa5000e0e0c0003220c1a9f001aa0000e0c00032f3b1a57000c0003030329020b29301a8e000e0e0e0c00032f1a88000e0c00022d2d1a83002d2d3c22122214680828072a69321a76000e0e0e0c00023e2a2c22136b270d1f070e0e000000003401000000000000|@3917,@3918,I251,I49,I105,I218,I106,16777215,I231,@3560,I11,I255,I47,@3921,@3925,@2861,@389,@3942,@2047,@3945,@3947,@845,@3916| 3916:O1|@3949 3917:S45|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e283729 3918:O1|@3919 3919:D10,372|0088333b1a71010e0e0c0003038d2f3b2a1a68010e0c00021a65010e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f3b2a1a3d010e0e0c00021a39010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f3b2a1a11010e0e0c00021a0d010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f2c452b462a476602c9333534362a352b363b220e69220e1ad0000e0c00021acd000e0e0c000203033c0214301ac3000c0002220f2a1abe000e0e0e0c00036403041ab600103b5030220f1ab1000e0e0c0003033a220e3c1aa8000e0c0003220e3c1a9e000e0e0e0c00032b220e693c22116929220e69312e2e22142f22142f221422141a800022150e7b0b15000a220e3c1a6e000e0e0e0c0003220d3c1a62000e0e0e0c00033f2c69292f2f6a29220f693b2212692922106933302216312216302f221622161a3d0022170e0e7b0b17000a1f090e0e000000006c01000000000000|@3920,I251,I105,I218,I15,I247,@866,I253,I106,@3918| 3920:S55|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372967657441726773283729 3921:O1|@3922 3922:D2,28|00813e2d1a19002e6b430e0e0e0e0e0e000000001400000000000000|@3924,@3923| 3923:O2|4,@844 3924:S53|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e672834292d45 3925:O1|@3926 3926:D4,36|00831a23002e2d2f6b1a20002a69302a1a1d002f7e080003000000001c00000000000000|@3928,@3929,@3927,@3434| 3927:D3,92|00802b3528071a57000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a3c000e0c00033131312c31313131680828072a69296801270c02072b56172c800002420e0e0e0e0e0e0e000000005400000000000000|@3936,I251,@3940| 3928:S51|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429 3929:D9,212|00802b353f1ad0000e0c000303112b3629353b1ac2000e0e0e0c00036402013b034c2b362936291ab2000e0e0e0c00021aad000e0e0c000203033c021456271aa2000e0e0e0c00022a2a1a9b000c00036403041a9600103b5056272a1a91000e0e0c00033f2a69296801270402562b353e1a64000e0c000303252b3729353f1a56000e0e0e0c00030311293629353e1a46000e0e0e0c00036402013b6402013b03212b362c382a3b56492e1a46000e0e0e0c0005292b56580e0c0003296801270402013b420e0e0e00000000cc00000000000000|@3931,I251,I105,I218,I15,I247,@866,I253,@3930| 3930:O1|@3932 3931:S62|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e747279283129 3932:D12,172|00832e3b1aa9000e0e0c000303033b02882e352f362a352b36311a97000c00021a95000e0e0c000203033c0210301a8b000c0002322a1a87000c00036403041a8200103b5030321a7e000e0e0e0c0003031a313c1a75000e0e0c00032c2a33331a6d00340e0e0e7b060b00051a650030692b2a1a62000e0e0e0c0003292c69343c1a48000e0c00032f2a220d220d1a3f000c00052b2a6927091f040e0e0e0e0e00000000a400000000000000|@3934,I251,I105,I218,I15,I247,@866,I253,I106,@3930,@3933,@3434| 3933:D3,92|00802b3528071a57000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a3c000e0c00033131312c31313131680828072a69296801270c02072b56172c800002420e0e0e0e0e0e0e000000005400000000000000|@3936,I251,@3935| 3934:S71|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e7472792831296d6170417267283229 3935:O1|@3937 3936:S39|434f4445545245455f4f5054494d4953455228292e6f6e6c7946756e6374696f6e283129283129 3937:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d363f2b69292f1a4e000e0e0e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@3434,I251,@3938,@3935| 3938:O4|@35,@863,@2451,@3939 3939:O5|@3823,230,0,230,0 3940:O1|@3941 3941:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d363f2b69292f1a4e000e0e0e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@3434,I251,@3938,@3940| 3942:O1|@3943 3943:D1,20|00803c2c69420e0e000000000c00000000000000|@3944| 3944:S60|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372973756246756e6374696f6e2d283129 3945:O1|@3946 3946:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@3945| 3947:O1|@3948 3948:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a362b372a2a692c1a2b000c00022a2a69270602013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@3947| 3949:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a352b362a2a692c1a2b000c00022a2a69270602013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@3916| 3950:O1|@3951 3951:D15,220|00830402002e3b3b3b2d32321ad1000e0e0c00085029352a36293b1ac6000e0e0e0c000303051abf0002903b2a291abb000c00021ab9000e0e0c0002031729362b3c1aaf000c0003292b25042504511e223b6502012a65291a9d001a9e000e0e0e0c000303041a9700103b502928403b1a91000e0e0c00043b2c293b1a65000e0e0c000303043b50022629352a362d2d2c1a74000e0c0004502c3c1a56000e0e0e0c0003292b2505250526031e32260351291a57000c0002502965322a321a4f001a50000e0c00053b2a2e6a27051f0400000000d400000000000000|@3953,@3954,I251,I49,I105,I218,I106,16777215,I231,@3560,I11,I255,I47,@3952,@3925| 3952:O1|@3957 3953:S52|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f70283429 3954:O1|@3955 3955:D13,356|0086313b1a61010e0e0c0003035f2f3b2a1a58010e0c00021a55010e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f3b2a1a2d010e0e0c00021a29010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f2b452a46650fdc313532362a352b36341af3000c00021af1000e0e0c000203033c0214301ae7000c0002220c2a1ae2000e0e0e0c00036403041ada00103b5030220c1ad5000e0e0c0003032a343c1acd000e0e0c00033b220d6929220c692e2c220f2c220f220f220f1ab60022100e0e0e7b091000082f3b1a9f000c0003303b1a97000c0003293c1a93000c0003323b2b1a92000e0e0e0c000450220e3c1a7d000e0e0c0003220f3b1a7e000e0e0e0c000303041a7700103b503b2210693f2a692f2f2b6a293269292213693d326929221469220d312d2c2217221722171a41000202090022180e0e7b091800081f070e0e000000005c01000000000000|@3956,I251,I105,I218,I15,I247,@866,I253,I106,@3954,I255,I234,@3695| 3956:S62|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f702834296d617041726773283429 3957:D1,20|008128092d69430e000000000c00000000000000|@3924| 3958:O1|@3959 3959:D14,356|00812c1a62010e0e0e0c00021a5d010e0e0c000207ca2c352d362a353d1a50010e0c000303372a36293c1a47010c00031a45012b690402002b2b2b1a3e010e0e0e0c00045029352a36291a33010c0002502a2a693d2a3b3c6b270702c92a353b1a0d010e0e0c000303b92a362b372f3b1afd000e0e0c000303033d02012f2b2a1a01010e0e0c00030402002a353b1adf000c0003030d2a362b372b2b452a4626030206293b452b465029352a362e1ad7000c0002220c3d1ab6000e0e0e0c0003034d2f291aa1000e0e0c00021a9d000e0e0c0002033529352a362a1aae0002026d000e0e0e0c0002291aa4001a81000e0e0c0003641a74000e0c000203033c0207292503511e423b6502013b6402013b03051a7f000208292c693b2a2d6a64270802031a6e002a3b1a45000e0e0c000303032902172a2f1a4a000e0e0e0c00032a2a1a5300310e0e7e0800036602031a4200430e0e0e0e0e000000005c01000000000000|@3961,I105,I218,I251,I106,@3962,@3770,I47,@3958,@3964,@3677,-268435456,@855,@3960| 3960:O1|@3972 3961:S36|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e283229 3962:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@3963,I113| 3963:S42|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e28322970312d283129 3964:O1|@3965 3965:D10,140|00802b1a8a000e0e0e0c00021a85000e0e0c000203612b352c360402002b2a1a76000e0e0e0c00035029352a362a3c1a6a000e0e0e0c000303051a630002280402002b1a5e002b1a5e000e0e0e0c00045029352a36291a53000c0002502a2a693d2a2f3b6b27042d1a45000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,@3967,I232,@855,@3966,@3770,I47,@3964| 3966:O1|@3970 3967:O1|@3968 3968:D18,420|00812c35401aa0010e0c0003030e2c37292d1a97012e0e0e7e0500032c353c1a86010e0e0e0c000303522c372d380402002b2a1a76010e0e0e0c00035029352a360402002d2a1a63010c00035029352a362d2b1a5a010e0e0e0c0003030f2c03032902013b342f452a4664020b1a4401342a35452a36466427080fca2c353f1a26010e0e0e0c0003030d1a2b012c2a35452a3646640fdd2c353d1a0b010c0003037e2c36291a14010e0c000203033c0227291a07010c000203041a0301103b50291a00010e0c0002293b1adb000c0003641af4000e0c0002030d1aef002d2a35452a3646640236291ad1000e0e0c000203041adb00103b50291ad8000e0c0002293b1ad3000c0003030c1acf002a1acf000c00030201292e2a453c46656402742c35280e1a81000e0e0c0003035b2c362d37293b1a71000e0e0c0003033d3b2b291a780002024c000e0c00021a79000e0e0c0002031729362b3c1a83000c0003292b25042504511e273b6502012a652e2a4502021e003b4664020b1a66002e2a35452a36466465020b1a5c002c2a35452a364664430e0e0e000000009c01000000000000|@3969,I251,@3967,I113,@741,@741,I105,@1784,I17,I218,@741,@1784,I15,I234,@677,I106,@741,@741| 3969:S33|434f4445545245455f4f5054494d4953455228292e66696e645475706c65283129 3970:D1,20|00803c420e0e0e0e000000000c00000000000000|@3971| 3971:S33|434f4445545245455f4f5054494d4953455228292e6d6170417267283129283129 3972:D17,660|00812c353b1a90020e0c0003030c2b353b1a84020e0c000302013b03442c362d372d362e372c2b1a72021a73020c0004291a70020e0c00021a6d020e0e0c00021a65020e0e0c000203051a5f02020e2c2b1a48020e0c00033b2b2b6a6427050fcf2c353d1a31020e0e0c0003030c2b353d1a24020e0c000302013b07ca2c362d372e382e362f3730382e353b2a293b1a06020e0e0e0c000303032a0279293c1a0e020e0e0e0c00032a3c1a03020c00032b3c1afb010c000334360402002b28082b1af0010e0c00045029352a362c2b1ae6010e0e0e0c00033c2b1adf010c00032a2a1adb010c0003293b1aab010c0003641ab4010e0c0002293c1a9b010c0003030631220c690201342934250d250d260b1e843b270b652d353b2a293b1a78010e0c000303032a0281293c1a8201020255010e0e0e0c00032a3c1a73010c00032b3c1a6b0102023b010c000333360402002b28082b1a5c010e0c00045029352a362c2b1a52010e0e0e0c00033c2b1a4b010c00032a2a1a47010c0003293b1a17010c0003641a20010e0c0002293c1a07010c0003030631220c690201342934250d250d260b1e8a3b270b652b2a2a2a1ae6000e0e0e0c000303033c024f2a1ae3000c00021ae1000e0e0c0002033d291ad2000e0e0e0c00021acd000e0e0c000203262a352b362b352c362c2b1ad5000e0e0c0003030d2b2a2506250626041e513b02013b270402013b02013b270603162d03032a02013b2d03032a02013b3d312c2c6b65025a2c03032902013b034e2e352c352a2a1a90000e0c000303032a0201291a87002f336a0402002b2b2b1a7f000c00045029352a36291a77000c0002502a2a69220c03033202013b220c03033202013b3d2c2c2c6b270a02031a2c00270602031a250043000000008c02000000000000|@3974,I251,@3960,@3975,I105,I218,@855,I240,I104,I252,I245,I243,I113,I233,@3973,@3770,I47| 3973:D10,276|00805608352c2a1a0e010e0e0e0c000364036d5608355618362d3b1afa000e0e0e0c000303033c020b2d2b1aee000e0e0e0c000303041ae700103b500402002e28082b1ade000e0e0e0c00045029352a362c2b1ad2000e0e0e0c00033c2b1acb000c00032a2a1ac7000c0003293b1ac3000c0003641ac0000e0c0002270702013b03033c027f5607352c2a1a8a000e0e0e0c000364036d5607355617362d3b1a76000e0e0e0c000303033c020b2d2b1a6a000e0e0e0c000303041a6300103b500402002e28082b1a5a000e0e0e0c00045029352a362c2b1a4e000e0e0e0c00033c2b1a47000c00032a2a1a43000c0003293b1a3f000c0003641a3c00330e0e0e7d0a00023b420e0e000000000c01000000000000|@3982,I234,I231,@3760,I104,I252,I245,I243,I251,I218| 3974:S51|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229 3975:O1|@3976 3976:D5,100|00822d1a62000e0e0e0c00021a5d000e0e0c000203142c1a4e000e0e0e0c00021a49000e0e0c000202013b03262d352e362e352f362c2b311a35000e0e0c00042c2b321a2e000e0e0e0c00042a2a69270602013b440e0e0e000000005c00000000000000|@3711,I105,I218,@3977,@3975| 3977:O1|@3978 3978:D7,108|00822d3b1a69000e0e0c000303172c3b1a5d000e0e0c000303043b5002041a5300103b02382d352e362e1a4b000c00021a49000e0e0c000203043b5002041a3f00102e352f362c2b310c00032c2b321a32000e0e0e0c00042a2a692706440e0e000000006400000000000000|@3980,I251,@3979,I105,I218,@3979,@3977| 3979:O4|@83,@2825,0,@3981 3980:S19|4c697374506169722e6d617045712833292829 3981:O5|@2826,68,0,68,0 3982:S60|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229756e696f6e2d283129 3983:O1|@3984 3984:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a36293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,@3958,@3983| 3985:O1|@3986 3986:D10,140|00802b1a8a000e0e0e0c00021a85000e0e0c000203612b352c360402002b2a1a76000e0e0e0c00035029352a362a3c1a6a000e0e0e0c000303051a630002280402002b1a5e002b1a5e000e0e0e0c00045029352a36291a53000c0002502a2a693d2a2f3b6b27042d1a45000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,@3967,I232,@855,@3987,@3770,I47,@3985| 3987:O1|@3988 3988:D1,20|00803c420e0e0e0e000000000c00000000000000|@3971| 3989:O4|@77,@2231,0,@3990 3990:O5|@3823,504,0,504,0 3991:O1|@3992 3992:D7,116|00812c3b1a71000e0e0c000303172b3b1a65000e0e0c000303043b5002041a5b00103b02402c352d362d1a53000c00021a51000e0e0c000203043b5002041a4700102d352e362c353d1a2c000e0c000303032c02012a2c2b1a31000e0e0c00032a2a692706430e0e000000006c00000000000000|@3980,I251,@3979,I105,I218,@3979,@3991| 3993:O1|@3994 3994:D8,132|00812c3b1a81000e0e0c000303172b3b1a75000e0e0c000303043b5002041a6b00103b02502c352d362d1a63000c00021a61000e0e0c000203043b5002041a5700102d352e362a353d1a3c000e0c000303142c353d1a30000e0c000303032a02031a380002012a2c2b1a34000e0c00032a2a692706430e0e000000007c00000000000000|@3980,I251,@3979,I105,I218,@3979,@855,@3993| 3995:O1|@3996 3996:D10,228|00802b35401ae0000e0c0003030e2b37291ad8002d0e0e0e7d0400022b353c1ac6000e0e0e0c0003032d2b372c382a1aba000e0e0e0c000229353d1aaa000e0e0e0c0003030329020b2a1a9f002f0e0e7d06000266027f2b35280e1a8a000e0e0e0c0003036d2b362c37293b1a79000e0e0c000303573b2b291a74000e0c00021a71000e0e0c0002031729362b3c1a67000c0003292b25042504511e233b6502012a650402002a1a52002b1a52000e0e0e0c00045029352a36291a47000c0002502a2a693d2a3b3b6b270502031a38006502031a3200420e00000000dc00000000000000|@3998,I251,@3995,I105,I218,I106,@3997,@3770,I47,@855| 3997:O1|@3999 3998:S40|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129 3999:D1,20|00803c420e0e0e0e000000000c00000000000000|@4000| 4000:S43|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129283129 4001:O2|0,@855 4002:O1|@4003 4003:D23,436|00822d35293528071aad010e0e0c000303043b5002041aa30110293629392a2307313632383339343a220c2306220d23073b220e0e0c00023b220f0e0e0c00023b30291a7a010e0e0e0c00021a75010e0e0c0002031729362b3c1a6b010c0003292b25042504511e253b6502012a653c2a691a57012a691a56012a2c6a220f2a1a51010e0e0c00033b34291a32010e0e0e0c00021a2d010e0e0c0002031729362b3c1a23010c0003292b25042504511e253b6502012a65220f3b2b1a1a010e0e0e0c00043e2a2d22126b3d3269293b69293b1ae3000c000303042210020a22102a1af8000e0c000322143b1aca000e0e0e0c000303042210020a221022151adf000c00032d22141ada002d2d22152215221b6808220e2a69311acc001acd000e0e0c00031ac9002a6922153b1ac5000e0e0c0003221a3b1abe000e0e0e0c0003293b1a73000c000303032a020b2a2a1aaa000e0e0e0c00033e2a1aa30022186b221b282d1a9d000e0e0c00032a2a1a97003122223b3b2224680828072a693d221969293b692b22211a81002c22223b3b22226808221a2a69293b69220e2a69222b2d452a4627294400000000ac01000000000000|@4005,I251,@4006,I105,I218,I106,@4009,@4011,@3434,@4014,@4017,@4019,@845,@4021,@2047,@741,@4024,@4026,@4004,@1329,@389,@845,@845| 4004:O1|@4028 4005:S39|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229 4006:O4|@35,@863,@4008,@4007 4007:O5|@3823,918,0,918,0 4008:S15|6465637572727946756e6374696f6e 4009:D2,60|00802b353f1a38000e0c000303112b3629353e1a2a000e0e0e0c00036402013b030a3f5617692968016402013b420e0e000000003400000000000000|@4010,I251| 4010:S47|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229646f4d6170283129 4011:D3,124|00802b3528071a77000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a5c000e0c00033131312c31313131680828072a69296801270c022c2b353f1a39000e0e0c000303112b3629353e1a2a000e0e0e0c00036402013b030a3f5618692968016402013b420e0e000000007400000000000000|@3936,I251,@4012| 4012:O1|@4013 4013:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d363f2b69292f1a4e000e0e0e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@3434,I251,@3938,@4012| 4014:O1|@4015 4015:D4,84|00822d3b1a51000e0e0c000303033b02342d352e362a352f2f1a40000e0c00033b2a693f2a69292d69333c1a2e000e0e0e0c00032f2a220c1a25000e0e0c00042b2a692709440e0e000000004c00000000000000|@4016,I251,I106,@4014| 4016:S50|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e2832296d61704172672833292829 4017:O1|@4018 4018:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4017| 4019:O1|@4020 4020:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4019| 4021:O1|@4022 4022:D1,20|00803b2c69420e0e000000000c00000000000000|@4023| 4023:S12|4c6f6164417267756d656e74 4024:O1|@4025 4025:D4,84|00812c3b1a51000e0e0c000303033b02302c352d362a352e3c1a40000e0c00033c2a693f2a69292d69323c1a2e000e0e0e0c00032f2a1a27000c00032b2a692709430e0e0e0e0e0e000000004c00000000000000|@4016,I251,I106,@4024| 4026:O1|@4027 4027:D4,68|00812c3b1a41000e0e0c000303033b02242c352d362a353b2f693f2a69292c69313c1a27000c00032e2a1a23000c00032b2a692708430e0e000000003c00000000000000|@4016,I251,I106,@4026| 4028:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4004| 4029:O1|@4030 4030:D23,484|00832e352f3630383139323a3323063423073b340e0c00023b220c0e0e0c00023b30291ac2010e0e0e0c00021abd010e0e0c0002031729362b3c1ab3010c0003292b25042504511e253b6502012a653c2a691a9f012a691a9e012a2c6a220c2a1a99010e0e0c00033b34291a7a010e0e0e0c00021a75010e0e0c0002031729362b3c1a6b010c0003292b25042504511e253b6502012a653b2a693f2a69280c2d22172c6b220e1a57010c00023d3469293b69293b1a4d010e0e0c000303042212020a22122a1a40010e0c000322103c1a1e010e0e0e0c00032e22161a2e012d3122172f3c680822102a69221d353b3b292c1a1c010e0c000303032a0270293c1a12010e0e0e0c00032221360402002c28082b1a03010c00045029352a362c2b1afa000e0e0e0c00033c2b1af3000c00032a2a1aef000c0003293b1ac7000c0003641aa8000e0c0002293b1ab7000c0003030332020b323c1a96000e0e0e0c00032932250b250b26091e793b27096522173b1ab4000e0c0003291ab0000e0c00023e2a1aab003c6b3b3b3b2f2d6805293b6922241a9e001a9f000c00032a3b1a63000c00030303290204402b2b6a3d221b69293b692b22231a82002c22243b3c22246808221c2a69293b69220e2a69222a2d452a4627281f0400000000dc01000000000000|@4032,I105,I218,I106,@4033,@4035,@3434,@4038,I251,@4040,@845,I247,I239,I104,I252,I245,I243,@4042,@4045,@1329,@4049,@4031,@845| 4031:O1|@4052 4032:S37|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329 4033:D2,60|00802b353f1a38000e0c000303112b3629353e1a2a000e0e0e0c00036402013b030a3f5617692968016402013b420e0e000000003400000000000000|@4034,I251| 4034:S45|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329646f4d6170283129 4035:D3,124|00802b3528071a77000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a5c000e0c00033131312c31313131680828072a69296801270c022c2b353f1a39000e0e0c000303112b3629353e1a2a000e0e0e0c00036402013b030a3f5618692968016402013b420e0e000000007400000000000000|@3936,I251,@4036| 4036:O1|@4037 4037:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d363f2b69292f1a4e000e0e0e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@3434,I251,@3938,@4036| 4038:O1|@4039 4039:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4038,@737| 4040:O1|@4041 4041:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4040| 4042:O1|@4043 4043:D4,68|00812c3b1a41000e0e0c000303033b02242c352d362a353b2f693f2a69292c69313c1a27000c00032e2a1a23000c00032b2a692708430e0e000000003c00000000000000|@4044,I251,I106,@4042| 4044:S48|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833296d61704172672833292829 4045:O1|@4046 4046:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4045,@4047| 4047:O2|@4048,0 4048:O2|@1713,1 4049:O1|@4050 4050:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@4051,@1713| 4051:S49|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833297368696d426f64792d283129 4052:D6,100|00813b3b2e2e1a5f000c0005280e2a3b6a2a291a56000e0e0e0c00021a51000e0e0c0002031d29352a362a353d1a44000e0c00030309292503511e283b02013b6502013c640309291a2d002e7d0600022965430e0e0e0e0e000000005c00000000000000|@4054,@4053,I105,I218,I251,@2464| 4053:O1|@4055 4054:S38|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229 4055:D14,212|00832c352f2a1acf000c00036403033b02b02c352d36303b1ac1000e0e0c000303033c020b302b1ab6000e0e0e0c000303041aaf00103b500402003128082b1aa6000e0e0e0c00045029352a362c2b1a9a000e0e0e0c00033c2b1a93000c00032a2a1a8f000c0003293b1a8b000c0003641a88000e0c00022707032b2d2c0e0e0e0c00022f3c1a77000c00032f3c1a6f000c00032a2a31311a69000e0e0c00052c2a692704021b2e3c1a54000e0c0003292f2f2f1a4d000e0e0c00051a49002a69651f040e0e0e0e00000000cc00000000000000|@4056,I113,I234,I231,@3760,I104,I252,I245,I243,I251,I218,I106,@4053,@809| 4056:S47|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229657874417267283229 4057:D23,468|00832e352f3630383139323a3323063423073c28402c1abf010c0004040300220d3b3b2c2e220c1ab2010e0e0e0c00075029352a362b37293b1aa4010e0c000303051a9f0102903b2a291a9b010c00021a99010e0e0c0002031729362b3c1a8f010c0003292b25042504511e223b6502012a65291a7d011a7e010e0e0e0c000303041a7701103b502928403b1a49010e0e0c00043b2c293b1a45010e0e0c000303043b50022629352a362d2d2c1a50010e0c0004502c3c1a36010e0e0e0c0003292b2505250526031e32260351291a33010c00025029653b34291a0b010c00021a09010e0e0c0002031729362b3c1aff000c0003292b25042504511e223b6502012a653c2a691aff002a2d6a1afd002a2c2f6b22102a1af7000c00032216220f1af1000e0e0c0003312a1aeb000c00033b22180e0e0c00023b22190e0e0c0002220c3b1a9a000e0e0e0c000303032d020540220d2f6a3d2b69293b69293b1a7f000c000303042216020a22162a1aac000e0c000322123b1aa6000e0e0e0c00032d221a1a9e002d220c221b2f221b6808302a693e331a900022196b3d3369293b692b221f1a85002c22203b3b22206808342a69293b692f2a6922262d452a4627241f040e0e0e0e0e00000000cc01000000000000|@4059,I11,@4060,I251,I49,I105,I218,I106,16777215,I231,@3560,I255,I47,@4114,@4116,@3434,@4119,@4129,@4058,I253,@845,@1329,@845| 4058:O1|@4131 4059:S45|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329 4060:O1|@4061 4061:D21,1228|0085303b1ac9040e0e0c000303101ac3042e2a35452a36462a3747640fd1303531362a353b1aa8040e0c000307cb2a362b372a1aa2040e0e0e0c00021a9d040e0e0c000207d52a352b36293b1a81040e0e0c0003031c2b353d1a74040e0c0003030d2b37293b1a67040c00036402013b02013b03732b363b220d69293b693b221069293b692d6801040300332e2d2d2d221522151a49040e0e0c00085029352a362b3722163c1a3b040c000322163c1a32040e0e0e0c000304030022112c2c2c221a221a1a21040e0e0c00075029352a362b37312c69312c69312c69221d2c452b462a4727130fd02a291aeb030202c6030c00021ae50302024a010e0e0c0002033129352a362a353d1ac4030e0c000303112a37293b1ab7030202dc000c00036402013b03033c0207292503511e443b6502013b64036d3b220c69293b693b220f69293b69040300312d2c3b2d221322131a8c030e0c00085029352a362b3722143c1a7f030c000322143c1a76030e0e0e0c0003040300220f2c2c2c221822181a65030e0e0c00075029352a362b37312c69312c69312c69221b2c452b462a4727110252220c3c1a3a030e0e0e0c0003220c3c1a2e0302023c000e0e0e0c0003040300302c2c2c221022101a1a030e0e0e0c00075029352a362b373b2213693f2a69292d693b221569292e69221531452c462a47270b650249333c1ae6020e0e0e0c0003333c1adb020c00030403002e2c2c2c220e220e1ace020e0e0e0c00075029352a362b373b2211693f2a69292d693b221369292e69221331452c462a47270b650fcb2a353d1a85020e0e0c000307d42a362b37293b1a75020e0e0c000307d62a353b2a293b1a65020e0e0c000303032a0279293c1a72020e0e0e0c00032a3c1a67020c00032b3c1a5f020c000330360402002b28082b1a54020e0c00045029352a362c2b1a4a020e0e0e0c00033c2b1a43020c00032a2a1a3f020c0003293b1a0b020c0003641a10020e0c0002293c1afb010c0003030631220c690201342934250d250d260b1e833b270b65220c3c1aef010c00032d353b3b292c1aff010c000303032a027c293c1af6010202a4010e0e0e0c000331360402002c28082b1acc01020245010e0c00045029352a362c2b1abe010202e8000e0e0e0c00033c2b1ab3010c00032a2a1aaf010c0003293b1a7b010c0003641a80010e0c0002293b1a6b010c0003030332020b323c1a72010e0e0e0c00032932250b250b26091e843b270965220e2a1a58010e0c0003040300322e2c2c221222121a4a010e0e0e0c00075029352a362b3722113b1a57010c000322123b1a4e010e0e0e0c0003293c1a1f010c000322143b2b1a3d010e0e0c0004501a3801221769220f2a1a33010c00033c3b2f2c6b220e221b1a28010e0c00032a3369323b1ad4000e0c000303032a020b2a331a12010e0e0e0c00033d3269293469221d2d452c462a4727150248333c1abd000e0e0c0003333c1ab3000c00030403002e2c2c2c220e220e1aa6000e0e0e0c00075029352a362b373b2211693f2a69292d693b221369292e69221331452c462a47270b650249313c1a72000e0e0e0c0003313c1a67000c00030403002c2c2c2c220c220c1a5a000e0e0e0c00075029352a362b373b220f693f2a69292d693b221169292e69221131452c462a47270b651f060e0e0e0e0e0e0e00000000c404000000000000|@4063,I251,@3716,I105,I218,@4064,I106,@4060,I240,I104,I252,I245,I243,I247,I239,I253,I255,@4109,@4031,@4111,@4062| 4062:O1|@4113 4063:S58|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e283329 4064:O1|@4065 4065:D26,548|0086311a22020e0e0e0c00021a1d020e0e0c000203043b5002041a1302103135293b692e3b1a0c020e0c00032f3b1a03020c0003293c1aff010c0003313b2b1afa010e0e0e0c0004502c220d220c33301aed010e0e0c00063c3b2e2c6b2e3b1ae2011ae3010c00042f3b2a1aba010e0e0e0c00021ab5010e0e0c000207d02a352b362a3b2a1aa0010e0c00021a9d010e0e0c000203cc2a352b362a353d1aac010e0c0003030d2a37293b1a9f010c00036402013b03912a3629353b3b292c1a8f010c000303032a0270293c1a86010e0e0e0c00032d360402002c28082b1a78010e0c00045029352a362c2b1a6e010e0e0e0c00033c2b1a67010c00032a2a1a63010c0003293b1a43010c0003641a1c010e0c0002293b1a33010c0003030332020b323c1a12010e0e0e0c00032932250b250b26091e783b270965292f1af9000e0e0c000366020d2b3c1aec0002022c000e0c00032a2a2505250526031ed83b66020129652c2a1acf000c00032b2a250625062604200a013b270402012965220e1aa5000e0e0c00021aa1000e0e0c00022a2a1aa3000c000322101a8b000c00021a89000e0e0c000203322210352a3c1ab6000e0e0e0c0003293b1aaf000c000303041aab00103b503b2a693f2a69302d2b1aa0000e0c0004270402012c220e1a96001a97000c00032b1a94001a95000e0e0c00032b2b1a8f0022172d3b3b3c680828072a693d220e69221534452b462a4727111f070e0e0e000000001c02000000000000|@4067,I105,I218,@2229,I253,I106,I255,@4068,@1329,@4096,I251,I247,I239,I104,I252,I245,I243,I107,I234,@3695,@4104,@4106,@389,@4066,@2047,@845| 4066:O1|@4107 4067:S73|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429 4068:O1|@4069 4069:D27,604|00842f1a5a020e0e0e0c00021a55020e0e0c000207d72f3530363b2b291a40020e0c00021a3d020e0e0c0002031729362b3c1a33020c0003292b25042504511e233b6502012a652a3b1a20020e0c00030314301a0a020e0e0e0c00021a05020e0e0c000202013b301a05021a06020e0e0e0c00032b1a00021a01020e0e0c00033b220c291ad9010e0e0c00021ad5010e0e0c0002031729362b3c1acb010c0003292b25042504511e243b6502012a65291acd011ac6010e0e0e0c00032e1ac4011ab9010e0e0c0003293b1a9f010c000303032a020b2a2a1aae010e0e0e0c0003312a2210221022101aa101020219000e0e0c000629303b2213323b220d3c680828072a69270c0fdd2e1a54010e0c00021a51010e0e0c000203043b5002041a6f01102e362c2a1a6b010c00032f1a30010e0c00021a2d010e0e0c000207cc2f3529353b3b292c1a4f010c000303032a0270293c1a46010e0e0e0c00032d360402002c28082b1a38010e0c00045029352a362c2b1a2e010e0e0e0c00033c2b1a27010c00032a2a1a23010c0003293b1adb000c0003641acc000e0c0002293b1acb000c0003030332020b323c1aba000e0e0e0c00032932250b250b26091e783b270965331a9a000e0e0e0c00021a95000e0e0c000203043b5002041ad3001033353f2a69020263002e1ac9000e0e0c00023e2a2c3c6b3b1abf003b302d6805293b69311ab7001ab800020219000e0c00032a3b1a57000c00030303290204402b2b6a270a0224301a37000c00021a35000e0e0c000203043b5002041a87001030353f2a693e2c2b3c6b65651f050e0e0e0e000000005402000000000000|@4071,I105,I218,I106,I251,@4072,@389,@4073,@2047,@4076,@4021,@4078,@4068,@2232,@4080,I247,I239,I104,I252,I245,I243,@2229,@4093,@845,@4070,@4031,@2229| 4070:O1|@4095 4071:S85|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229 4072:S2|2d50 4073:O1|@4074 4074:D2,20|00801a1300420e0e000000000c00000000000000|@4075,@2706| 4075:S88|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229283129 4076:O1|@4077 4077:D1,20|00803c2c69420e0e000000000c00000000000000|@4075| 4078:O1|@4079 4079:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4078| 4080:O1|@4081 4081:D5,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203162c352d362a2e1a29002c1a2900310e0e0e7b060600053b430e0e000000003400000000000000|@4083,I105,I218,@4080,@4082| 4082:O1|@4084 4083:S95|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d617041726773283229 4084:D13,356|00832e1a62010e0e0e0c00021a5d010e0e0c000207d02e352f362a353d1a50010e0c000303242a37293b1a43010c00030314301a32010e0e0e0c00021a2d010e0e0c000202013b6402013b03c72a36303531362b353b2a293b1a14010e0c000303032a0279293c1a0a010e0e0e0c00032a3c1aff000c00032b3c1af7000c000331360402002b28082b1aec000e0c00045029352a362c2b1ae2000e0e0e0c00033c2b1adb000c00032a2a1ad7000c0003293b1abb000c0003641ab0000e0c0002293c1aab000c0003030631220c690201342934250d250d260b1e823b270b65292d1aa400020264000e0c00032f2d220d220d1a97000c0005293b1a73000c000303032a020b2a2a1a8600220d7e0f0003270702352f1a50000e0c00021a4d000e0e0c000203043b5002041a6700102f3530363f2b69293c692d2c34341a4d000e0e0c00052a2a6927056502082b2e2e2d7e0600031f040e0e000000005c01000000000000|@4086,I105,I218,I251,I240,I104,I252,I245,I243,@4087,@4082,@4089,@4085| 4085:O4|@35,@863,@4092,@4091 4086:S104|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d6170417267732832296d6170417267283229 4087:O1|@4088 4088:D4,76|00812c1a4a000e0e0e0c00021a45000e0e0c000203212c352d363f2e6928062a2d3b6b293c692c311a2d000e0e0c00032a2a69270602013b430e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@4087| 4089:O1|@4090 4090:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4089| 4091:O5|@3823,713,0,713,0 4092:S17|6d6170417267733a206d69736d61746368 4093:O1|@4094 4094:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4093,@4047| 4095:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@4075,@1713| 4096:O1|@4097 4097:D13,308|00822d3b1a31010e0e0c000303032b0fd02d352e362e2b1a22010e0e0e0c00032b3b2a1a1a010e0e0e0c00021a15010e0e0c000203cc2a352b362a353d1af8000e0c0003030d2a37293b1aeb000c00036402013b03952a3629353b3b292c1ae7000c000303032a0270293c1ade000e0e0e0c00032d360402002c28082b1ad0000e0c00045029352a362c2b1ac6000e0e0e0c00033c2b1abf000c00032a2a1abb000c0003293b1a8f000c0003641a94000e0c0002293b1a7f000c0003030332020b323c1a9a000e0e0e0c00032932250b250b26091e783b270965292f1a810002023d000e0e0c00036602092b3c1a70000e0c00032a2a2505250526031eda3b6602012965302a1a57000c00033e2c323c6b2d2b2b1a4d00340e0e0e7b050b0004440e0e0e0e0e0e0e000000002c01000000000000|@4099,I251,@4098,I105,I218,I247,I239,I104,I252,I245,I243,I106,@4096| 4098:O1|@4100 4099:S86|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c79283329 4100:D16,308|00812b1a32010e0e0e0c00021a2d010e0e0c000207d82b352c362a353d1a20010e0c0003030d2a37293b1a13010c00036402013b03b12a361a090130692a2a1a06010e0e0e0c0003293c692c353b3b292c1af8000e0c000303032a0270293c1aee000e0e0e0c000330360402002c28082b1ae0000e0c00045029352a362c2b1ad6000e0e0e0c00033c2b1acf000c00032a2a1acb000c0003293b1aa3000c0003641a98000e0c0002293b1a93000c0003030332020b323c1aaa000e0e0e0c00032932250b250b26091e793b270965342a1a91000e0e0c000329311a8b000c00032d2a69270802362e3b1a8000020230000e0c000303041a7700103b503b2f693f2a69293c69313c1a5a000e0e0e0c0003292e1a53000c00032b2a6927056502013b430e0e0e0e0e0e000000002c01000000000000|@4102,I105,I218,I251,@4101,@4031,I247,I239,I104,I252,I245,I243,I106,@4098,I234,@3695| 4101:D4,52|00802b56171a30000e0c0003293b1a2b000c000303041a2700103b503b2a693f2a6965420e0e0e0e000000002c00000000000000|@4103,I106,I234,@3695| 4102:S97|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229 4103:S100|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229283129 4104:O1|@4105 4105:D3,172|00822d3528051aa7000c000303232d362e372a2f2f1a9c000e0c00042a30301a92000e0e0e0c000428052b2b6a2704026a2d35280b1a78000e0c000303032d025a2d35401a69000e0e0c000303152d362e37292f2f1a5c000e0c0004402c2b6a6602382d353c1a47000c000303272d362e372f382a30301a3a000e0e0e0c00042a31311a2e000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e00000000a400000000000000|@3786,I251,@4104| 4106:S2|2d45 4107:D2,20|00801a1300420e0e000000000c00000000000000|@4108,@2706| 4108:S84|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429746869734172672d283129 4109:D4,52|008056072c1a30000e0c0003293b1a2b000c000303041a2700103b503b2a693f2a6965420e0e0e0e000000002c00000000000000|@4110,I106,I234,@3695| 4110:S67|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e2833297475706c652d283129 4111:O1|@4112 4112:D6,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203312c352d362d3b1a49000e0e0c000303041a4300103b503b2e693f2a6928062a2e3b6b2c311a33000c00032a2a69270602013b430e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,I234,@3695,@4111| 4113:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4062| 4114:D8,148|00802b353f1a90000e0c000303732b3629353e1a82000e0e0e0c0003030a3f56276929680164025629353b1a6a000e0e0e0c000303472936291a60000e0c00021a5d000e0e0c000203033c021456281a52000e0e0e0c00022a2a1a4b000c00036403041a4600103b5056282a1a41000e0e0c00033f2a692968016602013b6402013b420e0e0e0e0e000000008c00000000000000|@4115,I251,I105,I218,I15,I247,@866,I253| 4115:S53|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329646f4d6170283129 4116:D9,212|00802b3528071acf000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71ab4000e0c00033131312c31313131680828072a69296801270c02812b353f1a91000e0e0c000303732b3629353e1a82000e0e0e0c0003030a3f56286929680164025629353b1a6a000e0e0e0c000303472936291a64000e0c00021a61000e0e0c000203033c021456291a56000e0e0e0c00022a2a1a4f000c00036403041a4a00103b5056292a1a45000e0e0c00033f2a692968016602013b6402013b420e0e0e0e0e00000000cc00000000000000|@3936,I251,@4117,I105,I218,I15,I247,@866,I253| 4117:O1|@4118 4118:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d363f2b69292f1a4e000e0e0e0c000329353f1a46000e0e0e0c000303043b5002041a3b001029362c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@3434,I251,@3938,@4117| 4119:O1|@4120 4120:D17,308|00812c3b1a31010e0e0c000303172b3b1a25010e0e0c000303043b5002041a1b01103b0fd62c352d362d1a13010c00021a11010e0e0c000203043b5002041a0701102d352e362b2a1a01010e0e0c00032d353d1ae2000e0e0e0c0003030d2d37293b1ad3000c00036402013b03ae2d3629353b3b292c1ad7000c000303032a0270293c1ace000e0e0e0c00032d360402002c28082b1ac0000e0c00045029352a362c2b1ab6000e0e0e0c00033c2b1aaf000c00032a2a1aab000c0003293b1a77000c0003641a7c000e0c0002293b1a67000c0003030332020b323c1a8a000e0e0e0c00032932250b250b26091e783b270965291a76001a7700020224000c00032d3b1a33000c0003030329020b292e1a6200220d7e0d0003270402032b2a692705430e0e0e0e0e0e000000002c01000000000000|@4122,I251,@4123,I105,I218,@4123,@4119,I247,I239,I104,I252,I245,I243,I106,@4125,@2047,@4121| 4121:O1|@4128 4122:S21|4c697374506169722e666f6c647245712834292829 4123:O4|@83,@2825,0,@4124 4124:O5|@2826,89,0,89,0 4125:O1|@4126 4126:D2,20|00801a1300420e0e000000000c00000000000000|@4127,@741| 4127:S57|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329657870616e64283329283129 4128:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4121| 4129:O1|@4130 4130:D7,108|00812c3b1a69000e0e0c000303172b3b1a5d000e0e0c000303043b5002041a5300103b02342c352d362d1a4b000c00021a49000e0e0c000203043b5002041a3f00102d352e362a352d2a692d2c1a34000e0c00032a2a692707430e0e0e0e0e0e000000006400000000000000|@3980,I251,@3979,I105,I218,@3979,@4129| 4131:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4058| 4132:O1|@4133 4133:D6,84|00853c28403b1a4f000c0004521a4c004521061a4a0045292c46334730482f492b4a6c502a2a466c50332b1a36000e0e0e0c00032c3b1a2f000c0003322b4534462a4727051f060e000000004c00000000000000|@4135,I11,@4136,@4134,@3434,I253| 4134:D14,564|008156073b1a30020e0c000356173b3b1a29020e0e0c0004502d562b1a21020e0e0c000356273b1a0e020e0e0e0c00032b031156373b3c1a02020e0e0e0c0004503b02013b2a03033c0fdd30291af4010e0c00021af1010e0e0c0002032229352a362a37293a293b1ae1010e0e0c00036503033c0207292503511e2e3b6502013b6403033c02a530291ab8010e0c00021ab5010e0e0c0002039029352a362a37293829291a9d010e0e0c00021a99010e0e0c0002036129352a362a353d1a8c010e0c000303412a362210291a76010e0e0e0c00021a71010e0e0c0002031e29352a362a36292e1a67010c00036403033c0207292503511e2c3b6502013b641a47010c00026402013c03033c0207292503511e6e3b6502013b6603033c0207292503511e9a3b65020302003b6403072f2c453b460fd12b1a1b010c00023e2d69293b69280e2c3b6a2c291af8000e0c00021af5000e0e0c0002031d29352a362a353d1ae8000e0c00030309292503511e263b02013b6502013c64030b291ad9000e0e0c0002020129402c2b6a313b2a1ab3000c00021ab1000e0e0c000203232a352b362a36292d1ab3000c000303032902012c2b2a2506250626041e2d3b270402012965293c1a98000e0c00030402002c2b56f82c12120001000300121300010004001a7f000c00075029352a363b2b0e0e0c00023d2a2c6a121200010001003b3c1a3800020218000e0c000450220f3b2b1a54000e0c000422143b452a46270e2704430e0e0e0e0e000000002c02000000000000|@4156,I253,I255,@4157,I105,I218,I251,I113,@4159,@2464,I233,I106,@4161,@4155| 4135:S53|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e283329 4136:D8,284|00802b35401a18010e0c000303212b362c372a2c56471a0b010c00042a2d1a07010c0003402b2b6a29680127050fdd2b3528071aea000e0e0e0c000303cc2b362938293b1ad9000e0e0c0003030d2a3a293c1acb000c00036402013b6403a73b3b2b6a293b690402002a2a56670c00035029352a362a3b1aa6000e0e0e0c0003034b291aa6000e0e0e0c00021aa1000e0e0c0002032029352a362a353c1a80000e0c0003030c293b1a75000e0e0c000302013b6502013b03043b5002041a7400103b50293529382968016502352a352b36293b1a4a000e0e0e0c0003030c2b3b1a3d000e0e0c000302013b03043b5002041a4400103b502a3728072a692968012704270502013b640205020201003b42000000001401000000000000|@4138,I251,@4139,@3434,I105,I218,@4137,@4137| 4137:O4|@35,@863,@4154,@4153 4138:S65|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129 4139:O1|@4140 4140:D5,68|00822d1a42000e0e0e0c00021a3d000e0e0c0002031e2d352e36292f2f1a30000e0c00042b2a31311a2900320e0e0e7b060800053b440e0e000000003c00000000000000|@2263,I105,I218,@4139,@4141| 4141:O1|@4142 4142:D9,388|00832e353b1a80010e0c000303202e362f373038313929311a71010e0e0c00033b2e2e2e2d680529346927060fd42e353d1a54010e0c000303132e36292e1a4b010c00033d2a69293169660fca2e353e1a35010e0e0c0003036a2e360402002a2a2f0e0e0e0c00035029352a362a1a1f010c00021a1d010e0e0c00021a15010e0e0c000203033b02073e2b69293b6964323b1af3000c0003030329020b29331af6000e0e0e0c0003293b1adb000c000303032b020b2b2a1ae200330e7e0c0003270602b22e362f373038293528071ab7000c0003038e29362c2c2b6a293b690402002a2a340c00035029352a362a3b1a96000e0e0e0c00030328220d3b1a8800020272000e0c0003030329021329220e1a8d00220d02025d000e0e0e7e0f0003023e2a352b36293b1a5d000e0e0c0003030c2b3b1a51000e0e0c000302013b03043b5002041a5c00103b502a352b362c3728072a693c2d2d2c6b2922156927072706021129301a23000c00033c2d2d2c6b29336965661f04000000007c01000000000000|@4144,I251,@3434,I105,I218,@4145,@4147,@4149,@4143| 4143:O4|@35,@863,@4152,@4151 4144:S81|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129636865636b42696e64696e6773283229 4145:O1|@4146 4146:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4145| 4147:O1|@4148 4148:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4147| 4149:O1|@4150 4150:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4149| 4151:O5|@3823,1424,0,1424,0 4152:S13|636865636b42696e64696e6773 4153:O5|@3823,1411,0,1411,0 4154:S14|70726f636573734c616d62646173 4155:O1|@5335 4156:S70|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129 4157:O1|@4158 4158:D5,116|00812c1a72000e0e0e0c00021a6d000e0e0c000203492c352d362a352b362c3729352a362b372c382d392e3a2f23063023073022101a48000e0c000329313131313131316808220c220c2b6a220e22131a31000e0e0c00032a2a69271102013b430e0e0e0e0e0e0e000000006c00000000000000|@1785,I105,I218,@3434,@4157| 4159:O1|@4160 4160:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a363d2a693f2a692c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@4159| 4161:O1|@4162 4162:D18,212|00852f3b1ad1000e0e0c000303033c020b2f1ac7001ac8000e0c000303041ac300103b503b502f3c1abd000e0e0c00032928403b1ab5000e0e0c0004293b331aae000e0e0e0c0004501aa8002a691aa7002b691aa600332c2c34346806220c2a1a9d000e0e0c00030402002a1a95001a920022101a91000e0e0c0005291a84001a810022112211221022101a7e000e0e0e0c000829221022102e221022101a6f000c0007502b352c362212331a65000e0e0c0003292b1a5f000c000322112d452a46270d1f060e0e00000000cc00000000000000|@4164,I234,16777214,I231,@1868,I106,I11,I255,@4165,@4171,@4173,@3434,@5315,@4222,@4244,@4294,@5317,@4163| 4163:O2|@5322,@33 4164:S53|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329 4165:D10,140|00802b353d1a88000e0c000303043b5002041a7f00102b36293b1a7b000c000303033c021456173b1a71000e0e0c00032a2a1a6b000c00036403041a6600103b50293c1a62000e0e0e0c000356272a1a4a000e0e0e0c0003291a50000e0c00021a4d000e0e0c0002030d293529352a363b2b2b6a6602033c2f6966420e0e0e0e000000008400000000000000|@4167,I251,@4166,I234,I253,I231,@1850,I106,I105,I218| 4166:O4|@35,@863,@4169,@4168 4167:S66|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296c6f6f6b757041646472283129 4168:O5|@4170,246,0,246,0 4169:S33|6c6f6f6b7570436f6e7374616e743a20746f702d6c6576656c2072656163686564 4170:S68|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e532e736d6c 4171:D7,92|00802b352c362968012b3b1a52000e0e0e0c000303033c021456373b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356472a2c1a2d00320e0e0e7b05070004000000005400000000000000|@4172,I234,I253,I231,@1879,I106,I255| 4172:S64|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329636f6e746578742d283129 4173:D2,36|00802b561756285639564a565b1a1800310e0e7b08030007000000001c00000000000000|@4175,@4174| 4174:O1|@4176 4175:S50|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283129283129 4176:D26,684|00853035280e1aa7020c000303cc303631372903611a9c021a9d02333333333368072b2a1a95020e0e0c0003280e2a3c6a2a291a8a020e0e0e0c00021a85020e0e0c0002031d29352a362a353d1a60020e0c00030309292503511e283b02013b6502013c64030b291a5d020e0e0c000202012966025e1a53021a3c02333333333368072b2a1a48020e0c0003280e2a3b6a2a291a2a020e0e0e0c00021a25020e0e0c0002031d29352a362a353d1a00020e0c00030309292503511e283b02013b6502013c64030b291afd010e0e0c000202012966296801660fca3035401ad0010e0c00030359303631372a1ae6010e0e0e0c0002291ac0013131220d220d220d1ad5010e0e0c00081ad1011aaa01220c220c220c220c220c68072c2a1ac1010e0e0c00032b3b1a87010c000303052968010208402c2b6a2968016427060fdc303528071a6a010e0e0e0c000307dc303629352a362b372c382d392e3a2f23063023072a3b1a7d010e0e0c000303033c020b2a1a73011a74010e0c000303041a6f01103b503b502a3c1a69010e0e0c00032928403b1a61010e0e0c0004293b2e1a5a010202f7000e0e0e0c0004503c28403b1a44010e0c00041a45012a2213332e68051a3f012c691a3e011aeb0022162d2d221622166807220d2a1a03010c00032d3b1a27010c0003293b2a1ad2000e0e0e0c00021acd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652b02028000221022102c221022102210020231002210680828072a692b3b1a77000c0003031829220d221c221a221a1ac6000e0e0e0c00062968016402032968012714024030353f1a4d000e0e0c00030332303629300e0e0e0c000229353b1a36000e0e0e0c0003030e29362a373d2b2b6a29680166020929363f2a69296801656502013b1f060e00000000a402000000000000|@4178,I251,@4179,@4174,@4180,I105,I218,@2464,@4182,@4183,@4185,@4189,@4206,@3434,I234,16777214,I231,@1868,I106,I11,I255,@4207,@4209,@4211,I253,@4177| 4177:O1|@4212 4178:S47|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429 4179:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4180:O1|@4181 4181:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@3434,@4180| 4182:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4183:O1|@4184 4184:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@3434,@4183| 4185:O1|@4186 4186:D7,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203322b352c36291a4a000e0e0e0c00022b1a44000e0c00022a3b1a3f000c0003030329020b292b1a3600310e7e070003270402013b420e0e0e0e0e0e000000005400000000000000|@2263,I105,I218,@4185,@3712,I251,@4187| 4187:O1|@4188 4188:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4187| 4189:O1|@4190 4190:D18,924|0086313b1a99030e0e0c000303033b0fce313532362a353b1a85030e0e0c000303452a362b372c382d391a7703220e220c220c220c2211221168072a2a1a68030e0c00033b2f2f2f2d6805302211221122112211221122111a51030e0e0c00082a2a6927080fd42a353e1a33030c000307cb2a362b36291a36030e0e0e0c00021a31030e0e0c0002030d2936293b1a0f030c00036402013b64032d2b36293529352a362b3728072a693c2d2d2c6b293269652210221022102210221022101aeb0222117b09110008293434343434341ae6020e0e0e0c000829291ad3020202a9020c00021acd020e0e0c0002038b29352a362a37293829291ab5020e0e0c00021ab1020e0e0c0002035e29352a362a353d1a8c020e0c0003033e2a3632291a8f020c00021a8d020e0e0c0002032629352a362a362d2a1a830202044c0294010e0e0c00036403033c0207292503511e313b6502013b6502013b0309292503511e683b02013b6502013c660309292503511e973b02013b6502013c642907ce2a1a3e020e0e0e0c00023e2c69293b69280e2c3b6a2c291a18020e0c00021a15020e0e0c0002031d29352a362a353d1af0010e0c00030309292503511e263b02013b6502013c64030b291af9010e0e0c0002020129402c2b6a303b2a1ad3010c00021ad1010e0e0c000203232a352b362a36292d1ad3010c000303032902012c2b2a2506250626041e2d3b270402012965293c1ab8010e0c00032b2a2213221622161aad010e0e0c0006333b2a1a82010e0e0e0c00021a7d010e0e0c000203592a352b362a362e2d3b1a8a01020266000e0e0e0c000429353d1a46010e0e0e0c000303043b5002041a6f01103b5029362a372a2a692d2a69221a0e0c000250303c1a4a010e0e0e0c00032f2a250a250a26081e663b270802012965220d2217221722172217221722171a020122180e0e0e7b091800083e2b692d220e220e220e220e220e220e1ae5000e0e0c00082a2a69270502b62a353d1ac7000c000303392a361af90034323232220e220e68072a2a1ab6000e0e0e0c00033d2a692d220e220e220e220e220e220e1aa1000e0e0c00082a2a69270502722a362b372c381ac000220d3434342210221068072a2a1a78000e0c000329353d1a66000e0e0e0c0003032a29362a372a2a692f2a69220d0e0e0e0c000250312212221222122212221222121a470022137b091300083c2e2e2c6b2f2210221022102210221022101a2b000c00082a2a692707651f070e0e0e0e000000009403000000000000|@4192,I251,@4193,@3434,@4189,I105,I218,@4194,I113,@4200,@2464,I233,I106,@4177,@2403,@4202,@4205,@4191| 4191:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4192:S65|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e7328342970726f6365737342696e64696e6773283129 4193:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4194:O1|@4195 4195:D8,140|0086311a8a000e0e0e0c00021a85000e0e0c00020361313532362a352b362c371a7500220d34343422102210680728072b69292b1a65000e0e0c0003293528071a5d000e0e0c000303043b5002041a5300103b5029362f2f2b6a312212221222122212221222121a3e000e0e0e0c00082a2a69270b02013b1f070e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,@4197,@3434,I251,@4196,@4194| 4196:O4|@35,@863,@4199,@4198 4197:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4198:O5|@4170,174,0,174,0 4199:S24|70726f63657373456e7472793a206e6f74206c616d626461 4200:O1|@4201 4201:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a363d2a693f2a692c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@4200| 4202:O4|@35,@863,@4204,@4203 4203:O5|@4170,205,0,205,0 4204:S14|4e6f74206120636f6e7374616e74 4205:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4206:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4207:D13,268|00802b353c1a08010e0c000303752b3656192a2a1afd000e0e0c00021af9000e0e0c000203043b5002041aef00103b502a352b362b3b1ae7000c000303032a02172b3c1ade000e0e0e0c00032a2a2505250526031e413b64270456280e0c000229353b1aaa000e0e0e0c0003030329020f29362956471aaf000c00033c2a69656502752b353d1a87000c000303672b36293b1a97000c000303033c0214561a3b1a8d000e0e0c00032a2a1a87000c00036403041a8200103b503b50293c1a7c000e0c0003562a2a1a66000e0e0e0c0003291a40000e0c00021a3d000e0e0c0002030d293529352a363b2b2b6a6602033c2f696602033c2c69420e0e0e0e0e0e0e000000000401000000000000|@4208,I251,I105,I218,@878,I113,I107,@2438,I234,I253,I231,@1850,I106| 4208:S61|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e732834296c6f6f6b75704c6f63616c283129 4209:D7,92|00802b352c362968012b3b1a52000e0e0e0c000303033c021456373b1a45000e0e0c00032c2a1a3f000c00036403041a3a00103b502b3c1a36000e0e0e0c000356472a2c1a2d00320e0e0e7b05070004000000005400000000000000|@4210,I234,I253,I231,@1879,I106,I255| 4210:S58|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429636f6e746578742d283129 4211:D1,36|00802b56185629563a564b565c5667310e0e0e7b08030007000000001c00000000000000|@4175| 4212:D15,468|00842d291ad1010e0e0c00021acd010e0e0c0002032429352a362a35291ac0011ac1010e0e0c00036403052a68010207292503511e313b6502013b64293b1aa3010c0003036b1a9f01291a8b010c00021a89010e0e0c0002032429352a362a35291a7c011a7d010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a5f010c000303041a5f01103b503b50293529351a47011a48010e0c000303043b5002041a4701103b50293765021e293529351a28011a29010e0e0c000303043b5002041a2701103b502937646403822d291a01010e0e0c00021afd000e0e0c0002032429352a362a35291a04011af1000e0e0c00036403052a68010207292503511e313b6502013b64293b1ad3000c0003030e301ade000e0e0e0c00023b64022d293529351ac9001ab6000e0e0e0c000303043b5002041ab300103b502937321ab2000e0e0e0c00022a0c0002656402013b040200311aa0001a9d00331a9d000e0e0c0005291a90001a8d00343434341a8e000e0e0e0c00082933332e34341a83000c0007502b352c367881123b2d0e0e0e0c00023d2a2e6a6405240e0e0e00ff6d29353c1a39000e0e0c000303041a5700103b503b503d2a3b6a280b2a696527061f050e00000000cc01000000000000|@4214,I105,I218,@97,I251,@2900,@2955,@1840,@108,@2962,@4215,@4222,@4244,@4294,@4213| 4213:O4|1,@5314,0,@5313 4214:S63|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465546f436f6e7374616e74283329 4215:O1|@4216 4216:D2,20|00801a1300100e0e000000000c00000000000000|@4218,@4217| 4217:O4|@35,@863,@4220,@4219 4218:S49|434f4445545245455f4c414d4244415f4c49465428292e636f646547656e6572617465283329746f706c6576656c283129 4219:O5|@4221,473,0,473,0 4220:S17|546f70206c6576656c2072656163686564 4221:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4c414d4244415f4c4946542e736d6c 4222:O1|@4223 4223:D12,124|00832b3b1a79000e0e0c000303033c023c2b3b1a6e000e0e0e0c000303033c020b2b1a63001a64000e0c000303041a5f00103b502b281f1a5a000e0e0e0c00032928201a52000e0e0e0c0003642928413b1a48000e0c00041a45003030302d1a42006806312a1a3f00300e0e7e090003000000007400000000000000|@4225,I113,I234,@3771,I233,@3773,I106,I109,I11,@4224,@4222,@3434| 4224:D18,428|00802b35401aa8010e0c0003032d2b362c37292c1a9d010e0e0c00032b2d565756685679568a569b1a8d010e0e0c0008402a2c6a29680127050fcb2b3528071a6e010e0e0e0c0003035d2b3629352a362b382c392d23062e23073c28403b1a5b010c00041a59012a691a580156a756b856ca56d9336806312a2c3056eb0c00052c3b1a43010c000303051a3f0102013b2a332b34343c220c220c680828072a69296801270e0fca2b353e1a03010c0003032d2b362c372d382a353f1af2000e0e0e0c000303152b2d1a05010e0e0c00033e2a2d2d6b2968016502013b6602be2b353f1acb000c000303b22b3629353b1abe000e0e0e0c000303043b50029829353c1aac00020295000e0c0003030d29362956370e0e0c000251027b29353e1a8f000c000303093b56280c00025002672936293b1a9e000e0e0e0c000303033c020b2956391a91000e0e0c000303041a8b00103b500402002a28082b1a82000e0e0e0c00045029352a36565a2b1a750002022a000e0e0c00033c2b1a6b000c00032a2a1a67000c0003568a2e2b1a61000e0e0c000426082c68016402013b420e0e00000000a401000000000000|@4227,I251,@3434,@4228,I11,@4241,@4242,I253,@845,@4226,I234,I231,@3782,I104,I252,I245,I242,I254| 4225:S35|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429 4226:O1|@4243 4227:S47|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f6465283129 4228:O1|@4229 4229:D16,396|0086311a8a010e0e0e0c00021a85010e0e0c000207ce313532362a353b1a78010e0c000303342a372b382c392c220d220d220d220d220d220d1a60010e0c00082a220e1a5a010e0e0e0c00033b3b2f2f2d6805292c6927060fca2a353d1a38010e0c000303282a362a3434343434341a2a010e0e0e0c00082a220c1a22010e0e0e0c00033d2a69292c6927040fcc2a353e1a04010e0c000303342a362a3434343434341af6000e0e0e0c00082a34343434341aef000c00072933331aea000e0e0e0c00043e2a69292d69270502a62a372b382b220c220c220c220c220c220c1aba00020291000e0e0e0c00082a220d1aae000e0e0e0c00032c3b1aaf000c000303033c020b2c341aa6000e0e0e0c000303041a9f00103b500402002d28082b1a960002024e000e0e0e0c00045029352a36220c2b1a85000e0e0c00033c2b1a7f000c00032a2a1a7b000c0003293b1a47000c0003641a3c00020218000e0c0002270503051a610002013b3c2a2f2d6b292d6927066502013b1f070e0e0e0e0e0e000000008401000000000000|@4231,I105,I218,I251,@4228,@3434,@4232,@4238,I234,I231,@4230,I104,I252,I245,I243,@845| 4230:O4|11,@316,0,@4240 4231:S61|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f646528312970726f6365737344656373283129 4232:O1|@4233 4233:D9,164|0085301aa2000e0e0e0c00021a9d000e0e0c00020379303531362a362b3729352a362b382c392d23062e23073c28403b1a7d000e0e0c00041a79002a691a78002213221322122214336806312a2c3022130c00052c3b1a63000c000303051a5f0002013b2a332b34343c220c220c68083b220e2b6a220f221822182218221822181a40000e0c00072a2a69271202013b1f060e0e0e0e0e0e000000009c00000000000000|@1785,I105,I218,I11,@4235,@4234,I253,@845,@4232| 4234:D15,252|0080560b2c2a1af7000c00021af5000e0e0c000203043b5002041aeb00102a352b362b3b1ae5000e0e0c000303032a02172b3c1ada000e0e0e0c00032a2a2505250526031e3f3b64270429353b1ac4000e0c000303033b029329353c1ab5000e0e0c0003030a29362956372e7d05000229353e1a9e000e0e0e0c0003030a3b56282d0e0e7d0400022936293b1a89000e0e0c000303033c020b29563a1a7d000e0e0c000303041a7700103b500402002a28082b1a6e000e0e0e0c00045029352a3656592b1a61000e0e0c00033c2b1a5b000c00032a2a1a57000c000356892e2b1a5100220d0e0e7b050b000464420e0e00000000f400000000000000|@4237,I105,I218,@878,I113,I107,I251,I234,I231,@3782,I104,I252,I245,I242,I254| 4235:D2,28|008056073b3c1a17000c0004503b420e000000001400000000000000|@4236,I255| 4236:S66|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f526563757273697665283129 4237:S64|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f436c6f73757265283129 4238:O1|@4239 4239:D13,180|00822d1ab2000e0e0e0c00021aad000e0e0c000203892d352e362a362b372a3b1a9d000e0e0c000303033c020b2a311a92000e0e0e0c000303041a8b00103b500402002b28082b1a82000e0e0e0c00045029352a36322b1a76000e0e0e0c00033c2b1a6f000c00032a2a1a6b000c0003293b1a67000c0003641a40000e0c0002270503051a590002013b292c2c6a2d33331a50000e0c00042a2a69270702013b440e0e0e0e0e0e0e00000000ac00000000000000|@1785,I105,I218,I234,I231,@4230,I104,I252,I245,I243,I251,@845,@4238| 4240:O5|@3763,411,0,411,0 4241:D2,28|008056073b3c1a17000c0004503b420e000000001400000000000000|@4236,I255| 4242:D15,252|0080560b2c2a1af7000c00021af5000e0e0c000203043b5002041aeb00102a352b362b3b1ae5000e0e0c000303032a02172b3c1ada000e0e0e0c00032a2a2505250526031e3f3b64270429353b1ac4000e0c000303033b029329353c1ab5000e0e0c0003030a29362956372e7d05000229353e1a9e000e0e0e0c0003030a3b56282d0e0e7d0400022936293b1a89000e0e0c000303033c020b29563a1a7d000e0e0c000303041a7700103b500402002a28082b1a6e000e0e0e0c00045029352a3656592b1a61000e0e0c00033c2b1a5b000c00032a2a1a57000c000356892e2b1a5100220d0e0e7b050b000464420e0e00000000f400000000000000|@4237,I105,I218,@878,I113,I107,I251,I234,I231,@3782,I104,I252,I245,I242,I254| 4243:D5,76|00812c1a4a000e0e0e0c00021a45000e0e0c000203252c352d362a352b362a301a35000e0e0c0003292b692d321a2c000e0c00032a2a69270702013b430e0e0e000000004400000000000000|@1785,I105,I218,@3434,@4226| 4244:O1|@4245 4245:D11,116|00862e3b1a71000e0e0c000303033c020b2e1a67001a68000e0c000303041a6300103b503b502e3c1a5d000e0e0c00032928403b1a55000e0e0c0004293b321a4e000e0e0e0c0004501a480033332c1a46003333220d6808342a1a3f00300e0e7e0c00030e0e0e0e000000006c00000000000000|@4247,I234,16777214,I231,@1868,I106,I11,I255,@4246,@4244,@3434| 4246:D17,556|00802b35401a28020e0c0003032d2b362c372a2c564756585669567a568b569c56ad1a0f020c000a2a2d1a0b020c0003402b2b6a29680127050fde2b3528071aee010e0e0e0c000303342b3629352a362b372c382d392e3a2f2306302307569756a856b956ca56db56ec56fd1acd010e0e0c001028072a69296801660fd32b353f1aac010e0c0003034d2b360402002a2a5647565856691aa6010e0e0e0c00065029352a362a353c1a85010e0e0c0003030c293b1a79010e0e0c000302013b03043b5002041a7c01103b502a363f2a6929680127060fd12b353e1a53010c000307c82b362c372d382a3528071a41010e0e0c000303932a362937293b1a31010e0e0c0003037f2a3b69293b6964566756785689569a56ab0202ff0056bc56cd1a26010e0e0e0c0009291a20010e0c00021a1d010e0e0c000203043b5002041a1301103b50293529352a3631331a09010202c7000e0e0c00032a1a00010e0c0002293b1acb000c000303032a020b2a2a1aee000e0e0e0c00033e2a2f220c6b296801270802013b65028d2a353f1aa1000e0e0c0003037f2a360402002a2a5677568856991a9a00020470006d000e0c00065029352a360402002b353c1a72000e0e0e0c0003030e2b363f2a692b2a452d46260302082b362a2a452c465129352a3632341a7f000c00032a1a7c000e0c0002293b1a3b000c000303032a020b2a2a1a6a000e0e0e0c00033e2a2f220d6b296801270b02013b6602013b420e0e0e0e0e000000002402000000000000|@4249,I251,@4250,@3434,@5289,@4263,@5299,@4256,I105,I218,@2229,@5302,@5304,@5306,@5308,@5310,@4248| 4247:S37|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f6479283529 4248:O1|@5312 4249:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f6465283129 4250:O1|@4251 4251:D18,844|0088331a4a030e0e0e0c00021a45030e0e0c000207cf333534362a353b1a38030e0c000303392a372b382c3929220f1a2a030e0e0e0c00033b3b2e2e2d68052e221122112211221122112211221122111a0d030e0e0c000a2a2a6927060fce2a353d1af3020c000303312a3629220d1aea020e0e0e0c00033d2a692c220f220f220f220f220f220f220f220f1ad1020e0e0c000a2a2a6927040fdd2a353e1ab7020c000307db2a36293c2a1aa2020e0e0e0c00021a9d020e0e0c000203442a352b362a35293b1a8f020c000303242b372937293b1a81020e0e0c000303102e3c1a7502020255020e0e0c000302013b6502013b2b2a2506250626041e513b27040201296507dd291a5a020e0e0e0c0002220c220c220c220c220c220c220c1a47020c0009292b2a3b1a2d0202020a020e0e0c0003031a293b1a1d020e0e0c000303043b5002041a2302103b503b5002812a352b362b1af8010e0c00021af5010e0e0c000203043b5002041a0302103b502b352c362a360202bf012d68012a3b0202ac001aee010e0e0e0c000303033c021422123b1ae1010e0e0c00032b2a1adb010c00036403041ad601103b503b502a3c1ad0010e0c000322132a2c1ac9010e0e0c0004502e2d2509250926071ea72607512b220e220e220e220e220e220e220e02020f00220e1a7601220f0e0e0e7b0b0f000a29220c220c220c220c220c220c220c1a86010e0e0e0c00093e2a692c220f220f220f220f220f220f220f220f1a3d010e0e0c000a2a2a6927040fd62a362b372c382b3b1a1e010e0e0e0c00030320293528071a0f010c0003031129362937293b1a01010e0e0c00036502013b02013b03a729362b68012a2a69293b6965220f220f220f220f220f220f220f1ae6000e0e0e0c0009291ac4000e0c00021ac1000e0e0c000203043b5002041aef00103b5029352968012e3b1ac6000e0e0e0c000303033c0214220f3b1ab9000e0e0c00032f2a1ab3000c00036403041aae00103b503b502e3c1aa8000e0c000322102a2c1aa1000e0e0c00045031221422142214221422142214221422141a5f002215020232007b0b15000a29220f1a4a000e0e0e0c00033c3b2d2c6b2e221122112211221122112211221122111a2f000c000a2a2a6927066502013b1f090e000000004403000000000000|@4253,I105,I218,I251,@3434,@4250,@4254,@4256,@5286,@5286,I234,I253,I231,@1879,I106,I255,@4252,@2229| 4252:O1|@5288 4253:S65|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f646528312970726f6365737344656373283129 4254:O1|@4255 4255:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a362b372a68012a2a692d1a28000e0c00022a2a69270702013b420e0e0e000000003c00000000000000|@1785,I105,I218,@4254| 4256:O1|@4257 4257:D20,604|00873c28403b1a57020c0004331a54020e0c000234291a4f020c00021a4d020e0e0c000203c529352a362a35293829291a35020e0e0c00021a31020e0e0c0002039a29352a362a353d1a24020e0c000303352a3632291a0f020c00021a0d020e0e0c0002031d29352a362a2d1a05020e0e0c000303033c0207292503511e283b6502013b6502013b03043b5002450402002b2a2215221522151adc010e0c00065029352a362a353b1ac5010e0e0c000303032a020f2a3629220e1abf010c00033c2a69652a220e1ab6010e0e0e0c00033b2606292503511ea85102023b50502b250526041ecf3b270402013b642b3b1a92010e0e0e0c0003293b2a1a6a010e0e0e0c00021a65010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a5c010e0c00023b2b291a32010e0e0e0c00021a2d010e0e0c0002031729362b3c1a3f010c0003292b25042504511e253b6502012a6522102a30221222122212220c2213221322132213220c1a18010e0c000d22111a13010c0002291a10010e0c00023e2c69293b69280e2c3b6a2c291acc000e0c00021ac9000e0e0c0002031d29352a362a353d1abc000e0c00030309292503511e263b02013b6502013c64030b291acd000e0e0c0002020129402c2b6a2f3b2a1a87000c00021a85000e0e0c000203222a352b362a2c1aa9000e0e0c000303032a02012b2a2a2505250526031e2d3b6602012965293c1a75000e0e0c00030402002c2b22162c221a221a1a79000e0e0c00075029352a363b2b0e0e0c00023d2a2c6a221f3b2b22141a5f00221c7b06200005000000005402000000000000|@4259,I11,@4260,I105,I218,I251,I113,@4263,@2438,@4266,I253,@4268,I106,@4270,@4290,@4292,@2464,I233,@4294,@4258| 4258:O1|@5284 4259:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d62646173283129 4260:O1|@4261 4261:D5,84|00802b1a52000e0e0e0c00021a4d000e0e0c0002032d2b352c362a36293b1a3f000c0003030a2a1a3a002f0e7d06000229352b1a2e000e0e0e0c00022a2a69270502013b420e0e0e000000004c00000000000000|@4262,I105,I218,I251,@4260| 4262:S20|4c6973742e6d61705061727469616c2832292829 4263:O1|@4264 4264:D8,204|00842f353b1ac8000e0c0003030b3c30692f2a453b466402a22f353c1ab1000e0e0c000303142f36292f0e0e0e0c0002302a35452a36466502812f353e1a90000e0c000303103b2d0e0c00022f1a8400452a466402652f36293b1a7b000c000303033c02142c3b1a72000e0e0e0c00032a2a1a6b000c00036403041a6600103b503b50293c1a60000e0c00032d2a1a4b000c0003293b1a37000c0003030b3c3369322a453b46640211293529352a363b2b69220c2a452b462704661f050e0e0e00000000c400000000000000|@4265,I251,@3601,I234,I253,I231,@1850,I106| 4265:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352966696e6442696e64696e67283129 4266:O1|@4267 4267:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@2438,@4266| 4268:O1|@4269 4269:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203122b36291a2c000e0c00021a29002a696502013b420e0e0e0e0e0e000000003400000000000000|@1785,I105,I218,@4268,@741| 4270:O1|@4271 4271:D5,116|008b220d1a71000e0e0c00021a6d000e0e0c0002034d220d35220e362a352b36221022102210221022102210221022102210221022101a47000c000e2a221022102210221022102210221022102210221022101a2e000e0e0e0c000d2a2a69270402013b1f0c0e0e000000006c00000000000000|@1785,I105,I218,@4272,@4270| 4272:O1|@4273 4273:D12,276|008c220e35220f3622103822113922122306221323073b2c291afc000e0c00021af9000e0e0c0002031729362b3c1aef000c0003292b25042504511e233b6502012a651ade002a6922142a1ada000e0e0e0c00033c28403b1ad1000e0e0c00041acd002b2b2f2215221922192219221d2210680a1abd002c69342b2b3322132216221622190c00082c3b1aab000c0003293b2a1a82000e0e0e0c00021a7d000e0e0c000203182a352b362a35292d692b2a2506250626041e253b27040201296522113b1a76000e0e0e0c0003030334020b3422121a69000e0e0c00032c220f3b2d2d3c221122116808221e3b1a4d000e0e0c000303033b0203221e353b2a2c6a27121f0d0e0e0e0e000000000c01000000000000|@4275,I105,I218,I106,@4276,@2047,I11,@4278,@4287,I253,I251,@4274| 4274:O1|@4289 4275:S69|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229 4276:D2,36|00802b56171a20000e0c00033b2a6964420e0e0e0e0e0e0e000000001c00000000000000|@4277,I106| 4277:S80|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563417267732d283129 4278:D13,324|0080560f2c2a1a3f010c00021a3d010e0e0c000203043b5002041a3301103b502a352b362b3b1a2b010c000303032a02172b3c1a22010e0e0e0c00032a2a2505250526031e3f3b64270429353d1a0c010e0c000303392936562e291aea000e0e0e0c00021ae5000e0e0c0002031d29352a362a2d1add000e0e0c000303033c0207292503511e2b3b6502013b6502013b03142956281ac8000e0c00033c2a692956476965028f0402002a2a564b565c566d1ab0000e0c00065029352a362a353b1a99000e0e0c000303032a020f2a3629566a1a8b000c00033c2a69652a566a1a86000e0e0e0c00032a353b1a6e000e0e0e0c000303032a022b2a3629353c1a5b000c000303043b5002041a5f00103b5029362956991a58000e0c00033b2a693c2a6927042a56891a4a000e0e0e0c00032a2a69270764420e000000003c01000000000000|@4280,I105,I218,@878,I113,I107,I251,@2438,@4263,@4281,@4283,I106,@4279| 4279:O1|@4286 4280:S82|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229636c6f73757265526566283129 4281:O1|@4282 4282:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@2438,@4281| 4283:O4|@35,@863,@4285,@4284 4284:O5|@4221,415,0,415,0 4285:S8|6d6170546f417267 4286:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c352d362a353c1a50000e0c000303043b5002041a4700103b502a36292f1a41000e0e0c00033b2a692c311a38000e0c00032a2a69270602013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,I251,@4283,I106,@4279| 4287:D1,20|00805607420e0e0e000000000c00000000000000|@4288| 4288:S84|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563757273697665526566283129 4289:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4274| 4290:O1|@4291 4291:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203252b352c362a36293b1a37000c000303033b020229352b1a2d000e0e0c00022a2a69270502013b420e0e0e000000004400000000000000|@1785,I105,I218,I251,@4290| 4292:O1|@4293 4293:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c363d2b693f2a692b1a2c000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@4292| 4294:O1|@4295 4295:D23,604|008504030031312b30301a53020c00065029352a362b373c28403b1a46020e0e0e0c0004293b3b1a3e020e0e0e0c0004502c2a2d1a35020e0e0c000434291a2f020c00021a2d020e0e0c0002032429352a362a35291a20021a21020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a03020c0003036b1aff01291aeb010c00021ae9010e0e0c0002032429352a362a35291adc011add010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1abf010c000303041abf01103b503b50293529351aa7011aa8010e0c000303043b5002041aa701103b50293765021e293529351a88011a89010e0e0c000303043b5002041a8701103b5029376464038234291a61010e0e0c00021a5d010e0e0c0002032429352a362a35291a64011a51010e0e0c00036403052a68010207292503511e313b6502013b64293b1a33010c0003030e2a1a3e010e0e0e0c00023b64022d293529351a29011a16010e0e0e0c000303043b5002041a1301103b5029372c1a12010e0e0e0c00022a0c0002656402013b0402002b35401ae6000e0e0e0c000303602b3629363b2a22111aeb000c00042b352c23083b2a291ab9000e0e0c00021ab5000e0e0c0002031729362b3c1acb000c0003292b25042504511e243b6502012a652b2d1ab8002f692c22171ab4000e0c00061ab1002a69312a453b462609022a3b1aa600220f1a8d000e0e0c00042c2a1a9b003b22121a89000e0e0c00061a91002a692c2a453b46260429352a36293b1a4b000c000303032f020b2f2a1a76000e0e0e0c0003220f2c452a46270b1f060e0e000000005402000000000000|@4297,@4298,I11,I255,@4461,I105,I218,@97,I251,@2900,@2955,@1840,@108,@4619,@4723,I106,@4740,@4742,@5274,@5276,@5277,@5282,@4296| 4296:O1|@5283 4297:S48|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e636f646547656e6572617465283329 4298:O1|@4299 4299:D7,84|00843c28403b1a4f000c0004040200311a49001a4a00332e1a49002f220c220c1a45000e0e0c000a5029352a362c3b1a3a000e0e0e0c0003322c452a462b4727051f050e0e0e0e0e000000004c00000000000000|@4301,I11,@4302,@4309,@4312,@4300,I253| 4300:O1|@4314 4301:S54|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229 4302:O1|@4303 4303:D2,20|00821a1300100e0e000000000c00000000000000|@4305,@4304| 4304:O4|@35,@863,@4307,@4306 4305:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836292d45 4306:O5|@4308,1431,0,1431,0 4307:S31|6f75746572206c6576656c207265616368656420696e20636f7079436f6465 4308:S63|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f5354415449435f4c494e4b5f414e445f43415345532e736d6c 4309:O1|@4310 4310:D2,20|00801a1300100e0e000000000c00000000000000|@4311,@4304| 4311:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229746f704c6576656c283129 4312:O1|@4313 4313:D1,20|00813b430e0e0e0e000000000c00000000000000|@4305| 4314:D16,540|0088303b1a19020e0e0c000303033c020b301a0f021a10020e0c000303041a0b02103b503b50303c1a05020e0e0c00032928403b1afd010e0e0c0004293b341af6010e0e0e0c000450323b1ad2010e0e0e0c000303033c020b321ac7011ac8010e0c000303041ac301103b503b50323c1abd010e0e0c00032928403b1ab5010e0e0c0004293b220d1aad010e0e0c000450343b1a8a010e0e0e0c000303033c020b341a7f011a80010e0c000303041a7b01103b503b50343c1a75010e0e0c00032928403b1a6d010e0e0c0004293b220f1a65010e0e0c0004502210353d1a5c010e0c0003032722103722113422122212221033301a49012211220c22171a44010e0c000c220c2a452b46650fdc221035401a28010e0c0003033322103722113422122212221033301a15012211220c22171a10010e0c000c2a2c220c1a09010e0e0c0004220d2b452a466602b922103528071ae7000c0003038822103629352a362b372c382d392e3a2f2306302307040400313131313131313131222222222220221a22171ab800222222221abd000e0e0c00125029352a362b382b2b3c221f221f221d221722161aa5000e0e0c00092a1aa0000e0c00021a9d000e0e0c00021a95000e0e0c000203033b020b221628452c3b6b293b696422192b452a46270f0224221033221102021b002211220f322f1a4c0022103422161a48000e0c000c342a453b466427061f090e0e0e0e0e0e000000001402000000000000|@4316,I234,16777214,I231,@1868,I106,I11,I255,I251,@4300,@4317,@4452,@4324,@4315,I105,I218| 4315:O1|@4457 4316:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629 4317:O2|@4319,@4318 4318:O2|@4432,@4317 4319:D29,1620|008a220c350a0e008b050a05e8051e0020064a03f5059103ec03630517043c05fe02ce02f103220c36220d37220e382a3528071a22060e0e0e0c0003037a2a362c2e22112211221122112211221122112211221122111a03060c000d2a352b362c372d382e392f3a302306312307040400313131313131313131222122212221222122212221222822221ad3050c00125029352a362b372b2b2b221e221e221e221e221b1abd050e0e0c00092805220e2b22126b270f0fdd2a353d1a9a050e0e0e0c000303a02a362b3729291a99050e0e0c00021a95050e0e0c0002032429352a362a3529220e1a6e050e0e0e0c00036403052a68010207292503511e313b6502013b64291a60050e0c00021a5d050e0e0c0002031f29352935220c1a39050e0e0c000303043b5002041a4305103b5029376402013b3b302b221422142214221422142214221b22152215221322161a22050e0e0e0c000f3e2e2e6a28052b2b326b27060fd42a353f1aec040e0c000307ca2a3629353e1ade040e0e0e0c000303433b2d2210221022102210220d342217221302023c012213221322121ad8040e0c000e1ad5043b2211221122112211220e1acb040c000828062a6928052c2b306b6602cb29353c1a8d040e0e0c0003031429360402002a3b2b22130e0c000450293665026b29353e1a6c040e0c000303033b025c29353b1a5d040e0e0c000303033b024c2936293b1a78040e0c000303033c0214343b1a6e040e0e0e0c00032a2a1a67040c00036403041a6204103b503b50293c1a5c040204970055000e0e0e0c0003220c2a1a3e040e0e0e0c0003653b2e2b221222122212221222122212221922132213221122141a2b040c000f2b3b2212221222122212220f1a01040e0e0c000828062a6928052c2b316b27046402402b2d22102210221022102210221022102210221022101af0030e0c000d2b2210221022102210221022102210221022102210220f0e0e0c000c28052b2b2e6b65660fdd220c36220d37220e382a220f220f220f220f220f220f220f220f220f220f220e0e0e0e0c000c280f2d2b2d6b27040fcd220c36220d37220e3829220f220f220f220f220f220f220f220f220f220f220e0e0e0e0c000c2c2210221022102210221022102210221022102210220f0e0e0c000c280e2a2e2d6b27050fdd220c36220d3729220e220e220e220e220e220e220e220e220e220e220d0e0e0c000c2b220f220f220f220f220f220f220f220f220f220f220e0e0e0c000c28082a2c6a27040fd6220c3629352a362b372c382d392e3a2f230630230704040002029002313131313131313131221d221d221d221d221d221d2224221e1a8f02020270020c00125029352a362a2a3c221922192219221922161a770222167b0a1900091aa9020fde220c36292b220e220e220e220e220e220e220e220e220e220e1a8f020c000d28102a69650fdd220c36220d373d2a69293b69293b020214021a24020e0c000303032c020b2c2a1a66020e0e0e0c0003652e3431220c302213221322132213221122111a4e020e0e0e0c000d0402002a3b2a1afb010202d4010c00021af5010e0e0c000203043b5002041a2b02103b502a352b36293b1ac7010c0003034e2a353c1abc010e0c000303043b5002041a0b02103b502a362c3b2a1ab4010e0c00021ab1010e0e0c000203172a352b362a2c692a2a2505250526031e213b6602036c0129652f2a452b462603020e2a2c692a2a2505250526031e8650260429352a362a3b020247011a57010c00030303290205280c2b2b6a27060fce220c36220d37220e382b2b2b2211221122112211221122112211221122112211121100010001000c000e1a79012f7d100002220c3629220d220d220d220d220d220d220d220d220d220d220c0e0e0e0c000c280d2a69650fd0220c36292b220e220e220e220e220e220e220e220e220e220e1a35010e0e0c000d280b2a696502b2220c36220d37292e3431220c1a1e010e0e0e0c00062b220f220f220f220f220f220f220f220f220f220f220e0e0e0c000c2b2b2f22122212221222122212221222122212221222121ae600020263000e0e0e0c000e3b2b2b6a27050255220c36220d373e2b2b6a650248220c36220d372a220e220e220e220e220e220e220e220e220e220e220d0e0e0e0c000c28072a2c6a66021d220c36293c220d220d220d220d331a4700020208000c000828062a69651f0b0e000000004c06000000000000|@4321,I251,@4322,@4324,@4315,I105,I218,@1840,@4357,@4363,@844,@4359,I234,I253,I231,@1850,I106,@4365,@4367,@4369,@4370,@4372,@4374,@4409,@4412,@4415,@4427,@4429,@4320| 4320:O1|@4431 4321:S74|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129 4322:O1|@4323 4323:D4,116|008b220d1a71000e0e0c00021a6d000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a27000c000d2a2a69270702013b1f0c0e0e000000006c00000000000000|@1785,I105,I218,@4322| 4324:O1|@4325 4325:D18,420|00903c28403b1a9f010c00043c28403b1a95010e0e0c00043c28403b1a89010e0e0c00041a85012a693c28403b1a78010e0c0004293b1a77011a78010e0c0004503b2214291a70010e0c00021a6d010e0e0c0002031729362b3c1a63010c0003292b25042504511e233b6502012a65293b1a50010e0c000303033c020b291a47011a48010e0c000303041a4301103b503b50293c1a29010e0e0c00032928403d1a05010e0e0c0004293b2d1a06010e0e0e0c0004503c28403b1aec000e0c0004040200221c1a0c01221b220c220c2218221822182218221868093122192e1af70031692f2214221422170e0e0e0c000a502935333b1ae4000e0c00032d3b1adb000c00033b2a293b1ad5000e0e0c000303032a0248293c1aca000e0e0e0c00032a3c1abf000c00032b3c1ab7000c0003293c1a8b000c0003342a1a9f000c0003293b1a9b000c000303052c306902012f292f2508250826061e523b270665221c1a85000e0e0c00022f3b1a6f000c00032e22223b2d2d22203b680728092a69220f3b1a57000c0003221d2b4531462a472f4827131f110e0e000000009c01000000000000|@4327,I11,@4328,@4330,I255,I105,I218,I106,I234,16777214,I231,@1868,@4348,@4355,I253,I251,I240,@4326| 4326:O1|@4356 4327:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829 4328:D3,44|00802b031056073b3c1a24000e0c0004503b5002023b501a1a00420e0e0e0e0e000000002400000000000000|@4329,I255,@844| 4329:S88|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382972656343616c6c283129 4330:O1|@4331 4331:D9,116|00802b363c1a70000e0c000303051a6b0002532b35293b1a66000e0e0e0c00036403051a5e00023e2b363c1a4a000e0e0e0c000303051a4f00022b2b35293c1a3e000e0e0e0c00036403051a3e0002162b363c1a22000e0e0e0c000303051a2f0002031a2e00420e000000006c00000000000000|@4333,I234,@2016,I251,@4334,@2016,@4341,@2016,@4332| 4332:O5|0,0,0,@4336,@4345 4333:S9|7072696e742d747269 4334:O5|0,0,0,@4336,@4335 4335:O2|@4339,0 4336:O2|@4337,0 4337:O2|0,@4338 4338:O5|@4308,1329,1329,0,0 4339:O2|3,@4340 4340:S7|54726943616c6c 4341:O5|0,0,0,@4336,@4342 4342:O2|@4343,0 4343:O2|3,@4344 4344:S10|547269436c6f73757265 4345:O2|@4346,0 4346:O2|3,@4347 4347:S8|547269556e726566 4348:D2,52|00822d2d562756385649565a566b567c568d569e1a21000e0e0c000b2c2a35452a364664440e0e0e000000002c00000000000000|@4305,@4349| 4349:O1|@4350 4350:D15,356|008932220c2a1a5f010c00021a5d010e0e0c000203043b5002041a5301103b502a352b362b3b1a4b010c000303032a02172b3c1a42010e0e0e0c00032a2a2505250526031e3f3b64270429353c1a2c010e0c0003031429360402002a220e2b220c0c00045029366502bb29353e1a0c010e0c0003030a34300e0c0002503b02a529353b1af6000e0e0e0c0003030f293629220d310e0c0003503b6402882936220c0344293b1ad8000e0c000303033c02142e3b1ace000e0e0e0c00032a2a1ac7000c00036403041ac200103b503b50293c1abc000e0c00032f2a3c1ab6000e0e0e0c00046402013b2a3b1a93000c000303033c02142e3b1a8a000e0e0e0c00032b2a1a83000c00036403041a8a00103b503b502a3c1a78000e0c00032f2a1a63000c000366333b1a5a000e0e0e0c0003333b1a4f000c00032a2a2e220f220f1a5a000e0e0e0c00063c2a69292e6927061f0a0e0e0e0e0e0e000000005c01000000000000|@4352,I105,I218,@878,I113,I107,I251,I234,I253,I231,@1879,I106,I255,@1850,@4351| 4351:O1|@4353 4352:S85|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382970726576283229 4353:D10,300|00842f1a2a010e0e0e0c00021a25010e0e0c000203ca2f3530362a301a19010e0e0c000303033c02922a353b1a09010e0e0c0003031b2f353b1afc000e0c0003030c2a3630361af3000c000302013b026a2a353c1ae1000e0e0c0003031b2f353c1ad4000e0c0003030c2a3630361acb000c000302013b02422a353d1ab9000e0e0c0003031b2f353d1aac000e0c0003030c2a3630361aa3000c000302013b021a2a353e1a91000e0e0c0003030c2f353e1a84000e0c000302013b030b303c1a7e002f0e7e090003303c1a73000c00032a2a3232321a6c00330e0e7b070a00062c3b1a63000c00032e2a692e3b2b1a5b000c0004502d3b1a4e000e0e0e0c0003293c1a4b000c00032f3b2b1a3e000e0e0e0c000450293c1a2600310e7e0b0003000000002401000000000000|@4354,I105,I218,I251,I113,I107,@4351,I253,I255,I106| 4354:S104|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829707265762832296d616b65436c6f73757265456e747279283229 4355:D9,164|00812b03033c02492c3b1a9b000c000303033c021456073b1a91000e0e0c00032d2a1a8b000c00036403041a8600103b502c3c1a82000e0e0e0c000356172a1a6a000e0e0e0c0003293c1a6f000c0003652d3b1a52000e0e0e0c000303033c021456173b1a45000e0e0c00032e2a1a3f000c00036403041a4600103b502d3c1a36000e0e0e0c000356272a2c1a3500300e0e0e7b05060004000000009c00000000000000|@4305,I234,I253,I231,@1850,I106,I251,@1879,I255| 4356:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4326| 4357:O1|@4358 4358:D10,492|008d220e3b1ae8010e0c000303033b0fd3220e35220f362a35293528071ad0010e0c000303cd29362c362212291ac4010e0c00021ac1010e0e0c0002031d29352a362a22181ab4010e0c000303033c0207292503511e293b6502013b641a98010e0c00022b352c362d372e382f39303a312306322307040400313131313131313131222422242224222422242224222422241a6b010c00125029352a362a2a220d2220222022202220221c1a56010e0e0e0c000929220e6922223c1a4a010e0e0e0c00032922132223222322232223222322232223222322232223222322231a2a010202f4000e0e0e0c000f2b2a6927120fdc29353f1af7000c0003038929362c362212291aec000e0c00021ae9000e0e0c0002031d29352a362a22181adc000e0c000303033c0207292503511e293b6502013b641ac0000e0c00022b2a221422142214221422101ac5000e0e0c000828062a69292d6922183c1aab000c000329322219221922192219221922192219221922192219221922191a8f000c000f2b2a69270802522b362a3422122212221222122212221222112211221022120e0e0c000c292b6922153c1a5b000c0003292f2216221622162216221622162216221622162216221622161a3f00020208000c000f2b2a692705661f0e0e0e0e0e00000000e401000000000000|@4360,I251,I105,I218,I113,@4324,@4315,I106,@4357,@4359| 4359:O1|@4361 4360:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e736572742831296d617041726773283229 4361:D9,244|008631353c1af0000e0c0003031431360402002a332b340e0e0c00045029356502bf31353e1ad0000e0c0003030a302f2c0e0e0e7d09000231353b1aba000e0e0e0c0003031131362932300e0e0c0003503b2a6964028a3136310343293b1a9b000c000303033c02142d3b1a92000e0e0e0c00032a2a1a8b000c00036403041a8600103b503b50293c1a80000e0c00032e2a3c1a7a000e0e0e0c00046402013b2a3b1a57000c000303033c02142d3b1a4e000e0e0e0c00032b2a1a47000c00036403041a4e00103b503b502a3c1a3c000e0c00032e2a1a27000c00033d2a6927041f070e0e0e0e0e00000000ec00000000000000|@4362,I251,I234,I253,I231,@1879,I106,I255,@1850| 4362:S75|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296c6f6361646472283229 4363:O1|@4364 4364:D7,260|008c220d3b1a00010e0c000303033b0fd4220d35220e362a352b3529353f1ae7000c00030311293629353b1ada000e0e0e0c00036402013b6403642b35293629362e3622152b1ac3000c00031ac1000e0e0c00022c2a221622162216221622161ab1000e0e0c000828062a69292d6922193c1aa3000c00032934221a221a221a221a221a221a221a221a221a221a221a1a89000e0e0c000e2b2a69270a02522b362a342212221222122212220f220f220f2215221022160e0e0c000c292b6922143c1a53000c0003292f221522152215221522152215221522152215221522151a390002020b000e0e0c000e2b2a692705661f0d0e0e0e0e00000000fc00000000000000|@4360,I251,I113,I218,@4359,I106,@4363| 4365:O1|@4366 4366:D10,492|008d220e3b1ae8010e0c000303033b0fd3220e35220f362a35293528071ad0010e0c000303cd29362c362212291ac4010e0c00021ac1010e0e0c0002031d29352a362a22181ab4010e0c000303033c0207292503511e293b6502013b641a98010e0c00022b352c362d372e382f39303a312306322307040400313131313131313131222422242224222422242224222422241a6b010c00125029352a362a2a220d2220222022202220221c1a56010e0e0e0c000929220e6922223c1a4a010e0e0e0c00032922132223222322232223222322232223222322232223222322231a2a010202f4000e0e0e0c000f2b2a6927120fdc29353f1af7000c0003038929362c362212291aec000e0c00021ae9000e0e0c0002031d29352a362a22181adc000e0c000303033c0207292503511e293b6502013b641ac0000e0c00022b2a221422142214221422101ac5000e0e0c000828062a69292d6922183c1aab000c000329322219221922192219221922192219221922192219221922191a8f000c000f2b2a69270802522b362a3422122212221222122212221222112211221022120e0e0c000c292b6922153c1a5b000c0003292f2216221622162216221622162216221622162216221622161a3f00020208000c000f2b2a692705661f0e0e0e0e0e00000000e401000000000000|@4360,I251,I105,I218,I113,@4324,@4315,I106,@4365,@4359| 4367:O1|@4368 4368:D4,116|008b220d1a71000e0e0c00021a6d000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a27000c000d2a2a69270702013b1f0c0e0e000000006c00000000000000|@1785,I105,I218,@4367| 4369:O1|10 4370:O1|@4371 4371:D4,116|008b220d1a71000e0e0c00021a6d000e0e0c00020349220d35220e362a220e220e220e220e220e220e220e220e220e220e22190e0e0c000c2a221022102210221022102210221022102210221022101a2e000e0e0e0c000d2a2a69270402013b1f0c0e0e0e0e0e0e000000006c00000000000000|@1785,I105,I218,@4370| 4372:O1|@4373 4373:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4372| 4374:O1|@4375 4375:D25,956|008b220d1ab9030e0e0c00021ab5030e0e0c000207cf220d35220e362a353b1aa6030e0e0e0c000303662a372b382c392b22122212221222121a90030e0c00062d221322132213221322132213221322132213221322131a76030e0e0e0c000d2b220f220f220f220f2217221622112211221a221d221a0e0e0c000c3f2e693b2d2b6a3c2c69292e692b2a69270a0fdd2a353d1a32030e0e0e0c000303802a362a221022102210221022102210221022102210221022101a16030e0e0e0c000d2a220c220c220c220c22142213220e220e2217221a22170e0e0c000c2935280c1ae5020202c6020e0e0c0003032629362a373c2a69292e69293b1acb020c000303032c020b2c2a1aca02220d7e170003270402073c2a69292c6964660fcf2a353e1aa4020e0c000307d12a362922102210221022101aa0020e0c00062b221122112211221122112211221122112211221122111a7a020e0e0e0c000d2b220c220c220c22142213220e221302023b02220f1a68020e0c000a293b3b221422102210221022171a58020e0c00090402002a2a1a50020e0c00035029352a362a1a1f020c00021a1d020e0e0c00021a15020e0e0c00020325291a2e020e0e0e0c00022f3b1a03020c0003030329020b29301a1a02220f7e19000364023a2a1a11020e0e0c00023d2a692b1a09020202bb010e0e0c0002313b1acf0102021c000c0003030329020b29321aee010e0e0e0c00032b2a69270427080fd52a372b38293528071aa4010e0c000307d729362b22122212221222121a94010e0c00062a352b362c372d382e392f3a302306312307040400313131313131313131221e221e221e222622252220222522211a8f010c00125029352a362b372c3822103b1a81010e0e0c000303033c0218221c3b1a75010e0e0c000322112a1a6e010e0e0e0c00036403041a6601103b503b5022103c1a5f010c0003221d2a2c1a59010e0e0c00042213222222222222222222222222222222222222222222221af5000e0e0c000d2d03033c024f22133b1a14010202ba000e0c000303033c021c22213b1a0501020251000e0e0c000322142a1afa000e0e0e0c00036403041afe00103b503b5022133c1aeb000c000322222a1ad6000e0e0e0c00036430302b222022202220222822281ad7000c00093b22132b6a292d69271502552a22112211221122111a6c000e0c00062c221222122212221222122212221222122212221222121a52000e0e0e0c000d2b220e220e220e220e22162215221022102219221c22190e0e0c000c3b2c2b6a292c692704656502013b1f0c00000000b403000000000000|@4377,I105,I218,I251,@4378,@4374,@4381,@4383,@4385,@4390,@4395,@4397,@4399,@4401,@4406,@4376,@4324,I234,I253,I231,@1879,I106,I255,@1850,@4315| 4376:O1|@4408 4377:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129 4378:O1|@4379 4379:D7,268|00842e3b1a09010e0e0c00032f3b1aff000c0003293c1afb000c0003313b2b1af6000e0e0e0c000450323b1aee000e0e0e0c000303033c0214303b1ad2000e0e0e0c0003332a1ad7000c00036403041ad200103b503b50323c1ab8000e0c0003312a3b1ab2000e0e0e0c0004343b1aab000c000303033c0218313b1a92000e0e0e0c0003220c2a1a96000e0e0e0c00036403041a8e00103b503b50343c1a74000e0c0003322a301a6e000e0e0e0c0004220d3b1a66000e0e0e0c000303033c0218323b1a4a000e0e0e0c0003220e2a1a4e000e0e0e0c00036403041a4600103b503b50220d3c1a2b000c0003332a3b1a26000e0e0e0c00043127091f050e0e0e000000000401000000000000|@4380,I253,I106,I255,I234,I231,@1879| 4380:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296d616b654465636c283129 4381:O1|@4382 4382:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4381| 4383:O1|@4384 4384:D5,76|00842f1a4a000e0e0e0c00021a45000e0e0c000203252f3530362a3629323232321a34000e0c00062b333333331a2c000e0c00062a2a69270502013b1f050e0e000000004400000000000000|@1785,I105,I218,@4378,@4383| 4385:O1|@4386 4386:D5,108|0088331a6a000e0e0e0c00021a65000e0e0c00020341333534362a352b362c37220e220e220e220e220e220e220e220e1a45000e0e0c000c2a220d220d220d220d220d220d220d220d1a30000e0c000a2a2a69270402013b1f090e0e0e0e0e0e000000006400000000000000|@1785,I105,I218,@4387,@4385| 4387:O1|@4388 4388:D8,244|008a33353436220c37220d38220e39220f3a2210230622112307040400313131313131313131221b221b221b221b221b221b221b221b1abf000c00125029352a362b372c382a034b22183b1aae000e0e0e0c000303033c021822133b1aa1000e0e0c000322192a1a9a000e0e0e0c00036403041a9200103b503b5022183c1a8b000c000322142a3c1a85000e0e0c00046402013b22193b1a62000e0e0e0c000303033c021822133b1a55000e0e0c0003221a2a1a4e000e0e0e0c00036403041a4600103b503b5022193c1a3f000c000322142a2d1a39000e0e0c0004221b30306a27101f0b0e0e0e00000000ec00000000000000|@4389,@4324,I234,I253,I231,@1879,I106,I255| 4389:S103|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129636f7079446563283329 4390:O1|@4391 4391:D12,316|0087321a3a010e0e0e0c00021a35010e0e0c000207d6323533362a352b362c372b3b1a23010c000303033c0214343b1a1a010e0e0e0c00032c2a1a13010c00036403041a0e01103b503b502b3c1a08010e0c0003220c2a1af2000e0e0e0c00036403702a2a3c220d220d220d2211220e1ae9000e0e0c00092c3b1acb000c000303033c0214313b1ac2000e0e0e0c00032d2a1abb000c00036403041ab600103b503b502c3c1ab0000e0c0003322a1a9b000c0003292c693022123c221222122212221222121a98000e0c00092a2a69270502212d220e692d2a220f220f220f220f220f220f1a7800221002020a000e7b0a10000927050230303b1a67000c00030312312f2f2f33301a5d00310e0e0e7b080a0007313b3b32323232321a4100330e0e0e7b0a0a00091f080e0e0e0e0e0e000000003401000000000000|@4393,I105,I218,I234,I253,I231,@1850,I106,@4315,@4390,I251,@4392| 4392:O1|@4394 4393:S111|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e7328312970726f63657373436c6f7375726573283329 4394:D10,156|0085301a9a000e0e0e0c00021a95000e0e0c00020375303531362a352b362c372a2a3b220e220e220e220e220e1a78000e0c00092c3b1a73000c000303033c0214313b1a6a000e0e0e0c00032d2a1a63000c00036403041a5e00103b503b502c3c1a58000e0c0003322a1a43000c0003292c6930221022102210221022101a3f000c00072a2a69270a02013b1f060e0e000000009400000000000000|@1785,I105,I218,@4315,I234,I253,I231,@1850,I106,@4392| 4395:O1|@4396 4396:D6,108|00812c1a6a000e0e0e0c00021a65000e0e0c0002033e2c352d362a36293528091a55000e0e0c00030402002c2a1a4c000e0c00035029352a362c030b2f2b69332a452b466402092f2a69332c452a46642707020b1a29002c2a35452a36466443000000006400000000000000|@1991,I105,I218,I251,@4395,@1990| 4397:O1|@4398 4398:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@4397| 4399:O1|@4400 4400:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4399| 4401:O1|@4402 4402:D6,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a352b36293528091a43000c000303043b5002041a3b001029362b2a692d1a35000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,I251,@4403,@4401| 4403:O4|@35,@863,@4405,@4404 4404:O5|@4308,1024,0,1024,0 4405:S8|61734d757475616c 4406:O1|@4407 4407:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@4406| 4408:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4376| 4409:O4|@35,@863,@4411,@4410 4410:O5|@4308,1062,0,1062,0 4411:S30|64656353657175656e63655769746846696e616c4578703a20656d707479 4412:O4|@35,@863,@4414,@4413 4413:O5|@4308,1064,0,1064,0 4414:S46|64656353657175656e63655769746846696e616c4578703a206c617374206973206e6f742061204e756c6c446563 4415:O1|@4416 4416:D15,452|00802b353c1ac0010e0c000307dc2b362c372d382e39291ab2010e0e0e0c00021aad010e0e0c000203393b2c291a9c010e0c00021a99010e0e0c0002031729362b3c1a8f010c0003292b25042504511e233b6502012a65293f1a7c010e0c0003640fd42b1a65010e0e0c00021a61010e0e0c000203043b5002041a5f01102b352936292a690402002f2b2a1a3e010e0e0e0c00021a39010e0e0c000203392a352b362a362c352d362b2b1a33010c000303032b02012a2c2b1a29010e0e0c000303032c02012a2a2a692f2a250a250a26081e4726080209292c2a35452a3646515129352a363b32290202c8001add000e0e0c00021ad9000e0e0c0002031729362b3c1acf000c0003292b25042504511e283b6502012a652928071abb000c000303722a3b1ac1000e0e0c000303101abb002b1a9f0002025e000c000302012a2c3b1aa4000e0c0003030c1a9f002d1a83000c000302012c2a2a1a94000e0c0003293b1a8f000c0003293c1a5b000c000303032a020b2a3d1a76000e0e0e0c0003293e1a73000c00032f2a1a67000c0003270602013b27072903093c2e2e2e2e6805020d2c2b2f2e1a5200347b06080005270502012b420e0e00000000bc01000000000000|@4418,I251,I105,I218,I106,I233,@2229,I250,I249,I234,@677,I107,I231,I109,@4417| 4417:O1|@4419 4418:S81|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e7665727443617365283129 4419:D9,172|00832e1aaa000e0e0e0c00021aa5000e0e0c000203832e352f362a352b36311a8e000e0e0e0c00021a89000e0e0c0002030b3135280f2b332c6b640249313c1a76000e0e0e0c0003031e3e2a3b6a293b69322a69291a64000e0c000228052a1a5e003c6b2704021e3e2a3b6a293b69322a69291a4e000e0e0e0c000228052a1a46003c6b27042c3333331a3f000c00053d2b2e2c6b270602012b1f040e0e0e0e00000000a400000000000000|@4421,I105,I218,I251,@4422,@4424,@4425,@4420,@4417| 4420:O3|3,I113,0 4421:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e76657274436173652831297265636f6e76657274283129 4422:O1|@4423 4423:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4422| 4424:O3|3,I251,0 4425:O1|@4426 4426:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4425| 4427:O1|@4428 4428:D4,116|008b220d1a71000e0e0c00021a6d000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a27000c000d2a2a69270702013b1f0c0e0e000000006c00000000000000|@1785,I105,I218,@4427| 4429:O1|@4430 4430:D5,84|00842f1a52000e0e0e0c00021a4d000e0e0c000203292f3530362a35293629333333331a3a000e0e0e0c00062c343434341a30000e0c00062a2a69270602013b1f050e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@4378,@4429| 4431:D4,156|008c220e1a99000e0e0c00021a95000e0e0c00020314220d1a85000e0e0c00021a81000e0e0c000202013b035a220e35220f36220f352210362c3529372e362a2213221322132213221322132213221322132213221e0e0e0e0c000c2e2a2c6a302f221722172217221722172217221722172217221722171a2d000e0e0c000e2a2a69270a02013b1f0d0e0e0e0e0e0e000000009400000000000000|@3711,I105,I218,@4320| 4432:D11,732|008c220d220c220c220c220c220c220c220c220c220c220c56b70e0e0e0c000c220d353c1ab9020e0e0c00030329220d36220e37220f382b2b2b221222122212221222122212221222122212221222110e0c000e66021d220d220d220d220d220d220d220d220d220d220d220d56c70e0e0c000c2210220e220e220e220e220e220e220e220e220e220e56d70e0c000c3c28403b1a4d020e0e0c0004293b1a47022212691a45020e0e0c0004502a1a3f020c0002291a3c020e0c00021a39020e0e0c000207cf293529352a362b3730353c1a0c020e0c000307cc30363137323833392c2f2a3528061af5010e0e0c0003030c293528061ae7010c000302013b03b92a362a362a2a1ad6010e0e0e0c000303033c029a2a353b1ac5010e0e0c0003031b29353b1ab8010e0c0003030c2a362a361ac7010c000302013b02722a353c1a9d010e0e0c0003031b29353c1a90010e0c0003030c2a362a361a9f010c000302013b024a2a353d1a75010e0e0c0003031b29353d1a68010e0c0003030c2a362a361a77010c000302013b02222a353e1a4d01020221010e0e0c0003031029353e1a3c010202fd000e0c000302013b03052a680102013b65024c2a3528071a1f010c0003030c293528071a13010c000302013b03302a362b372b362c372b2a1a1a010e0e0e0c00031a0d010e0e0c000203033b020c2c2b2506250626042019013b270402013b652e2b1ad4000e0c000303033c02352e1adb000c00021ad9000e0e0c000203232a1aca000e0e0e0c00021ac5000e0e0c0002030c2e352b351a9f000c000302013b02013b2a1aa6000e0e0e0c00021aa1000e0e0c0002030c293c1a7d000e0e0c000302013b0319220e32692e1a8b000c00022a2a693c322b32220d680566021b220e3269293b69220f1a72000e0e0e0c00023c342c2c220d6805662706020f312c69293b693c2d2b220c2f6805652704020e2c1a48000e0c00023d2d302c6b6427051f0d0e0e0e0e0e0e00000000d402000000000000|@4434,I251,I11,@4435,I255,@4448,I105,I218,I113,@4433,@4415| 4433:O1|@4451 4434:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e64283329 4435:D15,308|00802b363c1a30010e0c000303051a2b010fdd2b353b2a1a26010e0e0e0c00036403051a1e010fdd2b363c1a0a010e0e0e0c000303051a0f010fdd2b3529352d363c1a07010c00032a2a6956473b1aff000c00032a2a0e0e0e0c00026429353b1add000e0e0c000303972939291ae4000e0c00021ae1000e0e0c0002035f29361ad1000e0e0c00021acd000e0e0c000203482935353e1aa7000c000303312935362928281a99000e0e0c000303033c021b29287b1a89000e0e0c000303033c020b29285b1a79000e0e0c00036402013b1a85000e0e0c000202013b02013b031d2a1a7800691a78002a691a77002a02022e00693b3e3c3b2d68056602012a6402012929020219003b691a5c002a691a5b002a693b3c3b020206003b2d68052709420e0e0e0e0e0e0e000000002c01000000000000|@4437,I234,@2016,I251,@4438,@2016,I107,I253,I105,I218,@1087,@1088,@1060,@1058,@4436| 4436:O5|0,0,0,@4440,@4445 4437:S16|7072696e742d73696d696c6172697479 4438:O5|0,0,0,@4440,@4439 4439:O2|@4443,0 4440:O2|@4441,0 4441:O2|0,@4442 4442:O5|@4308,1127,1127,0,0 4443:O2|3,@4444 4444:S9|446966666572656e74 4445:O2|@4446,0 4446:O2|3,@4447 4447:S7|53696d696c6172 4448:O1|@4449 4449:D7,436|00802b35280f1aaf010c000303142b362c372d382968012c2c2b6a29680127050fdb2b3528051a8f010c000307d12b362c3729353e1a80010e0c000307cb2936291a78011a71010e0e0c00032a1a68011a65010e0e0c00032a03033c02012907d02d1a5b010c00021a59010e0e0c0002033d2d352e36291a46010e0e0e0c00021a41010e0e0c000203212936293b1a27010c000303112b3529353e1a1a010e0e0e0c00036402013b6402013b6502013b03452d352e36293529352c352936291afe000e0e0e0c00020328291af2000e0e0e0c000203043b5002041aeb0010301ae2000e0e0e0c00022a2d2b6a2968016502013b270602a52d1ac5000204a800a5000c00021abd00020297000e0e0c000203412d36291aa8000e0c00021aa5000e0e0c0002032929352a36293b1a890002026b000e0e0c000303112a3529353e1a76000e0e0e0c00036402013b6502013b6402013b03452d352e362935293529362d352a1a5a000e0e0e0c000203282a1a4e000e0e0e0c000203043b5002041a4b0010301a3e000e0e0e0c00022b2b2b6a2968016502013b270602013b02013b6602013b6502013b4200000000ac01000000000000|@4450,I251,I113,I105,I218,@3062,@3062| 4450:S87|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e6428332966696e6443617365283129 4451:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a352b362a2a692c1a2b000c00022a2a69270602013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@4433| 4452:O1|@4453 4453:D12,268|00822d35280e1a07010c000303632d36291a00012f2f1aff000c000529291afb000c00021af9000e0e0c0002032d29352a362a1ae6000e0e0e0c00021ae1000e0e0c00021ad9000e0e0c00020309292503511e353b02013b6502013c6403033b020c1abf0028452b3b6b293b696465028a2d353f1a99000e0e0c0003037c2d3629353d1a8a000e0e0e0c000303682936293b1a93000c000303033c02142e3b1a8a000e0e0e0c00032a2a1a83000c00036403041a7e00103b503b50293c1a78000e0c00032f2a1a63000c0003291a4c000e0c00021a49000e0e0c00021a41000e0e0c000203033b020a2f28452b3b6b293b69646602013b6402013b440e0e0e0e000000000401000000000000|@4455,I251,@4452,@4454,I105,I218,@33,I234,I253,I231,@1850,I106| 4454:O1|@4456 4455:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f646528362967657450726f7073283129 4456:D4,76|00832e1a4a000e0e0e0c00021a45000e0e0c000203212e352f362a2f2f320e0e0e0c00042a3131311a2d000e0e0c00052a2a69270402013b1f040e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@4454| 4457:D5,156|0087323528091a97000c0003037f323629352a362b382c392d3a220e220d220d220d220d220d22131a79000e0e0c0008293b2a1a72000e0e0e0c00021a6d000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965220f03033c0218291a40000e0c00021a3d000e0e0c00021a35000e0e0c000230302c3131312f680728092a69270a0201321f08000000009400000000000000|@4459,I251,@4458,I105,I218| 4458:O1|@4460 4459:S83|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f707950726f63436c6f73757265283329 4460:D5,84|0086311a52000e0e0e0c00021a4d000e0e0c00020329313532362a2e34343434341a3c000e0c00082a3434343434341a32000e0e0e0c00082a2a69270402013b1f070e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@4359,@4458| 4461:O1|@4462 4462:D11,220|00822b3b1ad9000e0e0c000303033c020b2b1acf001ad0000e0c000303041acb00103b502b3c1ac7000c00032928403b1ac1000e0e0c0004293b2f1aba000e0e0e0c0004502d3b1a96000e0e0e0c000303033c020b2d1a8b001a8c000e0c000303041a8700103b502d3c1a83000c00032928403b1a7d000e0e0c0004293b311a76000e0e0e0c0004503c28403b1a64000e0c00043c28403c1a59000e0e0c00043c28403b1a4d000e0e0c0004293b1a4b001a44000e0c000450341a430030220d220d3032311a3c0022110e7b0a0c000900000000d400000000000000|@4464,I234,16777214,I231,@1868,I106,I11,I255,@4465,@4461,@4463| 4463:O3|@4502,@4601,@4501 4464:S56|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329 4465:O1|@4466 4466:D19,228|00802b363c1ae0000e0c000303051adb0002c02b352c363c1ad5000e0e0c0003293b1ac3000c000303051ac70002822a352a3c1aba000e0e0e0c00032a2a691ab6003b1ab6000e0e0e0c00031ab1002a0e0c0002642a2a0e0e0c0002642e362e3c1a8c000e0c00032a2a691a8a003b1a8a000e0e0e0c00031a89002a0e0c0002642a2a0e0e0c000264291a7b00691a7b002a691a7a002a691a79002a691a78002a69322a691a74002a691a73002a69270f1a70002a693b3c3b3b2d6805293b691a65002a691a64002a693b3c3b3b2d68052708420e0e0e0e00000000dc00000000000000|@4468,I234,@2016,I107,@1071,@109,I253,@4485,@4488,@1074,@1058,@4491,@1058,@1059,@1058,@4493,@1086,@1058,@4467| 4467:O5|0,0,0,@4496,@4495 4468:S14|7072696e742d7573616765536574 4469:O1|@4470 4470:D2,20|00801a13002c6942000000000c00000000000000|@360,@4471| 4471:D3,44|00802b365617362d35291a23002c692d1a2100310e0e0e7b050600040e0e0e0e000000002400000000000000|@4473,@4474,@4472| 4472:O1|@4476 4473:S7|61646450502d32 4474:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@4475| 4475:S18|566563746f722e7072657474792833292d45 4476:D17,292|00822d1a22010e0e0e0c0002293c1a1b010c00032d3b1a17010c000303051a13010fdd2d2a1a04010e0c00031a09012a69311af3000c00022a2a293b1afd000e0e0c000303042a3502b4293c1af1000e0e0c00032a3c1ae7000c00032b3c1adf000c0003220e2a1ada000e0e0e0c00032e352f36293b1acf000c00030312293c1ac9000e0e0c00031ac5002a69640261293b1abf000c00030310293c1aad000e0e0c00033b2a69640247293c1a7d000e0e0c00032c2a22130e0c00032f220e1a86000e0e0e0c00031a8d000e0e0c0002030d1a87002d691a86002a696402012c2a2a692d3c1a64000e0c00032a2a69270529302509250926071ebf3b270702020400652927041a5b002a693b3e3b3b2d68052704440e0e0e000000001c01000000000000|@4478,I15,I107,I232,@4479,@4482,I251,I240,I253,I113,I106,@4479,I234,I218,@441,@442,@4477| 4477:O2|3,@4484 4478:S16|566563746f722e707265747479283329 4479:O2|@4480,0 4480:O2|3,@4481 4481:S4|2e2e2e5d 4482:O2|@4483,0 4483:O2|3,93 4484:S9|66726f6d4c6973745b 4485:O4|0,@4486,3,1 4486:O1|@4487 4487:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2621,@14,I253| 4488:O4|0,@4489,3,1 4489:O1|@4490 4490:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2621,@14,I253| 4491:O2|3,@4492 4492:S8|6c6f63616c73203d 4493:O2|3,@4494 4494:S6|61726773203d 4495:O2|@4499,0 4496:O2|@4497,0 4497:O2|0,@4498 4498:O5|@4308,218,218,0,0 4499:O2|3,@4500 4500:S8|5573616765536574 4501:O2|@4611,@4463 4502:D46,2460|008732350a100050055f00ff0448097f0322006d0953098703b603e30338050404210547032403e8033236333734382b2d220d220d220d220d220d220d220d1a5e090e0e0e0c000a2b220d220d220d220d220d220d220d220c0c000928052b2b2e6b27050fd1323633373438220c39343b1a30090e0c0003293b1a2b090c000303051a270902242928403b1a22090e0e0e0c0004220d3c2b3b2e1a17090c000650291a13090c0002502964220c3b1af3080c0003293b1aef080c000303051aeb0802242928403b1ae6080e0e0e0c0004220e3c2b3b2e1adb080c000650291ad7080c00025029642e221122112211221122112211221122100e0c000922103b1aa2080e0e0e0c0003293b1a9b080c000303051a970802282928403b1a92080e0e0e0c000422123c2b3b2e1a87080c000650291a830802024f080c000250296422113b1a5f080c0003293b1a5b080c000303051a570802242928403b1a52080e0e0e0c000422133c2b3b2e1a47080c000650291a43080c0002502964292c69311a3a080e0e0e0c00023b2a1a33080c000322173b1a0e080e0e0e0c00032a2a1a23080c00036503041a1e08103b50323b22183c2d1afe070e0e0e0c000650301afb070c00023b2a1af7070c000322173b1ad2070e0e0e0c00032a2a1ae7070c00036503041ae207103b50313b22183c2d1ac2070e0e0e0c0006220f220c221a220c221b2216221f221d221d221d221d1abb070c000c0402002a2a1ab4070e0c00035029352a36302a69221b221d221c221c1aa1070e0e0c0006291a9c070e0c00021a99070e0e0c000203043b5002041a8f071029362c2a1a8b070c0003332d6929291a74070e0c00021a71070e0e0c0002031d29352a362a222322251a6a070e0e0e0c000450292503511e293b6502013b642219222322232223222322232223222322220e0e0c00092e1a2c070e0c00021a29070e0e0c000203043b5002041a2b07102e35293b1a27070c000303042213024d221335280d1a16070e0e0e0c0003032f2213362214372b1a08070e0c00022b3b1afb060c0003030329020b292c1af6060e0e0e0c0003280d2a2d6a2704020e291ae7060c0002280d2a22166a643c2c302c221d6805271d0fd43236333734382a220c220c220c220c220c220c220c340c000928102d2b2d6b27040fce32363337343829220c220c220c220c220c220c220c340e0c00092c220d220d220d220d220d220d220d220c0c0009280f2a2e2d6b27050fd132363f2a69640fcb323633372934343434343434330e0e0c00092b220c220c220c220c220c220c220c340e0c000928082a2c6a27040fcd323629352a362b372c382d392e3a2f2306221022102210221022102210221056f70e0e0e0c000f402a69650fdd1a13060fdd3236292b343434343434341a0706020287050c000a28112a69650fdd323633373c2a69293b69293b1ad60502026a050e0e0e0c000303032c020b2c2a1ada050e0e0e0c0003652c220c220c220c220c220c220c220c56b71ac3050c000b0402002a3b2a1a830502042f052d050e0e0c00021a79050e0e0c000203043b5002041a9f05102a352b36293b1a75050e0e0c000303562a353c1a68050202fc040e0c000303043b5002041a7b05102a362c3b2a1a36050e0e0e0c00021a31050e0e0c000203172a352b362a2c692a2a2505250526031e233b660203bf04290202ba04652f2a452b462603020e2a2c692a2a2505250526031e925002029e04260429352a362a3b1afb040c00030303290205280d2b2b6a27060fcd3236333734382b2b2b220e220e220e220e220e220e220e56d8220f0e0e7b0c0d000b32362933333333333333320e0e0c0009280e2a69650fcf3236292b343434343434341acb040c000a280c2a69650fd5323633372d3b1a44040e0c0003293c1a57040c00032f3b2b1aaa040e0e0e0c0004502f3b1a26040e0e0e0c0003220c3b1a1a040e0e0e0c0003293b1a13040c000303051a0f0402242928403b1a0a040e0e0e0c0004220e3c2b3b2e1aff030c000650291afb030c0002502964220d3b1adb030c0003293b1ad7030202b3030c000303051acf0302242928403b1aca030e0e0e0c0004220f3c2b3b2e1abf030c000650291abb030c0002502964292c69220d3b1a9803020278030e0c0003293b1a8f030c000303051a8b0302282928403b1a860302025a030e0e0e0c0004220f3c2b3b2e1a77030c000650291a73030c0002502964220f3b1a53030c00033b292b1ac6030e0e0e0c000303033b022a293c1a56030e0e0e0c000322122a3c1aa5030e0e0c0004502a3c1aa2030e0e0e0c00032502501e363b646422123b1a0e030e0e0e0c000322133b3c1a79030e0e0c000450220d291a29030e0e0c00021a25030e0e0c0002039729352a362a35293b1a5f030c000303033c0214221a3b1acd020e0e0c00032a2a1a4b030c00036403041a4603103b50293c1ace020e0e0e0c0003221b2a3b1a1d030e0e0c0004502a3b1a1e030e0e0e0c000303033c021422173b1a89020e0e0c00032b2a1a07030c00036403041a0203103b502a3c1a8a020e0e0e0c000322182a3b1ad9020e0e0c0004502c250626051ea33b270502013b64220f221922192219221922192219221922180c0009220f22191ac1020e0e0c000322193b1a26020e0e0e0c0003293b1a1f020c000303051a1b0202242928403b1a16020e0e0e0c0004221b3c2b3b2e1a0b020c000650291a07020c0002502964221a3b1ae7010c0003293b1ae3010c000303051adf0102242928403b1ada010e0e0e0c0004221c3c2b3b2e1acf010c000650291acb010c0002502964292c69221b3b331a1f020c000450341ab7010c00023b2a1ab3010c0003221c3b1a8e010e0e0e0c00032a2a1aa3010c00036503041a9e01103b50220c3b221d3c2d1a7d010e0e0c00062b3b6922102a6964221f2221222022201a85010e0e0c0006291a80010e0c00021a7d010e0e0c000203252936291a6c010e0c00021a69010e0e0c0002030d2936293b1a6f010c00036402013b6402013b03043b5002041aa3011029352a362935291a38010e0c00021a35010e0e0c00021a2d010e0e0c000203043b5002041a7f01102b291a15010e0e0c00021a11010e0e0c0002031d29352a362a2227221d222a1a60010e0c000550292503511e2a3b6502013b64221c220d1a4c010e0c000329222022292229222922292229222922291a38010e0c000a221e1a33010c00022a2a1a23010c00033b22122b6a311aab000c00021aa9000e0e0c00021aa1000e0e0c000203032902062809322b3b6b27230239323633373e2b2b6a65022e323633372a34343434343434330e0e0c000928072a2c6a6602143236292d3231220c321ad000320e0e7b080b00071f080e0e0e0e0e0e000000009409000000000000|@4504,@4505,I253,I113,I49,I11,I195,I47,I15,I106,I233,@4508,@4510,@3479,@4512,I105,I218,@2232,@4526,@4534,@2229,I251,@4529,@4537,@4528,@4539,@4540,@4542,@4544,@4575,@4577,@4579,I255,I247,I239,I234,I231,@1879,@4581,@4583,@4586,@4589,@2821,@4595,@4597,@4503| 4503:O1|@4599 4504:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129 4505:O1|@4506 4506:D4,108|0088331a6a000e0e0e0c00021a65000e0e0c000203403335343629220c220c220c220c220c220c220c220c1a4a000e0e0e0c000a2b352c362a220e220e220e220e220e220e220e22160c0009292b69292e69270702013b1f090e0e0e0e0e0e0e000000006400000000000000|@4507,I105,I218,@4505| 4507:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296d617072696768742832292829 4508:O4|11,@316,0,@4509 4509:O5|@1852,210,0,210,0 4510:O1|@4511 4511:D14,364|008a220c1a69010e0e0c00021a65010e0e0c000207cd220c35220d362a352b36220f1a53010c00023b2a1a4f010c000322103b1a4a010e0e0e0c00032a2a1a43010c00036503041a3e01103b5022103b22113c2d1a35010e0e0c000650220e1a16010e0e0e0c00023b2a1a0f010c0003220f3b1a0a010e0e0e0c00032a2a1a03010c00036503041afe00103b50220f3b22103c2d1af5000e0e0c00062d220e22132212221022102210221022160c000922123b1aca000e0e0e0c0003293b1acf000c000303051acb0002282928403b1ac6000e0e0e0c000422143c2b3b2e1aab00020276000c000650291aaf000c000250296422123b1a87000c0003293b1a8f000c000303051a8b0002242928403b1a86000e0e0e0c000422143c2b3b2e1a6b000c000650291a73000c0002502964292c692e3369292b69220d221b221b221b221b221b221b221b221b221b221b1a4f000c000c2a2a69271002013b1f0b0e0e000000006401000000000000|@1785,I105,I218,I15,I106,I253,I233,@4508,I195,I113,I49,I11,I47,@4510| 4512:O1|@4513 4513:D19,580|00842e3b1a41020e0e0c000303051a3b020fcd2e3b1a38020e0c0003030c2e1a32021a33020c000302013b03043b5002041a2802102e28403b1a24020e0c00043b302a1a1e020e0e0e0c000303043b50029c313b2a1a10020e0c00021a0d020e0e0c000203642a352b362a362e1af8010e0c00021af5010e0e0c000203033c0210291aeb010c00022f2a1ae7010c00036403041ae201103b50292f1ade010e0e0e0c0003293b1a9f010c000364030b2c3c1acc010e0c000302012c2b2a2506250626041e6f3b2704020129652b2b2b1ab2010e0e0e0c0004502a3c1aa201020219000e0e0e0c00032502501eaa5050291a95010e0e0c00025029642e3b1a7c010e0c0003293b1a3f010c000303051a3b010fcd293b1a38010e0c0003030c291a32011a33010c000302013b03043b5002041a2801102928403b1a24010e0c00043b2b2a1a1e010e0e0e0c000303043b50029c333b2a1a10010e0c00021a0d010e0e0c000203642a352b362a352e1af8000e0c00021af5000e0e0c000203033c0210291aeb000c00022f2a1ae7000c00036403041ae200103b50292f1ade000e0e0e0c0003293b1a9f000c000364030b2c3c1acc000e0c000302012c2b2a2506250626041e6f3b2704020129652b2b2b1ab2000e0e0e0c0004502a3c1aa200020219000e0e0e0c00032502501eaa5050291a95000e0e0c00025029643b33291a67000c00021a65000e0e0c0002031729362b3c1a6b000c0003292b25042504511e223b6502012a65332b2b3333311a5c00220c0e7b080b0007000000003c02000000000000|@4515,I113,I49,I233,16777215,I234,@4516,I11,I232,I105,I218,I15,I247,@866,I253,I106,I255,I47,@4514| 4514:O1|@4518 4515:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129 4516:O4|4,@394,0,@4517 4517:O5|@868,147,0,147,0 4518:D5,76|0085301a4a000e0e0e0c00021a45000e0e0c00020325303531362a32323232321a35000e0e0c00072a33333333331a2b000c00072a2a69270402013b1f060e0e000000004400000000000000|@1785,I105,I218,@4519,@4514| 4519:O1|@4520 4520:D12,324|008530353136311a3e010e0e0e0c00023b3b292c1a35010e0e0c000303032a02c7293c1a2a010e0e0e0c0003220c2b1a22010e0e0e0c0003293b1a1b010c000303033c026729220d1a0d010e0e0c000303033c02572b1a03010c00021a01010e0e0c000203033c02102f1adb000c00022c2a1ad7000c00036403041ae600103b502f2c1ace000e0e0e0c0003293b1ac7000c0003641ac8000e0c000203033c020b343b1aae000e0e0e0c000303032c022b2b3b1aa2000e0e0e0c000303071aa7002d6902172b3c1aa2000e0e0e0c00033b2a6928062a3c6a29306966292c2505250526031ed23b66652f1a5b000c00022a3b292c1a55000e0e0c000303032a022f293c1a4a000e0e0e0c0003332b1a43000c00032b2a2e22113422111a51000e0e0c0007292c2505250526031e3a3b6627071f060e0e0e0e000000003c01000000000000|@4522,I15,I247,I239,I253,I113,I105,I218,@866,@4523,I107,@4521| 4521:O1|@4524 4522:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129 4523:O3|6,@844,1 4524:D12,204|00852f3b1ac9000e0e0c000303033c029c2f2e1aba000e0e0e0c000303033c028c301aaf000c00021aad000e0e0c000203033c02102c1aa3000c0002312a1a9f000c00036403041a9a00103b502c311a96000e0e0e0c0003293b1a73000c0003641a74000e0c000203033c0240303b1a7a000e0e0e0c000303033c02142b3b1a66000e0e0e0c0003312a1a63000c00036403041a5e00103b50303c1a5a000e0e0e0c00032c2a1a3f000c00036403032e020c3d316928062a3c6a293169651f0600000000c400000000000000|@4525,I113,I105,I218,I15,I247,@866,I253,I234,I231,@1850,I106| 4525:S96|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129283329 4526:O1|@4527 4527:D10,196|00812c3b1ac1000e0e0c000303172b3b1ab5000e0e0c000303043b5002041aab00103b02902c352d362d1aa3000c00021aa1000e0e0c000203043b5002041a9700102d352e362c352d362c3b1a79000e0e0c000303032a02492a35280d1a68000e0c0003032f2a362b372e1a6e000e0e0e0c00022b3b1a4f000c0003030329020b292c1a5a000e0e0e0c0003280d2a2d6a2704020d2c1a4b000c0002280d2a2d6a64292b692f2e1a3e000e0e0e0c00032a2a692709430e0e00000000bc00000000000000|@3980,I251,@3979,I105,I218,@3979,@4529,@4531,@4528,@4526| 4528:O1|@4533 4529:O1|@4530 4530:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363c2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4529| 4531:O1|@4532 4532:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4531| 4533:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363c2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4528| 4534:O1|@4535 4535:D12,404|00822d352e362e3b1a8d010e0e0c00033b292b1a86010e0e0e0c000303043b5002a2293c1a79010e0e0c0003312a1a67010c00032b1a6c010e0c00021a69010e0e0c000203033c02102e1a5f010c00022c2a1a47010c00036403041a5201103b502e2c1a32010e0e0e0c0003293b1a43010c000303032a02212a3b1a36010e0e0e0c000303032902112a2a1a2a010e0e0e0c000303032a0201292d3c1a01010e0e0c0003220c2a2c1a11010e0e0c0004502e3c1a0a010e0e0e0c0003250626051eaf2605502e3b1ace000e0e0e0c00033b292b1ac6000e0e0e0c000303033b02a4293c1aba000e0e0e0c0003312a1aa7000c00032b1aac000e0c00021aa9000e0e0c000203033c02102e1a9f000c00022c2a1a87000c00036403041a9200103b502e2c1a72000e0e0e0c0003293b1a83000c000303032a02212a3b1a76000e0e0e0c000303032902112a2a1a6a000e0e0e0c000303032a0201292d3c1a41000e0e0c0003220c2a2c1a51000e0e0c0004502e3c1a4a000e0e0e0c0003250626051eaf3b2705270544000000008c01000000000000|@4536,I253,I247,I106,I105,I218,I15,@866,I113,I234,I255,I239| 4536:S71|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f646528332961646446726f6d5361766564283129 4537:O1|@4538 4538:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4537| 4539:O1|11 4540:O1|@4541 4541:D4,100|0088331a62000e0e0e0c00021a5d000e0e0c000203393335343629220c220c220c220c220c220c220c220c1a42000e0e0e0c000a2b220c220c220c220c220c220c220c22140c0009292b69270402013b1f090e0e0e0e0e0e000000005c00000000000000|@4507,I105,I218,@4540| 4542:O1|@4543 4543:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4542| 4544:O1|@4545 4545:D25,1100|0089341a4a040e0e0e0c00021a45040e0e0c000207db3435220c362a353c1a37040c000303702a362a220e220e220e220e220e220e220e220e220e1a1e040e0e0e0c000b2a220e220e220e220e220e220e220e22160c00092935280d1af9030e0e0c0003032629362a373c2a69292e69293b1ae3030c000303032c020b2c2a1ade03220d7e150003270402073c2a69292c6964660fd52a353d1abc030e0c000307cb2a36293b2a1aa6030e0e0e0c00021aa1030e0e0c000203312a352b362a3629372d3b1a91030e0e0c0003030329020b292e1a8e030e0e0e0c00032c2a2507250726051e3e3b2705020129652a29020244031a5a030e0e0e0c00021a55030e0e0c000203b329352a362a35293b1a57030c000303033c021422103b1a4d030e0e0c00032a2a1a47030c00036403041a4203103b50293c1a3e030e0e0e0c000322112a1a26030e0e0e0c0003293b1a2b030c0003651afc020e0c000203041a1f03103b50293b1aff020204c70229010e0e0c000303033c0214220c3b1aed020e0e0c00032a2a1ae7020c00036403041af202103b50293c1ade020e0e0e0c0003220d2a3b1ae1020e0e0c0004502b250526041ec43b270402013b642c2210221022102210221022102210221022101a8b020c000b323b1a93020c0003293c1a97020c0003343b2b1a9e020e0e0e0c0004502d221322132213221322132213221322131a87020c000a291a84020e0c0002291a80020e0c000231220e22162216221622162216221622161a6c020e0c000a2922151a66020e0e0e0c0003291a10020e0c00021a0d020e0e0c00021a05020e0e0c0002031c303b1afd010e0e0c000303032b020b2b311a360222117e19000302223d2a69313b1ade010e0e0e0c000303032c020b2c321a1a020e0e0e0c00032a2a6965270b0fcd2a362b372a3b1ac7010c000303033c0214220c3b1abd010e0e0c00032b2a1ab7010c00036403041ab201103b502a3c1aae010e0e0e0c0003220d2a1a96010e0e0e0c0003293b1a9b010c0003651a6c010e0c000203041ab701103b502a3b1a6f010c000303033c0214313b1a66010e0e0e0c00032b2a1a5f010c00036403041a6a01103b502a3c1a56010e0e0e0c0003322a3b1a5a010e0e0e0c00042d2211221122112211221122112211221122111a12010e0e0e0c000b2d3b1a13010c000303033c0218220f3b1a09010202cd000e0e0c00032e2a1aff000c00036403041afa00103b502d3c1af6000e0e0e0c000322102a1ade000e0e0e0c0003220c3b1ad2000e0e0e0c0003293c1ad3000c0003220e3b2b1ad9000e0e0c0004502b3b1ac2000e0e0e0c0003030c301ae6000e0e0e0c000202013b03032d025e302215221522152215221522152215221d0c0009323b1a7b000c000303033c021422143b1a71000e0e0c0003332a1a6b000c00036403041a7600103b50323c1a62000e0e0e0c000322152a3b1a65000e0e0c0004503b342c306b2931696627096502013b1f0a0e0e0e0e0e0e000000004404000000000000|@4547,I105,I218,I251,@4544,@4548,@4550,I234,I253,I231,@1850,I106,I113,@4552,@1879,I255,@4555,@4557,@4559,@4561,@4563,@4566,@4568,@4570,@4546| 4546:O1|@4573 4547:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129 4548:O1|@4549 4549:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4548| 4550:O1|@4551 4551:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4550| 4552:O4|@35,@863,@4554,@4553 4553:O5|@4308,500,0,500,0 4554:S21|6170706c79466e3a20416c72656164792075736564 4555:O1|@4556 4556:D4,92|0088331a5a000e0e0e0c00021a55000e0e0c000203353335343628062b693434343434343422130e0e0c00092a220d220d220d220d220d220d220d220d1a28000e0c000a2a2a69270402013b1f090e0e000000005400000000000000|@1785,I105,I218,@4555| 4557:O1|@4558 4558:D5,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a3528061a4f000c0003030d2a37293c1a43000c00036402013b0310291a3a000e0e0e0c00022b2a6964020a291a2a002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I251,@4557| 4559:O1|@4560 4560:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363c2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4559| 4561:O1|@4562 4562:D4,116|0088331a72000e0e0e0c00021a6d000e0e0c0002034d333534362a352b3629352a362b372c382d392e3a2f23062213221322132213221322132213221b0c000f2b2a3b6a2d221022102210221022102210221022101a28000e0c000a2a2a69270702013b1f090e0e000000006c00000000000000|@1785,I105,I218,@4561| 4563:O1|@4564 4564:D12,220|00812c1ada000e0e0e0c00021ad5000e0e0c000203b12c352d362a352b362a3b1ac5000e0e0c000303033c02142f3b1aba000e0e0e0c00032b2a1ab3000c00036403041aae00103b502a3c1aaa000e0e0e0c0003302a1a93000c0003293b1a9b000c0003030a2d321a9500337e0a00032c3b1a73000c000303033c0214313b1a6a000e0e0e0c00032d2a1a63000c00036403041a6e00103b502c3c1a5a000e0e0e0c0003322a3b1a5e000e0e0e0c0004502d2d2c6a2f341a46000e0e0e0c00032a2a69270902013b430e0e0e0e0e0e0e00000000d400000000000000|@4565,I105,I218,I234,I253,I231,@1850,I106,I113,@4563,@1879,I255| 4565:S98|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129636f7079456e7472696573283129 4566:O1|@4567 4567:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4566| 4568:O1|@4569 4569:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4568| 4570:O4|@35,@863,@4572,@4571 4571:O5|@4308,462,0,462,0 4572:S30|636f70794465636c61726174696f6e733a20416c72656164792075736564 4573:D10,492|00802b350a100022002200a501d70133003600d401cc0014012200220022003101220022002200d9002b3528091ac0012d0e0e0e7e0300030fdd3c0fdc2b362c3729353e1aa9010e0e0c000303812936291aa0010e0c000203041a9b01103b5028662a1a96010e0e0e0c0003035d28672a1a8c010e0c0003291a88011a89010e0e0c0003291a7c011a65010e0e0c00036503352b291a5c010e0c00021a6d010e0e0c0002031e29352a362a35291a60010e0c0002640309292503511e273b02013b6502013c6402013b02013b6402013b650fcc2b36291a37012d0e0e7d0400022b3629291a0d010e0e0c00021a1d010e0e0c0002031d29352a362a1a12010e0e0e0c00020309292503511e273b02013b6502013c6502c8c600c4002b362c372a1aed000e0e0c0002030a291ae2002e0e7d0500023b6502a72b362c372a291ab3000c00021ac5000e0e0c0002034629352a362a353c1a98000e0c0003030d2a36291aac000e0c000264021a2a353d1a7f000c000303033c020c2a37291a91000e0e0c0002640309292503511e4e3b02013b6502013c640310291a74002e02023e000e0e0e7d0500023b6502332b362c372d382b1a5a000e0e0e0c000203192a1a4e000e0e0e0c0002030a291a42002f0e7d0600023b02013b6602043c02013c4200000000e401000000000000|@4574,I251,I105,@1784,I150,I153,-536870912,I243,I218,@4546| 4574:S50|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7369646545666665637446726565283129 4575:O4|@35,@863,@4411,@4576 4576:O5|@4308,567,0,567,0 4577:O4|@35,@863,@4414,@4578 4578:O5|@4308,569,0,569,0 4579:O1|@4580 4580:D4,108|0088331a6a000e0e0e0c00021a65000e0e0c000203403335343629220c220c220c220c220c220c220c220c1a4a000e0e0e0c000a2b352c362a220e220e220e220e220e220e220e22160c0009292b69292e69270702013b1f090e0e0e0e0e0e0e000000006400000000000000|@4507,I105,I218,@4579| 4581:O1|@4582 4582:D11,188|00812c1aba000e0e0e0c00021ab5000e0e0c000203912c352d362a35293b1aa7000c000303033c02142e3b1a9e000e0e0e0c00032a2a1a97000c00036403041a9200103b50293c1a8e000e0e0e0c00032f2a1a77000c00032b3b1a6b000c000303033c0214303b1a62000e0e0e0c00032c2a1a5b000c00036403041a5e00103b502b3c1a52000e0e0e0c0003312a3b1a4e000e0e0e0c00042e331a47000c00032c2a69270802013b430e0e0e0e0e0e0e00000000b400000000000000|@1785,I105,I218,I234,I253,I231,@1850,I106,@1879,I255,@4581| 4583:O4|@35,@863,@4585,@4584 4584:O5|@4308,409,0,409,0 4585:S15|636f6d707574654b696c6c53657473 4586:O4|@35,@863,@4588,@4587 4587:O5|@4308,410,0,410,0 4588:S14|4e6f74206b696c6c4265666f7265 4589:O1|@4590 4590:D10,268|00832e3528061a07010c000303043b5002041aff00102e3629353e1af2000e0e0e0c0003032a2e3b1aed000e0e0c00033b2a1ae7000c00036403041ae200103b502e3c2f1add002f0e0e0e7b0507000429353d1aba000e0e0e0c000303422936293b1ac3000c000303033c02142d3b1aa6000e0e0e0c00032a2a1a9f000c00036403041a9a00103b50293c1a9e000e0e0e0c00032e2a311a8a00317b0509000429353b1a6a000e0e0e0c000303043b5002041a7b00102936293c1a6f000c0003293b1a63000c000303033c0214303b1a46000e0e0e0c00032a2a1a3f000c00036403041a3a00103b50293c1a3e000e0e0e0c0003312a321a2a00327b050a0004000000000401000000000000|@4592,I251,@4591,I253,I231,@1879,I255,I234,I106,@4591| 4591:O4|@35,@863,@4594,@4593 4592:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129657874656e644c696665283129 4593:O5|@4308,421,0,421,0 4594:S14|4e6f7420616e2045787472616374 4595:O1|@4596 4596:D4,108|0088331a6a000e0e0e0c00021a65000e0e0c000203453335343629220c220c220c220c220c220c220c220c1a4a000e0e0e0c000a2b352c362a352b3629221022102210221022102210221022180c00092b2a2e6a293069270902013b1f090e0e000000006400000000000000|@4507,I105,I218,@4595| 4597:O1|@4598 4598:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4597| 4599:D12,1284|008530353c1a00050e0c000307d13036303b1af7040c0003293c1af3040c0003323b2b1aee040e0e0e0c000450313b1ada040e0e0e0c00033b2a1adb040c00036403041ad604103b50313c1abe040e0e0e0c0003293b1ac7040c0003640313303b1aa8040e0c00031ab9040e0e0c000202013b333b1a94040e0c0003333b1a8b040c00033b2a1a8f040c00036403041a8a04103b50333c1a72040e0e0e0c0003293b1a7b040c000303032a02212a3b1a6e040e0e0e0c000303032902112a2a1a66040e0e0e0c000303032a020129220c3b1a38040e0c00033b2a1a3b04020224000c00036403041a4204103b50220c3c2b1a20040e0c0004503c306928062a2f6a27080fd430353e1afd030e0e0c000307c92f3b1af5030e0e0c0003293c1aef030c0003313b2b1aea030e0e0e0c000450303b1ad6030e0e0e0c00033b2a1ad7030c00036403041ad203103b50303c1aba030e0e0e0c0003293b1ac3030c00036403132f3b1aa4030e0c00031ab5030e0e0c000202013b323b1a90030e0c0003323b1a87030c00033b2a1a8b030c00036403041a8603103b50323c1a6e030e0e0e0c0003293b1a77030c000303032a02212a3b1a6a030e0e0e0c000303032902112a2a1a62030e0e0e0c000303032a020129343b1a3503020414032b000c00033b2a1a33030c00036403041a3e03103b50343c2b1a1d030e0e0c00045028061a2e032e6a27060fcf30353d1afa020e0e0e0c000307d23036303b1aef020c0003293c1aeb020c0003323b2b1ae6020e0e0e0c0004502b3b1aee020e0e0e0c000303033c02142f3b1ac2020e0e0e0c00032c2a1ac3020c00036403041abe02103b502b3c1aaa020e0e0e0c0003302a1a9b020c0003293b1aa7020c00036503472b3b1aa4020e0c000303033c02142e3b1a7a020e0e0e0c00032c2a1a7b020c00036403041a7602103b502b3c1a62020e0e0e0c00032f2a1a53020c0003641a64020e0c000202013b333b1a40020e0c00032d3b1a5302020216020c000303033c0218313b1a26020202a7000e0e0e0c00032e2a1a23020c00036403041a1e02103b502d3c1a0a020e0e0e0c0003322a1afb010c0003293b1a07020c000303032b02212b3b1afa010e0e0e0c000303032902112b2a1af2010e0e0e0c000303032b020129303b1ae1010e0e0c000303033c0214343b1ab6010e0e0e0c0003312a1ab7010c00036403041ac201103b50303c1a9e010e0e0e0c0003220c2a2c1a95010e0e0c0004503d326928062a316a270a0fcf3036303b1a74010e0c0003293c1a6f010c0003323b2b1a6a010e0e0e0c0004502b3c1a5a010e0e0e0c0003293b1a67010c000303033c0214323b1a3e010e0e0e0c00032a2a1a3f010c00036403041a3a01103b50293c1a26010e0e0e0c0003332a1a17010c0003293b1a23010c0003660313303b1a04010e0c00031a15010e0e0c000202013b2c3c1af4000e0c0003343b1ae7000c00032e3c1ae3000c0003293b1af3000c000303033c0214220c3b1ac9000e0e0c00032a2a1acb000c00036403041ac600103b50293c1ab20002028d000e0e0e0c0003220d2a1a9e000e0e0e0c0003293b1aa7000c000303032c02212c3b1a9a000e0e0e0c000303032902112c2a1a92000e0e0e0c000303032c0201292e3b1a81000e0e0c000303033c0214220f3b1a55000e0e0c00032f2a1a57000c00036403041a6200103b502e3c1a3e000e0e0e0c000322102a2c1a35000e0e0c0004503b346928062a336a270c1f060e0e0e0e0e0e0e00000000fc04000000000000|@4600,I251,I253,I106,I255,I231,@1850,I113,I218,I234,@1879,@844| 4600:S66|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296c6f6361646472283129 4601:O2|@4602,@4463 4602:D17,332|008d3b220d291a47010c00021a45010e0e0c0002031729362b3c1a3b010c0003292b25042504511e223b6502012a65293c1a24010e0c0003293b1a1f010c000303033c020b291a17011a18010e0c000303041a1301103b50293c1afb000c00032928403b1a05010e0e0c0004293b2d1afe000e0e0e0c00045022132a2211220f0e0c000422125667220f220f220f220f220f220f220f1adb000c000a291ad8000e0c00022c3b1ad3000c00033b2a293b1acd000e0e0c000303032a0233293c1ac2000e0e0e0c00032a3c1ab7000c0003293c1a83000c0003322a1a9f000c0003292f69292e2507250726051e3d3b270565291a5b000c00021a59000e0e0c000203043b5002041a7f001029352a1a40000e0c00021a3d000e0e0c000203043b5002041a6700102a362f221a2f221a221a221a30221b316809270b1f0e0e0e0e0e000000004401000000000000|@4604,I105,I218,I106,I234,16777214,I231,@1868,I11,I255,@4605,@4603,I253,I251,I240,@2229,@2232| 4603:O1|@4607 4604:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f70794c616d626461283729 4605:O1|@4606 4606:D4,100|0088331a62000e0e0e0c00021a5d000e0e0c0002033d3335343629220c220c220c220c220c220c220c220c1a42000e0e0e0c000a28062c69220c220c220c220c220c220c220c22140e0c0009292b69270402013b1f090e0e000000005c00000000000000|@4507,I105,I218,@4605| 4607:D6,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a3528061a47000c000303043b5002041a3f00102a362b3728062b2b6a2c1a35000e0e0c00022a2a69270602013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,I251,@4608,@4603| 4608:O4|@35,@863,@4610,@4609 4609:O5|@4308,647,0,647,0 4610:S11|6d617020636c6f73757265 4611:D21,884|0089303b1a71030e0e0c0003293b1a6b030c000303051a670302242928403b1a62030e0e0e0c0004323c2b3b2e1a58030e0c000650291a53030c0002502964313b1a34030e0c0003293b1a2f030c000303051a2b0302242928403b1a26030e0e0e0c0004333c2b3b2e1a1c030e0c000650291a17030c0002502964220e220d220d220d220d220d220d220d56c70c0009220c3b1ae2020e0e0e0c0003293b1adb020c000303051ad70202242928403b1ad2020e0e0e0c0004220e3c2b3b2e1ac7020c000650291ac3020c0002502964220d3b1aa3020c0003293b1a9f020c000303051a9b0202242928403b1a96020e0e0e0c0004220f3c2b3b2e1a8b020c000650291a87020c0002502964292c69311a7e020e0e0e0c00023b2a1a77020c000322133b1a52020e0e0e0c00032a2a1a67020c00036503041a6202103b50323b22143c2d1a42020e0e0e0c000650301a3f020c00023b2a1a3b020c000322133b1a16020e0e0e0c00032a2a1a2b020c00036503041a2602103b50313b22143c2d1a06020e0e0e0c000622162216221622162216221622162216121600010001000e0e0c000922153b1ace010e0e0e0c0003293b1ac7010c000303051ac30102242928403b1abe010e0e0e0c000422173c2b3b2e1ab3010c000650291aaf010c000250296422163b1a8f010c0003293b1a8b010c000303051a870102242928403b1a82010e0e0e0c000422183c2b3b2e1a77010c000650291a73010c0002502964292c69293b69332a69642219221b221a221a1a6c010e0c0006291a68010e0c00021a65010e0e0c000203252936291a54010e0c00021a51010e0e0c0002030d2936293b1a47010c00036402013b6402013b03043b5002041a37011029352a362935220d221e22201a2b010c000422232221222122212221222122212221122100010001000e0e0c00092d3b1aff000c000303042214024d221435280d1aee000e0e0e0c0003032f2214362215372f1ae8000e0c00022b3b1ad3000c0003030329020b292c1ad6000e0e0e0c0003280d2a2d6a2704020e2d1ac7000c0002280d2a22176a642c3b1aa4000e0c00030304220c024d220c35280d1a92000e0e0e0c0003032f220c36220d372e1a8c000e0c00022b3b1a77000c0003030329020b292c1a82000e0e0e0c0003280d2a2d6a2704020e2c1a6b000c0002280d2a220f6a643d2c2c2c6b271b1f0a000000006c03000000000000|@4613,I253,I113,I49,I11,I195,I47,I15,I106,I233,@4508,@4512,I105,I218,I251,@4614,@4534,@4529,@4616,@4528,@4612| 4612:O1|@4618 4613:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f7079436f6e64283329 4614:O4|@35,@863,@4585,@4615 4615:O5|@4308,693,0,693,0 4616:O1|@4617 4617:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4616| 4618:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4612| 4619:O2|@4621,@4620 4620:O2|@4712,@4619 4621:D129,2772|00802b350a11000a05ea020606660666022400de0876084304170a89063e04b60482058a044a01a20096022b362c372d382b2d1aa20a0e0e0e0c0003291a9c0a0e0c00021a990a2a693b3c3c3b2d6805291a900a0e0c000203041a8b0a103b502e310e0e0e0c00022e3b1a7f0a0c000303051a7b0a02031a7a0a2b3b691a780a2a692b2a691a740a2a692e2a693b3e3b3b2d6805291a4c0a0e0c000203041a470a103b5029270f0fcb2b362c372d382b3b1a4c0a0e0c0003030c1a470a2c1a470a0c000302012b293d1a400a0e0c00032b3b1a2b0a0c0003030c1a270a2c1a270a0c000302012b293d1a200a0e0c0003291a1c0a691a1c0a2a692d2a691a180a2a6927071a150a0e0e0c00023e2a69291ad1090e0e0c000203041acb09103b502c2f0e0e0e0c0002291af409691af4092a692c2a693b3e3b3b2d6805291aa4090e0c000203041a9f09103b5029270a0fd72b362c372d382a352b353b3b292c1ac6090e0e0e0c000303032a0274293c1aba09020251090e0e0e0c00032f360402002c28082b1aa8090e0c00045029352a362c2b1a9e090e0e0e0c00033c2b1a97090c00032a2a1a93090c0003293b1a3b090c0003641a88090e0c0002293b1a2b090c0003030332020b323c1a3a090e0e0e0c00032932250b250b26091e7f3b270965293c1a25090e0e0c00032c3c1a1b090c0003291a4c0969282f2a692c2a691a45092a6927051a12090e0e0e0c00023e2a69291acd080e0e0c000203041ac708103b502e3202029d080e0e0e0c000231330e0e0e0c0002291a1009691a10092a691a0f092a691a0e092a692e2a69302a693b3e3b3b2d6805291a87080c000203041a8308103b502927110fd52b36293c1a98080e0c00031ae1082a1ae1080e0e0c00033e2a69291a59080e0e0c000203041a5308103b502927040fd02b361ac20828281ab9080e0e0c00033e2a69291a31080e0e0c000203041a2b08103b502b2d1aa3080c0003291aa0080e0c00022b2a693b3c3c3b2d6805291a06080e0e0e0c000203041aff07103b502927070fd22b362c372d382e39291ae7070c00021a3d080e0e0c000203312935293b1aef070c0003030c1aeb072a1aeb070c0003020129293d1ae4070e0c00031a41082a1a2d080e0e0c0003660217293c1aac07020283070e0c000303051a270802031a2608291a2608691a26082a69651abc070e0c00023e2a69291a7907020258070e0e0c000203041a6f07103b502e300e0e0e0c00022e311afb070c00032e320e0e0e0c0002293b691aee072a691aed072a693b3c3b3b2d6805291a38070e0c000203041a3307103b501ad5071ad6071a9f07020202070c000329287d1a92070e0e0e0c00033e2a69291a09070e0e0c000203041a0307103b50293b691aaa072a692e2a691aa6072a69293b1aef060c00030304220c020a220c2a1a94070e0c00031a91072a691a90072a691a8f072a6922112a6922132a693b3c3c3b2d6805291ab2060e0e0e0c000203041aab06103b5029271b0fd71a68070fd42b362c372a2c0e0c00022a2d0e0e0e0c0002291a5407691a54072a691a53072a692d2a691a4f072a693b3e3b3b2d6805291a66060e0e0e0c000203041a5f06103b5029270a0fdd2b36292b0c0002291a2807691a28072a693b3c3c3b2d6805291a37060c000203041a3306103b502927050fda2b361a0a0728281a99060e0e0c00033e2a69291a11060e0e0c000203041a0b06103b502b2d1aeb060c0003291ae8060e0c00022b2a693b3c3c3b2d6805291ae6050e0e0e0c000203041adf05103b502927070fd32b362c37292c1abe060204a905a7050e0c0003291ab4060e0c00021ab1062a693b3c3c3b2d6805291aa8050e0c000203041aa305103b502e300e0e0e0c0002291a9006691a90062a691a8f062a691a8e062a692e2a693b3e3b3b2d020257056805291a6e050e0e0e0c000203041a6705103b5029270d0fd02b362c371a640628281acb0502022e050c00033e2a69291a41050e0e0c000203041a3b05103b502c56571a42060e0e0e0c00032c2f0e0e0e0c0002291a3406691a34062a69293b1a19050e0e0c000303032c020f2c2a1a22060202e1040e0e0e0c00032e2a693b3c3c3b2d6805291aea040e0e0e0c000203041ae304103b5029270b0fca2b362c372d382b2d0c00022b2e0e0e0e0c00022b2f0e0e0e0c0002291adc05691adc052a691adb052a692d2a691ad7052a691ad6052a69312a691ad2052a693b3c3c3b2d6805291a8d0402026c040e0e0c000203041a8304103b5029270f0fda2b36291aad050e0e0c00023e2a69291a65040e0e0c000203041a5f04103b5029660fce2b3629352a362b372c382d392e3a2f23063023073123083e3169291a36040e0e0e0c000203041a2f04103b502b3b1a2b040c000303051a5b0502031a5a051a5b052a1a8b040202ee030c00033e2a69291a01040e0e0c000203041afb03103b502f3c1a17040c00031a35052a1a61040e0e0c00033e2a69291ad9030e0e0c000203041ad303103b50343c1aef030c00031a11052a1a39040e0e0c00033e2a69291ab1030e0e0c000203041aab03103b50220f1af30402027e030c00021aed042a693b3c3b3b2d6805291a8803020267030e0c000203041a7f03103b50220d1acf040c00021acd042a693b3c3b3b2d6805291a60030e0c000203041a5b03103b5022133b1a56030e0e0e0c000303051a4f0302031a4e03293b691a9c042a693b3c3b3b2d6805291a2b030c000203041a2703103b501a850428281a94030e0c00033e2a69291a0d030e0e0c000203041a0703103b50221c22211a65040e0e0c0003291a60040e0c00022b2a693b3c3c3b2d6805291ade020e0e0e0c000203041ad702103b50222222250e0c0002291a3804691a38042a692c2a69332a691a31042a6922102a691a2c042a6922152a691a27042a69221a2a69221e2a6922222a691a1a042a6922272a691a15042a691a14042a693b3c3c3b2d6805291a77020c000203041a7302103b502927360fd12b362c37293c1a86020e0e0e0c00031ae9032a1acd020e0e0c0003291ae0031ac1020e0e0c00033e2a69291a39020e0e0c000203041a3302103b502e300e0e0e0c0002291abc03692b2a693b3b3b3b2d6805291a11020e0e0c000203041a0b02103b5029270a0fd22b362c372a353e1afd010e0e0c000303362903051a880302031a8703291a8703691a87032a69641a0d020e0e0c00023e2a69291ac9010e0e0c000203041ac301103b5029660fd32a353c1aba010e0e0e0c000303472a362a03051a520302031a41032a3c1ac001020277010e0c00032a1a4003692a2a691a3d032a69661ab7010c00023e2a69291a75010e0e0c000203041a6f01103b50292704029a2a353b1a65010e0e0c000303472a362a03051a0a0302031aed022a3c1a6c010e0c00032a1afc02692a2a691af9022a69661a670102020e010c00023e2a69291a21010e0e0c000203041a1b01103b5029270402462a362a03051acf0202031aa6022a3c1a25010e0e0c00032a1ac002692a2a691abd022a69661a1f0102021a000c00023e2a69291ad9000e0e0c000203041ad300103b502927046502a92b362c372d382903051a8e0202031a8d023e2a69291aae000e0e0e0c000203041aa700103b502c2f0e0e0e0c00021a710228281a0c010e0c00033e2a69291a85000e0e0c000203041a7f00103b5030321a53020c0003291a50020e0c00022b2a693b3c3c3b2d6805291a5a000e0e0e0c000203041a5300103b50291a3002691a30022a69312a691a2c022a69342a693b3c3b3b2d6805291a2c000e0c000203041a2700103b502927124200000000cc0a000000000000|@4623,@4624,@4629,@4631,I105,@1784,I251,@4628,@4626,@1058,@1058,I234,@677,I106,@510,@2972,@2973,@2974,@371,@1087,@1058,I247,I239,I104,I252,I245,I243,I218,@2975,@2976,@1087,@1058,@1059,@1088,@4633,@389,@4634,@4635,@4637,@4639,@4640,@4641,@4642,@4644,@4645,@1058,@4647,@4649,@4650,@1058,@1058,@4651,@1058,@1060,@1058,@2983,@1056,@1058,@2985,@2987,@1087,@2989,@2991,@4653,@4655,@4657,@4662,@3041,@1087,@1088,@1060,@1088,@4664,@4665,@1087,@1058,@4667,@1087,@1088,@4669,@1088,@4669,@4670,@3065,@4672,@4673,@4674,@4675,@4676,@4677,@4680,@4682,@4685,@4687,@4689,@4690,@4692,@4694,@1058,@1058,@1058,@1058,@1058,@1058,@4697,@4699,@2973,@1056,@4700,I48,@4701,@4702,@4700,@4701,@4703,@4700,@4701,@4704,@4700,@4701,@4705,@4706,@4707,@4708,@4709,@4622,@1056,@1058,@1058| 4622:O1|@4711 4623:S33|4261636b656e64496e7465726d656469617465436f64652e707265747479283129 4624:O1|@4625 4625:D11,236|00812c1aea000e0e0e0c00021ae5000e0e0c000203c72c352d36293b1ad9000e0e0c000303452a352b362a300e0c00022a3b1ac3000c000303051abf0002031abe00293b691abc002a692c2a693b3c3b3b2d6805291a98000e0c000203041aa700103b50293b692708026f2a352b362a300c00022a3b1a7f000c000303051a7b0002031a7a00293b691a78002a692c2a693b3c3b3b2d6805291a54000e0c000203041a6300103b50291a6000693b3b3b3b2d6805291a38000e0c000203041a4700103b5033220f1a46000e0e0e0c00031a41002a692b2a69270c6502013b430e00000000e400000000000000|@4627,I105,I218,I251,@4628,@4626,@1058,@1784,@2136,@4624,@1058| 4626:O2|3,71 4627:S34|4261636b656e64496e7465726d656469617465436f64652e704c6973742833292829 4628:O2|3,70 4629:O1|@4630 4630:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4629,@1087| 4631:O2|3,@4632 4632:S2|2428 4633:S10|434f4e5441494e455220 4634:S9|524543434f4e535452 4635:O1|@4636 4636:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@4627,I105,I218,I251,@2136,@1784,@4635,@1058| 4637:O1|@4638 4638:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4637,@1087| 4639:S4|54414720 4640:S4|574f5244 4641:S3|494e54 4642:O2|@4643,0 4643:S2|2028 4644:S5|4341534520 4645:O1|@4646 4646:D14,348|00812c1a5a010e0e0e0c00021a55010e0e0c000207d22c352d36293b1a49010e0e0c000303792a352b36293b1a3d010e0e0c0003030c1a37012a1a37010c0003020129293d1a30010e0c000329283a1a2a010e0e0e0c00033e2a69291a01010e0e0c000203041a1701103b502e340e0e0e0c0002293b691a0a012a692c2a693b3c3c3b2d6805291ad6000e0e0e0c000203041aeb00103b50293b69270b02a72a352b36293b1ac4000e0c0003030c1abf002a1abf000c0003020129293d1ab8000e0c000329283a1ab2000e0e0e0c00033e2a69291a89000e0e0c000203041a9f00103b502e3402025f000e0e0e0c0002293b691a8e002a692c2a693b3c3c3b2d6805291a5a000e0e0e0c000203041a6f00103b50291a7000693b3b3b3b2d6805291a3c000e0c000203041a5300103b50220d22121a55000e0e0c00031a51002a692b2a69270f6502013b430e0e0e0e0e000000005401000000000000|@4627,I105,I218,I251,I234,@677,I106,@510,@389,@1784,@1058,@2136,@4645,@1058| 4647:O2|3,@4648 4648:S5|454c53453a 4649:S3|29207b 4650:S4|43415345 4651:O1|@4652 4652:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4651| 4653:O1|@4654 4654:D11,236|00812c1aea000e0e0e0c00021ae5000e0e0c000203c72c352d36293b1ad9000e0e0c000303452a352b362a300e0c00022a3b1ac3000c000303051abf0002031abe00293b691abc002a692c2a693b3c3b3b2d6805291a98000e0c000203041aa700103b50293b692708026f2a352b362a300c00022a3b1a7f000c000303051a7b0002031a7a00293b691a78002a692c2a693b3c3b3b2d6805291a54000e0c000203041a6300103b50291a6000693b3b3b3b2d6805291a38000e0c000203041a4700103b5033220f1a46000e0e0e0c00031a41002a692b2a69270c6502013b430e00000000e400000000000000|@4627,I105,I218,I251,@4628,@4626,@1058,@1784,@2136,@4653,@1058| 4655:O1|@4656 4656:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4655,@1087| 4657:O1|@4658 4658:D16,468|00812c1ad2010e0e0e0c00021acd010e0e0c000207d22c352d36293b1ac1010e0e0c000303b12a352b362a352b362c372b3c1aaf010c00032a3c1aa7010c0003291aa40169287b2a692c2a691a9d012a6927051a9a010e0e0e0c00023e2a69291a75010e0e0c000203041a8701103b502c220c0e0e0c0002293b691a7a012a692c2a693b3c3b3b2d6805291a4a010e0e0e0c000203041a5b01103b50333b1a3f010c000303051a530102031a5201293b691a50012a692c2a693b3c3b3b2d6805291a14010e0c000203041a2701103b50293b6927110fd62a352b362a352b362c372b3c1afe000202d7000e0e0e0c00032a3c1aef000c0003291aec0069287b2a692c2a691ae5002a6927051ae2000e0e0e0c00023e2a69291abd000e0e0c000203041acf00103b502c220c0e0e0c0002293b691ac2002a692c2a693b3c3b3b2d6805291a92000e0e0e0c000203041aa300103b50333b1a87000c000303051a9b0002031a9a00293b691a98002a692c2a693b3c3b3b2d6805291a5c000e0c000203041a6f00103b50291a7c00693b3b3b3b2d6805291a40000e0c000203041a5300103b50221322181a610002020f000e0e0c00031a59002a692b2a6927156502013b430e0e0e0e0e00000000cc01000000000000|@4627,I105,I218,I251,@510,@4660,@4659,@371,@1784,@1058,@4628,@4626,@1058,@2136,@4657,@1058| 4659:S6|4445434c2023 4660:O2|@4661,0 4661:S8|20757365737d203d 4662:O1|@4663 4663:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4662,@1087| 4664:S5|424c4f434b 4665:O1|@4666 4666:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@4627,I105,I218,I251,@3045,@1784,@4665,@1058| 4667:O1|@4668 4668:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4667| 4669:O2|3,@2973 4670:O2|3,@4671 4671:S3|494628 4672:S5|66616c7365 4673:S4|74727565 4674:S3|434c3d 4675:S4|2043523d 4676:S8|204c4f43414c533d 4677:O1|@4678 4678:D8,124|00802b1a7a000e0e0e0c00021a75000e0e0c000203522b352c36293b1a69000e0e0c0003031a2a3b1a5d000e0e0c000303051a570002031a5600293b696402252a3b1a43000c000303051a3f0002031a3e002a1a3e000e0e0e0c00021a39002a692b2a69666502013b420e0e0e0e0e0e000000007400000000000000|@4679,I105,I218,I251,@4628,@4626,@4677,@1058| 4679:S50|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172675479706573283129 4680:O2|3,@4681 4681:S5|415247533d 4682:O1|@4683 4683:D8,140|00802b1a8a000e0e0e0c00021a85000e0e0c000203672b352c36293b1a79000e0e0c000303242a3c1a71000e0e0c00033e2a69291a59000e0e0c000203041a5f00103b50293b696502302a3c1a4d000e0e0c00033e2a69291a35000e0e0c000203041a3b00103b502b1a38000e0c00021a35002a692b2a6927046502013b420e000000008400000000000000|@4684,I105,I218,I251,@510,@1784,@4682,@1058| 4684:S49|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172674c696665283129 4685:O2|3,@4686 4686:S9|4152474c495645533d 4687:O2|3,@4688 4688:S4|5245533d 4689:S6|20434c4f533d 4690:O1|@4691 4691:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@4627,I105,I218,I251,@2136,@1784,@4690,@1058| 4692:O1|@4693 4693:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4692,@1087| 4694:O2|@4695,0 4695:O2|3,@4696 4696:S9|297b4c414d4244417d 4697:O2|3,@4698 4698:S7|4c414d42444128 4699:S9|494e44495245435428 4700:S6|2c206c617374 4701:O2|41,0 4702:S10|52454355525349564528 4703:S5|434c4f5328 4704:S6|504152414d28 4705:S6|4c4f43414c28 4706:S11|4b494c4c4245464f524528 4707:S10|4b494c4c414654455228 4708:S6|204b494c4c3d 4709:O1|@4710 4710:D8,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203532c352d36293b1a69000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a5000693b3b3b3b2d6805291a38000e0c000203041a3f00103b502c311a3b000c00031a39002a692b2a6927056502013b430e0e0e0e0e000000007400000000000000|@4627,I105,I218,I251,@2136,@1784,@4709,@1058| 4711:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4622,@1087| 4712:D13,260|00802b353c1a00010e0c0003030a2b362956272d7d0400022b353d1aea000e0e0e0c000303572b361ae10028281ae0000e0c00033e2a69291ad9000e0e0c000203041ad300103b502b56471ace000e0e0e0c0003291ac8000e0c00022b2a693b3c3c3b2d6805291aaa000e0e0e0c000203041aa300103b5029270702762b362c372d382b3c1a9c000e0c00032a3c1a93000c0003291a900069287b2a692c2a691a89002a6927051a86000e0e0e0c00023e2a69291a5d000e0e0c000203041a5700103b502c56670e0e0c0002293b691a62002a692c2a693b3c3b3b2d6805291a32000e0e0e0c000203041a2b00103b5029270a420e0e0e0e00000000fc00000000000000|@4714,I251,@4715,@389,I105,@1784,@4716,@4713,@510,@4660,@4659,@371,@1058| 4713:O1|@4722 4714:S40|4261636b656e64496e7465726d656469617465436f64652e70726574747942696e64696e67283129 4715:S6|4d555455414c 4716:O1|@4717 4717:D13,348|00812c1a5a010e0e0e0c00021a55010e0e0c000207d82c352d36293b1a49010e0e0c000303792a352b362c372b3c1a3b010c00032a3c1a33010c0003291a300169287b2a692c2a691a29012a6927051a26010e0e0e0c00023e2a69291a01010e0e0c000203041a1301103b50402d69330e0c0002293b691a06012a692c2a693b3c3b3b2d6805291ad6000e0e0e0c000203041ae700103b50293b69270a02ab2a352b362c372b3c1ac2000e0e0e0c00032a3c1ab7000c0003291ab40069287b2a692c2a691aad002a6927051aaa000e0e0e0c00023e2a69291a85000e0e0c000203041a9700103b50402d693302025d000e0c0002293b691a86002a692c2a693b3c3b3b2d6805291a56000e0e0e0c000203041a6700103b50291a6800693b3b3b3b2d6805291a38000e0c000203041a4b00103b50220c22111a4d000e0e0c00031a49002a692b2a69270e6502013b430e000000005401000000000000|@4627,I105,I218,I251,@510,@4660,@4659,@371,@1784,@1058,@4718,@4716,@1058| 4718:O2|@1088,@4719 4719:O2|@4720,0 4720:O2|3,@4721 4721:S5|20414e4420 4722:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@4713,@1087| 4723:O1|@4724 4724:D11,404|00822b1a92010e0e0e0c0002280828413b1a88010e0c00043b2a693c28402b1a7a010e0e0e0c00043c28403b1a6d010e0e0c00043c28403b1a61010e0e0c00043c28403b1a55010e0e0c00043c28403b1a49010e0e0c00043c28403b1a3d010e0e0c00043c28403b1a31010e0e0c00043c28401a2a011a23010c00043c28403b1a19010e0e0c00043c28403b1a0d010e0e0c00043c28403b1a01010e0e0c00042210291afe000e0e0e0c00021af9000e0e0c0002032429352a362a35291aec001aed000e0e0c00036403052a68010207292503511e323b6502013b64293b1acf000c000303691acb00291ab7000c00021ab5000e0e0c0002032429352a362a35291aa8001aa9000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a8b000c000303041a8b00103b50293529351a75001a76000e0e0e0c000303043b5002041a730010293765021a293529351a56001a57000c000303043b5002041a5700102937643431220e220d221734221a3333220d22122214221b2212220e680f2710440e000000008c01000000000000|@4726,@4725,I11,536870911,I105,I218,@96,I251,@2900,@2955,@1840| 4725:O2|@4727,@108 4726:S27|494e54434f4445434f4e5328292e636f6465437265617465283329 4727:D9,140|00802b291a89000e0e0c00021a85000e0e0c0002032429352a362a352956571a76000e0e0e0c00036403052a68010207292503511e313b6502013b64293b1a57000c000303051a5300021c2935293556371a44000e0c000303043b5002041a3f00103b502937643c28401a37001a38000e0c00041a35002a2c6a292704420e0e000000008400000000000000|@4729,I105,I218,I251,@4730,@1840,I48,I11,@4728| 4728:D16,340|008056073b1a50010e0c0003292d1a4b010c0003291a48010e0c00020402003b3b2c1a3f010c00032a2a1a3b010c00036403113b2c2e6a2a3b2f6a2c2b452a462603026f2c1a24010e0c000203032c0214293f1a0e010e0e0e0c00032d2a1a0f010c00036429401afe000e0e0e0c00031a01010e0e0c000264030f293c1ae4000e0c000325011e660229293b1ae9000e0e0c00033b2a2f6a2d3b1ac7000c0003292d1ad3000c00032d2a326a2f2d452a4626065029352a362936293b1abd000e0e0c000364031e2a352b362c371ab0000e0c000456773b2b1aa9000e0e0c0004503b64025f2a352b362c371a92000e0e0e0c00043e2a69291a71000e0e0c000203041a8300103b503b50296556780e0e0e0c00025056673b1a71001a66000e0e0e0c000450293c3b1a65000e0e0c000429352a362b371a47000c00046430320e7d0900022706420e000000004c01000000000000|@4733,I253,@389,I223,I239,I251,I105,I252,I218,I240,I113,@1938,I255,@1784,I48,@4732| 4729:S26|5072657474792e67657453696d706c655072696e746572283129 4730:O1|@4731 4731:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 4732:O1|@4734 4733:S40|5072657474792e67657453696d706c655072696e7465722831297072696e7453747265616d283129 4734:D10,244|00822b1af2000e0e0e0c00021aed000e0e0c0002037a2b352e352f363037301ad6000e0e0e0c0002030c303b1ad1000e0e0c000302013b03043b5002041ac400102c1ab3000c0002030c2c3b1ab1000e0e0c000302013b03043b5002041aa40010302d1aa2000e0e0e0c0003292c1a9b000c00036403043b5002041a920010302c1a84000e0c0003292e2c6a270502562d352e362f372f1a5e000e0e0e0c0002030c2f3b1a59000e0e0c000302013b03043b5002041a4c00102f2b1a4e000e0e0e0c000303043b5002041a4700102f2c1a35000e0e0c00032b311a3b000c00032a2a2d6a2705440e00000000ec00000000000000|@4736,I105,I218,I231,@313,I239,I248,@4737,@4735,I240| 4735:O4|11,@316,0,@4739 4736:S35|566563746f72536c6963654f7065726174696f6e7328292e737562736c696365283329 4737:O4|11,@316,0,@4738 4738:O5|@471,131,0,131,0 4739:O5|@471,121,0,121,0 4740:D1,20|00813c561769430e000000000c00000000000000|@4741| 4741:S23|494e5447434f444528292e636f646567656e2835292d45 4742:O4|@4743,@111,@112,@110 4743:D23,1132|00843c28403b1a67040c0004293b1a63041a64040e0c000450280628403b1a4f040c0004293b28051a4d040e0e0c0004503c2a693c28402b1a35040e0e0c0004293b693c28403c1a26040e0e0e0c00043c28403b1a19040e0e0c000433287e1a1a040e0e0e0c000303043b5002041a0f04103b50287e341a0a040e0e0e0c0003220d35293b1a00040e0c0003220f37292b3b1af7030c00042211352c3c1ae4030e0c00032a3b2b1ace030e0e0e0c0004502f3c1ace030e0e0e0c0003221435293b1ac4030e0c00032216372c3b1aac030e0c0003030c1b00012d1aa7030c000302012c291aa9030e0e0c00020303290207291a9f030c00022928ff1a9a030e0e0e0c00032c2e2b1a82030e0e0e0c0004221b352f3c1a6c030e0c00032a3b2b1a56030e0e0e0c000450221e3c3b3b2220221822212224221a221a222422231a5b030c000d22123b1a3e030e0e0e0c000303033b0fca3b221d1a45030e0e0c0003030c221c3e1a38030e0c000302013b03992841221d1a0c030e0c0003293b1a23030c000322203b3c1a1d030e0e0c000422211a17030c0002222235293b1ae8020e0c00032224372e3b1ad0020e0c0003030c1b00012f1acb020c000302012e291acd020e0e0c00020303290207291ac3020c00022928ff1abe020e0e0e0c00032c2e2b1aa6020e0e0e0c00042229352f3c1a90020e0c00032a3b2b1a7a020e0e0e0c0004503b270d0fd23b221d1a90020e0c00030310221c28fe1a830202021b020c000302013b03c1221e3b3d1a78020e0c0004221f1a73020c0002222035293b1a44020e0c0003222237292b281f1a3a020e0e0e0c00042224352c3c1a24020e0c00032a3b2b1a0e020e0e0e0c000450222635293b1a0f020c000322283722273b1af7010c000303101b000122281af2010e0e0e0c000302022227291af0010e0c00020303290207291ae7010c00022928ff1ae2010e0e0e0c00032c2e2b1aca010e0e0e0c0004222d352f3c1ab4010e0c00032a3b2b1a9e0102025e010e0e0e0c0004503b27110fca221e3b3e1ab7010c0004221f1ab3010c0002222035293b1a84010e0c0003222237292b280d1a7a010e0e0e0c00042224352c3c1a64010e0c00032a3b2b1a4e010e0e0e0c00045022243d2a1b00011a75010e0e0c0003293b1a6f010c000303033c0214293b1a66010e0e0e0c00033c2a1a5f010c000364030329020a291b00011a17010c0003222a35293b1a10010e0c0003222c372c3b1af8000e0c0003030c1b00012d1af3000c000302012c291af5000e0e0c00020303290207291aeb000c00022928ff1ae600020286000e0e0e0c00032c2e2b1aca000e0e0e0c00042231352f3c1ab4000e0c00032a3b2b1a9e000e0e0e0c000450343c1ace000e0e0e0c000303033b0249220c3b1ac1000e0e0c0003293c1abb000c00030304220d020a220d28ff1a93000c0003291b00011aa5000e0e0c0003220e3c1a7e000e0e0e0c00032a2a25112511260f2000013b27042715221f121c0001000100121d0001000200121e00010003001a6e0022200e0e0e7b06210005000000006404000000000000|@4745,I11,@4746,I255,I234,@4764,I106,I253,@4768,I105,I152,I243,@4793,I232,I107,@4802,@4800,I110,I113,I231,I251,I109,@4744| 4744:O1|@4961 4745:S21|494e5447434f444528292e636f646567656e283529 4746:O1|@4747 4747:D16,308|00802b363c1a30010e0c000303051a2b010fdd2b353b2a1a26010e0e0e0c00036403051a1e010fdd2b363c1a0a010e0e0e0c000303051a0f010fdd2b3529352d363c1a07010c00032a2a691a02013b1a02010e0e0e0c00032a2a0e0e0e0c00026429353b1ad9000e0e0c000303992939291ae4000e0c00021ae1000e0e0c0002035f29361ad1000e0e0c00021acd000e0e0c000203482935353e1aa3000c000303312935362928281a95000e0e0c000303033c021b29287b1a85000e0e0c000303033c020b29285b1a75000e0e0c00036402013b1a85000e0e0c000202013b02013b031d2a1a7800691a78002a69020230001a73002a693b3e3c3b2d68056602012a6402031b0029293b691a5e002a691a5d002a693b020208003c3b3b2d68052709420e0e0e0e0e000000002c01000000000000|@4749,I234,@2016,I251,@4750,@2016,I107,@14,I253,I105,I218,@1087,@1088,@1060,@1058,@4748| 4748:O5|0,0,0,@4759,@4758 4749:S14|7072696e742d646563456e747279 4750:O5|0,0,0,@4752,@4751 4751:O2|@4756,0 4752:O2|@4753,0 4753:O2|0,@4754 4754:O5|@4755,226,226,0,0 4755:S49|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f494e5447434f44452e4d4c 4756:O2|3,@4757 4757:S5|456d707479 4758:O2|@4762,0 4759:O2|@4760,0 4760:O2|0,@4761 4761:O5|@4755,225,225,0,0 4762:O2|3,@4763 4763:S9|537461636b41646472 4764:O4|@35,@863,@4766,@4765 4765:O5|@4767,1254,0,1254,0 4766:S35|67656e456e746572496e7450726f633a20746f6f206d616e7920617267756d656e7473 4767:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f494e54434f4445434f4e532e4d4c 4768:O1|@4769 4769:D31,444|00822d3b1ab9010e0e0c00032935293c1ab1010e0e0c000303041aab01103b502a36291aa6010e0e0e0c0002293b1a9f010c0003030c1a9b012a1a9b010c00030201293f2a1a94010e0c0003323b1a7f010c0003032a323c1a85010e0e0c0003291a8001691a80012a69651a7e010e0e0e0c00021a79011a7a012b1a7a016b103b50322a1a49010e0e0c00030326321a6a010e0e0e0c00020303320207321a5f010c00022d2a341a5a01220c0e0e0e7b050c00042d3b1a0b010c00031a49010e0e0c000203041a4301103b503e2b1a0b010c0003333b1a37010c0003293c1ae3000c0003030334020b343e1a26010e0e0e0c0003293f1a1f010c0003293c1ad7000c00032d2a1a13010c000303032d020129291ae6000e0e0e0c00020303290207291adb000c0002293b1a97000c000303033c020b291ae7001ae8000e0c000303041ae300103b50293c3b1ade000e0e0e0c00043b2a693c28402b1ace000e0e0e0c000422142a220c3b1ac3000c00055022131a86000e0e0e0c000203042213020a22131a79000e0e0c00022c2a22151a71000e0e0c00045022153b2d1a94000e0c0004503b2711440e0e0e0e0e0e0e00000000b401000000000000|@4771,I253,I251,@4772,I15,I234,@677,I106,I108,@510,@4776,@4778,@371,@35,@863,@4779,I105,I152,I254,I218,@4780,I231,I107,I109,I233,16777215,I247,@2522,I11,@4770,I255| 4770:O1|@4783 4771:S19|434f44455f5345472e63736567536574283329 4772:O4|@35,@863,@4774,@4773 4773:O5|@4775,223,0,223,0 4774:S42|637365675365743a2063616e2774206368616e6765206c6f636b656420636f646520736567656d656e74 4775:S49|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f434f44455f5345472e4d4c 4776:O2|@4777,0 4777:S25|206f7574206f662072616e676520302e2e696e66696e697479 4778:S15|637365675365743a20496e64657820 4779:O5|@4775,240,0,240,0 4780:O4|@35,@863,@4782,@4781 4781:O5|@4775,247,0,247,0 4782:S34|637365675365743a2063616e277420657874656e6420636f6465207365676d656e74 4783:D25,492|00832e3b1ae9010e0e0c00032935293b1ae1010e0e0c000303192f3b1ad1010e0e0c00032935293b1ac9010e0e0c00036502013b6403043b5002041aba011029362f3b1aaa010e0e0e0c000329362b1aaa010e0e0e0c0002293b1aa3010c0003030c1a9f012a1a9f010c00030201292b1a89010e0e0c0002293b1a83010c0003030c1a7f012a1a7f010c00030201293f2c1a78010e0c00033f2b1a6f010c00033f220d1a66010e0e0e0c00032a220f1a5e010e0e0e0c0003220f3b1a42010e0e0e0c000303033c020b2c22101a31010e0e0c00030336220f3c1a38010e0c00032d3c1a2f010c0003293b691a2a012a692c2a691a26012a6927051a23010c00021a21011a22012b1a22016b103b502a3b1aed000e0e0c000303033c020b292b1ade000e0e0e0c000303362a3c1ae5000e0e0c00032a3c1adb000c0003293b691aee002a692c2a691aea002a6927051acf000c00021acd001ace002b1ada006b103b502a3b2922121ad2000e0e0e0c000303033b0260291ac7000c00020303290207291abf000c0002220d2a1aba000e0e0e0c00032c1aa8000e0c000203032c02072c1a9f000c0002220d2a2c1a9d000e0e0c0004502c3c1a4e000e0e0e0c00032e3c1a43000c0003292b2507250726051e6c3b2705270e1f040e0e0e0e0e0e0e00000000e401000000000000|@4785,I253,I251,@4786,I15,I234,@677,I106,I108,I107,@510,@4789,@4790,@371,@35,@863,@4791,@4789,@4792,@4784,I113,I105,I152,I252,I254| 4784:O5|@4775,191,0,191,0 4785:S23|434f44455f5345472e63736567436f7079536567283429 4786:O4|@35,@863,@4788,@4787 4787:O5|@4775,198,0,198,0 4788:S49|63736567436f70795365673a2063616e206f6e6c7920636f7079206265747765656e206279746520736567656d656e7473 4789:S17|206f7574206f662072616e676520302e2e 4790:S25|63736567436f70795365673a2042797465206c656e67746820 4791:O5|@4775,177,0,177,0 4792:S25|63736567436f70795365673a2042797465206f666673657420 4793:O5|@4795,@4926,@4934,@4942,@4794 4794:O2|@4948,@4793 4795:D57,6956|008b2e3b1a291b0e0e0c0003220e350a11009e10d406f5118015df012400e118d115e8084e00b0157e088c0d0e11140db20071005403220e36220f372210382b2b2b6a2922112210221022102210221022102210221056fa0e0c000b27040fd4220e3729220f220f220f220f220f220f220f220f220f220f220f220e0e0c000d640fd2220e36220f37293c693e2c3b6a293c69293b692c2a6928052a1a951a3c6b292216221622162216221622162216221622162216221622150e0e0e0c000d27080fd4220e36220f372210382b3528111a641a0e0c000303412b362a3c3c22122212221222122212221222122212221222110e0e0c000d2a3b3b2f3322142214221422142214221422142214221d1a2a1a0e0e0e0c000f650fcc2b3c3c22112211221122112211221122112211221122100202e7170e0e0e0c000d2a3c3c22122212221222122212221222122212221222110202c6170e0e0c000d2c351adf193b292c1add190e0e0c000303032a026a293c1ad2190e0e0e0c000330360402002c28082b1ac4190e0c00045029352a362c2b1aba19020283170e0e0e0c00033c2b1aaf190c00032a2a1aab190c0003293b1a83190c0003641aa0190e0c0002293b1a73190c00030303320201312932250b250b26091e743b2709653b3b3022112d1a7b19020205000c00062704660fcb220e36313b3e1a6a190e0e0e0c0004321a64190e0c00023335293b1a21190e0e0c0003220c37292b3f1a4f190c0004220e352c3c1a48190e0c00032a3b2b1a42190e0e0e0c000450313d2a1b00011a36190e0e0e0c0003293b1a2f190c000303033c0214293b1a26190e0e0e0c00033c2a1ad3180c000364030329020a291b00011afb180c0003221435293b1ab0180e0c00032216372c3b1af8180e0c0003030c1b00012d1ad7180c000302012c291ae5180e0e0c00020303290207291adb180c00022928ff1a9e1802025f160e0e0e0c00032c2e2b1aa2180e0e0e0c0004221b352f3c1a98180e0c00032a3b2b1a92180e0e0e0c000450343c1a8e180e0e0e0c000303043b500247220c3b1a80180e0c0003293c1a2f180c00030304220d020a220d28ff1a77180c0003291b00011a71180e0e0c0003220e3c1a62180e0e0e0c00032a2a25112511260f2001012604260d220f3b1ae7170c0003293c1a1f180c000322113b2b1a19180e0e0c0004503b270b0fd5220e363b2a291a19180e0e0c00021ae5170e0e0c0002031729362b3c1aeb170c0003292b25042504511e243b6502012a652a291aec170e0c00021ab9170e0e0c0002032929352a362a3c3c22132213221322132213221322132213221322120c000d2a250426031e353b6602013b643d2b1abe170e0e0e0c0003030c2a3f1ab1170e0e0c000302013b039d28692b1a79170e0e0c0003293d1a8f170c0003220c3b3c1a59170e0e0c0004220d1a53170c0002220e35293b1a10170e0c00032210372e3b1a58170e0c000303101b00012f1a37170202e0140c000302012e291a41170e0e0c00020303290207291a37170c00022928ff1afa160e0e0e0c00032c2e2b1a02170e0e0e0c00042215352f3c1af8160e0c00032a3b2b1af2160e0e0e0c0004503b270d0fce3b2b1a05170e0e0c0003030c2a28fe1af8160e0c000302013b03c1333b3d1ab5160e0e0c0004341ab0160e0c0002220c35293b1a6c160e0c0003220e37292b28681a9a160e0e0e0c00042210352c3c1a90160e0c00032a3b2b1a8a160e0e0e0c000450221235293b1a37160c0003221437220c3b1a7f160c000303101b0001220d1a5e160e0e0e0c00030202220c291a68160e0c00020303290207291a5f160c00022928ff1a22160e0e0e0c00032c2e2b1a2a160e0e0e0c00042219352f3c1a20160e0c00032a3b2b1a1a1602025e010e0e0e0c0004503b27110fca333b3e1af4150e0c0004341af0150e0c0002220c35293b1aac150e0c0003220e37292b28671ada150e0e0e0c00042210352c3c1ad0150e0c00032a3b2b1aca150e0e0e0c000450323d2a1b00011abe150e0e0e0c0003293b1ab7150c000303033c0214293b1aae150e0e0e0c00033c2a1a5b150c000364030329020a291b00011a83150c0003221635293b1a38150e0c00032218372c3b1a80150e0c0003030c1b00012d1a5f150c000302012c291a6d150e0e0c00020303290207291a63150c00022928ff1a2615020286000e0e0e0c00032c2e2b1a2a150e0e0e0c0004221d352f3c1a20150e0c00032a3b2b1a1a150e0e0e0c000450343c1a16150e0e0e0c000303033b0249220c3b1a09150e0e0c0003293c1ab7140c00030304220d020a220d28ff1aff140c0003291b00011af9140e0e0c0003220e3c1aea140e0e0e0c00032a2a25112511260f2001013b27042715333b1a6f140c00032c3c1ac7140c00032a2a1abf140c0003220d3b2b1a99140e0e0c0004503b27070fcf220e36220f372210382211392c2c2c2c6b3b2d291a8b140c00021a59140e0e0c0002031729362b3c1a5f140c0003292b25042504511e223b6502012a650402002c1a5e140e0e0e0c00021a29140e0e0c000203222c35293b1a43140c0003030c1a53142a1a23140c00030201292b3b452a46260302be2e1a28140e0c00021af5130e0e0c000203043b5002041a2b14103b502e352936292a69040200322b2a1a00140e0c00021acd130e0e0c0002033d2a352b362a362c352d362b2b1aff130c000303032b02012a2c2b1af513020266110e0e0c000303032c02012a2a2a692f2a250a250a26081e4926080209292c2a35452a3646515129352a362a3b1a9e130e0e0e0c0003030c1aab132b1a7b130c000302012a2a3b1a84130e0c0003030c1a93132b1a63130c000302012a312b452a46260929352a363e2d1a89130e0e0c00032a2c1a63130c00032928051a3a130e0e0e0c00032b2a1a43130c00036603232d22172217221722172217221722172217221722172217121700010001000c000d02222d22172217221722172217221722172217221722172217121700010002000e0c000d27090fcb303b3c1ace120e0e0e0c0004311ac8120e0c00023235293b1a85120e0e0c00033437292b286d1ab3120c0004220d352c3c1aac120e0c00032a3b2b1aa6120e0e0e0c000450220e3b1a55120e0e0c0003293c1a8b120c000322103b2b1a85120e0e0c0004503b270a0fd1220e36220f37323b3c1a5e120e0e0e0c0004331a58120e0c00023435293b1a15120e0e0c0003220d37292b28781a42120e0e0e0c0004220f352c3c1a38120e0c00032a3b2b1a32120e0e0e0c00045022103b1ae1110e0e0c0003293c1a17120202c00f0c000322123b2b1a0d120e0e0c00045022133b3e1af0110e0c000422141aeb110c0002221535293b1aa8110e0c0003221737292b28811ad6110e0e0e0c00042219352c3c1acc110e0c00032a3b2b1ac6110e0e0e0c000450221b35293b1a73110c0003221d37292b3b1aa3110202500f0c0004221f352c3c1a98110e0c00032a3b2b1a92110e0e0e0c000450222135293b1a3f110c0003291a48111a75110e0e0c00033c2a693c28402b1aa6110e0e0e0c00042226230d293b1a17110c00032d2a1a63110c00036503122226230d293b2e1a43110c0004503b6402013b22273a22283a293b1aeb100c00032d2a692c3b2b1a23110c0004502e3b69222b3b1ad2100e0e0e0c0003293c1a07110c0003222d3b2b1a01110e0e0c0004502b3b6922273c3c22362236223622362236223622362236223622350e0c000d22301acb100c0002223135293b1a88100e0c0003223337292b28051ab6100e0e0e0c00042235352c3c1aac100e0c00032a3b2b1aa6100e0e0e0c000450223735293b1a53100c0003223937292b3b1a83100c0004223b352c3c1a7c100e0c00032a3b2b1a76100e0e0e0c000450223d35293b1a23100c0003291a2c101a59100e0e0c00033c2a693c28402b1a8a100e0e0e0c00042242230d293b1afb0f0c00032d2a1a47100c00036503122242230d293b2e1a27100c0004503b6402013b22433a22443a293b1acf0f0c00032d2a692c3b2b1a07100c0004502e3b6922483c3b1ae90f0e0e0c000422483b22441aec0f0e0c00045022473b3b1ae00f0e0c00045022493b1a15100e0e0c0003221b291ade0f0e0e0e0c00021aa90f0e0e0c0002036f29352a362a3b1a750f0e0e0c000303043b500251224d1a950f0e0e0c0002224e35293b1a500f0e0c00032d291a9f0f0c00021a6d0f0e0e0c0002032529352a362a3b1a310f0e0e0c0003292e22561aad0f0e0e0c00042b250526041e30260402023b502604292503511e7d3b6502013b64224b35293b1afd0e0e0e0c0003224d37292b3b1a2b0f0c0004224f352c3c1a240f0e0c00032a3b2b1a1e0f0e0e0e0c000450225135293b1acb0e0c0003225337292b28ff1afa0e0e0e0e0c00042255352c3c1af00e0e0c00032a3b2b1aea0e0e0e0e0c000450224e3c3c225e225e225e225e225e225e225e225e225e225d0c000d22103b1a860e0e0e0e0c000303033b025622581aa60e0e0e0e0c0002225935293b1a600e0e0c00032213291aae0e0e0e0e0c00021a790e0e0e0c0002032629352a362a3b1a3d0e0e0e0c0003292e22611ab90e0e0e0c00042b250526041e333b270402013b270422573b3b1a5a0e0e0e0e0c0004503b27520fd1220e36293c3c220f220f220f220f220f220f220f220f220f220e0e0c000d323b3c1a1a0e0e0e0e0c0004331a140e0e0c00023435293b1ad10d0e0e0c0003220d37292b28101afe0d0e0e0e0c0004220f352c3c1af40d0e0c00032a3b2b1aee0d0e0e0e0c000450220f3b3c1ae00d0e0c0004503b270a0fce220e36220c3b1a910d0e0e0c000303041a0b0e103b503b50220c3529352a362b372d1afd0d0e0e0c0002292b3222132213221322132213221322132213220d1ae40d0e0c000d220d3b1a460d0e0e0e0c0003292e1a870d0202240b0c0003641a5c0d0e0c00020384220d3b1a240d0e0c0003292e1a7b0d0c00033b2a1a670d0c000303043b500223293c1a9d0d0e0e0c00031a990d2a1a990d0e0e0c00031a950d1a960d2b1a960d6b65103b502210230a2211230a293b1ad80c0e0c0003292d1a0f0d0c00032c3b2b1a0a0d0202af0a0e0e0e0c000450221436293b3b1af60c0e0e0e0c0004503b260802023b50220e1ad70c0c0002220f35293b1a940c0e0c000329311aeb0c0c0003291b00011ad50c0e0e0c000303a8221235293b1a720c0e0e0e0c0003221437292b281e1a9e0c0e0e0e0c00042216352c3c1a940c0e0c00032a3b2b1a8e0c0e0e0e0c000450221835293b1a3b0c0c0003221a37323b1a840c0e0c0003030c1b0001331a630c0c0003020132291a710c0e0e0c00020303290207291a670c0c00022928ff1a2a0c0e0e0e0c00032c2e2b1a320c0e0e0e0c0004221f352f3c1a280c0e0c00032a3b2b1a220c0e0e0e0c0004503b270f0fd4221235293b1aca0b0e0e0e0c0003221437292b28201af60b0e0e0e0c00042216352c3c1aec0b0e0c00032a3b2b1ae60b0e0e0e0c0004502f3d2a1b00011ada0b0e0e0e0c0003293b1ad30b0c000303033c0214293b1aca0b0e0e0e0c00033c2a1a770b0c000364030329020a291b00011a9f0b0c0003221c35293b1a540b0e0c0003221e372c3b1a9c0b0e0c0003030c1b00012d1a7b0b0c000302012c291a890b0e0e0c00020303290207291a7f0b0c00022928ff1a420b0e0e0e0c00032c2e2b1a4a0b0e0e0e0c00042223352f3c1a400b02026c000e0c00032a3b2b1a360b0e0e0e0c000450343c1a320b0e0e0e0c000303033b0249220c3b1a250b0e0e0c0003293c1ad30a0c00030304220d020a220d28ff1a1b0b0c0003291b00011a150b0e0e0c0003220e3c1a060b0e0e0e0c00032a2a25112511260f2001013b2704271322133c3b1abd0a0e0e0c0004270c0fdd220e36220f37291a260b0e0e0e0c0002292e220f220f220f220f220f220f220f220f22181a0d0b0e0e0c000c333b1a4f0a0c0003220c1a7f0a0c0002220d35293b1a3c0a0e0c0003292d2f6a29680132221822182c2218221822182218221822182218221822170e0e0c000d270a0fdc220e36220f372a291a5d0a0e0e0c00021a290a0e0e0c000203a429352a362a353c1af4090e0c000303212a36293b3c22142214221422142214221422142214221422130e0e0c000d51026a2a353b1ac7090c000303422a362b37293c3c221522152215221522152215221502028e072215221522140c000d50220d3b1a91090e0e0c000329680122122d2b1a3a0a0e0e0e0c00042605021d2a3629220d221156a92214221322132212221222121a1c0a0e0c000b51292503511eb25102023b50502922102210221022102210221022102210221022102210220f02021f070e0e0e0c000d650fcc220e36220f372210382b3c3c22112211221122112211221122112211221122100e0e0c000d343b3e1a32090e0e0e0c0004220c1a2b090c0002220d35293b1ae8080e0c0003220f37292b3e1a17090c00042211352c3c1a10090e0c00032a3b2b1a0a090e0e0e0c000450221335293b1ab7080c0003221537292b3b1ae7080c00042217352c3c1ae0080e0c00032a3b2b1ada080e0e0e0c000450221935293b1a87080c0003291a90081abd080e0e0c00033c2a693c28402b1aee080e0e0e0c0004221e230d293b1a5f08020248060c00032d2a1aa7080c0003650312221e230d293b2e1a87080c0004503b6402013b221f3a22203a293b1a2f080c00032d2a692c3b2b1a67080c0004502e3b6922233b1a16080e0e0e0c0003293c1a6b080c000322253b2b1a45080e0e0c000450221d222d222d222d222d222d222d222d222d222d222d222d222c0e0e0c000d222d3b1ade070e0e0e0c000303033b022222263b1ac5070e0e0c0003293c1a1b080c000322283b2b1af5070e0e0c0004503b6522263b1aa3070c00032903033b0fd522291acd070e0e0c0002222a35293b1a88070e0c0003222c37292b3d1ab7070c0004222e352c3c1ab0070e0c00032a3b2b1aaa070e0e0e0c000450223035293b1a57070c0003223237292b3b1a87070c00042234352c3c1a80070e0c00032a3b2b1a7a070e0e0e0c000450223635293b1a27070c0003291a30071a5d070e0e0c00033c2a693c28402b1a8e070e0e0e0c0004223b230d293b1aff060c00032d2a1a4b070c0003650312223b230d293b2e1a2b070c0004503b6402013b223c3a223d3a293b1ad3060c00032d2a692c3b2b1a0b07020216000c0004502e3b6922413c3b1ae9060e0e0c00042a27192f3b1ab0060e0c000303033b0252222a1ad2060e0e0e0c0002222b35293b1a8c060e0c000332291adb060c00021aa9060e0e0c0002032629352a362a3b1a6d060e0e0c0003292e22331ae9060e0e0c00042b250526041e303b270402013b270422293b3b1a8a060e0e0e0c00045022212232223222322232223222322232223222322232223222310e0e0c000d222a3b1a1a060e0e0e0c00032c3b1a17060c000303033b0252222d1a3a060e0e0e0c0002222e35293b1af4050e0c00032f291a43060c00021a11060e0e0c0002032629352a362a3b1ad5050e0e0c0003292e22361a51060e0e0c00042b250526041e303b270402013b27042e03032a02013b222d3b2b1aeb050c0004503b27280fd5220e3629321a56060e0e0e0c0003313b1a8b050c0003293c1ac3050c0003333b2b1abe050e0e0e0c0004503b27040fca220e36293b1a2a06220e220e220e220e220e220e220e220e56d90e0c000c640fd1220e36220f372a3c3c221022102210221022102210221022102210220f0e0c000d3b2b1a8f050c0003030c2a28051a84050e0c000302013b03a528352b1a4d050e0e0c0003293b1a63050c0003220c3b3c1a2d050e0e0c0004220d1a27050c0002220e35293b1ae4040e0c00032210372e3b1a2c050e0c000303101b00012f1a0b050202b4020c000302012e291a15050e0e0c00020303290207291a0b050c00022928ff1ace0402028f020e0e0e0c00032c2e2b1ad2040e0e0e0c00042215352f3c1ac8040e0c00032a3b2b1ac204020267020e0e0e0c0004503b270d0fce3b2b1ad1040e0e0c0003030c2a28fe1ac4040e0c000302013b03c1333b3d1a81040e0e0c0004341a7c040e0c0002220c35293b1a38040e0c0003220e37292b28231a66040e0e0e0c00042210352c3c1a5c040e0c00032a3b2b1a56040e0e0e0c000450221235293b1a03040c0003221437220c3b1a4b040c000303101b0001220d1a2a040e0e0e0c00030202220c291a34040e0c00020303290207291a2b040c00022928ff1aee030e0e0e0c00032c2e2b1af6030e0e0e0c00042219352f3c1aec030e0c00032a3b2b1ae60302025e010e0e0e0c0004503b27110fca333b3e1ac0030e0c0004341abc030e0c0002220c35293b1a78030e0c0003220e37292b28141aa6030e0e0e0c00042210352c3c1a9c030e0c00032a3b2b1a96030e0e0e0c000450323d2a1b00011a8a030e0e0e0c0003293b1a83030c000303033c0214293b1a7a030e0e0e0c00033c2a1a27030c000364030329020a291b00011a4f030c0003221635293b1a04030e0c00032218372c3b1a4c030e0c0003030c1b00012d1a2b030c000302012c291a39030e0e0c00020303290207291a2f030c00022928ff1af202020286000e0e0e0c00032c2e2b1af6020e0e0e0c0004221d352f3c1aec020e0c00032a3b2b1ae6020e0e0e0c000450343c1ae2020e0e0e0c000303033b0249220c3b1ad5020e0e0c0003293c1a83020c00030304220d020a220d28ff1acb020c0003291b00011ac5020e0e0c0003220e3c1ab6020e0e0e0c00032a2a25112511260f2001013b2704271566022a220e36220f37220f3b1a39020e0e0c000303033b02132a2a220e34220d221022101ae1020e0e0c000865220e3b1a15020e0e0c000307ca303b1a01020e0e0c0003292c1a57020c0003313b1aef010c000303033c020b293b1a2e020e0e0e0c000303033b02a7293b1a26020e0e0e0c00030323293c1a5d020e0e0c00031a89022a1a59020e0e0c00031a55021a7e022b1a7e026b65103b503b503b2a1af2010e0e0e0c000303043b500223293c1a25020e0e0c00031a21022a1a21020e0e0c00031a1d021a1e022b1a1e026b65103b5033230a34230a293b1a62010e0e0e0c0003292d1a97010c00032c3b2b1a92010e0e0e0c000450220e36293b3b1a820102021b000e0e0e0c0004503b2705333b2f1a6e010e0e0e0c0004503b660fd22a3c1a5a010e0e0e0c0003313b1a0f010c0003292b1a67010c0003323b1aff000c000303033c020b293b1a3e010e0e0e0c000303033b02bf291af3001a34010e0c00030323293c1a6d010e0e0c00031aa5012a1a69010e0e0c00031a65011a8e012b1a96016b65103b503b50291abf001af8000e0c0003030c3b220c1a60010e0c000302723b2a1ae9000e0e0c000303043b500223293c1a1d010e0e0c00031a19012a1a19010e0e0c00031a15011a16012b1a16016b65103b5034230a220c230a293b1a59000e0e0c0003292d1a8f00020233000c00032c3b2b1a86000e0e0e0c000450220f36293b3c1a76000e0e0e0c0004503b2705343b2e1a66000e0e0e0c0004503b2704651f0c0e0e0e0e0e00000000241b000000000000|@4797,I253,@4424,I251,@4798,-1,I247,I239,I104,I252,I245,I243,I218,@4850,@4802,@4800,@4768,I106,I255,I110,I113,I231,I234,I105,I152,I107,I109,I232,@677,@2229,I250,I249,I108,I11,@4853,@4804,@4856,@4859,@4861,@510,@4867,@389,@35,@863,@4868,@4869,@4871,@4873,@4882,@4887,@4898,@4901,@4924,@863,@4925,@4924,@4796| 4796:O5|@4755,625,0,625,0 4797:S30|494e5447434f444528292e636f646567656e28352967656e636465283429 4798:O1|@4799 4799:D24,1084|008d220f1a39040e0e0c00021a35040e0e0c000207cd220f35221036220e3522112a1a23040c000364036d220e35220f3622123b1a11040e0e0c000303033c020b22122b1a05040e0e0c000303041aff03103b503b50040200221328082b1af3030c00045029352a362c2b1aea030e0e0e0c00033c2b1ae3030c00032a2a1adf030c0003293b1adb030c0003641ab4030e0c0002270702013b07db2a3c3c302210221022102210221022102210221022190c000d503b22101aad030e0e0c0003030c220f28071a9f030c000302013b039d284522101a94030e0c0003293b1a8f03020243030c0003343b3c1a86030e0e0e0c0004220c1a7f030c0002220d35293b1a78030e0c0003220f372e3b1a38030e0c0003030c1b00012f1a4f030c000302012e291a19030e0e0c00020303290207291a4b030c00022928ff1a22030e0e0e0c00032c2e2b1a3a030e0e0e0c00042214352f3c1a14030e0c00032a3b2b1a26030e0e0e0c0004503b260e0fd23b22101af402020280020e0c0003030c220f28fe1ae3020c000302013b03c1323b3d1ae1020e0e0c0004331adc020e0c00023435293b1ad5020e0e0c0003220d37292b28241ace020e0e0e0c0004220f352c3c1aa8020e0c00032a3b2b1aba020e0e0e0c000450221135293b1a9f020c0003221337221a3b1a5f020c000303101b0001221b1a76020e0e0e0c00030202221a291a3c020e0c00020303290207291a6f020c00022928ff1a46020e0e0e0c00032c2e2b1a5e020e0e0e0c00042218352f3c1a38020e0c00032a3b2b1a4a0202025d010e0e0e0c0004503b26120fca323b3e1a20020e0c0004331a1c020e0c00023435293b1a15020e0e0c0003220d37292b28151a0e020e0e0e0c0004220f352c3c1ae8010e0c00032a3b2b1afa010e0e0e0c00045022173d2a1b00011aed010e0e0c0003293b1ae7010c000303033c0214293b1a96010e0e0e0c00033c2a1aa3010c000364030329020a291b00011a9b010c0003221535293b1aa0010e0c00032217372c3b1a60010e0c0003030c1b00012d1a77010c000302012c291a41010e0e0c00020303290207291a73010c00022928ff1a4a01020285000e0e0e0c00032c2e2b1a5e010e0e0e0c0004221c352f3c1a38010e0c00032a3b2b1a4a010e0e0e0c000450343c1a46010e0e0e0c000303043b500247220c3b1af0000e0c0003293c1aff000c00030304220d020a220d28ff1afb000c0003291b00011a15010e0e0c0003220e3c1ae6000e0e0e0c00032a2a25112511260f20000126042615313b1ad8000e0c0003293c1ac3000c0003333b2b1ad2000e0e0e0c00045022123c1aa9000e0e0c000322123c1a9e000e0e0e0c00032d2b2b221522152215221522152215221522152215221522151aa80022160e7b1016000f22103c1a6e000e0e0e0c00032a2a2212221222122212221222122212221222122212221222121a770022137b1013000f3b1f0e0e0e0e0e0e000000003404000000000000|@4801,I105,I218,I234,I231,@3760,I104,I252,I245,I243,I251,I232,I106,I107,@4802,@4800,I253,I152,@4768,I255,I110,I113,I109,@4798| 4800:O1|@4846 4801:S44|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d73657456616c756573283329 4802:O1|@4803 4803:D17,500|008228dc2c1af0010e0c00032e35293b1ae9010e0e0c000330230d293b1adc010e0c00032b2a1acf010c0003292f1acf010c0003270503033b0fcc2e230a293b1ab9010e0e0c000330230a293b3b1ab3010c0004503003033b0fd03135293b1a9a010e0e0e0c00033337292b3d1a98010e0c0004220c352c3c1a90010e0c00032a3b2b1a7e010e0e0e0c000450220e35293b1a67010c0003221037292b3b1a67010c00042212352c3c1a60010e0c00032a3b2b1a4e010e0e0e0c000450221435293b1a37010c0003291a44011a3d010e0e0c00033c2a693c28402b1a36010e0e0e0c00042219230d293b1a0f010c00032d2a1a23010c00036503162219230d293b2e1aff000202d7000c0004503b6402013b221a3a221b3a293b1adf000c00032d2a692c3b2b1adb00020209000c0004502e3b69271632230d293b1ade001ac3000c000450333a343a293b1aae000e0e0e0c000364220c311ac5000e0e0c00042a3b2b1a9e000e0e0e0c0004502c3b1ab2000e0e0e0c000303033b0252220c1aa6000e0e0e0c0002220d35293b1a6c000e0c00032f291a93000c00021a91000e0e0c0002032629352a362a3b1a4d000e0e0c0003292e22151a79000e0e0c00042b250526041e303b270402013b2704220d230a293b321a2b000c0004503b270964440e0e0e0e0e0e00000000ec01000000000000|@4805,I107,I253,I232,I255,@4768,I106,-1,I11,I234,536870911,@4806,I251,@4800,I105,I218,@4804| 4804:O1|@4823 4805:S32|494e54434f4445434f4e5328292e636865636b4272616e63684c697374283329 4806:O1|@4807 4807:D23,836|00822d1a42030e0e0e0c00021a3d030e0e0c000207cf2d352e36292f2f1a30030e0c00042b3b1a2b030c000329353c1a26030e0e0e0c000307d029363135293b1a11030e0e0c0003292c1a0f030c0003332a1a0b030c00036407d32b3c1a04030e0c00032a2a1af3020c00033b2a1af7020c0003030c291b00011ae3020c000302013b03043b5002041ae002102d220d1add020e0e0c0003293b1ad7020c000303043b5002041acf02102e1ace021ab3020c000329220f1ab6020e0e0e0c0003293d1a93020c000303033c020b293d1aa2020e0e0e0c00030304280f0272293e1a750202024b020e0e0c000303033c020b293e1a7e020e0e0e0c000303042807024e2928051a5002020221020e0c000303033c020b2928051a59020e0e0c000303042809022a2928811a2c020202cb010e0c000303033c020b2928811a35020e0e0c000303043b5002041a33021028822210372a3b1a08020e0c0003030c1b00012b1aff010c000302012a291ad9010e0e0c00020303290207291a07020c00022928ff1a02020e0e0e0c00032c302b1afa010e0e0e0c0004221537333b1ac0010e0c0003030c1b0001341ab7010c0003020133291a91010e0e0c00020303290207291abf010c00022928ff1aba010e0e0e0c00032c22122b1ab1010e0e0c00043b3d2a1b00011aa7010c0003293b1a83010c000303033c0214293b1a96010e0e0e0c00033c2a1a4f010c000364030329020a291b00011a4b010c0003221e35293b1a30010e0c00032220372c3b1a30010e0c0003030c1b00012d1a27010c000302012c291a01010e0e0c00020303290207291a2f010c00022928ff1a2a010e0e0e0c00032c2e2b1a22010e0e0e0c00042225352f3c1aec000e0c00032a3b2b1a16010e0e0e0c000450343c1ae6000e0e0e0c000303033b0248220c3b1af5000e0e0c0003293c1aaf000c00030304220d020a220d28ff1aa3000c0003291b00011ad9000e0e0c0003220e3c1a8e000e0e0e0c00032a2a25112511260f1efa3b2704270d3b22126922183b2b1aaa000e0e0e0c00045022162712022f33230d293b1a51000e0e0c00032d2a1a53000c000365031233230d293b2e1a7c000e0c0004503b6402013b302f69646602012a270402013b440e0e0e0e000000003c03000000000000|@4809,I105,I218,@4806,I253,I251,I107,I234,I106,I232,@4810,@4813,I113,@4818,-1,@4808,I152,I243,@4768,I110,I231,I255,I109| 4808:O4|@35,@863,@4822,@4821 4809:S48|494e54434f4445434f4e5328292e636865636b4272616e63684c697374283329636f6e766572744c6162656c73283129 4810:O4|@35,@863,@4812,@4811 4811:O5|@4767,1004,0,1004,0 4812:S44|636865636b4272616e63684c6973743a206f666673657420746f6f206c6172676520746f20636f6e76657274 4813:O1|@4814 4814:D18,188|00812b37293b1ab7000c00032936291ab2000e0e0e0c0002293b1aab000c0003030c1aa7002a1aa7000c00030201293f2a1aa0000e0c00033b331a9b000c0003030c322a1a81000e0e0c000302013b03043b500237323c1a82000e0e0e0c00032a3c1a77000c0003293b691a72002a692c2a691a6e002a6927051a6b000c00021a69001a6a002b1a6a006b10321a68000e0c00020303320207321a5f000c00022d2a1a5b00340e0e7e0b00030e0e0e0e00000000b400000000000000|@4816,I253,I15,I234,@677,I106,I108,I232,@510,@4789,@4817,@371,@35,@863,@4815,I105,I152,I252| 4815:O5|@4775,218,0,218,0 4816:S24|494e54434f4445434f4e5328292e67657442797465283229 4817:S15|637365674765743a20496e64657820 4818:O4|@35,@863,@4820,@4819 4819:O5|@4767,1010,0,1010,0 4820:S46|636865636b4272616e63684c6973743a20382d626974206f666673657420616c7265616479206669786564207570 4821:O5|@4767,1025,0,1025,0 4822:S36|457874656e64696e6720756e6b6e6f776e206272616e636820696e737472756374696f6e 4823:D22,516|00822d353b1a00020e0c000307d22d36293d1af7010c00032e2a1af3010c00033b2a1aef010c0003030c291aea011aeb010c000302013b03043b5002041ae001102e373d2d2b1adb010c0004293b1ad7010c000303043b5002041acf01102b3d2f2b1b00011ac8010e0c0003293b1ab7010c000303033c0214293b1ab6010e0e0e0c00033c2a1a7f010c000364030329020a291b00011a73010c0003220c372a3b1a78010e0c0003030c1b00012b1a5b010c000302012a291a7d010e0e0c00020303290207291a73010c00022928ff1a6e010e0e0e0c00032c302b1a6601020266000e0e0e0c0004313c1a3b010c000303033b024f323b1a3a010e0e0e0c0003293c1a03010c0003030333020b3328ff1afd000e0e0c0003291b00011a29010e0e0c0003343c1ae7000c0003343c1adb000c00032b2b2b250f250f250f260c1ede3b2705270f02a82d36293c1abd000e0e0c00032e2a1ab7000c00033b2a1ab3000c0003030c291b00011aaf000c000302013b03043b5002041ad000102b2f1ace000e0e0e0c0003293b1a9b000c000303043b5002041abb00102c301ab9000e0e0c000330372c3b1a71000e0e0c0003030c1b00012d1a53000c000302012c291a75000e0e0c00020303290207291a6b000c00022928ff1a66000e0e0e0c00032c322b1a5e00220e0e0e0e7b050e0004440e0e0e0e0e0e0e00000000fc01000000000000|@4825,I251,I106,I107,I232,65536,I234,@4826,@4829,I113,@4832,I110,I231,I105,I152,I243,@4768,I109,@4835,@4813,@4838,@4824| 4824:O1|@4841 4825:S28|494e54434f4445434f4e5328292e66697875704f6666736574283329 4826:O4|@35,@863,@4828,@4827 4827:O5|@4767,921,0,921,0 4828:S41|66697875704f66667365743a206a756d7020746f6f20666172202831362d626974206f666673657429 4829:O1|@4830 4830:D21,252|00822b3b1af9000e0e0c00032936291af2000e0e0e0c0002293b1aeb000c0003030c1ae7002a1ae7000c00030201293f2a1ae0000e0c00033b321adb000c0003030c312a1ac1000e0e0c000302013b03043b500237313c1ac2000e0e0e0c00032a3c1ab7000c0003293b691ab2002a692c2a691aae002a6927051aab000c00021aa9001aaa002b1aaa006b10311aa8000e0c00020303310207311a9f000c00022d2a1a9b000c0003343c1a97000c00030303290237343c1a8e000e0e0e0c0003343c1a4b000c00032a2a220d1a7d000e0e0c0004291b00011a39000e0e0c0003292e1a2b00220f0e7e1000032707440e00000000f400000000000000|@4831,I253,I15,I234,@677,I106,I108,I232,@510,@4789,@4817,@371,@35,@863,@4815,I105,I152,I252,I113,I107,@4829| 4831:S21|494e54434f4445434f4e5328292e67657442283329 4832:O4|@35,@863,@4834,@4833 4833:O5|@4767,927,0,927,0 4834:S43|66697875704f66667365743a2031362d626974206272616e636820616c7265616479206669786564207570 4835:O4|@35,@863,@4837,@4836 4836:O5|@4767,896,0,896,0 4837:S40|66697875704f66667365743a206a756d7020746f6f206661722028382d626974206f666673657429 4838:O4|@35,@863,@4840,@4839 4839:O5|@4767,902,0,902,0 4840:S42|66697875704f66667365743a20382d626974206272616e636820616c7265616479206669786564207570 4841:D5,76|00812b230d293b1a46001a47000c0004502c3a2d3a293b1a3e000e0e0e0c0003642f2f1a36000e0e0e0c00042a3b2b1a22000e0e0e0c0004503b66430e0e0e0e000000004400000000000000|@4843,536870911,I255,I253,@4842| 4842:O1|@4844 4843:S28|494e54434f4445434f4e5328292e72656d6f76654c6162656c283229 4844:D9,188|00822d1aba000e0e0e0c00021ab5000e0e0c000203912d352e362a3b1aa9000e0e0c000329353c1aa2000e0e0e0c000303642936302a1a93000c000303033c020b302a1a8a000e0e0e0c0003030e2b31311a8000320e0e7b050900042f230d293b1a64000e0c00032b2a1a6b000c00036503122f230d293b2c1a60000e0c0004503b6402013b2c32321a48000e0c00042e2a6966020e2a30301a3800310e0e7b050800046602013b440e0e0e0e0e0e0e00000000b400000000000000|@4845,I105,I218,I253,I251,I113,@4842,I234,I255| 4845:S42|494e54434f4445434f4e5328292e72656d6f76654c6162656c28322972656d6f7665456e747279283129 4846:D22,1148|00802b230a293b1a76040e0e0e0c0003293b1a6f040c00030323293c1a69040e0e0c00031a65042a1a65040e0e0c00031a61041a62042b1a62046b65103b50293b1a5c040e0c000303033b0fca28ff2a1a51040e0e0c000307cc2d36293b1a1f040c00036403042819020228182e35293b1a0c040e0c000330372c3b1a05040e0e0c0003030c1b00012d1a1b040c000302012c291a15040e0e0c00020303290207291a0b040c00022928ff1a06040e0e0e0c00032c2e2b1afe030e0e0e0c0004220c352f3c1ae0030e0c00032a3b2b1aea030e0e0e0c000450333d2a1b00011ade030e0e0e0c0003293b1ab3030c000303033c0214293b1aca030e0e0e0c00033c2a1ac3030c000364030329020e291b00011a9303020243030c0003221235293b1a5c030202c2000e0c00032214372c3b1a50030e0c0003030c1b00012d1a67030c000302012c291a61030e0e0c00020303290207291a57030c00022928ff1a52030e0e0e0c00032c2e2b1a4a030e0e0e0c00042219352f3c1a2c030e0c00032a3b2b1a36030e0e0e0c000450343c1a0e030e0e0e0c000303033b0249220c3b1a21030e0e0c0003293c1a1b030c00030304220d020a220d28ff1a0f030c0003291b00011a09030e0e0c0003220e3c1afa020e0e0e0c00032a2a25112511260f2005013b270427170fd32d36293b1a8f020c00036407c83e2a1a88020e0c000303a02d35293b1a77020c00032f37292b28271aa3020c000431352c3c1a89020e0e0c00032a3b2b1a92020e0e0e0c0004503335293b1a48020e0c0003220c37323b1a40020e0c0003030c1b0001331a57020c0003020132291a51020e0e0c00020303290207291a47020c00022928ff1a42020e0e0e0c00032c2e2b1a3a020e0e0e0c00042211352f3c1a1c020e0c00032a3b2b1a26020e0e0e0c0004503b270f028628642a1a00020e0c0003293c1a1b020c00032f35293b1ac50102049d0169000c000331372c3b1ab9010e0e0c0003030c1b00012d1acf010c000302012c291ac9010e0e0c00020303290207291abf010c00022928ff1aba010e0e0e0c00032c2e2b1ab2010e0e0e0c0004220d352f3c1a94010e0c00032a3b2b1a9e010e0e0e0c0004503b270b0fd33d2a1a55010e0e0c000303a02d35293b1a43010c00032f37292b28261a6f010c000431352c3c1a55010e0e0c00032a3b2b1a5e010e0e0e0c0004503335293b1a14010e0c0003220c37323b1a0c010e0c0003030c1b0001331a23010c0003020132291a1d010e0e0c00020303290207291a13010c00022928ff1a0e010e0e0e0c00032c2e2b1a06010e0e0e0c00042211352f3c1ae8000e0c00032a3b2b1af2000e0e0e0c0004503b270f028628502a1acc000e0c0003293c1ae7000c00032f35293b1a91000e0e0c000331372c3b1a890002025d000e0e0c0003030c1b00012d1a9b000c000302012c291a95000e0e0c00020303290207291a8b000c00022928ff1a86000e0e0e0c00032c2e2b1a7e000e0e0e0c0004220d352f3c1a60000e0c00032a3b2b1a6a000e0e0e0c0004503b270b2e230a293b3b1a57000c0004503b2704420e0e0e000000007404000000000000|@4848,I253,I234,@510,@4849,@389,@35,@863,@4847,I113,I232,I106,I105,I152,I243,@4768,I255,I110,I231,I251,I107,I109| 4847:O5|@4767,815,0,815,0 4848:S24|494e54434f4445434f4e5328292e72657365745370283129 4849:S25|726573657453703a206261642072657365742076616c756520 4850:O1|@4851 4851:D24,1756|00842d352e36313b1ad5060e0e0c000303033c020b312b1aca060e0e0e0c000303041ac306103b503b500402003228082b1ab8060e0c00045029352a362c2b1aae060e0e0e0c00033c2b1aa7060c00032a2a1aa3060c0003293b1a9f060c0003641a9c060e0c0002270707cc2c3b3c1a92060e0e0e0c00042d1a8c060e0c00022e35293b1a85060e0e0c00033037292b282a1a7b060c000432352c3c1a75060e0e0c00032a3b2b1a6e060e0e0e0c0004503b220f1a65060e0e0c0003030c220e28051a57060c000302013b039d2835220f1a40060e0c0003293b1a43060c0003220d3b3c1a1d060e0e0c0004220e1a17060c0002220f35293b1a10060e0c00032211372e3b1ad8050e0c0003030c1b00012f1aff050c000302012e291a05060e0e0c00020303290207291afb050c00022928ff1ac20502027a050e0e0e0c00032c2e2b1aca050e0e0e0c00042216352f3c1ac0050e0c00032a3b2b1aba050e0e0e0c0004503b260e0fce3b220f1aac050e0c0003030c220e28fe1a9f050c000302013b03c1343b3d1a79050e0e0c0004220c1a73050c0002220d35293b1a6c050e0c0003220f37292b28231a62050e0e0e0c00042211352c3c1a58050e0c00032a3b2b1a52050e0e0e0c000450221335293b1a37050c000322153722193b1aff040c000303101b0001221a1a26050e0e0e0c000302022219291a28050e0c00020303290207291a1f050c00022928ff1ae6040e0e0e0c00032c2e2b1af2040e0e0e0c0004221a352f3c1ae8040e0c00032a3b2b1ae20402025d010e0e0e0c0004503b26120fca343b3e1ab8040e0c0004220c1ab3040c0002220d35293b1aac040e0c0003220f37292b28141aa2040e0e0e0c00042211352c3c1a98040e0c00032a3b2b1a92040e0e0e0c00045022163d2a1b00011a95040e0e0c0003293b1a8f040c000303033c0214293b1a36040e0e0e0c00033c2a1a43040c000364030329020a291b00011a4b040c0003221735293b1a38040e0c00032219372c3b1a00040e0c0003030c1b00012d1a27040c000302012c291a2d040e0e0c00020303290207291a23040c00022928ff1aea03020285000e0e0e0c00032c2e2b1af2030e0e0e0c0004221e352f3c1ae8030e0c00032a3b2b1ae2030e0e0e0c000450343c1aee030e0e0e0c000303043b500247220c3b1a90030e0c0003293c1a9f030c00030304220d020a220d28ff1ab3030c0003291b00011abd030e0e0c0003220e3c1a9e030e0e0e0c00032a2a25112511260f200001260426153b220e1a7f030c0003030c220d28071a73030c000302013b03992845220e1a5c030e0c0003293b1a5f030c0003220d3b3c1a39030e0e0c0004220e1a33030c0002220f35293b1a2c030e0c00032211372e3b1af4020e0c0003030c1b00012f1a1b030c000302012e291a21030e0e0c00020303290207291a17030c00022928ff1ade020e0e0e0c00032c2e2b1aea020e0e0e0c00042216352f3c1ae0020e0c00032a3b2b1ada020e0e0e0c0004503b260e0fce3b220e1acc020e0c0003030c220d28fe1abf020c000302013b03c1343b3d1a99020e0e0c0004220c1a93020c0002220d35293b1a8c020e0c0003220f37292b28241a82020e0e0e0c00042211352c3c1a78020e0c00032a3b2b1a72020e0e0e0c000450221335293b1a57020c000322153722183b1a1f020c000303101b000122191a46020e0e0e0c000302022218291a48020e0c00020303290207291a3f020c00022928ff1a06020e0e0e0c00032c2e2b1a12020e0e0e0c0004221a352f3c1a08020e0c00032a3b2b1a020202025d010e0e0e0c0004503b26120fca343b3e1ad8010e0c0004220c1ad3010c0002220d35293b1acc010e0c0003220f37292b28151ac2010e0e0e0c00042211352c3c1ab8010e0c00032a3b2b1ab2010e0e0e0c00045022153d2a1b00011ab5010e0e0c0003293b1aaf010c000303033c0214293b1a56010e0e0e0c00033c2a1a63010c000364030329020a291b00011a6b010c0003221735293b1a58010e0c00032219372c3b1a20010e0c0003030c1b00012d1a47010c000302012c291a4d010e0e0c00020303290207291a43010c00022928ff1a0a01020285000e0e0e0c00032c2e2b1a12010e0e0e0c0004221e352f3c1a08010e0c00032a3b2b1a02010e0e0e0c000450343c1a0e010e0e0e0c000303043b500247220c3b1ab0000e0c0003293c1abf000c00030304220d020a220d28ff1ad3000c0003291b00011add000e0e0c0003220e3c1abe000e0e0e0c00032a2a25112511260f20000126042615220e341ab3000c000303033b022b220e3c1a89000e0e0c0003220e3c1a7e000e0e0e0c00032a2a2210221022101a910022110e0e7b07110006270802182f3c1a5b000c000329303030301a7400310e0e7b070800061f050e0e00000000d406000000000000|@4852,I234,I231,@3760,I104,I252,I245,I243,I251,I218,@4802,@4800,I253,@4768,I106,I255,I232,I107,I105,I152,I110,I113,I109,@4850| 4852:S39|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d636f7079283229 4853:O1|@4854 4854:D12,228|00812c230a293b1ade000e0e0e0c0003293b1ad7000c0003651ad4000e0c00022903042817020228142e3b2b1ac5000e0e0c00042f1ac0000e0c00023035293b1aa5000e0e0c000329321aaf000c0003293f1aab000c0003293b1a8f000c000303033c0214293b1a9a000e0e0e0c00033c2a1a93000c000364030329020a293f1a79000e0e0c0003293d1a5f000c000327051a5b000c000203373035293b1a47000c00033237292b280e1a5f000c000434352c3c1a45000e0e0c00032a3b2b1a4e000e0e0e0c000426071e8e3b270602013b2704430e0e0e00000000dc00000000000000|@4855,I253,I113,I218,@4802,@4800,I106,I110,I231,I251,@4768,I255| 4855:S29|494e54434f4445434f4e5328292e616c69676e4f6666576f7264283229 4856:O4|@35,@863,@4858,@4857 4857:O5|@4755,379,0,379,0 4858:S27|4e6f20426567696e4c6f6f7020666f72204c6f6f7020696e737472 4859:O1|@4860 4860:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4859| 4861:O1|@4862 4862:D22,948|008b220d1ab1030e0e0c00021aad030e0e0c000207d5220d35220e36220e1a97030c00021a95030e0e0c000203043b5002041a8b03103b50220e362b3c3c3b22112211221122112211221122112211221a0c000d2b2b22112211221122112211221122112211221122111a57030c000d3c2a1a53030c0003030c293b1a49030e0e0c000302013b039d28252a1a3d030e0e0c0003293c1a37030c0003220e3b3c1a31030e0e0c0004220f1a2b030c0002221035293b1a24030e0c00032212372e3b1a1c030e0c0003030c1b00012f1afb020c000302012e291add020e0e0c0002030329020b291afb02020289020c00022928ff1af2020e0e0e0c00032c2e2b1aea020e0e0e0c00042217352f3c1abc020e0c00032a3b2b1ad6020e0e0e0c0004503b260e0fce3b2a1a9d020e0e0c0003030c2928fe1a90020e0c000302013b03c1220c3b3d1a8c020e0c0004220d1a87020c0002220e35293b1a80020e0c0003221037292b28251a82020e0e0e0c00042212352c3c1a54020e0c00032a3b2b1a6e020e0e0e0c000450221435293b1a4b020c0003221637343b1a44020e0c000303101b0001220c1a22020e0e0e0c0003020134291a01020e0e0c00020303290207291a1f020c00022928ff1a1a020e0e0e0c00032c2e2b1a12020e0e0e0c0004221b352f3c1ae4010e0c00032a3b2b1afe0102025d010e0e0e0c0004503b26120fca220c3b3e1acb010c0004220d1ac7010c0002220e35293b1ac0010e0c0003221037292b28171ac2010e0e0e0c00042212352c3c1a94010e0c00032a3b2b1aae010e0e0e0c000450313d2a1b00011aa2010e0e0e0c0003293b1a9b010c000303033c0214293b1a92010e0e0e0c00033c2a1a8b010c000364030329020a291b00011a47010c0003221835293b1a4c010e0c0003221a372c3b1a44010e0c0003030c1b00012d1a23010c000302012c291a05010e0e0c00020303290207291a23010c00022928ff1a1e01020285000e0e0e0c00032c2e2b1a12010e0e0e0c0004221f352f3c1ae4000e0c00032a3b2b1afe000e0e0e0c000450343c1afa000e0e0e0c000303043b500247220c3b1aec000e0c0003293c1ae7000c00030304220d020a220d28ff1aa7000c0003291b00011ad1000e0e0c0003220e3c1a92000e0e0e0c00032a2a25112511260f20010126042615343b1a84000e0c0003293c1a6f000c0003220d3b2b1a85000e0e0c0004502b2707022a220c3b1a84000e0c000303043b5002041a7f00103b502f3b1a4b000c0003292d1a37002e0e0e7e0f00031f0c0e0e0e0e0e0e00000000ac03000000000000|@4864,I105,I218,@4863,@4861,I232,I106,I107,@4802,@4800,I253,I234,I152,I243,@4768,I255,I110,I113,I231,I251,I109,@4863| 4863:O4|@35,@863,@4866,@4865 4864:S43|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d6c6f616441726773283229 4865:O5|@4755,394,0,394,0 4866:S30|6c6f6164417267733a204d69736d61746368656420617267756d656e7473 4867:S23|7265736574537461636b3a20626164206f666673657420 4868:O5|@4767,1563,0,1563,0 4869:O1|@4870 4870:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4869| 4871:O1|@4872 4872:D6,156|008a220c1a99000e0e0c00021a95000e0e0c00020371220c35220d362a352b36293c3c3222122212221222122212221222122212221b0e0e0e0c000d50333b1a66000e0e0e0c0003296801220f2d2b1a5a000e0e0e0c000450220c3b1a49000e0e0c00032e22132213221322132213221322132213221322131a34000e0c000c2a2a69270802013b1f0b0e0e0e0e0e0e000000009400000000000000|@1785,I105,I218,I253,@4873,@4871| 4873:O1|@4874 4874:D16,388|00822d35293b1a7f010c000329353c1a7a010e0e0e0c000303043b5002041a6f0110293630362a3b1a5d010e0e0c0003312a1a5f010c0003640341303b1a54010e0c000303033c02142a3b1a3a010e0e0e0c0003312a1a3f010c00036403041a3a01103b50303c1a36010e0e0e0c00032b2a321a2e01337b050a00042a3b1a07010c0003293e1a1f010c0003323c1a0f010c00032a2a1a13010c000303032a020129293b1aed000e0e0c000303033c020b291afb001ae0000e0c000303041af300103b50293c1ad7000c0003292840301ae5000e0e0c0004293b2d1ac6000e0e0e0c000450303b1a9e000e0e0e0c00033b2a1aab000c00032b3b1a8b000c00032a2a1aa7000c00036503041aae00103b50313c2c3c2d1aa7000c0006503c2b69343b2b1a7e000e0e0e0c000450220f3b1a61000e0e0c000303033c02182b3b1a46000e0e0e0c000322102a1a4a000e0e0e0c00036403041a4200103b50220f3c1a3d000e0e0c00032c2a22111a350022120e0e7b05120004000000007c01000000000000|@4876,I253,I251,@4877,I234,I231,@1879,I106,I255,I108,I233,16777214,@1868,I11,@4875,I195| 4875:O4|11,@316,0,@4881 4876:S22|5374726574636841727261792e757064617465283329 4877:O4|103,@407,@4879,@4878 4878:O5|@4880,93,0,93,0 4879:S39|417474656d707420746f207570646174652061206c6f636b656420737472657463684172726179 4880:S40|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f5374726574636841727261792e4d4c 4881:O5|@1852,200,0,200,0 4882:O1|@4883 4883:D5,108|0089341a6a000e0e0e0c00021a65000e0e0c000203423435220c362a352b361a56001a57002d221122112211221122112211221122112211220d680d2a3c2b220f2212221022102216221122112211221822127b0d11000c3b1f0a0e0e0e0e0e000000006400000000000000|@4885,I105,I218,@4884,@4882| 4884:D3,84|008056093b1a50000e0c0003296801562a12040001000c002b1a40000e0c00045056285639564a565b566c567d568e569f120b0001000a00120c0001000b0056c7220e7b0c05000b000000004c00000000000000|@4886,I253,@4873| 4885:S48|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d67656e4d757475616c44656373283129 4886:S51|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d67656e4d757475616c44656373283129283129 4887:O1|@4888 4888:D24,1284|00812c1a02050e0e0e0c000203202c1af6040e0e0e0c000203043b5002041aeb04102c1aea041aeb040c000302013b07ca2c1ad3040c000203043b5002041ad704102c3b1ad5040e0e0c0003030c1acf042d1acf040c000302012c29401ac8040e0c000303482c3b3c1ac0040e0c00042d1abc040e0c00022e35293b1ab5040e0e0c00033037292b28401aab040c000432352c3c1a8d040e0e0c00032a3b2b1a9a040e0e0e0c0004503b27080fd5293f1a8d040e0e0c00030394283b2a1a64040e0c00032d3b3c1a62040e0e0e0c00042e1a5c040e0c00022f35293b1a55040e0e0c000331372e3b1a31040e0e0c000303101b00012f1a2b0402026e020c000302012e291a01040e0e0c00020303290207291a2f040c00022928ff1a2a040e0e0e0c00032c2e2b1a0e040e0e0e0c0004220d352f3c1aec030e0c00032a3b2b1afa030e0e0e0c0004503b270c0fd0291b00011ac7030c000303bc2c3b3d1acc030e0c00042d1ac8030e0c00022e35293b1ac1030e0e0c00033037292b28281ab7030202e3010c000432352c3c1a95030e0e0c00032a3b2b1aa2030e0e0e0c0004503435293b1a8c030e0c0003220d37343b1a68030e0c000303101b0001220c1a62030e0e0e0c0003020134291a39030e0e0c00020303290207291a67030c00022928ff1a62030e0e0e0c00032c2e2b1a46030e0e0e0c00042212352f3c1a24030e0c00032a3b2b1a32030e0e0e0c0004503b27110fca2c3b3e1a1003020248010e0c00042d1a08030e0c00022e35293b1a01030e0e0c00033037292b281b1af7020c000432352c3c1ad9020e0e0c00032a3b2b1ae6020e0e0e0c000450313d2a1b00011ae6020e0e0e0c0003293b1ab7020c000303033c0214293b1ad2020e0e0e0c00033c2a1acb020c000364030329020a291b00011a8b020c0003220f35293b1a90020e0c00032211372c3b1a6c020e0c0003030c1b00012d1a67020c000302012c291a41020e0e0c00020303290207291a6f020c00022928ff1a6a02020286000e0e0e0c00032c2e2b1a4a020e0e0e0c00042216352f3c1a28020e0c00032a3b2b1a36020e0e0e0c000450343c1a16020e0e0e0c000303033b0249220c3b1a2d020e0e0c0003293c1a27020c00030304220d020a220d28ff1a1b020c0003291b00011a15020e0e0c0003220e3c1a06020e0e0e0c00032a2a25112511260f2001013b27042715640fd43c2d69292d1aed010e0e0c00032d3b3e1aae010e0e0e0c00042e1aa8010e0c00022f35293b1aa1010e0e0c00033137292b281a1a97010c000433352c3c1a79010e0e0c00032a3b2b1a86010e0e0e0c000450220c35293b1a6f010c00033b3d2a1b00011a7b010c0003293b1a4f010c000303033c0214293b1a6a010e0e0e0c00033c2a1a63010c000364030329020a291b00011a23010c0003221235293b1a28010e0c00032214372c3b1a04010e0c0003030c1b00012d1aff000c000302012c291ad9000e0e0c0002030329020b291a07010202b3000c00022928ff1afe000e0e0e0c00032c2e2b1ae2000e0e0e0c00042219352f3c1ac0000e0c00032a3b2b1ace000e0e0e0c000450343c1aae000e0e0e0c000303033b0248220c3b1ac5000e0e0c0003293c1abf000c00030304220d020a220d28ff1ab3000c0003291b00011aad000e0e0c0003220e3c1a9e000e0e0e0c00032a2a25112511260f1efe3b2704270d220f23082b220d6922112308293b1a54000e0c00032b2a692d3b2b1a4f000c0004503b2712430e0e0e00000000fc04000000000000|@4890,I105,@3062,32768,I250,@3062,I234,@677,I106,I113,@4802,@4800,I253,@4768,I255,I232,I152,I243,I110,I231,I251,I107,I109,@4889| 4889:O1|@4891 4890:S26|494e54434f4445434f4e5328292e70757368436f6e7374283229 4891:D3,44|00812b38293b1a27000c00033b2a30301a2100310e0e0e7b060600050e0e0e0e000000002400000000000000|@4893,I253,@4892| 4892:O1|@4894 4893:S30|494e54434f4445434f4e5328292e616464436f6e7374546f566563283229 4894:D9,260|00832d1a02010e0e0e0c00021afd000e0e0c000203792d352e362e353b1af0000e0c000303292e362b353b1ae2000e0e0e0c000303152b362a230b2a230b2a2a1acd000e0e0c00036602013b64021e2e362b353c1ab9000e0e0c0003030d2b362a2a1aab000c00036402013b64030330021a303c1a9d000e0e0c0003292b31311a9500320e0e0e7b060900056502622b230b2c230b293b1a82000e0e0e0c0003293c1a6f000c00032c3b2b1a72000e0e0e0c0004502f383038293b1a5e000e0e0e0c0003333b69293b1a44000e0c000303032a020b2a2a1a4a000e0e0e0c00032d3b2b1a3a000e0e0e0c000450220e27091f040e0e0e0e0e00000000fc00000000000000|@4896,I105,I218,I251,I106,@4892,I253,I255,@4895| 4895:O1|@4897 4896:S42|494e54434f4445434f4e5328292e616464436f6e7374546f56656328322966696e64436f6e7374283329 4897:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4895| 4898:O1|@4899 4899:D1,20|00803b420e0e0e0e000000000c00000000000000|@4900| 4900:S35|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d283129 4901:O1|@4902 4902:D25,4292|008631353e1ac0100e0c000307d23b3c310c000329353b1aae100e0e0e0c000307ce29362a37293b1aa1100e0e0c00030319313b1a99100e0e0c0003292b2d341a91100e0e0c0005640fd2313b1a80100e0c0003292c1a7f100c00033b2a1a7b100c0003030c29280b1a70100e0c000302013b03a128292a1a5d100e0e0c0003293b1a5b100c0003343b3c1a56100e0e0e0c0004220c1a4f100c0002220d35293b1a2c100e0c0003220f372e3b1a3c100e0c0003030c1b00012f1a1b100c000302012e291a29100e0e0c00020303290207291a1f100c00022928ff1a1a10020235040e0e0e0c00032c2e2b1a0e1002027c020e0e0e0c00042214352f3c1ad80f0e0c00032a3b2b1af60f0e0e0e0c0004503b270d0fd23b2a1ac10f02022a020e0e0c0003030c2928fe1ab00f0e0c000302013b03c1323b3d1aa90f0e0e0c0004331aa40f0e0c00023435293b1a810f0e0e0c0003220d37292b28221a9e0f0e0e0e0c0004220f352c3c1a6c0f0e0c00032a3b2b1a8a0f0e0e0e0c000450221135293b1a4b0f0c0003221337343b1a5c0f0e0c000303101b0001220c1a3a0f0e0e0e0c0003020134291a450f0e0e0c00020303290207291a3b0f0c00022928ff1a360f0e0e0e0c00032c2e2b1a2e0f0e0e0e0c00042218352f3c1afc0e0e0c00032a3b2b1a1a0f02025e010e0e0e0c0004503b27110fca323b3e1ae80e0e0c0004331ae40e0e0c00023435293b1ac10e0e0e0c0003220d37292b28131ade0e0e0e0e0c0004220f352c3c1aac0e0e0c00032a3b2b1aca0e0e0e0e0c000450313d2a1b00011abe0e0e0e0e0c0003293b1ab70e0c000303033c0214293b1aae0e0e0e0e0c00033c2a1a5f0e0c000364030329020a291b00011a5f0e0c0003221535293b1a4c0e0e0c00032217372c3b1a5c0e0e0c0003030c1b00012d1a3b0e0c000302012c291a490e0e0e0c00020303290207291a3f0e0c00022928ff1a3a0e020286000e0e0e0c00032c2e2b1a2e0e0e0e0e0c0004221c352f3c1afc0d0e0c00032a3b2b1a1a0e0e0e0e0c000450343c1a160e0e0e0e0c000303033b0249220c3b1a090e0e0e0c0003293c1abb0d0c00030304220d020a220d28ff1ac30d0c0003291b00011ae90d0e0e0c0003220e3c1aae0d0e0e0e0c00032a2a25112511260f2001013b2704271565323b1a820d0e0e0e0c0003293c1a7f0d0c0003343b2b1a9e0d0e0e0e0c0004503b27050fd1293629301a9f0d0c0003303b3e1a660d0e0e0e0c0004311a600d0e0c00023235293b1a3d0d0e0e0c00033437292b281a1a5b0d0c0004220d352c3c1a2c0d0e0c00032a3b2b1a4a0d0e0e0e0c000450220f35293b1a0b0d0c00033b3d2a1b00011a330d0c0003293b1a2f0d0c000303033c0214293b1a260d0e0e0e0c00033c2a1ad70c0c000364030329020a291b00011ad70c0c0003221535293b1ac40c0e0c00032217372c3b1ad40c0e0c0003030c1b00012d1ab30c0c000302012c291ac10c0e0e0c0002030329020b291ab70c0202d3000c00022928ff1aae0c0e0e0e0c00032c2e2b1aa60c0e0e0e0c0004221c352f3c1a740c0e0c00032a3b2b1a920c0e0e0e0c000450343c1a8e0c0e0e0e0c000303033b0248220c3b1a810c0e0e0c0003293c1a330c0c00030304220d020a220d28ff1a3b0c0c0003291b00011a610c0e0e0c0003220e3c1a260c0e0e0e0c00032a2a25112511260f1efe3b2704270d221223082b220d6922142308293b1af00b0e0c00032b2a692d3b2b1a130c0c00045022183b1ad90b0e0e0c0003293c1ad70b0c0003221a3b2b1af50b0e0e0c0004503b2714640fd231353c1aab0b0c000307c93136293c1aaf0b0c0003293c330e0e0c000329353b1a8e0b0e0e0e0c000307ce29362a37293b1a810b0e0e0c00030319333b1a790b0e0e0c0003292b2d220d1a700b0e0c0005640fd2333b1a600b0e0c0003292c1a5f0b0c00033b2a1a5b0b0c0003030c29280b1a500b0e0c000302013b03a128292a1a3d0b0e0e0c0003293b1a3b0b0c0003220d3b3c1a350b0e0e0c0004220e1a2f0b0c0002220f35293b1a0c0b0e0c00032211372e3b1a1c0b0e0c0003030c1b00012f1afb0a0c000302012e291a090b0204c50a4e040c00020303290207291afb0a0c00022928ff1af60a0e0e0e0c00032c2e2b1aee0a02027c020e0e0e0c00042216352f3c1ab80a0e0c00032a3b2b1ad60a0e0e0e0c0004503b270d0fd23b2a1aa10a02022a020e0e0c0003030c2928fe1a900a0e0c000302013b03c1343b3d1a890a0e0e0c0004220c1a830a0c0002220d35293b1a600a0e0c0003220f37292b28221a7e0a0e0e0e0c00042211352c3c1a4c0a0e0c00032a3b2b1a6a0a0e0e0e0c000450221335293b1a2b0a0c0003221537343b1a3c0a0e0c000303101b0001220c1a1a0a0e0e0e0c0003020134291a250a0e0e0c00020303290207291a1b0a0c00022928ff1a160a0e0e0e0c00032c2e2b1a0e0a0e0e0e0c0004221a352f3c1adc090e0c00032a3b2b1afa0902025e010e0e0e0c0004503b27110fca343b3e1ac8090e0c0004220c1ac3090c0002220d35293b1aa0090e0c0003220f37292b28131abe090e0e0e0c00042211352c3c1a8c090e0c00032a3b2b1aaa090e0e0e0c000450313d2a1b00011a9e090e0e0e0c0003293b1a97090c000303033c0214293b1a8e090e0e0e0c00033c2a1a3f090c000364030329020a291b00011a3f090c0003221735293b1a2c090e0c00032219372c3b1a3c090e0c0003030c1b00012d1a1b090c000302012c291a29090e0e0c00020303290207291a1f090c00022928ff1a1a09020286000e0e0e0c00032c2e2b1a0e090e0e0e0c0004221e352f3c1adc080e0c00032a3b2b1afa080e0e0e0c000450343c1af6080e0e0e0c000303033b0249220c3b1ae9080e0e0c0003293c1a9b080c00030304220d020a220d28ff1aa3080c0003291b00011ac9080e0e0c0003220e3c1a8e080e0e0e0c00032a2a25112511260f2001013b2704271565343b1a62080e0e0e0c0003293c1a5f080c0003220d3b2b1a7d080e0e0c0004503b27050fd5293629321a7f080c0003323b3e1a46080e0e0e0c0004331a40080e0c00023435293b1a1d080e0e0c0003220d37292b281a1a3a080e0e0e0c0004220f352c3c1a08080e0c00032a3b2b1a26080e0e0e0c000450221135293b1ae7070c00033b3d2a1b00011a0f080c0003293b1a0b080c000303033c0214293b1a02080e0e0e0c00033c2a1ab3070c000364030329020a291b00011ab3070c0003221735293b1aa0070e0c00032219372c3b1ab0070e0c0003030c1b00012d1a8f070c000302012c291a9d070e0e0c0002030329020b291a93070202d3000c00022928ff1a8a070e0e0e0c00032c2e2b1a82070e0e0e0c0004221e352f3c1a50070e0c00032a3b2b1a6e070e0e0e0c000450343c1a6a070e0e0e0c000303033b0248220c3b1a5d070e0e0c0003293c1a0f070c00030304220d020a220d28ff1a17070c0003291b00011a3d070e0e0c0003220e3c1a02070e0e0e0c00032a2a25112511260f1efe3b2704270d221423082b220d6922162308293b1acc060e0c00032b2a692d3b2b1aef060c000450221a3b1ab5060e0e0c0003293c1ab3060c0003221c3b2b1ad1060e0e0c0004503b2714660fd131353d1a87060c000307c831362d2a1acb060c0003291a9c060e0c00021ac1060e0e0c000203043b5002041ab706103b502935291ab2060e0e0e0c0002323b1a53060c0003292b1a53060c00033b2a1a4f060c0003030c29280b1a44060e0c000302013b039d28292a1a31060e0e0c0003293b1a2f060c0003220c3b3c1a29060e0e0c0004220d1a23060c0002220e35293b1a00060e0c00032210372e3b1a10060e0c0003030c1b00012f1aef050c000302012e291afd050e0e0c00020303290207291af3050c00022928ff1aee050204a20582020e0c00032c2e2b1ae2050e0e0e0c00042215352f3c1ab0050e0c00032a3b2b1ace050e0e0e0c0004503b270d0fce3b2a1a99050e0e0c0003030c2928fe1a8c050e0c000302013b03c1333b3d1a85050e0e0c0004341a80050e0c0002220c35293b1a5c050e0c0003220e37292b28221a7a050e0e0e0c00042210352c3c1a48050e0c00032a3b2b1a66050e0e0e0c000450221235293b1a27050c0003221437343b1a38050e0c000303101b0001220c1a16050e0e0e0c0003020134291a21050e0e0c00020303290207291a17050c00022928ff1a12050e0e0e0c00032c2e2b1a0a050e0e0e0c00042219352f3c1ad8040e0c00032a3b2b1af60402025e010e0e0e0c0004503b27110fca333b3e1ac4040e0c0004341ac0040e0c0002220c35293b1a9c040e0c0003220e37292b28131aba040e0e0e0c00042210352c3c1a88040e0c00032a3b2b1aa6040e0e0e0c000450313d2a1b00011a9a040e0e0e0c0003293b1a93040c000303033c0214293b1a8a040e0e0e0c00033c2a1a3b040c000364030329020a291b00011a3b040c0003221635293b1a28040e0c00032218372c3b1a38040e0c0003030c1b00012d1a17040c000302012c291a25040e0e0c00020303290207291a1b040c00022928ff1a1604020286000e0e0e0c00032c2e2b1a0a040e0e0e0c0004221d352f3c1ad8030e0c00032a3b2b1af6030e0e0e0c000450343c1af2030e0e0e0c000303033b0249220c3b1ae5030e0e0c0003293c1a97030c00030304220d020a220d28ff1a9f030c0003291b00011ac5030e0e0c0003220e3c1a8a030e0e0e0c00032a2a25112511260f2001013b27042715220c3b1a5e030e0e0e0c0003293c1a5b030c0003220e3b2b1a79030e0e0c0004503b27090fd331362c2a1a47030c0003303b1a2f030c0003292b1a2f030c00033b2a1a2b030c0003030c29280b1a20030e0c000302013b039928292a1a0d030e0e0c0003293b1a0b030c0003333b3c1a06030e0e0e0c0004341a00030e0c0002220c35293b1adc020e0c0003220e372e3b1aec020e0c0003030c1b00012f1acb020c000302012e291ad9020e0e0c00020303290207291acf020c00022928ff1aca020e0e0e0c00032c2e2b1ac2020e0e0e0c00042213352f3c1a90020e0c00032a3b2b1aae020e0e0e0c0004503b270d0fd23b2a1a7902020249020e0e0c0003030c2928fe1a68020e0c000302013b03c1313b3d1a61020e0e0c0004321a5c020e0c00023335293b1a39020e0e0c0003220c37292b28221a56020e0e0e0c0004220e352c3c1a24020e0c00032a3b2b1a42020e0e0e0c000450221035293b1a03020c0003221237343b1a14020e0c000303101b0001220c1af2010e0e0e0c0003020134291afd010e0e0c00020303290207291af3010c00022928ff1aee010e0e0e0c00032c2e2b1ae6010e0e0e0c00042217352f3c1ab4010e0c00032a3b2b1ad20102025e010e0e0e0c0004503b27110fca313b3e1aa0010e0c0004321a9c010e0c00023335293b1a79010e0e0c0003220c37292b28131a96010e0e0e0c0004220e352c3c1a64010e0c00032a3b2b1a82010e0e0e0c000450313d2a1b00011a76010e0e0e0c0003293b1a6f010c000303033c0214293b1a66010e0e0e0c00033c2a1a17010c000364030329020a291b00011a17010c0003221435293b1a04010e0c00032216372c3b1a14010e0c0003030c1b00012d1af3000c000302012c291a01010e0e0c00020303290207291af7000c00022928ff1af200020286000e0e0e0c00032c2e2b1ae6000e0e0e0c0004221b352f3c1ab4000e0c00032a3b2b1ad2000e0e0e0c000450343c1ace000e0e0e0c000303033b0249220c3b1ac1000e0e0c0003293c1a73000c00030304220d020a220d28ff1a7b000c0003291b00011aa1000e0e0c0003220e3c1a66000e0e0e0c00032a2a25112511260f2001013b27042715333b1a3b000c0003293c1a3b000c0003220c3b2b1a59000e0e0c0004503b27071f070e0e0e0e0e0e00000000bc10000000000000|@4904,I251,I233,I253,@4905,I106,I232,I107,@4802,@4800,I234,I105,I152,I243,@4768,I255,I110,I113,I231,I109,@4911,@4919,I218,@4903,I111| 4903:O4|@35,@863,@4923,@4922 4904:S31|494e5447434f444528292e636f646567656e2835296c6f6361646472283229 4905:O1|@4906 4906:D21,1284|00832e3b1a01050e0e0c000303033c020b2d3b1af2040e0e0e0c000303041aeb04103b502e28101ade040e0e0e0c0003032a2d3e1ad1040e0e0c0003031b1acf042d1ac3040c0003030c2c28091ab8040e0c000302013b02013b02013b07cb28562e1aaf040c0003293c1aab040c00032d3b3c1aa6040e0e0e0c00042e1aa0040e0c00022f35293b1a99040e0e0c000331372e3b1a91040e0e0c0003030c1b00012f1a6f040c000302012e291a7d040e0e0c00020303290207291a73040c00022928ff1a6e040e0e0e0c00032c2e2b1a66040e0e0e0c0004220d352f3c1a34040e0c00032a3b2b1a52040e0e0e0c00045022123c1a21040e0e0c00032928101a3e040e0e0e0c00032922131a06040e0e0e0c00032928061afa030e0e0e0c0003221335293b1afc0302026a000e0c00032215372c3b1af0030e0c0003030c1b00012d1acf030c000302012c291add030e0e0c00020303290207291ad3030c00022928ff1ace030e0e0e0c00032c2e2b1ac6030e0e0e0c0004221a352f3c1a94030e0c00032a3b2b1ab2030e0e0e0c0004503b271a0fd22b3b28051a7f030c00042c1a7c030e0c00022d35293b1a75030e0e0c00032f37292b28121a7b030c000431352c3c1a4d030e0e0c00032a3b2b1a6a030e0e0e0c000450220d3d2a1b00011a61030e0e0c0003293b1a5b030c000303033c0214293b1a52030e0e0e0c00033c2a1a4b030c000364030329020a291b00011aff020c0003220e35293b1a04030e0c00032210372c3b1afc020e0c0003030c1b00012d1adb020c000302012c291ae9020e0e0c00020303290207291adf020c00022928ff1ada020e0e0e0c00032c2e2b1ad202020285020e0e0e0c00042215352f3c1a9c020e0c00032a3b2b1aba020e0e0e0c000450343c1aba020e0e0e0c000303033b0249220c3b1aad020e0e0c0003293c1aa7020c00030304220d020a220d28ff1a5f020c0003291b00011a91020e0e0c0003220e3c1a4a020e0e0e0c00032a2a25112511260f2000013b2704270d220d3d2a1b00011a56020e0e0e0c0003293b1a4f020c000303033c0214293b1a46020e0e0e0c00033c2a1a3f020c000364030329020a291b00011af3010c0003220f35293b1af8010e0c00032211372c3b1af0010e0c0003030c1b00012d1acf010c000302012c291add010e0e0c00020303290207291ad3010c00022928ff1ace010e0e0e0c00032c2e2b1ac6010e0e0e0c00042216352f3c1a94010e0c00032a3b2b1ab2010e0e0e0c000450343c1ab2010e0e0e0c000303033b0248220c3b1aa5010e0e0c0003293c1a9f010c00030304220d020a220d28ff1a57010c0003291b00011a89010e0e0c0003220e3c1a42010e0e0e0c00032a2a25112511260f1efd3b2704270d220d3d2a1b00011a4f010c0003293b1a4b010c000303033c0214293b1a42010e0e0e0c00033c2a1a3b010c000364030329020a291b00011aef000c0003221035293b1af4000e0c00032212372c3b1aec000e0c0003030c1b00012d1acb000c000302012c291ad9000e0e0c00020303290207291acf000c00022928ff1aca000e0e0e0c00032c2e2b1ac2000e0e0e0c00042217352f3c1a90000e0c00032a3b2b1aae000e0e0e0c000450343c1aae000e0e0e0c000303033b0248220c3b1aa1000e0e0c0003293c1a9b000c00030304220d020a220d28ff1a53000c0003291b00011a85000e0e0c0003220e3c1a3e000e0e0e0c00032a2a25112511260f1efa3b270427171f040e0e0e0e0e0e0e00000000fc04000000000000|@4908,I232,@4907,-6,I106,I107,@4802,@4800,I253,I234,I105,I152,I243,@4768,I255,I108,I110,I113,I231,I251,I109| 4907:O4|@35,@863,@4910,@4909 4908:S28|494e54434f4445434f4e5328292e67656e4e6f6e4c6f63616c283429 4909:O5|@4767,1208,0,1208,0 4910:S31|67656e4e6f6e4c6f63616c3a20696e76616c696420706172616d6574657273 4911:O1|@4912 4912:D9,228|00812c2307293b1ade000e0e0e0c0003291ad8000e0c00021ad5000e0e0c0002034a291ac6000e0e0e0c00021ac1000e0e0c000203043b5002041ab700102935293b1aa3000c000329352a362a3b1aa7000c000303041aa300103b503c2a6929331a9c00340e0e0e7e0b00032e2309293b1a74000e0c000329291a6f000c00021a6d000e0e0c0002032229352a3632230b2b230b2a2a1a5f000c00036503033c0207292503511e2d3b6502013b6403033b0214302309302b692a3b2b1a45000e0e0c0004503b653b326929321a3100337e0a00030e0e0e0e00000000dc00000000000000|@4914,I253,I105,I218,@4915,I251,@4913,@4889,I255| 4913:O4|@35,@863,@4918,@4917 4914:S26|494e54434f4445434f4e5328292e636f6465436f6e7374283229 4915:O4|101,@2083,0,@4916 4916:O5|@4767,702,0,702,0 4917:O5|@4775,119,0,119,0 4918:S28|63736567416464723a206e6f74206120636f6465207365676d656e74 4919:O1|@4920 4920:D12,220|00812c35293b1ad7000c000329353b1ad2000e0e0e0c0003035629362f362a1ac6000e0e0e0c0002302a1abf000c00036403392f1ab9000e0e0c00021ab5000e0e0c000203033c02102a1a9b000c0002302a1aa3000c00036403041a9e00103b502a301a7a00310e7e0800032965025a29362f362a3b1a67000c0003302a1a6b000c00036403412f3b1a60000e0c000303033c02142a3b1a46000e0e0e0c0003302a1a5b000c00036403041a5600103b502f3c1a52000e0e0e0c00032b2a1a1f00320e0e7e090003296565430e0e0e0e00000000d400000000000000|@4921,I253,I251,I15,I234,I105,I218,I247,@866,I231,@1850,I106| 4921:S19|5374726574636841727261792e737562283229 4922:O5|@4755,268,0,268,0 4923:S26|6c6f63616464723a2062616420737461636b2061646472657373 4924:S23|67656e6364653a206261642061646a7573746d656e7420 4925:O5|@4755,643,0,643,0 4926:O2|@4927,@4793 4927:D10,252|008b3c28403b1af7000c0004220e36293c22115657220f220f220f220f220f220f220f220f2218221b221b22101ad4000e0c0011303b3b1ace000e0e0e0c0004502210372922112211221122112211221122112211221122112211121100010001000e0e0e0c000d323b1a9f000c000303032b02013b333b2b1a8c000e0c0004502e3b1a86000e0e0e0c0003293b1a7f000c000303033b0252220d1a76000e0e0e0c0002220e35293b1a60000e0c00032c291a63000c00021a61000e0e0c0002032629352a362a3b1a41000e0e0c0003292e22161a49000e0e0c00042b250526041e303b270402013b270427071f0c0e00000000f400000000000000|@4929,I11,@4928,I255,I253,I251,@4800,I105,I218,@4804| 4928:O1|@4930 4929:S37|494e5447434f444528292e636f646567656e28352967656e53706172736543617365283429 4930:D19,1100|008f22111a49040e0e0c00021a45040e0e0c000207d12211352212362a352b36221335293c3c220d22162216221622162216221622162216221f0e0e0e0c000d2b22111a12040e0e0e0c00031a0d0422121a04040e0c000322123c1a02040e0e0e0c000322133b3c1af9030e0e0c000422141af3030c0002221535293b1aec030e0c0003221737292b280c1ae2030e0e0e0c00042219352c3c1ad8030e0c00032a3b2b1ad2030e0e0e0c000450221b35293b1ab7030c0003221d37292b3b1aaf030c0004221f352c3c1aa8030e0c00032a3b2b1aa2030e0e0e0c000450222135293b1a870302024f030c0003222337292b3e1a7b030c00042225352c3c1a74030e0c00032a3b2b1a6e030e0e0e0c00045022273b3e1a4c030e0c000422281a47030c0002222935293b1a40030e0c0003222b37292b3e1a37030c0004222d352c3c1a30030e0c00032a3b2b1a2a030e0e0e0c000450222f35293b1a0f030c0003223137292b3b1a07030c00042233352c3c1a00030e0c00032a3b2b1afa020e0e0e0c000450223535293b1adf020c0003291ae8021add020e0e0c00033c2a693c28402b1ada020e0e0e0c0004223a230d293b1ab7020c00032d2a1ac7020c0003650312223a230d293b2e1aab020c0004503b6402013b223b3a223c3a293b1a8b020c00032d2a692c3b2b1a8b020c0004502e3b69223f3b1a72020e0e0e0c0003293c1a83020c000322413b2b1a69020e0e0c0004502235223d223d22402249224922492249224922492249224922520e0e0c000d22413b1a32020e0e0e0c0003223e3b1a16020e0e0e0c000303033b022222433b1a15020e0e0c0003293c1a27020c000322453b2b1a0d020e0e0c0004503b65223d3b1af3010c00032b03033b0fd522461ae1010e0e0c0002224735293b1ad8010e0c0003224937292b3d1acf010c0004224b352c3c1ac8010e0c00032a3b2b1ac2010e0e0e0c000450224d35293b1aa7010c0003224f37292b3b1a9f010c00042251352c3c1a98010e0c00032a3b2b1a92010e0e0e0c000450225335293b1a77010c0003291a80011a75010e0e0c00033c2a693c28402b1a72010e0e0e0c00042258230d293b1a4f010c00032d2a1a5f010c00036503122258230d293b2e1a43010c0004503b6402013b22593a225a3a293b1a23010c00032d2a692c3b2b1a2301020216000c0004502e3b69225e3c3b1afd000e0e0c00042a2719293b1ae8000e0c000303032a020b2a2a1a0a010e0e0e0c000322403b2b1ae9000e0e0c000450313b1ac2000e0e0e0c000303033b025222481abe000e0e0e0c0002224935293b1ab4000e0c000334291a8f000c00021a8d000e0e0c0002032629352a362a3b1a95000e0e0c0003292e22511aad000e0e0c00042b250526041e303b270402013b270422473b3b1a7a000e0e0e0c000450224f03032e02013b223e2a225122512251225122512251225122512251225122512251225122511a650022520e0e7b1252001122101f100e0e0e0e000000004404000000000000|@4932,I105,I218,@4887,I251,@4853,@4802,@4800,I253,@4768,I106,I255,-1,I11,I234,I107,@4931,@4804,@4928| 4931:O1|@4933 4932:S48|494e5447434f444528292e636f646567656e28352967656e5370617273654361736528342963617365436f6465283229 4933:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4931| 4934:O2|@4935,@4793 4935:D29,1492|008b220d36220e35293c3c220f220f220f220f220f220f220f220f220f56e70e0e0c000d3c28403b1aad050e0e0c00042211380402002a1aa2050e0e0e0c00021a9d050e0e0c000203222a35293b1a93050c0003030c1a8f052a1a8f050c00030201292b3b452a46260302ba2e1a6c050e0c00021a69050e0e0c000203043b5002041a6b05103b502e352936292a69040200322b2a1a44050e0c00021a41050e0e0c000203392a352b362a362c352d362b2b1a3f050c000303032b02012a2c2b1a35050e0e0c000303032c02012a2a2a692f2a250a250a26081e4526080209292c2a35452a3646515129352a362a3b1af2040e0e0e0c0003030c1aeb042b1aeb040c000302012a2a3b1ad8040e0c0003030c1ad3042b1ad3040c000302012a312b452a46260929352a36292b1acd040e0e0c00032b3b1ac7040c000303033b02cf2b22101abd040e0e0c00031aad0422111ab0040e0c000322113c1aaa040e0e0e0c000322123b3c1aa1040e0e0c000422131a9b040c0002221435293b1a94040e0c0003221637292b280c1a8a040e0e0e0c00042218352c3c1a50040e0c00032a3b2b1a76040e0e0e0c000450221a35293b1a5f040c0003221c37292b3b1a57040c0004221e352c3c1a20040e0c00032a3b2b1a46040e0e0e0c000450222035293b1a2f040c0003222237292b3e1a27040c00042224352c3c1af0030e0c00032a3b2b1a16040e0e0e0c0004503b27172a3d1a0b040c00033e2a1acf030c000322123b2b1ae5030e0e0c000422131adf030c0002221435293b1ad8030e0c0003221637292b401acf030c00042218352c3c1a98030e0c00032a3b2b1abe030e0e0e0c000450343d2a1b00011ab6030e0e0e0c0003293b1a87030c000303033c0214293b1aa2030e0e0e0c00033c2a1a9b030c000364030329020a291b00011a4b030c0003221e35293b1a68030e0c00032220372c3b1a2c030e0c0003030c1b00012d1a27030c000302012c291a0d030e0e0c00020303290207291a53030c00022928ff1a4e030e0e0e0c00032c2e2b1a26030e0e0e0c00042225352f3c1aec020e0c00032a3b2b1a12030e0e0e0c000450343c1aea020e0e0e0c000303033b0248220c3b1a01030e0e0c0003293c1afb020c00030304220d020a220d28ff1abb020c0003291b00011aed020e0e0c0003220e3c1aa6020e0e0e0c00032a2a25112511260f1efd3b2704270d221a3b1aa3020c0003293c1a83020c0003221c3b2b1a99020e0e0c000450221d1a82020e0e0e0c0002221e35293b1a78020e0c000322113c1a46020e0e0e0c0003293d1a6f020c00033b2922151a81020e0e0c000303033b0fce2a3d2a1b00011a56020e0e0e0c0003293b1a27020c000303033c0214293b1a42020e0e0e0c00033c2a1a3b020c000364030329020a291b00011aeb010c0003222735293b1a08020e0c00032229372c3b1acc010e0c0003030c1b00012d1ac7010c000302012c291aad010e0e0c00020303290207291af3010c00022928ff1aee010e0e0e0c00032c2e2b1ac6010e0e0e0c0004222e352f3c1a8c010e0c00032a3b2b1ab2010e0e0e0c000450343c1a8a010e0e0e0c000303043b50024b220c3b1aa0010e0c0003293c1a9b0102024c000c00030304220d020a220d28ff1a57010c0003291b00011a89010e0e0c0003220e3c1a42010e0e0e0c00032a2a25112511260f2001012604260d293c1a18010e0c0003292502502027013b6464222a3729222b222b222b222b222b222b222b222b222b222b222b122b00010001000e0e0c000d22233b3b1a0d010e0e0c000450222c36221c22252228222f2229221e220c3412290001000100223222322232222f222f223922391a01010e0e0c0012221c3b1aca000e0e0e0c0003293b1ad7000c000303033b025222271aae000e0e0e0c0002222835293b1aa4000e0c00032c291a63000c00021a61000e0e0c0002032629352a362a3b1a85000e0e0c0003292e22301aa9000e0e0c00042b250526041e303b270402013b270422263b3b1a66000e0e0e0c0004503b27221f0c0e0e0e0e0e0e00000000cc05000000000000|@4937,I11,I105,I218,I234,@677,I106,@2229,I250,I249,I107,I113,@4887,@4853,@4802,@4800,I253,@4768,I255,I108,I110,I231,I251,I152,I243,I109,I233,@4936,@4804| 4936:O1|@4938 4937:S36|494e5447434f444528292e636f646567656e28352967656e44656e736543617365283429 4938:D25,844|009022121a49030e0e0c00021a45030e0e0c000207cd2212352213362a352b3622153b1a32030e0e0e0c000322153b1a26030e0e0e0c000303033b0fce22141a1a030e0e0e0c0002221535293b1a08030e0c0003221737292b3d1a03030c00042219352c3c1afc020e0c00032a3b2b1af6020e0e0e0c000450221b35293b1ad7020c0003221d37292b3b1ad3020c0004221f352c3c1acc020e0c00032a3b2b1ac6020e0e0e0c000450222135293b1aa7020c0003291ab4021aa9020e0e0c00033c2a693c28402b1aa6020e0e0e0c00042226230d293b1a7f020c00032d2a1a9302020257020c00036503122226230d293b2e1a73020c0004503b6402013b22273a22283a293b1a4f02020222000c00032d2a692c3b2b1a4f020c0004502e3b69222c3c3b1a51020e0e0c00042a2719293b1a48020e0c000303032a020b2a2a1a3e020e0e0e0c000322183b2b1a19020e0e0c00045022153b1a21020e0e0c000303033b022222143b1aed010e0e0c0003293c1a0f020c000322163b2b1ae9010e0e0c0004503b652d3b1ae8010e0c0003030c1af3012e1acb010c000302012d2922161adf010c0003293d1adf010c000322162a1aae010e0e0e0c0003221b373d2b2b1acb010c00042922191ac6010e0e0e0c00036507d6221b1a80010e0c0002221c35293b1a70010e0c000329221b1a92010e0e0e0c0003293d2f2b1b00011a96010e0e0e0c0003293b1a87010c000303033c0214293b1a82010e0e0e0c00033c2a1a57010c000364030329020a291b00011a2f010c00032224372a3b1a34010e0c0003030c1b00012b1a17010c000302012a291af9000e0e0c00020303290207291a3b010c00022928ff1a36010e0e0e0c00032c302b1ae6000e0e0e0c0004313c1a0f010c000303033b0253323b1a0a010e0e0e0c0003293c1adf000c0003030333020f3328ff1ad900020235000e0e0c0003291b00011aed000e0e0c0003343c1abf000c0003343c1a97000c00032b2b2b250f250f250f260c1ee03b2705270e02013b221d3b3b1a7c000e0c00045033221c22122212221922192219222322222226221c221c22220e0e0e0c000d220c22202220222022202220222022202220222022202220222022202220222022201a770022217b132100123b1f110e000000004403000000000000|@4940,I105,I218,I253,@4800,@4768,I106,I255,-1,I11,I234,@4802,I251,@4939,I107,@677,I108,@4829,I113,I110,I231,I152,I243,I109,@4936| 4939:O1|@4941 4940:S50|494e5447434f444528292e636f646567656e28352967656e44656e73654361736528342967656e4561636843617365283129 4941:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4939| 4942:O2|@4943,@4793 4943:D24,3924|008a220c37293b1a4e0f0e0e0e0c00030393220d363b2a301a410f0e0e0c0004220f35221023083b2a291a330f0c00021a310f0e0e0c0002031729362b3c1a270f0c0003292b25042504511e223b6502012a652b2d1a140f2f692c220d220d0e0e0c000629220e1a060f0e0e0e0c0003220d3b1afe0e0e0e0e0c0003293c1ae70e0c0003220f3b2b1aed0e0e0e0c0004502215030b3b2215220d0e0e7d1700023b27090fca220d363c2a301aae0e0e0e0e0c0004220f35221023083b2a291a9f0e0c00021a9d0e0e0e0c0002031729362b3c1a930e0c0003292b25042504511e223b6502012a652b2d1a900e2c220d220d0c00062213373b2a291a630e0c00021a610e0e0e0c0002031729362b3c1a570e0c0003292b25042504511e223b6502012a65293c1a400e0e0c0003221507ca3d2a1a4b0e0c0003030c293f1a410e0e0e0c000302013b039d28522a1a190e0e0e0c0003293d1a2b0e0c000322123b3c1a250e0e0e0c000422131a1f0e0202d10d0c0002221435293b1af80d0e0c00032216372e3b1a080e0e0c0003030c1b00012f1ad30d0c000302012e291ac10d0e0e0c00020303290207291ae70d0c00022928ff1ae20d0e0e0e0c00032c2e2b1ada0d0e0e0e0c0004221b352f3c1a980d0e0c00032a3b2b1a9e0d0e0e0e0c0004503b270d0fd23b2a1a950d0e0e0c000303102928fe1a880d0202c2090e0c000302013b03c122103b3d1a7c0d0e0c000422111a770d0c0002221235293b1a540d0e0c0003221437292b28211a6e0d0e0e0e0c00042216352c3c1a2c0d0e0c00032a3b2b1a320d0e0e0e0c000450221835293b1a1f0d0c0003221a37343b1a300d0e0c000303101b0001220c1afa0c0e0e0e0c0003020134291ae50c0e0e0c00020303290207291a0b0d0c00022928ff1a060d0e0e0e0c00032c2e2b1afe0c0e0e0e0c0004221f352f3c1abc0c0e0c00032a3b2b1ac20c02025e010e0e0e0c0004503b27110fca22103b3e1abb0c0c000422111ab70c0c0002221235293b1a940c0e0c0003221437292b28111aae0c0e0e0e0c00042216352c3c1a6c0c0e0c00032a3b2b1a720c0e0e0e0c000450313d2a1b00011a8a0c0e0e0e0c0003293b1a830c0c000303033c0214293b1a7a0c0e0e0e0c00033c2a1a1f0c0c000364030329020a291b00011a1f0c0c0003221c35293b1a200c0e0c0003221e372c3b1a300c0e0c0003030c1b00012d1afb0b0c000302012c291ae90b0e0e0c00020303290207291a0f0c0c00022928ff1a0a0c020286000e0e0e0c00032c2e2b1afe0b0e0e0e0c00042223352f3c1abc0b0e0c00032a3b2b1ac20b0e0e0e0c000450343c1ae20b0e0e0e0c000303033b0249220c3b1ad50b0e0e0c0003293c1a7b0b0c00030304220d020a220d28ff1a970b0c0003291b00011ab50b0e0e0c0003220e3c1a820b0e0e0e0c00032a2a25112511260f2001013b2704271522103b1a560b0e0e0e0c0003293c1a3f0b0c000322123b2b1a450b0e0e0c0004502f22141a310b0e0e0c000322143b3c1a3d0b0e0e0c000422151a370b0c0002221635293b1a140b0e0c0003221837292b28451a2e0b0e0e0e0c0004221a352c3c1aec0a0e0c00032a3b2b1af20a0e0e0e0c000450221b3b1ae10a0e0e0c00033b22220e0e0c00022a1a0c0b0e0c0002221e3b1ac60a0e0e0e0c0003292b1aaf0a0c00033b2a1abf0a0c0003030c29280b1ab40a0e0c000302013b039928292a1a8d0a0e0e0c0003293b1a9f0a0c000322233b3c1a990a0e0e0c000422241a930a0c0002222535293b1a700a0e0c00032227372e3b1a800a0e0c0003030c1b00012f1a4b0a0c000302012e291a390a0e0e0c00020303290207291a5f0a0c00022928ff1a5a0a0e0e0e0c00032c2e2b1a520a0e0e0e0c0004222c352f3c1a100a0e0c00032a3b2b1a160a0e0e0e0c0004503b270d0fce3b2a1a0d0a0e0e0c0003030c2928fe1a000a0e0c000302013b03c122213b3d1af8090e0c000422221af3090c0002222335293b1ad0090e0c0003222537292b28221aea090e0e0e0c00042227352c3c1aa8090e0c00032a3b2b1aae090e0e0e0c000450222935293b1a9b090c0003222b37343b1aac090e0c000303101b0001220c1a76090e0e0e0c0003020134291a61090e0e0c00020303290207291a87090c00022928ff1a82090e0e0e0c00032c2e2b1a7a090e0e0e0c00042230352f3c1a38090e0c00032a3b2b1a3e0902025e010e0e0e0c0004503b27110fca22213b3e1a37090c000422221a33090c0002222335293b1a10090e0c0003222537292b28131a2a090e0e0e0c00042227352c3c1ae8080e0c00032a3b2b1aee080e0e0e0c000450313d2a1b00011a06090e0e0e0c0003293b1aff080c000303033c0214293b1af6080e0e0e0c00033c2a1a9b080c000364030329020a291b00011a9b080c0003222d35293b1a9c080e0c0003222f372c3b1aac080e0c0003030c1b00012d1a77080c000302012c291a65080e0e0c00020303290207291a8b080c00022928ff1a8608020286000e0e0e0c00032c2e2b1a7a080e0e0e0c00042234352f3c1a38080e0c00032a3b2b1a3e080e0e0e0c000450343c1a5e080e0e0e0c000303033b0249220c3b1a51080e0e0c0003293c1af7070c00030304220d020a220d28ff1a13080c0003291b00011a31080e0e0c0003220e3c1afe070e0e0e0c00032a2a25112511260f2001013b2704271522213b1ad2070e0e0e0c0003293c1abb070c000322233b2b1ac1070e0e0c000450222a37293c2a1a9a070e0e0e0c00021a95070e0e0c000207ca2a352b362a3c3c3b22302230223022302230223022302230123000010001000c000d3b2d1a83070c0003030c2c28071a78070e0c000302013b039d28452d1a51070e0e0c0003293b1a63070c0003222c3b3c1a5d070e0e0c0004222d1a57070c0002222e35293b1a34070e0c00032230372e3b1a44070e0c0003030c1b00012f1a0f070c000302012e291afd060e0e0c00020303290207291a23070c00022928ff1a1e070e0e0e0c00032c2e2b1a16070e0e0e0c00042235352f3c1ad4060e0c00032a3b2b1ada06020276020e0e0e0c0004503b270d0fce3b2d1acd060e0e0c0003030c2c28fe1ac0060e0c000302013b03c1222a3b3d1ab8060e0c0004222b1ab3060c0002222c35293b1a90060e0c0003222e37292b28241aaa060e0e0e0c00042230352c3c1a68060e0c00032a3b2b1a6e060e0e0e0c000450223235293b1a5b060c0003223437220e3b1a6b060c000303101b0001220f1a36060e0e0e0c00030202220e291a20060e0c00020303290207291a47060c00022928ff1a42060e0e0e0c00032c2e2b1a3a060e0e0e0c00042239352f3c1af8050e0c00032a3b2b1afe0502025e010e0e0e0c0004503b27110fca222a3b3e1af7050c0004222b1af3050c0002222c35293b1ad0050e0c0003222e37292b28151aea050e0e0e0c00042230352c3c1aa8050e0c00032a3b2b1aae050e0e0e0c000450343d2a1b00011ac6050e0e0e0c0003293b1abf050c000303033c0214293b1ab6050e0e0e0c00033c2a1a5b050c000364030329020a291b00011a5b050c0003223635293b1a5c050e0c00032238372c3b1a6c050e0c0003030c1b00012d1a37050c000302012c291a25050e0e0c00020303290207291a4b050c00022928ff1a4605020286000e0e0e0c00032c2e2b1a3a050e0e0e0c0004223d352f3c1af8040e0c00032a3b2b1afe040e0e0e0c000450343c1a1e050e0e0e0c000303033b0249220c3b1a11050e0e0c0003293c1ab7040c00030304220d020a220d28ff1ad3040c0003291b00011af1040e0e0c0003220e3c1abe040e0e0e0c00032a2a25112511260f2001013b27042715222a3b1a92040e0e0e0c0003293c1a97040c0003222c3b2b1a81040e0e0c0004502f3c1a66040e0e0e0c00032e2a250925092607204e033b270702013b6522263b3c1a67040c000422271a63040c0002222835293b1a40040e0c0003222a37292b286c1a5a040e0e0e0c0004222c352c3c1a18040e0c00032a3b2b1a1e040e0e0e0c000450222e230a222f230a293b1a06040e0e0e0c0003293c1aef030c00032c3b2b1af6030e0e0e0c000450223236293b3b1ae6030e0e0e0c00045022323b1ad5030e0e0c0003293c1adb030c000322343b2b1ac5030e0e0c0004503b27250fd52c22111aac030e0c000322103b1aa6030e0e0e0c0003293c1a8f030c000322123b2b1a95030e0e0c00045022193729291a6f030c00021a6d030e0e0c0002032d29352a362a3c3c3b221e221e221e221e221e221e221e221e121e00010001000c000d50292503511e383b6502013b643d2f1a4e030e0e0e0c0003030c2e3f1a41030e0e0c000302013b039d28692f1a19030e0e0c0003293d1a2b030c000322173b3c1a25030e0e0c000422181a1f030c0002221935293b1afc020e0c0003221b372e3b1a0c030e0c000303101b00012f1ad7020202ab020c000302012e291ac1020e0e0c00020303290207291ae7020c00022928ff1ae2020e0e0e0c00032c2e2b1ada020e0e0e0c00042220352f3c1a98020e0c00032a3b2b1a9e020e0e0e0c0004503b270d0fce3b2f1a95020e0e0c0003030c2e28fe1a88020e0c000302013b03c122153b3d1a80020e0c000422161a7b020c0002221735293b1a58020e0c0003221937292b28681a72020e0e0e0c0004221b352c3c1a30020e0c00032a3b2b1a36020e0e0e0c000450221d35293b1a23020c0003221f3722103b1a33020c000303101b000122111afe010e0e0e0c000302022210291ae8010e0c00020303290207291a0f020c00022928ff1a0a020e0e0e0c00032c2e2b1a02020e0e0e0c00042224352f3c1ac0010e0c00032a3b2b1ac60102025e010e0e0e0c0004503b27110fca22153b3e1abf010c000422161abb010c0002221735293b1a98010e0c0003221937292b28671ab2010e0e0e0c0004221b352c3c1a70010e0c00032a3b2b1a76010e0e0e0c000450220d3d2a1b00011a8d010e0e0c0003293b1a87010c000303033c0214293b1a7e010e0e0e0c00033c2a1a23010c000364030329020a291b00011a23010c0003222135293b1a24010e0c00032223372c3b1a34010e0c0003030c1b00012d1aff000c000302012c291aed000e0e0c00020303290207291a13010c00022928ff1a0e01020286000e0e0e0c00032c2e2b1a02010e0e0e0c00042228352f3c1ac0000e0c00032a3b2b1ac6000e0e0e0c000450343c1ae6000e0e0e0c000303033b0249220c3b1ad9000e0e0c0003293c1a7f000c00030304220d020a220d28ff1a9b000c0003291b00011ab9000e0e0c0003220e3c1a86000e0e0e0c00032a2a25112511260f2000013b2704271522153b1a5a000e0e0e0c0003303c1a5f000c00032a2a1a57000c000322183b2b1a41000e0e0c0004503b27092709641f0b0e0e0e000000004c0f000000000000|@4945,I251,@4723,I105,I218,I106,@4946,@4887,I253,I255,@4944,I232,I107,@4802,@4800,I234,I152,I243,@4768,I110,I113,I231,I109,I111| 4944:O1|@4947 4945:S31|494e5447434f444528292e636f646567656e28352967656e50726f63283329 4946:D1,20|00813c561769430e000000000c00000000000000|@4741| 4947:D4,52|00812c3b1a31000e0e0c000303132b3c1a29000e0e0c00033b1a24002b6a6402043b2d2d6a430e0e000000002c00000000000000|@4741,I113,I107,-1| 4948:D29,5788|00893435291a98160e0c00023b2a291a92160e0e0e0c00021a8d160e0e0c0002031729362b3c1a83160c0003292b25042504511e253b6502012a65220e36293528061a6b160c000307d329362c291a53160c00021a51160e0e0c0002032d29352a362a3c3c3b22152215221522152215221522152215121500010001000c000d2a250426031e383b6602013b642a353e1a1d160e0e0c0003030c3b3c22110e0e0e0c0003026f2a353c1a04160e0c000303152a36293c1af3150c0003293c22130e0c000365024e2a353d1ae3150c000303322a36220f2a1ada150e0e0e0c0003293b1acb150c000303041acb15103b503b502935291ac4150e0c00023b2a3b6a270402112a36220e2a1ab4150e0c00033b2a3b6a6529353c1a95150202920c0e0e0c000307cb293629220f1a96150e0e0e0c0003220f3b3e1a8d150e0e0c000422101a87150c0002221135293b1a80150e0c0003221337292b281a1a76150e0e0e0c00042215352c3c1a40150e0c00032a3b2b1a62150e0e0e0c000450221735293b1a4b150c00033b3d2a1b00011a4b150c0003293b1a47150c000303033c0214293b1a3e150e0e0e0c00033c2a1aff140c000364030329020a291b00011aeb140c0003221d35293b1a04150e0c0003221f372c3b1a10150e0c0003030c1b00012d1ac7140c000302012c291ab5140202ad040e0e0c00020303290207291aeb140c00022928ff1ae6140e0e0e0c00032c2e2b1abe140e0e0e0c00042224352f3c1a88140e0c00032a3b2b1aaa140e0e0e0c000450343c1aa6140e0e0e0c000303033b0248220c3b1a99140e0e0c0003293c1a5b140c00030304220d020a220d28ff1a5b140c0003291b00011a85140e0e0c0003220e3c1a46140e0e0e0c00032a2a25112511260f1efe3b2704270d221a23082b220d69221c2308293b1a30140e0c00032b2a692d3b2b1a2b140c000450221e3b1a19140e0e0c0003293c1aeb130c000322203b2b1a0d140e0e0c00045022253b1ad9130e0e0c000307cb22203b1aec130e0c0003293b1abf130c00033b2a1a03140c0003030c29280b1af8130e0c000302013b039928292a1a9d130e0e0c0003293b1aa7130c000322253b3c1aa5130e0e0c000422261a9f130c0002222735293b1a98130e0c00032229372e3b1aa4130e0c0003030c1b00012f1a5b130c000302012e291a49130e0e0c00020303290207291a83130c00022928ff1a7e130e0e0e0c00032c2e2b1a56130e0e0e0c0004222e352f3c1a20130e0c00032a3b2b1a42130e0e0e0c0004503b270d0fd23b2a1a511302029b020e0e0c0003030c2928fe1a40130e0c000302013b03c122233b3d1a00130e0c000422241afb120c0002222535293b1af4120e0c0003222737292b28221aea120e0e0e0c00042229352c3c1ab4120e0c00032a3b2b1ad6120e0e0e0c000450222b35293b1abf120c0003222d37343b1acc120e0c000303101b0001220c1a82120e0e0e0c0003020134291a6d120e0e0c00020303290207291aa7120c00022928ff1aa2120e0e0e0c00032c2e2b1a7a120e0e0e0c00042232352f3c1a44120e0c00032a3b2b1a661202025e010e0e0e0c0004503b27110fca22233b3e1a3f120c000422241a3b120c0002222535293b1a34120e0c0003222737292b28131a2a120e0e0e0c00042229352c3c1af4110e0c00032a3b2b1a16120e0e0e0c000450313d2a1b00011a0a120e0e0e0c0003293b1a03120c000303033c0214293b1afa110e0e0e0c00033c2a1abb110c000364030329020a291b00011aa7110c0003222f35293b1ac0110e0c00032231372c3b1acc110e0c0003030c1b00012d1a83110c000302012c291a71110e0e0c00020303290207291aab110c00022928ff1aa611020286000e0e0e0c00032c2e2b1a7a110e0e0e0c00042236352f3c1a44110e0c00032a3b2b1a66110e0e0e0c000450343c1a62110e0e0e0c000303033b0249220c3b1a55110e0e0c0003293c1a17110c00030304220d020a220d28ff1a17110c0003291b00011a41110e0e0c0003220e3c1a02110e0e0e0c00032a2a25112511260f2001013b2704271522233b1af6100e0e0e0c0003293c1ac7100c000322253b2b1ae9100e0e0c000450221d3d1ab1100e0e0c000322263b1aca100e0e0e0c0003293c1aaf100c0003222a22211aa5100e0e0c00032a2a1a87100c00032d2a222d1acd100e0e0c0004222a3b3c1a9d100e0e0c0004503b270b025622213c1ab4100e0c000322223b3c1a71100e0e0c000422231a6b100c0002222435293b1a64100e0c0003222637292b280c1a5a100e0e0e0c00042228352c3c1a24100e0c00032a3b2b1a46100e0e0e0c0004503b270927140fd629362a37293b1a5b100c00030319220e3b1a1c100e0c0003292b2d22131a48100e0c0005640fce220e3b1a03100c0003292c1ad70f0c00033b2a1a1b100c0003030c29280b1a10100e0c000302013b039d28292a1ab50f0e0e0c0003293b1abf0f0c000322133b3c1abd0f0e0e0c000422141ab70f0c0002221535293b1ab00f0e0c00032217372e3b1abc0f0e0c0003030c1b00012f1a730f0c000302012e291a610f0e0e0c00020303290207291a9b0f0c00022928ff1a960f0e0e0e0c00032c2e2b1a6e0f0e0e0e0c0004221c352f3c1a380f020236060e0c00032a3b2b1a560f0e0e0e0c0004503b270d0fd23b2a1a650f02022a020e0e0c0003030c2928fe1a540f0e0c000302013b03c122113b3d1a140f0e0c000422121a0f0f0c0002221335293b1a080f0e0c0003221537292b28221afe0e0e0e0e0c00042217352c3c1ac80e0e0c00032a3b2b1aea0e0e0e0e0c000450221935293b1ad30e0c0003221b37343b1ae00e0e0c000303101b0001220c1a960e0e0e0e0c0003020134291a810e0e0e0c00020303290207291abb0e0c00022928ff1ab60e0e0e0e0c00032c2e2b1a8e0e0e0e0e0c00042220352f3c1a580e0e0c00032a3b2b1a7a0e02025e010e0e0e0c0004503b27110fca22113b3e1a530e0c000422121a4f0e0c0002221335293b1a480e0e0c0003221537292b28131a3e0e0e0e0e0c00042217352c3c1a080e0e0c00032a3b2b1a2a0e0e0e0e0c000450313d2a1b00011a1e0e0e0e0e0c0003293b1a170e0c000303033c0214293b1a0e0e0e0e0e0c00033c2a1acf0d0c000364030329020a291b00011abb0d0c0003221d35293b1ad40d0e0c0003221f372c3b1ae00d0e0c0003030c1b00012d1a970d0c000302012c291a850d0e0e0c00020303290207291abf0d0c00022928ff1aba0d020286000e0e0e0c00032c2e2b1a8e0d0e0e0e0c00042224352f3c1a580d0e0c00032a3b2b1a7a0d0e0e0e0c000450343c1a760d0e0e0e0c000303033b0249220c3b1a690d0e0e0c0003293c1a2b0d0c00030304220d020a220d28ff1a2b0d0c0003291b00011a550d0e0e0c0003220e3c1a160d0e0e0e0c00032a2a25112511260f2001013b2704271565220f3b1a090d0e0e0c0003293c1adb0c0c000322113b2b1afd0c0e0e0c00045022163b1ac90c0e0e0c000307cb22113b1adc0c0e0c0003293b1aaf0c0c00033b2a1af30c0c0003030c29280b1ae80c0e0c000302013b039928292a1a8d0c0e0e0c0003293b1a970c0c000322163b3c1a950c0e0e0c000422171a8f0c0c0002221835293b1a880c0e0c0003221a372e3b1a940c0e0c0003030c1b00012f1a4b0c0c000302012e291a390c0e0e0c00020303290207291a730c0c00022928ff1a6e0c0e0e0e0c00032c2e2b1a460c0e0e0e0c0004221f352f3c1a100c0e0c00032a3b2b1a320c0e0e0e0c0004503b270d0fd23b2a1a410c02029b020e0e0c0003030c2928fe1a300c0e0c000302013b03c122143b3d1af00b0e0c000422151aeb0b0c0002221635293b1ae40b0e0c0003221837292b28221ada0b0e0e0e0c0004221a352c3c1aa40b0e0c00032a3b2b1ac60b0e0e0e0c000450221c35293b1aaf0b0c0003221e37343b1abc0b0e0c000303101b0001220c1a720b0e0e0e0c0003020134291a5d0b0e0e0c00020303290207291a970b0c00022928ff1a920b0e0e0e0c00032c2e2b1a6a0b0e0e0e0c00042223352f3c1a340b0e0c00032a3b2b1a560b02025e010e0e0e0c0004503b27110fca22143b3e1a2f0b0c000422151a2b0b0c0002221635293b1a240b0e0c0003221837292b28131a1a0b0e0e0e0c0004221a352c3c1ae40a0e0c00032a3b2b1a060b0e0e0e0c000450313d2a1b00011afa0a0e0e0e0c0003293b1af30a0c000303033c0214293b1aea0a0e0e0e0c00033c2a1aab0a0c000364030329020a291b00011a970a0c0003222035293b1ab00a0e0c00032222372c3b1abc0a0e0c0003030c1b00012d1a730a0c000302012c291a610a0e0e0c00020303290207291a9b0a0c00022928ff1a960a020286000e0e0e0c00032c2e2b1a6a0a0e0e0e0c00042227352f3c1a340a0e0c00032a3b2b1a560a0e0e0e0c000450343c1a520a0e0e0e0c000303033b0249220c3b1a450a0e0e0c0003293c1a070a0c00030304220d020a220d28ff1a070a0c0003291b00011a310a0e0e0c0003220e3c1af2090e0e0e0c00032a2a25112511260f2001013b2704271522143b1ae6090e0e0e0c0003293c1ab7090c000322163b2b1ad9090e0e0c000450220e3d1aa1090e0e0c000322173b1aba090e0e0e0c0003293c1a9f090c0003221b22121a95090e0e0c00032a2a1a77090c00032d2a221e1abd090e0e0c0004221b3b3c1a8d090e0e0c0004503b270b025622123c1aa4090e0c000322133b3c1a61090e0e0c000422141a5b090c0002221535293b1a54090e0c0003221737292b280c1a4a090e0e0e0c00042219352c3c1a14090e0c00032a3b2b1a36090e0e0e0c0004503b27092705660fd22b3b1afa080e0e0e0c000303033c0238220f3629293528071ae4080e0c0003030c2936292502501e133b64021a2935401acc080e0c000303033c020b29353e1abd080e0e0c00036503682b291aa4080e0c00021aa1080e0e0c0002032d29352a362a3c3c3b22142214221422142214221422142214121400010001000c000d2a250426031e393b6602013b64221036293c3c3b22132213221322132213221322132213121300010001000e0e0c000d650fcc220f36293c3c3b221222122212221222122212221222121212000100010002021c070c000d2d291a17080c00021a15080e0e0c0002032d29352a362a3c3c3b22162216221622162216221622162216121600010001000c000d2a250426031e383b6602013b643b2e1a2a080e0e0e0c0003030c2d280b1a1c080e0c000302013b039d28292e1ac1070e0e0c0003293b1acb070c0003220f3b3c1ac9070e0e0c000422101ac3070c0002221135293b1abc070e0c00032213372e3b1ac8070e0c000303101b00012f1a7f070202a3020c000302012e291a69070e0e0c00020303290207291aa3070c00022928ff1a9e070e0e0e0c00032c2e2b1a76070e0e0e0c00042218352f3c1a40070e0c00032a3b2b1a62070e0e0e0c0004503b270d0fce3b2e1a71070e0e0c0003030c2d28fe1a64070e0c000302013b03c1220d3b3d1a24070e0c0004220e1a1f070c0002220f35293b1a18070e0c0003221137292b28221a0e070e0e0e0c00042213352c3c1ad8060e0c00032a3b2b1afa060e0e0e0c000450221535293b1ae3060c0003221737220f3b1aef060c000303101b000122101aa6060e0e0e0c00030202220f291a90060e0c00020303290207291acb060c00022928ff1ac6060e0e0e0c00032c2e2b1a9e060e0e0e0c0004221c352f3c1a68060e0c00032a3b2b1a8a0602025e010e0e0e0c0004503b27110fca220d3b3e1a63060c0004220e1a5f060c0002220f35293b1a58060e0c0003221137292b28131a4e060e0e0e0c00042213352c3c1a18060e0c00032a3b2b1a3a060e0e0e0c000450220c3d2a1b00011a2d060e0e0c0003293b1a27060c000303033c0214293b1a1e060e0e0e0c00033c2a1adf050c000364030329020a291b00011acb050c0003221935293b1ae4050e0c0003221b372c3b1af0050e0c0003030c1b00012d1aa7050c000302012c291a95050e0e0c00020303290207291acf050c00022928ff1aca05020286000e0e0e0c00032c2e2b1a9e050e0e0e0c00042220352f3c1a68050e0c00032a3b2b1a8a050e0e0e0c000450343c1a86050e0e0e0c000303033b0249220c3b1a79050e0e0c0003293c1a3b050c00030304220d020a220d28ff1a3b050c0003291b00011a65050e0e0c0003220e3c1a26050e0e0e0c00032a2a25112511260f2000013b27042715220d3b1a1a050e0e0e0c0003293c1aeb040c0003220f3b2b1a0d050e0e0c0004503b2706220f3b1ad6040e0e0e0c000307cb333b1ae9040e0e0c0003293b1abb040c00033b2a1aff040c0003030c29280b1af4040e0c000302013b039928292a1a99040e0e0c0003293b1aa3040c0003220f3b3c1aa1040e0e0c000422101a9b040c0002221135293b1a94040e0c00032213372e3b1aa0040e0c0003030c1b00012f1a57040c000302012e291a45040e0e0c00020303290207291a7f040c00022928ff1a7a040e0e0e0c00032c2e2b1a52040e0e0e0c00042218352f3c1a1c040e0c00032a3b2b1a3e040e0e0e0c0004503b270d0fd23b2a1a4d0402029b020e0e0c0003030c2928fe1a3c040e0c000302013b03c1220d3b3d1afc030e0c0004220e1af7030c0002220f35293b1af0030e0c0003221137292b28221ae6030e0e0e0c00042213352c3c1ab0030e0c00032a3b2b1ad2030e0e0e0c000450221535293b1abb030c0003221737343b1ac8030e0c000303101b0001220c1a7e030e0e0e0c0003020134291a69030e0e0c00020303290207291aa3030c00022928ff1a9e030e0e0e0c00032c2e2b1a76030e0e0e0c0004221c352f3c1a40030e0c00032a3b2b1a620302025e010e0e0e0c0004503b27110fca220d3b3e1a3b030c0004220e1a37030c0002220f35293b1a30030e0c0003221137292b28131a26030e0e0e0c00042213352c3c1af0020e0c00032a3b2b1a12030e0e0e0c000450313d2a1b00011a06030e0e0e0c0003293b1aff020c000303033c0214293b1af6020e0e0e0c00033c2a1ab7020c000364030329020a291b00011aa3020c0003221935293b1abc020e0c0003221b372c3b1ac8020e0c0003030c1b00012d1a7f020c000302012c291a6d020e0e0c00020303290207291aa7020c00022928ff1aa202020286000e0e0e0c00032c2e2b1a76020e0e0e0c00042220352f3c1a40020e0c00032a3b2b1a62020e0e0e0c000450343c1a5e020e0e0e0c000303033b0249220c3b1a51020e0e0c0003293c1a13020c00030304220d020a220d28ff1a13020c0003291b00011a3d020e0e0c0003220e3c1afe010e0e0e0c00032a2a25112511260f2001013b27042715220d3b1af2010e0e0e0c0003293c1ac3010c0003220f3b2b1ae5010e0e0c000450303d1aae010e0e0e0c000322103b1ac6010e0e0e0c0003293c1aab010c00032214341aa2010e0e0e0c00032a2a1a83010c00032d2a22171ac9010e0e0c000422143b3c1a99010e0e0c0004503b270b0256343c1ab1010e0e0c0003220c3b3c1a6d010e0e0c0004220d1a67010c0002220e35293b1a60010e0c0003221037292b280c1a56010e0e0e0c00042212352c3c1a20010e0c00032a3b2b1a42010e0e0e0c0004503b2709642b287e1a41010e0e0c000303043b5002041a5701103b503435293b1a11010e0e0c0003220d37292b3b1a07010c0004220f352c3c1ad4000e0c00032a3b2b1af6000e0e0e0c000450313c1abe000e0e0e0c0003221235293b1ad4000e0c00032214372c3b1ae0000e0c0003030c1b00012d1a97000c000302012c291a85000e0e0c00020303290207291abf000c00022928ff1aba000e0e0e0c00032c2e2b1a92000e0e0e0c00042219352f3c1a5c000e0c00032a3b2b1a7e000e0e0e0c000450221a3b1a69000e0e0c00032922141a4e000e0e0e0c0003221c3b2b1a59000e0e0c0004503b27171f0a0e0e0e0e0e0e000000009416000000000000|@4950,@4951,I105,I218,I106,I251,@4919,@4953,I111,I107,@4911,@4802,@4800,I253,@4768,I255,I110,I113,I231,I234,I152,I243,I109,I232,@4956,@4853,I233,@4905,@4949| 4949:O4|@35,@863,@4960,@4959 4950:S31|494e5447434f444528292e636f646567656e28352967656e4576616c283229 4951:O1|@4952 4952:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@4951| 4953:O4|@35,@863,@4955,@4954 4954:O5|@4755,837,0,837,0 4955:S37|7374617469634c696e6b56616c75653a206d697373696e672064656356656320656e747279 4956:O1|@4957 4957:D18,1588|00822d1b00011a2f060c0003030c2c1b00011a23060c000302013b07d82d3f1a1a060e0e0e0c000303c42b3d1a11060e0e0c00032c3b3d1a0a060e0e0e0c00042d1a04060e0c00022e35293b1afd050e0e0c00033037292b287e1af3050c000432352c3c1aed050e0e0c00032a3b2b1ae6050e0e0e0c0004503435293b1acc050e0c0003220d37220f3b1aab050c000303101b000122101aba050e0e0e0c00030202220f291ab4050e0c00020303290207291aab050c00022928ff1aa6050e0e0e0c00032c2e2b1a86050e0e0e0c00042212352f3c1a7c050e0c00032a3b2b1a76050e0e0e0c0004503b27120fd72d3e1a49050202cb020e0e0c000307c92c3e1a39050e0e0c000303542b3c1a31050e0e0c00032c3b3c1a2a050e0e0e0c00042d1a24050e0c00022e35293b1a1d050e0e0c00033037292b28801a13050c000432352c3c1a0d050e0e0c00032a3b2b1a06050e0e0e0c0004503b27090fd62c3d1ad9040e0e0c000303542b3c1ad1040e0e0c00032c3b3c1aca040e0e0e0c00042d1ac4040e0c00022e35293b1abd040e0e0c00033037292b287f1ab3040c000432352c3c1aad040e0e0c00032a3b2b1aa6040e0e0e0c0004503b270902ca2b3d1a7d040204f901c1000c00032c3b3d1a72040e0e0e0c00042d1a6c040e0c00022e35293b1a65040e0e0c00033037292b287d1a5b040c000432352c3c1a55040e0e0c00032a3b2b1a4e040e0e0e0c0004503435293b1a34040e0c0003220d37220f3b1a13040c000303141b000122101a2204020252000e0e0e0c00030202220f291a18040e0c00020303290207291a0f040c00022928ff1a0a040e0e0e0c00032c2e2b1aea030e0e0e0c00042212352f3c1ae0030e0c00032a3b2b1ada030e0e0e0c0004503b27120fd52b3e1ab1030e0e0c00032c3b3e1aaa030e0e0e0c00042d1aa4030e0c00022e35293b1a9d030e0e0c00033037292b287b1a93030c000432352c3c1a8d030e0e0c00032a3b2b1a86030e0e0e0c0004503435293b1a6c030e0c0003220d3722103b1a4b030c000303101b000122111a5a030e0e0e0c000302022210291a54030e0c00020303290207291a4b030c00022928ff1a46030e0e0e0c00032c2e2b1a26030e0e0e0c00042212352f3c1a1c030e0c00032a3b2b1a16030e0e0e0c000450221435293b1afb020c000322163722183b1adb0202025f000c000303101b000122191ae6020e0e0e0c000302022218291ae0020e0c00020303290207291ad7020c00022928ff1ad2020e0e0e0c00032c2e2b1ab2020e0e0e0c0004221b352f3c1aa8020e0c00032a3b2b1aa2020e0e0e0c0004503b271b0fd22b28051a78020e0c00032c3b28051a71020e0e0c00042d1a6c020e0c00022e35293b1a65020e0e0c00033037292b287c1a5b020c000432352c3c1a55020e0e0c00032a3b2b1a4e020e0e0e0c000450220d3d2a1b00011a4d020e0e0c0003293b1a17020c000303033c0214293b1a3a020e0e0e0c00033c2a1a33020c000364030329020a291b00011a07020c0003220f35293b1af4010e0c00032211372c3b1ad4010e0c0003030c1b00012d1ae3010c000302012c291ae1010e0e0c00020303290207291ad7010c00022928ff1ad20102028d010e0e0e0c00032c2e2b1aae010e0e0e0c00042216352f3c1aa4010e0c00032a3b2b1a9e010e0e0e0c000450343c1a76010e0e0e0c000303033b0249220c3b1a95010e0e0c0003293c1a8f010c00030304220d020a220d28ff1a83010c0003291b00011a7d010e0e0c0003220e3c1a6e010e0e0e0c00032a2a25112511260f2000013b2704270d220d3d2a1b00011a42010e0e0e0c0003293b1a0b010c000303033c0214293b1a2e010e0e0e0c00033c2a1a27010c000364030329020a291b00011afb000c0003221035293b1ae8000e0c00032212372c3b1ac8000e0c0003030c1b00012d1ad7000c000302012c291ad5000e0e0c00020303290207291acb000c00022928ff1ac6000e0e0e0c00032c2e2b1aa6000e0e0e0c00042217352f3c1a9c000e0c00032a3b2b1a96000e0e0e0c000450343c1a6e000e0e0e0c000303033b0248220c3b1a8d000e0e0c0003293c1a87000c00030304220d020a220d28ff1a7b000c0003291b00011a75000e0e0c0003220e3c1a66000e0e0e0c00032a2a25112511260f1efd3b27042717440e0e0e0e000000002c06000000000000|@4958,I234,I113,@4853,@4802,@4800,I253,@4768,I106,I255,I105,I152,I243,I110,I231,I251,I107,I109| 4958:S28|494e54434f4445434f4e5328292e67656e5461696c43616c6c283329 4959:O5|@4767,1238,0,1238,0 4960:S35|67656e456e746572496e7443616c6c3a20746f6f206d616e7920617267756d656e7473 4961:D49,1956|00832e230c2f230e3035293b1a99070e0e0c00032928081a92070e0e0e0c0003293b1a8b070c000303033c0214293b1a82070e0e0e0c00033c2a1a7b070c000364030329020a2928081a70070e0c0003293b1a5b070c000327041a63070c000203373035293b1a3f070c00033237292b280e1a4f070c000434352c3c1a3d070e0e0c00032a3b2b1a3e070e0e0e0c000426071e8a3b270602013b3135293b1a07070c00033b3f2a1b00011aff060c0003293b1afb060c000303033c0214293b1af2060e0e0e0c00033c2a1aeb060c000364030329020a291b00011adf060c0003220e35293b1ac0060e0c00032210372c3b1ad8060e0c0003030c1b00012d1abb060c000302012c291ac5060e0e0c00020303290207291abb060c00022928ff1ab6060e0e0e0c00032c2e2b1a96060e0e0e0c00042215352f3c1a80060e0c00032a3b2b1a82060e0e0e0c000450343c1a5e060e0e0e0c000303033b0248220c3b1a51060e0e0c0003293c1a4b060c00030304220d020a220d28ff1a5f060c0003291b00011a59060e0e0c0003220e3c1a4a060e0e0e0c00032a2a25112511260f1efa3b2704270d34230b293b1af9050e0e0c0003220d35293b1aec050e0c0003293b1aef050c0003293c1aeb050c000303032a020b2a3e1a02060e0e0e0c0003293f1afb050c0003292f1acf050c0003293f1ac7050c000322142308293b1aa7050c000329291ac7050c00021ab1050e0e0c000207cd29352a362a352b36221b373d2c2b1abd050e0e0c0004293b1a7f050c000303043b5002041aab05103b502b3f1a77050c00033f2a1a9f050c000322152a1a66050e0e0e0c00032f3d1a5b050c00032a2a1a73050c00033b2a1a7f050c0003030c291a7a051a4f050c000302013b03043b5002041a6c05103b50293d332b1b00011a13050c0003293b1a0f050c000303033c0214293b1a06050e0e0e0c00033c2a1aff040c000364030329020a291b00011af3040c00032227372a3b1af8040e0c000303101b00012b1adb0402029e000c000302012a291ae1040e0e0c00020303290207291ad7040c00022928ff1ad2040e0e0e0c00032c302b1ab2040e0e0e0c0004313c1a93040c000303033b024f323b1a8a040e0e0e0c0003293c1a83040c0003030333020b3328ff1a99040e0e0c0003291b00011a91040e0e0c0003343c1a83040c0003343c1a5b040c00032b2b2b250f250f250f260c1edd3b2705270a33250d260c2076013b270c02013b642c1a47040c000203032c02072c1a3f040c0002293b1a1b040c000303033c020b291a53041a54040e0c000303041a4f04103b503b502928413b1a47040c00043b2a693c28402b1a3a040e0e0e0c0004221b23072a68012a3b2b1ae7030c000450221d37221e35293b1ab8030e0c00032b2f2b3b1a11040e0e0c0005220f3f1ae6030e0e0e0c0003292a3222241afc030e0c0005220f3c1abe030e0e0e0c0003293f1ac3030c000322183c1a8a030e0e0e0c0003292b220d22281acf030c000522153c1a72030e0e0e0c0003293f1a97030c00033b2a2210222b1aaf030c0005220f3b1a3e030e0e0e0c00032935293b1a41030e0e0c000303043b5002041a8f03103b502a362928421a88030e0c00033d2b6922143b2b1a2a030e0e0e0c000450222f39291a70031a09030e0e0c000303033c0222291a13030c00021afd020e0e0c00020310293b1a4d033b3f1a4c030e0c000602013b03033b020129221f3d1ad5020e0e0c000322173b1ab6020e0e0e0c00032935293d1ab9020e0e0c000303043b5002041a1703103b502a36291a12030e0e0e0c0002293b1aab020c0003030c1a03032a1a8f020c00030201292e3b1a94020e0c000303033c020b292f1aaa020e0e0e0c000303362e3c1add020e0e0c00032a3c1ad3020c0003293b691ace022a692c2a691aca022a6927051ac7020c00021ac5021ac6022b1ac6026b103b503b502e1a44020e0c000203032e02072e1a3b020c00022c2a321a26020e0e0e0c0004223938293b1af8010e0c00033c2a291a16020e0e0e0c00021afd010e0e0c0002036129352a362a353b1ae4010e0c000303033b02372a3622402e2b1a66020e0e0e0c00042241230b2242230b293b1aaf010c0003293c1adb010c00032c3b2b1abe010e0e0e0c0004503b27062d3c1aa3010c0003292c2506250626041e6e3b270402013b65223c230b293b1a72010e0e0e0c0003293b1a6f010c000365034322213b1a5b010c00032935293d1a61010e0e0c000303043b5002041aeb01103b502a36293d1aa9010e0e0c00033c2b6922263b2b1a4a010e0e0e0c0004503b270502013b223d2306032522223b1a11010e0e0c000329352a362a3b1a13010c000303041aa701103b503b502966023522223b1aec000e0c000329352a362a3b1aef000c000303041a8301103b503b503c3b2b1a2c010e0c0004291a74010e0c00022a2705223e2a1a6b010c000322380398223f3922252a2238223d224222421a57010c0007224138293b1a94000e0c0003223928101a9d000e0e0c0003292b291aa6000e0e0e0c00021a8d000e0e0c0002034929352a362c3d1aed000e0e0c000322430e0e0e0c0002280922440e0c00022c2245224b1a04010e0c00044022460e0e0c0002303f1a4b000c0003292f2509250926071e563b270702013b654022400e0c0002270602013b2b273b1f040e0e000000009c07000000000000|@4963,I253,I110,I113,I231,I251,I106,I218,@4768,I255,I234,I105,I152,I243,I107,I109,@4829,@4964,I108,I232,65536,@4967,16777215,I247,@2522,I11,@4770,@4970,@4976,I200,I48,I154,@4979,I15,@677,@510,@4789,@4982,@371,@35,@863,@4983,@4984,@4987,@4913,I47,@4990,@4996,@4962| 4962:O1|@5007 4963:S25|494e54434f4445434f4e5328292e636f7079436f6465283129 4964:O4|@35,@863,@4966,@4965 4965:O5|@4767,1330,0,1330,0 4966:S35|6669787570436f6e7374616e744c6f61643a20616c72656164792066697865642d7570 4967:O4|@35,@863,@4969,@4968 4968:O5|@4767,1342,0,1342,0 4969:S55|6669787570436f6e7374616e744c6f61643a20636f6e7374616e7420746f6f2064697374616e74202831362d626974206f666673657429 4970:O1|@4971 4971:D2,28|00832e2e2e3b2f1a1600307b07060006000000001400000000000000|@4973,@4972| 4972:O1|@4974 4973:S24|494e54434f4445434f4e5328292e7365744c6f6e67283329 4974:D16,292|00842c3f1a21010e0e0c000303033b0fd22b3b1a16010e0e0e0c0003291a10010e0c0002290c0001651a08010e0c0002030c2e2d1a01010e0e0c0003021b2e3f1af5000e0e0c0003292e1aef000c0003293c1ae7000c000365301b00011ae0000e0c0003293b1abf000c000303033c0214293b1ace000e0e0e0c00033c2a1ac7000c000364030329020a291b00011aa7000c0003291ab4000e0c00020303290207291aab000c00022928ff1aa6000e0e0e0c0003322e2b1a9e000e0e0e0c000450343b1a7e000e0e0e0c0003293c1a77000c00030304220c020e220c28ff1a5b0002022b000c0003291b00011a6d000e0e0c0003343c1a3f000c00032a220f220f2c220f1a590022100e0e7b071000061f050e0e0e0e0e0e000000001c01000000000000|@4975,I113,I253,I189,I218,I106,I107,I110,I231,I251,I105,I152,I243,@4768,I109,@4972| 4975:S35|494e54434f4445434f4e5328292e7365744c6f6e672833297075744279746573283429 4976:O4|@35,@863,@4978,@4977 4977:O5|@4775,106,0,106,0 4978:S37|63736567436f6e76657274546f436f64653a206e6f7420612062797465207365676d656e74 4979:O4|@35,@863,@4981,@4980 4980:O5|@4775,294,0,294,0 4981:S41|63736567507574576f72643a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 4982:S19|63736567507574576f72643a20496e64657820 4983:O5|@4775,289,0,289,0 4984:O1|@4985 4985:D24,316|00822d2307293b1a36010e0e0e0c0003291a30010e0c00021a2d010e0e0c000203043b5002041a23011029353035293b1a0d010e0e0c0003293b1a13010c0003293c1a0f010c000303032a020b2a3e1a06010e0e0e0c0003293f1aff000c000329220c1afa000e0e0e0c0003293d1aef000c0003303b1ac7000c00032935293d1ad1000e0e0c000303043b5002041ad300102a36291ad0000e0c0002293b1acb000c0003030c1ac7002a1ab3000c00030201292e3b1ab4000e0c000303033c020b292f1aae000e0e0e0c000303362e3c1aa5000e0e0c00032a3c1a9b000c0003293b691a96002a692c2a691a92002a6927051a8f000c00021a8d001a8e002b1a8e006b103b502e1a3a000e0e0e0c000203032e02072e1a7b000c00022c2a22141a750022150e0e7b051500040e0e0e0e000000003401000000000000|@4986,I253,I105,I218,@4915,I231,I251,I107,I109,I106,@4979,I15,I234,@677,I232,@510,@4789,@4982,@371,@35,@863,@4983,I152,I255| 4986:S28|494e54434f4445434f4e5328292e636f6e73744c6162656c73283329 4987:O4|@35,@863,@4989,@4988 4988:O5|@4775,115,0,115,0 4989:S47|63736567436f6e76657274546f436f64653a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 4990:O1|@4991 4991:D5,76|00812c2309293b1a46000e0e0e0c000329291a3f000c00021a3d000e0e0c0002031929352a362a32321a30000e0c00042a250426031e243b6602013b66430e0e000000004400000000000000|@4993,I253,I105,I218,@4992| 4992:O1|@4994 4993:S29|494e54434f4445434f4e5328292e6669784f7468657252656673283229 4994:D13,292|00822d230b2e38293b1a1c010e0c00033c2a291a16010e0e0e0c00021a11010e0e0c0002037129352a362a353b1a04010e0c000303472a3629230b220c230b2a2a1af0000e0c000365032e220c2e220c1ae5000e0e0c0004313b1acb000c0003293c1ad7000c0003333b2b1ad2000e0e0e0c0004503b6602013b6402013b2d3c1ac1000e0e0c0003292c2506250626041e7e3b270402013b652c3b1a8a000e0e0e0c0003293b1a9f000c0003640363312307293b1a71000e0e0c0003291a6c000e0c00021a69000e0e0c000203043b5002041a7700102935293b1a4b000c00032935293d1a4d000e0e0c000303043b5002041a5b00102a36293d1a57000c00033c2b692e3b2b1a37000c0004503b270802013b2704440e0e000000001c01000000000000|@4995,I253,I105,I218,I251,@4984,I107,I255,I106,I113,@4915,@4987,I200| 4995:S38|494e54434f4445434f4e5328292e6669784f7468657252656673283229666978526566283129 4996:O1|@4997 4997:D34,4404|0085402e0e0c0002301a2c111a2d110e0e0c000303033c0222301a23110c00021a21110e0e0c00020310303b1a09113b3f1a14110e0c000602013b0309283f2f0e0c00020206302f0e0c00021afd10300e0c00023c28403b1af5100e0e0c00043c28403b1ae9100e0e0c00042a3b1ae3100c000329220c1ade100e0e0e0c00036407cc2a3b1acc100e0c0003293d1acb100c0003340c00022b3b1ab7100c0003293b1a97100c000303033b020c2935292d1aac100e0c00036464039e2c3b1a93100c00033d2a22111a99100e0e0c00042e3b1a7f100c00032a2a1a8b100c0003293d1a83100c0003280922110e0c00022a3d1a67100c000322120e0e0e0c0002333b1a4f100c0003293d1a5b100c0003220c3b2b1a55100e0e0c000450343b1a32100e0e0e0c0003291a14100e0c00021a11100e0e0c000203043b5002041a2f10103b502936220d3b2b1a1f100202cc0f0c0004503b270b0fd12809220c0e0e0e0c00022d3b1aeb0f0c000322103b1ae20f0e0e0e0c00032936291af60f0e0e0e0c0002293b1acf0f0c0003030c1ae70f2a1ad30f0c00030201293f2a1adc0f0e0c00033b2f1ad70f0c0003030c2e2a1aa50f0e0e0c000302013b03043b5002372e3c1a960f0e0e0e0c00032a3c1a8b0f0c0003293b691aaa0f2a692c2a691aa60f2a6927051aa30f0c00021aa10f1aa20f2b1aa20f6b103b502e1a420f0e0e0e0c000203032e02072e1a8f0f0c00022d2a1a8b0f0c0003220c3b1a360f0e0e0e0c0003293c1a3f0f0202e10e0c0003220e3b2b1a350f0e0e0c0004502b3b1a160f0e0e0e0c000303033c021422153b1a010f0e0e0c00032c2a1a470f0c00036403041a420f103b503b502b3c1af80e0e0c000322162a1ada0e0e0e0e0c00036422170e0e0c00022c3b1acb0e0c000303033c021422153b1ab90e0e0e0c00032d2a1aff0e0c00036403041afa0e103b503b502c3c1ab00e0e0c000322162a1a920e0e0e0e0c0003293c1a930e0c000303033b0fd22e3d1a620e0e0e0e0c000303033c020b2e3d1a760e0e0e0e0c000303033c027b2e3e1a420e0e0e0e0c000303033c020b2e3e1a560e0e0e0e0c000303033c025b2e28811a210e0e0e0c000303033c020b2e28811a350e0e0e0c000303033c023b2e28051a010e0e0e0c000303033c020b2e28051a150e0e0e0c000303033c021b2e281a1ae10d0e0e0c000303033c020b2e281a1af50d0e0e0c00030380293c1a350e0e0e0c000322123b1ad20d0e0e0e0c00032a2a22201ad50d0e0e0c000422143b1aba0d0e0e0e0c00032a2a1ac30d0202630d0c0003292e1ab70d0c0003280922200e0c00022a3d1a9b0d0c000322210e0e0e0c000222193b1a820d0e0e0e0c000329321a8b0d0c0003221b3b2b1a850d0e0e0c0004503b270a0fcb2e280f1a440d0e0c000303033c020b2e280f1a590d0e0e0c000303033c025b2e28071a250d0e0e0c000303033c020b2e28071a390d0e0e0c000303033c023b2e28821a050d0e0e0c000303033c020b2e28821a190d0e0e0c000303033c021b2e28091ae50c0e0e0c000303033c020b2e28091af90c0e0e0c0003039422113b1ae00c0e0c00033c2a221f1ae50c0e0e0c000422133b1aca0c0e0e0e0c00032a2a1ad30c0c0003293c1acb0c0c000322153b1aae0c0e0e0e0c0003292b1aff0c0c000322173b2b1ab10c02024d0c0e0e0c000450280922210c00022c3d1a8b0c0c000322220e0e0e0c0002221a3b1a720c0e0e0e0c0003293c1a7b0c0c0003221c3b2b1a750c0e0e0c0004503b270b0fd22e281e1a340c0e0c000303033c020b2e281e1a490c0e0e0c000303742809221a0e0e0e0c000222123b1a260c0e0e0e0c0003293c1a730c0c000322143b1a120c0e0e0e0c00033c2a22221a150c0e0e0c00042b2a1a530c0c0003293d1afb0b0c000322200e0e0e0c000222183b1ae20b0e0e0e0c0003293c1aeb0b0c0003221a3b2b1ae50b0e0e0c0004503b27090fcf2e28201aa40b0e0c000303033c020b2e28201ab90b0e0e0c000303782809221a0e0e0e0c000222123b1a960b0e0e0e0c0003293c1ae30b0c000322143b1a820b0202360b0e0e0e0c00033d2a22221a810b0e0e0c00042b2a1abf0b0c0003293d1a670b0c000322200e0e0e0c000222183b1a4e0b0e0e0e0c0003293d1a570b0c0003221a3b2b1a510b0e0e0c0004503b27090fd22e28121a100b0e0c000303033c020b2e28121a250b0e0e0c000307d12809221a0e0e0e0c000222123b1a020b0e0e0e0c00033d2a22201a050b0202a90a0e0e0c0004293d1aef0a0c0003221d0e0e0e0c000222153b1ad60a0e0e0e0c0003293d1adf0a0c000322173b2b1ad90a0e0e0c000450282c22200c000222183b1aae0a0e0e0e0c00033d2a22261ab10a0e0e0c0004293d1a9f0a0c000322230e0e0e0c0002221b3b1a860a0e0e0e0c0003293d1a8f0a0c0003221d3b2b1a890a0e0e0c000450282c22260c0002221e3b1a5e0a0202120a0e0e0e0c00033d2a222c1a5d0a0e0e0c0004293d1a4b0a020231000c000322290e0e0e0c000222213b1a2e0a0e0e0e0c0003293d1a370a0c000322233b2b1a310a0e0e0c0004503b27120fd32e280b1af0090e0c000303033c020b2e280b1a050a0e0e0c000307ce22113b1aec090e0c00033d2a221f1af1090e0e0c000422133b1ad6090e0e0e0c00032a2a1adf090c0003293d1ad7090c00032809221f0e0c00022a3d1abb090c000322200e0e0e0c000222183b1aa2090e0e0e0c0003293d1aab090c0003221a3b2b1aa5090e0e0c000450282c22230c0002221b3b1a7a090e0e0e0c00033d2a22291a7d090e0e0c0004293d1a6b090c000322260e0e0e0c0002221e3b1a52090e0e0e0c0003293d1a5b090c000322203b2b1a55090202f1080e0e0c000450282c22290c000222213b1a2609020248000e0e0e0c00033d2a222f1a25090e0e0c0004293d1a13090c0003222c0e0e0e0c000222243b1afa080e0e0e0c0003293d1a03090c000322263b2b1afd080e0e0c0004503b27150fcd2e28161abc080e0c000303033c020b2e28161ad1080e0e0c000307d22809221a0e0e0e0c000222123b1aae080e0e0e0c00033d2a22201ab1080e0e0c0004293d1a9f080c0003221d0e0e0e0c000222153b1a86080e0e0e0c0003293d1a8f080c000322173b2b1a89080e0e0c00045022173b1a65080e0e0c00033d2a22251a69080e0e0c000422193b1a4e080e0e0e0c00032a2a1a57080c0003293d1a4f080c0003282c22250e0c00022a3d1a33080c000322260e0e0e0c0002221e3b1a1a080e0e0e0c0003293d1a23080202c3070c000322203b2b1a19080e0e0c000450282c22290c000222213b1aee07020298000e0e0e0c00033d2a222f1aed070e0e0c0004293d1adb070c0003222c0e0e0e0c000222243b1ac2070e0e0e0c0003293d1acb070c000322263b2b1ac5070e0e0c000450282c222f0c000222273b1a9a070e0e0e0c00033d2a22351a9d070e0e0c0004293d1a8b070c000322320e0e0e0c0002222a3b1a72070e0e0e0c0003293d1a7b070c0003222c3b2b1a75070e0e0c0004503b271b0fd32e28591a34070e0c000303033c020b2e28591a49070e0e0c000303c422113b1a30070e0c00033d2a221f1a35070e0e0c000422133b1a1a070e0e0e0c00032a2a1a23070c0003293d1a1b070c00032809221f0e0c00022a3d1aff060c000322200e0e0e0c000222183b1ae6060e0e0e0c0003293d1aef060c0003221a3b2b1ae9060e0e0c000450282c22230c0002221b3b1abe060e0e0e0c00033c2a22291ac1060e0e0c0004293d1aaf060c000322260e0e0e0c0002221e3b1a96060e0e0e0c0003293c1a9f060c000322203b2b1a9906020235060e0e0c0004503b270f0fcd2e284f1a54060e0c000303033c020b2e284f1a69060e0e0c000307d22809221a0e0e0e0c000222123b1a46060e0e0e0c00033c2a22201a49060e0e0c0004293d1a37060c0003221d0e0e0e0c000222153b1a1e060e0e0e0c0003293c1a27060c000322173b2b1a21060e0e0c00045022173b1afd050e0e0c00033d2a22251a01060e0e0c000422193b1ae6050e0e0e0c00032a2a1aef050c0003293d1ae7050c0003282c22250e0c00022a3d1acb050c000322260e0e0e0c0002221e3b1ab2050e0e0e0c0003293d1abb0502025b050c000322203b2b1ab1050e0e0c000450282c22290c000222213b1a8605020248000e0e0e0c00033c2a222f1a85050e0e0c0004293d1a73050c0003222c0e0e0e0c000222243b1a5a050e0e0e0c0003293c1a63050c000322263b2b1a5d050e0e0c0004503b27150fd12e401a1d050e0e0c000303033c020b2e401a32050e0e0e0c000307ca22113b1a18050e0c00033d2a221f1a1d050e0e0c00042809221c0e0c000222143b1afa040e0e0e0c00033d2a22221afd040e0e0c0004293d1aeb040c0003221f0e0e0e0c000222173b1ad2040e0e0e0c0003293d1adb040c000322193b2b1ad5040e0e0c00045022193b1ab1040e0e0c00033b29321a06050e0e0e0c000303033b02791afc0422240e0e0e0c0002221c3b1a8a040e0e0e0c00033d2a222a1a8d040e0e0c00042d2a1a87040c0003293d1a730402021f040c000322280e0e0e0c000222203b1a5604020234000e0e0e0c0003293d1a5b040c000322223b2b1a55040e0e0c000450303c1a46040e0e0e0c000329250926081e843b2708270a0fcc2e287c1a00040e0c000303033c020b2e287c1a15040e0e0c000303a82809221a0e0e0e0c000222123b1af2030e0e0e0c00033d2a22201af5030e0e0c0004293d1ae3030c0003221d0e0e0e0c000222153b1aca030e0e0e0c0003293d1ad3030c000322173b2b1acd030e0e0c000450282c22200c000222183b1aa2030e0e0e0c00033d2a22261aa5030e0e0c0004293d1a93030c000322230e0e0e0c0002221b3b1a7a030e0e0e0c0003293d1a83030c0003221d3b2b1a7d030e0e0c0004503b270c0fd02e287b1a3c03020208030e0c000303033c020b2e287b1a4d030e0e0c000303a82809221a0e0e0e0c000222123b1a2a030e0e0e0c00033c2a22201a2d030e0e0c0004293d1a1b030c0003221d0e0e0e0c000222153b1a02030e0e0e0c0003293c1a0b030c000322173b2b1a05030e0e0c000450282c22200c000222183b1ada020e0e0e0c00033c2a22261add020e0e0c0004293d1acb020c000322230e0e0e0c0002221b3b1ab2020e0e0e0c0003293c1abb020c0003221d3b2b1ab5020e0e0c0004503b270c0fd22e284d1a7402020240020e0c000303033c020b2e284d1a85020e0e0c000307cb2809221a0e0e0e0c000222123b1a62020e0e0e0c00033c2a22201a65020e0e0c0004293d1a53020c0003221d0e0e0e0c000222153b1a3a020e0e0e0c0003293c1a43020c000322173b2b1a3d020e0e0c0004502f3c1a72020e0e0e0c000322183b1a0e020e0e0e0c00032a2a22261a11020e0e0c0004221a3b1af6010e0e0e0c00032a2a1aff010c0003292e1af7010c0003282c22260e0c00022a3d1adb010c000322270e0e0e0c0002221f3b1ac201020276010e0e0e0c000329321ac7010c000322213b2b1ac10102020b000e0e0c0004503b27100fce2e284e1a7c010e0c000303033c020b2e284e1a91010e0e0c000307cb2809221a0e0e0e0c000222123b1a6e010e0e0e0c00033d2a22201a71010e0e0c0004293d1a5f010c0003221d0e0e0e0c000222153b1a46010e0e0e0c0003293d1a4f010c000322173b2b1a49010e0e0c0004502f3c1a7e010e0e0e0c000322183b1a1a010e0e0e0c00032a2a22261a1d010e0e0c0004221a3b1a02010e0e0e0c00032a2a1a0b010c0003292e1a03010c0003282c22260e0c00022a3d1ae7000c000322270e0e0e0c0002221f3b1ace00020282000e0e0e0c000329321ad3000c000322213b2b1acd0002020b000e0e0c0004503b2710025e293c1af9000e0e0c00032809221b0e0c000222133b1a8e000e0e0e0c00032b2a22211a91000e0e0c0004293d1a7f000c0003221e0e0e0e0c000222163b1a66000e0e0e0c0003292f1a6f000c000322183b2b1a69000e0e0c0004503b2707270e40220d0c0002260420aa103b6602013b3b27061f060e0e0e0e0e000000002c11000000000000|@4999,I48,I251,I105,I218,I154,@5000,I11,I253,I234,@510,I113,@4829,I106,I255,@5001,I15,@677,I108,I232,@4789,@4817,@371,@35,@863,@4815,I152,I252,I231,@1850,I107,@5004,I233,@4998| 4998:S2|0a09 4999:S26|494e54434f4445434f4e5328292e7072696e74436f6465283429 5000:S2|3a0a 5001:O4|@35,@863,@5003,@5002 5002:O5|@4767,1633,0,1633,0 5003:S36|7072696e74436f64653a20696e646972656374696f6e206c69737420636f6e6675736564 5004:O1|@5005 5005:D6,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203352c352d362d2b1a49000e0e0c000303052d2f69021d2d2b1a3c000e0c000303032e020f292e1a32000e0e0e0c00032b2a69646502032b3b69430e000000005400000000000000|@5006,I105,I218,I234,I113,@5004| 5006:S35|494e54434f4445434f4e5328292e7072696e74436f64652834296164644c2832292829 5007:D37,1324|00822d353c1a28050e0c000307d42d36291a20050e0c0002035e291a16050e0e0e0c000203043b5002041a0b05103b50293b1a07050c0003030c1a03052a1a03050c00030201291afe042f0e0e0c00022a3d1af7040c0003300c00021af104310e0c00022c3c1ae3040c0003320c0002282933327d0b0002291ab8040e0c000203041acf04103b503b5028662a1ac8040e0c0003030a1ac3042e2d0e7d060002291abc040e0c0002293e1ab7040c0003293d1a7b040c00036507da291aa9040e0e0c0002293b1a73040c0003030c1a6f042a1a6f040c0003020129293c1a8c04020220040e0c00033f2a1a83040c00033b3b293f1a7d040e0e0c000303032a028c323b1a72040e0e0e0c0003291a6c040e0c0002290c0001651a64040e0c0002031d2b3f1a1d040e0e0c0003292b1a3b040c0003293c1a33040c00036502092b2a1a00040e0c0003291ae8030e0c00020303290207291a2b040c0002312a1a27040c00032d1b00011a05040e0e0c0003292b1acf030c00032e3c1ac7030c00032a2a2508250826061e963b2706652b2a1ad903020235000e0e0c0003291a94030e0c00020303290207291ad7030c0002302a1ac3030c00031ad1032a1ad1030e0e0c000327082e2d7d060002291a90030e0c0002293e1a8b030c0003293c1a4f030c000365035d291a7d030e0e0c0002293b1a47030c0003030c1a43032a1a43030c0003020129293c1a68030e0c0003030a1a7f03302f0e7d080002293c1a2b030c00031a71032a1a65030e0e0c0003291a68031a59030e0e0c000365302f0e7d080002291a18030e0c0002293e1a13030c0003293b1ad7020c0003650314291a05030e0e0c00023c2a1a33030c00036402013b07cf293b1afd020e0e0c0003291ab0020e0c00021af5020e0e0c000207d4291a9e020e0e0e0c000203041a0303103b503b5028662a1aac020e0c00031acd020e0e0c0002031d291aa2020e0e0e0c0002293e1a9b020c0003293d1a5f020c00036502013b07dc291a8a020e0e0e0c0002293b1a53020c0003030c1a4f022a1a4f020c0003020129293c1a6c020e0c00033f2a1a67020c00033b3b293f1a61020e0e0c000303032a0294333b1a56020e0e0e0c0003291a50020e0c0002290c0001651a48020e0c000203212b3f1a0102020261010e0e0c0003292b1a1b020c0003293c1a13020c000365020d2b2a1ae0010202e4000e0c0003291ac4010e0c00020303290207291a07020c0002312a1a03020c00032d1b00011ae1010e0e0c0003292b1aab010c00032e3c1aa3010c00032a2a2508250826061e9e3b2706652b2a020238001ab1010e0e0c0003291a70010e0c00020303290207291ab3010c0002302a1a9f010c00031ac9012a1aad010e0e0c000327082f2e7d0700022a1a74010e0c0002293b1a3f010c0003030c1a3b012a1a3b010c0003020129293c1a60010e0c0003030a1a8f0131300e7d090002293c1a23010c00031a81012a1a5d010e0e0c0003291a78011a51010e0e0c00036531300e7d0900022a1a18010e0c0002293b1ae3000c0003030c1adf002a1adf000c0003020129293c1a04010e0c0003030a1a330131300e7d090002293c1ac7000c00031a25012a1a01010e0e0c0003291a1c011af5000e0e0c00036531300e7d090002291abc000e0c0002293b1a87000c0003030c1a83002a1a83000c0003020129293c1aa8000e0c0003030a1ad700302f0e7d080002293c1a6b000c00031ac9002a1aa5000e0e0c0003291ac0001a99000e0e0c000365302f0e7d0800022d3629230603051aaa0002031aa9002e0e0c00022a392f2e7d070002000000002405000000000000|@5009,I251,I105,@3062,I234,@677,I106,@5010,@510,@4643,@1784,I150,@5011,I17,I243,I15,I107,I108,I113,I253,I189,I218,I152,I252,@5012,@389,@5013,@5014,@5015,I248,@1784,@5008,@5016,@5017,@5015,@5012,@5008| 5008:S6|636c6f733a09 5009:S27|494e54434f4445434f4e5328292e7072696e74436f6e7374283229 5010:S7|73686f72743a09 5011:S9|52545320656e747279 5012:S6|636f64653a09 5013:S13|62797465733a093120776f7264 5014:S7|62797465733a09 5015:S6|20776f726473 5016:S12|6c6f6e673a093120776f7264 5017:S6|6c6f6e673a09 5018:S13|3c554e4b4e4f574e203235353e 5019:S8|656e746572496e74 5020:S11|3c554e4b4e4f574e20313e 5021:S4|6a756d70 5022:S9|6a756d7046616c7365 5023:S11|3c554e4b4e4f574e20343e 5024:S10|64656c48616e646c6572 5025:S11|3c554e4b4e4f574e20363e 5026:S10|6a756d704946616c7365 5027:S11|3c554e4b4e4f574e20383e 5028:S11|64656c48616e646c657249 5029:S10|63617365537769746368 5030:S6|63616c6c536c 5031:S11|63616c6c436c6f73757265 5032:S7|72657475726e57 5033:S3|706164 5034:S5|6a756d7049 5035:S7|72616973654578 5036:S9|67657453746f726557 5037:S8|6e6f6e4c6f63616c 5038:S6|6c6f63616c57 5039:S9|696e64697265637457 5040:S10|6d6f7665546f56656357 5041:S7|63616c6c536c58 5042:S12|736574537461636b56616c57 5043:S6|726573657457 5044:S8|7265736574525f77 5045:S9|636f6e737441646472 5046:S9|636f6e7374496e7457 5047:S10|696f566563456e747279 5048:S8|636f6e73744e696c 5049:S9|6a756d704261636b38 5050:S7|72657475726e42 5051:S10|6a756d704261636b3136 5052:S9|67657453746f726542 5053:S6|6c6f63616c42 5054:S9|696e64697265637442 5055:S10|6d6f7665546f56656342 5056:S12|736574537461636b56616c42 5057:S6|726573657442 5058:S7|72657365745242 5059:S9|636f6e7374496e7442 5060:S7|6c6f63616c5f30 5061:S7|6c6f63616c5f31 5062:S7|6c6f63616c5f32 5063:S7|6c6f63616c5f33 5064:S7|6c6f63616c5f34 5065:S7|6c6f63616c5f35 5066:S7|6c6f63616c5f36 5067:S7|6c6f63616c5f37 5068:S7|6c6f63616c5f38 5069:S7|6c6f63616c5f39 5070:S8|6c6f63616c5f3130 5071:S8|6c6f63616c5f3131 5072:S10|696e6469726563745f30 5073:S10|696e6469726563745f31 5074:S10|696e6469726563745f32 5075:S10|696e6469726563745f33 5076:S10|696e6469726563745f34 5077:S10|696e6469726563745f35 5078:S7|636f6e73745f30 5079:S7|636f6e73745f31 5080:S7|636f6e73745f32 5081:S7|636f6e73745f33 5082:S7|636f6e73745f34 5083:S8|636f6e73745f3130 5084:S8|72657475726e5f30 5085:S8|72657475726e5f31 5086:S8|72657475726e5f32 5087:S8|72657475726e5f33 5088:S11|6d6f7665546f5665635f30 5089:S11|6d6f7665546f5665635f31 5090:S11|6d6f7665546f5665635f32 5091:S11|6d6f7665546f5665635f33 5092:S11|6d6f7665546f5665635f34 5093:S11|6d6f7665546f5665635f35 5094:S11|6d6f7665546f5665635f36 5095:S11|6d6f7665546f5665635f37 5096:S12|636f6e737441646472585f62 5097:S12|636f6e737441646472585f77 5098:S8|63616c6c536c4358 5099:S7|72657365745f31 5100:S7|72657365745f32 5101:S10|67657453746f72655f32 5102:S10|67657453746f72655f33 5103:S10|67657453746f72655f34 5104:S12|3c554e4b4e4f574e2038353e 5105:S11|6e6f6e4c6f63616c4c5f31 5106:S11|6e6f6e4c6f63616c4c5f32 5107:S11|6e6f6e4c6f63616c4c5f33 5108:S7|63616c6c536c43 5109:S7|696f5665635f35 5110:S14|6f70636f64655f696f5665635f36 5111:S12|3c554e4b4e4f574e2039323e 5112:S12|3c554e4b4e4f574e2039333e 5113:S12|3c554e4b4e4f574e2039343e 5114:S12|3c554e4b4e4f574e2039353e 5115:S12|3c554e4b4e4f574e2039363e 5116:S12|3c554e4b4e4f574e2039373e 5117:S12|3c554e4b4e4f574e2039383e 5118:S12|3c554e4b4e4f574e2039393e 5119:S8|7265736574525f31 5120:S8|7265736574525f32 5121:S8|7265736574525f33 5122:S6|7475706c6557 5123:S6|7475706c6542 5124:S7|7475706c655f32 5125:S7|7475706c655f33 5126:S7|7475706c655f34 5127:S4|6c6f636b 5128:S5|6c64657863 5129:S9|696f5665635f323235 5130:S9|696f5665635f323236 5131:S9|696f5665635f323239 5132:S9|696f5665635f323333 5133:S9|696f5665635f323336 5134:S9|696f5665635f323531 5135:S9|696f5665635f323533 5136:S9|696f5665635f323535 5137:S13|3c554e4b4e4f574e203131383e 5138:S13|3c554e4b4e4f574e203131393e 5139:S11|7075736848616e646c6572 5140:S13|3c554e4b4e4f574e203132313e 5141:S13|3c554e4b4e4f574e203132323e 5142:S6|7461696c6262 5143:S4|7461696c 5144:S6|7461696c3362 5145:S6|7461696c3462 5146:S7|7461696c335f32 5147:S7|7461696c335f33 5148:S10|73657448616e646c6572 5149:S11|73657448616e646c657249 5150:S13|3c554e4b4e4f574e203133313e 5151:S13|3c554e4b4e4f574e203133323e 5152:S13|3c554e4b4e4f574e203133333e 5153:S13|3c554e4b4e4f574e203133343e 5154:S13|3c554e4b4e4f574e203133353e 5155:S13|3c554e4b4e4f574e203133363e 5156:S13|3c554e4b4e4f574e203133373e 5157:S13|3c554e4b4e4f574e203133383e 5158:S13|3c554e4b4e4f574e203133393e 5159:S13|3c554e4b4e4f574e203134303e 5160:S13|3c554e4b4e4f574e203134313e 5161:S13|3c554e4b4e4f574e203134323e 5162:S13|3c554e4b4e4f574e203134333e 5163:S13|3c554e4b4e4f574e203134343e 5164:S13|3c554e4b4e4f574e203134353e 5165:S13|3c554e4b4e4f574e203134363e 5166:S13|3c554e4b4e4f574e203134373e 5167:S13|3c554e4b4e4f574e203134383e 5168:S13|3c554e4b4e4f574e203134393e 5169:S13|3c554e4b4e4f574e203135303e 5170:S13|3c554e4b4e4f574e203135313e 5171:S13|3c554e4b4e4f574e203135323e 5172:S13|3c554e4b4e4f574e203135333e 5173:S13|3c554e4b4e4f574e203135343e 5174:S13|3c554e4b4e4f574e203135353e 5175:S13|3c554e4b4e4f574e203135363e 5176:S13|3c554e4b4e4f574e203135373e 5177:S13|3c554e4b4e4f574e203135383e 5178:S13|3c554e4b4e4f574e203135393e 5179:S13|3c554e4b4e4f574e203136303e 5180:S13|3c554e4b4e4f574e203136313e 5181:S13|3c554e4b4e4f574e203136323e 5182:S13|3c554e4b4e4f574e203136333e 5183:S13|3c554e4b4e4f574e203136343e 5184:S13|3c554e4b4e4f574e203136353e 5185:S13|3c554e4b4e4f574e203136363e 5186:S13|3c554e4b4e4f574e203136373e 5187:S13|3c554e4b4e4f574e203136383e 5188:S13|3c554e4b4e4f574e203136393e 5189:S13|3c554e4b4e4f574e203137303e 5190:S13|3c554e4b4e4f574e203137313e 5191:S13|3c554e4b4e4f574e203137323e 5192:S13|3c554e4b4e4f574e203137333e 5193:S13|3c554e4b4e4f574e203137343e 5194:S13|3c554e4b4e4f574e203137353e 5195:S13|3c554e4b4e4f574e203137363e 5196:S13|3c554e4b4e4f574e203137373e 5197:S13|3c554e4b4e4f574e203137383e 5198:S13|3c554e4b4e4f574e203137393e 5199:S13|3c554e4b4e4f574e203138303e 5200:S13|3c554e4b4e4f574e203138313e 5201:S13|3c554e4b4e4f574e203138323e 5202:S13|3c554e4b4e4f574e203138333e 5203:S13|3c554e4b4e4f574e203138343e 5204:S13|3c554e4b4e4f574e203138353e 5205:S13|3c554e4b4e4f574e203138363e 5206:S13|3c554e4b4e4f574e203138373e 5207:S13|3c554e4b4e4f574e203138383e 5208:S13|3c554e4b4e4f574e203138393e 5209:S13|3c554e4b4e4f574e203139303e 5210:S13|3c554e4b4e4f574e203139313e 5211:S13|3c554e4b4e4f574e203139323e 5212:S13|3c554e4b4e4f574e203139333e 5213:S13|3c554e4b4e4f574e203139343e 5214:S13|3c554e4b4e4f574e203139353e 5215:S13|3c554e4b4e4f574e203139363e 5216:S13|3c554e4b4e4f574e203139373e 5217:S13|3c554e4b4e4f574e203139383e 5218:S13|3c554e4b4e4f574e203139393e 5219:S13|3c554e4b4e4f574e203230303e 5220:S13|3c554e4b4e4f574e203230313e 5221:S13|3c554e4b4e4f574e203230323e 5222:S13|3c554e4b4e4f574e203230333e 5223:S13|3c554e4b4e4f574e203230343e 5224:S13|3c554e4b4e4f574e203230353e 5225:S13|3c554e4b4e4f574e203230363e 5226:S13|3c554e4b4e4f574e203230373e 5227:S13|3c554e4b4e4f574e203230383e 5228:S13|3c554e4b4e4f574e203230393e 5229:S13|3c554e4b4e4f574e203231303e 5230:S13|3c554e4b4e4f574e203231313e 5231:S13|3c554e4b4e4f574e203231323e 5232:S13|3c554e4b4e4f574e203231333e 5233:S13|3c554e4b4e4f574e203231343e 5234:S13|3c554e4b4e4f574e203231353e 5235:S13|3c554e4b4e4f574e203231363e 5236:S13|3c554e4b4e4f574e203231373e 5237:S13|3c554e4b4e4f574e203231383e 5238:S13|3c554e4b4e4f574e203231393e 5239:S13|3c554e4b4e4f574e203232303e 5240:S13|3c554e4b4e4f574e203232313e 5241:S13|3c554e4b4e4f574e203232323e 5242:S13|3c554e4b4e4f574e203232333e 5243:S13|3c554e4b4e4f574e203232343e 5244:S13|3c554e4b4e4f574e203232353e 5245:S13|3c554e4b4e4f574e203232363e 5246:S13|3c554e4b4e4f574e203232373e 5247:S13|3c554e4b4e4f574e203232383e 5248:S13|3c554e4b4e4f574e203232393e 5249:S13|3c554e4b4e4f574e203233303e 5250:S13|3c554e4b4e4f574e203233313e 5251:S13|3c554e4b4e4f574e203233323e 5252:S13|3c554e4b4e4f574e203233333e 5253:S13|3c554e4b4e4f574e203233343e 5254:S13|3c554e4b4e4f574e203233353e 5255:S13|3c554e4b4e4f574e203233363e 5256:S13|3c554e4b4e4f574e203233373e 5257:S13|3c554e4b4e4f574e203233383e 5258:S13|3c554e4b4e4f574e203233393e 5259:S13|3c554e4b4e4f574e203234303e 5260:S13|3c554e4b4e4f574e203234313e 5261:S13|3c554e4b4e4f574e203234323e 5262:S13|3c554e4b4e4f574e203234333e 5263:S13|3c554e4b4e4f574e203234343e 5264:S13|3c554e4b4e4f574e203234353e 5265:S13|3c554e4b4e4f574e203234363e 5266:S13|3c554e4b4e4f574e203234373e 5267:S13|3c554e4b4e4f574e203234383e 5268:S13|3c554e4b4e4f574e203234393e 5269:S13|3c554e4b4e4f574e203235303e 5270:S13|3c554e4b4e4f574e203235313e 5271:S13|3c554e4b4e4f574e203235323e 5272:S13|3c554e4b4e4f574e203235333e 5273:S13|3c554e4b4e4f574e203235343e 5274:D1,20|00805607420e0e0e000000000c00000000000000|@5275| 5275:S24|494e5447434f444528292e67656e636f6465283329283129 5276:S11|3c746f70206c6576656c3e 5277:O1|@5278 5278:D2,20|00811a1300100e0e000000000c00000000000000|@4741,@5279| 5279:O4|@35,@863,@5281,@5280 5280:O5|@4755,1131,0,1131,0 5281:S17|746f70206c6576656c2072656163686564 5282:D2,28|008056073b691a17002c0e0e0e800002000000001400000000000000|@5275,I204| 5283:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4296| 5284:D6,84|00832e1a52000e0e0e0c00021a4d000e0e0c0002032d2e362d2f3b1a42000e0e0e0c0004292e69303c1a38000e0c00032c2a32321a31000e0e0c00052b2a69270502013b1f040e0e000000004c00000000000000|@5285,I105,I218,@2403,I106,@4258| 5285:S61|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831296765744974656d283229 5286:O4|@83,@2825,0,@5287 5287:O5|@2826,75,0,75,0 5288:D5,124|0087321a7a000e0e0e0c00021a75000e0e0c00020351323533362a362b3729352a362b372c382d392e3a2f230630230722142214221422142214221422141a47000c00103b2c2b6a2d220f220f220f220f220f220f220f1a32000e0e0e0c00092a2a69270702013b1f080e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,@5289,@4252| 5289:O1|@5290 5290:D7,132|008e3c28403b1a7f000c00041a7d002a3434342213680622122a1a7300220f313434220e0e0c00082b3b1a67000c0003293b2a1a62000e0e0e0c00021a5d000e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652b22153b2c22153c22152215680827051f0f0e0e0e0e0e0e000000007c00000000000000|@5292,I11,@5293,@5291,I253,I105,I218| 5291:O1|@5297 5292:S64|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829 5293:D10,164|0080560b2c2a1a9f000c00021a9d000e0e0c000203043b5002041a9300103b502a352b362b3b1a8b000c000303032a02172b3c1a82000e0e0e0c00032a2a2505250526031e3f3b6427040402002a2a56485659566a1a64000e0c00065029352a362a353b1a59000e0e0c000303032a020f2a362956671a4b000c00033c2a69652a56671a42000e0e0e0c00032a2a692706420e0e0e0e0e0e000000009c00000000000000|@5295,I105,I218,@878,I113,I107,@4263,I251,@2438,@5294| 5294:O1|@5296 5295:S77|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829636c6f73757265526566283129 5296:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@2438,@5294| 5297:D1,20|00803b420e0e0e0e000000000c00000000000000|@5298| 5298:S81|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f7375726528382970726f636573736564426f64792d283129 5299:O4|@35,@863,@5301,@5300 5300:O5|@4221,222,0,222,0 5301:S30|4c69667465642066756e6374696f6e206f7574206f6620636f6e74657874 5302:O1|@5303 5303:D5,76|00812c1a4a000e0e0e0c00021a45000e0e0c000203252c352d362a352b362a301a35000e0e0c0003292b692d321a2c000e0c00032a2a69270702013b430e0e0e000000004400000000000000|@1785,I105,I218,@3434,@5302| 5304:O1|@5305 5305:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c363f2b69293c692b1a2c000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@5304| 5306:O1|@5307 5307:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@5306| 5308:O1|@5309 5309:D5,76|00812c1a4a000e0e0e0c00021a45000e0e0c000203252c352d362a352b362a301a35000e0e0c0003292b692d321a2c000e0c00032a2a69270702013b430e0e0e000000004400000000000000|@1785,I105,I218,@3434,@5308| 5310:O1|@5311 5311:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c363f2b69293c692b1a2c000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@5310| 5312:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@4248| 5313:O5|@4170,83,0,83,0 5314:S9|496e74657272757074 5315:O1|@5316 5316:D2,20|00801a1300100e0e000000000c00000000000000|@4218,@4217| 5317:O1|@5318 5318:D13,332|00812c35401a48010e0c0003030e2c37292d1a3f012e0e0e7e0500032c35280e1a2d010e0e0c000303632c36291a24012e1a24010e0c000429291a1f010c00021a1d010e0e0c0002032d29352a362a1a0a010e0e0e0c00021a05010e0e0c00021afd000e0e0c00020309292503511e353b02013b6502013c6403033b020c1ae30028452b3b6b293b69646502ae2c353f1abd000e0e0c000303912c3629353d1aae000e0e0e0c000303043b5002041ab700103b502936293b1ab1000e0e0c000303033c02142d3b1aa6000e0e0e0c00032a2a1a9f000c00036403041a9a00103b503b50293c1a94000e0c00032e2a1a7f000c0003291a64000e0c00021a61000e0e0c0002030d293529352a363b2b2b6a6602033c2d6929353b1a34000e0c00030304293702013b270502102c353d1a1f000c000303042c3702013b430e0e0e0e000000004401000000000000|@5320,I251,@5317,@5319,I105,I218,@33,@4166,I234,I253,I231,@1850,I106| 5319:O1|@5321 5320:S68|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296578747261637450726f7073283129 5321:D4,68|00822d1a42000e0e0e0c00021a3d000e0e0c0002031d2d352e362a2e300c00032a30301a2a000e0e0e0c00042a2a69270402013b440e0e0e000000003c00000000000000|@1785,I105,I218,@5319| 5322:D10,268|00812b3b1a09010e0e0c000303032c0fcd2c3b1afa000e0e0e0c000303032b0fd00402002d2a56371ae9000e0e0c00045029352a360402002f2a56671ad9000e0e0c00045029352a362d1acf000c00021acd000e0e0c000203142a1abe000e0e0e0c00021ab9000e0e0c000202013b03662d352b352a3556971a94000e0c000303043b5002041a9b00103b502a372a3556a71a7b000c000303043b5002041a8300103b502a372a2a220c1a7b000c000456b728452b3b6b2f3b1a54000e0c0003030332020b32301a62000e0e0e0c00032a2a6927070221313b1a340002021a000e0c0003030332020f32321a420033020207000e7e0a00032706430e0e0e0e0e000000000401000000000000|@5324,I251,@5325,@5328,I105,I218,@1840,@5330,@5332,@5323| 5323:O1|@5334 5324:S51|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e6d657267655475706c6550726f7073283229 5325:O1|@5326 5326:D6,108|00822d1a6a000e0e0e0c00021a65000e0e0c0002033c2d352e362a35292f1a57000c000364030b2a68012f2a452b4664021d0402002a2a301a41000e0e0c00045029352a362d2a69322c452a46270465020b1a2b002d2a35452a364664440e0e000000006400000000000000|@5327,I105,I218,I251,@5325,@740| 5327:S48|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e73706c697450726f70732832292829 5328:O1|@5329 5329:D6,108|00822d1a6a000e0e0e0c00021a65000e0e0c0002033c2d352e362a35292f1a57000c000364030b2a68012f2a452b4664021d0402002a2a301a41000e0e0c00045029352a362d2a69322c452a46270465020b1a2b002d2a35452a364664440e0e000000006400000000000000|@5327,I105,I218,I251,@5328,@740| 5330:O1|@5331 5331:D7,116|00822d3b1a71000e0e0c000303192c3b1a65000e0e0c000303043b5002041a5b00103b503b023e2d352e362e1a51000e0e0c00021a4d000e0e0c000203043b5002041a4300103b502e352f362c2b310e0e0c00032c2b321a32000e0e0e0c00042a2a692706440e0e000000006c00000000000000|@3980,I251,@3979,I105,I218,@3979,@5330| 5332:O1|@5333 5333:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@5332| 5334:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@5323| 5335:D6,92|00822d1a5a000e0e0e0c00021a55000e0e0c000203352d352e362a352b362f313b1a44000e0c00043c2c2c2c6b323c1a3a000e0e0e0c00032e2a341a32000e0e0e0c00042b2a69270802013b440e0e0e000000005400000000000000|@5336,I105,I218,@2403,I106,@4155| 5336:S83|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129676574526573756c7473283229 5337:S19|4f7574707574206f66206f7074696d69736572 5338:O1|@5339 5339:D9,132|00802b353d1a80000e0c000303612b362c371a77001a78002b6a2b2a1a75000e0e0c000329291a6f000c00021a6d000e0e0c0002032229352a362a3629353c1a46000e0e0e0c0003640309292503511e2a3b02013b6502013c6403051a4100020a1a40002a693d2e2b6a64270402012b420e0e0e0e0e0e0e000000007c00000000000000|@5341,I251,@5340,@5338,@2047,I105,I218,@855,@894| 5340:D1,44|00802b56180c000229352a362956470e0e0c00022b2a692704420e0e0e0e0e0e000000002400000000000000|@3751| 5341:S36|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129 5342:D1,28|00803b56180c00023d2a56376a64420e000000001400000000000000|@5343| 5343:S24|434f44455452454528292e67656e436f6465283329283129 5344:O1|@5345 5345:D9,116|00802b363c1a70000e0c000303051a6b0002532b35293b1a66000e0e0e0c00036403051a5e00023e2b363c1a4a000e0e0e0c000303051a4f00022b2b35293c1a3e000e0e0e0c00036403051a3e0002162b363c1a22000e0e0e0c000303051a2f0002031a2e00420e000000006c00000000000000|@5347,I234,@2016,I251,@5348,@2016,@5355,@2016,@5346| 5346:O5|0,0,0,@5350,@5359 5347:S11|7072696e742d7669736974 5348:O5|0,0,0,@5350,@5349 5349:O2|@5353,0 5350:O2|@5351,0 5351:O2|0,@5352 5352:O5|@865,197,197,0,0 5353:O2|3,@5354 5354:S9|556e56697369746564 5355:O5|0,0,0,@5350,@5356 5356:O2|@5357,0 5357:O2|3,@5358 5358:S14|5669736974656447656e6572616c 5359:O2|@5360,0 5360:O2|3,@5361 5361:S14|566973697465645370656369616c 5362:O2|@5364,@5363 5363:O2|@5366,@5362 5364:D6,220|00812c353b1ad8000e0c000303722c362d372a383b2a291aca000e0e0e0c00021ac5000e0e0c0002031729362b3c1abb000c0003292b25042504511e253b6502012a65292c1aa8000e0c000329291a93000c00021a91000e0e0c0002031d29352a362a352b36220c56b70e0e0e0c000450292503511e283b6502013b2706024d2c353d1a5a000e0e0e0c0003033e2c362d372a2a1a59000e0e0c000329291a43000c00021a41000e0e0c0002031929352a362a352b363356970c000450292503511e243b6502013b270402013b430e0e00000000d400000000000000|@5365,I251,I105,I218,I106,@2047| 5365:S32|434f44455452454528292e67656e436f646528332966696e6444656373283129 5366:D10,404|00822d353b1a90010e0c000303033b0fd82d3629353d1a7f010c000303043b5002041a7701103b502936293b1a71010e0e0c000303033c02142d3b1a66010e0e0e0c00032a2a1a5f010c00036403041a5a01103b503b50293c1a54010e0c00032e2a1a3f010c0003293c1a2b010c0003036030353c1a20010e0c000303033b024f2b3b1a1a010e0e0e0c000303033c02142f3b1a0e010e0e0e0c00032c2a1a07010c00036403041a0a01103b503b502b3c1afc000e0c0003302a3d1afa000e0e0e0c00045031315677320e0e7e0a000302ae293d1ac1000e0e0c000303033b029f30353c1ab100020297000e0e0c000303422b3b1aa9000e0e0c000303033c02142f3b1a9e000e0e0e0c00032c2a1a97000c00036403041a9a00103b503b502b3c1a8c000e0c0003302a3c1a8a00337b050a00042b3b1a67000c000303033c02142f3b1a5e000e0e0e0c00032c2a1a57000c00036403041a5a00103b503b502b3c1a4c000e0c0003302a3d1a4a000e0e0e0c00045031315677320e0e7e0a00032704440e0e0e0e0e000000008c01000000000000|@5368,I251,@5367,I234,I253,I231,@1850,I106,@1879,I255| 5367:O4|@35,@863,@5370,@5369 5368:S41|434f44455452454528292e67656e436f646528332970726f6365737347656e416e6453706563283229 5369:O5|@865,242,0,242,0 5370:S36|646f47656e6572616c3a206e6f74204c6f61644c6f63616c206f7220436f6e7374616e74 5371:O1|@5372 5372:D16,612|00822d353b1a60020e0c000303a72d372e381a57022b692a2a1a54020e0c0003280e2a3b6a2d1a4b020c00021a49020e0e0c000203033c0210311a3f020c00022e2a1a3b020c00036403041a3602103b503b50312e1a30020e0c0003293b1a07020c0003641a10020e0c000203422d3b1a19020e0e0c000303033c0214303b1a06020e0e0e0c00032e2a1a03020c00036403041afe01103b503b502d3c1af8010e0c0003312a2c1af201347b050b00043b27050fcd2d353d1aad010e0e0c000303033b0fcb2d353e1a9d010e0e0c000303db2d3629291a9b010c00021a99010e0e0c000203c329352a362a36293b1a9b010c000303041aa701103b503b503d2a693f2a692b1a6c010e0c00021a69010e0e0c000203033c0210331a5f010c00022c2a1a5b010c00036403041a5601103b503b50332c1a50010e0c0003293b1a27010c0003641a30010e0c0002034d2b3b1a39010e0e0c000303033c0214323b1a26010e0e0e0c00032c2a1a23010c00036403041a1e01103b503b502b3c1a18010202d2000e0c0003332a2c1a0e010202c4000e0e0e0c00045102023b502c250626051ecd3b270502013b6502a92d37293b1ad8000e0c000303041ae300103b503b503d2a693f2a692b1aa8000e0c00021aa5000e0e0c000203033c02102f1a9b000c00022c2a1a97000c00036403041a9200103b503b502f2c1a8c000e0c0003293b1a63000c0003641a6c000e0c000203422b3b1a75000e0e0c000303033c02142e3b1a62000e0e0e0c00032c2a1a5f000c00036403041a5a00103b503b502b3c1a54000e0c00032f2a2c1a4e00327b050900043b66440e000000005c02000000000000|@5374,I251,@5373,@2047,I105,I218,I15,I247,@866,I253,I234,I231,@1879,I106,I255,@3695| 5373:D3,52|008056073b1a30000e0c000303041a2b00103b503d5617693f2a6928062a2f3b6b65420e0e0e0e0e000000002c00000000000000|@3895,I234,@3695| 5374:S31|434f44455452454528292e67656e436f646528332961646444656373283129 5375:O1|@5379 5376:O4|@35,@863,@5378,@5377 5377:O5|@865,282,0,282,0 5378:S31|526573756c7420766563746f72206973206e6f7420616e2061646472657373 5379:D4,108|00812c3b1a69000e0e0c0003031d2b353c1a5c000e0c000303033b020c1a540028452d3b6b293b6964022d2c352d362a35291a3f001a38000e0c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000006400000000000000|@2413,I251,@34,@5375| 5380:O1|@5381 5381:D22,836|00802b363c1a40030e0c000303051a3b030fdc2b3529353b1a35030e0e0c00036407dd2b3529362d363c1a27030c00032a2a691a22033b1a22030e0e0e0c00032a2a0e0e0e0c00026429353b1a01030e0e0c000303932939291a04030e0c00021a01030e0e0c0002035f29361af1020e0e0c00021aed020e0e0c000203482935353e1acb020c000303312935362928281abd020e0e0c000303033c021b29287b1aad020e0e0c000303033c020b29285b1a9d020e0e0c00036402013b1aa5020e0e0c000202013b02013b03192a1a9802691a98022a691a97022a693b3e3c3b2d68056602012a64020129293b69020245021a80022a691a7f022a693b3c3b020208003b2d680527090fdd2b363c1a38020e0c000303051a63020fdd2b3529353c1a2d020e0e0c00036407dd2b3529362d363c1a1f020c00032a2a691a1a023b1a1a020e0e0e0c00032a2a0e0e0e0c00026429353b1af9010e0e0c000303972939291afc010e0c00021af9010e0e0c0002035f29361ae9010e0e0c00021ae5010e0e0c000203482935353e1ac3010c000303312935362928281ab5010e0e0c000303033c021b29287b1aa5010e0e0c000303033c020b29285b1a95010e0e0c00036402013b1a9d010e0e0c000202013b02013b031d2a1a9001691a90012a691a8f012a693b3e02024d013c3b2d68056602012a6402012902023c01293b691a80012a691a7f012a02020c00693b3c3b3b2d680527090fdd2b363c1a2c010e0c000303051a63010fdd2b3529353d1a21010e0e0c00036407dd2b3529362d363c1a13010c00032a2a691a0e013b1a0e010e0e0e0c00032a2a0e0e0e0c00026429353b1aed000e0e0c000303972939291af0000e0c00021aed000e0e0c0002035f29361add000e0e0c00021ad9000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1a91000e0e0c000202013b02013b031d2a1a8400691a84002a691a83002a693b3e020241003c3b2d68056602012a6402012902023000293b691a80002a691a7f002a02020c00693b3c3b3b2d6805270902142b363c1a20000e0c000303051a630002031a6200420e000000003c03000000000000|@5383,I234,@2016,I251,I107,@14,I253,I105,I218,@1087,@1088,@1060,@1058,@5384,@2016,@1058,@5391,@2016,@1058,@5398,@2016,@5382| 5382:O5|0,0,0,@5406,@5405 5383:S16|7072696e742d70324c6f6164466f726d 5384:O5|0,0,0,@5386,@5385 5385:O2|@5389,0 5386:O2|@5387,0 5387:O2|0,@5388 5388:O5|@4308,120,120,0,0 5389:O2|3,@5390 5390:S14|50324c6f6164417267756d656e74 5391:O5|0,0,0,@5393,@5392 5392:O2|@5396,0 5393:O2|@5394,0 5394:O2|0,@5395 5395:O5|@4308,121,121,0,0 5396:O2|3,@5397 5397:S13|50324c6f6164436c6f73757265 5398:O5|0,0,0,@5400,@5399 5399:O2|@5403,0 5400:O2|@5401,0 5401:O2|0,@5402 5402:O5|@4308,119,119,0,0 5403:O2|3,@5404 5404:S11|50324c6f61644c6f63616c 5405:O2|@5409,0 5406:O2|@5407,0 5407:O2|0,@5408 5408:O5|@4308,122,122,0,0 5409:O2|3,@5410 5410:S15|50324c6f6164526563757273697665 5411:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@2345| 5412:D11,244|00812b353c1af0000e0c000303472b36293c1ae7000c00033e2a69291ae1000e0e0c000203041adb00103b50293b691ad6002a691ad5002a693b3b3b3b2d6805291abc000e0c000203041ab700103b5029270702572b353b1a9d000e0e0c000303472b36293c1a93000c00033e2a69291a8d000e0e0c000203041a8700103b50293b691a8a002a691a89002a693b3b3b3b2d6805291a68000e0c000203041a6300103b5029270702031a6c003e2e69291a4d000e0e0c000203041a4700103b50293b691a56002a692c2a693b3b3b3b2d6805291a2a000e0e0e0c000203041a2300103b502927064300000000ec00000000000000|@5414,I251,@510,I105,@1784,@1058,@5415,@1058,@5417,@5413,@1058| 5413:O2|3,@5419 5414:S31|56414c55455f4f505328292e646973706c6179466978537461747573283129 5415:O2|3,@5416 5416:S6|696e66697872 5417:O2|3,@5418 5418:S5|696e666978 5419:S6|6e6f6e666978 5420:O1|@5421 5421:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@5420| 5422:O1|@5423 5423:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@5422,@3048| 5424:S3|736967 5425:O2|@1088,@5426 5426:O2|@5427,@2217 5427:O2|3,@5428 5428:S2|293a 5429:O1|@5430 5430:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@5429| 5431:D3,68|00802b56180c0002291a3c000e0c00021a39000e0e0c0002030b2935293b6929680165020b5617352d2a2e0e7d05000264420e0e0e0e0e0e000000003c00000000000000|@5432,I105,I218| 5432:S40|56414c55455f4f505328292e646973706c617946756e63746f7273283329617267456e762d283129 5433:D3,68|00802b56180c0002291a3c000e0c00021a39000e0e0c0002030b2935293b6929680165020b5617362d2a2e0e7d05000264420e0e0e0e0e0e000000003c00000000000000|@5432,I105,I218| 5434:D7,132|00802b56191a80000e0c000303033c024a2b1a77000c00021a75000e0e0c0002031456091a65000e0e0c00021a61000e0e0c000202013b03212b3b56293b3f56591a50000e0c00021a4d000e0e0c00031a49000e0e0c000602013b030a56073b6929680164020d5608362c2a2d0e0e0e7d040002420e0e0e000000007c00000000000000|@5432,I251,I105,I218,I223,I239,I154| 5435:O2|@1058,@5436 5436:O2|@1060,0 5437:O2|3,@5438 5438:S7|66756e63746f72 5439:O3|3,@5441,@5440 5440:O3|0,@5731,1 5441:O2|@5443,@5442 5442:O2|@1734,@5444 5443:O2|49,@1793 5444:O2|@5445,0 5445:O2|51,@5446 5446:O5|5,@5448,@5590,@5447,@690 5447:O3|@5590,@690,@5648 5448:O2|@5449,0 5449:O5|5,0,@5451,@5450,@690 5450:O3|@5451,@690,@5452 5451:S9|6e616d655370616365 5452:O3|@961,@5454,@5453 5453:O3|@5647,@717,@716 5454:O3|2,0,@5455 5455:O3|3,@5457,@5456 5456:O3|0,@5629,1 5457:O2|@5459,@5458 5458:O2|@5480,@5479 5459:O2|@5461,@5460 5460:O3|2,@1461,@5462 5461:S6|616c6c466978 5462:O5|5,@5463,@1249,@1247,@690 5463:O2|@5464,0 5464:O3|3,@5465,@695 5465:O2|@5467,@5466 5466:O2|@5468,0 5467:O2|49,@767 5468:O2|50,@5469 5469:O5|5,0,@5471,@5470,@690 5470:O3|@5471,@690,@5472 5471:S6|666978697479 5472:O3|@5474,@5477,@5473 5473:O3|@5478,@717,@716 5474:O2|1,@5475 5475:O3|2,@5476,0 5476:O4|0,@114,3,1 5477:O4|1,@115,0,0 5478:S31|506f6c794d4c2e4e616d6553706163652e496e66697865732e666978697479 5479:O2|@5500,@5499 5480:O2|@5482,@5481 5481:O3|2,@1461,@5483 5482:S6|616c6c536967 5483:O5|5,@5484,@1249,@1247,@690 5484:O2|@5485,0 5485:O3|3,@5486,@695 5486:O2|@5467,@5487 5487:O2|@5488,0 5488:O2|50,@5489 5489:O5|5,0,@5491,@5490,@690 5490:O3|@5491,@690,@5492 5491:S12|7369676e617475726556616c 5492:O3|@5494,@5497,@5493 5493:O3|@5498,@717,@716 5494:O2|1,@5495 5495:O3|2,@5496,0 5496:O4|0,@116,3,1 5497:O4|1,@117,0,0 5498:S40|506f6c794d4c2e4e616d6553706163652e5369676e6174757265732e7369676e617475726556616c 5499:O2|@5520,@5519 5500:O2|@5502,@5501 5501:O3|2,@1461,@5503 5502:S6|616c6c56616c 5503:O5|5,@5504,@1249,@1247,@690 5504:O2|@5505,0 5505:O3|3,@5506,@695 5506:O2|@5467,@5507 5507:O2|@5508,0 5508:O2|50,@5509 5509:O5|5,0,@5511,@5510,@690 5510:O3|@5511,@690,@5512 5511:S5|76616c7565 5512:O3|@5514,@5517,@5513 5513:O3|@5518,@717,@716 5514:O2|1,@5515 5515:O3|2,@5516,0 5516:O4|0,@118,3,1 5517:O4|1,@119,0,0 5518:S29|506f6c794d4c2e4e616d6553706163652e56616c7565732e76616c7565 5519:O2|@5540,@5539 5520:O2|@5522,@5521 5521:O3|2,@1461,@5523 5522:S7|616c6c54797065 5523:O5|5,@5524,@1249,@1247,@690 5524:O2|@5525,0 5525:O3|3,@5526,@695 5526:O2|@5467,@5527 5527:O2|@5528,0 5528:O2|50,@5529 5529:O5|5,0,@5531,@5530,@690 5530:O3|@5531,@690,@5532 5531:S10|74797065436f6e737472 5532:O3|@5534,@5537,@5533 5533:O3|@5538,@717,@716 5534:O2|1,@5535 5535:O3|2,@5536,0 5536:O4|0,@120,3,1 5537:O4|1,@121,0,0 5538:S39|506f6c794d4c2e4e616d6553706163652e54797065436f6e737472732e74797065436f6e737472 5539:O2|@5550,@5549 5540:O2|@5542,@5541 5541:O3|2,@1461,@5543 5542:S8|616c6c46756e6374 5543:O5|5,@5544,@1249,@1247,@690 5544:O2|@5545,0 5545:O3|3,@5546,@695 5546:O2|@5467,@5547 5547:O2|@5548,0 5548:O2|50,@1793 5549:O2|@5554,@5553 5550:O2|@5552,@5551 5551:O3|2,@5464,@1461 5552:S8|656e746572466978 5553:O2|@5558,@5557 5554:O2|@5556,@5555 5555:O3|2,@5485,@1461 5556:S8|656e746572536967 5557:O2|@5562,@5561 5558:O2|@5560,@5559 5559:O3|2,@5505,@1461 5560:S8|656e74657256616c 5561:O2|@5582,@5581 5562:O2|@5564,@5563 5563:O3|2,@1461,@5565 5564:S9|616c6c537472756374 5565:O5|5,@5566,@1249,@1247,@690 5566:O2|@5567,0 5567:O3|3,@5568,@695 5568:O2|@5467,@5569 5569:O2|@5570,0 5570:O2|50,@5571 5571:O5|5,0,@5573,@5572,@690 5572:O3|@5573,@690,@5574 5573:S12|73747275637475726556616c 5574:O3|@5576,@5579,@5575 5575:O3|@5580,@717,@716 5576:O2|1,@5577 5577:O3|2,@5578,0 5578:O4|0,@122,3,1 5579:O4|1,@123,0,0 5580:S40|506f6c794d4c2e4e616d6553706163652e537472756374757265732e73747275637475726556616c 5581:O2|@5586,@5585 5582:O2|@5584,@5583 5583:O3|2,@5525,@1461 5584:S9|656e74657254797065 5585:O2|@5593,@5592 5586:O2|@5588,@5587 5587:O3|2,@767,@5589 5588:S9|6c6f6f6b7570466978 5589:O5|5,@5591,@5590,@5447,@690 5590:S6|6f7074696f6e 5591:O2|@5469,0 5592:O2|@5599,@5598 5593:O2|@5595,@5594 5594:O3|2,@767,@5596 5595:S9|6c6f6f6b7570536967 5596:O5|5,@5597,@5590,@5447,@690 5597:O2|@5489,0 5598:O2|@5605,@5604 5599:O2|@5601,@5600 5600:O3|2,@767,@5602 5601:S9|6c6f6f6b757056616c 5602:O5|5,@5603,@5590,@5447,@690 5603:O2|@5509,0 5604:O2|@5609,@5608 5605:O2|@5607,@5606 5606:O3|2,@5545,@1461 5607:S10|656e74657246756e6374 5608:O2|@5615,@5614 5609:O2|@5611,@5610 5610:O3|2,@767,@5612 5611:S10|6c6f6f6b757054797065 5612:O5|5,@5613,@5590,@5447,@690 5613:O2|@5529,0 5614:O2|@5619,@5618 5615:O2|@5617,@5616 5616:O3|2,@5567,@1461 5617:S11|656e746572537472756374 5618:O2|@5624,0 5619:O2|@5621,@5620 5620:O3|2,@767,@5622 5621:S11|6c6f6f6b757046756e6374 5622:O5|5,@5623,@5590,@5447,@690 5623:O2|@1793,0 5624:O2|@5626,@5625 5625:O3|2,@767,@5627 5626:S12|6c6f6f6b7570537472756374 5627:O5|5,@5628,@5590,@5447,@690 5628:O2|@5571,0 5629:O2|@5461,@5630 5630:O2|@5482,@5631 5631:O2|@5502,@5632 5632:O2|@5522,@5633 5633:O2|@5542,@5634 5634:O2|@5552,@5635 5635:O2|@5556,@5636 5636:O2|@5560,@5637 5637:O2|@5564,@5638 5638:O2|@5584,@5639 5639:O2|@5588,@5640 5640:O2|@5595,@5641 5641:O2|@5601,@5642 5642:O2|@5607,@5643 5643:O2|@5611,@5644 5644:O2|@5617,@5645 5645:O2|@5621,@5646 5646:O2|@5626,0 5647:S26|506f6c794d4c2e4e616d6553706163652e6e616d655370616365 5648:O3|@5650,@5730,@5649 5649:O3|@5590,@717,@716 5650:O2|1,@5651 5651:O3|2,@5653,@5652 5652:O2|@5678,0 5653:O4|@5655,@124,@5673,@5654 5654:O1|@5676 5655:O1|@5656 5656:D2,20|00801a13002c6942000000000c00000000000000|@5658,@5657| 5657:D4,92|00812c2c1a59000e0e0c000303033c02372c1a4f000c00021a4d000e0e0c000203252b1a3e000e0e0e0c00021a39000e0e0c0002030e5607352d352d352b2e0e7e0500033b02013b430e0e0e0e0e0e0e000000005400000000000000|@5659,I251,I105,I218| 5658:S15|65712d6f7074696f6e283229285029 5659:S12|65712d6f7074696f6e283229 5660:O1|@5661 5661:D2,20|00801a13002c6942000000000c00000000000000|@5663,@5662| 5662:D14,292|00802b363c1a20010e0c000303051a1b010fde2b35293b1a16010e0e0e0c00036403051a0e010fdd2b363c1afa000e0e0e0c000303051aff0002d75607362c3529352e363c1af4000e0c00032a2a69662a0c00026429353b1ad5000e0e0c000303952939291ad8000e0c00021ad5000e0e0c0002035f29361ac5000e0e0c00021ac1000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1a79000e0e0c000202013b02013b031b2a1a6c00691a6c002a691a6b002a693b3e3c3b2d68056602031f002a64020129293b691a56002a691a550002020b002a693b3c3b3b2d68052705420e0e0e0e0e000000001c01000000000000|@5665,I234,@1041,I251,@5666,@1041,I107,I105,I218,@1087,@1088,@1060,@1058,@5664| 5663:S13|7072696e746f7074696f6e2829 5664:O5|0,0,0,@690,@5670 5665:S12|7072696e742d6f7074696f6e 5666:O5|0,0,0,@690,@5667 5667:O2|@5668,0 5668:O2|3,@5669 5669:S4|4e4f4e45 5670:O2|@5671,0 5671:O2|3,@5672 5672:S4|534f4d45 5673:O1|@5674 5674:D1,20|00803e420e0e0e0e000000000c00000000000000|@5675| 5675:S12|626f7865642d6f7074696f6e 5676:D1,20|00803c420e0e0e0e000000000c00000000000000|@5677| 5677:S11|73697a652d6f7074696f6e 5678:O4|@34,69,@5679,0 5679:O3|2,4,@5680 5680:O6|@874,@850,@5682,@1363,@5681,@848 5681:O12|@5720,@5722,@5721,@5724,@5726,@5728,@5719,@5655,@124,@5673,@5654,@5653 5682:O2|@894,@5683 5683:O2|@5685,@5684 5684:O2|@1352,@5711 5685:O2|@1276,@5686 5686:O3|0,@5687,@876 5687:O8|@5689,@5658,0,0,@5688,0,0,1 5688:O2|@5703,0 5689:O2|7,@5690 5690:O8|@5692,@5659,0,@1343,@5691,0,0,1 5691:O2|@841,@5702 5692:O4|1,@801,@742,@5693 5693:O4|1,@812,@5694,@809 5694:O4|1,@811,@5695,@809 5695:O4|3,@5696,@1322,1 5696:O2|@5698,@5697 5697:O2|@5700,0 5698:O2|@5699,1 5699:O4|6,@739,0,1 5700:O2|@5701,1 5701:O4|6,@807,0,1 5702:O2|@841,0 5703:O2|1,@5704 5704:O2|@5705,0 5705:O3|2,0,@5706 5706:O2|@5707,0 5707:O3|0,@5709,@5708 5708:O2|@5699,@5710 5709:O2|@844,@922 5710:O2|@5701,0 5711:O2|@5713,@5712 5712:O2|@5716,0 5713:O2|@988,@5714 5714:O3|0,@5715,@876 5715:O8|@1358,@5675,0,0,@737,0,0,1 5716:O2|@1361,@5717 5717:O3|0,@5718,@876 5718:O8|@742,@5677,0,0,@737,0,0,1 5719:O3|@5724,@5726,@5728 5720:O3|@5653,@5721,@5719 5721:O2|@5722,0 5722:O1|@5723 5723:D2,28|00802b3b1a19002d7e0300030e0e0e0e000000001400000000000000|@5669,I251| 5724:O1|@5725 5725:D3,36|00802b1a22000e0e0e0c00021a1d002c0e8000020e0e0e0e000000001c00000000000000|@5672,I105,I218| 5726:O1|@5727 5727:D1,20|00802b6801420e0e000000000c00000000000000|@5672| 5728:O1|@5729 5729:D1,20|00802b35420e0e0e000000000c00000000000000|@5672| 5730:O4|1,@125,1,0 5731:O2|49,@5732 5732:O2|50,@5733 5733:O2|51,0 5734:O2|@1795,@5735 5735:O2|@5736,0 5736:O4|@27,69,@5737,0 5737:O2|@1794,0 5738:O2|@5740,@5739 5739:O2|@5741,0 5740:S4|6e616d65 5741:O4|@23,69,@5742,0 5742:O7|@5740,2,@5744,@5743,@690,0,0 5743:O3|2,@1793,@767 5744:O2|1,@5745 5745:O3|2,@5746,0 5746:O1|@5747 5747:D1,20|00802b36420e0e0e000000000c00000000000000|@5748| 5748:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7246756e63746f72283129 5749:O2|@5751,0 5750:S4|636f6465 5751:O4|@23,69,@5752,0 5752:O7|@5750,2,@5754,@5753,@690,0,0 5753:O3|2,@1793,@5763 5754:O2|1,@5755 5755:O3|2,@5756,0 5756:O1|@5757 5757:D3,44|00802b3729353c1a26000e0e0e0c000303043b5002041a1b0010293664420e0e000000002400000000000000|@5759,I251,@5758| 5758:O4|103,@407,@5761,@5760 5759:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7246756e6374283129 5760:O5|@5762,1385,0,1385,0 5761:S20|4e6f74206120676c6f62616c2066756e63746f72 5762:S34|6d6c736f757263652f4d4c436f6d70696c65722f494e495449414c4953455f2e4d4c 5763:O5|5,0,@5765,@5764,@690 5764:O3|@5765,@690,@5766 5765:S8|636f646574726565 5766:O3|@5768,@5771,@5767 5767:O3|@5772,@717,@716 5768:O2|1,@5769 5769:O3|2,@5770,0 5770:O4|0,@126,3,1 5771:O4|1,@127,0,0 5772:S24|506f6c794d4c2e436f6465547265652e636f646574726565 5773:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 5774:O4|11,@316,0,@5776 5775:S35|5354525543545f56414c5328292e6d616b65456d707479476c6f62616c283129283129 5776:O5|@2042,533,0,533,0 5777:O2|@5451,@5778 5778:O2|@5779,0 5779:O4|@27,69,@5780,0 5780:O2|@5450,0 5781:O2|@5783,@5782 5782:O2|@5784,0 5783:S11|54797065436f6e73747273 5784:O4|@38,69,@5785,0 5785:O4|@5783,@961,@5786,@690 5786:O6|@5788,I48,0,@690,@5787,0 5787:O1|@5835 5788:O4|1,@129,@130,@128 5789:O1|@5790 5790:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 5791:O2|@5740,@5826 5792:O2|@1805,@5793 5793:O2|@5794,0 5794:O4|@23,69,@5795,0 5795:O7|@1805,2,@5797,@5796,@690,0,0 5796:O3|2,@5809,@970 5797:O2|1,@5798 5798:O3|2,@5799,0 5799:O1|@5800 5800:D7,76|00802b352c362d37291a44000e0c00021a41000e0e0c0002031229351a39002a691a38002b692a2a696602031a31002c2c2b3b1a2e00337b060700050e0e0e0e000000004400000000000000|@5802,I105,I218,@5803,@5804,@5801,@2003| 5801:O2|@5806,@5805 5802:S58|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065436f6e737472283129 5803:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5804:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5805:O1|@5808 5806:O1|@5807 5807:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5808:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5809:O3|3,@5810,@5440 5810:O2|@5811,@5442 5811:O2|49,@5529 5812:O2|@5531,@5813 5813:O2|@5814,0 5814:O4|@27,69,@5815,0 5815:O2|@5530,0 5816:O2|@1773,@5817 5817:O2|@5818,0 5818:O4|@23,69,@5819,0 5819:O7|@1773,2,@5821,@5820,@690,0,0 5820:O3|2,@5529,@1479 5821:O2|1,@5822 5822:O3|2,@5823,0 5823:O1|@5824 5824:D2,28|00802b352936291a16002e0e7d050002000000001400000000000000|@5825,@1781| 5825:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7254797065436f6e737472283129 5826:O2|@5827,0 5827:O4|@23,69,@5828,0 5828:O7|@5740,2,@5830,@5829,@690,0,0 5829:O3|2,@5529,@767 5830:O2|1,@5831 5831:O3|2,@5832,0 5832:O1|@5833 5833:D1,20|00802b3529356442000000000c00000000000000|@5834| 5834:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7254797065283129 5835:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 5836:O2|@5838,@5837 5837:O2|@5839,0 5838:S6|56616c756573 5839:O4|@38,69,@5840,0 5840:O4|@5838,@961,@5841,@690 5841:O6|@5843,I48,0,@690,@5842,0 5842:O1|@5972 5843:O4|1,@133,@134,@132 5844:O2|@673,20 5845:O2|@5963,@5962 5846:O2|@1805,@5847 5847:O2|@5848,0 5848:O4|@23,69,@5849,0 5849:O7|@1805,2,@5851,@5850,@690,0,0 5850:O3|2,@5856,@970 5851:O2|1,@5852 5852:O3|2,@5853,0 5853:O1|@5854 5854:D5,116|00802b352c362a362b372c382b3d1a67000c0003030c2a353c1a5c000e0c000302013b03372a3629353d1a4b000c0003030829362968016402013b293b1a38000e0c000303041a3300103b502935292d311a2c00220d0e7b050b00041a25002705420e0e0e0e0e0e000000006c00000000000000|@5855,I251,@2309,@2358,@2006| 5855:S26|56414c55455f4f505328292e7072696e7456616c756573283129 5856:O3|3,@5857,@695 5857:O2|@5858,@1732 5858:O2|49,@5509 5859:O2|@5511,@5860 5860:O2|@5861,0 5861:O4|@27,69,@5862,0 5862:O2|@5510,0 5863:O2|@5865,@5864 5864:O2|@5866,0 5865:S13|7072696e745769746854797065 5866:O4|@23,69,@5867,0 5867:O7|@5865,2,@5869,@5868,@690,0,0 5868:O3|2,@5881,@970 5869:O2|1,@5870 5870:O3|2,@5871,0 5871:O1|@5872 5872:D7,76|00802b352c362d37291a44000e0c00021a41000e0e0c0002031229351a39002a691a38002b692a2a696602031a31002c2c2b3b1a2e00337b060700050e0e0e0e000000004400000000000000|@5874,I105,I218,@5875,@5876,@5873,@2343| 5873:O2|@5878,@5877 5874:S54|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617956616c756573283129 5875:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5876:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5877:O1|@5880 5878:O1|@5879 5879:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5880:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5881:O3|3,@5882,@5440 5882:O2|@5858,@5442 5883:O2|@5740,@5884 5884:O2|@5885,0 5885:O4|@23,69,@5886,0 5886:O7|@5740,2,@5888,@5887,@690,0,0 5887:O3|2,@5509,@767 5888:O2|1,@5889 5889:O3|2,@5890,0 5890:O1|@5891 5891:D1,20|00802b35420e0e0e000000000c00000000000000|@5892| 5892:S24|5354525543545f56414c5328292e76616c4e616d65283129 5893:O2|@1773,@5894 5894:O2|@5895,0 5895:O4|@23,69,@5896,0 5896:O7|@1773,2,@5898,@5897,@690,0,0 5897:O3|2,@5509,@1479 5898:O2|1,@5899 5899:O3|2,@5900,0 5900:O1|@5901 5901:D4,60|00802b382c39280d2b69291a32000e0e0e0c000203041a2b00103b502a1a28000e0c00022a2a692704420e0e0e0e0e0e000000003400000000000000|@5902,I105,@1784,@1781| 5902:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7256616c7565283129 5903:O2|@1670,@5904 5904:O2|@5905,0 5905:O4|@27,69,@5906,0 5906:O2|@1669,0 5907:O2|@5909,@5908 5908:O2|@5910,0 5909:S9|7072696e7454797065 5910:O4|@23,69,@5911,0 5911:O7|@5909,2,@5913,@5912,@690,0,0 5912:O3|2,@5925,@970 5913:O2|1,@5914 5914:O3|2,@5915,0 5915:O1|@5916 5916:D8,84|00802b352c362d37291a4c000e0c00021a49000e0e0c0002031229351a41002a691a40002b692a2a696602031a39003b1a39000e0e0c00022d2d2b2d3b1a3000220c0e7b07080006000000004c00000000000000|@5918,I105,I218,@5919,@5920,@5917,@2008,@2104| 5917:O2|@5922,@5921 5918:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065457870283129 5919:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5920:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5921:O1|@5924 5922:O1|@5923 5923:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5924:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 5925:O3|3,@5926,@5440 5926:O2|@5927,@5442 5927:O2|49,@1668 5928:O2|@5930,@5929 5929:O2|@5931,0 5930:S13|6973436f6e7374727563746f72 5931:O4|@23,69,@5932,0 5932:O7|@5930,2,@5934,@5933,@690,0,0 5933:O3|2,@5509,@693 5934:O2|1,@5935 5935:O3|2,@5936,0 5936:O1|@5937 5937:D4,52|00802b36291a30000e0c00021a2d000e0e0c000203033c020b3b2a1a22002e0e7e04000364420e0e000000002c00000000000000|@5938,I105,I218,I251| 5938:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973436f6e7374727563746f72283129 5939:O2|@5941,@5940 5940:O2|@5942,0 5941:S11|6973457863657074696f6e 5942:O4|@23,69,@5943,0 5943:O7|@5941,2,@5944,@5933,@690,0,0 5944:O2|1,@5945 5945:O3|2,@5946,0 5946:O1|@5947 5947:D2,28|00802b363b2a1a17002e0e0e7e040003000000001400000000000000|@5948,I251| 5948:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973457863657074696f6e283129 5949:O2|@5750,@5950 5950:O2|@5951,0 5951:O4|@23,69,@5952,0 5952:O7|@5750,2,@5954,@5953,@690,0,0 5953:O3|2,@5509,@5763 5954:O2|1,@5955 5955:O3|2,@5956,0 5956:O1|@5957 5957:D3,68|00802b36293d1a3f000c000303112c3729353c1a32000e0e0e0c00036402013b6403043b5002041a2200102b37293664420e0e0e0e0e0e0e000000003c00000000000000|@5959,I251,@5958| 5958:O4|103,@407,@5961,@5960 5959:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7256616c7565283129 5960:O5|@5762,1283,0,1283,0 5961:S18|4e6f74206120676c6f62616c2076616c7565 5962:O2|@5964,0 5963:S6|747970656f66 5964:O4|@23,69,@5965,0 5965:O7|@5963,2,@5967,@5966,@690,0,0 5966:O3|2,@5509,@1668 5967:O2|1,@5968 5968:O3|2,@5969,0 5969:O1|@5970 5970:D1,20|00802b38420e0e0e000000000c00000000000000|@5971| 5971:S26|5354525543545f56414c5328292e76616c547970654f66283129 5972:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 5973:O2|@5975,@5974 5974:O2|@5976,0 5975:S10|53747275637475726573 5976:O4|@38,69,@5977,0 5977:O4|@5975,@961,@5978,@690 5978:O6|@5980,I48,0,@690,@5979,0 5979:O1|@6043 5980:O4|1,@137,@138,@136 5981:O1|@5982 5982:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 5983:O2|@5750,@6031 5984:O2|@1805,@5985 5985:O2|@5986,0 5986:O4|@23,69,@5987,0 5987:O7|@1805,2,@5989,@5988,@690,0,0 5988:O3|2,@6004,@970 5989:O2|1,@5990 5990:O3|2,@5991,0 5991:O1|@5992 5992:D2,36|00802b352c362d371a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@5994,@5993| 5993:O1|@5995 5994:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283129 5995:D19,436|00822b1ab2010e0e0e0c00021aad010e0e0c000203122b351aa5012a691aa4012b692a2a696602031a9d012e352f373038303b1a96010e0e0e0c000303051a8f010fd929291a70010e0c00021a6d010e0e0c0002031f29352a362a353b1a74010e0c000303052a68010207292503511e2b3b6502013b64291a3d010e0e0c00021a39010e0e0c00020311293529353b1a42010e0e0e0c00036402013b031c293529363b2a69291a0f010c000203041a2701103b50293b696602013b3e2e69291af6000e0e0e0c000203041a0f01103b50293b693b3b3b2e2d6805291ada000e0e0e0c000203041af300103b50291af000691af0002a691aef002a693b3b3b3b2d6805291ab2000e0e0e0c000203041acb00103b5022103c1ad200020285000e0e0e0c00033436291ac6001aa7000c000303033c0222291a7f000c00021a7d000e0e0c00020310293b1aa5003b3f1aa4000e0c000602013b0311220c2b3c22113b1a95000e0e0c000602143e2a69291a47000c000203041a6300103b502964293b691a78002a692e2a693b3b3b3b2d6805291a24000e0c000203041a3f00103b502927102704440e0e00000000ac01000000000000|@5997,I105,I218,@5998,@5999,@5996,I232,@1041,I251,@1784,@1784,@1826,@1058,@2001,I107,I48,I154,@1831,@1830| 5996:O2|@6001,@6000 5997:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283329 5998:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 5999:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 6000:O1|@6003 6001:O1|@6002 6002:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 6003:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 6004:O3|3,@6005,@5440 6005:O2|@6006,@5442 6006:O2|49,@5571 6007:O2|@1773,@6008 6008:O2|@6009,0 6009:O4|@23,69,@6010,0 6010:O7|@1773,2,@6012,@6011,@690,0,0 6011:O3|2,@5571,@1479 6012:O2|1,@6013 6013:O3|2,@6014,0 6014:O1|@6015 6015:D2,28|00802b38291a18002d0e0e0e7d040002000000001400000000000000|@6016,@1781| 6016:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72537472756374283129 6017:O2|@5740,@6018 6018:O2|@6019,0 6019:O4|@23,69,@6020,0 6020:O7|@5740,2,@6022,@6021,@690,0,0 6021:O3|2,@5571,@767 6022:O2|1,@6023 6023:O3|2,@6024,0 6024:O1|@6025 6025:D1,20|00802b35420e0e0e000000000c00000000000000|@6026| 6026:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72537472756374283129 6027:O2|@5573,@6028 6028:O2|@6029,0 6029:O4|@27,69,@6030,0 6030:O2|@5572,0 6031:O2|@6032,0 6032:O4|@23,69,@6033,0 6033:O7|@5750,2,@6035,@6034,@690,0,0 6034:O3|2,@5571,@5763 6035:O2|1,@6036 6036:O3|2,@6037,0 6037:O1|@6038 6038:D3,44|00802b3629353c1a26000e0e0e0c000303043b5002041a1b0010293664420e0e000000002400000000000000|@6040,I251,@6039| 6039:O4|103,@407,@6042,@6041 6040:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f72537472756374283129 6041:O5|@5762,1341,0,1341,0 6042:S22|4e6f74206120676c6f62616c20737472756374757265 6043:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 6044:O2|@6046,@6045 6045:O2|@6047,0 6046:S7|496e6669786573 6047:O4|@38,69,@6048,0 6048:O4|@6046,@961,@6049,@690 6049:O6|@6051,I48,0,@690,@6050,0 6050:O1|@6077 6051:O4|1,@141,@142,@140 6052:O1|@6053 6053:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 6054:O2|@5471,@6074 6055:O2|@1805,@6056 6056:O2|@6057,0 6057:O4|@23,69,@6058,0 6058:O7|@1805,2,@6060,@6059,@690,0,0 6059:O3|2,@5469,@970 6060:O2|1,@6061 6061:O3|2,@6062,0 6062:O1|@6063 6063:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@5414,@1994| 6064:O2|@5740,@6065 6065:O2|@6066,0 6066:O4|@23,69,@6067,0 6067:O7|@5740,2,@6069,@6068,@690,0,0 6068:O3|2,@5469,@767 6069:O2|1,@6070 6070:O3|2,@6071,0 6071:O1|@6072 6072:D1,20|00802b35420e0e0e000000000c00000000000000|@6073| 6073:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72466978283129 6074:O2|@6075,0 6075:O4|@27,69,@6076,0 6076:O2|@5470,0 6077:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 6078:O2|@6080,0 6079:S10|5369676e617475726573 6080:O4|@38,69,@6081,0 6081:O4|@6079,@961,@6082,@690 6082:O6|@6084,I48,0,@690,@6083,0 6083:O1|@6134 6084:O4|1,@145,@146,@144 6085:O1|@6086 6086:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 6087:O2|@5491,@6131 6088:O2|@1805,@6089 6089:O2|@6090,0 6090:O4|@23,69,@6091,0 6091:O7|@1805,2,@6093,@6092,@690,0,0 6092:O3|2,@6108,@970 6093:O2|1,@6094 6094:O3|2,@6095,0 6095:O1|@6096 6096:D2,36|00802b352c362d371a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@6098,@6097| 6097:O1|@6099 6098:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283129 6099:D16,348|00822b1a5a010e0e0e0c00021a55010e0e0c000203122b351a4d012a691a4c012b692a2a696602031a45012e362f382f3b1a40010e0c000303051a3b010fdb29291a1c010e0c00021a19010e0e0c0002031f29352a362a353b1a20010e0c000303052a68010207292503511e2b3b6502013b64291ae9000e0e0c00021ae5000e0e0c00020311293529353b1aee000e0e0e0c00036402013b031c293529363b2a69291abb000c000203041ad300103b50293b696602013b3e2d69291aa2000e0e0e0c000203041abb00103b50293b693b3b3b2e2d6805291a86000e0e0e0c000203041a9f00103b50291a9c00691a9c002a691a9b002a693b3b3b3b2d6805291a5e000e0e0e0c000203041a7700103b50221022103c220e3b02022f001a75000e0e0c0006293b691a6e002a692c2a693b3b3b3b2d6805291a26000e0e0e0c000203041a3f00103b5029270e66440e0e0e000000005401000000000000|@6101,I105,I218,@6102,@6103,@6100,I232,@1041,I251,@1784,@1784,@1996,@1058,@1999,@1831,@1830| 6100:O2|@6105,@6104 6101:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283329 6102:D3,60|00805607230e2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 6103:D3,60|0080560723112c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@1816,I105,I218| 6104:O1|@6107 6105:O1|@6106 6106:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 6107:D1,20|00803b420e0e0e0e000000000c00000000000000|@1816| 6108:O3|3,@6109,@5440 6109:O2|@6110,@5442 6110:O2|49,@5489 6111:O2|@1773,@6112 6112:O2|@6113,0 6113:O4|@23,69,@6114,0 6114:O7|@1773,2,@6116,@6115,@690,0,0 6115:O3|2,@5489,@1479 6116:O2|1,@6117 6117:O3|2,@6118,0 6118:O1|@6119 6119:D2,28|00802b38291a18002d0e0e0e7d040002000000001400000000000000|@6120,@1781| 6120:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72536967283129 6121:O2|@5740,@6122 6122:O2|@6123,0 6123:O4|@23,69,@6124,0 6124:O7|@5740,2,@6126,@6125,@690,0,0 6125:O3|2,@5489,@767 6126:O2|1,@6127 6127:O3|2,@6128,0 6128:O1|@6129 6129:D1,20|00802b36420e0e0e000000000c00000000000000|@6130| 6130:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72536967283129 6131:O2|@6132,0 6132:O4|@27,69,@6133,0 6133:O2|@5490,0 6134:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 6135:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 6136:O2|@6138,@6137 6137:O2|@6139,0 6138:S8|636f6d70696c6572 6139:O4|@23,69,@6140,0 6140:O7|@6138,2,@6142,@6141,@690,0,0 6141:O3|2,@11569,@11568 6142:O2|1,@6143 6143:O3|2,@6144,0 6144:O1|@6145 6145:D2,36|00802b352c362d371a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@6147,@6146| 6146:O1|@6148 6147:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283129 6148:D30,636|00822c2c1a79020e0e0c00032c291a73020c00021a71020e0e0c0002032429352a362a35291a64021a65020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a47020c0003036b1a4302291a2f020c00021a2d020e0e0c0002032429352a362a35291a20021a21020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a03020c000303041a0302103b503b50293529351aeb011aec010e0c000303043b5002041aeb01103b50293765021e293529351acc011acd010e0e0c000303043b5002041acb01103b502937642e291aa8010e0c00021aa5010e0e0c0002032429352a362a35291aac011a99010e0e0c00036403052a68010207292503511e303b6502013b64293b1a7b010c000303051a8701021c293529351a7a011a67010c000303043b5002041a6701103b502937647881502d03401a640130220d220c6b7881092b1a5b010c0002052800ff6d2935280d1a30010e0c000303043b50020229103b50293729352a362a2a1a37010c0003270464020b2f220c341a2c010e0c000409cd00ff6d29353c1af9000e0e0c0003030f1a17012b0e0e0e0c0002501a1001103b503b5029351a0a011ad7000c000303562937291a00011a01010e0e0c00031afd002a1afd000e0e0c0003291af8001af1000e0e0c000329401ae7000c00033e2a69291a91000e0e0c000203041adb00103b503b502964300c00025028671ace002c1ace006b103b503b50293c1ac7000c00031ac5002a1aa9000e0e0c0003291abc001a9d000e0e0c000329401a93000c00033e2a69291a3d000e0e0c000203041a8700103b503b5029642f02020f000c00025028671a76002c1a86006b102705440e000000007402000000000000|@6150,@6151,I105,I218,@101,I251,@2900,@2955,@1840,@108,@6161,@6163,I32,@11550,@6164,@11558,@11560,@35,@372,@397,@11563,@389,@11564,@1784,@407,@11565,I253,@11566,@11567,@6149| 6149:O5|@11562,238,0,238,0 6150:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283329 6151:O2|@6152,@148 6152:D15,1004|00812b291ae9030e0e0c00021ae5030e0e0c0002032429352a362a352956571ad6030e0e0e0c00036403052a68010207292503511e313b6502013b64293b1ab7030c000303051ab303021c2935293556371aa4030e0c000303043b5002041a9f03103b502937642d291a84030e0c00021a81030e0e0c0002032429352a362a35291a80031a71030e0e0c00036403052a68010207292503511e303b6502013b64293b1a53030c000303051a5b03021c293529351a4e031a3f030c000303043b5002041a3b03103b502937642f291a20030e0c00021a1d030e0e0c0002032429352a362a35291a24031a0d030e0e0c00036403052a68010207292503511e303b6502013b64293b1aef020c0003036b1aff02291adb020c00021ad9020e0e0c0002032429352a362a35291ae0021ac9020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aab020c000303041abf02103b503b50293529351aab021a94020e0c000303043b5002041a8f02103b50293765021e293529351a8c021a75020e0e0c000303043b5002041a6f02103b5029376431291a54020e0c00021a51020e0e0c0002032429352a362a35291a64021a41020e0e0c00036403052a68010207292503511e303b6502013b64293b1a23020c0003036b1a3302291a0f020c00021a0d020e0e0c0002032429352a362a35291a20021afd010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1adf010c000303041af301103b503b50293529351aeb011ac8010e0c000303043b5002041ac301103b50293765021e293529351acc011aa9010e0e0c000303043b5002041aa301103b502937643b2e0c00023b2d0e0e0e0c0002220c291a7a010e0e0e0c00021a75010e0e0c0002032429352a362a35291a8c011a65010e0e0c00036403052a68010207292503511e323b6502013b64293b1a47010c0003036b1a5701291a33010c00021a31010e0e0c0002032429352a362a35291a48011a21010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a03010c000303041a1701103b503b50293529351a13011aec000e0c000303043b5002041ae700103b50293765021e293529351af4001acd000e0e0c000303043b5002041ac700103b502937643c284028201ad9000e0e0c00043c284028301acc000e0c00043c28401ac6001abf000c00043c28403b1ab5000e0e0c00043c284028291aa8000e0c00043c28403b1a9d000e0e0c00043c2840341a91000e0e0c00043c2840220c1a84000e0c00043c2840220c1a78000e0c00043c2840220d1a6c000e0c000432313332221d30221422192218220e220d220f22202225220e2210221a68112716430e0e0e0e0e0e00000000e403000000000000|@6154,I105,I218,I251,@6153,@1840,@86,@2903,@87,@2900,@2955,@88,@89,I11,I48| 6153:O1|@6155 6154:S17|4c45585f28292e696e697469616c283229 6155:D2,20|00801a1300100e0e000000000c00000000000000|@6157,@6156| 6156:O4|103,@407,@6159,@6158 6157:S37|4c45585f28292e696e697469616c2832296572726f724d65737361676550726f632d283129 6158:O5|@6160,99,0,99,0 6159:S20|4572726f7220696e20736f7572636520636f6465 6160:S27|6d6c736f757263652f4d4c436f6d70696c65722f4c45585f2e4d4c 6161:O1|@6162 6162:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 6163:D2,36|00805607561856291a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@6165,@6164| 6164:O1|@6166 6165:S30|434f4d50494c45525f424f445928292e636f6d70696c6572283329283129 6166:D31,1012|00822b291af1030e0e0c00021aed030e0e0c0002032429352a362a35291ae0031ae1030e0e0c00036403052a68010207292503511e313b6502013b64293b1ac3030c000303051abf03021c293529351aae031aaf030c000303043b5002041aab03103b502937642d291a8c030e0c00021a89030e0e0c0002032429352a362a35291a8c031a7d030e0e0c00036403052a68010207292503511e303b6502013b64293b1a5f030c0003036b1a6703291a47030c00021a45030e0e0c0002032429352a362a35291a48031a39030e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1b030c000303041a2703103b503b50293529351a13031a04030e0c000303043b5002041aff02103b50293765021e293529351af4021ae5020e0e0c000303043b5002041adf02103b5029376430230a31230c32230e33230b342311220c2310220d3a220e2307220f23092210230f221123062212230d1abc022214692f2c30302210220e221131221232220d22122214680d221623062217230a2218230f2a3b1a96020e0e0e0c00032a3b1a8b020c0003221b37221c23092a3b1a7c020e0c00032a3b1a73020c00032928291a4e020e0e0e0c00031a3d020e0e0c000203032902012a2928301a34020e0c00032705030a221b1a47020c000202013b221a291a0f020c00021a0d020e0e0c0002032429352a362a35291a28021a01020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ae3010c000303051a0302021c293529351af6011acf010c000303043b5002041acb01103b50293764221e37221f23092a3b1acd010e0e0c00032a3b1ac3010c00032928291a9e010e0e0e0c00031a8d010e0e0c000203032902012a2928301a84010e0c000303033c020b293b1a76010e0e0e0c000327050342221e38293b1a80010e0c00036403051a8601022c221e3a221f230e2a3b1a68010e0c00032a3b1a5f010c0003342b332c346805293b69296801291a5f016927070fd00403003b2a1a56010e0e0e0c00035029362a371a4c0122192b6a2b2a691a460122242b1a44010e0c0004221c033a29351a3b012a1a3b011b10271a39010e0e0c00053b3b3c3b2d6805291ad1000e0e0c000203041a2301103b503b502966221f0e0e0e0c000202013b222538293b1ad5000e0e0c00036403051a020102892a222622111afc000e0c0004222638293b1ab4000e0c0003640312312c1ae8000e0c0003296801293b6965025b2b22271ad9000e0e0c000329352a36222938293b1a84000e0c0003640316342f1ab800020237000e0c0003296801293b696502262a22282b1aa8000e0c00041aa500302b6a220d311a90000e0c00032968012b68012a2a69270566642707271a440e0e00000000ec03000000000000|@6168,I105,I218,@108,I251,@6169,@1840,@93,@2900,@2955,@6171,I253,@6175,@150,@3716,@740,@6346,@6351,@6363,@6365,@6368,@6957,I48,@7157,@1784,@740,@7189,@9159,@9582,@2360,@6167| 6167:D2,36|00803b56180c00022956271a1a002e0e7e0400030e0e0e0e000000001c00000000000000|@11486,@11485| 6168:S31|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329 6169:O1|@6170 6170:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 6171:D2,36|00805607373b2a0e0e0c000264291a17002d0e0e7d040002000000001c00000000000000|@6173,@6172| 6172:O1|@6174 6173:S42|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329676c6f62616c732d283129 6174:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@6172| 6175:O2|@6176,@149 6176:D9,236|00802b372c2309293b1ae4000e0c00032928291ade000e0e0e0c0003641ad8000e0c0002030e293b28291acf000c0004503b02a42a3b1ab7000c0003293b1ab3000c00036403762d3a2e23072f230830230a31230e32230f3b2e0e0e0e0c00023b2e0e0e0e0c0002303b1a83000c00032e3b2b1a86000e0e0e0c000450313b2d1a79000e0e0c0004502d3b1a62000e0e0e0c00032d3b2b1a62000e0e0e0c0004502e3b2d1a55000e0e0c000450220e1a4e001a4f000c0003501a4c00103b503b502a3b28291a34000e0c0004502d56371a39002f7e05000365420e0e0e0e0e0e00000000e400000000000000|@6178,I253,I251,I218,I255,@6179,@6180,@6201,@6177| 6177:O1|@6204 6178:S18|4c45585f28292e696e73796d626f6c283129 6179:S34|756e657870656374656420656e64206f662066696c6520656e636f756e7465726564 6180:O1|@6181 6181:D8,204|00812c3a2d23072e23082f230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1aae000e0e0e0c0004502b3b2b1aa1000e0e0c000450323a33230634230a220c230e220d230f2b3b1a8a000e0e0e0c00032e3b1a7f000c00032b3b1a77000c00032d3b1a6f000c0003302c2e2c2e680522121a64001a65000e0e0c0003291a60000e0c00023b3e3b3b2d6805291a55000e0e0c000203041a4f00103b503c3b2b2f6b2217382218230c2a3b3c1a22000e0e0e0c0004502b2a22190e0e0e7d1a000200000000c400000000000000|@6183,I255,I253,@6184,@6187,@6182,I105,@1784| 6182:O1|@6198 6183:S18|4c45585f28292e6c65784572726f72283229 6184:O1|@6185 6185:D3,60|008028092c1a38000e0c0003030c2b280d1a2c000e0c000302013b03033c020c2b28201a1e002d0e7e030003420e0e0e000000003400000000000000|@6186,I248,I251| 6186:S15|436861722e69735370616365283129 6187:O1|@6188 6188:D3,44|00812c1a2a000e0e0e0c00023b3b2b30301a2000310e0e7b070500060e0e0e0e000000002400000000000000|@6190,I223,@6189| 6189:O1|@6191 6190:S16|537472696e672e746f6b656e73283229 6191:D13,284|00842e2e1a19010e0e0c0003032c2f2f1a0d010e0e0c000303033b021b2e301a02010e0e0e0c00032d312b1afa000e0e0e0c0004293b696502ce2e3b1aed000e0e0c000303033c02102c1ae3000c00022f2a1adf000c00036403041ada00103b502c1ad7000c000203032c02142e3f1ace000e0e0e0c00032d2a1ac7000c0003642c0e0e0e0c000203652f2f1a91000e0e0c000303222e3c1aad000e0e0c00032f3c1aa3000c0003292b3131311a9c00320e0e7b070900062e301a67000c00032d312b1a62000e0e0e0c0004303c1a77000c0003313c1a6f000c0003292b3333331a68000e0c00062c2a69270502192e3c1a54000e0c0003302a3030301a4c00310e0e7b070800061f050e0e0e0e0e0e000000001401000000000000|@6193,I113,I107,@6192,I234,I223,I231,@337,I105,I239,I252,I106,@6189| 6192:O1|@6194 6193:S23|537472696e672e746f6b656e73283229746f6b27283229 6194:D20,308|00822d1a32010e0e0e0c00022d1a2c010e0c0002030c2d3b1a25010e0e0c000302013b03043b5002041a1801102c1a0b010c0002030c2c3b1a05010e0e0c000302013b03043b5002041af800102d2d1af6000e0e0e0c0003292b1aef000c00036403041aea00103b502e1acb000c00022e3b1adf000c0003030c2d2a1ad5000e0e0c000302013b03032f02982d3b1ac3000c000303051abf0002892d3c1ab4000e0c000303162e3f1a9d000e0e0c0003302a1aa700300e0e7e0800032d28081a86000e0e0e0c0003293c1a93000c0003293f1a8f000c0003291a8c001a8d000e0e0c000303041a8700103b502928413b1a81000e0e0c000429321a7b000c0003503f331a42000e0e0e0c0003342a2c3f220d1a67000c0006502a1a63000c0002502a270565440e0e000000002c01000000000000|@6196,I223,I105,I231,@313,I239,I249,@6195,I251,I48,I252,I240,I241,16777215,I247,@391,I11,I151,I198,I47| 6195:O4|11,@316,0,@6197 6196:S19|537472696e672e737562737472696e67283329 6197:O5|@339,719,0,719,0 6198:D8,116|00802b1a72000e0e0e0c00021a6d000e0e0c0002034e2b352c36293b1a61000e0e0c000303183e2b69291a4b000c000203041a4f00103b50293b696402233e2b69291a33000c000203041a3700103b502a1a34000e0c00021a31002a692b2a69666502031a290042000000006c00000000000000|@6200,I105,I218,I251,@1784,@6182,@1058,@6199| 6199:O2|@2006,0 6200:S32|4c45585f28292e627265616b576f726473283129616464427265616b73283129 6201:O4|@35,@863,@6203,@6202 6202:O5|@6160,600,0,600,0 6203:S11|656e64206f662066696c65 6204:D26,2876|00812c352d362e372f1a340b0e0c0002303a31230732230833230a34230e220c230f3b2e0e0c00023b2e0e0e0e0c0002303b1a0f0b0c00032e3b2b1a0a0b0e0e0e0c000450313b2d1afd0a0e0e0c0004502d3b1aee0a0e0e0e0c00032d3b2b1ae60a0e0e0e0c0004502e3b2d1ad90a0e0e0c00045033282e1ad10a0e0e0c000307d22211352212392213230b293b1ab30a0c0003291ab80a0e0c00021ab50a0e0e0c0002032029352a362c3b2b1a980a0e0c0004502e3b2c1a8d0a0e0e0c0004503b260302223b2c0e0c0002293b1a7b0a0c000303033f020229352e3b2b1a670a0c0004503b260322113b1a560a0e0e0e0c000329282e1a520a0e0e0e0c0003641a500a0e0c0002032622113b1a340a0e0c00031a410a2a1a410a0e0e0c000322172a1a3a0a0e0e0e0c000326030fca22153a22162307221723082218230e3b2c0c00023b2c0e0e0e0c00022e3b2c1af60902027a010e0e0e0c0004502b3b2b1ae5090e0e0c000450221b35221c39221d230b293b1acc090e0c0003291ad0090e0c00021acd090e0e0c0002032029352a362c3b2b1ab0090e0c0004502e3b2c1aa5090e0e0c0004503b260302223b2c0e0c0002293b1a93090c000303033f020229352e3b2b1a7f090c0004503b2603221b3b1a6e090e0e0e0c000329282e1a6a090e0e0e0c0003641a68090e0c0002032a221b3b1a4c090202d0000e0c00031a61092a1a55090e0e0c000322212a1a4e090e0e0e0c0003260302ae22193b28391a24090e0c000450221f3a22202307222123082222230e3b2c0e0e0e0c00023b2c0e0e0e0c00022e3b2c1afa080e0e0e0c0004502b3b2b1aed080e0e0c0004502225352226392227230b293b1ad4080e0c0003291ad8080e0c00021ad5080e0e0c0002032029352a362c3b2b1ab8080e0c0004502e3b2c1aad080e0e0c0004503b260302223b2c0e0c0002293b1a9b080c000303033f020229352e3b2b1a87080c0004503b2603260a260a26040fce33287d1a76080e0e0e0c00030376343b282e1a63080c0004502211352212392213230b293b1a4c080e0c0003291a50080e0c00021a4d080e0e0c0002032029352a362c3b2b1a30080e0c0004502e3b2c1a25080e0e0c0004503b260302223b2c0e0c0002293b1a13080c000303033f020229352e3b2b1aff070c0004503b260326040fd233287b1af2070e0e0e0c0003037a343b28201adf070c0004502211352212392213230b293b1ac8070e0c0003291acc070e0c00021ac9070e0e0c0002032429352a362c3b2b1aac07020262070e0c0004502e3b2c1a9d070e0e0c0004503b260302223b2c0e0c0002293b1a8b070c000303033f020229352e3b2b1a77070c0004503b260326040fd233285f1a6a070e0e0e0c0003037a343b283c1a57070c0004502211352212392213230b293b1a40070e0c0003291a44070e0c00021a41070e0e0c0002032429352a362c3b2b1a24070202da060e0c0004502e3b2c1a15070e0e0c0004503b260302223b2c0e0c0002293b1a03070c000303033f020229352e3b2b1aef060c0004503b260326040fd233285d1ae2060e0e0e0c0003037a343b282d1acf060c0004502211352212392213230b293b1ab8060e0c0003291abc060e0c00021ab9060e0e0c0002032429352a362c3b2b1a9c06020252060e0c0004502e3b2c1a8d060e0e0c0004503b260302223b2c0e0c0002293b1a7b060c000303033f020229352e3b2b1a67060c0004503b260326040fd233285b1a5a060e0e0e0c0003037a343b281f1a47060c0004502211352212392213230b293b1a30060e0c0003291a34060e0c00021a31060e0e0c0002032429352a362c3b2b1a14060202ca050e0c0004502e3b2c1a05060e0e0c0004503b260302223b2c0e0c0002293b1af3050c000303033f020229352e3b2b1adf050c0004503b260326040fd13328291ad2050e0e0e0c0003037a343b282f1abf050c0004502211352212392213230b293b1aa8050e0c0003291aac050e0c00021aa9050e0e0c0002032429352a362c3b2b1a8c05020242050e0c0004502e3b2c1a7d050e0e0c0004503b260302223b2c0e0c0002293b1a6b050c000303033f020229352e3b2b1a57050c0004503b260326040fd33328281a4a050e0e0e0c000303af2211352212392213230b293b1a2b050c0003291a30050e0c00021a2d050e0e0c0002032429352a362c3b2b1a10050e0c0004502e3b2c1a05050202bb040e0e0c0004503b260302223b2c0e0c0002293b1aef040c000303033f020229352e3b2b1adb040c0004503b260322113b1aca040e0e0e0c000329282a1ac6040e0e0e0c0003641ac4040e0c00020313220f3b28211aaa040e0e0e0c0004503b50020c22151aba040e0e0e0c00025026040fd133282c1a8d040e0e0c0003037a343b280b1a7b04020231040c0004502211352212392213230b293b1a60040e0c0003291a64040e0c00021a61040e0e0c0002032029352a362c3b2b1a44040e0c0004502e3b2c1a39040e0e0c0004503b260302223b2c0e0c0002293b1a27040c000303033f020229352e3b2b1a13040c0004503b260326040fd033283b1a06040e0e0e0c0003031b343b28301af3030c000450220d3b28201ae7030c0004503b500fd63328221add030e0e0c0003031f221122111aef030c000350343b28341ac003020276030e0c0004503b500fd03328231ab1030e0e0c000303bb2211352212392213230b293b1a93030c0003291a98030e0c00021a95030e0e0c0002032029352a362c3b2b1a78030e0c0004502e3b2c1a6d030e0e0c0004503b260302223b2c0e0c0002293b1a5b030c000303033f020229352e3b2b1a47030c0004503b260322113b1a36030202f0020e0e0e0c00032928221a2e030e0e0e0c0003640322221522151a3e030e0e0e0c000350220f3b28081a0b030202c1020c0004503b50021028231a220322171a21030e0e0c00045026040fcc33287e1ae90202029b020e0e0c000307d42211352212392213230b293b1ac7020c0003291acc020e0c00021ac9020e0e0c0002032029352a362c3b2b1aac020e0c0004502e3b2c1aa1020e0e0c0004503b260302223b2c0e0c0002293b1a8f020c000303033f020229352e3b2b1a7b020c0004503b260322113b1a6a020e0e0e0c000328302a1a92020e0e0e0c0003030c2928391a84020e0c000302013b6403383c22161a78020e0c00035022103b1a35020e0e0c0003287e2a1a42020e0e0e0c000322123b2b1a21020202d7010e0e0c0004503b26030213287e1a350222171a3402020209000e0c00045026040fd0333f1afa010e0e0e0c0003030f343b3b1ae8010e0c0004503b500fd42830341a09020e0e0c0003030c3328391afc010e0c000302013b030e3b22121af1010e0e0c0003500fd62841341adf010c0003030c33285a1ad4010e0c000302013b03033c021b2861341ac2010e0e0e0c0003030c33287a1ab4010e0c000302013b03033c020c3328271a76010e0e0e0c000303111a9f011aa00122131a8b010c0004500fd72814293b1a56010e0e0e0c000303033b024b293c1a82010e0e0e0c0003293f1a7b010c00031a79012a1a79010202e3000e0e0c000329220f1a22010e0e0e0c00036603033c0216293c1a4d010202c3000e0e0c0003292502501e573b646403141a2e011a1b0122131a1a010e0e0e0c000450029f331a3101020297000e0e0c00021a29012a1ae5000e0e0c00032928221ada000e0e0e0c000322142a1ad2000e0e0e0c0003502214352215392216230b293b1aa0000e0c0003291aa4000e0c00021aa1000e0e0c0002032429352a362c3b2b1a840002023a000e0c0004502e3b2c1a75000e0e0c0004503b260302223b2c0e0c0002293b1a63000c000303033f020229352e3b2b1a4f000c0004503b26032607343b1a3d000e0e0c00032928291a3a000e0e0e0c000364030d221122111a7e0022127e1200033b270e430e0e0e0e00000000340b000000000000|@6206,@6207,I253,I255,I251,I105,I218,@6210,@389,@6180,@6211,@6212,@6222,@6239,@6243,I248,@6332,I48,@6253,I240,I239,@6241,I252,@372,@6205,@6177| 6205:S19|756e6b6e6f776e206368617261637465722022 6206:S20|4c45585f28292e7061727365546f6b656e283129 6207:O1|@6208 6208:D8,244|00802b35293b1aef000c000328092a1aea000e0e0e0c0003030c29280d1adc000e0c000302013b03033c020c2928201ace000e0e0e0c000303a62d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1aaa000e0e0e0c0004502b3b2b1a9d000e0e0c00045033353439220c230b293b1a7e000e0e0e0c0003291a84000e0c00021a81000e0e0c0002032029352a362c3b2b1a68000e0c0004502e3b2c1a5d000e0e0c0004503b260302223b2c0e0c0002293b1a43000c000303033f020229352e3b2b1a37000c0004503b2603220e1a3700220f0e7d0f00022965420e0e0e0e0e00000000ec00000000000000|@6209,I253,I248,I251,I255,I105,I218,@6207| 6209:S24|4c45585f28292e736b697057686974655370616365283129 6210:S16|756e6b6e6f776e2073796d626f6c202e 6211:S17|756e6b6e6f776e2073796d626f6c202e2e 6212:O1|@6213 6213:D3,44|00802b352c393b2e2b1a24000e0c00042b3b2b1a1e000e0e0e0c0004503b6642000000002400000000000000|@6215,@6214,I255| 6214:O1|@6216 6215:S22|4c45585f28292e7061727365436f6d6d656e74283129 6216:D4,52|00823b2c0e0c0002293b1a2b000c000303033f02022935642d2d1a1f001a20002f0e0e7b06050005000000002c00000000000000|@6218,I251,@6214,@6217| 6217:O1|@6219 6218:S36|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129 6219:D6,236|00832e3f1ae9000e0e0c000303442d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1ac6000e0e0e0c0004502b3b2b1ab9000e0e0c000450331ab3001ab4000e0c00035034270602873b2d0e0c0002293b1a93000c000303033f0202293530282a1a83000c0003030c2928291a78000e0c000302013b03193b2f0e0e0c0002293b1a63000c000303033f0202293564023e3028281a50000e0c0003030c29282a1a44000e0c000302013b03133b3030300c00043030301a3e00317b06080005293030301a3100310e0e0e7b06080005651f040e0e0e0e0e00000000e400000000000000|@6221,I251,I255,@6220,@6180,@6217| 6220:S28|656e64206f662066696c6520666f756e6420696e20636f6d6d656e74 6221:S54|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129736b6970436f6d6d656e74426f6479283129 6222:O1|@6223 6223:D10,244|00812c352d362e352f3930230b293b1ae6000e0e0e0c0003291ae0000e0c00021add000e0e0c0002032029352a362c3b2b1ad0000e0c0004502e3b2c1ac5000e0e0c0004503b260302223b2c0e0c0002293b1ab3000c000303033f020229352e3b2b1a9f000c0004503b26037881533b31220d220d1a94000e0c0005293b2a1a7a000e0e0e0c00021a75000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129661a64000e0c0002303b2b1a4e000e0e0e0c0004503b6405240e00ff6d2935331a3d000e0e0c000303043b50020229103b50331a36001a37000c00036427064300000000ec00000000000000|@6225,I253,I105,I218,I255,I251,@6226,@6236,@6224,@6180| 6224:S36|6e6f206d61746368696e672071756f746520666f756e64206f6e2074686973206c696e65 6225:S21|4c45585f28292e7061727365537472696e67283129 6226:O1|@6227 6227:D20,1524|00832d3b1af1050e0e0c000329285c1aea050e0e0e0c000307cd2d352e392f230b293b1ad2050e0e0e0c0003291ad0050e0c00021acd050e0e0c0002031f29352a362c3b2b1ac0050e0c0004502e3b2c1ab5050e0e0c0004503b6502223b2c0e0e0c0002293b1a93050c000303033f020229352e3b2b1a8f050c0004503b65333b1a74050e0c000333353439220c230b293b1a63050c0003291a64050e0c00021a61050e0e0c0002031f29352a362c3b2b1a54050e0c0004502e3b2c1a49050e0e0c0004503b6502263b2c0e0e0c0002293b1a27050c000303033f020229352e3b2b1a230502029b020c0004503b6528092f1a17050c0003030c2e280d1a0c050e0c000302013b03033c020c2e28201aea040e0e0e0c000307cb220f1af1040e0e0c000229285c1ad2040e0e0e0c00036403043b500fd322103b1abb040c0003291ad0041ad1040e0e0c00031acd042a1acd040e0e0c0003291ac8041ac1040e0e0c000322132a1abe040e0e0e0c00035022143b1a81040e0e0c000329285c1a7a040e0e0e0c0003641a78040e0c0002033f22143b1a60040e0c00032928221a5a040e0e0e0c0003641a58040e0c0002031c22143b1a40040e0c0003293f1a3b040c0003641a3c040e0c000202013b02013b03782213352214392215230b293b1a15040202e5000e0e0c0003291a10040e0c00021a0d040e0e0c0002032429352a362c3b2b1a0004020244000e0c0004502e3b2c1af1030e0e0c0004503b260302223b2c0e0c0002293b1acf030c000303033f020229352e3b2b1acb030c0004503b260326041ed5260402023b502604220f352210392211230b293b1a99030e0e0c0003291a98030e0c00021a95030e0e0c0002032029352a362c3b2b1a88030e0c0004502e3b2c1a7d030e0e0c0004503b260302223b2c0e0c0002293b1a5b030c000303033f020229352e3b2b1a57030c0004503b260322152215221522151a690322160e0e7b061600052e285e1a2a030e0e0e0c0003038e22103b1a18030e0c00032210352211392212230b293b1a05030e0e0c0003291a04030e0c00021a01030e0e0c0002031f29352a362c3b2b1af4020e0c0004502e3b2c1ae9020e0e0c0004503b6502223b2c0e0e0c0002293b1ac7020c000303033f020229352e3b2b1ac3020c0004503b65285c221869285e2a69302a69652217221722171acb0222187b06180005285c2212692f2a69642211221122111ab20222120e0e0e7b0612000529401a73020c000303a52d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1a5a020e0e0e0c0004502b3b2b1a4d020e0e0c00045033353439220c230b293b1a2a020e0e0e0c0003291a28020e0c00021a25020e0e0c0002032029352a362c3b2b1a18020e0c0004502e3b2c1a0d020e0e0c0004503b260302223b2c0e0c0002293b1aeb010c000303033f020229352e3b2b1ae7010c0004503b2603220d1a03023b1a03026b103b503b502928221abf010c000303a02d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1aa6010e0e0e0c0004502b3b2b1a99010e0e0c00045033353439220c230b293b1a76010e0e0e0c0003291a74010e0c00021a71010e0e0c0002032029352a362c3b2b1a64010e0c0004502e3b2c1a59010e0e0c0004503b260302223b2c0e0c0002293b1a37010c000303033f020229352e3b2b1a33010c0004503b26032210270a0fcf2d352e392f230b293b1a0a010e0e0e0c0003291a08010e0c00021a05010e0e0c0002032029352a362c3b2b1af8000e0c0004502e3b2c1aed000e0e0c0004503b260302223b2c0e0c0002293b1acb000c000303033f020229352e3b2b1ac7000c0004503b26032d3f1aaf000c0003030a301ada003b1ade006b103b503b5028212e1aa6000e0e0e0c0003030c2d287e1a98000e0c000302013b03033c020c2d28201a76000e0e0e0c000303122d34693333331a9500340e0e0e7b060b00052d1a70000e0c00021a91002a1a710002022d000e0e0c0003291a84001a61000e0e0c0003342a1a5f000c000350220d220d220d220d1a5400220e0e7b060e0005641f040e0e0e0e0e00000000ec05000000000000|@6229,I253,I251,I105,I218,I255,I248,@6207,@372,@397,@6230,@389,@6231,@6180,@6226,@6232,@6233,@6234,@6235,@6228| 6228:S16|20666f756e6420696e20737472696e67 6229:S33|4c45585f28292e7061727365537472696e67283129676574537472696e67283129 6230:S21|756e65787065637465642063686172616374657220 6231:S11|20696e205c202e2e2e205c 6232:S9|456e644f664c696e65 6233:O5|@6160,350,0,350,0 6234:O5|@6160,389,0,389,0 6235:S22|756e7072696e7461626c652063686172616374657220 6236:O2|@6237,16777215 6237:D17,292|00802b1a22010e0e0e0c00021a1d010e0e0c000207d22b353b2d291a0a010e0e0e0c00021a05010e0e0c0002031729362b3c1afb000c0003292b25042504511e253b6502012a65291add000e0e0c0002030c293b1add000e0e0c000302013b03043b5002041ad000103b50293c1acc000e0c000303032a02932928081ac1000e0e0c0003293c1abb000c0003293f1ab7000c00032956671ab2000e0e0e0c000303041aab00103b503b502928413b1aa3000c0004292e1a9f000c0003503f32291a65000e0e0c00021a61000e0e0c0002032c29352a362d2d2c1a80000e0c0004502c3c1a5a00020225000e0e0e0c0003292b2505250526031e39260302023b5051291a5b000c0002502927046502031a5200420e0e0e0e0e000000001c01000000000000|@6238,I105,I218,I106,I231,@399,I251,I239,I240,I241,I247,@391,I11,I151,I254,I47,I48| 6238:S31|4c696272617279537570706f72742e737472696e67496d706c6f6465283129 6239:O1|@6240 6240:D6,100|00802814293b1a5f000c000303033b023f293c1a56000e0e0e0c0003293f1a4f000c00031a4d002a1a4d000e0e0c000329301a33000c00036603033c0212293c1a29000e0e0c0003292502501e483b6464420e0e0e0e0e0e000000005c00000000000000|@6242,I251,I240,I239,@6241,I252| 6241:S20|3a3d3c3e2b2a215e2f7c26257e2d3f60405c2423 6242:S27|436861722e636f6e7461696e732831296d61746368283129283129 6243:O1|@6244 6244:D24,564|00822b352c362d373030301a2a020e0e0e0c00042c3b1a23020c000329282e1a1e020e0e0e0c00036407ce2f35303931230b293b1a05020e0e0c0003291a04020e0c00021a01020e0e0c0002031f29352a362c3b2b1af4010e0c0004502e3b2c1ae9010e0e0c0004503b6502223b2c0e0e0c0002293b1ac7010c000303033f020229352e3b2b1ac3010c0004503b65313b1aa8010e0c000328412a1ab2010e0e0e0c0003030c29285a1aa4010e0c000302013b03033c021b28612a1a92010e0e0e0c0003030c29287a1a84010e0c000302013b031b2f282e1a79010e0e0c0003291a7401220f1a730122107b051000042814293b1a4901020291000e0e0c000303033b023f293c1a56010e0e0e0c0003293f1a4f010c00031a4d012a1a4d010e0e0c0003292e1a17010c00036603033c0212293c1a29010e0e0c0003292502501e4e3b646403192f282e1a07010c0003291a1c01220f1a030122107b051000041a1101301aed000e0e0c000329282e1ae2000e0e0e0c0003292c1ad7000c0003220f2a1af20022117e1200032b3b2b1aba000e0e0e0c000450291adf000c00023b2a1adb000c0003640344291acd000e0e0c00023b2a1acb000c00036403041ac600103b503b50291a79000e0e0c0002030329020b293f1a92000e0e0e0c00032928271a5a000e0e0e0c00036402013b0304283a021b1a93002a1a93000c0003293b1a3b000c00030304281802022935642b3b2b1a35000e0e0c0004503b2705440e0e0e0e0e0e0e000000002c02000000000000|@6246,@6247,I253,I251,I105,I218,I255,I248,@389,@6253,@6243,I240,I239,@6241,I252,@6239,@6256,@6180,I223,I234,I231,@337,@6245,@1842| 6245:O3|0,@6258,@6257 6246:S20|4c45585f28292e70617273654964656e74283329 6247:O1|@6248 6248:D3,44|00822b353b2a2f2f1a25000e0e0c00052f2a69641a1d002d7d0600020e0e0e0e000000002400000000000000|@6250,@6249,@371| 6249:O1|@6251 6250:S19|4c45585f28292e726561644368617273283329 6251:D7,212|00832d3b1ad1000e0e0c0003292e0e0e0e0c000203ad2c3a2d23072e23082f230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1aa6000e0e0e0c0004502b3b2b1a99000e0e0c0004503235333934230b293b1a83000c0003291a84000e0c00021a81000e0e0c0002032029352a362c3b2b1a68000e0c0004502e3b2c1a5d000e0e0c0004503b260302223b2c0e0c0002293b1a53000c000303033f020229352e3b2b1a37000c0004503b26033b2210221022101a36000e0e0e0c0005342a69270b02013b641f040e00000000cc00000000000000|@6252,I253,I255,I105,I218,I251,@6249| 6252:S26|4c45585f28292e7265616443686172732833296c6f6f70283129 6253:O1|@6254 6254:D3,140|008028412c1a88000e0c0003030c2b285a1a7c000e0c000302013b03033c021b28612c1a6a000e0e0e0c0003030c2b287a1a5c000e0c000302013b03033c021b28302c1a4a000e0e0e0c0003030c2b28391a3c000e0c000302013b03033c021c2b28271a2e000e0e0e0c000303033c020b2b285f1a1d002d7e030003420e0e0e000000008400000000000000|@6255,I248,I251| 6255:S24|4c45585f28292e6973416c7068614e756d65726963283129 6256:S20|696e76616c6964206964656e7469666572202d20 6257:O200|0,0,0,0,0,0,@6261,@6262,@6263,0,@6264,0,0,0,0,0,0,0,0,@6265,@6266,0,0,0,0,@6268,0,0,@6269,0,0,0,0,0,0,@6270,0,0,0,0,0,0,@6271,0,0,0,0,0,0,0,0,0,0,0,0,0,@6272,0,@6274,0,@6275,@6277,0,0,0,0,0,0,0,0,@6278,@6279,@6281,0,0,@6282,0,@6283,0,@6285,0,0,0,0,@6286,0,0,@6288,@6289,@6291,@6292,@6293,@6294,@6296,@6298,@6299,0,@6301,@6302,@6303,0,0,@6304,0,@6306,0,0,0,0,0,0,@6308,0,0,0,@6310,0,0,0,0,0,0,@6312,@6313,@6314,0,0,0,0,0,0,0,0,0,0,@6316,@6317,@6319,0,0,0,0,0,0,0,0,0,@6321,0,0,0,0,0,0,0,@6322,0,0,0,0,0,0,0,0,0,0,0,@6324,0,0,0,@6326,0,0,@6327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,@6329,0,0,0,0,0,0,0,0,@6260 6258:O2|@6259,200 6259:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@675,@674| 6260:O2|@6331,63 6261:O2|@5416,29 6262:O2|@5419,36 6263:O2|@5418,28 6264:O2|@3387,65 6265:O2|@3057,25 6266:O2|@6267,49 6267:S7|73686172696e67 6268:O2|@2094,37 6269:O2|@2063,12 6270:O2|35,23 6271:O2|42,6 6272:O2|@6273,7 6273:S4|63617365 6274:O2|58,9 6275:O2|@6276,1 6276:S7|61627374797065 6277:O2|61,17 6278:O2|@2000,51 6279:O2|@6280,44 6280:S3|726563 6281:O2|@2587,19 6282:O2|@3053,26 6283:O2|@6284,13 6284:S2|646f 6285:O2|@2145,4 6286:O2|@6287,42 6287:S5|7261697365 6288:O2|@2355,18 6289:O2|@6290,22 6290:S6|68616e646c65 6291:O2|@2347,61 6292:O2|95,60 6293:O2|@2002,54 6294:O2|@6295,10 6295:S2|3a3e 6296:O2|@6297,56 6297:S2|3d3e 6298:O2|@2038,59 6299:O2|@6300,38 6300:S2|6f70 6301:O2|@5424,50 6302:O2|@2043,16 6303:O2|@3055,34 6304:O2|@6305,5 6305:S2|6173 6306:O2|@6307,66 6307:S8|7769746874797065 6308:O2|@6309,20 6309:S3|66756e 6310:O2|@6311,35 6311:S5|6c6f63616c 6312:O2|124,62 6313:O2|@3059,55 6314:O2|@6315,40 6315:S6|6f72656c7365 6316:O2|@3061,14 6317:O2|@6318,27 6318:S7|696e636c756465 6319:O2|@6320,64 6320:S5|7768696c65 6321:O2|@5438,21 6322:O2|@6323,53 6323:S6|737472756374 6324:O2|@6325,2 6325:S3|616e64 6326:O2|@3051,15 6327:O2|@6328,39 6328:S4|6f70656e 6329:O2|@6330,3 6330:S7|616e64616c736f 6331:S5|7768657265 6332:O1|@6333 6333:D18,2036|00812b352c362d372e230b2a3b281e1ae6070e0e0e0c0004501ae0071ae107311ae1070e0e0c00042c3b2b1aca070e0e0e0c000450311acf070c000203342d3b1ac9070e0e0c00032928771ac2070e0e0e0c00036403182c3b1ab0070e0c00032928301aaa070e0e0e0c00036402013b02013b07ca3035313932230b293b1a8b070c0003291a8c070e0c00021a79070e0e0c0002032029352a362c3b2b1a58070e0c0004502e3b2c1a4d070e0e0c0004503b260302223b2c0e0c0002293b1a4f070c000303033f020229352e3b2b1a27070c0004503b2603313b1a2f070c00032928781a2a070e0e0e0c00036407cb3435220c39220d230b293b1a0f070c0003291a10070e0c00021afd060e0e0c0002032029352a362c3b2b1adc060e0c0004502e3b2c1ad1060e0e0c0004503b260302263b2c0e0c0002293b1ad30602025e010c000303033f020229352e3b2b1aa7060c0004503b2603220c3b1aae060e0e0e0c000328302a1aae060e0e0e0c0003030c2928391aa0060e0c000302013b03033c023f28612a1a8e060e0e0e0c0003030c2928661a80060e0c000302013b03033c021f28412a1a6e060e0e0e0c000303102928461a6006020267000e0c000302013b64032b333b28431a2b060c0004501a48061a490622111a28060e0c0004220c3b2b1a11060e0e0c0004503b64022e220c3b1a15060e0e0c0003293b6928782a69220c3b2b1aee050e0e0e0c000450220f3b28771adf050c0004503b6627040278313b1ae4050e0c000328302a1ae6050e0e0e0c0003030c2928391ad8050e0c000302013b64032b2f3b28431aa7050c0004501acc051aa505220d1aa4050e0c0004313b2b1a8e050e0e0e0c0004503b640226313b1a92050e0e0e0c0003293b69303b2b1a6f050c000450333b28771a64050e0c0004503b6527040fd72d3b1a68050e0c00032928781a62050e0e0e0c00036403182c3b1a50050e0c00032928301a4a050e0e0e0c00036402013b07dd3035313932230b293b1a2e050e0e0e0c0003291a2c050e0c00021a19050e0e0c0002032029352a362c3b2b1af8040e0c0004502e3b2c1aed040e0e0c0004503b260302223b2c0e0c0002293b1aef040c000303033f020229352e3b2b1ac7040c0004503b2603313b1acf040c000328302a1ad2040e0e0e0c0003030c2928391ac4040e0c000302013b03033c023f28612a1ab2040e0e0e0c000303102928661aa40402026b040e0c000302013b03033c021b28412a1a8e040e0e0e0c0003030c2928461a80040e0c000302013b6403231a83041a7804220d1a570402023e000c0004313b2b1a3e040e0e0e0c0004503b640226313b1a42040e0e0e0c0003293b69303b2b1a1f040c000450333b28781a14040e0c0004503b6527040fd22d3b1a18040e0c000329282e1a12040e0e0e0c00036403033c02332d3b1afd030e0e0c00032928451af6030e0e0e0c00036403033c02172d3b1ae1030e0e0c00032928651ada030e0e0e0c00036407cf2d3b1ac8030e0c000329282e1ac2030e0e0e0c00036407d22b3b282b1a9a030e0e0e0c0004502c3b1aa2030e0e0e0c000329282e1ab6030e0e0e0c00032e3b2b1a76030e0e0e0c0004503235333934230b293b1a77030c0003291a78030e0c00021a65030e0e0c0002032429352a362c3b2b1a44030e0c0004502e3b2c1a3903020220030e0e0c0004503b260302223b2c0e0c0002293b1a37030c000303033f020229352e3b2b1a0f030c0004503b2603333b1a17030c000328302a1a1a030e0e0e0c000303102928391a0c030202d2020e0c000302013b641aed020e0e0c0002033e323b1ae50202025d000e0e0c00031afd022a1af5020e0e0c0003220c3b1aca020e0e0e0c00032a2a1adf020c000322112a1ade020e0e0e0c000326050224323b1aa7020c0003291a940222101a93020c0004343b2b1a7e020e0e0e0c0004503b2603260602023b502d3b1a7d020e0e0c00032928451a76020e0e0e0c00036403033c02172d3b1a61020e0e0c00032928651a5a020e0e0e0c00036407cf2d3b1a48020e0c00033135323933230b293b1a38020e0c0003291a38020e0c00021a25020e0e0c0002032029352a362c3b2b1a04020e0c0004502e3b2c1af9010e0e0c0004503b260302223b2c0e0c0002293b1afb010c000303033f020229352e3b2b1ad3010c0004503b2603323b1adb010c000329287e1ad6010e0e0e0c00036407ce220c35220d39220e230b293b1aba010e0e0e0c0003291ab8010e0c00021aa5010e0e0c0002032029352a362c3b2b1a84010e0c0004502e3b2c1a79010e0e0c0004503b260302263b2c02024f010e0c0002293b1a77010c000303033f020229352e3b2b1a4f010c0004503b2603220d3b1a56010e0e0e0c000328302a1a56010e0e0e0c0003030c2928391a48010e0c000302013b640343343b282b1a17010c000450220c3b1a21010e0e0c0003291a44011a35010e0e0c0003291a000122141aff000c0004220f3b2b1ae90002023c000e0e0c0004503b66022e220d3b1ae9000e0e0c0003293b69287e2a69220d3b2b1ac2000e0e0e0c00045022103b220d1ab3000c0004503b662704028c323b1ab8000e0c000328302a1aba000e0e0e0c0003030c2928391aac000e0c000302013b64033f303b282b1a7b000c000450313b1a86000e0e0e0c00032928451a9a000e0e0e0c0003291a640022101a63000c0004343b2b1a4e000e0e0e0c0004503b660226323b1a52000e0e0e0c0003293b69313b2b1a2f000c000450343b311a25000e0e0c0004503b65270502013b02013b2705430e0e00000000ec07000000000000|@6335,I255,I48,@6336,@6247,I218,I253,I251,I105,I248,@6339,@6340,@6343,@6344,@389,@6345,@6180,@6334| 6334:S2|457e 6335:S21|4c45585f28292e70617273654e756d626572283229 6336:O1|@6337 6337:D2,44|008028302c1a28000e0c0003030e2b28391a1c002d0e0e0e7e0300033b420e0e000000002400000000000000|@6338,I248| 6338:S15|436861722e69734469676974283129 6339:S3|307778 6340:O1|@6341 6341:D2,108|008028302c1a68000e0c0003030c2b28391a5c000e0c000302013b03033c023d28612c1a4a000e0e0e0c0003030c2b28661a3c000e0c000302013b03033c021d28412c1a2a000e0e0e0c0003030e2b28461a1c002d0e0e0e7e0300033b420e0e000000006400000000000000|@6342,I248| 6342:S18|436861722e69734865784469676974283129 6343:S2|3077 6344:S2|3078 6345:S23|6d616c666f726d6564207265616c206e756d6265723a20 6346:O1|@6347 6347:O1|@6348 6348:D2,20|00801a1300420e0e000000000c00000000000000|@6350,@6349| 6349:O6|0,0,0,0,0,0 6350:S34|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329283129 6351:O1|@6352 6352:D5,52|00813c28403b1a2f000c00041a2d002a691a2c002b691a2b002c692f2c452b462a472704430e0e0e000000002c00000000000000|@6354,I11,@6355,@6360,@6353| 6353:D8,164|008056073b1aa0000e0c000329291a9b000c00021a99000e0e0c0002037429352a362a352b362a321a89000e0e0c000303033c024a2a1a73000c00021a71000e0e0c00020314311a62000e0e0e0c00021a5d000e0e0c000202013b03212a3b333b3f220d1a51000e0e0c00021a4d000e0e0c00031a49000e0e0c000602013b030529680102082b250526041e7e3b270402013b65420e0e0e000000009c00000000000000|@6362,I253,I105,I218,I251,I223,I239,I154| 6354:S26|5554494c49544945535f28292e7365617263684c697374283129 6355:D3,36|008056073b1a20000e0c00032c1a1c002d0e0e0e7e030003000000001c00000000000000|@6357,I253,@6356| 6356:O1|@6358 6357:S34|5554494c49544945535f28292e7365617263684c6973742831296170706c79283129 6358:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031e2c352d362a352b362b301a2d000e0e0c0003502a2a6930300e0e7d0800023b430e0e000000003c00000000000000|@6359,I105,I218,@6356| 6359:S41|5554494c49544945535f28292e7365617263684c6973742831296170706c792831296170706c283129 6360:D3,60|00802b352c362a2a6956373b1a31000e0e0c00032a2a6956573b2b1a26000e0e0e0c0004503b2705420e0e0e0e0e0e0e000000003400000000000000|@6361,I253,I255| 6361:S34|5554494c49544945535f28292e7365617263684c697374283129656e746572283129 6362:S35|5554494c49544945535f28292e7365617263684c6973742831296c6f6f6b7570283129 6363:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6364:S24|4d6973632e6c6f6f6b757044656661756c74283229283129 6365:O1|@6366 6366:D2,44|00802b28301a28000e0c000303033c020b2b3b1a1a002d0e7e030003420e0e0e000000002400000000000000|@6367,I251| 6367:S15|53796d5365742e2b2b283229283129 6368:O1|@6369 6369:D11,644|00822b352c361a7f022f692b2b2b6a1a7a02326931373223092a3b1a72020e0e0e0c00032a3b1a67020c00032928291a62020e0e0e0c00031a5d020e0e0c000203032902012a29280c1a48020e0c000303033c029b2928141a39020e0e0c000303033c028b2928271a29020e0e0c000303033c027b2928241a19020e0e0c000303033c026b29281d1a09020e0e0c000303033c025b29281c1af9010e0e0c000303033c024b2928231ae9010e0e0c000303033c023b2928121ad9010e0e0c000303033c022b293c1aca010e0e0e0c000303033c021b29283b1ab9010e0e0c000303033c020b29283d1aa9010e0e0c000303033c021b2928231a99010e0e0c000303033c020b2928361a89010e0e0c000303033c021b2928331a79010e0e0c000303033c020b2928151a69010e0e0c00032705031f0402001a62012a34220d2f2f1a5d010e0e0c00075029352a362a2a69660fcc31230632230a33230f2a3b1a2f010c00032a3b1a27010c00030402002f220f3b332d221422141a28010e0c00085029352a363c28403b1a1c010e0c00043b2c2b2d6b221237221323092a3b1aef000c00032a3b1ae7000c00032928291ae2000e0e0e0c00031add000e0e0c000203032902012a2928301ac8000e0c000327051ac3000c0002034c221237221323092a3b1aaa000e0e0e0c00032a3b1a9f000c00032928291a9a000e0e0e0c00031a95000e0e0c000203032902012a293b1a81000e0e0c000327051a7b00020252000c000202013b030d283b22131a7c000e0c000302013b3c28403b1a6a000e0e0e0c00043d2c2b6a293b6922163a2217230e2a3b1a39000e0e0c00032a3b1a2f000c000322112b22102c221168052e2a6927132705440e0e000000007c02000000000000|@6371,@6372,@6377,I253,I251,I218,@6378,@6380,@6382,I11,@6370| 6370:O1|@6953 6371:S23|50415253455f44454328292e7061727365446563283329 6372:D12,172|008056073a561723065627230a5637230e5647230f2b3b1a96000e0e0e0c00032e3b1a8b000c00032b3b1a83000c00032d3b1a7b000c0003302c2e2c2e68051a72001a73001a74000e0c0003291a70000e0c00023b3e3b3b2d6805291a65000e0e0c000203041a5f00103b503c3b2b2f6b56e73856f7230c2a3b3c1a4e000e0e0e0c0004502b2a0e0e0c00023c28401a3e001a3f000c0004291a3c006927124200000000a400000000000000|@6374,I253,@6375,@6184,@6187,@6373,I105,@1784,I255,@855,I11,79994| 6373:O1|@6376 6374:S36|50415253455f44454328292e7061727365446563283329676c6f62616c456e762d283129 6375:S31|467265652074797065207661726961626c6573206e6f7420616c6c6f776564 6376:D8,116|00802b1a72000e0e0e0c00021a6d000e0e0c0002034e2b352c36293b1a61000e0e0c000303183e2b69291a4b000c000203041a4f00103b50293b696402233e2b69291a33000c000203041a3700103b502a1a34000e0c00021a31002a692b2a69666502031a290042000000006c00000000000000|@6200,I105,I218,I251,@1784,@6373,@1058,@6199| 6377:D2,596|00802b28171a50020e0c000303033c0fd82b28081a41020e0e0c000303033c025b2b28431a31020e0e0c000303033c024b2b282b1a21020e0e0c000303033c023b2b281e1a11020e0e0c000303033c022b2b28341a01020e0e0c000303033c021b2b28061af1010e0e0c000303033c020b2b28181ae1010e0e0c000303033c027f2b28111ad1010e0e0c000303033c021b2b28061ac1010e0e0c000303033c020b2b28181ab1010e0e0c000303033c024f2b28201aa1010e0e0c000303033c023f2b28211a91010e0e0c000303033c022f2b281f1a81010e0e0c000303033c021f2b28261a7101020215000e0e0c000303033c020b2b28221a5d010e0e0c000303033c024b2b28131a4d010e0e0c000303033c023b2b28071a3d010e0e0c000303033c022b2b28401a2d010e0e0c000303033c021b2b28191a1d010e0e0c000303033c020b2b282a1a0d010e0e0c000303033c0fd82b280c1afd000e0e0c000303033c029b2b28141aed000e0e0c000303033c028b2b28271add000e0e0c000303033c027b2b28241acd000e0e0c000303033c026b2b281d1abd000e0e0c000303033c025b2b281c1aad000e0e0c000303033c024b2b28231a9d000e0e0c000303033c023b2b28121a8d000e0e0c000303033c022b2b3c1a7e000e0e0e0c000303033c021b2b283b1a6d000e0e0c000303033c020b2b283d1a5d000e0e0c000303033c022f2b28331a4d000e0e0c000303033c021f2b28151a3d000e0e0c000303033c020f2b28361a2d00020205000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004c02000000000000|@6367,I251| 6378:O1|@6379 6379:D2,252|00802b280c1af8000e0c000303033c029b2b28141ae9000e0e0c000303033c028b2b28271ad9000e0e0c000303033c027b2b28241ac9000e0e0c000303033c026b2b281d1ab9000e0e0c000303033c025b2b281c1aa9000e0e0c000303033c024b2b28231a99000e0e0c000303033c023b2b28121a89000e0e0c000303033c022b2b3c1a7a000e0e0e0c000303033c021b2b283b1a69000e0e0c000303033c020b2b283d1a59000e0e0c000303033c021b2b28231a49000e0e0c000303033c020b2b28361a39000e0e0c000303033c021b2b28331a29000e0e0c000303033c020b2b28151a19002d7e030003420e0e0e00000000f400000000000000|@6367,I251| 6380:O1|@6381 6381:D14,740|00852e372f23092a3b1adc020e0c00032a3b1ad3020c00032928291ace020e0e0e0c00031ac9020e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1aa0020e0c00032e3b1a97020c00032b3b1a8f020c00032d3b1a87020c0003302c2e2c2e68053328301a7b020c000303033c020b333b1a6e020e0e0e0c0003030822153b452a460fd733280c1a58020e0c000303033c029b3328141a49020e0e0c000303033c028b3328271a39020e0e0c000303033c027b3328241a29020e0e0c000303033c026b33281d1a19020e0e0c000303033c025b33281c1a09020e0e0c000303033c024b3328231af9010e0e0c000303033c023b3328121ae9010e0e0c000303033c022b333c1ada010e0e0e0c000303033c021b33283b1ac9010e0e0c000303033c020b33283d1ab9010e0e0c000303033c021b3328231aa9010e0e0c000303033c020b3328361a99010e0e0c000303033c021f3328331a8901020268010e0e0c000303033c020b3328151a75010e0e0c000307d40402003428231a65010e0e0c0003032d221322162214221722191a59010e0e0c00063c28403b1a51010e0e0c00043d2b2b6a2c2a451a460146260402ca3428361a2b010c0003032d221322162214221722191a21010e0e0c00063c28403b1a19010e0e0c00043d2b2b6a2c2a451a0e0146260402923428331af3000c0003031822132216221422181af7000c00052a2a451af2004651026f3428151ad0000e0c0003031c221322162214221822181ad9000e0e0c00062a2a451ad20046510247040200221322173c22172d221a221c1ac000020268000e0c00085029352a363c28403b1a94000e0c00043b2c2b2d6b3c28403b1a84000e0c00043d2b2b6a302a451a7a0046260829352a360402002a2a221a221a221a221a1a7b000c00075029352a362d2b692a362b3822112b220f2c220f6805221f2d452a46270a0213283b22151a55000e0e0c00035022153b452a46270f1f060e0e0e0e0e00000000dc02000000000000|@6383,I253,I251,I218,@6384,I11,@6650,@6652,@6672,@6675,@6688,@6382,@6380,@6370| 6382:O1|@6691 6383:S38|50415253455f44454328292e70617273654465632833297061727365546f7044656373283129 6384:O3|@6386,@6628,@6385 6385:O2|@6644,@6384 6386:D16,660|00842f352f230630230a31230f2a3b1a86020e0e0e0c00032a3b1a7b020c00033437220c23092a3b1a6d020e0e0c00032a3b1a63020c00032928291a5e020e0e0e0c00031a59020e0e0c000203032902012a2928361a44020e0c0003035322101a41020e0e0c00023d1a3c0222131a3b02221422162214221912150001000100221868071a29020e0e0c000529352a3629362a38220f2b220e2c220f68053c28403b1a0f020c00043d2b302c6b27080fd2221037221123092a3b1adb010c00032a3b1ad3010c00032928291ace010e0e0e0c00031ac9010e0e0c000203032902012a2928231ab4010e0c00032705030a22101aaf010c0002021728231ab9010e0e0c00022922121ab2010e0e0e0c000364221123062212230a2213230f2a3b1a76010e0e0e0c00032a3b1a6b010c00032217362218370403003b2a1a82010e0e0e0c00035029362a371a78012e2b6a2b2a2f6a1a7201221d692a221f2b221f221f121f00010002000e0c0006221f37222023092a3b1a20010e0c00032a3b1a17010202fa000c00032928291a0e010e0e0e0c00031a09010e0e0c000203032902012a29281a1af4000e0c00032705030a221f1aef000c00020217281a1af9000e0e0c00022922211af2000e0e0e0c0003641af800221b316a292f346a1af1002222692a22242b22242224122400010002000c000622243a2225230e2a3b1a98000e0c00032a3b1a8f000c0003222837222923092a3b1a80000e0c00032a3b1a77000c00032928291a72000e0e0e0c00031a6d000e0e0c000203032902012a29280f1a58000e0c00032705030a22281a53000c00020217280f1a5d000e0e0c000229222a1a56000e0e0e0c00036422172c22162d221768053c30220d2c6b271a270b1f050e0e0e0e0e000000008c02000000000000|@6388,I253,I251,I218,@6175,@6389,@6392,@6430,I11,@6396,@6370,@6351,@6624,@6625,@6626,@6387| 6387:D2,44|00802b280f1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6388:S38|50415253455f44454328292e7061727365446563283329737472756374757265446563283329 6389:O1|@6390 6390:D2,28|00802b28351a18002d0e0e0e7e030003000000001400000000000000|@6391,I251| 6391:S19|53796d5365742e73747275637453792d283129 6392:D2,52|00812c561756285639564a565b566c1a26000e0e0e0c00082c2a35452a364664430e0e0e0e0e0e0e000000002c00000000000000|@6394,@6393| 6393:O1|@6395 6394:S21|534b4950535f28292e6765744c6973742834292d45 6395:D16,492|00861aeb0131691aea012a321ae9010e0e0c000429352a362a342b1ade010e0e0e0c00042c36220c37220d23092a3b1ace010e0e0e0c00032a3b1ac3010c00032928291abe010e0e0e0c00031ab9010e0e0c000203032902012a29401aa5010e0e0c0003033222111aa1010e0e0c00021a9d01221469040200221222152c2c22171a90010e0c00065029352a362a3c2b6a296801270602412928091a66010e0e0e0c0003033222111a61010e0e0c00021a6501221469040200221222152c2c22171a50010e0c00065029352a362a3b2b6a296801270602013b221237221323092a3b1a1b010c00032a3b1a13010c00032928291a0e010e0e0e0c00031a09010e0e0c000203032902012a2928111af4000e0c00032705030a22121aef000c0002021728111af5000e0e0c00022922141aee000e0e0e0c0003640402002212221522172c2214221822170c00075029352a3633353437220c392c362d382d2b2e2c2f6805221435221536220c1ab6000e0e0e0c00021a91000e0e0c00020332220c3529352a362b373c28403b1a9a000e0e0e0c00043c28403b1a8d000e0e0c0004220f2e2e2e2e2e68063d2a692707020132220d3b1a4d000e0e0c00031a49000e0e0c00023c28403b1a5d000e0e0c00042e2e2d2c2e316806293069271c1f070e00000000e401000000000000|@6397,@6398,@6399,@6401,@6407,I253,I251,I218,@6175,@6415,@6416,@6613,@6396,@6370,I105,I11| 6396:O1|@6614 6397:S49|50415253455f44454328292e7061727365446563283329737472756374757265446563283329646f537472446563283129 6398:D2,76|00802b28111a48000e0c000303033c021b2b401a3a000e0e0e0c000303033c020b2b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6399:O1|@6400 6400:D2,44|00802b28061a28000e0c000303033c020b2b28181a19002d7e030003420e0e0e000000002400000000000000|@6367,I251| 6401:O1|@6402 6402:D8,260|00822b372c23092a3b1afc000e0c00032a3b1af3000c00032928291aee000e0e0e0c00031ae9000e0e0c000203032902012a29330e0c0002270503542b36293b1ac5000e0e0c00032d3a2e23062f230a30230e31230f2b3b1aad000e0e0c00032e3b1aa3000c00032b3b1a9b000c00032d3b1a93000c0003302c2e2c2e6805220e1a90000e0c000250332a69270c02621a85002c1a85000e0e0c0003502b372c23092a3b1a61000e0e0c00032a3b1a57000c00032928291a52000e0e0e0c00031a4d000e0e0c000203032902012a29320e0c00021a39000e0e0c00022705030d2b1a30000e0c0002501e4c02023b501a2e00440e0e0e0e0e00000000fc00000000000000|@6404,I253,I251,I218,@6175,@6405,@6370,@6403| 6403:O2|I48,@6406 6404:S17|534b4950535f28292e6765746964283329 6405:S10|4964656e746966696572 6406:O5|I48,0,0,0,0 6407:O1|@6408 6408:D2,28|00823c2e2d2f1a17002f0e7b06050005000000001400000000000000|@6410,@6409| 6409:O1|@6411 6410:S28|5554494c49544945535f28292e636865636b466f72446f7473283329 6411:D21,260|00832d1a02010e0e0e0c00022f2a1afb000c00036403033b0fcf2e3c1af1000e0e0c0003293b1aeb000c000303033c02102e1ad3000c00022a2a1adb000c00036403041ad600103b502e1ad3000c000203032e0214293f1aca000e0e0e0c00032f2a1ac3000c00036429282e1abd000e0e0c00036503611ab6002e1ab6000e0e0e0c0003291ab0001aa9000e0e0c0003291aa8001aa9000e0e0c0003291aa4000e0c00023b3e3b3b2d6805291a71000e0e0c000203041a8f00103b503c3b2b346b313832230c2a3b3c1a80000e0c0004502b2a347d0e00022e3c1a73000c00032e2e2e1a6e002f020205007b060600051f040e0e0e0e0e0e00000000fc00000000000000|@6413,I223,I233,I107,I234,I231,@337,I105,I239,I252,I251,@6414,@389,@6412,@6184,@6187,@6373,@1784,I255,I106,@6409| 6412:S13|20696c6c6567616c2068657265 6413:S36|5554494c49544945535f28292e636865636b466f72446f7473283329636865636b283129 6414:S15|7175616c6966696564206e616d6520 6415:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6416:O2|@6418,@6417 6417:O2|@6530,@6416 6418:D16,876|00842e372f23092a3b1a64030e0c00032a3b1a5b030c00032928291a56030e0e0e0c00031a51030e0e0c000203032902012a2928321a3c030e0c000303033c021b2928061a2d030e0e0c000303033c020b2928181a1d030e0e0c00031a19030e0e0c0002270503911a11032f1a11030e0e0c0003502e372f23092a3b1af1020e0e0c00032a3b1ae7020c00032928291ae2020e0e0e0c00031add020e0e0c000203032902012a29330e0c000203033c022b2928321abd020e0e0c000303033c021b2928061aad020e0e0c000303033c020b2928181a9d020e0e0c00031a99020e0e0c00022705030e2e1a98020e0c0002501e7c3b02013b02013b2f230630230a31230f2a3b1a68020e0c00032a3b1a5f020c00033437220c23092a3b1a51020e0e0c00032a3b1a47020c00032928291a42020e0e0e0c00031a3d020e0e0c000203032902012a2928181a28020e0c0003033e1a33022210691a31022a22131a2f020c000429352a362a22152b1a25020e0e0c00042c362d352e363c28403b1a17020c00043c2c2c2c6b292e69270a0fda2928321ade010e0e0e0c000303b222101ae1010e0e0c00021af101221169221322132b2212121200010001000e0c000522133a2214230e2a3b1aa4010e0c00032a3b1a9b010c000322102b220f2c22106805221837221923092a3b1a82010e0e0e0c00032a3b1a77010c00032928291a72010e0e0e0c00031a6d010e0e0c000203032902012a29280f1a58010e0c00032705030b22181a5b010c0002500216280f1a6c010e0c000229221a1a42010e0e0e0c0003513b2f2b6a292b692709029422103a221123062212230a2213230e2214230f2b3b1a0801020278000e0c00032e3b1afb000c00032b3b1af3000c00032d3b1aeb000c0003302c2e2c2e68053c28403b1a02010e0e0e0c00043c1a04012c2c6b221c3a221d2306221e230a221f230e2220230f2b3b1ab5000e0e0c00032e3b1aab000c00032b3b1aa3000c00032d3b1a9b000c0003302c2e2c2e6805332a692716221137221223092a3b1a80000e0c00032a3b1a77000c00032928291a72000e0e0e0c00031a6d000e0e0c000203032902012a29283f1a58000e0c0003032922161a5d000e0e0c0002502e352f362218221622191a6e000e0e0e0c000622152a35452a364664020a2e22152a35452a36466427111f050e0e0e0e0e0e0e000000006403000000000000|@6420,I253,I251,I218,@6421,@6370,@6175,@6422,@6399,@6401,@6407,I11,@6423,@6396,@6424,@6419| 6419:O1|@6425 6420:S40|50415253455f44454328292e706172736544656328332970617273655369676e6174757265283329 6421:S18|5374617274206f66207369676e6174757265 6422:D2,44|00802b283f1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6423:D2,76|00802b28301a48000e0c000303033c02272b283f1a39000e0e0c000303033c02172b280f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6424:S5|6572726f72 6425:D19,876|00842d372e23092a3b1a64030e0c00032a3b1a5b030c00032928291a56030e0e0e0c00031a51030e0e0c000203032902012a29283b1a3c030e0c00032705030a2d1a38030e0c00020213283b1a31030e0e0c0002292f1a2b030c0003640403003b2a1a23030c00035029352a362b372b2b2b6a3b2a341a13030c00041a110333691a10032a220e1a0e030e0e0e0c000429352a3631313122111a00030e0c0005221037221123092a3b1ac4020e0c00032a3b1abb020c00032928291ab6020e0e0e0c00031ab1020e0e0c000203032902012a2928111a9c020e0c00032705030a22101a97020c0002021728111a91020e0e0c00022922121a8a020e0e0e0c000364221137221223092a3b1a63020c00032a3b1a5b020c00032928291a56020e0e0e0c00031a51020e0e0c000203032902012a2928201a3c020e0c000303033c022b2928211a2d020e0e0c000303033c021b2928181a1d020e0e0c000303033c020b29283a1a0d020e0e0c00031a09020e0e0c0002270503a11a250222121a04020e0c000350221137221223092a3b1adf010c00032a3b1ad7010c00032928291ad2010e0e0e0c00031acd010e0e0c000203032902012a2922150c000203033c023b2928201aad010e0e0c000303033c022b2928211a9d010e0e0c000303033c021b2928181a8d010e0e0c000303033c020b29283a1a7d010e0e0c00031a79010e0e0c00022705030e22111a6f010c0002501e8c3b02013b02013b1a87012211690402002a22152f2c1a7d010e0e0c00055029352a3630221933220e2e68053d2a69221935221a37221b392e362f382d2b2e2c2f68052f2a69221f37222023092a3b1a0c010e0c00032a3b1a03010c00032928291afe000e0e0e0c00031af9000e0e0c000203032902012a293d1ae5000e0e0c0003039822241ae1000e0e0c000250222437222523092a3b1ac3000c00032a3b1abb000c00032928291ab6000e0e0e0c00031ab1000e0e0c000203032902012a29283b1a9c000e0c000303162211220c222b222b222b1ac100222c0e0e7b072c000622292309293b1a73000c00032928291a6e000e0e0e0c0003641a68000e0c000203041a9700103b503b50293b3d1a90000e0c000450342706022b29283f1a40000e0c0003031e22241a3d000e0e0c000250220c302226222622261a5b0022277b072700062e27201f050e0e0e000000006403000000000000|@6427,I253,I251,I218,@6175,@6396,@6370,@6351,@6428,@6452,@6453,@6401,@6456,@2038,@6462,@6463,@6419,@6426,I255| 6426:O4|@35,@863,@6529,@6528 6427:S56|50415253455f44454328292e706172736544656328332970617273655369676e617475726528332967657457686572655479706573283229 6428:O1|@6429 6429:D12,388|00822c352d361a7f012e2b322e68052e372f23092a3b1a73010c00032a3b1a6b010c00032928291a66010e0e0e0c00031a61010e0e0c000203032902012a2928211a4c010e0c000307ce331a4a010e0e0e0c00025033373423092a3b1a2d010e0e0c00032a3b1a23010c00032928291a1e010e0e0e0c00031a19010e0e0c000203032902012a29283a1a04010e0c0003037b280b1a05012211220d1a02010e0e0e0c00052935221137221223092a3b1ada000e0e0e0c00032a3b1acf000c00032928291aca000e0e0e0c00031ac5000e0e0c000203032902012a29282f1ab0000e0c00032705030b22111aab000c0002500216282f1aac000e0c00022922131aa6000e0e0e0c0003512965023e220f2309293b1a7600020235000e0e0e0c00032928291a6a000e0e0e0c0003641a64000e0c000203041a7300103b503b50293b28211a6b000c0004503b642705021f29283a1a3b000c000303130402003b2a310e0c0003502935293b696502013b2708440e0e0e0e0e0e0e000000007c01000000000000|@6431,@6432,I253,I251,I218,@6175,@6440,@6430,@6396,@6370,@6426,I255| 6430:O1|@6443 6431:S37|50415253455f44454328292e70617273654465632833296765745479706556617273283229 6432:D19,500|0081560737561723092a3b1aea010e0e0e0c00032a3b1adf010c00032928291ada010e0e0e0c00031ad5010e0e0c000203032902012a29283a1ac0010e0c000307d0565736293b1aae010e0e0e0c000356773a568723065697230a56a7230e56b7230f2b3b1a90010e0c00032e3b1a87010c00032b3b1a7f010c00032d3b1a77010c0003302c2e2c2e68051a760134121400010001006a121300010004000e0e0e0c0002121300010003000359341a57010c0002293c1a53010c0003640344341a45010e0e0c00023c2a1a43010c00036403041a3e01103b503b50341a39010e0e0c0002030334020b3428051a2d010e0e0c00032928271a02010e0e0e0c00036402013b02013b3c28401a13011a1401020257000e0c00042a03033f02013b1a06012a1a06010e0e0e0c0003293d1afb000c0003293b1af3000c00032d2a6922122a69121b00010002000e0e0e0c000250121a00010001001ad5000e0e0c000250221b2a45324627140278283a1ac4000e0c00022956771abe000e0e0e0c00035056671aaa000e0e0e0c0002503c28401a8d001a8e000e0e0e0c0004291a9c006956873a5697230656a7230a56b7230e56c7230f2b3b1a3f000c00032e3b1a37000c00032b3b1a2f000c00032d3b1a27000c0003302c2e2c2e6805221434452a46270d2705430e0e00000000ec01000000000000|@6434,I253,I251,I218,@6433,I223,I233,I231,@337,I105,I252,@855,I11,79992,I242,@6175,@6396,@6370,79998| 6433:D2,36|00802b352c36562756381a1b002f0e7b060300050e0e0e0e000000001c00000000000000|@6436,@6435| 6434:S50|50415253455f44454328292e7061727365446563283329676574547970655661727328322967657454797065566172283129 6435:O1|@6437 6436:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283129 6437:D15,260|00832e2d1a01010e0e0c000303033c024a2e1af7000c00021af5000e0e0c000203142c1ae6000e0e0e0c00021ae1000e0e0c000202013b03212e3b2e3b3f311ad2000e0e0e0c00021acd000e0e0c00031ac9000e0e0c000602013b03932b3a2c23062d230a2e230e2f230f2b3b1ab0000e0c00032e3b1aa7000c00032b3b1a9f000c00032d3b1a97000c0003302c2e2c2e6805220f1a8c001a8d000e0e0c0003291a88001a89000e0e0c0003291a84000e0c00023b3e3b3b2d6805291a4d000e0e0c000203041a6f00103b503b503c3b2b306b2211382212230c2a3b3c1a5c000e0c0004502b2a22140e0e0e7d1700023b1f040e0e0e0e0e00000000fc00000000000000|@6439,I251,I105,I218,I223,I239,I154,I253,@6438,@389,@6184,@6187,@6373,@1784,I255| 6438:S23|2068617320616c7265616479206265656e20757365642e 6439:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283229 6440:O1|@6441 6441:D2,28|00802b283a1a18002d0e0e0e7e030003000000001400000000000000|@6442,I251| 6442:S20|53796d5365742e747970654964656e742d283129 6443:D3,92|00832c3a2d23062e230a2f230e30230f2b3b1a4b000c00032e3b1a43000c00032b3b1a3b000c00032d3b1a33000c0003302c2e2c2e68053b2a220e2210221322131a200022120e7b081000070e0e0e0e000000005400000000000000|@6445,I253,@6444| 6444:O1|@6446 6445:S19|534b4950535f28292e6765744c697374283429 6446:D10,308|00850402003b2a310e0c00035029352a3630373123092a3b1a1d010e0e0c00032a3b1a13010c00032928291a0e010e0e0e0c00031a09010e0e0c000203032902012a29220c1af4000e0c00032705030c301af0000e0c0002503c025a30373123092a3b1ad2000e0e0e0c00032a3b1ac7000c00032928291ac2000e0e0e0c00031abd000e0e0c000203032902012a29340e0c00022705031d2f1aac000e0c000229321aa7000c000350311a97000c0002503c6402013b03342a3b69293b1a7c000e0c0003030334020b342a1a82000e0e0e0c000329220c220c220c220c220c1a7200220d0e0e0e7b080d00072a3b69293b1a48000e0c0003030334020b342a1a56000e0e0e0c00033435220c37220d392e362f382d2b2e2c2f68052f2a69270b1f060e0e0e0e0e0e000000002c01000000000000|@6448,I253,I251,I218,@6175,@6396,@6370,@6449,@6444,@6447| 6447:O1|@6451 6448:S29|534b4950535f28292e6765744c697374283429666f724c697374283229 6449:O1|@6450 6450:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6449| 6451:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6447| 6452:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6453:O1|@6454 6454:D2,28|00802b28181a18002d0e0e0e7e030003000000001400000000000000|@6455,I251| 6455:S16|53796d5365742e6964656e742d283129 6456:O1|@6457 6457:D2,28|00831a1b002c2e6a1f040e0e0e0e0e0e000000001400000000000000|@6459,@6458| 6458:D14,228|00802b56180c0002293b1adb000c000303bb56173a562723065637230a5647230e5657230f2b3b1ac2000e0e0e0c00032e3b1ab7000c00032b3b1aaf000c00032d3b1aa7000c0003302c2e2c2e6805220d1a9c001a9d000e0e0c0003291a98001a99000e0e0c0003291a94000e0c00023b3e3b3b2d6805291a89000e0e0c000203041a8300103b503b503c3b2b306b121100010001003812120001000100230c2a3b3c1a66000e0e0e0c0004502b2a0e0e0c0002503c28401a55001a56000e0e0e0c0004291a50006927120202293564420e0e0e0e0e0e0e00000000dc00000000000000|@6461,I251,I253,@6460,@389,@6184,@6187,@6373,I105,@1784,I255,@855,I11,79994| 6459:S39|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329 6460:S42|20686173206e6f74206265656e206465636c6172656420696e2074797065206465636c61726174696f6e 6461:S42|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329283129 6462:D2,60|00802b3d1a39000e0e0c000303033c02172b283f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6463:O1|@6464 6464:D10,348|00831a5b012f690402002a2a31311a53011a54010e0c00065029352a3631373223092a3b1a45010e0e0c00032a3b1a3b010c00032928291a36010e0e0e0c00031a31010e0e0c000203032902012a293f1a1d010e0e0c00030340220d1a19010e0e0c00020402002210221022102c1af3000c00055029352a363235333734392c362d382d2b2e2c2f68053d22112b336b22162a452b46270b02ae220d37220e23092a3b1ac6000e0e0e0c00032a3b1abb000c00032928291ab6000e0e0e0c00031ab1000e0e0c000203032902012a2922140c00021a9d000e0e0c0002270503611a9900220e1a98000e0c000350220d37220e23092a3b1a73000c00032a3b1a6b000c00032928291a66000e0e0e0c00031a61000e0e0c000203032902012a2922140c00021a4d000e0e0c00022705030d220d1a43000c0002501e4c02023b5002023b503430452f4627091f040e0e0e0e000000005401000000000000|@6466,@6467,@6463,@6468,I253,I251,I218,@6175,@6465,@6370| 6465:S11|456e64206f662074797065 6466:S25|50415253455f5459504528292e706172736554797065283329 6467:D2,44|00802b3f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6468:O1|@6469 6469:D5,100|00840402003b2a323131311a5a000e0e0e0c00075029352a362a1a4f000c00021a4d000e0e0c0002030d2a36293b1a43000c00036402013b030a2a35322a452b4664020b28052b2b6a322a452b4664661f050e0e0e0e0e0e000000005c00000000000000|@6471,@6470,I105,I218,I251| 6470:O1|@6472 6471:S37|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129 6472:D8,188|00851abb002f690402002a2a3131311ab2000e0e0e0c00065029352a3631373223092a3b1aa1000e0e0c00032a3b1a97000c00032928291a92000e0e0e0c00031a8d000e0e0c000203032902012a2928061a78000e0c00030342220d1a75000e0e0c00020402003b2a22122212221222121a64000e0c00075029352a36332b6933353437220c392d362e382d2b2e2c2f6805221a30452a46270b020a2f3b6922102a4530466427091f060e0e0e0e0e0e00000000b400000000000000|@6474,@6475,@6473,I253,I251,I218,@6175,@6470| 6473:O1|@6476 6474:S50|50415253455f5459504528292e7061727365547970652833297475706c655479706528312967657450726f64756374283129 6475:D2,44|00802b28061a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6476:D20,1108|00842d372e23092a3b1a4c040e0c00032a3b1a43040c00032928291a3e040e0e0e0c00031a39040e0e0c000203032902012a323a33230634230a220c230e220d230f2b3b1a11040e0e0c00032e3b1a07040c00032b3b1aff030c00032d3b1af7030c0003302c2e2c2e68050402003428181ae8030e0c000303391ae703221722161ae4030e0c000429362a352b363c28401ad8031ad9030e0e0c00043b2c2e2d302e68063c2a69293b69312a45304626090fcf34283a1aa3030c00030387221436293b1a92030e0e0e0c00036422140e0e0c0002221537221623092a3b1a78030e0c00032a3b1a6f030c00032928291a6a030e0e0e0c00031a65030e0e0c000203032902012a29283a1a50030e0c00032705030b22151a5b030c0002500216283a1a54030e0c00022922171a4e030e0e0e0c0003513e2a2d6a293b692c2a452e4626040fdb3428201a11030e0e0c000307d022141a1d030e0e0c000222153a2216230e2a3b1af0020e0c00032a3b1ae7020c0003221937221a23092a3b1ad80202020b020e0c00032a3b1acb020c00032928291ac6020e0e0e0c00031ac1020e0e0c000203032902012a29282e1aac020e0c00030326221e1ab9020e0e0c0002221431221232221268053f3b3c2c6b293b69220e2a452c46260502d11aa102221f690403002a2a1a9a020e0e0e0c0003502936280b1a900222231a8f02222722262f2226222868061a85020e0e0c0005293522233a2224230e2a3b1a3a0202046d018d000e0c00032a3b1a2b020c0003221c2b221a2c221a6805222837222923092a3b1a12020e0e0e0c00032a3b1a07020c00032928291a02020e0e0e0c00031afd010e0e0c000203032902012a29282e1ae8010e0c00032705030b22281af3010c0002500216282e1aec010e0c000229222a1ae6010e0e0e0c0003513f2f3c2c6b293b6922162a452c46260d260a0fcf3428211aa5010e0e0c000303a622141ab1010e0e0c00023b22162219221622181ac0010e0c000622163a2217230e2a3b1a74010e0c00032a3b1a6b010c0003221a37221b23092a3b1a5c010e0c00032a3b1a53010c00032928291a4e010e0e0e0c00031a49010e0e0c000203032902012a29282f1a34010e0c00032705030b221a1a3f010c0002500216282f1a38010e0c000229221c1a32010e0e0e0c000351220f2b220d2c220d6805302f452a462608022b28181a0f010c00022922161a0a010e0e0e0c00035022151af60002020d000e0e0e0c0002502a3b452c465129352a36221637221723092a3b1ab9000e0e0c00032a3b1aaf000c00032928291aaa000e0e0e0c00031aa5000e0e0c000203032902012a2928181a90000e0c00030312221c30302b221f1abc00221e0e7b061f00052f1ab4000e0c00021a71000e0e0c000203452f353036293b1a5d000e0e0c00030308221e2b453146022a28181a65000e0e0c000229221f1a5e000e0e0e0c000350221e1a4a000e0e0e0c000250221f2c45324664650208221c1a6000452f4627171f050e000000004c04000000000000|@6478,I253,I251,I218,@6453,@6401,@6479,I11,@6175,@6396,@6370,@6490,@6494,@6509,@6512,@6430,@6522,@6477,I105,@1965| 6477:O1|@6526 6478:S49|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129 6479:O3|@6481,@690,@6480 6480:O3|@6483,@6488,@6482 6481:S9|756e646566696e6564 6482:O3|@6481,@717,@6489 6483:O2|1,@6484 6484:O3|2,@6485,0 6485:O4|0,@151,3,1 6486:O1|@6487 6487:D2,20|00801a1300420e0e000000000c00000000000000|@756,@713| 6488:O4|1,@70,0,0 6489:S9|556e646566696e6564 6490:D10,116|00821a73002e1a73000c0003291a70001a69000e0e0c0003291a68001a69000e0e0c0003291a64000e0c00023b3e3b3b2d6805291a59000e0e0c000203041a5300103b503c3b2b346b5667385677230c2a3b3c1a42000e0e0e0c0004502b2a347d0d00020e0e0e0e000000006c00000000000000|@6492,@6493,@389,@6491,@6184,@6187,@6373,I105,@1784,I255| 6491:S25|292061707065617273206d6f7265207468616e206f6e63652e 6492:S75|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d7265706f7274447570283329 6493:S7|4c6162656c2028 6494:O1|@6495 6495:D5,52|00813c28403b1a2f000c00041a2d002a691a2c002b306a1a2a002c692f2c452b462a472704430e0e000000002c00000000000000|@6497,I11,@6498,@6503,@6496| 6496:D8,164|008056073b1aa0000e0c000329291a9b000c00021a99000e0e0c0002037429352a362a352b362a321a89000e0e0c000303033c024a2a1a73000c00021a71000e0e0c00020314311a62000e0e0e0c00021a5d000e0e0c000202013b03212a3b333b3f220d1a51000e0e0c00021a4d000e0e0c00031a49000e0e0c000602013b030529680102082b250526041e7e3b270402013b65420e0e0e000000009c00000000000000|@6508,I253,I105,I218,I251,I223,I239,I154| 6497:S28|5554494c49544945535f28292e6e6f4475706c696361746573283129 6498:D3,36|008056073b1a20000e0c00032c1a1c002d0e0e0e7e030003000000001c00000000000000|@6500,I253,@6499| 6499:O1|@6501 6500:S36|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c79283129 6501:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031e2c352d362a352b362b301a2d000e0e0c0003502a2a6930300e0e7d0800023b430e0e000000003c00000000000000|@6502,I105,I218,@6499| 6502:S43|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c792831296170706c283129 6503:D2,36|00802b352c36562756381a1b002f0e7b060300050e0e0e0e000000001c00000000000000|@6505,@6504| 6504:O1|@6506 6505:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283129 6506:D9,196|00832c3b1ac1000e0e0c000329291abb000c00021ab9000e0e0c0002037a29352a362a352b362a220c1aa8000e0c000303033c024a2a1a93000c00021a91000e0e0c00020314341a82000e0e0e0c00021a7d000e0e0c000202013b03212a3b220d3b3f22101a70000e0c00021a6d000e0e0c00031a69000e0e0c000602013b030b342a220c34347b050c00042b250526041e843b2704021b3030692f3b1a28000e0c00032a2a69313b2b1a37000c0004503b66651f040e0e00000000bc00000000000000|@6507,I253,I105,I218,I251,I223,I239,I154,I255| 6507:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283229 6508:S37|5554494c49544945535f28292e6e6f4475706c6963617465732831296c6f6f6b7570283129 6509:O1|@6510 6510:D1,20|00803b420e0e0e0e000000000c00000000000000|@6511| 6511:S16|53796d5365742e656d7074792d283129 6512:D2,44|00812c561756285639564a565b1a20000e0c00072c2a35452a364664430e0e0e000000002400000000000000|@6394,@6513| 6513:O1|@6514 6514:D10,188|00851abb00306929301ab8000e0c000329362a310e0c000232373323092a3b1aa6000e0e0e0c00032a3b1a9b000c00032928291a96000e0e0e0c00031a91000e0e0c000203032902012a2928091a7c000e0c00032705030a321a78000e0c0002021328091a71000e0e0c000229341a6b000c0003641a6800220c690402002a220d342c220e0c00055029352a362f35303731392c362d382d2b2e2c2f6805220d312b6a292b6927101f060e0e0e0e0e0e00000000b400000000000000|@6516,@6517,@6518,I253,I251,I218,@6175,@6396,@6370,@6515| 6515:D2,60|00802b282e1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6516:S68|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d6c2d283129 6517:D2,44|00802b28091a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6518:O1|@6519 6519:D18,404|00812b372c23092a3b1a8c010e0c00032a3b1a83010c00032928291a7e010e0e0e0c00031a79010e0e0c000203032902012a29281e1a64010e0c0003270507cf2b36293b1a51010e0e0c00032d3a2e23062f230a30230e31230f2b3b1a39010e0e0c00032e3b1a2f010c00032b3b1a27010c00032d3b1a1f010c0003302c2e2c2e6805331a1d010e0e0c00023b2a1a17010c00036403041a1201103b50331a0f010c0002030333020b333f1a06010e0e0e0c0003220f1aff000c00025029287e1ad9000e0e0c000303033c020b2928301ac9000e0e0c00030392220f3a221023062211230a2212230e2213230f2b3b1aa6000e0e0e0c00032e3b1a9b000c00032b3b1a93000c00032d3b1a8b00020264000c0003302c2e2c2e68051a9e001a9f001aa0000e0c0003291a9c000e0c00023b3e3b3b2d6805291a75000e0e0c000203041a8700103b503c3b2b2f6b221d38221e230c2a3b3c1a76000e0e0e0c0004502b2a0e0e0c0002261102023b50342b69270d020f1a5c002d2d1a5b002e0e7b05040004430e0e0e000000008c01000000000000|@6521,I253,I251,I218,I223,I231,@337,I105,I252,@6175,@6520,@6184,@6187,@6373,@1784,I255,@6399,@6401| 6520:S25|4c6162656c73206d75737420626520312c322c332c2e2e2e2e 6521:S20|534b4950535f28292e6765744c6162656c283229 6522:O1|@6523 6523:D10,420|00842e372f23092a3b1a9c010e0c00032a3b1a93010c00032928291a8e010e0e0e0c00031a89010e0e0c000203032902012a2928201a74010e0c000303033c022b2928211a65010e0e0c000303033c021b2928181a55010e0e0c000303033c020b29283a1a45010e0e0c0003270503171a41012e690402002a312f2c320c00055029352966021e283a1a2c010e0c000229301a27010c0003502f1a23010c0002501a2001642f373023092a3b1af9000e0e0c00032a3b1aef000c00032928291aea000e0e0e0c00031ae5000e0e0c000203032902012a29280b1ad0000e0c00032705030c2f1ad8000e0c0002503c028e2f373023092a3b1aae000e0e0e0c00032a3b1aa3000c00032928291a9e000e0e0e0c00031a99000e0e0c000203032902012a2928201a84000e0c000303033c022b2928211a75000e0e0c000303033c021b2928181a65000e0e0c000303033c020b29283a1a55000e0e0c00032705031d280b1a53000c000229311a4f000c000350301a4b000c0002503c6402013b03123b303030301a40000e0c00062a2a69640203293b69641f05000000009c01000000000000|@6525,I253,I251,I218,@6524,@6396,@6370,@6175,@1965,@6522| 6524:D2,60|00802b282f1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6525:S77|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d70726f636573734c697374283129 6526:D8,228|00832b36293b1adf000c00032d3a2e23062f230a30230e31230f2b3b1ac9000e0e0c00032e3b1abf000c00032b3b1ab7000c00032d3b1aaf000c0003302c2e2c2e68052210352211372212392b302c302d68053c28401a93001a94000e0c0004221622102217312e2e68063c2a6922151a81000e0e0c000250221537221623092a3b1a63000c00032a3b1a5b000c00032928291a62000e0e0e0c00031a5d000e0e0c000203032902012a2928181a48000e0c000327050314293b6922172a2f2b221a1a3b00221b7b061b000522162a452d4627131f040e0e00000000dc00000000000000|@6527,I253,@6479,I11,@6175,I251,I218,@6477| 6527:S64|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129636f6e7374727563746f7273283229 6528:O5|@6160,612,0,612,0 6529:S31|417474656d707420746f20707573682074776f20706172656e746865736573 6530:D3,52|00832e370404003b2a1a2c000e0c00035029383b3131566732220d31301a1c00220d0e7b0a090009000000002c00000000000000|@6532,@6533,@6531| 6531:O1|@6538 6532:S39|50415253455f44454328292e70617273654465632833297369676e617475726553706563283329 6533:O1|@6534 6534:D3,60|00810403003b2a1a36000e0e0e0c00035029352a362b371a2a002b2b6a302d452c462b472a482705430e0e0e0e0e0e0e000000003400000000000000|@6536,@6351,@6535| 6535:D12,188|00802b56180c0002293b1ab3000c000303972c1aae000e0e0e0c0002293c1aa7000c00036403402c1a99000e0e0c00023c2a1a97000c00036403041a9200103b502c1a8f000c000203032c020b2c28051a85000e0e0c00032928271a62000e0e0e0c00036402013b3c28401a6e001a6f000c00042a03033f02013b1a66002a1a66000e0e0e0c0003293d1a5b000c0003293b1a53000c00032d2a69332a6956970e0c00022a27080202293564420e0e0e00000000b400000000000000|@6537,I251,I223,I233,I231,@337,I105,I252,@855,I11,79992,I242| 6536:S40|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129 6537:S43|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129283129 6538:D31,2044|008731373223092a3b1af4070e0c00032a3b1aeb070c00032928291ae6070e0e0e0c00031ae1070e0e0c000203032902012a2928301acc070e0c000303033c027b29281b1abd070e0e0c000303033c026b2928311aad070e0e0c000303033c025b2928361a9d070e0e0c000303033c024b2928121a8d070e0e0c000303033c023b29283d1a7d070e0e0c000303033c022b2928101a6d070e0e0c000303033c021b29283b1a5d070e0e0c000303033c020b29280c1a4d070e0e0c000303033c020729220d0e0c00021a3d070e0e0c0002270507d11a3507321a35070e0e0c00035031373223092a3b1a15070e0e0c00032a3b1a0b070c00032928291a06070e0e0e0c00031a01070e0e0c000203032902012a29220d0c000203033c029b2928301ae1060e0e0c000303033c027f29281b1ad1060e0e0c000303033c026f2928311ac1060e0e0c000303033c025f2928361ab1060e0e0c000303033c024f2928121aa1060e0e0c000303033c023f29283d1a91060e0e0c000303033c022f2928101a81060e0e0c000303033c021f29283b1a71060e0e0c000303033c020f29280c1a610602022e000e0e0c000303033c020729220d0e0c00021a4d060e0e0c00022705030e311a4c060e0c0002501eec3b02013b02013b32373323092a3b1a20060e0c00032a3b1a17060c00032928291a12060e0e0e0c00031a0d060e0e0c000203032902012a220e2306220f230a2210230f2a3b1ae9050e0e0c00032a3b1adf050c00032e28311ada050e0e0e0c000307d5221323062214230a2215230f2a3b1abd050e0e0c00032a3b1ab3050c000322181abf050c0002221937221a23092a3b1a9c050e0c00032a3b1a93050c00032928291a8e050e0e0e0c00031a89050e0e0c000203032902012a29283b1a74050e0c0003030e221e1a79050e0e0c0002503c02013b1a7005221f691a6e052a22221a6c050e0c000429352a362a2a69222437222523092a3b1a35050e0e0c00032a3b1a2b050c00032928291a26050e0e0e0c00031a21050e0e0c000203032902012a2928111a0c050e0c00032705030e22241a0f05020255000c0002021728111a11050e0e0c00022922261af2040e0e0e0c00036428111afe0422271afd042228222a6a1af9040e0e0c000529352a3629362a3822162b22152c22166805302e693e2b220f2c6b293b69271a0fcf2e281b1aa0040e0c000307d722131aa5040e0e0c0002221437221523092a3b1a80040e0c00032a3b1a77040c00032928291a72040e0e0e0c00031a6d040e0e0c000203032902012a2928321a58040e0c000303033c021b2928061a49040e0e0c000303033c020b2928181a39040e0e0c00031a35040e0e0c0002270503991a550422151a2c040e0c000350221437221523092a3b1a0b040c00032a3b1a03040c00032928291afe030e0e0e0c00031af9030e0e0c000203032902012a2922190c000203033c02332928321ad90302027a020e0e0c000303033c021f2928061ac50302027e000e0e0c000303033c020b2928181ab1030e0e0c00031aad030e0e0c00022705030e22141aab030c0002501e843b02013b02013b1abf03221569040200221322182c2c2218221a0c00065029352a360402002a2a221c221c1a9f030c00055029352a362d2b692a362b3822102b220f2c221068053d2d2b6a293b69270e0fd72e28361a3d030e0e0c0003033522131a41030e0e0c00023d1a640322161a63032218221822182218221868061a40030e0c000529352a363f2b2b6a293b6927050fd82e28121afb020c0003032722131a01030e0e0c00023d1a240322161a27032217221922156b1a05030e0e0c00052935650fdd2e283d1ac9020e0e0c0003032722131acd020e0e0c00023d1af00222161af7022217221922146b1ad1020e0e0c00052935650fdb2e28101a95020e0e0c0003034c1ad70222136922141a93020c00020402002b1ac902221422166a2b22161ac20202020f010e0e0e0c00055029352a36281a2b2b6a2a362b38220c2b342c220c68053b2d2b6a293b69270a0fce2e283b1a3c020e0c000303501a8b0222136922141a3b020202cc000c00020402002b1a7902221422166a2b22161a66020e0e0e0c00055029352a36281a2b2b6a2a362b38220c2b342c220c68053b020295002d2b6a293b69270a028b2e280c1ae0010e0c0003037e22133a221423062215230a2216230e2217230f2b3b1abe01020263000e0e0e0c00032e3b1aaf010c00032b3b1aa7010c00032d3b1a9f010c0003302c2e2c2e68051af601221d69221a35221b361aee012221692b2b2b6a0402002e2b3c322d22251ade01020217000e0e0e0c00075029352a363b2b2b6a293b69271302013b221437221523092a3b1a4b010c00032a3b1a43010c00032928291a3e010e0e0e0c00031a39010e0e0c000203032902012a2928301a24010e0c0003030c22191a29010e0e0c000202013b221a37221b23092a3b1a01010e0e0c00032a3b1af7000c00032928291af2000e0e0e0c00031aed000e0e0c000203032902012a2928301ad8000e0c000303033c027b29281b1ac9000e0e0c000303033c026b2928311ab9000e0e0c000303033c025b2928361aa9000e0e0c000303033c024b2928121a99000e0e0c000303033c023b29283d1a89000e0e0c000303033c022b2928101a79000e0e0c000303033c021b29283b1a69000e0e0c000303033c020b29280c1a59000e0e0c0003270503333b221b221b221b221b221b221b221b1aaa000e0e0e0c0009293b1a33000c0003030330020b302a1a960022177e1d00036402012f27121f080e0e0e0e00000000f407000000000000|@6540,I253,I251,I218,@6541,@6370,@6175,@6542,@6399,@6401,@6396,@6453,@6543,@6430,@6421,@6545,@6546,@6509,@6549,@6556,@6562,@6568,@6569,@6576,@6583,@6584,@6585,@6586,@6588,@6531,@6539| 6539:O1|@6612 6540:S57|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129 6541:S9|5369676e6174757265 6542:D2,60|00802b28111a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6543:D4,52|00811a33005617691a31002a56381a2f000c000429352a362a2a69302a452b462705430e0e0e0e0e000000002c00000000000000|@6394,@6544,@6399,@6401| 6544:D2,60|00802b28111a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6545:D2,204|00802b28061ac8000e0c000303033c020b2b28181ab9000e0e0c000303033c02972b280f1aa9000e0e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000c400000000000000|@6367,I251| 6546:O1|@6547 6547:D9,172|00832c372d23092a3b1aa4000e0c00032a3b1a9b000c00032928291a96000e0e0e0c00031a91000e0e0c000203032902012a2928181a7c000e0c000303581a7b0031331a7a000e0e0e0c000429352a362a220c2b1a6d000e0e0c00042c360402002a2a221022101a5e000e0e0e0c00055029352a36303531363c28403b1a4c000e0c00043c2c2c2c6b292f6922162a452f46270d0205323b45344627051f040e00000000a400000000000000|@6548,I253,I251,I218,@6399,@6401,@6407,@6546,I11| 6548:S74|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d736967696473283129 6549:D2,44|00812c561756285639564a565b1a20000e0c00072c2a35452a364664430e0e0e000000002400000000000000|@6394,@6550| 6550:O1|@6551 6551:D12,212|00851ad3001ad400311ad4000e0c000429352a362a332b1aca000e0e0e0c00042c363437220c23092a3b1abb000c00032a3b1ab3000c00032928291aae000e0e0e0c00031aa9000e0e0c000203032902012a2928091a94000e0c00032705030a341a90000e0c0002021728091a89000e0e0c000229220d1a82000e0e0e0c0003641a7c00220c6904020033220f2c2c220f22110e0e0c00065029352a362e352f3730392c362d382d2b2e2c2f6805303b316a2210352211362c2b2b2e6b292e6927141f060e0e0e0e00000000cc00000000000000|@6553,@6554,@6509,@6401,@6407,I253,I251,I218,@6175,@6396,@6370,@6552| 6552:D2,188|00802b3d1ab9000e0e0c000303033c028b2b280f1aa9000e0e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000b400000000000000|@6367,I251| 6553:S79|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f537472756374757265283129 6554:O1|@6555 6555:D2,60|00802b28111a38000e0c000303033c021b2b28061a29000e0e0c000303033c020b2b28181a19002d7e030003420e0e0e000000003400000000000000|@6367,I251| 6556:D2,44|00812c5617562856391a24000e0c00052c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6394,@6557| 6557:O1|@6558 6558:D11,212|00831ad3002e691ad2002a2f1ad1000e0e0c000429352a362a312b1ac6000e0e0e0c00042c3632373323092a3b1ab8000e0c00032a3b1aaf000c00032928291aaa000e0e0e0c00031aa5000e0e0c000203032902012a0402002a28251a8d000e0e0c00030348220f1a89000e0e0c00021a85002212690402002a221322132c1a7a000e0e0e0c00055029352a362a6801220c35220d37220e392d362e382d2b2e2c2f6805220c30452a46260d0206293b4530465029352a363c2a220e2d6b292b69270f1f040e0e0e00000000cc00000000000000|@6560,@6561,@6554,@6401,@6407,I253,I251,I218,@6175,@6559,@6463| 6559:D2,188|00802b3d1ab9000e0e0c000303033c028b2b280f1aa9000e0e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000b400000000000000|@6367,I251| 6560:S72|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f4578283129 6561:D2,44|00802b28251a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6562:D2,44|00812c5617562856391a24000e0c00052c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6394,@6563| 6563:O1|@6564 6564:D13,204|00831acb002e691aca002a2f1ac9000e0e0c000429352a362a312b1abe000e0e0e0c00042c3632373323092a3b1ab0000e0c00032a3b1aa7000c00032928291aa2000e0e0e0c00031a9d000e0e0c000203032902012a2928091a88000e0c00032705030a321a84000e0c0002021328091a7d000e0e0c000229341a77000c0003641a7400220c690402002a220d220d2c1a69000e0e0c00055029352a362e352f3730392c362d382d2b2e2c2f680528052a2211336b292b6927121f040e0e0e0e00000000c400000000000000|@6566,@6567,@6399,@6401,@6407,I253,I251,I218,@6175,@6396,@6370,@6565,@6463| 6565:D2,188|00802b3d1ab9000e0e0c000303033c028b2b280f1aa9000e0e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000b400000000000000|@6367,I251| 6566:S73|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f56616c283129 6567:D2,44|00802b28091a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6568:D2,172|00802b280f1aa8000e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000a400000000000000|@6367,I251| 6569:D2,44|00812c3c3c563756481a24000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6570| 6570:O1|@6572 6571:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292d45 6572:D18,668|00840403003b2a1a96020e0e0e0c00035029352a362b372b2b2b6a3b2a321a83020c00041a8102220d691a7f022a341a7e020e0e0e0c000429352a362a220d2b1a71020e0e0c00042c352d3634343422121a64020e0c000504020022140347221137221223092a3b1a51020e0e0c00032a3b1a47020c00032928291a42020e0e0e0c00031a3d020e0e0c000203032902012a2928111a28020e0c000327051a23020c000202013b03033c020222130308293b452c46500fd1221137221223092a3b1af8010e0c00032a3b1aef010c00032928291aea010e0e0e0c00031ae5010e0e0c000203032902012a2928111ad0010e0c00032705030a22111acb010c0002021728111ac5010e0e0c00022922131abe010e0e0e0c000364221237221323092a3b1a97010c00032a3b1a8f010c00032928291a8a010e0e0e0c00031a85010e0e0c000203032902012a2928201a70010e0c000303033c022b2928211a61010e0e0c000303033c021b2928181a51010e0e0c000303033c020b29283a1a41010e0e0c00031a3d010202cc000e0e0c0002270503a11a3d0122131a34010e0c000350221237221323092a3b1a0f010c00032a3b1a07010c00032928291a02010e0e0e0c00031afd000e0e0c000203032902012a29221c0c000203033c023b2928201add000e0e0c000303033c022b2928211acd000e0e0c000303033c021b2928181abd000e0e0c000303033c020b29283a1aad000e0e0c00031aa9000e0e0c00022705030e22121a9f000c0002501e8c3b02013b02013b040200221822152f2c1a96000e0e0e0c00055029352a362a68012f2a452b46260729352a362d352e372f392c362d382d2b2e2c2f68053c28401a6a001a6b000c0004220c2a332d220f222122186807292c6927191f050e0e0e0e000000009402000000000000|@6574,@6351,@6428,@6575,@6453,@6401,@6407,@6456,I253,I251,I218,@6175,@6396,@6370,@2038,@6463,@6573,I11| 6573:O2|@6479,0 6574:S37|50415253455f44454328292e70617273654465632833297479706542696e64696e67283429 6575:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6576:O1|@6577 6577:D2,28|00832c2f2f2e1a17002f0e7b06060005000000001400000000000000|@6579,@6578| 6578:O1|@6580 6579:S37|50415253455f44454328292e7061727365446563283329616e6442696e64696e6773283229 6580:D7,172|00831aab002e690402002a2a300c00035029352a362f373023092a3b1a95000e0e0c00032a3b1a8b000c00032928291a86000e0e0e0c00031a81000e0e0c000203032902012a293d1a6d000e0e0c0003033e341a6a000e0e0e0c0002040200292210221022101a5b000c00055029352a36332b6933353437220c392d362e382d2b2e2c2f6805221930452a46270b020a2f3b69220f2a4530466427091f040e0e00000000a400000000000000|@6582,@6581,I253,I251,I218,@6175,@6578| 6581:D2,44|00802b3d1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6582:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292829 6583:D2,172|00802b280f1aa8000e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000a400000000000000|@6367,I251| 6584:D2,44|00812c3c3b563756481a24000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6570| 6585:D2,172|00802b280f1aa8000e0c000303033c027b2b281b1a99000e0e0c000303033c026b2b28311a89000e0e0c000303033c025b2b28361a79000e0e0c000303033c024b2b28121a69000e0e0c000303033c023b2b283d1a59000e0e0c000303033c022b2b28101a49000e0e0c000303033c021b2b283b1a39000e0e0c000303033c020b2b280c1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000a400000000000000|@6367,I251| 6586:D11,180|008056073a561723065627230a5637230e5647230f2b3b1a9e000e0e0e0c00032e3b1a93000c00032b3b1a8b000c00032d3b1a83000c0003302c2e2c2e6805220c1a78001a79000e0e0c0003291a74001a75000e0e0c0003291a70000e0c00023b3e3b3b2d6805291a65000e0e0c000203041a5f00103b503c3b2b306b56f73812110001000100230c2a3b3c1a49000e0e0c0004502b2a0e0e0c0002501a3c002711420e0e0e0e0e00000000ac00000000000000|@6587,I253,@6460,@389,@6184,@6187,@6373,I105,@1784,I255,@1965| 6587:S75|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d6e6577656e762d283129 6588:O1|@6589 6589:D27,804|00852b1a22030e0e0e0c00020403003b2a1a18030e0c00035029352a362b372b2b2b6a3c2a331a07030c00041a0503220f691a03032a220c1a01030e0e0c000429352a362a220e2b1af5020e0e0c00042c352d36221037221123092a3b1ae4020e0c00032a3b1adb020c00032928291ad6020e0e0e0c00031ad1020e0e0c000203032902012a2928111abc020e0c00032705030a22101a8f020c0002021728111aad020e0e0c00022922121aa6020e0e0e0c000364221137221223092a3b1a83020c00032a3b1a7b020c00032928291a76020e0e0e0c00031a71020e0e0c000203032902012a29280c1a5c020e0c000307dd220d3b1a50020e0c000303033b028922163a221723062218230a2219230e221a230f2b3b1a2b020c00032e3b1a23020c00032b3b1a1b020c00032d3b1a13020c0003302c2e2c2e68051a1a021a1b021a1c020e0c0003291a18020e0c00023b3e3b3b2d6805291a0d020e0e0c000203041a0702103b503b503c3b2b2f6b2224382225230c2a3b3c1af4010e0c0004502b2a0e0e0c0002271022171a99010e0e0c00021aa101221e221a1a9e010e0e0e0c000429352a36221d35221e37221f392c362d382d2b2e2c2f68052211302214332d680528062a6922242a45020206002c46270d0fd21a9a01221c690402002a3322112213220c22202f221f1a88010e0c00095029352a36221a37221b23092a3b1a3f010c00032a3b1a37010c00032928291a32010e0e0e0c00031a2d010e0e0c000203032902012a0402002a3d1a16010e0e0e0c0003032922201ae9000e0e0c0002501a3401222669291a3101222622246a2c22241a2a010e0e0e0c0005510206293b4530465029352a36222237222323092a3b1acb000c00032a3b1ac3000c00032928291abe000e0e0e0c00031ab9000e0e0c000203032902012a0402002a28421aa100020269000e0e0c0003032122281a71000e0e0c000250222d1ac600222e222b6a2b222b1ab7000c0005500206293b4530465029352a36222c35222d37222e392c362d382d2b2e2c2f680522172210693c28403b1a8f000c00043b2c2c3b220d2e68063b2a6922352a452e46271e27141f06000000001c03000000000000|@6591,@6175,@6351,@6428,@6592,@6453,@6401,@6407,I253,I251,I218,@6396,@6370,@6593,@6184,@6187,@6373,I105,@1784,I255,@6594,@6595,@6606,@6607,@6576,@6590,I11| 6590:D2,44|00812c3b3b563756481a24000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6570| 6591:S43|50415253455f44454328292e706172736544656328332964617461747970654465634f725265706c283429 6592:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6593:S52|4461746174797065207265706c69636174696f6e206d757374206e6f7420636f6e7461696e2074797065207661726961626c6573 6594:D2,60|00802b3d1a39000e0e0c000303033c02172b28421a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6595:O1|@6596 6596:D11,484|00872b372c23092a3b1adc010e0c00032a3b1ad3010c00032928291ace010e0e0e0c00031ac9010e0e0c000203032902012a2928261ab4010e0c000303033c021b2928061aa5010e0e0c000303033c020b2928181a95010e0e0c000303033c023b2928201a85010e0e0c000303033c022b2928211a75010e0e0c000303033c021b2928181a65010e0e0c000303033c020b29283a1a55010e0e0c00031a51010e0e0c0002270503d11a49012c1a49010e0e0c0003502b372c23092a3b1a29010e0e0c00032a3b1a1f010c00032928291a1a010e0e0e0c00031a15010e0e0c000203032902012a29220f0c000203033c026b2928261af5000e0e0c000303033c021b2928061ae5000e0e0c000303033c020b2928181ad5000e0e0c000303033c023b2928201ac5000e0e0c000303033c022b2928211ab5000e0e0c000303033c021b2928181aa5000e0e0c000303033c020b29283a1a95000e0e0c00031a91000e0e0c00022705030e2b1a90000e0c0002501ebc3b02013b02013b3035313632372f1a7c000e0c0005040200220c2a30332e1a70000e0c00065029352a3633353437220c392c362d382d2b2e2c2f68053c28401a53001a54000e0c000422142a332d22152218680622102a452c46270d1f080e0e0e0e0e0e0e00000000dc01000000000000|@6598,I253,I251,I218,@2038,@6370,@6175,@6456,@6597,@6573,I11| 6597:O1|@6599 6598:S38|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629 6599:D18,564|00842d372e23092a3b1a2c020e0c00032a3b1a23020c00032928291a1e020e0e0e0c00031a19020e0e0c000203032902012a2928261a04020e0c0003038c31037b323a33230634230a220c230e220d230f2b3b1ae2010e0e0e0c00032e3b1ad7010c00032b3b1acf010c00032d3b1ac7010c0003302c2e2c2e68051ac6011ac7011ac8010e0c0003291ac4010e0c00023b3e3b3b2d6805291ab9010e0e0c000203041ab301103b503b503b3b2b2f6b2217230c2a2a0c0002261002023b50321a9a010e0e0e0c000202013b1a9201220d691a90012a220d1a8e010e0e0e0c000429352a362a220f2b1a81010e0e0c00042c352d36221137221223092a3b1a38010e0c00032a3b1a2f010c00032928291a2a010e0e0e0c00031a25010e0e0c000203032902012a0402002a28251a0d010e0e0c0003034e22171a21010e0e0c00021a2d01221b690402002a221b221a2c1a22010e0e0e0c00055029352a362a6801220c2a220f6a220d35220e37220f392e362f382d2b2e2c2f6805220d30452a46260e020a2f3b326a2a2a4531465129352a36221937221a23092a3b1a9a000e0e0e0c00032a3b1a8f000c00032928291a8a000e0e0e0c00031a85000e0e0c000203032902012a29283e1a70000e0c00030342221e1a85000e0e0c000204020022222a2222222222221a8d000e0e0c00065029352a36332b6933353437220c392d362e382d2b2e2c2f6805222a30452a46270b020a2f3b6922202a45304664271a1f050e0e0e0e0e0e000000002c02000000000000|@6601,I253,I251,I218,@6602,@6184,@6187,@6603,I105,@1784,@6175,@6605,@6399,@6401,@6407,@6600,@6463,@6597| 6600:D2,44|00802b283e1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6601:S48|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629636f6e73747273283129 6602:S62|60606f702727206d6179206e6f7420617070656172206265666f7265206120636f6e7374727563746f7220696e20612073706563696669636174696f6e2e 6603:O1|@6604 6604:D8,116|00802b1a72000e0e0e0c00021a6d000e0e0c0002034e2b352c36293b1a61000e0e0c000303183e2b69291a4b000c000203041a4f00103b50293b696402233e2b69291a33000c000203041a3700103b502a1a34000e0c00021a31002a692b2a69666502031a290042000000006c00000000000000|@6200,I105,I218,I251,@1784,@6603,@1058,@6199| 6605:D2,60|00802b283e1a38000e0c000303033c020b2b28251a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6606:D2,44|00802b28421a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6607:D2,44|00812c561756281a26000e0e0e0c00042c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6608| 6608:O1|@6609 6609:D14,220|00820403003b2a1ad6000e0e0e0c00035029352a362b372b2b2b6a3c2a321ac3000c00041ac10034691ac0002a341abf000c000429352a362a220d2b1ab5000e0e0c00042c352d36220f37221023092a3b1aa4000e0c00032a3b1a9b000c00032928291a96000e0e0e0c00031a91000e0e0c000203032902012a2928111a7c000e0c00032705030a220f1a77000c0002021728111a71000e0e0c00022922111a6a000e0e0e0c00036404020022132d34220d2f22172f22181a55000e0e0c00095029352a362a2a692711440e0e0e0e0e00000000d400000000000000|@6611,@6351,@6428,@6610,@6453,@6401,@6407,I253,I251,I218,@6175,@6396,@6370,@6595| 6610:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6611:S41|50415253455f44454328292e7061727365446563283329646174617479706542696e64696e67283229 6612:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6539| 6613:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6614:D54,612|00802b0a4300880047023a022f02e8002402ed00170291001501d10019010c02ff01f001e301a5000401d601cb01be01af00b101cd004c02a6019901a0008e018301f1002101df00290176016b0164015f015a01550150018c004b01e30046011d01db0025011101b400b900c300f600be00c80041010c01d600fb003c010001370108019b002d013201aa00960028070fdd1ad3010fdc1ad2010fd91ad1010fdd1ad0010fda1acf010fdc1ace010fdb1acd010fdd1acc010fdc1acb010fd91aca010fdd1ac9010fda1ac8010fdc1ac7010fdb28230fd91ac2010fdd1ac1010fda287d0fdd287b0fdd1ab8010fda1ab7010fdc282a0fdc1ab2010fd91ab1010fdd1ab0010fda285f0fdd283d0fdd287c0fdb1aa3010fdd283b0fdd283a0fdb282c0fd9285d0fdc285b0fdc28290fda28280fdd1a86010fdc1a85010fd91a84010fdd1a83010fda1a82010fdc1a81010fdb1a80010fdd1a7f010fdc1a7e010fd91a7d010fdd1a7c010fda1a7b010fdce4000204e000de001a720102d90204d500d3001a6b0102cecc000202c8001a640102c3c1000204bd00bb001a5b0102b60204b200b0001a540102aba9000204a500a3001a4b01029e02049a0098001a44010293910002048d008b001a3b0102868400020480007e001a320102790204750073001a2b01026e6c000204680066001a220102615f0002065b00590057001a17010252500002044c004a001a0e010245430002043f003d001a050102380204340032001afe00022d2b00020227001af7000222200002041c001a001aee000215020411000f001ae700020a08001ae40002031ae300420e0e000000005c02000000000000|@6616,@6617,@6618,@6619,@6331,@6318,@2043,@6307,@5438,@6267,@5424,@6323,@2000,@2002,@6295,@1042,@6620,@2145,@6621,@6622,@6623,@6297,@6320,@3387,@2347,@2038,@3059,@6280,@6287,@6315,@6328,@6300,@2094,@5419,@6311,@3055,@5416,@5418,@3053,@3057,@6290,@6309,@2587,@2355,@3051,@3061,@6284,@2063,@6273,@6305,@6330,@6325,@6276,@6615| 6615:S12|3c6964656e7469666965723e 6616:S15|53796d626f6c732e72657072283129 6617:S14|756e6b6e6f776e2073796d626f6c 6618:S15|3c6368617220636f6e7374616e743e 6619:S15|3c776f726420636f6e7374616e743e 6620:S15|3c7265616c20636f6e7374616e743e 6621:S18|3c696e746567657220636f6e7374616e743e 6622:S17|3c737472696e6720636f6e7374616e743e 6623:S17|3c74797065206964656e7469666965723e 6624:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6625:D2,60|00802b280f1a38000e0c000303033c020b2b281a1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6626:D1,28|00802b56180c0002502b56172c800002000000001400000000000000|@6627| 6627:S35|50415253455f44454328292e6d6b4c6f63616c426f6479466978456e76283429283129 6628:O2|@6629,@6385 6629:D23,1892|00852f373023092a3b1a5c070e0c00032a3b1a53070c00032928291a4e070e0e0e0c00031a49070e0e0c000203032902012a2928221a34070e0c000303033c021b2928061a25070e0e0c000303033c020b2928181a15070e0e0c000303033c020b2928351a05070e0e0c00031a01070e0e0c0002270503a11af906301af9060e0e0c0003502f373023092a3b1ad9060e0e0c00032a3b1acf060c00032928291aca060e0e0e0c00031ac5060e0e0c000203032902012a29340e0c000203033c023b2928221aa5060e0e0c000303033c021b2928061a95060e0e0c000303033c020b2928181a85060e0e0c000303033c020b2928351a75060e0e0c00031a71060e0e0c00022705030e2f1a70060e0c0002501e8c3b02013b02013b1a6306306931230632230a33230f2a3b1a3b060c00032a3b1a33060c0003220d37220e23092a3b1a24060e0c00032a3b1a1b060c00032928291a16060e0e0e0c00031a11060e0e0c000203032902012a0402002a28221af9050e0e0c000307cf22131afd050e0e0c00022215362216370403003b2a1af2050e0e0e0c00035029362a371ae8052e2b6a2b2a2f6a1ae205221b692a221d2b221c221c121c00010001000e0c0006221d37221e23092a3b1a9c050e0c00032a3b1a93050c00032928291a8e050e0e0e0c00031a89050e0e0c000203032902012a29281a1a74050e0c00032705030a221d1a77050c00020217281a1a81050e0e0c000229221f1a5e050e0e0e0c0003641a7005221e690402002e22212c2c2221222122200c000750293522213a2222230e2a3b1a2105020288000e0e0c00032a3b1a13050c0003222537222623092a3b1a04050e0c00032a3b1afb040c00032928291af6040e0e0e0c00031af1040e0e0c000203032902012a29280f1adc040e0c00032705030a22251adf040c00020217280f1ae9040e0e0c00022922271ac6040e0e0e0c000364221d2c221c2d221d68053c30220c2c6b22152a452b4626160fd12a28351a93040c000307c822131a99040e0e0c00022215362216370403003b2a1a8e040e0e0e0c00035029362a371a94042e2b6a2b2a2f6a1a8e04221b692a221d2b221c221c121c00010001000e0c0006221d3a221e230e2a3b1a38040e0c00032a3b1a2f040c000322182b22172c22186805222237222323092a3b1a16040e0e0e0c00032a3b1a0b040c00032928291a06040e0e0e0c00031a01040e0e0c000203032902012a29280f1aec030e0c00032705030a22221aef030c0002021b280f1af9030e0e0c00022922241ad603020494031f000e0c0003643c28403b1aec030e0c00043e312d2c6b22122a452d4626130fd51ada032213691ad8032a22161ad6030e0e0e0c000429352a36221723062218230a2219230f2a3b1a77030c00032a3b1a6f030c0003221c37221d23092a3b1a60030e0c00032a3b1a57030c00032928291a52030e0e0e0c00031a4d030e0e0c000203032902012a2928211a38030e0c000307d022211a3d030e0e0c0002220c2223220d1a63030c0004222337222423092a3b1a0c030e0c00032a3b1a03030c00032928291afe020e0e0e0c00031af9020e0e0c000203032902012a29282f1ae4020e0c0003033b22283a2229230e2a3b1ace0202029c020e0e0e0c00032a3b1abf020c000322142b22132c221468053c28403b1ae3020c00043e3b2c2c6b27060fd31ae802222869222937222a23092a3b1a8d020e0e0c00032a3b1a83020c00032928291a7e020e0e0e0c00031a79020e0e0c000203032902012a2928361a6402020212020e0c000303033c02af29280c1a51020e0e0c000303033c029f2928141a41020e0e0c000303033c028f2928271a31020e0e0c000303033c027f2928241a21020e0e0c000303033c026f29281d1a11020e0e0c000303033c025f29281c1a01020e0e0c000303033c024f2928231af1010e0e0c000303033c023f2928121ae1010e0e0c000303033c022f293c1ad2010202af000e0e0e0c000303033c021b29283b1abd010e0e0c000303033c020b29283d1aad010e0e0c00032705036d222a36222b370403003b2a1aae010e0e0e0c00035029362a371ad4012e2b6a2b2a2f6a2922313222302230123000010001000e0e0e0c000622313a2232230e2a3b1a5c010e0c00032a3b1a53010c0003221d2b221c2c221d68053c28403b1a77010c00043e302c2c6b270e0217040200222b222b2c2c222b222b222a0e0c0007502935646422293a222a230e2a3b1a0f010c00032a3b1a07010c0003222d37222e23092a3b1af8000e0c00032a3b1aef000c00032928291aea000e0e0e0c00031ae5000e0e0c000203032902012a29282f1ad0000e0c00032705030a222d1ad3000c00020217282f1add000e0e0c000229222f1aba000e0e0e0c0003642217352218372219392b2f2c302d68053c28403b1ac4000e0c00043c28403b1ab9000e0e0c00043c28403b1aad000e0e0c00043c28403b1aa1000e0e0c0004220d22212d2d303222253068083b2a6922252a4530462618021a3c28403b1a7b000c00043f220d2b220e6b22102a45220d462603260e29352a362a2a221522182215221b22131a6f0022187b091700080e0e0e0e000000005c07000000000000|@6631,I253,I251,I218,@6632,@6370,@6175,@6633,@6351,@6634,@6635,@6396,@6636,@6637,@6638,I11,@6639,@6399,@6401,@6407,@6640,@6641,@6630| 6630:O1|@6642 6631:S35|50415253455f44454328292e706172736544656328332973747275637456616c283329 6632:S29|737472756374206f722066756e63746f72206170706c69636174696f6e 6633:D2,60|00802b401a39000e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6634:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6635:D2,92|00802b280f1a58000e0c000303033c020b2b281a1a49000e0e0c000303033c02272b401a3a000e0e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000005400000000000000|@6367,I251| 6636:D2,76|00802b280f1a48000e0c000303033c02272b401a3a000e0e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6637:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6638:D2,76|00802b280f1a48000e0c000303033c02272b401a3a000e0e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6639:D2,76|00802b28211a48000e0c000303033c02272b401a3a000e0e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6640:D2,92|00802b280b1a58000e0c000303033c020b2b282f1a49000e0e0c000303033c02272b401a3a000e0e0e0c000303033c02172b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000005400000000000000|@6367,I251| 6641:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6642:D8,324|00862e372f23092a3b1a3c010e0c00032a3b1a33010c00032928291a2e010e0e0e0c00031a29010e0e0c000203032902012a29401a15010e0e0c0003036e331a12010e0e0e0c000204020033220d342c220f1a03010c00065029352a363c28403b1af8000e0c00043c28403b1aed000e0e0c000422132d3c2e2e2e68063d2a69221435221537221639303631382d2b2e2c2f68052f2a221b221b221b221b221b1abd00221c0e0e7b091c00082928091a9a000e0e0e0c0003036e331a96000e0e0e0c000204020033220d342c220f1a87000c00065029352a363c28403b1a7c000e0c00043c28403b1a71000e0e0c000422132d3b2e2e2e68063d2a69221435221537221639303631382d2b2e2c2f68052f2a221b221b221b221b221b1a4100221c0e0e7b091c000834220e45220d4627051f070e0e0e0e0e000000003c01000000000000|@6643,I253,I251,I218,@6175,@6416,I11,@6630| 6643:S51|50415253455f44454328292e706172736544656328332973747275637456616c283329646f436f6e73747261696e7473283229 6644:D2,36|00843b2e3056373030220c1a1a00327b090700080e0e0e0e000000001c00000000000000|@6646,@6645| 6645:O1|@6647 6646:S32|50415253455f44454328292e7061727365446563283329737472446563283329 6647:D9,516|00861a0302316930373123092a3b1afb010c00032a3b1af3010c00032928291aee010e0e0e0c00031ae9010e0e0c000203032902012a2928301ad4010e0c000327050318301ad0010e0c00023b3333333333331ac601347b090b000830373123092a3b1aa6010e0e0e0c00032a3b1a9b010c00032928291a96010e0e0e0c00031a91010e0e0c000203032902012a2928231a7c010e0c000303033c020b2928361a6d010e0e0c0003270503222c312b3131340e0e0e0c00063b3333333333331a5a010e0e0e0c00082a2a69650fd730373123092a3b1a34010e0c00032a3b1a2b010c00032928291a26010e0e0e0c00031a21010e0e0c000203032902012a29280c1a0c010e0c000303033c029f2928141afd000e0e0c000303033c028f2928271aed000e0e0c000303033c027f2928241add000e0e0c000303033c026f29281d1acd000e0e0c000303033c025f29281c1abd000e0e0c000303033c024f2928231aad000e0e0c000303033c023f2928121a9d000e0e0c000303033c022f293c1a8e000e0e0e0c000303033c021f29283b1a7d000e0e0c000303033c020f29283d1a6d00020249000e0e0c00032705033f0402002a323c302d34341a63000c00085029352a363c28403b1a58000e0c00043b2c2b2d6b3b220e220e220e220e220e220e1a37000c00082a2a69270602013b641f070e0e0e0e0e00000000fc01000000000000|@6649,@6648,I253,I251,I218,@6175,@6645,@6382,I11| 6648:D2,236|00802b28361ae8000e0c000303033c02bb2b280c1ad9000e0e0c000303033c029b2b28141ac9000e0e0c000303033c028b2b28271ab9000e0e0c000303033c027b2b28241aa9000e0e0c000303033c026b2b281d1a99000e0e0c000303033c025b2b281c1a89000e0e0c000303033c024b2b28231a79000e0e0c000303033c023b2b28121a69000e0e0c000303033c022b2b3c1a5a000e0e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b283d1a39000e0e0c000303033c020b2b28301a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000e400000000000000|@6367,I251| 6649:S42|50415253455f44454328292e706172736544656328332973747244656328332967657444656373283129 6650:O1|@6651 6651:D2,220|00802b280c1ad8000e0c000303033c029b2b28141ac9000e0e0c000303033c028b2b28271ab9000e0e0c000303033c027b2b28241aa9000e0e0c000303033c026b2b281d1a99000e0e0c000303033c025b2b281c1a89000e0e0c000303033c024b2b28231a79000e0e0c000303033c023b2b28121a69000e0e0c000303033c022b2b3c1a5a000e0e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b283d1a39000e0e0c000303033c021b2b28231a29000e0e0c000303033c020b2b28361a19002d7e030003420e0e0e00000000d400000000000000|@6367,I251| 6652:O1|@6653 6653:D6,100|00832d23062e230a2f230f2a3b1a58000e0c00032a3b1a4f000c0003321a4c000e0c00023d1a4800220c1a4700220e220e220e221268051a3e000e0e0e0c000529352a3629362a38332b322c3368053c2e2b6a270c1f040e000000005c00000000000000|@6655,I253,@6175,@6509,@6654,@6430| 6654:D2,44|00812c561756285639564a1a22000e0e0e0c00062c2a35452a364664430e0e0e000000002400000000000000|@6394,@6656| 6655:S38|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329 6656:O1|@6657 6657:D15,220|00841adb001adc00301adc000e0c000429352a362a322b1ad2000e0e0e0c00042c3633373423092a3b1ac4000e0c00032a3b1abb000c00032928291ab6000e0e0e0c00031ab1000e0e0c000203032902012a2928111a9c000e0c00032705030a331a98000e0c0002021728111a91000e0e0c000229220c1a8a000e0e0e0c0003641a8400346904020033220e2c2c220f1a79000e0e0c00065029352a362e352f3730392c362d382d2b2e2c2f6805220f352210363c28401a56001a57000c00042c2c2b2d220e6805292e6927141f050e00000000d400000000000000|@6659,@6554,@6509,@6401,@6407,I253,I251,I218,@6175,@6396,@6370,@6660,@6416,@6658,I11| 6658:O6|@6662,@6666,0,0,@6661,0 6659:S49|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329646f536967446563283129 6660:D2,60|00802b3d1a39000e0e0c000303033c020b2b280f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6661:O1|@6667 6662:O3|0,@6664,@6663 6663:O10|0,0,0,0,0,0,0,0,0,0 6664:O1|@6665 6665:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 6666:S11|3c756e646566696e65643e 6667:D2,20|00801a1300100e0e000000000c00000000000000|@6669,@6668| 6668:O4|11,@316,0,@6670 6669:S35|5349474e41545552455328292e756e646566696e65645369676e61747572652d283129 6670:O5|@6671,177,0,177,0 6671:S34|6d6c736f757263652f4d4c436f6d70696c65722f5349474e4154555245532e736d6c 6672:O1|@6673 6673:D2,28|00802b28331a18002d0e0e0e7e030003000000001400000000000000|@6674,I251| 6674:S22|53796d5365742e7369676e617475726553792d283129 6675:O1|@6676 6676:D6,100|00842e23062f230a30230f2a3b1a58000e0c00032a3b1a4f000c0003331a4c000e0c00023d1a4800220d1a4700220e2210220f2213221068061a3c000e0c000529352a3629362a38332b322c3368053b2e2b6a270c1f050e000000005c00000000000000|@6678,I253,@6175,@6389,@6677,@6430| 6677:D2,44|00812c561756285639564a565b1a20000e0c00072c2a35452a364664430e0e0e000000002400000000000000|@6394,@6679| 6678:S36|50415253455f44454328292e706172736544656328332966756e63746f72446563283329 6679:O1|@6680 6680:D22,1372|00851a5b0530691a5a052a311a59050e0e0c000429352a362a332b1a4e050e0e0e0c00042c352d36220c37220d23092a3b1a3c050e0c00032a3b1a33050c00032928291a2e050e0e0e0c00031a29050e0e0c000203032902012a2928211a14050e0c00032705030a220c1a0f050c0002021728211a09050e0e0c000229220e1a02050e0e0e0c0003641afc04220f69220e37220f23092a3b1ad5040e0e0c00032a3b1acb040c00032928291ac6040e0e0e0c00031ac1040e0e0c000203032902012a29282f1aac040e0c000327050356220e3a220f23062210230a2211230e2212230f2b3b1a88040e0c00032e3b1a7f040c00032b3b1a77040c00032d3b1a6f040c0003302c2e2c2e68053b3b2b6a3c28403b1a76040e0e0e0c00041a71042a2c6a270c0fcd220e37220f23092a3b1a3e040e0e0e0c00032a3b1a33040c00032928291a2e040e0e0e0c00031a29040e0e0c000203032902012a29281b1a14040e0c000303033c026b2928311a05040e0e0c000303033c025b2928361af5030e0e0c000303033c024b2928121ae5030e0e0c000303033c023b29283d1ad5030e0e0c000303033c022b2928101ac5030e0e0c000303033c021b29283b1ab5030e0e0c000303033c020b29280c1aa5030e0e0c00032705036a220e2306220f230a2210230f2a3b1a87030c00032a3b1a7f03020201010c0003221122143022151a92030e0e0e0c000522143a2215230e2a3b1a5c030e0c00032a3b1a53030c0003322b312c3268053b2f2b6a3c28403b1a5a030e0e0e0c00041a55032a2c6a270d02b41a53032210691a19032a22111a17030c000429352a362a22132b1a0d030e0e0c00042c35221437221523092a3b1afe020e0e0e0c00032a3b1af3020c00032928291aee020e0e0e0c00031ae9020e0e0c000203032902012a2928091ad4020e0c00032705030a22141acf020c0002021728091ac9020e0e0c00022922161ac2020e0e0e0c0003641ad002221769040200221522182c2c221a1ac3020c00065029353c28403b1aa2020e0e0e0c00042e2a2c6a270b220f37221023092a3b1a6e020e0e0e0c00032a3b1a63020c00032928291a5e020e0e0e0c00031a59020e0e0c000203032902012a29282f1a44020e0c00032705030a220f1a3f020c00020217282f1a39020e0e0c00022922111a32020e0e0e0c000364221037221123092a3b1a0b020c00032a3b1a03020c00032928291afe010e0e0e0c00031af9010e0e0c000203032902012a29401ae5010e0e0c0003033222151ae1010e0e0c00021a0102221869040200221622192c2c221b1aec010e0c00065029352a362a3c2b6a296801270602412928091aa6010e0e0e0c0003033222151aa1010e0e0c00021ac501221869040200221622192c2c221b1aac010e0c00065029352a362a3b2b6a296801270602013b221637221723092a3b1a5b010c00032a3b1a53010c00032928291a4e010e0e0e0c00031a49010e0e0c000203032902012a2928111a34010e0c00032705030a22161a2f010c0002021728111a29010e0e0c00022922181a22010e0e0e0c00036404020022162219221b2c2219221c1a32010e0e0e0c00075029352a36220e35220f372210392c362d382d2b2e2c2f6805331a13010c00021ad5000e0e0c0002032e333529352a362b373c28403b1ad3000c00043c28403b1ac9000e0e0c0004220d2e2e2e2e2e68063d2a692707020130343b1a96000e0e0e0c00031a91000e0e0c00023c28403b1a99000e0e0c00043c28403b1a8d000e0e0c00043c28403b1a81000e0e0c00043c28403b1a75000e0e0c00043c28403b1a69000e0e0c00043c28403b1a5d000e0e0c00042219313322203133220c222333220c3434680c29336927241f060e0e000000005405000000000000|@6682,@6683,@6399,@6401,@6407,I253,I251,I218,@6175,@6396,@6370,@6684,I11,I48,@6417,@6685,@6686,@6416,@6687,@6681,@6628,I105| 6681:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6682:S49|50415253455f44454328292e706172736544656328332966756e63746f72446563283329646f46756e6374446563283129 6683:D2,76|00802b28111a48000e0c000303033c021b2b401a3a000e0e0e0c000303033c020b2b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6684:D2,60|00802b280b1a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6685:D2,76|00802b28091a48000e0c000303033c02272b280b1a39000e0e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6686:D2,76|00802b28311a48000e0c000303033c02272b280b1a39000e0e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6687:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6688:O1|@6689 6689:D2,28|00802b28151a18002d0e0e0e7e030003000000001400000000000000|@6690,I251| 6690:S20|53796d5365742e66756e63746f7253792d283129 6691:D43,2348|00862e353003033c0fd731373223092a3b1a1c090e0c00032a3b1a13090c00032928291a0e090e0e0e0c00031a09090e0e0c000203032902012a29280c1af4080e0c000303033c029f2928141ae5080e0e0c000303033c028f2928271ad5080e0e0c000303033c027f2928241ac5080e0e0c000303033c026f29281d1ab5080e0e0c000303033c025f29281c1aa5080e0e0c000303033c024f2928231a95080e0e0c000303033c023f2928121a85080e0e0c000303033c022f293c1a76080e0e0e0c000303033c021f29283b1a65080e0e0c000303033c020f29283d1a5508020207000e0e0c0003270507cd31373223092a3b1a3a080e0e0e0c00032a3b1a2f080c00032928291a2a080e0e0e0c00031a25080e0e0c000203032902012a220d3a220e2306220f230a2210230e2211230f2b3b1afa070e0e0e0c00032e3b1aef070c00032b3b1ae7070c00032d3b1adf070c0003302c2e2c2e68053328271ad3070c000307d222171ad1070e0e0c0002221837221923092a3b1ab4070e0c00032a3b1aab070c00032928291aa6070e0e0e0c00031aa1070e0e0c000203032902012a2928111a8c070e0c000303033c021f2928061a7d070202a4060e0e0c000303033c020b2928181a69070e0e0c00032705035d0402002b2a221b221d1a60070e0c00055029352a3629362a38220e2b220c2c220c68053c28403b1a46070e0e0e0c00043c28403b1a39070e0e0c00043c28403b1a2d070e0e0c0004302d2d2d2d680528142a6922202a452f46270b023128181a120702022b000e0e0e0c000229221a1a06070e0e0e0c00035022191aea060e0e0e0c00025022161af206452c4664640fca3328241ac9060e0e0c0003031222172216221622161ad70622167b0619000533281d1aaa060e0e0e0c0003031222172216221622161ab70622167b0619000533281c1a8a060e0e0e0c0003031222172216221622161a970622167b061900053328231a6a060e0e0e0c000307cc22171a65060e0e0c00022216362217370403003b2a1a6e060e0e0e0c00035029362a371a64062e2b6a2b2a2f6a1a5e06222169292b22221a5806222022201a55060e0e0c0007222137222223092a3b1a0c060e0c00032a3b1a030602022a050c00032928291afa050e0e0e0c00031af5050e0e0c000203032902012a29281a1ae0050e0c00032705030a22211adb050c00020217281a1add050e0e0c00022922231ad6050e0e0e0c0003641aec05221b316a292f346a1ae505222669292b22271acf05222522251acc050202b9000e0c000722263a2227230e2a3b1a80050e0c00032a3b1a77050c0003221b2b22192c22196805222b37222c23092a3b1a5e050e0e0e0c00032a3b1a53050c00032928291a4e050e0e0e0c00031a49050e0e0c000203032902012a29280f1a34050e0c00032705030b222b1a2f050c0002500216280f1a30050e0c000229222d1a2a050e0e0e0c000351331a47050c00022f1a44050e0c00023c28403b1a05050e0e0c00042a2c3c2f2d680528132a69222d2a452f4627190fcc3328121ad5040e0e0c0003034422171ad1040e0e0c0002040200221a1a0405221b221a6a2b22171afd040e0e0c00055029352a3629362a38220e2b220c2c220c680528092e2b6a221c2a452b4627080fcf333c1a85040e0e0c000307d822171a81040e0e0c00021ac104221a690402002a1abb042217692b22181aaa040e0e0e0c0005502935221b37221c23092a3b1a45040e0e0c00032a3b1a3b040c00032928291a36040e0e0e0c00031a31040e0e0c000203032902012a2928421a1c040e0c0003033022201a1904020234030e0e0c0002501a5c042222690402002a1a5604222222206a2b22201a3b040c00055029356502013b222137222223092a3b1ad5030e0e0c00032a3b1acb030c00032928291ac6030e0e0e0c00031ac1030202e0020e0e0c000203032902012a2928411aa8030202f3000e0c00032705030a22211a9f030c0002021728411aa1030e0e0c00022922231a9a030e0e0e0c0003641ad80322246929222222251a9d03222322231a9a030e0e0e0c000722243a2225230e2a3b1a50030e0c00032a3b1a47030c000322192b22172c22176805222937222a23092a3b1a2e030e0e0e0c00032a3b1a23030c00032928291a1e030e0e0e0c00031a19030e0e0c000203032902012a29280f1a04030e0c00032705030b22291aff020c0002500216280f1a00030e0c000229222b1afa020e0e0e0c0003512e1a3b030c00023c28403b1add020e0e0c00042a2c22123c220e2e68063b2a69222a2a452e4627160fcd33280c1aab020c00030316221822163b2c221822171a010322180e0e7b0819000733283b1a8a020e0e0e0c0003034422171a85020e0e0c0002040200221a1adc02221922176a2b22171ab1020e0e0c00055029352a3629362a38220e2b220c2c220c6805281a2e2b6a221c2a452b4627080fd03328141a38020e0c000303a522171a35020e0e0c00020404003b2a1a90020e0c00035029352a372b380404003b2a1a7d020e0e0c00035029352a362b37221e35221f361a6c02302d6a2b2b2b6a2f2f2f6a3c2a22221a5e02020209010e0e0e0c000404020022281a500222292f1afe012228222868062b22251a0e020e0e0e0c00055029352a3629362a38221c2b221a2c221a6805220e220d692213221369280c302c2c2f6805222c2a452d46271802b433283d1a87010c000303a122171a85010e0e0c00020404003b2a1ae001020293000e0c00035029352a372b380404003b2a1ac9010e0e0c00035029352a362b37221e35221f361ac401302d6a2b2b2b6a2f2f2f6a3c2a22221aaa010e0e0e0c00041aad012228690402002a3b2b222b311a4a01222a222a1a9b010c00095029352a3629362a38221d2b221b2c221b6805220f220e692214221469281c302c2c2f6805222d2a452d462719020822141af800452a46270f02b70404003b2a1a3d010e0e0c00035029352a372b380404003b2a1a29010e0e0c00035029352a37220d35220e362a2a306a0402002a22152b22161ac900221422141a1e010e0e0e0c00085029352a363c28401a11011a8e000e0e0e0c00043c28401a06011a7f000c00043c28401afe001a73000c00041af9002b2d1af8002d6805280e2a693c28403b1a5a000e0e0e0c00042a31312c3b6805293b69220f220f692214221469281c2c2c2c220e6805221d2a45220c462718641f070e0e0e0e0e0e0e000000002409000000000000|@6693,I253,I251,I218,@6175,@6694,I11,@6396,@6370,@3454,@6697,@6351,@6723,@6724,@6382,@6725,@6729,@6730,@6731,@6733,@6735,@6576,@6745,@6746,@6747,@6748,@6749,@6750,@6588,@6752,@6533,@6753,@6428,@6755,@6945,@6946,@6947,@6761,@855,@6741,@6951,@6692,@6406| 6692:S2|6974 6693:S29|50415253455f44454328292e7061727365446563283329646563283429 6694:O1|@6695 6695:D8,180|00832c372d23092a3b1aac000e0c00032a3b1aa3000c00032928291a9e000e0e0e0c00031a99000e0e0c000203032902012a2928111a84000e0c000303033c021b2928061a75000e0e0c000303033c020b2928181a65000e0e0c0003270503411a61002c2e1a60000e0c000429352a360402002a2a32321a52000e0e0e0c00055029352a363c28403b1a44000e0c00042e2a2f6a292d69220d2a452d46270902052d3b452f461f0400000000ac00000000000000|@6696,I253,I251,I218,@6554,@6401,@6694,I11| 6696:S36|50415253455f44454328292e706172736544656328332964656328342976617273283129 6697:O1|@6698 6698:D11,516|00832e372f23092a3b1afc010e0c00032a3b1af3010c00032928291aee010e0e0e0c00031ae9010e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1ac0010e0c00032e3b1ab7010c00032b3b1aaf010c00032d3b1aa7010c0003302c2e2c2e680522141aa4010e0c000234281d1a92010e0e0e0c000303103b22161a90010e0c00033c2a6964023534281c1a74010e0c000303103b22161a74010e0c00033b2a696402193428241a58010e0c000303043b5002041a5b01103b501a5901221637221723092a3b1a35010e0e0c00032a3b1a2b010c00032928291a26010e0e0e0c00031a21010e0e0c000203032902012a2928111a0c010e0c000303033c021b2928061afd000e0e0c000303033c020b2928181aed000e0e0c00031ae9000e0e0c0002270503911af10022171af0000e0c000350221637221723092a3b1abf000c00032a3b1ab7000c00032928291ab2000e0e0e0c00031aad000e0e0c000203032902012a2922190c000203033c022b2928111a8d000e0e0c000303033c021b2928061a7d000e0e0c000303033c020b2928181a6d000e0e0c00031a69000e0e0c00022705030e22161a5f000c0002501e7c3b02013b02013b0402002d2a221a2218221b301a5b000c00075029352a3629362a3822102b220e2c220e68052807312f2c6b221c2a452b4627191f040e00000000fc01000000000000|@6700,I253,I251,I218,@6175,@6701,@6717,@976,@6720,@6370,@6699| 6699:O1|@6721 6700:S32|50415253455f44454328292e7061727365446563283329666978697479283229 6701:O1|@6702 6702:D20,396|00812b372c23092a3b1a84010e0c00032a3b1a7b010c00032928291a76010e0e0e0c00031a71010e0e0c000203032902012a29281e1a5c010e0c000307cf3036293b1a4b010c0003291a50010e0c00021a4d012b2b6a3b2a3c1a48010e0c0004291a44010e0c00021a2d010e0e0c0002030a293529352968016502013b293b1a12010e0e0e0c000303041a1f01103b503b502935293b1a17010c000303033c020b2928091a0d010e0e0c000303b6220e3a220f23062210230a2211230e2212230f2b3b1aca000e0e0e0c00032e3b1abf000c00032b3b1ab7000c00032d3b1aaf000c0003302c2e2c2e6805221836293b1a9d000e0e0c00031abd002a1abd000e0e0c0003291ab8001ab100020267000e0e0c0003291aac001aad000e0e0c0003291aa8000e0c00023b3e3b3b2d6805291a75000e0e0c000203041a9300103b503b503c3b2b336b2220382221230c2a3b3c1a80000e0c0004502b2a0e0e0c0002261502023b50220e1a6d000e0e0c00025029270702013b2705430e0e0e0e0e0e000000008401000000000000|@6704,I253,I251,I218,I223,@6705,@6707,I105,@2309,I234,I233,@6716,@389,@6703,@6184,@6187,@6373,@1784,I255,@6175| 6703:S37|206e6f7420616c6c6f7765642c206d757374206265206265747765656e203020616e642039 6704:S48|50415253455f44454328292e7061727365446563283329666978697479283229676574507265636564656e6365283129 6705:D5,92|00802b56181a58000e0c000303033b023a56071a4e000e0e0e0c00020304560702172b3f1a41000e0e0c000356172a1a3a000e0e0e0c0003642c3c1a2a000e0e0e0c00032a2a6929680166420e0e0e0e000000005400000000000000|@6706,I251,I105,I239,I252| 6706:S29|537472696e674376742e7363616e537472696e67283229726472283129 6707:O9|@6708,268435456,7,1000000000,9,134217728,9,536870912,29 6708:D7,324|00820403002c3d1a3e010e0e0e0c0003030d2928104556274656284750023a2c3c1a24010e0c0003030c294045562946562a475002232c3e1a0d010e0e0c0003030d29280845562b46562c4750020a293d45562d46562e475029352f2f0c0002291ae8000e0c00021ae5000e0e0c000203c1293529352a3628092b1ad6000e0e0e0c0003030c2a280d1ac8000e0c000302013b03033c020c2a28201aaa000e0e0e0c0003030a29333332347b050b00042a282b1a92000e0e0e0c0003030e292e341a9400340e0e7b050b00042a282d1a76000e0e0e0c000303033c020b2a287e1a65000e0e0c00030338292e341a68000e0c0004291a54000e0c00021a51000e0e0c00020318293529352a362a1a4c000e0c0002292b69296801270502013b64020e332e341a3000340e0e7b050b00046602013b66440e0e000000003c01000000000000|@6710,I251,I105,I218,I248,@6709,I111| 6709:O1|@6711 6710:S11|496e742e7363616e283329 6711:D11,380|00822c28101a78010e0c000303c82d2c0e0c0002291a6c010e0c00021a69010e0e0c000203ac293529352a362a28301a5a010e0e0e0c00031a4d010e0e0c0002030e3b3b33321a4701330e7b0609000529300e0e0e0c0002291a28010e0c00021a25010e0e0c0002035d293529352a362a28781a16010e0e0e0c000303033c020b2a28581a05010e0e0c000303253b3b2b220d1afa000e0e0e0c0005293b1aeb000c000303093b2f69296801640201296402113b3b220e220d1ad400220e0e7b060d00056602073b2b6929680164270402013b6402963b3b2f292f0e0e0c0002291aa0000e0c00021a9d000e0e0c0002036b293529352a362a28301a96000e0e0e0c000303152830341a8c000e0c00032b2a1a87000c00036402013b032f2e341a7d000e0e0c0003292c1a6b000c00032928301a6e000e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b2704440e0e0e000000007401000000000000|@6713,I113,I105,I218,I251,@6712,I231,I106,I234,I108,I107| 6712:O1|@6714 6713:S25|496e742e7363616e283329726561645f6e756d626572283129 6714:D9,324|00832c2c0e0c0002291a3c010e0c00021a39010e0e0c000207cb293529352a362a28301a2a010e0e0e0c0003030c2a28391a20010e0c000302013b032f3128101a15010e0e0c0003292c1a0f010c00032928301a0a010e0e0e0c00033c2a2e220c1a0001220d0e7b060d00052a28411ade000e0e0e0c0003030c2a28461ad4000e0c000302013b03373128101ac9000e0e0c0003292c1ac3000c00032928411abe000e0e0e0c000329401aaf000c00033c2a2f220d1aac00220e0e7b060e00052a28611a8a000e0e0e0c0003030c2a28661a80000e0c000302013b033b3128101a7500020241000e0e0c0003292c1a6b000c00032928611a66000e0e0e0c000329401a57000c00033c2a2f220d1a5400220e0e7b060e00053203093131692968016402013b66020d2f03092e2e692968016402013b641f04000000003c01000000000000|@6715,I105,I218,I231,I232,I108,I106,I107,@6712| 6715:S29|496e742e7363616e283329726561645f6865785f646967697473283329 6716:S11|507265636564656e636520 6717:O4|@35,@863,@5471,@6718 6718:O5|@6719,555,0,555,0 6719:S32|6d6c736f757263652f4d4c436f6d70696c65722f50415253455f4445432e4d4c 6720:S8|5661726961626c65 6721:D8,204|00852e372f23092a3b1ac4000e0c00032a3b1abb000c00032928291ab6000e0e0e0c00031ab1000e0e0c000203032902012a2928111a9c000e0c000303033c021b2928061a8d000e0e0c000303033c020b2928181a7d000e0e0c0003270503561a79002e301a78000e0c000429352a362a322b1a6e000e0e0e0c00042c352d3632352b33692c2a69642a0e0e0e0c0002640402002b2a220f220f220f220f1a47000c00075029352a362e2b6922112a452b46270b02052f3b4531461f060e0e0e00000000c400000000000000|@6722,I253,I251,I218,@6554,@6401,@6407,@6699| 6722:S39|50415253455f44454328292e706172736544656328332966697869747928322976617273283129 6723:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6724:D2,60|00802b280f1a38000e0c000303033c020b2b281a1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6725:O1|@6726 6726:D7,372|00852e372f23092a3b1a6c010e0c00032a3b1a63010c00032928291a5e010e0e0e0c00031a59010e0e0c000203032902012a2928301a44010e0c0003270503182e1a40010e0c0002503030303030301a3601317b080800072e372f23092a3b1a16010e0e0e0c00032a3b1a0b010c00032928291a06010e0e0e0c00031a01010e0e0c000203032902012a29280c1aec000e0c000303033c029b2928141add000e0e0c000303033c028b2928271acd000e0e0c000303033c027b2928241abd000e0e0c000303033c026b29281d1aad000e0e0c000303033c025b29281c1a9d000e0e0c000303033c024b2928231a8d000e0e0c000303033c023b2928121a7d000e0e0c000303033c022b293c1a6e000e0e0e0c000303033c021b29283b1a5d000e0e0c000303033c020b29283d1a4d000e0e0c00032705032b1a510031690402002a313c342d3333220d0c00085029353333333333331a30000e0c00072a2a69270402013b1f060e0e000000006c01000000000000|@6728,I253,I251,I218,@6175,@6725,@6727| 6727:D2,220|00802b280c1ad8000e0c000303033c029b2b28141ac9000e0e0c000303033c028b2b28271ab9000e0e0c000303033c027b2b28241aa9000e0e0c000303033c026b2b281d1a99000e0e0c000303033c025b2b281c1a89000e0e0c000303033c024b2b28231a79000e0e0c000303033c023b2b28121a69000e0e0c000303033c022b2b3c1a5a000e0e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b283d1a39000e0e0c000303033c020b2b28301a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e00000000d400000000000000|@6367,I251| 6728:S43|50415253455f44454328292e706172736544656328332964656328342964656353657175656e6365283229 6729:D1,28|00802b56180c0002502b56172c800002000000001400000000000000|@6627| 6730:D2,44|00802b280f1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6731:O1|@6732 6732:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203212b352c363c28403b1a37000c00042b2a692b1a31000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,I11,@6731| 6733:O1|@6734 6734:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203212b352c363c28403b1a37000c00042b2a692b1a31000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,I11,@6733| 6735:D2,44|00812c561756281a26000e0e0e0c00042c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6736| 6736:O1|@6737 6737:D16,524|00822c372d23092a3b1a04020e0c00032a3b1afb010c00032928291af6010e0e0e0c00031af1010e0e0c000203032902012a2928261adc010e0c00032705030a2c1ad8010e0c000202013b1ad2012f691ad1012a301ad0010e0c000429352a362a322b1ac6010e0e0e0c00042c352d363437220c23092a3b1a95010e0e0c00032a3b1a8b010c00032928291a86010e0e0e0c00031a81010e0e0c000203032902012a2928111a6c010e0c000303c722101a69010e0e0c0002221137221223092a3b1a4c010e0c00032a3b1a43010c00032928291a3e010e0e0e0c00031a39010e0e0c000203032902012a2928261a24010e0c00032705030a22111a1f010c000202013b1a1e01221422141a1b010c000429352a3633353437220c392c362d382d2b2e2c2f68053c28401a04011a05010e0e0c00043c28401afe001af7000c00043c28401af6001aeb000c0004332b2d220c2d6805280e2a693c28401ada001ad3000c000422172a3b32221a2f6806293169271202852928251a99000e0e0c0003035d22101a95000e0e0c00021ab1002213692211370402002b22152c2c1aa4000e0c00055029352a363435220c37220d392c362d382d2b2e2c2f68053068013c28401a73001a6c000e0c000422142a2c2e22171a72006806292d69270f021b3c28401a53001a4c000e0c0004302a3b32331a5400680629316965270d440e0e0e000000000402000000000000|@6739,I253,I251,I218,@6175,@6740,@6554,@6401,@6407,@855,I11,@6741,@6742,@6738,@6463,@3454| 6738:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6739:S48|50415253455f44454328292e7061727365446563283329646563283429657863657074696f6e42696e64696e67283129 6740:D2,60|00802b28111a38000e0c000303033c020b2b28251a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6741:O7|@6666,2,@961,@1965,@690,0,0 6742:O1|@6743 6743:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6744:S26|50415253455f5452454528292e6d6b4964656e74283229283129 6745:D2,60|00802b28411a38000e0c000303033c020b2b28421a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6746:D2,36|00812c3b56271a1f000c00042c2a35452a364664430e0e0e000000001c00000000000000|@6571,@6608| 6747:D2,44|00802b28411a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6748:D2,44|00812c3b3b563756481a24000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6570| 6749:D2,44|00802b280f1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6750:O1|@6751 6751:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203212b352c363c28403b1a37000c00042b2a692b1a31000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,I11,@6750| 6752:D2,44|00812c3b3b563756481a24000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000002400000000000000|@6571,@6570| 6753:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d04000229356442000000002400000000000000|@6754,I251| 6754:S39|50415253455f44454328292e70617273654465632833296465632834296e6577456e762d283129 6755:D2,44|00812c561756285639564a565b1a20000e0c00072c2a35452a364664430e0e0e000000002400000000000000|@6571,@6756| 6756:O1|@6757 6757:D5,100|00850402003b2a3333333333331a58000e0c00095029352a363c28403b1a4c000e0c00043c28401a46001a3f000c00043c28401a3e001a33000c00043c28401a32001a27000c00042a2f2d30302e6806292f6927081f060e000000005c00000000000000|@6759,@6758,I11,@6741,@1965| 6758:O1|@6760 6759:S36|50415253455f44454328292e706172736544656328332964656328342966756e42283129 6760:D30,956|00871abb03316904020030322c2c220c1ab1030e0e0c00065029352a362a341aa6030e0e0e0c000329352a362b3722113b1a98030e0c000303033b0fcc22113529352a362a2e1a83030c000303033c024a2a1a7b030c00021a79030e0e0c000203142d1a6a030e0e0e0c00021a65030e0e0c000202013b03212a3b2f3b3f321a56030e0e0e0c00021a51030e0e0c00031a4d030e0e0c000602013b03043b5002bd22113a221223062213230a2214230e2215230f2b3b1a2b030c00032e3b1a23030c00032b3b1a1b030c00032d3b1a13030c0003302c2e2c2e68051a0a03220f1a09030e0e0c0003291a04031afd020e0e0c000329220e1af2020e0e0e0c0003291af0021ae502020220010e0e0c0003291ae4021ae5020e0e0c0003291ae0020e0c00023b3e3b3b2d6805291aa1020e0e0c000203041acb02103b503b503c3b2b336b2223382224230c2a3b3c1ab8020e0c0004502b2a0e0e0c00022615292d1aa9020e0e0c000303033b02bd22113a221223062213230a2214230e2215230f2b3b1a5f020c00032e3b1a57020c00032b3b1a4f020c00032d3b1a47020c0003302c2e2c2e6805220d3c1a63020c00031a61022a1a35020e0e0c0003291a58021a29020e0e0c0003220d3c1a42020e0e0e0c00032a2a1a13020c0003291a18021a19020e0e0c0003291a14020e0c00023b3e3b3b2d6805291ad5010e0e0c000203041aff01103b503b503c3b2b346b2224382225230c2a3b3c1aec010e0c0004502b2a0e0e0c0002271566220f37221023092a3b1aad010e0e0c00032a3b1aa3010c00032928291a82010e0e0e0c00031a81010e0e0c000203032902012a2928111a68010e0c0003030c22141aad010e0e0c00020257283d22151aa3010c000350221437221523092a3b1a57010c00032a3b1a4f010c00032928291a2e010e0e0e0c00031a2d010e0e0c000203032902012a2928381a14010e0c0003030c22191a59010e0e0c000202013b27051a540122176904020022162b2b221a2219221922191a43010c00085029352a36220f352210372211392c362d382d2b2e2c2f68053c28403b1a24010e0c00042214322c2c6b222137222223092a3b1ac6000e0e0e0c00032a3b1abb000c00032928291a9a000e0e0e0c00031a99000e0e0c000203032902012a0402002a283e1a7d000e0e0c0003032e22271ac1000e0e0c000250221a221a69296801292c222c222c222c222c222c222c1ab6000e0e0e0c000926030207293b45220f465029352a36312b692220352221372222392d362e382d2b2e2c2f6805223230452a46272a1f0800000000b403000000000000|@6762,@6763,@6764,@6855,I251,I105,I218,I223,I239,I154,I253,@6869,@389,@6870,@2031,@6184,@6187,@6373,@1784,I255,I113,@510,@6871,@6872,@6175,@6370,@6873,@6761,I11,@6758| 6761:O1|@6874 6762:S47|50415253455f44454328292e706172736544656328332964656328342966756e4228312962696e64696e6773283129 6763:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6764:O1|@6765 6765:D15,884|00842e372f23092a3b1a6c030e0c00032a3b1a63030c00032928291a5e030e0e0e0c00031a59030e0e0c000203032902012a2928261a44030e0c000303033c02cb2928201a35030e0e0c000303033c02bb29281f1a25030e0e0c000303033c02ab2928211a15030e0e0c000303033c029b2928081a05030e0e0c000303033c025b2928431af5020e0e0c000303033c024b29282b1ae5020e0e0c000303033c023b29281e1ad5020e0e0c000303033c022b2928341ac5020e0e0c000303033c021b2928061ab5020e0e0c000303033c020b2928181aa5020e0e0c000303033c022b2928061a95020e0e0c000303033c020b2928181a85020e0e0c000303033c020b29283c1a75020e0e0c00031a71020e0e0c0002270507d11a69022f1a69020e0e0c0003502e372f23092a3b1a49020e0e0c00032a3b1a3f020c00032928291a3a020e0e0e0c00031a35020e0e0c000203032902012a29330e0c000203033c0fcc2928261a15020e0e0c000303033c0fd02928201a05020e0e0c000303033c02c729281f1af5010e0e0c000303033c02b72928211ae5010e0e0c000303033c02a72928081ad5010e0e0c000303033c025f2928431ac5010e0e0c000303033c024f29282b1ab5010e0e0c000303033c023f29281e1aa5010e0e0c000303033c022f2928341a950102027b000e0e0c000303033c021b2928061a81010e0e0c000303033c020b2928181a71010e0e0c000303033c02332928061a61010e0e0c000303033c020f2928181a5101020219000e0e0c000303033c020f29283c1a3d01020205000e0e0c00031a35010e0e0c00022705030f2e1a34010e0c0002502038013b02013b02013b1a26012f693135323633370402002c2c2c1a1901220f220d1a1601221368051a13011a1401333022101a11010e0e0c000a5029352a36040200220d2c2c2c220f221422141aea001af7000c000950220e37220f23092a3b1ab7000c00032a3b1aaf000c00032928291aaa000e0e0e0c00031aa5000e0e0c000203032902012a2922130c00021a91000e0e0c0002270503611ab100220f1a88000e0c000350220e37220f23092a3b1a67000c00032a3b1a5f000c00032928291a5a000e0e0e0c00031a55000e0e0c000203032902012a2922130c00021a41000e0e0c00022705030e220e1a3f000c0002501e4c3b02013b02013b2a220e2a35452a3646270b1f050e000000006c03000000000000|@6767,I253,I251,I218,@6768,@6370,@6175,@6769,@6770,@6764,@6822,@6399,@6824,@6793,@6766| 6766:S14|456e64206f66207061747465726e 6767:S39|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329 6768:S7|5061747465726e 6769:D2,60|00802b28051a38000e0c000303033c020b2b28091a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6770:D2,44|00812c561756285639564a1a22000e0e0e0c00062c2a35452a364664430e0e0e000000002400000000000000|@6772,@6771| 6771:O1|@6773 6772:S44|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837292d45 6773:D33,2492|00842e372f23092a3b1ab4090e0c00032a3b1aab090c00032928291aa6090e0e0e0c00031aa1090e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1a78090e0c00032e3b1a6f090c00032b3b1a67090c00032d3b1a5f090c0003302c2e2c2e68053328431a53090c00030375221336293b1a42090e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1a24090e0c00032e3b1a1b090c00032b3b1a13090c00032d3b1a0b090c0003302c2e2c2e6805221f1a08090e0c0002503c28401a01091a02090e0e0e0c000428122a220d2d1af708680529220f69270e0fd33328081ad3080c00030375221336293b1ac2080e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1aa4080e0c00032e3b1a9b080c00032b3b1a93080c00032d3b1a8b080c0003302c2e2c2e6805221f1a88080e0c0002503c28401a81081a82080e0e0e0c000428122a220d2d1a7b08680529220f69270e0fd033282b1a53080c000307d122143a221523062216230a2217230e2218230f2b3b1a32080e0e0e0c00032e3b1a27080c00032b3b1a1f080c00032d3b1a17080c0003302c2e2c2e68051a2a081a2b081a2c080202ec070e0c0003291a24080e0c00023b3e3b3b2d6805291a19080e0e0c000203041a1308103b503b503c3b2b2f6b2222382223230c2a3b3c1a00080e0c0004502b2a0e0e0c000250222336293b1ab3070c000322253a222623062227230a2228230e2229230f2b3b1a98070e0c00032e3b1a8f070c00032b3b1a870702026f070c00032d3b1a7b07020236000c0003302c2e2c2e6805222f1a74070e0c0002503c28401a6d071a6e070e0e0e0c000428122a220d2d1a8707680529221f69271e0fcc33281e1a3f070c00030375221336293b1a2e070e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1a10070e0c00032e3b1a07070c00032b3b1aff060c00032d3b1af7060c0003302c2e2c2e6805221f1af4060e0c0002503c28401aed061aee060e0e0e0c000428122a220d2d1a0b07680529220f69270e0fd13328341abf060c00030379221336293b1aae060e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1a90060e0c00032e3b1a87060c00032b3b1a7f060c00032d3b1a770602025f060c0003302c2e2c2e6805221f1a70060e0c0002503c28401a69061a6a060e0e0e0c000428122a220d2d1a8b06680529220f69270e0fd03328201a3b060c000307d122141a39060e0e0c000222153a2216230e2a3b1a1c060e0c00032a3b1a13060c0003221937221a23092a3b1a04060e0c00032a3b1afb050c00032928291af6050202da050e0e0e0c00031aed050e0e0c000203032902012a29282e1ad8050e0c0003031e221e1ad5050e0e0c000222133122113222116805281b2a69292b69660fcc1af505221f690403002a2a1aee050e0e0e0c00035029360402003b2a222422262e2225222722261ad6050e0e0e0c00095029352a3622243a2225230e2a3b1a6f05020257050c00032a3b1a6305020294000c0003221c2b221a2c221a6805222937222a23092a3b1a46050e0e0e0c00032a3b1a3b050c00032928291a36050e0e0e0c00031a31050e0e0c000203032902012a29282e1a1c050e0c00032705030a22291a17050c00020217282e1a55050e0e0c000229222b1a4e050e0e0e0c0003643c28401af9041afa04020213000e0e0e0c0004280f322b332f6805292d69270e270a0fd53328211ac9040e0e0c000307ca22141ac5040e0e0c0002221537221623092a3b1aa8040e0c00032a3b1a9f040c00032928291a9a040e0e0e0c00031a95040e0e0c000203032902012a29282f1a80040e0c0003032c221a3a221b230e2a3b1a6a040e0e0e0c00032a3b1a5f040c000322122b22102c22106805281b2a6927050fca1aa304221c690402002219221d2c2c221f221f0c0006502935221d37221e23092a3b1a25040e0e0c00032a3b1a1b040c00032928291a16040e0e0e0c00031a11040e0e0c000203032902012a29280b1afc030204e00322010e0e0e0c0003035c22221af1030e0e0c00023b222522232225222422281a32040e0e0e0c0007302a6922253a2226230e2a3b1abd030e0e0c00032a3b1ab3030c0003221d2b221b2c221b68053c28401ab0031ab1030e0e0c00042819302b2d6b2709022f22223a2223230e2a3b1a8203020221000e0e0e0c00032a3b1a73030c0003221a2b22182c221868052816342b6a27052708221b3a221c230e2a3b1a51030e0e0c00032a3b1a47030c000322132b22112c22116805222037222123092a3b1a2e030e0e0e0c00032a3b1a23030c00032928291a1e030e0e0e0c00031a19030e0e0c000203032902012a29282f1a04030e0c00032705030a22201aff020c00020217282f1a3d030e0e0c00022922221a36030e0e0e0c0003642f2b69270d0fca33281f1ace020e0e0e0c000307cd22141ac9020e0e0c0002221537221623092a3b1aac020e0c00032a3b1aa3020c00032928291a9e020e0e0e0c00031a99020e0e0c000203032902012a29282d1a84020e0c000303033b02133b221c221a221c221b221f1acd020e0e0c0007221b3a221c230e2a3b1a58020e0c00032a3b1a4f020c000322132b22112c22116805222037222123092a3b1a36020e0e0e0c00032a3b1a2b020c00032928291a26020e0e0e0c00031a21020e0e0c000203032902012a29282d1a0c020202f0010e0c00032705030e22201a0302020238000c00020217282d1a3d020e0e0c00022922221a36020e0e0e0c0003643c28401ae1011ae2010e0e0e0c000428112a322e6b292d69270f0fdd33283c1ab9010e0e0c0003031522141ab5010e0e0c000250281e2a69292b69640fcd221437221523092a3b1a8d010e0e0c00032a3b1a83010c00032928291a7e010e0e0e0c00031a79010e0e0c000203032902012a2928261a64010e0c000303033c021b2928061a55010e0e0c000303033c020b2928181a45010e0e0c0003270503c0221437221523092a3b1a2c010e0c00032a3b1a23010c00032928291a1e010e0e0e0c00031a19010e0e0c000203032902012a2928261a04010e0c000329030b221a1a00010e0c000202013b221835221936221a370402002c0202c8002c2c222222241a3b0134301a3a010202b6000e0e0e0c00095029352a363c28401ac9001aca000e0e0e0c00043c28401a1a011abb000c00043c28401a12011aaf000c00042d2b2d2f2d6805280e2a692e362f38221c2b221a2c221a68052c2a69271502641aed0022151ac8000e0c000350221437221523092a3b1a5f000c00032a3b1a57000c00032928291a52000e0e0e0c00031a4d000e0e0c000203032902012a29221b0c00021a39000e0e0c00022705030d22141a2f000c0002501e4c02023b501a92002a69270f1f0500000000b409000000000000|@6775,I253,I251,I218,@6175,@855,I11,@6776,@6780,@6782,@6184,@6187,@6373,I105,@1784,I255,@6783,@6785,@6787,@6789,@6494,@6791,@6396,@6370,@6808,@6809,@6813,@6399,@6817,@6741,@6774,@6768,@3454| 6774:O1|@6821 6775:S55|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129 6776:O7|@6778,2,@691,@6777,@690,0,0 6777:O3|2,@767,@6779 6778:S8|636f6e76576f7264 6779:O3|6,@152,79992 6780:O7|@6781,2,@691,@6777,@690,0,0 6781:S8|636f6e7643686172 6782:S38|5265616c20636f6e7374616e7473206e6f7420616c6c6f77656420696e207061747465726e73 6783:O7|@6784,2,@691,@6777,@690,0,0 6784:S8|636f6e765265616c 6785:O7|@6786,2,@691,@6777,@690,0,0 6786:S7|636f6e76496e74 6787:O7|@6788,2,@691,@6777,@690,0,0 6788:S10|636f6e76537472696e67 6789:D10,116|00821a73002e1a73000c0003291a70001a69000e0e0c0003291a68001a69000e0e0c0003291a64000e0c00023b3e3b3b2d6805291a59000e0e0c000203041a5300103b503c3b2b346b5667385677230c2a3b3c1a42000e0e0e0c0004502b2a347d0d00020e0e0e0e000000006c00000000000000|@6790,@6493,@389,@6491,@6184,@6187,@6373,I105,@1784,I255| 6790:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831297265706f7274447570283329 6791:O1|@6792 6792:D29,788|008730373123092a3b1a0c030e0c00032a3b1a03030c00032928291afe020e0e0e0c00031af9020e0e0c000203032902012a2928391ae4020e0c00030319220c1ae1020e0e0c0002501adc02220e2a35452a3646640fd11ad202220c691ad002220d6929220f1acb020c000329352a362a2a6922100c0002221237221323092a3b1a94020e0c00032a3b1a8b020c00032928291a86020e0e0e0c00031a81020e0e0c000203032902012a0402002a28111a69020e0e0c0003031d22181a65020e0e0c00025022132219220d2c2218221a0e0c0006500fd0311a5d020e0e0c00023b2a1a57020c000364038f311a49020e0e0c00023b2a1a47020c00036403041a4202103b503b50311a3d020e0e0c0002030331020b313f1a32020e0e0e0c00032928311a2a020202d4010e0e0e0c0003640344311a01020e0e0c00023b2a1aff010c00036403041afa01103b503b50311af5010e0e0c0002030331020b313f1aea010e0e0e0c00032928391ae6010e0e0e0c00036402013b02013b038f22183a22192306221a230a221b230e221c230f2b3b1a83010c00032e3b1a7b010c00032b3b1a73010202ad000c00032d3b1a67010c0003302c2e2c2e68051a9a011a9b011a9c010e0c0003291a98010e0c00023b3e3b3b2d6805291a6d010e0e0c000203041a8301103b503b503c3b2b2f6b2226382227230c2a3b3c1a70010e0c0004502b2a0e0e0c0002261102023b503c28401a5c011a5d010e0e0c00043c28401a56011a4f010c00043c28401a4e011a43010c0004342b2d220d2d6805280e2a6922102a220e31221d221d222322211a2f010c0009260629352a363235333734392c362d382d2b2e2c2f68053c28401aff001a00010e0c000422112a2212342e6805222237222323092a3b1a8b000c00032a3b1a83000c00032928291a7e000e0e0e0c00031a79000e0e0c000203032902012a29280b1a64000e0c0003033422271a61000e0e0c00020402003b2a222b222b222b222b222b222b1aa8000e0c00095029352a36322a69222d2c452a462705020a2e3b6922293c452a4664271b27051f080e0e0e0e0e0e000000000c03000000000000|@6794,I253,I251,I218,@6175,@740,@6795,@6796,@6518,I223,I234,I231,@337,I105,I252,I28,I29,@6797,@6184,@6187,@6373,@1784,I255,@855,I11,@6741,@6798,@6793,@6791| 6793:O1|@6800 6794:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831296765744c6162656c73283129 6795:D2,60|00802b282e1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6796:D2,76|00802b28111a48000e0c000303033c02272b282e1a39000e0e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6797:S35|203d20706174206578706563746564206166746572206e756d65726963206c6162656c 6798:O1|@6799 6799:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6800:D14,356|0087313529280e1a5e010e0e0e0c00031a5901220c69040200312b220e220e2d220e1a4b010c00075029352a3632373323092a3b1a3d010e0e0c00032a3b1a33010c00032928291a1e010e0e0e0c00031a25010e0e0c000203032902012a2928051a04010e0c000307dd220e1a0d010e0e0c0002331a00010e0c0002038e220f3a221023062211230a2212230e2213230f2b3b1ade000e0e0e0c00032e3b1ad3000c00032b3b1acb000c00032d3b1ac3000c0003302c2e2c2e68051ac2001ac3001ac4000e0c0003291ac0000e0c00023b3e3b3b2d6805291ab5000e0e0c000203041aaf00103b503b503c3b2b2f6b221d38221e230c2a3b3c1a9c000e0c0004502b2a0e0e0c0002271002013b0402002212221222192c221722150e0e0c00065029352a362217352218372219392c362d382d2b2e2c2f680528102212322c6b221d2a452b0202050046270c0206221130452f46270b1f08000000005c01000000000000|@6802,I251,@6803,@6804,I253,I218,@6175,@6801,@6184,@6187,@6373,I105,@1784,I255| 6801:S32|4578706563746564206964206f722069643a7479206265666f72652060617327 6802:S61|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329636f6e73747261696e744f724c617965726564283329 6803:D2,44|00802b28051a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6804:O1|@6805 6805:D8,172|008530372c372d23092a3b1aa2000e0e0e0c00032a3b1a97000c00032928291a92000e0e0e0c00031a8d000e0e0c000203032902012a2928091a78000e0c00030352311a76000e0e0e0c00021a7100220e690402002a220c332c1a67000c00055029352a36220f352210372211392c362d382d2b2e2c2f680528053122182c6b221922192b2d221922191a3b00221a7b081a000732220c45344627061f060e0e00000000a400000000000000|@6807,I253,I251,I218,@6175,@6806,@6463,@6804| 6806:D2,44|00802b28091a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6807:S42|50415253455f44454328292e7061727365446563283329646563283429636f6e73747261696e74283429 6808:D2,60|00802b280b1a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6809:O1|@6810 6810:D7,140|00851a8b0030690402002e2e2c2c33220c0c00065029352e372f23092a3b1a73000c00032a3b1a6b000c00032928291a66000e0e0e0c00031a61000e0e0c000203032902012a29280b1a4c000e0c00030324331a4a000e0e0e0c0002503b220f220f220f220f220f1a39000e0e0c00072f2a696402032e3b6927081f060e0e0e000000008400000000000000|@6812,@6811,I253,I251,I218,@6175,@6809| 6811:D2,60|00802b280b1a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6812:S66|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d7475706c6573283129 6813:O1|@6814 6814:D7,140|00851a8b0030690402002e2e2c2c33220c0c00065029352e372f23092a3b1a73000c00032a3b1a6b000c00032928291a66000e0e0e0c00031a61000e0e0c000203032902012a29280b1a4c000e0c00030324331a4a000e0e0e0c0002503b220f220f220f220f220f1a39000e0e0c00072f2a696402032e3b6927081f060e0e0e000000008400000000000000|@6816,@6815,I253,I251,I218,@6175,@6813| 6815:D2,60|00802b282d1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6816:S68|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d766172734c697374283129 6817:O1|@6818 6818:D11,212|00872d2f311ad0000e0c000429352a362a220c0e0e0c0002291ac0000e0c00021abd000e0e0c000203212935293629353c1ab0000e0c000303033c020b29353b1aa1000e0e0c00036502013b29030b311a8d000e0e0c000202013b035728282d1a85000e0e0c0003291a80001a79000e0e0c0003291a78001a79000e0e0c0003291a74000e0c00023b3e3b3b2d6805291a49000e0e0c000203041a5f00103b503b3b2b336b2211230c2a2a0e0e0c0002260802023b502d312a35452a364627061f080e0e0e0e0e0e00000000cc00000000000000|@6820,@6401,I105,I218,I251,@389,@6819,@6184,@6187,@6603,@1784| 6819:S46|292068617320696e666978207374617475732062757420776173206e6f74207072656365646564206279206f702e 6820:S41|50415253455f44454328292e70617273654465632833296765744c6f6e674e6f6e496e666978283729 6821:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6822:O1|@6823 6823:D2,236|00802b28261ae8000e0c000303033c02cb2b28201ad9000e0e0c000303033c02bb2b281f1ac9000e0e0c000303033c02ab2b28211ab9000e0e0c000303033c029b2b28081aa9000e0e0c000303033c025b2b28431a99000e0e0c000303033c024b2b282b1a89000e0e0c000303033c023b2b281e1a79000e0e0c000303033c022b2b28341a69000e0e0c000303033c021b2b28061a59000e0e0c000303033c020b2b28181a49000e0e0c000303033c022b2b28061a39000e0e0c000303033c020b2b28181a29000e0e0c000303033c020b2b283c1a19002d7e030003420e0e0e00000000e400000000000000|@6367,I251| 6824:O1|@6825 6825:D6,116|00880404003b2a313134220d3222111a66000e0e0e0c00095029352a362b372c38293b1a56000e0e0e0c0003030b2b322a35452a36466402291a44003b1a44002f2f2f2f22112211221422162212221a1a35000e0e0c000e2936332a35452a36466527051f090e0e000000006c00000000000000|@6827,@6828,I234,-1,@6403,@6826| 6826:O1|@6839 6827:S42|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729 6828:O1|@6829 6829:D11,300|00871a2b0130326a1a290131316a0402002a2a320e0c00035029352a360402002b2b302c220d22102213220f22121a07010c000a5029352a362a2a69040300220d37220e23092a3b1af1000e0e0c00032a3b1ae7000c00032928291ae2000e0e0e0c00031add000e0e0c000203032902012a2922170c00022705033922112211220f1ac3000c000429352a362a22100e0e0c0002293b1aa7000c000303041aab00103b503b50293529362f2e452d462a472607020e1a98002a2a35452a36462a37475129352a362b370402002a353d1a6e000e0e0e0c0003030d1a77002a2a35452a364651021d2a353c1a53000c0003030a2a362a2a453c465102082a362a2a453b465129352a362e2e6922192b4532462a472c4827111f080e0e0e0e0e0e0e000000002401000000000000|@6831,@6832,@6833,@6834,I253,I251,I218,@6401,@2309,@6838,@6830| 6830:O2|-1,0 6831:S56|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729726561644e6578744f7073283129 6832:D1,36|00802b56180c000203033c02072b56172c800002420e0e0e000000001c00000000000000|@6367| 6833:D2,52|00802b56180c000203033c020b2b28261a25000e0e0c000303033c02072b56172c800002420e0e0e000000002c00000000000000|@6367,I251| 6834:O1|@6835 6835:D9,332|00882f373023092a3b1a44010e0c00032a3b1a3b010c00032928291a36010e0e0e0c00031a31010e0e0c000203032902012a29340e0c0002270507dd2f373023092a3b1a0a010e0e0e0c00032a3b1aff000c00032928291afa000e0e0e0c00031af5000e0e0c000203032902012a29330e0c00022705034b2f36293b1ad1000e0e0c0003642d0e0e0e0c0002291acc000e0c00021ac1000e0e0c000203212935293629353c1aac000e0c000303033c020b29353b1a9d000e0e0c00036502013b6402013b0307303445334602631a900032306a0402002a2a2f0c00035029352a36220d35220e37220f392c362d382d2b2e2c2f68053c28401a69001a6a000e0e0e0c00042215322b3b2e68053d2a69292d2217221722170202170022172217221722171a460022180e0e0e7b0b18000a020530344533461f090e0e0e0e0e0e0e000000004401000000000000|@6837,I253,I251,I218,I105,@6836,@855,I11,@6834| 6836:D1,36|00802b56180c000203033c02072b56172c800002420e0e0e000000001c00000000000000|@6367| 6837:S61|50415253455f44454328292e70617273654465632833296465632834297061727365496e66697828372970617273654170706c69636174696f6e283329 6838:O3|I48,@6406,@976 6839:D10,404|008c0404003b2a3333333333331a88010e0c00095029352a362b372c382c2c2c2c6b2211221022106a292b220c1a6c010e0c00042c22111a66010e0e0e0c000303033c02122213030d2c22111a55010e0e0c000302013b0321221022142213323232322216221622162216221622161a36010e0e0e0c000e02012b2212352213363c28401a25011a26010e0e0e0c00043c28401a1e011a17010c00043c28401a16011a0b010c00042d2b2d2f2d6805280e2a69221a36313629362b352c372d392c362d382d2b2e2c2f68052223352211362935293b692c2a693c28401acd001ace000e0e0e0c000428192b2b326b3c28401ab8001ab9000e0e0c000422112b2b3c220c68053d2a69293469221b37221c38221d35292d2d2d6b2235223522386a292221222e1a74000e0c0004502220382922391a6a000e0e0e0c00036403033c02162220382922391a59000e0e0c0003640304223602013b03222237223722372e3232322237223722372237223722371a350022380e0e7b0f38000e2a27291f0d0e0e0e0e0e0e0e000000008c01000000000000|@6841,@6828,@6842,I233,I113,@6826,@855,I11,@6741,@6840| 6840:O1|@6854 6841:S54|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729 6842:O1|@6843 6843:D23,308|00822d372d382a2a1a2d010e0e0c00036503172d352d352a2a1a20010e0c0003651a1c010e0c000202013b07dd2b3a2c23062d230a2e230e2f230f2b3b1a04010e0c00032e3b1afb000c00032b3b1af3000c00032d3b1aeb000c0003302c2e2c2e6805220e362935220f372935221236293522143503051ace0002031acd00221437293522163503051ac40002031ac300291ac300691ac3002a692c2a691abf002a69302a691abb002a69332a691ab7002a69220e2a691ab2002a6922122a691aad002a6927151aaa000e0e0e0c0002291aa4001aa5000e0e0c0003291aa0000e0c00023b3e3b3b2d6805291a95000e0e0c000203041a8f00103b503b503c3b2b306b221138221202021800230c2a3b3c1a78000e0c0004502b2a22140e0e0e7d1600023b440e0e000000002c01000000000000|@6845,I113,I251,I218,I253,@6846,@6847,@6846,@6847,@6848,@6850,@6851,@6850,@6852,@6853,@6844,@371,@6184,@6187,@6373,I105,@1784,I255| 6844:S11|4f70657261746f72732022 6845:S75|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729636865636b4173736f636961746976697479283229 6846:S5|7269676874 6847:S4|6c656674 6848:O2|@6849,0 6849:S13|2d6173736f636961746976652e 6850:S5|2220697320 6851:S20|2d6173736f63696174697665207768696c652022 6852:S32|222068617665207468652073616d6520707265636564656e6365206275742022 6853:S7|2220616e642022 6854:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6855:O1|@6856 6856:D19,1076|00812c353d1a30040e0c000303200404002d2a2e1a25040e0e0c00045029352a362b372c382c2c2c2c6b27050fd92c3528161a03040c000307cf2c3629353d1af6030e0e0e0c000303200404002e2a2f1ae9030e0e0c00045029352a362b372c382c2c2c2c6b27050fd02c3a2d23062e230a2f230e30230f2b3b1ac3030c00032e3b1abb030c00032b3b1ab3030c00032d3b1aab030c0003302c2e2c2e68051aa2031aa3031aa4030e0c0003291aa0030e0c00023b3e3b3b2d6805291a95030e0e0c000203041a8f03103b503c3b2b2f6b2211382212230c2a3b3c1a7e030e0e0e0c0004502b2a0e0e0c00025022133a221423062215230a2216230e2217230f2b3b1a3b030204e30256000e0e0c00032e3b1a2b030c00032b3b1a23030c00032d3b1a1b030c0003302c2e2c2e68053c28401a2b031a2c03020222000e0c00041a25032a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b2721640fd02c3528051ad0020e0c000307dc2c362d37293528161abf020c000307d9293629353d1ab2020e0e0e0c000303210404002b2a311aa5020e0e0c00045029352a362b372f68012c2c2c2c6b27050fd72e3a2f230630230a31230e32230f2b3b1a7e020e0e0e0c00032e3b1a73020c00032b3b1a6b020c00032d3b1a63020c0003302c2e2c2e68051a82021a5b021a5c020e0c0003291a58020e0c00023b3e3b3b2d6805291a4d020e0e0c000203041a4702103b503c3b2b2f6b2213382214230c2a3b3c1a36020e0e0e0c0004502b2a0202b9010e0e0c00025022153a221623062217230a2218230e020285012219230f2b3b1aeb01020254000c00032e3b1adf010c00032b3b1ad7010c00032d3b1acf010c0003302c2e2c2e68053c28401adf011ae001020222000e0c00041ad9012a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b2721640fce29353d1a85010e0e0c000303210404002a2a301a79010e0e0c00045029352a362b372e68012c2c2c2c6b27050fcf2d3a2e23062f230a30230e31230f2b3b1a52010e0e0e0c00032e3b1a47010c00032b3b1a3f010c00032d3b1a37010c0003302c2e2c2e68051a5a011a2f011a30010e0c0003291a2c010e0c00023b3e3b3b2d6805291a21010e0e0c000203041a1b01103b503c3b2b2f6b2212382213230c2a3b3c1a0a010e0e0e0c0004502b2a0e0e0c00025022143a221523062216230a2217230e2218230f2b3b1ac700020251000c00032e3b1abb000c00032b3b1ab3000c00032d3b1aab000c0003302c2e2c2e68053c28401abb001abc00020222000e0c00041ab5002a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b272165021b040400292d1a9b000c00035029352a362b372c382c2c2c2c6b270529352a3629353b2c291a5c000e0c00021a79000e0e0c0002031729362b3c1a6f000c0003292b25042504511e233b6502012a652d2b2b6a2705430e0e000000002c04000000000000|@6858,I251,@6859,I253,@6861,@6184,@6187,@6373,I105,@1784,I255,@855,I11,I48,@6861,@6861,@6857,I218,I106| 6857:O1|@6867 6858:S28|50415253455f5452454528292e6d6b46756e5061747465726e283229 6859:O1|@6860 6860:D19,1028|00822d3528161aff030c000307dd2d362e372a353d1af0030e0c000303212a3629352935280e1adf030c0003030d2a38293c1ad3030c00036402013b6502013b032f2a362935293629352a382d363c28401ab8031ab9030e0e0c00042c2a2d6a2b3b69220e2a452b463c473b48270902821aa0031aa1031aa2030e0e0e0c0003291a9c030e0c00023b3e3b3b2d6805291a91030e0e0c000203041a8b03103b503c3b2b2f6b313832230c2a3b3c1a7c030e0c0004502b2a0e0e0c0002503c28401a49031a4a030e0e0e0c00041a61032a326a29352a362b376a29352a362b372b2b2b6a22123b452a46020209003b473b48270d650fd72d35280e1a0b030c000303232d3629352a383c28401afe021aff020c00042b2a2c6a313b452a463b473b4827050fca2d353d1add020e0e0c000307d52d3629352a362b38293c1ac9020e0e0c0003035f2a3528191abb020c000303502a36291acc020e0c00021ad5020e0e0c0002033829352a36291ab6020e0e0e0c00021abd020e0e0c0002031c2936293b1a83020c0003030c2b353d1a78020e0c000302013b6402013b6502013b6402013b02013b03582a381a8b021a68021a69020e0e0c0003291a64020e0c00023b3e3b3b2d6805291a5902020224020e0e0c000203041a4f02103b503c3b2b2f6b3438220c230c2a3b3c1a3f02020202020c0004502b2a0e0e0c0002270702c1293c1a03020202f9000c0003035f2a3528191af3010c000303502a36291a04020e0c00021a0d020e0e0c000203382936291af0010e0c00021af9010e0e0c0002032029352a36293b1abd010e0e0c0003030c2a353d1ab0010e0c000302013b6502013b6402013b6402013b02013b03502a381ac7011aa0011aa1010e0e0c0003291a9c010e0c00023b3e3b3b2d6805291a91010e0e0c000203041a8b01103b503c3b2b2f6b3438220c230c2a3b3c1a7b010c0004502b2a0e0e0c0002270702013b0404002d2a331a76010e0e0e0c00045029352a362b372f3b69293b1a29010e0e0c000303032c020b2c2a1a56010e0e0e0c0003220e2a452d462c473b48270b0fdd2b3a2c23062d230a2e230e2f230f2b3b1a33010c00032e3b1a2b010c00032b3b1a23010c00032d3b1a1b010c0003302c2e2c2e68051a12011adb001adc000e0c0003291ad8000e0c00023b3e3b3b2d6805291acd000e0e0c000203041ac700103b503c3b2b2f6b2210382211230c2a3b3c1ab6000e0e0e0c0004502b2a0e0e0c00025022123a221323062214230a2215230e2216230f2b3b1aab000c00032e3b1aa3000c00032b3b1a9b000c00032d3b1a93000c0003302c2e2c2e68053c28401a47001a48000e0c00041a61002a2c6a29352a362b376a29352a36020212002b372b2b2b6a22243b452a463b473b482721440e0e0e0e00000000fc03000000000000|@6862,I251,@855,I11,@6863,@6184,@6187,@6373,I105,@1784,I255,I48,I218,@6864,@6864,@6859,@6865,I253,@6861| 6861:S79|53796e746178206572726f723a2066756e2062696e64696e67206973206e6f7420616e206964656e746966696572206170706c69656420746f206f6e65206f72206d6f7265207061747465726e732e 6862:S37|50415253455f5452454528292e6d6b46756e5061747465726e283229756e7069636b283129 6863:S70|506172656e74686573657320617265206f6e6c7920616c6c6f77656420666f7220696e6669786564206170706c69636174696f6e7320696e2066756e2062696e64696e67732e 6864:S63|436f6e7374727563746f72206170706c69636174696f6e7320696e2066756e2062696e64696e6773206d75737420626520706172656e74686573697365642e 6865:O1|@6866 6866:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6865| 6867:D12,252|00812b3a2c23062d230a2e230e2f230f2b3b1aeb000c00032e3b1ae3000c00032b3b1adb000c00032d3b1ad3000c0003302c2e2c2e68051aca001acb001acc000e0c0003291ac8000e0c00023b3e3b3b2d6805291abd000e0e0c000203041ab700103b503c3b2b2f6b2210382211230c2a3b3c1aa6000e0e0e0c0004502b2a0e0e0c00025022123a221323062214230a2215230e2216230f2b3b1a63000c00032e3b1a5b000c00032b3b1a53000c00032d3b1a4b000c0003302c2e2c2e68053c28401a5b001a5c000e0c00041a59002a2c6a29352a362b376a29352a362b372b2b2b6a22243b452a463b473b4827214300000000f400000000000000|@6868,I253,@6861,@6184,@6187,@6373,I105,@1784,I255,@855,I11,I48| 6868:S49|50415253455f5452454528292e6d6b46756e5061747465726e283229617267737c6e616d657c756e7069636b65642d2f35 6869:S31|5468697320636c6175736520646566696e65732066756e6374696f6e206060 6870:S36|2727206275742070726576696f757320636c6175736528732920646566696e6564206060 6871:S16|5468697320636c617573652068617320 6872:S38|20617267756d656e7473206275742070726576696f757320636c617573652873292068616420 6873:D2,44|00802b283e1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6874:D12,1500|00862e372f23092a3b1ad4050e0c00032a3b1acb050c00032928291ac6050e0e0e0c00031ac1050e0e0c000203032902012a2928171aac050e0c000303033c0fd82928081a9d050e0e0c000303033c025b2928431a8d050e0e0c000303033c024b29282b1a7d050e0e0c000303033c023b29281e1a6d050e0e0c000303033c022b2928341a5d050e0e0c000303033c021b2928061a4d050e0e0c000303033c020b2928181a3d050e0e0c000303033c027f2928111a2d050e0e0c000303033c021b2928061a1d050e0e0c000303033c020b2928181a0d050e0e0c000303033c024f2928201afd040e0e0c000303033c023f2928211aed040e0e0c000303033c022f29281f1add040e0e0c000303033c021f2928261acd04020215000e0e0c000303033c020b2928221ab9040e0e0c000303033c024b2928131aa9040e0e0c000303033c023b2928071a99040e0e0c000303033c022b2928401a89040e0e0c000303033c021b2928191a79040e0e0c000303033c020b29282a1a69040e0e0c00031a65040e0e0c0002270507d11a5d042f1a5d040e0e0c0003502e372f23092a3b1a3d040e0e0c00032a3b1a33040c00032928291a2e040e0e0e0c00031a29040e0e0c000203032902012a29220d0c000203033c0fcc2928171a09040e0e0c000303033c0fd02928081af9030e0e0c000303033c025b2928431ae9030e0e0c000303033c024b29282b1ad9030e0e0c000303033c023b29281e1ac9030e0e0c000303033c022b2928341ab9030e0e0c000303033c021b2928061aa9030e0e0c000303033c020b2928181a99030e0e0c000303033c02872928111a89030202eb000e0e0c000303033c021b2928061a75030e0e0c000303033c020b2928181a65030e0e0c000303033c02532928201a55030e0e0c000303033c02432928211a4503020289000e0e0c000303033c022f29281f1a3103020225000e0e0c000303033c021b2928261a1d030e0e0c000303033c020b2928221a0d030e0e0c000303033c024b2928131afd020e0e0c000303033c023b2928071aed020e0e0c000303033c022b2928401add020e0e0c000303033c021b2928191acd020e0e0c000303033c020b29282a1abd020e0e0c00031ab9020e0e0c00022705030e2e1ab8020e0c00025020a80102023b5002023b502e372f23092a3b1a8a020e0e0e0c00032a3b1a7f020c00032928291a7a020e0e0e0c00031a75020e0e0c000203032902012a2928171a60020e0c000303033c0fd82928081a51020e0e0c000303033c025b2928431a41020e0e0c000303033c024b29282b1a31020e0e0c000303033c023b29281e1a21020e0e0c000303033c022b2928341a11020e0e0c000303033c021b2928061a01020e0e0c000303033c020b2928181af1010e0e0c000303033c027f2928111ae1010e0e0c000303033c021b2928061ad1010e0e0c000303033c020b2928181ac1010e0e0c000303033c024f2928201ab1010e0e0c000303033c023f2928211aa1010e0e0c000303033c022f29281f1a91010e0e0c000303033c021f2928261a8101020215000e0e0c000303033c020b2928221a6d010e0e0c000303033c024b2928131a5d010e0e0c000303033c023b2928071a4d010e0e0c000303033c022b2928401a3d010e0e0c000303033c021b2928191a2d010e0e0c000303033c020b29282a1a1d010e0e0c0003270503b71a250131690402002a2a32220d1a1c013434341a1a010e0e0e0c00095029352a3632373323092a3b1ae5000e0e0c00032a3b1adb000c00032928291ad6000e0e0e0c00031ad1000e0e0c000203032902012a2928161abc000e0c0003034f220e1ac1000e0e0c000204020022122a221222161ab7002214221422141ab6000e0e0e0c00095029352a363235333734392c362d382d2b2e2c2f6805280d2211322c336805221a2a452b46270b0206220f30452f46270902422e3a2f230630230a31230e32230f2b3b1a46000e0e0e0c00032e3b1a3b000c00032b3b1a33000c00032d3b1a2b000c0003302c2e2c2e680522101a4400452a46270a1f070e0e0e0e0e00000000d405000000000000|@6876,I253,I251,I218,@6877,@6370,@6175,@6878,@6761,@6879,@6875,@3454| 6875:O1|@6939 6876:S42|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e283229 6877:S10|45787072657373696f6e 6878:D2,44|00802b28161a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6879:O1|@6880 6880:D2,36|008731333232323232321a1b00330e7b0a0a00090e0e0e0e000000001c00000000000000|@6882,@6881| 6881:O1|@6883 6882:S56|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c7365283129 6883:D8,188|00871abb0032690402002a2a3434343434341aaf000c00095029352a363437220c23092a3b1aa0000e0c00032a3b1a97000c00032928291a92000e0e0e0c00031a8d000e0e0c000203032902012a2928281a78000e0c0003034922101a75000e0e0c00020402002922142214221422142214221422141a5f000c00095029352a363235333734392c362d382d2b2e2c2f680528152211322c6b221d2a452b46270b0206221230452f4627091f080e0e0e00000000b400000000000000|@6885,@6886,@6884,I253,I251,I218,@6175,@6881| 6884:O1|@6887 6885:S58|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c73652831292829 6886:D2,44|00802b28281a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6887:D2,36|008731333232323232321a1b00330e7b0a0a00090e0e0e0e000000001c00000000000000|@6889,@6888| 6888:O1|@6890 6889:S57|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f283129 6890:D8,188|00871abb0032690402002a2a3434343434341aaf000c00095029352a363437220c23092a3b1aa0000e0c00032a3b1a97000c00032928291a92000e0e0e0c00031a8d000e0e0c000203032902012a293e1a79000e0e0c0003034822101a75000e0e0c00020402002922142214221422142214221422141a5f000c00095029352a363235333734392c362d382d2b2e2c2f68053c2211322c6b221d2a452b46270b0206221230452f4627091f080e0e0e0e00000000b400000000000000|@6892,@6893,@6891,I253,I251,I218,@6175,@6888| 6891:O1|@6894 6892:S59|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f2831292829 6893:D2,44|00802b3e1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6894:D23,1244|008730373123092a3b1ad4040e0c00032a3b1acb040c00032928291ac6040e0e0e0c00031ac1040e0e0c000203032902012a220c2306220d230a220e230f2a3b1a9d040e0e0c00032a3b1a93040c00032e28131a8e040e0e0e0c0003035622111a89040e0e0c00021a85042215690402002a2a2216221622162216221622161a72040e0e0e0c00095029352a3629362a38342b332c3468053c28401a5a041a5b040c0004280b2a302d6b221c2a452c46270a0fcb2e282a1a2a040e0e0e0c0003034122111a25040e0e0c0002040200221222162b221622142214221422180e0e0e0c00085029352a3629362a38332b322c33680528172e2b6a221a2a452b4627080fd72e28071adb030c000307ce22111ad9030e0e0c00021ae50322156904020022132b2b221722152215221522190e0e0c0008502935221537221623092a3b1a9d030e0e0c00032a3b1a93030c00032928291a8e030e0e0e0c00031a89030e0e0c000203032902012a2928251a74030e0c00032705030e22151a6f03020247030c0002021728251a79030e0e0c00022922171a72030e0e0e0c0003641a6c032219690402002a2a221a221a221a221a221a221a1a3d030e0e0c00095029352a3629362a38220f2b220e2c220f68053c28401a23031a24030204ec021a000e0e0e0c0004322f2b2d3168053e2a6922212a452d46270f0fd12e28401ae6020e0e0e0c000307d222111ae1020e0e0c00021afd0222156904020022132b2b221722152215221522190e0e0c00085029352a36221637221723092a3b1aa3020c00032a3b1a9b020c00032928291a96020e0e0e0c00031a91020e0e0c000203032902012a29280d1a7c020e0c00032705035222161a77020c00020402002217221b2b221b221922192219221d0e0e0e0c00085029352a3629362a38220f2b220e2c220f68053c28403b1a52020e0e0e0c0004281d2f342d2d680522202a452c4627090232280d1a3d020202fd010e0e0c00022922181a320202021e000e0e0e0c00035022171a06020e0e0e0c00025022182c452b466427050fcf2e28191ae6010e0e0e0c000307ce22111ae1010e0e0c00021a010222156904020022132b2b221722152215221522190e0e0c0008502935221537221623092a3b1aa5010e0e0c00032a3b1a9b010c00032928291a96010e0e0e0c00031a91010e0e0c000203032902012a2928371a7c010e0c00032705030a22151a77010c0002021728371a85010e0e0c00022922171a7e010e0e0e0c0003641a840122196904020022172b2b221b221922192219221d0e0c0008502935221937221a23092a3b1a25010e0e0c00032a3b1a1b010202ff000c00032928291a120102029c000e0e0e0c00031a09010e0e0c000203032902012a29280e1af4000e0c00032705030a22191aef000c00020217280e1afd000e0e0c000229221b1af6000e0e0e0c000364040200221a221e2b221e221c221c221c22200e0e0c00085029352a3629362a3822122b22112c221268053c28403b1ab2000e0e0e0c00043c28403b1aa5000e0e0c0004220d30342e2d2f68063f2a6922252a452e46271302561aa7002214692211352212362213370402002c2c2c1a9600221a221a221922192219221d68071a89001a8a003330221e1a87000c000a5029352a361a8000221b6922182a2d2d221e221e1a7500221a0e0e7b081c0007270a1f080e0e0e0e00000000d404000000000000|@6896,I253,I251,I218,@6175,@6897,@6875,@855,I11,@6898,@6396,@6370,@6899,@6900,@6901,@6902,@6903,@6904,@6937,@6554,@6824,@6895,@6804| 6895:D2,44|00802b3e1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6896:S55|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296b6579576f7264457870283129 6897:D2,44|00802b28301a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6898:D2,268|00802b28261a08010e0c000303033c02cb2b28201af9000e0e0c000303033c02bb2b281f1ae9000e0e0c000303033c02ab2b28211ad9000e0e0c000303033c029b2b28081ac9000e0e0c000303033c025b2b28431ab9000e0e0c000303033c024b2b282b1aa9000e0e0c000303033c023b2b281e1a99000e0e0c000303033c022b2b28341a89000e0e0c000303033c021b2b28061a79000e0e0c000303033c020b2b28181a69000e0e0c000303033c022b2b28061a59000e0e0c000303033c020b2b28181a49000e0e0c000303033c020b2b283c1a39000e0e0c000303033c020b2b28251a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000401000000000000|@6367,I251| 6899:D2,44|00802b28301a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6900:D2,44|00802b280d1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6901:D2,380|00802b28171a78010e0c000303033c0fd82b28081a69010e0e0c000303033c025b2b28431a59010e0e0c000303033c024b2b282b1a49010e0e0c000303033c023b2b281e1a39010e0e0c000303033c022b2b28341a29010e0e0c000303033c021b2b28061a19010e0e0c000303033c020b2b28181a09010e0e0c000303033c027f2b28111af9000e0e0c000303033c021b2b28061ae9000e0e0c000303033c020b2b28181ad9000e0e0c000303033c024f2b28201ac9000e0e0c000303033c023f2b28211ab9000e0e0c000303033c022f2b281f1aa9000e0e0c000303033c021f2b28261a9900020215000e0e0c000303033c020b2b28221a85000e0e0c000303033c024b2b28131a75000e0e0c000303033c023b2b28071a65000e0e0c000303033c022b2b28401a55000e0e0c000303033c021b2b28191a45000e0e0c000303033c020b2b282a1a35000e0e0c000303033c020b2b28371a25000e0e0c000303033c02072b56172c800002420e0e0e000000007401000000000000|@6367,I251| 6902:D2,380|00802b28171a78010e0c000303033c0fd82b28081a69010e0e0c000303033c025b2b28431a59010e0e0c000303033c024b2b282b1a49010e0e0c000303033c023b2b281e1a39010e0e0c000303033c022b2b28341a29010e0e0c000303033c021b2b28061a19010e0e0c000303033c020b2b28181a09010e0e0c000303033c027f2b28111af9000e0e0c000303033c021b2b28061ae9000e0e0c000303033c020b2b28181ad9000e0e0c000303033c024f2b28201ac9000e0e0c000303033c023f2b28211ab9000e0e0c000303033c022f2b281f1aa9000e0e0c000303033c021f2b28261a9900020215000e0e0c000303033c020b2b28221a85000e0e0c000303033c024b2b28131a75000e0e0c000303033c023b2b28071a65000e0e0c000303033c022b2b28401a55000e0e0c000303033c021b2b28191a45000e0e0c000303033c020b2b282a1a35000e0e0c000303033c020b2b280e1a25000e0e0c000303033c02072b56172c800002420e0e0e000000007401000000000000|@6367,I251| 6903:D2,60|00802b28091a38000e0c000303033c020b2b3e1a2a000e0e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6904:D2,52|00812c561756285639564a565b566c1a26000e0e0e0c00082c2a35452a364664430e0e0e0e0e0e0e000000002c00000000000000|@6772,@6905| 6905:O1|@6906 6906:D43,3116|008630373123092a3b1a240c0e0c00032a3b1a1b0c0c00032928291a160c0e0e0e0c00031a110c0e0e0c000203032902012a220c2306220d230a220e230f2a3b1aed0b0e0e0c00032a3b1ae30b0c00032e28221ade0b0e0e0e0c000307ca22111ad90b0e0e0c00022211362212370403003b2a1aca0b0e0e0e0c00035029362a371ac00b2e2b6a2b2a2f6a1aba0b221b69292b221c221b221b221b1aae0b0e0e0e0c0007221b37221c23092a3b1a800b0e0c00032a3b1a770b0c00032928291a720b0e0e0e0c00031a6d0b0e0e0c000203032902012a29281a1a580b0e0c00032705030a221b1a530b0c00020217281a1a5d0b0e0e0c000229221d1a560b0e0e0e0c0003641a500b221e6928301a4c0b221f1a4b0b221c322f222422232223222368081a3e0b020264010e0e0e0c00052935221f3a2220230e2a3b1af20a0e0e0e0c00032a3b1ae70a0c000322162b22152c22166805222437222523092a3b1ace0a0e0e0e0c00032a3b1ac30a0c00032928291abe0a0e0e0e0c00031ab90a0e0e0c000203032902012a29280f1aa40a0e0c00032705030a22241a9f0a0c00020217280f1aa90a0e0e0c00022922261aa20a0e0e0e0c000364222537222623092a3b1a6b0a0c00032a3b1a630a0c00032928291a5e0a0e0e0e0c00031a590a0e0e0c000203032902012a29222c0c00021a450a0e0e0c0002270503611a690a22261a500a0e0c000350222537222623092a3b1a1b0a0c00032a3b1a130a0c00032928291a0e0a0e0e0e0c00031a090a0e0e0c000203032902012a29222c0c00021af5090e0e0c00022705030e22251aeb090c0002501e4c3b02013b02013b341a0a0a0e0e0e0c0002311a040a0e0c00023c28403b1afd090e0e0c00042a2c3b312d680528132a69293169271a0fd22e28201aa0090e0c000307c822111a9d090e0e0c000222123a2213230e2a3b1a80090e0c00032a3b1a77090c0003221637221723092a3b1a68090e0c00032a3b1a5f090c00032928291a5a090e0e0e0c00031a55090e0e0c000203032902012a29282e1a40090e0c0003031e221b1a3d090e0e0c0002220f31220e32220f6805281b2a69292b69660fd41a5d09221c690403002a2a1a56090e0e0e0c0003502936280b1a280922201a4709222322232f2220222422242224222868091a17090c0005293522203a2221230e2a3b1ad2080204b7089a000e0c00032a3b1ac3080c000322172b22162c221768053c28401a04091af1080e0e0c0004280f3c2b322e6805222737222823092a3b1a94080e0c00032a3b1a8b080c00032928291a86080e0e0e0c00031a81080e0e0c000203032902012a29282e1a6c080e0c00032705030a22271a67080c0002021b282e1a71080e0e0c00022922291a6a0802020c000e0e0e0c0003642a2d69270d270a0fca2e28211a30080e0c000307cb22111a2d080e0e0c000222123a2213230e2a3b1a10080e0c00032a3b1a07080c0003221637221723092a3b1af8070e0c00032a3b1aef070c00032928291aea070e0e0e0c00031ae5070e0e0c000203032902012a29282f1ad0070e0c0003031e221b1acd070e0e0c0002220f31220e32220f6805281b2a69292b69660fdd1afd07221d69040200221c2b2b2220221f221f221f221f0e0e0c0008502935221e37221f23092a3b1a7d070e0e0c00032a3b1a73070c00032928291a6e0702024f070e0e0e0c00031a65070202af010e0e0c000203032902012a0402002a28301a49070e0e0c0003037022241a45070e0e0c00021a8d0722276928301a550722281a84072225222a2f222d222c222c222c68081a46070e0e0e0c00052935332a6922293a222a230e2a3b1afb060c00032a3b1af3060c000322202b221f2c222068052e1a46070e0e0e0c0002402a2c6a220c2a452c46260d02b52a02021b01280b1ac8060e0c0003037622241ac5060e0e0c00021a1907222769280b1ad50622281a10072225222a2f222d222c222c222c68081ac6060e0e0e0c00052935332a6922293a222a230e2a3b1a7b060c00032a3b1a73060c000322202b221f2c222068053c28401ab4061aa1060e0e0c00042819302b2d6b220c2a452c46260d022f22243a2225230e2a3b1a3c060e0c00032a3b1a33060c0003221b2b221a2c221b68052816220c2b6a2f2a452b46260729352a36222637222723092a3b1a09060e0e0c00032a3b1aff050c00032928291afa050e0e0e0c00031af5050e0e0c000203032902012a29282f1ae0050e0c00032705030a22261adb050c00020217282f1ae5050e0e0c00022922281ade050e0e0e0c0003642b2b69270c270a0fca2e281f1aa8050e0c000307cb22111aa5050e0e0c0002221237221323092a3b1a88050e0c00032a3b1a7f050c00032928291a7a050e0e0e0c00031a75050e0e0c000203032902012a29282d1a60050e0c000327051a5b050c0002032b1abb05221469280b1a6f0522151ab205221222172f221a22192219221968081a60050e0c000529356502013b22133a2214230e2a3b1a16050e0e0e0c00032a3b1a0b050c0003332b322c336805221837221923092a3b1af5040e0e0c00032a3b1aeb040c00032928291ae6040202c7040e0e0e0c00031add04020256000e0e0c000203032902012a29282d1ac4040e0c00032705030a22181abf040c00020217282d1ac9040e0e0c000229221a1ac2040e0e0e0c0003643c28401ae5041ad2040e0e0e0c000428112a322e6b292d69270a0fce2e28261a79040e0e0c000329030b22121a74040e0c000202013b221337221423092a3b1a55040e0e0c00032a3b1a4b040c00032928291a46040e0e0e0c00031a41040e0e0c000203032902012a22183a22192306221a230a221b230e221c230f2b3b1a16040e0e0e0c00032e3b1a0b040c00032b3b1a03040c00032d3b1afb030c0003302c2e2c2e68053328081aef030c00030384222236293b1ade030e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1ac0030e0c00032e3b1ab7030c00032b3b1aaf03020294030c00032d3b1aa3030c0003302c2e2c2e6805222e1aa0030e0c0002503c28401add031aca030e0e0e0c000428122a220d2d1aef0368052223221222222212222368052a2a69270f0fd13328431a60030e0c00030380222236293b1a4e030e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a30030e0c00032e3b1a27030c00032b3b1a1f030c00032d3b1a17030c0003302c2e2c2e6805222e1a14030e0c0002503c28401a51031a3e030e0e0e0c000428122a220d2d1a670368052223221222222212222368052a2a69270f0fcd33282b1ad4020e0c00030384222236293b1ac2020e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1aa4020e0c00032e3b1a9b020c00032b3b1a9302020276020c00032d3b1a87020c0003302c2e2c2e6805222e1a84020e0c0002503c28401ac1021aae020e0e0e0c000428122a220d2d1adb0268052223221222222212222368052a2a69270f0fcd33281e1a44020e0c00030384222236293b1a32020e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a14020e0c00032e3b1a0b020202ee010c00032b3b1aff010c00032d3b1af7010c0003302c2e2c2e6805222e1af4010e0c0002503c28401a31021a1e020e0e0e0c000428122a220d2d1a4f0268052223221222222212222368052a2a69270f0fcb3328341ab4010e0c00030384222236293b1aa2010e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a84010e0c00032e3b1a7b0102025e010c00032b3b1a6f010c00032d3b1a67010c0003302c2e2c2e6805222e1a64010e0c0002503c28401aa1011a8e010e0e0e0c000428122a220d2d1ac30168052223221222222212222368052a2a69270f0fdd3328171a24010e0c0003033d22221a21010e0e0c0002222422241a95010e0e0c000329352a3629362a38221b2b221a2c221b68052d2a1a7d010202d0000e0e0c0003292b69270802c43328111adb000c000303033c021b3328061acd000e0e0c000303033c020b3328181abd000e0e0c000303722221352222362223370402002c2c2c2229222b1a3001221a301a2e010e0e0e0c00095029352a363c28401ad9001ac6000e0e0e0c00043c28401a12011ab7000c00043c28401a0a011aab000c00042d2b2d2f2d6805280e2a692e362f3822222b22212c2222680502022e002c2a69270e022728181a5b000c00022922241a56000e0e0e0c00035022231a32000e0e0e0c0002501ac0002b69642711270a1f070e0e0e00000000240c000000000000|@6908,I253,I251,I218,@6175,@6351,@6909,@6910,@6725,@6396,@6370,@6911,@6509,@6912,@6430,@6913,@6731,@6733,I11,@6914,@6494,@6916,@855,@6922,@6923,@6924,@6925,@6927,@6928,@6929,@6930,@6780,@6776,@6783,@6785,@6787,@6518,@6931,@6554,@6817,@6741,@6907,@3454| 6907:O1|@6936 6908:S61|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129 6909:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 6910:D2,44|00802b281a1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6911:D2,60|00802b280f1a38000e0c000303033c020b2b28301a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6912:D1,36|0081560856192d563a564b565c566d5677320e7b09040008000000001c00000000000000|@6394| 6913:S21|456e64206f66206c65742065787072657373696f6e 6914:D10,116|00821a73002e1a73000c0003291a70001a69000e0e0c0003291a68001a69000e0e0c0003291a64000e0c00023b3e3b3b2d6805291a59000e0e0c000203041a5300103b503c3b2b346b5667385677230c2a3b3c1a42000e0e0e0c0004502b2a347d0d00020e0e0e0e000000006c00000000000000|@6915,@6493,@389,@6491,@6184,@6187,@6373,I105,@1784,I255| 6915:S73|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e2831297265706f7274447570283329 6916:D2,52|00812c561756285639564a565b566c567d568e1a22000e0e0e0c000a2c2a35452a364664430e0e0e000000002c00000000000000|@6394,@6917| 6917:O1|@6918 6918:D12,220|00881adb00336929331ad8000e0c000329352a362a2a69220c0c0002220d37220e23092a3b1ac0000e0c00032a3b1ab7000c00032928291ab2000e0e0e0c00031aad000e0e0c000203032902012a2928111a98000e0c00032705030a220d1a93000c0002021728111a8d000e0e0c000229220f1a86000e0e0e0c0003641a8000221069040200332b2b221322112211221122150e0e0c00085029352a362f35303731392c362d382d2b2e2c2f68053c28401a50001a51000e0e0c0004220e2a220f342e6805292c6927121f090e0e0e0e00000000d400000000000000|@6920,@6921,@6518,I253,I251,I218,@6175,@6396,@6370,@6919,@855,I11| 6919:D2,60|00802b282e1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6920:S72|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129676574456e747279283129 6921:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6922:D2,76|00802b280b1a48000e0c000303033c021b2b28301a39000e0e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000004400000000000000|@6367,I251| 6923:D2,60|00802b28301a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6924:D1,36|0081560856192d563a564b565c566d5677320e7b09040008000000001c00000000000000|@6394| 6925:O1|@6926 6926:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203212b352c363c28403b1a37000c00042b2a692b1a31000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,I11,@6925| 6927:D2,60|00802b280b1a38000e0c000303033c020b2b282f1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6928:D1,36|0081560856192d563a564b565c566d5677320e7b09040008000000001c00000000000000|@6394| 6929:D2,60|00802b282d1a38000e0c000303033c020b2b280b1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000003400000000000000|@6367,I251| 6930:D1,36|0081560856192d563a564b565c566d5677320e7b09040008000000001c00000000000000|@6394| 6931:O1|@6932 6932:D16,252|00813c28401af8001af9000e0e0c000428062a1af2006a2e291af0000e0c0002293c1aeb000c00036403033c0246291ada000e0e0e0c00023b2a1ad7000c00036403041ad200103b50291acf000c0002030329020b293f1ac6000e0e0e0c00032928301abe000e0e0e0c0003641ab8000e0c00020303290221291a8f000c0002293c1aa7000c00032b3c2b1aa2000e0e0e0c00046525011e7f3b64292b69293b69291a8f000c00023b2a3b6a3c28402b1a51000e0e0c00043c2a693e2e2b6a3c28401a3b001a3c000e0c000428062a1a36006a2a3b2d1a5f000c0004503d2a220c6a281822112b2d22136805270d430e00000000f400000000000000|@6934,@855,I11,79992,I223,I232,I231,@337,I105,I252,I251,I218,I107,@6192,@6933,I255| 6933:O1|@6935 6934:S26|50415253455f5452454528292e6d6b53656c6563746f72283229 6935:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@6933| 6936:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6937:O1|@6938 6938:D2,276|00802b28171a10010e0c000303033c0fd82b28081a01010e0e0c000303033c025b2b28431af1000e0e0c000303033c024b2b282b1ae1000e0e0c000303033c023b2b281e1ad1000e0e0c000303033c022b2b28341ac1000e0e0c000303033c021b2b28061ab1000e0e0c000303033c020b2b28181aa1000e0e0c000303033c027f2b28111a91000e0e0c000303033c021b2b28061a81000e0e0c000303033c020b2b28181a71000e0e0c000303033c024f2b28201a61000e0e0c000303033c023f2b28211a51000e0e0c000303033c022f2b281f1a41000e0e0c000303033c021f2b28261a3100020215000e0e0c000303033c020b2b28221a1d002d7e030003420e0e0e0e0e0e0e000000000c01000000000000|@6367,I251| 6939:D15,1228|008730373123092a3b1ac4040e0c00032a3b1abb040c00032928291ab6040e0e0e0c00031ab1040e0e0c000203032902012a2928261a9c040e0c000303033c02cb2928201a8d040e0e0c000303033c02bb29281f1a7d040e0e0c000303033c02ab2928211a6d040e0e0c000303033c029b2928081a5d040e0e0c000303033c025b2928431a4d040e0e0c000303033c024b29282b1a3d040e0e0c000303033c023b29281e1a2d040e0e0c000303033c022b2928341a1d040e0e0c000303033c021b2928061a0d040e0e0c000303033c020b2928181afd030e0e0c000303033c022b2928061aed030e0e0c000303033c020b2928181add030e0e0c000303033c020b29283c1acd030e0e0c00031ac9030e0e0c0002270507d11ac103311ac1030e0e0c00035030373123092a3b1aa1030e0e0c00032a3b1a97030c00032928291a92030e0e0e0c00031a8d030e0e0c000203032902012a29220f0c000203033c0fcc2928261a6d030e0e0c000303033c0fd02928201a5d030e0e0c000303033c02c729281f1a4d030e0e0c000303033c02b72928211a3d030e0e0c000303033c02a72928081a2d030e0e0c000303033c025f2928431a1d030e0e0c000303033c024f29282b1a0d030e0e0c000303033c023f29281e1afd020e0e0c000303033c022f2928341aed0202027b000e0e0c000303033c021b2928061ad9020e0e0c000303033c020b2928181ac9020e0e0c000303033c02332928061ab9020e0e0c000303033c020f2928181aa902020219000e0e0c000303033c020f29283c1a9502020205000e0e0c00031a8d020e0e0c00022705030f301a8c020e0c0002502038013b02013b02013b1a7e02346904020032342c2c220e1a74020e0c00065029352a36220c37220d23092a3b1a43020c00032a3b1a3b020c00032928291a36020e0e0e0c00031a31020e0e0c000203032902012a2928381a1c020e0c0003030c22111a21020e0e0c000202591a230222121a0e020e0e0e0c000350221137221223092a3b1aeb010c00032a3b1ae3010c00032928291ade010e0e0e0c00031ad9010e0e0c000203032902012a2928111ac4010e0c00032705030a22111ac7010c000202013b1ace0122156904020022132b2b221722152215221522190e0e0e0c00085029352a3633353437220c392c362d382d2b2e2c2f68053c28401a9b011a9c010e0c00043c28401a8e011a8f010c00043c28403b1a85010e0e0c00043322152d2d302e6806222037222123092a3b1a3f010c00032a3b1a37010c00032928291a32010e0e0e0c00031a2d010e0e0c000203032902012a29283e1a18010e0c0003033f22251a1d010e0e0c000204020022292a2229222922292229222922291a1f010c00095029352a36322b692a362b3822152b22162c221768052c2a69270802072e3b6929346964222637222723092a3b1abc000e0c00032a3b1ab3000c00032928291aae000e0e0e0c00031aa9000e0e0c000203032902012a29222e0c00021a95000e0e0c0002270503611ab50022271a8c000e0c000350222637222723092a3b1a6b000c00032a3b1a63000c00032928291a5e000e0e0e0c00031a59000e0e0c000203032902012a29222e0c00021a45000e0e0c00022705030d22261a43000c0002501e4c02023b5002023b502922282a35452a364627201f080e0e0e0e00000000c404000000000000|@6941,I253,I251,I218,@6942,@6370,@6175,@6943,@6764,@6297,@6944,@1965,I11,@6875,@6940| 6940:S12|456e64206f66206d61746368 6941:S50|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296d61746368283129 6942:S5|4d61746368 6943:D2,44|00802b28381a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6944:D2,44|00802b283e1a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6945:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d04000229356442000000002400000000000000|@6754,I251| 6946:D2,44|00802b3d1a29000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6947:O1|@6948 6948:D12,436|00872f373023092a3b1aac010e0c00032a3b1aa3010c00032928291a9e010e0e0e0c00031a99010e0e0c000203032902012a29282c1a84010e0c00030326341a82010e0e0e0c000250220e3c220e220e220e220e220e220e1a6d01220f0e0e7b0a0f00091a6501220f69040200220c220e2c2c22111a58010e0c00065029352a36220f37221023092a3b1a2b010c00032a3b1a23010c00032928291a1e010e0e0e0c00031a19010e0e0c000203032902012a2928111a04010e0c00032705030a220f1aff000c0002021728111a05010e0e0c00022922111afe000e0e0e0c000364040200221022152b22142213221322131ae8000e0c00085029352a36221337221423092a3b1aaf000c00032a3b1aa7000c00032928291aa2000e0e0e0c00031a9d000e0e0c000203032902012a0402002a3d1a86000e0e0e0c0003032522191a81000e0e0c000250221c221c2b221c221c221c221c221c1a6d000e0e0c0009500206293b4530465029352a36220c35220d37220e393436220c382d2b2e2c2f68053c28403b1a57000c0004221422112c2c2228680529336922252a453346271e1f080e0e0e0e0e00000000ac01000000000000|@6950,I253,I251,I218,@6175,@6947,@6949,@6764,@6396,@6370,@6761,I11| 6949:D2,44|00802b28111a28000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000002400000000000000|@6367,I251| 6950:S36|50415253455f44454328292e706172736544656328332964656328342976616c42283229 6951:O1|@6952 6952:D1,20|00803b420e0e0e0e000000000c00000000000000|@6744| 6953:D14,468|00812b372c23092a3b1acc010e0c00032a3b1ac3010c00032928291abe010e0e0e0c00031ab9010e0e0c000203032902012a2928341aa4010e0c0003270503272b36293b1a91010e0e0c000328222a1a92010e0e0e0c00032928221a86010e0e0e0c00036602b52b372c23092a3b1a67010c00032a3b1a5f010c00032928291a5a010e0e0e0c00031a55010e0e0c000203032902012a29282b1a40010e0c000303033c022b29281e1a31010e0e0c000303033c021b29283a1a21010e0e0c000303033c020b2928181a11010e0e0c00032705030f2b36293b1afd000e0e0c00036402392b372c23092a3b1aeb000c00032a3b1ae3000c00032928291ade000e0e0e0c00031ad9000e0e0c000203032902012a27041ad1000e0e0c00022c3a2d23062e230a2f230e30230f2b3b1aa9000e0e0c00032e3b1a9f000c00032b3b1a97000c00032d3b1a8f000c0003302c2e2c2e6805220e1a94001a89000e0e0c000329220c1a7e000e0e0e0c0003291a80001a71000e0e0c0003291a78001a79000e0e0c0003291a74000e0c00023b3e3b3b2d6805291a69000e0e0c000203041a6300103b503c3b2b326b2214382215230c2a3b3c1a52000e0e0e0c0004502b2a22170e0e0e7d18000200000000cc01000000000000|@6955,I253,I251,I218,@389,@6396,@6956,@6954,@6184,@6187,@6373,I105,@1784,I255| 6954:S10|2077617320666f756e64 6955:S20|534b4950535f28292e6e6f74666f756e64283229 6956:S14|2065787065637465642062757420 6957:O1|@6958 6958:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@6960,@6959| 6959:O1|@6961 6960:S30|535452554354555245535f28292e646973706c6179546f70446563283129 6961:D16,188|00812b3b1ab9000e0e0c000303051ab30002952c353b1aaf000c000303392c361aa9002a1aa9002f1aa9000e0e0c00051aa5002a691aa4002a693b3e3b3b2d6805291a9b000c000203041a9700103b503b5029270502512c353c1a6b000c000303392c361a81002a1a81002f1a65000e0e0c00051a79002a691a78002a693b3e3b3b2d6805291a57000c000203041a5300103b503b50292705020d2c36292d1a56002e0e7e050003430e0e0e0e0e0e0e00000000b400000000000000|@6963,I232,@1041,I251,@6964,@6325,@7157,@1058,@5437,I105,@1784,@7169,@6325,@1058,@1999,@6962| 6962:O3|@7172,@7153,@7152 6963:S30|535452554354555245535f28292e646973706c6179546f70446563283229 6964:O1|@6965 6965:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@6967,@6966| 6966:O1|@6968 6967:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283129 6968:D23,500|00812c3529352a372f3630383123060402002a3c1ae1010e0e0c0003030c2c353d1ad4010e0c000302013b031a2c3629352a362b372c382b2b2b6a296801302a452f4626080206293b452d465029352a362d28281aa5010e0e0c00033e2a69291a9d010e0e0c000203041a9701103b503b50321a92011a7f010c000303033c0222321a7b010c00021a81010e0e0c00020310323b1a71013b3f1a74010e0c000602013b03033b0228321a68011a4d010e0e0c00033e2a69291a45010e0e0c000203041a3f01103b503b50291a4a016965220e3c1a46010e0e0e0c0003332a1a3f010c0003293b69293b1a0c010e0c000303032c020b2c2a1a2a010e0e0e0c00033b3c3b3b2d6805291af5000e0e0c000203041aef00103b503b50321ae2000e0e0e0c00021ae5000e0e0c00020349323529352a362903051aee0002031aed003e2a69291aba000e0e0e0c000203041ab300103b503b5022183c1ac0000e0c00032d2a1abb000c0003293b691ac2002a692d2a69270902013b22143c1a9e000e0e0e0c0003332a1aab000c0003293b691aa6002a691aa5002a691aa4002a69293b1a55000e0e0c000303032f020b2f2a1a92000e0e0e0c00031a8d002a69322a691a89002a6922112a693b3e3b3b2d6805291a2c000e0c000203041a2700103b503b5029271e430e0e00000000ec01000000000000|@6970,I251,@389,I105,@1784,I48,I218,I154,@6971,@1829,I107,@6972,@7150,@7014,@6971,@1058,@7152,@1058,@1998,@1058,@6969,@1057,@1058| 6969:O1|@7168 6970:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283229 6971:S2|203a 6972:O2|@6974,@6973 6973:O2|@7007,@7006 6974:D26,364|00812b3b1a69010e0e0c000303051a63010fcb2c353d1a5f010c000303d52c3629362a372b382c392c31300e0e0c00033b1a48010e0c00022c332b1a42010e0e0e0c00043e2f69291a39010e0e0c000203041a3301103b503b50343c1a2d010e0e0c00032e1a28010e0c00023b1a0c010e0c00022a2c2b1a1a013b1a1a010e0e0e0c0006293b691a12012a691a11012a691a10012a69312a69293b1ada000e0e0e0c0003030333020b332a1afa000e0e0e0c00031af5002a691af4002a691af3002a691af2002a691af1002a6922122a693b3e3b3b2d6805291aa800020278000e0c000203041a9f00103b503b5029271a02652c353b1a7f000c000303412c3656172a1aba002f1aba000e0e0e0c0005291ab4000e0c00021ab1002a691ab0002a693b3b3c3b2d6805291a57000c000203041a5300103b503b5029270602192c363e2a69291a3c000e0c000203041a3700103b503b502965430e0e0e0e0e0e0e000000006401000000000000|@6976,I232,@1041,I251,@2008,@2215,I105,@1784,I107,@6977,@2219,@2104,@1058,@1998,@1058,@6999,@1058,@2037,@1058,@7001,@1058,I48,@7002,@6975,@1058,@1833| 6975:O1|@7005 6976:S27|5349474e41545552455328292e646973706c617953696773283229 6977:O1|@6978 6978:D15,268|00802b350a05003b000c00b40040004e00d1002b36293a293b1af4000e0c00032b352c362d392b1aea001aeb000c00033b2b69293b6928052c2f322d6805270902bc1ad70002b72b3629352a3628062b2b6a6602a92b362c372a1ab7001ac0000e0c00031abd000e0e0c0002291ab8000e0c00023b2a2d6a2c030329020e3c28402b1aa7000c00043c2a69643e2d2b6a2e03032902213c28401a94001a8d000e0e0c000428062a1a8a006a2a3b2d1a87000c0004502965270702432b362c382a1a51000e0e0c00022a1a48000e0c00023d2b2b6a270402262b36291a36001a5b000c0003293c1a57000c0003291a54000e0c00023b2a3c6a3e2c2b6a2705420e000000000401000000000000|@6980,I253,@6977,@6981,@1965,@6983,@6985,@6991,I11,@855,79992,I255,@6993,@6995,@6979| 6979:O1|@6998 6980:S32|545950455f5452454528292e7479706546726f6d547970655061727365283129 6981:O1|@6982 6982:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d362a2e0e0c00022a2f1a2b000c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@6981| 6983:O1|@6984 6984:D12,212|00812c1ad2000e0e0e0c00021acd000e0e0c000203a92c352d362a352b362a352a310e0e0e0c00022a291ab3000c0002293c1aaf000c00036403033c0246291a9e000e0e0e0c00023b2a1a9b000c00036403041a9600103b50291a7b000c0002030329020b293f1a86000e0e0e0c00032928301a7e000e0e0e0c0003641a5c000e0c00020303290221291a53000c0002293c1a63000c00032b3c2b1a5e000e0e0e0c00046525011e7e3b64292b692f341a4d000e0e0c00032a2a69270902013b430e0e0e0e0e0e0e00000000cc00000000000000|@1785,I105,I218,I223,I232,I231,@337,I252,I251,I107,@6192,@6983| 6985:O1|@6986 6986:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031a2b352c362a352a1a30000e0c0002292b2e1a2a00327b050700043b420e0e0e0e0e0e000000003c00000000000000|@6988,I105,I218,@6985,@6987| 6987:O1|@6989 6988:S25|545950455f5452454528292e736f72744c6162656c73283129 6989:D13,260|00822d1a02010e0e0e0c00021afd000e0e0c000207cd2d352e362a352f1af0000e0c00022a1ae8000e0c00022a2a1ae3000c000365036f2f2a1adc000e0c000303033c024a2f1abf000c00021abd000e0e0c00020314291aae000e0e0e0c00021aa9000e0e0c000202013b03212f3b2b3b3f2e1a9a000e0e0e0c00021a9d000e0e0c00031a99000e0e0c000602013b03033b02102f2a1a8b000c000303051a870002013c02232f1a66000e0e0e0c00022a1a5c000e0c00022a2a1a6f000c00036503051a620002013c293b1a62000e0e0e0c000303052f326902112b31311a530002020b000c00042d2a6964270402032b3b69440e0e0e0e00000000fc00000000000000|@6990,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,I232,@6987| 6990:S35|545950455f5452454528292e736f72744c6162656c73283129656e7465722833292829 6991:O1|@6992 6992:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@6991| 6993:O1|@6994 6994:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d362a2e0e0c00022a2f1a2b000c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@6993| 6995:O1|@6996 6996:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362d3c1a41000e0e0c0003292c692f3c1a38000e0c00032c2a1a33000c00032b2a69270602013b430e0e0e0e0e0e0e000000004c00000000000000|@6997,I105,I218,@510,I106,@6995| 6997:S26|545950455f5452454528292e6d6170746f5265636f7264283229 6998:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@6979| 6999:O1|@7000 7000:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6999| 7001:O2|3,@6331 7002:O1|@7003 7003:D11,252|00832d1afa000e0e0e0c00021af5000e0e0c000203d72d352e36293b1ae9000e0e0c000303202d3b1ae1000e0e0c000303051adb00020d2a2e69310e0e0c0002293b696402a42d3b1ac1000e0e0c000303051abf0002932e282c1aab000c000303033c020b2e283b1a9d000e0e0c00031a91000e0e0c00022b2f69320e0c00023c2b3b6a291a78000e0c000203041a8700103b503e3269291a65000e0e0c000203041a7300103b50293b692b2a692d2a693b3b3b3b2d6805291a44000e0c000203041a5300103b50220c3c1a4e000e0e0e0c000322103322102c1a43000c00051a41002a692c2a69270b6502013b1f0400000000f400000000000000|@7004,I105,I218,I251,I232,@1975,@1975,@1784,I107,@7002,@1058| 7004:S27|5349474e41545552455328292e646973706c61794c697374283429 7005:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@6975,@3048| 7006:O3|@7010,@7009,@6972 7007:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@7008| 7008:S28|5349474e41545552455328292e646973706c61795370656373283129 7009:O2|@7148,@6972 7010:D37,668|00812b3b1a99020e0e0c000303051a93020fd42c350a050047000b016000a3000c00f4012c361a7f02562869292b1a7b02301a7b020c00051a79022a691a78022a693b3e3b3b2d6805291a6f020c000203041a6b02103b503b502927060fd02c362c3c1a5e020e0e0e0c00032a2a1a57022f0e0e7e0600032c362c3c1a45020e0e0c000356272b1a42022c1a22020e0e0e0c00051a39022a691a38022a693b3e3c3b2d6805291a13020c000203041a0f02103b503b502927060fcd2c372d382a1a15020e0e0c000203033b02031a0c021a0d022b283d311ad6010e0e0e0c0005293b1aff010202a4010c000303032a020b2a2a1af2010e0e0e0c00031aed012a691aec012a693b3e3b3b2d6805291aab010c000203041aa701103b503b502927080fd12c372d382a352a1a8f0102025c010c00021aa1010e0e0c000203852a352a1ab0011ab1010e0e0c00033e2a69291a69010e0e0c000203041a6301103b503b50313c1a5d010e0e0c00032c1a8c010e0c00023b1a88010e0c00022a2c2b1a82013b1a8201020203010e0e0e0c0006293b691a76012a692f2a691a72012a691a71012a693b3b3b3b2d6805291a0c010e0c000203041a0701103b503b5029270d02463e2a69291af2000e0e0e0c000203041aeb00103b503b50293b691a38012a691a37012a693b3b3b3b2d6805291aca00020297000e0e0e0c000203041abf00103b503b502927056602812c372d382a35291a0a011adf000c00033e2a69291a99000e0e0c000203041a9300103b503b50303c1a8d000e0e0c00032d1abc000e0c00023b1ab8000e0c00022a2c2b1ab2003b1ab2000e0e0e0c0006293b691ac2002a692f2a691abe002a691abd002a693b3b3b3b2d6805291a40000e0c000203041a3b00103b503b5029270f430e0e000000009402000000000000|@7012,I232,@1041,@7013,@6325,@7002,@1058,@2001,I105,@1784,I107,@7016,I48,@1058,@7140,I218,@7141,@7142,I251,@7145,@1058,@7147,@6971,@389,@6977,@2008,@2219,@2104,@1058,@2357,@2354,@2357,@2354,@6971,@1058,@2357,@7011| 7011:O2|3,@2347 7012:S28|5349474e41545552455328292e646973706c61795370656373283229 7013:D7,132|00802b352c362a362b3829352a363e2d69291a73000c000203041a6f00103b502a03051a6a0002031a69003e2a69291a56000e0e0e0c000203041a4f00103b50303c1a53000c00032e2a56c70e0c0003293b691a46002a692d2a69302a693b3e3b3b2d6805291a1f000c000203041a1b00103b5029271042000000007c00000000000000|@7015,I105,@1784,@7014,@6971,I107,@1058| 7014:S3|203a3e 7015:S46|5349474e41545552455328292e646973706c61795370656373283229646973706c61795369677342696e64283129 7016:O3|@7018,@7134,@7017 7017:O2|@7138,@7016 7018:D147,3604|00811a130e2a692c3b1a100e0e0c000303051a0b0e0fce2d350a1e00cf05c3010b0c1b027b0b930957050b049300c3030f05f908970a0b033e00be003b09030a340d37084f0a5f015a0083039800270bb107f408e70aa302ef082d3629353e2a69291abf0d0c000203041abb0d103b503b5029660fcb2d36292e2d0e0e0c0003291aa80d691aa80d2a691aa70d2a693b3b3b3b2d6805291a8a0d0e0e0e0c000203041a830d103b503b502927060fd71a860d0fd42d3628232a1a800d0e0c00033e2a69291a5d0d0e0e0c000203041a570d103b503b5029660fcb2d362e382e3c1a5d0d02021a0d0e0e0c00032a2a2f1a520d0e0e0e0c00042c03051a4a0d023a2b1a200d0e0c00021a410d0e0e0c00021a390d0e0e0c000203051a330d02031a320d3e2a69291afb0c0c000203041af70c103b503b50293b6965293b1a190d0202be0c0e0e0c000303032a020b2a2a1a0a0d0e0e0e0c00031a050d2a693b3d3b3b2d6805291abc0c0e0c000203041ab70c103b503b502927080fd22d362e372e3c1abc0c0204790c770c0e0e0e0c00032b2a2f0e0e0c0003303c1aa30c0c00032c2a3102025a0c0e0e0c0003293b691ab20c2a691ab10c2a691ab00c2a692f2a693b3e3c3b2d6805291a580c0e0c000203041a530c103b503b5029270c0fca2d362e372e3c1a580c0e0c00032b2a2f0e0e0c0003303c1a470c0c00032c2a310e0e0c0003293b691a660c2a691a650c2a691a640c2a692f2a693b3e3c3b2d6805291a000c0e0c000203041afb0b103b503b5029270c0fd92d3629352a362f3c1afe0b0e0e0e0c00032b2a300202b20b0e0e0c0003291a240c691a240c2a691a230c2a693b3b3b3b2d6805291ab60b0e0e0e0c000203041aaf0b103b503b50220c3c1abc0b0e0c000330287c2b56e71af70b0c00051af50b2a692c2a693b3e3c3b2d6805291a7d0b0202560b0e0e0c000203041a730b103b503b5029270e0fcb2d362e372e3c1a780b0e0c00032a2a2f0e0e0c0003303c1a670b0c00032d2a310e0e0c0003293b691aa60b2a691aa50b2a691aa40b2a692f2a691aa00b2a691a9f0b2a693b3b3b3b2d6805291a160b0202ef0a0e0e0e0c000203041a0b0b103b503b5029270e0fd42d362e372e3c1a100b0e0c00032b2a2f0e0e0c0003303c1aff0a0c00032c287c2b56971a3b0b0c00051a510b2a691a500b2a693b3e3c3b2d6805291abf0a0c000203041abb0a103b503b50293b691a340b2a69302a693b3b3b3b2d6805291a9c0a0202750a0e0c000203041a930a103b503b5029270d0fd12d362d3c1a9a0a0e0e0e0c00032a2a2e0e0e0c0003293b691af60a2a691af50a2a693b3b3b3b2d6805291a580a0e0c000203041a530a103b503b502927070fdd2d361ad40a2c692e3c1a550a0e0e0c00032b1ac80a2b2d1a8f0a0202040a0c00051abd0a2a691abc0a2a693b3e3c3b2d6805291a0f0a0c000203041a0b0a103b503b502927070fd62d362e372a353c1a270a0c000303512a36293c1a8b0a0c00033e2a69291add090e0e0c000203041ad709103b503b50293b691a700a2a691a6f0a2a693b3b3b3b2d6805291ab60902028f090e0e0e0c000203041aab09103b503b50292707025f2a353b1acb090c000303512a36293c1a2f0a0c00033e2a69291a81090e0e0c000203041a7b09103b503b50293b691a1c0a2a69020243091a170a2a693b3b3b3b2d6805291a56090e0e0e0c000203041a4f09103b503b5029270702031af6092f3c1a55090e0e0c00032b1aec092b1aec091a8d09020202090e0e0c00051ae1092a692c2a693b3e3c3b2d6805291a0d090e0e0c000203041a0709103b503b502927080fd12d362d3c1a0e090e0e0e0c00032a283b2b2e1a48090e0c0005291aa4090e0c00021aa1092a691aa0092a693b3e3c3b2d6805291ac3080c000203041abf08103b503b502927070fd12d3629372a383e2b69291aa4080e0c000203041a9f08103b503b503e2b69291a8f080c000203041a8b08103b503b50293b691a50092a691a4f092a691a4e092a691a4d092a691a4c092a69302a691a48092a691a47092a693b3e3c3b2d6805291a4e080e0e0e0c000203041a4708103b503b5029270f0fd52d3629352a372b392c38293c1a5e08020203080e0e0e0c000307da313c1a35080e0e0c00032c1a00092b1a00091a6d080e0e0c00052c1a00080e0c00021a21080e0e0c00021a19080e0e0c000203033b0233333c1afe070202bb070e0e0e0c00032d1acc082b1acc081a31080e0e0c0005291ac4080e0c00021ac1082a691ac0082a692704343c1acb070c000330283b2b220c1a07080c00053b3e3c3b2d6805291a95070e0e0c000203041a8f07103b503b50293b691a8c082a691a8b082a69293b1aa8070e0c000303032f020f2f2a1a7a0802023f070e0e0e0c0003293b1a8b070c000303051a670802111a62082a1a6208020245000e0e0e0c0003293b1a6b070c0003030332020b322a1a4a080e0e0e0c00031a45082a691a44082a693b3e3c3b2d6805291a0f070c000203041a0b07103b503b5029270f02a2313c1a14070e0c00032c1a1c082b1ae0071a4d070e0e0c00052c1ae0060e0c00021a01070e0e0c00021af9060e0e0c000203033b022c333c1ade060e0e0e0c00032d1ae8072b1ab0071a15070e0e0c00051add072a691adc072a691adb072a692704293b1aca060e0e0e0c000303032a020b2a2a1ac6070e0e0e0c00031ac1072a691ac0072a693b3e3c3b2d6805291a6b060c000203041a6706103b503b5029270727050fca2d36291a51060e0e0c00021a71060e0e0c000203112935293a293c1a6d060e0e0c00036502013b03051a770702031a76073e2a69291a1f060c000203041a1b06103b503b502f3c1a29060e0e0c00032c1a58072b1afc061a61060e0e0c00051a4d072a692c2a693b3e3c3b2d6805291ae5050e0e0c000203041adf05103b503b502927080fcb2d3629352a362b372903051a1f0702031a1e073e2a69291ab7050c000203041ab305103b503b50323c1ac1050e0e0c00032d283b2b331afc050e0c0005343c1aab05020268050c000330283b2b220c1ae3050c0005291adc060e0c0002293b1aa3050c000303051acf06020d1aca062a1aca060e0e0e0c0003293b1a87050c000303032d020b2d2a1ab6060e0e0e0c00031ab1062a69312a693b3e3b3b2d6805291a2d050e0e0c000203041a2705103b503b502927100fd51a8e060fd21a8d060fcf2d372d3c1a24050202e1040e0c00032a287c2b56671a5b050c00051a71062a691a70062a693b3e3c3b2d6805291adf040c000203041adb04103b503b502927060fd12d362e372e3c1ae0040e0c00032b2a2f0e0e0c0003303c1acf040c00032c2a310e0e0c0003293b691a2a062a691a29062a691a28062a692f2a693b3e3c3b2d6805291a88040e0c000203041a8304103b503b5029270c0fd62d362e372e3c1a88040e0c00032a2a2f0e0e0c00032c1af0050e0c00023b1aec050e0c00022a332b1ae6053b1ae60502061f041d041b040e0e0e0c0006293b691ad6052a691ad5052a691ad4052a69302a693b3e3b3b2d6805291a18040e0c000203041a1304103b503b5029270d0fd02d372d3c1a1a040202d7030e0e0e0c00032a282c2b56681a4f040c0005291a94050e0c00021a91052a691a90052a693b3e3c3b2d6805291acb030c000203041ac703103b503b502927070fdd2d3629352e3c1acc030e0c00032a1a64042b1a60051a050402027a030e0e0c00051a55052a691a54052a693b3e3c3b2d6805291a83030c000203041a7f03103b503b502927070fce2d361a34052c56486a1a31052a692f3c1a7a030e0e0e0c00032c1a24052b2d1ab3030c00051a1d052a691a1c052a693b3e3c3b2d6805291a3703020210030c000203041a2f03103b503b502927080fcb2d362d3c1a36030e0e0e0c00032a2a2e1aea040e0e0e0c00041ae5042a691ae4042a693b3e3c3b2d6805291af3020c000203041aef02103b503b502927060fd02d362d0202b7023c1af2020e0e0e0c00032a282c2b56681a2b030c00051aa9042a691aa8042a69291aa6040e0e0e0c00023b3e3c3b2d6805291aa50202027e020e0e0c000203041a9b02103b503b502927070fd42d3629352a362b37303c1a9c020e0c00032c2a310e0e0c0003323c1a8b020c00032c2a330e0e0c0003343c1a7b020c00032f2a220c020231020e0c0003293b691a3e042a691a3d042a691a3c042a692f2a691a38042a691a37042a691a36042a69220c2a691a31042a691a30042a693b3b3b3b2d6805291a13020202ec010c000203041a0b02103b503b502927160fdd2d3629362a36293528191a24020e0c000303512936291ae4010e0c00021a05020e0e0c000203392936291ad0010e0c00021af1010e0e0c000203212936293b1aef01020294010c0003030d2e38293c1adf010c00036402013b6402013b6402013b6402013b64036c2a36293629352a3629352f35343c1aa0010e0c00032d2a220c0e0c00032b220e220d0c0003220e3c1a86010e0e0e0c00032e2a220f0e0c0003293b691a6a032a692d2a691a66032a69302a693b3b3b3b2d6805291a3e010e0e0e0c000203041a3701103b503b5029271102522a352f3c1a3e010202fb000e0e0e0c00032a2a300e0e0c0003313c1a27010c00032d2a320e0e0c0003293b691a16032a692d2a693b3b3b3b2d6805291aea000e0e0e0c000203041ae300103b503b502927096502b12d372e392935291aea021afb000c000303033c0222291abb000c00021add000e0e0c00020310293b1ac9023b280e1ac7020c000602013b03152b1abf026928222a69641aba020e0e0e0c00020249291ab2021ab3000c000303033c0222291a73000c00021a95000e0e0c00020310293b1a91023b280c1a7f020c000602013b03152b1a8302691a83022a69641a71020e0e0c000202012b3e2a69291a36000e0e0e0c000203041a2f00103b503b5029270564430e0e0e0e0e000000000c0e000000000000|@7020,@7021,I232,@1041,I105,@1784,@1087,@1088,@1060,@7023,@389,I107,@7025,@1074,I218,@1073,@2141,I251,@7028,@1086,@1058,@7030,@1058,@1058,@7031,@1058,@7032,@1058,@7033,@7034,@1058,@1058,@7037,@1058,@1058,@7038,@1058,@7039,@1058,@1058,@7040,@7041,@6325,@1058,@2354,@510,@1058,@5415,@1058,@5417,@5413,I48,@7048,@1058,@7051,@1088,@1060,@1058,@2062,@1058,@1998,@1058,@1058,@2062,@6325,@7053,@6325,@7064,@7072,@1058,@7074,@1058,@3386,@7075,@2217,@7077,@7079,@1058,@7081,@6325,@6325,@1058,@7074,@1058,@7082,@1058,@2062,@2043,@2038,@6325,@1058,@6311,@3055,@7084,@7086,@7088,@7090,@1058,@3004,@7092,@1058,@2585,@1058,@7093,@1058,@6977,@2008,@2219,@2104,@1058,@1828,@1058,@7094,@1088,@7096,@7097,@1058,@7100,@7101,@7116,@6325,@1058,@7118,@7119,@1058,@7011,@1088,@1060,@7131,@1058,@3060,@1058,@1058,@3058,@1058,@1058,@3056,@1058,@1058,@1058,@6788,I154,@7133,@371,@6781,@7133,@7019| 7019:S2|2322 7020:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229 7021:D1,36|00802b352c362a35292b5657300e0e0e7e0600030e0e0e0e000000001c00000000000000|@7022| 7022:S60|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61794c69737457697468427074732d283129 7023:O2|3,@7024 7024:S7|3c456d7074793e 7025:O1|@7026 7026:D16,340|00822c3b1a51010e0e0c000303051a4b010fd52d1a49010e0e0c00021a45010e0e0c000207dd2d352e36293b1a39010e0e0c000303632a352b382a1a2e011a2f010c00033e2a69291a15010e0e0c000203041a1f01103b503b50323c1a19010e0e0c00032c2a340e0e0c0003293b691a0a012a692d2a693b3b3b3b2d6805291ade000e0e0e0c000203041ae700103b503b50293b69270a02a52a352b382a1adf001acc000e0c00033e2a69291ab1000e0e0c000203041abb00103b503b50323c1ab5000e0e0c00032c2a340e0e0c0003293b691aae002a692d2a693b3b3b3b2d6805291a7a00020258000e0e0e0c000203041a7f00103b503b50291a8a00693b3b02023c003b3b2d6805291a52000e0e0e0c000203041a5b00103b503b5022113c1a54000e0c0003220d2a22131a5c000e0c00041a59002a692c2a69270f6502013b440e0e0e0e0e000000004c01000000000000|@7027,I232,@1975,I105,I218,I251,@2800,@389,@1784,I107,@1058,@2800,@1058,@2136,@7025,@1058| 7027:S54|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61795265634c697374283229 7028:O1|@7029 7029:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7028| 7030:O2|3,@6315 7031:O2|3,@6330 7032:O2|@1058,@2091 7033:O2|3,@6273 7034:O1|@7035 7035:D12,308|00832c3b1a31010e0e0c000303051a2b010fd72e1a29010e0e0c00021a25010e0e0c000207da2e352f36293b1a19010e0e0c000303102a2f692e0e0e0e0c0002293b69640fcd2a2f692e0e0e0e0c000230282c1af2000e0e0e0c000303033c024230283b1ae1000e0e0c000303033c0232301ad7001ad0000e0c000303033c0222301abb000c00021ab9000e0e0c00020310303b1ab5003b3f1ab4000e0c000602013b1a9e000e0e0e0c00023c2a3b6a291a8c000e0c000203041a9700103b503e3369291a79000e0e0c000203041a8300103b50293b692b2a692e2a693b3b3b3b2d6805291a580002023a000e0c000203041a5f00103b50220d3c1a5a00020223000e0e0e0c00033222102b22101a4b0002020d000c00051a45002a692c2a69270b6502013b1f04000000002c01000000000000|@7036,I232,@1975,I105,I218,I251,I48,I154,@1784,I107,@7034,@1058| 7036:S30|5052494e545f50415253455452454528292e7072696e744c697374283429 7037:O2|3,@6284 7038:O2|3,@6320 7039:O2|3,@6290 7040:O2|3,@6287 7041:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@7043,@7042| 7042:O1|@7044 7043:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283129 7044:D17,236|00822d352e372f3a3e2c69291ae1000e0e0c000203041adb00103b503b502b1ace000e0e0e0c00021acd000e0e0c000203382b35291ac4000e0c00023b1ac0000e0c00022a342b1aba003b1aba000e0e0e0c0006293b691ab2002a691ab1002a691ab0002a69270702013b2b3528081aa6000e0e0e0c000303033b0227313c1a9a000e0e0e0c00032c2a330e0e0c0003293b691a8a002a691a89002a691a88002a692705293b1a6f000c000303032a020b2a2a1a76000e0e0e0c00032c2a693b3b3b3b2d6805291a26000e0e0e0c000203041a1f00103b503b50292709440e0e00000000e400000000000000|@7046,I105,@1784,I218,@6977,@2008,@2219,@2104,@1058,@2093,@1058,I251,I107,@1058,@1998,@1058,@7045| 7045:O1|@7047 7046:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283229 7047:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7045| 7048:O1|@7049 7049:D3,44|00802b353e2a69291a25000e0e0c000203041a1f00103b502965420e0e0e0e0e000000002400000000000000|@7050,I105,@1784| 7050:S40|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229283129 7051:O1|@7052 7052:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7051,@1087| 7053:O1|@7054 7054:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@7056,@7055| 7055:O1|@7057 7056:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283129 7057:D13,164|00812c352d372e3a3b1a9c000e0c00022a302b1a96000e0e0e0c00043e2e69291a8d000e0e0c000203041a8700103b503b50313c1a81000e0e0c00032e287c2b1a79001a7a000e0e0e0c00051a75002a691a74002a691a73002a692e2a69293b1a6d000e0e0c0003030330020b302a1a62000e0e0e0c00033b3e3c3b2d6805291a2d000e0e0c000203041a2700103b503b5029270e430e0e000000009c00000000000000|@7059,@2008,@2215,I105,@1784,I107,@7060,@7034,@1058,@1998,@1058,I251,@7058| 7058:O1|@7063 7059:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283229 7060:O1|@7061 7061:D11,148|00802b352c362a362b373e2a69291a87000c000203041a8300103b502b1a78000e0c00021a79000e0e0c000203382b35291a70000e0c00023b1a6c000e0c00022a302b1a66003b1a66000e0e0e0c0006293b691a5e002a691a5d002a691a5c002a69270702013b2a2a693b3d3b3b2d6805291a23000c000203041a1f00103b50292708420e0e0e0e000000008c00000000000000|@7062,I105,@1784,I218,@6977,@2008,@2219,@2104,@1058,@2093,@1058| 7062:S56|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436f6e7374727563746f72283129 7063:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7058| 7064:O1|@7065 7065:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@7067,@7066| 7066:O1|@7068 7067:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283129 7068:D14,196|00812c352d372e23063b1abb000c00022a302b1ab6000e0e0e0c00043e2e69291aad000e0e0c000203041aa700103b502d1a9c000e0c00021a9d000e0e0c000203382d35291a94000e0c00023b1a78000e0c00022a220c2b1a85003b1a85000e0e0c0006293b691a7e002a691a7d002a691a7c002a69270702013b2a2a69293b1a71000e0e0c000303032c020b2c2a1a66000e0e0e0c00033b3e3c3b2d6805291a2d000e0e0c000203041a2700103b5029270a430e0e0e0e00000000bc00000000000000|@7070,@2008,@2215,I105,@1784,I218,@6977,@2219,@2104,@1058,@1998,@1058,I251,@7069| 7069:O1|@7071 7070:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283229 7071:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7069| 7072:O1|@7073 7073:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7072,@2217| 7074:O2|3,@6307 7075:O1|@7076 7076:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7075| 7077:O1|@7078 7078:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7077| 7079:O1|@7080 7080:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7079| 7081:O2|3,@6276 7082:O1|@7083 7083:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7082| 7084:O1|@7085 7085:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7084,@3048| 7086:O2|@1058,@7087 7087:O2|@3052,@2217 7088:O1|@7089 7089:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7088| 7090:O1|@7091 7091:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7090| 7092:O2|3,@2861 7093:O2|3,@6305 7094:O1|@7095 7095:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7094,@3011| 7096:O2|3,91 7097:O1|@7098 7098:D3,44|00802b3529353e2a69291a23000c000203041a1f00103b502966420e0e0e0e0e000000002400000000000000|@7099,I105,@1784| 7099:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745374724e616d65283129 7100:O2|3,@6328 7101:D8,108|00802b352c362a352b362b3c1a61000e0e0c00032b2a567756881a57000c00052d3c1a4b000c00032c2a56970e0c0003293b691a42002a691a41002a691a40002a692f2a693b3e3c3b2d6805291a34000e0c000203041a2f00103b5029270e42000000006400000000000000|@7103,I107,@7102,@1058,@1998,@1058,I105,@1784| 7102:O1|@7104 7103:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436c61757365283129 7104:D28,1060|00832e352f35291a1e040e0e0e0c00021a19040e0e0c0002037429352a362a3528191a0b040c000303602a36291af8030e0c00021af5030e0e0c000203482936291ae4030e0c00021ae1030e0e0c000203302936293b1ad7030c000303202c3b1acd030e0e0c00030311220c37293c1abe030e0e0e0c00036402013b02013b6402013b6402013b6402013b6502013b6407ca2f352935293629352a362935220c362935220e38220e3c1a88030e0c00032f2a22100e0c00033e2d69291a69030e0e0c000203041a6f03103b503b5022113c1a60030e0c0003302a22130e0c0003293b691a56032a692d2a691a52032a69302a6922183c1a3b030c0003341a28030e0c00021a25030e0e0c000203383435291a30030e0c00023b1a2c030e0c00022a2d2b1a26033b1a26030e0e0e0c0006293b691a1e032a691a1d032a691a1c032a69270702013b293b1ae4020e0c000303032b020f2b2a1a0603020225000e0e0e0c00033b3b3b3b2d6805291ab9020e0e0c000203041abf02103b503b502927170fdd2f35291a9f020c00021a9d020e0e0c000203612935293528191a91020e0e0c0003034d2936291a7c020e0c00021a79020e0e0c000203352936291a68020e0c00021a65020e0e0c0002031d2936293b1a5b020c0003030d3437293c1a4f020c00036402013b6402013b6402013b6402013b6402013b6407dc2f3529352a362a3629352a362935220d362935220f38220f3c1a1d020e0e0c00032f2a22110e0c00033e2d69291afd010e0e0c000203041a0302103b503b5022123c1af4010e0c0003302a22140e0c0003291a1402691a14022a692d2a691a10022a690202b301302a691a08022a691a07022a69221b3c1abf010c000322141afb012b221d1af9010e0e0c0005221d3d1aa6010e0e0e0c0003220f1a8f010c00021a8d010e0e0c0002033c220f35291a97010c00023b1a94010e0c00022a2d2b1a8e013b1a8e010e0e0e0c0006293b691a86012a691a85012a6902025a001a80012a69270702013b293b1a48010e0c000303032b020b2b2a1a8a010e0e0e0c0003293b1a2f010c000303032e020b2e2a1a76010e0e0e0c00033b3b3b3b2d6805291a09010e0e0c000203041a0f01103b503b5029271d0fce2f36293531383e2b69291ae8000e0c000203041aef00103b503b50291a360169333c1adc000e0c00032f1a18012b220c1a16010e0e0e0c0005220c3d1ac2000e0e0e0c00032e1aac000e0c00021aa9000e0e0c000203382e35291ab4000e0c00023b1ab0000e0c00022a2d2b1aaa003b1aaa000e0e0e0c0006293b691aa2002a691aa1002a691aa0002a69270702013b293b1a68000e0c000303032b020b2b2a1ab6000e0e0e0c0003293b1a4f000c000303032e020b2e2a1aa2000e0e0e0c00033b3b3b3b2d6805291a2900020212000e0e0c000203041a2b00103b503b5029270c641f04000000001c04000000000000|@7106,I105,I218,I251,I107,@1784,@1058,@1058,@6977,@2008,@2219,@2104,@1058,@1828,@1058,@7107,@1087,@1058,@1058,@1088,@1060,I48,@7034,@7109,@7111,@2217,@7113,@7105| 7105:O1|@7115 7106:S48|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446563283229 7107:O1|@7108 7108:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7107| 7109:O1|@7110 7110:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7109| 7111:O1|@7112 7112:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7111| 7113:O1|@7114 7114:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7113| 7115:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7105| 7116:D5,68|00802b352c362a362a3c1a3b000c00032a287c2b56771a33000c00053b3e3c3b2d6805291a29000e0e0c000203041a2300103b5029270642000000003c00000000000000|@7117,I107,@7034,I105,@1784| 7117:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e746676616c62696e64283129 7118:O2|3,@6309 7119:O1|@7120 7120:D17,300|00822d1a2a010e0e0e0c00021a25010e0e0c000207dc2d352e362a352b362c39313b1a13010c000303051a0f010fd32903051a0b0102013b323c1a07010c00032d2a340e0e0c0003343c1af7000c00032e2a220d0e0c0003293b691aea002a691ae9002a691ae8002a692f2a693b3e3b3b2d6805291ab8000e0c000203041ad300103b503b50220e3b1acc000e0c00030321293b69293b1abe000e0e0e0c0003030334020b342a1ab20022157e16000364025f291aa90069293b1a9b000c0003030334020b342a1a9a000e0e0e0c00033b3b3b3b2d6805291a55000e0e0c000203041a6f00103b503b5022163c1a5400020224000e0c000322122a22181a6800020210000e0c00041a61002a692c2a692706270b270502013b440e0e0e0e0e0e000000002401000000000000|@7122,I105,I218,I232,@1975,@7123,I107,@1058,@1998,@1058,@1784,I251,@7125,@7127,@7121,@7119,@1058| 7121:O1|@7130 7122:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e7456616c42696e64283229 7123:O2|@7124,@2217 7124:O2|3,@6280 7125:O1|@7126 7126:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7125| 7127:O2|@1058,@7128 7128:O2|@7129,0 7129:O2|3,@6325 7130:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7121| 7131:O1|@7132 7132:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7131,@1087| 7133:O2|34,0 7134:O2|@7135,@7016 7135:D7,108|00802b352c362a352b362b3c1a61000e0e0c00032a2a56770e0c00032d3c1a4f000c00032d2a56970e0c0003293b691a42002a691a41002a691a40002a692f2a693b3b3b3b2d6805291a34000e0c000203041a2f00103b5029270e420e0e0e0e000000006400000000000000|@7137,I107,@1058,@7136,@1058,I105,@1784| 7136:O2|3,@6297 7137:S33|5052494e545f50415253455452454528292e646973706c61794d61746368283129 7138:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@7139| 7139:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283129 7140:O2|3,@6318 7141:O2|@2037,@2217 7142:O1|@7143 7143:D3,44|00802b3529353e2a69291a23000c000203041a1f00103b502966420e0e0e0e0e000000002400000000000000|@7144,I105,@1784| 7144:S31|5349474e41545552455328292e646973706c61795370656373283229283129 7145:O1|@7146 7146:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7145| 7147:O2|3,@6267 7148:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@7149| 7149:S27|5349474e41545552455328292e646973706c617953696773283129 7150:O1|@7151 7151:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7150| 7152:O2|@7154,@7153 7153:O2|@7166,@6962 7154:D26,524|00812b3b1a09020e0e0c000303051a03020fd12c353d1aff010c000303792c3629352a362b372f3c1af1010e0e0c00032c2a300e0e0c00032b03051ae20102031ae1013e2a69291ade010e0e0e0c000203041ad701103b503b50333c1abd010e0e0c00032f2a1ac7010c0003293b691ac2012a692d2a69302a693b3b3b3b2d6805291aa3010c000203041a9f01103b503b5029270f0fcc2c353c1a7b010c000303892c362d372d3c1a71010e0e0c000356372b283b2c1a7f010c00052f3c1a5b010c00032d2a300e0e0c0003293b691a6a012a691a69012a691a68012a69291a6601020212010e0e0e0c0002293b1a27010c0003030330020b302a1a4e010e0e0e0c00031a49012a691a48012a693b3e3b3b2d6805291a0f010c000203041a0b01103b503b5029270f02cd2c353b1ae7000c0003035d2c3629352a362928281a16010e0e0e0c00033e2a69291ad9000e0e0c000203041ad300103b503b502c3130020293000c0003291af000691af0002a692c2a693b3c3b3b2d6805291aa8000e0c000203041aa300103b503b5029270a02652c353e1a7f000c000303412c3656172a1abe002f1a8e000e0e0e0c0005291ab4000e0c00021ab1002a691ab0002a693b3c3c3b2d6805291a5b000c000203041a5700103b503b5029270602192c363e2a69291a40000e0c000203041a3b00103b503b502965430e0e0e0e0e0e0e000000000402000000000000|@7156,I232,@1041,I251,I107,@7014,@6971,I105,@1784,@6972,@1058,@7157,@1058,@3052,@1058,@7160,@7162,@1058,@3054,@389,@1087,@1088,I48,@7164,@1058,@7155| 7155:O2|3,@6323 7156:S35|535452554354555245535f28292e646973706c617953747275637456616c7565283229 7157:O1|@7158 7158:D11,252|00832d1afa000e0e0e0c00021af5000e0e0c000203d72d352e36293b1ae9000e0e0c000303202d3b1ae1000e0e0c000303051adb00020d2a2e69310e0e0c0002293b696402a42d3b1ac1000e0e0c000303051abf0002932e282c1aab000c000303033c020b2e283b1a9d000e0e0c00031a91000e0e0c00022b2f69320e0c00023c2b3b6a291a78000e0c000203041a8700103b503e3269291a65000e0e0c000203041a7300103b50293b692b2a692d2a693b3b3b3b2d6805291a44000e0c000203041a5300103b50220c3c1a4e000e0e0e0c000322103322102c1a43000c00051a41002a692c2a69270b6502013b1f0400000000f400000000000000|@7159,I105,I218,I251,I232,@1975,@1975,@1784,I107,@7157,@1058| 7159:S28|535452554354555245535f28292e646973706c61794c697374283429 7160:O1|@7161 7161:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7160,@3048| 7162:O1|@7163 7163:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7162| 7164:O1|@7165 7165:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7164,@3048| 7166:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@7167| 7167:S30|535452554354555245535f28292e646973706c6179537472756374283129 7168:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@6969| 7169:O1|@7170 7170:D8,108|00802b352c362a362b392a1a62001a63000c00033e2a69291a5d000e0e0c000203041a5700103b502d3c1a53000c00032c2a1a4f000c0003293b691a4a002a692d2a693b3e3b3b2d6805291a2a000e0e0e0c000203041a2300103b5029270c42000000006400000000000000|@7171,@2800,@389,I105,@1784,I107,@6972,@1058| 7171:S47|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617953696742696e64283129 7172:D19,292|00812b3b1a21010e0e0c000303051a1b010fd32c353b1a17010c000303162c362c3c1a0f010c00032a2a1a0b012f0e0e7e0600032c353c1af6000e0e0e0c000303912c362d372d3c1ae9000e0e0c000356372b283b2c1ae3000c00052f3c1ad3000c000356572e283b2c1acf000c0005291acc000e0c0002293b1ab3000c000303051abf00020d1aba002a1aba000e0e0e0c0003293b1a97000c000303032d020b2d2a1aa6000e0e0e0c00031aa1002a691aa0002a693b3e3b3b2d6805291a97000c000203041a9300103b503b5029270c023e2c371a8800562869292b1a8400301a5800020229000e0c00051a79002a691a78002a693b3e3b3b2d6805291a57000c000203041a5300103b503b50292706430e0e0e0e0e0e000000001c01000000000000|@7174,I232,@1041,I251,I107,@7016,@7157,@7175,@7086,@7177,@7179,@1058,@7181,I105,@1784,@7173,@6325,@1058,@2001| 7173:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@7183,@7182| 7174:S30|535452554354555245535f28292e646973706c6179537472756374283229 7175:O1|@7176 7176:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@7175,@3048| 7177:O1|@7178 7178:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7177| 7179:O1|@7180 7180:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7179| 7181:O2|3,@6311 7182:O1|@7184 7183:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283129 7184:D13,292|00822d362e372f390402002a3c1a18010e0c0003030c2b353d1a0c010e0c000302013b031a2b3629352a362b372c382b2b2b6a296801302a452f4626080206293b452c465029352a363e2f69291adc000e0c000203041ad700103b503b502b1aca000e0e0e0c00021ac9000e0e0c000203492b3529352a362903051aba0002031ab9003e2a69291aa2000e0e0e0c000203041a9b00103b503b50220f3c1aa0000e0c00032d2a1a9b000c0003293b691a96002a692d2a69270902013b343c1a7f000c00032c2a220d0e0c0003293b691a7a002a691a79002a69293b1a4a000e0e0e0c000303032e020b2e2a1a66000e0e0e0c0003302a693b3e3b3b2d6805291a2a000e0e0e0c000203041a2300103b503b50292710440e0e000000001c01000000000000|@7186,I251,I105,@1784,I218,@7014,@6971,I107,@6972,@1058,@1058,@7187,@7185| 7185:O1|@7188 7186:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283229 7187:O2|3,@2800 7188:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7185| 7189:O2|@7190,@153 7190:D14,308|00822d350403003b2a1a2c010e0c00035029352a362b372b2b2b6a0403003b2a1a15010e0e0c00035029362a370403003b2a1a03010c00035029352a362b372b2b2b6a0403003b2a1aed000e0e0c00035029362a370403003b2a1adb000c00035029362a37221623061ad0002a22126a221823081ac9002a22106a221a230c1ac2002a220e6a221c3a1abc002a220c6a221e230b1ab5002a346a1ab3002221221d6a2221391aac002211221e221b2d3222102214221033221e220d2212680d3c28403b1a92000e0e0e0c00041a8d002a691a8c002b6922233b22292e2d31221a222622172224221722222217222e2234222f222c2215221a2224222c221b123b000100010022182236222f1a56000e0e0e0c001b501a5000222069222222270e7d2900020e0e0e0e000000002c01000000000000|@7192,@6351,@7193,@7194,@7195,@7196,@7197,@7198,@7204,I11,@7207,@7209,@7213,@7191| 7191:D7,172|00802b352c362a56370c0002291aa0000e0c00021a9d000e0e0c000203192935293a291a8a000e0e0e0c00021a85000e0e0c00026502013b03182935293a29352936293b3c1a70000e0c0004503b260502023b502a2306291a55000e0e0c00021a51000e0e0c0002033029352c380402002a1a47002b1a47000c00045029352a36291a3f000c00022b3b692f3b2b1a27000c0004503b270702013b2704420e0e00000000a400000000000000|@9133,I105,I218,I255,@9132,@2071,@7503| 7192:S29|535452554354555245535f28292e706173733253747275637473283329 7193:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7194:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7195:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7196:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7197:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7198:D6,92|00803c28403b1a57000c00041a55002a6956280e0e0c00022a3b1a4b000c0003563723093b2a0e0e0e0c000264293b1a3a000e0e0e0c000303032a020b2a2a1a2e00310e7e0700032704420e0e0e0e0e000000005400000000000000|@7200,I11,@7201,I253,I251,@7199| 7199:O1|@7203 7200:S43|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d6573283129 7201:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7202,I253,I255| 7202:S48|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d65732831295f2d283129 7203:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7199| 7204:O1|@7205 7205:D1,20|00803b420e0e0e0e000000000c00000000000000|@7206| 7206:S36|535452554354555245535f28292e706173733253747275637473283329656e762d283129 7207:D5,76|008056073b1a48000e0c00033b2a291a42000e0e0e0c00021a3d000e0e0c0002031729362b3c1a33000c0003292b25042504511e253b6502012a66420e0e0e0e000000004400000000000000|@7208,I253,I105,I218,I106| 7208:S48|535452554354555245535f28292e706173733253747275637473283329746f704c6576656c49644e756d626572283129 7209:D14,244|008056073b1af0000e0c0003293b2a1aea000e0e0e0c00021ae5000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1ac6000e0e0e0c000303051abf0002903b2a291aab000c00021aa9000e0e0c0002031729362b3c1aa7000c0003292b25042504511e223b6502012a65291a95001a96000e0e0e0c000303041a8f00103b503b502928403b1a87000c00043b2c293b1a65000e0e0c000303043b50022629352a362d2d2c1a6c000e0c0004502c3c1a4e000e0e0e0c0003292b2505250526031e32260351291a4f000c00025029651a4a002a6966420e0e0e0e0e0e00000000ec00000000000000|@7211,I253,I105,I218,I251,I49,I106,16777215,I231,@3560,I11,I255,I47,@7210| 7210:D7,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203033c021456071a3a000e0e0e0c00022c2a1a33000c00036403041a2e00103b5056072c1a29002d7e030003000000004400000000000000|@7212,I105,I218,I15,I247,@866,I253| 7211:S49|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129 7212:S52|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129283129 7213:O1|@7214 7214:D21,1012|0099221b1af1030e0e0c00021aed030e0e0c000207cb221b35221c362a353c1ade030e0e0e0c000307db2a362b37221e291ac4030e0c00021ac1030e0e0c0002033329352a362a352b362a351ab5032224692a0e0e0c00025129351aaa032224692a0e0e0e0c0002512b250526041e3e3b270402013b641a92032e22202d6b0403002a2a1a89030e0e0c00035029352a3622213b1a7d030e0e0c00033b2a291a56030e0e0e0c00021a51030e0e0c0002031729362b3c1a5f030c0003292b25042504511e253b6502012a653b22230e0e0e0c000232291a1f030c00021a1d030202b5020e0e0c0002032c29352a362a352b362c372d382e393232222c2230220f1a1903020259000e0e0c000b50292503511e3c5102023b505022212e0e0c000250333b2227222722272227222722272227222722272227222722272227222722272227222722272227222722272227222722271aca0222280e0e0e7b1c28001b2a353b1a9a020e0e0e0c000307dd2a362b37221e291a80020e0c00021a7d020e0e0c0002033329352a362a352b362a351a91022224692a0e0e0c00025129351a86022224692a0e0e0e0c0002512b250526041e3e3b270402013b641a6e022e22202d6b0403002a2a1a45020e0e0c00035029352a3622213b1a39020e0e0c00033b2a291a12020e0e0e0c00021a0d020e0e0c0002031729362b3c1a1b020c0003292b25042504511e253b6502012a653b22230e0e0e0c000232291adb010c00021ad9010e0e0c0002036429352a362a352b362c372d382e392f3a30230631230732230833230934230a02028b00220c230b221022102233223722332233223322332233223322332233223c2234223422342234223422342234223422271ab0010e0c002350292503511e705102023b505022142e0e0c000250333b2227222722272227222722272227222722272227222722272227222722272227222722272227222722272227222722271a520122280e0e0e7b1c28001b2a362b371a55012a221e6a2b3b69221f3a222023062221230a2222230e2223230f2b3b1a16010e0e0e0c00032e3b1a0b010c00032b3b1a03010c00032d3b1afb000c0003302c2e2c2e680533220c2216222a222a222e2f1a0601221d1a05010e0e0c000a50222938293b1acf000c00036403033b020a221322136929222c6964220f2a222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c1a9200222d0e0e0e7b1c2d001b221a291a5a000e0e0e0c00021a55000e0e0c0002033329352a362a352b362a351a85002220692a0e0e0c00025129351a7a002220692a0e0e0e0c0002512b250526041e403b270402013b641f1a0e0e0e00000000ec03000000000000|@7216,I105,I218,I251,@7217,@7245,@7250,@6494,I253,I106,@7259,@7213,@8750,@8751,@8752,@8755,@9129,I48,@8798,@9131,@7215| 7215:D3,44|00802b352c362a282e1a24000e0c00032a372a2a56671a1b00320e7b05070004000000002400000000000000|@7219,@389,@7246| 7216:S43|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229 7217:D3,36|00802b352c3629382b2a56571a19001a1a00327b06060005000000001c00000000000000|@7219,@7220,@7218| 7218:O1|@7229 7219:S49|535452554354555245535f28292e706173733253747275637473283329636865636b5661726961626c6573283229283129 7220:O2|@7221,@2386 7221:D14,140|00803b1a8a000e0e0e0c00023d1a84001a85000e0e0c00031a81001a82003b2d2d3c3b3c680828072a6956473b691a73002a691a72002a69291a70000e0c00023e2a1a6b003c6b291a6900692f2a69280e2a3b6a2a1a60000e0c00021a5d000e0e0c00021a55000e0e0c0002030a291a4e00220f7d0f000229270c420e0e0e0e000000008400000000000000|@7223,@2447,@7224,@2047,@742,@7226,@7227,@742,@2388,@7228,@7222,I105,I218,@2464| 7222:O2|@1358,@734 7223:S31|545950454944434f444528292e636f6465466f72556e697175654964283129 7224:O1|@7225 7225:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 7226:S21|636f6465466f72556e6971756549642d657175616c 7227:O3|2,64,0 7228:O3|2,I11,0 7229:D4,68|00833c28403b1a3f000c00041a3d002a2f2f336805291a37000c0002302a0e0e0e0c0002643b2a0e0e0c0002513b651f040e0e0e0e0e0e0e000000003c00000000000000|@7231,I11,@7230,@2246| 7230:D2,36|00801a23002c562756385649565a6806420e0e0e0e0e0e0e000000001c00000000000000|@7233,@7232| 7231:S40|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429 7232:D2,36|00802b561756285639564a565b1a1800310e0e7b08030007000000001c00000000000000|@7235,@7234| 7233:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129 7234:O1|@7236 7235:S56|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129283129 7236:D23,476|00852f3528061ad7010c000307cd2f3630372a3b1acd010e0e0c000329353c1abe010e0e0e0c000364032c293e1ab8010e0c0003293b1ab3010c0003030c1aaf012a1aaf010c0003020129293c1aa8010e0c00036502013b07dc303b1a85010e0e0c00031a95010e0e0c0002285f2a1a8e010e0e0e0c0003323b1a67010c0003293c1a6f010c0003343b2b1a76010e0e0e0c000450333a342306220c230a220d230e220e230f2b3b1a39010e0e0c00032e3b1a2f010c00032b3b1a27010c00032d3b1a1f010c0003302c2e2c2e6805220c2a1a33016a3b22150202ed000c00023c2a6922113f1a23010c0003293b1aef000c0003641a18010e0c00023c28402b1a11010e0e0c00043c2a3b3b6b2c2a306a3b3169293b6922152a2d6a28053b22182c3b6805221f3a222023062221230a2222230e02028e002223230f2b3b1aa3000c00032e3b1a9b000c00032b3b1a93000c00032d3b1a8b000c0003302c2e2c2e680522271ab000691ab0002a69641aae000e0e0e0c0002291aa8001aa9000e0e0c0003291aa4000e0c00023b3e3b3b2d6805291a99000e0e0c000203041a9300103b503b3b2b306b222e230c2a2a0e0e0c000250222a3b22121a47000c0004503b272902013b6502013b1f060e0e0e00000000d401000000000000|@7238,I251,I253,I216,I234,@677,I106,I113,@7239,@389,I255,@7242,I243,I218,I11,@7243,@7237,@371,@6184,@6187,@6603,I105,@1784| 7237:S13|5468652074797065206f662028 7238:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283229 7239:O1|@7240 7240:D14,212|00802b281a1ad0000e0c000303402b3b1ac5000e0e0c0003293c1abf000c000303032c020b2c28191ab5000e0e0c000329281a1aae000e0e0e0c0003293c1a9f000c0003661aa0000e0c000202031a9b002c281a1a99000e0e0c0003293b1a93000c000303033c0214293b1a6a000e0e0e0c00033c2a1a63000c000364030329020a29281a1a70000e0c00032928611a66000e0e0e0c0003293b1a5f000c000303033c020b2928ff1a55000e0e0c000303041a4f00103b502c2a1a4b00310e0e7e0700030e0e0e0e00000000cc00000000000000|@7241,I231,I251,I107,I109,@7239,I48,I110,I113,I106,I234,I233,@385,@389| 7241:S50|545950455f5452454528292e636865636b466f7246726565547970655661726961626c657328342967656e4e616d65283129 7242:S38|436f6e73747275637465642066726f6d206120667265652074797065207661726961626c652e 7243:O2|@7244,0 7244:S65|2920636f6e7461696e73206120667265652074797065207661726961626c652e2053657474696e6720697420746f206120756e69717565206d6f6e6f747970652e 7245:D3,44|00802b352c362a282e1a24000e0c00032a372a2a56671a1b00320e7b05070004000000002400000000000000|@7219,@389,@7246| 7246:O1|@7247 7247:D4,44|00822c351a29001a2a002e316b2a3b2b1a2500300e0e0e7b050700040e0e0e0e000000002400000000000000|@7249,@7248,@7246,@1898| 7248:D10,212|00822c2c2a1ad0000e0c00021acd000e0e0c000203ac2a352b362a35291ac0001ac1000e0e0c00036403415649321ab7000c000329282e1aae000e0e0e0c00032c351a9b001a9c000e0c000303043b5002041a9700103b502c3729372b2a56a856b70e0e0e0c0004270402482a35291a7e001a6f000c00036403385649321a67000c00032b351a67001a58000e0c000303043b5002041a5300103b502b3729382b2a56981a4d001a4e000e0e0e0c00056602013b2a2a2505250526031eb83b6602012965440e0e0e00000000cc00000000000000|@1901,I105,I218,@38,I251,@389,@1840,@23,@7220,@7218| 7249:S66|535452554354555245535f28292e706173733253747275637473283329636865636b537472756374536967466f7246726565547970655661726961626c6573283229 7250:D8,116|00821a73005617691a71002f1a71000e0e0c0003291a6c001a65000e0e0c00033e2a69291a61000e0e0c000203041a5b00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a3f00103b5056683c3056992d1a3600220d0e0e0e7b070b00060e0e0e0e000000006c00000000000000|@7252,@7253,@7255,@389,@7256,I105,@1784,@7251| 7251:O1|@7257 7252:S51|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329 7253:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7254,@6959| 7254:S54|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329283129 7255:S10|5369676e617475726520 7256:S43|2068617320616c7265616479206265656e20626f756e6420696e2074686973206465636c61726174696f6e 7257:D9,268|00842f230d29291a06010e0e0e0c00021a01010e0e0c0002032429352a362a35291af4001af5000e0e0c00036403052a68010207292503511e323b6502013b64293b1ad7000c000303691ad300291abf000c00021abd000e0e0c0002032429352a362a35291ab0001ab1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a93000c000303041a9300103b50293529351a7d001a7e000e0e0e0c000303043b5002041a7b0010293765021a293529351a5e001a5f000c000303043b5002041a5f001029376429310e0e0c0002296801332a32346b220c38220d230c220d030e2a3b3c1a3f000c0004503b5002023b502b2a340e0e7d0f0002000000000401000000000000|@7258,I105,I218,@98,I251,@2900,@2955,@1840,I255| 7258:S29|535452554354555245535f28292e6572726f724d73674e656172283529 7259:O1|@7260 7260:D10,204|0089303030303022101ac4000e0c000729352a372b392c3a3b2211693223103b2a0c00023d2a69293b692d2a6932353c1aa1000e0e0c00030359323633382a3b1a95000e0e0c00032a3b1a8b000c0003293b1a83000c0003293b1a7f000c000303051a7b0002242928403b1a76000e0e0e0c00042b3c2b3b2e1a6c000e0c000650291a67000c00025029643b2d2b6a2706020132292217342d220c220c680622163b2b1a4a000e0e0e0c00045022172a69221022100e0e0e7d1900020e0e0e0e00000000c400000000000000|@7262,@7261,I251,I253,I113,I49,I11,I195,I47,I255| 7261:O2|@7263,@6662 7262:S64|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322970617373325369676e617475726542696e64283529 7263:D27,940|00853c28403b1aa7030c0004293b1aa3031aa4030e0c0004503c2840321a90030e0c0004280b28401a91031a82030e0e0e0c0004293b401a7e030e0e0e0c0004503c2a693c28402b1a65030e0e0c0004291a680369280b28403b1a53030c0004293b401a52030e0e0e0c0004503c2a693c28402b1a39030e0e0c0004293b690404002212353b1a37030c000303482212362213370406002b22132c3b1a25032e221b22182214221d2212220f221f221f121d0001000100221f1a0c030e0c00115029352a362b382c39302d452c462b472a482608029a2212353d1ae3020c0003034722123629352a362b372c382d392c2b2d2c31221a1acb02221f221c2218222122162213222322231221000100010022231ab7020c0012302a35452a36462a38472a3948260802472212362213372214380406002c2c2c22161a87022e2219221d221a12190001000100221722202215221222221a78020e0c00105029352a362b382c39312d452c462b472a48260929352a362b372c382c3b1a57021a58020e0c00043c284022181a24020e0c00043c28402c1a19020e0e0c00040402003b2a2213221c221130301a30020e0c00085029352a36293b1a06020e0e0e0c000303051a1b0202903b2a291a17020c00021a15020e0e0c0002031729362b3c1a0b020c0003292b25042504511e223b6502012a65291af9011afa010e0e0e0c000303041af301103b503b502928403b1a9f010c00043b2c293b1aa5010e0e0c000303043b50022629352a362d2d2c1a88010e0c0004502c3c1ab2010e0e0e0c0003292b2505250526031e32260351291aab010c00025029652b3b1a64010e0c000303051a7b0102903b2c291a77010c00021a75010e0e0c0002031729362b3c1a6b010c0003292b25042504511e223b6502012a65291a59011a5a010e0e0e0c000303041a5301103b503b502928403b1aff000c00043b2e293b1a05010e0e0c000303043b50022629352a362d2d2c1ae8000e0c0004502c3c1a12010e0e0e0c0003292b2505250526031e32260351291a0b010c00025029651a0601221d2c22206b2b1a00010e0c00022b1af8000e0c00022a2a1af3000c0003290304220c02071aea00220d2e6a2210353c1a93000c000303592210362211382a3b1ad3000c00032a3b1acb000c0003293b1ac3000c0003293b1ab3000c000303051a830002242928403b1a4a000e0e0e0c00042b3c2b3b2e1aa0000e0c000650291a7f000c00025029643b2d2b6a2706020222102922113422122e22286806271d1f060e0e0e0e00000000a403000000000000|@7265,I11,@7266,I255,@976,I251,I48,@7317,@7318,@7382,@8720,@1898,@8725,I49,I105,I218,I106,16777215,I231,@3560,I47,@8748,I15,I113,@7264,I253,I195| 7264:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7265:S22|5349474e41545552455328292e73696756616c283629 7266:O1|@7267 7267:D34,796|00802b363c1a18030e0c000303051a13030fdc2b3529353b1a0d030e0e0c00036407dd2b3529362d363c1aff020c00032a2a691afa023b1afa020e0e0e0c00032a2a0e0e0e0c00026429353b1ad9020e0e0c000303932939291adc020e0c00021ad9020e0e0c0002035f29361ac9020e0e0c00021ac5020e0e0c000203482935353e1aa3020c000303312935362928281a95020e0e0c000303033c021b29287b1a85020e0e0c000303033c020b29285b1a75020e0e0c00036402013b1a7d020e0e0c000202013b02013b03192a1a7002691a70022a691a6f022a693b3e3c3b2d68056602012a64020129293b6902021e021a58022a691a57022a693b3c3b020208003b2d680527090fdd2b363c1a10020e0c000303051a3b020fdd2b3529353c1a05020e0e0c00036407dd2b3529362d363c1af7010c00032a2a691a1a023b1af2010e0e0e0c00032a2a0e0e0e0c00026429353b1ad1010e0e0c000303972939291ad4010e0c00021ad1010e0e0c0002035f29361ac1010e0e0c00021abd010e0e0c000203482935353e1a9b010c000303312935362928281a8d010e0e0c000303033c021b29287b1a7d010e0e0c000303033c020b29285b1a6d010e0e0c00036402013b1a75010e0e0c000202013b02013b031d2a1a6801691a68012a691a67012a693b3e020226013c3b2d68056602012a6402012902021501293b691a5c012a691a5b012a02020c00693b3c3b3b2d680527090fdd2b363c1a04010e0c000303051a3f010fdd2b3529353d1af9000e0e0c00036403051a2e0102d32b363c1ade000e0e0e0c000303051a1f0102c02b3529362a372e363c1ad1000e0e0c0003293b1abb000c000303051a03010276293c1ab8000e0c00032c2a691ab2003b1ab2000e0e0e0c00032a2a0e0e0e0c0002642c3c1a96000e0e0e0c00032e2a691ad2003b1a8e000e0e0e0c00031ac9002a0e0c0002642a2a0e0e0c000264291abb00691abb002a691aba002a691ab9002a691ab8002a69312a691ab4002a691ab3002a69270d1ab0002a693b3c3b3b2d680502021a00293b691aa1002a691aa0002a69020209003b3c3b3b2d6805270a42000000001403000000000000|@7269,I234,@2016,I251,I107,@154,I253,I105,I218,@1087,@1088,@1060,@1058,@7272,@2016,@14,@1058,@7279,@2016,@7286,@2016,@1071,@155,@7304,@1074,@1058,@7307,@1058,@1059,@1058,@7309,@1086,@1058,@7268| 7268:O5|0,0,0,@7312,@7311 7269:S11|7072696e742d7661724964 7270:O1|@7271 7271:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 7272:O5|0,0,0,@7274,@7273 7273:O2|@7277,0 7274:O2|@7275,0 7275:O2|0,@7276 7276:O5|@6671,463,463,0,0 7277:O2|3,@7278 7278:S8|46726565536c6f74 7279:O5|0,0,0,@7281,@7280 7280:O2|@7284,0 7281:O2|@7282,0 7282:O2|0,@7283 7283:O5|@6671,461,461,0,0 7284:O2|3,@7285 7285:S10|53686172656457697468 7286:O5|0,0,0,@7288,@7287 7287:O2|@7291,0 7288:O2|@7289,0 7289:O2|0,@7290 7290:O5|@6671,464,464,0,0 7291:O2|3,@7292 7292:S5|556e736574 7293:O1|@7294 7294:D2,20|00801a13002c6942000000000c00000000000000|@360,@7295| 7295:D6,76|00802b365617362d352b3b1a42000e0e0e0c000303051a3b0002092b2a2c1a37000c0004291a34000e0c00021a31002a693b3c3b3b2d68052706420e0e0e0e0e000000004400000000000000|@4473,I232,@7297,@7298,@7301,@7296| 7296:O2|3,91 7297:O2|@364,0 7298:O1|@7299 7299:D11,148|00822c1a92000e0e0e0c00021a8d000e0e0c000203702c352d36293b1a81000e0e0c000303202f3b1a79000e0e0c000303051a7300020d2a30692e0e0e0c0002293b6964023d2f3b1a59000e0e0c000303051a5700022c2a30692e0e0e0c0002303c1a4b000c0003292c311a46000e0e0e0c00041a41002a691a40002a692d2a6927056502013b44000000008c00000000000000|@7300,I105,I218,I251,I113,@7297,@7297,I107,@7298,@441,@442| 7300:S21|7072696e745f6c697374283329706c697374283229 7301:O1|@7302 7302:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@7303,I105,I218,@7301,@4482| 7303:S6|402832292829 7304:O4|0,@7305,3,1 7305:O1|@7306 7306:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@862,@9,I253| 7307:O2|3,@7308 7308:S14|6465736372697074696f6e73203d 7309:O2|3,@7310 7310:S9|626f756e644964203d 7311:O2|@7315,0 7312:O2|@7313,0 7313:O2|0,@7314 7314:O5|@6671,462,462,0,0 7315:O2|3,@7316 7316:S12|5661726961626c65536c6f74 7317:O2|@7319,@7318 7318:O2|@8683,@7317 7319:D28,548|008f7881453c28403b1a1c020e0c0004280b28403b1a10020e0c0004293b401a0a020e0e0e0c0004503c28402b1af8010e0c00043c28401af6011aeb010c00043c2a2e2d6b2704053a0e00ff6d29353f1ae1010e0e0c00030323403c1ad9010e0e0c00031ad5012a1ad5010e0e0c00031ad1011ad2012b1ad2016b65103b503b502910040d002a2a1ac5010e0e0c00035029372a382b392c3a2d23062e23082f230930230a31230b32230c1aa6013330221a221f221b68061a9d013330221b2220221c68061a94012e2d221c2221221d68061a8b011a8c012d2d220e220e220e1a8501220f220f33220f220f680d2221221f2a1a76010e0e0e0c00021a71010e0e0c0002035c2a352b362a2c222522222227222322172214222c22152212221a221a2218221322182231222e222e222e222e222e2226221b221f221f222e2233223322331233000100010022291a24010e0c00212a2a2505250526031e6a3b66020129653b222169221c23103b2a0e0e0e0c00023d2a69293b692d2a6922203b1af5000e0e0c00033b22222222222122211ae8000e0c00062218353c1a95000e0e0c000303592218362219382a3b1ac7000c00032a3b1abf000c0003293b1ab7000c0003293b1ab7000c000303051ab30002242928403b1a4e000e0e0e0c00042b3c2b3b2e1aa0000e0c000650291a9b000c00025029643b2d2b6a27060202221822262a451a8800463b472d482b492c4a271a1f100e0e0e000000001c02000000000000|@7321,I11,I255,@7322,I251,@510,@7324,@389,@35,@863,@7325,@1835,@7326,@7343,@7348,@7353,@7358,@7363,I105,I218,@7368,I253,@7320,I113,I49,I195,I47,I48| 7320:O1|@8679 7321:S36|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529 7322:O1|@7323 7323:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7324:S16|486173685461626c652e686173683a20 7325:O5|@1873,88,0,88,0 7326:D5,52|00802b352c362a2a1a2d0056576956581a29001a2a005689569a56ab1a2500220d0e0e7b0b05000a000000002c00000000000000|@7328,@7329,@7331,@7332,@7327| 7327:O1|@7335 7328:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283129283129 7329:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7330:S54|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e7465722836292d45 7331:S5|56616c7565 7332:O1|@7333 7333:D1,20|00802b39420e0e0e000000000c00000000000000|@7334| 7334:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529737472756374456e762d283129 7335:D9,204|008833310e0c0002293b1ac3000c0003030a3434342e0e0e7e0c00031ab5002f6934310e0e0c000229293b1aa2000e0e0e0c0003030330021d29352a362a353b1a8d000e0e0c000303042a360207292503511e293b6564331a7d001a7e000e0e0e0c00032922101a72000e0e0e0c0003291a6c001a65000e0e0c00033e2a69291a61000e0e0c000203041a5b00103b503b50293b693b3b3b3b2d6805291a44000e0c000203041a3f00103b503b50220c3c33322d1a350022110e0e7b0715000600000000c400000000000000|@7337,I251,@7338,@4643,@389,@7340,I105,@1784,@7336| 7336:O1|@7341 7337:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629 7338:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7339,@6972| 7339:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629283129 7340:S39|2920697320616c72656164792070726573656e7420696e2074686973207369676e61747572652e 7341:D9,268|00842f230d29291a06010e0e0e0c00021a01010e0e0c0002032429352a362a35291af4001af5000e0e0c00036403052a68010207292503511e323b6502013b64293b1ad7000c000303691ad300291abf000c00021abd000e0e0c0002032429352a362a35291ab0001ab1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a93000c000303041a9300103b50293529351a7d001a7e000e0e0e0c000303043b5002041a7b0010293765021a293529351a5e001a5f000c000303043b5002041a5f001029376429310e0e0c0002296801332a32346b220c38220d230c220d030e2a3b3c1a3f000c0004503b5002023b502b2a340e0e7d0f0002000000000401000000000000|@7342,I105,I218,@98,I251,@2900,@2955,@1840,I255| 7342:S28|5349474e41545552455328292e6572726f724d73674e656172283529 7343:D5,52|00802b352c362a2a1a2d0056576956581a29001a2a005689569a56ab1a2500220d0e0e7b0b05000a000000002c00000000000000|@7328,@7345,@7346,@7344,@7327| 7344:O1|@7347 7345:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7346:S4|54797065 7347:D1,20|00802b3529366442000000000c00000000000000|@3751| 7348:D5,52|00802b352c362a2a1a2d0056576956581a29001a2a005689569a56ab1a2500220d0e0e7b0b05000a000000002c00000000000000|@7328,@7350,@7351,@7349,@7327| 7349:O1|@7352 7350:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7351:S9|537472756374757265 7352:D1,20|00802b38420e0e0e000000000c00000000000000|@7334| 7353:O1|@7354 7354:D2,20|00801a1300100e0e000000000c00000000000000|@7334,@7355| 7355:O4|@35,@863,@7357,@7356 7356:O5|@6671,989,0,989,0 7357:S28|456e746572696e672066697869747920696e207369676e6174757265 7358:O1|@7359 7359:D2,20|00801a1300100e0e000000000c00000000000000|@7334,@7360| 7360:O4|@35,@863,@7362,@7361 7361:O5|@6671,990,0,990,0 7362:S31|456e746572696e67207369676e617475726520696e207369676e6174757265 7363:O1|@7364 7364:D2,20|00801a1300100e0e000000000c00000000000000|@7334,@7365| 7365:O4|@35,@863,@7367,@7366 7366:O5|@6671,991,0,991,0 7367:S29|456e746572696e672066756e63746f7220696e207369676e6174757265 7368:O1|@7369 7369:D55,1564|009f2221350a05005600a601370104010c00000422213622212a221c221c221c221a22102210221f221f2225221f221f221f2216222e222d22222222222222222222221d221d221d221d223a2239221f1acd0522200e0e7b1f23001e0fd32221363c284022231abb050c00041ab905221e221e2223222322232f68070403003b2a1aa8050e0c00035029352a362b37222023081a9a052a22222d6b2222230c1a92052a22236a1a8f051a9005333122252225222b1a890533222822282228220c680d1a7f05221a221d221d2220222268061a7405221a221d221f6b220d2b2d222d2d1a67050c00061a6505221b22292230223022302213680729220c0e0c0002220f3b1a4e0522157e3300032221362222372223382b2b2b6a29220f2224222522242219221922182218221b1a29050202d5040e0e0c000b50222427040fdb2221362922222a1a13050c00021a11050e0e0c000203542a352b362a2c2220222022202213221322222222222822232223222322192231223022252225222522252225222022202220222e2221223c222b2223223d1acd040e0e0c001f2a2a2505250526031e5f3b66020129660fcd2221362222372223382a352b361aaa0422272223306b2c1a94040e0c00021a91040e0e0c000203232c35291a9004222122212e2225680522251a86040e0e0e0c00043d2a1a7f046a6502031a78043b2c69222423103b2a0c00023d2a69293b692d2a69321a63041a64040202ec030e0c000303033c0222321a33040c00021a31040e0e0c00020310323b1a3d043b28081a3f040c000602013b03033c0fdb321a34041a29040e0e0c000303033c0226321afb030c00021af9030e0e0c00020314323b1a11043b28091a070402028b030c000602013b03033c0fdb321afc031aed030e0e0c000303033c0222321abf030c00021abd030e0e0c00020310323b1ad9033b28071acb030c000602013b03033c02ab321ac8031ab5030e0e0c000303033c0222321a87030c00021a85030e0e0c00020310323b1aa5033b28061a93030c000602013b03033c0273321a94031a7d030e0e0c000303033c0226321a4f030c00021a4d030e0e0c00020314323b1a71033b28071a5b03020242000c000602013b03033c0237321a5c031a41030e0e0c000303033c0226321a13030c00021a11030e0e0c00020314323b1a39033b28061a1f03020206000c000602013b035f1a2803331a28030e0c0003291a24031a1d030e0e0c00031a1d032231693e2b69291acb020c000203041a0f03103b503b50293b693b3b3b3b2d6805291ab0020e0c000203041af302103b503b50222f3c2e22152d1ae8020e0c0006260702023b503b222e69333b2b332e3b3b6807342a1ad002222d69222c1acc021acd022233223322331ac8020e0c000a50222f3c1ac10222130e0e0e7e3100032221362222372223382a352b362a1aab021a60020e0c000303033c02222a1a33020c00021a31020e0e0c000203102a3b1a89023b28081a3f020c000602013b03033c0fd72a1a78021a29020e0e0c000303033c02222a1afb010c00021af9010e0e0c000203102a3b1a55023b28091a07020c000602013b03033c02a72a1a44021af1010e0e0c000303033c02222a1ac3010c00021ac1010e0e0c000203102a3b1a21023b28071acf010c000602013b03033c026f2a1a10021ab9010e0e0c000303033c02222a1a8b010c00021a89010e0e0c000203102a3b1aed013b28061a97010c000602013b03033c02372a1adc011a81010e0e0c000303033c02262a1a53010c00021a51010e0e0c000203142a3b1ab9013b28071a5f01020206000c000602013b035f1aa8012b1a68010e0c0003291aa0011a5d010e0e0c00031a99012229693e2b69291a0b010c000203041a4f01103b503b50293b693b3b3b3b2d6805291af0000e0c000203041a3301103b503b5022273c2e220d2d1a28010e0c0006270602013b2c1a530122202220222b22272225680622241ace000e0e0e0c00043b2c69222423103b2a0c00023d2a69293b692d2a692f1a27011a28011a29010e0e0c00043b222f69343d2b2d2f3b3b6807220c2a1a1501222e69222d1acd001ace002234223422341ac9000e0e0c000a5022303c1ac10022140e0e0e7e3200031f200e0e0e0e0e0e000000001406000000000000|@7371,@7372,I11,@7406,@6351,@7409,@7410,@7353,@7358,@7363,@7411,@7416,@7437,@8549,I253,@8554,I105,I218,@8638,@8657,@8661,@7665,@7751,@727,I251,I154,@945,@1055,@1063,@1177,@6692,@8664,@389,@8665,@8666,@1784,@7336,@8667,@7331,@7332,@7327,I106,@727,@945,@1055,@1063,@1177,@8664,@8665,@8668,@8669,@8674,@8677,@1914,@7370| 7370:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7371:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329 7372:O1|@7373 7373:D18,484|009c221d1ae1010e0e0c00021add010e0e0c000207dd221d35221e362a362b382935222123081ac7012a22236a2223230c1ac0012a22246a1abd01222622246a1ab9011aba01222422242224222422241ab101343222272227220d680d221c321aa5010e0e0c000329282e1a9a010e0e0e0c000331353b1a92010e0e0e0c0003033f313632370406002b2f2c3b302e222522252225222522252225222522252225222522300c00115029352a362b372c382d392e3a2e2e2e2e2e2e68062709028231353d1a45010e0e0c00030336313629352a362b372c382d392c2b2d2c31220d220c22292229222922292229222922290202dc0022292229222922290c00122706023f3136323733380406002c2c2c32312e221f222722272221222822282228222822281ae8000e0c00105029352a362b372c382d392e3a2e2e2e2e2e2e6806270a222c3c1acb000c000329220e222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d1a90000e0c001e3b221569221f23103b2a0e0e0e0c00023d2a69293b692d2a693b22356922142a342d6b22152a1a6700221d6922351a63001a6400222d2222222e1a5f000c000a3227190202221e1f1d0e0e0e00000000dc01000000000000|@7375,I105,I218,@7376,@7377,@7378,@7353,@7358,@7363,@389,I251,@7382,I106,@7372,@7374,@7351,@7349,@7327| 7374:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7375:S59|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332970537472756374283229 7376:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7377:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7378:D3,68|00803b56180c0002561723093b2a0e0e0e0c000264293b1a2e000e0e0e0c000303032a020b2a2a1a22002f0e7e05000365420e0e0e0e0e0e000000003c00000000000000|@7380,I251,@7379| 7379:O1|@7381 7380:S69|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329705374727563742832296e6577456e762d283129 7381:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7379| 7382:O1|@7383 7383:D27,588|008e040600343a22122a0e0e0e0c000264293b1a3a020e0e0e0c000303751a330222131a32020e0e0e0c0003291a2c021a25020e0e0c00031a2502220e693e2b69291a1f020c000203041a1b02103b503b50293b693b3b3b3b2d6805291a04020e0c000203041aff01103b503b5022103c2e221a2d1af4010e0c000650302210451aec01463b473b481ae801493b4a2607021629352b2a35452a36462a37472a38482a39492a3a4a512a352b362c372d382e392f3a22163b2d1abc010e0c000450220e3b1ab5010e0e0c00032d1ab001221722122212221222121aa7010c0008293b1a6b010c000303051a9b0102903b2a291a6f010c00021a91010e0e0c0002031729362b3c1a87010c0003292b25042504511e223b6502012a65291a75011a76010e0e0e0c000303041a6f01103b503b502928403b1a67010c00043b2c293b1a0d010e0e0c000303043b50022629352a362d2d2c1a20010e0c0004502c3c1a2e010e0e0e0c0003292b2505250526031e32260351291a2b010c00025029652c2c1a24010e0c000303033c02172f1ad3000c00021af5000e0e0c00021aed000e0e0c000203032d020f1a0001220e2b2f6b1afc002f2b6a6422123b1abe000e0e0e0c000333353c1a86000e0e0e0c00030359333634382a3b1aa1000e0e0c00032a3b1a97000c0003293b1a8f000c0003293b1ab3000c000303051a8b0002242928403b1a9a000e0e0e0c00042b3c2b3b2e1aa0000e0c000650291a87000c00025029643b2d2b6a270602013322192a4534463b4732482c492b4a270e1f0f0e0e000000004402000000000000|@7385,I251,@7386,@389,@7387,@7388,I105,@1784,@7336,@6666,@6661,I255,I253,@7390,@7393,I49,I218,I106,16777215,I231,@3560,I11,I47,I113,@7404,@7384,I195| 7384:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7385:S44|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529 7386:S11|5369676e61747572652028 7387:S23|2920686173206e6f74206265656e206465636c61726564 7388:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 7389:S31|5349474e41545552455328292e676976654572726f72283329283129283129 7390:O1|@7391 7391:D1,20|00803b420e0e0e0e000000000c00000000000000|@7392| 7392:S49|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529762d283129 7393:O1|@7394 7394:D16,340|0086311a52010e0e0e0c00021a4d010e0e0c000207d9313532362a3629353b1a3e010e0e0e0c000303043b5002041a3301103b5029362a382b392e372f3629353d1a1c010e0c000303041a1b01103b503b5029353b1a08010e0c00030322293729353c1afa000e0e0e0c0003030d2936293b1af7000c0003640202293664020d2936293b1ae5000e0e0c0003642b352c362d3722122c1ad7000c0003292c2c6a22133b1ac6000e0e0e0c000322143b1aba000e0e0e0c0003293c1ab7000c000322163b2b1ab1000e0e0c000450220d1aaa002d34220f3168061aa4000e0c00022e3b693e2b2b6a2e22191a970002024e000c000322182a2c1a8d000e0e0c000430221b1a7e000e0e0e0c00032e6801221a2b2b1a72000e0e0e0c00041a6d0031222222176b22182a222222222222222222221a5b000c0008322a69271b02013b1f070e0e0e0e0e0e000000004c01000000000000|@7396,I105,I218,I251,@7397,@2039,I253,@389,I106,I255,@740,@7400,I107,@4873,@7395,@7393| 7395:D3,68|00802b3629353b1a3e000e0e0e0c0003032129382956391a32000e0e0e0c000303065627680102082d56382e7d0500026402013b64420e0e000000003c00000000000000|@7403,I251,I113| 7396:S57|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e6577496473283229 7397:O4|@35,@863,@7399,@7398 7398:O5|@6671,778,0,778,0 7399:S28|4d617020646f6573206e6f742072657475726e20426f756e64204964 7400:O1|@7401 7401:D1,44|00802b352c362d372e382f39303a3b2c693b302b302f68052f2a2d6a2708420e000000002400000000000000|@7402| 7402:S28|5354525543545f56414c5328292e6d616b65426f756e644964283129 7403:S66|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e65774964732832296e65774d6170283129 7404:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@7405,I234,I107,I105,I218,I15,I247,@866,I253| 7405:S59|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d61704964732d6d61704964283129 7406:D8,132|00802b352c3629352a362b382c39566c3b1a74000e0c0003567c3b1a6a000e0e0e0c0003293c1a63000c0003569c3b2b1a5d000e0e0c0004503b2c6930302b31313b3b6807332a1a4a0056e76956e81a46001a47001212000100030012130001000400121400010005001a330022167b0b0e000a0e0e0e0e000000007c00000000000000|@7408,I253,I106,I255,@7407,@7331,@7332,@7327| 7407:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 7408:S60|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657256616c283129 7409:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 7410:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7411:D13,276|00832c3629353c1a0e010e0e0e0c000303cb2d353b2a291a02010e0e0e0c00021afd000e0e0c0002031729362b3c1af3000c0003292b25042504511e253b6502012a652e352f363037566b2c1ad9000e0e0c0003292c2c6a568a3b1ace000e0e0e0c0003569a3b1ac2000e0e0e0c0003293c1aaf000c000356ba3b2b1ab1000e0e0c000450311aab002d221322133168061aa4000e0c00022e3b693e2b2b6a2e56f81a97000c000356f92a2c1a91000e0e0c000430121200010002001a7d000e0e0c00032e6801121300010001002b2b1a6d000e0e0c000430271202232d352d352e362f37565b2c1a3d000e0e0c0003292c2c6a3d2f316a1a49002a2c6a2707641f040e0e0e0e0e000000000c01000000000000|@7413,I251,I105,I218,I106,@389,I253,I255,@740,@7412,I107,@4873,@961| 7412:O1|@7414 7413:S58|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f636573735369672833296d616b654964283429 7414:D2,60|00802b352c362d372e382f39303a3c28402d1a2b000c00043c2a693b312b31306805302a2e6a2709420e0e0e0e0e0e0e000000003400000000000000|@7415,I11| 7415:S40|5354525543545f56414c5328292e6d616b65426f756e644964576974684571557064617465283129 7416:D18,564|00802b56191a30020e0c000303912b56170c0002293629353d1a20020e0c000303262937291a18021a19021a1a020e0e0e0c0004293c1a03020c0003641a0c022f0e0e0e7d0600022a3629353d1aec010e0c000303041af701103b503b5029353b1ad8010e0c00030323293729353c1aca010e0e0e0c0003030e2936293b1ad301320e0e7e080003293664020f2936293b1ac001310e0e0e7e070003660fd42b56191ab3010c00032956282a1aad010e0e0c000329353c1a82010e0e0e0c0003031e2936292c1a97010c000303041a9301103b503b50292503511e313b640201296529353e1a54010e0c000303912936293629353d1a44010e0c000303262937291a64011a65011a3e010e0e0e0c0004293c1a27010c0003641a3001310e0e0e7d0800022a3629353d1a10010e0c000303041a1b01103b503b5029353b1afc000e0c00030323293729353c1aee000e0e0e0c0003030e2936293b1af700340e0e7e0a000329366402132936293b1ae400330202ad000e0e0e7e0900036602a229353b1ab7000c000303043b5002041adf00103b502936293629353d1a9e000e0e0e0c000303262937291ac8001ac9001a96000e0e0e0c0004293c1a7f000c0003641a8800310e0e0e7d0800022a3629353d1a68000e0c000303041a7300103b503b5029353b1a54000e0c00030323293729353c1a46000e0e0e0c0003030e2936293b1a4f00340e0e7e0a0003293664020f2936293b1a3c00330e0e0e7e0900036665420e0e0e0e0e000000002c02000000000000|@7418,I234,I251,@7419,@7422,@2237,I218,@2039,I253,I107,@4919,I231,@7424,@7427,@7429,@7431,@7434,@7417| 7417:O1|@7436 7418:S64|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332966696e64457175616c697479283129 7419:O1|@7420 7420:D1,20|00803c420e0e0e0e000000000c00000000000000|@7421| 7421:S37|545950455f5452454528292e747970655065726d697473457175616c697479283129283129 7422:O1|@7423 7423:D1,20|00803d420e0e0e0e000000000c00000000000000|@7421| 7424:O4|@35,@863,@7426,@7425 7425:O5|@6671,493,0,493,0 7426:S20|7265616c49643a2053686172696e67206c6f6f70 7427:O1|@7428 7428:D1,20|00803c420e0e0e0e000000000c00000000000000|@7421| 7429:O1|@7430 7430:D1,20|00803d420e0e0e0e000000000c00000000000000|@7421| 7431:O4|@35,@863,@7433,@7432 7432:O5|@6671,1261,0,1261,0 7433:S30|696e7465726e616c4d61703a204e6f7420626f756e64206f722046726565 7434:O1|@7435 7435:D1,20|00803c420e0e0e0e000000000c00000000000000|@7421| 7436:D1,20|00803d420e0e0e0e000000000c00000000000000|@7421| 7437:O2|@7439,@7438 7438:O5|@8134,@8540,@165,@166,@159 7439:D3,108|00842d23062e23082f3930230c313a32230b33373438220c35220d230a220e36220f2307221023092d2c3131220e220d221231221332220d22121a33002216680e3c3b2b22172218221622192217121700010001001a1c0022190e7b0b15000a000000006400000000000000|@7441,@7442,@7440| 7440:O1|@7445 7441:S30|54595045434845434b5f50415253455452454528292e7061737332283529 7442:O1|@7443 7443:D1,20|00803b420e0e0e0e000000000c00000000000000|@7444| 7444:S37|54595045434845434b5f50415253455452454528292e7061737332283529656e762d283129 7445:D5,60|00881a3b0032691a3a0033692a2a693234220d342d220e22131a2c00220f220f220f22171a250022110e0e7b0e0e000d000000003400000000000000|@7447,@7448,@7450,@7440,@7446| 7446:O1|@7451 7447:S45|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529 7448:D3,60|0080560723082c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@7449,I105,I218| 7449:S56|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352974797065456e762d283129 7450:D3,60|00805607230d2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@7449,I105,I218| 7451:D148,7692|008b220d3528161a061e0e0e0e0c00030326220d3629220e220e220e220e220e220e220e220e220e220e220e1ae51d220f0e0e7b0e0f000d220d3528081ad01d0e0c000303041acf1d103b503b50220d3528101aba1d0e0e0e0c000303041abb1d103b503b50220d35281e1aa21d0e0e0e0c000303041aa71d103b503b50220d350a1e00481114034118940476150e0e3a1052013e00ab0a000bb50d201420083e0088143e00bb0fa91bb70bf9118f013e004a0983141a157411b00d5414b2063e00220d3629352a362b372c382d39221123062212230d2a2a691a471d22142217306b1a421d2b332c1a401d0e0c0005293729353e1a181d0e0c0003031129362928081a0a1d0e0e0e0c00036402013b64030b293b1a181d0e0c0003022129380402002a1a0d1d2b1a0d1d0e0e0c00045029352a36291a031d0c00022b27052a3a291afb1c0c00021af91c0e0e0c0002032029352935293b1aed1c0e0e0c0003342a692b3b2b1ae31c0c0004503b260502023b502b2306291ac51c0e0e0c00021ac11c0e0e0c0002031c2935293b1ab71c0c00032d2a692b3b2b1aaf1c0c0004503b260402023b50333b2d1a9e1c0e0e0e0c000450343b2e1a911c0e0e0c00045022192309323b2b1a811c0e0e0c0004502c270f0fd4220d36220e3729291a5f1c0c00021a5d1c0e0e0c0002031c29352a362210352b2f692c2a69642a0c000251292503511e285102023b50501a401c650fdd220d36220e37220f382a3b692c2a693c28401a2c1c1a2d1c0e0e0c000428192b2b2f6b29221522142214221422142214221422142214221422141ac41b0e0c000d1a051c3c1a051c0e0e0c0003291a001c0e0c00023b2a3c6a3e2c2b6a2d2a1af31b0c0003291ac41b0e0c00021ac11b0e0e0c000207cb29351add1b3131221b221b1ad81b0e0c000622192219221a1acf1b1ad01b02024c1b0e0c00052b2a0e0e0e0c000264293b691abd1b2a691abc1b2a693b3b3b3b2d6805291a6f1b0c000203041aab1b103b503b50293b691aa41b2a69302a691aa01b2a690202061b1a9b1b2a693b3e3c3b2d6805291a3e1b0e0e0e0c000203041a771b103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101a411b020239000e0e0c001222282a1a361b0e0e0e0c00032968013c2a2e221d6b2228382229230c2a3b3c1ace1a0e0e0e0c0004502b2a0e0e0c0002271302013b1a081b270e0fdd220d36220e37220f382a3b692c2a693c28401aa71a1aa81a0e0c000428192b2b2f6b29221522142214221422142214221422142214221422141a401a0e0c000d1ac51a3c1a811a0e0e0c0003291a7c1a0e0c00023b2a3c6a3e2c2b6a2d2a1a6f1a0c0003291a401a0e0c00021a3d1a0e0e0c000207d229351a911a3131221b221b1a541a0e0c000622192219221a1a4b1a1a4c1a0e0c00052b2a0e0e0e0c000264293b691a3d1a2a691a3c1a2a693b3b3b3b2d6805291aef190c000203041a2b1a103b503b50293b691a241a2a69302a691a201a2a691a371a2a69020281193b3e3c3b2d6805291abe190e0e0e0c000203041af719103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101ac1190e0e0c001222282a1aba1902022e000e0e0e0c00032968013c2a2e221d6b2228382229230c2a3b3c1a4e190e0e0e0c0004502b2a0e0e0c0002271302013b1a8819270e0fdd220d3629352a362b372c381a861922132211221022102213221622122212221222122212680c291a6e191a6f196a1a6f191a7019287c2e221868052e2a2c221522151a63190c000630221722162216221622162216221622162216221622161a9a180e0e0e0c000d2a1a40190e0c000229353d1a82180e0e0e0c000303c029362a372a2d1ac9180e0e0c0003291a98180e0c00021a95180e0e0c0002039a293522192219221a1ab3181ab4180e0c00052a2a0e0e0e0c000264221a35221b36221c37221d38221e39221f3a22202306222123072222230822232309020201182224230a2225230b2226230c2227230d2228230e2229230f222a23101a7e180e0e0e0c0012221e2a1a76180e0e0e0c00032968013c2a2e22116b221e38221f230c2a3b3c1a0e180e0e0e0c0004502b2a0e0e0c0002260902023b502a6602ce3c28401af8171af9170e0e0c000428062a1a5e186a3d2d2b6a2c2a1af4170e0c0003291ac4170e0c00021ac1170e0e0c000203962935221a221a221b1adf171ae0170e0c00052a2a0e0e0e0c000264221b35221c36221d37221e38221f3922203a222123062222230722232308222423092225230a2226230b2227230c2228230d2229230e222a230f222b23101aae170e0e0e0c0012221f2a1aa6170e0e0e0c00032968013c2a2e22126b221f382220230c2a3b3c1a3e170e0e0e0c0004502b2a0e0e0c0002270802013b2c2705313b2b1a22170e0e0e0c00045029270c0fdc220d36220e37220f382a221122102210221022102210221022102210221022101abb160c000d291a3c171a05170e0e0c0003291ad4160e0c00021ad1160e0e0c000207d229351a4d172e2d221322131ae8160e0c00062211221122121adf161ae0160e0c00052b2a0e0e0e0c000264293b691ad1162a691ad0162a693b3b3b3b2d6805291a83160c000203041abf16103b503b50293b691ab8162a69302a691ab4162a691af3162a693b3e3c3b2d6805291a56160e0e0e0c000203041a8f16103b503b50221c35221d36221e37221f3822203922213a222223060202e4152223230722242308222523092226230a2227230b2228230c2229230d222a230e222b230f222c23101a55160e0e0c001222202a1a4e1602022e000e0e0e0c00032968013c2a2e22156b2220382221230c2a3b3c1ae2150e0e0e0c0004502b2a0e0e0c0002261402023b502d221322122212221222122212221222122212221222121a7c150e0c000d501a341627050fdd220d36220e37220f382b221122102210221022102210221022102210221022101a4d150e0e0c000d1a091622122210220f220f2212221522112211221122112211680c291ac5151ac6156a1aea151aeb15287c2f221768052e2a2c221422141aba150e0e0e0c00063d1ad4152f6a2a2a1a51150e0e0c0003291a20150e0c00021a1d150e0e0c0002039a29352215221522161a3b151a3c150e0c00052a2a0e0e0e0c000264221635221736221837221938221a39221b3a221c2306221d2307221e2308221f23092220230a2221230b2222230c2223230d2224230e020275142225230f222623101a06150e0e0e0c0012221a2a1afe140e0e0e0c00032968013c2a2e220f6b221a38221b230c2a3b3c1a96140e0e0e0c0004502b2a0e0e0c0002270802013b30270b0fdc220d36220e372a2210220f220f220f220f220f220f220f220f220f220f1a26140e0e0e0c000d291aec141a6d140e0e0c0003291a3c140e0c00021a39140e0e0c000207d229351ad1142e2d221222121a50140e0c00062210221022111a47141a48140e0c00052b2a0e0e0e0c000264293b691a39142a691a38142a693b3b3b3b2d6805291aeb130c000203041a2714103b503b50293b691a20142a69302a691a1c142a691a77142a693b3e3c3b2d6805291abe130e0e0e0c000203041af713103b503b50221b35221c36221d37221e38221f3922203a2221230602024c132222230722232308222423092225230a2226230b2227230c2228230d2229230e222a230f222b23101abd130e0e0c0012221f2a1ab61302022e000e0e0e0c00032968013c2a2e22156b221f382220230c2a3b3c1a4a130e0e0e0c0004502b2a0e0e0c0002261402023b503c28401a38131a39130e0e0c000428062a1a9e136a27050fd9220d361abb13220c22106a0403002a2a1ab2130e0e0e0c00035029362c291af0120e0c00021aed120e0e0c0002031d29352a362a221322132217301a8b130c000650292503511e293b6502013b641ad01227050fcc220d36291ac5122a1ab1120e0e0c00021aad120e0e0c000203992a352b362a35220d32221322112d221522112211221122150e0e0e0c000a2b1a80120e0c00021a7d120e0e0c00021a75120e0e0c00021a6d120e0e0c000203492922121a18130e0c0003291a54120e0c00021a51120e0e0c0002032929350402001afe122e2b22100202ee110e0e0e0c000450293522153b302c2f1ae8120e0c00066602013b6402013b2c2b2507250726051ea53b2705020129660fdd220d3629352a362b372c390403003b2a1aba120202a6110e0e0e0c00035029352a362b370403003b2a1aa1120e0e0c00035029362a370403003b2a1a8f120c00035029362a373403042211020c22113c1a7e120e0e0e0c0003221b23061a75122a336a221d23081a6f122a326a221f392220230d1a66122a326a22223a2223230b2224230c222536222623071a5212222822176a1a4e122c22172215220c332211312211322219220f220f2213680e221b1a61112a1a4d110e0e0c00021a49110e0e0c000203312a352b362a35222a221430222e2d2232222e222e0202de10222e22320e0e0e0c000a2b2a2506250626041e3d3b2704020129651aec11222b2219221d6b1ae611222c22176a222c351adf11222e22166a222e36222f23072c2b30302214221222193022192211220c22172217221b680e22221acd100e0e0c000222251acf102a1abb100c00021ab9100e0e0c0002039d2a352b362a352233221d3122372d223b223722372237223b0e0e0e0c000a2f03232b1a89100e0e0c00021a85100e0e0c00021a7d100e0e0c00021a75100e0e0c000202013b03462922381a1d110e0e0c0003291a58100e0c00021a55100e0e0c0002032529350402001a02112e2b22360e0e0e0c0004502935223b3b302c2f1af0100e0c00066602013b6402013b2c2b2507250726051ea73b270502012927290fca1a9d100fd8220d36220e37220f381aeb102211220f220e220e2211221422102210221022102210680c291a4f101a50106a1acc101acd10287c2e221668052d2a2c221322131a44100e0c00062f3b2b1ac60f0e0e0e0c0004502927070fdd220d36220e37220f382a221022102210221022102210221022102210221022101a5f0f0c000d2c1a80102210221422136b22101a78100e0c00042a2a1a970f0c0003291a680f0e0c00021a650f0e0e0c000207dc29351a59102f2e221422141a7c0f0e0c00063b1a4c100202f80e0e0c00022d1b10272b22153b1a3d100202e50e0e0e0c0006293b691a32102a691a31102a693b3b3b3b2d6805291a100f0e0c000203041a4b0f103b503b502218221822191a2d0f1a2e0f0e0e0e0c0005312a0e0e0e0c000264293b691af90f2a691af80f2a693b3b3b3b2d68050202870e291acb0e0c000203041a070f103b503b50293b691ad80f2a69302a691ad40f2a69220f2a691acf0f2a691ace0f2a693b3e3c3b2d6805291a950e0e0e0c000203041acf0e103b503b5022253522263602027400222737222838222939222a3a222b2306222c2307222d2308222e2309222f230a2230230b2231230c2232230d2233230e2234230f223523101a950e0e0e0c001222292a1a8e0e0e0e0e0c00032968013c2a2e221e6b222938222a230c2a3b3c1a260e0e0e0e0c0004502b2a0e0e0c0002261c02023b502a27060fd0220d36220e37220f381a250f1ac60d22122211221122112211221122112211221122112211680d291a0a0f1a0b0f6a1a0b0f1a0c0f282c2e221668052d2a2c221322131a3b0e0c00062935293b1a810d0e0e0c00036403051ab60d0212293b6928052a1adf0e1ae00e1ae10e680564303b2b1a980d0e0c0004502927080fcc220d3629352a362b372c38221023082211230d2a2a691ab90e22132216316b2a2e2b1ab10e0e0e0c00040402002f2a1aa80e0e0c0003502935291aa10e1a120d0e0e0e0c000303033c0226291a330d0202e70c0c00021a2d0d0e0e0c00020310293b1a790e3b3f1a780e0e0c000602013b03033b021d2217230d1a690e2218221c220d6b1a630e2b2d2c1a610e0e0e0c0005652c352d363b220e69221a23103b2a0e0e0c00023d2a69293b692d2a69303722122b2b6a312b2b220d2f1a330e0c00062a2a692a291ab80c02026c0c0e0c00021ab10c0e0e0c0002031c29352a362227372b35292d69642a0e0c000251292503511e2d5102023b505022243822162b692a0c0002511a880c27190fd6220d3629352a362b372c382d392e3a2211221034220f221622102213221122161ac50d22120e0e7b110f0010220d361aba0d220c22106a0403002a2a1ae90c0e0e0c00035029362c2210221022141a9f0d0c00052d2a2a1a1a0c0e0e0e0c00021a150c0e0e0c00020314291a060c0e0e0e0c00021a010c0e0e0c000202013b03272a352b362b352c362c2b2217221334221b1a5f0d0c0007502b2a2506250626041e4b3b270402013b651ad70b27060fce220d3629352a372b382c3978814b3c28403b1ac60b0e0e0e0c0004280b28403b1ab80b0202540b0e0c0004293b401a9e0b0e0e0e0c0004503c28402b1a9c0b0e0c00043c28401afe0c1a8f0b0c00043c2a2e2d6b2704053a0e00ff6d29353f1a310b0e0e0c00030323403c1add0c0e0e0c00031ad90c2a1ad90c0e0e0c00031ad50c1ad60c2b1ad60c6b65103b503b5029107881483c28403b1a3f0b0c0004280b28403b1a340b0e0c0004293b401a1e0b0e0e0e0c0004503c28402b1a1c0b0e0c00043c28401a9a0c1a0f0b0202ab0a0c00043c2a2e2d6b2704053a0e00ff6d29353f1aad0a0e0e0c00030323403c1a590c0e0e0c00031a550c2a1a550c0e0e0c00031a510c1a520c2b1a520c6b65103b503b5029107881443c28403b1abb0a0c0004280b28403b1ab00a0e0c0004293b401a9a0a0e0e0e0c0004503c28402b1a980a0e0c00043c28401a1a0c1a8b0a0c00043c2a2e2d6b2704053a0e00ff6d29353f1a2d0a0e0e0c00030323403c1ad90b0e0e0c00031ad50b2a1ad50b0e0e0c00031ad10b1ad20b2b1ad20b6b65103b503b5029102f2214221422181acb0b0c000529291a1b0a0c00021a190a0e0e0c0002032129352a362a352b3630221a31341aaa0b0e0e0e0c000750292503511e2c3b6502013b642d3b1a960b1a970b0c0004313b2b1ae6090e0e0e0c0004502c3b1a860b1a7f0b0c0004313b2b1ace090e0e0e0c0004502e3b1a720b1a670b0c0004313b2b1ab6090e0e0e0c0004501ab009270d0fd1220d36220e37220f382210392c2c2c2c220f2214221422132215221322132213221322131a350b0e0e0c000f501a7c0927040fdc220d36220e37220f382b2b2b220d2212221222112213221122112211221122111a090b0e0e0c000e501a4c09660fcf220d370fcc220d36220e37220f38291afb082210221022102210221022102210221022102210221c1ad60a0e0e0e0c000e1ad10a0e0e0c0002291acc0a0e0c00023b2a2f6a2e030329020e3c28402b1aff080c00043c2a69643e2d2b6a3003032902253c28401ae4081ae508020281080e0e0c000428062a1a46096a2a3b2d1ac3080c0004502965303b2b1ab7080c0004502927090fcf220d36220e372a1a6c08220f220f220f220f220f02024208220f220f220f220f220f221a1a4f0a0c000e293c1a93080c0003291a9008020420081e080e0e0e0c00023b2a3c6a3e2c2b6a2e3b2b1a5e080e0e0e0c0004502927070fd1220d3629352a362b372c382c221322122212221222122212221222122212221222121af5070e0e0c000d2b221422132213221322132213221322132213221322131ad6070e0e0e0c000d2d221522142214221422142214221422142214221422141ab6070e0e0e0c000d2b1a34081afd07020289070e0e0c0003291ac8070e0c00021ac5070e0e0c000207d229351a8d09322f221722171adc070e0c00062215221522161ad3071ad4070e0c00052b2a0e0e0e0c000264293b691ac5072a691ac4072a693b3b3b3b2d6805291a770702022b070c000203041aaf07103b503b50293b691aa8072a69302a691aa4072a691a2f092a693b3e3c3b2d6805291a46070e0e0e0c000203041a7f07103b503b5022203522213622223722233822243922253a22262306222723072228230822292309222a230a222b230b222c230c222d230d222e230e222f230f223023101a49070e0e0c001222242a1a420702022e000e0e0e0c00032968013c2a2e22176b2224382225230c2a3b3c1ad6060e0e0e0c0004502b2a0e0e0c0002261402023b502b2b1ad9060e0e0c0003291aa8060e0c00021aa5060e0e0c000207db29351a7508312f221822181abc060e0c00061a6908332f221922191aac060e0c00062217221722181aa3061aa4060e0c00052c2a0e0e0e0c000264293b691a71072a691a70072a693b3b3b3b2d6805291a47060c000203041a8306103b503b50293b691a54072a69302a691a50072a69332a691a4c072a691a07082a693b3e3c3b2d6805291a12060e0e0e0c000203041a4b06103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101a150602023d000e0e0c001222282a1a0a060e0e0e0c00032968013c2a2e221b6b2228382229230c2a3b3c1aa2050e0e0e0c0004502b2a0e0e0c0002501a9405271602012c270a0fdb220d3629352a362b372c392c221222122212221222122212221222122212221222121a2a050e0e0e0c000d2c221322132213221322132213221322132213221322131a0a050e0e0e0c000d22141a17070c000203033b025b3c28401a31051a32050e0e0e0c0004220f1a0f050c00020304220f020a220f1af1060e0e0c0002293e1aeb060c0003293b1ae7060c0003293b1adf060c0003293b1ad7060c000328062f2b6a312a1afa040e0e0e0c0003503b27072b1a48050e0c000229353d1a8a040e0e0e0c0003030d29362a372a2a69296801660fdd3c2840020256041aaf041ab0040e0c000428062a1a16056a3c28401a9b041a9c040e0c000428062a1a02056a3d2a2d6a29321a98040e0c0003291a68040e0c00021a65040e0e0c000207cb1a5306220e34221c221c1a7d040e0e0c00061a4506220e34221d221d1a6b040c0006291a3806691a54052a692c2a691a50052a691a2b062a693b3e3c3b2d6805291a16040e0e0e0c000203041a4f04103b503b5022213522223622233722243822253922263a222723062228230722292308222a2309222b230a222c230b222d230c222e230d222f230e2230230f223102024d0023101a15040e0e0c001222242a1a0e040e0e0e0c00032968013c2a2e22186b2225382226230c2a3b3c1aa6030e0e0e0c0004502b2a02020b000e0e0c0002503b270e02072b2e69296801642706291a75030e0e0c00021a71030e0e0c000207dc293529352a362a301a83030c0003291a54030e0c00021a51030e0e0c000207dc29351a4d05220e34221c221c1a67030c00061a4105220e34221d221d1a57030c0006221b221b221c1a4f031a50030e0c00052c2a0e0e0e0c000264293b691a1d042a691a1c042a693b3b3b3b2d6805291af3020c000203041a2f03103b503b50293b691a00042a69302a691afc032a69332a691af8032a691adf042a693b3e3c3b2d6805291abe020e0e0e0c000203041af702103b503b50222835222936222a37222b38222c39222d3a222e2306222f2307223023082231230902026e002232230a2233230b2234230c2235230d2236230e2237230f2238231002023c001ab9020e0e0c0012222b2a1ab2020e0e0e0c00032968013c2a2e221f6b222c38222d230c2a3b3c1a4a020e0e0e0c0004502b2a0e0e0c0002261702023b50333b2c1a30020e0c0004502a270402031a2702270a0fcf220d36220e38220f39293c1af5010e0e0c0003291a80020e0c000229353d1ac2010e0e0e0c000303c029362a372a1afa031a07020c0003291ad8010e0c00021ad5010e0e0c0002039a29352213221322141af3011af4010e0c00052a2a0e0e0e0c00026422143522153622163722173822183922193a221a2306221b2307221c2308221d2309221e230a221f230b2220230c2221230d2222230e2223230f222423101ac2010e0e0e0c001222172a1aba010e0e0e0c00032968013c2a2e220e6b2218382219230c2a3b3c1a52010202fa000e0e0e0c0004502b2a0e0e0c0002260902023b502a6602d23c28401a38011a39010e0e0c000428062a1a9e016a3d1a29032b6a2c2a1a32010e0e0e0c0003291a00010e0c00021afd000e0e0c0002039629352214221422151a1b011a1c010e0c00052a2a0e0e0e0c000264221535221636221737221838221939221a3a221b2306221c2307221d2308221e2309221f230a2220230b2221230c2222230d2223230e2224230f222523101aea000e0e0e0c001222182a1ae2000e0e0e0c00032968013c2a2e220f6b221938221a230c2a3b3c1a7a000e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1a5e000e0e0e0c0004502927061f0c0e0e0e0e0e0e00000000041e000000000000|@7453,I251,@7446,@7454,@7458,@7461,@7464,@7472,@7473,@7501,@7521,@2071,@7503,I105,I218,I253,I255,@1965,@855,I11,@7523,@6995,@7525,@2004,@7527,@7528,@7531,@7532,@2356,@7553,@1784,@1058,@1058,@7555,@7468,@7016,@693,@7557,@7527,@7558,@7560,@7134,@7736,@7744,@7745,@7698,@1955,79992,@7746,@7747,@1461,@7749,@7750,@7745,@7751,@7752,@7753,@7755,@6494,@7757,@7768,@3716,@7465,@6351,I106,@7777,@7778,@7779,@7780,@7785,@7787,@7789,@7790,@7791,@7792,@7745,@7793,@7665,@7684,@2008,@2104,@1058,@7685,@2356,@7553,@1058,@1058,@1058,@7687,@7795,@7017,@7691,@7696,@7697,@1249,@1247,@690,@7797,@7577,@1936,I48,I154,@7798,@7351,@7477,@7799,@7809,@7938,@7939,@7943,@7946,@510,@7324,@389,@35,@863,@7325,@7948,@7950,@7952,@7955,@7971,@1898,@7974,@7976,@7978,@8071,@8113,@6985,@6933,@8115,@8117,@8118,@8120,@8121,@8122,@8105,I152,I245,I242,@8043,@8124,@8125,@7452,@8043,@8124,@7452,@767| 7452:O2|3,@8133 7453:S57|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229 7454:O4|@35,@863,@7456,@7455 7455:O5|@7457,1406,0,1406,0 7456:S28|61737369676e54797065733a20656d7074797472656520666f756e64 7457:S53|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f54595045434845434b5f5041525345545245452e736d6c 7458:O4|@35,@863,@7460,@7459 7459:O5|@7457,1403,0,1403,0 7460:S34|61737369676e54797065733a206c617965726564207061747465726e20666f756e64 7461:O4|@35,@863,@7463,@7462 7462:O5|@7457,1400,0,1400,0 7463:S27|61737369676e54797065733a2077696c646361726420666f756e64 7464:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7465:O1|@7467 7466:S45|54595045434845434b5f50415253455452454528292e7061737332283529676976654572726f72283329283129 7467:D6,188|00842f353036313732383339343a220c2306220d2307220e2308220f23092210230a2211230b2212230c2213230d2214230e2215230f221623101a83000c00123e2d69291a7d000e0e0c000203041a7700103b503b50293b693b3b3b3b2d6805291a60000e0c000203041a5b00103b503b50312d1a55000e0e0c0003296801342a2d220c6b220d38220e230c220e03112a3b3c1a3a000e0e0e0c0004503b5002023b502b2a220c0e7d1000020e0e0e0e00000000b400000000000000|@7469,@7468,I105,@1784,@7016,I255| 7468:O1|@7470 7469:S30|5052494e545f50415253455452454528292e6572726f724e656172283529 7470:D8,220|00902e291ad9000e0e0c00021ad5000e0e0c0002032429352a362a35291ac8001ac9000e0e0c00036403052a68010207292503511e313b6502013b64293b1aab000c000303691aa700291a93000c00021a91000e0e0c0002032429352a362a35291a84001a85000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a67000c000303041a6700103b50293529351a51001a52000e0e0e0c000303043b5002041a4f0010293765021a293529351a32001a33000c000303043b5002041a330010293764641f110e0e0e0e00000000d400000000000000|@7471,I105,I218,@98,I251,@2900,@2955,@1840| 7471:S21|4c45585f28292e6572726f72446570746828313729 7472:S20|56616c7565206f7220636f6e7374727563746f72 7473:O1|@7474 7474:D21,500|00832d352e360402002f2a1aea010e0e0e0c00035029352a362a1adf011ae0010e0c000303033c02222a1ad7010c00021ad5010e0e0c000203102a3b1abd013b3f1ac8010e0c000602013b0309292e0e0e0c00020fda1ab7012d2c331ab5010e0e0c0005291a9c010e0c00021a99010e0e0c000207d5293529372a382a352b392b291a7f010c00021a7d010e0e0c0002031f29352a362a353b1a64010e0c000303052a68010207292503511e2a3b6502013b64291a4d010e0e0c00021a49010e0e0c00020311293529353b1a32010e0e0e0c00036402013b030d293529363e2a69293b696602013b040d002d2a1a28010e0c000350292306332a0e0e0e0c0002293b1afb000c000303033b0248293529352a362b372c382d391a0001220c691afe0022142b6a2c1afa002b1afa0002022b000e0e0e0c00043030302c303b3b6807292214220f1ae30002020c000c0004296801270b270a02031ad40064293b1a9e000e0e0e0c00030378341ac6001ac7000c0003292c1abf000c0003291abc001ab5000e0e0c00032e1a70001a71000e0e0c000303033c02222e1a67000c00021a65000e0e0c000203102e3b1a4d003b3f1a58000e0c000602013b03051a3c00020a1a7b002f1a6f000c00032a2a1a67000c00032704320e0e0c0002501a64000202293527061f0400000000ec01000000000000|@7476,@1936,I48,I251,I105,I218,I154,@7351,@7477,@1835,@7483,@7485,@7491,@1914,@7493,@7500,@4643,@389,@7387,@7475,@6741| 7475:S14|20696e2073747275637475726520 7476:S26|56414c55455f4f505328292e6c6f6f6b757056616c7565283429 7477:O1|@7478 7478:D22,636|00830402002d2a1a76020e0e0e0c00035029352a362a1a6b021a6c020e0c000303033c02222a1a63020c00021a61020e0e0c000203102a3b1a49023b3f1a54020e0c000602013b030929310e0e0c00020fdc1a4302312c311a41020e0e0c0005291a28020e0c00021a25020e0e0c000207cf293529372a382a352b392c3a040d002c2a1a1a020e0e0e0c00035029230c2e291af7010c00021af5010e0e0c0002031f29352a362a353b1adc010e0c000303052a68010207292503511e2a3b6502013b64291ac5010e0e0c00021ac1010e0e0c00020311293529353b1aaa010e0e0e0c00036402013b030d293529363e2a69293b696602013b342c0e0e0e0c0002293b1a83010c000303033b02ce293529352a362b372c382a352b362c382d391a82012a22116a2d353c1a5c010202b1000e0c0003035d2d362e382a3b1a690102029c000e0e0c00032a3b1a5b010c0003293b1a53010c0003293b1a4f010c000303051a4b0102242928403b1a46010e0e0e0c00042b3c2b3b2e1a3c010e0c000650291a37010c00025029643b2d2b6a270602012d292e3b2f2e2215680632353b1ae5000e0e0c0003030a32363f2a22196a64020132313b1ace000e0e0e0c00030304220e020a220e321af4000e0c0003220c2b2d2c6b296801270f270b02013b64293b1aa2000e0e0e0c00030376321ad2001ad3000c0003292c1acb000c0003291ac8001ac1000e0e0c00032e1a74001a75000e0e0c000303033c02222e1a6b000c00021a69000e0e0c000203102e3b1a51003b3f1a5c000e0c000602013b03051a4000020a1a87002f1a7b000c00032a2a1a73000c00032704300e0e0c0002503b020629352968016427041f040e0e000000007402000000000000|@7480,@1936,I48,I251,I105,I218,I154,@7351,@7477,@1835,@7481,I253,I113,I49,I11,I195,I47,@7479,@4643,@389,@7387,@7475| 7479:O1|@7482 7480:S30|56414c55455f4f505328292e6c6f6f6b7570537472756374757265283429 7481:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7482:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7479| 7483:D2,52|00802b3629353b1a2e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000002c00000000000000|@7484,I251| 7484:S41|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70794964283129 7485:D4,60|00801a3b005617690403002d56381a33002d3b2e1a31000e0e0c00075029352a362b372b2b2b6a2705420e0e0e0e0e0e000000003400000000000000|@7487,@7488,@7486,@1919| 7486:O1|@7490 7487:S46|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129 7488:D2,36|00805607282e1a1f000c0003292d1a17002e0e0e7e040003000000001c00000000000000|@7489,@389| 7489:S49|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129283129 7490:D1,20|00802b420e0e0e0e000000000c00000000000000|@7489| 7491:O1|@7492 7492:D1,20|00802b420e0e0e0e000000000c00000000000000|@7487| 7493:O1|@7494 7494:D4,148|00822d3729353c1a8e000e0e0e0c0003033329362f353036313832393c2e692a3b1a74000e0c0003030332020b322b1a6a000e0e0e0c00032e2e2c2f2d3b3b68072707024129353b1a4d000e0e0c0003033329362f353036313832393f2e346a2a3b1a33000c0003030332020b322b1a2e000e0e0e0c00032e2e2c2f2d3b3b6807270702012e6444000000008c00000000000000|@7496,I251,@7497,@7495| 7495:O1|@7499 7496:S28|56414c55455f4f505328292e6d6b53656c6563746564566172283329 7497:O1|@7498 7498:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7497| 7499:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7495| 7500:O1|@6741 7501:O1|@7502 7502:D19,372|00812c3729353e1a6e010e0e0e0c0003031129362928081a5e010e0e0e0c00036402013b6407de2c352d381a4e013b1a4e010e0e0e0c00032b1a48010e0c0003291a44010e0c00022f03202b353d1a27010c000303043b5002041a2f01102b37291a2c010e0c00026402512b353d1a07010c000303452b3629353e1afa000e0e0e0c000303152936291a08010e0c00021a05010e0e0c00026402013b0311293629352936291ae8000e0c0002660209291add000e0e0c00026402012b293528061ab5000e0e0c000303043b5002041acb001029362b1abc000e0c00021ab9000e0e0c0002030d2b36293b1a8b000c00036402013b03112b35293528053b2b2d3b680565022640003c28401a93001a94000e0c000428062a1a8e006a3f2e692b3b2b1a88000e0c0004502a661a82002a2c6a040200302b2b1a7a000e0e0e0c0004502935270902202c380402002a1a68002b1a60000e0c00045029352a36291a5b000c00022b270543000000006c01000000000000|@7504,I251,@156,I253,@7505,@7508,@7510,@1955,I105,I218,@7513,@855,I11,79992,I255,@7516,@2071,@7518,@7503| 7503:O1|@7520 7504:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296f7665726c6f616454797065283229 7505:O1|@7506 7506:D8,172|00812c1aaa000e0e0e0c00021aa5000e0e0c000203822c352d362a352b362c37302c1a93000c000303033c024a301a7f000c00021a7d000e0e0c000203142b1a6e000e0e0e0c00021a69000e0e0c000202013b0321303b2d3b3f301a5e000e0e0e0c00021a59000e0e0c00031a55000e0e0c000602013b03112a2a692d321a47000c00032a2a6965020a2c311a3900327e090003270502013b430e0e0e0e0e0e00000000a400000000000000|@7507,I105,I218,I251,I223,I239,I154,@7505| 7507:S42|5052494e545f5441424c4528292e6765744f7665726c6f6164732831297365617263684c697374283129 7508:O1|@7509 7509:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@7508| 7510:O4|@35,@863,@7512,@7511 7511:O5|@1964,2522,0,2522,0 7512:S26|676574526573756c74202d206e6f7420612066756e6374696f6e 7513:O4|@35,@863,@7515,@7514 7514:O5|@1964,2537,0,2537,0 7515:S42|67656e6572616c6973654f7665726c6f6164202d20617267206973206e6f742061207479706520766172 7516:D2,44|00802b352956281a26000e0e0e0c00036403065607680102013b420e0e0e0e0e000000002400000000000000|@7517,I251| 7517:S38|545950455f5452454528292e67656e6572616c6973654f7665726c6f6164283329742d283129 7518:O1|@7519 7519:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 7520:D6,124|00802b1a7a000e0e0e0c00021a75000e0e0c000203512b352c362a352b362936293f1a63000c0003293b1a5f000c0003641a50000e0c00022b36293c1a49000e0e0c0003293b1a43000c0003641a34000e0c00022e2c2b6a301a34000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,I243,I251,@7503| 7521:O1|@7522 7522:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 7523:O2|@693,@7524 7524:O2|@693,0 7525:O1|@7526 7526:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@7525| 7527:S10|417267756d656e74733a 7528:O1|@7529 7529:D11,196|00842c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2212230f221323101a8e000e0e0e0c00123e3169291a85000e0e0c000203041a7f00103b503b50302b1a79000e0e0c00033b1a74000e0c0002311b10272b323b1a6a000e0e0e0c0006293b691a62002a691a61002a691a60002a692f2a691a5c002a69322a693b3e3b3b2d6805291a2c000e0c000203041a2700103b503b5029270d1f050e0e0e0e0e00000000bc00000000000000|@7530,@7468,I105,@1784,@7016,@2008,@2104,@1058,@1828,@1058,@1058| 7530:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283529 7531:S5|756e696679 7532:O2|@7533,@2104 7533:D2,28|00831a1b002d56272e31680529641f04000000001400000000000000|@7535,@7534| 7534:D23,436|00802b353c1ab0010e0c000307cc2b362c372d382e391aa30156591aa2010e0e0e0c00033e2a69291a99010e0e0c000203041a9301103b503b502e567a2e56981a89010e0e0c000556791a83011a68010e0c000303033c022a56791a66010e0e0e0c00021a6d010e0e0c0002031456793b1a5c013b28091a5e010e0e0e0c000602013b03051a540102031a53013e2a69291a30010e0c000203041a2b01103b503b503056a73056c81a21010e0e0c0005291a3001691a30012a692c2a691a2c012a69302a691a28012a69332a693b3e3b3b2d6805291aec00020213000e0c000203041ae300103b503b5029271202b22b362c372d381afc0056491ac3000c00033e2a69291abd000e0e0c000203041ab700103b503b503b1ade000e0e0e0c00022e1be8032b569a3b56b80e0e0e0c00063b1ac4000e0c00022f1be8032b56b73b56d80e0e0e0c00063e3069291a75000e0e0c000203041a6f00103b503b50293b691a98002a692c2a691a94002a691a93002a691a92002a69322a691a8e002a69220d2a693b3e3b3b2d6805291a35000e0e0c000203041a2f00103b503b50292714420e0e0e0e0e0e00000000ac01000000000000|@7537,I251,@7538,@389,I105,@1784,@7539,@7531,I218,I154,@3387,@7549,@7550,@1058,@1058,@1058,@7538,@2008,@1058,@1058,@7536,@1058,@1058| 7535:S36|545950455f5452454528292e756e69667954797065734572726f725265706f7274283429 7536:O2|3,@7549 7537:S50|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129 7538:S6|43616e277420 7539:O1|@7540 7540:D2,44|00832c37293729352a362b37303434341a1d00340e0e0e7b090800080e0e0e0e000000002400000000000000|@7542,@7541| 7541:O1|@7543 7542:S71|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e737472283329 7543:D21,500|00863b1af2010e0e0e0c00022e1be8032b303b340e0c0006293b69040200220c2a1ad8010e0c000350293630350402002a2a1ac7010c00035029362c2a1ac0010e0c000303033c024a2c1ab7010c00021ab5010e0e0c00020314291aa6010e0e0e0c00021aa1010e0e0c000202013b03212c3b2b3b3f2e1a92010e0e0e0c00021a8d010e0e0c00031a89010e0e0c000602013b270503033b025c3b3469291a63010c000203041a6f01103b503b50293b693e220e69291a4b010c000203041a5b01103b503b50293b693b3b3b2e2d6805291a30010e0c000203041a3f01103b503b50293b691a38012a691a37012a691a36012a692708331a32011a03010c000303033c0222331afb000c00021af9000e0e0c00020310333b1a11013b3f1af4000e0c000602013b03033b026c3b220c69291ad0000e0c000203041adb00103b503b50293b691ae800220d1ae7000c0003291ae4001add000e0e0c00033e2a69291aa1000e0e0c000203041aaf00103b503b50293b693b3b3b302d6805291a84000e0c000203041a9300103b503b50293b691aa8002a692708293b1a63000c000303032a020b2a2a1a96000e0e0e0c0003293b1a4b000c000303032c020b2c2a1a82000e0e0e0c00033b3e3b3b2d6805291a31000e0e0c000203041a3f00103b503b502927081f070e00000000ec01000000000000|@7545,@2008,@1936,I251,I105,I218,I223,I239,I154,@1784,@1784,@1058,@1998,@1058,I48,@3035,@389,@3033,@1058,@7546,@7544| 7544:O1|@7548 7545:S87|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e7374722833297072696e745769746844657363283329 7546:O1|@7547 7547:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7546| 7548:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7544| 7549:S2|746f 7550:O2|@1058,@7551 7551:O2|@7552,0 7552:O2|3,@2327 7553:O2|3,@7554 7554:S7|526561736f6e3a 7555:O2|3,@7556 7556:S45|417267756d656e7473206f66206f72656c7365206d7573742068617665207479706520626f6f6c2a626f6f6c2e 7557:O2|@693,@1176 7558:O2|3,@7559 7559:S46|417267756d656e7473206f6620616e64616c736f206d7573742068617665207479706520626f6f6c2a626f6f6c2e 7560:D2,60|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a1a00220e0e0e0e7b0e03000d000000003400000000000000|@7562,@7561| 7561:O1|@7563 7562:S63|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283129283129 7563:D9,236|008b220d35220e36220f372210381adf00221022106a0403002a2a1ad6000e0e0e0c00035029352a362b3722123c1ac7000c0003312c2b3b1ac1003b221b22192219221d1ab9000e0e0c000b221223061ab1002a2e6a221423082215392216230d22173a2218230b2219230c221a37221b38221c35221d230a221e36221f23071a8500222122146a2d2c3131220f220e221331221432220d221322132217680e2211221e2b2228221e222b222622262226222a0e0e0c000a22183b2b1a4d000e0e0c00045022193b22131a3f000c0004503d22122b6a271c1f0c0e0e0e0e0e0e00000000e400000000000000|@7565,@7566,@6494,I106,@7569,@7572,@7730,@7564,I255| 7564:D6,92|00803c28403b1a57000c00041a55002a6956280e0e0c00022a3b1a4b000c0003563723093b2a0e0e0e0c000264293b1a3a000e0e0e0c000303032a020b2a2a1a2e00310e7e0700032704420e0e0e0e0e000000005400000000000000|@7732,I11,@7733,I253,I251,@7731| 7565:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229 7566:D8,100|00822b3929291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@7568,I105,I218,I251,@6406,@7567,@389,@7465| 7567:S37|2068617320616c7265616479206265656e20626f756e6420696e2074686973206d61746368 7568:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d61746368547265652832296d657373466e283329 7569:O1|@7570 7570:D4,124|00802b352c362d373c28401a72001a73000c00043c28401a6e001a67000c00043d2b2b6a3c28403b1a59000e0e0c00043c28403b1a4d000e0e0c00043c28403b1a41000e0e0c00042a2c2b6a2968013c28403b1a2e000e0e0e0c0004296801220c3c32220e220e302f6807270d420e0e000000007400000000000000|@7571,-1,I11,@2364| 7571:S28|56414c55455f4f505328292e6d616b654c6f63616c56283129283129 7572:O1|@7573 7573:D74,3140|0089343528161a3f0c0c00030322343629220c220c220c220c220c220c220c220c220c1a260c220d0e0e0e7b0c0d000b3435281e1a110c0e0e0c000303183c28401a0c0c1a0d0c0e0e0c000428062a1a060c6a640fd63435281b1aeb0b0c000303051af70b0fd5343528101ada0b0e0e0e0c000307c83436220c37220d382b220e220e3c220e220e220e220e220e220e1ab90b0e0e0c000b2b220f220f220f220f220f220f220f220f220f1a9e0b0e0e0e0c000b2a2a1aa70b0c0003291aa40b0e0c00021aa10b0e0e0c0002039a2935220c220c220d1a930b1a940b0e0c00052a2a0e0e0e0c000264220d35220e36220f3722103822113922123a221323062214230722152308221623092217230a2218230b2219230c221a230d221b230e221c230f221d23101a4a0b0202070b0e0e0e0c001222142a1a3e0b0204f70a2e000e0c00032968013c2a2e346b2211382212230c2a3b3c1a230b0c0004502b2a0e0e0c0002270802013b2c27070fdd343528051ad30a0c000307d33436220c37220d382a220e220e220e220e220e220e220e220e220e1ab40a0e0c000b2c1ae00a342212346b341adb0a0c00042a2a1aaf0a0c0003291aac0a0e0c00021aa90a0e0e0c000207dd29351abd0a2f2e220f220f1ab80a0e0c00063b1ab40a0e0c00022d1b10272b22103b1aa90a0e0e0c0006293b691aa20a2a691aa10a2a693b3b3b3b2d6805291a5c0a0e0c000203041a8f0a103b503b502213221322141a4d0a1a4e0a0e0e0e0c0005312a0e0e0e0c000264293b691a6d0a2a691a6c0a2a693b3b3b3b2d6805291a1b0a0204e809cc000e0e0c000203041a470a103b503b50293b691a480a2a69302a691a440a2a69220f2a691a3f0a2a691a3e0a2a693b3e3c3b2d6805291add090e0e0c000203041a0f0a103b503b50222035222136222237222302026f003822243922253a22262306222723072228230822292309222a230a222b230b222c230c222d230d222e230e222f230f223023101a99090e0e0c001222272a1a92090e0e0e0c00032968013c2a2e221e6b2224382225230c2a3b3c1a7a090e0e0e0c0004502b2a0e0e0c0002261c02023b502a27060fdc343528111a26090e0e0e0c0003037c3436220c37220d381a87091a1409220f220f220f220f220f220f220f220f220f680b291a70091a71096a1a71091a7209282c2e221468052d2a2c220e220e1a65090e0e0c00062935293b1ad1080e0e0c00036403051a52090212293b6928052a1a4b091a4c091a4d09680564303b2b1ae0080e0c0004502927080fcc3435280f1a9b080c000303883436220c37220d38291a8e0833333333221322132213221322131a15090e0e0c000c1a11090e0e0c0002291a0c090e0c00023b2a2f6a2e03032902123c28402b1a5f0802023c080c00043c2a69643e2d2b6a3003032902213c28401a40081a41080e0e0c000428062a1a3a086a2a3b2d1a57080c0004502965303b2b1a4b080c0004502927090fd1343528191a07080c0003034c3436220c372a1afd0732323232221222122212221222121a90080e0c000c293c1a8b080c0003291a88080202c1070e0c00023b2a3c6a3e2c2b6a2e3b2b1af6070e0e0e0c0004502927070fd534353d1ab0070e0c000307cb343629352a362b372c392c35280e1a99070e0e0c000307cf2c3629352a362b372c382d39220e23092a3b2b1ab0070e0c000450220f23062210230d2a2a691a1d082215221c316b1a18082b342c1a16080e0e0e0c00052936293b1a4d070e0e0c000303033c0213291a5b07020228070c00021a55070e0e0c0002640376293729353e1a25070e0e0c0003031129362928081a16070e0e0e0c00036402013b64030b293b1ac4070e0c0003022929380402002a1ab9072b1ab9070e0e0c00045029352a36291aaf070204cc0667020e0e0c00022b2705333b2c1a03070c000450323b2b1af906020269000e0e0c0004502964025b2935291a81071aae060e0e0e0c000303033c0222291abb060c00021ab9060e0e0c00020310293b1a5d073b280f1a5b070c000602013b6403043b50021b331a4e071a4f070c000322173c221f342d1a46070e0e0e0c0006511ae806270c0214333c22122c1a34071a2d070e0e0c0006501ad0062c2211221122112211221122112211221122111a32060e0e0e0c000b2a1a0c070e0c000229353d1a1a060e0e0e0c000303bc29362a372a2d1a21060e0e0c0003291a1c060e0c00021a19060e0e0c0002039629352211221122121a0b061a0c060e0c00052a2a0e0e0e0c00026422123522133622143722153822163922173a2218230622192307221a2308221b2309221c230a221d230b221e230c221f230d2220230e2221230f222223101ac2050e0e0e0c001222192a1aba050e0e0e0c00032968013c2a2e220e6b2216382217230c2a3b3c1aa2050e0e0e0c0004502b2a0e0e0c0002260902023b502a6602ce3c28401a58051a59050e0e0c000428062a1a52056a3d2d2b6a2c2a1a50050e0c0003291a4c050e0c00021a49050e0e0c0002039629352212221222131a3b051a3c050e0c00052a2a0e0e0e0c00026422133522143622153722163822173922183a22192306221a2307221b2308221c2309221d230a221e230b221f230c2220230d2221230e2222230f222323101af2040e0e0e0c0012221a2a1aea040e0e0e0c00032968013c2a2e220f6b2217382218230c2a3b3c1ad2040e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1ab6040e0e0e0c0004502927090fda343528121a6f040c000307d03436220c38220d39293c1a1d050e0e0c0003291a3c050e0c000229353d1a4a040e0e0e0c000303c029362a372a1a26051a4f040c0003291a4c040e0c00021a49040e0e0c0002039a2935220e220e220f1a3b041a3c040e0c00052a2a0e0e0e0c000264220f3522103622113722123822133922143a221523062216230722172308221823092219230a221a230b221b230c221c230d221d230e221e230f221f23101af2030e0e0e0c001222162a1aea030e0e0e0c00032968013c2a2e220e6b2213382214230c2a3b3c1ad20302048703fa000e0c0004502b2a0e0e0c0002260902023b502a6602d23c28401a84031a85030e0e0c000428062a1a7e036a3d1a55042b6a2c2a1a7a030e0e0e0c0003291a74030e0c00021a71030e0e0c000203962935220f220f22101a63031a64030e0c00052a2a0e0e0e0c00026422103522113622123722133822143922153a22162306221723072218230822192309221a230a221b230b221c230c221d230d221e230e221f230f222023101a1a030e0e0e0c001222172a1a12030e0e0e0c00032968013c2a2e220f6b2214382215230c2a3b3c1afa020e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1ade020e0e0e0c0004502927060fd13435280e1a97020c000307cf343629352a362b372c382d390402002e2a1a6e030e0e0e0c0003502935220e03051a6203027a291a60031a65020e0e0c000303033c0222291a73020c00021a71020e0e0c00020310293b1a3d033b3f1a14030e0c000602013b0323342306302a0e0e0e0c000264293b1a26020e0e0e0c000303051a0f0302022935640222342306220c230d2a2a691a030322112218326b1afe022b220c2c1ab3020c00052704220c23092d3b2b1a1c020e0c0004502a36293b1adc010e0c000303033c0217291aeb010202b8010c00021ae5010202ab010e0e0c00026407dc22120317220f3c2217311ab0021a89020e0e0c0006501a2c0202cb303b2c1acc010e0c0004502a36291aa9010e0e0c00021aa5010e0e0c000203042935023b2b38291a5c020e0c000229353d1a6a010e0e0e0c0003030829362968016402013b293b1a54010e0c00031a6d010e0e0c0002651a64010e0c0002642903512c3729353e1a34010e0c0003031129362928081a26010e0e0e0c00036402013b64030b2c3b1ad4010e0c000302212c380402002a1a0d022b1ac9010e0e0c00045029352a36291abf010c00022b2705021722113c2219331aee011abf0102020a000c0006501a60016502aa3b2f69221023103b2a0e0c00023d2a69293b692d2a693c28401abd001abe000e0e0e0c0004221a1ac3000c00020304221a020a221a1aa9010e0e0c0002293e1aa3010c0003293b1a9f010c0003293b1a97010c0003293b1a8f010c000328062f2b6a22152a326a270722180e0e0e0c0002220f2217220e1a73010c000450220f22142218220f3b1a67010c000650220f2a69221c0e0e0c000250220e3b2b1a64000e0c00045029382707303b2b1a55000e0e0c00045029270b02031a9f001f0a0e000000003c0c000000000000|@7575,I251,@7572,@855,I11,79992,@1461,@2004,I105,I218,@7531,@7532,@7468,@7016,I255,@7576,@7665,@7684,@7528,@2008,@2104,@1058,@7685,@1784,@2356,@7553,@1058,@1058,@1058,@7687,@7689,@7017,@7691,@7696,@7697,@7698,@1965,@1249,@1247,@690,@7710,@6985,@6933,@7713,@6995,@7525,@7715,@7716,@7473,@7501,@7717,@2071,@7503,@6666,I154,@7719,@389,@7465,@7720,@1955,@767,@1936,@6741,I48,@7721,@7716,@7722,@7723,@7725,I152,I245,I242,@6407,@7574| 7574:O1|@7726 7575:S62|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e283629 7576:D3,52|0082560923085619230d2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@7579,@7577| 7577:O1|@7580 7578:S28|545950455f5452454528292e61737369676e54797065732833292d45 7579:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7580:D18,356|00822d352e360402002f2a1a5a010e0e0e0c00035029352a362a1a4f011a50010e0c000303033c02222a1a47010c00021a45010e0e0c000203102a3b1a2d013b3f1a38010e0c000602013b0309292e0e0e0c000202721a27012d2c331a25010e0e0c0005291a0c010e0c00021a09010e0e0c0002034e2935293729352a39040d002b2a1a02010e0e0e0c000350292308302a0e0e0e0c0002293b1ad3000c000303033b021b293533282e1adf000c00032a2f2b1ada000e0e0e0c000429680166270702031acd0064293b1aa3000c0003037c1ac3001ac4001ab1000e0e0c0003292c1aa7000c0003291ab4001a9d000e0e0c00032e1a74001a75000e0e0c000303033c02222e1a6b000c00021a69000e0e0c000203102e3b1a51003b3f1a5c000e0c000602013b03051a4000020a1a73002f1a57000c00032a2a1a4f000c00032704320e0e0c0002501a5c00020229352706440e0e0e0e0e000000005c01000000000000|@7582,@1936,I48,I251,I105,I218,I154,@7351,@7477,@1835,@389,@7583,@7664,@7581,@4643,@7387,@7475,@6573| 7581:S16|5479706520636f6e7374727563746f72 7582:S24|56414c55455f4f505328292e6c6f6f6b7570547970283329 7583:O1|@7584 7584:D19,244|00827881453c28403b1aec000e0c0004280b28403b1ae0000e0c0004293b401ada000e0e0e0c0004503c28402b1ac8000e0c00043c28401ac6001abb000c00043c2a2e2d6b270405380e00ff6d29353f1ab1000e0e0c00030323403c1aa9000e0e0c00031aa5002a1aa5000e0e0c00031aa1001aa2002b1aa2006b65103b502910040d002a2a1a97000c000350293830352935293369652a0e0c00023c28403b1a55000e0e0c00041a79002a691a78002a1a78006a2f2a220c3c220d1a71003b1a71000e0e0c00082c3b1a6b000c0003293b1a2f000c000303041a5f00103b5029352709440e0e0e00000000ec00000000000000|@7586,I11,I255,@7587,I251,@510,@7324,@389,@35,@863,@7325,@1835,@7589,@7591,@7596,@7600,@7585,I253,@2309| 7585:O1|@7605 7586:S28|434f5049455228292e66756c6c436f70794461746174797065283329 7587:O1|@7588 7588:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7589:D2,36|00802b3629680156273b2b1a1a000e0e0e0c0004503b6542000000001c00000000000000|@7590,I255| 7590:S38|434f5049455228292e66756c6c436f70794461746174797065283329726573456e762d283129 7591:O1|@7592 7592:D6,44|00802b351a29002a1a29000e0e0c00031a25001a26002b1a26006b64100e0e0e000000002400000000000000|@7590,@7594,@389,@35,@863,@7593| 7593:O5|@7595,259,0,259,0 7594:S9|656e74657256616c20 7595:S30|6d6c736f757263652f4d4c436f6d70696c65722f434f504945522e736d6c 7596:O1|@7597 7597:D6,44|00802b351a29002a1a29000e0e0c00031a25001a26002b1a26006b64100e0e0e000000002400000000000000|@7590,@7599,@389,@35,@863,@7598| 7598:O5|@7595,258,0,258,0 7599:S12|656e74657253747275637420 7600:O1|@7601 7601:D2,20|00801a1300100e0e000000000c00000000000000|@7603,@7602| 7602:O4|11,@316,0,@7604 7603:S33|434f5049455228292e66756c6c436f707944617461747970652833295f2d283129 7604:O5|@7595,261,0,261,0 7605:D6,76|0086312e313c3b301a45000e0e0c0007322f323b2d2e1a37000c00071a350032312c6b1a32003234331a300034302211316809220c3b2b1a2600327b050d0004000000004400000000000000|@7607,@7608,@7628,@7606,@7585,@1898| 7606:D4,84|00822c2c2a1a50000e0c00021a4d000e0e0c0002032c2a352b36312b2d56775688569956aa56bb56cc56dd56ee1a30000e0c000c2a2a2505250526031e383b6602012965440e0e0e000000004c00000000000000|@1901,I105,I218,@7636| 7607:S24|434f5049455228292e6c6f63616c436f7079536967283729 7608:O1|@7609 7609:D5,60|00851a3b002f1a3b003030346806312d2b1a34000e0c00041a3100323232326805332b2b1a2100310e0e0e7b050b0004000000003400000000000000|@7611,@7612,@7608,@1898,@7610| 7610:D4,76|00822c2c2a1a48000e0c00021a45000e0e0c000203242a352b36312b2d56775688569956aa1a30000e0c00082a2a2505250526031e303b6602012965440e0e0e000000004400000000000000|@1901,I105,I218,@7614| 7611:S41|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629 7612:D8,164|00822c2c2a1aa0000e0c00021a9d000e0e0c000203792a352b362a35291a90001a91000e0e0c00036403552a351a80001a81000e0e0c000303043b5002041a7700102a37293729352a39568b220d1a6b000c000329282e1a62000e0e0e0c00031a5d002c56c76a2d2b2b56e956fa220e121200010002000e0e0c0007270702012b2a2a2505250526031e853b6602012965440e0e0e0e0e0e000000009c00000000000000|@1901,I105,I218,@38,I251,@1840,@389,@7613| 7613:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7614:O1|@7615 7615:D12,268|00863035291a08011a09010e0e0c00036407cf30351af8001af9000e0e0c000303043b5002041aef0010303729351aeb0031691aea0031692b37293629353d1ad2000e0e0e0c0003034b29362a372c352d37220d0304221002371ac7003032220f6b2c1ac2002b1ac2000e0e0e0c00043d2f2b6a2d2a2e6a220c3522142a1aaf000c0003220e362a2a2e6a29221969270827040264321a9b000c00020304220c02572a3629353b1a6a000e0e0e0c00030310293829220d0e0e0c00022968016502013b291a71000e0e0c00021a65000e0e0c0002032029353035220f2a1a5000020219000e0c000332362a2a2e6a2922146927050202220e65270602012f1f07000000000401000000000000|@7617,@27,I251,@1840,@7618,@7620,@7622,@7616,@1914,@389,I218,I105| 7616:O1|@7627 7617:S53|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329 7618:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7619,@389| 7619:S64|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c6454797065732833296d616b654e616d65283129 7620:D2,52|00802b3629353b1a2e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000002c00000000000000|@7621,I251| 7621:S62|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f70794964283129 7622:D3,52|00800403002c56271a2d00564856592e1a29000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@7624,@7623,@1919| 7623:O1|@7625 7624:S68|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129 7625:D1,20|00802b420e0e0e0e000000000c00000000000000|@7626| 7626:S71|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129283129 7627:D1,20|00802b420e0e0e0e000000000c00000000000000|@7624| 7628:D5,60|00801a3b005617691a39005628690403002e2c1a32002d56792e1a2f000c00075029352a362b372b2b2b6a2706420e0e000000003400000000000000|@7630,@7631,@7633,@7629,@1919| 7629:O1|@7635 7630:S39|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129 7631:D2,52|00802b3629353b1a2e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000002c00000000000000|@7632,I251| 7632:S48|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129636f70794964283129 7633:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7634,@389| 7634:S42|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129283129 7635:D1,20|00802b420e0e0e0e000000000c00000000000000|@7634| 7636:O1|@7637 7637:D33,772|008a3435291a00031a01030e0e0c00036407d734351af0021af1020e0e0c000303043b5002041ae70210343729352a362b372c382a352b362c382d392e3a221303791acf022b22146a2e353c1abd020e0e0c000303592e362f382a3b1ab9020e0e0c00032a3b1aaf020c0003293b1aa7020c0003293b1aa3020c000303051a9f0202242928403b1a9a020e0e0e0c00042b3c2b3b2e1a90020e0c000650291a8b020c00025029643b2d2b6a270602012e292f3b302e306806650fcd7881483c28403b1a5f020c0004280b28403b1a54020e0c0004293b401a56020e0e0e0c0004503c28402b1a3c02020224010e0c00043c28401a3e021a2b020c00043c2a2e2d6b270405380e00ff6d29353f1afd010e0e0c00030323403c1a1d020e0e0c00031a19022a1a19020e0e0c00031a15021a16022b1a16026b65103b5029101a10022a691a0f022b691a0e022c69292c2c6a1a09023022196a2217221d1ae2010e0e0e0c000329282e1ad6010e0e0e0c0003220c2d2d3b2d221c221c221f0e0c000831353c1a8601020270000e0e0e0c00030359313632382a3b1a7d010e0e0c00032a3b1a73010c0003293b1a6b010c0003293b1a67010c000303051a630102242928403b1a5e010e0e0e0c00042b3c2b3b2e1a54010e0c000650291a4f010c00025029643b2d2b6a270602013129220e3b220f221d220f6806270a32322b326b220f3722192b692a22100e0e0e7d1a00023435291a4a011af3000c000364036534351a3c011ae5000e0e0c000303043b5002041adb0010343729352a361a2501220c691a2301220c690403002d2c1a1c012d220e2e1a19010e0e0c00075029352a362b372b2b2b6a30220d1a07010c0003220e362b2b6922192a69642a220f0e0e7d1900023435291aee001a7f000c000364036134351ae0001a71000e0e0c000303043b5002041a670010343729352a362b372c382d392e3a2f23062c1abd00220c1abc000e0c0004292e1a3f000c00031ab1000e0e0c0002030b3030302c3030306807020131220d35322b692a220e0e7d1800023b1f0b0e00000000fc02000000000000|@7639,@38,I251,@1840,@7640,I253,I113,I49,I11,I195,I47,I255,@7641,@510,@7324,@389,@35,@863,@7325,@7643,@7647,@7650,@7653,@27,@7654,@7655,@7656,@1919,@7658,@23,@7638,@1914,I218| 7638:O1|@7663 7639:S27|434f5049455228292e6c6f63616c436f7079536967283729283329 7640:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7641:O1|@7642 7642:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7643:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@7645,@27,@1842,I251,@7644,@1862| 7644:O1|@7646 7645:S39|434f5049455228292e6c6f63616c436f70795369672837292833296e65775369672d5f2d283129 7646:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@27,I251,@7644| 7647:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@7645,@38,@1842,I251,@7648,@1862| 7648:O1|@7649 7649:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@38,I251,@7648| 7650:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@7645,@23,@1842,I251,@7651,@1862| 7651:O1|@7652 7652:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@23,I251,@7651| 7653:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 7654:D2,52|00802b3629353b1a2e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000002c00000000000000|@7632,I251| 7655:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7634,@389| 7656:O1|@7657 7657:D1,20|00802b420e0e0e0e000000000c00000000000000|@7634| 7658:O1|@7659 7659:D7,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203512c352d362a352b362c372d382e392f3a3023062c1a5b00220d1a5a000e0e0e0c0004292e1a53000c00031a41000e0e0c0002030b3030302c303030680702013232220e1a38000e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,@7660,@1914,I251,@7658| 7660:O1|@7661 7661:D1,20|00802b420e0e0e0e000000000c00000000000000|@7662| 7662:S37|434f5049455228292e6c6f63616c436f7079536967283729636f7079547970283129283129 7663:D1,20|00802b420e0e0e0e000000000c00000000000000|@7662| 7664:O1|@6573 7665:O2|@7666,@70 7666:D2,28|00822d2d56272e1a16002f7b06050005000000001400000000000000|@7668,@7667| 7667:O1|@7669 7668:S26|545950455f5452454528292e61737369676e5479706573283329 7669:D28,644|00832e350a05009f010c001c02a401b20141022e3629352a362b392c3a0401002c2c2b220d0c00045029352937293629353c1a53020c00036403102936293629220e1a43020c00036502013b641a3c020e0c000207cf2937293629353c1a28020e0c000303042937024129353b1a18020e0c000303042936023129363b2a291a0e020e0e0e0c00021a01020e0e0c0002031729362b3c1afb010c0003292b25042504511e253b6502012a663b32291adf010c00021ad5010e0e0c0002031729362b3c1acf010c0003292b25042504511e223b6502012a652a2a1abc010e0c00031aa9010e0e0c000203862d352b3c1aab010c00032b3c1aa3010c0003293b691a9e012a692c2a691a9a012a692f2a691a96012a6927081a93010c0002291a90011a910102025b000e0e0c0003291a88010e0c00023b3e3b3b2d6805291a51010e0e0c000203041a7301103b503b503c3b2b220e6b2212382213230c2a3b3c1a5f010c0004502b2a0e0e0c00022707020e2f3b2f1a4a010e0e0e0c0004503b270402013b2f1a3d01220e220e220e1a38010e0c00063b2f69293b6928052c33302d6805270b02cc1a230102c72e3629352a3628062b2b6a6602b92e362f372a1a03013131311a09010e0e0c00061a05010e0e0c0002291a00010e0c00023b2a2d6a2c030329020e3c28402b1aef000c00043c2a69643e2d2b6a2e03032902213c28401adc001ad5000e0e0c000428062a1ad2006a2a3b2d1aa7000c00045029652707024f2e362f382a3030301a96000e0e0e0c00052a3131311a89000e0e0c00053d2b2b6a2704022a2e36291a76003030301a94000e0c0006293c1a8f000c0003291a8c000e0c00023b2a3c6a3e2c2b6a27051f040e0e0e0e000000007c02000000000000|@7671,I251,I218,I105,I106,I113,@510,@7672,@7673,@7674,@371,@6184,@6187,@6373,@1784,I255,@7667,@7675,@1965,@7677,@6985,@7679,I11,@855,79992,@7681,@6995,@7670| 7670:O1|@7683 7671:S46|545950455f5452454528292e61737369676e54797065732833297479706546726f6d547970655061727365283129 7672:S13|2074797065287329206e6f7420 7673:S11|2920726571756972657320 7674:S18|5479706520636f6e7374727563746f722028 7675:O1|@7676 7676:D4,76|00842f1a4a000e0e0e0c00021a45000e0e0c000203212f3530362a303030340e0e0c00052a323232321a2c000e0c00062a2a69270402013b1f050e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@7675| 7677:O1|@7678 7678:D12,228|00842f1ae2000e0e0e0c00021add000e0e0c000203b92f3530362a352b362a352a333333220e0e0e0e0c00052a291abf000c0002293c1abb000c00036403033c024a291aaa000e0e0e0c00023b2a1aa7000c00036403041aa200103b503b50291a85000e0e0c0002030329020b293f1a8e000e0e0e0c00032928301a86000e0e0e0c0003641a64000e0c00020303290221291a5b000c0002293c1a6b000c00032b3c2b1a66000e0e0e0c00046525011e823b64292b692f220e220e220e220e1a4e000e0e0e0c00062a2a69270902013b1f050e0e0e0e0e0e00000000dc00000000000000|@1785,I105,I218,I223,I232,I231,@337,I252,I251,I107,@6192,@7677| 7679:O1|@7680 7680:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@7679| 7681:O1|@7682 7682:D4,76|00842f1a4a000e0e0e0c00021a45000e0e0c000203212f3530362a303030340e0e0c00052a323232321a2c000e0c00062a2a69270402013b1f050e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@7681| 7683:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@7670| 7684:S6|56616c75653a 7685:O2|3,@7686 7686:S11|436f6e73747261696e743a 7687:O2|3,@7688 7688:S33|54797065206d69736d6174636820696e207479706520636f6e73747261696e742e 7689:D1,52|00802b56185629563a564b565c566d567e568f120a0001000a0056a7220c0e7b0c03000b0e0e0e0e000000002c00000000000000|@7690| 7690:S79|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e28362970726f63657373456c656d656e74283129 7691:O1|@7692 7692:D2,20|00801a13002c6942000000000c00000000000000|@7694,@7693| 7693:D2,36|00802b352c362d375637355647361a1700300e7b07030006000000001c00000000000000|@7695,@7528| 7694:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129 7695:S50|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129283129 7696:S40|456c656d656e747320696e2061206c697374206861766520646966666572656e742074797065732e 7697:S4|4974656d 7698:O1|@7699 7699:D8,140|00842f1a8a000e0e0e0c00021a85000e0e0c000203522f353036293b1a79000e0e0c0003030a2f352b2a2f0e7d0a00022f353036313733353436220c37220d38220e3932310c0002293c3434221232221733220f221622102210220d220f1a3b00221b7b1012000f3c28401a32001a33000c000428062a1a2e006a641f050e0e000000008400000000000000|@7701,I105,I218,I251,@7700,@855,I11,79992| 7700:O1|@7702 7701:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c697374283329 7702:D33,812|008d220d1a29030e0e0c00021a25030e0e0c000207dd220d35220e362a220f0e0e0c000222122a1a0e030e0e0e0c0003291afc020e0c00021af9020e0e0c000207cf293522103522113622123722133822143922153a22162306221723072218230822192309221a230a221b230b221c230c221d230d221e230e221f230f222023101ab7020c001222143c1ab2020e0e0e0c0003031022101aa9021aaa020e0e0e0c0003022f22101aa1021a9a020e0e0e0c000322153c1a96020e0e0e0c00032a2a1a83020c000329283a1a7a020e0e0e0c0003663e2a69291a54020e0c000203041a6f02103b503b50221122171a6702020223020c00032922122e22131a5b020c00053b3b3b3b2d6805291a21020202d5010e0e0c000203041a3702103b503b503b1a3a020e0e0e0c0002221b1b10272b22153b1a2c020e0c0006293b691a26022a691a25022a691a24022a692f2a691a20022a69342a693b3e3b3b2d6805291acc010e0c000203041ae701103b503b502220221c69221b0c000222243c1af6010e0e0e0c0003293c1ac3010c0003291ae8016928202a6922242a6927041ade010e0e0e0c000229221722166a642a0e0c0002642221221d221e1ac6011ac7010c000522122a0e0e0c0002643e221c69291a5b010c000203041a7701103b503b502a3b691aa4012a691aa3012a693b3b3b3b2d6805291a36010e0e0e0c000203041a4f01103b503b50293b691a84012a69312a691a80012a69342a691a7c012a69332a693b3e3c3b2d6805291a00010e0c000203041a1b01103b503b50222f3522303622313722323822333922343a223523062236230722372308223823092239230a223a230b223b230c223c230d223d230e223e230f223f23101abd000e0e0c001222282a1a16010e0e0e0c00032968013c2a2e222c6b2233382234230c2a3b3c1afe000e0e0e0c0004502b2a0e0e0c00025022383c1abd000e0e0c00031ae5002a222b223a223a223a223a223a223a223a223a223a223a223a1acd00223b0e0e7b103b000f22123c1a8a000e0e0e0c000322142a2e221422142214221422142214221422142214221422141a9b0022157b1015000f220f1f0e0e0e0e0e000000002403000000000000|@7704,I105,I218,@2004,@7468,I113,@7705,@389,@7706,@510,@1784,@3504,@7707,@2008,@2104,@1058,@1828,@1058,@1058,I106,@7703,@371,@7531,@7532,@2356,@7553,@1058,@1058,@1058,@7016,I255,@1965,@7700| 7703:O2|58,0 7704:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833296170706c794c697374283329 7705:S3|20313a 7706:S4|7320312d 7707:O1|@7708 7708:D12,308|00832c3b1a31010e0e0c000303051a2b010fd72e1a29010e0e0c00021a25010e0e0c000207da2e352f36293b1a19010e0e0c000303102a2f692e0e0e0e0c0002293b69640fcd2a2f692e0e0e0e0c000230282c1af2000e0e0e0c000303033c024230283b1ae1000e0e0c000303033c0232301ad7001ad0000e0c000303033c0222301abb000c00021ab9000e0e0c00020310303b1ab5003b3f1ab4000e0c000602013b1a9e000e0e0e0c00023c2a3b6a291a8c000e0c000203041a9700103b503e3369291a79000e0e0c000203041a8300103b50293b692b2a692e2a693b3b3b3b2d6805291a580002023a000e0c000203041a5f00103b50220d3c1a5a00020223000e0e0e0c00033222102b22101a4b0002020d000c00051a45002a692c2a69270b6502013b1f04000000002c01000000000000|@7709,I232,@1975,I105,I218,I251,I48,I154,@1784,I107,@7707,@1058| 7709:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833297072696e744c697374283429 7710:O1|@7711 7711:D13,276|008a220c1a11010e0e0c00021a0d010e0e0c000207da220c35220d362a352b362c3829220c220c220c220c220c2215221522152215221a0e0e0c000b2b3b2b1ade000e0e0e0c0004502c291ad6000e0e0e0c0002293c1acf000c00036403033c024a291abe000e0e0e0c00023b2a1abb000c00036403041ab600103b503b50291a95000e0e0c0002030329020b293f1aa2000e0e0e0c00032928301a9a000e0e0e0c0003641a74000e0c00020303290221291a6f000c0002293c1a7f000c00032b3c2b1a7a000e0e0e0c00046525011e853b64292b692f22142214221422142214221422142214221422141a560002020d000e0e0e0c000c2a2a69270902013b1f0b0e0e0e0e0e0e000000000c01000000000000|@7712,I105,I218,I255,I223,I232,I231,@337,I252,I251,I107,@6192,@7710| 7712:S74|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e2836296d61704c6162656c73283129 7713:O1|@7714 7714:D4,100|008a220c1a61000e0e0c00021a5d000e0e0c0002033d220c35220d362a3232323232221222122212221222170e0c000b2a220f220f220f220f220f220f220f220f220f220f1a28000e0c000c2a2a69270402013b1f0b0e0e000000005c00000000000000|@1785,I105,I218,@7713| 7715:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7716:S11|436f6e7374727563746f72 7717:O1|@7718 7718:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 7719:S21|206973206e6f74206120636f6e7374727563746f72 7720:S46|436f6e7374727563746f7220696e2061207061747465726e20776173206e6f7420616e206964656e746966696572 7721:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7722:S49|4964656e746966696572206265666f72652060617327206d757374206e6f74206265206120636f6e7374727563746f722e 7723:O1|@7724 7724:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 7725:S51|436f6e7374727563746f72206d757374206265206170706c69656420746f20616e20617267756d656e74207061747465726e2e 7726:D15,404|00842f1a92011a93010c000303033c02222f1a8b010c00021a89010e0e0c000203102f3b1a71013b28081a7b010c000602013b03033c0fd72f1a70011a5d010e0e0c000303033c02222f1a53010c00021a51010e0e0c000203102f3b1a4d013b28091a43010c000602013b03033c0fcd2f1a3c011a25010e0e0c000303033c02222f1a1b010c00021a19010e0e0c000203102f3b1a19013b28071a0b010c000602013b03033c02b22f1a08011aed000e0e0c000303033c02222f1ae3000c00021ae1000e0e0c000203102f3b1ae5003b28061ad3000c000602013b03033c027a2f1ad4001ab5000e0e0c000303033c02262f1aab000c00021aa9000e0e0c000203142f3b1ab1003b28071a9b00020249000c000602013b03033c023e2b033a2f1a99001a76000e0e0e0c000303033c02262f1a6b000c00021a690002021b000e0e0c000203102f3b1a71003b28061a57000c000602013b02013b03281a6100301a61000e0e0c0003291a5c001a55000e0e0c00032f3c32312d1a5000320e0e7b070900063b1f050e000000008c01000000000000|@7728,@727,I251,I105,I218,I154,@945,@1055,@1063,@1177,@6692,@7729,@389,@7727,@7465| 7727:S12|2220697320696c6c6567616c 7728:S48|54595045434845434b5f50415253455452454528292e7061737332283529636865636b466f724275696c74496e283529 7729:S25|526562696e64696e67206f722073706563696679696e672022 7730:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7731:O1|@7735 7732:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229626f6479456e762d283129 7733:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 7734:S57|54595045434845434b5f50415253455452454528292e7061737332283529737472696e67734f665365617263684c6973742834295f2d283129 7735:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7731| 7736:O1|@7737 7737:D2,20|00801a13002c6942000000000c00000000000000|@7739,@7738| 7738:D2,36|00802b352c362d375637355647361a1700300e7b07030006000000001c00000000000000|@7741,@7740| 7739:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129 7740:O1|@7742 7741:S52|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129283129 7742:D15,268|00842c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2212230f221323101ad6000e0e0e0c00123e3169291acd000e0e0c000203041ac700103b503b50303531362c3c1abd000e0e0c00032a2a1ab7000c00032e3c1aab000c00032d2a1aa7000c0003293b691aa2002a691aa1002a691aa0002a692f2a693b3b3b3b2d6805291a78000e0c000203041a7300103b503b503b1a82000e0e0e0c000222131b10272b22143b1a74000e0c0006293b691a6e002a691a6d002a691a6c002a692f2a691a68002a6922142a693b3e3b3b2d6805291a27000c000203041a2300103b503b502927181f050e000000000401000000000000|@7743,@7468,I105,@1784,I107,@7016,@1058,@7136,@1058,@2008,@2104,@1058,@1828,@1058,@1058| 7743:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283529 7744:S37|436c617573657320696e2063617365206861766520646966666572656e742074797065732e 7745:S6|436c61757365 7746:S6|5768696c653a 7747:O2|3,@7748 7748:S55|4c6f6f7020636f6e646974696f6e206f66207768696c652d65787072657373696f6e206d7573742068617665207479706520626f6f6c2e 7749:D2,60|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a1a00220e0e0e0e7b0e03000d000000003400000000000000|@7562,@7561| 7750:S40|436c617573657320696e2068616e646c6572206861766520646966666572656e742074797065732e 7751:O5|5,0,@745,@748,0 7752:S6|52616973653a 7753:O2|3,@7754 7754:S42|457863657074696f6e20746f20626520726169736564206d757374206861766520747970652065786e2e 7755:D4,44|00822d1a2a001a2b000c000356173c56382f2d1a2200317b070600060e0e0e0e000000002400000000000000|@7756,@7256,@389,@7465| 7756:S66|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296d657373466e283329 7757:O1|@7758 7758:D19,428|00842f35303631373239333a2b1aa0010e0c00021a9d010e0e0c0002031f2b35291a9401220c220c220f6b220c1a8c010e0c00043d2a1a87016a6502031a80013b2c693423103b2a0e0c00023d2a69293b692d2a693035280e1a68010e0c000303b9303629352a362b372c382d39221723062218230d2a2a691a4c01221a221a306b1a47012b332c1a45010e0e0c000529382a36293b1a2b010c000303043b5002282828220c1a2b010c0003291a28011a21010e0e0c0003221f3c2220220d2d1a19010e0e0c00062603333b2d1a10010e0c000450323b2c1a05010e0e0c000450221e2309313b2b1af5000e0e0c0004503c28403b1aec000e0c00043c28401ae6001adf000c00043d2b2b6a221c3b2b3122153b3b680727110241303528081aa2000e0e0e0c000303043b5002041abb00103b503c28403b1aa9000e0e0c00043c28401aa2001a9b000c00043d2b2b6a220e3b2b220c303b3b680766343b2b1a7e000e0e0e0c000450220c336922100e0e0c000250220c2212341a73000c000450220c22112213220c3c1a67000c000650221237220d2b692a22110e7d15000200000000a401000000000000|@7760,I105,I218,@7761,@7665,@7751,I251,@7763,@7764,@7473,@389,@7765,@7465,I255,I11,@2364,@7759,@6407,@7574| 7759:O4|@35,@863,@7767,@7766 7760:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f63657373457863657074696f6e283129 7761:D3,52|0082560923085619230d2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@7762,@7577| 7762:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7763:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7764:S9|457863657074696f6e 7765:S22|29206973206e6f7420616e20657863657074696f6e2e 7766:O5|@7457,1271,0,1271,0 7767:S41|70726f63657373457863657074696f6e3a206261646c792d666f726d65642070617273652d74726565 7768:O1|@7769 7769:D17,564|00812b230d29291a2e020e0e0e0c00021a29020e0e0c0002032429352a362a35291a1c021a1d020e0e0c00036403052a68010207292503511e323b6502013b64293b1aff010c000303691afb01291ae7010c00021ae5010e0e0c0002032429352a362a35291ad8011ad9010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1abb010c000303041abb01103b50293529351aa5011aa6010e0e0e0c000303043b5002041aa30110293765021a293529351a86011a87010c000303043b5002041a870110293764293d1a82010e0e0e0c000303ad2f1a7a010e0e0e0c000229293528061a58010e0c000303033c0287293528051a48010e0c0003036129362a382937293629353d1a34010e0c000303482b37293629353d1a24010e0c000303043b5002041a2f011029362a372a311a29010e0e0c00031a25012a690402002c2b2b1a1e010e0e0e0c00045029352707250526041e743b02013b2704021929353e1adb000c0003030d2936293b1acf000c00036402013b6503033b02031ae7000299293c1ac8000e0c0003038d2f1ac2000e0e0e0c000229293528051aa0000e0c0003036129362a382937293629353d1a8c000e0c000303482b37293629353d1a7c000e0c000303043b5002041a87001029362a372a311a81000e0e0c00031a89002a690402002c2b2b1a76000e0e0e0c00045029352707250526041e643b02013b2704020929353d1a33000c00036503051a5a0002013b02013b66430e0e0e0e0e0e000000002c02000000000000|@7771,I105,I218,@107,I251,@2900,@2955,@1840,I113,@1955,@2248,@2251,@7772,@2071,@7773,@7775,@7770| 7770:O1|@7776 7771:S27|545950455f5452454528292e636865636b44697363617264283229 7772:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 7773:O1|@7774 7774:S36|41206e6f6e20756e69742076616c7565206973206265696e67206469736361726465642e 7775:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 7776:S36|412066756e6374696f6e2076616c7565206973206265696e67206469736361726465642e 7777:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7778:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7779:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7780:D6,92|00803c28403b1a57000c00041a55002a6956280e0e0c00022a3b1a4b000c0003563723093b2a0e0e0e0c000264293b1a3a000e0e0e0c000303032a020b2a2a1a2e00310e7e0700032704420e0e0e0e0e000000005400000000000000|@7782,I11,@7783,I253,I251,@7781| 7781:O1|@7784 7782:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296c6f63616c456e762d283129 7783:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 7784:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7781| 7785:O1|@7786 7786:D1,20|00803b420e0e0e0e000000000c00000000000000|@7782| 7787:D3,68|00802b3656193b1a3e000e0e0e0c00032a2a6956393b2b1a32000e0e0e0c0004502e56480e0c0002505637372f2a300e7d0700020e0e0e0e000000003c00000000000000|@7788,I253,I255| 7788:S68|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229626f6479456e762d283129 7789:D1,36|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@7788| 7790:D1,36|00802b56180c0002505607230a2c2a2d7d0400020e0e0e0e000000001c00000000000000|@7788| 7791:D2,60|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a1a00220e0e0e0e7b0e03000d000000003400000000000000|@7562,@7561| 7792:S46|436c617573657320696e20666e2065787072657373696f6e206861766520646966666572656e742074797065732e 7793:D3,52|0082560923085619230d2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@7794,@7577| 7794:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7795:D1,68|00802b56185629563a564b565c566d567e568f120a0001000a00120b0001000b00120c0001000c0056c7220e0e0e0e7b0e03000d0e0e0e0e000000003c00000000000000|@7796| 7796:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283129283129 7797:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7798:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7799:O1|@7800 7800:D5,76|00842f1a4a000e0e0e0c00021a45000e0e0c000203252f3530362a313131311a36000e0e0e0c00062a323232321a2c000e0c00062a2a69270402013b1f050e0e000000004400000000000000|@1785,I105,I218,@7801,@7799| 7801:O1|@7802 7802:D5,100|00842f353036313732381a5b0032346a2a1a58002b1a58000e0c00042c353b1a52000e0e0e0c000303192c36333b1a43000c000303032d020733353f2b2b6a646402012c2f2f2b2d220d3b3b680727071f050e0e0e0e0e0e000000005c00000000000000|@7804,@7805,@7803,@1914,I251| 7803:O1|@7807 7804:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129 7805:D3,140|00802b37293629353c1a84000e0c0003031156283629353c1a75000e0e0c00036402013b6403152936293656383629362b2a1a5b000c000327040239293629353b1a4c000e0c0003031156283629353b1a3d000e0e0c00036402013b6403152936293856383629382b2a1a27000c0003270402013b640304560702012b420e0e000000008400000000000000|@7806,I251,I113| 7806:S91|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f707954797065436f6e73283129 7807:D1,20|00802b420e0e0e0e000000000c00000000000000|@7808| 7808:S89|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f7079547970283129283129 7809:O1|@7810 7810:D24,764|008e1afb0234346a0403002a2a1af4020e0c00035029362a372212220d220d22112e1ae3020c00062211220c2c221222121ad8020e0c000622122a2a1ad1020e0e0c00021acd020e0e0c00020314291abe020e0e0e0c00021ab9020e0e0c000202013b039d2a352b362b352c362c352d362e392f23062c2b1a9d026a3b2c69221c23103b2a0c00023d2a69293b692d2a6930220d693b3b2b3322230e0e0c0005220c2c2b6a293b69220d3b2b1a6d020e0e0c0004502d1a57020c00021a55020e0e0c00020304220c02031a5302220f22272b1a4f020c000450220f2b69221a0e0e0c00025022223822102c692a0c000251221222112516251626141ec03b271402013b651a2102221222126a0403002a2a1af0010e0c00035029352a362b370403003b2a1a05020e0e0c00035029362a37221d34221b2218220f221d332223321aed010e0e0c000a2922161ae6010e0e0e0c0003221e1abb010c0002030c221737310e0e0e0c00020fd30403003b2a1aba010e0e0e0c00035029352a362b371ab601221c2c6a221c23061aaf012a220d2e6b1aab01221f2210316b1aa6012220220d6a222023081a9e012a220e6a2222392223230d22243a2225230b2226230c2227352228230a222936222a23072c2b2211220e220c3422133022112215220c221022102214680e22361a5f012a1a1f010c00021a1d010e0e0c0002032c2a352b362a35222d22343022372d223a22382237223622380e0e0e0c000a2b2a2506250626041e37260402005122211a20010e0c000222323b2b1ae1000202a6000e0e0c0004502222291ac5000e0e0c00021ac1000e0e0c0002038529352a362a37293629353c1aec000e0c0003030d2938293c1adf000c00036402013b64031329362936293b3b1a93000c0004503b26030242293629353b1aba000e0e0e0c00030311293729353c1aaa000e0e0e0c00036402013b6403043b5002041a9a00103b50293629372936293b3b1a4f000c0004503b26042a250426031e92260302023b50503b27161a640027121f0f0e0e0e0e00000000f402000000000000|@7812,@7813,@6494,@7815,@7820,I105,I218,I48,I255,@6406,@6407,@7825,@6351,@7827,@7844,@7920,@7922,@7923,@7931,@7933,@1965,@7934,I251,@7811| 7811:O4|@35,@863,@7937,@7936 7812:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629 7813:D8,100|00822b35293629291a5d000e0e0c00021a59000e0e0c0002031e29352a362a353b1a4c000e0c000303042a360207292503511e2b3b6502031a390064301a38001a39000e0e0c000356473c56682d2d1a2e00347b07090006000000005c00000000000000|@7814,I105,I218,I251,@6406,@7256,@389,@7465| 7814:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836296d657373466e283329 7815:O1|@7816 7816:D5,76|00842f1a4a000e0e0e0c00021a45000e0e0c000203252f3530362a313131311a36000e0e0e0c00062a323232321a2c000e0c00062a2a69270402013b1f050e0e000000004400000000000000|@1785,I105,I218,@7817,@7815| 7817:O1|@7818 7818:D13,260|00842f3530363139323a2c2b1af9006a3b2b291af6000e0e0e0c00021af1000e0e0c0002031729362b3c1ae7000c0003292b25042504511e253b6502012a65343b1ad4000e0c000303112b1ace00693b3c2b2e220f0c00056402343c28401abf001ac0000e0c00043c28401aba001ab3000c00043d2b2b6a3c28403b1aa5000e0e0c00043c2a2f3c6b2b2a316a27053b2e693423103b2a0e0e0c00023d2a69293b692d2a69220c2a316a293b69220d3b2b1a78000e0c0004502a3b692c1a4c000e0c00021a49000e0e0c00020304220d02031a5b00221022152b1a57000c00045022102b6922140e0e0c0002502c27111f050e0e0e0e0e0e00000000fc00000000000000|@7819,I48,I105,I218,I106,I113,@855,-1,I11,@2364,I255,@6406,@6407| 7819:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629656e74657254636f6e283129 7820:O1|@7821 7821:D7,116|00842f1a72000e0e0e0c00021a6d000e0e0c000203492f3530362a37291a58000e0c00021a55000e0e0c000203192935291a4c00333333220e6805321a45000e0e0c00046402031a3e002b333333331a3a000e0e0e0c00062a2a69270502013b1f050e0e0e0e0e0e000000006c00000000000000|@1785,I105,I218,@7822,@7665,@855,@7820| 7822:D4,60|0082560a23081a37002a56376a562a230d2a2a691a2d0056585669336b2a332b1a25000e0e0c0004312a35452706440e000000003400000000000000|@7578,@7824,@7823,@7577| 7823:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7824:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7825:D8,100|00822b3929291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@7814,I105,I218,I251,@6406,@7826,@389,@7465| 7826:S52|2068617320616c7265616479206265656e2075736564206173206120636f6e7374727563746f7220696e20746869732074797065 7827:O1|@7828 7828:D5,124|0088331a7a000e0e0e0c00021a75000e0e0c00020314321a66000e0e0e0c00021a61000e0e0c000202013b033e333534363435220c362c2b220e220e220e220e220e220e220e1a3f000c000a2c2b220f220f220f220f220f220f220f1a2d000e0e0c000a2a2a69270602013b1f090e0e000000007400000000000000|@3711,I105,I218,@7829,@7827| 7829:O1|@7830 7830:D9,220|008833353436220c37220d39220e3a3b2c291acb000c00021ac9000e0e0c0002031729362b3c1abf000c0003292b25042504511e223b6502012a652a1aad000e0e0c00023b2d69221023103b2a0c00023d2a69293b692d2a69280530220e22192d6805341a89001a8a000e0e0e0c00032922172217221a22182f220f221a1a77000c000922192a692214032322102a6922140e0e0e0c000250221838221b3b6922122a69642a0e0e0e0c000251020e22183822112b692a0e0e0c000251220f3b2b1a38000e0c0004502927111f090e0e00000000d400000000000000|@7832,I105,I218,I106,@7833,@7835,@1982,@7831,I255| 7831:O1|@7840 7832:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e73747273283229 7833:O1|@7834 7834:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@7833| 7835:O1|@7836 7836:D2,20|00801a13002c6942000000000c00000000000000|@7838,@7837| 7837:D2,36|00802b37561737292b1a1c002f0e0e0e7e0500030e0e0e0e000000001c00000000000000|@7839,I27| 7838:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129 7839:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129283129 7840:D11,268|0087321a0a010e0e0e0c00021a05010e0e0c000207d3323533362a352b362c370402002b1ae9000e0e0c00021ae5000e0e0c000203282b35291adc0022102210221022146805220f1ad1000e0e0c00043d2a220e6a2c2a453b46260402062934453c465029352a363b2f69220f23103b2a0c00023d2a69293b692d2a693c28401a9d001a9e000e0e0e0c00043c28401a96001a8f000c00043d2b2b6a32221569220d2a2c220e313b3b6807220e221a22121a78000e0c0004220f221a221c22143c1a6c000e0c000622102c6922180e0e0e0c00022214221f221f221f221f221f221f221f1a4d0002020c000e0e0c00092d2a69271702013b1f080e0e0e0e0e0e000000000401000000000000|@1785,I105,I218,@7841,@7665,-1,I11,@2364,@6407,@7574,@7831| 7841:D4,60|0082560a23081a37002a56376a562a230d2a2a691a2d0056585669336b2a332b1a25000e0e0c0004312a35452706440e000000003400000000000000|@7578,@7843,@7842,@7577| 7842:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7843:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7844:O3|@7845,@2237,@157 7845:D13,316|00813c28403b1a37010c0004293b1a33015648691a31010e0e0c0004500402001a29012a1a29010e0e0c00035029352a361a20012b5667322d680531291a18010e0c00021a15010e0e0c0002031829352a362a2e301a08010e0c000450292503511e255102023b505031291aea000e0e0e0c00021ae5000e0e0c000203ab29352a362a352937292f0e0c0002293c1ad3000c000303043b5002832a1aca0069320e0c0002502b37293629353c1ab5000e0e0c0003030d2938293c1aa7000c00036402013b64031329362936293b3c1a77000c0004503b26030242293629353b1a82000e0e0e0c00030311293729353c1a72000e0e0e0c00036402013b6403043b5002041a6600103b50293629372936293b3c1a33000c0004503b2604502c250626051eb83b270502013b2706430e0e0e000000003401000000000000|@7847,I11,@7848,I255,@7870,@7873,@7883,I105,I218,@7846,I251,@731,@7811| 7846:O1|@7895 7847:S40|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229 7848:D18,532|00802b363c1a10020e0c000303051a0b020fde2b3529353b1a05020e0e0c00036407db2b3529362d363c1af7010c00032a2a691af2013b1af2010e0e0e0c00031aed012a0e0c0002642a2a0e0e0c00026429353b1ac9010e0e0c000303952939291ad0010e0c00021acd010e0e0c0002035f29361abd010e0e0c00021ab9010e0e0c000203482935353e1a93010c000303312935362928281a85010e0e0c000303033c021b29287b1a75010e0e0c000303033c020b29285b1a65010e0e0c00036402013b1a71010e0e0c000202013b02013b03192a1a6401691a64012a691a63012a693b3e3c3b2d68056602012a6402030d0129293b691a4e012a69020210001a49012a693b3c3b3b2d680527090fdb2b363c1a02010e0e0e0c000303051a2f0102dd2b3529362d363c1af7000c00032a2a6956473b1af3000c00032a2a0e0e0e0c00026429353b1ad5000e0e0c000303932939291adc000e0c00021ad9000e0e0c0002035f29361ac9000e0e0c00021ac5000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1a7d000e0e0c000202013b02013b03192a1a7000691a70002a691a6f002a693b3e3c3b2d68056602012a64020129293b69020213001a64002a691a63002a693b3c3b3b2d68052709420e0e0e0e0e0e0e000000000c02000000000000|@7850,I234,@2016,I251,I107,@155,I253,@7851,I105,I218,@1087,@1088,@1060,@1058,@7857,@2016,@1058,@7849| 7849:O5|0,0,0,@7865,@7864 7850:S11|7072696e742d7374617465 7851:O4|0,@7852,3,1 7852:O1|@7853 7853:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@7854,@158,I253| 7854:S19|7072696e742d74797065436f6e737472536574 7855:O1|@7856 7856:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 7857:O5|0,0,0,@7859,@7858 7858:O2|@7862,0 7859:O2|@7860,0 7860:O2|0,@7861 7861:O5|@1964,1679,1679,0,0 7862:O2|3,@7863 7863:S7|4e6f745365656e 7864:O2|@7868,0 7865:O2|@7866,0 7866:O2|0,@7867 7867:O5|@1964,1678,1678,0,0 7868:O2|3,@7869 7869:S9|50726f636573736564 7870:O1|@7871 7871:D3,132|00812c3629353c1a7e000e0e0e0c000303112c3629353c1a6e000e0e0e0c00036402013b6403152c3629362d3629362b2a1a5400310e0e0e7e0800032c3629353b1a44000e0c000303112c3629353b1a36000e0e0e0c00036402013b6403152c3629382d3629382b2a1a2000310e0e0e7e0800033b430e0e000000007c00000000000000|@7872,I251,I113| 7872:S26|5554494c49544945535f28292e6d61705461626c652831292d45 7873:O1|@7874 7874:D4,44|00813c28403b1a27000c00041a25002a2f6a1a23002f2c6a2e2b452a4666430e000000002400000000000000|@7876,I11,@7877,@7875| 7875:D4,84|008056083b1a50000e0c000329291a4b000c00021a49000e0e0c0002032529352a362a352b362a3256870e0e0e0c0003030529680102082b250526041e2f3b270402013b65420e0e000000004c00000000000000|@7882,I253,I105,I218| 7876:S24|5554494c49544945535f28292e6d61705461626c65283129 7877:D6,116|00802b3556173b1a6e000e0e0e0c000329291a67000c00021a65000e0e0c0002031e29352a362a35292f56880e0c00036403033c0207292503511e293b6502013b64030e2956382c1a39000e0e0c00040201292e2a6956473b2b1a2b000c0004503b2704420e0e0e000000006c00000000000000|@7879,I253,I105,I218,@7878,I255| 7878:O1|@7880 7879:S32|5554494c49544945535f28292e6d61705461626c65283129656e746572283129 7880:D4,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203252d352e362a35292f310e0e0c000364030329020e292f2f1a28000e0c00042b2a69646502013b440e0e0e000000004400000000000000|@7881,I105,I218,@7878| 7881:S35|5554494c49544945535f28292e6d61705461626c6528312964656c6574652832292829 7882:S33|5554494c49544945535f28292e6d61705461626c652831296c6f6f6b7570283129 7883:D10,404|00802b561a0c0002293b1a8b010c0003032c2c3629353b1a7e010e0e0e0c0003031629382956490e0e0c000203033d02013c3c2a696502031a6101640202293529353c1a52010e0e0e0c0003031a29353c1a44010e0c000303043b5002041a3f01103b5029360fcc2d1a38016956370e0e0c00022a353b1a1e010e0e0e0c000303043b5002041a1f01103b502a36293d2a1a18010e0c00021a15010e0e0c000203c02a352b362b3c1aed000e0e0c000303033c029f2a362c2a291aef000c00021aed000e0e0c0002038829352a362a3829353d1ac2000e0e0e0c0003641ad0000e0c0002030c2c2a25042504511e343b025d2a3829353d1a9e000e0e0e0c000303043b5002041aab00103b5029362922101aa400121300010002000e0e0c0004293c1a73000c000303033c0221293b1a660002024d000e0e0e0c000303033b02012f292e2508250826061e913b64666502012a662a2a2505250526031ecc3b6602012965293b1a2f000c000303032c02033c2a69312a696456670e0e0e0c000250296665420e0e0e000000008c01000000000000|@7885,I251,@7886,@7887,@741,@7889,I105,I218,@7891,@7884| 7884:O1|@7893 7885:S54|545950455f5452454528292e636f6d707574654461746174797065457175616c697469657328322967656e457175616c697479283129 7886:O2|1,1 7887:O4|101,@2083,0,@7888 7888:O5|@1964,1687,0,1687,0 7889:O4|101,@2083,0,@7890 7890:O5|@1964,1688,0,1688,0 7891:O4|101,@2083,0,@7892 7892:O5|@1964,93,0,93,0 7893:D1,20|00803d420e0e0e0e000000000c00000000000000|@7894| 7894:S57|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229636f6e737472457128332965712d283129 7895:D10,476|00822d3529372e0e0e0c0002291ad0010e0c00021acd010e0e0c000207ca293529353b1ac2010e0e0e0c000303043b5002041ab701103b502936312a692d37293629353d1aa1010e0e0c000303041a9f01103b503b5029353b1a8c010e0c00030322293729353c1a7e010e0e0e0c0003030d2936293b1a7b010c0003640202293664020d2936293b1a69010e0e0c0003646503033c027c2a1a45010e0e0c00021a41010e0e0c000203043b5002041a4701103b502a3529352937293629353d1a26010e0e0e0c000303041a2301103b503b5029353b1a10010e0c00030326293729353c1a02010202d4000e0e0e0c0003030d2936293b1afb000c0003640202293664020d2936293b1ae9000e0e0c000364270403a329291ac6000e0e0e0c00021ac1000e0e0c0002038929352a362a352937293629353c1aae000e0e0e0c0003030d2938293c1a9f000c00036402013b64031329362936293b3c1a9f000c0004503b26030242293629353b1a7a000e0e0e0c00030311293729353c1a6a000e0e0e0c00036402013b6403043b5002041a6e00103b50293629372936293b3c1a5b000c0004503b26042b250526041e97260402023b505002023b50296602032f3b692b373b2b692a2a69652f2f7d08000200000000d401000000000000|@7896,I105,I218,I251,@7889,@2039,I253,@2229,I255,@7811| 7896:S43|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229283129 7897:O1|@7898 7898:D9,116|00802b363c1a70000e0c000303051a6b0002532b35293b1a66000e0e0e0c00036403051a5e00023e2b363c1a4a000e0e0e0c000303051a4f00022b2b35293c1a3e000e0e0e0c00036403051a3e0002162b363c1a22000e0e0e0c000303051a2f0002031a2e00420e000000006c00000000000000|@4333,I234,@2016,I251,@7900,@2016,@7907,@2016,@7899| 7899:O5|0,0,0,@7915,@7914 7900:O5|0,0,0,@7902,@7901 7901:O2|@7905,0 7902:O2|@7903,0 7903:O2|0,@7904 7904:O5|@1964,1577,1577,0,0 7905:O2|3,@7906 7906:S5|4d61796265 7907:O5|0,0,0,@7909,@7908 7908:O2|@7912,0 7909:O2|@7910,0 7910:O2|0,@7911 7911:O5|@1964,1576,1576,0,0 7912:O2|3,@7913 7913:S2|4e6f 7914:O2|@7918,0 7915:O2|@7916,0 7916:O2|0,@7917 7917:O5|@1964,1575,1575,0,0 7918:O2|3,@7919 7919:S3|596573 7920:D1,36|00802b56180c0002505607372c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@7921| 7921:S80|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657256616c466e283129 7922:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 7923:D8,148|00803c28403b1a8f000c00041a8d002a6956290e0e0c00022a3b1a83000c00033c28403b1a71000e0e0c00041a75002a6956580e0e0c00022a3b1a63000c0003566723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4a000e0e0e0c0003293b1a3b000c000303032e020b2e2a1a3600220c7e0b00032708420e0e0e0e0e000000008c00000000000000|@7925,I11,@7926,I253,@7927,I251,@7928,@7924| 7924:O1|@7930 7925:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d616c6c56616c4e616d6573283129 7926:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 7927:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 7928:O1|@7929 7929:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7928| 7930:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7924| 7931:D1,36|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@7932| 7932:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657254797065466e283129 7933:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 7934:O1|@7935 7935:D7,140|00802b1a8a000e0e0e0c00021a85000e0e0c000203652b352c362a37293629353d1a74000e0c000303041a6f00103b5029353b1a62000e0e0e0c00030322293729353c1a52000e0e0e0c0003030d2936293b1a4b000c0003640202293664020d2936293b1a39000e0e0c0003642c1a33000c00022a2a69270602013b420e0e0e000000008400000000000000|@1785,I105,I218,I251,@2039,I253,@7934| 7936:O5|@2042,352,0,352,0 7937:S41|736574457175616c6974793a2063616e27742073657420657175616c69747920617474726962757465 7938:D8,100|00822b3629291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@7756,I105,I218,I251,@6406,@7256,@389,@7465| 7939:O1|@7940 7940:D7,108|00832e1a6a000e0e0e0c00021a65000e0e0c000203412e352f362a37291a50000e0c00021a4d000e0e0c000203152935291a44003232220c6b321a3f000c00046402031a3a002b3232321a37000c00052a2a69270502013b1f040e0e0e0e0e0e000000006400000000000000|@1785,I105,I218,@7941,@7665,@855,@7939| 7941:D3,52|0082560923085619230d2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@7942,@7577| 7942:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7943:O1|@7944 7944:D8,364|0085303531363239333a3423063b2c693423103b2a0c00023d2a69293b692d2a69221135293c1a47010c000364031d33321a40016a301a3f0169323b2b2d22150e0c0005220d2d2b6a6602d922113528051a1c010e0c000303962211362212382a322a3b1a09010e0e0c0003030c293b1afd000e0e0c0003024f2a352b362b1afa000e0e0e0c00021af5000e0e0c000203352b352c362c3528061ad3000c000303112c362b352a2a1ac5000e0e0c00036502013b030d2b2a2506250626041e5c3b02013b6502013b65651ab3000c000203033b02182937293629353d1a91000e0e0c000303033b02032a6801656502013b293b1a7a000e0e0e0c0003031e34331a71006a31221469333b2b2d22160e0e0e0c0005220e2e2b6a6602082935220c2c2b6a6464342212341a58000e0c000450342a6922100e0e0e0c000250293b69343b2b1a42000e0e0e0c000450220f382b3b69220e2a69642a22110e7d160002000000006401000000000000|@7945,I251,I48,@855,I105,I218,@6407,I255| 7945:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f6365737354797065283229 7946:O1|@7947 7947:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7948:O1|@7949 7949:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7950:O1|@7951 7951:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 7952:O1|@7953 7953:D8,148|00832e1a92000e0e0e0c00021a8d000e0e0c000203692e352f362a352b3731230d1a7c0032322d6b1a79002b2e2c1a77000c0005293b1a73000c000303033b02092935292e6929680165293b1a5d000e0e0c000303122f220d220d220d1a5000220e0e7b060e0005293530220e220e220e1a3c000e0c00052a2a69270a02013b1f040e0e0e0e0e0e000000008c00000000000000|@4262,I105,I218,@7954,@7351,@7477,I251,@7952| 7954:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 7955:O1|@7956 7956:D9,212|008530353137323829291acb000c00021ac9000e0e0c0002031f29352a362a353b1abc000e0c000303052a68010207292503511e2a3b6502013b64291a99000e0e0c00021a95000e0e0c00020311293529353b1a8a000e0e0e0c00036402013b0315293529363e2a693c220e69293b692b2a69270502073c3469293b69641a630033220c220f2d68051a5c00343422102e68051a5600220c3422112f6805292c2c6a31282e1a48000e0c0003313532392a2d2b3c2f2e3b1a3a000e0e0e0c00083b270d1f060e0e0e00000000cc00000000000000|@7958,I105,I218,I251,@7959,@7963,@7957,@389,@7585| 7957:D3,60|00802b352c36295639564a1a32000e0e0e0c000456382c2b1a29000e0e0c0004505637372c2b692a300e0e0e7d070002000000003400000000000000|@7961,@7493,@1862| 7958:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e7472696573283229 7959:D3,68|00802b352c3629352a36295659566a1a36000e0e0e0c00042b2a6956682f2b1a2a000e0e0e0c0004505667382f2b692a330e0e0e7d0a0002000000003c00000000000000|@7961,@7960,@1862| 7960:O1|@7962 7961:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e74726965732832295f2d283129 7962:D5,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e362a2f2f1a38000e0c00042a30301a32000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@7493,@7960| 7963:D3,60|00802b352c36295639564a1a32000e0e0e0c000456382c2b1a29000e0e0c0004505637230a2c2b692a300e0e7d070002000000003400000000000000|@7961,@7964,@1862| 7964:O1|@7965 7965:D4,132|00822d352e362f3730382b353c1a78000e0c000303262b363c2a692b3b1a68000e0c0003030331020b312c1a5e000e0e0e0c00032f2b2f2c6b6602352b353b1a46000e0e0e0c000303262b363f2a336a2b3b1a33000c0003030331020b312c1a2e000e0e0e0c00032f2b2f2c6b660201312704440e0e0e0e000000007c00000000000000|@7967,I251,@7968,@7966| 7966:O1|@7970 7967:S35|5354525543545f56414c5328292e6d616b6553656c6563746564537472756374283329 7968:O1|@7969 7969:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7968| 7970:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@7966| 7971:O1|@7972 7972:D1,20|00822c2c69440e0e000000000c00000000000000|@7973| 7973:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229283329 7974:O1|@7975 7975:D1,20|00822c2c69440e0e000000000c00000000000000|@7973| 7976:O1|@7977 7977:D1,20|00822c2c69440e0e000000000c00000000000000|@7973| 7978:O1|@7979 7979:D17,412|008d343c1a99010e0e0c0003220f351a92012b692a0c000264220f351a8901220e2d6a2a0e0c0002641a8001220d220d6a0403002a2a1a77010c00035029352a362b372217291a6b010c00021a69010e0e0c0002031d29352a362a2215220c2216311a57010c000650292503511e283b6502013b642218291a39010e0e0c00021a35010e0e0c0002033529352a362a221b221b2218220f2218221c221b220c220f221c221c221c221c221c222a1a10010e0c001150292503511e423b6502013b642219291aed000e0e0c00021ae9000e0e0c000203af29352a362a37293b1ae3000c000329352a382b392c23062a291ac2000e0e0e0c00021abd000e0e0c0002031e29352a362a353b1abc000e0c000303042a360207292503511e2c3b6502031aa900641aa900221d221f6a2d22153c22212e2e22221a9b000c0008502b3b1a86000e0e0e0c000303041a8b00103b503b502b35293b3b1a82000e0e0e0c0004502220373032692a0e0c000251313b321a69000e0e0c00045032250c260b1ebb3b270b02013b270b1f0e0e0e0e0e0e0e000000009401000000000000|@7981,I106,@7982,@7987,@7993,@6494,I105,I218,@7995,@8002,I253,I251,@6406,@8049,@7980,@2309,I255| 7980:O12|@8051,@2104,@31,@769,@71,@2189,@73,@2199,@75,@2207,@36,@777 7981:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e283429 7982:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@7984,@7983| 7983:O1|@7985 7984:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283129 7985:D13,204|00822c352d3628062b2b6a651ac1000e0e0c0002293528061ab9000e0e0c000303043b5002041aaf00103b5029362a37293f1aa7000c0003293b1a97000c0003641a9c000e0c00022a3c1a8f000c0003293b1a7f000c0003641a84000e0c00023c28401a7e001a7f000c0004311a7c000e0c00020303310207311a73000c0002293e1a6f000c00032d03033f02013b2a2a1a64000e0c0003293d1a5b000c000329301a53000c00032806302b6a343b2b1a49000e0e0c0004503b270d440e0e0e00000000c400000000000000|@7986,@1955,I251,@2080,I243,I218,@855,I11,I105,I152,I245,I242,I255| 7986:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283229 7987:D2,36|00802b352c36562756381a1b002f0e7b060300050e0e0e0e000000001c00000000000000|@7984,@7988| 7988:O1|@7989 7989:D14,244|00832c230c2f2a0e0e0c000264293b1ae6000e0e0e0c000303bc2e352f3628062b2b6a651ad5000e0e0c0002293528061ac5000e0e0c000303043b5002041abf00103b5029362a37293f1ab7000c0003293b1aa3000c0003641aac000e0c00022a3c1a9f000c0003293b1a8b000c0003641a94000e0c00023c28401a8e001a8f000c0004321a8c000e0c00020303320207321a83000c0002293e1a7f000c00032d03033f02013b2a2a1a74000e0c0003293d1a6b000c000329301a63000c00032806302b6a343b2b1a59000e0e0c0004503b270d020e293529301a4b002f0e0e7e080003641f040e00000000ec00000000000000|@7986,I251,@1955,@2080,I243,I218,@855,I11,I105,I152,I245,I242,I255,@7990| 7990:O1|@7991 7991:D10,236|00812c352d3628062b2b6a651ae1000e0e0c0002293528061ad9000e0e0c000303043b5002041acf001029362a372e352f3628062b2b6a651ab5000e0e0c0002293528061aad000e0e0c000303043b5002041aa3001029362a372c3e1a9d000e0e0c0003293b1a97000c0003030c1a93002a1a93000c00030201292b3e1a7c000e0c0003293b1a77000c0003030c1a73002a1a73000c00030201292b2a1a6c000e0c0003270403193135323628062b2b6a303b2b1a59000e0e0c0004503b6602163235333628062b2b6a2d3b2b1a40000e0c0004503b662706430e0e0e0e0e0e00000000e400000000000000|@7992,@1955,I251,@2080,I216,I234,@677,I106,I233,I255| 7992:S27|545950455f5452454528292e6c696e6b5479706556617273283229 7993:D8,100|00822b3929291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@7994,I105,I218,I251,@6406,@7256,@389,@7465| 7994:S73|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834296d7367466e283329 7995:O1|@7996 7996:D18,412|00842f36291a98010e0c00021a95010e0e0c000203043b5002041a8b01103b50293529352a37333734392c3629352a373b2a69220f23103b2a0c00023d2a69293b692d2a693c28401a61011a62010e0e0e0c000422141a47010c000203042214020a22141a4d010e0e0c0002293e1a47010c0003293b1a43010c0003293b1a3b010c0003293b1a33010c000328062f2b6a3c28401a29011a16010e0e0e0c00043c28401a1e011a07010c00043d2b2b6a3c28403b1af9000e0e0c00043c28403b1aed000e0e0c00043c28403b1ae1000e0e0c00042a2c2b6a2968013c28403b1ace000e0e0e0c000429680122183d32220d2215302f6807221e353b2a291aa0000e0c00021a9d000e0e0c0002031729362b3c1ab3000c0003292b25042504511e233b6502012a65221d3b2b1a9e000e0e0e0c000450293b1a96000e0e0e0c0003031422283c222822221a88001a89000e0e0c000602013b221c222a22221a7c000e0c000450221c2228222b22233b1a6f000c000650221f3b2e1a50000e0c000450221c2d69222722270e0e0e7d2b0002000000009401000000000000|@7998,I105,I218,@7999,@855,I11,I152,I245,I242,-1,@2364,I106,I255,I113,@7997,@7465,@6407,@7574| 7997:S46|436c617573616c2066756e6374696f6e20646f6573206e6f74206861766520616e7920706172616d65746572732e 7998:S84|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342966696e644e616d65416e645061747473283129 7999:O4|@35,@863,@8001,@8000 8000:O5|@7457,1668,0,1668,0 8001:S41|66696e644e616d65416e6450617474733a206261646c792d666f726d65642070617273652d74726565 8002:O1|@8003 8003:D27,580|008f221137293b1a3e020e0e0e0c000322133522143622153822163a3c28401a2a021a2b020c000428062a1a26026a2d291a24020e0c00021a21020e0e0c0002033c29352a362a221c221c220c221d221d221d221d221d2211221e221e221e221e221e221e221e221622151af2010e0e0e0c001450292503511e495102023b505033291ad2010e0e0e0c00021acd010e0e0c0002031829352a362a331ac5010e0e0c000350292503511e275102023b50502f382a2a1ab0010e0c0003291a98010e0c00021a95010e0e0c000207d32935221c3b69280c2a221e221e3468051a8b012a30221e221d1a86010e0e0e0c0006220c353c28401a53011a54010e0c00043c28401a6e011a47010c00043c28401a66011a3b010c00042c2b2d22102d6805280e2a692212381a52012b2b222622251a3d010e0e0c00062224222322241a3f011a40010e0c0005220c2a0e0e0c000264293b691a31012a691a30012a693b3b3b3b2d6805291aef000c000203041a1f01103b503b50293b691a18012a69302a691a14012a6922112a691a0f012a691a0e012a693b3e3c3b2d6805291ab900020289000e0e0c000203041ae300103b503b5022313522323622333722343822353922363a223723062238230722392308223a2309223b230a223c230b223d230c223e230d223f230e2240230f224123101ab1000e0e0c001222172a1aaa000e0e0e0c00032968013c2a2e22246b2235382236230c2a3b3c1a92000e0e0e0c0004502b2a222c0e0e0e7d3b00023b270a1f100e0e0e0e0e0e0e000000003c02000000000000|@8005,I253,@855,I11,79992,I105,I218,@8006,@8036,@2004,@8043,@7528,@6741,@8044,@8047,@7531,@7532,@2356,@7553,@1784,@1058,@1058,@1058,@8004,@7468,@7016,I255| 8004:O2|3,@8048 8005:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e67283129 8006:O1|@8007 8007:D42,1172|00922214352215362216372b352c362d38221a3b693c28403b1a7c040e0c00043c28401a76041a6f040c00043c28401a6e041a63040c00043c28401a62041a57040c00042a2e2d34302e6806293b69280c2a22222222220e680532362220382a3b2b1a3f040c0004501a3c0422212d6a0403002a2a1a34040e0c00035029352a362b3722243c1a27040c000322122227222622262226302f1a19040e0e0c0008291a14040e0c00021a11040e0e0c0002033229352a36293b1a05040e0e0c000303032a021c2b3c1afa030e0e0e0c0003291af4030e0c00023b2a3c6a3e2c2b6a666502031ab90322233b2b1ab6030e0e0e0c000450222523061ad0032a2225306b222723082228392229230d222a3a222b230b223236223236222e230c1ab0032a2c2e6b2230372231382232352233230a223436223523071a99032237223422196b2d2c313122122211221631221732220d22162213221a680e221522302b222c222d2240223822382238223c0c000a22261a43030c00021a41030e0e0c000207db222635291a4f03223f223c223e6b223f1a47030c00042b2a1a43030c0003291a14030e0c00021a11030e0e0c000207dd29351a2d03222f2f224322421a27030c00063b1a24030e0c00022d1b10272b22433b1a19030e0e0c0006293b691a12032a691a11032a693b3b3b3b2d6805291ac4020e0c000203041aff02103b503b502247224622471af5021af6020e0e0e0c0005312a0e0e0e0c000264293b691ae5022a691ae4022a693b3b3b3b2d6805291a83020c000203041abf02103b503b50293b691ac8022a69302a691ac4022a69220f2a691abf022a690202a3001aba022a693b3e3c3b2d6805291a49020e0e0c000203041a8302103b503b5022543522553622563722573822583902026b0022593a225a2306225b2307225c2308225d2309225e230a225f230b2260230c2261230d2262230e2263230f226423101a5d020e0e0c001222372a1a56020e0e0e0c00032968013c2a2e22476b2258382259230c2a3b3c1aba010e0e0e0c0004502b2a0e0e0c0002261c02023b502a6602012922303b2b1a9a010e0e0e0c00045022162a1a11020e0e0c00032922311abe010e0e0e0c0003291a8c010e0c00021a89010e0e0c000207dc29351aed0122232d224322421a9f010c00063b1a9c010e0c000222341b10272b22433b1a90010e0c0006293b691ac6012a691ac5012a693b3b3b3b2d6805291a3c010e0c000203041a7701103b503b502247224622471a6d011a6e010e0e0e0c0005312a0e0e0e0c000264293b691a5d012a691a5c012a693b3b3b3b2d6805291afb000c000203041a3701103b503b50293b691a40012a69302a691a3c012a69220f2a691a37012a691a52012a693b3e3c3b2d6805291ac5000e0e0c000203041aff00103b503b5022543522553622563722573822583922593a02026800225a2306225b2307225c2308225d2309225e230a225f230b2260230c2261230d2262230e2263230f226423101ad9000e0e0c001222372a1ad2000e0e0e0c00032968013c2a2e22476b2258382259230c2a3b3c1a36000e0e0e0c0004502b2a0e0e0c0002271b02013b3b27301f130e0e000000008c04000000000000|@8009,I11,@6741,@1965,I255,@8010,@6494,I106,@8013,I105,I218,I251,@6995,@7525,@8015,@8016,@8017,@8025,@7665,@2004,@8027,@7528,@2008,@2104,@1058,@7685,@1784,@7531,@7532,@2356,@7553,@1058,@1058,@1058,@8028,@7468,@7016,@8030,@8032,@1058,@8033,@8008| 8008:O2|3,@8035 8009:S98|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129 8010:D8,100|00822b3929291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@8012,I105,I218,I251,@6406,@8011,@389,@7465| 8011:S39|2068617320616c7265616479206265656e20626f756e6420696e207468697320636c617573652e 8012:S107|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c617573652831296d657373466e283329 8013:O1|@8014 8014:D6,92|0086311a5a000e0e0e0c00021a55000e0e0c00020331313532362a2f2f3b1a47003b220f220f220f220f1a3f000c000b2a3434343434341a36000e0e0e0c00082a2a69270402013b1f070e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@7569,@7572,@8013| 8015:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8016:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8017:D8,148|00803c28403b1a8f000c00041a8d002a6956290e0e0c00022a3b1a83000c00033c28403b1a71000e0e0c00041a75002a6956580e0e0c00022a3b1a63000c0003566723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4a000e0e0e0c0003293b1a3b000c000303032e020b2e2a1a3600220c7e0b00032708420e0e0e0e0e000000008c00000000000000|@8019,I11,@8020,I253,@8021,I251,@8022,@8018| 8018:O1|@8024 8019:S109|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129626f6479456e762d283129 8020:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 8021:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 8022:O1|@8023 8023:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8022| 8024:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8018| 8025:D3,52|0082560923085619230d2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@8026,@7577| 8026:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@7466,@7465| 8027:S11|45787072657373696f6e3a 8028:O2|3,@8029 8029:S51|426f6479206f662066756e2062696e64696e6720646f6573206e6f74206d61746368207479706520636f6e73747261696e742e 8030:O1|@8031 8031:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203152c352d36292e1a29000e0e0c00033d2c2b6a6602012b430e0e0e000000003400000000000000|@2263,I105,I218,@8030| 8032:S7|436c617573653a 8033:O2|3,@8034 8034:S14|4f7468657220636c61757365733a 8035:S59|54797065206f6620636c6175736520646f6573206e6f74206d61746368207468652074797065206f662070726576696f757320636c61757365732e 8036:O1|@8037 8037:D7,140|00812c37293b1a87000c0003293a293b1a81000e0e0c000303041a7b00103b503b5029352935293b1a65000e0e0c00032b3732352b2a1a63000c00032b3b1a4f000c0003293b1a4b000c000303032a020b2a2a1a4a000e0e0e0c00032d3b2b1a42000e0e0e0c0004502f3b3b1a35000e0e0c0004503b270b430e0e0e0e0e0e0e000000008400000000000000|@8039,I253,I251,@2309,@8040,@8038,I255| 8038:O1|@8042 8039:S93|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6f766552656673283129 8040:O1|@8041 8041:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d362a2e692a2f1a2e000e0e0e0c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@8040| 8042:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8038| 8043:S9|46756e6374696f6e3a 8044:O1|@8045 8045:D1,20|00803b420e0e0e0e000000000c00000000000000|@8046| 8046:S95|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6b4964656e74283229283129 8047:S9|5661726961626c653a 8048:S62|54797065206f662066756e6374696f6e20646f6573206e6f74206d617463682074797065206f6620726563757273697665206170706c69636174696f6e2e 8049:D3,100|008056083556183656283756383856483956583a5668230656782307568823085698230956a8230a56b8230b56c8230c56d8230d56e8230e56f8230f1211000100020023101a20000e0c001256172a1a1a002e0e7e040003000000005c00000000000000|@8050,@7468,@7016| 8050:S45|54595045434845434b5f50415253455452454528292e7061737332283529666f756e644e656172283129283129 8051:D9,340|00862e230d29291a4e010e0e0e0c00021a49010e0e0c0002032429352a362a35291a3c011a3d010e0e0c00036403052a68010207292503511e323b6502013b64293b1a1f010c0003036b1a1b01291a07010c00021a05010e0e0c0002032429352a362a35291af8001af9000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1adb000c000303041adb00103b503b50293529351ac3001ac4000e0c000303043b5002041ac300103b50293765021e293529351aa4001aa5000e0e0c000303043b5002041aa300103b502937643c33690402002a220e2b220f220e56a72213220e22102212220c121100010002001212000100030012130001000400121400010005001215000100060012160001000700121700010008001218000100090012190001000a00121a0001000b001a3e000e0e0e0c0016503b27051f070e0e0e0e0e0e000000004c01000000000000|@8053,I105,I218,@105,I251,@2900,@2955,@1840,@8052| 8052:O1|@8054 8053:S34|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729 8054:D34,1604|009422163522173622171a3b060c000229353e1a36060e0e0e0c0003033d2936291a2c06221922192219221922192219221922192219221922192219221922192219221922192219222e1a07060c001622192a35452a3646650fd529353d1aeb050c0003037229362a37040200221c2b2b221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c1ab8050e0c00165029352a362a2a69292f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f1a810522200e0e7b17200016293528051a6d050e0e0c000307dc29362a382937293629353d1a58050e0c00036503b72937293629353d1a47050c000303043b5002041a4705103b5029362a372a2f1a3f050c00031a3d052a690402002c2b2b1a36050202fd040e0e0e0c000450293504020022242b2b2224222422242224222422242224222422242224222422242224222422242224222422241ae7040c0016502935040200220c2a1ad80422262226222622262226222622262226222622262226222622262226222622262226222622161ac7040c001750293522252a45221046270c023f2a1a9a04221a221a221a221a221a02023000221a221a221a221a221a221a221a221a221a221a221a221a221a222f1a89040e0e0c0016221a2a35452a364664650fce293528061a51040e0e0c000307dc29362a37293e1a65040e0e0c0003293b1a5f040c0003030c1a5b042a1a5b040c000302012929221b1a53040c000365035b293e1a38040e0c0003293b1a33040c0003030c1a2f042a1a2f040c0003020129291b0f271a2a040e0e0e0c0003651a24040e0c000203212a3b1a1d040e0e0c000329353f1ad2030e0e0e0c00031a05040e0e0c00026402013b02013b07cd2c1af3030c000229030b22193c1aef030c000302031b0f272b3d1ae6030e0e0e0c0003293b1a93030c0003641ac80302026b030e0c000203092a03032f02013b02013b03221abf031ac00302024403221b221b221b221b221b221b1ab1030e0e0c0009503b02012f2c3f1a96030e0e0e0c0003293b1a43030c0003641a78030e0c00022c031b2d3d1a78030e0c0003293b1a27030c0003641a5c030e0c000202013b2e3c1a5c030e0c0003293b1a0b030c0003641a40030e0c00023c28401a52031a53030c00042e1a5003020272000e0c000203032e02072e1a43030c0002293e1a3f030c00032e03033f02013b2a2a1a34030e0c00032f03033d02013b2a2a1a24030e0c000329311a1b030c00032806312b6a22103b1ae1020e0e0c0003323b2b1a06030e0e0e0c00045022113b2c1af8020e0c000450220d22146927100202221b2b3b1ab3020c000322133c1a6a020e0e0e0c000307d929353f1a5c020e0c000307cf293629293b1a4e020e0e0e0c000303033b023529352a362a37293629353c1a35020e0e0c00036403102936293622192a1a23020c00036502013b6403033c0207292503511e413b65640306221268010fd029293b1aff010c000303033b023529352a362a37293629353c1ae9010e0e0c00036403102936293622172a1ad7010c00036502013b6403033c0207292503511e3e3b65640306221068010fd429293b1ab3010c000303033b023d29352a362a37293629353c1a9d010e0e0c00036403182936293622152a1a8b0102041e01ef000e0e0c00036502013b6403033c0207292503511e463b65640306220e680102a029293b1a5f010c000303033b023929352a362a37293629353c1a49010e0e0c00036403142936293622132a1a370102026e000c00036502013b6403033c0207292503511e423b65640306220c6801025029293b1a0f010c000303033b023929352a362a37293629353c1af9000e0e0c00036403142936293622112a1ae70002021e000c00036502013b6403033c0207292503511e423b6564030533680102013b293b1ac0000e0c000303041a2b01103b503b502935293528053b2b2d3b6805313b2b1a10010e0c0004503b2606022b29353e1a90000e0c0003031d1aff001a0001221b221b221b221b221b221b1ac9000e0e0c00095002023b5002023b502c3b1aa2000e0e0e0c00032b2a221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a3500221f0e0e7b171f0016221922182a35452a364664661f150e0e0e0e0e0e000000003c06000000000000|@8056,@1955,I251,@8052,@8057,@2248,@2251,@8059,@2071,@8060,@8062,I216,I234,@677,I106,I231,I113,I218,I253,I107,I243,@7346,@8064,@8065,@855,I11,I105,I152,I245,I242,I255,@8068,@7346,@8055| 8055:S32|697320616e20756e7265736f6c76656420666c657869626c65207265636f7264 8056:S44|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e28372967656e6572616c283229 8057:O1|@8058 8058:D4,156|009422161a99000e0e0c00021a95000e0e0c0002037622163522173629221822182218221822182218221822182218221822182218221822182218221822182218221822181a60000e0c00162b360402002b2b2b221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c222f0e0e0e0c00165029352a362a2a69270702012b1f150e000000009400000000000000|@2263,I105,I218,@8057| 8059:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 8060:O1|@8061 8061:D4,164|009522171aa1000e0e0c00021a9d000e0e0c000203762217352218360402002a2a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a1a64000e0c00175029352a362a2a69292f221e221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d2230221d0e0e0e7b171e001622162c453c461f160e0e0e0e000000009c00000000000000|@2263,I105,I218,@8060| 8062:O1|@8063 8063:D4,156|009422161a99000e0e0c00021a95000e0e0c0002037222163522173629221822182218221822182218221822182218221822182218221822182218221822182218221822181a60000e0c00160402002a2d2b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b222e0e0c00165029352a362a2a69270602012b1f150e0e0e0e0e000000009400000000000000|@2263,I105,I218,@8062| 8064:S29|696e636c75646573206120667265652074797065207661726961626c65 8065:O1|@8066 8066:D13,380|00873b1a7a010e0e0e0c000231230d29291a70010e0c00021a6d010e0e0c0002032429352a362a35291a60011a61010e0e0c00036403052a68010207292503511e303b6502013b64293b1a43010c0003036b1a3f01291a2b010c00021a29010e0e0c0002032429352a362a35291a1c011a1d010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aff000c000303041aff00103b503b50293529351ae7001ae8000e0c000303043b5002041ae700103b50293765021e293529351ac8001ac9000e0e0c000303043b5002041ac700103b502937643e220e69291aa1000e0e0c000203041ab300103b503b50332b2f220c3b22100e0e0e0c00063e220f69291a7c000e0c000203041a8f00103b503b50293b691a88002a692c2a691a84002a692f2a693b3e3b3b2d6805291a50000e0c000203041a6300103b503b503b22110c00022968013c2a2d22146b2217382218230c2a3b3c1a4e000e0e0e0c0004502b2a22150e0e0e7d1c0002000000007401000000000000|@8067,@2008,I105,I218,@98,I251,@2900,@2955,@1840,@1784,@1058,@1058,I255| 8067:S46|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729676976654572726f72283229 8068:O4|@35,@863,@8070,@8069 8069:O5|@1964,2825,0,2825,0 8070:S25|67656e6572616c3a204e6f206d61746368696e672074797065 8071:O1|@8072 8072:D18,364|008c343c1a69010e0e0c0003220e351a62012b692a0c000264220e351a5901220e2d6a2a0e0c0002641a5001220d220d6a0403002a2a1a47010c00035029352a360403003b2a1a3b010c00035029352a362b3722192e2c22172216221a221922111a24010e0c000929221b2a1a1d010e0e0c00021a19010e0e0c00020314291a0a010e0e0e0c00021a05010e0e0c000202013b033b2a352b362b352c362c2b221e3322232223220f221f2223222022202220221d2221222722291ad7000c0011502b2a2506250626041e5e3b270402013b652a221c2a3b1abe000e0e0e0c0003031a293b1ab1000e0e0c000303043b5002041aa700103b503b5002552a352b362b1a88000e0c00021a85000e0e0c000203043b5002041a8700103b502b352c362a362b372a1a7c000e0c00021a7900221f22216a3022172c22232f2e22241a6b000c0008502f2e250a250a26081e782608511a5b00221869293222117d1d0002000000006401000000000000|@8074,I106,@8075,@8080,@8083,@6494,@6351,@8085,I105,I218,@8091,I251,@5286,@5286,@8105,@8111,@7980,@8073| 8073:D4,68|00802b352c36292306293b1a3a000e0e0e0c000303041a3300103b502935293b3b1a2c000e0c0004505647372d2d692a310e0e0e7d080002000000003c00000000000000|@8112,I251,@2309,I255| 8074:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329 8075:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8077,@8076| 8076:O1|@8078 8077:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283129 8078:D13,204|00822c352d3628062b2b6a651ac1000e0e0c0002293528061ab9000e0e0c000303043b5002041aaf00103b5029362a37293f1aa7000c0003293b1a97000c0003641a9c000e0c00022a3c1a8f000c0003293b1a7f000c0003641a84000e0c00023c28401a7e001a7f000c0004311a7c000e0c00020303310207311a73000c0002293e1a6f000c00032d03033f02013b2a2a1a64000e0c0003293d1a5b000c000329301a53000c00032806302b6a343b2b1a49000e0e0c0004503b270d440e0e0e00000000c400000000000000|@8079,@1955,I251,@2080,I243,I218,@855,I11,I105,I152,I245,I242,I255| 8079:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283229 8080:D2,36|00802b352c36562756381a1b002f0e7b060300050e0e0e0e000000001c00000000000000|@8077,@8081| 8081:O1|@8082 8082:D14,244|00832c230c2f2a0e0e0c000264293b1ae6000e0e0e0c000303bc2e352f3628062b2b6a651ad5000e0e0c0002293528061ac5000e0e0c000303043b5002041abf00103b5029362a37293f1ab7000c0003293b1aa3000c0003641aac000e0c00022a3c1a9f000c0003293b1a8b000c0003641a94000e0c00023c28401a8e001a8f000c0004321a8c000e0c00020303320207321a83000c0002293e1a7f000c00032d03033f02013b2a2a1a74000e0c0003293d1a6b000c000329301a63000c00032806302b6a343b2b1a59000e0e0c0004503b270d020e293529301a4b002f0e0e7e080003641f040e00000000ec00000000000000|@8079,I251,@1955,@2080,I243,I218,@855,I11,I105,I152,I245,I242,I255,@7990| 8083:D8,100|00822b3929291a5f000c00021a5d000e0e0c0002031e29352a362a353b1a50000e0c000303042a360207292503511e293b6502031a3d00642f1a3c001a3d000e0e0c000356373c56582d2d1a3200337b070800060e0e0e0e000000005c00000000000000|@8084,I105,I218,I251,@6406,@7256,@389,@7465| 8084:S75|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833296e6577456e762d283329 8085:O1|@8086 8086:D7,116|0087321a72000e0e0e0c00021a6d000e0e0c0002034d323533362a352b382c391a5d002b220e2c221168052c2a333b1a52002f22122212221222121a4a000e0e0e0c000b2e22102210221022102210221022101a36000e0e0e0c00092a2a69270802013b1f080e0e000000006c00000000000000|@1785,I105,I218,@8088,@8087,@7572,@8085| 8087:O1|@8090 8088:D3,76|00802b362c562a0e0e0c0002505619030a2c56280e0c00025002023b5056173b1a2d000e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000004400000000000000|@8089,I253,I255| 8089:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329646f56616c283129656e74657256616c73283129 8090:D4,124|00802b352c362d373c28401a72001a73000c00043c28401a6e001a67000c00043d2b2b6a3c28403b1a59000e0e0c00043c28403b1a4d000e0e0c00043c28403b1a41000e0e0c00042a2c2b6a2968013c28403b1a2e000e0e0e0c0004296801220c3d32220e220e302f6807270d420e0e000000007400000000000000|@7571,-1,I11,@2364| 8091:O1|@8092 8092:D25,604|008f22103522113622123722133929030e221323061a48022a22156a64020422132306221423082215392216230d22173a2218230b221736221736221b230c1a22022a2c2e6b221d37221e38221f352220230a222136222223072210030a1a0702222422216a0204222323092d2c313122122211221631221732220d22162213221a680e221b221b2b22172218222422242224222422290e0e0c000a22282a1aca010e0e0e0c0003291ac4010e0c00021ac1010e0e0c000207dc29351ab9012219222c222522201ab2010e0e0e0c00061aad0122192e222622211a9f010c00062224221f22201a9b011a9c010e0c00052c2a0e0e0e0c000264293b691a8d012a691a8c012a693b3b3b3b2d6805291a5f010c000203041a7b01103b503b50293b691a74012a69302a691a70012a69332a691a6c012a691a6b012a693b3e3c3b2d6805291a2a010e0e0e0c000203041a4301103b503b5022313522323622333722343822353922363a223723062238230722392308223a2309223b230a223c230b223d230c223e230d223f230e2240230f2241231002023c001a0d010e0e0c0012222b2a1a06010e0e0e0c00032968013c2a2e222b6b2235382236230c2a3b3c1aee000e0e0e0c0004502b2a0e0e0c0002271602013b221503512217293528161ad2000e0e0e0c0003030c2936292502501e153b6402292935280b1ab7000c000303033c021a293528051aa8000e0c0003030c2937292502501e3d3b6402013b641a51000e0e0c000202013b031722223c221d22191a81001a820022200e0e0e7b072b00063b27191f100e0e0e0e0e0e0e000000005402000000000000|@8094,@8095,@8096,@8097,@2004,I105,I218,@8102,@7528,@8027,@7531,@7532,@2356,@7553,@1784,@1058,@1058,@1058,@8103,@7468,@7016,I255,I251,@8093,@7465| 8093:S51|526563757273697665206465636c61726174696f6e206973206e6f74206f662074686520666f726d2060666e206d6174636827 8094:S78|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b5479706573283229 8095:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8096:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8097:D6,92|00803c28403b1a57000c00041a55002a6956280e0e0c00022a3b1a4b000c0003563723093b2a0e0e0e0c000264293b1a3a000e0e0e0c000303032a020b2a2a1a2e00310e7e0700032704420e0e0e0e0e000000005400000000000000|@8099,I11,@8100,I253,I251,@8098| 8098:O1|@8101 8099:S88|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b54797065732832296e6577456e762d283129 8100:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7734,I253,I255| 8101:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8098| 8102:S8|5061747465726e3a 8103:O2|3,@8104 8104:S47|5061747465726e20616e642065787072657373696f6e206861766520696e636f6d70617469626c652074797065732e 8105:O1|@8106 8106:D6,444|00802b3528161ab7010c0003030e2b36291ab0012d0e0e0e7d0400022b3528181a9d010e0e0c000303033c0fd92b353d1a8d010e0e0c0003031e2b3629352a362a1a84010e0c0002030a291a76012f0e7d0600023b660fcf2b35280f1a61010e0e0c000303402b38293c2a1a5e010e0e0e0c00021a59010e0e0c000203242a352b362a382c030b291a39010e0e0c000202013b2b2a2506250626041e313b2704020129660fdd2b3528191a13010c0003033b2b36293c2a1a12010e0e0e0c00021a0d010e0e0c0002031f2a352b362b03092a1aef000c000202013b2a2a2505250526031e2d3b660201296602bb2b35281b1acc000e0c000303033c02ab2b3528121abc000202a0000e0c000303033c02972b3528051aa8000e0c000303122b37291aa0002d02027f000e0e0e7d0400022b3528111a89000e0e0c0003034c2b37293b1a7b000c000303033c023a293c2a1a79000e0e0c00021a75000e0e0c0002031f2a352b362b03092a1a57000c000202013b2a2a2505250526031e2c3b66020502022300296564021e2b35280e1a2f000c000303033c020f2b35280b1a20002d0e0e0e7e030003420e0e0e0e0e0e0e00000000b401000000000000|@8108,I251,@8105,@8107,I105,I218| 8107:O1|@8109 8108:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296e6f6e457870616e73697665283129 8109:D8,252|00802b3528161af7000c0003030e2b36291af0002d0e0e0e7d0400022b3528051add000e0e0c0003030e2b37291ad4002d0e0e0e7d0400022b35280e1ac1000e0e0c000303a22b362936293b1ab9000e0e0c00032936293b1aa5000e0e0c000303033c020f291aa3000c00021aa1000e0e0c000264036d2938291a97000c000229353d1a7a000e0e0e0c000303492937291a80000e0c0002293528051a61000e0e0c0003032d29382937293629353c1a4e000e0e0e0c000364031429362936291a55001a3a000e0e0e0c00036502013b6502013b6502013b651a34002f0e0e0e7d0600023b6602013b420e0e0e0e0e0e00000000f400000000000000|@8110,I251,@8107,I253,I105,I218,@1955,@50| 8110:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352969734e6f6e526566436f6e7374727563746f72283129 8111:D3,100|008056083556183656283756383856483956583a5668230656782307568823085698230956a8230a56b8230b56c8230c56d8230d56e8230e56f8230f1211000100020023101a20000e0c001256172a1a1a002e0e7e040003000000005c00000000000000|@8050,@7468,@7016| 8112:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329656e746572446563283129 8113:O1|@8114 8114:D5,140|008c220e1a89000e0e0c00021a85000e0e0c00020361220e35220f362a352b362c3829312213221322132213221322132213221322132213221e0e0e0e0c000d2b3b2b1a52000e0e0e0c0004502c2a692e2215221522152215221522152215221522152215221522151a30000e0c000e2a2a69270802013b1f0d0e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,I255,@8113| 8115:O1|@8116 8116:D4,116|008c220e1a71000e0e0c00021a6d000e0e0c00020349220e35220f362a2e2210221022102210221022102210221022102210221b0e0c000d2a2211221122112211221122112211221122112211221122111a2c000e0c000e2a2a69270402013b1f0d0e0e0e0e0e0e000000006c00000000000000|@1785,I105,I218,@8115| 8117:S3|49663a 8118:O2|3,@8119 8119:S46|436f6e646974696f6e20696e2069662d73746174656d656e74206d7573742068617665207479706520626f6f6c2e 8120:S5|5468656e3a 8121:S5|456c73653a 8122:O2|3,@8123 8123:S46|54797065206d69736d61746368206265747765656e207468656e2d7061727420616e6420656c73652d706172742e 8124:S9|417267756d656e743a 8125:O2|@1058,@8126 8126:O2|@8127,0 8127:O5|0,0,0,0,@8128 8128:O2|@7553,@8129 8129:O2|@2356,@8130 8130:O2|@8131,0 8131:O2|3,@8132 8132:S49|56616c7565206265696e67206170706c69656420646f6573206e6f74206861766520612066756e6374696f6e2074797065 8133:S35|54797065206572726f7220696e2066756e6374696f6e206170706c69636174696f6e2e 8134:D75,3300|00822d352e362f371add0c0e0e0c00041ad90c2e6928092a69291ad30c0c000203041acf0c103b503b50293b69293b1ac60c0e0e0e0c000303032c020b2c2a1aba0c0e0e0e0c00031ab50c2f34346b3c28403b1aae0c0e0e0e0c0004293b1aa70c56a956b856ca6b1aa10c0e0e0c0004501a9c0c31691a9b0c32691a9a0c56a769220d350a1e00f9055f03cc0aa7036a0ad707e705a3050a026305af052b076308a3043e00a4028e0714021b0ccf0629081603db0113057a02040a8c06ed01e3084704fe01220d362937293b1a4d0c0e0e0c00032b352c362d382e392b3b1a3b0c0c000329350403002a1a330c1a080c0e0c000303033c02222a1af30b0c00021a210c0e0e0c000203102a3b1a110c3b280f1a130c0c000602013b03432c3b1afa0b0e0e0e0c00033b2a0e0e0e0c00026429311af60b0e0e0e0c00033c2a69291aad0b0e0e0c000203041aa70b103b503b50293b692d3b453b462a47260502152b392c3a2a1ac80b0e0c00022c2a452b463b47260429352a362b372a1a710b0e0e0c00021a9d0b0e0e0c000203632a352935293b1a850b0e0e0c00032b36293b1a790b0e0e0c00032d37293b1a6d0b0e0e0c0003291a7c0b0e0c00022e3b1a370b0c0003030329020b292f1a6a0b0e0e0e0c0003402e2b6a291a140b0e0c000203041a0f0b103b503b50293b69270a02013b280d220c69291af50a0e0e0c000203041aef0a103b503b502b3b1ae90a0e0e0c000303032a020b2a2c1a1e0b0e0e0e0c0003293b1acf0a0c000303042215020a22152a1a080b0e0c0003293b1ab70a0c000303032f020b2f2a1af60a0e0e0e0c00032c2a69221f220e452a4627130fd9220d36220f2a220f220e22100e7b05100004220d361ace0a3069220e2b452a46650fce220d36220d2a453046640fd1220c1ab60a452f460fc9220d36220e37220f382b3b1a730a0c0003280d2a69291a3c0a0e0c000203041a370a103b503b50326801121100010001002a692e2a1a7d0a0e0e0c0003220d3b1a1a0a0e0e0e0c0003030329020b29220e1a650a0e0e0c00032d2a69221631452a46270a0fd4220d37220e39280d2b69291ae1090e0e0c000203041adb09103b503b5029326922102c452a4627040fd8220d37220e38220f392b3b1ae309020294090c00031a150a220f693268012a2a692e2a1aff0902027c090c0003280d2e69291a900902046d096b090e0e0e0c000203041a8309103b503b50220e3b1a7c090e0c000303032a020b2a220f1ad1090e0e0c00032a2a69221732452a46270b0fd7220d36220e37220f3830680156e72a692c3b692e2a69292c1a98090e0c0003220d3b1a36090e0e0e0c0003030329020f29220e1a8d090202fa080e0e0c0003221530452a4627090fd7220d36220e37220f3830680156e72a692c3b692e2a69292c1a4f090202cc080c0003220d3b1aea080e0e0e0c0003030329020b29220e1a45090e0e0c0003221530452a4627090fd1220d3629352a362b382c392d37293b1adc080e0c000321051a1f094521061a1d0945292e462b47220e483049334a6c502a22144631472a48220e496c503f2b69291a7e0802025b080e0e0e0c000203041a7308103b503b50280d2d69291a62080e0e0e0c000203041a5b08103b503b50293b692b2a6922123b1a4e080e0e0e0c0003030329020f2922131ab508020212080e0e0c0003221a34452a46270e0fdd220d36220e37220f38221039316801302a693c28403b1a1d080e0e0c00042e2a69302e69293b692b2a69292f1a53080202d0070c000322113b1aee070e0e0e0c0003030329020b2922121a59080e0e0c0003221934452a46270d0fd9220d36220e37220f3822103921051a3d084521061a3b0845292c462b4734482e49304a6c502a2211462f472a4834496c503f2b69291a8e070e0e0e0c000203041a8707103b503b50293b69220d3b1a7d070e0e0c0003030329020b29220e1af5070e0e0c0003221530452a4627090fdd220d36220e371ae107220d2c326b3f020224072a69291a3d070e0e0c000203041a3707103b503b50293b69333b1a2e070e0e0e0c0003030329020b29341aae070e0e0e0c000322122e452a4627060fce220d36220e371a9907220d693068012a2a692d2a1a4f070202cc060c0003343b1aeb060c0003030329020b29220c1a75070e0e0c000322132f452a4627070fd7220d38220d2a453046640fcd220d36220e372f68012e2a692c2a1a09070e0e0c0003333b1aa7060c0003030329020b29341a36070e0e0e0c000322122e452a4627060fd7220d362939220e020258062a453146650fdd220d3629352a362b372c392a1a09070e0e0c00022a1a04070e0c00022e1a00070e0c0002293b1a4f060c000303032a020f2a2a1aee06020217060e0e0e0c0003293b1a33060c000303032c020b2c2a1ad6060e0e0e0c0003220e6801220c2a692b2a1a6b060c000322123b1a0a060e0e0e0c0003030329020f2922131aad060204ce05cc050c0003221a220c452a46270e0fd4220d36220e372a1a93060c00023068012e2a692b2a1a25060e0e0c0003343b1ac3050c0003030329020f29220c1a710602028a050e0e0c000322132f452a4627070fdc220d362935020272052a362b38316801302a692d3b1a8a050e0e0e0c000303032c020b2c2e1a3a060e0e0e0c0003292b1ac7050c0003220d3b1a66050e0e0e0c0003030329020b29220e1a19060e0e0c000322152f452a4627090fdb220d36220e37220f382b3b1a5c050e0c0003280d2a69291a24050e0c000203041a1f05103b503b503268012f2a692e2a1a6b050202e8040c0003220d3b1a06050e0e0e0c0003030329020b29220e1abd050e0e0c00032d2a69221631452a46270a0fdd220d36220e37220f3830680156e72a692c3b692e2a69292c1a200502029d040e0c0003220d3b1aba040e0e0e0c0003030329020b29220e1a75050e0e0c0003221530452a4627090fdd220d36220e37220f38541a5d054521051a5b0545292210462d472b4833496c502a2e462a4733486c503f2a6929020242041a5e040e0e0e0c000203041a5704103b503b5029220c6922132e452a4627070fd3220d3629352a363068011a13052a692c2a1a8c040e0c0003343b1a2b040c0003030329020b29220c1af9040e0e0c000322132e452a4627070fd1220d36220e390202dd033c28403b1a09040e0e0c0004293b1ad3042c121200010002006a1afb030c000450521ac30445531ac20445292b462210476c502a2a466c501ab5042b693368012a2a69302a020294031a10040e0c0003220e3b1aae030e0e0e0c0003030329020b29220f1a8d040e0e0c0003221632452a46270a0fcf220d36220e391a790456d7693068012a2a692d2a1acf0302024c030c00032e1a64030e0c00021a91030e0e0c000203642e352f362a352935280e1a51030e0e0c0003034c29362935291a3a041a3f03020214030c000303033c0222291a27030c00021a55030e0e0c00020310293b1a15043b28061a47030c000602013b030d2c3b1a0a030e0e0e0c000302013b6502013b6602013b03652e352935293629382c362a392b382a2a1ae0030e0c00036503102a372b362a2a1ad0030e0c00036502013b031222192a22192218221a020296027b051a000422103b1ab2020e0e0e0c000303032e020b2e22111aa1030e0e0c0003221834452a4627060221343b1a8d020e0e0c0003030329020b29220c1a81030e0e0c000322132f452a466427060fd8220d36220e37220f382a3b1a83020c0003280d2a69291a4c020e0c000203041a4702103b503b50326801121100010001002a692f2a1a8d020e0e0c0003220d3b1a2a020e0e0e0c0003030329020b29220e1a21030e0e0c00032d2a69221631452a46270a0fdd220d3629352a362b372c382d392e3a346801332a693c28403b1af7010c0004312a69302e69323069293b692b2a692d2a6929311a29020e0e0c000322163b1ac6010e0e0e0c0003030329020b2922171ac1020e0e0c0003221e220e452a4627120fd2220d3629362a36293528191a970102026c010c0003034d2936291a80010e0c00021aad010e0e0c000203352936291a6c010e0c00021a99010e0e0c0002031d2936293b1a5f010c0003030d2e38293c1a53010c00036402013b6402013b6402013b6402013b64037f2a36293629352a3629352f353039313729020201013b1a48010e0c0003280d2a69291a10010e0c000203041a0b01103b503b5022106801121800010001002a69303b69302a69342a69292d1a47010c000322173b1ae6000e0e0e0c0003030329020f2922181ae5010202aa000e0e0c0003302a692220220c452a46271202652a352b392c37293b1ad7000c0003280d2a69291aa0000e0c000203041a9b00103b503b50346801121300010001002a69303b69302a69292c1adb000c000322113b1a7a000e0e0e0c0003030329020b2922121a7d010e0e0c00032f2a69221a34452a46270c65022f220d36220e382a3b1a6f000c0003280d2a69291a38000e0c000203041a3300103b503b5029336922112d452a462705270a440e0e0e0e00000000dc0c000000000000|@8136,@8137,@8144,I105,@1784,I251,@8146,@8148,I11,@8150,I255,@8192,@8194,@8277,I253,@6666,I218,I154,@8292,@1781,@8294,@8296,@8298,@8300,@8302,@8304,@6406,@8234,@8305,@8307,@8318,@8320,@8322,@8324,@8326,@8330,@8332,@8334,@8335,@8338,@8340,@8342,@8344,@8364,@8366,@8368,@8370,@8372,@8374,@8376,@8378,@8380,@8382,@8384,@8386,@8388,@8390,@8392,@8394,@8395,@8400,@8402,@8469,@8471,@8483,@8518,@8520,@6692,I113,@8529,@8531,@8533,@8535,@8537,@8135| 8135:O1|@8539 8136:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283229 8137:O1|@8138 8138:D7,212|00822c1ad2000e0e0e0c00021acd000e0e0c0002031c2c3528072a69291ab8000e0c000203041ab700103b50293b696502013b2c1aa1000e0e0c00021a9d000e0e0c0002031c2c3528082a69291a88000e0c000203041a8700103b50293b696502013b2f1a71000e0e0c00021a6d000e0e0c0002031c2f3528052a69291a58000e0c000203041a5700103b50293b696502013b293b1a4c000e0c000303032a020b2a2a1a42000e0e0e0c0003293b1a33000c000303032c020b2c2a1a2e00310e7e0900032704440e00000000cc00000000000000|@8140,I105,I218,@1784,I251,@8141,@8139| 8139:O1|@8143 8140:S37|4578706f72745472656528292e6578706f72744e617669676174696f6e50726f7073283329 8141:O1|@8142 8142:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8141| 8143:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8139| 8144:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8145,@7016| 8145:S50|4558504f52545f50415253455452454528292e6765744578706f727454726565283229636f6d6d6f6e50726f70732d283129 8146:O1|@8147 8147:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8146| 8148:D1,44|0080040200561856292b56470e0c00045029352a362a2a6966420e0e0e0e0e0e000000002400000000000000|@8149| 8149:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296173506172656e74283129 8150:D26,724|00802b363c1ad0020e0c000303051acb020fdd2b3529353b1ac5020e0e0c00036407df2b3529362d363c1ab7020c00032a2a6956473b1aaf020c00032a2a0e0e0e0c00026429353b1a95020e0e0c000303932939291a94020e0c00021a91020e0e0c0002035f29361a81020e0e0c00021a7d020e0e0c000203482935353e1a5f020c000303312935362928281a51020e0e0c000303033c021b29287b1a41020e0e0c000303033c020b29285b1a31020e0e0c00036402013b1a35020e0e0c000202013b02013b03192a1a2802691a28022a691a27022a693b3e3c3b2d68056602012a64020129293b691a14022a690202d0011a0f022a693b3c3b3b2d680527090fcf00002b363c1ace010e0e0e0c000303051af3010fd42b3529353c1ac1010e0e0c00036403a22b3529362a372e363c1ab1010e0e0c0003293b1a9b010c000303051ac701025e293c1a98010e0c00032c2a6956683b1a8f010c00032a2a0e0e0e0c0002642c3c1a7a010e0e0e0c00032e2a691a9a013b1a6e010e0e0e0c00031a91012a0e0c0002642a2a0e0e0c000264291a8301691a83012a691a82012a692f2a6927091a7c012a693b3c3b3b2d6805293b691a71012a691a70012a693b3c3b3b2d6805270a0fdc2b363c1a09010202ef000e0e0c000303051a53010fdd2b3529362d363c1afb000202d5000c00032a2a6956493b1aef000c00032a2a0e0e0e0c00026429353b1ad5000e0e0c000303952939291ad4000e0c00021ad1000e0e0c0002035f29361ac1000e0e0c00021abd000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1a75000e0e0c000202013b02013b03192a1a6800691a68002a691a67002a693b3e3c3b2d68056602012a6402031b0029293b691a86002a691a85002a693b3c3b3b2d0202040068052709420e0e0e0e0e00000000cc02000000000000|@8152,I234,@2016,I251,I107,I253,I105,I218,@1087,@1088,@1060,@1058,@8153,@2016,@1043,@160,@8173,@1056,@1058,@1059,@1060,@1058,@8185,@2016,@1058,@8151| 8151:O5|0,0,0,@8155,@8189 8152:S11|7072696e742d6c54797065 8153:O5|0,0,0,@8155,@8154 8154:O2|@8159,0 8155:O2|@8156,0 8156:O2|0,@8157 8157:O5|@8158,66,66,0,0 8158:S50|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4558504f52545f5041525345545245452e736d6c 8159:O2|3,@8160 8160:S5|4461746154 8161:O2|@8162,@161 8162:D2,28|00801a1b0056172d6a420e0e0e0e0e0e000000001400000000000000|@360,@8163| 8163:D3,44|00802b365618362d35291a23002c692d56671a1f00320e7b060600050e0e0e0e000000002400000000000000|@4473,@8165,@8164| 8164:O1|@8167 8165:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@8166| 8166:S14|7072696e745f7265662833292d45 8167:D22,900|00832e3b1a81030e0e0c00032d3b1a7b030c000303051a77030fd01a76030e0e0e0c0001293d1a5f030c000329291a67030c00021a65030e0e0c0002034529352a362a3b1a41030e0e0c0003293529341a4d030e0e0c000364031d2935331a3f030c000303043b5002041a3703103b5029372968016402082a250426031e503b6602013b64291a0f030c00021a0d030e0e0c00020304293502013b29291af8020e0c00021af5020e0e0c0002031d29352a362a220e1ae8020e0c000303033c0207292503511e293b6502013b6403051ad6020fd17882d0220c2c691ab6020e0e0e0c0001293d1a9f02020283020c000329291aa3020c00021aa1020e0e0c0002033c29352a362a3b1a7d020e0e0c000329352922121a88020e0c0003650316220f2845303b6b2b3b2b1a80020e0c0004503b510206292503511e485102281a53020c0001220e28452f3b6b3c28402b1a5e020e0e0e0c0004292e692c3d2b1a4b020c0004260550220d3c1a47020c0003332a22110e0c000329353b1a22020e0e0e0c000303aa2939291a0c020e0c00021a09020e0e0c0002038129352a36293b1afd010204c7012d010c000303032c02672a353e1ae9010e0e0c000303482a3629285b1ada010e0e0e0c000303032d023229287b1ac9010e0e0c000303032d02222928281ab9010e0e0c000303032d02122d1ac301691ac3012a693b3e3c3b2d6805656402122c1ab601691ab6012a693b3e3c3b2d6805656502122a1aa901691aa9012a693b3e3c3b2d68056564020129293b691a99012a691a98012a693b3e3b3b2d68051a4c010e0c0001293d1a37010c000329291a3f010c00021a3d010e0e0c0002033d29352a362a3b1a19010e0e0c0003293529221b1a24010e0c00036503162218284522133b6b2b3b2b1a1b010c0004503b640207292503511e483b65022b1aee000e0e0e0c00012217284522123b6b3c28402b1af5000e0e0c0004292e692c3d2b1ae3000c00042704642c270d059a0e0e00ff6d1ab8000e0c0001293d1aa3000c000329291aab000c00021aa9000e0e0c0002033c29352a362a3b1a85000e0e0c000329352922101a90000e0c0003650316220d2845313b6b2b3b2b1a88000e0c0004503b510206292503511e485102281a5b000c0001220c2845303b6b3c28402b1a66000e0e0e0c0004292e692c3d2b1a53000c00042605502b352c362d372b2b2b1a6d006b66102704641f040e0e0e0e0e000000007c03000000000000|@8169,I253,I232,@364,I72,I105,I218,I251,@1840,@364,I255,I11,I107,@439,@443,@439,@443,@439,@443,@441,@8170,@8168| 8168:O5|@8172,117,0,117,0 8169:S12|7072696e745f726566283329 8170:O2|3,@8171 8171:S3|726566 8172:S22|2e2f62617369732f45786e5072696e7465722e736d6c 8173:O4|0,@8174,3,1 8174:O1|@8175 8175:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@5665,@11,I253,@8176| 8176:O4|0,@8177,2,1 8177:O1|@8178 8178:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@8180,@160,I253,@8179| 8179:O4|0,@8181,1,1 8180:S9|7072696e742d726566 8181:O1|@8182 8182:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2625,@162,I253| 8183:O1|@8184 8184:D3,36|00802b352903051a1e0002031a1d003e2a6965420e0e0e0e000000001c00000000000000|@360,@4673,@4672| 8185:O5|0,0,0,@8155,@8186 8186:O2|@8187,0 8187:O2|3,@8188 8188:S4|4465636c 8189:O2|@8190,0 8190:O2|3,@8191 8191:S5|5479706542 8192:D5,132|00802b352c362936293b1a7b000c0003291a78000e0c00021a75000e0e0c0002033429352c350402002f2b2b56a70e0e0e0c00045029352a363b2e69291a4c000e0c000203041a4b00103b50292b692c2a69270702182b350402002e2b2b56970e0c00045029352a362a2a6927042704420e0e0e0e0e0e0e000000007c00000000000000|@8193,I253,I105,I218,@1784| 8193:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745472656557697468427074283129 8194:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8196,@8195| 8195:O1|@8197 8196:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283129 8197:D16,452|00822c353c1ac0010e0c0003036a2c362d37293b1ab5010e0e0c0003291ab0010e0c00021aad010e0e0c000203322935040200322e2b330e0e0c00045029352a363b2d69291a88010e0c000203041a8701103b503b50292b692c2a6927060215040200312d2b320e0e0c00045029352a362a2a6966660fdb2c353d1a4a010e0e0e0c000303c12c362937293b1a39010e0e0c000303482a352b382c391a3d011a3e0134343468051a3a012d2c2c6b3f2a69291a1b010c000203041a1b01103b503b50220c35220d36220e371a1a010e0e0e0c00042a2a692f2a692708026629352b352c382d391a03011af400220c220c220c6805541af8004521051af60045292f462d472b482c496c502a30462a472c486c503f2a69291ab6000e0e0e0c000203041ab300103b503b50220e35220f362210371ab2000e0e0e0c00042a2a69302a69270a6502692c3629352a372b382c3902025b001aa0001a8500343434680521051a97004521051a9500452930462d472b482c496c502a2e462a472c482f496c503f2a69291a47000c000203041a4700103b503b50220d35220e36220f371a46000e0e0e0c00042a2a69302a69270b440e0e0e0e0e0e0e00000000bc01000000000000|@8199,I251,I253,I105,I218,@1784,@8200,@8195,@8202,@8137,@8213,@8214,@8268,@8269,@8270,@8198| 8198:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@8204,@8203| 8199:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229 8200:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8201| 8201:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296173506172656e74283129 8202:D2,44|0080560968013b2a3b6a29563756483b1a1d00310e0e0e7b060500050e0e0e0e000000002400000000000000|@8204,@8203| 8203:O1|@8205 8204:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296765744e616d65283129 8205:D8,116|00832e352f3630371a6d000e0e0c00041a69002f6928092a69291a63000c000203041a5f00103b50293b69293b1a58000e0c000303032c020b2c2a1a4e000e0e0e0c0003293b1a3f000c0003030330020b302a1a3a000e0e0e0c0003322a6927061f040e0e0e0e0e000000006c00000000000000|@8207,@8137,@8208,I105,@1784,I251,@8210,@8206| 8206:O1|@8212 8207:S31|4578706f72745472656528292e676574537472696e67417354726565283429 8208:D3,44|00803e561769291a26000e0e0e0c000203041a1f00103b502964420e0e0e0e0e000000002400000000000000|@8209,I105,@1784| 8209:S34|4578706f72745472656528292e676574537472696e67417354726565283429283129 8210:O1|@8211 8211:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8210| 8212:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8206| 8213:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8201| 8214:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@8216,@8215| 8215:O4|@8218,@2104,@8217,@70 8216:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e6728322967657454797065283129 8217:O2|@8266,@8215 8218:D22,636|00812b1a7a020e0e0e0c00021a750256272b6a28092a69291a6d020e0e0c000203041a6702103b503b50280d2c69291a56020e0e0e0c000203041a4f02103b503b503035313632371a45020e0e0c00042a2a692c2a691a3b0231220c220c6b33350a050053010c009b015a016201d701333629352a372b382c39040200220d3528051a13020c00030350220d37220e382937293629353c1afe010e0e0e0c00036403182936293629121500010003001ae6010e0e0e0c00036502013b6403082b2b453b465002102936291acf010c00022d2d452a46260351020b1ac3012a2a35452a36465129352a362f1a9b010c00021ab1010e0e0c0002039b2f353036293b1a95010e0e0c0003034221061a99014521051a970145292215462d472b48220d496c502a2f4632472e482a49220d4a6c503f2a69291a50010e0c000203041a4b01103b503b50293b6966024621061a5f014521061a5d01452933462b47220d483449121600010002004a6c502a2f4632472e482a49220d4a6c503f2a69291a07010c000203041a0301103b503b50293b696665020129333b1afd000e0e0c0003030329020b29341a0e010e0e0e0c00032e2a69270a02b61a02012b6902af3337292c696402a7333634381af30034692c68012a2a692d2a1aea000e0e0e0c0003303b1ab3000c0003030329020b29311ad6000e0e0e0c00032e2a692707026e33363437220c382c680156c82a692b3b692e2a69292c1aac000e0c0003323b1a77000c0003030329020b29331a9e000e0e0e0c0003302a6927090232333634372b680156b82a692c2a1a79000e0e0c00032f3b1a43000c0003030329020b29301a6e000e0e0e0c00032d2a692706270843000000007402000000000000|@8220,@6977,@8221,I105,@1784,@8137,@8223,I251,@1781,@8225,I218,@8226,@8228,@8230,@8231,@8248,@6406,@8250,@8234,@8261,@8263,@8219| 8219:O1|@8265 8220:S29|545950455f5452454528292e747970654578706f727454726565283229 8221:D3,44|00803b1a2a000e0e0e0c000256182d2b1a21003b5667317b070400060e0e0e0e000000002400000000000000|@8222,@2008,@2219| 8222:S44|545950455f5452454528292e747970654578706f727454726565283229636f6d6d6f6e50726f70732d283129 8223:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@8224| 8224:S40|545950455f5452454528292e747970654578706f7274547265652832296173506172656e74283129 8225:O2|I48,0 8226:D2,44|0080560b6801561a68013b2b2b6a295647565856691a1800320e0e7b06060005000000002400000000000000|@8227,@8203| 8227:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d6765744e616d65283129 8228:D1,36|0080560a680156196801292b3b6a2956485657307e060003000000001c00000000000000|@8229| 8229:S53|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d676574417267283129 8230:D2,44|0080560b6801561a68013b2b2b6a295647565856691a1800320e0e7b06060005000000002400000000000000|@8227,@8203| 8231:D5,84|0080296801561b2a69562a2a1a49000e0e0c00035639680156486801292b3b1a3a000e0e0e0c0004293b1a33000c000303032c020b2c2a1a2a000e0e0e0c000356772a692707420e000000004c00000000000000|@8233,@8234,@8137,I251,@8232| 8232:O1|@8247 8233:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d67657441726773283129 8234:O1|@8235 8235:D5,68|00812c3b1a41000e0e0c000303033b02242b352c361a34002f2c2c6b3f2a69291a2d000e0e0c000203041a2700103b50293b692704430e0e000000003c00000000000000|@8237,I251,@8236,I105,@1784| 8236:D2,36|00802b56173b563856491a1b00300e7b070300060e0e0e0e000000001c00000000000000|@8239,@8238| 8237:S26|4578706f72745472656528292e6578706f72744c697374283229 8238:O1|@8240 8239:S40|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283129283129 8240:D8,108|00842e1a6a000e0e0e0c00021a65000e0e0c000203043b5002041a5b00102e352f36293b1a55000e0e0c000303033b021f1a4c001a4d003232323268062968011a45001a3e002d2c3434680629680166292f326a292d69652f2e0e0e7d090002000000006400000000000000|@8242,I105,I218,@8243,I251,@8246,@8238,@8241| 8241:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@8239| 8242:S37|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283329 8243:O4|@77,@2231,0,@8244 8244:O5|@8245,88,0,88,0 8245:S34|6d6c736f757263652f4d4c436f6d70696c65722f4578706f7274547265652e736d6c 8246:D1,36|00802b56185629563a564b5657300e7b070300060e0e0e0e000000001c00000000000000|@8239| 8247:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8232| 8248:O1|@8249 8249:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8248| 8250:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8252,@8251| 8251:O1|@8253 8252:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283129 8253:D8,124|00822c3529352a362f3630371a71001a7200343434680521051a6c004521061a6a00452930462f472e482b492c4a6c502a34462e472a482c496c503f2a69291a4e000e0e0e0c000203041a4700103b503b50220d35220e36220f371a3a000e0e0e0c00042a2a692f2a69270b440e0e0e000000007400000000000000|@8255,@8256,@8251,@8258,@8254,I105,@1784,@8137| 8254:D5,76|0080560b6801561a6801292b3b6a56391a3d000e0e0c0002280d2a69291a34000e0c000203041a2f00103b50293b692c567756882c1a2400220c0e7b06090005000000004400000000000000|@8260,@6977,I105,@1784,@8203| 8255:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283229 8256:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8257| 8257:S54|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 8258:D1,36|0080560a6801561968013b2b2b6a2956485657307e060003000000001c00000000000000|@8259| 8259:S53|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c6428322967657454797065283129 8260:S52|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296765744c6162283129 8261:O1|@8262 8262:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8261| 8263:O1|@8264 8264:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8263| 8265:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8219| 8266:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@8267| 8267:S29|545950455f5452454528292e747970654578706f727454726565283129 8268:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@8204,@8203| 8269:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8201| 8270:D6,84|0080560968011a4f002a69562a2a1a4b000c000356396801564868013b2b2b1a3e000e0e0e0c0004293b1a37000c000303032c020b2c2a1a2e000e0e0e0c000356772a692707420e000000004c00000000000000|@8272,@8273,@8234,@8137,I251,@8271| 8271:O1|@8276 8272:S68|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e73747273283129 8273:O1|@8274 8274:D2,36|00802b352c3629352a372c2a2c3b1a1700330e7b06070005000000001c00000000000000|@8275,@8203| 8275:S84|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e737472732831296578706f7274436f6e73747273283129 8276:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8271| 8277:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8279,@8278| 8278:O1|@8280 8279:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283129 8280:D14,308|00822c37293b1a2f010c00032e38293b1a25010e0e0c0003303a293b1a19010e0e0c00033235333634391a0f011a1001220f220f220f68052d1a08010e0c00021a05010e0e0c0002031e2d353b2a69291af1000e0e0c000203041aef00103b503b50293b696502013b1ae400220f6928092a69291acd000e0e0c000203041acb00103b503b503d220c346a280d2a69291ab1000e0e0c000203041aaf00103b503b50293b692c2a6930680122142a69220c3b69220c2a69292c1a98000e0c0003221a35221b36221c371a8c000e0c0004220c3b1a86000e0e0e0c0003030329020b29220d1a79000e0e0c0003293b1a6b000c000303032b020b2b2a1a66000e0e0e0c0003293b1a53000c0003030331020b312a1a52000e0e0e0c000322112a69271a440e0e0e0e0e000000002c01000000000000|@8282,I253,@8283,@8278,I105,I218,@1784,@8285,@8234,@8137,I251,@8287,@8289,@8281| 8281:O1|@8291 8282:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229 8283:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8284| 8284:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d617463682832296173506172656e74283129 8285:D8,100|00805607355617362d3c1a5b000c00032a2a1a57000c00032f3c1a4b000c00032d2a1a47000c0003293b691a42002a691a41002a691a40002a692f2a693b3b3b3b2d6805291a34000e0c000203041a2f00103b5029270c42000000005c00000000000000|@8286,I107,@7016,@1058,@7136,@1058,I105,@1784| 8286:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229283129 8287:O1|@8288 8288:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8287| 8289:O1|@8290 8290:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8289| 8291:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8281| 8292:O1|@8293 8293:D10,180|00812c1ab2000e0e0e0c00021aad000e0e0c000203892c352d362d1aa2000e0e0e0c00022b1a98000e0c00022a2a1a93000c000303482a3c1a8d000e0e0c0003032d293c1a81000e0e0c0003030c2f2d1a79000e0e0c000302132c3f1a71000e0e0c0003302a1a63000c000364020d2f3f2e3f2e1a5d000e0e0c000602013b650310292e1a51000e0e0c00032b2a6964020a292e1a41002f7e0600036502013b430e0e0e0e0e0e0e00000000ac00000000000000|@550,I105,I218,I223,I232,I113,I251,I252,I154,@8292| 8294:O1|@8295 8295:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8294| 8296:O1|@8297 8297:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8296| 8298:O1|@8299 8299:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8298| 8300:O1|@8301 8301:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8300| 8302:O1|@8303 8303:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8302| 8304:O2|13,@1461 8305:O1|@8306 8306:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8305| 8307:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8309,@8308| 8308:O1|@8310 8309:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283129 8310:D15,316|00822c36293b1a37010c00032e352f3730383139040200342c2b220c0e0c00045029352a362a2a692b352e352a2a1a13010c000303033c024a2a1a0b010c00021a09010e0e0c00020314291afa000e0e0e0c00021af5000e0e0c000202013b03212a3b2b3b3f2e1ae6000e0e0e0c00021ae1000e0e0c00031add000e0e0c000602013b6503392b362e361acf000c0003032a2b372e371ac3000c0003031b2b382e381ab7000c0003030c2b392e391aab000c000302013b02013b02013b02013b03032902631a98001a9900221022102210680521051a90004521061a8e00452934463347220c482b492c4a6c502a22104632472a482c496c503f2a69291a48000e0c000203041a6700103b503b502212352213362214371a5a000e0e0e0c00042a2a69332a692706270a440e0e0e0e0e000000003401000000000000|@8312,I253,I251,I105,I218,I223,I239,I154,I113,@8313,@8308,@8315,@8311,@1784,@8137| 8311:D4,68|0080560b6801561a6801292b3b6a280d564969291a31000e0e0c000203041a2b00103b50293b692b566756782c1a2000340e0e7b06080005000000003c00000000000000|@8317,I105,@1784,@8203| 8312:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229 8313:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8314| 8314:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 8315:D1,52|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8316| 8316:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229676574457870283129 8317:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296765744c6162283129 8318:O1|@8319 8319:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8318| 8320:O1|@8321 8321:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8320| 8322:O1|@8323 8323:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8322| 8324:D1,52|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8325| 8325:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657445787072283129 8326:D5,84|0080296801561b2a69562a2a1a49000e0e0c000356396801564868013b2b2b1a3a000e0e0e0c0004293b1a33000c000303032c020b2c2a1a2a000e0e0e0c000356772a692707420e000000004c00000000000000|@8328,@8234,@8137,I251,@8327| 8327:O1|@8329 8328:S48|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296765744d617463686573283129 8329:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8327| 8330:O1|@8331 8331:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8330| 8332:O1|@8333 8333:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8332| 8334:D1,52|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8325| 8335:D5,84|0080296801561b2a69562a2a1a49000e0e0c000356396801564868013b2b2b1a3a000e0e0e0c0004293b1a33000c000303032c020b2c2a1a2a000e0e0e0c000356772a692707420e000000004c00000000000000|@8328,@8234,@8137,I251,@8336| 8336:O1|@8337 8337:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8336| 8338:O1|@8339 8339:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8338| 8340:D1,52|0080560968013b2a3b6a0402002a56482b56670e0e0c00045029352a362a2a692705420e0e0e0e0e000000002c00000000000000|@8341| 8341:S44|4558504f52545f50415253455452454528292e6765744578706f727454726565283229676574457870283129 8342:O1|@8343 8343:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8342| 8344:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8346,@8345| 8345:O1|@8347 8346:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283129 8347:D18,404|00822c37291a90010e0c00021a8d010e0e0c000207ce29352e3a293528081a7f010c000303642f35303831391a75011a7601220c220c220c6805541a6e014521051a6c0145292f462d472b482c496c502a31462a472c486c503f2a69291a38010e0c000203041a4b01103b503b50220e35220f362210371a3e010e0e0e0c00042a2a69302a692709026a2f35303831391a29011a1201220c220c220c680521051a1d014521051a1b0145292f462d472b482c496c502a220c4630472a482c496c503f2a69291ad0000e0c000203041ae300103b503b50220e35220f362210371ad600020211000e0e0e0c00042a2a69302a6927096502892d3a293528081aa0000e0c000303162e352f39312b2b1ab8001ab900330e0e0e7b060900052e352f3830391aab001a8000343434680521051aa2004521051aa00045292f462d472b482c496c502a344630472a482c496c503f2a69291a42000e0e0e0c000203041a5300103b503b50220d35220e36220f371a46000e0e0e0c00042a2a69302a69270a64440e0e0e0e0e0e000000008c01000000000000|@8349,I105,I218,I251,@8350,@8345,@8352,@8354,@1784,@8137,@8356,@8357,@8359,@8360,@8203,@8362,@8363,@8348| 8348:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@8355,@8203| 8349:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283229 8350:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8351| 8351:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296173506172656e74283129 8352:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@8353,@8215| 8353:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744f6654797065283129 8354:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@8355,@8203| 8355:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744e616d65283129 8356:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8351| 8357:D1,52|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8358| 8358:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274457864656328322967657450726576696f7573457863283129 8359:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@8355,@8203| 8360:O2|@8361,0 8361:O2|13,@7751 8362:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8351| 8363:D1,52|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8358| 8364:O1|@8365 8365:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8364| 8366:O1|@8367 8367:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8366| 8368:O1|@8369 8369:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363b2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8368| 8370:O1|@8371 8371:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363d2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8370| 8372:O1|@8373 8373:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363c2b2b6a2c1a2a000e0e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@8372| 8374:O1|@8375 8375:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8374| 8376:O1|@8377 8377:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8376| 8378:O1|@8379 8379:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8378| 8380:O1|@8381 8381:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363d2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8380| 8382:O1|@8383 8383:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8382| 8384:O1|@8385 8385:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8384| 8386:O1|@8387 8387:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8386| 8388:O1|@8389 8389:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8388| 8390:O1|@8391 8391:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8390| 8392:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@8393,@8215| 8393:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657454797065283129 8394:D1,52|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000002c00000000000000|@8325| 8395:O1|@8396 8396:D6,108|00802b352c3629362a372a3b1a61000e0e0c0003293b1a5b000c000303033b020c29352938291a4f000c0002652e352f3630371a46000e0e0e0c00042a3b1a33000c0003030329020b292b1a32000e0e0e0c00032d2a692708420e0e0e0e0e0e000000006400000000000000|@8398,I253,I251,@1781,@8137,@8397| 8397:O1|@8399 8398:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745374727563744964656e74283129 8399:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8397| 8400:O1|@8401 8401:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8400| 8402:D103,1916|00802b363c1a78070e0c000303051a73070fdc2b3529353b1a6d070e0e0c00036407dd2b3529362d363c1a5f070c00032a2a691a5a073b1a5a070e0e0e0c00032a2a0e0e0e0c00026429353b1a39070e0e0c000303932939291a3c070e0c00021a39070e0e0c0002035f29361a29070e0e0c00021a25070e0e0c000203482935353e1a03070c000303312935362928281af5060e0e0c000303033c021b29287b1ae5060e0e0c000303033c020b29285b1ad5060e0e0c00036402013b1add060e0e0c000202013b02013b03192a1ad006691ad0062a691acf062a693b3e3c3b2d68056602012a64020129293b6902027b061ab8062a691ab7062a693b3c3b020208003b2d680527090fce2b363c1a70060e0c000303051a9b060fd52b3529353c1a65060e0e0c00036407dd2b3529362a372e363c1a55060e0e0c0003293b1a3f060c000303051a6f060fd1293c1a3c060e0c0003293b1a27060c000303051a5b060fd12c362a3c1a22060e0e0e0c00032a2a691a4a063b1a1a060e0e0e0c00031a41062a0e0c0002642a2a0e0e0c0002642d3c1aea050e0e0e0c000303051a27060fce30372e3c1ae2050e0e0e0c0003293b1acb050c000303051a0f060fcb2a362a3c1ac6050e0e0e0c00032a2a691afe053b1abe05020292050e0e0e0c00032a2a0e0e0e0c0002642d3c1a920502027a050e0e0e0c000303051ad7050fcd2e382e3c1a860502021f020e0e0e0c00032a2a691aba053b1a7a050202e7010e0e0e0c00032a2a0e0e0e0c000264313d1a4e05020284010e0e0e0c000303051a970502d33235323c1a42050e0e0e0c00032a2a691a86053b1a3a050e0e0e0c00032a2a0e0e0e0c000264220c3e1a110502022e010e0e0c000303051a6305027e220d37220d3c1a04050202bc000e0c00032a2a691a3a053b1afa040e0e0e0c00032a2a0e0e0e0c00026422113922113c1ada040e0e0e0c00032a2a691a12053b1ad2040e0e0e0c00032a2a020261000e0e0e0c000264291a0b05691a0b052a691a0a052a691a09052a691a08052a69322a691a04052a691a03052a69270f1a00052a691aff042a692c2a691afb042a691afa042a6927091af7042a691af6042a692c2a691af2042a691af1042a6927091aee042a691aed042a692c2a691ae9042a691ae8042a6927091ae5042a693b3c3b3b2d6805220c35333c1a30040e0c00032a2a691a76043b1a2a040e0e0e0c00032a2a0e0e0e0c000264291ab704691ab7042a691ab6042a691ab5042a691ab4042a69322a691ab0042a691aaf042a6927101aac042a691aab042a692c2a691aa7042a691aa6042a6927091aa3042a693b3c3b3b2d68052d3c1ac1030e0e0c00032f2a691a8e043b1aba030e0e0e0c00031a85042a0e0c0002642a2a0e0e0c000264291a7704691a77042a691a76042a692f2a69270a1a70042a693b3c3b3b2d6805293b691a65042a691a64042a693b3c3b3b2d6805270a0fcf2b363c1a51030e0e0c000303051a4b040fd12b3529353d1a45030e0e0c00036407cd2b3529362a372e363c1a35030e0e0c0003293b1a1f030c000303051a1f040fd2293c1a1c030e0c00032c2a691a12043b1a16030e0e0e0c00031a09045687693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1aea020e0e0e0c0003293b1ad3020c000303051adf030fd12e362a3c1ace020e0e0e0c00032a2a691a06033b1ac6020e0e0e0c00032a2a0e0e0e0c0002642d3c1a9e020e0e0e0c000303051aab030fcd32382e3c1a9602020272020e0e0e0c00032a2a691aca023b1a8a0202025e020e0e0e0c00032a2a020262010e0e0e0c000264313d1a5a020e0e0e0c000303051a6b0302d3220d35323c1a5102020219010e0e0c00032a2a691a92023b1a46020e0e0e0c00032a2a0e0e0e0c000264220c3e1a1d020e0e0c000303051a3303027e221137220d3c1a14020e0c00032a2a691a4e023b1a0e020202ae000e0e0e0c00032a2a0e0e0e0c00026422153922113c1aea010e0e0e0c00032a2a691a22023b1ae2010e0e0e0c00032a2a020261000e0e0e0c000264291adb02691adb022a691ada022a691ad9022a691ad8022a69322a691ad4022a691ad3022a69270f1ad0022a691acf022a692c2a691acb022a691aca022a6927091ac7022a691ac6022a692c2a691ac2022a691ac1022a6927091abe022a691abd022a692c2a691ab9022a691ab8022a6927091ab5022a693b3c3b3b2d6805291aac02691aac022a691aab022a69302a69270a1aa5022a693b3c3b3b2d6805293b691a9a022a691a99022a693b3c3b3b2d6805270a0fdb2b363c1afe000e0e0e0c000303051a7f0202dd2b3529362d363c1af3000c00032a2a6956483b1aef000c00032a2a0e0e0e0c00026429353b1ad1000e0e0c000303932939291ad4000e0c00021ad1000e0e0c0002035f29361ac1000e0e0c00021abd000e0e0c000203482935353e1a9b000c000303312935362928281a8d000e0e0c000303033c021b29287b1a7d000e0e0c000303033c020b29285b1a6d000e0e0c00036402013b1a75000e0e0c000202013b02013b03192a1a6800691a68002a691a67002a693b3e3c3b2d68056602012a64020129293b69020213001ab4012a691ab3012a693b3c3b3b2d68052709420e0e0e000000007407000000000000|@8404,I234,@2016,I251,I107,@163,I253,I105,I218,@1087,@1088,@1060,@1058,@8407,@2016,@1043,@1071,@160,@8414,@1071,@1071,@14,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1074,@1058,@2019,@1058,@1059,@1058,@8420,@1058,@1059,@1058,@8422,@1086,@11,@8424,@1056,@1058,@1059,@1060,@1058,@8448,@2016,@1043,@155,@8455,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1056,@1058,@1059,@1060,@1058,@8456,@2016,@1058,@8403| 8403:O5|0,0,0,@8464,@8463 8404:S14|7072696e742d66756e456e747279 8405:O1|@8406 8406:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8407:O5|0,0,0,@8409,@8408 8408:O2|@8412,0 8409:O2|@8410,0 8410:O2|0,@8411 8411:O5|@8158,221,221,0,0 8412:O2|3,@8413 8413:S13|46756e436f6e73747261696e74 8414:O4|0,@8415,3,1 8415:O1|@8416 8416:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@8417,@164,I253| 8417:S11|7072696e742d7479706573 8418:O1|@8419 8419:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8420:O2|3,@8421 8421:S10|6c6f636174696f6e203d 8422:O2|3,@8423 8423:S9|65787054797065203d 8424:O4|0,@8425,2,3 8425:O1|@8426 8426:D22,276|00802b363b1a10010e0c000303051a0b010fdd2b35362c363c1a04010e0c00032a2a691afe003b1afe000e0e0e0c00031af9002a0e0c0002642a2a0e0e0c0002642f363c1ad1000e0e0c000303051adf0002862f353530363c1ac4000e0c00032a2a691abe003b1abe000e0e0e0c00031ac1002a0e0c0002642a2a0e0e0c00026433353734363c1a96000e0e0e0c00032a2a691a8e003b1a8e000e0e0e0c00031a95002a0e0c0002642a2a0e0e0c000264291a8700691a87002a691a86002a691a85002a691a84002a69322a691a80002a691a7f002a69270f1a7c002a691a7b002a692c2a691a77002a691a7600020204002a6927091a6f002a693b3c3b3b2d680565420e0e0e0e000000000c01000000000000|@353,I234,@1071,I107,@160,I253,@8428,@1071,@8431,@8437,@1074,@1058,@8443,@1058,@1059,@1058,@8445,@1058,@1059,@1058,@8427,@1086| 8427:O2|3,@8447 8428:O4|0,@8429,1,1 8429:O1|@8430 8430:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@2625,@162,I253| 8431:O4|0,@8432,3,1 8432:O1|@8433 8433:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@8434| 8434:O4|0,@8435,2,1 8435:O1|@8436 8436:D30,420|00802b363b1aa0010e0c000303051a9b010fcd2b35362c363c1a94010e0c00032a2a691a8e013b1a8e010e0e0e0c00032a2a0e0e0e0c0002642f363c1a69010e0e0c000303051a73010fdc2f353830363c1a5c010e0c00032a2a691a56013b1a56010e0e0e0c00032a2a0e0e0e0c00026433363d1a31010e0e0c000303051a3f0102d333353534363c1a24010e0c00032a2a691a2e013b1a1e010e0e0e0c00032a2a0e0e0e0c000264220e363e1af8000e0c000303051a0f010282220e3537220f363c1aea000e0e0e0c00032a2a691ae2003b1ae2000e0e0e0c00032a2a0202a6000e0e0e0c000264221235392213363c1abc000e0c00032a2a691ab6003b1ab6000e0e0e0c00032a2a0e0e0e0c000264291ab700691ab7002a691ab6002a691ab5002a69020246001ab0002a69322a691aac002a691aab002a69270f1aa8002a691aa7002a692c2a691aa3002a691aa2002a6927091a9f002a691a9e002a692c2a691a9a002a691a99002a6927091a96002a691a95002a692c2a691a91002a691a90002a6927091a8d002a693b3c3b3b2d680565420e0e000000009c01000000000000|@353,I234,@1071,I107,@14,I253,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086| 8437:O4|0,@8438,3,1 8438:O1|@8439 8439:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@8440| 8440:O4|0,@8441,2,2 8441:O1|@8442 8442:D35,516|00802b363b1a00020e0c000303051afb010fcf2b35352c363c1af4010e0c0003293b1ae3010c000303051ae7010fcd2a362a3c1ada010e0e0e0c00032a2a691ad6013b1ad6010e0e0e0c00032a2a0e0e0e0c0002642d3c1aae010e0e0e0c000303051abb010fdc2e382e3c1aa2010e0e0e0c00032a2a691a9e013b1a9e010e0e0e0c00032a2a0e0e0e0c000264313d1a76010e0e0e0c000303051a870102d33235323c1a6a010e0e0e0c00032a2a691a76013b1a66010e0e0e0c00032a2a0e0e0e0c000264220c3e1a3d010e0e0c000303051a57010282220d37220d3c1a3001020205010e0c00032a2a691a2a013b1a2a010e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1a02010e0e0e0c00032a2a691afe003b1afe000e0e0e0c00032a2a0e0e0e0c000264291aff00691aff002a691afe002a691afd002a69020246001af8002a69322a691af4002a691af3002a69270f1af0002a691aef002a692c2a691aeb002a691aea002a6927091ae7002a691ae6002a692c2a691ae2002a691ae1002a6927091ade002a691add002a692c2a691ad9002a691ad8002a6927091ad5002a693b3c3b3b2d680530353631363c1a57000c00032a2a691a66003b1a56000e0e0e0c00032a2a0e0e0e0c000264291aa700691aa7002a691aa6002a69302a69270c1aa0002a693b3c3b3b2d680565420e00000000fc01000000000000|@353,I234,@1043,I107,@1071,@14,I253,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1056,@1058,@1059,@1060| 8443:O2|3,@8444 8444:S14|726563757273697665526566203d 8445:O2|3,@8446 8446:S10|6c6f63616c526566203d 8447:S13|6578706f72746564526566203d 8448:O5|0,0,0,@8450,@8449 8449:O2|@8453,0 8450:O2|@8451,0 8451:O2|0,@8452 8452:O5|@8158,219,219,0,0 8453:O2|3,@8454 8454:S8|46756e4964656e74 8455:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@8404,I253| 8456:O5|0,0,0,@8458,@8457 8457:O2|@8461,0 8458:O2|@8459,0 8459:O2|0,@8460 8460:O5|@8158,222,222,0,0 8461:O2|3,@8462 8462:S10|46756e496e6669786564 8463:O2|@8467,0 8464:O2|@8465,0 8465:O2|0,@8466 8466:O5|@8158,220,220,0,0 8467:O2|3,@8468 8468:S8|46756e5074726565 8469:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@8470| 8470:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283129 8471:D14,404|00812b353d1a90010e0c000303452b362c371a87012c30306b29680156472a692d2a1a7b010c00033235333634371a73010c0004293b1a5f010c000303032a020b2a2a1a62010e0e0e0c00032f2a6927080fd52b353b1a3f010c0003030e2b362d2a1a47012e0e0e7e0500032b353e1a26010e0e0e0c0003031a2b360402002e2b2b56580e0c00045029352a362a2a6927040fd52b362c372a36293b1a11010e0e0c00032c372c1a0a010e0e0e0c00021a05010e0e0c000203632c352935293b1aed000e0e0c00032b36293b1ae1000e0e0c00032d37293b1ad5000e0e0c0003291ad8000e0c00022e3b1aab000c0003030329020b292f1ac6000e0e0e0c0003402e2b6a291aac000e0c000203041ab300103b503b50293b69270a02013b280d2c69291a8e0002025b000e0e0e0c000203041a8f00103b503b503d2c69291a73000c000203041a7b00103b503b503435220c36220d371a4b000c00042a2a692c2a69293b1a310002021a000e0e0c000303032e020b2e2a1a4e000e0e0e0c0003302a69270c430e0e000000008c01000000000000|@8473,I251,@8474,@8234,@8137,@8476,@8215,I253,I105,I218,@8478,@8480,@1784,@8472| 8472:O1|@8482 8473:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283229 8474:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@8475| 8475:S63|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e7472792832296173506172656e74283129 8476:O1|@8477 8477:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8476| 8478:O1|@8479 8479:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8478| 8480:O1|@8481 8481:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8480| 8482:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8472| 8483:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8485,@8484| 8484:O1|@8486 8485:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283129 8486:D14,252|00822c362d36291af6000e0e0e0c00021af1000e0e0c0002030d2936293b1ae7000c00036402013b6403602d3629352f37293b1ad6000e0e0e0c0003293a32383435220c36220d371ac5000e0e0c00041ac1001ac200220e220e220e68052f2d2b220e1ab6000e0e0e0c00052b3b1a97000c0003030329020b292c1aa2000e0e0e0c00032d2a69270a025e2d37293b1a7a000e0e0e0c0003293a30383235333634371a6b000c00041a79001a6a00220c220c220c68051a6f00332e6a2a68012a2a69322a1a65000e0e0c00032e3b1a37000c0003030329020b292f1a52000e0e0e0c0003302a69270b64440e0e0e0e0e00000000f400000000000000|@8488,I105,I218,I251,I253,@8137,@8489,@8484,@8491,@8504,@8506,@8508,@8234,@8487| 8487:O1|@8517 8488:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283229 8489:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8490| 8490:S57|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274464228322961734368696c642d283129 8491:O1|@8492 8492:D12,412|00832e38293b1a97010c0003303529352a362b372c38220c362b3c1a86010e0e0e0c000303682d1a7e010e0e0e0c00021a79010e0e0c000203512d35293528191a61010e0e0c0003033d2936291a58010e0c00021a55010e0e0c000203252936291a44010e0c00021a41010e0e0c0002030d2936293b1a2b010c00036402013b6402013b6402013b6402013b02013b03362d352e362a362b382a352b3629353e2c693c220c22166a3e2c69293b692b2a692d2a693d2a346a220c1af3000c00022a2a69270f02113c2d220e6a2e1ae4000e0c00022a2a69652b1acc000e0c00021ac9000e0e0c0002030b2b353b2a69293b696502013b311aae000e0e0e0c00021aa9000e0e0c0002031e31353b2a69291a95000e0e0c000203041a9b00103b503b50293b696502013b220e6801220e2a693e2f69293b69293b1a68000e0c000303032e020b2e2a1a72000e0e0e0c0003293b1a4f000c0003030330020b302a1a5e000e0e0e0c0003292e1a57000c0003303b1a2f000c0003030329020b29311a460022167e18000327121f040e0e0e0e000000009401000000000000|@8494,I253,I251,I105,I218,@8495,@8497,@1784,@8499,@8501,@8234,@8493| 8493:O1|@8503 8494:S51|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727441436c61757365283329 8495:O1|@8496 8496:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363e2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8495| 8497:O1|@8498 8498:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363e2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@8497| 8499:O1|@8500 8500:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8499| 8501:O1|@8502 8502:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8501| 8503:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8493| 8504:O1|@8505 8505:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8504| 8506:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8507| 8507:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f727454686973283129 8508:D2,36|00802b352c36562756381a1b002f0e7b060300050e0e0e0e000000001c00000000000000|@8510,@8509| 8509:O1|@8511 8510:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283129 8511:D7,84|00832d372f35303631371a4b000c00041a49001a4a00323232326806302f2b321a41000e0e0c00052b3b1a3b000c0003030329020b292c1a32000e0e0e0c00032d2a6927051f040e000000004c00000000000000|@8513,@8137,@8514,@8509,@8491,I251,@8512| 8512:O1|@8516 8513:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283229 8514:D1,36|008056085619562a563b56472f0e0e7b060300050e0e0e0e000000001c00000000000000|@8515| 8515:S72|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c6175736528322961734368696c642d283129 8516:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8512| 8517:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8487| 8518:O1|@8519 8519:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8518| 8520:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@8522,@8521| 8521:O1|@8523 8522:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283129 8523:D7,100|00822c352d362e373035313632371a57000c00041a55001a56003333336805296801312a692e3b69302a69292c1a44000e0c00032f3b1a3f000c0003030329020b29301a36000e0e0e0c0003312a69270b440e0e0e0e0e0e000000005c00000000000000|@8525,@8137,@8526,@8521,@8234,I251,@8524| 8524:O1|@8528 8525:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283229 8526:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@8527| 8527:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727456422832296578706f727454686973283129 8528:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8524| 8529:O1|@8530 8530:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8529| 8531:O1|@8532 8532:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8531| 8533:O1|@8534 8534:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8533| 8535:O1|@8536 8536:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8535| 8537:O1|@8538 8538:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8537| 8539:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8135| 8540:O2|@8541,@7438 8541:D1,44|00802b352c360402002b2b2b56670e0e0e0c00045029352a362a2a692705420e000000002400000000000000|@8542| 8542:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283129 8543:O1|@8544 8544:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8545:O1|@8546 8546:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8547:O1|@8548 8548:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8549:D6,68|00802b352c3629352a3629565c1a38000e0c00032b2a692e2a1a300056976956981a2c001a2d0056c956da56eb1a280022110e7b0b09000a000000003c00000000000000|@8551,@8552,@8550,@7346,@7344,@7327| 8550:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 8551:S66|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657246696e616c54797065283129 8552:O1|@8553 8553:D7,124|00812c1a7a000e0e0e0c00021a75000e0e0c000203512c352d362a352b362c382d39313b1a61000e0e0c0003323b1a57000c0003293c1a53000c0003343b2b1a4e000e0e0e0c0004503b2c6930302b31313b3b680732220e1a39000e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,I253,I106,I255,@8552| 8554:O1|@8555 8555:D14,324|00893435220c36220d372a07dc291a37010c00021a35010e0e0c000203043b5002041a2b01103b5029352a362a352b36221123082212230c2a2a691a1601221322132f6b2a2f2b1a0e010e0e0e0c000429352937293629353c1a00010e0c000364031429362936291af5001aee000e0e0e0c00036502013b6503033b028930291ac5000e0e0c00021ac1000e0e0c0002037329352a362a352b36221b2308221c230c2a2a691abc00221d221d2f6b2a2f2b1aa4000e0c00043b221d221d221d221d1aa4000e0c00063b221e221e221e221e1a94000e0c00062b1a90002c220f1a8a002e221d2228020220002227222622241a7c000e0c000c5032250c260b1e7f3b270b02013b642709022929220e220d220d1a5f000c0005292d220f220e220d342210220f220f1a4e00220f0e0e0e7b0b10000a661f0a0e000000003c01000000000000|@8557,I105,I218,@8558,@8560,@7577,I251,@70,@8564,@7320,I48,@8566,@8609,@8556| 8556:O1|@8613 8557:S47|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e74283329 8558:O4|@77,@2231,0,@8559 8559:O5|@6671,709,0,709,0 8560:D7,100|00802b1a62001a63000c00031a61005627693e2b69291a5b000c000203041a5700103b50293b693b3b3b3b2d6805291a42000e0e0e0c000203041a3b00103b5056583c2e56892d1a3200220c0e0e0e7b070800060e0e0e0e000000005c00000000000000|@8562,@8563,@389,@8561,I105,@1784,@7336| 8561:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 8562:S66|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e742833296c6f6f6b75704661696c757265283129283129 8563:S14|20696e207369676e61747572652e 8564:D7,100|00802b1a62001a63000c00031a61005627693e2b69291a5b000c000203041a5700103b50293b693b3b3b3b2d6805291a42000e0e0e0c000203041a3b00103b5056583c2e56892d1a3200220c0e0e0e7b070800060e0e0e0e000000005c00000000000000|@8562,@8563,@389,@8565,I105,@1784,@7336| 8565:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 8566:O1|@8567 8567:D34,1252|008a220c3533352a37293629353c1ad7040c000364031429362936291acd041ac6040e0e0e0c00036502013b6403033c02272937293629353c1aac040e0c000364031429362936291aa1041a9a040e0e0e0c00036502013b6403033b0fca2a37293629353c1a80040e0c000303042937024129353b1a70040e0c000303042936023129363b2a291a66040e0e0e0c00021a61040e0e0c0002031729362b3c1a57040c0003292b25042504511e253b6502012a662c37293629353c1a2b040c000303042937024129353b1a1c040e0c000303042936023129363b2a291a12040e0e0e0c00021a0d040e0e0c0002031729362b3c1a03040c0003292b25042504511e253b6502012a662c2a1af0030e0c000327061adf030c0002036e1ae3033169220f220f1ade030202a6030e0e0e0c0003220d220d1acd030e0e0c0003291ac803691ac8032a691ac7032a691ac6032a692e2a691ac2032a691ac1032a693b3e3b3b2d6805291a88030e0c000203041aaf03103b503b5022113c220c22162d1aa30322147b071a00062a37293629353b1a56030e0e0e0c0003030d29382922100e0e0c00026402012a2c37293629353b1a36030e0e0e0c0003030d29382922100e0e0c00026402012a2c3629353b1a18030e0c00030383293829220e1a4a030e0e0e0c000303033b026d29220e1a3d030e0e0c000329220e2a1a35030e0e0c000329353c1ae2020e0e0e0c0003031e2936292c1a1f030c000303041a1b03103b503b50292503511e313b640202293565293b1ab4020e0c000303033b0218293e1aa6020e0e0e0c000303043b5002041aeb02103b503c656402013b641a96020e0e0e0c000207d7303522142a1ad2020e0e0e0c00033e2a69291a75020e0e0c000203041a9b02103b503b502f3729352a362b371aaf020c0004293b691aaa022a691aa9022a691aa8022a692f2a693b3e3b3b2d6805291a38020e0c000203041a5f02103b503b501a8b02221969222022201a31020e0e0c0003221e221e1a25020e0e0c00032c3b691a6e022a691a6d022a691a6c022a692d2a691a10022a691a0f022a691a0e022a69322a691a0a022a691a09022a693b3e3b3b2d6805291ad0010e0c000203041af701103b503b5022263c2210222b2d1aeb012229020205007b072f0006293629353b1a9c010e0c00030383293829220e1ace010e0e0e0c000303033b026d29220e1ac1010e0e0c000329220e2a1ab9010e0e0c000329353c1a66010e0e0e0c0003031e2936292c1aa3010c000303041a9f01103b503b50292503511e313b640202293565293b1a38010e0c000303033b0218293e1a2a010e0e0e0c000303043b5002041a6f01103b503c656402013b641a1a010e0e0e0c000207d72f3522112a1a56010e0e0e0c00033e2a69291af9000e0e0c000203041a1f01103b503b502c3729352a362b371a33010c0004293b691a2e012a691a2d012a691a2c012a692f2a693b3e3b3b2d6805291abc000e0c000203041ae300103b503b501a1f01221969222022201ab5000e0e0c0003221e221e1aa9000e0e0c00032c3b691af2002a691af1002a691af0002a692d2a691a94002a691a93002a691a92002a69322a691a8e002a691a8d002a693b3e3b3b2d6805291a54000e0c000203041a7b00103b503b5022263c2210222b2d1a6f002229020205007b072f00062c2a220d220d1a9f00220e7b06150005651f0b0e0e0e0e0e00000000dc04000000000000|@8569,I251,@70,I105,I218,I106,I113,@8570,@8572,@8575,@1058,@8582,@1058,@1830,@8584,@1784,@7336,I234,I107,@4919,I231,@7424,@8586,@389,@8589,@1058,@8592,@1058,@8594,@1058,@8578,@1088,@8595,@8568| 8568:O1|@8596 8569:S35|5349474e41545552455328292e73696756616c28362973686172655479706573283829 8570:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8571,@6972| 8571:S50|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e745368617265283129283129 8572:O1|@8573 8573:D7,204|00812c35293629291ac5000e0e0c00021ac1000e0e0c0002031f29352a362a353b1ab4000e0c000303052a68010207292503511e2c3b6502013b64291a91000e0e0c00021a8d000e0e0c00020311293529353b1a82000e0e0e0c00036402013b031c293529363b2a69291a63000c000203041a6700103b50293b696602013b2c35302a1a5a000e0e0e0c00033e2a69291a3d000e0e0c000203041a4700103b50293b693b3b3b302d6805291a22000e0e0e0c000203041a2b00103b502927094300000000c400000000000000|@8574,I105,I218,I251,@1784,@389,@1784| 8574:S62|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e74536861726528312973686f7754797065436f6e73283229 8575:O2|@1088,@8576 8576:O2|@8578,@8577 8577:O2|@1058,@8579 8578:O2|3,46 8579:O2|@8580,0 8580:O2|3,@8581 8581:S58|546865207479706520636f6e7374727563746f72732074616b6520646966666572656e74206e756d62657273206f6620617267756d656e74732e 8582:O2|3,@8583 8583:S9|776974682074797065 8584:O2|3,@8585 8585:S17|43616e6e6f742073686172652074797065 8586:O4|@35,@863,@8588,@8587 8587:O5|@6671,504,0,504,0 8588:S5|6973566172 8589:O1|@8590 8590:D12,268|00822b1a0a011a0b010c000303033c02222b1a03010c00021a01010e0e0c000203102b3b1ae9003b3f1af4000e0c000602013b034c3b2d69291adc000e0c000203041adf00103b50293b693e3069291ac6000e0e0e0c000203041acb00103b50293b693b3b3b2e2d6805291aaa000e0e0e0c000203041aaf00103b50292705027e3b2d69291a90000e0c000203041a9300103b50293b693e3069291a7a000e0e0e0c000203041a7f00103b501a7d002f1a7d000e0e0c0003291a78001a71000e0e0c00033e2a69291a4d000e0e0c000203041a5300103b50293b691a5a002a692e2a693b3b3b332d6805291a2a000e0e0e0c000203041a2f00103b5029270a44000000000401000000000000|@8591,I48,I251,I105,I218,I154,@1784,@1784,@3035,@389,@3033,@1058| 8591:S25|5349474e41545552455328292e7072696e7444657363283329 8592:O2|3,@8593 8593:S21|697320616c726561647920646566696e6564206173 8594:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8571,@6972| 8595:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8571,@6972| 8596:D16,580|00832e3629353b1a3e020e0e0e0c000303112e3629353b1a2e020e0e0e0c00036402013b6403043b5002041a1e02103b502e3629382f3629382b311a12020e0e0e0c000329312a1a0a020e0e0e0c000329353c1af2010e0e0e0c0003031e2936292c1af3010c000303041aef01103b503b50292503511e313b64020129652b331acd010e0e0c000329332a1ac6010e0e0e0c000329353c1aae010e0e0e0c0003031e2936292c1aaf010c000303041aab01103b503b50292503511e313b64020129652b353e1a80010e0c000303342b36293629353b1a70010e0c000303202b353e1a64010e0c000303112b36293629353b1a54010e0c00036502013b02013b6502013b03043b5002041a5401103b502b362c372a3629362a372b382c392f37313632372a3629362a372b382c39322b1a32010e0e0e0c000303033b0fd0322b1a26010e0e0e0c000303033202012a332c1a19010e0e0c000303033302012b3303033c02012b220e301af9000e0e0c000303043b5002041af700103b50220d353c1ac5000e0e0c00030311220d36293b1ae2000e0e0e0c0003640203220d3603033c021a2e353c1a9f000c0003030d2e36293b1abf000c00036402022e363b2a693b22112b302f68051aad002a220f6a220c3b1a73000c000303042214020a2214220d1a97000c00033e2b2b6a3122241a5e000e0e0e0c000322232a2c1a81000e0e0c0004503122251a4500020225000e0e0c00033322261a36000e0e0e0c00033c2a6922262c2b1a560022290e0e0e7b052a000427171f04000000003c02000000000000|@8598,I251,@8599,I107,@4919,I231,@7424,@8602,I113,I234,I233,@8605,I253,@740,@8597,@4873| 8597:O1|@8608 8598:S44|5349474e41545552455328292e73696756616c2836296c696e6b466c657869626c6554797065496473283229 8599:O4|@35,@863,@8601,@8600 8600:O5|@6671,552,0,552,0 8601:S30|6c696e6b466c657869626c65547970654964733a206e6f7420626f756e64 8602:O4|@35,@863,@8604,@8603 8603:O5|@6671,550,0,550,0 8604:S33|6c696e6b466c657869626c65547970654964733a206e6f74207661726961626c65 8605:O4|@35,@863,@8607,@8606 8606:O5|@6671,540,0,540,0 8607:S38|6c696e6b466c657869626c65547970654964733a20646966666572656e742061726974696573 8608:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8597| 8609:O1|@8610 8610:D8,124|00832e1a7a000e0e0e0c00021a75000e0e0c000203512e352f362a352b3631230c1a640032322d6b1a61002b2e2c1a5f000c0005293b1a5b000c000303122e220c220c220c1a5000220d0e7b060d000529352f220d220d220d1a3c000e0c00052a2a69270902013b1f040e0e0e0e0e0e000000007400000000000000|@4262,I105,I218,@8611,@7351,@7477,I251,@8609| 8611:D7,100|00802b1a62001a63000c00031a61005627693e2b69291a5b000c000203041a5700103b50293b693b3b3b3b2d6805291a42000e0e0e0c000203041a3b00103b5056583c2e56892d1a3200220c0e0e0e7b070800060e0e0e0e000000005c00000000000000|@8562,@8563,@389,@8612,I105,@1784,@7336| 8612:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 8613:D3,44|0088332e312f2f1a26000e0e0e0c0006313131220d220d1a1a00317b080b0007000000002400000000000000|@8615,@8616,@8614| 8614:O1|@8618 8615:S41|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329 8616:O1|@8617 8617:D6,100|00842f1a62000e0e0e0c00021a5d000e0e0c000203392f3530362a3529282e1a4e000e0e0e0c00033b333333331a44000e0c00062d2b2b6a2d220c220c220c220c1a34000e0c00062a2a69270702013b1f050e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,@389,@7320,@8616| 8618:D13,332|0085040200311a47012a1a47010c00021a45010e0e0c0002031c2a352b362a2c1a39010e0e0c00032a2a2505250526031e2726030209292c2a35452a3646515129352a362a1a18011a19010e0e0c0003291a14013b3b1a13010c00052b1a10011a01010e0e0c0003291afc003b3b1afb000c00052b291adb000c00021ad9000e0e0c0002037c29352a362a1ac6000e0e0e0c00021ac1000e0e0c000203043b5002041acf00103b502a352b362a352b362c372c291a9d000e0e0c00021a99000e0e0c0002032e29352a362a352b362c373131312e2e2e221e221e2223222322231a95000e0e0c000c502c250626051e3b260502023b50502e250826071e87260702023b505029291a4a000e0e0e0c00021a45000e0e0c0002032129352a362a221122112211221122111a50000e0c000750292503511e2f3b6502013b27081f06000000004401000000000000|@8620,@740,I105,I218,@8621,@8626,@1982,I48,@8631,@8634,@8619,@8566,@8614| 8619:O4|@77,@2231,0,@8637 8620:S56|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329736861726553747275637473283129 8621:O1|@8622 8622:D4,52|00812c35293729352a39303631371a27002c2b6a1a25002a2d6a2e342b1a2000220d0e7b050c0004000000002c00000000000000|@8624,@8625,@8623,@1898| 8623:D8,212|00822c2c2a1ad0000e0c00021acd000e0e0c000203ac2a352b362b352c362c35291abc001abd000e0e0c00036403442c351aac001aad000e0e0c000303043b5002041aa300102c375678220c1a9d000e0e0c000329282e1a92000e0e0e0c00032b2a56b76a220e2a69292f69302a69270602402c35291a77001a68000e0c000364032d2c351a68001a59000e0e0c000303043b5002041a4f00102c3729568856976a220c2a69292e69292e69270402032a2a692c2a2507250726051eb73b270502012965440e0e0e00000000cc00000000000000|@1901,I105,I218,@38,I251,@1840,@389,@27| 8624:S40|5349474e41545552455328292e73696756616c28362973747275637473416e645479706573283229 8625:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 8626:O1|@8627 8627:D2,28|00802b351a19002a6964420e0e0e0e0e000000001400000000000000|@8629,@8628| 8628:D2,28|00802b3556172a1a16002e0e7e040003000000001400000000000000|@8630,I29| 8629:S59|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283129 8630:S62|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283229283129 8631:O1|@8632 8632:D8,284|00832e1a1a010e0e0e0c00021a15010e0e0c000203ca2e352f362a352b36312b1a05010e0e0c000303033c024a311aef000c00021aed000e0e0c000203142a1ade000e0e0e0c00021ad9000e0e0c000202013b0321313b2c3b3f2f1ace000e0e0e0c00021ac9000e0e0c00031ac5000e0e0c000602013b03132931692c332b331ab500340e0e0e7b060b0005301a90000e0c00021a8d000e0e0c000203323036293b1a83000c000303122a3b692d2d2b341a8400220c0e7b060c00052a3b693232692e2e2c2c1a6f00220d7b060d0005293b692c2c2b331a5e00347b060b00052c1a3c000e0c00021a39000e0e0c000203152c36293b1a2f000c000303032c02032d2d696402012b1f040e0e0e0e0e0e000000001401000000000000|@8633,I105,I218,I251,I223,I239,I154,@8631| 8633:S54|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129676574457175616c73283429 8634:O1|@8635 8635:D2,28|00802b351a19002a6964420e0e0e0e0e000000001400000000000000|@8629,@8636| 8636:D2,28|00802b3556172a1a16002e0e7e040003000000001400000000000000|@8630,I29| 8637:O5|@6671,676,0,676,0 8638:O1|@8639 8639:D15,372|009d3c284022201a6e010e0e0e0c0004221e23081a65012a22206a2220230c1a5e012a22216a1a5b011a5c01222122212221222122211a530133222322232223220c680d0402002226353b1a42010e0e0e0c000303382226362227370406002b2e2c3b22152e2221222122212221222122212221222122212221222c0e0c00115029352a392e2b452a46260602822226353d1afb000c0003033d22263629352a362b372c382d392c2b2d2c31220c221a222522252225222522252225222522252225222522240e0e0e0c0012302a35452a3946260802392226362227372228380406002c2c2c3122162e221b22232223221d222422242224222422241a95000e0e0c00105029352a392f2b452a46260729352a361a8100220e2227221d2212221e220e68071a7400220e2227221e2213221f220f68071a6700220e2223221f2214222022106807292c2c6a2e2a2f3c1a5200323b1a51000e0e0c0008220d3b1a4a0022127e2e0003000000006c01000000000000|@8641,I11,@8642,@8643,@7353,@7358,@7363,I251,@7382,@8644,@8652,@8640,I48,@7585,I253| 8640:D10,140|00802b352c3629352a362b372c382d392b353b1a7a000e0e0e0c000303043b5002041a6f0010567c3b1a6c000e0c0003293c1a67000c0003569c3b2b1a61000e0e0c0004503b2b6930302b30303b3b6807332a1a4e0056e76956e81a4a001a4b001212000100030012130001000400121400010005001a370022167b0b0e000a000000008400000000000000|@8656,I251,@8649,I253,I106,I255,@8655,@7331,@7332,@7327| 8641:S65|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229 8642:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8643:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8644:D7,100|00802b352c3629352a36293b1a59000e0e0c000303032b02182a352b372c362b2a2c6a2d569c1a43000c00032a2a6927052d2a1a3a0056876956881a36001a370056b956ca56db1a320022100e0e0e7b0b08000a0e0e0e0e000000005c00000000000000|@8646,I251,@8647,@8645,@7346,@7344,@7327| 8645:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 8646:S77|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657254797065283129 8647:O1|@8648 8648:D9,140|00812c1a8a000e0e0e0c00021a85000e0e0c000203612c352d362a352b362c372d382e392b353b1a6e000e0e0e0c000303043b5002041a6300103b50323b1a5f000c0003293c1a5b000c0003343b2b1a56000e0e0e0c0004503b2b6930302b30303b3b680732220e1a41000e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000008400000000000000|@1785,I105,I218,I251,@8649,I253,I106,I255,@8647| 8649:O4|@35,@863,@8651,@8650 8650:O5|@6671,1141,0,1141,0 8651:S21|6e65774163636573733a204e6f7420466f726d616c 8652:D10,132|00802b352c3629352a362b372c382b353b1a74000e0c000303043b5002041a6b0010566c3b1a68000e0c0003293c1a63000c0003568c3b2b1a5d000e0e0c0004503b2b692f2a2f2f6b322a1a4e0056d76956d81a4a001a4b001211000100030012120001000400121300010005001a370022157b0b0d000a000000007c00000000000000|@8654,I251,@8649,I253,I106,I255,@8653,@7351,@7349,@7327| 8653:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 8654:S79|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e746572537472756374283129 8655:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 8656:S76|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657256616c283129 8657:D5,84|00801a53005617693e2d69291a4d000e0e0c000203041a4700103b50293b693b3b3b3b2d6805291a32000e0e0e0c000203041a2b00103b5056483c2e56792d1a2200347b07070006000000004c00000000000000|@8659,@8658,I105,@1784,@7336| 8658:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8660,@7006| 8659:S32|5349474e41545552455328292e67697665537065634572726f72283329283129 8660:S35|5349474e41545552455328292e67697665537065634572726f72283329283129283129 8661:D4,60|0082560a23081a37002a56376a562a230c1a30002a56586a2b2a69293356791a26000e0e0e0c0004312a35452706440e000000003400000000000000|@7578,@8663,@8662,@7577| 8662:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8663:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8664:S12|53706563696679696e672022 8665:S13|2220697320696c6c6567616c2e 8666:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8660,@7006| 8667:D1,28|00812c2c6956172c7d0400020e0e0e0e000000001400000000000000|@7330| 8668:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8660,@7006| 8669:D5,68|0082560b23081a3f002a56376a562b230c1a38002a56586a2b2a691a32005669567a346b2a342b1a2a000e0e0e0c0004322a35452707440e000000003c00000000000000|@7578,@8671,@8672,@8670,@7577| 8670:D5,84|00801a53005617693e2d69291a4d000e0e0c000203041a4700103b50293b693b3b3b3b2d6805291a32000e0e0e0c000203041a2b00103b5056483c2e56792d1a2200347b07070006000000004c00000000000000|@8659,@8673,I105,@1784,@7336| 8671:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8672:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8673:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8660,@7006| 8674:O1|@8675 8675:D1,20|00802b420e0e0e0e000000000c00000000000000|@8676| 8676:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329283129 8677:O1|@8678 8678:D1,20|00802b420e0e0e0e000000000c00000000000000|@8676| 8679:D18,204|00842e3b1ac9000e0e0c0003292f1ac3000c0003293b1abf000c000303051abb00028c293b1ab8000e0c0003030c291ab2001ab3000c000302013b03043b5002041aa800103b502928403b1aa2000e0e0e0c00043b2b2a1a9a000e0e0e0c000303043b50023c302a1a8d000e0e0c0003293b1a87000c000303041a8300103b503b5029352c2c2b1a7a000e0e0e0c0004502b3c1a72000e0e0e0c00032503511e4a5150291a65000e0e0c00025029641a5e002f2b336b661f050e0e0e0e0e0e0e00000000c400000000000000|@8681,I253,I107,I113,I49,I233,16777215,I234,@4516,I11,I232,@4919,I251,@2309,I255,I106,I47,@8680| 8680:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@8682,I234,I107,I105,I218,I15,I247,@866,I253| 8681:S34|5349474e41545552455328292e73696756616c283629747970654964456e76283129 8682:S37|5349474e41545552455328292e73696756616c283629747970654964456e76283129283129 8683:D44,1412|00902212353b1a7f050c0003034b2212362213370406002b22112c3b22132e2214221422142214221422142214221422142214121400010001000e0e0e0c00115029352a362b372c382d392e3a2e2e2e2e2e2e6806270902862212353d1a28050e0c0003033622123629352a362b372c382d392c2b2d2c3122182218221822182218221822182218221822182218221822170e0e0e0c0012270602432212362213372214380406002c2c2c221422142e220e221622162210221722172217221722171ac7040c00105029352a362b372c382d392e3a2e2e2e2e2e2e6806270a29352a39040d002b2a1aa5040e0e0c0003502923082a230c1a9a042212221222176b2b2b692922192c1a8d040e0e0c000422181a870422162216221a6b22151a7f040c00042a352937293629353c1a58040e0c000364031429362936291a65041a46040e0e0e0c00036502013b6503043b500fd02a35293729360402002a353b1a26040e0e0e0c000303152a3829220d0e0e0c00022b2a36452a3746260302092b2a2a36452a37465129352a362a353b1af6030e0e0e0c000303832a3829221a1a06040e0e0e0c000303033b026d29221a1af9030e0e0c000329221a2a1af1030e0e0c000329353c1abe030e0e0e0c0003031e2936292c1adb030c000303041ad703103b503b50292503511e313b640202293565293b1a90030e0c000303033b0218293e1a82030e0e0e0c000303043b5002041aa703103b503c656402013b1a9f03020247030c0002038e1a97032223691a950322221a94030e0c0003291a90031a89030e0e0c00033e2a69291a85030e0e0c000203041a7f03103b503b502d352e362f371a75030e0e0c0004293b691a6e032a691a6d032a691a6c032a692e2a691a68032a691a67032a693b3e3b3b2d6805291a3e030e0e0e0c000203041a3703103b503b5022273c220e22222d1a43030c0006260e0fce2a353b1aca020e0e0e0c000303043b5002041a2b03103b502a3829221a1ad4020e0c000329221a2a1acd020e0e0c000329353c1a9a020e0e0e0c0003031e2936292c1ab7020c000303041ab302103b503b50292503511e313b640201296529353e1a6c020e0c000303112936293629353b1a5c020e0c00036502013b03043b5002041abf02103b502936293629372a382b392b353c1a38020e0c0003030d2b36293b1aa3020c00036402022b36032f220e1a98021a99021a9a020e0e0e0c0004293c1a0b020c0003641a3c020202e2010e0c00021a31020e0e0c000202013b031e1a74021a75022227222d222c2213222822211a6a020e0e0e0c0009500fcd220e3528051ac9010e0e0c00030396220e36220f382a222c2a3b1ab4010e0c0003030c293b1aa9010e0e0c0003024f2a352b362b1ae6010e0e0e0c00021ac9010e0e0c000203352b352c362c3528061a7f010c000303112c362b352a2a1a71010e0e0c00036502013b030d2b2a2506250626041e5b3b02013b6502013b65651a87010c000203033b02182937293629353d1a3d010e0e0c000303033b02032a6801656502013b293b1a26010e0e0e0c000303562a03221aac011aad012228222e222d2214222922221a96010202e2000e0e0e0c000950022f222922281a8e016a3d222c22126a1a88012a2c6a2e22251a03010c00033b2b6922252b2b1a76010e0e0e0c0004260602a72935293629353b1abe000e0e0e0c0003035b29382922251ace000e0e0e0c000303053b2c6902432922251abf000c00032922252a1ab9000e0e0c000329353c1a86000e0e0e0c0003031e2936292c1aa3000c000303041a9f00103b503b50292503511e313b64020129666402033b2b6929353e1a52000e0e0e0c000303112b32222622261ae9000e0e0c00055002162e22251a57000c000322242a2c1acd000e0e0c0004512603502608260632270a1f110e0e0e0e0e0e0e000000007c05000000000000|@8685,I251,@7382,@1835,@8686,@7577,@8689,@7665,@70,I234,I107,@4919,I231,@7424,@8586,I218,@8693,@8695,@389,@2031,I105,@1784,@8589,@1058,@8696,@1058,@1830,@8698,@7336,@8700,@8703,I253,@8705,@8707,@2237,@8709,@8710,@8711,@8719,@8684,I48,@961,@4873,@8568| 8684:S21|6973206e6f7420612073696d706c6520747970652e 8685:S43|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729 8686:D7,100|00802b1a62001a63000c00031a61005627693e2b69291a5b000c000203041a5700103b50293b693b3b3b3b2d6805291a42000e0e0e0c000203041a3b00103b5056583c2e56892d1a3200220c0e0e0e7b070800060e0e0e0e000000005c00000000000000|@8688,@8563,@389,@8687,I105,@1784,@7336| 8687:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 8688:S59|5349474e41545552455328292e73696756616c2836297369676e61747572655768657265547970652837296c6f6f6b75704661696c757265283129 8689:D3,52|0082560923085619230c2a2a691a280056475658326b2a322b1a20000e0c0004302a35452705440e000000002c00000000000000|@7578,@8690,@7577| 8690:D5,84|00801a53005617693e2d69291a4d000e0e0c000203041a4700103b50293b693b3b3b3b2d6805291a32000e0e0e0c000203041a2b00103b5056483c2e56792d1a2200347b07070006000000004c00000000000000|@8692,@8691,I105,@1784,@7336| 8691:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7389,@6972| 8692:S28|5349474e41545552455328292e676976654572726f72283329283129 8693:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8694,@6972| 8694:S46|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729283129 8695:S2|6060 8696:O2|3,@8697 8697:S24|2068617320616c7265616479206265656e2073657420746f 8698:O2|3,@8699 8699:S30|43616e6e6f74206170706c792074797065207265616c69736174696f6e2e 8700:O4|@35,@863,@8702,@8701 8701:O5|@6671,937,0,937,0 8702:S12|736574576865726554797065 8703:O4|@35,@863,@8702,@8704 8704:O5|@6671,935,0,935,0 8705:O1|@8706 8706:D1,20|00803c420e0e0e0e000000000c00000000000000|@7421| 8707:O1|@8708 8708:D1,20|00803d420e0e0e0e000000000c00000000000000|@7421| 8709:S16|697320616e2065717479706520627574 8710:S25|646f6573206e6f74207065726d697420657175616c6974792e 8711:O1|@8712 8712:D17,236|00871aeb0031691aea0032692a2a691ae60033691ae500331ae5000e0e0c0003291ae0001ad9000e0e0c00033e2a69291ad5000e0e0c000203041acf00103b503b503e221169291abe000e0e0e0c000203041ab700103b503b503b1ab2000e0e0e0c0002220d1be8032b323b1aa5000e0e0c00063e221369291a8c000e0c000203041a8700103b503b50293b691a88002a692c2a691a84002a69302a691a80002a69332a691a7c002a691a7b002a693b3e3b3b2d6805291a4e000e0e0e0c000203041a4700103b503b5022183c2213221a2d1a5700221c7b071f00060e0e0e0e00000000e400000000000000|@8714,@8715,@8717,@8713,@8695,@389,@2031,I105,@1784,@2008,@2104,@1088,@1058,@1058,@1830,@8698,@7336| 8713:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8718,@6972| 8714:S53|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229 8715:D3,60|0080560723082c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@8716,I105,I218| 8716:S64|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e7453657428322974797065456e762d283129 8717:D3,60|00805607230c2c2a0e0c000264291a2f000c00021a2d000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000003400000000000000|@8716,I105,I218| 8718:S56|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229283129 8719:S17|6973206120646174617479706520627574 8720:O1|@8721 8721:D4,68|00822c2c2a1a40000e0c00021a3d000e0e0c0002031c2a352b36312b2d1a30000e0c00042a2a2505250526031e283b6602012965440e0e0e000000003c00000000000000|@1901,I105,I218,@8722| 8722:O1|@8723 8723:D10,332|00822c35291a48011a49010e0e0c00036403462c351a38011a39010e0e0c000303043b5002041a2f01102c37293729353b1a20010e0c0003031b2936293c1a1b010c000329301a17010c000303032902012f6502012d650fdd2c35291a05011af2000e0e0e0c00036403462c351af4001ae1000e0e0c000303043b5002041ad700102c37293629353b1ac8000e0c0003031b2936293c1ac3000c000329301abf000c000303032902012f6502012d6502882c35291ab1001a9a000e0e0e0c00036403752c351aa0001a89000e0e0c000303043b5002041a7f00102c372936292e2a1a88000e0c00021a85000e0e0c0002033f2a352b362a3729353b1a56000e0e0e0c0003031b2936293c1a4f000c0003292f1a4b000c000303032902012e6502012c2b2a2506250626041e4a3b27040201292704020301002b440e0e0e0e0e0e000000004401000000000000|@8724,@23,I251,@1840,I106,I233,@38,@27,I105,I218| 8724:S44|434f5049455228292e6765744e65787452756e74696d654f66667365742831296765744f6666736574283329 8725:O1|@8726 8726:D27,692|00862f3b1ab1020e0e0c000329301aab020c0003332a1aa7020c000365030d1aa202312a35452a3646640fdd312e2a1a96020e0e0e0c000329353c1a8e020e0e0e0c0003031e2936292c1a83020c000303041a7f02103b503b50292503511e313b640201296529353b1a60020e0c000303b52936293629353d1a50020e0c0003036c29362a372c371a4d0234220d6a1a4a022a692c1a48022b1a48020e0c00043d2f2b6a1a41022a2f6a3b2a69221022152b1a37020c000422153c1a32020e0e0e0c00030402002a2a221722172217221722171a1e020e0e0e0c00085029352a362f2a6922192c452a46270f0236343c1afd010e0e0c00030402002a2a220d220d220d220d220d020299011ae6010e0e0e0c00085029352a362e2a69220f2c452a462705650fcc29353e1a9f010c000303043b5002041abf01103b5029362a372a3629353b1a84010e0c000303043b5002041aa701103b5029362a372b392e3729352a362b37311a96010e0e0e0c00021a91010e0e0c000203153136291a80010e0c00021a7d010e0e0c00026402013b034d311a6a010e0e0e0c00021a65010e0e0c0002032931353236293b1a1d010e0e0c000303032a0213291a4b010c00022b2a69641a45010e0e0c00026502031a3e011a3f012a1a3f010c000364020129220f3b1ad2000e0e0e0c0003293c1aff000202ae000c000322113b2b1a1d010e0e0c00045022103b1aad000e0e0c0003293c1adb000c000322123b2b1afd000e0e0c00045030302f6a3b2c69220c353c1a99000e0e0c00030311220c36293b1a76000e0e0e0c0003640203220c363b2a693b22102b33221168052c2a2f6a3b2a69221b22202b1a83000c000422203c1a7e000e0e0e0c00030402002a2a222222222222222222221a6a000e0e0e0c00085029352a362f2b69302b6922252b452a46271d641f070e0e00000000ac02000000000000|@8728,I253,I107,I113,@740,@4919,I251,I231,@7424,@8729,@8734,@8741,@1914,@961,@4873,I106,@8725,@8743,@8743,I105,I218,@8746,@371,I48,@8727,@389,I255| 8727:S8|73686172696e6720 8728:S31|5349474e41545552455328292e73696756616c2836296d6170496473283129 8729:D8,156|00802b3629353b1a96000e0e0e0c0003037529382956381a8a000e0e0e0c000303033b025f2956381a7d000e0e0c00032956472a1a75000e0e0c000329353c1a5e000e0e0e0c0003031c2936292c1a5f000c000303041a5b00103b50292503511e2f3b640201296529353b1a32000e0e0e0c000303043b5002041a3b00102936296801666402013b64420e0e0e0e0e0e000000009400000000000000|@8731,I251,I234,I107,@4919,I231,@7424,@8730| 8730:O4|@35,@863,@8733,@8732 8731:S40|5349474e41545552455328292e73696756616c2836296d6170496473283129636f70794964283129 8732:O5|@6671,1350,0,1350,0 8733:S21|6d61704964733a636f707954797065436f6e737472 8734:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@8736,@8737,@8735,@1919| 8735:O1|@8740 8736:S46|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129 8737:O1|@8738 8738:D1,20|00802b420e0e0e0e000000000c00000000000000|@8739| 8739:S49|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129283129 8740:D1,20|00802b420e0e0e0e000000000c00000000000000|@8739| 8741:O1|@8742 8742:D1,20|00802b420e0e0e0e000000000c00000000000000|@8736| 8743:O4|@35,@863,@8745,@8744 8744:O5|@6671,1376,0,1376,0 8745:S6|6d6170496473 8746:O1|@8747 8747:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c36291a32000e0e0e0c00022b2a69282c2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@2183,I105,I218,@8746| 8748:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@8749,I234,I107,I105,I218,I15,I247,@866,I253| 8749:S36|5349474e41545552455328292e73696756616c2836296d617046756e6374696f6e283129 8750:D3,36|00802b352c3629382b2a56571a19001a1a00327b06060005000000001c00000000000000|@7219,@7220,@7218| 8751:D3,44|00802b352c362a282e1a24000e0c00032a372a2a56671a1b00320e7b05070004000000002400000000000000|@7219,@389,@7246| 8752:D8,116|00821a73005617691a71002f1a71000e0e0c0003291a6c001a65000e0e0c00033e2a69291a61000e0e0c000203041a5b00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a3f00103b5056683c3056992d1a3600220d0e0e0e7b070b00060e0e0e0e000000006c00000000000000|@7252,@8754,@8753,@389,@7256,I105,@1784,@7251| 8753:S8|46756e63746f7220 8754:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@7254,@6959| 8755:O1|@8756 8756:D59,2044|00a12223352224362225373c2840221c1aed070e0e0c00043c28403b1ae1070e0e0c00042b221d221d221d221d222b1ad2070e0e0e0c00073b222869221b23103b2a0e0e0e0c00023d2a69293b692d2a693c28401ab1071aa6070e0e0e0c00043c28401aa6071a97070c00043d2b2b6a220e2a342f6b33372922112c1a91070e0e0c0004293b1a8b070c000303051a870702903b2a291a83070c00021a81070e0e0c0002031729362b3c1a77070c0003292b25042504511e223b6502012a65291a65071a66070e0e0e0c000303041a5f07103b503b502928403b1a23070c00043b2c293b1a2d070e0e0c000303043b50022629352a362d2d2c1a38070e0c0004502c3c1a1e070e0e0e0c0003292b2505250526031e32260351291a1b070c0002502965220f3b1a13070c0003220e373b2a291ae7060c00021ae5060e0e0c0002031729362b3c1adb060c0003292b25042504511e223b6502012a652b2a1ac4060e0c000322133b2b1ac9060e0e0c00045022133b1ac5060e0e0c00032212352213362214382215391ab50622333422366b1ab0062b2b6a2e353c1a77060c000303592e362f382a3b1a91060e0e0c00032a3b1a87060c0003293b1a7f060c0003293b1a83060c000303051a4b0602242928403b1a2a060e0e0e0c00042b3c2b3b2e1a68060e0c000650291a4b060c00025029643b2d2b6a270602012e292f3b302e220c68067881463c28403b1af1050e0e0c0004280b28403b1ae4050e0c0004293b401a0e060e0e0e0c0004503c28402b1acc050e0c00043c28401a12061abf050c00043c2a2e2d6b2704053a0e00ff6d29353f1abd050e0e0c00030323403c1af1050e0e0c00031aed052a1aed050e0e0c00031ae9051aea052b1aea056b65103b503b502910040d002a2a1add050e0e0c00035029372a382b23062c23082d23092e230a2f230c22281ac3051a64050e0c000303033c022622281a5e050e0e0e0c00021a59050e0e0c0002031022283b1a9c053b3f1a9b050c000602013b1a3e050e0e0e0c000203252228221b3422206b293b6922443b2b1a38050e0c000450222a2b692d0e0e0e0c00026502331a66052f22436a1a63052c2245221d6b1a5e05322248221e6b292c2c6a220e2a22113c1a3b0522143b1a49050e0e0c00082704221a680122293b2b1ae7040c0004501a3405223e2240326b1a2f05223d223f326b1a2a05223c223e306b1a2505223b223d336b1a2005223b223b223b223b223b32223c3332223e223e220d680d1a0a05222c222e6a1a060522482220222e221d224d223268071af904222f6904060022562d2c2e31224d225b1ab2043122401ae4040e0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e6806224f38293b1a57040c00036403033b021b225b1ab9041a66040e0e0e0c0003292b22521aad040e0e0c000464303b1aa6041aa7040c0004313b1aa3041a9c040e0c000422393b1a16040e0e0e0c0003293b2a1aea030e0e0e0c00021ae5030e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1ab6030e0e0e0c000303051aaf0302903b2a291aab030c00021aa9030e0e0c0002031729362b3c1a9f030c0003292b25042504511e223b6502012a65291a8d031a8e030e0e0e0c000303041a8703103b503b502928403b1a4b030c00043b2c293b1a55030e0e0c000303043b50022629352a362d2d2c1a60030e0c0004502c3c1a46030e0e0e0c0003292b2505250526031e32260351291a43030c0002502965291ac1030e0e0c0002293b1a3f030c000303051a07030fd82928403b1ae6020e0e0e0c00043b292c1a06030e0e0e0c000303043b5002b22c2a1a05030e0e0c0003293629353b1ad0020e0c0003037929362a382b392d372f220d1acc020e0c00033b2a69303629353d1aad020e0e0c000303041a5303103b503b5029353b1a98020e0c00030322293729353c1a8a020e0e0e0c0003030d2936293b1aa3020c0003640202293664020d2936293b1a91020e0e0c0003643b2a693b322b333368052d2a316a270a02012a2d2d2b1a6a020e0e0e0c0004502c3c1a4e020e0e0e0c0003250426031ebf260350291a4f02020206000c0002502964291ac9020e0e0c00023b2a293b1a11020e0e0c000303032a022b293c1ab6020e0e0e0c00032a3c1aab020c00032e2a1a17020c0003292e69292d2506250626041e353b2704652d1a83020c00023b2a293b1acd010e0e0c000303032a026e293c1a72020e0e0e0c00032a3c1a67020c00032b3c1a5f020c0003332a1acb010c00032b1aa4010e0c00021aa1010e0e0c000203033c0210321a33020c00022c2a1a37020c00036403041a3202103b503b50322c1a94010e0c0003292b6929316929302509250926071e783b27076522663b2b1a6d010e0e0c0004501a0402225e22362244312234226468071af80122102b6a2214353c1a29010e0e0c000303592214362215382a3b1a3f010c00032a3b1a37010c0003293b1a2f010c0003293b1a33010c000303051afb0002242928403b1ada000e0e0e0c00042b3c2b3b2e1a18010e0c000650291afb000c00025029643b2d2b6a2706020222142922153022152e22376806291a80010e0c00023b311a7b010c0003293b1aa7000c000303032a020b2a2a1a6a010e0e0e0c000322683b2b1aad000e0e0c0004503b227069226323103b2a0e0e0c00023d2a69293b692d2a693c28401a5d001a52000e0e0e0c00043c28401a52001a43000c00043d2b2b6a224722782b220f30680522782a69225b0e0c00025029680122773b2b1a51000e0e0c0004503b27591f220e0e00000000f407000000000000|@8758,I11,@7261,-1,@2364,@8759,I251,I49,I105,I218,I106,16777215,I231,@3560,I255,I47,I253,@8768,@8770,I113,I195,@8771,@510,@7324,@389,@35,@863,@7325,@1835,I48,I154,@8773,@8775,@8776,@7585,@8777,@8778,@8779,@8780,@8787,@8789,@8791,@8795,@8797,@9122,@7246,@9110,@1898,@9123,I15,@2039,I240,I247,@866,@9125,@9127,@9030,@9039,@8757| 8757:O1|@9128 8758:S63|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229 8759:O1|@8760 8760:D5,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e362a2f2f1a38000e0c00042a30301a32000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@8761,@8759| 8761:O1|@8762 8762:D8,196|00822d3529353b1abe000e0e0e0c000303112e3629353b1aae000e0e0e0c00036402013b6403043b5002041a9e00103b502d3529362f3629362a372b382c39343729352a362b373b313131316805220f1a7d001a72000e0e0e0c000303033c0226220f1a6e000e0e0e0c00021a69000e0e0c00020310220f3b1a54003b3f1a5b000c000602013b03032c0215220f282e1a4d000e0e0c0003292e1a43000c000364292d2d6a3f220d22126a292d2c6a270f440e0e0e0e0e0e00000000bc00000000000000|@8764,I251,@8763,I48,I105,I218,I154,@389| 8763:O4|@35,@863,@8766,@8765 8764:S70|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296d6b4964283129 8765:O5|@8767,2184,0,2184,0 8766:S29|6d6b49643a204e6f7420426f756e64206f72206e6f7420466f726d616c 8767:S34|6d6c736f757263652f4d4c436f6d70696c65722f535452554354555245535f2e4d4c 8768:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@8769,I234,I107,I105,I218,I15,I247,@866,I253| 8769:S98|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296172675369675769746853656c65637465642d6d6170546f53656c6563746564283129 8770:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 8771:O1|@8772 8772:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 8773:D3,60|00802b352c3656283b1a34000e0c00032a2a6956483b2b1a2a000e0e0e0c0004502c2c695657300e7d0700020e0e0e0e000000003400000000000000|@8774,I253,I255| 8774:S68|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132295f2d283129 8775:D4,68|00802b352c362956393b1a3b000c000456383b1a36000e0e0e0c00032a2a6956583b2b1a2a000e0e0e0c0004502d2c695667310e7d080002000000003c00000000000000|@8774,@7964,I253,I255| 8776:D4,68|00802b352c362956393b1a3b000c000456383b1a36000e0e0e0c00032a2a6956583b2b1a2a000e0e0e0c0004502d2c695667310e7d080002000000003c00000000000000|@8774,@7493,I253,I255| 8777:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8778:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8779:D2,68|00802b56190c0002293b1a3b000c0003031e2c56280c0002293b1a2b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000003c00000000000000|@6364,I251| 8780:D7,124|00803b56190c00023c28403b1a71000e0e0c00041a6d002a6956380e0e0c00022a3b1a63000c0003564723093b2a0e0e0e0c000264293b1a52000e0e0e0c000303032a020b2a2a1a46000e0e0e0c0003293b1a37000c000303032e020b2e2a1a3200330e7e0900032706420e0e0e0e0e000000007400000000000000|@8782,I11,@8783,I253,I251,@8784,@8781| 8781:O1|@8786 8782:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229656e7657697468417267732d283129 8783:D3,52|00802b3556173b1a2e000e0e0e0c00032a2a6956373b2b1a22000e0e0e0c0004503b66420e0e0e0e000000002c00000000000000|@7202,I253,I255| 8784:O1|@8785 8785:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8784| 8786:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8781| 8787:O1|@8788 8788:D1,20|00803b420e0e0e0e000000000c00000000000000|@8782| 8789:D9,188|00802b352c362d372e382f3956583b1aae000e0e0e0c0003293c1aa7000c000356783b2b1aa1000e0e0c0004502e032e3c28401a96001a97000c00043c28401a92001a8b000c00043d2b2b6a322a2f3333336806661a80000e0c0002022e3c28401a68001a69000e0e0c00043c28401a62001a5b000c00043d2b2b6a322a2f3333336806661a54000e0c000256873b1a2e000e0e0e0c00032a2a6956a73b2b1a26000e0e0e0c0004502b270a420e0e0e00000000b400000000000000|@8790,I253,I106,I255,-1,I11,@2364,@7412,@7400| 8790:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296e6577547970654964283129 8791:D14,252|0080560c3b1af8000e0c0003293b2a1af2000e0e0e0c00021aed000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1ace000e0e0e0c000303051ac70002903b2a291ab3000c00021ab1000e0e0c0002031729362b3c1aaf000c0003292b25042504511e223b6502012a65291a9d001a9e000e0e0e0c000303041a9700103b503b502928403b1a8f000c00043b2c293b1a6d000e0e0c000303043b50022629352a362d2d2c1a74000e0c0004502c3c1a56000e0e0e0c0003292b2505250526031e32260351291a57000c00025029651a52005647565856692d568a569b680766420e0e0e00000000f400000000000000|@8793,I253,I105,I218,I251,I49,I106,16777215,I231,@3560,I11,I255,I47,@8792| 8792:D9,204|00802b561c1ac8000e0c0003030a2b56172c0e0e0e8000022b561b1ab2000e0e0e0c0003034e56093a2c2a1aa6000e0e0e0c0003291aa0000e0c00021a9d000e0e0c000203033c021456281a92000e0e0e0c00022a2a1a8b000c00036403041a8600103b503b5056282a1a7f002f0e0e7e0500032b561b1a5a000e0e0e0c0003291a54000e0c00021a51000e0e0c000203033c0214561a1a46000e0e0e0c00022a2a1a3f000c00036403041a3a00103b503b50561a2a1a33002e0e0e7e04000300000000c400000000000000|@8794,I234,I107,I105,I218,I15,I247,@866,I253| 8793:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129 8794:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129283129 8795:D2,28|008056073b1a18002d0e0e0e7e030003000000001400000000000000|@8796,I253| 8796:S73|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132297265735369672d283129 8797:O2|@8799,@8798 8798:O2|@9066,@8797 8799:D77,2780|00891adb0a32326a1ad90a33336a2a2a69220e353d1ad00a0e0c000307d2220e3629352a362b372c382d392e3a3c28403b1ab80a0e0c00043b22150e0e0c00023b22150e0e0c00021aa50a2c22196a1aa20a2b2e2e6b040600342c221b2d221b221b221b221b31221b221a0e0e0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68062211220c220c2221222122141a640a0e0c0007293a2a372b3a3b2b291a580a0e0c00021a550a0e0e0c0002031729362b3c1a4b0a0c0003292b25042504511e233b6502012a652a2a1a340a0e0c00031a310a22196904020031312c221a2229221722223022291a1e0a020246020e0e0e0c000a5029352a3622173b2b1a0c0a0e0c000450221a07db2d321a020a0e0e0e0c00031afd092c346a2a2a1af9090e0e0c0003220c3729221e22311aed090e0e0c00042b2a1ae7090c0003221e3b2b1ac9090e0e0c0004502a3b1a96090e0e0e0c000303051acb0902943b2b291a97090c00021a95090e0e0c0002031729362b3c1a8b090c0003292b25042504511e223b6502012a65291a9d091a9e090e0e0e0c000303041a9709103b503b502928403b1a43090c00043b2d293b1a35090e0e0c000303043b50022629352a362d2d2c1a48090e0c0004502c3c1a32090e0e0e0c0003292b2505250526031e32260351290202ac001a4b090c00025029653b22310e0e0e0c00021a3d092a2c22136b2212352213362214382215393b22380e0e0c00021a25092b306a2e353c1ac4080e0c000303592e362f382a3b1a11090e0e0c00032a3b1a07090c0003293b1aff080c0003293b1afb080c000303051ad30802242928403b1a8e080e0e0e0c00042b3c2b3b2e1ae0080e0c000650291ac3080c00025029643b2d2b6a270602012e22342a452f463b472e482b492c4a2710029e3b222a0c00021ab1082a2d220d6b3435220c36220d38220e393b22310e0e0e0c00021a99082b306a2e353c1a24080e0c000303592e362f382a3b1a71080e0e0c00032a3b1a67080c0003293b1a5f080c0003293b1a5b080c000303051a330802242928403b1aee070e0e0e0c00042b3c2b3b2e1a40080e0c000650291a23080c00025029643b2d2b6a270602012e222d2a452f463b472e482b492c4a2709271e0fdd220e353c1aa9070e0e0c000307dc220e36220f372210387881443c28403b1a93070c0004280b28403b1a88070e0c0004293b401aa2070e0e0e0c0004503c28402b1a70070e0c00043c28401ad2071a63070c00043c2a2e2d6b2704053a0e00ff6d29353f1a49070e0e0c00030323403c1ab1070e0e0c00031aad072a1aad070e0e0c00031aa9071aaa072b1aaa076b65103b503b502910040d002a2a1a9d070e0e0c00035029362a372b382c392d23062e23072f230830230931230a32230c221923061a7a072a316a221b23081a74072a316a221d230c1a6e072a0202b406306a221f3a2220230b02025c001a5d072222220c6a1a5907221322132213221330220d2214220d322214220c220f680d22172227222722272d2227221c22272226122600010001000e0e0c000a22192228222822282e2228221d222822282228222722297b0c29000b220e353e1a61060e0e0c000307dc220e36220f372210387881443c28403b1a4b060c0004280b28403b1a40060e0c0004293b401a5a060e0e0e0c0004503c28402b1a28060e0c00043c28401abe061a1b060c00043c2a2e2d6b2704053a0e00ff6d29353f1a01060e0e0c00030323403c1a69060e0e0c00031a65062a1a65060e0e0c00031a61061a62062b1a62066b65103b503b502910040d002a2a1a55060e0e0c00035029372a382b23062c23082d23092e230a2f230c221623061a51062a306a221823081a4b062a316a221a230c1a45062a306a221c3a221d230b221e391a39062220220d6a020295011a31061a3206221222122e31220e1a2b06220e322215220d2210680d22162225222522252d2225222522252224122400010001000e0c000a7881473c28403b1a3e050e0e0e0c0004280b28403b1a30050e0c0004293b401a4a050e0e0e0c0004503c28402b1a18050e0c00043c28401ace051a0b050c00043c2a2e2d6b2704053a0e00ff6d29353f1af1040e0e0c00030323403c1a59050e0e0c00031a55052a1a55050e0e0c00031a51051a52052b1a52056b65103b503b502910040d002a2a1a45050e0e0c00035029372a382b230a1a71052b2b2e6b221a1a6c052b1a6c050e0c00042936221d3b2b1ab7040c0004503b221f69222a23103b2a0e0e0c00023d2a69293b692d2a693b22330e0c00023b22330e0e0c0002220f353c1a5d040e0e0c00030359220f362210382a3b1aa7040c00032a3b1a9f040c0003293b1a97040c0003293b1a93040c000303051a6b0402242928403b1a26040e0e0e0c00042b3c2b3b2e1a78040e0c000650291a5b040c00025029643b2d2b6a27060202220f222f2a451ac804463b472d482b492c4a27290fcf220e353b1ae0030e0c000307d3220e3629352a362b372c382d392e3a2f23063023072213230b302a0c000264291acb030c00021ac9030e0e0c000207cd2935293529372b382c6801323b2b1ac1030e0e0c000450040600220e221e221e221e221e221e220f221e31221e221d0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68061a38042226693b22240e0e0e0c00020402002c220e2d221622272f22203022271a64030e0c000a5029352a36220f373b2a1a0b040c0003293b1a27030c000303032b020f2b2a1afa030202f9020e0e0e0c000322163b2b1a3103020277020e0e0c00045022123722133a3b2b291a07030c00021a05030e0e0c0002031b29362b3c1afb020202d5010c0003292b25042504511e263b6502012a652a2a1ae0020e0c000322163a2a2a1ae4020e0c00031a9503342c6a2a2a1add020e0e0c0003221a372a2a1a84030e0c000322253b2b1ab9020e0e0c000450221b372922282225223a1a6a030e0e0e0c000522263b2b1a99020e0e0c000450291a57030c0002293b1a5f020c000303051a970202903b2a291a63020c00021a61020e0e0c0002031729362b3c1a57020c0003292b25042504511e223b6502012a65291a69021a6a020e0e0e0c000303041a6302103b503b502928403b1a0f020c00043b2c293b1a01020e0e0c000303043b50022629352a362d2d2c1a14020e0c0004502c3c1afe010e0e0e0c0003292b2505250526031e32260351291a1b020c000250296522203a22203a2a2a1aae020e0e0e0c000303032a0201293b223c0c00021a9d022a2f2226221a22293068072224352225362226383b22420e0e0e0c00022228391a7e022a306a2e353c1a79010e0e0c000303592e362f382a3b1ac5010e0e0c00032a3b1abb010c0003293b1ab3010c0003293b1aaf010c000303051a870102242928403b1a42010e0e0e0c00042b3c2b3b2e1a94010e0c000650291a77010c00025029643b2d2b6a270602012e223f2a452f463b472e482b492d4a272f02741a0302311a7b010c0003291afc011a71010e0e0c00031af501221b693e2b69291af7000c000203041ae701103b503b50293b693b3b3b3b2d6805291adc000e0c000203041acb01103b503b5022193c2e342d1ac1010e0e0c0006501abc0122172a35452a36462a37472a38482a39492a3a4a2707270a0271220e36220f37221038220d230c1a96012213220f2d6b1a91012b2f2c1a8f010c00052d3b2b1a8e000e0e0e0c000450293b1a5a000e0e0e0c0003031a1a7301220d2a35452a36462a37472a38482a39492a3a4a64021929352937220e2a35452a36462a37472a38482a39492a3a4a652706661f0a0e0e00000000d40a000000000000|@8801,@8802,@8804,I251,I11,@8805,@8807,@7261,I105,I218,I106,@8813,@8815,I255,I107,@8977,@2047,@8979,@8985,I49,16777215,I231,@3560,I47,@8987,@8989,I253,I113,I195,@8990,@8992,@8993,@510,@7324,@389,@35,@863,@7325,@1835,@8995,@8996,@8997,@8998,@9002,@9004,@9006,@9007,@9008,@9009,@9013,@9015,@9020,@9025,@9027,@740,@1898,I48,@9038,@9039,@9045,@9047,@9049,@9051,@9056,I234,@9058,@9060,@9061,@7387,@9062,@1784,@7251,@6658,@8800,@7351,@7477,@6658| 8800:D5,84|00801a53005617693e2d69291a4d000e0e0c000203041a4700103b50293b693b3b3b3b2d6805291a32000e0e0e0c000203041a2b00103b5056483c2e56792d1a2200347b07070006000000004c00000000000000|@9065,@9064,I105,@1784,@7251| 8801:S28|535452554354555245535f28292e73747275637456616c7565283829 8802:D3,68|0080560823082c2a0e0c000264291a37000c00021a35000e0e0c0002031729353b56370e0e0c00022968012b2a69296801270402013b6442000000003c00000000000000|@8803,I105,I218| 8803:S39|535452554354555245535f28292e73747275637456616c756528382974797065456e762d283129 8804:D3,68|00805608230c2c2a0e0c000264291a37000c00021a35000e0e0c0002031729353b56370e0e0c00022968012b2a69296801270402013b6442000000003c00000000000000|@8803,I105,I218| 8805:D3,76|00802b352c362d372e382f392d2d2d2d2d680556680c000256673b1a32000e0e0e0c00032a2a6956873b2b1a26000e0e0e0c0004502b2708420e0e0e0e0e0e0e000000004400000000000000|@8806,I253,I255| 8806:S52|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e744d616b65547970654964283129 8807:D2,28|00801a1b005617562856396b420e0e0e000000001400000000000000|@8809,@8808| 8808:D9,148|00802b56191a90000e0c0003030a2b56172c0e0e0e80000256083b1a7e000e0e0e0c000329291a77000c00021a75000e0e0c0002033829352a362a3629353b1a66000e0e0e0c000303043b5002041a5b0010293829321a57000c00036503052a68010207292503511e433b6502013b64293b1a33000c000303041a3700103b50293565420e0e0e0e000000008c00000000000000|@8811,I234,I253,I105,I218,I251,@8810,I113,@2309| 8809:S51|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129 8810:O4|11,@316,0,@8812 8811:S54|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129283129 8812:O5|@8767,1738,0,1738,0 8813:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8814,@7152| 8814:S57|535452554354555245535f28292e73747275637456616c75652838296d61746368416374696f6e737c6d61746368526573756c74732d283129 8815:O1|@8816 8816:D23,364|008833373439220c3a2b3b1a62010e0e0e0c000303043b5002041a5701103b50220d36291a51011a46010e0e0e0c000303033c0222291a43010c00021a41010e0e0c00020310293b1a2d013b280f1a33010c000602013b6403051a2b01020d220d2b2b3b220c1a23010c0006220d37220e39220f3a1a1801220d2d2c6b22112c2c2f2d1a06010e0e0e0c0006293a2a372b3a3b2b291ae4000e0c00021ae1000e0e0c0002031729362b3c1ae7000c0003292b25042504511e233b6502012a652a2a1ad0000e0c0003292e1acb000c0003293b1ac7000c000303033c020b291abf001ac0000e0c000303041abb00103b503b50293c1a9d000e0e0c00032928403b1aa9000e0e0c0004293b2d1aa2000e0e0e0c0004501a9c002a326a1a9a002b336a220f341a9500221c221f221f220f321a8d000e0e0c00092210220c1a7d002e221e22212221221f221e1a77000c000a22182c452a4627151f090e0e0e0e0e0e000000006401000000000000|@8818,I251,@8819,@6666,I105,I218,I154,@6658,@8822,@8837,I106,I107,I234,16777214,I231,@1868,I11,I255,@8839,@8841,I48,@8843,@8817| 8817:O1|@8901 8818:S26|535452554354555245535f28292e6d6174636853696773283729 8819:O4|@35,@863,@8821,@8820 8820:O5|@8767,1030,0,1030,0 8821:S48|43616e646964617465207374727563747572652077697468206e6f6e2d656d70747920626f756e64204944206c697374 8822:O1|@8823 8823:D21,308|00842f35303631387881473c28403b1a26010e0e0e0c0004280b28403b1a18010e0c0004293b401a12010e0e0e0c0004503c28402b1a00010e0c00043c28401afe001af3000c00043c2a2e2d6b270405380e00ff6d29353f1ae9000e0e0c00030323403c1ae1000e0e0c00031add002a1add000e0e0c00031ad9001ada002b1ada006b65103b5029101ad4002a691ad3002b691ad2002c69292c2c6a302a220f3b1ac800220f3b1ac6000e0e0e0c00082e353c1a8e000e0e0e0c000303592e362f382a3b1aad000e0e0c00032a3b1aa3000c0003293b1a9b000c0003293b1a97000c000303051a930002242928403b1a46000e0e0e0c00042b3c2b3b2e1a80000e0c000650291a7b000c00025029643b2d2b6a270602012e2932220f33221022136806270a1f050e000000002c01000000000000|@8825,I11,I255,@8826,I251,@510,@7324,@389,@35,@863,@7325,@8828,@8832,@8824,I48,@7585,I253,I113,I49,I195,I47| 8824:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@8830,@23,@1842,I251,@8835,@1862| 8825:S22|434f5049455228292e7265706c6163654d6170283529 8826:O1|@8827 8827:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 8828:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@8830,@27,@1842,I251,@8829,@1862| 8829:O1|@8831 8830:S32|434f5049455228292e7265706c6163654d6170283529747376456e762d283129 8831:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@27,I251,@8829| 8832:D6,84|00802b352c361a4f0028452b3b6b56372c1a48000e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c00036456572e2b1a2c00330e0e7b050800040e0e0e0e000000004c00000000000000|@8830,@38,@1842,I251,@8833,@1862| 8833:O1|@8834 8834:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@38,I251,@8833| 8835:O1|@8836 8836:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@23,I251,@8835| 8837:D7,124|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a66000e0e0e0c000356182a2a1a5d000e0e0c00021a59000e0e0c000203043b5002041a4f00102a352b362b3b1a49000e0e0c000303032a02172b3c1a2a000e0e0e0c00032a2a2505250526031e413b642705420e000000007400000000000000|@8838,I234,I107,I105,I218,@878,I113| 8838:S42|535452554354555245535f28292e6d61746368536967732837297461726765742d6e65774d6170283129 8839:D7,108|00802b56181a68000e0c000303033b024b2b56181a5d000e0e0c0003293b1a4f000c000303033c021456173b1a49000e0e0c00032a2a1a43000c00036403041a3e00103b50293c1a3a000e0e0e0c000356272a1a22002f0e7e050003420e0e0e000000006400000000000000|@8840,I234,I107,I253,I231,@1850,I106| 8840:S39|535452554354555245535f28292e6d61746368536967732837296c6f6f6b757054797065283129 8841:D9,108|00802b56181a68000e0c0003293b1a63000c000303033c021456173b1a59000e0e0c00032a2a1a53000c00036403041a4e00103b50293c1a4a000e0e0e0c000356272a1a32000e0e0e0c0003293b1a37000c000303051a33000202293566420e000000006400000000000000|@8842,I107,I234,I253,I231,@1850,I106,I251,@6480| 8842:S39|535452554354555245535f28292e6d6174636853696773283729726573756c7454797065283129 8843:O1|@8844 8844:D9,108|00873236291a68001a69000e0e0c000303033c0222291a5f000c00021a5d000e0e0c00020310293b1a45003b280f1a4f000c000602013b6403033b021f31351a420031220c3232220d33331a3a0068092a3b2b1a3600307b050c00041f080e0e000000006400000000000000|@8846,@6666,I251,I105,I218,I154,@8845,@8843,@1898| 8845:D4,84|00822c2c2a1a50000e0c00021a4d000e0e0c0002032c2a352b36312b2d56775688569956aa56bb56cc56dd56ee1a30000e0c000c2a2a2505250526031e383b6602012965440e0e0e000000004c00000000000000|@1901,I105,I218,@8847| 8846:S39|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329 8847:O1|@8848 8848:D27,1148|008a3435291a78041a79040e0e0c00036407cf34351a68041a69040e0e0c000303043b5002041a5f04103b50343729352a361a5704220d69220c352922121a4f040c0003291a4c040e0c00021a49040e0e0c00020358293529291a37040c00021a35040e0e0c0002034029352a362a35291a0c041a0d040e0e0c00036403212a351afc031afd030e0e0c000303043b5002041af303103b502a37296801640207292503511e4b3b6502013b6502013b293b1ad0030e0c000303162f2d22122211221122111ad503220f0e0e7b08140007293529352a363137293629353c1aa403020281020e0c000364031429362936291aad031a8e030e0e0e0c00036502013b641a94030e0c000207d93137293629353b1a70030e0c0003036729382d372a22131a80030e0c000303043b5002502a22131a74030e0c00032a68012a3b1a64030e0c000303033c021422133b1a5d030e0e0c00032b2a1a57030c00036403041a5203103b503b502a3c1a4c030e0c000322142a2c1a45030e0e0c000426045102023b503337293629353c1af7020c000303042937024129353b1ae8020e0c000303042936023129363b2a291ae6020e0e0e0c00021ae1020e0e0c0002031729362b3c1af3020c0003292b25042504511e253b6502012a662f37293629353c1aa30202027b010c000303042937024129353b1a90020e0c000303042936023129363b2a291a8e020e0e0e0c00021a89020e0e0c0002031729362b3c1a9b020c0003292b25042504511e253b6502012a662c2a1a8c020e0c000327061a5b020c0002031a2d220c1a7c023422192218221822181a740222160e7b0a190009321a34020e0c00021a31020e0e0c00021a29020e0e0c00021a21020e0e0c0002031c2b1a12020e0e0e0c00021a0d020e0e0c00021a05020e0e0c000202013b031b2d220c1a29023422192218221822181a190222160e0e7b0a1900093337293629353d1ac2010e0e0e0c0003651acc010e0c0002036b3337293629353d1aa8010e0c000303041aeb01103b503b5029353b1a94010e0c00030322293729353c1a86010e0e0e0c0003030d2936293b1a9f010c0003640202293664020d2936293b1a8d010e0e0c0003646503122c1aa8010e0c00021a65010e0e0c000202013b02013b031c2d220c1a92013422192218221822181a760122160e0e0e7b0a1900093b6502013b270a0fd63435291a71011a16010e0e0e0c00036407d134351a60011a05010e0e0c000303043b5002041afb00103b503437323529220f1af6000e0e0e0c0003291af0000e0c00021aed000e0e0c00020358293529291adb000c00021ad9000e0e0c0002034029352a362a35291a0c011ab1000e0e0c00036403212a351afc001aa1000e0e0c000303043b5002041a9700103b502a37296801640207292503511e4b3b6502013b6502013b293b1a74000e0c000303162c1ac600220f220e220e220e1a7700220c7b08110007293529372e37220c22141aab0002022c000c000329282e1a9e0002021e000e0e0e0c00032c2c2b22152214221422132213221322130e0e7b0a1600093b1f0b0e0e0e0e0e000000007404000000000000|@8850,@27,I251,@1840,@8851,@1842,I105,I218,@8862,@70,I234,I107,I253,I231,@1879,I106,I255,I113,@8879,@8881,@8884,@2039,@8886,@8897,@38,@8849,@389| 8849:O1|@8899 8850:S42|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329 8851:D4,44|008056071a29000e0e0c00022c2a1a23003b1a2300300e7b060400050e0e0e0e000000002400000000000000|@8853,@8854,@8852,@2003| 8852:O2|@8858,@8857 8853:S56|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c617954797065283129 8854:O1|@8855 8855:D8,220|00802b230d29291ad6000e0e0e0c00021ad1000e0e0c0002032429352a362a35291ac4001ac5000e0e0c00036403052a68010207292503511e323b6502013b64293b1aa7000c000303691aa300291a8f000c00021a8d000e0e0c0002032429352a362a35291a80001a81000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a63000c000303041a6300103b50293529351a4d001a4e000e0e0e0c000303043b5002041a4b0010293765021a293529351a2e001a2f000c000303043b5002041a2f001029376465420e00000000d400000000000000|@8856,I105,I218,@98,I251,@2900,@2955,@1840| 8856:S27|535452554354555245535f28292e6572726f724465707468283129 8857:O1|@8861 8858:O1|@8859 8859:D1,20|00803b420e0e0e0e000000000c00000000000000|@8860| 8860:S58|535452554354555245535f28292e6d61746368536967732837296d617463684e616d65732833292833297072696e7454797065456e762d283129 8861:D1,20|00803b420e0e0e0e000000000c00000000000000|@8860| 8862:O1|@8863 8863:D15,212|00852b1ad2001ad3000c000303033c02222b1acb000c00021ac9000e0e0c000203102b3b1ab1003b3f1abc000e0c000602013b0304282e020b1ab0002c1ab0000e0c00031aad002a1aa5000e0e0c00033e2a69291a89000e0e0c000203041a9700103b5033330e0e0e0c0002293b691a8a002a691a89002a693b3e3b3b2d6805291a5c000e0c000203041a6b00103b50291a7000691a70002a69302a693b3e3c3b2d6805291a38000e0c000203041a4700103b5022113c221222122d1a4d0022130e0e7b0714000600000000cc00000000000000|@8865,I48,I251,I105,I218,I154,@8866,@389,@8867,@1784,@1058,@8868,@8864,@1058,@7251| 8864:O2|@1058,@8870 8865:S36|535452554354555245535f28292e7369675374727563744d697373696e674d7367283629 8866:S18|20696e207375622d73747275637475726520 8867:S34|53747275637475726520646f6573206e6f74206d61746368207369676e6174757265 8868:O2|3,@8869 8869:S10|5369676e61747572653a 8870:O2|@8871,0 8871:O5|0,3,0,0,@8872 8872:O2|@8874,@8873 8873:O2|@1058,@8876 8874:O2|3,@8875 8875:S10|5374727563747572653a 8876:O2|@8877,0 8877:O2|3,@8878 8878:S11|4e6f742070726573656e74 8879:O2|3,@8880 8880:S47|54797065732074616b6520646966666572656e74206e756d62657273206f66207479706520617267756d656e74732e 8881:O1|@8882 8882:D20,308|00872b1a32011a33010c000303033c02222b1a2b010c00021a29010e0e0c000203102b3b1a11013b3f1a1c010e0c000602013b0304282e020b1a10012c1a10010e0c00031a0d012a1a05010e0e0c00033e2a69291ae9000e0e0c000203041af700103b5034330e0e0e0c0002293b691aea002a691ae9002a693b3e3b3b2d6805291abc000e0c000203041acb00103b502211220f0e0c0002293b691ac6002a691ac5002a693b3e3b3b2d6805291a90000e0c000203041a9f00103b5022143b691aa9002a691aa8002a693b3e3b3b2d6805291a6b000c000203041a7b00103b50293b691a8e002a692f2a691a8a002a69220d2a691a85002a6922142a693b3e3c3b2d6805291a38000e0c000203041a4700103b50221e3c221f221f2d1a610022200e0e7b07230006000000002c01000000000000|@8883,I48,I251,I105,I218,I154,@8866,@389,@8867,@1784,@1058,@8868,@1058,@8874,@1058,@7553,@1058,@1058,@1058,@7251| 8883:S34|535452554354555245535f28292e7369675374727563744d617463684d7367283829 8884:O2|3,@8885 8885:S35|5479706520696e20737472756374757265206973206e6f742061206461746174797065 8886:O2|@8887,@2237 8887:D12,276|00802b37293629353d1a0c010e0c00036503952b352c37293629353c1af9000e0e0c000303042937024129353b1ae8000e0c000303042936023129363b2a291ada000e0e0e0c00021ad5000e0e0c0002031729362b3c1acb000c0003292b25042504511e253b6502012a66291ab9001aba000e0e0e0c0003291ab4000e0c000228052a30343b6805291aa8001aa90056a70c0004293c1a7f000c0003641a8000330e0e0e7d0a00022b37293629353d1a66000e0e0e0c000303041a7f00103b503b5029353b1a50000e0c00030323293729353c1a42000e0e0e0c0003030e2936293b1a5b00310e0e7e070003293664020f2936293b1a4800300e0e0e7e06000365420e0e0e0e0e0e000000000c01000000000000|@8889,I251,I105,I218,I106,@8890,@2047,@8892,@8894,@8888,@2039,I253| 8888:O1|@8896 8889:S30|545950455f5452454528292e7065726d697473457175616c697479283129 8890:O1|@8891 8891:D4,36|00803c28401a20001a21000e0e0c0004291a1c006964420e000000001c00000000000000|@2046,@855,I11,79992| 8892:O1|@8893 8893:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@8892| 8894:O1|@8895 8895:D1,20|00803c420e0e0e0e000000000c00000000000000|@7421| 8896:D1,20|00803d420e0e0e0e000000000c00000000000000|@7421| 8897:O2|3,@8898 8898:S41|5479706520696e20737472756374757265206973206e6f7420616e20657175616c6974792074797065 8899:D5,76|00802b353e2a69291a45000e0e0c000203041a3f00103b50293b691a3a002a691a39002a693b3b3b3b2d6805291a20000e0c000203041a1b00103b5029270642000000004400000000000000|@8900,I105,@1784,@2356,@2001| 8900:S61|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c6179537472756374757265283129 8901:D11,156|00883336291a98001a99000e0e0c000303033c0222291a8f000c00021a8d000e0e0c00020310293b1a75003b280f1a7f000c000602013b6403033b024b32351a7200220c333333333322101a6a00220c680a2a3b2b1a64000e0c00041a610030346a220d351a5c00221032220f220f220d30221122112216680a2a2d2b1a3c00340e0e7b051100041f090e0e0e0e0e0e000000009400000000000000|@8903,@6666,I251,I105,I218,I154,@8904,@8817,@1898,@8947,@8902| 8902:D4,92|00822c2c2a1a58000e0c00021a55000e0e0c000203302a352b36312b2d56775688569956aa56bb56cc56dd56ee56ff1a36000e0e0e0c000d2a2a2505250526031e3c3b6602012965440e0e0e0e0e0e0e000000005400000000000000|@1901,I105,I218,@8950| 8903:S38|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329 8904:D4,92|00822c2c2a1a58000e0c00021a55000e0e0c000203302a352b36312b2d56775688569956aa56bb56cc56dd56ee56ff1a36000e0e0e0c000d2a2a2505250526031e3c3b6602012965440e0e0e0e0e0e0e000000005400000000000000|@1901,I105,I218,@8905| 8905:O1|@8906 8906:D10,620|008b220c35291a67021a68020e0c00036407ce220c351a57021a58020e0c000303043b5002041a4f02103b50220c3734352922101a45020e0e0c0003291a40020e0c00021a3d020e0e0c00020358293529291a2b020c00021a29020e0e0c0002034029352a362a35291a04021a05020e0e0c00036403212a351af4011af5010e0e0c000303043b5002041aeb01103b502a37296801640207292503511e4b3b6502013b6502013b293b1ac8010e0c00030304220f028a2935292e2210221022102210221022101abf010c00095029362e362a2a22142b1aa7010c00021aa501020261000e0e0c000203142a1a92010e0e0e0c00021a8d010e0e0c000202013b033c2b352c362c352d362c382b3729353b1a61010e0e0c0003031029363d3d2d326b2a2a692933696602012f2e2d2b250a250a250a26071e613b2707020129270627040fd0220c35291a41011a26010e0e0e0c00036407d8220c351a2f011a14010e0c000303043b5002041a0b01103b50220c3734352922101a01010e0e0c0003291afc000e0c00021af9000e0e0c00020358293529291ae7000c00021ae5000e0e0c0002034029352a362a35291adc001ac1000e0e0c00036403212a351acc001ab1000e0e0c000303043b5002041aa700103b502a37296801640207292503511e4b3b6502013b6502013b293b1a84000e0c00030304220f025c293529372e373422151a8a000e0e0e0c000329282e1a7e00020245000e0e0e0c00032c2c2b2215221522152215221522132215020229000c000a323629353b1a38000e0c0003031029363b2c326a2a2a6929221a696602022216270727040201341f0c0e0e0e000000006402000000000000|@8908,@27,I251,@1840,@1842,I105,I218,@8907,@38,@389| 8907:O1|@8909 8908:S56|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d6174636853747275637475726573283329 8909:D15,628|008732353336333534362c352b352c37293629353c1a60020e0c000303042937024129353b1a50020e0c000303042936023129363b2a291a42020e0e0e0c00021a3d020e0e0c0002031729362b3c1a33020c0003292b25042504511e253b6502012a66291a21021a22020e0e0e0c00031a1d022211693337293629353c1af8010e0c000303042937024129353b1ae8010e0c000303042936023129363b2a291ada010e0e0e0c00021ad5010e0e0c0002031729362b3c1acb010c0003292b25042504511e253b6502012a663437293629353c1aa3010c000303042937024129353b1a94010e0c000303042936023129363b2a291a86010e0e0e0c00021a81010e0e0c0002031729362b3c1a77010c0003292b25042504511e253b6502012a662c2a1a70010e0c000327061a53010c000203033b0fdc28052b31220d3b680528052c31220c3b68052a2a221622161a48010e0c000529353c1a1e010e0e0e0c000303c9331a16010e0e0e0c00021a11010e0e0c00021a09010e0e0c000203033b02a83b220d291af4000e0c00021af1000e0e0c0002031729362b3c1ae7000c0003292b25042504511e233b6502012a653b220c291ac6000e0e0e0c00021ac1000e0e0c0002031729362b3c1ab7000c0003292b25042504511e253b6502012a652a2a1ab8000e0c00036503033b023b220c291a88000e0c00021a85000e0e0c0002032529352a362a220e220e221a221a02024e00221a1a88000e0c000750292503511e313b6502013b64023529362215221322141a6e001a6f000c00052a2a0e0e0e0c000264221922192b31221a221a221a22191a5600221a0e0e0e7b0a1a000966270b1f080e0e0e000000006c02000000000000|@8911,I251,I105,I218,I106,@8912,@2047,@8915,I113,@8923,I232,@8940,@8910,@7532,@8881| 8910:S5|6d61746368 8911:S33|535452554354555245535f28292e636865636b54797065436f6e73747273283829 8912:O1|@8913 8913:D4,44|00803c28401a28001a29000e0e0c000428062a1a22006a64420e0e0e0e0e0e0e000000002400000000000000|@8914,@855,I11,79992| 8914:S42|535452554354555245535f28292e636865636b54797065436f6e7374727328382974766172732d283129 8915:D4,44|008056071a29000e0e0c00022c2a1a23003b1a2300300e7b060400050e0e0e0e000000002400000000000000|@8917,@8854,@8916,@2003| 8916:O2|@8919,@8918 8917:S52|535452554354555245535f28292e636865636b54797065436f6e737472732838296572726f72496e44617461747970652d283129 8918:O1|@8922 8919:O1|@8920 8920:D1,20|00803b420e0e0e0e000000000c00000000000000|@8921| 8921:S49|535452554354555245535f28292e636865636b54797065436f6e737472732838297072696e7454797065456e762d283129 8922:D1,20|00803b420e0e0e0e000000000c00000000000000|@8921| 8923:O1|@8924 8924:D11,108|00831a6b002d691a6a002a692f1a68002b1a68000e0c0004040200321a61002b1a61000e0e0c00045029352a36291a57000c00022b2e1a53000c0003291a50000e0c00021a4d000e0e0c0002030829353b2a696402033c2f6927081f040e0e0e000000006400000000000000|@8926,@8927,@8929,@8936,@1914,@8925,@2071,@7503,@2004,I105,I218| 8925:O1|@8939 8926:S27|535452554354555245535f28292e6d617463685479706573283429 8927:D2,44|00802b3629353b1a26000e0e0e0c0003030a29382956372e7d0500023b64420e000000002400000000000000|@8928,I251| 8928:S36|535452554354555245535f28292e6d617463685479706573283429636f70794964283129 8929:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@8931,@8932,@8930,@1919| 8930:O1|@8935 8931:S45|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129 8932:O1|@8933 8933:D1,20|00802b420e0e0e0e000000000c00000000000000|@8934| 8934:S48|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129283129 8935:D1,20|00802b420e0e0e0e000000000c00000000000000|@8934| 8936:O1|@8937 8937:D1,20|00802b420e0e0e0e000000000c00000000000000|@8938| 8938:S43|535452554354555245535f28292e6d617463685479706573283429636f7079546172676574283129283129 8939:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 8940:O1|@8941 8941:D13,244|0085303530291aef000c00021aed000e0e0c0002036d29352a362a35292e1adf000c000303033c024a291acb000c00021ac9000e0e0c000203142d1aba000e0e0e0c00021ab5000e0e0c000202013b0321293b2f3b3f321aaa000e0e0e0c00021aa5000e0e0c00031aa1000e0e0c000602013b6403033c0207292503511e783b6502013b6403033b025a291a8200691a82002a69312a691a7e002a69661a7c000e0c00023e2a69291a4d000e0e0c000203041a6b00103b50293b693b3b3b3b2d6805291a32000e0e0e0c000203041a4f00103b50323c33332d1a4800220c0e7b070d0006641f060e00000000ec00000000000000|@8943,I105,I218,I251,I223,I239,I154,@8944,@8946,@8942,@371,@1784,@7251| 8942:S30|4572726f72207768696c65206d61746368696e6720646174617479706520 8943:S48|535452554354555245535f28292e636865636b54797065436f6e73747273283829636865636b436f6e73747273283129 8944:O2|@8945,0 8945:S55|207761732070726573656e7420696e207468652073747275637475726520627574206e6f7420696e20746865207369676e61747572652e 8946:S14|3a20636f6e7374727563746f7220 8947:D21,564|00802b352c382d3929291a2b020c00021a29020e0e0c0002031f29352a362a353b1a1c020e0c000303052a68010207292503511e2a3b6502013b64291af9010e0e0c00021af5010e0e0c00020311293529353b1aea010e0e0e0c00036402013b031e293529363b2a69291acb010c000203041acf01103b503b50293b696602013b3e2e69291ab0010e0c000203041ab701103b503b50293b693b3b3b2e2d6805291a94010e0c000203041a9b01103b503b503336293b1a87010c0003039d301a8a010e0e0e0c000229353d1a72010e0e0e0c0003030829362968016402013b291a55010e0e0c00021a51010e0e0c0002033c293556c81a57010c00023b1a54010e0c00022b2b2b121200010001003b1a46010e0e0e0c0006293b691a3e012a691a3d012a691a3c012a69270702013b2d2a691a33012a691a32012a693b3b3b3b2d6805291af1000e0e0c000203041af700103b503b5029270702ca291ad9000e0e0c00021ad5000e0e0c0002035d56981add000e0e0c00023b1ad8000e0c0002322b2b56e73b1acf000c0006293b691ade002a691add002a691adc002a69312a691ad8002a691ad7002a693b3b3b3b2d6805291a82000e0e0e0c000203041a8700103b503b5029270b025a56981a80000e0c00023b1a7c000e0c0002322b2b56e73b1a73000c0006293b691a82002a691a81002a691a80002a69312a691a7c002a691a7f002a693b3b3b3b2d6805291a26000e0e0e0c000203041a2b00103b503b5029270b270942000000002c02000000000000|@8949,I105,I218,I251,@1784,@1784,@1955,@8854,@2008,@2104,@2356,@2093,@2357,@2356,@2354,@1058,@1828,@1088,@2356,@8948,@7011| 8948:O2|3,@2353 8949:S53|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329646973706c617956616c7565283129 8950:O1|@8951 8951:D26,708|008b220c35291abf021ac0020e0c00036407ce220c351aaf021ab0020e0c000303043b5002041aa702103b50220c3729362a372b38220e352922131a96020e0e0e0c0003291a90020e0c00021a8d020e0e0c00020358293529291a7b020c00021a79020e0e0c0002034029352a362a35291a54021a55020e0e0c00036403212a351a44021a45020e0e0c000303043b5002041a3b02103b502a37296801640207292503511e4b3b6502013b6502013b291a25020e0e0c00021a21020e0e0c000207dc293529362a383c28403b1a11020e0e0c0004293b1a0b022217691a09020202cc010e0e0c000450323b1ade010e0e0e0c000303162b3b1ad1010e0e0c000303051ae70102031ae601025a321ac8010e0c00021ac5010e0e0c0002031e2b1ab6010e0e0e0c00021ab1010e0e0c000203051abf0102031abe01022a2b3b1a8b010c000303051ab301021b2b1a89010e0e0c00021a85010e0e0c000203051a9f0102031a9e0129353b1a60010e0c000307cd29362c33221722171a8b010c000529353b1a46010e0e0e0c0003033c29362216221622171a73011a74010202f4000e0c00052a2a0e0e0e0c0002643122102b2218221b2219221922191a56010e0e0e0c000950221b6502a62936303a291a06010e0e0e0c00021a01010e0e0c0002031429352936293b3c1afc000e0c0004503b260302023b50312306291ad9000e0e0c00021ad5000e0e0c0002033c29350402002d1a01012b1a01010e0e0c00045029352a36291af7000c00022d3b1af3000c00032c2a692f3b2b1aab00020232000c0004503b260802023b50220e353b1a79000e0e0c00030313220e363d2f2e220d6b2a2a6929222069660202221c6665021d29362e220d2b221522182216221622161a8e000e0e0e0c000950221864270502172f220d2210220e220e220e1a86000e0e0e0c000750221227070201341f0c0e0e0e0e0e0e00000000bc02000000000000|@8953,@23,I251,@1840,@1842,I105,I218,I11,@8954,I255,@8969,@8970,@8969,@8973,@808,@740,@8969,@8923,@8910,@7532,@8881,@8952,@2071,@7503,I253,@8862| 8952:O1|@8976 8953:S57|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d617463684c6f63616c56616c756573283329 8954:D17,524|00802b363c1a08020e0c000303051a03020fdd2b3529353b1afd010e0e0c00036407df2b3529362d363c1aef010c00032a2a6956473b1ae7010c00032a2a0e0e0e0c00026429353b1acd010e0e0c000303932939291acc010e0c00021ac9010e0e0c0002035f29361ab9010e0e0c00021ab5010e0e0c000203482935353e1a97010c000303312935362928281a89010e0e0c000303033c021b29287b1a79010e0e0c000303033c020b29285b1a69010e0e0c00036402013b1a6d010e0e0c000202013b02013b03192a1a6001691a60012a691a5f012a693b3e3c3b2d68056602012a64020129293b691a4c012a6902020a011a47012a693b3c3b3b2d680527090fdd00002b363c1a06010e0e0e0c000303051a2b010fdd2b3529362d363c1afb000c00032a2a691a1a013b1af2000e0e0e0c00032a2a0e0e0e0c00026429353b1ad5000e0e0c000303932939291ad4000e0c00021ad1000e0e0c0002035f29361ac1000e0e0c00021abd000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1a75000e0e0c000202013b02013b03192a1a6800691a68002a691a67002a693b3e3c3b2d68056602012a64020502021b0029293b691a60002a691a5f002a693b3c3b020206003b2d68052709420e0e0e000000000402000000000000|@8956,I234,@2016,I251,I107,I253,I105,I218,@1087,@1088,@1060,@1058,@8957,@2016,@167,@1058,@8955| 8955:O5|0,0,0,@8959,@8966 8956:S15|7072696e742d6d6174636854797065 8957:O5|0,0,0,@8959,@8958 8958:O2|@8962,0 8959:O2|@8960,0 8960:O2|0,@8961 8961:O5|@8767,1261,1261,0,0 8962:O2|3,@8963 8963:S4|49734f4b 8964:O1|@8965 8965:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 8966:O2|@8967,0 8967:O2|3,@8968 8968:S7|497357726f6e67 8969:O2|0,2 8970:O2|1,@8971 8971:O2|3,@8972 8972:S25|56616c7565206973206e6f7420616e20657863657074696f6e 8973:O2|1,@8974 8974:O2|3,@8975 8975:S26|56616c7565206973206e6f74206120636f6e7374727563746f72 8976:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 8977:D2,36|00802b56181a20000e0c000356172c0e0e8000020e0e0e0e000000001c00000000000000|@8978,I106| 8978:S44|535452554354555245535f28292e73747275637456616c7565283829725369672d736f75726365732d283129 8979:O1|@8980 8980:D9,204|00822d1aca000e0e0e0c00021ac5000e0e0c000203a12d352e362a3629353b1ab6000e0e0e0c000303043b5002041aab00103b5029362a392d37293529341a9f006a303629353d1a8e000e0e0e0c000303041a8f00103b503b5029353b1a78000e0c00030322293729353c1a6a000e0e0e0c0003030d2936293b1a6b000c0003640202293664020d2936293b1a59000e0e0c0003642f3b2b312f680565340e0e0e0c000230220d220d1a40000e0c00042a2a69270a02013b440e0e0e0e0e0e0e00000000c400000000000000|@1785,I105,I218,I251,@8982,@8981,@2039,I253,@8979| 8981:S29|437265617465642066726f6d206f7061717565207369676e6174757265 8982:O4|@35,@863,@8984,@8983 8983:O5|@8767,1765,0,1765,0 8984:S9|4e6f7420426f756e64 8985:O1|@8986 8986:D7,108|00812c3b1a69000e0e0c000303172b3b1a5d000e0e0c000303043b5002041a5300103b02342c352d362d1a4b000c00021a49000e0e0c000203043b5002041a3f00102d352e362a2d692c2b1a36000e0e0e0c00032a2a692706430e0e0e0e0e0e000000006400000000000000|@3980,I251,@3979,I105,I218,@3979,@8985| 8987:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@8988,I234,I107,I105,I218,I15,I247,@866,I253| 8988:S42|535452554354555245535f28292e73747275637456616c7565283829725369672d6f6c644d6170283129 8989:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 8990:D2,52|008056093a2c2a1a2e000e0e0e0c00036403092b56172c0e0e8000022b56182c0e8000020e0e0e0e000000002c00000000000000|@8991,I234| 8991:S46|535452554354555245535f28292e73747275637456616c7565283829725369672d6d617463686564496473283129 8992:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 8993:O1|@8994 8994:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 8995:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8996:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8997:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 8998:D3,68|00803b56180c0002561723093b2a0e0e0e0c000264293b1a2e000e0e0e0c000303032a020b2a2a1a22002f0e7e05000365420e0e0e0e0e0e000000003c00000000000000|@9000,I251,@8999| 8999:O1|@9001 9000:S40|535452554354555245535f28292e73747275637456616c75652838296c6f63616c456e762d283129 9001:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8999| 9002:O1|@9003 9003:D1,20|00803b420e0e0e0e000000000c00000000000000|@9000| 9004:O1|@9005 9005:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 9006:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9007:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9008:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9009:D3,68|00803b56180c0002561723093b2a0e0e0e0c000264293b1a2e000e0e0e0c000303032a020b2a2a1a22002f0e7e05000365420e0e0e0e0e0e000000003c00000000000000|@9011,I251,@9010| 9010:O1|@9012 9011:S38|535452554354555245535f28292e73747275637456616c75652838296e6577456e762d283129 9012:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9010| 9013:O1|@9014 9014:D1,20|00803b420e0e0e0e000000000c00000000000000|@9011| 9015:O1|@9016 9016:D2,20|00801a1300100e0e000000000c00000000000000|@9011,@9017| 9017:O4|@35,@863,@9019,@9018 9018:O5|@8767,1568,0,1568,0 9019:S23|5369676e617475726520696e2053747275637420456e64 9020:O1|@9021 9021:D2,20|00801a1300100e0e000000000c00000000000000|@9011,@9022| 9022:O4|@35,@863,@9024,@9023 9023:O5|@8767,1569,0,1569,0 9024:S21|46756e63746f7220696e2053747275637420456e64 9025:O1|@9026 9026:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 9027:D4,76|00822c2c2a1a48000e0c00021a45000e0e0c000203242a352b36312b2d5677568856991a32000e0e0e0c00072a2a2505250526031e303b6602012965440e0e0e000000004400000000000000|@1901,I105,I218,@9028| 9028:O1|@9029 9029:D10,580|00852e352f363135291a3c021a3d020e0e0c00036407db31351a2c021a2d020e0e0c000303043b5002041a2302103b50313729352a36291a1a020e0e0e0c00021a15020e0e0c00021a0d020e0e0c00020310220c2c69330e0e0c0002502d2d6902ca2d2d693b2a690402002c2b2a1ae3010c00021ae1010e0e0c000203542a352b362a352b362c382d392e3a2f23063135323629352a363b2b6933332b343434346807292f692d3c1ab1010e0e0c00033d3d220d22126b2f2a692930692c2a692e2a6922132a2517251726151e5f26150209292c2a35452a3646515129352a362f35303731362b2a2c6a2e3b2a1a640102023b000e0c00021a5d010e0e0c000203152a352b362a2c692a2a2505250526031e253b66020129652a2a6922172a696522130e0e0c0002502d2709660fd73135291a2b011a14010e0c000364035a31351a1c011a05010e0e0c000303043b5002041afb00103b50313729382a37291a02010e0e0e0c00023b2f69220e2a2d2f6b220f2a6965330e0e0c0002502e3c1ada000e0e0e0c00033b2b2f6a302a692931692c2a69270802983135291ac9001aaa000e0e0e0c000364038331351ab8001a99000e0e0c000303043b5002041a8f00103b503137293729353e1a7e000e0e0e0c00030310342b69300e0e0e0c0002502c2c6902452a362b382c392d3a2e23063b326922112f2b30303030680722122a69220e020229000e0c000250333c1a4a000e0e0e0c00033d3d31220c6b220c2a6929220d692c2a69270b6502032a2a69651f060e0e0e0e000000003c02000000000000|@9031,@27,I251,@1840,I105,I218,I106,@38,@9030,@23| 9030:O1|@9032 9031:S40|535452554354555245535f28292e73747275637456616c7565283829656e7465724974656d283329 9032:D4,36|00802b351a21001a2200692a3b2b1a1f00300e7b05050004000000001c00000000000000|@9034,@9033,@9030,@1898| 9033:D4,76|00822c2c2a1a48000e0c00021a45000e0e0c000203202a352b36312b2d56771a36000e0e0e0c00052a2a2505250526031e2c3b6602012965440e0e0e0e0e0e0e000000004400000000000000|@1901,I105,I218,@9035| 9034:S32|535452554354555245535f28292e6d616b65436f7079416374696f6e73283129 9035:O1|@9036 9036:D8,308|00832d35291a30011a31010e0e0c00036403432d351a20011a21010e0e0c000303043b5002041a1701102d37293629353b1a08010e0c0003031829362b372f0e0e0c00023b2a2e6a2b2a69293369270402012e6502cd2d35291ae8001add000e0e0c000364033e2d351ad8001acd000e0e0c000303043b5002041ac300102d37293729353b1ab4000e0c0003031329362b383d3d2b2f6b2b2a69293369270402012e65027e2d35291a9d001a8e000e0e0e0c000364036b2d351a8c001a7d000e0e0c000303043b5002041a7300102d372936292f2a1a74000e0c00021a71000e0e0c000203372a352b362a3729353b1a4a000e0e0e0c0003031329362c383d3d2b306b2b2a69293169270402012c2b2a2506250626041e423b2704020129270402012c1f040e0e0e000000002c01000000000000|@9037,@38,I251,@1840,@23,@27,I105,I218| 9037:S45|535452554354555245535f28292e6d616b65436f7079416374696f6e732831296d61746368456e747279283329 9038:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@8814,@7152| 9039:O1|@9040 9040:D9,180|00812b1ab2000e0e0e0c00021aad000e0e0c0002038d2b352c362a3529353b1a9e000e0e0e0c000303043b5002041a93001029362c3629353d1a84000e0c000303041a8300103b5029353b1a72000e0e0e0c00030322293729353c1a62000e0e0e0c0003030d2936293b1a5f000c0003640202293664020d2936293b1a4d000e0e0c0003643c2a346a2c2a69343c1a3f000c000329311a3b000c00032b2a69270a02013b430e0e0e00000000ac00000000000000|@9042,I105,I218,I251,@9041,@2039,I253,I106,@9039| 9041:O4|@35,@863,@9044,@9043 9042:S29|535452554354555245535f28292e6d6174636854797065496473283229 9043:O5|@8767,1403,0,1403,0 9044:S24|6d61746368547970654964733a204e6f7420466f726d616c 9045:O1|@9046 9046:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9045| 9047:D2,36|00802b56181a20000e0c000356172c0e0e8000020e0e0e0e000000001c00000000000000|@9048,I106| 9048:S39|535452554354555245535f28292e73747275637456616c7565283829726573756c74732d283129 9049:O1|@9050 9050:D7,108|00812c3b1a69000e0e0c000303172b3b1a5d000e0e0c000303043b5002041a5300103b02342c352d362d1a4b000c00021a49000e0e0c000203043b5002041a3f00102d352e362a2d692c2b1a36000e0e0e0c00032a2a692706430e0e0e0e0e0e000000006400000000000000|@3980,I251,@3979,I105,I218,@3979,@9049| 9051:O1|@9052 9052:D10,212|00832e1ad2000e0e0e0c00021acd000e0e0c000203ad2e352f362a3629353b1abe000e0e0e0c000303043b5002041ab300103b5029362a392d3729351aa900220c1aa8000e0c00032a220c2b6a313629353d1a8b000c000303041a9300103b503b5029353b1a78000e0c00030322293729353c1a6a000e0e0e0c0003030d2936293b1a6f000c0003640202293664020d2936293b1a5d000e0e0c000364303b2b322f680565220c0e0e0c0002293369322210221022101a3f000c00052a2a69270c02013b1f040e0e00000000cc00000000000000|@1785,I105,I218,I251,@9054,@9053,@389,@2039,I253,@9051| 9053:S30|437265617465642066726f6d206170706c79696e672066756e63746f7220 9054:O4|@35,@863,@8984,@9055 9055:O5|@8767,1508,0,1508,0 9056:O1|@9057 9057:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9056| 9058:D10,164|00802b561c1aa0000e0c0003030a2b56172c0e0e0e80000256093a2c2a1a8c000e0c000364034956093a2c2a1a81000e0e0c0003291a7c000e0c00021a79000e0e0c000203033c021456281a6e000e0e0e0c00022a2a1a67000c00036403041a6200103b5056282a1a5d002f7e050003560b3a2c2a1a34000e0c00036403092b561a2c0e0e800002560b392c2a2d0e0e7d0400020e0e0e0e000000009c00000000000000|@9059,I234,I231,I107,I105,I218,I15,I247,@866,I253| 9059:S48|535452554354555245535f28292e73747275637456616c7565283829676574436f6d62696e6564547970654964283129 9060:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 9061:S9|46756e63746f722028 9062:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9063,@7152| 9063:S32|535452554354555245535f28292e676976654572726f72283329283129283129 9064:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9063,@7152| 9065:S29|535452554354555245535f28292e676976654572726f72283329283129 9066:D7,172|008833291aa9000e0e0c00021aa5000e0e0c0002038629352a362a353b1a98000e0c0003031a2a362b372a2a220d2211220c220f1a85000e0e0c0007260302522a353c1a72000e0e0e0c000303222a362b37292b220d31342213221322132212221222121a59000e0e0c000c260302222a372b382c2b2b220d220d2213220e56c7220f2216221622161a38000e0c000d2603292503511e933b6502013b641f0900000000a400000000000000|@9068,I105,I218,I251,@9069,@9090,@9067| 9067:O1|@9109 9068:S28|535452554354555245535f28292e7061737332537472756374283829 9069:O1|@9070 9070:D8,132|00852e23062f2308303931230c323a33230b1a7300220d220d6a1a6f00220e220e6a1a6b00220f220f6a1a6700221022106a220f3622102307221123092d2c3131220e220d221231221332220d22122215680d1a4200221322136a22162a2c22141a38001a39000e0e0c00063b27101f060e0e0e0e0e0e0e000000007c00000000000000|@9072,@9073,@9077,@9080,@9083,@9086,@9071,@7437| 9071:O1|@9088 9072:S45|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e283229 9073:D5,92|00802b365618372d2a0c00025156173b1a4d000e0e0c00033e2b69293b69293b1a41000e0e0c000303032b020b2b2a1a36000e0e0e0c000356573b2b1a2d000e0e0c0004503b2705420e0e0e0e0e0e0e000000005400000000000000|@9075,I253,I251,@9074,I255| 9074:O1|@9076 9075:S55|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296e6577456e762d283129 9076:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9074| 9077:D5,92|00802b365618382d2a0c00025156173b1a4d000e0e0c00033d2b69293b69293b1a41000e0e0c000303032b020b2b2a1a36000e0e0e0c000356573b2b1a2d000e0e0c0004503b2705420e0e0e0e0e0e0e000000005400000000000000|@9075,I253,I251,@9078,I255| 9078:O1|@9079 9079:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9078| 9080:D5,92|00805608352c2a0e0e0c00025156073b1a4d000e0e0c00032c352d363b2b2b6a293b69293b1a3c000e0c000303032d020b2d2a1a32000e0e0e0c000356673b2b1a29000e0e0c0004503b2706420e0e0e000000005400000000000000|@9075,I253,I251,@9081,I255| 9081:O1|@9082 9082:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9081| 9083:D5,92|00802b365618230a2d2a0e0e0e0c00025156173b1a49000e0e0c00033c2b69293b69293b1a3d000e0e0c000303032b020b2b2a1a32000e0e0e0c000356573b2b1a29000e0e0c0004503b2705420e0e0e000000005400000000000000|@9075,I253,I251,@9084,I255| 9084:O1|@9085 9085:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9084| 9086:D7,156|00832c3629353c1a96000e0e0e0c000303562d352d352e362f373b2d291a84000e0c00021a81000e0e0c0002031729362b3c1a77000c0003292b25042504511e233b6502012a6556682d1a63000c0003292d2d6a2b3c220f220f2d6805665667310e0e0e7d0b00022d352d352e362f3756582c1a3a000e0e0e0c0003292c2c6a3d2f316a1a2d002a2c6a27081f040e0e000000009400000000000000|@9087,I251,I105,I218,I106,@389,@961| 9087:S54|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296d616b654964283429 9088:D1,20|00803b420e0e0e0e000000000c00000000000000|@9089| 9089:S50|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832295f2d283129 9090:O1|@9091 9091:D21,364|008a7881453c28403b1a64010e0c0004280b28403b1a58010e0c0004293b401a52010e0e0e0c0004503c28402b1a40010e0c00043c28401a3e011a33010c00043c2a2e2d6b2704053a0e00ff6d29353f1a29010e0e0c00030323403c1a21010e0e0c00031a1d012a1a1d010e0e0c00031a19011a1a012b1a1a016b65103b503b502910040d002a2a1a0d010e0e0c00035029362a372b382c392d23062e23072f230830230931230a32230c221623061aea002a316a221823081ae4002a316a221a230c1ade002a306a221c3a221d230b1ad500221f220c6a1ad100221322132213221330220d2214220d322214220c220f680d2222221e221e221e2d221f221f221f222622280e0e0e0c000a1aa100222222156a1a9d00222322156a1a9900222422106a1a9500222522196a1a7d002a2e2e2219220d2213221a2213220f3422122215680d22272224222422242d222522252225222c222e22270e7b0b29000a000000006401000000000000|@9093,I11,I255,@9094,I251,@510,@7324,@389,@35,@863,@7325,@1835,@9096,@9097,@9098,@9099,@9103,@9105,@9107,@9108,@9092| 9092:D1,36|00802b56180c0002505607362c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9106| 9093:S44|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229 9094:O1|@9095 9095:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 9096:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9097:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9098:D2,44|00802b56180c0002293b1a23000c0003030a2c56272d0e0e7d0400022964420e000000002400000000000000|@6364,I251| 9099:D3,68|00803b56180c0002561723093b2a0e0e0e0c000264293b1a2e000e0e0e0c000303032a020b2a2a1a22002f0e7e05000365420e0e0e0e0e0e000000003c00000000000000|@9101,I251,@9100| 9100:O1|@9102 9101:S56|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c6465632832296c6f63616c456e762d283129 9102:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9100| 9103:O1|@9104 9104:D1,20|00803b420e0e0e0e000000000c00000000000000|@9101| 9105:D1,36|00802b56180c0002505607372c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9106| 9106:S55|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229626f6479456e762d283129 9107:D1,36|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9106| 9108:D1,36|00802b56180c0002505607230a2c2a2d7d0400020e0e0e0e000000001c00000000000000|@9106| 9109:D13,276|008b1a1301220e220c220c6b0403002a2a1a08010e0c00035029352a361a00012210220e6a2211291af9000e0e0c00021af5000e0e0c000203bf29352a362a352b362c372d3822132c1ae0000e0c000329282e1ad6000e0e0e0c00030406002d34221522152215221e220c3131221d221f0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68062f3b1aa2001aa3000c00043b220f69222223103b2a0e0e0e0c00023d2a69293b692d2a693c28401a85001a86000e0e0e0c00043c28401a7e001a77000c00043d2b2b6a22162a220c2f6b22172a69221e0c00025029680122163b2b1a5d000e0e0c000450221a251d261c1ecc261c02023b505030230a2c310e0e0e7d130002000000000c01000000000000|@9111,@9112,@6494,@9117,I105,I218,@389,@9110,@1898,-1,I11,@2364,I255| 9110:O1|@9119 9111:S48|535452554354555245535f28292e70617373325374727563742838297061737332537472756374757265446563283329 9112:D8,116|00821a73005617691a71002f1a71000e0e0c0003291a6c001a65000e0e0c00033e2a69291a61000e0e0c000203041a5b00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a3f00103b5056683c3056992d1a3600220d0e0e0e7b070b00060e0e0e0e000000006c00000000000000|@9114,@9115,@9113,@389,@7256,I105,@1784,@7251| 9113:S10|53747275637475726520 9114:S56|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329 9115:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9116,@6962| 9116:S59|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329283129 9117:D3,52|00802b56180c000256173b1a2a000e0e0e0c00032a2a6956373b2b1a1e000e0e0e0c0004502b6642000000002c00000000000000|@9118,I253,I255| 9118:S61|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332963617074757265496473283129 9119:D10,220|00822c2c2a1ad8000e0c00021ad5000e0e0c000203b32a352b362a35291ac8001ac9000e0e0c000364038f2a351ab8001ab9000e0e0c000303043b5002041aaf00102a37293a291a96000e0e0e0c00021a91000e0e0c0002031429352936293b3c1a90000e0c0004503b260302023b502a2306291a69000e0e0c00021a65000e0e0c0002033029352c380402002a1a67002b1a67000c00045029352a36291a5f000c00022b3b692f3b2b1a47000c0004503b270702013b6602013b2a2a2505250526031ebf3b6602012965440e0e0e0e00000000d400000000000000|@1901,I105,I218,@23,I251,@1840,I255,@9120,@2071,@7503| 9120:O1|@9121 9121:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 9122:S3|28292e 9123:O1|@9124 9124:D4,68|00822c2c2a1a40000e0c00021a3d000e0e0c0002031c2a352b36312b2d1a30000e0c00042a2a2505250526031e283b6602012965440e0e0e000000003c00000000000000|@1901,I105,I218,@8722| 9125:D9,204|00802b561c1ac8000e0c0003030a2b56172c0e0e0e8000022b561b1ab2000e0e0e0c0003034e56093a2c2a1aa6000e0e0e0c0003291aa0000e0c00021a9d000e0e0c000203033c021456281a92000e0e0e0c00022a2a1a8b000c00036403041a8600103b503b5056282a1a7f002f0e0e7e0500032b561b1a5a000e0e0e0c0003291a54000e0c00021a51000e0e0c000203033c0214561a1a46000e0e0e0c00022a2a1a3f000c00036403041a3a00103b503b50561a2a1a33002e0e0e7e04000300000000c400000000000000|@9126,I234,I107,I105,I218,I15,I247,@866,I253| 9126:S76|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229726573547970654d6170283129 9127:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 9128:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@8757| 9129:D11,244|00802b352c362d372e382f3956583b1ae6000e0e0e0c00033b2a291ade000e0e0e0c00021ad9000e0e0c0002031729362b3c1acf000c0003292b25042504511e253b6502012a652e03303c28401ab8001ab9000e0e0c00043c28401ab2001aab000c00043d2b2b6a322a2e3333336806661aa0000e0c0002022e3c28401a88001a89000e0e0c00043c28401a82001a7b000c00043d2b2b6a322a2e3333336806661a74000e0c000256883b1a4a000e0e0e0c00032a2a6956a83b2b1a5e000e0e0e0c00045056a73b1a2d000e0e0c00032c2a6956c73b2b1a42000e0e0e0c0004502d270c420e0e0e00000000ec00000000000000|@9130,I253,I105,I218,I106,-1,I11,@2364,@7412,@7400,I255| 9130:S52|535452554354555245535f28292e7061737332537472756374732833297061737332546f704465632832296d616b654964283129 9131:D3,36|00802b352c3629382b2a56571a19001a1a00327b06060005000000001c00000000000000|@7219,@7220,@7218| 9132:O1|@9134 9133:S32|535452554354555245535f28292e706173733253747275637473283329283129 9134:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 9135:O1|@9136 9136:D9,116|00802b363c1a70000e0c000303051a6b0002532b35293b1a66000e0e0e0c00036403051a5e00023e2b363c1a4a000e0e0e0c000303051a4f00022b2b35293c1a3e000e0e0e0c00036403051a3e0002162b363c1a22000e0e0e0c000303051a2f0002031a2e00420e000000006c00000000000000|@9138,I234,@2016,I251,@9139,@2016,@9146,@2016,@9137| 9137:O5|0,0,0,@9154,@9153 9138:S20|7072696e742d76616c7565436f657263696f6e73 9139:O5|0,0,0,@9141,@9140 9140:O2|@9144,0 9141:O2|@9142,0 9142:O2|0,@9143 9143:O5|@8767,129,129,0,0 9144:O2|3,@9145 9145:S18|436f6e7374727563746f72546f56616c7565 9146:O5|0,0,0,@9148,@9147 9147:O2|@9151,0 9148:O2|@9149,0 9149:O2|0,@9150 9150:O5|@8767,128,128,0,0 9151:O2|3,@9152 9152:S16|457863657074696f6e546f56616c7565 9153:O2|@9157,0 9154:O2|@9155,0 9155:O2|0,@9156 9156:O5|@8767,127,127,0,0 9157:O2|3,@9158 9158:S10|4e6f436f657263696f6e 9159:O3|@9161,@9263,@9160 9160:O3|@9557,@9264,@9263 9161:D3,52|00812c352d362e371a2d000e0e0c00042c352d362b564756581a2000310e0e7b070500060e0e0e0e000000002c00000000000000|@9163,@8137,@9162| 9162:O1|@9164 9163:S34|535452554354555245535f28292e737472756374734578706f727454726565283229 9164:D7,108|00842f3b1a69000e0e0c000303052e2e6902461a5e00301a5e003030303468073f2a69291a55000e0e0c000203041a4f00103b503b50293b69293b1a32000e0e0e0c0003030330020b302a1a36000e0e0e0c0003322a6927041f050e0e0e0e0e000000006400000000000000|@9166,I251,@9167,@9162,I105,@1784,@9165| 9165:O1|@9262 9166:S47|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229 9167:D2,44|00802b56173b56385649565a566b5677568c1a1b00340e7b0b03000a0e0e0e0e000000002400000000000000|@9169,@9168| 9168:O1|@9170 9169:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283129283129 9170:D10,156|0088321a9a000e0e0e0c00021a95000e0e0c000203043b5002041a8b00103b50323533361a8500333030220c220c220c68072968012b3b1a76000e0e0e0c000303033b02351a6c001a6d00220f220f220f220f220f220f220f220f680a2968011a59001a52002f2c221122112211221122112211680a29680166292b220f6a292f220d220d1a3800220c0e7b06110005000000009400000000000000|@9172,I105,I218,@9173,@9175,I251,@9177,@9168,@9178,@9171| 9171:O1|@9179 9172:S58|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329 9173:O4|@77,@2231,0,@9174 9174:O5|@8767,828,0,828,0 9175:D1,36|008056085619562a563b564c5657307b070300060e0e0e0e000000001c00000000000000|@9176| 9176:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329283129 9177:D1,44|00802b56185629563a564b565c566d567e568f5697340e7b0b03000a0e0e0e0e000000002400000000000000|@9169| 9178:D1,44|00802b56185629563a564b565c566d567e568f5697340e7b0b03000a0e0e0e0e000000002400000000000000|@9169| 9179:D13,220|00831adb002e6928092a69291ad5000e0e0c000203041acf00103b503b503035313632371ac5000e0e0c00042a2a691abe001abf0034343434680632353b1ab7000c00030339323633371aaf0034692c68012a2a692d2a1aa6000e0e0e0c0003303b1a93000c0003030329020b29311a92000e0e0e0c00032e2a692707024d32353c1a73000c00030335323633372b68011a74002a692c2a1a65000e0e0c00032f3b1a53000c0003030329020b29301a5a000e0e0e0c00032d2a692706020d3236342a33330e0e0e7e0c000327051f0400000000d400000000000000|@9181,@9182,I105,@1784,@8137,@9184,@9171,I251,@9186,@8234,@9247,@9249,@9180| 9180:O1|@9261 9181:S33|535452554354555245535f28292e746f704465634578706f727454726565283229 9182:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9183,@6959| 9183:S48|535452554354555245535f28292e746f704465634578706f727454726565283229636f6d6d6f6e50726f70732d283129 9184:D1,36|008056085619562a563b56472f0e0e7b060300050e0e0e0e000000001c00000000000000|@9185| 9185:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296173506172656e74283129 9186:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@9188,@9187| 9187:O1|@9189 9188:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283129 9189:D11,236|00822c3529372e362f3730383123063223070402002b3c1ad6000e0e0e0c0003030c2e353d1ac8000e0c000302013b031a2e3629352a362b372c382b2b2b6a296801302a452f4626080206293b452f465029352a36220e35220f362210371a93000c00041a91001a9200221122112211680521071a89004521051a87004521071a85004521051a83004529220c4633472b482e496c502a220f462a472e482c492d4a314b6c502b31462d472b482e496c502c22134630472e482c492b4a314b6c503f2a69291a48000e0c000203041a4300103b503b50293069220e2a6927124400000000e400000000000000|@9191,I251,@8137,@9192,@9187,@9194,@9196,@9244,@9190,I105,@1784| 9190:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@9246,@8203| 9191:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229 9192:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@9193| 9193:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296578706f727454686973283129 9194:D3,68|0080560c3b1a40000e0c00031a3d000e0e0c00020304560a0202560b561968012a68013b2b2b6a2956585667310e0e0e7e0700030e0e0e0e000000003c00000000000000|@9195,I251,I218| 9195:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574426f6479283129 9196:D4,68|0080560a68015619680156286801292c2c6a56473b1a30000e0c000303041a2b00103b5056473529352b2a1a2200330e7e0900030e0e0e0e000000003c00000000000000|@9198,I251,@2309,@9197| 9197:O2|@9200,@9199 9198:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574536967283129 9199:O2|@9211,@9210 9200:D13,204|00811acb002c6928092a69291ac5000e0e0c000203041abf00103b503b502e352f3630371ab5000e0e0c00042a2a691aae002e32326b30353d1aa8000e0c000303071aa3002b69027430353b1a95000e0e0c00030335303631372b680156872a692c2a1a86000e0e0e0c00032f3b1a73000c0003030329020b29301a72000e0e0e0c00032d2a692706023230373138293b1a60000e0c0003291a5c000e0c00022e3b1a3f000c0003030329020b292f1a4a000e0e0e0c00032d2a69270527054300000000c400000000000000|@9202,@9203,I105,@1784,@8137,@9205,I251,@6406,@8234,@9207,I253,@1781,@9201| 9201:O1|@9209 9202:S29|5349474e41545552455328292e7369674578706f727454726565283229 9203:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9204,@6972| 9204:S44|5349474e41545552455328292e7369674578706f727454726565283229636f6d6d6f6e50726f70732d283129 9205:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@9206| 9206:S40|5349474e41545552455328292e7369674578706f7274547265652832296173506172656e74283129 9207:O1|@9208 9208:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9207| 9209:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9201| 9210:O3|@9214,@9213,@9197 9211:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@9212| 9212:S30|5349474e41545552455328292e737065634578706f727454726565283129 9213:O2|@9242,@9197 9214:D19,452|00811ac3012c6928092a69291abd010e0e0c000203041ab701103b503b502e352f3630371aad010e0e0c00042a2a691aa6012e32326b30350a05007f009900440078000c002401303631371a8e015688692c68012a2a692d2a1a84010e0c0003303b1a7f010c0003030329020b29311a76010e0e0e0c00032e2a6927070fde303631372b680156872a692c2a1a51010e0e0c00032f3b1a4b010c0003030329020b29301a46010e0e0e0c00032d2a6927060fdb1a3a012b690fdb3036040200332b2b1a2f010c00045029352a362a2a69270402da3036313732382a352b362b1aea000e0e0e0c00021a0d010e0e0c000203422b35541a04014521051a020145292e462d472b4832496c502a2c462a4732486c503f2a69291ab2000e0e0e0c000203041aab00103b503b50293469322a69270502251acd002b2b316b3f2a69291a8a000e0e0e0c000203041a8300103b503b50293269302a6966270502514f003036313732382a352b36541a9b004521051a990045292d462c472b4831496c502a2e462a4731486c503f2a692902021e001a3900020217000e0e0c000203041a2f00103b503b50293369312a6927092705430e0e0e0e0e0e0e00000000bc01000000000000|@9216,@9217,I105,@1784,@8137,@9219,@9221,@8234,I251,@9232,@9234,@6406,@7438,I218,@9236,@9238,@9240,@9241,@9215| 9215:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@9239,@8203| 9216:S30|5349474e41545552455328292e737065634578706f727454726565283229 9217:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9218,@7006| 9218:S45|5349474e41545552455328292e737065634578706f727454726565283229636f6d6d6f6e50726f70732d283129 9219:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@9220| 9220:S41|5349474e41545552455328292e737065634578706f7274547265652832296173506172656e74283129 9221:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@9223,@9222| 9222:O1|@9224 9223:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283129 9224:D8,124|00822c352d362e372f3829351a71001a7200343434680521051a6c004521051a6a00452930462f472b482c496c502a34462d472a482c496c503f2a69291a50000e0c000203041a4b00103b503b50220d35220e36220f371a3e000e0e0e0c00042a2a69332a69270b440e0e0e0e0e0e0e000000007400000000000000|@9226,@9227,@9222,@9229,@9225,I105,@1784,@8137| 9225:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@9231,@8203| 9226:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229 9227:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@9228| 9228:S54|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296578706f727454686973283129 9229:D1,36|0080560a6801561968013b2b2b6a2956485657307e060003000000001c00000000000000|@9230| 9230:S56|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229676574536967537472756374283129 9231:S51|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296765744e616d65283129 9232:O1|@9233 9233:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9232| 9234:O1|@9235 9235:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9234| 9236:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@9237,@8215| 9237:S40|5349474e41545552455328292e737065634578706f72745472656528322967657454797065283129 9238:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@9239,@8203| 9239:S40|5349474e41545552455328292e737065634578706f7274547265652832296765744e616d65283129 9240:D2,44|0080560968013b2a3b6a29563756483b1a1d00310e0e0e7b060500050e0e0e0e000000002400000000000000|@9239,@8203| 9241:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@9237,@8215| 9242:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@9243| 9243:S29|5349474e41545552455328292e7369674578706f727454726565283129 9244:D4,68|0080560c3b1a40000e0c00031a3d000e0e0c00020304560a0202560b56196801562868012b6801292c2c6a2956671a1f00320e0e7e080003000000003c00000000000000|@9245,I251,I218,@9197| 9245:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574417267283129 9246:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296765744e616d65283129 9247:O1|@9248 9248:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9247| 9249:O1|@9250 9250:D2,28|00802b352c361a17002d0e0e7e030003000000001400000000000000|@9252,@9251| 9251:O1|@9253 9252:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283129 9253:D8,108|00812b352c362d382e391a63001a640032326b541a61004521051a5f0045292f462e472b482c496c502a2d462a472c486c503f2a69291a47000c000203041a4300103b503435220c36220d371a39000e0e0c00042a2a69322a69270a430e0e0e000000006400000000000000|@9255,@9256,@9251,@9258,@9254,I105,@1784,@8137| 9254:D2,44|0080560a680156196801292b3b6a29564756583b1a1900320e0e0e7b06060005000000002400000000000000|@9260,@8203| 9255:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229 9256:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@9257| 9257:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296578706f727454686973283129 9258:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@9259,@9197| 9259:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229676574536967283129 9260:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296765744e616d65283129 9261:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9180| 9262:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9165| 9263:O5|@9265,@9160,@168,@169,@9264 9264:O2|@9555,@9160 9265:D23,564|00811a33022c6928092a69291a2d020e0e0c000203041a2702103b503b502e352f3630371a1d020e0e0c00042a2a691a16022e32326b30353d1a10020e0c00030346303629352a362b38541a02024521051a00024529220c462e472b4830496c502a2d462a4730486c503f2a69291acb010c000203041ac701103b503b502932692d2a6927080fdd30353c1abe010e0e0e0c000303853036313732383c28403b1ab5010e0e0c0004293b1aaf0156c856d96a1aab010c0004501aa80156a7346a2e68012a2a692e1a9e010e0e0e0c00023c3169293b69293b1a71010e0e0c000303032b020b2b2a1a82010e0e0e0c0003292e1a7b010c0003220d3b1a4e010e0e0e0c0003030329020b29220e1a65010e0e0c0003332a69270d0fcb30353b1a2b010c00030373303629352a362b392c3a2d23062b3b1a40010e0c0003293b1a0b010c000303033b0205293529396421051a29014521061a2701452931462e472c482b490202be00344a6c502a22104632472a4834496c503f2a69291abe000e0e0e0c000203041ab700103b503b5029220d69302a69270c028c30353e1aad000e0e0c00030335303631372b6801568a2a692c2a1aba000e0e0e0c00032f3b1a8b000c0003030329020b29301ab6000e0e0e0c00032d2a692706024a303731382a3b1a940002023d000e0c0003293b1a5b000c000303033b02052935293864291a86000e0e0e0c00022f3b1a3f000c0003030329020b29301a72000e0e0e0c00032d2a692706270543000000002c02000000000000|@9267,@9268,I105,@1784,@8137,@9270,I251,@9272,@9274,I11,@9276,I255,@9288,@9290,@9292,@8234,@9294,I253,@9296,@9298,@9300,@1781,@9266| 9266:O1|@9302 9267:S38|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229 9268:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9269,@7152| 9269:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229636f6d6d6f6e50726f70732d283129 9270:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@9271| 9271:S49|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296173506172656e74283129 9272:D2,44|008056096801561868013b2b2b6a2956471a1c00300e0e0e7e0600030e0e0e0e000000002400000000000000|@9273,@9197| 9273:S53|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296765745369676e6174757265283129 9274:D1,36|0080560a680156196801292b3b6a2956485657307e060003000000001c00000000000000|@9275| 9275:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229676574537472756374757265283129 9276:D16,516|00802b363c1a00020e0c000303051afb010fdd2b3529353b1af5010e0e0c00036407df2b3529362d363c1ae7010c00032a2a6956473b1adf010c00032a2a0e0e0e0c00026429353b1ac5010e0e0c000303932939291ac4010e0c00021ac1010e0e0c0002035f29361ab1010e0e0c00021aad010e0e0c000203482935353e1a8f010c000303312935362928281a81010e0e0c000303033c021b29287b1a71010e0e0c000303033c020b29285b1a61010e0e0c00036402013b1a65010e0e0c000202013b02013b03192a1a5801691a58012a691a57012a693b3e3c3b2d68056602012a64020129293b691a44012a69020202011a3f012a693b3c3b3b2d680527090fdd00002b363c1afe000e0e0e0c000303051a230102dd2b3529362d363c1af3000c00032a2a6956483b1aeb000c00032a2a0e0e0e0c00026429353b1ad1000e0e0c000303932939291ad0000e0c00021acd000e0e0c0002035f29361abd000e0e0c00021ab9000e0e0c000203482935353e1a9b000c000303312935362928281a8d000e0e0c000303033c021b29287b1a7d000e0e0c000303033c020b29285b1a6d000e0e0c00036402013b1a71000e0e0c000202013b02013b03192a1a6400691a64002a691a63002a693b3e3c3b2d68056602012a64020129293b69020213001a58002a691a57002a693b3c3b3b2d68052709420e0e0e00000000fc01000000000000|@9278,I234,@2016,I251,I107,I253,I105,I218,@1087,@1088,@1060,@1058,@9279,@2016,@1058,@9277| 9277:O5|0,0,0,@9281,@9286 9278:S16|7072696e742d616c6c456e7472696573 9279:O5|0,0,0,@9281,@9280 9280:O2|@9284,0 9281:O2|@9282,0 9282:O2|0,@9283 9283:O5|@8767,710,710,0,0 9284:O2|3,@9285 9285:S3|446563 9286:O2|@9287,0 9287:O2|3,@7331 9288:D2,60|00802b352c3629353b1a34000e0c0003030e29362b2a5657300e0e0e7e06000329362b2a5658300e7e0600030e0e0e0e000000003400000000000000|@9289,I251| 9289:S54|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296578706f7274456e7472696573283129 9290:O1|@9291 9291:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c363b2b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9290| 9292:O1|@9293 9293:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9292| 9294:O1|@9295 9295:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9294| 9296:D1,36|0080560a6801561968013b2b2b6a2956485657307e060003000000001c00000000000000|@9297| 9297:S54|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f72417267283129 9298:D3,52|0080560b6801561a6801292b3b6a56391a25000e0e0c00022a565756682c1a1b00330e7b06070005000000002c00000000000000|@9299,@1781,@8203| 9299:S55|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f724e616d65283129 9300:O1|@9301 9301:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9300| 9302:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9266| 9303:O4|@9304,@171,@168,@169 9304:D138,2100|00802b363c1a30080e0c000303051a2b080fcd2b3529353b1a25080e0e0c00036407d52b3529362a372b382f363c1a13080c0003293b1aff070c000303051a07080fce293c1afc070e0c00032d2a691afa073b1afa070e0e0e0c00032a2a0e0e0e0c0002642c3c1ace070e0e0e0c000303051adf070fd72c3c1ac8070e0c0003293b1ab3070c000303051acb070fd12e362a3c1aae070e0e0e0c00032a2a691aba073b1aaa070e0e0e0c00032a2a0e0e0e0c0002642d3c1a7e070e0e0e0c000303051a9b070fcd32382e3c1a76070e0e0e0c00032a2a691a82073b1a7207020242070e0e0e0c00032a2a0e0e0e0c000264313d1a42070202c0010e0e0e0c000303051a5f0702d7220d35323c1a3507020283010e0e0c00032a2a691a4a073b1a2e070e0e0e0c00032a2a0e0e0e0c000264220c3e1a01070e0e0c000303051a2b070282221137220d3c1af80602022d010e0c00032a2a691a02073b1af2060202ae000e0e0e0c00032a2a0e0e0e0c00026422153922113c1aca060e0e0e0c00032a2a691ad6063b1ac6060e0e0e0c00032a2a020261000e0e0e0c000264291acf06691acf062a691ace062a691acd062a691acc062a69322a691ac8062a691ac7062a69270f1ac4062a691ac3062a692c2a691abf062a691abe062a6927091abb062a691aba062a692c2a691ab6062a691ab5062a6927091ab2062a691ab1062a692c2a691aad062a691aac062a6927091aa9062a693b3c3b3b2d6805303c1a23060c0003332a691a96063b1a22060e0e0e0c00031a8d0612110001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c000264291a6f06691a6f062a691a6e062a691a6d062a691a6c062a69312a691a68062a691a67062a69270e1a64062a691a63062a692c2a691a5f062a691a5e062a6927081a5b062a693b3c3b3b2d6805293b691a50062a691a4f062a693b3c3b3b2d6805270b0fda2b363c1a78050e0c000303051a37060fcb2b3529353c1a6d050e0e0c00036407cd2b3529362a372b382f363c1a5b050c0003293b1a47050c000303051a0b060fda293c1a44050e0c00032d2a691afe053b1a42050e0e0e0c00031af5055698693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1a06050e0e0e0c000303051ad3050fd22c3c1a00050e0c00032f2a691aba053b1afe040e0e0e0c00031ab90556c8693b2a3e3c6b642a0c0002642a2a0e0e0c0002642f3c1ace040e0e0e0c0003293b1ab7040c000303051a8f050fd131362a3c1ab20402048e048c040e0c00032a2a691aba043b1aaa040202d3010e0e0e0c00032a2a0e0e0e0c0002642d3c1a7a040e0e0e0c000303051a53050fdb220c382e3c1a7104020282010e0e0c00032a2a691a7a043b1a6a040e0e0e0c00032a2a0e0e0e0c000264313d1a3e040e0e0e0c000303051a1b0502d3221035323c1a350402022d010e0e0c00032a2a691a4a043b1a2e040e0e0e0c00032a2a0e0e0e0c000264220c3e1a01040e0e0c000303051ae304027e221437220d3c1af8030e0c00032a2a691a06043b1af6030202ae000e0e0e0c00032a2a0e0e0e0c00026422183922113c1ace030e0e0e0c00032a2a691ada033b1aca030e0e0e0c00032a2a0e0e0e0c000264291a8f04691a8f042a691a8e042a6902024b001a89042a691a88042a69322a691a84042a691a83042a69270f1a80042a691a7f042a692c2a691a7b042a691a7a042a6927091a77042a691a76042a692c2a691a72042a691a71042a6927091a6e042a691a6d042a692c2a691a69042a691a68042a6927091a65042a693b3c3b3b2d6805291a5c04691a5c042a691a5b042a691a5a042a691a59042a69322a691a55042a691a54042a69270e1a51042a691a50042a692c2a691a4c042a691a4b042a6927081a48042a693b3c3b3b2d6805293b691a3d042a691a3c042a693b3c3b3b2d6805270b0fcf2b363c1ab5020e0e0c000303051a23040fd12b3529362a372b382f363c1aa7020c0003293b1a93020c000303051a07040fdb293c1a90020e0c00032c2a691a4a033b1a8e020e0e0e0c00031aed035699693b2a3d3c6b642a0c0002642a2a0e0e0c0002642c3c1a52020e0e0e0c000303051acb030fd72c3c1a4c020e0c0003293b1a37020c000303051ab7030fd130362a3c1a32020e0e0e0c00032a2a691a3e023b1a2e020e0e0e0c00032a2a0e0e0e0c0002642d3c1a02020e0e0e0c000303051a83030fcd34382e3c1afa010202d6010e0e0e0c00032a2a691a02023b1af2010202c2010e0e0e0c00032a2a0e0e0e0c000264313d1ac2010e0e0e0c000303051a470302d7220f35323c020276011ab5010e0e0c00032a2a691ace013b1ab2010e0e0e0c00032a2a0e0e0e0c000264220c3e1a85010e0e0c000303051a0f030282221337220d3c1a7c0102021d010e0c00032a2a691a86013b1a76010202ae000e0e0e0c00032a2a0e0e0e0c00026422173922113c1a4e010e0e0e0c00032a2a691a5a013b1a4a010e0e0e0c00032a2a020261000e0e0e0c000264291ab302691ab3022a691ab2022a691ab1022a691ab0022a69322a691aac022a691aab022a69270f1aa8022a691aa7022a692c2a691aa3022a691aa2022a6927091a9f022a691a9e022a692c2a691a9a022a691a99022a6927091a96022a691a95022a692c2a691a91022a691a90022a6927091a8d022a693b3c3b3b2d6805303c1aa7000c0003322a691a1a013b1aa6000e0e0e0c00031a6d022a0e0c0002642a2a0e0e0c000264291a5f02691a5f022a691a5e022a691a5d022a691a5c022a69312a691a58022a691a57022a69270e1a54022a691a53022a692c2a691a4f022a691a4e022a6927081a4b022a693b3c3b3b2d6805293b691a40022a691a3f022a693b3c3b3b2d6805270b420e0e0e000000002c08000000000000|@9306,I234,@2016,I251,I107,@1071,@165,I253,@1071,@1071,@14,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@160,@9307,@1074,@1058,@9310,@1058,@1059,@1058,@8420,@1058,@1059,@1058,@9312,@1086,@1058,@9314,@2016,@1071,@155,@9321,@1071,@9322,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1074,@1058,@9323,@1058,@1059,@1058,@9325,@1058,@1059,@1058,@9327,@1086,@1058,@9329,@2016,@1071,@9336,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@9354,@1074,@1058,@9361,@1058,@1059,@1058,@9323,@1058,@1059,@1058,@9363,@1086,@1058,@9305| 9305:O5|0,0,0,@9366,@9365 9306:S15|7072696e742d737472756374446563 9307:D4,52|00801a33003b1a33000c00031a31005627693b2a3e3c6b642a0c0002642c2a2d7d0400020e0e0e0e000000002c00000000000000|@1051,@155,I253,@9308| 9308:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9309,I253| 9309:S21|7072696e742d636f72654465636c61726174696f6e 9310:O2|3,@9311 9311:S6|76617273203d 9312:O2|3,@9313 9313:S5|646563203d 9314:O5|0,0,0,@9316,@9315 9315:O2|@9319,0 9316:O2|@9317,0 9317:O2|0,@9318 9318:O5|@8767,187,187,0,0 9319:O2|3,@9320 9320:S8|436f72654c616e67 9321:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9306,I253| 9322:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9306,I253| 9323:O2|3,@9324 9324:S6|6c696e65203d 9325:O2|3,@9326 9326:S6|64656373203d 9327:O2|3,@9328 9328:S6|626f6479203d 9329:O5|0,0,0,@9331,@9330 9330:O2|@9334,0 9331:O2|@9332,0 9332:O2|0,@9333 9333:O5|@8767,194,194,0,0 9334:O2|3,@9335 9335:S8|4c6f63616c646563 9336:D86,1268|00802b363b1af0040e0c000303051aeb040fcd2b35392c363c1ae4040e0c00032a2a691ade043b1ade040e0e0e0c00032a2a0e0e0e0c0002642f363c1ab9040e0e0c000303051ac3040fd32f353530363c1aac040e0c0003293b1a9b040c000303051aab040fd12a362a3c1a92040e0e0e0c00032a2a691a9a043b1a8a040e0e0e0c00032a2a0e0e0e0c0002642d3c1a66040e0e0e0c000303051a7b040fdb2e382e3c1a5a040e0e0e0c00032a2a691a62043b1a52040e0e0e0c00032a2a0e0e0e0c000264313d1a2e040e0e0e0c000303051a470402d73235323c1a22040202f7030e0e0e0c00032a2a691a32043b1a16040e0e0e0c00032a2a0e0e0e0c000264220c3e1af1030e0e0c000303051a13040282220d37220d3c1ae4030202a0030e0c00032a2a691aea033b1ada030e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1ab6030e0e0e0c00032a2a691abe033b1aae030e0e0e0c00032a2a0e0e0e0c000264291abb03691abb032a691aba032a6902024b001ab5032a691ab4032a69322a691ab0032a691aaf032a69270f1aac032a691aab032a692c2a691aa7032a691aa6032a6927091aa3032a691aa2032a692c2a691a9e032a691a9d032a6927091a9a032a691a99032a692c2a691a95032a691a94032a6927091a91032a693b3c3b3b2d680534363d1a06030e0e0e0c000303051a7b030fd1343536220c363c1af7020c00032a2a691a0e033b1af2020e0e0e0c00032a2a0e0e0e0c000264220f363e1acc020e0c000303051a47030fd7220f353a2210363c1abe020e0e0e0c0003293b1aab020c000303051a2b030fd12a362a3c1aa2020e0e0e0c00032a2a691aaa023b1a9a020e0e0e0c00032a2a0e0e0e0c0002642d3c1a76020e0e0e0c000303051af7020fdb2e382e3c1a6a020e0e0e0c00032a2a691a72023b1a62020e0e0e0c00032a2a0e0e0e0c000264313d1a3e020e0e0e0c000303051ac30202d73235323c1a32020202d5010e0e0e0c00032a2a691a42023b1a26020e0e0e0c00032a2a0e0e0e0c000264220c3e1a01020e0e0c000303051a8b020282220d37220d3c1af40102027e010e0c00032a2a691afa013b1aea010e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1ac6010e0e0e0c00032a2a691ace013b1abe010e0e0e0c00032a2a0e0e0e0c000264291a3302691a33022a691a32022a6902024b001a2d022a691a2c022a69322a691a28022a691a27022a69270f1a24022a691a23022a692c2a691a1f022a691a1e022a6927091a1b022a691a1a022a692c2a691a16022a691a15022a6927091a12022a691a11022a692c2a691a0d022a691a0c022a6927091a09022a693b3c3b3b2d68052214363f1a15010e0e0c000303051af3010286221435382215363c1a06010e0e0e0c00032a2a691ade013b1afe000e0e0e0c00031ad5012a0e0c0002642a2a0e0e0c000264221835372219363c1ad4000e0c00032a2a69121a00010001003b1aca000e0e0e0c00032a2a0e0e0e0c000264291a9b01691a9b012a691a9a012a691a99012a691a98012a69322a691a94012a691a93012a69270f1a90012a691a8f012a692c2a691a8b012a691a8a012a69270a1a87012a691a86012a692c2a691a82012a691a81012a6927091a7e012a691a7d012a692c2a691a79012a691a78012a69270a1a75012a691a74012a692c2a691a70012a691a6f012a6927091a6c012a693b3c3b3b2d680565420e00000000ec04000000000000|@353,I234,@1071,I107,@162,I253,@1071,@1071,@14,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1071,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1071,@160,@9338,@1074,@1058,@9347,@1058,@1059,@1058,@9349,@1058,@1059,@1058,@9351,@1058,@1059,@1058,@2019,@1058,@1059,@1058,@9323,@1058,@1059,@1058,@9337,@1086| 9337:O2|3,@9353 9338:O4|0,@9339,3,1 9339:O1|@9340 9340:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@5665,@11,I253,@9341| 9341:O4|0,@9342,3,1 9342:O1|@9343 9343:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9344,@170,I253| 9344:S16|7072696e742d73747275637456616c73 9345:O1|@9346 9346:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 9347:O2|3,@9348 9348:S7|76616c7565203d 9349:O2|3,@9350 9350:S8|76616c526566203d 9351:O2|3,@9352 9352:S9|6e616d654c6f63203d 9353:S9|68617665536967203d 9354:O4|0,@9355,3,1 9355:O1|@9356 9356:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@9357| 9357:O4|0,@9358,3,1 9358:O1|@9359 9359:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9360,@154,I253| 9360:S12|7072696e742d747970654964 9361:O2|3,@9362 9362:S17|74797065496473466f724465627567203d 9363:O2|3,@9364 9364:S10|62696e64696e6773203d 9365:O2|@9369,0 9366:O2|@9367,0 9367:O2|0,@9368 9368:O5|@8767,180,180,0,0 9369:O2|3,@9370 9370:S12|537472756374757265446563 9371:O1|@9372 9372:D32,996|00802b363c1ae0030e0c000303051adb030fca2b3529353b1ad5030e0e0c000364039e2b3529362a372e363c1ac5030e0e0c0003293b1aaf030c000303051ab703025a293c1aac030e0c00032c2a691aaa033b1aaa030e0e0e0c00032a2a0e0e0e0c0002642c3c1a8a030e0e0e0c00032e2a691a8e033b1a86030e0e0e0c00032a2a0e0e0e0c000264291a7b03691a7b032a691a7a032a692f2a6927091a74032a693b3c3b3b2d6805293b691a69032a691a68032a693b3c3b3b2d6805270a0fdb2b363c1a21030e0e0c000303051a4f030fde2b3529353c1a15030202f5020e0e0c00036407dd2b3529362d363c1a03030c00032a2a691a2a033b1a02030e0e0e0c00032a2a0e0e0e0c00026429353b1add020e0e0c000303992939291a08030e0c00021a05030e0e0c0002035f29361af5020e0e0c00021af1020e0e0c000203482935353e1aa7020c000303312935362928281a99020e0e0c000303033c021b29287b1a89020e0e0c000303033c020b29285b1a79020e0e0c00036402013b1aa9020e0e0c000202013b02013b031d2a1a9c02691a9c022a69020236021a97022a693b3e3c3b2d68056602012a640203210229293b691a82022a691a81022a693b02020a003c3b3b2d680527090fdd2b363c1a12020e0e0e0c000303051a63020fdd2b3529353d1a05020e0e0c00036407dd2b3529362d363c1af7010c00032a2a691a42023b1af6010e0e0e0c00032a2a0e0e0e0c00026429353b1ad1010e0e0c000303972939291afc010e0c00021af9010e0e0c0002035f29361ae9010e0e0c00021ae5010e0e0c000203482935353e1a9b010c000303312935362928281a8d010e0e0c000303033c021b29287b1a7d010e0e0c000303033c020b29285b1a6d010e0e0c00036402013b1a9d010e0e0c000202013b02013b031d2a1a9001691a90012a691a8f012a69020225013b3e3c3b2d68056602012a6402012902021201293b691a84012a691a83012a02020c00693b3c3b3b2d680527090fdd2b363c1a04010e0c000303051a67010fdd2b3529362d363c1afb000c00032a2a691a56013b1afa000e0e0e0c00032a2a0e0e0e0c00026429353b1ad5000e0e0c000303932939291a00010e0c00021afd000e0e0c0002035f29361aed000e0e0c00021ae9000e0e0c000203482935353e1a9f000c000303312935362928281a91000e0e0c000303033c021b29287b1a81000e0e0c000303033c020b29285b1a71000e0e0c00036402013b1aa1000e0e0c000202013b02013b03192a1a9400691a94002a691a93002a693b3e3c3b2d68056602012a64020129293b69020217001a9c002a691a9b002a693b3c3b020206003b2d68052709420e0e0e00000000dc03000000000000|@9309,I234,@2016,I251,I107,@1043,@9,I253,@172,@1056,@1058,@1059,@1060,@1058,@9376,@2016,@170,I105,I218,@1087,@1088,@1060,@1058,@9383,@2016,@158,@1058,@9390,@2016,@173,@1058,@9373| 9373:O5|0,0,0,@9400,@9399 9374:O1|@9375 9375:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 9376:O5|0,0,0,@9378,@9377 9377:O2|@9381,0 9378:O2|@9379,0 9379:O2|0,@9380 9380:O5|@8767,114,114,0,0 9381:O2|3,@9382 9382:S7|436f7265466978 9383:O5|0,0,0,@9385,@9384 9384:O2|@9388,0 9385:O2|@9386,0 9386:O2|0,@9387 9387:O5|@8767,115,115,0,0 9388:O2|3,@9389 9389:S10|436f7265537472756374 9390:O5|0,0,0,@9392,@9391 9391:O2|@9395,0 9392:O2|@9393,0 9393:O2|0,@9394 9394:O5|@8767,113,113,0,0 9395:O2|3,@9396 9396:S8|436f726554797065 9397:O1|@9398 9398:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 9399:O2|@9403,0 9400:O2|@9401,0 9401:O2|0,@9402 9402:O5|@8767,112,112,0,0 9403:O2|3,@9404 9404:S9|436f726556616c7565 9405:O4|@9406,@174,@169,@168 9406:D290,4572|00802b363c1ad8110e0c000303051ad3110fd52b3529353b1acd110e0e0c00036407d12b3529362d363c1abf110c0003293b1aab110c000303051ab3110fd92a352a3c1aa6110e0e0e0c00032a2a6956683b1a9f110c00032a2a0e0e0e0c0002642d3c1a7a110e0e0e0c000303051a87110fcd2e372e3c1a72110e0e0e0c00032a2a691a76113b1a6a110e0e0e0c00031a6d112a0e0c0002642a2a0e0e0c000264313d1a3a110e0e0e0c000303051a53110fca323a323c1a32110e0e0e0c0003293b1a1b110c000303051a3b110fd52a362a3c1a16110e0e0e0c00032a2a691a2a113b1a0e110202e2100e0e0e0c00032a2a0202fd040e0e0e0c0002642d3c1ade100e0e0e0c000303051a03110fdd2e382e3c1ad6100202b5040e0e0e0c00032a2a691ae6103b1aca100e0e0e0c00032a2a0e0e0e0c000264313d1aa210020274040e0e0e0c000303051ac71002d33235323c1a96100e0e0e0c00032a2a691ab6103b1a8e100e0e0e0c00032a2a0e0e0e0c000264220c3e1a651002021e040e0e0c000303051a9310027e220d37220d3c1a58100e0c00032a2a691a6e103b1a52100202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1a2e100e0e0e0c00032a2a691a42103b1a26100e0e0e0c00032a2a0e0e0e0c000264291a3f10691a3f102a691a3e1002024d002a691a39102a691a38102a69322a691a34102a691a33102a69270f1a30102a691a2f102a692c2a691a2b102a691a2a102a6927091a27102a691a26102a692c2a691a22102a691a21102a6927091a1e102a691a1d102a692c2a691a19102a691a18102a6927091a15102a693b3c3b3b2d6805220d3e1a7a0f0e0e0e0c000303051aff0f0fd1220e2307220e3c1a6f0f0c00032a2a691a760f3b1a6a0f0e0e0e0c00031ae10f12160001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c00026422113f1a290f0e0e0c000303051ab70f0fd122123622123c1a200f0e0c00032a2a691a420f3b1a1a0f0e0e0e0c00032a2a0e0e0e0c000264221528051af00e0e0c000303051a830f0fd72216230622163c1ae70e0c0003293b1ad30e0c000303051a6b0f0fcd2a362a3c1ace0e0e0e0e0c00032a2a691ae20e3b1ac60e0e0e0e0c00032a2a0e0e0e0c0002642d3c1a9e0e02023e020e0e0e0c000303051a330f0fdb2e382e3c1a920e0e0e0e0c00032a2a691aa60e3b1a8a0e0e0e0e0c00032a2a0e0e0e0c000264313d1a620e0e0e0e0c000303051aff0e02d73235323c1a5a0e0202d5010e0e0e0c00032a2a691a760e3b1a4e0e0e0e0e0c00032a2a0e0e0e0c000264220c3e1a250e0e0e0c000303051ac70e0282220d37220d3c1a1c0e02027e010e0c00032a2a691a2e0e3b1a120e0202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1aee0d0e0e0e0c00032a2a691a020e3b1ae60d0e0e0e0c00032a2a0e0e0e0c000264291a6f0e691a6f0e2a691a6e0e2a6902024b001a690e2a691a680e2a69322a691a640e2a691a630e2a69270f1a600e2a691a5f0e2a692c2a691a5b0e2a691a5a0e2a6927091a570e2a691a560e2a692c2a691a520e2a691a510e2a6927091a4e0e2a691a4d0e2a692c2a691a490e2a691a480e2a6927091a450e2a693b3c3b3b2d6805221a28061a390d0e0e0c000303051a2f0e0286221b38221b3c1a300d0e0c00032a2a691a360d3b1a2a0d0e0e0e0c00031a110e2a0e0c0002642a2a0e0e0c000264221f39221f3c1a020d0e0e0e0c00032a2a691a060d3b1afa0c0e0e0e0c00031ae50d2a0e0c0002642a2a0e0e0c000264291ad70d691ad70d2a691ad60d2a691ad50d2a691ad40d2a69322a691ad00d2a691acf0d2a69270f1acc0d2a691acb0d2a692c2a691ac70d2a691ac60d2a69270a1ac30d2a691ac20d2a692c2a691abe0d2a691abd0d2a6927091aba0d2a691ab90d2a692c2a691ab50d2a691ab40d2a6927091ab10d2a691ab00d2a692c2a691aac0d2a691aab0d2a69270a1aa80d2a691aa70d2a692c2a691aa30d2a691aa20d2a6927091a9f0d2a691a9e0d2a692c2a691a9a0d2a691a990d2a6927091a960d2a693b3c3b3b2d6805293b691a8b0d2a691a8a0d2a693b3c3b3b2d680527090fd52b363c1ae70b0c000303051a730d0fd12b3529353c1add0b0e0e0c00036407d12b3529362a372b382f363c1acb0b0c0003293b1ab70b0c000303051a470d0fca293c1ab40b0e0c00032d2a6956783b1aaf0b0c00032a2a0e0e0e0c0002642c3c1a8a0b0e0e0e0c000303051a1b0d0fd62c3c1a840b0e0c00032f2a691a0e0d3b1a7e0b0e0e0e0c00031a050d56c9693b2a3e3c6b642a0c0002642a2a0e0e0c0002642f3c1a520b0e0e0e0c0003293b1a3b0b0c000303051adb0c0fd531362a3c1a360b0e0e0e0c00032a2a691a4a0b3b1a2e0b0202020b0e0e0e0c00032a2a0202f60a0e0e0e0c0002642d3c1afe0a0202bf010e0e0e0c000303051a9b0c0fdb220c382e3c1af10a020282010e0e0c00032a2a691a020b3b1ae60a0e0e0e0c00032a2a0e0e0e0c000264313d1abe0a0e0e0e0c000303051a630c02d3221035323c1ab50a02022d010e0e0c00032a2a691ad20a3b1aaa0a0e0e0e0c00032a2a0e0e0e0c000264220c3e1a810a0e0e0c000303051a2b0c027e221437220d3c1a780a0e0c00032a2a691a8e0a3b1a720a0202ae000e0e0e0c00032a2a0e0e0e0c00026422183922113c1a4e0a0e0e0e0c00032a2a691a620a3b1a460a0e0e0e0c00032a2a0e0e0e0c000264291ad70b691ad70b2a691ad60b2a6902024b001ad10b2a691ad00b2a69322a691acc0b2a691acb0b2a69270f1ac80b2a691ac70b2a692c2a691ac30b2a691ac20b2a6927091abf0b2a691abe0b2a692c2a691aba0b2a691ab90b2a6927091ab60b2a691ab50b2a692c2a691ab10b2a691ab00b2a6927091aad0b2a693b3c3b3b2d6805291aa40b691aa40b2a691aa30b2a691aa20b2a691aa10b2a69322a691a9d0b2a691a9c0b2a69270e1a990b2a691a980b2a692c2a691a940b2a691a930b2a6927081a900b2a693b3c3b3b2d6805293b691a850b2a691a840b2a693b3c3b3b2d6805270b0fd72b363c1a35090e0e0c000303051a6b0b0fd12b3529353d1a29090e0e0c00036407d22b3529362d363c1a1b090c0003293b1a07090c000303051a430b0fcf2a362a3c1a02090e0e0e0c00032a2a691a320b3b1afa080e0e0e0c00032a2a0e0e0e0c0002642d3c1ad2080e0e0e0c000303051a130b0fdb2e3a2e3c1aca080e0e0e0c00032a2a691ace083b1ac2080e0e0e0c00031af50a56c7693b2a3e3c6b642a0c0002642a2a0e0e0c000264313d1a8a080e0e0e0c000303051ad30a0fd53237323c1a82080e0e0e0c00032a2a691ac20a3b1a7a0802024e080e0e0e0c00032a2a020242080e0e0e0c000264220c3e1a49080202d2020e0e0c000303051a970a0fcd220d39220d3c1a3c08020295020e0c00032a2a691a3e083b1a32080e0e0e0c00031a750a2a0e0c0002642a2a0e0e0c00026422103f1a01080e0e0c000303051a5b0a0fdb22113822113c1af807020238020e0c0003293b1adf070c000303051a3f0a0fcd2a362a3c1ada070e0e0e0c00032a2a691aee073b1ad2070e0e0e0c00032a2a0e0e0e0c0002642d3c1aaa070202dd010e0e0e0c000303051a070a0fdb2e382e3c1a9e070e0e0e0c00032a2a691ab2073b1a96070e0e0e0c00032a2a0e0e0e0c000264313d1a6e07020288010e0e0e0c000303051acf0902d33235323c1a62070e0e0e0c00032a2a691a82073b1a5a070e0e0e0c00032a2a0e0e0e0c000264220c3e1a31070e0e0c000303051a9b090282220d37220d3c1a280702021d010e0c00032a2a691a3a073b1a1e070202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1afa060e0e0e0c00032a2a691a0e073b1af2060e0e0e0c00032a2a0e0e0e0c000264291a4309691a43092a691a42092a6902024b001a3d092a691a3c092a69322a691a38092a691a37092a69270f1a34092a691a33092a692c2a691a2f092a691a2e092a6927091a2b092a691a2a092a692c2a691a26092a691a25092a6927091a22092a691a21092a692c2a691a1d092a691a1c092a6927091a19092a693b3c3b3b2d680522163522163c1a4f060c00032a2a69121c00010002003b1a46060e0e0e0c00032a2a0e0e0e0c000264291ae708691ae7082a691ae6082a691ae5082a691ae4082a69322a691ae0082a691adf082a6927101adc082a691adb082a692c2a691ad7082a691ad6082a6927091ad3082a691ad2082a692c2a691ace082a691acd082a6927091aca082a691ac9082a692c2a691ac5082a691ac4082a6927091ac1082a691ac0082a692c2a691abc082a691abb082a6927091ab8082a693b3c3b3b2d6805293b691aad082a691aac082a693b3c3b3b2d680527090fcb2b363c1a6d050e0e0c000303051a93080fd12b3529353e1a61050e0e0c00036407d52b3529362a372b382f363c1a4f050c0003293b1a3b050c000303051a67080fcd293c1a38050e0c00032d2a691ac2063b1a32050e0e0e0c00031a4d085699693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1afa040e0e0e0c000303051a2b080fdb2c3c1af4040e0c0003293b1adf040c000303051a17080fd52f362a3c1ada040e0e0e0c00032a2a691aee043b1ad2040e0e0e0c00032a2a0e0e0e0c0002642d3c1aaa04020292040e0e0e0c000303051adf070fcd33382e3c1a9e0402027a040e0e0e0c00032a2a691aae043b1a92040202d4010e0e0e0c00032a2a0e0e0e0c000264313d1a6604020298010e0e0e0c000303051a9f0702d3220e35323c1a59040e0e0c00032a2a691a7a043b1a52040e0e0e0c00032a2a0e0e0e0c000264220c3e1a29040e0e0c000303051a6b070282221237220d3c1a200402022d010e0c00032a2a691a32043b1a16040202ae000e0e0e0c00032a2a0e0e0e0c00026422163922113c1af2030e0e0e0c00032a2a691a06043b1aea030e0e0e0c00032a2a020261000e0e0e0c000264291a0f07691a0f072a691a0e072a691a0d072a691a0c072a69322a691a08072a691a07072a69270f1a04072a691a03072a692c2a691aff062a691afe062a6927091afb062a691afa062a692c2a691af6062a691af5062a6927091af2062a691af1062a692c2a691aed062a691aec062a6927091ae9062a693b3c3b3b2d6805303c1a4b030c0003322a691a52033b1a46030e0e0e0c00031ac90612110001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c000264291aab06691aab062a691aaa062a691aa9062a691aa8062a69312a691aa4062a691aa3062a69270e1aa0062a691a9f062a692c2a691a9b062a691a9a062a6927081a97062a693b3c3b3b2d6805293b691a8c062a691a8b062a693b3c3b3b2d6805270b0fd22b363c1aa0020e0c000303051a73060fcd2b3529362a372b382f363c1a93020c0003293b1a7f020c000303051a57060fd3293c1a7c020e0c0003293b1a67020c000303051a43060fcd2b362a3c1a62020e0e0e0c00032a2a691a76023b1a5a020e0e0e0c00032a2a0e0e0e0c0002642d3c1a32020e0e0e0c000303051a0f060fdd2f382e3c1a2a020e0e0e0c00032a2a691a3e023b1a22020e0e0e0c00032a2a0e0e0e0c000264313d1afa010e0e0e0c000303051adb0502db3335323c1af2010e0e0e0c00032a2a691a12023b1aea010202be010e0e0e0c00032a2a0202b2010e0e0e0c000264220c3e1ab9010e0e0c000303051a9f050282220e37220d3c1ab00102026a010e0c00032a2a691ac2013b1aa6010202ae000e0e0e0c00032a2a0e0e0e0c00026422123922113c1a82010e0e0e0c00032a2a691a96013b1a7a010e0e0e0c00032a2a0e0e0e0c000264291a4705691a47052a691a460502024d002a691a41052a691a40052a69322a691a3c052a691a3b052a69270f1a38052a691a37052a692c2a691a33052a691a32052a6927091a2f052a691a2e052a692c2a691a2a052a691a29052a6927091a26052a691a25052a692c2a691a21052a691a20052a6927091a1d052a693b3c3b3b2d68052d3c1acf000c000303051a0b0502762d3c1acc000e0c0003312a691aee003b1ac6000e0e0e0c00032a2a0e0e0e0c000264303c1aaa000e0e0e0c0003332a691aae003b1aa2000e0e0e0c00031acd042a0e0c0002642a2a0e0e0c000264291abf04691abf042a691abe042a691abd042a691abc042a69312a691ab8042a691ab7042a69270d1ab4042a691ab3042a692c2a691aaf042a691aae042a6927091aab042a693b3c3b3b2d6805293b691aa0042a691a9f042a693b3c3b3b2d6805270b420e0e0e00000000d411000000000000|@9408,I234,@2016,I251,I107,@1071,I253,@1071,@160,@9409,@1071,@1071,@14,@1071,@1071,@9,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1071,@9419,@1071,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1071,@9421,@9427,@1074,@1058,@9349,@1058,@1059,@1058,@9436,@1058,@1059,@1058,@9351,@1058,@1059,@1058,@2019,@1058,@1059,@1058,@9438,@1058,@1059,@1058,@9440,@1058,@1059,@1058,@9442,@1058,@1059,@1058,@9444,@1086,@1058,@9446,@2016,@1071,@1071,@155,@9453,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1074,@1058,@9323,@1058,@1059,@1058,@9325,@1058,@1059,@1058,@9327,@1086,@1058,@9454,@2016,@1071,@176,@1071,@9463,@1071,@162,@1071,@9465,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1074,@1058,@9471,@1058,@1059,@1058,@9473,@1058,@1059,@1058,@9475,@1058,@1059,@1058,@9477,@1058,@1059,@1058,@9479,@1058,@1059,@1058,@9481,@1086,@1058,@9483,@2016,@1071,@9490,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@9491,@1074,@1058,@9493,@1058,@1059,@1058,@8420,@1058,@1059,@1058,@9495,@1086,@1058,@9497,@2016,@1071,@1071,@1071,@1071,@1071,@1074,@1058,@1076,@1058,@1059,@1058,@1078,@1058,@1059,@1058,@1080,@1058,@1059,@1058,@1082,@1058,@1059,@1058,@1084,@1086,@1071,@9504,@1074,@1058,@9349,@1058,@1059,@1058,@2019,@1058,@1059,@1058,@8420,@1086,@1058,@9407| 9407:O5|0,0,0,@9511,@9510 9408:S17|7072696e742d73747275637456616c7565 9409:O4|0,@9410,3,1 9410:O1|@9411 9411:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@9412| 9412:O4|0,@9413,2,2 9413:O1|@9414 9414:D14,164|00802b363b1aa0000e0c000303051a9b0002762b35352c363c1a94000e0c00032a2a691a8e003b1a8e000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a691a66003b1a66000e0e0e0c00032a2a0e0e0e0c000264291a5700691a57002a691a56002a691a55002a691a54002a69322a691a50002a691a4f002a69270f1a4c002a693b3c3b3b2d680565420e000000009c00000000000000|@353,I234,@1071,I107,@154,I253,@1074,@1058,@9416,@1058,@1059,@1058,@9415,@1086| 9415:O2|3,@9418 9416:O2|3,@9417 9417:S8|736f75726365203d 9418:S6|64657374203d 9419:D4,52|00801a33003b1a33000c00031a31005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000002c00000000000000|@1051,@155,I253,@9420| 9420:D10,140|00802b363b1a88000e0c000303051a8300025e2b35352c363c1a7c000e0c00032a2a691a76003b1a76000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a56000e0e0e0c00032a2a6956773b1a4f000c00032a2a0e0e0e0c000264291a4300691a43002a691a42002a69302a69270b1a3c002a693b3c3b3b2d680565420e000000008400000000000000|@353,I234,@1043,I107,@14,I253,@1056,@1058,@1059,@1060| 9421:O4|0,@9422,3,1 9422:O1|@9423 9423:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@9424| 9424:O4|0,@9425,2,2 9425:O1|@9426 9426:D14,164|00802b363b1aa0000e0c000303051a9b0002762b35352c363c1a94000e0c00032a2a691a8e003b1a8e000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a691a66003b1a66000e0e0e0c00032a2a0e0e0e0c000264291a5700691a57002a691a56002a691a55002a691a54002a69322a691a50002a691a4f002a69270f1a4c002a693b3c3b3b2d680565420e000000009c00000000000000|@353,I234,@1071,I107,@154,I253,@1074,@1058,@9416,@1058,@1059,@1058,@9415,@1086| 9427:O4|0,@9428,3,1 9428:O1|@9429 9429:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@5665,@11,I253,@9430| 9430:O4|0,@9431,3,1 9431:O1|@9432 9432:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9433,@175,I253| 9433:S14|7072696e742d66756e63746f7273 9434:O1|@9435 9435:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 9436:O2|3,@9437 9437:S8|726573496473203d 9438:O2|3,@9439 9439:S17|6d61746368546f417267756d656e74203d 9440:O2|3,@9441 9441:S9|66756c6c4c6f63203d 9442:O2|3,@9443 9443:S8|617267496473203d 9444:O2|3,@9445 9445:S5|617267203d 9446:O5|0,0,0,@9448,@9447 9447:O2|@9451,0 9448:O2|@9449,0 9449:O2|0,@9450 9450:O5|@8767,150,150,0,0 9451:O2|3,@9452 9452:S11|46756e63746f724170706c 9453:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9306,I253| 9454:O5|0,0,0,@9456,@9455 9455:O2|@9459,0 9456:O2|@9457,0 9457:O2|0,@9458 9458:O5|@8767,162,162,0,0 9459:O2|3,@9460 9460:S6|4c6574446563 9461:O1|@9462 9462:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 9463:D4,52|00801a33003b1a33000c00031a31005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000002c00000000000000|@1051,@155,I253,@9464| 9464:D10,140|00802b363b1a88000e0c000303051a8300025e2b35352c363c1a7c000e0c00032a2a691a76003b1a76000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a56000e0e0e0c00032a2a6956773b1a4f000c00032a2a0e0e0e0c000264291a4300691a43002a691a42002a69302a69270b1a3c002a693b3c3b3b2d680565420e000000008400000000000000|@353,I234,@1043,I107,@14,I253,@1056,@1058,@1059,@1060| 9465:O4|0,@9466,3,1 9466:O1|@9467 9467:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@1051,@155,I253,@9468| 9468:O4|0,@9469,2,2 9469:O1|@9470 9470:D14,164|00802b363b1aa0000e0c000303051a9b0002762b35352c363c1a94000e0c00032a2a691a8e003b1a8e000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a691a66003b1a66000e0e0e0c00032a2a0e0e0e0c000264291a5700691a57002a691a56002a691a55002a691a54002a69322a691a50002a691a4f002a69270f1a4c002a693b3c3b3b2d680565420e000000009c00000000000000|@353,I234,@1071,I107,@154,I253,@1074,@1058,@9416,@1058,@1059,@1058,@9415,@1086| 9471:O2|3,@9472 9472:S5|737472203d 9473:O2|3,@9474 9474:S8|7369674c6f63203d 9475:O2|3,@9476 9476:S11|6f7061717565496473203d 9477:O2|3,@9478 9478:S8|6f7061717565203d 9479:O2|3,@9480 9480:S19|6d61746368546f436f6e73747261696e74203d 9481:O2|3,@9482 9482:S6|63736967203d 9483:O5|0,0,0,@9485,@9484 9484:O2|@9488,0 9485:O2|@9486,0 9486:O2|0,@9487 9487:O5|@8767,169,169,0,0 9488:O2|3,@9489 9489:S13|536967436f6e73747261696e74 9490:D2,36|008056073b1a20000e0c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9306,I253| 9491:D4,52|00801a33003b1a33000c00031a31005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000002c00000000000000|@1051,@155,I253,@9492| 9492:D10,140|00802b363b1a88000e0c000303051a8300025e2b35352c363c1a7c000e0c00032a2a691a76003b1a76000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a56000e0e0e0c00032a2a6956773b1a4f000c00032a2a0e0e0e0c000264291a4300691a43002a691a42002a69302a69270b1a3c002a693b3c3b3b2d680565420e000000008400000000000000|@353,I234,@1043,I107,@14,I253,@1056,@1058,@1059,@1060| 9493:O2|3,@9494 9494:S15|6d61746368546f526573756c74203d 9495:O2|3,@9496 9496:S7|616c697374203d 9497:O5|0,0,0,@9499,@9498 9498:O2|@9502,0 9499:O2|@9500,0 9500:O2|0,@9501 9501:O5|@8767,143,143,0,0 9502:O2|3,@9503 9503:S9|537472756374446563 9504:O4|0,@9505,3,1 9505:O1|@9506 9506:D4,44|00801a2b003b1a2b000c00031a29002a0e0c0002642c2a2d7d0400020e0e0e0e000000002400000000000000|@5665,@11,I253,@9507| 9507:O4|0,@9508,3,1 9508:O1|@9509 9509:D3,36|00801a23003b1a23000c00032c2a2d0e7d0400020e0e0e0e000000001c00000000000000|@9344,@170,I253| 9510:O2|@9514,0 9511:O2|@9512,0 9512:O2|0,@9513 9513:O5|@8767,136,136,0,0 9514:O2|3,@9515 9515:S14|5374727563747572654964656e74 9516:O3|@9517,@174,@153 9517:D53,748|00802b363c1ae8020e0c000303051ae3020fda2b3529353b1add020e0e0c00036403c22b3529362a372e363c1acd020e0e0c0003293b1ab7020c000303051abf02027e293c1ab4020e0c00032c2a691ab2023b1ab2020e0e0e0c00031aad025687693b2a3d3d6b642a0c0002642a2a0e0e0c0002642c3c1a82020e0e0e0c00032e2a691a8a023b1a7e020e0e0e0c00032a2a0e0e0e0c000264291a7702691a77022a691a76022a691a75022a691a74022a69312a691a70022a691a6f022a69270d1a6c022a693b3c3b3b2d6805293b691a61022a691a60022a693b3c3b3b2d6805270a0fdd2b363c1a05020202e9010e0e0c000303051a43020fce2b3529353c1af5010e0e0c00036403b22b3529362a372e363c1ae5010e0e0c0003293b1acf010c000303051a1702026e293c1acc010e0c00032c2a691a0a023b1aca010e0e0e0c00032a2a0e0e0e0c0002642c3c1aaa010e0e0e0c00032e2a691aea013b1aa6010e0e0e0c00032a2a0e0e0e0c000264291ad701691ad7012a691ad6012a691ad5012a691ad4012a69312a691ad0012a691acf012a69270d1acc012a693b3c3b3b2d6805293b691ac1012a691ac0012a693b3c3b3b2d6805270a0fdd2b363c020214011a290102020d010e0e0c000303051a9f010fdd2b3529362a372b382f363c1a17010c0003293b1a03010c000303051a830102bb293c1a00010e0c00032d2a6956783b1aff000c00032a2a0e0e0e0c0002642c3c1ad6000e0e0e0c000303051a5701026e2c3c1ad0000e0c00032e2a691a4a013b1ace000e0e0e0c00032a2a0e0e0e0c0002642f3c1aae000e0e0e0c0003322a691a2a013b1aaa000e0e0e0c00032a2a0e0e0e0c000264291a1701691a17012a691a16012a691a15012a691a14012a69312a691a10012a691a0f012a69270d1a0c0102023c002a691a07012a692c2a691a03012a691a02012a692708020222001afb002a693b3c3b3b2d6805293b691af0002a691aef002a693b3c3b3b2d6805270b420e0e0e0e0e0e0e00000000e402000000000000|@9519,I234,@2016,I251,I107,@1071,@155,I253,@9520,@170,@1074,@1058,@9521,@1058,@1059,@1058,@9523,@1086,@1058,@9525,@2016,@1071,@162,@14,@1074,@1058,@9532,@1058,@1059,@1058,@9534,@1086,@1058,@9536,@2016,@1071,@1071,@173,@164,@1074,@1058,@9543,@1058,@1059,@1058,@9545,@1058,@1059,@1058,@9547,@1086,@1058,@9518| 9518:O5|0,0,0,@9550,@9549 9519:S19|7072696e742d76616c75654d61746368696e67 9520:D10,140|00802b363b1a88000e0c000303051a8300025e2b35352c363c1a7c000e0c00032a2a691a76003b1a76000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a56000e0e0e0c00032a2a6956773b1a4f000c00032a2a0e0e0e0c000264291a4300691a43002a691a42002a69302a69270b1a3c002a693b3c3b3b2d680565420e000000008400000000000000|@353,I234,@1043,I107,@14,I253,@1056,@1058,@1059,@1060| 9521:O2|3,@9522 9522:S17|736f75726365537472756374757265203d 9523:O2|3,@9524 9524:S15|636f6e74656e74734d61746368203d 9525:O5|0,0,0,@9527,@9526 9526:O2|@9530,0 9527:O2|@9528,0 9528:O2|0,@9529 9529:O5|@8767,121,121,0,0 9530:O2|3,@9531 9531:S14|5374727563747572654d61746368 9532:O2|3,@9533 9533:S12|736f7572636549644e6f203d 9534:O2|3,@9535 9535:S12|6973457175616c697479203d 9536:O5|0,0,0,@9538,@9537 9537:O2|@9541,0 9538:O2|@9539,0 9539:O2|0,@9540 9540:O5|@8767,123,123,0,0 9541:O2|3,@9542 9542:S11|5479706549644d61746368 9543:O2|3,@9544 9544:S12|74617267657454797065203d 9545:O2|3,@9546 9546:S13|736f7572636556616c7565203d 9547:O2|3,@9548 9548:S10|636f657263696f6e203d 9549:O2|@9553,0 9550:O2|@9551,0 9551:O2|0,@9552 9552:O5|@8767,119,119,0,0 9553:O2|3,@9554 9554:S10|56616c75654d61746368 9555:D1,28|00802b352c3656272d0e0e0e7e030003000000001400000000000000|@9556| 9556:S33|535452554354555245535f28292e7374727563744578706f727454726565283129 9557:D13,252|00811afb002c6928092a69291af5000e0e0c000203041aef00103b503b502e352f3630371ae5000e0e0c00042a2a691ade002e32326b30353c1ad8000e0c0003034d3036313732382c680156972a692d3b1ac0000e0c000303032c020b2c2e1ab6000e0e0e0c0003292b1aaf000c0003313b1a9f000c0003030329020b29321a9e000e0e0e0c00032e2a692708025a30353b1a7f000c0003031a3036040200332b2b1a7f000c00045029352a362a2a6927040235303631371a6d005688692c68012a2a692c2a1a53000c0003303b1a43000c0003030329020b29311a4e000e0e0e0c00032f2a6927072705430e0e0e0e00000000f400000000000000|@9559,@9560,I105,@1784,@8137,@9562,I251,@9564,@8234,@9566,@7438,@9568,@9558| 9558:O1|@9581 9559:S33|535452554354555245535f28292e7374727563744578706f727454726565283229 9560:D2,28|008056072c1a18002d0e0e0e7e030003000000001400000000000000|@9561,@6962| 9561:S48|535452554354555245535f28292e7374727563744578706f727454726565283229636f6d6d6f6e50726f70732d283129 9562:D1,28|00805608561956272d0e0e0e7e030003000000001400000000000000|@9563| 9563:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296173506172656e74283129 9564:O1|@9565 9565:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9564| 9566:O1|@9567 9567:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9566| 9568:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@9570,@9569| 9569:O1|@9571 9570:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283129 9571:D10,220|00822c352d362e372f39303a0402002b3c1acc000e0c0003030c2c353d1ac0000e0c000302013b031a2c3629352a362b372c382b2b2b6a296801302a452f4626080206293b452d465029352a361a94001a9500220e220e220e680521051a8c004521071a8a004521071a88004529344631472d482b492c4a2f4b6c502a220f462e472d482c492a4a2f4b6c502b2a462d472f482b496c503f2a69291a5a000e0e0e0c000203041a5300103b503b502211352212362213371a46000e0e0e0c00042a2a69220e2a69270f440e0e0e0e0e0e00000000d400000000000000|@9573,I251,@9574,@9569,@9576,@9578,@9572,I105,@1784,@8137| 9572:D3,60|0080560c3b1a38000e0c00030304560a0202560b561968012a6801292b3b6a29565756683b1a1c00330e0e7b06070005000000003400000000000000|@9580,I251,@8203| 9573:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229 9574:D1,28|008056085619562a56372e7b05030004000000001400000000000000|@9575| 9575:S57|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296578706f727454686973283129 9576:D4,68|0080560a680156193b1a3c000e0c000303041a3700103b50561935293556386801564768012d2b2b6a292d1a2200330e7e0900030e0e0e0e000000003c00000000000000|@9577,I251,@2309,@9197| 9577:S59|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229676574536967537472756374283129 9578:D3,68|0080560c1a41000e0e0c00021a3d000e0e0c00020304560a0202560b561968012a68013b2b2b6a2956585667310e0e0e7e0700030e0e0e0e000000003c00000000000000|@9579,I105,I218| 9579:S55|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f7274534228322967657456616c7565283129 9580:S54|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296765744e616d65283129 9581:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9558| 9582:O1|@9583 9583:D16,436|00812c3529291aaf010c00021aad010e0e0c0002036929352a362a353c1aa0010e0c000303043b50024b2a353b1a90010e0c000303332a3629291a7b010c00021a79010e0e0c0002031a29352a362a36291a70010e0c0002502a250426031e25260302023b5051020c2a36291a59010e0e0c000251292503511e743b6502013b643c28403b1a44010e0c00041a41012a690402001a3d012e2b332e1a3a010e0e0e0c00065029352e3b2a1a0b010c00021a09010e0e0c000203352a352b362a1a1a010e0e0e0c00022c3b1af3000c0003030329020b292d1a06010e0e0e0c00032b2a2506250626041e3f3b270402012965293b2a1ac1000e0e0c00021abd000e0e0c000203152a352b362a2c692a2a2505250526031e223b6602012965280e2a3b6a2a291a91000e0e0c00021a8d000e0e0c0002031d29352a362a353d1a80000e0c00030309292503511e273b02013b6502013c64030b291a89000e0e0c00020201292d3b1a58000e0c00030303290204402e2b6a313b1a6e000e0e0e0c0003323b1a63000c0003293b1a5f000c0003343b2b1a5a000e0e0e0c0004502c2c69270e430e0e0e0e0e00000000ac01000000000000|@9585,I105,I218,I251,@9586,@9587,I11,@9675,@9677,@9681,@11473,@9584,@2464,I253,I106,I255| 9584:O1|@11484 9585:S31|535452554354555245535f28292e67656e636f646553747275637473283229 9586:O2|@9588,@9587 9587:O2|@9594,@9586 9588:D4,140|00802b353d1a88000e0c0003030e2b362935292c2e0e0e0e7d0500022b353c1a6e000e0e0e0c000303162b362c372a2c0e0c0002502956371a59002f7e0500032b353b1a4a000e0e0e0c0003030e2b362935292c2e0e0e0e7d0500022b353e1a2e000e0e0e0c0003030e2b362956271a26002e0e7e0400033b420e0e0e0e0e0e000000008400000000000000|@9590,I251,@9591,@9589| 9589:O1|@9593 9590:S53|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e53747275637456616c7565283129 9591:O1|@9592 9592:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203162c352d36292e1a29000e0e0c00032b2f2f0e7d0700023b430e0e000000003400000000000000|@2263,I105,I218,@9591| 9593:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203162c352d36292e1a29000e0e0c00032b2f2f0e7d0700023b430e0e000000003400000000000000|@2263,I105,I218,@9589| 9594:D7,132|00802b353c1a80000e0c0003031a2b362c372a2c1a75000e0e0c000350292c1a6e002f0e7e0500032b353b1a5a000e0e0e0c0003030e2b36291a58002d0e0e0e7d0400022b3729291a4d000e0e0c00021a49000e0e0c0002031929352a362a3756570e0e0e0c000250292503511e263b6502013b65420e0e000000007c00000000000000|@9596,I251,@9597,@9599,@9595,I105,I218| 9595:O1|@9601 9596:S51|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e537472756374446563283129 9597:O1|@9598 9598:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203162c352d36292e1a29000e0e0c00032b2f2f0e7d0700023b430e0e000000003400000000000000|@2263,I105,I218,@9597| 9599:O1|@9600 9600:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203162c352d36292e1a29000e0e0c00032b2f2f0e7d0700023b430e0e000000003400000000000000|@2263,I105,I218,@9599| 9601:D15,1300|00802b350a1e007d02cd006102e5003802f5013e003e003e003e008901c001d90245013e0080003e004d003e0091023e00b40041003e003e0005023e003e00e0032e013e003b0fd62b36291aca042d0e7d0400022b3729291ac1040e0e0c00021abd040e0e0c0002031929352a362a1aa6040e0e0e0c000250292503511e263b6502013b650fcf2b3829291a8e040e0e0e0c00021a89040e0e0c0002031929352a362a381a71040e0e0c000250292503511e273b6502013b650fdb2b362c372a1a55040e0e0c000250291a4b042e0e0e7d0500022b362c372a1a3c040e0c000250291a33042e0e0e7d0500022b3629352a362a1a22040e0e0e0c00025029291a1a040e0e0e0c00021a15040e0e0c0002031e29352a362a35291afc030202e7030e0c0002502a250426031e2c3b6602013b27040fd02b362c37291adb030c0002502a1ad3032e0e0e7d0500022b362c372a1ac4030202af030e0c00025029291aba030e0e0e0c00021ab5030e0e0c0002031a29352a362a35291a9c030e0c0002502a250426031e283b6602013b660fd02b36292902026f031a81030e0e0c00021a7d030e0e0c0002031929352a362a351a65030e0e0c000250292503511e2a3b6502013b650fcb2b3729291a4e030e0e0e0c00021a49030e0e0c0002031a29352a362a35291a30030e0c0002502a250426031e283b6602013b650fdb2b37291a16032d020200030e7d0400022b3629291a09030e0e0c00021a05030e0e0c0002031929352a362a1aee020e0e0e0c000250292503511e263b6502013b650fce2b3629352a362b372b1acd020e0e0c000250291ac3020c0002502a1abb02300202a5020e0e7d0700022b3629352a362a1aa6020e0e0e0c000250291a9b022f0e0e7d0600022b362935291a8c021a95022f020273027e0500032b3629352a362a291a79020e0e0c00021a75020e0e0c0002031829352a362a351a5d020e0e0c000250292503511e265102023b5050291a47021a54023002022e020e0e0e7e0600032b36291a46020e0e0e0c0002293b2a1a2a020e0e0e0c00021a25020e0e0c000203202a352b362a2c1a25020202f8010e0e0c00032a2a2505250526031e2e3b660201296529291af3010c00021af1010e0e0c0002035829352a362a352b36293b1af1010e0e0c00032b352c3628062b2b6a2c1ae3010c00021ae1010e0e0c00022a2a1adb010c0003293b1ad7010c00031aad010e0e0c0002270503041ac901103b502c250626051e623b270502013b642c291a87010c00021a85010e0e0c0002034029352a362a3629291a6f010c00021a6d010e0e0c0002031a29352a362a36291a54010e0c0002502a250426031e25260302023b50502a250426031e4b3b6602013b27050fcc2b36293b2a1a2d010e0e0c00021a29010e0e0c000203352a352b362a38293b1a2b010c00032d3b1a33010c0003030329020b292e1a2e010e0e0e0c00032c2a2507250726051e413b270502012965293b2a1ae1000e0e0c00021add000e0e0c0002031c2a352b362a2c1add000e0e0c00032a2a2505250526031e293b660201296529291aaf000c00021aad000e0e0c0002035c29352a362a352b36293b1aad000e0e0c00032b352c3628062b2b6a2c1a9f000c00021a9d000e0e0c00022a2a1a97000c0003293b1a9300020252000c00031a65000e0e0c0002270503041a8100103b502c250626051e663b270502013b642c291a3f000c00021a3d000e0e0c0002031a29352a362a36291a24000e0c0002502a250426031e253b6602013b270542000000000c05000000000000|@9603,@9595,I105,I218,@9604,@9606,@9608,@9610,I253,@9638,@9640,@2004,I251,@9671,@9602| 9602:O1|@9674 9603:S59|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c54797065732832296c6561737447656e457870283129 9604:O1|@9605 9605:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031a2c352d36292e1a31000e0e0c00032b352930300e0e0e7d0800023b430e0e0e0e0e0e000000003c00000000000000|@2263,I105,I218,@9604| 9606:O1|@9607 9607:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031a2c352d36292e1a31000e0e0c00032b352930300e0e0e7d0800023b430e0e0e0e0e0e000000003c00000000000000|@2263,I105,I218,@9606| 9608:O1|@9609 9609:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a37293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@9608| 9610:O1|@9611 9611:D11,140|00812c382d2306293b1a84000e0c000303041a7f00103b502935293b1a79000e0e0c0003292d1a73000c0003291a70000e0c00020402002f1a69002b1a69000e0e0c0004502936291a61000e0e0c0002292d220d1a59000e0e0c0004220c3b1a2e000e0e0e0c0003030329020f29220d1a4100220e0e0e0e7e0e0003270a430e000000008400000000000000|@9613,I251,@2309,I253,@9614,@9620,@9627,@2071,@2377,@9630,@9612| 9612:O1|@9637 9613:S91|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e6365283229 9614:O1|@9615 9615:D10,148|00812c1a92000e0e0e0c00021a8d000e0e0c000203692c352d360402002e1a7f002b1a7f000c00045029352a36291a77000c00022b2f1a73000c0003293b1a6f000c00031a55000e0e0c0002640320040200321a5e002b1a4a000e0e0e0c0004502936291a41000e0e0c0002650201292e331a43000c00032a2a69270802013b430e0e0e0e0e0e0e000000008c00000000000000|@1785,I105,I218,@9617,@2071,@7503,@2004,I251,@9616,@9614| 9616:O1|@9619 9617:O1|@9618 9618:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 9619:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 9620:O1|@9621 9621:D5,76|00802b3b1a49000e0e0c000303033b022c2b35293b1a38000e0c000303033b021b2c1a2f000c00022d1a2c000e0c00021a29000e0e0c00022a2a696564420e0e000000004400000000000000|@9623,I251,@9624,@9622,@9620| 9622:O1|@9626 9623:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832297472616e73706f7365283129 9624:O1|@9625 9625:D5,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a1a42000e0e0e0c00021a3d000e0e0c000203043b5002041a3300102a352a1a30000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@2229,@9624| 9626:D5,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a1a42000e0e0e0c00021a3d000e0e0c000203043b5002041a3300102a362a1a30000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@2232,@9622| 9627:O1|@9628 9628:D1,20|00803b420e0e0e0e000000000c00000000000000|@9629| 9629:S107|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296f726967696e616c566172732d283129 9630:O1|@9631 9631:D5,100|00822d1a62000e0e0e0c00021a5d000e0e0c000203142c1a4e000e0e0e0c00021a49000e0e0c000202013b03262d352e362e352f362c2b311a35000e0e0c00042c2b321a2e000e0e0e0c00042a2a69270602013b440e0e0e000000005c00000000000000|@3711,I105,I218,@9632,@9630| 9632:O1|@9633 9633:D8,164|00822b291aa1000e0e0c00021a9d000e0e0c0002032429352a362a35293532352a2a1a8b000c00036603052a68010207292503511e313b6502013b64291a68000e0c00021a65000e0e0c0002033829352936293b1a5d000e0e0c0003293b1a4f000c0003030330020b302a1a4a000e0e0e0c00032b3b2b1a42000e0e0e0c0004502c2704020e3c28402f1a33000c00042f2a696464440e0e000000009c00000000000000|@9635,I105,I218,I251,I253,@9634,I255,I11| 9634:O1|@9636 9635:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296d6572676556617273283229 9636:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9634| 9637:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9612| 9638:O1|@9639 9639:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9638| 9640:O2|@9641,@2430 9641:D21,1044|00802b1a12040e0e0e0c00021a0d040e0e0c000207d32b352c362a293528051afe030e0e0e0c0003035f29362a382937293629353d1ae8030e0c00036503462937293629353d1ad7030c000303043b5002041acf03103b5029362a372a2f1ac7030c00031ac5032a690402002c2b2b1abe030e0e0e0c000450293527072503511e653b02012b650257293528061a90030e0c000303492936293b1a97030c000329353f1a7a030e0e0e0c000303172b3b56770e0e0e0c0003293528053b2b2d3b680565021729353c1a55030e0e0c000303032b0207292503511ebe3b650201296429353e1a3903020214030e0e0c000307cc29362a372929353b1a23030c00030304293702122936293b1a27030c0003292503511e1d3b656403b42c56672c1a16030e0e0e0c00043b2a291aea020e0e0e0c00021ae5020e0e0c0002031729362b3c1af7020c0003292b25042504511e253b6502012a653b2f291abb020c00021ab9020e0e0c0002031729362b3c1acb020c0003292b25042504511e223b6502012a652a2a1ab8020e0c00036503242b1ab1020e0e0c0002292b6964301aa8020e0c00032c2a1aa3020c00033e2a2e6a6502193c28401a97021a9802020227000e0c000428062a1a8e026a646402153c28401a7b021a7c020e0c000428062a1a76026a64650fdd29353d1a33020c000303b529362a372c56671a60020e0c00033b2a291a12020e0e0e0c00021a0d020e0e0c0002031729362b3c1a1f020c0003292b25042504511e253b6502012a653b2f291ae3010c00021ae1010e0e0c0002031729362b3c1af3010c0003292b25042504511e223b6502012a652a2a1ae0010e0c00036503290402002a2a1af1010e0e0c00035029352a362e2b69330c00022e2b69340e0c00023d2b2b6a270502143c28401aba011abb010c000428062a1ab6016a64660fd6293528051a72010e0e0e0c000307c929362a372b382c392a3729350202360129353c1a54010e0c000303d53b2f291a40010e0c00021a3d010e0e0c0002031729362b3c1a4f010c0003292b25042504511e233b6502012a65312c2b56d71a5d010e0e0c00053b2a291a06010e0e0e0c00021a01010e0e0c0002031729362b3c1a13010c0003292b25042504511e253b6502012a653b34291ad7000c00021ad5000e0e0c0002031729362b3c1ae7000c0003292b25042504511e223b6502012a652a2a1ad4000e0c000365031c302a69220c1acd0002047d003f000c000328052a32323268056402153c28401abb001abc000e0c000428062a1ab6006a646502153c28401aa3001aa4000e0c000428062a1a9e006a642706023c293528061a59000e0e0c000303183c28401a7c001a7d000e0e0c000428062a1a76006a6402163c28401a64001a65000e0e0c000428062a1a5e006a646602031a4e00420e0e0e0e0e000000000c04000000000000|@9643,I105,I218,I251,@2248,@2251,@9644,@2071,I253,@9645,I106,I113,@9650,@9652,@9661,@855,I11,79992,@9663,@3479,@9642| 9642:O1|@9666 9643:S27|545950455f5452454528292e6c6561737447656e6572616c283129 9644:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9645:O1|@9646 9646:D14,492|00822d1aea010e0e0e0c00021ae5010e0e0c000207cf2d352e362a293528051ad6010e0e0e0c0003035f29362a382937293629353d1ac0010e0c00036503462937293629353d1aaf010c000303043b5002041aa701103b5029362a372a2f1a9f010c00031a9d012a690402002c2b2b1a96010e0e0e0c000450293527072503511e653b02012b650253293528061a68010e0c000303452936293b1a6f010c000329353f1a52010e0e0e0c000303132b3b330c0003293528053b2b2d3b680565021729353c1a31010e0e0c000303032b0207292503511eba3b650201296429353e1a15010202f4000e0e0c000303c029362f2a2a3b1a01010e0e0c0003030c293b1af5000e0e0c0003028f2a352b362b1ade000e0e0e0c00021ad9000e0e0c000203752b352c362c352b352a2a1ac9000e0e0c000303033c024a2a1ab3000c00021ab1000e0e0c00020314291aa2000e0e0e0c00021a9d000e0e0c000202013b03212a3b2b3b3f2e1aa6000e0e0e0c00021aa1000e0e0c00031a9d000e0e0c000602013b65030d2b2a2506250626041e9c3b02013b6502013b6565030e291a7c000e0c00022968016402013b6402013b293b1a44000e0c0003030e2b31311a6000320e0e7b0509000429352c32321a50000e0c00042a2a69270602013b440e0e0e00000000e401000000000000|@4262,I105,I218,I251,@2248,@2251,@9648,@2071,I253,I223,I239,I154,@9647,@9645| 9647:O1|@9649 9648:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9649:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a362a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9647| 9650:O1|@9651 9651:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a362a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9650| 9652:O1|@9653 9653:D8,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203043b5002041a5300103b502c35293b1a4d000e0e0c000303033b021f2d1a43000c00022d0c00022e1a3c000e0c00022e1a38000e0c00032a2a696564430e0e0e0e0e0e000000005c00000000000000|@9655,I105,I218,@9656,I251,@9658,@9654,@9652| 9654:O1|@9660 9655:S39|545950455f5452454528292e6c6561737447656e6572616c2831296c6561737441726773283129 9656:O4|@77,@2231,0,@9657 9657:O5|@1964,3041,0,3041,0 9658:O1|@9659 9659:D5,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a1a42000e0e0e0c00021a3d000e0e0c000203043b5002041a3300102a352a1a30000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@2229,@9658| 9660:D5,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a1a42000e0e0e0c00021a3d000e0e0c000203043b5002041a3300102a362a1a30000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@2232,@9654| 9661:O1|@9662 9662:D4,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203142b1a46000e0e0e0c00021a41000e0e0c000202013b031e2c352d362d352e362c35292c692d2c1a29000e0e0c00032a2a69270702013b430e0e0e000000005400000000000000|@3711,I105,I218,@9661| 9663:O1|@9664 9664:D10,308|00812c1a32010e0e0e0c00021a2d010e0e0c000207cf2c352d362a293528051a1e010e0e0e0c0003035f29362a382937293629353d1a08010e0c00036503462937293629353d1af7000c000303043b5002041aef00103b5029362a372a2f1ae7000c00031ae5002a690402002c2b2b1ade000e0e0e0c000450293527072503511e653b02012b650253293528061ab0000e0c000303452936293b1ab7000c000329353f1a9a000e0e0e0c000303132b3b320c0003293528053b2b2d3b680565021729353c1a79000e0e0c000303032b0207292503511eba3b650201296429353d1a5d0002023c000e0e0c0003030d29362a372a2a692968016602013b293b1a3f000c0003030a2b301a4d00317e08000329352c311a41000e0e0c00032a2a69270602013b430e0e0e000000002c01000000000000|@4262,I105,I218,I251,@2248,@2251,@9665,@2071,I253,@9663| 9665:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9666:D11,300|00832e1a2a010e0e0e0c00021a25010e0e0c000207ce2e352f362a293528051a16010e0e0e0c0003035f29362a382937293629353d1a00010e0c00036503462937293629353d1aef000c000303043b5002041ae700103b5029362a372a2f1adf000c00031add002a690402002c2b2b1ad6000e0e0e0c000450293527072503511e653b02012b650253293528061aa8000e0c000303452936293b1aaf000c000329353f1a92000e0e0e0c000303132b3b320c0003293528053b2b2d3b680565021729353c1a71000e0e0c000303032b0207292503511eba3b650201296430301a6e00020231000e0e0e0c0004293b1a47000c0003030e2a3131311a5700320e7b0609000529352b3232321a47000c00052a2a69270502013b1f040e0e0e0e0e0e000000002401000000000000|@4262,I105,I218,I251,@2248,@2251,@9668,@2071,I253,@9667,@9642| 9667:O1|@9669 9668:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9669:D6,228|00822d3528051adf000c000303c12d362e3829372f3629353c1acc000e0c000303112a3629353c1abe000e0e0e0c00036402013b6403152f3629362b3629362b2a1aa4000e0c0003270402392f3629353b1a94000e0c000303112a3629353b1a86000e0e0e0c00036402013b6403152f3629382b3629382b2a1a70000e0c0003270402013b64033b3b2b291a62000e0e0e0c00021a5d000e0e0c0002031729362b3c1a53000c0003292b25042504511e253b6502012a65292f1a30000e0c00036402013b03052a680102013b6502013b440e0e0e0e0e0e0e00000000dc00000000000000|@9670,I251,I113,I105,I218,I106| 9670:S44|545950455f5452454528292e6c6561737447656e6572616c28312967657454797065436f6e73747273283129 9671:O4|@35,@863,@9673,@9672 9672:O5|@7457,2206,0,2206,0 9673:S36|72656475636554797065733a20556e61626c6520746f2073657420747970652076617273 9674:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9602| 9675:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@9676,I253,I106,I255| 9676:S40|535452554354555245535f28292e67656e636f6465537472756374732832296d6b41646472283129 9677:O3|@9678,@6406,0 9678:O1|@9679 9679:D2,20|00801a1300420e0e000000000c00000000000000|@9680,@809| 9680:S37|44454255474745525f28292e696e697469616c44656275676765725374617475732d283129 9681:O1|@9682 9682:D7,132|00842e1a82000e0e0e0c00021a7d000e0e0c000203542e352f360402002b33302c331a6b000c00065029352a360402002a2e2b220c220c1a5a000e0e0e0c00065029352a362a3b1a4e000e0e0e0c000303032d020b2d2b1a42000e0e0e0c0003220d2a452b46270902052d3b4530461f050e0e0e0e0e0e0e000000007c00000000000000|@9684,I105,I218,@9685,@9681,I251,@9683| 9683:O1|@11472 9684:S43|535452554354555245535f28292e67656e636f6465537472756374732832296d6170506169722833292829 9685:O1|@9686 9686:D15,260|00842f353c1a00010e0c000303072c3b452f460fcb2f353b1aed000e0e0c000303122f362f2a2f2f321ae000310e0e7b070800062f363c28403b1ad3000c0004291ad000311ad0006b293b692c3b690402001ac7002b220d220d1ab700303b1abe003122111abc000e0c000b5029352a362d1ab3000c00021ab1000e0e0c000203043b5002041aa700102f3b1aa5000e0e0c0003291aa0000e0c0002293b2a1a86000e0e0e0c00021a81000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1a3a000e0e0e0c0003030329020f292e1a5e0002020e000e0e0e0c0003220f2a452e46270c1f050e0e0e0e0e0e00000000fc00000000000000|@9688,I251,@9689,I11,@2364,@740,I48,@11468,@9985,I105,I218,@2892,I253,@2895,@9687| 9687:O1|@11471 9688:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329 9689:O1|@9690 9690:D7,132|00842e1a82000e0e0e0c00021a7d000e0e0c000203542e352f360402002b332b32321a6b000c00065029352a360402002a2e2b220c220c1a5a000e0e0e0c00065029352a362a3b1a4e000e0e0e0c000303032d020b2d2b1a42000e0e0e0c0003220d2a452b46270902052d3b4530461f050e0e0e0e0e0e0e000000007c00000000000000|@9684,I105,I218,@9692,@9689,I251,@9691| 9691:O1|@11467 9692:O1|@9693 9693:D37,1180|00842f39293b1a97040c0003312309293b1a8c040e0c000333352936220c36220d38220e3a220f23082210230a2211230b2f3b1a6a040e0e0e0c0003293b1a63040c000303041a5f04103b5029353c28403c1a57040c00041a55042a693c28403b1a48040e0c00041a49042a693c2a2c6a2e3629353d1a2b040c000303043b5002041a33041029362a37303b1a11040e0e0c0003313b1a07040c0003293c1a1b040c0003333b2b1a16040e0e0e0c0004502d3b2d1a09040e0e0c0004502c3b311afd030e0e0c00045022103b1ad1030e0e0c0003293b1acb030c000303041ae303103b502935220d372937292223220c222322111ad1030e0e0c000629352a3622153b1a9a030e0e0e0c0003292b2210222722151ab5030e0e0c000629352a363c28403b1a85030e0e0c000429221322171a9c036b293b69221d3b1a62030e0e0e0c0003292e2217222e221c2f1a84030e0c000729352a36221f3b1a42030e0e0e0c0003292b221b223222201a69030e0e0c000629352a362a3b1a27030c000303032e020b2e2b1a52030e0e0e0c0003293b1a0f030c00030304220d020a220d2a1a3c030e0c0003293b1af7020c000303042212020a22122a1a28030e0c0003222a1a23031a24030e0c0003040200222d2b30222722252e223d1a13030c00085029352a362922331a09032229222722396b22292227223e1afd020e0e0c0007223a230d29291af3020c00021af1020e0e0c0002032429352a362a35291ae4021a81020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a63020c000303691abf02291aaf020c00021aad020e0e0c0002032429352a362a35291aa0021a3d020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1f020c000303041a7f02103b50293529351a6d021a0a020e0e0e0c000303043b5002041a670210293765021a293529351a4e021aeb010c000303043b5002041a4b02102937646503ba3c3b22221a41026b2c3b1acb010c000303032f020b2f2d1a32020e0e0e0c00032a2a69293b1ab0010e0c000303032c0204402a2e6a222a3b1a99010e0e0c0003293b2a1aea010e0e0e0c00021ae5010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291adc010e0c0002222f3b1a56010e0e0e0c000322303b1a4a010e0e0e0c0003293b1a5b010c000322323b2b1a55010e0e0c0004502f3c223b2f2f6805270a1aa2010e0e0e0c000202ba3c3b22221a87016b2c3b1a11010e0e0c000303032f020b2f2d1a82010e0e0e0c00032a2a69293b1af4000e0c000303032c0204402a2e6a222a3b1add000e0e0c0003293b2a1a2e010e0e0e0c00021a29010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a20010e0c0002222f3b1a9a000e0e0e0c000322303b1a8e000e0e0e0c0003293b1a9f000c000322323b2b1a99000e0e0c0004502f3c223b2f2f6805270a1aee000e0e0e0c00023c223b0e0e0c0002221e3729353d1a53000c000303043b5002041a5b001029362a372a3b2e1a58000e0c000450293b1aba001a4b000c0004503c3b2e306b293b6922422a45224446273e1f050e0e0e0e000000009404000000000000|@9695,I253,I251,@2309,I11,@9696,@9698,@9699,I106,I255,@2309,@9701,@9724,@740,@9740,@9966,@9978,@9980,@9982,@9122,@389,@9984,@11438,@10074,I105,I218,@90,@2900,@2955,@1840,@739,@11439,@2445,@11441,@11462,@9694,@2364| 9694:O1|@11464 9695:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e64283229 9696:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@9697,I253,I106,I255| 9697:S72|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e642832296d6b41646472283129 9698:D11,180|00802b352c362d372a3b1aab000c000303041aa700103b502a3b1aa3000c0003034e2a3c1a9d000e0e0c0003293b1a97000c0003030c2a3b1a91000e0e0c000302013b03043b5002041a8400102c3b1a66000e0e0e0c000303041a7700103b503d2d692956671a6f00320e0e7e0800032903162b3b1a40000e0c000303041a5b00103b503b2c6902162b3b1a2a000e0e0e0c000303041a4300103b503d2c6966420e0e0e0e0e0e0e00000000ac00000000000000|@2434,I234,@2435,I233,I107,I113,I251,@2369,@2367,@2438,@2433| 9699:O4|101,@2083,0,@9700 9700:O5|@2042,509,0,509,0 9701:O1|@9702 9702:D10,284|00842c230d29291a16010e0e0e0c00021a11010e0e0c0002032429352a362a35291a04011a05010e0e0c00036403052a68010207292503511e323b6502013b64293b1ae7000c000303691ae300291acf000c00021acd000e0e0c0002032429352a362a35291ac0001ac1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aa3000c000303041aa300103b50293529351a8d001a8e000e0e0e0c000303043b5002041a8b0010293765021a293529351a6e001a6f000c000303043b5002041a6f0010293764651a53000c000203053b2f69022f04020030302b31301a56000e0e0e0c00065029352a360402002b2b33322d1a44000e0c00065029352a362a2a6927061f050e0e0e0e000000001401000000000000|@9704,I105,I218,@102,I251,@2900,@2955,@1840,@9705,@9703| 9703:O1|@9716 9704:S37|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529 9705:O1|@9706 9706:D15,452|00842f3b1ac1010e0e0c000303072d3b452f460fd02f3530363035313632372d3529353b1aa1010e0e0c0003030d293628061a97012b3b6b64020e2e3529341a8e010e0e0e0c000364332e0e0e0c0002293b692b2a69280e2a3c6a2a291a74010e0c00021a71010e0e0c0002031d29352a362a353d1a50010e0c00030309292503511e263b02013b6502013c64030b291a49010e0e0c00020201290402002a353d1a24010e0c0003030d1a33012b692a3b452a4651021f3c22100e0e0e0c00021a21012a22136a3c3b2c2f6b293b692d2a452c46260529352a36220e3629353b1ae5000202c9000e0e0c00030377293622103722113629353d1acc000e0c000303041ae300103b5029353b1aba000e0e0e0c00030322293729353c1aaa000e0e0e0c0003030d2936293b1abf000c0003640202293664020d2936293b1aad000e0e0c0003643c28402b1aa4000e0c00043c2a2f3b6b1a9c002a2f6a28052a22186a270702072805221022116a29220d692c220f2b6a04020022122b2b221a221a1a75000e0e0c00065029352a362a3b1a36000e0e0e0c0003030331020b312b1a5a000e0e0e0c0003221b2a452b4627171f050e0e0e0e0e0e00000000bc01000000000000|@9708,I251,@739,@9709,I105,I218,@2464,@9711,@9713,@2039,I253,I11,@961,@9705,@9707| 9707:O1|@9715 9708:S47|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529666f6c64496473283229 9709:O1|@9710 9710:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@9709,@2403,I253,I107,@2401| 9711:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 9712:S29|434f44455452454528292e6d756c7469706c6555736573283329283129 9713:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 9714:S35|434f44455452454528292e6d756c7469706c65557365732833296c6f6164466e283129 9715:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9707| 9716:D10,268|00842e352f373b1a06010e0e0e0c00023e2a1aff003c6b3c310c00023c3b2b2d6b293b693d2f3b6a220c35220d36220e352b2a1ae2000e0e0e0c0003302a3b6a642b0e0e0e0c00023f2a692e3b691acb002a692b2a69291ab6000e0e0e0c00023e2a1abb003c6b3d2a69221722130e0e0e0c0002221835221936221a352b2a1a96000e0e0e0c000322132a3b6a642b0e0e0c00023f2a692e3b691a87002a692b2a69291a6a000e0e0e0c00023e2a1a6f003c6b3d2a69293b69220d2a69293b1a66000e0e0e0c00030304221a020a221a2a1a58000e0c0003293b1a4b000c000303042228020a22282a1a44000e0c000322252a4522294627231f050e0e0e0e0e000000000401000000000000|@9718,@2388,@9719,I107,@1515,@9720,@1533,I251,@9721,@9717| 9717:O1|@9723 9718:S26|44454255474745525f28292e7570646174655374617465283429 9719:O3|2,I72,0 9720:O3|2,I255,0 9721:O1|@9722 9722:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9721| 9723:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9717| 9724:O1|@9725 9725:D10,332|00842c230d29291a46010e0e0e0c00021a41010e0e0c0002032429352a362a35291a34011a35010e0e0c00036403052a68010207292503511e323b6502013b64293b1a17010c000303691a1301291aff000c00021afd000e0e0c0002032429352a362a35291af0001af1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ad3000c000303041ad300103b50293529351abd001abe000e0e0e0c000303043b5002041abb0010293765021a293529351a9e001a9f000c000303043b5002041a9f00102937646503643b2f69040200312b2a1a74000e0c00021a71000e0e0c000203202a352b362a2c220c341a76000e0e0e0c00052a2a2505250526031e2c26030209292c2a35452a3646515129352a360402002b2b34332d1a4d000e0e0c00065029352a362a2a69270702033b2f691f050e0e0e0e0e0e0e000000004401000000000000|@9727,I105,I218,@102,I251,@2900,@2955,@1840,@9726,@9703| 9726:O1|@9728 9727:S37|44454255474745525f28292e6d616b655374727563744465627567456e7472696573283529 9728:D9,236|00832e352f3730383035313629352a362b37220d220c1ad7000c0003220c2d0e0e0c0002293b692b2a69280e2a3c6a2a291ac0000e0c00021abd000e0e0c0002031d29352a362a353d1ab0000e0c00030309292503511e263b02013b6502013c64030b291a99000e0e0c00020201290402002a353d1a84000e0c0003030d1a83002b692a3b452a4651021f3c22120e0e0e0c00021a71002a22156a3c3b2c2f6b293b692d2a452c46260529352a363e2211221122116b2b3b1a41000e0e0c00030304220e020a220e2c1a40000e0c00032a220c692c220e2b6a2b2a6927151f0400000000e400000000000000|@9730,@9731,I105,I218,I251,@2464,@9737,@9738,@9729| 9729:O1|@9739 9730:S50|44454255474745525f28292e6d616b655374727563744465627567456e74726965732835296c6f6164537472756374283229 9731:O1|@9732 9732:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@9731,@2403,I253,I107,@9733| 9733:O4|@35,@863,@2426,@9735 9734:S27|56414c55455f4f505328292e636f64655374727563742832292829 9735:O5|@9736,707,0,707,0 9736:S32|6d6c736f757263652f4d4c436f6d70696c65722f56414c55455f4f50532e4d4c 9737:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 9738:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 9739:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9729| 9740:O1|@9741 9741:D10,332|00852d230d29291a46010e0e0e0c00021a41010e0e0c0002032429352a362a35291a34011a35010e0e0c00036403052a68010207292503511e323b6502013b64293b1a17010c000303691a1301291aff000c00021afd000e0e0c0002032429352a362a35291af0001af1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ad3000c000303041ad300103b50293529351abd001abe000e0e0e0c000303043b5002041abb0010293765021a293529351a9e001a9f000c000303043b5002041a9f00102937646503683b3069040200322b2a1a74000e0c00021a71000e0e0c000203242a352b362a2c220d34220e220e1a72000e0e0e0c00072a2a2505250526031e3026030209292c2a35452a3646515129352a360402002b2b220c342d1a48000e0c00065029352a362a2a69270702033b30691f060e0e0e000000004401000000000000|@9743,I105,I218,@102,I251,@2900,@2955,@1840,@9742,@9703| 9742:O1|@9744 9743:S34|44454255474745525f28292e6d616b6556616c4465627567456e7472696573283629 9744:D10,324|00852f35303629352a362b37220c34343b220c1a32011a33010c0007342d0e0e0e0c0002293b692b2a69280e2a3c6a2a291a1c010e0c00021a19010e0e0c0002031d29352a362a353d1a0c010e0c00030309292503511e263b02013b6502013c64030b291af5000e0e0c00020201290402002a353d1ae0000e0c0003030d1adf002b692a3b452a4651021f3c220f0e0e0e0c00021acd002a22146a3c3b2c2f6b293b692d2a452c46260529352a36221536291a9b000c00021a99000e0e0c0002031c29352a36221835221938221a392b2b2f2f2d680528062a692706022d293b1a75000e0e0c000303112216352217382218393c2c2c2c6b66021022163522173822183928072c2c2c6b662c3b1a48000e0c00030304220f020a220f2d1a48000e0c00032a220d692d220f2b6a2b2a6927131f060e0e0e0e000000003c01000000000000|@9746,@6406,@9747,I105,I218,I251,@2464,@9963,@9964,@9745| 9745:O1|@9965 9746:S44|44454255474745525f28292e6d616b6556616c4465627567456e74726965732836296c6f6164566172283229 9747:O2|@9749,@9748 9748:O2|@9898,@9747 9749:D110,3348|0085303729353e1a0e0d0e0e0e0c000307d62936290a08001200b5001200b00031050406120044071200313532363c28403b1ae70c0c00041ae50c2a2c6a2c3c1ae10c0e0e0c0003292b2d6a220f1ad70c2b221022102210221056f70e0c00082d3b1ac70c0c0003293b2a1ac20c0e0e0e0c00021abd0c0e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a9c0c0e0c0002291a980c0e0c00023c1a940c1a950c0e0e0c00032e1a900c3b2d2d3c3b3c680828072a69270d0fdd1a810c0fda2f1a5f0c0c00021a5d0c0e0e0c000207d02f353036291a4a0c0202e3090e0e0e0c00021a410c0e0e0c0002030d2936293b1a170c0c00036402013b03043b5002041a3f0c10293529352c353c28401a360c1afb0b0c000428062a1a2e0c6a2b1a2d0c0e0e0c0002291af80b0e0c00021af50b0e0e0c000203c6293529362a37291a100c1af10b0e0e0c0003291ad40b0e0c00021ad10b0e0e0c0002036729352a36293b1aa50b0e0e0c000303272a1ae60b69293c1ae40b0e0c0003291ae00b0e0c00023b2a3c6a3e2c2b6a3d2a220e6a2705022d2b310204230921091ac40b02026e030e0c0003293c1aaf0b0c0003291aac0b0e0c00023b2a3c6a3e2c2b6a27046502031aa00b3d32316a3d342b6a2e353b221569293b692805302d342d68053d2a220e6a3d312b6a2f2a1a7d0b221d221d1a7a0b1a7b0b0c0007270d02013b2a3b1a060b0e0e0e0c000303051a670b0fca2a3529352a37293b1a5e0b0e0e0e0c0003035a1a570b1a580b0e0c00023e2a1a530b3c6b1a520b1a470b0c00023e2a2c3c6b1a480b1a390b0e0e0c00023e2a2c3c6b1a3c0b1ad50a0e0e0c00023c1a340b1ad10a0e0e0c00032b1a2c0b3b2d2d3c3b3c680828072a6927090fd4293c1af70a0c000303051a130b025c291a110b1aa20a0e0e0e0c0003280e2a3b6a2a291a7e0a0e0e0e0c00021a790a0e0e0c0002031d29352a362a353d1a4c0a0e0c00030309292503511e283b02013b6502013c64030f291acd0a02022f020e0e0c0002020129293b69661abe0a1a930a0c00023e2a1ab70a3c6b2b1a850a0e0e0c00023e2a2c3c6b1aa80a1a750a0e0e0c00023e2a2c3c6b301a9b0a1a180a0e0c00031a950a2a69291a030a0c00023c1a8c0a1a010a0e0e0c00032d1a840a3b2d2d3c3b3c680828072a691a790a1ade09020224000e0e0e0c0002220e1a6b0a1ad4090e0c00032b1a640a3b2d2d3c3b3c680828072a6927102215352216363c28403b1a89090e0e0c00042b3c1a87090c00032f3529353f1a70090e0c0003033129362a37292d30301a270a0c000529353d1a56090e0e0e0c0003030c292c3b1a140a0e0c0004020628062a2d3b6b66029929353d1a33090c0003037829362a372a3b1a39090e0e0c00032a3b1a2f090c000329352f2a1ae1090e0e0c0003293b1adb090c000303041ad709103b50293b1ad3090c00030321293c1abd090e0e0c00032d2a3b6a64330e0e0e0c000229331ab7090c00036402142c3b1aa0090e0c000303041aa709103b503d2d693f2a692707021629353c1ab0080e0c000303043b5002041a8b0910293629353d1a9a080e0e0e0c0003030c293c3b1a58090e0c0004020628062a3c3b6b303b691a66092a692b2a69291ae9080e0e0c00023e2a1a57093c6b323b1a74080e0c0003293b2a1a6e080e0e0e0c00021a69080e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a48080e0c0002291a44080e0c00023c1a0c091a41080e0e0c00032e1a04093b2d2d3c3b3c680828072a692716270902293b1a1a080e0e0e0c00023c1ae8081a15080e0e0c00031ae1081ae2083b2d2d3c3b3c680828072a69660fd92f1ae3070c00021ae1070e0e0c0002032a2f353036293b1ab5070e0e0c000303043b5002041aaf08102a3529220c220c1aa808330e0e7b050d0004313532363c28403b1a8d070e0e0c00041a91082a2c6a2c3c1a85070e0e0c0003292b2d6a1a81082a220f1a73080c00042d3b1a73070c0003293b2a1a6e070e0e0e0c00021a69070e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a48070e0c0002291a44070e0c00023c1a30081a41070e0e0c00032e1a28083b2d2d3c3b3c680828072a69270d0fca2f1a10070202a6040e0c00021a09070e0e0c000203da2f353036293b1add060e0e0c000303043b5002041aef07102a353435220c363c28403b1ac4060e0c00041add072a2c6a2c3c1abd060e0e0c0003292b2d6a2f2a22121aad070e0e0c00041ac1071a0e070e0e0e0c00023e2a2c3c6b293b69291afc060e0c00023e2a1aa7073c6b323b1a88060e0c0003293b2a1a82060e0e0e0c00021a7d060e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a5c060e0c0002291a58060202e2030e0c00023c1a58071a51060e0e0c00032e1a50073b2d2d3c3b3c680828072a692715024e3b1a2c060e0c00023c1a38071a29060e0e0c00031a31071a32073b2d2d3c3b3c680828072a693b1a26070e0e0e0c00023c1a20071a01060e0e0c00032b1a18073b2d2d3b3b3c680828072a6927070fdd2f1ad0050e0c00021acd050e0e0c000207d92f353036293b1aa1050e0e0c000303043b5002041ae306102a3531230d29291aa0050e0c00021a9d050e0e0c0002032429352a362a35291ac4061a6d050e0e0c00036403052a68010207292503511e303b6502013b64293b1a4f050c000303691a9f06291a5b050c00021a59050e0e0c0002032429352a362a35291a80061a29050e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a0b050c000303041a5f06103b50293529351a4d061af6040e0e0e0c000303043b5002041a470610293765022202028f02293529351a2a061ad30402029f010c000303043b5002041a23061029376434230d29291acf040c00021acd040e0e0c0002032429352a362a35291a04061a9d040e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a7f040c000303051adf05021a293529351ad2051a6b040c000303043b5002041abf05102937642211352212363c28403b1a52040e0e0e0c00041ab1052a2c6a2c3c1a49040e0e0c0003292b2d6a3d303b6a220d2b22191a34050e0c00043d220c3b6a1a8c051a91040e0e0c00023e2a2c3c6b293b691a19042a69280e2a3b6a2a1a16040e0e0e0c00021a11040e0e0c00021a09040e0e0c0002030c291a7e040e0e0e0c0002020129293b69291a4a040e0e0e0c00023e2a343c6b293b69291a38040e0c00023e2a220f3c6b3d2a69293b69293b1aab030c000303051ab3030206402a1aac036a22153b1aa9030e0e0c0003293b2a1aa2030e0e0e0c00021a9d030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a7c030e0c0002291a78030e0c00023c1ac0041a75030e0e0c00032e1ab8043b2d2d3c3b3c680828072a6927270fdd2e230d29291a40030e0c00021a3d030e0e0c0002032429352a362a35291a74041a0d030e0e0c00036403052a68010207292503511e303b6502013b64293b1aef020c000303051a6304021a293529351a42041adb020c000303043b5002041a2f04102937643d2a3b6a1a44041a39030e0e0c00023e2a2c3c6b3d2a69293b69293b1aac020e0c000303051ab3020206402a1aac026a3b1abb020c00023c1a14041ab9020e0e0c00032b1a0c043b2d2d3c3b3c680828072a693b1a98020e0c00023c1af8031a95020e0e0c00032b1af0033b2d2d3c3b3c680828072a02020300692710640fcc29353b1a45020e0e0c000303041acf03103b5029353f1a32020e0e0e0c000303ce29362a3733361ab9032c2c6a2a3b1a19020e0e0c0003032f2b220c1aa8030e0c000329353d1a02020e0e0e0c0003030e292e3b1ac002340e0e7b050e000428062a2f3b6b6402832a3c1ade010e0e0e0c0003032f2b220c1a70030e0c000329353d1ac6010e0e0e0c0003030e292e3b1a8402340e0e7b050e000428062a2f3b6b6402472a1abb010c00021ab9010e0e0c0002031e3b1a36030e0e0e0c000229220d220d2d1a2b03220c02026a017b060e0005321a18030e0c000229220d220d2d1a0f03220c7b060e000527040fd129353d1a56010e0e0e0c000303ce29362a372a3b1a59010e0e0c00032a3b1a4f010c0003220c361ade022c2c6a2a3b1a2a010e0e0e0c00030325220d35220e362d352b2a1ae5010e0e0c0003302a3b6a642b0e0e0e0c00023f2a69270402792a3c1af8000e0c00030325220d35220e362d352b2a1ab5010e0e0c0003302a3b6a642b0e0e0e0c00023f2a69270402492a1ae1000e0e0c00021add000e0e0c0002031a3b1a5a020e0e0e0c000229220f220f2d1a4f02220e7b06100005341a40020e0c000229220f220f2d1a3702220e020276007b061000052706026d293632361a29022b692a3b1a72000e0e0e0c000303032b02532a3c1a62000e0e0e0c000303032b02432a1a6b000c00021a69000e0e0c0002031a3b1ae6010e0e0e0c000229220c220c2d1adb01340e7b060d0005311acc010e0c000229220c220c2d1ac301340e7b060d000566641f06000000000c0d000000000000|@9751,I251,I11,@9752,I106,@739,I253,I105,I218,@2445,@2447,@9753,@2047,@1591,@9755,@9762,@855,79992,@9765,@9769,@9772,@6995,@7525,@9773,@1461,@9775,@9776,@9781,@9789,I113,@1596,@2388,@1329,@951,@9796,@1169,@9797,@9799,@9800,@9803,@2464,@1596,@1329,@9796,@9806,@1329,@9808,@9810,@1169,@9811,@9799,@9813,@2403,I107,I234,@2435,I233,@2438,@2433,@9733,@809,@9720,@9815,@9817,@9818,@9820,@9825,@9826,@2786,@9829,@1965,@9830,@9832,@9833,@9836,@9837,@9842,@9858,@9860,@9861,@9863,@9860,@9864,@9866,@9868,@9869,@99,@2900,@2955,@1840,@177,@9872,@9874,@951,@9875,@9877,@9878,@9880,@9881,@9877,@9883,@9885,@9886,@9889,@9892,@9894,@2383,@2385,@9896,@9750| 9750:D1,20|00805607420e0e0e000000000c00000000000000|@9793| 9751:S22|56414c55455f4f505328292e636f646556616c283629 9752:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 9753:O1|@9754 9754:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9755:O3|2,@9756,0 9756:O1|@9757 9757:D2,20|00801a1300100e0e000000000c00000000000000|@9759,@9758| 9758:O4|103,@407,@9761,@9760 9759:S31|56414c55455f4f505328292e636f646556616c2836296765744c6f63283129 9760:O5|@9736,1049,0,1049,0 9761:S68|546865207370656369616c2066756e6374696f6e20506f6c794d4c2e736f757263654c6f636174696f6e2063616e6e6f74206265207573656420617320612076616c7565 9762:O4|@35,@863,@9764,@9763 9763:O5|@9736,1043,0,1043,0 9764:S42|4f7665726c6f6164656420416464507265747479202d2077726f6e6720696e7374616e63652074797065 9765:O1|@9766 9766:D11,252|00802b3528061af7000c000303292b36293b1aef000c000329353c1ae2000e0e0e0c000303033b020b291adb002e0e0e7d0500026502b52b3528051ac2000e0e0e0c000303a52b362c382937293629353d1aac000e0c0003651ab0000e0c0002033b29373b2c291aa6000e0e0e0c00021a99000e0e0c0002031729362b3c1a93000c0003292b25042504511e253b6502012a652a2c2b6a29680166024b2937293629353d1a59000e0e0c000303043b5002041a63001029362a372a2f1a5d000e0e0c00031a59002a690402002c2b2b1a52000e0e0e0c000450293527071a28002e0e0e0e7d0500026502013b420e0e0e00000000f400000000000000|@9768,I251,I253,@9765,I218,I105,I106,@2248,@2251,@9767,@2071| 9767:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9768:S36|56414c55455f4f505328292e636f646556616c283629666f6c6c6f775479706573283129 9769:O1|@9770 9770:D3,36|00803c28401a20001a21000e0e0c000428062a3d6a64420e000000001c00000000000000|@9771,@855,I11| 9771:S36|56414c55455f4f505328292e636f646556616c2836295f2d74797065566172732d283129 9772:O2|@768,0 9773:O1|@9774 9774:D7,92|00812c1a5a000e0e0e0c00021a55000e0e0c000203352c352d362a1a4a0069293c1a48000e0c0003291a44000e0c00023b2a3c6a3e2c2b6a3d2a346a2f341a33000c00032a2a69270902013b430e0e0e000000005400000000000000|@1785,I105,I218,@9772,@6995,@7525,@9773| 9775:S14|6164645072657474795072696e74 9776:O1|@9777 9777:D2,20|00801a1300420e0e000000000c00000000000000|@9779,@9778| 9778:O2|3,@9780 9779:S27|56414c55455f4f505328292e636f646556616c2836295f2d283129 9780:S133|6164645072657474795072696e7420656c656d656e742066756e6374696f6e73206d75737420686176652074797065202761202a20696e74202d3e207072657474792c202762202a20696e74202d3e207072657474792c202e2e2e2077697468206f6e652066756e6374696f6e20666f722065616368207479706520706172616d65746572 9781:O1|@9782 9782:D25,532|008530301a11020e0e0c0003291a0c020e0c00021a09020e0e0c000207d429352f230d29291af4010e0c00021af1010e0e0c0002032429352a362a35291ae4011ae5010e0e0c00036403052a68010207292503511e303b6502013b64293b1ac7010c000303691ac301291aaf010c00021aad010e0e0c0002032429352a362a35291aa0011aa1010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a83010c000303041a8301103b50293529351a6d011a6e010e0e0e0c000303043b5002041a6b0110293765021a293529351a4e011a4f010c000303043b5002041a4f01102937641a4c01341a4c01020210010e0c00033e2a69291a1d010e0e0c000203041a3701103b503b1a34010e0c0002220e2d2b1a2d013b1a2d010e0e0c0006293b691a26012a691a25012a693b3b3b3b2d6805291ae0000e0c000203041afb00103b503b1af8000e0c00022215332b1af1003b1af1000e0e0c0006293b691af2002a691af1002a693b3b3b3b2d6805291aa4000e0c000203041abf00103b5022171abf001abc001ad1001ad2000e0e0e0c000522122a0e0e0c000264293b691ac1002a692c2a691abd002a69342a691ab9002a6922132a693b3b3c3b2d6805291a54000e0c000203041a6f00103b503b221f0e0e0c00022968013c2a2d22246b2223382224230c2a3b3c1a82000e0e0e0c0004502b2a22240e0e0e7d2900023b641f06000000000c02000000000000|@9784,@2004,I105,I218,@98,I251,@2900,@2955,@1840,@9785,@389,@1784,@2008,@2219,@2104,@1058,@9786,@1058,@9783,@7531,@7532,@2356,@2356,@2356,I255| 9783:O2|3,@9788 9784:S26|56414c55455f4f505328292e636865636b505054797065283629 9785:S13|417267756d656e7420666f7220 9786:O2|3,@9787 9787:S14|526571756972656420747970653a 9788:S14|417267756d656e7420747970653a 9789:O3|2,@9790,0 9790:O1|@9791 9791:D2,20|00801a1300100e0e000000000c00000000000000|@9793,@9792| 9792:O4|103,@407,@9795,@9794 9793:S25|56414c55455f4f505328292e636f646556616c283629283129 9794:O5|@9736,1039,0,1039,0 9795:S68|6164645072657474795072696e743a2054686520617267756d656e74207479706520776173206e6f7420612073696d706c65207479706520636f6e737472756374696f6e 9796:O2|@993,0 9797:O1|@9798 9798:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9799:S7|61646450502d31 9800:O2|@9801,0 9801:O4|6,@9802,1,0 9802:O2|4,@7886 9803:O1|@9804 9804:D4,60|00802b3c1a39000e0e0c0003293b1a33000c000303041a2f00103b503c2a693f2a6928062a3c3b6b66420e0e0e0e0e0e000000003400000000000000|@9805,I106,I234,@3695| 9805:S44|56414c55455f4f505328292e636f646556616c2836297072696e7446756e6374696f6e2d617267732d283129 9806:O1|@9807 9807:D3,44|00802b3b1a29000e0e0c000303041a2300103b503b2c693f2a6964420e0e0e0e000000002400000000000000|@3751,I234,@3695| 9808:O1|@9809 9809:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9810:S7|61646450502d32 9811:O1|@9812 9812:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9813:O1|@9814 9814:D12,244|00832e3629353f1aee000e0e0e0c0003033329362a37293131311adf000c000529353d1ad2000e0e0e0c0003030e292c3b1acc00320e0e7b050a000428062a2d3b6b66029b29353d1aad000e0e0c0003037829362a372a3b1aa9000e0e0c00032a3b1a9f000c00032935332a1a99000e0e0c0003293b1a93000c000303041a8f00103b50293b1a8b000c00030321293c1a75000e0e0c00032d2a3b6a64340e0e0e0c000229341a6f000c00036402142c3b1a58000e0c000303041a5f00103b503d2d693f2a692707021629353c1a28000e0c000303043b5002041a4300102936641f040e0e0e0e0e00000000ec00000000000000|@9734,I251,@9813,@2403,I253,I107,I234,@2435,I233,@2438,@2433,@9733| 9815:O1|@9816 9816:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9817:S5|6164645050 9818:O1|@9819 9819:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9820:O3|2,@9821,0 9821:O1|@9822 9822:D2,20|00801a1300100e0e000000000c00000000000000|@9793,@9823| 9823:O4|103,@407,@9795,@9824 9824:O5|@9736,909,0,909,0 9825:S12|416464507265747479285029 9826:O4|@35,@863,@9828,@9827 9827:O5|@9736,903,0,903,0 9828:S42|4f7665726c6f6164656420476574507265747479202d2077726f6e6720696e7374616e63652074797065 9829:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 9830:O1|@9831 9831:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9832:S9|676574507265747479 9833:O4|@35,@863,@9835,@9834 9834:O5|@9736,888,0,888,0 9835:S43|4f7665726c6f61646564204d616b65537472696e67202d2077726f6e6720696e7374616e63652074797065 9836:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 9837:O2|@9838,0 9838:O3|14,@9839,0 9839:O2|@739,@9840 9840:O2|@9841,0 9841:O3|2,10000,0 9842:O3|2,@9843,0 9843:O1|@9844 9844:D16,308|00802b3b1a31010e0e0c0003291a2c010e0c000203043b5002041a230110293b1a21010e0e0c00036403512b3b1a08010e0c0003291a04010e0c000203043b5002041afb0010293b1af9000e0e0c00036403043b5002041aee00102b29362a372b382c396b2938291ae1001ae2000e0e0e0c0003661adc002c8000022b3b1ab7000c0003291ab4000e0c000203043b5002041ac30010293c1aa9000e0e0c000364034d2b3b1a90000e0c0003291a8c000e0c000203043b5002041a9b0010293c1a81000e0e0c00036403043b5002041a8a00102b29362a37692935291a81001a82000e0e0e0c0003661a7c002c8000022b3b1a43000c0003291a40000e0c000203043b5002041a630010293e1a35000e0e0c00036403043b5002041a5200102b36420e0e0e0e0e0e000000002c01000000000000|@9846,I253,I105,@3062,I251,@9847,@9843,@9850,@371,@3062,@9852,@9854,@2047,@6236,@3062,@9845| 9845:O4|101,@2083,0,@9857 9846:S19|5072657474792e75676c795072696e74283129 9847:O4|101,@2083,0,@9848 9848:O5|@9849,98,0,98,0 9849:S30|6d6c736f757263652f4d4c436f6d70696c65722f5072657474792e736d6c 9850:O1|@9851 9851:D4,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d362a2e0e0c00022a2f1a2b000c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@9850| 9852:O4|101,@2083,0,@9853 9853:O5|@9849,108,0,108,0 9854:O1|@9855 9855:D1,20|00802820420e0e0e000000000c00000000000000|@9856| 9856:S22|5072657474792e75676c795072696e74283129283129 9857:O5|@9849,118,0,118,0 9858:O1|@9859 9859:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9860:S12|6d616b65737472696e672829 9861:O1|@9862 9862:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9863:O3|2,63,0 9864:O1|@9865 9865:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c362a353f1a40000e0c000303043b5002041a3700102a362a1a34000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2449,@9864| 9866:O1|@9867 9867:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9868:S13|6d616b65737472696e67285029 9869:O4|@35,@863,@9871,@9870 9870:O5|@9736,861,0,861,0 9871:S38|4f7665726c6f61646564205072696e74202d2077726f6e6720696e7374616e63652074797065 9872:O1|@9873 9873:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 9874:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 9875:O1|@9876 9876:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9877:S7|7072696e742829 9878:O1|@9879 9879:D1,20|00803b420e0e0e0e000000000c00000000000000|@2961| 9880:O2|@2782,0 9881:O1|@9882 9882:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9883:O1|@9884 9884:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9885:S8|7072696e74285029 9886:O4|@35,@863,@9888,@9887 9887:O5|@9736,797,0,797,0 9888:S16|636f646556616c202d20466f726d616c 9889:D4,68|008056082c1a40000e0c000329353d1a3a000e0e0e0c0003030e2956273b1a2f002f0e7b0504000428062a56373b6b64420e0e0e0e0e0e0e000000003c00000000000000|@9793,@9890,I251,@2403| 9890:O1|@9891 9891:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@9890,@2403,I253,I107,@9733| 9892:O1|@9893 9893:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@9892,@2403,I253,I107,@9733| 9894:O1|@9895 9895:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@9894,@2403,I253,I107,@9733| 9896:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9897,I107| 9897:S32|56414c55455f4f505328292e636f646556616c2836296c6f6164566172283129 9898:D23,860|00863136291a58030e0c00021a55030e0e0c000203331a4f0356273432313168063b1a47030c00022933332d1a41030e0e0c0005343b69291a39030e0e0c00023e2a2d3c6b27050fca293b1a2a030e0e0e0c0003036732313131313156770e0e0e0c000733353d2a3b6a341a0e03692a2a692d2a69280e2a3b6a2a291ae1020e0e0c00021add020e0e0c0002031d29352a362a353d1ae0020e0c00030309292503511e273b02013b6502013c640309291acd02347d1100022927070fd2323729353e1ab3020c000307de293634352a0a080038001200fd013200120012009b0112004301220c343434343456a70c0007220c3b69291a7c020e0c00023e2a2d3c6b660fdb3d303b6a0fd7040200321a4f02020232020c00021a49020e0e0c000203253236291a38020e0c00021a35020e0e0c0002030d2936293b1a3b020c00036402013b6402013b036032353336293529352c3529293528061a1c020e0c000303132936293b1a1b020c00032502501e1a3b64020129642b293528061af9010e0e0c000303172936293b1af7010202b6010c00032502501e1f3b6402012964302b452a462608020d7c011adb012a2a35452a36465129352a361ad0012b2b6a220f353d1ab2010e0e0e0c00030309220f362968016402013b293b1a9b010204420140010e0e0c0003031a3d2b3b6a22113b69291a7e010e0e0e0c00023e2a2d3c6b66020d1a890122112e2e6b3d2a3b6a6427050fd6311a47010c00021a45010e0e0c0002030d3136293b1a4b010c00036402013b03043b5002041a57011031352935293b1a51010e0e0c00032c2a1a4b011a4c010e0c0004220f3b69291a14010e0c00023e2a2d3c6b270602b6311aef000c00021aed000e0e0c0002030d3136293b1af3000c00036402013b03043b5002041a0f01103135293529220d220d1a06010e0e0e0c0004220e3b69291ac4000e0c00023e2a2d3c6b293b69291aec000e0c00023e2a1ae7003c6b27080254311a8d000e0e0c00021a89000e0e0c000203113136293b1a8f00020236000c00036402013b03043b5002041ab700103135293529220d220d1a9e000e0e0e0c0004220e3b69291a5c000e0c00023e2a2d3c6b270565022033323232323256870e0e0e0c0007333b69291a39000e0e0c00023e2a2d3c6b6664641f070e0e0e0e0e0e000000005403000000000000|@9900,I105,I218,@9901,@2383,@2385,@2388,I251,@951,@2464,I253,@9903,@9904,@9928,@9929,@2430,@9932,@9938,@9944,@9947,@9959,@813,@9899| 9899:O4|@35,@863,@9962,@9961 9900:S28|56414c55455f4f505328292e6170706c7946756e6374696f6e283729 9901:D3,68|008056082c56293b564a565b56670e0e0e0c000729353d1a2e000e0e0e0c0003030e293c3b1a24002f0e0e7b0504000428062a3c3b6b6442000000003c00000000000000|@9902,I251,@2403| 9902:S40|56414c55455f4f505328292e6170706c7946756e6374696f6e283729676574436f6e737472283129 9903:O2|@1965,@1965 9904:D2,36|00803d2c3b6a1a1f002a563756486b64420e0e0e0e0e0e0e000000001c00000000000000|@9906,@9905| 9905:D2,36|00802b5617562856391a1c002f0e0e7b060300050e0e0e0e000000001c00000000000000|@9908,@9907| 9906:S49|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f616447656e6572616c283129 9907:O1|@9909 9908:S48|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283129283129 9909:D12,252|00832e1afa000e0e0e0c0002293f1af3000c000364033f2e3b3f1aeb000c0004291ae8001ae9000e0e0c000303033c0222291adf000c00021add000e0e0c00020310293b1ac5003b28081acf000c000602013b6402013b03032c027b2b353e1aae000e0e0e0c0003033d2b36291aa4000e0c00021aa1000e0e0c000203252936291a90000e0c00021a8d000e0e0c0002030d2936293b1a77000c00036402013b6402013b6402013b032c2b362935293629293528061a58000e0c000303132936293b1a5b000c00032502501e1a3b64020129270402012b291a49000e0e0c0002302a311a4200307b050800040e0e0e0e00000000f400000000000000|@9911,I223,I233,@6192,@9912,I251,I105,I218,I154,I253,@9913,@9910| 9910:O2|@9923,@156 9911:S45|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283229 9912:S4|636f6e76 9913:O1|@9914 9914:D9,156|00802b3528051a97000c000303043b5002041a8f00102b362c382937293629353b1a7c000e0c000303041a7b00103b5029353d1a6a000e0e0e0c0003034a2b37293629353d1a58000e0c000303043b5002041a57001029362a372a311a51000e0e0c00031a4d002a690402002c2b2b1a46000e0e0e0c000450293527071a3c00300e0e0e7d0700022b2704420e0e0e0e000000009400000000000000|@9916,I251,@9917,@9920,@2248,@2251,@9915,@2071,@9913| 9915:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 9916:S42|56414c55455f4f505328292e6170706c7946756e6374696f6e283729666f6c6c6f775479706573283129 9917:O4|103,@407,@9919,@9918 9918:O5|@9736,1155,0,1155,0 9919:S52|496e76616c6964207479706520286e6f742061207479706520636f6e737472756374696f6e2920286164644f7665726c6f616429 9920:O4|103,@407,@9922,@9921 9921:O5|@9736,1153,0,1153,0 9922:S56|43616e6e6f7420696e7374616c6c20616e206f7665726c6f61642077697468696e206120737472756374757265206f722066756e63746f72 9923:D4,60|00822d2d2d6a56173b1a34000e0c00032f2f1a2f000c00042a2a6956373b2b1a26000e0e0e0c0004503b66440e0e0e0e000000003400000000000000|@9925,I253,@9924,I255| 9924:O1|@9926 9925:S28|5052494e545f5441424c4528292e6164644f7665726c6f6164283329 9926:D9,300|00822d1a2a010e0e0e0c00021a25010e0e0c000207d02d352e362a352b362a311a15010e0e0c000303033c024a2a1aff000c00021afd000e0e0c00020314301aee000e0e0e0c00021ae9000e0e0c000202013b03212a3b323b3f220c1add000e0e0c00021ad9000e0e0c00031ad5000e0e0c000602013b037b2f372a372a3629353c1ab3000c000303112a3629353c1aa6000e0e0e0c00036402013b6403152a3629362b3629362b2a1a8c000e0c00032704023d2a3629353b1a7c000e0c000303112a3629353b1a6e000e0e0e0c00036402013b6403192a3629382b3629382b2a1a640002022f000e0c0003270402013b6502013b030d2b31311a4f00320e7b050900042b31311a42000e0e0e0c00042d2a69270502013b440e0e0e0e0e0e0e000000002401000000000000|@9927,I105,I218,I251,I223,I239,I154,I113,@9924| 9927:S37|5052494e545f5441424c4528292e6164644f7665726c6f616428332966696c746572283129 9928:D2,36|00802b5617562856391a1c002f0e0e7b060300050e0e0e0e000000001c00000000000000|@9908,@9907| 9929:O4|@35,@863,@9931,@9930 9930:O5|@9736,1126,0,1126,0 9931:S16|4f7665726c6f61642054797065446570 9932:O1|@9933 9933:D2,20|00801a1300100e0e000000000c00000000000000|@9935,@9934| 9934:O4|@35,@863,@9937,@9936 9935:S37|56414c55455f4f505328292e6765744f7665726c6f6164496e7374616e6365283329283129 9936:O5|@9736,722,0,722,0 9937:S28|6765744f7665726c6f6164496e7374616e63653a204d697373696e67 9938:O2|@9939,@156 9939:D3,36|008256073b1a20000e0c00032e2e2e1a1a002f7b06050005000000001c00000000000000|@9941,I253,@9940| 9940:O1|@9942 9941:S28|5052494e545f5441424c4528292e6765744f7665726c6f6164283329 9942:D9,292|00832e1a22010e0e0e0c00021a1d010e0e0c000207d02e352f362a352b362c37322c1a0b010c000303033c024a321af7000c00021af5000e0e0c000203142b1ae6000e0e0e0c00021ae1000e0e0c000202013b0321323b2d3b3f301ad6000e0e0e0c00021ad1000e0e0c00031acd000e0e0c000602013b037b31372b372a3629353c1aab000c000303112a3629353c1a9e000e0e0e0c00036402013b6403152a3629362b3629362b2a1a84000e0c00032704023d2a3629353b1a74000e0c000303112a3629353b1a66000e0e0e0c00036402013b6403192a3629382b3629382b2a1a5c00020224000e0c0003270402013b6502013b030329020e2c3333331a4300340e7b060b0005270502083b2c2c0e7d0600021f040e0e000000001c01000000000000|@9943,I105,I218,I251,I223,I239,I154,I113,@9940| 9943:S41|5052494e545f5441424c4528292e6765744f7665726c6f61642833297365617263684c697374283129 9944:O4|@35,@863,@9946,@9945 9945:O5|@9736,1113,0,1113,0 9946:S17|4f7665726c6f6164204e6f74457175616c 9947:O4|@9948,@2577,@2682,@2770 9948:D16,196|00822c352d363c28403b1abb000c00041ab9002a2c6a2c3c1ab5000e0e0c0003292b2d6a332a1aab003456a756b856c91aa5000e0e0c00081aa1001aa2000e0e0e0c00023e2a2c3c6b2f3b1a96000e0e0e0c0003293b2a1a8e000e0e0e0c00021a89000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a68000e0c0002291a64000e0c00023c1a60001a61000e0e0c00032e1a5c003b2d2d3b3b3c680828072a69270f440e0e0e0e0e00000000bc00000000000000|@9950,I11,@9951,I106,@9952,@2428,@1594,@2388,I253,I105,I218,@2445,@9864,@9957,@2047,@9949| 9949:S8|657175616c697479 9950:S31|545950454944434f444528292e657175616c697479466f7254797065283329 9951:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 9952:O1|@9953 9953:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@9955,@9954| 9954:O1|@9956 9955:S45|545950454944434f444528292e657175616c697479466f7254797065283329726573756c74436f64652d283129 9956:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@9954,@2403,I253,I107,@2401| 9957:O1|@9958 9958:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 9959:O1|@9960 9960:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@9959| 9961:O5|@9736,1100,0,1100,0 9962:S14|4f7665726c6f616420457175616c 9963:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 9964:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 9965:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9745| 9966:O1|@9967 9967:D10,284|00842c230d29291a16010e0e0e0c00021a11010e0e0c0002032429352a362a35291a04011a05010e0e0c00036403052a68010207292503511e323b6502013b64293b1ae7000c000303691ae300291acf000c00021acd000e0e0c0002032429352a362a35291ac0001ac1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aa3000c000303041aa300103b50293529351a8d001a8e000e0e0e0c000303043b5002041a8b0010293765021a293529351a6e001a6f000c000303043b5002041a6f0010293764651a53000c000203053b2f69022f04020030302b31301a56000e0e0e0c00065029352a360402002b2b33322d1a44000e0c00065029352a362a2a6927061f050e0e0e0e000000001401000000000000|@9969,I105,I218,@102,I251,@2900,@2955,@1840,@9968,@9703| 9968:O1|@9970 9969:S41|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529 9970:D15,500|00842f3b1af1010e0e0c000303072d3b452f460fcf2f3530363035313632372d3529372a350402002a2a1acf010c000350293632352937293629353d1ab9010e0e0c000366031d3f2a346a29306932322b6a342a2213221322131aa30122147b071400062c3529220f1a98010e0c0003220f330e0e0c0002293b692b2a69280e2a3c6a2a291a80010e0c00021a7d010e0e0c0002031d29352a362a353d1a58010e0c00030309292503511e263b02013b6502013c64030b291a55010e0e0c00020201290402002a353d1a2c010e0c0003030d1a3f012b692a3b452a465102233c22150202fa000e0e0e0c00021a29012a22186a3c3b2c2f6b293b692d2a452c46260529352a363f3422156a220e3629353b1ae4000e0c00030377293622103722113629353d1ad0000e0c000303041aeb00103b5029353b1abe000e0e0e0c00030322293729353c1aae000e0e0e0c0003030d2936293b1ac7000c0003640202293664020d2936293b1ab5000e0e0c0003643c28402b1aac000e0c00043c2a2f3b6b1aa4002a2f6a28052a22186a270702072805221022116a292213692c2a692e22162b6a04020022192b2b222122211a4e000e0e0e0c00065029352a362a3b1a36000e0e0e0c0003030333020b332b1a5a000e0e0e0c000322222a452b46271e1f050e0e0e0e0e0e00000000ec01000000000000|@9972,I251,@1936,@9968,@9973,I105,I218,@2464,@9975,@9976,@2039,I253,I11,@961,@9971| 9971:O1|@9977 9972:S51|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529666f6c64496473283229 9973:O1|@9974 9974:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@9973,@2403,I253,I107,@2401| 9975:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 9976:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 9977:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9971| 9978:O1|@9979 9979:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9978| 9980:O1|@9981 9981:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9980| 9982:O1|@9983 9983:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9982| 9984:O2|@9986,@9985 9985:O2|@10213,@9984 9986:D43,1460|008631353d1ab0050e0c000307ca313629352a39293b1aa3050c00032c3a293b1a99050e0e0c00030402002e220f220f220f220f2e220f220e0c00085029352a360402002a353d1a6e050e0e0e0c0003030d1a6b052b692a3b452a4651021f3c22100e0e0e0c00021a59052a22116a3c3b2c2f6b293b692d2a452c46260529352a3631221222121a3e050e0e0e0c0004293b1a23050c000303032b020b2b2a1a2a050e0e0e0c0003293b1a0b050c000303032f020b2f2a1a16050e0e0e0c000322132d0e0e0c000229341a07052218221822171a0205020210000e0e0e0c000722142c452a4627110fcd31353e1ac8040e0c000307cb31363238293b1abd040e0e0c00033c28403b1ad1040e0e0c00042932341aca046b293b69040200220e30220f220f220f2f3b1ab904312212121200010001000c000b502935303b2a1aa7040c00021aa5040e0e0c000203352a352b362a22111a98040e0c00032c3b1a57040c0003030329020b292d1a86040e0e0e0c00032b2a2506250626041e3f3b270402012965293b2a1a5d040e0e0c00021a59040e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652d1a33040202e6030c00021a2d040202cf000e0e0c000203043b5002041a2704102f3b1ae5030e0e0c0003291a1c040e0c0002293b2a1afe030e0e0e0c00021af9030e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652e3b1aa2030e0e0e0c0003030329020b292f1ada030e0e0e0c0003280e2e3b6a2e291ab2030e0e0e0c00021aad030e0e0c0002031d29352a362a353d1a68030e0c00030309292503511e283b02013b6502013c64030b291a99030e0e0c000202012929220e1a8f032218221822171a56030e0e0e0c000722142d452a4627110fce31353c1a20030e0c000307d1313632373c28403b1a33030c00042931331a2e036b293b69040200220d2e220e220e220e2f3b1a4503312211121100010001000c000b5029352a360402003122112c221122112e221122100c00085029352a362f1af3020c00021af1020e0e0c000203043b5002041aef0210313b1aad020e0e0c0003291ae4020e0c0002293b2a1ac6020e0e0e0c00021ac1020e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1a6a020e0e0e0c0003030330020f302e1ab20202023d020e0e0e0c0003293b1a4b0202021d000c000303032a020b2a2a1a96020e0e0e0c000322132a452f4627100fdb31353f1a24020e0c0003032f3137293b1a1b020c0003293b1a0f020c000303041a6702103b50293529311a61020e0e0c0003303b452a4627040fd331362937293b1aea010e0e0e0c00032b38293b1add010e0e0c00032d39293b1ad1010e0e0c00032f2307293b1ac4010e0c000331350402002a22132213221322132e221322120e0e0c00085029352a36292e1a020222152215220f6b2215221522141aaa010e0e0e0c00073c22140e0e0c00023c28401ae2011a97010c00043c28401ada011a8b010c00043d2b2b6a1ad1012a1ad1013b6b2c3b2f1acd01020234010e0e0c0004502b3b22191abc010e0c000450220e2a1ab5010e0e0c000329221a221a1a38010e0c0004220e3b1a1e01020201010e0e0e0c000303041a9301103b50220e35293729353f1a01010e0e0c0003033129362a3729221e1a78010e0c000329353d1ae6000e0e0e0c0003030c292c3b1a64010e0c0004020628062a2d3b6b66025929353d1ac3000c0003033929362a372a3b1ab9000e0e0c00032a3b1aaf000c0003221f352220362b352b2a1a2b010c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a7f000c000303043b5002041a0701102936333b69291a01010e0e0c00023e2a2d3c6b3c3b220e2c6b293169293b1a51000e0e0c000303042211020a22112a1adc000e0c0003220f3b1ad6000e0e0e0c000303041acf00103b503d2210693f2a6922232c452a4627201f070e0e0e0e0e0e0e00000000ac05000000000000|@9988,I251,I253,@9989,@9990,@9991,@10065,@10067,@10069,@10074,I11,@740,@10158,I105,I218,@10161,@10185,@2892,@2895,@10187,@2464,@10189,@10193,@10195,@10197,@2309,@10199,@10201,-1,@2364,I48,@6658,I255,@10202,@10207,@10210,@2403,I107,@9733,@2388,@9987,I234,@3695| 9987:O1|@10212 9988:S47|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f6465283529 9989:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 9990:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 9991:O1|@9992 9992:D2,28|00822d2d2d1a18002e0e0e7b05050004000000001400000000000000|@9994,@9993| 9993:O1|@9995 9994:S47|535452554354555245535f28292e67656e636f6465537472756374732832296c6f61644f7061717565496473283329 9995:D10,228|00822d1ae2000e0e0e0c00021add000e0e0c000203b92d352e362a352b362a3529353d1aca000e0e0e0c000303043b5002041abf001029362a373c340e0c00022b3b2b1ab2000e0e0e0c0004502a3b220c1aa4000e0c0004502e3629353d1a8f000c000303041a9300103b5029353b1a7e000e0e0e0c00030322293729353c1a6e000e0e0e0c0003030d2936293b1a6f000c0003640202293664020d2936293b1a5d000e0e0c0003642f2a220f220f1a52000e0e0e0c00053c3b2e2c6b33221022101a43000c00042a2a69270d02013b440e0e0e0e0e0e0e00000000dc00000000000000|@1785,I105,I218,I251,@9699,I255,@2039,I253,@9996,@9993| 9996:O5|@9997,@2386,@2577,@2682,@2770 9997:D48,1204|00832e3629353d1aae040e0e0e0c000307dc29362a372a3b1a9d040e0e0c000307d33c28403b1a93040c00042930321a8e046b293b69331a8a040e0e0e0c000203051a830402152c321a80042c56a856b956ca1a7a040e0e0e0c00082d331a73042d56b856c956da1a6d040e0e0c00082e341a67042e56c856d956ea1a61040e0e0c00082c1a5c040e0c00021a35040e0e0c000203043b5002041a4b04103b502e3b1a47040c0003291a44040e0c0002293b2a1a2e040e0e0e0c00021a05040e0e0c000203152a352b362a2c692a2a2505250526031e233b660201296556c73b691a10042a691a0f042a692902021f021a0904020277000e0e0c00023e2a1aff033c6b313b69332a692b2a69220d2a69280e2a3b6a2a291aca030e0e0e0c00021aa1030e0e0c0002031d29352a362a353d1a84030e0c00030309292503511e283b02013b6502013c64030b291ab5030e0e0c0002020129343b1a5c030e0c0003030329020540220c2b6a27140fdd3c28403b1a47030c00042930321a42036b293b693b2e291a5c030e0c00021a35030e0e0c0002031729362b3c1a6b030c0003292b25042504511e233b6502012a651a5a035687691a5803342c322f1a55030e0e0c0007220c1afb020c000203051af702021d1a42032f56a856b956ca68051a3a03220c2d33301a2a030e0e0e0c00071a2d033056b856c956da68051a2503220d2e34311a0d030e0e0c00071a19033156c856d956ea68051a1103220e2f220c321af0020e0c00072e1ab8020e0c00021a91020e0e0c000203043b5002041aa702103b50303b1aa3020202bf000c0003291adc020e0c0002293b2a1a86020e0e0e0c00021a5d020e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652f3b691aa9022a691aa8022a69291a66020e0e0e0c00023e2a1a9b023c6b313b69332a692b2a69220d2a69280e2a3b6a2a291a2a020e0e0e0c00021a01020e0e0c0002031d29352a362a353d1ae4010e0c00030309292503511e283b02013b6502013c64030b291a15020e0e0c0002020129343b1abc010e0c0003030329020540220c2b6a2716650fd02f35292e1a2a020e0e0e0c00030402002a353d1a93010c0003030d1a17022b692a3b452a4651021a3c310c00021a09022a326a3c3b2c2f6b293b692d2a452c46260529352a36312a0e0e0c0002220c3629353d1a53010c000303041adf01103b503b5029353c1a40010e0c00030304293702022936293b1ac7010c00030304569702283b1abe010e0e0e0c00022a1ab8011ab9010e0e0c000356b71ab3013b2d2d3c3b3c680828072a6966293b691aa4012a691aa3012a69291a31010e0e0c00023e2a1a97013c6b31353d1adb000202bf000c0003030c313b3b1a84010e0c000402062806323b3b6b32353d1aba000e0e0e0c0003030c323d3b1a64010e0c000402062806333d3b6b33353d1a9a000e0e0e0c0003030c333e3b1a44010e0c000402062806343e3b6b293b692b2a692e2a692e2a69280e2a3b6a2a291a96000e0e0e0c00021a6d000e0e0c0002031d29352a362a353d1a50000e0c00030309292503511e283b02013b6502013c64030b291a81000e0e0c000202012922133b1a27000c000303032902054022142b6a2717641f040e0e0e0e0e00000000ac04000000000000|@9999,I251,I11,@740,I218,@809,@10000,@2428,@10005,@2489,@10010,@2504,I105,@2892,I253,@10015,@7227,@742,@2388,@7228,@2464,I106,@10017,@9998,@10019,@10033,@10039,@10040,@10046,@10047,@10053,@10054,@7227,@742,@7228,@10056,@10058,@10059,@10060,I113,@2447,@10063,@2047,@9998,@7227,@742,@7228,@2403| 9998:S14|7072696e742d68656c7065722829 9999:S32|545950454944434f444528292e636f646547656e657261746976654964283429 10000:O1|@10001 10001:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10003,@10002| 10002:O1|@10004 10003:S42|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283129 10004:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10002,@2403,I253,I107,@2401| 10005:O1|@10006 10006:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10008,@10007| 10007:O1|@10009 10008:S45|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283129 10009:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10007,@2403,I253,I107,@2401| 10010:O1|@10011 10011:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10013,@10012| 10012:O1|@10014 10013:S44|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283129 10014:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10012,@2403,I253,I107,@2401| 10015:O1|@10016 10016:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10015| 10017:D1,20|00815607430e0e0e000000000c00000000000000|@10018| 10018:S47|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832292d45 10019:O1|@10020 10020:D20,420|00852e352f363c28403b1a9b010c00041a99012a2c6a2c3c1a95010e0e0c0003292b2d6a3c28403b1a7d010e0e0c00041a81012a691a80012d69220d2a1a7c010e0c0003220d2a1a76010e0e0e0c00033c2a693c28403b1a4e010e0e0e0c00042931302d6b29221169322a22180c00032a1a50010e0c00021a4d010e0e0c000203043b5002041a4301103b502c3b1a3f010c0003291a3c010e0c0002293b2a1a22010e0e0e0c00021a1d010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a0a010e0e0e0c000303032c0204402a2e6a22113b1aed000e0e0c0003293b2a1ad6000e0e0e0c00021ad1000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ac0000e0c000222103b1aaa000e0e0e0c0003221e1aaf001aa4000e0c000303033c0226221e1a82000e0e0e0c00021a7d000e0e0c00020310221e3b1a88003b3f1a87000c000602013b03051a80000202221e2b1a7c000e0c0002221e1a77001a40000e0c0003302c3b2d2d3c323c680828072a69271c1f060e0e0e0e0e0e000000009c01000000000000|@10022,I11,@10023,I106,@10024,@10026,@2047,@2821,I105,I218,@2892,I253,@10030,I251,@2445,I48,I154,@1591,@2447,@10021| 10021:O1|@10032 10022:S45|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229 10023:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10024:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@10025,I253,I106,I255| 10025:S54|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832296d6b41646472283129 10026:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@10028,@10027| 10027:D2,52|00802b352c362a56381a2c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000002c00000000000000|@10029,I107| 10028:S53|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129 10029:S56|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129283129 10030:O1|@10031 10031:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10030| 10032:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10033:D3,36|008156072d1a20002e56485659566a1a1a00327b09040008000000001c00000000000000|@10018,@10034,@2428| 10034:O1|@10035 10035:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10037,@10036| 10036:O1|@10038 10037:S45|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283229283129 10038:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10036,@2403,I253,I107,@2401| 10039:S10|657175616c6974792829 10040:D3,36|008156072d1a20002e56485659566a1a1a00327b09040008000000001c00000000000000|@10018,@10041,@2489| 10041:O1|@10042 10042:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10044,@10043| 10043:O1|@10045 10044:S48|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283229283129 10045:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10043,@2403,I253,I107,@2401| 10046:S11|626f7865646e6573732829 10047:D3,36|008156072d1a20002e56485659566a1a1a00327b09040008000000001c00000000000000|@10018,@10048,@2504| 10048:O1|@10049 10049:D2,36|00802b352c372a35292b1a1b00300e0e7e0600030e0e0e0e000000001c00000000000000|@10051,@10050| 10050:O1|@10052 10051:S47|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283229283129 10052:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025a2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a23000c000303043b5002041a2b00102c36430e0e0e00000000a400000000000000|@2402,I251,@10050,@2403,I253,I107,@2401| 10053:S6|73697a652829 10054:O1|@10055 10055:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10054| 10056:O1|@10057 10057:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025c2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a23000c000303043b5002041a2b00103b502c36430e00000000a400000000000000|@2402,I251,@10056,@2403,I253,I107,@2401| 10058:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 10059:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 10060:O4|@35,@863,@10062,@10061 10061:O5|@2427,1172,0,1172,0 10062:S15|416c726561647920636865636b6564 10063:O1|@10064 10064:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10065:O1|@10066 10066:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10065| 10067:O1|@10068 10068:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10067| 10069:O1|@10070 10070:D2,20|00811a1300100e0e000000000c00000000000000|@10072,@10071| 10071:O4|11,@316,0,@10073 10072:S53|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835292d45 10073:O5|@8767,2783,0,2783,0 10074:O1|@10075 10075:D2,44|008504020031312b313134321a21000e0e0c0008502935641f060e0e0e0e0e0e000000002400000000000000|@10077,@10076| 10076:O1|@10078 10077:S51|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e73283529 10078:D20,556|008604020032353d1a25020e0e0c0003030d1a1f0233692a3b452a4651021b3c300c00021a11022a316a3c3b2c220e6b293b692d2a452c46260529352a363b34291af8010e0c00021af5010e0e0c0002031729362b3c1aeb010c0003292b25042504511e233b6502012a65293b1ad8010e0c000303033c020b291acf011ad0010e0c000303041acb01103b50293c1ab3010c00032928403b1abd010e0e0c0004293b2d1ab6010e0e0e0c000450220d291a89010e0e0c00021a85010e0e0c0002035b29352a362a352b362968012b3b1a76010e0e0e0c000303033c02142f3b1a7e010e0e0e0c00032c2a1a63010c00036403041a6e01103b502b3c1a46010e0e0e0c0003302a2c1a52010e0e0e0c0004502d250726061e673b270602013b642a3b1a3c010e0c00033b2a293b1a01010e0e0c000303032a0250293c1a2a010e0e0e0c00032a3c1a1f010c00032b3c1a17010c0003293c1aeb000c0003312a1aff000c0003293b1ac7000c000303041afb00103b5029352d2a692932692931250a250a26081e5a3b2708650402002a2a220f22112213220c22121ad4001ad5000e0e0c00095029352a3629030922122215453c460260280e2b3b6a2b291a7d000e0e0c00021a79000e0e0c0002031d29352a362a353d1a58000e0c00030309292503511e273b02013b6502013c64030b291a85000e0e0c0002020129220c3b1a2f000c0003030329020540220d2b6a22152a453b4666270c1f070e0e0e0e0e0e0e000000002402000000000000|@10080,I251,@10081,@10082,I105,I218,I106,I234,16777214,I231,@1868,I11,I255,I253,@1879,I240,@2309,@10076,@10079,@2464| 10079:O1|@10083 10080:S71|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d61746368537562537472756374757265283229 10081:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 10082:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 10083:D6,116|0087321a72000e0e0e0c00021a6d000e0e0c00020342323533360402002a2a220c220c220c220c220c220c1a52000e0e0e0c00095029352a362a2a692e2a22102210221022102210221022101a350022110e0e7b0b10000a1a2d00322a35452a3646641f080e0e0e000000006c00000000000000|@2263,I105,I218,@10079,@10084,@808| 10084:O1|@10085 10085:D50,1532|0088333629353c1af6050e0e0e0c000303b329362a37220c352a2c220d0c000329353f1ada050e0e0e0c0003033129362a3729220e1acc050e0c000329353d1abe050e0e0e0c0003030c292c3b1ab8050e0c0004020628062a2d3b6b66025929353d1a9b050c0003033929362a372a3b1a99050e0e0c00032a3b1a8f050c0003220f352210362b352b2a1a83050c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a57050c000303043b5002041a5f05102936292c69220f2a453b4627060fce29353d1a35050e0e0c000307d229362a372b3829352a382210352210352211363c28403b1a2c050e0c000429221122111a24056b293b691a2105221132221533220f220e3022176809040200311a0f052b1a0f050c00045029352a36291a07050c0002291a04050e0c00022c22101afe040e0e0e0c0003291af8040e0c00021af5040e0e0c000203732935220f1aeb041aec040e0c00031ae9043b1aa9040e0e0c0003292b1adf040c0003501ad4043b1a94040e0c000329392a1ace042b1ace040e0e0e0c0004503b1ac704020258040c00022e2a691abe043b1a6a040202a6030e0e0e0c00032a2a0e0e0e0c0002661aa8040e0c0002501aa404103b5004020022111a9d042b1a59040e0e0c0004502936291a91040e0e0c0002291a8c040e0c00020402002f2b2a3b1a0e040e0e0e0c0003030c293b1a01040e0e0c0003025c2a352b362b1a2a040e0e0e0c00021a25040e0e0c000203422b352c362c35291a4c040e0c0002293528061acd030e0e0c0003031129362d352a2a1abd030e0e0c00036502013b65030d2b2a2506250626041e6a3b02013b6502013b65650330221e220c0c000222153729353b1a8b030c00030311293622142a1af6030e0e0e0c00036402013b2c2c452a4626040fd72a1a9f030c00021a9d030e0e0c00021a95030e0e0c000203232f1aca030e0e0e0c0002292220220f220f1abe030e0e0e0c00052b2a453b4626030fd03b2b291a61030e0e0c00021a5d030e0e0c0002031729362b3c1a97030c0003292b25042504511e243b6502012a65221f352220363c28403b1a0c030e0c00041a75032a2c6a2c3c1a69030e0e0c0003292b2d6a1a65032b69302a1a62030e0e0e0c0003332a1a5b030c00033c28403b1ad5020e0e0c00041a4d032a693c2c693c28403b1ac1020e0e0c000429312d2d6b29221c6922161a1203020244010e0e0e0c000229342c221f1a04030e0c00052b1ab4020e0c00021ab1020e0e0c000203043b5002041a0303102d3b1a6d0202020f010e0e0c0003291af4020e0c0002293b2a1a82020e0e0e0c00021a7d020e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a1e020e0e0e0c000303032c0204402a2e6a22291aae021a4b020c000322133b1a0a020e0e0e0c0003293b2a1a2a020e0e0e0c00021a25020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a6c020e0c0002220f3b1ac6010e0e0e0c00032d1a5c021aad010e0e0c000303033c02222d1ad7010c00021ad5010e0e0c000203102d3b1a39023b3f1a38020e0c000602013b03051a300202012d2b1a2d020e0e0c0002221c1a27021af8010e0c0003312c3b2d2d3c323c680828072a6922202a453b46262129352a36220e1a7d010e0e0c00021a79010e0e0c000203043b5002041acb011022103b1a34010e0c0003291ac0010e0c0002293b2a1a4e010e0e0e0c00021a49010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1aea000e0e0e0c000303032d0204402a2f6a29221769221603142e030e221d3d1aca000e0e0e0c000302013b02013b22282b452a46271f02a129362a37220d35220d35220e362c360402002a353b1a9c000e0c0003033b2a36220f220e0e0c000229353d1a86000e0e0e0c0003030c292b3b1a80000e0c0004020628062a2c3b6b2b311adf000c00032d2b452a46260502112e220f1a15010e0e0c00032a2a453b465129352a360402002b332b221322152217221422140e0e0e0c00085029352a362a32693103092d03032a02013b02013b22172b452a46270e641f0900000000f405000000000000|@10087,I251,@10088,@2403,I253,I107,@9733,I11,@740,@10090,@10107,@2071,@7503,@10109,@2004,I105,I218,@5000,@389,@14557,@333,@457,@279,@10111,@183,@10116,@10139,@10142,@2377,@10145,@1955,I113,@2383,@2385,I106,@10147,@10148,@2047,@2821,@10152,@2892,@2895,@10154,@2445,I48,I154,@1591,@2447,@10155,@10086| 10086:O1|@10157 10087:S85|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e283229 10088:O1|@10089 10089:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@10088,@2403,I253,I107,@9733| 10090:D25,932|0080560c3729353b1a9d030e0e0c000307d22936562b3b1a8e030e0e0e0c0003034b2d56370c000229353d1a7a030e0e0e0c0003030c292b3b1a70030e0c0004020628062a2c3b6b29353d1a5a030e0e0e0c0003030e293c3b1a5003320e0e7b0507000428062a3c3b6b650fdd562b3c1a35030e0e0c000307d7562a1a31030e0e0c000229353d1a1e030e0e0e0c0003030829362968016402013b291a15030e0e0c00021a11030e0e0c000207df5649355659363c28403b1a01030e0e0c00041afd022a2c6a2c3c1af9020e0e0c0003292b2d6a2956b70e0e0c000229353d1ac602020290010e0e0e0c0003030c29333b1ab8020e0c0004020628062a343b6b3d56d83b6a291abf02692b2a69280e2a3b6a2a291a9d020e0e0c00021a99020e0e0c0002031d29352a362a353d1a78020e0c00030309292503511e273b02013b6502013c64031329020227011a7d020202f7000e0e0c0002020129333b1a70020e0c0003293b2a1a4a020e0e0e0c00021a45020e0e0c0002031a2a352b362a35292d692b2a2506250626041e2539003b270402012965291a3a020e0e0e0c0002291a34020e0c00023c1a30021a31020e0e0c00032e1a2c023b2d2d3c3b3c680828072a692713027f2f56570e0e0c000229353d1ad2010e0e0e0c0003030c292d3b1ac8010e0c0004020628062a2e3b6b3d56783b6a291aef01692b2a69280e2a3b6a2a291aad010e0e0c00021aa9010e0e0c0002031d29352a362a353d1a88010e0c00030309292503511e273b02013b6502013c64030d291a9101220d0e0e0e7d0d00022927066502292d56370c000229353d1a52010e0e0e0c0003030e292b3b1a4801310e0e7b0506000428062a2c3b6b64640fcb561b3b1a2c010e0c0003036c1a67013b1a47010c00031a61013b1a3d010e0e0c00031a59013b1a31010e0e0c00031a51013b1a25010e0e0c00031a49012c2e2c2e6805566c32568d3b56ae2e1a3b010c000729353d1ada000e0e0e0c0003030e293c3b1ad000220c0e7b050a000428062a3c3b6b270602a6561b3c1ab4000e0c0003034e1aef003b1acf000c00031ae9003b1ac5000e0e0c00031ae1003b1ab9000e0e0c00031ad9003b1aad000e0e0c00031ad1002c2e2c2e6805566c32568d3b56ae2e1ac700220e020251007b080900071aa1003b1a81000e0e0c00031a99003b1a75000e0e0c00031a91003b1a69000e0e0c00031a89003b1a5d000e0e0c00031a81002c2e2c2e6805566c32568d3b56ae2e1a7300220e7b0809000764420e0e000000009c03000000000000|@10092,I251,@2403,@1955,I105,I218,I11,@10093,I106,@10094,@2464,I253,@2445,@2447,@10095,@2047,@1591,@10097,@178,@179,@180,@181,I48,@9747,@10091| 10091:O1|@10098 10092:S96|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296c6f6164436f6465283129 10093:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10094:O2|@739,@951 10095:O1|@10096 10096:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10097:O2|@809,@951 10098:D19,268|00853038291a08010e0c000229353d1a02010e0e0e0c0003030829362968016402013b291af1000e0e0c00021aed000e0e0c000203a6323533363c28403b1adf000c00041add002a2c6a2c3c1ad9000e0e0c0003292b2d6a220d1acf000c000222111acb002c22122d221222121ac4000e0c00082e3b1abf000c0003293b2a1a96000e0e0e0c00021a91000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a8c000e0c0002291a88000e0c00023c1a84001a85000e0e0c00032e1a80003b2d2d3c3b3c680828072a69270e0220301a70000e0c0002341a6c00220c220c2d220c220c1a4000220d0e7b090c0008661f060e000000000401000000000000|@10100,@1955,I251,I105,I218,I11,@10101,I106,@10102,@739,@9748,I253,@2445,@2447,@10104,@2047,@1591,@10099,@809| 10099:O1|@10106 10100:S29|56414c55455f4f505328292e636f6465457846756e6374696f6e283629 10101:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10102:O1|@10103 10103:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a3b3b6a2a1a2e000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@10102| 10104:O1|@10105 10105:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10106:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a3b3b6a2a1a2e000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@10099| 10107:O1|@10108 10108:D1,20|00803b420e0e0e0e000000000c00000000000000|@2070| 10109:O1|@10110 10110:D4,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203252b352c362a360310291a36000e0e0e0c00022b2a6964020a291a26002e0e7d0500026502013b420e0e0e000000004400000000000000|@550,I105,I218,@10109| 10111:O2|@10112,@182 10112:D2,28|008056073b1a18002d0e0e0e7e030003000000001400000000000000|@10113,I253| 10113:S29|706f6c79436f6d70696c65722832297072696e7444657074682d283129 10114:O1|@10115 10115:D2,20|00801a1300420e0e000000000c00000000000000|@689,@688| 10116:O3|@10118,@10117,77 10117:O2|@10137,@14557 10118:D4,36|00802b561756281a1e001a1f001a2000300e0e7b07030006000000001c00000000000000|@10120,@10121,@10124,@10119| 10119:O1|@10126 10120:S28|506f6c794d4c2e7072657474794d61726b7570283129283129283129 10121:O1|@10122 10122:D1,20|00803b420e0e0e0e000000000c00000000000000|@10123| 10123:S22|506f6c794d4c2e7072657474795072696e742d283129 10124:O1|@10125 10125:D1,20|00803b420e0e0e0e000000000c00000000000000|@10123| 10126:D4,60|00842f3b2f313131311a34000e0c0008292f1a2f000c0003641a2c000e0c0002030a402f2c0e0e0e7d0700023b1f050e000000003400000000000000|@10128,@10127,I113,I218| 10127:O1|@10129 10128:S22|506f6c794d4c2e7072657474794d61726b7570283529 10129:D11,396|008631353d1a88010e0c000303032f0fcf31353f1a79010e0e0c00030327313632372a310e0c000250312a1a66010e0e0e0c0003293b1a5f010c000303032902013b660fd631353e1a45010e0e0c0003032b313629300e0e0e0c000250291a3b010c0002312a1a2b010c0003293b1a27010c000303032902013b660fdc31353c1a0d010e0e0c00030347313629293b1a06010e0e0e0c000303182820310c000250293c1aee000e0e0e0c000325011e2102023b5050302a1ada000e0e0e0c0003293b1ad3000c000303032902013b6502ac3136323733383439342d1ac20002029b000e0e0e0c0003220d220c1ab5000e0e0c0003293b1a97000c0003032e2c330e0c00022c3b220f220f2f22101a980022112211220e1a9300020260000c000b2e340e0e0e0c00022a66024f29352d340e0c0002502c220e2a1a74000e0c00021a71000e0e0c000203282a352b362a302d2213221322130202220022131a48000e0c00082a2a2505250526031e3426030200512d330c000250296427061f070e000000008401000000000000|@10131,I251,I107,I233,I223,I106,@10132,@10127,@10130,I105,I218| 10130:O1|@10135 10131:S31|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329 10132:O1|@10133 10133:D8,244|00812c353d1af0000e0c000303033b02d52c353f1ae1000e0e0c000303202c37292d1ad7000c000303102c2a1ad1000e0e0c00032968016402013b6402a82c353e1ab4000e0c000303282c36291ab4000e0c0002292e1aa3000c000303102d2a1a9d000e0e0c00032968016402013b6502742c353c1a80000e0c000303202c36292d1a77000c000303102c2a1a71000e0e0c00032968016402013b6402482c392c68012a2a2a1a5f000c00021a5d000e0e0c0002032d2a352b362b3b1a39000e0e0c000303033b020c2b352b2a1a40000e0c0003642a2a2505250526031e383b660201292704430e00000000ec00000000000000|@10134,I251,I232,I107,I223,I105,I218,@10132| 10134:S32|506f6c794d4c2e7072657474794d61726b757028352967657453697a65283229 10135:D11,724|0089341ad2020e0e0e0c00021acd020e0e0c000207d33435220c362a353d1abf020c0003035a40340e0c00025032293b1ab1020e0e0c0003031c2820220c0e0e0e0c000250293c1a9e020e0e0e0c000325011e2402023b505031331a8a020e0e0e0c00032a3b2b220e220e220e220e220e220e220e1a7402220f0e7b0c0f000b2a353b1a5a020e0e0e0c0003033a32220d1a5c020e0c00032b2a220e220e220d220c220c220f0e0e0e0c00082b3b2b220f220f220f220f220f220f220f1a2c0222100e7b0c10000b2a353f1a12020e0e0e0c000303362a362b372a220d0c000250220d2a1a01020202d5010e0e0c00032c3b2b22102210221022102210221022101ae80122110e7b0c11000b2a353e1ace010e0e0e0c0003033a2a3629220c0e0e0c000250291acb010c0002220d2a1ab6010e0e0e0c00032c3b2b22102210221022102210221022101aa00122110e7b0c11000b2a362b372b3b1a83010c00030304220d0fca342a1a85010e0e0c00033003033c0292220e2c1a7c010e0c000303033c0283220e2c1a5d010e0e0c00032d2a2a1a42010e0e0e0c00021a3d010e0e0c000203452a352b362a353c1a30010e0c000303052b6801022d2a2c1a3c010e0c0003291a10010e0c00021a0d010e0e0c0002031029352b2a2506250626041e4e3b6402013b6465020329680165293b1aec000e0c00031ae1000e0e0c0002651ad8000e0c0002035e40220e0c00025029293b1acd000e0e0c000303202820220f0e0e0e0c000250293c1aba0002028a000e0e0e0c000325011e2802023b5050342a1aa2000e0e0e0c00032d2c2b22112211221122112211221122111a8c0022120e7b0c12000b2b293b1a76000e0e0e0c0003031c2820220f0e0e0e0c000250293c1a62000e0e0e0c000325011e2502023b5050220e2c1a4d000e0e0c00032d3b2b22112211221122112211221122111a380022120e7b0c12000b27040201321f0a0e0e0e0e0e00000000cc02000000000000|@10136,I105,I218,I251,I233,I107,@10130,I106,I223,I232,@10132| 10136:S41|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329646f5072696e74283329 10137:D5,60|008056073b1a38000e0c0003292d1a33000c00035056173b1a25000e0e0c000329392a1a22002b1a2200317b05060004000000003400000000000000|@10138,I253,@333,@457,@279| 10138:S15|54657874494f2e7072696e74283129 10139:O4|@35,@863,@10141,@10140 10140:O5|@8767,2601,0,2601,0 10141:S27|756e6966795479706573206661696c656420696e20706173732033 10142:O1|@10143 10143:D1,20|00803b420e0e0e0e000000000c00000000000000|@10144| 10144:S97|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e28322964657374566172732d283129 10145:O1|@10146 10146:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a36293f1a4f000c0003293b1a4b000c0003641a3c000e0c000264030f291a3d000e0e0c00022b2a6964020a291a2e002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I243,I251,@10145| 10147:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10148:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@10150,@10149| 10149:D2,52|00802b352c362a56381a2c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000002c00000000000000|@10151,I107| 10150:S115|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129 10151:S118|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129283129 10152:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@10153,I253,I106,I255| 10153:S113|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d6d6b4164647273283129 10154:S3|285029 10155:O1|@10156 10156:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10157:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@10086,@2403,I253,I107,@9733| 10158:O1|@10159 10159:D1,28|00802b352c372a2a6965420e0e0e0e0e000000001400000000000000|@10160| 10160:S61|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f646528352970726f63657373426f6479283129 10161:O1|@10162 10162:D15,348|00812c353b1a58010e0c0003035d2c37293b1a4f010c00033c28403b1a49010e0e0c0004292f1a43011a44016b293b692c3b2a1a3e010e0e0e0c00021a39010e0e0c000203202a352b362a2c220d301a2a010e0e0e0c00052a2a2505250526031e2e3b6602012927070fdd2c353c1aef000c000303512c36293b2a1af6000e0e0e0c00021af1000e0e0c000203352a352b362a311ae9000e0e0c00032c3b1abf000c0003030329020b292d1ad6000e0e0e0c00032b2a2506250626041e423b27040201296602852c37293b2a1aa5000e0e0c00021aa1000e0e0c0002036c2a352b362a38293b1a7b000c0003293b1a6f000c000303041a8f00103b502935293629353d1a5a000e0e0e0c000303043b5002041a7700102936293b1a47000c0003293b1a6b000c000303041a6700103b503d2a693f2a69293469322a250d250d260b1e763b270b020302002966430e0e0e000000005401000000000000|@10164,I251,I253,I11,@10165,@740,I105,I218,@10171,@10161,@10163,@2309,@9699,I234,@3695| 10163:O1|@10184 10164:S49|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229 10165:O1|@10166 10166:D2,20|00801a1300100e0e000000000c00000000000000|@10168,@10167| 10167:O4|@35,@863,@10170,@10169 10168:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229747970655661724d61702d283129 10169:O5|@8767,2889,0,2889,0 10170:S10|747970655661724d6170 10171:O1|@10172 10172:D15,244|00832e353d1af0000e0c0003035a2e362936292f2f1ae4000e0c0004293b2a1ade000e0e0e0c00021ad9000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965313b1aaa000e0e0e0c0003030329020b29321aaa00310e7e0a00032704027d2e353c1a8a000e0e0e0c000303102e36292e1a8f000c000329306965025f2e353e1a6c000e0c000303522e361a79003b1a79000e0e0c00031a75003b1a6d000e0e0c00031a6d003b1a61000e0e0c00031a65003b1a55000e0e0c00031a5d002c2e2c2e68052e33333b1a54002e1a54000e0c000729220c69270702012d1f040e00000000ec00000000000000|@10174,I251,@10175,I105,I218,@10177,@10179,@178,I253,@179,@180,@181,I48,@10173,@9747| 10173:O17|@185,@186,@187,@188,@10181,@179,I48,@2903,@2908,@189,@178,@184,@6153,0,@181,@180,@2914 10174:S60|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f6164537472646563732832296c6f616456616c73283229 10175:O1|@10176 10176:D12,132|00822d1a82000e0e0e0c00021a7d000e0e0c0002035d2d352e361a73003b1a73000c00031a71003b1a69000e0e0c00031a69003b1a5d000e0e0c00031a61003b1a51000e0e0c00031a59002c2e2c2e68052f34343b1a50002e1a50000e0c00072f220c220c1a48000e0c00042a2a69270902013b440e0e0e000000007c00000000000000|@1785,I105,I218,@178,I253,@179,@180,@181,I48,@10173,@9747,@10175| 10177:O1|@10178 10178:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10177| 10179:O1|@10180 10180:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@10179,@2403,I253,I107,@9733| 10181:O1|@10182 10182:D1,20|00803b420e0e0e0e000000000c00000000000000|@10183| 10183:S18|4c45585f28292e6e756c6c4c65782d283129 10184:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10163| 10185:O1|@10186 10186:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10185| 10187:O1|@10188 10188:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10187| 10189:O1|@10190 10190:D2,20|00811a1300100e0e000000000c00000000000000|@10072,@10191| 10191:O4|11,@316,0,@10192 10192:O5|@8767,2771,0,2771,0 10193:O1|@10194 10194:D1,28|00802b352c372a2a6965420e0e0e0e0e000000001400000000000000|@10160| 10195:O1|@10196 10196:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10195| 10197:O1|@10198 10198:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10197| 10199:O1|@10200 10200:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@10199,@2403,I253,I107,@9733| 10201:D8,132|008156092d2a1a7f000c00021a7d000e0e0c000203043b5002041a7300102a352b362b3b1a6d000e0e0c000303042a3602162b3c1a61000e0e0c00032a2a2505250526031e3f3b642704293629353d1a4a000e0e0e0c000303142a2e564756581a3d000e0e0c00053c2a696402022a3565430e0e0e0e0e0e000000007c00000000000000|@10072,I105,I218,@878,I113,I107,I251,@9996| 10202:O1|@10203 10203:D6,108|00812c1a6a000e0e0e0c00021a65000e0e0c000203452c352d362a352b36293529353b1a52000e0e0e0c000303043b5002041a47001029362b362c373f2c220c6a292c2c6a302a6932220e1a32000e0e0e0c00032a2a69270c02013b430e0e0e000000006400000000000000|@1785,I105,I218,I251,@10204,@10202| 10204:O4|@35,@863,@10206,@10205 10205:O5|@8767,2717,0,2717,0 10206:S37|6d616b6553656c65637465643a204e6f7420426f756e64206f72206e6f7420466f726d616c 10207:O4|@35,@863,@10209,@10208 10208:O5|@8767,2726,0,2726,0 10209:S22|46756e63746f724170706c3a20756e646566696e6564 10210:O1|@10211 10211:D7,180|00812c3629353f1aae000e0e0e0c0003033329362a37292f1aa1000e0e0c000329353d1a92000e0e0e0c0003030e292c3b1a8c00320e0e7b0508000428062a2d3b6b66025b29353d1a6d000e0e0c0003033929362a372a3b1a69000e0e0c00032a3b1a5f000c0003303531362b352b2a1a55000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a27000c000303043b5002041a2f0010293664430e0e0e0e0e0e00000000ac00000000000000|@9734,I251,@10210,@2403,I253,I107,@9733| 10212:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9987| 10213:D20,580|0089331a42020e0e0e0c00021a3d020e0e0c000207d1333534362a353b1a30020e0c000303782a363c28403b1a25020e0e0c00042a2a69293b693c28403b1a13020c000432220f22112215221422123c3068081a020232221532221422142212221168080402002d3b2d2d2d1aed010e0e0c00065029352a362a3b1ad2010e0e0e0c000303042211020a22112b1ad0010e0c000322102a452b46270b0fd72a353c1aac010e0c000303322a362b371ab3012e2d343368051aae012f2d2c34680522112c221122112211221122113022112211221022120e7b0c12000b2a372b38293b1a8701020236010c0003040200220f2d2b221456a7220d2214221422171a6e010e0e0e0c000a5029352a362c2a2211220d22141a5c010e0c000629352a363c28403b1a2d010e0e0c000429221422161a44016b293b69040200221a220e2f221a221a2f3b221a31221a22190c000b5029352a362c1aef000c00021aed000e0e0c000203043b5002041a0f01102e3b1af9000202a5000e0e0c0003291a00010e0c0002293b2a1abe000e0e0e0c00021ab9000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1a9a000e0e0e0c0003030329020b292e1abe000e0e0e0c0003293b1a7f000c0003030334020b342a1aaa000e0e0e0c0003293b1a67000c00030304220f020a220f2a1a94000e0c0003293b1a4f000c00030304221c020a221c2a1a80000e0c0003221b2a45314627166502152e220c3434343468062e0c00022d2a35452a3646641f0a0e0e000000003c02000000000000|@10215,I105,I218,I251,I11,@10216,@10218,@11414,@11416,@11418,I253,@11420,@9701,@740,@2892,@2895,@11431,@11433,@11435,@10214| 10214:O1|@11437 10215:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829 10216:D1,60|00802b352c3629392a3a040200565856692d568a569b2f3356cc3156ed56f70e0e0c000b5029352a362a2a692707420e000000003400000000000000|@10217| 10217:S33|434f444547454e5f50415253455452454528292e67656e636f6465283829283129 10218:O3|@10220,@10657,@10219 10219:O2|@11336,@10884 10220:D59,2740|00842f1ab20a0e0e0e0c00021aad0a0e0e0c000207da2f3530362a352935281a1a9d0a0e0e0c0003036e293631353236333734392d1a8c0a0e0c0002292b2e302f1a840a0e0c000629352a362a3b1a6f0a0c000303042211020a22112b1a6c0a0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220c30303068082213322b221b221b221a221c0e7b071c0006293528141a210a0e0e0c000307dd29362937293b1a210a0e0e0c00032b38293b1a150a0e0e0c00032d39293b1a090a0e0e0c0003220e35220f3622103722113522123622133722143922153a220c2b2e302f2e1ae60902029d090e0e0e0c000729352a36342a34220d220c1ac2090e0e0e0c000629352a3622102a220e2210220f1abc090e0c000629352a362a3b1a97090c000303032d020b2d2b1aa6090e0e0e0c0003293b1a7f090c0003030331020b312a1a92090e0e0e0c0003293b1a67090c000303042222020a22222a1a7c090e0c000322223522233622243722253822263a22272306222802021f0023072f2f2f2f220e30303068082224322b222c222c222b222d0e7b072d000629353b1a16090e0e0e0c000307cd2936293a293b1a15090e0e0c00032b352c372d382e39220e35220f3622103722113922123a301a0d090e0e0c000230030333020a291a02090e0e0e0c0002322a1afb080c00030402002a2a1af4080e0c00035029352a363b3169040200220f2c2c2b1aa1080e0e0c00021a9d080e0e0c000203142a1a8e080e0e0e0c00021a89080e0e0c000202013b03282b352c362c352d362c2b2f2214221622271aa7080c00072c2b2b25082508250826051e4c26050209292d2a35452a364651260329352a36220e230d29291a3b0802022d040c00021a35080e0e0c0002032429352a362a35291a64081a25080e0e0c00036403052a68010207292503511e333b6502013b64293b1a07080c0003036b1a3f08291af3070c00021af1070e0e0c0002032429352a362a35291a20081ae1070e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ac3070c000303041aff07103b503b50293529351aeb071aac070e0c000303043b5002041ae707103b50293765021e293529351acc071a8d070e0e0c000303043b5002041ac707103b50293764312210221222102d1aba070e0e0e0c0006220d2e2213221522141a64070e0c000629352a3622161a9f070c0002292b2217221922181a49070e0e0c000629352a362a3b1a33070c000303032e020b2e2b1a7a070e0e0e0c000322151a73070c00023b2a693c28403b1a6a070e0e0e0c000429221d221d2d6b29221b69222103d5221a22252a3b1af0060e0c00030319293b1ae5060e0e0c000303043b5002041a3707103b503b02aa2a352b362b1ac1060e0e0c00021abd060e0e0c000203043b5002041a1707103b502b352c362c352937293629353c1aa0060e0c0003030d2938293c1a93060c00036402013b64031329362936293b301ae7060c0004503b26030242293629353b1a6e060e0e0e0c00030311293729353c1a5e060e0e0e0c00036402013b6403043b5002041ab606103b50293629372936293b311aa3060c0004503b26042d2c2508250826061ec93b27066502013b222f3522303622313722323822332306223423072e2e2e2e2211220c30306808040200222c3b2c1a69062d22380e0e0e0c00065029352a36222c03a32225291ad9050e0e0c00021ad5050e0e0c0002038a29352a362a352937293629353c1ac2050e0e0e0c0003030d2938293c1ab3050c00036402013b64031329362936293b3b1a07060c0004503b26030242293629353b1a8e050e0e0e0c00030311293729353c1a7e050e0e0e0c00036402013b6403043b5002041ad605103b50293629372936293b3b1ac3050c0004503b26042b250526041e963b270402013b6402013b223a35223b36223c37223d38223e2306223f23072e2e2e2e34221730306808040200223c3b2c22442d22430e0c00065029352a3622161a02050e0e0e0c00021afd040e0e0c000203043b5002041a6705103b5022183b1afa040e0e0e0c0003291a58050e0c0002293b2a1ace040e0e0e0c00021ac9040e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1aaa040e0e0e0c00030304220f020a220f2e1a14050e0c0003293b1a8f040c000303032a020b2a2a1a02050e0e0e0c0003293b1a77040c000303042220020a22202a1aec040e0c0003293b1a5f040c000303042229020a22292a1ad8040e0c0003293b1a47040c00030304222f020a222f2a1ac4040e0c0003293b1a2f040c00030304224d020a224d2a1ab0040e0c0003224b2a45334627460fdd293528091a0b040c000303a22936313532363337343a2d2b2d2c301a88040e0c00062e1a84040e0c0002220e35220f3622103722113922123a2e2b2e302f2e1ae4030e0c000729352a362a3b1ac3030c0003030332020b322b1a52040e0e0e0c0003293b1aab030c000303042218020a22182a1a3c040e0c0003221835221936221a37221b38221c3a221d2306221e23072f2f2f2f220d3030306808221a322b22222222222122230e7b07230006293528131a5d030e0e0c0003034e29362939293b1a5d030e0e0c00032b352c361ae5033231220e2f221168062b0202ff023b1a2f030c000303032a020b2a2c1aca030e0e0e0c000329221022102d2210220f22110e0e0e7b071100062935281c1a01030e0e0c000307dc29362a392d3633352c291ae5020e0e0c00021ae1020e0e0c0002035529352a362a38293b1ae3020c00032c372a291ac1020e0e0c00021abd020e0e0c0002032229352a362a381a5d03342210306b2a2a1a57030c0003502b250526041e2f260402023b50502c250626051e613b270502013b64220c35220d36220e37220f3929312e1a29030e0e0c000429352a3632343032311a1c030e0c0006293b1a5b020c000303032b020b2b2a1a0a030e0e0e0c000322153522163622173722183822193a221a2306221b23072f2f2f2f220d303030680804020022162a02026c011ad9020e0e0c00035029352a3629221a2e122000010002000e0c00042b3b1afb010c000303033b024b2b3b2a1ae5010e0e0c00021ae1010e0e0c0002031c2a352b362a2c1a99020e0e0c00032a2a2505250526031e293b66020129650402002a221d312c122400010001000e0e0c000550293565221a3b2a1a99010e0e0c00021a95010e0e0c000203352a352b362a38293b1a97010c00032d3b1a7f010c0003030329020b292e1a3a020e0e0e0c00032c2a2507250726051e413b270502012965292211220e2210220f220e1a61010e0e0c000729352a362a3b1a3f010c000303032d020b2d2b1afe010e0e0e0c0003293b1a27010c000303032f020b2f2a1aea010e0e0e0c0003293b1a0f010c000303042213020a22132a1ad4010e0c0003293b1af7000c00030304222a020a222a2a1ac0010e0c0003222a35222b36222c37222d38222e3a222f2306223023072f2f2f2f220f3030306808222c322b22342234223322350e7b073500062935280c1aa9000e0e0c0003036229360402002a2c342c56970c00055029352a362a3b1a8a000e0e0e0c00030304220c020a220c2b1a54010e0c0003220c35220d36220e37220f3822103a22112306221223072f2f2f2f220c3030306808220e322b22162216221522170e7b071700062a3232323231337b070a00066602112e2e692d0e0e0c00022c2a35452a3646641f050e0e0e0e0e0e00000000ac0a000000000000|@10222,I105,I218,I251,@10223,@9966,@10225,I253,@9740,@9724,@10227,@10229,@10231,@10233,@10235,@10237,@3479,@10319,@106,@2900,@2955,@1840,@10332,@10507,@10509,@10511,I11,@5286,@5286,I255,@7811,@10513,@2892,@2895,@10516,@10518,@10520,@10522,@10524,@10526,@10528,@10591,@10593,@10595,@10597,@10601,@10603,@10605,@10615,@10618,@10627,@10629,@10631,@10646,@10648,@10650,@10652,@10654,@10221| 10221:O1|@10656 10222:S35|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429 10223:O1|@10224 10224:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a36293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@10223| 10225:O1|@10226 10226:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10225| 10227:O1|@10228 10228:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10227| 10229:O1|@10230 10230:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10229| 10231:O1|@10232 10232:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10231| 10233:O1|@10234 10234:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a36293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@10233| 10235:O1|@10236 10236:D7,148|00802b1a92000e0e0e0c00021a8d000e0e0c000203692b352c362a352937293629353d1a7a000e0e0e0c000303041a7300103b5029353b1a66000e0e0e0c00030322293729353c1a56000e0e0e0c0003030d2936293b1a4f000c0003640202293664020d2936293b1a3d000e0e0c0003642d1a37000c00022a2a69270702013b420e0e0e0e0e0e0e000000008c00000000000000|@1785,I105,I218,I251,@2039,I253,@10235| 10237:O1|@10238 10238:D11,164|00812c3b1aa1000e0e0c000303172b3b1a95000e0e0c000303043b5002041a8b00103b026c2c352d362d1a83000c00021a81000e0e0c000203043b5002041a7700102d352e362c36293b1a6f000c000329362f3a2a1a68000e0c00022a1a64000e0c00020403002b2b2b1a5b000c00045029352a362b37342c2c346b292b69220e220d1a46000e0e0e0c00032a2a692711430e0e0e0e0e0e000000009c00000000000000|@3980,I251,@3979,I105,I218,@3979,I253,@10240,@10242,@10239,@10237| 10239:O1|@10244 10240:O1|@10241 10241:D6,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203352b352c362a3829353d1a46000e0e0e0c0003030a29362c35292b696502082b35291a320069642b1a30000e0c00022a2a69270502013b420e0e0e000000005400000000000000|@1785,I105,I218,I251,@855,@10240| 10242:O1|@10243 10243:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@10242| 10244:D15,252|00822d1afa000e0e0e0c00020402002e3b1af0000e0c0003030d1aeb002a2a35452a36465102ae3b2f291adf000c00021add000e0e0c0002031729362b3c1ad3000c0003292b25042504511e223b6502012a653b1ac1000e0e0c00022a1abc001abd000e0e0c00031ab9001aba003b2d2d3b3b3c680828072a693b34291a8c000e0c00021a89000e0e0c0002031729362b3c1a7f000c0003292b25042504511e233b6502012a653b1a6d000e0e0c00022a1a78001a69000e0e0c00031a71001a66003b2d2d3b3b3c680828072a69332f452a46260b29352a362c311a56000e0e0e0c0003302b452c462a472705440e0e00000000f400000000000000|@10246,@10247,I251,@10253,I105,I218,I106,@9864,@10254,@2047,@1358,@10256,@10257,@742,@10245| 10245:O1|@10259 10246:S34|44415441545950455f52455028292e63686f6f7365436f6e73747252657072283229 10247:O1|@10248 10248:D6,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203352b352c362a352b3629353c1a44000e0c000303053b2b69020d291a39000e0e0c0002292c69642c1a30000e0c00022a2a69270602013b420e0e0e000000005400000000000000|@1785,I105,I218,I251,@10249,@10247| 10249:O1|@10250 10250:D10,260|00802b3528051aff000c000303622b362c382937293629353d1aec000e0c00036503492937293629353d1adb000c000303043b5002041ad3001029362a372a2f1acd000e0e0c00031ac9002a690402002c2b2b1ac2000e0e0e0c000450293527071ab8002e0e0e0e7d0500023d6502862b353d1a92000e0e0e0c000303033c02752b353e1a81000e0e0c000303672b36291a8c000e0c00021a89000e0e0c0002030d2936293b1a5f000c00036402013b030e29352936291a62002f0e7d0600023b2a291a5a000e0e0e0c00021a55000e0e0c0002031729362b3c1a4b000c0003292b25042504511e253b6502012a652968016502013d420e00000000fc00000000000000|@10252,I251,@2248,@2251,@10251,@2071,@10249,I105,I218,I106| 10251:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 10252:S30|44415441545950455f52455028292e6765745475706c654b696e64283129 10253:O2|@1358,@742 10254:O1|@10255 10255:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10256:S10|626f7865642f73697a65 10257:O1|@10258 10258:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10259:D25,796|00812c1a1a030e0e0e0c00021a15030e0e0c000203202c352d362a35293b1a07030c0003030c2a3b1afd020e0e0c000302013b6602013b03b92c3529361aec021aed021aee020e0e0e0c00032a1ae8021ad5020e0e0c000303033c02222a1abf020c00021abd020e0e0c000203102a3b1ac5023b3f1ac4020e0c000602013b03051abc0202012a3b1ab9020e0e0c00023c1ab4021ab5020e0e0c00032c2c3b2d2d3b3b3c680828072a691a7f021aa0021aa1020e0e0c0003293b692b2a69280e2a3b6a2a1a59020e0e0c00021a55020e0e0c00021a4d020e0e0c0002030c291a76020e0e0e0c0002020129293b69270d0fcb2c1a2a020e0e0e0c00021a25020e0e0c000203202c352d362a35293d1a17020c0003030c2a3b1a0d020e0e0c000302013b6602013b03152c3529361a2c022e2b1a2b020c0004293b69660fd22c1ade010e0e0e0c00021ad9010e0e0c000203202c352d362a35293c1acb010c0003030c2a3b1ac1010e0e0c000302013b6602013b03152c3529361ae0012e2b1adf010c0004293b69660fcc2c1a92010e0e0e0c00021a8d010e0e0c0002032c2c352d362a35291a78010e0c00021a75010e0e0c000203102a3b1a6d01020249010e0e0c000302013b6602013b03152c3529361a88012e2b1a87010c0004293b69660fce2c3b2a1a38010e0c00021a35010e0e0c000203312a352b362a35293b1a27010c000303032c020f2c3c1a56010202f6000e0e0e0c00032b2a2506250626041e3c3b270402012965293c1a3a010e0e0e0c0003030e3b2d2f1a30012f0e0e7b05050004293b1a1f010c0003035a3b2e291acc000202b0000e0c00021ac5000e0e0c0002031729362b3c1af7000c0003292b25042504511e273b6502012a65291a9d000e0e0c00020303290207291adf000c0002293c1adb000c00033b312b1ad600327b050800043b2e291a7200020256000e0e0e0c00021a69000e0e0c0002031729362b3c1a9b000c0003292b25042504511e293b6502012a65291a41000e0e0c00020303290207291a83000c0002293c1a7f000c00033b30322c1a7d00330e0e0e7b06080005430e0e0e0e0e0e0e000000001403000000000000|@10261,I105,I218,I251,@10262,@739,@10263,I48,I154,@1591,@9864,@10268,@2047,@809,@10270,@2464,@844,@10283,I106,I113,@10304,I152,I240,@10310,@10260| 10260:O1|@10315 10261:S47|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f736552657072283129 10262:O1|9 10263:O1|@10264 10264:D13,372|00812c350a090032014a00140145002d01f600ca009f00140040002b3b69291a56010e0e0e0c00023e2a1a4f013c6b293b69291a42010e0e0e0c00023e2a1a3f013c6b27050fdd1a3a010fdd1a35010fdd2c362d372a1a2f010c000203041a2b01103b502a3b1a27010c0003291a18010e0c000203043b5002041a1701102e353d1a14010e0c0003030c2e3b3b1a0c010e0c0004020628062f3b3b6b280d2b2b2e6b270402bb2c362d382d353d1ae8000e0c0003030c2d3b3b1ae0000e0c0004020628062e3b3b6b280d2c2b2d6b6602902c362d372d353d1abd000e0e0c0003030c2d3b3b1ab4000e0c0004020628062e3b3b6b280d2c2b2d6b6602642c363d2a3b6a2d3b692a2a69291a93000c00023e2a1a8f003c6b270502462c362d37280d2b02023b002f020236002c020231006b65022d1a4d0002282b3b69291a38000e0c00023e2a1a33003c6b293b69291a26000e0e0e0c00023e2a1a23003c6b2705430e0e0e0e0e0e000000006c01000000000000|@10266,@2388,@817,@813,@742,I105,@1784,I253,@3062,I251,@2403,@10265,@802| 10265:O1|@10267 10266:S29|44415441545950455f52455028292e636f6e7374724d61746368283229 10267:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10265| 10268:O1|@10269 10269:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10270:O1|@10271 10271:D18,588|00812c350a0900f001ca00c100d300ce01b8006a01d6001400b3002c36293b1a2e020e0e0e0c000303032c028a291a23021a24020e0c0003280e2a3c6a2a291a1a020e0e0e0c00021a15020e0e0c0002031d29352a362a353d1a08020e0c00030309292503511e283b02013b6502013c64030b291af1010e0e0c00020201293b1ae9010e0e0c00023c1ae4011ac9010e0e0c00032b1adc013b2d2d3b3b3c680828072a69333b69291acd010e0e0c00023e2a2d3c6b2709640fcf1abf010fcc2c363d2a3b6a640fcd2c363d2a3b6a640fd92c363d2a3b6a640fd22b0fd12c362d373d2b3b6a2a1a97011a6c010e0c00032a2a69280e2a3c6a2a291a5f010c00021a5d010e0e0c0002031d29352a362a353d1a50010e0c00030309292503511e253b02013b6502013c64030b291a39010e0e0c00020201293b1a31010e0e0c00023c1a40011a11010e0e0c00032b1a24013b2d2d3b3b3c680828072a69220d3b69291a14010e0c00023e2a2d3c6b270d02cd2c363d2a3b6a2d3b692a2a69280e2a3c6a2a291ad5000204b300b1000c00021acd000202a7000e0e0c0002032529352a362a353d1abc000206920090008e000e0c00030309292503511e373b02013b6502013c640309291a9d00317d09000229270502692b3b691aad002a691aac002a69291a92000e0e0e0c00023e2a1a9f003c6b270402472b3b69280e2a3c6a2a291a58000e0c00021a55000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a31002e7d0600022965430e000000004402000000000000|@10273,I113,@10274,@2047,I105,I218,I251,@2464,@9864,@10277,@1591,@2388,@809,@10279,@10272,@7227,@742,@7228| 10272:O1|@10282 10273:S29|44415441545950455f52455028292e636f6e7374724170706c79283229 10274:O1|@10275 10275:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@10276,@739| 10276:S49|44415441545950455f52455028292e636f6e7374724170706c792832297475706c654170706c79436f6465283229283129 10277:O1|@10278 10278:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10279:O1|@10280 10280:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@10281,@739| 10281:S52|44415441545950455f52455028292e636f6e7374724170706c792832297461675475706c654170706c79436f6465283329283129 10282:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10283:O1|@10284 10284:D17,388|00822d1a82011a83010c00032c1a80011a81010e0e0c000303033c02222c1a77010c00021a75010e0e0c000203102c3b1a5d013b3f1a68010e0c000602013b03051a600102012c3b1a5d010e0e0c00023c1a58011a59010e0e0c00032c2c3b2d2d3b3b3c680828072a69331a1a011a43010c0003321a18011a19010e0e0c000303033c0222321a0f010c00021a0d010e0e0c00020310323b1af5003b3f1a00010e0c000602013b03051af8000201323b1af5000e0e0c00023c1afc001af1000e0e0c00032c2c3b2d2d3b3b3c680828072a6922101ab1001ae2000e0e0e0c0003220f1aab001aac000e0c000303033c0226220f1aa2000e0e0e0c00021a9d000e0e0c00020310220f3b1a84003b3f1a8f000c000602013b03051a88000202220f3b1a84000e0c00023c1a94001a81000e0e0c00032c2c3b2d2d3b3b3c680828072a69293b69302a69220e2a69280e2a3b6a2a1a43000c00021a41000e0e0c00021a39000e0e0c0002030a291a560022197d1b000229271644000000007c01000000000000|@10286,@739,@10263,I48,I251,I105,I218,I154,@1591,@9864,@10287,@2047,@10270,@10289,@10291,@10285,@2464| 10285:O1|@10303 10286:S40|44415441545950455f52455028292e637265617465556e617279436f6e7374727563746f72283329 10287:O1|@10288 10288:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10289:O1|@10290 10290:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10291:O1|@10292 10292:D18,476|00812c350a0900a301b800c200c7007d01bd005a01ca001400b3002c36293b1abe010e0e0e0c000303032c028a291ab3011ab4010e0c0003280e2a3b6a2a291aaa010e0e0e0c00021aa5010e0e0c0002031d29352a362a353d1a98010e0c00030309292503511e283b02013b6502013c64030b291a81010e0e0c00020201293b1a79010e0e0c00023c1a74011a59010e0e0c00032b1a6c013b2d2d3b3b3c680828072a69333b69291a5d010e0e0c00023e2a2d3c6b2709640fd51a4f010fd21a4a010fcf1a45010fcc1a40010fc92b0fc82c37291a39011a0e010e0e0e0c0003280e2a3b6a2a291a02010e0e0e0c00021afd000e0e0c0002031d29352a362a353d1af0000e0c00030309292503511e283b02013b6502013c64030b291ad9000e0e0c00020201293b1ad1000e0e0c00023c1ae0001ab1000e0e0c00032b1ac4003b2d2d3b3b3c680828072a69333b69291ab5000e0e0c00023e2a2d3c6b270a02692b353d1a8d000e0e0c0003030e2b3c3c1aa4002e0e0e7b0504000428062c3c3c6b02462b1a940069291a7b00020c390037003500330031002f000e0e0c00023e2a1a7b003c6b6502202b353d1a44000e0c0003030e2b3b3c1a5c002e0e0e7b0504000428062c3b3c6b430e0e0e0e0e00000000d401000000000000|@10294,I113,@10295,@2047,I105,I218,I251,@2464,@9864,@10298,@1591,@2388,@809,@10300,@10293,@2403,@951,@2701| 10293:O1|@10302 10294:S32|44415441545950455f52455028292e636f6e7374724465737472756374283229 10295:O1|@10296 10296:D3,36|00802b3b1a21000e0e0c000328061a1b002b3c6b64420e0e000000001c00000000000000|@10297,I106,@739| 10297:S55|44415441545950455f52455028292e636f6e73747244657374727563742832297475706c654465737472756374436f6465283329283129 10298:O1|@10299 10299:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10300:O1|@10301 10301:D3,36|00802b3c1a21000e0e0c000328061a1b002b3c6b64420e0e000000001c00000000000000|@10297,I106,@739| 10302:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10303:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10304:O1|@10305 10305:D21,452|00822b1ac2010e0e0e0c00021abd010e0e0c000207cf2b352c362a35291aa8010e0c00021aa5010e0e0c000203522935293b1a9b010c000303202c361a9501322b1a94010e0c000433332f1a8e010e0e0e0c00042a2a696602232c3628082b6929332c1a72010e0e0e0c00043434301a6a010e0e0e0c00042a2a692704640fd3293c1a5b010c000303202b361a5501312b1a44010e0c000432322e1a3e010e0e0e0c00042a2a69660fcf293d1a31010e0e0c000303202b361a1901312b1a18010e0c000432322e1a12010e0e0e0c00042a2a69660fcc2b3628053269291a08011a09010202c9000e0e0c00032b1a00011aed000e0e0c000303033c02222b1ac7000c00021ac5000e0e0c000203102b3b1add003b3f1adc000e0c000602013b03051ad40002012b3b1ad1000e0e0c00023c1acc001acd000e0e0c00032c2c3b2d2d3b3b3c680828072a692f1aba001abb00020258000c0003293b692b2a69280e2a3b6a2a1a61000e0e0c00021a5d000e0e0c00021a5500020232000e0e0c0002030c291a8a000e0e0e0c000202012922143c1a7f000c000329221522111a3c00020209000e0c00042b2a69270f6602013b440e0e0e0e0e0e00000000bc01000000000000|@10307,I105,I218,I113,@1965,@10283,@10304,I251,@10308,@739,@10263,I48,I154,@1591,@9864,@10306,@2047,@809,@10270,@2464,I239| 10306:O1|@10309 10307:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707231283329 10308:O2|8,0 10309:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10310:O1|@10311 10311:D17,244|00822c1af2000e0e0e0c00021aed000e0e0c000203cd2c352d362a363d31306a291adc001add000e0e0c00032b1ad8001ad9000e0e0c000303033c02222b1ab7000c00021ab5000e0e0c000203102b3b1ab5003b3f1ab8000e0c000602013b03051ab00002012b3b1aad000e0e0c00023c1aa8001aa9000e0e0c00032c2c3b2d2d3b3b3c680828072a692f1a96001a97000c0003293b692b2a69280e2a3b6a2a1a55000e0e0c00021a51000e0e0c00021a49000e0e0c0002030c291a6e000e0e0e0c000202012922133c1a63000c000329220f22141a5c000e0c00042b2a69271102013b440e0e0e00000000ec00000000000000|@10313,I105,I218,@739,@10263,I48,I251,I154,@1591,@9864,@10312,@2047,@809,@10270,@2464,I239,@10310| 10312:O1|@10314 10313:S60|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963726561746552657072283229 10314:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10315:D21,404|00832c1a92010e0e0e0c00021a8d010e0e0c000207d42c352d362a35291a78010e0c00021a75010e0e0c0002032929352c362a3f1a69010e0e0c000303082807342c336b0205280634326a29342c1a53010c0004660fd0293c1a4c010e0c000303152b36280633316a29332c1a35010e0e0c0004650fce293d1a2c010e0c000303152b36280633316a29332c1a15010e0e0c00046502ce2b363c3b341a0d010e0e0c0004291a08010e0c00023c2b336a291a00011a01010e0e0c00032d1afc001ae5000e0e0c000303033c02262d1ac7000c00021ac5000e0e0c000203142d3b1ad9003b3f1ad800020297000e0c000602013b03051acc0002012d3b1ac9000e0e0c00023c1ac4001ac5000e0e0c00032c2c3b2d2d3b3b3c680828072a692f1ab2001ab30002023c000c0003293b692b2a69280e2a3b6a2a1a5d000e0e0c00021a590002021e000e0e0c00021a4d000e0e0c0002030c291a82000e0e0e0c0002020129270e323c1a76000e0e0e0c000329332e331a6d000e0e0c00052b2a69270602013b1f040e0e000000008c01000000000000|@10317,I105,I218,I232,@10283,I251,I11,I47,@739,@10263,I48,I154,@1591,@9864,@10316,@2047,@809,@10270,@2464,I239,@10260| 10316:O1|@10318 10317:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707232283329 10318:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10319:O1|@10320 10320:D7,124|00853036293b1a77000c00032936313532362b220c34341a6a000e0e0e0c0005313532363337343a302f2d2f2e2e1a57000c000729352a362a3b1a4f000c0003030332020b322b1a46000e0e0e0c0003293b1a37000c0003030331020b312a1a32000e0e0e0c0003292c69270f1f060e000000007400000000000000|@10322,I253,@10323,@9740,I251,@10329,@10321| 10321:O1|@10331 10322:S48|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429646563436f6e73747273283329 10323:O1|@10324 10324:D7,156|00832e1a9a000e0e0e0c00021a95000e0e0c000203142d1a86000e0e0e0c00021a81000e0e0c000202013b035e2e352f362f3530362c3729353d1a6b000c000303043b5002041a6300103b5029362a373c340e0e0e0c00022b3b2b1a52000e0e0e0c0004502a3b220c1a44000e0c0004503c3b2b316b302f220e220e1a35000e0e0c00052a2a69270a02013b1f040e0e000000009400000000000000|@3711,I105,I218,I251,@10325,I255,@10323| 10325:O4|@35,@863,@10327,@10326 10326:O5|@10328,1035,0,1035,0 10327:S18|646563436f6e733a204e6f74206c6f63616c 10328:S51|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f434f444547454e5f5041525345545245452e736d6c 10329:O1|@10330 10330:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10329| 10331:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10321| 10332:O6|@10333,@2786,@2386,@2577,@2682,@2770 10333:D9,132|00842f2f1a81000e0e0c0003302a30305659566a567b1a73000c0008293b1a6f000c000303041a6b00103b503b50291a66000e0e0e0c00023e2a69332d34341a5a000e0e0e0c000534315677220c220c56a81a4b000c0007293b1a33000c000303032a020b2a2a1a3a000e0e0e0c00032c2a6927071f050e000000007c00000000000000|@10335,@10336,@10338,I251,@10404,@10407,@10412,@10416,@10334| 10334:O1|@10506 10335:S39|545950454944434f444528292e637265617465446174617479706546756e6374696f6e73283529 10336:O1|@10337 10337:D7,172|00812c1aaa000e0e0e0c00021aa5000e0e0c000203812c352d362a3829352937293629353c1a90000e0c000303042937024129353b1a80000e0c000303042936023129363b2a291a66000e0e0e0c00021a61000e0e0c0002031729362b3c1a5b000c0003292b25042504511e253b6502012a66293b1a48000e0c00036603033c02013d300e0c00022c311a37000c00032a2a69270602013b430e0e0e0e0e0e0e00000000a400000000000000|@1785,I105,I218,I251,I106,I113,@10336| 10338:O1|@10339 10339:D5,92|008631311a59000e0e0c0003293b2a1a52000e0e0e0c00021a4d000e0e0c000203282a352b362a2c220d220d31220e220e220e1a36000e0e0e0c00092a2a2505250526031e363b66020129661f070e0e000000005400000000000000|@10341,@2821,I105,I218,@10340| 10340:O1|@10342 10341:S36|545950454944434f444528292e657175616c697479466f72446174617479706573283429 10342:D54,1756|00873235293829352a362c35220e362a07d32c37293629353c1ac4060e0c000303042937024129353b1ab4060e0c000303042936023129363b2a291aa6060e0e0e0c00021aa1060e0e0c0002031729362b3c1a97060c0003292b25042504511e253b6502012a662f37293629353c1a6f060c000303042937024129353b1a60060e0c000303042936023129363b2a291a52060e0e0e0c00021a4d060e0e0c0002031729362b3c1a43060c0003292b25042504511e253b6502012a66291a31061a32060e0e0e0c00032214352215363c28403b1a23060c00041a21062a2c6a2c3c1a09060202b1050e0e0c0003292b2d6a2f3b1aeb050c00030304221902511aff052b69342a1aec050e0c0003312a1af3050c00031af1053032306b220e2a1ad3050c00033c28403b1acd050e0e0c00041ad9052a693c2e693c28403b1ab9050e0e0c000429332d2d6b29222469270a1abe05221a221d6a1aba051abb050c00023e2a1ab7053c6b22132f3333220e222022202220220c34220d1aa4050e0c000c3c2b1a9f052c6b220c1a58050e0c00021a55050e0e0c00021a4d050e0e0c000203c82216351a80052a1a80050e0c0003291a7c051a75050e0e0c0003220c3b1a72050e0e0e0c0003293b2a1a16050e0e0e0c00021a11050e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a3c050e0c00022c1a38051ad9040e0e0c000303033c02222c1acf040c00021acd040e0e0c000203102c3b1a15053b3f1a14050e0c000602013b03051a0c0502012c2a1a09050e0e0c00023d1a04051aa9040e0e0c0003322c3b2d2d3c3b3c680828072a69221e2a6929222e69270c0fd33b220d291a73040c00021a71040e0e0c0002031729362b3c1a67040c0003292b25042504511e223b6502012a652221352222363c28403b1a54040e0c00042b3c1a3f040c00033c28403b1a41040e0e0c00042a3c1a2b040c00031a89042b2e302d306806302a1a21040e0e0c0003221c3c1a0e040e0e0e0c0003222a352d2a1a68040e0c0003293b1a63040c000303041a5f04103b503b50293b1a59040e0e0c00030371293c1a41040e0e0c0003293b1a3b040c000303041a3704103b503b50293b1a31040e0e0c00030325293c1a1904020255030e0e0c00032d2a3b6a64340e0e0e0c000229341a0f040c00036402162c3b1af8030e0c000303041aff03103b503b503d2d6929321aee030e0e0e0c00036502162b3b1ad4030e0c000303041adb03103b503b503d2c693f2a692e3b1a43030c000303051ac703020d1ac2032f1ac2030e0e0e0c0003291abc030e0c00023e2a2d3c6b2227351ab1032a1a61030e0e0c0003291aa8031a55030e0e0c0003220e3b1a52030e0e0e0c0003293b2a1af6020e0e0e0c00021af1020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a1c030e0c00022c1a18031ab9020e0e0c000303033c02222c1aaf020c00021aad020e0e0c000203102c3b1af5023b3f1af4020e0c000602013b03051aec0202012c2a1a21030e0e0c00023d1a1c031a89020e0e0c0003322c3b2d2d3b3b3c680828072a692232351a04032a1aa4020e0c0003291afc021a99020e0e0c0003221b3b1a96020e0e0e0c0003293b2a1a3a020e0e0e0c00021a35020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a60020e0c00022c1a5c021afd010e0e0c000303033c02222c1af3010c00021af1010e0e0c000203102c3b1a39023b3f1a38020e0c000602013b03051a300202012c2a1a65020e0e0c000222231a6b021acc010e0c0003322c3b2d2d3b3b3c680828072a69223a2a69223b3c1aa8010e0c0003222e1a97010c00021a95010e0e0c000203043b5002041a3302103b50222e352935293b1ac6010e0e0e0c0003291a20020e0c0002293b2a1a62010e0e0e0c00021a5d010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a32010e0e0e0c00030304222e0205402a22306a3d22401a27010c00032246351ace012a1a5a010e0e0e0c0003291ac4011a4d010e0e0c0003223c3b1a4a010e0e0e0c0003293b2a1aee000e0e0e0c00021ae9000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a14010e0c00022c1a10011ab1000e0e0c000303033c02222c1aa7000c00021aa5000e0e0c000203102c3b1aed003b3f1aec000e0c000602013b03051ae40002012c2a1ae1000e0e0c0002311a34011a81000e0e0c0003332c3b2d2d3c3b3c680828072a6922122a6929225e6922152a69273d2713022f3b1aac000e0c00023d1a04011a4d000e0e0c00031afd001afe003b2d2d3c3b3c680828072a692d2a6929221469270527061f080e0e0e0e0e00000000d406000000000000|@10344,I251,I105,I218,I106,@10345,@2047,I11,@10348,@10349,@2821,@10353,@10355,@10357,@10364,@10366,@802,@10368,@742,@10386,@389,@10387,I253,@2445,I48,I154,@1591,@2447,@10388,@10390,I107,I234,@2435,I233,@2438,@2433,@10364,@10392,@2388,@10386,@10387,@9864,@10394,@10386,@10396,@10397,@2892,@10399,@10386,@2861,@10401,@10343,@809,@1036| 10343:O1|@10403 10344:S58|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229 10345:O1|@10346 10346:D4,36|00803c28401a20001a21000e0e0c0004291a1c006964420e000000001c00000000000000|@10347,@855,I11,79992| 10347:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322961726754797065732d283129 10348:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10349:D2,28|00801a1b0056172d6a420e0e0e0e0e0e000000001400000000000000|@10351,@10350| 10350:D3,60|008056083d1a38000e0c00032c352d362a56471a2e000e0e0e0c00032c2a3c6a642a0e0e0e0c00023f2a692704420e0e000000003400000000000000|@10352,I106,I107| 10351:S90|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129 10352:S93|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129283129 10353:D8,124|00802b3d1a79000e0e0c0003561956291a71000e0e0c0003293b1a6b000c000303041a6700103b50293b1a63000c00030325293c1a4d000e0e0c00032b2a3c6a6456380e0e0c00022956471a46000e0e0e0c00036402142a3b1a2c000e0c000303041a3300103b503b2b693f2a696642000000007400000000000000|@10354,I106,I107,I234,@2435,I233,@2438,@2433| 10354:S98|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6c6f63616c4172674c6973742d283129 10355:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@10356,I253,I106,I255| 10356:S91|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6d6b41646472283129 10357:D2,36|00802b352c362d37563756481a1900300e0e0e7b07030006000000001c00000000000000|@10359,@10358| 10358:O1|@10360 10359:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283129 10360:D9,316|00842c291a39010e0e0c00021a35010e0e0c0002039229352a362a35293829352937293629353c1a1e010e0e0e0c00030311220e3629353c1a0d010e0e0c00036402013b64031529362936220f3629362b2a1af3000c000327040239293629353b1ae4000e0c00030311220e3629353b1ad5000e0e0c00036402013b64031529362938220f3629382b2a1abf000c0003270402013b270403052a68010207292503511e9f3b6502013b64293b1a99000e0e0c0003030e303529301a93002f0e0e7e0900032935293529362a372c363335343633352b2a1a7b000c00032d2a3b6a642b0e0e0e0c00023f2a69303b69302a691a64002a692c2a69280e2a3b6a2a1a3e000e0e0e0c00021a39000e0e0c00021a31000e0e0c0002030a291a3e0022137d1700022927101f050e0e0e0e0e0e0e000000003401000000000000|@10362,I105,I218,I251,I113,@10361,I107,@809,@2464| 10361:O1|@10363 10362:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283329 10363:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025c2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a23000c000303043b5002041a2b00103b502c36430e00000000a400000000000000|@2402,I251,@10361,@2403,I253,I107,@2401| 10364:O2|@739,@10365 10365:O2|@807,0 10366:O1|@10367 10367:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10366| 10368:O1|@10369 10369:D31,884|008a220c1a71030e0e0c00021a6d030e0e0c000207ca220c35220d362a362b372c382a2211221122111a54030e0c00052c1a44030e0c00021a41030e0e0c0002030d2c35293c1a3b030c00036402013b03c329353d1a2c030e0c0003030c293c3b1a24030e0c0004020628062a3c3b6b293b69291a15030e0e0c00023e2a1a0f033c6b2d353d1afb020c0003030c2d3b3b1af4020e0c0004020628062e3b3b6b1af1021ae6020e0e0e0c00023e2a2c3c6b3c2d1ae2022c6b31353d1ac6020e0e0e0c0003030c313b3b1abc020e0c000402062806323b3b6b1ac1021aae0202027d020e0e0e0c00023e2a2c3c6b220f221d221d221d221d221d221d221d221d221d221d1a9a020e0e0e0c000c3c2e2c2c6b270c0fd0220e1a8a020e0e0e0c00022b353d1a5e020e0e0e0c000303112b37293528051a4d020e0e0c00036402013b03043b5002041a5f02103b502b362c372936291a56020e0e0e0c0002292e1a4f020c00031a4d022a690402002f2b2b1a46020e0e0e0c000450293529221422142214221a221a221a1a31020e0e0c0008220c221c221c221c1a25020e0e0c000529353d1ade010e0e0e0c0003030c293d3b1ad4010e0c0004020628062a3d3b6b221d221e1afd010e0e0c0003293b1af7010c000303041af301103b503b50293b1aed01020274010e0e0c00030325293c1ad1010e0e0c00033b2a3c6a64221e0e0e0c000229221e1aca010e0e0e0c00036402031ac2013f2a69293b69291a6c010e0c00023e2a303c6b22142224222422241aa8010e0c000529353d1a46010e0e0e0c0003030c293d3b1a3c010e0c0004020628062a3d3b6b222522261a65010e0e0c0003293b1a5f010c000303041a5b01103b503b50293b1a55010e0e0c00030325293c1a3d010e0e0c00033c2a3c6a6422260e0e0c00022922261a36010e0e0e0c00036402031a36013f2a69293b69291ad8000e0c00023e2a303c6b293b69322a69291ac5000e0e0c00023e2a22153c6b221e353d1aab000c0003030c221e3b3b1aa3000c000402072806221f3b3b6b1af0001a95000e0e0c00023e2a2c3c6b2221353d1a7c000e0c0003030c22213b3b1a73000c00040207280622223b3b6b1ac4001a65000e0e0c00023e2a2c3c6b3c2a311ab5006b222922372237223722372237223722372237223722371a4f000c000c3c2f2c2c6b2726270602031a8a001f0b0e0e0e0e000000006c03000000000000|@10371,I105,I218,@10372,I251,@2403,@2388,@817,@1169,@809,@10365,@10368,@10374,@10376,@10379,@2251,@10381,@2071,@2428,@10383,I107,I234,@2435,I233,@2438,@740,@10370,@808,@1169,@10365,@809| 10370:O1|@10385 10371:S75|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322970726f63657373436f6e73747273283129 10372:O1|@10373 10373:D12,252|00832e353f1af8000e0c000303382e362f372936293131311ae9000e0e0c000529353d1ada000e0e0e0c0003030e292d3b1ad400320e0e7b050a000428062a2e3b6b270402a42e353d1ab4000e0c0003037e2e362f372a3b1ab1000e0e0c00032a3b1aa7000c00032935322a1aa1000e0e0c0003293b1a9b000c000303041a9700103b503b50293b1a91000e0e0c00030321293c1a79000e0e0c00032d2a3b6a64330e0e0e0c000229331a73000c00036402162c3b1a5c000e0c000303041a6300103b503b503d2d693f2a692707021a2e353c1a2a000e0e0e0c000303043b5002041a4300103b502e361f040e0e0e0e00000000f400000000000000|@2402,I251,@10372,@2403,I253,I107,I234,@2435,I233,@2438,@2433,@2401| 10374:O1|@10375 10375:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@10374| 10376:O4|@35,@863,@10378,@10377 10377:O5|@1964,1515,0,1515,0 10378:S19|4e6f7420612066756e6374696f6e2074797065 10379:O1|@10380 10380:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c0002032d2b352c362a3528061a3f000c000303043b5002041a3700102a362b372a2a692c1a2f000c00022a2a69270602013b420e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2080,@10379| 10381:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@10382,I105,I218,I251| 10382:S41|545950455f5452454528292e636f6e7374727563746f72526573756c74283229676574417267283129 10383:O1|@10384 10384:D12,252|00832e353f1af8000e0c000303382e362f372936293131311ae9000e0e0c000529353d1ada000e0e0e0c0003030e292d3b1ad400320e0e7b050a000428062a2e3b6b270402a42e353d1ab4000e0c0003037e2e362f372a3b1ab1000e0e0c00032a3b1aa7000c00032935322a1aa1000e0e0c0003293b1a9b000c000303041a9700103b503b50293b1a91000e0e0c00030321293c1a79000e0e0c00032d2a3b6a64330e0e0e0c000229331a73000c00036402162c3b1a5c000e0c000303041a6300103b503b503d2d693f2a692707021a2e353c1a2a000e0e0e0c000303043b5002041a4300103b502e361f040e0e0e0e00000000f400000000000000|@2402,I251,@10383,@2403,I253,I107,I234,@2435,I233,@2438,@2433,@2401| 10385:D12,252|00832e353f1af8000e0c000303382e362f372936293131311ae9000e0e0c000529353d1ada000e0e0e0c0003030e292d3b1ad400320e0e7b050a000428062a2e3b6b270402a42e353d1ab4000e0c0003037e2e362f372a3b1ab1000e0e0c00032a3b1aa7000c00032935322a1aa1000e0e0c0003293b1a9b000c000303041a9700103b503b50293b1a91000e0e0c00030321293c1a79000e0e0c00032d2a3b6a64330e0e0e0c000229331a73000c00036402162c3b1a5c000e0c000303041a6300103b503b503d2d693f2a692707021a2e353c1a2a000e0e0e0c000303043b5002041a4300103b502e361f040e0e0e0e00000000f400000000000000|@2402,I251,@10370,@2403,I253,I107,I234,@2435,I233,@2438,@2433,@2401| 10386:S3|65712d 10387:S3|283229 10388:O1|@10389 10389:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10390:D7,180|0080560a561b1aaf000c0003293b1aab000c000303041aa700103b50293b1aa3000c00030369293c1a8d000e0e0c0003293b1a87000c000303041a8300103b50293b1a7f000c00030325293c1a69000e0e0c00032e2a3c6a6456390e0e0c00022956481a62000e0e0e0c00036402142d3b1a48000e0c000303041a4f00103b503b2e692956471a3f000c00036502142c3b1a28000e0c000303041a2f00103b503b2d693f2a69654200000000ac00000000000000|@10391,I107,I234,@2435,I233,@2438,@2433| 10391:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229706f6c79417267732d283129 10392:O1|@10393 10393:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10392| 10394:O1|@10395 10395:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10396:S6|283229285029 10397:O1|@10398 10398:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10399:O1|@10400 10400:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10399| 10401:O1|@10402 10402:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10403:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10404:O4|@35,@863,@10406,@10405 10405:O5|@865,474,0,474,0 10406:S36|6d6b4d757475616c446563733a20656d707479206465636c61726174696f6e206c697374 10407:O1|@10408 10408:D6,92|00802b1a5a000e0e0e0c00021a55000e0e0c000203312b352c362a352b36293528071a43000c000303043b5002041a3b001029363b2c2b6a2d1a34000e0c00022a2a69270702013b420e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,I251,@10409,@10407| 10409:O4|@35,@863,@10411,@10410 10410:O5|@865,478,0,478,0 10411:S53|6d6b4d757475616c446563733a20526563757273697665206465636c61726174696f6e206973206e6f7420612066756e6374696f6e 10412:O1|@10413 10413:D13,284|00832e1a1a010e0e0e0c00021a15010e0e0c000203142d1a06010e0e0e0c00021a01010e0e0c000202013b07cb2e352f362f3530362c362d372e3829352937293529353d1ae1000e0e0c000303043b5002041ad700103b5029362a373c22100e0e0c0002333b1ac7000c000303041ac300103b503b503d34693f2a691ab9001aba000e0e0e0c00023e2a1ab3003c6b220c3b69220c2a692b2a692e2a69280e2a3b6a2a1a7a000e0e0e0c00021a75000e0e0c00021a6d000e0e0c0002030c291a82000e0e0e0c0002020129220c3b220c1a75000e0e0c000450343b221b1a68000e0c0004503c3b220c2c6b22162215221d221d1a560002020d000e0e0e0c00052a2a69271902013b1f040e0e0e0e0e0e000000001401000000000000|@3711,I105,I218,I251,@9699,I234,@3695,@10414,@2388,@7228,@2464,I255,@10412| 10414:O2|@742,@10415 10415:O2|@7227,@951 10416:O1|@10417 10417:D5,92|0085301a5a000e0e0e0c00021a55000e0e0c00020331303531362a352b362c372d38220c220c220c220c220c1a39000e0e0c000a2a33333333331a2f000c00072a2a69270402013b1f060e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,@10418,@10416| 10418:O1|@10419 10419:D16,252|0088303529372a37293629353c1af0000e0c000303042937024129353b1ae0000e0c000303042936023129363b2a291ad2000e0e0e0c00021acd000e0e0c0002031729362b3c1ac3000c0003292b25042504511e253b6502012a66340310220c3333220d1aa9000e0e0c00050233293b1aa1000e0e0c000303033002243b1a97000c00022a1a94001a95000e0e0c0003321a90003b2d2d3c3b3c680828072a69662d3529220c1a7f000c000329353d1a4e000e0e0e0c0003030c293c3b1a6c000e0c0004020628062a3c3b6b2c3b691a5e002a692b2a69291a59000e0e0c00023e2a1a53003c6b3d2a69270e1f090e0e00000000f400000000000000|@10421,I251,I105,I218,I106,@10422,I113,@2447,@10502,@2047,@10504,@10420,@2403,@809,@2388,@9720| 10420:O1|@10505 10421:S52|545950454944434f444528292e637265617465446174617479706546756e6374696f6e732835297365745072696e746572283429 10422:O1|@10423 10423:D65,1956|00832e3529353036303531363c28403b1a95070e0e0c00041a91072a2c6a2c3c1a8d070e0e0c0003292b2d6a3137293629353c1a7e070e0e0e0c000303042937024129353b1a6c070e0c000303042936023129363b2a291a5e070e0e0e0c00021a59070e0e0c0002031729362b3c1a3f070c0003292b25042504511e253b6502012a66291a39071a3a070e0e0e0c00030402002b3b1a30070e0c00030309292f452212465002673c28403b1afa060e0e0e0c00041a15072a34220d6b313c1aef060c0003292b2d6a0402002f2b220c2c1afd060e0e0c00055029353c28403c1ac6060e0e0e0c00041ae9062a693c2c693c28403b1ab1060e0e0c00042922102d2d6b29221d69220c32452a46260d29352a361ac3061ac4060e0c00023e2a1abf063c6b293b69291ab2060e0e0e0c00023e2a1aaf063c6b1aae061a9f060c00023e2a1a9b063c6b293b69291a8e060e0e0e0c00023e2a1a8b063c6b1a8e061a7b060c00023e2a1a87063c6b1a86061a6b060c00023e2a1a77063c6b1a7a061a5b060c00023e2a1a67063c6b3c2c1a6c062c6b3c2f1a65062c6b401a63062b6a3c1a61062b1a61066b293b69291a2d060e0e0c00023e2a1a53063c6b3c220e2b1a46066b3c22142b1a3e066b1a4206291ae6050e0e0e0c00021ae1050e0e0c0002031d29352a362a353d1ac8050e0c00030309292503511e283b02013b6502013c64030b1a0e061a0f060c000202031a03061a0806291aa0050e0c00021a9d050e0e0c0002031d29352a362a353d1a84050e0c00030309292503511e263b02013b6502013c64030b1ad6051acb050c000202031acb051acc05291a5c050e0c00021a59050e0e0c0002031d29352a362a353d1a40050e0c00030309292503511e263b02013b6502013c64030b1a9a051a87050c000202031a8f051a9005291a18050e0c00021a15050e0e0c0002031d29352a362a353d1afc040e0c00030309292503511e263b02013b6502013c64030b1a5e051a43050c000202031a5305291a530569280e2a3c6a2a291acc040e0c00021ac9040e0e0c0002031d29352a362a353d1ab0040e0c00030309292503511e263b02013b6502013c64030b291af9040e0e0c0002020129293b692e2a69280e2a3c6a2a291a81040e0e0c00021a7d040e0e0c0002031d29352a362a353d1a64040e0c00030309292503511e273b02013b6502013c64030b291aad040e0e0c0002020129293b691abf042a69280e2a3c6a2a1a34040e0c00021a31040e0e0c00021a29040e0e0c0002030c291a7a040e0e0e0c0002020129293b69220e2a69280e2a3c6a2a291a00040e0c00021afd030e0e0c0002031d29352a362a353d1ae4030e0c00030309292503511e263b02013b6502013c64030b291a2d040e0e0c0002020129293b6922132a69280e2a3c6a2a291ab4030e0c00021ab1030e0e0c0002031d29352a362a353d1a98030e0c00030309292503511e263b02013b6502013c64030b291ae1030e0e0c0002020129293b691af7032a691af6032a691af5032a691af4032a69280e2a3c6a2a291a58030e0c00021a55030e0e0c0002031d29352a362a353d1a3c030e0c00030309292503511e263b02013b6502013c64030b291a85030e0e0c00020201293c221f2b1aaa036b401aa9032b6a3c1aa7032b1aa7036b3b1aa6030e0e0e0c00023c1aa0031a01030e0e0c00032b1a98033b2d2d3c3d3c680828072a69224b224d22412244225422432f1a80030e0c000822433b1ad6020e0e0e0c000303b41a6f03224e1a6e030e0e0e0c0003224137293b1a64030e0c0003293b2a1a9e020e0e0e0c00021a99020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a30030e0c00022d1a2c031a61020e0e0c000303033c02222d1a57020c00021a55020e0e0c000203102d3b1a09033b3f1a08030e0c000602013b03051a000302012d2a1ad1020e0e0c00023c1af4021a2d020e0e0c0003312c3b2d2d3c3b3c680828072a6927090fcf223f1a05020e0e0c00021a01020e0e0c000203043b5002041ac302103b50223f352935293b1a9e020e0e0e0c0003291ab0020e0c0002293b2a1ace010e0e0e0c00021ac9010e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129651a800222531a57020c0003224637293b1a50020e0c0003293b2a1a8a010e0e0e0c00021a85010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a1c020e0c00022d1a18021a4d010e0e0c000303033c02262d1a43010c00021a4101020211010e0e0c000203102d3b1af1013b3f1af0010e0c000602013b03051ae80102012d2a1ab9010e0e0c00023c1aec011a15010e0e0c0003220d2c3b2d2d3c3b3c680828072a69333b1aec000e0c0003030329020440342b6a1ac401225e1a93010c0003291abc011a89010e0e0c0003225b3b1a82010e0e0e0c0003293b2a1aba000e0e0e0c00021ab5000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a4c010e0c00022c1a48011a7d000e0e0c000303033c02222c1a73000c00021a71000e0e0c000203102c3b1a25013b3f1a24010e0c000602013b03051a1c0102012c2a1aed000e0e0c0002225a1a2b011a48000e0c0003312c3b2d2d3c3b3c680828072a692719274f1f040e0e0e0e000000009c07000000000000|@10425,I11,@10426,I106,I251,I105,I218,@10427,@2047,I113,@10430,@10431,@10443,@10445,@2388,@817,@813,@10446,@10448,@802,@10451,@10452,@742,@10455,@10459,@809,@813,@10461,@10462,@2464,@10463,@10464,@10463,@10464,@10465,@10468,@951,@739,@809,@742,@1358,@809,@739,@10469,@10472,@739,@2447,@10473,@10475,@10476,@2876,@389,I253,@2445,I48,I154,@1591,@10495,@2892,@10497,@2876,@10499,@1805,@2861,@10424| 10424:O1|@10501 10425:S34|545950454944434f444528292e7072696e746572466f724461746174797065283329 10426:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10427:O1|@10428 10428:D4,36|00803c28401a20001a21000e0e0c0004291a1c006964420e000000001c00000000000000|@10429,@855,I11,79992| 10429:S46|545950454944434f444528292e7072696e746572466f72446174617479706528332961726754797065732d283129 10430:D7,244|00802b352c362d372a3b1aeb000c000303041ae700103b503b502a3b1ae1000e0e0c0003038a2a3c1ad9000e0e0c0003293b1ac3000c000303041abf00103b503b50293b1ab9000e0e0c00030325293c1ab1000e0e0c00032d2a2d6a6456590e0e0c00022956681a9e000e0e0e0c00036402322a03192c3b1a7d000e0e0c000303041a8700103b503b503b2d6902162c3b1a64000e0c000303041a6f00103b503b503d2d692956671a5d00327e0800032903182b3b1a40000e0c000303041a4b00103b503b503b2c6902162b3b1a28000e0c000303041a3300103b503b503d2c6966420e0e0e0e0e00000000ec00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10431:O1|@10432 10432:D9,116|00833b2f291a70000e0c00021a6d000e0e0c0002031729362b3c1a63000c0003292b25042504511e233b6502012a65291a51001a52000e0e0e0c0003292f1a4b000c0003312a1a47000c00032b32321a42000e0e0e0c0004302b452a4627051f040e0e0e0e0e0e0e000000006c00000000000000|@10434,I105,I218,I106,@10435,@2047,@10438,@2821,@10433| 10433:O1|@10442 10434:S85|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329 10435:O1|@10436 10436:D1,20|00802b420e0e0e0e000000000c00000000000000|@10437| 10437:S97|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d617028332961726741646472732d283129 10438:O1|@10439 10439:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c000203192c352d361a33002b2f6a2a2f1a2f000c00032a2a69270402013b430e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@10440,@10438| 10440:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3c6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@10441,I107| 10441:S96|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329617267732d283129283129 10442:D5,92|00822d1a5a000e0e0e0c00021a55000e0e0c000203312d352e362e352f362f352b2a1a43000c00032e2a3c6a642b0e0e0e0c00023f2a692e34341a2f000c00042a2a69270802013b440e0e0e0e0e0e0e000000005400000000000000|@1785,I105,I218,I107,@10433| 10443:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@10444,I253,I106,I255| 10444:S81|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b41646472283129 10445:O2|@1713,0 10446:O2|@10447,0 10447:O4|6,@1713,1,1 10448:O2|@1714,@10449 10449:O2|@10450,0 10450:O3|2,40,0 10451:O2|@1714,@2811 10452:O2|@1714,@10453 10453:O2|@10454,0 10454:O3|2,91,0 10455:O2|@10456,0 10456:O4|1,0,1,@10457 10457:O4|6,@10458,1,1 10458:O4|6,@1713,0,1 10459:O4|13,3,@10460,4 10460:O4|6,@10458,0,0 10461:O2|@1358,@10449 10462:O3|14,@10461,1 10463:O2|@742,@10097 10464:O3|14,@10463,1 10465:O2|@1358,@10466 10466:O2|@10467,0 10467:O3|2,41,0 10468:O3|14,@10465,1 10469:O2|@10470,0 10470:O4|1,0,0,@10471 10471:O4|6,@739,4,1 10472:O4|13,0,@993,4 10473:O1|@10474 10474:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10475:S12|706172656e74686573697365 10476:O1|@10477 10477:D40,1060|0086311a22040e0e0e0c00021a1d040e0e0c0002031931352936291a0a040e0e0e0c00021a05040e0e0c00026502013b03043b5002171af703311af7030c00031af5031af6032b1af6036b64103b50313532362a3629352c352d372e382f392b220f1adf030c00032a3b2a1aba030e0e0e0c00021ab5030e0e0c0002033d2a352b362a353b1ac0030e0c0003031e2a363b2a69291a91030e0e0c000203041aab03103b503b50293b696502012b2a2a2505250526031e4b3b66020129653d2f3b6a293b691a89032a69280e2a3c6a2a291a55030e0e0c00021a51030e0e0c0002031d29352a362a353d1a5c030e0c00030309292503511e273b02013b6502013c64030b291a4d030e0e0c0002020129293b69291a42030e0e0e0c00023d313b6a2a3b692a2a691a33032a691a32032a691a31032a69280e2a3c6a2a291ae9020e0e0c00021ae5020e0e0c0002031d29352a362a353d1af0020e0c00030309292503511e273b02013b6502013c64030b291ae1020e0e0c000202012922150303290fd5221e1ae1020e0e0c00022213353d1ab5020e0e0c00030311221337293528051aa4020e0c00036402013b03043b5002041ab702103b502213362214372936291aac020e0c0002292e1aa7020c00031aa5022a690402002f2b2b1a9e020e0e0e0c00045029352219353d1a5a020e0e0e0c0003030c22193d3b1a83020c000402072806221a3d3b6b1a78021a79020e0e0c00023e2a2c3c6b1a7002291a08020e0c00021a05020e0e0c0002031d29352a362a353d1a10020e0c00030309292503511e263b02013b6502013c64030f1a3e021aff010202ec000c000202031a2f022d222d222b222d0e0c00041a25021a16020e0e0e0c00023e2a1a1b023c6b293b692e2a69280e2a3b6a2a1a9a010e0e0e0c00021a95010e0e0c00021a8d010e0e0c0002030c291aaa010e0e0e0c0002020129293b69291ace010e0e0e0c00023e2a333c6b293b69291abc010e0c00023e2a22363c6b293b69220e2a69221c2a69291ab7010c0002293b691ab2012a691ab1012a691ab0012a691a67012a69280e2a3c6a2a291a1f010c00021a1d010e0e0c0002031d29352a362a353d1a28010e0c00030309292503511e253b02013b6502013c64030b291a19010e0e0c0002020129272422181ade000e0e0e0c00021ad9000e0e0c00021ad1000e0e0c0002030329024e2211353d1adc000e0c0003030c22113b3b1a07010c00040207280622123b3b6b1a24011afd000e0e0c00023e2a2c3c6b221b2225222522252225222522251a0a010e0e0e0c00083c2b2f2c6b27041afe00291a6e000e0e0e0c00021a69000e0e0c0002031d29352a362a353d1a74000e0c00030309292503511e283b02013b6502013c64030b1aca001a63000c000202031abf001ac0001a89000e0e0c00023e2a1ab7003c6b3c2a2d2f6b271e1f070e0e0e0e000000001c04000000000000|@10479,I105,I218,@10480,@389,@35,@863,@10481,@10482,I251,@1784,@1358,@2464,@10484,@809,@809,@809,@10486,@10376,@10379,@2251,@10488,@2071,@2403,@9796,@2388,@2801,@2803,@10478,@2840,@10489,@809,@809,@742,@9796,@10476,@10491,@10494,@10478,@2834| 10478:O2|@1597,@734 10479:S59|545950454944434f444528292e7072696e746572466f7244617461747970652833297072696e746572466f72436f6e7374727563746f7273283129 10480:S16|4e6f20636f6e7374727563746f72733a 10481:O5|@2427,1063,0,1063,0 10482:O1|@10483 10483:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025c2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a23000c000303043b5002041a2b00103b502c36430e00000000a400000000000000|@2402,I251,@10482,@2403,I253,I107,@2401| 10484:O1|@10485 10485:D7,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36291a72000e0e0e0c0002293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d09000229270602031a2800420e0e0e000000007c00000000000000|@2263,I105,I218,@10484,I251,@2464,@809| 10486:O1|@10487 10487:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a29000e0e0c00022a2a69270602013b420e0e0e000000003c00000000000000|@1785,I105,I218,@10486| 10488:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@10382,I105,I218,I251| 10489:O1|@10490 10490:D7,132|00802b1a82000e0e0e0c00021a7d000e0e0c0002035b2b352c36291a72000e0e0e0c0002293b692c2a69280e2a3b6a2a291a54000e0c00021a51000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a3100327d09000229270602031a2800420e0e0e000000007c00000000000000|@2263,I105,I218,@10489,I251,@2464,@809| 10491:O2|@1358,@10492 10492:O2|@10493,0 10493:O3|2,@1042,0 10494:O3|14,@10491,1 10495:O1|@10496 10496:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10497:O1|@10498 10498:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a372a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10497| 10499:O1|@10500 10500:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10501:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10502:O1|@10503 10503:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10504:S18|7072696e742d7072696e7464656661756c74 10505:D7,172|00812c353f1aa8000e0c000303342c362d372936292f1a9b000c000329353d1a8e000e0e0e0c0003030e292d3b1a8800320e0e7b0508000428062a2e3b6b2704025c2c353d1a68000e0c000303392c362d372a3b1a65000e0e0c00032a3b1a5b000c00032f3530362b352b2a1a51000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a23000c000303043b5002041a2b00103b502c36430e00000000a400000000000000|@2402,I251,@10420,@2403,I253,I107,@2401| 10506:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10334| 10507:O1|@10508 10508:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a36293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@10507| 10509:O1|@10510 10510:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10509| 10511:O1|@10512 10512:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10511| 10513:O1|@10514 10514:D1,28|00802b352c3629392b2a6966420e0e0e000000001400000000000000|@10515| 10515:S57|434f444547454e5f50415253455452454528292e636f646553657175656e63652834296e657744656275677c6c6f63616c446563732d283129 10516:O1|@10517 10517:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10516| 10518:O1|@10519 10519:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10518| 10520:O1|@10521 10521:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10520| 10522:O1|@10523 10523:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10522| 10524:O1|@10525 10525:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10524| 10526:O1|@10527 10527:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10526| 10528:O1|@10529 10529:D11,244|00842f1af2000e0e0e0c00021aed000e0e0c000203cd2f3530362a36293b1adf000c00032c3a2a3729353d1ad6000e0e0e0c000303043b5002041acb00103b5029362a372d383c220f0c00022c3b2b1aba000e0e0e0c0004502b3b22101aac000e0c0004502c3b1a96000e0e0e0c00032f35280e1a8d000e0e0c000303262f362936293b1a79000e0e0c00032b382a221422143b22152e1a76000e0e0e0c0007270402242f3528081a59000e0e0c000303043b5002041a5b00103b502b221022101a54000e0c00043c3b2c2c6b3422132213221322131a43000c00062a2a69270e02013b1f050e0e00000000ec00000000000000|@1785,I105,I218,I253,I251,@10531,I255,@9747,@10534,@10530,@10528| 10530:O4|@10538,@10546,@10571,@10537 10531:O4|@35,@863,@10533,@10532 10532:O5|@10328,963,0,963,0 10533:S6|6c7641646472 10534:O4|@35,@863,@10536,@10535 10535:O5|@10328,983,0,983,0 10536:S6|636f64654578 10537:O5|5,@10586,@5590,@5447,@690 10538:D11,172|008256093b3b6a293b691aa3005637692a1aa0000e0c00022931312d1a99000e0e0c000556593b3b6a293b691a8d005688692a1a7e000e0e0e0c000229220d220d2d1a73000c0005220e353d1a71000e0e0c00030323220e3629220f220f1a63000c0004293b69291a5d000e0e0c00023e2a343c6b2704020129293b691a4c002a691a4b002a69291a3d000e0e0c00023e2a1a3f003c6b270f440e0e0e0e0e0e00000000a400000000000000|@10540,@10541,@2383,@2385,@10539,I251,@2786,@2388,@7227,@742,@7228| 10539:D4,76|008056073729353c1a45000e0e0c000303043b5002041a3b0010293629353d1a2e000e0e0e0c0003030e293c3b1a2800300e0e7b0505000428062a3c3b6b6542000000004400000000000000|@10545,I251,@10542,@2403| 10540:S26|44415441545950455f52455028292e6d6b45784964656e283329 10541:D4,76|008056073729353c1a45000e0e0c000303043b5002041a3b0010293629353d1a2e000e0e0e0c0003030e293c3b1a2800300e0e7b0505000428062a3c3b6b6542000000004400000000000000|@10543,I251,@10542,@2403| 10542:O4|101,@2083,0,@10544 10543:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b65536f6d652d283129 10544:O5|@2042,508,0,508,0 10545:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b654e6f6e652d283129 10546:O7|@5672,@8969,@10548,@10547,@690,0,0 10547:O3|2,@10569,@10568 10548:O2|1,@10549 10549:O3|2,@5719,@10550 10550:O2|@10551,0 10551:O4|@34,69,@10552,0 10552:O3|2,3,@10553 10553:O6|@874,@850,@10554,@1363,@5681,@848 10554:O2|@894,@10555 10555:O2|@10557,@10556 10556:O2|@10561,@10560 10557:O2|@1223,@10558 10558:O3|0,@10559,@876 10559:O8|@812,@5672,0,0,@2698,0,0,1 10560:O2|@10565,0 10561:O2|@2597,@10562 10562:O3|0,@10563,@876 10563:O8|@10564,@5672,0,0,@2698,0,0,1 10564:O3|14,@1169,1 10565:O2|@1695,@10566 10566:O3|0,@10567,@876 10567:O8|@5699,@5672,0,0,@2698,0,0,1 10568:O5|5,@10570,@5590,@5447,@690 10569:O3|6,@190,79992 10570:O2|@10569,0 10571:O7|@5669,@731,@10572,@10568,@690,0,0 10572:O2|1,@10573 10573:O3|2,@5721,@10574 10574:O2|@10575,0 10575:O4|@34,69,@10576,0 10576:O3|2,2,@10577 10577:O6|@874,@850,@10578,@1363,@5681,@848 10578:O2|@894,@10579 10579:O2|@10581,@10580 10580:O2|@10585,0 10581:O2|@1208,@10582 10582:O3|0,@10583,@876 10583:O8|@10584,@5669,0,0,@2698,0,0,1 10584:O4|13,0,@739,0 10585:O2|@3716,@855 10586:O2|@10587,0 10587:O3|2,@10588,@970 10588:O3|3,@10589,@695 10589:O2|@10590,@1732 10590:O2|49,@7751 10591:O1|@10592 10592:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a36293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@10591| 10593:O1|@10594 10594:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10593| 10595:O1|@10596 10596:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10595| 10597:D4,156|00802b352c36562b35563b36564b37565b39566b3a567a2b2e302f2e1a81000e0e0c000729352a362a3b1a77000c0003030332020b322b1a6e000e0e0e0c0003323533363437220c38220d3a220e2306220f23072f2f2f2f220c303030680804020012150001000200332c121800010003002d121a00010001000e0e0e0c00065029352a362a2a692716420e0e0e0e0e000000009400000000000000|@10599,@9740,I251,@10598| 10598:O1|@10600 10599:S49|434f444547454e5f50415253455452454528292e636f646553657175656e636528342970726f636573735461696c283129 10600:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10598| 10601:O1|@10602 10602:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10601| 10603:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@10604,@7465| 10604:S53|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429636865636b56617273283129283129283129 10605:O1|@10606 10606:D3,52|00811a33002c69291a31000e0e0c00022e2a0e0e0e0c0002643c2a0e0e0c0002513b64430e0e0e0e000000002c00000000000000|@10608,@10607,@2246| 10607:D2,28|00801a1b002a56272e6b420e0e0e0e0e000000001400000000000000|@10610,@10609| 10608:S40|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229 10609:D12,236|008056093528051ae6000e0e0e0c000303ca5609365619382937293629353d1ace000e0e0e0c000365035956271ac4000e0c00022a37293629353d1ab2000e0e0e0c000303043b5002041aab001029362a372a301aa5000e0e0c00031aa1002a690402002c2b2b1a9a000e0e0e0c000450293527072a0e0e0e0c0002642e2a2f7d0600022d03512937293529353d1a5f000c0003033e2936293b1a6b000c0003293b1a67000c00036403252c351a60002a1a60000e0c0003291a5c001a55000e0e0c00036556680e0e0c0002503b02013c6402013c6502013b6502012b420e0e00000000e400000000000000|@10612,I251,@2246,@2248,@2251,@10613,@2071,I253,I234,@10614,@389,@10611| 10610:S53|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129 10611:S25|29206f7574736964652069747320646566696e6974696f6e2e 10612:S56|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129283129 10613:D4,100|00805607291a60000e0c00021a5d000e0e0c0002032429352a362a352f352a352a2a1a4b000c00036603052a68010207292503511e303b6502013b64293b1a2f000c000303033b0208293529362968016564420e0e0e0e0e000000005c00000000000000|@2255,I105,I218,I251| 10614:S44|54797065206f662065787072657373696f6e20636f6e7461696e73206c6f63616c2064617461747970652028 10615:O1|@10616 10616:D16,468|00822d352e362f372e230d29291ac8010e0c00021ac5010e0e0c0002032429352a362a35291ab8011ab9010e0e0c00036403052a68010207292503511e303b6502013b64293b1a9b010c000303691a9701291a83010c00021a81010e0e0c0002032429352a362a35291a74011a75010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a57010c000303041a5701103b50293529351a41011a42010e0e0e0c000303043b5002041a3f0110293765021a293529351a22011a23010c000303043b5002041a230110293764651a07010c000203033c029b2a3530352a2a1afe000e0e0e0c000303033c024a2a1ae3000c00021ae1000e0e0c00020314291ad2000e0e0e0c00021acd000e0e0c000202013b03212a3b2b3b3f2e1ad2000e0e0e0c00021acd000e0e0c00031ac9000e0e0c000602013b6503392a3630361abb000c0003032a2a3730371aaf000c0003031b2a3830381aa3000c0003030c2a3930391a97000c000302013b02013b02013b02013b03053b316902423b1a81000e0e0c00023e2a1a7b003c6b3d323b6a293b691a73002a692c2a69291a62000e0e0e0c00023e2a1a63003c6b3d2a69293b69220c2211220c6a2a2a69270b66440e0e0e0e0e00000000cc01000000000000|@10617,I105,I218,@102,I251,@2900,@2955,@1840,I223,I239,I154,I113,@2388,@9719,@1551,@9720| 10617:S34|44454255474745525f28292e75706461746544656275674c6f636174696f6e283329 10618:O2|@10620,@10619 10619:O4|3,@10624,@2701,1 10620:D18,540|00842c230d29291a16020e0e0e0c00021a11020e0e0c0002032429352a362a35291a04021a05020e0e0c00036403052a68010207292503511e323b6502013b64293b1ae7010c0003036b1ae301291acf010c00021acd010e0e0c0002032429352a362a35291ac0011ac1010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aa3010c000303041aa301103b503b50293529351a8b011a8c010e0c000303043b5002041a8b01103b50293765021e293529351a6c011a6d010e0e0c000303043b5002041a6b01103b50293764651a4d010e0e0c000203033b0fdd2f3b1a56010e0e0e0c0003293b1a3b010c0003031b3c28403b1a43010c0004296801323b2b1a3b010c0004502a65020229353c2e0c00023c3b2b56676b293b693235333634352b2a1a1c010e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b293b69291a00010e0c00023e2a1afb003c6b2212352213362214352b2a1ae3000c0003220f2a3b6a642b0e0e0c00023f2a693d22193b6a3d22133b6a293b692b2a69280e2a3b6a2a291a8f000c00021a8d000e0e0c0002031d29352a362a353d1a84000e0c00030309292503511e253b02013b6502013c02024e0064030b291a8d000e0e0c0002020129293b69291a82000e0e0e0c00023e2a333c6b3c220f2b1a74006b3d2a69293b69293b1a38000e0c00030304221a020e221a2a1a5c0022230e0e7e260003271f1f05000000001402000000000000|@10622,I105,I218,@102,I251,@2900,@2955,@1840,I253,I11,I255,I107,@9959,@813,@2464,@2388,@809,@10621| 10621:O1|@10623 10622:S29|44454255474745525f28292e627265616b506f696e74436f6465283529 10623:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10621| 10624:O2|@10625,@2703 10625:O2|@10626,1 10626:O3|2,@191,0 10627:O1|@10628 10628:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10627| 10629:O1|@10630 10630:D5,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203322c352d362a390402002b2a1a4c000e0c00035029352a362c030b2e2b69322a452b466402092e2a69322c452a46642706020b1a29002c2a35452a364664430e0e0e0e000000005c00000000000000|@1991,I105,I218,@10629,@1990| 10631:O1|@10632 10632:D7,148|00812c38293b1a8f000c00032e362f372a293528161a84000e0c0003030c2936292502501e133b64022e293528051a6b000c0003030c2937292502501e2b3b6402162935280b1a53000c000303043b5002041a4b0010293764291a47000c00022d2a2d1a42000e0e0e0c0004293b1a2b000c0003030332020b322a1a2e00340e7e0b00032707430e000000008c00000000000000|@10634,I253,I251,@10635,@10638,@10640,@10633| 10633:O1|@10645 10634:S61|434f444547454e5f50415253455452454528292e636f646552656356616c42696e64696e677328332976616c42696e64546f4676616c42696e64283229 10635:O4|@35,@863,@10637,@10636 10636:O5|@10328,1534,0,1534,0 10637:S10|6765744d617463686573 10638:O1|@10639 10639:D7,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a352b362c392d3a3c28401a48001a49000e0e0c00041a45002a2d6a2d3b69292b3b3b6b293130306b321a35000e0e0c00022a2a69270c02013b420e0e0e000000005c00000000000000|@1785,I105,I218,@855,I11,I48,@10638| 10640:O1|@10641 10641:D10,204|00822d1aca000e0e0e0c00021ac5000e0e0c000203a12d352e362a383c28401ab6001ab7000c000428062a1ab2006a3c28401aa3001aa4000e0c000428062a1a9e006a3d2c2b6a2e2a1a98000e0c0003293b1a93000c00031a79000e0e0c00026503041a8600103b503c28403c1a6c000e0c00043c2840321a61000e0e0c00043c28402f1a55000e0e0c00043c28402e1a49000e0e0c00042a220f2d2210302e680633221022101a46000e0e0e0c00042a2a69270d02013b440e0e0e0e0e0e0e00000000c400000000000000|@1785,I105,I218,@855,I11,79992,@2004,I251,@10642,@10640| 10642:O4|@35,@863,@10644,@10643 10643:O5|@10328,1553,0,1553,0 10644:S10|6d6b4656616c42696e64 10645:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10633| 10646:O1|@10647 10647:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10646| 10648:O1|@10649 10649:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10648| 10650:O1|@10651 10651:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10650| 10652:O1|@10653 10653:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10652| 10654:O1|@10655 10655:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10654| 10656:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10221| 10657:O2|@10659,@10658 10658:O3|@10885,@10884,@7438 10659:D26,820|00832c352d362e372f38303a331a28030e0c000234291a23030c00021a21030e0e0c0002033329352a362a37293b1a13030c00032c382a381a0d03220d22132d6b2a2a1a06030e0e0e0c0003502e250826071e3d3b270702013b64220c2e1aef020c0003220d2a2a3b1ae8020e0c00030319293b1add020e0e0c000303043b5002041ad302103b503b02732a352b362b1aa9020e0e0c00021aa5020e0e0c000203043b5002041ab302103b502b352c362c37293b1a8d020e0e0c0003293729353d1a90020e0c000303043b5002041a8f02103b5029362a372a3b311a86020e0e0e0c000450293b22131a78020e0c000450302f250b250b26091e923b270965220e2e1a63020c0003220f2a2d32220d220d2f220c22152218220c220f12170001000100221b1a44020e0c000f22102d2a3b1a20020e0c00030319293b1a15020e0e0c000303043b5002041a2302103b503b02732a352b362b1ae1010e0e0c00021add010e0e0c000203043b5002041a0302103b502b352c362c37293b1ac5010e0e0c0003293729353d1ac8010e0c000303043b5002041ac701103b5029362a372a3b311abe010e0e0e0c000450293b22161ab0010e0c000450302f250b250b26091e923b270965220f3522103622113722123922133a342b2e302f2e1a99010e0e0c000729352a362213230d29291a4b010c00021a49010e0e0c0002032429352a362a35291a74011a49010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a2b010c0003036b1a4f01291a07010c00021a05010e0e0c0002032429352a362a35291a30011a05010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ae7000c000303041a0f01103b503b50293529351afb001ad0000e0c000303043b5002041af700103b50293765021e293529351adc001ab1000e0e0c000303043b5002041ad700103b5029376465033d220e1acd000e0e0c000250220e291a71000e0e0c00021a6d000e0e0c0002031929352a362a22171aac000e0c000350292503511e263b6502013b6402013b333b1a57000c000303041a8f00103b503b50331a8a000e0e0e0c00023e2a69292e69221a2a452e4627181f040e0e0e0e000000002c03000000000000|@10661,@10662,I105,I218,I253,@10664,@10605,@10666,I251,@5286,@5286,@10668,I255,@10671,@10680,@5286,@5286,@9740,@103,@2900,@2955,@1840,@10866,@10660,@10404,@10407| 10660:O1|@10880 10661:S38|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329 10662:O1|@10663 10663:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a37293b1a2f000c00032b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,I253,@10662| 10664:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@10665,@7465| 10665:S53|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329636865636b56617273283129283129 10666:O1|@10667 10667:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203182c363d2d0e0e0e0c00022a2e1a23000c00032a2a696602013b43000000003400000000000000|@1785,I105,I218,@10666| 10668:O4|@35,@863,@10670,@10669 10669:O5|@10328,1150,0,1150,0 10670:S15|73657456616c756541646472657373 10671:O1|@10672 10672:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@10673,@10671| 10673:O1|@10674 10674:D6,68|00812c37293b1a3f000c000329381a3b002f690402002b2b2b1a34000e0c0004502936291a2d000e0e0c0002291a2800330e0e0e7d0b0002000000003c00000000000000|@10676,I253,@10677,@2071,@2377,@10675| 10675:O1|@10679 10676:S48|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329676574506f6c79283129 10677:D4,172|00805607291aa8000e0c00021aa5000e0e0c0002038629352a362a3829353c1a96000e0e0e0c00030367293629291a7f000c00021a7d000e0e0c0002032829352a362a352935220c352a2a1a6a000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a4b000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e00000000a400000000000000|@10678,I105,I218,I251| 10678:S41|545950454944434f444528292e547970655661724d61702e6d61705479706556617273283129283129 10679:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a36293f1a4f000c0003293b1a4b000c0003641a3c000e0c000264030f291a3d000e0e0c00022b2a6964020a291a2e002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I243,I251,@10675| 10680:O1|@10681 10681:D66,2708|008d220f1a910a0e0e0c00021a8d0a0e0e0c0002032b220e1a7d0a0e0e0c00021a790a0e0e0c00020314220d1a690a0e0e0c00021a650a0e0e0c000202013b02013b07cc220f352210362a35293b1a4f0a0c00032c37293b1a450a0e0e0c000329352f39293b1a370a0c0003313a293b1a2d0a0e0e0c000333363438221b35221c36221c35221d36221d341a160a0e0e0e0c00033b2e291afe090e0e0e0c00021af9090e0e0c0002031729362b3c1af7090c0003292b25042504511e253b6502012a65301ad1090e0e0c00021acd090e0e0c000203043b5002041acf09103b50303529352935291ac6090e0e0e0c0002341ac0092a1aa0090e0c00021a9d090e0e0c000203482a352b362b1a8a09020272090e0e0e0c00021a81090e0e0c0002030d2b36293b1a8f090c00036402013b030d2a36291a84090e0c00026402012b2a2a2505250526031e543b66020129652223230d29291a3f090c00021a3d090e0e0c0002032429352a362a35291a50091a45090e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a27090c0003036b1a2b09291afb080c00021af9080e0e0c0002032429352a362a35291a0c091a01090e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ae3080c000303041aeb08103b503b50293529351ad7081acc080e0c000303043b5002041ad308103b50293765021e293529351ab8081aad080e0e0c000303043b5002041ab308103b502937646503051aab08023e3b2a291a6b080c00021a69080e0e0c0002031729362b3c1a67080c0003292b25042504511e223b6502012a65293c1a7c080e0c00036403051a76080201293b2a291a2d080e0e0c00021a29080e0e0c0002031729362b3c1a27080c0003292b25042504511e243b6502012a650402002b1afe070e0e0e0c00021af9070e0e0c0002030d2b36293b1a07080c00036402013b030a2b352a2a453b4651020b1a15082a2a35452a36465129352a3629341ad0070e0c0003301a00080e0c0002292b2a1aae070e0e0e0c00021aa9070e0e0c0002031c2a352b362a2c1aa5070e0e0c00032a2a2505250526031e2a3b660201296522173c1ac6070e0e0e0c000307cd293c1ab9070e0e0c000303cb321ab2072a2a1a7d070e0e0c000303033c02a42a1a4f070c00021a4d070e0e0c00020392291a3e070e0e0e0c00021a39070e0e0c0002037b2a352b362b352c362c2b2a2a1a3f070c000303033c024f2a1a13070c00021a11070e0e0c0002033d291a02070e0e0e0c00021afd060e0e0c000203262a352b362b352c362c2b1a05070e0e0c0003030d2b2a2506250626041e4e3b02013b270402013b02013b65030d2b2a2506250626041ea53b02013b270402013b02013b65030e2d3c1ac70602020b000c000302013b02013b02013b221522191ae4060e0c00033b220c2211341adb060c00053b2a291a7a060e0e0e0c00021a75060e0e0c0002031729362b3c1a73060c0003292b25042504511e253b6502012a65222e35222f363c28403b1aa0060e0c00041a9d062a2c6a2c3c1a45060e0e0c0003292b2d6a22213c1a72060e0e0e0c000303b52f341a7d060e0e0c000334220f1a72060e0e0e0c000329221a1a66060e0e0e0c0003293c1a43060c0003031d2b3b1a55060e0e0c000303041a4f06103b503b503b2c693f2a69640269293b1a40060e0c000303041a3b06103b503b501a37062c692a2a1a34060e0c0003280e2a3b6a2a291aaa050e0e0e0c00021aa5050e0e0c0002031d29352a362a353d1ab0050e0c00030309292503511e283b02013b6502013c64030b291af5050e0e0c000202012966660261220d22181a72050e0e0e0c000322142a321ad9050e0e0c0004280e2a3b6a2a291a46050e0e0e0c00021a41050e0e0c0002031d29352a362a353d1a4c050e0c00030309292503511e283b02013b6502013c64030b291a91050e0e0c0002020129663c28403c1a5d050e0e0c00041a81052a69220d3c1a7d050e0e0c0003291a78056928282a69221e2a69661a6f050c000222143c1a1e050e0e0e0c00031acd040e0e0c00021a5905302b221f220f6805221d2a1a2f050c000322232a1a46050e0e0e0c0003223b3b2a1a9d040e0e0c00021a99040e0e0c0002031c2a352b362a2c2f1a24050e0c00042a2a2505250526031e293b6602012965293b1a8b040c000303032a020b2a2a1a02050e0e0e0c00033c2a693c28403b1aaa040e0e0e0c000429220d342d6b29224069223f3522403922412307221a03033b021d2241224122463b2249220c22172216221a221e221e1abd040e0e0c000c1ab9042223221722192217221d224522452222221a220d221d221b221b221222102250681129222c2214223c2236223532221a220c22191a86040e0e0e0c000b3b221c291ac9030e0e0c00021ac5030e0e0c0002031729362b3c1ac3030c0003292b25042504511e243b6502012a652922201ae7030c00036403043b5002041a4204103b502f1a87030c00021a85030e0e0c000203043b5002041a2b04103b50313b1a73030c0003291a20040e0c0002293b2a1a5a030e0e0e0c00021a55030e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652e3b1a4e030e0e0e0c0003030329020b292f1ade030e0e0e0c0003293b1a33030c000303032d0204402a2f6a221c3b1a09030e0e0c0003293b2a1af6020e0e0e0c00021af1020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a8c030e0c0002221a3b1ac6020e0e0e0c0003221b3b1aba020e0e0e0c0003293b1ab7020c0003221d3b2b1a65030e0e0c000450221b1a5e031aaf020c000303033c0226221b1a82020e0e0e0c00021a7d020e0e0c00020310221b3b1a38033b3f1a37030c000602013b03051a30030202221b2d1a2c030e0c000222281a27030c0002322c3b2d2d3c342237680828072a6922401a34020e0c00021a31020e0e0c00021a29020e0e0c00020304225802282258352259363c28403b1a69020e0e0c00041ae5022a2c6a2c3c1a0d020e0e0c0003292b2d6a2705224e37293b1af2010e0e0e0c0003293729353d1afc010e0c000303043b5002041ab302103b5029362a372a3b22461a89020e0e0c000450293b22601a7c020e0c0004502233032d22443069225322472246226422642264226422642264226422642264226422641a70020e0c000f2a2a69650fd50402002f22441a610222412d224a2265220d224a224422431a53020c000c50293522481a58010e0c00021a55010e0e0c00021a4d010e0e0c00020303290fd03b2249291a38010e0c00021a35010e0e0c0002031729362b3c1a33010c0003292b25042504511e233b6502012a6522451a00021a15010e0e0c00033237293b1a05010e0e0c0003293b2a1af2000e0e0e0c00021aed000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a88010e0c00022d1a88011ad9000e0e0c000303033c02262d1aab0002028f000c00021aa5000e0e0c000203102d3b1a61013b3f1a60010e0c000602013b03051a7c0102012d2a1a79010e0e0c0002301a74011aed00020215000e0e0c0003322c3b2d2d3b3b3c680828072a69270a22473c1a62000e0e0e0c000329346922492c692258224c224b226922692269226922692269226922692269226922691a0e010e0e0e0c000f2a2a692c2a692708275402013b1f0e0e000000008c0a000000000000|@10683,I105,I218,I253,@389,I106,@10684,@10687,@741,I251,@10689,@102,@2900,@2955,@1840,@741,I233,@741,@7886,@10708,I113,@737,@10710,@10712,I11,@10726,I107,I234,@3695,I232,@10727,@10730,@2047,@2464,@10732,@10736,@510,@4701,@371,@10738,@2821,@10742,@10748,@10750,@10758,@10765,@10829,@2892,@2895,@10832,@2445,I255,I48,I154,@1591,@10834,@10836,@10838,@10668,@10680,@10839,@10842,@10154,@1591,@9864,@10682| 10682:O1|@10865 10683:S52|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329 10684:O4|@35,@863,@10686,@10685 10685:O5|@10328,1205,0,1205,0 10686:S23|6261646c7920666f726d65642070617273652074726565 10687:O1|@10688 10688:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a1a32000e0e0e0c00022a1a2c000e0c00022a2a69270402013b420e0e0e000000003c00000000000000|@1785,I105,I218,@10689,@10687| 10689:O1|@10690 10690:D17,964|00802b350a1e003e003e0043000101e101d5013e003e003e003e00b0003e003e00c9018b0022023e003e0068006e013e003e00f5003e003e0021033e003e003e003e003e001a80030fcc2b362937293b1a79030e0e0c0003291a74030e0c00021a71030e0e0c0002293b6927040fca2b36293b1a56030e0e0e0c0003291a50030e0c00021a4d030e0e0c0002293b69660fdc2b362937293b1a31030e0e0c0003291a2c030e0c00021a29030e0e0c0002293b6927040fdc2b3629291a1a030e0e0e0c00021a0d030e0e0c000203043b5002041a07031029352a36293b1a01030e0e0c000303042a350207292503511e343b661aef022d0e0e7d0400022b36291ae2022d0e7d0400022b362936291ad8022a1ac402020299020e0c00021ab5020e0e0c0002034a2a352b362b1aaa020e0e0e0c00021a9d02020276020e0e0c0002030d2b36293b1a97020c00036402013b030d2a35291a8c020e0c00026402012b2a2a2505250526031e583b66020341022927040fd82b362935293b1a62020e0e0e0c000303041a6302103b5029291a470202021c020c00021a39020e0e0c000203043b5002041a47021029352a36293b1a2d020e0e0c000303042a350207292503511e353b661a1b022e0e0e7d0500022b36291a0e022d0e7d0400022b37291a02022d0e7d0400022b3629362a37291af2010e0e0e0c0002291adc010e0c00021ad1010e0e0c0002030d2936293b1acf010c00036402013b030a2b1ac601300e7d0700022927040fca2b37293b1a9c010e0c00032929353e1aa5010e0e0c0003033529372929353b1a9501020262010e0e0c00030304293702122936293b1a6b010c0003292503511e233b65641a64010e0c0002640223293528061a62010e0e0e0c000303132936293b1a3f010c00032502501e5e3b6402013b6403051a5401028329293528051a36010e0e0e0c0003032a29382937293629353d1a22010e0e0e0c000303043b5002041a2b0110293729250526041e323b27040248293528061afd000e0e0c000303182936293b1adb000202bc000c0003292503511e593b65022229353e1ad8000e0c000303043b5002041ae700102936291ae400300e0e0e7d070002646502892b37293b1a9d000e0e0c000329293528051aa4000e0c0003032a29382937293629353d1a92000e0e0e0c000303043b5002041a9b0010293729250526041e303b27040244293528061a6d000e0e0c000303142936293b1a4b000c0003292503511e533b65022229353e1a4c000e0c000303043b5002041a5b00102936291a5c00300e0e0e7d07000266420e0e0e0e0e0e00000000bc03000000000000|@10692,@741,I253,@10693,I218,I105,@3506,I251,@10689,@741,@10696,@3506,@741,@10699,@10702,@10705,@10691| 10691:O1|@10707 10692:S33|434f444547454e5f50415253455452454528292e7475706c655769647468283129 10693:O11|@10694,@71,@769,@2189,@2199,@2207,@777,@36,@75,@73,@31 10694:D3,572|00802b1a3a020e0e0e0c000229353f1a32020e0e0e0c000307d5293629293b1a22020e0e0e0c000303033b023d29352a362a37293629353c1a09020e0e0c00036403182936293612090001000a002a1af2010e0e0e0c00036502013b6403033c0207292503511e493b65640306562868010fcc29293b1acb010c000303033b023529352a362a37293629353c1ab5010e0e0c00036403102936293656872a1aa3010c00036502013b6403033c0207292503511e3e3b65640306562968010fd029293b1a7f010c000303033b023929352a362a37293629353c1a69010e0e0c000364031429362936568f2a1a57010202f4000c00036502013b6403033c0207292503511e423b65640306562a680102a129293b1a2f010c000303033b023929352a362a37293629353c1a19010e0e0c000364031429362936568e2a1a070102026f000c00036502013b6403033c0207292503511e423b65640306562b6801025129293b1adf000c000303033b023929352a362a37293629353c1ac9000e0e0c000364031429362936568d2a1ab70002021f000c00036502013b6403033c0207292503511e423b65640306562c680102013b293b1a8f000c000303033b022529352937293629353c1a7b000c0003640311293629362956871a6b00340e0e7e0a00033b65650248293528051a58000e0c0003033a29362a382a3b1a49000e0e0c000303262937293629353c1a38000e0c0003640311293629362956771a2700330e0e7e0900033b6402013b6502013b64420e000000003402000000000000|@10695,@1955,I251| 10695:S27|545950455f5452454528292e6973466c6f6174696e675074283129 10696:O4|@35,@863,@10698,@10697 10697:O5|@10328,178,0,178,0 10698:S26|7475706c6557696474683a20656d707479206c6f63616c646563 10699:O4|@35,@863,@10701,@10700 10700:O5|@1964,97,0,97,0 10701:S33|74634571756976616c656e743a204e6f74206120747970652066756e6374696f6e 10702:O4|@35,@863,@10704,@10703 10703:O5|@1964,2978,0,2978,0 10704:S26|656e7472794e756d626572202d206e6f742061207265636f7264 10705:O1|@10706 10706:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203252b352c362a36291a38000e0c00021a2d000e0e0c00022b1a2c000e0c00022a2a69270502013b420e0e0e000000004400000000000000|@1785,I105,I218,@10693,@10705| 10707:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203252b352c362a36291a38000e0c00021a2d000e0e0c00022b1a2c000e0c00022a2a69270502013b420e0e0e000000004400000000000000|@1785,I105,I218,@10693,@10691| 10708:O1|@10709 10709:D5,108|00802b1a6a000e0e0e0c00021a65000e0e0c000203412b352c363b2b291a50000e0c00021a4d000e0e0c0002031729362b3c1a43000c0003292b25042504511e233b6502012a652a1a31000e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000006400000000000000|@1785,I105,I218,I106,@10708| 10710:O1|@10711 10711:D9,172|00812c1aaa000e0e0e0c00021aa5000e0e0c000203812c352d362a3529352c362d372e38323c1a8f000c000303222c1a7e000e0e0e0c00021a79000e0e0c000203043b5002041a7300103b502c3502133c28401a6a001a6b000c000428192e2b2e6b643c28401a5f001a58000e0c00043c28401a52001a4b000c00042e2c2c2c3131680632220e1a42000e0e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e00000000a400000000000000|@1785,I105,I218,I113,@2229,@855,I11,@1965,@10710| 10712:O1|@10713 10713:D12,172|00832d1aaa000e0e0e0c00021aa5000e0e0c0002032e2d352e36303b1a99000e0e0c000303032a020b2a311a8e000e0e0e0c0003292b31311a8500320e0e0e7b060900052c1a7c001a7d000e0e0c00032c3c1a77000c0003031c293b1a59000e0e0c000303032f020b2f2a1a62002e0e7e0700030223291a5a000e0e0e0c0002293b1a33000c0003030330020b302a1a46002f0e7e08000364641f040e0e0e0e00000000a400000000000000|@10715,I105,I218,I251,@10716,@10712,@10718,@2047,I113,@10721,@10723,@10714| 10714:O1|@10725 10715:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229 10716:O1|@10717 10717:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10716| 10718:O1|@10719 10719:D1,20|00803c420e0e0e0e000000000c00000000000000|@10720| 10720:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229706f6c795061726d732d283129 10721:O1|@10722 10722:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10721| 10723:O1|@10724 10724:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@10723,@741| 10725:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10714| 10726:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10727:O4|@35,@863,@10729,@10728 10728:O5|@10328,127,0,127,0 10729:S10|6d6b4172675475706c65 10730:D4,52|00802b56171a30000e0c0003293b1a2b000c000303041a2700103b503b2a693f2a6965420e0e0e0e000000002c00000000000000|@10731,I106,I234,@3695| 10731:S36|434f444547454e5f50415253455452454528292e6d6b4172675475706c65283229283129 10732:O1|@10733 10733:D15,380|00822d1a7a010e0e0e0c00021a75010e0e0c000207ca2d352e362d2f1a69010e0e0c00033b2c291a56010e0e0e0c00021a51010e0e0c0002031729362b3c1a4b010c0003292b25042504511e253b6502012a652a2a1a30010e0c00033b2e291a1e010e0e0e0c00021a19010e0e0c0002031729362b3c1a13010c0003292b25042504511e253b6502012a65293c1a00010e0c0003031d2a3b1af9000e0e0c000303041af300103b503b503b2b693f2a6964026d293b1ae4000e0c000303041adf00103b503b501adb002b692a2a1ad8000e0c0003280e2a3b6a2a291aa200020289000e0e0e0c00021a99000e0e0c0002031d29352a362a353d1ab0000e0c00030309292503511e2c3b02013b6502013c64030b291a99000e0e0c0002020129663b30291a5a000e0e0e0c00021a55000e0e0c0002031729362b3c1a4f000c0003292b25042504511e253b6502012a65342a1a38000e0c0003302a220d1a55000e0e0c00042c2a69270a02013b440e0e0e000000007401000000000000|@10735,I105,I218,I107,I106,I113,I234,@3695,I232,@10727,@10734,@2047,I251,@2464,@10732| 10734:D4,52|00802b56171a30000e0c0003293b1a2b000c000303041a2700103b503b2a693f2a6965420e0e0e0e000000002c00000000000000|@10731,I106,I234,@3695| 10735:S71|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296172674c6973742d6d616b6541726773283229 10736:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@10737,I253,I106,I255| 10737:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329666e4d6b41646472283129 10738:D2,36|00801a23005617562856392f565a6806420e0e0e0e0e0e0e000000001c00000000000000|@10740,@10739| 10739:D3,84|0080560a561b1a4f000c00032956291a4a000e0e0e0c00032956381a3e000e0e0e0c00032e352f362a56671a2e000e0e0e0c00032c2a3c6a642a0e0e0e0c00023f2a692706420e0e000000004c00000000000000|@10741,I106,I107| 10740:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129 10741:S67|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129283129 10742:O1|@10743 10743:D5,228|00822d2d2a1ae0000e0c00021add000e0e0c000203bb2a352b362f291ac9000e0e0c00021ac5000e0e0c0002032429352a362a3529352f352a2a1ab3000c00036603052a68010207292503511e313b6502013b64293b1a97000c00031a8d000e0e0c00026403033c024b2b291a79000e0e0c00021a75000e0e0c0002032429352a362a3529352f352a2a1a63000c00036603052a68010207292503511e313b6502013b64293b1a47000c00031a3d000e0e0c00026403032b02092a1a360069292d69642a2a2505250526031ec73b6602012965440e0e0e0e00000000dc00000000000000|@10745,I105,I218,I251,@10744| 10744:O1|@10746 10745:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229 10746:D2,20|00801a1300420e0e000000000c00000000000000|@10747,@2770| 10747:S87|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229636865636b506f6c796d6f72706869736d283229283129 10748:O1|@10749 10749:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10748| 10750:O1|@10751 10751:D17,588|008a220c1a49020e0e0c00021a45020e0e0c0002033b341a36020e0e0e0c00021a31020e0e0c00020324331a22020e0e0e0c00021a1d020e0e0c0002030d3335293b1a13020c00036402013b02013b02013b0370220c35220d36220d35220e36220e362d37293b1af2010e0e0e0c0003293729353d1ae0010e0c000303043b5002041adb01103b5029362a372a3b321ad2010e0e0e0c000450293b22141ac4010e0c000450313030221622162216221622162216221622161aad0122170e0e7b0d17000c220c1a87010c00021a85010e0e0c0002032b341a76010e0e0e0c00021a71010e0e0c00020314331a62010e0e0e0c00021a5d010e0e0c000202013b02013b07ce220c35220d36220d35220e36220e35220f362a220e220e1a4e010e0e0e0c0004220c3b1a32010e0e0e0c0003220d3b1a26010e0e0e0c0003293c1a2f010c0003220f3b2b1a19010e0e0c000450221235220f2a1a1a010e0e0e0c0003293b1a13010c000303041a0f01103b503b50293b1a09010e0e0c00030325293c1af1000e0e0c0003332a3b6a6422100e0e0c00022922101aea000e0e0e0c0003640216323b1ad0000e0c000303041ad700103b503b503d33693f2a69220d37293b1a98000e0c0003293729353d1a8800020268000e0c000303043b5002041a7f00103b5029362a372a3b220d1a75000e0e0c000450293b221b1a68000e0c000450220c1a86000e0e0e0c00023e2a313c6b3c3b220f2c6b292220692215221422132c22232223222322232223222322231a350022240e0e7b0d24000c321f0b0e000000004402000000000000|@10753,I105,I218,I251,I253,@10668,I255,@10750,@10752,I106,I107,I234,@2435,I233,@2438,@2433,@2388| 10752:O1|@10754 10753:S73|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296372656174654170706c69636174696f6e73283429 10754:D6,148|00822d1a92000e0e0e0c00021a8d000e0e0c0002036d2d352e362e291a79000e0e0c00021a75000e0e0c0002032429352a362a3529352f352a2a1a63000c00036603052a68010207292503511e313b6502013b64293b1a47000c000303041a4300103b503b5029352936302a0e0c00022d33331a32000e0e0e0c00042a2a69270702013b440e0e0e000000008c00000000000000|@1785,I105,I218,I251,@10755,@10752| 10755:O4|@35,@863,@10757,@10756 10756:O5|@10328,1367,0,1367,0 10757:S31|6372656174654d6174636865733a204d697373696e67207479706520766172 10758:D14,324|0080120100010010002c12030001000b0012040001000a0012050001000c0012060001000e001a1f010c000729352a3612040001000a0012050001000b0012060001000c0012070001000d002d12090001000e003b120b0001000f006808564d565e566f3b2d569c0e0c00062c3b1adb000c00030303290204402d2b6a56673c1acd000e0e0c000303032902a3566b3c1ac1000e0e0c0003567a568a1ab5000e0e0c0003293b1aaf000c000303041aab00103b503b50293b1aa5000e0e0c00030325293c1a8d000e0e0c00032b2a3c6a6456990e0e0c00022956a81a86000e0e0e0c00036402162a3b1a6c000e0c000303041a7300103b503b503b2b693f2a6904020056b71a64002b1a64000e0c00045029352a36291a5b000c0002502a2a69312a2f1a520022130e0e0e7b051100042706420e0e0e0e0e000000003c01000000000000|@10760,@9740,I251,I113,I107,I234,@2435,I233,@2438,@2433,@10761,@3770,I47,@10759| 10759:O1|@10764 10760:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329636f6465426f6479283129 10761:O1|@10762 10762:D1,20|00803c420e0e0e0e000000000c00000000000000|@10763| 10763:S32|434f44455452454528292e6d6b536574436f6e7461696e65722d283329283129 10764:D3,172|00822d3528051aa7000c000303232d362e372a2f2f1a9c000e0c00042a30301a92000e0e0e0c000428052b2b6a2704026a2d35280b1a78000e0c000303032d025a2d35401a69000e0e0c000303152d362e37292f2f1a5c000e0c0004402c2b6a6602382d353c1a47000c000303272d362e372f382a30301a3a000e0e0e0c00042a31311a2e000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e00000000a400000000000000|@3786,I251,@10759| 10765:O4|@10767,@10818,@10822,@10766 10766:O4|3,@10826,@2701,1 10767:D50,2732|00892c230d29291aa60a0e0e0e0c00021aa10a0e0e0c0002032429352a362a35291a940a1a950a0e0e0c00036403052a68010207292503511e323b6502013b64293b1a770a0c0003036b1a730a291a5f0a0c00021a5d0a0e0e0c0002032429352a362a35291a500a1a510a0e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a330a0c000303041a330a103b503b50293529351a1b0a1a1c0a0e0c000303043b5002041a1b0a103b50293765021e293529351afc091afd090e0e0c000303043b5002041afb09103b50293764651add090e0e0c0002030a2e220c2c0e0e7d0c00023330693d2a3b6a293b693b1ad6090e0e0e0c00023e2a1acf093c6b3c310c00023c3b2b2d6b293b69220c35220d36220e352b2a1ab6090e0e0e0c00032f2a3b6a642b0e0e0e0c00023f2a69291aa10969291a90090e0c00023e2a1a97093c6b3c22130e0e0e0c00023c3b2b2d6b293b692217352218362219352b2a1a6e090e0e0e0c000322112a3b6a642b0e0e0c00023f2a69291a610969291a48090e0c00023e2a1a4f093c6b3c221e0e0e0e0c00023c3b2b2d6b293b692222352223362224352b2a1a26090e0e0e0c0003221c2a3b6a642b0e0e0c00023f2a69291a1d0969291a00090e0c00023e2a1a07093c6b3c22290e0e0e0c00023c3b2b2d6b293b69222d35222e36222f352b2a1ade080e0e0e0c000322272a3b6a642b0e0e0c00023f2a69291ad90869291ab8080e0c00023e2a1abf083c6b3c22340e0e0e0c00023c3b2b2d6b293b69223835223936223a352b2a1a96080e0e0e0c000322322a3b6a642b0e0e0c00023f2a69223d35223e36223f352b2a1a73080c0003222c2a3b6a642b0e0e0c00023f2a692242352243362244352b2a1a53080c000322262a3b6a642b0e0e0c00023f2a692247352248362249352b2a1a33080c000322202a3b6a642b0e0e0c00023f2a69224c35224d36224e352b2a1a13080c0003221a2a3b6a642b0e0e0c00023f2a69293b692f2a69220c2a6922122a69280e2a3c6a2a1ac6070e0e0e0c00021ac1070e0e0c00021ab9070e0e0c0002030c291ae6070e0e0e0c0002020129293b691adb072a69221c2a69291aad070e0e0c00023e2a1acb073c6b3d2a69293b69293b1a86070e0e0e0c000303042226020a22262a1ab0070e0c0003293b1a6b070c000303042232020a22322a1a9c070e0c0003293b1a53070c00030304223e020a223e2a1a88070e0c0003293b1a3b070c00030304224a020a224a2a1a74070e0c0003293b1a23070c000303042256020a22562a1a60070e0c000322643522653622663722662c0e0c0002293b69226d2a69280e2a3c6a2a291ae3060c00021ae1060e0e0c0002031d29352a362a353d1ad8060e0c00030309292503511e253b02013b6502013c64030b291aed060e0e0c00020201290402002a353d1aac060e0c0003030d1af3062b692a3b452a4651021f3c226b0e0e0e0c00021ae1062a226f6a3c3b2c2f6b293b692d2a452c46260529352a363d2275227222756b2933692b220c2b6a2271352272362273352b2a1a70060e0c0003226b2a3b6a642b0e0e0c00023f2a693d303b6a293b691a93062a692c2a69291a42060e0e0e0c00023e2a1a83063c6b227c35227d36227e352b2a1a2f060c000322762a3b6a642b0e0e0c00023f2a69228122140e0e0c0002293b691a56062a692c2a69291afd050e0e0c00023e2a1a47063c6b2287352288362289352b2a1aeb050c000322812a3b6a642b0e0e0c00023f2a693d228f3b6a293b691a1e062a692c2a69291abd050e0e0c00023e2a1a0f063c6b3c22910e0e0e0c00023c3b2b129300010003006b293b692295352296362297352b2a1a94050e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b229b35229c36229d352b2a1a6d050e0e0c0003220c2a3b6a642b0e0e0c00023f2a6922991a4c050e0c00023e2a2c3c6b3c311a9e052c6b3d2228693d221e693d221469293b692b2a692d2a693d3069293b69293b1a0c050e0c000303042216020a22162a1a70050e0c0003293b1af3040c000303032c020b2c2a1a5e050e0e0e0c0003293b1adb040c000303042240020a22402a1a48050e0c000322ae3522af3622b0352b2a1ad2040e0e0e0c0003229d2a3b6a642b0e0e0c00023f2a6922b33522b43622b5352b2a1aaf040c000322ad2a3b6a642b0e0e0c00023f2a692e3b691ad7042a692b2a69291a86040e0e0e0c00023e2a1aeb043c6b3d2a6922be3522bf3622c0352b2a1a70040e0c000322a22a3b6a642b0e0e0c00023f2a6922c33522c43622c5352b2a1a4f040c000322bd2a3b6a642b0e0e0c00023f2a692e3b691a7f042a692b2a69291a26040e0e0e0c00023e2a1a8b043c6b3d2a6922ce3522cf3622d0352b2a1a10040e0c000322a72a3b6a642b0e0e0c00023f2a6922d33522d43622d5352b2a1aef030c000322cd2a3b6a642b0e0e0c00023f2a692e3b691a27042a692b2a69291ac6030e0e0e0c00023e2a1a2b043c6b3d2a6922de3522df3622e0352b2a1ab0030e0c000322ac2a3b6a642b0e0e0c00023f2a6922e33522e43622e5352b2a1a8f030c000322dd2a3b6a642b0e0e0c00023f2a692e3b691a93032a692b2a69291a66030e0e0e0c00023e2a1acb033c6b3d2a69293b6922112a6922222a6922332a693c22f10e0c00023c3b2b1aae036b293b693c22f40c00023c3b2b12f600010002006b293b6922f83522f93622fa352b2a1a1c030e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b22fe3513ff0036130001352b2a1af3020c0003220c2a3b6a642b0e0e0c00023f2a6922fc1ad4020e0c00023e2a2c3c6b1305013513060136130701352b2a1ac2020e0e0e0c000322162a3b6a642b0e0e0c00023f2a69293b69291a9e020e0e0e0c00023e2a323c6b3c22101aed022c6b3d2a69293b69221e3b1a6f020c0003030329020b29221f1ae9020e0e0c0003293b1a57020c000303042219020a22192a1ad4020e0c0003293b1a3f020c00030304221d020a221d2a1ac0020e0c00031313013513140136131501352b2a1a33020c000322242a3b6a642b0e0e0c00023f2a69280b2a692f3b1a00020e0c0003030329020440302b6a22a91322010e0e0e0c000228052a2c6a3c131b010c00023c3b2b2d6b293b69131f013513200136132101352b2a1adb010c00032f2a3b6a642b0e0e0e0c00023f2a690402001326012b132a011a38022d132a01132901133201132f011a2c020e0c000a5029352a360402002b2b132a011329012d1a18020e0c00065029353c1328010e0e0c00023c3b2b122a01010001006b293b69132c0135132d0136132e01352b2a1a65010e0e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b1332013513330136133401352b2a1a3a010e0e0e0c0003220c2a3b6a642b0e0e0c00023f2a691330011a17010c00023e2a2c3c6b3c311a6a012c6b3d2a69293b69293b1aed000e0e0c000303042210020a22102a1a7c010e0c0003293b1ad3000c000303042214020a22142a1a68010e0c0003224c3b1aba000e0e0e0c0003030329020b29224d1a51010e0e0c0003293b1a9f000c000303042220020a22202a1a3c010e0c0003293b1a87000c000303042292020a22922a1a28010e0c0003293b1a6f000c0003030422de020a22de2a1a14010e0c00031342013513430136134401352b2a1a63000c000322292a3b6a642b0e0e0c00023f2a692e3b1a34000e0c00030303290204402f2b6a1943011f0a0e0e0e0e0e0e00000000a40a000000000000|@10769,I105,I218,@102,I251,@2900,@2955,@1840,@2388,@9719,I107,@10770,@2701,@10771,@10772,@10773,@2464,@1497,@9720,@10775,@10777,@10779,@10781,@10783,@10785,@10786,@1515,@9720,@1533,@9720,@1551,@9720,@809,@10787,@10789,@10791,@9720,@3454,@10793,@10795,@10797,@10799,@10802,@9703,@10807,@10809,@10811,@10813,@10815,@10768| 10768:O1|@10817 10769:S35|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029 10770:O2|@1515,0 10771:O2|@1533,0 10772:O2|@1551,0 10773:O2|@10774,0 10774:O3|2,5,0 10775:O1|@10776 10776:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10775| 10777:O1|@10778 10778:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10777| 10779:O1|@10780 10780:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10779| 10781:O1|@10782 10782:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10781| 10783:O1|@10784 10784:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10783| 10785:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 10786:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 10787:O1|@10788 10788:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10787| 10789:O1|@10790 10790:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10789| 10791:O1|@10792 10792:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10791| 10793:O1|@10794 10794:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10793| 10795:O1|@10796 10796:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10795| 10797:O1|@10798 10798:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10797| 10799:O1|@10800 10800:D1,20|00823b2e2e2e6b44000000000c00000000000000|@10801| 10801:S57|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e7472792834292d45 10802:O1|@10803 10803:D7,204|008833353436220c37312c0e0e0c0002293b69220e2a69280e2a3c6a2a291aaf000c00021aad000e0e0c0002031d29352a362a353d1aa0000e0c00030309292503511e253b02013b6502013c64030b291a89000e0e0c00020201290402002a353d1a74000e0c0003030d1a73002b692a3b452a4651021f3c220e0e0e0e0c00021a61002a22116a3c3b2c2f6b293b692d2a452c46260529352a36220e220e221522150e0e0e0c00042933692b220c2b6a22142e452a46270e1f090e0e0e0e0e0e00000000c400000000000000|@10805,I105,I218,I251,@2464,@10806,@10804| 10804:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 10805:S55|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e747279283429 10806:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 10807:O1|@10808 10808:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10807| 10809:O1|@10810 10810:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10809| 10811:O1|@10812 10812:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10811| 10813:O1|@10814 10814:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10813| 10815:O1|@10816 10816:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10815| 10817:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10768| 10818:O4|3,@10819,@2701,1 10819:O2|@10820,@2703 10820:O2|@10821,1 10821:O3|2,@192,0 10822:O4|3,@10823,@2701,1 10823:O2|@10824,@2703 10824:O2|@10825,1 10825:O3|2,@193,0 10826:O2|@10827,@2703 10827:O2|@10828,1 10828:O3|2,@194,0 10829:O4|@35,@863,@10831,@10830 10830:O5|@10328,1424,0,1424,0 10831:S23|417267756d656e74206c656e6774682070726f626c656d 10832:O1|@10833 10833:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10832| 10834:O1|@10835 10835:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c362a353f1a40000e0c000303043b5002041a3700102a362a1a34000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2449,@10834| 10836:O1|@10837 10837:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3b692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10836| 10838:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10839:O1|@10840 10840:D1,20|00803b420e0e0e0e000000000c00000000000000|@10841| 10841:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296261736546756e2d283129 10842:O1|@10843 10843:D26,532|008a321a12020e0e0e0c00021a0d020e0e0c000207d032353336220e35220f363c28403b1af9010e0e0c00041af5012a2c6a2c3c1af1010e0e0c0003292b2d6a22131ae7011ae8010e0c00031ae5012214332e6b0402002c2c2c220c2d2217221722172217221722171acc010e0c000c5029352a36313b1ac2010e0e0e0c0003293b2a1a92010e0e0e0c00021a8d010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a8c010e0c0002301a88011a89010e0e0c000303033c0226301a4b010c00021a49010e0e0c00020314303b1a65013b3f1a680102023d000e0c000602013b03051a5c010201302a1a59010e0e0c00023c1a54011a55010e0e0c0003302c3b2d2d3b220c3c680828072a69221d2a453b46271502da303c1afe000e0e0e0c0003220d35220e3632352b2a1a23010c00032d2a3b6a642b0e0e0e0c00023f2a691a1201220c22146a342a1a00010e0c0003221422130e0c0002220c3c1afa000e0e0e0c000303292a3b1acd000e0e0c0003030329020b292b1ae2000e0e0e0c00033e2a2f220f6b22132a453b4665025e2a1acd000e0e0c0002293b1a9b000c000303032a020b2a2a1aba000e0e0e0c00033e2a303c6b3b3b3b22122d6805293b6922111aa3001a84000e0c0003280e2a3b6a2b3b1a62000e0e0e0c00030303290204402c2b6a22192a453c46270827091f0b0e0e0e0e0e0e0e000000000c02000000000000|@10845,I105,I218,I11,@10846,I106,@10847,@389,@10848,@10842,I253,@2445,I48,I251,I154,@1591,@9864,@10854,@2047,I107,@10856,I113,@10858,@10860,@10862,@10844| 10844:O1|@10864 10845:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429 10846:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 10847:S3|283129 10848:D10,204|00802b352c362a56391ac4000e0c00033b2a3c6a642a0e0e0e0c00023f2a6956481ab0000e0c00021aad000e0e0c00020311564836293b1aa2000e0e0e0c00036402013b030c5648352a2a69293b696502473b5658291a7b000c00021a79000e0e0c0002031729362b3c1a73000c0003292b25042504511e223b6502012a651a62002b692a2a1a5f000c00032956881a5a000e0e0e0c0003663056670e0c0002293b1a37000c000303032a020b2a2a1a3e00330e7e0900032706420e0e0e0e0e00000000c400000000000000|@10850,I107,I105,I218,I251,I106,@10851,@2047,@2251,@10849| 10849:O1|@10853 10850:S75|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e732834296e6578745061726d73283129 10851:D1,28|0080280656172d3b6b420e0e0e0e0e0e000000001400000000000000|@10852| 10852:S43|434f444547454e5f50415253455452454528292e6c6f61644172677346726f6d5475706c65283229283129 10853:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10849| 10854:O1|@10855 10855:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10856:D2,60|00805608355618365627352b2a1a30000e0c00032f2a3c6a642b0e0e0e0c00023f2a69293c692705420e0e0e0e0e0e0e000000003400000000000000|@10857,I107| 10857:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429706f6c795061726d732d283129 10858:O1|@10859 10859:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10858| 10860:O1|@10861 10861:D5,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203142b352c36291a2a000e0e0e0c00022b2a696602031a1f00420e0e000000003400000000000000|@2036,I105,I218,@10860,@4047| 10862:O1|@10863 10863:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10862| 10864:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@3895,@1713| 10865:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 10866:O1|@10867 10867:D6,100|00800402002c2a1a5e000e0e0e0c00035029352a362a3b2a1a51000e0e0c00021a4d000e0e0c0002031c2a352b362a2c2f1a40000e0c00042a2a2505250526031e293b6602012965030a2a1a2a002f0e7d0600023b66420e000000005c00000000000000|@10869,@10870,I105,I218,@10868,@10866| 10868:O1|@10872 10869:S59|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129 10870:O1|@10871 10871:D7,164|00812c1aa2000e0e0e0c00021a9d000e0e0c000203762c352d362a3a291a88000e0c00021a85000e0e0c0002033129352935293b1a79000e0e0c0003293b1a73000c000303152b36293b1a63000c0003293b1a5f000c00036502013b6602013b0402002c2a1a50000e0c00035029352a362c030b2f2b69332a452b466402092f2a69332c452a46642707020b1a2d002c2a35452a36466443000000009c00000000000000|@1991,I105,I218,I253,I251,@10870,@1990| 10872:D9,172|00822d3a291aa8000e0c00021aa5000e0e0c00020381293529352a37293b1a97000c00030402002a2a331a8f000c00045029352a362a1a77000c00021a75000e0e0c00021a6d000e0e0c000203033402422a1a6b000c00022f3b1a5b000c0003293b1a5f000c000303032a020b2a2a1a56000e0e0e0c0003313b2b1a4e000e0e0e0c000450303b2e1a41000e0e0c0004503c66270702012d64440e0e0e0e0e0e00000000a400000000000000|@10874,I105,I218,I253,@10875,@10877,I251,@10873,I255| 10873:O1|@10879 10874:S68|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129757064617465283229 10875:O1|@10876 10876:D9,228|00822d1ae2000e0e0e0c00021add000e0e0c000203b62d352e362a362e291ac7000c00021ac5000e0e0c0002036d29352a362a35292e1ab7000c000303033c024a291aa3000c00021aa1000e0e0c000203142d1a92000e0e0e0c00021a8d000e0e0c000202013b0321293b2f3b3f321a82000e0e0e0c00021a7d000e0e0c00031a79000e0e0c000602013b6403033c0207292503511e783b6502013b640402002c2a321a5a000e0e0e0c00045029352a362c030b2f2b69342a452b466402092f2a69342c452a46642707020b1a35002d2a35452a3646644400000000dc00000000000000|@1991,I105,I218,I251,I223,I239,I154,@10875,@1990| 10877:O1|@10878 10878:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@10877| 10879:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10873| 10880:D13,228|00812c3a291ae0000e0c00021add000e0e0c0002033129352935293b1ad1000e0e0c0003293b1acb000c000303152b36293b1abb000c0003293b1ab7000c00036502013b6602013b6403852c352d3929293b1a9f000c000303051a9b00021b29352a362a353b1a8b000c000303042a360207292503511e263b65641a7e002c1a7e000e0e0e0c0003291a78001a71000e0e0c0003291a70001a71000e0e0c0003291a6c000e0c00023b3e3b3b2d6805291a35000e0e0c000203041a5700103b503b3b2b316b34230c2a2a220d7d0e00023b430e0e0e0e0e0e00000000dc00000000000000|@10882,I105,I218,I253,I251,@6406,@10883,@389,@10881,@6184,@6187,@6603,@1784| 10881:S26|2920686173206e6f74206265656e207265666572656e6365642e 10882:S46|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c7565283229 10883:S18|56616c7565206964656e7469666965722028 10884:O5|@11216,@10658,@7438,@10218,@11215 10885:D38,1180|00842b352c362d372e3a3b33291a90040e0c00021a8d040e0e0c0002031729362b3c1a83040c0003292b25042504511e233b6502012a652d230d29291a61040e0e0c00021a5d040e0e0c0002032429352a362a35291a54041a55040e0e0c00036403052a68010207292503511e313b6502013b64293b1a37040c0003036b1a3304291a1b040c00021a19040e0e0c0002032429352a362a35291a10041a11040e0e0c00036403052a68010207292503511e2f3b6502013b64293b1af3030c000303041af303103b503b50293529351adb031adc030e0c000303043b5002041adb03103b50293765021e293529351abc031abd030e0e0c000303043b5002041abb03103b50293764650365333b2a1a90030e0c00021a8d030e0e0c0002031d2a352b362a36292d1a97030c00032b2a2506250626041e283b27040201296529291a5e030e0e0e0c00021a59030e0e0c0002031929352a362a321a69030e0e0c000350292503511e273b6502013b6502013b341a2c030e0c00021a29030e0e0c000203043b5002041a3f03103b5034352939040200220d353d1a16030e0e0e0c0003030e1a2703220e692a3b452a4651021e3c300e0e0e0c00021a15032a336a3c3b2c22126b293b692d2a452c46260529352a36322a0e0c000230330e0e0e0c0002313b1aef020c000303033c020b311ae7021ae8020e0c000303041ae302103b503b50313c1aa1020e0e0c00032928403b1ad1020e0e0c0004293b220c1ac9020e0e0c0004501ac402121100010001002213121300010002002f22192f6807220f220f220f220f6b0402002217302217220d2f2f2f1a99020e0e0c00085029352a362907dd221703d22213230d29291a2f020c00021a2d020e0e0c0002032429352a362a35291a6c021a25020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a07020c0003036b1a0302291aeb010c00021ae9010e0e0c0002032429352a362a35291a28021ae1010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ac3010c000303041ac301103b503b50293529351af3011aac010e0c000303043b5002041aab01103b50293765021e293529351ad4011a8d010e0e0c000303043b5002041a8b01103b502937646502013b03192213020216003b221c220f1aad011aae010e0e0e0c000602013b0217221703033b021022133b221c220f1a96011a8f010c00062f3b1a8f010c00033b292b1a8a010e0e0e0c000303033b02b6293c1a1a010e0e0e0c0003322a1a6b010c0003293b1a6b010c00030386221e2c2a1af3000c00021af1000e0e0c000203043b5002041a4f01103b502a352b362b3b1a3f010c000303042a3902162b3c1a39010e0e0c00032a2a2505250526031e3f3b6427042c3c1ab5000e0e0c0003293c1a1b010c00031a19012a1a19010e0e0c0003291a14011a0d010e0e0c0003221d3b2226302d1ada000e0e0e0c0006260602023b502b3c1af5000e0e0c00032503511ec23b6564221c343c34221a2222221f121f0001000200122000010001001ad0000e0c000a293b1a4b000c00030304220e020a220e2a1abc000e0c0003293b1a33000c000303032f0204402a316a27191f050e0e0e000000009404000000000000|@10887,I105,I218,I106,@103,I251,@2900,@2955,@1840,@10888,@10660,@10891,@10893,@10894,I234,16777214,I231,@1868,I11,I255,@10895,@10906,@104,@11190,@7465,@11191,I253,I247,I113,@878,I107,@510,@11192,@389,@11193,I239,@11194,@10886| 10886:O1|@11214 10887:S32|434f444547454e5f50415253455452454528292e636f64654d61746368283529 10888:O1|@10889 10889:D6,428|00812c3528161aa7010c0003030e2c36292d1a9f012e0e0e7e0500032c3528101a8d010e0e0c0003031a2c362d372a2e1a81010e0e0c00032a2a1a7701300e0e7e0700032c3528051a65010e0e0c0003030e2c37292d1a5b012e0e0e7e0500032c3528111a49010e0e0c000303382c37292d2a1a42010e0e0e0c00021a3d010e0e0c0002031c2a352b362a2c1a25010e0e0c00032a2a2505250526031e2a3b66020129660fcb2c353d1a04010e0c0003030e2c362936292e1af9002f7e0600032c35280f1ae9000e0e0c000303392c38292d2a1ae2000e0e0e0c00021add000e0e0c0002031d2a352b362a38292d1ac3000c00032b2a2506250626041e2a3b27040201296602922c3528191aa2000e0e0e0c000303382c36292d2a1a9a000e0e0e0c00021a95000e0e0c0002031c2a352b362a2c1a7d000e0e0c00032a2a2505250526031e2a3b6602012966024b2c35280e1a5b000c0003033e2c362936293b1a5d000e0e0c00032936293b1a4100020226000e0e0c000303033c020f291a37000c00021a35000e0e0c00026403032e0203292f696602012b430e0e0e0e0e0e00000000a401000000000000|@10890,I251,@10888,I105,I218,I253| 10890:S41|434f444547454e5f50415253455452454528292e6765745661726961626c6573496e50617474283229 10891:O4|101,@2083,0,@10892 10892:O5|@10328,324,0,324,0 10893:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 10894:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 10895:D25,612|00802b3b1a61020e0e0c000303033c0214560c3b1a55020e0e0c00032c2a1a4f020c00036403041a4a02103b503b502b3c1a44020e0c0003561c2a1a2e020e0e0e0c0003293c1a2f020c00032e3b1a17020c000303033c0214563c3b1a0d020e0e0c00032f2a1a07020c00036403041a0a02103b503b502e3c1afc010e0c0003564c2a2c1af9010e0e0c0004040300566b322a1aee010e0e0e0c00021ae9010e0e0c000203043b5002041adf01103b502a352b362b3b1ad7010c0003030e2a2e2a35452a36462a3a475102132b3c1ac3010c00032a2a2505250526031e4a50260429352a362b372f3e1aac010e0c000307dc2a3b1aa5010e0e0c000356a83556b83656c83756d83956e83a2e2b2e302f2e1a8c010e0c000729352a360402001a8201220d2b121700010003000e0c00045029351215000100020035121600010002003612170001000200372e2d2d1a57010c000429352a362211302f31301a4b010c0006293b1a47010c000303032b020b2b2a1a3e010e0e0e0c0003293b1a2f010c0003030334020b342a1a2a010e0e0e0c0003121e000100020035121f00010002003612200001000200371221000100020038122200010002003a122300010002002306122400010002000202390023072f2f2f2f220e3030306808040200221f2b2b122a00010001000e0e0c0004502935333b1ab8000e0c0003030329020440342b6a271e02462a3b1a8e000e0e0e0c0003291aa4000e0c000256ba220e1a55000e0e0c0003293b1a3b000c000303041a8b00103b503b503d2a693f2a692c1a80000e0c00023e2a2c3c6b27062709420e0e0e0e0e0e000000005c02000000000000|@10897,I234,I253,I231,@1850,I106,@1879,I255,I105,I218,@878,I113,I107,I232,@10888,@9740,@3716,@10615,@10618,I251,@10898,@10900,@10896,@3695,@2388| 10896:O1|@10902 10897:S56|434f444547454e5f50415253455452454528292e636f64654d61746368283529636f64655061747465726e45787072657373696f6e283129 10898:O1|@10899 10899:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10898| 10900:O1|@10901 10901:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10900| 10902:D9,116|00802b1a72000e0e0e0c00021a6d000e0e0c0002034d2b352c362a3729353d1a5e000e0e0e0c000303043b5002041a5300102936293b1a4f000c0003293b1a4b000c000303041a4700103b503d2a693f2a692e1a3e000e0e0e0c00022a2a69270802013b420e0e0e000000006c00000000000000|@1785,I105,I218,I251,@10903,I253,I234,@3695,@10896| 10903:O4|@35,@863,@10905,@10904 10904:O5|@10328,376,0,376,0 10905:S7|6d616b65417267 10906:O1|@10907 10907:D22,644|00862c353b33291a7e020e0e0e0c00021a79020e0e0c0002031729362b3c1a6f020c0003292b25042504511e253b6502012a651a5e023c220c291a4b020c00021a49020e0e0c0002033f29352a362a362b392e3c1a39020e0e0c00030403002c32322e22122e1a2f020c00075029352a362b372b2b2b6a292f33250d250d250d260a1e493b270a02012b66291a0d020e0e0c000203033c02cf2b230d29291ae7010c00021ae5010e0e0c0002032429352a362a35291ae8011ae9010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1acb010c0003036b1ac701291aa3010c00021aa1010e0e0c0002032429352a362a35291aa4011aa5010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a87010c000303041a8701103b503b50293529351a6f011a70010e0c000303043b5002041a6f01103b50293765021e293529351a50011a51010e0e0c000303043b5002041a4f01103b50293764653c2c1a47010c00030404002c2b1a40013b2d1a3f010c00065029352a362b372c382c2c2c2c6b30031d0404002a2a1a27010c00035029352a362b372c382c2c2c2c6b2705020129293729293b1aed000e0e0c000303033b0285291ac3000c00021ac1000e0e0c000203043b5002041aeb00103b5029353b2a1ae5000e0e0c00036403033c0258291a96000e0e0e0c00021a91000e0e0c000203043b5002041abb00103b5029353b2a1ab9000e0e0c00036403033b0228291a66000e0e0e0c00021a61000e0e0c000203043b5002041a9700103b502936292502501e903b64641a42000e0e0e0c00021a81002216221522172d221768062c22172b22151a71000e0e0c000522122a452c4627101f070e0e000000007c02000000000000|@10909,I105,I218,I106,@10910,@10912,@11086,@102,I251,@2900,@2955,@1840,@11089,@11092,@11095,@11104,@2229,I113,I234,@2232,@11136,@10908| 10908:O1|@11145 10909:S37|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e73283629 10910:O3|0,@10911,0 10911:O1|4 10912:O1|@10913 10913:D43,1532|0085303528161af7050c00030316303631372a32322c32321ae905330e0e0e7b080a0007303528101ad5050e0e0c000303673036313732380403002b34342d342e1ac0050e0c00075029352a362b372f293528051aa9050e0e0c0003030c2937292502501e143b6402202935280e1a8f050c0003031129362936293b1a89050e0e0c00036502031a820564292d69342a452d462c4727090fce303528051a60050e0c00030316303731382a32322c32321a5105330e0e0e7b080a0007303528121a3d050e0e0c0003038130363137323833392c3b1a31050e0e0c0003313532362b3c1a2b050c0003293528053b2b2d3b68053c28403b1a1b050c0004291a18051a19051a1a056b293b692c302b1a14050e0c00041a1105322217220e6b34220e220c2c1a06050e0e0e0c00052b2a22182218220e1af9040e0e0c000622132a35452a36462a374727110fd6303528111aae040e0e0e0c000303653036313732382b3b1aa304020283040c00033c28401ac2041a9f040c000428062a1aba046a293b6928052a1ab4041ab5041ab6046805292e1ab3040c00032c3b692210321a630422123422122f1aa2040e0e0e0c0008220d2a35452a36462a3747270b0fd23035281e1a3a040e0e0e0c0003030e2e302d1a7c042e0e0e7b050800043035281b1a1d040e0e0c0003030e2e302d1a60042e0e0e7b0508000430353d1a02040e0e0e0c000303d5303629352935280e1aef030c000303b629362936293b1ae9030202c9030e0e0c00032b37293b1ad9030e0e0c00032f363039220c382e2d2b1a13040c0004291a10040e0c00021a0d041ab2032f221430221468063136293b1a9f030c0003031c322b221622161af1030e0e0c000522112a35452a36462a3747640246291ade030e0e0e0c00021ad903020259030e0e0c000203202936332a2d22182218311ac5030e0e0c000722122a35452a36462a374765020e221422112a35452a36462a374764270c020c312e2a35452a36462a374764650fd63035280f1a1e030e0e0e0c000307c93037313832392b3b1a13030c000330352a29353e1aff020c0003033129372929353b1af1020e0e0c00030304293702122936293b1ae7020c0003292503511e1f3b65641a38030e0c0002640223293528061ac2020e0e0e0c000303132936293b1abb020c00032502501e583b6402013b640311293c220e2e1a0b031a0c030e0c000602013b2b293528051a89020e0e0c0003032a29382937293629353d1a76020e0e0e0c000303043b5002041adf02103b502937652502501e323b64026b293528061a510202043902d7000c000303132936293b1a47020c00032502501e573b64024629353e1a2d020e0e0c000303043b5002041a9b02103b5029363b2a291a78020e0c00021a75020e0e0c0002031729362b3c1a7f020c0003292b25042504511e233b6502012a6664291a6c021a6d020e0e0c00032f2a2a1a3e020e0e0e0c00021a39020e0e0c0002032d2a352b362a352b382a341a49020e0e0c0003292f2c1a42020e0e0e0c00042d2a2508250826061e3a3b2706020129653c2840301aa8010e0c000428192b2b336b292212221234221222121a810122130e0e7b08130007303528191a6d010e0e0c0003037930363138313629353e1a5a010e0e0e0c000303282936333534372e2c1a4b01220e220e220e1ad2010e0e0e0c00073e2a69332d452a462c472705023a29353f1a24010e0c000303043b5002041aaf01103b50323533372d220c1a0e01220d30220d1a9e010e0e0e0c00073e2a69322d452a462c4727046602d93035280e1ae6000e0e0e0c000303be30362936293b1add000e0e0c00032b37293b1ad1000e0e0c000331382c2b2b1a10010e0c0004291a54010e0c00021a51011aae00220f220f220f68052f36293b1a9b000c0003031c302b221222121aed000e0e0c0005220d2a35452a36462a3747640256291ada000e0e0e0c00021ad5000e0e0c000203202936312a2d22142214311ac5000e0e0c0007220e2a35452a36462a3747650222040300221022122b1a8b000c00045029352a362b37342c6922112a452c462b472705270a020c2f2c2a35452a36462a3747641f060e0e00000000f405000000000000|@10915,I251,@10912,I253,@6741,@2430,I11,@2364,@10916,@740,@9947,@10923,@10925,@10937,@855,79992,@1249,@1247,@690,@2004,@10952,@11020,@11029,@11042,@11044,@11046,I105,I218,@10997,@11058,@7465,@10699,@11059,I106,@11061,@2047,@11064,@11071,@11077,@11079,@11082,@11084,@10914| 10914:D2,52|00800403001a30002d56385649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@11045,@11007| 10915:S28|4d415443485f434f4d50494c455228292e6275696c64416f74283529 10916:O1|@10917 10917:D2,20|00801a1300100e0e000000000c00000000000000|@10919,@10918| 10918:O4|@35,@863,@10921,@10920 10919:S40|4d415443485f434f4d50494c455228292e6275696c64416f74283529657175616c6974792d283129 10920:O5|@10922,561,0,561,0 10921:S15|657175616c697479466f7254797065 10922:S48|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4d415443485f434f4d50494c45522e736d6c 10923:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@10924,@7465| 10924:S40|4d415443485f434f4d50494c455228292e6275696c64416f742835296c697456616c75652d283129 10925:O1|@10926 10926:D15,348|00832e352d3c1a57010c00032a2a1a53011a54010e0c00042a352a2a6929352a366929352a367881352c353d1a3d010e0e0c000303082c362968016402013b293b1a28010e0c000303041a2301103b50293522102a0c00022968016609cb00ff6d293528651a04010e0c000303033b0fcc293528081af4000e0c0003034729371af1002a1af1000e0e0c0003291aec001ae5000e0e0c00032922111ada000e0e0e0c0003291ad8001acd000e0e0c000329301ac3000c00032704220d0e0c0002503b640281293528051aa0000e0c0003032e1aaf00220e1a9e000e0e0e0c0003291aa4001a91000e0e0c0003292d1a87000c000365220c0e0e0c0002503b024629353c1a66000e0e0e0c000303041a7b00103b501a7900220e1a5c000e0c0003291a70001a510002021c000e0e0c0003292d1a43000c000365220c020207000e0e0c0002503b6427081f040e0e0e0e0e000000005401000000000000|@10928,@2430,@10929,@9938,I251,@2309,@10931,@389,@10932,@10927,@10933,@10927,@10934,@10936,@10927| 10927:S4|20746f20 10928:S30|56414c55455f4f505328292e6765744c69746572616c56616c7565283429 10929:O1|@10930 10930:D2,20|00801a1300100e0e000000000c00000000000000|@9935,@9934| 10931:S22|436f6e76657273696f6e20657863657074696f6e2028 10932:S26|2920726169736564207768696c6520636f6e76657274696e6720 10933:S43|4f766572666c6f7720657863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 10934:O4|1,@474,0,@10935 10935:O5|@9736,1327,0,1327,0 10936:S34|457863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 10937:O1|@10938 10938:D4,108|00842d3629353d1a66000e0e0e0c0003031d29362f3530372b3431220c341a53000c00063d2a692c2a2d6a2705022a29353f1a3b000c000303043b5002041a3700102e352f372f3b69332a346a293b693d2a692e2a2f6a2706641f050e0e0e0e000000006400000000000000|@10940,I251,@10941,@10939| 10939:O4|@35,@863,@10951,@10950 10940:S30|4d415443485f434f4d50494c455228292e61646453636f6e737472283529 10941:O1|@10942 10942:D6,116|00842f1a72000e0e0e0c00021a6d000e0e0c000203422f3530362a362b37302a34341a5b000c000503182f3b69292c1a52000e0e0e0c0003342a346a292f696602122b333333331a3e000e0e0e0c00062d2a69642704020b2b3b692f2a2f6a293b69651f050e0e0e000000006c00000000000000|@10944,I105,I218,@10945,@10943,@10941| 10943:O1|@10948 10944:S41|4d415443485f434f4d50494c455228292e61646453636f6e737472283529616464436c697374283129 10945:O1|@10946 10946:D8,236|00832e1aea000e0e0e0c00021ae5000e0e0c000203142d1ad6000e0e0e0c00021ad1000e0e0c000202013b03ad2e352e353d2b3b6a3d2b3b6a293b692b2a69280e2a3b6a2a291aa7000c00021aa5000e0e0c0002031d29352a362a353d1a98000e0c00030309292503511e253b02013b6502013c64030b291a81000e0e0c0002020129293b69291a76000e0e0e0c00023e2a220f3c6b220d230d2a2a3b1a64000e0c00043b2a0e0e0e0c00026429353d1a45000e0e0c0003030829362968016402013b293b1a30000e0c000303041a3700103b502935270e02013b1f040e0e0e00000000e400000000000000|@10947,I105,I218,I251,@2464,@2388,@2360,@2309| 10947:S46|4d415443485f434f4d50494c455228292e61646453636f6e737472283529657175616c5370656369616c73283229 10948:D9,436|00812c3b1ab1010e0e0c000303032b0fd92b3b1aa2010e0e0e0c000303032c0fcb2c1a97010c00021a95010e0e0c000203043b5002041a8b01102c352c1a7c010e0c00021a79010e0e0c000203043b5002041a6f01102c352a2a1a6b010c00036503642c1a55010e0e0c00021a51010e0e0c000203043b5002041a4701102c352d1a38010e0c00021a35010e0e0c000203043b5002041a3301102d362d1a1c010e0c00021a19010e0e0c000203043b5002041a1701102d362a2a1a13010c00032c2a6927040fd42c1af1000e0e0c00021aed000e0e0c000203043b5002041ae300102c352c1ad4000204b800b6000e0e0e0c00021ac9000e0e0c000203043b5002041abf00102c352a2a1ac7000c00036503472c1aa5000e0e0c00021aa1000e0e0c000203043b5002041a9700102c352d1a88000e0c00021a85000e0e0c000203043b5002041a8300102d36292e1a7f000c00032b2a6966024a2b1a5e000e0e0e0c00021a59000e0e0c000203043b5002041a4f00102b352c1a40000e0c00021a3d000e0e0c000203043b5002041a3b00102c362e2a1a3700020207000c00032b2a6966430e0e0e00000000ac01000000000000|@10949,I251,I105,I218,@2229,I113,@2232,@10943,I234| 10949:S24|4d415443485f434f4d50494c455228292e706c7573283229 10950:O5|@10922,351,0,351,0 10951:S36|61646453636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 10952:O1|@10953 10953:D9,100|0086301a62000e0e0e0c00021a5d000e0e0c00020326303531361a53001a54002b34343434343268091a4c003d2b220e220c331a4600347b080c00071a41003030303068051a3c003d2b220c33311a2b00320e7b080a0007000000005c00000000000000|@10955,I105,I218,@10956,@10952,@10961,@10997,@11006,@10954| 10954:O7|@1055,@731,@11009,@10989,@690,0,0 10955:S42|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229 10956:D7,340|00802b3629353f1a4e010e0e0e0c0003036d2c352d372e373b1a40012b6a30373b1a38012b6a040300568e2d56aa56bb56cc2e56e90c00075029352a362b372b2b2b6a2e56d856e956fa121100010005001212000100060012130001000700121400010001000e0e0e0c0008293b692b2a693e2a69220e2a220f6a270f02c029353e1ad3000c000303043b5002041acf00103b502936291aca000e0e0e0c00021ac5000e0e0c000203252936291ab4000e0c00021ab1000e0e0c0002030d2936293b1a93000c00036402013b6402013b6403043b5002041a9200103b50293629352a36293530353137040300568e2f56aa56bb56cc2e56e90e0c00075029352a362b372b2b2b6a3056d856e956fa121100010005001212000100060012130001000700121400010001000e0e0e0c0008293b692b2a693e2a69332a346a270f64420e0e0e0e0e0e0e000000004c01000000000000|@10958,I251,@10911,@10957,I105,I218,@10957| 10957:O4|@35,@863,@10960,@10959 10958:S54|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c6973742832296d6b436f6e73506174283129 10959:O5|@10922,541,0,541,0 10960:S34|6d6b436f6e735061743a206261646c792d666f726d65642070617273652d74726565 10961:O7|@1063,@8969,@10963,@10962,@690,0,0 10962:O3|2,@10990,@10989 10963:O2|1,@10964 10964:O3|2,@1366,@10965 10965:O2|@10966,0 10966:O4|@34,69,@10967,0 10967:O3|2,3,@10968 10968:O6|@874,@850,@10969,@1363,@1270,@848 10969:O2|@894,@10970 10970:O2|@10972,@10971 10971:O2|@10976,@10975 10972:O2|@1208,@10973 10973:O3|0,@10974,@876 10974:O8|@812,@1063,0,0,@2698,0,0,1 10975:O2|@10981,0 10976:O2|@1217,@10977 10977:O3|0,@10978,@876 10978:O8|@10979,@1063,0,0,@1703,0,2,1 10979:O3|10,@1706,@10980 10980:O3|14,@1711,1 10981:O2|@1223,@10982 10982:O3|0,@10983,@876 10983:O8|@10984,@1063,0,0,@1722,0,2,1 10984:O3|10,@10985,@1724 10985:O2|@10987,@10986 10986:O2|@10988,0 10987:O4|1,@922,0,@5699 10988:O4|1,@922,1,@1172 10989:O5|5,@10996,@1249,@1247,@690 10990:O3|3,@10991,@695 10991:O2|@10993,@10992 10992:O2|@10995,0 10993:O2|49,@10994 10994:O3|6,@195,79992 10995:O2|50,@10989 10996:O2|@10994,0 10997:O1|@10998 10998:D5,140|00852d3629353b1a86000e0e0e0c0003032629362a37303531372c220d33220d34220e1a6e000e0e0e0c00073b2a2e6a2c2a2d6a2706024029353f1a52000e0e0e0c000303043b5002041a4b00102e352f372f3b6931373b1a41002b6a64330e0e0c00022a312b220f6b293b693b2a220f6a2f2a306a2707641f060e0e0e0e0e000000008400000000000000|@11000,I251,@11001,@10999,@10911| 10999:O4|@35,@863,@11005,@11004 11000:S29|4d415443485f434f4d50494c455228292e616464436f6e737472283629 11001:O1|@11002 11002:D10,236|0085301aea000e0e0e0c00021ae5000e0e0c000203aa303531362a352b372c382935220c352a2a1ace000e0e0e0c000303033c024a2a1ab7000c00021ab5000e0e0c00020314291aa6000e0e0e0c00021aa1000e0e0c000202013b03212a3b2b3b3f2e1a96000e0e0e0c00021a91000e0e0c00031a8d000e0e0c000602013b650324333b69292d1a7e000e0e0e0c00032c220c0e0e0c00022a220c2b22116b293169270402162c220c220c220c220c220c1a58000e0c00072e2a6964270502192e3b692c373b1a47002b6a642f0c00022a2f2b346b293b69661f060e0e0e0e0e00000000e400000000000000|@11003,I105,I218,I251,I223,I239,I154,@10943,@11001,@10911| 11003:S40|4d415443485f434f4d50494c455228292e616464436f6e737472283629616464436c697374283129 11004:O5|@10922,318,0,318,0 11005:S35|616464436f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 11006:D2,52|00800403001a30002d56385649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@11008,@11007| 11007:O2|30,@6406 11008:S45|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229283129 11009:O2|1,@11010 11010:O3|2,@1364,@11011 11011:O2|@11012,0 11012:O4|@34,69,@11013,0 11013:O3|2,2,@11014 11014:O6|@874,@850,@11015,@1363,@1270,@848 11015:O2|@894,@11016 11016:O2|@11017,@10580 11017:O2|@1695,@11018 11018:O3|0,@11019,@876 11019:O8|@10584,@1055,0,0,@2698,0,0,1 11020:O1|@11021 11021:D7,148|00822c352d362e372a353c1a8a000e0e0e0c000303142a36291a8000331a80000e0c00043c2a696502452a353b1a68000e0c000303192a362b372a1a5e00341a62000e0e0e0c00043b2a2c6a6602202a353e1a43000c000303142a36291a3c00331a44000e0c00043e2a696502012a313b692b2a1a35000e0e0c0003312f452c462a472706440e0e000000008c00000000000000|@11023,I251,@11020,@11024,@11026,@11022,@10943| 11022:O1|@11028 11023:S30|4d415443485f434f4d50494c455228292e61646444656661756c74283229 11024:O1|@11025 11025:D4,100|00822d1a62000e0e0e0c00021a5d000e0e0c0002033d2d352e362a352b362c372d38040300322c2b220d0e0e0e0c00045029352a362b372b2b2b6a31312b316b33221022101a28000e0c00042a2a69270d02013b440e0e0e000000005c00000000000000|@1785,I105,I218,@11024| 11026:O1|@11027 11027:D4,100|00822d1a62000e0e0e0c00021a5d000e0e0c0002033d2d352e362a352b362c372d38040300322c2b220d0e0e0e0c00045029352a362b372b2b2b6a31312b316b33221022101a28000e0c00042a2a69270d02013b440e0e0e000000005c00000000000000|@1785,I105,I218,@11026| 11028:D4,84|00822d1a52000e0e0e0c00021a4d000e0e0c000203292d352e360403002e2c2b320c00045029352a362b372b2b2b6a2e34341a2b000c00042a2a69270802013b440e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,@11022| 11029:O1|@11030 11030:D20,380|00822d352e372f380402002b353e1a6f010c000303112b362928081a62010e0e0e0c00036402013b07d81a57013b1a57010c00032d1a54010e0c0003291a50010e0c00022c353d1a36010e0e0e0c000303452c3629353e1a26010e0e0e0c000303152936291a2c010e0c00021a29010e0e0c00026402013b0311293629352936291a18010e0c0002660209291a0d010e0e0c00026402012c293528061ae1000e0e0c000303043b5002041af3001029362b1ae0000e0c00021add000e0e0c0002030d2b36293b1ab7000c00036402013b030f2b35293528053b2b2d3b680565022a3c28401abd001abe000e0e0e0c000428062a1ab6006a3f2e692b3b2b1ab000020235000e0c0004502a661aa6002a2c6a040200312b2b1a9e000e0e0e0c00045029352c3b69291a92000e0e0e0c0002332c452a46260b02261a840030690402002c2b2b1a71000e0e0c00045029352a36291a6f000c00022e2c452a46260629352a362a331a60000e0c00032a270744000000007401000000000000|@11032,I251,@156,I253,@11033,@11035,I105,I218,@1955,@7513,@855,I11,79992,I255,@11037,@2071,@11038,@11040,@11031,@2004| 11031:O1|@11041 11032:S30|56414c55455f4f505328292e676574506f6c796d6f72706869736d283329 11033:O1|@11034 11034:D8,172|00812c1aaa000e0e0e0c00021aa5000e0e0c000203822c352d362a352b362c37302c1a93000c000303033c024a301a7f000c00021a7d000e0e0c000203142b1a6e000e0e0e0c00021a69000e0e0c000202013b0321303b2d3b3f301a5e000e0e0e0c00021a59000e0e0c00031a55000e0e0c000602013b03112a2a692d321a47000c00032a2a6965020a2c311a3900327e090003270502013b430e0e0e0e0e0e00000000a400000000000000|@7507,I105,I218,I251,I223,I239,I154,@11033| 11035:O1|@11036 11036:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11035| 11037:D2,44|00802b352956281a26000e0e0e0c00036403065607680102013b420e0e0e0e0e000000002400000000000000|@7517,I251| 11038:O1|@11039 11039:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c362a3b3b6a2a1a2e000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@1785,I105,I218,@11038| 11040:D4,172|00805607291aa8000e0c00021aa5000e0e0c0002038629352a362a3829353c1a96000e0e0e0c00030367293629291a7f000c00021a7d000e0e0c0002032829352a362a352935220c352a2a1a6a000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a4b000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e00000000a400000000000000|@10678,I105,I218,I251| 11041:D6,124|00802b1a7a000e0e0e0c00021a75000e0e0c000203512b352c362a352b362936293f1a63000c0003293b1a5f000c0003641a50000e0c00022b36293c1a49000e0e0c0003293b1a43000c0003641a34000e0c00022e2c2b6a301a34000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000007400000000000000|@1785,I105,I218,I243,I251,@11031| 11042:O1|@11043 11043:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11042| 11044:D1,52|008004030056182d5639564a565b2e56770c00075029352a362b372b2b2b6a2704420e0e0e0e0e0e000000002c00000000000000|@11045| 11045:S36|4d415443485f434f4d50494c455228292e6275696c64416f74283529646f417267283129 11046:O1|@11047 11047:D6,156|00832c3629353c1a96000e0e0e0c0003032d29362e352f373237291a86000e0e0e0c00022d2a33220d220d22101a78000e0c00073c2a692e2a2f6a2707024729353f1a5b000c000303043b5002041a5b00102d352e372e3b6930373b1a51002b6a64320e0e0c00023337291a36000e0e0e0c00022c2a2d220f6b293b693c2a69312a326a2709641f040e0e0e0e0e0e0e000000009400000000000000|@11049,I251,@11050,@11053,@11048,@10911| 11048:O4|@35,@863,@11057,@11056 11049:S31|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429 11050:O1|@11051 11051:D6,148|00802b353f1a90000e0c000303512b362c372936291a84000e0c0002291a80000e0c00021a7d000e0e0c0002032c29353d2a3b6a292f3b1a6e000e0e0e0c000429353d1a52000e0e0e0c0003030829362968016402013b6602013b270402282b353c1a33000c0003031c2b3629353d1a26000e0e0e0c0003030829362968016402013b6402013b42000000008c00000000000000|@11052,I251,@11050,I105,I218,@2403| 11052:S30|4d415443485f434f4d50494c455228292e74657374416363657373283129 11053:O1|@11054 11054:D7,204|0085301aca000e0e0e0c00021ac5000e0e0c0002038a303531362a352b362c372d38220c1aa9000e0e0c00021aa5000e0e0c000203142b1a96000e0e0e0c00021a91000e0e0c000202013b0312220c352c352a2a1a81000e0e0c00036502013b0322343b69292e1a72000e0e0e0c00032c220d0e0e0c00022a2f2b2f6b293269270402182d220d220d220d220d220d1a4e000e0e0e0c00072f2a6964270602192e3b692d373b1a3b002b6a642f0c00022a322b306b293b69661f060e0e0e0e0e00000000c400000000000000|@11055,I105,I218,I251,@10943,@11053,@10911| 11055:S42|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429616464436c697374283129 11056:O5|@10922,403,0,403,0 11057:S37|6164644578636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 11058:S31|43616e27742066696e642061206669786564207265636f726420747970652e 11059:O4|@35,@863,@10704,@11060 11060:O5|@1964,2973,0,2973,0 11061:O1|@11062 11062:D2,20|00801a1300420e0e000000000c00000000000000|@11063,@11007| 11063:S37|4d415443485f434f4d50494c455228292e6275696c64416f7428352977696c64732d283129 11064:O1|@11065 11065:D13,276|00812b3528051a0f010c0003032a2b382937293629353d1afe000e0e0e0c000303043b5002041af300102937302a1aef00310e0e7e0800032b3528061ad9000e0e0c000303162b36293b1ad7000c00032e2a1acb002f0e0e7e0600032b353e1ab6000e0e0e0c000303043b5002041ab700102b363b2a293b1a9d000e0e0c000303041aa700103b5029352a362a3529331a85000e0e0c000303033c024a291a8f000c00021a8d000e0e0c00020314321a7e000e0e0e0c00021a79000e0e0c000202013b0321293b343b3f220e1a69000e0e0c00021a65000e0e0c00031a61000e0e0c000602013b03032d02142d3c1a53000c0003292c2506250626041e863b642706430e0e0e0e0e000000000c01000000000000|@11067,I251,@10699,@11064,I253,@11068,@11066,I105,I218,I223,I239,I154,I106| 11066:O4|101,@2083,0,@11070 11067:S26|545950455f5452454528292e656e7472794e756d626572283229 11068:O4|@35,@863,@10704,@11069 11069:O5|@1964,2959,0,2959,0 11070:O5|@1964,2947,0,2947,0 11071:O1|@11072 11072:D6,84|00822c3b1a51000e0e0c000303041a4b00103b503b502c352d362f3b1a41000e0e0c000303052d2a6902192f3c1a34000e0c0003292b301a2e000e0e0e0c00042c2a696565440e0e000000004c00000000000000|@11074,I251,@11073,I113,I107,@11071| 11073:O4|@35,@863,@11076,@11075 11074:S39|4d415443485f434f4d50494c455228292e6275696c64416f742835296d657267656e2833292829 11075:O5|@10922,474,0,474,0 11076:S6|6d657267656e 11077:O1|@11078 11078:D7,140|0085303b1a89000e0e0c000303192f3b1a7d000e0e0c000303043b5002041a7300103b503b025630353136311a69000e0e0c00021a65000e0e0c000203043b5002041a5b00103b50313532360403002d2c3434342e22100e0e0c00075029352a362b372b2b2b6a302f22102210221022101a30000e0c00072a2a69270a1f060e000000008400000000000000|@3980,I251,@3979,I105,I218,@3979,@11077| 11079:O4|@35,@863,@11081,@11080 11080:O5|@10922,448,0,448,0 11081:S31|7061747465726e206973206e6f742061207475706c6520696e20612d6f2d74 11082:O1|@11083 11083:D5,100|0085301a62000e0e0e0c00021a5d000e0e0c0002033d3035313631373b1a50002b6a0403002d2b3434342e22100c00075029352a362b372b2b2b6a30221022102210221022101a2b000c00072a2a69270a02013b1f060e0e000000005c00000000000000|@1785,I105,I218,@10911,@11082| 11084:O1|@11085 11085:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11084| 11086:O1|@11087 11087:D5,276|00802b3629353c1a0e010e0e0e0c0003035d2936293b2a1a02010e0e0e0c00021afd000e0e0c000203412a352b362a362b372d03033c02242a3b1adb000c00031add000e0e0c00021ad5000e0e0c000203033c0207291acb000c00022c2a2507250726051e4e3b270502012966029429353b1aa3000c000303412936293b2a1a9a000e0e0e0c00021a95000e0e0c000203252a352b362a372c03033c020a291a82000e0e0e0c00022b2a2506250626041e323b270402012966024829353e1a57000c0003033c2936293b2a1a4e000e0e0e0c00021a49000e0e0c000203202a352b362b03033c02082a1a38000e0c00022a2a2505250526031e2e3b660201296602013b64420e0e0e000000000c01000000000000|@11088,I251,I105,I218,@11086| 11088:S45|4d415443485f434f4d50494c455228292e636f6e7461696e734e6f6e436f6e7374457863657074696f6e283129 11089:O1|@11090 11090:D4,60|00812c2c1a39000e0e0c000303033b02172c3c1a2e000e0e0e0c0003292d1a27000c00032e2a6965430e0e0e0e0e0e0e000000003400000000000000|@11091,I233,I106,@11089| 11091:S26|4d415443485f434f4d50494c455228292e66726f6d2832292829 11092:O1|@11093 11093:D6,68|00802b35293b1a3f000c000303033b021b291a37000c00021a35000e0e0c000203043b5002041a2b00102935293b691a26003b2b3c6b6642000000003c00000000000000|@11094,I251,I105,I218,@2229,@976| 11094:S47|4d415443485f434f4d50494c455228292e6275696c645061747465726e436f64652833296669726550617474283129 11095:O1|@11096 11096:D14,956|00842f353036313729321ab3030c0003040400333b1aac030e0c000303033c0260332b2a2a1a9c030e0c000303033c024f2a1a93030c00021a91030e0e0c0002033d291a82030e0e0e0c00021a7d030e0e0c000203262a352b362b352c362c2b1a6d030e0e0c0003030d2b2a2506250626041e4f3b02013b270402013b02013b650319333269330e0e0c00022a2a35452a36462a37472a3848510fd42c353f1a22030e0e0e0c0003031a2a3269330e0e0e0c00022a2a35452a36462a37472a3848510fd02c353d1afa020e0e0e0c000303862c36293b2a1aee020e0e0e0c00021ae9020e0e0c000203542a352b362a352b362c372a22131ac6020e0e0e0c0003293b1abf020c000303032f02223d2d2c6a2a220c1abd020e0e0c0003292214696422140e0e0c00022a2a69293369662e2a2509250926071e613b2707020129652c3469220c0c00022a2a3b2f1a89020e0e0c000526040fca2c353c1a66020e0e0e0c000303a22c36293b2a1a5a0202020a020e0e0e0c00021a51020e0e0c0002036b2a352b362a352b372c382b22131a2e020202e6010e0e0e0c0003293b1a23020c000303032f023529341a26020e0e0e0c00030404002d2b221622162d1a1b020c00065029352a362b372c382c2c2c2c6b3c3269292b692922106927092e2a2509250926071e7c3b2707020129652c3469220c0e0c00022a2a3b2f1ad9010e0e0c000526040fcf2c353b1ab6010e0e0e0c000303a22c362d372a3b2a1aa801020258010e0c00021aa1010e0e0c000203692a352b362a352b362c372d382c22151a7c010e0c0003293b1a77010c0003030330023729220d1a79010e0e0c00030404002d2b221822182d1a6f010c00065029352a362b372c382c2c2c2c6b3b32220c6a292b692922116927092f2a250a250a26081e783b2708020129652d220c69220d0e0e0c00022a2a2d301a29010e0e0c0005260502c42c362d36291a08010e0c00021a05010e0e0c000203112936293b1aef000202a3000c00036402013b6403192d36293529220e220e220e301aea000e0e0e0c00062603027f323c1adf000c00033b2b291abe000e0e0e0c00021ab9000e0e0c0002031729362b3c1abf000c0003292b25042504511e253b6502012a65293c1aac000e0c00033b2a1aa7000c000304040022102e2c2c221331341a890022161a94000e0c000a5029352a362b372c382c2c2c2c6b3b2a22156a220c2a453b462d472c48260c5029352a362b372c382b3b1a3b000c0003030331020b312c1a5a000e0e0e0c0003220c2e452a462c472b48270a1f050e0e0e0e0e0e00000000b403000000000000|@11098,@11099,I251,I105,I218,I113,@10943,@11102,@11095,I106,I107,@11119,@11121,@11097| 11097:O1|@11135 11098:S28|4d415443485f434f4d50494c455228292e70617474436f6465283429 11099:O1|@11100 11100:D9,372|00812c3b1a71010e0e0c000303033c020b2b3b1a62010e0e0e0c000303033b0fd02c1a57010c00021a55010e0e0c000203043b5002041a4b01102c352c1a3c010e0c00021a39010e0e0c000203043b5002041a2f01102c352a2a1a2b010c00036503642c1a15010e0e0c00021a11010e0e0c000203043b5002041a0701102c352d1af8000e0c00021af5000e0e0c000203043b5002041af300102d362d1adc000e0c00021ad9000e0e0c000203043b5002041ad700102d362a2a1ad3000c00032c2a69270402992c1ab1000e0e0c00021aad000e0e0c000203043b5002041aa300102c352c1a94000e0c00021a910002026d000e0e0c000203043b5002041a8300102c352a2a1a8b000c00036503292c1a69000e0e0c00021a65000e0e0c000203043b5002041a6300102c36292d1a5f002e0e0e7e0500032b1a40000e0c00021a3d000e0e0c000203043b5002041a3b00102b362d2a1a37002e0e0e7e050003430e0e0e0e0e0e0e000000006c01000000000000|@11101,I251,I105,I218,@2229,I113,@2232,@11099,I234| 11101:S29|4d415443485f434f4d50494c455228292e696e74657273656374283229 11102:O1|@11103 11103:D13,508|00833b2f291af8010e0c00021af5010e0e0c0002031729362b3c1aeb010c0003292b25042504511e233b6502012a650402002a2f1ad5010e0e0c0003030d1acf012a2a35452a364651020b2f3730382b2b452a46260329352a36313733291a9f010c00021a9d010e0e0c0002037729352a362a362937292f2a2a1a97010c000303033c024f2a1a77010c00021a75010e0e0c0002033d291a66010e0e0e0c00021a61010e0e0c000203262a352b362b352c362c2b1a55010e0e0c0003030d2b2a2506250626041e4e3b02013b270402013b02013b27040309292503511e7f3b02013b6502013c6429031133322a35452a36462a37472a3848640fcc342d2a1aff000c00021afd000e0e0c000203212a352b362a3629372d2a1afd000e0e0c00032c2a2507250726051e2b3b270502012965220c2d2a1ac8000e0c00021ac5000e0e0c000203212a352b362a3629382d2a1ab5000e0e0c00032c2a2507250726051e2c3b2705020129653c220d220d22106b293b2d2d6b2b3c1aa1000e0e0c0003034d3b2d291a78000e0c00021a75000e0e0c0002031729362b3c1a6b000c0003292b25042504511e233b6502012a65293d1a6c000e0c0003293c1a67000c00032e2a1a6300020223000c00036602013b030e29220d1a5400220e0e0e7e100003220c2b453b462d472c48270427061f0400000000f401000000000000|@11105,I105,I218,I106,I113,@740,I251,@10943,I233,I108,I107,I231,@11104| 11104:O1|@11106 11105:S43|4d415443485f434f4d50494c455228292e70617474436f64652834296d616b655061747454657374283329 11106:D5,92|00812c362d37292f1a55000e0e0c00033e2a693b2c291a4b000c00021a49000e0e0c0002031729362b3c1a3f000c0003292b25042504511e223b6502012a65302b452e462d472a482705430e0e0e0e0e000000005400000000000000|@11108,@11107,I105,I218,I106| 11107:O1|@11109 11108:S29|4d415443485f434f4d50494c455228292e6d616b654e61697665283129 11109:D10,140|00812c3b1a89000e0e0c000303033b026b2c1a7f000c00021a7d000e0e0c000203043b5002041a7300102c35292d1a6f000c0003292b692b3b69302a1a65000e0e0c0003642f1a5f000c00032c3b1a5b000c000303212a3b69293b1a32000e0e0e0c000303032a020b2a2a1a4200320e7e0900036402032a2a692704430e0e0e000000008400000000000000|@11111,I251,I105,I218,@2229,@11112,@11115,@11107,I113,@11110| 11110:O1|@11118 11111:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655061747473283129 11112:O1|@11113 11113:D12,660|00812b3529353e1a8e020e0e0e0c0003035a29362d362a291a81020e0e0c00021a7d020e0e0c0002032029352a362a36332a1a6f020c00036403052a68010207292503511e2d3b6502013b64293b1a47020c000303041a4f02103b50293529351a49022d69292b6927060fda29353c1a26020e0e0e0c000307ce29362a382e362b3729293b1a10020e0c000303033b027b291a07020c00021a05020e0e0c000203043b5002041a0702102935332a1af3010c00036403033c0252291ade010e0e0e0c00021ad9010e0e0c000203043b5002041adb01102935332a1ad7010c00036403033b0226291ab2010e0e0e0c00021aad010e0e0c000203043b5002041ab701102936292502501e853b646503131a9a012a69312d1aa3010c00032a2a69650fd12a291a75010e0e0c00021a71010e0e0c000203b429352a362a36293729293b1a540102043a01d6000e0e0e0c000303033b0283291a43010c00021a41010e0e0c000203043b5002041a4301102935220e2a1a2e010e0e0e0c00036403033c0256291a16010e0e0e0c00021a11010e0e0c000203043b5002041a1301102935220e2a1a0e010e0e0e0c00036403033b0226291ae6000e0e0e0c00021ae1000e0e0c000203043b5002041aeb00102936292502501e953b646603052a68010207292503511ec13b6502013b64293b1aa700020228000c000303041ac300103b50293529352a363c2b69292f69220d2c1aaa000e0e0e0c00032a2a69270766026229353f1a72000e0e0e0c0003032129362a372b382f363d2c2c6a292b69332f1a7a000e0e0e0c00032a2a692707023329353b1a43000c0003031d29362a372e363b2b69292b69322e1a51000e0e0c00032a2a692706020b2c361a30002a69293b696564430e0e0e0e000000008c02000000000000|@11114,I251,I105,I218,I113,@2309,@844,@2229,I234,@2232,@11112,@2309| 11114:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655465737473283229 11115:O1|@11116 11116:D9,372|00812c3b1a71010e0e0c000303033b0fd62b3b1a62010e0e0e0c000303032c0fc82c1a57010c00021a55010e0e0c000203043b5002041a4b01102c352c1a3c010e0c00021a39010e0e0c000203043b5002041a2f01102c352a2a1a2b010c00036503452c1a15010e0e0c00021a11010e0e0c000203043b5002041a0f01102c362c1af8000e0c00021af5000e0e0c000203043b5002041af300102c362a2a1aef002f0e0e7e0600032c1ad0000e0c00021acd000e0e0c000203043b5002041ac300102c352c1ab4000e0c00021ab1000e0e0c000203043b5002041aa700102c352a2a1aaf0002047b0079000e0e0c00036503472c1a85000e0e0c00021a81000e0e0c000203043b5002041a7700102c352d1a68000e0c00021a65000e0e0c000203043b5002041a6300102d36292e1a5f000c00032b2a6966022a2b1a3e000e0e0e0c00021a39000e0e0c000203043b5002041a3700102b362d2a1a33002e0e0e7e050003430e0e0e000000006c01000000000000|@11117,I251,I105,I218,@2229,I113,@2232,@11115,I234| 11117:S24|4d415443485f434f4d50494c455228292e64696666283229 11118:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11110| 11119:O1|@11120 11120:D4,60|00812c2c1a39000e0e0c000303033b02172c3c1a2e000e0e0e0c0003292d1a27000c00032e2a6965430e0e0e0e0e0e0e000000003400000000000000|@11091,I233,I106,@11119| 11121:O1|@11122 11122:D11,244|0088313b1af1000e0e0c000303033c020b333b1ae2000e0e0e0c0003031a333369300e0e0e0c0002312a35452a36462a37472a38486402a9312f2f220d1abc000e0c00052e2a2a1ab6000e0e0e0c00021ab1000e0e0c000203043b5002041aa700102a352b362b3b1aa1000e0e0c000303032a02172b3c1a96000e0e0e0c00032a2a2505250526031e423b6427042a3b69342a1a7e000e0e0e0c00031a79001a7a002b220d220d220d220d220d68080404002d22112c22122d220e0e0e0c00065029352a362b372c382c2c2c2c6b3f2a220f220d6b22132a453b462d472c48270c1f090e0e0e0e0e00000000ec00000000000000|@11124,I251,@11125,I105,I218,@878,I113,I107,@11115,@11123,@11121| 11123:D1,68|00802b352c360404002b2b56582c5679568a569b56ac56bd56c70e0e0e0c000a5029352a362b372c382c2c2c2c6b2707420e0e0e0e0e0e0e000000003c00000000000000|@11134| 11124:S48|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283329 11125:O1|@11126 11126:D2,36|00833b3b3b303231311a1c00320e0e7b090600080e0e0e0e000000001c00000000000000|@11128,@11127| 11127:O1|@11129 11128:S30|4d415443485f434f4d50494c455228292e62657374436f6c756d6e283429 11129:D14,356|0086312f1a61010e0e0c00030303300fdc2d293b1a55010e0e0c000303033b027b291a4b010c00021a49010e0e0c000203043b5002041a3f01102935332a1a27010c00036403033c0252291a22010e0e0e0c00021a1d010e0e0c000203043b5002041a1301102935332a1a0f010c00036403033b0226291af6000e0e0e0c00021af1000e0e0c000203043b5002041aef00102936292502501e863b646403992c322a1acb000c00021ac9000e0e0c000203043b5002041acb00102a352b362b3b1aa5000e0e0c000303032a02172b3c1ab6000e0e0e0c00032a2a2505250526031e3f3b642704292d1aa100020261000e0e0c000329321a97000c0003031e333c1a91000e0e0c000329220c2c343434341a8500220c0e0e7b090c0008333c1a73000c0003293434343434341a6a00220c0e0e0e7b090c0008313c1a57000c0003293232323232321a4e00337b090a00081f070e0e0e0e0e0e000000005c01000000000000|@11131,I113,I251,I105,I218,@2229,I234,@2232,@878,I107,@11130,I233,I106,@11127| 11130:O1|@11132 11131:S44|4d415443485f434f4d50494c455228292e62657374436f6c756d6e28342966696e6444656570657374283329 11132:D9,404|00812c3629353e1a8e010e0e0e0c000303472936293b2a1a82010e0e0e0c00021a7d010e0e0c0002032b2a352b362a321a71010e0e0c0003292d1a6b010c000303032902012c2b2a2506250626041e383b2704020129660fce2d37292e1a4c010e0c0003293b1a2f010c00031a31010e0e0c00020320291a22010e0e0e0c00021a1d010e0e0c000203043b5002041a1f011029350fdd2b353d1afc000e0c0003033e2b363b2a291af2000e0e0e0c00021aed000e0e0c0002031729362b3c1af3000c0003292b25042504511e253b6502012a65293c1adc00320e0e0e7e0900032b353c1ab2000e0e0e0c000303422b363b2a291aa6000e0e0e0c00021aa1000e0e0c0002031729362b3c1aa7000c0003292b25042504511e253b6502012a65293c1a900032020259000e0e0e7e0900032b353b1a62000e0e0e0c000303422b363b2a291a56000e0e0e0c00021a51000e0e0c0002031729362b3c1a57000c0003292b25042504511e253b6502012a65293c02020c001a3c00320e0e0e7e0900033b6564430e0e0e0e000000008c01000000000000|@11133,I251,I105,I218,@11130,I233,@11099,@2229,I106| 11133:S29|4d415443485f434f4d50494c455228292e706174744465707468283229 11134:S51|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283129283129 11135:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11097| 11136:D7,92|00802b3b1a59000e0e0c00030328560a03041a4f00103b5056090307280b56176902111a42001a430056281a42002e7b0503000402122b3c1a39000e0e0c0003561b2c0e0e800002420e0e0e0e0e0e0e000000005400000000000000|@11138,I113,@11139,@6942,@11142,@11137,I107| 11137:O1|@11143 11138:S48|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e732836296669726550617474283129 11139:O4|@35,@863,@11141,@11140 11140:O5|@10922,1179,0,1179,0 11141:S33|636f646544656661756c742063616c6c6564206275742065786861757374697665 11142:O3|2,101,0 11143:D10,228|00823d2e3b6a2c352d362e372f3830392d1ad4001ad5000e0e0c000303033c02222d1acb000c00021ac9000e0e0c000203102d3b1ab1003b3f1abc000e0c000602013b031c2b3b1ab2000e0e0e0c0003030c293b1aa5000e0e0c000302013b02013b03051a9900020c2d2c2b2f2e68053d2a3b6a64293b691a89002a69312a69220d2a69280e2a3b6a2a291a62000e0e0e0c00021a5d000e0e0c0002031d29352a362a353d1a44000e0c00030309292503511e283b02013b6502013c64030b291a45000e0e0c0002020129280b2a69270d440e0e0e0e0e0e00000000dc00000000000000|@11144,I48,I251,I105,I218,I154,I113,@809,@809,@2464| 11144:S34|4d415443485f434f4d50494c455228292e7261697365457863657074696f6e283329 11145:D2,36|00832b362c3830303b30322f2f1a1800340e0e7b09080008000000001c00000000000000|@11147,@11146| 11146:O1|@11148 11147:S37|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429 11148:D15,500|0086313532363337313632373c2a0e0e0e0c00023c3b2b22106b2a3b1ad9010e0e0c000303041ad301103b503d2b693f2a6930291ac9010e0e0c00021ac5010e0e0c0002034329352a362a3729353d1ab6010e0e0e0c000303043b5002041aab011029362a372a3b341aa4010e0c000450293b220d1a98010e0c0004502c250626051e4f3b270502013b6432353e1a77010c0003031532362922132213221322131a70010e0c0006640fcd32353c1a57010c00030325323633373438292b1a5701221522152215221532221c221c220e1a49010e0e0c000c660fcf32353f1a27010c0003038a3236333734382213291a0e010e0e0e0c00021a09010e0e0c0002032029352a362a352e2a1a13010c00036403052a68010207292503511e2e3b6502013b64293b1adf000c000303041af300103b502935293629353d1aca000e0e0e0c0003030c292d3b1adc000e0c0004020628062a2e3b6b2f2a221922192219221922191ab1000e0e0c00082707025c32353b1a9200020252000e0e0e0c0003032232363337292d69292214692c22162b22162216221622161a7c000e0c000827040228301a5800020220000e0c00021a51000e0e0c000203043b5002041a6b00103035220f0e0e0e0c00022d3b69293b1a34000e0c000303032a0204402a2c6a270c1f070e0e0e00000000ec01000000000000|@11150,I234,@3695,I105,I218,I251,@11151,I255,@11154,@11146,@11149,I113,@2309,@2403,@2229| 11149:O1|@11185 11150:S49|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d61746368283329 11151:O4|@35,@863,@11153,@11152 11152:O5|@10922,611,0,611,0 11153:S7|73657441646472 11154:O1|@11155 11155:D8,164|00842f1aa2000e0e0e0c00021a9d000e0e0c000203043b5002041a9300102f3530362a352b362a2a3434341a86000e0e0e0c00062a310e0e0e0c00022a3b1a77000c00030303290204402b2b6a2e1a57000c00021a55000e0e0c00021a4d000e0e0c000203032902252d220d220d220d1a49000e0e0c00052f220e220e220e220e1a3c000e0c00063c2b2d2c6b6527071f050e0e0e0e0e0e000000009c00000000000000|@11157,I105,I218,@11158,@11161,I251,@11156,@11154| 11156:O1|@11183 11157:S73|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d6d616b655061747465726e73283129 11158:O4|@35,@863,@11160,@11159 11159:O5|@10922,1083,0,1083,0 11160:S16|6d616b6554657374733a20656d707479 11161:O1|@11162 11162:D13,444|00842f1aba010e0e0e0c00021ab5010e0e0c000207d42f3530362a352b362f3630373c2a0e0c00023c3b2b220e6b2a3b1a95010e0e0c000303041a8f01103b503d2b693f2a692f291a75010e0e0c00021a71010e0e0c0002034329352a362a3729353d1a6a010e0e0e0c000303043b5002041a5f011029362a372a3b341a58010e0c000450293b220d1a4c010e0c0004502c250626051e4f3b270502013b6431353c1a2b010c0003032931360402002a2d22112c1a25010e0e0c0005502936220c22142b221422141a15010e0e0c00066602cd31353d1af7000c00030386313632372210291ad8000202bb000e0c00021ad1000e0e0c0002032029352a362a352e2a1adf000c00036403052a68010207292503511e303b6502013b64293b1aaf000c000303041abf00103b502935293629353d1a9a000e0e0e0c0003030c292d3b1aa8000e0c0004020628062a2e3b6b220f22172b221722171a84000e0c00062706023c31353b1a66000e0e0e0c0003031d3136292c6929221169220c22142f2c22141a5a000e0e0e0c00066602113222112c221122111a46000e0e0e0c00062d2a69270c02013b1f050e0e0e0e0e0e00000000b401000000000000|@11164,I105,I218,I234,@3695,I251,@11151,I255,@11163,@11161,I113,@2309,@2403| 11163:O1|@11165 11164:S29|4d415443485f434f4d50494c455228292e6d616b654c6f616473283529 11165:D9,260|00832e353d1a00010e0c000303872e362f37293b1af1000e0e0c000303051aeb00020729353d2a3b6a64293b69312a69280e2a3b6a2a291ad6000e0e0e0c00021ad1000e0e0c0002031d29352a362a353d1ab4000e0c00030309292503511e283b02013b6502013c64030b291aa9000e0e0c0002020129293b69291a9e000e0e0e0c00023e2a333c6b220c2a451a7c0046270a025a2e353c1a6d000e0e0c000303272e362d362e382b3b322d2d1a70000e0c00062c3b332e2e1a68000e0c0006302b452a46270502262e362f372e362f382c2c332d2d1a47000c00062d2d342e2e1a40000e0c0006312b452a4627061f040e0e0e0e0e0e0e00000000fc00000000000000|@11167,I251,@809,I105,I218,@2464,@2388,@11168,@11166| 11166:O1|@11176 11167:S35|4d415443485f434f4d50494c455228292e636f6e7374727563746f72436f6465283329 11168:O1|@11169 11169:D20,236|00842f36293b1ae7000c000303812e353d1adc000e0c0003030c2e3b3b1ad4000e0c0004020628062f3b3b6b1ac9003b1ac9000e0e0c00031ac5003b1abd000e0e0c00031abd003b1ab1000e0e0c00031ab5003b1aa5000e0e0c00031aad002c2e2c2e6805220d34343b1aa3002e1aa3000c0007293b69302a69291a9a000e0e0e0c00023e2a1a93003c6b270a0248291a8d000e0e0c00021a89000e0e0c000203043b5002041a7f00101a7f00312e6a3b1a7c000e0c00022930302d1a75000e0e0c0005313b69291a6d000e0e0c00023e2a2d3c6b2705641f050e0e0e0e0e0e00000000e400000000000000|@11171,I251,@2403,@178,I253,@179,@180,@181,I48,@10173,@9747,@10366,@802,I105,I218,@11172,@11170,@2383,@2385,@2388| 11170:D11,132|00801a83003b1a83000c00031a81003b1a79000e0e0c00031a79003b1a6d000e0e0c00031a71003b1a61000e0e0c00031a69002c2e2c2e680556573156783b1a5e002e1a5e000e0e0e0c000729353d1a56000e0e0e0c0003030e293b3b1a4c00340e0e7b0509000428062a3b3b6b2706420e0e0e0e0e0e0e000000007c00000000000000|@11175,@178,I253,@179,@180,@181,I48,@10173,@9747,I251,@2403| 11171:S24|56414c55455f4f505328292e6d616b654775617264283529 11172:O4|@35,@863,@11174,@11173 11173:O5|@9736,1248,0,1248,0 11174:S9|6d616b654775617264 11175:S33|56414c55455f4f505328292e6d616b654775617264283529746573746572283129 11176:D11,156|00842f36293b1a97000c000303222e353d1a8c000e0c0003030e2e3d3c1a84002f0e0e7b0508000428062f3d3c6b0258291a74000e0c00021a71000e0e0c000203043b5002041a6700102935293c1a4f000c000303051a5b00022c1a5a00322f6a3b1a57000c00022931312d1a51000e0e0c0005323b69291a49000e0e0c00023e2a2d3c6b270564641f050e0e0e0e0e000000009400000000000000|@11178,I251,@2403,I105,I218,@11179,@809,@11177,@2383,@2385,@2388| 11177:D11,132|00801a83003b1a83000c00031a81003b1a79000e0e0c00031a79003b1a6d000e0e0c00031a71003b1a61000e0e0c00031a69002c2e2c2e680556573156783b1a5e002e1a5e000e0e0e0c000729353d1a56000e0e0e0c0003030e293d3b1a4c00340e0e7b0509000428062a3d3b6b2706420e0e0e0e0e0e0e000000007c00000000000000|@11182,@178,I253,@179,@180,@181,I48,@10173,@9747,I251,@2403| 11178:S26|56414c55455f4f505328292e6d616b65496e7665727365283529 11179:O4|@35,@863,@11181,@11180 11180:O5|@9736,1275,0,1275,0 11181:S11|6d616b65496e7665727365 11182:S39|56414c55455f4f505328292e6d616b65496e7665727365283529676574496e7665727365283129 11183:D13,428|00832e1aaa010e0e0e0c00021aa5010e0e0c000207db2e352f362a3529353c1a96010e0e0e0c0003036729362f373c2a0e0c00023c3b2b220d6b2a3b1a7d010e0e0c000303041a7701103b503d2b693f2a690402002f2b220e2c1a67010c00055029352a362e3b69342b221222121a57010c00053c2d2b1a52016b2b3b1a38010e0c00030303290204402c2b6a270c0fda29353d1a21010e0e0c0003038229362a3731291a09010e0e0c00021a05010e0e0c0002032029352a362a352e2a1a0f010c00036403052a68010207292503511e2d3b6502013b64293b1adb000c000303041aef00103b502935293629353d0202a4001ac2000e0e0e0c0003030c292d3b1ad4000e0c0004020628062a2e3b6b302a220e220e1aaf00220f7b060f000529353b1a92000e0e0e0c0003035729362f373c2a0e0c00023c3b2b220d6b2a3b1a79000e0e0c000303041a7300103b503d2b693f2a692b3b692f2b6929220f693322112b22111a5f00020227000c00052c3b1a43000c00030303290204402d2b6a270a020f2a3131311a3c00320e0e7b060900056602031a42001f040e0e0e0e00000000a401000000000000|@11184,I105,I218,I251,I234,@3695,@11163,@11156,@809,I113,@2309,@2403,@742| 11184:S34|4d415443485f434f4d50494c455228292e6d616b654e616976655465737473283429 11185:D10,260|008a220c3b1a00010e0c000303162e2e2e220c220c220c220c2211320e0e0e7b090d0008220c35220d362a352b3529353b1ad4000e0c0003030c220f3c1acc000e0c000302013b6403522b3529362a372e362e1aba000e0e0e0c00021ab5000e0e0c00021aad000e0e0c000203043b5002041aa300102b2b34221122111a9c000e0c00062a2a220d2214221422142214221922110e0e0e7b091500082b360402002b3122102c1a77000c00055029352a362c2a220c221322132213221322180e0e0c000822133c1a5a000e0e0e0c0003302a2215221522152215221522152215221522151a41000e0e0c000c3c2e2d2c6b270a1f0b0e0e0e00000000fc00000000000000|@11187,I251,I113,I105,I218,@11186,@11166,@11163,I107,@11149| 11186:O4|@35,@863,@11189,@11188 11187:S70|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d646f5061747465726e283229 11188:O5|@10922,1060,0,1060,0 11189:S21|646f5061747465726e3a206e6f7420617420656e64 11190:S31|48616e646c6572206361746368657320616c6c20657863657074696f6e732e 11191:S27|4d61746368657320617265206e6f7420657868617573746976652e 11192:S8|5061747465726e20 11193:S14|20697320726564756e64616e742e 11194:O1|@11195 11195:D39,980|0088331ad2030e0e0e0c00021acd030e0e0c000207d4333534362a352b362c3a32363338220f3c1ab6030e0e0e0c0003293b1aaf030c000303033c0214220f3b1aa5030e0e0c00032a2a1a9f030c00036403041a9a03103b503b50293c1a94030e0c000322102a1a7e030e0e0e0c0003293e1a83030c0003660325220f3c1a73030c00032f22122b2212221222122212221222121a650322130e0e7b0b13000a2a352b363c28403b1a55030e0e0c00041a51032a2c6a2c3c1a39030e0e0c0003292b2d6a3c28403c1a35030e0e0c00041a35032a6922133522143922153a22162307220f3b1a24030202d7020e0c00033b2a291ae2020e0e0e0c00021add020e0e0c0002031729362b3c1ae7020c0003292b25042504511e253b6502012a65291aed021aee020e0e0e0c00032b321ae7020c0003292b1ae3020c00032d2b2a3b1add020e0e0c00030319293b1ad1020e0e0c000303043b5002041ac702103b503b02672a352b362b1a6d020e0e0c00021a69020e0e0c000203043b5002041aa702103b502b352c362c3729353d1a90020e0c000303043b5002041a8f02103b5029362a372a3b2f1a86020e0e0e0c000450293b22161a78020e0c0004502e2d2509250926071e873b2707652e32220e220c220e220c1a5c020e0c000729352a360402001a5202221b2b22230e0e0c00045029352b2a22101a42020e0e0e0c000429352a36221c2d2216221422161a30020e0c0006293b1a07020c000303032b020b2b2a1a1e020e0e0e0c0003293b1aef010c0003030331020b312a1a0a020e0e0e0c0003293b1ad7010c00030304220c020a220c2a1af4010e0c000322152219221822213122183b2219680804020022242b2b222c0c00045029352c3b1aa0010e0c00030303290204402d2b6a22313c1a4d010e0e0c000322332a1a56010e0e0e0c00032224282f1aa5010e0e0c000322343c1a9e010e0e0e0c00032a2a1a8f010c000322243b1a1e010e0e0e0c0003293b2a1a02010e0e0e0c00021afd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a54010e0c000222233b1ada000e0e0e0c000322243b1ace000e0e0e0c0003293b1acf000c000322263b2b1a01010e0e0c0004502f1a23011ae4000e0c000303033c02222f1a8f000c00021a8d000e0e0c000203102f3b1a01013b3f1a00010e0c000602013b03051af80002012f2d1af5000e0e0c000222211aef001a94000e0c0003220e2c3b2d2d3c343c680828072a693c3b22102c6b22423c1a55000e0e0c0003223922452b2245224522452245224522451a44000e0c000a2b2a69273c02013b1f090e0e00000000cc03000000000000|@11197,I105,I218,I107,I234,I253,I231,@1850,I106,I232,@11194,I11,@11198,@11199,@10888,@9806,@2047,@11201,@11203,I251,@5286,@5286,@11205,I255,@9740,@3716,@10615,@10618,@11207,@11209,@11211,@389,@510,@2445,I48,I154,@1591,@2447,@11196| 11196:O1|@11213 11197:S41|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729 11198:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11199:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@11200,I253,I106,I255| 11200:S53|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729666e4d6b4164647273283129 11201:O1|@11202 11202:D7,100|00812c1a62000e0e0e0c00021a5d000e0e0c000203392c362c3b1a53000c00032d3b1a4b000c0003293c1a47000c00032f3b2b1a42000e0e0e0c0004502c301a3a000e0e0e0c00032c2a69270502013b430e0e0e0e0e0e0e000000005c00000000000000|@1785,I105,I218,I253,I106,I255,@11201| 11203:O1|@11204 11204:D7,108|00812c3b1a69000e0e0c000303172b3b1a5d000e0e0c000303043b5002041a5300103b02342c352d362d1a4b000c00021a49000e0e0c000203043b5002041a3f00102d352e363c3b2e2d6b2c2b1a34000e0c00032a2a692706430e0e0e0e0e0e000000006400000000000000|@3980,I251,@3979,I105,I218,@3979,@11203| 11205:O4|@35,@863,@11153,@11206 11206:O5|@10328,451,0,451,0 11207:O1|@11208 11208:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11207| 11209:O1|@11210 11210:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11209| 11211:O1|@11212 11212:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11211| 11213:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11214:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10886| 11215:O2|@11303,@10658 11216:D67,3588|00822d350a1e003e00af00f80b0301910a67053e003e003e003e00060414053e002c02190d57093e007505c60c3f043e0059004a005b022806040a3e001c063e0032013e002c392c1abd0d452a46640fca2d36292e2e2d2f0e0e0e7b050600042d362e370402002b302b2f0e0e0c00045029352a363135323633373438220c3a220d2306220e23072f2f2f2f343030306808040200220c2b2b22110e0e0c00045029353c220c1a630d2c6b22122a45220c4627100fd12d362e370402002b302b2f0c00045029352a363135323633373438220c3a220d2306220e23072f2f2f2f343030306808040200220c2b2b22110e0e0c00045029353c220c2b1a0a0d6b22122a45220c4627100fd42d3629352a362f390402002c322b310202d50c0c0004502935332d2b3b220d56b70e0e0c0006322a452d4627070fce2d362e372f392f390402002c322b310e0c00045029352a360402001ab90c312b56b80e0e0c0004502935220c35220d36220e372e2d2d1aa20c0e0e0e0c000429352a36220c302f31301a930c0202690c0c0006293b1a8b0c0c000303032b020b2b2a1a820c0e0e0e0c000322143522153622163722173822183a22192306221a23072f2f2f2f220d303030680804020022192b2b221d0e0e0c0004502935333b1a400c0202120c0e0c0003030329020440342b6a3d2a69293b693b1a2d0c0e0e0c000228092a692b3b1a170c0202e90b0c00030303290204402c2b6a3c221c2b1aec0b6b3b1a070c0c00023b2b2b6a22262a4522214627240fd12d362e372e390402002c312b300e0c0004502935322d1ae00b3c220c56a70c000628052b2b6a322a452e4627070fd62d362e372e362f370402002d322b310c00045029352a360402002b353d1a9a0b0e0e0e0c0003030d1aa30b2c692a3b452a4651021a3c2e0c00021a950b2a316a3c3b2c306b293b692d2a452c46260529352a36302a0e0e0c000229353d1a5a0b0e0e0e0c0003030c293b3b1a680b0e0c0004020628062a3b3b6b2a353d1a3a0b0e0e0e0c0003030c2a3c3b1a480b0e0c0004020628062b3c3b6b2b353d1a1a0b0202ec0a0e0e0e0c0003030c2b3d3b1a240b0e0c0004020628062c3d3b6b220c35220d36220e37220f382210392d1a090b1ae60a0202b80a0e0e0e0c000303033c02222d1af70a0c00021af50a0e0e0c000203102d3b1ae10a3b3f1ae80a0e0c000602013b031c2b3b1ade0a0e0e0e0c0003030c293b1ad10a0e0e0c000302013b02013b03051ac50a020c2d2c2b2f2e68053d2a3b6a64293b69302a69322a69342a69280e2a3b6a2a291a910a0e0e0c00021a8d0a0e0e0c0002031d29352a362a353d1a540a0e0c00030309292503511e273b02013b6502013c64030b291a710a0e0e0c000202012922113b1a2b0a0c000303032902054022122b6a280b2a69221e2a45221646271c0fdd2d362d390403002b2b2b566833311a3a0a0e0e0e0c00075029352a362b372b3b1aec090e0c000303032a0204402c2c6a322a452b4627070fdd2d3629352a361a0d0a56482e2d6b0402002b3b332d2d56a90e0e0e0c00065029352a360402002b3b2a1ace090e0e0e0c00021ac9090e0e0c000203043b5002041ad709103b502a352b36293b1a87090c0003034c2a353d1a7c090e0c000303043b5002041ab709103b502a362c3b2a1a88090e0c00021a85090e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f2a452b46260302122a2c02020609692a2a2505250526031e8750260429352a362a3b1a19090e0e0c00030303290204402b2b6a220d2a452e46270b0fca2d362e382a3b0202cd081a40090e0c00032f39303a1a39092a690402002d2b2b1a32090e0e0e0c0004502936291a29090e0e0c0002291a24090e0c0002220e322b221056ea0e0c0005220d2a453146270b0fda2d37292e2e2d2f0e0e7b050600042d362e372f382b3b1ae1080e0e0c0003303531363239333a2d3528051a81080e0e0c000303252d36291a98080e0c00021a95080e0e0c0002030d2936293b1a5f080c00036402013b6402013b03043b5002041aab08103b502d3629352f3b692a2a69293c1a9d0802020b080e0e0c0003291a94080e0c00023b2a3c6a3e2c2b6a3d2a220e6a220f221222162c220d22102212221522151a73080c000a22142a45220c4627120fda2c392c1adf07452a46640fd02d362e372f383039303531383239333a2e29353e1ad6070202a8070e0e0e0c0003033129372929353b1ac1070e0e0c00030304293702122936293b1afb070c0003292503511e1f3b65641ac8070e0c0002640223293528061a92070e0e0e0c000303132936293b1acf070c00032502501e5f3b6402013b6403112c3c220e301adb071adc070e0c000602013b2f293528051a59070e0e0c0003032a29382937293629353d1a46070e0e0e0c000303043b5002041aaf07103b502937652502501e323b64026b293528061a21070204f306f1060c000303132936293b1a5b070c00032502501e573b64024629353e1afd060e0e0c000303043b5002041a6b07103b5029363b2a291a08070e0c00021a05070e0e0c0002031729362b3c1a4f070c0003292b25042504511e233b6502012a6664293c1ae7060c00036403051a3207021131301a2f070c000328061a23072b3b6b641a24072c69040200332b2b1ae1060e0e0c0004502936291ad9060e0e0c0002291a08070e0c0002293b1a6f060c000303783228231af8060e0c00032922101aee060e0e0e0c0003291a70061a4d060e0e0c000303033c0222291a63060c00021a61060e0e0c00020310293b1a4d063b3f1a54060e0c000602013b03051ab4060201293b1ab1060e0e0c00023c1aac061aad060e0e0c0003332c3b2d2d3b3b3c680828072a6927060fcf3228231a80060e0c00032922101a76060e0e0e0c0003291af8051ad5050e0e0c000303033c0222291aeb050c00021ae9050e0e0c00020310293b1ad5053b3f1adc050e0c000602013b03051a3c060201293b1a39060e0e0c00023c1a3c061a35060e0e0c0003332c3b2d2d3b3b3c680828072a693b31291a9c050e0c00021a99050e0e0c0002031729362b3c1ae3050c0003292b25042504511e233b6502012a65221128231ade050e0e0e0c00032922181ad2050e0e0e0c0003291ae0051ac5050e0e0c0003291a48051a2505020259000e0e0c000303033c0222291a37050c00021a35050e0e0c00020310293b1a21053b3f1a28050e0c000602013b03051a88050201293b1a85050e0e0c00022e1a90051a81050e0e0c0003302c3b2d2d3b3b3c680828072a69270f22122a45334627100fdd2d372e38291ada040e0e0e0c00021ad5040e0e0c0002030d2936293b1a9f040c00036402013b030e2935293829313130327b050900042a3b1acf040c00032f36303731393b2e291a98040e0c00021a95040e0e0c0002031729362b3c1adf040c0003292b25042504511e233b6502012a650402001afb04302b34220f3133220c321af2040e0e0e0c000a5029352a362a3b1a2a040e0e0e0c00030303290204402b2b6a220d2a452f46270b0fcd2d36291a2f040c00021a2d040e0e0c0002030d2936293b1af7030c00036402013b03041aa704103b503b502d392a0202b5032c301a9a040e0e0e0c0004280e2a3b6a2a291aee030e0e0e0c00021ae9030e0e0c0002031d29352a362a353d1ab0030e0c00030309292503511e283b02013b6502013c64030b291acd030e0e0c0002020129302a452d4627050fcd2d3629352a362b372c392d3a0402002e342b330e0e0c00045029352a360402001a5503302b56d80e0e0c0004502935220e35220f362210372e2d2d1a3e03020218030e0e0e0c000429352a3634302f31301a2c030e0c0006293b1a27030c000303032b020b2b2a1ade030e0e0e0c0003221635221736221837221938221a3a221b2306221c23072f2f2f2f220d303030680804020022182b2b221f0e0e0c00045029350402001acf02221c2b122200010002000e0e0c000450293522223522233622243722192d2d1ab10202028b020e0e0c000429352a362220302f31301a9f020c0006293b1a9b020c000303032b020b2b2a1a56030e0e0e0c0003222a35222b36222c37222d38222e3a222f2306223023072f2f2f2f220d3030306808040200222d2b2b22330e0e0c0004502935221e3b1a4f020c000303042214020640221f22166a343b1a3b020c000303032a020540220c2c6a3c222c2c2c6b22362a45222c4627340fdd2d3629352935280e1a12020e0e0e0c0003035c29362936293b1a4d020e0e0c00032b37293b1a41020e0e0c00032f363039220c35220d36220e3a302f2b1aa9020e0e0c00040402002f22122b22110c00045029352a36342b30303034220d1a8c020e0c000822132a452b46270f025c2a360402002b312b300e0e0c00045029352a36323533363437220c38220d3a220e2306220f23072f2f2f2f343030306808040200220c2b2b22120e0c00045029352a362a3b69291a38020e0c00023e2a22103c6b22162a452d462712650fdb2d362e372f3830392c3b1a8e01020214010e0e0e0c0003313532391a09022b220d306b2d302e2c1a01020e0e0c0005293b1a1b010c00030309341afe00452c46020d29353d2a3b6a220d2a452e4665270902d22d362936293b1a3f010c00032936291a0e010e0e0e0c00021a09010e0e0c000203482c37293b1a1f010c00032e3833353436220c39220d3a1aa101322b2f31680532302c1a81010e0e0c00043b1a90010e0c0002292f2e2e1a89010e0e0c000522112a452f46270b0266293b1a8d000e0e0c000303242c38313532363339343a2f2c2b3b3032020248001a5b010c0007220c2a452c46270602362c37293b1aa7000c00032e3833353436220c39220d3a312f2b1a12010e0e0e0c0004322d2c2c31331a27010c0007220f2a452d4627092704440e0e0e0e0e00000000fc0d000000000000|@11218,@809,@742,@3716,@10615,@10618,I251,@11219,@11221,@11223,@3454,@11225,@11226,@2403,I48,I105,I218,I154,I113,@809,@2464,@11227,@11237,@11253,@11255,I253,@11257,@2071,@2377,@11258,@11260,@6995,@7525,@11263,@11058,@7465,@10699,@11059,I106,@739,@11064,@11268,@11269,@389,@1591,@9864,@11271,@2047,@11273,@10154,@11275,@11277,@11283,@11292,@11295,@11297,@11299,@11029,@9748,@2388,@11301,@10925,@11217,@2383,@2385,@10091,@9747| 11217:D4,68|008056072c56283b5649565a1a39000e0e0c000729353d1a32000e0e0e0c0003030e293c3b1a28002f0e0e7b0504000428062a3c3b6b6442000000003c00000000000000|@11302,@9747,I251,@2403| 11218:S35|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229 11219:O1|@11220 11220:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11219| 11221:O1|@11222 11222:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11221| 11223:O1|@11224 11224:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a293c692d1a27000c00022a2a69270702013b420e0e0e000000003c00000000000000|@1785,I105,I218,@11223| 11225:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 11226:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 11227:O1|@11228 11228:D11,284|0085301a1a010e0e0e0c00021a15010e0e0c000203043b5002041a0b01103b50303531362a352b360402001afe002c2b220c0e0e0e0c0004502935323533363437220f2d2d1ae8000e0c000429352a3631302f31301adc000e0c0006293b1ad7000c000303032b020b2b2a1ace000e0e0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220d303030680804020022142b2b221c0e0e0c00045029352a3622173b1a89000e0e0c0003030b221e220c452b462a47024504030022182b2b2221222122211a6f000c00075029352a362b373d2f69292d69293b1a52000e0e0e0c000303042211020a22112a1a4c000e0c000322252a452e462d47270727191f060e0e0e0e0e0e000000001401000000000000|@11230,I105,I218,@11231,@3716,@10615,@10618,I251,@11234,@11227,@11229| 11229:O1|@11236 11230:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f64654c697374283229 11231:O4|@35,@863,@11233,@11232 11232:O5|@10328,697,0,697,0 11233:S22|4578705365713a20656d7074792073657175656e6365 11234:O1|@11235 11235:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11234| 11236:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11229| 11237:D2,36|00802b352c365627563856491a1900300e0e0e7b07030006000000001c00000000000000|@11239,@11238| 11238:O1|@11240 11239:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283129 11240:D4,76|00842e390402002d2b2b3234331a40000e0c00075029352a362a3b1a36000e0e0e0c0003030333020b332b1a2a000e0e0e0c0003292b6927051f050e0e0e0e0e000000004400000000000000|@11242,@11243,I251,@11241| 11241:O1|@11252 11242:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229 11243:O1|@11244 11244:D11,276|0085301a12010e0e0e0c00021a0d010e0e0c000207d4303531362a352b360402001afc002c2b220c0e0c0004502935323533363437220f2d2d1ae8000e0c000429352a3631302f31301adc000e0c0006293b1ad7000c000303032b020b2b2a1ace000e0e0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220d303030680804020022142b2b221c0e0e0c00045029353d2a690402002218220f2b2221222122211a85000e0e0c00075029352a362c3b692b3b1a6b000c0003030329020b292c1a6a000e0e0e0c0003293b1a53000c000303042210020e22102a1a540002020e000e0c000322242a452d46271f02052e3b4530461f060e0e0e0e0e0e0e000000000c01000000000000|@11246,I105,I218,@3716,@10615,@10618,I251,@11247,@11243,@11249,@11245| 11245:O1|@11251 11246:S60|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229636f64654c697374283229 11247:O1|@11248 11248:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11247| 11249:O1|@11250 11250:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11249| 11251:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11245| 11252:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11241| 11253:O4|@35,@863,@4411,@11254 11254:O5|@2410,357,0,357,0 11255:O4|@35,@863,@4414,@11256 11256:O5|@2410,359,0,359,0 11257:D4,172|00805607291aa8000e0c00021aa5000e0e0c0002038629352a362a3829353c1a96000e0e0e0c00030367293629291a7f000c00021a7d000e0e0c0002032829352a362a352935220c352a2a1a6a000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a4b000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e00000000a400000000000000|@10678,I105,I218,I251| 11258:O1|@11259 11259:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a36293f1a4f000c0003293b1a4b000c0003641a3c000e0c000264030f291a3d000e0e0c00022b2a6964020a291a2e002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I243,I251,@11258| 11260:O4|@35,@863,@11262,@11261 11261:O5|@10328,632,0,632,0 11262:S22|4c6973743a2062616420656c656d656e742074797065 11263:O1|@11264 11264:D13,244|0088331af2000e0e0e0c00021aed000e0e0c000203a2333534360402002b220c2b220f0e0e0c00045029352b220e220e220e220e220e220e220e220e1ac1000e0e0c000a1abd00220d220d1aba000e0e0e0c00042a3b692c2a69280e2a3b6a2a291a94000e0c00021a91000e0e0c0002031d29352a362a353d1a90000e0c00030309292503511e263b02013b6502013c64030b291a79000e0e0c00020201291a62002a2211221331221322131a650022130e0e7b091500081a5d002c311a48000e0c00041a55003130306b2a1a51000e0e0c00022932342d1a4900320e0e0e7b060e00050e0e0e0e00000000ec00000000000000|@11266,I105,I218,@11263,@10961,@11029,I251,@2464,@9748,@10954,@11265,@2383,@2385| 11265:D5,68|00801a43002c56273b564856591a3c000e0c000729353d1a36000e0e0e0c0003030e293c3b1a2c002f0e0e7b0504000428062a3c3b6b6442000000003c00000000000000|@11267,@10954,@9747,I251,@2403| 11266:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129 11267:S58|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129676574436f6e737472283129 11268:D4,172|00805607291aa8000e0c00021aa5000e0e0c0002038629352a362a3829353c1a96000e0e0e0c00030367293629291a7f000c00021a7d000e0e0c0002032829352a362a352935220c352a2a1a6a000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a4b000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e00000000a400000000000000|@10678,I105,I218,I251| 11269:O1|@11270 11270:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a36293f1a4f000c0003293b1a4b000c0003641a3c000e0c000264030f291a3d000e0e0c00022b2a6964020a291a2e002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I243,I251,@11269| 11271:O1|@11272 11272:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11273:O1|@11274 11274:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11275:O1|@11276 11276:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11277:O1|@11278 11278:D2,20|00801a1300100e0e000000000c00000000000000|@11280,@11279| 11279:O4|@35,@863,@11282,@11281 11280:S38|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229283129 11281:O5|@10328,593,0,593,0 11282:S17|6d697373696e6720696e207265636f7264 11283:O1|@11284 11284:D12,300|0088321a2a010e0e0e0c00021a25010e0e0c000203b0323533362a352b380402002a220c2b220f0e0e0c00045029350402002a353d1a00010e0c0003030d1afb002b692a3b452a4651021f3c220d0e0e0e0c00021ae9002a220e6a3c3b2c2f6b293b692d2a452c46260529352a362f220d1ad0000e0c00031acd002b221022172d68050402002a342b2216221622162216221622161ab4000e0c000a5029352a362a3b1a92000e0e0e0c000303032f020b2f2b1a9a000e0e0e0c000322172a452b46270f02572b341a89000e0e0c0003280e2a3b6a2a291a56000e0e0e0c00021a51000e0e0c0002031d29352a362a353d1a44000e0c00030309292503511e283b02013b6502013c64030b291a49000e0e0c0002020129343b452a46661f090e000000002401000000000000|@11286,I105,I218,I251,@11287,@11288,@11064,@11289,@11283,@11285,@2047,@2464| 11285:O1|@11291 11286:S45|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c697374283229 11287:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 11288:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 11289:D2,44|00802b561a1a28000e0c0003030a560856172c0e0e8000022b56192c0e800002000000002400000000000000|@11290,I113| 11290:S54|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c6973742832296c6f6f6b466e283129 11291:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11285| 11292:O4|@35,@863,@11294,@11293 11293:O5|@10328,557,0,557,0 11294:S20|636f646567656e3a20556e617279207475706c65 11295:O1|@11296 11296:D4,76|00822d1a4a000e0e0e0c00021a45000e0e0c000203212d352e360402002b2f2b320c00045029352b31311a2b000c00042a2a69270502013b440e0e0e0e0e0e0e000000004400000000000000|@1785,I105,I218,@11295| 11297:O1|@11298 11298:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11297| 11299:O1|@11300 11300:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11299| 11301:D2,36|008056073c562856392f1a1b00300e7b070300060e0e0e0e000000001c00000000000000|@11280,@7465| 11302:S47|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229676574436f6e737472283129 11303:D53,1884|00832b362c372d3831293528161a50070e0c0003030c2936292502501e133b6402302935280b1a37070c0003030429370220293528051a27070c000303043b5002041a1f07103b502937292502501e453b6464040300311a0e070e0e0e0c00021a09070e0e0c00021a01070e0e0c0002030e2d2a2a35452a36462a37475102292d352e363c28403b1ae5060e0e0c00041ae1062a2c6a2c3c1add060e0e0c00032e2a452b462c47260629352a362b373c28403c1aba060e0e0e0c00041abd062a692f1aa3060c00021aa1060e0e0c000203043b5002041aa706103b502f352937293b1a9f060c00032b38293b1a95060e0e0c00032d36291a8e060e0e0e0c00023b2a291a62060e0e0e0c00021a5d060e0e0c0002031729362b3c1a5b060c0003292b25042504511e253b6502012a65293c1a58060e0c00031a31060e0e0c0002031c22151a21060e0e0c00021a1d060e0e0c00021a15060e0e0c000202013b07dd220f28281a28060e0c00032a3c1a23060c00032a2a1a17060c00032928291a0e060e0e0e0c00033c28403b1ae1050e0e0c00041a01062a22126a22123c1ad7050c0003292b2d6a313c1adf050c000303051ae7050265313b1ae4050e0c000303041adf05103b503b50311ada051adb050c0003280e2a3b6a2a291a8a050e0e0e0c00021a85050e0e0c0002031d29352a362a353d1a68050e0c00030309292503511e283b02013b6502013c64030b291a9d050e0e0c000202012965221d35221e39221f3a222023071a8805122100010001002226221e313134221c0202c60222113333680b29343022162215222932220d220c221f1a5f050c000b333b1a23050c0003293b2a1afe040e0e0e0c00021af9040e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a24050e0c0002221b3b1ae2040e0e0e0c0003221c3b1ad6040e0e0e0c0003293b1abf040c0003221e3b2b1afd040e0e0c00045022111af6041a8f040c000303033c022622111a8a040e0e0e0c00021a85040e0e0c0002031022113b1ad0043b3f1acf040c000602013b03051ac804020222112d1ac4040e0c000222171abf041a94040e0c0003322c3b2d2d3c343c680828072a693c222b0c00023c3b2b2d6b293b69222e35222f363c28403b1a2b040c00042b3c1a2b040c00032232352a2a1a80040e0c0003293b1a7b040c000303041a7704103b503b50293b1a71040e0e0c00030321293c1a59040e0e0c0003322a3b6a642e0e0e0e0c0002292e1a53040c0003640216313b1a3c040e0c000303041a4304103b503b503d32693f2a6922251a37041af0030e0c0003291aa4030e0c00021aa1030e0e0c0002030d2936293b1a87030c00036402013b030d29351a0d042a69293b696502423b2a291a73030c00021a71030e0e0c0002031729362b3c1a6f030c0003292b25042504511e223b6502012a65291ad9031a8a030e0e0e0c0003292c1acf030c000365291acb030c0002291ac8030e0c00023e2a2f3c6b22391abe031a43030c0003343b1a2f030c0003293b2a1a0a030e0e0e0c00021a05030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a30030e0c00022c1a30031ac9020e0e0c000303033c02222c1ac3020c00021ac1020e0e0c000203102c3b1a0d033b3f1a0c030e0c000602013b03051a040302012c2a1a3d030e0e0c00023c1a38031ad1020e0e0c0003302c3b2d2d3b3b3c680828072a6922163b1a6c020e0c000303032902054022172b6a27330fcd220f1a09031a82020e0e0e0c00033c28403b1a55020e0e0c00041af5022a220f6a220f3c1a4b020c0003292b2d6a221935221a39221b3a221c23071ad802121d00010001002222221a30322217220f3232680a29331ac20222122211222532220c220c221b1a4a020e0e0e0c000b323b1a0b020c0003293b2a1ae6010e0e0e0c00021ae1010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a0c020e0c000222173b1aca010e0e0e0c000322183b1abe010e0e0e0c0003293b1aa701020275010c0003221a3b2b1ae1010e0e0c00045022101ada011a73010c000303033c022622101a6e010e0e0e0c00021a69010e0e0c0002031022103b1ab4013b3f1ab3010c000602013b03051aac01020222102d1aa8010e0c00023c1af4011a79010e0e0c0003322c3b2d2d3c343c680828072a69222b1a1d010e0e0c00021a19010e0e0c00021a11010e0e0c00020303290fcc3b222c291afc000e0c00021af9000e0e0c0002031729362b3c1af7000c0003292b25042504511e233b6502012a6522161a90011af5000e0e0c000322223b1ade000e0e0e0c0003293b2a1ab6000e0e0e0c00021ab1000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291adc000e0c00022c1adc001a75000e0e0c000303033c02222c1a6f000c00021a6d000e0e0c000203102c3b1ab9003b3f1ab8000e0c000602013b03051ab00002012c2a1aad000e0e0c00022f1a00011a7d00020215000e0e0c0003312c3b2d2d3c3b3c680828072a692709271627121f040e0e000000005407000000000000|@11305,I251,@11306,I105,I218,I11,@11309,I106,@11310,@11312,I253,@10689,I113,@389,@510,@11315,@739,I232,@10727,@11316,@2047,@2464,@11318,@10765,@2445,I255,I48,I154,@1591,@2447,@11320,I107,I234,@2435,I233,@2438,@2433,@11322,@739,@11325,@2251,@11327,@2388,@10847,@9864,@11329,@10847,@11331,@11332,@739,@11333,@10154,@11304| 11304:O1|@11335 11305:S33|434f444547454e5f50415253455452454528292e636f64654c616d626461283429 11306:O4|@35,@863,@11308,@11307 11307:O5|@10328,798,0,798,0 11308:S42|676574466e426f64793a206e6f74206120636f6e73747261696e656420666e2d65787072657373696f6e 11309:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11310:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@11311,I253,I106,I255| 11311:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429666e4d6b41646472283129 11312:O4|@35,@863,@11314,@11313 11313:O5|@10328,814,0,814,0 11314:S43|636f64654c616d6264613a20626f6479206f6620666e206973206e6f74206120636c61757365206c697374 11315:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11316:O1|@11317 11317:D4,52|00802b3b1a31000e0e0c0003293b1a2b000c000303041a2700103b503b2a693f2a6965420e0e0e0e000000002c00000000000000|@10731,I106,I234,@3695| 11318:D1,52|0080560b561c562d563e2f565f3b12080001000a00680856185629563a3b2d5667310e7b07040006000000002c00000000000000|@11319| 11319:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429636f6465416c7473283129 11320:O1|@11321 11321:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11322:O1|@11323 11323:D1,20|00803c420e0e0e0e000000000c00000000000000|@11324| 11324:S44|434f444547454e5f50415253455452454528292e636f64654c616d62646128342972657350726f632d283129 11325:O1|@11326 11326:D2,28|008028061a19002d3b6b420e0e0e0e0e000000001400000000000000|@10852,@739| 11327:O1|@11328 11328:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11327| 11329:O1|@11330 11330:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11331:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11332:D2,52|0080560a561b562c563d2f565e3b567f6808561856291a1f003b2d5667310e7b070400060e0e0e0e000000002c00000000000000|@11319,@739| 11333:O1|@11334 11334:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11335:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11336:D4,92|00822b352c382d3a2e2306313b2a1a4f000c00021a4d000e0e0c000203282a352b362a2c30220d3356d7220d3422131a36000e0e0e0c000a2a2a2505250526031e333b660201292706440e0e0e0e0e0e000000005400000000000000|@11338,I105,I218,@11337| 11337:O1|@11339 11338:S44|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329 11339:D45,1412|00883338293b1a7f050c0003220c35220d36220e372c3b1a72050e0e0e0c00030304285f02492c1a66050e0e0e0c0002291a60050e0c00021a5d050e0e0c0002032929352a36293b1a41050e0e0c000303032a0213291a43050c00022b2a69641a3d050e0e0c00026502031a3605642d220f1a33050c0003293b2a1a16050e0e0e0c00021a11050e0e0c0002032c2a352b362b3b1af5040e0e0c000303032a020b2a2c1a06050e0e0e0c00032a2a2505250526031e3a3b66020129653b2a291ad2040e0e0e0c00021acd040e0e0c0002031729362b3c1ad7040c0003292b25042504511e253b6502012a650407002a3b1ac1040e0e0c0003031d22112a2a35452a36462a37472a39482a3a492a23064a2a23074b51028c3c28403c1a9a040e0e0e0c00041a95042a6922133629352a363c28403b1a81040e0e0c00041a81042a2c6a2c3c1a69040e0e0c0003292b2d6a1a71042b69342a1a6e040e0e0e0c0003220d2a1a66040e0e0e0c0003221d3a3c2b693c28403b1a3f040c00042930220f2d6b292d692222352223392224230722142c45220c462213472b482d493b4a2a4b261529352a362b372c382d392e3a2f23062217220c1a17040c000329282d1a0e040e0e0e0c00033131312c32323232680804020022112b2b221d0e0e0c00045029350402002a353d1aa0030e0c0003030d1adf032b692a3b452a4651021b3c340c00021ad1032a220e6a3c3b2c2f6b293b692d2a452c46260529352a36221d220e220e220d6b220e2b0e0e0e0c000204020022192b22192e2d1a9f030c00065029352a36291a4f030c0002030c22211a45030e0e0c000202013b031522223b2222221c1a79031a7a030e0e0e0c000602013b2223230d29291a18030e0c00021a15030e0e0c0002032429352a362a35291a54031af5020e0e0c00036403052a68010207292503511e303b6502013b64293b1ad7020c0003036b1a2f03291ad3020c00021ad1020e0e0c0002032429352a362a35291a10031ab1020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a93020c000303041aef02103b503b50293529351adb021a7c020e0c000303043b5002041ad702103b50293765021e293529351abc021a5d020e0e0c000303043b5002041ab702103b50293764650339221c3b1aac020e0c000329291a3f020c00021a3d020e0e0c0002031929352a362a22281a90020e0c000350292503511e243b6502013b6502013b22173b1a2e020e0e0e0c0003031c2c3b1af9010e0e0c0003030331020b312d1a5e020e0e0e0c00030fd02227372228363c2b0e0e0e0c000222141ad7010c00021ad5010e0e0c000203043b5002041a3302103b502214352935293b1aaa010e0e0e0c0003291a20020e0c0002293b2a1aa2010e0e0e0c00021a9d010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965343b1a6e010e0e0e0c000303042210020a2210220c1adb010c0003293b1a53010c000303032a020b2a2a1aca010e0e0e0c000322281ac3010c0002280e2a3b6a2a291a36010e0e0e0c00021a31010e0e0c0002032129352a362a353d1a14010202db000e0c00030309292503511e2c3b02013b6502013c64030b291a81010e0e0c00020201292c3b1ae8000e0c00030303290204402d2b6a222237293b1acf000c0003293b2a1ad2000e0e0e0c00021acd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a2c010e0c00023b22260e0e0c00022a1a20010e0c0002222b1a1b011abc000e0c0003301a14013b2d2d3b313c680828072a693c3b22162c6b223622323b221a221a221a22361af6000e0e0e0c00083b22182219221922351ae8000e0c00063d2a69292c692d2a69271c293b1a30000e0c00030304222a020e222a2a1ac80022250e0e7e2c000327211f09000000007c05000000000000|@11341,I253,I251,@11342,I105,I218,@11344,@371,I48,@11346,@11354,I106,I113,I11,@11356,@11358,@11359,@2047,@2821,@389,@11363,@11364,@11365,@11382,@7465,@103,@2900,@2955,@1840,@10888,@10660,@11383,@2892,@2895,@11385,@11387,@11389,@2464,@2445,@9864,@11394,@10154,@11396,@11403,@11340| 11340:O1|@11413 11341:S58|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229 11342:O1|@11343 11343:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a352a1a28000e0c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@11342| 11344:O1|@11345 11345:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c000203192b352c36291a32000e0e0e0c00022b2a69287c2a69270402013b420e0e0e0e0e0e0e000000003c00000000000000|@2183,I105,I218,@11344| 11346:O1|@11347 11347:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031d2c352d362a2e1a31000e0e0c00032a2f1a2b000c00032a2a69270402013b430e0e0e000000003c00000000000000|@1785,I105,I218,@11348,@11346| 11348:O1|@11349 11349:D5,60|00812c381a39002d690402002b2b2b1a32000e0e0e0c0004502936291a29000e0e0c0002291a2400310e0e0e7d090002000000003400000000000000|@11351,@11352,@2071,@2377,@11350| 11350:O1|@11353 11351:S77|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229706f6c7956617273466f7256616c732d283129 11352:D4,172|00805607291aa8000e0c00021aa5000e0e0c0002038629352a362a3829353c1a96000e0e0e0c00030367293629291a7f000c00021a7d000e0e0c0002032829352a362a352935220c352a2a1a6a000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a4b000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e00000000a400000000000000|@10678,I105,I218,I251| 11353:D6,100|00802b1a62000e0e0e0c00021a5d000e0e0c0002033d2b352c362a36293f1a4f000c0003293b1a4b000c0003641a3c000e0c000264030f291a3d000e0e0c00022b2a6964020a291a2e002e0e7d0500026502013b420e0e0e000000005c00000000000000|@550,I105,I218,I243,I251,@11350| 11354:O1|@11355 11355:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11354| 11356:D4,60|008056073b1a38000e0c000356173b1a2e000e0e0e0c0003292e1a27000c000356373b2b1a21000e0e0c0004502b6642000000003400000000000000|@11357,I253,I106,I255| 11357:S106|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d666e4d6b41646472283129 11358:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11359:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@11361,@11360| 11360:D2,52|00802b352c362a56381a2c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000002c00000000000000|@11362,I107| 11361:S107|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129 11362:S110|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129283129 11363:D1,20|00805607420e0e0e000000000c00000000000000|@9712| 11364:D2,52|00802b352c365628352b2a1a2a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000002c00000000000000|@9714,I107| 11365:O1|@11366 11366:D15,300|0084040300301a27013c31312e1a24010e0c00075029352a362b372b2b2b6a3c1a15010e0e0c00020404002b2b1a0c013b2d1a0b010c00065029352a362b372c382c2c2c2c6b0404002a2a1af6000e0e0e0c00035029352a362b372c382c2c2c2c6b2b293b1ae0000e0c000303033b0285291ad7000c00021ad5000e0e0c000203043b5002041acb00103b5029353b2a1ac5000e0e0c00036403033c0258291aaa000e0e0e0c00021aa5000e0e0c000203043b5002041a9b00103b5029353b2a1a99000e0e0c00036403033b0228291a7a000e0e0e0c00021a75000e0e0c000203043b5002041a7700103b502936292502501e8f3b64641a56000e0e0e0c00022a2219221922191a5a000e0e0e0c000522162a452b4627141f050e0e0e0e0e0e000000002401000000000000|@11368,@10910,@10912,@11369,@11371,@11095,@11104,I251,I105,I218,@2229,I113,I234,@2232,@11367| 11367:O1|@11373 11368:S38|4d415443485f434f4d50494c455228292e636f646542696e64696e675061747465726e283429 11369:O1|@11370 11370:D4,60|00802b3c1a39000e0e0c000303033b02172b3c1a2e000e0e0e0c0003291a28000e0c00022d2a6965420e0e0e0e0e0e0e000000003400000000000000|@11091,I233,I106,@11369| 11371:O1|@11372 11372:D6,68|00802b35293b1a3f000c000303033b021b291a37000c00021a35000e0e0c000203043b5002041a2b00102935293b691a26003b2b3c6b6642000000003c00000000000000|@11094,I251,I105,I218,@2229,@976| 11373:D19,444|00832e3529353e1ab6010e0e0e0c000303152936291aac010e0c00021aa9010e0e0c00026402013b6403043b5002041a9a01102e3529362935293532363337313632373c2a0c00023c3b2b22106b2a3b1a7d010e0e0c000303041a7701103b503d2b693f2a6930291a59010e0e0c00021a55010e0e0c0002034329352a362a3729353d1a3a010e0e0e0c000303043b5002041a43011029362a372a3b341a3c010e0c000450293b220d1a30010e0c0004502c250626051e4f3b270502013b6430293b1afb000c000303033b027b291af3000c00021af1000e0e0c000203043b5002041afb001029353b2a1af7000c00036403033c0252291aca000e0e0e0c00021ac5000e0e0c000203043b5002041acf001029353b2a1ab7000c00036403033b0226291a9e000e0e0e0c00021a99000e0e0c000203043b5002041aab00102936292502501e843b64641a7c000e0c000203033b022a322b3b22121a8f000c00051a8d001a8e0022131a8d000e0e0c00043c2b1a87002c6b3d2a69293b692704333c2d3b22141a78000e0c0006293b1a2f000c000303032a020b2a2a1a66000e0e0e0c00032f2a6927101f040e0e0e0e0e00000000b401000000000000|@11375,I251,I105,I218,@11376,I234,@3695,@11151,I255,@2229,I113,@2232,@11156,@11379,@11380,@11137,@809,@11161,@11374| 11374:O1|@11381 11375:S31|4d415443485f434f4d50494c455228292e636f646542696e64696e67283429 11376:O4|@35,@863,@11378,@11377 11377:O5|@10922,1124,0,1124,0 11378:S42|636f646542696e64696e673a2073686f756c64206265206e61697665207061747465726e206d61746368 11379:S4|42696e64 11380:O3|2,100,0 11381:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11374| 11382:S26|5061747465726e206973206e6f7420657868617573746976652e 11383:O1|@11384 11384:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11383| 11385:O1|@11386 11386:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11385| 11387:O1|@11388 11388:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11387| 11389:O1|@11390 11390:D9,116|00802b1a72000e0e0e0c00021a6d000e0e0c0002034d2b352c362a3729353d1a5e000e0e0e0c000303043b5002041a5300102936293b1a4f000c0003293b1a4b000c000303041a4700103b503d2a693f2a692e1a3e000e0e0e0c00022a2a69270802013b420e0e0e000000006c00000000000000|@1785,I105,I218,I251,@11391,I253,I234,@3695,@11389| 11391:O4|@35,@863,@11393,@11392 11392:O5|@10328,1641,0,1641,0 11393:S7|6c6f616456616c 11394:O1|@11395 11395:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11396:O1|@11397 11397:D18,484|0086311ae2010e0e0e0c00021add010e0e0c00020314301ace010e0e0e0c00021ac9010e0e0c000202013b07d431353236323533363c330e0e0c00022d3729353d1aac010e0c000303043b5002041aa301103b5029362a372a3b2e1a9a010e0e0e0c000450293b220e1a8c010e0c0004502e3b1a7a010e0e0e0c000303363b220d220e220e220e1a72010e0e0e0c000629353d1a5a010e0e0e0c0003030c2922103b1a5b010c0004020728062a22113b6b640fca3b2f291a2e010e0e0e0c00021a29010e0e0c0002031729362b3c1a33010c0003292b25042504511e253b6502012a65220d35220e363c28403b1a18010e0c00041a15012a2c6a2c3c1a05010202d0000e0e0c0003292b2d6a220c2a2215221522151ae4000e0c000629353d1ace000e0e0e0c0003030c2922173b1acf000c0004020728062a22183b6b2e3b1ace000e0e0e0c0003293b2a1a9a000e0e0e0c00021a95000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a980002022a000e0c0002291a90000e0c0002220c1a8b001a8c000e0c00032e1a88003b2d2d3b3b3c680828072a69270f3c3b2f2c6b22103c1a4f000c000332312b22132213221322131a62000e0e0e0c00082b2a69270c02013b1f070e0e00000000dc01000000000000|@11399,I105,I218,I251,@11400,I255,@11403,@2403,I106,I11,@11411,I253,@2445,@9864,@11398,@2047,@10154,@11396| 11398:O1|@11412 11399:S85|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6c6f616446756e6374696f6e73283329 11400:O4|@35,@863,@11402,@11401 11401:O5|@10328,1680,0,1680,0 11402:S13|6c6f616446756e6374696f6e73 11403:O1|@11404 11404:D10,148|00843b30291a90000e0c00021a8d000e0e0c0002031729362b3c1a83000c0003292b25042504511e233b6502012a65291a71001a72000e0e0e0c0003312a1a6b000c00033135323632352b2a1a61000e0e0c0003332a3b6a642b0e0e0e0c00023f2a69332f220f1a4a000e0e0e0c0004291a44000e0c00023e2a2d3c6b270a1f050e0e0e0e0e0e0e000000008c00000000000000|@11406,I105,I218,I106,@11407,@2047,@2821,I107,@11405,@2388| 11405:O1|@11410 11406:S83|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e283229 11407:O1|@11408 11408:D1,20|00802b420e0e0e0e000000000c00000000000000|@11409| 11409:S93|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e2832297661724e6f732d283129 11410:D7,172|00822d1aaa000e0e0e0c00021aa5000e0e0c000203852d352e362e291a91000e0e0c00021a8d000e0e0c0002032429352a362a3529352f352a2a1a7b000c00036603052a68010207292503511e313b6502013b64293b1a5f000c000303051a5b000226293529363035313632352b2a1a4e000e0e0e0c00032d2a3c6a642b0e0e0e0c00023f2a6927062b31311a35000e0e0c00042a2a69270502013b440e0e0e00000000a400000000000000|@1785,I105,I218,I251,@2770,I107,@11405| 11411:D7,132|00802b352c362d372a3b1a7b000c000303041a7700103b502a3b1a73000c000303222a3c1a6d000e0e0c00032c2a2c6a6456480e0e0c00022956571a5a00310e7e0700032903162b3b1a3c000e0c000303041a4700103b503b2c6902162b3b1a26000e0e0e0c000303041a2f00103b503d2c6966420e0e0e000000007c00000000000000|@2434,I234,@2435,I233,I107,@2438,@2433| 11412:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11413:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11340| 11414:O1|@11415 11415:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11414| 11416:D1,76|00802b352c362d372e382f39303a0402002e56882f2f2f2f220c56e93112110001000400121200010001000e0e0c000b5029352a362a2a692709420e0e0e0e0e000000004400000000000000|@11417| 11417:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f636573735461696c283129 11418:D1,76|00802b352c362d372e382f39303a0402002e56882f2f2f2f220c56e93112110001000400121200010001000e0e0c000b5029352a362a2a692709420e0e0e0e0e000000004400000000000000|@11419| 11419:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f63657373426f6479283129 11420:O1|@11421 11421:D7,148|0088321a92000e0e0e0c00021a8d000e0e0c00020368323533360402002b220e2b220d220d220d220d220d220d1a70000e0c000a5029352a360402002a2e2b2210221022102210221022101a56000e0e0e0c000a5029352a362a3b1a4a000e0e0e0c000303032d020b2d2b1a3e000e0e0e0c000322112a452b4627090205313b4534461f090e0e0e000000008c00000000000000|@9684,I105,I218,@11423,@11420,I251,@11422| 11422:O1|@11430 11423:O1|@11424 11424:D10,244|008833363437220c38293b1aea000e0e0e0c0003293b1ae3000c000303041adf00103b502935220c2e1ad8000e0c000329282e1ace000e0e0e0c00030402002f2b2213220f220f2e221322150e0c00085029352a363c220f0e0c00022f3629353d1a98000e0c000303043b5002041a97001029362a372a3b2e1a90000e0c000450293b22131a84000e0c000450323b692922122214221722171a74000e0c000629352a363c3b32346b293b692c3b1a4b000c0003030329020b292d1a56000e0e0e0c0003293b1a33000c00030304220c020a220c2a1a40000e0c0003221e2a452e4627161f090e0e00000000ec00000000000000|@11426,I253,I251,@2309,@389,@9699,I255,@9724,@11427,@11425| 11425:O1|@11429 11426:S65|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829636f646553747275637475726542696e64283229 11427:O1|@11428 11428:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11427| 11429:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11425| 11430:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11422| 11431:O1|@11432 11432:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11431| 11433:O1|@11434 11434:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11433| 11435:O1|@11436 11436:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11435| 11437:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@10214| 11438:D8,132|008156092d2a1a7f000c00021a7d000e0e0c000203043b5002041a7300102a352b362b3b1a6d000e0e0c000303042a3602162b3c1a61000e0e0c00032a2a2505250526031e3f3b642704293629353d1a4a000e0e0e0c000303142a2e564756581a3d000e0e0c00053c2a696402022a3565430e0e0e0e0e0e000000007c00000000000000|@10072,I105,I218,@878,I113,I107,I251,@9996| 11439:O1|@11440 11440:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11439| 11441:O1|@11442 11442:D2,36|00802b352c362d372e382f391a1900300e0e0e7b07030006000000001c00000000000000|@11444,@11443| 11443:O1|@11445 11444:S25|434f44455452454528292e6d6b4d6163726f50726f63283129 11445:D14,236|00842c3b1ae9000e0e0c0003036e2d1ae2001adb000c000303033c02222d1ad7000c00021ad5000e0e0c000203102d3b1ac1003b3f1ac8000e0c000602013b03051ac00002012d2d1abd000e0e0c0002301ab8001ab9000e0e0c0003322c3b2d2d3b343c68083b2a1aa9006a3b2a1aa7000c00033d3b2b6a270602602d1a74001a6d000e0e0c000303033c02222d1a67000c00021a65000e0e0c000203102d3b1a51003b3f1a58000e0c000602013b03051a500002012d2d1a61000e0e0c0002301a5c001a49000e0e0c0003322c3b2d2d3b343c680828072a6927041f050e0e00000000e400000000000000|@11444,I251,I48,I105,I218,I154,@1591,@11447,@11449,@2047,@11451,@11457,@11459,@11446| 11446:O1|@11461 11447:O1|@11448 11448:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c362a353f1a40000e0c000303043b5002041a3700102a362a1a34000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2449,@11447| 11449:O1|@11450 11450:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11451:O1|@11452 11452:D2,20|00801a1300100e0e000000000c00000000000000|@11454,@11453| 11453:O4|@35,@863,@11456,@11455 11454:S28|434f44455452454528292e6d6b4d6163726f50726f63283129283129 11455:O5|@865,362,0,362,0 11456:S20|6d6b4d6163726f50726f633a20636c6f73757265 11457:O1|@11458 11458:D4,92|00812c3b1a59000e0e0c0003030e1a530028452d3b6b293b6964022c2c352d362a35291a3e001a37000c000364030d292e1a34002f0e0e0e7e060003292e1a27000c00032b2a6966430e0e0e0e0e0e0e000000005400000000000000|@2413,I251,@34,@11457| 11459:O1|@11460 11460:D6,84|00802b1a52000e0e0e0c00021a4d000e0e0c000203292b352c362a353f1a40000e0c000303043b5002041a3700102a362a1a34000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000004c00000000000000|@1785,I105,I218,I251,@2449,@11459| 11461:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11462:O1|@11463 11463:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11462| 11464:D10,124|00802b352c362d372e382f392b1a70001a71000e0e0c000303033c02222b1a67000c00021a65000e0e0c000203102b3b1a4d003b3f1a58000e0c000602013b03051a500002012b2b1a4d000e0e0c00022e1a48001a49000e0e0c0003302c3b2d2d3c323c680828072a692709420e0e0e000000007400000000000000|@3751,I48,I251,I105,I218,I154,@1591,@2447,@11465,@2047| 11465:O1|@11466 11466:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 11467:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9691| 11468:O1|@11469 11469:D1,28|00802b352c372a2a6965420e0e0e0e0e000000001400000000000000|@11470| 11470:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f706465637328332964656275677c636f64652d283129 11471:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9687| 11472:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9683| 11473:O1|@11474 11474:D10,212|00802b353c1ad0000e0c000303033b02b12b353b1ac1000e0e0c0003033a2b36291ab8000e0c0002293b2a1ab2000e0e0e0c00021aad000e0e0c000203152a352b362a2c692a2a2505250526031e233b660201292704026a2b362c37293b1a87000c00032b1a84001a85000e0e0c00032a1a80000e0c0002293b2a1a62000e0e0e0c00021a5d000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a2e000e0e0e0c000303032b020b2b2a1a3e00330e7e0900032706420e0e0e0e0e00000000cc00000000000000|@11476,I251,@11477,I105,I218,I253,@2364,@10161,@11479,@11475| 11475:O1|@11483 11476:S45|535452554354555245535f28292e67656e636f6465537472756374732832296c6f6164546f7064656373283129 11477:O1|@11478 11478:D10,148|00802b1a92000e0e0e0c00021a8d000e0e0c000203692b352c362a3a293b1a7f000c0003293b1a7b000c000303041a7700103b502935293729353d1a66000e0e0e0c000303043b5002041a5f00102936293b1a4b000c0003293b1a53000c000303041a4f00103b503d2a693f2a69311a46000e0e0e0c00022a2a69270b02013b420e0e0e0e0e0e0e000000008c00000000000000|@1785,I105,I218,I253,I251,@2309,@9699,I234,@3695,@11477| 11479:O1|@11480 11480:D5,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a35291a30000e0c00022b1a2c000e0c00022a2a69270502013b420e0e0e000000003c00000000000000|@1785,I105,I218,@11481,@11479| 11481:O1|@11482 11482:D11,196|00802b353f1ac0000e0c000303342b362c372936291ab4000e0c000229353d1aa6000e0e0e0c0003030e292d3b1aa000320e0e7b0507000428062a2e3b6b270402722b353d1a80000e0c000303502b362c372a3b1a7d000e0e0c00032a3b1a73000c000329353b2a1a6d000e0e0c0003293b1a67000c000303043b5002041a5f00102c3b1a5d000e0e0c000303041a5700103b503d2d693f2a69270702162b353c1a24000e0c000303043b5002041a3b00102b36420e0e0e00000000bc00000000000000|@2402,I251,@11481,@2403,I253,I107,I113,@2369,I234,@2367,@2401| 11483:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11475| 11484:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@9584| 11485:O1|@11487 11486:S45|434f4d50494c45525f424f445928292e62617365436f6d70696c657228332965786563757465436f6465283129 11487:D6,172|00812b350406002a1aa5002a1aa5000e0e0c00021aa1000e0e0c0002031c2a352b362a2c341a94000e0c00042a2a2505250526031e292603021629362c2a35452a36462a37472a38482a39492a3a4a515129352a362b372c382d392e3a2e3b1a5e000e0e0e0c00032d3b1a53000c00032b3b1a4b000c00032e3b1a43000c0003313b1a3b000c00032f3b1a33000c00032e2b2f2e2d316806270e430e0e0e0e0e00000000a400000000000000|@11489,@11490,I105,I218,@11496,@11488| 11488:O1|@11546 11489:S29|535452554354555245535f28292e706173733453747275637473283229 11490:O4|0,@6349,0,@11491 11491:O1|@11492 11492:D2,20|00801a1300100e0e000000000c00000000000000|@11494,@11493| 11493:O4|11,@316,0,@11495 11494:S39|535452554354555245535f28292e706173733453747275637473283229726573756c742d283129 11495:O5|@8767,3255,0,3255,0 11496:O1|@11497 11497:D21,660|00822c352d3629352a362b372c382d392e3a3437220c38220e353c1a7a020e0e0e0c00030338220e36292b1a6e020e0e0e0c00032e3b1a5f020c0003030329020b292f1a5a020e0e0e0c0003333333332d336806220d2a30306b27040fd1220e353b1a33020c00030360220e36332f690402002b2b2a1a2b020c00021a29020e0e0c000203202a352b362a2c2215331a1a020e0e0e0c00052a2a2505250526031e2b26030209292c2a35452a3646515129352a36220c220c220c2c220c220c68062b2a32326b27060fdc220e36220f37293b1adb010c0003220c3b690402002b2b2a1abf010c00021abd010e0e0c0002039f2a352b362a3629353b1a9a010e0e0e0c000303043b5002041aa7011029362a372d372f353036221b353d1a79010e0e0c00030310221b2b3b1a8b0102024e010c000402072806221c2c3b6b3c2a692e353c1a52010e0e0e0c0003030d2e36293b1a5b010c00036402022e363c28402b1a58010e0c00043c2a333b6b2c2a326a303c1a4a010e0e0e0c00032a31692a2a69220f2a2513251326111eaa26110209292c2a35452a3646515129352a36293b1af4000202d7000e0c000303051a130102903b2a291aeb000c00021ae9000e0e0c0002031729362b3c1af3000c0003292b25042504511e223b6502012a65291ae5001ae6000e0e0e0c000303041adf00103b502928403b1ac1000e0e0c00043b2c293b1a91000e0e0c000303043b50022629352a362d2d2c1ab8000e0c0004502c3c1a9a000e0e0e0c0003292b2505250526031e32260351291a9b000c00025029651a9600322b220c6b2c221269040200332c2c2c221b1a85000e0e0c00065029352a362e1a7b000c0002220f2a1a4e000e0e0e0c00032c2c2b326b270f270a440e0e0e0e0e0e000000008c02000000000000|@11499,I251,@11500,@11508,I105,I218,@11510,I253,@11518,@2403,I11,I106,I49,16777215,I231,@3560,I255,I47,@11520,@11498,I15| 11498:O1|@11522 11499:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229 11500:O1|@11501 11501:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c0002032d2c352d362a362b37293b1a3d000e0e0c000329311a37000c00032c2a692e331a30000e0c00032a2a69270802013b430e0e0e000000004c00000000000000|@1785,I105,I218,I253,@11502,@11500| 11502:O1|@11503 11503:D10,156|00812c352d362e372f383039313a1a8f00322e2c6b1a8c002c2b6a30353c1a87000c00030359303631382a3b1a7d000e0e0c00032a3b1a73000c0003293b1a6b000c0003293b1a67000c000303051a630002242928403b1a5e000e0e0e0c00042b3c2b3b2e1a54000e0c000650291a4f000c00025029643b2d2b6a2706020130293131312e3168062709430e0e0e0e0e000000009400000000000000|@11505,@11506,@11504,I251,I253,I113,I49,I11,I195,I47| 11504:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 11505:S61|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e6174757265283129 11506:D7,124|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a66000e0e0e0c000356182a2a1a5d000e0e0c00021a59000e0e0c000203043b5002041a4f00102a352b362b3b1a49000e0e0c000303032a02172b3c1a2a000e0e0e0c00032a2a2505250526031e413b642705420e000000007400000000000000|@11507,I234,I107,I105,I218,@878,I113| 11507:S70|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e61747572652831296d6170494473283129 11508:O1|@11509 11509:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11508| 11510:O1|@11511 11511:D15,428|00832e382f3a2f35303630353d1aa0010e0c0003030c302b3b1a98010e0c000402062806312c3b6b2c3b1a8b010c0003293b1a7b010c000303041a7f01103b502935293529352a372c362d382e392c352d362e372f383039313a1a630122162e2c6b1a5f012c2b6a30353c1a42010e0e0e0c00030359303631382a3b1a39010e0e0c00032a3b1a2f010c0003293b1a27010c0003293b1a2f010c000303051a2b0102242928403b1a26010e0e0e0c00042b3c2b3b2e1a1c010e0c000650291a17010c00025029643b2d2b6a2706020130293131312e316806220f3622103822102b2d2c6b220e35220f3622103722113822123922133a1ae3002d2b221a22142212222868071ad8002c2b6a30353c1a9f000c00030359303631382a3b1a99000e0e0c00032a3b1a8f000c0003293b1a87000c0003293b1a8f000c000303051a8b0002242928403b1a86000e0e0e0c00042b3c2b3b2e1a7c000e0c000650291a77000c00025029643b2d2b6a2706020130293131312e3168063c22206934221b2b2d221c680522233c1a59000e0e0c000322262b69292225692b2a6927291f040e00000000a401000000000000|@11513,I251,@2403,I253,@2309,@11514,@11516,I113,I49,I11,I195,I47,@11517,@11512,I106| 11512:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 11513:S66|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e64283229 11514:D7,124|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a66000e0e0e0c000356182a2a1a5d000e0e0c00021a59000e0e0c000203043b5002041a4f00102a352b362b3b1a49000e0e0c000303032a02172b3c1a2a000e0e0e0c00032a2a2505250526031e413b642705420e000000007400000000000000|@11515,I234,I107,I105,I218,@878,I113| 11515:S75|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e642832296e65774d6170283129 11516:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 11517:D11,340|00802b56181a50010e0c000303562b56181a48010e0c000356172a2a1a41010e0e0c00021a3d010e0e0c000203043b5002041a3301102a352b362b3b1a2d010e0e0c000303032a02172b3c1a0e010e0e0e0c00032a2a2505250526031e413b6427050fdb2b561b1aee000e0e0e0c000303c72b561b1ae4000e0c0003040300562a2b2a1ada000e0e0e0c00021ad5000e0e0c000203043b5002041acb00102a352b362b3b1ac5000e0e0c0003030e2a2e2a35452a36462a37475102132b3c1a9b000c00032a2a2505250526031e4a50260429352a362b3729352a362b3756891a8e001a8f000c000303033c022656891a6e000e0e0e0c00021a69000e0e0c0002031056893b1a68003b3f1a6b000c000602013b03032b02155689282e1a5d000e0e0c0003292d1a53000c000364292c2c6a30302b6a270a020b2b561c2c02020300800002420e0e0e000000004c01000000000000|@11515,I231,I107,I105,I218,@878,I113,I48,I251,I154,@389| 11518:O4|@35,@863,@8984,@11519 11519:O5|@8767,3162,0,3162,0 11520:D9,108|00802b56191a68000e0c0003030a2b56172c0e0e0e8000022b56191a56000e0e0e0c0003291a50000e0c00021a4d000e0e0c000203033c021456181a42000e0e0e0c00022a2a1a3b000c00036403041a3600103b5056182a1a31002e7e040003000000006400000000000000|@11521,I234,I107,I105,I218,I15,I247,@866,I253| 11521:S58|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296d617054797065496473283129 11522:D8,316|00842d352e3629352a362b372c382d392e3a220e353b1a27010c00030352220e37293b1a1e010e0e0e0c000329220f2a1a15010e0e0c00021a11010e0e0c000203202a352b362a2c221222161a01010e0e0c00052a2a2505250526031e2d3b66020a2922102a35452a364664270402bc220e353c1ac9000e0e0c00030352220e3629220e2a1ac0000e0c00021abd000e0e0c0002032d2a352b360402002b22142e2c22141aad000e0e0c00065029352a362a2a692d2a2508250826061e383b2706020a29220f2a35452a36466466025c220e37312b690402002b2b2a1a69000e0e0c00021a65000e0e0c000203202a352b362a2c221322171a5d000e0e0c00052a2a2505250526031e2d26030209292c2a35452a3646515129352a3633333333332e680622112c452a46270627081f05000000003401000000000000|@11524,I251,I253,I105,I218,@11525,@11498,@11523| 11523:O1|@11543 11524:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374537472756374283329 11525:O1|@11526 11526:D21,740|00832e353d1ae0020e0c000307cf2e3629352a363035313629352a362b372c382d392e3a303b69040200332b2a1abc020e0c00021ab9020e0e0c000203742a352b362a352b362c382d392f353036221a353d1a93020c0003030c221a2b3b1a93020c000402072806221b2c3b6b3c2a6930302b31313b3b68072d3c1a7a020e0e0e0c00032a3b69293b1a5c020e0c000303032e020b2e2a1a62020e0e0e0c00032b2a69220d2a25112511260f1e80260f0209292c2a35452a3646515129352a36220d2a692922131a36021a37020c0004220f350402002a2a1a2d02020223000e0e0c0003502936292d6929220f6922102a22102210221022106806322a6927170fdb2e353b1ae0010e0c000303292e362f372a2a693035313629352a362b372c382d392e3a312f69292f2f2f2f2f6806322a69270d0fdb2e353c1aab010c000307d72e362e352f3629352a362b372c382d392e3a313729352a362b382c391aab012a22126a2d353c1a7d010e0e0c000303592d362e382a3b1a95010e0e0c00032a3b1a8b010c0003293b1a83010c0003293b1a7f010c000303051a7b0102242928403b1a76010e0e0e0c00042b3c2b3b2e1a6c010e0c000650291a67010c00025029643b2d2b6a270602012d292e3b2f2e3b68062210352215353d0202f2001a06010e0e0e0c00030310221522113b1a02010e0e0e0c000402082806221622123b6b3c2a692213382c2b2f2c6b22143c0202bd001ae100020220000e0e0c00032e2b6929221069221522152215221522152e68062c2a69271a02962e3629352a362b372c382d393335343629352a362b372c382d392e3a33353e1a8b000c000303033302242211353d1a7c000e0c0003030c2211313b1a7b000c0004020728062212323b6b3c2a69641a9c002212691a9a002a69220c1a97002b1a97000c0004221022102e2c22103b3b6807220c3c1a46000e0e0e0c000322122b69293469220d220d2b220d220d220d68062c2a6927171f040e0e0e0e0e00000000dc02000000000000|@11528,I251,I105,I218,@2403,I106,@11529,I48,@7583,@1936,@11531,I253,I113,I49,I11,I195,I47,@11532,@11534,@11527,@1914| 11527:O1|@11541 11528:S56|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296d616b6544656373283229 11529:O1|@11530 11530:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@11529| 11531:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 11532:D2,52|00802b3629353b1a2e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000002c00000000000000|@11533,I251| 11533:S69|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129636f70794964283129 11534:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@11536,@11537,@11535,@1919| 11535:O1|@11540 11536:S81|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129 11537:O1|@11538 11538:D1,20|00802b420e0e0e0e000000000c00000000000000|@11539| 11539:S84|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129283129 11540:D1,20|00802b420e0e0e0e000000000c00000000000000|@11539| 11541:D1,20|00802b420e0e0e0e000000000c00000000000000|@11542| 11542:S63|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129283129 11543:D12,252|00832e352f3630383035313631353d1aee000e0e0e0c0003030c312b3b1ae4000e0c000402062806322c3b6b2c3b1ad7000c0003293b1ac7000c000303041acb00103b502935293729352a362b382c391abd002a22116a2d353c1aa3000c000303592d362e382a3b1a9d000e0e0c00032a3b1a93000c0003293b1a8b000c0003293b1a8f000c000303051a8b0002242928403b1a86000e0e0e0c00042b3c2b3b2e1a7c000e0c000650291a77000c00025029643b2d2b6a270602012d292e3b2f2e3b6806220c3c1a5e000e0e0e0c00033b221169293b693c220e6922122a2f2d6b22132a69292212692f2a6927171f0400000000f400000000000000|@11545,I251,@2403,I253,@2309,@11544,I113,I49,I11,I195,I47,I106| 11544:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 11545:S68|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296578747261637453747275637475726542696e64283229 11546:D5,68|00812c1a42000e0e0e0c00021a3d000e0e0c0002031e2c352d362a352a2a1a2f000c00032c30692a2a1a2800320e0e0e7e0900032b430e0e000000003c00000000000000|@11548,I105,I218,@11547,@11488| 11547:O1|@11549 11548:S41|535452554354555245535f28292e70617373345374727563747328322972657646696c746572283229 11549:D8,172|00812c1aaa000e0e0e0c00021aa5000e0e0c000203852c352d362a352e2a1a97000c000303033c024a2e1a83000c00021a81000e0e0c00020314291a72000e0e0e0c00021a6d000e0e0c000202013b03212e3b2b3b3f2e1a62000e0e0e0c00021a5d000e0e0c00031a59000e0e0c000602013b1a3e000e0e0e0c000264030f292e1a44000e0c00032b2a6964020a292e1a35002f7e0600036502013b430e0e0e00000000a400000000000000|@550,I105,I218,I251,I223,I239,I154,@11547| 11550:O1|@11551 11551:D26,764|00811afb023b1afb020c0003291af8021af9020e0e0c0003502c3c1ae6020e0e0e0c00031ad9023b1ad9020e0e0c0003292b1ad7020c0003503c28403b1ad0020e0c0004293b1acb021acc020e0c0004502f1ac7020c0002293f1ac3020c00036403033b02362f3e1a99020e0e0c0003291ab0020e0c00021aad020e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64293b1a8b020c000303043b5002b6293529352a372a1a7c021a75020e0e0c000303033c02222a1a5f020c00021a5d020e0e0c000203102a3b1a59023b3f1a58020e0c000602013b03043b50022d1a14023b1a14020e0c0003291a40021a11020e0e0c0003501afc013b1afc010e0c0003292d1afb010c00032603293b1a21020e0e0c000303043b5002381ad7013b1ad7010c0003291a0c021ad5010e0e0c0003502a3c1a02020e0e0e0c00031ab5013b1ab5010e0e0c0003292b1ab3010c0003260426031a9d013b1a9d010e0e0c0003291ad8011a99010e0e0c00035032291aa6010e0e0e0c00021aa1010e0e0c0002033629352a361a6b013b1a6b010c0003292c1a6b010c0003501a58013b1a58010e0c000329401a57010c0003502b250526041e44260402023b50501a36013b1a36010e0e0e0c0003291a74011a31010e0e0c0003501a1c013b1a1c010e0c000329392a1a5e012b1a5e010e0e0e0c0004503c28403b1a0c010e0c0004293b1a07011a08010e0c000450220c1a02010e0e0e0c0002293f1afb000c00036403033b0236220c3e1ad0000e0c0003291ae8000e0c00021ae5000e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291abc000e0c00021ab9000e0e0c000203043b500212220d35220e36220f372b2b2b1acf006b6610293529352a362b372c382d393c28403b1a71000e0e0c0004293b1ab3001a6c000e0c00045022143b1a4d000e0e0c000322153c1a42000e0e0e0c000322163d1a36000e0e0e0c000331302f333268052c2c2c2c6b291a7c00221a0e0e7d1b00020e0e0e0e00000000f402000000000000|@11553,@14557,I253,@11554,@333,I11,@495,I255,I15,I250,I105,I218,I251,I48,I154,@11555,I113,@11556,@510,@11557,@11552,@457,@279,@524,@493,I14| 11552:S14|456e64206f662074726163650a0a 11553:S30|506f6c794d4c2e457863657074696f6e2e7072696e745472616365283229 11554:S32|457863657074696f6e20747261636520666f7220657863657074696f6e202d20 11555:S11|2072616973656420696e20 11556:S6|206c696e6520 11557:S2|0a0a 11558:O2|3,@11559 11559:S24|436f6d70696c6174696f6e20696e7465727275707465640a 11560:O4|1,@474,0,@11561 11561:O5|@11562,220,0,220,0 11562:S36|6d6c736f757263652f4d4c436f6d70696c65722f434f4d50494c45525f424f44592e4d4c 11563:S26|457863657074696f6e2d20496e7465726e616c4572726f723a20 11564:S23|20726169736564207768696c6520636f6d70696c696e67 11565:O5|@11562,229,0,229,0 11566:S11|457863657074696f6e2d20 11567:S36|20756e65787065637465646c7920726169736564207768696c6520636f6d70696c696e67 11568:O3|3,@11591,@695 11569:O3|3,@11570,@5440 11570:O2|@11572,@11571 11571:O2|@11574,@11573 11572:O2|49,@5449 11573:O2|@11579,0 11574:O2|50,@11575 11575:O3|2,@1461,@11576 11576:O5|5,@11577,@5590,@5447,@690 11577:O2|@11578,0 11578:O5|5,0,@2209,@2207,0 11579:O2|51,@11580 11580:O5|5,@11581,@1249,@1247,@690 11581:O2|@11582,0 11582:O5|5,0,@11584,@11583,@690 11583:O3|@11584,@690,@11585 11584:S9|756e6976657273616c 11585:O3|@11587,@11590,@11586 11586:O3|@11584,@717,@716 11587:O2|1,@11588 11588:O3|2,@11589,0 11589:O4|0,@196,3,1 11590:O4|1,@197,0,0 11591:O2|@11593,@11592 11592:O2|@11596,0 11593:O2|49,@11594 11594:O5|5,@11595,@5590,@5447,@690 11595:O2|@1460,0 11596:O2|50,@11597 11597:O5|5,@11598,@5590,@5447,@690 11598:O2|@11599,0 11599:O3|2,@1461,@11600 11600:O3|3,@11602,@11601 11601:O3|0,@11620,1 11602:O2|@11604,@11603 11603:O2|@11607,@11606 11604:O2|@11605,@5462 11605:S5|6669786573 11606:O2|@11610,@11609 11607:O2|@11608,@5523 11608:S5|7479706573 11609:O2|@11613,@11612 11610:O2|@11611,@5503 11611:S6|76616c756573 11612:O2|@11616,@11615 11613:O2|@11614,@5543 11614:S8|66756e63746f7273 11615:O2|@11618,0 11616:O2|@11617,@5483 11617:S10|7369676e617475726573 11618:O2|@11619,@5565 11619:S10|73747275637475726573 11620:O2|@11605,@11621 11621:O2|@11608,@11622 11622:O2|@11611,@11623 11623:O2|@11614,@11624 11624:O2|@11617,@11625 11625:O2|@11619,0 11626:O2|@1652,@11627 11627:O2|@11628,0 11628:O4|@23,69,@1650,0 11629:O2|@1444,@11630 11630:O2|@11631,0 11631:O4|@23,69,@1442,0 11632:O2|@1023,@11633 11633:O2|@11634,0 11634:O4|@23,69,@11635,0 11635:O7|@1023,@1683,@11637,@11636,@690,0,0 11636:O3|2,@767,@970 11637:O2|1,@11638 11638:O3|2,@1019,@11639 11639:O2|@11640,0 11640:O4|@34,69,@11641,0 11641:O3|2,3,@11642 11642:O6|@874,@850,@11643,@999,@982,@848 11643:O2|@894,@11644 11644:O2|@11646,@11645 11645:O2|@11651,@11650 11646:O2|@2743,@11647 11647:O3|0,@11648,@876 11648:O8|@11649,@1023,0,0,@991,0,0,1 11649:O4|13,3,@993,4 11650:O2|@11656,0 11651:O2|@11653,@11652 11652:O3|0,@11655,@876 11653:O2|1,@11654 11654:O2|2,11 11655:O8|@1437,@1023,0,0,@2698,0,0,1 11656:O2|@2762,@11657 11657:O3|0,@11658,@876 11658:O8|@1172,@1023,0,0,@2698,0,0,1 11659:O2|@1635,@11660 11660:O2|@11661,0 11661:O4|@23,69,@1633,0 11662:O2|@1379,@11663 11663:O2|@11664,0 11664:O4|@23,69,@1377,0 11665:O2|@11667,@11666 11666:O2|@11668,0 11667:S7|636f6e74657874 11668:O4|@27,69,@11669,0 11669:O2|@11671,@11670 11670:O2|@11708,@11707 11671:O3|@11667,@690,@11672 11672:O3|@11674,@11705,@11673 11673:O3|@11706,@717,@716 11674:O2|1,@11675 11675:O3|2,@11677,@11676 11676:O2|@11680,0 11677:O4|@11678,@45,3,1 11678:O1|@11679 11679:D1,20|00813b430e0e0e0e000000000c00000000000000|@1036| 11680:O4|@34,69,@11681,0 11681:O3|2,4,@11682 11682:O6|@874,@850,@11684,@11689,@11683,@848 11683:O12|@11691,@11694,@11696,@11693,@11692,@11699,@11701,@11703,@11690,@11678,@45,@11677 11684:O2|@894,@11685 11685:O2|@11687,@11686 11686:O2|@11688,@899 11687:O2|@988,@1125 11688:O2|@1361,@855 11689:O11|2,2,2,2,2,2,2,2,2,1,2 11690:O3|@11699,@11701,@11703 11691:O3|@11677,@11692,@11690 11692:O3|@11694,@11696,@11693 11693:O1|@11698 11694:O1|@11695 11695:D2,28|00802b353b1a18002d0e0e0e7e030003000000001400000000000000|@1092,I251| 11696:O1|@11697 11697:D1,20|00803b2c69420e0e000000000c00000000000000|@1092| 11698:D1,20|00802b36420e0e0e000000000c00000000000000|@1092| 11699:O1|@11700 11700:D2,28|00802b353c1a18002d0e0e0e7e030003000000001400000000000000|@1095,I251| 11701:O1|@11702 11702:D1,28|00802b352c363c2b2b6a65420e0e0e0e000000001400000000000000|@1095| 11703:O1|@11704 11704:D1,28|00802b362c372a2a6965420e0e0e0e0e000000001400000000000000|@1095| 11705:O4|1,@198,0,0 11706:S14|506f6c794d4c2e636f6e74657874 11707:O2|@11731,0 11708:O7|@1092,@8969,@11710,@11709,@690,0,0 11709:O3|2,@1394,@11730 11710:O2|1,@11711 11711:O3|2,@11692,@11712 11712:O2|@11713,0 11713:O4|@34,69,@11714,0 11714:O3|2,3,@11715 11715:O6|@874,@850,@11716,@11689,@11683,@848 11716:O2|@894,@11717 11717:O2|@11719,@11718 11718:O2|@11724,@11723 11719:O2|@1208,@11720 11720:O3|0,@11721,@876 11721:O8|@11722,@1092,0,0,@991,0,0,1 11722:O4|13,0,@993,1 11723:O2|@11727,0 11724:O2|@1217,@11725 11725:O3|0,@11726,@876 11726:O8|@1167,@1092,0,0,@2698,0,0,1 11727:O2|@1223,@11728 11728:O3|0,@11729,@876 11729:O8|@1172,@1092,0,0,@2698,0,0,1 11730:O5|5,0,@11667,@11671,@690 11731:O7|@1095,@8969,@11733,@11732,@690,0,0 11732:O3|2,@11753,@11730 11733:O2|1,@11734 11734:O3|2,@11690,@11735 11735:O2|@11736,0 11736:O4|@34,69,@11737,0 11737:O3|2,3,@11738 11738:O6|@874,@850,@11739,@11689,@11683,@848 11739:O2|@894,@11740 11740:O2|@11742,@11741 11741:O2|@11747,@11746 11742:O2|@1695,@11743 11743:O3|0,@11744,@876 11744:O8|@11745,@1095,0,0,@991,0,0,1 11745:O4|13,1,@993,1 11746:O2|@11750,0 11747:O2|@1701,@11748 11748:O3|0,@11749,@876 11749:O8|@1704,@1095,0,0,@1703,0,2,1 11750:O2|@1276,@11751 11751:O3|0,@11752,@876 11752:O8|@1723,@1095,0,0,@1722,0,2,1 11753:O3|3,@11754,@695 11754:O2|@5467,@11755 11755:O2|@11756,0 11756:O2|50,@767 11757:O2|@1470,@11758 11758:O2|@11759,0 11759:O4|@27,69,@11760,0 11760:O2|@1469,0 11761:O2|@1577,@11762 11762:O2|@11763,0 11763:O4|@23,69,@1575,0 11764:O2|@1231,@11765 11765:O2|@11766,0 11766:O4|@23,69,@1229,0 11767:O2|@1426,@11768 11768:O2|@11769,0 11769:O4|@23,69,@1424,0 11770:O2|@11772,@11771 11771:O2|@11773,0 11772:S16|6164645072657474795072696e746572 11773:O4|@23,69,@11774,0 11774:O7|@11772,2,@11776,@11775,@690,0,0 11775:O3|2,@11777,@1461 11776:O2|3,1 11777:O3|2,@768,@11778 11778:O3|2,@11780,@11779 11779:O3|2,@11781,@970 11780:O3|6,@199,79992 11781:O3|6,@200,79992 11782:O2|@1030,@11783 11783:O2|@11784,0 11784:O4|@23,69,@11785,0 11785:O7|@1030,@1683,@11787,@11786,@690,0,0 11786:O3|2,@11816,@970 11787:O2|1,@11788 11788:O3|2,@1002,@11789 11789:O2|@11790,0 11790:O4|@34,69,@11791,0 11791:O3|2,3,@11792 11792:O6|@874,@850,@11793,@999,@982,@848 11793:O2|@894,@11794 11794:O2|@11796,@11795 11795:O2|@11803,@11802 11796:O2|@11798,@11797 11797:O3|0,@11800,@876 11798:O2|1,@11799 11799:O2|2,14 11800:O8|@11801,@1030,0,0,@991,0,0,1 11801:O4|13,4,@993,4 11802:O2|@11811,0 11803:O2|@11805,@11804 11804:O3|0,@11807,@876 11805:O2|1,@11806 11806:O2|2,15 11807:O8|@11808,@1030,0,0,@1703,0,2,1 11808:O3|10,@1706,@11809 11809:O3|14,@11810,1 11810:O2|@836,@1711 11811:O2|@11813,@11812 11812:O3|0,@11815,@876 11813:O2|1,@11814 11814:O2|2,16 11815:O8|@1723,@1030,0,0,@1722,0,2,1 11816:O3|3,@11817,@695 11817:O2|@5467,@1732 11818:O2|@1112,@11819 11819:O2|@11820,0 11820:O4|@27,69,@11821,0 11821:O2|@1111,@11822 11822:O2|@11824,@11823 11823:O2|@1681,@11896 11824:O7|@1007,@1683,@11826,@11825,@690,0,0 11825:O3|2,@11879,@970 11826:O2|1,@11827 11827:O3|2,@1003,@11828 11828:O2|@11829,0 11829:O4|@34,69,@11830,0 11830:O3|2,3,@11831 11831:O6|@874,@850,@11832,@999,@982,@848 11832:O2|@894,@11833 11833:O2|@11835,@11834 11834:O2|@11839,@11838 11835:O2|@1208,@11836 11836:O3|0,@11837,@876 11837:O8|@10472,@1007,0,0,@991,0,0,1 11838:O2|@11867,0 11839:O2|@1217,@11840 11840:O3|0,@11841,@876 11841:O8|@11843,@1007,0,0,@11842,0,4,1 11842:O2|@11860,0 11843:O3|10,@11845,@11844 11844:O3|14,@11853,1 11845:O2|@1708,@11846 11846:O2|@1709,@11847 11847:O2|@11849,@11848 11848:O2|@11851,0 11849:O4|1,@845,2,@11850 11850:O4|6,@739,2,0 11851:O4|1,@845,3,@11852 11852:O4|6,@739,3,0 11853:O2|@809,@11854 11854:O2|@1713,@11855 11855:O2|@1714,@11856 11856:O2|@11858,@11857 11857:O2|@11859,0 11858:O2|4,@1224 11859:O2|4,@2598 11860:O2|1,@11861 11861:O2|@996,@11862 11862:O2|@1718,@11863 11863:O2|@11865,@11864 11864:O2|@11866,0 11865:O3|2,2,@845 11866:O3|2,3,@845 11867:O2|@1223,@11868 11868:O3|0,@11869,@876 11869:O8|@11870,@1007,0,0,@840,0,4,1 11870:O3|10,@11872,@11871 11871:O3|14,@11854,0 11872:O2|@1727,@11873 11873:O2|@1728,@11874 11874:O2|@11876,@11875 11875:O2|@11878,0 11876:O4|1,@922,2,@11877 11877:O4|6,@739,3,1 11878:O4|1,@922,3,@10471 11879:O3|3,@11881,@11880 11880:O3|0,@11892,1 11881:O2|@1733,@11882 11882:O2|@11884,@11883 11883:O2|@11886,@11885 11884:O2|50,@693 11885:O2|@11889,0 11886:O2|51,@11887 11887:O5|5,@11888,@1249,@1247,@690 11888:O2|@11730,0 11889:O2|52,@11890 11890:O5|5,@11891,@1249,@1247,@690 11891:O2|@970,0 11892:O2|49,@11893 11893:O2|50,@11894 11894:O2|51,@11895 11895:O2|52,0 11896:O2|@969,@11897 11897:O2|@11635,@11898 11898:O2|@11785,0 11899:O2|@11901,@11900 11900:O2|@11902,0 11901:S20|707265747479526570726573656e746174696f6e 11902:O4|@23,69,@11903,0 11903:O7|@11901,2,@11905,@11904,@690,0,0 11904:O3|2,@11906,@970 11905:O2|3,4 11906:O3|3,@11907,@695 11907:O2|@11908,@1732 11908:O2|49,@11909 11909:O3|6,@201,79993 11910:O2|@1007,@11911 11911:O2|@11912,0 11912:O4|@23,69,@11824,0 11913:O2|@1557,@11914 11914:O2|@11915,0 11915:O4|@23,69,@1555,0 11916:O2|@11918,@11917 11917:O2|@11919,0 11918:S8|436f646554726565 11919:O4|@38,69,@11920,0 11920:O4|@11918,@961,@11921,@690 11921:O6|@11923,I48,0,@690,@11922,0 11922:O1|@12267 11923:O4|1,@203,@204,@202 11924:O2|@673,40 11925:O2|@12259,@12258 11926:O2|@11928,@11927 11927:O2|@11929,0 11928:S8|6d6b48616e646c65 11929:O4|@23,69,@11930,0 11930:O7|@11928,2,@11932,@11931,@690,0,0 11931:O3|2,@11937,@5763 11932:O2|1,@11933 11933:O3|2,@11934,0 11934:O1|@11935 11935:D1,28|00802b352c3628052b2b6a65420e0e0e000000001400000000000000|@11936| 11936:S22|434f44455452454528292e6d6b48616e646c65283129 11937:O3|3,@11938,@695 11938:O2|@11940,@11939 11939:O2|@11941,0 11940:O2|49,@5763 11941:O2|50,@5763 11942:O2|@11944,@11943 11943:O2|@11945,0 11944:S16|6d6b496e6c696e6546756e6374696f6e 11945:O4|@23,69,@11946,0 11946:O7|@11944,2,@11948,@11947,@690,0,0 11947:O3|2,@11956,@5763 11948:O2|1,@11949 11949:O3|2,@11950,0 11950:O1|@11951 11951:D11,132|00802b352c362d372e382f392c1a78001a79000e0e0c00032c1a74001a75000e0e0c000303033c02222c1a6b000c00021a69000e0e0c000203102c3b1a51003b3f1a5c000e0c000602013b03051a540002012c2c1a51000e0e0c00022b1a4c000e0c0002312c3b2d2d3b333c680828072a69270a420e0e0e000000007c00000000000000|@11953,@11952,@2047,I48,I251,I105,I218,I154,@1591,@10834,@10836| 11952:O1|@11954 11953:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283129 11954:D1,20|00803c420e0e0e0e000000000c00000000000000|@11955| 11955:S50|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283529283129 11956:O3|3,@11958,@11957 11957:O3|0,@11968,1 11958:O2|@11940,@11959 11959:O2|@1734,@11960 11960:O2|@11962,@11961 11961:O2|@11964,@11963 11962:O2|51,@767 11963:O2|@11967,0 11964:O2|52,@11965 11965:O5|5,@11966,@1249,@1247,@690 11966:O2|@5763,0 11967:O2|53,@768 11968:O2|49,@11969 11969:O2|50,@11970 11970:O2|51,@11971 11971:O2|52,@11972 11972:O2|53,0 11973:O2|@11975,@11974 11974:O2|@11976,0 11975:S7|6d6b5475706c65 11976:O4|@23,69,@11977,0 11977:O7|@11975,2,@11979,@11978,@690,0,0 11978:O3|2,@11965,@5763 11979:O2|1,@11980 11980:O3|2,@11981,0 11981:O1|@11982 11982:D5,84|0080280e2c3b6a2c291a4c000e0c00021a49000e0e0c0002031d29352a362a353d1a3c000e0c00030309292503511e263b02013b6502013c640309291a25002d7d0400022964420e000000004c00000000000000|@11983,I105,I218,I251,@2464| 11983:S35|434f4445545245455f46554e4354494f4e5328292e6d6b5265636f7264283129283129 11984:O2|@11986,@11985 11985:O2|@11987,0 11986:S7|6d6b5768696c65 11987:O4|@23,69,@11988,0 11988:O7|@11986,2,@11989,@11931,@690,0,0 11989:O2|1,@11990 11990:O3|2,@11991,0 11991:O1|@11992 11992:D5,76|00802b352c363d2a69293b693b1a40000e0c000228092a692b3b1a37000c00030303290204402c2b6a3c302b1a29006b3b1a28000e0c00023b2b2b6a2709420e000000004400000000000000|@11993,@11221,I251,@809,@11223| 11993:S21|434f44455452454528292e6d6b5768696c65283129 11994:O2|@11996,@11995 11995:O2|@11997,0 11996:S7|6d6b5261697365 11997:O4|@23,69,@11998,0 11998:O7|@11996,2,@12000,@11999,@690,0,0 11999:O3|2,@5763,@5763 12000:O2|1,@12001 12001:O3|2,@12002,0 12002:O1|@12003 12003:D1,20|0080280b2c69420e000000000c00000000000000|@12004| 12004:S5|5261697365 12005:O2|@5765,@12006 12006:O2|@12007,0 12007:O4|@27,69,@12008,0 12008:O2|@5764,0 12009:O2|@12011,@12010 12010:O2|@12012,0 12011:S5|6d6b456e76 12012:O4|@23,69,@12013,0 12013:O7|@12011,2,@12015,@12014,@690,0,0 12014:O3|2,@12020,@5763 12015:O2|1,@12016 12016:O3|2,@12017,0 12017:O1|@12018 12018:D2,44|00802b352c362a3b1a25000e0e0c00030303290204402b2b6a65420e0e0e0e0e000000002400000000000000|@12019,I251| 12019:S29|434f4445545245455f46554e4354494f4e5328292e6d6b456e76283129 12020:O3|3,@12021,@695 12021:O2|@12022,@11939 12022:O2|49,@12023 12023:O5|5,@12024,@1249,@1247,@690 12024:O2|@12025,0 12025:O5|5,0,@12027,@12026,@690 12026:O3|@12027,@690,@12028 12027:S11|636f646542696e64696e67 12028:O3|@12030,@12033,@12029 12029:O3|@12034,@717,@716 12030:O2|1,@12031 12031:O3|2,@12032,0 12032:O4|0,@206,3,1 12033:O4|1,@207,0,0 12034:S27|506f6c794d4c2e436f6465547265652e636f646542696e64696e67 12035:O2|@12037,@12036 12036:O2|@12038,0 12037:S13|6d6b4c6f6164436c6f73757265 12038:O4|@23,69,@12039,0 12039:O7|@12037,2,@12041,@12040,@690,0,0 12040:O3|2,@768,@5763 12041:O2|1,@12042 12042:O3|2,@12043,0 12043:O1|@12044 12044:D3,44|00802b3b1a29000e0e0c000303041a2300103b503c2c693f2a6964420e0e0e0e000000002400000000000000|@3751,I234,@3695| 12045:O2|@1112,@12046 12046:O2|@12047,0 12047:O4|@23,69,@12048,0 12048:O7|@1112,2,@12050,@12049,@690,0,0 12049:O3|2,@5763,@970 12050:O2|1,@12051 12051:O3|2,@2962,0 12052:O2|@12054,@12053 12053:O2|@12055,0 12054:S5|6d6b446563 12055:O4|@23,69,@12056,0 12056:O7|@12054,2,@12058,@12057,@690,0,0 12057:O3|2,@12063,@12025 12058:O2|1,@12059 12059:O3|2,@12060,0 12060:O1|@12061 12061:D1,28|00802b352c363c3b2c2c6b65420e0e0e000000001400000000000000|@12062| 12062:S19|434f44455452454528292e6d6b446563283129 12063:O3|3,@12064,@695 12064:O2|@1733,@11939 12065:O2|@12067,@12066 12066:O2|@12068,0 12067:S5|4c64657863 12068:O4|@23,69,@12069,0 12069:O7|@12067,2,@12070,@5763,@690,0,0 12070:O2|1,@12071 12071:O3|2,@3454,0 12072:O2|@12074,@12073 12073:O2|@12075,0 12074:S7|67656e436f6465 12075:O4|@23,69,@12076,0 12076:O7|@12074,2,@12078,@12077,@690,0,0 12077:O3|2,@12084,@12083 12078:O2|1,@12079 12079:O3|2,@12080,0 12080:O2|@12081,@2360 12081:D1,28|00802b352c362d3756372e7b05030004000000001400000000000000|@12082| 12082:S21|434f44455452454528292e67656e436f6465283129 12083:O3|2,@1461,@5763 12084:O3|3,@12085,@5440 12085:O2|@11940,@12086 12086:O2|@12088,@12087 12087:O2|@12089,0 12088:O2|50,@11580 12089:O2|51,@768 12090:O2|@12092,@12091 12091:O2|@12093,0 12092:S4|6d6b4966 12093:O4|@23,69,@12094,0 12094:O7|@12092,2,@12096,@12095,@690,0,0 12095:O3|2,@12101,@5763 12096:O2|1,@12097 12097:O3|2,@12098,0 12098:O1|@12099 12099:D1,28|00802b352c362d373c2c2c2c6b66420e000000001400000000000000|@12100| 12100:S4|436f6e64 12101:O3|3,@12102,@5440 12102:O2|@11940,@12103 12103:O2|@11941,@12104 12104:O2|@12105,0 12105:O2|51,@5763 12106:O2|@12108,@12107 12107:O2|@12109,0 12108:S9|6d6b4e756c6c446563 12109:O4|@23,69,@12110,0 12110:O7|@12108,2,@12112,@12111,@690,0,0 12111:O3|2,@5763,@12025 12112:O2|1,@12113 12113:O3|2,@12114,0 12114:O1|@12115 12115:D1,20|00803d2c69420e0e000000000c00000000000000|@12116| 12116:S11|4e756c6c42696e64696e67 12117:O2|@12119,@12118 12118:O2|@12120,0 12119:S11|6d6b426567696e4c6f6f70 12120:O4|@23,69,@12121,0 12121:O7|@12119,2,@12123,@12122,@690,0,0 12122:O3|2,@12130,@5763 12123:O2|1,@12124 12124:O3|2,@12125,0 12125:O1|@12126 12126:D2,36|00802b352c36291a1e000e0e0e0c00023b2c2b6a66420e0e000000001c00000000000000|@12128,@12127| 12127:O1|@12129 12128:S25|434f44455452454528292e6d6b426567696e4c6f6f70283129 12129:D4,68|00802b1a42000e0e0e0c00021a3d000e0e0c0002031d2b352c362a352b363b2b2b6a293c692d1a27000c00022a2a69270702013b420e0e0e000000003c00000000000000|@1785,I105,I218,@12127| 12130:O3|3,@12131,@695 12131:O2|@11940,@12132 12132:O2|@12133,0 12133:O2|50,@12134 12134:O5|5,@12135,@1249,@1247,@690 12135:O2|@12063,0 12136:O2|@12138,@12137 12137:O2|@12139,0 12138:S11|6d616368696e65576f7264 12139:O4|@27,69,@12140,0 12140:O2|@12141,0 12141:O3|@12138,@690,@12142 12142:O3|@12144,@12147,@12143 12143:O3|@12148,@717,@716 12144:O2|1,@12145 12145:O3|2,@12146,0 12146:O4|0,@208,3,1 12147:O4|1,@209,0,0 12148:S27|506f6c794d4c2e436f6465547265652e6d616368696e65576f7264 12149:O2|@12151,@12150 12150:O2|@12152,0 12151:S5|6d6b496e64 12152:O4|@23,69,@12153,0 12153:O7|@12151,2,@12155,@12154,@690,0,0 12154:O3|2,@12063,@5763 12155:O2|1,@12156 12156:O3|2,@12157,0 12157:O1|@12158 12158:D3,52|00802b352c3629353d1a2c000e0c0003030e292b3b1a2400300e0e7b0505000428062a2c3b6b6542000000002c00000000000000|@12159,I251,@2403| 12159:S37|434f4445545245455f46554e4354494f4e5328292e6d6b496e646972656374283129283129 12160:O2|@12162,@12161 12161:O2|@12163,0 12162:S10|6d6b46756e6374696f6e 12163:O4|@23,69,@12164,0 12164:O7|@12162,2,@12165,@11947,@690,0,0 12165:O2|1,@12166 12166:O3|2,@12167,0 12167:O1|@12168 12168:D11,132|00802b352c362d372e382f392c1a78001a79000e0e0c00032c1a74001a75000e0e0c000303033c02222c1a6b000c00021a69000e0e0c000203102c3b1a51003b3f1a5c000e0c000602013b03051a540002012c2c1a51000e0e0c00022b1a4c000e0c0002312c3b2d2d3c333c680828072a69270a420e0e0e000000007c00000000000000|@12170,@12169,@2047,I48,I251,I105,I218,I154,@1591,@10834,@10836| 12169:O1|@12171 12170:S41|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283129 12171:D1,20|00803c420e0e0e0e000000000c00000000000000|@12172| 12172:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283529283129 12173:O2|@12175,@12174 12174:O2|@12176,0 12175:S6|6d6b4c6f6f70 12176:O4|@23,69,@12177,0 12177:O7|@12175,2,@12178,@11978,@690,0,0 12178:O2|1,@12179 12179:O3|2,@12180,0 12180:O1|@12181 12181:D2,36|00802b1a22000e0e0e0c000228092a6964420e0e0e0e0e0e000000001c00000000000000|@12183,@12182| 12182:O1|@12184 12183:S20|434f44455452454528292e6d6b4c6f6f70283129 12184:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@12182| 12185:O2|@12187,@12186 12186:O2|@12188,0 12187:S6|6576616c7565 12188:O4|@23,69,@12189,0 12189:O7|@12187,2,@12191,@12190,@690,0,0 12190:O3|2,@5763,@12196 12191:O2|1,@12192 12192:O3|2,@12193,0 12193:O1|@12194 12194:D2,36|00802b353d1a20000e0c000303082b362968016402013b42000000001c00000000000000|@12195,I251| 12195:S30|434f4445545245455f46554e4354494f4e5328292e6576616c7565283129 12196:O5|5,@12197,@5590,@5447,@690 12197:O2|@12198,0 12198:O5|5,0,@12138,@12141,@690 12199:O2|@12201,@12200 12200:O2|@12202,0 12201:S14|6d6b4c6f6164417267756d656e74 12202:O4|@23,69,@12203,0 12203:O7|@12201,2,@12204,@12040,@690,0,0 12204:O2|1,@12205 12205:O3|2,@9806,0 12206:O2|@12208,@12207 12207:O2|@12209,0 12208:S10|6d6b436f6e7374616e74 12209:O4|@23,69,@12210,0 12210:O7|@12208,2,@12212,@12211,@690,0,0 12211:O3|2,@12198,@5763 12212:O2|1,@12213 12213:O3|2,@12214,0 12214:O1|@12215 12215:D1,20|00803d2c3b6a420e000000000c00000000000000|@12216| 12216:S21|434f44455452454528292e6d6b436f6e7374283129 12217:O2|@12219,@12218 12218:O2|@12220,0 12219:S11|6d6b4c6f61644c6f63616c 12220:O4|@23,69,@12221,0 12221:O7|@12219,2,@12222,@12040,@690,0,0 12222:O2|1,@12223 12223:O3|2,@12224,0 12224:O1|@12225 12225:D3,44|00802b3b1a29000e0e0c000303041a2300103b503d2c693f2a6964420e0e0e0e000000002400000000000000|@3751,I234,@3695| 12226:O2|@12027,@12227 12227:O2|@12228,0 12228:O4|@27,69,@12229,0 12229:O2|@12026,0 12230:O2|@12232,@12231 12231:O2|@12233,0 12232:S6|6d6b43616c6c 12233:O4|@23,69,@12234,0 12234:O7|@12232,2,@12236,@12235,@690,0,0 12235:O3|2,@12243,@5763 12236:O2|1,@12237 12237:O3|2,@12238,0 12238:O1|@12239 12239:D2,36|00802b352c36291a1e000e0e0e0c00023e2a2d3c6b66420e000000001c00000000000000|@12241,@12240| 12240:O1|@12242 12241:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c6543616c6c283129 12242:D4,60|00802b1a3a000e0e0e0c00021a35000e0e0c000203152b352c362a3c692a1a27000c00022a2a69270402013b420e0e0e000000003400000000000000|@1785,I105,I218,@12240| 12243:O3|3,@12244,@695 12244:O2|@11940,@12245 12245:O2|@12246,0 12246:O2|50,@11965 12247:O2|@12249,@12248 12248:O2|@12250,0 12249:S12|6d6b4d757475616c44656373 12250:O4|@23,69,@12251,0 12251:O7|@12249,2,@12253,@12252,@690,0,0 12252:O3|2,@12134,@12025 12253:O2|1,@12254 12254:O3|2,@12255,0 12255:O1|@12256 12256:D4,52|00802b3b1a31000e0e0c000303041a2b00103b502b1a28000e0c00023e2a6964420e0e0e0e0e0e0e000000002c00000000000000|@12257,I251,@10404,@10407| 12257:S26|434f44455452454528292e6d6b4d757475616c44656373283129 12258:O2|@12260,0 12259:S11|72747346756e6374696f6e 12260:O4|@23,69,@12261,0 12261:O7|@12259,2,@12262,@12040,@690,0,0 12262:O2|1,@12263 12263:O3|2,@12264,0 12264:O1|@12265 12265:D2,36|00802b1a22000e0e0e0c00023d2a3b6a64420e0e0e0e0e0e000000001c00000000000000|@12266,I189| 12266:S25|434f44455452454528292e72747346756e6374696f6e283129 12267:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 12268:O2|@1485,@12269 12269:O2|@12270,0 12270:O4|@23,69,@1483,0 12271:O2|@1095,@12272 12272:O2|@12273,0 12273:O4|@23,69,@11731,0 12274:O2|@1805,@12275 12275:O2|@12276,0 12276:O4|@23,69,@12277,0 12277:O7|@1805,2,@12279,@12278,@690,0,0 12278:O3|2,@12280,@12280 12279:O2|3,7 12280:O3|6,@210,79993 12281:O2|@1503,@12282 12282:O2|@12283,0 12283:O4|@23,69,@1501,0 12284:O2|@12286,@12285 12285:O2|@12287,0 12286:S17|4465627567676572496e74657266616365 12287:O4|@38,69,@12288,0 12288:O4|@12286,@961,@12289,@690 12289:O6|@12291,I48,0,@690,@12290,0 12290:O1|@12894 12291:O4|1,@212,@213,@211 12292:O2|@12885,@12884 12293:O2|@12295,@12294 12294:O2|@12296,0 12295:S9|456e76547970656964 12296:O4|@23,69,@12297,0 12297:O7|@12295,@12299,@12300,@12298,@690,0,0 12298:O3|2,@12318,@12317 12299:O2|0,8 12300:O2|1,@12301 12301:O3|14,@12302,0 12302:O2|@12304,@12303 12303:O2|@12308,@12307 12304:O2|7,@12305 12305:O8|@12306,@12295,0,0,@737,0,0,1 12306:O4|13,5,@993,7 12307:O2|@12315,0 12308:O2|7,@12309 12309:O8|@12310,@12295,0,0,@737,0,0,1 12310:O4|3,@818,@12311,1 12311:O2|7,@12312 12312:O8|@12313,@1591,0,0,@737,0,0,1 12313:O3|14,@12314,1 12314:O2|@1497,@1594 12315:O2|7,@12316 12316:O8|@1600,@12295,0,0,@737,0,0,1 12317:O5|5,0,@12334,@12333,@690 12318:O3|3,@12319,@695 12319:O2|@12321,@12320 12320:O2|@12332,0 12321:O2|49,@12322 12322:O5|5,0,@12324,@12323,@690 12323:O3|@12324,@690,@12325 12324:S6|747970654964 12325:O3|@12327,@12330,@12326 12326:O3|@12331,@717,@716 12327:O2|1,@12328 12328:O3|2,@12329,0 12329:O4|0,@215,3,1 12330:O4|1,@216,0,0 12331:S31|506f6c794d4c2e4465627567676572496e746572666163652e747970654964 12332:O2|50,@12322 12333:O3|@12334,@690,@12335 12334:S12|656e7669726f6e456e747279 12335:O3|@12337,@12340,@12336 12336:O3|@12341,@717,@716 12337:O2|1,@12338 12338:O3|2,@12339,0 12339:O4|0,@217,3,1 12340:O4|1,@218,0,0 12341:S37|506f6c794d4c2e4465627567676572496e746572666163652e656e7669726f6e456e747279 12342:O2|@12344,@12343 12343:O2|@12345,0 12344:S16|6c6f636174696f6e50726f704c697374 12345:O4|@27,69,@12346,0 12346:O2|@12347,0 12347:O3|@12344,@690,@12348 12348:O3|@12350,@12353,@12349 12349:O3|@12354,@717,@716 12350:O2|1,@12351 12351:O3|2,@12352,0 12352:O4|0,@219,3,1 12353:O4|1,@220,0,0 12354:S41|506f6c794d4c2e4465627567676572496e746572666163652e6c6f636174696f6e50726f704c697374 12355:O2|@12334,@12356 12356:O2|@12357,0 12357:O4|@27,69,@12358,0 12358:O2|@12333,@12359 12359:O2|@12361,@12360 12360:O2|@12408,@12407 12361:O7|@12363,@12299,@12364,@12362,@690,0,0 12362:O3|2,@12391,@12317 12363:S14|456e76456e6446756e6374696f6e 12364:O2|1,@12365 12365:O3|14,@12366,0 12366:O2|@12368,@12367 12367:O2|@12372,@12371 12368:O2|7,@12369 12369:O8|@12370,@12363,0,0,@737,0,0,1 12370:O4|13,0,@993,7 12371:O2|@12382,0 12372:O2|7,@12373 12373:O8|@12374,@12363,0,0,@737,0,0,1 12374:O4|3,@818,@12375,1 12375:O2|7,@12376 12376:O8|@12377,@1591,0,0,@737,0,0,1 12377:O3|14,@12378,1 12378:O2|@809,@12379 12379:O2|@993,@12380 12380:O2|@1597,@12381 12381:O2|@11850,0 12382:O2|7,@12383 12383:O8|@12384,@12363,0,0,@737,0,0,1 12384:O4|3,@818,@12385,1 12385:O2|7,@12386 12386:O8|@12387,@1591,0,0,@737,0,0,1 12387:O3|14,@12388,0 12388:O2|@1172,@12389 12389:O2|@1606,@12390 12390:O2|@11877,0 12391:O3|3,@12392,@5440 12392:O2|@5467,@12393 12393:O2|@12395,@12394 12394:O2|@12396,0 12395:O2|50,@1394 12396:O2|51,@12397 12397:O5|5,0,@12399,@12398,@690 12398:O3|@12399,@690,@12400 12399:S9|6c6f63616c54797065 12400:O3|@12402,@12405,@12401 12401:O3|@12406,@717,@716 12402:O2|1,@12403 12403:O3|2,@12404,0 12404:O4|0,@221,3,1 12405:O4|1,@222,0,0 12406:S34|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065 12407:O2|@12436,@12435 12408:O7|@12410,@12299,@12411,@12409,@690,0,0 12409:O3|2,@12428,@12317 12410:S12|456e76457863657074696f6e 12411:O2|1,@12412 12412:O3|14,@12413,0 12413:O2|@12415,@12414 12414:O2|@12419,@12418 12415:O2|7,@12416 12416:O8|@12417,@12410,0,0,@737,0,0,1 12417:O4|13,1,@993,7 12418:O2|@12426,0 12419:O2|7,@12420 12420:O8|@12421,@12410,0,0,@737,0,0,1 12421:O4|3,@818,@12422,1 12422:O2|7,@12423 12423:O8|@12424,@1591,0,0,@737,0,0,1 12424:O3|14,@12425,1 12425:O2|@742,@12379 12426:O2|7,@12427 12427:O8|@12384,@12410,0,0,@737,0,0,1 12428:O3|3,@12429,@5440 12429:O2|@5467,@12430 12430:O2|@12432,@12431 12431:O2|@12433,0 12432:O2|50,@12397 12433:O2|51,@12434 12434:O5|5,0,@12344,@12347,@690 12435:O2|@12456,@12455 12436:O7|@12438,@12299,@12437,@12362,@690,0,0 12437:O2|1,@12439 12438:S16|456e76537461727446756e6374696f6e 12439:O3|14,@12440,0 12440:O2|@12442,@12441 12441:O2|@12446,@12445 12442:O2|7,@12443 12443:O8|@12444,@12438,0,0,@737,0,0,1 12444:O4|13,2,@993,7 12445:O2|@12453,0 12446:O2|7,@12447 12447:O8|@12448,@12438,0,0,@737,0,0,1 12448:O4|3,@818,@12449,1 12449:O2|7,@12450 12450:O8|@12451,@1591,0,0,@737,0,0,1 12451:O3|14,@12452,1 12452:O2|@1220,@12379 12453:O2|7,@12454 12454:O8|@12384,@12438,0,0,@737,0,0,1 12455:O2|@12491,@12490 12456:O7|@12458,@12299,@12459,@12457,@690,0,0 12457:O3|2,@12476,@12317 12458:S12|456e76537472756374757265 12459:O2|1,@12460 12460:O3|14,@12461,0 12461:O2|@12463,@12462 12462:O2|@12467,@12466 12463:O2|7,@12464 12464:O8|@12465,@12458,0,0,@737,0,0,1 12465:O4|13,3,@993,7 12466:O2|@12474,0 12467:O2|7,@12468 12468:O8|@12469,@12458,0,0,@737,0,0,1 12469:O4|3,@818,@12470,1 12470:O2|7,@12471 12471:O8|@12472,@1591,0,0,@737,0,0,1 12472:O3|14,@12473,1 12473:O2|@1358,@12379 12474:O2|7,@12475 12475:O8|@12384,@12458,0,0,@737,0,0,1 12476:O3|3,@12477,@5440 12477:O2|@5467,@12478 12478:O2|@12479,@12431 12479:O2|50,@12480 12480:O5|5,0,@12482,@12481,@690 12481:O3|@12482,@690,@12483 12482:S8|6c6f63616c536967 12483:O3|@12485,@12488,@12484 12484:O3|@12489,@717,@716 12485:O2|1,@12486 12486:O3|2,@12487,0 12487:O4|0,@223,3,1 12488:O4|1,@224,0,0 12489:S33|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c536967 12490:O2|@12297,@12525 12491:O7|@12493,@12299,@12494,@12492,@690,0,0 12492:O3|2,@12511,@12317 12493:S10|456e7654436f6e737472 12494:O2|1,@12495 12495:O3|14,@12496,0 12496:O2|@12498,@12497 12497:O2|@12502,@12501 12498:O2|7,@12499 12499:O8|@12500,@12493,0,0,@737,0,0,1 12500:O4|13,4,@993,7 12501:O2|@12509,0 12502:O2|7,@12503 12503:O8|@12504,@12493,0,0,@737,0,0,1 12504:O4|3,@818,@12505,1 12505:O2|7,@12506 12506:O8|@12507,@1591,0,0,@737,0,0,1 12507:O3|14,@12508,1 12508:O2|@836,@1594 12509:O2|7,@12510 12510:O8|@1600,@12493,0,0,@737,0,0,1 12511:O3|3,@12512,@695 12512:O2|@5467,@12513 12513:O2|@12514,0 12514:O2|50,@12515 12515:O5|5,0,@12517,@12516,@690 12516:O3|@12517,@690,@12518 12517:S15|6c6f63616c54797065436f6e737472 12518:O3|@12520,@12523,@12519 12519:O3|@12524,@717,@716 12520:O2|1,@12521 12521:O3|2,@12522,0 12522:O4|0,@225,3,1 12523:O4|1,@226,0,0 12524:S40|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065436f6e737472 12525:O2|@12527,@12526 12526:O2|@12551,0 12527:O7|@12529,@12299,@12530,@12528,@690,0,0 12528:O3|2,@12542,@12317 12529:S10|456e7656436f6e737472 12530:O2|1,@12531 12531:O3|14,@12532,0 12532:O2|@12534,@12533 12533:O2|@12538,@12537 12534:O2|7,@12535 12535:O8|@12536,@12529,0,0,@737,0,0,1 12536:O4|13,6,@993,7 12537:O2|@12540,0 12538:O2|7,@12539 12539:O8|@1513,@12529,0,0,@737,0,0,1 12540:O2|7,@12541 12541:O8|@1172,@12529,0,0,@737,0,0,1 12542:O3|3,@12543,@11957 12543:O2|@5467,@12544 12544:O2|@12432,@12545 12545:O2|@12547,@12546 12546:O2|@12549,@12548 12547:O2|51,@693 12548:O2|@12550,0 12549:O2|52,@768 12550:O2|53,@12434 12551:O7|@12553,@12299,@12552,@12409,@690,0,0 12552:O2|1,@12554 12553:S8|456e7656616c7565 12554:O3|14,@12555,0 12555:O2|@12557,@12556 12556:O2|@12561,@12560 12557:O2|7,@12558 12558:O8|@12559,@12553,0,0,@737,0,0,1 12559:O4|13,7,@993,7 12560:O2|@12568,0 12561:O2|7,@12562 12562:O8|@12563,@12553,0,0,@737,0,0,1 12563:O4|3,@818,@12564,1 12564:O2|7,@12565 12565:O8|@12566,@1591,0,0,@737,0,0,1 12566:O3|14,@12567,1 12567:O2|@1533,@12379 12568:O2|7,@12569 12569:O8|@12384,@12553,0,0,@737,0,0,1 12570:O2|@12572,@12571 12571:O2|@12573,0 12572:S9|6d616b6556616c7565 12573:O4|@23,69,@12574,0 12574:O7|@12572,2,@12576,@12575,@690,0,0 12575:O3|2,@12617,@12616 12576:O2|1,@12577 12577:O3|2,@12578,0 12578:O1|@12579 12579:D2,20|00801a13002c6942000000000c00000000000000|@12581,@12580| 12580:D5,68|00802b352c362d372e381a3b005657691a39002a692d1a37002b1a37000c00043d2d3b6a3c2a69313d2b2e333b3b68072709420e0e0e0e0e000000003c00000000000000|@12583,@12584,@12608,@12582,@1914| 12581:S24|44454255474745525f28292e6d616b6556616c7565283129 12582:O1|@12615 12583:S27|44454255474745525f28292e6d616b6556616c7565283129283129 12584:D3,84|00802b3529353c1a4e000e0e0e0c000303112c3629353c1a3e000e0e0e0c00036402013b6403033b02162b5617355627365637371a25000e0e0c000529680164420e0e0e0e0e0e0e000000004c00000000000000|@12586,I251,@12585| 12585:O1|@12587 12586:S35|44454255474745525f28292e72756e54696d6554797065283229636f70794964283129 12587:D22,564|00831a33022f692e2e2b1a2f020c0004293b1a2b020c000307d3303629353c1a1e020e0e0e0c000307d4293732373b1a12020e0e0e0c00023d1a0c021a0d020e0e0c00031a09021a0a023b2d2d3c3b3c680828072a691aff011a00020e0c00023e2a1afb013c6b291af901692c2a69280e2a3b6a2a1af0010e0c00021aed010e0e0c00021ae5010e0e0c0002030c291ade010e0e0e0c00020201293c2a6922153629353d1a99010e0e0c000303041ac301103b5029353b1a86010e0e0e0c00030322293729353c1a76010e0e0e0c0003030d2936293b1a9f010c000364020229366402112936293b1a8d0102022d010e0e0c0003643c28402b1a8001020213000e0c00043c2a22113b6b2d2a22116a27110fce29353b1a27010c000307d4293632373b1a1e010e0e0e0c00023d1a50011a19010e0e0c00031a15011a16013b2d2d3c3b3c680828072a691a37011a0c010e0c00023e2a1a07013c6b291a0501692c2a69280e2a3b6a2a1afc000e0c00021af9000e0e0c00021af1000e0e0c0002030c291aea000e0e0e0c00020201293c2a6922153629353d1aa5000e0e0c000303041acf00103b5029353b1a92000e0e0e0c00030322293729353c1a82000e0e0e0c0003030d2936293b1aab000c000364020229366402112936293b1a9900020236000e0e0c0003643c28402b1a8c00020213000e0c00043c2a22113b6b2d2a22116a2711021229362a3733373d2c2c6a1a74002a2c6a27046402022935651f040e0e0e0e0e0e0e000000002c02000000000000|@12589,@12590,@12599,I251,@2447,@12602,@2047,@742,@7226,@12588,@2388,@7228,@7222,I105,I218,@2464,@2039,I253,I11,@12604,@12588,@961| 12588:O2|@742,@12606 12589:S25|44454255474745525f28292e73656172636854797065283429 12590:D2,36|00802b352c3656271a1d002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@12592,@12591| 12591:O1|@12593 12592:S33|44454255474745525f28292e736561726368547970652834296d61746368283129 12593:D4,196|00822d3528051abf000c000303a82d362e37293629353c1aae000e0e0e0c000303112e3629353c1a9e000e0e0e0c00036402013b640315293629362f3629362b2a1a84000e0c000327040239293629353b1a74000e0c000303112e3629353b1a66000e0e0e0c00036402013b640315293629382f3629382b2a1a50000e0c0003270402013b032b2a3629353c1a39000e0e0c000303043b5002041a3300102b373d313b6a3c2a69292d2d6a296801270502013b6502013b4400000000bc00000000000000|@12595,I251,I113,@12594| 12594:O4|@35,@863,@12597,@12596 12595:S33|44454255474745525f28292e736561726368547970652834296d61746368283229 12596:O5|@12598,160,0,160,0 12597:S24|736561726368547970653a205479706546756e6374696f6e 12598:S33|6d6c736f757263652f4d4c436f6d70696c65722f44454255474745525f2e736d6c 12599:O1|@12600 12600:D5,220|00822d1ada000e0e0e0c00021ad5000e0e0c000203142c1ac6000e0e0e0c00021ac1000e0e0c000202013b039f2d352e362e352f362c2b69300c0002293b1aa7000c0003037c2d350a07002d005100390045001f00100069005d002c2b321a8b00330e7b050a000402562c32321a7c00330e0e7b050a00042c2b321a6e00337b050a00042c2b321a6200337b050a00042c2b321a5600337b050a00042c2b321a4a00337b050a00042c2b321a3e00337b050a00042c2b321a3200337b050a00040206293529680164270502013b440e0e00000000d400000000000000|@12601,I105,I218,I251,@12599| 12601:S25|44454255474745525f28292e736561726368456e7673283329 12602:O1|@12603 12603:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 12604:O1|@12605 12605:D2,20|00801a1300420e0e000000000c00000000000000|@2454,@741| 12606:O2|@7227,@12607 12607:O2|@2386,0 12608:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@12610,@12611,@12609,@1919| 12609:O1|@12614 12610:S29|44454255474745525f28292e72756e54696d6554797065283229283129 12611:O1|@12612 12612:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12613:S32|44454255474745525f28292e72756e54696d6554797065283229283129283129 12614:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12615:D1,20|00802b420e0e0e0e000000000c00000000000000|@12610| 12616:O3|2,@12644,@5509 12617:O5|5,0,@12619,@12618,@690 12618:O3|@12619,@690,@12620 12619:S10|64656275675374617465 12620:O3|@961,@12622,@12621 12621:O3|@12643,@717,@716 12622:O3|2,0,@12623 12623:O3|3,@12624,@5440 12624:O2|@12626,@12625 12625:O2|@12630,@12629 12626:O2|49,@12627 12627:O5|5,@12628,@1249,@1247,@690 12628:O2|@12317,0 12629:O2|@12642,0 12630:O2|50,@12631 12631:O5|5,@12632,@1249,@1247,@690 12632:O2|@12633,0 12633:O5|5,0,@12138,@12634,@690 12634:O3|@12138,@690,@12635 12635:O3|@12637,@12640,@12636 12636:O3|@12641,@717,@716 12637:O2|1,@12638 12638:O3|2,@12639,0 12639:O4|0,@227,3,1 12640:O4|1,@228,0,0 12641:S36|506f6c794d4c2e4465627567676572496e746572666163652e6d616368696e65576f7264 12642:O2|51,@1394 12643:S35|506f6c794d4c2e4465627567676572496e746572666163652e64656275675374617465 12644:O3|3,@12645,@11880 12645:O2|@5467,@12646 12646:O2|@12432,@12647 12647:O2|@12433,@12648 12648:O2|@12649,0 12649:O2|52,@12633 12650:O2|@12652,@12651 12651:O2|@12653,0 12652:S9|7365744f6e45786974 12653:O4|@23,69,@12654,0 12654:O7|@12652,2,@12656,@12655,@690,0,0 12655:O3|2,@12666,@1461 12656:O2|1,@12657 12657:O3|2,@12658,0 12658:O2|@12659,@192 12659:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203172b351a3d002a6956273b2b1a38000e0c0004503b65020d56073b3b1a28000e0c0004503b420e0e0e0e0e000000004400000000000000|@12661,I105,I218,@12660,I255| 12660:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@12663,@12662| 12661:S24|44454255474745525f28292e7365744f6e45786974283129 12662:O1|@12664 12663:S22|44454255474745525f28292e77726170283129283129 12664:D13,412|00811a9b010c00012928051a96010e0e0e0c00032a28061a8a010e0e0e0c00032b28071a7e010e0e0e0c00032c28081a72010e0e0e0c000378810733330c000209d000ff6d2e28052f1a5c010e0c0004502e28062e1a50010e0c0004502e28072d1a44010e0c0004502e28082c1a38010e0c0004503c28403b1a30010e0c0004293b1a2b011a20010e0c0004502a1a23010c0002293f1a1f010c00036403033b02362a3e1afd000e0e0c0003291a0c010e0c00021a09010e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291ae0000e0c00021add000e0e0c000203043b50020f2b352c362d372b2b2b1aca006b6610293529352a362b372c382d393c28403b1a9c00020242000e0c0004293b1aab001a88000e0c000450323b1a7a000e0e0e0c0003333c1a6f000c0003343d1a67000c000331302f333268052c2c2c2c6b291a7c000e0c0002270f502d28052e1a4a000e0e0e0c0004502d28062d1a3c000e0c0004502d28072c1a30000e0c0004502d28082b1a2400330e0e7b050900040e0e0e0e000000009401000000000000|@12665,I72,I253,I255,I11,@495,I15,I250,I105,I218,@524,@493,I14| 12665:S19|44454255474745525f28292e77726170283229 12666:O5|5,@12667,@5590,@5447,@690 12667:O2|@12668,0 12668:O3|2,@12669,@1461 12669:O3|3,@12670,@695 12670:O2|@5467,@12671 12671:O2|@12395,0 12672:O2|@12493,@12673 12673:O2|@12674,0 12674:O4|@23,69,@12491,0 12675:O2|@12482,@12676 12676:O2|@12677,0 12677:O4|@27,69,@12678,0 12678:O2|@12481,0 12679:O2|@12681,@12680 12680:O2|@12682,0 12681:S15|6d616b65436f6e7374727563746f72 12682:O4|@23,69,@12683,0 12683:O7|@12681,2,@12685,@12684,@690,0,0 12684:O3|2,@12617,@12700 12685:O2|1,@12686 12686:O3|2,@12687,0 12687:O1|@12688 12688:D2,20|00801a13002c6942000000000c00000000000000|@12690,@12689| 12689:D5,76|00802b352c362d372e382f39303a1a3f005677691a3d002a692f1a3b002b1a3b000c00043d2d3b6a3c2a69313169342a2c2f343b3b6807270c420e0e0e0e0e0e000000004400000000000000|@12692,@12693,@12694,@12691,@1914| 12690:S30|44454255474745525f28292e6d616b65436f6e7374727563746f72283129 12691:O1|@12699 12692:S33|44454255474745525f28292e6d616b65436f6e7374727563746f72283129283129 12693:D3,84|00802b3529353c1a4e000e0e0e0c000303112c3629353c1a3e000e0e0e0c00036402013b6403033b02162b5617355627365637371a25000e0e0c000529680164420e0e0e0e0e0e0e000000004c00000000000000|@12586,I251,@12585| 12694:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@12610,@12696,@12695,@1919| 12695:O1|@12698 12696:O1|@12697 12697:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12698:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12699:D1,20|00802b420e0e0e0e000000000c00000000000000|@12610| 12700:O3|2,@12701,@5509 12701:O3|3,@12703,@12702 12702:O3|0,@12710,1 12703:O2|@5467,@12704 12704:O2|@12432,@12705 12705:O2|@12547,@12706 12706:O2|@12549,@12707 12707:O2|@12550,@12708 12708:O2|@12709,0 12709:O2|54,@12633 12710:O2|49,@12711 12711:O2|50,@12712 12712:O2|51,@12713 12713:O2|52,@12714 12714:O2|53,@12715 12715:O2|54,0 12716:O2|@12517,@12717 12717:O2|@12718,0 12718:O4|@27,69,@12719,0 12719:O2|@12516,0 12720:O2|@12722,@12721 12721:O2|@12723,0 12722:S18|7365744f6e45786974457863657074696f6e 12723:O4|@23,69,@12724,0 12724:O7|@12722,2,@12726,@12725,@690,0,0 12725:O3|2,@12734,@1461 12726:O2|1,@12727 12727:O3|2,@12728,0 12728:O2|@12729,@193 12729:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203172b351a3d002a6956273b2b1a38000e0c0004503b65020d56073b3b1a28000e0c0004503b420e0e0e0e0e000000004400000000000000|@12731,I105,I218,@12730,I255| 12730:D2,28|00802b56170c00021a15002a6964420e000000001400000000000000|@12733,@12732| 12731:S33|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129 12732:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@12663,@12662| 12733:S36|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129283129 12734:O5|5,@12735,@5590,@5447,@690 12735:O2|@12736,0 12736:O3|2,@12669,@12737 12737:O3|2,@7751,@1461 12738:O2|@12529,@12739 12739:O2|@12740,0 12740:O4|@23,69,@12527,0 12741:O2|@12458,@12742 12742:O2|@12743,0 12743:O4|@23,69,@12456,0 12744:O2|@12438,@12745 12745:O2|@12746,0 12746:O4|@23,69,@12436,0 12747:O2|@12749,@12748 12748:O2|@12750,0 12749:S9|756e697456616c7565 12750:O4|@23,69,@12751,0 12751:O7|@12749,2,@12752,@5509,@690,0,0 12752:O2|1,@12753 12753:O3|2,@12754,0 12754:O7|I48,2,@961,@1461,0,0,0 12755:O2|@12757,@12756 12756:O2|@12758,0 12757:S14|6d616b6554797065436f6e737472 12758:O4|@23,69,@12759,0 12759:O7|@12757,2,@12761,@12760,@690,0,0 12760:O3|2,@12617,@12768 12761:O2|1,@12762 12762:O3|2,@12763,0 12763:O1|@12764 12764:D2,20|00801a13002c6942000000000c00000000000000|@12766,@12765| 12765:D2,52|00802b352937295637355647365657371a25000e0e0c00052b352c362a2a2d6a293b692706420e0e000000002c00000000000000|@12767,@12585| 12766:S29|44454255474745525f28292e6d616b6554797065436f6e737472283129 12767:S32|44454255474745525f28292e6d616b6554797065436f6e737472283129283129 12768:O3|2,@12515,@5529 12769:O2|@12410,@12770 12770:O2|@12771,0 12771:O4|@23,69,@12408,0 12772:O2|@12774,@12773 12773:O2|@12775,0 12774:S13|6d616b65537472756374757265 12775:O4|@23,69,@12776,0 12776:O7|@12774,2,@12778,@12777,@690,0,0 12777:O3|2,@12617,@12792 12778:O2|1,@12779 12779:O3|2,@12780,0 12780:O1|@12781 12781:D2,20|00801a13002c6942000000000c00000000000000|@12783,@12782| 12782:D2,36|00802b352c362d372e3856471a1900300e0e0e7b07030006000000001c00000000000000|@12785,@12784| 12783:S28|44454255474745525f28292e6d616b65537472756374757265283129 12784:O1|@12786 12785:S31|44454255474745525f28292e6d616b65537472756374757265283129283129 12786:D10,164|00842e352f3630383139323a1a990031691a98002c2b6a2f353c1a93000c000303592f3630382a3b1a89000e0e0c00032a3b1a7f000c0003293b1a77000c0003293b1a73000c000303051a6f0002242928403b1a6a000e0e0e0c00042b3c2b3b2e1a60000e0c000650291a5b000c00025029643b2d2b6a270602012f29303b312e3168063d220d3b6a3c2a6922112a2d22126b270b1f050e000000009c00000000000000|@12788,@12789,@12787,I251,I253,I113,I49,I11,I195,I47| 12787:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@1909,@1908| 12788:S28|44454255474745525f28292e6d616b65537472756374757265283529 12789:D5,52|00803b3b1a31002e3b68051a2e002a1a2e006a295637355647365657371a2400310e0e7b06050005000000002c00000000000000|@12791,@740,@961,@12790,@12585| 12790:O3|I48,@717,@716 12791:S40|44454255474745525f28292e6d616b65537472756374757265283529676574467265654964283129 12792:O3|2,@12793,@5571 12793:O3|3,@12794,@11880 12794:O2|@5467,@12795 12795:O2|@12479,@12647 12796:O2|@12138,@12797 12797:O2|@12798,0 12798:O4|@27,69,@12799,0 12799:O2|@12634,0 12800:O2|@12363,@12801 12801:O2|@12802,0 12802:O4|@23,69,@12361,0 12803:O2|@12619,@12804 12804:O2|@12805,0 12805:O4|@27,69,@12806,0 12806:O2|@12618,0 12807:O2|@12324,@12808 12808:O2|@12809,0 12809:O4|@27,69,@12810,0 12810:O2|@12323,0 12811:O2|@12553,@12812 12812:O2|@12813,0 12813:O4|@23,69,@12551,0 12814:O2|@12399,@12815 12815:O2|@12816,0 12816:O4|@27,69,@12817,0 12817:O2|@12398,0 12818:O2|@12820,@12819 12819:O2|@12821,0 12820:S18|6d616b65416e6f6e796d6f757356616c7565 12821:O4|@23,69,@12822,0 12822:O7|@12820,2,@12824,@12823,@690,0,0 12823:O3|2,@12617,@12839 12824:O2|1,@12825 12825:O3|2,@12826,0 12826:O1|@12827 12827:D2,20|00801a13002c6942000000000c00000000000000|@12829,@12828| 12828:D6,68|00802b352c361a3f005637691a3d002a692c1a3b002b1a3b000c00043d2d3b6a3c2a691a32003d2b2e3b3b3b68072707420e0e0e0e0e0e0e000000003c00000000000000|@12831,@12832,@12833,@12830,@1914,I48| 12829:S33|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129 12830:O1|@12838 12831:S36|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129283129 12832:D3,84|00802b3529353c1a4e000e0e0e0c000303112c3629353c1a3e000e0e0e0c00036402013b6403033b02162b5617355627365637371a25000e0e0c000529680164420e0e0e0e0e0e0e000000004c00000000000000|@12586,I251,@12585| 12833:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@12610,@12835,@12834,@1919| 12834:O1|@12837 12835:O1|@12836 12836:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12837:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12838:D1,20|00802b420e0e0e0e000000000c00000000000000|@12610| 12839:O3|2,@12840,@5509 12840:O3|3,@12841,@695 12841:O2|@12843,@12842 12842:O2|@12844,0 12843:O2|49,@12397 12844:O2|50,@12633 12845:O2|@12847,@12846 12846:O2|@12848,0 12847:S13|6d616b65457863657074696f6e 12848:O4|@23,69,@12849,0 12849:O7|@12847,2,@12850,@12575,@690,0,0 12850:O2|1,@12851 12851:O3|2,@12852,0 12852:O1|@12853 12853:D2,20|00801a13002c6942000000000c00000000000000|@12855,@12854| 12854:D5,68|00802b352c362d372e381a3b005657691a39002a692d1a37002b1a37000c00043d2d3b6a3c2a69313b2b2e333b3b68072709420e0e0e0e0e000000003c00000000000000|@12857,@12858,@12859,@12856,@1914| 12855:S28|44454255474745525f28292e6d616b65457863657074696f6e283129 12856:O1|@12864 12857:S31|44454255474745525f28292e6d616b65457863657074696f6e283129283129 12858:D3,84|00802b3529353c1a4e000e0e0e0c000303112c3629353c1a3e000e0e0e0c00036402013b6403033b02162b5617355627365637371a25000e0e0c000529680164420e0e0e0e0e0e0e000000004c00000000000000|@12586,I251,@12585| 12859:D4,52|00800403002c56271a2d001a2e003b2e1a2d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000002c00000000000000|@12610,@12861,@12860,@1919| 12860:O1|@12863 12861:O1|@12862 12862:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12863:D1,20|00802b420e0e0e0e000000000c00000000000000|@12613| 12864:D1,20|00802b420e0e0e0e000000000c00000000000000|@12610| 12865:O2|@12867,@12866 12866:O2|@12868,0 12867:S15|7365744f6e427265616b506f696e74 12868:O4|@23,69,@12869,0 12869:O7|@12867,2,@12871,@12870,@690,0,0 12870:O3|2,@12877,@1461 12871:O2|1,@12872 12872:O3|2,@12873,0 12873:O2|@12874,@191 12874:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203172b351a3d002a6956273b2b1a38000e0c0004503b65020d56073b3b1a28000e0c0004503b420e0e0e0e0e000000004400000000000000|@12876,I105,I218,@12875,I255| 12875:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@12663,@12662| 12876:S30|44454255474745525f28292e7365744f6e427265616b506f696e74283129 12877:O5|5,@12878,@5590,@5447,@690 12878:O2|@12879,0 12879:O3|2,@12880,@1461 12880:O3|3,@12881,@695 12881:O2|@1477,@12882 12882:O2|@12883,0 12883:O2|50,@1174 12884:O2|@12886,0 12885:S10|7365744f6e456e747279 12886:O4|@23,69,@12887,0 12887:O7|@12885,2,@12888,@12655,@690,0,0 12888:O2|1,@12889 12889:O3|2,@12890,0 12890:O2|@12891,@194 12891:D5,76|00802b1a4a000e0e0e0c00021a45000e0e0c000203172b351a3d002a6956273b2b1a38000e0c0004503b65020d56073b3b1a28000e0c0004503b420e0e0e0e0e000000004400000000000000|@12893,I105,I218,@12892,I255| 12892:D2,28|00802b56171a18002d0e0e0e7e030003000000001400000000000000|@12663,@12662| 12893:S25|44454255474745525f28292e7365744f6e456e747279283129 12894:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 12895:O2|@1521,@12896 12896:O2|@12897,0 12897:O4|@23,69,@1519,0 12898:O2|@1396,@12899 12899:O2|@12900,0 12900:O4|@27,69,@12901,0 12901:O2|@1395,0 12902:O2|@12904,@12903 12903:O2|@12905,0 12904:S14|736f757263654c6f636174696f6e 12905:O4|@23,69,@12906,0 12906:O7|@12904,2,@12908,@12907,@690,0,0 12907:O3|2,@1461,@1394 12908:O2|3,3 12909:O2|@1155,@12910 12910:O2|@12911,0 12911:O4|@23,69,@1153,0 12912:O2|@12913,0 12913:O4|@23,69,@11708,0 12914:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 12915:O2|@12917,@12916 12916:O2|@12918,0 12917:S3|6d6f64 12918:O4|@23,69,@12919,0 12919:O7|@12917,2,@691,@12920,@690,0,0 12920:O3|2,@694,@699 12921:O2|@1249,@12922 12922:O2|@12923,0 12923:O4|@27,69,@12924,0 12924:O2|@1247,@12925 12925:O2|@10961,@12926 12926:O2|@10954,0 12927:O2|@12929,@12928 12928:O2|@12930,0 12929:S5|6172726179 12930:O4|@27,69,@12931,0 12931:O2|@12932,0 12932:O3|@12929,@690,@12933 12933:O3|@12935,@12954,@12934 12934:O3|@12955,@717,@716 12935:O2|1,@12936 12936:O3|2,@12938,@12937 12937:O2|@12945,0 12938:O4|@12940,@229,@12942,@12939 12939:O1|@12944 12940:O1|@12941 12941:D2,20|00801a1300420e0e000000000c00000000000000|@1187,I251| 12942:O1|@12943 12943:D1,20|00803d420e0e0e0e000000000c00000000000000|@1196| 12944:D1,20|00803c420e0e0e0e000000000c00000000000000|@1198| 12945:O4|@34,69,@12946,0 12946:O3|2,4,@12947 12947:O5|@890,@12949,@1226,@12948,@848 12948:O4|@12938,@12940,@12942,@12939 12949:O2|@894,@12950 12950:O2|@1206,@12951 12951:O2|@12952,@1211 12952:O2|@12953,@855 12953:O3|0,@229,0 12954:O4|1,@79,1,0 12955:S11|41727261792e6172726179 12956:O2|@5590,@12957 12957:O2|@12958,0 12958:O4|@27,69,@12959,0 12959:O2|@5447,@12960 12960:O2|@10571,@12961 12961:O2|@10546,0 12962:O2|@5669,@12963 12963:O2|@12964,0 12964:O4|@23,69,@10571,0 12965:O2|42,@12966 12966:O2|@12967,0 12967:O4|@23,69,@12968,0 12968:O7|42,2,@691,@12920,@690,0,0 12969:O2|@2209,@12970 12970:O2|@12971,0 12971:O4|@27,69,@12972,0 12972:O2|@2207,0 12973:O2|43,@12974 12974:O2|@12975,0 12975:O4|@23,69,@12976,0 12976:O7|43,2,@691,@12920,@690,0,0 12977:O2|126,@12978 12978:O2|@12979,0 12979:O4|@23,69,@12980,0 12980:O7|126,2,@691,@942,@690,0,0 12981:O2|45,@12982 12982:O2|@12983,0 12983:O4|@23,69,@12984,0 12984:O7|45,2,@691,@12920,@690,0,0 12985:O2|@12987,@12986 12986:O2|@12988,0 12987:S9|426f6f747374726170 12988:O4|@38,69,@12989,0 12989:O4|@12987,@961,@12990,@690 12990:O6|@12992,I48,0,@690,@12991,0 12991:O1|@14072 12992:O4|1,@231,@232,@230 12993:O2|@14060,@14059 12994:O2|@12996,@12995 12995:O2|@12997,0 12996:S24|7265706f7274556e7265666572656e636564496473546167 12997:O4|@23,69,@12998,0 12998:O7|@12996,2,@13000,@12999,@690,0,0 12999:O5|5,@1176,@13011,@13010,@690 13000:O2|1,@13001 13001:O3|2,@13002,0 13002:O3|@13004,@13007,@13003 13003:O2|@13009,@103 13004:O2|@13005,@103 13005:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13006:S19|556e6976657273616c2e746167283129283129 13007:O2|@13008,@103 13008:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13009:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13010:O3|@13011,@690,@13012 13011:S3|746167 13012:O3|@13014,@13047,@13013 13013:O3|@13011,@717,@716 13014:O2|1,@13015 13015:O3|2,@13017,@13016 13016:O2|@13030,0 13017:O4|0,@234,@13025,@13018 13018:O1|@13028 13019:O1|@13020 13020:D2,20|00801a1300420e0e000000000c00000000000000|@13022,@13021| 13021:O1|@13023 13022:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129 13023:D2,20|00801a1300420e0e000000000c00000000000000|@13024,@713| 13024:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129283129 13025:O1|@13026 13026:D1,20|00803e420e0e0e0e000000000c00000000000000|@13027| 13027:S9|626f7865642d746167 13028:D1,20|00803c420e0e0e0e000000000c00000000000000|@13029| 13029:S8|73697a652d746167 13030:O4|@34,69,@13031,0 13031:O3|2,4,@13032 13032:O5|@890,@13034,@1224,@13033,@848 13033:O3|@13017,@13025,@13018 13034:O2|@894,@13035 13035:O2|@10585,@13036 13036:O2|@13038,@13037 13037:O2|@13041,@13040 13038:O2|@13039,@855 13039:O3|0,@234,0 13040:O2|@13044,0 13041:O2|@1208,@13042 13042:O3|0,@13043,@876 13043:O8|@1358,@13027,0,0,@737,0,0,1 13044:O2|@1217,@13045 13045:O3|0,@13046,@876 13046:O8|@742,@13029,0,0,@737,0,0,1 13047:O4|1,@235,1,0 13048:O2|@13050,@13049 13049:O2|@13051,0 13050:S11|726f6f7454726565546167 13051:O4|@23,69,@13052,0 13052:O7|@13050,2,@13054,@13053,@690,0,0 13053:O5|5,@13063,@13011,@13010,@690 13054:O2|1,@13055 13055:O3|2,@13056,0 13056:O3|@13058,@13060,@13057 13057:O2|@13062,@150 13058:O2|@13059,@150 13059:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13060:O2|@13061,@150 13061:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13062:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13063:O2|@13064,0 13064:O3|3,@13066,@13065 13065:O3|0,@13077,1 13066:O2|@13068,@13067 13067:O2|@13073,@13072 13068:O2|@13070,@13069 13069:O5|5,@13071,@5590,@5447,@690 13070:S4|6e657874 13071:O2|@1459,0 13072:O2|@13075,0 13073:O2|@13074,@13069 13074:S6|706172656e74 13075:O2|@13076,@13069 13076:S8|70726576696f7573 13077:O2|@13070,@13078 13078:O2|@13074,@13079 13079:O2|@13076,0 13080:O2|@13082,@13081 13081:O2|@13083,0 13082:S17|636f6d70696c65724f7574707574546167 13083:O4|@23,69,@13084,0 13084:O7|@13082,2,@13086,@13085,@690,0,0 13085:O5|5,@13095,@13011,@13010,@690 13086:O2|1,@13087 13087:O3|2,@13088,0 13088:O3|@13090,@13092,@13089 13089:O2|@13094,@108 13090:O2|@13091,@108 13091:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13092:O2|@13093,@108 13093:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13094:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13095:O2|@13096,0 13096:O3|2,@970,@1461 13097:O2|@13099,@13098 13098:O2|@13100,0 13099:S17|62696e64696e67436f756e746572546167 13100:O4|@23,69,@13101,0 13101:O7|@13099,2,@13103,@13102,@690,0,0 13102:O5|5,@13112,@13011,@13010,@690 13103:O2|1,@13104 13104:O3|2,@13105,0 13105:O3|@13107,@13109,@13106 13106:O2|@13111,@89 13107:O2|@13108,@89 13108:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13109:O2|@13110,@89 13110:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13111:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13112:O2|@13113,0 13113:O3|2,@1461,@768 13114:O2|@13116,@13115 13115:O2|@13117,0 13116:S16|6d6178496e6c696e6553697a65546167 13117:O4|@23,69,@13118,0 13118:O7|@13116,2,@13120,@13119,@690,0,0 13119:O5|5,@9772,@13011,@13010,@690 13120:O2|1,@13121 13121:O3|2,@13122,0 13122:O3|@13124,@13126,@13123 13123:O2|@13128,@91 13124:O2|@13125,@91 13125:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13126:O2|@13127,@91 13127:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13128:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13129:O2|@13131,@13130 13130:O2|@13132,0 13131:S15|617373656d626c79436f6465546167 13132:O4|@23,69,@13133,0 13133:O7|@13131,2,@13134,@12999,@690,0,0 13134:O2|1,@13135 13135:O3|2,@13136,0 13136:O3|@13138,@13140,@13137 13137:O2|@13142,@96 13138:O2|@13139,@96 13139:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13140:O2|@13141,@96 13141:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13142:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13143:O2|@13145,@13144 13144:O2|@13146,0 13145:S14|636f6e76537472696e674e616d65 13146:O4|@23,69,@13147,0 13147:O7|@13145,2,@13148,@767,@690,0,0 13148:O2|1,@13149 13149:O3|2,@6788,0 13150:O2|@13152,@13151 13151:O2|@13153,0 13152:S17|696e6c696e6546756e63746f7273546167 13153:O4|@23,69,@13154,0 13154:O7|@13152,2,@13155,@12999,@690,0,0 13155:O2|1,@13156 13156:O3|2,@13157,0 13157:O3|@13159,@13161,@13158 13158:O2|@13163,@90 13159:O2|@13160,@90 13160:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13161:O2|@13162,@90 13162:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13163:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13164:O2|@13166,@13165 13165:O2|@13167,0 13166:S27|7265706f72744578686175737469766548616e646c657273546167 13167:O4|@23,69,@13168,0 13168:O7|@13166,2,@13169,@12999,@690,0,0 13169:O2|1,@13170 13170:O3|2,@13171,0 13171:O3|@13173,@13175,@13172 13172:O2|@13177,@104 13173:O2|@13174,@104 13174:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13175:O2|@13176,@104 13176:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13177:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13178:O2|@13180,@13179 13179:O2|@13181,0 13180:S19|6c6f776c6576656c4f7074696d697365546167 13181:O4|@23,69,@13182,0 13182:O7|@13180,2,@13183,@12999,@690,0,0 13183:O2|1,@13184 13184:O3|2,@13185,0 13185:O3|@13187,@13189,@13186 13186:O2|@13191,@95 13187:O2|@13188,@95 13188:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13189:O2|@13190,@95 13190:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13191:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13192:O2|@13194,@13193 13193:O2|@13195,0 13194:S11|636f646574726565546167 13195:O4|@23,69,@13196,0 13196:O7|@13194,2,@13197,@12999,@690,0,0 13197:O2|1,@13198 13198:O3|2,@13199,0 13199:O3|@13201,@13203,@13200 13200:O2|@13205,@85 13201:O2|@13202,@85 13202:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13203:O2|@13204,@85 13204:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13205:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13206:O2|@13208,@13207 13207:O2|@13209,0 13208:S23|6372656174655072696e7446756e6374696f6e73546167 13209:O4|@23,69,@13210,0 13210:O7|@13208,2,@13211,@12999,@690,0,0 13211:O2|1,@13212 13212:O3|2,@13213,0 13213:O3|@13215,@13217,@13214 13214:O2|@13219,@106 13215:O2|@13216,@106 13216:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13217:O2|@13218,@106 13218:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13219:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13220:O2|@13222,@13221 13221:O2|@13223,0 13222:S12|706172736574726565546167 13223:O4|@23,69,@13224,0 13224:O7|@13222,2,@13225,@12999,@690,0,0 13225:O2|1,@13226 13226:O3|2,@13227,0 13227:O3|@13229,@13231,@13228 13228:O2|@13233,@93 13229:O2|@13230,@93 13230:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13231:O2|@13232,@93 13232:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13233:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13234:O2|@13236,@13235 13235:O2|@13237,0 13236:S13|6c696e654c656e677468546167 13237:O4|@23,69,@13238,0 13238:O7|@13236,2,@13239,@13119,@690,0,0 13239:O2|1,@13240 13240:O3|2,@13241,0 13241:O3|@13243,@13245,@13242 13242:O2|@13247,@100 13243:O2|@13244,@100 13244:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13245:O2|@13246,@100 13246:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13247:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13248:O2|@13250,@13249 13249:O2|@13251,0 13250:S14|70737461636b5472616365546167 13251:O4|@23,69,@13252,0 13252:O7|@13250,2,@13253,@12999,@690,0,0 13253:O2|1,@13254 13254:O3|2,@13255,0 13255:O3|@13257,@13259,@13256 13256:O2|@13261,@94 13257:O2|@13258,@94 13258:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13259:O2|@13260,@94 13260:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13261:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13262:O2|@13264,@13263 13263:O2|@13265,0 13264:S11|676c6f62616c5370616365 13265:O4|@23,69,@13266,0 13266:O7|@13264,2,@13267,@5449,@690,0,0 13267:O2|1,@13268 13268:O3|2,@13269,0 13269:O18|@13271,@13287,@13292,@13297,@13302,@13307,@13314,@13319,@13324,@13329,@13334,@13339,@13342,@13345,@13350,@13353,@13358,@13270 13270:O2|@13361,@670 13271:O2|@13272,@670 13272:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13275,@13273| 13273:O1|@13279 13274:S25|4d414b455f28292e6462456e76416c6c283129283129283129 13275:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13276,@1898| 13276:O1|@13278 13277:S22|4d414b455f28292e6462456e76416c6c283329283129 13278:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@67,I251,@1840| 13279:D24,1372|00811a5b050c0001291a58050e0c0002293f1a53050c00036403033b020a293f1a49050e0e0c0003293b1a43050c000303033b02032968013d2a692c3c1a2c050e0c0003293c1a2b050c0003293c1a27050c00033b2a692c28061a17050c0003293b1a13050c000303033d0223293d1a06050e0e0e0c000303033e0213293f1af6040e0e0e0c00031af1040e0e0c00023c2a69293b692d2a69322a691ac1040e0e0c0001293c1ac3040c00031ad1043b3b1ad0040e0c000429352a362d1aa4040e0c0002293f1a9f040c00036403033b020a2d3f1a95040e0e0c00031aa104291aa5040e0e0c00021a91040e0e0c0002034829352a362a353d1a7c040e0c0003032e2a36291a80040e0c00021a6d040e0e0c000203162935293b1a6f040c000303041a6b04103b50296402013b640207292503511e553b6502012a641a21040e0e0c00011a4d042d1a4d040e0e0c000329311a1f040c00032f2a1a3f040c00032c3c2b1a3a040e0e0e0c000450331af3030c0002293f1aef030c00036403033b020a333f1ae5030e0e0c00032e2a1adf030c00036403043b50020a280f2e1a03040c000350303f1aca030e0e0e0c0003293f1ac3030c00036403321aa2030e0e0e0c0001293e1aa3030c0003293b1a9f030c0003651aa4030e0c0002030c280b3b1ac0030e0c000302013b02013b3b221d3b1a77030c0003293c1a7b030c00036403033b0222291b204e1a63030c000303033b0213293c1a8e030e0e0e0c0003292502501e353b6464221d1a7e030e0e0e0c0002293b1a3f030c000303033b02103c221f1a5d030e0e0c000326031e603b657881093b22210e0c000209d100ff6d221e1a4a030e0e0e0c0002293c1a07030c000303043b500217221f1a35030e0e0c0002503d22201a19030e0e0c0003501acc020e0c0001293c1acf020c000322113b3b1add020e0e0c000429352a362d1ab0020e0c0002293f1aab020c00036403033b020a2d3f1aa1020e0e0c000322151ab3020c00021aa1020e0e0c0002033122201aa1020e0e0c00021a8d020e0e0c0002031a222035293b1a8e020e0e0e0c000303041a8702103b50296402013b0201291a49020e0e0c00011a75022d1a75020e0e0c000329311a47020202ae000c00032f2a1a63020c00032c3c2b1a5e020e0e0e0c000450331a17020c0002293f1a13020c00036403033b020a333f1a09020e0e0c00032e2a1a03020c00036403043b50020a280f2e1a27020c000350303f1aee010e0e0e0c0003293f1ae7010c00036403341ac6010e0e0e0c0001293e1ac7010c0003293b1ac3010c0003651ac8010e0c0002030d280b3b1ae4010e0c00035002023b5002023b50220c35220d36220e372b2b2b1adc016b6610221e1acc010e0c0002293c1a8b010c000303043b500217221f1ab9010e0e0c0002503d22201a9d010e0e0c0003501a50010e0c0001293c1a53010c000322113b3b1a61010e0e0c000429352a362d1a34010e0c0002293f1a2f010c00036403033b020a2d3f1a25010e0e0c000322151a37010c00021a25010e0e0c0002033122201a25010e0e0c00021a11010e0e0c0002031a222035293b1a12010e0e0e0c000303041a0b01103b50296402013b0201291acd000e0e0c00011af9002d1af9000e0e0c000329311acb000c00032f2a1aeb000c00032c3c2b1ae6000e0e0e0c000450331a9f000c0002293f1a9b000c00036403033b020a333f1a91000e0e0c00032e2a1a8b000c00036403043b50020a280f2e1aaf000c000350303f1a76000e0e0e0c0003293f1a6f000c00036403341a4e000e0e0e0c0001293e1a4f000c0003293b1a4b000c0003651a50000e0c0002030d280b3b1a6c000e0c00035002023b5002023b50220c2728430e0e0e0e0e0e000000005405000000000000|@13281,I72,I15,I248,I253,I113,I243,I251,I218,@13282,@281,I105,I232,@13283,-1,I244,I242,I255,I73,I106,I71,I70,I69,@13280| 13280:O5|@13286,155,0,155,0 13281:S18|4d414b455f28292e70726f74656374283229 13282:O2|@731,0 13283:O4|12,@286,@13285,@13284 13284:O5|@288,346,0,346,0 13285:S40|54686520737461636b2073697a65206d7573742062652067726561746572207468616e207a65726f 13286:S28|6d6c736f757263652f4d4c436f6d70696c65722f4d414b455f2e4d4c 13287:O2|@13288,@670 13288:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13289,@13273| 13289:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13290,@1898| 13290:O1|@13291 13291:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@68,I251,@1840| 13292:O2|@13293,@670 13293:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13294,@13273| 13294:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13295,@1898| 13295:O1|@13296 13296:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@23,I251,@1840| 13297:O2|@13298,@670 13298:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13299,@13273| 13299:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13300,@1898| 13300:O1|@13301 13301:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@27,I251,@1840| 13302:O2|@13303,@670 13303:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13304,@13273| 13304:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13305,@1898| 13305:O1|@13306 13306:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@66,I251,@1840| 13307:O2|@13308,@670 13308:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13309,@13273| 13309:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@67,@1842,I251,@13311,@1862| 13310:S27|4d414b455f28292e6462456e76456e746572283129283129283129 13311:O1|@13313 13312:S24|4d414b455f28292e6462456e76456e746572283429283129 13313:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@67,I251,@13311| 13314:O2|@13315,@670 13315:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13316,@13273| 13316:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@68,@1842,I251,@13317,@1862| 13317:O1|@13318 13318:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@68,I251,@13317| 13319:O2|@13320,@670 13320:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13321,@13273| 13321:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@23,@1842,I251,@13322,@1862| 13322:O1|@13323 13323:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@23,I251,@13322| 13324:O2|@13325,@670 13325:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13326,@13273| 13326:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13327,@1898| 13327:O1|@13328 13328:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@38,I251,@1840| 13329:O2|@13330,@670 13330:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13331,@13273| 13331:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@27,@1842,I251,@13332,@1862| 13332:O1|@13333 13333:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@27,I251,@13332| 13334:O2|@13335,@670 13335:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13336,@13273| 13336:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@67,I251,@1840| 13337:S28|4d414b455f28292e6462456e764c6f6f6b7570283129283129283129 13338:S25|4d414b455f28292e6462456e764c6f6f6b7570283329283129 13339:O2|@13340,@670 13340:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13341,@13273| 13341:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@68,I251,@1840| 13342:O2|@13343,@670 13343:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13344,@13273| 13344:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@23,I251,@1840| 13345:O2|@13346,@670 13346:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13347,@13273| 13347:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@66,@1842,I251,@13348,@1862| 13348:O1|@13349 13349:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@66,I251,@13348| 13350:O2|@13351,@670 13351:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13352,@13273| 13352:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@27,I251,@1840| 13353:O2|@13354,@670 13354:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13355,@13273| 13355:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@38,@1842,I251,@13356,@1862| 13356:O1|@13357 13357:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@38,I251,@13356| 13358:O2|@13359,@670 13359:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13360,@13273| 13360:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@66,I251,@1840| 13361:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13362,@13273| 13362:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@38,I251,@1840| 13363:O2|@13365,@13364 13364:O2|@13366,0 13365:S13|6c696e654e756d626572546167 13366:O4|@23,69,@13367,0 13367:O7|@13365,2,@13368,@13102,@690,0,0 13368:O2|1,@13369 13369:O3|2,@13370,0 13370:O3|@13372,@13374,@13371 13371:O2|@13376,@86 13372:O2|@13373,@86 13373:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13374:O2|@13375,@86 13375:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13376:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13377:O2|@13379,@13378 13378:O2|@13380,0 13379:S12|757365576974685061726d73 13380:O4|@23,69,@13381,0 13381:O7|@13379,2,@13383,@13382,@690,0,0 13382:O3|2,@11580,@13622 13383:O2|1,@13384 13384:O3|2,@13385,0 13385:O2|@13386,@670 13386:D2,28|00801a1b002c56276a420e0e0e0e0e0e000000001400000000000000|@13388,@13387| 13387:D2,28|00802b561756281a16002e7b05030004000000001400000000000000|@13390,@13389| 13388:S24|4d414b455f28292e757365496e746f456e76283129283129 13389:O1|@13391 13390:S27|4d414b455f28292e757365496e746f456e76283129283129283129 13391:D28,812|00821a2b032e1a2b030c000329401a23030c00031a21033b1a21030e0e0c0003292b1a1b030c0003501a0c033b1a0c030e0c000329392a1a0a032b1a0a030e0e0e0c00043c3b1a03030c000329291aff020c00021afd020e0e0c0002035929352a362a1af2021af3020c000303033c02222a1adb020c00021ad9020e0e0c000203102a3b1ad1023b28061ad3020c000602013b0311291ab7020c00021ab5020e0e0c000202013b030429350207292503511e643b650202282e6429220d1aa4020e0c00030402002a2a1a9c020e0c00035029352a3629282e1a59020e0e0c0003291a88021a4d020e0e0c00032c1a60020e0c00021a5d020e0e0c000203522c35291a6c021a55020e0e0c000303033c0222291a3b020c00021a39020e0e0c00020310293b1a49023b3f1a34020e0c000602013b03032a02152a282e1af6010e0e0e0c0003292b1aeb010c000364640201297881c278810b3e3b2f1a17020c0004056200ff6d0403002a351a0b021aec010e0c0003030e2a2a2a35452a36462a37475102302a353c1ad2010e0e0e0c000303101ae7012a2a35452a36462a37475102122d2b1ad9016a2a1acc01451ad401462a475129352a362b372b2b2b1ac8016b270410292d3c1ac2010e0e0e0c00043c2a693c28402b1ab6010e0e0e0c00043c28483c1aa9010e0e0c00043c2b2b6a3c28482b1a99010e0e0c00043c28483c1a8d010e0e0c0004292b6929220c69270909ca0e0e0e00ff6d29351a5a011a3b010c000303043b500202291078810b3e3b341a3f010c0004056200ff6d0403002a351a33011a14010e0c0003030e2a2a2a35452a36462a37475102302a353c1afa000e0e0e0c000303101a0f012a2a35452a36462a3747510212322b1a01016a2a1af400451afc00462a475129352a362b372b2b2b1af0006b27041029323c1aea000e0e0e0c00043c2a693c28402b1ade000e0e0e0c00043c28483c1ad1000e0e0c00043c2b2b6a3c28482b1ac1000e0e0c00043c28483c1ab50002020e000e0e0c0004292b6929221169270a29352a3622141a9e000e0e0e0c00022a2c22186a2a0e0e0e0c0002512a352b36291a87002c1a330022197b051900040e0e0e0e000000002403000000000000|@13393,@13394,@389,@14557,I253,@333,@457,@279,I150,I105,I218,@13395,I251,I154,@13396,@13439,@13445,I48,I61,@7,@473,@13446,@454,@13447,@560,I11,@13449,@13392| 13392:O1|@13621 13393:S21|4d414b455f28292e757365496e746f456e76283329 13394:S5|5573653a20 13395:S2|2d49 13396:O6|@13398,@13414,@13425,@236,@13434,@13397 13397:O1|@13437 13398:D16,684|00810403002d1aa7021aa8020e0c000303033c02222d1a9f020c00021a9d020e0e0c000203102d3b1a85023b3f1a90020e0c000602013b03101a88022a2a35452a36462a37475102592d56280e0c000229352a362b372c38321a6c020e0c0002292b1a67020c0003342c2b1a62020e0e0e0c00042956ab1a5a020e0e0e0c00032e030b301a35020e0e0c000202013b03071a1c022a690201293331452a463247260b29352a362b37040300301a01021a02020e0e0e0c000303033c0222301af7010c00021af5010e0e0c00020310303b1add013b3f1ae8010e0c000602013b03101ae0012a2a35452a36462a37475102593056680e0c000229352a362b372c38220c1ac3010c0002292b1abf010c0003220e2c2b1ab9010e0e0c00042956eb1ab2010e0e0e0c00032e030b301a8d010e0e0c000202013b03071a74012a690201293331452a463247260b29352a362b3729030b56891a80013b1a80016b103b503b502b1a4a011a4b010c000303033c02222b1a43010c00021a41010e0e0c000203102b3b1a29013b3f1a34010e0c000602013b1a26010e0e0e0c000203702f569a0c00022c56aa0e0e0c00022a2a1a03010c000303033c024a2a1afb000c00021af9000e0e0c00020314291aea000e0e0e0c00021ae5000e0e0c000202013b03212a3b2b3b3f2e1ade000e0e0e0c00021aed000e0e0c00031ac5000e0e0c000602013b651ab5000e0e0c000202013b030b56891ac2003b1aca006b103b503b503356980e0e0c0002293764035f2a1a87000c00021a85000e0e0c000203382a35291a6c001a6d000e0e0c000303033c0222291a63000c00021a61000e0e0c00020310293b1a49003b3f1a54000e0c000602013b6402013b03042a3602012a302a3056c7220e0e0e7b050d00042e2b1a57000c0003302a3056c7220e7b050d000400000000a402000000000000|@13400,I48,I251,I105,I218,I154,@13401,I223,I107,@6192,@13402,@13408,@13409,I239,@13411,@13399| 13399:O1|@13412 13400:S17|4f532e506174682e636f6e636174283229 13401:O3|I48,0,0 13402:O1|@13403 13403:D3,44|00812c1a2a000e0e0e0c00023b3b2b30301a2000310e0e7b070500060e0e0e0e000000002400000000000000|@13405,I223,@13404| 13404:O1|@13406 13405:S16|537472696e672e6669656c6473283229 13406:D9,188|00842e2e1ab9000e0e0c0003031c2e301ab1000e0e0c00032d312b1aaa000e0e0e0c0004293b6965027e2c1a9e000e0e0e0c000203032c02142e3f1a92000e0e0e0c00032d2a1a8b000c0003642c0e0e0e0c000203392e301a69000e0e0c00032d312b1a62000e0e0e0c0004303c1a67000c0003313c1a5f000c0003292b3333331a58000e0c00062c2a69270502192e3c1a44000e0c0003302a3030301a3c00310e0e7b070800061f050e0e0e0e0e0e00000000b400000000000000|@13407,I113,I107,@6192,I105,I239,I252,I106,@13404| 13407:S25|537472696e672e6669656c64732832296669656c6427283229 13408:S4|50617468 13409:O5|@13410,582,0,582,0 13410:S14|2e2f62617369732f4f532e736d6c 13411:O5|@13410,584,0,584,0 13412:D7,132|00812c1a82000e0e0e0c00021a7d000e0e0c0002035d2c352d36293b1a71000e0e0c0003033b2a1a6a001a63000c000303033c02222a1a4f000c00021a4d000e0e0c000203102a3b1a49003b3f1a48000e0c000602013b03032d02032a2e69020f292e1a36000e0e0e0c00032b2a69646502012b430e0e0e000000007c00000000000000|@13413,I105,I218,I251,I48,I154,@13399| 13413:S32|4f532e506174682e636f6e636174283229636f6e636174417263732832292829 13414:O7|@13416,@236,@13425,47,@237,@13430,@13415 13415:O1|@13432 13416:D12,220|00822d2c69561c0e0e0c00021ad1000e0e0c0002030b56071ac9003b1ac9006b103b503b502c291ac2000e0e0e0c00021aad000e0e0c0002032129352a362a564b0c00021a99000e0e0c000203033c0207292503511e2f3b6502013b64030b560a1a8c003b1a8c006b103b503b502b3c1a85000e0e0c0003030c2d56191a7c000e0c000302012d2d56291a73000c00032a2a69651a6d000e0e0c00022956280e0e0c00022935292f1a4d000e0e0c00031a2d000e0e0c0002030b56371a25003b1a45006b103b503b502b66440e0e0e0e00000000d400000000000000|@13418,I218,@13408,@13419,I105,@13420,@13421,I251,@389,@13422,@371,@13417| 13417:O5|@13410,402,0,402,0 13418:S19|4f532e506174682e746f537472696e67283329 13419:O5|@13410,384,0,384,0 13420:S10|496e76616c6964417263 13421:O5|@13410,387,0,387,0 13422:O1|@13423 13423:D5,76|00812c1a4a000e0e0e0c00021a45000e0e0c000203282c352d36293b1a39000e0e0c000303052a3b690210292e1a2c000e0c00032e2a692c2a69656502013b43000000004400000000000000|@13424,I105,I218,I251,@13422| 13424:S33|4f532e506174682e746f537472696e6728332961726373546f4c696e6b73283129 13425:O1|@13426 13426:D10,156|00800404002c1a97000c0002293b1a93000c00036403402c1a85000e0e0c00023b2a1a83000c00036403041a7e00103b502c1a7b000c000203032c020b2c3f1a72000e0e0e0c000329282f1a6a000e0e0e0c00036402013b03131a5f002a2a35452a36462a37472a38485102111a50002a2a35452a36462a37472a38485129352a362b372c382c2c2c2c6b2705420e0e000000009400000000000000|@13428,I223,I233,I231,@337,I105,I252,I251,@13429,@13427| 13427:O4|0,I48,0,0 13428:S33|4f532e506174682e6d61746368566f6c756d65507265666978506f736978283129 13429:O4|1,I48,1,1 13430:O1|@13431 13431:D8,148|00802b1a92000e0e0e0c00023b292b1a8a000e0e0e0c000303033b02522d1a7f000c000203032d0214293f1a76000e0e0e0c00032e2a1a6f000c00036429282f1a69000e0e0c000303033c020b293b1a5a000e0e0e0c00030305296801020f2a3c1a40000e0c00032502501e5e3b6464293b1a37000c00031a35000e0e0c0002651a2c002c800002000000008c00000000000000|@3751,I223,I247,I105,I239,I252,I251,I218| 13432:D6,76|00802b35291a48001a49000e0e0c000303033c0224291a3f000c00021a3d000e0e0c00020312293b1a25003b3f1a3000310e0e7b070400063b64420e0e0e0e0e000000004400000000000000|@13433,I48,I251,I105,I218,I154| 13433:S23|4f532e506174682e76616c6964566f6c756d652d283129 13434:O1|@13435 13435:D1,20|00802b420e0e0e0e000000000c00000000000000|@13436| 13436:S27|4f532e506174682e746f43616e6f6e6963616c436173652d283129 13437:D2,28|00802b282f1a18002d0e0e0e7e030003000000001400000000000000|@13438,I251| 13438:S23|4f532e506174682e6973536570617261746f722d283129 13439:O2|@13440,@13397 13440:D8,132|00812c1a82000e0e0e0c0002293c1a7b000c000356272f2c1a75000e0e0c0005291a70000e0c00021a6d000e0e0c0002033e29352f3b2b1a62000e0e0e0c00042a3c1a5b000c00032d2c1a3f000c0003293c1a37000c0003332c2b1a3e000e0e0e0c0004296801342a452f46270702052d3b452f4665430e000000007c00000000000000|@13442,I223,I107,@13441,I105,I218,@6192,I106| 13441:O1|@13443 13442:S23|4f532e506174682e73706c697442617365457874283129 13443:D13,364|00832e3b1a69010e0e0c000303033b0fd02e3b1a5e010e0e0e0c000303033c02102c1a53010c00022f2a1a4f010c00036403041a4a01103b503b502c1a45010e0e0c000203032c02142e3f1a3a010e0e0e0c00032d2a1a33010c0003642e0e0e0e0c000203033b0fcc2e3b1a06010e0e0e0c000303033c02102c1afb000c00022f2a1af7000c00036403041af200103b503b502c1aed000e0e0c000203032c02142e3f1ae2000e0e0e0c00032d2a1adb000c00036429282e1ad5000e0e0c00036403832b3c1acc000e0c00032f2a1ac7000c00036403033b026a2e3c1ab500020279000e0e0c0003293b1a87000c000303033c02102d1a7f000c00022a2a1a7b000c00036403041a7600103b503b502d1a71000e0e0c000203032d0214293f1a66000e0e0e0c00032e2a1a5f000c000364642e020225000e0e0c000203033b02032e680102162e3c1a49000e0e0c00032e2e2e1a46002f7b060600051f040e0e000000006401000000000000|@13444,I232,I234,I223,I231,@337,I105,I239,I252,I251,I107,I113,@13441| 13444:S32|4f532e506174682e73706c697442617365457874283129676574457874283129 13445:S3|353630 13446:S13|54657874494f2e6f70656e496e 13447:O5|@13448,293,0,293,0 13448:S18|2e2f62617369732f54657874494f2e736d6c 13449:O1|@13450 13450:D20,156|00801a9b002c691a9a002d691a99002e691a98002f691a970030691a960031691a950032691a940033691a930034691a9200220c691a9000220d691a8e00220e691a8c00220f691a8a002210691a88002211691a86002212691a84002213691a82002214692e2c2f2f2d2210220d2211322212221b2219221c2213221d2217221c221e68121a60002a22176a29271442000000009400000000000000|@13452,@13453,@13455,@13457,@13459,@13461,@13463,@13465,@13469,@13473,@13477,@13481,@13485,@13489,@13493,@13497,@13501,@13505,@13509,@13451| 13451:D2,36|00802b352c362d37563756481a1900300e0e0e7b07030006000000001c00000000000000|@13514,@13513| 13452:S25|4d414b455f28292e636f6d70696c65496e746f456e76283129 13453:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13454,@13273| 13454:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@67,I251,@1840| 13455:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13456,@13273| 13456:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@23,I251,@1840| 13457:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13458,@13273| 13458:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@27,I251,@1840| 13459:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13460,@13273| 13460:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@68,I251,@1840| 13461:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13462,@13273| 13462:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@38,I251,@1840| 13463:D3,36|00805607355617361a1d002a2f6a292c1a1900307e060003000000001c00000000000000|@13337,@13464,@13273| 13464:D7,132|0080560756181a7f000c0003291a7c000e0c00021a79000e0e0c00020356293529291a67000c00021a65000e0e0c0002033e29352a362a35291a58001a59000e0e0c000364031f2a351a48001a49000e0e0c000303043b5002041a3f00102a37296801640207292503511e493b6502013b6502013b64420e000000007c00000000000000|@13338,@1842,I105,I218,@66,I251,@1840| 13465:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13466,@13273| 13466:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@67,@1842,I251,@13467,@1862| 13467:O1|@13468 13468:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@67,I251,@13467| 13469:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13470,@13273| 13470:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@23,@1842,I251,@13471,@1862| 13471:O1|@13472 13472:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@23,I251,@13471| 13473:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13474,@13273| 13474:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@27,@1842,I251,@13475,@1862| 13475:O1|@13476 13476:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@27,I251,@13475| 13477:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13478,@13273| 13478:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@38,@1842,I251,@13479,@1862| 13479:O1|@13480 13480:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@38,I251,@13479| 13481:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13482,@13273| 13482:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@68,@1842,I251,@13483,@1862| 13483:O1|@13484 13484:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@68,I251,@13483| 13485:D3,44|00802b352c365627355637361a21002a2e2e6b292c1a1c00320e0e0e7e080003000000002400000000000000|@13310,@13486,@13273| 13486:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@66,@1842,I251,@13487,@1862| 13487:O1|@13488 13488:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@66,I251,@13487| 13489:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13490,@13273| 13490:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13491,@1898| 13491:O1|@13492 13492:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@67,I251,@1840| 13493:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13494,@13273| 13494:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13495,@1898| 13495:O1|@13496 13496:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@23,I251,@1840| 13497:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13498,@13273| 13498:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13499,@1898| 13499:O1|@13500 13500:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@27,I251,@1840| 13501:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13502,@13273| 13502:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13503,@1898| 13503:O1|@13504 13504:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@68,I251,@1840| 13505:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13506,@13273| 13506:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13507,@1898| 13507:O1|@13508 13508:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@38,I251,@1840| 13509:D3,36|00805607355617361a1d002a69292c1a1a00300e7e060003000000001c00000000000000|@13274,@13510,@13273| 13510:D3,36|008056073b1a20001a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13277,@13511,@1898| 13511:O1|@13512 13512:D6,108|00822c2c2a1a68000e0c00021a65000e0e0c000203462a352b362a35291a58001a59000e0e0c00036403222a351a48001a49000e0e0c000303043b5002041a3f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000006400000000000000|@1901,I105,I218,@66,I251,@1840| 13513:O1|@13515 13514:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283129 13515:D37,820|00843c28403c1a2f030c00043c28403b1a25030e0e0c00041a21032a2c336b7882cb2c3b1a19030e0e0c00031a15030e0e0c000207dd1a0f032e691a0e0328452b3b6b1a0a032845220f3b6b291a0403692b2a691a01032a691a00032a69293b1afd020e0e0c000303042210020a22102a1af0020e0c00032210342b1ae9020e0e0c00042936291ae2020e0e0e0c00021ab1020e0e0c000203043b5002041acf0210293578810b2b1ac9020e0e0c0002052800ff6d2935280d1aa4020e0c000303043b5002022910293729352a362a2a1aa5020e0e0c0003270429352a362b372c382d392e3a2e291a810202028f010e0e0c00021a4d020e0e0c0002032e29352a362a352b36221e35221f361a6d022a2e020263012e6b292c1a64020e0c0003502e250826071e3f260702023b50502c291a38020e0c00021a09020e0e0c0002032a29352a362a352b36221e35221f361a31022a2e2e6b292c1a24020e0c0003502e250826071e36260702023b505029291af8010e0c00021ac9010e0e0c0002032a29352a362a352b36221e35221f361af5012a2e2e6b292c1ae4010e0c0003502e250826071e36260702023b50502a291ab8010e0c00021a89010e0e0c0002032a29352a362a352b36221e35221f361ab9012a2e2e6b292c1aa4010e0c0003502e250826071e36260702023b50502b291a78010e0c00021a49010e0e0c0002032a29352a362a352b36221e35221f361a7d012a2e2e6b292c1a64010e0c0003502e250826071e36260702023b50502d291a38010e0c00021a09010e0e0c0002032a29352a362a352b36221e35221f361a41012a2e2e6b292c1a24010e0c0003502e250826071e36260702023b502613204e023b271202013b05a90e0e0e00ff6d293528671ad8000e0c0003031e293733353436291a00012c1a00010e0c00045028671afa002d1afa006b103b50293c1a8d000e0e0c00031aed002a1aed000e0e0c0003291ae8001ae1000e0e0c00031ae1003b1a69000e0e0c0003292b1ad7000c0003501acc003b1a54000e0c000329392a1ac6002b1aa2000e0e0e0c000450220f35221036291ab5002c1a8d000e0e0c0004503135323633372b2b2b1aa3006b6610661f050e000000002c03000000000000|@13517,I11,@13518,I253,I218,@13540,@86,@88,@13542,@13583,@13586,I251,@13587,@6146,I105,@13589,I32,@11550,@13592,@13273,@13595,@13598,@13601,@13604,@13607,@13610,@279,@407,@13617,@11566,@389,@13618,@14557,@333,@457,@13619,@13516| 13516:O5|@13286,326,0,326,0 13517:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329 13518:D7,116|0080560935561936291a6c002c1a6c000e0c0004293b1a67000c0003030e56373b3c1a5f000c0004503b0233293529401a4d000e0e0c0003032356483b1a48000e0c0003293c1a43000c000356683b2b1a31000e0e0c0004502c6502012a6466420e0e0e0e0e0e0e000000006c00000000000000|@13520,@13519,@279,I251,I255,I253,I106| 13519:O1|@13521 13520:S41|4d414b455f28292e636f6d70696c65496e746f456e7628312975736528332967657443686172283129 13521:D11,140|00802b3b1a89000e0e0c00030402002a3c2b1a7f000c00045029352a362a1a77000c0002303b2c1a72000e0e0e0c000450291a6b000c0002293b1a67000c00036403033b0236291a56000e0e0e0c00023b2a1a53000c00036403041a4e00103b50291a4b000c0002030329020b293f1a42000e0e0e0c0003296801642705420e000000008400000000000000|@13523,I253,@13522,@371,I255,I223,I113,I231,@337,I105,I252| 13522:O2|@13525,@13524 13523:S32|4261736963496d7065726174697665494f28292e696e70757431283129283129 13524:O2|@13530,I48 13525:D10,308|00822d353b1a30010e0c000307d32d362e372f3830392c1a22010e0e0e0c0002293b1a1b010c0003030b2d3b69312a452e466402ca292c1a0a010e0e0e0c0003322a1a03010c00036403363168012e2d2b1af8000e0c000429352a362b371aef000c0004293b692f220d1ae7000c00033b33332c336805220d2c452a462706027e292c1abe000e0e0e0c0003322a1aaf000c00036403202d2c3b1aaf000c000429352a362b371aa7000c0004293b69332a453046660248292c1a88000e0c0003322a1a7f000c00030402002f2b2b340e0e0c00045029352a3632313b1a6d00020220000e0e0c000429352a362b371a5f000c0004292d69220f2a452d4627082705021e2d362e372a2a306a2956472c1a46000e0e0e0c00042f2a35452a36462704440e0e0e0e0e0e000000002c01000000000000|@13527,I251,I223,I113,I107,I234,@479,@13526,I106,@279| 13526:O1|@13528 13527:S29|426173696353747265616d494f28292e696e7075744e4c697374283229 13528:D15,212|00822b1ad2000e0e0e0c00022e3b1acb000c0003030c2d2a1ac1000e0e0c000302013b03032c02982d3b1aaf000c000303051aab0002892d3c1aa0000e0c000303162e3f1a9d000e0e0c00032d2a1a97002f0e0e7e0700032d28081a86000e0e0e0c0003293c1a83000c0003293f1a7f000c0003291a7c001a7d000e0e0c000303041a7700103b502928413b1a71000e0e0c000429321a6b000c0003503f331a42000e0e0e0c0003312a2c3f220d1a57000c0006502a1a53000c0002502a270564440e0e0e0e0e0e00000000cc00000000000000|@13529,I223,I251,I48,I239,I252,I240,I241,16777215,I247,@391,I11,I151,I198,I47| 13529:S19|537562737472696e672e766563746f72283129 13530:D2,52|00802b352c362d370402002c2c2c2c56871a24000e0c00065029352a362a2a692706420e0e0e0e0e000000002c00000000000000|@13532,@13531| 13531:O1|@13533 13532:S30|426173696353747265616d494f28292e696e7075744e4c69737427283129 13533:D11,316|00842f3b1a39010e0e0c000329353d1a32010e0e0e0c0003030f2c3b693c32326a2f2b452a46650fcb29353b1a15010e0e0c000303b229362a372b382b1a08010e0c0002293b1a03010c000303102c3b693c2d220d6a332b452a46650286322a1aed000e0e0c000303343268012d3b2b1ae1000e0e0c000429352a362b371ad7000c0004293b693c3022106a3b322b2211336805220e2c452a4627060246322a1aa9000e0e0c000303102c3b693c2d220d6a332b452a4665022a322a1a9d000e0e0c00030402002d220d2c2c220d1a8f000c00065029352a36302b69220d2a452b4627052704024504020031312b301a7200020237000e0e0e0c00055029352a362a1a43000c0002293b1a3f000c000364030b2a3b69312a452b4664020e33333333331a3a00347b070b000666641f05000000003401000000000000|@13535,I253,I251,I223,I113,I234,@479,@13526,I107,@13531,@13534| 13534:O1|@13536 13535:S30|426173696353747265616d494f28292e696e7075744e4c69737427283329 13536:D12,220|00832e3b1ad9000e0e0c000329353c1ad2000e0e0e0c0003038a2936292309291ac5000e0e0c00021ac1000e0e0c000203043b5002172a35291ab4001ab5006a1ab5001ab6002b1ab6006b64103b5029352b3a2c230b2a3b1a89000e0e0c000303033b020b2a353b2a0c0002296801652a2d0e0e0e0c00023c2840321a85000e0e0c00043b2b2b2e6b220f3b2b1a78000e0c0004503c2b22106a220e2d452a46270a022829353d1a3a000e0e0e0c0003030c3c30306a2e2e452a4664020e29362a373c2a326a302c452a4666641f040e00000000d400000000000000|@13538,I253,I251,I105,I218,@461,@13539,@7,@454,@13537,I11,I255| 13537:O5|@456,140,0,140,0 13538:S25|426173696353747265616d494f28292e696e70757427283229 13539:S5|696e707574 13540:D2,28|008056073b1a18002d0e0e0e7e030003000000001400000000000000|@13541,I253| 13541:S39|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329636f64652d283129 13542:O2|@13544,@13543 13543:O2|@2919,@13554 13544:O4|@148,69,@13545,0 13545:O1|@13546 13546:D15,148|00802b352c372d3829352a372d03051a860002031a85002a3c1a84000e0c00032e1a80000e0c0002291a7c00691a7c002a692c2a691a78002a69312a691a74002a69312a6927091a6e000e0e0e0c00021a69003b1a69000e0e0c0003292b1a63000c0003501a54003b1a54000e0c000329392a1a52002b1a5200220e0e0e0e7b050c00040e0e0e0e000000008c00000000000000|@13548,@13549,@13550,@510,@9843,@13551,@13552,@13553,@13547,@371,@14557,I253,@333,@457,@279| 13547:S5|20696e2027 13548:S43|4d414b455f28292e636f6d70696c65496e746f456e762831297573652833296572726f7250726f63283129 13549:S6|4572726f722d 13550:S8|5761726e696e672d 13551:O2|10,0 13552:S2|2e0a 13553:S8|272c206c696e6520 13554:O2|@13556,@13555 13555:O2|@2949,@13557 13556:O4|@103,69,1,0 13557:O2|@13559,@13558 13558:O2|@13576,@13575 13559:O4|@177,69,@13560,0 13560:O1|@13561 13561:D3,36|00802b1a220028461a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13563,@10117,@13562| 13562:O1|@13564 13563:S24|5072657474792e7072657474795072696e74283129283129 13564:D4,60|00822d3b2d2f2f1a36000e0e0e0c0006292d1a2f000c0003641a2c000e0c0002030a402d2c0e0e0e7d0500023b440e0e000000003400000000000000|@13566,@13565,I113,I218| 13565:O1|@13567 13566:S21|5072657474792e7072657474795072696e74283329 13567:D18,476|00842f3b1ad9010e0e0c0003291ad4010e0c000203043b5002041acb0110293b1ac9010e0e0c00036403a52f3b1ab0010e0c0003291aac010e0c000203043b5002041aa30110293b1aa1010e0e0c00036403043b5002041a9601102f3630373139312c1a8e010e0e0e0c000333321a87010c0003293b1a73010c000303162b332e342e220c1a74011a7501220e0e0e7b090c000829352c342a1a48010e0c00021a61010e0e0c000203202a352b362a302d221022101a44010e0c00062a2a2505250526031e2c26030200512927060fd52f3b1a0b010c0003291a08010e0c000203043b5002041a1f0110293c1afd000e0e0c00036403762f3b1ae4000e0c0003291ae0000e0c000203043b5002041af70010293c1ad5000e0e0c00036403043b5002041ae600102f3629293b1ae1000e0e0c0003031828202f0c000250293c1ad2000e0e0e0c000325011e2002023b50502e2a1abe000e0e0e0c0003293b1aaf000c000303032902013b65025e2f3b1a6e000e0e0e0c0003291a68000e0c000203043b5002041a8f0010293e1a5d000e0e0c00036403043b5002041a7e00102f36292e020224000e0e0c000250291a6f000c00022f2a1a5b000c0003293b1a4f000c000303032902013b661f050e0e0e00000000d401000000000000|@13569,I253,I105,@3062,I251,@9847,I106,@13570,@13565,@13568,I218,@3062,@9852,I233,I107,@3062,@9845,I223| 13568:O1|@13573 13569:S30|5072657474792e7072657474795072696e742833296c61794f7574283329 13570:O1|@13571 13571:D15,404|00812c3b1a91010e0e0c0003291a8c010e0c000203043b5002041a830110293b1a81010e0e0c00036403852c3b1a68010e0c0003291a64010e0c000203043b5002041a5b0110293b1a59010e0e0c00036403043b5002041a4e01102c29362a372b382c396b29382e68012a2a2a1a2c010e0c00021a35010e0e0c0002032d2a352b362b3b1a1d010e0e0c000303033b020c2b352b2a1a18010e0c0003642a2a2505250526031e393b66020129270602d42c3b1ae3000c0003291ae0000e0c000203043b5002041aeb0010293c1ad5000e0e0c00036403572c3b1abc000e0c0003291ab8000e0c000203043b5002041ac30010293c1aad000e0e0c00036403043b5002041ab200102c29362a37692935292f1aa8000e0c000303102e2a1aa1000e0e0c00032968016402013b6602562c3b1a65000e0e0c0003291a60000e0c000203043b5002041a7b0010293e1a55000e0e0c00036403043b5002041a6a00102c361a68000e0c0002292d1a4f000c000303102c2a1a49000e0e0c00032968016402013b64430e0e0e000000008c01000000000000|@13572,I253,I105,@3062,I251,@9847,I218,@13570,@3062,@9852,I232,I107,@3062,@9845,I223| 13572:S31|5072657474792e7072657474795072696e7428332967657453697a65283229 13573:D16,724|0086311ad2020e0e0e0c00021acd020e0e0c000207cc313532362a3b1ac1020e0e0c0003291ab0020e0c000203043b5002041aaf0210293c1aad020e0e0c00036407cf291a91020e0e0c00021a8d020e0e0c00021a85020e0e0c00020303320fdd2a3b1a7a020e0e0e0c0003291a68020e0c000203043b5002041a670210293c1a65020e0e0c00036403043b5002041a5a02102a362b373303033c02bb342b1a4e020e0e0e0c000303033c02ab342b1a42020e0e0e0c00032c2a2a1a1a020e0e0e0c00021a15020e0e0c000203692a352b362a3b1a09020e0e0c0003291af8010202db010e0c000203043b5002041af30110293c1af1010e0e0c00036403052b680102302a2c1aef010c0003291ac8010202fe000e0c00021ac1010e0e0c0002031029352b2a2506250626041e723b6402013b6465020329680165290202d0003b1aa4010e0c00031a91010e0e0c0002651a88010e0c0002036a40330e0c000250312a1a96010e0e0e0c000329293b1a8e010e0e0e0c0003031c2820220c0e0e0e0c000250293c1a6a010e0e0e0c000325011e2502023b505031331a56010e0e0e0c0003292c1a4b010c00032e2a220f220f220f220f220f1a490122100e0e7b091000082a293b1a36010e0e0e0c000303182820340c000250293c1a16010e0e0e0c000325011e2102023b5050342b1a02010e0e0e0c00032c2a220d220d220d220d220d1afd00220e0e0e7b090e000802aa2a3b1ac9000e0e0c0003291ab8000e0c000203043b5002041adb0010293e1ab5000e0e0c00036403612a3b1aa0000e0c0003291a90000e0c000203043b5002041ab30010293e1a8d000e0e0c00036403043b5002041aa200102a3629320e0e0c000250291a97000c0002342a1a73000c00032c2a220d220d220d220d220d1a7100220e0e0e7b090e00082a30343332320e0e0e0c00062a2a34343434341a5200220c0e0e0e7b090c0008650201301f070e0e0e0e0e0e00000000cc02000000000000|@13574,I105,I218,I253,@3062,I251,@9852,I232,I107,@13570,I106,I233,@13568,@3062,@9845,I223| 13574:S40|5072657474792e7072657474795072696e742833296c61794f7574283329646f5072696e74283229 13575:O2|@2923,@13579 13576:O4|@99,69,@13577,0 13577:O1|@13578 13578:D1,20|00802814420e0e0e000000000c00000000000000|@13541| 13579:O2|@2925,@13580 13580:O2|@2933,@13581 13581:O2|@2927,@13582 13582:O2|@2931,0 13583:O4|@108,69,@13584,0 13584:O1|@13585 13585:D3,36|00802b1a220028461a21002e0e0e0e7b050300040e0e0e0e000000001c00000000000000|@13563,@10117,@13562| 13586:O4|@101,69,1,0 13587:O1|@13588 13588:D4,60|00812c1a3a000e0e0e0c00021a35000e0e0c000203142c352d36292e1a29000e0e0c00032b2a696602012b430e0e0e0e000000003400000000000000|@2036,I105,I218,@13587| 13589:O4|103,@407,@13591,@13590 13590:O5|@13286,303,0,303,0 13591:S13|537461746963204572726f7273 13592:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@67,@1842,I251,@13593,@1862| 13593:O1|@13594 13594:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@67,I251,@13593| 13595:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@23,@1842,I251,@13596,@1862| 13596:O1|@13597 13597:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@23,I251,@13596| 13598:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@38,@1842,I251,@13599,@1862| 13599:O1|@13600 13600:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@38,I251,@13599| 13601:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@68,@1842,I251,@13602,@1862| 13602:O1|@13603 13603:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@68,I251,@13602| 13604:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@66,@1842,I251,@13605,@1862| 13605:O1|@13606 13606:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@66,I251,@13605| 13607:D6,84|00801a5300284556293b6b561756281a4a000e0e0e0c0003293b1a43000c000303052a3b69020e2935292c1a36000e0e0e0c000364563756482b1a2b00310e7b050600040e0e0e0e000000004c00000000000000|@13312,@27,@1842,I251,@13608,@1862| 13608:O1|@13609 13609:D6,84|00812c1a52000e0e0e0c00021a4d000e0e0c000203292c352d362a35291a40001a41000e0e0c00036403052d2a69020c292e1a33000c00032b2a69646502032b3b69430e0e0e0e0e000000004c00000000000000|@1866,I105,I218,@27,I251,@13608| 13610:O1|@13611 13611:D5,76|00802b3b1a49000e0e0c00032929353b1a41000e0e0c0003030c2937292502501e133b64021229362a372a1a2a002b1a2a00327b0507000465420e0e0e0e0e0e000000004400000000000000|@13613,I253,I251,@13612,@279| 13612:O1|@13614 13613:S33|4261736963496d7065726174697665494f28292e636c6f7365496e283129283129 13614:D5,100|00802b293b1a60000e0c000329353c1a5a000e0e0e0c0003031a293629382c3b1a4d001a4e000e0e0e0c0004503b2a307d07000229353d1a32000e0e0e0c000303033b020a2937292503511e483b6465420e0e0e0e0e0e0e000000005c00000000000000|@13616,I253,I251,@13615,I255| 13615:O1|2 13616:S26|426173696353747265616d494f28292e646f436c6f7365283129 13617:O5|@13286,320,0,320,0 13618:S8|207261697365640a 13619:O1|@13620 13620:D5,76|00802b3b1a49000e0e0c00032929353b1a41000e0e0c0003030c2937292502501e133b64021229362a372a1a2a002b1a2a00327b0507000465420e0e0e0e0e0e000000004400000000000000|@13613,I253,I251,@13612,@279| 13621:D5,76|00802b3b1a49000e0e0c00032929353b1a41000e0e0c0003030c2937292502501e133b64021229362a372a1a2a002b1a2a00327b0507000465420e0e0e0e0e0e000000004400000000000000|@13613,I253,I251,@13612,@279| 13622:O3|2,@767,@1461 13623:O2|@13625,@13624 13624:O2|@13626,0 13625:S3|757365 13626:O4|@23,69,@13627,0 13627:O7|@13625,2,@13628,@13622,@690,0,0 13628:O2|1,@13629 13629:O3|2,@13630,0 13630:O2|@13631,@670 13631:D2,28|00802b3b56271a17002e0e7b05030004000000001400000000000000|@13390,@13389| 13632:O2|@13634,@13633 13633:O2|@13635,0 13634:S8|6465627567546167 13635:O4|@23,69,@13636,0 13636:O7|@13634,2,@13637,@12999,@690,0,0 13637:O2|1,@13638 13638:O3|2,@13639,0 13639:O3|@13641,@13643,@13640 13640:O2|@13645,@102 13641:O2|@13642,@102 13642:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13643:O2|@13644,@102 13644:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13645:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13646:O2|@12929,@13647 13647:O2|@13648,0 13648:O4|@27,69,@13649,0 13649:O2|@13650,0 13650:O3|@12929,@690,@13651 13651:O3|@13653,@13672,@13652 13652:O3|@13673,@717,@716 13653:O2|1,@13654 13654:O3|2,@13656,@13655 13655:O2|@13663,0 13656:O4|@13658,@238,@13660,@13657 13657:O1|@13662 13658:O1|@13659 13659:D2,20|00801a1300420e0e000000000c00000000000000|@1187,I251| 13660:O1|@13661 13661:D1,20|00803d420e0e0e0e000000000c00000000000000|@1196| 13662:D1,20|00803c420e0e0e0e000000000c00000000000000|@1198| 13663:O4|@34,69,@13664,0 13664:O3|2,4,@13665 13665:O5|@890,@13667,@1226,@13666,@848 13666:O4|@13656,@13658,@13660,@13657 13667:O2|@894,@13668 13668:O2|@1206,@13669 13669:O2|@13670,@1211 13670:O2|@13671,@855 13671:O3|0,@238,0 13672:O4|1,@81,1,0 13673:S12|4172726179322e6172726179 13674:O2|@13676,@13675 13675:O2|@13677,0 13676:S11|66696c654e616d65546167 13677:O4|@23,69,@13678,0 13678:O7|@13676,2,@13680,@13679,@690,0,0 13679:O5|5,@1248,@13011,@13010,@690 13680:O2|1,@13681 13681:O3|2,@13682,0 13682:O3|@13684,@13686,@13683 13683:O2|@13688,@88 13684:O2|@13685,@88 13685:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13686:O2|@13687,@88 13687:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13688:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13689:O2|@13691,@13690 13690:O2|@13692,0 13691:S14|7072696e744f7574707574546167 13692:O4|@23,69,@13693,0 13693:O7|@13691,2,@13694,@13085,@690,0,0 13694:O2|1,@13695 13695:O3|2,@13696,0 13696:O3|@13698,@13700,@13697 13697:O2|@13702,@177 13698:O2|@13699,@177 13699:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13700:O2|@13701,@177 13701:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13702:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13703:O2|@13705,@13704 13704:O2|@13706,0 13705:S16|7072696e74446570746846756e546167 13706:O4|@23,69,@13707,0 13707:O7|@13705,2,@13708,@13102,@690,0,0 13708:O2|1,@13709 13709:O3|2,@13710,0 13710:O3|@13712,@13714,@13711 13711:O2|@13716,@99 13712:O2|@13713,@99 13713:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13714:O2|@13715,@99 13715:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13716:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13717:O2|@6778,@13718 13718:O2|@13719,0 13719:O4|@23,69,@13720,0 13720:O7|@6778,2,@13722,@13721,@690,0,0 13721:O3|2,@767,@13742 13722:O2|1,@13723 13723:O3|2,@13724,0 13724:O1|@13725 13725:D15,268|00802b1a0a010e0e0e0c0002293d1a03010c00036403402b1af5000e0e0c00023d2a1af3000c00036403041aee00103b502b1aeb000c000203032b020b2b28061ae1000e0e0c00032928781ada000e0e0e0c00036402013b03033d02013c2c1aae000e0e0e0c00021ac1002e2b6a3b2a2d1abc000e0c0004291aa4000e0c00021ab1000e0e0c00020338293529352a362a1aa4001a7d000e0e0c000303041a9b00103b502a1a78000e0c000203032a02072a1a8b000c0002292b69296801270502013b291a59000e0e0c00021a65000e0e0c0002030a293529352968016502013b291a3b000c00021a49000e0e0c000203043b5002041a4b001029352706420e000000000401000000000000|@13727,I223,I233,I231,@337,I105,I252,I251,@13728,@13729,I218,@3771,@13735,I152,@13726| 13726:O4|8,@13740,@13741,@13739 13727:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129776f72644f66537472696e67283129 13728:D5,92|00802b56181a58000e0c000303033b023a56071a4e000e0e0e0c00020304560702172b3f1a41000e0e0c000356172a1a3a000e0e0e0c0003642c3c1a2a000e0e0e0c00032a2a6929680166420e0e0e0e000000005400000000000000|@6706,I251,I105,I239,I252| 13729:O1|@13730 13730:D12,1468|00822b3d1ab9050e0e0c00030304281002212b3c1aa9050e0e0c000303034002122b3e1a9a050e0e0e0c00030304280802013d2e2e0c0002291a88050e0c00021a85050e0e0c000207ce293529352928301a6c050e0c000307d12a3629320e0e0e0c0002291a5c050e0c00021a59050e0e0c000207d0293529352a362a28771a3e050e0e0e0c000307d2343d1a31050e0e0c000307c829220d0c0002291a24050e0c00021a21050e0e0c000207dd293529352a362a28781a06050e0e0e0c000303033c020b2a28581af5040e0e0c000303c8220f3d1ae8040e0c000303103b3b2b22131ae6040e0e0e0c000502aa3b3b2b2922140e0c0002291ac8040e0c00021ac5040e0e0c0002037b293529352a362a28301aba0402028f040e0e0e0c00030319283022141aab0402028a030c00032b2a1aa3040c00036402013b03372e22141a9804020257030e0c0003292c1a83040c00032928301a86040204a801f3000e0c00033c2a2e250a250a250a26071e7e3b66020d2f03092e2e692968016402013b6602112c030d2b0202c2002b692968016402013b270402b2220f3d1a20040e0c000303103b3b2f22131a1e040e0e0e0c000502963b3b2f2922140e0c0002291a00040e0c00021afd030e0e0c0002036b293529352a362a28301af2030e0e0e0c00030315283022141ae7030c00032b2a1ae3030c00036402013b032f2e22141ad8030e0c0003292c1ac7030c00032928301aca030e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27046602013b6402b1343d1a68030e0c000303103b3b2b220f1a66030e0e0e0c000502963b3b2b2922100e0c0002291a48030e0c00021a45030e0e0c0002036b293529352a362a28301a3a030e0e0e0c00030315283022101a2f030c00032b2a1a2b030c00036402013b032f2e22101a20030e0c0003292c1a0f030c00032928301a12030e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27040fdd2a28781ab4020e0c000303033c020b2a28581aa5020e0e0c0003030c343d1a99020e0e0c000302013b03b9343d1a8a020e0e0e0c000303103b3b2b220f1a86020e0e0e0c0005029a3b3b2b2922100e0c0002291a68020e0c00021a65020e0e0c0002036b293529352a362a28301a5a020e0e0e0c00030315283022101a4f020c00032b2a1a4b020c00036402013b032f2e22101a40020e0c0003292c1a2f020c00032928301a32020e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b6602112c03092b2b692968016402050202b7003b270402b2343d1ad1010e0e0c000303103b3b220f220f1acd010e0e0c000502963b3b220f2922100c0002291ab0010e0c00021aad010e0e0c0002036b293529352a362a28301aa2010e0e0e0c00030315283022101a97010c00032b2a1a93010c00036402013b032f2e22101a88010e0c0003292c1a77010c00032928301a7a010e0e0e0c00033c2a2e250a250a250a26071e6d3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27046602013b293b1a1b010c000303093b2c6929680164020129660fde2a3628092b1a25010e0e0c0003030c2a280d1a18010e0c000302013b03033c020c2a28201ae2000e0e0e0c0003030e2932321afc00330e0e7b050a0004303d1ac7000c0003030e3b3b34341ac700340e7b060a00053b3b3429220c0e0e0e0c0002291aa8000e0c00021aa5000e0e0c0002036d293529352a362a28301a9a000e0e0e0c000303152830220c1a8f000c00032b2a1a8b000c00036402013b032f2e220c1a80000e0c0003292c1a6f000c00032928301a72000e0e0e0c00033c2a2e250a250a250a26071e703b66020d2f03092e2e692968016402013b66020f0f002c03092b2b692968016402013b27056502013b65440e0e0e0e00000000b405000000000000|@13732,I251,I105,I218,@13731,I231,I106,I234,I108,I107,I248,@13729| 13731:O1|@13733 13732:S11|7363616e576f7264283329 13733:D9,324|00832c2c0e0c0002291a3c010e0c00021a39010e0e0c000207cb293529352a362a28301a2a010e0e0e0c0003030c2a28391a20010e0c000302013b032f3128101a15010e0e0c0003292c1a0f010c00032928301a0a010e0e0e0c00033c2a2e220c1a0001220d0e7b060d00052a28411ade000e0e0e0c0003030c2a28461ad4000e0c000302013b03373128101ac9000e0e0c0003292c1ac3000c00032928411abe000e0e0e0c000329401aaf000c00033c2a2f220d1aac00220e0e7b060e00052a28611a8a000e0e0e0c0003030c2a28661a80000e0c000302013b033b3128101a7500020241000e0e0c0003292c1a6b000c00032928611a66000e0e0e0c000329401a57000c00033c2a2f220d1a5400220e0e7b060e00053203093131692968016402013b66020d2f03092e2e692968016402013b641f04000000003c01000000000000|@13734,I105,I218,I231,I232,I108,I106,I107,@13731| 13734:S29|7363616e576f7264283329726561645f6865785f646967697473283329 13735:O4|5,@13737,0,@13736 13736:O5|@13738,297,0,297,0 13737:S8|4f766572666c6f77 13738:S21|2e2f62617369732f4c61726765576f72642e736d6c 13739:O5|@5762,548,0,548,0 13740:S10|436f6e76657273696f6e 13741:S21|496e76616c696420776f726420636f6e7374616e74 13742:O5|5,0,@2201,@2199,0 13743:O2|@6788,@13744 13744:O2|@13745,0 13745:O4|@23,69,@13746,0 13746:O7|@6788,2,@13748,@13747,@690,0,0 13747:O3|2,@767,@767 13748:O2|1,@13749 13749:O3|2,@13750,0 13750:O1|@13751 13751:D5,52|00802b1a32000e0e0e0c00021a2d002d2b6a3b2b2b301a27000c00051a25002e7d0500020e0e0e0e000000002c00000000000000|@13753,I223,@13754,@13752,@6236| 13752:O1|@13756 13753:S22|4d6973632e756e657363617065537472696e67283129 13754:D10,132|00802b56181a80000e0c000303033b02662b3b1a76000e0e0e0c000303033c021456071a6a000e0e0e0c00022c2a1a63000c00036403041a5e00103b5056071a5a000e0e0e0c00020304560702172b3f1a4d000e0e0c000356172a1a46000e0e0e0c0003642c3c1a3e000e0e0e0c00032a2a692968016642000000007c00000000000000|@13755,I113,I234,I223,I231,@337,I105,I239,I252,I106| 13755:S28|4d6973632e756e657363617065537472696e67283129726472283129 13756:D17,316|00832e2e1a39010e0e0c000303033b0fdd2e292e1a2d010e0e0c0003291a28010e0c00021a25010e0e0c000203ca29352935291a1a011a1b010c000303033c0222291a03010c00021a01010e0e0c00020310293b1af9003b3f1afc000e0c000602013b03832a3629331ad4000e0c000303033b025a293b1ae2000e0e0e0c000303033c0210301ad7000c00022a2a1ad3000c00036403041ace00103b50301aa7000c00020303300214293f1abe000e0e0e0c0003312a1ab7000c0003642a3c1ab2000e0e0e0c00032a2a6929680166293b1a80000e0c000303033b02082a250626051ed03b65020d2a362a2a02023d0069296801656502013b65291a4a000e0e0e0c00021a45000e0e0c000203043b5002041a630010293529352a36293232321a59000e0e0c00052b2a6927051f040e000000003401000000000000|@13758,I113,@13759,I105,I218,I48,I251,I154,I234,I223,I231,@337,I239,I252,I106,@13757,@13752| 13757:O4|8,@13740,@13769,@13768 13758:S34|4d6973632e756e657363617065537472696e67283129636f6e764368617273283129 13759:O1|@13760 13760:D14,916|00812c2c0e0c0002291a8c030e0c00021a89030e0e0c000207d4293529352a362a28201a7a030e0e0e0c000303033c020b287e2b1a69030e0e0c000303033b0fca2a285c1a5d030e0e0c000307cf29300e0c0002291a40030e0c00021a3d030e0e0c000207dc293529352928751a34030e0c000303342a363b3f2b220d1a28030e0c0005291a10030e0c00021a0d030e0e0c00020310293529352a362a2a69296801270402013b650fd029285e1af4020e0c000303872a3629340e0e0e0c0002291ad4020e0c00021ad1020e0e0c00020367293529352a362a28401ace020e0e0e0c00030310285f2b1ac00202028d020e0c000302013b033c2a28401ab1020e0e0c0003293b1aab0202026d020c000303033c020f2928ff1a9d02020254020e0e0c000303041a9302103b50292b692968016502013b6602013b650fd129282202022b021a5d020e0e0c0003030c2a3628222a69296801650fd229285c1a44020e0c0003030c2a36285c2a69296801650fcc2928721a2c020202f0010e0c0003030c2a36280d2a69296801650fd22928661a10020e0c0003030c2a36280c2a69296801650fcf2928761af8010e0c0003030c2a36280b2a69296801650fce29286e1ae0010e0c0003030b2a36402a69296801650fdb2928741ac9010e0e0c0003030c2a3628092a69296801650fdd2928621ab0010e0c0003030c2a3628082a69296801650fcb2928611a980102025c010e0c0003030c2a3628072a69296801650fd62a3628092b1a960102023e010e0e0e0c000303102a280d1a840102022c010e0c000302013b03033c020c2a28201a52010e0e0e0c000303c32929220c02020a010e0e0e0c0002291a2c010e0c00021a29010202f5000e0e0c0002034a293529352a3628092b1a36010202de000e0e0e0c0003030c2a280d1a24010e0c000302013b03033c02102a28201af6000202ba000e0e0e0c0003030a29250526041e643b02012d6602012a02029f006534020299000e0e0c0002291abc000e0c00021ab9000e0e0c0002032f293529352a362a285c1aae00020272000e0e0e0c00031a99000e0e0c000203033b02091ab4002a69296801646602013b64024e28302b1a9d000e0e0c0003030c2a28321a90000e0c000302013b03313b3e2f220d1a87000c0005291a50000e0c00021a4d000e0e0c00020310293529352a362a2a69296801270402013b6402013b646502013b6402072a2a69296801646602091a44002e69296801646443000000008c03000000000000|@13762,I105,I218,I250,I251,@13763,I231,I107,I234,I233,@385,I248,I48,@13761| 13761:O1|@13766 13762:S16|436861722e7363616e42617365283229 13763:O1|@13764 13764:D14,564|00832d3b1a31020e0e0c0003033b2e28ff1a28020e0c000303033b022a2e3b1a1e020e0e0e0c000303033c020b2e28ff1a09020e0e0c000303041a0702103b502e2d69296801640fd32c2c0e0e0c0002291af4010e0c00021af1010e0e0c000207ca293529352a3628302b1ae2010e0e0e0c0003030c2a28391ad4010e0c000302013b033b313c1aca010e0e0e0c00033328101ac2010e0e0e0c0003292d1abb010c00032928301aaa010e0e0e0c0003292d2f220d1aa801220e0e7b060e000528612b1a8a010e0e0e0c0003030c2a28661a7c010e0c000302013b0347313c1a72010e0e0e0c00033328101a6a010e0e0e0c0003292d1a63010c00032928611a52010e0e0e0c000329401a4f010c0003292e30220e1a4801220f020202010e7b060f000528412b1a26010202a8000e0e0e0c0003030c2a28461a14010e0c000302013b0343313c1a0a010e0e0e0c00033328101a02010e0e0e0c0003292d1afb000c00032928411aea000e0e0e0c000329401ae7000c0003292e30220e1ae000220f0e7b060f0005311ad8001ad9000e0e0c000303033c020b3228ff1a9d000e0e0c000303033b022a323b1a92000e0e0e0c000303033c020b3228ff1a7d000e0e0c000303041a7b00103b50323169296801646602492e1a8a001a8b000c000303033c020b2f28ff1a51000e0e0c000303033b022a2f3b1a46000e0e0e0c000303033c020b2f28ff1a31000e0e0c000303041a2f00103b502f2e6929680164641f040e0e0e0e0e0e000000002c02000000000000|@13765,I113,I233,I234,@385,I105,I218,I248,I107,I108,I106,@13763,-1,I231| 13765:S16|436861722e7265616448657827283429 13766:D13,284|00832d3b1a19010e0e0c0003033b2e28ff1a10010e0c000303033b022a2e3b1a06010e0e0e0c000303033c020b2e28ff1af1000e0e0c000303041aef00103b502e2d692968016402c32c2c0e0e0c0002291adc000e0c00021ad9000e0e0c0002035e293529352a3628302b1aca000e0e0e0c0003030c28392b1ac0000e0c000302013b0337313c1ab6000e0e0e0c000333401aaf000c0003292d1aab000c00032928301a9a000e0e0e0c0003292d2f220d1a9800220e0e7b060e00053b66024b2f28ff1a5e000e0e0e0c000303033c020b2e3b1a4e000e0e0e0c000303033b022a2f3b1a42000e0e0e0c000303033c020b2f28ff1a2d000e0e0c000303041a2b00103b502f2e6929680164641f040e0e000000001401000000000000|@13767,I113,I233,I234,@385,I105,I218,I248,I231,I107,I108,I106,@13761| 13767:S15|436861722e72656164446563283429 13768:O5|@13770,91,0,91,0 13769:S23|496e76616c696420737472696e6720636f6e7374616e74 13770:S32|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f4d6973632e4d4c 13771:O2|@13773,@13772 13772:O2|@13774,0 13773:S15|636f6d70696c657256657273696f6e 13774:O4|@23,69,@13775,0 13775:O7|@13773,2,@13776,@767,@690,0,0 13776:O2|1,@13777 13777:O3|2,@13778,0 13778:S11|352e362052656c65617365 13779:O2|@13781,@13780 13780:O2|@13782,0 13781:S16|7472616365436f6d70696c6572546167 13782:O4|@23,69,@13783,0 13783:O7|@13781,2,@13784,@12999,@690,0,0 13784:O2|1,@13785 13785:O3|2,@13786,0 13786:O3|@13788,@13790,@13787 13787:O2|@13792,@101 13788:O2|@13789,@101 13789:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13790:O2|@13791,@101 13791:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13792:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13793:O2|@13795,@13794 13794:O2|@13796,0 13795:S27|6e6172726f774f7665726c6f6164466c65785265636f7264546167 13796:O4|@23,69,@13797,0 13797:O7|@13795,2,@13798,@12999,@690,0,0 13798:O2|1,@13799 13799:O3|2,@13800,0 13800:O3|@13802,@13804,@13801 13801:O2|@13806,@105 13802:O2|@13803,@105 13803:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13804:O2|@13805,@105 13805:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13806:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13807:O2|@13809,@13808 13808:O2|@13810,0 13809:S19|6572726f724d65737361676550726f63546167 13810:O4|@23,69,@13811,0 13811:O7|@13809,2,@13813,@13812,@690,0,0 13812:O5|5,@13822,@13011,@13010,@690 13813:O2|1,@13814 13814:O3|2,@13815,0 13815:O3|@13817,@13819,@13816 13816:O2|@13821,@148 13817:O2|@13818,@148 13818:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13819:O2|@13820,@148 13820:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13821:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13822:O2|@13823,0 13823:O3|2,@13824,@1461 13824:O3|3,@13826,@13825 13825:O3|0,@13837,1 13826:O2|@13828,@13827 13827:O2|@13831,@13830 13828:O2|@13829,@693 13829:S4|68617264 13830:O2|@13834,@13833 13831:O2|@11667,@13832 13832:O5|5,@11891,@5590,@5447,@690 13833:O2|@13836,0 13834:O2|@13835,@970 13835:S7|6d657373616765 13836:O2|@1396,@1394 13837:O2|@13829,@13838 13838:O2|@11667,@13839 13839:O2|@13835,@13840 13840:O2|@1396,0 13841:O2|@2201,@13842 13842:O2|@13843,0 13843:O4|@27,69,@13844,0 13844:O2|@13845,0 13845:O3|@2201,@690,@13846 13846:O3|@13848,@13847,@2202 13847:O4|1,@240,0,0 13848:O2|1,@13849 13849:O3|2,@13850,0 13850:O4|I53,@239,1,1 13851:O1|@13852 13852:D2,20|00801a1300420e0e000000000c00000000000000|@13853,@713| 13853:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f547970655072696e746572283129 13854:O2|@13856,@13855 13855:O2|@13857,0 13856:S21|636f6d70696c657256657273696f6e4e756d626572 13857:O4|@23,69,@13858,0 13858:O7|@13856,2,@13859,@768,@690,0,0 13859:O2|1,@13860 13860:O3|2,560,0 13861:O2|@13863,@13862 13862:O2|@13864,0 13863:S9|556e6976657273616c 13864:O4|@38,69,@13865,0 13865:O4|@13863,@961,@13866,@690 13866:O6|@13868,I48,0,@690,@13867,0 13867:O1|@13918 13868:O4|1,@242,@243,@241 13869:O1|@13870 13870:D2,28|00802b401a19002d7e0300030e0e0e0e000000001400000000000000|@675,@674| 13871:O2|@11584,@13915 13872:O2|@13011,@13873 13873:O2|@13874,0 13874:O4|@27,69,@13875,0 13875:O2|@13010,0 13876:O2|@13878,@13877 13877:O2|@13879,0 13878:S10|74616750726f6a656374 13879:O4|@23,69,@13880,0 13880:O7|@13878,2,@13882,@13881,@690,0,0 13881:O3|2,@13888,@13887 13882:O2|1,@13883 13883:O3|2,@13884,0 13884:O1|@13885 13885:D1,20|00802b37420e0e0e000000000c00000000000000|@13886| 13886:S29|556e6976657273616c2e74616750726f6a6563742d2370726f6a656374 13887:O3|2,@11582,@13890 13888:O5|5,@13889,@13011,@13010,@690 13889:O2|@13890,0 13890:O3|6,@245,79992 13891:O2|@13893,@13892 13892:O2|@13894,0 13893:S9|746167496e6a656374 13894:O4|@23,69,@13895,0 13895:O7|@13893,2,@13897,@13896,@690,0,0 13896:O3|2,@13888,@13902 13897:O2|1,@13898 13898:O3|2,@13899,0 13899:O1|@13900 13900:D1,20|00802b36420e0e0e000000000c00000000000000|@13901| 13901:S27|556e6976657273616c2e746167496e6a6563742d23696e6a656374 13902:O3|2,@13890,@11582 13903:O2|@13905,@13904 13904:O2|@13906,0 13905:S5|7461674973 13906:O4|@23,69,@13907,0 13907:O7|@13905,2,@13909,@13908,@690,0,0 13908:O3|2,@13888,@13914 13909:O2|1,@13910 13910:O3|2,@13911,0 13911:O1|@13912 13912:D1,20|00802b35420e0e0e000000000c00000000000000|@13913| 13913:S19|556e6976657273616c2e74616749732d236973 13914:O3|2,@11582,@693 13915:O2|@13916,0 13916:O4|@27,69,@13917,0 13917:O2|@11583,0 13918:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 13919:O2|@6786,@13920 13920:O2|@13921,0 13921:O4|@23,69,@13922,0 13922:O7|@6786,2,@13924,@13923,@690,0,0 13923:O3|2,@767,@768 13924:O2|1,@13925 13925:O3|2,@13926,0 13926:O1|@13927 13927:D13,276|00802b1a12010e0e0e0c0002293e1a0b010c000364033f2b3b3d1a03010c0004291a00011a01010e0e0c000303033c0222291af7000c00021af5000e0e0c00020310293b1add003b28061ae7000c000602013b6402013b03033c02532b1ab8000e0c0002293f1ab3000c000364033f2b3b3e1aab000c0004291abc001aa9000e0e0c000303033c0222291a9f000c00021a9d000e0e0c00020310293b1a99003b28071a8f000c000602013b6402013b03033d02013c2c1a5f000c00021a7d002e2b6a3b2a2d1a78000e0c0004291a5c000e0c00021a59000e0e0c0002030a293529352968016502013b291a3f000c00021a3d000e0e0c000203043b5002041a43001029352705420e000000000c01000000000000|@13929,I223,I231,@6192,@6344,I251,I105,I218,I154,@13930,@13931,@6707,@13928| 13928:O4|8,@13740,@13933,@13932 13929:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129696e744f66537472696e67283129 13930:S3|7e3078 13931:D5,92|00802b56181a58000e0c000303033b023a56071a4e000e0e0e0c00020304560702172b3f1a41000e0e0c000356172a1a3a000e0e0e0c0003642c3c1a2a000e0e0e0c00032a2a6929680166420e0e0e0e000000005400000000000000|@6706,I251,I105,I239,I252| 13932:O5|@5762,537,0,537,0 13933:S24|496e76616c696420696e746567657220636f6e7374616e74 13934:O2|@13936,@13935 13935:O2|@13937,0 13936:S24|7265706f727444697363617264656456616c756573546167 13937:O4|@23,69,@13938,0 13938:O7|@13936,2,@13939,@13119,@690,0,0 13939:O2|1,@13940 13940:O3|2,@13941,0 13941:O3|@13943,@13945,@13942 13942:O2|@13947,@107 13943:O2|@13944,@107 13944:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13945:O2|@13946,@107 13946:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13947:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13948:O2|@13950,@13949 13949:O2|@13951,0 13950:S9|6f6666736574546167 13951:O4|@23,69,@13952,0 13952:O7|@13950,2,@13953,@13102,@690,0,0 13953:O2|1,@13954 13954:O3|2,@13955,0 13955:O3|@13957,@13959,@13956 13956:O2|@13961,@87 13957:O2|@13958,@87 13958:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13959:O2|@13960,@87 13960:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13961:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13962:O2|@13964,@13963 13963:O2|@13965,0 13964:S19|636f64657472656541667465724f7074546167 13965:O4|@23,69,@13966,0 13966:O7|@13964,2,@13967,@12999,@690,0,0 13967:O2|1,@13968 13968:O3|2,@13969,0 13969:O3|@13971,@13973,@13970 13970:O2|@13975,@97 13971:O2|@13972,@97 13972:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 13973:O2|@13974,@97 13974:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 13975:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 13976:O2|@13978,@13977 13977:O2|@13979,0 13978:S9|627974654172726179 13979:O4|@27,69,@13980,0 13980:O2|@13981,0 13981:O3|@13978,@690,@13982 13982:O3|@13984,@13987,@13983 13983:O3|@13978,@717,@716 13984:O2|1,@13985 13985:O3|2,@13986,0 13986:O4|I251,@246,2,1 13987:O4|1,@80,0,0 13988:O2|@13990,@13989 13989:O2|@13991,0 13990:S10|62797465566563746f72 13991:O4|@27,69,@13992,0 13992:O2|@13993,0 13993:O3|@13990,@690,@13994 13994:O3|@13996,@14044,@13995 13995:O3|@13990,@717,@716 13996:O2|1,@13997 13997:O3|2,@13999,@13998 13998:O2|@14005,0 13999:O4|@14000,@247,2,1 14000:O1|@14001 14001:D5,76|00812c1a4a000e0e0e0c00022c1a40000e0c00022a2a1a3b000c0003031a3f2b1a35000e0e0c00032f3b303b2d1a2c00330e0e7b070700063b65430e0e0e0e0e000000004400000000000000|@14002,I15,I251,I238,I154| 14002:S13|62797465566563746f722d6571 14003:O1|@14004 14004:D2,20|00801a1300420e0e000000000c00000000000000|@13853,@713| 14005:O4|@34,69,@14006,0 14006:O3|2,4,@14007 14007:O5|@890,@14009,@976,@14008,@848 14008:O2|@13999,@14000 14009:O2|@894,@14010 14010:O2|@14012,@14011 14011:O2|@14042,@2600 14012:O2|@1208,@14013 14013:O3|0,@14014,@876 14014:O8|@14016,@14002,0,0,@14015,0,3,1 14015:O2|@1729,@1722 14016:O3|10,@14018,@14017 14017:O4|1,@14026,@14025,@809 14018:O2|@14020,@14019 14019:O2|@14023,0 14020:O4|1,@843,0,@14021 14021:O4|3,@818,@14022,1 14022:O3|2,I15,0 14023:O4|1,@845,1,@14024 14024:O4|3,@804,@14022,1 14025:O3|10,@14031,@14030 14026:O4|3,@14027,@802,1 14027:O2|@4048,@14028 14028:O2|@14029,0 14029:O2|@1714,1 14030:O4|3,@14036,@823,1 14031:O2|@14032,0 14032:O4|1,@845,2,@14033 14033:O4|3,@14035,@14034,1 14034:O3|2,I238,0 14035:O2|@835,@4047 14036:O2|@805,@14037 14037:O2|@827,@14038 14038:O2|@806,@14039 14039:O2|@827,@14040 14040:O2|@14041,0 14041:O2|@11858,1 14042:O2|@14043,@855 14043:O3|0,@247,0 14044:O4|1,@248,0,0 14045:O2|@14047,@14046 14046:O2|@14048,0 14047:S20|70726f66696c65416c6c6f636174696f6e546167 14048:O4|@23,69,@14049,0 14049:O7|@14047,2,@14050,@13119,@690,0,0 14050:O2|1,@14051 14051:O3|2,@14052,0 14052:O3|@14054,@14056,@14053 14053:O2|@14058,@92 14054:O2|@14055,@92 14055:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 14056:O2|@14057,@92 14057:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 14058:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 14059:O2|@14061,0 14060:S13|6572726f724465707468546167 14061:O4|@23,69,@14062,0 14062:O7|@14060,2,@14063,@13119,@690,0,0 14063:O2|1,@14064 14064:O3|2,@14065,0 14065:O3|@14067,@14069,@14066 14066:O2|@14071,@98 14067:O2|@14068,@98 14068:D2,28|00802b352956271a16002e0e7e040003000000001400000000000000|@13006,I251| 14069:O2|@14070,@98 14070:D1,28|0080560728452d3b6b420e0e0e0e0e0e000000001400000000000000|@13006| 14071:D3,44|00802b3556171a27000c000303043b5002041a1f00102b37420e0e0e0e0e0e0e000000002400000000000000|@13006,I251,@1840| 14072:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 14073:O2|47,@14074 14074:O2|@14075,0 14075:O4|@23,69,@14076,0 14076:O7|47,2,@691,@12920,@690,0,0 14077:O2|@14079,@14078 14078:O2|@14080,0 14079:S3|646976 14080:O4|@23,69,@14081,0 14081:O7|@14079,2,@691,@12920,@690,0,0 14082:O2|@14084,@14083 14083:O2|@14085,0 14084:S6|766563746f72 14085:O4|@27,69,@14086,0 14086:O2|@14087,0 14087:O3|@14084,@690,@14088 14088:O3|@14090,@14171,@14089 14089:O3|@14084,@717,@716 14090:O2|1,@14091 14091:O3|2,@14093,@14092 14092:O2|@14109,0 14093:O4|@14095,@249,@14104,@14094 14094:O1|@14107 14095:O1|@14096 14096:D2,20|00801a13002c6942000000000c00000000000000|@14098,@14097| 14097:D5,108|00812c1a6a000e0e0e0c00022c1a60000e0c00022a2a1a5b000c0003033d3b2b2a1a50000e0c000303033c022b563735302b1a43000c0003302c1a3b000c00032b0c0003640310293c1a30000e0c000325011e333b02013b6402013b65430e0e000000006400000000000000|@14099,I15,I251,I253,I239| 14098:S11|766563746f722d65712829 14099:S9|766563746f722d6571 14100:O1|@14101 14101:D2,20|00801a1300420e0e000000000c00000000000000|@13022,@14102| 14102:O1|@14103 14103:D2,20|00801a1300420e0e000000000c00000000000000|@13024,@713| 14104:O1|@14105 14105:D1,20|00803d420e0e0e0e000000000c00000000000000|@14106| 14106:S12|626f7865642d766563746f72 14107:D1,20|00803c420e0e0e0e000000000c00000000000000|@14108| 14108:S11|73697a652d766563746f72 14109:O4|@34,69,@14110,0 14110:O3|2,4,@14111 14111:O5|@890,@14113,@1226,@14112,@848 14112:O4|@14093,@14095,@14104,@14094 14113:O2|@894,@14114 14114:O2|@14116,@14115 14115:O2|@14162,@14161 14116:O2|@1208,@14117 14117:O3|0,@14118,@876 14118:O8|@14120,@14098,0,0,@14119,0,0,1 14119:O2|@14148,0 14120:O2|7,@14121 14121:O8|@14122,@14099,0,@1343,@14015,0,3,1 14122:O3|10,@14018,@14123 14123:O4|1,@14026,@14124,@809 14124:O3|0,@14126,@14125 14125:O2|@14146,0 14126:O4|1,@14128,@742,@14127 14127:O4|1,@14131,@14130,@809 14128:O4|3,@14129,@802,1 14129:O2|@4048,@14040 14130:O2|9,@14140 14131:O4|3,@14132,@1322,1 14132:O2|@14134,@14133 14133:O2|@14137,0 14134:O2|@14135,1 14135:O4|3,@14136,@2701,1 14136:O2|@805,@14040 14137:O2|@14138,1 14138:O4|3,@14139,@2701,1 14139:O2|@806,@14040 14140:O2|@14141,0 14141:O2|@14142,1 14142:O4|3,@14143,@832,1 14143:O2|@14041,@14144 14144:O2|@14145,0 14145:O2|@742,1 14146:O2|@14147,1 14147:O3|@847,2,@809 14148:O2|1,@14149 14149:O2|@14150,0 14150:O3|2,0,@14151 14151:O2|@14152,0 14152:O3|0,@845,@14153 14153:O2|@14155,@14154 14154:O2|@14159,0 14155:O4|3,@14156,@2701,1 14156:O2|@805,@14157 14157:O2|@14158,0 14158:O2|@11859,1 14159:O4|3,@14160,@2701,1 14160:O2|@806,@14157 14161:O2|@14165,@14164 14162:O2|@14163,@855 14163:O3|0,@249,0 14164:O2|@14168,0 14165:O2|@1217,@14166 14166:O3|0,@14167,@876 14167:O8|@1220,@14106,0,0,@737,0,0,1 14168:O2|@1223,@14169 14169:O3|0,@14170,@876 14170:O8|@742,@14108,0,0,@737,0,0,1 14171:O4|1,@250,1,0 14172:O2|60,@14173 14173:O2|@14174,0 14174:O4|@23,69,@14175,0 14175:O7|60,2,@691,@692,@690,0,0 14176:O2|62,@14177 14177:O2|@14178,0 14178:O4|@23,69,@14179,0 14179:O7|62,2,@691,@692,@690,0,0 14180:O2|@14182,@14181 14181:O2|@14183,0 14182:S7|52756e43616c6c 14183:O4|@38,69,@14184,0 14184:O4|@14182,@961,@14185,@690 14185:O6|@14187,I48,0,@690,@14186,0 14186:O1|@14475 14187:O4|1,@252,@253,@251 14188:O2|@14471,@14470 14189:O2|@13740,@14190 14190:O2|@14191,0 14191:O4|@23,69,@14192,0 14192:O7|@13740,0,@14194,@14193,@690,0,0 14193:O3|2,@767,@7751 14194:O2|1,@1551 14195:O2|@14197,@14196 14196:O2|@14198,0 14197:S9|537562736372697074 14198:O4|@23,69,@14199,0 14199:O7|@14197,0,@14200,@7751,@690,0,0 14200:O2|1,@1629 14201:O2|@14203,@14202 14202:O2|@14204,0 14203:S8|5857696e646f7773 14204:O4|@23,69,@14205,0 14205:O7|@14203,0,@14206,@14193,@690,0,0 14206:O2|1,@1595 14207:O2|@14209,@14208 14208:O2|@14210,0 14209:S11|72756e5f63616c6c324332 14210:O4|@23,69,@14211,0 14211:O7|@14209,2,@14213,@14212,@690,0,0 14212:O3|2,@768,@14238 14213:O2|1,@14214 14214:O2|7,@14215 14215:O8|@14216,@14209,0,0,@737,0,1,1 14216:O3|10,@14218,@14217 14217:O2|7,@14222 14218:O2|@14219,0 14219:O4|1,0,0,@14220 14220:O4|3,@818,@14221,1 14221:O3|2,I189,0 14222:O8|@14224,@14237,0,@14223,@737,0,1,1 14223:O2|@1209,0 14224:O3|10,@14226,@14225 14225:O3|14,@14233,0 14226:O2|@14227,0 14227:O5|0,0,0,2,@14228 14228:O4|3,@14229,@1329,1 14229:O2|@14231,@14230 14230:O2|@14232,@4047 14231:O2|@993,1 14232:O2|@1597,1 14233:O2|@14235,@14234 14234:O2|@14236,0 14235:O4|6,@1713,0,0 14236:O4|6,@1713,1,0 14237:S14|72756e5f63616c6c324332283129 14238:O3|2,@14240,@14239 14239:O3|3,@14247,@695 14240:O3|3,@14241,@695 14241:O2|@14243,@14242 14242:O2|@14245,0 14243:O2|49,@14244 14244:O3|6,@255,79992 14245:O2|50,@14246 14246:O3|6,@256,79992 14247:O2|@14249,@14248 14248:O2|@14251,0 14249:O2|49,@14250 14250:O3|6,@257,79992 14251:O2|50,@14252 14252:O3|6,@258,79992 14253:O2|@11379,@14254 14254:O2|@14255,0 14255:O4|@23,69,@14256,0 14256:O7|@11379,0,@14257,@7751,@690,0,0 14257:O2|1,@11380 14258:O2|@14260,@14259 14259:O2|@14261,0 14260:S7|466f726569676e 14261:O4|@23,69,@14262,0 14262:O7|@14260,0,@14263,@14193,@690,0,0 14263:O2|1,@14264 14264:O3|2,23,0 14265:O2|@14267,@14266 14266:O2|@14268,0 14267:S4|4661696c 14268:O4|@23,69,@14269,0 14269:O7|@14267,0,@14270,@14193,@690,0,0 14270:O2|1,@14271 14271:O3|2,103,0 14272:O2|@14274,@14273 14273:O2|@14275,0 14274:S11|6164644f7665726c6f6164 14275:O4|@23,69,@14276,0 14276:O7|@14274,2,@14278,@14277,@690,0,0 14277:O3|2,@14279,@13622 14278:O2|3,0 14279:O3|2,@14281,@14280 14280:O3|6,@260,79992 14281:O3|6,@259,79992 14282:O2|@6942,@14283 14283:O2|@14284,0 14284:O4|@23,69,@14285,0 14285:O7|@6942,0,@14286,@7751,@690,0,0 14286:O2|1,@11142 14287:O2|@14289,@14288 14288:O2|@14290,0 14289:S7|45785472616365 14290:O4|@23,69,@14291,0 14291:O7|@14289,0,@14293,@14292,@690,0,0 14292:O3|2,@14294,@7751 14293:O2|1,@1665 14294:O3|3,@14295,@695 14295:O2|@14297,@14296 14296:O2|@14298,0 14297:O2|49,@1246 14298:O2|50,@7751 14299:O2|@14301,@14300 14300:O2|@14302,0 14301:S6|537973457272 14302:O4|@23,69,@14303,0 14303:O7|@14301,0,@14305,@14304,@690,0,0 14304:O3|2,@14306,@7751 14305:O2|1,@1220 14306:O3|3,@14307,@695 14307:O2|@5467,@14308 14308:O2|@14309,0 14309:O2|50,@14310 14310:O5|5,@9772,@5590,@5447,@690 14311:O2|@14313,@14312 14312:O2|@14314,0 14313:S3|446976 14314:O4|@23,69,@14315,0 14315:O7|@14313,0,@14316,@7751,@690,0,0 14316:O2|1,@1533 14317:O2|@14319,@14318 14318:O2|@14320,0 14319:S10|756e7361666543617374 14320:O4|@23,69,@14321,0 14321:O7|@14319,2,@14323,@14322,@690,0,0 14322:O3|2,@14328,@14327 14323:O2|1,@14324 14324:O2|7,@14325 14325:O8|@739,@14326,0,0,@737,0,0,1 14326:S13|756e7361666543617374283129 14327:O3|6,@262,79992 14328:O3|6,@261,79992 14329:O2|@5314,@14330 14330:O2|@14331,0 14331:O4|@23,69,@14332,0 14332:O7|@5314,0,@14333,@7751,@690,0,0 14333:O2|1,@742 14334:O2|@14336,@14335 14335:O2|@14337,0 14336:S8|4f766572666c6f77 14337:O4|@23,69,@14338,0 14338:O7|@14336,0,@14339,@7751,@690,0,0 14339:O2|1,@1497 14340:O2|@14342,@14341 14341:O2|@14343,0 14342:S9|72756e5f63616c6c30 14343:O4|@23,69,@14344,0 14344:O7|@14342,2,@14346,@14345,@690,0,0 14345:O3|2,@768,@14354 14346:O2|1,@14347 14347:O2|7,@14348 14348:O8|@14349,@14342,0,0,@737,0,1,1 14349:O3|10,@14218,@14350 14350:O2|7,@14351 14351:O8|@14353,@14352,0,@14223,@737,0,0,1 14352:S12|72756e5f63616c6c30283129 14353:O4|3,0,@1329,1 14354:O3|2,@1461,@14244 14355:O2|@14357,@14356 14356:O2|@14358,0 14357:S9|72756e5f63616c6c31 14358:O4|@23,69,@14359,0 14359:O7|@14357,2,@14361,@14360,@690,0,0 14360:O3|2,@768,@14365 14361:O2|1,@14362 14362:O2|7,@14363 14363:O8|@14220,@14364,0,0,@737,0,0,1 14364:S12|72756e5f63616c6c31283129 14365:O3|2,@14244,@14246 14366:O2|@14368,@14367 14367:O2|@14369,0 14368:S9|72756e5f63616c6c32 14369:O4|@23,69,@14370,0 14370:O7|@14368,2,@14372,@14371,@690,0,0 14371:O3|2,@768,@14382 14372:O2|1,@14373 14373:O2|7,@14374 14374:O8|@14375,@14368,0,0,@737,0,1,1 14375:O3|10,@14218,@14376 14376:O2|7,@14377 14377:O8|@14379,@14378,0,@14223,@737,0,0,1 14378:S12|72756e5f63616c6c32283129 14379:O4|3,@14380,@1329,1 14380:O2|@14231,@14381 14381:O2|@14232,0 14382:O3|2,@14240,@14250 14383:O2|@14385,@14384 14384:O2|@14386,0 14385:S9|72756e5f63616c6c33 14386:O4|@23,69,@14387,0 14387:O7|@14385,2,@14389,@14388,@690,0,0 14388:O3|2,@768,@14401 14389:O2|1,@14390 14390:O2|7,@14391 14391:O8|@14392,@14385,0,0,@737,0,1,1 14392:O3|10,@14218,@14393 14393:O2|7,@14394 14394:O8|@14396,@14395,0,@14223,@737,0,0,1 14395:S12|72756e5f63616c6c33283129 14396:O4|3,@14397,@1329,1 14397:O2|@14231,@14398 14398:O2|@14232,@14399 14399:O2|@14400,0 14400:O2|@11850,1 14401:O3|2,@14402,@14252 14402:O3|3,@14403,@5440 14403:O2|@14243,@14404 14404:O2|@14245,@14405 14405:O2|@14406,0 14406:O2|51,@14250 14407:O2|@14409,@14408 14408:O2|@14410,0 14409:S9|72756e5f63616c6c34 14410:O4|@23,69,@14411,0 14411:O7|@14409,2,@14413,@14412,@690,0,0 14412:O3|2,@768,@14426 14413:O2|1,@14414 14414:O2|7,@14415 14415:O8|@14416,@14409,0,0,@737,0,1,1 14416:O3|10,@14218,@14417 14417:O2|7,@14418 14418:O8|@14420,@14419,0,@14223,@737,0,0,1 14419:S12|72756e5f63616c6c34283129 14420:O4|3,@14421,@1329,1 14421:O2|@14231,@14422 14422:O2|@14232,@14423 14423:O2|@14400,@14424 14424:O2|@14425,0 14425:O2|@11852,1 14426:O3|2,@14428,@14427 14427:O3|6,@263,79992 14428:O3|3,@14429,@11880 14429:O2|@14243,@14430 14430:O2|@14245,@14431 14431:O2|@14406,@14432 14432:O2|@14433,0 14433:O2|52,@14252 14434:O2|@14436,@14435 14435:O2|@14437,0 14436:S9|72756e5f63616c6c35 14437:O4|@23,69,@14438,0 14438:O7|@14436,2,@14440,@14439,@690,0,0 14439:O3|2,@768,@14455 14440:O2|1,@14441 14441:O2|7,@14442 14442:O8|@14443,@14436,0,0,@737,0,1,1 14443:O3|10,@14218,@14444 14444:O2|7,@14445 14445:O8|@14447,@14446,0,@14223,@737,0,0,1 14446:S12|72756e5f63616c6c35283129 14447:O4|3,@14448,@1329,1 14448:O2|@14231,@14449 14449:O2|@14232,@14450 14450:O2|@14400,@14451 14451:O2|@14425,@14452 14452:O2|@14453,0 14453:O2|@14454,1 14454:O4|6,@739,4,0 14455:O3|2,@14457,@14456 14456:O3|6,@264,79992 14457:O3|3,@14458,@11957 14458:O2|@14243,@14459 14459:O2|@14245,@14460 14460:O2|@14406,@14461 14461:O2|@14433,@14462 14462:O2|@14463,0 14463:O2|53,@14427 14464:O2|@14466,@14465 14465:O2|@14467,0 14466:S6|546872656164 14467:O4|@23,69,@14468,0 14468:O7|@14466,0,@14469,@14193,@690,0,0 14469:O2|1,@1647 14470:O2|@14472,0 14471:S4|53697a65 14472:O4|@23,69,@14473,0 14473:O7|@14471,0,@14474,@7751,@690,0,0 14474:O2|1,@836 14475:D2,20|00801a1300100e0e000000000c00000000000000|@5775,@5774| 14476:O2|@1055,@14477 14477:O2|@14478,0 14478:O4|@23,69,@10954,0 14479:O2|@2191,@14480 14480:O2|@14481,0 14481:O4|@27,69,@14482,0 14482:O2|@2189,0 14483:O2|@1177,@14484 14484:O2|@14486,@14485 14485:O2|@14511,0 14486:O4|@27,69,@14487,0 14487:O2|@1175,@14488 14488:O2|@14489,0 14489:O7|@1177,@808,@14491,@14490,@690,0,0 14490:O3|2,@14509,@14508 14491:O2|1,@14492 14492:O3|14,@14493,0 14493:O2|@14495,@14494 14494:O2|@14498,@14497 14495:O2|7,@14496 14496:O8|@742,@1177,0,0,@737,0,0,1 14497:O2|@14504,0 14498:O2|7,@14499 14499:O8|@14500,@1177,0,0,@737,0,0,1 14500:O4|3,@14501,@7228,1 14501:O2|@14145,@14502 14502:O2|@14503,@818 14503:O2|@7227,1 14504:O2|7,@14505 14505:O8|@14506,@1177,0,0,@737,0,0,1 14506:O4|3,@14507,@2701,1 14507:O2|@805,@2703 14508:O5|5,@14510,@1177,@1175,@690 14509:O3|6,@265,79992 14510:O2|@14509,0 14511:O4|@23,69,@14489,0 14512:O2|@1463,@14513 14513:O2|@14514,0 14514:O4|@27,69,@14515,0 14515:O2|@1462,0 14516:O2|61,@14517 14517:O2|@14518,0 14518:O4|@23,69,@14519,0 14519:O7|61,2,@14521,@14520,@690,0,0 14520:O3|2,@14522,@693 14521:O2|3,2 14522:O3|3,@14523,@695 14523:O2|@14525,@14524 14524:O2|@14527,0 14525:O2|49,@14526 14526:O3|6,@266,79996 14527:O2|50,@14526 14528:O2|@2201,@14529 14529:O2|@14530,0 14530:O4|@27,69,@14531,0 14531:O2|@2199,0 14532:O2|@1063,@14533 14533:O2|@14534,0 14534:O4|@23,69,@10961,0 14535:O2|@5672,@14536 14536:O2|@14537,0 14537:O4|@23,69,@10546,0 14538:O2|@778,@14539 14539:O2|@14540,0 14540:O4|@27,69,@14541,0 14541:O2|@777,0 14542:O2|@705,@14543 14543:O2|@14544,0 14544:O4|@27,69,@14545,0 14545:O2|@704,@14546 14546:O2|@729,@14547 14547:O2|@947,0 14548:O2|@14549,0 14549:O4|@27,69,@14550,0 14550:O2|@769,0 14551:O2|@14561,@14562 14552:S7|3c737464696e3e 2:MO1|@271 3:MO1|1 4:MO1|0 5:MO1|0 6:MO1|0 7:MO1|@349 8:MO1|@357 9:MO1|@369 10:MO1|0 11:MO1|@408 12:MO1|@437 13:MO1|0 14:MO1|@508 15:MO1|@620 16:MO1|2 17:MO1|0 18:MO1|0 19:MO1|@22 20:MO1|@672 21:MO1|38 22:MO81|80,0,0,0,0,0,0,0,@680,0,@720,@725,@743,0,@758,@924,0,0,0,@937,@943,0,@955,0,0,0,@12915,@12921,0,0,0,0,0,0,@12927,0,@12956,0,0,0,0,@12962,@12965,@12969,@12973,@12977,@12981,@12985,@14073,0,0,0,0,@14077,@14082,@14172,@14176,@14180,@14476,@14479,@14483,@14512,@14516,@14528,0,@14532,0,0,0,0,0,0,0,0,0,0,0,@14535,@14538,@14542,@679 23:MO1|@685 24:MO1|@700 25:MO1|@711 26:MO1|1 27:MO1|@685 28:MO1|@754 29:MO1|0 30:MO1|@711 31:MO1|1 32:MO1|@711 33:MO1|@685 34:MO1|@685 35:MO1|@859 36:MO1|1 37:MO1|@855 38:MO1|@685 39:MO1|@42 40:MO1|@672 41:MO1|35 42:MO81|80,0,0,0,0,0,@965,0,0,@1135,@1678,@1735,0,0,0,0,@1738,0,@1741,0,@1749,0,0,0,0,0,@6136,0,0,0,0,0,@11626,@11629,@11632,@11659,0,0,0,@11662,@11665,0,@11757,@11761,@11764,@11767,@11770,0,0,0,@11782,@11818,0,0,@11899,0,@11910,0,@11913,@11916,@12268,@12271,@12274,0,@12281,@12284,0,@12895,@12898,0,0,0,0,@12902,0,0,@12909,@964,0,0,0 43:MO1|@1037 44:MO1|@1046 45:MO1|@1068 46:MO1|0 47:MO1|@1147 48:MO1|0 49:MO1|@1188 50:MO1|1 51:MO1|1 52:MO1|@1147 53:MO1|0 54:MO1|@855 55:MO1|@58 56:MO1|@1757 57:MO1|7 58:MO11|10,@1760,@5777,0,@5781,@5836,0,0,@5973,@6044,@1759 59:MO1|@62 60:MO1|@1768 61:MO1|5 62:MO11|10,@1771,@1803,@5734,@5738,0,0,0,0,0,@1770 63:MO1|@1787 64:MO1|@1147 65:MO1|0 66:MO1|@685 67:MO1|@685 68:MO1|@685 69:MO1|@2017 70:MO1|0 71:MO1|0 72:MO1|@2196 73:MO1|1 74:MO1|@711 75:MO1|1 76:MO1|@711 77:MO1|0 78:MO1|0 79:MO1|1 80:MO1|1 81:MO1|1 82:MO1|0 83:MO1|0 84:MO1|@685 85:MO1|@685 86:MO1|@685 87:MO1|@685 88:MO1|@685 89:MO1|@685 90:MO1|@685 91:MO1|@685 92:MO1|@685 93:MO1|@685 94:MO1|@685 95:MO1|@685 96:MO1|@685 97:MO1|@685 98:MO1|@685 99:MO1|@685 100:MO1|@685 101:MO1|@685 102:MO1|@685 103:MO1|@685 104:MO1|@685 105:MO1|@685 106:MO1|@685 107:MO1|@685 108:MO1|@685 109:MO1|@4469 110:MO257|256,2,1,2,2,1,2,1,2,1,2,3,7,1,3,1,1,1,3,7,3,3,3,9,3,3,3,3,3,2,1,2,2,3,2,2,2,2,2,2,2,2,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,4,5,5,1,1,1,1,1,1,2,2,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,5,2,2,1,1,2,2,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,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 111:MO1|213 112:MO257|256,@5019,@5020,@5021,@5022,@5023,@5024,@5025,@5026,@5027,@5028,@5029,@5030,@5031,@5032,@5033,@5034,@5035,@5036,@5037,@5038,@5039,@5040,@5041,@5042,@5043,@5044,@5045,@5046,@5047,@5048,@5049,@5050,@5051,@5052,@5053,@5054,@5055,@5056,@5057,@5058,@5059,@5060,@5061,@5062,@5063,@5064,@5065,@5066,@5067,@5068,@5069,@5070,@5071,@5072,@5073,@5074,@5075,@5076,@5077,@5078,@5079,@5080,@5081,@5082,@5083,@5084,@5085,@5086,@5087,@5088,@5089,@5090,@5091,@5092,@5093,@5094,@5095,@5096,@5097,@5098,@5099,@5100,@5101,@5102,@5103,@5104,@5105,@5106,@5107,@5108,@5109,@5110,@5111,@5112,@5113,@5114,@5115,@5116,@5117,@5118,@5119,@5120,@5121,@5122,@5123,@5124,@5125,@5126,@5127,@5128,@5129,@5130,@5131,@5132,@5133,@5134,@5135,@5136,@5137,@5138,@5139,@5140,@5141,@5142,@5143,@5144,@5145,@5146,@5147,@5148,@5149,@5150,@5151,@5152,@5153,@5154,@5155,@5156,@5157,@5158,@5159,@5160,@5161,@5162,@5163,@5164,@5165,@5166,@5167,@5168,@5169,@5170,@5171,@5172,@5173,@5174,@5175,@5176,@5177,@5178,@5179,@5180,@5181,@5182,@5183,@5184,@5185,@5186,@5187,@5188,@5189,@5190,@5191,@5192,@5193,@5194,@5195,@5196,@5197,@5198,@5199,@5200,@5201,@5202,@5203,@5204,@5205,@5206,@5207,@5208,@5209,@5210,@5211,@5212,@5213,@5214,@5215,@5216,@5217,@5218,@5219,@5220,@5221,@5222,@5223,@5224,@5225,@5226,@5227,@5228,@5229,@5230,@5231,@5232,@5233,@5234,@5235,@5236,@5237,@5238,@5239,@5240,@5241,@5242,@5243,@5244,@5245,@5246,@5247,@5248,@5249,@5250,@5251,@5252,@5253,@5254,@5255,@5256,@5257,@5258,@5259,@5260,@5261,@5262,@5263,@5264,@5265,@5266,@5267,@5268,@5269,@5270,@5271,@5272,@5273,@5018 113:MO1|@5380 114:MO1|@1147 115:MO1|0 116:MO1|@1147 117:MO1|0 118:MO1|@1147 119:MO1|0 120:MO1|@1147 121:MO1|0 122:MO1|@1147 123:MO1|0 124:MO1|@5660 125:MO1|1 126:MO1|@1147 127:MO1|0 128:MO1|@131 129:MO1|@5789 130:MO1|4 131:MO11|10,@5792,@5812,@5816,@5791,0,0,0,0,0,0 132:MO1|@135 133:MO1|@5844 134:MO1|11 135:MO21|20,@5846,@5859,0,0,0,0,0,0,0,0,0,@5863,@5883,@5893,@5903,@5907,@5928,@5939,@5949,@5845 136:MO1|@139 137:MO1|@5981 138:MO1|5 139:MO11|10,0,@5984,@6007,@6017,0,0,0,0,@6027,@5983 140:MO1|@143 141:MO1|@6052 142:MO1|3 143:MO11|10,0,@6055,0,@6064,0,@6054,0,0,0,0 144:MO1|@147 145:MO1|@6085 146:MO1|4 147:MO11|10,0,@6088,@6111,@6121,0,0,0,0,0,@6087 148:MO1|@685 149:MO1|0 150:MO1|@685 151:MO1|@6486 152:MO1|@700 153:MO1|@9135 154:MO1|@7270 155:MO1|@7293 156:MO1|0 157:MO1|@7897 158:MO1|@7855 159:MO1|@8547 160:MO1|@8161 161:MO1|@685 162:MO1|@8183 163:MO1|@8405 164:MO1|@8418 165:MO1|@8543 166:MO1|@8545 167:MO1|@8964 168:MO1|@9303 169:MO1|@9405 170:MO1|@9345 171:MO1|@9371 172:MO1|@9374 173:MO1|@9397 174:MO1|@9516 175:MO1|@9434 176:MO1|@9461 177:MO1|@685 178:MO1|0 179:MO1|0 180:MO1|0 181:MO1|0 182:MO1|0 183:MO1|@10114 184:MO1|0 185:MO1|32 186:MO1|I48 187:MO1|48 188:MO1|0 189:MO1|41 190:MO1|@855 191:MO1|0 192:MO1|0 193:MO1|0 194:MO1|0 195:MO1|@855 196:MO1|@1147 197:MO1|0 198:MO1|0 199:MO1|@855 200:MO1|@855 201:MO1|@855 202:MO1|@205 203:MO1|@11924 204:MO1|27 205:MO41|40,@11926,@11942,@11973,@11984,@11994,@12005,@12009,@12035,0,0,@12045,0,@12052,0,0,0,0,0,0,@12065,@12072,@12090,@12106,@12117,@12136,@12149,@12160,@12173,@12185,@12199,@12206,@12217,@12226,0,0,0,@12230,@12247,0,@11925 206:MO1|@1147 207:MO1|0 208:MO1|@1147 209:MO1|0 210:MO1|@855 211:MO1|@214 212:MO1|@11924 213:MO1|27 214:MO41|40,@12293,@12342,@12355,@12570,0,0,0,@12650,0,@12672,@12675,@12679,@12716,0,0,@12720,@12738,0,@12741,@12744,@12747,@12755,@12769,@12772,@12796,@12800,@12803,@12807,@12811,@12814,@12818,0,0,@12845,0,0,0,0,@12865,@12292 215:MO1|@1147 216:MO1|0 217:MO1|@1147 218:MO1|0 219:MO1|@1147 220:MO1|0 221:MO1|@1147 222:MO1|0 223:MO1|@1147 224:MO1|0 225:MO1|@1147 226:MO1|0 227:MO1|@1147 228:MO1|0 229:MO1|@1188 230:MO1|@233 231:MO1|@672 232:MO1|41 233:MO81|80,@12994,@13048,@13080,@13097,@13114,0,0,@13129,@13143,@13150,0,0,0,@13164,@13178,@13192,0,0,0,0,0,0,@13206,@13220,@13234,0,@13248,@13262,0,@13363,@13377,@13623,@13632,@13646,0,0,0,0,0,0,0,0,0,@13674,@13689,0,0,@13703,0,0,@13717,@13743,0,0,0,0,0,@13771,@13779,@13793,0,@13807,@13841,0,0,@13854,@13861,@13919,0,0,@13934,@13948,@13962,@13976,0,0,0,@13988,@14045,@12993 234:MO1|@13019 235:MO1|0 236:MO1|0 237:MO1|0 238:MO1|@1188 239:MO1|@13851 240:MO1|1 241:MO1|@244 242:MO1|@13869 243:MO1|5 244:MO11|10,0,0,@13872,0,@13876,@13891,@13903,0,0,@13871 245:MO1|@855 246:MO1|@711 247:MO1|@14003 248:MO1|1 249:MO1|@14100 250:MO1|1 251:MO1|@254 252:MO1|@11924 253:MO1|23 254:MO41|40,0,0,@14189,@14195,0,@14201,0,@14207,0,0,0,@14253,@14258,0,0,0,0,0,@14265,@14272,0,@14282,0,@14287,@14299,@14311,@14317,@14329,0,@14334,@14340,@14355,@14366,@14383,@14407,@14434,0,0,@14464,@14188 255:MO1|@855 256:MO1|@855 257:MO1|@855 258:MO1|@855 259:MO1|@855 260:MO1|@855 261:MO1|@855 262:MO1|@855 263:MO1|@855 264:MO1|@855 265:MO1|@855 266:MO1|@855 14553:MVO1|0 14554:MVO1|1 14555:MVO1|0 14556:MVO1|1 14557:MVO1|@298 14558:MVO1|1 14559:MVO1|0 14560:MVO1|1 14561:MVO1|1 14562:MVO1|@617 14563:MVO1|1 14564:MVO1|@647 14565:MVO1|1 14566:MVO1|1 14567:MVO1|1 0:MB4096|4372656174656420737472756374757265204d4c436f6d70696c65720a73696f6e0a0a69670a670a540a46554e4354494f4e530a202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 1:MB4096|20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 polyml-5.6/imports/polymlint64.txt000066400000000000000000070427011265146633400173640ustar00rootroot00000000000000Objects 14569 Root 0 0:O1|@1 1:D9,240|00801af3003b1af7000c00031af9000e0e0c00027881877881481af3001af8000e0c00021af9002a0e0c00025178810e28133b1af2000e0e0e0c0003050b00ff6d3b1aeb000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2f3b64053600ff6d78810e28133b1aba000e0e0e0c0003050b00ff6d3c1ab3000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2f3b65503b05070e0e00ff6d3c6478810c28133b1a7c000e0c0003050b00ff6d2a1a77000c00026478810a3b2c0e0e0e0c0002050500ff6d3b64511e2d3b66420e0e0e0000000000000000e0000000000000000000000000000000|@3,@14289,I253,@400,@403,@13237,@2,I150,I1| 2:O3|@14286,@14285,0 3:S24|506f6c794d4c2e72756e46756e6374696f6e283129283129 4:O2|@6,@5 5:O2|@10,@9 6:O2|@7,@14554 7:D2,40|008056073b3b1a27000c0004503b420e000000000000000018000000000000000000000000000000|@8,I255| 8:S19|466f726569676e4d656d6f72792e5f2d283129 9:O2|@268,@267 10:O1|@11 11:D15,176|00807881413b3b3b1aad000e0e0c000429352a361aa9002a1aad000e0e0c0003293d1aab000c00032c2a1aab000c00031aad002a3b6a28072a1aac000e0c0003503b2707054c00ff6d2935280c1aa0000e0c000303043b50020229101a99003b1a9d000e0e0c0003291a9c001aa1000e0e0c0003501a80003b1a84000e0c000329392a1a92002b1a96000e0e0e0c00042704420e0e0e0e0e0000000000000000a0000000000000000000000000000000|@13,@14,-1,I244,I243,I242,@22,I73,I251,@14558,I253,@65,@66,@190,@12| 12:O1|@225 13:S20|5369676e616c2e666f726b546872656164283129 14:O1|@15 15:D8,352|00822d291a61010e0e0c00021a61010e0e0c000207d529352a362a353d1a58010e0c00030309292503511e273b0fca2a353c1a43010c0003037a2a36293c1a37010c0003030428060220293b1a29010e0e0c000303033f0211293e1a1a010e0e0e0c000303033d02013b29321a11010e0e0c00033128061a0e010e0e0e0c0003293b1af3000c0003641ae4000e0c000203041afb00103b503128061ae2000e0e0e0c00032d2b2b1aee00220c0e0e0e7b050c00042a36293b1abd000e0e0c0003033e2f3c1ac1000e0e0c0003293b1aa7000c0003641a98000e0c000203041aaf00103b502f3c1a9700020252000c00032b322b1aa20033020241007b050a0004303c1a7b000c0003303c1a7b000c0003293b1a63000c0003641a54000e0c000203041a6b00103b50303c1a53000c00032c2b2b1a6200347b050b00046502032d2d6964440e0e0e0e000000000000000050010000000000000000000000000000|@17,I105,I218,I251,I242,I243,@16,@14| 16:O4|12,@19,@20,@18 17:S38|5468726561642e5468726561642e6174747273546f576f7264283129636f6e76657274283329 18:O5|@21,216,0,216,0 19:S6|546872656164 20:S53|5468652073616d65206174747269627574652061707065617273206d6f7265207468616e206f6e636520696e20746865206c697374 21:S18|2e2f62617369732f5468726561642e736d6c 22:O1|@23 23:D14,200|00802b3c3b1ac8000e0c0003293b1ac7000c000303781ac7003b1acb000c0003293c1ab3000c00036403141ab2001abf000c0002293b1a9f000c00036402013b030d3b3c1ab1000e0e0c000350023d3b3b3b1aab000c000429352a361aa9002a1aad000e0e0c0003293d1aab000c00032c2a1aab000c00031aad002a3b6a28072a1aac000e0c0003503b2608021729352a367881092b2d0e0e0c0002050500ff6d3b6426033b2502501ea63b65420e0e0000000000000000b8000000000000000000000000000000|@25,I62,I251,@14555,I253,I71,@26,@14,-1,I244,I243,I242,@24,I73| 24:O1|@29 25:S19|5369676e616c2e736967546872656164283129 26:O1|@27 27:D19,736|00812b03043b5002643b1adb023b1adf020c0003293c1adf020c00036403033b0222291b204e1ad7020c000303033b0213293c1ad2020e0e0e0c0003292502501e363b64641aa0021ac5020e0e0c0002293b1aa3020c000303043b50020e3c1a86021ab3020c000326031e61511ab0020e0c0001293c1a77020c00032928061aa6020e0e0e0c0003293b1a6b020c000303033d0223293d1a5e020e0e0e0c000303033e0213293f1a4e020e0e0e0c00031a7d020e0e0c0002293d1a3b020c000303043b5002381a57020c00011a51020e0e0c0001293c1a17020c00031a59022a1a45020e0e0c00033d2a1a53020c00032d3c2b1a52020e0e0e0c000426063b1a4e023b1aea010e0e0e0c0003293c1ae7010c00036403033b0222291b204e1adf010c000303033b0213293c1ada010e0e0e0c0003292502501e393b64641a10021acd010e0e0c0002293b1aab010c000303043b50020e3c1af6011abb010c000326031e64511af0013b1a84010e0c000329291aeb010c00021ab5010e0e0c0002031929352a363f2b1a8d010e0e0c000350292503511e243b6502013b641ab8013b2b1aa3010c0004501aa4011ab9010e0e0c0002293c1a3f010c000303043b5002171a8b011aa8010e0c0002503d1a7f011a44010e0c0003501a44010e0c00012d3c1a13010c00030304280602202d3b1a05010e0e0c000303033f02112d3e1af6000e0e0e0c000303033d02013b1a0f010c0001293c1ad7000c00031a19012a1a05010e0e0c00032c2a1a13010c00032e3c2b1a12010e0e0e0c000450323b1ab6000e0e0e0c000303033c020b323c1aa6000e0e0e0c000303311ac3000c0001293e1a8b000c0003293b1a93000c0003651abc000e0c0002030d280b3b1a98000e0c00035002023b5002023b501a58001ad5000e0e0c0002293c1a5b000c000303033b021b1a40001ac5000e0e0c0002503d1a33001a600022120e0e7e120003270e430e0e0e0e0e0000000000000000d0020000000000000000000000000000|@28,@14555,I253,I251,I113,I106,I71,I73,I72,I243,I218,-7,I242,I255,@14557,@14556,I105,I70,I69| 28:S35|5369676e616c2e73696754687265616428312962726f6164436173745765616b283229 29:D2,40|00802b3b1a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@30,@26| 30:S38|5369676e616c2e73696754687265616428312962726f6164436173745765616b283129283129 31:O6|@32,@14291,@33,@14292,@14559,@14290 32:O2|4096,@14287 33:O14|@35,@36,@40,0,0,@42,0,@43,@51,@55,4096,0,@58,@34 34:O1|@62 35:S6|7374644f7574 36:O1|@37 37:O2|@38,I149 38:D2,40|0080281d56173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@39,I61| 39:S50|4c696272617279494f537570706f72742e777261704f757446696c654465736372283529746578745072696d57722d283129 40:O2|@41,I149 41:D2,40|0080280756173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@39,I61| 42:O1|I149 43:O1|@44 44:O2|@45,I149 45:D5,120|00802b352c362d3729362c1a72000e0e0e0c0002030c2c3b1a6d000e0e0c000302013b03043b5002041a6400102b1a4f000c0002030c2b3b1a4d000e0e0c000302013b03043b5002041a440010292d2d6a280b56672b1a3f00330e7b05080004000000000000000068000000000000000000000000000000|@47,I105,I231,@46,I61| 46:O4|11,@49,0,@48 47:S49|4c696272617279494f537570706f72742e777261704f757446696c65446573637228352977726974654172726179283129 48:O5|@50,153,0,153,0 49:S9|537562736372697074 50:S26|2e2f62617369732f4c696272617279537570706f72742e736d6c 51:O1|@52 52:O2|@53,I149 53:D6,128|00802b352c362d372b1a7c000e0c0002030c2b3b1a79000e0e0c000302013b03043b5002041a7000102a1a5b000c0002030c2a3b1a59000e0e0c000302013b03043b5002041a5000102b28081a51000e0e0c00032a2a2d6a280b56672b1a4800330e0e7b05080004000000000000000070000000000000000000000000000000|@54,I105,I231,@46,I239,I61| 54:S50|4c696272617279494f537570706f72742e777261704f757446696c6544657363722835297772697465566563746f72283129 55:O1|@56 56:O2|@57,I149 57:D3,56|0080281c56173b1a36000e0e0e0c0004293b1a33002e0e0e7e0400030e0e0e0e000000000000000028000000000000000000000000000000|@39,I61,I233| 58:O1|@59 59:O3|@60,@44,@56 60:D1,48|00803b56180c0002030c2b56170c00022968016402013b42000000000000000020000000000000000000000000000000|@61| 61:S40|5072696d494f28292e6175676d656e7457726974657228312977726974654172724e42272d283129 62:O3|@63,@52,@56 63:D1,48|00803b56180c0002030c2b56170c00022968016402013b42000000000000000020000000000000000000000000000000|@64| 64:S40|5072696d494f28292e6175676d656e7457726974657228312977726974655665634e42272d283129 65:S31|556e61626c6520746f20637265617465207369676e616c207468726561640a 66:O1|@67 67:D19,368|00812c3a293b1a6f010c0003293c1a6f010c000307dd2d1a6e010e0e0e0c000229293b1a6a010e0e0e0c000303033b0270293c1a62010e0e0e0c0003293b1a5f010c000303033c0210301a3b010c00022a2a1a53010c00036403041a5201103b50301a53010c000203033002142928081a4d010e0e0c0003312a1a4b010c00036429401afa000e0e0e0c000365030329020f293c1a01010e0e0c000325011e7d3b64293b1ae9000e0e0c000303222f1ad6000e0e0e0c0002303b2b6a1a11012a693339342b2b1a0f01220d7b050c0004296801303b2b1a07010c000429352a362b37292c2c6a1aff002a69220e39220f2b020243002b1adf000c000450220f3922101aeb002b1acf000c000450220f333b1acc000e0c000429352a362b37292c2c6a1ad3002a6922163922172b2b1aa70022197b051800042d1a4c000e0c00022e3b2b6a1ab9002a693139322b2b1a8700340e7b050a0004000000000000000060010000000000000000000000000000|@69,I253,I251,I223,I113,I107,I234,I231,@70,I105,I239,I252,@73,@12,@212,@223,@190,@224,@68| 68:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@75,@74| 69:S29|54657874494f2e5465787453747265616d494f2e6f7574707574283229 70:O4|11,@49,0,@71 71:O5|@72,680,0,680,0 72:S18|2e2f62617369732f537472696e672e736d6c 73:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@75,@74| 74:O1|@76 75:S34|426173696353747265616d494f28292e6f7574707574566563746f72283129283129 76:D12,184|00812c3729352e38293b1ab3000c0003293c1ab3000c000303152b1ab2001ab7006a1abb001ac0002b1ac4006b64103b5030353136323a3235333634372e352a2a1ab4000e0c0003031a220e1ab1000e0e0c000250220e2d2d2d1aab0022117b060f00052d3b1a57000c0003293d1a57000c0003640311220e2d2d2d1a890022110e0e7b060f00053b2f2b2d3030220c22151a7b0022157b0a0f00090e0e0e0e0000000000000000a8000000000000000000000000000000|@78,I253,I251,@79,@81,@14294,@187,@188,I233,@190,@208,@77| 77:O1|@221 78:S31|426173696353747265616d494f28292e6f7574707574566563746f72283229 79:O4|@14293,@80,0,0 80:S12|436c6f73656453747265616d 81:S6|6f7574707574 82:O1|@83 83:O1|@84 84:D20,256|00802b363b1a00010e0c000303051aff0002c72b35362c363c1afc000e0c00032a2a691afa003b1afe000e0e0e0c00032a2a0e0e0e0c0002642f363c1ac9000e0e0c000303051ae70002762f353730363c1ac4000e0c00032a2a691ada003b1ac6000e0e0e0c00032a2a0e0e0e0c00026433353534363c1a9e000e0e0e0c00032a2a691ab2003b1a9e000e0e0e0c00032a2a0e0e0e0c000264291aa300691aa7002a691aaa002a691aad002a691ab0002a69322a691ab0002a691ab3002a69270f1ab4002a691ab7002a692c2a691ab7002a691aba002a6927091abb002a693b3c3b3b2d680565420000000000000000f0000000000000000000000000000000|@86,I234,@87,I107,@14295,I253,@87,@14296,@179,@174,@181,@174,@175,@174,@183,@174,@175,@174,@185,@85| 85:O2|3,123 86:S14|7072696e742d6c6162656c6c6564 87:O2|@88,0 88:O2|3,@89 89:S4|2e2e2e7d 90:O1|@91 91:D2,48|00802b362c35293b2c1a2c00300e0e7b050500040e0e0e0e000000000000000020000000000000000000000000000000|@93,@92| 92:O1|@94 93:S7|61646450502d31 94:D25,1992|00822d352e362f372b1ac4070e0c000207d330353d1ac0070e0c000307c930372f3c1abb070c000303051abb07028b2f3c1abc070e0c0003293b1abb070c000303051abb0702662a352a3c1aa2070e0e0e0c00032a2a691aae073b1ab2070e0e0e0c00032a2a0e0e0e0c0002642e362e3c1a7c070e0c00032a2a691a9a073b1a8e070e0e0e0c00031a95072a0e0c0002642a2a0e0e0c000264291a8b07691a8f072a691a92072a69302a69270b1a90072a693b3c3b3b2d68056629353b1a18070e0c000303aa2939291a04070e0c00021a75070e0e0c0002038129352a36293b1af5060204bb05a0000c000303032c02672a353e1ae1060e0e0c000303482a3629285b1ad2060e0e0e0c000303032d023229287b1ac1060e0e0c000303032d02222928281ab1060e0e0c000303032d02122d1a1b07691a1f072a693b3e3c3b2d6805656402122c1a1607691a1a072a693b3e3c3b2d6805656502122a1a1107691a15072a693b3e3c3b2d68056564020129293b691a09072a691a0c072a693b3c3b3b2d680527060fdd3035401a49060e0e0c000307de30372f3c1a53060c00032a2a691a62063b1a66060e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a16060e0e0e0c000303ac2a39291a00060e0c00021a71060e0e0c0002037d29352a36293b1af1050e0e0c000303032d02672a353e1ae1050e0e0c000303482a3629285b1ad2050e0e0e0c000303032e023229287b1ac1050e0e0c000303032e02222928281ab1050e0e0c000303032e02122e1a1b06691a1f062a693b3e3c3b2d6805656402122d1a1606691a1a062a693b3e3c3b2d6805656502162b1a1106691a15062a02023804693b3e3c3b2d68056564020317002a293b691a03062a692c2a693b3c3b3b2d680527090fdd3035280c1a44050e0c000307de30372f3c1a4f050c00032a2a691a5e053b1a62050e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a12050e0e0e0c000303ac2a39291afc040e0c00021a6d050e0e0c0002037d29352a36293b1aed040e0e0c000303032d02672a353e1add040e0e0c000303482a3629285b1ace040e0e0e0c000303032e023229287b1abd040e0e0c000303032e02222928281aad040e0e0c000303032e02122e1a1705691a1b052a693b3e3c3b2d6805656402122d1a1205691a16052a693b3e3c3b2d6805656502162b1a0d05691a11052a02023403693b3e3c3b2d68056564020317002a293b691aff042a692c2a693b3c3b3b2d680527090fdd303528171a40040e0c000307de30372f3c1a4b040c00032a2a691a5a043b1a5e040e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a0e040e0e0e0c000303ac2a39291af8030e0c00021a69040e0e0c0002037d29352a36293b1ae9030e0e0c000303032d02672a353e1ad9030e0e0c000303482a3629285b1aca030e0e0e0c000303032e023229287b1ab9030e0e0c000303032e02222928281aa9030e0e0c000303032e02122e1a1304691a17042a693b3e3c3b2d6805656402122d1a0e04691a12042a693b3e3c3b2d6805656502162b1a0904691a0d042a02023002693b3e3c3b2d68056564020317002a293b691afb032a692c2a693b3c3b3b2d680527090fdd303528671a3c030e0c000307de30372f3c1a47030c00032a2a691a56033b1a5a030e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a0a030e0e0e0c000303ac2a39291af4020e0c00021a65030e0e0c0002037d29352a36293b1ae5020e0e0c000303032d02672a353e1ad5020e0e0c000303482a3629285b1ac6020e0e0e0c000303032e023229287b1ab5020e0e0c000303032e02222928281aa5020e0e0c000303032e02122e1a0f03691a13032a693b3e3c3b2d6805656402122d1a0a03691a0e032a693b3e3c3b2d6805656502162b1a0503691a09032a02022c01693b3e3c3b2d68056564020317002a293b691af7022a692c2a693b3c3b3b2d680527090fdd303528081a38020e0c000307de30372f3c1a43020c00032a2a691a52023b1a56020e0e0e0c00032a2a0e0e0e0c0002643e2f692a353b1a06020e0e0e0c000303ac2a39291af0010e0c00021a61020e0e0c0002037d29352a36293b1ae1010e0e0c000303032d02672a353e1ad1010e0e0c000303482a3629285b1ac2010e0e0e0c000303032e023229287b1ab1010e0e0c000303032e02222928281aa1010e0e0c000303032e02122e1a0b02691a0f022a693b3e3c3b2d6805656402122d1a0602691a0a022a693b3e3c3b2d6805656502162b1a0102691a05022a02022800693b3e3c3b2d68056564020317002a293b691af3012a692c2a693b3c3b3b2d6805270902033e2b690fdd2b3b1a69010e0e0c0003291a20010e0c00021a91010e0e0c000207dd2935303c1a2b010c00032c2a69642a0c00023e2e692a353b1aff000c000303aa2a39291aec000e0c00021a5d010e0e0c0002037d29352a36293b1add000e0e0c000303032d02672a353e1acd000e0e0c000303482a3629285b1abe000e0e0e0c000303032e023229287b1aad000e0e0c000303032e02222928281a9d000e0e0c000303032e02122e1a0701691a0b012a693b3e3c3b2d6805656402122d1a0201691a06012a693b3e3c3b2d6805656502162b1afd00691a01012a693b3e3c3b020226002d6805656402012a293b691af1002a692c2a693b3c3b3b2d020206006805270702033e2c696466440e0e0e0e0e0e0e0000000000000000b8070000000000000000000000000000|@96,I105,I251,I232,@97,I107,I234,@99,@14296,I253,@14298,@166,@172,@174,@175,@176,I218,@172,@176,@172,@176,@172,@176,@177,@95| 95:O2|3,@178 96:S11|65786e5072696e74283329 97:O2|3,@98 98:S3|2e2e2e 99:O2|@100,0 100:O2|3,@101 101:S4|2e2e2e29 102:O1|@103 103:D5,64|00802b35291a40001a45000e0e0c0003291a44006928222a69651a43000c00023e2a6965420e0e0e000000000000000030000000000000000000000000000000|@93,@105,@130,@135,@104| 104:O1|@136 105:O1|@106 106:D20,328|00802b285c1a48010e0c000303051a47010fcc2b28221a37010c000303051a3f010fce28212c1a3f010c0003030c2b287e1a34010e0c000302013b03033c020c2b28201a0a010e0e0e0c000303032b0fd02b28071af9000e0e0c000303051a0f0102c52b28081ae7000c000303051a070102b52b28091ad7000c000303051aff0002a52b401ac8000e0c000303051af70002952b280b1ab7000c000303051aef0002852b280c1aa7000c000303051ae70002752b280d1a97000c000303051adf0002652b28201adf000c0003033e2b28401adc000e0c0003293b1adb00020247000c000303033c020f2928ff1ad100020235000e0e0c000303041acb00103b501acd002a1ad1002e7e0400032b3e401ace000e0e0e0c0004285c2a1aba002e020205000e7e040003420e0e0e0e0e0e0e000000000000000038010000000000000000000000000000|@108,I251,@109,@110,I248,@111,@112,@113,@114,@115,@116,@117,I250,I106,I234,I233,@118,@121,@122,@107| 107:O1|@128 108:S16|436861722e746f537472696e67283129 109:S2|5c5c 110:S2|5c22 111:S2|5c61 112:S2|5c62 113:S2|5c74 114:S2|5c6e 115:S2|5c76 116:S2|5c66 117:S2|5c72 118:O4|@14297,@120,0,@119 119:O5|@72,268,0,268,0 120:S3|436872 121:S2|5c5e 122:O1|@123 123:D14,280|00812c1a1a010e0e0e0c00022c1a10010e0c00022a3b1a0f010c000303032d0fca293b1a02010e0e0e0c000303032e02cb2a2a1afa000e0e0e0c00032928101aee000e0e0e0c0003293c1aeb000c00032928081aea000e0e0e0c0003291ae8001aed000e0e0c000303041aeb00103b502928413b1ae9000e0e0c0004292e1ae7000c0003502f3c1a9e000e0e0e0c00030311292808220c1ad6000e0e0e0c000450020e3328082b2808331acb000c0006502e3c1a72000e0e0e0c000303192808301a6c000e0c00032a2a220c1aa1000e0e0c000451021a2808301a53000c00033328082c2c331a8f0002020f000c000651291a8b000c00025029270565430e0e000000000000000008010000000000000000000000000000|@125,I223,I251,I239,I240,I241,72057594037927935,I247,@124,I11,I151,I254,I198,I47| 124:O4|4,@127,0,@126 125:S4|5e283229 126:O5|@50,182,0,182,0 127:S4|53697a65 128:D14,272|00822c3b1a11010e0e0c000303051a0f010fda2c3c1a10010e0c00032e3b1a0f010c00032d3b1a07010c00032a2a1a07010c000303033002282903132e3c1ae7000c0003312a1adf000c00036402122e3c1aec000e0c0003312a1acb000c00036429301ae2000e0e0e0c0003292e321ade000e0e0e0c000433321adb000c0003293b1a93000c000303033c021c323b1a9e000e0e0e0c00032a3b1a93000c00032a2a1a93000c000365030329020a29331a8d000e0e0c00032928301a82000e0e0e0c0003293b1a97000c000303033c020b2928ff1a91000e0e0c000303041a8f00103b502c2a1a8f00220d020205000e7e0e0003440e0e0e000000000000000000010000000000000000000000000000|@129,I113,I48,I107,I231,I251,I106,I109,@107,I110,I234,I233,@118,@122| 129:S18|436861722e6f6374496e7452657072283329 130:O1|@131 131:D19,408|00812c1a9a010e0e0e0c0002293c1a97010c0003030a2d2d2d0e0e0e7d0500023b3b292c1a81010e0e0c000303032a0243293c1a7a010e0e0e0c00032a28081a6e010e0e0e0c0003312a1a6b010c000364300e0e0e0c00021a45010e0e0c00022c2a1a5b010c0003292c2505250526031e4e3b6665291a4f010c0002030c293b1a4d010e0e0c000302013b03043b5002041a440110292b1a0e010e0e0e0c000303032e0fca2928101a05010e0e0c0003293c1a2b010c00032928081a2a010e0e0e0c0003291a28011a2d010e0e0c000303041a2b01103b502928413b1a29010e0e0c0004292e1a27010c00035028083b29311ab3000c000303043b50026a2928081aac000e0c0003220c2a1aaa000e0e0e0c000364340e0e0e0c0002291a80000e0c0002293c1a7f000c0003030d2d2d2c1ae4000e0c000450020e2a28082f2f2d1adc000e0c0006502b3c1a62000e0e0e0c00032d2b1a57000c0003292b2506250626041e74260451291abb00020207000c00025029270465430e0e0e0e0e0e000000000000000088010000000000000000000000000000|@133,I223,I251,I239,I252,I106,I105,I231,@132,I240,I241,72057594037927935,I247,@124,I11,I151,I254,I198,I47| 132:O4|4,@127,0,@134 133:S19|537472696e672e746f537472696e6773283229 134:O5|@50,148,0,148,0 135:O2|34,0 136:D23,496|00802b1af2010e0e0e0c00021af1010e0e0c000207d22b352c36293b1ae9010e0e0c000303032a0fd02d3b2a1ac9010e0e0c00021ac9010e0e0c000203252a352b362a1aca010e0e0e0c00022c2a1ac7010c00032b2a2506250626041e313b270402012965293b1ab6010e0e0e0c000303051ab3010fd2293c1aa4010e0c000303602e291a71010e0e0c00021a71010e0e0c000203043b5002041a93011029352a362a1a82011a5f010c000303033c02222a1a43010c00021a45010e0e0c000203102a3b1a61013b28081a6b010c000602013b0309292503511e563b02012a660fde291a12010202e6000e0e0e0c00020310293b1a49010202d2000e0e0c000302013b03043b5002041a3c01102928101a3d010e0e0c0003293c1a3b010c00032928081a3a010e0e0e0c0003291a38011a3d010e0e0c000303041a3b01103b502928413b1a3901020281000e0e0c0004292e1a33010c000350280833291a98000e0c00021a99000e0e0c0002034c29352a362a1a9a000e0e0e0c0002293c1a87000c0003030d2e2e2d1a04010e0c000450020e2b280830302d1afc000e0c0006502d2a1aaa000e0e0e0c0003292c2506250626041e58260402023b50512902020a001adb000c000250292704646502031a5500420e0e0e0e0000000000000000e0010000000000000000000000000000|@138,I105,I218,I251,I223,I106,I113,I48,@137,I154,I231,@132,I239,I240,I241,72057594037927935,I247,@124,I11,I151,I254,I198,I47| 137:O4|103,@140,I48,@139 138:S16|537472696e672e636f6e636174283129 139:O5|@72,626,0,626,0 140:S4|4661696c 141:O1|@142 142:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@144,@143| 143:D14,304|00802b363c1a30010e0c000303051a2f010fde2b35293b1a2e010e0e0e0c00036403051a2a010fdd2b363c1a0a010e0e0e0c000303051a1f0102d75607362c3529352e363c1a18010e0c00032a2a69662a0c00026429353b1aed000e0e0c000303952939291a00010e0c00021a01010e0e0c0002035f29361aed000e0e0c00021aed000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1aa5000e0e0c000202013b02013b031b2a1a9c00691aa0002a691aa3002a693b3e3c3b2d68056602031f002a64020129293b691a92002a691a950002020b002a693b3c3b3b2d68052705420e0e0e0e0e000000000000000020010000000000000000000000000000|@146,I234,@147,I251,@149,@147,I107,I105,I218,@157,@159,@161,@162,@145| 144:S13|7072696e746f7074696f6e2829 145:O5|0,0,0,@151,@163 146:S12|7072696e742d6f7074696f6e 147:O2|3,@148 148:S3|2e2e2e 149:O5|0,0,0,@151,@150 150:O2|@155,0 151:O2|@152,0 152:O2|0,@153 153:O5|@154,0,0,0,0 154:S14|5374616e64617264204261736973 155:O2|3,@156 156:S4|4e4f4e45 157:O2|@159,@158 158:O2|@160,0 159:O3|1,0,0 160:O2|3,41 161:O2|3,40 162:O3|1,1,0 163:O2|@164,0 164:O2|3,@165 165:S4|534f4d45 166:O4|0,@167,3,1 167:O1|@168 168:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@169,@14299,I253| 169:S17|7072696e742d4f532e7379736572726f72 170:O1|@171 171:D2,48|00802b353d2a1a2f000c00033e2a6965420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@93,I150| 172:O2|@173,0 173:O2|3,41 174:O3|1,1,0 175:O2|3,44 176:O2|3,40 177:O3|1,1,1 178:S6|537973457272 179:O2|@180,0 180:O2|3,125 181:O2|3,@182 182:S6|6e616d65203d 183:O2|3,@184 184:S10|66756e6374696f6e203d 185:O2|3,@186 186:S7|6361757365203d 187:S2|496f 188:O5|@189,610,0,610,0 189:S25|2e2f62617369732f426173696353747265616d494f2e736d6c 190:O1|@191 191:D18,304|00802b36293b1a2f010c00032d3729352f352c3b1a29010e0e0c000303033b0fca2b2307291a20010e0c00021a21010e0e0c000203043b5002152b1a1a011a1f016a1a23011a28012b1a2c016b641029352f3b3b1a29010e0e0c0004503b788121312c1a22010e0e0e0c0003296801302e2b1a1b010c0004652d0e0e0e0c0002056200ff6d0403002a351adb001a08010e0c0003030e2a2a2a35452a36462a37475102302a353c1aee000e0e0e0c000303101aeb002a2a35452a36462a37475102122f2b1ae1006a2a1a9c00451aa000462a475129352a362b372b2b2b1ad0006b270410292b1acf00020223000c000329321a4b000c00036403033b0210292b1ab5000e0e0c00032502501ead3b27042705420e0e0e0e0e000000000000000020010000000000000000000000000000|@193,I253,I113,I105,I218,@194,@196,@14294,@187,@197,I255,I107,@198,I251,@206,@196,@192,I106| 192:O5|@189,501,0,501,0 193:S28|426173696353747265616d494f28292e666c7573684f757427283129 194:O4|@14300,@195,0,0 195:S20|426c6f636b696e674e6f74537570706f72746564 196:S8|666c7573684f7574 197:O5|@189,514,0,515,0 198:O1|@199 199:D10,232|00822b1aea000e0e0e0c00021ae9000e0e0c0002036c2b352e352e1ad2000e0e0e0c0002030c2e3b1ad5000e0e0c000302013b03043b5002041acc00102a1aaf000c0002030c2a3b1ab5000e0e0c000302013b03043b5002041aac00102e2b1aae000e0e0e0c0003292b1aab000c00036403043b5002041aa600102e2b316a6502472c1a6a000e0e0e0c0002030c2c3b1a6d000e0e0c000302013b03043b5002041a6400102d352d2a1a6c000e0c000303043b5002041a6f0010292e1a71000e0e0c00032e2a316a65440e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@201,I105,I218,I231,@46,I239,I248,@202,@200,I240| 200:O4|11,@49,0,@205 201:S32|566563746f72536c6963654f7065726174696f6e7328292e736c696365283329 202:O4|11,@49,0,@203 203:O5|@204,111,0,111,0 204:S33|2e2f62617369732f566563746f72536c6963654f7065726174696f6e732e736d6c 205:O5|@204,101,0,101,0 206:O3|1,@207,0 207:S9|496e74657272757074 208:O1|@209 209:D21,376|00832e37292308291a75010e0e0c00021a75010e0e0c000203c029352b353b78812c2b341a69010e0e0c0003332d1a67010c0003296801220e2c2b1a62010e0e0e0c0004662e0e0e0e0c0002056200ff6d0403002a351a4f011a54010e0c0003030e2a2a2a35452a36462a37475102302a353c1a3a010e0e0e0c000303101a37012a2a35452a36462a37475102122c2b1a2d016a2a1a1001451a2c01462a475129352a362b372b2b2b1a24016b270410292b1adb000c000329331a1b010c00036403033b0210292b1ac5000e0e0c00032502501eb43b270402822a2307291a9f000c00021aa1000e0e0c000203043b5002172b35291ae8001aed006a1aa9001ac6002b1aea006b641029352c353d28413b1ae4000e0c00043b402a1ae2000e0e0e0c000303043b50021a2a2a28201ad7000c000450293c1ad6000e0e0e0c000325011e2950402a693b33220c220e2e312f321ac30022117b0a0d0009651f040e000000000000000068010000000000000000000000000000|@211,I105,I218,I106,I107,@212,@14294,I251,@206,@81,@187,@214,I113,@194,@81,@215,I11,I248,I254,I239,@210| 210:O1|@216 211:S27|426173696353747265616d494f28292e7772697465566563283429 212:O1|@213 213:D11,240|00822b1af2000e0e0e0c00021af1000e0e0c000203702b352e1aec000e0c00022e1ad4000e0c0002030c2e3b1ae1000e0e0c000302013b03043b5002041ad800102a1ab3000c0002030c2a3b1ac1000e0e0c000302013b03043b5002041ab800102e2b1aba000e0e0e0c0003292b1ab7000c00036403043b5002041ab200102e2b316a65024b2c1a6e000e0e0e0c0002030c2c3b1a79000e0e0c000302013b03043b5002041a7000102d1a5b000c00022d2a1a73000c000303043b5002041a770010292e1a79000e0e0c00032e2a316a65440e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@201,I105,I218,I223,I231,@46,I239,I248,@202,@200,I240| 214:O5|@189,577,0,577,0 215:O5|@189,604,0,605,0 216:D20,360|008731331a69010e0e0c000329401a67010c000303032902014034331a61010e0e0c00032a6801332b2b1a5b010c000429352a362b373b2b1a55010e0e0c000329401a53010c00036403041a5201103b50291a53010c000203193b2c1a31010e0e0c0003220e2a2c1a45010e0e0c00046402162b28081a17010c00032a2a22103b2f1a33010c00066478811a326801220f3b2b1a2a010e0e0e0c00046422100e0e0c0002056300ff6d0403002a351a17011a1c010e0c0003030e2a2a2a35452a36462a37475102312a353c1a02010e0e0e0c000303101aff002a2a35452a36462a3747510213220d2b1af4006a2a1ad700451af300462a475129352a362b372b2b2b1aeb006b2704102922141a71000e0e0c00032922141ade000e0e0e0c00036403033b02222922141a54000e0c000322132213221322132213221322131abf0022147b0a140009270a1f080e0e0e0e000000000000000058010000000000000000000000000000|@218,I107,I234,I106,@212,I239,I249,@219,I105,I254,I198,@198,@14294,I251,@206,@81,@187,@217,I113,@210| 217:O5|@189,595,0,595,0 218:S38|426173696353747265616d494f28292e7772697465566563283429666f7263654f7574283129 219:O4|11,@49,0,@220 220:O5|@72,1637,0,1637,0 221:D16,624|0087313b1a71020e0e0c0003312a1a6f020c0003312a1a6f020c00036503bf313b1a54020e0c000330680130302b1a5f020c00042f3530362b352c362d37301a56020e0e0e0c0002030c303b1a51020e0e0c000302013b03043b5002041a480210302b1a4a020e0e0e0c0003292f1a47020c00036403041a4602103b50291a17020c00020319302c1a25020e0e0c00032d2a2c1a32020e0e0e0c00045102162b28081a0b020c00032a2a2f342f1a20020e0c00065122103b1abd010e0e0c00032922101a12020e0e0e0c000322123b2b1a0d020e0e0c0004503b270a0fce313b1a95010e0e0c0003312a1a93010c0003333b1a83010c00032a680132322b1a8f010c0004313532362b352c362d37301a86010e0e0e0c0002030c303b1a81010e0e0c000302013b03043b5002041a780110302b1a7a010e0e0e0c0003292f1a77010c00036403041a7601103b50291a47010c00020319302c1a55010e0e0c00032d2a2c1a62010e0e0e0c00045102162b28081a3b010c00032a2a2f342f1a50010e0c00065122123b1aed000e0e0c000329331a43010c000322143b2b1a41010e0e0c000450220e1a3e010202a6000e0e0e0c0002502210341a1d010e0e0c00032213220c1ab9000e0e0c000329680122142c2b1aba000e0e0e0c00042213352214362b352c362d373b2b1ac3000c0003292f1ac3000c00036403041ac200103b50291a93000c000203193b2c1aa1000e0e0c00032d2a2c1aae000e0e0e0c00045102162b28081a87000c00032a2a2f3b2f1a9c000e0c000651221b22141a40000e0c0003221e3b2b1a95000e0e0c0004503b27161f080e0e000000000000000060020000000000000000000000000000|@222,I253,I107,I234,@212,I105,I231,@46,I239,I249,@219,I254,I198,I106,I255,@190| 222:S46|426173696353747265616d494f28292e6f7574707574566563746f72283229616464566563546f42756666283129 223:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@75,@74| 224:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@75,@74| 225:D23,744|00821aeb020c0001293c1aeb020c00032928061aea020e0e0e0c0003293b1ae7020c00036403033b02271ac3020c00011add022b1ac9020e0e0c0003293f1ad7020c00032b3c2b1ad6020e0e0e0c0004663b2f3b1aa1020e0e0c0003293c1aa7020c00036403033b0222291b204e1ab7020c000303033b0213293c1ab2020e0e0e0c0003292502501e363b64642f1aa7020c0002293b1a6f020c000303033b02103c311a9a020e0e0e0c000326031e5d3b6578810933330e0e0c000209cc00ff6d301a83020c0002293c1a3b020c000303043b500217311a76020e0e0e0c0002503d321a5a020e0e0e0c0003501a00020e0c0001293c301a26020e0e0e0c0004502e3f1afa010e0e0e0c0003293f1af7010c00036403341ad6010e0e0e0c0001293e1ad3010c0003293b1afb010c0003651a24020e0c0002030d280b3b1a00020e0c00035002023b5002023b503c28403b1a0c020e0c0004293b1a0b021ac0010e0c0004502c1a07020c0002293f1a07020c00036403033b023a2c3e1a79010e0e0c0003291af8010202aa000e0c00021ac5010e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291ac8010e0c00021a99010e0e0c000203043b50020f2d352e362f372b2b2b1ab2016b6610293529352a362b372c382d393c28403b1a74010e0c0004293b1a9b011a28010e0c000450343b1af6000e0e0e0c0003220c3c1aea000e0e0e0c0003220d3d1ade000e0e0e0c000331302f333268052c2c2c2c6b291a68010e0c00022711301a0e010e0e0e0c0002293c1ac3000c000303043b500217311afe000e0e0e0c0002503d321ae2000e0e0e0c0003501a88000e0c0001293c301aae000e0e0e0c0004502e3f1a82000e0e0e0c0003293f1a7f000c00036403341a5e000e0e0e0c0001293e1a5b000c0003293b1a83000c0003651aac000e0c0002030d280b3b1a88000e0c00035002023b5002023b502b2707440e0e0e0e0e0e0e0000000000000000d8020000000000000000000000000000|@227,I72,I253,I243,I251,-7,I242,I255,I113,I106,I71,I73,I70,I69,I218,I11,@228,I15,I250,I105,@257,@226,I14| 226:O1|@258 227:S20|5468726561644c69622e70726f74656374283329 228:O1|@229 229:D31,520|00802b363c1a08020e0c000303051a07020fd12b353b2a1a06020e0e0e0c00036403051a02020fcc2b363c1ae2010e0e0e0c000303051af7010fcf2b3529352a362b372c382d3931363c1aeb010c0003293b1abb010c000303051ae3010fd2293c1ad4010e0c00032f2a691ada013b1ade010e0e0e0c00032a2a0e0e0e0c0002642c3c1a8a010e0e0e0c000303051ac7010fdd2c3c1aa0010e0c0003312a691abe013b1aaa010e0e0e0c00032a2a0e0e0e0c0002642f3d1a56010e0e0e0c000303051aa30102b12f3c1a6c010e0c0003332a691a8a013b1a76010e0e0e0c00032a2a020206010e0e0e0c000264323e1a1e010202f6000e0e0e0c000303051a6f010262323c1a30010202e0000e0c0003220c2a691a49013b1a35010e0e0c00032a2a0e0e0e0c000264220c3c1a0901020263000e0e0c0003220e2a691a21013b1a0d010e0e0c00032a2a0e0e0e0c000264291a2301691a27012a691a2a012a692f2a6927091a28012a691a2b012a02021500692c2a6927061a25012a691a28012a692c2a6927061a26012a691a29012a692c2a6927061a27012a693b3c3b3b2d68052a1a22010e0e0e0c00021a21010e0e0c000203033b02013b0319291a1801691a1c012a691a1f012a693b3e3c3b2d680566020129293b691a14012a691a17012a693b3c3b3b2d6805270e420e0e0e0000000000000000f8010000000000000000000000000000|@231,I234,@232,I251,@233,@232,I107,@99,@14296,I253,@99,@14301,@99,@99,@172,@174,@175,@174,@175,@174,@175,@174,@175,@176,I105,I218,@249,@250,@176,@174,@230| 230:O5|0,0,0,@252,@251 231:S21|7072696e742d52756e74696d654c6f636174696f6e 232:O2|3,@148 233:O5|0,0,0,@235,@234 234:O2|@239,0 235:O2|@236,0 236:O2|0,@237 237:O5|@238,40,40,0,0 238:S27|2e2f62617369732f506f6c794d4c457863657074696f6e2e736d6c 239:O2|3,@240 240:S10|4e6f4c6f636174696f6e 241:O1|@242 242:D2,48|00802b35293c1a2f000c00033e2a6965420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@93,@243| 243:O9|@244,1152921504606846976,15,1000000000000000000,18,1152921504606846976,20,2305843009213693952,61 244:D13,384|00810403002c3d1a7e010e0e0e0c0003030d2928104556274656284750023a2c3c1a64010e0c0003030c294045562946562a475002232c3e1a4d010e0e0c0003030d29280845562b46562c4750020a293d45562d46562e475029352a362b37303b1a2c010e0c0003313b1a2b010c0003030c312d1a19010e0e0c000302013b037531401a0a010e0e0e0c000303302830321a0c010e0c0003293b1af3000c000303033c020b2928ff1afd000e0e0c000303041afb00103b503b50296402362841321adc000e0c000329401aeb000c0003293b1abb000c000303033c020b2928ff1ac5000e0e0c000303041ac300103b503b502965026d313b1a9d000e0e0c00030303310207311ab7000c00020402002a1ab5000e0e0c000203152a3b3b3b2d303333220d1aa9000e0e0c000a5002270402002b2f2b1aa0000e0c00045029352a36293b2c323033220d220d22101a80000e0c000a26042935291a84000e0c00025029662705430e0e000000000000000070010000000000000000000000000000|@246,I251,I234,I231,I106,I233,@118,I107,I111,I105,@245,I104,I47| 245:O1|@247 246:S10|496e742e666d74283229 247:D20,640|0088333b1a81020e0e0c000307d4313b1a75020e0e0c000303c12e036a323c1a6e020e0e0e0c00032928101a62020e0e0e0c0003293c1a5f020c00032928081a5e020e0e0e0c0003291a5c021a61020e0e0c000303041a5f02103b503b502928413b1a5b020c0004292e1a5b020c000350292808287e1a57020c000450342a45280946270502523228101a03020c0003293c1a03020c00032928081a02020e0e0e0c0003291a00021a05020e0e0c000303041a0302103b503b502928413b1aff010c000429220e1afe010e0e0e0c000350332a45280846270402a832311ab0010202a1000e0c0003040200331ae9010e0e0c00020319332b3b3b2d220c220c220c220c1ada010e0e0e0c000a50022704020034312b1ad0010e0c00045029352a36292e2c3430220f220f220f220f1aaf010c000a260429352a363b29220d1aaf010c000303043b5002282a2a1a41010e0e0c00032c2a28301a75010e0e0c0004502a3c1a2a010e0e0e0c00032502501e34505029220c1a17010c0003342c452a4627050fcf040200342d2b1a5a010e0e0e0c00045029352a3629401a5a010e0e0e0c0003033028302a1a54010e0c0003293b1a43010c000303033c020b2928ff1a45010e0e0c000303041a4301103b503b502964023628412a1a24010e0c000329401a33010c0003293b1a0b010c000303033c020b2928ff1a0d010e0e0c000303041a0b01103b503b502965220d3c1a7e000e0e0e0c0003220c3c1a7a000e0e0e0c00030402002e2c22112d2d22112211221122111aa8000e0c000a5029352a362a2a301a89000e0e0c000450293c1a3e0002020e000e0e0e0c000322102c452a46270a1f090e0e000000000000000070020000000000000000000000000000|@248,I113,I239,I240,I241,72057594037927935,I247,@124,I11,I151,I254,I105,@245,I104,I251,I234,I106,I233,@118,I107| 248:S20|496e742e666d74283229746f4368617273283429 249:O2|@250,@172 250:O3|1,0,0 251:O2|@255,0 252:O2|@253,0 253:O2|0,@254 254:O5|@238,41,41,0,0 255:O2|3,@256 256:S12|536f6d654c6f636174696f6e 257:O5|@238,83,0,83,0 258:D31,520|00802b363c1a08020e0c000303051a07020fd12b353b2a1a06020e0e0e0c00036403051a02020fcc2b363c1ae2010e0e0e0c000303051af7010fcf2b3529352a362b372c382d3931363c1aeb010c0003293b1abb010c000303051ae3010fd2293c1ad4010e0c00032f2a691ada013b1ade010e0e0e0c00032a2a0e0e0e0c0002642c3c1a8a010e0e0e0c000303051ac7010fdd2c3c1aa0010e0c0003312a691abe013b1aaa010e0e0e0c00032a2a0e0e0e0c0002642f3d1a56010e0e0e0c000303051aa30102b12f3c1a6c010e0c0003332a691a8a013b1a76010e0e0e0c00032a2a020206010e0e0e0c000264323e1a1e010202f6000e0e0e0c000303051a6f010262323c1a30010202e0000e0c0003220c2a691a49013b1a35010e0e0c00032a2a0e0e0e0c000264220c3c1a0901020263000e0e0c0003220e2a691a21013b1a0d010e0e0c00032a2a0e0e0e0c000264291a2301691a27012a691a2a012a692f2a6927091a28012a691a2b012a02021500692c2a6927061a25012a691a28012a692c2a6927061a26012a691a29012a692c2a6927061a27012a693b3c3b3b2d68052a1a22010e0e0e0c00021a21010e0e0c000203033b02013b0319291a1801691a1c012a691a1f012a693b3e3c3b2d680566020129293b691a14012a691a17012a693b3c3b3b2d6805270e420e0e0e0000000000000000f8010000000000000000000000000000|@231,I234,@232,I251,@260,@232,I107,@99,@14296,I253,@99,@14301,@99,@99,@172,@174,@175,@174,@175,@174,@175,@174,@175,@176,I105,I218,@249,@250,@176,@174,@259| 259:O5|0,0,0,@264,@251 260:O5|0,0,0,@261,@234 261:O2|@262,0 262:O2|0,@263 263:O5|@238,68,68,0,0 264:O2|@265,0 265:O2|0,@266 266:O5|@238,69,69,0,0 267:O2|@288,@287 268:O2|@270,@269 269:O3|@272,@274,@14560 270:D2,40|0080281256171a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@271,I150| 271:S28|426173696353747265616d494f28292e646f4f6e456e747279283129 272:D5,112|008056083b1a70000e0c0003293b2a1a6e000e0e0e0c00021a6d000e0e0c0002032f2a352b367881152c392d56972b1a5e000e0e0e0c00046405080e0e0e00ff6d3b642a2a2505250526031e3d3b6602012966420e0e0e0e000000000000000060000000000000000000000000000000|@273,I253,I105,I218,@12| 273:S27|426173696353747265616d494f28292e636c6f7365416c6c283129 274:O3|@275,@14561,@14560 275:D2,56|00802b3729372d563756481a32000e0e0e0c0004503b2a2e7d0500020e0e0e0e000000000000000028000000000000000000000000000000|@277,@276| 276:O1|@278 277:S28|426173696353747265616d494f28292e636c6f73654f757427283129 278:D12,248|00822d38293b1af7000c0003293c1af7000c000303033b02c32a3b3c1af1000e0e0c0004503b2f3b1ad5000e0e0c0003293c1ad3000c00036403033b0222291b204e1ad3000c000303033b0213293c1ace000e0e0e0c0003292502501e363b64642f1ac3000c0002293b1a9b000c000303043b50020e3c311ab5000e0e0c000326031e5d512d3b1a76000e0e0e0c0003292c1aa3000c00032f3b2b1a72000e0e0e0c000450301a97000c0002293c1a57000c000303043b500217311a8a000e0e0e0c0002503d321a66000e0e0e0c000350321a7b00310e0e7d0a000265440e0e0000000000000000e8000000000000000000000000000000|@280,I253,I251,I255,I113,I106,I71,I73,@281,I70,I69,@279| 279:O1|@284 280:S35|426173696353747265616d494f28292e7465726d696e61746553747265616d27283129 281:O1|@282 282:D5,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203352c352d362a38292f1a5f000c00031a51000e0e0c000264030f292e1a54000e0c00032b2a6964020a292e1a45002f7e0600036502013b430e0e0e000000000000000058000000000000000000000000000000|@283,I105,I218,I251,@281| 283:S16|4c6973742e66696c7465722832292829 284:D18,304|00802b36293b1a2f010c00032d3729352f352c3b1a29010e0e0c000303033b0fca2b2307291a20010e0c00021a21010e0e0c000203043b5002152b1a1a011a1f016a1a23011a28012b1a2c016b641029352f3b3b1a29010e0e0c0004503b788121312c1a22010e0e0e0c0003296801302e2b1a1b010c0004652d0e0e0e0c0002056200ff6d0403002a351adb001a08010e0c0003030e2a2a2a35452a36462a37475102302a353c1aee000e0e0e0c000303101aeb002a2a35452a36462a37475102122f2b1ae1006a2a1a9c00451aa000462a475129352a362b372b2b2b1ad0006b270410292b1acf00020223000c000329321a4b000c00036403033b0210292b1ab5000e0e0c00032502501ead3b27042705420e0e0e0e0e000000000000000020010000000000000000000000000000|@193,I253,I113,I105,I218,@194,@196,@14294,@187,@197,I255,I107,@285,I251,@206,@196,@192,I106| 285:O1|@286 286:D10,232|00822b1aea000e0e0e0c00021ae9000e0e0c0002036c2b352e352e1ad2000e0e0e0c0002030c2e3b1ad5000e0e0c000302013b03043b5002041acc00102a1aaf000c0002030c2a3b1ab5000e0e0c000302013b03043b5002041aac00102e2b1aae000e0e0e0c0003292b1aab000c00036403043b5002041aa600102e2b316a6502472c1a6a000e0e0e0c0002030c2c3b1a6d000e0e0c000302013b03043b5002041a6400102d352d2a1a6c000e0c000303043b5002041a6f0010292e1a71000e0e0c00032e2a316a65440e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@201,I105,I218,I231,@46,I239,I248,@202,@200,I240| 287:O2|@370,0 288:O4|@289,@14563,@14562,I148 289:D6,96|008056091a61003c1a65000e0e0c00043c2a693c28402b1a5e000e0e0e0c00043c28483c1a51000e0e0c00043c2b2b6a1a4d002a6956672a56881a4b00340e7b050900040e0e0e0e000000000000000050000000000000000000000000000000|@291,@292,@293,I11,@290,@12| 290:D2,40|00802b3b56271a27000c0004503b420e000000000000000018000000000000000000000000000000|@349,I255| 291:S19|54657874494f2e6f6e53746172745570283129 292:S5|737464496e 293:O2|@295,@294 294:O4|@344,@348,@343,@343 295:D17,424|00821aab012e691aae012f690404002e03132a68012c68012b2b452a463b473b482603021f1a980156472c6a2968011a960156672f6a2968012d3b453b462c472a48260529352a362b372c38040300281e220d3b1a79010e0e0c0004293d1a77010c00036403101a76012a2a35452a36462a374751026a7881142812220f3b1a4e010e0e0e0c0004503c051c0e0e00ff6d29353d1a51010e0e0c000303043b50020229103b503b6429030c1a4201220e692968016402013b2a030c1a3a01220f692968016402013b2b030c1a32012210692968016402013b2d2c452b462a47260529352a362b371a1e01221069280f22113b1adb000c00041a15012212692968011a14012214692968011a1301221669221668012216312f2d220c220f2f221022162218220c22112218221a2218680f040f002a2a1af0000e0c00035029352a362b372c382d392e3a2f230630230731230832230933230a34230b220c230c220d230d220e230e220e220e220e220e220e220e220e220e220e220e220e220e220e220e220e680f2724440e0e0e0e0e0e000000000000000098010000000000000000000000000000|@297,@298,@300,@302,@304,I61,I232,@305,I251,@306,@308,@310,@312,@314,@316,@317,@296| 296:O1|@318 297:S35|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329 298:D5,120|00802b352c362d3729362c1a72000e0e0e0c0002030c2c3b1a6d000e0e0c000302013b03043b5002041a6400102b1a4f000c0002030c2b3b1a4d000e0e0c000302013b03043b5002041a440010292d2d6a280856672b1a3f00330e7b05080004000000000000000068000000000000000000000000000000|@299,I105,I231,@46,I61| 299:S47|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329726561644172726179283129 300:D2,40|00804056172d1a27002e0e7b05030004000000000000000018000000000000000000000000000000|@301,I61| 301:S48|4c696272617279494f537570706f72742e77726170496e46696c65446573637228332972656164566563746f72283129 302:D1,40|00802b561856272d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@303| 303:S34|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283129283129 304:D1,40|00802b561856272d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@303| 305:O3|0,0,0 306:D2,40|0080281256173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@307,I61| 307:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129676574506f732d283129 308:D2,48|0080281356172d1a2e000e0e0e0c0004503b420e0e0e0e0e000000000000000020000000000000000000000000000000|@309,I61| 309:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129736574506f732d283129 310:D2,40|0080281456173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@311,I61| 311:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129656e64506f732d283129 312:D5,88|008078810d281156373b1a53000c0004051a00ff6d29353d1a4d000e0e0c000303043b50020229101a450064293b1a47000c0003030529680102013b64420e0e000000000000000048000000000000000000000000000000|@313,I61,I251,-1,I231| 313:S43|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329617661696c283129 314:D2,40|0080281b56173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@315,I61| 315:S49|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329746578745072696d52642d283129 316:D3,56|0080281056173b1a36000e0e0e0c0004293b1a33002e0e0e7e0400030e0e0e0e000000000000000028000000000000000000000000000000|@315,I61,I233| 317:D2,40|0080280756173b1a26002e7b05030004000000000000000018000000000000000000000000000000|@315,I61| 318:D12,560|00812c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2e3b1a04020e0c0003031d2f3b1af9010e0e0c000303033b020c2f351af2012a2f6a2968016502012e303b1adb010c0003031c2f3b1ad1010e0e0c000303033b020b2f351ad2012a69296801650201302c3b1ab4010e0c000303582d3b1aa9010e0e0c0003033e2f1ab6010e0e0e0c00021ab5010e0e0c000203142a1aa2010e0e0e0c00021aa1010e0e0c000202013b03102f352b351a98012a2c6a2968016602013b020c2d351a8f012a316a2968016502012c2e3b1a50010e0c000303572d3b1a45010e0e0c0003033e301a52010e0e0e0c00021a51010e0e0c000203142a1a3e010e0e0e0c00021a3d010e0e0c000202013b031030352b351a44012a2c6a2968016602013b020b2d351a3b012a692968016502012e2c3b1aed000e0e0c0003034122101af9000e0e0c00021af9000e0e0c000203142a1ae6000e0e0e0c00021ae5000e0e0c000202013b03132210352b351afb0022152b2d6b2968016602013b02012c2c3b1a9f000c0003034122111aad000e0e0c00021aad000e0e0c000203142a1a9a000e0e0e0c00021a99000e0e0c000202013b03132211352b351ab70022162b2d6b2968016602013b02012c221722154522144622134722124822114922104a220f4b220e4c2a24082b240934240a33240b2c240c2d240d30240e2715430e0e0e0e0e0e000000000000000020020000000000000000000000000000|@320,I251,@321,@325,I105,I218,@329,@331,@332,@334,@335,@319| 319:D8,88|00803b56190c0002502b56180e0c0002291a4c000e0c00021a4d000e0e0c000203043b50021656171a45001a4a006a1a4e001a53002b1a57006b641029356442000000000000000048000000000000000000000000000000|@341,I105,I218,@194,@342,@14294,@187,@340| 320:S25|5072696d494f28292e6175676d656e74526561646572283129 321:D25,384|00802b56181a80010e0c000303032b02025608291a79010e0e0c0002030c293b1a75010e0e0c000302013b03043b5002041a6c0110293b1a6e010e0e0e0c000303033c0234291a67011a6c010e0c000303041a6b01103b502928081a6a010e0e0e0c0003293c1a67010c00032928081a66010e0e0e0c0003652928413b1a60010e0c00043b2c2a1a5e010e0e0e0c000303043b50021a2a2a28201a53010c000450293c1a22010e0e0e0c000325011e29502b2a693b2d2b6a56570e0e0e0c00022968012b3b2b1a2f010c000429352a362b3729362b3b1a27010c000303051a2701027d2b3c1a18010e0c0003030e292d1a1d01220f0e0e0e7e0e00032b28101ac6000e0e0e0c0003293c1ac3000c00032928081ac2000e0e0e0c0003291af8001afd000e0e0c000303041afb00103b502928413b1aa9000e0e0c000429301aef000c0003502d312b2808331aea000e0e0e0c000650291ae7000c000250292704270b420e0e0e0e0e000000000000000070010000000000000000000000000000|@323,I234,I105,I231,@132,I251,576460752303423472,I249,@322,I239,I240,I241,I11,I248,I254,@198,I113,I48,I252,72057594037927935,I247,@124,I151,I198,I47| 322:O4|4,@127,0,@324 323:S37|5072696d494f28292e6175676d656e7452656164657228312972656164566563272d283129 324:O5|@50,169,0,169,0 325:D10,160|00802b352c362d372a56470e0e0c00022a352b362b1a90000e0c00022f1a90000e0c0002030c2f3b1a8d000e0e0c000302013b03043b5002041a8400102f2a1a86000e0e0e0c0003292d1a83000c00036403041a8200103b502c1a53000c0002030d2a302e1a78000e0c000450020e2c28082c322d1a70000e0c0006502c1a2700330e0e7d0a0002000000000000000090000000000000000000000000000000|@327,I223,I105,I231,@46,I239,I249,@326,I254,I198| 326:O4|11,@49,0,@328 327:S37|5072696d494f28292e6175676d656e7452656164657228312972656164417272272d283129 328:O5|@72,1182,0,1182,0 329:D1,48|00803b56180c0002030c2b56170c00022968016402013b42000000000000000020000000000000000000000000000000|@330| 330:S39|5072696d494f28292e6175676d656e74526561646572283129726561645665634e42272d283129 331:D26,408|00802b56181a98010e0c000303032b02025608291a91010e0e0c0002030c293b1a8d010e0e0c000302013b03043b5002041a840110293b1a86010e0e0e0c000303033c0234291a7f011a84010e0c000303041a8301103b502928081a82010e0e0e0c0003293c1a7f010c00032928081a7e010e0e0e0c0003652928413b1a78010e0c00043b2c2a1a76010e0e0e0c000303043b50021a2a2a28201a6b010c000450293c1a3a010e0e0e0c000325011e29502b2a693b2d2b6a56570e0e0e0c0002291ae4000e0c00021a45010e0e0c000203a529352968012c3b2b1a3b010c000429352a362b3729362b3b1a33010c000303051a330102792b3c1a24010e0c0003030c292d1a29010e0e0c000302622b28101acc000e0c0003293c1acb000c00032928081aca000e0e0e0c0003291a08011a0d010e0e0c000303041a0b01103b502928413b1ab1000e0e0c000429301aff000c0003502d312b2808331afa000e0e0e0c000650291af7000c000250292704296801270802013b2705420e0e0e0e0e000000000000000088010000000000000000000000000000|@330,I234,I105,I231,@132,I251,576460752303423472,I249,@322,I239,I240,I241,I11,I248,I254,I218,@198,I113,I48,I252,72057594037927935,I247,@124,I151,I198,I47| 332:D1,48|00803b56180c0002030c2b56170c00022968016402013b42000000000000000020000000000000000000000000000000|@333| 333:S39|5072696d494f28292e6175676d656e74526561646572283129726561644172724e42272d283129 334:D11,192|00802b352c362d372a56470e0e0c0002291ab4000e0c00021ab5000e0e0c0002037d29352b352c362b1aac000e0c0002301a94000e0c0002030c303b1aa1000e0e0c000302013b03043b5002041a980010302a1a9a000e0e0e0c0003292d1a97000c00036403041a9600103b502c1a57000c0002030d2a312e1a8c000e0c000450020e2c28082c332d1a84000e0c0006502c1a43000c0002296801270502013b2704420e0e0e0e0e0000000000000000b0000000000000000000000000000000|@333,I105,I218,I223,I231,@46,I239,I249,@326,I254,I198| 335:D8,88|00803b56190c0002502b56180e0c0002291a4c000e0c00021a4d000e0e0c000203043b50021656171a45001a4a006a1a4e001a53002b1a57006b641029356442000000000000000048000000000000000000000000000000|@337,I105,I218,@194,@338,@14294,@187,@336| 336:O5|@339,239,0,242,0 337:S38|5072696d494f28292e6175676d656e745265616465722831297265616456656327272d283129 338:S7|72656164566563 339:S18|2e2f62617369732f5072696d494f2e736d6c 340:O5|@339,262,0,265,0 341:S38|5072696d494f28292e6175676d656e745265616465722831297265616441727227272d283129 342:S7|72656164417272 343:O1|11 344:D6,224|008178810d2e2e0e0e0c00022968016405b100ff6d29353d1acd000e0e0c0003031929372936291ac6000e0e0e0c00021ac5000e0e0c00026502013b03043b50020229103b5029372936293556493b1a96000e0e0e0c000303033b020c5649352a2a1a9b000c00036403033b025356483b1a74000e0c000303033b020c5648352a2a1a7b000c00036403033b023356473b1a54000e0c000303033b020c5647352a2a1a5b000c00036403043b50020f2c352d362e372b2b2b1a4d006b66103b503b2704430e0e0e0e0000000000000000d0000000000000000000000000000000|@346,I251,I105,I218,I113,@345| 345:O5|@347,118,0,118,0 346:S31|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283229 347:S28|2e2f62617369732f4c696272617279494f537570706f72742e736d6c 348:O1|115 349:S37|4261736963496d7065726174697665494f28292e736574496e73747265616d283229283129 350:O5|0,@352,@351,1285,0 351:O3|1,@14302,@14564 352:S1286|282a0a20202020436f707972696768742028632920323030362d31302020446176696420432e204a2e204d617474686577730a0a2020202054686973206c696272617279206973206672656520736f6674776172653b20796f752063616e2072656469737472696275746520697420616e642f6f720a202020206d6f6469667920697420756e64657220746865207465726d73206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e7365206173207075626c697368656420627920746865204672656520536f66747761726520466f756e646174696f6e3b206569746865720a2020202076657273696f6e20322e31206f6620746865204c6963656e73652c206f722028617420796f7572206f7074696f6e2920616e79206c617465722076657273696f6e2e0a202020200a2020202054686973206c69627261727920697320646973747269627574656420696e2074686520686f706520746861742069742077696c6c2062652075736566756c2c0a2020202062757420574954484f555420414e592057415252414e54593b20776974686f7574206576656e2074686520696d706c6965642077617272616e7479206f660a202020204d45524348414e544142494c495459206f72204649544e45535320464f52204120504152544943554c415220505552504f53452e20205365652074686520474e550a202020204c65737365722047656e6572616c205075626c6963204c6963656e736520666f72206d6f72652064657461696c732e0a202020200a20202020596f752073686f756c642068617665207265636569766564206120636f7079206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e736520616c6f6e6720776974682074686973206c6962726172793b206966206e6f742c20777269746520746f20746865204672656520536f6674776172650a20202020466f756e646174696f6e2c20496e632e2c203531204672616e6b6c696e2053742c20466966746820466c6f6f722c20426f73746f6e2c204d41202030323131302d3133303120205553410a2a290a0a282a20436f6d70696c65722074686520636f6d70696c657220616e64206578706f7274206974206173206120706f727461626c652066696c652e20205468652072657374206f66207468650a202020626f6f7473747261702070726f63657373206973207468656e20646f6e65207768656e2074686520706f727461626c652066696c6520697320696d706f727465642e202a290a0a506f6c794d4c2e7072696e745f646570746820303b0a0a506f6c794d4c2e757365202262617369732f52756e74696d6543616c6c73223b0a0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c65722f426f6f74223b0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c6572223b0a0a506f6c794d4c2e7368617265436f6d6d6f6e44617461204d4c436f6d70696c65722e7368656c6c3b0a0a506f6c794d4c2e6578706f7274506f727461626c652822706f6c7974656d70222c0a20202020666e202829203d3e20284d4c436f6d70696c65722e7368656c6c28293b204f532e50726f636573732e65786974204f532e50726f636573732e73756363657373292068616e646c65205f203d3e204f532e50726f636573732e65786974204f532e50726f636573732e6661696c757265293b0a 353:O2|1,@354 354:O15|@292,@356,@357,@359,0,0,@360,0,@361,@363,@365,4096,@367,@355,0 355:O1|@369 356:O2|@312,I148 357:O1|@358 358:O2|@314,I148 359:O2|@317,I148 360:O1|I148 361:O1|@362 362:O2|@298,I148 363:O1|@364 364:O2|@300,I148 365:O1|@366 366:O2|@316,I148 367:O1|@368 368:O3|@332,@362,@366 369:O3|@329,@364,@366 370:O2|@372,@371 371:O3|@373,@374,@14565 372:D2,40|0080281256171a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@271,I150| 373:D5,112|008056083b1a70000e0c0003293b2a1a6e000e0e0e0c00021a6d000e0e0c0002032f2a352b367881152c392d56972b1a5e000e0e0e0c00046405080e0e0e00ff6d3b642a2a2505250526031e3d3b6602012966420e0e0e0e000000000000000060000000000000000000000000000000|@273,I253,I105,I218,@12| 374:O3|@375,@14566,@14565 375:D2,56|00802b3729372d563756481a32000e0e0e0c0004503b2a2e7d0500020e0e0e0e000000000000000028000000000000000000000000000000|@277,@376| 376:O1|@377 377:D12,248|00822d38293b1af7000c0003293c1af7000c000303033b02c32a3b3c1af1000e0e0c0004503b2f3b1ad5000e0e0c0003293c1ad3000c00036403033b0222291b204e1ad3000c000303033b0213293c1ace000e0e0e0c0003292502501e363b64642f1ac3000c0002293b1a9b000c000303043b50020e3c311ab5000e0e0c000326031e5d512d3b1a76000e0e0e0c0003292c1aa3000c00032f3b2b1a72000e0e0e0c000450301a97000c0002293c1a57000c000303043b500217311a8a000e0e0e0c0002503d321a66000e0e0e0c000350321a7b00310e0e7d0a000265440e0e0000000000000000e8000000000000000000000000000000|@280,I253,I251,I255,I113,I106,I71,I73,@378,I70,I69,@190| 378:O1|@379 379:D5,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203352c352d362a38292f1a5f000c00031a51000e0e0c000264030f292e1a54000e0c00032b2a6964020a292e1a45002f7e0600036502013b430e0e0e000000000000000058000000000000000000000000000000|@283,I105,I218,I251,@378| 380:O2|@382,@381 381:O2|@31,0 382:O6|@383,@14304,@384,@14305,@14567,@14303 383:O2|4096,@14288 384:O14|@386,@387,@389,0,0,@390,0,@391,@393,@395,4096,0,@397,@385 385:O1|@399 386:S6|737464457272 387:O1|@388 388:O2|@38,I202 389:O2|@41,I202 390:O1|I202 391:O1|@392 392:O2|@45,I202 393:O1|@394 394:O2|@53,I202 395:O1|@396 396:O2|@57,I202 397:O1|@398 398:O3|@60,@392,@396 399:O3|@63,@394,@396 400:O1|@401 401:D4,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203242b352c36291a52000e0e0e0c00025078810a3b2d0e0e0e0c0002050500ff6d3b646502013b420e0e0e0e000000000000000048000000000000000000000000000000|@402,I105,I218,@400| 402:S20|506f6c794d4c2e72756e4f6e456e747279283129 403:O2|@14568,@404 404:O4|1,@14307,@14308,@14306 405:O2|@406,80 406:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@408,@407| 407:O1|@409 408:S25|486173685461626c652e6861736856616c7565283129283129 409:D13,216|00812c1ada000e0e0e0c00023b2a293b1ad5000e0e0c000303032a0268293c1ace000e0e0e0c00032a3c1ac3000c0003311ac4000e0c000203033102142928081abd000e0e0c0003322a1abb000c000364291aa3000c00020303290207291aaf000c000228072f1aae000e0e0e0c00032a2a1a8b000c0003292f2508250826061e723b2706652d1a6e000e0e0e0c000203032d02072d1a77000c00022a2a1a7f000c0003293b1a7f000c0003030e1a7f002a1a8300310e0e7e080003292704430000000000000000c8000000000000000000000000000000|@411,I223,I251,I240,I105,I239,I252,I152,I238,I246,I234,@410,I106| 410:B8|0000000000000080 411:S22|486173685461626c652e6861736856616c7565283229 412:O2|@503,@14282 413:O2|@415,@414 414:O2|@416,0 415:S2|3c3d 416:O4|@14310,69,@417,0 417:O7|@415,2,@424,@425,@423,0,0 418:O1|@419 419:O1|@420 420:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 421:O2|3,63 422:S13|7072696e742d64656661756c74 423:O2|@452,0 424:O2|3,8 425:O3|2,@427,@426 426:O5|5,0,@438,@437,0 427:O3|3,@429,@428 428:O3|0,@435,1 429:O2|@431,@430 430:O2|@434,0 431:O2|49,@432 432:O3|6,@14311,79992 433:O2|4,0 434:O2|50,@432 435:O2|49,@436 436:O2|50,0 437:O3|@438,@423,@439 438:S4|626f6f6c 439:O3|@441,@448,@440 440:O3|@438,@450,@449 441:O2|1,@442 442:O3|2,@443,0 443:O4|I251,@14312,1,1 444:O1|@445 445:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@447,@446| 446:O2|3,63 447:S37|545950455f5452454528292e64656661756c744d6f6e6f547970655072696e746572283129 448:O4|1,@14313,0,0 449:S8|496e204261736973 450:O5|@451,0,0,0,0 451:S14|5374616e64617264204261736973 452:O2|0,@450 453:O2|@455,@454 454:O2|@456,0 455:S2|3e3d 456:O4|@14310,69,@457,0 457:O7|@455,2,@424,@425,@423,0,0 458:O2|@460,@459 459:O2|@461,0 460:S4|74727565 461:O4|@14310,69,@462,0 462:O7|@460,@464,@463,@426,@423,0,0 463:O2|1,@465 464:O2|1,2 465:O3|14,@466,0 466:O2|@468,@467 467:O2|@475,0 468:O2|7,@469 469:O8|@471,@460,0,0,@470,0,0,1 470:O2|@474,0 471:O4|13,1,@472,1 472:O2|4,@473 473:O2|0,0 474:O2|1,0 475:O3|2,1,0 476:O2|@478,@477 477:O2|@479,0 478:S3|65786e 479:O4|@14314,69,@480,0 480:O2|@481,0 481:O3|@478,@423,@482 482:O3|@484,@490,@483 483:O3|@478,@450,@449 484:O2|1,@485 485:O3|2,@486,0 486:O4|0,@14315,2,1 487:O1|@488 488:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@489,@446| 489:S40|545950455f5452454528292e6d616b655479706528332964656661756c745072696e746572283129 490:O4|1,@14316,0,0 491:O2|@493,@492 492:O2|@494,0 493:S3|636872 494:O4|@14310,69,@495,0 495:O7|@493,2,@497,@496,@423,0,0 496:O3|2,@501,@500 497:O2|1,@498 498:O2|7,@499 499:O8|@472,@493,0,0,@470,0,0,1 500:O5|5,0,@511,@510,0 501:O5|5,0,@503,@502,0 502:O3|@503,@423,@504 503:S3|696e74 504:O3|@506,@509,@505 505:O3|@503,@450,@449 506:O2|1,@507 507:O3|2,@508,0 508:O4|I113,@14317,3,1 509:O4|1,@14318,0,0 510:O3|@511,@423,@512 511:S6|737472696e67 512:O3|@514,@656,@513 513:O3|@511,@450,@449 514:O2|1,@515 515:O3|2,@517,@516 516:O2|@522,@521 517:O4|@518,@14319,3,1 518:O1|@519 519:D7,120|00812c2c1a79000e0e0c000303033c024c2c1a73000c00021a75000e0e0c000203142b1a62000e0e0e0c00021a61000e0e0c000202013b03232c3b2d3b2808301a55000e0e0c00021a55000e0e0c00031a5500300e0e0e7b070400063b430e0e000000000000000068000000000000000000000000000000|@520,I251,I105,I218,I223,I239,I154| 520:S14|737472696e67457175616c697479 521:O2|@619,0 522:O4|@14320,69,@523,0 523:O2|@525,@524 524:O2|0,@618 525:O2|@527,@526 526:O2|@527,0 527:O4|@14321,69,@528,0 528:O3|0,@530,@529 529:O5|@582,@609,I49,@615,@581 530:O8|@532,@520,0,0,@531,0,0,1 531:O2|@574,@573 532:O4|1,@534,@475,@533 533:O4|1,@543,@555,@542 534:O4|3,@536,@535,1 535:O3|2,I251,0 536:O2|@538,@537 537:O2|@539,0 538:O2|@472,1 539:O2|@540,1 540:O2|4,@541 541:O2|0,1 542:O3|2,0,0 543:O4|1,@545,@544,@542 544:O4|3,@552,@546,1 545:O4|3,@547,@546,1 546:O3|2,I218,0 547:O2|@548,0 548:O2|@549,1 549:O4|3,@551,@550,1 550:O3|2,I105,0 551:O2|@538,0 552:O2|@553,0 553:O2|@554,1 554:O4|3,@537,@550,1 555:O4|3,@557,@556,1 556:O3|2,I154,0 557:O2|@538,@558 558:O2|@560,@559 559:O2|@539,@561 560:O2|@542,1 561:O2|@560,@562 562:O2|@563,0 563:O2|@564,1 564:O4|3,@566,@565,1 565:O3|2,I239,0 566:O2|@568,@567 567:O2|@570,0 568:O2|@569,1 569:O3|2,8,0 570:O2|@571,1 571:O4|3,@537,@572,1 572:O3|2,I223,0 573:O2|@579,0 574:O2|1,@575 575:O2|@577,@576 576:O2|@577,@578 577:O1|3 578:O2|@577,0 579:O2|1,@580 580:O2|@577,@575 581:O1|@616 582:D3,48|00802b1a320056276956285639564a1a2e00307b07030006000000000000000020000000000000000000000000000000|@584,@585,@583| 583:O1|@587 584:S40|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283129283129 585:D1,48|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@586| 586:S39|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e2832292d45 587:D17,344|0084040200302a310e0c00035029352a360402002b353b1a46010e0e0e0c0003030d2b362c372b2b452a46260302ac2b3629353d1a29010e0e0c000303043b5002041a2301103b502936291a22010e0e0e0c00021a21010e0e0c000203033c0210331a1b010c00022a2a1a1b010c00036403041a1a01103b503b50332a1a18010e0c0003293b1ad7000c0003641ae8000e0c000203043b5002041a0301103b50291acc000e0c00020303290207291af7000c0002293c1af7000c0003342a1ad7000c00032c3c1aef000c0003220c0e0e0e0c00022f2b452a46260729352a362c353b1a7b000c0003031a2c362d371acf001ad4002b220f220f220f68063b2c2b6a66022b2c353d1a56000e0e0e0c0003031a2c362d371ab7001aac002b220f220f220f68063d2c2b6a6602031aa9003b2c2c6a292b6927081f050e0e0e0e0e0e000000000000000048010000000000000000000000000000|@589,I251,@590,I105,I218,I15,I247,@599,I253,@602,I152,I239,I106,@605,@583,@607,@588| 588:O1|1 589:S37|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283229 590:O4|@14322,@596,@597,@591 591:O5|@598,314,0,314,0 592:O1|@593 593:O1|@594 594:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@595,@14296,I253| 595:S12|7072696e742d737472696e67 596:S13|496e7465726e616c4572726f72 597:S43|636f646574726565206e6577456e7669726f6e3a204e6f742045787472616374206f7220436f6e73746e74 598:S40|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245452e4d4c 599:O4|11,@49,0,@600 600:O5|@601,114,0,114,0 601:S18|2e2f62617369732f566563746f722e736d6c 602:O4|@14322,@596,@604,@603 603:O5|@598,310,0,310,0 604:S33|5265666572656e636520746f206e6f6e2d6578697374656e742062696e64696e67 605:D2,48|00802b1a32005628695629563a564b5657300e7b07030006000000000000000020000000000000000000000000000000|@584,@606| 606:D1,48|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@586| 607:D2,48|00802b1a32005628695629563a564b5657300e7b07030006000000000000000020000000000000000000000000000000|@584,@608| 608:D1,48|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@586| 609:O2|@610,0 610:D7,112|008056072c2a1a6f000c00021a71000e0e0c000203043b5002041a6b00102a352b362b3b1a69000e0e0c000303032a02172b3c1a62000e0e0e0c00032a2a2505250526031e3f3b6427043c2a69291a4f006965420e0e0e0e000000000000000060000000000000000000000000000000|@612,I105,I218,@611,I113,I107,@588| 611:O4|11,@49,0,@613 612:S49|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429696e6c696e65436f64652d283129 613:O5|@614,97,0,97,0 614:S16|2e2f62617369732f4c6973742e736d6c 615:O1|@518 616:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@617| 617:S38|434f44455452454528292e67656e436f64652833292831296669656c6450726f70732d283129 618:O2|0,@473 619:O4|@14321,69,@620,0 620:O3|2,4,@621 621:O5|@623,@625,I49,@640,@622 622:O2|@642,@641 623:D3,48|00802b1a320056276956285639564a1a2e00307b07030006000000000000000020000000000000000000000000000000|@584,@624,@583| 624:D1,48|00812c56170c00022c2a35452a364664430e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@586| 625:O2|@627,@626 626:O2|@630,@629 627:D6,104|008056072c2a1a67000c00021a69000e0e0c000203043b5002041a6300102a352b362b3b1a61000e0e0c000303032a02172b3c1a5a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000000000000058000000000000000000000000000000|@628,I105,I218,@611,I113,I107| 628:S39|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129283129 629:O2|@633,@632 630:O2|@631,@528 631:O3|0,@518,@526 632:O2|@636,@635 633:O2|@634,@588 634:O3|0,@14319,0 635:O2|@638,0 636:O2|@637,@588 637:O3|0,3,0 638:O2|@639,@588 639:O3|0,1,0 640:O1|@517 641:O2|@643,0 642:D6,104|008056072c2a1a67000c00021a69000e0e0c000203043b5002041a6300102a352b362b3b1a61000e0e0c000303032a02172b3c1a5a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000000000000058000000000000000000000000000000|@617,I105,I218,@611,I113,I107| 643:O2|@522,@644 644:O2|@646,@645 645:O2|@646,0 646:O4|@14321,69,@647,0 647:O3|2,4,@648 648:O4|@650,@652,@649,@517 649:O2|@526,@524 650:D8,216|00802b1ada000e0e0e0c000203032b02072b1ad3000c000256192a1ad2000e0e0e0c000356282e2a1ab5000e0e0c00021ac5000e0e0c000203043b5002041abf00102a352b362b3b1abd000e0e0c000303032a02172b3c1ab6000e0e0e0c00032a2a2505250526031e413b6427043b2b2b6a5647302a1a67000c00021a79000e0e0c000203043b5002041a7300102a352b362b3b1a71000e0e0c000303032a02172b3c1a6a000e0e0e0c00032a2a2505250526031e3f3b6427042a2a692705420000000000000000c8000000000000000000000000000000|@651,I105,I152,I253,I218,@611,I113,I107| 651:S81|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c2831297475706c6550726f70732d696e6c696e6550726f702d7475706c65456e747279283129 652:O2|@528,@653 653:O2|@588,@654 654:O2|@588,@655 655:O2|@588,0 656:O4|1,@14323,0,0 657:O2|@659,@658 658:O2|@660,0 659:S2|3c3e 660:O4|@14310,69,@661,0 661:O7|@659,2,@663,@662,@423,0,0 662:O3|2,@664,@426 663:O2|3,6 664:O3|3,@665,@428 665:O2|@667,@666 666:O2|@669,0 667:O2|49,@668 668:O3|6,@14324,79996 669:O2|50,@668 670:O2|@672,@671 671:O2|@673,0 672:S3|616273 673:O4|@14310,69,@674,0 674:O7|@672,2,@424,@675,@423,0,0 675:O3|2,@432,@432 676:O2|@678,@677 677:O2|@679,0 678:S5|66616c7365 679:O4|@14310,69,@680,0 680:O7|@678,@464,@681,@426,@423,0,0 681:O2|1,@682 682:O3|14,@683,0 683:O2|@685,@684 684:O2|@542,0 685:O2|7,@686 686:O8|@687,@678,0,0,@470,0,0,1 687:O4|13,0,@472,1 688:O2|@690,@689 689:O2|@691,0 690:S6|506f6c794d4c 691:O4|@14325,69,@692,0 692:O4|@690,@694,@693,@423 693:O6|@696,I48,0,@423,@695,0 694:O2|1,@542 695:O1|@12648 696:O4|1,@14327,@14328,@14326 697:O2|@12233,@12646 698:O2|@700,@699 699:O2|@701,0 700:S10|50546f70656e65644174 701:O4|@14310,69,@702,0 702:O7|@700,@704,@705,@703,@423,0,0 703:O3|2,@724,@723 704:O2|0,14 705:O2|1,@706 706:O3|14,@707,0 707:O2|@709,@708 708:O2|@714,@713 709:O2|7,@710 710:O8|@711,@700,0,0,@470,0,0,1 711:O4|13,6,@712,13 712:O4|6,@472,0,0 713:O2|@720,0 714:O2|7,@715 715:O8|@716,@700,0,0,@470,0,0,1 716:O3|14,@717,1 717:O2|@719,@718 718:O2|@472,0 719:O3|2,6,0 720:O2|7,@721 721:O8|@722,@700,0,0,@470,0,0,1 722:O4|6,@472,1,1 723:O5|5,0,@754,@753,@423 724:O5|5,0,@726,@725,@423 725:O3|@726,@423,@727 726:S8|6c6f636174696f6e 727:O3|@694,@729,@728 728:O3|@752,@450,@449 729:O3|2,0,@730 730:O3|3,@732,@731 731:O3|0,@747,1 732:O2|@734,@733 733:O2|@737,@736 734:O2|@735,@500 735:S4|66696c65 736:O2|@740,@739 737:O2|@738,@501 738:S7|656e644c696e65 739:O2|@743,@742 740:O2|@741,@501 741:S9|73746172744c696e65 742:O2|@745,0 743:O2|@744,@501 744:S11|656e64506f736974696f6e 745:O2|@746,@501 746:S13|7374617274506f736974696f6e 747:O2|@735,@748 748:O2|@738,@749 749:O2|@741,@750 750:O2|@744,@751 751:O2|@746,0 752:S15|506f6c794d4c2e6c6f636174696f6e 753:O3|@754,@423,@755 754:S12|707450726f70657274696573 755:O3|@757,@763,@756 756:O3|@764,@450,@449 757:O2|1,@758 758:O3|2,@759,0 759:O4|0,@14330,3,1 760:O1|@761 761:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@762,@446| 762:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f747970655072696e746572283129 763:O4|1,@14331,0,0 764:S19|506f6c794d4c2e707450726f70657274696573 765:O2|@767,@766 766:O2|@768,0 767:S12|507265747479537472696e67 768:O4|@14310,69,@769,0 769:O7|@767,@771,@772,@770,@423,0,0 770:O3|2,@500,@924 771:O2|0,5 772:O2|1,@773 773:O3|2,@775,@774 774:O2|@782,0 775:O3|@777,@779,@776 776:O1|@781 777:O1|@778 778:D2,40|00802b353e1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@767,I251| 779:O1|@780 780:D1,32|00803e2c69420e0e000000000000000010000000000000000000000000000000|@767| 781:D1,32|00802b36420e0e0e000000000000000010000000000000000000000000000000|@767| 782:O4|@14321,69,@783,0 783:O3|2,3,@784 784:O6|@607,@583,@786,@815,@785,@581 785:O22|@817,@821,@824,@820,@819,@829,@832,@828,@827,@837,@835,@777,@779,@776,@775,@841,@844,@840,@818,@847,@14332,@816 786:O2|@627,@787 787:O2|@789,@788 788:O2|@800,@799 789:O2|@791,@790 790:O3|0,@793,@609 791:O2|1,@792 792:O2|2,10 793:O8|@795,@767,0,0,@794,0,0,1 794:O2|@796,0 795:O4|13,3,@712,4 796:O2|1,@797 797:O2|@798,0 798:O3|2,0,@578 799:O2|@810,0 800:O2|@802,@801 801:O3|0,@804,@609 802:O2|1,@803 803:O2|2,11 804:O8|@806,@767,0,0,@805,0,0,1 805:O2|@809,0 806:O3|14,@807,1 807:O2|@808,@718 808:O3|2,3,0 809:O2|1,@578 810:O2|@812,@811 811:O3|0,@814,@609 812:O2|1,@813 813:O2|2,12 814:O8|@722,@767,0,0,@805,0,0,1 815:O21|2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2 816:O4|@847,@14332,3,1 817:O6|@816,@819,@827,@835,@775,@818 818:O3|@841,@844,@840 819:O3|@821,@824,@820 820:O1|@826 821:O1|@822 822:D2,40|00802b353b1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@823,I251| 823:S11|507265747479426c6f636b 824:O1|@825 825:D1,48|00802b352c362d372e383b2d2d2d2d68052704420e0e0e0e000000000000000020000000000000000000000000000000|@823| 826:D1,48|00802b362c372d382e392c2c2c2c6b2704420e0e0e0e0e0e000000000000000020000000000000000000000000000000|@823| 827:O3|@829,@832,@828 828:O1|@834 829:O1|@830 830:D2,40|00802b353c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@831,I251| 831:S11|507265747479427265616b 832:O1|@833 833:D1,40|00802b352c363c2b2b6a65420e0e0e0e000000000000000018000000000000000000000000000000|@831| 834:D1,40|00802b362c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@831| 835:O2|@837,@836 836:O1|2 837:O1|@838 838:D2,40|00802b353d1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@839,I251| 839:S15|5072657474794c696e65427265616b 840:O1|@846 841:O1|@842 842:D2,40|00802b353f1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@843,I251| 843:S21|507265747479537472696e67576974685769647468 844:O1|@845 845:D1,40|00802b352c363f2b2b6a65420e0e0e0e000000000000000018000000000000000000000000000000|@843| 846:D1,40|00802b362c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@843| 847:O1|@848 848:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@849| 849:S5|6e6f2d6571 850:O2|@851,@14332 851:D51,1136|00802b363c1a70040e0c000303051a6f040fcd2b3529353b1a6d040e0e0c00036407d12b3529362a372b382c3930363c1a5d040e0e0c0003293b1a3b040c000303051a53040fd2293c1a44040e0c00032e2a691a4a043b1a4e040e0e0e0c00032a2a0e0e0e0c0002642c3c1a0a040e0e0e0c000303051a370402c92c3c1a10040e0c0003302a691a2e043b1a1a040e0e0e0c00032a2a0e0e0e0c0002642f3d1ad6030e0e0e0c000303051a130402862f3c1adc030e0c0003322a691a0a043b1ae6030e0e0e0c00031a05042a0e0c0002642a2a0e0e0c000264323c1ab203020275030e0e0e0c0003342a691ada033b1ab603020293000e0e0e0c00031ad90312140001000100693b2a3e3c6b642a0e0e0e0c0002642a2a020238000e0e0c000264291abb03691abf032a691ac2032a692f2a6927091ac0032a691ac3032a692c2a6927061ac1032a691ac4032a692c2a6927061ac2032a693b3c3b3b2d68052a1abd030e0e0c00021abd030e0e0c000250293b691ab9032a691abc032a693b3c3b3b2d6805270c0fd82b363c1ae9020e0e0c000303051aa7030fc82b3529353c1ae5020e0e0c00036403ae2b3529362a372e363c1ad9020e0e0c0003293b1ab7020c000303051a7f03025a293c1ac0020e0c00032c2a691ac6023b1aca020e0e0e0c00032a2a0e0e0e0c0002642c3c1a9e020e0e0e0c00032e2a691aa2023b1aa6020e0e0e0c00032a2a0e0e0e0c000264291a3b03691a3f032a691a42032a692f2a6927091a40032a693b3c3b3b2d68052a1aeb020c00021aed020e0e0c000250293b691a29032a691a2c032a693b3c3b3b2d6805270a0fd02b363c1a19020204f401f2010c000303051a13030fce2b3529353d1a11020e0e0c00036403051a06030fdb2b363c1aee010e0e0e0c000303051afb020fde2b3529353e1ae9010e0e0c00036407dd2b3529362d363c1adf010c00032a2a691ade023b1aea010e0e0e0c00032a2a0e0e0e0c00026429353b1ab5010e0e0c000303a12939291a40020e0c00021a41020e0e0c0002036729361a2d020e0e0c00021a2d020e0e0c000203502935353e1a7f010c000303392935362928281a71010e0e0c000303033c022329287b1a610102022c010e0e0c000303033c020f29285b1a4d01020218010e0e0c00036402013b1add010e0e0c000202013b02013b031f2a1a4402690202f6001a44022a691a47022a693b3e3c3b2d6805660203e0002a64020129293b691a3602020212002a691a35022a693b3c3b3b2d6805270902bf2b363c1ada000e0e0e0c000303051a1f0202ac2b3529362a372e363c1ad9000e0e0c0003293b1ab7000c000303051a0702025a293c1ac0000e0c00032c2a691abe013b1aca000e0e0e0c00032a2a0e0e0e0c0002642c3c1a9e000e0e0e0c00032e2a691aa2003b1aa6000e0e0e0c00032a2a0e0e0e0c000264291ac301691ac7012a691aca012a692f2a6927091ac8012a693b3c3b3b2d68052a1aeb000c00021aed000e0e0c000250293b691ab1012a691ab4012a693b3c3b3b2d6805270a42000000000000000060040000000000000000000000000000|@853,I234,@854,I251,I107,@856,@14317,I253,@856,@14312,@856,@14333,@877,@909,@869,@871,@872,@871,@872,@871,@872,@873,I105,I218,@871,@910,@854,@856,@869,@871,@872,@873,@871,@913,@854,@916,@854,@14319,@900,@901,@873,@871,@919,@854,@856,@869,@871,@872,@873,@871,@852| 852:O5|0,0,0,@423,@922 853:S12|7072696e742d707265747479 854:O2|3,@855 855:S3|2e2e2e 856:O2|@857,0 857:O2|3,@858 858:S4|2e2e2e29 859:O2|@860,@14333 860:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@862,@861| 861:D15,248|00802b363c1af8000e0c000303051af70002c82b35293b1af6000e0e0e0c00036403051af20002b32b363c1ad2000e0e0e0c000303051ae70002a02b3529352a362e363c1ae1000e0e0c0003293b1aaf000c000303051ad700025e5647362a3c1ac5000e0e0c00032d2a69642a0c0002642a3c1ab2000e0e0e0c00032c2a6956783b1ab3000c000356873656973756a7383b2c2c2c6b662a0e0c0002642a2a0e0e0c000264291a9700691a9b002a691a9e002a692f2a6927071a9c002a693b3c3b3b2d6805293b691a95002a691a98002a693b3c3b3b2d6805270a420e0e0e0e0000000000000000e8000000000000000000000000000000|@864,I234,@854,I251,@865,@854,I107,@856,I253,@869,@871,@872,@873,@871,@863| 862:S11|7072696e746c6973742829 863:O5|0,0,0,@423,@874 864:S10|7072696e742d6c697374 865:O5|0,0,0,@423,@866 866:O2|@867,0 867:O2|3,@868 868:S3|6e696c 869:O2|@870,0 870:O2|3,41 871:O3|1,1,0 872:O2|3,44 873:O2|3,40 874:O2|@875,0 875:O2|3,@876 876:S2|3a3a 877:O4|0,@878,3,1 878:O1|@879 879:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@880,@14334,I253| 880:S13|7072696e742d636f6e74657874 881:O1|@882 882:D47,784|00802b363c1a10030e0c000303051a0f030fca2b3529353b1a0d030e0e0c00036407d32b3529362d363c1a03030c0003293b1ae3020c000303051afb020fd12a362a3c1aea020e0e0e0c00032a2a691aee023b1af2020e0e0e0c00032a2a0e0e0e0c0002642d3c1aae020e0e0e0c000303051adb020fdb2e382e3c1ab2020e0e0e0c00032a2a691ab6023b1aba020e0e0e0c00032a2a0e0e0e0c000264313d1a76020e0e0e0c000303051aab0202d73235323c1a7a020e0e0e0c00032a2a691a9e023b1a82020e0e0e0c00032a2a0e0e0e0c000264220c3e1a3d02020211020e0e0c000303051a7f020282220d37220d3c1a3c02020216010e0c00032a2a691a3e023b1a42020e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1a0e020e0e0e0c00032a2a691a12023b1a16020e0e0e0c00032a2a0e0e0e0c000264291a2b02691a2f022a691a32022a6902024b001a31022a691a34022a69322a691a34022a691a37022a69270f1a38022a691a3b022a692c2a691a3b022a691a3e022a6927091a3f022a691a42022a692c2a691a42022a691a45022a6927091a46022a691a49022a692c2a691a49022a691a4c022a6927091a4d022a693b3c3b3b2d68052a1a48020e0c00021a49020e0e0c000203033b02013b0319291a4002691a44022a691a47022a693b3e3c3b2d680566020129293b691a3c022a691a3f022a693b3c3b3b2d6805270a0fdc2b363c1a04010e0c000303051a2b0202d12b3529362a372e363c1a05010e0e0c0003293b1ae3000c000303051a1302025a293c1aec000e0c00032c2a691a12013b1af6000e0e0e0c00032a2a0e0e0e0c0002642c3c1aca000e0e0e0c00032e2a691aee003b1ad2000e0e0e0c00032a2a0e0e0e0c000264291acf01691ad3012a691ad6012a692f2a6927091ad4012a693b3c3b3b2d68052a1a67010c00021a69010e0e0c000203033b02013b0319291a6001691a64012a691a67012a693b3e3c3b2d680566020129293b691a9c012a691a9f012a693b3c3b3b2d020204006805270b420e0e0e0e0e0e0e000000000000000000030000000000000000000000000000|@880,I234,@854,I251,I107,@884,@14317,I253,@884,@884,@14319,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,I105,I218,@900,@901,@873,@871,@902,@854,@856,@869,@871,@872,@873,@871,@883| 883:O5|0,0,0,@423,@906 884:O2|@885,0 885:O2|3,@886 886:S4|2e2e2e7d 887:O2|@888,0 888:O2|3,125 889:O2|3,@890 890:S15|7374617274506f736974696f6e203d 891:O2|3,@892 892:S11|73746172744c696e65203d 893:O2|3,@894 894:S6|66696c65203d 895:O2|3,@896 896:S13|656e64506f736974696f6e203d 897:O2|3,@898 898:S9|656e644c696e65203d 899:O2|3,123 900:O2|@901,@869 901:O3|1,0,0 902:O5|0,0,0,@423,@903 903:O2|@904,0 904:O2|3,@905 905:S15|436f6e746578744c6f636174696f6e 906:O2|@907,0 907:O2|3,@908 908:S15|436f6e7465787450726f7065727479 909:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@853,I253| 910:O5|0,0,0,@423,@911 911:O2|@912,0 912:O2|3,@823 913:O5|0,0,0,@423,@914 914:O2|@915,0 915:O2|3,@831 916:O5|0,0,0,@423,@917 917:O2|@918,0 918:O2|3,@839 919:O5|0,0,0,@423,@920 920:O2|@921,0 921:O2|3,@767 922:O2|@923,0 923:O2|3,@843 924:O5|5,0,@926,@925,@423 925:O3|@926,@423,@927 926:S6|707265747479 927:O3|@929,@947,@928 928:O3|@948,@450,@449 929:O2|1,@930 930:O3|2,@816,@931 931:O2|@932,0 932:O4|@14321,69,@933,0 933:O3|2,4,@934 934:O6|@607,@583,@935,@815,@785,@581 935:O2|@627,@936 936:O2|@938,@937 937:O2|@944,@632 938:O2|@940,@939 939:O3|0,@942,@609 940:O2|1,@941 941:O2|2,18 942:O8|@542,@849,0,0,@943,0,0,1 943:O2|@474,@470 944:O2|@945,@588 945:O2|1,@946 946:O2|2,19 947:O4|1,@14335,0,0 948:S13|506f6c794d4c2e707265747479 949:O2|@951,@950 950:O2|@952,0 951:S14|736f757263654c6f636174696f6e 952:O4|@14310,69,@953,0 953:O7|@951,2,@955,@954,@423,0,0 954:O3|2,@956,@724 955:O2|3,3 956:O5|5,0,@958,@957,0 957:O3|@958,@423,@959 958:S4|756e6974 959:O3|@694,@961,@960 960:O3|@958,@450,@958 961:O3|2,0,@962 962:O3|3,0,@963 963:O3|0,0,1 964:O2|@966,@965 965:O2|@967,0 966:S7|50547265664964 967:O4|@14310,69,@968,0 968:O7|@966,@704,@970,@969,@423,0,0 969:O3|2,@501,@723 970:O2|1,@971 971:O3|14,@972,0 972:O2|@974,@973 973:O2|@978,@977 974:O2|7,@975 975:O8|@976,@966,0,0,@470,0,0,1 976:O4|13,11,@712,13 977:O2|@983,0 978:O2|7,@979 979:O8|@980,@966,0,0,@470,0,0,1 980:O3|14,@981,1 981:O2|@982,@718 982:O3|2,11,0 983:O2|7,@984 984:O8|@722,@966,0,0,@470,0,0,1 985:O2|@987,@986 986:O2|@988,0 987:S12|50547265666572656e636573 988:O4|@14310,69,@989,0 989:O7|@987,@704,@991,@990,@423,0,0 990:O3|2,@1020,@723 991:O2|1,@992 992:O3|14,@993,0 993:O2|@995,@994 994:O2|@999,@998 995:O2|7,@996 996:O8|@997,@987,0,0,@470,0,0,1 997:O4|13,10,@712,13 998:O2|@1011,0 999:O2|7,@1000 1000:O8|@1001,@987,0,0,@470,0,0,1 1001:O4|3,@551,@1002,1 1002:O2|7,@1003 1003:O8|@1005,@1004,0,0,@470,0,0,1 1004:S6|3c616e6f6e3e 1005:O3|14,@1006,1 1006:O2|@1008,@1007 1007:O2|@712,@1009 1008:O3|2,10,0 1009:O2|@1010,0 1010:O4|6,@472,1,0 1011:O2|7,@1012 1012:O8|@1013,@987,0,0,@470,0,0,1 1013:O4|3,@551,@1014,1 1014:O2|7,@1015 1015:O8|@1016,@1004,0,0,@470,0,0,1 1016:O3|14,@1017,0 1017:O2|@722,@1018 1018:O2|@1019,0 1019:O4|6,@472,2,1 1020:O3|3,@1021,@428 1021:O2|@1023,@1022 1022:O2|@1024,0 1023:O2|49,@426 1024:O2|50,@1025 1025:O5|5,@1027,@1028,@1026,@423 1026:O3|@1028,@423,@1029 1027:O2|@724,0 1028:S4|6c697374 1029:O3|@1031,@1155,@1030 1030:O3|@1028,@450,@449 1031:O2|1,@1032 1032:O3|2,@1034,@1033 1033:O2|@1046,0 1034:O4|@1036,@14333,@1041,@1035 1035:O1|@1044 1036:O1|@1037 1037:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@1039,@1038| 1038:D4,128|00812c2c2a2a1a7f000c000303033c02502a1a7b000c00021a7d000e0e0c0002033e291a6a000e0e0e0c00021a69000e0e0c000203272a352b362b352c365667352d2c2b0e0c000364030d2b2a2506250626041e4f3b02013b270402013b02013b65430e0e0e0e0e000000000000000070000000000000000000000000000000|@1040,I251,I105,I218| 1039:S13|65712d6c697374283229285029 1040:S10|65712d6c697374283229 1041:O1|@1042 1042:D1,32|00803e420e0e0e0e000000000000000010000000000000000000000000000000|@1043| 1043:S10|626f7865642d6c697374 1044:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@1045| 1045:S9|73697a652d6c697374 1046:O4|@14321,69,@1047,0 1047:O3|2,4,@1048 1048:O6|@607,@583,@1050,@1143,@1049,@581 1049:O12|@1145,@1148,@1150,@1147,@1146,@1153,@1144,@1036,@14333,@1041,@1035,@1034 1050:O2|@627,@1051 1051:O2|@1053,@1052 1052:O2|@1132,@1131 1053:O2|@1055,@1054 1054:O3|0,@1057,@609 1055:O2|1,@1056 1056:O2|2,6 1057:O8|@1059,@1039,0,0,@1058,0,0,1 1058:O2|@1124,0 1059:O2|7,@1060 1060:O8|@1062,@1040,0,@1123,@1061,0,10,1 1061:O2|@579,@573 1062:O3|0,@1064,@1063 1063:O2|@1119,@1118 1064:O4|1,@1066,@475,@1065 1065:O4|1,@1076,@1075,@542 1066:O4|3,@1067,@535,1 1067:O2|@1069,@1068 1068:O2|@1072,0 1069:O2|@1070,1 1070:O2|4,@1071 1071:O2|2,4 1072:O2|@1073,1 1073:O2|4,@1074 1074:O2|2,5 1075:O4|1,@1082,@1081,@542 1076:O4|3,@1077,@546,1 1077:O2|@1078,0 1078:O2|@1079,1 1079:O4|3,@1080,@550,1 1080:O2|@1069,0 1081:O3|10,@1087,@1086 1082:O4|3,@1083,@546,1 1083:O2|@1084,0 1084:O2|@1085,1 1085:O4|3,@1068,@550,1 1086:O4|1,@1100,@1099,@542 1087:O2|@1089,@1088 1088:O2|@1092,@1091 1089:O4|1,@578,6,@1090 1090:O4|6,@1070,0,1 1091:O2|@1095,@1094 1092:O4|1,@578,7,@1093 1093:O4|6,@1070,1,1 1094:O2|@1097,0 1095:O4|1,@578,8,@1096 1096:O4|6,@1073,0,1 1097:O4|1,@578,9,@1098 1098:O4|6,@1073,1,1 1099:O2|9,@1110 1100:O4|3,@1102,@1101,1 1101:O4|6,@1109,0,0 1102:O2|@1104,@1103 1103:O2|@1106,0 1104:O2|@1105,1 1105:O2|4,@1056 1106:O2|@1107,1 1107:O2|4,@1108 1108:O2|2,8 1109:O2|4,@474 1110:O2|@1112,@1111 1111:O2|@1115,0 1112:O2|@1113,1 1113:O2|4,@1114 1114:O2|2,7 1115:O2|@1116,1 1116:O2|4,@1117 1117:O2|2,9 1118:O2|@1121,0 1119:O2|@1120,1 1120:O3|@580,4,@472 1121:O2|@1122,1 1122:O3|@580,5,@540 1123:O2|@473,0 1124:O2|1,@1125 1125:O2|@1126,0 1126:O3|2,0,@1127 1127:O2|@1128,0 1128:O3|0,@578,@1129 1129:O2|@1105,@1130 1130:O2|@1107,0 1131:O2|@1135,@1134 1132:O2|@1133,@588 1133:O2|1,@1114 1134:O2|@1139,0 1135:O2|@1137,@1136 1136:O3|0,@1138,@609 1137:O2|1,@1108 1138:O8|@808,@1043,0,0,@470,0,0,1 1139:O2|@1141,@1140 1140:O3|0,@1142,@609 1141:O2|1,@1117 1142:O8|@475,@1045,0,0,@470,0,0,1 1143:O11|2,2,2,2,2,2,2,1,2,2,2 1144:O2|@1153,0 1145:O3|@1034,@1146,@1144 1146:O3|@1148,@1150,@1147 1147:O1|@1152 1148:O1|@1149 1149:D3,48|00802b1a32000e0e0e0c00021a31002c0e8000020e0e0e0e000000000000000020000000000000000000000000000000|@876,I105,I218| 1150:O1|@1151 1151:D1,40|00802b352c362a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@876| 1152:D1,40|00802b352c362a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@876| 1153:O1|@1154 1154:D2,40|00802b3b1a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@868,I251| 1155:O4|1,@14336,1,0 1156:O2|@905,@1157 1157:O2|@1158,0 1158:O4|@14310,69,@1159,0 1159:O7|@905,@1161,@1162,@1160,@423,0,0 1160:O3|2,@724,@1210 1161:O2|0,2 1162:O2|1,@1163 1163:O3|2,@1165,@1164 1164:O2|@1172,0 1165:O3|@1167,@1169,@1166 1166:O1|@1171 1167:O1|@1168 1168:D2,40|00802b353b1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@905,I251| 1169:O1|@1170 1170:D1,32|00803b2c69420e0e000000000000000010000000000000000000000000000000|@905| 1171:D1,32|00802b36420e0e0e000000000000000010000000000000000000000000000000|@905| 1172:O4|@14321,69,@1173,0 1173:O3|2,3,@1174 1174:O6|@607,@583,@1176,@1198,@1175,@581 1175:O12|@1200,@1167,@1169,@1166,@1165,@1203,@1205,@1202,@1201,@1208,@14334,@1199 1176:O2|@627,@1177 1177:O2|@1179,@1178 1178:O2|@1186,@1185 1179:O2|@1181,@1180 1180:O3|0,@1183,@609 1181:O2|1,@1182 1182:O2|2,0 1183:O8|@1184,@905,0,0,@794,0,0,1 1184:O4|13,0,@712,1 1185:O2|@1193,0 1186:O2|@1188,@1187 1187:O3|0,@1190,@609 1188:O2|1,@1189 1189:O2|2,1 1190:O8|@1191,@905,0,0,@805,0,0,1 1191:O3|14,@1192,1 1192:O2|@542,@718 1193:O2|@1195,@1194 1194:O3|0,@1197,@609 1195:O2|1,@1196 1196:O2|2,2 1197:O8|@722,@905,0,0,@805,0,0,1 1198:O11|2,2,2,2,2,2,2,2,2,1,2 1199:O4|@1208,@14334,3,1 1200:O3|@1199,@1165,@1201 1201:O3|@1203,@1205,@1202 1202:O1|@1207 1203:O1|@1204 1204:D2,40|00802b353c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@908,I251| 1205:O1|@1206 1206:D1,40|00802b352c363c2b2b6a65420e0e0e0e000000000000000018000000000000000000000000000000|@908| 1207:D1,40|00802b362c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@908| 1208:O1|@1209 1209:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@849| 1210:O5|5,0,@1212,@1211,@423 1211:O3|@1212,@423,@1213 1212:S7|636f6e74657874 1213:O3|@1215,@1226,@1214 1214:O3|@1227,@450,@449 1215:O2|1,@1216 1216:O3|2,@1199,@1217 1217:O2|@1218,0 1218:O4|@14321,69,@1219,0 1219:O3|2,4,@1220 1220:O6|@607,@583,@1221,@1198,@1175,@581 1221:O2|@627,@1222 1222:O2|@1224,@1223 1223:O2|@1225,@632 1224:O2|@1137,@939 1225:O2|@1141,@588 1226:O4|1,@14337,0,0 1227:S14|506f6c794d4c2e636f6e74657874 1228:O2|@1230,@1229 1229:O2|@1231,0 1230:S12|505466697273744368696c64 1231:O4|@14310,69,@1232,0 1232:O7|@1230,@704,@1234,@1233,@423,0,0 1233:O3|2,@1249,@723 1234:O2|1,@1235 1235:O3|14,@1236,0 1236:O2|@1238,@1237 1237:O2|@1242,@1241 1238:O2|7,@1239 1239:O8|@1240,@1230,0,0,@470,0,0,1 1240:O4|13,4,@712,13 1241:O2|@1247,0 1242:O2|7,@1243 1243:O8|@1244,@1230,0,0,@470,0,0,1 1244:O3|14,@1245,1 1245:O2|@1246,@718 1246:O3|2,4,0 1247:O2|7,@1248 1248:O8|@722,@1230,0,0,@470,0,0,1 1249:O3|2,@956,@1250 1250:O5|5,0,@1252,@1251,@423 1251:O3|@1252,@423,@1253 1252:S9|706172736554726565 1253:O3|@694,@1255,@1254 1254:O3|@1263,@450,@449 1255:O3|2,0,@1256 1256:O3|3,@1257,@428 1257:O2|@1259,@1258 1258:O2|@1260,0 1259:O2|49,@724 1260:O2|50,@1261 1261:O5|5,@1262,@1028,@1026,@423 1262:O2|@723,0 1263:S16|506f6c794d4c2e706172736554726565 1264:O2|@1266,@1265 1265:O2|@1267,0 1266:S13|50547374727563747572654174 1267:O4|@14310,69,@1268,0 1268:O7|@1266,@704,@1269,@703,@423,0,0 1269:O2|1,@1270 1270:O3|14,@1271,0 1271:O2|@1273,@1272 1272:O2|@1277,@1276 1273:O2|7,@1274 1274:O8|@1275,@1266,0,0,@470,0,0,1 1275:O4|13,12,@712,13 1276:O2|@1282,0 1277:O2|7,@1278 1278:O8|@1279,@1266,0,0,@470,0,0,1 1279:O3|14,@1280,1 1280:O2|@1281,@718 1281:O3|2,12,0 1282:O2|7,@1283 1283:O8|@722,@1266,0,0,@470,0,0,1 1284:O2|@1286,@1285 1285:O2|@1287,0 1286:S9|4e616d655370616365 1287:O4|@14325,69,@1288,0 1288:O4|@1286,@694,@1289,@423 1289:O6|@1291,I48,0,@423,@1290,0 1290:O1|@5679 1291:O4|1,@14339,@14340,@14338 1292:O1|@1293 1293:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 1294:O2|@5596,@5595 1295:O2|@1297,@1296 1296:O2|@1298,0 1297:S11|54797065436f6e73747273 1298:O4|@14325,69,@1299,0 1299:O4|@1297,@694,@1300,@423 1300:O6|@1302,I48,0,@423,@1301,0 1301:O1|@2159 1302:O4|1,@14343,@14344,@14342 1303:O1|@1304 1304:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 1305:O2|@2148,@2147 1306:O2|@1308,@1307 1307:O2|@1309,0 1308:S5|7072696e74 1309:O4|@14310,69,@1310,0 1310:O7|@1308,2,@1312,@1311,@423,0,0 1311:O3|2,@1826,@924 1312:O2|1,@1313 1313:O3|2,@1314,0 1314:O1|@1315 1315:D7,88|00802b352c362d37291a54000e0c00021a55000e0e0c0002031229351a51002a691a54002b692a2a696602031a51002c2c2b3b1a5200337b060700050e0e0e0e000000000000000048000000000000000000000000000000|@1317,I105,I218,@1318,@1320,@1321,@1316| 1316:O4|@1327,@1469,@1698,@1326 1317:S58|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065436f6e737472283129 1318:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 1319:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d616b6554797065456e76283129283129 1320:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 1321:O2|@1323,@1322 1322:O1|@1325 1323:O1|@1324 1324:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 1325:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 1326:O13|@1721,@1720,@14348,@14318,@502,@14352,@1672,@14354,@1682,@14356,@1690,@14323,@510 1327:D37,1112|00832e36293b1a57040c000307dd2f352937293629353d1a46040e0e0e0c000303c629362a372d35343b1a3b040c000303051a3b0402ae3b1a3d040e0e0c00022c220d2b56b80e0e0e0c00040402002c2a1a2c040e0c00035029363e2a69291a26040e0e0e0c000203041a2304103b503b5022103c1a20040e0c0003302a3022132213121300010001000e0e0e0c0006293b691a0a042a691a0d042a691a10042a692f2a69293b1ab6030e0e0e0c0003030333020b332a1afe030e0e0e0c00031afd032a691a00042a693b3e3b3b2d6805291ab3030c000203041ab303103b503b50292710660fcb3102026f013b1a77030c000303051ad7030fd52b37293629353d1a5b030c000303041acb03103b503b5029353b1a48030e0c00030322293729353c1a3a030e0e0e0c0003030d2936293b1aab030c0003640202293664020d2936293b1a99030e0e0c0003646503051a950302031a98033e2a69291a29030e0e0c000203041a2703103b503b502d37293629353c1ae8020e0c000303042937024529353b1ad8020e0c000303042936023529363b2a291aee020e0e0e0c00021a55030e0e0c0002031b29362b3c1a4f030202a4000c0003292b25042504511e293b6502012a66291a3d031a4203020287000e0e0e0c00033b1a9c020e0c00022a22102b56e80e0e0e0c000433350402002a2a1a8a020e0e0e0c00035029363e2a69291a82020e0e0e0c000203041a7f02103b503b50293b69293b1a42020e0e0e0c000303032e020b2e2a1aea020e0e0e0c00031ae9022a69220d2a693b3e3b3b2d6805291a40020e0c000203041a3f02103b503b50292711660fd62f3529352a36313b1a01020e0e0c000303051ab7020fd13b1a01020e0e0c00022c37293629353c1ada010e0e0e0c000303042937024129353b1ac8010e0c000303042936023129363b2a291ade010e0e0e0c00021a45020e0e0c0002031729362b3c1a3f020c0003292b25042504511e253b6502012a66291a59021a36020e0e0e0c0003291a54020e0c000228052a32343368052b22103156e80e0e0e0c000433350402002a2a1a7a010e0e0e0c00035029363e2a69291a72010e0e0e0c000203041a6f01103b503b50291a160269293b1a3001020206010e0c000303032e020f2e2a1a06020202f3000e0e0e0c00031a01022a691a04022a693b3b3b3b2d6805291a27010c000203041a2701103b503b5022193c1a24010e0c000322151a0b010c00021a75010e0e0c000203892215352216362a352b383c2b2b30121f0001000300221412210001000100221c222522251aaf010c000b2e3c1adf000c00032d2a121f0001000300221412210001000100221c222522251a91010e0e0c0009293b1a7f000c000303032b020b2b2a1a82010e0e0e0c00033b3d3c3b2d6805291a89000e0e0c000203041a8700103b503b5029270902031a6201293b692c2a693b3b3b3b2d6805291a61000e0e0c000203041a5f00103b503b5029271666641f040e0e0e000000000000000048040000000000000000000000000000|@1329,I251,I232,@854,@1330,@1357,I105,@1363,I107,@871,@1371,@871,@1372,@871,@1375,@854,@1377,I253,@1381,@1376,I218,I106,@1382,@1385,@1393,@871,@854,@1395,@1397,@1400,@1402,@1404,@1405,@1407,@1462,@1467,@1328| 1328:O2|3,I48 1329:S40|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d6170283429 1330:O1|@1331 1331:D6,88|00803c28403b1a57000c0004293b1a57001a5c000e0c0004503c28401a59001a3e000e0e0e0c00043c28403b1a31000e0e0c00041a49002a2c6a66420e0e0e0e000000000000000048000000000000000000000000000000|@1333,I11,@1334,I255,-1,@1332| 1332:D11,248|008056073b1af8000e0c000329291af7000c00021af9000e0e0c0002032429352a362a36293531352a2a1aeb000c00036603052a68010207292503511e2f3b6502013b64291ac0000e0c00021ac1000e0e0c000203072935293564027f56283b1a9d000e0e0c0003293c1ab3000c000356483b2b1ab1000e0e0c0004502f36293f1aac000e0c0003293b1a8b000c0003641a7c000e0c00026403051a9a000202282756583b1a58000e0c00031a91000e0e0c00022a2a1a8f000c000329336956873b1a3b000c00032a2a6956a73b2b1a56000e0e0e0c0004502c270865420e0e0000000000000000e8000000000000000000000000000000|@1353,I253,I105,I218,I251,I106,I255,I243,@1354,@1352,@122| 1333:S30|545950455f5452454528292e7661724e616d6553657175656e6365283129 1334:O1|@1335 1335:D18,224|00802b363c1ae0000e0c000303051adf0002b02b352c363c1add000e0e0c0003293b1ac3000c000303051ad30002722a362a3c1ac2000e0e0e0c00032a2a691ac6003b1aca000e0e0e0c00032a2a0e0e0e0c0002642e352e3c1a9c000e0c00032a2a691ab2003b1aa6000e0e0e0c00032a2a0e0e0e0c000264291aa300691aa7002a691aaa002a691aad002a691ab0002a69322a691ab0002a691ab3002a69270f1ab4002a693b3c3b3b2d6805293b691aad002a691ab0002a693b3c3b3b2d68052708420e0e0e0e0000000000000000d0000000000000000000000000000000|@1337,I234,@1338,I107,@884,@14346,I253,@14296,@887,@871,@1341,@871,@872,@871,@1343,@899,@871,@1336| 1336:O5|0,0,0,@1346,@1345 1337:S11|7072696e742d6e616d6573 1338:O2|3,@148 1339:O1|@1340 1340:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 1341:O2|3,@1342 1342:S6|6e616d65203d 1343:O2|3,@1344 1344:S7|656e747279203d 1345:O2|@1350,0 1346:O2|@1347,0 1347:O2|0,@1348 1348:O5|@1349,1124,1124,0,0 1349:S32|6d6c736f757263652f4d4c436f6d70696c65722f545950455f545245452e4d4c 1350:O2|3,@1351 1351:S5|4e616d6573 1352:O1|@1355 1353:S33|545950455f5452454528292e7661724e616d6553657175656e6365283129283129 1354:S2|2727 1355:D14,224|00802b281a1ae0000e0c000303402b3b1ad5000e0e0c0003293c1ad3000c000303032c020b2c28191acd000e0e0c000329281a1aca000e0e0e0c0003293c1ab7000c0003661ac0000e0c000202031abf002c281a1ac1000e0e0c0003293b1abf000c000303033c0214293b1a7a000e0e0e0c00033c2a1a77000c000364030329020a29281a1aa0000e0c00032928611a96000e0e0e0c0003293b1a93000c000303033c020b2928ff1a8d000e0e0c000303041a8b00103b502c2a1a8b00310e0e7e0700030e0e0e0e0000000000000000d0000000000000000000000000000000|@1356,I231,I251,I107,I109,@1352,I48,I110,I113,I106,I234,I233,@118,@122| 1356:S40|545950455f5452454528292e7661724e616d6553657175656e63652831292831296e616d65283129 1357:O1|@1358 1358:D11,312|00812c1a3a010e0e0e0c00023b2a1a37010c00030402002a293b1a33010c00030311293b326a3b2e336a2c2b452a4626030279293c1a20010e0c0003311a20010e0c000203033102142928081af9000e0e0c0003322a1a0f010c00036429282e1aed000e0e0c00031a05010e0e0c000265030f293c1ae0000e0c000325011e66022a293b1ad1000e0e0c00033b2a336a2e3b1ab3000c0003292d1abb000c00032d2a220d6a2f2d452a4626065029352a362a36293b1a98000e0c0003640309301ab50045324602542a352b362c370403003c2c1aaa000e0e0e0c0003030a292d453b462b475002102b3c1a6b000c00032a2e452a462c475129352a362b372b2b2b1a84000e0c00043135323633371a77000c000422102b452a4627092705430e000000000000000028010000000000000000000000000000|@1360,I223,I239,I251,I240,I105,I252,I218,I48,I233,@1359| 1359:O1|@1361 1360:S27|5554494c49544945535f28292e73706c6974537472696e67283129 1361:D15,232|00822b1aea000e0e0e0c00022e3b1ae7000c0003030c2d2a1add000e0e0c000302013b03032c02a02d3b1acb000c000303051acb0002912d3c1abc000e0c000303162e28081ac0000e0c00032d2a1abf002f0e0e7e0700032d28101aaa000e0e0e0c0003293c1aaf000c00032928081aae000e0e0e0c0003291aac001ab1000e0e0c000303041aaf00103b502928413b1aad000e0e0c000429321aab000c0003502808331a61000e0e0c0003312a2c2808220d1a9a000e0e0e0c0006502a1a97000c0002502a270564440e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@1362,I223,I251,I48,I239,I252,I240,I241,72057594037927935,I247,@124,I11,I151,I198,I47| 1362:S19|537562737472696e672e737472696e67283129 1363:O4|@14347,@1368,@1369,@1364 1364:O5|@1370,111,0,111,0 1365:O1|@1366 1366:O1|@1367 1367:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@595,@14296,I253| 1368:S4|43617374 1369:S9|746f41646472657373 1370:S35|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f416464726573732e4d4c 1371:O2|3,61 1372:O1|@1373 1373:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1372| 1374:S15|4c6973742e40283229617070283129 1375:O2|3,@1376 1376:S4|74797065 1377:O4|@14322,@596,@1379,@1378 1378:O5|@1380,345,0,345,0 1379:S18|6973457175616c6974793a2054797065466e 1380:S34|6d6c736f757263652f4d4c436f6d70696c65722f5354525543545f56414c532e4d4c 1381:S6|657174797065 1382:O1|@1383 1383:D4,48|00803c28401a30001a35000e0e0c0004291a34006964420e000000000000000020000000000000000000000000000000|@1384,@588,I11,79992| 1384:S28|545950455f5452454528292e74635479706556617273283129283129 1385:O1|@1386 1386:D13,240|00812c3b1af1000e0e0c000303041aef00103b502c1af0001af5000e0e0c000303041af300103b502c3c1af3000c00032928403b1af1000e0e0c0004293b301aee000e0e0e0c0004503b2f2a1ae9000e0e0c000303043b50022c292f0e0c00022a3c1abb000c00032c2a2c1ac2000e0e0e0c0004502b3c1aa6000e0e0e0c00032503511e395150293b1ab4000e0c00033b2a293b1ab1000e0e0c000303032a0233293c1aaa000e0e0e0c00032a3c1a9f000c0003293c1a67000c00032f2a1a7f000c0003292f69292e2507250726051e3d3b27052705430e0000000000000000e0000000000000000000000000000000|@1388,I234,@1389,72057594037927934,I231,@1387,I106,I11,I255,I232,I253,I251,I240| 1387:O4|4,@127,0,@1392 1388:S16|4c6973742e746162756c617465283229 1389:O4|4,@127,0,@1390 1390:O5|@1391,175,0,175,0 1391:S17|2e2f62617369732f41727261792e736d6c 1392:O5|@1391,123,0,123,0 1393:O1|@1394 1394:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1393| 1395:O1|@1396 1396:D4,48|00803c28401a30001a35000e0e0c0004291a34006964420e000000000000000020000000000000000000000000000000|@1384,@588,I11,79992| 1397:O1|@1398 1398:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@1397| 1399:S13|4c6973742e6d61702832292829 1400:O2|@871,@1401 1401:O2|@1371,0 1402:O1|@1403 1403:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1402| 1404:O3|1,1,2 1405:O2|3,@1406 1406:S8|6461746174797065 1407:O1|@1408 1408:D18,392|0089040200331a87012b1a8b010c00045029352a36291a87010c0002220f03033d02013b3c3c2b6a291a7c010e0c000203041a7b01103b503b502d353d1a78010e0c000303c22d362e3729220f22110e0e0c0003221403051a650102031a680122123b1a6a010e0e0e0c000303051a6701021d3e221569291a2d010e0e0c000203041a2b01103b503b50291a520169642a2a693b3b3b3b2d6805291a0a010e0e0e0c000203041a0701103b503b5022153b1a34010e0c0003032522153c1a30010e0c0003302a22142214221422180e0e0e0c0006293b691a1e012a696602013b2a2a693b3b3b3b2d6805291aba000e0e0e0c000203041ab700103b503b50293b69342a69270b025e221103051af10002031af400220f3b1ab6000e0e0e0c000303051aeb00020222113e2a69291a78000e0c000203041a7700103b503b50293b692c2a693b3b3b3b2d6805291a59000e0e0c000203041a5700103b503b50293b69302a69270727061f0a0e0e0e0e0e0e000000000000000078010000000000000000000000000000|@1410,@1411,@1414,@1450,I105,@1363,I251,@1452,@1409,I232,@1453,@1454,I233,I107,@1456,@1452,@1409,@855| 1409:O5|0,0,0,0,@1459 1410:S53|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e737472283429 1411:O1|@1412 1412:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 1413:S39|545950455f5452454528292e67656e6572616c6973652831296e65774d617463687c742d283129 1414:O1|@1415 1415:D6,72|00823c28403b1a47000c00041a49002a2f6a2f2a1a49001a4e000e0e0e0c00042b3b1a4b000c00032f2b452a46270444000000000000000038000000000000000000000000000000|@1417,I11,@1418,@1429,@1416,I253| 1416:O1|@1432 1417:S30|545950455f5452454528292e67656e6572616c6973655479706573283229 1418:D14,200|00802b3528061ac7000c0003039b2b362c37293e1ac1000e0e0c0003293b1abf000c0003030c1abf002a1ac3000c0003020129291b0f271abe000e0e0e0c0003651abc000e0c000203032d02592d563756481ab3000c00042b3b1ab3000c000329353e1a6a000e0e0e0c000303342a3528061a5b000c000303043b5002041a9700102a362a2f1a97001a9c000e0c00042a3b2b1a9a000e0e0e0c0004503b260302023b502a656502012b420e0e0e0e0e0000000000000000b8000000000000000000000000000000|@1420,I251,I216,I234,@410,I106,I113,I218,@1421,I253,@1423,@1419,@1416,I255| 1419:O1|@1427 1420:S44|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129 1421:O1|@1422 1422:D12,328|00822d3528061a47010c000303043b5002041a4301102d362e372a2a692f3b1a3e010e0e0e0c000329291a3b010c00021a3d010e0e0c0002032429352a362a36293529321a09010e0e0c00036503052a68010207292503511e2f3b6502013b64293b1aeb000c000303b92b310e0c0002293b1adb000c000303a42d3f1af9000e0e0c0003293b1ac7000c0003641ae0000e0c00022e3c1adf000c0003293b1aaf000c0003641ac8000e0c00023c28401ace001ad3000c00042b03033f02013b1ace002a1ad2000e0e0e0c0003293b1ac7000c0003292e1abf000c000328062e2b6a220d3b1a79000e0e0c00032f3b2b1aae000e0e0e0c0004502a220d6922133b1a5d000e0e0c00032a2a6922153b2b1a8e000e0e0e0c0004502d270c0202293564020529352935642705440e0e0e0e0e000000000000000038010000000000000000000000000000|@1424,I251,@1423,I253,I105,I218,I243,@588,I11,79992,I242,I255| 1423:O4|101,@1426,0,@1425 1424:S36|545950455f5452454528292e67656e6572616c6973655479706573283229747673283129 1425:O5|@1349,90,0,90,0 1426:S5|4d61746368 1427:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1428| 1428:S47|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129283129 1429:O1|@1430 1430:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1431| 1431:S40|545950455f5452454528292e67656e6572616c6973655479706573283229636f706965642d283129 1432:D9,272|00822d1a12010e0e0e0c000229353f1a0e010e0e0e0c000303041a0b01103b5029350a060019001e00470023000e0087000e00292e2d0e0e7d06000202b41aef0002af1af20002aa29362a372a1af00031311af3000c0005292c1ac3000c000303032c02043e2a2c6a66028629362a372a30301aca000e0e0e0c00042a31311abe000e0e0e0c00042a2d1a93000c0003030c292c1a89000e0e0c000302013b03032d02043d2b2b6a2704024629362a382b392b1a8a0032321a95000e0e0c00052b310e0e0e0c000229352b2f1a51000e0e0c0003030c2a2e1a45000e0e0c000302013b03032f020828052c2b2d306805270664440e0e0e0e000000000000000000010000000000000000000000000000|@1434,@1435,I251,@1441,@1444,@588,@1416,@1445,@1433| 1433:O1|@1448 1434:S23|545950455f5452454528292e636f707954797065283329 1435:O1|@1436 1436:D10,448|00802b3528061abf010c000307d82b362c372a3b1ab9010e0e0c0003291ab8010e0c00022a2a1a9f010c000303043b50020d2c3b2b1aa8010e0c0004503b5029353f1a83010c000303032f0fd929353e1a75010e0e0c000307ce29362a373b2b291a84010e0c00021a85010e0e0c0002031729362b3c1a7f010c0003292b25042504511e233b6502012a652a29353b1a36010e0e0e0c00030304293602122936293b1a2b010c0003292503511e203b65643b2a291a31010e0e0c00021a31010e0e0c0002031729362b3c1a2b010c0003292b25042504511e243b6502012a652b2a1a1c010202be000e0c000366032e2929353b1ad2000e0e0e0c00030304293702122936293b1ac7000c0003292503511e203b656403032b02013102732929353b1aa40002047a0069000e0e0e0c00030304293602122936293b1a93000c0003292503511e263b6564292c301ab9000e0e0c00043e2a2d6a313b2b1a82000e0e0e0c0004502c29353b1a5c000e0c00030304293702122936293b1a53000c0003292503511e1e3b65640303290201346665020f29353c1a2f000c000303032f020129270402012b420000000000000000b0010000000000000000000000000000|@1438,I251,I253,@1435,I255,I105,I218,I106,I113,@1437| 1437:O1|@1439 1438:S23|545950455f5452454528292e6576656e7475616c283129 1439:D21,704|00822d1ac2020e0e0e0c00021ac1020e0e0c000207d22d352e362e1aaa020e0e0e0c00021aa9020e0e0c000207cc2e352f362a352d1aa0020e0c00022a1a98020e0c00022a2a1a97020c000365036f2d2a1a94020e0c000303033c024a2d1a67020c00021a69020e0e0c00020314291a56020e0e0e0c00021a55020e0e0c000202013b03212d3b2b3b28082e1a49020e0e0c00021a59020e0e0c00031a59020e0e0c000602013b03033b02102d2a1a4f020c000303051a4f0202013c02232d1a16020e0e0e0c00022a1a0c020e0c00022a2a1a3b020c00036503051a2a0202013c293b1afa010202ae010e0e0e0c000303142d2c331a20020202e8000e0c00042d2a69640fd0293b1a05020e0e0c000303b9313e1a09020e0e0c0003293b1aef010c0003030c1aff012a1a03020c0003020129333f1a00020e0c0003293b1aa7010c0003641a88010e0c0002343c1ae7010c0003293b1a8f010c0003641a70010e0c00023c28401ad6011adb010c00042c1a54010e0c000203032c02072c1acf010c0002293e1acf010c00032d03033f02013b2a2a1ac8010e0c0003293b1abf010c000329301ab7010c00032806302b6a22112a692211221722171a5a010e0e0e0c00042a2a69270e02152e2e69292d341a4401020208000e0c00042e2a6965270402b12d3e1a37010c0003293b1a1f010c0003030c1a2f012a1a33010c00030201292f3f1a30010e0c0003293b1ad7000c0003641ab8000e0c0002303c1a17010c0003293b1abf000c0003641aa0000e0c00023c28401a06011a0b010c00042c1a84000e0c000203032c02072c1aff000c0002293e1aff000c00032d03033f02013b2a2a1af8000e0c0003293b1aef000c000329301ae7000c00032806302b6a220d2a69220d3b22131a8b000c00042a2a69270e65020e2c3b1a4b000c000303033b02012c440e0000000000000000b0020000000000000000000000000000|@1440,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,@1437,I216,@410,I106,I243,@588,I11,I152,I245,I242| 1440:S39|545950455f5452454528292e6576656e7475616c283129616464546f496e7374616e6365283229 1441:O4|@14322,@596,@1443,@1442 1442:O5|@1349,708,0,708,0 1443:S27|636f7079547970653a204f7665726c6f616453657420666f756e64 1444:O1|0 1445:O1|@1446 1446:D5,120|00832e1a7a000e0e0e0c00021a79000e0e0c000203452e352f362a352b36293131340e0e0e0c00042c3333331a61000e0e0c00052a2c1a5f000c0003030c292e1a55000e0e0c000302013b03033402072c2b69292b6964270602013b1f040e0e000000000000000068000000000000000000000000000000|@1447,I105,I218,@1445,I251| 1447:S40|545950455f5452454528292e636f707954797065283329636f70795265636f72644c697374283129 1448:D5,112|00832e1a72000e0e0e0c00021a71000e0e0c0002033d2e352f362a2f2f320e0e0e0c00042a3131311a5d000e0e0c00052a2d1a5b000c0003030c292c1a51000e0e0c000302013b03033202032a2a69270402013b1f040e0e000000000000000060000000000000000000000000000000|@1449,I105,I218,@1433,I251| 1449:S34|545950455f5452454528292e636f707954797065283329636f70794c697374283129 1450:O1|@1451 1451:D6,136|00802b1a8a000e0e0e0c00021a89000e0e0c000203512b352c362a352b362936293f1a7b000c0003293b1a7b000c0003641a64000e0c00022b36293c1a61000e0e0c0003293b1a5f000c0003641a48000e0c00022e2c2b6a301a54000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,I243,I251,@1450| 1452:O3|1,0,2 1453:O2|@854,0 1454:O2|@1456,@1455 1455:O2|@1457,0 1456:O3|1,1,4 1457:O2|3,@1458 1458:S2|6f66 1459:O2|@1461,@1460 1460:O2|@1404,0 1461:O2|3,124 1462:O1|@1463 1463:D9,160|0087321aa2000e0e0e0c00021aa1000e0e0c0002036b32353336333b1a99000e0e0c000303033b02552a352b383b2b2b220f220f220f220f220f220f220f1a7f000c000b220d3c1a7e000e0e0e0c00032d2a220f220f220f220f220f220f1a6f000c0009293b1a6f000c000303032b020b2b2a1a6a00340e7e11000327056502013b1f080e0e0e0e000000000000000090000000000000000000000000000000|@1465,I105,I218,I234,@1407,I107,@1462,I251,@1464| 1464:O1|@1466 1465:S57|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e73747252657374283229 1466:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1464| 1467:O1|@1468 1468:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1467| 1469:O12|@1470,@14318,@502,@14352,@1672,@14354,@1682,@14356,@1690,@14323,@510,@14348 1470:D2,80|00842f2f562756385649565a566b567c568d569e56af120c0001000a00120d0001000b00220f221122131a2b0022127b120700110e0e0e0e000000000000000040000000000000000000000000000000|@1472,@1471| 1471:O1|@1473 1472:S20|545950455f5452454528292e7444697370283529 1473:D46,2272|008f22111ae1080e0e0c000229350a06007b008000e303930285000f050e0029362a372a2a692b3b1ac5080e0e0c000329353c1ac2080e0e0e0c000303202a310e0c00023e2a69291ab5080e0e0c000203041ab308103b503b502965022a292216221622162216221622162216221622162216221622162216221622161a900822170e7b1217001127040fd11a89080fce1a8c080fcb2936293b1a5b080c000303051a83080fd029293b1a4b080c000303033b023529352a362a37293629353c1a35080e0e0c00036403102936293622172a1a23080c00036502013b6403033c0207292503511e3e3b65640306221068010fd429293b1aff070c000303033b023529352a362a37293629353c1ae9070e0e0c00036403102936293622152a1ad7070c00036502013b6403033c0207292503511e3e3b65640306220e68010fd829293b1ab3070c000303033b024129352a362a37293629353c1a9d0702065f075d075b070e0e0c00036403142936293622132a1a8307020228010c00036502013b6403033c0207292503511e4a3b65640306220c680102a029293b1a5b070c000303033b023929352a362a37293629353c1a45070e0e0c00036403142936293622112a1a330702026e000c00036502013b6403033c0207292503511e423b65640305336801025129293b1a0c070e0c000303033b023929352a362a37293629353c1af5060e0e0c000364031429362936220f2a1ae30602021e000c00036502013b6403033c0207292503511e433b6564030531680102013b293b1abc060e0c000303282a1aea060e0e0e0c00023b3b3b3b2d6805291aa9060e0e0c000203041aa706103b503b50296502362935293528053b2b2d3b6805292217221722172217221722172217221722172217221722172217221722171a780622180e7b1218001164640fcf29362a3722133b1a8a060e0e0e0c000303051a87060fd32b1a89060e0e0c000203542a1a86060e0e0e0c0002282a22152b1a3806221722172217221722172217221722172217221722172217221722171a61060e0e0c00133b3b3b3b2d6805291af9050e0e0c000203041af705103b503b50296602d72a1a42061a47060c000322143c1a46060e0e0e0c0003292b1adb05221722172217221722172217221722172217221722172217221722171a24060e0c00122c29353b1a99050e0e0c00030304293702162936293b1a7f05020249050c0003292503511e233b65640304287d02172d3b1a6c05020261000e0c000303051ae70502031aea053e2a69291a5b050c000203041a5b05103b503b50293b69293b1a3e050e0e0e0c000303032c020b2c2a1ac6050e0e0e0c00031ac5052a693b3d3b3b2d6805291a20050e0c000203041a1f05103b503b50292709650fdc29362a3722133b1a3a050e0e0e0c000303051a97050fdc2a1ad9040e0e0c000229353d1ade040e0e0e0c0003036522143c1a10050e0c000303051a7705025222143c1a37050c00032a2a221622162216221622162216221622162216221622162216221622161ab3040c0011291a4c05691a50052a693b3b3b3b2d6805291a8b040c000203041a8b04103b503b50292705022e22143c1ae3040c00032a2a221622162216221622162216221622162216221622162216221622161a5f040c00116422153c1ab5040e0e0c00032c2a2217221722172217221722170202ec03221722172217221722172217221722171a2b04020234000c0011293b691ace042a691ad1042a691ad4042a692f2a693b3b3b3b2d6805291af4030e0c000203041af303103b503b5029270a650fcd29362a372b382937293629353c1ac8030e0c00036403102936293629220d1ab7030c00036502013b6403032a020229353c28403b1a81040e0e0c0004293b1a7f041a84040e0c0004500402002b3b2b220e30220f1a79040e0e0c00075029352a36293b1a72030e0e0e0c000303032a02ce2e37220e1a68030e0c00021a59040e0e0c00020311293629353b1a4a030e0e0e0c00036402013b0313220e352a362938292c0e0e0c00023735660203293735291a2c041a21030e0e0c000303033c0226291a1b030c00021a0d040202cf020e0e0c00020310293b1a05043b28081a07040c000602013b03162b3c1aea020e0e0e0c00030306283f2d6902012c023f0402002a3b2b2213220c22141ac2030e0e0e0c00075029352a36293b1aba020e0e0e0c000303032a02142e3c1aaa020e0e0e0c00030306283f306902012f6665291a9d020e0e0c00021a8d030e0e0c0002032929352a36293b1a7d020e0e0c000303032a0213291a87030c00022b2a69641a85030e0e0c00026502031a62033037293629353c1a50020e0c0003640310293629362922141a3f020c00036502013b6403033b027c303629291a33020c00021a25030e0e0c0002031f29352a362a353b1a14020e0c000303052a68010207292503511e2a3b6502013b64291a01020e0e0c00021af1020e0e0c00020311293529353b1ae2010e0e0e0c00036402013b031e293529363b2a69291ad3010c000203041aeb02103b503b50293b696602013b653e2b69291ab7010c000203041ab701103b503b50293b693b3b3b2e2d6805291a9c010e0c000203041a9b01103b503b50220d1a89010e0e0c00021a79020e0e0c000207cc220d35220e362a1a58010e0c00022a1a68010e0c00021a59020e0e0c00021a51020e0e0c00020324291a96010e0e0e0c000203033c020b29353d1a35010e0e0c00031a2d020e0e0c000202013b033222223c1a95010e0e0c00032a2a222422242224222422242224222422242224222422242224222422241a0f010c001164028a22223c1a2b010c000303051a1302027a22223c1a53010c0003282c2a22131ae800222622262226222622262226222622262226222622262226222622261a11010e0e0c0013291ae001020267000e0c0002293b1a9b000c000303051ad301020d1ace012a1ad2010e0e0e0c00033b3b3b3b2d6805291a81000e0e0c000203041a7f00103b503b502927052d3b691ab1012a692b2a693b3b3b3b2d6805291a59000e0e0c000203041a5700103b503b50292708020129270e641f100e0e0e0e0e0e0e0000000000000000d0080000000000000000000000000000|@1475,@1435,I253,I251,I105,@1363,@1471,@1476,@1478,@1478,@1480,I232,@854,@1484,@1487,@1489,@1492,@1497,I107,@1507,@886,@1516,@1517,@899,@854,@854,@869,@873,@1404,@1519,@1404,I11,@1521,I255,@1539,I218,I48,I154,@1664,@104,@1363,@854,@1667,@1669,@1474,@871| 1474:O1|@1671 1475:S28|545950455f5452454528292e74446973702835296469737050283229 1476:O2|3,@1477 1477:S3|626164 1478:O2|3,@1479 1479:S7|6e6f2074797065 1480:O1|@1481 1481:D9,448|00802b1ac2010e0e0e0c00021ac1010e0e0c000207ca2b352c36293b1ab9010e0e0c000303b12a3629291a9b010c00021a9d010e0e0c0002031f29352a362a353b1a94010e0c000303052a68010207292503511e2a3b6502013b64291a69010e0e0c00021a69010e0e0c00020311293529353b1a62010e0e0e0c00036402013b031c293529363b2a69291a3b010c000203041a4b01103b50293b696602013b2d353e2a69291a20010e0c000203041a3701103b50293b693b3b3b2f2d6805291a06010e0e0e0c000203041a1b01103b50293b69270702c82a3629291aea000202c0000e0e0e0c00021ae5000e0e0c0002031f29352a362a353b1adc000e0c000303052a68010207292503511e313b6502013b64291ab1000e0e0c00021ab1000e0e0c00020311293529353b1aaa000e0e0e0c00036402013b031c293529363b2a69291a83000c000203041a9300103b50293b696602013b2d353e2a69291a68000e0c000203041a7f00103b50293b693b3b3b2f2d6805291a4e000e0e0e0c000203041a6300103b50301a64000e0c00021a65002a691a68002a692c2a69270a6502013b420e0e0e0e0000000000000000b0010000000000000000000000000000|@1483,I105,I218,I251,@1363,@1363,@1480,@1482,@901| 1482:O2|3,47 1483:S42|545950455f5452454528292e744469737028352964697370502832297072696e745443636f6e73283129 1484:O1|@1485 1485:D10,288|00802b353e1a20010e0c0003032d2b36291a1c010e0c00021a1d010e0e0c000203152936291a08010e0c00021a09010e0e0c00026402013b6402013b03c82b362c372929353b1adf000c00030304293702122936293b1ae7000c0003292503511e1d3b6564039b3c2b291ac3000c00021ac5000e0e0c0002038429352a362a352d3c1ac3000c00032a2a1a9b000c000303033c024a2a1a97000c00021a99000e0e0c00020314291a86000e0e0e0c00021a85000e0e0c000202013b03212a3b2b3b28082e1a89000e0e0c00021a89000e0e0c00031a89000e0e0c000602013b6403182d3c1a81000e0e0c0003292c2506250626041e8b3b6402013b6602013c6502013b6502013b42000000000000000010010000000000000000000000000000|@1486,I251,I105,I218,I253,@243,I223,I239,I154,I106| 1486:S28|545950455f5452454528292e697350726f6475637454797065283129 1487:O1|@1488 1488:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a362a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@1487| 1489:O1|@1490 1490:D15,656|009122111a91020e0e0c00021a91020e0e0c000207d0221135221236293b1a87020c000303cd2a1a86020e0e0e0c00022216282a1a71020e0e0c0003031829353d1a64020e0c000303033c0207291a67020c000202013b036a22153c1a61020e0e0c000303051a5f02025222153c1a5f020c00032a2a2215221522152215221522152215221522152215221522152215221522240e0c0011291a3c02691a40022a693b3b3b3b2d6805291aeb010c000203041a3302103b503b50292705293b6964022d292216221422142214221422142214221422142214221422142214221422142223020289010e0c0011293b6964640fcb22143b1ac7010c000303051aef010fca2a1aa9010e0e0c00022216282a1a95010e0e0c0003031829353d1a88010e0c000303033c0207291a8b010c000202013b036622153c1a85010e0e0c000303051a8301025222153c1a83010c00032a2a2215221522152215221522152215221522152215221522152215221522240e0c0011291a6001691a64012a693b3b3b3b2d6805291a0f010c000203041a5701103b503b5029270502292922162214221422142214221422142214221422142214221422142214221422230202ae000e0c00112217282c1add0002029f000e0e0c00031ac9000e0e0c00023c2a3b6a291ab4000e0c000203041afb00103b503b503e221a69291a9e000e0e0e0c000203041ae300103b503b50293b692b2a692e2a693b3b3b3b2d6805291a7a000e0e0e0c000203041abf00103b503b50221d3c1a9c000e0c0003221f2a220c221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f1a9a000e0e0e0c00131a99002a692c2a69270c6502013b1f120e0e0e0e000000000000000080020000000000000000000000000000|@1491,I105,I218,I251,@1435,@1484,I232,@854,I107,@869,@873,@1363,@1453,@1489,@871| 1491:S41|545950455f5452454528292e744469737028352964697370502832297072657474794c697374283329 1492:O1|@1493 1493:D2,40|00802b351a29002a6964420e0e0e0e0e000000000000000018000000000000000000000000000000|@1495,@1494| 1494:D2,40|00802b3556172a1a26002e0e7e040003000000000000000018000000000000000000000000000000|@1496,I29| 1495:S45|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283129 1496:S48|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283229283129 1497:O1|@1498 1498:D2,40|00812c3b2d1a28002e0e0e7b05040004000000000000000018000000000000000000000000000000|@1500,@1499| 1499:O1|@1501 1500:S17|4d6973632e717569636b536f7274283229 1501:D6,128|00822d1a82000e0e0e0c00021a81000e0e0c0002034d2d352e36293b1a79000e0e0c000303052a2f6902352a2e0c00020402002b2a2c1a67000c00045029352a362a33331a61000e0e0c00042f2a692b2a220c1a5200220d0e0e0e7b050d00046502012c440e0e0e000000000000000070000000000000000000000000000000|@1503,I105,I218,I251,@1502,@1499| 1502:O1|@1504 1503:S22|4d6973632e717569636b536f72742832297173283229 1504:D5,112|00822d1a72000e0e0e0c00021a71000e0e0c000203362d352e362a2e0e0c00020402002b2a311a5f000c00045029352a362c030b2e2b69332a452b466402092e2a69332c452a46642706020b1a41002d2a35452a36466444000000000000000060000000000000000000000000000000|@1506,I105,I218,@1502,@1505| 1505:O2|0,0 1506:S19|4c6973742e706172746974696f6e2832292829 1507:O1|@1508 1508:D15,416|009022111aa1010e0e0c00021aa1010e0e0c000207d22211352212362a352b3622163b1a92010e0e0e0c000303051a8f010fca2a283a1a8f010c00033e2a69291a65010e0e0c000203041a8301103b503b5022183c1a80010e0c00032c2a2218221822182218221822182218221822182218221822182218221822270e0c0011293b691a5a012a692d2a69321a19010e0e0c00021a19010e0e0c00021a11010e0e0c000203033b02031a3c01293b1a3f010c000303032a020b2a2a1a3a010e0e0e0c00033b3b3b3b2d6805291ad9000e0e0c000203041af700103b503b50293b69220d1ac200020295000e0e0e0c00021abd000e0e0c00021ab50002027c000e0e0c000203033b023922213c1ac9000e0e0c000329220f2222222222222222222222222222222222222222222222222222222222221ac8000e0c00121ac9002a6965293b1aa9000e0e0c000303032a020b2a2a1aba000e0e0e0c00033b3b3b3b2d6805291a41000e0e0c000203041a5f00103b503b50293b69270e270402013b1f110e0e0e0e0e0e000000000000000090010000000000000000000000000000|@1510,I105,I218,I232,@1453,@122,@1363,I107,@871,@1511,I251,@1513,@1507,@871,@1509| 1509:O1|@1515 1510:S35|545950455f5452454528292e7444697370283529646973705028322970526563283229 1511:O2|@901,@1512 1512:O2|@872,0 1513:O1|@1514 1514:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1513| 1515:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1509| 1516:S6|2c202e2e2e7d 1517:O1|@1518 1518:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1517| 1519:O2|3,@1520 1520:S2|2d3e 1521:O1|@1522 1522:D9,128|00802b363c1a80000e0c000303051a7f0002532b35293b1a7e000e0e0e0c00036403051a7a00023e2b363c1a5a000e0e0e0c000303051a6f00022b2b35293c1a56000e0e0e0c00036403051a620002162b363c1a32000e0e0e0c000303051a570002031a5a00420e000000000000000070000000000000000000000000000000|@1524,I234,@1338,I251,@1525,@1338,@1532,@1338,@1523| 1523:O5|0,0,0,@1527,@1536 1524:S13|7072696e742d6973466f756e64 1525:O5|0,0,0,@1527,@1526 1526:O2|@1530,0 1527:O2|@1528,0 1528:O2|0,@1529 1529:O5|@1349,893,893,0,0 1530:O2|3,@1531 1531:S10|466f756e644d61746368 1532:O5|0,0,0,@1527,@1533 1533:O2|@1534,0 1534:O2|3,@1535 1535:S13|466f756e644e6f744d61746368 1536:O2|@1537,0 1537:O2|3,@1538 1538:S8|4e6f74466f756e64 1539:O1|@1540 1540:D9,224|0085301ae2001ae7000c000303033c0222301ae3000c00021ae5000e0e0c00020310303b1ac1003b28081adb000c000602013b03072e30453d460286040200312a1acc000e0c00035029352a362933692f2a33331ac1000e0e0c0005293d1a8f000c000303162c2b220c220c220c220c1aad00220d0e0e7b080d0007293c1a6f000c000303350402002d2c2b220d220d220d1a8b000c00075029352a36293b1a4e000e0e0e0c00030308220d2b452a460206220d2b453c46660205332b453b4627051f060e0e0e0e0000000000000000d0000000000000000000000000000000|@1542,I48,I251,I105,I218,I154,@1357,@1541,@1539| 1541:O1|@1543 1542:S41|545950455f5452454528292e744469737028352964697370502832296e616d65546f4c697374283229 1543:D14,296|00832d1a2a010e0e0e0c00021a29010e0e0c000207dd2d352e36293b1a21010e0e0c0003037130352b2a0e0e0e0c0002293b1a0b010c000303033d0257293529352a362a351a0001220c69040300220c2b1afc001af9003b2e1afc000e0c00075029371afa002e690403002e2b1ae0001add003b2e1ae0000e0c00075029372c2a1ae4000e0c000327071aab00330e0e7d0d000265027230362b2a0e0e0c0002293b1a9b000c000303033d025b2935293529372b362a352b39040d002b2a1aaf000c0003502923082a230c2e3b1a70000e0c000303032c02092e351a9a002e2b6a641a9b002a2d6a1a9d002b2d6a2a2a6902021700292210221622161a910022170e0e7b06170005656502013d1f040e000000000000000018010000000000000000000000000000|@1545,I105,I218,I251,@1546,@1548,@1551,@1570,@1553,@1571,@1642,@1661,@1544,@1541| 1544:D3,72|00802b56180c0002291a44000e0c00021a45000e0e0c0002030f2935562768012a2a692968016602013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1663,I105,I218| 1545:S39|545950455f5452454528292e7444697370283529646973705028322966696e6454797065283229 1546:D4,96|008056071a61000e0e0c00021a61000e0e0c000203112b3629353b1a5a000e0e0e0c00036402013b03155607352c362938292c0e0e0c0002296801270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1547,I105,I218,I251| 1547:S40|545950455f5452454528292e657154797065436f6e73747273283429636f70794964283129283129 1548:O1|@1549 1549:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1550| 1550:S33|545950455f5452454528292e657154797065436f6e737472732834296964283129 1551:O1|@1552 1552:D13,424|00853037293629353d1aa4010e0c0003035f29362a372c352d371a9b011aa001220e220d220d68052c1a9c012b1aa0010e0c00042d2a1a77010c0003030f220f342a35452a36462a3747640220220f35220d0e0e0e0c00023d302c6a2e2a2f6a221236220e2d452a462b47270427060fd82a320e0e0c0002291a5c010e0c00021a5d010e0e0c000207cf293534350402002a2a1a52010e0e0e0c000350293633291a34010e0c00021a35010e0e0c0002038e29352a362a3729311a33010c000364036b2a350402002a2a1a1b010c000350293629301ad8000e0c000303033c024a291af3000c00021af5000e0e0c000203142f1ae2000e0e0e0c00021ae1000e0e0c000202013b0321293b313b2808341ae5000e0e0c00021ae5000e0e0c00031ae5000e0e0c000602013b6602013b03052a68010207292503511e9a3b6502013b64293b1a6900020241000e0e0c0003031c220f35220d020224000e0e0c0002221036220c2b452a46304765020d2935342a35452a36462a3747642705020c332f2a35452a36462a37476464651f060e000000000000000098010000000000000000000000000000|@1554,I251,@1555,@1551,@1560,@1416,I105,I218,@1357,@1553,I223,I239,I154| 1553:O1|@1562 1554:S38|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529 1555:D2,64|00800403002c56281a3d005649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@1557,@1556| 1556:O1|@1558 1557:S53|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129 1558:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1559| 1559:S56|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129283129 1560:O1|@1561 1561:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1557| 1562:D5,208|00812c3629353d1ace000e0e0e0c000303112c3629353d1abe000e0e0e0c00036402013b6403192c3629372d3629372b2a1aac001ab100320e0e0e7b050800042c3629353c1a90000e0c000303112c3629353c1a82000e0e0e0c00036402013b6403152c3629362d3629362b2a1a6800310e0e0e7e0800032c3629353b1a58000e0c000303112c3629353b1a4a000e0e0e0c00036402013b6403152c3629382d3629382b2a1a4800310e0e0e7e0800033b430e0e0e0e0e0e0000000000000000c0000000000000000000000000000000|@1564,I251,@1553,@1563,I113| 1563:O2|@1566,@1565 1564:S27|545950455f5452454528292e657175616c54797065496473283229 1565:O2|@1568,@1563 1566:D5,456|00822d3528051ac7010c0003030c2c3528051abb010c000302013b037b2d362e382e362f382b372a372a2a330e0c00036503602c2b2a1a9f010c00021aa1010e0e0c0002033d2a352b362b1a8a010e0e0e0c00021a89010e0e0c000203212b352c362c2b220e220d0e0c0004030d2b2a2506250626041e413b02013b6502013b65020d293b1a4801330e0e0e7e0b00036502013b27040fcd2d353d1a32010e0e0e0c0003030c2c353d1a24010e0c000302013b03202d362e372e362f372c2b31300c0004030a2b2a3130327b050900043b27040fce2d353e1af5000e0e0c0003030c2c353e1ae8000e0c000302013b036b2d362e372e362f372b29353b1ad0000e0c00030304293702122936293b1ad7000c0003292503511e1e3b656403382929353b1aaa000e0e0e0c00030304293702122936293b1aaf000c0003292503511e203b6564030d2c2b315677320e0e7b050900043b02013b270402512d3528061a6d00020246000e0e0c0003030c2c3528061a5b000c000302013b030f2d362d362a2a1a4a002f0e7e0700032d353c1a3e000e0e0e0c000303122c353c1a30002d020208000e0e0e7e0500033b440e0e0000000000000000b8010000000000000000000000000000|@1567,I251,I105,I218,I253| 1567:S40|545950455f5452454528292e657175616c54797065496473283229657175616c5479706573283229 1568:D7,232|00822d1aea000e0e0e0c00021ae9000e0e0c000203a52d352e362e1ad2000e0e0e0c00021ad1000e0e0c000203892e352f362c352b352a2a1ac5000e0e0c000303033c024a2a1aa7000c00021aa9000e0e0c00020314291a96000e0e0e0c00021a95000e0e0c000202013b03212a3b2b3b28082e1a91000e0e0c00021a91000e0e0c00031a91000e0e0c000602013b6503212c362b362a2a3356970e0e0c000465030d2b2a3130320e0e0e7b050900043b02013b6502013b65020d2c3b1a40002d0e0e0e7e050003440e0e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@1569,I105,I218,I251,I223,I239,I154| 1569:S46|545950455f5452454528292e657175616c54797065496473283229657175616c5265636f72644c69737473283229 1570:D4,96|008056071a61000e0e0c00021a61000e0e0c000203112b3629353b1a5a000e0e0e0c00036402013b03155607352c362938292c0e0e0c0002296801270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1547,I105,I218,I251| 1571:O7|@1572,@14310,@14314,@14350,@14325,@14351,@14349 1572:D14,160|00811aa30056172e6a1aa40056282f6a1aa5005639306a1aa600564a316a1aa700565b326a1aa800566c336a1aa9003356876a1aaa003456986a1aab00220c56a96a1aab00220d56ba6a1aab00220e56cb6a1aab00220f56dc6a1aab0056d722116a220f2e452c4630472f483449324a220d4b2b4c220c24082a24092d240a31240b33240c270d43000000000000000090000000000000000000000000000000|@1574,@1575,@1591,@1592,@1593,@1594,@1595,@1596,@1618,@1621,@1624,@1627,@1630,@1573| 1573:D3,48|00801a330056176956183b2b1a31002f0e0e0e7b05040004000000000000000020000000000000000000000000000000|@1634,@1635,@1633| 1574:S24|5354525543545f56414c5328292e6d616b65456e76283129 1575:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1576:O4|101,@1589,0,@1588 1577:S31|5354525543545f56414c5328292e6d616b654c6f6f6b283129283129283129 1578:O1|@1579 1579:D5,104|00812c353b1a68000e0c000303162c362d372d2b0e0c00022a2f1a5b00300e7b050600042c362d382a3b1a53000c00032a3b1a4b000c00032f2b0e0e0e0c00022a311a4300320e7b050800040e0e0e0e000000000000000058000000000000000000000000000000|@1581,I251,@1582,I253,@1580| 1580:O1|@1585 1581:S20|486173685461626c652e68617368537562283229 1582:O1|@1583 1583:D14,256|00822d1a02010e0e0e0c00021a01010e0e0c000203033c02102c1afb000c00022e2a1afb000c00036403041afa00103b502c2e1afa000e0e0e0c0003291ac8000e0c00021ac9000e0e0c0002039529352a362e2b1ae1000e0e0c000303033c024a2e1aa3000c00021aa5000e0e0c000203142a1a92000e0e0e0c00021a91000e0e0c000202013b03212e3b2c3b28082f1aad000e0e0c00021aad000e0e0c00031aad000e0e0c000602013b0305296801022e303b1aa1000e0e0c0003030c2f1a56000e0e0e0c0002020130293c1a90000e0c00036430301a8e00317b050800046502013b64440e0e0000000000000000f0000000000000000000000000000000|@1584,I105,I218,I15,I247,@599,I253,I251,I223,I239,I154,I113,I107,@1582| 1584:S27|486173685461626c652e6861736853756228322966696e64283129 1585:D15,264|00822d3b1a09010e0e0c000303033c02142c3b1a02010e0e0e0c00032e2a1aff000c00036403041afe00103b502d3c1afe000e0e0e0c00032d2a1adb000c0003291af4000e0c00021af5000e0e0c0002039529352a362f2b1aed000e0e0c000303033c024a2f1acf000c00021ad1000e0e0c000203142a1abe000e0e0e0c00021abd000e0e0c000202013b03212f3b2c3b28082f1ab9000e0e0c00021ab9000e0e0c00031ab9000e0e0c000602013b0305296801022e313b1aad000e0e0c0003030c303b1a51000e0e0c0003020131293c1a9c000e0c00036431311a9a00327b050900046502013b65440e0e0e0e0e0e0000000000000000f8000000000000000000000000000000|@1584,I234,I253,I231,@1586,I106,I105,I218,I251,I223,I239,I154,I113,I107,@1580| 1586:O4|11,@49,0,@1587 1587:O5|@1391,143,0,143,0 1588:O5|@1590,56,0,56,0 1589:S5|4d61746368 1590:S20|2e2f62617369732f556e6976657273616c2e4d4c 1591:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1592:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1593:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1594:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1595:D6,144|008056082c1a90000e0c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a352956771a72000e0e0e0c000364031f2a3556671a62000e0e0e0c000303043b5002041a5b00102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@1577,@1578,I105,I218,I251,@1576| 1596:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1599,@1597| 1597:O1|@1602 1598:S32|5354525543545f56414c5328292e6d616b65456e746572283129283129283129 1599:O1|@1600 1600:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1599| 1601:S36|556e6976657273616c5461626c652e756e6976456e746572283429736561726368283129 1602:D24,480|00822d353c1ae0010e0c000303043b5002221adb012d1adf010c0003291ae0011ad5010e0e0c000328671adb012b1adf016b65102d362e372f38293b1ad9010e0e0c0003293b1acf010c00032d3b1ac7010c0003322a0e0e0e0c00023333692d2b2b1abb010c0004303b1aab010c0003293c1ab3010c0003323b2b1ab2010e0e0e0c000450323b1a8e010e0e0e0c00032928051aa2010e0e0e0c0003313f1a97010c00032a2a1a97010c00036607d32f3d1a84010e0c0003293b1a8b010c000303033c020b291a87011a8c010e0c000303041a8b01103b50293c1a4b010c00032928403b1a81010e0e0c0004293b2d1a3e010e0e0e0c0004501a74012c69220c3b2c1a2b010c000450220e3b2b1a20010e0c000450343b1afe000e0e0e0c0003293c1a53010c000329293b1a1a010e0e0e0c000303033b0286293b1a0a010e0e0e0c000303033c0214220e3b1ac9000e0e0c00032a2a1aff000c00036403041a1e01103b50293c1abe000e0e0e0c0003220f2a1aa2000e0e0e0c0003291a080102023f000e0c00021a05010e0e0c0002031a293529331aff000c0003312a2d1a7e000e0e0e0c0004260302023b502b3c1ac5000e0e0c00032503511e923b65270702013b270b440e0000000000000000d0010000000000000000000000000000|@1604,I251,@1605,@122,@1606,@140,@1607,I253,@1609,I106,I255,I108,I233,I234,72057594037927934,I231,@1603,I11,@406,I107,@1586,I105,I218,@407| 1603:O4|4,@127,0,@1617 1604:S20|486173685461626c652e68617368536574283329 1605:S34|417474656d707420746f2073657420612076616c75652077697468206e616d652028 1606:S24|2920696e20612066726f7a656e2068617368207461626c65 1607:O5|@1608,128,0,128,0 1608:S37|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f486173685461626c652e4d4c 1609:O1|@1610 1610:D4,72|00822b1a4a000e0e0e0c00021a49000e0e0c000203122b352d2f2b2f1a4100300e0e0e7b060600053b440e0e0e0e0e0e000000000000000038000000000000000000000000000000|@1612,I105,I218,@1611| 1611:O1|@1613 1612:S31|486173685461626c652e68617368536574283329656e746572546162283329 1613:D17,376|00832e3b1a79010e0e0c000303033c02142d3b1a72010e0e0e0c00032f2a1a6f010c00036403041a6e01103b502e3c1a6e010e0e0e0c00032e2a1a4b010c0003291a64010e0c00021a65010e0e0c000203ce293529301a5f010c000303033c024a291a43010c00021a45010e0e0c000203142f1a32010e0e0e0c00021a31010e0e0c000202013b0321293b313b2808341a2d010e0e0c00021a2d010e0e0c00031a2d010e0e0c000602013b0343313b1ace000e0e0e0c000303033c0214303b1ac6000e0e0e0c0003322a1ac3000c00036403041a0201103b50313c1ac2000e0e0e0c0003312a311af600327b050a0004313b1af3000c0003030c303b1a89000e0e0c0003020131293c1ae4000e0c0003643131311ae100320e0e0e7b06090005303b1a5b000c000303033c02142f3b1a56000e0e0e0c0003312a1a53000c00036403041a9200103b50303c1a52000e0e0e0c0003302a301a8600317b05090004000000000000000068010000000000000000000000000000|@1615,I234,I253,I231,@1586,I106,I105,I218,I251,I223,I239,I154,@1614,I255,I113,I107,@1611| 1614:O4|11,@49,0,@1616 1615:S39|486173685461626c652e68617368536574283329656e746572546162283329656e746572283129 1616:O5|@1391,148,0,148,0 1617:O5|@1391,132,0,132,0 1618:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1619,@1597| 1619:O1|@1620 1620:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1619| 1621:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1622,@1597| 1622:O1|@1623 1623:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1622| 1624:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1625,@1597| 1625:O1|@1626 1626:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1625| 1627:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1628,@1597| 1628:O1|@1629 1629:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1628| 1630:D5,96|00802b352c36562828452b3b6b56372c1a55000e0e0c0003293b1a53000c000303052a3b69020e29352956682d1a48000e0c00046456572e2b1a4400330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@1598,@1578,I251,@1631,@1597| 1631:O1|@1632 1632:D5,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a3529301a57000c00036403052d2a690210292f2f1a4e000e0e0e0c00042b2a69646502032b3b69440e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,I251,@1631| 1633:O1|@1637 1634:S35|5354525543545f56414c5328292e6d616b65416c6c4e616d6573283129283129283129 1635:D4,96|00822c2c2a1a60000e0c00021a61000e0e0c000203292a352b362a352956671a56000e0e0e0c0003640305312c6902012b2a2a2505250526031e353b6602012965440e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1636,I105,I218,I251| 1636:S38|556e6976657273616c5461626c652e666f6c64283329666f6c6448617368456e747279283329 1637:D10,184|00820402002e353b1ab5000e0e0c000303182e37291ab0000e0c00021ab1002b692c2b452a462604021e2e38293b1aa7000c0003293b1a9f000c00031aa1002b692d2b452a46260529352a362f3b292d1a95000e0e0c000303032a023f292c0e0e0c0002291a88000e0c00021a89000e0e0c0002031129352a362a2a2f220d0e0e0c00046502012b2b3c1a73000c00032a2a2505250526031e4a3b662705440e0000000000000000a8000000000000000000000000000000|@1639,I251,I15,@1640,I253,@1638,I231,I105,I218,I106| 1638:D6,96|00802b3b1a61000e0e0c000303033c021456073b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356172a1a32002e0e7e0400030e0e0e0e000000000000000050000000000000000000000000000000|@1641,I234,I253,I231,@1586,I106| 1639:S17|486173685461626c652e666f6c64283329 1640:D7,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203033c021456071a52000e0e0e0c00022c2a1a4f000c00036403041a4e00103b5056072c1a4d002d7e030003000000000000000048000000000000000000000000000000|@1641,I105,I218,I15,I247,@599,I253| 1641:S35|486173685461626c652e666f6c642833296765744974656d7c6c656e6774682d283129 1642:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 1643:O1|@1645 1644:S29|545950455f5452454528292e636f6d706f73654d617073283129283129 1645:D2,48|00822d2d0e0c00022c1a2c002d0e0e0e7e0500030e0e0e0e000000000000000020000000000000000000000000000000|@1647,@1646| 1646:O1|@1648 1647:S26|545950455f5452454528292e636f6d706f73654d617073283329 1648:D7,120|00812c3629353d1a76000e0e0e0c0003032e29362a372f3530371a6b001a7000326a1a73002a692d1a75002b1a79000e0e0c00043d302b6a2e2a2f6a2708021c29353c1a3a000e0e0e0c000303032d020b2938292e2e0e0e7d06000264430e0e000000000000000068000000000000000000000000000000|@1650,I251,@1651,@1646,@1653,@1649,@1416| 1649:O1|@1660 1650:S33|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129 1651:D2,64|00802b3629353c1a3e000e0e0e0c000303033b020f2c562856370e0e0e0c00032968016464420e0e000000000000000030000000000000000000000000000000|@1652,I251| 1652:S42|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f70794964283129 1653:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@1655,@1656,@1654,@1551| 1654:O1|@1659 1655:S48|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129 1656:O1|@1657 1657:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1658| 1658:S51|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129283129 1659:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1658| 1660:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@1655| 1661:D3,72|00802b56180c0002291a44000e0c00021a45000e0e0c0002030f2935562768012a2a692968016602013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1662,I105,I218| 1662:S55|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b757054797065283129 1663:S57|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b7570537472756374283129 1664:O1|@1665 1665:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c36291a4a000e0e0e0c00022b2a69282e2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1666,I105,I218,@1664| 1666:S25|537472696e672e636f6e636174576974682832296d6b283129 1667:O1|@1668 1668:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1667,@900| 1669:O2|@873,@1670 1670:O2|@901,0 1671:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1474| 1672:O3|@1674,@423,@1673 1673:O3|@1676,@1681,@1675 1674:S4|7265616c 1675:O3|@1674,@450,@449 1676:O2|1,@1677 1677:O3|2,@1678,0 1678:O4|0,@14353,2,1 1679:O1|@1680 1680:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@489,@446| 1681:O4|1,@14352,0,0 1682:O3|@1684,@423,@1683 1683:O3|@1686,@1689,@1685 1684:S4|776f7264 1685:O3|@1684,@450,@449 1686:O2|1,@1687 1687:O3|2,@1688,0 1688:O4|I251,@14355,1,1 1689:O4|1,@14354,0,0 1690:O3|@1692,@423,@1691 1691:O3|@1694,@1697,@1693 1692:S4|63686172 1693:O3|@1692,@450,@449 1694:O2|1,@1695 1695:O3|2,@1696,0 1696:O4|I251,@14357,1,1 1697:O4|1,@14356,0,0 1698:O2|@1699,@1469 1699:D14,184|00822d1aba000e0e0e0c00021ab9000e0e0c000203822d352e36293b1ab1000e0e0c0003031f2a352b3628062b2b6a2932321aa3003b56a70e0c0006291aa00069270402502e3c1a9e000e0e0e0c000303051a9b00023e2e305647301a99000e0e0c0005291a98000e0c00021a99002a691a9c002a693b3b3b3b2d6805291a3f000c000203041a8f00103b503b50291a8e006927056502013b440e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@1701,I105,I218,I251,@1702,@1700,I232,@1453,@1708,@1718,@901,@873,@1363,@1700| 1700:O2|@871,0 1701:S28|545950455f5452454528292e7072696e745479706556617273283329 1702:O2|@1704,@1703 1703:O1|@1707 1704:O1|@1705 1705:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1706| 1706:S28|545950455f5452454528292e656d70747954797065456e762d283129 1707:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1706| 1708:O1|@1709 1709:D16,296|00832e3b1a29010e0e0c000303051a27010fdc2d1a29010e0e0c00021a29010e0e0c00021a21010e0e0c000203033b0fd02d1a0b010c00021a0d010e0e0c000203043b5002041a0701103b502d3529352a3628062b2b6a2933311afb003b220c0e0c0006291af80069331ad3000c00021ad5000e0e0c000203043b5002041ae700103b503336291ab6000e0e0e0c00021ab5000e0e0c00021aad000e0e0c00026403033b0242331a96000e0e0e0c00021a95000e0e0c000203043b5002041aaf00103b503336220c3c1aac000e0c0003292b220d220d1aa7000c00051aa9002a691aac002a692704293b1aab00020219000c000303032a020f2a2a1aa20034020207000e7e0d000327071f040e0e0e0e000000000000000018010000000000000000000000000000|@1711,I232,@1453,I105,I218,@1712,@1702,@1670,@1715,@1715,I107,@1708,@871,@872,I251,@1710| 1710:O1|@1717 1711:S36|545950455f5452454528292e7072696e7454797065566172732833297056617273283229 1712:O4|@14358,@1714,0,@1713 1713:O5|@614,84,0,84,0 1714:S5|456d707479 1715:O4|@14358,@1714,0,@1716 1716:O5|@614,85,0,85,0 1717:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1710| 1718:O1|@1719 1719:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@1718,@869| 1720:O6|@1818,@14361,@14362,@14363,@14360,@14348 1721:D4,96|00813c28403b1a5f000c00042d2d2b564756585669567a568b569c56ad56be56cf120e0001000a00120f0001000b0012100001000c001a37000c001050293b1a36002e0e7e050003000000000000000050000000000000000000000000000000|@1723,I11,@1722,I253| 1722:O1|@1724 1723:S25|545950455f5452454528292e756e6966795479706573283229 1724:D41,6336|008e22101ac1180e0e0c000222101ab7180c00022a3528051ab5180e0e0c000303292a382937293629353c1aa2180e0e0e0c0003640310293629362922131a8f180c00036502013b6502013b03033c0237293528051a78180e0c0003032929382937293629353c1a66180e0e0e0c0003640310293629362922131a53180c00036502013b6502013b03033b0fdd2a353b1a3d180e0e0c000303033b0fdc29353b1a2d180e0e0c000303033b0fce2a3528061a1c180e0c0003030c293528061a0f180c000302013b07dd2a362b372a2a692c362d372a2a692e3b1afc170e0c00032f2d1aeb170c000303033b0fce2e3d1aee170e0e0e0c0003293b1ad3170c0003641ae4170e0c0002032e2a32221b221b221b1adb17221c221c221c221c221c221c221c221c221c221c221c221c1ac817221d0e7b141a00132c3b1a9b170c00032a353e1a8a170e0e0e0c0003030c29353e1a7c170e0c000302013b03bf2a362b372a2a692c362d37020238172a2a69333b1a8c171a91170204291727170c000450220d3b1a79171a7e170e0e0e0c0004502c2a32321a58172223222322232223222322230202710222232223222322232223222322231a5717020258020c0013322a2223222322231a25172224222422242224222422242224222422242224222422241a12170e0e0e0c001350220c22102223222322231af6162224222422242224222422242224222422242224222422241ae31622257b142200132a353f1aae160e0e0e0c0003030c29353f1aa0160e0c000302013b07dd2a362a36292b1ad6160e0e0e0c0003293b1a83160c0003033c3b221e221e1ac6166b221c3b1a77160c0003291ac0160e0c00021a79160e0e0c000203033b02122a6801221e3b2b1a85160e0e0c0004503b64650fca303b1a6d161a72160e0e0e0c000450333b1a5e161a63160c000450291a7b160c00021a35160e0e0c0002030d2936293b1a0f160c00036402013b030f2935293528053b2b2d3b68056502263c28401a21161a4e160e0e0e0c000428062a1a4a166a3f2c692b3b2b1a10160e0c0004502a662f2a2220222022201ae6152221222122212221222102024b0022212221222122212221222122211acf150c00135032220d2220222022201ab7152221222122212221222122212221222122212221222122211aa4152222020206000e7b141f00136602b12a353c1a67150c0003032e2e32221c221c221c1a7715221d221d221d221d221d221d221d221d221d221d221d221d1a6415221e0e7b141b001329353c1a2e150e0e0e0c0003032e2b33221c221c221c1a3b15221d221d221d221d221d221d221d221d221d221d221d221d1a2815221e0e7b141b00133b221b221b1a60156b22193b1af1140e0e0c0003291a38150e0c00021af1140e0e0c000203033b02122a6801221b3b2b1afd140e0e0c0004503b64656427070fce2a3528061ab0140e0c000307dc2a362b372a2a692a3d1aae140e0e0e0c0003293b1a93140c0003641aa4140e0c000203033c02182b3b1a86140e0e0e0c000329353f1a72140e0e0e0c00036407d52c3528051a62140e0e0e0c000307c82c362d382937293629353c1a4c140e0c0003640310293629362922171a3b140c00036502013b6403033c02162937293629353d1a24140e0c0003651a34140e0c000207d42e3528051a0f140c000307ca2e362f382937293629353c1afc130e0c0003640314293629362922191aeb130202bb130c00036502013b6403033c021a2937293629353d1ad0130202bc010e0c0003651adc130e0c000203362d31221b221b221b1ad313221c221c221c221c221c221c221c221c221c221c221c221c1ac013221d0204520120010e0e0e7b141a00132937293629353d1a7e130e0e0e0c000303043b5002041ae713103b5029362a372a2f1ae3130c00031ae5132a690402002c2b2b1ae2130e0e0e0c000450293527071a3c13020460002e000e0e0e0c0002322a221a221a221a221a221a221a221a221a221a221a221a221a221a1a3913221b0e0e7b111b00102b2f2219221922191a2513221a221a221a221a221a221a221a221a221a221a221a221a1a1213221b0e0e0e7b141800132937293629353d1ad6120e0e0e0c000303043b5002041a3f13103b5029362a372a2f1a3b130c00031a4d132a690402002c2b2b1a3a130e0e0e0c000450293527071a94120e0c0002302a22182218221822182218221822182218221822182218221822181a991222190e0e7b11190010292d2217221722171a85122218221822182218221822182218221822182218221822181a721222190e0e0e7b14160013292d2217221722171a55122218221822182218221822182218221822182218221822181a421222190e0e0e7b14160013293528061a09120e0e0c000307cd29362a37293d1a09120e0e0c0003293b1aef110c0003641a00120e0c000203033c02182a3b1ae2110e0e0e0c000329353f1ace110e0e0e0c00036407cd2c3528051abe110e0e0e0c000307dd2c362d382937293629353c1aa8110e0c0003640310293629362922161a97110c00036502013b6403033c02162937293629353d1a80110e0c0003651a90110e0c0002036e2d3528061a6b110c0003033a2d362e372a2a692932221b221b221b1a7411221c221c221c221c221c221c221c221c221c221c221c221c1a6111221d02027f010e0e7b141a00132e2e22162216221622162216221622162216221622162216221622161a2d1122170e0e7b111700102937293629353d1afa100202d6000e0e0e0c000303043b5002041a5f11103b5029362a372a2f1a5b1102024b000c00031a71112a690402002c2b2b1a56110e0e0e0c000450293527071ab0100e0c0002292f22172217221722172217221722172217221722172217221722171ab51022180e0e7b111800102b3528061a85100e0e0c000303362b362c372a2a6929302219221922191a8c10221a221a221a221a221a221a221a221a221a221a221a221a1a7910221b0e0e7b141800132c2c22142214221422142214221422142214221422142214221422141a491022150e0e7b111500102b3528061a19100e0e0c000303362b362c372a2a6929302219221922191a2010221a221a221a221a221a221a221a221a221a221a221a221a1a0d10221b0e0e7b141800132c2c22142214221422142214221422142214221422142214221422141add0f22150e0e7b111500102a3528051aad0f0e0e0c0003030c293528051a9f0f0c000302013b07ca2a362b382b362c382b37293629353c1a850f0e0e0c0003640310293629362922161a730f0c00036502013b6403033c02232937293629353c1a5c0f0e0c0003640310293629362922161a4b0f0c00036502013b6403033b0fdc2b37293629353d1a340f0e0c00036503692b37293629353d1a230f0c000303043b5002041a8f0f103b5029362a372a311a8b0f0c00031aad0f2a690402002c2b2b1a8a0f0e0e0e0c000450293529220d221e221e221e221e221e221e221e221e221e221e221e221e221e1af10e221f0202a3020e0e7b111f00102937293629353d1aba0e0e0e0e0c00036503692937293629353d1aa70e0c000303043b5002041a130f103b5029362a372a2f1a0f0f0c00031a390f2a690402002c2b2b1a0e0f0e0e0e0c0004502935220d2a221e221e221e221e221e221e221e02023402221e221e221e221e221e221e1a710e221f0e0e7b111f00102937293629353d1a3e0e0e0e0e0c00036503652937293629353d1a2b0e0c000303043b5002041a970e103b5029362a372a2f1a930e0c00031ac50e2a690402002c2b2b1a920e0e0e0e0c0004502935220d2a221e221e221e221e221e221e221e221e221e221e221e221e221e1af90d221f0e0e7b111f00102b372a372a3629353c1ac40d0e0c000303112a3629353c1ab60d0e0e0e0c00036402013b6403152a3629362b3629362b2a1a9c0d0e0c0003270402392a3629353b1a8c0d0e0c000303112a3629353b1a7e0d0e0e0e0c00036402013b6403152a3629382b3629382b2a1a240e0e0c0003270402013b6507ca2a2d291aaa0d0e0e0e0c00021a610d0e0e0c0002038d29352a362c1a920d0e0e0e0c00021a490d0e0e0c000203352c352d362c2b221c221c221c221c221c221c221c221c221c221c221c221c221c1a270d0c001050292c2506250626041e5b3b65023d3b221b221b1ab50d6b22193b1aee0c0e0e0e0c0003291a340d0e0c00021aed0c0e0e0c000203033b02122a6801221b3b2b1af90c0e0e0c0004503b646565024d2a3b1ab00c0e0c000303033b023f3b221922191a6f0d6b22173b1aa00c0e0c0003291ae80c020227000e0c00021a9d0c0e0e0c000203033b02122a680122193b2b1aa90c0e0e0c0004503b64656502393c2f2f2e2d680522153b1a600c0e0c0003291aa80c0e0c00021a610c0e0e0c000203033b02122a680122173b2b1a6d0c0e0e0c0004503b646527040fcb2a353f1a220c0e0e0e0c0003030c293528051a130c0c000302013b07d62a362a362b382937293629353c1afb0b0c0003640310293629362922151aeb0b0c00036502013b6403033c02162937293629353d1ad40b0e0c0003651ae40b0e0c00021add0b0e0e0c0002036a2937293629353d1ab40b0e0c000303043b5002041a1f0c103b5029362a372a2f1a1b0c0c00031a6d0c2a690402002c2b2b1a1a0c0e0e0e0c0004502935220c2a221d221d221d221d221d221d221d221d221d221d221d221d221d1a810b221e02022f0b0e0e7b111e00102937293629353c1a4a0b0e0e0e0c0003640314293629362922151a370b020263030c00036502013b6403033b0fd82937293629353d1a1c0b0e0c00036503652937293629353d1a0b0b0c000303043b5002041a770b103b5029362a372a2f1a730b0c00031acd0b2a690402002c2b2b1a720b0e0e0e0c0004502935220c2a221d221d221d221d221d221d221d221d221d221d221d221d221d1ad90a221e0e0e7b111e00102a1a040b0e0c00021abd0a0e0e0c00021ab50a0e0e0c0002039c2b293b1a900a0e0c000303033b028a29352a362c372b372a3629353c1a770a0c000303112a3629353c1a6a0a0e0e0e0c00036402013b6403192a3629362b3629362b2a1a500a020279020e0c0003270402392a3629353b1a3c0a0e0c000303112a3629353b1a2e0a0e0e0e0c00036402013b6403152a3629382b3629382b2a1ad40a0e0c0003270402013b6503033c0207292503511e943b656402013b03033b0fcb2b293b1aee090e0e0e0c000303033b023529352a362a37293629353c1ad5090e0e0c00036403102936293622162a1ac3090c00036502013b6403033c0207292503511e413b65640306220f68010fcc2b293b1a9f090c000303033b023529352a362a37293629353c1a89090e0e0c00036403102936293622142a1a77090c00036502013b6403033c0207292503511e3e3b65640306220d68010fd02b293b1a53090c000303033b023929352a362a37293629353c1a3d090e0e0c00036403142936293622122a1a2b09020254010c00036502013b6403033c0207292503511e423b6564030534680102a12b293b1a04090e0c000303033b023929352a362a37293629353c1aed080e0e0c00036403142936293622102a1adb0802026e000c00036502013b6403033c0207292503511e433b6564030532680102512b293b1ab4080e0c000303033b023929352a362a37293629353c1a9d080e0e0c000364031429362936220e2a1a8b0802021e000c00036502013b6403033c0207292503511e433b6564030530680102013b291abd080e0e0c00021a75080e0e0c000203492935293528053b2b2d3b68053c2a322e31680522183b1a45080e0e0c0003291a8c080e0c00021a45080e0e0c000203033b02122a6801221a3b2b1a51080e0e0c0004503b64270502393b2f2f1aef086b22153b1a08080e0c0003291a50080e0c00021a09080e0e0c000203033b02122a680122173b2b1a15080e0e0c0004503b646564660fcb2a3528051ac9070e0e0c0003030c29353f1abc070e0c000302013b07cc2a362b382b362a37293629353c1aa3070c0003640310293629362922151a93070c00036502013b6403033c02162a37293629353d1a7c070e0c0003651a8c070e0c00021a85070e0e0c0002036a2a37293629353d1a5c070e0c000303043b5002041ac707103b5029362a372a301ac3070c00031a2d082a690402002c2b2b1ac2070e0e0e0c000450293529220c221d221d221d221d221d221d221d221d221d221d221d221d221d1a2907221e0202d7060e0e7b111e00102b1a50070e0c00021a09070e0e0c00021a01070202c9020e0e0c0002039829293b1ad8060e0c000303033b028629352a362d372b372a3629353c1abf060c000303112a3629353c1ab2060e0e0e0c00036402013b6403152a3629362b3629362b2a1a98060e0c0003270402392a3629353b1a88060e0c000303112a3629353b1a7a060e0e0e0c00036402013b6403152a3629382b3629382b2a1a20070e0c0003270402013b6503033c0207292503511e903b656402013b03033b0fcb29293b1a3a060e0e0e0c000303033b023529352a362a37293629353c1a21060e0e0c00036403102936293622162a1a0f060c00036502013b6403033c0207292503511e413b65640306220f68010fcc29293b1aeb050c000303033b023529352a362a37293629353c1ad5050e0e0c00036403102936293622142a1ac3050c00036502013b6403033c0207292503511e3e3b65640306220d68010fd029293b1a9f050c000303033b023929352a362a37293629353c1a89050e0e0c00036403142936293622122a1a7705020254010c00036502013b6403033c0207292503511e423b6564030534680102a129293b1a50050e0c000303033b023929352a362a37293629353c1a39050e0e0c00036403142936293622102a1a270502026e000c00036502013b6403033c0207292503511e433b65640305326801025129293b1a00050e0c000303033b023929352a362a37293629353c1ae9040e0e0c000364031429362936220e2a1ad70402021e000c00036502013b6403033c0207292503511e433b6564030530680102013b291a09050e0e0c00021ac1040e0e0c000203492935293528053b2b2d3b68053c322b312f680522183b1a91040e0e0c0003291ad8040e0c00021a91040e0e0c000203033b02122a6801221a3b2b1a9d040e0e0c0004503b64270502393b2f2f1a4b056b22153b1a54040e0c0003291a9c040e0c00021a55040e0e0c000203033b02122a680122173b2b1a61040e0e0c0004503b646564660fdc2a353f1a16040e0e0e0c0003030c29353f1a08040e0c000302013b03041afc04103b503b502a3528051af0030e0c000307cc2a362b382937293629353c1adc030e0c0003640310293629362922141acb030c00036502013b6403033c02162937293629353d1ab4030e0c0003651ac4030e0c00021abd030e0e0c0002036a2937293629353d1a94030e0c000303043b5002041aff03103b5029362a372a2f1afb030c00031a7d042a690402002c2b2b1afa030e0e0e0c00045029352934221c221c221c221c221c221c221c221c221c221c221c221c221c1a620302021203221d0e0e0e7b111d00103b2d2d1a3e046b22133b1a2f030c0003291a7803020227000e0c00021a2d030e0e0c000203033b02122a680122153b2b1a39030e0e0c0004503b6427040fcd293528051aee020e0e0e0c000307d529362a382937293629353c1ad8020e0c0003640310293629362922141ac7020c00036502013b6403033c02162937293629353d1ab0020e0c0003651ac0020e0c00021ab9020e0e0c000203662937293629353d1a90020e0c000303043b5002041afb02103b5029362a372a2f1af7020c00031a89032a690402002c2b2b1af6020e0e0e0c0004502935342a221c221c221c221c221c221c221c221c221c221c221c221c221c1a5e02221d0e0e0e7b111d00102937293629353c1a2a020202fa010e0e0e0c0003640314293629362922141a13020202be000c00036502013b6403033b02ae2937293629353d1af8010e0c00036503652937293629353d1ae7010c000303043b5002041a5302103b5029362a372a2f1a4f020c00031ae9022a690402002c2b2b1a4e020e0e0e0c0004502935342a221c221c221c221c221c221c221c221c221c221c221c221c221c1ab601221d0e0e0e7b111d00103b2c2e1aae026b22133b1a87010c0003291ad0010e0c00021a89010e0e0c000203033b02122a680122153b2b1a95010e0e0c0004503b6465650fdb2a353d1a4b010c0003030c29353d1a40010e0c000302013b03532a362b372b362c372c2b22162216221622162216221622162216221622162216221622161a30010e0c0010502b2a22162216221622162216221622162216221622162216221622161a0c0122170e7b111700102a353c1ade000e0e0e0c0003030c29353c1ad0000e0c000302013b03033b02982a353e1abe000e0e0e0c0003030c29353e1ab0000e0c000302013b03412a362b372a2a692c362d372a2a692c2a32321ab200221b221b221b221b221b221b221b221b221b221b221b221b221b020248001ab1000e0e0c0013503b2706023a3b2b2b1a90016b22113b1a61000e0e0c0003291aa8000e0c00021a61000e0e0c000203033b02122a680122133b2b1a6d000e0e0c0004503b6465651f0f0e0000000000000000b0180000000000000000000000000000|@1726,@1435,I251,I253,I243,I218,@1722,@1727,@588,I255,@1782,@1797,@1800,I105,I11,79992,@1725,@1731,@1734,@1801,@1414,@1802,@1803,@1804,@1805,@1806,I113,@1807,@1807,@1808,@1809,@1810,@1811,@1810,@1812,@1815,@1725,@1816,@1817,@1725,@1725| 1725:S20|28496e636f6d70617469626c6520747970657329 1726:S33|545950455f5452454528292e756e69667954797065732832296d61746368283229 1727:O1|@1728 1728:D20,728|0091221335293b1ad6020e0e0e0c00032214291ad2020e0e0e0c0002293528051acd020e0e0c0003036029362a382937293629353d1ab8020e0c00036503472937293629353d1aa7020c000303043b5002041aa302103b5029362a372a2f1a9f020c00031aa1022a690402002c2b2b1a9e020e0e0e0c00045029352707250426031e6f3b02012b6502012965293528061a5d020e0e0c0003031129362217352a2a1a4c020e0c00036502013b2b353f1a3e020e0e0e0c000303252b2217221522142214221422142214221422142214221422142214221422210c00105002322b353e1a0b020c000303252b2217221522142214221422142214221422142214221422142214221422210c00105002023b502903033b0fcb221736293d1af9010e0e0c0003293b1ac7010c0003641af0010e0c000264033f3b221622161ae9016b22143b1a9a010e0e0e0c0003291ae0010e0c00021ac9010e0e0c000203033b02122a680122163b2b1acd010e0e0c0004503b64650fd83b2b22192218221822181abd010e0e0c0007033c3b221622161ab6016b22143b1a47010c0003291a90010e0c00021a79010e0e0c000203033b02122a680122163b2b1a7d010e0e0c0004503b64650fd0221736293f1a4a010e0e0e0c0003293b1a17010c0003641a40010202d8000e0c000264031822161a60011a650122140c0004293c1af3000c00036402013b033c3b221622161a52016b22143b1acb000c0003291a14010e0c00021afd000e0e0c000203043b5002112a680122163b2b1a00010e0c0004503b515102023b50221736293c1acc0002026c000e0c0003293b1a97000c0003641ac0000e0c000264031c1afe001a03010c000222172a0e0e0c0002643b2a0e0e0c00025102023b5022133b1a55000e0e0c0003291a9c00020224000e0c00021a81000e0e0c000203033b0212221835293b221a1a85000e0e0c0004503b646427041f120000000000000000c8020000000000000000000000000000|@1730,I253,@1435,I251,@1731,@1734,@1737,@1414,I243,I218,@1739,I105,I255,@1740,@1750,@1751,@1754,@1760,@1761,@1729| 1729:O1|@1769 1730:S42|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229 1731:O4|@14322,@596,@1733,@1732 1732:O5|@1349,1533,0,1533,0 1733:S35|6d616b654571756976616c656e743a204e6f74206120747970652066756e6374696f6e 1734:O1|@1735 1735:D4,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203142b1a56000e0e0e0c00021a55000e0e0c000202013b031a2c352d362d352e362c2b692c2b1a43000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1736,I105,I218,@1734| 1736:S15|4c697374506169722e7a6970283229 1737:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1738:S38|545950455f5452454528292e6d616b654571756976616c656e74283229676574417267283129 1739:S42|2843616e6e6f7420756e6966792077697468206578706c696369742074797065207661726961626c6529 1740:O1|@1741 1741:D26,728|0085303b1ad9020e0e0c000307d62f1ad6020e0e0e0c000229353e1ac2020e0e0e0c000303162936291ac402323232321ac502330e0e0e7b080a000729353d1a9e020e0e0e0c0003032929362a373b2b333333331a99020e0e0c000703033c020f3b2a333333331a8602347b080b0007650fd0293528051a66020e0e0e0c0003037e29362a382937293629353d1a50020e0c00036503552937293629353d1a3f020c000303043b5002041a5302103b5029362a372a2f1a4f020c00031a51022a690402002c2b2b1a4e020e0e0e0c00045029353b2a22122212221222121a100222130202d2010e7b081300072a1a0002333333331a2902340e0e0e7b080b0007293528061ad9010e0e0c000307dc29362a373136293e1a0f020c0003293b1a0f020c0003030c1a0f022a1a13020c00030201292c3e1af0010e0c0003293b1aef01020270010c0003030c1aeb012a1aef010c00030201292b2a1ad4010e0c000303032b0201292f3e1abd010e0e0c0003293b1abb010c0003030c1abb012a1abf010c0003020129292c1abc010e0c0003651abc010e0c000207cd2f3d1ab9010e0e0c0003293b1a37010c0003641aa0010e0c000203403b220e220e1aa2016b220c3b1aa3010c0003291aa4010e0c00021a7d010e0e0c000203043b5002152a6801220e3b2b1a90010202c8000e0c0004503b515102aa2f3f1a5d010e0e0c0003293b1adb000c0003641a44010e0c0002303c1a43010c0003293b1ac3000c0003641a2c010e0c00023c28401a52011a57010c00042c1a38010e0c000203032c02072c1a4b010c0002293e1a4b010c00032d03033f02013b2a2a1a44010e0c0003293b1a3b01020239000c000329301a2f010c00032806302b6a22113b1ae9000e0e0c0003313b2b1aee000e0e0e0c00045022123b2c1ae0000e0c0004503b260c02023b50220e35312a1a3400220e0e0e7e1200033b6402013c1f060e0e0e0e0e0000000000000000c8020000000000000000000000000000|@1743,I251,@1435,@1740,@1744,@1731,@1734,@1747,@1414,@1748,I216,I234,@410,I106,I113,I218,I243,@1742,I253,I105,I255,@588,I11,I152,I245,I242| 1742:S44|2854797065207661726961626c65206973206672656520696e20737572726f756e64696e672073636f706529 1743:S61|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296f6363757273436865636b4661696c73283229 1744:O1|@1745 1745:D4,88|0085301a5a000e0e0e0c00021a59000e0e0c00020326303531362932323232321a4d000e0e0c00072b362a2a343434342210220c0e0e0e7b080c00073b1f060e000000000000000048000000000000000000000000000000|@1746,I105,I218,@1744| 1746:S15|4c6973742e666f6c64722833292829 1747:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1748:O1|@1749 1749:D4,88|0085301a5a000e0e0e0c00021a59000e0e0c00020322303531362932323232321a4d000e0e0c0007292c33333333220f340e0e7b080b00073b1f060e0e0e0e0e000000000000000048000000000000000000000000000000|@1746,I105,I218,@1748| 1750:S44|2854797065207661726961626c6520746f20626520756e6966696564206f636375727320696e207479706529 1751:O1|@1752 1752:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@1753| 1753:S45|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229283129 1754:O1|@1755 1755:D17,384|00802b36293f1a7f010c0003293b1a7f010c0003641a80010e0c00026403033d0fd02b36293d1a5f010c0003293b1a5f010c0003641a60010e0c00026403033c0fd32b36293e1a57010c0003293b1a57010c0003030c1a57012a1a5b010c00030201292e36293c1a1e010e0e0e0c0003293b1a1b010c0003641a1c010e0c00023c28401a3a011a3f010c00042c1a40010e0c000203032c02072c1a3b010c0002293e1a3b010c0003293f1a3b010c0003293b1a33010c0003292f1a2b010c000328062f2b6a220e35293b1a23010c0003221035293b2e1a1f010c0004502a353f1aad000e0e0c000303682a36291a100102026c000e0c0002291ad4000e0c00021a95000e0e0c0002034429352a36293b1a7d00020249000e0e0c0003031b2a3528053b2b2e3b6805220f3b2b1ac9000e0e0c0004503d6502123f2c69220e3b2b1ab5000e0e0c0004503d646502013c65020c323b2c1aa0000e0c0004503d270f420e0e0e0e0e0e0e000000000000000070010000000000000000000000000000|@1757,I243,I251,I218,I216,I234,@410,I106,@588,I11,I105,I152,I245,I242,I253,I255,@1756| 1756:O1|@1758 1757:S54|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b45715476283129 1758:D7,168|00802b1aaa000e0e0e0c00021aa9000e0e0c000203752b352c362a37293629353d1a9c000e0c000303041a9b00103b5029353b1a8a000e0e0e0c00030322293729353c1a7a000e0e0e0c0003030d2936293b1a7b000c0003640202293664020d2936293b1a69000e0e0c00036465030e291a64000e0c00022b2a6964020a291a56002e0e7d0500026502013b420e0e0e000000000000000098000000000000000000000000000000|@1759,I105,I218,I251,@1377,I253,@1756| 1759:S63|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b4571547628312966696c746572283129 1760:S24|28526571756972657320657175616c697479207479706529 1761:O1|@1762 1762:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@1764,@1763| 1763:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@1766,@1765| 1764:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129 1765:O1|@1767 1766:S60|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129283129 1767:D16,312|00812b3528061a37010c000307d82b362c37293c1a31010e0e0c0003293b1a1f010c0003641a28010e0c000203033b0fd12a3b1a22010e0e0e0c000329353f1afe000e0e0e0c000303033b02cb2a3e1a0e010e0e0e0c0003293b1a0b010c0003030c1a0b012a1a0f010c00030201292c3f1ad4000e0c0003293b1ac3000c0003641acc000e0c00022d3d1abb000c0003293b1aab000c0003641ab4000e0c00023c28401ada001adf000c00042c1ae0000e0c000203032c02072c1adb000c0002293e1adb000c00032d03033f02013b2a2a1ad4000e0c00032e03033d02013b2a2a1ac400020234000e0c0003293c1ab7000c00032806312b6a220f3b2b1ab000020215000e0c000450313b220f1aa0000e0c0004503b270d646502013b430e0e000000000000000028010000000000000000000000000000|@1768,I251,I243,I218,I253,I216,I234,@410,I106,@588,I11,I105,I152,I245,I242,I255| 1768:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283229 1769:D2,40|00801a2b002c692964420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@1771,@1770| 1770:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@1773,@1772| 1771:S23|545950455f5452454528292e666f6c6454797065283129 1772:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1775,@1774| 1773:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283129 1774:O1|@1776 1775:S34|545950455f5452454528292e666f6c6454797065283129666f6c6454283129283129 1776:D6,176|00822c1ab2000e0e0e0c0002292d0e0e0e0c00022f2a0e0e0e0c0002642a350a06002e002b004200310028005e000e002a36293b1a89000e0e0c00032b2a311a8600327b05090004024a2902472902442902412a36291a6f00302d1a7200327b060800052a362b372b2a311a5a000e0e0e0c0004292c321a4e00337b050a00042a36291a4200302d1a4d00320e0e0e7b0608000565440e0e0000000000000000a0000000000000000000000000000000|@1778,@1435,I253,@1774,@1779,@1777| 1777:O1|@1781 1778:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283229 1779:O1|@1780 1780:D4,80|00832e1a52000e0e0e0c00021a51000e0e0c0002031a2e352f36293030301a47000c00052b362a2a3234327b050a00042b1f040e0e0e0e0e000000000000000040000000000000000000000000000000|@1746,I105,I218,@1779| 1781:D4,80|00832e1a52000e0e0e0c00021a51000e0e0c0002031a2e352f36293030301a47000c0005292c3133310e0e7b050900042b1f040e0e0e0e0e000000000000000040000000000000000000000000000000|@1746,I105,I218,@1777| 1782:O1|@1783 1783:D15,776|00912213352214362214352215362217362929353b1af8020e0c00030304293702122936293b1aef020c0003292503511e1e3b65642218362929353b1ad1020e0e0c00030304293702122936293b1ac7020c0003292503511e1f3b65642b037129036b3b31291ab7020c00021ab9020e0e0c0002031729362b3c1ab3020c0003292b25042504511e223b6502012a653b30291a8b020c00021a8d020e0e0c0002031729362b3c1a87020c0003292b25042504511e223b6502012a652a2a1a78020e0c0003651a60020e0c000202013b02013b033f3b221a221a1a64026b22173b1a35020e0e0c0003291a34020e0c00021a35020e0e0c000203043b5002112a680122193b2b1a40020e0c0004503b513b65022d302f221922192219221922192219221922192219221922192219221922192210222a222a22151a14020e0c00152c03652a03043b50025a2e29353b1abf010c000303033b02262936293b1ab8010e0c000329353c1aa6010e0e0e0c00030309292503511e2b3b02032a68016564293b1a8b010c000303041acb01103b503b502935293b341aae010e0e0e0c0004503b2603221a0fd02a035f3029353b1a5e010e0e0e0c000303033b02262936293b1a54010e0c000329353c1a42010e0e0e0c00030309292503511e2e3b02032a68016564293b1a27010c000303041a6f01103b503b502935293b321a4a010e0e0e0c000450221b650fce3029353b1aff000c000303033b02262936293b1af8000e0c000329353c1ae6000e0e0e0c00030309292503511e2b3b02032a68016564293b1acb000c000303041a1b01103b503b5029353029353b1ab5000e0e0c000303033b022a2936293b1aac000e0c000329353c1a9a00020271000e0e0e0c00030309292503511e313b02032a68016564293b1a7b000c000303041ad300103b503b5029352b2a1a67000c000303043b5002322d1ac2000e0e0e0c00023b2a3b6a2d3b2b1a82000e0e0e0c0004503c2e692c3b2b1a7200020211000e0e0e0c0004503b26043e2e220d6a270427091f120e0000000000000000f8020000000000000000000000000000|@1785,I251,I253,I105,I218,I106,I113,@1786,I255,@1787,@1792,@1792,@1792,@1792,@1784| 1784:O1|@1796 1785:S48|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f726473283429 1786:S28|28446966666572656e74206e756d626572206f66206669656c647329 1787:O1|@1788 1788:D23,880|009322151a71030e0e0c00021a71030e0e0c000207da2215352216362a352b3622181a53030c00021a55030e0e0c000207dc2218352219362a352b362e1a48030e0c00022b1a40030e0c00022a2a1a3f030c000365036f2e2b1a3c030e0c000303033c024a2e1a0f030c00021a11030e0e0c000203142a1afe020e0e0e0c00021afd020e0e0c000202013b03212e3b2c3b28082f1af1020e0e0c00021a01030e0e0c00031a01030e0e0c000602013b03033b02102e2b1af7020c000303051af70202013c02232e1abe020e0e0e0c00022b1ab4020e0c00022a2a1ae3020c00036503051ad20202013c293b1aa2020202ed010e0e0e0c0003035c2e2b221d221d221d221d221d221d221d221d02027001221d221d221d221d221d222b0e0c001050302d221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a7e020e0e0e0c0015322a69640fcf293b1a65020e0e0c0003038c220e03531a6702301a6b020c0003291a6c021a61020e0e0c00033b221022102c6b221e3b1a5f020c0003291ae8010e0c00021ae9010e0e0c000203043b5002112a680122203b2b1a44020e0c0004503b5122222704023330221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1ae5010e0e0c0015322a6964028e3403581a04022c1ae0010e0c0003291a00021ad5010e0e0c00033b221022102c6b221e3b1ad3010c0003291a5c010e0c00021a5d01020255000e0e0c000203043b5002112a680122203b2b1ab4010e0c0004503b51222127040233221e2d221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a55010e0e0c00152e2a69642705025b3203541a82012b1a4e010e0e0e0c0003291a7c011a41010e0e0c00033b34342c6b22193b1a41010e0e0c0003291ac8000e0c00021ac9000e0e0c000203043b5002112a6801221b3b2b1a24010e0c0004503b51260402023b5022192704027422141a94000e0c00021a95000e0e0c0002036022143529352d03511a1b012a1ad7000c0003291a18011acd000e0e0c00033b32322c6b22173b1acd000e0e0c0003291a54000e0c00021a55000e0e0c000203043b5002112a680122193b2b1ab0000e0c0004503b51260402023b5022166502013b1f140e0e0e000000000000000060030000000000000000000000000000|@1790,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,@1787,@1791,@122,@1789,I253,I255,@1791,@1789,@1791,@1789,@1791,@1789| 1789:S9|206d697373696e6729 1790:S64|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f7264732834296d617463684c6162656c6c6564283229 1791:S7|284669656c6420 1792:O4|@14359,@1794,0,@1793 1793:O5|@1795,52,0,52,0 1794:S6|4f7074696f6e 1795:S18|2e2f62617369732f4f7074696f6e2e736d6c 1796:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@1784| 1797:O1|@1798 1798:D6,240|00812c1af2000e0e0e0c00021af1000e0e0c000203b92c352d362d293b1ae8000e0c000303033b028629352a362d372b372a3629353c1acf000c000303112a3629353c1ac2000e0e0e0c00036402013b6403152a3629362b3629362b2a1aa8000e0c0003270402392a3629353b1a98000e0c000303112a3629353b1a8a000e0e0e0c00036402013b6403152a3629382b3629382b2a1a78000e0c0003270402013b6503033c0207292503511e903b65640310292e1a61000e0e0c00032b2a6964020a292e1a51002f7e0600036502013b430e0e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@1799,I105,I218,I251,I113,@1797| 1799:S47|545950455f5452454528292e756e69667954797065732832296d61746368283229696e746572736563742832292829 1800:S27|28496e636f6d70617469626c65206f7665726c6f6164696e677329 1801:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1802:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1803:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1804:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1805:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1806:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1807:S32|28446966666572656e74206e756d62657273206f6620617267756d656e747329 1808:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1809:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1810:S29|28446966666572656e74207479706520636f6e7374727563746f727329 1811:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1812:O4|@14322,@596,@1814,@1813 1813:O5|@1349,2381,0,2381,0 1814:S36|556e696669636174696f6e3a204f7665726c6f61645365742f4f7665726c6f6164536574 1815:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1816:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1817:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1818:D14,944|00822d1ab2030e0e0e0c000229353c1aae030e0e0e0c000303033c0fdd29353b1a9d030e0e0c000303033c0fcf29353f1a8d030e0e0c000303041a8b03103b503b5029353e1a78030e0c000303662936291a7c030e0c0002293d2a1a7a030e0e0e0c00021a79030e0e0c000203412a352b362a3434330e0e0e0c0004293d1a3f030c0003030d2a2d2505250526031e343b0219293b1a28030e0c0003030d2a3b2505250526031e4c3b02013c6602012927040fd1293528051a05030e0e0c000307d629362a382937293629353c1af0020e0c00036403102936293629567b1adf020c00036502013b6403033c0fd22937293629353d1ac80202049a0298020e0e0e0c000365034d2937293629353d1aaf020c000303043b5002041acb02103b5029362a372a2f1ac7020c00031ac9022a690402002c2b2b1ac6020e0e0e0c000450293529220f220f220e22100e0e0e7b051000042937293629353c1a62020e0e0e0c00030311293629567a1a52020e0e0e0c00036402013b03033c027329353c1a3d0202020f020e0e0c0003031529362956791a2a02020283010e0e0e0c00036402013b03033c024729353c1a11020e0e0c0003031529362956781a0202020258010e0e0e0c00036402013b03033c021f29353c1ae9010e0e0c0003031129362956771ada010e0e0e0c00036402013b6503033d0fcf2937293629353d1ac0010e0c000303041aff01103b503b5029353b1aac010e0c00030322293729353c1a9e010e0e0e0c0003030d2936293b1adf010c0003640202293664020d2936293b1acd010e0e0c00036465035b2a3d2a1a86010e0e0e0c00021a85010e0e0c000203412a352b362a3434330e0e0e0c0004293d1a4b010c0003030d2a2d2505250526031e343b0219293b1a34010e0c0003030d2a3b2505250526031e4c3b02013c660201296502732937300e0e0e0c0002293c1a0b010c000303033c025c2b2a2a1a1501020253000e0e0c00021a11010e0e0c000203412a352b362a220c220c340e0c0004293d1ad7000c0003030d2a2d2505250526031e373b0219293b1ac0000e0c0003030d2a3b2505250526031e4f3b02013c66020129656465027929353d1a9d000e0e0c000303033c026929362a372a2a692a3f1adf000c0003293b1a7f000c0003641a98000e0c000203033d02442b3b1aba000e0e0e0c000329353e1a5e000e0e0e0c000303212a310e0c0002293c1a4b000c000303033c020b2a333332340e7b050b00046402092a31310e0e7d0a0002646664440000000000000000a0030000000000000000000000000000|@1820,@1435,I251,@1821,@1824,I105,I218,@1731,@1734,@1819,@1414,@1377,I253,I243| 1819:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 1820:S23|545950455f5452454528292e657175616c697479283329 1821:O4|@14322,@596,@1823,@1822 1822:O5|@1349,1664,0,1664,0 1823:S28|657175616c697479202d204f7665726c6f616473657420666f756e64 1824:O1|@1825 1825:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a362a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@1824| 1826:O3|3,@1828,@1827 1827:O3|0,@2129,1 1828:O2|@1830,@1829 1829:O2|@1842,@1841 1830:O2|49,@1831 1831:O5|5,0,@1833,@1832,@423 1832:O3|@1833,@423,@1834 1833:S10|74797065436f6e737472 1834:O3|@1836,@1839,@1835 1835:O3|@1840,@450,@449 1836:O2|1,@1837 1837:O3|2,@1838,0 1838:O4|0,@14364,3,1 1839:O4|1,@14365,0,0 1840:S39|506f6c794d4c2e4e616d6553706163652e54797065436f6e737472732e74797065436f6e737472 1841:O2|@1843,0 1842:O2|50,@501 1843:O2|51,@1844 1844:O5|5,@1846,@1988,@1845,@423 1845:O3|@1988,@423,@2046 1846:O2|@1847,0 1847:O5|5,0,@1849,@1848,@423 1848:O3|@1849,@423,@1850 1849:S9|6e616d655370616365 1850:O3|@694,@1852,@1851 1851:O3|@2045,@450,@449 1852:O3|2,0,@1853 1853:O3|3,@1855,@1854 1854:O3|0,@2027,1 1855:O2|@1857,@1856 1856:O2|@1878,@1877 1857:O2|@1859,@1858 1858:O3|2,@956,@1860 1859:S6|616c6c466978 1860:O5|5,@1861,@1028,@1026,@423 1861:O2|@1862,0 1862:O3|3,@1863,@428 1863:O2|@1865,@1864 1864:O2|@1866,0 1865:O2|49,@500 1866:O2|50,@1867 1867:O5|5,0,@1869,@1868,@423 1868:O3|@1869,@423,@1870 1869:S6|666978697479 1870:O3|@1872,@1875,@1871 1871:O3|@1876,@450,@449 1872:O2|1,@1873 1873:O3|2,@1874,0 1874:O4|0,@14366,3,1 1875:O4|1,@14367,0,0 1876:S31|506f6c794d4c2e4e616d6553706163652e496e66697865732e666978697479 1877:O2|@1898,@1897 1878:O2|@1880,@1879 1879:O3|2,@956,@1881 1880:S6|616c6c536967 1881:O5|5,@1882,@1028,@1026,@423 1882:O2|@1883,0 1883:O3|3,@1884,@428 1884:O2|@1865,@1885 1885:O2|@1886,0 1886:O2|50,@1887 1887:O5|5,0,@1889,@1888,@423 1888:O3|@1889,@423,@1890 1889:S12|7369676e617475726556616c 1890:O3|@1892,@1895,@1891 1891:O3|@1896,@450,@449 1892:O2|1,@1893 1893:O3|2,@1894,0 1894:O4|0,@14368,3,1 1895:O4|1,@14369,0,0 1896:S40|506f6c794d4c2e4e616d6553706163652e5369676e6174757265732e7369676e617475726556616c 1897:O2|@1918,@1917 1898:O2|@1900,@1899 1899:O3|2,@956,@1901 1900:S6|616c6c56616c 1901:O5|5,@1902,@1028,@1026,@423 1902:O2|@1903,0 1903:O3|3,@1904,@428 1904:O2|@1865,@1905 1905:O2|@1906,0 1906:O2|50,@1907 1907:O5|5,0,@1909,@1908,@423 1908:O3|@1909,@423,@1910 1909:S5|76616c7565 1910:O3|@1912,@1915,@1911 1911:O3|@1916,@450,@449 1912:O2|1,@1913 1913:O3|2,@1914,0 1914:O4|0,@14370,3,1 1915:O4|1,@14371,0,0 1916:S29|506f6c794d4c2e4e616d6553706163652e56616c7565732e76616c7565 1917:O2|@1928,@1927 1918:O2|@1920,@1919 1919:O3|2,@956,@1921 1920:S7|616c6c54797065 1921:O5|5,@1922,@1028,@1026,@423 1922:O2|@1923,0 1923:O3|3,@1924,@428 1924:O2|@1865,@1925 1925:O2|@1926,0 1926:O2|50,@1831 1927:O2|@1948,@1947 1928:O2|@1930,@1929 1929:O3|2,@956,@1931 1930:S8|616c6c46756e6374 1931:O5|5,@1932,@1028,@1026,@423 1932:O2|@1933,0 1933:O3|3,@1934,@428 1934:O2|@1865,@1935 1935:O2|@1936,0 1936:O2|50,@1937 1937:O5|5,0,@1939,@1938,@423 1938:O3|@1939,@423,@1940 1939:S10|66756e63746f7256616c 1940:O3|@1942,@1945,@1941 1941:O3|@1946,@450,@449 1942:O2|1,@1943 1943:O3|2,@1944,0 1944:O4|0,@14372,3,1 1945:O4|1,@14373,0,0 1946:S36|506f6c794d4c2e4e616d6553706163652e46756e63746f72732e66756e63746f7256616c 1947:O2|@1952,@1951 1948:O2|@1950,@1949 1949:O3|2,@1862,@956 1950:S8|656e746572466978 1951:O2|@1956,@1955 1952:O2|@1954,@1953 1953:O3|2,@1883,@956 1954:S8|656e746572536967 1955:O2|@1960,@1959 1956:O2|@1958,@1957 1957:O3|2,@1903,@956 1958:S8|656e74657256616c 1959:O2|@1980,@1979 1960:O2|@1962,@1961 1961:O3|2,@956,@1963 1962:S9|616c6c537472756374 1963:O5|5,@1964,@1028,@1026,@423 1964:O2|@1965,0 1965:O3|3,@1966,@428 1966:O2|@1865,@1967 1967:O2|@1968,0 1968:O2|50,@1969 1969:O5|5,0,@1971,@1970,@423 1970:O3|@1971,@423,@1972 1971:S12|73747275637475726556616c 1972:O3|@1974,@1977,@1973 1973:O3|@1978,@450,@449 1974:O2|1,@1975 1975:O3|2,@1976,0 1976:O4|0,@14374,3,1 1977:O4|1,@14375,0,0 1978:S40|506f6c794d4c2e4e616d6553706163652e537472756374757265732e73747275637475726556616c 1979:O2|@1984,@1983 1980:O2|@1982,@1981 1981:O3|2,@1923,@956 1982:S9|656e74657254797065 1983:O2|@1991,@1990 1984:O2|@1986,@1985 1985:O3|2,@500,@1987 1986:S9|6c6f6f6b7570466978 1987:O5|5,@1989,@1988,@1845,@423 1988:S6|6f7074696f6e 1989:O2|@1867,0 1990:O2|@1997,@1996 1991:O2|@1993,@1992 1992:O3|2,@500,@1994 1993:S9|6c6f6f6b7570536967 1994:O5|5,@1995,@1988,@1845,@423 1995:O2|@1887,0 1996:O2|@2003,@2002 1997:O2|@1999,@1998 1998:O3|2,@500,@2000 1999:S9|6c6f6f6b757056616c 2000:O5|5,@2001,@1988,@1845,@423 2001:O2|@1907,0 2002:O2|@2007,@2006 2003:O2|@2005,@2004 2004:O3|2,@1933,@956 2005:S10|656e74657246756e6374 2006:O2|@2013,@2012 2007:O2|@2009,@2008 2008:O3|2,@500,@2010 2009:S10|6c6f6f6b757054797065 2010:O5|5,@2011,@1988,@1845,@423 2011:O2|@1831,0 2012:O2|@2017,@2016 2013:O2|@2015,@2014 2014:O3|2,@1965,@956 2015:S11|656e746572537472756374 2016:O2|@2022,0 2017:O2|@2019,@2018 2018:O3|2,@500,@2020 2019:S11|6c6f6f6b757046756e6374 2020:O5|5,@2021,@1988,@1845,@423 2021:O2|@1937,0 2022:O2|@2024,@2023 2023:O3|2,@500,@2025 2024:S12|6c6f6f6b7570537472756374 2025:O5|5,@2026,@1988,@1845,@423 2026:O2|@1969,0 2027:O2|@1859,@2028 2028:O2|@1880,@2029 2029:O2|@1900,@2030 2030:O2|@1920,@2031 2031:O2|@1930,@2032 2032:O2|@1950,@2033 2033:O2|@1954,@2034 2034:O2|@1958,@2035 2035:O2|@1962,@2036 2036:O2|@1982,@2037 2037:O2|@1986,@2038 2038:O2|@1993,@2039 2039:O2|@1999,@2040 2040:O2|@2005,@2041 2041:O2|@2009,@2042 2042:O2|@2015,@2043 2043:O2|@2019,@2044 2044:O2|@2024,0 2045:S26|506f6c794d4c2e4e616d6553706163652e6e616d655370616365 2046:O3|@2048,@2128,@2047 2047:O3|@1988,@450,@449 2048:O2|1,@2049 2049:O3|2,@2051,@2050 2050:O2|@2076,0 2051:O4|@2053,@14376,@2071,@2052 2052:O1|@2074 2053:O1|@2054 2054:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@2056,@2055| 2055:D4,104|00812c2c1a69000e0e0c000303033c02372c1a63000c00021a65000e0e0c000203252b1a52000e0e0e0c00021a51000e0e0c0002030e5607352d352d352b2e0e7e0500033b02013b430e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@2057,I251,I105,I218| 2056:S15|65712d6f7074696f6e283229285029 2057:S12|65712d6f7074696f6e283229 2058:O1|@2059 2059:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@2061,@2060| 2060:D14,304|00802b363c1a30010e0c000303051a2f010fde2b35293b1a2e010e0e0e0c00036403051a2a010fdd2b363c1a0a010e0e0e0c000303051a1f0102d75607362c3529352e363c1a18010e0c00032a2a69662a0c00026429353b1aed000e0e0c000303952939291a00010e0c00021a01010e0e0c0002035f29361aed000e0e0c00021aed000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1aa5000e0e0c000202013b02013b031b2a1a9c00691aa0002a691aa3002a693b3e3c3b2d68056602031f002a64020129293b691a92002a691a950002020b002a693b3c3b3b2d68052705420e0e0e0e0e000000000000000020010000000000000000000000000000|@2063,I234,@854,I251,@2064,@854,I107,I105,I218,@900,@901,@873,@871,@2062| 2061:S13|7072696e746f7074696f6e2829 2062:O5|0,0,0,@423,@2068 2063:S12|7072696e742d6f7074696f6e 2064:O5|0,0,0,@423,@2065 2065:O2|@2066,0 2066:O2|3,@2067 2067:S4|4e4f4e45 2068:O2|@2069,0 2069:O2|3,@2070 2070:S4|534f4d45 2071:O1|@2072 2072:D1,32|00803e420e0e0e0e000000000000000010000000000000000000000000000000|@2073| 2073:S12|626f7865642d6f7074696f6e 2074:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@2075| 2075:S11|73697a652d6f7074696f6e 2076:O4|@14321,69,@2077,0 2077:O3|2,4,@2078 2078:O6|@607,@583,@2080,@1143,@2079,@581 2079:O12|@2118,@2120,@2119,@2122,@2124,@2126,@2117,@2053,@14376,@2071,@2052,@2051 2080:O2|@627,@2081 2081:O2|@2083,@2082 2082:O2|@1132,@2109 2083:O2|@1055,@2084 2084:O3|0,@2085,@609 2085:O8|@2087,@2056,0,0,@2086,0,0,1 2086:O2|@2101,0 2087:O2|7,@2088 2088:O8|@2090,@2057,0,@1123,@2089,0,0,1 2089:O2|@574,@2100 2090:O4|1,@534,@475,@2091 2091:O4|1,@545,@2092,@542 2092:O4|1,@544,@2093,@542 2093:O4|3,@2094,@1101,1 2094:O2|@2096,@2095 2095:O2|@2098,0 2096:O2|@2097,1 2097:O4|6,@472,0,1 2098:O2|@2099,1 2099:O4|6,@540,0,1 2100:O2|@574,0 2101:O2|1,@2102 2102:O2|@2103,0 2103:O3|2,0,@2104 2104:O2|@2105,0 2105:O3|0,@2107,@2106 2106:O2|@2097,@2108 2107:O2|@577,@655 2108:O2|@2099,0 2109:O2|@2111,@2110 2110:O2|@2114,0 2111:O2|@1137,@2112 2112:O3|0,@2113,@609 2113:O8|@808,@2073,0,0,@470,0,0,1 2114:O2|@1141,@2115 2115:O3|0,@2116,@609 2116:O8|@475,@2075,0,0,@470,0,0,1 2117:O3|@2122,@2124,@2126 2118:O3|@2051,@2119,@2117 2119:O2|@2120,0 2120:O1|@2121 2121:D2,40|00802b3b1a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@2067,I251| 2122:O1|@2123 2123:D3,48|00802b1a32000e0e0e0c00021a31002c0e8000020e0e0e0e000000000000000020000000000000000000000000000000|@2070,I105,I218| 2124:O1|@2125 2125:D1,32|00802b6801420e0e000000000000000010000000000000000000000000000000|@2070| 2126:O1|@2127 2127:D1,32|00802b35420e0e0e000000000000000010000000000000000000000000000000|@2070| 2128:O4|1,@14377,1,0 2129:O2|49,@2130 2130:O2|50,@2131 2131:O2|51,0 2132:O2|@2134,@2133 2133:O2|@2135,0 2134:S4|6e616d65 2135:O4|@14310,69,@2136,0 2136:O7|@2134,2,@2138,@2137,@423,0,0 2137:O3|2,@1831,@500 2138:O2|1,@2139 2139:O3|2,@2140,0 2140:O1|@2141 2141:D1,32|00802b3529356442000000000000000010000000000000000000000000000000|@2142| 2142:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7254797065283129 2143:O2|@1833,@2144 2144:O2|@2145,0 2145:O4|@14314,69,@2146,0 2146:O2|@1832,0 2147:O2|@2149,0 2148:S10|70726f70657274696573 2149:O4|@14310,69,@2150,0 2150:O7|@2148,2,@2152,@2151,@423,0,0 2151:O3|2,@1831,@1261 2152:O2|1,@2153 2153:O3|2,@2154,0 2154:O1|@2155 2155:D2,40|00802b352936291a26002e0e7d050002000000000000000018000000000000000000000000000000|@2157,@2156| 2156:O1|@2158 2157:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7254797065436f6e737472283129 2158:D6,216|00802b1ada000e0e0e0c00021ad9000e0e0c000203a12b352c362a353d1ad0000e0c0003031a2a36280b2a69291ab0000e0c000203041abf00103b50296502662a353e1aaa000e0e0e0c0003031a2a36280c2a69291a88000e0c000203041a9700103b502965023e2a353c1a82000e0e0e0c0003031a2a3628062a69291a60000e0c000203041a6f00103b50296502162a363d2a69291a47000c000203041a5700103b5029652a1a56000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@1399,I105,I218,I251,@1363,@2156| 2159:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 2160:O4|11,@49,0,@2162 2161:S35|5354525543545f56414c5328292e6d616b65456d707479476c6f62616c283129283129 2162:O5|@1380,533,0,533,0 2163:O2|@1849,@2164 2164:O2|@2165,0 2165:O4|@14314,69,@2166,0 2166:O2|@1848,0 2167:O2|@2169,@2168 2168:O2|@2170,0 2169:S10|53747275637475726573 2170:O4|@14325,69,@2171,0 2171:O4|@2169,@694,@2172,@423 2172:O6|@2174,I48,0,@423,@2173,0 2173:O1|@5354 2174:O4|1,@14379,@14380,@14378 2175:O1|@2176 2176:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 2177:O2|@5331,@5330 2178:O2|@1971,@2179 2179:O2|@2180,0 2180:O4|@14314,69,@2181,0 2181:O2|@1970,0 2182:O2|@1308,@2183 2183:O2|@2184,0 2184:O4|@14310,69,@2185,0 2185:O7|@1308,2,@2187,@2186,@423,0,0 2186:O3|2,@5307,@924 2187:O2|1,@2188 2188:O3|2,@2189,0 2189:O1|@2190 2190:D2,48|00802b352c362d371a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@2192,@2191| 2191:O1|@2193 2192:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283129 2193:D19,448|00822b1ac2010e0e0e0c00021ac1010e0e0c000203122b351abd012a691ac0012b692a2a696602031abd012e352f373038303b1aba010e0e0e0c000303051ab7010fd929291a80010e0c00021a81010e0e0c0002031f29352a362a353b1aa0010e0c000303052a68010207292503511e2b3b6502013b64291a4d010e0e0c00021a4d010e0e0c00020311293529353b1a6e010e0e0e0c00036402013b031c293529363b2a69291a1f010c000203041a5701103b50293b696602013b3e2e69291a06010e0e0e0c000203041a4301103b50293b693b3b3b2e2d6805291aea000e0e0e0c000203041a2701103b50291a2801691a2c012a691a2f012a693b3b3b3b2d6805291ac2000e0e0e0c000203041aff00103b5022103c1a1601020285000e0e0e0c00033436291a0e011ad3000c000303033c0222291a8f000c00021a91000e0e0c00020310293b1aed003b28081aef000c000602013b0311220c2b3c22113b1ae5000e0e0c000602143e2a69291a57000c000203041a9700103b502964293b691acc002a692e2a693b3b3b3b2d6805291a34000e0c000203041a7300103b502927102704440e0e0000000000000000b0010000000000000000000000000000|@2195,I105,I218,@2196,@2197,@2198,I232,@854,I251,@1363,@1363,@2203,@871,@2206,I107,I48,I154,@2194,@1404| 2194:O1|@2208 2195:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283329 2196:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 2197:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 2198:O2|@2200,@2199 2199:O1|@2202 2200:O1|@2201 2201:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 2202:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 2203:O2|@901,@2204 2204:O2|@2205,0 2205:O2|3,58 2206:O2|3,@2207 2207:S9|737472756374757265 2208:D22,320|00842f3530392e352f36040d002d2a1a36010e0e0e0c0003502923082a230c321a2d010e0e0c00021a2d010e0e0c0002030e32351a2901302b6a2968016502032e68011a22012a302e6b1a23012b302e6b2a2a692b2b6922113c1a1b010c000303051a1b01028f3c28403b1a1a010e0e0e0c00041a19012a69220d3b2b1a18010e0c0004502a3b1a16010e0e0e0c0003291a14011a19010e0e0c0003293b2a1aae000e0e0e0c00021aad000e0e0c000203412a352b362a352b36221b1af900220d2211220e1af8000e0c00082c3b1af7000c0003030329020b292d1af2000e0e0e0c00032b2a2506250626041e4e3b27040201292706291ade000e0e0e0c00021add002a693b3b3c3b2d6805291a40000e0c000203041acf00103b502927101f050e0e0e0e0e0e0e000000000000000030010000000000000000000000000000|@2210,@1571,I105,I218,@2211,@2212,@2214,I232,@2215,I11,@2216,@1633,I253,@2217,@1497,@2194,@2222,I251,@5302,@5304,@2209,@1363| 2209:O2|3,@5306 2210:S25|56414c55455f4f505328292e646973706c6179536967283529 2211:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 2212:D3,80|00802b56190c0002291a4c000e0c00021a4d000e0e0c0002030c29352956376929680165020a2c56282d0e0e7d04000264420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@2213,I105,I218| 2213:S41|56414c55455f4f505328292e646973706c6179536967283529636f6d706f73697465456e762d283129 2214:D3,80|00802b56190c0002291a4c000e0c00021a4d000e0e0c0002030c29352956376929680165020a2c56282d0e0e7d04000264420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@2213,I105,I218| 2215:O2|@871,@1453 2216:D5,104|00822c2c2a1a68000e0c00021a69000e0e0c000203322a352b36312b6956573b1a5d000e0e0c00032a2a6956773b2b1a56000e0e0e0c0004502c3b2507250726051e3d3b270502012965440e0e0e0e0e000000000000000058000000000000000000000000000000|@1636,I105,I218,I253,I255| 2217:O1|@2218 2218:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@2220,@2219| 2219:D2,48|00802b35561735292b1a2c002f0e0e0e7e0500030e0e0e0e000000000000000020000000000000000000000000000000|@2221,I26| 2220:S33|56414c55455f4f505328292e646973706c61795369672835296f72646572283129 2221:S36|56414c55455f4f505328292e646973706c61795369672835296f72646572283129283129 2222:O1|@2223 2223:D34,1048|00863035291a18041a1d040e0e0c00036407d130351a08041a0d040e0e0c000303043b5002041a0704103037303c1a07040c00032a362b382b3b1a03040c000303051a03040fdc29291a04040e0c00021a05040e0e0c0002031f29352a362a353b1ac4030e0c000303052a68010207292503511e2b3b6502013b64291ad1030e0e0c00021ad1030e0e0c00020311293529353b1a92030e0e0e0c00036402013b031c293529363b2a69291aa3030c000203041aab03103b50293b696602013b3e2d69291a8a030e0e0e0c000203041a9703103b50293b693b3b3b2e2d6805291a6e0302027d000e0e0e0c000203041a7703103b50291a7803691a7c032a691a7f032a693b3b3b3b2d6805291a42030e0e0e0c000203041a4f03103b50220c220c3c0202320022143b22170e0e0e0c0006293b691a52032a692c2a693b3b3b3b2d6805291a0a030e0e0e0c000203041a1703103b5029270e293b691a33032a6927060fdd3035291a2f031abc020e0c00036407d930351a20031aad020e0e0c000303043b5002041aa702103037303c1aa7020c00032a352b372c382c3b1aa1020e0e0c000303051af7020fcd29291aa0020e0c00021aa1020e0e0c0002031f29352a362a353b1a60020e0c000303052a68010207292503511e2b3b6502013b64291a6d020e0e0c00021a6d020e0e0c00020311293529353b1a2e020e0e0e0c00036402013b031c293529363b2a69291a3f020c000203041a4702103b50293b696602013b3e2e69291a26020e0e0e0c000203041a3302103b50293b693b3b3b0202ba012e2d6805291a06020202d1000e0e0e0c000203041a0f02103b50291a4802691a4c022a691a4f022a693b3b3b3b2d6805291ada01020299000e0e0e0c000203041ae301103b50220c3c1aaa010e0e0e0c00033436291a26021a8b010c000303033c0222291aa7010c00021aa9010e0e0c00020310293b1a05023b28081a07020c000602013b0311220c2b3c22172217221a0e0e0c000602143e2a69291a6f010c000203041a7f01103b502964293b691adc012a692e2a693b3b3b3b2d6805291a4c010e0c000203041a5b01103b50292710293b691abf012a6927070fca3035291abb011a00010e0c000364033030351aac011af1000e0e0c000303043b5002041aeb0010303729312e301a99010e0e0c0005293b691a96012a6966029d3035291a93011ac0000e0c000364034930351a84011ab1000e0e0c000303043b5002041aab001030372936291ac2000e0e0e0c00021ac1000e0e0c000203033b02142a3231311a58010e0c0005293b691a56012a69656502443035291a52011a67000c000364033430351a44011a59000e0e0c000303043b5002041a530010303729352a361a3101020211000e0e0c0003293b691a2a012a696602013b1f070e0e000000000000000008040000000000000000000000000000|@2225,@14351,I251,@1576,I107,I232,@854,I105,I218,@1363,@1363,@1400,@871,@2226,@1404,@1404,@14325,@854,@2203,@871,@2206,I48,I154,@1404,@1404,@14314,@1316,@1404,@14310,@2228,@1404,@14350,@2224,@1404| 2224:O1|@5294 2225:S39|56414c55455f4f505328292e646973706c6179536967283529646973706c617953706563283229 2226:O2|3,@2227 2227:S9|7369676e6174757265 2228:O1|@2229 2229:D28,824|00832e352f36303731383239313532362a2a69220c3b1a27030c000303051a27030fce2f3c1a28030e0c0003034f1a27033c2e331a29030e0e0c00053b1a28030e0c00022f220f2b2e22101a22030e0e0e0c0006293b691a1e032a692d2a693b3e3b3b2d6805291a16030e0e0e0c000203041a1303103b502927070fda2f1aff020c00021a09030e0e0c0002034f1a07033c2e331ac9020e0e0c00053b1ac8020e0c00022f220f2b2e22101ac2020e0e0e0c0006293b691ae6022a692d2a693b3e3b3b2d6805291ab6020e0e0e0c000203041ab302103b502927070fd92f3b1a6e020e0e0e0c000307ce2c291a9102020228020e0e0c00021a95020e0e0c0002031f29352a362a353b1a44020e0c000303052a68010207292503511e303b6502013b64291a59020e0e0c00021a61020e0e0c00020311293529353b1a12020e0e0e0c00036402013b0320293529363b2a69291a2b020202c2010c000203041a4702103b50293b696602013b3e3369291a0e020e0e0e0c000203041a0b02103b50293b693b3b3b2e2d6805291af2010e0e0e0c000203041aef01103b50293b691a0e022a691a11022a693b3b3b3b2d6805291acc01020463018f000e0e0e0c000203041ac301103b50220d1af3010c000229353d1a7a010e0e0e0c0003030829362968016402013b291a95010e0e0c00021a9d010e0e0c0002033029353b1a68010e0c00022a221a2b2210221b1a61010e0e0c0006293b691aae012a691ab1012a691ab4012a69270602013b2c2a693b3b3b3b2d6805291a47010c000203041a4701103b5029270e02d22e353c1a01010e0e0c0003031c2e3629353d1af2000e0e0e0c0003030829362968016402013b6402013b291a09010e0e0c00021a11010e0e0c0002032f29351a55013b30220c1ace000e0e0e0c00052a3122111a49010e0e0c0004291a4801691a4c012a692c2a69270502131a48013c2f341aa2000e0e0e0c0005293b69643b1a9c000e0c00023022102b2f22111a96000e0e0e0c0006293b691a22012a69293b1a63000c000303032d020b2d2a1a16010e0e0e0c00033b3e3b3b2d6805291a75000e0e0c000203041a7300103b5029270827081f040e000000000000000028030000000000000000000000000000|@2231,I232,@854,I251,@2232,@2233,@1330,@1469,@871,I105,@1363,I218,@2238,@871,@1363,@871,@2239,@1435,@2241,@1457,@2242,@2232,@2243,@2204,@871,@2232,@871,@2230| 2230:O1|@5293 2231:S28|56414c55455f4f505328292e646973706c617956616c756573283429 2232:S3|76616c 2233:O1|@2234 2234:D9,336|00830402002e030d1a4d012a2a35452a364651020b1a48012a2a35452a36465129352a363e3269291a3d010e0e0c000203041a3b01103b5030291a2b010c00021a35010e0e0c0002031f29352a362a353b1a2c010e0c000303052a68010207292503511e2a3b6502013b64291af9000e0e0c00021a01010e0e0c00020311293529353b1afa000e0e0e0c00036402013b031c293529363b2a69291acb000c000203041ae300103b50293b696602013b3e3269291ab2000e0e0e0c000203041aaf00103b50293b693b3b3b2e2d6805291a96000e0e0e0c000203041a9300103b503c313b6a291a80000e0c000203041a7f00103b503e3169291a6d000e0e0c000203041a6b00103b50293b692b2a692d2a691a7c002a69342a693b3b3b3b2d6805291a44000e0c000203041a4300103b502927111f040e0e0e000000000000000040010000000000000000000000000000|@2236,@2237,@2235,I105,@1363,I218,I251,@1363,@871| 2235:O2|1,61 2236:S38|56414c55455f4f505328292e646973706c617956616c75657328342976616c50617274283229 2237:O2|0,58 2238:S11|636f6e7374727563746f72 2239:O2|3,@2240 2240:S9|657863657074696f6e 2241:O3|1,1,3 2242:O3|1,1,1 2243:O1|@2244 2244:D23,432|00823c28403b1aaf010c00041ab1012a693c28403b1aa0010e0c0004291aa8012c1aac016b293b69040200321aa9012b1aad010e0e0c0004502936291aa9010e0e0c0002291aa8010e0c00021aa901220e692a1aaa010e0e0e0c0002291a6801312d1aa3010c0005220f1a5b01321a9f010c00043d22103b6a293b692c2a69280e2a3b6a2a291a8f010c00021a91010e0e0c0002031d29352a362a353d1a88010e0c00030309292503511e253b02013b6502013c64030b291a75010e0e0c0002020129293b69291a6e010e0e0e0c00023e2a323c6b22101a3e010e0e0e0c00021a3d010e0e0c000203043b5002041a4f011022123b1a50010e0c0003291a50010e0c0002293b2a1a0e010e0e0e0c00021a0d010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1af2000e0e0e0c000303032c0204402a2e6a22183b1afd000e0e0c00032a3b2b1a02010e0e0e0c00043b2a0e0e0e0c00026429353d1abd000e0e0c0003030829362968016402013b293b1aa8000e0c000303041ad700103b502935271c440e0e0e0e0e0e0e0000000000000000a0010000000000000000000000000000|@2246,I11,@2247,@2249,@473,@2259,@1414,@2262,@2264,@2266,@2268,@2270,@2667,I105,I218,I251,@2349,@2273,@2773,I253,@2776,@2245,@1792| 2245:O3|@2778,@14413,@14384 2246:S32|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329 2247:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@2248,I253,I106,I255| 2248:S41|56414c55455f4f505328292e7072696e7456616c7565466f72547970652833296d6b41646472283129 2249:O3|0,@2250,@14382 2250:O1|@2251 2251:D6,96|00802b352c362d372a3b1a5b000c0003030c293b1a59000e0e0c000302013b03043b5002041a5000102b3b1a52000e0e0e0c000303041a4f00103b503d2c6966420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@2253,I113,I251,@2254,I234,@2252| 2252:O4|@14322,@596,@2258,@2257 2253:S25|434f44455452454528292e626f74746f6d4c6576656c283129 2254:O4|@14322,@596,@2256,@2255 2255:O5|@598,90,0,90,0 2256:S12|626f74746f6d206c6576656c 2257:O5|@598,87,0,87,0 2258:S14|6c6f61643a206e65676174697665 2259:O1|@2260 2260:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2261| 2261:S46|56414c55455f4f505328292e7072696e7456616c7565466f725479706528332964756d6d7954797065732d283129 2262:O1|@2263 2263:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a362a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@2262| 2264:O1|@2265 2265:D7,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203352b352c362a36293f1a5f000c0003293b1a5f000c0003641a48000e0c00021a59002a3b6a2c1a5a000e0e0e0c00022a2a69270602013b420e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I243,I251,@956,@2264| 2266:D1,32|00803d56173b6a42000000000000000010000000000000000000000000000000|@2267| 2267:S44|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329706f6c79436f64652d283129 2268:O1|@2269 2269:D4,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203252b352c362a360310291a4e000e0e0e0c00022b2a6964020a291a3e002e0e7d0500026502013b420e0e0e000000000000000048000000000000000000000000000000|@283,I105,I218,@2268| 2270:O7|@2272,@2463,@2569,@2651,@2664,@2667,@2271 2271:O2|7,@2772 2272:D4,96|00832e3b1a61000e0e0c0003030a2d2c2c0e0e0e7d0600022d2c0e0e0e0c00022f5627563856493232567a568b569c1a3e000e0e0e0c000a291a3c000e0c00023e2a2d3c6b661f04000000000000000050000000000000000000000000000000|@2274,I251,@2275,@2273| 2273:O1|@2462 2274:S32|545950454944434f444528292e6170706c79546f496e7374616e636527283429 2275:O1|@2276 2276:D5,120|0088331a7a000e0e0e0c00021a79000e0e0c00020341333534362a352b362c37220e220e220e220e220e220e220e220e1a5d000e0e0c000c2a220d220d220d220d220d220d220d220d1a4c000e0c000a2a2a69270402013b1f090e0e0e0e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,@2277,@2275| 2277:O1|@2278 2278:D20,600|008a3403033c02013303ae340318220c301a4c0231220d220d220d1a4a020e0e0e0c000802012d220d311a430232220e220e220e1a41020e0e0c0008220c030a220e3232310c000402012d220f331a1f02342210221022101a25020e0e0c0008293b692c2a692c2a692f2a69280e2a3b6a2a291a12020e0e0e0c00021a11020e0e0c0002031d29352a362a353d1a08020e0c00030309292503511e283b02013b6502013c64030d291af501220c0e0e0e7d1600022927090fcd2e220d3434341ae6010e0e0e0c0006293b1acb010c000307cd220d3c31220d220d220d1ad1010e0e0c00073b31291a9e010e0e0e0c00021a9d010e0e0c0002031729362b3c1ab7010c0003292b25042504511e253b6502012a65292b1aa8010e0c0003040300332b2a1a63010c00021a65010e0e0c000203043b5002041a8f01103b502a352b362b3b1a8b010c0003030e2a2e2a35452a36462a37475102132b3c1a63010c00032a2a2505250526031e4750260429352a362b3722142b1a5f0122102215221522151af4000202b5000e0c000822152c1a4e0122112216221622161ae30002028e000c0008293b692b2a69220e2a6922112a69280e2a3b6a2a1acd000e0e0c00021acd000e0e0c00021ac5000e0e0c0002030c291aca000e0e0e0c00020201293c320c00023c3b2b2d6b221e2b2b6a220d3b1af4000e0c00032a2a69220f3b2b1aee000e0e0e0c000450221b35221c362210352b2a1aa9000e0e0c0003312a3b6a642b0e0e0e0c00023f2a692718020d29352935322a2f0e0e7d100002641f0b0e000000000000000048020000000000000000000000000000|@2280,@2281,@2313,@2441,@2374,@2390,I105,I218,I251,@2349,@2351,@2446,I106,I107,@611,I113,@2453,@2279,I253,I255| 2279:O1|@2458 2280:S52|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329 2281:O1|@2282 2282:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@2284,@2283| 2283:O1|@2285 2284:S62|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296571436f64652d283129 2285:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@2283,@2288,I253,I107,@2286| 2286:O4|@14322,@596,@2311,@2310 2287:S28|545950454944434f444528292e636f64654163636573732832292829 2288:O1|@2289 2289:D28,760|00822d353d1af8020e0c000307db2d362e3729291af1020e0e0c00021af1020e0e0c0002032429352a362a35291ae8021acd020e0e0c00036403052a68010207292503511e313b6502013b64291ab8020e0c00021ab9020e0e0c00020366293529351ab3021a98020e0c000303043b5002041aab0210293729322a1a8a020e0e0e0c00021a89020e0e0c000203043b5002041a9302102a352b362b3b1a91020e0e0c000303032a02172b3c1a8a020e0e0e0c00032a2a2505250526031e423b64270602013b2b291a3e020e0e0e0c00021a3d020e0e0c0002033e29352a362a35291a5c021a1902020232010e0e0c000364031b2a351a48021a05020e0e0c000303043b5002041a1702102a370207292503511e4c3b6502031a2d026429353d1ade010e0e0e0c000303362937322a0e0e0e0c0002293529353b1ac4010e0c000303043b5002041a07021029362a372c362a2a1a03020c00033d2d2b6a270702b92d1aa4010e0c000203033c02682d1a97010c000203041ae701103b502d1ae8010e0c0002293e1ae7010c0003293b1a6f010c0003651a78010e0c000203033c02342d1a63010c000203041acb01103b502d1acc010e0c0002321a4c010e0c00020303320207321abf010c00022a2a1abf010c00036503103003043b5002041ab701101abb0102322d1a1d010e0e0c000203041ab301103b50311a0c010e0c00020303310207311a7f010c00022e2a1a9f010c00033d2a2e6a65270502be2d35280e1adc000e0c000303ab2d362e37292e1acd000e0e0c000303043b5002041a7701103b2b291ac0000e0c00021ac1000e0e0c0002031729362b3c1a63010c0003292b25042504511e233b6502012a652f2a1a54010e0c00036403492a2f2a1a87000c00021a89000e0e0c000203043b5002041a9300102a352b362b3b1a91000e0e0c000303032a02172b3c1a8a000e0e0e0c00032a2a2505250526031e3f3b642704020e2d03043b5002041a0201101ace0065020628062e2e2e6b440e0e0e0e0000000000000000e8020000000000000000000000000000|@2291,I251,I105,I218,@14320,@1576,@611,I113,I107,@14321,@588,@2292,@2296,@1363,I17,I243,@1363,I15,I152,I248,@2299,@2302,@1363,I253,@2306,I106,I234,@2290| 2290:O4|@14322,@596,@2301,@2309 2291:S40|434f4445545245455f46554e4354494f4e5328292e66696e64456e747279496e426c6f636b283329 2292:O4|@14322,@596,@2294,@2293 2293:O5|@2295,309,0,309,0 2294:S30|66696e64456e747279496e426c6f636b3a206e6f7420636f6e7374616e74 2295:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f46554e4354494f4e532e736d6c 2296:O1|@2297 2297:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@2296| 2298:S35|434f4445545245455f46554e4354494f4e5328292e736574496e6c696e652832292829 2299:O4|@14322,@596,@2301,@2300 2300:O5|@2295,323,0,323,0 2301:S33|66696e64456e747279496e426c6f636b3a20696e76616c69642061646472657373 2302:O2|11,@2303 2303:O3|2,@2304,0 2304:O4|@14322,@596,@2305,0 2305:S36|496e76616c6964206c6f616420656e636f756e746572656420696e20636f6d70696c6572 2306:O4|@14322,@596,@2308,@2307 2307:O5|@2295,281,0,281,0 2308:S41|66696e64456e747279496e426c6f636b3a207475706c652f6461746174797065206d69736d61746368 2309:O5|@2295,288,0,288,0 2310:O5|@2312,83,0,83,0 2311:S9|4e6f20616363657373 2312:S34|6d6c736f757263652f4d4c436f6d70696c65722f545950454944434f44452e736d6c 2313:O1|@2314 2314:D25,608|008631353e1a60020e0c000307de3136291a5c020e0c00021a5d020e0e0c0002030d2936293b1a3f020c00036402013b031629352936293434343434341a4002220c0e7b090c0008313532363c28403b1a35020e0e0c00041a35022a2c6a2c3c1a35020e0e0c0003292b2d6a2f3b1a0f02220e220e220e2f221422141a21020e0e0c000a2d3b1a1f020c0003293b2a1ade010e0e0e0c00021add010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291af0010e0c0002291af0010e0c00023d1af0011af5010e0e0c00032e1af4013b2d2d3c3b3c680828072a69270e0fcc0000313528051a73010c00030382313632382937293629353d1a60010e0c00036503552937293629353d1a4f010c000303043b5002041ab301103b5029362a372a2f1aaf010c00031ab1012a690402002c2b2b1aae010e0e0e0c0004502935292212221222122212221222121a250122130e0e7b09130008292b313131220c220f1a100122101a8301220d7b0b0b000a313528061ae5000e0e0c000303043b5002041a6f01103b503136293b1a0d010e0e0c000329353c1ac2000e0e0e0c0003035430343131311a5201020287000e0e0e0c0006293b1aa3000c000303041a4301103b503b5029352935220c2a0c000229353d1a86000e0e0e0c0003030e293b3b1a2801340e0e7b050f000428062a3b3b6b2704023e29353f1a60000e0c00030322333b1a0d010e0e0c0003293b323232220d22101a5c0022111acf00220e7b0b0c000a293333333333331a4600347b090b0008651f070e0e0e0e0e000000000000000050020000000000000000000000000000|@2316,I251,I105,I218,@2313,I11,@2317,I106,@2327,I253,@2330,@2332,@2337,@1385,@2340,@1731,@1734,@2341,@1414,@2342,@2422,@2351,@2425,@2288,@2315| 2315:O11|@2428,@14318,@502,@14352,@1672,@14354,@1682,@14356,@1690,@14323,@510 2316:S22|545950454944434f444528292e6d616b654571283429 2317:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 2318:O4|@14322,@596,@2258,@2326 2319:S34|434f44455452454528292e6e65774c6576656c283129746869734c6576656c283129 2320:O4|@14322,@596,@2322,@2321 2321:O5|@598,104,0,104,0 2322:S34|6d6b4c6f61643a206c6576656c206d757374206265206e6f6e2d6e65676174697665 2323:O1|@2324 2324:D9,368|00812b3b1a71010e0e0c000329291a6f010c00021a71010e0e0c000203b729352a362a3529321a67010c000303033c029229353b1a59010e0e0c0003031b31353b1a4c010e0c0003030c293632361a47010c000302013b026a29353c1a31010e0e0c0003031b31353c1a24010e0c0003030c293632361a1f010c000302013b024229353d1a09010e0e0c0003031b31353d1afc000e0c0003030c293632361af7000c000302013b021a29353e1ae1000e0e0c0003030c31353e1ad4000e0c000302013b6403052a68010207292503511ec23b6502013b642d3b1a9c000e0c00032a3b1aab000c0003035d291a92000e0e0e0c00021a91000e0e0c0002033129352936293c1a99000e0e0c0003322a69292e69333b2b1a90000e0c0004502c3c1a7e000e0e0e0c00033c2a69270602162f3b69293b69303b2b1a6d000e0e0c0004501a6c006502082a3529363c2a696566430e0e0e0e0e0e0e000000000000000060010000000000000000000000000000|@2325,I253,I105,I218,I251,I113,I106,I255,@474| 2325:S36|434f4445545245455f46554e4354494f4e5328292e616464546f436c6f73757265283229 2326:O5|@598,101,0,101,0 2327:O1|@2328 2328:D10,160|0088331aa2000e0e0e0c00021aa1000e0e0c00020369333534362a3629313131220e220e220e22120e0c000828061a8700220f3b6b28061a860022103b6b293b692b2a69291a80000e0c00023e2a303c6b22133c1a79000e0e0c0003322a22152215221522152215221522151a69000e0e0c000a3c2c2b1a66006b270c02031a66001f090e0e0e0e000000000000000090000000000000000000000000000000|@2329,I105,I218,@472,@540,@2273,I106,@2327,@542,@475| 2329:S39|545950454944434f444528292e6d616b654571283429636f6d62696e65456e7472696573283229 2330:O1|@2331 2331:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363f2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@2330| 2332:O1|@2333 2333:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c362a353f1a58000e0c000303043b5002041a5300102a362a1a54000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@2334,@2332| 2334:O4|@14322,@596,@2336,@2335 2335:O5|@598,79,0,79,0 2336:S9|646545787472616374 2337:O1|@2338 2338:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2339:S33|434f44455452454528292e6d6b53696d706c6546756e6374696f6e283629283129 2340:S10|65717b2e2e2e7d283229 2341:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2342:O1|@2343 2343:D12,296|00883337293629353c1a24010e0c000303112936291a20011a15010e0e0c00036402013b03033c026729353c1a01010e0e0c000303112936291a04011af1000e0e0c00036402013b03033c024329353c1add000e0e0c000303112936291ae8001acd000e0e0c00036402013b03033c021f29353c1ab9000e0e0c000303112936291acc001aa9000e0e0c00036402013b6403051ac200026f343729220c316a642d0c000229353d1a86000e0e0e0c0003030c293b3b1aa8000e0c0004020628062a3b3b6b220c1a9f000c00021aa1000e0e0c00021a99000e0e0c00020303290225220c220c220c220c220c220c220c220c1a84000e0c0009291a84000e0c00023e2a2d3c6b6565641f090e0e0e0e0e0e000000000000000018010000000000000000000000000000|@2345,I251,@14360,@14363,@14362,@14361,@535,@2288,I105,I218,@2344,@2273| 2344:O1|@2346 2345:S48|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229 2346:D5,104|0087321a6a000e0e0e0c00021a69000e0e0c00020331323533362a343434343434341a5b000c00092a220c220c220c220c220c220c220c1a4e000e0e0e0c00092a2a69270402013b1f080e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@2347,@2344| 2347:O1|@2348 2348:D11,248|0087323528061af7000c000303193236293b1af3000c000329353c1ae2000e0e0e0c00036502013b032e2e333333331ade000e0e0e0c0006293b1ac3000c000303041ad300103b503b5029352935302a2f0e0e0e7d0d0002322e2d31220c220c220c330e0e0c0008332f2e32220d220d220d1aab000c000834302f33220e220e220e1aa3000c0008293b692b2a691a9f002a692e2a69280e2a3b6a2a291a98000e0c00021a99000e0e0c0002031d29352a362a353d1a48000e0c00030309292503511e263b02013b6502013c640309291a7500347d1200022927081f080e0e0e0000000000000000e8000000000000000000000000000000|@2350,I251,I253,@2351,@2371,@2374,@2390,@542,I105,I218,@2349| 2349:O1|@2405 2350:S57|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229676574417267283129 2351:O1|@2352 2352:D17,576|00842e353d1a40020e0c000303101a3f022e69291a410269296801650fdc2e3528051a23020c000307d22e362f382937293629353d1a10020e0c00036503512937293629353d1aff010c000303043b5002041a0b02103b5029362a372a2f1a07020c00031a09022a690402002c2b2b1a06020e0e0e0c000450293522102a2210221022101af90122110e0e7b071100062a1af4010e0c00021af5010e0e0c00021aed010e0e0c000203d72e291ad9010e0e0c00021ad9010e0e0c0002039529352a362a3529372e372a3629353c1a78010e0c000303112a3629353c1a6a010e0e0e0c00036402013b64031d2a3629362b3629362b2a1a50010204280191000e0e0e0c0003270402392a3629353b1a38010e0c000303112a3629353b1a2a010e0e0e0c00036402013b6403152a3629382b3629382b2a1a60010e0c0003270402013b6603052a68010207292503511ea23b6502013b64293b1aee000e0e0e0c0003030a32321a3901307e0a0003293529361a35012a69291adf00692968012705020b31311a1a012f0e7e0900036502952e3528061ab2000e0e0e0c0003037a2e362f372a2a692b3b1a06010e0e0e0c000329353f1a92000e0e0e0c0003032a323b1af5000e0e0c0003293528053b2b2d3b6805220d2a220d220d220d1aa200220e0e0e0e7b070e000629353c1a5a000e0e0e0c00030310332b311ac4000e0c000429680164020e332a3333331a7200347b070b00062704020c2f2f1a83002d0e0e7e0700031f050e0e000000000000000030020000000000000000000000000000|@2354,I251,@2355,-1,@1731,@1734,@2357,@1414,@2351,I105,I218,I113,@2358,@2366,I253,@2315,@2353| 2353:O1|@2367 2354:S45|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229 2355:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@2356| 2356:S48|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229283129 2357:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2358:O1|@2359 2359:D8,232|00812c1aea000e0e0e0c00021ae9000e0e0c000203b62c352d362a35293b1adf000c00032c362a291ac5000e0e0c00021ac5000e0e0c0002032429352a362a3529220c1ac2000e0e0e0c00036403052a68010207292503511e313b6502013b64291a8c000e0c00021a8d000e0e0c0002034c293529361a97002a2e6a3b31291a6e000e0e0e0c00021a6d000e0e0c0002031729362b3c1a7f000c0003292b25042504511e253b6502012a65293c1a68000e0c00032b2a692968012706020a2d321a5d00337e0a0003270602013b430e0e0000000000000000d8000000000000000000000000000000|@2361,I105,I218,I253,@2362,@2360,I106,@2358| 2360:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@2365,I107| 2361:S65|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229 2362:O1|@2363 2363:D11,696|00812c1aba020e0e0e0c00022c1ab0020e0c00022a3528061aad020e0e0c0003030c293528061a9f020c000302013b03442a362a362a3b1a96020e0e0e0c00032a3b1a8b020c00032a353c1a7a020e0e0e0c0003030c29353c1a6c020e0c000302013b030b2c2c1a5e02330e7e0a00033b27040fdc2a353d1a4d020e0e0c0003030c29353d1a40020e0c000302013b03242a362b372b362c372c2b1a3a020e0e0e0c0003030a2b2a1a2d02337e0a00033b27040fdd2a353e1a0d020e0e0c0003030c29353e1a00020e0c000302013b03c82a362a362a2a2a3b1aec010e0c0003030a293b1ae101337e0a00032a352b362b1aec010e0c00021aed010e0e0c0002038e2b352c362c352d362c352d362c2b1ab5010e0e0c000303033c024e2c1abf010c00021ac1010e0e0c000203142a1aae010e0e0e0c00021aad010e0e0c000202013b03252c3b2c3b28082f1aa101020247010e0e0c00021a9d010e0e0c00031a9d010e0e0c000602013b030d2b2a1a66010e0e0e0c000302013b2704030d2b2a2506250626041eb03b02013b650205020206013b27060fd82a3528051a28010e0c0003030c293528051a1b010c000302013b07dd2a362b382b362c382b372a372a3629353c1aff000c000303112a3629353c1af2000e0e0e0c00036402013b6403152a3629362b3629362b2a1ad8000e0c0003270402392a3629353b1ac8000e0c000303112a3629353b1aba000e0e0e0c00036402013b6403152a3629382b3629382b2a1ae0000e0c0003270402013b65035c2c2b2a3b1a8d000e0e0c0003030e293b1a8100220c0e0e0e7e0c00032a352b362b1a88000e0c00021a89000e0e0c000203252b352c362c2b1a6900020227000e0e0c0003030d2b2a2506250626041e4c3b02013b6502013b27040205020205003b270402013b65430e0e0e0e0000000000000000a8020000000000000000000000000000|@2364,@1435,I251,I253,@2362,I105,I218,I223,I239,I154,I113| 2364:S56|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322973616d6554797065283229 2365:S68|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229283129 2366:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@2356| 2367:D7,248|00822d1afa000e0e0e0c00021af9000e0e0c000203bd2d352e362a3829353c1aee000e0e0e0c00030399293629291acf000c00021ad1000e0e0c0002032829352a362a352935220c352a2a1ac2000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1aa3000c0003030e2c32321aa000330e0e7b050a0004293529363b2f291a76000e0e0e0c00021a75000e0e0c0002031729362b3c1a7f000c0003292b25042504511e253b6502012a65293c1a68000e0c00032b2a692706020d2a30301a4f00310e7b050800046602091a52002c69293b6964440e0e0e0000000000000000e8000000000000000000000000000000|@2369,I105,I218,I251,@2353,I106,@2368| 2368:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@2370| 2369:S67|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229 2370:S70|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229283129 2371:O4|@14322,@596,@2373,@2372 2372:O5|@2312,635,0,635,0 2373:S6|676574417267 2374:O1|@2375 2375:D17,472|00862e322f2f2f1ad6010e0e0e0c0006293b1ad3010c000307dc32353e1ac8010e0c000303483236291ac4010e0c00021ac5010e0e0c0002030d2936293b1aa7010c00036402013b031e2935293629220c220c220c220c220c220c1aa201220d0e0e0e7b090d00081a9d01640fd8323528051a73010c0003038a323633382937293629353d1a60010e0c00036503552937293629353d1a4f010c000303043b5002041a6b01103b5029362a372a2f1a67010c00031a69012a690402002c2b2b1a66010e0e0e0c0004502935292213221322132213221322131a250122140e0e7b09140008292b34220d1a1401220c220c220c2210020292001a3501220e0e0e7b0b0c000a323528061add000e0e0c000303043b5002041a1f01103b503236293b1a1d010e0e0c000329353c1aba000e0e0e0c000303041a0f01103b503b5029353f1aa400020240000e0c00030326343b1afd000e0e0c0003293b220c220e1a9f00220d220d220d22111ac400220f0e7b0b0d000a293434343434341a8200220c0e0e0e7b090c0008022d29352935332a0e0c000229353d1a4e000e0e0e0c0003030e293d3b1ab000320e0e7b050d000428062a3d3b6b66641f070e0e0e0e0e0e0000000000000000c8010000000000000000000000000000|@2377,@2351,I251,I105,I218,@2374,@2378,@1731,@1734,@2379,@1414,@2380,@2385,I253,@2376,@2315,@2288| 2376:O4|@14322,@596,@2389,@2388 2377:S32|545950454944434f444528292e626f7865646e657373466f7254797065283429 2378:O3|2,2,0 2379:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2380:O1|@2381 2381:D7,144|008833372934336a64320e0e0e0c000229353d1a82000e0e0e0c0003030c293d3b1a7c000e0c0004020628062a3d3b6b341a74000e0c00021a75000e0e0c00021a6d000e0e0c000203032902213432323232220e2210341a5e000e0e0e0c0009291a5c000e0c00023e2a2d3c6b65651f090e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@2383,I251,@2288,I105,I218,@2382,@2273| 2382:O1|@2384 2383:S59|545950454944434f444528292e626f7865646e657373466f7254797065283429626f7865646e657373466f72436f6e737472756374696f6e283229 2384:D8,184|0087321aba000e0e0e0c00021ab9000e0e0c00020385323533362a303030220d220d220d22110e0e0e0c0008291aa000691aa4002a691a9f002a69280e2a3b6a2a291a7b000c00021a7d000e0e0c0002031d29352a362a353d1a84000e0c00030309292503511e253b02013b6502013c64030b291a71000e0e0c00020201292f22112211221122112211221122111a5f000c00092a2a69270902013b1f080e0e0000000000000000a8000000000000000000000000000000|@1399,I105,I218,@467,@542,I251,@2349,@2382| 2385:O4|@14322,@596,@2387,@2386 2386:O5|@2312,397,0,397,0 2387:S30|626f7865646e657373466f72547970653a20556e6b6e6f776e2074797065 2388:O5|@2312,381,0,381,0 2389:S43|626f7865646e6573733a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2390:O1|@2391 2391:D19,536|00862e322f2f2f1a16020e0e0e0c0006293b1a13020c000307d932353e1a08020e0c000303883236291a04020e0c00021a05020e0e0c0002030d2936293b1ae7010c00036402013b031e2935293629220c220c220c220c220c220c1ae201220d0e0e0e7b090d00083b2a291ac2010e0e0e0c00021ac1010e0e0c0002031729362b3c1ac3010c0003292b25042504511e253b6502012a65293f1ab4010e0c000303063d2a3b6a02031aad01650fd8323528051a73010c0003038a323633382937293629353d1a60010e0c00036503592937293629353d1a4f010c000303043b5002041a7b01103b5029362a372a2f1a77010202d5000c00031a75012a690402002c2b2b1a72010e0e0e0c0004502935292213221322132213221322131a210122140e0e7b09140008292b34220d1a1001220c220c220c22101a4501220e0e0e7b0b0c000a323528061add000e0e0c000303043b5002041a2f01103b503236293b1a2d010e0e0c000329353c1aba000e0e0e0c000303041a1f01103b503b5029353f1aa400020240000e0c00030326343b1a0d010e0e0c0003293b220c220e1a9f00220d220d220d22111ad400220f0e7b0b0d000a293434343434341a8200220c0e0e0e7b090c0008022d29352935332a0e0c000229353d1a4e000e0e0e0c0003030e293e3b1ac000320e0e7b050d000428062a3e3b6b66641f070e0e0e0e0e0e000000000000000008020000000000000000000000000000|@2393,@2351,I251,I105,I218,@2390,I106,I232,@475,@1731,@1734,@2394,@1414,@2395,@2400,I253,@2392,@2315,@2288| 2392:O4|@14322,@596,@2404,@2403 2393:S27|545950454944434f444528292e73697a65466f7254797065283429 2394:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2395:O1|@2396 2396:D7,144|008833372934336a64320e0e0e0c000229353d1a82000e0e0e0c0003030c293e3b1a7c000e0c0004020628062a3e3b6b341a74000e0c00021a75000e0e0c00021a6d000e0e0c000203032902213432323232220e2210341a5e000e0e0e0c0009291a5c000e0c00023e2a2d3c6b65651f090e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@2398,I251,@2288,I105,I218,@2397,@2273| 2397:O1|@2399 2398:S49|545950454944434f444528292e73697a65466f725479706528342973697a65466f72436f6e737472756374696f6e283229 2399:D7,192|0087321ac2000e0e0e0c00021ac1000e0e0c00020389323533362a303030220d220d220d22110e0e0e0c0008293b691aa6002a691aa1002a691a9c002a69280e2a3b6a2a291a80000e0c00021a81000e0e0c0002031d29352a362a353d1a80000e0c00030309292503511e263b02013b6502013c64030b291a6d000e0e0c00020201293022122212221222122212221222121a5b000c00092a2a69270a02013b1f080e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@1399,I105,I218,@542,I251,@2349,@2397| 2400:O4|@14322,@596,@2402,@2401 2401:O5|@2312,459,0,459,0 2402:S25|73697a65466f72547970653a20556e6b6e6f776e2074797065 2403:O5|@2312,433,0,433,0 2404:S38|73697a653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2405:D20,400|00802b35280e1a8f010c000307dc2b36293b1a83010c000303051a83010fd33b2a291a83010c00021a85010e0e0c0002031729362b3c1a7f010c0003292b25042504511e223b6502012a65291a59010e0e0c00020303290207291a63010c0002293b1a33010c000303033c020b291a57011a5c010e0c000303041a5b01103b502928403b1a59010e0e0c00042c1a58011a5d010e0e0c0003293b2c1a5a010e0e0e0c000429291aff000c00021a01010e0e0c0002032d29352a362a1aea000e0e0e0c00021ae9000e0e0c00021ae1000e0e0c00020309292503511e353b02013b6502013c6403053b02677600291a100102026b000e0c000229291aab000c00021aad000e0e0c0002031d29352a362a353c1a84000e0c00030309292503511e253b02013b6502013c6403033b02171ad7002a2c2f6b3d302b6a1ad40028452b3b6b293b69661ad00028452d3b6b292b69662c1acb000c0002503d2d2b6a27066402152b353d1a30000e0c000303043b5002041ab300102b42000000000000000080010000000000000000000000000000|@2407,I251,@542,I105,I218,I106,I152,72057594037927935,I247,@2408,I11,@2349,@2410,@2412,@2418,@650,@14321,@14320,I47,@2406| 2406:O4|@14322,@596,@2421,@2420 2407:S46|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129 2408:O4|4,@127,0,@2409 2409:O5|@1370,159,0,159,0 2410:O1|@2411 2411:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d362a2e0e0c00022a2f1a43000c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@2410| 2412:O1|@2413 2413:D8,120|00822d1a7a000e0e0e0c00021a79000e0e0c000203452d352e362a353d1a70000e0c000303043b5002041a6b00102a362b372f312c1a68000e0c000450303c1a66000e0e0e0c00032c2a321a62000e0e0e0c00042b2a69270602013b440e0e0e000000000000000068000000000000000000000000000000|@2415,I105,I218,I251,@2414,I255,I239,@2412| 2414:O4|@14322,@596,@2417,@2416 2415:S58|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129636f7079546f566563283229 2416:O5|@2295,179,0,179,0 2417:S12|6e6f7420636f6e7374616e74 2418:O1|@2419 2419:D8,152|00802b1a9a000e0e0e0c00021a99000e0e0c000203652b352c362a291a81000e0e0c00021a81000e0e0c0002033a29352a362a35291a78001a7d000e0e0c000364031b2a351a68001a6d000e0e0c000303043b5002041a6700102a370207292503511e473b6502031a5d00642a1a60000e0c00022a2a69270402013b420e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@14321,I251,@1576,@588,@2418| 2420:O5|@2295,210,0,210,0 2421:S31|6d616b6556616c202d206e6f7420636f6e7374616e74206f72207475706c65 2422:O4|@14322,@596,@2424,@2423 2423:O5|@2312,723,0,723,0 2424:S21|457175616c69747920666f722066756e6374696f6e 2425:O4|@14322,@596,@2427,@2426 2426:O5|@2312,687,0,687,0 2427:S40|6d616b6545713a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2428:D6,160|00812c1aa2000e0e0e0c000229353d1a9e000e0e0e0c00030345293629353e1a8e000e0e0e0c000303152936291a88000e0c00021a89000e0e0c00026402013b0311293629352936291a5c000e0c0002660209291a51000e0e0c00026402012964561756285639564a565b566c567d568e569f120b0001000a001a4b00220d7b0d04000c0e0e0e0e000000000000000090000000000000000000000000000000|@2430,@1435,I251,I105,I218,@2429| 2429:O1|@2431 2430:S37|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f6164283229 2431:D13,680|008a220c3528051aa6020e0e0e0c00030385220c36220d382937293629353d1a8e020e0e0e0c0003651a8c020e0c0002030329025f2937293629353d1a71020e0e0c000303043b5002041a7302103b5029362a372a2f1a6f020c00031a71022a690402002c2b2b1a6e020e0e0e0c00045029352707220e220e220e220e220e220e220e220e220e220e1a5402220f0e7b0d0f000c650fdc220c3528061a11020e0e0c000303043b5002041a3b02103b50220c36293b1a38020e0c000329353f1aee010e0e0e0c000303043b5002041a2702103b50293629293b1ad4010e0c000303033b023529352a362a37293629353c1abd010e0e0c00036403102936293622142a1aab010c00036502013b6403033c0207292503511e3f3b65640306220d68010fcc29293b1a87010c000303033b023529352a362a37293629353c1a71010e0e0c00036403102936293622122a1a5f010c00036502013b6403033c0207292503511e3e3b656403053468010fd129293b020217011a38010e0c000303033b023529352a362a37293629353c1a21010e0e0c00036403102936293622102a1a0f010c00036502013b6403033c0207292503511e433b6564030532680102a129293b1aec000e0c000303033b023929352a362a37293629353c1ad5000e0e0c000364031429362936220e2a1ac30002026e000c00036502013b6403033c0207292503511e433b65640305306801025129293b1a9c000e0c000303033b023929352a362a37293629353c1a85000e0e0c000364031429362936220c2a1a730002021e000c00036502013b6403033c0207292503511e433b656403052e680102013b293b1a4c000e0c000303041a9300103b503b502935293528053b2b2d3b68052f3b2b1a84000e0c0004502b27071f0b0e0e000000000000000098020000000000000000000000000000|@2433,I251,I218,@1731,@1734,@2434,@1414,@2429,@2435,I253,@2438,@2432,I255| 2432:O4|@14322,@596,@2437,@2440 2433:S48|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f61642832297072656654797065283129 2434:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2435:O4|@14322,@596,@2437,@2436 2436:O5|@1349,2708,0,2708,0 2437:S40|74797065436f6e73747246726f6d4f7665726c6f61643a204e6f206d61746368696e672074797065 2438:O4|@14322,@596,@2437,@2439 2439:O5|@1349,2700,0,2700,0 2440:O5|@1349,2698,0,2698,0 2441:O1|@2442 2442:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@2444,@2443| 2443:O1|@2445 2444:S72|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296765745479706556616c7565466f724944283129 2445:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@2443,@2288,I253,I107,@2286| 2446:O1|@2447 2447:D13,440|00852e312f2f2f1ab6010e0e0e0c0006293b1ab3010c000307d131353e1aa8010e0c00030341313629322a1aa2010e0e0e0c00021aa1010e0e0c000203252a352b362a36292d220e220e220e220e1a8f010c00072b2a2506250626041e323b2704020129660fd5313528051a5a010e0e0e0c000303bd313632382937293629353d1a44010e0c00036503512937293629353d1a33010c000303043b5002041a4701103b5029362a372a2f1a43010c00031a45012a690402002c2b2b1a42010e0e0e0c000450293529221222122212221222121a0b0122137b0813000729321a27010c0003332a1a2701020299000c00030303330201292c2a2a1ad4000e0c00021ad5000e0e0c000203242a352b362a2c22102210221022101ac5000e0e0c00072a2a2505250526031e303b6602012927060251313528061a8e00020246000e0e0e0c0003033d3136293b1acb000c000329353c1a72000e0e0e0c0003030332021f29353f1a61000e0e0c0003030332020f2933333333331a6600347b080b00076502013002152935293629331a81000e0e0c000303032902013265641f060e0e0000000000000000a8010000000000000000000000000000|@2449,@2351,I251,I105,I218,@2446,@1731,@1734,@2450,@1414,@2448,I233,I253| 2448:O1|@2451 2449:S27|545950454944434f444528292e6765744d61784465707468283329 2450:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2451:D8,328|00812b1a4a010e0e0e0c00021a49010e0e0c000207d52b352c362a3829353b1a3e010e0e0e0c000307dd293629291a1f010c00021a21010e0e0c0002038b29352a362a3734372a3629353c1a12010e0e0e0c000303112a3629353c1a02010e0e0e0c00036402013b6403152a3629362b3629362b2a1ae8000e0c0003270402392a3629353b1ad8000e0c000303112a3629353b1aca000e0e0e0c00036402013b6403152a3629382b3629382b2a1ab8000e0c0003270402013b6503033c0207292503511e963b6502013b6403433b2c291a7d000e0e0c00021a7d000e0e0c0002031b29362b3c1a870002023b000c0003292b25042504511e283b6502012a65293c1a6c0032020213000e0e0e7e090003302c1a6300310e0e7e0800032f2b1a5700300e0e7e0700031a5500430e0e0e0e000000000000000038010000000000000000000000000000|@2452,I105,I218,I251,I113,I106,@2448,-1| 2452:S47|545950454944434f444528292e547970655661724d61702e636865636b54797065436f6e7374727563746f72283229 2453:O1|@2454 2454:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@2456,@2455| 2455:O1|@2457 2456:S65|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329626f786564436f64652d283129 2457:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@2455,@2288,I253,I107,@2286| 2458:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@2460,@2459| 2459:O1|@2461 2460:S64|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d6574657228332973697a65436f64652d283129 2461:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@2459,@2288,I253,I107,@2286| 2462:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@2273| 2463:O3|2,@2465,@2464 2464:O2|@2474,0 2465:O4|@2467,@2466,2,1 2466:O1|@2470 2467:O1|@2468 2468:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@2469| 2469:S10|6572726f72436f646532 2470:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2472,@2471| 2471:O2|3,@2473 2472:S14|7072696e742d66756e6374696f6e 2473:S2|666e 2474:O4|@14321,69,@2475,0 2475:O3|2,4,@2476 2476:O6|@607,@583,@2478,@2494,@2495,@2477 2477:O2|@642,@2518 2478:O2|@627,@2479 2479:O2|@2481,@2480 2480:O2|@2487,@2486 2481:O2|@2483,@2482 2482:O3|0,@2485,@609 2483:O2|1,@2484 2484:O2|2,3 2485:O8|@542,@2469,0,0,@943,0,0,1 2486:O2|@2492,@635 2487:O2|@2489,@2488 2488:O3|0,@2490,@609 2489:O2|1,@1071 2490:O8|@2491,@2472,0,0,@470,0,0,1 2491:O3|2,@2471,0 2492:O2|@2493,@588 2493:O3|0,2,0 2494:O14|2,2,2,2,2,2,2,2,2,2,2,2,2,2 2495:O15|@2497,@2501,@2500,@2499,@2467,@2466,@2465,@2506,@2505,@2510,@2509,@2513,@2498,@2515,@2496 2496:O4|I251,@2515,1,1 2497:O6|@2499,@2465,@2505,@2509,@2498,@2496 2498:O4|@518,@2513,3,1 2499:O4|@2501,@2500,3,1 2500:O1|@2503 2501:O1|@2502 2502:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@2469| 2503:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2504,@446| 2504:S13|7072696e742d64656661756c74 2505:O4|I113,@2506,3,1 2506:O1|@2507 2507:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2508,@14317,I253| 2508:S9|7072696e742d696e74 2509:O4|I251,@2510,1,1 2510:O1|@2511 2511:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2512,@14312,I253| 2512:S10|7072696e742d626f6f6c 2513:O1|@2514 2514:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@595,@14319,I253| 2515:O1|@2516 2516:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2517,@14357,I253| 2517:S10|7072696e742d63686172 2518:O2|@2520,@2519 2519:O2|0,@2558 2520:O2|@2522,@2521 2521:O2|@2543,0 2522:O4|@14320,69,@2523,0 2523:O2|0,@2524 2524:O2|0,@2525 2525:O2|0,@2526 2526:O2|0,@2527 2527:O2|@2528,@473 2528:O2|@2530,@2529 2529:O2|@2538,@2537 2530:O4|@14320,69,@2531,0 2531:O2|@2532,@524 2532:O2|@2534,@2533 2533:O2|@2534,0 2534:O4|@14321,69,@2535,0 2535:O3|0,@530,@2536 2536:O6|@605,@583,@529,I49,@640,@622 2537:O2|@2538,0 2538:O4|@14321,69,@2539,0 2539:O3|2,4,@2540 2540:O4|@650,@2542,@2541,@2498 2541:O2|@2533,@524 2542:O2|@2535,@653 2543:O4|@14321,69,@2544,0 2544:O3|2,6,@2545 2545:O4|@650,@2547,@2546,@2497 2546:O2|0,@2552 2547:O2|@588,@2548 2548:O2|@588,@2549 2549:O2|@588,@2550 2550:O2|@588,@2551 2551:O2|@2539,@655 2552:O2|0,@2553 2553:O2|0,@2554 2554:O2|0,@2555 2555:O2|@2556,@473 2556:O2|@2557,@2537 2557:O4|@14320,69,@2541,0 2558:O2|0,@2559 2559:O2|0,@2560 2560:O2|0,@2561 2561:O2|0,@2562 2562:O2|0,@2563 2563:O2|0,@2564 2564:O2|0,@2565 2565:O2|0,@2566 2566:O2|0,@2567 2567:O2|0,@2568 2568:O2|@2528,@618 2569:O2|@2571,@2570 2570:O2|@2593,@2592 2571:O2|@502,@2572 2572:O3|2,@2505,@2573 2573:O2|@2574,0 2574:O4|@14321,69,@2575,0 2575:O3|2,4,@2576 2576:O6|@607,@583,@2577,@2494,@2495,@2477 2577:O2|@627,@2578 2578:O2|@2580,@2579 2579:O2|@2582,@632 2580:O2|@2581,@588 2581:O3|0,I113,0 2582:O2|@1055,@2583 2583:O3|0,@2584,@609 2584:O8|@2585,@2508,0,0,@805,0,0,1 2585:O4|3,@551,@2586,1 2586:O4|3,@2588,@2587,1 2587:O3|2,I253,0 2588:O2|@2590,@2589 2589:O2|@560,0 2590:O2|@2591,1 2591:O3|2,@14317,0 2592:O2|@2614,@2613 2593:O2|@437,@2594 2594:O3|2,@2509,@2595 2595:O2|@2596,0 2596:O4|@14321,69,@2597,0 2597:O3|2,4,@2598 2598:O6|@607,@583,@2599,@2494,@2495,@2477 2599:O2|@627,@2600 2600:O2|@2602,@2601 2601:O2|@2605,@2604 2602:O2|@2603,@588 2603:O3|0,I251,0 2604:O2|@638,@635 2605:O2|@1137,@2606 2606:O3|0,@2607,@609 2607:O8|@2608,@2512,0,0,@805,0,0,1 2608:O4|3,@551,@2609,1 2609:O4|3,@2610,@2587,1 2610:O2|@2611,@2589 2611:O2|@2612,1 2612:O3|2,@14312,0 2613:O2|@2634,0 2614:O2|@510,@2615 2615:O3|2,@2498,@2616 2616:O2|@2530,@2617 2617:O2|@2618,0 2618:O4|@14321,69,@2619,0 2619:O3|2,4,@2620 2620:O6|@607,@583,@2621,@2494,@2495,@2477 2621:O2|@627,@2622 2622:O2|@2624,@2623 2623:O2|@2626,@632 2624:O2|@2625,@2535 2625:O3|0,@518,@2533 2626:O2|@791,@2627 2627:O3|0,@2628,@609 2628:O8|@2629,@595,0,0,@805,0,0,1 2629:O4|3,@551,@2630,1 2630:O4|3,@2631,@2587,1 2631:O2|@2632,@2589 2632:O2|@2633,1 2633:O3|2,@14319,0 2634:O2|@1690,@2635 2635:O3|2,@2496,@2636 2636:O2|@2637,0 2637:O4|@14321,69,@2638,0 2638:O3|2,4,@2639 2639:O6|@607,@583,@2640,@2494,@2495,@2477 2640:O2|@627,@2641 2641:O2|@2602,@2642 2642:O2|@2643,@2604 2643:O2|@812,@2644 2644:O3|0,@2645,@609 2645:O8|@2646,@2517,0,0,@805,0,0,1 2646:O4|3,@551,@2647,1 2647:O4|3,@2648,@2587,1 2648:O2|@2649,@2589 2649:O2|@2650,1 2650:O3|2,@14357,0 2651:O3|2,@2499,@2652 2652:O2|@2653,0 2653:O4|@14321,69,@2654,0 2654:O3|2,4,@2655 2655:O6|@607,@583,@2656,@2494,@2495,@2477 2656:O2|@627,@2657 2657:O2|@2659,@2658 2658:O2|@2660,@632 2659:O2|@1181,@2482 2660:O2|@1188,@2661 2661:O3|0,@2662,@609 2662:O8|@2663,@2504,0,0,@470,0,0,1 2663:O3|2,@446,0 2664:O2|7,@2665 2665:O8|@542,@2666,0,0,@943,1,0,1 2666:S10|6e6f457175616c697479 2667:O4|@2668,@2463,@2569,@2651 2668:D2,48|00822d2d562756385649301a2a00317b080500070e0e0e0e000000000000000020000000000000000000000000000000|@2670,@2669| 2669:O1|@2671 2670:S30|545950454944434f444528292e7072696e746572466f7254797065283329 2671:D82,2768|008530353d1ad00a0e0c0003036a1acf0a291ad30a0c00021ad50a0e0e0c0002031d29352a362a353d1aac0a0e0c00030309292503511e253b02013b6502013c64030b1ab20a1ab70a0c000202031aa70a3b1ab30a0c00023c1ab40a1ab90a0e0e0c00032b1ab80a3b2d2d3c3b3c680828072a6927040fd930353e1a5a0a0e0e0e0c000307cd303631372a1a5a0a0e0e0e0c00021a590a0e0e0c000207cf2a352b36293b1a310a0e0e0c000307d42a352b36220c35220d363c28403b1a690a0e0e0c00041a690a2a2c6a2c3c1a690a0e0e0c0003292b2d6a2f2a22132213221322131a5b0a0c00071a5d0a1a620a0e0e0e0c00023e2a2c3c6b331a5b0a1a600a0e0c00033d2a3b6a293b691a5a0a2a69280e2a3c6a2a291ace090e0e0e0c00021acd090e0e0c0002031d29352a362a353d1aa4090e0c00030309292503511e283b02013b6502013c64030f291ab1090204630974050c00020201291a120a291a86090e0e0e0c00021a85090202ee040e0e0c0002032129352a362a353d1a58090202d0010e0c00030309292503511e303b02013b6502013c64030b1ada091a5f090c000202031acf091ad409291a38090e0c00021a39090e0e0c0002031d29352a362a353d1a10090e0c00030309292503511e263b02013b6502013c64030b1aa6091a1b090c000202031a9b09293b69322a692c2a692e2a69291a93090c00021a9509291ae1080e0e0c00021ae1080e0e0c0002031d29352a362a353d1ab8080e0c00030309292503511e273b02013b6502013c64030b1a66091ac3080c000202031a5b092a3b692a2a69280e2a3b6a2a291a93080c00021a95080e0e0c0002031d29352a362a353d1a6c080e0c00030309292503511e253b02013b6502013c64030b291a79080e0e0c0002020129293b691a13092a691a16092a691a19092a691a1c092a69280e2a3c6a2a291a38080e0c00021a39080e0e0c0002031d29352a362a353d1a10080e0c00030309292503511e263b02013b6502013c64030b291a1d080e0e0c0002020129221f3b1ad7080c0003293b2a1aee070e0e0e0c00021aed070e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa8080e0c0002291ad8070e0c00023c1aa0081add070e0e0c00032e1a9c083b2d2d3c3b3c680828072a69272a0fca2b29353b1a7d070e0e0c00030304293702122936293b1a5b080c0003292503511e1f3b656407d32c3c2a1a67070c00021a69070e0e0c000203842a352b362a352c3c1a4f080c00032a2a1a37070c000303033c024a2a1a3b070c00021a3d070e0e0c00020314291a2a070e0e0e0c00021a29070e0e0c000202013b03212a3b2b3b28082e1a15080e0e0c00021a15080e0e0c00031a15080e0e0c000602013b6403182c3c1a3d070e0e0c00032b2a2506250626041e8b3b6402013b6602013c6503413b2d291acc0602023a020e0c00021ac9060e0e0c0002031729362b3c1a03070c0003292b25042504511e273b6502012a65293d1abc0702020a000e0c00036402013b02013b3435220c363c28403b1ac1060e0e0c00041aa1072a2c6a2c3c1ac1060e0e0c0003292b2d6a3b34291a62060e0e0e0c00021a61060e0e0c0002031729362b3c1a9b060c0003292b25042504511e253b6502012a65291a65071a62060e0e0e0c0003220c2a1a5e070e0e0e0c000332030329020a291a56071a5b070c000333030428280202287b3d2a3b6a293b691a7d062a69280e2a3c6a2a291af1050e0e0c00021af1050e0e0c0002031d29352a362a353d1ac8050e0c00030309292503511e273b02013b6502013c64030b291ad5050e0e0c00020201292f3b1a0806221d221d221d221d221122181af1060e0e0c000a293b692b2a69280e2a3b6a2a291a8c050e0c00021a8d050e0e0c0002031d29352a362a353d1a64050e0c00030309292503511e263b02013b6502013c64030b291a71050e0e0c0002020129293b691aa3062a691aa6062a691aa9062a691a14062a69280e2a3c6a2a291a30050e0c00021a31050e0e0c0002031d29352a362a353d1a08050e0c00030309292503511e263b02013b6502013c64030b291a15050e0e0c000202012922193b1acf050c0003293b2a1ae6040e0e0e0c00021ae5040e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa0050e0c0002291ad0040e0c00023c1a18061ad5040e0e0c00032e1a14063b2d2d3c3b3c680828072a6927236502691a0806291a84040e0c00021a85040e0e0c0002031d29352a362a353d1a5c040e0c00030309292503511e263b02013b6502013c64030b1ada051a67040c000202031acf053b1a63040c00023c1acc051a69040e0e0c00032b1ac8053b2d2d3c3b3c680828072a692704650fdb303528051a08040e0c000307d53036313732382937293629353d1af2030e0e0e0c00036503512937293629353d1adf030c000303043b5002041a8305103b5029362a372a301a7f050c00031a81052a690402002c2b2b1a7e050e0e0e0c000450293529221222122212221222121a070422137b08130007323533363c28403b1add030e0e0c00041a55052a2c6a2c3c1add030e0e0c0003292b2d6a2f372935292d31311a41050e0e0c000529353d1a5e030e0e0e0c0003030c293c3b1a30050e0c0004020628062a3c3b6b220c1aa703221422142214221433020210031a17050202cf010c0008220d3b1a22030e0e0e0c000303d42a1a060569291a89030e0e0c00023e2a1aff043c6b1a02051a77030c00023e2a2c3c6b1afc0422121a77030c0003220e3b1ad6030e0e0e0c0003293b2a1aea020e0e0e0c00021ae9020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa4030e0c00022c1ab4041aa1020e0e0c000303033c02222c1aa3020c00021aa5020e0e0c000203102c3b1a91043b28081aa3030c000602013b03051a880402012c2a1a99020e0e0c00023c1a80041a9d020e0e0c0003302c3b2d2d3c3b3c680828072a69270d0fcf2a1a6a0469291ab5020e0e0c00023e2a1a63043c6b2c1aa5020e0e0c00023e2a2c3c6b1a58041a95020e0e0c00023e2a2c3c6b1a500422141a93020c000322103b1af2020e0e0e0c0003293b2a1a06020e0e0e0c00021a05020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ac0020e0c00022c1ad0031abd010e0e0c000303033c02222c1abf010c00021ac1010e0e0c000203102c3b1aad033b28081abf020c000602013b03051aa40302012c2a1ab5010e0e0c00023c1ac4031ab901020215000e0e0c0003302c3b2d2d3c3b3c680828072a69270f270e0fd4303528061a55010e0e0c000303bd3036293b1a37020c000329353f1a3e010e0e0e0c0003032a323b1a81030e0e0c0003293528053b2b2d3b680529220c220c220c220c220c1a7c01220d0e7b080d000729353c1a06010e0e0e0c000303502d333232321a4e030e0e0e0c0006293b1aeb000c000303041a4303103b503b5029352935342a0e0c000229353d1ace000e0e0e0c0003030e293c3b1aa002340e0e7b050e000428062a3c3b6b2704021a2a3b1a99010e0e0c00032933333333331a0301340e7b080b000765026f1af602291a9a00020264000e0e0e0c00021a95000e0e0c0002031d29352a362a353d1a6c000e0c00030309292503511e2c3b02013b6502013c64030b1ac2021a77000c000202031ab7023b1a73000c00023c1ab4021a79000e0e0c00032b1ab0023b2d2d3c3b3c680828072a6927041f060000000000000000c00a0000000000000000000000000000|@2673,I251,@2674,I105,I218,@2677,@2349,@2332,@2678,@1385,@2472,I11,@2680,I106,@2669,@718,@2273,@2681,@122,@808,@2682,@2684,@2685,@2688,@2689,@2691,@2694,@542,@542,@475,@542,I253,@2330,@2695,@2697,@243,I223,I239,I154,I231,@2698,@2699,@2702,@2708,@1497,@2713,@542,@542,@475,@2737,@2697,@2739,@2743,@2744,@2697,@1731,@1734,@2746,@1414,@2747,@2748,@2288,@2750,@684,@2587,@718,@2757,I48,@1004,@2758,@684,@2587,@718,@2757,@2760,@2315,@2351,@2762,@2765,@2769,@2770,@2672| 2672:S11|7072696e742d656d707479 2673:S42|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f6465283229 2674:O2|@808,@2675 2675:O2|@2676,0 2676:O3|2,@2473,0 2677:O3|14,@2674,1 2678:O1|@2679 2679:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2680:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 2681:S2|203d 2682:O2|@475,@2683 2683:O2|@475,@684 2684:O3|14,@2682,1 2685:O2|@808,@2686 2686:O2|@2687,0 2687:O3|2,125,0 2688:O3|14,@2685,1 2689:O1|@2690 2690:D7,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36291a8a000e0e0e0c0002293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d09000229270602031a4c00420e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@2689,I251,@2349,@542| 2691:O2|@808,@2692 2692:O2|@2693,0 2693:O3|2,123,0 2694:O3|14,@2691,1 2695:O1|@2696 2696:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2697:S14|7072696e742d6c6162656c6c6564 2698:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 2699:O1|@2700 2700:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@2701| 2701:S52|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296669656c64732d283129 2702:O2|@2703,@14383 2703:D7,136|00812c3b1a89000e0e0c000303202b3b1a7d000e0e0c000303043b50020b56071a75003b1a79006b103b503b023b2c352d362d1a72000e0e0e0c00021a71000e0e0c000203043b50020b56271a49003b1a65006b103b502d352e362c2b692c2b300c00032a2a692706430e0e0e0e0e0e000000000000000078000000000000000000000000000000|@2705,I251,@2706,@2704,I105,I218,@2704| 2704:O5|@2707,51,0,51,0 2705:S17|4c697374506169722e7a69704571283229 2706:S14|556e657175616c4c656e67746873 2707:S20|2e2f62617369732f4c697374506169722e736d6c 2708:O1|@2709 2709:D2,40|00802b3529351a27002a6965420e0e0e000000000000000018000000000000000000000000000000|@2711,@2710| 2710:D2,48|00802b35293556272a1a2c002f0e0e0e7e0500030e0e0e0e000000000000000020000000000000000000000000000000|@2712,I29| 2711:S56|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283129 2712:S59|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283229283129 2713:O1|@2714 2714:D35,1216|0088331ac2040e0e0e0c00021ac1040e0e0c000203043b5002041abb04103b5033353436293b1ab7040c000307cc2a3529352a362d362a33220f220f220f220f22140e0e0e0c000728061a9b042c3b6b1a9d041aa2040e0e0e0c00023e2a1a9f043c6b293b692c2a69280e2a3b6a2a1a56040e0e0e0c00021a55040e0e0c00021a4d040e0e0c0002030c291a7a040e0e0e0c0002020129293b69291a5a040e0e0e0c00023e2a343c6b0402002214030d1a5d042a2a35452a36465102b6220e1a56041a5b040c00033d2a3b6a293b691a56042a69280e2a3c6a2a291aea030e0e0e0c00021ae9030e0e0c0002032129352a362a353d1ae8030202f8000e0c00030309292503511e2c3b02013b6502013c64030b291af1030e0e0c00020201291a0e04291aa2030e0e0e0c00021aa1030e0e0c0002031d29352a362a353d1aa0030e0c00030309292503511e283b02013b6502013c64030b1ade031aab030c000202031ad303293b692b2a69322a45287d46260a29352a363d2a3b6a293b691aa7032a69280e2a3c6a2a291a3b030c00021a3d030e0e0c0002031d29352a362a353d1a3c030e0c00030309292503511e253b02013b6502013c64030b291a49030e0e0c0002020129293b69322a69293b1a0e030e0e0e0c0003030331020b312a1a5e030e0e0e0c0003291a5c03221f0e0e7d2700022a3529352a362d3604020032030d1a4b032a2a35452a36465102b42c1a45031a0a030e0e0e0c00033d2a3b6a293b691a02032a69280e2a3c6a2a291a96020e0e0e0c00021a95020e0e0c0002031d29352a362a353d1a94020e0c00030309292503511e283b02013b6502013c64030b291aa1020e0e0c00020201291aee02291a52020e0e0e0c00021a51020e0e0c0002031d29352a362a353d1a50020e0c00030309292503511e283b02013b6502013c64030b1abe021a5b020c000202031ab302293b692b2a69322a45287d46260a29352a362d220d221222122212221222170e0c000728061a0b022f3b6b1a8d021a12020e0e0e0c00023e2a1a0f023c6b293b692c2a69280e2a3b6a2a1ac6010e0e0e0c00021ac5010e0e0c00021abd010e0e0c0002030c291aea010e0e0e0c0002020129293b69291aca010e0e0e0c00023e2a343c6b1a3c02291a88010e0c00021a89010e0e0c0002031d29352a362a353d1a88010e0c00030309292503511e263b02013b6502013c64030b1a0e021a93010c000202031a03021a0802291a44010e0c00021a45010e0e0c0002031d29352a362a353d1a44010e0c00030309292503511e263b02013b6502013c64030b1ada011a4f010c000202031acf01293b692b2a692d2a69293b1a11010e0e0c000303042211020a22112a1ab8010e0c000322233c1ab6010e0e0e0c000322192a22252225222522252225222522251aa4010e0c000a2b2a1aa3010c00031aa50122151a08010e0c00033d2a3b6a293b691a02012a69280e2a3c6a2a291a96000e0e0e0c00021a95000e0e0c0002031d29352a362a353d1a94000e0c00030309292503511e283b02013b6502013c64030b291aa1000e0e0c0002020129293b69291a4a010e0e0e0c00023d222f3b6a293b691a41012a69291a6b000c00023e2a1a3b013c6b3c2a3022106b272a1f090e0e0e0e0e0e0e0000000000000000b0040000000000000000000000000000|@2716,I105,I218,@2717,I251,@712,@2719,@2273,@2721,@2349,@2722,@2681,@122,@808,@2682,@2684,@2723,@2725,@2722,@2681,@2682,@2684,@2719,@2727,@2730,@2682,@2684,@2731,I106,@2713,@2733,@855,@2735,@1010,@2715| 2715:O3|2,I234,0 2716:S53|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f646528322961735265636f7264283229 2717:O4|@14358,@1714,0,@2718 2718:O5|@2312,569,0,569,0 2719:O2|@2720,@467 2720:O4|6,@472,1,0 2721:O3|2,I107,0 2722:O2|0,41 2723:O1|@2724 2724:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2723| 2725:O1|@2726 2726:D7,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36291a8a000e0e0e0c0002293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d09000229270602031a4c00420e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@2725,I251,@2349,@542| 2727:O2|@808,@2728 2728:O2|@2729,0 2729:O3|2,44,0 2730:O3|14,@2727,1 2731:O1|@2732 2732:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2731| 2733:O1|@2734 2734:D6,144|00812c1a92000e0e0e0c00021a91000e0e0c0002035b2c352d36292e1a89000e0e0c0003293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d0a000229270602012b430e0e0e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@2733,I251,@2349| 2735:O1|@2736 2736:D7,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36291a8a000e0e0e0c0002293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d09000229270602031a4c00420e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@2735,I251,@2349,@542| 2737:O1|@2738 2738:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2739:O2|@808,@2740 2740:O2|@2741,0 2741:O3|2,@2742,0 2742:S2|2829 2743:O3|14,@2739,1 2744:O1|@2745 2745:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2746:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 2747:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 2748:O1|@2749 2749:D12,264|00832e353f1a08010e0c000303382e362f372936293131311afd000e0e0c000529353d1aea000e0e0e0c0003030e292d3b1aec00320e0e7b050a000428062a2e3b6b270402a42e353d1ac4000e0c0003037e2e362f372a3b1acd000e0e0c00032a3b1ac3000c00032935322a1ac1000e0e0c0003293b1abf000c000303041abf00103b503b50293b1abd000e0e0c00030321293c1a99000e0e0c00032d2a3b6a64330e0e0e0c000229331aa3000c00036402162c3b1a80000e0c000303041a9700103b503b503d2d693f2a692707021a2e353c1a3a000e0e0e0c000303043b5002041a7b00103b502e361f040e0e0e0e0000000000000000f8000000000000000000000000000000|@2287,I251,@2748,@2288,I253,I107,I234,@2320,I233,@2323,@2318,@2286| 2750:O1|@2751 2751:D10,224|0086311ae2000e0e0e0c00021ae1000e0e0c000203a9313532362a2e33333333220f0e0e0e0c00072b2f1acb0032220d220d220d1ac9000e0e0c00082c301ab70033220e220e220e1abd000e0e0c0008293b692b2a692d2a691ab4002a69280e2a3b6a2a291a80000e0c00021a81000e0e0c0002031d29352a362a353d1a98000e0c00030309292503511e263b02013b6502013c64030b291a85000e0e0c0002020129322213221322132213221322131a75000e0e0c00082a2a69270c02013b1f070e0e0e0e0e0e0000000000000000d0000000000000000000000000000000|@1399,I105,I218,@2752,@2374,@2390,@542,I251,@2349,@2750| 2752:O1|@2753 2753:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@2755,@2754| 2754:O1|@2756 2755:S70|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296d616b655072696e7465724964283129636f6465466f724964283129 2756:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@2754,@2288,I253,I107,@2286| 2757:S6|7072696e742d 2758:O1|@2759 2759:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2760:O1|@2761 2761:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2762:O4|@14322,@596,@2764,@2763 2763:O5|@2312,474,0,474,0 2764:S48|7072696e746572466f72547970653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2765:O2|@808,@2766 2766:O2|@2767,0 2767:O3|2,@2768,0 2768:S7|3c656d7074793e 2769:O3|14,@2765,1 2770:O1|@2771 2771:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 2772:O8|@2663,@2504,0,0,@470,1,0,1 2773:O4|@14322,@596,@2775,@2774 2774:O5|@2312,144,0,144,0 2775:S19|6765744361636865645479706556616c756573 2776:O1|@2777 2777:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@2776| 2778:D34,1024|00822c291a01040e0e0c00021a01040e0e0c0002032429352a362a35291af8031afd030e0e0c00036403052a68010207292503511e313b6502013b64293b1adf030c0003036b1adf03291abb030c00021abd030e0e0c0002032429352a362a35291ab4031ab9030e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a9b030c000303041aa303103b503b50293529351a7f031a84030e0c000303043b5002041a8f03103b50293765021e293529351a60031a65030e0e0c000303043b5002041a6f03103b502937642e291a34030e0c00021a35030e0e0c0002032429352a362a35291a54031a31030e0e0c00036403052a68010207292503511e303b6502013b64293b1a13030c000303051a3303021c293529351a22031aff020c000303043b5002041a0b03103b502937642b0310311a16030e0e0e0c00022a0c000202013b0404003333332c56a756b81a03030c00075029352a362b372c382b1afb020c000229353c1ab2020e0e0e0c000303512b3b1aa5020e0e0c000303032d0204402c2f6a04020034030f2a1abd020e0e0c0002330c000202013b2b2e22132d12130001000100121400010002001ab3020c0007502a352b361ab0022a2c6a27050fd23c28403b1aaa020e0e0e0c0004293b1aa7021aac020e0c0004502b3b1aaa020e0e0e0c000303033c020b2b1aa3021aa8020e0c000303041aa702103b503b502b3c1aa5020e0e0c00032928403b1a61020e0e0c0004293b2f1a66020e0e0e0c0004502c2a1a8a020e0e0e0c00032a3b1a87020c0003293b1a87020c000303051a870202242928403b1a26020e0e0e0c00042c3c2b3b2e1a78020e0c000650291a77020c0002502964303b1a1c020e0c000303033c020b301a17021a1c020e0c000303041a1b02103b503b50303c1a1902020243010e0e0c00032928401a42021acf010c0004293b341ad6010e0e0e0c00045033291a4a010e0e0e0c00021a49010e0e0c0002031929352a362a2f2e1a18020e0c000450292503511e273b6502013b642a3b1ad2010e0e0e0c00033b2a293b1a25010e0e0c000303032a0233293c1aee010e0e0e0c00032a3c1ae3010c0003293c1a93010c0003302a1a9b010c0003292f69292e2507250726051e3d3b270565220f2a69280e2a3b6a2a291ac1000e0e0c00021ac1000e0e0c0002031d29352a362a353d1ac0000e0c00030309292503511e273b02013b6502013c64030b291a85010e0e0c000202012922103b1a97000c000303032902054022112b6a040200221903112a1aaf000c000222180e0e0e0c000202013b2b221322212d12210001000100122200010002001aa2000e0e0e0c0007502a352b361a3401220e22152c2e68052713270b440e0e0e0e0e0e0e0000000000000000f0030000000000000000000000000000|@2780,I105,I218,@14385,I251,@2781,@2836,@1576,@14408,@2840,@2843,@3288,@5220,@4043,@5224,I11,@5226,I255,I234,72057594037927934,I231,@1603,I106,@5244,I253,I113,I49,I195,I47,@542,@5253,I240,@2349,@2779| 2779:D15,320|00803b561a0c0002291a3c010e0c000203041a3b01103b503b50291a2a010e0e0e0c000203041a2f01103b503b50293b1a2d010e0e0c00035629291a0a010e0e0e0c00021a21010e0e0c0002032429352a362a35291a18011a1d010e0e0c00036403052a68010207292503511e323b6502013b64293b1aff000c000303033b0221293529351ae8001aed000e0e0c000303043b5002041ae700103b50293729680165291aa2000e0e0e0c00021ab9000e0e0c0002030a29351acd002a696402031acd003b2a0c00025668353b1aa9000e0e0c000303175668365678371ab9002a56a7333068053b2c2b6a6602275668353d1a84000e0c000303175668365678371a9d002a56a7333068053d2c2b6a6602031a94002a2a1a97000c00033d302b6a2708420e0e0e0e0e000000000000000030010000000000000000000000000000|@5225,I105,@5258,@1363,I253,I218,@14320,I251,@1576,@642,@581,@582,@623,@588,@5257| 2780:S21|434f44455452454528292e67656e436f6465283329 2781:O2|@2783,@2782 2782:O2|@2788,@2787 2783:O4|@14386,69,@2784,0 2784:O1|@2785 2785:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2786| 2786:S18|44656275672e64656661756c74732d283129 2787:O2|@2792,@2791 2788:O4|@14387,69,@2789,0 2789:O1|@2790 2790:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2786| 2791:O2|@2794,@2793 2792:O4|@14388,69,I48,0 2793:O2|@2798,@2797 2794:O4|@14389,69,@2795,0 2795:O1|@2796 2796:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2786| 2797:O2|@2800,@2799 2798:O4|@14390,69,1,0 2799:O2|@2802,@2801 2800:O4|@14391,69,80,0 2801:O2|@2804,@2803 2802:O4|@14392,69,0,0 2803:O2|@2806,@2805 2804:O4|@14393,69,0,0 2805:O2|@2808,@2807 2806:O4|@14385,69,0,0 2807:O2|@2810,@2809 2808:O4|@14394,69,0,0 2809:O2|@2812,@2811 2810:O4|@14395,69,1,0 2811:O2|@2814,@2813 2812:O4|@14396,69,0,0 2813:O2|@2816,@2815 2814:O4|@14397,69,0,0 2815:O2|@2818,@2817 2816:O4|@14398,69,6,0 2817:O2|@2822,@2821 2818:O4|@14399,69,@2819,0 2819:O1|@2820 2820:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2786| 2821:O2|@2824,@2823 2822:O4|@14400,69,77,0 2823:O2|@2826,@2825 2824:O4|@14401,69,0,0 2825:O2|@2828,@2827 2826:O4|@14402,69,0,0 2827:O2|@2830,@2829 2828:O4|@14403,69,0,0 2829:O2|@2832,@2831 2830:O4|@14404,69,0,0 2831:O2|@2834,@2833 2832:O4|@14405,69,0,0 2833:O2|@2835,0 2834:O4|@14406,69,1,0 2835:O4|@14407,69,1,0 2836:O4|@14322,@596,@2838,@2837 2837:O5|@2839,126,0,126,0 2838:S11|746167206d697373696e67 2839:S28|6d6c736f757263652f4d4c436f6d70696c65722f44656275672e4d4c 2840:O1|@2841 2841:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 2842:S19|5072657474792e676574546167283229283129 2843:O3|@2845,@2844,@14321 2844:O2|@3259,@2843 2845:D92,2616|00802b350a0e00e603f404b4051e0050090d03d808d40608038c03600458038801dc00a4022b362c3729353d1a110a0e0e0c00030308292c0e0c0002024729353f1afc090e0c00030308292c0e0c00020233292c0e0c0002291aec09691af0092a691af3092a693b3d3c3b2d6805291aee090e0e0e0c000203041aeb09103b503b502927052b2d1ae6090e0e0e0c0003291ae4090e0c00021ae5092a691ae8092a693b3d3c3b2d6805291ab3090c000203041ab309103b503b50293b691ad0092a69302a693b3d3b3b2d6805291a90090e0c000203041a8f09103b503b5029270c0fcd2b362c372d382b3b1aaa090e0e0e0c0003030c1aa7092c1aab090c000302012b293d1aa8090e0c00032b3b1a87090c0003030c1a87092c1a8b090c000302012b293d1a88090e0c0003291a8809691a8c092a692d2a691a8c092a6927071a8d090e0e0c00023e2a69291a11090e0e0c000203041a0f09103b503b502c2f0e0c0002291a7009691a74092a692c2a693b3e3b3b2d6805291ae4080e0c000203041ae308103b503b5029270a0fd72b362c372d382a352b353b3b292c1a48090e0c000303032a0274293c1a4209020268080e0e0e0c00032f360402002c28082b1a34090e0c00045029352a362c2b1a2e090e0e0e0c00033c2b1a2b090c00032a2a1a2b090c0003293b1a53080c0003641a24090e0c0002293b1a43080c0003030332020b323c1a9e080e0e0e0c00032932250b250b26091e7d3b270965293c1a8d080e0e0c00032c3c1a83080c0003291aec0869282f2a692c2a691ae9082a6927051a8a080e0e0e0c00023e2a69291a0d080e0e0c000203041a0b08103b503b502e320202b2070e0c000231330e0e0e0c0002291ab808691abc082a691abf082a691ac2082a692e2a69302a693b3e3b3b2d6805291ac7070c000203041ac707103b503b502927110fd42b362c372903051a9b0802031a9e082928281aa0080e0c00033e2a69291a95070e0e0c000203041a9307103b503b502d2f1a89080e0e0c0003291a88080e0c00022b2a693b3c3c3b2d6805291a66070e0e0e0c000203041a6307103b503b502927090fdc1a66080fdd2b362c372a2c0e0e0e0c00022a2d0e0e0e0c0002291a5408691a58082a691a5b082a692d2a691a5b082a693b3e3b3b2d6805291a16070e0e0e0c000203041a1307103b503b5029270a0fcb2b36292b0e0e0c0002291a3408691a38082a693b3c3c3b2d6805291ae306020299060c000203041adf06103b503b502927050fdd2b361a180828281ac3070c00033e2a69291ab9060e0e0c000203041ab706103b503b502b2d1afd070e0e0c0003291afc070e0c00022b2a693b3c3c3b2d6805291a8a060e0e0e0c000203041a8706103b503b502927070fdc2d062b36020227062c37292c1ace070e0e0e0c0003291acc070e0c00021acd072a693b3c3c3b2d6805291a48060e0c000203041a4706103b503b502e300202ee050e0c0002291aac07691ab0072a691ab3072a691ab6072a692e2a693b3e3b3b2d6805291a0e060e0e0e0c000203041a0b06103b503b5029270d0fcb2b362c372a56370202a8051a8b070c00033b3d3c3b2d6805291add050e0e0c000203041adb05103b503b502b2e0e0c0002293b693b3d3c3b2d6805291aba050e0e0e0c000203041ab705103b503b50291a4e07691a52072a691a55072a69020251051a54072a69302a691a54072a691a57072a693b3b3c3b2d6805291a7a050e0e0e0c000203041a7705103b503b5029270f0fca2b362c372d382b2d0e0e0c0002293b691a12072a691a25072a693b3d3b3b2d6805291a40050e0c000203041a3f05103b503b502f320202e6040e0c0002293b691ae2062a691afd062a693b3d3b3b2d6805291a10050e0c000203041a0f05103b503b5033220e0c0002293b691ab6062a691ad9062a693b3d3b3b2d6805291ae4040e0c000203041ae304103b503b50293b691a90062a69302a691a88062a69220e2a693b3b3c3b2d6805291ab7040c000203041ab704103b503b502927180fd12b362c372a1a9d04020253040e0e0c000203202a1a8e040e0e0e0c000203043b5002041a6f06103b502a3b1a57040c000302013b03c729291a6a040e0e0e0c00021a19050e0e0c0002032429352a362a352956781a2e040e0e0e0c00036403052a68010207292503511e323b6502013b64293b1a0f040c000303242b1a1e060e0e0e0c00023e2a69291a19040e0e0c000203041a1704103b503b502965025b2935293556581add030e0e0c000303043b5002041aef05103b50293729353b1ac4030e0c00030312293628072a69303202028c030e0e7d0900022d1ac0050e0c00023e2a69291abd030e0e0c000203041abb03103b503b502927046402202a1a9c050e0c00023e2a69291a99030e0e0c000203041a9703103b503b502965650fd22b3629352a362b372c382d392e3a2f23062a3b1a4f030c000303051a6f0502031a72053b2d1a75050e0e0c00033b3b3b3b2d6805291a4d030e0e0c000203041a4b03103b503b502822321a38040e0c00032928221a2e040e0e0e0c00033e2a69291a21030e0e0c000203041a1f03103b503b503e2f69291a0b030c000203041a0b03103b503b50303c1a49030e0e0c0003291a10051aed030e0e0c00033e2a69291ae1020e0e0c000203041adf02103b503b50220d1af5040e0e0c00021af50428281ac0030e0c00033e2a69291ab50202026b020e0e0c000203041aaf02103b503b502b22161ad4040e0c0003291ad4040e0c00022b2a693b3c3c3b2d6805291a82020e0e0e0c000203041a7f02103b503b501ab704285b1a6a030e0e0e0c00033e2a69291a5d020e0e0c000203041a5b02103b503b5022171a99040e0e0c0002291a98040e0c00022b2a693b3c3c3b2d6805291a2e020e0e0e0c000203041a2b02103b503b50291a7a04691ad6032a69312a691ace032a6922112a691ac5032a6922162a691abc032a6922192a691ab3032a691a56042a691aa9032a691a54042a691a9f032a6922222a691a96032a691a49042a693b3f3b3b2d6805291ac4010e0c000203041ac301103b503b50222f22320e0e0e0c0002293b691a26042a692c2a693b3d3c3b2d6805291a96010e0e0e0c000203041a9301103b503b502927360fd02b362c372d382b2d0e0e0c00022b3c1abf010c00032b03051aee0302031a7103293b69285d2a692c2a69285b2a6927051abe010e0e0e0c00023e2a69291a41010e0e0c000203041a3f01103b503b50293b691abc032a692d2a693b3d3b3b2d6805291a1c010e0c000203041a1b01103b503b5029270a02c32b3629353e1ae1000e0e0c000303051a8f0302ae29353c1acf000c000303312936293c1a33010c00031a7d032a1ad9010e0e0c00033e2a69291acd000e0e0c000203041acb00103b503b50292704027229353d1a9300020269000c000303312936293c1af3000c00031a45032a1a99010e0e0c00033e2a69291a8d000e0e0c000203041a8b00103b503b5029270402322936293c1ac2000e0e0e0c00031a19032a1a65010e0e0c00033e2a69291a59000e0e0c000203041a5700103b503b5029270464420e0e0e0e0e0000000000000000280a0000000000000000000000000000|@2847,I251,@900,@901,@873,I105,@1363,@2848,@2851,@901,@873,@1404,I234,@410,I106,@243,@2853,@2854,@2855,@104,@900,@871,I247,I239,I104,I252,I245,I243,I218,@2856,@2857,@900,@871,@872,@901,@2858,@2859,@122,@2860,@2862,@2864,@869,@871,@2866,@2868,@900,@2870,@2872,@2873,@2875,@2877,@2920,@2922,@900,@901,@873,@901,@2924,@2929,@1404,@2933,@871,@1404,@2935,@2937,@2939,@2941,@2943,@2946,@1576,@3219,I48,@3220,@3237,@3238,@3240,@3241,@3243,@3245,@3246,@3248,@3250,@2915,@870,@3252,@1404,@3254,@1452,@3255,@3257,@3258,@2846| 2846:S3|417267 2847:S22|42617365436f6465547265652e707265747479283129 2848:O1|@2849 2849:D8,144|00812c1a92000e0e0e0c00021a91000e0e0c0002035f2c352d36293b1a89000e0e0c000303102a35292f0e0e0e0c0002293b6965023c2a35292f0e0e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b503b502d321a5d000e0e0c00031a5d002a692b2a6927066502013b430e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@1511,@1363,@2848,@871| 2850:S23|42617365436f6465547265652e704c6973742833292829 2851:O1|@2852 2852:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2851,@900| 2853:O2|44,0 2854:S2|2c20 2855:S8|5441475445535428 2856:O2|@2854,0 2857:S13|534554434f4e5441494e455228 2858:S8|4441544154595045 2859:S5|5455504c45 2860:O1|@2861 2861:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203572c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b503b502c311a5d000e0e0c00031a5d002a692b2a6927056502013b430e000000000000000078000000000000000000000000000000|@2850,I105,I218,I251,@1511,@1363,@2860,@871| 2862:O1|@2863 2863:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2862,@900| 2864:O2|3,@2865 2865:S5|4c44455843 2866:O2|3,@2867 2867:S4|57495448 2868:O2|3,@2869 2869:S7|48414e444c4528 2870:O2|3,@2871 2871:S6|524149534528 2872:S4|4c4f4f50 2873:O1|@2874 2874:D8,144|00812c1a92000e0e0e0c00021a91000e0e0c0002035f2c352d36293b1a89000e0e0c000303102a35292f0e0e0e0c0002293b6965023c2a35292f0e0e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b503b502d321a5d000e0e0c00031a5d002a692b2a6927066502013b430e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@1511,@1363,@2873,@871| 2875:O1|@2876 2876:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2875,@900| 2877:O1|@2878 2878:D22,648|00812c1a8a020e0e0e0c00021a89020e0e0c000207dd2c352d36293b1a81020e0e0c000307db2a3529352a362b372a3c1a75020e0e0c00031a75022a1a79020e0e0c00033e2a69291a45020e0e0c000203041a6b02103b503b501a6b02285b1a56020e0e0e0c00033e2a69291a21020e0e0c000203041a4702103b503b50301a4e020e0e0e0c0002291a4c020e0c00022b2a693b3c3c3b2d6805291af2010e0e0e0c000203041a1702103b503b503222120c0002293b693b3d3b3b2d6805291ace010e0e0e0c000203041af301103b503b50293b691a08022a691a0b022a691a0e022a691a11022a691a04022a69322a69020274011af8012a691a03022a6902022e001a02022a691ae5012a6922142a693b3c3b3b2d6805291a74010e0c000203041a9b01103b503b50293b69271d0fdd2a3529352a362b372a3c1a6a010e0e0e0c00031a69012a1a6d010e0e0c00033e2a69291a39010e0e0c000203041a5f01103b503b501a5f01285b1a4a010e0e0e0c00033e2a69291a15010e0e0c000203041a3b01103b503b50301a82010e0e0e0c0002291a80010e0c00022b2a693b3c3c3b2d6805291ae6000e0e0e0c000203041a0b01103b503b503222120c0002293b693b3d3b3b2d6805291ac2000e0e0e0c000203041ae700103b503b50293b691afc002a691aff002a691a02012a691a05012a691af8002a69322a691af0002a691afb002a691afe002a69020256001add002a6922142a693b3c3b3b2d6805291a6c000e0c000203041a9300103b503b50291aea00693b3b3b3b2d6805291a4e000e0e0e0c000203041a7300103b503b50221f22241acf000c00031ad1002a692b2a6927216502013b430e0e0e0e0e000000000000000078020000000000000000000000000000|@2850,I105,I218,I251,@243,@2880,@122,@1363,I48,@2881,@2911,@1404,@1371,@871,@2913,@1328,@2915,@2917,@2879,@1511,@2877,@871| 2879:O1|@2919 2880:S9|76616c204c6f63616c 2881:O1|@2882 2882:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@2881,@871| 2883:O1|@2884 2884:D21,304|00802b353d1a30010e0c0003036f2b362c372a3c1a29010e0e0c00031a29012a1a2d010e0e0c000329285b1a22010e0e0e0c00033e2a69291a1d010e0e0c000203041a1b01103b502d1a1c011a21010e0e0c0003291a20010e0c00022b2a693b3c3c3b2d6805291aee000e0e0e0c000203041aeb00103b5029270a02992b353b1ab5000e0e0c000303772b362c37291aee000e0e0e0c00022b1acc001ae9000e0e0c0003291ae8000e0c00021ae9002a691aec002a691aef002a691ae2002a691aed002a69293b1a6e000e0e0e0c0003030330020b302a1ade000e0e0e0c00031add002a693b3c3c3b2d6805291a68000e0c000203041a6700103b5029270d02152b353c1a31000e0e0c000303051ab70002031aba00420e000000000000000020010000000000000000000000000000|@2886,I251,@243,@2887,@122,I105,@1363,@2883,@2888,@2890,@2895,@2903,@2905,@873,@871,@1519,@870,@2907,@873,@2909,@2885| 2885:O2|3,95 2886:S27|42617365436f6465547265652e7072657474795573616765283129 2887:S8|5573654669656c64 2888:O1|@2889 2889:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@2850,I105,I218,I251,@1511,@1363,@2888,@871| 2890:O1|@2891 2891:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2890,@2892| 2892:O2|@901,@2893 2893:O2|@2894,0 2894:O2|3,93 2895:O1|@2896 2896:D8,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203282b36293b1a53000c000303051a53000214291a55000e0e0c00021a55002a691a58002a69656402013b42000000000000000048000000000000000000000000000000|@2850,I105,I218,I251,@2898,@2895,@871,@2897| 2897:O5|0,0,0,0,@2900 2898:O2|@2899,0 2899:O2|3,45 2900:O2|@2899,@2901 2901:O2|@901,@2902 2902:O2|@1461,0 2903:O1|@2904 2904:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@2850,I105,I218,I251,@2901,@1363,@2903,@871| 2905:O1|@2906 2906:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2905,@900| 2907:O1|@2908 2908:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2907| 2909:O2|3,@2910 2910:S6|4578706f7274 2911:O1|@2912 2912:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2911,@2892| 2913:O2|3,@2914 2914:S2|2a29 2915:O2|3,@2916 2916:S2|282a 2917:O1|@2918 2918:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@2917,@871| 2919:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2879,@2892| 2920:O1|@2921 2921:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2920,@900| 2922:O2|3,@2923 2923:S10|424547494e4c4f4f5028 2924:O1|@2925 2925:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203572c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b503b502c311a5d000e0e0c00031a5d002a692b2a6927056502013b430e000000000000000078000000000000000000000000000000|@2850,I105,I218,I251,@2926,@1363,@2924,@871| 2926:O2|@901,@2927 2927:O2|@2928,0 2928:O2|3,59 2929:O2|@871,@2930 2930:O2|@2931,0 2931:O2|3,@2932 2932:S3|656e64 2933:O2|3,@2934 2934:S2|696e 2935:O2|3,@2936 2936:S3|6c6574 2937:O2|3,@2938 2938:S2|6966 2939:O2|3,@2940 2940:S4|7468656e 2941:O2|3,@2942 2942:S4|656c7365 2943:O4|@14347,@1368,@2945,@2944 2944:O5|@1370,114,0,114,0 2945:S7|746f53686f7274 2946:O3|@2948,@2947,@14347 2947:O256|@2964,@2965,@2966,@2967,@2968,@2969,@2970,@2971,@2972,@2973,@2974,@2975,@2976,@2977,@2978,@2979,@2980,@2981,@2982,@2983,@2984,@2985,@2986,@2987,@2988,@2989,@2990,@2991,@2992,@2993,@2994,@2995,@2996,@2997,@2998,@2999,@3000,@3001,@3002,@3003,@3004,@3005,@3006,@3007,@3008,@3009,@3010,@3011,@3012,@3013,@3014,@3015,@3016,@3017,@3018,@3019,@3020,@3021,@3022,@3023,@3024,@3025,@3026,@3027,@3028,@3029,@3030,@3031,@3032,@3033,@3034,@3035,@3036,@3037,@3038,@3039,@3040,@3041,@3042,@3043,@3044,@3045,@3046,@3047,@3048,@3049,@3050,@3051,@3052,@3053,@3054,@3055,@3056,@3057,@3058,@3059,@3060,@3061,@3062,@3063,@3064,@3065,@3066,@3067,@3068,@3069,@3070,@3071,@3072,@3073,@3074,@3075,@3076,@3077,@3078,@3079,@3080,@3081,@3082,@3083,@3084,@3085,@3086,@3087,@3088,@3089,@3090,@3091,@3092,@3093,@3094,@3095,@3096,@3097,@3098,@3099,@3100,@3101,@3102,@3103,@3104,@3105,@3106,@3107,@3108,@3109,@3110,@3111,@3112,@3113,@3114,@3115,@3116,@3117,@3118,@3119,@3120,@3121,@3122,@3123,@3124,@3125,@3126,@3127,@3128,@3129,@3130,@3131,@3132,@3133,@3134,@3135,@3136,@3137,@3138,@3139,@3140,@3141,@3142,@3143,@3144,@3145,@3146,@3147,@3148,@3149,@3150,@3151,@3152,@3153,@3154,@3155,@3156,@3157,@3158,@3159,@3160,@3161,@3162,@3163,@3164,@3165,@3166,@3167,@3168,@3169,@3170,@3171,@3172,@3173,@3174,@3175,@3176,@3177,@3178,@3179,@3180,@3181,@3182,@3183,@3184,@3185,@3186,@3187,@3188,@3189,@3190,@3191,@3192,@3193,@3194,@3195,@3196,@3197,@3198,@3199,@3200,@3201,@3202,@3203,@3204,@3205,@3206,@3207,@3208,@3209,@3210,@3211,@3212,@3213,@3214,@3215,@3216,@3217,@3218,@2963 2948:D34,728|00802b1ada020e0e0e0c0002032e2b3b1ad5020e0e0c0003030c1ad3022c1ad7020c000302012b293d1ad4020e0c00031ad5022a1ad9022f7e0500032b1aa0020e0c0002030d56081acd021ad2021ad7026b103b503b5028662c1ad3020c0003037e3b291b00011ace020e0e0e0c000303041acb02103b503b50291aca020e0e0e0c00022d2a1ac7020c0003640341291a4d020e0e0c00021abd020e0e0c000203033c021456171ab6020e0e0e0c00022a2a1ab3020c00036403041ab202103b503b5056172a1aaf022e0e0e7e040003293c1a23020c000325011e773b640fd92b1a9c020e0c0002293e1a9b020c0003293d1a5b020c000365032128692c1a2f020c00031a89022a1a05020e0e0c00032928221afa012f0e7e0500032b1a60020e0c0002293e1a5f020c0003293c1a1f020c00036503612b1a25020e0e0c0002293b1aa3010c0003030c1aa3012a1aa7010c00030201292928081a3b020c00032928101a82010e0e0e0c0003030329020228101a2a0230692a2a1a2b020c0003291a2c021a31020e0e0c00031a31022a1a7d01347e0a00032b1a44010e0c0002030d56081a71011a76011a7b016b103b503b502b1ac901020202010e0e0c0002293e1ac3010c0003293b1a83010c00036503482b1a09010e0e0c0002030d56081a35011a3a011a3f016b103b503b502b1a6d010e0e0c0002293b1aeb000c0003030c1aeb002a1aef000c0003020129293c1ab4010e0c00036502013b039c2b1abe000e0e0e0c0002030d56081ae9001aee001af3006b103b503b502b3b1a38010e0c0003291a98000e0c00021a09010e0e0c00020339291a86000e0e0e0c0002030d56181ab1001ab6001abb006b103b503b50291a09010e0e0c0002293e1a07010c0003293d1ac7000c00036502013b032228692a1a98000e0c00031a31012a1a6d000e0e0c00032928221a6200300e7e0600031a21016402031a2301420e0e0000000000000000c8020000000000000000000000000000|@2950,I105,I234,@410,I106,@243,@2951,@122,@1368,@1369,@1364,I150,I113,@2952,I189,I251,I218,I15,I247,@599,I253,I17,I243,@2955,I108,@2956,@2958,@105,@130,@2961,I231,@2962,@2949,@2949| 2949:S20|4c4954203c6c6f6e6720776f726420646174613e 2950:S23|416464726573732e737472696e674f66576f7264283129 2951:S3|4c4954 2952:O4|103,@140,@2954,@2953 2953:O5|@1370,416,0,416,0 2954:S17|556e6b6e6f776e2052545320656e747279 2955:S6|434f44452022 2956:D4,64|00802b1a42000e0e0e0c000203032b02072b1a3b000c000256172a1a3a002e0e7e0400030e0e0e0e000000000000000030000000000000000000000000000000|@2957,I105,I152,I252| 2957:S31|416464726573732e737472696e674f66576f7264283129646174612d283129 2958:O1|@2959 2959:D17,256|00812c3c1a01010e0e0c0003030a3b2c2c0e0e0e7d0400022c3b1aeb000c000303051aeb0002b92c1aed000e0e0c0002030c2c3b1ae9000e0e0c000302013b03043b5002041ae000102c28101ae1000e0e0c0003293c1adf000c00032928081ade000e0e0e0c0003291adc001ae1000e0e0c000303041adf00103b502928413b1add000e0e0c000429311adb000c0003503b312a1ad9000e0e0c000303043b5002302928081a88000e0c00032a320e0e0e0c00022c2b2b1abe000e0e0e0c0004502b3c1a6a000e0e0e0c00032503511e3d5150291aa9000e0e0c000250292704430e0e0e0e0e0e0e0000000000000000f0000000000000000000000000000000|@2960,I113,I48,I105,I231,@132,I239,I240,I241,72057594037927935,I247,@124,I11,I151,I248,I254,I47| 2960:S18|537472696e672e746162756c617465283229 2961:S9|425954452064617461 2962:S5|46554e2022 2963:S20|504f4c595f5359535f61737369676e5f776f7264 2964:S5|2052545330 2965:S13|504f4c595f5359535f65786974 2966:S5|2052545332 2967:S5|2052545333 2968:S5|2052545334 2969:S5|2052545335 2970:S5|2052545336 2971:S5|2052545337 2972:S5|2052545338 2973:S14|504f4c595f5359535f6368646972 2974:S6|205254533130 2975:S20|504f4c595f5359535f616c6c6f635f73746f7265 2976:S21|504f4c595f5359535f616c6c6f635f756e696e6974 2977:S6|205254533133 2978:S15|504f4c595f5359535f726169736578 2979:S19|504f4c595f5359535f6765745f6c656e677468 2980:S6|205254533136 2981:S18|504f4c595f5359535f6765745f666c616773 2982:S6|205254533138 2983:S6|205254533139 2984:S6|205254533230 2985:S6|205254533231 2986:S6|205254533232 2987:S20|504f4c595f5359535f7374725f636f6d70617265 2988:S6|205254533234 2989:S6|205254533235 2990:S19|504f4c595f5359535f74657374737472677472 2991:S19|504f4c595f5359535f746573747374726c7373 2992:S19|504f4c595f5359535f74657374737472676571 2993:S19|504f4c595f5359535f746573747374726c6571 2994:S24|504f4c595f5359535f657863657074696f6e5f7472616365 2995:S22|504f4c595f5359535f676976655f65785f7472616365 2996:S27|504f4c595f5359535f657863657074696f6e5f74726163655f666e 2997:S25|504f4c595f5359535f676976655f65785f74726163655f666e 2998:S6|205254533334 2999:S6|205254533335 3000:S6|205254533336 3001:S6|205254533337 3002:S6|205254533338 3003:S6|205254533339 3004:S6|205254533430 3005:S6|205254533431 3006:S6|205254533432 3007:S6|205254533433 3008:S6|205254533434 3009:S6|205254533435 3010:S6|205254533436 3011:S16|504f4c595f5359535f6c6f636b736567 3012:S20|504f4c595f5359535f656d707479737472696e67 3013:S19|504f4c595f5359535f6e756c6c766563746f72 3014:S6|205254533530 3015:S16|504f4c595f5359535f6e6574776f726b 3016:S20|504f4c595f5359535f6f735f7370656369666963 3017:S20|504f4c595f5359535f65715f6c6f6e67776f7264 3018:S21|504f4c595f5359535f6e65715f6c6f6e67776f7264 3019:S21|504f4c595f5359535f6765715f6c6f6e67776f7264 3020:S21|504f4c595f5359535f6c65715f6c6f6e67776f7264 3021:S20|504f4c595f5359535f67745f6c6f6e67776f7264 3022:S20|504f4c595f5359535f6c745f6c6f6e67776f7264 3023:S6|205254533539 3024:S6|205254533630 3025:S20|504f4c595f5359535f696f5f6469737061746368 3026:S23|504f4c595f5359535f7369676e616c5f68616e646c6572 3027:S6|205254533633 3028:S6|205254533634 3029:S6|205254533635 3030:S6|205254533636 3031:S6|205254533637 3032:S6|205254533638 3033:S21|504f4c595f5359535f61746f6d69635f7265736574 3034:S20|504f4c595f5359535f61746f6d69635f696e6372 3035:S20|504f4c595f5359535f61746f6d69635f64656372 3036:S20|504f4c595f5359535f7468726561645f73656c66 3037:S24|504f4c595f5359535f7468726561645f6469737061746368 3038:S22|504f4c595f5359535f706c75735f6c6f6e67776f7264 3039:S23|504f4c595f5359535f6d696e75735f6c6f6e67776f7264 3040:S21|504f4c595f5359535f6d756c5f6c6f6e67776f7264 3041:S21|504f4c595f5359535f6469765f6c6f6e67776f7264 3042:S21|504f4c595f5359535f6d6f645f6c6f6e67776f7264 3043:S22|504f4c595f5359535f616e64625f6c6f6e67776f7264 3044:S21|504f4c595f5359535f6f72625f6c6f6e67776f7264 3045:S22|504f4c595f5359535f786f72625f6c6f6e67776f7264 3046:S6|205254533832 3047:S6|205254533833 3048:S18|504f4c595f5359535f6b696c6c5f73656c66 3049:S28|504f4c595f5359535f73686966745f6c6566745f6c6f6e67776f7264 3050:S29|504f4c595f5359535f73686966745f72696768745f6c6f6e67776f7264 3051:S35|504f4c595f5359535f73686966745f72696768745f61726974685f6c6f6e67776f7264 3052:S17|504f4c595f5359535f70726f66696c6572 3053:S27|504f4c595f5359535f6c6f6e67776f72645f746f5f746167676564 3054:S27|504f4c595f5359535f7369676e65645f746f5f6c6f6e67776f7264 3055:S29|504f4c595f5359535f756e7369676e65645f746f5f6c6f6e67776f7264 3056:S16|504f4c595f5359535f66756c6c5f6763 3057:S20|504f4c595f5359535f737461636b5f7472616365 3058:S24|504f4c595f5359535f74696d696e675f6469737061746368 3059:S6|205254533935 3060:S6|205254533936 3061:S6|205254533937 3062:S6|205254533938 3063:S16|504f4c595f5359535f6f626a73697a65 3064:S17|504f4c595f5359535f73686f7773697a65 3065:S7|20525453313031 3066:S7|20525453313032 3067:S7|20525453313033 3068:S16|504f4c595f5359535f71756f7472656d 3069:S17|504f4c595f5359535f69735f73686f7274 3070:S14|504f4c595f5359535f61706c7573 3071:S15|504f4c595f5359535f616d696e7573 3072:S13|504f4c595f5359535f616d756c 3073:S13|504f4c595f5359535f61646976 3074:S13|504f4c595f5359535f616d6f64 3075:S13|504f4c595f5359535f616e6567 3076:S13|504f4c595f5359535f786f7261 3077:S15|504f4c595f5359535f657175616c61 3078:S12|504f4c595f5359535f6f7261 3079:S13|504f4c595f5359535f616e6461 3080:S7|20525453313136 3081:S17|504f4c595f5359535f5265616c5f737472 3082:S17|504f4c595f5359535f5265616c5f676571 3083:S17|504f4c595f5359535f5265616c5f6c6571 3084:S17|504f4c595f5359535f5265616c5f677472 3085:S17|504f4c595f5359535f5265616c5f6c7373 3086:S16|504f4c595f5359535f5265616c5f6571 3087:S17|504f4c595f5359535f5265616c5f6e6571 3088:S22|504f4c595f5359535f5265616c5f4469737061746368 3089:S17|504f4c595f5359535f4164645f7265616c 3090:S17|504f4c595f5359535f5375625f7265616c 3091:S17|504f4c595f5359535f4d756c5f7265616c 3092:S17|504f4c595f5359535f4469765f7265616c 3093:S17|504f4c595f5359535f4162735f7265616c 3094:S17|504f4c595f5359535f4e65675f7265616c 3095:S7|20525453313331 3096:S7|20525453313332 3097:S18|504f4c595f5359535f636f6e765f7265616c 3098:S20|504f4c595f5359535f7265616c5f746f5f696e74 3099:S20|504f4c595f5359535f696e745f746f5f7265616c 3100:S18|504f4c595f5359535f737172745f7265616c 3101:S17|504f4c595f5359535f73696e5f7265616c 3102:S17|504f4c595f5359535f636f735f7265616c 3103:S20|504f4c595f5359535f61726374616e5f7265616c 3104:S17|504f4c595f5359535f6578705f7265616c 3105:S16|504f4c595f5359535f6c6e5f7265616c 3106:S7|20525453313432 3107:S7|20525453313433 3108:S7|20525453313434 3109:S7|20525453313435 3110:S7|20525453313436 3111:S7|20525453313437 3112:S14|504f4c595f5359535f737464696e 3113:S15|504f4c595f5359535f7374646f7574 3114:S20|504f4c595f5359535f70726f636573735f656e76 3115:S26|504f4c595f5359535f7365745f737472696e675f6c656e677468 3116:S28|504f4c595f5359535f6765745f66697273745f6c6f6e675f776f7264 3117:S22|504f4c595f5359535f706f6c795f7370656369666963 3118:S19|504f4c595f5359535f627974657665635f6571 3119:S7|20525453313535 3120:S7|20525453313536 3121:S7|20525453313537 3122:S7|20525453313538 3123:S7|20525453313539 3124:S20|504f4c595f5359535f636d656d5f6c6f61645f38 3125:S21|504f4c595f5359535f636d656d5f6c6f61645f3136 3126:S21|504f4c595f5359535f636d656d5f6c6f61645f3332 3127:S21|504f4c595f5359535f636d656d5f6c6f61645f3634 3128:S24|504f4c595f5359535f636d656d5f6c6f61645f666c6f6174 3129:S25|504f4c595f5359535f636d656d5f6c6f61645f646f75626c65 3130:S21|504f4c595f5359535f636d656d5f73746f72655f38 3131:S22|504f4c595f5359535f636d656d5f73746f72655f3136 3132:S22|504f4c595f5359535f636d656d5f73746f72655f3332 3133:S22|504f4c595f5359535f636d656d5f73746f72655f3634 3134:S25|504f4c595f5359535f636d656d5f73746f72655f666c6f6174 3135:S26|504f4c595f5359535f636d656d5f73746f72655f646f75626c65 3136:S7|20525453313732 3137:S7|20525453313733 3138:S7|20525453313734 3139:S7|20525453313735 3140:S7|20525453313736 3141:S7|20525453313737 3142:S7|20525453313738 3143:S7|20525453313739 3144:S7|20525453313830 3145:S7|20525453313831 3146:S7|20525453313832 3147:S7|20525453313833 3148:S7|20525453313834 3149:S7|20525453313835 3150:S7|20525453313836 3151:S7|20525453313837 3152:S7|20525453313838 3153:S21|504f4c595f5359535f696f5f6f7065726174696f6e 3154:S12|504f4c595f5359535f666669 3155:S7|20525453313931 3156:S7|20525453313932 3157:S7|20525453313933 3158:S26|504f4c595f5359535f7365745f636f64655f636f6e7374616e74 3159:S19|504f4c595f5359535f6d6f76655f776f726473 3160:S31|504f4c595f5359535f73686966745f72696768745f61726974685f776f7264 3161:S7|20525453313937 3162:S19|504f4c595f5359535f6d6f76655f6279746573 3163:S7|20525453313939 3164:S19|504f4c595f5359535f636f64655f666c616773 3165:S21|504f4c595f5359535f736872696e6b5f737461636b 3166:S15|504f4c595f5359535f737464657272 3167:S7|20525453323033 3168:S24|504f4c595f5359535f63616c6c636f64655f7475706c6564 3169:S25|504f4c595f5359535f666f726569676e5f6469737061746368 3170:S7|20525453323036 3171:S7|20525453323037 3172:S7|20525453323038 3173:S17|504f4c595f5359535f5857696e646f7773 3174:S7|20525453323130 3175:S7|20525453323131 3176:S7|20525453323132 3177:S22|504f4c595f5359535f69735f6269675f656e6469616e 3178:S23|504f4c595f5359535f62797465735f7065725f776f7264 3179:S23|504f4c595f5359535f6f66667365745f61646472657373 3180:S25|504f4c595f5359535f73686966745f72696768745f776f7264 3181:S17|504f4c595f5359535f776f72645f6e6571 3182:S17|504f4c595f5359535f6e6f745f626f6f6c 3183:S7|20525453323139 3184:S7|20525453323230 3185:S7|20525453323231 3186:S7|20525453323232 3187:S22|504f4c595f5359535f737472696e675f6c656e677468 3188:S7|20525453323234 3189:S7|20525453323235 3190:S7|20525453323236 3191:S7|20525453323237 3192:S20|504f4c595f5359535f746f7563685f66696e616c 3193:S7|20525453323239 3194:S7|20525453323330 3195:S16|504f4c595f5359535f696e745f676571 3196:S16|504f4c595f5359535f696e745f6c6571 3197:S16|504f4c595f5359535f696e745f677472 3198:S16|504f4c595f5359535f696e745f6c7373 3199:S24|504f4c595f5359535f6c6f61645f627974655f696d6d7574 3200:S24|504f4c595f5359535f6c6f61645f776f72645f696d6d7574 3201:S7|20525453323337 3202:S17|504f4c595f5359535f6d756c5f776f7264 3203:S18|504f4c595f5359535f706c75735f776f7264 3204:S19|504f4c595f5359535f6d696e75735f776f7264 3205:S17|504f4c595f5359535f6469765f776f7264 3206:S16|504f4c595f5359535f6f725f776f7264 3207:S17|504f4c595f5359535f616e645f776f7264 3208:S17|504f4c595f5359535f786f725f776f7264 3209:S24|504f4c595f5359535f73686966745f6c6566745f776f7264 3210:S17|504f4c595f5359535f6d6f645f776f7264 3211:S17|504f4c595f5359535f776f72645f676571 3212:S17|504f4c595f5359535f776f72645f6c6571 3213:S17|504f4c595f5359535f776f72645f677472 3214:S17|504f4c595f5359535f776f72645f6c7373 3215:S16|504f4c595f5359535f776f72645f6571 3216:S18|504f4c595f5359535f6c6f61645f62797465 3217:S18|504f4c595f5359535f6c6f61645f776f7264 3218:S20|504f4c595f5359535f61737369676e5f62797465 3219:S7|696e6c696e652c 3220:O1|@3221 3221:D18,336|00812b3b1a51010e0e0c000303033b0fcf2b352c362a352b36303c1a42010e0e0e0c00031a41012a1a45010e0e0c00033e2a69291a41010e0e0c000203041a3f01103b501a4101285b1a24010e0c00033e2a69291a21010e0e0c000203041a1f01103b502e1a28010e0c0002291a28010e0c00022b2a693b3c3c3b2d6805291af6000e0e0e0c000203041af300103b50293b691a0a012a69312a69220d3b1ab7000c000303051aff0002013b220f1ac7000c00021af9000e0e0c00021af1000e0e0c000203033b02031aec00293b1a87000c000303032a020f2a2a1ae200020253000e0e0e0c0003293b1a6b000c000303032c020b2c2a1ace000e0e0e0c00033b3f3b3b2d6805291a6d000e0e0c000203041a6b00103b5022183c1ab2000e0e0e0c00032922151aae000e0e0e0c00032b2a692717430e0e000000000000000040010000000000000000000000000000|@3223,I251,@243,@2846,@122,I105,@1363,I48,@3224,@3226,@871,@3228,I218,@3232,@3234,@3222,I106,@3220| 3222:O1|@3236 3223:S34|42617365436f6465547265652e7072657474792831297072696e7441726773283229 3224:O1|@3225 3225:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3224,@871| 3226:O1|@3227 3227:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3226,@2892| 3228:O2|@871,@3229 3229:O2|@3230,0 3230:O2|3,@3231 3231:S5|3a7265616c 3232:O2|@901,@3233 3233:O2|@872,@1700 3234:O1|@3235 3235:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3234| 3236:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3222| 3237:S8|206c6f63616c732c 3238:O1|@3239 3239:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363f2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3238| 3240:S8|636c6f737572653d 3241:O1|@3242 3242:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203572c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402382a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b503b502c311a5d000e0e0c00031a5d002a692b2a6927056502013b430e000000000000000078000000000000000000000000000000|@2850,I105,I218,I251,@1511,@1363,@3241,@871| 3243:O1|@3244 3244:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3243,@900| 3245:S14|726563757273697665207573653d 3246:O1|@3247 3247:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3246,@871| 3248:O1|@3249 3249:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3248,@2892| 3250:O2|@871,@3251 3251:O2|@2913,0 3252:O2|3,@3253 3253:S3|666e28 3254:S5|282a562a29 3255:O2|3,@3256 3256:S9|526563757273697665 3257:S7|436c6f73757265 3258:S5|4c6f63616c 3259:D26,680|00802b353b1aa8020e0c000307dd2b362c372d382e392b3c1a9d020e0e0c00031a9d022a1aa1020e0e0c00033e2a69291a9d020e0e0c000203041a9b02103b503b501a9b02285b1a7e020e0e0e0c00033e2a69291a79020e0e0c000203041a7702103b503b50311a7e020e0e0e0c0002291a7c020e0c00022b2a693b3c3c3b2d6805291a4a020e0e0e0c000203041a4702103b503b50333c1a1d020e0e0c00031a55022a1a21020e0e0c00033e2a69291a1d020e0e0c000203041a1b02103b503b50220c121200010001000e0e0c0002293b691a2a022a691a2d022a691a20022a692e2a691a18022a02024600691a1f022a691a0a022a69220c2a691a01022a691a14022a691a17022a691af2012a6922172a693b3c3b3b2d6805291ab1010e0e0c000203041aaf01103b503b502927200fcd2b353d1a77010c0003030a2b362956272d7d0400022b353e1a62010e0e0e0c000303312b362956271aca010e0e0e0c00031ac9012a693b3b3c3b2d6805291a5c010e0c000203041a5b01103b503b502927040fdd2b362c372d382a3c1a26010e0e0e0c00031a9d012a1a29010e0e0c00033e2a69291a25010e0e0c000203041a2301103b503b501a2301285b1a06010e0e0e0c00033e2a69291a01010e0e0c000203041aff00103b503b50301a5e010e0e0e0c0002291a5c010e0c00022b2a693b3c3c3b2d6805291ad20002028b000e0e0e0c000203041acb00103b503b503256d70c0002293b693b3d3b3b2d6805291aaa000e0e0e0c000203041aa700103b503b50293b691a14012a691a17012a691aba002a691a15012a691ab0002a69322a691aa8002a691a0b012a691a0e01020227002a691a95002a6922142a693b3c3b3b2d6805291a54000e0c000203041a5300103b503b5029271c420e0e000000000000000098020000000000000000000000000000|@3261,I251,@243,@2880,@122,I105,@1363,I48,@3262,@3264,@3266,@871,@3267,@2913,@1328,@2915,@3269,@3283,@2880,@3285,@3260,@1404,@1371,@2913,@1328,@2915| 3260:O1|@3287 3261:S29|42617365436f6465547265652e70726574747942696e64696e67283129 3262:O1|@3263 3263:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3262,@871| 3264:O1|@3265 3265:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3264,@2892| 3266:S12|3d20436f6e7461696e657220 3267:O2|3,@3268 3268:S4|77697468 3269:O1|@3270 3270:D21,632|00812c1a7a020e0e0e0c00021a79020e0e0c000207dd2c352d36293b1a71020e0e0c000307dd2a352b362c372a3c1a67020c00031a69022a1a6d020e0e0c00033e2a69291a39020e0e0c000203041a5f02103b503b501a5f02285b1a4a020e0e0e0c00033e2a69291a15020e0e0c000203041a3b02103b503b50301a42020e0e0e0c0002291a40020e0c00022b2a693b3c3c3b2d6805291ae6010e0e0e0c000203041a0b02103b503b502807336922110e0c0002293b693b3d3b3b2d6805291abe010e0e0e0c000203041ae301103b503b50293b691af8012a691afb012a691afe012a691a01022a691af4012a69322a69020264011af8012a691ae3012a692212020224002a693b3b3b3b2d6805291a6e010e0e0e0c000203041a9301103b503b50293b69271a0fdd2a352b362c372a3c1a64010e0c00031a65012a1a69010e0e0c00033e2a69291a35010e0e0c000203041a5b01103b503b501a5b01285b1a46010e0e0e0c00033e2a69291a11010e0e0c000203041a3701103b503b50301a76010e0e0e0c0002291a74010e0c00022b2a693b3c3c3b2d6805291ae2000e0e0e0c000203041a0701103b503b502807336922110e0c0002293b693b3d3b3b2d6805291aba000e0e0e0c000203041adf00103b503b50293b691af4002a691af7002a691afa002a691afd002a691af0002a69322a691af8002a691ae3002a6922122a693b02024e003b3b3b2d6805291a6e000e0e0e0c000203041a9300103b503b50291ae200693b3b3b3b2d6805291a4e000e0e0e0c000203041a7300103b503b50221c22211ac7000c00031ac9002a692b2a69271e6502013b430e0e0e0e0e000000000000000068020000000000000000000000000000|@2850,I105,I218,I251,@243,@3258,@122,@1363,I48,@3272,@3274,@1404,@1371,@871,@2913,@2915,@3276,@3278,@3271,@3269,@871| 3271:O2|@901,@3280 3272:O1|@3273 3273:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3272,@871| 3274:O1|@3275 3275:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3274,@2892| 3276:O1|@3277 3277:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3276,@871| 3278:O1|@3279 3279:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3278,@2892| 3280:O2|@3281,0 3281:O2|3,@3282 3282:S5|20616e6420 3283:O2|3,@3284 3284:S8|76616c2072656320 3285:O1|@3286 3286:D9,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36293b1a89000e0e0c000303102a1a86000e0e0e0c0002293b696402382a1a76000e0e0e0c0002291a7400693b3b3b3b2d6805291a48000e0c000203041a6700103b502c1a68000e0c00021a69002a692b2a6927056502013b420e0e0e0e0e000000000000000080000000000000000000000000000000|@2850,I105,I218,I251,@2883,@1511,@1363,@3285,@871| 3287:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3260,@2892| 3288:O1|@3289 3289:D2,72|008504020031303c2c3432321a41000e0e0c00085029352a362a352b362c37332c452a462b472d4827061f060e0e0e0e000000000000000038000000000000000000000000000000|@3291,@3290| 3290:O1|@3292 3291:S41|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d69736572283329 3292:D28,672|008604030032322b1a9d020e0e0c00045029352a362b373303033c02012907d231291a8b020c00021a8d020e0e0c0002032429352a362a35291a84021a89020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a6b020c0003036b1a6b02291a47020c00021a49020e0e0c0002032429352a362a35291a40021a45020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a27020c000303041a2f02103b503b50293529351a0b021a10020e0c000303043b5002041a1b02103b50293765021e293529351aec011af1010e0e0c000303043b5002041afb01103b5029376433291ac001020284010e0c00021abd010e0e0c0002032429352a362a35291adc011ab9010e0e0c00036403052a68010207292503511e343b6502013b64293b1a9b010c000303051abb01021c293529351aaa011a87010c000303043b5002041a9301103b502937642f35303631372a2c2b1a99010e0e0c00042f030b1a96012e0e0e0c000202013b3003102a1a8e010e0e0e0c00022f0c000202013b2b1a85011a8a011a8f01220f1a92011a97010c000732030b1a9601310e0e0c000202013b3303102a1a56010e0e0e0c0002320c000202013b3c28403b1a7a010e0e0e0c00043c284022111a6c010e0c00041a6d012a692922192d6a1a6b012a69302a1a6c010e0c00030403002f3b1a68010e0c0003031d2e3b1a5d010e0e0c0003303b1a53010c00032b2d452b462a472603021a2e3b1a40010e0c00032b221e2b2d222022201a38010e0c00075129352a362b372215030b1a2e0122140e0c000202013b221603132c1ab5000e0e0c000222150e0e0e0c000202013b2d2d2d22252225222522251a070122267b09260008322c452b4627041f070e0e0e0e0e0e0e000000000000000090020000000000000000000000000000|@3294,@3295,I105,I218,@14385,I251,@2781,@2836,@1576,@14408,@3691,@3693,@3697,@2843,@655,@3699,@3705,@3707,@3474,@3709,I11,@3711,@3713,@3315,I253,@4014,@3293,@3290| 3293:O2|3,@5219 3294:S55|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f6365737354726565283329 3295:O1|@3296 3296:D13,192|00823c28403b1abf000c00042d3b1abf000c000303033c020b2d1abb001ac0000e0c000303041abf00103b502d3c1abf000c00032928403b1a8d000e0e0c0004293b311ab2000e0e0e0c0004501ab0002a691ab3002b691ab6002e693c28403b1a65000e0e0c00042c2a2d2d6b040300220d2b2b1aa1000e0e0c00045029352a362b372b2b2b6a220c3b1a93000c0003303b1a8b000c000322112c452b462a47270f440e0e0e0e0e0000000000000000b0000000000000000000000000000000|@3298,I11,I234,72057594037927934,I231,@1603,I106,I255,@3299,@3301,@3307,@3297,I253| 3297:O7|@3310,@3349,@3372,@3422,@3472,@3566,@3309 3298:S35|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229 3299:D7,104|00802b352c362968012b3b1a62000e0e0e0c000303033c021456373b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356472a2c1a5100320e0e0e7b05070004000000000000000058000000000000000000000000000000|@3300,I234,I253,I231,@1614,I106,I255| 3300:S47|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229656e74657241646472283129 3301:D10,184|00802b353c1ab8000e0c000303041ab700103b502b353e1aa6000e0e0e0c0003030b3c2c69291aa7006964026e2b353b1a8d000e0e0c0003030b3c2c69291a8f00696402562b36293b1a8c000e0c000303033c021456173b1a85000e0e0c00032a2a1a83000c00036403041a8200103b50293c1a82000e0e0e0c000356272a1a5e000e0e0e0c0003293b1a33000c000303041a6b00103b50293566420e0e0e0e0000000000000000a8000000000000000000000000000000|@3303,I251,@3302,@588,I234,I253,I231,@1586,I106,@1792| 3302:O4|@14322,@596,@3305,@3304 3303:S48|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296c6f6f6b757041646472283129 3304:O5|@3306,921,0,921,0 3305:S31|746f70206c6576656c207265616368656420696e2073696d706c6966696572 3306:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f53494d504c49464945522e736d6c 3307:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003293c1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@3308,I253,I106,I255| 3308:S44|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296d6b41646472283129 3309:O7|@3614,@3297,@3349,@3372,@3422,@3472,@3566 3310:D7,440|00822d350a0e001e00f9001e0011015d011e003b0025011e001e0049011e001e001e00e7001a9801561c2e6a2e2a1a97010c0003292e1a97012f0e0e7e0700030fce2d362e372f380403002c312b300e0e0c00045029352a362b3729353d1a77010c0003033929372f2a0e0e0e0c000229352a362a353b1a5e010e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964220e2a4530462b472705024b2d03202b353d1a30010e0c0003030c2b2f3c1a2c010e0c0004020628062c303c6b021e2b353d1a10010e0c0003030c2b2f3b1a0c010e0c0004020628062c303b6b332a452c461a00014764270702ae2d362e372a2a30305667310e0e7b060700052d362e372f382b2b2b323256883302028a000e7b070800062d362e372f382a2c2b32325689330e7b070800062d360402002a2f3b3b2d567a0e0c00065029352a3628072b69302a453b462b472705024c2d362e372a2a69293030566b310e0e7b050800042d362d372a2a0e0e0e0c000229352a362a353b1a5e000e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964312a453b462b472706440e0e0e0000000000000000a8010000000000000000000000000000|@3312,@3313,@3315,@3311,I251,@2288,@588| 3311:O1|@3345 3312:S36|434f4445545245455f53494d504c494649455228292e73696d705370656369616c283229 3313:D1,48|00802b5618355628365638375648385657300e7b07030006000000000000000020000000000000000000000000000000|@3314| 3314:S39|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283129283129 3315:O1|@3316 3316:D4,64|00812c2c0e0c0002293b1a3b000c0003030e2d1a3a002e1a3e002f7b05050004293564430e0e0e0e000000000000000030000000000000000000000000000000|@3318,I251,@3315,@3317| 3317:O1|@3319 3318:S27|42617365436f6465547265652e6d6170436f646574726565283229 3319:D8,464|00822d350a0e00d000f100aa015f01a70189008a011a01a600bc001e00ab0053003d0073002d362e372a2f2f1aa9010e0e0c00042a2f310e0e0c0003402b2b6a27040fcd2d362e372f382a2f310c0003280d2d2b2d6b27040fdd2d362e372f38292f310e0e0c00032c30320e0e0c0003280c2a2e2d6b27050fd42d362e372a2f2f1a5c010e0c0004280e2a2c6a660fdd2d362e372a2e300e0e0c00032a2f310e0e0c000328052b2b6a27040fd31a38010fd02d36292d2f0e0e0c0003280b2a69650fd92d36292e2e1a25010e0e0c000428092a696502db2d362e372a2e300e0e0e0c00032a30301a0e010e0e0e0c00043b2b2b6a270402ba2d362e372f382b2f310c00032b30320e0e0c00032b313302029f000e0e0c00033c2c2c2c6b270602912d3629352a362b372c382d392e3a2f23063023070202790030220c220e0e0e0e0c00032e220e220e1ab400020262000e0c00042a32322c32323232680828072a69270c024c2d362e372f02024300382a2f310e0e0c00032c31311a8a00020430002e000e0c00043e2a2c2e6b270502212d362e372f382b2f31020214000e0e0e0c000328062a2d2d6b270402042d02012d440e0e0e0e0e0000000000000000c0010000000000000000000000000000|@3321,@3322,@3333,@3335,@3336,@3338,@3340,@3320| 3320:O1|@3344 3321:S34|42617365436f6465547265652e6d6170436f6465747265652832296d617074283129 3322:O1|@3323 3323:D5,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e362a2f2f1a50000e0c00042a30301a4e000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3324,@3322| 3324:O1|@3325 3325:D3,144|00822d353b1a90000e0c000303192d362e372f3830392930320c00033b2e2e2e2d6805270502502d353d1a6b000c000303102d36292d2f0e0e0c00033d2a696502352d353e1a50000e0c000303142d36292e2e1a4a000e0e0e0c00043e2a696502152d362e372f38292f310e0e0c00033c2d2d2c6b270444000000000000000080000000000000000000000000000000|@3327,I251,@3326| 3326:O1|@3328 3327:S47|42617365436f6465547265652e6d6170436f6465747265652832296d6170742831296d617062696e64696e67283129 3328:D6,120|00822d1a7a000e0e0e0c00021a79000e0e0c000203452d352e362a352b362c3728072a692932340e0e0c0003293528071a5d000e0e0c000303043b5002041a57001029362e2e2b6a30220d220d1a50000e0c00042a2a69270a02013b440e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,I251,@3329,@3326| 3329:O4|@14322,@596,@3331,@3330 3330:O5|@3332,500,0,500,0 3331:S8|64654c616d626461 3332:S45|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42617365436f6465547265652e736d6c 3333:O1|@3334 3334:D4,80|00822d1a52000e0e0e0c00021a51000e0e0c0002031d2d352e362a2e300c00032a30301a42000e0e0e0c00042a2a69270402013b440e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3333| 3335:O1|8 3336:O1|@3337 3337:D4,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e362a352b362a30320c0003292b692d33331a43000c00042a2a69270702013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3336| 3338:O1|@3339 3339:D4,104|00822d1a6a000e0e0e0c00021a69000e0e0c000203312d352e362a352b362a352b362c372933220c0e0c00032c2c2b6a292f6931220e220e1a45000e0e0c00042a2a69270b02013b440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@3338| 3340:O1|@3341 3341:D6,112|00822d1a72000e0e0e0c00021a71000e0e0c000203392d352e363f2b69292f310e0c000329353f1a5e000e0e0e0c000303043b5002041a57001029362c32321a56000e0e0e0c00042a2a69270602013b440e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,I251,@3342,@3340| 3342:O4|@14322,@596,@2336,@3343 3343:O5|@3332,499,0,499,0 3344:D4,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e362a352b362a30320c0003292b692d33331a43000c00042a2a69270702013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3320| 3345:D9,224|00812c353d1ae0000e0c000303652c362d373d2b2b6a2a291ad5000e0e0c00021ad5000e0e0c0002033a29352a362a35291acc001ab1000e0e0c000364031b2a351abc001aa1000e0e0c000303043b5002041ab300102a370207292503511e473b6502031aa900642f2b453b462a47270402512c35401a6f000c0003033d2c362d370403002a2a1a8e000e0e0e0c00035029352a362b372a3b1a4c000e0c000303032e020b2e2b1a76000e0e0e0c0003322d452a462b47270702092b2d453b461a4d0047430e0e0e0000000000000000d0000000000000000000000000000000|@3347,I251,I105,I218,@14321,@1576,@588,@3311,@3346| 3346:O1|@3348 3347:S44|434f4445545245455f53494d504c494649455228292e73696d705370656369616c28322973706c6974283129 3348:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3346| 3349:O2|@3350,@3297 3350:D11,216|00833b2f291ad8000e0c00021ad9000e0e0c0002031729362b3c1ad3000c0003292b25042504511e233b6502012a652f56272f1ac2000e0e0e0c00040402002a2a1abc000e0c00035029352a362a1ab7000c000229291a87000c00021a89000e0e0c0002031d29352a362a353d1aa0000e0c00030309292503511e253b02013b6502013c640310280e2a220c6a291a87000c0002640206280e2a220c6a2b1a7f000c00021a81002e693d322b6a220c2d452c462a47270a1f040e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@3352,I105,I218,I106,@3353,@3360,@3363,I251,@2349,@3367,@3351| 3351:D6,104|008056072c2a1a67000c00021a69000e0e0c000203043b5002041a6300102a352b362b3b1a61000e0e0c000303032a02172b3c1a5a000e0e0e0c00032a2a2505250526031e3f3b642704420e0e0e0e0e000000000000000058000000000000000000000000000000|@3371,I105,I218,@611,I113,I107| 3352:S34|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329 3353:O1|@3354 3354:D5,120|00822d1a7a000e0e0e0c00021a79000e0e0c000203412d352e360403002b2f2b320c00045029352a362b372b2b2b6a0402002a342b1a58000e0c00045029352a362a2a6932220f220f1a4c000e0c00042a2a69270c02013b440e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,@3355,@3353| 3355:O1|@3356 3356:D3,168|00822d3529353f1aa6000e0e0e0c0003031529362f3630373c2c69292b69312a452d462705026529353d1a83000c0003031829362a37303631373b2d2d6a292b69322a452d46270602422e362f372f383b2a0e0e0e0c00023d2a693c2a69292e693c3b2e336b293b69293b1a42000e0e0e0c0003030331020b312a1a3a000e0e0e0c0003220d2d452a46270a64440e0e000000000000000098000000000000000000000000000000|@3358,I251,@3357| 3357:O1|@3359 3358:S36|434f4445545245455f53494d504c494649455228292e6d616b654e65774465636c283229 3359:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3357| 3360:O1|@3361 3361:D4,96|00812c3b1a61000e0e0c0003030d1a5f002c2a35452a36466402272c352d362a352b360402002c2a1a4d000e0e0c00035029352a362d2b692d2b69342b452a462709430e0e0e0e0e000000000000000050000000000000000000000000000000|@3362,I251,@1505,@3360| 3362:S17|4c697374506169722e756e7a6970283129 3363:O1|@3364 3364:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a352b362a353b1a64000e0c000303152a362b37292c1a5d000e0e0c00033d2c2b6a6602062a363f2a69642c1a4f000c00022a2a69270602013b420e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,I251,@3365,@3363| 3365:O1|@3366 3366:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3365| 3367:O1|@3368 3368:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c36291a5a000e0e0e0c0002293b1a57000c000303032b020b2b2a1a5200300e7e0600036602013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1746,I105,I218,@3367,I251,@3369| 3369:O1|@3370 3370:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3369| 3371:S45|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329737065635265632d283129 3372:O2|@3373,@3297 3373:D15,640|0084040300302e2b56470e0e0e0c00045029352a362b372b353d1a6b020c0003034a2b36293b1a5f020c00030303320201330403002a342b56a70e0e0e0c00045029352a362b372a3b1a3c020e0c0003030330020b302b1a36020e0e0e0c0003220d2d452a462b4727070fd12a2c2b1a26020e0e0e0c000404030034332b56970e0c00045029352a362b37040300220e220e2b56d70c00045029352a362b372f35280b1ae2010e0e0e0c000303232e302f1aec010e0c00043c332b1aea016b3d2a69292e69221330452a462e4727040fdb2f353d1ab1010e0e0c000307d02f362f3b1aa3010c0003031b2c353d1a98010e0c0003030c2b3b1a8d010e0e0c000302013b02013b039b2c362a2a1a79010e0e0c000303133d3469293b69221334452a461a8b01476502772a3c1a5a010e0e0e0c00030310293b1a4d0102021f010e0e0c000302013b030c221134453b461a5e0147024b2a3b1a2e010e0e0e0c0003030c293c1a21010e0e0c000302013b031f333b69291a40010e0c00023e2a1a3f013c6b22142a453b461a2401476602103c3433306b22122a453b461a1201476464025e2c35280b1ade000204ae0054000e0c000303242b2d2c1a0c010e0c00043c341ae3002c6b3d2a692933692214220c452a463347270402272f31301af0000e0c00042c2e2d1aee000e0e0e0c00043c220c2c2c6b22132a453b461ab10047666402582b35280b1a7d000e0e0c000303232a2c2b1ac8000e0c00043c331a87002c6b3d2a69293269221334452a463247270402272e302f1aad000e0e0c00042b2d2c1aaa000e0e0e0c00043c342c2c6b22122a453b461a56004766270927041f050e0e0e0e0e0e000000000000000070020000000000000000000000000000|@3375,I251,@3376,@3378,@3393,@542,@588,@3397,@546,@3399,@3403,@3407,@3411,@3415,@3374| 3374:O1|@3419 3375:S39|434f4445545245455f53494d504c494649455228292e73696d7049665468656e456c7365283429 3376:O1|@3377 3377:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3376| 3378:O1|@3379 3379:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3382,@3378,@3380| 3380:O1|@3384 3381:S43|434f4445545245455f53494d504c494649455228292e7370656369616c546f47656e6572616c2833292829 3382:O1|@3383 3383:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3382| 3384:D10,256|00812c3b1a01010e0e0c000303032b02d52b353f1af1000e0e0c000303112b3629353d1ae2000e0e0e0c00036402013b03b02b3629362e291ad5000e0e0c00021ad5000e0e0c000203043b5002041acf001029352a36293b1aad000e0e0c000303032a0207292503511e323b6629353c1a95000e0e0c0003036129372a382c2b1aa5000e0e0c0003034a3b32291a80000e0c00021a81000e0e0c0002031729362b3c1a8b000c0003292b25042504511e233b6502012a65293c1a7c000e0c0003332a1a7b000c0003292d1a7b00220c0e7e0c00034032326a6502044030306a660204402d2d6a430e0000000000000000f0000000000000000000000000000000|@3386,I251,I105,I218,@3387,I113,I106,I107,@3385,@3380| 3385:O1|@3389 3386:S30|434f4445545245455f53494d504c494649455228292e6d6b456e76283229 3387:O4|@14358,@1714,0,@3388 3388:O5|@614,88,0,88,0 3389:D7,96|00812b3b1a61000e0e0c000303033b02342c1a5b000c00021a5d000e0e0c000203043b5002041a5700102c352d362d3c1a55000e0e0c00032a2a1a53000c00032c2a692704430e0e000000000000000050000000000000000000000000000000|@3391,I113,I105,I218,@3390,I107,@3385| 3390:O4|11,@49,0,@3392 3391:S12|4c6973742e74616b65283229 3392:O5|@614,108,0,108,0 3393:O1|@3394 3394:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3395,@3393,@3380| 3395:O1|@3396 3396:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3395| 3397:O1|@3398 3398:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3397| 3399:O1|@3400 3400:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3401,@3399,@3380| 3401:O1|@3402 3402:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3401| 3403:O1|@3404 3404:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3405,@3403,@3380| 3405:O1|@3406 3406:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3405| 3407:O1|@3408 3408:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3409,@3407,@3380| 3409:O1|@3410 3410:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3409| 3411:O1|@3412 3412:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3413,@3411,@3380| 3413:O1|@3414 3414:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3413| 3415:O1|@3416 3416:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3417,@3415,@3380| 3417:O1|@3418 3418:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3417| 3419:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3420,@3374,@3380| 3420:O1|@3421 3421:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3420| 3422:O3|@3423,@3297,@3309 3423:D43,1192|00842c36040300312f2b56570e0c00045029352a362b3734353f1a93040c000303533436521a900445531a930445292b462c476c502a2a466c50220d291a88040e0c00021a89040e0e0c0002032229352a362a35293b301a7e040e0e0e0c00046403033c0207292503511e2e3b6502013b270402013b2a353b1a34040e0c0003030c293b1a29040e0e0c000302013b07cb2a362b372a352b392c23063b2b291a26040e0e0e0c00021a25040e0e0c0002031729362b3c1a27040c0003292b25042504511e253b6502012a653b2212291af6030e0e0e0c00021af5030e0e0c0002031729362b3c1af7030c0003292b25042504511e253b6502012a652a2a1ae8030e0c00036503043b5002041ae20310333b3c1ae3030c000450220e36220f382b3b1adc030e0c000303033c020b2b1ad7031adc030e0c000303041adb03103b502b3c1a9b030c00032928403b1ad1030e0e0c0004293b2f1a9e03020242010e0e0e0c00045022141211000100010022141ab5030e0e0c00040402002a2a1ab0030e0c00035029352a362a3b1a22030e0e0e0c000303051a9f0302903b2b291a27030c00021a29030e0e0c0002031729362b3c1a2b030c0003292b25042504511e223b6502012a65291a75031a42030e0e0e0c000303041a6f03103b502928403b1a3d030e0e0c00043b2d293b1ac1020e0e0c000303043b50022629352a362d2d2c1af4020e0c0004502c3c1ad2020e0e0e0c0003292b2505250526031e32260351291a2b030c00025029652a1a29030e0e0c00021a2903220e2c326b1a2903316929220c2c220d6b04030022102b2b121d00010001000e0e0e0c00045029352a362b372a3b1a48020e0c0003030330020b302b1afa020e0e0e0c0003293b1a2f020c000303042219020a22192a1ae8020e0c000322202e452a462c4727180fce2c353d1a0a020e0e0e0c000307cf2c36220c5688220c1ac7020c00042a1a08020e0c000203041abf02103b5028662b1abe020e0e0e0c0003036128672b1ab8020e0c0003291ab8021abd020e0e0c0003291aac021ab9010e0e0c000365033929291ac4010e0c00021ac5010e0e0c0002032229352a362a3529353d1a92010e0e0e0c0003640309292503511e2b3b02013b6502013c6402013b02013b07cf291a6e020e0e0e0c00022b1a7c010e0c000203041a6302103b5028662c1a32020e0e0e0c0003032d28672c1a2c0202021c010e0c0003291a28021a2d020202f3000e0e0c0003291a18021a25010e0e0c00036502013b03043b5002041a230210280e2a3b6a2a291a20010e0c00021a21010e0e0c0002031d29352a362a353d1af0000e0c00030309292503511e263b02013b6502013c64030b291aed010e0e0c0002020129291ae1010e0e0c000229353d1abe000e0e0e0c000303043b5002041acf0110293678812b311abd00020251000e0e0c000203041abf01103b50312c691abe010e0e0e0c00023d2a3b6a64052d0e0e0e00ff6d29353c1a75000e0e0c0003030f29352a362b372b2b2b1a9a016b66103b503d2a3b6a280b2a6965270502063e2a30220f6b342a452f461a82014766021a345678341a7f010c00043e2a2f220e6b332a452e461a6601476527061f05000000000000000098040000000000000000000000000000|@3425,I251,@3426,@3428,I105,I218,@3429,I106,I113,@3436,I255,I234,72057594037927934,I231,@1603,I11,@3439,@3360,I49,72057594037927935,@3441,I47,@3443,@3447,@3452,@3454,@3456,@3458,@1363,I150,I153,805306368,I243,@3461,@1363,@3463,@2349,@3466,@1363,I204,@3469,@588,@3424| 3424:O1|@3470 3425:S41|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429 3426:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@3427| 3427:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283129 3428:D6,336|00812c353e1a50010e0c000303052b3c690fd22c3528071a3e010e0e0e0c000303412c362938292e2a1a34010e0c00021a35010e0e0c000203212a352b363f2b69292d56971a28010e0c00042b2a2506250626041e2c3b270402012965293c696602cd2c353f1aef000c000303bf2c362c03033c02b12956281adc000e0c000303033c02a229353b1acd000e0e0c0003031f5618353b1abf000c0003031029365628361ad2000e0e0e0c000302013b027629353c1aa1000e0e0c0003031f5618353c1a93000c0003031029365628361aa6000e0e0e0c000302013b024a29353d1a7500020249000e0e0c0003031f5618353d1a63000c0003031029365628361a76000e0e0e0c000302013b021a29353e1a45000e0e0c0003030c5618353e1a37000c000302013b293b696502032b3b69430e0e0e0e0e0e0e000000000000000040010000000000000000000000000000|@3430,I251,I105,I218,@3429,I113| 3429:O1|@3431 3430:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283229 3431:D4,72|00822d2d692c0e0e0e0c00022936293b1a3d000e0e0c000303122a35302a1a3700311a3b00320e7b060800052a356544000000000000000038000000000000000000000000000000|@3433,I251,@3429,@3432| 3432:O1|@3434 3433:S24|42617365436f6465547265652e666f6c6474726565283329 3434:D4,736|00832e350a0e00a001e901b8025d02b5023f01a9020d02590169011e005c01f100e30009012e362f372a302a1ab9020e0e0c00021ab9020e0e0c0002039d2a352b362a353b1ab0020e0c0003030d2a39292d34220d0c00046402722a353d1a97020c0003030d2a36292d34220d0c000464025a2a353e1a7f020c000303412a36292d2a1a62020e0e0e0c00021a61020e0e0c000203252a352b362a3728072a69292e221122130e0e0e0c00042c2a2507250726051e323b270502012966020e2a38292d34220d0e0e0e0c0004642a2a2505250526031eaa3b66020129652a2a3032310e7b050900040fcf2e37292f2e302f0e0e7b050700042e362f3829302f310e0c00042b2a3032310e0e7b050900042e36292f2a1ad0010e0c00021ad1010e0e0c0002031c2a352b362a2c32340e0e0e0c00042a2a2505250526031e283b66020129660fdc2e362f372a302f310e0e0e0c00042a2a3032310e0e7b050900042d0fca2e36292f2e302f0e7b050700042e36292f2a1a70010e0c00021a71010e0e0c0002031d2a352b362a35292d33220c0c00042b2a2506250626041e283b2704020129660fd12e362f3729302a1a37010c00021a3901020205010e0e0c000203212a352b362a352937292e220c220e0e0c00042c2a2507250726051e2f3b2705020129652b2a3032310e7b050900042e362f3730382b3130320e0e0e0c00042b2a31330e0c00042b2a3234330e0e7b050b00042e3629352a3829312a1ac80002029c000e0c00021ac500020291000e0e0c000203212a352b363f2b69292d220c220e0e0e0c00042b2a2506250626041e343b2704020129652b2a3133320e7b050a00042e362f3729302f310e0c00042b2a2a1a7200020246000e0e0e0c00021a6d000e0e0c000203212a352b362a35292d220c220e0e0e0e0c00042b2a2506250626041e323b2704020129270502102e36292f2e302f7b050700042d02012d1f040e0e0e0e0e0e0000000000000000d0020000000000000000000000000000|@3435,I105,I218,I251| 3435:S32|42617365436f6465547265652e666f6c64747265652833296674726565283229 3436:O4|@14322,@596,@3438,@3437 3437:O5|@3306,589,0,589,0 3438:S35|73696d7046756e6374696f6e43616c6c3a20617267756d656e74206d69736d61746368 3439:O1|@3440 3440:D5,120|00822d1a7a000e0e0e0c00021a79000e0e0c000203452d352e362a350403002a302b330e0e0c00045029352a362b372b2b2b6a0402002a220c2b1a53000c00045029352a362a2a6933221022101a48000e0c00042a2a69270d02013b440e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,@3355,@3439| 3441:O4|4,@127,0,@3442 3442:O5|@601,124,0,124,0 3443:O1|@3444 3444:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c36291a5a000e0e0e0c0002293b1a57000c000303032b020b2b2a1a5200300e7e0600036602013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1746,I105,I218,@3443,I251,@3445| 3445:O1|@3446 3446:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3445| 3447:D14,232|00802b353e1ae8000e0c000303041ae700103b502b353c1ad6000e0e0e0c0003030a2b362956272d7d0400022b353b1abe000e0e0e0c0003033e2b36291ac0000e0c00021ac1000e0e0c000203033c021456181aba000e0e0e0c00022a2a1ab7000c00036403041ab600103b5056182a1ab5002e7e0400032b36293b1ab1000e0e0c000303033c021456193b1a99000e0e0c00032a2a1a9f000c00036403041a9e00103b50293c1a9e000e0e0e0c000356292a1a72000e0e0e0c0003293b1a2f000c000303041a8700103b50293566420000000000000000d8000000000000000000000000000000|@3449,I251,@3448,I105,I218,I15,I247,@599,I253,I234,I231,@1586,I106,@1792| 3448:O4|@14322,@596,@3451,@3450 3449:S56|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c2834296c6f63616c4f6c6441646472283129 3450:O5|@3306,619,0,619,0 3451:S27|6c6f63616c4f6c64416464723a204c6f6164526563757273697665 3452:D7,104|00802b352c362968012b3b1a62000e0e0e0c000303033c021456373b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356472a2c1a5100320e0e0e7b05070004000000000000000058000000000000000000000000000000|@3453,I234,I253,I231,@1614,I106,I255| 3453:S59|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429736574546162466f72496e6c696e65283129 3454:O1|@3455 3455:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3454| 3456:O1|@3457 3457:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3456| 3458:O1|@3459 3459:D6,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a352b361a570031316a2b2a1a57000c0003292c692e34341a53000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@3460,@3315,@3458| 3460:D1,48|00802b5618355628365638375648385657300e7b07030006000000000000000020000000000000000000000000000000|@3314| 3461:O1|@3462 3462:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3461| 3463:O4|@14322,@596,@3465,@3464 3464:O5|@3306,118,0,118,0 3465:S13|6e6f74206561726c7920727473 3466:O4|@14322,@596,@3468,@3467 3467:O5|@3306,124,0,124,0 3468:S26|6d616b65436f6e737456616c3a204e6f7420636f6e7374616e74 3469:O5|@3306,133,0,133,0 3470:D6,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a352b361a570031316a2b2a1a57000c0003292c692e34341a53000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@3471,@3315,@3424| 3471:D1,48|00802b5618355628365638375648385657300e7b07030006000000000000000020000000000000000000000000000000|@3314| 3472:O2|@3473,@3309 3473:D24,384|00842f35303631383239333a342306220c2307220c36220d372c3b1a6a010e0e0e0c000303033c020b2c1a63011a68010e0c000303041a6701103b502c3c1a67010c00032928403b1a65010e0e0c0004293b301a62010e0e0e0c0004503c28403b1a4c010e0c00043c28403b1a41010e0e0c00041a49012c691a4c0122122c2e32221722113368083c28403b1a21010e0e0c00041a39012a691a3c01121300010001002e220c2f2e680622112a1a30010e0c0003303b1a2f010c0003293b2a1a2e010e0e0e0c00021a2d010e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652e3b1af7000c000322113c1a06010e0e0e0c000303033c020b323b1ade000e0e0e0c0003293c1aeb000c000303032d02172d1ae7001aec001af1002e1af5001afa000e0e0e0c00072922173b2f22182f31221868082b3c1aba000e0e0e0c000303051adf00020a1ae2002e693b2b2b6a64221c2b452a46271a1f050e000000000000000070010000000000000000000000000000|@3475,I234,72057594037927934,I231,@1603,I106,I11,I255,@3476,@3478,@3488,@3490,@3315,I253,I105,I218,I251,@655,@3491,@3494,@3497,@3474,@588,@610| 3474:O1|@3499 3475:S35|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429 3476:D7,104|00802b352c362968012b3b1a62000e0e0e0c000303033c021456373b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356472a2c1a5100320e0e0e7b05070004000000000000000058000000000000000000000000000000|@3477,I234,I253,I231,@1614,I106,I255| 3477:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429736574546162283129 3478:D17,360|00802b353c1a68010e0c000303b92b36561c2a2a1a61010e0e0c00021a61010e0e0c000203043b5002041a5b01102a352b362b3b1a59010e0e0c000303032a02172b3c1a52010e0e0e0c00032a2a2505250526031e413b64270429353d1a10010e0c00030314562b1a0d010e0e0c00021a0d010e0e0c000202013b03232936563b352a2a1a09010e0e0c0003030e56483b3c1a0b010c0004503c02013b6502013b03051a0201021c29563a0e0e0c000229352a365657566856791af300330e7b070600066502842b353e1aa3000c0003030b3c2c69291adf006964026e2b353b1a8d000e0e0c0003030b3c2c69291ac700696402562b36293b1ac4000e0c000303033c0214561d3b1abd000e0e0c00032a2a1abb000c00036403041aba00103b50293c1aba000e0e0e0c0003562d2a1a96000e0e0e0c0003293b1a33000c000303041aa300103b50293566420e0e0e0e000000000000000058010000000000000000000000000000|@3480,I251,I105,I218,@611,I113,I107,I255,@3481,@3479,@588,I234,I253,I231,@1586,I106,@1792| 3479:O1|@3483 3480:S50|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129 3481:O2|@3482,@588 3482:O2|1,@577 3483:D12,248|00842f353c1af8000e0c000303282f3629353d1aea000e0e0e0c000303142e1ae6000e0e0e0c00021ae5000e0e0c000202013b6402013b03232f3629362f352a2a1ad4000e0c0003030e2f3b3c1ad0000e0c0004503c02013b6602013b03051ac60002762f353b1a96000e0e0e0c0003030b2f3630373b2b2b6a65020f2f36292d1aac000e0c00033c2a69652f353c1a6e000e0e0e0c000303051a9b0002372f353b1a5b000c000303172f3630371a8f001a94003232322e68063b2c2b6a6602152f3630371a88001a7d003232322e68063d2c2b6a662a2a69651f050e0e0e0e0000000000000000e8000000000000000000000000000000|@3485,I251,I105,I218,I113,I255,@3481,@2323,@588,@3486,@3479,@3484| 3484:D1,56|00802b561b0c000229352a362a2a56585669567a5687337b070600060e0e0e0e000000000000000028000000000000000000000000000000|@3487| 3485:S66|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229 3486:D1,56|00802b561b0c000229352a362a2a56585669567a5687337b070600060e0e0e0e000000000000000028000000000000000000000000000000|@3487| 3487:S82|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229636f6e76657274456e76283129283129 3488:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003293c1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@3489,I253,I106,I255| 3489:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296d6b41646472283129 3490:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3491:O1|@3492 3492:D1,32|00813c2d69430e0e000000000000000010000000000000000000000000000000|@3493| 3493:S42|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836292d45 3494:O1|@3495 3495:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@3496| 3496:S44|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632d283429283129 3497:O1|@3498 3498:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@3493| 3499:D10,112|00852c3b1a71000e0e0c000303033c020b2c1a6b001a70000e0c000303041a6f00103b502c3c1a6f000c00032928403b1a6d000e0e0c0004293b301a6a000e0e0e0c00045032321a66003234322f1a6700340e7b090a0008000000000000000060000000000000000000000000000000|@3501,I234,72057594037927934,I231,@1603,I106,I11,I255,@3474,@3500| 3500:O1|@3502 3501:S40|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629 3502:D6,88|008631311a590032323232321a59000e0e0c0009293b1a57000c0003031a1a57001a3c0032323232326807332a1a50002f0e0e0e7e0b00032935641f070e0e0e000000000000000048000000000000000000000000000000|@3504,@3500,@3505,I251,@3503,@3315| 3503:D3,56|00802b1a3a00562756385649565a566b567c1a3300330e7b0a0300090e0e0e0e000000000000000028000000000000000000000000000000|@3565,@578,@3505| 3504:S52|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229 3505:O1|@3506 3506:D14,608|008732350a0e0021004c001e0095006e011e003001d9001e001e0001021e001e001e00f3003b0fdd323633372a34333333333322100c00082a3434343434341a26020e0e0e0c00083b2b2b6a29680127050fd03236333734382b1a1302343434343422110e0c00082b220d220c220c220c220c220c22120e0e0c00082b220e220d220d220d220d220d22130e0e0c00083c2c2c2c6b29680127070fdd3236333734382b3434343434341acc010e0c0008291acc010e0c00023b220e2b6a293b692e2a220f220f220f220f220f22150e0e0e0c00083e2e2b316b29680127090fd33236293332323232321a9c010e0c000828072a69296801660fd732363337293b1a8d0102023f010e0e0c000303252a3b220c220c220c220c220c220c220c1a7701020221010c000a280e2a3b6a2968016502013b650fdd323633373438293b1a4e010e0e0e0c000303273d2b220d6a293b692d2a220d220d220d220d220d22130e0c000828062a2f3b6b296801270402013b6602d132360202cb0029353e1a0f010c0003030c32300e0c0002501a1001026d29353c1af8000e0c0003030d29362934310e0e0c000364025429353b1adf00020291000c0003030f29362934300e0e0c0003502a6402362936331ad900020273000e0e0c00021ad5000e0e0c00021acd000e0e0c000203041acb00103b50332a2f1aca000e0e0e0c0004502a643f2a6929680166023e32363337293433333333020230003322100c00082b2f220c220c220c220c220c1a9d000e0e0c0008293b1a5b000c000303032a0204402a2c6a29680127051f08000000000000000050020000000000000000000000000000|@3508,@3509,@578,@3511,@3513,@3515,I251,@3550,@577,I105,I218,@3531,@3530,@3507| 3507:O1|@3555 3508:S62|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283229 3509:O1|@3510 3510:D5,152|0086311a9a000e0e0e0c00021a99000e0e0c00020365313532362a352b362a352b362c372b1a78000e0c00021a79000e0e0c00021a71000e0e0c000203051a6f0002012b2a2a2210221022102210221022160e0e0e0c00082d2d2b6a293069322213221322132213221322131a49000e0e0c00082a2a69270c02013b1f070e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@578,@3509| 3511:O1|@3512 3512:D5,112|0086311a72000e0e0e0c00021a71000e0e0c0002033d313532362a352b362a1a6600220c220c220c220c220c22120e0e0e0c0008292b692d220e220e220e220e220e220e1a49000e0e0c00082a2a69270702013b1f070e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@578,@3511| 3513:O1|@3514 3514:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3513| 3515:O1|@3516 3516:D28,1064|00863135323633383439220c3a220d2306220e23073c28403b1a14040e0c00043b2e291a12040e0e0e0c00021a11040e0e0c0002031729362b3c1a0b040c0003292b25042504511e253b6502012a65293b1afc030e0c000303033c020b291af7031afc030e0c000303041afb03103b50293c1ad3030c00032928403b1ab1030e0e0c0004293b2d1ae6030e0e0e0c0004501ae4032a693c28403b1a93030c00041add032a6922153b2a1a8c030e0c00021a8d030e0e0c000203542a352b362a353c1ac4030e0c000303071ac3032c69022f2a353b1ab1030e0e0c0003031d2a362c3b1aa3030c0003030329020b292d1aa6030e0e0e0c00036402051aa2032c692a2a2505250526031e603b6602012965220e2a1a9203332218221822182218221468072d220d31221b0c00072c3b1a7f030c0003293b2a1afe020e0e0e0c00021afd020e0e0c000203542a352b362a353c1a34030e0c000303071a33032c69022f2a353b1a21030e0e0c0003031d2a362c3b1a13030c0003030329020b292d1a36030e0e0e0c00036402051a12032c692a2a2505250526031e623b66020129652a1a94020e0c00021a95020e0e0c00021a8d020e0e0c000203033c02442c291a76020e0e0e0c00021a75020e0e0c0002032d29352a362a353c1aac020e0c000303033c020b2a353e1a9d020e0e0c000303033c0207292503511e3b3b6502013b6403033b0fdd2c291a2d020e0e0c00021a2d020e0e0c0002031d29352a362a353d1a64020e0c00030309292503511e273b02013b6502013c64033429291af8010e0c00021af9010e0e0c0002031d29352a362a353d1a30020e0c00030309292503511e263b02013b6502013c6402013b03aa293b2a1ac0010e0c00021ac1010e0e0c0002038a2a352b362b3c1af9010e0e0c000303033c02692a353d1ae9010e0e0c000303043b5002041a1302102a3631291a83010c00021a85010e0e0c0002033e29352a362a353d1abc010e0c000303043b5002041aef01102a36292e1aef0102023a000c00031a55010e0e0c0002640309292503511e463b02013b6502013c652a2a2505250526031e963b660201296503052a680102013b02031ab901293b1a64010e0c000303b0343b1a81010e0e0c0003293b2a1afe000e0e0e0c00021afd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b27040201296522111a77010c0002343b1a3f010c00033b2a293b1a0d010e0e0c000303032a0237293c1a5e010e0e0e0c00032a3c1a53010c0003293c1aab000c000322112a1a0a010e0e0e0c0003292f69292e2507250726051e413b2705652b2a1a2e010e0e0e0c000332221833302d2219221922196808270602322935293b1aa7000c00030304221b020a221b2a1a08010e0c0003221d2a221d221d221d221d221d1afc00221e0e7b091e000827131f07000000000000000018040000000000000000000000000000|@3518,I11,I105,I218,I106,I234,72057594037927934,I231,@1603,I255,@3519,@3523,I251,@588,@3527,@577,@3529,I253,@3539,@3541,@3544,I113,@3546,@3547,I240,@1734,@3517,@3515| 3517:O1|@3549 3518:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229 3519:D10,184|00812c3b1ab9000e0e0c000303033c021456073b1ab1000e0e0c00032d2a1aaf000c00036403041aae00103b502c3c1aae000e0e0e0c000356172a1a8a000e0e0e0c0003293b1a9f000c000303032d020b2d2a1a9a000e0e0e0c00032f3b1a5f000c000303033c021456373b1a59000e0e0c0003302a1a57000c00036403041a7600103b502f3c1a56000e0e0e0c000356472a2c1a6900320e0e0e7b050800040000000000000000a8000000000000000000000000000000|@3521,I234,I253,I231,@1586,I106,I251,@3520,@1614,I255| 3520:O1|@3522 3521:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229636865636b417267283229 3522:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3520| 3523:D5,80|008056073b1a50000e0c0003293b1a4f000c000303032c020b2c2a1a4a000e0e0e0c000356273b2b1a45000e0e0c0004503b65420e0e0e0e000000000000000040000000000000000000000000000000|@3525,I253,I251,@3524,I255| 3524:O1|@3526 3525:S63|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229616464526566283129 3526:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3524| 3527:O1|@3528 3528:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3527| 3529:D11,240|0081560c2d2a1aef000c00021af1000e0e0c000203043b5002041aeb00102a352b362b3b1ae9000e0e0c000303032a02172b3c1ae2000e0e0e0c00032a2a2505250526031e3f3b64270429353e1ad0000e0c0003030c2c56280c0002501ac800026529353c1ab8000e0c0003030d2936292e56490e0c000364024c29353b1a9f000c0003030f2936292e564a0e0c0003502a64023229362d1a5d000e0e0c00021a5d000e0e0c00021a55000e0e0c000203041a7b00103b502d2a564b1a79000e0e0c0004502a642956371a73002f0e0e7e0600030e0e0e0e0000000000000000e0000000000000000000000000000000|@3493,I105,I218,@611,I113,I107,I251,@577,@3531,@3530,@2323| 3530:O1|@3535 3531:O4|@14322,@596,@3533,@3532 3532:O5|@3534,126,0,126,0 3533:S25|636c65616e457874726163743a20656d707479207573616765 3534:S58|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f52454d4f56455f524544554e44414e542e736d6c 3535:D10,176|00822c3b1ab1000e0e0c000303033c02142b3b1aaa000e0e0e0c00032d2a1aa7000c00036403041aa600103b502c3c1aa6000e0e0e0c00032c2a1a83000c0003293b1a9b000c000303032f020b2f2a1a96000e0e0e0c00032f3b1a5b000c000303033c02142e3b1a56000e0e0e0c0003302a1a53000c00036403041a7200103b502f3c1a52000e0e0e0c00032f2a2c1a6600327b050900040000000000000000a0000000000000000000000000000000|@3537,I234,I253,I231,@1586,I106,I251,@3536,@1614,I255| 3536:O1|@3538 3537:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836296164644c6f63616c557365283229 3538:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3536| 3539:O1|@3540 3540:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3539| 3541:O4|@14322,@596,@3543,@3542 3542:O5|@3534,101,0,101,0 3543:S12|6e6f74205573654669656c64 3544:O4|@14322,@596,@3543,@3545 3545:O5|@3534,98,0,98,0 3546:O1|@578 3547:O1|@3548 3548:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3547| 3549:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3517| 3550:O1|@3551 3551:D9,240|0088331af2000e0e0e0c00021af1000e0e0c000203bd33353436333b2a1ad8000e0c00021ad9000e0e0c000203512a352b362a353d1ad0000e0c000303302a362b3722112b1ac8000e0c0003031c2d3b1ab5000e0e0c0003030329020b292e1ab6000e0e0e0c000302012d6502032a2c692a2a2505250526031e5d3b6602012965293b1a82000e0e0e0c000303051a8f000201292c2a220c220c220c220c220c22120e0e0e0c0008220e3c1a7a000e0e0e0c00032d2a22102210221022102210221022101a69000e0e0c000a2b2a69270702013b1f090e0e0000000000000000e0000000000000000000000000000000|@3553,I105,I218,I251,I113,@3552,@578,I106,@3550| 3552:O1|@3554 3553:S77|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734669656c64283229 3554:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3552| 3555:D20,736|0086311ae2020e0e0e0c00021ae1020e0e0c000207d1313532362a353b1ad8020e0c000303d52a372b382c392c220d220d220d220d220d220d1ac4020e0c00082c3b1ac3020c000303033c0214220d3b1abd020e0e0c00032d2a1abb020c00036403041aba02103b502c3c1aba020e0e0e0c0003220e2a1a96020e0e0e0c0003293b1a73020c0003032d2c1aa2020e0e0e0c0002291aa0021aa5020e0e0c0003291a94021a51020e0e0c00036503033b02031a9302020129291a2c020e0c00021a2d020e0e0c00021a25020e0e0c000203032c02222d1a77022210221022102210221622160202d9010c00083b2b32322d6805292f696527070fdb2a353d1af7010c000303542a362a3434343434341aee010e0e0e0c00082a1a14020e0c0002291a14021a19020e0e0c0003291a08021ac5010e0e0c00036503032902192a1a160234343434221122110e0e0e0c00083d2a69292c6965650fd22a353e1a98010e0c0003035a2a362a3434343434341a8e010e0e0e0c00082a3b3b220e220d220d220d220d1ad8010e0c000929220d1ad6010e0e0e0c0003291a4c010e0c00021a4d010e0e0c00021a45010e0e0c000203032b02073e2a69292d696427040fd52a372b382b220c220c220c220c220c220c1a2c010202e7000e0c00082b3b1a27010c000303033c0214220c3b1a21010e0e0c00032c2a1a1f010c00036403041a1e01103b502b3c1a1e010e0e0e0c0003220d2a1afa000e0e0e0c0003293b1ad7000c000303312c1a0601020291000e0e0e0c0002291a00011a05010e0e0c0003291af4001ab1000e0e0c00036503033b02031a1b01020129291a8c000e0c00021a8d000e0e0c00021a85000e0e0c000203032c02482d3528071a7c000e0c000303212d36292b221022102210221022161ae500020228000e0e0c000828072a696502112d2a220f220f220f220f221522150c00083c2b312c6b292f696527066502013b1f070e0e0e0000000000000000d0020000000000000000000000000000|@3557,I105,I218,I251,@3507,I234,I253,I231,@1586,I106,@3558,1610612736,I243,@578,@578,@578,@3561,@3556,@578,@3515| 3556:O1|@3564 3557:S76|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f6365737344656373283129 3558:O1|@3559 3559:D13,592|00802b350a0e002c00e5011e0045001e002401c8001e002600290051012f0023001d02d5001a30020fd63b0fd53b0fd43b0fd33b0fd22b36291a24020e0c0002291a24021a29022f7e0500032b362c3729353d1a22020e0e0e0c0003036d2936291a1c020e0c000203041a1b02103b5028662a1a1a020e0e0e0c0003034928672a1a14020e0c00032c2a2a1af2010e0e0e0c00021a09020e0e0c000203252a352b362a35291ab8010e0c0002292e1abf010c00032c2a2507250726051e323b27050201296602013b6402013b650fd02b36291a8b012d0e0e7d0400022b36291a76012a1a9a010e0e0e0c00021ab1010e0e0c000203312a352b362a1a6201020a2e012c012a01280126010e0e0e0c0002292d1a5b010c00032b2a2506250626041e3e3b2704020129660fcd2b362c372a1a2d010e0e0c0002291a6c011a71010e0e0c00032b1a18010e0c00022a2a1a1f01320e0e7e0800032b362c37291a00010e0c00022b2a2a1a16010e0e0e0c00021a2d010e0e0c0002036d2a352b362a353b1af4000e0c0003030d2a39291ad0000e0c00026402362a353d1adb0002028f000c0003030d2a36291ab4000e0c000264021a2a353e1abf000c000303051a9700020a2a38291a97000c000264292d1a9e000e0e0e0c00032b2a2506250626041e7a3b2704020129270502442b362c372d382b1a6a00020236000e0e0e0c00022b1a5c000e0c00022a2a1a63000c00032c1a4c000e0c00022a2a1a5300340e0e7e0a00032b37291a36002d0e7d040002420e0e0e0e0e0e0e000000000000000040020000000000000000000000000000|@3560,1879048192,@3558,-1073741825,I243,I251,I105,@1363,I150,I153,I218,1073741824,I242| 3560:S33|434f4445545245455f46554e4354494f4e5328292e636f646550726f7073283129 3561:O1|@3562 3562:D12,248|0087321afa000e0e0e0c00021af9000e0e0c000203a5323533362a362b372a3b1aed000e0e0c000303033c0214333b1ae6000e0e0e0c00032b2a1ae3000c00036403041ae200103b502a3c1ae2000e0e0e0c0003342a1abf000c0003293b1ad7000c0003031e2e220f692e2a2210221022102210221022101ac50022110e0e7b0a1100091ac1002a692c2a220e220e220e220e22131ab8000e0c00082e2a693022123c221222122212221222121a90000e0c00092a2a69270a0221303b1a78000e0c000303033b0213313b3b32323232321a6c00330e0e7b0a0a00091f080e0e0000000000000000e8000000000000000000000000000000|@3563,I105,I218,I234,I253,I231,@1586,I106,I251,@3561,@577,@3515| 3563:S93|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734465637328312970726f636573734d757475616c73283329 3564:D9,144|00812c1a92000e0e0e0c00021a91000e0e0c000203592c352d362a352b362a3b1a85000e0e0c000303033c02142f3b1a7e000e0e0e0c00032b2a1a7b000c00036403041a7a00103b502a3c1a7a000e0e0e0c0003302a1a57000c0003292d2d6a2e331a6b000c00032a2a69270802013b430e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@1399,I105,I218,I234,I253,I231,@1586,I106,@3556| 3565:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283129283129 3566:O3|@3567,@3297,@3472 3567:D2,64|00822d352e362e352f3630382d312b2e5697220d3056c8341a2d0022100e0e7b0b0a000a0e0e0e0e000000000000000030000000000000000000000000000000|@3569,@3568| 3568:O1|@3570 3569:S35|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229 3570:D30,1216|0088331ac2040e0e0e0c00021ac1040e0e0c000207cb333534362a353b1ab8040e0c000307ce2a372b382c393b220e0e0e0c00023d2a693c2a69291aa204692f2a6966220e0c00020403002c220e2b22110c00045029352a362a35280c1a78040e0c000307ce2a362b372c3829353f1a66040e0e0e0c00030311293629353d1a56040e0e0e0c00036402013b03112936293629331a51040e0e0c00036502013b03043b5002041a4704103b22160c00023d2a693c2a69291a260469220e2a696622160e0e0e0c0002040300220e2a221a221a221a221a221a221a221a1a19040202b4030e0e0c000a5029352a362b373b221c0202c3010e0e0e0c00023c3b2b220c6b2a3b1af9030e0e0c000303041af703103b503d2b693f2a6934353b2a293b1ab5030e0e0c000303032a0285293c1ade03020240010e0e0e0c00032a3c1acf030c00032b3c1ac7030c00032211360402002b28082b1abf030c00045029352a362c2b1aba030e0e0e0c00033c2b1ab7030c00032a2a1ab7030c0003293b1a57030c0003641a48030e0c0002293b1a47030c0003030334020c2806220e333b6b29220d69642934250d250d260b1e8f3b270b653b2a291a0f030c00021a11030e0e0c0002031729362b3c1a6b030c0003292b25042504511e223b6502012a652922171a03030c00036403043b5002041a4e0310280e2a3b6a2a291acb020c00021acd020e0e0c0002031d29352a362a353d1ac4020e0c00030309292503511e253b02013b6502013c64030b291a19030e0e0c00020201293c3b220f2c6b22203b3c1a0c030e0c000450293469312a69293b1a84020e0c000303042214020a22142a1af4020e0c00032228220f452a46220d472715023f040300322a22152215221522152215221522151a6c020e0c000a5029352a362b372d2f1ac4020e0c00033b3b34220e2d6805292d69221a2f452a462d47270727080fd32a353e1a19020e0e0c0003039a2a360402002a2a1a98020e0c00035029352a36293b1afa010e0e0e0c000303032a020b2a2a1a82020e0e0e0c000329221022101a7c020e0c00042a2a220d221022131a75020e0e0c0006040300312a22142214221422142214221422141ad2010e0e0e0c000a5029352a362b373e2e691a4f020c00022b3b1a97010c0003030329020b292c1a42020e0e0e0c000322182e452a462c47270d0fd42a353d1a72010e0e0e0c000303842a360403002a332b220d0e0c00045029352a362b372b35280b1a4e01020206010e0e0e0c0003030a22102c452b462a47024e0403002f2a22122212221222122212221222121a42010e0e0e0c000a5029352a362b373d3069292c69293b1a0a010e0e0e0c0003030330020b302a1aba010e0e0e0c000322172f452a462d472707270502a22a372b380403002a342b220e0e0e0e0c00045029352a362b372b2b2b6a2c35280b1ac2000e0e0e0c0003030a22122d452c462b47026a0402002a22102b1a6e0102025e000e0e0e0c00045029352a36322b6922140e0e0e0c0002040300220c2a22182218221822182218221822181a95000e0e0c000a5029352a362b372a3b1a64000e0c000303032e020b2e2b1a26010e0e0e0c0003221b2d452a462b472709270765020d2b2f34322e0e0e0e7b050b00041f090e0e0000000000000000b0040000000000000000000000000000|@3572,I105,I218,I251,@588,I113,@3573,@3568,I234,@3576,I240,I104,I252,I245,I243,I106,@3579,@2349,I255,@3582,@3380,@3584,@3586,@3588,@3590,@3593,@3609,@3611,@3355,@3571| 3571:O1|@3613 3572:S46|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229636f707944656373283129 3573:O4|@14322,@596,@3575,@3574 3574:O5|@3306,394,0,394,0 3575:S32|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e6572 3576:O4|@14322,@596,@3578,@3577 3577:O5|@2295,247,0,247,0 3578:S27|6d6b4c6f616478783a20617267756d656e74206e65676174697665 3579:O4|@14322,@596,@3581,@3580 3580:O5|@3306,404,0,404,0 3581:S37|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e65722073697a65 3582:O1|@3583 3583:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3582| 3584:O1|@3585 3585:D6,120|00812c1a7a000e0e0e0c00021a79000e0e0c0002033e2c352d362a37293a293b1a6d000e0e0c00030402002d2a1a68000e0c00035029352a362c030b302b69342a452b46640209302a69342c452a46642708020b1a49002c2a35452a36466443000000000000000068000000000000000000000000000000|@1506,I105,I218,I251,@3584,@1505| 3586:O1|@3587 3587:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3586| 3588:O1|@3589 3589:D5,104|00822d1a6a000e0e0e0c00021a69000e0e0c000203352d352e362a363b300e0e0e0c00023d2a693c2a69291a5200692d2a6966300e0c0002502b31311a49000e0e0c00042a2a69270502013b440e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@588,@3588| 3590:O1|@3591 3591:D4,160|00842f1aa2000e0e0e0c00021aa1000e0e0c000203142e1a8e000e0e0e0c00021a8d000e0e0c000202013b03562f353036303531362c362d372a68012d68010402002c220d2d2d2d22120e0e0e0c00065029352a363d32693c2a69292c69322a6966220e0e0c00023b332d6a34332213221322131a41000e0e0c00062a2a69270e02013b1f050e0e000000000000000090000000000000000000000000000000|@3592,I105,I218,@3590| 3592:S17|4c697374506169722e6d61702833292829 3593:O1|@3594 3594:D18,448|00802b353e1ac0010e0c000307d22b36291abc010e0c00021abd010e0e0c000203043b5002041ab7011029352936292a690402002d2b2a1a96010e0e0e0c00021a95010e0e0c000203412a352b362a362c352d362b2b1a8f010c000303032b02012a2c3c1a89010e0e0c0003292c1a87010c000303032902012b2b2a69302a250b250b26091e4f26090209292c2a35452a3646515129352a36292b1a62010e0e0e0c0003293b1a3f010c000303033c020b291a53011a58010e0c000303041a5701103b50293c1a27010c00032928403b1a4d010e0e0c0004293b2d1a4a010202c2000e0e0e0c000450321a43012a1adf000c00021ae1000e0e0c000203742a352b362a3629331af7000c0003293b1ad7000c000303033c02142f3b1a1a010e0e0e0c00032a2a1ae7000c00036403041a0e01103b50293c1ab6000e0e0e0c0003302a1af3000c0003293b1a7b000c000303102e30220e3422151aec000e0c000602012f2e2a2509250926071e7e3b27070202293765293b2a1a55000e0e0c00021a55000e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129270d02032b3b69420000000000000000b0010000000000000000000000000000|@3596,I251,I105,I218,@1712,I234,I106,I233,I107,72057594037927934,I231,@1603,I11,I255,@3597,I253,@1586,@3595| 3595:O1|@3598 3596:S48|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e6773283129 3597:O3|0,0,0 3598:D17,432|00842f3630372938313532363337220c2b692f220c1aa0010e0c00032d2e692968012b3b1a99010e0e0c000303033c0214220d3b1a91010e0e0c00032c2a1a8f010c00036403041a8e01103b502b3c1a8e010e0e0e0c0003220e2a2c1a89010e0e0c0004313c1a77010c00032930326a040300220c2b2a1a76010e0e0e0c00021a75010e0e0c000203282a352b362a2c2217221a221a22171a65011a6a010e0e0e0c00082a2a2505250526031e362603020c292c2a35452a36462a3747515129352a362b37333b1af6000e0e0e0c000303033c021422153b1aed000e0e0c0003342a1aeb000c00036403041a2201103b50333c1aea000e0e0e0c000322162a1ac6000e0e0e0c0003293b1a0b010c000303041a0b01103b50293529362922131a06010e0e0e0c00032704035f0402002b3b2a1abb000c00021abd000e0e0c000203043b5002041ae700102a352b362a362922181ad2000e0e0e0c0003030b2b2d692f2c452a4651020e2b2d692b2a2506250626041e4350260529352a363e2a69292e69302d2b6a270502042b2b2b6a27121f050e0e0e0e0e0000000000000000a0010000000000000000000000000000|@3600,I107,I234,I253,I231,@1614,I106,I255,I105,I218,@3595,@3601,@1586,I251,@1792,I113,@3599| 3599:O4|@14322,@596,@3608,@3607 3600:S66|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e74283229 3601:O1|@3602 3602:D15,552|008631353d1a28020e0c000307cd3136313631291a21020e0e0c00021a21020e0e0c0002031e29352a362a362e2a1a17020c00036403033c0207292503511e2b3b6502013b6407cb2a311a03020c0003293b1a03020c000303033c0214303b1afe010e0e0e0c00032a2a1afb010c00036403041afa01103b50293c1afa010e0e0e0c0003312a1ad7010c0003291aa8010e0c00021aa9010e0e0c000203a82c291a95010e0e0c00021a95010e0e0c0002031e29352a362a36312a1a8b010c00036403033c0207292503511e2b3b6502013b64036c2b3b1a7f0102022e010c000303033c0214323b1a76010e0e0e0c00032c2a1a73010c00036403041a7201103b502b3c1a72010e0e0e0c0003332a1a4f010202f2000c0003293b1a13010c000303041a5b01103b5029352935220c2a221022101a52010e0e0e0c0005260502023b50220c02be34291aed000e0e0c00021aed000e0e0c0002032029352a362a3629321ae3000c00036403052a68010207292503511e2d3b6502013b64293b1aaf000c000303041a0701103b50293529220f220e220e2211220e0c00062e3b1ab7000c000303033c0214220c3b1ab1000e0e0c00032f2a1aaf000c00036403041aae00103b502e3c1aae000e0e0e0c0003220d2a1a8a000e0e0e0c0003293b1a4f000c000303041aaf00103b5029352936220f2a221322131a8e000e0e0e0c0005502d270766020132650201301f070e0e000000000000000018020000000000000000000000000000|@3604,I251,I105,I218,I113,I107,I234,I253,I231,@1586,I106,@1792,@3603,@1792,@1792| 3603:O1|@3605 3604:S80|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e7428322970726f636573734c696e6b283229 3605:D11,208|00832e2d1ad1000e0e0c0003293b1acf000c000303033c02142c3b1aca000e0e0e0c00032a2a1ac7000c00036403041ac600103b50293c1ac6000e0e0e0c00032d2a1aa3000c0003293b1abb000c000303041abb00103b50293529352a3629341a7d000e0e0c00030303290201332b2a69296801313b1a67000c000303033c0214343b1a62000e0e0e0c0003322a1a5f000c00036403041a7e00103b50313c1a5e000e0e0e0c0003220c2a2c1a7100220f0e0e7b051000040000000000000000c0000000000000000000000000000000|@3606,I107,I234,I253,I231,@1586,I106,I251,@1792,@1614,I255| 3606:S60|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297570646174654d696e283229 3607:O5|@2295,430,0,430,0 3608:S11|737461636b20656d707479 3609:O1|@3610 3610:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3609| 3611:O1|@3612 3612:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3611| 3613:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3571| 3614:D29,928|00842e2e2e2e6b30350a0e00920093021e00bf0233031e00a001eb021e001e000a031e002501210067023b0fda3036313732381a72032e3434343468062b2a1a6e030e0e0e0c000329353d1a6a030e0e0e0c0003033a2936291a64030e0c00020320291a5a030e0e0e0c000203043b5002041a530310292f1a3d030e0e0c000302013b03051a480302031a4b0364020a280d2e2b2e6b2968016427050fdc30363137303b1a39030e0e0c00032a1a38030e0c0002292d1a37030c00031a390330220d220d220d220d68062a2a1ae1020e0e0c0003291a28030e0c00021a29030e0e0c000203052968010242220c3b2f1a1e030e0e0e0c0004502e34220f34221022101a1303020278020c00071a11033322102210221022106806312a1a91020e0e0c00033b2a2d6a296801270427070fdc3036313732381aee022e3434343468062a2a1a6a020e0e0e0c00030403002e302b56a70e0c00045029352a362b3729353d1a53020c0003032d29362a371abf022a692b2a1ac002020205020e0c0003280e2a3b6a322a31220f1ab3020c0005296801270602112d2c2c331aa2020e0e0e0c00052968016427090fd63036313732380403000403002d2f2b56970c00045029352a362b3729353d1aeb010c000303382937302a0e0e0e0c000229352a362a353b1ad2010e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a6964322a4530462b47260602502e0202720103212b353d1aa1010e0e0c0003030c2b303c1a24020e0c0004020628062c313c6b021e2b353d1a80010e0c0003030c2b303b1a04020e0c0004020628062c313b6b2e2a452c461af80147512d352e362f372a2c2b1af2010e0e0e0c0004296801270c0fd2303631370403002b2b2e2c56880202fd000e0c00055029352a362b372a2c2b1acb010c000429680127070fd83036313732380403002c2c2c302d56a90e0e0c00065029352a362b372a2c2b1aa7010c0004296801270802b63036313732380403002b2d2c302d56aa0e0e0c00065029352a362b372a2c2b1a83010c00042968012708028a30360402002a2c3b3b2d568b0e0e0c000650293528072a692968012704026b303631372a2a690403002a2e2b568c0c00045029352a362b372a2c2b1a43010c0004296801270802423036292f02023a000e0e0c000229352a362a353b1a62000e0e0e0c0003030b2a362b373d2b2b6a6502062a363f2a69643b2a2c1a0b01020208000c00042968012706641f050e0e0e0e000000000000000090030000000000000000000000000000|@3616,@3617,@3315,I251,I105,@2943,@3618,@3619,I253,@3620,@3380,@3622,@3623,I218,I255,@3626,@3629,@3630,@3631,@1385,@3633,@2288,@588,@3668,@3672,@3676,@3680,@3684,@3615| 3615:O1|@3688 3616:S36|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283529 3617:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3618:O1|@475 3619:O1|@542 3620:O1|@3621 3621:D4,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203212b352c362a3529352a362b373c2c2c2c6b2e1a45000e0e0c00022a2a69270802013b420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3620| 3622:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3623:O1|@3624 3624:D3,168|00802b35280c1aa7000c0003030e2b36291aa4002d0e0e0e7d0400022b3528051a8d000e0e0c0003030e2b37291a88002d0e0e0e7d0400022b353c1a72000e0e0e0c000303212b372c382a1a6a000e0e0e0c000203033c020b291a5b002e0e0e7d0500026502252b35401a43000c0003030e2b37291a40002d0e0e0e7d0400022b3528091a29002d7e030003420e0e0e000000000000000098000000000000000000000000000000|@3625,I251,@3623| 3625:S46|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c2835296861734c6f6f70283129 3626:O1|@3627 3627:D7,152|0085301a9a000e0e0e0c00021a99000e0e0c00020361303531362a352b362a352b362c373b220e0e0e0c00023d2a693c2a69291a7a00692e2a6966220e0c0002501a7400220d220f220e220e221368062b2a1a6b000c00032e2c2b6a29316933221322132213221322131a5b000c00072a2a69270d02013b1f060e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@588,@3628,@3315,@3626| 3628:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3629:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3630:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@3314| 3631:D2,72|00802b56170c0002293529353b1a40000e0c0003030b29362a373d2b2b6a65020629363f2a696465420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@3632,I251| 3632:S7|6f283229283129 3633:O1|@3634 3634:D25,1000|00832d3528051ae7030c0003032a2d362e37302b3b301adf030c0005312b3b311ad5030e0e0c000528052b2b6a312a1ace03320e7e0b00032d3528091ab1030e0e0c0003030a2c2e1ab5032d7e0600032d353b1a9a030e0e0e0c0003031e2d362e37302b3b301a8f030c00053b2a2c6a302a1a8b03310e0e7e0a00032d35401a6e030e0e0e0c0003032e2d362e372a3b1a5d030e0e0c000303032e020b2e2b1a66030e0e0e0c0003312b2b311a4903320e0e0e7b060900052d353c1a32030e0e0e0c0003032e2d362e372f38312b3b311a25030e0e0c0005322b3b321a19030e0e0c00053c2e2c2c6b322a1a1203330e7e0c00032d35280e1af5020e0e0c000307da2d363b2a2e1a06030e0e0e0c00043b2a301a02030e0e0e0c0004293b1acf020c000303a6280e2b3b6a2b291af0020e0c00021af1020e0e0c0002031d29352a362a353d1aa8020e0c00030309292503511e263b02013b6502013c64030b291acd020e0e0c00020201293b2d291aaf020c00021ab1020e0e0c0002031729362b3c1ab3020c0003292b25042504511e223b6502012a650402002a1aa2022b1aa6020e0e0e0c00045029352a36291a9f020c0002502a2a69280c2f2b22126b220e2a1a3b02220f0e7e110003293529352a360402002a2a1a7e020202da010e0e0e0c00035029352a362a2a692e353d1afe010e0e0e0c000307d12e363c3b292f1a5d020e0e0c000303032a025f293c1a56020e0e0e0c00030402002b28082b1a4e020e0e0e0c00045029352a36312b1a46020e0e0e0c00033c2b1a43020c00032a2a1a43020c0003293b1aa3010c0003641ad4010e0c00022903033102013b2931250a250a26081e693b270865220f3b2a1aac010e0c00021aad010e0e0c000203152a352b362a2c692a2a2505250526031e213b660201296529291a82010e0e0e0c00021a81010e0e0c0002038b29352a362a353b1a38010e0c000303362a372b382c39312c1ac7010202d3000c000303122a220c1ab8010e0c000303033002013b02013b0309292d692968016402013b6602422a353c1af6000e0e0e0c000303332a38291a90010e0c0002291a90011a75010e0e0c0003291a84011ad1000e0e0c000365030a2a250426031e923b02013b6402013b6502013b64293b1ab0000e0c000303163f3369280c2a3022176b22132a1aaa0022147e160003293529352a363c3b3122196b292b69293b2a1aaf000c00021ab1000e0e0c000203152a352b362a2c692a2a2505250526031e203b6602012965292e1a660022187e1a00033f2f69280c2a2c22136b220f2a1a500022100e0e7e1200032d2c301aea000e0e0e0c00042d2a1a37002e0e0e7e0700030000000000000000d8030000000000000000000000000000|@3636,I251,@3633,@3380,@3637,@3639,@3645,I105,I218,@2349,I106,@3648,@3651,I47,@3659,I247,I239,I104,I252,I245,I243,I113,@3558,1610612736,@3635| 3635:O1|@3666 3636:S45|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429 3637:O1|@3638 3638:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3637| 3639:O1|@3640 3640:D12,224|00822c3b1ae1000e0e0c000303033b02b02c352d362d35302a1ad4000e0c00036403033b029a2d352e36313b1ac9000e0e0c000303033c020b312b1ab2000e0e0e0c000303041ab700103b500402003228082b1ab2000e0e0e0c00045029352a362c2b1aaa000e0e0e0c00033c2b1aa7000c00032a2a1aa7000c0003293b1a67000c0003641aa0000e0c00022707031a2f3c1a9b000c0003292b301a9a000e0e0e0c00042c2a696502162f3c1a81000e0e0c0003292b301a7e00317b0508000465440e0e0e0e0e0e0000000000000000d0000000000000000000000000000000|@3642,I251,I231,I234,@3641,I104,I252,I245,I243,I218,I106,@3639| 3641:O4|11,@49,0,@3643 3642:S54|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e657228342973656c656374283229 3643:O5|@3644,212,0,212,0 3644:S21|2e2f62617369732f426f6f6c41727261792e736d6c 3645:O1|@3646 3646:D8,568|00822c3b1a39020e0e0c000303032d0fdd2c352d362a353f1a25020e0e0c000303112a3629353d1a16020e0e0e0c00036402013b07d62a3629362f291a09020e0e0c00021a09020e0e0c0002032f29352a362a353c1ae8010e0c0003030d2a37292e1af3010c00036402013b03052a68010207292503511e3c3b6502013b64291ac5010e0e0c00021ac5010e0e0c00020348293529353c1aa6010e0e0e0c000303342938293528061a95010e0e0c0003032029362a382a353f1a84010e0c0003030c293b1a79010e0e0c000302013b6502013b6402013b6402013b07d62935293829362a372a36220e1a5c0102022e010e0c00021a59010e0e0c000207d5220e3529352a362a2d1a360102020e010e0e0e0c000303033c02922a353b1a21010e0e0c0003031b2c353b1a14010e0c0003030c2a362d361a1f010c000302013b026a2a353c1af9000e0e0c0003031b2c353c1aec000e0c0003030c2a362d361af7000c000302013b02422a353d1ad1000e0e0c0003031b2c353d1ac4000e0c0003030c2a362d361acf000c000302013b021a2a353e1aa9000e0e0c0003030c2c353e1a9c000e0c000302013b032e291a9700020263000c00021a95000e0e0c000203043b5002041a97001029352e2a1a9700020227000c00036402013b031a2d2a692d2a6929680129220f22141a810022150e0e7b051500043b6602182a3b692a2a6929680129220c22111a630022127b05120004270502013b6602013b65440e000000000000000028020000000000000000000000000000|@3647,I251,I105,I218,I113,@1712,I233,@3645| 3647:S59|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429636865636b4669656c6473283229 3648:O1|@3649 3649:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@3650| 3650:S48|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429283129 3651:O2|@3653,@3652 3652:B8|ffffffffffffff7f 3653:D15,304|00822d3b1a31010e0e0c000303043b5002041a2b01103b502d3b1a2b010c000303033c023c2d3b1a26010e0e0e0c000303033c020b2d56171a1d010e0e0c000303041a1b01103b503b502d283f1a18010e0c00032928401a16010e0e0e0c0003642928413b1a10010e0c00043b3c3b3b29341adb000c0003037629330e0c0002030c2b2d1af9000e0e0c000302012c2c28801af3000c000303312e2c2b1af0000e0c0004502a3c1abe000e0e0e0c00032c3c1ae3000c00033b3c2b2d250725072507250726031e565102222a3c1a98000e0c00032d3c1ac7000c00032b2a2f2d250725072507250726031e7a515002192c3b1a93000c000303043b50020b2d2b2e1a8c000e0c00045026042d30452a4665440e0e0e0e0e0e000000000000000020010000000000000000000000000000|@3655,I231,@3656,I113,I234,I233,@3654,I106,I109,I11,I242,I251,I254,I239,I245| 3654:O4|4,@127,0,@3658 3655:S12|746162756c61746527283229 3656:O4|4,@127,0,@3657 3657:O5|@3644,114,0,114,0 3658:O5|@3644,64,0,64,0 3659:O1|@3660 3660:D22,352|00812c1a62012a1a66010e0e0e0c00021a65010e0e0c000203222a352b362a2c1a5d010e0e0c000303032a02012b2a2a2505250526031e303b6602012965293c1a45010e0e0c0003293b1a43010c000303033c023c293b1a3e010e0e0e0c000303033c020b291a37011a14010e0c000303041a3301103b5029283f1a0a010e0e0e0c00032928401a26010e0e0e0c0003642928413b1a20010e0c000430291acf000c00021ad1000e0e0c0002036f29352a362a3b1ae1000e0e0c000303033c020b2a2f1afa000e0e0e0c000303041af700103b500402002b28082b1af2000e0e0e0c00045029352a362f2b1aea000e0e0e0c00033c2b1ae7000c00032a2a1ae7000c0003322e2b1ae6000e0e0e0c0004502f250926081e793b270802013b641ad6002b690402002e2b2b1ad3000c0004502936291ad1000e0e0c0002502a342a35452a3646270943000000000000000050010000000000000000000000000000|@3662,-1,I105,I218,I233,I106,I113,I234,@3652,@3654,I109,I11,I231,@3663,I104,I252,I245,I242,I254,@3661,@3651,I47| 3661:D7,96|00800402002c28082b1a5c000e0c00045029352a3656372b1a55000e0e0c00033c2b1a53000c00032a2a1a53000c0003293b1a53000c0003641a5400310e0e0e7d0800020e0e0e0e000000000000000050000000000000000000000000000000|@3665,I104,I252,I245,I243,I251,I218| 3662:S62|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e65722834296669656c6473546f46696c746572283129 3663:O4|11,@49,0,@3664 3664:O5|@3644,417,0,417,0 3665:S22|426f6f6c41727261792e766563746f72283129283129 3666:D3,184|00822d3528051ab7000c000303232d362e372a2f2f1ab0000e0c00042a30301aa6000e0e0e0c000428052b2b6a2704026a2d35280b1a88000e0c000303032d025a2d35401a79000e0e0c000303152d362e37292f2f1a70000e0c0004402c2b6a6602382d353c1a57000c000303272d362e372f382a30301a4e000e0e0e0c00042a31311a42000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e0000000000000000a8000000000000000000000000000000|@3667,I251,@3635| 3667:S40|434f4445545245455f46554e4354494f4e5328292e6d6b536574436f6e7461696e65722833292829 3668:O1|@3669 3669:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3670,@3668,@3380| 3670:O1|@3671 3671:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3670| 3672:O1|@3673 3673:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3674,@3672,@3380| 3674:O1|@3675 3675:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3674| 3676:O1|@3677 3677:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3678,@3676,@3380| 3678:O1|@3679 3679:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3678| 3680:O1|@3681 3681:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3682,@3680,@3380| 3682:O1|@3683 3683:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3682| 3684:O1|@3685 3685:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3686,@3684,@3380| 3686:O1|@3687 3687:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3686| 3688:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3689,@3615,@3380| 3689:O1|@3690 3690:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3689| 3691:O1|@3692 3692:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 3693:O1|@3694 3694:D5,104|00822d3b1a69000e0e0c000303242c353d1a5c000e0c000303152c362d37292e1a55000e0e0c00033d2c2b6a6602012c02163b2d2d1a48000e0c00042e2a1a47002e0e0e7e060003440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3381,I251,@3695,@3693,@3380| 3695:O1|@3696 3696:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@3695| 3697:O2|3,@3698 3698:S20|4f7574707574206f662073696d706c6966696572 3699:O1|@3700 3700:D2,32|00811a2300100e0e000000000000000010000000000000000000000000000000|@3493,@3701| 3701:O4|@14322,@596,@3703,@3702 3702:O5|@3704,1459,0,1459,0 3703:S30|746f70206c6576656c207265616368656420696e206f7074696d69736572 3704:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4f5054494d495345522e736d6c 3705:O1|@3706 3706:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@3496| 3707:O1|@3708 3708:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@3493| 3709:O2|3,@3710 3710:S17|4f7574707574206f6620636c65616e6572 3711:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003293c1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@3712,I253,I106,I255| 3712:S66|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f63657373547265652833296d616b6541646472283129 3713:D3,48|00802b56171a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@3715,@655,@3714| 3714:O3|@3717,@3756,@3716 3715:S35|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283129283129 3716:O2|@3779,@3714 3717:D18,728|00822d353b1ad8020e0c000303472b291ad5020e0e0c00021ad5020e0e0c0002031d29352a362a353d1ab4020e0c00030309292503511e273b02013b6502013c64030f2d2d2d56370e0c00042968016402013b0fdd2d353c1a85020e0e0c000303472b291a81020e0e0c00021a81020e0e0c0002031d29352a362a353d1a60020e0c00030309292503511e273b02013b6502013c64030f2d2d2d56370e0c00042968016402013b0fcf2d3528061a30020e0c000303372d362e372f38293b1a1f020c000303233d2b306a293b691a28022f332c6b2e2a1a27020c000328062a303b6b296801270502013b660fd22d353e1aed010e0e0c000307d72d362e372f382a353c1ada010e0e0e0c000303522a362b372c383237293b3c1aec010e0c0004501aec0131220c220c6b3e312e316b29020286012b1ac8010e0c00031ad90134220f220f6b3e3430346b292b1ab1010e0e0c00033c332e2c6b296801270b02be2a3528071a79010e0e0c0003037b2a362c2e321aaa01020240010e0e0e0c0004291aa4010e0c00023b322b6a293b69040200220c2b303b2d56e80e0e0e0c00065029352a363e302b346b2b3b1a31010e0e0c000303032902292b1a73010202f9000c00023e2a69293b69293b1a110102024e000e0e0c000303032c0204402a2e6a66296801270a02352b2d311a49010e0e0c0004291a48010e0c00023b312b6a293b691a420131220c2c6b2f2a1af0000e0c00033e2f2b326b29680127076602992d35401ab9000e0e0c0003032d2d362e372a2c3056581a16010e0e0e0c00051a15012d31316b2b2a1ab4000e0c0003402c2b6a2968012706025f2d3528071a7e000e0e0e0c0003034f2d360402002e2e2c3c2d56780e0e0e0c00065029352a362a3b1a5a000e0e0e0c000303032902212a1acb000c00023e2a69293b69293b1a3d000e0e0c000303032c0204402a2e6a66296801270502013b440e0e0e0e0e0000000000000000c8020000000000000000000000000000|@3719,I251,I105,I218,@3720,@3315,I255,@3721,@3722,@3723,@3726,@3728,@3730,@3733,@3735,@3736,@3754,@3718| 3718:O1|@3755 3719:S32|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283329 3720:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3721:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3722:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3723:O1|@3724 3724:D6,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a352b361a570031316a2b2a1a57000c0003292c692e34341a53000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@3725,@3315,@3723| 3725:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3726:O1|@3727 3727:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3726| 3728:O1|@3729 3729:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3728| 3730:O1|@3731 3731:D6,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e362a352b361a570031316a2b2a1a57000c0003292c692e34341a53000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@3732,@3315,@3730| 3732:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3733:O1|@3734 3734:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@3733| 3735:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3736:O1|@3737 3737:D5,88|00832e1a5a000e0e0e0c00021a59000e0e0c000203212e352f362a3030301a4f000c00052a3131311a4d000e0e0c00052a2a69270402013b1f040e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3738,@3736| 3738:O1|@3739 3739:D9,216|00832e353b1ad8000e0c000303212e362f37303831391acf0032326a2a2a1acf000c00033b2f2f2f2d6805270602882e353d1aab000c000303182e361ab9002f2f6a2a2a1aa9000e0e0c00033d2a696602652e353e1a88000e0c0003033c2e36293b2a1a9a000e0e0e0c00021a99000e0e0c0002031c2a352b362a2c32341a8f000c00052a2a2505250526031e2a3b66020129653e2a6965021d2e362f3730381a750031312e6b2a2a1a44000e0c00033c2e2e2c6b27051f040e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@3741,I251,@3742,@3315,@3743,I105,I218,@3744,@3740| 3740:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3741:S45|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e67283129 3742:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3743:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3744:O1|@3745 3745:D5,128|00832e352f3630370402002f2d2c3d2d220c0e0e0e0c00065029352a36293528071a64000e0c000303043b5002041a5f001029362f2f2b6a2c311a5b000c0003220d3b1a42000e0e0e0c0003030329020b29220e1a49000e0e0c00032b2a69270a1f040e0e0e0e0e000000000000000070000000000000000000000000000000|@3747,I251,@3748,@3751,@3746| 3746:O1|@3753 3747:S57|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e672831296d6170526563446563283229 3748:O4|@14322,@596,@3750,@3749 3749:O5|@3704,945,0,945,0 3750:S22|6d617062696e64696e673a206e6f74206c616d626461 3751:O1|@3752 3752:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a352b362f2b2b6a2c311a41000e0e0c00032a2a69270602013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3751| 3753:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3746| 3754:D1,40|00802b5618562956372e0e7b05030004000000000000000018000000000000000000000000000000|@3715| 3755:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3718| 3756:O2|@3757,@3714 3757:D32,776|00822c352d372d3b2a1a04030e0c00021a05030e0e0c000203322a352b362a353d1afc020e0c000303132a36292d1af7020c000303032902012c6402012b2a2a2505250526031e3e3b6602012965293c1add020e0e0c0003293b1adb020c000303033c023c293b1ad6020e0e0e0c000303033c020b291acf021aac020e0c000303041acb02103b5029283f1aa2020e0e0e0c00032928401abe020e0e0e0c0003642928413b1ab8020e0c000431291a5f020c00021a61020e0e0c0002037e29352a362a353d1a58020e0c000303622a36293b1a6b020c000303033c020b29301a86020e0e0e0c000303041a8302103b500402002a28082b1a7e020e0e0e0c00045029352a36302b1a76020e0e0e0c00033c2b1a73020c00032a2a1a73020c0003332e2b1a72020e0e0e0c0004260802023b50292503511e893b6502013b643b2d293b1adb010c000303032a0278293c1a4e020e0e0e0c00032a3c1a43020c00032b3c1a3b020c00030402002a28082b1a06020e0e0e0c00045029352a36322b1afe010e0e0e0c00033c2b1afb010c00032a2a1a13020c0003293b1a83010c0003641a74010e0c0002293c1a73010c000303053034690201332933250c250c260a1e803b270a652f3b3c1ae4010e0c000450291a3b010c00021a3d010e0e0c0002030d2936293b1a37010c00036402013b034329351ac1012a69220e2a1ac1010e0e0c00031ac10156c722106a2a2a1abf010c00031ac1012a2f6a2e3c1a11010e0e0c0003292b1ab7010c0003280e2a3b6a270802b63b310e0e0c00023b2b291ace000e0e0e0c00021acd000e0e0c0002031729362b3c1ad7000c0003292b25042504511e253b6502012a653d2b693f2a691a74012a2f6a22112a1a43010c00031a6d0156f722136a2a2a1a43010c00033b3b32322d6805220e3c1a93000c0003312a1a93000c00036403151a4a013269312a1a2b010c0003280e2a3b6a6502123b3b34311a39010e0e0c0005280e2a3b6a642a3b69293b1a46000e0e0e0c000303032a0204402a2c6a270b2708440e0e0000000000000000f8020000000000000000000000000000|@3759,I105,I218,I251,I233,I106,I113,I234,@3652,@3654,I109,I11,I231,@3663,I104,I252,I245,I242,I254,I240,I243,I255,@3760,@3762,@3765,@3315,@3766,@1385,@3768,@3774,@3775,@3758| 3758:O1|@3777 3759:S33|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329 3760:D3,64|00802b353d1a40000e0c0003030e2b56173b1a3b002e0e7b0503000428062c56273b6b420e0e0e0e000000000000000030000000000000000000000000000000|@3761,I251,@2288| 3761:S42|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296669656c642d283129 3762:O1|@3763 3763:D3,208|00812c3528051acf000c0003031f2c362d372a2e1ac9000e0e0c00032a2f1abf000c000328052b2b6a270402832c3528091aa4000e0c000303032c02732c353b1a95000e0e0c000303152c362d372a2e1a8d000e0e0c00033b2a2c6a6602512c35401a73000c000303152c362d37292e1a6d000e0e0c0003402c2b6a6602312c353c1a53000c0003031f2c362d372e382a2f1a4b000c00032a301a43000c00033c2e2c2c6b270502072c2c2c7d040002430e0e0e0e0e0e0e0000000000000000c0000000000000000000000000000000|@3764,I251,@3762| 3764:S49|434f4445545245455f4f5054494d4953455228292e6f70744669656c647328332970757368436f6e7461696e6572283229 3765:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3766:D3,48|00802b56181a30000e0c00030304560702031a2b00420e0e000000000000000020000000000000000000000000000000|@3767,I113,@542| 3767:S44|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296d6b4669656c6473283129 3768:D2,48|008056081a31000e0e0c0002280c2d2b56476b64420e0e0e000000000000000020000000000000000000000000000000|@3770,@3769| 3769:O1|@3771 3770:S48|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329736574436f6e7461696e6572283129 3771:D22,352|00802b1a62012a1a66010e0e0e0c00021a65010e0e0c000203222a352b362a2c1a5d010e0e0c000303032a02012b2a2a2505250526031e303b6602012965293c1a45010e0e0c0003293b1a43010c000303033c023c293b1a3e010e0e0e0c000303033c020b291a37011a14010e0c000303041a3301103b5029283f1a0a010e0e0e0c00032928401a26010e0e0e0c0003642928413b1a20010e0c00042f291acf000c00021ad1000e0e0c0002036f29352a362a3b1ae1000e0e0c000303033c020b2a2f1afa000e0e0e0c000303041af700103b500402002b28082b1af2000e0e0e0c00045029352a362f2b1aea000e0e0e0c00033c2b1ae7000c00032a2a1ae7000c0003322e2b1ae6000e0e0e0c0004502f250926081e793b270802013b641ad6002b690402002e2b2b1ad3000c00045029352a36291acf000c0002502a2a692709420e0e0e0e0e000000000000000050010000000000000000000000000000|@3773,-1,I105,I218,I233,I106,I113,I234,@3652,@3654,I109,I11,I231,@3663,I104,I252,I245,I242,I254,@3772,@3651,I47| 3772:D7,96|00800402002c28082b1a5c000e0c00045029352a3656372b1a55000e0e0c00033c2b1a53000c00032a2a1a53000c0003293b1a53000c0003641a5400310e0e0e7d0800020e0e0e0e000000000000000050000000000000000000000000000000|@3665,I104,I252,I245,I243,I251,I218| 3773:S38|434f4445545245455f4f5054494d4953455228292e6669656c6473546f46696c746572283129 3774:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3775:D3,64|008056073b1a40000e0c000303041a3f00103b503d5617693f2a6928062a2f3b6b65420e0e0e0e0e000000000000000030000000000000000000000000000000|@3776,I234,@3576| 3776:S47|434f4445545245455f46554e4354494f4e5328292e6d6b5475706c6546726f6d436f6e7461696e6572283229283129 3777:D7,144|00832c1a92000e0e0e0c00021a91000e0e0c0002035b2c352d36302b1a89000e0e0c0003032928062e313b6b313c1a7f000c0003313c1a77000c00032a2a2e331a75000e0e0c00052c2a692704021f303c1a5c000e0c00032b2b692a322b321a56000e0e0e0c00051a55002a69666502013b1f040e0e0e0e000000000000000080000000000000000000000000000000|@3778,I105,I218,I113,I106,@3758,@542| 3778:S53|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329636f6e7461696e65722d6d6b4669656c64283329 3779:D39,2584|00842f353036313730353136323733383439220c3a220d2306220e23072e3b1afe090e0e0e0c000303042210020a22102f1af4090e0c0003220f3d1ae2090e0e0e0c000332353e1ad6090e0e0e0c0003030c293b1ac9090e0e0c000302013b07d73236333734382b3b2a3b1ab2090e0e0e0c000303033c02572a352b362a3529353f1a9b090c00030311293629353b1a8e090e0e0e0c00036402013b64032f2a3529362936292f1a86090e0e0e0c000303182e3c1a81090e0e0c00032d2a2508250826061e5b3b6402013b6602013b656503722b322a3b1a46090e0e0e0c0003030c293b1a39090e0e0c000302402a352b362b1a4a090e0e0e0c00021a49090e0e0c000203262b352c362c362b352a2a1a0d090e0e0c000365030d2b2a2506250626041e4e3b02013b6502013b65650311292f1aea080202a6000e0e0e0c000302013b02013b291afe080e0e0e0c000203033b02872b353f1ac5080e0e0c000303692b3629353c1ab6080e0e0e0c000303552936220c2a2a1ac5080e0e0c00021ac5080e0e0c000203043b5002041abf08102a352b362b3b1a95080e0e0c000303032a02172b3c1aae080e0e0e0c00032a2a2505250526031e413b6427043f2a692968016602013b6402112b353d1a4f080c000303052b680102013b270402013b293b1a3a080e0e0e0c000307cf2e3b1a2d080e0e0c000303352b291a41080e0e0c00021a41080e0e0c0002031d29352a362a353c1a08080e0c000303033c0207292503511e2a3b6502013b6402013b03503c28402f1a27080c00041a29082a6929220f220f6a1a2608121300010001002b6a220e2a1a1f080c00032d3b1a1f080c00032a221022102210221022102f2210680828072a6922183b452a4627080fca3c28402f1ad7070c00041af9072a6929220f220f6a1af607121300010001002b6a220e2a1acf070c00032211291a8e070e0e0e0c00021a8d07020232070e0e0c0002032429352a362a35291ac8071a4d070e0e0c00036403052a68010207292503511e363b6502013b64293b1a2f070c0003036d1aa707291a43070c00021a45070e0e0c0002032429352a362a35291a84071a09070e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aeb060c000303041a6b07103b50293529351a51071ad6060202a1060e0e0e0c000303043b5002041a530710293765021a293529351a2e071ab3060c000303043b5002041a3707102937643b220e291abc060e0c00021abd060e0e0c0002031729362b3c1a9f060c0003292b25042504511e233b6502012a652a3b1a80060e0c00031a91060e0e0c0002030c22193b1a5c060e0c000302013b03051be80302012a2d2b2b1adf060c00040403002a353e1a3b060c00030314333b1a91060e0e0c00032a3c4531462a47510fcd2a353c1a1c060e0c000303b92a36291ab0060e0c00023b292b1aae060e0e0e0c000303033b02222b2a1a56060e0e0e0c0003290305296801020e2a3c1a93060c00032502501e2e3b6464293b1ad3050c00031af5050e0e0c00026503543b2214291ade050e0e0e0c00021add050e0e0c0002031729362b3c1abf050c0003292b25042504511e253b6502012a65220c3b1aef050c00033222152d2d221b22162f1a37060c00082d3b452a463b4726040211343b1acc050e0c00032b3c4532462a47515002452a353d1a570502023b000c000303252a363022132b220e1a03060c0005220c3b1a9a050e0e0e0c00032c3b452b462a4726040211333b1a84050e0c00032a3b4531462a475129352a362b372a2218221822182218302f2218680804020022153c1afa040e0e0e0c000307db22123c1ab4050e0c000329353b1ae2040e0e0e0c0003032d2936291af4040e0c00021af5040e0e0c000203152936291ae0040e0c00021ae1040e0e0c00026402013b6402013b035329362a372a352b3629352a36333528071a97040c0003032d2a3b692d2a692b1aa8040e0c00021aa9040e0e0c00021aa1040e0e0c000203032f02031a3c053b2b2b6a66020a2c3b693b2a1a2d056a64270602012922181a29050e0e0c00020402002b353b1a43040c000303152b36291a58040e0c00021a59040e0e0c00026402013b07cc2b362c372a3622193b2a1a3904020256030e0e0c00021a35040e0e0c0002032f2a352b362a353b1afc030e0c000303102a37291ad0040e0c0002292e696502012b2a2a2505250526031e403b660201296529291af0030e0c00021af1030e0e0c000203043b5002041aa3041029352a36291ad2030e0e0e0c00021ad1030e0e0c0002031c29352a362c2b1a89040e0e0c0003292b6964250526041e483b6502012a6629301a77040c0003292d69220e1a74040e0c000229353d1a6a030e0e0e0c000303102f353c1a5c0302028a000e0c000302013b0377221e293b1a48030e0c000303033b025c29352a362a353b1a35030e0e0c000303432a3629291a47030c00021a49030e0e0c0002031d29352a362a353d1a10030e0c000303033c0207292503511e283b6502013b6403033c02082a250426031e5c3b640207292503511e663b656403032902031aaa0302012f322c452a46260a02562216291ae8020e0c00021ae9020e0e0c0002031d29352a362a353c1ab0020e0c000303033c0207292503511e293b6502013b6403162a3b69311a92030e0e0e0c00022b2b452a462603020b1a88032a2a35452a36465129352a362a1a90020e0c00021a91020e0e0c000207d12a352b36291a7a020e0e0e0c00021a79020e0e0c0002031922233b3c1a53030c000450322226331a50030e0c0004500fdc2b353d1a2b020c000303212b3622243b3c1a2d030e0e0c000450332a2228220c1a2e030e0e0e0c0005510fd02a291a20020e0c00021a21020e0e0c000203d529352a362a353b1ae8010e0c000303982a362b372a1afa010e0e0e0c00021af9010e0e0c0002037c2a352b36293b1ac1010e0e0c0003031c2b353d1ab4010e0c0003030d2b37293b1aa7010c00036402013b02013b03033c02472a291ab30102029b000c00021ab1010e0e0c0002032f29352a362a353d1a78010e0c0003030d2a37293b1a6b010c00036402013b03033c0207292503511e3c3b6502035c003b646502013b65021e2a353d1a44010e0c000303112a37293b1a370102023c000c00036402013b03033c0207292503511ee13b6502013b64031c22233b3c1a22020e0e0e0c000450322b2227341a2b020c00055002063133453b465051023129353d1aee000e0e0e0c0003031d293622223b3c1aed010e0e0c000450312a2226331aef010c00055102062f31453b465026060206292b453b465029352a362a3a293b1aae000e0e0e0c000364035222173c1a9f000c0003034422141ab5000e0e0c00021ab5000e0e0c000203242214352215362a353c1a7a000e0e0e0c0003030c293b1a6d000e0e0c000302013b6502013b1a86000e0e0e0c000202013b02013b0311221d3b3c1a59010e0e0c0004503b5002023b5028072b6922232b452a4627130209293522113b452a4664270e1f050e0e0000000000000000080a0000000000000000000000000000|@3781,I251,@3782,I113,I106,I105,I218,@611,I107,I11,@3784,@3786,@3315,I253,@3787,@3788,@14391,@2781,@2836,@1576,@3789,I15,I247,I239,@3795,@3831,@3839,@588,@3864,@3866,@3870,@3872,@3874,@3876,@3882,I255,@3883,@3910,@3780| 3780:O1|@3939 3781:S33|434f4445545245455f4f5054494d4953455228292e6f70744c616d626461283429 3782:O1|@3783 3783:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3782| 3784:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003293c1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@3785,I253,I106,I255| 3785:S47|434f4445545245455f4f5054494d4953455228292e6f70744c616d6264612834296f7074436f6e746578742d283129 3786:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3787:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003293c1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@3785,I253,I106,I255| 3788:D2,40|00802b56181a280056372e7b05030004000000000000000018000000000000000000000000000000|@3715,@578| 3789:O1|@3790 3790:D17,320|00823c28403b1a3f010c00043c28403c1a35010e0e0c00042e3b1a33010c000303033c020b2e1a2f011a34010e0c000303041a3301103b502e3c1a33010c00032928403c1a01010e0e0c0004293b321a26010e0e0e0c00045031303c3c2d31311a1d010e0e0c0008293b1a1b010c000303051a1b0102a82d3b1a1c010e0c00031a1d010e0e0c000203051a1b0102902c3b1a04010e0c000303432a3b1af9000e0e0c0003293b1adf000c000303051aff0002242928403b1a8e000e0e0e0c00042c3c2b3b2e1af0000e0c000650291aef000c00025029643d2a696502422a3b1ab6000e0e0e0c0003293b1a9b000c000303051abb0002242928403b1a4a000e0e0e0c00042c3c2b3b2e1aac000e0c000650291aab000c00025029643c2a69652705440e0e0e0e0e0e000000000000000030010000000000000000000000000000|@3792,I11,I234,72057594037927934,I231,@1603,I106,I255,@3791,I113,@577,I253,I218,@1444,I49,I195,I47| 3791:O1|@3793 3792:S40|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329 3793:D13,1824|0086303b1a21070e0e0c000303033b0fdb31350a0e00f5024e03c506b2038a0648025e0685056e02b2021e0085025a0130010a02313632372a332a1af2060e0e0e0c00021af1060e0e0c000207cb2a352b362a353b1ae8060e0c0003032d2a392c3c1ae3060c0003030c2c3c1ae1060e0e0c000302013b2a2a3b22102210221022101ad3060c00086502962a353d1aaf060c000303192a36292d3b220f220f220f220f1ab2060e0e0e0c00086402722a353e1a8b060c0003034d2a36292d2a1a6e060e0e0e0c00021a6d060e0e0c000203312a352b362a3728072a69292e3b22152215221522151a6e06020214060e0e0e0c00082c2a2507250726051e3e3b270502012966021a2a38292d3b220f220f220f220f1a4106020214000e0e0c0008642a2a2505250526031eef3b66020129652a2a34343434341a1d06220c0e0e7b090c00080fd03137313c1afb050c0003030c313c1af9050e0e0c000302013b2a2a3b333333331aef05340e7b090b00083136323733382b35280e1ac3050c000303562b3629220c2a1aa5050e0e0c00021aa5050e0e0c000203242a352b362a2c3b22102210221022101aac050e0c00082a2a2505250526031e313b66020129652b2a3b220d220d220d220d1a8a05220e0e0e0e7b090e00082a35342a1a69050e0e0c0003030c342a1a65050e0e0c000302013b2d2a3b220d220d220d220d1a57050c00082c2a3b220e220e220e220e1a4605220f0202ea040e0e0e7b090f0008313629322a1a08050e0c00021a09050e0e0c000203242a352b362a2c3b220d220d220d220d1a10050e0c00082a2a2505250526031e303b66020129660fdc31363237293333333333331aec040e0c00082b2a3b343434341ade04220c0e0e0e7b090c0008303c1abf040c0003030a303c1abd042d7e0900033b0fd63136313c1aa6040e0e0e0c0003030c313c1aa1040e0e0c000302013b2a2a3b333333331a9704340e7b090b0008313629322a1a60040e0c00021a61040e0e0c000203292a352b362a35292d3b220e220e220e220e1a66040e0e0e0c00082b2a2506250626041e343b2704020129660fd93136323729332a1a1b040c00021a1d040e0e0c0002032d2a352b362a352937292e3b22102210221022101a20040202c6030e0c00082c2a2507250726051e373b2705020129652b2a3b343434341afd03220c0e0e7b090c0008313632373338333d1ad90302028f030e0e0c0003030c333d1ad1030e0e0c000302013b2a2a220c220c220c220c220c1ac2030e0e0e0c00082c2a220d220d220d220d220d1aad030e0e0c00082e2a3b220e220e220e220e1a9a03220f0e0e0e7b090f00083136323729353f1a6e030e0e0e0c00030324293629353e1a5e0302021c030e0e0e0c0003030c313c1a4d030e0e0c000302013b6402013b07cb2a3b2a1a29030e0e0c00021a29030e0e0c0002039c2a352b362a3529353f1a1e030e0e0e0c00030311293629353b1a0e030e0e0e0c00036402013b0311293629362e2a1ae1020e0e0c00036502013b03043b5002432c3b1a05030e0e0c000303033c0214343b1afe020e0e0e0c00032d2a1ad3020c00036403041af202103b502c3c1af2020e0e0e0c0003220c2a3b1aed020e0e0c0004512c3c1ada020e0e0e0c00032b2a2506250626041ea926040200512e3b3c1ac7020c0004503103043b5002132d3b3b1ab60202025d000e0e0e0c0004503b50323e1a6c020e0c0003030c323e1a69020e0e0c000302013b2b2a2a1a3b020c00021a3d020e0e0c000203252a352b362a35292d3b3c2210221022101a43020c00082b2a2506250626041e2f3b270402012966026d323d1a18020e0c0003030c323d1a15020e0e0c000302013b2b2a2a1ae7010c00021ae9010e0e0c000203292a352b362a35292d3b22102210221022101aee010e0e0e0c00082b2a2506250626041e333b2704020129652b2a3b220c220c220c220c1ac901220d0e0e7b090d0008650fcd313629352a382b392a291a88010e0c00021a89010e0e0c0002031d29352a362a353e1a80010e0c000303033c0207292503511e293b6502013b6403033b02963b2a291a50010e0c00021a51010e0e0c0002031729362b3c1a83010c0003292b25042504511e233b6502012a653b2c291a23010c00021a25010e0e0c0002031729362b3c1a57010c0003292b25042504511e223b6502012a652a2a1a40010e0c0003220e2a1a06010e0e0e0c0003030c220e2a1a00010e0c000302013b2f2a3b3b2210221022101af4002211020298000e7b091100082704028e3136313c1acd000e0e0c0003030c313c1ac9000e0e0c000302013b2a2a3b333333331abf00340e7b090b0008313629353e1a98000e0c0003030c2f3c1a8d000e0e0c000302013b6403033b0218303c1a82000e0e0e0c0003030a303c1a7d002d7e0900033b02273136291a4f000c00020303310218313c1a5a000e0e0e0c0003030a313c1a55002e7e0a00033b641f070e0e0e0e000000000000000010070000000000000000000000000000|@3794,I113,I105,I218,I251,I231,I107,@3791,I234,I253,@1614,I106,I255| 3794:S51|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329636865636b557365283429 3795:O1|@3796 3796:D23,328|0086040300313b313b3b3b3b30220f1a3e010e0e0e0c000a5029352a362b37293b1a34010e0c000303051a330102903b2a291a33010c00021a35010e0e0c0002031729362b3c1a2f010c0003292b25042504511e223b6502012a65291a21011a26010e0e0e0c000303041a2301103b502928403b1a21010e0e0c00043b2c293b1ad5000e0e0c000303043b50022629352a362d2d2c1a08010e0c0004502c3c1ad6000e0e0e0c0003292b2505250526031e32260351291aef000c0002502965220d2a220d1ae9001aee000e0e0e0c0005331aec001af1000e0e0c0003220c1aef001af4000e0c00032f3b1a6b000c0003030329020b29301ae6000e0e0e0c00032f1ae4000e0c00022d2d1ae3002d2d3c22122214680828072a69321ada000e0e0e0c00023e2a2c22136b270d1f070e0e000000000000000038010000000000000000000000000000|@3798,@3799,I251,I49,I105,I218,I106,72057594037927935,I231,@3441,I11,I255,I47,@3802,@3806,@2742,@122,@3823,@1385,@3826,@3828,@578,@3797| 3797:O1|@3830 3798:S45|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e283729 3799:O1|@3800 3800:D10,384|0088333b1a81010e0e0c0003038d2f3b2a1a7c010e0c00021a7d010e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f3b2a1a51010e0e0c00021a51010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f3b2a1a25010e0e0c00021a25010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f2c452b462a476602c9333534362a352b363b220e69220e1ae4000e0c00021ae5000e0e0c000203033c0214301adf000c0002220f2a1ade000e0e0e0c00036403041ada00103b5030220f1ad9000e0e0c0003033a220e3c1ad4000e0c0003220e3c1aca000e0e0e0c00032b220e693c22116929220e69312e2e22142f22142f221422141ab00022150e7b0b15000a220e3c1a9a000e0e0e0c0003220d3c1a8e000e0e0e0c00033f2c69292f2f6a29220f693b2212692922106933302216312216302f221622161a6d0022170e0e7b0b17000a1f090e0e000000000000000070010000000000000000000000000000|@3801,I251,I105,I218,I15,I247,@599,I253,I106,@3799| 3801:S55|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372967657441726773283729 3802:O1|@3803 3803:D2,40|00813e2d1a29002e6b430e0e0e0e0e0e000000000000000018000000000000000000000000000000|@3805,@3804| 3804:O2|4,@577 3805:S53|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e672834292d45 3806:O1|@3807 3807:D4,48|00831a33002e2d2f6b1a34002a69302a1a35002f7e080003000000000000000020000000000000000000000000000000|@3809,@3810,@3808,@3315| 3808:D3,104|00802b3528071a67000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a50000e0c00033131312c31313131680828072a69296801270c02072b56172c800002420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3817,I251,@3821| 3809:S51|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429 3810:D9,224|00802b353f1ae0000e0c000303112b3629353b1ad2000e0e0e0c00036402013b034c2b362936291ac6000e0e0e0c00021ac5000e0e0c000203033c021456271abe000e0e0e0c00022a2a1abb000c00036403041aba00103b5056272a1ab9000e0e0c00033f2a69296801270402562b353e1a74000e0c000303252b3729353f1a66000e0e0e0c00030311293629353e1a56000e0e0e0c00036402013b6402013b03212b362c382a3b56492e1a72000e0e0e0c0005292b56580e0c0003296801270402013b420e0e0e0000000000000000d0000000000000000000000000000000|@3812,I251,I105,I218,I15,I247,@599,I253,@3811| 3811:O1|@3813 3812:S62|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e747279283129 3813:D12,184|00832e3b1ab9000e0e0c000303033b02882e352f362a352b36311aab000c00021aad000e0e0c000203033c0210301aa7000c0002322a1aa7000c00036403041aa600103b5030321aa6000e0e0e0c0003031a313c1aa1000e0e0c00032c2a33331a9d00340e0e0e7b060b00051a990030692b2a1a9a000e0e0e0c0003292c69343c1a74000e0c00032f2a220d220d1a6f000c00052b2a6927091f040e0e0e0e0e0000000000000000a8000000000000000000000000000000|@3815,I251,I105,I218,I15,I247,@599,I253,I106,@3811,@3814,@3315| 3814:D3,104|00802b3528071a67000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a50000e0c00033131312c31313131680828072a69296801270c02072b56172c800002420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@3817,I251,@3816| 3815:S71|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e7472792831296d6170417267283229 3816:O1|@3818 3817:S39|434f4445545245455f4f5054494d4953455228292e6f6e6c7946756e6374696f6e283129283129 3818:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d363f2b69292f1a66000e0e0e0c000329353f1a62000e0e0e0c000303043b5002041a5b001029362c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@3315,I251,@3819,@3816| 3819:O4|@14322,@596,@2336,@3820 3820:O5|@3704,230,0,230,0 3821:O1|@3822 3822:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d363f2b69292f1a66000e0e0e0c000329353f1a62000e0e0e0c000303043b5002041a5b001029362c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@3315,I251,@3819,@3821| 3823:O1|@3824 3824:D1,32|00803c2c69420e0e000000000000000010000000000000000000000000000000|@3825| 3825:S60|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372973756246756e6374696f6e2d283129 3826:O1|@3827 3827:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3826| 3828:O1|@3829 3829:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a362b372a2a692c1a43000c00022a2a69270602013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3828| 3830:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a352b362a2a692c1a43000c00022a2a69270602013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3797| 3831:O1|@3832 3832:D15,232|00830402002e3b3b3b2d32321ae1000e0e0c00085029352a36293b1ada000e0e0e0c000303051ad70002903b2a291ad7000c00021ad9000e0e0c0002031729362b3c1ad3000c0003292b25042504511e223b6502012a65291ac5001aca000e0e0e0c000303041ac700103b502928403b1ac5000e0e0c00043b2c293b1a79000e0e0c000303043b50022629352a362d2d2c1aac000e0c0004502c3c1a7a000e0e0e0c0003292b2505250526031e32260351291a93000c0002502965322a321a8f001a94000e0c00053b2a2e6a27051f040000000000000000d8000000000000000000000000000000|@3834,@3835,I251,I49,I105,I218,I106,72057594037927935,I231,@3441,I11,I255,I47,@3833,@3806| 3833:O1|@3838 3834:S52|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f70283429 3835:O1|@3836 3836:D13,368|0086313b1a71010e0e0c0003035f2f3b2a1a6c010e0c00021a6d010e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f3b2a1a41010e0e0c00021a41010e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652f2b452a46650fdc313532362a352b36341a07010c00021a09010e0e0c000203033c0214301a03010c0002220c2a1a02010e0e0e0c00036403041afe00103b5030220c1afd000e0e0c0003032a343c1af9000e0e0c00033b220d6929220c692e2c220f2c220f220f220f1ae60022100e0e0e7b091000082f3b1ac7000c0003303b1abf000c0003293c1abf000c0003323b2b1ac6000e0e0e0c000450220e3c1aa9000e0e0c0003220f3b1ab6000e0e0e0c000303041ab300103b503b2210693f2a692f2f2b6a293269292213693d326929221469220d312d2c2217221722171a71000202090022180e0e7b091800081f070e0e000000000000000060010000000000000000000000000000|@3837,I251,I105,I218,I15,I247,@599,I253,I106,@3835,I255,I234,@3576| 3837:S62|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f702834296d617041726773283429 3838:D1,32|008128092d69430e000000000000000010000000000000000000000000000000|@3805| 3839:O1|@3840 3840:D14,368|00812c1a72010e0e0e0c00021a71010e0e0c000207ca2c352d362a353d1a68010e0c000303372a36293c1a63010c00031a65012b690402002b2b2b1a62010e0e0e0c00045029352a36291a5b010c0002502a2a693d2a3b3c6b270702c92a353b1a25010e0e0c000303b92a362b372f3b1a15010e0e0c000303033d02012f2b2a1a2d010e0e0c00030402002a353b1af7000c0003030d2a362b372b2b452a4626030206293b452b465029352a362e1a07010c0002220c3d1ace000e0e0e0c0003034d2f291ab1000e0e0c00021ab1000e0e0c0002033529352a362a1ae20002026d000e0e0e0c0002291adc001a99000e0e0c0003641a88000e0c000203033c0207292503511e423b6502013b6402013b03051abb000208292c693b2a2d6a64270802031aaa002a3b1a5d000e0e0c000303032902172a2f1a76000e0e0e0c00032a2a1a9300310e0e7e0800036602031a7e00430e0e0e0e0e000000000000000060010000000000000000000000000000|@3842,I105,I218,I251,I106,@3843,@3651,I47,@3839,@3845,@3558,1879048192,@588,@3841| 3841:O1|@3853 3842:S36|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e283229 3843:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@3844,I113| 3844:S42|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e28322970312d283129 3845:O1|@3846 3846:D10,152|00802b1a9a000e0e0e0c00021a99000e0e0c000203612b352c360402002b2a1a8e000e0e0e0c00035029352a362a3c1a86000e0e0e0c000303051a830002280402002b1a82002b1a86000e0e0e0c00045029352a36291a7f000c0002502a2a693d2a2f3b6b27042d1a75000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@3848,I232,@588,@3847,@3651,I47,@3845| 3847:O1|@3851 3848:O1|@3849 3849:D18,432|00812c35401ab0010e0c0003030e2c37292d1aab012e0e0e7e0500032c353c1a96010e0e0e0c000303522c372d380402002b2a1a8a010e0e0e0c00035029352a360402002d2a1a77010c00035029352a362d2b1a72010e0e0e0c0003030f2c03032902013b342f452a4664020b1a6001342a35452a36466427080fca2c353f1a36010e0e0e0c0003030d1a4b012c2a35452a3646640fdd2c353d1a1b010c0003037e2c36291a38010e0c000203033c0227291a2b010c000203041a2b01103b50291a2c010e0c0002293b1aeb000c0003641a24010e0c0002030d1a23012d2a35452a3646640236291af5000e0e0c000203041a1301103b50291a14010e0c0002293b1a13010c0003030c1a13012a1a17010c00030201292e2a453c46656402742c35280e1a91000e0e0c0003035b2c362d37293b1a81000e0e0c0003033d3b2b291a9c0002024c000e0c00021aa9000e0e0c0002031729362b3c1acb000c0003292b25042504511e273b6502012a652e2a4502021e003b4664020b1ab2002e2a35452a36466465020b1aac002c2a35452a364664430e0e0e0000000000000000a0010000000000000000000000000000|@3850,I251,@3848,I113,@474,@474,I105,@1363,I17,I218,@474,@1363,I15,I234,@410,I106,@474,@474| 3850:S33|434f4445545245455f4f5054494d4953455228292e66696e645475706c65283129 3851:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@3852| 3852:S33|434f4445545245455f4f5054494d4953455228292e6d6170417267283129283129 3853:D17,672|00812c353b1aa0020e0c0003030c2b353b1a94020e0c000302013b03442c362d372d362e372c2b1a86021a8b020c0004291a8c020e0c00021a8d020e0e0c00021a85020e0e0c000203051a8302020e2c2b1a5c020e0c00033b2b2b6a6427050fcf2c353d1a41020e0e0c0003030c2b353d1a34020e0c000302013b07ca2c362d372e382e362f3730382e353b2a293b1a16020e0e0e0c000303032a0279293c1a36020e0e0e0c00032a3c1a2b020c00032b3c1a23020c000334360402002b28082b1a1c020e0c00045029352a362c2b1a16020e0e0e0c00033c2b1a13020c00032a2a1a13020c0003293b1abb010c0003641ad4010e0c0002293c1aab010c0003030631220c690201342934250d250d260b1e843b270b652d353b2a293b1a88010e0c000303032a0281293c1aaa01020255010e0e0e0c00032a3c1a9b010c00032b3c1a930102023b010c000333360402002b28082b1a88010e0c00045029352a362c2b1a82010e0e0e0c00033c2b1a7f010c00032a2a1a7f010c0003293b1a27010c0003641a40010e0c0002293c1a17010c0003030631220c690201342934250d250d260b1e8a3b270b652b2a2a2a1af6000e0e0e0c000303033c024f2a1aff000c00021a01010e0e0c0002033d291aee000e0e0e0c00021aed000e0e0c000203262a352b362b352c362c2b1a11010e0e0c0003030d2b2a2506250626041e513b02013b270402013b02013b270603162d03032a02013b2d03032a02013b3d312c2c6b65025a2c03032902013b034e2e352c352a2a1ad0000e0c000303032a0201291acb002f336a0402002b2b2b1ac7000c00045029352a36291ac3000c0002502a2a69220c03033202013b220c03033202013b3d2c2c2c6b270a02031a5000270602031a490043000000000000000090020000000000000000000000000000|@3855,I251,@3841,@3856,I105,I218,@588,I240,I104,I252,I245,I243,I113,I233,@3854,@3651,I47| 3854:D10,288|00805608352c2a1a1e010e0e0e0c000364036d5608355618362d3b1a0a010e0e0e0c000303033c020b2d2b1a02010e0e0e0c000303041aff00103b500402002e28082b1afa000e0e0e0c00045029352a362c2b1af2000e0e0e0c00033c2b1aef000c00032a2a1aef000c0003293b1aef000c0003641af0000e0c0002270702013b03033c027f5607352c2a1a9a000e0e0e0c000364036d5607355617362d3b1a86000e0e0e0c000303033c020b2d2b1a7e000e0e0e0c000303041a7b00103b500402002e28082b1a76000e0e0e0c00045029352a362c2b1a6e000e0e0e0c00033c2b1a6b000c00032a2a1a6b000c0003293b1a6b000c0003641a6c00330e0e0e7d0a00023b420e0e000000000000000010010000000000000000000000000000|@3863,I234,I231,@3641,I104,I252,I245,I243,I251,I218| 3855:S51|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229 3856:O1|@3857 3857:D5,112|00822d1a72000e0e0e0c00021a71000e0e0c000203142c1a5e000e0e0e0c00021a5d000e0e0c000202013b03262d352e362e352f362c2b311a4d000e0e0c00042c2b321a4a000e0e0e0c00042a2a69270602013b440e0e0e000000000000000060000000000000000000000000000000|@3592,I105,I218,@3858,@3856| 3858:O1|@3859 3859:D7,120|00822d3b1a79000e0e0c000303172c3b1a6d000e0e0c000303043b5002041a6700103b02382d352e362e1a63000c00021a65000e0e0c000203043b5002041a5f00102e352f362c2b310c00032c2b321a56000e0e0e0c00042a2a692706440e0e000000000000000068000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@3858| 3860:O4|@14383,@2706,0,@3862 3861:S19|4c697374506169722e6d617045712833292829 3862:O5|@2707,68,0,68,0 3863:S60|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229756e696f6e2d283129 3864:O1|@3865 3865:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a36293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3839,@3864| 3866:O1|@3867 3867:D10,152|00802b1a9a000e0e0e0c00021a99000e0e0c000203612b352c360402002b2a1a8e000e0e0e0c00035029352a362a3c1a86000e0e0e0c000303051a830002280402002b1a82002b1a86000e0e0e0c00045029352a36291a7f000c0002502a2a693d2a2f3b6b27042d1a75000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@3848,I232,@588,@3868,@3651,I47,@3866| 3868:O1|@3869 3869:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@3852| 3870:O4|@14358,@1714,0,@3871 3871:O5|@3704,504,0,504,0 3872:O1|@3873 3873:D7,128|00812c3b1a81000e0e0c000303172b3b1a75000e0e0c000303043b5002041a6f00103b02402c352d362d1a6b000c00021a6d000e0e0c000203043b5002041a6700102d352e362c353d1a3c000e0c000303032c02012a2c2b1a55000e0e0c00032a2a692706430e0e000000000000000070000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@3872| 3874:O1|@3875 3875:D8,144|00812c3b1a91000e0e0c000303172b3b1a85000e0e0c000303043b5002041a7f00103b02502c352d362d1a7b000c00021a7d000e0e0c000203043b5002041a7700102d352e362a353d1a4c000e0c000303142c353d1a40000e0c000303032a02031a5c0002012a2c2b1a5c000e0c00032a2a692706430e0e000000000000000080000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@588,@3874| 3876:O1|@3877 3877:D10,240|00802b35401af0000e0c0003030e2b37291aec002d0e0e0e7d0400022b353c1ad6000e0e0e0c0003032d2b372c382a1ace000e0e0e0c000229353d1aba000e0e0e0c0003030329020b2a1ab3002f0e0e7d06000266027f2b35280e1a9a000e0e0e0c0003036d2b362c37293b1a89000e0e0c000303573b2b291a8c000e0c00021a8d000e0e0c0002031729362b3c1a87000c0003292b25042504511e233b6502012a650402002a1a76002b1a7a000e0e0e0c00045029352a36291a73000c0002502a2a693d2a3b3b6b270502031a68006502031a6200420e0000000000000000e0000000000000000000000000000000|@3879,I251,@3876,I105,I218,I106,@3878,@3651,I47,@588| 3878:O1|@3880 3879:S40|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129 3880:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@3881| 3881:S43|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129283129 3882:O2|0,@588 3883:O1|@3884 3884:D23,448|00822d35293528071abd010e0e0c000303043b5002041ab70110293629392a2307313632383339343a220c2306220d23073b220e0e0c00023b220f0e0e0c00023b30291a92010e0e0e0c00021a91010e0e0c0002031729362b3c1a8b010c0003292b25042504511e253b6502012a653c2a691a7b012a691a7e012a2c6a220f2a1a7d010e0e0c00033b34291a4a010e0e0e0c00021a49010e0e0c0002031729362b3c1a43010c0003292b25042504511e253b6502012a65220f3b2b1a4a010e0e0e0c00043e2a2d22126b3d3269293b69293b1af3000c000303042210020a22102a1a2c010e0c000322143b1ada000e0e0e0c000303042210020a221022151a17010c00032d22141a16012d2d22152215221b6808220e2a69311a0c011a11010e0e0c00031a11012a6922153b1a11010e0e0c0003221a3b1a0e010e0e0e0c0003293b1a83000c000303032a020b2a2a1afe000e0e0e0c00033e2a1afb0022186b221b282d1af9000e0e0c00032a2a1af7003122223b3b2224680828072a693d221969293b692b22211ae5002c22223b3b22226808221a2a69293b69220e2a69222b2d452a462729440000000000000000b0010000000000000000000000000000|@3886,I251,@3887,I105,I218,I106,@3890,@3892,@3315,@3895,@3898,@3900,@578,@3902,@1385,@474,@3905,@3907,@3885,@1109,@122,@578,@578| 3885:O1|@3909 3886:S39|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229 3887:O4|@14322,@596,@3889,@3888 3888:O5|@3704,918,0,918,0 3889:S15|6465637572727946756e6374696f6e 3890:D2,72|00802b353f1a48000e0c000303112b3629353e1a3a000e0e0e0c00036402013b030a3f5617692968016402013b420e0e000000000000000038000000000000000000000000000000|@3891,I251| 3891:S47|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229646f4d6170283129 3892:D3,136|00802b3528071a87000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a70000e0c00033131312c31313131680828072a69296801270c022c2b353f1a49000e0e0c000303112b3629353e1a3a000e0e0e0c00036402013b030a3f5618692968016402013b420e0e000000000000000078000000000000000000000000000000|@3817,I251,@3893| 3893:O1|@3894 3894:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d363f2b69292f1a66000e0e0e0c000329353f1a62000e0e0e0c000303043b5002041a5b001029362c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@3315,I251,@3819,@3893| 3895:O1|@3896 3896:D4,96|00822d3b1a61000e0e0c000303033b02342d352e362a352f2f1a54000e0c00033b2a693f2a69292d69333c1a42000e0e0e0c00032f2a220c1a3d000e0e0c00042b2a692709440e0e000000000000000050000000000000000000000000000000|@3897,I251,I106,@3895| 3897:S50|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e2832296d61704172672833292829 3898:O1|@3899 3899:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3898| 3900:O1|@3901 3901:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3900| 3902:O1|@3903 3903:D1,32|00803b2c69420e0e000000000000000010000000000000000000000000000000|@3904| 3904:S12|4c6f6164417267756d656e74 3905:O1|@3906 3906:D4,96|00812c3b1a61000e0e0c000303033b02302c352d362a352e3c1a54000e0c00033c2a693f2a69292d69323c1a42000e0e0e0c00032f2a1a3f000c00032b2a692709430e0e0e0e0e0e000000000000000050000000000000000000000000000000|@3897,I251,I106,@3905| 3907:O1|@3908 3908:D4,80|00812c3b1a51000e0e0c000303033b02242c352d362a353b2f693f2a69292c69313c1a3b000c00032e2a1a3b000c00032b2a692708430e0e000000000000000040000000000000000000000000000000|@3897,I251,I106,@3907| 3909:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3885| 3910:O1|@3911 3911:D23,496|00832e352f3630383139323a3323063423073b340e0c00023b220c0e0e0c00023b30291ad2010e0e0e0c00021ad1010e0e0c0002031729362b3c1acb010c0003292b25042504511e253b6502012a653c2a691abb012a691abe012a2c6a220c2a1abd010e0e0c00033b34291a8a010e0e0e0c00021a89010e0e0c0002031729362b3c1a83010c0003292b25042504511e253b6502012a653b2a693f2a69280c2d22172c6b220e1a7f010c00023d3469293b69293b1a79010e0e0c000303042212020a22122a1a70010e0c000322103c1a36010e0e0e0c00032e22161a62012d3122172f3c680822102a69221d353b3b292c1a54010e0c000303032a0270293c1a4e010e0e0e0c00032221360402002c28082b1a43010c00045029352a362c2b1a3e010e0e0e0c00033c2b1a3b010c00032a2a1a3b010c0003293b1af3000c0003641abc000e0c0002293b1ae3000c0003030332020b323c1aae000e0e0e0c00032932250b250b26091e793b27096522173b1a04010e0c0003291a04010e0c00023e2a1a03013c6b3b3b3b2f2d6805293b6922241afa001aff000c00032a3b1a8f000c00030303290204402b2b6a3d221b69293b692b22231ae6002c22243b3c22246808221c2a69293b69220e2a69222a2d452a4627281f040000000000000000e0010000000000000000000000000000|@3913,I105,I218,I106,@3914,@3916,@3315,@3919,I251,@3921,@578,I247,I239,I104,I252,I245,I243,@3923,@3926,@1109,@3931,@3912,@578| 3912:O1|@3934 3913:S37|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329 3914:D2,72|00802b353f1a48000e0c000303112b3629353e1a3a000e0e0e0c00036402013b030a3f5617692968016402013b420e0e000000000000000038000000000000000000000000000000|@3915,I251| 3915:S45|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329646f4d6170283129 3916:D3,136|00802b3528071a87000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71a70000e0c00033131312c31313131680828072a69296801270c022c2b353f1a49000e0e0c000303112b3629353e1a3a000e0e0e0c00036402013b030a3f5618692968016402013b420e0e000000000000000078000000000000000000000000000000|@3817,I251,@3917| 3917:O1|@3918 3918:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d363f2b69292f1a66000e0e0e0c000329353f1a62000e0e0e0c000303043b5002041a5b001029362c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@3315,I251,@3819,@3917| 3919:O1|@3920 3920:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3919,@470| 3921:O1|@3922 3922:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3921| 3923:O1|@3924 3924:D4,80|00812c3b1a51000e0e0c000303033b02242c352d362a353b2f693f2a69292c69313c1a3b000c00032e2a1a3b000c00032b2a692708430e0e000000000000000040000000000000000000000000000000|@3925,I251,I106,@3923| 3925:S48|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833296d61704172672833292829 3926:O1|@3927 3927:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3926,@3928| 3928:O2|@3929,0 3929:O2|@3930,1 3930:O2|4,@1182 3931:O1|@3932 3932:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@3933,@3930| 3933:S49|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833297368696d426f64792d283129 3934:D6,112|00813b3b2e2e1a6f000c0005280e2a3b6a2a291a6a000e0e0e0c00021a69000e0e0c0002031d29352a362a353d1a60000e0c00030309292503511e283b02013b6502013c640309291a4d002e7d0600022965430e0e0e0e0e000000000000000060000000000000000000000000000000|@3936,@3935,I105,I218,I251,@2349| 3935:O1|@3937 3936:S38|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229 3937:D14,224|00832c352f2a1adf000c00036403033b02b02c352d36303b1ad5000e0e0c000303033c020b302b1ace000e0e0e0c000303041acb00103b500402003128082b1ac6000e0e0e0c00045029352a362c2b1abe000e0e0e0c00033c2b1abb000c00032a2a1abb000c0003293b1abb000c0003641abc000e0c00022707032b2d2c0e0e0e0c00022f3c1aaf000c00032f3c1aa7000c00032a2a31311aa5000e0e0c00052c2a692704021b2e3c1a8c000e0c0003292f2f2f1a89000e0e0c00051a89002a69651f040e0e0e0e0000000000000000d0000000000000000000000000000000|@3938,I113,I234,I231,@3641,I104,I252,I245,I243,I251,I218,I106,@3935,@542| 3938:S47|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229657874417267283229 3939:D23,480|00832e352f3630383139323a3323063423073c28402c1acf010c0004040300220d3b3b2c2e220c1ac6010e0e0e0c00075029352a362b37293b1abc010e0c000303051abb0102903b2a291abb010c00021abd010e0e0c0002031729362b3c1ab7010c0003292b25042504511e223b6502012a65291aa9011aae010e0e0e0c000303041aab01103b502928403b1a59010e0e0c00043b2c293b1a5d010e0e0c000303043b50022629352a362d2d2c1a88010e0c0004502c3c1a5e010e0e0e0c0003292b2505250526031e32260351291a6f010c00025029653b34291a2b010c00021a2d010e0e0c0002031729362b3c1a27010c0003292b25042504511e223b6502012a653c2a691a3f012a2d6a1a41012a2c2f6b22102a1a3f010c00032216220f1a3d010e0e0c0003312a1a3b010c00033b22180e0e0c00023b22190e0e0c0002220c3b1ab2000e0e0e0c000303032d020540220d2f6a3d2b69293b69293b1a97000c000303042216020a22162a1a00010e0c000322123b1afe000e0e0e0c00032d221a1afa002d220c221b2f221b6808302a693e331af00022196b3d3369293b692b221f1ae9002c22203b3b22206808342a69293b692f2a6922262d452a4627241f040e0e0e0e0e0000000000000000d0010000000000000000000000000000|@3941,I11,@3942,I251,I49,I105,I218,I106,72057594037927935,I231,@3441,I255,I47,@3996,@3998,@3315,@4001,@4011,@3940,I253,@578,@1109,@578| 3940:O1|@4013 3941:S45|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329 3942:O1|@3943 3943:D21,1240|0085303b1ad9040e0e0c000303101ad7042e2a35452a36462a3747640fd1303531362a353b1ab8040e0c000307cb2a362b372a1aba040e0e0e0c00021ab9040e0e0c000207d52a352b36293b1a91040e0e0c0003031c2b353d1a84040e0c0003030d2b37293b1a77040c00036402013b02013b03732b363b220d69293b693b221069293b692d6801040300332e2d2d2d221522151a69040e0e0c00085029352a362b3722163c1a5f040c000322163c1a56040e0e0e0c000304030022112c2c2c221a221a1a49040e0e0c00075029352a362b37312c69312c69312c69221d2c452b462a4727130fd02a291a03040202c6030c00021a010402024a010e0e0c0002033129352a362a353d1ad4030e0c000303112a37293b1ac7030202dc000c00036402013b03033c0207292503511e443b6502013b64036d3b220c69293b693b220f69293b69040300312d2c3b2d221322131aac030e0c00085029352a362b3722143c1aa3030c000322143c1a9a030e0e0e0c0003040300220f2c2c2c221822181a8d030e0e0c00075029352a362b37312c69312c69312c69221b2c452b462a4727110252220c3c1a5e030e0e0e0c0003220c3c1a520302023c000e0e0e0c0003040300302c2c2c221022101a42030e0e0e0c00075029352a362b373b2213693f2a69292d693b221569292e69221531452c462a47270b650249333c1a0a030e0e0e0c0003333c1aff020c00030403002e2c2c2c220e220e1af6020e0e0e0c00075029352a362b373b2211693f2a69292d693b221369292e69221331452c462a47270b650fcb2a353d1a95020e0e0c000307d42a362b37293b1a85020e0e0c000307d62a353b2a293b1a75020e0e0c000303032a0279293c1a9e020e0e0e0c00032a3c1a93020c00032b3c1a8b020c000330360402002b28082b1a84020e0c00045029352a362c2b1a7e020e0e0e0c00033c2b1a7b020c00032a2a1a7b020c0003293b1a1b020c0003641a2c020e0c0002293c1a0b020c0003030631220c690201342934250d250d260b1e833b270b65220c3c1a13020c00032d353b3b292c1a3f020c000303032a027c293c1a3a020202a4010e0e0e0c000331360402002c28082b1afc01020245010e0c00045029352a362c2b1af2010202e8000e0e0e0c00033c2b1aeb010c00032a2a1aeb010c0003293b1a8b010c0003641a9c010e0c0002293b1a7b010c0003030332020b323c1a96010e0e0e0c00032932250b250b26091e843b270965220e2a1a7c010e0c0003040300322e2c2c221222121a72010e0e0e0c00075029352a362b3722113b1a9f010c000322123b1a96010e0e0e0c0003293c1a43010c000322143b2b1a89010e0e0c0004501a8801221769220f2a1a87010c00033c3b2f2c6b220e221b1a80010e0c00032a3369323b1ae4000e0c000303032a020b2a331a6e010e0e0e0c00033d3269293469221d2d452c462a4727150248333c1ae1000e0e0c0003333c1ad7000c00030403002e2c2c2c220e220e1ace000e0e0e0c00075029352a362b373b2211693f2a69292d693b221369292e69221331452c462a47270b650249313c1a96000e0e0e0c0003313c1a8b000c00030403002c2c2c2c220c220c1a82000e0e0e0c00075029352a362b373b220f693f2a69292d693b221169292e69221131452c462a47270b651f060e0e0e0e0e0e0e0000000000000000c8040000000000000000000000000000|@3945,I251,@3597,I105,I218,@3946,I106,@3942,I240,I104,I252,I245,I243,I247,I239,I253,I255,@3991,@3912,@3993,@3944| 3944:O1|@3995 3945:S58|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e283329 3946:O1|@3947 3947:D26,560|0086311a32020e0e0e0c00021a31020e0e0c000203043b5002041a2b02103135293b692e3b1a28020e0c00032f3b1a1f020c0003293c1a1f020c0003313b2b1a1e020e0e0e0c0004502c220d220c33301a15020e0e0c00063c3b2e2c6b2e3b1a0e021a13020c00042f3b2a1aca010e0e0e0c00021ac9010e0e0c000207d02a352b362a3b2a1ab0010e0c00021ab1010e0e0c000203cc2a352b362a353d1ae0010e0c0003030d2a37293b1ad3010c00036402013b03912a3629353b3b292c1ac7010c000303032a0270293c1ac2010e0e0e0c00032d360402002c28082b1ab8010e0c00045029352a362c2b1ab2010e0e0e0c00033c2b1aaf010c00032a2a1aaf010c0003293b1a77010c0003641a30010e0c0002293b1a67010c0003030332020b323c1a32010e0e0e0c00032932250b250b26091e783b270965292f1a19010e0e0c000366020d2b3c1a0c0102022c000e0c00032a2a2505250526031ed83b66020129652c2a1aef000c00032b2a250625062604200a013b270402012965220e1ab5000e0e0c00021ab5000e0e0c00022a2a1ac3000c000322101a9b000c00021a9d000e0e0c000203322210352a3c1a06010e0e0e0c0003293b1a03010c000303041a0301103b503b2a693f2a69302d2b1afc000e0c0004270402012c220e1af6001afb000c00032b1afc001a01010e0e0c00032b2b1aff0022172d3b3b3c680828072a693d220e69221534452b462a4727111f070e0e0e000000000000000020020000000000000000000000000000|@3949,I105,I218,@1712,I253,I106,I255,@3950,@1109,@3978,I251,I247,I239,I104,I252,I245,I243,I107,I234,@3576,@3986,@3988,@122,@3948,@1385,@578| 3948:O1|@3989 3949:S73|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429 3950:O1|@3951 3951:D27,616|00842f1a6a020e0e0e0c00021a69020e0e0c000207d72f3530363b2b291a50020e0c00021a51020e0e0c0002031729362b3c1a4b020c0003292b25042504511e233b6502012a652a3b1a3c020e0c00030314301a1a020e0e0e0c00021a19020e0e0c000202013b301a25021a2a020e0e0e0c00032b1a28021a2d020e0e0c00033b220c291ae9010e0e0c00021ae9010e0e0c0002031729362b3c1ae3010c0003292b25042504511e243b6502012a65291afd011af2010e0e0e0c00032e1af8011ae5010e0e0c0003293b1abb010c000303032a020b2a2a1ae6010e0e0e0c0003312a2210221022101add01020219000e0e0c000629303b2213323b220d3c680828072a69270c0fdd2e1a64010e0c00021a65010e0e0c000203043b5002041aaf01102e362c2a1aaf010c00032f1a40010e0c00021a41010e0e0c000207cc2f3529353b3b292c1a97010c000303032a0270293c1a92010e0e0e0c00032d360402002c28082b1a88010e0c00045029352a362c2b1a82010e0e0e0c00033c2b1a7f010c00032a2a1a7f010c0003293b1af7000c0003641ae0000e0c0002293b1ae7000c0003030332020b323c1ad2000e0e0e0c00032932250b250b26091e783b270965331aaa000e0e0e0c00021aa9000e0e0c000203043b5002041a33011033353f2a69020263002e1a2d010e0e0c00023e2a2c3c6b3b1a27013b302d6805293b69311a23011a2801020219000e0c00032a3b1a73000c00030303290204402b2b6a270a0224301a47000c00021a49000e0e0c000203043b5002041afb001030353f2a693e2c2b3c6b65651f050e0e0e0e000000000000000058020000000000000000000000000000|@3953,I105,I218,I106,I251,@3954,@122,@3955,@1385,@3958,@3902,@3960,@3950,@1715,@3962,I247,I239,I104,I252,I245,I243,@1712,@3975,@578,@3952,@3912,@1712| 3952:O1|@3977 3953:S85|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229 3954:S2|2d50 3955:O1|@3956 3956:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@3957,@809| 3957:S88|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229283129 3958:O1|@3959 3959:D1,32|00803c2c69420e0e000000000000000010000000000000000000000000000000|@3957| 3960:O1|@3961 3961:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3960| 3962:O1|@3963 3963:D5,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203162c352d362a2e1a41002c1a4500310e0e0e7b060600053b430e0e000000000000000038000000000000000000000000000000|@3965,I105,I218,@3962,@3964| 3964:O1|@3966 3965:S95|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d617041726773283229 3966:D13,368|00832e1a72010e0e0e0c00021a71010e0e0c000207d02e352f362a353d1a68010e0c000303242a37293b1a5b010c00030314301a42010e0e0e0c00021a41010e0e0c000202013b6402013b03c72a36303531362b353b2a293b1a2c010e0c000303032a0279293c1a26010e0e0e0c00032a3c1a1b010c00032b3c1a13010c000331360402002b28082b1a0c010e0c00045029352a362c2b1a06010e0e0e0c00033c2b1a03010c00032a2a1a03010c0003293b1ad3000c0003641ac4000e0c0002293c1ac3000c0003030631220c690201342934250d250d260b1e823b270b65292d1ad400020264000e0c00032f2d220d220d1acb000c0005293b1a8b000c000303032a020b2a2a1abe00220d7e0f0003270702352f1a60000e0c00021a61000e0e0c000203043b5002041aa300102f3530363f2b69293c692d2c34341a81000e0e0c00052a2a6927056502082b2e2e2d7e0600031f040e0e000000000000000060010000000000000000000000000000|@3968,I105,I218,I251,I240,I104,I252,I245,I243,@3969,@3964,@3971,@3967| 3967:O4|@14322,@596,@3974,@3973 3968:S104|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d6170417267732832296d6170417267283229 3969:O1|@3970 3970:D4,88|00812c1a5a000e0e0e0c00021a59000e0e0c000203212c352d363f2e6928062a2d3b6b293c692c311a45000e0e0c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3969| 3971:O1|@3972 3972:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3971| 3973:O5|@3704,713,0,713,0 3974:S17|6d6170417267733a206d69736d61746368 3975:O1|@3976 3976:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3975,@3928| 3977:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@3957,@3930| 3978:O1|@3979 3979:D13,320|00822d3b1a41010e0e0c000303032b0fd02d352e362e2b1a36010e0e0e0c00032b3b2a1a32010e0e0e0c00021a31010e0e0c000203cc2a352b362a353d1a08010e0c0003030d2a37293b1afb000c00036402013b03952a3629353b3b292c1a07010c000303032a0270293c1a02010e0e0e0c00032d360402002c28082b1af8000e0c00045029352a362c2b1af2000e0e0e0c00033c2b1aef000c00032a2a1aef000c0003293b1a9f000c0003641ab0000e0c0002293b1a8f000c0003030332020b323c1ad2000e0e0e0c00032932250b250b26091e783b270965292f1ab90002023d000e0e0c00036602092b3c1aa8000e0c00032a2a2505250526031eda3b6602012965302a1a8f000c00033e2c323c6b2d2b2b1a8900340e0e0e7b050b0004440e0e0e0e0e0e0e000000000000000030010000000000000000000000000000|@3981,I251,@3980,I105,I218,I247,I239,I104,I252,I245,I243,I106,@3978| 3980:O1|@3982 3981:S86|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c79283329 3982:D16,320|00812b1a42010e0e0e0c00021a41010e0e0c000207d82b352c362a353d1a38010e0c0003030d2a37293b1a2b010c00036402013b03b12a361a250130692a2a1a26010e0e0e0c0003293c692c353b3b292c1a1c010e0c000303032a0270293c1a16010e0e0e0c000330360402002c28082b1a0c010e0c00045029352a362c2b1a06010e0e0e0c00033c2b1a03010c00032a2a1a03010c0003293b1abb000c0003641aac000e0c0002293b1aab000c0003030332020b323c1ae6000e0e0e0c00032932250b250b26091e793b270965342a1acd000e0e0c000329311acb000c00032d2a69270802362e3b1ac400020230000e0c000303041abf00103b503b2f693f2a69293c69313c1a96000e0e0e0c0003292e1a93000c00032b2a6927056502013b430e0e0e0e0e0e000000000000000030010000000000000000000000000000|@3984,I105,I218,I251,@3983,@3912,I247,I239,I104,I252,I245,I243,I106,@3980,I234,@3576| 3983:D4,64|00802b56171a40000e0c0003293b1a3f000c000303041a3f00103b503b2a693f2a6965420e0e0e0e000000000000000030000000000000000000000000000000|@3985,I106,I234,@3576| 3984:S97|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229 3985:S100|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229283129 3986:O1|@3987 3987:D3,184|00822d3528051ab7000c000303232d362e372a2f2f1ab0000e0c00042a30301aa6000e0e0e0c000428052b2b6a2704026a2d35280b1a88000e0c000303032d025a2d35401a79000e0e0c000303152d362e37292f2f1a70000e0c0004402c2b6a6602382d353c1a57000c000303272d362e372f382a30301a4e000e0e0e0c00042a31311a42000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e0000000000000000a8000000000000000000000000000000|@3667,I251,@3986| 3988:S2|2d45 3989:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@3990,@809| 3990:S84|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429746869734172672d283129 3991:D4,64|008056072c1a40000e0c0003293b1a3f000c000303041a3f00103b503b2a693f2a6965420e0e0e0e000000000000000030000000000000000000000000000000|@3992,I106,I234,@3576| 3992:S67|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e2833297475706c652d283129 3993:O1|@3994 3994:D6,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203312c352d362d3b1a61000e0e0c000303041a5f00103b503b2e693f2a6928062a2e3b6b2c311a53000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I234,@3576,@3993| 3995:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3944| 3996:D8,160|00802b353f1aa0000e0c000303732b3629353e1a92000e0e0e0c0003030a3f56276929680164025629353b1a7a000e0e0e0c000303472936291a74000e0c00021a75000e0e0c000203033c021456281a6e000e0e0e0c00022a2a1a6b000c00036403041a6a00103b5056282a1a69000e0e0c00033f2a692968016602013b6402013b420e0e0e0e0e000000000000000090000000000000000000000000000000|@3997,I251,I105,I218,I15,I247,@599,I253| 3997:S53|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329646f4d6170283129 3998:D9,224|00802b3528071adf000c000303332b3629352a362b372c382d392e3a2f23063023072d56a71ac8000e0c00033131312c31313131680828072a69296801270c02812b353f1aa1000e0e0c000303732b3629353e1a92000e0e0e0c0003030a3f56286929680164025629353b1a7a000e0e0e0c000303472936291a7c000e0c00021a7d000e0e0c000203033c021456291a76000e0e0e0c00022a2a1a73000c00036403041a7200103b5056292a1a71000e0e0c00033f2a692968016602013b6402013b420e0e0e0e0e0000000000000000d0000000000000000000000000000000|@3817,I251,@3999,I105,I218,I15,I247,@599,I253| 3999:O1|@4000 4000:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d363f2b69292f1a66000e0e0e0c000329353f1a62000e0e0e0c000303043b5002041a5b001029362c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@3315,I251,@3819,@3999| 4001:O1|@4002 4002:D17,320|00812c3b1a41010e0e0c000303172b3b1a35010e0e0c000303043b5002041a2f01103b0fd62c352d362d1a2b010c00021a2d010e0e0c000203043b5002041a2701102d352e362b2a1a25010e0e0c00032d353d1af2000e0e0e0c0003030d2d37293b1ae3000c00036402013b03ae2d3629353b3b292c1aff000c000303032a0270293c1afa000e0e0e0c00032d360402002c28082b1af0000e0c00045029352a362c2b1aea000e0e0e0c00033c2b1ae7000c00032a2a1ae7000c0003293b1a87000c0003641a98000e0c0002293b1a77000c0003030332020b323c1aca000e0e0e0c00032932250b250b26091e783b270965291aba001abf00020224000c00032d3b1a43000c0003030329020b292e1aae00220d7e0d0003270402032b2a692705430e0e0e0e0e0e000000000000000030010000000000000000000000000000|@4004,I251,@4005,I105,I218,@4005,@4001,I247,I239,I104,I252,I245,I243,I106,@4007,@1385,@4003| 4003:O1|@4010 4004:S21|4c697374506169722e666f6c647245712834292829 4005:O4|@14383,@2706,0,@4006 4006:O5|@2707,89,0,89,0 4007:O1|@4008 4008:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@4009,@474| 4009:S57|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329657870616e64283329283129 4010:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4003| 4011:O1|@4012 4012:D7,120|00812c3b1a79000e0e0c000303172b3b1a6d000e0e0c000303043b5002041a6700103b02342c352d362d1a63000c00021a65000e0e0c000203043b5002041a5f00102d352e362a352d2a692d2c1a58000e0c00032a2a692707430e0e0e0e0e0e000000000000000068000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@4011| 4013:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@3940| 4014:O1|@4015 4015:D6,96|00853c28403b1a5f000c0004521a60004521061a620045292c46334730482f492b4a6c502a2a466c50332b1a52000e0e0e0c00032c3b1a4f000c0003322b4534462a4727051f060e000000000000000050000000000000000000000000000000|@4017,I11,@4018,@4016,@3315,I253| 4016:D14,576|008156073b1a40020e0c000356173b3b1a3d020e0e0c0004502d562b1a39020e0e0c000356273b1a1e020e0e0e0c00032b031156373b3c1a16020e0e0e0c0004503b02013b2a03033c0fdd30291a10020e0c00021a11020e0e0c0002032229352a362a37293a293b1a05020e0e0c00036503033c0207292503511e2e3b6502013b6403033c02a530291ad4010e0c00021ad5010e0e0c0002039029352a362a37293829291ab9010e0e0c00021ab9010e0e0c0002036129352a362a353d1ab0010e0c000303412a362210291a92010e0e0e0c00021a91010e0e0c0002031e29352a362a36292e1a8f010c00036403033c0207292503511e2c3b6502013b641a67010c00026402013c03033c0207292503511e6e3b6502013b6603033c0207292503511e9a3b65020302003b6403072f2c453b460fd12b1a47010c00023e2d69293b69280e2c3b6a2c291a14010e0c00021a15010e0e0c0002031d29352a362a353d1a0c010e0c00030309292503511e263b02013b6502013c64030b291a09010e0e0c0002020129402c2b6a313b2a1acf000c00021ad1000e0e0c000203232a352b362a36292d1ae7000c000303032902012c2b2a2506250626041e2d3b270402012965293c1ad0000e0c00030402002c2b56f82c12120001000300121300010004001abb000c00075029352a363b2b0e0e0c00023d2a2c6a121200010001003b3c1a4c00020218000e0c000450220f3b2b1a94000e0c000422143b452a46270e2704430e0e0e0e0e000000000000000030020000000000000000000000000000|@4038,I253,I255,@4039,I105,I218,I251,I113,@4041,@2349,I233,I106,@4043,@4037| 4017:S53|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e283329 4018:D8,296|00802b35401a28010e0c000303212b362c372a2c56471a1f010c00042a2d1a1f010c0003402b2b6a29680127050fdd2b3528071afa000e0e0e0c000303cc2b362938293b1ae9000e0e0c0003030d2a3a293c1adb000c00036402013b6403a73b3b2b6a293b690402002a2a56670c00035029352a362a3b1ab6000e0e0e0c0003034b291ac2000e0e0e0c00021ac1000e0e0c0002032029352a362a353c1a90000e0c0003030c293b1a85000e0e0c000302013b6502013b03043b5002041a9800103b50293529382968016502352a352b36293b1a5a000e0e0e0c0003030c2b3b1a4d000e0e0c000302013b03043b5002041a6c00103b502a3728072a692968012704270502013b640205020201003b42000000000000000018010000000000000000000000000000|@4020,I251,@4021,@3315,I105,I218,@4019,@4019| 4019:O4|@14322,@596,@4036,@4035 4020:S65|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129 4021:O1|@4022 4022:D5,80|00822d1a52000e0e0e0c00021a51000e0e0c0002031e2d352e36292f2f1a48000e0c00042b2a31311a4500320e0e0e7b060800053b440e0e000000000000000040000000000000000000000000000000|@1746,I105,I218,@4021,@4023| 4023:O1|@4024 4024:D9,400|00832e353b1a90010e0c000303202e362f373038313929311a85010e0e0c00033b2e2e2e2d680529346927060fd42e353d1a64010e0c000303132e36292e1a5f010c00033d2a69293169660fca2e353e1a45010e0e0c0003036a2e360402002a2a2f0e0e0e0c00035029352a362a1a37010c00021a39010e0e0c00021a31010e0e0c000203033b02073e2b69293b6964323b1a03010c0003030329020b29331a16010e0e0e0c0003293b1aeb000c000303032b020b2b2a1a0601330e7e0c0003270602b22e362f373038293528071ac7000c0003038e29362c2c2b6a293b690402002a2a340c00035029352a362a3b1aa6000e0e0e0c00030328220d3b1a9800020272000e0c0003030329021329220e1ab500220d02025d000e0e0e7e0f0003023e2a352b36293b1a6d000e0e0c0003030c2b3b1a61000e0e0c000302013b03043b5002041a8800103b502a352b362c3728072a693c2d2d2c6b2922156927072706021129301a37000c00033c2d2d2c6b29336965661f04000000000000000080010000000000000000000000000000|@4026,I251,@3315,I105,I218,@4027,@4029,@4031,@4025| 4025:O4|@14322,@596,@4034,@4033 4026:S81|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129636865636b42696e64696e6773283229 4027:O1|@4028 4028:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4027| 4029:O1|@4030 4030:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4029| 4031:O1|@4032 4032:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4031| 4033:O5|@3704,1424,0,1424,0 4034:S13|636865636b42696e64696e6773 4035:O5|@3704,1411,0,1411,0 4036:S14|70726f636573734c616d62646173 4037:O1|@5217 4038:S70|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129 4039:O1|@4040 4040:D5,128|00812c1a82000e0e0e0c00021a81000e0e0c000203492c352d362a352b362c3729352a362b372c382d392e3a2f23063023073022101a60000e0c000329313131313131316808220c220c2b6a220e22131a4d000e0e0c00032a2a69271102013b430e0e0e0e0e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@3315,@4039| 4041:O1|@4042 4042:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a363d2a693f2a692c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4041| 4043:O1|@4044 4044:D18,224|00852f3b1ae1000e0e0c000303033c020b2f1adb001ae0000e0c000303041adf00103b503b502f3c1add000e0e0c00032928403b1ad9000e0e0c0004293b331ad6000e0e0e0c0004501ad4002a691ad7002b691ada00332c2c34346806220c2a1ad5000e0e0c00030402002a1ad1001ace0022101ad1000e0e0c0005291ac0001abd0022112211221022101ac2000e0e0e0c000829221022102e221022101ab7000c0007502b352c362212331ab1000e0e0c0003292b1aaf000c000322112d452a46270d1f060e0e0000000000000000d0000000000000000000000000000000|@4046,I234,72057594037927934,I231,@1603,I106,I11,I255,@4047,@4053,@4055,@3315,@5197,@4104,@4126,@4176,@5199,@4045| 4045:O2|@5204,@14320 4046:S53|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329 4047:D10,152|00802b353d1a98000e0c000303043b5002041a9300102b36293b1a93000c000303033c021456173b1a8d000e0e0c00032a2a1a8b000c00036403041a8a00103b50293c1a8a000e0e0e0c000356272a1a66000e0e0e0c0003291a7c000e0c00021a7d000e0e0c0002030d293529352a363b2b2b6a6602033c2f6966420e0e0e0e000000000000000088000000000000000000000000000000|@4049,I251,@4048,I234,I253,I231,@1586,I106,I105,I218| 4048:O4|@14322,@596,@4051,@4050 4049:S66|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296c6f6f6b757041646472283129 4050:O5|@4052,246,0,246,0 4051:S33|6c6f6f6b7570436f6e7374616e743a20746f702d6c6576656c2072656163686564 4052:S68|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e532e736d6c 4053:D7,104|00802b352c362968012b3b1a62000e0e0e0c000303033c021456373b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356472a2c1a5100320e0e0e7b05070004000000000000000058000000000000000000000000000000|@4054,I234,I253,I231,@1614,I106,I255| 4054:S64|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329636f6e746578742d283129 4055:D2,48|00802b561756285639564a565b1a2800310e0e7b08030007000000000000000020000000000000000000000000000000|@4057,@4056| 4056:O1|@4058 4057:S50|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283129283129 4058:D26,696|00853035280e1ab7020c000303cc303631372903611ab0021ab502333333333368072b2a1ab1020e0e0c0003280e2a3c6a2a291aaa020e0e0e0c00021aa9020e0e0c0002031d29352a362a353d1a70020e0c00030309292503511e283b02013b6502013c64030b291a85020e0e0c000202012966025e1a7f021a5402333333333368072b2a1a78020e0c0003280e2a3b6a2a291a4a020e0e0e0c00021a49020e0e0c0002031d29352a362a353d1a10020e0c00030309292503511e283b02013b6502013c64030b291a25020e0e0c000202012966296801660fca3035401ae0010e0c00030359303631372a1a1a020e0e0e0c0002291ad8013131220d220d220d1a0d020e0e0c00081a0d021ac201220c220c220c220c220c68072c2a1a01020e0e0c00032b3b1a97010c000303052968010208402c2b6a2968016427060fdc303528071a7a010e0e0e0c000307dc303629352a362b372c382d392e3a2f23063023072a3b1ac1010e0e0c000303033c020b2a1abb011ac0010e0c000303041abf01103b503b502a3c1abd010e0e0c00032928403b1ab9010e0e0c0004293b2e1ab6010202f7000e0e0e0c0004503c28403b1a9c010e0c00041aa5012a2213332e68051aa3012c691aa6011a030122162d2d221622166807220d2a1a43010c00032d3b1a93010c0003293b2a1af2000e0e0e0c00021af1000e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652b02028000221022102c221022102210020231002210680828072a692b3b1a87000c0003031829220d221c221a221a1a36010e0e0e0c00062968016402032968012714024030353f1a5d000e0e0c00030332303629300e0e0e0c000229353b1a46000e0e0e0c0003030e29362a373d2b2b6a29680166020929363f2a69296801656502013b1f060e0000000000000000a8020000000000000000000000000000|@4060,I251,@4061,@4056,@4062,I105,I218,@2349,@4064,@4065,@4067,@4071,@4088,@3315,I234,72057594037927934,I231,@1603,I106,I11,I255,@4089,@4091,@4093,I253,@4059| 4059:O1|@4094 4060:S47|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429 4061:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4062:O1|@4063 4063:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3315,@4062| 4064:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4065:O1|@4066 4066:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@3315,@4065| 4067:O1|@4068 4068:D7,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203322b352c36291a62000e0e0e0c00022b1a60000e0c00022a3b1a5f000c0003030329020b292b1a5a00310e7e070003270402013b420e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1746,I105,I218,@4067,@3593,I251,@4069| 4069:O1|@4070 4070:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4069| 4071:O1|@4072 4072:D18,936|0086313b1aa9030e0e0c000303033b0fce313532362a353b1a95030e0e0c000303452a362b372c382d391a8b03220e220c220c220c2211221168072a2a1a80030e0c00033b2f2f2f2d6805302211221122112211221122111a6d030e0e0c00082a2a6927080fd42a353e1a43030c000307cb2a362b36291a56030e0e0e0c00021a55030e0e0c0002030d2936293b1a1f030c00036402013b64032d2b36293529352a362b3728072a693c2d2d2c6b293269652210221022102210221022101a070322117b09110008293434343434341a0e030e0e0e0c000829291af3020202a9020c00021af1020e0e0c0002038b29352a362a37293829291ad5020e0e0c00021ad5020e0e0c0002035e29352a362a353d1a9c020e0c0003033e2a3632291aaf020c00021ab1020e0e0c0002032629352a362a362d2a1aaf0202044c0294010e0e0c00036403033c0207292503511e313b6502013b6502013b0309292503511e683b02013b6502013c660309292503511e973b02013b6502013c642907ce2a1a6e020e0e0e0c00023e2c69293b69280e2c3b6a2c291a38020e0c00021a39020e0e0c0002031d29352a362a353d1a00020e0c00030309292503511e263b02013b6502013c64030b291a2d020e0e0c0002020129402c2b6a303b2a1af3010c00021af5010e0e0c000203232a352b362a36292d1a0b020c000303032902012c2b2a2506250626041e2d3b270402012965293c1af4010e0c00032b2a2213221622161aed010e0e0c0006333b2a1aa2010e0e0e0c00021aa1010e0e0c000203592a352b362a362e2d3b1ace01020266000e0e0e0c000429353d1a56010e0e0e0c000303043b5002041ab701103b5029362a372a2a692d2a69221a0e0c000250303c1a86010e0e0e0c00032f2a250a250a26081e663b270802012965220d2217221722172217221722171a1e0122180e0e0e7b091800083e2b692d220e220e220e220e220e220e1a01010e0e0c00082a2a69270502b62a353d1ad7000c000303392a361a450134323232220e220e68072a2a1ace000e0e0e0c00033d2a692d220e220e220e220e220e220e1abd000e0e0c00082a2a69270502722a362b372c381a1001220d3434342210221068072a2a1a90000e0c000329353d1a76000e0e0e0c0003032a29362a372a2a692f2a69220d0e0e0e0c000250312212221222122212221222121a630022137b091300083c2e2e2c6b2f2210221022102210221022101a47000c00082a2a692707651f070e0e0e0e000000000000000098030000000000000000000000000000|@4074,I251,@4075,@3315,@4071,I105,I218,@4076,I113,@4082,@2349,I233,I106,@4059,@2288,@4084,@4087,@4073| 4073:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4074:S65|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e7328342970726f6365737342696e64696e6773283129 4075:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4076:O1|@4077 4077:D8,152|0086311a9a000e0e0e0c00021a99000e0e0c00020361313532362a352b362c371a8d00220d34343422102210680728072b69292b1a81000e0e0c0003293528071a7d000e0e0c000303043b5002041a7700103b5029362f2f2b6a312212221222122212221222121a66000e0e0e0c00082a2a69270b02013b1f070e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,@4079,@3315,I251,@4078,@4076| 4078:O4|@14322,@596,@4081,@4080 4079:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4080:O5|@4052,174,0,174,0 4081:S24|70726f63657373456e7472793a206e6f74206c616d626461 4082:O1|@4083 4083:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a363d2a693f2a692c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4082| 4084:O4|@14322,@596,@4086,@4085 4085:O5|@4052,205,0,205,0 4086:S14|4e6f74206120636f6e7374616e74 4087:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4088:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4089:D13,280|00802b353c1a18010e0c000303752b3656192a2a1a11010e0e0c00021a11010e0e0c000203043b5002041a0b01103b502a352b362b3b1a07010c000303032a02172b3c1a02010e0e0e0c00032a2a2505250526031e413b64270456280e0c000229353b1aba000e0e0e0c0003030329020f29362956471ad7000c00033c2a69656502752b353d1a97000c000303672b36293b1ac3000c000303033c0214561a3b1abd000e0e0c00032a2a1abb000c00036403041aba00103b503b50293c1ab8000e0c0003562a2a1a96000e0e0e0c0003291a54000e0c00021a55000e0e0c0002030d293529352a363b2b2b6a6602033c2f696602033c2c69420e0e0e0e0e0e0e000000000000000008010000000000000000000000000000|@4090,I251,I105,I218,@611,I113,I107,@2323,I234,I253,I231,@1586,I106| 4090:S61|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e732834296c6f6f6b75704c6f63616c283129 4091:D7,104|00802b352c362968012b3b1a62000e0e0e0c000303033c021456373b1a59000e0e0c00032c2a1a57000c00036403041a5600103b502b3c1a56000e0e0e0c000356472a2c1a5100320e0e0e7b05070004000000000000000058000000000000000000000000000000|@4092,I234,I253,I231,@1614,I106,I255| 4092:S58|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429636f6e746578742d283129 4093:D1,48|00802b56185629563a564b565c5667310e0e0e7b08030007000000000000000020000000000000000000000000000000|@4057| 4094:D15,480|00842d291ae1010e0e0c00021ae1010e0e0c0002032429352a362a35291ad8011add010e0e0c00036403052a68010207292503511e313b6502013b64293b1abf010c0003036b1abf01291a9b010c00021a9d010e0e0c0002032429352a362a35291a94011a99010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a7b010c000303041a8301103b503b50293529351a5f011a64010e0c000303043b5002041a6f01103b50293765021e293529351a40011a45010e0e0c000303043b5002041a4f01103b502937646403822d291a11010e0e0c00021a11010e0e0c0002032429352a362a35291a30011a0d010e0e0c00036403052a68010207292503511e313b6502013b64293b1aef000c0003030e301a0e010e0e0e0c00023b64022d293529351af5001ad2000e0e0e0c000303043b5002041adb00103b502937321ae2000e0e0e0c00022a0c0002656402013b040200311ad4001ad100331ad5000e0e0c0005291ac4001ac100343434341aca000e0e0e0c00082933332e34341ac3000c0007502b352c367881123b2d0e0e0e0c00023d2a2e6a6405240e0e0e00ff6d29353c1a55000e0e0c000303041a9b00103b503b503d2a3b6a280b2a696527061f050e0000000000000000d0010000000000000000000000000000|@4096,I105,I218,@14397,I251,@2781,@2836,@1576,@14408,@2843,@4097,@4104,@4126,@4176,@4095| 4095:O4|1,@5196,0,@5195 4096:S63|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465546f436f6e7374616e74283329 4097:O1|@4098 4098:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@4100,@4099| 4099:O4|@14322,@596,@4102,@4101 4100:S49|434f4445545245455f4c414d4244415f4c49465428292e636f646547656e6572617465283329746f706c6576656c283129 4101:O5|@4103,473,0,473,0 4102:S17|546f70206c6576656c2072656163686564 4103:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4c414d4244415f4c4946542e736d6c 4104:O1|@4105 4105:D12,136|00832b3b1a89000e0e0c000303033c023c2b3b1a82000e0e0e0c000303033c020b2b1a7b001a80000e0c000303041a7f00103b502b283f1a7e000e0e0e0c00032928401a7a000e0e0e0c0003642928413b1a74000e0c00041a75003030302d1a76006806312a1a7700300e0e7e090003000000000000000078000000000000000000000000000000|@4107,I113,I234,@3652,I233,@3654,I106,I109,I11,@4106,@4104,@3315| 4106:D18,440|00802b35401ab8010e0c0003032d2b362c37292c1ab1010e0e0c00032b2d565756685679568a569b1aa5010e0e0c0008402a2c6a29680127050fcb2b3528071a7e010e0e0e0c0003035d2b3629352a362b382c392d23062e23073c28403b1a77010c00041a79012a691a7c0156a756b856ca56d9336806312a2c3056eb0c00052c3b1a6b010c000303051a6b0102013b2a332b34343c220c220c680828072a69296801270e0fca2b353e1a13010c0003032d2b362c372d382a353f1a02010e0e0e0c000303152b2d1a35010e0e0c00033e2a2d2d6b2968016502013b6602be2b353f1adb000c000303b22b3629353b1ace000e0e0e0c000303043b50029829353c1abc00020295000e0c0003030d29362956370e0e0c000251027b29353e1a9f000c000303093b56280c00025002672936293b1ad2000e0e0e0c000303033c020b2956391ac9000e0e0c000303041ac700103b500402002a28082b1ac2000e0e0e0c00045029352a36565a2b1ab90002022a000e0e0c00033c2b1ab3000c00032a2a1ab3000c0003568a2e2b1ab1000e0e0c000426082c68016402013b420e0e0000000000000000a8010000000000000000000000000000|@4109,I251,@3315,@4110,I11,@4123,@4124,I253,@578,@4108,I234,I231,@3663,I104,I252,I245,I242,I254| 4107:S35|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429 4108:O1|@4125 4109:S47|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f6465283129 4110:O1|@4111 4111:D16,408|0086311a9a010e0e0e0c00021a99010e0e0c000207ce313532362a353b1a90010e0c000303342a372b382c392c220d220d220d220d220d220d1a7c010e0c00082a220e1a7a010e0e0e0c00033b3b2f2f2d6805292c6927060fca2a353d1a50010e0c000303282a362a3434343434341a46010e0e0e0c00082a220c1a42010e0e0e0c00033d2a69292c6927040fcc2a353e1a1c010e0c000303342a362a3434343434341a12010e0e0e0c00082a34343434341a13010c00072933331a12010e0e0e0c00043e2a69292d69270502a62a372b382b220c220c220c220c220c220c1ad600020291000e0e0e0c00082a220d1ace000e0e0e0c00032c3b1adb000c000303033c020b2c341ad6000e0e0e0c000303041ad300103b500402002d28082b1ace0002024e000e0e0e0c00045029352a36220c2b1ac1000e0e0c00033c2b1abf000c00032a2a1abf000c0003293b1a5f000c0003641a5000020218000e0c0002270503051aa90002013b3c2a2f2d6b292d6927066502013b1f070e0e0e0e0e0e000000000000000088010000000000000000000000000000|@4113,I105,I218,I251,@4110,@3315,@4114,@4120,I234,I231,@4112,I104,I252,I245,I243,@578| 4112:O4|11,@49,0,@4122 4113:S61|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f646528312970726f6365737344656373283129 4114:O1|@4115 4115:D9,176|0085301ab2000e0e0e0c00021ab1000e0e0c00020379303531362a362b3729352a362b382c392d23062e23073c28403b1a95000e0e0c00041a95002a691a98002213221322122214336806312a2c3022130c00052c3b1a87000c000303051a870002013b2a332b34343c220c220c68083b220e2b6a220f221822182218221822181a6c000e0c00072a2a69271202013b1f060e0e0e0e0e0e0000000000000000a0000000000000000000000000000000|@1399,I105,I218,I11,@4117,@4116,I253,@578,@4114| 4116:D15,264|0080560b2c2a1a07010c00021a09010e0e0c000203043b5002041a0301102a352b362b3b1a01010e0e0c000303032a02172b3c1afa000e0e0e0c00032a2a2505250526031e3f3b64270429353b1ae8000e0c000303033b029329353c1ad9000e0e0c0003030a29362956372e7d05000229353e1ac2000e0e0e0c0003030a3b56282d0e0e7d0400022936293b1ab1000e0e0c000303033c020b29563a1aa9000e0e0c000303041aa700103b500402002a28082b1aa2000e0e0e0c00045029352a3656592b1a99000e0e0c00033c2b1a97000c00032a2a1a97000c000356892e2b1a9500220d0e0e7b050b000464420e0e0000000000000000f8000000000000000000000000000000|@4119,I105,I218,@611,I113,I107,I251,I234,I231,@3663,I104,I252,I245,I242,I254| 4117:D2,40|008056073b3c1a27000c0004503b420e000000000000000018000000000000000000000000000000|@4118,I255| 4118:S66|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f526563757273697665283129 4119:S64|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f436c6f73757265283129 4120:O1|@4121 4121:D13,192|00822d1ac2000e0e0e0c00021ac1000e0e0c000203892d352e362a362b372a3b1ab5000e0e0c000303033c020b2a311aae000e0e0e0c000303041aab00103b500402002b28082b1aa6000e0e0e0c00045029352a36322b1a9e000e0e0e0c00033c2b1a9b000c00032a2a1a9b000c0003293b1a9b000c0003641a54000e0c0002270503051a910002013b292c2c6a2d33331a8c000e0c00042a2a69270702013b440e0e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@1399,I105,I218,I234,I231,@4112,I104,I252,I245,I243,I251,@578,@4120| 4122:O5|@3644,411,0,411,0 4123:D2,40|008056073b3c1a27000c0004503b420e000000000000000018000000000000000000000000000000|@4118,I255| 4124:D15,264|0080560b2c2a1a07010c00021a09010e0e0c000203043b5002041a0301102a352b362b3b1a01010e0e0c000303032a02172b3c1afa000e0e0e0c00032a2a2505250526031e3f3b64270429353b1ae8000e0c000303033b029329353c1ad9000e0e0c0003030a29362956372e7d05000229353e1ac2000e0e0e0c0003030a3b56282d0e0e7d0400022936293b1ab1000e0e0c000303033c020b29563a1aa9000e0e0c000303041aa700103b500402002a28082b1aa2000e0e0e0c00045029352a3656592b1a99000e0e0c00033c2b1a97000c00032a2a1a97000c000356892e2b1a9500220d0e0e7b050b000464420e0e0000000000000000f8000000000000000000000000000000|@4119,I105,I218,@611,I113,I107,I251,I234,I231,@3663,I104,I252,I245,I242,I254| 4125:D5,88|00812c1a5a000e0e0e0c00021a59000e0e0c000203252c352d362a352b362a301a4d000e0e0c0003292b692d321a48000e0c00032a2a69270702013b430e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3315,@4108| 4126:O1|@4127 4127:D11,128|00862e3b1a81000e0e0c000303033c020b2e1a7b001a80000e0c000303041a7f00103b503b502e3c1a7d000e0e0c00032928403b1a79000e0e0c0004293b321a76000e0e0e0c0004501a740033332c1a76003333220d6808342a1a7300300e0e7e0c00030e0e0e0e000000000000000070000000000000000000000000000000|@4129,I234,72057594037927934,I231,@1603,I106,I11,I255,@4128,@4126,@3315| 4128:D17,568|00802b35401a38020e0c0003032d2b362c372a2c564756585669567a568b569c56ad1a23020c000a2a2d1a23020c0003402b2b6a29680127050fde2b3528071afe010e0e0e0c000303342b3629352a362b372c382d392e3a2f2306302307569756a856b956ca56db56ec56fd1ae9010e0e0c001028072a69296801660fd32b353f1abc010e0c0003034d2b360402002a2a5647565856691ac6010e0e0e0c00065029352a362a353c1a95010e0e0c0003030c293b1a89010e0e0c000302013b03043b5002041aa001103b502a363f2a6929680127060fd12b353e1a63010c000307c82b362c372d382a3528071a51010e0e0c000303932a362937293b1a41010e0e0c0003037f2a3b69293b6964566756785689569a56ab0202ff0056bc56cd1a4e010e0e0e0c0009291a4c010e0c00021a4d010e0e0c000203043b5002041a4701103b50293529352a3631331a41010202c7000e0e0c00032a1a3c010e0c0002293b1adb000c000303032a020b2a2a1a2e010e0e0e0c00033e2a2f220c6b296801270802013b65028d2a353f1ab1000e0e0c0003037f2a360402002a2a5677568856991aba00020470006d000e0c00065029352a360402002b353c1a82000e0e0e0c0003030e2b363f2a692b2a452d46260302082b362a2a452c465129352a3632341ac3000c00032a1ac4000e0c0002293b1a4b000c000303032a020b2a2a1ab6000e0e0e0c00033e2a2f220d6b296801270b02013b6602013b420e0e0e0e0e000000000000000028020000000000000000000000000000|@4131,I251,@4132,@3315,@5171,@4145,@5181,@4138,I105,I218,@1712,@5184,@5186,@5188,@5190,@5192,@4130| 4129:S37|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f6479283529 4130:O1|@5194 4131:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f6465283129 4132:O1|@4133 4133:D18,856|0088331a5a030e0e0e0c00021a59030e0e0c000207cf333534362a353b1a50030e0c000303392a372b382c3929220f1a46030e0e0e0c00033b3b2e2e2d68052e221122112211221122112211221122111a2d030e0e0c000a2a2a6927060fce2a353d1a0b030c000303312a3629220d1a06030e0e0e0c00033d2a692c220f220f220f220f220f220f220f220f1af1020e0e0c000a2a2a6927040fdd2a353e1acf020c000307db2a36293c2a1ab2020e0e0e0c00021ab1020e0e0c000203442a352b362a35293b1aa7020c000303242b372937293b1a99020e0e0c000303102e3c1a8d02020255020e0e0c000302013b6502013b2b2a2506250626041e513b27040201296507dd291a7e020e0e0e0c0002220c220c220c220c220c220c220c1a6f020c0009292b2a3b1a450202020a020e0e0c0003031a293b1a35020e0e0c000303043b5002041a4f02103b503b5002812a352b362b1a08020e0c00021a09020e0e0c000203043b5002041a3302103b502b352c362a360202bf012d68012a3b0202ac001a22020e0e0e0c000303033c021422123b1a19020e0e0c00032b2a1a17020c00036403041a1602103b503b502a3c1a14020e0c000322132a2c1a11020e0e0c0004502e2d2509250926071ea72607512b220e220e220e220e220e220e220e02020f00220e1a9601220f0e0e0e7b0b0f000a29220c220c220c220c220c220c220c1ad2010e0e0e0c00093e2a692c220f220f220f220f220f220f220f220f1a5d010e0e0c000a2a2a6927040fd62a362b372c382b3b1a36010e0e0e0c00030320293528071a27010c0003031129362937293b1a19010e0e0c00036502013b02013b03a729362b68012a2a69293b6965220f220f220f220f220f220f220f1a0e010e0e0e0c0009291ad4000e0c00021ad5000e0e0c000203043b5002041a3f01103b5029352968012e3b1afa000e0e0e0c000303033c0214220f3b1af1000e0e0c00032f2a1aef000c00036403041aee00103b503b502e3c1aec000e0c000322102a2c1ae9000e0e0c00045031221422142214221422142214221422141a7f002215020232007b0b15000a29220f1a66000e0e0e0c00033c3b2d2c6b2e221122112211221122112211221122111a4f000c000a2a2a6927066502013b1f090e000000000000000048030000000000000000000000000000|@4135,I105,I218,I251,@3315,@4132,@4136,@4138,@5168,@5168,I234,I253,I231,@1614,I106,I255,@4134,@1712| 4134:O1|@5170 4135:S65|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f646528312970726f6365737344656373283129 4136:O1|@4137 4137:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a362b372a68012a2a692d1a40000e0c00022a2a69270702013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4136| 4138:O1|@4139 4139:D20,616|00873c28403b1a67020c0004331a68020e0c000234291a67020c00021a69020e0e0c000203c529352a362a35293829291a4d020e0e0c00021a4d020e0e0c0002039a29352a362a353d1a44020e0c000303352a3632291a27020c00021a29020e0e0c0002031d29352a362a2d1a29020e0e0c000303033c0207292503511e283b6502013b6502013b03043b5002450402002b2a2215221522151a04020e0c00065029352a362a353b1ae5010e0e0c000303032a020f2a3629220e1aeb010c00033c2a69652a220e1ae6010e0e0e0c00033b2606292503511ea85102023b50502b250526041ecf3b270402013b642b3b1ac6010e0e0e0c0003293b2a1a82010e0e0e0c00021a81010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a94010e0c00023b2b291a4a010e0e0e0c00021a49010e0e0c0002031729362b3c1a7b010c0003292b25042504511e253b6502012a6522102a30221222122212220c2213221322132213220c1a58010e0c000d22111a57010c0002291a58010e0c00023e2c69293b69280e2c3b6a2c291ae4000e0c00021ae5000e0e0c0002031d29352a362a353d1adc000e0c00030309292503511e263b02013b6502013c64030b291a19010e0e0c0002020129402c2b6a2f3b2a1a9f000c00021aa1000e0e0c000203222a352b362a2c1af9000e0e0c000303032a02012b2a2a2505250526031e2d3b6602012965293c1ab1000e0e0c00030402002c2b22162c221a221a1acd000e0e0c00075029352a363b2b0e0e0c00023d2a2c6a221f3b2b22141ab700221c7b06200005000000000000000058020000000000000000000000000000|@4141,I11,@4142,I105,I218,I251,I113,@4145,@2323,@4148,I253,@4150,I106,@4152,@4172,@4174,@2349,I233,@4176,@4140| 4140:O1|@5166 4141:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d62646173283129 4142:O1|@4143 4143:D5,96|00802b1a62000e0e0e0c00021a61000e0e0c0002032d2b352c362a36293b1a57000c0003030a2a1a56002f0e7d06000229352b1a4a000e0e0e0c00022a2a69270502013b420e0e0e000000000000000050000000000000000000000000000000|@4144,I105,I218,I251,@4142| 4144:S20|4c6973742e6d61705061727469616c2832292829 4145:O1|@4146 4146:D8,216|00842f353b1ad8000e0c0003030b3c30692f2a453b466402a22f353c1ac1000e0e0c000303142f36292f0e0e0e0c0002302a35452a36466502812f353e1aa0000e0c000303103b2d0e0c00022f1a9800452a466402652f36293b1a93000c000303033c02142c3b1a8e000e0e0e0c00032a2a1a8b000c00036403041a8a00103b503b50293c1a88000e0c00032d2a1a67000c0003293b1a47000c0003030b3c3369322a453b46640211293529352a363b2b69220c2a452b462704661f050e0e0e0000000000000000c8000000000000000000000000000000|@4147,I251,@3482,I234,I253,I231,@1586,I106| 4147:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352966696e6442696e64696e67283129 4148:O1|@4149 4149:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@2323,@4148| 4150:O1|@4151 4151:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203122b36291a44000e0c00021a45002a696502013b420e0e0e0e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4150,@474| 4152:O1|@4153 4153:D5,128|008b220d1a81000e0e0c00021a81000e0e0c0002034d220d35220e362a352b36221022102210221022102210221022102210221022101a5f000c000e2a221022102210221022102210221022102210221022101a4a000e0e0e0c000d2a2a69270402013b1f0c0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4154,@4152| 4154:O1|@4155 4155:D12,288|008c220e35220f3622103822113922122306221323073b2c291a0c010e0c00021a0d010e0e0c0002031729362b3c1a07010c0003292b25042504511e233b6502012a651afa002a6922142a1afa000e0e0e0c00033c28403b1af5000e0e0c00041af5002b2b2f2215221922192219221d2210680a1ae9002c69342b2b3322132216221622190c00082c3b1adb000c0003293b2a1a92000e0e0e0c00021a91000e0e0c000203182a352b362a35292d692b2a2506250626041e253b27040201296522113b1aaa000e0e0e0c0003030334020b3422121aa1000e0e0c00032c220f3b2d2d3c221122116808221e3b1a81000e0e0c000303033b0203221e353b2a2c6a27121f0d0e0e0e0e000000000000000010010000000000000000000000000000|@4157,I105,I218,I106,@4158,@1385,I11,@4160,@4169,I253,I251,@4156| 4156:O1|@4171 4157:S69|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229 4158:D2,48|00802b56171a30000e0c00033b2a6964420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@4159,I106| 4159:S80|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563417267732d283129 4160:D13,336|0080560f2c2a1a4f010c00021a51010e0e0c000203043b5002041a4b01103b502a352b362b3b1a47010c000303032a02172b3c1a42010e0e0e0c00032a2a2505250526031e3f3b64270429353d1a30010e0c000303392936562e291afa000e0e0e0c00021af9000e0e0c0002031d29352a362a2d1af9000e0e0c000303033c0207292503511e2b3b6502013b6502013b03142956281af0000e0c00033c2a692956476965028f0402002a2a564b565c566d1adc000e0c00065029352a362a353b1abd000e0e0c000303032a020f2a3629566a1ab3000c00033c2a69652a566a1ab6000e0e0e0c00032a353b1a92000e0e0e0c000303032a022b2a3629353c1a7f000c000303043b5002041a9300103b5029362956991a90000e0c00033b2a693c2a6927042a56891a86000e0e0e0c00032a2a69270764420e000000000000000040010000000000000000000000000000|@4162,I105,I218,@611,I113,I107,I251,@2323,@4145,@4163,@4165,I106,@4161| 4161:O1|@4168 4162:S82|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229636c6f73757265526566283129 4163:O1|@4164 4164:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@2323,@4163| 4165:O4|@14322,@596,@4167,@4166 4166:O5|@4103,415,0,415,0 4167:S8|6d6170546f417267 4168:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c352d362a353c1a68000e0c000303043b5002041a6300103b502a36292f1a61000e0e0c00033b2a692c311a5c000e0c00032a2a69270602013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,I251,@4165,I106,@4161| 4169:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@4170| 4170:S84|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563757273697665526566283129 4171:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4156| 4172:O1|@4173 4173:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203252b352c362a36293b1a4f000c000303033b020229352b1a49000e0e0c00022a2a69270502013b420e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,I251,@4172| 4174:O1|@4175 4175:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c363d2b693f2a692b1a44000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4174| 4176:O1|@4177 4177:D23,616|008504030031312b30301a63020c00065029352a362b373c28403b1a5a020e0e0e0c0004293b3b1a56020e0e0e0c0004502c2a2d1a51020e0e0c000434291a4f020c00021a51020e0e0c0002032429352a362a35291a48021a4d020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a2f020c0003036b1a2f02291a0b020c00021a0d020e0e0c0002032429352a362a35291a04021a09020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aeb010c000303041af301103b503b50293529351acf011ad4010e0c000303043b5002041adf01103b50293765021e293529351ab0011ab5010e0e0c000303043b5002041abf01103b5029376464038234291a81010e0e0c00021a81010e0e0c0002032429352a362a35291aa0011a7d010e0e0c00036403052a68010207292503511e313b6502013b64293b1a5f010c0003030e2a1a7e010e0e0e0c00023b64022d293529351a65011a42010e0e0e0c000303043b5002041a4b01103b5029372c1a52010e0e0e0c00022a0c0002656402013b0402002b35401a12010e0e0e0c000303602b3629363b2a22111a2f010c00042b352c23083b2a291ad9000e0e0c00021ad9000e0e0c0002031729362b3c1a13010c0003292b25042504511e243b6502012a652b2d1a04012f692c22171a04010e0c00061a05012a69312a453b462609022a3b1afe00220f1ad1000e0e0c00042c2a1af7003b22121ad9000e0e0c00061af1002a692c2a453b46260429352a36293b1a77000c000303032f020b2f2a1ada000e0e0e0c0003220f2c452a46270b1f060e0e000000000000000058020000000000000000000000000000|@4179,@4180,I11,I255,@4343,I105,I218,@14397,I251,@2781,@2836,@1576,@14408,@4501,@4605,I106,@4622,@4624,@5156,@5158,@5159,@5164,@4178| 4178:O1|@5165 4179:S48|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e636f646547656e6572617465283329 4180:O1|@4181 4181:D7,96|00843c28403b1a5f000c0004040200311a5d001a6200332e1a65002f220c220c1a65000e0e0c000a5029352a362c3b1a5e000e0e0e0c0003322c452a462b4727051f050e0e0e0e0e000000000000000050000000000000000000000000000000|@4183,I11,@4184,@4191,@4194,@4182,I253| 4182:O1|@4196 4183:S54|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229 4184:O1|@4185 4185:D2,32|00821a2300100e0e000000000000000010000000000000000000000000000000|@4187,@4186| 4186:O4|@14322,@596,@4189,@4188 4187:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836292d45 4188:O5|@4190,1431,0,1431,0 4189:S31|6f75746572206c6576656c207265616368656420696e20636f7079436f6465 4190:S63|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f5354415449435f4c494e4b5f414e445f43415345532e736d6c 4191:O1|@4192 4192:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@4193,@4186| 4193:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229746f704c6576656c283129 4194:O1|@4195 4195:D1,32|00813b430e0e0e0e000000000000000010000000000000000000000000000000|@4187| 4196:D16,552|0088303b1a29020e0e0c000303033c020b301a23021a28020e0c000303041a2702103b503b50303c1a25020e0e0c00032928403b1a21020e0e0c0004293b341a1e020e0e0e0c000450323b1ae2010e0e0e0c000303033c020b321adb011ae0010e0c000303041adf01103b503b50323c1add010e0e0c00032928403b1ad9010e0e0c0004293b220d1ad5010e0e0c000450343b1a9a010e0e0e0c000303033c020b341a93011a98010e0c000303041a9701103b503b50343c1a95010e0e0c00032928403b1a91010e0e0c0004293b220f1a8d010e0e0c0004502210353d1a88010e0c0003032722103722113422122212221033301a79012211220c22171a78010e0c000c220c2a452b46650fdc221035401a54010e0c0003033322103722113422122212221033301a45012211220c22171a44010e0c000c2a2c220c1a41010e0e0c0004220d2b452a466602b922103528071a13010c0003038822103629352a362b372c382d392e3a2f2306302307040400313131313131313131222222222220221a22171ae800222222221af9000e0e0c00125029352a362b382b2b3c221f221f221d221722161ae5000e0e0c00092a1ae4000e0c00021ae5000e0e0c00021add000e0e0c000203033b020b221628452c3b6b293b696422192b452a46270f0224221033221102021b002211220f322f1a7c0022103422161a7c000e0c000c342a453b466427061f090e0e0e0e0e0e000000000000000018020000000000000000000000000000|@4198,I234,72057594037927934,I231,@1603,I106,I11,I255,I251,@4182,@4199,@4334,@4206,@4197,I105,I218| 4197:O1|@4339 4198:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629 4199:O2|@4201,@4200 4200:O2|@4314,@4199 4201:D29,1632|008a220c350a0e008b050a05e8051e0020064a03f5059103ec03630517043c05fe02ce02f103220c36220d37220e382a3528071a32060e0e0e0c0003037a2a362c2e22112211221122112211221122112211221122111a17060c000d2a352b362c372d382e392f3a302306312307040400313131313131313131222122212221222122212221222822221aeb050c00125029352a362b372b2b2b221e221e221e221e221b1ad9050e0e0c00092805220e2b22126b270f0fdd2a353d1aaa050e0e0e0c000303a02a362b3729291ab9050e0e0c00021ab9050e0e0c0002032429352a362a3529220e1a7e050e0e0e0c00036403052a68010207292503511e313b6502013b64291a80050e0c00021a81050e0e0c0002031f29352935220c1a49050e0e0c000303043b5002041a6b05103b5029376402013b3b302b221422142214221422142214221b22152215221322161a4e050e0e0e0c000f3e2e2e6a28052b2b326b27060fd42a353f1afc040e0c000307ca2a3629353e1aee040e0e0e0c000303433b2d2210221022102210220d342217221302023c012213221322121a08050e0c000e1a09053b2211221122112211220e1a03050c000828062a6928052c2b306b6602cb29353c1a9d040e0e0c0003031429360402002a3b2b22130e0c000450293665026b29353e1a7c040e0c000303033b025c29353b1a6d040e0e0c000303033b024c2936293b1ab4040e0c000303033c0214343b1aae040e0e0e0c00032a2a1aab040c00036403041aaa04103b503b50293c1aa8040204970055000e0e0e0c0003220c2a1a7e040e0e0e0c0003653b2e2b221222122212221222122212221922132213221122141a7b040c000f2b3b2212221222122212220f1a39040e0e0c000828062a6928052c2b316b27046402402b2d22102210221022102210221022102210221022101a44040e0c000d2b2210221022102210221022102210221022102210220f0e0e0c000c28052b2b2e6b65660fdd220c36220d37220e382a220f220f220f220f220f220f220f220f220f220f220e0e0e0e0c000c280f2d2b2d6b27040fcd220c36220d37220e3829220f220f220f220f220f220f220f220f220f220f220e0e0e0e0c000c2c2210221022102210221022102210221022102210220f0e0e0c000c280e2a2e2d6b27050fdd220c36220d3729220e220e220e220e220e220e220e220e220e220e220d0e0e0c000c2b220f220f220f220f220f220f220f220f220f220f220e0e0e0c000c28082a2c6a27040fd6220c3629352a362b372c382d392e3a2f230630230704040002029002313131313131313131221d221d221d221d221d221d2224221e1aa702020270020c00125029352a362a2a3c221922192219221922161a930222167b0a1900091a01030fde220c36292b220e220e220e220e220e220e220e220e220e220e1aeb020c000d28102a69650fdd220c36220d373d2a69293b69293b020214021a34020e0c000303032c020b2c2a1ac6020e0e0e0c0003652e3431220c302213221322132213221122111ab2020e0e0e0c000d0402002a3b2a1a1b020202d4010c00021a19020e0e0c000203043b5002041a9302103b502a352b36293b1ad7010c0003034e2a353c1acc010e0c000303043b5002041a7702103b502a362c3b2a1ad4010e0c00021ad5010e0e0c000203172a352b362a2c692a2a2505250526031e213b6602036c0129652f2a452b462603020e2a2c692a2a2505250526031e8650260429352a362a3b020247011a67010c00030303290205280c2b2b6a27060fce220c36220d37220e382b2b2b2211221122112211221122112211221122112211121100010001000c000e1ae9012f7d100002220c3629220d220d220d220d220d220d220d220d220d220d220c0e0e0e0c000c280d2a69650fd0220c36292b220e220e220e220e220e220e220e220e220e220e1aa9010e0e0c000d280b2a696502b2220c36220d37292e3431220c1a96010e0e0e0c00062b220f220f220f220f220f220f220f220f220f220f220e0e0e0c000c2b2b2f22122212221222122212221222122212221222121a6201020263000e0e0e0c000e3b2b2b6a27050255220c36220d373e2b2b6a650248220c36220d372a220e220e220e220e220e220e220e220e220e220e220d0e0e0e0c000c28072a2c6a66021d220c36293c220d220d220d220d331a7f00020208000c000828062a69651f0b0e000000000000000050060000000000000000000000000000|@4203,I251,@4204,@4206,@4197,I105,I218,@1576,@4239,@4245,@577,@4241,I234,I253,I231,@1586,I106,@4247,@4249,@4251,@4252,@4254,@4256,@4291,@4294,@4297,@4309,@4311,@4202| 4202:O1|@4313 4203:S74|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129 4204:O1|@4205 4205:D4,128|008b220d1a81000e0e0c00021a81000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a3f000c000d2a2a69270702013b1f0c0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4204| 4206:O1|@4207 4207:D18,432|00903c28403b1aaf010c00043c28403b1aa5010e0e0c00043c28403b1a99010e0e0c00041a99012a693c28403b1a88010e0c0004293b1a8f011a94010e0c0004503b2214291a90010e0c00021a91010e0e0c0002031729362b3c1a8b010c0003292b25042504511e233b6502012a65293b1a7c010e0c000303033c020b291a77011a7c010e0c000303041a7b01103b503b50293c1a51010e0e0c00032928403d1a15010e0e0c0004293b2d1a22010e0e0e0c0004503c28403b1afc000e0c0004040200221c1a4801221b220c220c2218221822182218221868093122192e1a370131692f2214221422170e0e0e0c000a502935333b1a28010e0c00032d3b1a1f010c00033b2a293b1a1d010e0e0c000303032a0248293c1a16010e0e0e0c00032a3c1a0b010c00032b3c1a03010c0003293c1ab3000c0003342a1ae3000c0003293b1ae3000c000303052c306902012f292f2508250826061e523b270665221c1ad5000e0e0c00022f3b1ab3000c00032e22223b2d2d22203b680728092a69220f3b1a9b000c0003221d2b4531462a472f4827131f110e0e0000000000000000a0010000000000000000000000000000|@4209,I11,@4210,@4212,I255,I105,I218,I106,I234,72057594037927934,I231,@1603,@4230,@4237,I253,I251,I240,@4208| 4208:O1|@4238 4209:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829 4210:D3,56|00802b031056073b3c1a34000e0c0004503b5002023b501a2e00420e0e0e0e0e000000000000000028000000000000000000000000000000|@4211,I255,@577| 4211:S88|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382972656343616c6c283129 4212:O1|@4213 4213:D9,128|00802b363c1a80000e0c000303051a7f0002532b35293b1a7e000e0e0e0c00036403051a7a00023e2b363c1a5a000e0e0e0c000303051a6f00022b2b35293c1a56000e0e0e0c00036403051a620002162b363c1a32000e0e0e0c000303051a570002031a5a00420e000000000000000070000000000000000000000000000000|@4215,I234,@1338,I251,@4216,@1338,@4223,@1338,@4214| 4214:O5|0,0,0,@4218,@4227 4215:S9|7072696e742d747269 4216:O5|0,0,0,@4218,@4217 4217:O2|@4221,0 4218:O2|@4219,0 4219:O2|0,@4220 4220:O5|@4190,1329,1329,0,0 4221:O2|3,@4222 4222:S7|54726943616c6c 4223:O5|0,0,0,@4218,@4224 4224:O2|@4225,0 4225:O2|3,@4226 4226:S10|547269436c6f73757265 4227:O2|@4228,0 4228:O2|3,@4229 4229:S8|547269556e726566 4230:D2,64|00822d2d562756385649565a566b567c568d569e1a31000e0e0c000b2c2a35452a364664440e0e0e000000000000000030000000000000000000000000000000|@4187,@4231| 4231:O1|@4232 4232:D15,368|008932220c2a1a6f010c00021a71010e0e0c000203043b5002041a6b01103b502a352b362b3b1a67010c000303032a02172b3c1a62010e0e0e0c00032a2a2505250526031e3f3b64270429353c1a50010e0c0003031429360402002a220e2b220c0c00045029366502bb29353e1a30010e0c0003030a34300e0c0002503b02a529353b1a1a010e0e0e0c0003030f293629220d310e0c0003503b6402882936220c0344293b1a00010e0c000303033c02142e3b1afa000e0e0e0c00032a2a1af7000c00036403041af600103b503b50293c1af4000e0c00032f2a3c1af2000e0e0e0c00046402013b2a3b1abb000c000303033c02142e3b1ab6000e0e0e0c00032b2a1ab3000c00036403041aca00103b503b502a3c1ab0000e0c00032f2a1a8f000c000366333b1a86000e0e0e0c0003333b1a7b000c00032a2a2e220f220f1a9e000e0e0e0c00063c2a69292e6927061f0a0e0e0e0e0e0e000000000000000060010000000000000000000000000000|@4234,I105,I218,@611,I113,I107,I251,I234,I253,I231,@1614,I106,I255,@1586,@4233| 4233:O1|@4235 4234:S85|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382970726576283229 4235:D10,312|00842f1a3a010e0e0e0c00021a39010e0e0c000203ca2f3530362a301a31010e0e0c000303033c02922a353b1a21010e0e0c0003031b2f353b1a14010e0c0003030c2a3630361a0f010c000302013b026a2a353c1af9000e0e0c0003031b2f353c1aec000e0c0003030c2a3630361ae7000c000302013b02422a353d1ad1000e0e0c0003031b2f353d1ac4000e0c0003030c2a3630361abf000c000302013b021a2a353e1aa9000e0e0c0003030c2f353e1a9c000e0c000302013b030b303c1a9e002f0e7e090003303c1a93000c00032a2a3232321a9000330e0e7b070a00062c3b1a8b000c00032e2a692e3b2b1a87000c0004502d3b1a76000e0e0e0c0003293c1a7b000c00032f3b2b1a6a000e0e0e0c000450293c1a4600310e7e0b0003000000000000000028010000000000000000000000000000|@4236,I105,I218,I251,I113,I107,@4233,I253,I255,I106| 4236:S104|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829707265762832296d616b65436c6f73757265456e747279283229 4237:D9,176|00812b03033c02492c3b1aab000c000303033c021456073b1aa5000e0e0c00032d2a1aa3000c00036403041aa200103b502c3c1aa2000e0e0e0c000356172a1a7e000e0e0e0c0003293c1a93000c0003652d3b1a62000e0e0e0c000303033c021456173b1a59000e0e0c00032e2a1a57000c00036403041a6e00103b502d3c1a56000e0e0e0c000356272a2c1a6100300e0e0e7b050600040000000000000000a0000000000000000000000000000000|@4187,I234,I253,I231,@1586,I106,I251,@1614,I255| 4238:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4208| 4239:O1|@4240 4240:D10,504|008d220e3b1af8010e0c000303033b0fd3220e35220f362a35293528071ae0010e0c000303cd29362c362212291ad8010e0c00021ad9010e0e0c0002031d29352a362a22181ad0010e0c000303033c0207292503511e293b6502013b641ab0010e0c00022b352c362d372e382f39303a312306322307040400313131313131313131222422242224222422242224222422241a8b010c00125029352a362a2a220d2220222022202220221c1a7a010e0e0e0c000929220e6922223c1a72010e0e0e0c00032922132223222322232223222322232223222322232223222322231a56010202f4000e0e0e0c000f2b2a6927120fdc29353f1a07010c0003038929362c362212291a00010e0c00021a01010e0e0c0002031d29352a362a22181af8000e0c000303033c0207292503511e293b6502013b641ad8000e0c00022b2a221422142214221422101af5000e0e0c000828062a69292d6922183c1ad3000c000329322219221922192219221922192219221922192219221922191abb000c000f2b2a69270802522b362a3422122212221222122212221222112211221022120e0e0c000c292b6922153c1a83000c0003292f2216221622162216221622162216221622162216221622161a6b00020208000c000f2b2a692705661f0e0e0e0e0e0000000000000000e8010000000000000000000000000000|@4242,I251,I105,I218,I113,@4206,@4197,I106,@4239,@4241| 4241:O1|@4243 4242:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e736572742831296d617041726773283229 4243:D9,256|008631353c1a00010e0c0003031431360402002a332b340e0e0c00045029356502bf31353e1ae0000e0c0003030a302f2c0e0e0e7d09000231353b1aca000e0e0e0c0003031131362932300e0e0c0003503b2a6964028a3136310343293b1aaf000c000303033c02142d3b1aaa000e0e0e0c00032a2a1aa7000c00036403041aa600103b503b50293c1aa4000e0c00032e2a3c1aa2000e0e0e0c00046402013b2a3b1a6b000c000303033c02142d3b1a66000e0e0e0c00032b2a1a63000c00036403041a7a00103b503b502a3c1a60000e0c00032e2a1a3f000c00033d2a6927041f070e0e0e0e0e0000000000000000f0000000000000000000000000000000|@4244,I251,I234,I253,I231,@1614,I106,I255,@1586| 4244:S75|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296c6f6361646472283229 4245:O1|@4246 4246:D7,272|008c220d3b1a10010e0c000303033b0fd4220d35220e362a352b3529353f1af7000c00030311293629353b1aea000e0e0e0c00036402013b6403642b35293629362e3622152b1ad7000c00031ad9000e0e0c00022c2a221622162216221622161acd000e0e0c000828062a69292d6922193c1ac3000c00032934221a221a221a221a221a221a221a221a221a221a221a1aad000e0e0c000e2b2a69270a02522b362a342212221222122212220f220f220f2215221022160e0e0c000c292b6922143c1a73000c0003292f221522152215221522152215221522152215221522151a5d0002020b000e0e0c000e2b2a692705661f0d0e0e0e0e000000000000000000010000000000000000000000000000|@4242,I251,I113,I218,@4241,I106,@4245| 4247:O1|@4248 4248:D10,504|008d220e3b1af8010e0c000303033b0fd3220e35220f362a35293528071ae0010e0c000303cd29362c362212291ad8010e0c00021ad9010e0e0c0002031d29352a362a22181ad0010e0c000303033c0207292503511e293b6502013b641ab0010e0c00022b352c362d372e382f39303a312306322307040400313131313131313131222422242224222422242224222422241a8b010c00125029352a362a2a220d2220222022202220221c1a7a010e0e0e0c000929220e6922223c1a72010e0e0e0c00032922132223222322232223222322232223222322232223222322231a56010202f4000e0e0e0c000f2b2a6927120fdc29353f1a07010c0003038929362c362212291a00010e0c00021a01010e0e0c0002031d29352a362a22181af8000e0c000303033c0207292503511e293b6502013b641ad8000e0c00022b2a221422142214221422101af5000e0e0c000828062a69292d6922183c1ad3000c000329322219221922192219221922192219221922192219221922191abb000c000f2b2a69270802522b362a3422122212221222122212221222112211221022120e0e0c000c292b6922153c1a83000c0003292f2216221622162216221622162216221622162216221622161a6b00020208000c000f2b2a692705661f0e0e0e0e0e0000000000000000e8010000000000000000000000000000|@4242,I251,I105,I218,I113,@4206,@4197,I106,@4247,@4241| 4249:O1|@4250 4250:D4,128|008b220d1a81000e0e0c00021a81000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a3f000c000d2a2a69270702013b1f0c0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4249| 4251:O1|10 4252:O1|@4253 4253:D4,128|008b220d1a81000e0e0c00021a81000e0e0c00020349220d35220e362a220e220e220e220e220e220e220e220e220e220e22190e0e0c000c2a221022102210221022102210221022102210221022101a46000e0e0e0c000d2a2a69270402013b1f0c0e0e0e0e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4252| 4254:O1|@4255 4255:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4254| 4256:O1|@4257 4257:D25,968|008b220d1ac9030e0e0c00021ac9030e0e0c000207cf220d35220e362a353b1abe030e0e0e0c000303662a372b382c392b22122212221222121aac030e0c00062d221322132213221322132213221322132213221322131a96030e0e0e0c000d2b220f220f220f220f2217221622112211221a221d221a0e0e0c000c3f2e693b2d2b6a3c2c69292e692b2a69270a0fdd2a353d1a4a030e0e0e0c000303802a362a221022102210221022102210221022102210221022101a36030e0e0e0c000d2a220c220c220c220c22142213220e220e2217221a22170e0e0c000c2935280c1afd020202c6020e0e0c0003032629362a373c2a69292e69293b1ae3020c000303032c020b2c2a1aee02220d7e170003270402073c2a69292c6964660fcf2a353e1abc020e0c000307d12a362922102210221022101ac8020e0c00062b221122112211221122112211221122112211221122111a9a020e0e0e0c000d2b220c220c220c22142213220e221302023b02220f1a94020e0c000a293b3b221422102210221022171a88020e0c00090402002a2a1a84020e0c00035029352a362a1a2f020c00021a31020e0e0c00021a29020e0e0c00020325291a66020e0e0e0c00022f3b1a1b020c0003030329020b29301a5602220f7e19000364023a2a1a51020e0e0c00023d2a692b1a4d020202bb010e0e0c0002313b1ae70102021c000c0003030329020b29321a36020e0e0e0c00032b2a69270427080fd52a372b38293528071abc010e0c000307d729362b22122212221222121ab0010e0c00062a352b362c372d382e392f3a302306312307040400313131313131313131221e221e221e222622252220222522211adb010c00125029352a362b372c3822103b1ad1010e0e0c000303033c0218221c3b1ac9010e0e0c000322112a1ac6010e0e0e0c00036403041ac201103b503b5022103c1abf010c0003221d2a2c1abd010e0e0c00042213222222222222222222222222222222222222222222221a15010e0e0c000d2d03033c024f22133b1a64010202ba000e0c000303033c021c22213b1a5901020251000e0e0c000322142a1a52010e0e0e0c00036403041a6601103b503b5022133c1a4b010c000322222a1a2a010e0e0e0c00036430302b222022202220222822281a43010c00093b22132b6a292d69271502552a22112211221122111a88000e0c00062c221222122212221222122212221222122212221222121a72000e0e0e0c000d2b220e220e220e220e22162215221022102219221c22190e0e0c000c3b2c2b6a292c692704656502013b1f0c0000000000000000b8030000000000000000000000000000|@4259,I105,I218,I251,@4260,@4256,@4263,@4265,@4267,@4272,@4277,@4279,@4281,@4283,@4288,@4258,@4206,I234,I253,I231,@1614,I106,I255,@1586,@4197| 4258:O1|@4290 4259:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129 4260:O1|@4261 4261:D7,280|00842e3b1a19010e0e0c00032f3b1a0f010c0003293c1a0f010c0003313b2b1a0e010e0e0e0c000450323b1a0a010e0e0e0c000303033c0214303b1ae2000e0e0e0c0003332a1af7000c00036403041af600103b503b50323c1acc000e0c0003312a3b1aca000e0e0e0c0004343b1ac7000c000303033c0218313b1aa2000e0e0e0c0003220c2a1ab6000e0e0e0c00036403041ab200103b503b50343c1a88000e0c0003322a301a86000e0e0e0c0004220d3b1a82000e0e0e0c000303033c0218323b1a5a000e0e0e0c0003220e2a1a6e000e0e0e0c00036403041a6a00103b503b50220d3c1a3f000c0003332a3b1a3e000e0e0e0c00043127091f050e0e0e000000000000000008010000000000000000000000000000|@4262,I253,I106,I255,I234,I231,@1614| 4262:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296d616b654465636c283129 4263:O1|@4264 4264:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4263| 4265:O1|@4266 4266:D5,88|00842f1a5a000e0e0e0c00021a59000e0e0c000203252f3530362a3629323232321a4c000e0c00062b333333331a48000e0c00062a2a69270502013b1f050e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@4260,@4265| 4267:O1|@4268 4268:D5,120|0088331a7a000e0e0e0c00021a79000e0e0c00020341333534362a352b362c37220e220e220e220e220e220e220e220e1a5d000e0e0c000c2a220d220d220d220d220d220d220d220d1a4c000e0c000a2a2a69270402013b1f090e0e0e0e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,@4269,@4267| 4269:O1|@4270 4270:D8,256|008a33353436220c37220d38220e39220f3a2210230622112307040400313131313131313131221b221b221b221b221b221b221b221b1acf000c00125029352a362b372c382a034b22183b1ac2000e0e0e0c000303033c021822133b1ab9000e0e0c000322192a1ab6000e0e0e0c00036403041ab200103b503b5022183c1aaf000c000322142a3c1aad000e0e0c00046402013b22193b1a76000e0e0e0c000303033c021822133b1a6d000e0e0c0003221a2a1a6a000e0e0e0c00036403041a6600103b503b5022193c1a63000c000322142a2d1a61000e0e0c0004221b30306a27101f0b0e0e0e0000000000000000f0000000000000000000000000000000|@4271,@4206,I234,I253,I231,@1614,I106,I255| 4271:S103|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129636f7079446563283329 4272:O1|@4273 4273:D12,328|0087321a4a010e0e0e0c00021a49010e0e0c000207d6323533362a352b362c372b3b1a3b010c000303033c0214343b1a36010e0e0e0c00032c2a1a33010c00036403041a3201103b503b502b3c1a30010e0c0003220c2a1a0e010e0e0e0c00036403702a2a3c220d220d220d2211220e1a15010e0e0c00092c3b1ae3000c000303033c0214313b1ade000e0e0e0c00032d2a1adb000c00036403041ada00103b503b502c3c1ad8000e0c0003322a1ab7000c0003292c693022123c221222122212221222121ac8000e0c00092a2a69270502212d220e692d2a220f220f220f220f220f220f1aa800221002020a000e7b0a10000927050230303b1a9b000c00030312312f2f2f33301a9500310e0e0e7b080a0007313b3b32323232321a7100330e0e0e7b0a0a00091f080e0e0e0e0e0e000000000000000038010000000000000000000000000000|@4275,I105,I218,I234,I253,I231,@1586,I106,@4197,@4272,I251,@4274| 4274:O1|@4276 4275:S111|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e7328312970726f63657373436c6f7375726573283329 4276:D10,168|0085301aaa000e0e0e0c00021aa9000e0e0c00020375303531362a352b362c372a2a3b220e220e220e220e220e1a90000e0c00092c3b1a8f000c000303033c0214313b1a8a000e0e0e0c00032d2a1a87000c00036403041a8600103b503b502c3c1a84000e0c0003322a1a63000c0003292c6930221022102210221022101a6f000c00072a2a69270a02013b1f060e0e000000000000000098000000000000000000000000000000|@1399,I105,I218,@4197,I234,I253,I231,@1586,I106,@4274| 4277:O1|@4278 4278:D6,120|00812c1a7a000e0e0e0c00021a79000e0e0c0002033e2c352d362a36293528091a6d000e0e0c00030402002c2a1a68000e0c00035029352a362c030b2f2b69332a452b466402092f2a69332c452a46642707020b1a49002c2a35452a36466443000000000000000068000000000000000000000000000000|@1506,I105,I218,I251,@4277,@1505| 4279:O1|@4280 4280:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4279| 4281:O1|@4282 4282:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4281| 4283:O1|@4284 4284:D6,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a352b36293528091a5b000c000303043b5002041a57001029362b2a692d1a55000e0e0c00022a2a69270702013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I251,@4285,@4283| 4285:O4|@14322,@596,@4287,@4286 4286:O5|@4190,1024,0,1024,0 4287:S8|61734d757475616c 4288:O1|@4289 4289:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a2c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4288| 4290:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4258| 4291:O4|@14322,@596,@4293,@4292 4292:O5|@4190,1062,0,1062,0 4293:S30|64656353657175656e63655769746846696e616c4578703a20656d707479 4294:O4|@14322,@596,@4296,@4295 4295:O5|@4190,1064,0,1064,0 4296:S46|64656353657175656e63655769746846696e616c4578703a206c617374206973206e6f742061204e756c6c446563 4297:O1|@4298 4298:D15,464|00802b353c1ad0010e0c000307dc2b362c372d382e39291ac6010e0e0e0c00021ac5010e0e0c000203393b2c291ab0010e0c00021ab1010e0e0c0002031729362b3c1aab010c0003292b25042504511e233b6502012a65293f1a9c010e0c0003640fd42b1a79010e0e0c00021a79010e0e0c000203043b5002041a8301102b352936292a690402002f2b2a1a52010e0e0e0c00021a51010e0e0c000203392a352b362a362c352d362b2b1a5b010c000303032b02012a2c2b1a55010e0e0c000303032c02012a2a2a692f2a250a250a26081e4726080209292c2a35452a3646515129352a363b32290202c8001af1000e0e0c00021af1000e0e0c0002031729362b3c1aeb000c0003292b25042504511e283b6502012a652928071adb000c000303722a3b1af1000e0e0c000303101aef002b1abb0002025e000c000302012a2c3b1ad4000e0c0003030c1ad3002d1a9f000c000302012c2a2a1acc000e0c0003293b1acb000c0003293c1a6b000c000303032a020b2a3d1aae000e0e0e0c0003293e1ab3000c00032f2a1aa3000c0003270602013b27072903093c2e2e2e2e6805020d2c2b2f2e1a9600347b06080005270502012b420e0e0000000000000000c0010000000000000000000000000000|@4300,I251,I105,I218,I106,I233,@1712,I250,I249,I234,@410,I107,I231,I109,@4299| 4299:O1|@4301 4300:S81|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e7665727443617365283129 4301:D9,184|00832e1aba000e0e0e0c00021ab9000e0e0c000203832e352f362a352b36311a9e000e0e0e0c00021a9d000e0e0c0002030b3135280f2b332c6b640249313c1a8e000e0e0e0c0003031e3e2a3b6a293b69322a69291a80000e0c000228052a1a7e003c6b2704021e3e2a3b6a293b69322a69291a72000e0e0e0c000228052a1a6e003c6b27042c3333331a6b000c00053d2b2e2c6b270602012b1f040e0e0e0e0000000000000000a8000000000000000000000000000000|@4303,I105,I218,I251,@4304,@4306,@4307,@4302,@4299| 4302:O3|3,I113,0 4303:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e76657274436173652831297265636f6e76657274283129 4304:O1|@4305 4305:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4304| 4306:O3|3,I251,0 4307:O1|@4308 4308:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4307| 4309:O1|@4310 4310:D4,128|008b220d1a81000e0e0c00021a81000e0e0c0002034d220d35220e362a352b362a2210221022102210221022102210221022102210221b0e0e0c000c292b692d221322132213221322132213221322132213221322131a3f000c000d2a2a69270702013b1f0c0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4309| 4311:O1|@4312 4312:D5,96|00842f1a62000e0e0e0c00021a61000e0e0c000203292f3530362a35293629333333331a52000e0e0e0c00062c343434341a4c000e0c00062a2a69270602013b1f050e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@4260,@4311| 4313:D4,168|008c220e1aa9000e0e0c00021aa9000e0e0c00020314220d1a95000e0e0c00021a95000e0e0c000202013b035a220e35220f36220f352210362c3529372e362a2213221322132213221322132213221322132213221e0e0e0e0c000c2e2a2c6a302f221722172217221722172217221722172217221722171a45000e0e0c000e2a2a69270a02013b1f0d0e0e0e0e0e0e000000000000000098000000000000000000000000000000|@3592,I105,I218,@4202| 4314:D11,744|008c220d220c220c220c220c220c220c220c220c220c220c56b70e0e0e0c000c220d353c1ac9020e0e0c00030329220d36220e37220f382b2b2b221222122212221222122212221222122212221222110e0c000e66021d220d220d220d220d220d220d220d220d220d220d220d56c70e0e0c000c2210220e220e220e220e220e220e220e220e220e220e56d70e0c000c3c28403b1a61020e0e0c0004293b1a5f022212691a61020e0e0c0004502a1a5f020c0002291a60020e0c00021a61020e0e0c000207cf293529352a362b3730353c1a1c020e0c000307cc30363137323833392c2f2a3528061a05020e0e0c0003030c293528061af7010c000302013b03b92a362a362a2a1ae6010e0e0e0c000303033c029a2a353b1ad5010e0e0c0003031b29353b1ac8010e0c0003030c2a362a361af3010c000302013b02722a353c1aad010e0e0c0003031b29353c1aa0010e0c0003030c2a362a361acb010c000302013b024a2a353d1a85010e0e0c0003031b29353d1a78010e0c0003030c2a362a361aa3010c000302013b02222a353e1a5d01020221010e0e0c0003031029353e1a4c010202fd000e0c000302013b03052a680102013b65024c2a3528071a2f010c0003030c293528071a23010c000302013b03302a362b372b362c372b2a1a46010e0e0e0c00031a35010e0e0c000203033b020c2c2b2506250626042019013b270402013b652e2b1ae4000e0c000303033c02352e1aff000c00021a01010e0e0c000203232a1aee000e0e0e0c00021aed000e0e0c0002030c2e352b351aaf000c000302013b02013b2a1aca000e0e0e0c00021ac9000e0e0c0002030c293c1a8d000e0e0c000302013b0319220e32692e1abb000c00022a2a693c322b32220d680566021b220e3269293b69220f1aa6000e0e0e0c00023c342c2c220d6805662706020f312c69293b693c2d2b220c2f6805652704020e2c1a7c000e0c00023d2d302c6b6427051f0d0e0e0e0e0e0e0000000000000000d8020000000000000000000000000000|@4316,I251,I11,@4317,I255,@4330,I105,I218,I113,@4315,@4297| 4315:O1|@4333 4316:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e64283329 4317:D15,320|00802b363c1a40010e0c000303051a3f010fdd2b353b2a1a3e010e0e0e0c00036403051a3a010fdd2b363c1a1a010e0e0e0c000303051a2f010fdd2b3529352d363c1a2b010c00032a2a6956473b1a27010c00032a2a0e0e0e0c00026429353b1af5000e0e0c000303972939291a10010e0c00021a11010e0e0c0002035f29361afd000e0e0c00021afd000e0e0c000203482935353e1abf000c000303312935362928281ab1000e0e0c000303033c021b29287b1aa1000e0e0c000303033c020b29285b1a91000e0e0c00036402013b1ab5000e0e0c000202013b02013b031d2a1aac00691ab0002a691ab3002a02022e00693b3e3c3b2d68056602012a6402012929020219003b691a9c002a691a9f002a693b3c3b020206003b2d68052709420e0e0e0e0e0e0e000000000000000030010000000000000000000000000000|@4319,I234,@1338,I251,@4320,@1338,I107,I253,I105,I218,@900,@901,@873,@871,@4318| 4318:O5|0,0,0,@4322,@4327 4319:S16|7072696e742d73696d696c6172697479 4320:O5|0,0,0,@4322,@4321 4321:O2|@4325,0 4322:O2|@4323,0 4323:O2|0,@4324 4324:O5|@4190,1127,1127,0,0 4325:O2|3,@4326 4326:S9|446966666572656e74 4327:O2|@4328,0 4328:O2|3,@4329 4329:S7|53696d696c6172 4330:O1|@4331 4331:D7,448|00802b35280f1abf010c000303142b362c372d382968012c2c2b6a29680127050fdb2b3528051a9f010c000307d12b362c3729353e1a90010e0c000307cb2936291a8c011a81010e0e0c00032a1a78011a75010e0e0c00032a03033c02012907d02d1a73010c00021a75010e0e0c0002033d2d352e36291a5e010e0e0e0c00021a5d010e0e0c000203212936293b1a37010c000303112b3529353e1a2a010e0e0e0c00036402013b6402013b6502013b03452d352e36293529352c352936291a16010e0e0e0c00020328291a0a010e0e0e0c000203043b5002041a0b0110301afe000e0e0e0c00022a2d2b6a2968016502013b270602a52d1add000204a800a5000c00021ad900020297000e0e0c000203412d36291ac0000e0c00021ac1000e0e0c0002032929352a36293b1a990002026b000e0e0c000303112a3529353e1a86000e0e0e0c00036402013b6502013b6402013b03452d352e362935293529362d352a1a72000e0e0e0c000203282a1a66000e0e0e0c000203043b5002041a6f0010301a5a000e0e0e0c00022b2b2b6a2968016502013b270602013b02013b6602013b6502013b420000000000000000b0010000000000000000000000000000|@4332,I251,I113,I105,I218,@2943,@2943| 4332:S87|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e6428332966696e6443617365283129 4333:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a352b362a2a692c1a43000c00022a2a69270602013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@4315| 4334:O1|@4335 4335:D12,280|00822d35280e1a17010c000303632d36291a14012f2f1a17010c000529291a17010c00021a19010e0e0c0002032d29352a362a1a02010e0e0e0c00021a01010e0e0c00021af9000e0e0c00020309292503511e353b02013b6502013c6403033b020c1ae30028452b3b6b293b696465028a2d353f1aa9000e0e0c0003037c2d3629353d1a9a000e0e0e0c000303682936293b1abb000c000303033c02142e3b1ab6000e0e0e0c00032a2a1ab3000c00036403041ab200103b503b50293c1ab0000e0c00032f2a1a8f000c0003291a68000e0c00021a69000e0e0c00021a61000e0e0c000203033b020a2f28452b3b6b293b69646602013b6402013b440e0e0e0e000000000000000008010000000000000000000000000000|@4337,I251,@4334,@4336,I105,I218,@14320,I234,I253,I231,@1586,I106| 4336:O1|@4338 4337:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f646528362967657450726f7073283129 4338:D4,88|00832e1a5a000e0e0e0c00021a59000e0e0c000203212e352f362a2f2f320e0e0e0c00042a3131311a45000e0e0c00052a2a69270402013b1f040e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@4336| 4339:D5,168|0087323528091aa7000c0003037f323629352a362b382c392d3a220e220d220d220d220d220d22131a8d000e0e0c0008293b2a1a8a000e0e0e0c00021a89000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965220f03033c0218291a58000e0c00021a59000e0e0c00021a51000e0e0c000230302c3131312f680728092a69270a0201321f08000000000000000098000000000000000000000000000000|@4341,I251,@4340,I105,I218| 4340:O1|@4342 4341:S83|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f707950726f63436c6f73757265283329 4342:D5,96|0086311a62000e0e0e0c00021a61000e0e0c00020329313532362a2e34343434341a54000e0c00082a3434343434341a4e000e0e0e0c00082a2a69270402013b1f070e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@4241,@4340| 4343:O1|@4344 4344:D11,232|00822b3b1ae9000e0e0c000303033c020b2b1ae3001ae8000e0c000303041ae700103b502b3c1ae7000c00032928403b1ae5000e0e0c0004293b2f1ae2000e0e0e0c0004502d3b1aa6000e0e0e0c000303033c020b2d1a9f001aa4000e0c000303041aa300103b502d3c1aa3000c00032928403b1aa1000e0e0c0004293b311a9e000e0e0e0c0004503c28403b1a88000e0c00043c28403c1a7d000e0e0c00043c28403b1a71000e0e0c0004293b1a77001a6c000e0c000450341a730030220d220d3032311a700022110e7b0a0c00090000000000000000d8000000000000000000000000000000|@4346,I234,72057594037927934,I231,@1603,I106,I11,I255,@4347,@4343,@4345| 4345:O3|@4384,@4483,@4383 4346:S56|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329 4347:O1|@4348 4348:D19,240|00802b363c1af0000e0c000303051aef0002c02b352c363c1aed000e0e0c0003293b1ad3000c000303051ae30002822a352a3c1ad2000e0e0e0c00032a2a691ad6003b1ada000e0e0e0c00031ad9002a0e0c0002642a2a0e0e0c0002642e362e3c1aa4000e0c00032a2a691aaa003b1aae000e0e0e0c00031ab5002a0e0c0002642a2a0e0e0c000264291aab00691aaf002a691ab2002a691ab5002a691ab8002a69322a691ab8002a691abb002a69270f1abc002a693b3c3b3b2d6805293b691ab5002a691ab8002a693b3c3b3b2d68052708420e0e0e0e0000000000000000e0000000000000000000000000000000|@4350,I234,@1338,I107,@884,@14409,I253,@4367,@4370,@887,@871,@4373,@871,@872,@871,@4375,@899,@871,@4349| 4349:O5|0,0,0,@4378,@4377 4350:S14|7072696e742d7573616765536574 4351:O1|@4352 4352:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@93,@4353| 4353:D3,56|00802b365617362d35291a33002c692d1a3500310e0e0e7b050600040e0e0e0e000000000000000028000000000000000000000000000000|@4355,@4356,@4354| 4354:O1|@4358 4355:S7|61646450502d32 4356:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@4357| 4357:S18|566563746f722e7072657474792833292d45 4358:D17,304|00822d1a32010e0e0e0c0002293c1a2f010c00032d3b1a2f010c000303051a2f010fdd2d2a1a18010e0c00031a29012a69311a03010c00022a2a293b1a21010e0e0c000303042a3502b4293c1a19010e0e0c00032a3c1a0f010c00032b3c1a07010c0003220e2a1a06010e0e0e0c00032e352f36293b1aff000c00030312293c1afd000e0e0c00031afd002a69640261293b1afb000c00030310293c1ae1000e0e0c00033b2a69640247293c1a91000e0e0c00032c2a22130e0c00032f220e1ab6000e0e0e0c00031acd000e0e0c0002030d1acb002d691ace002a696402012c2a2a692d3c1a98000e0c00032a2a69270529302509250926071ebf3b270702020400652927041aa7002a693b3e3b3b2d68052704440e0e0e000000000000000020010000000000000000000000000000|@4360,I15,I107,I232,@4361,@4364,I251,I240,I253,I113,I106,@4361,I234,I218,@174,@175,@4359| 4359:O2|3,@4366 4360:S16|566563746f722e707265747479283329 4361:O2|@4362,0 4362:O2|3,@4363 4363:S4|2e2e2e5d 4364:O2|@4365,0 4365:O2|3,93 4366:S9|66726f6d4c6973745b 4367:O4|0,@4368,3,1 4368:O1|@4369 4369:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2508,@14301,I253| 4370:O4|0,@4371,3,1 4371:O1|@4372 4372:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2508,@14301,I253| 4373:O2|3,@4374 4374:S8|6c6f63616c73203d 4375:O2|3,@4376 4376:S6|61726773203d 4377:O2|@4381,0 4378:O2|@4379,0 4379:O2|0,@4380 4380:O5|@4190,218,218,0,0 4381:O2|3,@4382 4382:S8|5573616765536574 4383:O2|@4493,@4345 4384:D46,2472|008732350a100050055f00ff0448097f0322006d0953098703b603e30338050404210547032403e8033236333734382b2d220d220d220d220d220d220d220d1a6e090e0e0e0c000a2b220d220d220d220d220d220d220d220c0c000928052b2b2e6b27050fd1323633373438220c39343b1a44090e0c0003293b1a43090c000303051a430902242928403b1a42090e0e0e0c0004220d3c2b3b2e1a3b090c000650291a3b090c0002502964220c3b1a07090c0003293b1a07090c000303051a070902242928403b1a06090e0e0e0c0004220e3c2b3b2e1aff080c000650291aff080c00025029642e221122112211221122112211221122100e0c000922103b1ab6080e0e0e0c0003293b1ab3080c000303051ab30802282928403b1ab2080e0e0e0c000422123c2b3b2e1aab080c000650291aab0802024f080c000250296422113b1a73080c0003293b1a73080c000303051a730802242928403b1a72080e0e0e0c000422133c2b3b2e1a6b080c000650291a6b080c0002502964292c69311a66080e0e0e0c00023b2a1a63080c000322173b1a22080e0e0e0c00032a2a1a57080c00036503041a5608103b50323b22183c2d1a22080e0e0e0c000650301a27080c00023b2a1a27080c000322173b1ae6070e0e0e0c00032a2a1a1b080c00036503041a1a08103b50313b22183c2d1ae6070e0e0e0c0006220f220c221a220c221b2216221f221d221d221d221d1af7070c000c0402002a2a1af4070e0c00035029352a36302a69221b221d221c221c1ae5070e0e0c0006291ae4070e0c00021ae5070e0e0c000203043b5002041adf071029362c2a1adf070c0003332d6929291abc070e0c00021abd070e0e0c0002031d29352a362a222322251ac2070e0e0e0c000450292503511e293b6502013b642219222322232223222322232223222322220e0e0c00092e1a74070e0c00021a75070e0e0c000203043b5002041a8707102e35293b1a87070c000303042213024d221335280d1a76070e0e0e0c0003032f2213362214372b1a6c070e0c00022b3b1a5b070c0003030329020b292c1a5e070e0e0e0c0003280d2a2d6a2704020e291a53070c0002280d2a22166a643c2c302c221d6805271d0fd43236333734382a220c220c220c220c220c220c220c340c000928102d2b2d6b27040fce32363337343829220c220c220c220c220c220c220c340e0c00092c220d220d220d220d220d220d220d220c0c0009280f2a2e2d6b27050fd132363f2a69640fcb323633372934343434343434330e0e0c00092b220c220c220c220c220c220c220c340e0c000928082a2c6a27040fcd323629352a362b372c382d392e3a2f2306221022102210221022102210221056f70e0e0e0c000f402a69650fdd1a83060fdd3236292b343434343434341a7b06020287050c000a28112a69650fdd323633373c2a69293b69293b1a360602026a050e0e0e0c000303032c020b2c2a1a52060e0e0e0c0003652c220c220c220c220c220c220c220c56b71a3f060c000b0402002a3b2a1acb0502042f052d050e0e0c00021ac5050e0e0c000203043b5002041a1f06102a352b36293b1ad5050e0e0c000303562a353c1ac8050202fc040e0c000303043b5002041aff05102a362c3b2a1a7e050e0e0e0c00021a7d050e0e0c000203172a352b362a2c692a2a2505250526031e233b660203bf04290202ba04652f2a452b462603020e2a2c692a2a2505250526031e925002029e04260429352a362a3b1a5b050c00030303290205280d2b2b6a27060fcd3236333734382b2b2b220e220e220e220e220e220e220e56d8220f0e0e7b0c0d000b32362933333333333333320e0e0c0009280e2a69650fcf3236292b343434343434341a53050c000a280c2a69650fd5323633372d3b1a58040e0c0003293c1a87040c00032f3b2b1a36050e0e0e0c0004502f3b1a3a040e0e0e0c0003220c3b1a2e040e0e0e0c0003293b1a2b040c000303051a2b0402242928403b1a2a040e0e0e0c0004220e3c2b3b2e1a23040c000650291a23040c0002502964220d3b1aef030c0003293b1aef030202b3030c000303051aeb0302242928403b1aea030e0e0e0c0004220f3c2b3b2e1ae3030c000650291ae3030c0002502964292c69220d3b1aac03020278030e0c0003293b1aa7030c000303051aa70302282928403b1aa60302025a030e0e0e0c0004220f3c2b3b2e1a9b030c000650291a9b030c0002502964220f3b1a67030c00033b292b1a56040e0e0e0c000303033b022a293c1a86030e0e0e0c000322122a3c1a31040e0e0c0004502a3c1a36040e0e0e0c00032502501e363b646422123b1a22030e0e0e0c000322133b3c1a05040e0e0c000450220d291a71030e0e0c00021a71030e0e0c0002039729352a362a35293b1af7030c000303033c0214221a3b1ae1020e0e0c00032a2a1ae7030c00036403041ae603103b50293c1afe020e0e0e0c0003221b2a3b1aa9030e0e0c0004502a3b1ab6030e0e0e0c000303033c021422173b1a9d020e0e0c00032b2a1aa3030c00036403041aa203103b502a3c1aba020e0e0e0c000322182a3b1a65030e0e0c0004502c250626051ea33b270502013b64220f221922192219221922192219221922180c0009220f22191a65030e0e0c000322193b1a3a020e0e0e0c0003293b1a37020c000303051a370202242928403b1a36020e0e0e0c0004221b3c2b3b2e1a2f020c000650291a2f020c0002502964221a3b1afb010c0003293b1afb010c000303051afb0102242928403b1afa010e0e0e0c0004221c3c2b3b2e1af3010c000650291af3010c0002502964292c69221b3b331aab020c000450341ae3010c00023b2a1ae3010c0003221c3b1aa2010e0e0e0c00032a2a1ad7010c00036503041ad601103b50220c3b221d3c2d1aa1010e0e0c00062b3b6922102a6964221f2221222022201ac9010e0e0c0006291ac8010e0c00021ac9010e0e0c000203252936291ab4010e0c00021ab5010e0e0c0002030d2936293b1acf010c00036402013b6402013b03043b5002041a4b021029352a362935291a80010e0c00021a81010e0e0c00021a79010e0e0c000203043b5002041a2b02102b291a5d010e0e0c00021a5d010e0e0c0002031d29352a362a2227221d222a1a10020e0c000550292503511e2a3b6502013b64221c220d1a00020e0c000329222022292229222922292229222922291af0010e0c000a221e1aef010c00022a2a1ad7010c00033b22122b6a311af3000c00021af5000e0e0c00021aed000e0e0c000203032902062809322b3b6b27230239323633373e2b2b6a65022e323633372a34343434343434330e0e0c000928072a2c6a6602143236292d3231220c321a9001320e0e7b080b00071f080e0e0e0e0e0e000000000000000098090000000000000000000000000000|@4386,@4387,I253,I113,I49,I11,I195,I47,I15,I106,I233,@4390,@4392,@3360,@4394,I105,I218,@1715,@4408,@4416,@1712,I251,@4411,@4419,@4410,@4421,@4422,@4424,@4426,@4457,@4459,@4461,I255,I247,I239,I234,I231,@1614,@4463,@4465,@4468,@4471,@2702,@4477,@4479,@4385| 4385:O1|@4481 4386:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129 4387:O1|@4388 4388:D4,120|0088331a7a000e0e0e0c00021a79000e0e0c000203403335343629220c220c220c220c220c220c220c220c1a62000e0e0e0c000a2b352c362a220e220e220e220e220e220e220e22160c0009292b69292e69270702013b1f090e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@4389,I105,I218,@4387| 4389:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296d617072696768742832292829 4390:O4|11,@49,0,@4391 4391:O5|@1391,210,0,210,0 4392:O1|@4393 4393:D14,376|008a220c1a79010e0e0c00021a79010e0e0c000207cd220c35220d362a352b36220f1a6b010c00023b2a1a6b010c000322103b1a6a010e0e0e0c00032a2a1a67010c00036503041a6601103b5022103b22113c2d1a61010e0e0c000650220e1a2e010e0e0e0c00023b2a1a2b010c0003220f3b1a2a010e0e0e0c00032a2a1a27010c00036503041a2601103b50220f3b22103c2d1a21010e0e0c00062d220e22132212221022102210221022160c000922123b1aea000e0e0e0c0003293b1aff000c000303051aff0002282928403b1afe000e0e0e0c000422143c2b3b2e1ad700020276000c000650291aeb000c000250296422123b1aa7000c0003293b1abf000c000303051abf0002242928403b1abe000e0e0e0c000422143c2b3b2e1a97000c000650291aaf000c0002502964292c692e3369292b69220d221b221b221b221b221b221b221b221b221b221b1a8f000c000c2a2a69271002013b1f0b0e0e000000000000000068010000000000000000000000000000|@1399,I105,I218,I15,I106,I253,I233,@4390,I195,I113,I49,I11,I47,@4392| 4394:O1|@4395 4395:D19,592|00842e3b1a51020e0e0c000303051a4f020fcd2e3b1a50020e0c0003030c2e1a4e021a53020c000302013b03043b5002041a4c02102e28403b1a4c020e0c00043b302a1a4a020e0e0e0c000303043b50029c313b2a1a40020e0c00021a41020e0e0c000203642a352b362a362e1a28020e0c00021a29020e0e0c000203033c0210291a23020c00022f2a1a23020c00036403041a2202103b50292f1a22020e0e0e0c0003293b1aaf010c000364030b2c3c1a14020e0c000302012c2b2a2506250626041e6f3b2704020129652b2b2b1afe010e0e0e0c0004502a3c1aea01020219000e0e0e0c00032502501eaa5050291ae5010e0e0c00025029642e3b1ac0010e0c0003293b1a4f010c000303051a4f010fcd293b1a50010e0c0003030c291a4e011a53010c000302013b03043b5002041a4c01102928403b1a4c010e0c00043b2b2a1a4a010e0e0e0c000303043b50029c333b2a1a40010e0c00021a41010e0e0c000203642a352b362a352e1a28010e0c00021a29010e0e0c000203033c0210291a23010c00022f2a1a23010c00036403041a2201103b50292f1a22010e0e0e0c0003293b1aaf000c000364030b2c3c1a14010e0c000302012c2b2a2506250626041e6f3b2704020129652b2b2b1afe000e0e0e0c0004502a3c1aea00020219000e0e0e0c00032502501eaa5050291ae5000e0e0c00025029643b33291a97000c00021a99000e0e0c0002031729362b3c1ab3000c0003292b25042504511e223b6502012a65332b2b3333311ab000220c0e7b080b0007000000000000000040020000000000000000000000000000|@4397,I113,I49,I233,72057594037927935,I234,@4398,I11,I232,I105,I218,I15,I247,@599,I253,I106,I255,I47,@4396| 4396:O1|@4400 4397:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129 4398:O4|4,@127,0,@4399 4399:O5|@601,147,0,147,0 4400:D5,88|0085301a5a000e0e0e0c00021a59000e0e0c00020325303531362a32323232321a4d000e0e0c00072a33333333331a47000c00072a2a69270402013b1f060e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@4401,@4396| 4401:O1|@4402 4402:D12,336|008530353136311a4e010e0e0e0c00023b3b292c1a49010e0e0c000303032a02c7293c1a42010e0e0e0c0003220c2b1a3e010e0e0e0c0003293b1a3b010c000303033c026729220d1a2d010e0e0c000303033c02572b1a27010c00021a29010e0e0c000203033c02102f1aeb000c00022c2a1aeb000c00036403041a1201103b502f2c1aea000e0e0e0c0003293b1ae7000c0003641af0000e0c000203033c020b343b1aca000e0e0e0c000303032c022b2b3b1ac2000e0e0e0c000303071ad7002d6902172b3c1ad6000e0e0e0c00033b2a6928062a3c6a29306966292c2505250526031ed23b66652f1a6b000c00022a3b292c1a69000e0e0c000303032a022f293c1a62000e0e0e0c0003332b1a5f000c00032b2a2e22113422111a89000e0e0c0007292c2505250526031e3a3b6627071f060e0e0e0e000000000000000040010000000000000000000000000000|@4404,I15,I247,I239,I253,I113,I105,I218,@599,@4405,I107,@4403| 4403:O1|@4406 4404:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129 4405:O3|6,@577,1 4406:D12,216|00852f3b1ad9000e0e0c000303033c029c2f2e1aca000e0e0e0c000303033c028c301ac3000c00021ac5000e0e0c000203033c02102c1abf000c0002312a1abf000c00036403041abe00103b502c311abe000e0e0e0c0003293b1a83000c0003641a8c000e0c000203033c0240303b1aa6000e0e0e0c000303033c02142b3b1a8e000e0e0e0c0003312a1a93000c00036403041a9200103b50303c1a92000e0e0e0c00032c2a1a67000c00036403032e020c3d316928062a3c6a293169651f060000000000000000c8000000000000000000000000000000|@4407,I113,I105,I218,I15,I247,@599,I253,I234,I231,@1586,I106| 4407:S96|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129283329 4408:O1|@4409 4409:D10,208|00812c3b1ad1000e0e0c000303172b3b1ac5000e0e0c000303043b5002041abf00103b02902c352d362d1abb000c00021abd000e0e0c000203043b5002041ab700102d352e362c352d362c3b1a89000e0e0c000303032a02492a35280d1a78000e0c0003032f2a362b372e1a92000e0e0e0c00022b3b1a5f000c0003030329020b292c1a82000e0e0e0c0003280d2a2d6a2704020d2c1a77000c0002280d2a2d6a64292b692f2e1a6e000e0e0e0c00032a2a692709430e0e0000000000000000c0000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@4411,@4413,@4410,@4408| 4410:O1|@4415 4411:O1|@4412 4412:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363c2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4411| 4413:O1|@4414 4414:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4413| 4415:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363c2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4410| 4416:O1|@4417 4417:D12,416|00822d352e362e3b1a9d010e0e0c00033b292b1a9a010e0e0e0c000303043b5002a2293c1a91010e0e0c0003312a1a77010c00032b1a88010e0c00021a89010e0e0c000203033c02102e1a83010c00022c2a1a5b010c00036403041a7a01103b502e2c1a42010e0e0e0c0003293b1a6f010c000303032a02212a3b1a62010e0e0e0c000303032902112a2a1a5a010e0e0e0c000303032a0201292d3c1a19010e0e0c0003220c2a2c1a45010e0e0c0004502e3c1a42010e0e0e0c0003250626051eaf2605502e3b1ade000e0e0e0c00033b292b1ada000e0e0e0c000303033b02a4293c1ad2000e0e0e0c0003312a1ab7000c00032b1ac8000e0c00021ac9000e0e0c000203033c02102e1ac3000c00022c2a1a9b000c00036403041aba00103b502e2c1a82000e0e0e0c0003293b1aaf000c000303032a02212a3b1aa2000e0e0e0c000303032902112a2a1a9a000e0e0e0c000303032a0201292d3c1a59000e0e0c0003220c2a2c1a85000e0e0c0004502e3c1a82000e0e0e0c0003250626051eaf3b2705270544000000000000000090010000000000000000000000000000|@4418,I253,I247,I106,I105,I218,I15,@599,I113,I234,I255,I239| 4418:S71|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f646528332961646446726f6d5361766564283129 4419:O1|@4420 4420:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4419| 4421:O1|11 4422:O1|@4423 4423:D4,112|0088331a72000e0e0e0c00021a71000e0e0c000203393335343629220c220c220c220c220c220c220c220c1a5a000e0e0e0c000a2b220c220c220c220c220c220c220c22140c0009292b69270402013b1f090e0e0e0e0e0e000000000000000060000000000000000000000000000000|@4389,I105,I218,@4422| 4424:O1|@4425 4425:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4424| 4426:O1|@4427 4427:D25,1112|0089341a5a040e0e0e0c00021a59040e0e0c000207db3435220c362a353c1a4f040c000303702a362a220e220e220e220e220e220e220e220e220e1a3a040e0e0e0c000b2a220e220e220e220e220e220e220e22160c00092935280d1a11040e0e0c0003032629362a373c2a69292e69293b1afb030c000303032c020b2c2a1afe03220d7e150003270402073c2a69292c6964660fd52a353d1ad4030e0c000307cb2a36293b2a1ab6030e0e0e0c00021ab5030e0e0c000203312a352b362a3629372d3b1aa9030e0e0c0003030329020b292e1ab2030e0e0e0c00032c2a2507250726051e3e3b2705020129652a29020244031a6a030e0e0e0c00021a69030e0e0c000203b329352a362a35293b1a7f030c000303033c021422103b1a79030e0e0c00032a2a1a77030c00036403041a7603103b50293c1a76030e0e0e0c000322112a1a52030e0e0e0c0003293b1a67030c0003651a10030e0c000203041a5f03103b50293b1a27030204c70229010e0e0c000303033c0214220c3b1a19030e0e0c00032a2a1a17030c00036403041a3603103b50293c1a16030e0e0e0c0003220d2a3b1a29030e0e0c0004502b250526041ec43b270402013b642c2210221022102210221022102210221022101aa7020c000b323b1abf020c0003293c1acf020c0003343b2b1ae6020e0e0e0c0004502d221322132213221322132213221322131ad3020c000a291ad4020e0c0002291ad4020e0c000231220e22162216221622162216221622161ac4020e0c000a2922151ac2020e0e0e0c0003291a20020e0c00021a21020e0e0c00021a19020e0e0c0002031c303b1a15020e0e0c000303032b020b2b311a960222117e19000302223d2a69313b1af6010e0e0e0c000303032c020b2c321a7e020e0e0e0c00032a2a6965270b0fcd2a362b372a3b1aef010c000303033c0214220c3b1ae9010e0e0c00032b2a1ae7010c00036403041ae601103b502a3c1ae6010e0e0e0c0003220d2a1ac2010e0e0e0c0003293b1ad7010c0003651a80010e0c000203041a1f02103b502a3b1a97010c000303033c0214313b1a92010e0e0e0c00032b2a1a8f010c00036403041aae01103b502a3c1a8e010e0e0e0c0003322a3b1aa2010e0e0e0c00042d2211221122112211221122112211221122111a2e010e0e0e0c000b2d3b1a3b010c000303033c0218220f3b1a35010202cd000e0e0c00032e2a1a2f010c00036403041a2e01103b502d3c1a2e010e0e0e0c000322102a1a0a010e0e0e0c0003220c3b1afe000e0e0e0c0003293c1a0b010c0003220e3b2b1a21010e0e0c0004502b3b1afe000e0e0e0c0003030c301a52010e0e0e0c000202013b03032d025e302215221522152215221522152215221d0c0009323b1aa3000c000303033c021422143b1a9d000e0e0c0003332a1a9b000c00036403041aba00103b50323c1a9a000e0e0e0c000322152a3b1aad000e0e0c0004503b342c306b2931696627096502013b1f0a0e0e0e0e0e0e000000000000000048040000000000000000000000000000|@4429,I105,I218,I251,@4426,@4430,@4432,I234,I253,I231,@1586,I106,I113,@4434,@1614,I255,@4437,@4439,@4441,@4443,@4445,@4448,@4450,@4452,@4428| 4428:O1|@4455 4429:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129 4430:O1|@4431 4431:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4430| 4432:O1|@4433 4433:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4432| 4434:O4|@14322,@596,@4436,@4435 4435:O5|@4190,500,0,500,0 4436:S21|6170706c79466e3a20416c72656164792075736564 4437:O1|@4438 4438:D4,104|0088331a6a000e0e0e0c00021a69000e0e0c000203353335343628062b693434343434343422130e0e0c00092a220d220d220d220d220d220d220d220d1a40000e0c000a2a2a69270402013b1f090e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@4437| 4439:O1|@4440 4440:D5,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a3528061a67000c0003030d2a37293c1a5b000c00036402013b0310291a56000e0e0e0c00022b2a6964020a291a46002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I251,@4439| 4441:O1|@4442 4442:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363c2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4441| 4443:O1|@4444 4444:D4,128|0088331a82000e0e0e0c00021a81000e0e0c0002034d333534362a352b3629352a362b372c382d392e3a2f23062213221322132213221322132213221b0c000f2b2a3b6a2d221022102210221022102210221022101a40000e0c000a2a2a69270702013b1f090e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@4443| 4445:O1|@4446 4446:D12,232|00812c1aea000e0e0e0c00021ae9000e0e0c000203b12c352d362a352b362a3b1add000e0e0c000303033c02142f3b1ad6000e0e0e0c00032b2a1ad3000c00036403041ad200103b502a3c1ad2000e0e0e0c0003302a1aaf000c0003293b1ac7000c0003030a2d321ac500337e0a00032c3b1a8b000c000303033c0214313b1a86000e0e0e0c00032d2a1a83000c00036403041aa200103b502c3c1a82000e0e0e0c0003322a3b1a96000e0e0e0c0004502d2d2c6a2f341a76000e0e0e0c00032a2a69270902013b430e0e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@4447,I105,I218,I234,I253,I231,@1586,I106,I113,@4445,@1614,I255| 4447:S98|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129636f7079456e7472696573283129 4448:O1|@4449 4449:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4448| 4450:O1|@4451 4451:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4450| 4452:O4|@14322,@596,@4454,@4453 4453:O5|@4190,462,0,462,0 4454:S30|636f70794465636c61726174696f6e733a20416c72656164792075736564 4455:D10,504|00802b350a100022002200a501d70133003600d401cc0014012200220022003101220022002200d9002b3528091ad0012d0e0e0e7e0300030fdd3c0fdc2b362c3729353e1ab9010e0e0c000303812936291ab4010e0c000203041ab301103b5028662a1ab2010e0e0e0c0003035d28672a1aac010e0c0003291aac011ab1010e0e0c0003291aa0011a75010e0e0c00036503352b291a70010e0c00021a99010e0e0c0002031e29352a362a35291a90010e0c0002640309292503511e273b02013b6502013c6402013b02013b6402013b650fcc2b36291a67012d0e0e7d0400022b3629291a21010e0e0c00021a49010e0e0c0002031d29352a362a1a42010e0e0e0c00020309292503511e273b02013b6502013c6502c8c600c4002b362c372a1a1d010e0e0c0002030a291a12012e0e7d0500023b6502a72b362c372a291ac7000c00021af1000e0e0c0002034629352a362a353c1aa8000e0c0003030d2a36291adc000e0c000264021a2a353d1a8f000c000303033c020c2a37291ac1000e0e0c0002640309292503511e4e3b02013b6502013c640310291aa4002e02023e000e0e0e7d0500023b6502332b362c372d382b1a8a000e0e0e0c000203192a1a7e000e0e0e0c0002030a291a72002f0e7d0600023b02013b6602043c02013c420000000000000000e8010000000000000000000000000000|@4456,I251,I105,@1363,I150,I153,1610612736,I243,I218,@4428| 4456:S50|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7369646545666665637446726565283129 4457:O4|@14322,@596,@4293,@4458 4458:O5|@4190,567,0,567,0 4459:O4|@14322,@596,@4296,@4460 4460:O5|@4190,569,0,569,0 4461:O1|@4462 4462:D4,120|0088331a7a000e0e0e0c00021a79000e0e0c000203403335343629220c220c220c220c220c220c220c220c1a62000e0e0e0c000a2b352c362a220e220e220e220e220e220e220e22160c0009292b69292e69270702013b1f090e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@4389,I105,I218,@4461| 4463:O1|@4464 4464:D11,200|00812c1aca000e0e0e0c00021ac9000e0e0c000203912c352d362a35293b1abf000c000303033c02142e3b1aba000e0e0e0c00032a2a1ab7000c00036403041ab600103b50293c1ab6000e0e0e0c00032f2a1a93000c00032b3b1a83000c000303033c0214303b1a7e000e0e0e0c00032c2a1a7b000c00036403041a8a00103b502b3c1a7a000e0e0e0c0003312a3b1a7e000e0e0e0c00042e331a7b000c00032c2a69270802013b430e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@1399,I105,I218,I234,I253,I231,@1586,I106,@1614,I255,@4463| 4465:O4|@14322,@596,@4467,@4466 4466:O5|@4190,409,0,409,0 4467:S15|636f6d707574654b696c6c53657473 4468:O4|@14322,@596,@4470,@4469 4469:O5|@4190,410,0,410,0 4470:S14|4e6f74206b696c6c4265666f7265 4471:O1|@4472 4472:D10,280|00832e3528061a17010c000303043b5002041a1301102e3629353e1a02010e0e0e0c0003032a2e3b1a05010e0e0c00033b2a1a03010c00036403041a0201103b502e3c2f1a01012f0e0e0e7b0507000429353d1aca000e0e0e0c000303422936293b1aeb000c000303033c02142d3b1abe000e0e0e0c00032a2a1abb000c00036403041aba00103b50293c1aca000e0e0e0c00032e2a311aae00317b0509000429353b1a7a000e0e0e0c000303043b5002041aab00102936293c1a9b000c0003293b1a8b000c000303033c0214303b1a5e000e0e0e0c00032a2a1a5b000c00036403041a5a00103b50293c1a6a000e0e0e0c0003312a321a4e00327b050a0004000000000000000008010000000000000000000000000000|@4474,I251,@4473,I253,I231,@1614,I255,I234,I106,@4473| 4473:O4|@14322,@596,@4476,@4475 4474:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129657874656e644c696665283129 4475:O5|@4190,421,0,421,0 4476:S14|4e6f7420616e2045787472616374 4477:O1|@4478 4478:D4,120|0088331a7a000e0e0e0c00021a79000e0e0c000203453335343629220c220c220c220c220c220c220c220c1a62000e0e0e0c000a2b352c362a352b3629221022102210221022102210221022180c00092b2a2e6a293069270902013b1f090e0e000000000000000068000000000000000000000000000000|@4389,I105,I218,@4477| 4479:O1|@4480 4480:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4479| 4481:D12,1296|008530353c1a10050e0c000307d13036303b1a0b050c0003293c1a0b050c0003323b2b1a0a050e0e0e0c000450313b1aee040e0e0e0c00033b2a1afb040c00036403041afa04103b50313c1ad2040e0e0e0c0003293b1aef040c0003640313303b1abc040e0c00031ae5040e0e0c000202013b333b1aa8040e0c0003333b1a9f040c00033b2a1aaf040c00036403041aae04103b50333c1a86040e0e0e0c0003293b1aa3040c000303032a02212a3b1a96040e0e0e0c000303032902112a2a1a96040e0e0e0c000303032a020129220c3b1a4c040e0c00033b2a1a5b04020224000c00036403041a7604103b50220c3c2b1a3c040e0c0004503c306928062a2f6a27080fd430353e1a0d040e0e0c000307c92f3b1a09040e0e0c0003293c1a07040c0003313b2b1a06040e0e0e0c000450303b1aea030e0e0e0c00033b2a1af7030c00036403041af603103b50303c1ace030e0e0e0c0003293b1aeb030c00036403132f3b1ab8030e0c00031ae1030e0e0c000202013b323b1aa4030e0c0003323b1a9b030c00033b2a1aab030c00036403041aaa03103b50323c1a82030e0e0e0c0003293b1a9f030c000303032a02212a3b1a92030e0e0e0c000303032902112a2a1a92030e0e0e0c000303032a020129343b1a4903020414032b000c00033b2a1a53030c00036403041a7203103b50343c2b1a39030e0e0c00045028061a66032e6a27060fcf30353d1a0a030e0e0e0c000307d23036303b1a03030c0003293c1a03030c0003323b2b1a02030e0e0e0c0004502b3b1a1e030e0e0e0c000303033c02142f3b1ad6020e0e0e0c00032c2a1ae3020c00036403041ae202103b502b3c1ac2020e0e0e0c0003302a1aaf020c0003293b1acf020c00036503472b3b1ad4020e0c000303033c02142e3b1a8e020e0e0e0c00032c2a1a9b020c00036403041a9a02103b502b3c1a7a020e0e0e0c00032f2a1a67020c0003641a90020e0c000202013b333b1a54020e0c00032d3b1a8302020216020c000303033c0218313b1a3a020202a7000e0e0e0c00032e2a1a43020c00036403041a4202103b502d3c1a22020e0e0e0c0003322a1a0f020c0003293b1a2f020c000303032b02212b3b1a22020e0e0e0c000303032902112b2a1a22020e0e0e0c000303032b020129303b1a11020e0e0c000303033c0214343b1aca010e0e0e0c0003312a1ad7010c00036403041af601103b50303c1ab6010e0e0e0c0003220c2a2c1ab1010e0e0c0004503d326928062a316a270a0fcf3036303b1a88010e0c0003293c1a87010c0003323b2b1a86010e0e0e0c0004502b3c1a72010e0e0e0c0003293b1a97010c000303033c0214323b1a52010e0e0e0c00032a2a1a5f010c00036403041a5e01103b50293c1a3e010e0e0e0c0003332a1a2b010c0003293b1a4b010c0003660313303b1a18010e0c00031a41010e0e0c000202013b2c3c1a0c010e0c0003343b1afb000c00032e3c1afb000c0003293b1a23010c000303033c0214220c3b1add000e0e0c00032a2a1aeb000c00036403041aea00103b50293c1aca0002028d000e0e0e0c0003220d2a1ab2000e0e0e0c0003293b1acf000c000303032c02212c3b1ac2000e0e0e0c000303032902112c2a1ac2000e0e0e0c000303032c0201292e3b1ab1000e0e0c000303033c0214220f3b1a69000e0e0c00032f2a1a77000c00036403041a9600103b502e3c1a56000e0e0e0c000322102a2c1a51000e0e0c0004503b346928062a336a270c1f060e0e0e0e0e0e0e000000000000000000050000000000000000000000000000|@4482,I251,I253,I106,I255,I231,@1586,I113,I218,I234,@1614,@577| 4482:S66|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296c6f6361646472283129 4483:O2|@4484,@4345 4484:D17,344|008d3b220d291a57010c00021a59010e0e0c0002031729362b3c1a53010c0003292b25042504511e223b6502012a65293c1a3c010e0c0003293b1a3b010c000303033c020b291a37011a3c010e0c000303041a3b01103b50293c1a13010c00032928403b1a31010e0e0c0004293b2d1a2e010e0e0e0c00045022132a2211220f0e0c000422125667220f220f220f220f220f220f220f1a0f010c000a291a10010e0c00022c3b1a0f010c00033b2a293b1a0d010e0e0c000303032a0233293c1a06010e0e0e0c00032a3c1afb000c0003293c1a9b000c0003322a1adb000c0003292f69292e2507250726051e3d3b270565291a6b000c00021a6d000e0e0c000203043b5002041ac7001029352a1a50000e0c00021a51000e0e0c000203043b5002041ab300102a362f221a2f221a221a221a30221b316809270b1f0e0e0e0e0e000000000000000048010000000000000000000000000000|@4486,I105,I218,I106,I234,72057594037927934,I231,@1603,I11,I255,@4487,@4485,I253,I251,I240,@1712,@1715| 4485:O1|@4489 4486:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f70794c616d626461283729 4487:O1|@4488 4488:D4,112|0088331a72000e0e0e0c00021a71000e0e0c0002033d3335343629220c220c220c220c220c220c220c220c1a5a000e0e0e0c000a28062c69220c220c220c220c220c220c220c22140e0c0009292b69270402013b1f090e0e000000000000000060000000000000000000000000000000|@4389,I105,I218,@4487| 4489:D6,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a3528061a5f000c000303043b5002041a5b00102a362b3728062b2b6a2c1a55000e0e0c00022a2a69270602013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I251,@4490,@4485| 4490:O4|@14322,@596,@4492,@4491 4491:O5|@4190,647,0,647,0 4492:S11|6d617020636c6f73757265 4493:D21,896|0089303b1a81030e0e0c0003293b1a7f030c000303051a7f0302242928403b1a7e030e0e0e0c0004323c2b3b2e1a78030e0c000650291a77030c0002502964313b1a44030e0c0003293b1a43030c000303051a430302242928403b1a42030e0e0e0c0004333c2b3b2e1a3c030e0c000650291a3b030c0002502964220e220d220d220d220d220d220d220d56c70c0009220c3b1af2020e0e0e0c0003293b1aef020c000303051aef0202242928403b1aee020e0e0e0c0004220e3c2b3b2e1ae7020c000650291ae7020c0002502964220d3b1ab3020c0003293b1ab3020c000303051ab30202242928403b1ab2020e0e0e0c0004220f3c2b3b2e1aab020c000650291aab020c0002502964292c69311aa6020e0e0e0c00023b2a1aa3020c000322133b1a62020e0e0e0c00032a2a1a97020c00036503041a9602103b50323b22143c2d1a62020e0e0e0c000650301a67020c00023b2a1a67020c000322133b1a26020e0e0e0c00032a2a1a5b020c00036503041a5a02103b50313b22143c2d1a26020e0e0e0c000622162216221622162216221622162216121600010001000e0e0c000922153b1ade010e0e0e0c0003293b1adb010c000303051adb0102242928403b1ada010e0e0e0c000422173c2b3b2e1ad3010c000650291ad3010c000250296422163b1a9f010c0003293b1a9f010c000303051a9f0102242928403b1a9e010e0e0e0c000422183c2b3b2e1a97010c000650291a97010c0002502964292c69293b69332a69642219221b221a221a1aa4010e0c0006291aa4010e0c00021aa5010e0e0c000203252936291a90010e0c00021a91010e0e0c0002030d2936293b1a8b010c00036402013b6402013b03043b5002041a7f011029352a362935220d221e22201a77010c000422232221222122212221222122212221122100010001000e0e0c00092d3b1a43010c000303042214024d221435280d1a32010e0e0e0c0003032f2214362215372f1a38010e0c00022b3b1a17010c0003030329020b292c1a2a010e0e0e0c0003280d2a2d6a2704020e2d1a1f010c0002280d2a22176a642c3b1ae8000e0c00030304220c024d220c35280d1ad6000e0e0e0c0003032f220c36220d372e1adc000e0c00022b3b1abb000c0003030329020b292c1ade000e0e0e0c0003280d2a2d6a2704020e2c1ac3000c0002280d2a220f6a643d2c2c2c6b271b1f0a000000000000000070030000000000000000000000000000|@4495,I253,I113,I49,I11,I195,I47,I15,I106,I233,@4390,@4394,I105,I218,I251,@4496,@4416,@4411,@4498,@4410,@4494| 4494:O1|@4500 4495:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f7079436f6e64283329 4496:O4|@14322,@596,@4467,@4497 4497:O5|@4190,693,0,693,0 4498:O1|@4499 4499:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4498| 4500:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4494| 4501:O2|@4503,@4502 4502:O2|@4594,@4501 4503:D129,2784|00802b350a11000a05ea020606660666022400de0876084304170a89063e04b60482058a044a01a20096022b362c372d382b2d1ab20a0e0e0e0c0003291ab00a0e0c00021ab10a2a693b3c3c3b2d6805291aac0a0e0c000203041aab0a103b502e310e0e0e0c00022e3b1aa30a0c000303051aa30a02031aa60a2b3b691aa80a2a692b2a691aa80a2a692e2a693b3e3b3b2d6805291a680a0e0c000203041a670a103b5029270f0fcb2b362c372d382b3b1a840a0e0c0003030c1a830a2c1a870a0c000302012b293d1a840a0e0c00032b3b1a630a0c0003030c1a630a2c1a670a0c000302012b293d1a640a0e0c0003291a640a691a680a2a692d2a691a680a2a6927071a690a0e0e0c00023e2a69291aed090e0e0c000203041aeb09103b502c2f0e0e0e0c0002291a4c0a691a500a2a692c2a693b3e3b3b2d6805291ac0090e0c000203041abf09103b5029270a0fd72b362c372d382a352b353b3b292c1a260a0e0e0e0c000303032a0274293c1a1e0a020251090e0e0e0c00032f360402002c28082b1a100a0e0c00045029352a362c2b1a0a0a0e0e0e0c00033c2b1a070a0c00032a2a1a070a0c0003293b1a5f090c0003641a000a0e0c0002293b1a4f090c0003030332020b323c1a7a090e0e0e0c00032932250b250b26091e7f3b270965293c1a69090e0e0c00032c3c1a5f090c0003291ac80969282f2a692c2a691ac5092a6927051a66090e0e0e0c00023e2a69291ae9080e0e0c000203041ae708103b502e3202029d080e0e0e0c000231330e0e0e0c0002291a9409691a98092a691a9b092a691a9e092a692e2a69302a693b3e3b3b2d6805291aa3080c000203041aa308103b502927110fd52b36293c1adc080e0c00031a75092a1a79090e0e0c00033e2a69291a75080e0e0c000203041a7308103b502927040fd02b361a5e0928281a51090e0e0c00033e2a69291a4d080e0e0c000203041a4b08103b502b2d1a43090c0003291a44090e0c00022b2a693b3c3c3b2d6805291a22080e0e0e0c000203041a1f08103b502927070fd22b362c372d382e39291a03080c00021ab5080e0e0c000203312935293b1a27080c0003030c1a27082a1a2b080c0003020129293d1a28080e0c00031ae9082a1ac5080e0e0c0003660217293c1ad007020283070e0c000303051ad30802031ad608291ada08691ade082a69651a10080e0c00023e2a69291a9507020258070e0e0c000203041a8f07103b502e300e0e0e0c00022e311ab7080c00032e320e0e0e0c0002293b691aae082a691ab1082a693b3c3b3b2d6805291a54070e0c000203041a5307103b501a9d081aa2081a3708020202070c000329287d1a2a080e0e0e0c00033e2a69291a25070e0e0c000203041a2307103b50293b691a7a082a692e2a691a7a082a69293b1a13070c00030304220c020a220c2a1a6c080e0c00031a6d082a691a70082a691a73082a6922112a6922132a693b3c3c3b2d6805291ace060e0e0e0c000203041acb06103b5029271b0fd71a50080fd42b362c372a2c0e0c00022a2d0e0e0e0c0002291a4008691a44082a691a47082a692d2a691a47082a693b3e3b3b2d6805291a82060e0e0e0c000203041a7f06103b5029270a0fdd2b36292b0c0002291a2408691a28082a693b3c3c3b2d6805291a53060c000203041a5306103b502927050fda2b361a0e0828281a31070e0e0c00033e2a69291a2d060e0e0c000203041a2b06103b502b2d1af3070c0003291af4070e0c00022b2a693b3c3c3b2d6805291a02060e0e0e0c000203041aff05103b502927070fd32b362c37292c1ace070204a905a7050e0c0003291ac8070e0c00021ac9072a693b3c3c3b2d6805291ac4050e0c000203041ac305103b502e300e0e0e0c0002291aac07691ab0072a691ab3072a691ab6072a692e2a693b3e3b3b2d020257056805291a8a050e0e0e0c000203041a8705103b5029270d0fd02b362c371a900728281a630602022e050c00033e2a69291a5d050e0e0c000203041a5b05103b502c56571a72070e0e0e0c00032c2f0e0e0e0c0002291a6807691a6c072a69293b1a3d050e0e0c000303032c020f2c2a1a5e070202e1040e0e0e0c00032e2a693b3c3c3b2d6805291a06050e0e0e0c000203041a0305103b5029270b0fca2b362c372d382b2d0c00022b2e0e0e0e0c00022b2f0e0e0e0c0002291a1c07691a20072a691a23072a692d2a691a23072a691a26072a69312a691a26072a693b3c3c3b2d6805291aa90402026c040e0e0c000203041aa304103b5029270f0fda2b36291a05070e0e0c00023e2a69291a81040e0e0c000203041a7f04103b5029660fce2b3629352a362b372c382d392e3a2f23063023073123083e3169291a52040e0e0e0c000203041a4f04103b502b3b1a4f040c000303051ab70602031aba061abf062a1a23050202ee030c00033e2a69291a1d040e0e0c000203041a1b04103b502f3c1a5b040c00031a9d062a1af9040e0e0c00033e2a69291af5030e0e0c000203041af303103b50343c1a33040c00031a7d062a1ad1040e0e0c00033e2a69291acd030e0e0c000203041acb03103b50220f1a630602027e030c00021a61062a693b3c3b3b2d6805291aa403020267030e0c000203041a9f03103b50220d1a47060c00021a49062a693b3c3b3b2d6805291a7c030e0c000203041a7b03103b5022133b1a7a030e0e0e0c000303051a770302031a7a03293b691a1c062a693b3c3b3b2d6805291a47030c000203041a4703103b501a090628281a2c040e0c00033e2a69291a29030e0e0c000203041a2703103b50221c22211aed050e0e0c0003291aec050e0c00022b2a693b3c3c3b2d6805291afa020e0e0e0c000203041af702103b50222222250e0c0002291ac805691acc052a692c2a69332a691ac9052a6922102a691ac8052a6922152a691ac7052a69221a2a69221e2a6922222a691abe052a6922272a691abd052a691ac0052a693b3c3c3b2d6805291a93020c000203041a9302103b502927360fd12b362c37293c1aca020e0e0e0c00031a99052a1a65030e0e0c0003291a94051a59030e0e0c00033e2a69291a55020e0e0c000203041a5302103b502e300e0e0e0c0002291a7405692b2a693b3b3b3b2d6805291a2d020e0e0c000203041a2b02103b5029270a0fd22b362c372a353e1a21020e0e0c000303362903051a440502031a4705291a4b05691a4f052a69641a61020e0e0c00023e2a69291ae5010e0e0c000203041ae301103b5029660fd32a353c1ade010e0e0e0c000303472a362a03051a1e0502031a01052a3c1a0402020277010e0c00032a1a1005692a2a691a11052a69661a0b020c00023e2a69291a91010e0e0c000203041a8f01103b50292704029a2a353b1a89010e0e0c000303472a362a03051ae20402031aad042a3c1ab0010e0c00032a1ad804692a2a691ad9042a69661abb0102020e010c00023e2a69291a3d010e0e0c000203041a3b01103b5029270402462a362a03051ab30402031a66042a3c1a69010e0e0c00032a1aa804692a2a691aa9042a69661a730102021a000c00023e2a69291af5000e0e0c000203041af300103b502927046502a92b362c372d382903051a7e0402031a81043e2a69291aca000e0e0e0c000203041ac700103b502c2f0e0e0e0c00021a690428281aa4010e0c00033e2a69291aa1000e0e0c000203041a9f00103b5030321a4f040c0003291a50040e0c00022b2a693b3c3c3b2d6805291a76000e0e0e0c000203041a7300103b50291a3404691a38042a69312a691a38042a69342a693b3c3b3b2d6805291a48000e0c000203041a4700103b50292712420000000000000000d00a0000000000000000000000000000|@4505,@4506,@4511,@4513,I105,@1363,I251,@4510,@4508,@871,@871,I234,@410,I106,@243,@2853,@2854,@2855,@104,@900,@871,I247,I239,I104,I252,I245,I243,I218,@2856,@2857,@900,@871,@872,@901,@4515,@122,@4516,@4517,@4519,@4521,@4522,@4523,@4524,@4526,@4527,@871,@4529,@4531,@4532,@871,@871,@4533,@871,@873,@871,@2864,@869,@871,@2866,@2868,@900,@2870,@2872,@4535,@4537,@4539,@4544,@2922,@900,@901,@873,@901,@4546,@4547,@900,@871,@4549,@900,@901,@4551,@901,@4551,@4552,@2946,@4554,@4555,@4556,@4557,@4558,@4559,@4562,@4564,@4567,@4569,@4571,@4572,@4574,@4576,@871,@871,@871,@871,@871,@871,@4579,@4581,@2854,@869,@4582,I48,@4583,@4584,@4582,@4583,@4585,@4582,@4583,@4586,@4582,@4583,@4587,@4588,@4589,@4590,@4591,@4504,@869,@871,@871| 4504:O1|@4593 4505:S33|4261636b656e64496e7465726d656469617465436f64652e707265747479283129 4506:O1|@4507 4507:D11,248|00812c1afa000e0e0e0c00021af9000e0e0c000203c72c352d36293b1af1000e0e0c000303452a352b362a300e0c00022a3b1adb000c000303051adb0002031ade00293b691ae0002a692c2a693b3c3b3b2d6805291aa8000e0c000203041acf00103b50293b692708026f2a352b362a300c00022a3b1a97000c000303051a970002031a9a00293b691a9c002a692c2a693b3c3b3b2d6805291a64000e0c000203041a8b00103b50291a8c00693b3b3b3b2d6805291a48000e0c000203041a6f00103b5033220f1a76000e0e0e0c00031a75002a692b2a69270c6502013b430e0000000000000000e8000000000000000000000000000000|@4509,I105,I218,I251,@4510,@4508,@871,@1363,@1511,@4506,@871| 4508:O2|3,71 4509:S34|4261636b656e64496e7465726d656469617465436f64652e704c6973742833292829 4510:O2|3,70 4511:O1|@4512 4512:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4511,@900| 4513:O2|3,@4514 4514:S2|2428 4515:S10|434f4e5441494e455220 4516:S9|524543434f4e535452 4517:O1|@4518 4518:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@4509,I105,I218,I251,@1511,@1363,@4517,@871| 4519:O1|@4520 4520:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4519,@900| 4521:S4|54414720 4522:S4|574f5244 4523:S3|494e54 4524:O2|@4525,0 4525:S2|2028 4526:S5|4341534520 4527:O1|@4528 4528:D14,360|00812c1a6a010e0e0e0c00021a69010e0e0c000207d22c352d36293b1a61010e0e0c000303792a352b36293b1a59010e0e0c0003030c1a57012a1a5b010c0003020129293d1a58010e0c000329283a1a56010e0e0e0c00033e2a69291a11010e0e0c000203041a4701103b502e340e0e0e0c0002293b691a3e012a692c2a693b3c3c3b2d6805291ae6000e0e0e0c000203041a1b01103b50293b69270b02a72a352b36293b1ae0000e0c0003030c1adf002a1ae3000c0003020129293d1ae0000e0c000329283a1ade000e0e0e0c00033e2a69291a99000e0e0c000203041acf00103b502e3402025f000e0e0e0c0002293b691ac2002a692c2a693b3c3c3b2d6805291a6a000e0e0e0c000203041a9f00103b50291aa800693b3b3b3b2d6805291a4c000e0c000203041a8300103b50220d22121a91000e0e0c00031a91002a692b2a69270f6502013b430e0e0e0e0e000000000000000058010000000000000000000000000000|@4509,I105,I218,I251,I234,@410,I106,@243,@122,@1363,@871,@1511,@4527,@871| 4529:O2|3,@4530 4530:S5|454c53453a 4531:S3|29207b 4532:S4|43415345 4533:O1|@4534 4534:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4533| 4535:O1|@4536 4536:D11,248|00812c1afa000e0e0e0c00021af9000e0e0c000203c72c352d36293b1af1000e0e0c000303452a352b362a300e0c00022a3b1adb000c000303051adb0002031ade00293b691ae0002a692c2a693b3c3b3b2d6805291aa8000e0c000203041acf00103b50293b692708026f2a352b362a300c00022a3b1a97000c000303051a970002031a9a00293b691a9c002a692c2a693b3c3b3b2d6805291a64000e0c000203041a8b00103b50291a8c00693b3b3b3b2d6805291a48000e0c000203041a6f00103b5033220f1a76000e0e0e0c00031a75002a692b2a69270c6502013b430e0000000000000000e8000000000000000000000000000000|@4509,I105,I218,I251,@4510,@4508,@871,@1363,@1511,@4535,@871| 4537:O1|@4538 4538:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4537,@900| 4539:O1|@4540 4540:D16,480|00812c1ae2010e0e0e0c00021ae1010e0e0c000207d22c352d36293b1ad9010e0e0c000303b12a352b362a352b362c372b3c1acb010c00032a3c1ac3010c0003291ac40169287b2a692c2a691ac1012a6927051ac2010e0e0e0c00023e2a69291a85010e0e0c000203041ab301103b502c220c0e0e0c0002293b691aaa012a692c2a693b3c3b3b2d6805291a5a010e0e0e0c000203041a8701103b50333b1a57010c000303051a870102031a8a01293b691a8c012a692c2a693b3c3b3b2d6805291a24010e0c000203041a5301103b50293b6927110fd62a352b362a352b362c372b3c1a1a010202d7000e0e0e0c00032a3c1a0b010c0003291a0c0169287b2a692c2a691a09012a6927051a0a010e0e0e0c00023e2a69291acd000e0e0c000203041afb00103b502c220c0e0e0c0002293b691af2002a692c2a693b3c3b3b2d6805291aa2000e0e0e0c000203041acf00103b50333b1a9f000c000303051acf0002031ad200293b691ad4002a692c2a693b3c3b3b2d6805291a6c000e0c000203041a9b00103b50291abc00693b3b3b3b2d6805291a50000e0c000203041a7f00103b50221322181aa50002020f000e0e0c00031aa1002a692b2a6927156502013b430e0e0e0e0e0000000000000000d0010000000000000000000000000000|@4509,I105,I218,I251,@243,@4542,@4541,@104,@1363,@871,@4510,@4508,@871,@1511,@4539,@871| 4541:S6|4445434c2023 4542:O2|@4543,0 4543:S8|20757365737d203d 4544:O1|@4545 4545:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4544,@900| 4546:S5|424c4f434b 4547:O1|@4548 4548:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@4509,I105,I218,I251,@2926,@1363,@4547,@871| 4549:O1|@4550 4550:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4549| 4551:O2|3,@2854 4552:O2|3,@4553 4553:S3|494628 4554:S5|66616c7365 4555:S4|74727565 4556:S3|434c3d 4557:S4|2043523d 4558:S8|204c4f43414c533d 4559:O1|@4560 4560:D8,136|00802b1a8a000e0e0e0c00021a89000e0e0c000203522b352c36293b1a81000e0e0c0003031a2a3b1a75000e0e0c000303051a730002031a7600293b696402252a3b1a5b000c000303051a5b0002031a5e002a1a62000e0e0e0c00021a61002a692b2a69666502013b420e0e0e0e0e0e000000000000000078000000000000000000000000000000|@4561,I105,I218,I251,@4510,@4508,@4559,@871| 4561:S50|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172675479706573283129 4562:O2|3,@4563 4563:S5|415247533d 4564:O1|@4565 4565:D8,152|00802b1a9a000e0e0e0c00021a99000e0e0c000203672b352c36293b1a91000e0e0c000303242a3c1a8d000e0e0c00033e2a69291a69000e0e0c000203041a7f00103b50293b696502302a3c1a69000e0e0c00033e2a69291a45000e0e0c000203041a5b00103b502b1a5c000e0c00021a5d002a692b2a6927046502013b420e000000000000000088000000000000000000000000000000|@4566,I105,I218,I251,@243,@1363,@4564,@871| 4566:S49|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172674c696665283129 4567:O2|3,@4568 4568:S9|4152474c495645533d 4569:O2|3,@4570 4570:S4|5245533d 4571:S6|20434c4f533d 4572:O1|@4573 4573:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@4509,I105,I218,I251,@1511,@1363,@4572,@871| 4574:O1|@4575 4575:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4574,@900| 4576:O2|@4577,0 4577:O2|3,@4578 4578:S9|297b4c414d4244417d 4579:O2|3,@4580 4580:S7|4c414d42444128 4581:S9|494e44495245435428 4582:S6|2c206c617374 4583:O2|41,0 4584:S10|52454355525349564528 4585:S5|434c4f5328 4586:S6|504152414d28 4587:S6|4c4f43414c28 4588:S11|4b494c4c4245464f524528 4589:S10|4b494c4c414654455228 4590:S6|204b494c4c3d 4591:O1|@4592 4592:D8,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203532c352d36293b1a81000e0e0c0003030c2a2e0e0c0002293b696402342a2e0e0c0002291a6c00693b3b3b3b2d6805291a48000e0c000203041a5f00103b502c311a5f000c00031a61002a692b2a6927056502013b430e0e0e0e0e000000000000000078000000000000000000000000000000|@4509,I105,I218,I251,@1511,@1363,@4591,@871| 4593:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4504,@900| 4594:D13,272|00802b353c1a10010e0c0003030a2b362956272d7d0400022b353d1afa000e0e0e0c000303572b361af50028281af8000e0c00033e2a69291af5000e0e0c000203041af300103b502b56471af2000e0e0e0c0003291af0000e0c00022b2a693b3c3c3b2d6805291ac6000e0e0e0c000203041ac300103b5029270702762b362c372d382b3c1ac8000e0c00032a3c1abf000c0003291ac00069287b2a692c2a691abd002a6927051abe000e0e0e0c00023e2a69291a79000e0e0c000203041a7700103b502c56670e0e0c0002293b691a9e002a692c2a693b3c3b3b2d6805291a4e000e0e0e0c000203041a4b00103b5029270a420e0e0e0e000000000000000000010000000000000000000000000000|@4596,I251,@4597,@122,I105,@1363,@4598,@4595,@243,@4542,@4541,@104,@871| 4595:O1|@4604 4596:S40|4261636b656e64496e7465726d656469617465436f64652e70726574747942696e64696e67283129 4597:S6|4d555455414c 4598:O1|@4599 4599:D13,360|00812c1a6a010e0e0e0c00021a69010e0e0c000207d82c352d36293b1a61010e0e0c000303792a352b362c372b3c1a57010c00032a3c1a4f010c0003291a500169287b2a692c2a691a4d012a6927051a4e010e0e0e0c00023e2a69291a11010e0e0c000203041a3f01103b50402d69330e0c0002293b691a36012a692c2a693b3c3b3b2d6805291ae6000e0e0e0c000203041a1301103b50293b69270a02ab2a352b362c372b3c1ade000e0e0e0c00032a3c1ad3000c0003291ad40069287b2a692c2a691ad1002a6927051ad2000e0e0e0c00023e2a69291a95000e0e0c000203041ac300103b50402d693302025d000e0c0002293b691ab6002a692c2a693b3c3b3b2d6805291a66000e0e0e0c000203041a9300103b50291a9c00693b3b3b3b2d6805291a48000e0c000203041a7700103b50220c22111a85000e0e0c00031a85002a692b2a69270e6502013b430e000000000000000058010000000000000000000000000000|@4509,I105,I218,I251,@243,@4542,@4541,@104,@1363,@871,@4600,@4598,@871| 4600:O2|@901,@4601 4601:O2|@4602,0 4602:O2|3,@4603 4603:S5|20414e4420 4604:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4595,@900| 4605:O1|@4606 4606:D11,416|00822b1aa2010e0e0e0c00023f28413b1a9d010e0e0c00043b2a693c28402b1a8e010e0e0e0c00043c28403b1a81010e0e0c00043c28403b1a75010e0e0c00043c28403b1a69010e0e0c00043c28403b1a5d010e0e0c00043c28403b1a51010e0e0c00043c28403b1a45010e0e0c00043c28401a42011a37010c00043c28403b1a2d010e0e0c00043c28403b1a21010e0e0c00043c28403b1a15010e0e0c00042210291a1a010e0e0e0c00021a19010e0e0c0002032429352a362a35291a10011a15010e0e0c00036403052a68010207292503511e323b6502013b64293b1af7000c000303691af700291ad3000c00021ad5000e0e0c0002032429352a362a35291acc001ad1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ab3000c000303041abb00103b50293529351a99001a9e000e0e0e0c000303043b5002041aa70010293765021a293529351a7a001a7f000c000303043b5002041a8b00102937643431220e220d221734221a3333220d22122214221b2212220e680f2710440e000000000000000090010000000000000000000000000000|@4608,@4607,I11,536870911,I105,I218,@14396,I251,@2781,@2836,@1576| 4607:O2|@4609,@14408 4608:S27|494e54434f4445434f4e5328292e636f6465437265617465283329 4609:D9,152|00802b291a99000e0e0c00021a99000e0e0c0002032429352a362a352956571a8e000e0e0e0c00036403052a68010207292503511e313b6502013b64293b1a6f000c000303051a6f00021c2935293556371a5c000e0c000303043b5002041a5f00103b502937643c28401a5b001a60000e0c00041a61002a2c6a292704420e0e000000000000000088000000000000000000000000000000|@4611,I105,I218,I251,@4612,@1576,I48,I11,@4610| 4610:D16,352|008056073b1a60010e0c0003292d1a5f010c0003291a60010e0c00020402003b3b2c1a5b010c00032a2a1a5b010c00036403113b2c2e6a2a3b2f6a2c2b452a462603026f2c1a48010e0c000203032c02142928081a29010e0e0c00032d2a1a37010c00036429401a1e010e0e0e0c00031a2d010e0e0c000264030f293c1a00010e0c000325011e660229293b1a19010e0e0c00033b2a2f6a2d3b1ae3000c0003292d1a03010c00032d2a326a2f2d452a4626065029352a362936293b1af1000e0e0c000364031e2a352b362c371ae8000e0c000456773b2b1ae5000e0e0c0004503b64025f2a352b362c371aca000e0e0e0c00043e2a69291a95000e0e0c000203041ac300103b503b50296556780e0e0e0c00025056673b1ab5001aa2000e0e0e0c000450293c3b1aad000e0e0c000429352a362b371a7f000c00046430320e7d0900022706420e000000000000000050010000000000000000000000000000|@4615,I253,@122,I223,I239,I251,I105,I252,I218,I240,I113,@1359,I255,@1363,I48,@4614| 4611:S26|5072657474792e67657453696d706c655072696e746572283129 4612:O1|@4613 4613:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 4614:O1|@4616 4615:S40|5072657474792e67657453696d706c655072696e7465722831297072696e7453747265616d283129 4616:D10,256|00822b1a02010e0e0e0c00021a01010e0e0c0002037a2b352e352f363037301ae6000e0e0e0c0002030c303b1ae9000e0e0c000302013b03043b5002041ae000102c1ac3000c0002030c2c3b1ac9000e0e0c000302013b03043b5002041ac00010302d1ac2000e0e0e0c0003292c1abf000c00036403043b5002041aba0010302c1aa4000e0c0003292e2c6a270502562d352e362f372f1a6e000e0e0e0c0002030c2f3b1a71000e0e0c000302013b03043b5002041a6800102f2b1a72000e0e0e0c000303043b5002041a7300102f2c1a55000e0e0c00032b311a6b000c00032a2a2d6a2705440e0000000000000000f0000000000000000000000000000000|@4618,I105,I218,I231,@46,I239,I248,@4619,@4617,I240| 4617:O4|11,@49,0,@4621 4618:S35|566563746f72536c6963654f7065726174696f6e7328292e737562736c696365283329 4619:O4|11,@49,0,@4620 4620:O5|@204,131,0,131,0 4621:O5|@204,121,0,121,0 4622:D1,32|00813c561769430e000000000000000010000000000000000000000000000000|@4623| 4623:S23|494e5447434f444528292e636f646567656e2835292d45 4624:O4|@4625,@14411,@14412,@14410 4625:D23,1144|00843c28403b1a77040c0004293b1a77041a7c040e0c000450280628403b1a5f040c0004293b28051a65040e0e0c0004503c2a693c28402b1a45040e0e0c0004293b693c28403c1a36040e0e0e0c00043c28403b1a29040e0e0c000433287e1a36040e0e0e0c000303043b5002041a2f04103b50287e341a2e040e0e0e0c0003220d35293b1a28040e0c0003220f37292b3b1a23040c00042211352c3c1a08040e0c00032a3b2b1ae6030e0e0e0c0004502f3c1af2030e0e0e0c0003221435293b1aec030e0c00032216372c3b1ac8030e0c0003030c1b00012d1acb030c000302012c291ad9030e0e0c00020303290207291ad3030c00022928ff1ad2030e0e0e0c00032c2e2b1aae030e0e0e0c0004221b352f3c1a90030e0c00032a3b2b1a6e030e0e0e0c000450221e3c3b3b2220221822212224221a221a222422231a97030c000d22123b1a66030e0e0e0c000303033b0fca3b221d1a85030e0e0c0003030c221c3e1a78030e0c000302013b03992841221d1a30030e0c0003293b1a67030c000322203b3c1a65030e0e0c000422211a63030c0002222235293b1a10030e0c00032224372e3b1aec020e0c0003030c1b00012f1aef020c000302012e291afd020e0e0c00020303290207291af7020c00022928ff1af6020e0e0e0c00032c2e2b1ad2020e0e0e0c00042229352f3c1ab4020e0c00032a3b2b1a92020e0e0e0c0004503b270d0fd23b221d1ad0020e0c00030310221c28fe1ac30202021b020c000302013b03c1221e3b3d1ac0020e0c0004221f1abf020c0002222035293b1a6c020e0c0003222237292b281f1a66020e0e0e0c00042224352c3c1a48020e0c00032a3b2b1a26020e0e0e0c000450222635293b1a37020c000322283722273b1a13020c000303101b000122281a16020e0e0e0c000302022227291a20020e0c00020303290207291a1b020c00022928ff1a1a020e0e0e0c00032c2e2b1af6010e0e0e0c0004222d352f3c1ad8010e0c00032a3b2b1ab60102025e010e0e0e0c0004503b27110fca221e3b3e1aff010c0004221f1aff010c0002222035293b1aac010e0c0003222237292b280d1aa6010e0e0e0c00042224352c3c1a88010e0c00032a3b2b1a66010e0e0e0c00045022243d2a1b00011ac5010e0e0c0003293b1ac3010c000303033c0214293b1abe010e0e0e0c00033c2a1abb010c000364030329020a291b00011a3b010c0003222a35293b1a38010e0c0003222c372c3b1a14010e0c0003030c1b00012d1a17010c000302012c291a25010e0e0c00020303290207291a1f010c00022928ff1a1e01020286000e0e0e0c00032c2e2b1af6000e0e0e0c00042231352f3c1ad8000e0c00032a3b2b1ab6000e0e0e0c000450343c1a22010e0e0e0c000303033b0249220c3b1a19010e0e0c0003293c1a17010c00030304220d020a220d28ff1ad7000c0003291b00011a05010e0e0c0003220e3c1ac2000e0e0e0c00032a2a25112511260f2000013b27042715221f121c0001000100121d0001000200121e00010003001ad20022200e0e0e7b06210005000000000000000068040000000000000000000000000000|@4627,I11,@4628,I255,I234,@4646,I106,I253,@4650,I105,I152,I243,@4675,I232,I107,@4684,@4682,I110,I113,I231,I251,I109,@4626| 4626:O1|@4843 4627:S21|494e5447434f444528292e636f646567656e283529 4628:O1|@4629 4629:D16,320|00802b363c1a40010e0c000303051a3f010fdd2b353b2a1a3e010e0e0e0c00036403051a3a010fdd2b363c1a1a010e0e0e0c000303051a2f010fdd2b3529352d363c1a2b010c00032a2a691a2a013b1a2e010e0e0e0c00032a2a0e0e0e0c00026429353b1af1000e0e0c000303992939291a14010e0c00021a15010e0e0c0002035f29361a01010e0e0c00021a01010e0e0c000203482935353e1abb000c000303312935362928281aad000e0e0c000303033c021b29287b1a9d000e0e0c000303033c020b29285b1a8d000e0e0c00036402013b1ab9000e0e0c000202013b02013b031d2a1ab000691ab4002a69020230001ab3002a693b3e3c3b2d68056602012a6402031b0029293b691aa2002a691aa5002a693b020208003c3b3b2d68052709420e0e0e0e0e000000000000000030010000000000000000000000000000|@4631,I234,@1338,I251,@4632,@1338,I107,@14301,I253,I105,I218,@900,@901,@873,@871,@4630| 4630:O5|0,0,0,@4641,@4640 4631:S14|7072696e742d646563456e747279 4632:O5|0,0,0,@4634,@4633 4633:O2|@4638,0 4634:O2|@4635,0 4635:O2|0,@4636 4636:O5|@4637,226,226,0,0 4637:S49|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f494e5447434f44452e4d4c 4638:O2|3,@4639 4639:S5|456d707479 4640:O2|@4644,0 4641:O2|@4642,0 4642:O2|0,@4643 4643:O5|@4637,225,225,0,0 4644:O2|3,@4645 4645:S9|537461636b41646472 4646:O4|@14322,@596,@4648,@4647 4647:O5|@4649,1254,0,1254,0 4648:S35|67656e456e746572496e7450726f633a20746f6f206d616e7920617267756d656e7473 4649:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f494e54434f4445434f4e532e4d4c 4650:O1|@4651 4651:D31,456|00822d3b1ac9010e0e0c00032935293c1ac5010e0e0c000303041ac301103b502a36291ac2010e0e0e0c0002293b1abf010c0003030c1abf012a1ac3010c000302012928082a1abf010c0003323b1a9f010c0003032a323c1ab5010e0e0c0003291ab401691ab8012a69651aba010e0e0e0c00021ab9011abe012b1ac2016b103b50322a1a69010e0e0c00030326321ab6010e0e0e0c00020303320207321aaf010c00022d2a341aae01220c0e0e0e7b050c00042d3b1a1f010c00031aa1010e0e0c000203041a9f01103b503e2b1a37010c0003333b1a97010c0003293c1af7000c0003030334020b3428071a89010e0e0c00032928081a86010e0e0e0c0003293c1afb000c00032d2a1a7b010c000303032d020129291a2e010e0e0e0c00020303290207291a27010c0002293b1aa7000c000303033c020b291a53011a58010e0c000303041a5701103b50293c3b1a56010e0e0e0c00043b2a693c28402b1a46010e0e0e0c000422142a220c3b1a3f010c00055022131ace000e0e0e0c000203042213020a22131ac5000e0e0c00022c2a22151ac1000e0e0c00045022153b2d1a14010e0c0004503b2711440e0e0e0000000000000000b8010000000000000000000000000000|@4653,I253,I251,@4654,I15,I234,@410,I106,I108,@243,@4658,@4660,@104,@14322,@596,@4661,I105,I152,I254,I218,@4662,I231,I107,I109,I233,72057594037927935,I247,@2408,I11,@4652,I255| 4652:O1|@4665 4653:S19|434f44455f5345472e63736567536574283329 4654:O4|@14322,@596,@4656,@4655 4655:O5|@4657,223,0,223,0 4656:S42|637365675365743a2063616e2774206368616e6765206c6f636b656420636f646520736567656d656e74 4657:S49|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42797465436f64652f434f44455f5345472e4d4c 4658:O2|@4659,0 4659:S25|206f7574206f662072616e676520302e2e696e66696e697479 4660:S15|637365675365743a20496e64657820 4661:O5|@4657,240,0,240,0 4662:O4|@14322,@596,@4664,@4663 4663:O5|@4657,247,0,247,0 4664:S34|637365675365743a2063616e277420657874656e6420636f6465207365676d656e74 4665:D25,504|00832e3b1af9010e0e0c00032935293b1af5010e0e0c000303192f3b1ae1010e0e0c00032935293b1add010e0e0c00036502013b6403043b5002041ad2011029362f3b1aba010e0e0e0c000329362b1ac6010e0e0e0c0002293b1ac3010c0003030c1ac3012a1ac7010c00030201292b1aa5010e0e0c0002293b1aa3010c0003030c1aa3012a1aa7010c000302012928082c1aa3010c000328082b1a9a010e0e0e0c00032808220d1a8d010e0e0c00032a220f1a8a010e0e0e0c0003220f3b1a5e010e0e0e0c000303033c020b2c22101a4d010e0e0c00030336220f3c1a68010e0c00032d3c1a5f010c0003293b691a5e012a692c2a691a5e012a6927051a5f010c00021a61011a66012b1a6a016b103b502a3b1a09010e0e0c000303033c020b292b1afa000e0e0e0c000303362a3c1a15010e0e0c00032a3c1a0b010c0003293b691a3a012a692c2a691a3a012a6927051a0b010c00021a0d011a12012b1a2e016b103b502a3b2922121a2a010e0e0e0c000303033b0260291a23010c00020303290207291a1f010c0002220d2a1a1e010e0e0e0c00032c1a04010e0c000203032c02072c1aff000c0002220d2a2c1a05010e0e0c0004502c3c1a72000e0e0e0c00032e3c1a67000c0003292b2507250726051e6c3b2705270e1f040e0e0e0000000000000000e8010000000000000000000000000000|@4667,I253,I251,@4668,I15,I234,@410,I106,I108,I107,@243,@4671,@4672,@104,@14322,@596,@4673,@4671,@4674,@4666,I113,I105,I152,I252,I254| 4666:O5|@4657,191,0,191,0 4667:S23|434f44455f5345472e63736567436f7079536567283429 4668:O4|@14322,@596,@4670,@4669 4669:O5|@4657,198,0,198,0 4670:S49|63736567436f70795365673a2063616e206f6e6c7920636f7079206265747765656e206279746520736567656d656e7473 4671:S17|206f7574206f662072616e676520302e2e 4672:S25|63736567436f70795365673a2042797465206c656e67746820 4673:O5|@4657,177,0,177,0 4674:S25|63736567436f70795365673a2042797465206f666673657420 4675:O5|@4677,@4808,@4816,@4824,@4676 4676:O2|@4830,@4675 4677:D57,6968|008b2e3b1a391b0e0e0c0003220e350a11009e10d406f5118015df012400e118d115e8084e00b0157e088c0d0e11140db20071005403220e36220f372210382b2b2b6a2922112210221022102210221022102210221056fa0e0c000b27040fd4220e3729220f220f220f220f220f220f220f220f220f220f220f220e0e0c000d640fd2220e36220f37293c693e2c3b6a293c69293b692c2a6928052a1aa91a3c6b292216221622162216221622162216221622162216221622150e0e0e0c000d27080fd4220e36220f372210382b3528111a7c1a0e0c000303412b362a3c3c22122212221222122212221222122212221222110e0e0c000d2a3b3b2f3322142214221422142214221422142214221d1a461a0e0e0e0c000f650fcc2b3c3c22112211221122112211221122112211221122100202e7170e0e0e0c000d2a3c3c22122212221222122212221222122212221222110202c6170e0e0c000d2c351aff193b292c1a011a0e0e0c000303032a026a293c1afa190e0e0e0c000330360402002c28082b1af0190e0c00045029352a362c2b1aea19020283170e0e0e0c00033c2b1ae3190c00032a2a1ae3190c0003293b1a9b190c0003641adc190e0c0002293b1a8b190c00030303320201312932250b250b26091e743b2709653b3b3022112d1abb19020205000c00062704660fcb220e36313b3e1aae190e0e0e0c0004321aac190e0c00023335293b1a31190e0e0c0003220c37292b3f1a9b190c0004220e352c3c1a98190e0c00032a3b2b1a96190e0e0e0c000450313d2a1b00011a8e190e0e0e0c0003293b1a8b190c000303033c0214293b1a86190e0e0e0c00033c2a1aeb180c000364030329020a291b00011a4b190c0003221435293b1ac0180e0c00032216372c3b1a5c190e0c0003030c1b00012d1a27190c000302012c291a4d190e0e0c00020303290207291a47190c00022928ff1ad61802025f160e0e0e0c00032c2e2b1aee180e0e0e0c0004221b352f3c1ae8180e0c00032a3b2b1ae6180e0e0e0c000450343c1aea180e0e0e0c000303043b500247220c3b1ae0180e0c0003293c1a47180c00030304220d020a220d28ff1ae7180c0003291b00011ae5180e0e0c0003220e3c1ad2180e0e0e0c00032a2a25112511260f2001012604260d220f3b1af7170c0003293c1a6f180c000322113b2b1a6d180e0e0c0004503b270b0fd5220e363b2a291a81180e0e0c00021a21180e0e0c0002031729362b3c1a3b180c0003292b25042504511e243b6502012a652a291a54180e0c00021af5170e0e0c0002032929352a362a3c3c22132213221322132213221322132213221322120c000d2a250426031e353b6602013b643d2b1a36180e0e0e0c0003030c2a3f1a29180e0e0c000302013b039d28692b1ac9170e0e0c0003293d1aff170c0003220c3b3c1a9d170e0e0c0004220d1a9b170c0002220e35293b1a20170e0c00032210372e3b1abc170e0c000303101b00012f1a87170202e0140c000302012e291aa9170e0e0c00020303290207291aa3170c00022928ff1a32170e0e0e0c00032c2e2b1a4e170e0e0e0c00042215352f3c1a48170e0c00032a3b2b1a46170e0e0e0c0004503b270d0fce3b2b1a7d170e0e0c0003030c2a28fe1a70170e0c000302013b03c1333b3d1af9160e0e0c0004341af8160e0c0002220c35293b1a7c160e0c0003220e37292b28681ae6160e0e0e0c00042210352c3c1ae0160e0c00032a3b2b1ade160e0e0e0c000450221235293b1a47160c0003221437220c3b1ae3160c000303101b0001220d1aae160e0e0e0c00030202220c291ad0160e0c00020303290207291acb160c00022928ff1a5a160e0e0e0c00032c2e2b1a76160e0e0e0c00042219352f3c1a70160e0c00032a3b2b1a6e1602025e010e0e0e0c0004503b27110fca333b3e1a38160e0c0004341a38160e0c0002220c35293b1abc150e0c0003220e37292b28671a26160e0e0e0c00042210352c3c1a20160e0c00032a3b2b1a1e160e0e0e0c000450323d2a1b00011a16160e0e0e0c0003293b1a13160c000303033c0214293b1a0e160e0e0e0c00033c2a1a73150c000364030329020a291b00011ad3150c0003221635293b1a48150e0c00032218372c3b1ae4150e0c0003030c1b00012d1aaf150c000302012c291ad5150e0e0c00020303290207291acf150c00022928ff1a5e15020286000e0e0e0c00032c2e2b1a76150e0e0e0c0004221d352f3c1a70150e0c00032a3b2b1a6e150e0e0e0c000450343c1a72150e0e0e0c000303033b0249220c3b1a69150e0e0c0003293c1acf140c00030304220d020a220d28ff1a6f150c0003291b00011a6d150e0e0c0003220e3c1a5a150e0e0e0c00032a2a25112511260f2001013b27042715333b1a7f140c00032c3c1a37150c00032a2a1a2f150c0003220d3b2b1aed140e0e0c0004503b27070fcf220e36220f372210382211392c2c2c2c6b3b2d291af3140c00021a95140e0e0c0002031729362b3c1aaf140c0003292b25042504511e223b6502012a650402002c1ac6140e0e0e0c00021a65140e0e0c000203222c35293b1aa7140c0003030c1acf142a1a73140c00030201292b3b452a46260302be2e1a90140e0c00021a31140e0e0c000203043b5002041aab14103b502e352936292a69040200322b2a1a68140e0c00021a09140e0e0c0002033d2a352b362a362c352d362b2b1a83140c000303032b02012a2c2b1a7d14020266110e0e0c000303032c02012a2a2a692f2a250a250a26081e4926080209292c2a35452a3646515129352a362a3b1a02140e0e0e0c0003030c1a27142b1acb130c000302012a2a3b1ae8130e0c0003030c1a0f142b1ab3130c000302012a312b452a46260929352a363e2d1a15140e0e0c00032a2c1ad3130c00032928051a8a130e0e0e0c00032b2a1aa7130c00036603232d22172217221722172217221722172217221722172217121700010001000c000d02222d22172217221722172217221722172217221722172217121700010002000e0c000d27090fcb303b3c1a12130e0e0e0c0004311a10130e0c00023235293b1a95120e0e0c00033437292b286d1aff120c0004220d352c3c1afc120e0c00032a3b2b1afa120e0e0e0c000450220e3b1a65120e0e0c0003293c1adb120c000322103b2b1ad9120e0e0c0004503b270a0fd1220e36220f37323b3c1aa2120e0e0e0c0004331aa0120e0c00023435293b1a25120e0e0c0003220d37292b28781a8e120e0e0e0c0004220f352c3c1a88120e0c00032a3b2b1a86120e0e0e0c00045022103b1af1110e0e0c0003293c1a67120202c00f0c000322123b2b1a61120e0e0c00045022133b3e1a34120e0c000422141a33120c0002221535293b1ab8110e0c0003221737292b28811a22120e0e0e0c00042219352c3c1a1c120e0c00032a3b2b1a1a120e0e0e0c000450221b35293b1a83110c0003221d37292b3b1aef110202500f0c0004221f352c3c1ae8110e0c00032a3b2b1ae6110e0e0e0c000450222135293b1a4f110c0003291a68111ac5110e0e0c00033c2a693c28402b1a36120e0e0e0c00042226230d293b1a27110c00032d2a1ac7110c00036503122226230d293b2e1a97110c0004503b6402013b22273a22283a293b1afb100c00032d2a692c3b2b1a77110c0004502e3b69222b3b1ae2100e0e0e0c0003293c1a57110c0003222d3b2b1a55110e0e0c0004502b3b6922273c3c22362236223622362236223622362236223622350e0c000d22301a13110c0002223135293b1a98100e0c0003223337292b28051a02110e0e0e0c00042235352c3c1afc100e0c00032a3b2b1afa100e0e0e0c000450223735293b1a63100c0003223937292b3b1acf100c0004223b352c3c1acc100e0c00032a3b2b1aca100e0e0e0c000450223d35293b1a33100c0003291a4c101aa9100e0e0c00033c2a693c28402b1a1a110e0e0e0c00042242230d293b1a0b100c00032d2a1aab100c00036503122242230d293b2e1a7b100c0004503b6402013b22433a22443a293b1adf0f0c00032d2a692c3b2b1a5b100c0004502e3b6922483c3b1a2d100e0e0c000422483b22441a40100e0c00045022473b3b1a34100e0c00045022493b1aa9100e0e0c0003221b291a46100e0e0e0c00021ae50f0e0e0c0002036f29352a362a3b1a8d0f0e0e0c000303043b500251224d1add0f0e0e0c0002224e35293b1a600f0e0c00032d291a07100c00021aa90f0e0e0c0002032529352a362a3b1a410f0e0e0c0003292e22561a45100e0e0c00042b250526041e30260402023b502604292503511e7d3b6502013b64224b35293b1a0d0f0e0e0c0003224d37292b3b1a770f0c0004224f352c3c1a740f0e0c00032a3b2b1a720f0e0e0e0c000450225135293b1adb0e0c0003225337292b28ff1a460f0e0e0e0c00042255352c3c1a400f0e0c00032a3b2b1a3e0f0e0e0e0c000450224e3c3c225e225e225e225e225e225e225e225e225e225d0c000d22103b1a9e0e0e0e0e0c000303033b025622581aee0e0e0e0e0c0002225935293b1a700e0e0c00032213291a160f0e0e0e0c00021ab50e0e0e0c0002032629352a362a3b1a4d0e0e0e0c0003292e22611a510f0e0e0c00042b250526041e333b270402013b270422573b3b1aae0e0e0e0e0c0004503b27520fd1220e36293c3c220f220f220f220f220f220f220f220f220f220e0e0c000d323b3c1a5e0e0e0e0e0c0004331a5c0e0e0c00023435293b1ae10d0e0e0c0003220d37292b28101a4a0e0e0e0e0c0004220f352c3c1a440e0e0c00032a3b2b1a420e0e0e0e0c000450220f3b3c1a340e0e0c0004503b270a0fce220e36220c3b1aa90d0e0e0c000303041aa70e103b503b50220c3529352a362b372d1a9d0e0e0e0c0002292b3222132213221322132213221322132213220d1a880e0e0c000d220d3b1a560d0e0e0e0c0003292e1ae30d0202240b0c0003641a980d0e0c00020384220d3b1a340d0e0c0003292e1aeb0d0c00033b2a1acb0d0c000303043b500223293c1a450e0e0e0c00031a450e2a1a490e0e0e0c00031a490e1a4e0e2b1a520e6b65103b502210230a2211230a293b1ae80c0e0c0003292d1a5f0d0c00032c3b2b1a5e0d0202af0a0e0e0e0c000450221436293b3b1a4a0d0e0e0e0c0004503b260802023b50220e1a1f0d0c0002220f35293b1aa40c0e0c000329311a5b0d0c0003291b00011a390d0e0e0c000303a8221235293b1a820c0e0e0e0c0003221437292b281e1aea0c0e0e0e0c00042216352c3c1ae40c0e0c00032a3b2b1ae20c0e0e0e0c000450221835293b1a4b0c0c0003221a37323b1ae80c0e0c0003030c1b0001331ab30c0c0003020132291ad90c0e0e0c00020303290207291ad30c0c00022928ff1a620c0e0e0e0c00032c2e2b1a7e0c0e0e0e0c0004221f352f3c1a780c0e0c00032a3b2b1a760c0e0e0e0c0004503b270f0fd4221235293b1ada0b0e0e0e0c0003221437292b28201a420c0e0e0e0c00042216352c3c1a3c0c0e0c00032a3b2b1a3a0c0e0e0e0c0004502f3d2a1b00011a320c0e0e0e0c0003293b1a2f0c0c000303033c0214293b1a2a0c0e0e0e0c00033c2a1a8f0b0c000364030329020a291b00011aef0b0c0003221c35293b1a640b0e0c0003221e372c3b1a000c0e0c0003030c1b00012d1acb0b0c000302012c291af10b0e0e0c00020303290207291aeb0b0c00022928ff1a7a0b0e0e0e0c00032c2e2b1a960b0e0e0e0c00042223352f3c1a900b02026c000e0c00032a3b2b1a8a0b0e0e0e0c000450343c1a8e0b0e0e0e0c000303033b0249220c3b1a850b0e0e0c0003293c1aeb0a0c00030304220d020a220d28ff1a8b0b0c0003291b00011a890b0e0e0c0003220e3c1a760b0e0e0e0c00032a2a25112511260f2001013b2704271322133c3b1a010b0e0e0c0004270c0fdd220e36220f37291ae60b0e0e0e0c0002292e220f220f220f220f220f220f220f220f22181ad10b0e0e0c000c333b1a5f0a0c0003220c1ac70a0c0002220d35293b1a4c0a0e0c0003292d2f6a29680132221822182c2218221822182218221822182218221822170e0e0c000d270a0fdc220e36220f372a291ac50a0e0e0c00021a650a0e0e0c000203a429352a362a353c1a0c0a0e0c000303212a36293b3c22142214221422142214221422142214221422130e0e0c000d51026a2a353b1adf090c000303422a362b37293c3c221522152215221522152215221502028e072215221522140c000d50220d3b1aa1090e0e0c000329680122122d2b1a020b0e0e0e0c00042605021d2a3629220d221156a92214221322132212221222121ae80a0e0c000b51292503511eb25102023b50502922102210221022102210221022102210221022102210220f02021f070e0e0e0c000d650fcc220e36220f372210382b3c3c22112211221122112211221122112211221122100e0e0c000d343b3e1a76090e0e0e0c0004220c1a73090c0002220d35293b1af8080e0c0003220f37292b3e1a63090c00042211352c3c1a60090e0c00032a3b2b1a5e090e0e0e0c000450221335293b1ac7080c0003221537292b3b1a33090c00042217352c3c1a30090e0c00032a3b2b1a2e090e0e0e0c000450221935293b1a97080c0003291ab0081a0d090e0e0c00033c2a693c28402b1a7e090e0e0e0c0004221e230d293b1a6f08020248060c00032d2a1a0b090c0003650312221e230d293b2e1adb080c0004503b6402013b221f3a22203a293b1a3f080c00032d2a692c3b2b1abb080c0004502e3b6922233b1a26080e0e0e0c0003293c1adb080c000322253b2b1a99080e0e0c000450221d222d222d222d222d222d222d222d222d222d222d222d222c0e0e0c000d222d3b1af6070e0e0e0c000303033b022222263b1ad5070e0e0c0003293c1a8b080c000322283b2b1a49080e0e0c0004503b6522263b1ab3070c00032903033b0fd522291a15080e0e0c0002222a35293b1a98070e0c0003222c37292b3d1a03080c0004222e352c3c1a00080e0c00032a3b2b1afe070e0e0e0c000450223035293b1a67070c0003223237292b3b1ad3070c00042234352c3c1ad0070e0c00032a3b2b1ace070e0e0e0c000450223635293b1a37070c0003291a50071aad070e0e0c00033c2a693c28402b1a1e080e0e0e0c0004223b230d293b1a0f070c00032d2a1aaf070c0003650312223b230d293b2e1a7f070c0004503b6402013b223c3a223d3a293b1ae3060c00032d2a692c3b2b1a5f07020216000c0004502e3b6922413c3b1a2d070e0e0c00042a27192f3b1ac8060e0c000303033b0252222a1a1a070e0e0e0c0002222b35293b1a9c060e0c000332291a43070c00021ae5060e0e0c0002032629352a362a3b1a7d060e0e0c0003292e22331a81070e0e0c00042b250526041e303b270402013b270422293b3b1ade060e0e0e0c00045022212232223222322232223222322232223222322232223222310e0e0c000d222a3b1a2a060e0e0e0c00032c3b1a2f060c000303033b0252222d1a82060e0e0e0c0002222e35293b1a04060e0c00032f291aab060c00021a4d060e0e0c0002032629352a362a3b1ae5050e0e0c0003292e22361ae9060e0e0c00042b250526041e303b270402013b27042e03032a02013b222d3b2b1a3f060c0004503b27280fd5220e3629321a26070e0e0e0c0003313b1a9b050c0003293c1a13060c0003333b2b1a12060e0e0e0c0004503b27040fca220e36293b1afe06220e220e220e220e220e220e220e220e56d90e0c000c640fd1220e36220f372a3c3c221022102210221022102210221022102210220f0e0c000d3b2b1a07060c0003030c2a28051afc050e0c000302013b03a528352b1a9d050e0e0c0003293b1ad3050c0003220c3b3c1a71050e0e0c0004220d1a6f050c0002220e35293b1af4040e0c00032210372e3b1a90050e0c000303101b00012f1a5b050202b4020c000302012e291a7d050e0e0c00020303290207291a77050c00022928ff1a060502028f020e0e0e0c00032c2e2b1a1e050e0e0e0c00042215352f3c1a18050e0c00032a3b2b1a1605020267020e0e0e0c0004503b270d0fce3b2b1a49050e0e0c0003030c2a28fe1a3c050e0c000302013b03c1333b3d1ac5040e0e0c0004341ac4040e0c0002220c35293b1a48040e0c0003220e37292b28231ab2040e0e0e0c00042210352c3c1aac040e0c00032a3b2b1aaa040e0e0e0c000450221235293b1a13040c0003221437220c3b1aaf040c000303101b0001220d1a7a040e0e0e0c00030202220c291a9c040e0c00020303290207291a97040c00022928ff1a26040e0e0e0c00032c2e2b1a42040e0e0e0c00042219352f3c1a3c040e0c00032a3b2b1a3a0402025e010e0e0e0c0004503b27110fca333b3e1a04040e0c0004341a04040e0c0002220c35293b1a88030e0c0003220e37292b28141af2030e0e0e0c00042210352c3c1aec030e0c00032a3b2b1aea030e0e0e0c000450323d2a1b00011ae2030e0e0e0c0003293b1adf030c000303033c0214293b1ada030e0e0e0c00033c2a1a3f030c000364030329020a291b00011a9f030c0003221635293b1a14030e0c00032218372c3b1ab0030e0c0003030c1b00012d1a7b030c000302012c291aa1030e0e0c00020303290207291a9b030c00022928ff1a2a03020286000e0e0e0c00032c2e2b1a42030e0e0e0c0004221d352f3c1a3c030e0c00032a3b2b1a3a030e0e0e0c000450343c1a3e030e0e0e0c000303033b0249220c3b1a35030e0e0c0003293c1a9b020c00030304220d020a220d28ff1a3b030c0003291b00011a39030e0e0c0003220e3c1a26030e0e0e0c00032a2a25112511260f2001013b2704271566022a220e36220f37220f3b1a51020e0e0c000303033b02132a2a220e34220d221022101ab9030e0e0c000865220e3b1a2d020e0e0c000307ca303b1a11020e0e0c0003292c1ac7020c0003313b1aff010c000303033c020b293b1a8a020e0e0e0c000303033b02a7293b1a8a020e0e0e0c00030323293c1a05030e0e0c00031a65032a1a09030e0e0c00031a09031a5e032b1a62036b65103b503b503b2a1a56020e0e0e0c000303043b500223293c1acd020e0e0c00031acd022a1ad1020e0e0c00031ad1021ad6022b1ada026b65103b5033230a34230a293b1a72010e0e0e0c0003292d1ae7010c00032c3b2b1ae6010e0e0e0c000450220e36293b3b1ad60102021b000e0e0e0c0004503b2705333b2f1ac2010e0e0e0c0004503b660fd22a3c1aaa010e0e0e0c0003313b1a1f010c0003292b1ad7010c0003323b1a0f010c000303033c020b293b1a9a010e0e0e0c000303033b02bf291a13011a98010e0c00030323293c1a15020e0e0c00031a8d022a1a19020e0e0c00031a19021a6e022b1a82026b65103b503b50291adf001a54010e0c0003030c3b220c1a30020e0c000302723b2a1a4d010e0e0c000303043b500223293c1ac5010e0e0c00031ac5012a1ac9010e0e0c00031ac9011ace012b1ad2016b65103b5034230a220c230a293b1a69000e0e0c0003292d1adf00020233000c00032c3b2b1ada000e0e0e0c000450220f36293b3c1aca000e0e0e0c0004503b2705343b2e1aba000e0e0e0c0004503b2704651f0c0e0e0e0e0e0000000000000000281b0000000000000000000000000000|@4679,I253,@4306,I251,@4680,-1,I247,I239,I104,I252,I245,I243,I218,@4732,@4684,@4682,@4650,I106,I255,I110,I113,I231,I234,I105,I152,I107,I109,I232,@410,@1712,I250,I249,I108,I11,@4735,@4686,@4738,@4741,@4743,@243,@4749,@122,@14322,@596,@4750,@4751,@4753,@4755,@4764,@4769,@4780,@4783,@4806,@596,@4807,@4806,@4678| 4678:O5|@4637,625,0,625,0 4679:S30|494e5447434f444528292e636f646567656e28352967656e636465283429 4680:O1|@4681 4681:D24,1096|008d220f1a49040e0e0c00021a49040e0e0c000207cd220f35221036220e3522112a1a3b040c000364036d220e35220f3622123b1a29040e0e0c000303033c020b22122b1a21040e0e0c000303041a1f04103b503b50040200221328082b1a17040c00045029352a362c2b1a12040e0e0e0c00033c2b1a0f040c00032a2a1a0f040c0003293b1a0f040c0003641ac8030e0c0002270702013b07db2a3c3c302210221022102210221022102210221022190c000d503b22101ae5030e0e0c0003030c220f28071ad7030c000302013b039d284522101ad0030e0c0003293b1acf03020243030c0003343b3c1aca030e0e0e0c0004220c1ac7030c0002220d35293b1ac4030e0c0003220f372e3b1a50030e0c0003030c1b00012f1a8b030c000302012e291a29030e0e0c00020303290207291a9b030c00022928ff1a52030e0e0e0c00032c2e2b1a8e030e0e0e0c00042214352f3c1a50030e0c00032a3b2b1a7e030e0e0e0c0004503b260e0fd23b22101a2c03020280020e0c0003030c220f28fe1a1b030c000302013b03c1323b3d1a25030e0e0c0004331a24030e0c00023435293b1a21030e0e0c0003220d37292b28241a22030e0e0e0c0004220f352c3c1ae4020e0c00032a3b2b1a12030e0e0e0c000450221135293b1aeb020c0003221337221a3b1a77020c000303101b0001221b1ab2020e0e0e0c00030202221a291a4c020e0c00020303290207291abf020c00022928ff1a76020e0e0e0c00032c2e2b1ab2020e0e0e0c00042218352f3c1a74020e0c00032a3b2b1aa20202025d010e0e0e0c0004503b26120fca323b3e1a64020e0c0004331a64020e0c00023435293b1a61020e0e0c0003220d37292b28151a62020e0e0e0c0004220f352c3c1a24020e0c00032a3b2b1a52020e0e0e0c00045022173d2a1b00011a49020e0e0c0003293b1a47020c000303033c0214293b1ab2010e0e0e0c00033c2a1ad7010c000364030329020a291b00011ad7010c0003221535293b1aec010e0c00032217372c3b1a78010e0c0003030c1b00012d1ab3010c000302012c291a51010e0e0c00020303290207291ac3010c00022928ff1a7a01020285000e0e0e0c00032c2e2b1ab2010e0e0e0c0004221c352f3c1a74010e0c00032a3b2b1aa2010e0e0e0c000450343c1aa6010e0e0e0c000303043b500247220c3b1a0c010e0c0003293c1a33010c00030304220d020a220d28ff1a3b010c0003291b00011a79010e0e0c0003220e3c1a26010e0e0e0c00032a2a25112511260f20000126042615313b1a24010e0c0003293c1a03010c0003333b2b1a2a010e0e0e0c00045022123c1ae5000e0e0c000322123c1ada000e0e0e0c00032d2b2b221522152215221522152215221522152215221522151a100122160e7b1016000f22103c1aaa000e0e0e0c00032a2a2212221222122212221222122212221222122212221222121adf0022137b1013000f3b1f0e0e0e0e0e0e000000000000000038040000000000000000000000000000|@4683,I105,I218,I234,I231,@3641,I104,I252,I245,I243,I251,I232,I106,I107,@4684,@4682,I253,I152,@4650,I255,I110,I113,I109,@4680| 4682:O1|@4728 4683:S44|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d73657456616c756573283329 4684:O1|@4685 4685:D17,512|008228dc2c1a00020e0c00032e35293b1afd010e0e0c000330230d293b1af0010e0c00032b2a1adf010c0003292f1ae7010c0003270503033b0fcc2e230a293b1acd010e0e0c000330230a293b3b1acf010c0004503003033b0fd03135293b1aae010e0e0e0c00033337292b3d1ab8010e0c0004220c352c3c1ab4010e0c00032a3b2b1a9a010e0e0e0c000450220e35293b1a7b010c0003221037292b3b1a87010c00042212352c3c1a84010e0c00032a3b2b1a6a010e0e0e0c000450221435293b1a4b010c0003291a6c011a61010e0e0c00033c2a693c28402b1a62010e0e0e0c00042219230d293b1a23010c00032d2a1a53010c00036503162219230d293b2e1a1b010202d7000c0004503b6402013b221a3a221b3a293b1af3000c00032d2a692c3b2b1af700020209000c0004502e3b69271632230d293b1a12011adf000c000450333a343a293b1ac2000e0e0e0c000364220c311afd000e0e0c00042a3b2b1aba000e0e0e0c0004502c3b1aee000e0e0e0c000303033b0252220c1ae6000e0e0e0c0002220d35293b1a80000e0c00032f291ad7000c00021ad9000e0e0c0002032629352a362a3b1a61000e0e0c0003292e22151ac5000e0e0c00042b250526041e303b270402013b2704220d230a293b321a47000c0004503b270964440e0e0e0e0e0e0000000000000000f0010000000000000000000000000000|@4687,I107,I253,I232,I255,@4650,I106,-1,I11,I234,536870911,@4688,I251,@4682,I105,I218,@4686| 4686:O1|@4705 4687:S32|494e54434f4445434f4e5328292e636865636b4272616e63684c697374283329 4688:O1|@4689 4689:D23,848|00822d1a52030e0e0e0c00021a51030e0e0c000207cf2d352e36292f2f1a48030e0c00042b3b1a47030c000329353c1a46030e0e0e0c000307d029363135293b1a2d030e0e0c0003292c1a33030c0003332a1a33030c00036407d32b3c1a30030e0c00032a2a1a17030c00033b2a1a27030c0003030c291b00011a0b030c000302013b03043b5002041a1403102d220d1a15030e0e0c0003293b1a13030c000303043b5002041a0f03102e1a12031adf020c000329220f1aee020e0e0e0c0003293d1ab3020c000303033c020b293d1ade020e0e0e0c00030304280f0272293e1a950202024b020e0e0c000303033c020b293e1aba020e0e0e0c000303042807024e2928051a7002020221020e0c000303033c020b2928051a95020e0e0c000303042809022a2928811a4c020202cb010e0c000303033c020b2928811a71020e0e0c000303043b5002041a7b021028822210372a3b1a30020e0c0003030c1b00012b1a2b020c000302012a291ae9010e0e0c00020303290207291a53020c00022928ff1a52020e0e0e0c00032c302b1a4e020e0e0e0c0004221537333b1ae8010e0c0003030c1b0001341ae3010c0003020133291aa1010e0e0c00020303290207291a0b020c00022928ff1a0a020e0e0e0c00032c22122b1a05020e0e0c00043b3d2a1b00011aff010c0003293b1abf010c000303033c0214293b1af2010e0e0e0c00033c2a1a6f010c000364030329020a291b00011a77010c0003221e35293b1a4c010e0c00032220372c3b1a58010e0c0003030c1b00012d1a53010c000302012c291a11010e0e0c00020303290207291a7b010c00022928ff1a7a010e0e0e0c00032c2e2b1a76010e0e0e0c00042225352f3c1a18010e0c00032a3b2b1a76010e0e0e0c000450343c1a22010e0e0e0c000303033b0248220c3b1a51010e0e0c0003293c1acf000c00030304220d020a220d28ff1ac7000c0003291b00011a3d010e0e0c0003220e3c1ab2000e0e0e0c00032a2a25112511260f1efa3b2704270d3b22126922183b2b1a0a010e0e0e0c00045022162712022f33230d293b1a6d000e0e0c00032d2a1a7b000c000365031233230d293b2e1adc000e0c0004503b6402013b302f69646602012a270402013b440e0e0e0e000000000000000040030000000000000000000000000000|@4691,I105,I218,@4688,I253,I251,I107,I234,I106,I232,@4692,@4695,I113,@4700,-1,@4690,I152,I243,@4650,I110,I231,I255,I109| 4690:O4|@14322,@596,@4704,@4703 4691:S48|494e54434f4445434f4e5328292e636865636b4272616e63684c697374283329636f6e766572744c6162656c73283129 4692:O4|@14322,@596,@4694,@4693 4693:O5|@4649,1004,0,1004,0 4694:S44|636865636b4272616e63684c6973743a206f666673657420746f6f206c6172676520746f20636f6e76657274 4695:O1|@4696 4696:D18,200|00812b37293b1ac7000c00032936291ac6000e0e0e0c0002293b1ac3000c0003030c1ac3002a1ac7000c000302012928082a1ac3000c00033b331ac3000c0003030c322a1a99000e0e0c000302013b03043b500237323c1aae000e0e0e0c00032a3c1aa3000c0003293b691aa2002a692c2a691aa2002a6927051aa3000c00021aa5001aaa002b1aae006b10321ab0000e0c00020303320207321aab000c00022d2a1aab00340e0e7e0b00030e0e0e0e0000000000000000b8000000000000000000000000000000|@4698,I253,I15,I234,@410,I106,I108,I232,@243,@4671,@4699,@104,@14322,@596,@4697,I105,I152,I252| 4697:O5|@4657,218,0,218,0 4698:S24|494e54434f4445434f4e5328292e67657442797465283229 4699:S15|637365674765743a20496e64657820 4700:O4|@14322,@596,@4702,@4701 4701:O5|@4649,1010,0,1010,0 4702:S46|636865636b4272616e63684c6973743a20382d626974206f666673657420616c7265616479206669786564207570 4703:O5|@4649,1025,0,1025,0 4704:S36|457874656e64696e6720756e6b6e6f776e206272616e636820696e737472756374696f6e 4705:D22,528|00822d353b1a10020e0c000307d22d36293d1a0b020c00032e2a1a0b020c00033b2a1a0b020c0003030c291a0a021a0f020c000302013b03043b5002041a0802102e373d2d2b1a07020c0004293b1a07020c000303043b5002041a0302102b3d2f2b1b00011a00020e0c0003293b1ae7010c000303033c0214293b1af2010e0e0e0c00033c2a1a8f010c000364030329020a291b00011a87010c0003220c372a3b1a9c010e0c0003030c1b00012b1a6f010c000302012a291abd010e0e0c00020303290207291ab7010c00022928ff1ab6010e0e0e0c00032c302b1ab201020266000e0e0e0c0004313c1a6b010c000303033b024f323b1a76010e0e0e0c0003293c1a13010c0003030333020b3328ff1a15010e0e0c0003291b00011a79010e0e0c0003343c1aff000c0003343c1aef000c00032b2b2b250f250f250f260c1ede3b2705270f02a82d36293c1ad1000e0e0c00032e2a1acf000c00033b2a1acf000c0003030c291b00011ad3000c000302013b03043b5002041a2401102b2f1a26010e0e0e0c0003293b1acb000c000303043b5002041a1701102c301a19010e0e0c000330372c3b1a95000e0e0c0003030c1b00012d1a67000c000302012c291ab5000e0e0c00020303290207291aaf000c00022928ff1aae000e0e0e0c00032c322b1aaa00220e0e0e0e7b050e0004440e0e0e0e0e0e0e000000000000000000020000000000000000000000000000|@4707,I251,I106,I107,I232,65536,I234,@4708,@4711,I113,@4714,I110,I231,I105,I152,I243,@4650,I109,@4717,@4695,@4720,@4706| 4706:O1|@4723 4707:S28|494e54434f4445434f4e5328292e66697875704f6666736574283329 4708:O4|@14322,@596,@4710,@4709 4709:O5|@4649,921,0,921,0 4710:S41|66697875704f66667365743a206a756d7020746f6f20666172202831362d626974206f666673657429 4711:O1|@4712 4712:D21,264|00822b3b1a09010e0e0c00032936291a06010e0e0e0c0002293b1a03010c0003030c1a03012a1a07010c000302012928082a1a03010c00033b321a03010c0003030c312a1ad9000e0e0c000302013b03043b500237313c1aee000e0e0e0c00032a3c1ae3000c0003293b691ae2002a692c2a691ae2002a6927051ae3000c00021ae5001aea002b1aee006b10311af0000e0c00020303310207311aeb000c00022d2a1aeb000c0003343c1aeb000c00030303290237343c1ae6000e0e0e0c0003343c1a6b000c00032a2a220d1ad9000e0e0c0004291b00011a5d000e0e0c0003292e1a4b00220f0e7e1000032707440e0000000000000000f8000000000000000000000000000000|@4713,I253,I15,I234,@410,I106,I108,I232,@243,@4671,@4699,@104,@14322,@596,@4697,I105,I152,I252,I113,I107,@4711| 4713:S21|494e54434f4445434f4e5328292e67657442283329 4714:O4|@14322,@596,@4716,@4715 4715:O5|@4649,927,0,927,0 4716:S43|66697875704f66667365743a2031362d626974206272616e636820616c7265616479206669786564207570 4717:O4|@14322,@596,@4719,@4718 4718:O5|@4649,896,0,896,0 4719:S40|66697875704f66667365743a206a756d7020746f6f206661722028382d626974206f666673657429 4720:O4|@14322,@596,@4722,@4721 4721:O5|@4649,902,0,902,0 4722:S42|66697875704f66667365743a20382d626974206272616e636820616c7265616479206669786564207570 4723:D5,88|00812b230d293b1a56001a5b000c0004502c3a2d3a293b1a56000e0e0e0c0003642f2f1a52000e0e0e0c00042a3b2b1a36000e0e0e0c0004503b66430e0e0e0e000000000000000048000000000000000000000000000000|@4725,536870911,I255,I253,@4724| 4724:O1|@4726 4725:S28|494e54434f4445434f4e5328292e72656d6f76654c6162656c283229 4726:D9,200|00822d1aca000e0e0e0c00021ac9000e0e0c000203912d352e362a3b1ac1000e0e0c000329353c1abe000e0e0e0c000303642936302a1aaf000c000303033c020b302a1aaa000e0e0e0c0003030e2b31311aa400320e0e7b050900042f230d293b1a7c000e0c00032b2a1a93000c00036503122f230d293b2c1a8c000e0c0004503b6402013b2c32321a6c000e0c00042e2a6966020e2a30301a5c00310e0e7b050800046602013b440e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@4727,I105,I218,I253,I251,I113,@4724,I234,I255| 4727:S42|494e54434f4445434f4e5328292e72656d6f76654c6162656c28322972656d6f7665456e747279283129 4728:D22,1160|00802b230a293b1a86040e0e0e0c0003293b1a83040c00030323293c1a81040e0e0c00031a81042a1a85040e0e0c00031a85041a8a042b1a8e046b65103b50293b1a8c040e0c000303033b0fca28ff2a1a85040e0e0c000307cc2d36293b1a2f040c00036403042819020228182e35293b1a1c040e0c000330372c3b1a19040e0e0c0003030c1b00012d1a53040c000302012c291a51040e0e0c00020303290207291a4b040c00022928ff1a4a040e0e0e0c00032c2e2b1a46040e0e0e0c0004220c352f3c1a18040e0c00032a3b2b1a36040e0e0e0c000450333d2a1b00011a2e040e0e0e0c0003293b1ae3030c000303033c0214293b1a1e040e0e0e0c00033c2a1a1b040c000364030329020e291b00011acb03020243030c0003221235293b1a6c030202c2000e0c00032214372c3b1a64030e0c0003030c1b00012d1a9f030c000302012c291a9d030e0e0c00020303290207291a97030c00022928ff1a96030e0e0e0c00032c2e2b1a92030e0e0e0c00042219352f3c1a64030e0c00032a3b2b1a82030e0e0e0c000450343c1a3e030e0e0e0c000303033b0249220c3b1a75030e0e0c0003293c1a73030c00030304220d020a220d28ff1a6b030c0003291b00011a69030e0e0c0003220e3c1a56030e0e0e0c00032a2a25112511260f2005013b270427170fd32d36293b1a9f020c00036407c83e2a1a9c020e0c000303a02d35293b1a87020c00032f37292b28271aeb020c000431352c3c1ac1020e0e0c00032a3b2b1ade020e0e0e0c0004503335293b1a58020e0c0003220c37323b1a54020e0c0003030c1b0001331a8f020c0003020132291a8d020e0e0c00020303290207291a87020c00022928ff1a86020e0e0e0c00032c2e2b1a82020e0e0e0c00042211352f3c1a54020e0c00032a3b2b1a72020e0e0e0c0004503b270f028628642a1a38020e0c0003293c1a77020c00032f35293b1ad50102049d0169000c000331372c3b1acd010e0e0c0003030c1b00012d1a07020c000302012c291a05020e0e0c00020303290207291aff010c00022928ff1afe010e0e0e0c00032c2e2b1afa010e0e0e0c0004220d352f3c1acc010e0c00032a3b2b1aea010e0e0e0c0004503b270b0fd33d2a1a69010e0e0c000303a02d35293b1a53010c00032f37292b28261ab7010c000431352c3c1a8d010e0e0c00032a3b2b1aaa010e0e0e0c0004503335293b1a24010e0c0003220c37323b1a20010e0c0003030c1b0001331a5b010c0003020132291a59010e0e0c00020303290207291a53010c00022928ff1a52010e0e0e0c00032c2e2b1a4e010e0e0e0c00042211352f3c1a20010e0c00032a3b2b1a3e010e0e0e0c0004503b270f028628502a1a04010e0c0003293c1a43010c00032f35293b1aa1000e0e0c000331372c3b1a9d0002025d000e0e0c0003030c1b00012d1ad3000c000302012c291ad1000e0e0c00020303290207291acb000c00022928ff1aca000e0e0e0c00032c2e2b1ac6000e0e0e0c0004220d352f3c1a98000e0c00032a3b2b1ab6000e0e0e0c0004503b270b2e230a293b3b1aa3000c0004503b2704420e0e0e000000000000000078040000000000000000000000000000|@4730,I253,I234,@243,@4731,@122,@14322,@596,@4729,I113,I232,I106,I105,I152,I243,@4650,I255,I110,I231,I251,I107,I109| 4729:O5|@4649,815,0,815,0 4730:S24|494e54434f4445434f4e5328292e72657365745370283129 4731:S25|726573657453703a206261642072657365742076616c756520 4732:O1|@4733 4733:D24,1768|00842d352e36313b1ae5060e0e0c000303033c020b312b1ade060e0e0e0c000303041adb06103b503b500402003228082b1ad4060e0c00045029352a362c2b1ace060e0e0e0c00033c2b1acb060c00032a2a1acb060c0003293b1acb060c0003641acc060e0c0002270707cc2c3b3c1ac6060e0e0e0c00042d1ac4060e0c00022e35293b1ac1060e0e0c00033037292b282a1abb060c000432352c3c1ab9060e0e0c00032a3b2b1ab6060e0e0e0c0004503b220f1ab1060e0e0c0003030c220e28051aa3060c000302013b039d2835220f1a84060e0c0003293b1a93060c0003220d3b3c1a51060e0e0c0004220e1a4f060c0002220f35293b1a4c060e0c00032211372e3b1ae8050e0c0003030c1b00012f1a43060c000302012e291a59060e0e0c00020303290207291a53060c00022928ff1aea0502027a050e0e0e0c00032c2e2b1a0a060e0e0e0c00042216352f3c1a04060e0c00032a3b2b1a02060e0e0e0c0004503b260e0fce3b220f1af8050e0c0003030c220e28fe1aeb050c000302013b03c1343b3d1aad050e0e0c0004220c1aab050c0002220d35293b1aa8050e0c0003220f37292b28231aa2050e0e0e0c00042211352c3c1a9c050e0c00032a3b2b1a9a050e0e0e0c000450221335293b1a73050c000322153722193b1a0f050c000303101b0001221a1a6a050e0e0e0c000302022219291a7c050e0c00020303290207291a77050c00022928ff1a0e050e0e0e0c00032c2e2b1a32050e0e0e0c0004221a352f3c1a2c050e0c00032a3b2b1a2a0502025d010e0e0e0c0004503b26120fca343b3e1aec040e0c0004220c1aeb040c0002220d35293b1ae8040e0c0003220f37292b28141ae2040e0e0e0c00042211352c3c1adc040e0c00032a3b2b1ada040e0e0e0c00045022163d2a1b00011af1040e0e0c0003293b1aef040c000303033c0214293b1a4a040e0e0e0c00033c2a1a6f040c000364030329020a291b00011a8f040c0003221735293b1a74040e0c00032219372c3b1a10040e0c0003030c1b00012d1a6b040c000302012c291a81040e0e0c00020303290207291a7b040c00022928ff1a1204020285000e0e0e0c00032c2e2b1a32040e0e0e0c0004221e352f3c1a2c040e0c00032a3b2b1a2a040e0e0e0c000450343c1a4e040e0e0e0c000303043b500247220c3b1aa4030e0c0003293c1acb030c00030304220d020a220d28ff1a03040c0003291b00011a21040e0e0c0003220e3c1aee030e0e0e0c00032a2a25112511260f200001260426153b220e1acb030c0003030c220d28071abf030c000302013b03992845220e1aa0030e0c0003293b1aaf030c0003220d3b3c1a6d030e0e0c0004220e1a6b030c0002220f35293b1a68030e0c00032211372e3b1a04030e0c0003030c1b00012f1a5f030c000302012e291a75030e0e0c00020303290207291a6f030c00022928ff1a06030e0e0e0c00032c2e2b1a2a030e0e0e0c00042216352f3c1a24030e0c00032a3b2b1a22030e0e0e0c0004503b260e0fce3b220e1a18030e0c0003030c220d28fe1a0b030c000302013b03c1343b3d1acd020e0e0c0004220c1acb020c0002220d35293b1ac8020e0c0003220f37292b28241ac2020e0e0e0c00042211352c3c1abc020e0c00032a3b2b1aba020e0e0e0c000450221335293b1a93020c000322153722183b1a2f020c000303101b000122191a8a020e0e0e0c000302022218291a9c020e0c00020303290207291a97020c00022928ff1a2e020e0e0e0c00032c2e2b1a52020e0e0e0c0004221a352f3c1a4c020e0c00032a3b2b1a4a0202025d010e0e0e0c0004503b26120fca343b3e1a0c020e0c0004220c1a0b020c0002220d35293b1a08020e0c0003220f37292b28151a02020e0e0e0c00042211352c3c1afc010e0c00032a3b2b1afa010e0e0e0c00045022153d2a1b00011a11020e0e0c0003293b1a0f020c000303033c0214293b1a6a010e0e0e0c00033c2a1a8f010c000364030329020a291b00011aaf010c0003221735293b1a94010e0c00032219372c3b1a30010e0c0003030c1b00012d1a8b010c000302012c291aa1010e0e0c00020303290207291a9b010c00022928ff1a3201020285000e0e0e0c00032c2e2b1a52010e0e0e0c0004221e352f3c1a4c010e0c00032a3b2b1a4a010e0e0e0c000450343c1a6e010e0e0e0c000303043b500247220c3b1ac4000e0c0003293c1aeb000c00030304220d020a220d28ff1a23010c0003291b00011a41010e0e0c0003220e3c1a0e010e0e0e0c00032a2a25112511260f20000126042615220e341a13010c000303033b022b220e3c1acd000e0e0c0003220e3c1ac2000e0e0e0c00032a2a2210221022101af90022110e0e7b07110006270802182f3c1a9f000c000329303030301adc00310e0e7b070800061f050e0e0000000000000000d8060000000000000000000000000000|@4734,I234,I231,@3641,I104,I252,I245,I243,I251,I218,@4684,@4682,I253,@4650,I106,I255,I232,I107,I105,I152,I110,I113,I109,@4732| 4734:S39|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d636f7079283229 4735:O1|@4736 4736:D12,240|00812c230a293b1aee000e0e0e0c0003293b1aeb000c0003651aec000e0c00022903042817020228142e3b2b1ae1000e0e0c00042f1ae0000e0c00023035293b1ab5000e0e0c000329321ad3000c0003293f1ad3000c0003293b1aa3000c000303033c0214293b1ac6000e0e0e0c00033c2a1ac3000c000364030329020a293f1a9d000e0e0c0003293d1a73000c000327051a73000c000203373035293b1a57000c00033237292b280e1a93000c000434352c3c1a69000e0e0c00032a3b2b1a86000e0e0e0c000426071e8e3b270602013b2704430e0e0e0000000000000000e0000000000000000000000000000000|@4737,I253,I113,I218,@4684,@4682,I106,I110,I231,I251,@4650,I255| 4737:S29|494e54434f4445434f4e5328292e616c69676e4f6666576f7264283229 4738:O4|@14322,@596,@4740,@4739 4739:O5|@4637,379,0,379,0 4740:S27|4e6f20426567696e4c6f6f7020666f72204c6f6f7020696e737472 4741:O1|@4742 4742:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4741| 4743:O1|@4744 4744:D22,960|008b220d1ac1030e0e0c00021ac1030e0e0c000207d5220d35220e36220e1aa7030c00021aa9030e0e0c000203043b5002041aa303103b50220e362b3c3c3b22112211221122112211221122112211221a0c000d2b2b22112211221122112211221122112211221122111a73030c000d3c2a1a73030c0003030c293b1a69030e0e0c000302013b039d28252a1a61030e0e0c0003293c1a5f030c0003220e3b3c1a5d030e0e0c0004220f1a5b030c0002221035293b1a58030e0c00032212372e3b1a54030e0c0003030c1b00012f1a1f030c000302012e291aed020e0e0c0002030329020b291a3703020289020c00022928ff1a32030e0e0e0c00032c2e2b1a2e030e0e0e0c00042217352f3c1ae0020e0c00032a3b2b1a1e030e0e0e0c0004503b260e0fce3b2a1abd020e0e0c0003030c2928fe1ab0020e0c000302013b03c1220c3b3d1ab8020e0c0004220d1ab7020c0002220e35293b1ab4020e0c0003221037292b28251ac6020e0e0e0c00042212352c3c1a78020e0c00032a3b2b1ab6020e0e0e0c000450221435293b1a7f020c0003221637343b1a7c020e0c000303101b0001220c1a46020e0e0e0c0003020134291a11020e0e0c00020303290207291a5b020c00022928ff1a5a020e0e0e0c00032c2e2b1a56020e0e0e0c0004221b352f3c1a08020e0c00032a3b2b1a460202025d010e0e0e0c0004503b26120fca220c3b3e1af7010c0004220d1af7010c0002220e35293b1af4010e0c0003221037292b28171a06020e0e0e0c00042212352c3c1ab8010e0c00032a3b2b1af6010e0e0e0c000450313d2a1b00011aee010e0e0e0c0003293b1aeb010c000303033c0214293b1ae6010e0e0e0c00033c2a1ae3010c000364030329020a291b00011a6b010c0003221835293b1a80010e0c0003221a372c3b1a7c010e0c0003030c1b00012d1a47010c000302012c291a15010e0e0c00020303290207291a5f010c00022928ff1a5e01020285000e0e0e0c00032c2e2b1a56010e0e0e0c0004221f352f3c1a08010e0c00032a3b2b1a46010e0e0e0c000450343c1a4a010e0e0e0c000303043b500247220c3b1a40010e0c0003293c1a3f010c00030304220d020a220d28ff1acf000c0003291b00011a2d010e0e0c0003220e3c1aba000e0e0e0c00032a2a25112511260f20010126042615343b1ab8000e0c0003293c1a97000c0003220d3b2b1acd000e0e0c0004502b2707022a220c3b1adc000e0c000303043b5002041adf00103b502f3b1a7f000c0003292d1a5f002e0e0e7e0f00031f0c0e0e0e0e0e0e0000000000000000b0030000000000000000000000000000|@4746,I105,I218,@4745,@4743,I232,I106,I107,@4684,@4682,I253,I234,I152,I243,@4650,I255,I110,I113,I231,I251,I109,@4745| 4745:O4|@14322,@596,@4748,@4747 4746:S43|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d6c6f616441726773283229 4747:O5|@4637,394,0,394,0 4748:S30|6c6f6164417267733a204d69736d61746368656420617267756d656e7473 4749:S23|7265736574537461636b3a20626164206f666673657420 4750:O5|@4649,1563,0,1563,0 4751:O1|@4752 4752:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4751| 4753:O1|@4754 4754:D6,168|008a220c1aa9000e0e0c00021aa9000e0e0c00020371220c35220d362a352b36293c3c3222122212221222122212221222122212221b0e0e0e0c000d50333b1a7e000e0e0e0c0003296801220f2d2b1a76000e0e0e0c000450220c3b1a61000e0e0c00032e22132213221322132213221322132213221322131a54000e0c000c2a2a69270802013b1f0b0e0e0e0e0e0e000000000000000098000000000000000000000000000000|@1399,I105,I218,I253,@4755,@4753| 4755:O1|@4756 4756:D16,400|00822d35293b1a8f010c000329353c1a8e010e0e0e0c000303043b5002041a870110293630362a3b1a6d010e0e0c0003312a1a7b010c0003640341303b1a70010e0c000303033c02142a3b1a4a010e0e0e0c0003312a1a5f010c00036403041a5e01103b50303c1a5e010e0e0e0c00032b2a321a5a01337b050a00042a3b1a17010c0003293e1a4f010c0003323c1a37010c00032a2a1a47010c000303032a020129293b1a09010e0e0c000303033c020b291a33011a00010e0c000303041a2f01103b50293c1aff000c0003292840301a25010e0e0c0004293b2d1af2000e0e0e0c000450303b1aae000e0e0e0c00033b2a1ad3000c00032b3b1a9b000c00032a2a1adb000c00036503041af200103b50313c2c3c2d1aef000c0006503c2b69343b2b1aaa000e0e0e0c000450220f3b1a7d000e0e0c000303033c02182b3b1a56000e0e0e0c000322102a1a6a000e0e0e0c00036403041a6600103b50220f3c1a65000e0e0c00032c2a22111a610022120e0e7b05120004000000000000000080010000000000000000000000000000|@4758,I253,I251,@4759,I234,I231,@1614,I106,I255,I108,I233,72057594037927934,@1603,I11,@4757,I195| 4757:O4|11,@49,0,@4763 4758:S22|5374726574636841727261792e757064617465283329 4759:O4|103,@140,@4761,@4760 4760:O5|@4762,93,0,93,0 4761:S39|417474656d707420746f207570646174652061206c6f636b656420737472657463684172726179 4762:S40|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f5374726574636841727261792e4d4c 4763:O5|@1391,200,0,200,0 4764:O1|@4765 4765:D5,120|0089341a7a000e0e0e0c00021a79000e0e0c000203423435220c362a352b361a6e001a73002d221122112211221122112211221122112211220d680d2a3c2b220f2212221022102216221122112211221822127b0d11000c3b1f0a0e0e0e0e0e000000000000000068000000000000000000000000000000|@4767,I105,I218,@4766,@4764| 4766:D3,96|008056093b1a60000e0c0003296801562a12040001000c002b1a54000e0c00045056285639564a565b566c567d568e569f120b0001000a00120c0001000b0056c7220e7b0c05000b000000000000000050000000000000000000000000000000|@4768,I253,@4755| 4767:S48|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d67656e4d757475616c44656373283129 4768:S51|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d67656e4d757475616c44656373283129283129 4769:O1|@4770 4770:D24,1296|00812c1a12050e0e0e0c000203202c1a06050e0e0e0c000203043b5002041aff04102c1a02051a07050c000302013b07ca2c1ae3040c000203043b5002041af704102c3b1af9040e0e0c0003030c1af7042d1afb040c000302012c29401af8040e0c000303482c3b3c1af4040e0c00042d1af4040e0c00022e35293b1af1040e0e0c00033037292b28401aeb040c000432352c3c1ab9040e0e0c00032a3b2b1ade040e0e0e0c0004503b27080fd5293f1ad5040e0e0c00030394283b2a1a90040e0c00032d3b3c1a96040e0e0e0c00042e1a94040e0c00022f35293b1a91040e0e0c000331372e3b1a55040e0e0c000303101b00012f1a570402026e020c000302012e291a11040e0e0c00020303290207291a7b040c00022928ff1a7a040e0e0e0c00032c2e2b1a4e040e0e0e0c0004220d352f3c1a18040e0c00032a3b2b1a3e040e0e0e0c0004503b270c0fd0291b00011aeb030c000303bc2c3b3d1a00040e0c00042d1a00040e0c00022e35293b1afd030e0e0c00033037292b28281af7030202e3010c000432352c3c1ac1030e0e0c00032a3b2b1ae6030e0e0e0c0004503435293b1ac8030e0c0003220d37343b1a8c030e0c000303101b0001220c1a8e030e0e0e0c0003020134291a49030e0e0c00020303290207291ab3030c00022928ff1ab2030e0e0e0c00032c2e2b1a86030e0e0e0c00042212352f3c1a50030e0c00032a3b2b1a76030e0e0e0c0004503b27110fca2c3b3e1a4403020248010e0c00042d1a40030e0c00022e35293b1a3d030e0e0c00033037292b281b1a37030c000432352c3c1a05030e0e0c00032a3b2b1a2a030e0e0e0c000450313d2a1b00011a3a030e0e0e0c0003293b1ae7020c000303033c0214293b1a2a030e0e0e0c00033c2a1a27030c000364030329020a291b00011ab7020c0003220f35293b1acc020e0c00032211372c3b1a90020e0c0003030c1b00012d1a93020c000302012c291a51020e0e0c00020303290207291abb020c00022928ff1aba02020286000e0e0e0c00032c2e2b1a8a020e0e0e0c00042216352f3c1a54020e0c00032a3b2b1a7a020e0e0e0c000450343c1a46020e0e0e0c000303033b0249220c3b1a85020e0e0c0003293c1a83020c00030304220d020a220d28ff1a7b020c0003291b00011a79020e0e0c0003220e3c1a66020e0e0e0c00032a2a25112511260f2001013b27042715640fd43c2d69292d1a55020e0e0c00032d3b3e1ae2010e0e0e0c00042e1ae0010e0c00022f35293b1add010e0e0c00033137292b281a1ad7010c000433352c3c1aa5010e0e0c00032a3b2b1aca010e0e0e0c000450220c35293b1aab010c00033b3d2a1b00011acf010c0003293b1a7f010c000303033c0214293b1ac2010e0e0e0c00033c2a1abf010c000364030329020a291b00011a4f010c0003221235293b1a64010e0c00032214372c3b1a28010e0c0003030c1b00012d1a2b010c000302012c291ae9000e0e0c0002030329020b291a53010202b3000c00022928ff1a4e010e0e0e0c00032c2e2b1a22010e0e0e0c00042219352f3c1aec000e0c00032a3b2b1a12010e0e0e0c000450343c1ade000e0e0e0c000303033b0248220c3b1a1d010e0e0c0003293c1a1b010c00030304220d020a220d28ff1a13010c0003291b00011a11010e0e0c0003220e3c1afe000e0e0e0c00032a2a25112511260f1efe3b2704270d220f23082b220d6922112308293b1a90000e0c00032b2a692d3b2b1a93000c0004503b2712430e0e0e000000000000000000050000000000000000000000000000|@4772,I105,@2943,32768,I250,@2943,I234,@410,I106,I113,@4684,@4682,I253,@4650,I255,I232,I152,I243,I110,I231,I251,I107,I109,@4771| 4771:O1|@4773 4772:S26|494e54434f4445434f4e5328292e70757368436f6e7374283229 4773:D3,56|00812b38293b1a37000c00033b2a30301a3500310e0e0e7b060600050e0e0e0e000000000000000028000000000000000000000000000000|@4775,I253,@4774| 4774:O1|@4776 4775:S30|494e54434f4445434f4e5328292e616464436f6e7374546f566563283229 4776:D9,272|00832d1a12010e0e0e0c00021a11010e0e0c000203792d352e362e353b1a08010e0c000303292e362b353b1afa000e0e0e0c000303152b362a230b2a230b2a2a1ae5000e0e0c00036602013b64021e2e362b353c1ad1000e0e0c0003030d2b362a2a1ac3000c00036402013b64030330021a303c1ab9000e0e0c0003292b31311ab500320e0e0e7b060900056502622b230b2c230b293b1aa6000e0e0e0c0003293c1a8b000c00032c3b2b1a9a000e0e0e0c0004502f383038293b1a82000e0e0e0c0003333b69293b1a5c000e0c000303032a020b2a2a1a76000e0e0e0c00032d3b2b1a62000e0e0e0c000450220e27091f040e0e0e0e0e000000000000000000010000000000000000000000000000|@4778,I105,I218,I251,I106,@4774,I253,I255,@4777| 4777:O1|@4779 4778:S42|494e54434f4445434f4e5328292e616464436f6e7374546f56656328322966696e64436f6e7374283329 4779:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4777| 4780:O1|@4781 4781:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@4782| 4782:S35|494e5447434f444528292e636f646567656e28352967656e6364652834295f2d283129 4783:O1|@4784 4784:D25,4304|008631353e1ad0100e0c000307d23b3c310c000329353b1abe100e0e0e0c000307ce29362a37293b1ab5100e0e0c00030319313b1ab1100e0e0c0003292b2d341aad100e0e0c0005640fd2313b1a98100e0c0003292c1a9f100c00033b2a1a9f100c0003030c29280b1a94100e0c000302013b03a128292a1a7d100e0e0c0003293b1a83100c0003343b3c1a82100e0e0e0c0004220c1a7f100c0002220d35293b1a44100e0c0003220f372e3b1a70100e0c0003030c1b00012f1a3b100c000302012e291a61100e0e0c00020303290207291a5b100c00022928ff1a5a10020235040e0e0e0c00032c2e2b1a521002027c020e0e0e0c00042214352f3c1af80f0e0c00032a3b2b1a3e100e0e0e0c0004503b270d0fd23b2a1ae50f02022a020e0e0c0003030c2928fe1ad40f0e0c000302013b03c1323b3d1ad50f0e0e0c0004331ad40f0e0c00023435293b1a990f0e0e0c0003220d37292b28221ae20f0e0e0e0c0004220f352c3c1a8c0f0e0c00032a3b2b1ad20f0e0e0e0c000450221135293b1a630f0c0003221337343b1a900f0e0c000303101b0001220c1a5a0f0e0e0e0c0003020134291a7d0f0e0e0c00020303290207291a770f0c00022928ff1a760f0e0e0e0c00032c2e2b1a720f0e0e0e0c00042218352f3c1a1c0f0e0c00032a3b2b1a620f02025e010e0e0e0c0004503b27110fca323b3e1a140f0e0c0004331a140f0e0c00023435293b1ad90e0e0e0c0003220d37292b28131a220f0e0e0e0c0004220f352c3c1acc0e0e0c00032a3b2b1a120f0e0e0e0c000450313d2a1b00011a0a0f0e0e0e0c0003293b1a070f0c000303033c0214293b1a020f0e0e0e0c00033c2a1a6f0e0c000364030329020a291b00011a7f0e0c0003221535293b1a640e0e0c00032217372c3b1a900e0e0c0003030c1b00012d1a5b0e0c000302012c291a810e0e0e0c00020303290207291a7b0e0c00022928ff1a7a0e020286000e0e0e0c00032c2e2b1a720e0e0e0e0c0004221c352f3c1a1c0e0e0c00032a3b2b1a620e0e0e0e0c000450343c1a660e0e0e0e0c000303033b0249220c3b1a5d0e0e0e0c0003293c1acb0d0c00030304220d020a220d28ff1aeb0d0c0003291b00011a410e0e0e0c0003220e3c1ad60d0e0e0e0c00032a2a25112511260f2001013b2704271565323b1a9a0d0e0e0e0c0003293c1a9f0d0c0003343b2b1ae60d0e0e0e0c0004503b27050fd1293629301afb0d0c0003303b3e1a920d0e0e0e0c0004311a900d0e0c00023235293b1a550d0e0e0c00033437292b281a1a9f0d0c0004220d352c3c1a4c0d0e0c00032a3b2b1a920d0e0e0e0c000450220f35293b1a230d0c00033b3d2a1b00011a7f0d0c0003293b1a7f0d0c000303033c0214293b1a7a0d0e0e0e0c00033c2a1ae70c0c000364030329020a291b00011af70c0c0003221535293b1adc0c0e0c00032217372c3b1a080d0e0c0003030c1b00012d1ad30c0c000302012c291af90c0e0e0c0002030329020b291af30c0202d3000c00022928ff1aee0c0e0e0e0c00032c2e2b1aea0c0e0e0e0c0004221c352f3c1a940c0e0c00032a3b2b1ada0c0e0e0e0c000450343c1ade0c0e0e0e0c000303033b0248220c3b1ad50c0e0e0c0003293c1a430c0c00030304220d020a220d28ff1a630c0c0003291b00011ab90c0e0e0c0003220e3c1a4e0c0e0e0e0c00032a2a25112511260f1efe3b2704270d221223082b220d6922142308293b1a080c0e0c00032b2a692d3b2b1a5b0c0c00045022183b1af10b0e0e0c0003293c1af70b0c0003221a3b2b1a3d0c0e0e0c0004503b2714640fd231353c1abb0b0c000307c93136293c1acf0b0c0003293c330e0e0c000329353b1a9e0b0e0e0e0c000307ce29362a37293b1a950b0e0e0c00030319333b1a910b0e0e0c0003292b2d220d1a8c0b0e0c0005640fd2333b1a780b0e0c0003292c1a7f0b0c00033b2a1a7f0b0c0003030c29280b1a740b0e0c000302013b03a128292a1a5d0b0e0e0c0003293b1a630b0c0003220d3b3c1a610b0e0e0c0004220e1a5f0b0c0002220f35293b1a240b0e0c00032211372e3b1a500b0e0c0003030c1b00012f1a1b0b0c000302012e291a410b0204c50a4e040c00020303290207291a370b0c00022928ff1a360b0e0e0e0c00032c2e2b1a320b02027c020e0e0e0c00042216352f3c1ad80a0e0c00032a3b2b1a1e0b0e0e0e0c0004503b270d0fd23b2a1ac50a02022a020e0e0c0003030c2928fe1ab40a0e0c000302013b03c1343b3d1ab50a0e0e0c0004220c1ab30a0c0002220d35293b1a780a0e0c0003220f37292b28221ac20a0e0e0e0c00042211352c3c1a6c0a0e0c00032a3b2b1ab20a0e0e0e0c000450221335293b1a430a0c0003221537343b1a700a0e0c000303101b0001220c1a3a0a0e0e0e0c0003020134291a5d0a0e0e0c00020303290207291a570a0c00022928ff1a560a0e0e0e0c00032c2e2b1a520a0e0e0e0c0004221a352f3c1afc090e0c00032a3b2b1a420a02025e010e0e0e0c0004503b27110fca343b3e1af4090e0c0004220c1af3090c0002220d35293b1ab8090e0c0003220f37292b28131a020a0e0e0e0c00042211352c3c1aac090e0c00032a3b2b1af2090e0e0e0c000450313d2a1b00011aea090e0e0e0c0003293b1ae7090c000303033c0214293b1ae2090e0e0e0c00033c2a1a4f090c000364030329020a291b00011a5f090c0003221735293b1a44090e0c00032219372c3b1a70090e0c0003030c1b00012d1a3b090c000302012c291a61090e0e0c00020303290207291a5b090c00022928ff1a5a09020286000e0e0e0c00032c2e2b1a52090e0e0e0c0004221e352f3c1afc080e0c00032a3b2b1a42090e0e0e0c000450343c1a46090e0e0e0c000303033b0249220c3b1a3d090e0e0c0003293c1aab080c00030304220d020a220d28ff1acb080c0003291b00011a21090e0e0c0003220e3c1ab6080e0e0e0c00032a2a25112511260f2001013b2704271565343b1a7a080e0e0e0c0003293c1a7f080c0003220d3b2b1ac5080e0e0c0004503b27050fd5293629321adb080c0003323b3e1a72080e0e0e0c0004331a70080e0c00023435293b1a35080e0e0c0003220d37292b281a1a7e080e0e0e0c0004220f352c3c1a28080e0c00032a3b2b1a6e080e0e0e0c000450221135293b1aff070c00033b3d2a1b00011a5b080c0003293b1a5b080c000303033c0214293b1a56080e0e0e0c00033c2a1ac3070c000364030329020a291b00011ad3070c0003221735293b1ab8070e0c00032219372c3b1ae4070e0c0003030c1b00012d1aaf070c000302012c291ad5070e0e0c0002030329020b291acf070202d3000c00022928ff1aca070e0e0e0c00032c2e2b1ac6070e0e0e0c0004221e352f3c1a70070e0c00032a3b2b1ab6070e0e0e0c000450343c1aba070e0e0e0c000303033b0248220c3b1ab1070e0e0c0003293c1a1f070c00030304220d020a220d28ff1a3f070c0003291b00011a95070e0e0c0003220e3c1a2a070e0e0e0c00032a2a25112511260f1efe3b2704270d221423082b220d6922162308293b1ae4060e0c00032b2a692d3b2b1a37070c000450221a3b1acd060e0e0c0003293c1ad3060c0003221c3b2b1a19070e0e0c0004503b2714660fd131353d1a97060c000307c831362d2a1a2b070c0003291ad4060e0c00021a25070e0e0c000203043b5002041a1f07103b502935291a1e070e0e0e0c0002323b1a6b060c0003292b1a73060c00033b2a1a73060c0003030c29280b1a68060e0c000302013b039d28292a1a51060e0e0c0003293b1a57060c0003220c3b3c1a55060e0e0c0004220d1a53060c0002220e35293b1a18060e0c00032210372e3b1a44060e0c0003030c1b00012f1a0f060c000302012e291a35060e0e0c00020303290207291a2f060c00022928ff1a2e060204a20582020e0c00032c2e2b1a26060e0e0e0c00042215352f3c1ad0050e0c00032a3b2b1a16060e0e0e0c0004503b270d0fce3b2a1abd050e0e0c0003030c2928fe1ab0050e0c000302013b03c1333b3d1ab1050e0e0c0004341ab0050e0c0002220c35293b1a74050e0c0003220e37292b28221abe050e0e0e0c00042210352c3c1a68050e0c00032a3b2b1aae050e0e0e0c000450221235293b1a3f050c0003221437343b1a6c050e0c000303101b0001220c1a36050e0e0e0c0003020134291a59050e0e0c00020303290207291a53050c00022928ff1a52050e0e0e0c00032c2e2b1a4e050e0e0e0c00042219352f3c1af8040e0c00032a3b2b1a3e0502025e010e0e0e0c0004503b27110fca333b3e1af0040e0c0004341af0040e0c0002220c35293b1ab4040e0c0003220e37292b28131afe040e0e0e0c00042210352c3c1aa8040e0c00032a3b2b1aee040e0e0e0c000450313d2a1b00011ae6040e0e0e0c0003293b1ae3040c000303033c0214293b1ade040e0e0e0c00033c2a1a4b040c000364030329020a291b00011a5b040c0003221635293b1a40040e0c00032218372c3b1a6c040e0c0003030c1b00012d1a37040c000302012c291a5d040e0e0c00020303290207291a57040c00022928ff1a5604020286000e0e0e0c00032c2e2b1a4e040e0e0e0c0004221d352f3c1af8030e0c00032a3b2b1a3e040e0e0e0c000450343c1a42040e0e0e0c000303033b0249220c3b1a39040e0e0c0003293c1aa7030c00030304220d020a220d28ff1ac7030c0003291b00011a1d040e0e0c0003220e3c1ab2030e0e0e0c00032a2a25112511260f2001013b27042715220c3b1a76030e0e0e0c0003293c1a7b030c0003220e3b2b1ac1030e0e0c0004503b27090fd331362c2a1a6f030c0003303b1a47030c0003292b1a4f030c00033b2a1a4f030c0003030c29280b1a44030e0c000302013b039928292a1a2d030e0e0c0003293b1a33030c0003333b3c1a32030e0e0e0c0004341a30030e0c0002220c35293b1af4020e0c0003220e372e3b1a20030e0c0003030c1b00012f1aeb020c000302012e291a11030e0e0c00020303290207291a0b030c00022928ff1a0a030e0e0e0c00032c2e2b1a06030e0e0e0c00042213352f3c1ab0020e0c00032a3b2b1af6020e0e0e0c0004503b270d0fd23b2a1a9d02020249020e0e0c0003030c2928fe1a8c020e0c000302013b03c1313b3d1a8d020e0e0c0004321a8c020e0c00023335293b1a51020e0e0c0003220c37292b28221a9a020e0e0e0c0004220e352c3c1a44020e0c00032a3b2b1a8a020e0e0e0c000450221035293b1a1b020c0003221237343b1a48020e0c000303101b0001220c1a12020e0e0e0c0003020134291a35020e0e0c00020303290207291a2f020c00022928ff1a2e020e0e0e0c00032c2e2b1a2a020e0e0e0c00042217352f3c1ad4010e0c00032a3b2b1a1a0202025e010e0e0e0c0004503b27110fca313b3e1acc010e0c0004321acc010e0c00023335293b1a91010e0e0c0003220c37292b28131ada010e0e0e0c0004220e352c3c1a84010e0c00032a3b2b1aca010e0e0e0c000450313d2a1b00011ac2010e0e0e0c0003293b1abf010c000303033c0214293b1aba010e0e0e0c00033c2a1a27010c000364030329020a291b00011a37010c0003221435293b1a1c010e0c00032216372c3b1a48010e0c0003030c1b00012d1a13010c000302012c291a39010e0e0c00020303290207291a33010c00022928ff1a3201020286000e0e0e0c00032c2e2b1a2a010e0e0e0c0004221b352f3c1ad4000e0c00032a3b2b1a1a010e0e0e0c000450343c1a1e010e0e0e0c000303033b0249220c3b1a15010e0e0c0003293c1a83000c00030304220d020a220d28ff1aa3000c0003291b00011af9000e0e0c0003220e3c1a8e000e0e0e0c00032a2a25112511260f2001013b27042715333b1a53000c0003293c1a5b000c0003220c3b2b1aa1000e0e0c0004503b27071f070e0e0e0e0e0e0000000000000000c0100000000000000000000000000000|@4786,I251,I233,I253,@4787,I106,I232,I107,@4684,@4682,I234,I105,I152,I243,@4650,I255,I110,I113,I231,I109,@4793,@4801,I218,@4785,I111| 4785:O4|@14322,@596,@4805,@4804 4786:S31|494e5447434f444528292e636f646567656e2835296c6f6361646472283229 4787:O1|@4788 4788:D21,1296|00832e3b1a11050e0e0c000303033c020b2d3b1a02050e0e0e0c000303041aff04103b502e28101aee040e0e0e0c0003032a2d3e1ae1040e0e0c0003031b1ae7042d1ad3040c0003030c2c28091ac8040e0c000302013b02013b02013b07cb28562e1acb040c0003293c1acb040c00032d3b3c1aca040e0e0e0c00042e1ac8040e0c00022f35293b1ac5040e0e0c000331372e3b1ac1040e0e0c0003030c1b00012f1a8b040c000302012e291ab1040e0e0c00020303290207291aab040c00022928ff1aaa040e0e0e0c00032c2e2b1aa6040e0e0e0c0004220d352f3c1a50040e0c00032a3b2b1a96040e0e0e0c00045022123c1a41040e0e0c00032928101a86040e0e0e0c00032922131a22040e0e0e0c00032928061a16040e0e0e0c0003221335293b1a280402026a000e0c00032215372c3b1a20040e0c0003030c1b00012d1aeb030c000302012c291a11040e0e0c00020303290207291a0b040c00022928ff1a0a040e0e0e0c00032c2e2b1a06040e0e0e0c0004221a352f3c1ab0030e0c00032a3b2b1af6030e0e0e0c0004503b271a0fd22b3b28051aa3030c00042c1aa4030e0c00022d35293b1aa1030e0e0c00032f37292b28121abb030c000431352c3c1a69030e0e0c00032a3b2b1aae030e0e0e0c000450220d3d2a1b00011aad030e0e0c0003293b1aab030c000303033c0214293b1aa6030e0e0e0c00033c2a1aa3030c000364030329020a291b00011a1b030c0003220e35293b1a30030e0c00032210372c3b1a2c030e0c0003030c1b00012d1af7020c000302012c291a1d030e0e0c00020303290207291a17030c00022928ff1a16030e0e0e0c00032c2e2b1a1203020285020e0e0e0c00042215352f3c1ab8020e0c00032a3b2b1afe020e0e0e0c000450343c1a0a030e0e0e0c000303033b0249220c3b1a01030e0e0c0003293c1aff020c00030304220d020a220d28ff1a7f020c0003291b00011aed020e0e0c0003220e3c1a6a020e0e0e0c00032a2a25112511260f2000013b2704270d220d3d2a1b00011aa2020e0e0e0c0003293b1a9f020c000303033c0214293b1a9a020e0e0e0c00033c2a1a97020c000364030329020a291b00011a0f020c0003220f35293b1a24020e0c00032211372c3b1a20020e0c0003030c1b00012d1aeb010c000302012c291a11020e0e0c00020303290207291a0b020c00022928ff1a0a020e0e0e0c00032c2e2b1a06020e0e0e0c00042216352f3c1ab0010e0c00032a3b2b1af6010e0e0e0c000450343c1a02020e0e0e0c000303033b0248220c3b1af9010e0e0c0003293c1af7010c00030304220d020a220d28ff1a77010c0003291b00011ae5010e0e0c0003220e3c1a62010e0e0e0c00032a2a25112511260f1efd3b2704270d220d3d2a1b00011a9b010c0003293b1a9b010c000303033c0214293b1a96010e0e0e0c00033c2a1a93010c000364030329020a291b00011a0b010c0003221035293b1a20010e0c00032212372c3b1a1c010e0c0003030c1b00012d1ae7000c000302012c291a0d010e0e0c00020303290207291a07010c00022928ff1a06010e0e0e0c00032c2e2b1a02010e0e0e0c00042217352f3c1aac000e0c00032a3b2b1af2000e0e0e0c000450343c1afe000e0e0e0c000303033b0248220c3b1af5000e0e0c0003293c1af3000c00030304220d020a220d28ff1a73000c0003291b00011ae1000e0e0c0003220e3c1a5e000e0e0e0c00032a2a25112511260f1efa3b270427171f040e0e0e0e0e0e0e000000000000000000050000000000000000000000000000|@4790,I232,@4789,-6,I106,I107,@4684,@4682,I253,I234,I105,I152,I243,@4650,I255,I108,I110,I113,I231,I251,I109| 4789:O4|@14322,@596,@4792,@4791 4790:S28|494e54434f4445434f4e5328292e67656e4e6f6e4c6f63616c283429 4791:O5|@4649,1208,0,1208,0 4792:S31|67656e4e6f6e4c6f63616c3a20696e76616c696420706172616d6574657273 4793:O1|@4794 4794:D9,240|00812c2307293b1aee000e0e0e0c0003291aec000e0c00021aed000e0e0c0002034a291ada000e0e0e0c00021ad9000e0e0c000203043b5002041ad300102935293b1ab3000c000329352a362a3b1ac7000c000303041ac700103b503c2a6929331ac400340e0e0e7e0b00032e2309293b1a84000e0c000329291a83000c00021a85000e0e0c0002032229352a3632230b2b230b2a2a1a7f000c00036503033c0207292503511e2d3b6502013b6403033b0214302309302b692a3b2b1a71000e0e0c0004503b653b326929321a5900337e0a00030e0e0e0e0000000000000000e0000000000000000000000000000000|@4796,I253,I105,I218,@4797,I251,@4795,@4771,I255| 4795:O4|@14322,@596,@4800,@4799 4796:S26|494e54434f4445434f4e5328292e636f6465436f6e7374283229 4797:O4|101,@1426,0,@4798 4798:O5|@4649,702,0,702,0 4799:O5|@4657,119,0,119,0 4800:S28|63736567416464723a206e6f74206120636f6465207365676d656e74 4801:O1|@4802 4802:D12,232|00812c35293b1ae7000c000329353b1ae6000e0e0e0c0003035629362f362a1ade000e0e0e0c0002302a1adb000c00036403392f1ad9000e0e0c00021ad9000e0e0c000203033c02102a1ab3000c0002302a1acb000c00036403041aca00103b502a301a8a00310e7e0800032965025a29362f362a3b1a77000c0003302a1a87000c00036403412f3b1a7c000e0c000303033c02142a3b1a56000e0e0e0c0003302a1a8b000c00036403041a8a00103b502f3c1a8a000e0e0e0c00032b2a1a2f00320e0e7e090003296565430e0e0e0e0000000000000000d8000000000000000000000000000000|@4803,I253,I251,I15,I234,I105,I218,I247,@599,I231,@1586,I106| 4803:S19|5374726574636841727261792e737562283229 4804:O5|@4637,268,0,268,0 4805:S26|6c6f63616464723a2062616420737461636b2061646472657373 4806:S23|67656e6364653a206261642061646a7573746d656e7420 4807:O5|@4637,643,0,643,0 4808:O2|@4809,@4675 4809:D10,264|008b3c28403b1a07010c0004220e36293c22115657220f220f220f220f220f220f220f220f2218221b221b22101ae8000e0c0011303b3b1ae6000e0e0e0c0004502210372922112211221122112211221122112211221122112211121100010001000e0e0e0c000d323b1abb000c000303032b02013b333b2b1aa4000e0c0004502e3b1aa2000e0e0e0c0003293b1a9f000c000303033b0252220d1a9a000e0e0e0c0002220e35293b1a7c000e0c00032c291a8b000c00021a8d000e0e0c0002032629352a362a3b1a5d000e0e0c0003292e22161a79000e0e0c00042b250526041e303b270402013b270427071f0c0e0000000000000000f8000000000000000000000000000000|@4811,I11,@4810,I255,I253,I251,@4682,I105,I218,@4686| 4810:O1|@4812 4811:S37|494e5447434f444528292e636f646567656e28352967656e53706172736543617365283429 4812:D19,1112|008f22111a59040e0e0c00021a59040e0e0c000207d12211352212362a352b36221335293c3c220d22162216221622162216221622162216221f0e0e0e0c000d2b22111a2a040e0e0e0c00031a290422121a1c040e0c000322123c1a22040e0e0e0c000322133b3c1a1d040e0e0c000422141a1b040c0002221535293b1a18040e0c0003221737292b280c1a12040e0e0e0c00042219352c3c1a0c040e0c00032a3b2b1a0a040e0e0e0c000450221b35293b1ae3030c0003221d37292b3b1adf030c0004221f352c3c1adc030e0c00032a3b2b1ada030e0e0e0c000450222135293b1ab30302024f030c0003222337292b3e1aab030c00042225352c3c1aa8030e0c00032a3b2b1aa6030e0e0e0c00045022273b3e1a70030e0c000422281a6f030c0002222935293b1a6c030e0c0003222b37292b3e1a67030c0004222d352c3c1a64030e0c00032a3b2b1a62030e0e0e0c000450222f35293b1a3b030c0003223137292b3b1a37030c00042233352c3c1a34030e0c00032a3b2b1a32030e0e0e0c000450223535293b1a0b030c0003291a24031a11030e0e0c00033c2a693c28402b1a1a030e0e0e0c0004223a230d293b1ae3020c00032d2a1a0b030c0003650312223a230d293b2e1ae3020c0004503b6402013b223b3a223c3a293b1ab7020c00032d2a692c3b2b1ac3020c0004502e3b69223f3b1a9e020e0e0e0c0003293c1acb020c000322413b2b1aa1020e0e0c0004502235223d223d22402249224922492249224922492249224922520e0e0c000d22413b1a5e020e0e0e0c0003223e3b1a32020e0e0e0c000303033b022222433b1a41020e0e0c0003293c1a6f020c000322453b2b1a45020e0e0c0004503b65223d3b1a1f020c00032b03033b0fd522461a09020e0e0c0002224735293b1a04020e0c0003224937292b3d1aff010c0004224b352c3c1afc010e0c00032a3b2b1afa010e0e0e0c000450224d35293b1ad3010c0003224f37292b3b1acf010c00042251352c3c1acc010e0c00032a3b2b1aca010e0e0e0c000450225335293b1aa3010c0003291abc011aa9010e0e0c00033c2a693c28402b1ab2010e0e0e0c00042258230d293b1a7b010c00032d2a1aa3010c00036503122258230d293b2e1a7b010c0004503b6402013b22593a225a3a293b1a4f010c00032d2a692c3b2b1a5b01020216000c0004502e3b69225e3c3b1a21010e0e0c00042a2719293b1a04010e0c000303032a020b2a2a1a56010e0e0e0c000322403b2b1a21010e0e0c000450313b1ade000e0e0e0c000303033b025222481ae6000e0e0e0c0002224935293b1ae0000e0c000334291a9f000c00021aa1000e0e0c0002032629352a362a3b1ac1000e0e0c0003292e22511afd000e0e0c00042b250526041e303b270402013b270422473b3b1ab2000e0e0e0c000450224f03032e02013b223e2a225122512251225122512251225122512251225122512251225122511ab90022520e0e7b1252001122101f100e0e0e0e000000000000000048040000000000000000000000000000|@4814,I105,I218,@4769,I251,@4735,@4684,@4682,I253,@4650,I106,I255,-1,I11,I234,I107,@4813,@4686,@4810| 4813:O1|@4815 4814:S48|494e5447434f444528292e636f646567656e28352967656e5370617273654361736528342963617365436f6465283229 4815:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4813| 4816:O2|@4817,@4675 4817:D29,1504|008b220d36220e35293c3c220f220f220f220f220f220f220f220f220f56e70e0e0c000d3c28403b1abd050e0e0c00042211380402002a1ab6050e0e0e0c00021ab5050e0e0c000203222a35293b1aaf050c0003030c1aaf052a1ab3050c00030201292b3b452a46260302ba2e1a80050e0c00021a81050e0e0c000203043b5002041a9305103b502e352936292a69040200322b2a1a58050e0c00021a59050e0e0c000203392a352b362a362c352d362b2b1a6b050c000303032b02012a2c2b1a65050e0e0c000303032c02012a2a2a692f2a250a250a26081e4526080209292c2a35452a3646515129352a362a3b1a0e050e0e0e0c0003030c1a0b052b1a0f050c000302012a2a3b1af4040e0c0003030c1af3042b1af7040c000302012a312b452a46260929352a36292b1a01050e0e0c00032b3b1aff040c000303033b02cf2b22101af9040e0e0c00031ae10422111aec040e0c000322113c1aea040e0e0e0c000322123b3c1ae5040e0e0c000422131ae3040c0002221435293b1ae0040e0c0003221637292b280c1ada040e0e0e0c00042218352c3c1a74040e0c00032a3b2b1aca040e0e0e0c000450221a35293b1aab040c0003221c37292b3b1aa7040c0004221e352c3c1a44040e0c00032a3b2b1a9a040e0e0e0c000450222035293b1a7b040c0003222237292b3e1a77040c00042224352c3c1a14040e0c00032a3b2b1a6a040e0e0e0c0004503b27172a3d1a63040c00033e2a1af3030c000322123b2b1a29040e0e0c000422131a27040c0002221435293b1a24040e0c0003221637292b401a1f040c00042218352c3c1abc030e0c00032a3b2b1a12040e0e0e0c000450343d2a1b00011a12040e0e0e0c0003293b1abf030c000303033c0214293b1a02040e0e0e0c00033c2a1aff030c000364030329020a291b00011a6f030c0003221e35293b1ab4030e0c00032220372c3b1a48030e0c0003030c1b00012d1a4b030c000302012c291a21030e0e0c00020303290207291abb030c00022928ff1aba030e0e0e0c00032c2e2b1a76030e0e0e0c00042225352f3c1a10030e0c00032a3b2b1a66030e0e0e0c000450343c1a22030e0e0e0c000303033b0248220c3b1a61030e0e0c0003293c1a5f030c00030304220d020a220d28ff1aef020c0003291b00011a5d030e0e0c0003220e3c1ada020e0e0e0c00032a2a25112511260f1efd3b2704270d221a3b1aef020c0003293c1ab7020c0003221c3b2b1aed020e0e0c000450221d1aca020e0e0e0c0002221e35293b1ac4020e0c000322113c1a6a020e0e0e0c0003293d1ac7020c00033b2922151af5020e0e0c000303033b0fce2a3d2a1b00011ab2020e0e0e0c0003293b1a5f020c000303033c0214293b1aa2020e0e0e0c00033c2a1a9f020c000364030329020a291b00011a0f020c0003222735293b1a54020e0c00032229372c3b1ae8010e0c0003030c1b00012d1aeb010c000302012c291ac1010e0e0c00020303290207291a5b020c00022928ff1a5a020e0e0e0c00032c2e2b1a16020e0e0e0c0004222e352f3c1ab0010e0c00032a3b2b1a06020e0e0e0c000450343c1ac2010e0e0e0c000303043b50024b220c3b1a00020e0c0003293c1aff0102024c000c00030304220d020a220d28ff1a8b010c0003291b00011af9010e0e0c0003220e3c1a76010e0e0e0c00032a2a25112511260f2001012604260d293c1a3c010e0c0003292502502027013b6464222a3729222b222b222b222b222b222b222b222b222b222b222b122b00010001000e0e0c000d22233b3b1a61010e0e0c000450222c36221c22252228222f2229221e220c3412290001000100223222322232222f222f223922391a79010e0e0c0012221c3b1a16010e0e0e0c0003293b1a3b010c000303033b025222271af6000e0e0e0c0002222835293b1af0000e0c00032c291a77000c00021a79000e0e0c0002032629352a362a3b1ad1000e0e0c0003292e22301a25010e0e0c00042b250526041e303b270402013b270422263b3b1aba000e0e0e0c0004503b27221f0c0e0e0e0e0e0e0000000000000000d0050000000000000000000000000000|@4819,I11,I105,I218,I234,@410,I106,@1712,I250,I249,I107,I113,@4769,@4735,@4684,@4682,I253,@4650,I255,I108,I110,I231,I251,I152,I243,I109,I233,@4818,@4686| 4818:O1|@4820 4819:S36|494e5447434f444528292e636f646567656e28352967656e44656e736543617365283429 4820:D25,856|009022121a59030e0e0c00021a59030e0e0c000207cd2212352213362a352b3622153b1a4a030e0e0e0c000322153b1a3e030e0e0e0c000303033b0fce22141a36030e0e0e0c0002221535293b1a20030e0c0003221737292b3d1a23030c00042219352c3c1a20030e0c00032a3b2b1a1e030e0e0e0c000450221b35293b1aef020c0003221d37292b3b1af3020c0004221f352c3c1af0020e0c00032a3b2b1aee020e0e0e0c000450222135293b1abf020c0003291ae0021acd020e0e0c00033c2a693c28402b1ad6020e0e0e0c00042226230d293b1a97020c00032d2a1ac702020257020c00036503122226230d293b2e1a9b020c0004503b6402013b22273a22283a293b1a6702020222000c00032d2a692c3b2b1a77020c0004502e3b69222c3c3b1a89020e0e0c00042a2719293b1a84020e0c000303032a020b2a2a1a7e020e0e0e0c000322183b2b1a41020e0e0c00045022153b1a5d020e0e0c000303033b022222143b1a05020e0e0c0003293c1a53020c000322163b2b1a11020e0e0c0004503b652d3b1a1c020e0c0003030c1a3b022e1aef010c000302012d2922161a23020c0003293d1a2b020c000322162a1ad2010e0e0e0c0003221b373d2b2b1a1b020c00042922191a1a020e0e0e0c00036507d6221b1a9c010e0c0002221c35293b1a88010e0c000329221b1ad6010e0e0e0c0003293d2f2b1b00011aee010e0e0e0c0003293b1adb010c000303033c0214293b1ade010e0e0e0c00033c2a1a93010c000364030329020a291b00011a53010c00032224372a3b1a68010e0c0003030c1b00012b1a3b010c000302012a291a09010e0e0c00020303290207291a9b010c00022928ff1a9a010e0e0e0c00032c302b1a06010e0e0e0c0004313c1a63010c000303033b0253323b1a66010e0e0e0c0003293c1a1b010c0003030333020f3328ff1a1d01020235000e0e0c0003291b00011a55010e0e0c0003343c1a03010c0003343c1abb000c00032b2b2b250f250f250f260c1ee03b2705270e02013b221d3b3b1aa4000e0c00045033221c22122212221922192219222322222226221c221c22220e0e0e0c000d220c22202220222022202220222022202220222022202220222022202220222022201ae30022217b132100123b1f110e000000000000000048030000000000000000000000000000|@4822,I105,I218,I253,@4682,@4650,I106,I255,-1,I11,I234,@4684,I251,@4821,I107,@410,I108,@4711,I113,I110,I231,I152,I243,I109,@4818| 4821:O1|@4823 4822:S50|494e5447434f444528292e636f646567656e28352967656e44656e73654361736528342967656e4561636843617365283129 4823:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4821| 4824:O2|@4825,@4675 4825:D24,3936|008a220c37293b1a5e0f0e0e0e0c00030393220d363b2a301a550f0e0e0c0004220f35221023083b2a291a4b0f0c00021a4d0f0e0e0c0002031729362b3c1a470f0c0003292b25042504511e223b6502012a652b2d1a380f2f692c220d220d0e0e0c000629220e1a2e0f0e0e0e0c0003220d3b1a2a0f0e0e0e0c0003293c1a070f0c0003220f3b2b1a1d0f0e0e0c0004502215030b3b2215220d0e0e7d1700023b27090fca220d363c2a301ac20e0e0e0e0c0004220f35221023083b2a291ab70e0c00021ab90e0e0e0c0002031729362b3c1ab30e0c0003292b25042504511e223b6502012a652b2d1ac40e2c220d220d0c00062213373b2a291a7b0e0c00021a7d0e0e0e0c0002031729362b3c1a770e0c0003292b25042504511e223b6502012a65293c1a600e0e0c0003221507ca3d2a1a830e0c0003030c293f1a790e0e0e0c000302013b039d28522a1a390e0e0e0c0003293d1a670e0c000322123b3c1a650e0e0e0c000422131a630e0202d10d0c0002221435293b1a240e0e0c00032216372e3b1a500e0e0c0003030c1b00012f1af30d0c000302012e291ad90d0e0e0c00020303290207291a330e0c00022928ff1a320e0e0e0e0c00032c2e2b1a2e0e0e0e0e0c0004221b352f3c1ab80d0e0c00032a3b2b1ace0d0e0e0e0c0004503b270d0fd23b2a1acd0d0e0e0c000303102928fe1ac00d0202c2090e0c000302013b03c122103b3d1abc0d0e0c000422111abb0d0c0002221235293b1a800d0e0c0003221437292b28211ac20d0e0e0e0c00042216352c3c1a4c0d0e0c00032a3b2b1a620d0e0e0e0c000450221835293b1a4b0d0c0003221a37343b1a780d0e0c000303101b0001220c1a1a0d0e0e0e0c0003020134291afd0c0e0e0c00020303290207291a570d0c00022928ff1a560d0e0e0e0c00032c2e2b1a520d0e0e0e0c0004221f352f3c1adc0c0e0c00032a3b2b1af20c02025e010e0e0e0c0004503b27110fca22103b3e1afb0c0c000422111afb0c0c0002221235293b1ac00c0e0c0003221437292b28111a020d0e0e0e0c00042216352c3c1a8c0c0e0c00032a3b2b1aa20c0e0e0e0c000450313d2a1b00011ae20c0e0e0e0c0003293b1adf0c0c000303033c0214293b1ada0c0e0e0e0c00033c2a1a2f0c0c000364030329020a291b00011a3f0c0c0003221c35293b1a4c0c0e0c0003221e372c3b1a780c0e0c0003030c1b00012d1a1b0c0c000302012c291a010c0e0e0c00020303290207291a5b0c0c00022928ff1a5a0c020286000e0e0e0c00032c2e2b1a520c0e0e0e0c00042223352f3c1adc0b0e0c00032a3b2b1af20b0e0e0e0c000450343c1a3e0c0e0e0e0c000303033b0249220c3b1a350c0e0e0c0003293c1a8b0b0c00030304220d020a220d28ff1ad30b0c0003291b00011a190c0e0e0c0003220e3c1abe0b0e0e0e0c00032a2a25112511260f2001013b2704271522103b1a820b0e0e0e0c0003293c1a5f0b0c000322123b2b1a750b0e0e0c0004502f22141a590b0e0e0c000322143b3c1a7d0b0e0e0c000422151a7b0b0c0002221635293b1a400b0e0c0003221837292b28451a820b0e0e0e0c0004221a352c3c1a0c0b0e0c00032a3b2b1a220b0e0e0e0c000450221b3b1a0d0b0e0e0c00033b22220e0e0c00022a1a740b0e0c0002221e3b1af20a0e0e0e0c0003292b1acf0a0c00033b2a1af70a0c0003030c29280b1aec0a0e0c000302013b039928292a1aad0a0e0e0c0003293b1adb0a0c000322233b3c1ad90a0e0e0c000422241ad70a0c0002222535293b1a9c0a0e0c00032227372e3b1ac80a0e0c0003030c1b00012f1a6b0a0c000302012e291a510a0e0e0c00020303290207291aab0a0c00022928ff1aaa0a0e0e0e0c00032c2e2b1aa60a0e0e0e0c0004222c352f3c1a300a0e0c00032a3b2b1a460a0e0e0e0c0004503b270d0fce3b2a1a450a0e0e0c0003030c2928fe1a380a0e0c000302013b03c122213b3d1a380a0e0c000422221a370a0c0002222335293b1afc090e0c0003222537292b28221a3e0a0e0e0e0c00042227352c3c1ac8090e0c00032a3b2b1ade090e0e0e0c000450222935293b1ac7090c0003222b37343b1af4090e0c000303101b0001220c1a96090e0e0e0c0003020134291a79090e0e0c00020303290207291ad3090c00022928ff1ad2090e0e0e0c00032c2e2b1ace090e0e0e0c00042230352f3c1a58090e0c00032a3b2b1a6e0902025e010e0e0e0c0004503b27110fca22213b3e1a77090c000422221a77090c0002222335293b1a3c090e0c0003222537292b28131a7e090e0e0e0c00042227352c3c1a08090e0c00032a3b2b1a1e090e0e0e0c000450313d2a1b00011a5e090e0e0e0c0003293b1a5b090c000303033c0214293b1a56090e0e0e0c00033c2a1aab080c000364030329020a291b00011abb080c0003222d35293b1ac8080e0c0003222f372c3b1af4080e0c0003030c1b00012d1a97080c000302012c291a7d080e0e0c00020303290207291ad7080c00022928ff1ad608020286000e0e0e0c00032c2e2b1ace080e0e0e0c00042234352f3c1a58080e0c00032a3b2b1a6e080e0e0e0c000450343c1aba080e0e0e0c000303033b0249220c3b1ab1080e0e0c0003293c1a07080c00030304220d020a220d28ff1a4f080c0003291b00011a95080e0e0c0003220e3c1a3a080e0e0e0c00032a2a25112511260f2001013b2704271522213b1afe070e0e0e0c0003293c1adb070c000322233b2b1af1070e0e0c000450222a37293c2a1ab2070e0e0e0c00021ab1070e0e0c000207ca2a352b362a3c3c3b22302230223022302230223022302230123000010001000c000d3b2d1abb070c0003030c2c28071ab0070e0c000302013b039d28452d1a71070e0e0c0003293b1a9f070c0003222c3b3c1a9d070e0e0c0004222d1a9b070c0002222e35293b1a60070e0c00032230372e3b1a8c070e0c0003030c1b00012f1a2f070c000302012e291a15070e0e0c00020303290207291a6f070c00022928ff1a6e070e0e0e0c00032c2e2b1a6a070e0e0e0c00042235352f3c1af4060e0c00032a3b2b1a0a07020276020e0e0e0c0004503b270d0fce3b2d1a05070e0e0c0003030c2c28fe1af8060e0c000302013b03c1222a3b3d1af8060e0c0004222b1af7060c0002222c35293b1abc060e0c0003222e37292b28241afe060e0e0e0c00042230352c3c1a88060e0c00032a3b2b1a9e060e0e0e0c000450223235293b1a87060c0003223437220e3b1ab3060c000303101b0001220f1a56060e0e0e0c00030202220e291a38060e0c00020303290207291a93060c00022928ff1a92060e0e0e0c00032c2e2b1a8e060e0e0e0c00042239352f3c1a18060e0c00032a3b2b1a2e0602025e010e0e0e0c0004503b27110fca222a3b3e1a37060c0004222b1a37060c0002222c35293b1afc050e0c0003222e37292b28151a3e060e0e0e0c00042230352c3c1ac8050e0c00032a3b2b1ade050e0e0e0c000450343d2a1b00011a1e060e0e0e0c0003293b1a1b060c000303033c0214293b1a16060e0e0e0c00033c2a1a6b050c000364030329020a291b00011a7b050c0003223635293b1a88050e0c00032238372c3b1ab4050e0c0003030c1b00012d1a57050c000302012c291a3d050e0e0c00020303290207291a97050c00022928ff1a9605020286000e0e0e0c00032c2e2b1a8e050e0e0e0c0004223d352f3c1a18050e0c00032a3b2b1a2e050e0e0e0c000450343c1a7a050e0e0e0c000303033b0249220c3b1a71050e0e0c0003293c1ac7040c00030304220d020a220d28ff1a0f050c0003291b00011a55050e0e0c0003220e3c1afa040e0e0e0c00032a2a25112511260f2001013b27042715222a3b1abe040e0e0e0c0003293c1ad3040c0003222c3b2b1ab1040e0e0c0004502f3c1a86040e0e0e0c00032e2a250925092607204e033b270702013b6522263b3c1aa7040c000422271aa7040c0002222835293b1a6c040e0c0003222a37292b286c1aae040e0e0e0c0004222c352c3c1a38040e0c00032a3b2b1a4e040e0e0e0c000450222e230a222f230a293b1a32040e0e0e0c0003293c1a0f040c00032c3b2b1a26040e0e0e0c000450223236293b3b1a16040e0e0e0c00045022323b1a01040e0e0c0003293c1a17040c000322343b2b1af5030e0e0c0004503b27250fd52c22111ad4030e0c000322103b1ad2030e0e0e0c0003293c1aaf030c000322123b2b1ac5030e0e0c00045022193729291a87030c00021a89030e0e0c0002032d29352a362a3c3c3b221e221e221e221e221e221e221e221e121e00010001000c000d50292503511e383b6502013b643d2f1a86030e0e0e0c0003030c2e3f1a79030e0e0c000302013b039d28692f1a39030e0e0c0003293d1a67030c000322173b3c1a65030e0e0c000422181a63030c0002221935293b1a28030e0c0003221b372e3b1a54030e0c000303101b00012f1af7020202ab020c000302012e291ad9020e0e0c00020303290207291a33030c00022928ff1a32030e0e0e0c00032c2e2b1a2e030e0e0e0c00042220352f3c1ab8020e0c00032a3b2b1ace020e0e0e0c0004503b270d0fce3b2f1acd020e0e0c0003030c2e28fe1ac0020e0c000302013b03c122153b3d1ac0020e0c000422161abf020c0002221735293b1a84020e0c0003221937292b28681ac6020e0e0e0c0004221b352c3c1a50020e0c00032a3b2b1a66020e0e0e0c000450221d35293b1a4f020c0003221f3722103b1a7b020c000303101b000122111a1e020e0e0e0c000302022210291a00020e0c00020303290207291a5b020c00022928ff1a5a020e0e0e0c00032c2e2b1a56020e0e0e0c00042224352f3c1ae0010e0c00032a3b2b1af60102025e010e0e0e0c0004503b27110fca22153b3e1aff010c000422161aff010c0002221735293b1ac4010e0c0003221937292b28671a06020e0e0e0c0004221b352c3c1a90010e0c00032a3b2b1aa6010e0e0e0c000450220d3d2a1b00011ae5010e0e0c0003293b1ae3010c000303033c0214293b1ade010e0e0e0c00033c2a1a33010c000364030329020a291b00011a43010c0003222135293b1a50010e0c00032223372c3b1a7c010e0c0003030c1b00012d1a1f010c000302012c291a05010e0e0c00020303290207291a5f010c00022928ff1a5e01020286000e0e0e0c00032c2e2b1a56010e0e0e0c00042228352f3c1ae0000e0c00032a3b2b1af6000e0e0e0c000450343c1a42010e0e0e0c000303033b0249220c3b1a39010e0e0c0003293c1a8f000c00030304220d020a220d28ff1ad7000c0003291b00011a1d010e0e0c0003220e3c1ac2000e0e0e0c00032a2a25112511260f2000013b2704271522153b1a86000e0e0e0c0003303c1a9b000c00032a2a1a93000c000322183b2b1a71000e0e0c0004503b27092709641f0b0e0e0e0000000000000000500f0000000000000000000000000000|@4827,I251,@4605,I105,I218,I106,@4828,@4769,I253,I255,@4826,I232,I107,@4684,@4682,I234,I152,I243,@4650,I110,I113,I231,I109,I111| 4826:O1|@4829 4827:S31|494e5447434f444528292e636f646567656e28352967656e50726f63283329 4828:D1,32|00813c561769430e000000000000000010000000000000000000000000000000|@4623| 4829:D4,64|00812c3b1a41000e0e0c000303132b3c1a3d000e0e0c00033b1a3c002b6a6402043b2d2d6a430e0e000000000000000030000000000000000000000000000000|@4623,I113,I107,-1| 4830:D29,5800|00893435291aa8160e0c00023b2a291aa6160e0e0e0c00021aa5160e0e0c0002031729362b3c1a9f160c0003292b25042504511e253b6502012a65220e36293528061a8b160c000307d329362c291a67160c00021a69160e0e0c0002032d29352a362a3c3c3b22152215221522152215221522152215121500010001000c000d2a250426031e383b6602013b642a353e1a3d160e0e0c0003030c3b3c22110e0e0e0c0003026f2a353c1a24160e0c000303152a36293c1a0f160c0003293c22130e0c000365024e2a353d1a03160c000303322a36220f2a1afe150e0e0e0c0003293b1aeb150c000303041af315103b503b502935291af0150e0c00023b2a3b6a270402112a36220e2a1ae4150e0c00033b2a3b6a6529353c1ab5150202920c0e0e0c000307cb293629220f1aca150e0e0e0c0003220f3b3e1ac5150e0e0c000422101ac3150c0002221135293b1ac0150e0c0003221337292b281a1aba150e0e0e0c00042215352c3c1a5c150e0c00032a3b2b1aaa150e0e0e0c000450221735293b1a8b150c00033b3d2a1b00011a97150c0003293b1a97150c000303033c0214293b1a92150e0e0e0c00033c2a1a1f150c000364030329020a291b00011a07150c0003221d35293b1a44150e0c0003221f372c3b1a68150e0c0003030c1b00012d1ae3140c000302012c291ac9140202ad040e0e0c00020303290207291a47150c00022928ff1a46150e0e0e0c00032c2e2b1a02150e0e0e0c00042224352f3c1aa4140e0c00032a3b2b1af2140e0e0e0c000450343c1af6140e0e0e0c000303033b0248220c3b1aed140e0e0c0003293c1a7b140c00030304220d020a220d28ff1a8b140c0003291b00011ae9140e0e0c0003220e3c1a76140e0e0e0c00032a2a25112511260f1efe3b2704270d221a23082b220d69221c2308293b1a70140e0c00032b2a692d3b2b1a73140c000450221e3b1a59140e0e0c0003293c1a07140c000322203b2b1a55140e0e0c00045022253b1af9130e0e0c000307cb22203b1a2c140e0c0003293b1adb130c00033b2a1a6b140c0003030c29280b1a60140e0c000302013b039928292a1ab9130e0e0c0003293b1ad7130c000322253b3c1add130e0e0c000422261adb130c0002222735293b1ad8130e0c00032229372e3b1afc130e0c0003030c1b00012f1a77130c000302012e291a5d130e0e0c00020303290207291adf130c00022928ff1ade130e0e0e0c00032c2e2b1a9a130e0e0e0c0004222e352f3c1a3c130e0c00032a3b2b1a8a130e0e0e0c0004503b270d0fd23b2a1ab91302029b020e0e0c0003030c2928fe1aa8130e0c000302013b03c122233b3d1a38130e0c000422241a37130c0002222535293b1a34130e0c0003222737292b28221a2e130e0e0e0c00042229352c3c1ad0120e0c00032a3b2b1a1e130e0e0e0c000450222b35293b1aff120c0003222d37343b1a24130e0c000303101b0001220c1a9e120e0e0e0c0003020134291a81120e0e0c00020303290207291a03130c00022928ff1a02130e0e0e0c00032c2e2b1abe120e0e0e0c00042232352f3c1a60120e0c00032a3b2b1aae1202025e010e0e0e0c0004503b27110fca22233b3e1a77120c000422241a77120c0002222535293b1a74120e0c0003222737292b28131a6e120e0e0e0c00042229352c3c1a10120e0c00032a3b2b1a5e120e0e0e0c000450313d2a1b00011a56120e0e0e0c0003293b1a53120c000303033c0214293b1a4e120e0e0e0c00033c2a1adb110c000364030329020a291b00011ac3110c0003222f35293b1a00120e0c00032231372c3b1a24120e0c0003030c1b00012d1a9f110c000302012c291a85110e0e0c00020303290207291a07120c00022928ff1a0612020286000e0e0e0c00032c2e2b1abe110e0e0e0c00042236352f3c1a60110e0c00032a3b2b1aae110e0e0e0c000450343c1ab2110e0e0e0c000303033b0249220c3b1aa9110e0e0c0003293c1a37110c00030304220d020a220d28ff1a47110c0003291b00011aa5110e0e0c0003220e3c1a32110e0e0e0c00032a2a25112511260f2001013b2704271522233b1a36110e0e0e0c0003293c1ae3100c000322253b2b1a31110e0e0c000450221d3d1acd100e0e0c000322263b1a0a110e0e0e0c0003293c1adf100c0003222a22211ad5100e0e0c00032a2a1aa3100c00032d2a222d1a39110e0e0c0004222a3b3c1ae5100e0e0c0004503b270b025622213c1a24110e0c000322223b3c1aa9100e0e0c000422231aa7100c0002222435293b1aa4100e0c0003222637292b280c1a9e100e0e0e0c00042228352c3c1a40100e0c00032a3b2b1a8e100e0e0e0c0004503b270927140fd629362a37293b1acf100c00030319220e3b1a5c100e0c0003292b2d22131ac0100e0c0005640fce220e3b1a43100c0003292c1af30f0c00033b2a1a83100c0003030c29280b1a78100e0c000302013b039d28292a1ad10f0e0e0c0003293b1aef0f0c000322133b3c1af50f0e0e0c000422141af30f0c0002221535293b1af00f0e0c00032217372e3b1a14100e0c0003030c1b00012f1a8f0f0c000302012e291a750f0e0e0c00020303290207291af70f0c00022928ff1af60f0e0e0e0c00032c2e2b1ab20f0e0e0e0c0004221c352f3c1a540f020236060e0c00032a3b2b1a9e0f0e0e0e0c0004503b270d0fd23b2a1acd0f02022a020e0e0c0003030c2928fe1abc0f0e0c000302013b03c122113b3d1a4c0f0e0c000422121a4b0f0c0002221335293b1a480f0e0c0003221537292b28221a420f0e0e0e0c00042217352c3c1ae40e0e0c00032a3b2b1a320f0e0e0e0c000450221935293b1a130f0c0003221b37343b1a380f0e0c000303101b0001220c1ab20e0e0e0e0c0003020134291a950e0e0e0c00020303290207291a170f0c00022928ff1a160f0e0e0e0c00032c2e2b1ad20e0e0e0e0c00042220352f3c1a740e0e0c00032a3b2b1ac20e02025e010e0e0e0c0004503b27110fca22113b3e1a8b0e0c000422121a8b0e0c0002221335293b1a880e0e0c0003221537292b28131a820e0e0e0e0c00042217352c3c1a240e0e0c00032a3b2b1a720e0e0e0e0c000450313d2a1b00011a6a0e0e0e0e0c0003293b1a670e0c000303033c0214293b1a620e0e0e0e0c00033c2a1aef0d0c000364030329020a291b00011ad70d0c0003221d35293b1a140e0e0c0003221f372c3b1a380e0e0c0003030c1b00012d1ab30d0c000302012c291a990d0e0e0c00020303290207291a1b0e0c00022928ff1a1a0e020286000e0e0e0c00032c2e2b1ad20d0e0e0e0c00042224352f3c1a740d0e0c00032a3b2b1ac20d0e0e0e0c000450343c1ac60d0e0e0e0c000303033b0249220c3b1abd0d0e0e0c0003293c1a4b0d0c00030304220d020a220d28ff1a5b0d0c0003291b00011ab90d0e0e0c0003220e3c1a460d0e0e0e0c00032a2a25112511260f2001013b2704271565220f3b1a490d0e0e0c0003293c1af70c0c000322113b2b1a450d0e0e0c00045022163b1ae90c0e0e0c000307cb22113b1a1c0d0e0c0003293b1acb0c0c00033b2a1a5b0d0c0003030c29280b1a500d0e0c000302013b039928292a1aa90c0e0e0c0003293b1ac70c0c000322163b3c1acd0c0e0e0c000422171acb0c0c0002221835293b1ac80c0e0c0003221a372e3b1aec0c0e0c0003030c1b00012f1a670c0c000302012e291a4d0c0e0e0c00020303290207291acf0c0c00022928ff1ace0c0e0e0e0c00032c2e2b1a8a0c0e0e0e0c0004221f352f3c1a2c0c0e0c00032a3b2b1a7a0c0e0e0e0c0004503b270d0fd23b2a1aa90c02029b020e0e0c0003030c2928fe1a980c0e0c000302013b03c122143b3d1a280c0e0c000422151a270c0c0002221635293b1a240c0e0c0003221837292b28221a1e0c0e0e0e0c0004221a352c3c1ac00b0e0c00032a3b2b1a0e0c0e0e0e0c000450221c35293b1aef0b0c0003221e37343b1a140c0e0c000303101b0001220c1a8e0b0e0e0e0c0003020134291a710b0e0e0c00020303290207291af30b0c00022928ff1af20b0e0e0e0c00032c2e2b1aae0b0e0e0e0c00042223352f3c1a500b0e0c00032a3b2b1a9e0b02025e010e0e0e0c0004503b27110fca22143b3e1a670b0c000422151a670b0c0002221635293b1a640b0e0c0003221837292b28131a5e0b0e0e0e0c0004221a352c3c1a000b0e0c00032a3b2b1a4e0b0e0e0e0c000450313d2a1b00011a460b0e0e0e0c0003293b1a430b0c000303033c0214293b1a3e0b0e0e0e0c00033c2a1acb0a0c000364030329020a291b00011ab30a0c0003222035293b1af00a0e0c00032222372c3b1a140b0e0c0003030c1b00012d1a8f0a0c000302012c291a750a0e0e0c00020303290207291af70a0c00022928ff1af60a020286000e0e0e0c00032c2e2b1aae0a0e0e0e0c00042227352f3c1a500a0e0c00032a3b2b1a9e0a0e0e0e0c000450343c1aa20a0e0e0e0c000303033b0249220c3b1a990a0e0e0c0003293c1a270a0c00030304220d020a220d28ff1a370a0c0003291b00011a950a0e0e0c0003220e3c1a220a0e0e0e0c00032a2a25112511260f2001013b2704271522143b1a260a0e0e0e0c0003293c1ad3090c000322163b2b1a210a0e0e0c000450220e3d1abd090e0e0c000322173b1afa090e0e0e0c0003293c1acf090c0003221b22121ac5090e0e0c00032a2a1a93090c00032d2a221e1a290a0e0e0c0004221b3b3c1ad5090e0e0c0004503b270b025622123c1a140a0e0c000322133b3c1a99090e0e0c000422141a97090c0002221535293b1a94090e0c0003221737292b280c1a8e090e0e0e0c00042219352c3c1a30090e0c00032a3b2b1a7e090e0e0e0c0004503b27092705660fd22b3b1a1a090e0e0e0c000303033c0238220f3629293528071a04090e0c0003030c2936292502501e133b64021a2935401aec080e0c000303033c020b29353e1add080e0e0c00036503682b291ab8080e0c00021ab9080e0e0c0002032d29352a362a3c3c3b22142214221422142214221422142214121400010001000c000d2a250426031e393b6602013b64221036293c3c3b22132213221322132213221322132213121300010001000e0e0c000d650fcc220f36293c3c3b221222122212221222122212221222121212000100010002021c070c000d2d291a2b080c00021a2d080e0e0c0002032d29352a362a3c3c3b22162216221622162216221622162216121600010001000c000d2a250426031e383b6602013b643b2e1a92080e0e0e0c0003030c2d280b1a84080e0c000302013b039d28292e1add070e0e0c0003293b1afb070c0003220f3b3c1a01080e0e0c000422101aff070c0002221135293b1afc070e0c00032213372e3b1a20080e0c000303101b00012f1a9b070202a3020c000302012e291a7d070e0e0c00020303290207291aff070c00022928ff1afe070e0e0e0c00032c2e2b1aba070e0e0e0c00042218352f3c1a5c070e0c00032a3b2b1aaa070e0e0e0c0004503b270d0fce3b2e1ad9070e0e0c0003030c2d28fe1acc070e0c000302013b03c1220d3b3d1a5c070e0c0004220e1a5b070c0002220f35293b1a58070e0c0003221137292b28221a52070e0e0e0c00042213352c3c1af4060e0c00032a3b2b1a42070e0e0e0c000450221535293b1a23070c0003221737220f3b1a47070c000303101b000122101ac2060e0e0e0c00030202220f291aa4060e0c00020303290207291a27070c00022928ff1a26070e0e0e0c00032c2e2b1ae2060e0e0e0c0004221c352f3c1a84060e0c00032a3b2b1ad20602025e010e0e0e0c0004503b27110fca220d3b3e1a9b060c0004220e1a9b060c0002220f35293b1a98060e0c0003221137292b28131a92060e0e0e0c00042213352c3c1a34060e0c00032a3b2b1a82060e0e0e0c000450220c3d2a1b00011a79060e0e0c0003293b1a77060c000303033c0214293b1a72060e0e0e0c00033c2a1aff050c000364030329020a291b00011ae7050c0003221935293b1a24060e0c0003221b372c3b1a48060e0c0003030c1b00012d1ac3050c000302012c291aa9050e0e0c00020303290207291a2b060c00022928ff1a2a06020286000e0e0e0c00032c2e2b1ae2050e0e0e0c00042220352f3c1a84050e0c00032a3b2b1ad2050e0e0e0c000450343c1ad6050e0e0e0c000303033b0249220c3b1acd050e0e0c0003293c1a5b050c00030304220d020a220d28ff1a6b050c0003291b00011ac9050e0e0c0003220e3c1a56050e0e0e0c00032a2a25112511260f2000013b27042715220d3b1a5a050e0e0e0c0003293c1a07050c0003220f3b2b1a55050e0e0c0004503b2706220f3b1af6040e0e0e0c000307cb333b1a29050e0e0c0003293b1ad7040c00033b2a1a67050c0003030c29280b1a5c050e0c000302013b039928292a1ab5040e0e0c0003293b1ad3040c0003220f3b3c1ad9040e0e0c000422101ad7040c0002221135293b1ad4040e0c00032213372e3b1af8040e0c0003030c1b00012f1a73040c000302012e291a59040e0e0c00020303290207291adb040c00022928ff1ada040e0e0e0c00032c2e2b1a96040e0e0e0c00042218352f3c1a38040e0c00032a3b2b1a86040e0e0e0c0004503b270d0fd23b2a1ab50402029b020e0e0c0003030c2928fe1aa4040e0c000302013b03c1220d3b3d1a34040e0c0004220e1a33040c0002220f35293b1a30040e0c0003221137292b28221a2a040e0e0e0c00042213352c3c1acc030e0c00032a3b2b1a1a040e0e0e0c000450221535293b1afb030c0003221737343b1a20040e0c000303101b0001220c1a9a030e0e0e0c0003020134291a7d030e0e0c00020303290207291aff030c00022928ff1afe030e0e0e0c00032c2e2b1aba030e0e0e0c0004221c352f3c1a5c030e0c00032a3b2b1aaa0302025e010e0e0e0c0004503b27110fca220d3b3e1a73030c0004220e1a73030c0002220f35293b1a70030e0c0003221137292b28131a6a030e0e0e0c00042213352c3c1a0c030e0c00032a3b2b1a5a030e0e0e0c000450313d2a1b00011a52030e0e0e0c0003293b1a4f030c000303033c0214293b1a4a030e0e0e0c00033c2a1ad7020c000364030329020a291b00011abf020c0003221935293b1afc020e0c0003221b372c3b1a20030e0c0003030c1b00012d1a9b020c000302012c291a81020e0e0c00020303290207291a03030c00022928ff1a0203020286000e0e0e0c00032c2e2b1aba020e0e0e0c00042220352f3c1a5c020e0c00032a3b2b1aaa020e0e0e0c000450343c1aae020e0e0e0c000303033b0249220c3b1aa5020e0e0c0003293c1a33020c00030304220d020a220d28ff1a43020c0003291b00011aa1020e0e0c0003220e3c1a2e020e0e0e0c00032a2a25112511260f2001013b27042715220d3b1a32020e0e0e0c0003293c1adf010c0003220f3b2b1a2d020e0e0c000450303d1aca010e0e0e0c000322103b1a06020e0e0e0c0003293c1adb010c00032214341ad2010e0e0e0c00032a2a1a9f010c00032d2a22171a35020e0e0c000422143b3c1ae1010e0e0c0004503b270b0256343c1a21020e0e0c0003220c3b3c1aa5010e0e0c0004220d1aa3010c0002220e35293b1aa0010e0c0003221037292b280c1a9a010e0e0e0c00042212352c3c1a3c010e0c00032a3b2b1a8a010e0e0e0c0004503b2709642b287e1a99010e0e0c000303043b5002041ad301103b503435293b1a51010e0e0c0003220d37292b3b1a4b010c0004220f352c3c1af0000e0c00032a3b2b1a3e010e0e0e0c000450313c1ada000e0e0e0c0003221235293b1a14010e0c00032214372c3b1a38010e0c0003030c1b00012d1ab3000c000302012c291a99000e0e0c00020303290207291a1b010c00022928ff1a1a010e0e0e0c00032c2e2b1ad6000e0e0e0c00042219352f3c1a78000e0c00032a3b2b1ac6000e0e0e0c000450221a3b1aa9000e0e0c00032922141a7e000e0e0e0c0003221c3b2b1aa1000e0e0c0004503b27171f0a0e0e0e0e0e0e000000000000000098160000000000000000000000000000|@4832,@4833,I105,I218,I106,I251,@4801,@4835,I111,I107,@4793,@4684,@4682,I253,@4650,I255,I110,I113,I231,I234,I152,I243,I109,I232,@4838,@4735,I233,@4787,@4831| 4831:O4|@14322,@596,@4842,@4841 4832:S31|494e5447434f444528292e636f646567656e28352967656e4576616c283229 4833:O1|@4834 4834:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@4833| 4835:O4|@14322,@596,@4837,@4836 4836:O5|@4637,837,0,837,0 4837:S37|7374617469634c696e6b56616c75653a206d697373696e672064656356656320656e747279 4838:O1|@4839 4839:D18,1600|00822d1b00011a3f060c0003030c2c1b00011a33060c000302013b07d82d3f1a2e060e0e0e0c000303c42b3d1a29060e0e0c00032c3b3d1a26060e0e0e0c00042d1a24060e0c00022e35293b1a21060e0e0c00033037292b287e1a1b060c000432352c3c1a19060e0e0c00032a3b2b1a16060e0e0e0c0004503435293b1af0050e0c0003220d37220f3b1abb050c000303101b000122101ae6050e0e0e0c00030202220f291ae8050e0c00020303290207291ae3050c00022928ff1ae2050e0e0e0c00032c2e2b1aae050e0e0e0c00042212352f3c1aa8050e0c00032a3b2b1aa6050e0e0e0c0004503b27120fd72d3e1a5d050202cb020e0e0c000307c92c3e1a4d050e0e0c000303542b3c1a49050e0e0c00032c3b3c1a46050e0e0e0c00042d1a44050e0c00022e35293b1a41050e0e0c00033037292b28801a3b050c000432352c3c1a39050e0e0c00032a3b2b1a36050e0e0e0c0004503b27090fd62c3d1aed040e0e0c000303542b3c1ae9040e0e0c00032c3b3c1ae6040e0e0e0c00042d1ae4040e0c00022e35293b1ae1040e0e0c00033037292b287f1adb040c000432352c3c1ad9040e0e0c00032a3b2b1ad6040e0e0e0c0004503b270902ca2b3d1a95040204f901c1000c00032c3b3d1a8e040e0e0e0c00042d1a8c040e0c00022e35293b1a89040e0e0c00033037292b287d1a83040c000432352c3c1a81040e0e0c00032a3b2b1a7e040e0e0e0c0004503435293b1a58040e0c0003220d37220f3b1a23040c000303141b000122101a4e04020252000e0e0e0c00030202220f291a4c040e0c00020303290207291a47040c00022928ff1a46040e0e0e0c00032c2e2b1a12040e0e0e0c00042212352f3c1a0c040e0c00032a3b2b1a0a040e0e0e0c0004503b27120fd52b3e1ac9030e0e0c00032c3b3e1ac6030e0e0e0c00042d1ac4030e0c00022e35293b1ac1030e0e0c00033037292b287b1abb030c000432352c3c1ab9030e0e0c00032a3b2b1ab6030e0e0e0c0004503435293b1a90030e0c0003220d3722103b1a5b030c000303101b000122111a86030e0e0e0c000302022210291a88030e0c00020303290207291a83030c00022928ff1a82030e0e0e0c00032c2e2b1a4e030e0e0e0c00042212352f3c1a48030e0c00032a3b2b1a46030e0e0e0c000450221435293b1a1f030c000322163722183b1aeb0202025f000c000303101b000122191a12030e0e0e0c000302022218291a14030e0c00020303290207291a0f030c00022928ff1a0e030e0e0e0c00032c2e2b1ada020e0e0e0c0004221b352f3c1ad4020e0c00032a3b2b1ad2020e0e0e0c0004503b271b0fd22b28051a90020e0c00032c3b28051a8d020e0e0c00042d1a8c020e0c00022e35293b1a89020e0e0c00033037292b287c1a83020c000432352c3c1a81020e0e0c00032a3b2b1a7e020e0e0e0c000450220d3d2a1b00011a8d020e0e0c0003293b1a2b020c000303033c0214293b1a7e020e0e0e0c00033c2a1a7b020c000364030329020a291b00011a33020c0003220f35293b1a18020e0c00032211372c3b1ae4010e0c0003030c1b00012d1a0f020c000302012c291a15020e0e0c00020303290207291a0f020c00022928ff1a0e0202028d010e0e0e0c00032c2e2b1ad6010e0e0e0c00042216352f3c1ad0010e0c00032a3b2b1ace010e0e0e0c000450343c1a8a010e0e0e0c000303033b0249220c3b1ad9010e0e0c0003293c1ad7010c00030304220d020a220d28ff1acf010c0003291b00011acd010e0e0c0003220e3c1aba010e0e0e0c00032a2a25112511260f2000013b2704270d220d3d2a1b00011a82010e0e0e0c0003293b1a1f010c000303033c0214293b1a72010e0e0e0c00033c2a1a6f010c000364030329020a291b00011a27010c0003221035293b1a0c010e0c00032212372c3b1ad8000e0c0003030c1b00012d1a03010c000302012c291a09010e0e0c00020303290207291a03010c00022928ff1a02010e0e0e0c00032c2e2b1ace000e0e0e0c00042217352f3c1ac8000e0c00032a3b2b1ac6000e0e0e0c000450343c1a82000e0e0e0c000303033b0248220c3b1ad1000e0e0c0003293c1acf000c00030304220d020a220d28ff1ac7000c0003291b00011ac5000e0e0c0003220e3c1ab2000e0e0e0c00032a2a25112511260f1efd3b27042717440e0e0e0e000000000000000030060000000000000000000000000000|@4840,I234,I113,@4735,@4684,@4682,I253,@4650,I106,I255,I105,I152,I243,I110,I231,I251,I107,I109| 4840:S28|494e54434f4445434f4e5328292e67656e5461696c43616c6c283329 4841:O5|@4649,1238,0,1238,0 4842:S35|67656e456e746572496e7443616c6c3a20746f6f206d616e7920617267756d656e7473 4843:D49,1992|00832e230c2f230e3035293b1ac1070e0e0c00032928081abe070e0e0e0c0003293b1abb070c000303033c0214293b1ab6070e0e0e0c00033c2a1ab3070c000364030329020a2928081aac070e0c0003293b1a8b070c000327041aa3070c000203373035293b1a67070c00033237292b280e1a93070c000434352c3c1a79070e0e0c00032a3b2b1a86070e0e0e0c000426071e8a3b270602013b3135293b1a2f070c00033b28082a1b00011a2a070e0e0e0c0003293b1a27070c000303033c0214293b1a22070e0e0e0c00033c2a1a1f070c000364030329020a291b00011a17070c0003220e35293b1ae4060e0c00032210372c3b1a20070e0c0003030c1b00012d1af3060c000302012c291a11070e0e0c00020303290207291a0b070c00022928ff1a0a070e0e0e0c00032c2e2b1ad6060e0e0e0c00042215352f3c1ab8060e0c00032a3b2b1ac6060e0e0e0c000450343c1a8a060e0e0e0c000303033b0248220c3b1a81060e0e0c0003293c1a7f060c00030304220d020a220d28ff1ab7060c0003291b00011ab5060e0e0c0003220e3c1aa2060e0e0e0c00032a2a25112511260f1efd3b2704270d34230b293b1a1d060e0e0c0003220d35293b1a10060e0c0003293b1a1f060c0003293c1a1f060c000303032a020b2a28071a59060e0e0c00032928081a56060e0e0e0c0003292f1a03060c0003293f1afb050c000322142308293b1ac7050c000329291a0f060c00021ae9050e0e0c000207d129352a362a352b36221b373d2c2b1a19060e0e0c0004293b1aa7050c000303043b5002041a0b06103b502b3f1aab050c000328082a1a02060e0e0e0c000322152a1a96050e0e0e0c00032f3d1a8b050c00032a2a1ac3050c00033b2a1ae3050c0003030c291ae2051a8f050c000302013b03043b5002041ad805103b50293d332b1b00011a33050c0003293b1a33050c000303033c0214293b1a2e050e0e0e0c00033c2a1a2b050c000364030329020a291b00011a23050c00032227372a3b1a38050e0c000303101b00012b1a0b0502029e000c000302012a291a25050e0e0c00020303290207291a1f050c00022928ff1a1e050e0e0e0c00032c302b1aea040e0e0e0c0004313c1ab7040c000303033b024f323b1ab2040e0e0e0c0003293c1aaf040c0003030333020b3328ff1ae9040e0e0c0003291b00011ae5040e0e0c0003343c1ad3040c0003343c1a8b040c00032b2b2b250f250f250f260c1edd3b2705270a33250d260c207a013b270c02013b642c1a8b040c000203032c02072c1a87040c0002293b1a47040c000303033c020b291ac3041ac8040e0c000303041ac704103b503b502928413b1ac3040c00043b2a693c28402b1ab6040e0e0e0c0004221b23072a68012a3b2b1a23040c000450221d37221e35293b1ad4030e0c00032b2f2b3b1a91040e0e0c0005220f28081a45040e0e0c0003292a3222241a80040e0c0005220f3c1a0e040e0e0e0c00032928081a22040e0e0e0c000322183c1ab6030e0e0e0c0003292b220d22281a4f040c000522153c1a9e030e0e0e0c00032928081af2030e0e0e0c00033b2a2210222b1a2b040c0005220f3b1a52030e0e0e0c00032935293b1a65030e0e0c000303043b5002041a0f04103b502a362928421a0c040e0c00033d2b6922143b2b1a5e030e0e0e0c000450222f39291af8031a2d030e0e0c000303033c0222291a4f030c00021a29030e0e0c00020310293b1ad5033b28081ad7030c000602013b03033b020129221f3d1afd020e0e0c000322173b1aca020e0e0e0c00032935293d1add020e0e0c000303043b5002041aa703103b502a36291aa6030e0e0e0c0002293b1ae3020c0003030c1a9b032a1ab7020c00030201292e3b1acc020e0c000303033c020b292f1a06030e0e0e0c000303362e3c1a79030e0e0c00032a3c1a6f030c0003293b691a6e032a692c2a691a6e032a6927051a6f030c00021a71031a76032b1a7a036b103b503b502e1a80020e0c000203032e02072e1a7b020c00022c2a321a5a020e0e0e0c0004223938293b1a0c020e0c00033c2a291a52020e0e0e0c00021a29020e0e0c0002036129352a362a353b1a08020e0c000303033b02372a3622402e2b1a1e030e0e0e0c00042241230b2242230b293b1ac3010c0003293c1a23020c00032c3b2b1af2010e0e0e0c0004503b27062d3c1acb010c0003292c2506250626041e6e3b270402013b65223c230b293b1a86010e0e0e0c0003293b1a8b010c000365034322213b1a6f010c00032935293d1a85010e0e0c000303043b5002041aa702103b502a36293d1a2d020e0e0c00033c2b6922263b2b1a7e010e0e0e0c0004503b270502013b223d2306032522223b1a25010e0e0c000329352a362a3b1a37010c000303041a6702103b503b502966023522223b1a00010e0c000329352a362a3b1a13010c000303041a4302103b503b503c3b2b1aa0010e0c0004291a38020e0c00022a2705223e2a1a33020c00032238039c223f3922252a2238223d224222421a23020c0007224138293b1aa8000e0c0003223928201ac5000e0e0c0003292b291ae2000e0e0e0c00021ab9000e0e0c0002034d29352a362c3d1a89010e0e0c000322430e0e0e0c0002280922440e0c00022c2245224b1ad4010e0c00044022460e0e0c00023028081a72000e0e0e0c0003292f2509250926071e5a3b270702013b654022400e0c0002270602013b2b273b1f040e0e0000000000000000b8070000000000000000000000000000|@4845,I253,I110,I113,I231,I251,I106,I218,@4650,I255,I234,I105,I152,I243,I107,I109,@4711,@4846,I108,I232,65536,@4849,72057594037927935,I247,@2408,I11,@4652,@4852,@4858,I200,I48,I154,@4861,I15,@410,@243,@4671,@4864,@104,@14322,@596,@4865,@4866,@4869,@4795,I47,@4872,@4878,@4844| 4844:O1|@4889 4845:S25|494e54434f4445434f4e5328292e636f7079436f6465283129 4846:O4|@14322,@596,@4848,@4847 4847:O5|@4649,1330,0,1330,0 4848:S35|6669787570436f6e7374616e744c6f61643a20616c72656164792066697865642d7570 4849:O4|@14322,@596,@4851,@4850 4850:O5|@4649,1342,0,1342,0 4851:S55|6669787570436f6e7374616e744c6f61643a20636f6e7374616e7420746f6f2064697374616e74202831362d626974206f666673657429 4852:O1|@4853 4853:D2,40|00832e2e2e3b2f1a2600307b07060006000000000000000018000000000000000000000000000000|@4855,@4854| 4854:O1|@4856 4855:S24|494e54434f4445434f4e5328292e7365744c6f6e67283329 4856:D16,304|00842c28081a30010e0c000303033b0fd22b3b1a2a010e0e0e0c0003291a28010e0c0002290c0001651a24010e0c0002030c2e2d1a21010e0e0c0003021b2e28081a14010e0c0003292e1a13010c0003293c1a0b010c000365301b00011a08010e0c0003293b1acf000c000303033c0214293b1afa000e0e0e0c00033c2a1af7000c000364030329020a291b00011ac7000c0003291ae8000e0c00020303290207291ae3000c00022928ff1ae2000e0e0e0c0003322e2b1ade000e0e0e0c000450343b1aaa000e0e0e0c0003293c1aa7000c00030304220c020e220c28ff1a7f0002022b000c0003291b00011ab1000e0e0c0003343c1a5f000c00032a220f220f2c220f1aa10022100e0e7b071000061f050e0e0e0e0e0e000000000000000020010000000000000000000000000000|@4857,I113,I253,I189,I218,I106,I107,I110,I231,I251,I105,I152,I243,@4650,I109,@4854| 4857:S35|494e54434f4445434f4e5328292e7365744c6f6e672833297075744279746573283429 4858:O4|@14322,@596,@4860,@4859 4859:O5|@4657,106,0,106,0 4860:S37|63736567436f6e76657274546f436f64653a206e6f7420612062797465207365676d656e74 4861:O4|@14322,@596,@4863,@4862 4862:O5|@4657,294,0,294,0 4863:S41|63736567507574576f72643a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 4864:S19|63736567507574576f72643a20496e64657820 4865:O5|@4657,289,0,289,0 4866:O1|@4867 4867:D24,328|00822d2307293b1a46010e0e0e0c0003291a44010e0c00021a45010e0e0c000203043b5002041a3f011029353035293b1a1d010e0e0c0003293b1a33010c0003293c1a33010c000303032a020b2a28071a2d010e0e0c00032928081a2a010e0e0e0c000329220c1a26010e0e0e0c0003293d1a1b010c0003303b1ad3000c00032935293d1af1000e0e0c000303043b5002041a0301102a36291a04010e0c0002293b1a03010c0003030c1a03012a1adf000c00030201292e3b1aec000e0c000303033c020b292f1aee000e0e0e0c000303362e3c1ae9000e0e0c00032a3c1adf000c0003293b691ade002a692c2a691ade002a6927051adf000c00021ae1001ae6002b1aea006b103b502e1a4a000e0e0e0c000203032e02072e1adb000c00022c2a22141ad90022150e0e7b05150004000000000000000038010000000000000000000000000000|@4868,I253,I105,I218,@4797,I231,I251,I107,I109,I106,@4861,I15,I234,@410,I232,@243,@4671,@4864,@104,@14322,@596,@4865,I152,I255| 4868:S28|494e54434f4445434f4e5328292e636f6e73744c6162656c73283329 4869:O4|@14322,@596,@4871,@4870 4870:O5|@4657,115,0,115,0 4871:S47|63736567436f6e76657274546f436f64653a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 4872:O1|@4873 4873:D5,88|00812c2309293b1a56000e0e0e0c000329291a53000c00021a55000e0e0c0002031929352a362a32321a4c000e0c00042a250426031e243b6602013b66430e0e000000000000000048000000000000000000000000000000|@4875,I253,I105,I218,@4874| 4874:O1|@4876 4875:S29|494e54434f4445434f4e5328292e6669784f7468657252656673283229 4876:D13,304|00822d230b2e38293b1a2c010e0c00033c2a291a2a010e0e0e0c00021a29010e0e0c0002037129352a362a353b1a20010e0c000303472a3629230b220c230b2a2a1a0c010e0c000365032e220c2e220c1a05010e0e0c0004313b1adb000c0003293c1afb000c0003333b2b1afa000e0e0e0c0004503b6602013b6402013b2d3c1aed000e0e0c0003292c2506250626041e7e3b270402013b652c3b1a9a000e0e0e0c0003293b1acf000c0003640363312307293b1a81000e0e0c0003291a80000e0c00021a81000e0e0c000203043b5002041aab00102935293b1a5b000c00032935293d1a69000e0e0c000303043b5002041a9300102a36293d1a93000c00033c2b692e3b2b1a5f000c0004503b270802013b2704440e0e000000000000000020010000000000000000000000000000|@4877,I253,I105,I218,I251,@4866,I107,I255,I106,I113,@4797,@4869,I200| 4877:S38|494e54434f4445434f4e5328292e6669784f7468657252656673283229666978526566283129 4878:O1|@4879 4879:D34,4416|0085402e0e0c0002301a3c111a41110e0e0c000303033c0222301a3b110c00021a3d110e0e0c00020310303b1a19113b28081a33110c000602013b0309283f2f0e0c00020206302f0e0c00021a2111300e0c00023c28403b1a1d110e0e0c00043c28403b1a11110e0e0c00042a3b1a0f110c000329220c1a0e110e0e0e0c00036407cc2a3b1af8100e0c0003293d1aff100c0003340c00022b3b1ae3100c0003293b1aab100c000303033b020c2935292d1ae4100e0c00036464039e2c3b1abf100c00033d2a22111ad5100e0e0c00042e3b1aab100c00032a2a1acb100c0003293d1ac3100c0003280922110e0c00022a3d1a9b100c000322120e0e0e0c0002333b1a7b100c0003293d1a9b100c0003220c3b2b1a99100e0e0c000450343b1a5e100e0e0e0c0003291a2c100e0c00021a2d100e0e0c000203043b5002041a7710103b502936220d3b2b1a63100202cc0f0c0004503b270b0fd12809220c0e0e0e0c00022d3b1a17100c000322103b1a0e100e0e0e0c00032936291a42100e0e0e0c0002293b1aff0f0c0003030c1a37102a1a13100c000302012928082a1a2f100c00033b2f1a2f100c0003030c2e2a1ad50f0e0e0c000302013b03043b5002372e3c1aca0f0e0e0e0c00032a3c1abf0f0c0003293b691a06102a692c2a691a06102a6927051a07100c00021a09101a0e102b1a12106b103b502e1a5a0f0e0e0e0c000203032e02072e1a03100c00022d2a1a03100c0003220c3b1a620f0e0e0e0c0003293c1a7f0f0202e10e0c0003220e3b2b1a790f0e0e0c0004502b3b1a460f0e0e0e0c000303033c021422153b1a2d0f0e0e0c00032c2a1ac30f0c00036403041ac20f103b503b502b3c1a380f0e0c000322162a1a060f0e0e0e0c00036422170e0e0c00022c3b1afb0e0c000303033c021422153b1ae50e0e0e0c00032d2a1a7b0f0c00036403041a7a0f103b503b502c3c1af00e0e0c000322162a1abe0e0e0e0e0c0003293c1acb0e0c000303033b0fd22e3d1a760e0e0e0e0c000303033c020b2e3d1aae0e0e0e0e0c000303033c027b2e3e1a560e0e0e0e0c000303033c020b2e3e1a8e0e0e0e0e0c000303033c025b2e28811a350e0e0e0c000303033c020b2e28811a6d0e0e0e0c000303033c023b2e28051a150e0e0e0c000303033c020b2e28051a4d0e0e0e0c000303033c021b2e281a1af50d0e0e0c000303033c020b2e281a1a2d0e0e0e0c00030380293c1ab90e0e0e0c000322123b1afe0d0e0e0e0c00032a2a22201a110e0e0e0c000422143b1ae60d0e0e0e0c00032a2a1a030e0202630d0c0003292e1af70d0c0003280922200e0c00022a3d1acf0d0c000322210e0e0e0c000222193b1aae0d0e0e0e0c000329321acb0d0c0003221b3b2b1ac90d0e0e0c0004503b270a0fcb2e280f1a580d0e0c000303033c020b2e280f1a910d0e0e0c000303033c025b2e28071a390d0e0e0c000303033c020b2e28071a710d0e0e0c000303033c023b2e28821a190d0e0e0c000303033c020b2e28821a510d0e0e0c000303033c021b2e28091af90c0e0e0c000303033c020b2e28091a310d0e0e0c0003039422113b1a0c0d0e0c00033c2a221f1a210d0e0e0c000422133b1af60c0e0e0e0c00032a2a1a130d0c0003293c1a0b0d0c000322153b1ada0c0e0e0e0c0003292b1a870d0c000322173b2b1af50c02024d0c0e0e0c000450280922210c00022c3d1abf0c0c000322220e0e0e0c0002221a3b1a9e0c0e0e0e0c0003293c1abb0c0c0003221c3b2b1ab90c0e0e0c0004503b270b0fd22e281e1a480c0e0c000303033c020b2e281e1a810c0e0e0c000303742809221a0e0e0e0c000222123b1a520c0e0e0e0c0003293c1af70c0c000322143b1a3e0c0e0e0e0c00033c2a22221a510c0e0e0c00042b2a1ad70c0c0003293d1a2f0c0c000322200e0e0e0c000222183b1a0e0c0e0e0e0c0003293c1a2b0c0c0003221a3b2b1a290c0e0e0c0004503b27090fcf2e28201ab80b0e0c000303033c020b2e28201af10b0e0e0c000303782809221a0e0e0e0c000222123b1ac20b0e0e0e0c0003293c1a670c0c000322143b1aae0b0202360b0e0e0e0c00033d2a22221abd0b0e0e0c00042b2a1a430c0c0003293d1a9b0b0c000322200e0e0e0c000222183b1a7a0b0e0e0e0c0003293d1a970b0c0003221a3b2b1a950b0e0e0c0004503b27090fd22e28121a240b0e0c000303033c020b2e28121a5d0b0e0e0c000307d12809221a0e0e0e0c000222123b1a2e0b0e0e0e0c00033d2a22201a410b0202a90a0e0e0c0004293d1a230b0c0003221d0e0e0e0c000222153b1a020b0e0e0e0c0003293d1a1f0b0c000322173b2b1a1d0b0e0e0c000450282c22200c000222183b1ada0a0e0e0e0c00033d2a22261aed0a0e0e0c0004293d1ad30a0c000322230e0e0e0c0002221b3b1ab20a0e0e0e0c0003293d1acf0a0c0003221d3b2b1acd0a0e0e0c000450282c22260c0002221e3b1a8a0a0202120a0e0e0e0c00033d2a222c1a990a0e0e0c0004293d1a7f0a020231000c000322290e0e0e0c000222213b1a5a0a0e0e0e0c0003293d1a770a0c000322233b2b1a750a0e0e0c0004503b27120fd32e280b1a040a0e0c000303033c020b2e280b1a3d0a0e0e0c000307ce22113b1a180a0e0c00033d2a221f1a2d0a0e0e0c000422133b1a020a0e0e0e0c00032a2a1a1f0a0c0003293d1a170a0c00032809221f0e0c00022a3d1aef090c000322200e0e0e0c000222183b1ace090e0e0e0c0003293d1aeb090c0003221a3b2b1ae9090e0e0c000450282c22230c0002221b3b1aa6090e0e0e0c00033d2a22291ab9090e0e0c0004293d1a9f090c000322260e0e0e0c0002221e3b1a7e090e0e0e0c0003293d1a9b090c000322203b2b1a99090202f1080e0e0c000450282c22290c000222213b1a5209020248000e0e0e0c00033d2a222f1a61090e0e0c0004293d1a47090c0003222c0e0e0e0c000222243b1a26090e0e0e0c0003293d1a43090c000322263b2b1a41090e0e0c0004503b27150fcd2e28161ad0080e0c000303033c020b2e28161a09090e0e0c000307d22809221a0e0e0e0c000222123b1ada080e0e0e0c00033d2a22201aed080e0e0c0004293d1ad3080c0003221d0e0e0e0c000222153b1ab2080e0e0e0c0003293d1acf080c000322173b2b1acd080e0e0c00045022173b1a91080e0e0c00033d2a22251aa5080e0e0c000422193b1a7a080e0e0e0c00032a2a1a97080c0003293d1a8f080c0003282c22250e0c00022a3d1a67080c000322260e0e0e0c0002221e3b1a46080e0e0e0c0003293d1a63080202c3070c000322203b2b1a5d080e0e0c000450282c22290c000222213b1a1a08020298000e0e0e0c00033d2a222f1a29080e0e0c0004293d1a0f080c0003222c0e0e0e0c000222243b1aee070e0e0e0c0003293d1a0b080c000322263b2b1a09080e0e0c000450282c222f0c000222273b1ac6070e0e0e0c00033d2a22351ad9070e0e0c0004293d1abf070c000322320e0e0e0c0002222a3b1a9e070e0e0e0c0003293d1abb070c0003222c3b2b1ab9070e0e0c0004503b271b0fd32e28591a48070e0c000303033c020b2e28591a81070e0e0c000303c422113b1a5c070e0c00033d2a221f1a71070e0e0c000422133b1a46070e0e0e0c00032a2a1a63070c0003293d1a5b070c00032809221f0e0c00022a3d1a33070c000322200e0e0e0c000222183b1a12070e0e0e0c0003293d1a2f070c0003221a3b2b1a2d070e0e0c000450282c22230c0002221b3b1aea060e0e0e0c00033c2a22291afd060e0e0c0004293d1ae3060c000322260e0e0e0c0002221e3b1ac2060e0e0e0c0003293c1adf060c000322203b2b1add06020235060e0e0c0004503b270f0fcd2e284f1a68060e0c000303033c020b2e284f1aa1060e0e0c000307d22809221a0e0e0e0c000222123b1a72060e0e0e0c00033c2a22201a85060e0e0c0004293d1a6b060c0003221d0e0e0e0c000222153b1a4a060e0e0e0c0003293c1a67060c000322173b2b1a65060e0e0c00045022173b1a29060e0e0c00033d2a22251a3d060e0e0c000422193b1a12060e0e0e0c00032a2a1a2f060c0003293d1a27060c0003282c22250e0c00022a3d1aff050c000322260e0e0e0c0002221e3b1ade050e0e0e0c0003293d1afb0502025b050c000322203b2b1af5050e0e0c000450282c22290c000222213b1ab205020248000e0e0e0c00033c2a222f1ac1050e0e0c0004293d1aa7050c0003222c0e0e0e0c000222243b1a86050e0e0e0c0003293c1aa3050c000322263b2b1aa1050e0e0c0004503b27150fd12e401a31050e0e0c000303033c020b2e401a6a050e0e0e0c000307ca22113b1a44050e0c00033d2a221f1a59050e0e0c00042809221c0e0c000222143b1a26050e0e0e0c00033d2a22221a39050e0e0c0004293d1a1f050c0003221f0e0e0e0c000222173b1afe040e0e0e0c0003293d1a1b050c000322193b2b1a19050e0e0c00045022193b1add040e0e0c00033b29321a92050e0e0e0c000303033b02791a8c0522240e0e0e0c0002221c3b1ab6040e0e0e0c00033d2a222a1ac9040e0e0c00042d2a1ac7040c0003293d1aa70402021f040c000322280e0e0e0c000222203b1a8204020234000e0e0e0c0003293d1a9b040c000322223b2b1a99040e0e0c000450303c1a86040e0e0e0c000329250926081e843b2708270a0fcc2e287c1a14040e0c000303033c020b2e287c1a4d040e0e0c000303a82809221a0e0e0e0c000222123b1a1e040e0e0e0c00033d2a22201a31040e0e0c0004293d1a17040c0003221d0e0e0e0c000222153b1af6030e0e0e0c0003293d1a13040c000322173b2b1a11040e0e0c000450282c22200c000222183b1ace030e0e0e0c00033d2a22261ae1030e0e0c0004293d1ac7030c000322230e0e0e0c0002221b3b1aa6030e0e0e0c0003293d1ac3030c0003221d3b2b1ac1030e0e0c0004503b270c0fd02e287b1a5003020208030e0c000303033c020b2e287b1a85030e0e0c000303a82809221a0e0e0e0c000222123b1a56030e0e0e0c00033c2a22201a69030e0e0c0004293d1a4f030c0003221d0e0e0e0c000222153b1a2e030e0e0e0c0003293c1a4b030c000322173b2b1a49030e0e0c000450282c22200c000222183b1a06030e0e0e0c00033c2a22261a19030e0e0c0004293d1aff020c000322230e0e0e0c0002221b3b1ade020e0e0e0c0003293c1afb020c0003221d3b2b1af9020e0e0c0004503b270c0fd22e284d1a8802020240020e0c000303033c020b2e284d1abd020e0e0c000307cb2809221a0e0e0e0c000222123b1a8e020e0e0e0c00033c2a22201aa1020e0e0c0004293d1a87020c0003221d0e0e0e0c000222153b1a66020e0e0e0c0003293c1a83020c000322173b2b1a81020e0e0c0004502f3c1af6020e0e0e0c000322183b1a3a020e0e0e0c00032a2a22261a4d020e0e0c0004221a3b1a22020e0e0e0c00032a2a1a3f020c0003292e1a37020c0003282c22260e0c00022a3d1a0f020c000322270e0e0e0c0002221f3b1aee01020276010e0e0e0c000329321a07020c000322213b2b1a050202020b000e0e0c0004503b27100fce2e284e1a90010e0c000303033c020b2e284e1ac9010e0e0c000307cb2809221a0e0e0e0c000222123b1a9a010e0e0e0c00033d2a22201aad010e0e0c0004293d1a93010c0003221d0e0e0e0c000222153b1a72010e0e0e0c0003293d1a8f010c000322173b2b1a8d010e0e0c0004502f3c1a02020e0e0e0c000322183b1a46010e0e0e0c00032a2a22261a59010e0e0c0004221a3b1a2e010e0e0e0c00032a2a1a4b010c0003292e1a43010c0003282c22260e0c00022a3d1a1b010c000322270e0e0e0c0002221f3b1afa00020282000e0e0e0c000329321a13010c000322213b2b1a110102020b000e0e0c0004503b2710025e293c1a7d010e0e0c00032809221b0e0c000222133b1aba000e0e0e0c00032b2a22211acd000e0e0c0004293d1ab3000c0003221e0e0e0e0c000222163b1a92000e0e0e0c0003292f1aaf000c000322183b2b1aad000e0e0c0004503b2707270e40220d0c0002260420aa103b6602013b3b27061f060e0e0e0e0e000000000000000030110000000000000000000000000000|@4881,I48,I251,I105,I218,I154,@4882,I11,I253,I234,@243,I113,@4711,I106,I255,@4883,I15,@410,I108,I232,@4671,@4699,@104,@14322,@596,@4697,I152,I252,I231,@1586,I107,@4886,I233,@4880| 4880:S2|0a09 4881:S26|494e54434f4445434f4e5328292e7072696e74436f6465283429 4882:S2|3a0a 4883:O4|@14322,@596,@4885,@4884 4884:O5|@4649,1633,0,1633,0 4885:S36|7072696e74436f64653a20696e646972656374696f6e206c69737420636f6e6675736564 4886:O1|@4887 4887:D6,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203352c352d362d2b1a61000e0e0c000303052d2f69021d2d2b1a58000e0c000303032e020f292e1a52000e0e0e0c00032b2a69646502032b3b69430e000000000000000058000000000000000000000000000000|@4888,I105,I218,I234,I113,@4886| 4888:S35|494e54434f4445434f4e5328292e7072696e74436f64652834296164644c2832292829 4889:D37,1344|00822d353c1a40050e0c000307d42d36291a3c050e0c0002035e291a32050e0e0e0c000203043b5002041a2b05103b50293b1a2b050c0003030c1a2b052a1a2f050c00030201291a2e052f0e0e0c00022a3d1a2b050c0003300c00021a2905310e0c00022c3c1a17050c0003320c0002282933327d0b0002291ad4040e0c000203041a0b05103b503b5028662a1a08050e0c0003030a1a07052e2d0e7d060002291a04050e0c0002293e1a03050c0003293d1a93040c00036507db291af9040e0e0c0002293b1a97040c0003030c1a97042a1a9b040c0003020129293c1ae004020228040e0c000328082a1ada040e0e0e0c00033b3b2928081ad4040e0c000303032a028c323b1ace040e0e0e0c0003291acc040e0c0002290c0001651ac8040e0c0002031d2b28081a44040e0c0003292b1a8b040c0003293c1a83040c00036502092b2a1a28040e0c0003291a00040e0c00020303290207291a93040c0002312a1a93040c00032d1b00011a59040e0e0c0003292b1af7030c00032e3c1aef030c00032a2a2508250826061e963b2706652b2a020238001a25040e0e0c0003291aac030e0c00020303290207291a3f040c0002302a1a1f040c00031a41042a1a45040e0e0c000327082e2d7d060002291ad4030e0c0002293e1ad3030c0003293c1a63030c000365035d291ac9030e0e0c0002293b1a67030c0003030c1a67032a1a6b030c0003020129293c1ac0030e0c0003030a1af703302f0e7d080002293c1a5b030c00031aed032a1ad9030e0e0c0003291ae8031acd030e0e0c000365302f0e7d080002291a5c030e0c0002293e1a5b030c0003293b1aeb020c0003650314291a51030e0e0c00023c2a1ab7030c00036402013b07d4293b1a59030e0e0c0003291ac8020e0c00021a59030e0e0c000207cd291ab6020e0e0e0c000203041a8b03103b503b5028662a1ae8020e0c00031a31030e0e0c0002031d291ae6020e0e0e0c0002293e1ae3020c0003293d1a73020c00036502013b07cd291ad6020e0e0e0c0002293b1a73020c0003030c1a73022a1a77020c0003020129293c1abc020e0c000328082a1aba020e0e0e0c00033b3b2928081ab4020e0c000303032a0298333b1aae020e0e0e0c0003291aac020e0c0002290c0001651aa8020e0c000203252b28081a2402020260010e0c0003292b1a67020c0003293c1a5f020202ef000c00036502092b2a1a00020e0c0003291ad8010e0c00020303290207291a6b020c0002312a1a6b020c00032d1b00011a31020e0e0c0003292b1acf010c00032e3c1ac70102024b000c00032a2a2508250826061ea23b2706652b2a1afd010e0e0c0003291a84010e0c00020303290207291a17020c0002302a1af7010c00031a51022a1a1d020e0e0c000327082f2e7d0700022a1abc010e0c0002293b1a5b010c0003030c1a5b012a1a5f010c0003020129293c1ab4010e0c0003030a1a1b0231300e7d090002293c1a4f010c00031a11022a1acd010e0e0c0003291a0c021ac1010e0e0c00036531300e7d0900022a1a60010e0c0002293b1aff000c0003030c1aff002a1a03010c0003020129293c1a58010e0c0003030a1abf0131300e7d090002293c1af3000c00031ab5012a1a71010e0e0c0003291ab0011a65010e0e0c00036531300e7d090002291a04010e0c0002293b1aa3000c0003030c1aa3002a1aa7000c0003020129293c1afc000e0c0003030a1a6301302f0e7d080002293c1a97000c00031a59012a1a15010e0e0c0003291a54011a09010e0e0c000365302f0e7d0800022d3629230603051a420102031a45012e0e0c00022a392f2e7d070002000000000000000030050000000000000000000000000000|@4891,I251,I105,@2943,I234,@410,I106,@4892,@243,@4525,@1363,I150,@4893,I17,I243,I15,I107,I108,I113,I253,I189,I218,I152,I252,@4894,@122,@4895,@4896,@4897,I248,@1363,@4890,@4898,@4899,@4897,@4894,@4890| 4890:S6|636c6f733a09 4891:S27|494e54434f4445434f4e5328292e7072696e74436f6e7374283229 4892:S7|73686f72743a09 4893:S9|52545320656e747279 4894:S6|636f64653a09 4895:S13|62797465733a093120776f7264 4896:S7|62797465733a09 4897:S6|20776f726473 4898:S12|6c6f6e673a093120776f7264 4899:S6|6c6f6e673a09 4900:S13|3c554e4b4e4f574e203235353e 4901:S8|656e746572496e74 4902:S11|3c554e4b4e4f574e20313e 4903:S4|6a756d70 4904:S9|6a756d7046616c7365 4905:S11|3c554e4b4e4f574e20343e 4906:S10|64656c48616e646c6572 4907:S11|3c554e4b4e4f574e20363e 4908:S10|6a756d704946616c7365 4909:S11|3c554e4b4e4f574e20383e 4910:S11|64656c48616e646c657249 4911:S10|63617365537769746368 4912:S6|63616c6c536c 4913:S11|63616c6c436c6f73757265 4914:S7|72657475726e57 4915:S3|706164 4916:S5|6a756d7049 4917:S7|72616973654578 4918:S9|67657453746f726557 4919:S8|6e6f6e4c6f63616c 4920:S6|6c6f63616c57 4921:S9|696e64697265637457 4922:S10|6d6f7665546f56656357 4923:S7|63616c6c536c58 4924:S12|736574537461636b56616c57 4925:S6|726573657457 4926:S8|7265736574525f77 4927:S9|636f6e737441646472 4928:S9|636f6e7374496e7457 4929:S10|696f566563456e747279 4930:S8|636f6e73744e696c 4931:S9|6a756d704261636b38 4932:S7|72657475726e42 4933:S10|6a756d704261636b3136 4934:S9|67657453746f726542 4935:S6|6c6f63616c42 4936:S9|696e64697265637442 4937:S10|6d6f7665546f56656342 4938:S12|736574537461636b56616c42 4939:S6|726573657442 4940:S7|72657365745242 4941:S9|636f6e7374496e7442 4942:S7|6c6f63616c5f30 4943:S7|6c6f63616c5f31 4944:S7|6c6f63616c5f32 4945:S7|6c6f63616c5f33 4946:S7|6c6f63616c5f34 4947:S7|6c6f63616c5f35 4948:S7|6c6f63616c5f36 4949:S7|6c6f63616c5f37 4950:S7|6c6f63616c5f38 4951:S7|6c6f63616c5f39 4952:S8|6c6f63616c5f3130 4953:S8|6c6f63616c5f3131 4954:S10|696e6469726563745f30 4955:S10|696e6469726563745f31 4956:S10|696e6469726563745f32 4957:S10|696e6469726563745f33 4958:S10|696e6469726563745f34 4959:S10|696e6469726563745f35 4960:S7|636f6e73745f30 4961:S7|636f6e73745f31 4962:S7|636f6e73745f32 4963:S7|636f6e73745f33 4964:S7|636f6e73745f34 4965:S8|636f6e73745f3130 4966:S8|72657475726e5f30 4967:S8|72657475726e5f31 4968:S8|72657475726e5f32 4969:S8|72657475726e5f33 4970:S11|6d6f7665546f5665635f30 4971:S11|6d6f7665546f5665635f31 4972:S11|6d6f7665546f5665635f32 4973:S11|6d6f7665546f5665635f33 4974:S11|6d6f7665546f5665635f34 4975:S11|6d6f7665546f5665635f35 4976:S11|6d6f7665546f5665635f36 4977:S11|6d6f7665546f5665635f37 4978:S12|636f6e737441646472585f62 4979:S12|636f6e737441646472585f77 4980:S8|63616c6c536c4358 4981:S7|72657365745f31 4982:S7|72657365745f32 4983:S10|67657453746f72655f32 4984:S10|67657453746f72655f33 4985:S10|67657453746f72655f34 4986:S12|3c554e4b4e4f574e2038353e 4987:S11|6e6f6e4c6f63616c4c5f31 4988:S11|6e6f6e4c6f63616c4c5f32 4989:S11|6e6f6e4c6f63616c4c5f33 4990:S7|63616c6c536c43 4991:S7|696f5665635f35 4992:S14|6f70636f64655f696f5665635f36 4993:S12|3c554e4b4e4f574e2039323e 4994:S12|3c554e4b4e4f574e2039333e 4995:S12|3c554e4b4e4f574e2039343e 4996:S12|3c554e4b4e4f574e2039353e 4997:S12|3c554e4b4e4f574e2039363e 4998:S12|3c554e4b4e4f574e2039373e 4999:S12|3c554e4b4e4f574e2039383e 5000:S12|3c554e4b4e4f574e2039393e 5001:S8|7265736574525f31 5002:S8|7265736574525f32 5003:S8|7265736574525f33 5004:S6|7475706c6557 5005:S6|7475706c6542 5006:S7|7475706c655f32 5007:S7|7475706c655f33 5008:S7|7475706c655f34 5009:S4|6c6f636b 5010:S5|6c64657863 5011:S9|696f5665635f323235 5012:S9|696f5665635f323236 5013:S9|696f5665635f323239 5014:S9|696f5665635f323333 5015:S9|696f5665635f323336 5016:S9|696f5665635f323531 5017:S9|696f5665635f323533 5018:S9|696f5665635f323535 5019:S13|3c554e4b4e4f574e203131383e 5020:S13|3c554e4b4e4f574e203131393e 5021:S11|7075736848616e646c6572 5022:S13|3c554e4b4e4f574e203132313e 5023:S13|3c554e4b4e4f574e203132323e 5024:S6|7461696c6262 5025:S4|7461696c 5026:S6|7461696c3362 5027:S6|7461696c3462 5028:S7|7461696c335f32 5029:S7|7461696c335f33 5030:S10|73657448616e646c6572 5031:S11|73657448616e646c657249 5032:S13|3c554e4b4e4f574e203133313e 5033:S13|3c554e4b4e4f574e203133323e 5034:S13|3c554e4b4e4f574e203133333e 5035:S13|3c554e4b4e4f574e203133343e 5036:S13|3c554e4b4e4f574e203133353e 5037:S13|3c554e4b4e4f574e203133363e 5038:S13|3c554e4b4e4f574e203133373e 5039:S13|3c554e4b4e4f574e203133383e 5040:S13|3c554e4b4e4f574e203133393e 5041:S13|3c554e4b4e4f574e203134303e 5042:S13|3c554e4b4e4f574e203134313e 5043:S13|3c554e4b4e4f574e203134323e 5044:S13|3c554e4b4e4f574e203134333e 5045:S13|3c554e4b4e4f574e203134343e 5046:S13|3c554e4b4e4f574e203134353e 5047:S13|3c554e4b4e4f574e203134363e 5048:S13|3c554e4b4e4f574e203134373e 5049:S13|3c554e4b4e4f574e203134383e 5050:S13|3c554e4b4e4f574e203134393e 5051:S13|3c554e4b4e4f574e203135303e 5052:S13|3c554e4b4e4f574e203135313e 5053:S13|3c554e4b4e4f574e203135323e 5054:S13|3c554e4b4e4f574e203135333e 5055:S13|3c554e4b4e4f574e203135343e 5056:S13|3c554e4b4e4f574e203135353e 5057:S13|3c554e4b4e4f574e203135363e 5058:S13|3c554e4b4e4f574e203135373e 5059:S13|3c554e4b4e4f574e203135383e 5060:S13|3c554e4b4e4f574e203135393e 5061:S13|3c554e4b4e4f574e203136303e 5062:S13|3c554e4b4e4f574e203136313e 5063:S13|3c554e4b4e4f574e203136323e 5064:S13|3c554e4b4e4f574e203136333e 5065:S13|3c554e4b4e4f574e203136343e 5066:S13|3c554e4b4e4f574e203136353e 5067:S13|3c554e4b4e4f574e203136363e 5068:S13|3c554e4b4e4f574e203136373e 5069:S13|3c554e4b4e4f574e203136383e 5070:S13|3c554e4b4e4f574e203136393e 5071:S13|3c554e4b4e4f574e203137303e 5072:S13|3c554e4b4e4f574e203137313e 5073:S13|3c554e4b4e4f574e203137323e 5074:S13|3c554e4b4e4f574e203137333e 5075:S13|3c554e4b4e4f574e203137343e 5076:S13|3c554e4b4e4f574e203137353e 5077:S13|3c554e4b4e4f574e203137363e 5078:S13|3c554e4b4e4f574e203137373e 5079:S13|3c554e4b4e4f574e203137383e 5080:S13|3c554e4b4e4f574e203137393e 5081:S13|3c554e4b4e4f574e203138303e 5082:S13|3c554e4b4e4f574e203138313e 5083:S13|3c554e4b4e4f574e203138323e 5084:S13|3c554e4b4e4f574e203138333e 5085:S13|3c554e4b4e4f574e203138343e 5086:S13|3c554e4b4e4f574e203138353e 5087:S13|3c554e4b4e4f574e203138363e 5088:S13|3c554e4b4e4f574e203138373e 5089:S13|3c554e4b4e4f574e203138383e 5090:S13|3c554e4b4e4f574e203138393e 5091:S13|3c554e4b4e4f574e203139303e 5092:S13|3c554e4b4e4f574e203139313e 5093:S13|3c554e4b4e4f574e203139323e 5094:S13|3c554e4b4e4f574e203139333e 5095:S13|3c554e4b4e4f574e203139343e 5096:S13|3c554e4b4e4f574e203139353e 5097:S13|3c554e4b4e4f574e203139363e 5098:S13|3c554e4b4e4f574e203139373e 5099:S13|3c554e4b4e4f574e203139383e 5100:S13|3c554e4b4e4f574e203139393e 5101:S13|3c554e4b4e4f574e203230303e 5102:S13|3c554e4b4e4f574e203230313e 5103:S13|3c554e4b4e4f574e203230323e 5104:S13|3c554e4b4e4f574e203230333e 5105:S13|3c554e4b4e4f574e203230343e 5106:S13|3c554e4b4e4f574e203230353e 5107:S13|3c554e4b4e4f574e203230363e 5108:S13|3c554e4b4e4f574e203230373e 5109:S13|3c554e4b4e4f574e203230383e 5110:S13|3c554e4b4e4f574e203230393e 5111:S13|3c554e4b4e4f574e203231303e 5112:S13|3c554e4b4e4f574e203231313e 5113:S13|3c554e4b4e4f574e203231323e 5114:S13|3c554e4b4e4f574e203231333e 5115:S13|3c554e4b4e4f574e203231343e 5116:S13|3c554e4b4e4f574e203231353e 5117:S13|3c554e4b4e4f574e203231363e 5118:S13|3c554e4b4e4f574e203231373e 5119:S13|3c554e4b4e4f574e203231383e 5120:S13|3c554e4b4e4f574e203231393e 5121:S13|3c554e4b4e4f574e203232303e 5122:S13|3c554e4b4e4f574e203232313e 5123:S13|3c554e4b4e4f574e203232323e 5124:S13|3c554e4b4e4f574e203232333e 5125:S13|3c554e4b4e4f574e203232343e 5126:S13|3c554e4b4e4f574e203232353e 5127:S13|3c554e4b4e4f574e203232363e 5128:S13|3c554e4b4e4f574e203232373e 5129:S13|3c554e4b4e4f574e203232383e 5130:S13|3c554e4b4e4f574e203232393e 5131:S13|3c554e4b4e4f574e203233303e 5132:S13|3c554e4b4e4f574e203233313e 5133:S13|3c554e4b4e4f574e203233323e 5134:S13|3c554e4b4e4f574e203233333e 5135:S13|3c554e4b4e4f574e203233343e 5136:S13|3c554e4b4e4f574e203233353e 5137:S13|3c554e4b4e4f574e203233363e 5138:S13|3c554e4b4e4f574e203233373e 5139:S13|3c554e4b4e4f574e203233383e 5140:S13|3c554e4b4e4f574e203233393e 5141:S13|3c554e4b4e4f574e203234303e 5142:S13|3c554e4b4e4f574e203234313e 5143:S13|3c554e4b4e4f574e203234323e 5144:S13|3c554e4b4e4f574e203234333e 5145:S13|3c554e4b4e4f574e203234343e 5146:S13|3c554e4b4e4f574e203234353e 5147:S13|3c554e4b4e4f574e203234363e 5148:S13|3c554e4b4e4f574e203234373e 5149:S13|3c554e4b4e4f574e203234383e 5150:S13|3c554e4b4e4f574e203234393e 5151:S13|3c554e4b4e4f574e203235303e 5152:S13|3c554e4b4e4f574e203235313e 5153:S13|3c554e4b4e4f574e203235323e 5154:S13|3c554e4b4e4f574e203235333e 5155:S13|3c554e4b4e4f574e203235343e 5156:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@5157| 5157:S24|494e5447434f444528292e67656e636f6465283329283129 5158:S11|3c746f70206c6576656c3e 5159:O1|@5160 5160:D2,32|00811a2300100e0e000000000000000010000000000000000000000000000000|@4623,@5161| 5161:O4|@14322,@596,@5163,@5162 5162:O5|@4637,1131,0,1131,0 5163:S17|746f70206c6576656c2072656163686564 5164:D2,40|008056073b691a27002c0e0e0e800002000000000000000018000000000000000000000000000000|@5157,I204| 5165:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4178| 5166:D6,96|00832e1a62000e0e0e0c00021a61000e0e0c0002032d2e362d2f3b1a5a000e0e0e0c0004292e69303c1a54000e0c00032c2a32321a51000e0e0c00052b2a69270502013b1f040e0e000000000000000050000000000000000000000000000000|@5167,I105,I218,@2288,I106,@4140| 5167:S61|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831296765744974656d283229 5168:O4|@14383,@2706,0,@5169 5169:O5|@2707,75,0,75,0 5170:D5,136|0087321a8a000e0e0e0c00021a89000e0e0c00020351323533362a362b3729352a362b372c382d392e3a2f230630230722142214221422142214221422141a5f000c00103b2c2b6a2d220f220f220f220f220f220f220f1a4e000e0e0e0c00092a2a69270702013b1f080e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,@5171,@4134| 5171:O1|@5172 5172:D7,144|008e3c28403b1a8f000c00041a91002a3434342213680622122a1a8b00220f313434220e0e0c00082b3b1a83000c0003293b2a1a82000e0e0e0c00021a81000e0e0c000203182a352b362a35292d692b2a2506250626041e253b2704020129652b22153b2c22153c22152215680827051f0f0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@5174,I11,@5175,@5173,I253,I105,I218| 5173:O1|@5179 5174:S64|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829 5175:D10,176|0080560b2c2a1aaf000c00021ab1000e0e0c000203043b5002041aab00103b502a352b362b3b1aa7000c000303032a02172b3c1aa2000e0e0e0c00032a2a2505250526031e3f3b6427040402002a2a56485659566a1a88000e0c00065029352a362a353b1a81000e0e0c000303032a020f2a362956671a77000c00033c2a69652a56671a72000e0e0e0c00032a2a692706420e0e0e0e0e0e0000000000000000a0000000000000000000000000000000|@5177,I105,I218,@611,I113,I107,@4145,I251,@2323,@5176| 5176:O1|@5178 5177:S77|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829636c6f73757265526566283129 5178:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@2323,@5176| 5179:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@5180| 5180:S81|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f7375726528382970726f636573736564426f64792d283129 5181:O4|@14322,@596,@5183,@5182 5182:O5|@4103,222,0,222,0 5183:S30|4c69667465642066756e6374696f6e206f7574206f6620636f6e74657874 5184:O1|@5185 5185:D5,88|00812c1a5a000e0e0e0c00021a59000e0e0c000203252c352d362a352b362a301a4d000e0e0c0003292b692d321a48000e0c00032a2a69270702013b430e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3315,@5184| 5186:O1|@5187 5187:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c363f2b69293c692b1a44000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@5186| 5188:O1|@5189 5189:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5188| 5190:O1|@5191 5191:D5,88|00812c1a5a000e0e0e0c00021a59000e0e0c000203252c352d362a352b362a301a4d000e0e0c0003292b692d321a48000e0c00032a2a69270702013b430e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@3315,@5190| 5192:O1|@5193 5193:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c363f2b69293c692b1a44000e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@5192| 5194:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@4130| 5195:O5|@4052,83,0,83,0 5196:S9|496e74657272757074 5197:O1|@5198 5198:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@4100,@4099| 5199:O1|@5200 5200:D13,344|00812c35401a58010e0c0003030e2c37292d1a53012e0e0e7e0500032c35280e1a3d010e0e0c000303632c36291a38012e1a3c010e0c000429291a3b010c00021a3d010e0e0c0002032d29352a362a1a26010e0e0e0c00021a25010e0e0c00021a1d010e0e0c00020309292503511e353b02013b6502013c6403033b020c1a070128452b3b6b293b69646502ae2c353f1acd000e0e0c000303912c3629353d1abe000e0e0e0c000303043b5002041adf00103b502936293b1add000e0e0c000303033c02142d3b1ad6000e0e0e0c00032a2a1ad3000c00036403041ad200103b503b50293c1ad0000e0c00032e2a1aaf000c0003291a80000e0c00021a81000e0e0c0002030d293529352a363b2b2b6a6602033c2d6929353b1a44000e0c00030304293702013b270502102c353d1a2f000c000303042c3702013b430e0e0e0e000000000000000048010000000000000000000000000000|@5202,I251,@5199,@5201,I105,I218,@14320,@4048,I234,I253,I231,@1586,I106| 5201:O1|@5203 5202:S68|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296578747261637450726f7073283129 5203:D4,80|00822d1a52000e0e0e0c00021a51000e0e0c0002031d2d352e362a2e300c00032a30301a42000e0e0e0c00042a2a69270402013b440e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@5201| 5204:D10,280|00812b3b1a19010e0e0c000303032c0fcd2c3b1a0a010e0e0e0c000303032b0fd00402002d2a56371afd000e0e0c00045029352a360402002f2a56671af1000e0e0c00045029352a362d1aeb000c00021aed000e0e0c000203142a1ada000e0e0e0c00021ad9000e0e0c000202013b03662d352b352a3556971aa4000e0c000303043b5002041abf00103b502a372a3556a71a8b000c000303043b5002041aa700103b502a372a2a220c1aa3000c000456b728452b3b6b2f3b1a64000e0c0003030332020b32301a8e000e0e0e0c00032a2a6927070221313b1a440002021a000e0c0003030332020f32321a720033020207000e7e0a00032706430e0e0e0e0e000000000000000008010000000000000000000000000000|@5206,I251,@5207,@5210,I105,I218,@1576,@5212,@5214,@5205| 5205:O1|@5216 5206:S51|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e6d657267655475706c6550726f7073283229 5207:O1|@5208 5208:D6,120|00822d1a7a000e0e0e0c00021a79000e0e0c0002033c2d352e362a35292f1a6f000c000364030b2a68012f2a452b4664021d0402002a2a301a5d000e0e0c00045029352a362d2a69322c452a46270465020b1a4b002d2a35452a364664440e0e000000000000000068000000000000000000000000000000|@5209,I105,I218,I251,@5207,@473| 5209:S48|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e73706c697450726f70732832292829 5210:O1|@5211 5211:D6,120|00822d1a7a000e0e0e0c00021a79000e0e0c0002033c2d352e362a35292f1a6f000c000364030b2a68012f2a452b4664021d0402002a2a301a5d000e0e0c00045029352a362d2a69322c452a46270465020b1a4b002d2a35452a364664440e0e000000000000000068000000000000000000000000000000|@5209,I105,I218,I251,@5210,@473| 5212:O1|@5213 5213:D7,128|00822d3b1a81000e0e0c000303192c3b1a75000e0e0c000303043b5002041a6f00103b503b023e2d352e362e1a69000e0e0c00021a69000e0e0c000203043b5002041a6300103b502e352f362c2b310e0e0c00032c2b321a56000e0e0e0c00042a2a692706440e0e000000000000000070000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@5212| 5214:O1|@5215 5215:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5214| 5216:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5205| 5217:D6,104|00822d1a6a000e0e0e0c00021a69000e0e0c000203352d352e362a352b362f313b1a5c000e0c00043c2c2c2c6b323c1a56000e0e0e0c00032e2a341a52000e0e0e0c00042b2a69270802013b440e0e0e000000000000000058000000000000000000000000000000|@5218,I105,I218,@2288,I106,@4037| 5218:S83|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129676574526573756c7473283229 5219:S19|4f7574707574206f66206f7074696d69736572 5220:O1|@5221 5221:D9,144|00802b353d1a90000e0c000303612b362c371a8b001a90002b6a2b2a1a91000e0e0c000329291a8f000c00021a91000e0e0c0002032229352a362a3629353c1a56000e0e0e0c0003640309292503511e2a3b02013b6502013c6403051a6900020a1a6c002a693d2e2b6a64270402012b420e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@5223,I251,@5222,@5220,@1385,I105,I218,@588,@627| 5222:D1,56|00802b56180c000229352a362956470e0e0c00022b2a692704420e0e0e0e0e0e000000000000000028000000000000000000000000000000|@3632| 5223:S36|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129 5224:D1,40|00803b56180c00023d2a56376a64420e000000000000000018000000000000000000000000000000|@5225| 5225:S24|434f44455452454528292e67656e436f6465283329283129 5226:O1|@5227 5227:D9,128|00802b363c1a80000e0c000303051a7f0002532b35293b1a7e000e0e0e0c00036403051a7a00023e2b363c1a5a000e0e0e0c000303051a6f00022b2b35293c1a56000e0e0e0c00036403051a620002162b363c1a32000e0e0e0c000303051a570002031a5a00420e000000000000000070000000000000000000000000000000|@5229,I234,@1338,I251,@5230,@1338,@5237,@1338,@5228| 5228:O5|0,0,0,@5232,@5241 5229:S11|7072696e742d7669736974 5230:O5|0,0,0,@5232,@5231 5231:O2|@5235,0 5232:O2|@5233,0 5233:O2|0,@5234 5234:O5|@598,197,197,0,0 5235:O2|3,@5236 5236:S9|556e56697369746564 5237:O5|0,0,0,@5232,@5238 5238:O2|@5239,0 5239:O2|3,@5240 5240:S14|5669736974656447656e6572616c 5241:O2|@5242,0 5242:O2|3,@5243 5243:S14|566973697465645370656369616c 5244:O2|@5246,@5245 5245:O2|@5248,@5244 5246:D6,232|00812c353b1ae8000e0c000303722c362d372a383b2a291ade000e0e0e0c00021add000e0e0c0002031729362b3c1ad7000c0003292b25042504511e253b6502012a65292c1ac8000e0c000329291aa7000c00021aa9000e0e0c0002031d29352a362a352b36220c56b70e0e0e0c000450292503511e283b6502013b2706024d2c353d1a6a000e0e0e0c0003033e2c362d372a2a1a79000e0e0c000329291a57000c00021a59000e0e0c0002031929352a362a352b363356970c000450292503511e243b6502013b270402013b430e0e0000000000000000d8000000000000000000000000000000|@5247,I251,I105,I218,I106,@1385| 5247:S32|434f44455452454528292e67656e436f646528332966696e6444656373283129 5248:D10,416|00822d353b1aa0010e0c000303033b0fd82d3629353d1a8f010c000303043b5002041a8b01103b502936293b1a89010e0e0c000303033c02142d3b1a82010e0e0e0c00032a2a1a7f010c00036403041a7e01103b503b50293c1a7c010e0c00032e2a1a5b010c0003293c1a3b010c0003036030353c1a30010e0c000303033b024f2b3b1a32010e0e0e0c000303033c02142f3b1a2a010e0e0e0c00032c2a1a27010c00036403041a3601103b503b502b3c1a24010e0c0003302a3d1a2a010e0e0e0c00045031315677320e0e7e0a000302ae293d1ad1000e0e0c000303033b029f30353c1ac100020297000e0e0c000303422b3b1ac1000e0e0c000303033c02142f3b1aba000e0e0e0c00032c2a1ab7000c00036403041ac600103b503b502b3c1ab4000e0c0003302a3c1aba00337b050a00042b3b1a7f000c000303033c02142f3b1a7a000e0e0e0c00032c2a1a77000c00036403041a8600103b503b502b3c1a74000e0c0003302a3d1a7a000e0e0e0c00045031315677320e0e7e0a00032704440e0e0e0e0e000000000000000090010000000000000000000000000000|@5250,I251,@5249,I234,I253,I231,@1586,I106,@1614,I255| 5249:O4|@14322,@596,@5252,@5251 5250:S41|434f44455452454528292e67656e436f646528332970726f6365737347656e416e6453706563283229 5251:O5|@598,242,0,242,0 5252:S36|646f47656e6572616c3a206e6f74204c6f61644c6f63616c206f7220436f6e7374616e74 5253:O1|@5254 5254:D16,624|00822d353b1a70020e0c000303a72d372e381a6b022b692a2a1a6c020e0c0003280e2a3b6a2d1a67020c00021a69020e0e0c000203033c0210311a63020c00022e2a1a63020c00036403041a6202103b503b50312e1a60020e0c0003293b1a17020c0003641a30020e0c000203422d3b1a4d020e0e0c000303033c0214303b1a36020e0e0e0c00032e2a1a3b020c00036403041a3a02103b503b502d3c1a38020e0c0003312a2c1a3602347b050b00043b27050fcd2d353d1abd010e0e0c000303033b0fcb2d353e1aad010e0e0c000303db2d3629291ab7010c00021ab9010e0e0c000203c329352a362a36293b1acf010c000303041aef01103b503b503d2a693f2a692b1a88010e0c00021a89010e0e0c000203033c0210331a83010c00022c2a1a83010c00036403041a8201103b503b50332c1a80010e0c0003293b1a37010c0003641a50010e0c0002034d2b3b1a6d010e0e0c000303033c0214323b1a56010e0e0e0c00032c2a1a5b010c00036403041a5a01103b503b502b3c1a58010202d2000e0c0003332a2c1a52010202c4000e0e0e0c00045102023b502c250626051ecd3b270502013b6502a92d37293b1a0c010e0c000303041a2b01103b503b503d2a693f2a692b1ac4000e0c00021ac5000e0e0c000203033c02102f1abf000c00022c2a1abf000c00036403041abe00103b503b502f2c1abc000e0c0003293b1a73000c0003641a8c000e0c000203422b3b1aa9000e0e0c000303033c02142e3b1a92000e0e0e0c00032c2a1a97000c00036403041a9600103b503b502b3c1a94000e0c00032f2a2c1a9200327b050900043b66440e000000000000000060020000000000000000000000000000|@5256,I251,@5255,@1385,I105,I218,I15,I247,@599,I253,I234,I231,@1614,I106,I255,@3576| 5255:D3,64|008056073b1a40000e0c000303041a3f00103b503d5617693f2a6928062a2f3b6b65420e0e0e0e0e000000000000000030000000000000000000000000000000|@3776,I234,@3576| 5256:S31|434f44455452454528292e67656e436f646528332961646444656373283129 5257:O1|@5261 5258:O4|@14322,@596,@5260,@5259 5259:O5|@598,282,0,282,0 5260:S31|526573756c7420766563746f72206973206e6f7420616e2061646472657373 5261:D4,120|00812c3b1a79000e0e0c0003031d2b353c1a6c000e0c000303033b020c1a680028452d3b6b293b6964022d2c352d362a35291a53001a48000e0c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@2298,I251,@14321,@5257| 5262:O1|@5263 5263:D22,848|00802b363c1a50030e0c000303051a4f030fdc2b3529353b1a4d030e0e0c00036407dd2b3529362d363c1a43030c00032a2a691a42033b1a46030e0e0e0c00032a2a0e0e0e0c00026429353b1a19030e0e0c000303932939291a2c030e0c00021a2d030e0e0c0002035f29361a19030e0e0c00021a19030e0e0c000203482935353e1ae3020c000303312935362928281ad5020e0e0c000303033c021b29287b1ac5020e0e0c000303033c020b29285b1ab5020e0e0c00036402013b1ad1020e0e0c000202013b02013b03192a1ac802691acc022a691acf022a693b3e3c3b2d68056602012a64020129293b69020245021abc022a691abf022a693b3c3b020208003b2d680527090fdd2b363c1a48020e0c000303051aa7020fdd2b3529353c1a45020e0e0c00036407dd2b3529362d363c1a3b020c00032a2a691a3a023b1a3e020e0e0e0c00032a2a0e0e0e0c00026429353b1a11020e0e0c000303972939291a24020e0c00021a25020e0e0c0002035f29361a11020e0e0c00021a11020e0e0c000203482935353e1adb010c000303312935362928281acd010e0e0c000303033c021b29287b1abd010e0e0c000303033c020b29285b1aad010e0e0c00036402013b1ac9010e0e0c000202013b02013b031d2a1ac001691ac4012a691ac7012a693b3e02024d013c3b2d68056602012a6402012902023c01293b691ac8012a691acb012a02020c00693b3c3b3b2d680527090fdd2b363c1a3c010e0c000303051ab3010fdd2b3529353d1a39010e0e0c00036407dd2b3529362d363c1a2f010c00032a2a691a2e013b1a32010e0e0e0c00032a2a0e0e0e0c00026429353b1a05010e0e0c000303972939291a18010e0c00021a19010e0e0c0002035f29361a05010e0e0c00021a05010e0e0c000203482935353e1acf000c000303312935362928281ac1000e0e0c000303033c021b29287b1ab1000e0e0c000303033c020b29285b1aa1000e0e0c00036402013b1abd000e0e0c000202013b02013b031d2a1ab400691ab8002a691abb002a693b3e020241003c3b2d68056602012a6402012902023000293b691ad4002a691ad7002a02020c00693b3c3b3b2d6805270902142b363c1a30000e0c000303051abf0002031ac200420e000000000000000040030000000000000000000000000000|@5265,I234,@1338,I251,I107,@14301,I253,I105,I218,@900,@901,@873,@871,@5266,@1338,@871,@5273,@1338,@871,@5280,@1338,@5264| 5264:O5|0,0,0,@5288,@5287 5265:S16|7072696e742d70324c6f6164466f726d 5266:O5|0,0,0,@5268,@5267 5267:O2|@5271,0 5268:O2|@5269,0 5269:O2|0,@5270 5270:O5|@4190,120,120,0,0 5271:O2|3,@5272 5272:S14|50324c6f6164417267756d656e74 5273:O5|0,0,0,@5275,@5274 5274:O2|@5278,0 5275:O2|@5276,0 5276:O2|0,@5277 5277:O5|@4190,121,121,0,0 5278:O2|3,@5279 5279:S13|50324c6f6164436c6f73757265 5280:O5|0,0,0,@5282,@5281 5281:O2|@5285,0 5282:O2|@5283,0 5283:O2|0,@5284 5284:O5|@4190,119,119,0,0 5285:O2|3,@5286 5286:S11|50324c6f61644c6f63616c 5287:O2|@5291,0 5288:O2|@5289,0 5289:O2|0,@5290 5290:O5|@4190,122,122,0,0 5291:O2|3,@5292 5292:S15|50324c6f6164526563757273697665 5293:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@2230| 5294:D11,256|00812b353c1a00010e0c000303472b36293c1afb000c00033e2a69291af9000e0e0c000203041af700103b50293b691af6002a691af9002a693b3b3b3b2d6805291ad4000e0c000203041ad300103b5029270702572b353b1aad000e0e0c000303472b36293c1aa7000c00033e2a69291aa5000e0e0c000203041aa300103b50293b691ab2002a691ab5002a693b3b3b3b2d6805291a80000e0c000203041a7f00103b5029270702031a9c003e2e69291a65000e0e0c000203041a6300103b50293b691a8a002a692c2a693b3b3b3b2d6805291a42000e0e0e0c000203041a3f00103b50292706430000000000000000f0000000000000000000000000000000|@5296,I251,@243,I105,@1363,@871,@5297,@871,@5299,@5295,@871| 5295:O2|3,@5301 5296:S31|56414c55455f4f505328292e646973706c6179466978537461747573283129 5297:O2|3,@5298 5298:S6|696e66697872 5299:O2|3,@5300 5300:S5|696e666978 5301:S6|6e6f6e666978 5302:O1|@5303 5303:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5302| 5304:O1|@5305 5305:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5304,@2929| 5306:S3|736967 5307:O3|3,@5308,@1827 5308:O2|@5309,@1829 5309:O2|49,@1969 5310:O2|@2134,@5311 5311:O2|@5312,0 5312:O4|@14310,69,@5313,0 5313:O7|@2134,2,@5315,@5314,@423,0,0 5314:O3|2,@1969,@500 5315:O2|1,@5316 5316:O3|2,@5317,0 5317:O1|@5318 5318:D1,32|00802b35420e0e0e000000000000000010000000000000000000000000000000|@5319| 5319:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72537472756374283129 5320:O2|@2148,@5321 5321:O2|@5322,0 5322:O4|@14310,69,@5323,0 5323:O7|@2148,2,@5325,@5324,@423,0,0 5324:O3|2,@1969,@1261 5325:O2|1,@5326 5326:O3|2,@5327,0 5327:O1|@5328 5328:D2,40|00802b38291a28002d0e0e0e7d040002000000000000000018000000000000000000000000000000|@5329,@2156| 5329:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72537472756374283129 5330:O2|@5332,0 5331:S4|636f6465 5332:O4|@14310,69,@5333,0 5333:O7|@5331,2,@5335,@5334,@423,0,0 5334:O3|2,@1969,@5344 5335:O2|1,@5336 5336:O3|2,@5337,0 5337:O1|@5338 5338:D3,56|00802b3629353c1a36000e0e0e0c000303043b5002041a2f0010293664420e0e000000000000000028000000000000000000000000000000|@5340,I251,@5339| 5339:O4|103,@140,@5342,@5341 5340:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f72537472756374283129 5341:O5|@5343,1341,0,1341,0 5342:S22|4e6f74206120676c6f62616c20737472756374757265 5343:S34|6d6c736f757263652f4d4c436f6d70696c65722f494e495449414c4953455f2e4d4c 5344:O5|5,0,@5346,@5345,@423 5345:O3|@5346,@423,@5347 5346:S8|636f646574726565 5347:O3|@5349,@5352,@5348 5348:O3|@5353,@450,@449 5349:O2|1,@5350 5350:O3|2,@5351,0 5351:O4|0,@14414,3,1 5352:O4|1,@14415,0,0 5353:S24|506f6c794d4c2e436f6465547265652e636f646574726565 5354:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5355:O2|@5357,@5356 5356:O2|@5358,0 5357:S6|56616c756573 5358:O4|@14325,69,@5359,0 5359:O4|@5357,@694,@5360,@423 5360:O6|@5362,I48,0,@423,@5361,0 5361:O1|@5502 5362:O4|1,@14417,@14418,@14416 5363:O2|@406,20 5364:O2|@5493,@5492 5365:O2|@5367,@5366 5366:O2|@5368,0 5367:S13|7072696e745769746854797065 5368:O4|@14310,69,@5369,0 5369:O7|@5367,2,@5371,@5370,@423,0,0 5370:O3|2,@5383,@924 5371:O2|1,@5372 5372:O3|2,@5373,0 5373:O1|@5374 5374:D7,88|00802b352c362d37291a54000e0c00021a55000e0e0c0002031229351a51002a691a54002b692a2a696602031a51002c2c2b3b1a5200337b060700050e0e0e0e000000000000000048000000000000000000000000000000|@5376,I105,I218,@5377,@5378,@5375,@2228| 5375:O2|@5380,@5379 5376:S54|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617956616c756573283129 5377:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5378:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5379:O1|@5382 5380:O1|@5381 5381:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5382:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5383:O3|3,@5384,@1827 5384:O2|@5385,@1829 5385:O2|49,@1907 5386:O2|@1308,@5387 5387:O2|@5388,0 5388:O4|@14310,69,@5389,0 5389:O7|@1308,2,@5391,@5390,@423,0,0 5390:O3|2,@5396,@924 5391:O2|1,@5392 5392:O3|2,@5393,0 5393:O1|@5394 5394:D5,128|00802b352c362a362b372c382b3d1a77000c0003030c2a353c1a6c000e0c000302013b03372a3629353d1a5b000c0003030829362968016402013b293b1a48000e0c000303041a4700103b502935292d311a4400220d0e7b050b00041a41002705420e0e0e0e0e0e000000000000000070000000000000000000000000000000|@5395,I251,@1792,@2243,@1328| 5395:S26|56414c55455f4f505328292e7072696e7456616c756573283129 5396:O3|3,@5397,@428 5397:O2|@5385,@5398 5398:O2|@1842,0 5399:O2|@5401,@5400 5400:O2|@5402,0 5401:S11|6973457863657074696f6e 5402:O4|@14310,69,@5403,0 5403:O7|@5401,2,@5405,@5404,@423,0,0 5404:O3|2,@1907,@426 5405:O2|1,@5406 5406:O3|2,@5407,0 5407:O1|@5408 5408:D2,40|00802b363b2a1a27002e0e0e7e040003000000000000000018000000000000000000000000000000|@5409,I251| 5409:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973457863657074696f6e283129 5410:O2|@5412,@5411 5411:O2|@5413,0 5412:S13|6973436f6e7374727563746f72 5413:O4|@14310,69,@5414,0 5414:O7|@5412,2,@5415,@5404,@423,0,0 5415:O2|1,@5416 5416:O3|2,@5417,0 5417:O1|@5418 5418:D4,64|00802b36291a40000e0c00021a41000e0e0c000203033c020b3b2a1a3a002e0e7e04000364420e0e000000000000000030000000000000000000000000000000|@5419,I105,I218,I251| 5419:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973436f6e7374727563746f72283129 5420:O2|@2148,@5421 5421:O2|@5422,0 5422:O4|@14310,69,@5423,0 5423:O7|@2148,2,@5425,@5424,@423,0,0 5424:O3|2,@1907,@1261 5425:O2|1,@5426 5426:O3|2,@5427,0 5427:O1|@5428 5428:D4,72|00802b382c39280d2b69291a42000e0e0e0c000203041a3f00103b502a1a40000e0c00022a2a692704420e0e0e0e0e0e000000000000000038000000000000000000000000000000|@5429,I105,@1363,@2156| 5429:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7256616c7565283129 5430:O2|@5432,@5431 5431:O2|@5433,0 5432:S14|7479706545787072657373696f6e 5433:O4|@14314,69,@5434,0 5434:O2|@5435,0 5435:O3|@5432,@423,@5436 5436:O3|@5438,@5441,@5437 5437:O3|@5442,@450,@449 5438:O2|1,@5439 5439:O3|2,@5440,0 5440:O4|0,@14420,3,1 5441:O4|1,@14421,0,0 5442:S38|506f6c794d4c2e4e616d6553706163652e56616c7565732e7479706545787072657373696f6e 5443:O2|@2134,@5444 5444:O2|@5445,0 5445:O4|@14310,69,@5446,0 5446:O7|@2134,2,@5448,@5447,@423,0,0 5447:O3|2,@1907,@500 5448:O2|1,@5449 5449:O3|2,@5450,0 5450:O1|@5451 5451:D1,32|00802b35420e0e0e000000000000000010000000000000000000000000000000|@5452| 5452:S24|5354525543545f56414c5328292e76616c4e616d65283129 5453:O2|@5455,@5454 5454:O2|@5456,0 5455:S9|7072696e7454797065 5456:O4|@14310,69,@5457,0 5457:O7|@5455,2,@5459,@5458,@423,0,0 5458:O3|2,@5471,@924 5459:O2|1,@5460 5460:O3|2,@5461,0 5461:O1|@5462 5462:D8,96|00802b352c362d37291a5c000e0c00021a5d000e0e0c0002031229351a59002a691a5c002b692a2a696602031a59003b1a5d000e0e0c00022d2d2b2d3b1a5800220c0e7b07080006000000000000000050000000000000000000000000000000|@5464,I105,I218,@5465,@5466,@5463,@1330,@1469| 5463:O2|@5468,@5467 5464:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065457870283129 5465:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5466:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5467:O1|@5470 5468:O1|@5469 5469:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5470:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5471:O3|3,@5472,@1827 5472:O2|@5473,@1829 5473:O2|49,@5474 5474:O5|5,0,@5432,@5435,@423 5475:O2|@1909,@5476 5476:O2|@5477,0 5477:O4|@14314,69,@5478,0 5478:O2|@1908,0 5479:O2|@5331,@5480 5480:O2|@5481,0 5481:O4|@14310,69,@5482,0 5482:O7|@5331,2,@5484,@5483,@423,0,0 5483:O3|2,@1907,@5344 5484:O2|1,@5485 5485:O3|2,@5486,0 5486:O1|@5487 5487:D3,80|00802b36293d1a4f000c000303112c3729353c1a42000e0e0e0c00036402013b6403043b5002041a3600102b37293664420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@5489,I251,@5488| 5488:O4|103,@140,@5491,@5490 5489:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7256616c7565283129 5490:O5|@5343,1283,0,1283,0 5491:S18|4e6f74206120676c6f62616c2076616c7565 5492:O2|@5494,0 5493:S6|747970656f66 5494:O4|@14310,69,@5495,0 5495:O7|@5493,2,@5497,@5496,@423,0,0 5496:O3|2,@1907,@5474 5497:O2|1,@5498 5498:O3|2,@5499,0 5499:O1|@5500 5500:D1,32|00802b38420e0e0e000000000000000010000000000000000000000000000000|@5501| 5501:S26|5354525543545f56414c5328292e76616c547970654f66283129 5502:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5503:O2|@5505,@5504 5504:O2|@5506,0 5505:S10|5369676e617475726573 5506:O4|@14325,69,@5507,0 5507:O4|@5505,@694,@5508,@423 5508:O6|@5510,I48,0,@423,@5509,0 5509:O1|@5560 5510:O4|1,@14423,@14424,@14422 5511:O1|@5512 5512:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 5513:O2|@2148,@5551 5514:O2|@1308,@5515 5515:O2|@5516,0 5516:O4|@14310,69,@5517,0 5517:O7|@1308,2,@5519,@5518,@423,0,0 5518:O3|2,@5534,@924 5519:O2|1,@5520 5520:O3|2,@5521,0 5521:O1|@5522 5522:D2,48|00802b352c362d371a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@5524,@5523| 5523:O1|@5525 5524:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283129 5525:D16,360|00822b1a6a010e0e0e0c00021a69010e0e0c000203122b351a65012a691a68012b692a2a696602031a65012e362f382f3b1a64010e0c000303051a63010fdb29291a2c010e0c00021a2d010e0e0c0002031f29352a362a353b1a4c010e0c000303052a68010207292503511e2b3b6502013b64291af9000e0e0c00021af9000e0e0c00020311293529353b1a1a010e0e0e0c00036402013b031c293529363b2a69291acb000c000203041a0301103b50293b696602013b3e2d69291ab2000e0e0e0c000203041aef00103b50293b693b3b3b2e2d6805291a96000e0e0e0c000203041ad300103b50291ad400691ad8002a691adb002a693b3b3b3b2d6805291a6e000e0e0e0c000203041aab00103b50221022103c220e3b02022f001ab9000e0e0c0006293b691ab6002a692c2a693b3b3b3b2d6805291a36000e0e0e0c000203041a7300103b5029270e66440e0e0e000000000000000058010000000000000000000000000000|@5527,I105,I218,@5528,@5529,@5526,I232,@854,I251,@1363,@1363,@1400,@871,@2226,@2194,@1404| 5526:O2|@5531,@5530 5527:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283329 5528:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5529:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5530:O1|@5533 5531:O1|@5532 5532:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5533:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5534:O3|3,@5535,@1827 5535:O2|@5536,@1829 5536:O2|49,@1887 5537:O2|@1889,@5538 5538:O2|@5539,0 5539:O4|@14314,69,@5540,0 5540:O2|@1888,0 5541:O2|@2134,@5542 5542:O2|@5543,0 5543:O4|@14310,69,@5544,0 5544:O7|@2134,2,@5546,@5545,@423,0,0 5545:O3|2,@1887,@500 5546:O2|1,@5547 5547:O3|2,@5548,0 5548:O1|@5549 5549:D1,32|00802b36420e0e0e000000000000000010000000000000000000000000000000|@5550| 5550:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72536967283129 5551:O2|@5552,0 5552:O4|@14310,69,@5553,0 5553:O7|@2148,2,@5555,@5554,@423,0,0 5554:O3|2,@1887,@1261 5555:O2|1,@5556 5556:O3|2,@5557,0 5557:O1|@5558 5558:D2,40|00802b38291a28002d0e0e0e7d040002000000000000000018000000000000000000000000000000|@5559,@2156| 5559:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72536967283129 5560:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5561:O2|@5563,@5562 5562:O2|@5564,0 5563:S7|496e6669786573 5564:O4|@14325,69,@5565,0 5565:O4|@5563,@694,@5566,@423 5566:O6|@5568,I48,0,@423,@5567,0 5567:O1|@5594 5568:O4|1,@14427,@14428,@14426 5569:O1|@5570 5570:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 5571:O2|@1869,@5591 5572:O2|@1308,@5573 5573:O2|@5574,0 5574:O4|@14310,69,@5575,0 5575:O7|@1308,2,@5577,@5576,@423,0,0 5576:O3|2,@1867,@924 5577:O2|1,@5578 5578:O3|2,@5579,0 5579:O1|@5580 5580:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@5296,@2224| 5581:O2|@2134,@5582 5582:O2|@5583,0 5583:O4|@14310,69,@5584,0 5584:O7|@2134,2,@5586,@5585,@423,0,0 5585:O3|2,@1867,@500 5586:O2|1,@5587 5587:O3|2,@5588,0 5588:O1|@5589 5589:D1,32|00802b35420e0e0e000000000000000010000000000000000000000000000000|@5590| 5590:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72466978283129 5591:O2|@5592,0 5592:O4|@14314,69,@5593,0 5593:O2|@1868,0 5594:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5595:O2|@5597,0 5596:S8|46756e63746f7273 5597:O4|@14325,69,@5598,0 5598:O4|@5596,@694,@5599,@423 5599:O6|@5601,I48,0,@423,@5600,0 5600:O1|@5678 5601:O4|1,@14431,@14432,@14430 5602:O1|@5603 5603:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 5604:O2|@5331,@5666 5605:O2|@1308,@5606 5606:O2|@5607,0 5607:O4|@14310,69,@5608,0 5608:O7|@1308,2,@5610,@5609,@423,0,0 5609:O3|2,@5639,@924 5610:O2|1,@5611 5611:O3|2,@5612,0 5612:O1|@5613 5613:D7,88|00802b352c362d37291a54000e0c00021a55000e0e0c0002031229351a51002a691a54002b692a2a696602031a51002c2c2b1a5300320e7b050700040e0e0e0e000000000000000048000000000000000000000000000000|@5615,I105,I218,@5616,@5617,@5618,@5614| 5614:O1|@5623 5615:S56|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617946756e63746f7273283129 5616:D3,72|00805607230e2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5617:D3,72|0080560723112c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@1319,I105,I218| 5618:O2|@5620,@5619 5619:O1|@5622 5620:O1|@5621 5621:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5622:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1319| 5623:D25,832|00822d352e362f383039303b1a39030e0e0c000303051a37030fd42c3729352e35291a33031a38030e0c000303033c0222291a33030c00021a35030e0e0c00020310293b1a11033b28081a2b030c000602013b1a1a030e0e0e0c000203363e2a69291a03030c000203041a1303103b50291a1403693b3b3b3b2d6805291ae8020e0c000203041af702103b50291a0003696602013b343c1afe020e0e0e0c00032d36291ab2021ab7020c000303033c0222291ab3020c00021ab5020e0e0c00020310293b1a91023b28081aab020c000602013b03112e2b3b220f3b1ac2020e0e0e0c000602183e2a69291a7b02020232020c000203041a8702103b502964291aa60269293b1a58020e0c000303032d020b2d2a1a9a020e0e0e0c00032f1a38021a3d020e0e0c000303033c02222f1a37020c00021a39020e0e0c000203102f3b1a15023b28081a2f020c000602013b0327040d00312a1a5f020c0003502923082a230c1a5a0222132c6a1a5b0222142c6a2a2a6927050210220f351a5202220e2212336b2a2a696533291adb010c00021add010e0e0c0002031f29352a362a353b1abc010e0c000303052a68010207292503511e2a3b6502013b64291aa9010e0e0c00021aa9010e0e0c00020311293529353b1a8a010e0e0e0c00036402013b031c293529363b2a69291a7b010c000203041ae301103b50293b696602013b3e220f69291a61010e0e0c000203041a6f01103b50293b693b3b3b2e2d6805291a46010e0e0e0c000203041a5301103b50291aac01691ab0012a691ab3012a693b3b3b3b2d6805291a1e010e0e0e0c000203041a2b01103b503b3b3b3b220e6805291a04010e0c000203041a1301103b50293b691a82012a692c2a693b3b3b3b2d6805291ae2000e0e0e0c000203041aef00103b50221f3c1afe000e0e0e0c0003221a36291ab1001ab6000e0e0e0c000303033c0222291aaf000c00021ab1000e0e0c00020310293b1a8d003b28081aa7000c000602013b0311221b2b3c22133b1abd000e0e0c000602143e2a69291a77000c000203041a8700103b502964293b691afc002a692e2a693b3b3b3b2d6805291a54000e0c000203041a6300103b5029271f2704440e0e000000000000000030030000000000000000000000000000|@5625,I232,@854,I48,I251,I105,I218,I154,@1363,@2203,@1460,I107,@2194,@5626,@5630,@1571,@5632,@5634,@5635,@1363,@5636,@871,@5624,@1452,@1452| 5624:O2|3,@5638 5625:S30|56414c55455f4f505328292e646973706c617946756e63746f7273283329 5626:O2|@901,@5627 5627:O2|@5628,@1700 5628:O2|3,@5629 5629:S2|293a 5630:O1|@5631 5631:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@5630| 5632:D3,80|00802b56180c0002291a4c000e0c00021a4d000e0e0c0002030b2935293b6929680165020b5617352d2a2e0e7d05000264420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@5633,I105,I218| 5633:S40|56414c55455f4f505328292e646973706c617946756e63746f7273283329617267456e762d283129 5634:D3,80|00802b56180c0002291a4c000e0c00021a4d000e0e0c0002030b2935293b6929680165020b5617362d2a2e0e7d05000264420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@5633,I105,I218| 5635:D7,144|00802b56191a90000e0c000303033c024a2b1a8b000c00021a8d000e0e0c0002031456091a79000e0e0c00021a79000e0e0c000202013b03212b3b56293b280856591a6b000c00021a6d000e0e0c00031a6d000e0e0c000602013b030a56073b6929680164020d5608362c2a2d0e0e0e7d040002420e0e0e000000000000000080000000000000000000000000000000|@5633,I251,I105,I218,I223,I239,I154| 5636:O2|@871,@5637 5637:O2|@873,0 5638:S7|66756e63746f72 5639:O3|3,@5640,@1827 5640:O2|@5641,@1829 5641:O2|49,@1937 5642:O2|@2134,@5643 5643:O2|@5644,0 5644:O4|@14310,69,@5645,0 5645:O7|@2134,2,@5647,@5646,@423,0,0 5646:O3|2,@1937,@500 5647:O2|1,@5648 5648:O3|2,@5649,0 5649:O1|@5650 5650:D1,32|00802b36420e0e0e000000000000000010000000000000000000000000000000|@5651| 5651:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7246756e63746f72283129 5652:O2|@2148,@5653 5653:O2|@5654,0 5654:O4|@14310,69,@5655,0 5655:O7|@2148,2,@5657,@5656,@423,0,0 5656:O3|2,@1937,@1261 5657:O2|1,@5658 5658:O3|2,@5659,0 5659:O1|@5660 5660:D2,40|00802b39291a28002d0e0e0e7d040002000000000000000018000000000000000000000000000000|@5661,@2156| 5661:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7246756e63746f72283129 5662:O2|@1939,@5663 5663:O2|@5664,0 5664:O4|@14314,69,@5665,0 5665:O2|@1938,0 5666:O2|@5667,0 5667:O4|@14310,69,@5668,0 5668:O7|@5331,2,@5670,@5669,@423,0,0 5669:O3|2,@1937,@5344 5670:O2|1,@5671 5671:O3|2,@5672,0 5672:O1|@5673 5673:D3,56|00802b3729353c1a36000e0e0e0c000303043b5002041a2f0010293664420e0e000000000000000028000000000000000000000000000000|@5675,I251,@5674| 5674:O4|103,@140,@5677,@5676 5675:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7246756e6374283129 5676:O5|@5343,1385,0,1385,0 5677:S20|4e6f74206120676c6f62616c2066756e63746f72 5678:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5679:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 5680:O2|@5682,@5681 5681:O2|@5683,0 5682:S20|707265747479526570726573656e746174696f6e 5683:O4|@14310,69,@5684,0 5684:O7|@5682,2,@5686,@5685,@423,0,0 5685:O3|2,@5687,@924 5686:O2|3,4 5687:O3|3,@5688,@428 5688:O2|@5689,@5398 5689:O2|49,@5690 5690:O3|6,@14434,79993 5691:O2|@823,@5692 5692:O2|@5693,0 5693:O4|@14310,69,@5694,0 5694:O7|@823,@771,@5696,@5695,@423,0,0 5695:O3|2,@5757,@924 5696:O2|1,@5697 5697:O3|2,@819,@5698 5698:O2|@5699,0 5699:O4|@14321,69,@5700,0 5700:O3|2,3,@5701 5701:O6|@607,@583,@5702,@815,@785,@581 5702:O2|@627,@5703 5703:O2|@5705,@5704 5704:O2|@5710,@5709 5705:O2|@1181,@5706 5706:O3|0,@5707,@609 5707:O8|@5708,@823,0,0,@794,0,0,1 5708:O4|13,0,@712,4 5709:O2|@5742,0 5710:O2|@1188,@5711 5711:O3|0,@5712,@609 5712:O8|@5714,@823,0,0,@5713,0,4,1 5713:O2|@5734,0 5714:O3|10,@5716,@5715 5715:O3|14,@5726,1 5716:O2|@5718,@5717 5717:O2|@5720,@5719 5718:O4|1,@578,0,@712 5719:O2|@5722,@5721 5720:O4|1,@578,1,@1010 5721:O2|@5724,0 5722:O4|1,@578,2,@5723 5723:O4|6,@472,2,0 5724:O4|1,@578,3,@5725 5725:O4|6,@472,3,0 5726:O2|@542,@5727 5727:O2|@3930,@5728 5728:O2|@5730,@5729 5729:O2|@5732,@5731 5730:O2|4,@1189 5731:O2|@5733,0 5732:O2|4,@1196 5733:O2|4,@2484 5734:O2|1,@5735 5735:O2|@798,@5736 5736:O2|@5738,@5737 5737:O2|@5740,@5739 5738:O3|2,1,@578 5739:O2|@5741,0 5740:O3|2,2,@578 5741:O3|2,3,@578 5742:O2|@1195,@5743 5743:O3|0,@5744,@609 5744:O8|@5745,@823,0,0,@573,0,4,1 5745:O3|10,@5747,@5746 5746:O3|14,@5727,0 5747:O2|@5749,@5748 5748:O2|@5751,@5750 5749:O4|1,@655,0,@722 5750:O2|@5753,@5752 5751:O4|1,@655,1,@1019 5752:O2|@5755,0 5753:O4|1,@655,2,@5754 5754:O4|6,@472,3,1 5755:O4|1,@655,3,@5756 5756:O4|6,@472,4,1 5757:O3|3,@5759,@5758 5758:O3|0,@5771,1 5759:O2|@5761,@5760 5760:O2|@5763,@5762 5761:O2|49,@501 5762:O2|@5765,@5764 5763:O2|50,@426 5764:O2|@5768,0 5765:O2|51,@5766 5766:O5|5,@5767,@1028,@1026,@423 5767:O2|@1210,0 5768:O2|52,@5769 5769:O5|5,@5770,@1028,@1026,@423 5770:O2|@924,0 5771:O2|49,@5772 5772:O2|50,@5773 5773:O2|51,@5774 5774:O2|52,0 5775:O2|@5777,@5776 5776:O2|@5778,0 5777:S8|636f6d70696c6572 5778:O4|@14310,69,@5779,0 5779:O7|@5777,2,@5781,@5780,@423,0,0 5780:O3|2,@11221,@11220 5781:O2|1,@5782 5782:O3|2,@5783,0 5783:O1|@5784 5784:D2,48|00802b352c362d371a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@5786,@5785| 5785:O1|@5787 5786:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283129 5787:D30,648|00822c2c1a89020e0e0c00032c291a87020c00021a89020e0e0c0002032429352a362a35291a80021a85020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a67020c0003036b1a6702291a43020c00021a45020e0e0c0002032429352a362a35291a3c021a41020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a23020c000303041a2b02103b503b50293529351a07021a0c020e0c000303043b5002041a1702103b50293765021e293529351ae8011aed010e0e0c000303043b5002041af701103b502937642e291abc010e0c00021abd010e0e0c0002032429352a362a35291adc011ab9010e0e0c00036403052a68010207292503511e303b6502013b64293b1a9b010c000303051abb01021c293529351aaa011a87010c000303043b5002041a9301103b502937647881502d03401a9c0130220d220c6b7881092b1a97010c0002052800ff6d2935280d1a50010e0c000303043b50020229103b50293729352a362a2a1a77010c0003270464020b2f220c341a70010e0c000409cd00ff6d29353c1a19010e0e0c0003030f1a5f012b0e0e0e0c0002501a5c01103b503b5029351a5a011af7000c000303562937291a54011a59010e0e0c00031a59012a1a5d010e0e0c0003291a5c011a51010e0e0c000329401a47010c00033e2a69291aa5000e0e0c000203041a4301103b503b502964300c00025028671a3a012c1a3e016b103b503b50293c1a3b010c00031a3d012a1a09010e0e0c0003291a38011afd000e0e0c000329401af3000c00033e2a69291a51000e0e0c000203041aef00103b503b5029642f02020f000c00025028671ae2002c1a06016b102705440e000000000000000078020000000000000000000000000000|@5789,@5790,I105,I218,@14401,I251,@2781,@2836,@1576,@14408,@5800,@5802,I32,@11202,@5803,@11210,@11212,@14322,@105,@130,@11215,@122,@11216,@1363,@140,@11217,I253,@11218,@11219,@5788| 5788:O5|@11214,238,0,238,0 5789:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283329 5790:O2|@5791,@14435 5791:D15,1016|00812b291af9030e0e0c00021af9030e0e0c0002032429352a362a352956571aee030e0e0e0c00036403052a68010207292503511e313b6502013b64293b1acf030c000303051acf03021c2935293556371abc030e0c000303043b5002041abf03103b502937642d291a94030e0c00021a95030e0e0c0002032429352a362a35291aa4031a89030e0e0c00036403052a68010207292503511e303b6502013b64293b1a6b030c000303051a8303021c293529351a72031a57030c000303043b5002041a5b03103b502937642f291a30030e0c00021a31030e0e0c0002032429352a362a35291a50031a25030e0e0c00036403052a68010207292503511e303b6502013b64293b1a07030c0003036b1a2f03291aeb020c00021aed020e0e0c0002032429352a362a35291a0c031ae1020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ac3020c000303041af302103b503b50293529351ad7021aac020e0c000303043b5002041aaf02103b50293765021e293529351ab8021a8d020e0e0c000303043b5002041a8f02103b5029376431291a64020e0c00021a65020e0e0c0002032429352a362a35291a9c021a59020e0e0c00036403052a68010207292503511e303b6502013b64293b1a3b020c0003036b1a6302291a1f020c00021a21020e0e0c0002032429352a362a35291a58021a15020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1af7010c000303041a2702103b503b50293529351a23021ae0010e0c000303043b5002041ae301103b50293765021e293529351a04021ac1010e0e0c000303043b5002041ac301103b502937643b2e0c00023b2d0e0e0e0c0002220c291a8a010e0e0e0c00021a89010e0e0c0002032429352a362a35291ac8011a7d010e0e0c00036403052a68010207292503511e323b6502013b64293b1a5f010c0003036b1a8701291a43010c00021a45010e0e0c0002032429352a362a35291a84011a39010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1b010c000303041a4b01103b503b50293529351a4f011a04010e0c000303043b5002041a0701103b50293765021e293529351a30011ae5000e0e0c000303043b5002041ae700103b502937643c284028201a19010e0e0c00043c284028301a0c010e0c00043c28401a0a011aff000c00043c28403b1af5000e0e0c00043c284028291ae8000e0c00043c28403b1add000e0e0c00043c2840341ad1000e0e0c00043c2840220c1ac4000e0c00043c2840220c1ab8000e0c00043c2840220d1aac000e0c000432313332221d30221422192218220e220d220f22202225220e2210221a68112716430e0e0e0e0e0e0000000000000000e8030000000000000000000000000000|@5793,I105,I218,I251,@5792,@1576,@14386,@2784,@14387,@2781,@2836,@14388,@14389,I11,I48| 5792:O1|@5794 5793:S17|4c45585f28292e696e697469616c283229 5794:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@5796,@5795| 5795:O4|103,@140,@5798,@5797 5796:S37|4c45585f28292e696e697469616c2832296572726f724d65737361676550726f632d283129 5797:O5|@5799,99,0,99,0 5798:S20|4572726f7220696e20736f7572636520636f6465 5799:S27|6d6c736f757263652f4d4c436f6d70696c65722f4c45585f2e4d4c 5800:O1|@5801 5801:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 5802:D2,48|00805607561856291a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@5804,@5803| 5803:O1|@5805 5804:S30|434f4d50494c45525f424f445928292e636f6d70696c6572283329283129 5805:D31,1024|00822b291a01040e0e0c00021a01040e0e0c0002032429352a362a35291af8031afd030e0e0c00036403052a68010207292503511e313b6502013b64293b1adf030c000303051adf03021c293529351ac6031acb030c000303043b5002041acf03103b502937642d291a9c030e0c00021a9d030e0e0c0002032429352a362a35291ab4031a99030e0e0c00036403052a68010207292503511e303b6502013b64293b1a7b030c0003036b1a9303291a57030c00021a59030e0e0c0002032429352a362a35291a70031a55030e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a37030c000303041a5703103b503b50293529351a3b031a20030e0c000303043b5002041a2303103b50293765021e293529351a1c031a01030e0e0c000303043b5002041a0303103b5029376430230a31230c32230e33230b342311220c2310220d3a220e2307220f23092210230f221123062212230d1af0022214692f2c30302210220e221131221232220d22122214680d221623062217230a2218230f2a3b1ace020e0e0e0c00032a3b1ac3020c0003221b37221c23092a3b1ab4020e0c00032a3b1aab020c00032928291a6a020e0e0e0c00031a51020e0e0c000203032902012a2928301a50020e0c00032705030a221b1a83020c000202013b221a291a1f020c00021a21020e0e0c0002032429352a362a35291a68021a1d020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aff010c000303051a4702021c293529351a36021aeb010c000303043b5002041aef01103b50293764221e37221f23092a3b1a05020e0e0c00032a3b1afb010c00032928291aba010e0e0e0c00031aa1010e0e0c000203032902012a2928301aa0010e0c000303033c020b293b1a92010e0e0e0c000327050342221e38293b1ab8010e0c00036403051ace01022c221e3a221f230e2a3b1aa0010e0c00032a3b1a97010c0003342b332c346805293b69296801291aab016927070fd00403003b2a1aa6010e0e0e0c00035029362a371aa00122192b6a2b2a691a9e0122242b1aa0010e0c0004221c033a29351a9b012a1a9f011b10271aa1010e0e0c00053b3b3c3b2d6805291ae1000e0e0c000203041a8f01103b503b502966221f0e0e0e0c000202013b222538293b1a0d010e0e0c00036403051a720102892a222622111a70010e0c0004222638293b1aec000e0c0003640312312c1a60010e0c0003296801293b6965025b2b22271a55010e0e0c000329352a36222938293b1abc000e0c0003640316342f1a3001020237000e0c0003296801293b696502262a22282b1a28010e0c00041a2901302b6a220d311a08010e0c00032968012b68012a2a69270566642707271a440e0e0000000000000000f0030000000000000000000000000000|@5807,I105,I218,@14408,I251,@5808,@1576,@14393,@2781,@2836,@5810,I253,@5814,@14437,@3597,@473,@5985,@5990,@6002,@6004,@6007,@6596,I48,@6796,@1363,@473,@6828,@8800,@9223,@2245,@5806| 5806:D2,48|00803b56180c00022956271a2a002e0e7e0400030e0e0e0e000000000000000020000000000000000000000000000000|@11138,@11137| 5807:S31|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329 5808:O1|@5809 5809:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 5810:D2,48|00805607373b2a0e0e0c000264291a27002d0e0e7d040002000000000000000020000000000000000000000000000000|@5812,@5811| 5811:O1|@5813 5812:S42|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329676c6f62616c732d283129 5813:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@5811| 5814:O2|@5815,@14436 5815:D9,248|00802b372c2309293b1af4000e0c00032928291af2000e0e0e0c0003641af0000e0c0002030e293b28291aeb000c0004503b02a42a3b1ac7000c0003293b1ac7000c00036403762d3a2e23072f230830230a31230e32230f3b2e0e0e0e0c00023b2e0e0e0e0c0002303b1a93000c00032e3b2b1aa2000e0e0e0c000450313b2d1a95000e0e0c0004502d3b1a72000e0e0e0c00032d3b2b1a7e000e0e0e0c0004502e3b2d1a71000e0e0c000450220e1a6e001a73000c0003501a7400103b503b502a3b28291a50000e0c0004502d56371a65002f7e05000365420e0e0e0e0e0e0000000000000000e8000000000000000000000000000000|@5817,I253,I251,I218,I255,@5818,@5819,@5840,@5816| 5816:O1|@5843 5817:S18|4c45585f28292e696e73796d626f6c283129 5818:S34|756e657870656374656420656e64206f662066696c6520656e636f756e7465726564 5819:O1|@5820 5820:D8,216|00812c3a2d23072e23082f230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1abe000e0e0e0c0004502b3b2b1ab1000e0e0c000450323a33230634230a220c230e220d230f2b3b1a9e000e0e0e0c00032e3b1a93000c00032b3b1a8b000c00032d3b1a83000c0003302c2e2c2e680522121a7c001a81000e0e0c0003291a80000e0c00023b3e3b3b2d6805291a79000e0e0c000203041a7700103b503c3b2b2f6b2217382218230c2a3b3c1a32000e0e0e0c0004502b2a22190e0e0e7d1a00020000000000000000c8000000000000000000000000000000|@5822,I255,I253,@5823,@5826,@5821,I105,@1363| 5821:O1|@5837 5822:S18|4c45585f28292e6c65784572726f72283229 5823:O1|@5824 5824:D3,72|008028092c1a48000e0c0003030c2b280d1a3c000e0c000302013b03033c020c2b28201a32002d0e7e030003420e0e0e000000000000000038000000000000000000000000000000|@5825,I248,I251| 5825:S15|436861722e69735370616365283129 5826:O1|@5827 5827:D3,56|00812c1a3a000e0e0e0c00023b3b2b30301a3400310e0e7b070500060e0e0e0e000000000000000028000000000000000000000000000000|@5829,I223,@5828| 5828:O1|@5830 5829:S16|537472696e672e746f6b656e73283229 5830:D13,296|00842e2e1a29010e0e0c0003032c2f2f1a1d010e0e0c000303033b021b2e301a16010e0e0e0c00032d312b1a12010e0e0e0c0004293b696502ce2e3b1a09010e0e0c000303033c02102c1a03010c00022f2a1a03010c00036403041a0201103b502c1a03010c000203032c02142e28081afd000e0e0c00032d2a1afb000c0003642c0e0e0e0c000203652f2f1aa1000e0e0c000303222e3c1ae5000e0e0c00032f3c1adb000c0003292b3131311ad800320e0e7b070900062e301a7b000c00032d312b1a7a000e0e0e0c0004303c1aaf000c0003313c1aa7000c0003292b3333331aa4000e0c00062c2a69270502192e3c1a8c000e0c0003302a3030301a8800310e0e7b070800061f050e0e0e0e0e0e000000000000000018010000000000000000000000000000|@5832,I113,I107,@5831,I234,I223,I231,@70,I105,I239,I252,I106,@5828| 5831:O1|@5833 5832:S23|537472696e672e746f6b656e73283229746f6b27283229 5833:D20,328|00822d1a4a010e0e0e0c00022d1a48010e0c0002030c2d3b1a45010e0e0c000302013b03043b5002041a3c01102c1a27010c0002030c2c3b1a25010e0e0c000302013b03043b5002041a1c01102d2d1a1e010e0e0e0c0003292b1a1b010c00036403041a1a01103b502e1ae3000c00022e3b1a13010c0003030c2d2a1a09010e0e0c000302013b03032f02a02d3b1af7000c000303051af70002912d3c1ae8000e0c000303162e28081ac4000e0c0003302a1ae300300e0e7e0800032d28101aae000e0e0e0c0003293c1ad3000c00032928081ad2000e0e0e0c0003291ad0001ad5000e0e0c000303041ad300103b502928413b1ad1000e0e0c000429321acf000c0003502808331a65000e0e0c0003342a2c2808220d1abe000e0e0e0c0006502a1abb000c0002502a270565440e0e000000000000000038010000000000000000000000000000|@5835,I223,I105,I231,@46,I239,I249,@5834,I251,I48,I252,I240,I241,72057594037927935,I247,@124,I11,I151,I198,I47| 5834:O4|11,@49,0,@5836 5835:S19|537472696e672e737562737472696e67283329 5836:O5|@72,719,0,719,0 5837:D8,128|00802b1a82000e0e0e0c00021a81000e0e0c0002034e2b352c36293b1a79000e0e0c000303183e2b69291a5b000c000203041a6b00103b50293b696402233e2b69291a43000c000203041a5300103b502a1a54000e0c00021a55002a692b2a69666502031a510042000000000000000070000000000000000000000000000000|@5839,I105,I218,I251,@1363,@5821,@871,@5838| 5838:O2|@1328,0 5839:S32|4c45585f28292e627265616b576f726473283129616464427265616b73283129 5840:O4|@14322,@596,@5842,@5841 5841:O5|@5799,600,0,600,0 5842:S11|656e64206f662066696c65 5843:D26,2888|00812c352d362e372f1a440b0e0c0002303a31230732230833230a34230e220c230f3b2e0e0c00023b2e0e0e0e0c0002303b1a230b0c00032e3b2b1a220b0e0e0e0c000450313b2d1a150b0e0e0c0004502d3b1a020b0e0e0e0c00032d3b2b1afe0a0e0e0e0c0004502e3b2d1af10a0e0e0c00045033282e1aed0a0e0e0c000307d22211352212392213230b293b1ac70a0c0003291ad80a0e0c00021ad90a0e0e0c0002032029352a362c3b2b1ab00a0e0c0004502e3b2c1aa50a0e0e0c0004503b260302223b2c0e0c0002293b1a970a0c000303033f020229352e3b2b1a7f0a0c0004503b260322113b1a6a0a0e0e0e0c000329282e1a6e0a0e0e0e0c0003641a740a0e0c0002032622113b1a480a0e0c00031a690a2a1a6d0a0e0e0c000322172a1a6a0a0e0e0e0c000326030fca22153a22162307221723082218230e3b2c0c00023b2c0e0e0e0c00022e3b2c1a0e0a02027a010e0e0e0c0004502b3b2b1afd090e0e0c000450221b35221c39221d230b293b1ae0090e0c0003291af0090e0c00021af1090e0e0c0002032029352a362c3b2b1ac8090e0c0004502e3b2c1abd090e0e0c0004503b260302223b2c0e0c0002293b1aaf090c000303033f020229352e3b2b1a97090c0004503b2603221b3b1a82090e0e0e0c000329282e1a86090e0e0e0c0003641a8c090e0c0002032a221b3b1a60090202d0000e0c00031a95092a1a81090e0e0c000322212a1a7e090e0e0e0c0003260302ae22193b28391a3c090e0c000450221f3a22202307222123082222230e3b2c0e0e0e0c00023b2c0e0e0e0c00022e3b2c1a12090e0e0e0c0004502b3b2b1a05090e0e0c0004502225352226392227230b293b1ae8080e0c0003291af8080e0c00021af9080e0e0c0002032029352a362c3b2b1ad0080e0c0004502e3b2c1ac5080e0e0c0004503b260302223b2c0e0c0002293b1ab7080c000303033f020229352e3b2b1a9f080c0004503b2603260a260a26040fce33287d1a92080e0e0e0c00030376343b282e1a7b080c0004502211352212392213230b293b1a60080e0c0003291a70080e0c00021a71080e0e0c0002032029352a362c3b2b1a48080e0c0004502e3b2c1a3d080e0e0c0004503b260302223b2c0e0c0002293b1a2f080c000303033f020229352e3b2b1a17080c0004503b260326040fd233287b1a0e080e0e0e0c0003037a343b28201af7070c0004502211352212392213230b293b1adc070e0c0003291aec070e0c00021aed070e0e0c0002032429352a362c3b2b1ac407020266070e0c0004502e3b2c1ab5070e0e0c0004503b260302223b2c0e0c0002293b1aa7070c000303033f020229352e3b2b1a8f070c0004503b260326040fd233285f1a86070e0e0e0c0003037a343b283c1a6f070c0004502211352212392213230b293b1a54070e0c0003291a64070e0c00021a65070e0e0c0002032429352a362c3b2b1a3c070202de060e0c0004502e3b2c1a2d070e0e0c0004503b260302223b2c0e0c0002293b1a1f070c000303033f020229352e3b2b1a07070c0004503b260326040fd233285d1afe060e0e0e0c0003037a343b282d1ae7060c0004502211352212392213230b293b1acc060e0c0003291adc060e0c00021add060e0e0c0002032429352a362c3b2b1ab406020256060e0c0004502e3b2c1aa5060e0e0c0004503b260302223b2c0e0c0002293b1a97060c000303033f020229352e3b2b1a7f060c0004503b260326040fd233285b1a76060e0e0e0c0003037a343b281f1a5f060c0004502211352212392213230b293b1a44060e0c0003291a54060e0c00021a55060e0e0c0002032429352a362c3b2b1a2c060202ce050e0c0004502e3b2c1a1d060e0e0c0004503b260302223b2c0e0c0002293b1a0f060c000303033f020229352e3b2b1af7050c0004503b260326040fd13328291aee050e0e0e0c0003037a343b282f1ad7050c0004502211352212392213230b293b1abc050e0c0003291acc050e0c00021acd050e0e0c0002032429352a362c3b2b1aa405020246050e0c0004502e3b2c1a95050e0e0c0004503b260302223b2c0e0c0002293b1a87050c000303033f020229352e3b2b1a6f050c0004503b260326040fd33328281a66050e0e0e0c000303af2211352212392213230b293b1a3f050c0003291a50050e0c00021a51050e0e0c0002032429352a362c3b2b1a28050e0c0004502e3b2c1a1d050202bf040e0e0c0004503b260302223b2c0e0c0002293b1a0b050c000303033f020229352e3b2b1af3040c0004503b260322113b1ade040e0e0e0c000329282a1ae2040e0e0e0c0003641ae8040e0c00020313220f3b28211ac2040e0e0e0c0004503b50020c22151af2040e0e0e0c00025026040fd133282c1aa9040e0e0c0003037a343b280b1a9304020235040c0004502211352212392213230b293b1a74040e0c0003291a84040e0c00021a85040e0e0c0002032029352a362c3b2b1a5c040e0c0004502e3b2c1a51040e0e0c0004503b260302223b2c0e0c0002293b1a43040c000303033f020229352e3b2b1a2b040c0004503b260326040fd033283b1a22040e0e0e0c0003031b343b28301a0b040c000450220d3b28201aff030c0004503b500fd63328221af9030e0e0c0003031f221122111a2b040c000350343b28341ad80302027a030e0c0004503b500fd03328231acd030e0e0c000303bb2211352212392213230b293b1aa7030c0003291ab8030e0c00021ab9030e0e0c0002032029352a362c3b2b1a90030e0c0004502e3b2c1a85030e0e0c0004503b260302223b2c0e0c0002293b1a77030c000303033f020229352e3b2b1a5f030c0004503b260322113b1a4a030202f4020e0e0e0c00032928221a4a030e0e0e0c0003640322221522151a7a030e0e0e0c000350220f3b28081a23030202c5020c0004503b50021028231a620322171a65030e0e0c00045026040fcc33287e1a050302029f020e0e0c000307d42211352212392213230b293b1adb020c0003291aec020e0c00021aed020e0e0c0002032029352a362c3b2b1ac4020e0c0004502e3b2c1ab9020e0e0c0004503b260302223b2c0e0c0002293b1aab020c000303033f020229352e3b2b1a93020c0004503b260322113b1a7e020e0e0e0c000328302a1ada020e0e0e0c0003030c2928391acc020e0c000302013b6403383c22161ac4020e0c00035022103b1a49020e0e0c0003287e2a1a6e020e0e0e0c000322123b2b1a39020202db010e0e0c0004503b26030213287e1a750222171a7802020209000e0c00045026040fd4333f1a16020e0e0e0c0003030f343b3b1a00020e0c0004503b500fd82830341a51020e0e0c0003030c3328391a44020e0c000302013b030e3b22121a3d020e0e0c0003500fcd2841341a27020c0003030c33285a1a1c020e0c000302013b03033c021b2861341a0a020e0e0e0c0003030c33287a1afc010e0c000302013b03033c020c3328271a92010e0e0e0c000303111aef011af40122131acf010c0004500fca2814293b1a72010e0e0e0c000303033b024f293c1ada010e0e0e0c00032928081ad6010e0e0e0c00031ad5012a1ad9010202e3000e0e0c000329220f1a3a010e0e0e0c00036603033c0216293c1aa1010202c3000e0e0c0003292502501e5b3b646403181a7a011a570122131a5a010202a4000e0e0e0c000450029b331a91010e0e0c00021a91012a1a0d010e0e0c00032928221a02010e0e0e0c000322142a1afe000e0e0e0c0003502214352215392216230b293b1ab0000e0c0003291ac0000e0c00021ac10002024b000e0e0c0002032029352a362c3b2b1a94000e0c0004502e3b2c1a89000e0e0c0004503b260302223b2c0e0c0002293b1a7b000c000303033f020229352e3b2b1a63000c0004503b26032607343b1a4d000e0e0c00032928291a52000e0e0e0c000364030d221122111aea0022127e1200033b270e430000000000000000380b0000000000000000000000000000|@5845,@5846,I253,I255,I251,I105,I218,@5849,@122,@5819,@5850,@5851,@5861,@5878,@5882,I248,@5971,I48,@5892,I240,I239,@5880,I252,@105,@5844,@5816| 5844:S19|756e6b6e6f776e206368617261637465722022 5845:S20|4c45585f28292e7061727365546f6b656e283129 5846:O1|@5847 5847:D8,256|00802b35293b1aff000c000328092a1afe000e0e0e0c0003030c29280d1af0000e0c000302013b03033c020c2928201ae6000e0e0e0c000303a62d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1ac6000e0e0e0c0004502b3b2b1ab9000e0e0c00045033353439220c230b293b1a8e000e0e0e0c0003291aa4000e0c00021aa5000e0e0c0002032029352a362c3b2b1a84000e0c0004502e3b2c1a79000e0e0c0004503b260302223b2c0e0c0002293b1a5b000c000303033f020229352e3b2b1a53000c0004503b2603220e1a5f00220f0e7d0f00022965420e0e0e0e0e0000000000000000f0000000000000000000000000000000|@5848,I253,I248,I251,I255,I105,I218,@5846| 5848:S24|4c45585f28292e736b697057686974655370616365283129 5849:S16|756e6b6e6f776e2073796d626f6c202e 5850:S17|756e6b6e6f776e2073796d626f6c202e2e 5851:O1|@5852 5852:D3,56|00802b352c393b2e2b1a34000e0c00042b3b2b1a32000e0e0e0c0004503b6642000000000000000028000000000000000000000000000000|@5854,@5853,I255| 5853:O1|@5855 5854:S22|4c45585f28292e7061727365436f6d6d656e74283129 5855:D4,64|00823b2c0e0c0002293b1a3b000c000303033f02022935642d2d1a33001a38002f0e0e7b06050005000000000000000030000000000000000000000000000000|@5857,I251,@5853,@5856| 5856:O1|@5858 5857:S36|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129 5858:D6,248|00832e3f1af9000e0e0c000303442d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1ada000e0e0e0c0004502b3b2b1acd000e0e0c000450331acb001ad0000e0c00035034270602873b2d0e0c0002293b1aa3000c000303033f0202293530282a1a93000c0003030c2928291a88000e0c000302013b03193b2f0e0e0c0002293b1a73000c000303033f0202293564023e3028281a60000e0c0003030c29282a1a54000e0c000302013b03133b3030300c00043030301a5e00317b06080005293030301a5100310e0e0e7b06080005651f040e0e0e0e0e0000000000000000e8000000000000000000000000000000|@5860,I251,I255,@5859,@5819,@5856| 5859:S28|656e64206f662066696c6520666f756e6420696e20636f6d6d656e74 5860:S54|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129736b6970436f6d6d656e74426f6479283129 5861:O1|@5862 5862:D10,256|00812c352d362e352f3930230b293b1af6000e0e0e0c0003291af4000e0c00021af5000e0e0c0002032029352a362c3b2b1aec000e0c0004502e3b2c1ae1000e0e0c0004503b260302223b2c0e0c0002293b1ad3000c000303033f020229352e3b2b1abb000c0004503b26037881533b31220d220d1ab8000e0c0005293b2a1a8e000e0e0e0c00021a8d000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129661a8c000e0c0002303b2b1a6a000e0e0e0c0004503b6405240e00ff6d2935331a5d000e0e0c000303043b50020229103b50331a62001a67000c0003642706430000000000000000f0000000000000000000000000000000|@5864,I253,I105,I218,I255,I251,@5865,@5875,@5863,@5819| 5863:S36|6e6f206d61746368696e672071756f746520666f756e64206f6e2074686973206c696e65 5864:S21|4c45585f28292e7061727365537472696e67283129 5865:O1|@5866 5866:D20,1536|00832d3b1a01060e0e0c000329285c1afe050e0e0e0c000307cd2d352e392f230b293b1ae2050e0e0e0c0003291ae8050e0c00021ae9050e0e0c0002031f29352a362c3b2b1ae0050e0c0004502e3b2c1ad5050e0e0c0004503b6502223b2c0e0e0c0002293b1aa7050c000303033f020229352e3b2b1aaf050c0004503b65333b1a84050e0c000333353439220c230b293b1a73050c0003291a7c050e0c00021a7d050e0e0c0002031f29352a362c3b2b1a74050e0c0004502e3b2c1a69050e0e0c0004503b6502263b2c0e0e0c0002293b1a3b050c000303033f020229352e3b2b1a430502029b020c0004503b6528092f1a3b050c0003030c2e280d1a30050e0c000302013b03033c020c2e28201afe040e0e0e0c000307cb220f1a19050e0e0c000229285c1ae6040e0e0e0c00036403043b500fd322103b1acb040c0003291afc041a01050e0e0c00031a01052a1a05050e0e0c0003291a04051af9040e0e0c000322132a1afe040e0e0e0c00035022143b1a91040e0e0c000329285c1a8e040e0e0e0c0003641a94040e0c0002033f22143b1a70040e0c00032928221a6e040e0e0e0c0003641a74040e0c0002031c22143b1a50040e0c0003293f1a4f040c0003641a58040e0c000202013b02013b03782213352214392215230b293b1a25040202e5000e0e0c0003291a28040e0c00021a29040e0e0c0002032429352a362c3b2b1a2004020244000e0c0004502e3b2c1a11040e0e0c0004503b260302223b2c0e0c0002293b1ae3030c000303033f020229352e3b2b1aeb030c0004503b260326041ed5260402023b502604220f352210392211230b293b1aa9030e0e0c0003291ab0030e0c00021ab1030e0e0c0002032029352a362c3b2b1aa8030e0c0004502e3b2c1a9d030e0e0c0004503b260302223b2c0e0c0002293b1a6f030c000303033f020229352e3b2b1a77030c0004503b260322152215221522151aad0322160e0e7b061600052e285e1a3e030e0e0e0c0003038e22103b1a28030e0c00032210352211392212230b293b1a15030e0e0c0003291a1c030e0c00021a1d030e0e0c0002031f29352a362c3b2b1a14030e0c0004502e3b2c1a09030e0e0c0004503b6502223b2c0e0e0c0002293b1adb020c000303033f020229352e3b2b1ae3020c0004503b65285c221869285e2a69302a69652217221722171a0f0322187b06180005285c2212692f2a69642211221122111af60222120e0e0e7b0612000529401a87020c000303a52d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1a7a020e0e0e0c0004502b3b2b1a6d020e0e0c00045033353439220c230b293b1a3a020e0e0e0c0003291a40020e0c00021a41020e0e0c0002032029352a362c3b2b1a38020e0c0004502e3b2c1a2d020e0e0c0004503b260302223b2c0e0c0002293b1aff010c000303033f020229352e3b2b1a07020c0004503b2603220d1a4b023b1a4f026b103b503b502928221ad3010c000303a02d3a2e23072f230830230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1ac6010e0e0e0c0004502b3b2b1ab9010e0e0c00045033353439220c230b293b1a86010e0e0e0c0003291a8c010e0c00021a8d010e0e0c0002032029352a362c3b2b1a84010e0c0004502e3b2c1a79010e0e0c0004503b260302223b2c0e0c0002293b1a4b010c000303033f020229352e3b2b1a53010c0004503b26032210270a0fcf2d352e392f230b293b1a1a010e0e0e0c0003291a20010e0c00021a21010e0e0c0002032029352a362c3b2b1a18010e0c0004502e3b2c1a0d010e0e0c0004503b260302223b2c0e0c0002293b1adf000c000303033f020229352e3b2b1ae7000c0004503b26032d3f1ac3000c0003030a301a22013b1a2e016b103b503b5028212e1aca000e0e0e0c0003030c2d287e1abc000e0c000302013b03033c020c2d28201a8a000e0e0e0c000303122d34693333331ad900340e0e0e7b060b00052d1a9c000e0c00021ae5002a1aa90002022d000e0e0c0003291adc001a99000e0e0c0003342a1a9f000c000350220d220d220d220d1a9800220e0e7b060e0005641f040e0e0e0e0e0000000000000000f0050000000000000000000000000000|@5868,I253,I251,I105,I218,I255,I248,@5846,@105,@130,@5869,@122,@5870,@5819,@5865,@5871,@5872,@5873,@5874,@5867| 5867:S16|20666f756e6420696e20737472696e67 5868:S33|4c45585f28292e7061727365537472696e67283129676574537472696e67283129 5869:S21|756e65787065637465642063686172616374657220 5870:S11|20696e205c202e2e2e205c 5871:S9|456e644f664c696e65 5872:O5|@5799,350,0,350,0 5873:O5|@5799,389,0,389,0 5874:S22|756e7072696e7461626c652063686172616374657220 5875:O2|@5876,72057594037927935 5876:D17,304|00802b1a32010e0e0e0c00021a31010e0e0c000207cc2b353b2d291a1a010e0e0e0c00021a19010e0e0c0002031729362b3c1a13010c0003292b25042504511e253b6502012a65291aed000e0e0c0002030c293b1af9000e0e0c000302013b03043b5002041af000103b50293c1af0000e0c000303032a02972928101ae9000e0e0c0003293c1ae7000c00032928081ae6000e0e0e0c00032956671ae2000e0e0e0c000303041adf00103b503b502928413b1adb000c0004292e1adb000c000350280832291a70000e0c00021a71000e0e0c0002032c29352a362d2d2c1ac00002022f000e0c0004502c3c1a7a000e0e0e0c0003292b2505250526031e38260302023b5051291a9f000c0002502927046502031a9a00420e000000000000000020010000000000000000000000000000|@5877,I105,I218,I106,I231,@132,I251,I239,I240,I241,I247,@124,I11,I151,I254,I47,I48| 5877:S31|4c696272617279537570706f72742e737472696e67496d706c6f6465283129 5878:O1|@5879 5879:D6,112|00802814293b1a6f000c000303033b0243293c1a6a000e0e0e0c00032928081a66000e0e0e0c00031a65002a1a69000e0e0c000329301a3f000c00036603033c0212293c1a39000e0e0c0003292502501e4c3b6464420e0e000000000000000060000000000000000000000000000000|@5881,I251,I240,I239,@5880,I252| 5880:S20|3a3d3c3e2b2a215e2f7c26257e2d3f60405c2423 5881:S27|436861722e636f6e7461696e732831296d61746368283129283129 5882:O1|@5883 5883:D24,576|00822b352c362d373030301a3a020e0e0e0c00042c3b1a37020c000329282e1a36020e0e0e0c00036407ce2f35303931230b293b1a19020e0e0c0003291a20020e0c00021a21020e0e0c0002031f29352a362c3b2b1a18020e0c0004502e3b2c1a0d020e0e0c0004503b6502223b2c0e0e0c0002293b1adf010c000303033f020229352e3b2b1ae7010c0004503b65313b1abc010e0c000328412a1ada010e0e0e0c0003030c29285a1acc010e0c000302013b03033c021b28612a1aba010e0e0e0c0003030c29287a1aac010e0c000302013b031b2f282e1aa5010e0e0c0003291aa401220f1aa70122107b051000042814293b1a6101020295000e0e0c000303033b0243293c1a8e010e0e0e0c00032928081a8a010e0e0e0c00031a89012a1a8d010e0e0c0003292e1a2b010c00036603033c0212293c1a5d010e0e0c0003292502501e523b646403192f282e1a2f010c0003291a6001220f1a330122107b051000041a5901301a15010e0e0c000329282e1a0a010e0e0e0c0003292c1aff000c0003220f2a1a3e0122117e1200032b3b2b1ada000e0e0e0c000450291a2f010c00023b2a1a2f010c0003640344291a1d010e0e0c00023b2a1a23010c00036403041a2201103b503b50291a91000e0e0c0002030329020b2928081ad1000e0e0c00032928271a6e000e0e0e0c00036402013b0304283a021b1af3002a1af7000c0003293b1a4f000c00030304281802022935642b3b2b1a55000e0e0c0004503b2705440e0e0e000000000000000030020000000000000000000000000000|@5885,@5886,I253,I251,I105,I218,I255,I248,@122,@5892,@5882,I240,I239,@5880,I252,@5878,@5895,@5819,I223,I234,I231,@70,@5884,@1578| 5884:O3|0,@5897,@5896 5885:S20|4c45585f28292e70617273654964656e74283329 5886:O1|@5887 5887:D3,56|00822b353b2a2f2f1a35000e0e0c00052f2a69641a31002d7d0600020e0e0e0e000000000000000028000000000000000000000000000000|@5889,@5888,@104| 5888:O1|@5890 5889:S19|4c45585f28292e726561644368617273283329 5890:D7,224|00832d3b1ae1000e0e0c0003292e0e0e0e0c000203ad2c3a2d23072e23082f230e3b2c0e0e0c00023b2c0e0e0e0c00022e3b2c1aba000e0e0e0c0004502b3b2b1aad000e0e0c0004503235333934230b293b1a93000c0003291a9c000e0c00021a9d000e0e0c0002032029352a362c3b2b1a7c000e0c0004502e3b2c1a71000e0e0c0004503b260302223b2c0e0c0002293b1a73000c000303033f020229352e3b2b1a4b000c0004503b26033b2210221022101a5a000e0e0e0c0005342a69270b02013b641f040e0000000000000000d0000000000000000000000000000000|@5891,I253,I255,I105,I218,I251,@5888| 5891:S26|4c45585f28292e7265616443686172732833296c6f6f70283129 5892:O1|@5893 5893:D3,152|008028412c1a98000e0c0003030c2b285a1a8c000e0c000302013b03033c021b28612c1a7a000e0e0e0c0003030c2b287a1a6c000e0c000302013b03033c021b28302c1a5a000e0e0e0c0003030c2b28391a4c000e0c000302013b03033c021c2b28271a42000e0e0e0c000303033c020b2b285f1a31002d7e030003420e0e0e000000000000000088000000000000000000000000000000|@5894,I248,I251| 5894:S24|4c45585f28292e6973416c7068614e756d65726963283129 5895:S20|696e76616c6964206964656e7469666572202d20 5896:O200|0,0,0,0,0,0,@5900,@5901,@5902,0,@5903,0,0,0,0,0,0,0,0,@5904,@5905,0,0,0,0,@5907,0,0,@5908,0,0,0,0,0,0,@5909,0,0,0,0,0,0,@5910,0,0,0,0,0,0,0,0,0,0,0,0,0,@5911,0,@5913,0,@5914,@5916,0,0,0,0,0,0,0,0,@5917,@5918,@5920,0,0,@5921,0,@5922,0,@5924,0,0,0,0,@5925,0,0,@5927,@5928,@5930,@5931,@5932,@5933,@5935,@5937,@5938,0,@5940,@5941,@5942,0,0,@5943,0,@5945,0,0,0,0,0,0,@5947,0,0,0,@5949,0,0,0,0,0,0,@5951,@5952,@5953,0,0,0,0,0,0,0,0,0,0,@5955,@5956,@5958,0,0,0,0,0,0,0,0,0,@5960,0,0,0,0,0,0,0,@5961,0,0,0,0,0,0,0,0,0,0,0,@5963,0,0,0,@5965,0,0,@5966,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,@5968,0,0,0,0,0,0,0,0,@5899 5897:O2|@5898,200 5898:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@408,@407| 5899:O2|@5970,63 5900:O2|@5298,29 5901:O2|@5301,36 5902:O2|@5300,28 5903:O2|@3268,65 5904:O2|@2938,25 5905:O2|@5906,49 5906:S7|73686172696e67 5907:O2|@1458,37 5908:O2|@1406,12 5909:O2|35,23 5910:O2|42,6 5911:O2|@5912,7 5912:S4|63617365 5913:O2|58,9 5914:O2|@5915,1 5915:S7|61627374797065 5916:O2|61,17 5917:O2|@2227,51 5918:O2|@5919,44 5919:S3|726563 5920:O2|@2473,19 5921:O2|@2934,26 5922:O2|@5923,13 5923:S2|646f 5924:O2|@1520,4 5925:O2|@5926,42 5926:S5|7261697365 5927:O2|@2240,18 5928:O2|@5929,22 5929:S6|68616e646c65 5930:O2|@2232,61 5931:O2|95,60 5932:O2|@2207,54 5933:O2|@5934,10 5934:S2|3a3e 5935:O2|@5936,56 5936:S2|3d3e 5937:O2|@1376,59 5938:O2|@5939,38 5939:S2|6f70 5940:O2|@5306,50 5941:O2|@1381,16 5942:O2|@2936,34 5943:O2|@5944,5 5944:S2|6173 5945:O2|@5946,66 5946:S8|7769746874797065 5947:O2|@5948,20 5948:S3|66756e 5949:O2|@5950,35 5950:S5|6c6f63616c 5951:O2|124,62 5952:O2|@2940,55 5953:O2|@5954,40 5954:S6|6f72656c7365 5955:O2|@2942,14 5956:O2|@5957,27 5957:S7|696e636c756465 5958:O2|@5959,64 5959:S5|7768696c65 5960:O2|@5638,21 5961:O2|@5962,53 5962:S6|737472756374 5963:O2|@5964,2 5964:S3|616e64 5965:O2|@2932,15 5966:O2|@5967,39 5967:S4|6f70656e 5968:O2|@5969,3 5969:S7|616e64616c736f 5970:S5|7768657265 5971:O1|@5972 5972:D18,2048|00812b352c362d372e230b2a3b281e1af6070e0e0e0c0004501af4071af907311afd070e0e0c00042c3b2b1ada070e0e0e0c000450311aef070c000203342d3b1aed070e0e0c00032928771aea070e0e0e0c00036403182c3b1ad4070e0c00032928301ad2070e0e0e0c00036402013b02013b07ca3035313932230b293b1aaf070c0003291ab8070e0c00021a99070e0e0c0002032029352a362c3b2b1a68070e0c0004502e3b2c1a5d070e0e0c0004503b260302223b2c0e0c0002293b1a77070c000303033f020229352e3b2b1a37070c0004503b2603313b1a53070c00032928781a52070e0e0e0c00036407cb3435220c39220d230b293b1a33070c0003291a3c070e0c00021a1d070e0e0c0002032029352a362c3b2b1aec060e0c0004502e3b2c1ae1060e0e0c0004503b260302263b2c0e0c0002293b1afb0602025e010c000303033f020229352e3b2b1ab7060c0004503b2603220c3b1ad2060e0e0e0c000328302a1ade060e0e0e0c0003030c2928391ad0060e0c000302013b03033c023f28612a1abe060e0e0e0c0003030c2928661ab0060e0c000302013b03033c021f28412a1a9e060e0e0e0c000303102928461a9006020267000e0c000302013b64032b333b28431a3b060c0004501a7c061a810622111a44060e0c0004220c3b2b1a21060e0e0c0004503b64022e220c3b1a39060e0e0c0003293b6928782a69220c3b2b1afe050e0e0e0c000450220f3b28771aef050c0004503b6627040278313b1a08060e0c000328302a1a16060e0e0e0c0003030c2928391a08060e0c000302013b64032b2f3b28431ab7050c0004501a08061abd05220d1ac0050e0c0004313b2b1a9e050e0e0e0c0004503b640226313b1ab6050e0e0e0c0003293b69303b2b1a7f050c000450333b28771a74050e0c0004503b6527040fd72d3b1a8c050e0c00032928781a8a050e0e0e0c00036403182c3b1a74050e0c00032928301a72050e0e0e0c00036402013b07dd3035313932230b293b1a52050e0e0e0c0003291a58050e0c00021a39050e0e0c0002032029352a362c3b2b1a08050e0c0004502e3b2c1afd040e0e0c0004503b260302223b2c0e0c0002293b1a17050c000303033f020229352e3b2b1ad7040c0004503b2603313b1af3040c000328302a1a02050e0e0e0c0003030c2928391af4040e0c000302013b03033c023f28612a1ae2040e0e0e0c000303102928661ad40402026b040e0c000302013b03033c021b28412a1abe040e0e0e0c0003030c2928461ab0040e0c000302013b6403231ac3041ab004220d1a730402023e000c0004313b2b1a4e040e0e0e0c0004503b640226313b1a66040e0e0e0c0003293b69303b2b1a2f040c000450333b28781a24040e0c0004503b6527040fd22d3b1a3c040e0c000329282e1a3a040e0e0e0c00036403033c02332d3b1a21040e0e0c00032928451a1e040e0e0e0c00036403033c02172d3b1a05040e0e0c00032928651a02040e0e0e0c00036407cf2d3b1aec030e0c000329282e1aea030e0e0e0c00036407d22b3b282b1aaa030e0e0e0c0004502c3b1ac6030e0e0e0c000329282e1afa030e0e0e0c00032e3b2b1a86030e0e0e0c0004503235333934230b293b1a9b030c0003291aa4030e0c00021a85030e0e0c0002032429352a362c3b2b1a54030e0c0004502e3b2c1a4903020220030e0e0c0004503b260302223b2c0e0c0002293b1a5f030c000303033f020229352e3b2b1a1f030c0004503b2603333b1a3b030c000328302a1a4a030e0e0e0c000303102928391a3c030202d2020e0c000302013b641a0d030e0e0c0002033e323b1a090302025d000e0e0c00031a45032a1a39030e0e0c0003220c3b1aee020e0e0e0c00032a2a1a23030c000322112a1a2a030e0e0e0c000326050224323b1acb020c0003291aac0222101aaf020c0004343b2b1a8e020e0e0e0c0004503b2603260602023b502d3b1aa1020e0e0c00032928451a9e020e0e0e0c00036403033c02172d3b1a85020e0e0c00032928651a82020e0e0e0c00036407cf2d3b1a6c020e0c00033135323933230b293b1a5c020e0c0003291a64020e0c00021a45020e0e0c0002032029352a362c3b2b1a14020e0c0004502e3b2c1a09020e0e0c0004503b260302223b2c0e0c0002293b1a23020c000303033f020229352e3b2b1ae3010c0004503b2603323b1aff010c000329287e1afe010e0e0e0c00036407ce220c35220d39220e230b293b1ade010e0e0e0c0003291ae4010e0c00021ac5010e0e0c0002032029352a362c3b2b1a94010e0c0004502e3b2c1a89010e0e0c0004503b260302263b2c02024f010e0c0002293b1a9f010c000303033f020229352e3b2b1a5f010c0004503b2603220d3b1a7a010e0e0e0c000328302a1a86010e0e0e0c0003030c2928391a78010e0c000302013b640343343b282b1a27010c000450220c3b1a45010e0e0c0003291a94011a79010e0e0c0003291a180122141a1b010c0004220f3b2b1af90002023c000e0e0c0004503b66022e220d3b1a0d010e0e0c0003293b69287e2a69220d3b2b1ad2000e0e0e0c00045022103b220d1ac3000c0004503b662704028c323b1adc000e0c000328302a1aea000e0e0e0c0003030c2928391adc000e0c000302013b64033f303b282b1a8b000c000450313b1aaa000e0e0e0c00032928451ade000e0e0e0c0003291a7c0022101a7f000c0004343b2b1a5e000e0e0e0c0004503b660226323b1a76000e0e0e0c0003293b69313b2b1a3f000c000450343b311a35000e0e0c0004503b65270502013b02013b2705430e0e0000000000000000f0070000000000000000000000000000|@5974,I255,I48,@5975,@5886,I218,I253,I251,I105,I248,@5978,@5979,@5982,@5983,@122,@5984,@5819,@5973| 5973:S2|457e 5974:S21|4c45585f28292e70617273654e756d626572283229 5975:O1|@5976 5976:D2,56|008028302c1a38000e0c0003030e2b28391a2c002d0e0e0e7e0300033b420e0e000000000000000028000000000000000000000000000000|@5977,I248| 5977:S15|436861722e69734469676974283129 5978:S3|307778 5979:O1|@5980 5980:D2,120|008028302c1a78000e0c0003030c2b28391a6c000e0c000302013b03033c023d28612c1a5a000e0e0e0c0003030c2b28661a4c000e0c000302013b03033c021d28412c1a3a000e0e0e0c0003030e2b28461a2c002d0e0e0e7e0300033b420e0e000000000000000068000000000000000000000000000000|@5981,I248| 5981:S18|436861722e69734865784469676974283129 5982:S2|3077 5983:S2|3078 5984:S23|6d616c666f726d6564207265616c206e756d6265723a20 5985:O1|@5986 5986:O1|@5987 5987:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@5989,@5988| 5988:O6|0,0,0,0,0,0 5989:S34|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329283129 5990:O1|@5991 5991:D5,64|00813c28403b1a3f000c00041a41002a691a44002b691a47002c692f2c452b462a472704430e0e0e000000000000000030000000000000000000000000000000|@5993,I11,@5994,@5999,@5992| 5992:D8,176|008056073b1ab0000e0c000329291aaf000c00021ab1000e0e0c0002037429352a362a352b362a321aa5000e0e0c000303033c024a2a1a87000c00021a89000e0e0c00020314311a76000e0e0e0c00021a75000e0e0c000202013b03212a3b333b2808220d1a70000e0c00021a71000e0e0c00031a71000e0e0c000602013b030529680102082b250526041e7e3b270402013b65420e0e0e0000000000000000a0000000000000000000000000000000|@6001,I253,I105,I218,I251,I223,I239,I154| 5993:S26|5554494c49544945535f28292e7365617263684c697374283129 5994:D3,48|008056073b1a30000e0c00032c1a30002d0e0e0e7e030003000000000000000020000000000000000000000000000000|@5996,I253,@5995| 5995:O1|@5997 5996:S34|5554494c49544945535f28292e7365617263684c6973742831296170706c79283129 5997:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031e2c352d362a352b362b301a45000e0e0c0003502a2a6930300e0e7d0800023b430e0e000000000000000040000000000000000000000000000000|@5998,I105,I218,@5995| 5998:S41|5554494c49544945535f28292e7365617263684c6973742831296170706c792831296170706c283129 5999:D3,72|00802b352c362a2a6956373b1a41000e0e0c00032a2a6956573b2b1a3a000e0e0e0c0004503b2705420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6000,I253,I255| 6000:S34|5554494c49544945535f28292e7365617263684c697374283129656e746572283129 6001:S35|5554494c49544945535f28292e7365617263684c6973742831296c6f6f6b7570283129 6002:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6003:S24|4d6973632e6c6f6f6b757044656661756c74283229283129 6004:O1|@6005 6005:D2,56|00802b28301a38000e0c000303033c020b2b3b1a2a002d0e7e030003420e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6006:S15|53796d5365742e2b2b283229283129 6007:O1|@6008 6008:D11,656|00822b352c361a8f022f692b2b2b6a1a8e02326931373223092a3b1a8a020e0e0e0c00032a3b1a7f020c00032928291a7e020e0e0e0c00031a7d020e0e0c000203032902012a29280c1a64020e0c000303033c029b2928141a55020e0e0c000303033c028b2928271a45020e0e0c000303033c027b2928241a35020e0e0c000303033c026b29281d1a25020e0e0c000303033c025b29281c1a15020e0e0c000303033c024b2928231a05020e0e0c000303033c023b2928121af5010e0e0c000303033c022b293c1ae6010e0e0e0c000303033c021b29283b1ad5010e0e0c000303033c020b29283d1ac5010e0e0c000303033c021b2928231ab5010e0e0c000303033c020b2928361aa5010e0e0c000303033c021b2928331a95010e0e0c000303033c020b2928151a85010e0e0c00032705031f0402001a86012a34220d2f2f1a85010e0e0c00075029352a362a2a69660fcc31230632230a33230f2a3b1a47010c00032a3b1a3f010c00030402002f220f3b332d221422141a54010e0c00085029352a363c28403b1a4c010e0c00043b2c2b2d6b221237221323092a3b1a07010c00032a3b1aff000c00032928291afe000e0e0e0c00031afd000e0e0c000203032902012a2928301ae4000e0c000327051ae3000c0002034c221237221323092a3b1ac2000e0e0e0c00032a3b1ab7000c00032928291ab6000e0e0e0c00031ab5000e0e0c000203032902012a293b1a9d000e0e0c000327051a9b00020252000c000202013b030d283b22131ab0000e0c000302013b3c28403b1a9a000e0e0e0c00043d2c2b6a293b6922163a2217230e2a3b1a51000e0e0c00032a3b1a47000c000322112b22102c221168052e2a6927132705440e0e000000000000000080020000000000000000000000000000|@6010,@6011,@6016,I253,I251,I218,@6017,@6019,@6021,I11,@6009| 6009:O1|@6592 6010:S23|50415253455f44454328292e7061727365446563283329 6011:D12,184|008056073a561723065627230a5637230e5647230f2b3b1aa6000e0e0e0c00032e3b1a9b000c00032b3b1a93000c00032d3b1a8b000c0003302c2e2c2e68051a86001a8b001a90000e0c0003291a90000e0c00023b3e3b3b2d6805291a89000e0e0c000203041a8700103b503c3b2b2f6b56e73856f7230c2a3b3c1a7a000e0e0e0c0004502b2a0e0e0c00023c28401a6e001a73000c0004291a7400692712420000000000000000a8000000000000000000000000000000|@6013,I253,@6014,@5823,@5826,@6012,I105,@1363,I255,@588,I11,79994| 6012:O1|@6015 6013:S36|50415253455f44454328292e7061727365446563283329676c6f62616c456e762d283129 6014:S31|467265652074797065207661726961626c6573206e6f7420616c6c6f776564 6015:D8,128|00802b1a82000e0e0e0c00021a81000e0e0c0002034e2b352c36293b1a79000e0e0c000303183e2b69291a5b000c000203041a6b00103b50293b696402233e2b69291a43000c000203041a5300103b502a1a54000e0c00021a55002a692b2a69666502031a510042000000000000000070000000000000000000000000000000|@5839,I105,I218,I251,@1363,@6012,@871,@5838| 6016:D2,608|00802b28171a60020e0c000303033c0fd82b28081a51020e0e0c000303033c025b2b28431a41020e0e0c000303033c024b2b282b1a31020e0e0c000303033c023b2b281e1a21020e0e0c000303033c022b2b28341a11020e0e0c000303033c021b2b28061a01020e0e0c000303033c020b2b28181af1010e0e0c000303033c027f2b28111ae1010e0e0c000303033c021b2b28061ad1010e0e0c000303033c020b2b28181ac1010e0e0c000303033c024f2b28201ab1010e0e0c000303033c023f2b28211aa1010e0e0c000303033c022f2b281f1a91010e0e0c000303033c021f2b28261a8101020215000e0e0c000303033c020b2b28221a6d010e0e0c000303033c024b2b28131a5d010e0e0c000303033c023b2b28071a4d010e0e0c000303033c022b2b28401a3d010e0e0c000303033c021b2b28191a2d010e0e0c000303033c020b2b282a1a1d010e0e0c000303033c0fd82b280c1a0d010e0e0c000303033c029b2b28141afd000e0e0c000303033c028b2b28271aed000e0e0c000303033c027b2b28241add000e0e0c000303033c026b2b281d1acd000e0e0c000303033c025b2b281c1abd000e0e0c000303033c024b2b28231aad000e0e0c000303033c023b2b28121a9d000e0e0c000303033c022b2b3c1a8e000e0e0e0c000303033c021b2b283b1a7d000e0e0c000303033c020b2b283d1a6d000e0e0c000303033c022f2b28331a5d000e0e0c000303033c021f2b28151a4d000e0e0c000303033c020f2b28361a3d00020205000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000050020000000000000000000000000000|@6006,I251| 6017:O1|@6018 6018:D2,264|00802b280c1a08010e0c000303033c029b2b28141af9000e0e0c000303033c028b2b28271ae9000e0e0c000303033c027b2b28241ad9000e0e0c000303033c026b2b281d1ac9000e0e0c000303033c025b2b281c1ab9000e0e0c000303033c024b2b28231aa9000e0e0c000303033c023b2b28121a99000e0e0c000303033c022b2b3c1a8a000e0e0e0c000303033c021b2b283b1a79000e0e0c000303033c020b2b283d1a69000e0e0c000303033c021b2b28231a59000e0e0c000303033c020b2b28361a49000e0e0c000303033c021b2b28331a39000e0e0c000303033c020b2b28151a29002d7e030003420e0e0e0000000000000000f8000000000000000000000000000000|@6006,I251| 6019:O1|@6020 6020:D14,752|00852e372f23092a3b1aec020e0c00032a3b1ae3020c00032928291ae2020e0e0e0c00031ae1020e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1ab0020e0c00032e3b1aa7020c00032b3b1a9f020c00032d3b1a97020c0003302c2e2c2e68053328301a8f020c000303033c020b333b1a82020e0e0e0c0003030822153b452a460fd733280c1a6c020e0c000303033c029b3328141a5d020e0e0c000303033c028b3328271a4d020e0e0c000303033c027b3328241a3d020e0e0c000303033c026b33281d1a2d020e0e0c000303033c025b33281c1a1d020e0e0c000303033c024b3328231a0d020e0e0c000303033c023b3328121afd010e0e0c000303033c022b333c1aee010e0e0e0c000303033c021b33283b1add010e0e0c000303033c020b33283d1acd010e0e0c000303033c021b3328231abd010e0e0c000303033c020b3328361aad010e0e0c000303033c021f3328331a9d01020268010e0e0c000303033c020b3328151a89010e0e0c000307d40402003428231a79010e0e0c0003032d221322162214221722191a75010e0e0c00063c28403b1a71010e0e0c00043d2b2b6a2c2a451a6a0146260402ca3428361a3f010c0003032d221322162214221722191a3d010e0e0c00063c28403b1a39010e0e0c00043d2b2b6a2c2a451a320146260402923428331a07010c0003031822132216221422181a1f010c00052a2a451a1e014651026f3428151ae4000e0c0003031c221322162214221822181a09010e0e0c00062a2a451a060146510247040200221322173c22172d221a221c1af800020268000e0c00085029352a363c28403b1ab4000e0c00043b2c2b2d6b3c28403b1aa4000e0c00043d2b2b6a302a451a9e0046260829352a360402002a2a221a221a221a221a1ab7000c00075029352a362d2b692a362b3822112b220f2c220f6805221f2d452a46270a0213283b22151a95000e0e0c00035022153b452a46270f1f060e0e0e0e0e0000000000000000e0020000000000000000000000000000|@6022,I253,I251,I218,@6023,I11,@6289,@6291,@6311,@6314,@6327,@6021,@6019,@6009| 6021:O1|@6330 6022:S38|50415253455f44454328292e70617273654465632833297061727365546f7044656373283129 6023:O3|@6025,@6267,@6024 6024:O2|@6283,@6023 6025:D16,672|00842f352f230630230a31230f2a3b1a96020e0e0e0c00032a3b1a8b020c00033437220c23092a3b1a7d020e0e0c00032a3b1a73020c00032928291a72020e0e0e0c00031a71020e0e0c000203032902012a2928361a58020e0c0003035322101a5d020e0e0c00023d1a5c0222131a5f02221422162214221912150001000100221868071a51020e0e0c000529352a3629362a38220f2b220e2c220f68053c28403b1a3b020c00043d2b302c6b27080fd2221037221123092a3b1aeb010c00032a3b1ae3010c00032928291ae2010e0e0e0c00031ae1010e0e0c000203032902012a2928231ac8010e0c00032705030a22101acb010c0002021728231ae9010e0e0c00022922121ae6010e0e0e0c000364221123062212230a2213230f2a3b1a86010e0e0e0c00032a3b1a7b010c00032217362218370403003b2a1aba010e0e0e0c00035029362a371ab4012e2b6a2b2a2f6a1ab201221d692a221f2b221f221f121f00010002000e0c0006221f37222023092a3b1a30010e0c00032a3b1a27010202fa000c00032928291a22010e0e0e0c00031a21010e0e0c000203032902012a29281a1a08010e0c00032705030a221f1a0b010c00020217281a1a29010e0e0c00022922211a26010e0e0e0c0003641a3c01221b316a292f346a1a39012222692a22242b22242224122400010002000c000622243a2225230e2a3b1aa8000e0c00032a3b1a9f000c0003222837222923092a3b1a90000e0c00032a3b1a87000c00032928291a86000e0e0e0c00031a85000e0e0c000203032902012a29280f1a6c000e0c00032705030a22281a6f000c00020217280f1a8d000e0e0c000229222a1a8a000e0e0e0c00036422172c22162d221768053c30220d2c6b271a270b1f050e0e0e0e0e000000000000000090020000000000000000000000000000|@6027,I253,I251,I218,@5814,@6028,@6031,@6069,I11,@6035,@6009,@5990,@6263,@6264,@6265,@6026| 6026:D2,56|00802b280f1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6027:S38|50415253455f44454328292e7061727365446563283329737472756374757265446563283329 6028:O1|@6029 6029:D2,40|00802b28351a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6030,I251| 6030:S19|53796d5365742e73747275637453792d283129 6031:D2,64|00812c561756285639564a565b566c1a36000e0e0e0c00082c2a35452a364664430e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@6033,@6032| 6032:O1|@6034 6033:S21|534b4950535f28292e6765744c6973742834292d45 6034:D16,504|00861afb0131691afe012a321a01020e0e0c000429352a362a342b1afa010e0e0e0c00042c36220c37220d23092a3b1aee010e0e0e0c00032a3b1ae3010c00032928291ae2010e0e0e0c00031ae1010e0e0c000203032902012a29401ac9010e0e0c0003033222111acd010e0e0c00021acd01221469040200221222152c2c22171ac4010e0c00065029352a362a3c2b6a296801270602412928091a8a010e0e0e0c0003033222111a8d010e0e0c00021a9d01221469040200221222152c2c22171a84010e0c00065029352a362a3b2b6a296801270602013b221237221323092a3b1a3b010c00032a3b1a33010c00032928291a32010e0e0e0c00031a31010e0e0c000203032902012a2928111a18010e0c00032705030a22121a1b010c0002021728111a31010e0e0c00022922141a2e010e0e0e0c0003640402002212221522172c2214221822170c00075029352a3633353437220c392c362d382d2b2e2c2f6805221435221536220c1afa000e0e0e0c00021ab9000e0e0c00020332220c3529352a362b373c28403b1ae2000e0e0e0c00043c28403b1ad5000e0e0c0004220f2e2e2e2e2e68063d2a692707020132220d3b1a71000e0e0c00031a71000e0e0c00023c28403b1aa5000e0e0c00042e2e2d2c2e316806293069271c1f070e0000000000000000e8010000000000000000000000000000|@6036,@6037,@6038,@6040,@6046,I253,I251,I218,@5814,@6054,@6055,@6252,@6035,@6009,I105,I11| 6035:O1|@6253 6036:S49|50415253455f44454328292e7061727365446563283329737472756374757265446563283329646f537472446563283129 6037:D2,88|00802b28111a58000e0c000303033c021b2b401a4a000e0e0e0c000303033c020b2b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6038:O1|@6039 6039:D2,56|00802b28061a38000e0c000303033c020b2b28181a29002d7e030003420e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6040:O1|@6041 6041:D8,272|00822b372c23092a3b1a0c010e0c00032a3b1a03010c00032928291a02010e0e0e0c00031a01010e0e0c000203032902012a29330e0c0002270503542b36293b1ad5000e0e0c00032d3a2e23062f230a30230e31230f2b3b1abd000e0e0c00032e3b1ab3000c00032b3b1aab000c00032d3b1aa3000c0003302c2e2c2e6805220e1aac000e0c000250332a69270c02621aa5002c1aa9000e0e0c0003502b372c23092a3b1a71000e0e0c00032a3b1a67000c00032928291a66000e0e0e0c00031a65000e0e0c000203032902012a29320e0c00021a51000e0e0c00022705030d2b1a4c000e0c0002501e4c02023b501a5600440e0e0e0e0e000000000000000000010000000000000000000000000000|@6043,I253,I251,I218,@5814,@6044,@6009,@6042| 6042:O2|I48,@6045 6043:S17|534b4950535f28292e6765746964283329 6044:S10|4964656e746966696572 6045:O5|I48,0,0,0,0 6046:O1|@6047 6047:D2,40|00823c2e2d2f1a27002f0e7b06050005000000000000000018000000000000000000000000000000|@6049,@6048| 6048:O1|@6050 6049:S28|5554494c49544945535f28292e636865636b466f72446f7473283329 6050:D21,272|00832d1a12010e0e0e0c00022f2a1a0f010c00036403033b0fcf2e3c1a09010e0e0c0003293b1a07010c000303033c02102e1ae3000c00022a2a1afb000c00036403041afa00103b502e1afb000c000203032e02142928081af5000e0e0c00032f2a1af3000c00036429282e1af1000e0e0c00036503611aee002e1af2000e0e0e0c0003291af0001ae5000e0e0c0003291aec001af1000e0e0c0003291af0000e0c00023b3e3b3b2d6805291a99000e0e0c000203041adf00103b503c3b2b346b313832230c2a3b3c1ad4000e0c0004502b2a347d0e00022e3c1acb000c00032e2e2e1aca002f020205007b060600051f040e0e0e0e0e0e000000000000000000010000000000000000000000000000|@6052,I223,I233,I107,I234,I231,@70,I105,I239,I252,I251,@6053,@122,@6051,@5823,@5826,@6012,@1363,I255,I106,@6048| 6051:S13|20696c6c6567616c2068657265 6052:S36|5554494c49544945535f28292e636865636b466f72446f7473283329636865636b283129 6053:S15|7175616c6966696564206e616d6520 6054:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6055:O2|@6057,@6056 6056:O2|@6169,@6055 6057:D16,888|00842e372f23092a3b1a74030e0c00032a3b1a6b030c00032928291a6a030e0e0e0c00031a69030e0e0c000203032902012a2928321a50030e0c000303033c021b2928061a41030e0e0c000303033c020b2928181a31030e0e0c00031a31030e0e0c0002270503911a2d032f1a31030e0e0c0003502e372f23092a3b1a01030e0e0c00032a3b1af7020c00032928291af6020e0e0e0c00031af5020e0e0c000203032902012a29330e0c000203033c022b2928321ad1020e0e0c000303033c021b2928061ac1020e0e0c000303033c020b2928181ab1020e0e0c00031ab1020e0e0c00022705030e2e1abc020e0c0002501e7c3b02013b02013b2f230630230a31230f2a3b1a78020e0c00032a3b1a6f020c00033437220c23092a3b1a61020e0e0c00032a3b1a57020c00032928291a56020e0e0e0c00031a55020e0e0c000203032902012a2928181a3c020e0c0003033e1a5b022210691a5d022a22131a5f020c000429352a362a22152b1a59020e0e0c00042c362d352e363c28403b1a4f020c00043c2c2c2c6b292e69270a0fda2928321af2010e0e0e0c000303b222101a05020e0e0c00021a2d02221169221322132b2212121200010001000e0c000522133a2214230e2a3b1ab4010e0c00032a3b1aab010c000322102b220f2c22106805221837221923092a3b1a92010e0e0e0c00032a3b1a87010c00032928291a86010e0e0e0c00031a85010e0e0c000203032902012a29280f1a6c010e0c00032705030b22181a7f010c0002500216280f1aac010e0c000229221a1a62010e0e0e0c0003513b2f2b6a292b692709029422103a221123062212230a2213230e2214230f2b3b1a1801020278000e0c00032e3b1a0b010c00032b3b1a03010c00032d3b1afb000c0003302c2e2c2e68053c28403b1a3a010e0e0e0c00043c1a48012c2c6b221c3a221d2306221e230a221f230e2220230f2b3b1ac5000e0e0c00032e3b1abb000c00032b3b1ab3000c00032d3b1aab000c0003302c2e2c2e6805332a692716221137221223092a3b1a90000e0c00032a3b1a87000c00032928291a86000e0e0e0c00031a85000e0e0c000203032902012a29283f1a6c000e0c0003032922161a81000e0e0c0002502e352f362218221622191ab6000e0e0e0c000622152a35452a364664020a2e22152a35452a36466427111f050e0e0e0e0e0e0e000000000000000068030000000000000000000000000000|@6059,I253,I251,I218,@6060,@6009,@5814,@6061,@6038,@6040,@6046,I11,@6062,@6035,@6063,@6058| 6058:O1|@6064 6059:S40|50415253455f44454328292e706172736544656328332970617273655369676e6174757265283329 6060:S18|5374617274206f66207369676e6174757265 6061:D2,56|00802b283f1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6062:D2,88|00802b28301a58000e0c000303033c02272b283f1a49000e0e0c000303033c02172b280f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6063:S5|6572726f72 6064:D19,888|00842d372e23092a3b1a74030e0c00032a3b1a6b030c00032928291a6a030e0e0e0c00031a69030e0e0c000203032902012a29283b1a50030e0c00032705030a2d1a54030e0c00020213283b1a51030e0e0c0002292f1a4f030c0003640403003b2a1a4b030c00035029352a362b372b2b2b6a3b2a341a3f030c00041a410333691a44032a220e1a46030e0e0e0c000429352a3631313122111a3c030e0c0005221037221123092a3b1ad4020e0c00032a3b1acb020c00032928291aca020e0e0e0c00031ac9020e0e0c000203032902012a2928111ab0020e0c00032705030a22101ab3020c0002021728111ab1020e0e0c00022922121aae020e0e0e0c000364221137221223092a3b1a73020c00032a3b1a6b020c00032928291a6a020e0e0e0c00031a69020e0e0c000203032902012a2928201a50020e0c000303033c022b2928211a41020e0e0c000303033c021b2928181a31020e0e0c000303033c020b29283a1a21020e0e0c00031a21020e0e0c0002270503a11a650222121a28020e0c000350221137221223092a3b1aef010c00032a3b1ae7010c00032928291ae6010e0e0e0c00031ae5010e0e0c000203032902012a2922150c000203033c023b2928201ac1010e0e0c000303033c022b2928211ab1010e0e0c000303033c021b2928181aa1010e0e0c000303033c020b29283a1a91010e0e0c00031a91010e0e0c00022705030e22111a8b010c0002501e8c3b02013b02013b1acb012211690402002a22152f2c1ac5010e0e0c00055029352a3630221933220e2e68053d2a69221935221a37221b392e362f382d2b2e2c2f68052f2a69221f37222023092a3b1a1c010e0c00032a3b1a13010c00032928291a12010e0e0e0c00031a11010e0e0c000203032902012a293d1af9000e0e0c0003039822241afd000e0e0c000250222437222523092a3b1ad3000c00032a3b1acb000c00032928291aca000e0e0e0c00031ac9000e0e0c000203032902012a29283b1ab0000e0c000303162211220c222b222b222b1a0d01222c0e0e7b072c000622292309293b1a83000c00032928291a82000e0e0e0c0003641a80000e0c000203041ae700103b503b50293b3d1ae4000e0c000450342706022b29283f1a54000e0c0003031e22241a59000e0e0c000250220c302226222622261aa70022277b072700062e27201f050e0e0e000000000000000068030000000000000000000000000000|@6066,I253,I251,I218,@5814,@6035,@6009,@5990,@6067,@6091,@6092,@6040,@6095,@1376,@6101,@6102,@6058,@6065,I255| 6065:O4|@14322,@596,@6168,@6167 6066:S56|50415253455f44454328292e706172736544656328332970617273655369676e617475726528332967657457686572655479706573283229 6067:O1|@6068 6068:D12,400|00822c352d361a8f012e2b322e68052e372f23092a3b1a87010c00032a3b1a7f010c00032928291a7e010e0e0e0c00031a7d010e0e0c000203032902012a2928211a64010e0c000307ce331a6a010e0e0e0c00025033373423092a3b1a41010e0e0c00032a3b1a37010c00032928291a36010e0e0e0c00031a35010e0e0c000203032902012a29283a1a1c010e0c0003037b280b1a29012211220d1a2a010e0e0e0c00052935221137221223092a3b1aee000e0e0e0c00032a3b1ae3000c00032928291ae2000e0e0e0c00031ae1000e0e0c000203032902012a29282f1ac8000e0c00032705030b22111acb000c0002500216282f1ad8000e0c00022922131ad6000e0e0e0c0003512965023e220f2309293b1a8a00020235000e0e0e0c00032928291a82000e0e0e0c0003641a80000e0c000203041aa700103b503b50293b28211aa3000c0004503b642705021f29283a1a53000c000303130402003b2a310e0c0003502935293b696502013b2708440e0e0e0e0e0e0e000000000000000080010000000000000000000000000000|@6070,@6071,I253,I251,I218,@5814,@6079,@6069,@6035,@6009,@6065,I255| 6069:O1|@6082 6070:S37|50415253455f44454328292e70617273654465632833296765745479706556617273283229 6071:D19,512|0081560737561723092a3b1afa010e0e0e0c00032a3b1aef010c00032928291aee010e0e0e0c00031aed010e0e0c000203032902012a29283a1ad4010e0c000307d0565736293b1abe010e0e0e0c000356773a568723065697230a56a7230e56b7230f2b3b1aa0010e0c00032e3b1a97010c00032b3b1a8f010c00032d3b1a87010c0003302c2e2c2e68051a920134121400010001006a121300010004000e0e0e0c0002121300010003000359341a77010c0002293c1a77010c0003640344341a65010e0e0c00023c2a1a6b010c00036403041a6a01103b503b50341a69010e0e0c0002030334020b3428091a61010e0e0c00032928271a16010e0e0e0c00036402013b02013b3c28401a4b011a5001020257000e0c00042a03033f02013b1a46012a1a4a010e0e0e0c0003293d1a3f010c0003293b1a37010c00032d2a6922122a69121b00010002000e0e0e0c000250121a00010001001a1d010e0e0c000250221b2a45324627140278283a1a10010e0c00022956771a0e010e0e0e0c00035056671af2000e0e0e0c0002503c28401ac5001aca000e0e0e0c0004291af0006956873a5697230656a7230a56b7230e56c7230f2b3b1a4f000c00032e3b1a47000c00032b3b1a3f000c00032d3b1a37000c0003302c2e2c2e6805221434452a46270d2705430e0e0000000000000000f0010000000000000000000000000000|@6073,I253,I251,I218,@6072,I223,I233,I231,@70,I105,I252,@588,I11,79992,I242,@5814,@6035,@6009,79998| 6072:D2,48|00802b352c36562756381a2b002f0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@6075,@6074| 6073:S50|50415253455f44454328292e7061727365446563283329676574547970655661727328322967657454797065566172283129 6074:O1|@6076 6075:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283129 6076:D15,272|00832e2d1a11010e0e0c000303033c024a2e1a0b010c00021a0d010e0e0c000203142c1afa000e0e0e0c00021af9000e0e0c000202013b03212e3b2e3b2808311aed000e0e0c00021aed000e0e0c00031aed000e0e0c000602013b03932b3a2c23062d230a2e230e2f230f2b3b1ad8000e0c00032e3b1acf000c00032b3b1ac7000c00032d3b1abf000c0003302c2e2c2e6805220f1ab8001abd000e0e0c0003291abc001ac1000e0e0c0003291ac0000e0c00023b3e3b3b2d6805291a61000e0e0c000203041aaf00103b503b503c3b2b306b2211382212230c2a3b3c1aa0000e0c0004502b2a22140e0e0e7d1700023b1f040e0e0e0e0e000000000000000000010000000000000000000000000000|@6078,I251,I105,I218,I223,I239,I154,I253,@6077,@122,@5823,@5826,@6012,@1363,I255| 6077:S23|2068617320616c7265616479206265656e20757365642e 6078:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283229 6079:O1|@6080 6080:D2,40|00802b283a1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6081,I251| 6081:S20|53796d5365742e747970654964656e742d283129 6082:D3,104|00832c3a2d23062e230a2f230e30230f2b3b1a5b000c00032e3b1a53000c00032b3b1a4b000c00032d3b1a43000c0003302c2e2c2e68053b2a220e2210221322131a340022120e7b081000070e0e0e0e000000000000000058000000000000000000000000000000|@6084,I253,@6083| 6083:O1|@6085 6084:S19|534b4950535f28292e6765744c697374283429 6085:D10,320|00850402003b2a310e0c00035029352a3630373123092a3b1a2d010e0e0c00032a3b1a23010c00032928291a22010e0e0e0c00031a21010e0e0c000203032902012a29220c1a08010e0c00032705030c301a0c010e0c0002503c025a30373123092a3b1ae2000e0e0e0c00032a3b1ad7000c00032928291ad6000e0e0e0c00031ad5000e0e0c000203032902012a29340e0c00022705031d2f1acc000e0c000229321acb000c000350311ab3000c0002503c6402013b03342a3b69293b1a90000e0c0003030334020b342a1aaa000e0e0e0c000329220c220c220c220c220c1a9e00220d0e0e0e7b080d00072a3b69293b1a5c000e0c0003030334020b342a1a86000e0e0e0c00033435220c37220d392e362f382d2b2e2c2f68052f2a69270b1f060e0e0e0e0e0e000000000000000030010000000000000000000000000000|@6087,I253,I251,I218,@5814,@6035,@6009,@6088,@6083,@6086| 6086:O1|@6090 6087:S29|534b4950535f28292e6765744c697374283429666f724c697374283229 6088:O1|@6089 6089:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6088| 6090:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6086| 6091:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6092:O1|@6093 6093:D2,40|00802b28181a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6094,I251| 6094:S16|53796d5365742e6964656e742d283129 6095:O1|@6096 6096:D2,40|00831a2b002c2e6a1f040e0e0e0e0e0e000000000000000018000000000000000000000000000000|@6098,@6097| 6097:D14,240|00802b56180c0002293b1aeb000c000303bb56173a562723065637230a5647230e5657230f2b3b1ad6000e0e0e0c00032e3b1acb000c00032b3b1ac3000c00032d3b1abb000c0003302c2e2c2e6805220d1ab4001ab9000e0e0c0003291ab8001abd000e0e0c0003291abc000e0c00023b3e3b3b2d6805291ab5000e0e0c000203041ab300103b503b503c3b2b306b121100010001003812120001000100230c2a3b3c1a9a000e0e0e0c0004502b2a0e0e0c0002503c28401a8d001a92000e0e0e0c0004291a90006927120202293564420e0e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@6100,I251,I253,@6099,@122,@5823,@5826,@6012,I105,@1363,I255,@588,I11,79994| 6098:S39|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329 6099:S42|20686173206e6f74206265656e206465636c6172656420696e2074797065206465636c61726174696f6e 6100:S42|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329283129 6101:D2,72|00802b3d1a49000e0e0c000303033c02172b283f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6102:O1|@6103 6103:D10,360|00831a6b012f690402002a2a31311a67011a6c010e0c00065029352a3631373223092a3b1a61010e0e0c00032a3b1a57010c00032928291a56010e0e0e0c00031a55010e0e0c000203032902012a293f1a3d010e0e0c00030340220d1a41010e0e0c00020402002210221022102c1a07010c00055029352a363235333734392c362d382d2b2e2c2f68053d22112b336b22162a452b46270b02ae220d37220e23092a3b1ae2000e0e0e0c00032a3b1ad7000c00032928291ad6000e0e0e0c00031ad5000e0e0c000203032902012a2922140c00021ac1000e0e0c0002270503611ac500220e1ac8000e0c000350220d37220e23092a3b1a8f000c00032a3b1a87000c00032928291a86000e0e0e0c00031a85000e0e0c000203032902012a2922140c00021a71000e0e0c00022705030d220d1a6b000c0002501e4c02023b5002023b503430452f4627091f040e0e0e0e000000000000000058010000000000000000000000000000|@6105,@6106,@6102,@6107,I253,I251,I218,@5814,@6104,@6009| 6104:S11|456e64206f662074797065 6105:S25|50415253455f5459504528292e706172736554797065283329 6106:D2,56|00802b3f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6107:O1|@6108 6108:D5,112|00840402003b2a323131311a6a000e0e0e0c00075029352a362a1a63000c00021a65000e0e0c0002030d2a36293b1a5f000c00036402013b030a2a35322a452b4664020b28052b2b6a322a452b4664661f050e0e0e0e0e0e000000000000000060000000000000000000000000000000|@6110,@6109,I105,I218,I251| 6109:O1|@6111 6110:S37|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129 6111:D8,200|00851acb002f690402002a2a3131311ac6000e0e0e0c00065029352a3631373223092a3b1ab9000e0e0c00032a3b1aaf000c00032928291aae000e0e0e0c00031aad000e0e0c000203032902012a2928061a94000e0c00030342220d1a99000e0e0c00020402003b2a22122212221222121a8c000e0c00075029352a36332b6933353437220c392d362e382d2b2e2c2f6805221a30452a46270b020a2f3b6922102a4530466427091f060e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6113,@6114,@6112,I253,I251,I218,@5814,@6109| 6112:O1|@6115 6113:S50|50415253455f5459504528292e7061727365547970652833297475706c655479706528312967657450726f64756374283129 6114:D2,56|00802b28061a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6115:D20,1120|00842d372e23092a3b1a5c040e0c00032a3b1a53040c00032928291a52040e0e0e0c00031a51040e0e0c000203032902012a323a33230634230a220c230e220d230f2b3b1a21040e0e0c00032e3b1a17040c00032b3b1a0f040c00032d3b1a07040c0003302c2e2c2e68050402003428181afc030e0c000303391a0304221722161a04040e0c000429362a352b363c28401afc031a01040e0e0c00043b2c2e2d302e68063c2a69293b69312a45304626090fcf34283a1ab7030c00030387221436293b1aa2030e0e0e0c00036422140e0e0c0002221537221623092a3b1a88030e0c00032a3b1a7f030c00032928291a7e030e0e0e0c00031a7d030e0e0c000203032902012a29283a1a64030e0c00032705030b22151a87030c0002500216283a1a84030e0c00022922171a82030e0e0e0c0003513e2a2d6a293b692c2a452e4626040fdb3428201a25030e0e0c000307d022141a49030e0e0c000222153a2216230e2a3b1a00030e0c00032a3b1af7020c0003221937221a23092a3b1ae80202020b020e0c00032a3b1adb020c00032928291ada020e0e0e0c00031ad9020e0e0c000203032902012a29282e1ac0020e0c00030326221e1ae5020e0e0c0002221431221232221268053f3b3c2c6b293b69220e2a452c46260502d11ad902221f690403002a2a1ad6020e0e0e0c0003502936280b1ad00222231ad302222722262f2226222868061acd020e0e0c0005293522233a2224230e2a3b1a4a0202046d018d000e0c00032a3b1a3b020c0003221c2b221a2c221a6805222837222923092a3b1a22020e0e0e0c00032a3b1a17020c00032928291a16020e0e0e0c00031a15020e0e0c000203032902012a29282e1afc010e0c00032705030b22281a1f020c0002500216282e1a1c020e0c000229222a1a1a020e0e0e0c0003513f2f3c2c6b293b6922162a452c46260d260a0fcf3428211ab9010e0e0c000303a622141add010e0e0c00023b22162219221622181a0c020e0c000622163a2217230e2a3b1a84010e0c00032a3b1a7b010c0003221a37221b23092a3b1a6c010e0c00032a3b1a63010c00032928291a62010e0e0e0c00031a61010e0e0c000203032902012a29282f1a48010e0c00032705030b221a1a6b010c0002500216282f1a68010e0c000229221c1a66010e0e0e0c000351220f2b220d2c220d6805302f452a462608022b28181a3f010c00022922161a3e010e0e0e0c00035022151a220102020d000e0e0e0c0002502a3b452c465129352a36221637221723092a3b1ac9000e0e0c00032a3b1abf000c00032928291abe000e0e0e0c00031abd000e0e0c000203032902012a2928181aa4000e0c00030312221c30302b221f1a0c01221e0e7b061f00052f1a08010e0c00021a89000e0e0c000203452f353036293b1a71000e0e0c00030308221e2b453146022a28181a95000e0e0c000229221f1a92000e0e0e0c000350221e1a76000e0e0e0c000250221f2c45324664650208221c1ab800452f4627171f050e000000000000000050040000000000000000000000000000|@6117,I253,I251,I218,@6092,@6040,@6118,I11,@5814,@6035,@6009,@6129,@6133,@6148,@6151,@6069,@6161,@6116,I105,@1444| 6116:O1|@6165 6117:S49|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129 6118:O3|@6120,@423,@6119 6119:O3|@6122,@6127,@6121 6120:S9|756e646566696e6564 6121:O3|@6120,@450,@6128 6122:O2|1,@6123 6123:O3|2,@6124,0 6124:O4|0,@14438,3,1 6125:O1|@6126 6126:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@489,@446| 6127:O4|1,@14348,0,0 6128:S9|556e646566696e6564 6129:D10,128|00821a83002e1a87000c0003291a88001a7d000e0e0c0003291a84001a89000e0e0c0003291a88000e0c00023b3e3b3b2d6805291a81000e0e0c000203041a7f00103b503c3b2b346b5667385677230c2a3b3c1a72000e0e0e0c0004502b2a347d0d00020e0e0e0e000000000000000070000000000000000000000000000000|@6131,@6132,@122,@6130,@5823,@5826,@6012,I105,@1363,I255| 6130:S25|292061707065617273206d6f7265207468616e206f6e63652e 6131:S75|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d7265706f7274447570283329 6132:S7|4c6162656c2028 6133:O1|@6134 6134:D5,64|00813c28403b1a3f000c00041a41002a691a44002b306a1a46002c692f2c452b462a472704430e0e000000000000000030000000000000000000000000000000|@6136,I11,@6137,@6142,@6135| 6135:D8,176|008056073b1ab0000e0c000329291aaf000c00021ab1000e0e0c0002037429352a362a352b362a321aa5000e0e0c000303033c024a2a1a87000c00021a89000e0e0c00020314311a76000e0e0e0c00021a75000e0e0c000202013b03212a3b333b2808220d1a70000e0c00021a71000e0e0c00031a71000e0e0c000602013b030529680102082b250526041e7e3b270402013b65420e0e0e0000000000000000a0000000000000000000000000000000|@6147,I253,I105,I218,I251,I223,I239,I154| 6136:S28|5554494c49544945535f28292e6e6f4475706c696361746573283129 6137:D3,48|008056073b1a30000e0c00032c1a30002d0e0e0e7e030003000000000000000020000000000000000000000000000000|@6139,I253,@6138| 6138:O1|@6140 6139:S36|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c79283129 6140:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031e2c352d362a352b362b301a45000e0e0c0003502a2a6930300e0e7d0800023b430e0e000000000000000040000000000000000000000000000000|@6141,I105,I218,@6138| 6141:S43|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c792831296170706c283129 6142:D2,48|00802b352c36562756381a2b002f0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@6144,@6143| 6143:O1|@6145 6144:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283129 6145:D9,208|00832c3b1ad1000e0e0c000329291acf000c00021ad1000e0e0c0002037a29352a362a352b362a220c1ac4000e0c000303033c024a2a1aa7000c00021aa9000e0e0c00020314341a96000e0e0e0c00021a95000e0e0c000202013b03212a3b220d3b280822101a8f000c00021a91000e0e0c00031a91000e0e0c000602013b030b342a220c34347b050c00042b250526041e843b2704021b3030692f3b1a38000e0c00032a2a69313b2b1a63000c0004503b66651f040e0e0000000000000000c0000000000000000000000000000000|@6146,I253,I105,I218,I251,I223,I239,I154,I255| 6146:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283229 6147:S37|5554494c49544945535f28292e6e6f4475706c6963617465732831296c6f6f6b7570283129 6148:O1|@6149 6149:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6150| 6150:S16|53796d5365742e656d7074792d283129 6151:D2,56|00812c561756285639564a565b1a30000e0c00072c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6033,@6152| 6152:O1|@6153 6153:D10,200|00851acb00306929301acc000e0c000329362a310e0c000232373323092a3b1abe000e0e0e0c00032a3b1ab3000c00032928291ab2000e0e0e0c00031ab1000e0e0c000203032902012a2928091a98000e0c00032705030a321a9c000e0c0002021328091a99000e0e0c000229341a97000c0003641a9800220c690402002a220d342c220e0c00055029352a362f35303731392c362d382d2b2e2c2f6805220d312b6a292b6927101f060e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6155,@6156,@6157,I253,I251,I218,@5814,@6035,@6009,@6154| 6154:D2,72|00802b282e1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6155:S68|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d6c2d283129 6156:D2,56|00802b28091a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6157:O1|@6158 6158:D18,416|00812b372c23092a3b1a9c010e0c00032a3b1a93010c00032928291a92010e0e0e0c00031a91010e0e0c000203032902012a29281e1a78010e0c0003270507cf2b36293b1a61010e0e0c00032d3a2e23062f230a30230e31230f2b3b1a49010e0e0c00032e3b1a3f010c00032b3b1a37010c00032d3b1a2f010c0003302c2e2c2e6805331a39010e0e0c00023b2a1a37010c00036403041a3601103b50331a37010c0002030333020b3328081a31010e0e0c0003220f1a2f010c00025029287e1aed000e0e0c000303033c020b2928301add000e0e0c00030392220f3a221023062211230a2212230e2213230f2b3b1ab6000e0e0e0c00032e3b1aab000c00032b3b1aa3000c00032d3b1a9b00020264000c0003302c2e2c2e68051ad2001ad7001adc000e0c0003291adc000e0c00023b3e3b3b2d6805291a9d000e0e0c000203041acb00103b503c3b2b2f6b221d38221e230c2a3b3c1abe000e0e0e0c0004502b2a0e0e0c0002261102023b50342b69270d020f1aa8002d2d1aab002e0e7b05040004430e0e0e000000000000000090010000000000000000000000000000|@6160,I253,I251,I218,I223,I231,@70,I105,I252,@5814,@6159,@5823,@5826,@6012,@1363,I255,@6038,@6040| 6159:S25|4c6162656c73206d75737420626520312c322c332c2e2e2e2e 6160:S20|534b4950535f28292e6765744c6162656c283229 6161:O1|@6162 6162:D10,432|00842e372f23092a3b1aac010e0c00032a3b1aa3010c00032928291aa2010e0e0e0c00031aa1010e0e0c000203032902012a2928201a88010e0c000303033c022b2928211a79010e0e0c000303033c021b2928181a69010e0e0c000303033c020b29283a1a59010e0e0c0003270503171a5d012e690402002a312f2c320c00055029352966021e283a1a4c010e0c000229301a4b010c0003502f1a4b010c0002501a4c01642f373023092a3b1a09010e0e0c00032a3b1aff000c00032928291afe000e0e0e0c00031afd000e0e0c000203032902012a29280b1ae4000e0c00032705030c2f1a00010e0c0002503c028e2f373023092a3b1abe000e0e0e0c00032a3b1ab3000c00032928291ab2000e0e0e0c00031ab1000e0e0c000203032902012a2928201a98000e0c000303033c022b2928211a89000e0e0c000303033c021b2928181a79000e0e0c000303033c020b29283a1a69000e0e0c00032705031d280b1a73000c000229311a73000c000350301a73000c0002503c6402013b03123b303030301a70000e0c00062a2a69640203293b69641f050000000000000000a0010000000000000000000000000000|@6164,I253,I251,I218,@6163,@6035,@6009,@5814,@1444,@6161| 6163:D2,72|00802b282f1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6164:S77|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d70726f636573734c697374283129 6165:D8,240|00832b36293b1aef000c00032d3a2e23062f230a30230e31230f2b3b1ad9000e0e0c00032e3b1acf000c00032b3b1ac7000c00032d3b1abf000c0003302c2e2c2e68052210352211372212392b302c302d68053c28401aa7001aac000e0c0004221622102217312e2e68063c2a6922151a9d000e0e0c000250221537221623092a3b1a73000c00032a3b1a6b000c00032928291a82000e0e0e0c00031a81000e0e0c000203032902012a2928181a68000e0c000327050314293b6922172a2f2b221a1a6300221b7b061b000522162a452d4627131f040e0e0000000000000000e0000000000000000000000000000000|@6166,I253,@6118,I11,@5814,I251,I218,@6116| 6166:S64|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129636f6e7374727563746f7273283229 6167:O5|@5799,612,0,612,0 6168:S31|417474656d707420746f20707573682074776f20706172656e746865736573 6169:D3,64|00832e370404003b2a1a3c000e0c00035029383b3131566732220d31301a3000220d0e7b0a090009000000000000000030000000000000000000000000000000|@6171,@6172,@6170| 6170:O1|@6177 6171:S39|50415253455f44454328292e70617273654465632833297369676e617475726553706563283329 6172:O1|@6173 6173:D3,72|00810403003b2a1a46000e0e0e0c00035029352a362b371a3e002b2b6a302d452c462b472a482705430e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6175,@5990,@6174| 6174:D12,200|00802b56180c0002293b1ac3000c000303972c1ac2000e0e0e0c0002293c1abf000c00036403402c1aad000e0e0c00023c2a1ab3000c00036403041ab200103b502c1ab3000c000203032c020b2c28091aad000e0e0c00032928271a72000e0e0e0c00036402013b3c28401a9a001a9f000c00042a03033f02013b1a9a002a1a9e000e0e0e0c0003293d1a93000c0003293b1a8b000c00032d2a69332a6956970e0c00022a27080202293564420e0e0e0000000000000000b8000000000000000000000000000000|@6176,I251,I223,I233,I231,@70,I105,I252,@588,I11,79992,I242| 6175:S40|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129 6176:S43|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129283129 6177:D31,2056|008731373223092a3b1a04080e0c00032a3b1afb070c00032928291afa070e0e0e0c00031af9070e0e0c000203032902012a2928301ae0070e0c000303033c027b29281b1ad1070e0e0c000303033c026b2928311ac1070e0e0c000303033c025b2928361ab1070e0e0c000303033c024b2928121aa1070e0e0c000303033c023b29283d1a91070e0e0c000303033c022b2928101a81070e0e0c000303033c021b29283b1a71070e0e0c000303033c020b29280c1a61070e0e0c000303033c020729220d0e0c00021a55070e0e0c0002270507d11a5107321a55070e0e0c00035031373223092a3b1a25070e0e0c00032a3b1a1b070c00032928291a1a070e0e0e0c00031a19070e0e0c000203032902012a29220d0c000203033c029b2928301af5060e0e0c000303033c027f29281b1ae5060e0e0c000303033c026f2928311ad5060e0e0c000303033c025f2928361ac5060e0e0c000303033c024f2928121ab5060e0e0c000303033c023f29283d1aa5060e0e0c000303033c022f2928101a95060e0e0c000303033c021f29283b1a85060e0e0c000303033c020f29280c1a750602022e000e0e0c000303033c020729220d0e0c00021a65060e0e0c00022705030e311a70060e0c0002501eec3b02013b02013b32373323092a3b1a30060e0c00032a3b1a27060c00032928291a26060e0e0e0c00031a25060e0e0c000203032902012a220e2306220f230a2210230f2a3b1af9050e0e0c00032a3b1aef050c00032e28311aee050e0e0e0c000307d5221323062214230a2215230f2a3b1acd050e0e0c00032a3b1ac3050c000322181ae3050c0002221937221a23092a3b1aac050e0c00032a3b1aa3050c00032928291aa2050e0e0e0c00031aa1050e0e0c000203032902012a29283b1a88050e0c0003030e221e1a9d050e0e0c0002503c02013b1a9805221f691a9a052a22221a9c050e0c000429352a362a2a69222437222523092a3b1a45050e0e0c00032a3b1a3b050c00032928291a3a050e0e0e0c00031a39050e0e0c000203032902012a2928111a20050e0c00032705030e22241a3305020255000c0002021728111a45050e0e0c00022922261a12050e0e0e0c00036428111a360522271a39052228222a6a1a39050e0e0c000529352a3629362a3822162b22152c22166805302e693e2b220f2c6b293b69271a0fcf2e281b1ab4040e0c000307d722131ac9040e0e0c0002221437221523092a3b1a90040e0c00032a3b1a87040c00032928291a86040e0e0e0c00031a85040e0e0c000203032902012a2928321a6c040e0c000303033c021b2928061a5d040e0e0c000303033c020b2928181a4d040e0e0c00031a4d040e0e0c0002270503991a990422151a4c040e0c000350221437221523092a3b1a1b040c00032a3b1a13040c00032928291a12040e0e0e0c00031a11040e0e0c000203032902012a2922190c000203033c02332928321aed0302027a020e0e0c000303033c021f2928061ad90302027e000e0e0c000303033c020b2928181ac5030e0e0c00031ac5030e0e0c00022705030e22141acf030c0002501e843b02013b02013b1a0704221569040200221322182c2c2218221a0c00065029352a360402002a2a221c221c1aeb030c00055029352a362d2b692a362b3822102b220f2c221068053d2d2b6a293b69270e0fd72e28361a51030e0e0c0003033522131a65030e0e0c00023d1ab40322161ab7032218221822182218221868061a80030e0c000529352a363f2b2b6a293b6927050fd82e28121a0f030c0003032722131a25030e0e0c00023d1a740322161a7f032217221922156b1a45030e0e0c00052935650fdd2e283d1add020e0e0c0003032722131af1020e0e0c00023d1a400322161a53032217221922146b1a11030e0e0c00052935650fdb2e28101aa9020e0e0c0003034c1a370322136922141ab7020c00020402002b1a2d03221422166a2b22161a2a0302020f010e0e0e0c00055029352a36281a2b2b6a2a362b38220c2b342c220c68053b2d2b6a293b69270a0fce2e283b1a50020e0c000303501af70222136922141a5f020202cc000c00020402002b1ae902221422166a2b22161ace020e0e0e0c00055029352a36281a2b2b6a2a362b38220c2b342c220c68053b020295002d2b6a293b69270a028b2e280c1af4010e0c0003037e22133a221423062215230a2216230e2217230f2b3b1ace01020263000e0e0e0c00032e3b1abf010c00032b3b1ab7010c00032d3b1aaf010c0003302c2e2c2e68051a6a02221d69221a35221b361a66022221692b2b2b6a0402002e2b3c322d22251a5a02020217000e0e0e0c00075029352a363b2b2b6a293b69271302013b221437221523092a3b1a5b010c00032a3b1a53010c00032928291a52010e0e0e0c00031a51010e0e0c000203032902012a2928301a38010e0c0003030c22191a4d010e0e0c000202013b221a37221b23092a3b1a11010e0e0c00032a3b1a07010c00032928291a06010e0e0e0c00031a05010e0e0c000203032902012a2928301aec000e0c000303033c027b29281b1add000e0e0c000303033c026b2928311acd000e0e0c000303033c025b2928361abd000e0e0c000303033c024b2928121aad000e0e0c000303033c023b29283d1a9d000e0e0c000303033c022b2928101a8d000e0e0c000303033c021b29283b1a7d000e0e0c000303033c020b29280c1a6d000e0e0c0003270503333b221b221b221b221b221b221b221b1a2a010e0e0e0c0009293b1a47000c0003030330020b302a1a1a0122177e1d00036402012f27121f080e0e0e0e0000000000000000f8070000000000000000000000000000|@6179,I253,I251,I218,@6180,@6009,@5814,@6181,@6038,@6040,@6035,@6092,@6182,@6069,@6060,@6184,@6185,@6148,@6188,@6195,@6201,@6207,@6208,@6215,@6222,@6223,@6224,@6225,@6227,@6170,@6178| 6178:O1|@6251 6179:S57|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129 6180:S9|5369676e6174757265 6181:D2,72|00802b28111a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6182:D4,64|00811a43005617691a45002a56381a47000c000429352a362a2a69302a452b462705430e0e0e0e0e000000000000000030000000000000000000000000000000|@6033,@6183,@6038,@6040| 6183:D2,72|00802b28111a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6184:D2,216|00802b28061ad8000e0c000303033c020b2b28181ac9000e0e0c000303033c02972b280f1ab9000e0e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@6006,I251| 6185:O1|@6186 6186:D9,184|00832c372d23092a3b1ab4000e0c00032a3b1aab000c00032928291aaa000e0e0e0c00031aa9000e0e0c000203032902012a2928181a90000e0c000303581a970031331a9a000e0e0e0c000429352a362a220c2b1a91000e0e0c00042c360402002a2a221022101a86000e0e0e0c00055029352a36303531363c28403b1a78000e0c00043c2c2c2c6b292f6922162a452f46270d0205323b45344627051f040e0000000000000000a8000000000000000000000000000000|@6187,I253,I251,I218,@6038,@6040,@6046,@6185,I11| 6187:S74|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d736967696473283129 6188:D2,56|00812c561756285639564a565b1a30000e0c00072c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6033,@6189| 6189:O1|@6190 6190:D12,224|00851ae3001ae800311aec000e0c000429352a362a332b1ae6000e0e0e0c00042c363437220c23092a3b1adb000c00032a3b1ad3000c00032928291ad2000e0e0e0c00031ad1000e0e0c000203032902012a2928091ab8000e0c00032705030a341abc000e0c0002021728091ab9000e0e0c000229220d1ab6000e0e0e0c0003641ab400220c6904020033220f2c2c220f22110e0e0c00065029352a362e352f3730392c362d382d2b2e2c2f6805303b316a2210352211362c2b2b2e6b292e6927141f060e0e0e0e0000000000000000d0000000000000000000000000000000|@6192,@6193,@6148,@6040,@6046,I253,I251,I218,@5814,@6035,@6009,@6191| 6191:D2,200|00802b3d1ac9000e0e0c000303033c028b2b280f1ab9000e0e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6006,I251| 6192:S79|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f537472756374757265283129 6193:O1|@6194 6194:D2,72|00802b28111a48000e0c000303033c021b2b28061a39000e0e0c000303033c020b2b28181a29002d7e030003420e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6195:D2,56|00812c5617562856391a34000e0c00052c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6033,@6196| 6196:O1|@6197 6197:D11,224|00831ae3002e691ae6002a2f1ae9000e0e0c000429352a362a312b1ae2000e0e0e0c00042c3632373323092a3b1ad8000e0c00032a3b1acf000c00032928291ace000e0e0e0c00031acd000e0e0c000203032902012a0402002a28251ab1000e0e0c00030348220f1ab5000e0e0c00021ab5002212690402002a221322132c1aae000e0e0e0c00055029352a362a6801220c35220d37220e392d362e382d2b2e2c2f6805220c30452a46260d0206293b4530465029352a363c2a220e2d6b292b69270f1f040e0e0e0000000000000000d0000000000000000000000000000000|@6199,@6200,@6193,@6040,@6046,I253,I251,I218,@5814,@6198,@6102| 6198:D2,200|00802b3d1ac9000e0e0c000303033c028b2b280f1ab9000e0e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6006,I251| 6199:S72|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f4578283129 6200:D2,56|00802b28251a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6201:D2,56|00812c5617562856391a34000e0c00052c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6033,@6202| 6202:O1|@6203 6203:D13,216|00831adb002e691ade002a2f1ae1000e0e0c000429352a362a312b1ada000e0e0e0c00042c3632373323092a3b1ad0000e0c00032a3b1ac7000c00032928291ac6000e0e0e0c00031ac5000e0e0c000203032902012a2928091aac000e0c00032705030a321ab0000e0c0002021328091aad000e0e0c000229341aab000c0003641aac00220c690402002a220d220d2c1aa5000e0e0c00055029352a362e352f3730392c362d382d2b2e2c2f680528052a2211336b292b6927121f040e0e0e0e0000000000000000c8000000000000000000000000000000|@6205,@6206,@6038,@6040,@6046,I253,I251,I218,@5814,@6035,@6009,@6204,@6102| 6204:D2,200|00802b3d1ac9000e0e0c000303033c028b2b280f1ab9000e0e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6006,I251| 6205:S73|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f56616c283129 6206:D2,56|00802b28091a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6207:D2,184|00802b280f1ab8000e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@6006,I251| 6208:D2,56|00812c3c3c563756481a34000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6209| 6209:O1|@6211 6210:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292d45 6211:D18,680|00840403003b2a1aa6020e0e0e0c00035029352a362b372b2b2b6a3b2a321a97020c00041a9902220d691a9b022a341a9e020e0e0e0c000429352a362a220d2b1a95020e0e0c00042c352d3634343422121a8c020e0c000504020022140347221137221223092a3b1a7d020e0e0c00032a3b1a73020c00032928291a72020e0e0e0c00031a71020e0e0c000203032902012a2928111a58020e0c000327051a57020c000202013b03033c020222130308293b452c46500fd1221137221223092a3b1a24020e0c00032a3b1a1b020c00032928291a1a020e0e0e0c00031a19020e0e0c000203032902012a2928111a00020e0c00032705030a22111a03020c0002021728111a01020e0e0c00022922131afe010e0e0e0c000364221237221323092a3b1ac3010c00032a3b1abb010c00032928291aba010e0e0e0c00031ab9010e0e0c000203032902012a2928201aa0010e0c000303033c022b2928211a91010e0e0c000303033c021b2928181a81010e0e0c000303033c020b29283a1a71010e0e0c00031a71010202cc000e0e0c0002270503a11a810122131a74010e0c000350221237221323092a3b1a3b010c00032a3b1a33010c00032928291a32010e0e0e0c00031a31010e0e0c000203032902012a29221c0c000203033c023b2928201a0d010e0e0c000303033c022b2928211afd000e0e0c000303033c021b2928181aed000e0e0c000303033c020b29283a1add000e0e0c00031add000e0e0c00022705030e22121ad7000c0002501e8c3b02013b02013b040200221822152f2c1ade000e0e0e0c00055029352a362a68012f2a452b46260729352a362d352e372f392c362d382d2b2e2c2f68053c28401ab6001abb000c0004220c2a332d220f222122186807292c6927191f050e0e0e0e000000000000000098020000000000000000000000000000|@6213,@5990,@6067,@6214,@6092,@6040,@6046,@6095,I253,I251,I218,@5814,@6035,@6009,@1376,@6102,@6212,I11| 6212:O2|@6118,0 6213:S37|50415253455f44454328292e70617273654465632833297479706542696e64696e67283429 6214:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6215:O1|@6216 6216:D2,40|00832c2f2f2e1a27002f0e7b06060005000000000000000018000000000000000000000000000000|@6218,@6217| 6217:O1|@6219 6218:S37|50415253455f44454328292e7061727365446563283329616e6442696e64696e6773283229 6219:D7,184|00831abb002e690402002a2a300c00035029352a362f373023092a3b1aa9000e0e0c00032a3b1a9f000c00032928291a9e000e0e0e0c00031a9d000e0e0c000203032902012a293d1a85000e0e0c0003033e341a8a000e0e0e0c0002040200292210221022101a7f000c00055029352a36332b6933353437220c392d362e382d2b2e2c2f6805221930452a46270b020a2f3b69220f2a4530466427091f040e0e0000000000000000a8000000000000000000000000000000|@6221,@6220,I253,I251,I218,@5814,@6217| 6220:D2,56|00802b3d1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6221:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292829 6222:D2,184|00802b280f1ab8000e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@6006,I251| 6223:D2,56|00812c3c3b563756481a34000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6209| 6224:D2,184|00802b280f1ab8000e0c000303033c027b2b281b1aa9000e0e0c000303033c026b2b28311a99000e0e0c000303033c025b2b28361a89000e0e0c000303033c024b2b28121a79000e0e0c000303033c023b2b283d1a69000e0e0c000303033c022b2b28101a59000e0e0c000303033c021b2b283b1a49000e0e0c000303033c020b2b280c1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@6006,I251| 6225:D11,192|008056073a561723065627230a5637230e5647230f2b3b1aae000e0e0e0c00032e3b1aa3000c00032b3b1a9b000c00032d3b1a93000c0003302c2e2c2e6805220c1a8c001a91000e0e0c0003291a90001a95000e0e0c0003291a94000e0c00023b3e3b3b2d6805291a8d000e0e0c000203041a8b00103b503c3b2b306b56f73812110001000100230c2a3b3c1a79000e0e0c0004502b2a0e0e0c0002501a70002711420e0e0e0e0e0000000000000000b0000000000000000000000000000000|@6226,I253,@6099,@122,@5823,@5826,@6012,I105,@1363,I255,@1444| 6226:S75|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d6e6577656e762d283129 6227:O1|@6228 6228:D27,816|00852b1a32030e0e0e0c00020403003b2a1a2c030e0c00035029352a362b372b2b2b6a3c2a331a1f030c00041a2103220f691a23032a220c1a25030e0e0c000429352a362a220e2b1a1d030e0e0c00042c352d36221037221123092a3b1a10030e0c00032a3b1a07030c00032928291a06030e0e0e0c00031a05030e0e0c000203032902012a2928111aec020e0c00032705030a22101a9f020c0002021728111ae5020e0e0c00022922121ae2020e0e0e0c000364221137221223092a3b1aaf020c00032a3b1aa7020c00032928291aa6020e0e0e0c00031aa5020e0e0c000203032902012a29280c1a8c020e0c000307dd220d3b1a80020e0c000303033b028922163a221723062218230a2219230e221a230f2b3b1a57020c00032e3b1a4f020c00032b3b1a47020c00032d3b1a3f020c0003302c2e2c2e68051a5a021a5f021a64020e0c0003291a64020e0c00023b3e3b3b2d6805291a5d020e0e0c000203041a5b02103b503b503c3b2b2f6b2224382225230c2a3b3c1a4c020e0c0004502b2a0e0e0c0002271022171aa9010e0e0c00021ac101221e221a1ac2010e0e0e0c000429352a36221d35221e37221f392c362d382d2b2e2c2f68052211302214332d680528062a6922242a45020206002c46270d0fd21af601221c690402002a3322112213220c22202f221f1ae8010e0c00095029352a36221a37221b23092a3b1a6b010c00032a3b1a63010c00032928291a62010e0e0e0c00031a61010e0e0c000203032902012a0402002a3d1a46010e0e0e0c0003032922201af9000e0e0c0002501a9801222669291a9901222622246a2c22241a96010e0e0e0c0005510206293b4530465029352a36222237222323092a3b1af7000c00032a3b1aef000c00032928291aee000e0e0e0c00031aed000e0e0c000203032902012a0402002a28421ad100020269000e0e0c0003032122281a81000e0e0c000250222d1a3601222e222b6a2b222b1a23010c0005500206293b4530465029352a36222c35222d37222e392c362d382d2b2e2c2f680522172210693c28403b1a03010c00043b2c2c3b220d2e68063b2a6922352a452e46271e27141f06000000000000000020030000000000000000000000000000|@6230,@5814,@5990,@6067,@6231,@6092,@6040,@6046,I253,I251,I218,@6035,@6009,@6232,@5823,@5826,@6012,I105,@1363,I255,@6233,@6234,@6245,@6246,@6215,@6229,I11| 6229:D2,56|00812c3b3b563756481a34000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6209| 6230:S43|50415253455f44454328292e706172736544656328332964617461747970654465634f725265706c283429 6231:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6232:S52|4461746174797065207265706c69636174696f6e206d757374206e6f7420636f6e7461696e2074797065207661726961626c6573 6233:D2,72|00802b3d1a49000e0e0c000303033c02172b28421a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6234:O1|@6235 6235:D11,496|00872b372c23092a3b1aec010e0c00032a3b1ae3010c00032928291ae2010e0e0e0c00031ae1010e0e0c000203032902012a2928261ac8010e0c000303033c021b2928061ab9010e0e0c000303033c020b2928181aa9010e0e0c000303033c023b2928201a99010e0e0c000303033c022b2928211a89010e0e0c000303033c021b2928181a79010e0e0c000303033c020b29283a1a69010e0e0c00031a69010e0e0c0002270503d11a65012c1a69010e0e0c0003502b372c23092a3b1a39010e0e0c00032a3b1a2f010c00032928291a2e010e0e0e0c00031a2d010e0e0c000203032902012a29220f0c000203033c026b2928261a09010e0e0c000303033c021b2928061af9000e0e0c000303033c020b2928181ae9000e0e0c000303033c023b2928201ad9000e0e0c000303033c022b2928211ac9000e0e0c000303033c021b2928181ab9000e0e0c000303033c020b29283a1aa9000e0e0c00031aa9000e0e0c00022705030e2b1ab4000e0c0002501ebc3b02013b02013b3035313632372f1aa4000e0c0005040200220c2a30332e1a9c000e0c00065029352a3633353437220c392c362d382d2b2e2c2f68053c28401a83001a88000e0c000422142a332d22152218680622102a452c46270d1f080e0e0e0e0e0e0e0000000000000000e0010000000000000000000000000000|@6237,I253,I251,I218,@1376,@6009,@5814,@6095,@6236,@6212,I11| 6236:O1|@6238 6237:S38|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629 6238:D18,576|00842d372e23092a3b1a3c020e0c00032a3b1a33020c00032928291a32020e0e0e0c00031a31020e0e0c000203032902012a2928261a18020e0c0003038c31037b323a33230634230a220c230e220d230f2b3b1af2010e0e0e0c00032e3b1ae7010c00032b3b1adf010c00032d3b1ad7010c0003302c2e2c2e68051ae2011ae7011aec010e0c0003291aec010e0c00023b3e3b3b2d6805291ae5010e0e0c000203041ae301103b503b503b3b2b2f6b2217230c2a2a0c0002261002023b50321ace010e0e0e0c000202013b1aca01220d691acc012a220d1ace010e0e0e0c000429352a362a220f2b1ac5010e0e0c00042c352d36221137221223092a3b1a48010e0c00032a3b1a3f010c00032928291a3e010e0e0e0c00031a3d010e0e0c000203032902012a0402002a28251a21010e0e0c0003034e22171a55010e0e0c00021a7501221b690402002a221b221a2c1a6e010e0e0e0c00055029352a362a6801220c2a220f6a220d35220e37220f392e362f382d2b2e2c2f6805220d30452a46260e020a2f3b326a2a2a4531465129352a36221937221a23092a3b1aaa000e0e0e0c00032a3b1a9f000c00032928291a9e000e0e0e0c00031a9d000e0e0c000203032902012a29283e1a84000e0c00030342221e1ab9000e0e0c000204020022222a2222222222221add000e0e0c00065029352a36332b6933353437220c392d362e382d2b2e2c2f6805222a30452a46270b020a2f3b6922202a45304664271a1f050e0e0e0e0e0e000000000000000030020000000000000000000000000000|@6240,I253,I251,I218,@6241,@5823,@5826,@6242,I105,@1363,@5814,@6244,@6038,@6040,@6046,@6239,@6102,@6236| 6239:D2,56|00802b283e1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6240:S48|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629636f6e73747273283129 6241:S62|60606f702727206d6179206e6f7420617070656172206265666f7265206120636f6e7374727563746f7220696e20612073706563696669636174696f6e2e 6242:O1|@6243 6243:D8,128|00802b1a82000e0e0e0c00021a81000e0e0c0002034e2b352c36293b1a79000e0e0c000303183e2b69291a5b000c000203041a6b00103b50293b696402233e2b69291a43000c000203041a5300103b502a1a54000e0c00021a55002a692b2a69666502031a510042000000000000000070000000000000000000000000000000|@5839,I105,I218,I251,@1363,@6242,@871,@5838| 6244:D2,72|00802b283e1a48000e0c000303033c020b2b28251a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6245:D2,56|00802b28421a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6246:D2,56|00812c561756281a36000e0e0e0c00042c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6247| 6247:O1|@6248 6248:D14,232|00820403003b2a1ae6000e0e0e0c00035029352a362b372b2b2b6a3c2a321ad7000c00041ad90034691adc002a341adf000c000429352a362a220d2b1ad9000e0e0c00042c352d36220f37221023092a3b1acc000e0c00032a3b1ac3000c00032928291ac2000e0e0e0c00031ac1000e0e0c000203032902012a2928111aa8000e0c00032705030a220f1aab000c0002021728111aa9000e0e0c00022922111aa6000e0e0e0c00036404020022132d34220d2f22172f22181a95000e0e0c00095029352a362a2a692711440e0e0e0e0e0000000000000000d8000000000000000000000000000000|@6250,@5990,@6067,@6249,@6092,@6040,@6046,I253,I251,I218,@5814,@6035,@6009,@6234| 6249:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6250:S41|50415253455f44454328292e7061727365446563283329646174617479706542696e64696e67283229 6251:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6178| 6252:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6253:D54,624|00802b0a4300880047023a022f02e8002402ed00170291001501d10019010c02ff01f001e301a5000401d601cb01be01af00b101cd004c02a6019901a0008e018301f1002101df00290176016b0164015f015a01550150018c004b01e30046011d01db0025011101b400b900c300f600be00c80041010c01d600fb003c010001370108019b002d013201aa00960028070fdd1ae3010fdc1ae6010fd91ae9010fdd1aec010fda1aef010fdc1af2010fdb1af5010fdd1af8010fdc1afb010fd91afe010fdd1a01020fda1a04020fdc1a07020fdb28230fd91a06020fdd1a09020fda287d0fdd287b0fdd1a04020fda1a07020fdc282a0fdc1a06020fd91a09020fdd1a0c020fda285f0fdd283d0fdd287c0fdb1a03020fdd283b0fdd283a0fdb282c0fd9285d0fdc285b0fdc28290fda28280fdd1aea010fdc1aed010fd91af0010fdd1af3010fda1af6010fdc1af9010fdb1afc010fdd1aff010fdc1a02020fd91a05020fdd1a08020fda1a0b020fdce4000204e000de001a060202d90204d500d3001a030202cecc000202c8001a000202c3c1000204bd00bb001afb0102b60204b200b0001af80102aba9000204a500a3001af301029e02049a0098001af0010293910002048d008b001aeb0102868400020480007e001ae60102790204750073001ae301026e6c000204680066001ade0102615f0002065b00590057001ad7010252500002044c004a001ad2010245430002043f003d001acd0102380204340032001aca01022d2b00020227001ac7010222200002041c001a001ac2010215020411000f001abf01020a08001ac00102031ac301420e0e000000000000000060020000000000000000000000000000|@6255,@6256,@6257,@6258,@5970,@5957,@1381,@5946,@5638,@5906,@5306,@5962,@2227,@2207,@5934,@855,@6259,@1520,@6260,@6261,@6262,@5936,@5959,@3268,@2232,@1376,@2940,@5919,@5926,@5954,@5967,@5939,@1458,@5301,@5950,@2936,@5298,@5300,@2934,@2938,@5929,@5948,@2473,@2240,@2932,@2942,@5923,@1406,@5912,@5944,@5969,@5964,@5915,@6254| 6254:S12|3c6964656e7469666965723e 6255:S15|53796d626f6c732e72657072283129 6256:S14|756e6b6e6f776e2073796d626f6c 6257:S15|3c6368617220636f6e7374616e743e 6258:S15|3c776f726420636f6e7374616e743e 6259:S15|3c7265616c20636f6e7374616e743e 6260:S18|3c696e746567657220636f6e7374616e743e 6261:S17|3c737472696e6720636f6e7374616e743e 6262:S17|3c74797065206964656e7469666965723e 6263:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6264:D2,72|00802b280f1a48000e0c000303033c020b2b281a1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6265:D1,40|00802b56180c0002502b56172c800002000000000000000018000000000000000000000000000000|@6266| 6266:S35|50415253455f44454328292e6d6b4c6f63616c426f6479466978456e76283429283129 6267:O2|@6268,@6024 6268:D23,1904|00852f373023092a3b1a6c070e0c00032a3b1a63070c00032928291a62070e0e0e0c00031a61070e0e0c000203032902012a2928221a48070e0c000303033c021b2928061a39070e0e0c000303033c020b2928181a29070e0e0c000303033c020b2928351a19070e0e0c00031a19070e0e0c0002270503a11a1507301a19070e0e0c0003502f373023092a3b1ae9060e0e0c00032a3b1adf060c00032928291ade060e0e0e0c00031add060e0e0c000203032902012a29340e0c000203033c023b2928221ab9060e0e0c000303033c021b2928061aa9060e0e0c000303033c020b2928181a99060e0e0c000303033c020b2928351a89060e0e0c00031a89060e0e0c00022705030e2f1a94060e0c0002501e8c3b02013b02013b1a8b06306931230632230a33230f2a3b1a4b060c00032a3b1a43060c0003220d37220e23092a3b1a34060e0c00032a3b1a2b060c00032928291a2a060e0e0e0c00031a29060e0e0c000203032902012a0402002a28221a0d060e0e0c000307cf22131a21060e0e0c00022215362216370403003b2a1a1e060e0e0e0c00035029362a371a18062e2b6a2b2a2f6a1a1606221b692a221d2b221c221c121c00010001000e0c0006221d37221e23092a3b1aac050e0c00032a3b1aa3050c00032928291aa2050e0e0e0c00031aa1050e0e0c000203032902012a29281a1a88050e0c00032705030a221d1a9b050c00020217281a1ab9050e0e0c000229221f1a7e050e0e0e0c0003641aac05221e690402002e22212c2c2221222122200c000750293522213a2222230e2a3b1a3105020288000e0e0c00032a3b1a23050c0003222537222623092a3b1a14050e0c00032a3b1a0b050c00032928291a0a050e0e0e0c00031a09050e0e0c000203032902012a29280f1af0040e0c00032705030a22251a03050c00020217280f1a21050e0e0c00022922271ae6040e0e0e0c000364221d2c221c2d221d68053c30220c2c6b22152a452b4626160fd12a28351aa7040c000307c822131abd040e0e0c00022215362216370403003b2a1aba040e0e0e0c00035029362a371ad4042e2b6a2b2a2f6a1ad204221b692a221d2b221c221c121c00010001000e0c0006221d3a221e230e2a3b1a48040e0c00032a3b1a3f040c000322182b22172c22186805222237222323092a3b1a26040e0e0e0c00032a3b1a1b040c00032928291a1a040e0e0e0c00031a19040e0e0c000203032902012a29280f1a00040e0c00032705030a22221a13040c0002021b280f1a31040e0e0c00022922241af603020494031f000e0c0003643c28403b1a34040e0c00043e312d2c6b22122a452d4626130fd51a26042213691a28042a22161a2a040e0e0e0c000429352a36221723062218230a2219230f2a3b1a87030c00032a3b1a7f030c0003221c37221d23092a3b1a70030e0c00032a3b1a67030c00032928291a66030e0e0e0c00031a65030e0e0c000203032902012a2928211a4c030e0c000307d022211a61030e0e0c0002220c2223220d1abb030c0004222337222423092a3b1a1c030e0c00032a3b1a13030c00032928291a12030e0e0e0c00031a11030e0e0c000203032902012a29282f1af8020e0c0003033b22283a2229230e2a3b1ade0202029c020e0e0e0c00032a3b1acf020c000322142b22132c221468053c28403b1a2b030c00043e3b2c2c6b27060fd31a4403222869222937222a23092a3b1a9d020e0e0c00032a3b1a93020c00032928291a92020e0e0e0c00031a91020e0e0c000203032902012a2928361a7802020212020e0c000303033c02af29280c1a65020e0e0c000303033c029f2928141a55020e0e0c000303033c028f2928271a45020e0e0c000303033c027f2928241a35020e0e0c000303033c026f29281d1a25020e0e0c000303033c025f29281c1a15020e0e0c000303033c024f2928231a05020e0e0c000303033c023f2928121af5010e0e0c000303033c022f293c1ae6010202af000e0e0e0c000303033c021b29283b1ad1010e0e0c000303033c020b29283d1ac1010e0e0c00032705036d222a36222b370403003b2a1ada010e0e0e0c00035029362a371a34022e2b6a2b2a2f6a2922313222302230123000010001000e0e0e0c000622313a2232230e2a3b1a6c010e0c00032a3b1a63010c0003221d2b221c2c221d68053c28403b1abf010c00043e302c2c6b270e0217040200222b222b2c2c222b222b222a0e0c0007502935646422293a222a230e2a3b1a1f010c00032a3b1a17010c0003222d37222e23092a3b1a08010e0c00032a3b1aff000c00032928291afe000e0e0e0c00031afd000e0e0c000203032902012a29282f1ae4000e0c00032705030a222d1af7000c00020217282f1a15010e0e0c000229222f1ada000e0e0e0c0003642217352218372219392b2f2c302d68053c28403b1a0c010e0c00043c28403b1a01010e0e0c00043c28403b1af5000e0e0c00043c28403b1ae9000e0e0c0004220d22212d2d303222253068083b2a6922252a4530462618021a3c28403b1ac3000c00043f220d2b220e6b22102a45220d462603260e29352a362a2a221522182215221b22131ad30022187b091700080e0e0e0e000000000000000060070000000000000000000000000000|@6270,I253,I251,I218,@6271,@6009,@5814,@6272,@5990,@6273,@6274,@6035,@6275,@6276,@6277,I11,@6278,@6038,@6040,@6046,@6279,@6280,@6269| 6269:O1|@6281 6270:S35|50415253455f44454328292e706172736544656328332973747275637456616c283329 6271:S29|737472756374206f722066756e63746f72206170706c69636174696f6e 6272:D2,72|00802b401a49000e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6273:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6274:D2,104|00802b280f1a68000e0c000303033c020b2b281a1a59000e0e0c000303033c02272b401a4a000e0e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@6006,I251| 6275:D2,88|00802b280f1a58000e0c000303033c02272b401a4a000e0e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6276:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6277:D2,88|00802b280f1a58000e0c000303033c02272b401a4a000e0e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6278:D2,88|00802b28211a58000e0c000303033c02272b401a4a000e0e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6279:D2,104|00802b280b1a68000e0c000303033c020b2b282f1a59000e0e0c000303033c02272b401a4a000e0e0e0c000303033c02172b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@6006,I251| 6280:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6281:D8,336|00862e372f23092a3b1a4c010e0c00032a3b1a43010c00032928291a42010e0e0e0c00031a41010e0e0c000203032902012a29401a29010e0e0c0003036e331a2e010e0e0e0c000204020033220d342c220f1a23010c00065029352a363c28403b1a1c010e0c00043c28403b1a11010e0e0c000422132d3c2e2e2e68063d2a69221435221537221639303631382d2b2e2c2f68052f2a221b221b221b221b221b1ae500221c0e0e7b091c00082928091aae000e0e0e0c0003036e331ab2000e0e0e0c000204020033220d342c220f1aa7000c00065029352a363c28403b1aa0000e0c00043c28403b1a95000e0e0c000422132d3b2e2e2e68063d2a69221435221537221639303631382d2b2e2c2f68052f2a221b221b221b221b221b1a6900221c0e0e7b091c000834220e45220d4627051f070e0e0e0e0e000000000000000040010000000000000000000000000000|@6282,I253,I251,I218,@5814,@6055,I11,@6269| 6282:S51|50415253455f44454328292e706172736544656328332973747275637456616c283329646f436f6e73747261696e7473283229 6283:D2,48|00843b2e3056373030220c1a2a00327b090700080e0e0e0e000000000000000020000000000000000000000000000000|@6285,@6284| 6284:O1|@6286 6285:S32|50415253455f44454328292e7061727365446563283329737472446563283329 6286:D9,528|00861a1302316930373123092a3b1a0f020c00032a3b1a07020c00032928291a06020e0e0e0c00031a05020e0e0c000203032902012a2928301aec010e0c000327050318301af0010e0c00023b3333333333331aea01347b090b000830373123092a3b1aba010e0e0e0c00032a3b1aaf010c00032928291aae010e0e0e0c00031aad010e0e0c000203032902012a2928231a94010e0c000303033c020b2928361a85010e0e0c0003270503222c312b3131340e0e0e0c00063b3333333333331a7e010e0e0e0c00082a2a69650fd730373123092a3b1a48010e0c00032a3b1a3f010c00032928291a3e010e0e0e0c00031a3d010e0e0c000203032902012a29280c1a24010e0c000303033c029f2928141a15010e0e0c000303033c028f2928271a05010e0e0c000303033c027f2928241af5000e0e0c000303033c026f29281d1ae5000e0e0c000303033c025f29281c1ad5000e0e0c000303033c024f2928231ac5000e0e0c000303033c023f2928121ab5000e0e0c000303033c022f293c1aa6000e0e0e0c000303033c021f29283b1a95000e0e0c000303033c020f29283d1a8500020249000e0e0c00032705033f0402002a323c302d34341a8b000c00085029352a363c28403b1a84000e0c00043b2c2b2d6b3b220e220e220e220e220e220e1a5b000c00082a2a69270602013b641f070e0e0e0e0e000000000000000000020000000000000000000000000000|@6288,@6287,I253,I251,I218,@5814,@6284,@6021,I11| 6287:D2,248|00802b28361af8000e0c000303033c02bb2b280c1ae9000e0e0c000303033c029b2b28141ad9000e0e0c000303033c028b2b28271ac9000e0e0c000303033c027b2b28241ab9000e0e0c000303033c026b2b281d1aa9000e0e0c000303033c025b2b281c1a99000e0e0c000303033c024b2b28231a89000e0e0c000303033c023b2b28121a79000e0e0c000303033c022b2b3c1a6a000e0e0e0c000303033c021b2b283b1a59000e0e0c000303033c020b2b283d1a49000e0e0c000303033c020b2b28301a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000e8000000000000000000000000000000|@6006,I251| 6288:S42|50415253455f44454328292e706172736544656328332973747244656328332967657444656373283129 6289:O1|@6290 6290:D2,232|00802b280c1ae8000e0c000303033c029b2b28141ad9000e0e0c000303033c028b2b28271ac9000e0e0c000303033c027b2b28241ab9000e0e0c000303033c026b2b281d1aa9000e0e0c000303033c025b2b281c1a99000e0e0c000303033c024b2b28231a89000e0e0c000303033c023b2b28121a79000e0e0c000303033c022b2b3c1a6a000e0e0e0c000303033c021b2b283b1a59000e0e0c000303033c020b2b283d1a49000e0e0c000303033c021b2b28231a39000e0e0c000303033c020b2b28361a29002d7e030003420e0e0e0000000000000000d8000000000000000000000000000000|@6006,I251| 6291:O1|@6292 6292:D6,112|00832d23062e230a2f230f2a3b1a68000e0c00032a3b1a5f000c0003321a60000e0c00023d1a6000220c1a6300220e220e220e221268051a5e000e0e0e0c000529352a3629362a38332b322c3368053c2e2b6a270c1f040e000000000000000060000000000000000000000000000000|@6294,I253,@5814,@6148,@6293,@6069| 6293:D2,56|00812c561756285639564a1a32000e0e0e0c00062c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6033,@6295| 6294:S38|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329 6295:O1|@6296 6296:D15,232|00841aeb001af000301af4000e0c000429352a362a322b1aee000e0e0e0c00042c3633373423092a3b1ae4000e0c00032a3b1adb000c00032928291ada000e0e0e0c00031ad9000e0e0c000203032902012a2928111ac0000e0c00032705030a331ac4000e0c0002021728111ac1000e0e0c000229220c1abe000e0e0e0c0003641abc00346904020033220e2c2c220f1ab5000e0e0c00065029352a362e352f3730392c362d382d2b2e2c2f6805220f352210363c28401a96001a9b000c00042c2c2b2d220e6805292e6927141f050e0000000000000000d8000000000000000000000000000000|@6298,@6193,@6148,@6040,@6046,I253,I251,I218,@5814,@6035,@6009,@6299,@6055,@6297,I11| 6297:O6|@6301,@6305,0,0,@6300,0 6298:S49|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329646f536967446563283129 6299:D2,72|00802b3d1a49000e0e0c000303033c020b2b280f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6300:O1|@6306 6301:O3|0,@6303,@6302 6302:O10|0,0,0,0,0,0,0,0,0,0 6303:O1|@6304 6304:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 6305:S11|3c756e646566696e65643e 6306:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@6308,@6307| 6307:O4|11,@49,0,@6309 6308:S35|5349474e41545552455328292e756e646566696e65645369676e61747572652d283129 6309:O5|@6310,177,0,177,0 6310:S34|6d6c736f757263652f4d4c436f6d70696c65722f5349474e4154555245532e736d6c 6311:O1|@6312 6312:D2,40|00802b28331a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6313,I251| 6313:S22|53796d5365742e7369676e617475726553792d283129 6314:O1|@6315 6315:D6,112|00842e23062f230a30230f2a3b1a68000e0c00032a3b1a5f000c0003331a60000e0c00023d1a6000220d1a6300220e2210220f2213221068061a5c000e0c000529352a3629362a38332b322c3368053b2e2b6a270c1f050e000000000000000060000000000000000000000000000000|@6317,I253,@5814,@6028,@6316,@6069| 6316:D2,56|00812c561756285639564a565b1a30000e0c00072c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6033,@6318| 6317:S36|50415253455f44454328292e706172736544656328332966756e63746f72446563283329 6318:O1|@6319 6319:D22,1384|00851a6b0530691a6e052a311a71050e0e0c000429352a362a332b1a6a050e0e0e0c00042c352d36220c37220d23092a3b1a5c050e0c00032a3b1a53050c00032928291a52050e0e0e0c00031a51050e0e0c000203032902012a2928211a38050e0c00032705030a220c1a3b050c0002021728211a39050e0e0c000229220e1a36050e0e0e0c0003641a3405220f69220e37220f23092a3b1af5040e0e0c00032a3b1aeb040c00032928291aea040e0e0e0c00031ae9040e0e0c000203032902012a29282f1ad0040e0c000327050356220e3a220f23062210230a2211230e2212230f2b3b1aa8040e0c00032e3b1a9f040c00032b3b1a97040c00032d3b1a8f040c0003302c2e2c2e68053b3b2b6a3c28403b1ab2040e0e0e0c00041ab1042a2c6a270c0fcd220e37220f23092a3b1a5e040e0e0e0c00032a3b1a53040c00032928291a52040e0e0e0c00031a51040e0e0c000203032902012a29281b1a38040e0c000303033c026b2928311a29040e0e0c000303033c025b2928361a19040e0e0c000303033c024b2928121a09040e0e0c000303033c023b29283d1af9030e0e0c000303033c022b2928101ae9030e0e0c000303033c021b29283b1ad9030e0e0c000303033c020b29280c1ac9030e0e0c00032705036a220e2306220f230a2210230f2a3b1aa7030c00032a3b1a9f03020201010c0003221122143022151ad6030e0e0e0c000522143a2215230e2a3b1a7c030e0c00032a3b1a73030c0003322b312c3268053b2f2b6a3c28403b1a96030e0e0e0c00041a95032a2c6a270d02b41a9b032210691a2d032a22111a2f030c000429352a362a22132b1a29030e0e0c00042c35221437221523092a3b1a1e030e0e0e0c00032a3b1a13030c00032928291a12030e0e0e0c00031a11030e0e0c000203032902012a2928091af8020e0c00032705030a22141afb020c0002021728091af9020e0e0c00022922161af6020e0e0e0c0003641a1c03221769040200221522182c2c221a1a13030c00065029353c28403b1ade020e0e0e0c00042e2a2c6a270b220f37221023092a3b1a8e020e0e0e0c00032a3b1a83020c00032928291a82020e0e0e0c00031a81020e0e0c000203032902012a29282f1a68020e0c00032705030a220f1a6b020c00020217282f1a69020e0e0c00022922111a66020e0e0e0c000364221037221123092a3b1a2b020c00032a3b1a23020c00032928291a22020e0e0e0c00031a21020e0e0c000203032902012a29401a09020e0e0c0003033222151a0d020e0e0c00021a5502221869040200221622192c2c221b1a3c020e0c00065029352a362a3c2b6a296801270602412928091aca010e0e0e0c0003033222151acd010e0e0c00021a1d02221869040200221622192c2c221b1afc010e0c00065029352a362a3b2b6a296801270602013b221637221723092a3b1a7b010c00032a3b1a73010c00032928291a72010e0e0e0c00031a71010e0e0c000203032902012a2928111a58010e0c00032705030a22161a5b010c0002021728111a59010e0e0c00022922181a56010e0e0e0c00036404020022162219221b2c2219221c1a8e010e0e0e0c00075029352a36220e35220f372210392c362d382d2b2e2c2f6805331a73010c00021afd000e0e0c0002032e333529352a362b373c28403b1a0f010c00043c28403b1a05010e0e0c0004220d2e2e2e2e2e68063d2a692707020130343b1aba000e0e0e0c00031ab9000e0e0c00023c28403b1ad5000e0e0c00043c28403b1ac9000e0e0c00043c28403b1abd000e0e0c00043c28403b1ab1000e0e0c00043c28403b1aa5000e0e0c00043c28403b1a99000e0e0c00042219313322203133220c222333220c3434680c29336927241f060e0e000000000000000058050000000000000000000000000000|@6321,@6322,@6038,@6040,@6046,I253,I251,I218,@5814,@6035,@6009,@6323,I11,I48,@6056,@6324,@6325,@6055,@6326,@6320,@6267,I105| 6320:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6321:S49|50415253455f44454328292e706172736544656328332966756e63746f72446563283329646f46756e6374446563283129 6322:D2,88|00802b28111a58000e0c000303033c021b2b401a4a000e0e0e0c000303033c020b2b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6323:D2,72|00802b280b1a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6324:D2,88|00802b28091a58000e0c000303033c02272b280b1a49000e0e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6325:D2,88|00802b28311a58000e0c000303033c02272b280b1a49000e0e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6326:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6327:O1|@6328 6328:D2,40|00802b28151a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6329,I251| 6329:S20|53796d5365742e66756e63746f7253792d283129 6330:D43,2360|00862e353003033c0fd731373223092a3b1a2c090e0c00032a3b1a23090c00032928291a22090e0e0e0c00031a21090e0e0c000203032902012a29280c1a08090e0c000303033c029f2928141af9080e0e0c000303033c028f2928271ae9080e0e0c000303033c027f2928241ad9080e0e0c000303033c026f29281d1ac9080e0e0c000303033c025f29281c1ab9080e0e0c000303033c024f2928231aa9080e0e0c000303033c023f2928121a99080e0e0c000303033c022f293c1a8a080e0e0e0c000303033c021f29283b1a79080e0e0c000303033c020f29283d1a6908020207000e0e0c0003270507cd31373223092a3b1a4a080e0e0e0c00032a3b1a3f080c00032928291a3e080e0e0e0c00031a3d080e0e0c000203032902012a220d3a220e2306220f230a2210230e2211230f2b3b1a0a080e0e0e0c00032e3b1aff070c00032b3b1af7070c00032d3b1aef070c0003302c2e2c2e68053328271ae7070c000307d222171aed070e0e0c0002221837221923092a3b1ac4070e0c00032a3b1abb070c00032928291aba070e0e0e0c00031ab9070e0e0c000203032902012a2928111aa0070e0c000303033c021f2928061a91070202a4060e0e0c000303033c020b2928181a7d070e0e0c00032705035d0402002b2a221b221d1a80070e0c00055029352a3629362a38220e2b220c2c220c68053c28403b1a6a070e0e0e0c00043c28403b1a5d070e0e0c00043c28403b1a51070e0e0c0004302d2d2d2d680528142a6922202a452f46270b023128181a3a0702022b000e0e0e0c000229221a1a32070e0e0e0c00035022191a06070e0e0e0c00025022161a2207452c4664640fca3328241add060e0e0c0003031222172216221622161a0b0722167b0619000533281d1abe060e0e0e0c0003031222172216221622161aeb0622167b0619000533281c1a9e060e0e0e0c0003031222172216221622161acb0622167b061900053328231a7e060e0e0e0c000307cc22171a81060e0e0c00022216362217370403003b2a1aa6060e0e0e0c00035029362a371aa0062e2b6a2b2a2f6a1a9e06222169292b22221a9c06222022201a9d060e0e0c0007222137222223092a3b1a1c060e0c00032a3b1a130602022a050c00032928291a0e060e0e0e0c00031a0d060e0e0c000203032902012a29281a1af4050e0c00032705030a22211af7050c00020217281a1a05060e0e0c00022922231a02060e0e0e0c0003641a3806221b316a292f346a1a3506222669292b22271a1306222522251a14060202b9000e0c000722263a2227230e2a3b1a90050e0c00032a3b1a87050c0003221b2b22192c22196805222b37222c23092a3b1a6e050e0e0e0c00032a3b1a63050c00032928291a62050e0e0e0c00031a61050e0e0c000203032902012a29280f1a48050e0c00032705030b222b1a4b050c0002500216280f1a58050e0c000229222d1a56050e0e0e0c000351331a9b050c00022f1a9c050e0c00023c28403b1a29050e0e0c00042a2c3c2f2d680528132a69222d2a452f4627190fcc3328121ae9040e0e0c0003034422171aed040e0e0c0002040200221a1a6005221b221a6a2b22171a5d050e0e0c00055029352a3629362a38220e2b220c2c220c680528092e2b6a221c2a452b4627080fcf333c1a99040e0e0c000307d822171a9d040e0e0c00021a2505221a690402002a1a23052217692b22181a0a050e0e0e0c0005502935221b37221c23092a3b1a55040e0e0c00032a3b1a4b040c00032928291a4a040e0e0e0c00031a49040e0e0c000203032902012a2928421a30040e0c0003033022201a3504020234030e0e0c0002501ac8042222690402002a1ac604222222206a2b22201a9b040c00055029356502013b222137222223092a3b1ae5030e0e0c00032a3b1adb030c00032928291ada030e0e0e0c00031ad9030202e0020e0e0c000203032902012a2928411abc030202f3000e0c00032705030a22211abb030c0002021728411ac9030e0e0c00022922231ac6030e0e0e0c0003641a4c0422246929222222251ae103222322231ae2030e0e0e0c000722243a2225230e2a3b1a60030e0c00032a3b1a57030c000322192b22172c22176805222937222a23092a3b1a3e030e0e0e0c00032a3b1a33030c00032928291a32030e0e0e0c00031a31030e0e0c000203032902012a29280f1a18030e0c00032705030b22291a1b030c0002500216280f1a28030e0c000229222b1a26030e0e0e0c0003512e1ab3030c00023c28403b1a01030e0e0c00042a2c22123c220e2e68063b2a69222a2a452e4627160fcd33280c1abf020c00030316221822163b2c221822171a7d0322180e0e7b0819000733283b1a9e020e0e0e0c0003034422171aa1020e0e0c0002040200221a1a5c03221922176a2b22171a11030e0e0c00055029352a3629362a38220e2b220c2c220c6805281a2e2b6a221c2a452b4627080fd03328141a4c020e0c000303a522171a51020e0e0c00020404003b2a1a14030e0c00035029352a372b380404003b2a1a01030e0e0c00035029352a362b37221e35221f361af402302d6a2b2b2b6a2f2f2f6a3c2a22221aea02020209010e0e0e0c000404020022281ae00222292f1a42022228222868062b22251a6e020e0e0e0c00055029352a3629362a38221c2b221a2c221a6805220e220d692213221369280c302c2c2f6805222c2a452d46271802b433283d1a9b010c000303a122171aa1010e0e0c00020404003b2a1a6402020293000e0c00035029352a372b380404003b2a1a4d020e0e0c00035029352a362b37221e35221f361a5802302d6a2b2b2b6a2f2f2f6a3c2a22221a36020e0e0e0c00041a45022228690402002a3b2b222b311a8e01222a222a1a37020c00095029352a3629362a38221d2b221b2c221b6805220f220e692214221469281c302c2c2f6805222d2a452d462719020822141a2801452a46270f02b70404003b2a1ac1010e0e0c00035029352a372b380404003b2a1aad010e0e0c00035029352a37220d35220e362a2a306a0402002a22152b22161a0d01221422141abe010e0e0e0c00085029352a363c28401ab5011ab2000e0e0e0c00043c28401aae011aa3000c00043c28401aaa011a97000c00041aa9012b2d1aac012d6805280e2a693c28403b1a7e000e0e0e0c00042a31312c3b6805293b69220f220f692214221469281c2c2c2c220e6805221d2a45220c462718641f070e0e0e0e0e0e0e000000000000000028090000000000000000000000000000|@6332,I253,I251,I218,@5814,@6333,I11,@6035,@6009,@3335,@6336,@5990,@6362,@6363,@6021,@6364,@6368,@6369,@6370,@6372,@6374,@6215,@6384,@6385,@6386,@6387,@6388,@6389,@6227,@6391,@6172,@6392,@6067,@6394,@6584,@6585,@6586,@6400,@588,@6380,@6590,@6331,@6045| 6331:S2|6974 6332:S29|50415253455f44454328292e7061727365446563283329646563283429 6333:O1|@6334 6334:D8,192|00832c372d23092a3b1abc000e0c00032a3b1ab3000c00032928291ab2000e0e0e0c00031ab1000e0e0c000203032902012a2928111a98000e0c000303033c021b2928061a89000e0e0c000303033c020b2928181a79000e0e0c0003270503411a7d002c2e1a80000e0c000429352a360402002a2a32321a76000e0e0e0c00055029352a363c28403b1a6c000e0c00042e2a2f6a292d69220d2a452d46270902052d3b452f461f040000000000000000b0000000000000000000000000000000|@6335,I253,I251,I218,@6193,@6040,@6333,I11| 6335:S36|50415253455f44454328292e706172736544656328332964656328342976617273283129 6336:O1|@6337 6337:D11,528|00832e372f23092a3b1a0c020e0c00032a3b1a03020c00032928291a02020e0e0e0c00031a01020e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1ad0010e0c00032e3b1ac7010c00032b3b1abf010c00032d3b1ab7010c0003302c2e2c2e680522141ac0010e0c000234281d1aa6010e0e0e0c000303103b22161ab0010e0c00033c2a6964023534281c1a88010e0c000303103b22161a94010e0c00033b2a696402193428241a6c010e0c000303043b5002041a7f01103b501a8101221637221723092a3b1a45010e0e0c00032a3b1a3b010c00032928291a3a010e0e0e0c00031a39010e0e0c000203032902012a2928111a20010e0c000303033c021b2928061a11010e0e0c000303033c020b2928181a01010e0e0c00031a01010e0e0c0002270503911a1d0122171a20010e0c000350221637221723092a3b1acf000c00032a3b1ac7000c00032928291ac6000e0e0e0c00031ac5000e0e0c000203032902012a2922190c000203033c022b2928111aa1000e0e0c000303033c021b2928061a91000e0e0c000303033c020b2928181a81000e0e0c00031a81000e0e0c00022705030e22161a7b000c0002501e7c3b02013b02013b0402002d2a221a2218221b301a8f000c00075029352a3629362a3822102b220e2c220e68052807312f2c6b221c2a452b4627191f040e000000000000000000020000000000000000000000000000|@6339,I253,I251,I218,@5814,@6340,@6356,@836,@6359,@6009,@6338| 6338:O1|@6360 6339:S32|50415253455f44454328292e7061727365446563283329666978697479283229 6340:O1|@6341 6341:D20,408|00812b372c23092a3b1a94010e0c00032a3b1a8b010c00032928291a8a010e0e0e0c00031a89010e0e0c000203032902012a29281e1a70010e0c000307cf3036293b1a5b010c0003291a6c010e0c00021a6d012b2b6a3b2a3c1a6c010e0c0004291a6c010e0c00021a45010e0e0c0002030a293529352968016502013b293b1a26010e0e0e0c000303041a4b01103b503b502935293b1a47010c000303033c020b2928091a41010e0e0c000303b6220e3a220f23062210230a2211230e2212230f2b3b1ada000e0e0e0c00032e3b1acf000c00032b3b1ac7000c00032d3b1abf000c0003302c2e2c2e6805221836293b1aad000e0e0c00031af5002a1af9000e0e0c0003291af8001aed00020267000e0e0c0003291af0001af5000e0e0c0003291af4000e0c00023b3e3b3b2d6805291a9d000e0e0c000203041ae300103b503b503c3b2b336b2220382221230c2a3b3c1ad4000e0c0004502b2a0e0e0c0002261502023b50220e1ac5000e0e0c00025029270702013b2705430e0e0e0e0e0e000000000000000088010000000000000000000000000000|@6343,I253,I251,I218,I223,@6344,@6346,I105,@1792,I234,I233,@6355,@122,@6342,@5823,@5826,@6012,@1363,I255,@5814| 6342:S37|206e6f7420616c6c6f7765642c206d757374206265206265747765656e203020616e642039 6343:S48|50415253455f44454328292e7061727365446563283329666978697479283229676574507265636564656e6365283129 6344:D5,104|00802b56181a68000e0c000303033b023a56071a62000e0e0e0c00020304560702172b28081a58000e0c000356172a1a56000e0e0e0c0003642c3c1a42000e0e0e0c00032a2a6929680166420e0e0e0e000000000000000058000000000000000000000000000000|@6345,I251,I105,I239,I252| 6345:S29|537472696e674376742e7363616e537472696e67283229726472283129 6346:O9|@6347,1152921504606846976,15,1000000000000000000,18,1152921504606846976,20,2305843009213693952,61 6347:D7,336|00820403002c3d1a4e010e0e0e0c0003030d2928104556274656284750023a2c3c1a34010e0c0003030c294045562946562a475002232c3e1a1d010e0e0c0003030d29280845562b46562c4750020a293d45562d46562e475029352f2f0c0002291afc000e0c00021afd000e0e0c000203c1293529352a3628092b1af2000e0e0e0c0003030c2a280d1ae4000e0c000302013b03033c020c2a28201aba000e0e0e0c0003030a29333332347b050b00042a282b1aa2000e0e0e0c0003030e292e341ab400340e0e7b050b00042a282d1a86000e0e0e0c000303033c020b2a287e1a75000e0e0c00030338292e341a88000e0c0004291a68000e0c00021a69000e0e0c00020318293529352a362a1a70000e0c0002292b69296801270502013b64020e332e341a5000340e0e7b050b00046602013b66440e0e000000000000000040010000000000000000000000000000|@6349,I251,I105,I218,I248,@6348,I111| 6348:O1|@6350 6349:S11|496e742e7363616e283329 6350:D11,392|00822c28101a88010e0c000303c82d2c0e0c0002291a80010e0c00021a81010e0e0c000203ac293529352a362a28301a76010e0e0e0c00031a65010e0e0c0002030e3b3b33321a6701330e7b0609000529300e0e0e0c0002291a3c010e0c00021a3d010e0e0c0002035d293529352a362a28781a32010e0e0e0c000303033c020b2a28581a21010e0e0c000303253b3b2b220d1a1a010e0e0e0c0005293b1a07010c000303093b2f69296801640201296402113b3b220e220d1af400220e0e7b060d00056602073b2b6929680164270402013b6402963b3b2f292f0e0e0c0002291ab4000e0c00021ab5000e0e0c0002036b293529352a362a28301aba000e0e0e0c000303152830341ab4000e0c00032b2a1ab3000c00036402013b032f2e341aad000e0e0c0003292c1a93000c00032928301aa2000e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b2704440e0e0e000000000000000078010000000000000000000000000000|@6352,I113,I105,I218,I251,@6351,I231,I106,I234,I108,I107| 6351:O1|@6353 6352:S25|496e742e7363616e283329726561645f6e756d626572283129 6353:D9,336|00832c2c0e0c0002291a4c010e0c00021a4d010e0e0c000207cb293529352a362a28301a42010e0e0e0c0003030c2a28391a3c010e0c000302013b032f3128101a35010e0e0c0003292c1a33010c00032928301a32010e0e0e0c00033c2a2e220c1a2c01220d0e7b060d00052a28411af6000e0e0e0c0003030c2a28461af0000e0c000302013b03373128101ae9000e0e0c0003292c1ae7000c00032928411ae6000e0e0e0c000329401ad3000c00033c2a2f220d1ad800220e0e7b060e00052a28611aa2000e0e0e0c0003030c2a28661a9c000e0c000302013b033b3128101a9500020241000e0e0c0003292c1a8f000c00032928611a8e000e0e0e0c000329401a7b000c00033c2a2f220d1a8000220e0e7b060e00053203093131692968016402013b66020d2f03092e2e692968016402013b641f04000000000000000040010000000000000000000000000000|@6354,I105,I218,I231,I232,I108,I106,I107,@6351| 6354:S29|496e742e7363616e283329726561645f6865785f646967697473283329 6355:S11|507265636564656e636520 6356:O4|@14322,@596,@1869,@6357 6357:O5|@6358,555,0,555,0 6358:S32|6d6c736f757263652f4d4c436f6d70696c65722f50415253455f4445432e4d4c 6359:S8|5661726961626c65 6360:D8,216|00852e372f23092a3b1ad4000e0c00032a3b1acb000c00032928291aca000e0e0e0c00031ac9000e0e0c000203032902012a2928111ab0000e0c000303033c021b2928061aa1000e0e0c000303033c020b2928181a91000e0e0c0003270503561a95002e301a98000e0c000429352a362a322b1a92000e0e0e0c00042c352d3632352b33692c2a69642a0e0e0e0c0002640402002b2a220f220f220f220f1a6f000c00075029352a362e2b6922112a452b46270b02052f3b4531461f060e0e0e0000000000000000c8000000000000000000000000000000|@6361,I253,I251,I218,@6193,@6040,@6046,@6338| 6361:S39|50415253455f44454328292e706172736544656328332966697869747928322976617273283129 6362:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6363:D2,72|00802b280f1a48000e0c000303033c020b2b281a1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6364:O1|@6365 6365:D7,384|00852e372f23092a3b1a7c010e0c00032a3b1a73010c00032928291a72010e0e0e0c00031a71010e0e0c000203032902012a2928301a58010e0c0003270503182e1a5c010e0c0002503030303030301a5601317b080800072e372f23092a3b1a26010e0e0e0c00032a3b1a1b010c00032928291a1a010e0e0e0c00031a19010e0e0c000203032902012a29280c1a00010e0c000303033c029b2928141af1000e0e0c000303033c028b2928271ae1000e0e0c000303033c027b2928241ad1000e0e0c000303033c026b29281d1ac1000e0e0c000303033c025b29281c1ab1000e0e0c000303033c024b2928231aa1000e0e0c000303033c023b2928121a91000e0e0c000303033c022b293c1a82000e0e0e0c000303033c021b29283b1a71000e0e0c000303033c020b29283d1a61000e0e0c00032705032b1a750031690402002a313c342d3333220d0c00085029353333333333331a50000e0c00072a2a69270402013b1f060e0e000000000000000070010000000000000000000000000000|@6367,I253,I251,I218,@5814,@6364,@6366| 6366:D2,232|00802b280c1ae8000e0c000303033c029b2b28141ad9000e0e0c000303033c028b2b28271ac9000e0e0c000303033c027b2b28241ab9000e0e0c000303033c026b2b281d1aa9000e0e0c000303033c025b2b281c1a99000e0e0c000303033c024b2b28231a89000e0e0c000303033c023b2b28121a79000e0e0c000303033c022b2b3c1a6a000e0e0e0c000303033c021b2b283b1a59000e0e0c000303033c020b2b283d1a49000e0e0c000303033c020b2b28301a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@6006,I251| 6367:S43|50415253455f44454328292e706172736544656328332964656328342964656353657175656e6365283229 6368:D1,40|00802b56180c0002502b56172c800002000000000000000018000000000000000000000000000000|@6266| 6369:D2,56|00802b280f1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6370:O1|@6371 6371:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203212b352c363c28403b1a4f000c00042b2a692b1a4d000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,I11,@6370| 6372:O1|@6373 6373:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203212b352c363c28403b1a4f000c00042b2a692b1a4d000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,I11,@6372| 6374:D2,56|00812c561756281a36000e0e0e0c00042c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6375| 6375:O1|@6376 6376:D16,536|00822c372d23092a3b1a14020e0c00032a3b1a0b020c00032928291a0a020e0e0e0c00031a09020e0e0c000203032902012a2928261af0010e0c00032705030a2c1af4010e0c000202013b1af2012f691af5012a301af8010e0c000429352a362a322b1af2010e0e0e0c00042c352d363437220c23092a3b1aa5010e0e0c00032a3b1a9b010c00032928291a9a010e0e0e0c00031a99010e0e0c000203032902012a2928111a80010e0c000303c722101a85010e0e0c0002221137221223092a3b1a5c010e0c00032a3b1a53010c00032928291a52010e0e0e0c00031a51010e0e0c000203032902012a2928261a38010e0c00032705030a22111a3b010c000202013b1a4201221422141a43010c000429352a3633353437220c392c362d382d2b2e2c2f68053c28401a34011a39010e0e0c00043c28401a36011a2b010c00043c28401a32011a1f010c0004332b2d220c2d6805280e2a693c28401a12011a07010c000422172a3b32221a2f6806293169271202852928251aad000e0e0c0003035d22101ab1000e0e0c00021af1002213692211370402002b22152c2c1ae8000e0c00055029352a363435220c37220d392c362d382d2b2e2c2f68053068013c28401aab001aa0000e0c000422142a2c2e22171aba006806292d69270f021b3c28401a8b001a80000e0c0004302a3b32331a9c00680629316965270d440e0e0e000000000000000008020000000000000000000000000000|@6378,I253,I251,I218,@5814,@6379,@6193,@6040,@6046,@588,I11,@6380,@6381,@6377,@6102,@3335| 6377:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6378:S48|50415253455f44454328292e7061727365446563283329646563283429657863657074696f6e42696e64696e67283129 6379:D2,72|00802b28111a48000e0c000303033c020b2b28251a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6380:O7|@6305,2,@694,@1444,@423,0,0 6381:O1|@6382 6382:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6383:S26|50415253455f5452454528292e6d6b4964656e74283229283129 6384:D2,72|00802b28411a48000e0c000303033c020b2b28421a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6385:D2,48|00812c3b56271a2f000c00042c2a35452a364664430e0e0e000000000000000020000000000000000000000000000000|@6210,@6247| 6386:D2,56|00802b28411a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6387:D2,56|00812c3b3b563756481a34000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6209| 6388:D2,56|00802b280f1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6389:O1|@6390 6390:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203212b352c363c28403b1a4f000c00042b2a692b1a4d000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,I11,@6389| 6391:D2,56|00812c3b3b563756481a34000e0c00062c2a35452a364664430e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6210,@6209| 6392:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d04000229356442000000000000000028000000000000000000000000000000|@6393,I251| 6393:S39|50415253455f44454328292e70617273654465632833296465632834296e6577456e762d283129 6394:D2,56|00812c561756285639564a565b1a30000e0c00072c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6210,@6395| 6395:O1|@6396 6396:D5,112|00850402003b2a3333333333331a68000e0c00095029352a363c28403b1a60000e0c00043c28401a5e001a53000c00043c28401a5a001a47000c00043c28401a4e001a3b000c00042a2f2d30302e6806292f6927081f060e000000000000000060000000000000000000000000000000|@6398,@6397,I11,@6380,@1444| 6397:O1|@6399 6398:S36|50415253455f44454328292e706172736544656328332964656328342966756e42283129 6399:D30,968|00871acb03316904020030322c2c220c1ac5030e0e0c00065029352a362a341abe030e0e0e0c000329352a362b3722113b1ab4030e0c000303033b0fcc22113529352a362a2e1a9f030c000303033c024a2a1a9b030c00021a9d030e0e0c000203142d1a8a030e0e0e0c00021a89030e0e0c000202013b03212a3b2f3b2808321a7d030e0e0c00021a7d030e0e0c00031a7d030e0e0c000602013b03043b5002bd22113a221223062213230a2214230e2215230f2b3b1a5f030c00032e3b1a57030c00032b3b1a4f030c00032d3b1a47030c0003302c2e2c2e68051a4203220f1a45030e0e0c0003291a44031a39030e0e0c000329220e1a2e030e0e0e0c0003291a34031a2103020220010e0e0c0003291a2c031a31030e0e0c0003291a30030e0c00023b3e3b3b2d6805291ac1020e0e0c000203041a1f03103b503b503c3b2b336b2223382224230c2a3b3c1a10030e0c0004502b2a0e0e0c00022615292d1a05030e0e0c000303033b02bd22113a221223062213230a2214230e2215230f2b3b1a93020c00032e3b1a8b020c00032b3b1a83020c00032d3b1a7b020c0003302c2e2c2e6805220d3c1ac3020c00031ac5022a1a71020e0e0c0003291ac0021a65020e0e0c0003220d3c1aa2020e0e0e0c00032a2a1a4f020c0003291a60021a65020e0e0c0003291a64020e0c00023b3e3b3b2d6805291af5010e0e0c000203041a5302103b503b503c3b2b346b2224382225230c2a3b3c1a44020e0c0004502b2a0e0e0c0002271566220f37221023092a3b1ae1010e0e0c00032a3b1ad7010c00032928291a9e010e0e0e0c00031aa5010e0e0c000203032902012a2928111a84010e0c0003030c22141a19020e0e0c00020257283d22151a13020c000350221437221523092a3b1a8b010c00032a3b1a83010c00032928291a4a010e0e0e0c00031a51010e0e0c000203032902012a2928381a30010e0c0003030c22191ac5010e0e0c000202013b27051ac80122176904020022162b2b221a2219221922191abb010c00085029352a36220f352210372211392c362d382d2b2e2c2f68053c28403b1aa0010e0c00042214322c2c6b222137222223092a3b1afa000e0e0e0c00032a3b1aef000c00032928291ab6000e0e0e0c00031abd000e0e0c000203032902012a0402002a283e1a99000e0e0c0003032e22271a2d010e0e0c000250221a221a69296801292c222c222c222c222c222c222c1a36010e0e0e0c000926030207293b45220f465029352a36312b692220352221372222392d362e382d2b2e2c2f6805223230452a46272a1f080000000000000000b8030000000000000000000000000000|@6401,@6402,@6403,@6494,I251,I105,I218,I223,I239,I154,I253,@6508,@122,@6509,@1354,@5823,@5826,@6012,@1363,I255,I113,@243,@6510,@6511,@5814,@6009,@6512,@6400,I11,@6397| 6400:O1|@6513 6401:S47|50415253455f44454328292e706172736544656328332964656328342966756e4228312962696e64696e6773283129 6402:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6403:O1|@6404 6404:D15,896|00842e372f23092a3b1a7c030e0c00032a3b1a73030c00032928291a72030e0e0e0c00031a71030e0e0c000203032902012a2928261a58030e0c000303033c02cb2928201a49030e0e0c000303033c02bb29281f1a39030e0e0c000303033c02ab2928211a29030e0e0c000303033c029b2928081a19030e0e0c000303033c025b2928431a09030e0e0c000303033c024b29282b1af9020e0e0c000303033c023b29281e1ae9020e0e0c000303033c022b2928341ad9020e0e0c000303033c021b2928061ac9020e0e0c000303033c020b2928181ab9020e0e0c000303033c022b2928061aa9020e0e0c000303033c020b2928181a99020e0e0c000303033c020b29283c1a89020e0e0c00031a89020e0e0c0002270507d11a85022f1a89020e0e0c0003502e372f23092a3b1a59020e0e0c00032a3b1a4f020c00032928291a4e020e0e0e0c00031a4d020e0e0c000203032902012a29330e0c000203033c0fcc2928261a29020e0e0c000303033c0fd02928201a19020e0e0c000303033c02c729281f1a09020e0e0c000303033c02b72928211af9010e0e0c000303033c02a72928081ae9010e0e0c000303033c025f2928431ad9010e0e0c000303033c024f29282b1ac9010e0e0c000303033c023f29281e1ab9010e0e0c000303033c022f2928341aa90102027b000e0e0c000303033c021b2928061a95010e0e0c000303033c020b2928181a85010e0e0c000303033c02332928061a75010e0e0c000303033c020f2928181a6501020219000e0e0c000303033c020f29283c1a5101020205000e0e0c00031a4d010e0e0c00022705030f2e1a58010e0c0002502038013b02013b02013b1a4e012f693135323633370402002c2c2c1a4501220f220d1a4601221368051a47011a4c01333022101a4d010e0e0c000a5029352a36040200220d2c2c2c220f221422141a1a011a37010c000950220e37220f23092a3b1ac7000c00032a3b1abf000c00032928291abe000e0e0e0c00031abd000e0e0c000203032902012a2922130c00021aa9000e0e0c0002270503611af500220f1aa8000e0c000350220e37220f23092a3b1a77000c00032a3b1a6f000c00032928291a6e000e0e0e0c00031a6d000e0e0c000203032902012a2922130c00021a59000e0e0c00022705030e220e1a63000c0002501e4c3b02013b02013b2a220e2a35452a3646270b1f050e000000000000000070030000000000000000000000000000|@6406,I253,I251,I218,@6407,@6009,@5814,@6408,@6409,@6403,@6461,@6038,@6463,@6432,@6405| 6405:S14|456e64206f66207061747465726e 6406:S39|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329 6407:S7|5061747465726e 6408:D2,72|00802b28051a48000e0c000303033c020b2b28091a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6409:D2,56|00812c561756285639564a1a32000e0e0e0c00062c2a35452a364664430e0e0e000000000000000028000000000000000000000000000000|@6411,@6410| 6410:O1|@6412 6411:S44|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837292d45 6412:D33,2504|00842e372f23092a3b1ac4090e0c00032a3b1abb090c00032928291aba090e0e0e0c00031ab9090e0e0c000203032902012a333a342306220c230a220d230e220e230f2b3b1a88090e0c00032e3b1a7f090c00032b3b1a77090c00032d3b1a6f090c0003302c2e2c2e68053328431a67090c00030375221336293b1a52090e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1a34090e0c00032e3b1a2b090c00032b3b1a23090c00032d3b1a1b090c0003302c2e2c2e6805221f1a24090e0c0002503c28401a21091a26090e0e0e0c000428122a220d2d1a1f09680529220f69270e0fd33328081ae7080c00030375221336293b1ad2080e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1ab4080e0c00032e3b1aab080c00032b3b1aa3080c00032d3b1a9b080c0003302c2e2c2e6805221f1aa4080e0c0002503c28401aa1081aa6080e0e0e0c000428122a220d2d1aa708680529220f69270e0fd033282b1a67080c000307d122143a221523062216230a2217230e2218230f2b3b1a42080e0e0e0c00032e3b1a37080c00032b3b1a2f080c00032d3b1a27080c0003302c2e2c2e68051a5a081a5f081a64080202ec070e0c0003291a60080e0c00023b3e3b3b2d6805291a59080e0e0c000203041a5708103b503b503c3b2b2f6b2222382223230c2a3b3c1a48080e0c0004502b2a0e0e0c000250222336293b1ac3070c000322253a222623062227230a2228230e2229230f2b3b1aa8070e0c00032e3b1a9f070c00032b3b1a970702026f070c00032d3b1a8b07020236000c0003302c2e2c2e6805222f1a90070e0c0002503c28401a8d071a92070e0e0e0c000428122a220d2d1ad307680529221f69271e0fcc33281e1a53070c00030375221336293b1a3e070e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1a20070e0c00032e3b1a17070c00032b3b1a0f070c00032d3b1a07070c0003302c2e2c2e6805221f1a10070e0c0002503c28401a0d071a12070e0e0e0c000428122a220d2d1a5b07680529220f69270e0fd13328341ad3060c00030379221336293b1abe060e0e0e0c000322153a221623062217230a2218230e2219230f2b3b1aa0060e0c00032e3b1a97060c00032b3b1a8f060c00032d3b1a870602025f060c0003302c2e2c2e6805221f1a8c060e0c0002503c28401a89061a8e060e0e0e0c000428122a220d2d1adf06680529220f69270e0fd03328201a4f060c000307d122141a55060e0e0c000222153a2216230e2a3b1a2c060e0c00032a3b1a23060c0003221937221a23092a3b1a14060e0c00032a3b1a0b060c00032928291a0a060202da050e0e0e0c00031a05060e0e0c000203032902012a29282e1aec050e0c0003031e221e1af1050e0e0c000222133122113222116805281b2a69292b69660fcc1a4d06221f690403002a2a1a4a060e0e0e0c00035029360402003b2a222422262e2225222722261a36060e0e0e0c00095029352a3622243a2225230e2a3b1a7f05020257050c00032a3b1a7305020294000c0003221c2b221a2c221a6805222937222a23092a3b1a56050e0e0e0c00032a3b1a4b050c00032928291a4a050e0e0e0c00031a49050e0e0c000203032902012a29282e1a30050e0c00032705030a22291a33050c00020217282e1ab9050e0e0c000229222b1ab6050e0e0e0c0003643c28401a19051a1e05020213000e0e0e0c0004280f322b332f6805292d69270e270a0fd53328211add040e0e0c000307ca22141ae1040e0e0c0002221537221623092a3b1ab8040e0c00032a3b1aaf040c00032928291aae040e0e0e0c00031aad040e0e0c000203032902012a29282f1a94040e0c0003032c221a3a221b230e2a3b1a7a040e0e0e0c00032a3b1a6f040c000322122b22102c22106805281b2a6927050fca1a0f05221c690402002219221d2c2c221f221f0c0006502935221d37221e23092a3b1a35040e0e0c00032a3b1a2b040c00032928291a2a040e0e0e0c00031a29040e0e0c000203032902012a29280b1a10040204e00322010e0e0e0c0003035c22221a0d040e0e0c00023b222522232225222422281aa2040e0e0e0c0007302a6922253a2226230e2a3b1acd030e0e0c00032a3b1ac3030c0003221d2b221b2c221b68053c28401ad0031ad5030e0e0c00042819302b2d6b2709022f22223a2223230e2a3b1a9203020221000e0e0e0c00032a3b1a83030c0003221a2b22182c221868052816342b6a27052708221b3a221c230e2a3b1a61030e0e0c00032a3b1a57030c000322132b22112c22116805222037222123092a3b1a3e030e0e0e0c00032a3b1a33030c00032928291a32030e0e0e0c00031a31030e0e0c000203032902012a29282f1a18030e0c00032705030a22201a1b030c00020217282f1aa1030e0e0c00022922221a9e030e0e0e0c0003642f2b69270d0fca33281f1ae2020e0e0e0c000307cd22141ae5020e0e0c0002221537221623092a3b1abc020e0c00032a3b1ab3020c00032928291ab2020e0e0e0c00031ab1020e0e0c000203032902012a29282d1a98020e0c000303033b02133b221c221a221c221b221f1a41030e0e0c0007221b3a221c230e2a3b1a68020e0c00032a3b1a5f020c000322132b22112c22116805222037222123092a3b1a46020e0e0e0c00032a3b1a3b020c00032928291a3a020e0e0e0c00031a39020e0e0c000203032902012a29282d1a20020202f0010e0c00032705030e22201a1f02020238000c00020217282d1aa1020e0e0c00022922221a9e020e0e0e0c0003643c28401a01021a06020e0e0e0c000428112a322e6b292d69270f0fdd33283c1acd010e0e0c0003031522141ad1010e0e0c000250281e2a69292b69640fcd221437221523092a3b1a9d010e0e0c00032a3b1a93010c00032928291a92010e0e0e0c00031a91010e0e0c000203032902012a2928261a78010e0c000303033c021b2928061a69010e0e0c000303033c020b2928181a59010e0e0c0003270503c0221437221523092a3b1a3c010e0c00032a3b1a33010c00032928291a32010e0e0e0c00031a31010e0e0c000203032902012a2928261a18010e0c000329030b221a1a1c010e0c000202013b221835221936221a370402002c0202c8002c2c222222241ab30134301ab6010202b6000e0e0e0c00095029352a363c28401ae9001aee000e0e0e0c00043c28401a9a011adf000c00043c28401a96011ad3000c00042d2b2d2f2d6805280e2a692e362f38221c2b221a2c221a68052c2a69271502641a750122151a30010e0c000350221437221523092a3b1a6f000c00032a3b1a67000c00032928291a66000e0e0e0c00031a65000e0e0c000203032902012a29221b0c00021a51000e0e0c00022705030d22141a4b000c0002501e4c02023b501a1e012a69270f1f050000000000000000b8090000000000000000000000000000|@6414,I253,I251,I218,@5814,@588,I11,@6415,@6419,@6421,@5823,@5826,@6012,I105,@1363,I255,@6422,@6424,@6426,@6428,@6133,@6430,@6035,@6009,@6447,@6448,@6452,@6038,@6456,@6380,@6413,@6407,@3335| 6413:O1|@6460 6414:S55|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129 6415:O7|@6417,2,@424,@6416,@423,0,0 6416:O3|2,@500,@6418 6417:S8|636f6e76576f7264 6418:O3|6,@14439,79992 6419:O7|@6420,2,@424,@6416,@423,0,0 6420:S8|636f6e7643686172 6421:S38|5265616c20636f6e7374616e7473206e6f7420616c6c6f77656420696e207061747465726e73 6422:O7|@6423,2,@424,@6416,@423,0,0 6423:S8|636f6e765265616c 6424:O7|@6425,2,@424,@6416,@423,0,0 6425:S7|636f6e76496e74 6426:O7|@6427,2,@424,@6416,@423,0,0 6427:S10|636f6e76537472696e67 6428:D10,128|00821a83002e1a87000c0003291a88001a7d000e0e0c0003291a84001a89000e0e0c0003291a88000e0c00023b3e3b3b2d6805291a81000e0e0c000203041a7f00103b503c3b2b346b5667385677230c2a3b3c1a72000e0e0e0c0004502b2a347d0d00020e0e0e0e000000000000000070000000000000000000000000000000|@6429,@6132,@122,@6130,@5823,@5826,@6012,I105,@1363,I255| 6429:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831297265706f7274447570283329 6430:O1|@6431 6431:D29,800|008730373123092a3b1a1c030e0c00032a3b1a13030c00032928291a12030e0e0e0c00031a11030e0e0c000203032902012a2928391af8020e0c00030319220c1afd020e0e0c0002501afc02220e2a35452a3646640fd11af602220c691af802220d6929220f1af7020c000329352a362a2a6922100c0002221237221323092a3b1aa4020e0c00032a3b1a9b020c00032928291a9a020e0e0e0c00031a99020e0e0c000203032902012a0402002a28111a7d020e0e0c0003031d22181a81020e0e0c00025022132219220d2c2218221a0e0c0006500fd0311a8d020e0e0c00023b2a1a8b020c000364038f311a79020e0e0c00023b2a1a7f020c00036403041a7e02103b503b50311a7d020e0e0c0002030331020b3128081a75020e0e0c00032928311a72020202d4010e0e0e0c0003640344311a31020e0e0c00023b2a1a37020c00036403041a3602103b503b50311a35020e0e0c0002030331020b3128081a2d020e0e0c00032928391a32020e0e0e0c00036402013b02013b038f22183a22192306221a230a221b230e221c230f2b3b1a93010c00032e3b1a8b010c00032b3b1a83010202ad000c00032d3b1a77010c0003302c2e2c2e68051aea011aef011af4010e0c0003291af4010e0c00023b3e3b3b2d6805291aad010e0e0c000203041ae301103b503b503c3b2b2f6b2226382227230c2a3b3c1ad4010e0c0004502b2a0e0e0c0002261102023b503c28401ac4011ac9010e0e0c00043c28401ac6011abb010c00043c28401ac2011aaf010c0004342b2d220d2d6805280e2a6922102a220e31221d221d222322211aa7010c0009260629352a363235333734392c362d382d2b2e2c2f68053c28401a67011a6c010e0c000422112a2212342e6805222237222323092a3b1a9b000c00032a3b1a93000c00032928291a92000e0e0e0c00031a91000e0e0c000203032902012a29280b1a78000e0c0003033422271a7d000e0e0c00020402003b2a222b222b222b222b222b222b1a24010e0c00095029352a36322a69222d2c452a462705020a2e3b6922293c452a4664271b27051f080e0e0e0e0e0e000000000000000010030000000000000000000000000000|@6433,I253,I251,I218,@5814,@473,@6434,@6435,@6157,I223,I234,I231,@70,I105,I252,I28,I29,@6436,@5823,@5826,@6012,@1363,I255,@588,I11,@6380,@6437,@6432,@6430| 6432:O1|@6439 6433:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831296765744c6162656c73283129 6434:D2,72|00802b282e1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6435:D2,88|00802b28111a58000e0c000303033c02272b282e1a49000e0e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6436:S35|203d20706174206578706563746564206166746572206e756d65726963206c6162656c 6437:O1|@6438 6438:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6439:D14,368|0087313529280e1a6e010e0e0e0c00031a6d01220c69040200312b220e220e2d220e1a63010c00075029352a3632373323092a3b1a59010e0e0c00032a3b1a4f010c00032928291a2e010e0e0e0c00031a45010e0e0c000203032902012a2928051a14010e0c000307dd220e1a31010e0e0c0002331a20010e0c0002038e220f3a221023062211230a2212230e2213230f2b3b1afa000e0e0e0c00032e3b1aef000c00032b3b1ae7000c00032d3b1adf000c0003302c2e2c2e68051aea001aef001af4000e0c0003291af4000e0c00023b3e3b3b2d6805291aed000e0e0c000203041aeb00103b503b503c3b2b2f6b221d38221e230c2a3b3c1adc000e0c0004502b2a0e0e0c0002271002013b0402002212221222192c221722150e0e0c00065029352a362217352218372219392c362d382d2b2e2c2f680528102212322c6b221d2a452b0202050046270c0206221130452f46270b1f08000000000000000060010000000000000000000000000000|@6441,I251,@6442,@6443,I253,I218,@5814,@6440,@5823,@5826,@6012,I105,@1363,I255| 6440:S32|4578706563746564206964206f722069643a7479206265666f72652060617327 6441:S61|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329636f6e73747261696e744f724c617965726564283329 6442:D2,56|00802b28051a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6443:O1|@6444 6444:D8,184|008530372c372d23092a3b1ab2000e0e0e0c00032a3b1aa7000c00032928291aa6000e0e0e0c00031aa5000e0e0c000203032902012a2928091a8c000e0c00030352311a92000e0e0e0c00021a9100220e690402002a220c332c1a8b000c00055029352a36220f352210372211392c362d382d2b2e2c2f680528053122182c6b221922192b2d221922191a6300221a7b081a000732220c45344627061f060e0e0000000000000000a8000000000000000000000000000000|@6446,I253,I251,I218,@5814,@6445,@6102,@6443| 6445:D2,56|00802b28091a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6446:S42|50415253455f44454328292e7061727365446563283329646563283429636f6e73747261696e74283429 6447:D2,72|00802b280b1a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6448:O1|@6449 6449:D7,152|00851a9b0030690402002e2e2c2c33220c0c00065029352e372f23092a3b1a87000c00032a3b1a7f000c00032928291a7e000e0e0e0c00031a7d000e0e0c000203032902012a29280b1a64000e0c00030324331a6a000e0e0e0c0002503b220f220f220f220f220f1a5d000e0e0c00072f2a696402032e3b6927081f060e0e0e000000000000000088000000000000000000000000000000|@6451,@6450,I253,I251,I218,@5814,@6448| 6450:D2,72|00802b280b1a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6451:S66|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d7475706c6573283129 6452:O1|@6453 6453:D7,152|00851a9b0030690402002e2e2c2c33220c0c00065029352e372f23092a3b1a87000c00032a3b1a7f000c00032928291a7e000e0e0e0c00031a7d000e0e0c000203032902012a29280b1a64000e0c00030324331a6a000e0e0e0c0002503b220f220f220f220f220f1a5d000e0e0c00072f2a696402032e3b6927081f060e0e0e000000000000000088000000000000000000000000000000|@6455,@6454,I253,I251,I218,@5814,@6452| 6454:D2,72|00802b282d1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6455:S68|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d766172734c697374283129 6456:O1|@6457 6457:D11,224|00872d2f311ae0000e0c000429352a362a220c0e0e0c0002291ad4000e0c00021ad5000e0e0c000203212935293629353c1acc000e0c000303033c020b29353b1abd000e0e0c00036502013b29030b311aa5000e0e0c000202013b035728282d1aa5000e0e0c0003291aa4001a99000e0e0c0003291aa0001aa5000e0e0c0003291aa4000e0c00023b3e3b3b2d6805291a5d000e0e0c000203041a9300103b503b3b2b336b2211230c2a2a0e0e0c0002260802023b502d312a35452a364627061f080e0e0e0e0e0e0000000000000000d0000000000000000000000000000000|@6459,@6040,I105,I218,I251,@122,@6458,@5823,@5826,@6242,@1363| 6458:S46|292068617320696e666978207374617475732062757420776173206e6f74207072656365646564206279206f702e 6459:S41|50415253455f44454328292e70617273654465632833296765744c6f6e674e6f6e496e666978283729 6460:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6461:O1|@6462 6462:D2,248|00802b28261af8000e0c000303033c02cb2b28201ae9000e0e0c000303033c02bb2b281f1ad9000e0e0c000303033c02ab2b28211ac9000e0e0c000303033c029b2b28081ab9000e0e0c000303033c025b2b28431aa9000e0e0c000303033c024b2b282b1a99000e0e0c000303033c023b2b281e1a89000e0e0c000303033c022b2b28341a79000e0e0c000303033c021b2b28061a69000e0e0c000303033c020b2b28181a59000e0e0c000303033c022b2b28061a49000e0e0c000303033c020b2b28181a39000e0e0c000303033c020b2b283c1a29002d7e030003420e0e0e0000000000000000e8000000000000000000000000000000|@6006,I251| 6463:O1|@6464 6464:D6,128|00880404003b2a313134220d3222111a76000e0e0e0c00095029352a362b372c38293b1a6a000e0e0e0c0003030b2b322a35452a36466402291a5c003b1a60002f2f2f2f22112211221422162212221a1a55000e0e0c000e2936332a35452a36466527051f090e0e000000000000000070000000000000000000000000000000|@6466,@6467,I234,-1,@6042,@6465| 6465:O1|@6478 6466:S42|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729 6467:O1|@6468 6468:D11,312|00871a3b0130326a1a3d0131316a0402002a2a320e0c00035029352a360402002b2b302c220d22102213220f22121a1f010c000a5029352a362a2a69040300220d37220e23092a3b1a0d010e0e0c00032a3b1a03010c00032928291a02010e0e0e0c00031a01010e0e0c000203032902012a2922170c00022705033922112211220f1aeb000c000429352a362a22100e0e0c0002293b1ac7000c000303041ad700103b503b50293529362f2e452d462a472607020e1ac8002a2a35452a36462a37475129352a362b370402002a353d1a8e000e0e0e0c0003030d1aab002a2a35452a364651021d2a353c1a73000c0003030a2a362a2a453c465102082a362a2a453b465129352a362e2e6922192b4532462a472c4827111f080e0e0e0e0e0e0e000000000000000028010000000000000000000000000000|@6470,@6471,@6472,@6473,I253,I251,I218,@6040,@1792,@6477,@6469| 6469:O2|-1,0 6470:S56|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729726561644e6578744f7073283129 6471:D1,48|00802b56180c000203033c02072b56172c800002420e0e0e000000000000000020000000000000000000000000000000|@6006| 6472:D2,64|00802b56180c000203033c020b2b28261a35000e0e0c000303033c02072b56172c800002420e0e0e000000000000000030000000000000000000000000000000|@6006,I251| 6473:O1|@6474 6474:D9,344|00882f373023092a3b1a54010e0c00032a3b1a4b010c00032928291a4a010e0e0e0c00031a49010e0e0c000203032902012a29340e0c0002270507dd2f373023092a3b1a1a010e0e0e0c00032a3b1a0f010c00032928291a0e010e0e0e0c00031a0d010e0e0c000203032902012a29330e0c00022705034b2f36293b1ae1000e0e0c0003642d0e0e0e0c0002291ae8000e0c00021ad9000e0e0c000203212935293629353c1ac0000e0c000303033c020b29353b1ab1000e0e0c00036502013b6402013b0307303445334602631ab00032306a0402002a2a2f0c00035029352a36220d35220e37220f392c362d382d2b2e2c2f68053c28401a8d001a92000e0e0e0c00042215322b3b2e68053d2a69292d2217221722170202170022172217221722171a720022180e0e0e7b0b18000a020530344533461f090e0e0e0e0e0e0e000000000000000048010000000000000000000000000000|@6476,I253,I251,I218,I105,@6475,@588,I11,@6473| 6475:D1,48|00802b56180c000203033c02072b56172c800002420e0e0e000000000000000020000000000000000000000000000000|@6006| 6476:S61|50415253455f44454328292e70617273654465632833296465632834297061727365496e66697828372970617273654170706c69636174696f6e283329 6477:O3|I48,@6045,@836 6478:D10,416|008c0404003b2a3333333333331a98010e0c00095029352a362b372c382c2c2c2c6b2211221022106a292b220c1a80010e0c00042c22111a7e010e0e0e0c000303033c02122213030d2c22111a71010e0e0c000302013b0321221022142213323232322216221622162216221622161a56010e0e0e0c000e02012b2212352213363c28401a49011a4e010e0e0e0c00043c28401a4a011a3f010c00043c28401a46011a33010c00042d2b2d2f2d6805280e2a69221a36313629362b352c372d392c362d382d2b2e2c2f68052223352211362935293b692c2a693c28401af1001af6000e0e0e0c000428192b2b326b3c28401adc001ae1000e0e0c000422112b2b3c220c68053d2a69293469221b37221c38221d35292d2d2d6b2235223522386a292221222e1a88000e0c0004502220382922391a82000e0e0e0c00036403033c02162220382922391a75000e0e0c0003640304223602013b03222237223722372e3232322237223722372237223722371a550022380e0e7b0f38000e2a27291f0d0e0e0e0e0e0e0e000000000000000090010000000000000000000000000000|@6480,@6467,@6481,I233,I113,@6465,@588,I11,@6380,@6479| 6479:O1|@6493 6480:S54|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729 6481:O1|@6482 6482:D23,320|00822d372d382a2a1a3d010e0e0c00036503172d352d352a2a1a34010e0c0003651a34010e0c000202013b07dd2b3a2c23062d230a2e230e2f230f2b3b1a20010e0c00032e3b1a17010c00032b3b1a0f010c00032d3b1a07010c0003302c2e2c2e6805220e362935220f372935221236293522143503051aee0002031af100221437293522163503051aec0002031aef00291af300691af7002a692c2a691af7002a69302a691af7002a69332a691af7002a69220e2a691af6002a6922122a691af5002a6927151af6000e0e0e0c0002291af4001af9000e0e0c0003291af8000e0c00023b3e3b3b2d6805291af1000e0e0c000203041aef00103b503b503c3b2b306b221138221202021800230c2a3b3c1adc000e0c0004502b2a22140e0e0e7d1600023b440e0e000000000000000030010000000000000000000000000000|@6484,I113,I251,I218,I253,@6485,@6486,@6485,@6486,@6487,@6489,@6490,@6489,@6491,@6492,@6483,@104,@5823,@5826,@6012,I105,@1363,I255| 6483:S11|4f70657261746f72732022 6484:S75|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729636865636b4173736f636961746976697479283229 6485:S5|7269676874 6486:S4|6c656674 6487:O2|@6488,0 6488:S13|2d6173736f636961746976652e 6489:S5|2220697320 6490:S20|2d6173736f63696174697665207768696c652022 6491:S32|222068617665207468652073616d6520707265636564656e6365206275742022 6492:S7|2220616e642022 6493:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6494:O1|@6495 6495:D19,1088|00812c353d1a40040e0c000303200404002d2a2e1a39040e0e0c00045029352a362b372c382c2c2c2c6b27050fd92c3528161a13040c000307cf2c3629353d1a06040e0e0e0c000303200404002e2a2f1afd030e0e0c00045029352a362b372c382c2c2c2c6b27050fd02c3a2d23062e230a2f230e30230f2b3b1adb030c00032e3b1ad3030c00032b3b1acb030c00032d3b1ac3030c0003302c2e2c2e68051abe031ac3031ac8030e0c0003291ac8030e0c00023b3e3b3b2d6805291ac1030e0e0c000203041abf03103b503c3b2b2f6b2211382212230c2a3b3c1ab2030e0e0e0c0004502b2a0e0e0c00025022133a221423062215230a2216230e2217230f2b3b1a53030204e30256000e0e0c00032e3b1a43030c00032b3b1a3b030c00032d3b1a33030c0003302c2e2c2e68053c28401a63031a6803020222000e0c00041a65032a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b2721640fd02c3528051ae0020e0c000307dc2c362d37293528161acf020c000307d9293629353d1ac2020e0e0e0c000303210404002b2a311ab9020e0e0c00045029352a362b372f68012c2c2c2c6b27050fd72e3a2f230630230a31230e32230f2b3b1a96020e0e0e0c00032e3b1a8b020c00032b3b1a83020c00032d3b1a7b020c0003302c2e2c2e68051ac6021a7b021a80020e0c0003291a80020e0c00023b3e3b3b2d6805291a79020e0e0c000203041a7702103b503c3b2b2f6b2213382214230c2a3b3c1a6a020e0e0e0c0004502b2a0202b9010e0e0c00025022153a221623062217230a2218230e020285012219230f2b3b1a0302020254000c00032e3b1af7010c00032b3b1aef010c00032d3b1ae7010c0003302c2e2c2e68053c28401a17021a1c02020222000e0c00041a19022a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b2721640fce29353d1a95010e0e0c000303210404002a2a301a8d010e0e0c00045029352a362b372e68012c2c2c2c6b27050fcf2d3a2e23062f230a30230e31230f2b3b1a6a010e0e0e0c00032e3b1a5f010c00032b3b1a57010c00032d3b1a4f010c0003302c2e2c2e68051aa2011a4f011a54010e0c0003291a54010e0c00023b3e3b3b2d6805291a4d010e0e0c000203041a4b01103b503c3b2b2f6b2212382213230c2a3b3c1a3e010e0e0e0c0004502b2a0e0e0c00025022143a221523062216230a2217230e2218230f2b3b1adf00020251000c00032e3b1ad3000c00032b3b1acb000c00032d3b1ac3000c0003302c2e2c2e68053c28401af3001af800020222000e0c00041af5002a2c6a29352a362b376a29352a362b372b2b2b6a3b2a3b3b6b272165021b040400292d1ae7000c00035029352a362b372c382c2c2c2c6b270529352a3629353b2c291a88000e0c00021ac9000e0e0c0002031729362b3c1ac3000c0003292b25042504511e233b6502012a652d2b2b6a2705430e0e000000000000000030040000000000000000000000000000|@6497,I251,@6498,I253,@6500,@5823,@5826,@6012,I105,@1363,I255,@588,I11,I48,@6500,@6500,@6496,I218,I106| 6496:O1|@6506 6497:S28|50415253455f5452454528292e6d6b46756e5061747465726e283229 6498:O1|@6499 6499:D19,1040|00822d3528161a0f040c000307dd2d362e372a353d1a00040e0c000303212a3629352935280e1aef030c0003030d2a38293c1ae3030c00036402013b6502013b032f2a362935293629352a382d363c28401acc031ad1030e0e0c00042c2a2d6a2b3b69220e2a452b463c473b48270902821abc031ac1031ac6030e0e0e0c0003291ac4030e0c00023b3e3b3b2d6805291abd030e0e0c000203041abb03103b503c3b2b2f6b313832230c2a3b3c1ab0030e0c0004502b2a0e0e0c0002503c28401a5d031a62030e0e0e0c00041a99032a326a29352a362b376a29352a362b372b2b2b6a22123b452a46020209003b473b48270d650fd72d35280e1a1b030c000303232d3629352a383c28401a12031a17030c00042b2a2c6a313b452a463b473b4827050fca2d353d1aed020e0e0c000307d52d3629352a362b38293c1ad9020e0e0c0003035f2a3528191acb020c000303502a36291af8020e0c00021a11030e0e0c0002033829352a36291ae2020e0e0e0c00021af9020e0e0c0002031c2936293b1a93020c0003030c2b353d1a88020e0c000302013b6402013b6502013b6402013b02013b03582a381acb021a88021a8d020e0e0c0003291a8c020e0c00023b3e3b3b2d6805291a8502020224020e0e0c000203041a7f02103b503c3b2b2f6b3438220c230c2a3b3c1a7302020202020c0004502b2a0e0e0c0002270702c1293c1a13020202f9000c0003035f2a3528191a03020c000303502a36291a30020e0c00021a49020e0e0c000203382936291a1c020e0c00021a35020e0e0c0002032029352a36293b1acd010e0e0c0003030c2a353d1ac0010e0c000302013b6502013b6402013b6402013b02013b03502a381a0b021ac0011ac5010e0e0c0003291ac4010e0c00023b3e3b3b2d6805291abd010e0e0c000203041abb01103b503c3b2b2f6b3438220c230c2a3b3c1aaf010c0004502b2a0e0e0c0002270702013b0404002d2a331abe010e0e0e0c00045029352a362b372f3b69293b1a39010e0e0c000303032c020b2c2a1aa2010e0e0e0c0003220e2a452d462c473b48270b0fdd2b3a2c23062d230a2e230e2f230f2b3b1a83010c00032e3b1a7b010c00032b3b1a73010c00032d3b1a6b010c0003302c2e2c2e68051a66011afb001a00010e0c0003291a00010e0c00023b3e3b3b2d6805291af9000e0e0c000203041af700103b503c3b2b2f6b2210382211230c2a3b3c1aea000e0e0e0c0004502b2a0e0e0c00025022123a221323062214230a2215230e2216230f2b3b1afb000c00032e3b1af3000c00032b3b1aeb000c00032d3b1ae3000c0003302c2e2c2e68053c28401a5b001a60000e0c00041a99002a2c6a29352a362b376a29352a36020212002b372b2b2b6a22243b452a463b473b482721440e0e0e0e000000000000000000040000000000000000000000000000|@6501,I251,@588,I11,@6502,@5823,@5826,@6012,I105,@1363,I255,I48,I218,@6503,@6503,@6498,@6504,I253,@6500| 6500:S79|53796e746178206572726f723a2066756e2062696e64696e67206973206e6f7420616e206964656e746966696572206170706c69656420746f206f6e65206f72206d6f7265207061747465726e732e 6501:S37|50415253455f5452454528292e6d6b46756e5061747465726e283229756e7069636b283129 6502:S70|506172656e74686573657320617265206f6e6c7920616c6c6f77656420666f7220696e6669786564206170706c69636174696f6e7320696e2066756e2062696e64696e67732e 6503:S63|436f6e7374727563746f72206170706c69636174696f6e7320696e2066756e2062696e64696e6773206d75737420626520706172656e74686573697365642e 6504:O1|@6505 6505:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6504| 6506:D12,264|00812b3a2c23062d230a2e230e2f230f2b3b1afb000c00032e3b1af3000c00032b3b1aeb000c00032d3b1ae3000c0003302c2e2c2e68051ade001ae3001ae8000e0c0003291ae8000e0c00023b3e3b3b2d6805291ae1000e0e0c000203041adf00103b503c3b2b2f6b2210382211230c2a3b3c1ad2000e0e0e0c0004502b2a0e0e0c00025022123a221323062214230a2215230e2216230f2b3b1a73000c00032e3b1a6b000c00032b3b1a63000c00032d3b1a5b000c0003302c2e2c2e68053c28401a8b001a90000e0c00041a91002a2c6a29352a362b376a29352a362b372b2b2b6a22243b452a463b473b482721430000000000000000f8000000000000000000000000000000|@6507,I253,@6500,@5823,@5826,@6012,I105,@1363,I255,@588,I11,I48| 6507:S49|50415253455f5452454528292e6d6b46756e5061747465726e283229617267737c6e616d657c756e7069636b65642d2f35 6508:S31|5468697320636c6175736520646566696e65732066756e6374696f6e206060 6509:S36|2727206275742070726576696f757320636c6175736528732920646566696e6564206060 6510:S16|5468697320636c617573652068617320 6511:S38|20617267756d656e7473206275742070726576696f757320636c617573652873292068616420 6512:D2,56|00802b283e1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6513:D12,1512|00862e372f23092a3b1ae4050e0c00032a3b1adb050c00032928291ada050e0e0e0c00031ad9050e0e0c000203032902012a2928171ac0050e0c000303033c0fd82928081ab1050e0e0c000303033c025b2928431aa1050e0e0c000303033c024b29282b1a91050e0e0c000303033c023b29281e1a81050e0e0c000303033c022b2928341a71050e0e0c000303033c021b2928061a61050e0e0c000303033c020b2928181a51050e0e0c000303033c027f2928111a41050e0e0c000303033c021b2928061a31050e0e0c000303033c020b2928181a21050e0e0c000303033c024f2928201a11050e0e0c000303033c023f2928211a01050e0e0c000303033c022f29281f1af1040e0e0c000303033c021f2928261ae104020215000e0e0c000303033c020b2928221acd040e0e0c000303033c024b2928131abd040e0e0c000303033c023b2928071aad040e0e0c000303033c022b2928401a9d040e0e0c000303033c021b2928191a8d040e0e0c000303033c020b29282a1a7d040e0e0c00031a7d040e0e0c0002270507d11a79042f1a7d040e0e0c0003502e372f23092a3b1a4d040e0e0c00032a3b1a43040c00032928291a42040e0e0e0c00031a41040e0e0c000203032902012a29220d0c000203033c0fcc2928171a1d040e0e0c000303033c0fd02928081a0d040e0e0c000303033c025b2928431afd030e0e0c000303033c024b29282b1aed030e0e0c000303033c023b29281e1add030e0e0c000303033c022b2928341acd030e0e0c000303033c021b2928061abd030e0e0c000303033c020b2928181aad030e0e0c000303033c02872928111a9d030202eb000e0e0c000303033c021b2928061a89030e0e0c000303033c020b2928181a79030e0e0c000303033c02532928201a69030e0e0c000303033c02432928211a5903020289000e0e0c000303033c022f29281f1a4503020225000e0e0c000303033c021b2928261a31030e0e0c000303033c020b2928221a21030e0e0c000303033c024b2928131a11030e0e0c000303033c023b2928071a01030e0e0c000303033c022b2928401af1020e0e0c000303033c021b2928191ae1020e0e0c000303033c020b29282a1ad1020e0e0c00031ad1020e0e0c00022705030e2e1adc020e0c00025020a80102023b5002023b502e372f23092a3b1a9a020e0e0e0c00032a3b1a8f020c00032928291a8e020e0e0e0c00031a8d020e0e0c000203032902012a2928171a74020e0c000303033c0fd82928081a65020e0e0c000303033c025b2928431a55020e0e0c000303033c024b29282b1a45020e0e0c000303033c023b29281e1a35020e0e0c000303033c022b2928341a25020e0e0c000303033c021b2928061a15020e0e0c000303033c020b2928181a05020e0e0c000303033c027f2928111af5010e0e0c000303033c021b2928061ae5010e0e0c000303033c020b2928181ad5010e0e0c000303033c024f2928201ac5010e0e0c000303033c023f2928211ab5010e0e0c000303033c022f29281f1aa5010e0e0c000303033c021f2928261a9501020215000e0e0c000303033c020b2928221a81010e0e0c000303033c024b2928131a71010e0e0c000303033c023b2928071a61010e0e0c000303033c022b2928401a51010e0e0c000303033c021b2928191a41010e0e0c000303033c020b29282a1a31010e0e0c0003270503b71a4d0131690402002a2a32220d1a48013434341a4a010e0e0e0c00095029352a3632373323092a3b1af5000e0e0c00032a3b1aeb000c00032928291aea000e0e0e0c00031ae9000e0e0c000203032902012a2928161ad0000e0c0003034f220e1ae5000e0e0c000204020022122a221222161ae3002214221422141aea000e0e0e0c00095029352a363235333734392c362d382d2b2e2c2f6805280d2211322c336805221a2a452b46270b0206220f30452f46270902422e3a2f230630230a31230e32230f2b3b1a56000e0e0e0c00032e3b1a4b000c00032b3b1a43000c00032d3b1a3b000c0003302c2e2c2e680522101a7c00452a46270a1f070e0e0e0e0e0000000000000000d8050000000000000000000000000000|@6515,I253,I251,I218,@6516,@6009,@5814,@6517,@6400,@6518,@6514,@3335| 6514:O1|@6578 6515:S42|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e283229 6516:S10|45787072657373696f6e 6517:D2,56|00802b28161a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6518:O1|@6519 6519:D2,48|008731333232323232321a2b00330e7b0a0a00090e0e0e0e000000000000000020000000000000000000000000000000|@6521,@6520| 6520:O1|@6522 6521:S56|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c7365283129 6522:D8,200|00871acb0032690402002a2a3434343434341ac3000c00095029352a363437220c23092a3b1ab8000e0c00032a3b1aaf000c00032928291aae000e0e0e0c00031aad000e0e0c000203032902012a2928281a94000e0c0003034922101a99000e0e0c00020402002922142214221422142214221422141a87000c00095029352a363235333734392c362d382d2b2e2c2f680528152211322c6b221d2a452b46270b0206221230452f4627091f080e0e0e0000000000000000b8000000000000000000000000000000|@6524,@6525,@6523,I253,I251,I218,@5814,@6520| 6523:O1|@6526 6524:S58|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c73652831292829 6525:D2,56|00802b28281a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6526:D2,48|008731333232323232321a2b00330e7b0a0a00090e0e0e0e000000000000000020000000000000000000000000000000|@6528,@6527| 6527:O1|@6529 6528:S57|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f283129 6529:D8,200|00871acb0032690402002a2a3434343434341ac3000c00095029352a363437220c23092a3b1ab8000e0c00032a3b1aaf000c00032928291aae000e0e0e0c00031aad000e0e0c000203032902012a293e1a95000e0e0c0003034822101a99000e0e0c00020402002922142214221422142214221422141a87000c00095029352a363235333734392c362d382d2b2e2c2f68053c2211322c6b221d2a452b46270b0206221230452f4627091f080e0e0e0e0000000000000000b8000000000000000000000000000000|@6531,@6532,@6530,I253,I251,I218,@5814,@6527| 6530:O1|@6533 6531:S59|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f2831292829 6532:D2,56|00802b3e1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6533:D23,1256|008730373123092a3b1ae4040e0c00032a3b1adb040c00032928291ada040e0e0e0c00031ad9040e0e0c000203032902012a220c2306220d230a220e230f2a3b1aad040e0e0c00032a3b1aa3040c00032e28131aa2040e0e0e0c0003035622111aa5040e0e0c00021aa5042215690402002a2a2216221622162216221622161a96040e0e0e0c00095029352a3629362a38342b332c3468053c28401a82041a87040c0004280b2a302d6b221c2a452c46270a0fcb2e282a1a3e040e0e0e0c0003034122111a41040e0e0c0002040200221222162b221622142214221422180e0e0e0c00085029352a3629362a38332b322c33680528172e2b6a221a2a452b4627080fd72e28071aef030c000307ce22111af5030e0e0c00021a150422156904020022132b2b221722152215221522190e0e0c0008502935221537221623092a3b1aad030e0e0c00032a3b1aa3030c00032928291aa2030e0e0e0c00031aa1030e0e0c000203032902012a2928251a88030e0c00032705030e22151a8b03020247030c0002021728251aad030e0e0c00022922171aaa030e0e0e0c0003641aa8032219690402002a2a221a221a221a221a221a221a1a61030e0e0c00095029352a3629362a38220f2b220e2c220f68053c28401a4b031a50030204ec021a000e0e0e0c0004322f2b2d3168053e2a6922212a452d46270f0fd12e28401afa020e0e0e0c000307d222111afd020e0e0c00021a3d0322156904020022132b2b221722152215221522190e0e0c00085029352a36221637221723092a3b1ab3020c00032a3b1aab020c00032928291aaa020e0e0e0c00031aa9020e0e0c000203032902012a29280d1a90020e0c00032705035222161a93020c00020402002217221b2b221b221922192219221d0e0e0e0c00085029352a3629362a38220f2b220e2c220f68053c28403b1a7e020e0e0e0c0004281d2f342d2d680522202a452c4627090232280d1a71020202fd010e0e0c00022922181a6a0202021e000e0e0e0c00035022171a22020e0e0e0c00025022182c452b466427050fcf2e28191afa010e0e0e0c000307ce22111afd010e0e0c00021a450222156904020022132b2b221722152215221522190e0e0c0008502935221537221623092a3b1ab5010e0e0c00032a3b1aab010c00032928291aaa010e0e0e0c00031aa9010e0e0c000203032902012a2928371a90010e0c00032705030a22151a93010c0002021728371ab9010e0e0c00022922171ab6010e0e0e0c0003641acc0122196904020022172b2b221b221922192219221d0e0c0008502935221937221a23092a3b1a35010e0e0c00032a3b1a2b010202ff000c00032928291a260102029c000e0e0e0c00031a21010e0e0c000203032902012a29280e1a08010e0c00032705030a22191a0b010c00020217280e1a31010e0e0c000229221b1a2e010e0e0e0c000364040200221a221e2b221e221c221c221c22200e0e0c00085029352a3629362a3822122b22112c221268053c28403b1ade000e0e0e0c00043c28403b1ad1000e0e0c0004220d30342e2d2f68063f2a6922252a452e46271302561af3002214692211352212362213370402002c2c2c1ae600221a221a221922192219221d68071add001ae2003330221e1ae3000c000a5029352a361ae000221b6922182a2d2d221e221e1ad900221a0e0e7b081c0007270a1f080e0e0e0e0000000000000000d8040000000000000000000000000000|@6535,I253,I251,I218,@5814,@6536,@6514,@588,I11,@6537,@6035,@6009,@6538,@6539,@6540,@6541,@6542,@6543,@6576,@6193,@6463,@6534,@6443| 6534:D2,56|00802b3e1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6535:S55|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296b6579576f7264457870283129 6536:D2,56|00802b28301a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6537:D2,280|00802b28261a18010e0c000303033c02cb2b28201a09010e0e0c000303033c02bb2b281f1af9000e0e0c000303033c02ab2b28211ae9000e0e0c000303033c029b2b28081ad9000e0e0c000303033c025b2b28431ac9000e0e0c000303033c024b2b282b1ab9000e0e0c000303033c023b2b281e1aa9000e0e0c000303033c022b2b28341a99000e0e0c000303033c021b2b28061a89000e0e0c000303033c020b2b28181a79000e0e0c000303033c022b2b28061a69000e0e0c000303033c020b2b28181a59000e0e0c000303033c020b2b283c1a49000e0e0c000303033c020b2b28251a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000008010000000000000000000000000000|@6006,I251| 6538:D2,56|00802b28301a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6539:D2,56|00802b280d1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6540:D2,392|00802b28171a88010e0c000303033c0fd82b28081a79010e0e0c000303033c025b2b28431a69010e0e0c000303033c024b2b282b1a59010e0e0c000303033c023b2b281e1a49010e0e0c000303033c022b2b28341a39010e0e0c000303033c021b2b28061a29010e0e0c000303033c020b2b28181a19010e0e0c000303033c027f2b28111a09010e0e0c000303033c021b2b28061af9000e0e0c000303033c020b2b28181ae9000e0e0c000303033c024f2b28201ad9000e0e0c000303033c023f2b28211ac9000e0e0c000303033c022f2b281f1ab9000e0e0c000303033c021f2b28261aa900020215000e0e0c000303033c020b2b28221a95000e0e0c000303033c024b2b28131a85000e0e0c000303033c023b2b28071a75000e0e0c000303033c022b2b28401a65000e0e0c000303033c021b2b28191a55000e0e0c000303033c020b2b282a1a45000e0e0c000303033c020b2b28371a35000e0e0c000303033c02072b56172c800002420e0e0e000000000000000078010000000000000000000000000000|@6006,I251| 6541:D2,392|00802b28171a88010e0c000303033c0fd82b28081a79010e0e0c000303033c025b2b28431a69010e0e0c000303033c024b2b282b1a59010e0e0c000303033c023b2b281e1a49010e0e0c000303033c022b2b28341a39010e0e0c000303033c021b2b28061a29010e0e0c000303033c020b2b28181a19010e0e0c000303033c027f2b28111a09010e0e0c000303033c021b2b28061af9000e0e0c000303033c020b2b28181ae9000e0e0c000303033c024f2b28201ad9000e0e0c000303033c023f2b28211ac9000e0e0c000303033c022f2b281f1ab9000e0e0c000303033c021f2b28261aa900020215000e0e0c000303033c020b2b28221a95000e0e0c000303033c024b2b28131a85000e0e0c000303033c023b2b28071a75000e0e0c000303033c022b2b28401a65000e0e0c000303033c021b2b28191a55000e0e0c000303033c020b2b282a1a45000e0e0c000303033c020b2b280e1a35000e0e0c000303033c02072b56172c800002420e0e0e000000000000000078010000000000000000000000000000|@6006,I251| 6542:D2,72|00802b28091a48000e0c000303033c020b2b3e1a3a000e0e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6543:D2,64|00812c561756285639564a565b566c1a36000e0e0e0c00082c2a35452a364664430e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@6411,@6544| 6544:O1|@6545 6545:D43,3128|008630373123092a3b1a340c0e0c00032a3b1a2b0c0c00032928291a2a0c0e0e0e0c00031a290c0e0e0c000203032902012a220c2306220d230a220e230f2a3b1afd0b0e0e0c00032a3b1af30b0c00032e28221af20b0e0e0e0c000307ca22111af50b0e0e0c00022211362212370403003b2a1aea0b0e0e0e0c00035029362a371ae40b2e2b6a2b2a2f6a1ae20b221b69292b221c221b221b221b1ada0b0e0e0e0c0007221b37221c23092a3b1a900b0e0c00032a3b1a870b0c00032928291a860b0e0e0e0c00031a850b0e0e0c000203032902012a29281a1a6c0b0e0c00032705030a221b1a6f0b0c00020217281a1a8d0b0e0e0c000229221d1a8a0b0e0e0e0c0003641a880b221e6928301a880b221f1a8b0b221c322f222422232223222368081a820b020264010e0e0e0c00052935221f3a2220230e2a3b1a020b0e0e0e0c00032a3b1af70a0c000322162b22152c22166805222437222523092a3b1ade0a0e0e0e0c00032a3b1ad30a0c00032928291ad20a0e0e0e0c00031ad10a0e0e0c000203032902012a29280f1ab80a0e0c00032705030a22241abb0a0c00020217280f1ad90a0e0e0c00022922261ad60a0e0e0e0c000364222537222623092a3b1a7b0a0c00032a3b1a730a0c00032928291a720a0e0e0e0c00031a710a0e0e0c000203032902012a29222c0c00021a5d0a0e0e0c0002270503611ab10a22261a840a0e0c000350222537222623092a3b1a2b0a0c00032a3b1a230a0c00032928291a220a0e0e0e0c00031a210a0e0e0c000203032902012a29222c0c00021a0d0a0e0e0c00022705030e22251a070a0c0002501e4c3b02013b02013b341a560a0e0e0e0c0002311a540a0e0c00023c28403b1a510a0e0e0c00042a2c3b312d680528132a69293169271a0fd22e28201ab4090e0c000307c822111ab9090e0e0c000222123a2213230e2a3b1a90090e0c00032a3b1a87090c0003221637221723092a3b1a78090e0c00032a3b1a6f090c00032928291a6e090e0e0e0c00031a6d090e0e0c000203032902012a29282e1a54090e0c0003031e221b1a59090e0e0c0002220f31220e32220f6805281b2a69292b69660fd41ab509221c690403002a2a1ab2090e0e0e0c0003502936280b1a640922201aa709222322232f2220222422242224222868091a5b090c0005293522203a2221230e2a3b1ae2080204b7089a000e0c00032a3b1ad3080c000322172b22162c221768053c28401a68091a45090e0e0c0004280f3c2b322e6805222737222823092a3b1aa4080e0c00032a3b1a9b080c00032928291a9a080e0e0e0c00031a99080e0e0c000203032902012a29282e1a80080e0c00032705030a22271a83080c0002021b282e1aa1080e0e0c00022922291a9e0802020c000e0e0e0c0003642a2d69270d270a0fca2e28211a44080e0c000307cb22111a49080e0e0c000222123a2213230e2a3b1a20080e0c00032a3b1a17080c0003221637221723092a3b1a08080e0c00032a3b1aff070c00032928291afe070e0e0e0c00031afd070e0e0c000203032902012a29282f1ae4070e0c0003031e221b1ae9070e0e0c0002220f31220e32220f6805281b2a69292b69660fdd1a6508221d69040200221c2b2b2220221f221f221f221f0e0e0c0008502935221e37221f23092a3b1a8d070e0e0c00032a3b1a83070c00032928291a820702024f070e0e0e0c00031a7d070202af010e0e0c000203032902012a0402002a28301a5d070e0e0c0003037022241a61070e0e0c00021af90722276928301a910722281af4072225222a2f222d222c222c222c68081a8a070e0e0e0c00052935332a6922293a222a230e2a3b1a0b070c00032a3b1a03070c000322202b221f2c222068052e1aba070e0e0e0c0002402a2c6a220c2a452c46260d02b52a02021b01280b1adc060e0c0003037622241ae1060e0e0c00021a9107222769280b1a110722281a8c072225222a2f222d222c222c222c68081a0a070e0e0e0c00052935332a6922293a222a230e2a3b1a8b060c00032a3b1a83060c000322202b221f2c222068053c28401a18071af5060e0e0c00042819302b2d6b220c2a452c46260d022f22243a2225230e2a3b1a4c060e0c00032a3b1a43060c0003221b2b221a2c221b68052816220c2b6a2f2a452b46260729352a36222637222723092a3b1a19060e0e0c00032a3b1a0f060c00032928291a0e060e0e0e0c00031a0d060e0e0c000203032902012a29282f1af4050e0c00032705030a22261af7050c00020217282f1a15060e0e0c00022922281a12060e0e0e0c0003642b2b69270c270a0fca2e281f1abc050e0c000307cb22111ac1050e0e0c0002221237221323092a3b1a98050e0c00032a3b1a8f050c00032928291a8e050e0e0e0c00031a8d050e0e0c000203032902012a29282d1a74050e0c000327051a73050c0002032b1a3b06221469280b1aab0522151a3606221222172f221a22192219221968081aa4050e0c000529356502013b22133a2214230e2a3b1a26050e0e0e0c00032a3b1a1b050c0003332b322c336805221837221923092a3b1a05050e0e0c00032a3b1afb040c00032928291afa040202c7040e0e0e0c00031af504020256000e0e0c000203032902012a29282d1ad8040e0c00032705030a22181adb040c00020217282d1af9040e0e0c000229221a1af6040e0e0e0c0003643c28401a49051a26050e0e0e0c000428112a322e6b292d69270a0fce2e28261a8d040e0e0c000329030b22121a90040e0c000202013b221337221423092a3b1a65040e0e0c00032a3b1a5b040c00032928291a5a040e0e0e0c00031a59040e0e0c000203032902012a22183a22192306221a230a221b230e221c230f2b3b1a26040e0e0e0c00032e3b1a1b040c00032b3b1a13040c00032d3b1a0b040c0003302c2e2c2e68053328081a03040c00030384222236293b1aee030e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1ad0030e0c00032e3b1ac7030c00032b3b1abf03020294030c00032d3b1ab3030c0003302c2e2c2e6805222e1abc030e0c0002503c28401a41041a1e040e0e0e0c000428122a220d2d1a770468052223221222222212222368052a2a69270f0fd13328431a74030e0c00030380222236293b1a5e030e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a40030e0c00032e3b1a37030c00032b3b1a2f030c00032d3b1a27030c0003302c2e2c2e6805222e1a30030e0c0002503c28401ab5031a92030e0e0e0c000428122a220d2d1af30368052223221222222212222368052a2a69270f0fcd33282b1ae8020e0c00030384222236293b1ad2020e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1ab4020e0c00032e3b1aab020c00032b3b1aa302020276020c00032d3b1a97020c0003302c2e2c2e6805222e1aa0020e0c0002503c28401a25031a02030e0e0e0c000428122a220d2d1a6b0368052223221222222212222368052a2a69270f0fcd33281e1a58020e0c00030384222236293b1a42020e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a24020e0c00032e3b1a1b020202ee010c00032b3b1a0f020c00032d3b1a07020c0003302c2e2c2e6805222e1a10020e0c0002503c28401a95021a72020e0e0e0c000428122a220d2d1ae30268052223221222222212222368052a2a69270f0fcb3328341ac8010e0c00030384222236293b1ab2010e0e0e0c000322243a222523062226230a2227230e2228230f2b3b1a94010e0c00032e3b1a8b0102025e010c00032b3b1a7f010c00032d3b1a77010c0003302c2e2c2e6805222e1a80010e0c0002503c28401a05021ae2010e0e0e0c000428122a220d2d1a5b0268052223221222222212222368052a2a69270f0fdd3328171a38010e0c0003033d22221a3d010e0e0c0002222422241a31020e0e0c000329352a3629362a38221b2b221a2c221b68052d2a1a1d020202d0000e0e0c0003292b69270802c43328111aef000c000303033c021b3328061ae1000e0e0c000303033c020b3328181ad1000e0e0c000303722221352222362223370402002c2c2c2229222b1ad401221a301ad6010e0e0e0c00095029352a363c28401a3d011a1a010e0e0e0c00043c28401abe011a0b010c00043c28401aba011aff000c00042d2b2d2f2d6805280e2a692e362f3822222b22212c2222680502022e002c2a69270e022728181a8b000c00022922241a8a000e0e0e0c00035022231a4e000e0e0e0c0002501a74012b69642711270a1f070e0e0e0000000000000000280c0000000000000000000000000000|@6547,I253,I251,I218,@5814,@5990,@6548,@6549,@6364,@6035,@6009,@6550,@6148,@6551,@6069,@6552,@6370,@6372,I11,@6553,@6133,@6555,@588,@6561,@6562,@6563,@6564,@6566,@6567,@6568,@6569,@6419,@6415,@6422,@6424,@6426,@6157,@6570,@6193,@6456,@6380,@6546,@3335| 6546:O1|@6575 6547:S61|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129 6548:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6549:D2,56|00802b281a1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6550:D2,72|00802b280f1a48000e0c000303033c020b2b28301a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6551:D1,48|0081560856192d563a564b565c566d5677320e7b09040008000000000000000020000000000000000000000000000000|@6033| 6552:S21|456e64206f66206c65742065787072657373696f6e 6553:D10,128|00821a83002e1a87000c0003291a88001a7d000e0e0c0003291a84001a89000e0e0c0003291a88000e0c00023b3e3b3b2d6805291a81000e0e0c000203041a7f00103b503c3b2b346b5667385677230c2a3b3c1a72000e0e0e0c0004502b2a347d0d00020e0e0e0e000000000000000070000000000000000000000000000000|@6554,@6132,@122,@6130,@5823,@5826,@6012,I105,@1363,I255| 6554:S73|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e2831297265706f7274447570283329 6555:D2,64|00812c561756285639564a565b566c567d568e1a32000e0e0e0c000a2c2a35452a364664430e0e0e000000000000000030000000000000000000000000000000|@6033,@6556| 6556:O1|@6557 6557:D12,232|00881aeb00336929331aec000e0c000329352a362a2a69220c0c0002220d37220e23092a3b1ad8000e0c00032a3b1acf000c00032928291ace000e0e0e0c00031acd000e0e0c000203032902012a2928111ab4000e0c00032705030a220d1ab7000c0002021728111ab5000e0e0c000229220f1ab2000e0e0e0c0003641ab000221069040200332b2b221322112211221122150e0e0c00085029352a362f35303731392c362d382d2b2e2c2f68053c28401a84001a89000e0e0c0004220e2a220f342e6805292c6927121f090e0e0e0e0000000000000000d8000000000000000000000000000000|@6559,@6560,@6157,I253,I251,I218,@5814,@6035,@6009,@6558,@588,I11| 6558:D2,72|00802b282e1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6559:S72|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129676574456e747279283129 6560:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6561:D2,88|00802b280b1a58000e0c000303033c021b2b28301a49000e0e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@6006,I251| 6562:D2,72|00802b28301a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6563:D1,48|0081560856192d563a564b565c566d5677320e7b09040008000000000000000020000000000000000000000000000000|@6033| 6564:O1|@6565 6565:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203212b352c363c28403b1a4f000c00042b2a692b1a4d000e0e0c00022a2a69270502013b420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,I11,@6564| 6566:D2,72|00802b280b1a48000e0c000303033c020b2b282f1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6567:D1,48|0081560856192d563a564b565c566d5677320e7b09040008000000000000000020000000000000000000000000000000|@6033| 6568:D2,72|00802b282d1a48000e0c000303033c020b2b280b1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@6006,I251| 6569:D1,48|0081560856192d563a564b565c566d5677320e7b09040008000000000000000020000000000000000000000000000000|@6033| 6570:O1|@6571 6571:D16,264|00813c28401a08011a0d010e0e0c000428062a1a0a016a2e291a0c010e0c0002293c1a0b010c00036403033c0246291af6000e0e0e0c00023b2a1afb000c00036403041afa00103b50291afb000c0002030329020b2928081af5000e0e0c00032928301af2000e0e0e0c0003641af0000e0c00020303290221291aab000c0002293c1ae3000c00032b3c2b1ae2000e0e0e0c00046525011e7f3b64292b69293b69291ad3000c00023b2a3b6a3c28402b1a65000e0e0c00043c2a693e2e2b6a3c28401a4b001a50000e0c000428062a1a4e006a2a3b2d1aa7000c0004503d2a220c6a281822112b2d22136805270d430e0000000000000000f8000000000000000000000000000000|@6573,@588,I11,79992,I223,I232,I231,@70,I105,I252,I251,I218,I107,@5831,@6572,I255| 6572:O1|@6574 6573:S26|50415253455f5452454528292e6d6b53656c6563746f72283229 6574:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@6572| 6575:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6576:O1|@6577 6577:D2,288|00802b28171a20010e0c000303033c0fd82b28081a11010e0e0c000303033c025b2b28431a01010e0e0c000303033c024b2b282b1af1000e0e0c000303033c023b2b281e1ae1000e0e0c000303033c022b2b28341ad1000e0e0c000303033c021b2b28061ac1000e0e0c000303033c020b2b28181ab1000e0e0c000303033c027f2b28111aa1000e0e0c000303033c021b2b28061a91000e0e0c000303033c020b2b28181a81000e0e0c000303033c024f2b28201a71000e0e0c000303033c023f2b28211a61000e0e0c000303033c022f2b281f1a51000e0e0c000303033c021f2b28261a4100020215000e0e0c000303033c020b2b28221a2d002d7e030003420e0e0e0e0e0e0e000000000000000010010000000000000000000000000000|@6006,I251| 6578:D15,1240|008730373123092a3b1ad4040e0c00032a3b1acb040c00032928291aca040e0e0e0c00031ac9040e0e0c000203032902012a2928261ab0040e0c000303033c02cb2928201aa1040e0e0c000303033c02bb29281f1a91040e0e0c000303033c02ab2928211a81040e0e0c000303033c029b2928081a71040e0e0c000303033c025b2928431a61040e0e0c000303033c024b29282b1a51040e0e0c000303033c023b29281e1a41040e0e0c000303033c022b2928341a31040e0e0c000303033c021b2928061a21040e0e0c000303033c020b2928181a11040e0e0c000303033c022b2928061a01040e0e0c000303033c020b2928181af1030e0e0c000303033c020b29283c1ae1030e0e0c00031ae1030e0e0c0002270507d11add03311ae1030e0e0c00035030373123092a3b1ab1030e0e0c00032a3b1aa7030c00032928291aa6030e0e0e0c00031aa5030e0e0c000203032902012a29220f0c000203033c0fcc2928261a81030e0e0c000303033c0fd02928201a71030e0e0c000303033c02c729281f1a61030e0e0c000303033c02b72928211a51030e0e0c000303033c02a72928081a41030e0e0c000303033c025f2928431a31030e0e0c000303033c024f29282b1a21030e0e0c000303033c023f29281e1a11030e0e0c000303033c022f2928341a010302027b000e0e0c000303033c021b2928061aed020e0e0c000303033c020b2928181add020e0e0c000303033c02332928061acd020e0e0c000303033c020f2928181abd02020219000e0e0c000303033c020f29283c1aa902020205000e0e0c00031aa5020e0e0c00022705030f301ab0020e0c0002502038013b02013b02013b1aa602346904020032342c2c220e1aa0020e0c00065029352a36220c37220d23092a3b1a53020c00032a3b1a4b020c00032928291a4a020e0e0e0c00031a49020e0e0c000203032902012a2928381a30020e0c0003030c22111a45020e0e0c000202591a530222121a2e020e0e0e0c000350221137221223092a3b1afb010c00032a3b1af3010c00032928291af2010e0e0e0c00031af1010e0e0c000203032902012a2928111ad8010e0c00032705030a22111aeb010c000202013b1a020222156904020022132b2b221722152215221522190e0e0e0c00085029352a3633353437220c392c362d382d2b2e2c2f68053c28401ad3011ad8010e0c00043c28401ac6011acb010c00043c28403b1ac1010e0e0c00043322152d2d302e6806222037222123092a3b1a4f010c00032a3b1a47010c00032928291a46010e0e0e0c00031a45010e0e0c000203032902012a29283e1a2c010e0c0003033f22251a41010e0e0c000204020022292a2229222922292229222922291a5f010c00095029352a36322b692a362b3822152b22162c221768052c2a69270802072e3b6929346964222637222723092a3b1acc000e0c00032a3b1ac3000c00032928291ac2000e0e0e0c00031ac1000e0e0c000203032902012a29222e0c00021aad000e0e0c0002270503611af90022271aac000e0c000350222637222723092a3b1a7b000c00032a3b1a73000c00032928291a72000e0e0e0c00031a71000e0e0c000203032902012a29222e0c00021a5d000e0e0c00022705030d22261a67000c0002501e4c02023b5002023b502922282a35452a364627201f080e0e0e0e0000000000000000c8040000000000000000000000000000|@6580,I253,I251,I218,@6581,@6009,@5814,@6582,@6403,@5936,@6583,@1444,I11,@6514,@6579| 6579:S12|456e64206f66206d61746368 6580:S50|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296d61746368283129 6581:S5|4d61746368 6582:D2,56|00802b28381a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6583:D2,56|00802b283e1a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6584:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d04000229356442000000000000000028000000000000000000000000000000|@6393,I251| 6585:D2,56|00802b3d1a39000e0e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6586:O1|@6587 6587:D12,448|00872f373023092a3b1abc010e0c00032a3b1ab3010c00032928291ab2010e0e0e0c00031ab1010e0e0c000203032902012a29282c1a98010e0c00030326341a9e010e0e0e0c000250220e3c220e220e220e220e220e220e1a8d01220f0e0e7b0a0f00091a8901220f69040200220c220e2c2c22111a80010e0c00065029352a36220f37221023092a3b1a3b010c00032a3b1a33010c00032928291a32010e0e0e0c00031a31010e0e0c000203032902012a2928111a18010e0c00032705030a220f1a1b010c0002021728111a31010e0e0c00022922111a2e010e0e0e0c000364040200221022152b22142213221322131a1c010e0c00085029352a36221337221423092a3b1abf000c00032a3b1ab7000c00032928291ab6000e0e0e0c00031ab5000e0e0c000203032902012a0402002a3d1a9a000e0e0e0c0003032522191a9d000e0e0c000250221c221c2b221c221c221c221c221c1a8d000e0e0c0009500206293b4530465029352a36220c35220d37220e393436220c382d2b2e2c2f68053c28403b1a8f000c0004221422112c2c2228680529336922252a453346271e1f080e0e0e0e0e0000000000000000b0010000000000000000000000000000|@6589,I253,I251,I218,@5814,@6586,@6588,@6403,@6035,@6009,@6400,I11| 6588:D2,56|00802b28111a38000e0c000303033c02072b56172c800002420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@6006,I251| 6589:S36|50415253455f44454328292e706172736544656328332964656328342976616c42283229 6590:O1|@6591 6591:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6383| 6592:D14,480|00812b372c23092a3b1adc010e0c00032a3b1ad3010c00032928291ad2010e0e0e0c00031ad1010e0e0c000203032902012a2928341ab8010e0c0003270503272b36293b1aa1010e0e0c000328222a1aae010e0e0e0c00032928221aa2010e0e0e0c00036602b52b372c23092a3b1a77010c00032a3b1a6f010c00032928291a6e010e0e0e0c00031a6d010e0e0c000203032902012a29282b1a54010e0c000303033c022b29281e1a45010e0e0c000303033c021b29283a1a35010e0e0c000303033c020b2928181a25010e0e0c00032705030f2b36293b1a0d010e0e0c00036402392b372c23092a3b1afb000c00032a3b1af3000c00032928291af2000e0e0e0c00031af1000e0e0c000203032902012a27041af1000e0e0c00022c3a2d23062e230a2f230e30230f2b3b1ab9000e0e0c00032e3b1aaf000c00032b3b1aa7000c00032d3b1a9f000c0003302c2e2c2e6805220e1ab8001aa5000e0e0c000329220c1a9a000e0e0e0c0003291aa8001a8d000e0e0c0003291aa4001aa9000e0e0c0003291aa8000e0c00023b3e3b3b2d6805291aa1000e0e0c000203041a9f00103b503c3b2b326b2214382215230c2a3b3c1a92000e0e0e0c0004502b2a22170e0e0e7d1800020000000000000000d0010000000000000000000000000000|@6594,I253,I251,I218,@122,@6035,@6595,@6593,@5823,@5826,@6012,I105,@1363,I255| 6593:S10|2077617320666f756e64 6594:S20|534b4950535f28292e6e6f74666f756e64283229 6595:S14|2065787065637465642062757420 6596:O1|@6597 6597:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@6599,@6598| 6598:O1|@6600 6599:S30|535452554354555245535f28292e646973706c6179546f70446563283129 6600:D16,200|00812b3b1ac9000e0e0c000303051ac70002952c353b1ac7000c000303392c361ac5002a1ac9002f1acd000e0e0c00051acd002a691ad0002a693b3e3b3b2d6805291acb000c000203041acb00103b503b5029270502512c353c1a83000c000303392c361ab9002a1abd002f1a89000e0e0c00051ab9002a691abc002a693b3e3b3b2d6805291a87000c000203041a8700103b503b50292705020d2c36292d1a9e002e0e7e050003430e0e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@6602,I232,@854,I251,@6603,@5964,@6796,@871,@5624,I105,@1363,@6808,@5964,@871,@2226,@6601| 6601:O3|@6811,@6792,@6791 6602:S30|535452554354555245535f28292e646973706c6179546f70446563283229 6603:O1|@6604 6604:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@6606,@6605| 6605:O1|@6607 6606:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283129 6607:D23,512|00812c3529352a372f3630383123060402002a3c1af1010e0e0c0003030c2c353d1ae4010e0c000302013b031a2c3629352a362b372c382b2b2b6a296801302a452f4626080206293b452d465029352a362d28281ab9010e0e0c00033e2a69291ab5010e0e0c000203041ab301103b503b50321ab2011a8f010c000303033c0222321a93010c00021aa5010e0e0c00020310323b1a91013b28081a9b010c000602013b03033b0228321a94011a61010e0e0c00033e2a69291a5d010e0e0c000203041a5b01103b503b50291a7a016965220e3c1a7a010e0e0e0c0003332a1a77010c0003293b69293b1a1c010e0c000303032c020b2c2a1a66010e0e0e0c00033b3c3b3b2d6805291a0d010e0e0c000203041a0b01103b503b50321afa000e0e0e0c00021a09010e0e0c00020349323529352a362903051a2e0102031a31013e2a69291ad2000e0e0e0c000203041acf00103b503b5022183c1af4000e0c00032d2a1af3000c0003293b691a0a012a692d2a69270902013b22143c1ad2000e0e0e0c0003332a1af7000c0003293b691af6002a691af9002a691afc002a69293b1a65000e0e0c000303032f020b2f2a1aee000e0e0e0c00031aed002a69322a691aed002a6922112a693b3e3b3b2d6805291a44000e0c000203041a4300103b503b5029271e430e0e0000000000000000f0010000000000000000000000000000|@6609,I251,@122,I105,@1363,I48,I218,I154,@6610,@1460,I107,@6611,@6789,@6653,@6610,@871,@6791,@871,@1371,@871,@6608,@870,@871| 6608:O1|@6807 6609:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283229 6610:S2|203a 6611:O2|@6613,@6612 6612:O2|@6646,@6645 6613:D26,376|00812b3b1a79010e0e0c000303051a77010fcb2c353d1a77010c000303d52c3629362a372b382c392c31300e0e0c00033b1a64010e0c00022c332b1a62010e0e0e0c00043e2f69291a5d010e0e0c000203041a5b01103b503b50343c1a59010e0e0c00032e1a58010e0c00023b1a28010e0c00022a2c2b1a4e013b1a52010e0e0e0c0006293b691a4e012a691a51012a691a54012a69312a69293b1af2000e0e0e0c0003030333020b332a1a42010e0e0e0c00031a41012a691a44012a691a47012a691a4a012a691a4d012a6922122a693b3e3b3b2d6805291acc00020278000e0c000203041ac700103b503b5029271a02652c353b1a97000c000303412c3656172a1a1a012f1a1e010e0e0e0c0005291a1c010e0c00021a1d012a691a20012a693b3b3c3b2d6805291a7b000c000203041a7b00103b503b5029270602192c363e2a69291a60000e0c000203041a5f00103b503b502965430e0e0e0e0e0e0e000000000000000068010000000000000000000000000000|@6615,I232,@854,I251,@1330,@1698,I105,@1363,I107,@6616,@1702,@1469,@871,@1371,@871,@6638,@871,@1375,@871,@6640,@871,I48,@6641,@6614,@871,@2209| 6614:O1|@6644 6615:S27|5349474e41545552455328292e646973706c617953696773283229 6616:O1|@6617 6617:D15,280|00802b350a05003b000c00b40040004e00d1002b36293a293b1a04010e0c00032b352c362d392b1afe001a03010c00033b2b69293b6928052c2f322d6805270902bc1af30002b72b3629352a3628062b2b6a6602a92b362c372a1acb001ae0000e0c00031ae1000e0e0c0002291ae0000e0c00023b2a2d6a2c030329020e3c28402b1ad3000c00043c2a69643e2d2b6a2e03032902213c28401ac4001ab9000e0e0c000428062a1abe006a2a3b2d1abf000c0004502965270702432b362c382a1a65000e0e0c00022a1a5c000e0c00023d2b2b6a270402262b36291a4a001a97000c0003293c1a97000c0003291a98000e0c00023b2a3c6a3e2c2b6a2705420e000000000000000008010000000000000000000000000000|@6619,I253,@6616,@6620,@1444,@6622,@6624,@6630,I11,@588,79992,I255,@6632,@6634,@6618| 6618:O1|@6637 6619:S32|545950455f5452454528292e7479706546726f6d547970655061727365283129 6620:O1|@6621 6621:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d362a2e0e0c00022a2f1a43000c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@6620| 6622:O1|@6623 6623:D12,224|00812c1ae2000e0e0e0c00021ae1000e0e0c000203a92c352d362a352b362a352a310e0e0e0c00022a291acb000c0002293c1acb000c00036403033c0246291ab6000e0e0e0c00023b2a1abb000c00036403041aba00103b50291a8b000c0002030329020b2928081aad000e0e0c00032928301aaa000e0e0e0c0003641a70000e0c00020303290221291a6b000c0002293c1a93000c00032b3c2b1a92000e0e0e0c00046525011e7e3b64292b692f341a85000e0e0c00032a2a69270902013b430e0e0e0e0e0e0e0000000000000000d0000000000000000000000000000000|@1399,I105,I218,I223,I232,I231,@70,I252,I251,I107,@5831,@6622| 6624:O1|@6625 6625:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031a2b352c362a352a1a48000e0c0002292b2e1a4600327b050700043b420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@6627,I105,I218,@6624,@6626| 6626:O1|@6628 6627:S25|545950455f5452454528292e736f72744c6162656c73283129 6628:D13,272|00822d1a12010e0e0e0c00021a11010e0e0c000207cd2d352e362a352f1a08010e0c00022a1a00010e0c00022a2a1aff000c000365036f2f2a1afc000e0c000303033c024a2f1acf000c00021ad1000e0e0c00020314291abe000e0e0e0c00021abd000e0e0c000202013b03212f3b2b3b28082e1ab1000e0e0c00021ac1000e0e0c00031ac1000e0e0c000602013b03033b02102f2a1ab7000c000303051ab70002013c02232f1a7e000e0e0e0c00022a1a74000e0c00022a2a1aa3000c00036503051a920002013c293b1a9a000e0e0e0c000303052f326902112b31311a8f0002020b000c00042d2a6964270402032b3b69440e0e0e0e000000000000000000010000000000000000000000000000|@6629,I105,I218,I223,I113,I251,I239,I154,I27,-1,I234,I232,@6626| 6629:S35|545950455f5452454528292e736f72744c6162656c73283129656e7465722833292829 6630:O1|@6631 6631:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@6630| 6632:O1|@6633 6633:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d362a2e0e0c00022a2f1a43000c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@6632| 6634:O1|@6635 6635:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362d3c1a59000e0e0c0003292c692f3c1a54000e0c00032c2a1a53000c00032b2a69270602013b430e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@6636,I105,I218,@243,I106,@6634| 6636:S26|545950455f5452454528292e6d6170746f5265636f7264283229 6637:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@6618| 6638:O1|@6639 6639:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6638| 6640:O2|3,@5970 6641:O1|@6642 6642:D11,264|00832d1a0a010e0e0e0c00021a09010e0e0c000203d72d352e36293b1a01010e0e0c000303202d3b1afd000e0e0c000303051afb00020d2a2e69310e0e0c0002293b696402a42d3b1add000e0e0c000303051ae30002932e282c1ac3000c000303033c020b2e283b1ab5000e0e0c00031aa5000e0e0c00022b2f69320e0c00023c2b3b6a291a88000e0c000203041aaf00103b503e3269291a75000e0e0c000203041a9b00103b50293b692b2a692d2a693b3b3b3b2d6805291a54000e0c000203041a7b00103b50220c3c1a7a000e0e0e0c000322103322102c1a73000c00051a75002a692c2a69270b6502013b1f040000000000000000f8000000000000000000000000000000|@6643,I105,I218,I251,I232,@1453,@1453,@1363,I107,@6641,@871| 6643:S27|5349474e41545552455328292e646973706c61794c697374283429 6644:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6614,@2929| 6645:O3|@6649,@6648,@6611 6646:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6647| 6647:S28|5349474e41545552455328292e646973706c61795370656373283129 6648:O2|@6787,@6611 6649:D37,680|00812b3b1aa9020e0e0c000303051aa7020fd42c350a050047000b016000a3000c00f4012c361a9702562869292b1a9702301a9b020c00051a9d022a691aa0022a693b3e3b3b2d6805291a9b020c000203041a9b02103b503b502927060fd02c362c3c1a92020e0e0e0c00032a2a1a8f022f0e0e7e0600032c362c3c1a79020e0e0c000356272b1a7e022c1a42020e0e0e0c00051a79022a691a7c022a693b3e3c3b2d6805291a3f020c000203041a3f02103b503b502927060fcd2c372d382a1a5d020e0e0c000203033b02031a58021a5d022b283d311af6010e0e0e0c0005293b1a53020202a4010c000303032a020b2a2a1a4a020e0e0e0c00031a49022a691a4c022a693b3e3b3b2d6805291ad7010c000203041ad701103b503b502927080fd12c372d382a352a1abb0102025c010c00021ae9010e0e0c000203852a352a1a14021a19020e0e0c00033e2a69291a95010e0e0c000203041a9301103b503b50313c1a91010e0e0c00032c1af8010e0c00023b1af8010e0c00022a2c2b1af6013b1afa01020203010e0e0e0c0006293b691af2012a692f2a691af2012a691af5012a693b3b3b3b2d6805291a38010e0c000203041a3701103b503b5029270d02463e2a69291a1e010e0e0e0c000203041a1b01103b503b50293b691ac0012a691ac3012a693b3b3b3b2d6805291af600020297000e0e0e0c000203041aef00103b503b502927056602812c372d382a35291a9a011a47010c00033e2a69291ac5000e0e0c000203041ac300103b503b50303c1ac1000e0e0c00032d1a28010e0c00023b1a28010e0c00022a2c2b1a26013b1a2a010e0e0e0c0006293b691a56012a692f2a691a56012a691a59012a693b3b3b3b2d6805291a6c000e0c000203041a6b00103b503b5029270f430e0e000000000000000098020000000000000000000000000000|@6651,I232,@854,@6652,@5964,@6641,@871,@2206,I105,@1363,I107,@6655,I48,@871,@6779,I218,@6780,@6781,I251,@6784,@871,@6786,@6610,@122,@6616,@1330,@1702,@1469,@871,@2242,@2239,@2242,@2239,@6610,@871,@2242,@6650| 6650:O2|3,@2232 6651:S28|5349474e41545552455328292e646973706c61795370656373283229 6652:D7,144|00802b352c362a362b3829352a363e2d69291a83000c000203041a8300103b502a03051a820002031a85003e2a69291a66000e0e0e0c000203041a6300103b50303c1a73000c00032e2a56c70e0c0003293b691a6a002a692d2a69302a693b3e3b3b2d6805291a2f000c000203041a2f00103b5029271042000000000000000080000000000000000000000000000000|@6654,I105,@1363,@6653,@6610,I107,@871| 6653:S3|203a3e 6654:S46|5349474e41545552455328292e646973706c61795370656373283229646973706c61795369677342696e64283129 6655:O3|@6657,@6773,@6656 6656:O2|@6777,@6655 6657:D147,3616|00811a230e2a692c3b1a240e0e0c000303051a230e0fce2d350a1e00cf05c3010b0c1b027b0b930957050b049300c3030f05f908970a0b033e00be003b09030a340d37084f0a5f015a0083039800270bb107f408e70aa302ef082d3629353e2a69291adb0d0c000203041adb0d103b503b5029660fcb2d36292e2d0e0e0c0003291acc0d691ad00d2a691ad30d2a693b3b3b3b2d6805291aa60d0e0e0e0c000203041aa30d103b503b502927060fd71ab60d0fd42d3628232a1ab40d0e0c00033e2a69291a790d0e0e0c000203041a770d103b503b5029660fcb2d362e382e3c1a950d02021a0d0e0e0c00032a2a2f1a8e0d0e0e0e0c00042c03051a8a0d023a2b1a3c0d0e0c00021a850d0e0e0c00021a7d0d0e0e0c000203051a7b0d02031a7e0d3e2a69291a170d0c000203041a170d103b503b50293b6965293b1a690d0202be0c0e0e0c000303032a020b2a2a1a5e0d0e0e0e0c00031a5d0d2a693b3d3b3b2d6805291ad80c0e0c000203041ad70c103b503b502927080fd22d362e372e3c1af40c0204790c770c0e0e0e0c00032b2a2f0e0e0c0003303c1adb0c0c00032c2a3102025a0c0e0e0c0003293b691a0e0d2a691a110d2a691a140d2a692f2a693b3e3c3b2d6805291a740c0e0c000203041a730c103b503b5029270c0fca2d362e372e3c1a900c0e0c00032b2a2f0e0e0c0003303c1a7f0c0c00032c2a310e0e0c0003293b691ace0c2a691ad10c2a691ad40c2a692f2a693b3e3c3b2d6805291a1c0c0e0c000203041a1b0c103b503b5029270c0fd92d3629352a362f3c1a360c0e0e0e0c00032b2a300202b20b0e0e0c0003291a980c691a9c0c2a691a9f0c2a693b3b3b3b2d6805291ad20b0e0e0e0c000203041acf0b103b503b50220c3c1af40b0e0c000330287c2b56e71a770c0c00051a790c2a692c2a693b3e3c3b2d6805291a990b0202560b0e0e0c000203041a930b103b503b5029270e0fcb2d362e372e3c1ab00b0e0c00032a2a2f0e0e0c0003303c1a9f0b0c00032d2a310e0e0c0003293b691a2e0c2a691a310c2a691a340c2a692f2a691a340c2a691a370c2a693b3b3b3b2d6805291a320b0202ef0a0e0e0e0c000203041a2b0b103b503b5029270e0fd42d362e372e3c1a480b0e0c00032b2a2f0e0e0c0003303c1a370b0c00032c287c2b56971abb0b0c00051aed0b2a691af00b2a693b3e3c3b2d6805291adb0a0c000203041adb0a103b503b50293b691ad80b2a69302a693b3b3b3b2d6805291ab80a0202750a0e0c000203041ab30a103b503b5029270d0fd12d362d3c1ad20a0e0e0e0c00032a2a2e0e0e0c0003293b691a9e0b2a691aa10b2a693b3b3b3b2d6805291a740a0e0c000203041a730a103b503b502927070fdd2d361a840b2c692e3c1a8d0a0e0e0c00032b1a7c0b2b2d1a0f0b0202040a0c00051a750b2a691a780b2a693b3e3c3b2d6805291a2b0a0c000203041a2b0a103b503b502927070fd62d362e372a353c1a770a0c000303512a36293c1a4b0b0c00033e2a69291af9090e0e0c000203041af709103b503b50293b691a340b2a691a370b2a693b3b3b3b2d6805291ad20902028f090e0e0e0c000203041acb09103b503b50292707025f2a353b1a1b0a0c000303512a36293c1aef0a0c00033e2a69291a9d090e0e0c000203041a9b09103b503b50293b691ae80a2a69020243091ae70a2a693b3b3b3b2d6805291a72090e0e0e0c000203041a6f09103b503b5029270702031aca0a2f3c1a8d090e0e0c00032b1ac40a2b1ac80a1a0d0a020202090e0e0c00051ac10a2a692c2a693b3e3c3b2d6805291a29090e0e0c000203041a2709103b503b502927080fd12d362d3c1a46090e0e0e0c00032a283b2b2e1ac8090e0c0005291a880a0e0c00021a890a2a691a8c0a2a693b3e3c3b2d6805291adf080c000203041adf08103b503b502927070fd12d3629372a383e2b69291ac0080e0c000203041abf08103b503b503e2b69291aab080c000203041aab08103b503b50293b691a400a2a691a430a2a691a460a2a691a490a2a691a4c0a2a69302a691a4c0a2a691a4f0a2a693b3e3c3b2d6805291a6a080e0e0e0c000203041a6708103b503b5029270f0fd52d3629352a372b392c38293c1aae08020203080e0e0e0c000307da313c1a6d080e0e0c00032c1a0c0a2b1a100a1aed080e0e0c00052c1a1c080e0c00021a65080e0e0c00021a5d080e0e0c000203033b0233333c1a36080202bb070e0e0e0c00032d1ae0092b1ae4091ab1080e0e0c0005291ae0090e0c00021ae1092a691ae4092a692704343c1a03080c000330283b2b220c1a87080c00053b3e3c3b2d6805291ab1070e0e0c000203041aaf07103b503b50293b691ab4092a691ab7092a69293b1af8070e0c000303032f020f2f2a1aaa0902023f070e0e0e0c0003293b1adb070c000303051a9b0902111a96092a1a9a09020245000e0e0e0c0003293b1abb070c0003030332020b322a1a86090e0e0e0c00031a85092a691a88092a693b3e3c3b2d6805291a2b070c000203041a2b07103b503b5029270f02a2313c1a4c070e0c00032c1a64092b1af0081acd070e0e0c00052c1afc060e0c00021a45070e0e0c00021a3d070e0e0c000203033b022c333c1a16070e0e0e0c00032d1a34092b1ac8081a95070e0e0c00051a2d092a691a30092a691a33092a692704293b1a1a070e0e0e0c000303032a020b2a2a1a22090e0e0e0c00031a21092a691a24092a693b3e3c3b2d6805291a87060c000203041a8706103b503b5029270727050fca2d36291a6d060e0e0c00021ab5060e0e0c000203112935293a293c1abd060e0e0c00036502013b03051adf0802031ae2083e2a69291a3b060c000203041a3b06103b503b502f3c1a61060e0e0c00032c1ac8082b1a14081ae1060e0e0c00051ac1082a692c2a693b3e3c3b2d6805291a01060e0e0c000203041aff05103b503b502927080fcb2d3629352a362b372903051a970802031a9a083e2a69291ad3050c000203041ad305103b503b50323c1af9050e0e0c00032d283b2b331a7c060e0c0005343c1ae305020268050c000330283b2b220c1a63060c0005291a5c080e0c0002293b1af3050c000303051a5308020d1a4e082a1a52080e0e0e0c0003293b1ad7050c000303032d020b2d2a1a42080e0e0e0c00031a41082a69312a693b3e3b3b2d6805291a49050e0e0c000203041a4705103b503b502927100fd51a22080fd21a25080fcf2d372d3c1a5c050202e1040e0c00032a287c2b56671adb050c00051a0d082a691a10082a693b3e3c3b2d6805291afb040c000203041afb04103b503b502927060fd12d362e372e3c1a18050e0c00032b2a2f0e0e0c0003303c1a07050c00032c2a310e0e0c0003293b691ace072a691ad1072a691ad4072a692f2a693b3e3c3b2d6805291aa4040e0c000203041aa304103b503b5029270c0fd62d362e372e3c1ac0040e0c00032a2a2f0e0e0c00032c1aa0070e0c00023b1aa0070e0c00022a332b1a9e073b1aa20702061f041d041b040e0e0e0c0006293b691a96072a691a99072a691a9c072a69302a693b3e3b3b2d6805291a34040e0c000203041a3304103b503b5029270d0fd02d372d3c1a52040202d7030e0e0e0c00032a282c2b56681acf040c0005291a60070e0c00021a61072a691a64072a693b3e3c3b2d6805291ae7030c000203041ae703103b503b502927070fdd2d3629352e3c1a04040e0c00032a1a3c052b1a38071a850402027a030e0e0c00051a31072a691a34072a693b3e3c3b2d6805291a9f030c000203041a9f03103b503b502927070fce2d361a18072c56486a1a19072a692f3c1ab2030e0e0e0c00032c1a10072b2d1a33040c00051a0d072a691a10072a693b3e3c3b2d6805291a5303020210030c000203041a4f03103b503b502927080fcb2d362d3c1a6e030e0e0e0c00032a2a2e1ae2060e0e0e0c00041ae1062a691ae4062a693b3e3c3b2d6805291a0f030c000203041a0f03103b503b502927060fd02d362d0202b7023c1a2a030e0e0e0c00032a282c2b56681aab030c00051aad062a691ab0062a69291ab2060e0e0e0c00023b3e3c3b2d6805291ac10202027e020e0e0c000203041abb02103b503b502927070fd42d3629352a362b37303c1ad4020e0c00032c2a310e0e0c0003323c1ac3020c00032c2a330e0e0c0003343c1ab3020c00032f2a220c020231020e0c0003293b691a4e062a691a51062a691a54062a692f2a691a54062a691a57062a691a5a062a69220c2a691a59062a691a5c062a693b3b3b3b2d6805291a2f020202ec010c000203041a2b02103b503b502927160fdd2d3629362a36293528191a74020e0c000303512936291a00020e0c00021a49020e0e0c000203392936291aec010e0c00021a35020e0e0c000203212936293b1a3f02020294010c0003030d2e38293c1a2f020c00036402013b6402013b6402013b6402013b64036c2a36293629352a3629352f35343c1ad8010e0c00032d2a220c0e0c00032b220e220d0c0003220e3c1abe010e0e0e0c00032e2a220f0e0c0003293b691a9a052a692d2a691a9a052a69302a693b3b3b3b2d6805291a5a010e0e0e0c000203041a5701103b503b5029271102522a352f3c1a76010202fb000e0e0e0c00032a2a300e0e0c0003313c1a5f010c00032d2a320e0e0c0003293b691a4e052a692d2a693b3b3b3b2d6805291a06010e0e0e0c000203041a0301103b503b502927096502b12d372e392935291a26051a4b010c000303033c0222291ad7000c00021a21010e0e0c00020310293b1a05053b28121a07050c000602013b03152b1a03056928222a69641a02050e0e0e0c00020249291afe041a03010c000303033c0222291a8f000c00021ad9000e0e0c00020310293b1add043b28101abf040c000602013b03152b1ad304691ad7042a69641ab9040e0e0c000202012b3e2a69291a52000e0e0e0c000203041a4f00103b503b5029270564430e0e0e0e0e0000000000000000100e0000000000000000000000000000|@6659,@6660,I232,@854,I105,@1363,@900,@901,@873,@6662,@122,I107,@6664,@887,I218,@886,@1516,I251,@6667,@899,@871,@6669,@871,@871,@6670,@871,@6671,@871,@6672,@6673,@871,@871,@6676,@871,@871,@6677,@871,@6678,@871,@871,@6679,@6680,@5964,@871,@2239,@243,@871,@5297,@871,@5299,@5295,I48,@6687,@871,@6690,@901,@873,@871,@1405,@871,@1371,@871,@871,@1405,@5964,@6692,@5964,@6703,@6711,@871,@6713,@871,@3267,@6714,@1700,@6716,@6718,@871,@6720,@5964,@5964,@871,@6713,@871,@6721,@871,@1405,@1381,@1376,@5964,@871,@5950,@2936,@6723,@6725,@6727,@6729,@871,@2885,@6731,@871,@2471,@871,@6732,@871,@6616,@1330,@1702,@1469,@871,@2205,@871,@6733,@901,@6735,@6736,@871,@6739,@6740,@6755,@5964,@871,@6757,@6758,@871,@6650,@901,@873,@6770,@871,@2941,@871,@871,@2939,@871,@871,@2937,@871,@871,@871,@6427,I154,@6772,@104,@6420,@6772,@6658| 6658:S2|2322 6659:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229 6660:D1,48|00802b352c362a35292b5657300e0e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@6661| 6661:S60|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61794c69737457697468427074732d283129 6662:O2|3,@6663 6663:S7|3c456d7074793e 6664:O1|@6665 6665:D16,352|00822c3b1a61010e0e0c000303051a5f010fd52d1a61010e0e0c00021a61010e0e0c000207dd2d352e36293b1a59010e0e0c000303632a352b382a1a52011a57010c00033e2a69291a2d010e0e0c000203041a4b01103b503b50323c1a49010e0e0c00032c2a340e0e0c0003293b691a3e012a692d2a693b3b3b3b2d6805291af6000e0e0e0c000203041a1301103b503b50293b69270a02a52a352b382a1a17011af4000e0c00033e2a69291ac9000e0e0c000203041ae700103b503b50323c1ae5000e0e0c00032c2a340e0e0c0003293b691aea002a692d2a693b3b3b3b2d6805291a9200020258000e0e0e0c000203041aab00103b503b50291aca00693b3b02023c003b3b2d6805291a6a000e0e0e0c000203041a8700103b503b5022113c1a84000e0c0003220d2a22131aa0000e0c00041aa1002a692c2a69270f6502013b440e0e0e0e0e000000000000000050010000000000000000000000000000|@6666,I232,@1453,I105,I218,I251,@2681,@122,@1363,I107,@871,@2681,@871,@1511,@6664,@871| 6666:S54|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61795265634c697374283229 6667:O1|@6668 6668:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6667| 6669:O2|3,@5954 6670:O2|3,@5969 6671:O2|@871,@1455 6672:O2|3,@5912 6673:O1|@6674 6674:D12,320|00832c3b1a41010e0e0c000303051a3f010fd72e1a41010e0e0c00021a41010e0e0c000207da2e352f36293b1a39010e0e0c000303102a2f692e0e0e0e0c0002293b69640fcd2a2f692e0e0e0e0c000230282c1a12010e0e0e0c000303033c024230283b1a01010e0e0c000303033c0232301afb001af0000e0c000303033c0222301ad3000c00021ad5000e0e0c00020310303b1ad9003b28081adb000c000602013b1aba000e0e0e0c00023c2a3b6a291aa4000e0c000203041ac300103b503e3369291a91000e0e0c000203041aaf00103b50293b692b2a692e2a693b3b3b3b2d6805291a700002023a000e0c000203041a8b00103b50220d3c1a8a00020223000e0e0e0c00033222102b22101a7f0002020d000c00051a7d002a692c2a69270b6502013b1f04000000000000000030010000000000000000000000000000|@6675,I232,@1453,I105,I218,I251,I48,I154,@1363,I107,@6673,@871| 6675:S30|5052494e545f50415253455452454528292e7072696e744c697374283429 6676:O2|3,@5923 6677:O2|3,@5959 6678:O2|3,@5929 6679:O2|3,@5926 6680:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@6682,@6681| 6681:O1|@6683 6682:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283129 6683:D17,248|00822d352e372f3a3e2c69291af1000e0e0c000203041aef00103b503b502b1ade000e0e0e0c00021ae5000e0e0c000203382b35291ae0000e0c00023b1ae0000e0c00022a342b1ade003b1ae2000e0e0e0c0006293b691ade002a691ae1002a691ae4002a69270702013b2b3528081ade000e0e0e0c000303033b0227313c1ad6000e0e0e0c00032c2a330e0e0c0003293b691aca002a691acd002a691ad0002a692705293b1aa7000c000303032a020b2a2a1ac2000e0e0e0c00032c2a693b3b3b3b2d6805291a36000e0e0e0c000203041a3300103b503b50292709440e0e0000000000000000e8000000000000000000000000000000|@6685,I105,@1363,I218,@6616,@1330,@1702,@1469,@871,@1457,@871,I251,I107,@871,@1371,@871,@6684| 6684:O1|@6686 6685:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283229 6686:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6684| 6687:O1|@6688 6688:D3,56|00802b353e2a69291a35000e0e0c000203041a3300103b502965420e0e0e0e0e000000000000000028000000000000000000000000000000|@6689,I105,@1363| 6689:S40|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229283129 6690:O1|@6691 6691:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6690,@900| 6692:O1|@6693 6693:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@6695,@6694| 6694:O1|@6696 6695:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283129 6696:D13,176|00812c352d372e3a3b1aac000e0c00022a302b1aaa000e0e0e0c00043e2e69291aa5000e0e0c000203041aa300103b503b50313c1aa1000e0e0c00032e287c2b1a9d001aa2000e0e0e0c00051aa1002a691aa4002a691aa7002a692e2a69293b1aa5000e0e0c0003030330020b302a1a9e000e0e0e0c00033b3e3c3b2d6805291a45000e0e0c000203041a4300103b503b5029270e430e0e0000000000000000a0000000000000000000000000000000|@6698,@1330,@1698,I105,@1363,I107,@6699,@6673,@871,@1371,@871,I251,@6697| 6697:O1|@6702 6698:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283229 6699:O1|@6700 6700:D11,160|00802b352c362a362b373e2a69291a97000c000203041a9700103b502b1a88000e0c00021a91000e0e0c000203382b35291a8c000e0c00023b1a8c000e0c00022a302b1a8a003b1a8e000e0e0e0c0006293b691a8a002a691a8d002a691a90002a69270702013b2a2a693b3d3b3b2d6805291a33000c000203041a3300103b50292708420e0e0e0e000000000000000090000000000000000000000000000000|@6701,I105,@1363,I218,@6616,@1330,@1702,@1469,@871,@1457,@871| 6701:S56|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436f6e7374727563746f72283129 6702:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6697| 6703:O1|@6704 6704:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@6706,@6705| 6705:O1|@6707 6706:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283129 6707:D14,208|00812c352d372e23063b1acb000c00022a302b1aca000e0e0e0c00043e2e69291ac5000e0e0c000203041ac300103b502d1ab4000e0c00021abd000e0e0c000203382d35291ab8000e0c00023b1a88000e0c00022a220c2b1aad003b1ab1000e0e0c0006293b691aae002a691ab1002a691ab4002a69270702013b2a2a69293b1aad000e0e0c000303032c020b2c2a1aa6000e0e0e0c00033b3e3c3b2d6805291a45000e0e0c000203041a4300103b5029270a430e0e0e0e0000000000000000c0000000000000000000000000000000|@6709,@1330,@1698,I105,@1363,I218,@6616,@1702,@1469,@871,@1371,@871,I251,@6708| 6708:O1|@6710 6709:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283229 6710:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6708| 6711:O1|@6712 6712:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6711,@1700| 6713:O2|3,@5946 6714:O1|@6715 6715:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6714| 6716:O1|@6717 6717:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6716| 6718:O1|@6719 6719:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6718| 6720:O2|3,@5915 6721:O1|@6722 6722:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6721| 6723:O1|@6724 6724:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6723,@2929| 6725:O2|@871,@6726 6726:O2|@2933,@1700 6727:O1|@6728 6728:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6727| 6729:O1|@6730 6730:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6729| 6731:O2|3,@2742 6732:O2|3,@5944 6733:O1|@6734 6734:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6733,@2892| 6735:O2|3,91 6736:O1|@6737 6737:D3,56|00802b3529353e2a69291a33000c000203041a3300103b502966420e0e0e0e0e000000000000000028000000000000000000000000000000|@6738,I105,@1363| 6738:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745374724e616d65283129 6739:O2|3,@5967 6740:D8,120|00802b352c362a352b362b3c1a71000e0e0c00032b2a567756881a6b000c00052d3c1a5b000c00032c2a56970e0c0003293b691a5a002a691a5d002a691a60002a692f2a693b3e3c3b2d6805291a58000e0c000203041a5700103b5029270e42000000000000000068000000000000000000000000000000|@6742,I107,@6741,@871,@1371,@871,I105,@1363| 6741:O1|@6743 6742:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436c61757365283129 6743:D28,1072|00832e352f35291a2e040e0e0e0c00021a2d040e0e0c0002037429352a362a3528191a23040c000303602a36291a08040e0c00021a09040e0e0c000203482936291af4030e0c00021af5030e0e0c000203302936293b1aef030c000303202c3b1ae5030e0e0c00030311220c37293c1ad6030e0e0e0c00036402013b02013b6402013b6402013b6402013b6502013b6407ca2f352935293629352a362935220c362935220e38220e3c1aa4030e0c00032f2a22100e0c00033e2d69291a79030e0e0c000203041a8f03103b503b5022113c1a7c030e0c0003302a22130e0c0003293b691a7a032a692d2a691a7a032a69302a6922183c1a57030c0003341a38030e0c00021a39030e0e0c000203383435291a5c030e0c00023b1a5c030e0c00022a2d2b1a5a033b1a5e030e0e0e0c0006293b691a5a032a691a5d032a691a60032a69270702013b293b1afc020e0c000303032b020f2b2a1a4e03020225000e0e0e0c00033b3b3b3b2d6805291ac9020e0e0c000203041adf02103b503b502927170fdd2f35291aaf020c00021ab1020e0e0c000203612935293528191aa9020e0e0c0003034d2936291a8c020e0c00021a8d020e0e0c000203352936291a78020e0c00021a79020e0e0c0002031d2936293b1a73020c0003030d3437293c1a67020c00036402013b6402013b6402013b6402013b6402013b6407dc2f3529352a362a3629352a362935220d362935220f38220f3c1a39020e0e0c00032f2a22110e0c00033e2d69291a0d020e0e0c000203041a2302103b503b5022123c1a10020e0c0003302a22140e0c0003291a6002691a64022a692d2a691a64022a690202b301302a691a60022a691a63022a69221b3c1adb010c000322141a5b022b221d1a5d020e0e0c0005221d3d1ac2010e0e0e0c0003220f1a9f010c00021aa1010e0e0c0002033c220f35291ac3010c00023b1ac4010e0c00022a2d2b1ac2013b1ac6010e0e0e0c0006293b691ac2012a691ac5012a6902025a001ac4012a69270702013b293b1a60010e0c000303032b020b2b2a1af2010e0e0e0c0003293b1a47010c000303032e020b2e2a1ae2010e0e0e0c00033b3b3b3b2d6805291a19010e0e0c000203041a2f01103b503b5029271d0fce2f36293531383e2b69291af8000e0c000203041a0f01103b503b50291aa60169333c1af8000e0c00032f1a78012b220c1a7a010e0e0e0c0005220c3d1ade000e0e0e0c00032e1abc000e0c00021abd000e0e0c000203382e35291ae0000e0c00023b1ae0000e0c00022a2d2b1ade003b1ae2000e0e0e0c0006293b691ade002a691ae1002a691ae4002a69270702013b293b1a80000e0c000303032b020b2b2a1a2a010e0e0e0c0003293b1a67000c000303032e020b2e2a1a1a010e0e0e0c00033b3b3b3b2d6805291a3900020212000e0e0c000203041a4b00103b503b5029270c641f04000000000000000020040000000000000000000000000000|@6745,I105,I218,I251,I107,@1363,@871,@871,@6616,@1330,@1702,@1469,@871,@2205,@871,@6746,@900,@871,@871,@901,@873,I48,@6673,@6748,@6750,@1700,@6752,@6744| 6744:O1|@6754 6745:S48|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446563283229 6746:O1|@6747 6747:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6746| 6748:O1|@6749 6749:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6748| 6750:O1|@6751 6751:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6750| 6752:O1|@6753 6753:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6752| 6754:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6744| 6755:D5,80|00802b352c362a362a3c1a4b000c00032a287c2b56771a47000c00053b3e3c3b2d6805291a41000e0e0c000203041a3f00103b5029270642000000000000000040000000000000000000000000000000|@6756,I107,@6673,I105,@1363| 6756:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e746676616c62696e64283129 6757:O2|3,@5948 6758:O1|@6759 6759:D17,312|00822d1a3a010e0e0e0c00021a39010e0e0c000207dc2d352e362a352b362c39313b1a2b010c000303051a2b010fd32903051a2b0102013b323c1a2b010c00032d2a340e0e0c0003343c1a1b010c00032e2a220d0e0c0003293b691a12012a691a15012a691a18012a692f2a693b3e3b3b2d6805291ac8000e0c000203041a0701103b503b50220e3b1a04010e0c00030321293b69293b1af6000e0e0e0c0003030334020b342a1aee0022157e16000364025f291ae90069293b1ad3000c0003030334020b342a1ade000e0e0e0c00033b3b3b3b2d6805291a65000e0e0c000203041aa300103b503b5022163c1a7800020224000e0c000322122a22181ab000020210000e0c00041aad002a692c2a692706270b270502013b440e0e0e0e0e0e000000000000000028010000000000000000000000000000|@6761,I105,I218,I232,@1453,@6762,I107,@871,@1371,@871,@1363,I251,@6764,@6766,@6760,@6758,@871| 6760:O1|@6769 6761:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e7456616c42696e64283229 6762:O2|@6763,@1700 6763:O2|3,@5919 6764:O1|@6765 6765:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6764| 6766:O2|@871,@6767 6767:O2|@6768,0 6768:O2|3,@5964 6769:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6760| 6770:O1|@6771 6771:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6770,@900| 6772:O2|34,0 6773:O2|@6774,@6655 6774:D7,120|00802b352c362a352b362b3c1a71000e0e0c00032a2a56770e0c00032d3c1a5f000c00032d2a56970e0c0003293b691a56002a691a59002a691a5c002a692f2a693b3b3b3b2d6805291a54000e0c000203041a5300103b5029270e420e0e0e0e000000000000000068000000000000000000000000000000|@6776,I107,@871,@6775,@871,I105,@1363| 6775:O2|3,@5936 6776:S33|5052494e545f50415253455452454528292e646973706c61794d61746368283129 6777:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6778| 6778:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283129 6779:O2|3,@5957 6780:O2|@1375,@1700 6781:O1|@6782 6782:D3,56|00802b3529353e2a69291a33000c000203041a3300103b502966420e0e0e0e0e000000000000000028000000000000000000000000000000|@6783,I105,@1363| 6783:S31|5349474e41545552455328292e646973706c61795370656373283229283129 6784:O1|@6785 6785:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6784| 6786:O2|3,@5906 6787:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6788| 6788:S27|5349474e41545552455328292e646973706c617953696773283129 6789:O1|@6790 6790:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6789| 6791:O2|@6793,@6792 6792:O2|@6805,@6601 6793:D26,536|00812b3b1a19020e0e0c000303051a17020fd12c353d1a17020c000303792c3629352a362b372f3c1a0d020e0e0c00032c2a300e0e0c00032b03051a020202031a05023e2a69291a06020e0e0e0c000203041a0302103b503b50333c1ad9010e0e0c00032f2a1af7010c0003293b691af6012a692d2a69302a693b3b3b3b2d6805291acb010c000203041acb01103b503b5029270f0fcc2c353c1a93010c000303892c362d372d3c1a8d010e0e0c000356372b283b2c1ab7010c00052f3c1a77010c00032d2a300e0e0c0003293b691aa6012a691aa9012a691aac012a69291aae01020212010e0e0e0c0002293b1a3f010c0003030330020b302a1a9a010e0e0e0c00031a99012a691a9c012a693b3e3b3b2d6805291a37010c000203041a3701103b503b5029270f02cd2c353b1aff000c0003035d2c3629352a362928281a6e010e0e0e0c00033e2a69291a01010e0e0c000203041aff00103b503b502c3130020293000c0003291a4c01691a50012a692c2a693b3c3b3b2d6805291ad0000e0c000203041acf00103b503b5029270a02652c353e1a97000c000303412c3656172a1a22012f1ac6000e0e0e0c0005291a1c010e0c00021a1d012a691a20012a693b3c3c3b2d6805291a83000c000203041a8300103b503b5029270602192c363e2a69291a68000e0c000203041a6700103b503b502965430e0e0e0e0e0e0e000000000000000008020000000000000000000000000000|@6795,I232,@854,I251,I107,@6653,@6610,I105,@1363,@6611,@871,@6796,@871,@2933,@871,@6799,@6801,@871,@2935,@122,@900,@901,I48,@6803,@871,@6794| 6794:O2|3,@5962 6795:S35|535452554354555245535f28292e646973706c617953747275637456616c7565283229 6796:O1|@6797 6797:D11,264|00832d1a0a010e0e0e0c00021a09010e0e0c000203d72d352e36293b1a01010e0e0c000303202d3b1afd000e0e0c000303051afb00020d2a2e69310e0e0c0002293b696402a42d3b1add000e0e0c000303051ae30002932e282c1ac3000c000303033c020b2e283b1ab5000e0e0c00031aa5000e0e0c00022b2f69320e0c00023c2b3b6a291a88000e0c000203041aaf00103b503e3269291a75000e0e0c000203041a9b00103b50293b692b2a692d2a693b3b3b3b2d6805291a54000e0c000203041a7b00103b50220c3c1a7a000e0e0e0c000322103322102c1a73000c00051a75002a692c2a69270b6502013b1f040000000000000000f8000000000000000000000000000000|@6798,I105,I218,I251,I232,@1453,@1453,@1363,I107,@6796,@871| 6798:S28|535452554354555245535f28292e646973706c61794c697374283429 6799:O1|@6800 6800:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6799,@2929| 6801:O1|@6802 6802:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6801| 6803:O1|@6804 6804:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6803,@2929| 6805:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6806| 6806:S30|535452554354555245535f28292e646973706c6179537472756374283129 6807:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6608| 6808:O1|@6809 6809:D8,120|00802b352c362a362b392a1a72001a77000c00033e2a69291a75000e0e0c000203041a7300103b502d3c1a73000c00032c2a1a73000c0003293b691a72002a692d2a693b3e3b3b2d6805291a42000e0e0e0c000203041a3f00103b5029270c42000000000000000068000000000000000000000000000000|@6810,@2681,@122,I105,@1363,I107,@6611,@871| 6810:S47|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617953696742696e64283129 6811:D19,304|00812b3b1a31010e0e0c000303051a2f010fd32c353b1a2f010c000303162c362c3c1a2b010c00032a2a1a2b012f0e0e7e0600032c353c1a0e010e0e0e0c000303912c362d372d3c1a05010e0e0c000356372b283b2c1a07010c00052f3c1aef000c000356572e283b2c1af3000c0005291af4000e0c0002293b1acb000c000303051aeb00020d1ae6002a1aea000e0e0e0c0003293b1aaf000c000303032d020b2d2a1ada000e0e0e0c00031ad9002a691adc002a693b3e3b3b2d6805291ad7000c000203041ad700103b503b5029270c023e2c371ad000562869292b1ad000301a7c00020229000e0c00051ac9002a691acc002a693b3e3b3b2d6805291a97000c000203041a9700103b503b50292706430e0e0e0e0e0e000000000000000020010000000000000000000000000000|@6813,I232,@854,I251,I107,@6655,@6796,@6814,@6725,@6816,@6818,@871,@6820,I105,@1363,@6812,@5964,@871,@2206| 6812:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@6822,@6821| 6813:S30|535452554354555245535f28292e646973706c6179537472756374283229 6814:O1|@6815 6815:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6814,@2929| 6816:O1|@6817 6817:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6816| 6818:O1|@6819 6819:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6818| 6820:O2|3,@5950 6821:O1|@6823 6822:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283129 6823:D13,304|00822d362e372f390402002a3c1a28010e0c0003030c2b353d1a1c010e0c000302013b031a2b3629352a362b372c382b2b2b6a296801302a452f4626080206293b452c465029352a363e2f69291af0000e0c000203041aef00103b503b502b1ade000e0e0e0c00021ae5000e0e0c000203492b3529352a362903051ada0002031add003e2a69291ab6000e0e0e0c000203041ab300103b503b50220f3c1ac8000e0c00032d2a1ac7000c0003293b691ac6002a692d2a69270902013b343c1aa7000c00032c2a220d0e0c0003293b691aae002a691ab1002a69293b1a5a000e0e0e0c000303032e020b2e2a1aa2000e0e0e0c0003302a693b3e3b3b2d6805291a3e000e0e0e0c000203041a3b00103b503b50292710440e0e000000000000000020010000000000000000000000000000|@6825,I251,I105,@1363,I218,@6653,@6610,I107,@6611,@871,@871,@6826,@6824| 6824:O1|@6827 6825:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283229 6826:O2|3,@2681 6827:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6824| 6828:O2|@6829,@14440 6829:D14,320|00822d350403003b2a1a3c010e0c00035029352a362b372b2b2b6a0403003b2a1a25010e0e0c00035029362a370403003b2a1a13010c00035029352a362b372b2b2b6a0403003b2a1afd000e0e0c00035029362a370403003b2a1aeb000c00035029362a37221623061ae4002a22126a221823081ae1002a22106a221a230c1ade002a220e6a221c3a1adc002a220c6a221e230b1ad9002a346a1adb002221221d6a2221391ad8002211221e221b2d3222102214221033221e220d2212680d3c28403b1ac2000e0e0e0c00041ac1002a691ac4002b6922233b22292e2d31221a222622172224221722222217222e2234222f222c2215221a2224222c221b123b000100010022182236222f1a92000e0e0e0c001b501a9000222069222222270e7d2900020e0e0e0e000000000000000030010000000000000000000000000000|@6831,@5990,@6832,@6833,@6834,@6835,@6836,@6837,@6843,I11,@6846,@6848,@6852,@6830| 6830:D7,184|00802b352c362a56370c0002291ab0000e0c00021ab1000e0e0c000203192935293a291a9a000e0e0e0c00021a99000e0e0c00026502013b03182935293a29352936293b3c1a88000e0c0004503b260502023b502a2306291a65000e0e0c00021a65000e0e0c0002033029352c380402002a1a63002b1a67000c00045029352a36291a63000c00022b3b692f3b2b1a3f000c0004503b270702013b2704420e0e0000000000000000a8000000000000000000000000000000|@8774,I105,I218,I255,@8773,@1414,@7142| 6831:S29|535452554354555245535f28292e706173733253747275637473283329 6832:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6833:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6834:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6835:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6836:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 6837:D6,104|00803c28403b1a67000c00041a69002a6956280e0e0c00022a3b1a63000c0003563723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4e00310e7e0700032704420e0e0e0e0e000000000000000058000000000000000000000000000000|@6839,I11,@6840,I253,I251,@6838| 6838:O1|@6842 6839:S43|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d6573283129 6840:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@6841,I253,I255| 6841:S48|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d65732831295f2d283129 6842:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@6838| 6843:O1|@6844 6844:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@6845| 6845:S36|535452554354555245535f28292e706173733253747275637473283329656e762d283129 6846:D5,88|008056073b1a58000e0c00033b2a291a56000e0e0e0c00021a55000e0e0c0002031729362b3c1a4f000c0003292b25042504511e253b6502012a66420e0e0e0e000000000000000048000000000000000000000000000000|@6847,I253,I105,I218,I106| 6847:S48|535452554354555245535f28292e706173733253747275637473283329746f704c6576656c49644e756d626572283129 6848:D14,256|008056073b1a00010e0c0003293b2a1afe000e0e0e0c00021afd000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1ae2000e0e0e0c000303051adf0002903b2a291abf000c00021ac1000e0e0c0002031729362b3c1acb000c0003292b25042504511e223b6502012a65291abd001ac2000e0e0e0c000303041abf00103b503b502928403b1abb000c00043b2c293b1a81000e0e0c000303043b50022629352a362d2d2c1aa4000e0c0004502c3c1a72000e0e0e0c0003292b2505250526031e32260351291a8b000c00025029651a8a002a6966420e0e0e0e0e0e0000000000000000f0000000000000000000000000000000|@6850,I253,I105,I218,I251,I49,I106,72057594037927935,I231,@3441,I11,I255,I47,@6849| 6849:D7,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203033c021456071a52000e0e0e0c00022c2a1a4f000c00036403041a4e00103b5056072c1a4d002d7e030003000000000000000048000000000000000000000000000000|@6851,I105,I218,I15,I247,@599,I253| 6850:S49|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129 6851:S52|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129283129 6852:O1|@6853 6853:D21,1024|0099221b1a01040e0e0c00021a01040e0e0c000207cb221b35221c362a353c1af6030e0e0e0c000307db2a362b37221e291ad4030e0c00021ad5030e0e0c0002033329352a362a352b362a351ad1032224692a0e0e0c00025129351aca032224692a0e0e0e0c0002512b250526041e3e3b270402013b641ab6032e22202d6b0403002a2a1ab1030e0e0c00035029352a3622213b1aa9030e0e0c00033b2a291a66030e0e0e0c00021a65030e0e0c0002031729362b3c1a8f030c0003292b25042504511e253b6502012a653b22230e0e0e0c000232291a2f030c00021a31030202b5020e0e0c0002032c29352a362a352b362c372d382e393232222c2230220f1a4d03020259000e0e0c000b50292503511e3c5102023b505022212e0e0c000250333b2227222722272227222722272227222722272227222722272227222722272227222722272227222722272227222722271a020322280e0e0e7b1c28001b2a353b1ab2020e0e0e0c000307dd2a362b37221e291a90020e0c00021a91020e0e0c0002033329352a362a352b362a351acd022224692a0e0e0c00025129351ac6022224692a0e0e0e0c0002512b250526041e3e3b270402013b641ab2022e22202d6b0403002a2a1a6d020e0e0c00035029352a3622213b1a65020e0e0c00033b2a291a22020e0e0e0c00021a21020e0e0c0002031729362b3c1a4b020c0003292b25042504511e253b6502012a653b22230e0e0e0c000232291aeb010c00021aed010e0e0c0002036429352a362a352b362c372d382e392f3a30230631230732230833230934230a02028b00220c230b221022102233223722332233223322332233223322332233223c2234223422342234223422342234223422271af8010e0c002350292503511e705102023b505022142e0e0c000250333b2227222722272227222722272227222722272227222722272227222722272227222722272227222722272227222722271a8a0122280e0e0e7b1c28001b2a362b371aa1012a221e6a2b3b69221f3a222023062221230a2222230e2223230f2b3b1a42010e0e0e0c00032e3b1a37010c00032b3b1a2f010c00032d3b1a27010c0003302c2e2c2e680533220c2216222a222a222e2f1a5601221d1a59010e0e0c000a50222938293b1afb000c00036403033b020a221322136929222c6964220f2a222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c222c1aca00222d0e0e0e7b1c2d001b221a291a6a000e0e0e0c00021a69000e0e0c0002033329352a362a352b362a351add002220692a0e0e0c00025129351ad6002220692a0e0e0e0c0002512b250526041e403b270402013b641f1a0e0e0e0000000000000000f0030000000000000000000000000000|@6855,I105,I218,I251,@6856,@6884,@6889,@6133,I253,I106,@6898,@6852,@8392,@8393,@8394,@8397,@8770,I48,@8440,@8772,@6854| 6854:D3,56|00802b352c362a282e1a34000e0c00032a372a2a56671a2f00320e7b05070004000000000000000028000000000000000000000000000000|@6858,@122,@6885| 6855:S43|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229 6856:D3,48|00802b352c3629382b2a56571a29001a2e00327b06060005000000000000000020000000000000000000000000000000|@6858,@6859,@6857| 6857:O1|@6868 6858:S49|535452554354555245535f28292e706173733253747275637473283329636865636b5661726961626c6573283229283129 6859:O2|@6860,@2271 6860:D14,152|00803b1a9a000e0e0e0c00023d1a98001a9d000e0e0c00031a9d001aa2003b2d2d3c3b3c680828072a6956473b691a97002a691a9a002a69291a9c000e0c00023e2a1a9b003c6b291a9d00692f2a69280e2a3b6a2a1a98000e0c00021a99000e0e0c00021a91000e0e0c0002030a291a8e00220f7d0f000229270c420e0e0e0e000000000000000088000000000000000000000000000000|@6862,@2332,@6863,@1385,@475,@6865,@6866,@475,@2273,@6867,@6861,I105,I218,@2349| 6861:O2|@808,@467 6862:S31|545950454944434f444528292e636f6465466f72556e697175654964283129 6863:O1|@6864 6864:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 6865:S21|636f6465466f72556e6971756549642d657175616c 6866:O3|2,64,0 6867:O3|2,I11,0 6868:D4,80|00833c28403b1a4f000c00041a51002a2f2f336805291a4f000c0002302a0e0e0e0c0002643b2a0e0e0c0002513b651f040e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@6870,I11,@6869,@1729| 6869:D2,48|00801a33002c562756385649565a6806420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@6872,@6871| 6870:S40|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429 6871:D2,48|00802b561756285639564a565b1a2800310e0e7b08030007000000000000000020000000000000000000000000000000|@6874,@6873| 6872:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129 6873:O1|@6875 6874:S56|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129283129 6875:D23,488|00852f3528061ae7010c000307cd2f3630372a3b1ae1010e0e0c000329353c1ace010e0e0e0c000364032c293e1ad0010e0c0003293b1acf010c0003030c1acf012a1ad3010c0003020129293c1ad0010e0c00036502013b07dc303b1a99010e0e0c00031ac1010e0e0c0002285f2a1abe010e0e0e0c0003323b1a7b010c0003293c1a93010c0003343b2b1aaa010e0e0e0c000450333a342306220c230a220d230e220e230f2b3b1a4d010e0e0c00032e3b1a43010c00032b3b1a3b010c00032d3b1a33010c0003302c2e2c2e6805220c2a1a6b016a3b22150202ed000c00023c2a6922113f1a5f010c0003293b1aff000c0003641a58010e0c00023c28402b1a55010e0e0c00043c2a3b3b6b2c2a306a3b3169293b6922152a2d6a28053b22182c3b6805221f3a222023062221230a2222230e02028e002223230f2b3b1ab7000c00032e3b1aaf000c00032b3b1aa7000c00032d3b1a9f000c0003302c2e2c2e680522271af800691afc002a69641afe000e0e0e0c0002291afc001a01010e0e0c0003291a00010e0c00023b3e3b3b2d6805291af9000e0e0c000203041af700103b503b3b2b306b222e230c2a2a0e0e0c000250222a3b22121a7b000c0004503b272902013b6502013b1f060e0e0e0000000000000000d8010000000000000000000000000000|@6877,I251,I253,I216,I234,@410,I106,I113,@6878,@122,I255,@6881,I243,I218,I11,@6882,@6876,@104,@5823,@5826,@6242,I105,@1363| 6876:S13|5468652074797065206f662028 6877:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283229 6878:O1|@6879 6879:D14,224|00802b281a1ae0000e0c000303402b3b1ad5000e0e0c0003293c1ad3000c000303032c020b2c28191acd000e0e0c000329281a1aca000e0e0e0c0003293c1ab7000c0003661ac0000e0c000202031abf002c281a1ac1000e0e0c0003293b1abf000c000303033c0214293b1a7a000e0e0e0c00033c2a1a77000c000364030329020a29281a1aa0000e0c00032928611a96000e0e0e0c0003293b1a93000c000303033c020b2928ff1a8d000e0e0c000303041a8b00103b502c2a1a8b00310e0e7e0700030e0e0e0e0000000000000000d0000000000000000000000000000000|@6880,I231,I251,I107,I109,@6878,I48,I110,I113,I106,I234,I233,@118,@122| 6880:S50|545950455f5452454528292e636865636b466f7246726565547970655661726961626c657328342967656e4e616d65283129 6881:S38|436f6e73747275637465642066726f6d206120667265652074797065207661726961626c652e 6882:O2|@6883,0 6883:S65|2920636f6e7461696e73206120667265652074797065207661726961626c652e2053657474696e6720697420746f206120756e69717565206d6f6e6f747970652e 6884:D3,56|00802b352c362a282e1a34000e0c00032a372a2a56671a2f00320e7b05070004000000000000000028000000000000000000000000000000|@6858,@122,@6885| 6885:O1|@6886 6886:D4,56|00822c351a39001a3e002e316b2a3b2b1a3d00300e0e0e7b050700040e0e0e0e000000000000000028000000000000000000000000000000|@6888,@6887,@6885,@1633| 6887:D10,224|00822c2c2a1ae0000e0c00021ae1000e0e0c000203ac2a352b362a35291ad8001add000e0e0c00036403415649321ad7000c000329282e1ace000e0e0e0c00032c351ab3001ab8000e0c000303043b5002041abb00103b502c3729372b2a56a856b70e0e0e0c0004270402482a35291aa6001a8b000c00036403385649321a87000c00032b351a8f001a74000e0c000303043b5002041a7700103b502b3729382b2a56981a79001a7e000e0e0e0c00056602013b2a2a2505250526031eb83b6602012965440e0e0e0000000000000000d0000000000000000000000000000000|@1636,I105,I218,@14325,I251,@122,@1576,@14310,@6859,@6857| 6888:S66|535452554354555245535f28292e706173733253747275637473283329636865636b537472756374536967466f7246726565547970655661726961626c6573283229 6889:D8,128|00821a83005617691a85002f1a89000e0e0c0003291a88001a7d000e0e0c00033e2a69291a81000e0e0c000203041a7f00103b50293b693b3b3b3b2d6805291a66000e0e0e0c000203041a6300103b5056683c3056992d1a5e00220d0e0e0e7b070b00060e0e0e0e000000000000000070000000000000000000000000000000|@6891,@6892,@6894,@122,@6895,I105,@1363,@6890| 6890:O1|@6896 6891:S51|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329 6892:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6893,@6598| 6893:S54|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329283129 6894:S10|5369676e617475726520 6895:S43|2068617320616c7265616479206265656e20626f756e6420696e2074686973206465636c61726174696f6e 6896:D9,280|00842f230d29291a16010e0e0e0c00021a15010e0e0c0002032429352a362a35291a0c011a11010e0e0c00036403052a68010207292503511e323b6502013b64293b1af3000c000303691af300291acf000c00021ad1000e0e0c0002032429352a362a35291ac8001acd000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aaf000c000303041ab700103b50293529351a95001a9a000e0e0e0c000303043b5002041aa30010293765021a293529351a76001a7b000c000303043b5002041a87001029376429310e0e0c0002296801332a32346b220c38220d230c220d030e2a3b3c1a6b000c0004503b5002023b502b2a340e0e7d0f0002000000000000000008010000000000000000000000000000|@6897,I105,I218,@14398,I251,@2781,@2836,@1576,I255| 6897:S29|535452554354555245535f28292e6572726f724d73674e656172283529 6898:O1|@6899 6899:D10,216|0089303030303022101ad4000e0c000729352a372b392c3a3b2211693223103b2a0c00023d2a69293b692d2a6932353c1ab5000e0e0c00030359323633382a3b1aad000e0e0c00032a3b1aa3000c0003293b1a9b000c0003293b1a9b000c000303051a9b0002242928403b1a9a000e0e0e0c00042b3c2b3b2e1a94000e0c000650291a93000c00025029643b2d2b6a2706020132292217342d220c220c680622163b2b1a7a000e0e0e0c00045022172a69221022100e0e0e7d1900020e0e0e0e0000000000000000c8000000000000000000000000000000|@6901,@6900,I251,I253,I113,I49,I11,I195,I47,I255| 6900:O2|@6902,@6301 6901:S64|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322970617373325369676e617475726542696e64283529 6902:D27,952|00853c28403b1ab7030c0004293b1ab7031abc030e0c0004503c2840321aa0030e0c0004280b28401aad031a92030e0e0e0c0004293b401a96030e0e0e0c0004503c2a693c28402b1a75030e0e0c0004291a840369280b28403b1a63030c0004293b401a6a030e0e0e0c0004503c2a693c28402b1a49030e0e0c0004293b690404002212353b1a57030c000303482212362213370406002b22132c3b1a49032e221b22182214221d2212220f221f221f121d0001000100221f1a34030e0c00115029352a362b382c39302d452c462b472a482608029a2212353d1a03030c0003034722123629352a362b372c382d392c2b2d2c31221a1aef02221f221c2218222122162213222322231221000100010022231ae3020c0012302a35452a36462a38472a3948260802472212362213372214380406002c2c2c22161aab022e2219221d221a12190001000100221722202215221222221aa8020e0c00105029352a362b382c39312d452c462b472a48260929352a362b372c382c3b1a8b021a90020e0c00043c284022181a34020e0c00043c28402c1a29020e0e0c00040402003b2a2213221c221130301a6c020e0c00085029352a36293b1a26020e0e0e0c000303051a5b0202903b2a291a5b020c00021a5d020e0e0c0002031729362b3c1a57020c0003292b25042504511e223b6502012a65291a49021a4e020e0e0e0c000303041a4b02103b503b502928403b1aaf010c00043b2c293b1ac5010e0e0c000303043b50022629352a362d2d2c1aa0010e0c0004502c3c1afe010e0e0e0c0003292b2505250526031e32260351291a07020c00025029652b3b1a84010e0c000303051abb0102903b2c291abb010c00021abd010e0e0c0002031729362b3c1ab7010c0003292b25042504511e223b6502012a65291aa9011aae010e0e0e0c000303041aab01103b503b502928403b1a0f010c00043b2e293b1a25010e0e0c000303043b50022629352a362d2d2c1a00010e0c0004502c3c1a5e010e0e0e0c0003292b2505250526031e32260351291a67010c00025029651a6601221d2c22206b2b1a64010e0c00022b1a5c010e0c00022a2a1a5b010c0003290304220c02071a5601220d2e6a2210353c1ab3000c000303592210362211382a3b1a43010c00032a3b1a3b010c0003293b1a33010c0003293b1a1b010c000303051ac30002242928403b1a5a000e0e0e0c00042b3c2b3b2e1a14010e0c000650291adb000c00025029643b2d2b6a2706020222102922113422122e22286806271d1f060e0e0e0e0000000000000000a8030000000000000000000000000000|@6904,I11,@6905,I255,@836,I251,I48,@6956,@6957,@7021,@8362,@1633,@8367,I49,I105,I218,I106,72057594037927935,I231,@3441,I47,@8390,I15,I113,@6903,I253,I195| 6903:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 6904:S22|5349474e41545552455328292e73696756616c283629 6905:O1|@6906 6906:D34,808|00802b363c1a28030e0c000303051a27030fdc2b3529353b1a25030e0e0c00036407dd2b3529362d363c1a1b030c00032a2a691a1a033b1a1e030e0e0e0c00032a2a0e0e0e0c00026429353b1af1020e0e0c000303932939291a04030e0c00021a05030e0e0c0002035f29361af1020e0e0c00021af1020e0e0c000203482935353e1abb020c000303312935362928281aad020e0e0c000303033c021b29287b1a9d020e0e0c000303033c020b29285b1a8d020e0e0c00036402013b1aa9020e0e0c000202013b02013b03192a1aa002691aa4022a691aa7022a693b3e3c3b2d68056602012a64020129293b6902021e021a94022a691a97022a693b3c3b020208003b2d680527090fdd2b363c1a20020e0c000303051a7f020fdd2b3529353c1a1d020e0e0c00036407dd2b3529362d363c1a13020c00032a2a691a62023b1a16020e0e0e0c00032a2a0e0e0e0c00026429353b1ae9010e0e0c000303972939291afc010e0c00021afd010e0e0c0002035f29361ae9010e0e0c00021ae9010e0e0c000203482935353e1ab3010c000303312935362928281aa5010e0e0c000303033c021b29287b1a95010e0e0c000303033c020b29285b1a85010e0e0c00036402013b1aa1010e0e0c000202013b02013b031d2a1a9801691a9c012a691a9f012a693b3e020226013c3b2d68056602012a6402012902021501293b691aa8012a691aab012a02020c00693b3c3b3b2d680527090fdd2b363c1a14010e0c000303051a93010fdd2b3529353d1a11010e0e0c00036403051a860102d32b363c1aee000e0e0e0c000303051a7b0102c02b3529362a372e363c1aed000e0e0c0003293b1acb000c000303051a63010276293c1ad4000e0c00032c2a691ad2003b1ad6000e0e0e0c00032a2a0e0e0e0c0002642c3c1ab2000e0e0e0c00032e2a691a36013b1ab2000e0e0e0c00031a31012a0e0c0002642a2a0e0e0c000264291a2701691a2b012a691a2e012a691a31012a691a34012a69312a691a34012a691a37012a69270d1a38012a693b3c3b3b2d680502021a00293b691a2d012a691a30012a69020209003b3c3b3b2d6805270a42000000000000000018030000000000000000000000000000|@6908,I234,@1338,I251,I107,@14441,I253,I105,I218,@900,@901,@873,@871,@6911,@1338,@14301,@871,@6918,@1338,@6925,@1338,@884,@14442,@6943,@887,@871,@6946,@871,@872,@871,@6948,@899,@871,@6907| 6907:O5|0,0,0,@6951,@6950 6908:S11|7072696e742d7661724964 6909:O1|@6910 6910:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 6911:O5|0,0,0,@6913,@6912 6912:O2|@6916,0 6913:O2|@6914,0 6914:O2|0,@6915 6915:O5|@6310,463,463,0,0 6916:O2|3,@6917 6917:S8|46726565536c6f74 6918:O5|0,0,0,@6920,@6919 6919:O2|@6923,0 6920:O2|@6921,0 6921:O2|0,@6922 6922:O5|@6310,461,461,0,0 6923:O2|3,@6924 6924:S10|53686172656457697468 6925:O5|0,0,0,@6927,@6926 6926:O2|@6930,0 6927:O2|@6928,0 6928:O2|0,@6929 6929:O5|@6310,464,464,0,0 6930:O2|3,@6931 6931:S5|556e736574 6932:O1|@6933 6933:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@93,@6934| 6934:D6,88|00802b365617362d352b3b1a52000e0e0e0c000303051a4f0002092b2a2c1a4f000c0004291a50000e0c00021a51002a693b3c3b3b2d68052706420e0e0e0e0e000000000000000048000000000000000000000000000000|@4355,I232,@6936,@6937,@6940,@6935| 6935:O2|3,91 6936:O2|@97,0 6937:O1|@6938 6938:D11,160|00822c1aa2000e0e0e0c00021aa1000e0e0c000203702c352d36293b1a99000e0e0c000303202f3b1a95000e0e0c000303051a9300020d2a30692e0e0e0c0002293b6964023d2f3b1a75000e0e0c000303051a7b00022c2a30692e0e0e0c0002303c1a73000c0003292c311a72000e0e0e0c00041a71002a691a74002a692d2a6927056502013b44000000000000000090000000000000000000000000000000|@6939,I105,I218,I251,I113,@6936,@6936,I107,@6937,@174,@175| 6939:S21|7072696e745f6c697374283329706c697374283229 6940:O1|@6941 6941:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@6942,I105,I218,@6940,@4364| 6942:S6|402832292829 6943:O4|0,@6944,3,1 6944:O1|@6945 6945:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@595,@14296,I253| 6946:O2|3,@6947 6947:S14|6465736372697074696f6e73203d 6948:O2|3,@6949 6949:S9|626f756e644964203d 6950:O2|@6954,0 6951:O2|@6952,0 6952:O2|0,@6953 6953:O5|@6310,462,462,0,0 6954:O2|3,@6955 6955:S12|5661726961626c65536c6f74 6956:O2|@6958,@6957 6957:O2|@8325,@6956 6958:D28,560|008f7881453c28403b1a2c020e0c0004280b28403b1a20020e0c0004293b401a1e020e0e0e0c0004503c28402b1a08020e0c00043c28401a0e021afb010c00043c2a2e2d6b2704053a0e00ff6d29353f1afd010e0e0c00030323403c1af9010e0e0c00031af9012a1afd010e0e0c00031afd011a02022b1a06026b65103b503b502910040d002a2a1afd010e0e0c00035029372a382b392c3a2d23062e23082f230930230a31230b32230c1ae2013330221a221f221b68061add013330221b2220221c68061ad8012e2d221c2221221d68061ad3011ad8012d2d220e220e220e1ad501220f220f33220f220f680d2221221f2a1aca010e0e0e0c00021ac9010e0e0c0002035c2a352b362a2c222522222227222322172214222c22152212221a221a2218221322182231222e222e222e222e222e2226221b221f221f222e2233223322331233000100010022291a80010e0c00212a2a2505250526031e6a3b66020129653b222169221c23103b2a0e0e0e0c00023d2a69293b692d2a6922203b1a55010e0e0c00033b22222222222122211a4c010e0c00062218353c1ab1000e0e0c000303592218362219382a3b1a27010c00032a3b1a1f010c0003293b1a17010c0003293b1a1f010c000303051a1f0102242928403b1a5e000e0e0e0c00042b3c2b3b2e1a10010e0c000650291a0f010c00025029643b2d2b6a27060202221822262a451a0001463b472d482b492c4a271a1f100e0e0e000000000000000020020000000000000000000000000000|@6960,I11,I255,@6961,I251,@243,@6963,@122,@14322,@596,@6964,@1571,@6965,@6982,@6987,@6992,@6997,@7002,I105,I218,@7007,I253,@6959,I113,I49,I195,I47,I48| 6959:O1|@8321 6960:S36|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529 6961:O1|@6962 6962:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 6963:S16|486173685461626c652e686173683a20 6964:O5|@1608,88,0,88,0 6965:D5,64|00802b352c362a2a1a3d0056576956581a3d001a42005689569a56ab1a4100220d0e0e7b0b05000a000000000000000030000000000000000000000000000000|@6967,@6968,@6970,@6971,@6966| 6966:O1|@6974 6967:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283129283129 6968:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 6969:S54|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e7465722836292d45 6970:S5|56616c7565 6971:O1|@6972 6972:D1,32|00802b39420e0e0e000000000000000010000000000000000000000000000000|@6973| 6973:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529737472756374456e762d283129 6974:D9,216|008833310e0c0002293b1ad3000c0003030a3434342e0e0e7e0c00031ac9002f6934310e0e0c000229293b1ab2000e0e0e0c0003030330021d29352a362a353b1a9d000e0e0c000303042a360207292503511e293b6564331a95001a9a000e0e0e0c00032922101a8e000e0e0e0c0003291a8c001a81000e0e0c00033e2a69291a85000e0e0c000203041a8300103b503b50293b693b3b3b3b2d6805291a68000e0c000203041a6700103b503b50220c3c33322d1a610022110e0e7b071500060000000000000000c8000000000000000000000000000000|@6976,I251,@6977,@4525,@122,@6979,I105,@1363,@6975| 6975:O1|@6980 6976:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629 6977:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6978,@6611| 6978:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629283129 6979:S39|2920697320616c72656164792070726573656e7420696e2074686973207369676e61747572652e 6980:D9,280|00842f230d29291a16010e0e0e0c00021a15010e0e0c0002032429352a362a35291a0c011a11010e0e0c00036403052a68010207292503511e323b6502013b64293b1af3000c000303691af300291acf000c00021ad1000e0e0c0002032429352a362a35291ac8001acd000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aaf000c000303041ab700103b50293529351a95001a9a000e0e0e0c000303043b5002041aa30010293765021a293529351a76001a7b000c000303043b5002041a87001029376429310e0e0c0002296801332a32346b220c38220d230c220d030e2a3b3c1a6b000c0004503b5002023b502b2a340e0e7d0f0002000000000000000008010000000000000000000000000000|@6981,I105,I218,@14398,I251,@2781,@2836,@1576,I255| 6981:S28|5349474e41545552455328292e6572726f724d73674e656172283529 6982:D5,64|00802b352c362a2a1a3d0056576956581a3d001a42005689569a56ab1a4100220d0e0e7b0b05000a000000000000000030000000000000000000000000000000|@6967,@6984,@6985,@6983,@6966| 6983:O1|@6986 6984:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 6985:S4|54797065 6986:D1,32|00802b3529366442000000000000000010000000000000000000000000000000|@3632| 6987:D5,64|00802b352c362a2a1a3d0056576956581a3d001a42005689569a56ab1a4100220d0e0e7b0b05000a000000000000000030000000000000000000000000000000|@6967,@6989,@6990,@6988,@6966| 6988:O1|@6991 6989:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 6990:S9|537472756374757265 6991:D1,32|00802b38420e0e0e000000000000000010000000000000000000000000000000|@6973| 6992:O1|@6993 6993:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@6973,@6994| 6994:O4|@14322,@596,@6996,@6995 6995:O5|@6310,989,0,989,0 6996:S28|456e746572696e672066697869747920696e207369676e6174757265 6997:O1|@6998 6998:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@6973,@6999| 6999:O4|@14322,@596,@7001,@7000 7000:O5|@6310,990,0,990,0 7001:S31|456e746572696e67207369676e617475726520696e207369676e6174757265 7002:O1|@7003 7003:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@6973,@7004| 7004:O4|@14322,@596,@7006,@7005 7005:O5|@6310,991,0,991,0 7006:S29|456e746572696e672066756e63746f7220696e207369676e6174757265 7007:O1|@7008 7008:D55,1576|009f2221350a05005600a601370104010c00000422213622212a221c221c221c221a22102210221f221f2225221f221f221f2216222e222d22222222222222222222221d221d221d221d223a2239221f1add0522200e0e7b1f23001e0fd32221363c284022231acf050c00041ad105221e221e2223222322232f68070403003b2a1ac4050e0c00035029352a362b37222023081aba052a22222d6b2222230c1ab6052a22236a1ab7051abc05333122252225222b1ab90533222822282228220c680d1ab305221a221d221d2220222268061aac05221a221d221f6b220d2b2d222d2d1aa3050c00061aa505221b22292230223022302213680729220c0e0c0002220f3b1a920522157e3300032221362222372223382b2b2b6a29220f2224222522242219221922182218221b1a71050202d5040e0e0c000b50222427040fdb2221362922222a1a5f050c00021a61050e0e0c000203542a352b362a2c2220222022202213221322222222222822232223222322192231223022252225222522252225222022202220222e2221223c222b2223223d1a21050e0e0c001f2a2a2505250526031e5f3b66020129660fcd2221362222372223382a352b361a020522272223306b2c1ae0040e0c00021ae1040e0e0c000203232c35291aec04222122212e2225680522251ae6040e0e0e0c00043d2a1ae3046a6502031adc043b2c69222423103b2a0c00023d2a69293b692d2a69321acb041ad0040202ec030e0c000303033c0222321a7f040c00021a81040e0e0c00020310323b1aa5043b280c1aaf040c000602013b03033c0fdb321aa8041a95040e0e0c000303033c0226321a47040c00021a49040e0e0c00020314323b1a85043b280d1a770402028b030c000602013b03033c0fda321a74041a59040e0e0c000303033c0222321a0b040c00021a0d040e0e0c00020310323b1a51043b280b1a3b040c000602013b03033c02ab321a44041a21040e0e0c000303033c0222321ad3030c00021ad5030e0e0c00020310323b1a21043b401a04040e0c000602013b03033c0273321a14041ae9030e0e0c000303033c0226321a9b030c00021a9d030e0e0c00020314323b1af1033b280b1acb03020242000c000602013b03033c0237321ae0031aad030e0e0c000303033c0226321a5f030c00021a61030e0e0c00020314323b1abd033b401a9003020207000e0c000602013b035f1ab003331ab4030e0c0003291ab4031aa9030e0e0c00031ab1032231693e2b69291a17030c000203041aa703103b503b50293b693b3b3b3b2d6805291afc020e0c000203041a8b03103b503b50222f3c2e22152d1a84030e0c0006260702023b503b222e69333b2b332e3b3b6807342a1a7003222d69222c1a70031a75032233223322331a74030e0c000a50222f3c1a710322130e0e0e7e3100032221362222372223382a352b362a1a5f031acc020e0c000303033c02222a1a7f020c00021a81020e0e0c000203102a3b1a3d033b280c1aaf020c000602013b03033c0fd72a1a30031a95020e0e0c000303033c02222a1a47020c00021a49020e0e0c000203102a3b1a0d033b280d1a77020c000602013b03033c02a72a1a00031a5d020e0e0c000303033c02222a1a0f020c00021a11020e0e0c000203102a3b1add023b280b1a3f020c000602013b03033c026f2a1ad0021a25020e0e0c000303033c02222a1ad7010c00021ad9010e0e0c000203102a3b1aad023b401a08020e0c000602013b03033c02372a1aa0021aed010e0e0c000303033c02262a1a9f010c00021aa1010e0e0c000203142a3b1a7d023b280b1acf01020206000c000602013b035f1a70022b1af4010e0c0003291a6c021ae9010e0e0c00031a69022229693e2b69291a57010c000203041ae701103b503b50293b693b3b3b3b2d6805291a3c010e0c000203041acb01103b503b5022273c2e220d2d1ac4010e0c0006270602013b2c1a270222202220222b22272225680622241a2e010e0e0e0c00043b2c69222423103b2a0c00023d2a69293b692d2a692f1aff011a04021a09020e0e0c00043b222f69343d2b2d2f3b3b6807220c2a1af901222e69222d1a71011a76012234223422341a75010e0e0c000a5022303c1a710122140e0e0e7e3200031f200e0e0e0e0e0e000000000000000018060000000000000000000000000000|@7010,@7011,I11,@7045,@5990,@7048,@7049,@6992,@6997,@7002,@7050,@7055,@7076,@8191,I253,@8196,I105,I218,@8280,@8299,@8303,@7306,@7393,@460,I251,I154,@678,@868,@876,@7370,@6331,@8306,@122,@8307,@8308,@1363,@6975,@8309,@6970,@6971,@6966,I106,@460,@678,@868,@876,@7370,@8306,@8307,@8310,@8311,@8316,@8319,@1416,@7009| 7009:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 7010:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329 7011:O1|@7012 7012:D18,496|009c221d1af1010e0e0c00021af1010e0e0c000207dd221d35221e362a362b382935222123081adf012a22236a2223230c1adc012a22246a1add01222622246a1add011ae201222422242224222422241add01343222272227220d680d221c321ad5010e0e0c000329282e1aca010e0e0e0c000331353b1ac6010e0e0e0c0003033f313632370406002b2f2c3b302e222522252225222522252225222522252225222522300c00115029352a362b372c382d392e3a2e2e2e2e2e2e68062709028231353d1a79010e0e0c00030336313629352a362b372c382d392c2b2d2c31220d220c22292229222922292229222922290202dc0022292229222922290c00122706023f3136323733380406002c2c2c32312e221f222722272221222822282228222822281a20010e0c00105029352a362b372c382d392e3a2e2e2e2e2e2e6806270a222c3c1a07010c000329220e222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d222d1ad0000e0c001e3b221569221f23103b2a0e0e0e0c00023d2a69293b692d2a693b22356922142a342d6b22152a1aab00221d6922351aab001ab000222d2222222e1aaf000c000a3227190202221e1f1d0e0e0e0000000000000000e0010000000000000000000000000000|@7014,I105,I218,@7015,@7016,@7017,@6992,@6997,@7002,@122,I251,@7021,I106,@7011,@7013,@6990,@6988,@6966| 7013:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 7014:S59|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332970537472756374283229 7015:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7016:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7017:D3,80|00803b56180c0002561723093b2a0e0e0e0c000264293b1a3e000e0e0e0c000303032a020b2a2a1a36002f0e7e05000365420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@7019,I251,@7018| 7018:O1|@7020 7019:S69|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329705374727563742832296e6577456e762d283129 7020:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7018| 7021:O1|@7022 7022:D27,600|008e040600343a22122a0e0e0e0c000264293b1a4a020e0e0e0c000303751a470222131a4a020e0e0e0c0003291a48021a3d020e0e0c00031a4502220e693e2b69291a43020c000203041a4302103b503b50293b693b3b3b3b2d6805291a28020e0c000203041a2702103b503b5022103c2e221a2d1a20020e0c000650302210451a1c02463b473b481a1c02493b4a2607021629352b2a35452a36462a37472a38482a39492a3a4a512a352b362c372d382e392f3a22163b2d1af4010e0c000450220e3b1af1010e0e0c00032d1af001221722122212221222121aeb010c0008293b1a7b010c000303051ae30102903b2a291a93010c00021add010e0e0c0002031729362b3c1ad7010c0003292b25042504511e223b6502012a65291ac9011ace010e0e0e0c000303041acb01103b503b502928403b1ac7010c00043b2c293b1a1d010e0e0c000303043b50022629352a362d2d2c1a58010e0c0004502c3c1a7e010e0e0e0c0003292b2505250526031e32260351291a8f010c00025029652c2c1a8c010e0c000303033c02172f1af7000c00021a41010e0e0c00021a39010e0e0c000203032d020f1a6c01220e2b2f6b1a6c012f2b6a6422123b1afa000e0e0e0c000333353c1a96000e0e0e0c00030359333634382a3b1add000e0e0c00032a3b1ad3000c0003293b1acb000c0003293b1a1b010c000303051ad30002242928403b1afa000e0e0e0c00042b3c2b3b2e1a14010e0c000650291aeb000c00025029643b2d2b6a270602013322192a4534463b4732482c492b4a270e1f0f0e0e000000000000000048020000000000000000000000000000|@7024,I251,@7025,@122,@7026,@7027,I105,@1363,@6975,@6305,@6300,I255,I253,@7029,@7032,I49,I218,I106,72057594037927935,I231,@3441,I11,I47,I113,@7043,@7023,I195| 7023:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 7024:S44|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529 7025:S11|5369676e61747572652028 7026:S23|2920686173206e6f74206265656e206465636c61726564 7027:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 7028:S31|5349474e41545552455328292e676976654572726f72283329283129283129 7029:O1|@7030 7030:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@7031| 7031:S49|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529762d283129 7032:O1|@7033 7033:D16,352|0086311a62010e0e0e0c00021a61010e0e0c000207d9313532362a3629353b1a56010e0e0e0c000303043b5002041a4f01103b5029362a382b392e372f3629353d1a34010e0c000303041a3b01103b503b5029353b1a20010e0c00030322293729353c1a12010e0e0e0c0003030d2936293b1a1b010c0003640202293664020d2936293b1a09010e0e0c0003642b352c362d3722122c1aff000c0003292c2c6a22133b1aea000e0e0e0c000322143b1ade000e0e0e0c0003293c1ae3000c000322163b2b1ae1000e0e0c000450220d1ade002d34220f3168061adc000e0c00022e3b693e2b2b6a2e22191ad30002024e000c000322182a2c1acd000e0e0c000430221b1aba000e0e0e0c00032e6801221a2b2b1ab2000e0e0e0c00041ab10031222222176b22182a222222222222222222221aa3000c0008322a69271b02013b1f070e0e0e0e0e0e000000000000000050010000000000000000000000000000|@7035,I105,I218,I251,@7036,@1377,I253,@122,I106,I255,@473,@7039,I107,@4755,@7034,@7032| 7034:D3,80|00802b3629353b1a4e000e0e0e0c0003032129382956391a46000e0e0e0c000303065627680102082d56382e7d0500026402013b64420e0e000000000000000040000000000000000000000000000000|@7042,I251,I113| 7035:S57|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e6577496473283229 7036:O4|@14322,@596,@7038,@7037 7037:O5|@6310,778,0,778,0 7038:S28|4d617020646f6573206e6f742072657475726e20426f756e64204964 7039:O1|@7040 7040:D1,56|00802b352c362d372e382f39303a3b2c693b302b302f68052f2a2d6a2708420e000000000000000028000000000000000000000000000000|@7041| 7041:S28|5354525543545f56414c5328292e6d616b65426f756e644964283129 7042:S66|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e65774964732832296e65774d6170283129 7043:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@7044,I234,I107,I105,I218,I15,I247,@599,I253| 7044:S59|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d61704964732d6d61704964283129 7045:D8,144|00802b352c3629352a362b382c39566c3b1a84000e0c0003567c3b1a7a000e0e0e0c0003293c1a77000c0003569c3b2b1a75000e0e0c0004503b2c6930302b31313b3b6807332a1a660056e76956e81a66001a6b001212000100030012130001000400121400010005001a5b0022167b0b0e000a0e0e0e0e000000000000000080000000000000000000000000000000|@7047,I253,I106,I255,@7046,@6970,@6971,@6966| 7046:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 7047:S60|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657256616c283129 7048:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 7049:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7050:D13,288|00832c3629353c1a1e010e0e0e0c000303cb2d353b2a291a16010e0e0e0c00021a15010e0e0c0002031729362b3c1a0f010c0003292b25042504511e253b6502012a652e352f363037566b2c1af9000e0e0c0003292c2c6a568a3b1af2000e0e0e0c0003569a3b1ae6000e0e0e0c0003293c1acb000c000356ba3b2b1ad9000e0e0c000450311ad7002d221322133168061ad4000e0c00022e3b693e2b2b6a2e56f81acb000c000356f92a2c1ac9000e0e0c000430121200010002001ab1000e0e0c00032e6801121300010001002b2b1aa5000e0e0c000430271202232d352d352e362f37565b2c1a5d000e0e0c0003292c2c6a3d2f316a1a85002a2c6a2707641f040e0e0e0e0e000000000000000010010000000000000000000000000000|@7052,I251,I105,I218,I106,@122,I253,I255,@473,@7051,I107,@4755,@694| 7051:O1|@7053 7052:S58|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f636573735369672833296d616b654964283429 7053:D2,72|00802b352c362d372e382f39303a3c28402d1a3b000c00043c2a693b312b31306805302a2e6a2709420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@7054,I11| 7054:S40|5354525543545f56414c5328292e6d616b65426f756e644964576974684571557064617465283129 7055:D18,576|00802b56191a40020e0c000303912b56170c0002293629353d1a34020e0c000303262937291a30021a35021a3a020e0e0e0c0004293c1a17020c0003641a30022f0e0e0e7d0600022a3629353d1a00020e0c000303041a1f02103b503b5029353b1aec010e0c00030323293729353c1ade010e0e0e0c0003030e2936293b1aff01320e0e7e080003293664020f2936293b1aec01310e0e0e7e070003660fd42b56191ae3010c00032956282a1ae1010e0e0c000329353c1a96010e0e0e0c0003031e2936292c1acf010c000303041acf01103b503b50292503511e313b640201296529353e1a68010e0c000303912936293629353d1a58010e0c000303262937291aa4011aa9011a5e010e0e0e0c0004293c1a3b010c0003641a5401310e0e0e7d0800022a3629353d1a24010e0c000303041a4301103b503b5029353b1a10010e0c00030323293729353c1a02010e0e0e0c0003030e2936293b1a2301340e0e7e0a000329366402132936293b1a1001330202ad000e0e0e7e0900036602a229353b1acb000c000303043b5002041a2701103b502936293629353d1ab2000e0e0e0c000303262937291a14011a19011ab6000e0e0e0c0004293c1a93000c0003641aac00310e0e0e7d0800022a3629353d1a7c000e0c000303041a9b00103b503b5029353b1a68000e0c00030323293729353c1a5a000e0e0e0c0003030e2936293b1a7b00340e0e7e0a0003293664020f2936293b1a6800330e0e0e7e0900036665420e0e0e0e0e000000000000000030020000000000000000000000000000|@7057,I234,I251,@7058,@7061,@1720,I218,@1377,I253,I107,@4801,I231,@7063,@7066,@7068,@7070,@7073,@7056| 7056:O1|@7075 7057:S64|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332966696e64457175616c697479283129 7058:O1|@7059 7059:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7060:S37|545950455f5452454528292e747970655065726d697473457175616c697479283129283129 7061:O1|@7062 7062:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7063:O4|@14322,@596,@7065,@7064 7064:O5|@6310,493,0,493,0 7065:S20|7265616c49643a2053686172696e67206c6f6f70 7066:O1|@7067 7067:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7068:O1|@7069 7069:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7070:O4|@14322,@596,@7072,@7071 7071:O5|@6310,1261,0,1261,0 7072:S30|696e7465726e616c4d61703a204e6f7420626f756e64206f722046726565 7073:O1|@7074 7074:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7075:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 7076:O2|@7078,@7077 7077:O5|@7776,@8182,@14452,@14453,@14446 7078:D3,120|00842d23062e23082f3930230c313a32230b33373438220c35220d230a220e36220f2307221023092d2c3131220e220d221231221332220d22121a43002216680e3c3b2b22172218221622192217121700010001001a300022190e7b0b15000a000000000000000068000000000000000000000000000000|@7080,@7081,@7079| 7079:O1|@7084 7080:S30|54595045434845434b5f50415253455452454528292e7061737332283529 7081:O1|@7082 7082:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@7083| 7083:S37|54595045434845434b5f50415253455452454528292e7061737332283529656e762d283129 7084:D5,72|00881a4b0032691a4e0033692a2a693234220d342d220e22131a4400220f220f220f22171a410022110e0e7b0e0e000d000000000000000038000000000000000000000000000000|@7086,@7087,@7089,@7079,@7085| 7085:O1|@7090 7086:S45|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529 7087:D3,72|0080560723082c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@7088,I105,I218| 7088:S56|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352974797065456e762d283129 7089:D3,72|00805607230d2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@7088,I105,I218| 7090:D148,7704|008b220d3528161a161e0e0e0e0c00030326220d3629220e220e220e220e220e220e220e220e220e220e220e1af91d220f0e0e7b0e0f000d220d3528081ae01d0e0c000303041ae71d103b503b50220d3528101aca1d0e0e0e0c000303041ad71d103b503b50220d35281e1ab21d0e0e0e0c000303041ac71d103b503b50220d350a1e00481114034118940476150e0e3a1052013e00ab0a000bb50d201420083e0088143e00bb0fa91bb70bf9118f013e004a0983141a157411b00d5414b2063e00220d3629352a362b372c382d39221123062212230d2a2a691a6b1d22142217306b1a6a1d2b332c1a6c1d0e0c0005293729353e1a281d0e0c0003031129362928081a1a1d0e0e0e0c00036402013b64030b293b1a481d0e0c0003022129380402002a1a411d2b1a451d0e0e0c00045029352a36291a3f1d0c00022b27052a3a291a3b1d0c00021a3d1d0e0e0c0002032029352935293b1a351d0e0e0c0003342a692b3b2b1a2f1d0c0004503b260502023b502b2306291a051d0e0e0c00021a051d0e0e0c0002031c2935293b1aff1c0c00032d2a692b3b2b1afb1c0c0004503b260402023b50333b2d1aea1c0e0e0e0c000450343b2e1add1c0e0e0c00045022192309323b2b1acd1c0e0e0c0004502c270f0fd4220d36220e3729291a9f1c0c00021aa11c0e0e0c0002031c29352a362210352b2f692c2a69642a0c000251292503511e285102023b50501a901c650fdd220d36220e37220f382a3b692c2a693c28401a801c1a851c0e0e0c000428192b2b2f6b29221522142214221422142214221422142214221422141ad81b0e0c000d1a611c3c1a651c0e0e0c0003291a641c0e0c00023b2a3c6a3e2c2b6a2d2a1a5b1c0c0003291a041c0e0c00021a051c0e0e0c000207cb29351a491c3131221b221b1a481c0e0c000622192219221a1a431c1a481c02024c1b0e0c00052b2a0e0e0e0c000264293b691a391c2a691a3c1c2a693b3b3b3b2d6805291aaf1b0c000203041a2f1c103b503b50293b691a2c1c2a69302a691a2c1c2a690202061b1a2b1c2a693b3e3c3b2d6805291a7e1b0e0e0e0c000203041afb1b103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101ad51b020239000e0e0c001222282a1ace1b0e0e0e0c00032968013c2a2e221d6b2228382229230c2a3b3c1a1a1b0e0e0e0c0004502b2a0e0e0c0002271302013b1aa41b270e0fdd220d36220e37220f382a3b692c2a693c28401afb1a1a001b0e0c000428192b2b2f6b29221522142214221422142214221422142214221422141a541a0e0c000d1a651b3c1ae11a0e0e0c0003291ae01a0e0c00023b2a3c6a3e2c2b6a2d2a1ad71a0c0003291a801a0e0c00021a811a0e0e0c000207d229351a351b3131221b221b1ac41a0e0c000622192219221a1abf1a1ac41a0e0c00052b2a0e0e0e0c000264293b691ab91a2a691abc1a2a693b3b3b3b2d6805291a2f1a0c000203041aaf1a103b503b50293b691aac1a2a69302a691aac1a2a691adf1a2a69020281193b3e3c3b2d6805291afe190e0e0e0c000203041a7b1a103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101a551a0e0e0c001222282a1a521a02022e000e0e0e0c00032968013c2a2e221d6b2228382229230c2a3b3c1a9a190e0e0e0c0004502b2a0e0e0c0002271302013b1a241a270e0fdd220d3629352a362b372c381a321a22132211221022102213221622122212221222122212680c291a1e1a1a231a6a1a271a1a2c1a287c2e221868052e2a2c221522151a231a0c000630221722162216221622162216221622162216221622161aae180e0e0e0c000d2a1a041a0e0c000229353d1a92180e0e0e0c000303c029362a372a2d1a31190e0e0c0003291ad8180e0c00021ad9180e0e0c0002039a293522192219221a1a27191a2c190e0c00052a2a0e0e0e0c000264221a35221b36221c37221d38221e39221f3a22202306222123072222230822232309020201182224230a2225230b2226230c2227230d2228230e2229230f222a23101a12190e0e0e0c0012221e2a1a0e190e0e0e0c00032968013c2a2e22116b221e38221f230c2a3b3c1a5a180e0e0e0c0004502b2a0e0e0c0002260902023b502a6602ce3c28401a4c181a51180e0e0c000428062a1a26196a3d2d2b6a2c2a1a5c180e0c0003291a04180e0c00021a05180e0e0c000203962935221a221a221b1a53181a58180e0c00052a2a0e0e0e0c000264221b35221c36221d37221e38221f3922203a222123062222230722232308222423092225230a2226230b2227230c2228230d2229230e222a230f222b23101a42180e0e0e0c0012221f2a1a3e180e0e0e0c00032968013c2a2e22126b221f382220230c2a3b3c1a8a170e0e0e0c0004502b2a0e0e0c0002270802013b2c2705313b2b1a6e170e0e0e0c00045029270c0fdc220d36220e37220f382a221122102210221022102210221022102210221022101acf160c000d291ad8171a6d170e0e0c0003291a14170e0c00021a15170e0e0c000207d229351a19182e2d221322131a58170e0c00062211221122121a53171a58170e0c00052b2a0e0e0e0c000264293b691a4d172a691a50172a693b3b3b3b2d6805291ac3160c000203041a4317103b503b50293b691a40172a69302a691a40172a691ac3172a693b3e3c3b2d6805291a96160e0e0e0c000203041a1317103b503b50221c35221d36221e37221f3822203922213a222223060202e4152223230722242308222523092226230a2227230b2228230c2229230d222a230e222b230f222c23101ae9160e0e0c001222202a1ae61602022e000e0e0e0c00032968013c2a2e22156b2220382221230c2a3b3c1a2e160e0e0e0c0004502b2a0e0e0c0002261402023b502d221322122212221222122212221222122212221222121a90150e0c000d501a081727050fdd220d36220e37220f382b221122102210221022102210221022102210221022101a61150e0e0c000d1ae11622122210220f220f2212221522112211221122112211680c291a75161a7a166a1ac6161acb16287c2f221768052e2a2c221422141a7a160e0e0e0c00063d1ab8162f6a2a2a1ab9150e0e0c0003291a60150e0c00021a61150e0e0c0002039a29352215221522161aaf151ab4150e0c00052a2a0e0e0e0c000264221635221736221837221938221a39221b3a221c2306221d2307221e2308221f23092220230a2221230b2222230c2223230d2224230e020275142225230f222623101a9a150e0e0e0c0012221a2a1a96150e0e0e0c00032968013c2a2e220f6b221a38221b230c2a3b3c1ae2140e0e0e0c0004502b2a0e0e0c0002270802013b30270b0fdc220d36220e372a2210220f220f220f220f220f220f220f220f220f220f1a3a140e0e0e0c000d291ad0151ad5140e0e0c0003291a7c140e0c00021a7d140e0e0c000207d229351ab9152e2d221222121ac0140e0c00062210221022111abb141ac0140e0c00052b2a0e0e0e0c000264293b691ab5142a691ab8142a693b3b3b3b2d6805291a2b140c000203041aab14103b503b50293b691aa8142a69302a691aa8142a691a63152a693b3e3c3b2d6805291afe130e0e0e0c000203041a7b14103b503b50221b35221c36221d37221e38221f3922203a2221230602024c132222230722232308222423092225230a2226230b2227230c2228230d2229230e222a230f222b23101a51140e0e0c0012221f2a1a4e1402022e000e0e0e0c00032968013c2a2e22156b221f382220230c2a3b3c1a96130e0e0e0c0004502b2a0e0e0c0002261402023b503c28401a8c131a91130e0e0c000428062a1a66146a27050fd9220d361aab14220c22106a0403002a2a1aa6140e0e0e0c00035029362c291a30130e0c00021a31130e0e0c0002031d29352a362a221322132217301a83140c000650292503511e293b6502013b641a201327050fcc220d36291a15132a1af1120e0e0c00021af1120e0e0c000203992a352b362a35220d32221322112d221522112211221122150e0e0e0c000a2b1ac0120e0c00021ac1120e0e0c00021ab9120e0e0c00021ab1120e0e0c000203492922121a14140e0c0003291a94120e0c00021a95120e0e0c0002032929350402001afe132e2b22100202ee110e0e0e0c000450293522153b302c2f1aec130e0c00066602013b6402013b2c2b2507250726051ea53b2705020129660fdd220d3629352a362b372c390403003b2a1ac2130202a6110e0e0e0c00035029352a362b370403003b2a1aa9130e0e0c00035029362a370403003b2a1a97130c00035029362a373403042211020c22113c1a8a130e0e0e0c0003221b23061a85132a336a221d23081a83132a326a221f392220230d1a7e132a326a22223a2223230b2224230c222536222623071a6e13222822176a1a6e132c22172215220c332211312211322219220f220f2213680e221b1ab1112a1a8d110e0e0c00021a8d110e0e0c000203312a352b362a35222a221430222e2d2232222e222e0202de10222e22320e0e0e0c000a2b2a2506250626041e3d3b2704020129651a1013222b2219221d6b1a0e13222c22176a222c351a0b13222e22166a222e36222f23072c2b30302214221222193022192211220c22172217221b680e22221a11110e0e0c000222251a1f112a1afb100c00021afd100e0e0c0002039d2a352b362a352233221d3122372d223b223722372237223b0e0e0e0c000a2f03232b1ac9100e0e0c00021ac9100e0e0c00021ac1100e0e0c00021ab9100e0e0c000202013b03462922381a19120e0e0c0003291a98100e0c00021a99100e0e0c0002032529350402001a02122e2b22360e0e0e0c0004502935223b3b302c2f1af4110e0c00066602013b6402013b2c2b2507250726051ea73b270502012927290fca1a71110fd8220d36220e37220f381a1b122211220f220e220e2211221422102210221022102210680c291aff101a04116a1a00121a0512287c2e221668052d2a2c221322131a04110e0c00062f3b2b1a12100e0e0e0c0004502927070fdd220d36220e37220f382a221022102210221022102210221022102210221022101a730f0c000d2c1abc112210221422136b22101ab8110e0c00042a2a1aff0f0c0003291aa80f0e0c00021aa90f0e0e0c000207dc29351a9d112f2e221422141aec0f0e0c00063b1a94110202f80e0e0c00022d1b10272b22153b1a89110202e50e0e0e0c0006293b691a82112a691a85112a693b3b3b3b2d6805291a500f0e0c000203041acf0f103b503b502218221822191aa10f1aa60f0e0e0e0c0005312a0e0e0e0c000264293b691a51112a691a54112a693b3b3b3b2d68050202870e291a0b0f0c000203041a8b0f103b503b50293b691a38112a69302a691a38112a69220f2a691a37112a691a3a112a693b3e3c3b2d6805291ad50e0e0e0c000203041a530f103b503b5022253522263602027400222737222838222939222a3a222b2306222c2307222d2308222e2309222f230a2230230b2231230c2232230d2233230e2234230f223523101a290f0e0e0c001222292a1a260f0e0e0e0c00032968013c2a2e221e6b222938222a230c2a3b3c1a720e0e0e0e0c0004502b2a0e0e0c0002261c02023b502a27060fd0220d36220e37220f381a95101ada0d22122211221122112211221122112211221122112211680d291a7e101a83106a1a87101a8c10282c2e221668052d2a2c221322131afb0e0c00062935293b1a910d0e0e0c00036403051a060e0212293b6928052a1a63101a68101a6d10680564303b2b1ae40d0e0c0004502927080fcc220d3629352a362b372c38221023082211230d2a2a691a491022132216316b2a2e2b1a45100e0e0c00040402002f2a1a40100e0c0003502935291a3d101a220d0e0e0e0c000303033c0226291a730d0202e70c0c00021a710d0e0e0c00020310293b1a15103b28081a17100c000602013b03033b021d2217230d1a0d102218221c220d6b1a0b102b2d2c1a0d100e0e0c0005652c352d363b220e69221a23103b2a0e0e0c00023d2a69293b692d2a69303722122b2b6a312b2b220d2f1ae30f0c00062a2a692a291af80c02026c0c0e0c00021af50c0e0e0c0002031c29352a362227372b35292d69642a0e0c000251292503511e2d5102023b505022243822162b692a0c0002511ad80c27190fd6220d3629352a362b372c382d392e3a2211221034220f221622102213221122161a790f22120e0e7b110f0010220d361a720f220c22106a0403002a2a1add0d0e0e0c00035029362c2210221022141a5b0f0c00052d2a2a1a5a0c0e0e0e0c00021a590c0e0e0c00020314291a460c0e0e0e0c00021a450c0e0e0c000202013b03272a352b362b352c362c2b2217221334221b1a1f0f0c0007502b2a2506250626041e4b3b270402013b651a270c27060fce220d3629352a372b382c3978814b3c28403b1a1e0c0e0e0e0c0004280b28403b1a100c0202540b0e0c0004293b401aea0b0e0e0e0c0004503c28402b1af40b0e0c00043c28401ac20e1ae70b0c00043c2a2e2d6b2704053a0e00ff6d29353f1a410b0e0e0c00030323403c1aa50e0e0e0c00031aa50e2a1aa90e0e0e0c00031aa90e1aae0e2b1ab20e6b65103b503b5029107881483c28403b1a970b0c0004280b28403b1a8c0b0e0c0004293b401a6a0b0e0e0e0c0004503c28402b1a740b0e0c00043c28401a7a0e1a670b0202ab0a0c00043c2a2e2d6b2704053a0e00ff6d29353f1abd0a0e0e0c00030323403c1a210e0e0e0c00031a210e2a1a250e0e0e0c00031a250e1a2a0e2b1a2e0e6b65103b503b5029107881443c28403b1a130b0c0004280b28403b1a080b0e0c0004293b401ae60a0e0e0e0c0004503c28402b1af00a0e0c00043c28401afe0d1ae30a0c00043c2a2e2d6b2704053a0e00ff6d29353f1a3d0a0e0e0c00030323403c1aa10d0e0e0c00031aa10d2a1aa50d0e0e0c00031aa50d1aaa0d2b1aae0d6b65103b503b5029102f2214221422181ab30d0c000529291a5b0a0c00021a5d0a0e0e0c0002032129352a362a352b3630221a31341a960d0e0e0e0c000750292503511e2c3b6502013b642d3b1a860d1a8b0d0c0004313b2b1a320a0e0e0e0c0004502c3b1a7e0d1a730d0c0004313b2b1a1a0a0e0e0e0c0004502e3b1a6e0d1a5b0d0c0004313b2b1a020a0e0e0e0c0004501a000a270d0fd1220d36220e37220f382210392c2c2c2c220f2214221422132215221322132213221322131a350d0e0e0c000f501acc0927040fdc220d36220e37220f382b2b2b220d2212221222112213221122112211221122111a0d0d0e0e0c000e501a9c09660fcf220d370fcc220d36220e37220f38291a0f092210221022102210221022102210221022102210221c1ade0c0e0e0e0c000e1add0c0e0e0c0002291adc0c0e0c00023b2a2f6a2e030329020e3c28402b1a57090c00043c2a69643e2d2b6a3003032902253c28401a38091a3d09020281080e0e0c000428062a1a0e0a6a2a3b2d1a0f090c0004502965303b2b1a03090c0004502927090fcf220d36220e372a1a8008220f220f220f220f220f02024208220f220f220f220f220f221a1a630c0c000e293c1af3080c0003291af408020420081e080e0e0e0c00023b2a3c6a3e2c2b6a2e3b2b1aaa080e0e0e0c0004502927070fd1220d3629352a362b372c382c221322122212221222122212221222122212221222121a09080e0e0c000d2b221422132213221322132213221322132213221322131aea070e0e0e0c000d2d221522142214221422142214221422142214221422141aca070e0e0e0c000d2b1ad0081a6508020289070e0e0c0003291a08080e0c00021a09080e0e0c000207d229351aa50b322f221722171a4c080e0c00062215221522161a47081a4c080e0c00052b2a0e0e0e0c000264293b691a41082a691a44082a693b3b3b3b2d6805291ab70702022b070c000203041a3308103b503b50293b691a30082a69302a691a30082a691a4b0b2a693b3e3c3b2d6805291a86070e0e0e0c000203041a0308103b503b5022203522213622223722233822243922253a22262306222723072228230822292309222a230a222b230b222c230c222d230d222e230e222f230f223023101add070e0e0c001222242a1ada0702022e000e0e0e0c00032968013c2a2e22176b2224382225230c2a3b3c1a22070e0e0e0c0004502b2a0e0e0c0002261402023b502b2b1a41070e0e0c0003291ae8060e0c00021ae9060e0e0c000207db29351a950a312f221822181a2c070e0c00061a8d0a332f221922191a1c070e0c00062217221722181a17071a1c070e0c00052c2a0e0e0e0c000264293b691ac9082a691acc082a693b3b3b3b2d6805291a87060c000203041a0707103b503b50293b691ab4082a69302a691ab4082a69332a691ab4082a691a2f0a2a693b3e3c3b2d6805291a52060e0e0e0c000203041acf06103b503b5022243522253622263722273822283922293a222a2306222b2307222c2308222d2309222e230a222f230b2230230c2231230d2232230e2233230f223423101aa90602023d000e0e0c001222282a1aa2060e0e0e0c00032968013c2a2e221b6b2228382229230c2a3b3c1aee050e0e0e0c0004502b2a0e0e0c0002501ae405271602012c270a0fdb220d3629352a362b372c392c221222122212221222122212221222122212221222121a3e050e0e0e0c000d2c221322132213221322132213221322132213221322131a1e050e0e0e0c000d22141a43090c000203033b025b3c28401a85051a8a050e0e0e0c0004220f1a4f050c00020304220f020a220f1a21090e0e0c0002293e1a1f090c0003293b1a1f090c0003293b1a17090c0003293b1a0f090c000328062f2b6a312a1a62050e0e0e0c0003503b27072b1a0c060e0c000229353d1a9a040e0e0e0c0003030d29362a372a2a69296801660fdd3c2840020256041a03051a08050e0c000428062a1ade056a3c28401aef041af4040e0c000428062a1aca056a3d2a2d6a29321a00050e0c0003291aa8040e0c00021aa9040e0e0c000207cb1a8f08220e34221c221c1aed040e0e0c00061a8508220e34221d221d1adb040c0006291a7c08691ab8062a692c2a691ab8062a691a73082a693b3e3c3b2d6805291a56040e0e0e0c000203041ad304103b503b5022213522223622233722243822253922263a222723062228230722292308222a2309222b230a222c230b222d230c222e230d222f230e2230230f223102024d0023101aa9040e0e0c001222242a1aa6040e0e0e0c00032968013c2a2e22186b2225382226230c2a3b3c1af2030e0e0e0c0004502b2a02020b000e0e0c0002503b270e02072b2e69296801642706291ab5030e0e0c00021ab5030e0e0c000207dc293529352a362a301aeb030c0003291a94030e0c00021a95030e0e0c000207dc29351a9907220e34221c221c1ad7030c00061a9107220e34221d221d1ac7030c0006221b221b221c1ac3031ac8030e0c00052c2a0e0e0e0c000264293b691a75052a691a78052a693b3b3b3b2d6805291a33030c000203041ab303103b503b50293b691a60052a69302a691a60052a69332a691a60052a691a33072a693b3e3c3b2d6805291afe020e0e0e0c000203041a7b03103b503b50222835222936222a37222b38222c39222d3a222e2306222f2307223023082231230902026e002232230a2233230b2234230c2235230d2236230e2237230f2238231002023c001a4d030e0e0c0012222b2a1a4a030e0e0e0c00032968013c2a2e221f6b222c38222d230c2a3b3c1a96020e0e0e0c0004502b2a0e0e0c0002261702023b50333b2c1a7c020e0c0004502a270402031a7702270a0fcf220d36220e38220f39293c1a25020e0e0c0003291a44030e0c000229353d1ad2010e0e0e0c000303c029362a372a1a52061a6f020c0003291a18020e0c00021a19020e0e0c0002039a29352213221322141a67021a6c020e0c00052a2a0e0e0e0c00026422143522153622163722173822183922193a221a2306221b2307221c2308221d2309221e230a221f230b2220230c2221230d2222230e2223230f222423101a56020e0e0e0c001222172a1a52020e0e0e0c00032968013c2a2e220e6b2218382219230c2a3b3c1a9e010202fa000e0e0e0c0004502b2a0e0e0c0002260902023b502a6602d23c28401a8c011a91010e0e0c000428062a1a66026a3d1a81052b6a2c2a1a9a010e0e0e0c0003291a40010e0c00021a41010e0e0c0002039629352214221422151a8f011a94010e0c00052a2a0e0e0e0c000264221535221636221737221838221939221a3a221b2306221c2307221d2308221e2309221f230a2220230b2221230c2222230d2223230e2224230f222523101a7e010e0e0e0c001222182a1a7a010e0e0e0c00032968013c2a2e220f6b221938221a230c2a3b3c1ac6000e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1aaa000e0e0e0c0004502927061f0c0e0e0e0e0e0e0000000000000000081e0000000000000000000000000000|@7092,I251,@7085,@7093,@7097,@7100,@7103,@7111,@7112,@7140,@7160,@1414,@7142,I105,I218,I253,I255,@1444,@588,I11,@7162,@6634,@7165,@1326,@7167,@7168,@7171,@7172,@2241,@7193,@1363,@871,@871,@7195,@7107,@6655,@426,@7197,@7167,@7199,@7201,@6773,@7378,@7386,@7387,@7339,@1435,79992,@7388,@7389,@956,@7391,@7392,@7387,@7393,@7394,@7395,@7397,@6133,@7399,@7410,@3597,@7104,@5990,I106,@7419,@7420,@7421,@7422,@7427,@7429,@7431,@7432,@7433,@7434,@7387,@7435,@7306,@7325,@1330,@1469,@871,@7326,@2241,@7193,@871,@871,@871,@7328,@7437,@6656,@7332,@7337,@7338,@1028,@1026,@423,@7439,@7218,@1357,I48,I154,@7440,@6990,@7116,@7441,@7451,@7580,@7581,@7585,@7588,@243,@6963,@122,@14322,@596,@6964,@7590,@7592,@7594,@7597,@7613,@1633,@7616,@7618,@7620,@7713,@7755,@6624,@6572,@7757,@7759,@7760,@7762,@7763,@7764,@7747,I152,I245,I242,@7685,@7766,@7767,@7091,@7685,@7766,@7091,@500| 7091:O2|3,@7775 7092:S57|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229 7093:O4|@14322,@596,@7095,@7094 7094:O5|@7096,1406,0,1406,0 7095:S28|61737369676e54797065733a20656d7074797472656520666f756e64 7096:S53|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f54595045434845434b5f5041525345545245452e736d6c 7097:O4|@14322,@596,@7099,@7098 7098:O5|@7096,1403,0,1403,0 7099:S34|61737369676e54797065733a206c617965726564207061747465726e20666f756e64 7100:O4|@14322,@596,@7102,@7101 7101:O5|@7096,1400,0,1400,0 7102:S27|61737369676e54797065733a2077696c646361726420666f756e64 7103:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7104:O1|@7106 7105:S45|54595045434845434b5f50415253455452454528292e7061737332283529676976654572726f72283329283129 7106:D6,200|00842f353036313732383339343a220c2306220d2307220e2308220f23092210230a2211230b2212230c2213230d2214230e2215230f221623101a93000c00123e2d69291a91000e0e0c000203041a8f00103b503b50293b693b3b3b3b2d6805291a74000e0c000203041a7300103b503b50312d1a71000e0e0c0003296801342a2d220c6b220d38220e230c220e03112a3b3c1a5a000e0e0e0c0004503b5002023b502b2a220c0e7d1000020e0e0e0e0000000000000000b8000000000000000000000000000000|@7108,@7107,I105,@1363,@6655,I255| 7107:O1|@7109 7108:S30|5052494e545f50415253455452454528292e6572726f724e656172283529 7109:D8,232|00902e291ae9000e0e0c00021ae9000e0e0c0002032429352a362a35291ae0001ae5000e0e0c00036403052a68010207292503511e313b6502013b64293b1ac7000c000303691ac700291aa3000c00021aa5000e0e0c0002032429352a362a35291a9c001aa1000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a83000c000303041a8b00103b50293529351a69001a6e000e0e0e0c000303043b5002041a770010293765021a293529351a4a001a4f000c000303043b5002041a5b0010293764641f110e0e0e0e0000000000000000d8000000000000000000000000000000|@7110,I105,I218,@14398,I251,@2781,@2836,@1576| 7110:S21|4c45585f28292e6572726f72446570746828313729 7111:S20|56616c7565206f7220636f6e7374727563746f72 7112:O1|@7113 7113:D21,512|00832d352e360402002f2a1afa010e0e0e0c00035029352a362a1af3011af8010e0c000303033c02222a1af3010c00021af5010e0e0c000203102a3b1ad1013b28081aeb010c000602013b0309292e0e0e0c00020fda1adf012d2c331ae1010e0e0c0005291ab8010e0c00021ab9010e0e0c000207d5293529372a382a352b392b291a9b010c00021a9d010e0e0c0002031f29352a362a353b1a7c010e0c000303052a68010207292503511e2a3b6502013b64291a69010e0e0c00021a69010e0e0c00020311293529353b1a4a010e0e0e0c00036402013b030d293529363e2a69293b696602013b040d002d2a1a58010e0c000350292306332a0e0e0e0c0002293b1a13010c000303033b0248293529352a362b372c382d391a3401220c691a360122142b6a2c1a36012b1a3a0102022b000e0e0e0c00043030302c303b3b6807292214220f1a270102020c000c0004296801270b270a02031a1c0164293b1ab6000e0e0e0c00030378341a12011a17010c0003292c1a0f010c0003291a10011a05010e0e0c00032e1a84001a89000e0e0c000303033c02222e1a83000c00021a85000e0e0c000203102e3b1a61003b28081a7b000c000602013b03051a5000020a1ad3002f1abf000c00032a2a1ab7000c00032704320e0e0c0002501ac0000202293527061f040000000000000000f0010000000000000000000000000000|@7115,@1357,I48,I251,I105,I218,I154,@6990,@7116,@1571,@7122,@7124,@7130,@1416,@7132,@7139,@4525,@122,@7026,@7114,@6380| 7114:S14|20696e2073747275637475726520 7115:S26|56414c55455f4f505328292e6c6f6f6b757056616c7565283429 7116:O1|@7117 7117:D22,648|00830402002d2a1a86020e0e0e0c00035029352a362a1a7f021a84020e0c000303033c02222a1a7f020c00021a81020e0e0c000203102a3b1a5d023b28081a77020c000602013b030929310e0e0c00020fdc1a6b02312c311a6d020e0e0c0005291a44020e0c00021a45020e0e0c000207cf293529372a382a352b392c3a040d002c2a1a4a020e0e0e0c00035029230c2e291a13020c00021a15020e0e0c0002031f29352a362a353b1af4010e0c000303052a68010207292503511e2a3b6502013b64291ae1010e0e0c00021ae1010e0e0c00020311293529353b1ac2010e0e0e0c00036402013b030d293529363e2a69293b696602013b342c0e0e0e0c0002293b1a9b010c000303033b02ce293529352a362b372c382a352b362c382d391ab6012a22116a2d353c1a74010202b1000e0c0003035d2d362e382a3b1aa10102029c000e0e0c00032a3b1a93010c0003293b1a8b010c0003293b1a8b010c000303051a8b0102242928403b1a8a010e0e0e0c00042b3c2b3b2e1a84010e0c000650291a83010c00025029643b2d2b6a270602012d292e3b2f2e2215680632353b1afd000e0e0c0003030a32363f2a22196a64020132313b1ae6000e0e0e0c00030304220e020a220e321a44010e0c0003220c2b2d2c6b296801270f270b02013b64293b1aba000e0e0e0c00030376321a26011a2b010c0003292c1a23010c0003291a24011a19010e0e0c00032e1a88001a8d000e0e0c000303033c02222e1a87000c00021a89000e0e0c000203102e3b1a65003b28081a7f000c000602013b03051a5400020a1ae7002f1ad3000c00032a2a1acb000c00032704300e0e0c0002503b020629352968016427041f040e0e000000000000000078020000000000000000000000000000|@7119,@1357,I48,I251,I105,I218,I154,@6990,@7116,@1571,@7120,I253,I113,I49,I11,I195,I47,@7118,@4525,@122,@7026,@7114| 7118:O1|@7121 7119:S30|56414c55455f4f505328292e6c6f6f6b7570537472756374757265283429 7120:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 7121:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7118| 7122:D2,64|00802b3629353b1a3e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000000000000030000000000000000000000000000000|@7123,I251| 7123:S41|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70794964283129 7124:D4,72|00801a4b005617690403002d56381a47002d3b2e1a49000e0e0c00075029352a362b372b2b2b6a2705420e0e0e0e0e0e000000000000000038000000000000000000000000000000|@7126,@7127,@7125,@1551| 7125:O1|@7129 7126:S46|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129 7127:D2,48|00805607282e1a2f000c0003292d1a27002e0e0e7e040003000000000000000020000000000000000000000000000000|@7128,@122| 7128:S49|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129283129 7129:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7128| 7130:O1|@7131 7131:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7126| 7132:O1|@7133 7133:D4,160|00822d3729353c1a9e000e0e0e0c0003033329362f353036313832393c2e692a3b1a84000e0c0003030332020b322b1a7e000e0e0e0c00032e2e2c2f2d3b3b68072707024129353b1a5d000e0e0c0003033329362f353036313832393f2e346a2a3b1a43000c0003030332020b322b1a46000e0e0e0c00032e2e2c2f2d3b3b6807270702012e6444000000000000000090000000000000000000000000000000|@7135,I251,@7136,@7134| 7134:O1|@7138 7135:S28|56414c55455f4f505328292e6d6b53656c6563746564566172283329 7136:O1|@7137 7137:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7136| 7138:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7134| 7139:O1|@6380 7140:O1|@7141 7141:D19,384|00812c3729353e1a7e010e0e0e0c0003031129362928081a6e010e0e0e0c00036402013b6407de2c352d381a62013b1a66010e0e0e0c00032b1a64010e0c0003291a64010e0c00022f03202b353d1a37010c000303043b5002041a5301102b37291a54010e0c00026402512b353d1a17010c000303452b3629353e1a0a010e0e0e0c000303152936291a34010e0c00021a35010e0e0c00026402013b0311293629352936291a10010e0c0002660209291a05010e0e0c00026402012b293528061ac5000e0e0c000303043b5002041aff001029362b1ae8000e0c00021ae9000e0e0c0002030d2b36293b1a9b000c00036402013b03112b35293528053b2b2d3b680565022640003c28401acb001ad0000e0c000428062a1ace006a3f2e692b3b2b1acc000e0c0004502a661aca002a2c6a040200302b2b1ac6000e0e0e0c0004502935270902202c380402002a1ab8002b1aac000e0c00045029352a36291aaf000c00022b270543000000000000000070010000000000000000000000000000|@7143,I251,@14443,I253,@7144,@7147,@7149,@1435,I105,I218,@7152,@588,I11,79992,I255,@7155,@1414,@7157,@7142| 7142:O1|@7159 7143:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296f7665726c6f616454797065283229 7144:O1|@7145 7145:D8,184|00812c1aba000e0e0e0c00021ab9000e0e0c000203822c352d362a352b362c37302c1aab000c000303033c024a301a8f000c00021a91000e0e0c000203142b1a7e000e0e0e0c00021a7d000e0e0c000202013b0321303b2d3b2808301a79000e0e0c00021a79000e0e0c00031a79000e0e0c000602013b03112a2a692d321a6f000c00032a2a6965020a2c311a6100327e090003270502013b430e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@7146,I105,I218,I251,I223,I239,I154,@7144| 7146:S42|5052494e545f5441424c4528292e6765744f7665726c6f6164732831297365617263684c697374283129 7147:O1|@7148 7148:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@7147| 7149:O4|@14322,@596,@7151,@7150 7150:O5|@1349,2522,0,2522,0 7151:S26|676574526573756c74202d206e6f7420612066756e6374696f6e 7152:O4|@14322,@596,@7154,@7153 7153:O5|@1349,2537,0,2537,0 7154:S42|67656e6572616c6973654f7665726c6f6164202d20617267206973206e6f742061207479706520766172 7155:D2,56|00802b352956281a36000e0e0e0c00036403065607680102013b420e0e0e0e0e000000000000000028000000000000000000000000000000|@7156,I251| 7156:S38|545950455f5452454528292e67656e6572616c6973654f7665726c6f6164283329742d283129 7157:O1|@7158 7158:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 7159:D6,136|00802b1a8a000e0e0e0c00021a89000e0e0c000203512b352c362a352b362936293f1a7b000c0003293b1a7b000c0003641a64000e0c00022b36293c1a61000e0e0c0003293b1a5f000c0003641a48000e0c00022e2c2b6a301a54000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,I243,I251,@7142| 7160:O1|@7161 7161:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 7162:O2|@7164,@7163 7163:O2|@7164,0 7164:O5|5,0,@438,@437,0 7165:O1|@7166 7166:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@7165| 7167:S10|417267756d656e74733a 7168:O1|@7169 7169:D11,208|00842c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2212230f221323101a9e000e0e0e0c00123e3169291a99000e0e0c000203041a9700103b503b50302b1a95000e0e0c00033b1a94000e0c0002311b10272b323b1a8e000e0e0e0c0006293b691a8a002a691a8d002a691a90002a692f2a691a90002a69322a693b3e3b3b2d6805291a40000e0c000203041a3f00103b503b5029270d1f050e0e0e0e0e0000000000000000c0000000000000000000000000000000|@7170,@7107,I105,@1363,@6655,@1330,@1469,@871,@2205,@871,@871| 7170:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283529 7171:S5|756e696679 7172:O2|@7173,@1469 7173:D2,40|00831a2b002d56272e31680529641f04000000000000000018000000000000000000000000000000|@7175,@7174| 7174:D23,448|00802b353c1ac0010e0c000307cc2b362c372d382e391ab70156591aba010e0e0e0c00033e2a69291ab5010e0e0c000203041ab301103b503b502e567a2e56981aad010e0e0c000556791aab011a78010e0c000303033c022a56791a82010e0e0e0c00021a99010e0e0c0002031456793b1a84013b280d1a8e010e0e0e0c000602013b03051a880102031a8b013e2a69291a4c010e0c000203041a4b01103b503b503056a73056c81a45010e0e0c0005291a6c01691a70012a692c2a691a70012a69302a691a70012a69332a693b3e3b3b2d6805291a0801020213000e0c000203041a0301103b503b5029271202b22b362c372d381a480156491adb000c00033e2a69291ad9000e0e0c000203041ad700103b503b503b1a2e010e0e0e0c00022e1be8032b569a3b56b80e0e0e0c00063b1a14010e0c00022f1be8032b56b73b56d80e0e0e0c00063e3069291a91000e0e0c000203041a8f00103b503b50293b691aec002a692c2a691aec002a691aef002a691af2002a69322a691af2002a69220d2a693b3e3b3b2d6805291a51000e0e0c000203041a4f00103b503b50292714420e0e0e0e0e0e0000000000000000b0010000000000000000000000000000|@7177,I251,@7178,@122,I105,@1363,@7179,@7171,I218,I154,@3268,@7189,@7190,@871,@871,@871,@7178,@1330,@871,@871,@7176,@871,@871| 7175:S36|545950455f5452454528292e756e69667954797065734572726f725265706f7274283429 7176:O2|3,@7189 7177:S50|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129 7178:S6|43616e277420 7179:O1|@7180 7180:D2,56|00832c37293729352a362b37303434341a2d00340e0e0e7b090800080e0e0e0e000000000000000028000000000000000000000000000000|@7182,@7181| 7181:O1|@7183 7182:S71|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e737472283329 7183:D21,512|00863b1a02020e0e0e0c00022e1be8032b303b340e0c0006293b69040200220c2a1aec010e0c000350293630350402002a2a1adb010c00035029362c2a1ad8010e0c000303033c024a2c1ad3010c00021ad5010e0e0c00020314291ac2010e0e0e0c00021ac1010e0e0c000202013b03212c3b2b3b28082e1ab5010e0e0c00021ab5010e0e0c00031ab5010e0e0c000602013b270503033b025c3b3469291a7f010c000203041a9f01103b503b50293b693e220e69291a67010c000203041a8f01103b503b50293b693b3b3b2e2d6805291a4c010e0c000203041a7301103b503b50293b691a70012a691a73012a691a76012a692708331a76011a1b010c000303033c0222331a17010c00021a19010e0e0c00020310333b1a55013b28081a1f010c000602013b03033b026c3b220c69291aec000e0c000203041a0b01103b503b50293b691a3001220d1a33010c0003291a34011a29010e0e0c00033e2a69291abd000e0e0c000203041ae300103b503b50293b693b3b3b302d6805291aa0000e0c000203041ac700103b503b50293b691afc002a692708293b1a7b000c000303032a020b2a2a1aee000e0e0e0c0003293b1a63000c000303032c020b2c2a1ade000e0e0e0c00033b3e3b3b2d6805291a4d000e0e0c000203041a7300103b503b502927081f070e0000000000000000f0010000000000000000000000000000|@7185,@1330,@1357,I251,I105,I218,I223,I239,I154,@1363,@1363,@871,@1371,@871,I48,@2916,@122,@2914,@871,@7186,@7184| 7184:O1|@7188 7185:S87|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e7374722833297072696e745769746844657363283329 7186:O1|@7187 7187:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7186| 7188:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7184| 7189:S2|746f 7190:O2|@871,@7191 7191:O2|@7192,0 7192:O2|3,@1810 7193:O2|3,@7194 7194:S7|526561736f6e3a 7195:O2|3,@7196 7196:S45|417267756d656e7473206f66206f72656c7365206d7573742068617665207479706520626f6f6c2a626f6f6c2e 7197:O2|@426,@7198 7198:O2|@426,0 7199:O2|3,@7200 7200:S46|417267756d656e7473206f6620616e64616c736f206d7573742068617665207479706520626f6f6c2a626f6f6c2e 7201:D2,72|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a2a00220e0e0e0e7b0e03000d000000000000000038000000000000000000000000000000|@7203,@7202| 7202:O1|@7204 7203:S63|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283129283129 7204:D9,248|008b220d35220e36220f372210381aef00221022106a0403002a2a1aea000e0e0e0c00035029352a362b3722123c1adf000c0003312c2b3b1add003b221b22192219221d1ad9000e0e0c000b221223061ad5002a2e6a221423082215392216230d22173a2218230b2219230c221a37221b38221c35221d230a221e36221f23071aad00222122146a2d2c3131220f220e221331221432220d221322132217680e2211221e2b2228221e222b222622262226222a0e0e0c000a22183b2b1a79000e0e0c00045022193b22131a6b000c0004503d22122b6a271c1f0c0e0e0e0e0e0e0000000000000000e8000000000000000000000000000000|@7206,@7207,@6133,I106,@7210,@7213,@7372,@7205,I255| 7205:D6,104|00803c28403b1a67000c00041a69002a6956280e0e0c00022a3b1a63000c0003563723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4e00310e7e0700032704420e0e0e0e0e000000000000000058000000000000000000000000000000|@7374,I11,@7375,I253,I251,@7373| 7206:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229 7207:D8,112|00822b3929291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7209,I105,I218,I251,@6045,@7208,@122,@7104| 7208:S37|2068617320616c7265616479206265656e20626f756e6420696e2074686973206d61746368 7209:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d61746368547265652832296d657373466e283329 7210:O1|@7211 7211:D4,136|00802b352c362d373c28401a82001a87000c00043c28401a86001a7b000c00043d2b2b6a3c28403b1a6d000e0e0c00043c28403b1a61000e0e0c00043c28403b1a55000e0e0c00042a2c2b6a2968013c28403b1a42000e0e0e0c0004296801220c3c32220e220e302f6807270d420e0e000000000000000078000000000000000000000000000000|@7212,-1,I11,@2249| 7212:S28|56414c55455f4f505328292e6d616b654c6f63616c56283129283129 7213:O1|@7214 7214:D74,3152|0089343528161a4f0c0c00030322343629220c220c220c220c220c220c220c220c220c1a3a0c220d0e0e0e7b0c0d000b3435281e1a210c0e0e0c000303183c28401a240c1a290c0e0e0c000428062a1a260c6a640fd63435281b1afb0b0c000303051a1b0c0fd5343528101aea0b0e0e0e0c000307c83436220c37220d382b220e220e3c220e220e220e220e220e220e1acd0b0e0e0c000b2b220f220f220f220f220f220f220f220f220f1ab20b0e0e0e0c000b2a2a1acf0b0c0003291ad00b0e0c00021ad10b0e0e0c0002039a2935220c220c220d1ac70b1acc0b0e0c00052a2a0e0e0e0c000264220d35220e36220f3722103822113922123a221323062214230722152308221623092217230a2218230b2219230c221a230d221b230e221c230f221d23101a860b0202070b0e0e0e0c001222142a1a7e0b0204f70a2e000e0c00032968013c2a2e346b2211382212230c2a3b3c1a670b0c0004502b2a0e0e0c0002270802013b2c27070fdd343528051ae30a0c000307d33436220c37220d382a220e220e220e220e220e220e220e220e220e1ac80a0e0c000b2c1a280b342212346b341a270b0c00042a2a1ad70a0c0003291ad80a0e0c00021ad90a0e0e0c000207dd29351a0d0b2f2e220f220f1a0c0b0e0c00063b1a0c0b0e0c00022d1b10272b22103b1a050b0e0e0c0006293b691a020b2a691a050b2a693b3b3b3b2d6805291a880a0e0c000203041af70a103b503b502213221322141a810a1a860a0e0e0e0c0005312a0e0e0e0c000264293b691ad90a2a691adc0a2a693b3b3b3b2d6805291a470a0204e809cc000e0e0c000203041aaf0a103b503b50293b691abc0a2a69302a691abc0a2a69220f2a691abb0a2a691abe0a2a693b3e3c3b2d6805291a090a0e0e0c000203041a770a103b503b50222035222136222237222302026f003822243922253a22262306222723072228230822292309222a230a222b230b222c230c222d230d222e230e222f230f223023101ad5090e0e0c001222272a1ad2090e0e0e0c00032968013c2a2e221e6b2224382225230c2a3b3c1abe090e0e0e0c0004502b2a0e0e0c0002261c02023b502a27060fdc343528111a36090e0e0e0c0003037c3436220c37220d381a0b0a1a2809220f220f220f220f220f220f220f220f220f680b291af8091afd096a1a010a1a060a282c2e221468052d2a2c220e220e1afd090e0e0c00062935293b1ae1080e0e0c00036403051aee090212293b6928052a1aeb091af0091af509680564303b2b1a24090e0c0004502927080fcc3435280f1aab080c000303883436220c37220d38291aa20833333333221322132213221322131ac1090e0e0c000c1ac1090e0e0c0002291ac0090e0c00023b2a2f6a2e03032902123c28402b1a7b0802023c080c00043c2a69643e2d2b6a3003032902213c28401a58081a5d080e0e0c000428062a1a5a086a2a3b2d1a9b080c0004502965303b2b1a8f080c0004502927090fd1343528191a17080c0003034c3436220c372a1a110832323232221222122212221222121a48090e0c000c293c1a47090c0003291a48090202c1070e0c00023b2a3c6a3e2c2b6a2e3b2b1a3a080e0e0e0c0004502927070fd534353d1ac0070e0c000307cb343629352a362b372c392c35280e1aa9070e0e0c000307cf2c3629352a362b372c382d39220e23092a3b2b1af4070e0c000450220f23062210230d2a2a691ae1082215221c316b1ae0082b342c1ae2080e0e0e0c00052936293b1a5d070e0e0c000303033c0213291a8707020228070c00021a85070e0e0c0002640376293729353e1a35070e0e0c0003031129362928081a26070e0e0e0c00036402013b64030b293b1a94080e0c0003022929380402002a1a8d082b1a91080e0e0c00045029352a36291a8b080204cc0667020e0e0c00022b2705333b2c1a47070c000450323b2b1a3d07020269000e0e0c0004502964025b2935291a61081abe060e0e0e0c000303033c0222291ae7060c00021ae9060e0e0c00020310293b1a3d083b28131a3f080c000602013b6403043b50021b331a36081a3b080c000322173c221f342d1a36080e0e0e0c0006511a8407270c0214333c22122c1a28081a1d080e0e0c0006501a6c072c2211221122112211221122112211221122111a46060e0e0e0c000b2a1a04080e0c000229353d1a2a060e0e0e0c000303bc29362a372a2d1a49060e0e0c0003291a48060e0c00021a49060e0e0c0002039629352211221122121a3f061a44060e0c00052a2a0e0e0e0c00026422123522133622143722153822163922173a2218230622192307221a2308221b2309221c230a221d230b221e230c221f230d2220230e2221230f222223101afe050e0e0e0c001222192a1afa050e0e0e0c00032968013c2a2e220e6b2216382217230c2a3b3c1ae6050e0e0e0c0004502b2a0e0e0c0002260902023b502a6602ce3c28401a70051a75050e0e0c000428062a1a72056a3d2d2b6a2c2a1a78050e0c0003291a78050e0c00021a79050e0e0c0002039629352212221222131a6f051a74050e0c00052a2a0e0e0e0c00026422133522143622153722163822173922183a22192306221a2307221b2308221c2309221d230a221e230b221f230c2220230d2221230e2222230f222323101a2e050e0e0e0c0012221a2a1a2a050e0e0e0c00032968013c2a2e220f6b2217382218230c2a3b3c1a16050e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1afa040e0e0e0c0004502927090fda343528121a7f040c000307d03436220c38220d39293c1aed050e0e0c0003291a34060e0c000229353d1a5a040e0e0e0c000303c029362a372a1a22061a77040c0003291a78040e0c00021a79040e0e0c0002039a2935220e220e220f1a6f041a74040e0c00052a2a0e0e0e0c000264220f3522103622113722123822133922143a221523062216230722172308221823092219230a221a230b221b230c221c230d221d230e221e230f221f23101a2e040e0e0e0c001222162a1a2a040e0e0e0c00032968013c2a2e220e6b2213382214230c2a3b3c1a160402048703fa000e0c0004502b2a0e0e0c0002260902023b502a6602d23c28401a9c031aa1030e0e0c000428062a1a9e036a3d1a51052b6a2c2a1aa2030e0e0e0c0003291aa0030e0c00021aa1030e0e0c000203962935220f220f22101a97031a9c030e0c00052a2a0e0e0e0c00026422103522113622123722133822143922153a22162306221723072218230822192309221a230a221b230b221c230c221d230d221e230e221f230f222023101a56030e0e0e0c001222172a1a52030e0e0e0c00032968013c2a2e220f6b2214382215230c2a3b3c1a3e030e0e0e0c0004502b2a0e0e0c0002270802013b2c27052e3b2b1a22030e0e0e0c0004502927060fd13435280e1aa7020c000307cf343629352a362b372c382d390402002e2a1a6e040e0e0e0c0003502935220e03051a6604027a291a68041a75020e0e0c000303033c0222291a9f020c00021aa1020e0e0c00020310293b1a45043b28081af7030c000602013b0323342306302a0e0e0e0c000264293b1a36020e0e0e0c000303051a130402022935640222342306220c230d2a2a691a0f0422112218326b1a0e042b220c2c1a7f030c00052704220c23092d3b2b1a60020e0c0004502a36293b1aec010e0c000303033c0217291a17020202b8010c00021a15020202ab010e0e0c00026407dc22120317220f3c2217311ac4031a79030e0e0c0006501ac80202cb303b2c1a10020e0c0004502a36291ad5010e0e0c00021ad5010e0e0c000203042935023b2b38291a54030e0c000229353d1a7a010e0e0e0c0003030829362968016402013b293b1a64010e0c00031a9d010e0e0c0002651a94010e0c0002642903512c3729353e1a44010e0c0003031129362928081a36010e0e0e0c00036402013b64030b2c3b1aa4020e0c000302212c380402002a1a25032b1aa1020e0e0c00045029352a36291a9b020c00022b2705021722113c2219331a0a031aaf0202020a000c0006501afc016502aa3b2f69221023103b2a0e0c00023d2a69293b692d2a693c28401ad5001ada000e0e0e0c0004221a1aef000c00020304221a020a221a1ac9020e0e0c0002293e1ac7020c0003293b1ac7020c0003293b1abf020c0003293b1ab7020c000328062f2b6a22152a326a270722180e0e0e0c0002220f2217220e1a9f020c000450220f22142218220f3b1a97020c000650220f2a69221c0e0e0c000250220e3b2b1aa8000e0c00045029382707303b2b1a99000e0e0c00045029270b02031a3b011f0a0e0000000000000000400c0000000000000000000000000000|@7216,I251,@7213,@588,I11,79992,@956,@1326,I105,I218,@7171,@7172,@7107,@6655,I255,@7217,@7306,@7325,@7168,@1330,@1469,@871,@7326,@1363,@2241,@7193,@871,@871,@871,@7328,@7330,@6656,@7332,@7337,@7338,@7339,@1444,@1028,@1026,@423,@7351,@6624,@6572,@7354,@6634,@7165,@7356,@7357,@7112,@7140,@7358,@1414,@7142,@6305,I154,@7360,@122,@7104,@7361,@1435,@500,@1357,@6380,I48,@7362,@7357,@7363,@7364,@7366,I152,I245,I242,@6046,@7215| 7215:O1|@7367 7216:S62|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e283629 7217:D3,64|0082560923085619230d2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@7220,@7218| 7218:O1|@7221 7219:S28|545950455f5452454528292e61737369676e54797065732833292d45 7220:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7221:D18,368|00822d352e360402002f2a1a6a010e0e0e0c00035029352a362a1a63011a68010e0c000303033c02222a1a63010c00021a65010e0e0c000203102a3b1a41013b28081a5b010c000602013b0309292e0e0e0c000202721a4f012d2c331a51010e0e0c0005291a28010e0c00021a29010e0e0c0002034e2935293729352a39040d002b2a1a32010e0e0e0c000350292308302a0e0e0e0c0002293b1aeb000c000303033b021b293533282e1a13010c00032a2f2b1a12010e0e0e0c000429680166270702031a090164293b1abb000c0003037c1a03011a08011ae5000e0e0c0003292c1adb000c0003291afc001ad1000e0e0c00032e1a88001a8d000e0e0c000303033c02222e1a87000c00021a89000e0e0c000203102e3b1a65003b28081a7f000c000602013b03051a5400020a1abf002f1a8b000c00032a2a1a83000c00032704320e0e0c0002501aac00020229352706440e0e0e0e0e000000000000000060010000000000000000000000000000|@7223,@1357,I48,I251,I105,I218,I154,@6990,@7116,@1571,@122,@7224,@7305,@7222,@4525,@7026,@7114,@6212| 7222:S16|5479706520636f6e7374727563746f72 7223:S24|56414c55455f4f505328292e6c6f6f6b7570547970283329 7224:O1|@7225 7225:D19,256|00827881453c28403b1afc000e0c0004280b28403b1af0000e0c0004293b401aee000e0e0e0c0004503c28402b1ad8000e0c00043c28401ade001acb000c00043c2a2e2d6b270405380e00ff6d29353f1acd000e0e0c00030323403c1ac9000e0e0c00031ac9002a1acd000e0e0c00031acd001ad2002b1ad6006b65103b502910040d002a2a1acf000c000350293830352935293369652a0e0c00023c28403b1a65000e0e0c00041ab5002a691ab8002a1abc006a2f2a220c3c220d1ab9003b1abd000e0e0c00082c3b1abb000c0003293b1a4b000c000303041ab300103b5029352709440e0e0e0000000000000000f0000000000000000000000000000000|@7227,I11,I255,@7228,I251,@243,@6963,@122,@14322,@596,@6964,@1571,@7230,@7232,@7237,@7241,@7226,I253,@1792| 7226:O1|@7246 7227:S28|434f5049455228292e66756c6c436f70794461746174797065283329 7228:O1|@7229 7229:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 7230:D2,48|00802b3629680156273b2b1a2a000e0e0e0c0004503b6542000000000000000020000000000000000000000000000000|@7231,I255| 7231:S38|434f5049455228292e66756c6c436f70794461746174797065283329726573456e762d283129 7232:O1|@7233 7233:D6,56|00802b351a39002a1a3d000e0e0c00031a3d001a42002b1a46006b64100e0e0e000000000000000028000000000000000000000000000000|@7231,@7235,@122,@14322,@596,@7234| 7234:O5|@7236,259,0,259,0 7235:S9|656e74657256616c20 7236:S30|6d6c736f757263652f4d4c436f6d70696c65722f434f504945522e736d6c 7237:O1|@7238 7238:D6,56|00802b351a39002a1a3d000e0e0c00031a3d001a42002b1a46006b64100e0e0e000000000000000028000000000000000000000000000000|@7231,@7240,@122,@14322,@596,@7239| 7239:O5|@7236,258,0,258,0 7240:S12|656e74657253747275637420 7241:O1|@7242 7242:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@7244,@7243| 7243:O4|11,@49,0,@7245 7244:S33|434f5049455228292e66756c6c436f707944617461747970652833295f2d283129 7245:O5|@7236,261,0,261,0 7246:D6,88|0086312e313c3b301a55000e0e0c0007322f323b2d2e1a47000c00071a490032312c6b1a4a003234331a4c0034302211316809220c3b2b1a4600327b050d0004000000000000000048000000000000000000000000000000|@7248,@7249,@7269,@7247,@7226,@1633| 7247:D4,96|00822c2c2a1a60000e0c00021a61000e0e0c0002032c2a352b36312b2d56775688569956aa56bb56cc56dd56ee1a48000e0c000c2a2a2505250526031e383b6602012965440e0e0e000000000000000050000000000000000000000000000000|@1636,I105,I218,@7277| 7248:S24|434f5049455228292e6c6f63616c436f7079536967283729 7249:O1|@7250 7250:D5,72|00851a4b002f1a4f003030346806312d2b1a4c000e0c00041a4d00323232326805332b2b1a3900310e0e0e7b050b0004000000000000000038000000000000000000000000000000|@7252,@7253,@7249,@1633,@7251| 7251:D4,88|00822c2c2a1a58000e0c00021a59000e0e0c000203242a352b36312b2d56775688569956aa1a48000e0c00082a2a2505250526031e303b6602012965440e0e0e000000000000000048000000000000000000000000000000|@1636,I105,I218,@7255| 7252:S41|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629 7253:D8,176|00822c2c2a1ab0000e0c00021ab1000e0e0c000203792a352b362a35291aa8001aad000e0e0c00036403552a351a98001a9d000e0e0c000303043b5002041a9700102a37293729352a39568b220d1a8f000c000329282e1a86000e0e0e0c00031a85002c56c76a2d2b2b56e956fa220e121200010002000e0e0c0007270702012b2a2a2505250526031e853b6602012965440e0e0e0e0e0e0000000000000000a0000000000000000000000000000000|@1636,I105,I218,@14325,I251,@1576,@122,@7254| 7254:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 7255:O1|@7256 7256:D12,280|00863035291a18011a1d010e0e0c00036407cf30351a08011a0d010e0e0c000303043b5002041a070110303729351a070131691a0a0131692b37293629353d1ae6000e0e0e0c0003034b29362a372c352d37220d0304221002371aeb003032220f6b2c1aea002b1aee000e0e0e0c00043d2f2b6a2d2a2e6a220c3522142a1adf000c0003220e362a2a2e6a29221969270827040264321acf000c00020304220c02572a3629353b1a7e000e0e0e0c00030310293829220d0e0e0c00022968016502013b291aa9000e0e0c00021a99000e0e0c0002032029353035220f2a1a8000020219000e0c000332362a2a2e6a2922146927050202220e65270602012f1f07000000000000000008010000000000000000000000000000|@7258,@14314,I251,@1576,@7259,@7261,@7263,@7257,@1416,@122,I218,I105| 7257:O1|@7268 7258:S53|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329 7259:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7260,@122| 7260:S64|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c6454797065732833296d616b654e616d65283129 7261:D2,64|00802b3629353b1a3e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000000000000030000000000000000000000000000000|@7262,I251| 7262:S62|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f70794964283129 7263:D3,64|00800403002c56271a3d00564856592e1a3d000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@7265,@7264,@1551| 7264:O1|@7266 7265:S68|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129 7266:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7267| 7267:S71|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129283129 7268:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7265| 7269:D5,72|00801a4b005617691a4d005628690403002e2c1a4a002d56792e1a4b000c00075029352a362b372b2b2b6a2706420e0e000000000000000038000000000000000000000000000000|@7271,@7272,@7274,@7270,@1551| 7270:O1|@7276 7271:S39|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129 7272:D2,64|00802b3629353b1a3e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000000000000030000000000000000000000000000000|@7273,I251| 7273:S48|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129636f70794964283129 7274:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7275,@122| 7275:S42|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129283129 7276:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7275| 7277:O1|@7278 7278:D33,784|008a3435291a10031a15030e0e0c00036407d734351a00031a05030e0e0c000303043b5002041aff0210343729352a362b372c382a352b362c382d392e3a221303791aeb022b22146a2e353c1ad1020e0e0c000303592e362f382a3b1ad9020e0e0c00032a3b1acf020c0003293b1ac7020c0003293b1ac7020c000303051ac70202242928403b1ac6020e0e0e0c00042b3c2b3b2e1ac0020e0c000650291abf020c00025029643b2d2b6a270602012e292f3b302e306806650fcd7881483c28403b1a8b020c0004280b28403b1a80020e0c0004293b401a8e020e0e0e0c0004503c28402b1a6802020224010e0c00043c28401a7a021a57020c00043c2a2e2d6b270405380e00ff6d29353f1a11020e0e0c00030323403c1a5d020e0e0c00031a5d022a1a61020e0e0c00031a61021a66022b1a6a026b65103b5029101a68022a691a6b022b691a6e022c69292c2c6a1a6d023022196a2217221d1a2a020e0e0e0c000329282e1a1e020e0e0e0c0003220c2d2d3b2d221c221c221f0e0c000831353c1a9a01020270000e0e0e0c00030359313632382a3b1a9d010e0e0c00032a3b1a93010c0003293b1a8b010c0003293b1a8b010c000303051a8b0102242928403b1a8a010e0e0e0c00042b3c2b3b2e1a84010e0c000650291a83010c00025029643b2d2b6a270602013129220e3b220f221d220f6806270a32322b326b220f3722192b692a22100e0e0e7d1a00023435291ab2011a07010c000364036534351aa4011af9000e0e0c000303043b5002041af30010343729352a361a9101220c691a9301220c690403002d2c1a90012d220e2e1a91010e0e0c00075029352a362b372b2b2b6a30220d1a83010c0003220e362b2b6922192a69642a220f0e0e7d1900023435291a6e011a93000c000364036134351a60011a85000e0e0c000303043b5002041a7f0010343729352a362b372c382d392e3a2f23062c1a4101220c1a44010e0c0004292e1a53000c00031a3d010e0e0c0002030b3030302c3030306807020131220d35322b692a220e0e7d1800023b1f0b0e000000000000000000030000000000000000000000000000|@7280,@14325,I251,@1576,@7281,I253,I113,I49,I11,I195,I47,I255,@7282,@243,@6963,@122,@14322,@596,@6964,@7284,@7288,@7291,@7294,@14314,@7295,@7296,@7297,@1551,@7299,@14310,@7279,@1416,I218| 7279:O1|@7304 7280:S27|434f5049455228292e6c6f63616c436f7079536967283729283329 7281:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 7282:O1|@7283 7283:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 7284:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@7286,@14314,@1578,I251,@7285,@1597| 7285:O1|@7287 7286:S39|434f5049455228292e6c6f63616c436f70795369672837292833296e65775369672d5f2d283129 7287:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14314,I251,@7285| 7288:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@7286,@14325,@1578,I251,@7289,@1597| 7289:O1|@7290 7290:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14325,I251,@7289| 7291:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@7286,@14310,@1578,I251,@7292,@1597| 7292:O1|@7293 7293:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14310,I251,@7292| 7294:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 7295:D2,64|00802b3629353b1a3e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000000000000030000000000000000000000000000000|@7273,I251| 7296:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7275,@122| 7297:O1|@7298 7298:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7275| 7299:O1|@7300 7300:D7,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203512c352d362a352b362c372d382e392f3a3023062c1a7300220d1a76000e0e0e0c0004292e1a73000c00031a55000e0e0c0002030b3030302c303030680702013232220e1a5c000e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,@7301,@1416,I251,@7299| 7301:O1|@7302 7302:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7303| 7303:S37|434f5049455228292e6c6f63616c436f7079536967283729636f7079547970283129283129 7304:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7303| 7305:O1|@6212 7306:O2|@7307,@14348 7307:D2,40|00822d2d56272e1a26002f7b06050005000000000000000018000000000000000000000000000000|@7309,@7308| 7308:O1|@7310 7309:S26|545950455f5452454528292e61737369676e5479706573283329 7310:D28,656|00832e350a05009f010c001c02a401b20141022e3629352a362b392c3a0401002c2c2b220d0c00045029352937293629353c1a63020c00036403102936293629220e1a53020c00036502013b641a50020e0c000207cf2937293629353c1a38020e0c000303042937024129353b1a28020e0c000303042936023129363b2a291a26020e0e0e0c00021a15020e0e0c0002031729362b3c1a17020c0003292b25042504511e253b6502012a663b32291af7010c00021ae9010e0e0c0002031729362b3c1aeb010c0003292b25042504511e223b6502012a652a2a1adc010e0c00031abd010e0e0c000203862d352b3c1acf010c00032b3c1ac7010c0003293b691ac6012a692c2a691ac6012a692f2a691ac6012a6927081ac7010c0002291ac8011acd0102025b000e0e0c0003291ac8010e0c00023b3e3b3b2d6805291a69010e0e0c000203041ab701103b503b503c3b2b220e6b2212382213230c2a3b3c1aa7010c0004502b2a0e0e0c00022707020e2f3b2f1a92010e0e0e0c0004503b270402013b2f1a8901220e220e220e1a88010e0c00063b2f69293b6928052c33302d6805270b02cc1a770102c72e3629352a3628062b2b6a6602b92e362f372a1a4f013131311a61010e0e0c00061a61010e0e0c0002291a60010e0c00023b2a2d6a2c030329020e3c28402b1a53010c00043c2a69643e2d2b6a2e03032902213c28401a44011a39010e0e0c000428062a1a3e016a2a3b2d1aef000c00045029652707024f2e362f382a3030301ae2000e0e0e0c00052a3131311ad5000e0e0c00053d2b2b6a2704022a2e36291ac2003030301a04010e0c0006293c1a03010c0003291a04010e0c00023b2a3c6a3e2c2b6a27051f040e0e0e0e000000000000000080020000000000000000000000000000|@7312,I251,I218,I105,I106,I113,@243,@7313,@7314,@7315,@104,@5823,@5826,@6012,@1363,I255,@7308,@7316,@1444,@7318,@6624,@7320,I11,@588,79992,@7322,@6634,@7311| 7311:O1|@7324 7312:S46|545950455f5452454528292e61737369676e54797065732833297479706546726f6d547970655061727365283129 7313:S13|2074797065287329206e6f7420 7314:S11|2920726571756972657320 7315:S18|5479706520636f6e7374727563746f722028 7316:O1|@7317 7317:D4,88|00842f1a5a000e0e0e0c00021a59000e0e0c000203212f3530362a303030340e0e0c00052a323232321a44000e0c00062a2a69270402013b1f050e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@7316| 7318:O1|@7319 7319:D12,240|00842f1af2000e0e0e0c00021af1000e0e0c000203b92f3530362a352b362a352a333333220e0e0e0e0c00052a291ad7000c0002293c1ad7000c00036403033c024a291ac2000e0e0e0c00023b2a1ac7000c00036403041ac600103b503b50291a95000e0e0c0002030329020b2928081ab5000e0e0c00032928301ab2000e0e0e0c0003641a78000e0c00020303290221291a73000c0002293c1a9b000c00032b3c2b1a9a000e0e0e0c00046525011e823b64292b692f220e220e220e220e1a86000e0e0e0c00062a2a69270902013b1f050e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@1399,I105,I218,I223,I232,I231,@70,I252,I251,I107,@5831,@7318| 7320:O1|@7321 7321:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@7320| 7322:O1|@7323 7323:D4,88|00842f1a5a000e0e0e0c00021a59000e0e0c000203212f3530362a303030340e0e0c00052a323232321a44000e0c00062a2a69270402013b1f050e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@7322| 7324:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@7311| 7325:S6|56616c75653a 7326:O2|3,@7327 7327:S11|436f6e73747261696e743a 7328:O2|3,@7329 7329:S33|54797065206d69736d6174636820696e207479706520636f6e73747261696e742e 7330:D1,64|00802b56185629563a564b565c566d567e568f120a0001000a0056a7220c0e7b0c03000b0e0e0e0e000000000000000030000000000000000000000000000000|@7331| 7331:S79|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e28362970726f63657373456c656d656e74283129 7332:O1|@7333 7333:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@7335,@7334| 7334:D2,48|00802b352c362d375637355647361a2700300e7b07030006000000000000000020000000000000000000000000000000|@7336,@7168| 7335:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129 7336:S50|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129283129 7337:S40|456c656d656e747320696e2061206c697374206861766520646966666572656e742074797065732e 7338:S4|4974656d 7339:O1|@7340 7340:D8,152|00842f1a9a000e0e0e0c00021a99000e0e0c000203522f353036293b1a91000e0e0c0003030a2f352b2a2f0e7d0a00022f353036313733353436220c37220d38220e3932310c0002293c3434221232221733220f221622102210220d220f1a5700221b7b1012000f3c28401a52001a57000c000428062a1a56006a641f050e0e000000000000000088000000000000000000000000000000|@7342,I105,I218,I251,@7341,@588,I11,79992| 7341:O1|@7343 7342:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c697374283329 7343:D33,824|008d220d1a39030e0e0c00021a39030e0e0c000207dd220d35220e362a220f0e0e0c000222122a1a26030e0e0e0c0003291a0c030e0c00021a0d030e0e0c000207cf293522103522113622123722133822143922153a22162306221723072218230822192309221a230a221b230b221c230c221d230d221e230e221f230f222023101ad3020c001222143c1ad2020e0e0e0c0003031022101acd021ad2020e0e0e0c0003022f22101acd021ac2020e0e0e0c000322153c1ac6020e0e0e0c00032a2a1aab020c000329283a1aa2020e0e0e0c0003663e2a69291a64020e0c000203041aa302103b503b50221122171a9f02020223020c00032922122e22131a97020c00053b3b3b3b2d6805291a31020202d5010e0e0c000203041a6b02103b503b503b1a7a020e0e0e0c0002221b1b10272b22153b1a70020e0c0006293b691a6e022a691a71022a691a74022a692f2a691a74022a69342a693b3e3b3b2d6805291adc010e0c000203041a1b02103b503b502220221c69221b0c000222243c1a4e020e0e0e0c0003293c1af3010c0003291a44026928202a6922242a6927041a3e020e0e0e0c000229221722166a642a0e0c0002642221221d221e1a2a021a2f020c000522122a0e0e0c0002643e221c69291a6b010c000203041aab01103b503b502a3b691a10022a691a13022a693b3b3b3b2d6805291a46010e0e0e0c000203041a8301103b503b50293b691af8012a69312a691af8012a69342a691af8012a69332a693b3e3c3b2d6805291a10010e0c000203041a4f01103b503b50222f3522303622313722323822333922343a223523062236230722372308223823092239230a223a230b223b230c223c230d223d230e223e230f223f23101ad9000e0e0c001222282a1a96010e0e0e0c00032968013c2a2e222c6b2233382234230c2a3b3c1a82010e0e0e0c0004502b2a0e0e0c00025022383c1a15010e0e0c00031a6d012a222b223a223a223a223a223a223a223a223a223a223a223a1a5901223b0e0e7b103b000f22123c1ae2000e0e0e0c000322142a2e221422142214221422142214221422142214221422141a270122157b1015000f220f1f0e0e0e0e0e000000000000000028030000000000000000000000000000|@7345,I105,I218,@1326,@7107,I113,@7346,@122,@7347,@243,@1363,@3385,@7348,@1330,@1469,@871,@2205,@871,@871,I106,@7344,@104,@7171,@7172,@2241,@7193,@871,@871,@871,@6655,I255,@1444,@7341| 7344:O2|58,0 7345:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833296170706c794c697374283329 7346:S3|20313a 7347:S4|7320312d 7348:O1|@7349 7349:D12,320|00832c3b1a41010e0e0c000303051a3f010fd72e1a41010e0e0c00021a41010e0e0c000207da2e352f36293b1a39010e0e0c000303102a2f692e0e0e0e0c0002293b69640fcd2a2f692e0e0e0e0c000230282c1a12010e0e0e0c000303033c024230283b1a01010e0e0c000303033c0232301afb001af0000e0c000303033c0222301ad3000c00021ad5000e0e0c00020310303b1ad9003b28081adb000c000602013b1aba000e0e0e0c00023c2a3b6a291aa4000e0c000203041ac300103b503e3369291a91000e0e0c000203041aaf00103b50293b692b2a692e2a693b3b3b3b2d6805291a700002023a000e0c000203041a8b00103b50220d3c1a8a00020223000e0e0e0c00033222102b22101a7f0002020d000c00051a7d002a692c2a69270b6502013b1f04000000000000000030010000000000000000000000000000|@7350,I232,@1453,I105,I218,I251,I48,I154,@1363,I107,@7348,@871| 7350:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833297072696e744c697374283429 7351:O1|@7352 7352:D13,288|008a220c1a21010e0e0c00021a21010e0e0c000207da220c35220d362a352b362c3829220c220c220c220c220c2215221522152215221a0e0e0c000b2b3b2b1af6000e0e0e0c0004502c291af2000e0e0e0c0002293c1aef000c00036403033c024a291ada000e0e0e0c00023b2a1adf000c00036403041ade00103b503b50291aa5000e0e0c0002030329020b2928081acd000e0e0c00032928301aca000e0e0e0c0003641a88000e0c00020303290221291a8b000c0002293c1ab3000c00032b3c2b1ab2000e0e0e0c00046525011e853b64292b692f22142214221422142214221422142214221422141a920002020d000e0e0e0c000c2a2a69270902013b1f0b0e0e0e0e0e0e000000000000000010010000000000000000000000000000|@7353,I105,I218,I255,I223,I232,I231,@70,I252,I251,I107,@5831,@7351| 7353:S74|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e2836296d61704c6162656c73283129 7354:O1|@7355 7355:D4,112|008a220c1a71000e0e0c00021a71000e0e0c0002033d220c35220d362a3232323232221222122212221222170e0c000b2a220f220f220f220f220f220f220f220f220f220f1a40000e0c000c2a2a69270402013b1f0b0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@7354| 7356:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7357:S11|436f6e7374727563746f72 7358:O1|@7359 7359:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 7360:S21|206973206e6f74206120636f6e7374727563746f72 7361:S46|436f6e7374727563746f7220696e2061207061747465726e20776173206e6f7420616e206964656e746966696572 7362:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7363:S49|4964656e746966696572206265666f72652060617327206d757374206e6f74206265206120636f6e7374727563746f722e 7364:O1|@7365 7365:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 7366:S51|436f6e7374727563746f72206d757374206265206170706c69656420746f20616e20617267756d656e74207061747465726e2e 7367:D15,416|00842f1aa2011aa7010c000303033c02222f1aa3010c00021aa5010e0e0c000203102f3b1a81013b280c1a9b010c000602013b03033c0fd72f1a94011a71010e0e0c000303033c02222f1a6b010c00021a6d010e0e0c000203102f3b1a71013b280d1a63010c000602013b03033c0fcd2f1a64011a39010e0e0c000303033c02222f1a33010c00021a35010e0e0c000203102f3b1a41013b280b1a2b010c000602013b03033c02b22f1a34011a01010e0e0c000303033c02222f1afb000c00021afd000e0e0c000203102f3b1a11013b401af4000e0c000602013b03033c027a2f1a04011ac9000e0e0c000303033c02262f1ac3000c00021ac5000e0e0c000203142f3b1ae1003b280b1abb00020249000c000602013b03033c023e2b033a2f1acd001a8a000e0e0e0c000303033c02262f1a83000c00021a850002021b000e0e0c000203102f3b1aa5003b401a78000e0c000602013b02013b03281a9900301a9d000e0e0c0003291a9c001a91000e0e0c00032f3c32312d1a9400320e0e7b070900063b1f050e000000000000000090010000000000000000000000000000|@7369,@460,I251,I105,I218,I154,@678,@868,@876,@7370,@6331,@7371,@122,@7368,@7104| 7368:S12|2220697320696c6c6567616c 7369:S48|54595045434845434b5f50415253455452454528292e7061737332283529636865636b466f724275696c74496e283529 7370:S3|726566 7371:S25|526562696e64696e67206f722073706563696679696e672022 7372:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7373:O1|@7377 7374:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229626f6479456e762d283129 7375:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7376:S57|54595045434845434b5f50415253455452454528292e7061737332283529737472696e67734f665365617263684c6973742834295f2d283129 7377:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7373| 7378:O1|@7379 7379:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@7381,@7380| 7380:D2,48|00802b352c362d375637355647361a2700300e7b07030006000000000000000020000000000000000000000000000000|@7383,@7382| 7381:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129 7382:O1|@7384 7383:S52|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129283129 7384:D15,280|00842c352d362e372f383039313a322306332307342308220c2309220d230a220e230b220f230c2210230d2211230e2212230f221323101ae6000e0e0e0c00123e3169291ae1000e0e0c000203041adf00103b503b50303531362c3c1ad9000e0e0c00032a2a1ad7000c00032e3c1ac7000c00032d2a1ac7000c0003293b691ac6002a691ac9002a691acc002a692f2a693b3b3b3b2d6805291a8c000e0c000203041a8b00103b503b503b1ab2000e0e0e0c000222131b10272b22143b1aa8000e0c0006293b691aa6002a691aa9002a691aac002a692f2a691aac002a6922142a693b3e3b3b2d6805291a3b000c000203041a3b00103b503b502927181f050e000000000000000008010000000000000000000000000000|@7385,@7107,I105,@1363,I107,@6655,@871,@6775,@871,@1330,@1469,@871,@2205,@871,@871| 7385:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283529 7386:S37|436c617573657320696e2063617365206861766520646966666572656e742074797065732e 7387:S6|436c61757365 7388:S6|5768696c653a 7389:O2|3,@7390 7390:S55|4c6f6f7020636f6e646974696f6e206f66207768696c652d65787072657373696f6e206d7573742068617665207479706520626f6f6c2e 7391:D2,72|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a2a00220e0e0e0e7b0e03000d000000000000000038000000000000000000000000000000|@7203,@7202| 7392:S40|436c617573657320696e2068616e646c6572206861766520646966666572656e742074797065732e 7393:O5|5,0,@478,@481,0 7394:S6|52616973653a 7395:O2|3,@7396 7396:S42|457863657074696f6e20746f20626520726169736564206d757374206861766520747970652065786e2e 7397:D4,56|00822d1a3a001a3f000c000356173c56382f2d1a3a00317b070600060e0e0e0e000000000000000028000000000000000000000000000000|@7398,@6895,@122,@7104| 7398:S66|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296d657373466e283329 7399:O1|@7400 7400:D19,440|00842f35303631373239333a2b1ab0010e0c00021ab1010e0e0c0002031f2b35291aac01220c220c220f6b220c1aa8010e0c00043d2a1aa7016a6502031aa0013b2c693423103b2a0e0c00023d2a69293b692d2a693035280e1a8c010e0c000303b9303629352a362b372c382d39221723062218230d2a2a691a7401221a221a306b1a73012b332c1a75010e0e0c000529382a36293b1a4f010c000303043b5002282828220c1a5f010c0003291a60011a55010e0e0c0003221f3c2220220d2d1a55010e0e0c00062603333b2d1a50010e0c000450323b2c1a45010e0e0c000450221e2309313b2b1a35010e0e0c0004503c28403b1a30010e0c00043c28401a2e011a23010c00043d2b2b6a221c3b2b3122153b3b680727110241303528081ac6000e0e0e0c000303043b5002041a0701103b503c28403b1aed000e0e0c00043c28401aea001adf000c00043d2b2b6a220e3b2b220c303b3b680766343b2b1abe000e0e0e0c000450220c336922100e0e0c000250220c2212341ac3000c000450220c22112213220c3c1abb000c000650221237220d2b692a22110e7d1500020000000000000000a8010000000000000000000000000000|@7402,I105,I218,@7403,@7306,@7393,I251,@7405,@7406,@7112,@122,@7407,@7104,I255,I11,@2249,@7401,@6046,@7215| 7401:O4|@14322,@596,@7409,@7408 7402:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f63657373457863657074696f6e283129 7403:D3,64|0082560923085619230d2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@7404,@7218| 7404:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7405:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7406:S9|457863657074696f6e 7407:S22|29206973206e6f7420616e20657863657074696f6e2e 7408:O5|@7096,1271,0,1271,0 7409:S41|70726f63657373457863657074696f6e3a206261646c792d666f726d65642070617273652d74726565 7410:O1|@7411 7411:D17,576|00812b230d29291a3e020e0e0e0c00021a3d020e0e0c0002032429352a362a35291a34021a39020e0e0c00036403052a68010207292503511e323b6502013b64293b1a1b020c000303691a1b02291af7010c00021af9010e0e0c0002032429352a362a35291af0011af5010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ad7010c000303041adf01103b50293529351abd011ac2010e0e0e0c000303043b5002041acb0110293765021a293529351a9e011aa3010c000303043b5002041aaf0110293764293d1aae010e0e0e0c000303ad2f1aaa010e0e0e0c000229293528061a74010e0c000303033c0287293528051a64010e0c0003036129362a382937293629353d1a50010e0c000303482b37293629353d1a40010e0c000303043b5002041a63011029362a372a311a61010e0e0c00031a61012a690402002c2b2b1a5e010e0e0e0c00045029352707250526041e743b02013b2704021929353e1af7000c0003030d2936293b1aeb000c00036402013b6503033b02031a2b010299293c1af4000e0c0003038d2f1af2000e0e0e0c000229293528051abc000e0c0003036129362a382937293629353d1aa8000e0c000303482b37293629353d1a98000e0c000303043b5002041abb001029362a372a311ab9000e0e0c00031ad1002a690402002c2b2b1ab6000e0e0e0c00045029352707250526041e643b02013b2704020929353d1a4f000c00036503051aa60002013b02013b66430e0e0e0e0e0e000000000000000030020000000000000000000000000000|@7413,I105,I218,@14407,I251,@2781,@2836,@1576,I113,@1435,@1731,@1734,@7414,@1414,@7415,@7417,@7412| 7412:O1|@7418 7413:S27|545950455f5452454528292e636865636b44697363617264283229 7414:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 7415:O1|@7416 7416:S36|41206e6f6e20756e69742076616c7565206973206265696e67206469736361726465642e 7417:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 7418:S36|412066756e6374696f6e2076616c7565206973206265696e67206469736361726465642e 7419:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7420:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7421:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7422:D6,104|00803c28403b1a67000c00041a69002a6956280e0e0c00022a3b1a63000c0003563723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4e00310e7e0700032704420e0e0e0e0e000000000000000058000000000000000000000000000000|@7424,I11,@7425,I253,I251,@7423| 7423:O1|@7426 7424:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296c6f63616c456e762d283129 7425:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7426:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7423| 7427:O1|@7428 7428:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@7424| 7429:D3,80|00802b3656193b1a4e000e0e0e0c00032a2a6956393b2b1a46000e0e0e0c0004502e56480e0c0002505637372f2a300e7d0700020e0e0e0e000000000000000040000000000000000000000000000000|@7430,I253,I255| 7430:S68|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229626f6479456e762d283129 7431:D1,48|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@7430| 7432:D1,48|00802b56180c0002505607230a2c2a2d7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@7430| 7433:D2,72|00802b561756285639564a565b566c567d568e569f120b0001000a00120c0001000b001a2a00220e0e0e0e7b0e03000d000000000000000038000000000000000000000000000000|@7203,@7202| 7434:S46|436c617573657320696e20666e2065787072657373696f6e206861766520646966666572656e742074797065732e 7435:D3,64|0082560923085619230d2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@7436,@7218| 7436:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7437:D1,80|00802b56185629563a564b565c566d567e568f120a0001000a00120b0001000b00120c0001000c0056c7220e0e0e0e7b0e03000d0e0e0e0e000000000000000040000000000000000000000000000000|@7438| 7438:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283129283129 7439:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7440:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7441:O1|@7442 7442:D5,88|00842f1a5a000e0e0e0c00021a59000e0e0c000203252f3530362a313131311a4e000e0e0e0c00062a323232321a48000e0c00062a2a69270402013b1f050e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@7443,@7441| 7443:O1|@7444 7444:D5,112|00842f353036313732381a6b0032346a2a1a6c002b1a70000e0c00042c353b1a6e000e0e0e0c000303192c36333b1a5f000c000303032d020733353f2b2b6a646402012c2f2f2b2d220d3b3b680727071f050e0e0e0e0e0e000000000000000060000000000000000000000000000000|@7446,@7447,@7445,@1416,I251| 7445:O1|@7449 7446:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129 7447:D3,152|00802b37293629353c1a94000e0c0003031156283629353c1a85000e0e0c00036402013b6403152936293656383629362b2a1a6b000c000327040239293629353b1a5c000e0c0003031156283629353b1a4d000e0e0c00036402013b6403152936293856383629382b2a1a3b000c0003270402013b640304560702012b420e0e000000000000000088000000000000000000000000000000|@7448,I251,I113| 7448:S91|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f707954797065436f6e73283129 7449:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@7450| 7450:S89|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f7079547970283129283129 7451:O1|@7452 7452:D24,776|008e1a0b0334346a0403002a2a1a08030e0c00035029362a372212220d220d22112e1afb020c00062211220c2c221222121af4020e0c000622122a2a1af1020e0e0c00021af1020e0e0c00020314291ade020e0e0e0c00021add020e0e0c000202013b039d2a352b362b352c362c352d362e392f23062c2b1ac5026a3b2c69221c23103b2a0c00023d2a69293b692d2a6930220d693b3b2b3322230e0e0c0005220c2c2b6a293b69220d3b2b1a99020e0e0c0004502d1a77020c00021a79020e0e0c00020304220c02031a8302220f22272b1a83020c000450220f2b69221a0e0e0c00025022223822102c692a0c000251221222112516251626141ec03b271402013b651a5902221222126a0403002a2a1a04020e0c00035029352a362b370403003b2a1a41020e0e0c00035029362a37221d34221b2218220f221d332223321a2d020e0e0c000a2922161a2a020e0e0e0c0003221e1adf010c0002030c221737310e0e0e0c00020fd30403003b2a1af6010e0e0e0c00035029352a362b371afe01221c2c6a221c23061afb012a220d2e6b1afb01221f2210316b1afa012220220d6a222023081af6012a220e6a2222392223230d22243a2225230b2226230c2227352228230a222936222a23072c2b2211220e220c3422133022112215220c221022102214680e22361abb012a1a3f010c00021a41010e0e0c0002032c2a352b362a35222d22343022372d223a22382237223622380e0e0e0c000a2b2a2506250626041e37260402005122211a80010e0c000222323b2b1a0d010202a6000e0e0c0004502222291ae5000e0e0c00021ae5000e0e0c0002038529352a362a37293629353c1a50010e0c0003030d2938293c1a43010c00036402013b64031329362936293b3b1abf000c0004503b26030242293629353b1a1e010e0e0e0c00030311293729353c1a0e010e0e0e0c00036402013b6403043b5002041a0201103b50293629372936293b3b1a7b000c0004503b26042a250426031e92260302023b50503b27161ac00027121f0f0e0e0e0e0000000000000000f8020000000000000000000000000000|@7454,@7455,@6133,@7457,@7462,I105,I218,I48,I255,@6045,@6046,@7467,@5990,@7469,@7486,@7562,@7564,@7565,@7573,@7575,@1444,@7576,I251,@7453| 7453:O4|@14322,@596,@7579,@7578 7454:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629 7455:D8,112|00822b35293629291a6d000e0e0c00021a6d000e0e0c0002031e29352a362a353b1a64000e0c000303042a360207292503511e2b3b6502031a550064301a58001a5d000e0e0c000356473c56682d2d1a5600347b07090006000000000000000060000000000000000000000000000000|@7456,I105,I218,I251,@6045,@6895,@122,@7104| 7456:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836296d657373466e283329 7457:O1|@7458 7458:D5,88|00842f1a5a000e0e0e0c00021a59000e0e0c000203252f3530362a313131311a4e000e0e0e0c00062a323232321a48000e0c00062a2a69270402013b1f050e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@7459,@7457| 7459:O1|@7460 7460:D13,272|00842f3530363139323a2c2b1a09016a3b2b291a0a010e0e0e0c00021a09010e0e0c0002031729362b3c1a03010c0003292b25042504511e253b6502012a65343b1af4000e0c000303112b1af200693b3c2b2e220f0c00056402343c28401ae7001aec000e0c00043c28401aea001adf000c00043d2b2b6a3c28403b1ad1000e0e0c00043c2a2f3c6b2b2a316a27053b2e693423103b2a0e0e0c00023d2a69293b692d2a69220c2a316a293b69220d3b2b1aac000e0c0004502a3b692c1a60000e0c00021a61000e0e0c00020304220d02031a9300221022152b1a93000c00045022102b6922140e0e0c0002502c27111f050e0e0e0e0e0e000000000000000000010000000000000000000000000000|@7461,I48,I105,I218,I106,I113,@588,-1,I11,@2249,I255,@6045,@6046| 7461:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629656e74657254636f6e283129 7462:O1|@7463 7463:D7,128|00842f1a82000e0e0e0c00021a81000e0e0c000203492f3530362a37291a68000e0c00021a69000e0e0c000203192935291a6400333333220e6805321a61000e0e0c00046402031a5e002b333333331a5e000e0e0e0c00062a2a69270502013b1f050e0e0e0e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@7464,@7306,@588,@7462| 7464:D4,72|0082560a23081a47002a56376a562a230d2a2a691a410056585669336b2a332b1a3d000e0e0c0004312a35452706440e000000000000000038000000000000000000000000000000|@7219,@7466,@7465,@7218| 7465:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7466:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7467:D8,112|00822b3929291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7456,I105,I218,I251,@6045,@7468,@122,@7104| 7468:S52|2068617320616c7265616479206265656e2075736564206173206120636f6e7374727563746f7220696e20746869732074797065 7469:O1|@7470 7470:D5,136|0088331a8a000e0e0e0c00021a89000e0e0c00020314321a76000e0e0e0c00021a75000e0e0c000202013b033e333534363435220c362c2b220e220e220e220e220e220e220e1a57000c000a2c2b220f220f220f220f220f220f220f1a49000e0e0c000a2a2a69270602013b1f090e0e000000000000000078000000000000000000000000000000|@3592,I105,I218,@7471,@7469| 7471:O1|@7472 7472:D9,232|008833353436220c37220d39220e3a3b2c291adb000c00021add000e0e0c0002031729362b3c1ad7000c0003292b25042504511e223b6502012a652a1ac9000e0e0c00023b2d69221023103b2a0c00023d2a69293b692d2a69280530220e22192d6805341aa9001aae000e0e0e0c00032922172217221a22182f220f221a1a9f000c000922192a692214032322102a6922140e0e0e0c000250221838221b3b6922122a69642a0e0e0e0c000251020e22183822112b692a0e0e0c000251220f3b2b1a64000e0c0004502927111f090e0e0000000000000000d8000000000000000000000000000000|@7474,I105,I218,I106,@7475,@7477,@1497,@7473,I255| 7473:O1|@7482 7474:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e73747273283229 7475:O1|@7476 7476:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@7475| 7477:O1|@7478 7478:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@7480,@7479| 7479:D2,48|00802b37561737292b1a2c002f0e0e0e7e0500030e0e0e0e000000000000000020000000000000000000000000000000|@7481,I27| 7480:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129 7481:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129283129 7482:D11,280|0087321a1a010e0e0e0c00021a19010e0e0c000207d3323533362a352b362c370402002b1af9000e0e0c00021af9000e0e0c000203282b35291af40022102210221022146805220f1aed000e0e0c00043d2a220e6a2c2a453b46260402062934453c465029352a363b2f69220f23103b2a0c00023d2a69293b692d2a693c28401abd001ac2000e0e0e0c00043c28401abe001ab3000c00043d2b2b6a32221569220d2a2c220e313b3b6807220e221a22121aa4000e0c0004220f221a221c22143c1a9c000e0c000622102c6922180e0e0e0c00022214221f221f221f221f221f221f221f1a810002020c000e0e0c00092d2a69271702013b1f080e0e0e0e0e0e000000000000000008010000000000000000000000000000|@1399,I105,I218,@7483,@7306,-1,I11,@2249,@6046,@7215,@7473| 7483:D4,72|0082560a23081a47002a56376a562a230d2a2a691a410056585669336b2a332b1a3d000e0e0c0004312a35452706440e000000000000000038000000000000000000000000000000|@7219,@7485,@7484,@7218| 7484:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7485:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7486:O3|@7487,@1720,@14444 7487:D13,328|00813c28403b1a47010c0004293b1a47015648691a49010e0e0c0004500402001a45012a1a49010e0e0c00035029352a361a44012b5667322d680531291a40010e0c00021a41010e0e0c0002031829352a362a2e301a38010e0c000450292503511e255102023b505031291a12010e0e0e0c00021a11010e0e0c000203ab29352a362a352937292f0e0c0002293c1a07010c000303043b5002832a1a020169320e0c0002502b37293629353c1ae9000e0e0c0003030d2938293c1adb000c00036402013b64031329362936293b3c1a8f000c0004503b26030242293629353b1ab6000e0e0e0c00030311293729353c1aa6000e0e0e0c00036402013b6403043b5002041aa200103b50293629372936293b3c1a4b000c0004503b2604502c250626051eb83b270502013b2706430e0e0e000000000000000038010000000000000000000000000000|@7489,I11,@7490,I255,@7512,@7515,@7525,I105,I218,@7488,I251,@464,@7453| 7488:O1|@7537 7489:S40|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229 7490:D18,544|00802b363c1a20020e0c000303051a1f020fde2b3529353b1a1d020e0e0c00036407db2b3529362d363c1a13020c00032a2a691a12023b1a16020e0e0e0c00031a15022a0e0c0002642a2a0e0e0c00026429353b1ae1010e0e0c000303952939291afc010e0c00021afd010e0e0c0002035f29361ae9010e0e0c00021ae9010e0e0c000203482935353e1aab010c000303312935362928281a9d010e0e0c000303033c021b29287b1a8d010e0e0c000303033c020b29285b1a7d010e0e0c00036402013b1aa1010e0e0c000202013b02013b03192a1a9801691a9c012a691a9f012a693b3e3c3b2d68056602012a6402030d0129293b691a8e012a69020210001a8d012a693b3c3b3b2d680527090fdb2b363c1a12010e0e0e0c000303051a770102dd2b3529362d363c1a13010c00032a2a6956473b1a17010c00032a2a0e0e0e0c00026429353b1aed000e0e0c000303932939291a08010e0c00021a09010e0e0c0002035f29361af5000e0e0c00021af5000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1aad000e0e0c000202013b02013b03192a1aa400691aa8002a691aab002a693b3e3c3b2d68056602012a64020129293b69020213001ab0002a691ab3002a693b3c3b3b2d68052709420e0e0e0e0e0e0e000000000000000010020000000000000000000000000000|@7492,I234,@1338,I251,I107,@14442,I253,@7493,I105,I218,@900,@901,@873,@871,@7499,@1338,@871,@7491| 7491:O5|0,0,0,@7507,@7506 7492:S11|7072696e742d7374617465 7493:O4|0,@7494,3,1 7494:O1|@7495 7495:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@7496,@14445,I253| 7496:S19|7072696e742d74797065436f6e737472536574 7497:O1|@7498 7498:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 7499:O5|0,0,0,@7501,@7500 7500:O2|@7504,0 7501:O2|@7502,0 7502:O2|0,@7503 7503:O5|@1349,1679,1679,0,0 7504:O2|3,@7505 7505:S7|4e6f745365656e 7506:O2|@7510,0 7507:O2|@7508,0 7508:O2|0,@7509 7509:O5|@1349,1678,1678,0,0 7510:O2|3,@7511 7511:S9|50726f636573736564 7512:O1|@7513 7513:D3,144|00812c3629353c1a8e000e0e0e0c000303112c3629353c1a7e000e0e0e0c00036402013b6403152c3629362d3629362b2a1a6400310e0e0e7e0800032c3629353b1a54000e0c000303112c3629353b1a46000e0e0e0c00036402013b6403152c3629382d3629382b2a1a3400310e0e0e7e0800033b430e0e000000000000000080000000000000000000000000000000|@7514,I251,I113| 7514:S26|5554494c49544945535f28292e6d61705461626c652831292d45 7515:O1|@7516 7516:D4,56|00813c28403b1a37000c00041a39002a2f6a1a3b002f2c6a2e2b452a4666430e000000000000000028000000000000000000000000000000|@7518,I11,@7519,@7517| 7517:D4,96|008056083b1a60000e0c000329291a5f000c00021a61000e0e0c0002032529352a362a352b362a3256870e0e0e0c0003030529680102082b250526041e2f3b270402013b65420e0e000000000000000050000000000000000000000000000000|@7524,I253,I105,I218| 7518:S24|5554494c49544945535f28292e6d61705461626c65283129 7519:D6,128|00802b3556173b1a7e000e0e0e0c000329291a7b000c00021a7d000e0e0c0002031e29352a362a35292f56880e0c00036403033c0207292503511e293b6502013b64030e2956382c1a55000e0e0c00040201292e2a6956473b2b1a4b000c0004503b2704420e0e0e000000000000000070000000000000000000000000000000|@7521,I253,I105,I218,@7520,I255| 7520:O1|@7522 7521:S32|5554494c49544945535f28292e6d61705461626c65283129656e746572283129 7522:D4,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203252d352e362a35292f310e0e0c000364030329020e292f2f1a40000e0c00042b2a69646502013b440e0e0e000000000000000048000000000000000000000000000000|@7523,I105,I218,@7520| 7523:S35|5554494c49544945535f28292e6d61705461626c6528312964656c6574652832292829 7524:S33|5554494c49544945535f28292e6d61705461626c652831296c6f6f6b7570283129 7525:D10,416|00802b561a0c0002293b1a9b010c0003032c2c3629353b1a8e010e0e0e0c0003031629382956490e0e0c000203033d02013c3c2a696502031a7501640202293529353c1a62010e0e0e0c0003031a29353c1a54010e0c000303043b5002041a5701103b5029360fcc2d1a54016956370e0e0c00022a353b1a2e010e0e0e0c000303043b5002041a3f01103b502a36293d2a1a3c010e0c00021a3d010e0e0c000203c02a352b362b3c1afd000e0e0c000303033c029f2a362c2a291a13010c00021a15010e0e0c0002038829352a362a3829353d1ad2000e0e0e0c0003641af8000e0c0002030c2c2a25042504511e343b025d2a3829353d1aae000e0e0e0c000303043b5002041ad700103b5029362922101ad400121300010002000e0e0c0004293c1a83000c000303033c0221293b1a760002024d000e0e0e0c000303033b02012f292e2508250826061e913b64666502012a662a2a2505250526031ecc3b6602012965293b1a3f000c000303032c02033c2a69312a696456670e0e0e0c000250296665420e0e0e000000000000000090010000000000000000000000000000|@7527,I251,@7528,@7529,@474,@7531,I105,I218,@7533,@7526| 7526:O1|@7535 7527:S54|545950455f5452454528292e636f6d707574654461746174797065457175616c697469657328322967656e457175616c697479283129 7528:O2|1,1 7529:O4|101,@1426,0,@7530 7530:O5|@1349,1687,0,1687,0 7531:O4|101,@1426,0,@7532 7532:O5|@1349,1688,0,1688,0 7533:O4|101,@1426,0,@7534 7534:O5|@1349,93,0,93,0 7535:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7536| 7536:S57|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229636f6e737472457128332965712d283129 7537:D10,488|00822d3529372e0e0e0c0002291ae0010e0c00021ae1010e0e0c000207ca293529353b1ada010e0e0e0c000303043b5002041ad301103b502936312a692d37293629353d1ab9010e0e0c000303041abf01103b503b5029353b1aa4010e0c00030322293729353c1a96010e0e0e0c0003030d2936293b1a9f010c0003640202293664020d2936293b1a8d010e0e0c0003646503033c027c2a1a55010e0e0c00021a55010e0e0c000203043b5002041a6f01103b502a3529352937293629353d1a3e010e0e0e0c000303041a4301103b503b5029353b1a28010e0c00030326293729353c1a1a010202d4000e0e0e0c0003030d2936293b1a1f010c0003640202293664020d2936293b1a0d010e0e0c000364270403a329291ad6000e0e0e0c00021ad5000e0e0c0002038929352a362a352937293629353c1ac6000e0e0e0c0003030d2938293c1ab7000c00036402013b64031329362936293b3c1acb000c0004503b26030242293629353b1a92000e0e0e0c00030311293729353c1a82000e0e0e0c00036402013b6403043b5002041a9e00103b50293629372936293b3c1a87000c0004503b26042b250526041e97260402023b505002023b50296602032f3b692b373b2b692a2a69652f2f7d0800020000000000000000d8010000000000000000000000000000|@7538,I105,I218,I251,@7531,@1377,I253,@1712,I255,@7453| 7538:S43|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229283129 7539:O1|@7540 7540:D9,128|00802b363c1a80000e0c000303051a7f0002532b35293b1a7e000e0e0e0c00036403051a7a00023e2b363c1a5a000e0e0e0c000303051a6f00022b2b35293c1a56000e0e0e0c00036403051a620002162b363c1a32000e0e0e0c000303051a570002031a5a00420e000000000000000070000000000000000000000000000000|@4215,I234,@1338,I251,@7542,@1338,@7549,@1338,@7541| 7541:O5|0,0,0,@7557,@7556 7542:O5|0,0,0,@7544,@7543 7543:O2|@7547,0 7544:O2|@7545,0 7545:O2|0,@7546 7546:O5|@1349,1577,1577,0,0 7547:O2|3,@7548 7548:S5|4d61796265 7549:O5|0,0,0,@7551,@7550 7550:O2|@7554,0 7551:O2|@7552,0 7552:O2|0,@7553 7553:O5|@1349,1576,1576,0,0 7554:O2|3,@7555 7555:S2|4e6f 7556:O2|@7560,0 7557:O2|@7558,0 7558:O2|0,@7559 7559:O5|@1349,1575,1575,0,0 7560:O2|3,@7561 7561:S3|596573 7562:D1,48|00802b56180c0002505607372c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@7563| 7563:S80|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657256616c466e283129 7564:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 7565:D8,160|00803c28403b1a9f000c00041aa1002a6956290e0e0c00022a3b1a9b000c00033c28403b1a81000e0e0c00041a91002a6956580e0e0c00022a3b1a7b000c0003566723093b2a0e0e0e0c000264293b1a76000e0e0e0c000303032a020b2a2a1a6e000e0e0e0c0003293b1a5b000c000303032e020b2e2a1a5e00220c7e0b00032708420e0e0e0e0e000000000000000090000000000000000000000000000000|@7567,I11,@7568,I253,@7569,I251,@7570,@7566| 7566:O1|@7572 7567:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d616c6c56616c4e616d6573283129 7568:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7569:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7570:O1|@7571 7571:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7570| 7572:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7566| 7573:D1,48|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@7574| 7574:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657254797065466e283129 7575:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7576:O1|@7577 7577:D7,152|00802b1a9a000e0e0e0c00021a99000e0e0c000203652b352c362a37293629353d1a8c000e0c000303041a8b00103b5029353b1a7a000e0e0e0c00030322293729353c1a6a000e0e0e0c0003030d2936293b1a6b000c0003640202293664020d2936293b1a59000e0e0c0003642c1a57000c00022a2a69270602013b420e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,I251,@1377,I253,@7576| 7578:O5|@1380,352,0,352,0 7579:S41|736574457175616c6974793a2063616e27742073657420657175616c69747920617474726962757465 7580:D8,112|00822b3629291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7398,I105,I218,I251,@6045,@6895,@122,@7104| 7581:O1|@7582 7582:D7,120|00832e1a7a000e0e0e0c00021a79000e0e0c000203412e352f362a37291a60000e0c00021a61000e0e0c000203152935291a5c003232220c6b321a5b000c00046402031a5a002b3232321a5b000c00052a2a69270502013b1f040e0e0e0e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,@7583,@7306,@588,@7581| 7583:D3,64|0082560923085619230d2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@7584,@7218| 7584:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7585:O1|@7586 7586:D8,376|0085303531363239333a3423063b2c693423103b2a0c00023d2a69293b692d2a69221135293c1a57010c000364031d33321a54016a301a570169323b2b2d22150e0c0005220d2d2b6a6602d922113528051a2c010e0c000303962211362212382a322a3b1a19010e0e0c0003030c293b1a0d010e0e0c0003024f2a352b362b1a16010e0e0e0c00021a15010e0e0c000203352b352c362c3528061ae3000c000303112c362b352a2a1ad5000e0e0c00036502013b030d2b2a2506250626041e5c3b02013b6502013b65651ad3000c000203033b02182937293629353d1aa1000e0e0c000303033b02032a6801656502013b293b1a8a000e0e0e0c0003031e34331a85006a31221469333b2b2d22160e0e0e0c0005220e2e2b6a6602082935220c2c2b6a6464342212341a7c000e0c000450342a6922100e0e0e0c000250293b69343b2b1a6a000e0e0e0c000450220f382b3b69220e2a69642a22110e7d160002000000000000000068010000000000000000000000000000|@7587,I251,I48,@588,I105,I218,@6046,I255| 7587:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f6365737354797065283229 7588:O1|@7589 7589:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 7590:O1|@7591 7591:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 7592:O1|@7593 7593:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 7594:O1|@7595 7595:D8,160|00832e1aa2000e0e0e0c00021aa1000e0e0c000203692e352f362a352b3731230d1a940032322d6b1a95002b2e2c1a97000c0005293b1a97000c000303033b02092935292e6929680165293b1a81000e0e0c000303122f220d220d220d1a7800220e0e7b060e0005293530220e220e220e1a64000e0c00052a2a69270a02013b1f040e0e0e0e0e0e000000000000000090000000000000000000000000000000|@4144,I105,I218,@7596,@6990,@7116,I251,@7594| 7596:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7597:O1|@7598 7598:D9,224|008530353137323829291adb000c00021add000e0e0c0002031f29352a362a353b1ad4000e0c000303052a68010207292503511e2a3b6502013b64291aa9000e0e0c00021aa9000e0e0c00020311293529353b1aa2000e0e0e0c00036402013b0315293529363e2a693c220e69293b692b2a69270502073c3469293b69641a7f0033220c220f2d68051a7c00343422102e68051a7a00220c3422112f6805292c2c6a31282e1a70000e0c0003313532392a2d2b3c2f2e3b1a66000e0e0e0c00083b270d1f060e0e0e0000000000000000d0000000000000000000000000000000|@7600,I105,I218,I251,@7601,@7605,@7599,@122,@7226| 7599:D3,72|00802b352c36295639564a1a42000e0e0e0c000456382c2b1a3d000e0e0c0004505637372c2b692a300e0e0e7d070002000000000000000038000000000000000000000000000000|@7603,@7132,@1597| 7600:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e7472696573283229 7601:D3,80|00802b352c3629352a36295659566a1a46000e0e0e0c00042b2a6956682f2b1a3e000e0e0e0c0004505667382f2b692a330e0e0e7d0a0002000000000000000040000000000000000000000000000000|@7603,@7602,@1597| 7602:O1|@7604 7603:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e74726965732832295f2d283129 7604:D5,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e362a2f2f1a50000e0c00042a30301a4e000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@7132,@7602| 7605:D3,72|00802b352c36295639564a1a42000e0e0e0c000456382c2b1a3d000e0e0c0004505637230a2c2b692a300e0e7d070002000000000000000038000000000000000000000000000000|@7603,@7606,@1597| 7606:O1|@7607 7607:D4,144|00822d352e362f3730382b353c1a88000e0c000303262b363c2a692b3b1a78000e0c0003030331020b312c1a72000e0e0e0c00032f2b2f2c6b6602352b353b1a56000e0e0e0c000303262b363f2a336a2b3b1a43000c0003030331020b312c1a46000e0e0e0c00032f2b2f2c6b660201312704440e0e0e0e000000000000000080000000000000000000000000000000|@7609,I251,@7610,@7608| 7608:O1|@7612 7609:S35|5354525543545f56414c5328292e6d616b6553656c6563746564537472756374283329 7610:O1|@7611 7611:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7610| 7612:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7608| 7613:O1|@7614 7614:D1,32|00822c2c69440e0e000000000000000010000000000000000000000000000000|@7615| 7615:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229283329 7616:O1|@7617 7617:D1,32|00822c2c69440e0e000000000000000010000000000000000000000000000000|@7615| 7618:O1|@7619 7619:D1,32|00822c2c69440e0e000000000000000010000000000000000000000000000000|@7615| 7620:O1|@7621 7621:D17,424|008d343c1aa9010e0e0c0003220f351aa6012b692a0c000264220f351aa101220e2d6a2a0e0c0002641a9c01220d220d6a0403002a2a1a97010c00035029352a362b372217291a8f010c00021a91010e0e0c0002031d29352a362a2215220c2216311a83010c000650292503511e283b6502013b642218291a5d010e0e0c00021a5d010e0e0c0002033529352a362a221b221b2218220f2218221c221b220c220f221c221c221c221c221c222a1a40010e0c001150292503511e423b6502013b642219291a11010e0e0c00021a11010e0e0c000203af29352a362a37293b1a17010c000329352a382b392c23062a291ae6000e0e0e0c00021ae5000e0e0c0002031e29352a362a353b1af4000e0c000303042a360207292503511e2c3b6502031ae500641ae900221d221f6a2d22153c22212e2e22221adf000c0008502b3b1abe000e0e0e0c000303041ad300103b503b502b35293b3b1ace000e0e0e0c0004502220373032692a0e0c000251313b321ab5000e0e0c00045032250c260b1ebb3b270b02013b270b1f0e0e0e0e0e0e0e000000000000000098010000000000000000000000000000|@7623,I106,@7624,@7629,@7635,@6133,I105,I218,@7637,@7644,I253,I251,@6045,@7691,@7622,@1792,I255| 7622:O12|@7693,@1469,@14318,@502,@14352,@1672,@14354,@1682,@14356,@1690,@14323,@510 7623:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e283429 7624:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7626,@7625| 7625:O1|@7627 7626:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283129 7627:D13,216|00822c352d3628062b2b6a651ad1000e0e0c0002293528061acd000e0e0c000303043b5002041ac700103b5029362a37293f1ac3000c0003293b1aab000c0003641abc000e0c00022a3c1aab000c0003293b1a93000c0003641aa4000e0c00023c28401aa2001aa7000c0004311aa8000e0c00020303310207311aa3000c0002293e1aa3000c00032d03033f02013b2a2a1a9c000e0c0003293d1a93000c000329301a8b000c00032806302b6a343b2b1a85000e0e0c0004503b270d440e0e0e0000000000000000c8000000000000000000000000000000|@7628,@1435,I251,@1423,I243,I218,@588,I11,I105,I152,I245,I242,I255| 7628:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283229 7629:D2,48|00802b352c36562756381a2b002f0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@7626,@7630| 7630:O1|@7631 7631:D14,256|00832c230c2f2a0e0e0c000264293b1af6000e0e0e0c000303bc2e352f3628062b2b6a651ae9000e0e0c0002293528061ad5000e0e0c000303043b5002041ad700103b5029362a37293f1ad3000c0003293b1ab3000c0003641acc000e0c00022a3c1abb000c0003293b1a9b000c0003641ab4000e0c00023c28401ab2001ab7000c0004321ab8000e0c00020303320207321ab3000c0002293e1ab3000c00032d03033f02013b2a2a1aac000e0c0003293d1aa3000c000329301a9b000c00032806302b6a343b2b1a95000e0e0c0004503b270d020e293529301a8b002f0e0e7e080003641f040e0000000000000000f0000000000000000000000000000000|@7628,I251,@1435,@1423,I243,I218,@588,I11,I105,I152,I245,I242,I255,@7632| 7632:O1|@7633 7633:D10,248|00812c352d3628062b2b6a651af1000e0e0c0002293528061aed000e0e0c000303043b5002041ae7001029362a372e352f3628062b2b6a651ac5000e0e0c0002293528061ac1000e0e0c000303043b5002041abb001029362a372c3e1ab9000e0e0c0003293b1ab7000c0003030c1ab7002a1abb000c00030201292b3e1a98000e0c0003293b1a97000c0003030c1a97002a1a9b000c00030201292b2a1a98000e0c0003270403193135323628062b2b6a303b2b1a89000e0e0c0004503b6602163235333628062b2b6a2d3b2b1a70000e0c0004503b662706430e0e0e0e0e0e0000000000000000e8000000000000000000000000000000|@7634,@1435,I251,@1423,I216,I234,@410,I106,I233,I255| 7634:S27|545950455f5452454528292e6c696e6b5479706556617273283229 7635:D8,112|00822b3929291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7636,I105,I218,I251,@6045,@6895,@122,@7104| 7636:S73|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834296d7367466e283329 7637:O1|@7638 7638:D18,424|00842f36291aa8010e0c00021aa9010e0e0c000203043b5002041aa301103b50293529352a37333734392c3629352a373b2a69220f23103b2a0c00023d2a69293b692d2a693c28401a7d011a82010e0e0e0c000422141a57010c000203042214020a22141a71010e0e0c0002293e1a6f010c0003293b1a6f010c0003293b1a67010c0003293b1a5f010c000328062f2b6a3c28401a59011a36010e0e0e0c00043c28401a52011a27010c00043d2b2b6a3c28403b1a19010e0e0c00043c28403b1a0d010e0e0c00043c28403b1a01010e0e0c00042a2c2b6a2968013c28403b1aee000e0e0e0c000429680122183d32220d2215302f6807221e353b2a291ab0000e0c00021ab1000e0e0c0002031729362b3c1aeb000c0003292b25042504511e233b6502012a65221d3b2b1ada000e0e0e0c000450293b1ad6000e0e0e0c0003031422283c222822221acc001ad1000e0e0c000602013b221c222a22221ac8000e0c000450221c2228222b22233b1abf000c000650221f3b2e1a8c000e0c000450221c2d69222722270e0e0e7d2b0002000000000000000098010000000000000000000000000000|@7640,I105,I218,@7641,@588,I11,I152,I245,I242,-1,@2249,I106,I255,I113,@7639,@7104,@6046,@7215| 7639:S46|436c617573616c2066756e6374696f6e20646f6573206e6f74206861766520616e7920706172616d65746572732e 7640:S84|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342966696e644e616d65416e645061747473283129 7641:O4|@14322,@596,@7643,@7642 7642:O5|@7096,1668,0,1668,0 7643:S41|66696e644e616d65416e6450617474733a206261646c792d666f726d65642070617273652d74726565 7644:O1|@7645 7645:D27,592|008f221137293b1a4e020e0e0e0c000322133522143622153822163a3c28401a3e021a43020c000428062a1a42026a2d291a44020e0c00021a45020e0e0c0002033c29352a362a221c221c220c221d221d221d221d221d2211221e221e221e221e221e221e221e221622151a1a020e0e0e0c001450292503511e495102023b505033291af2010e0e0e0c00021af1010e0e0c0002031829352a362a331af1010e0e0c000350292503511e275102023b50502f382a2a1ae0010e0c0003291ab8010e0c00021ab9010e0e0c000207d32935221c3b69280c2a221e221e3468051abf012a30221e221d1abe010e0e0e0c0006220c353c28401a67011a6c010e0c00043c28401aaa011a5f010c00043c28401aa6011a53010c00042c2b2d22102d6805280e2a692212381a96012b2b222622251a75010e0e0c00062224222322241a87011a8c010e0c0005220c2a0e0e0c000264293b691a81012a691a84012a693b3b3b3b2d6805291a0f010c000203041a7701103b503b50293b691a74012a69302a691a74012a6922112a691a73012a691a76012a693b3e3c3b2d6805291ad900020289000e0e0c000203041a3b01103b503b5022313522323622333722343822353922363a223723062238230722392308223a2309223b230a223c230b223d230c223e230d223f230e2240230f224123101a1d010e0e0c001222172a1a1a010e0e0e0c00032968013c2a2e22246b2235382236230c2a3b3c1a06010e0e0e0c0004502b2a222c0e0e0e7d3b00023b270a1f100e0e0e0e0e0e0e000000000000000040020000000000000000000000000000|@7647,I253,@588,I11,79992,I105,I218,@7648,@7678,@1326,@7685,@7168,@6380,@7686,@7689,@7171,@7172,@2241,@7193,@1363,@871,@871,@871,@7646,@7107,@6655,I255| 7646:O2|3,@7690 7647:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e67283129 7648:O1|@7649 7649:D42,1184|00922214352215362216372b352c362d38221a3b693c28403b1a8c040e0c00043c28401a8a041a7f040c00043c28401a86041a73040c00043c28401a7a041a67040c00042a2e2d34302e6806293b69280c2a22222222220e680532362220382a3b2b1a5b040c0004501a5c0422212d6a0403002a2a1a58040e0c00035029352a362b3722243c1a4f040c000322122227222622262226302f1a45040e0e0c0008291a44040e0c00021a45040e0e0c0002033229352a36293b1a3d040e0e0c000303032a021c2b3c1a36040e0e0e0c0003291a34040e0c00023b2a3c6a3e2c2b6a666502031ad10322233b2b1ad2030e0e0e0c000450222523061a14042a2225306b222723082228392229230d222a3a222b230b223236223236222e230c1af8032a2c2e6b2230372231382232352233230a223436223523071ae5032237223422196b2d2c313122122211221631221732220d22162213221a680e221522302b222c222d2240223822382238223c0c000a22261a73030c00021a75030e0e0c000207db222635291a9f03223f223c223e6b223f1a9b030c00042b2a1a9b030c0003291a44030e0c00021a45030e0e0c000207dd29351a8903222f2f224322421a87030c00063b1a88030e0c00022d1b10272b22433b1a81030e0e0c0006293b691a7e032a691a81032a693b3b3b3b2d6805291af4020e0c000203041a7303103b503b502247224622471a6d031a72030e0e0e0c0005312a0e0e0e0c000264293b691a65032a691a68032a693b3b3b3b2d6805291ab3020c000203041a3303103b503b50293b691a50032a69302a691a50032a69220f2a691a4f032a690202a3001a4e032a693b3e3c3b2d6805291a79020e0e0c000203041af702103b503b5022543522553622563722573822583902026b0022593a225a2306225b2307225c2308225d2309225e230a225f230b2260230c2261230d2262230e2263230f226423101af5020e0e0c001222372a1af2020e0e0e0c00032968013c2a2e22476b2258382259230c2a3b3c1ad6010e0e0e0c0004502b2a0e0e0c0002261c02023b502a6602012922303b2b1ab6010e0e0e0c00045022162a1ab1020e0e0c00032922311a16020e0e0e0c0003291abc010e0c00021abd010e0e0c000207dc29351a910222232d224322421aff010c00063b1a00020e0c000222341b10272b22433b1af8010e0c0006293b691a6e022a691a71022a693b3b3b3b2d6805291a6c010e0c000203041aeb01103b503b502247224622471ae5011aea010e0e0e0c0005312a0e0e0e0c000264293b691add012a691ae0012a693b3b3b3b2d6805291a2b010c000203041aab01103b503b50293b691ac8012a69302a691ac8012a69220f2a691ac7012a691a02022a693b3e3c3b2d6805291af5000e0e0c000203041a7301103b503b5022543522553622563722573822583922593a02026800225a2306225b2307225c2308225d2309225e230a225f230b2260230c2261230d2262230e2263230f226423101a71010e0e0c001222372a1a6e010e0e0e0c00032968013c2a2e22476b2258382259230c2a3b3c1a52000e0e0e0c0004502b2a0e0e0c0002271b02013b3b27301f130e0e000000000000000090040000000000000000000000000000|@7651,I11,@6380,@1444,I255,@7652,@6133,I106,@7655,I105,I218,I251,@6634,@7165,@7657,@7658,@7659,@7667,@7306,@1326,@7669,@7168,@1330,@1469,@871,@7326,@1363,@7171,@7172,@2241,@7193,@871,@871,@871,@7670,@7107,@6655,@7672,@7674,@871,@7675,@7650| 7650:O2|3,@7677 7651:S98|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129 7652:D8,112|00822b3929291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7654,I105,I218,I251,@6045,@7653,@122,@7104| 7653:S39|2068617320616c7265616479206265656e20626f756e6420696e207468697320636c617573652e 7654:S107|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c617573652831296d657373466e283329 7655:O1|@7656 7656:D6,104|0086311a6a000e0e0e0c00021a69000e0e0c00020331313532362a2f2f3b1a5f003b220f220f220f220f1a5b000c000b2a3434343434341a56000e0e0e0c00082a2a69270402013b1f070e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@7210,@7213,@7655| 7657:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 7658:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 7659:D8,160|00803c28403b1a9f000c00041aa1002a6956290e0e0c00022a3b1a9b000c00033c28403b1a81000e0e0c00041a91002a6956580e0e0c00022a3b1a7b000c0003566723093b2a0e0e0e0c000264293b1a76000e0e0e0c000303032a020b2a2a1a6e000e0e0e0c0003293b1a5b000c000303032e020b2e2a1a5e00220c7e0b00032708420e0e0e0e0e000000000000000090000000000000000000000000000000|@7661,I11,@7662,I253,@7663,I251,@7664,@7660| 7660:O1|@7666 7661:S109|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129626f6479456e762d283129 7662:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7663:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7664:O1|@7665 7665:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7664| 7666:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7660| 7667:D3,64|0082560923085619230d2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@7668,@7218| 7668:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7105,@7104| 7669:S11|45787072657373696f6e3a 7670:O2|3,@7671 7671:S51|426f6479206f662066756e2062696e64696e6720646f6573206e6f74206d61746368207479706520636f6e73747261696e742e 7672:O1|@7673 7673:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203152c352d36292e1a41000e0e0c00033d2c2b6a6602012b430e0e0e000000000000000038000000000000000000000000000000|@1746,I105,I218,@7672| 7674:S7|436c617573653a 7675:O2|3,@7676 7676:S14|4f7468657220636c61757365733a 7677:S59|54797065206f6620636c6175736520646f6573206e6f74206d61746368207468652074797065206f662070726576696f757320636c61757365732e 7678:O1|@7679 7679:D7,152|00812c37293b1a97000c0003293a293b1a95000e0e0c000303041a9300103b503b5029352935293b1a75000e0e0c00032b3732352b2a1a7f000c00032b3b1a5f000c0003293b1a5f000c000303032a020b2a2a1a6a000e0e0e0c00032d3b2b1a66000e0e0e0c0004502f3b3b1a59000e0e0c0004503b270b430e0e0e0e0e0e0e000000000000000088000000000000000000000000000000|@7681,I253,I251,@1792,@7682,@7680,I255| 7680:O1|@7684 7681:S93|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6f766552656673283129 7682:O1|@7683 7683:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d362a2e692a2f1a46000e0e0e0c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@7682| 7684:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7680| 7685:S9|46756e6374696f6e3a 7686:O1|@7687 7687:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@7688| 7688:S95|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6b4964656e74283229283129 7689:S9|5661726961626c653a 7690:S62|54797065206f662066756e6374696f6e20646f6573206e6f74206d617463682074797065206f6620726563757273697665206170706c69636174696f6e2e 7691:D3,112|008056083556183656283756383856483956583a5668230656782307568823085698230956a8230a56b8230b56c8230c56d8230d56e8230e56f8230f1211000100020023101a30000e0c001256172a1a2e002e0e7e040003000000000000000060000000000000000000000000000000|@7692,@7107,@6655| 7692:S45|54595045434845434b5f50415253455452454528292e7061737332283529666f756e644e656172283129283129 7693:D9,352|00862e230d29291a5e010e0e0e0c00021a5d010e0e0c0002032429352a362a35291a54011a59010e0e0c00036403052a68010207292503511e323b6502013b64293b1a3b010c0003036b1a3b01291a17010c00021a19010e0e0c0002032429352a362a35291a10011a15010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1af7000c000303041aff00103b503b50293529351adb001ae0000e0c000303043b5002041aeb00103b50293765021e293529351abc001ac1000e0e0c000303043b5002041acb00103b502937643c33690402002a220e2b220f220e56a72213220e22102212220c121100010002001212000100030012130001000400121400010005001215000100060012160001000700121700010008001218000100090012190001000a00121a0001000b001a6a000e0e0e0c0016503b27051f070e0e0e0e0e0e000000000000000050010000000000000000000000000000|@7695,I105,I218,@14405,I251,@2781,@2836,@1576,@7694| 7694:O1|@7696 7695:S34|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729 7696:D34,1616|009422163522173622171a4b060c000229353e1a4a060e0e0e0c0003033d2936291a4406221922192219221922192219221922192219221922192219221922192219221922192219222e1a23060c001622192a35452a3646650fd529353d1aff050c0003037229362a37040200221c2b2b221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c1ad0050e0c00165029352a362a2a69292f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f221f1a990522200e0e7b17200016293528051a81050e0e0c000307dc29362a382937293629353d1a6c050e0c00036503b72937293629353d1a5b050c000303043b5002041a6705103b5029362a372a2f1a63050c00031a65052a690402002c2b2b1a62050202fd040e0e0e0c000450293504020022242b2b2224222422242224222422242224222422242224222422242224222422242224222422241aff040c0016502935040200220c2a1af00422262226222622262226222622262226222622262226222622262226222622262226222622161af7040c001750293522252a45221046270c023f2a1ab204221a221a221a221a221a02023000221a221a221a221a221a221a221a221a221a221a221a221a221a222f1abd040e0e0c0016221a2a35452a364664650fce293528061a65040e0e0c000307dc29362a37293e1a9d040e0e0c0003293b1a9b040c0003030c1a9b042a1a9f040c000302012929221b1a9b040c000365035b293e1a70040e0c0003293b1a6f040c0003030c1a6f042a1a73040c0003020129291b0f271a76040e0e0e0c0003651a74040e0c000203212a3b1a71040e0e0c000329353f1ae6030e0e0e0c00031a55040e0e0c00026402013b02013b07cd2c1a43040c000229030b22193c1a47040c000302031b0f272b3d1a42040e0e0e0c0003293b1aa7030c0003641a180402026b030e0c000203092a03032f02013b02013b03221a1f041a240402024403221b221b221b221b221b221b1a19040e0e0c0009503b02012f2c3f1af2030e0e0e0c0003293b1a57030c0003641ac8030e0c00022c031b2d3d1ad4030e0c0003293b1a3b030c0003641aac030e0c000202013b2e3c1ab8030e0c0003293b1a1f030c0003641a90030e0c00023c28401abe031ac3030c00042e1ac403020272000e0c000203032e02072e1abb030c0002293e1abb030c00032e03033f02013b2a2a1ab4030e0c00032f03033d02013b2a2a1aa4030e0c000329311a9b030c00032806312b6a22103b1a35030e0e0c0003323b2b1a8a030e0e0e0c00045022113b2c1a7c030e0c000450220d22146927100202221b2b3b1a07030c000322133c1a7e020e0e0e0c000307d929353f1a70020e0c000307cf293629293b1a62020e0e0e0c000303033b023529352a362a37293629353c1a49020e0e0c00036403102936293622192a1a37020c00036502013b6403033c0207292503511e413b65640306221268010fd029293b1a13020c000303033b023529352a362a37293629353c1afd010e0e0c00036403102936293622172a1aeb010c00036502013b6403033c0207292503511e3e3b65640306221068010fd429293b1ac7010c000303033b023d29352a362a37293629353c1ab1010e0e0c00036403182936293622152a1a9f0102041e01ef000e0e0c00036502013b6403033c0207292503511e463b65640306220e680102a029293b1a73010c000303033b023929352a362a37293629353c1a5d010e0e0c00036403142936293622132a1a4b0102026e000c00036502013b6403033c0207292503511e423b65640306220c6801025029293b1a23010c000303033b023929352a362a37293629353c1a0d010e0e0c00036403142936293622112a1afb0002021e000c00036502013b6403033c0207292503511e423b6564030533680102013b293b1ad4000e0c000303041ab301103b503b502935293528053b2b2d3b6805313b2b1a94010e0c0004503b2606022b29353e1aa4000e0c0003031d1a8b011a9001221b221b221b221b221b221b1a31010e0e0c00095002023b5002023b502c3b1af6000e0e0e0c00032b2a221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e221e1a4d00221f0e0e7b171f0016221922182a35452a364664661f150e0e0e0e0e0e000000000000000040060000000000000000000000000000|@7698,@1435,I251,@7694,@7699,@1731,@1734,@7701,@1414,@7702,@7704,I216,I234,@410,I106,I231,I113,I218,I253,I107,I243,@6985,@7706,@7707,@588,I11,I105,I152,I245,I242,I255,@7710,@6985,@7697| 7697:S32|697320616e20756e7265736f6c76656420666c657869626c65207265636f7264 7698:S44|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e28372967656e6572616c283229 7699:O1|@7700 7700:D4,168|009422161aa9000e0e0c00021aa9000e0e0c0002037622163522173629221822182218221822182218221822182218221822182218221822182218221822182218221822181a78000e0c00162b360402002b2b2b221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c221c222f0e0e0e0c00165029352a362a2a69270702012b1f150e000000000000000098000000000000000000000000000000|@1746,I105,I218,@7699| 7701:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 7702:O1|@7703 7703:D4,176|009522171ab1000e0e0c00021ab1000e0e0c000203762217352218360402002a2a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a221a1a7c000e0c00175029352a362a2a69292f221e221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d221d2230221d0e0e0e7b171e001622162c453c461f160e0e0e0e0000000000000000a0000000000000000000000000000000|@1746,I105,I218,@7702| 7704:O1|@7705 7705:D4,168|009422161aa9000e0e0c00021aa9000e0e0c0002037222163522173629221822182218221822182218221822182218221822182218221822182218221822182218221822181a78000e0c00160402002a2d2b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b221b222e0e0c00165029352a362a2a69270602012b1f150e0e0e0e0e000000000000000098000000000000000000000000000000|@1746,I105,I218,@7704| 7706:S29|696e636c75646573206120667265652074797065207661726961626c65 7707:O1|@7708 7708:D13,392|00873b1a8a010e0e0e0c000231230d29291a84010e0c00021a85010e0e0c0002032429352a362a35291a7c011a81010e0e0c00036403052a68010207292503511e303b6502013b64293b1a63010c0003036b1a6301291a3f010c00021a41010e0e0c0002032429352a362a35291a38011a3d010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1f010c000303041a2701103b503b50293529351a03011a08010e0c000303043b5002041a1301103b50293765021e293529351ae4001ae9000e0e0c000303043b5002041af300103b502937643e220e69291ab5000e0e0c000203041ae300103b503b50332b2f220c3b22100e0e0e0c00063e220f69291a90000e0c000203041abf00103b503b50293b691abc002a692c2a691abc002a692f2a693b3e3b3b2d6805291a64000e0c000203041a9300103b503b503b22110c00022968013c2a2d22146b2217382218230c2a3b3c1a8a000e0e0e0c0004502b2a22150e0e0e7d1c0002000000000000000078010000000000000000000000000000|@7709,@1330,I105,I218,@14398,I251,@2781,@2836,@1576,@1363,@871,@871,I255| 7709:S46|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729676976654572726f72283229 7710:O4|@14322,@596,@7712,@7711 7711:O5|@1349,2825,0,2825,0 7712:S25|67656e6572616c3a204e6f206d61746368696e672074797065 7713:O1|@7714 7714:D18,376|008c343c1a79010e0e0c0003220e351a76012b692a0c000264220e351a7101220e2d6a2a0e0c0002641a6c01220d220d6a0403002a2a1a67010c00035029352a360403003b2a1a5f010c00035029352a362b3722192e2c22172216221a221922111a4c010e0c000929221b2a1a49010e0e0c00021a49010e0e0c00020314291a36010e0e0e0c00021a35010e0e0c000202013b033b2a352b362b352c362c2b221e3322232223220f221f2223222022202220221d2221222722291a0b010c0011502b2a2506250626041e5e3b270402013b652a221c2a3b1af6000e0e0e0c0003031a293b1ae9000e0e0c000303043b5002041ae300103b503b5002552a352b362b1ab4000e0c00021ab5000e0e0c000203043b5002041ac700103b502b352c362a362b372a1ac0000e0c00021ac100221f22216a3022172c22232f2e22241ab7000c0008502f2e250a250a26081e782608511aab00221869293222117d1d0002000000000000000068010000000000000000000000000000|@7716,I106,@7717,@7722,@7725,@6133,@5990,@7727,I105,I218,@7733,I251,@5168,@5168,@7747,@7753,@7622,@7715| 7715:D4,80|00802b352c36292306293b1a4a000e0e0e0c000303041a4700103b502935293b3b1a44000e0c0004505647372d2d692a310e0e0e7d080002000000000000000040000000000000000000000000000000|@7754,I251,@1792,I255| 7716:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329 7717:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7719,@7718| 7718:O1|@7720 7719:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283129 7720:D13,216|00822c352d3628062b2b6a651ad1000e0e0c0002293528061acd000e0e0c000303043b5002041ac700103b5029362a37293f1ac3000c0003293b1aab000c0003641abc000e0c00022a3c1aab000c0003293b1a93000c0003641aa4000e0c00023c28401aa2001aa7000c0004311aa8000e0c00020303310207311aa3000c0002293e1aa3000c00032d03033f02013b2a2a1a9c000e0c0003293d1a93000c000329301a8b000c00032806302b6a343b2b1a85000e0e0c0004503b270d440e0e0e0000000000000000c8000000000000000000000000000000|@7721,@1435,I251,@1423,I243,I218,@588,I11,I105,I152,I245,I242,I255| 7721:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283229 7722:D2,48|00802b352c36562756381a2b002f0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@7719,@7723| 7723:O1|@7724 7724:D14,256|00832c230c2f2a0e0e0c000264293b1af6000e0e0e0c000303bc2e352f3628062b2b6a651ae9000e0e0c0002293528061ad5000e0e0c000303043b5002041ad700103b5029362a37293f1ad3000c0003293b1ab3000c0003641acc000e0c00022a3c1abb000c0003293b1a9b000c0003641ab4000e0c00023c28401ab2001ab7000c0004321ab8000e0c00020303320207321ab3000c0002293e1ab3000c00032d03033f02013b2a2a1aac000e0c0003293d1aa3000c000329301a9b000c00032806302b6a343b2b1a95000e0e0c0004503b270d020e293529301a8b002f0e0e7e080003641f040e0000000000000000f0000000000000000000000000000000|@7721,I251,@1435,@1423,I243,I218,@588,I11,I105,I152,I245,I242,I255,@7632| 7725:D8,112|00822b3929291a6f000c00021a71000e0e0c0002031e29352a362a353b1a68000e0c000303042a360207292503511e293b6502031a5900642f1a5c001a61000e0e0c000356373c56582d2d1a5a00337b070800060e0e0e0e000000000000000060000000000000000000000000000000|@7726,I105,I218,I251,@6045,@6895,@122,@7104| 7726:S75|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833296e6577456e762d283329 7727:O1|@7728 7728:D7,128|0087321a82000e0e0e0c00021a81000e0e0c0002034d323533362a352b382c391a75002b220e2c221168052c2a333b1a6e002f22122212221222121a6a000e0e0e0c000b2e22102210221022102210221022101a5a000e0e0e0c00092a2a69270802013b1f080e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@7730,@7729,@7213,@7727| 7729:O1|@7732 7730:D3,88|00802b362c562a0e0e0c0002505619030a2c56280e0c00025002023b5056173b1a3d000e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000048000000000000000000000000000000|@7731,I253,I255| 7731:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329646f56616c283129656e74657256616c73283129 7732:D4,136|00802b352c362d373c28401a82001a87000c00043c28401a86001a7b000c00043d2b2b6a3c28403b1a6d000e0e0c00043c28403b1a61000e0e0c00043c28403b1a55000e0e0c00042a2c2b6a2968013c28403b1a42000e0e0e0c0004296801220c3d32220e220e302f6807270d420e0e000000000000000078000000000000000000000000000000|@7212,-1,I11,@2249| 7733:O1|@7734 7734:D25,616|008f22103522113622123722133929030e221323061a58022a22156a64020422132306221423082215392216230d22173a2218230b221736221736221b230c1a36022a2c2e6b221d37221e38221f352220230a222136222223072210030a1a1f02222422216a0204222323092d2c313122122211221631221732220d22162213221a680e221b221b2b22172218222422242224222422290e0e0c000a22282a1ae6010e0e0e0c0003291ae4010e0c00021ae5010e0e0c000207dc29351ae1012219222c222522201ade010e0e0e0c00061add0122192e222622211acb010c00062224221f22201acf011ad4010e0c00052c2a0e0e0e0c000264293b691ac9012a691acc012a693b3b3b3b2d6805291a7f010c000203041abf01103b503b50293b691abc012a69302a691abc012a69332a691abc012a691abf012a693b3e3c3b2d6805291a4a010e0e0e0c000203041a8701103b503b5022313522323622333722343822353922363a223723062238230722392308223a2309223b230a223c230b223d230c223e230d223f230e2240230f2241231002023c001a65010e0e0c0012222b2a1a62010e0e0e0c00032968013c2a2e222b6b2235382236230c2a3b3c1a4e010e0e0e0c0004502b2a0e0e0c0002271602013b221503512217293528161a36010e0e0e0c0003030c2936292502501e153b6402292935280b1a1b010c000303033c021a293528051a0c010e0c0003030c2937292502501e3d3b6402013b641a75000e0e0c000202013b031722223c221d22191ae9001aee0022200e0e0e7b072b00063b27191f100e0e0e0e0e0e0e000000000000000058020000000000000000000000000000|@7736,@7737,@7738,@7739,@1326,I105,I218,@7744,@7168,@7669,@7171,@7172,@2241,@7193,@1363,@871,@871,@871,@7745,@7107,@6655,I255,I251,@7735,@7104| 7735:S51|526563757273697665206465636c61726174696f6e206973206e6f74206f662074686520666f726d2060666e206d6174636827 7736:S78|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b5479706573283229 7737:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 7738:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 7739:D6,104|00803c28403b1a67000c00041a69002a6956280e0e0c00022a3b1a63000c0003563723093b2a0e0e0e0c000264293b1a56000e0e0e0c000303032a020b2a2a1a4e00310e7e0700032704420e0e0e0e0e000000000000000058000000000000000000000000000000|@7741,I11,@7742,I253,I251,@7740| 7740:O1|@7743 7741:S88|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b54797065732832296e6577456e762d283129 7742:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@7376,I253,I255| 7743:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7740| 7744:S8|5061747465726e3a 7745:O2|3,@7746 7746:S47|5061747465726e20616e642065787072657373696f6e206861766520696e636f6d70617469626c652074797065732e 7747:O1|@7748 7748:D6,456|00802b3528161ac7010c0003030e2b36291ac4012d0e0e0e7d0400022b3528181aad010e0e0c000303033c0fd92b353d1a9d010e0e0c0003031e2b3629352a362a1a9c010e0c0002030a291a8a012f0e7d0600023b660fcf2b35280f1a71010e0e0c000303402b38293c2a1a7a010e0e0e0c00021a79010e0e0c000203242a352b362a382c030b291a4d010e0e0c000202013b2b2a2506250626041e313b2704020129660fdd2b3528191a23010c0003033b2b36293c2a1a2e010e0e0e0c00021a2d010e0e0c0002031f2a352b362b03092a1a03010c000202013b2a2a2505250526031e2d3b660201296602bb2b35281b1adc000e0c000303033c02ab2b3528121acc000202a0000e0c000303033c02972b3528051ab8000e0c000303122b37291ab4002d02027f000e0e0e7d0400022b3528111a99000e0e0c0003034c2b37293b1a8b000c000303033c023a293c2a1a95000e0e0c00021a95000e0e0c0002031f2a352b362b03092a1a6b000c000202013b2a2a2505250526031e2c3b66020502022300296564021e2b35280e1a3f000c000303033c020f2b35280b1a30002d0e0e0e7e030003420e0e0e0e0e0e0e0000000000000000b8010000000000000000000000000000|@7750,I251,@7747,@7749,I105,I218| 7749:O1|@7751 7750:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296e6f6e457870616e73697665283129 7751:D8,264|00802b3528161a07010c0003030e2b36291a04012d0e0e0e7d0400022b3528051aed000e0e0c0003030e2b37291ae8002d0e0e0e7d0400022b35280e1ad1000e0e0c000303a22b362936293b1ad1000e0e0c00032936293b1ab5000e0e0c000303033c020f291abf000c00021ac1000e0e0c000264036d2938291abb000c000229353d1a8a000e0e0e0c000303492937291aa4000e0c0002293528051a71000e0e0c0003032d29382937293629353c1a5e000e0e0e0c000364031429362936291a7d001a4a000e0e0e0c00036502013b6502013b6502013b651a54002f0e0e0e7d0600023b6602013b420e0e0e0e0e0e0000000000000000f8000000000000000000000000000000|@7752,I251,@7749,I253,I105,I218,@1435,@14360| 7752:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352969734e6f6e526566436f6e7374727563746f72283129 7753:D3,112|008056083556183656283756383856483956583a5668230656782307568823085698230956a8230a56b8230b56c8230c56d8230d56e8230e56f8230f1211000100020023101a30000e0c001256172a1a2e002e0e7e040003000000000000000060000000000000000000000000000000|@7692,@7107,@6655| 7754:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329656e746572446563283129 7755:O1|@7756 7756:D5,152|008c220e1a99000e0e0c00021a99000e0e0c00020361220e35220f362a352b362c3829312213221322132213221322132213221322132213221e0e0e0e0c000d2b3b2b1a6a000e0e0e0c0004502c2a692e2215221522152215221522152215221522152215221522151a4c000e0c000e2a2a69270802013b1f0d0e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,I255,@7755| 7757:O1|@7758 7758:D4,128|008c220e1a81000e0e0c00021a81000e0e0c00020349220e35220f362a2e2210221022102210221022102210221022102210221b0e0c000d2a2211221122112211221122112211221122112211221122111a44000e0c000e2a2a69270402013b1f0d0e0e0e0e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,@7757| 7759:S3|49663a 7760:O2|3,@7761 7761:S46|436f6e646974696f6e20696e2069662d73746174656d656e74206d7573742068617665207479706520626f6f6c2e 7762:S5|5468656e3a 7763:S5|456c73653a 7764:O2|3,@7765 7765:S46|54797065206d69736d61746368206265747765656e207468656e2d7061727420616e6420656c73652d706172742e 7766:S9|417267756d656e743a 7767:O2|@871,@7768 7768:O2|@7769,0 7769:O5|0,0,0,0,@7770 7770:O2|@7193,@7771 7771:O2|@2241,@7772 7772:O2|@7773,0 7773:O2|3,@7774 7774:S49|56616c7565206265696e67206170706c69656420646f6573206e6f74206861766520612066756e6374696f6e2074797065 7775:S35|54797065206572726f7220696e2066756e6374696f6e206170706c69636174696f6e2e 7776:D75,3312|00822d352e362f371aed0c0e0e0c00041aed0c2e6928092a69291aeb0c0c000203041aeb0c103b503b50293b69293b1ae60c0e0e0e0c000303032c020b2c2a1ade0c0e0e0e0c00031add0c2f34346b3c28403b1ada0c0e0e0e0c0004293b1ad70c56a956b856ca6b1ad50c0e0e0c0004501ad40c31691ad70c32691ada0c56a769220d350a1e00f9055f03cc0aa7036a0ad707e705a3050a026305af052b076308a3043e00a4028e0714021b0ccf0629081603db0113057a02040a8c06ed01e3084704fe01220d362937293b1a910c0e0e0c00032b352c362d382e392b3b1a7f0c0c000329350403002a1a7b0c1a280c0e0c000303033c02222a1a0b0c0c00021a6d0c0e0e0c000203102a3b1a590c3b28131a630c0c000602013b03432c3b1a3e0c0e0e0e0c00033b2a0e0e0e0c00026429311a4a0c0e0e0e0c00033c2a69291ac50b0e0e0c000203041ac30b103b503b50293b692d3b453b462a47260502152b392c3a2a1a200c0e0c00022c2a452b463b47260429352a362b372a1a890b0e0e0c00021ae90b0e0e0c000203632a352935293b1ac90b0e0e0c00032b36293b1abd0b0e0e0c00032d37293b1ab10b0e0e0c0003291ad80b0e0c00022e3b1a570b0c0003030329020b292f1aca0b0e0e0e0c0003402e2b6a291a2c0b0e0c000203041a2b0b103b503b50293b69270a02013b280d220c69291a0d0b0e0e0c000203041a0b0b103b503b502b3b1a090b0e0e0c000303032a020b2a2c1a820b0e0e0e0c0003293b1aef0a0c000303042215020a22152a1a700b0e0c0003293b1ad70a0c000303032f020b2f2a1a620b0e0e0e0c00032c2a69221f220e452a4627130fd9220d36220f2a220f220e22100e7b05100004220d361a3e0b3069220e2b452a46650fce220d36220d2a453046640fd1220c1a2a0b452f460fc9220d36220e37220f382b3b1ab70a0c0003280d2a69291a540a0e0c000203041a530a103b503b50326801121100010001002a692e2a1af50a0e0e0c0003220d3b1a3a0a0e0e0e0c0003030329020b29220e1ae10a0e0e0c00032d2a69221631452a46270a0fd4220d37220e39280d2b69291af9090e0e0c000203041af709103b503b5029326922102c452a4627040fd8220d37220e38220f392b3b1a270a020294090c00031a950a220f693268012a2a692e2a1a770a02027c090c0003280d2e69291aa80902046d096b090e0e0e0c000203041a9f09103b503b50220e3b1a9c090e0c000303032a020b2a220f1a550a0e0e0c00032a2a69221732452a46270b0fd7220d36220e37220f3830680156e72a692c3b692e2a69292c1a100a0e0c0003220d3b1a56090e0e0e0c0003030329020f29220e1a150a0202fa080e0e0c0003221530452a4627090fd7220d36220e37220f3830680156e72a692c3b692e2a69292c1ac7090202cc080c0003220d3b1a0a090e0e0e0c0003030329020b29220e1ad1090e0e0c0003221530452a4627090fd1220d3629352a362b382c392d37293b1a20090e0c000321051aaf094521061ab10945292e462b47220e483049334a6c502a22144631472a48220e496c503f2b69291a960802025b080e0e0e0c000203041a8f08103b503b50280d2d69291a7a080e0e0e0c000203041a7708103b503b50293b692b2a6922123b1a6e080e0e0e0c0003030329020f2922131a4d09020212080e0e0c0003221a34452a46270e0fdd220d36220e37220f38221039316801302a693c28403b1a49080e0e0c00042e2a69302e69293b692b2a69292f1acb080202d0070c000322113b1a0e080e0e0e0c0003030329020b2922121af5080e0e0c0003221934452a46270d0fd9220d36220e37220f3822103921051add084521061adf0845292c462b4734482e49304a6c502a2211462f472a4834496c503f2b69291aa6070e0e0e0c000203041aa307103b503b50293b69220d3b1a9d070e0e0c0003030329020b29220e1a9d080e0e0c0003221530452a4627090fdd220d36220e371a8d08220d2c326b3f020224072a69291a55070e0e0c000203041a5307103b503b50293b69333b1a4e070e0e0e0c0003030329020b29341a5e080e0e0e0c000322122e452a4627060fce220d36220e371a4d08220d693068012a2a692d2a1ac7070202cc060c0003343b1a0b070c0003030329020b29220c1a2d080e0e0c000322132f452a4627070fd7220d38220d2a453046640fcd220d36220e372f68012e2a692c2a1a81070e0e0c0003333b1ac7060c0003030329020b29341af2070e0e0e0c000322122e452a4627060fd7220d362939220e020258062a453146650fdd220d3629352a362b372c392a1ac9070e0e0c00022a1ac8070e0c00022e1ac8070e0c0002293b1a6f060c000303032a020f2a2a1aba07020217060e0e0e0c0003293b1a53060c000303032c020b2c2a1aa6070e0e0e0c0003220e6801220c2a692b2a1ae3060c000322123b1a2a060e0e0e0c0003030329020f2922131a81070204ce05cc050c0003221a220c452a46270e0fd4220d36220e372a1a6b070c00023068012e2a692b2a1a9d060e0e0c0003343b1ae3050c0003030329020f29220c1a4d0702028a050e0e0c000322132f452a4627070fdc220d362935020272052a362b38316801302a692d3b1aaa050e0e0e0c000303032c020b2c2e1a1a070e0e0e0c0003292b1a3f060c0003220d3b1a86050e0e0e0c0003030329020b29220e1afd060e0e0c000322152f452a4627090fdb220d36220e37220f382b3b1aa0050e0c0003280d2a69291a3c050e0c000203041a3b05103b503b503268012f2a692e2a1ae3050202e8040c0003220d3b1a26050e0e0e0c0003030329020b29220e1aa5060e0e0c00032d2a69221631452a46270a0fdd220d36220e37220f3830680156e72a692c3b692e2a69292c1a980502029d040e0c0003220d3b1ada040e0e0e0c0003030329020b29220e1a61060e0e0c0003221530452a4627090fdd220d36220e37220f38541a4d064521051a4f0645292210462d472b4833496c502a2e462a4733486c503f2a6929020242041a76040e0e0e0c000203041a7304103b503b5029220c6922132e452a4627070fd3220d3629352a363068011a0b062a692c2a1a04050e0c0003343b1a4b040c0003030329020b29220c1af5050e0e0c000322132e452a4627070fd1220d36220e390202dd033c28403b1a35040e0e0c0004293b1ad3052c121200010002006a1a2f040c000450521ac70545531aca0545292b462210476c502a2a466c501ac1052b693368012a2a69302a020294031a88040e0c0003220e3b1ace030e0e0e0c0003030329020b29220f1a9d050e0e0c0003221632452a46270a0fcf220d36220e391a8d0556d7693068012a2a692d2a1a470402024c030c00032e1a7c030e0c00021add030e0e0c000203642e352f362a352935280e1a71030e0e0c0003034c29362935291a52051a5f03020214030c000303033c0222291a3f030c00021aa1030e0e0c00020310293b1a2d053b401a98030e0c000602013b030d2c3b1a2a030e0e0e0c000302013b6502013b6602013b03652e352935293629382c362a392b382a2a1afc040e0c00036503102a372b362a2a1aec040e0c00036502013b031222192a22192218221a020296027b051a000422103b1ad2020e0e0e0c000303032e020b2e22111ac1040e0e0c0003221834452a4627060221343b1aad020e0e0c0003030329020b29220c1aa5040e0e0c000322132f452a466427060fd8220d36220e37220f382a3b1ac7020c0003280d2a69291a64020e0c000203041a6302103b503b50326801121100010001002a692f2a1a05030e0e0c0003220d3b1a4a020e0e0e0c0003030329020b29220e1a49040e0e0c00032d2a69221631452a46270a0fdd220d3629352a362b372c382d392e3a346801332a693c28403b1a23020c0004312a69302e69323069293b692b2a692d2a6929311aa1020e0e0c000322163b1ae6010e0e0e0c0003030329020b2922171aed030e0e0c0003221e220e452a4627120fd2220d3629362a36293528191ab70102026c010c0003034d2936291a98010e0c00021af9010e0e0c000203352936291a84010e0c00021ae5010e0e0c0002031d2936293b1a7f010c0003030d2e38293c1a73010c00036402013b6402013b6402013b6402013b64037f2a36293629352a3629352f353039313729020201013b1a8c010e0c0003280d2a69291a28010e0c000203041a2701103b503b5022106801121800010001002a69303b69302a69342a69292d1abf010c000322173b1a06010e0e0e0c0003030329020f2922181a15030202aa000e0e0c0003302a692220220c452a46271202652a352b392c37293b1a1b010c0003280d2a69291ab8000e0c000203041ab700103b503b50346801121300010001002a69303b69302a69292c1a53010c000322113b1a9a000e0e0e0c0003030329020b2922121ab1020e0e0c00032f2a69221a34452a46270c65022f220d36220e382a3b1ab3000c0003280d2a69291a50000e0c000203041a4f00103b503b5029336922112d452a462705270a440e0e0e0e0000000000000000e00c0000000000000000000000000000|@7778,@7779,@7786,I105,@1363,I251,@7788,@7790,I11,@7792,I255,@7834,@7836,@7919,I253,@6305,I218,I154,@7934,@2156,@7936,@7938,@7940,@7942,@7944,@7946,@6045,@7876,@7947,@7949,@7960,@7962,@7964,@7966,@7968,@7972,@7974,@7976,@7977,@7980,@7982,@7984,@7986,@8006,@8008,@8010,@8012,@8014,@8016,@8018,@8020,@8022,@8024,@8026,@8028,@8030,@8032,@8034,@8036,@8037,@8042,@8044,@8111,@8113,@8125,@8160,@8162,@6331,I113,@8171,@8173,@8175,@8177,@8179,@7777| 7777:O1|@8181 7778:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283229 7779:O1|@7780 7780:D7,224|00822c1ae2000e0e0e0c00021ae1000e0e0c0002031c2c3528072a69291ac8000e0c000203041acf00103b50293b696502013b2c1ab1000e0e0c00021ab1000e0e0c0002031c2c3528082a69291a98000e0c000203041a9f00103b50293b696502013b2f1a81000e0e0c00021a81000e0e0c0002031c2f3528052a69291a68000e0c000203041a6f00103b50293b696502013b293b1a68000e0c000303032a020b2a2a1a62000e0e0e0c0003293b1a4f000c000303032c020b2c2a1a5200310e7e0900032704440e0000000000000000d0000000000000000000000000000000|@7782,I105,I218,@1363,I251,@7783,@7781| 7781:O1|@7785 7782:S37|4578706f72745472656528292e6578706f72744e617669676174696f6e50726f7073283329 7783:O1|@7784 7784:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7783| 7785:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7781| 7786:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7787,@6655| 7787:S50|4558504f52545f50415253455452454528292e6765744578706f727454726565283229636f6d6d6f6e50726f70732d283129 7788:O1|@7789 7789:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7788| 7790:D1,56|0080040200561856292b56470e0c00045029352a362a2a6966420e0e0e0e0e0e000000000000000028000000000000000000000000000000|@7791| 7791:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296173506172656e74283129 7792:D26,736|00802b363c1ae0020e0c000303051adf020fdd2b3529353b1add020e0e0c00036407df2b3529362d363c1ad3020c00032a2a6956473b1acf020c00032a2a0e0e0e0c00026429353b1aad020e0e0c000303932939291ab8020e0c00021ab9020e0e0c0002035f29361aa5020e0e0c00021aa5020e0e0c000203482935353e1a77020c000303312935362928281a69020e0e0c000303033c021b29287b1a59020e0e0c000303033c020b29285b1a49020e0e0c00036402013b1a5d020e0e0c000202013b02013b03192a1a5402691a58022a691a5b022a693b3e3c3b2d68056602012a64020129293b691a4c022a690202d0011a4b022a693b3c3b3b2d680527090fcf00002b363c1ade010e0e0e0c000303051a33020fd42b3529353c1ad9010e0e0c00036403a22b3529362a372e363c1acd010e0e0c0003293b1aab010c000303051a0b02025e293c1ab4010e0c00032c2a6956683b1aaf010c00032a2a0e0e0e0c0002642c3c1a96010e0e0e0c00032e2a691ae2013b1a8e010e0e0e0c00031add012a0e0c0002642a2a0e0e0c000264291ad301691ad7012a691ada012a692f2a6927091ad8012a693b3c3b3b2d6805293b691ad1012a691ad4012a693b3c3b3b2d6805270a0fdc2b363c1a19010202ef000e0e0c000303051abb010fdd2b3529362d363c1a17010202d5000c00032a2a6956493b1a0f010c00032a2a0e0e0e0c00026429353b1aed000e0e0c000303952939291af8000e0c00021af9000e0e0c0002035f29361ae5000e0e0c00021ae5000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1a9d000e0e0c000202013b02013b03192a1a9400691a98002a691a9b002a693b3e3c3b2d68056602012a6402031b0029293b691af2002a691af5002a693b3c3b3b2d0202040068052709420e0e0e0e0e0000000000000000d0020000000000000000000000000000|@7794,I234,@1338,I251,I107,I253,I105,I218,@900,@901,@873,@871,@7795,@1338,@856,@14447,@7815,@869,@871,@872,@873,@871,@7827,@1338,@871,@7793| 7793:O5|0,0,0,@7797,@7831 7794:S11|7072696e742d6c54797065 7795:O5|0,0,0,@7797,@7796 7796:O2|@7801,0 7797:O2|@7798,0 7798:O2|0,@7799 7799:O5|@7800,66,66,0,0 7800:S50|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4558504f52545f5041525345545245452e736d6c 7801:O2|3,@7802 7802:S5|4461746154 7803:O2|@7804,@14448 7804:D2,40|00801a2b0056172d6a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@93,@7805| 7805:D3,56|00802b365618362d35291a33002c692d56671a3300320e7b060600050e0e0e0e000000000000000028000000000000000000000000000000|@4355,@7807,@7806| 7806:O1|@7809 7807:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@7808| 7808:S14|7072696e745f7265662833292d45 7809:D22,912|00832e3b1a91030e0e0c00032d3b1a8f030c000303051a8f030fd01a92030e0e0e0c0001293d1a6f030c000329291a87030c00021a89030e0e0c0002034529352a362a3b1a51030e0e0c0003293529341a75030e0e0c000364031d2935331a67030c000303043b5002041a6303103b5029372968016402082a250426031e503b6602013b64291a2f030c00021a31030e0e0c00020304293502013b29291a18030e0c00021a19030e0e0c0002031d29352a362a220e1a10030e0c000303033c0207292503511e293b6502013b6403051a06030fd17882d0220c2c691ad2020e0e0e0c0001293d1aaf02020283020c000329291ac3020c00021ac5020e0e0c0002033c29352a362a3b1a8d020e0e0c000329352922121ab0020e0c0003650316220f2845303b6b2b3b2b1ab4020e0c0004503b510206292503511e485102281a6f020c0001220e28452f3b6b3c28402b1a96020e0e0e0c0004292e692c3d2b1a7f020c0004260550220d3c1a83020c0003332a22110e0c000329353b1a4a020e0e0e0c000303aa2939291a2c020e0c00021a2d020e0e0c0002038129352a36293b1a25020204c7012d010c000303032c02672a353e1a11020e0e0c000303482a3629285b1a02020e0e0e0c000303032d023229287b1af1010e0e0c000303032d02222928281ae1010e0e0c000303032d02122d1a0302691a07022a693b3e3c3b2d6805656402122c1afe01691a02022a693b3e3c3b2d6805656502122a1af901691afd012a693b3e3c3b2d68056564020129293b691af1012a691af4012a693b3e3b3b2d68051a68010e0c0001293d1a47010c000329291a5f010c00021a61010e0e0c0002033d29352a362a3b1a29010e0e0c0003293529221b1a4c010e0c00036503162218284522133b6b2b3b2b1a4f010c0004503b640207292503511e483b65022b1a0a010e0e0e0c00012217284522123b6b3c28402b1a2d010e0e0c0004292e692c3d2b1a17010c00042704642c270d059a0e0e00ff6d1ad4000e0c0001293d1ab3000c000329291acb000c00021acd000e0e0c0002033c29352a362a3b1a95000e0e0c000329352922101ab8000e0c0003650316220d2845313b6b2b3b2b1abc000e0c0004503b510206292503511e485102281a77000c0001220c2845303b6b3c28402b1a9e000e0e0e0c0004292e692c3d2b1a87000c00042605502b352c362d372b2b2b1acd006b66102704641f040e0e0e0e0e000000000000000080030000000000000000000000000000|@7811,I253,I232,@97,I72,I105,I218,I251,@1576,@97,I255,I11,I107,@172,@176,@172,@176,@172,@176,@174,@7812,@7810| 7810:O5|@7814,117,0,117,0 7811:S12|7072696e745f726566283329 7812:O2|3,@7813 7813:S3|726566 7814:S22|2e2f62617369732f45786e5072696e7465722e736d6c 7815:O4|0,@7816,3,1 7816:O1|@7817 7817:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@2063,@14298,I253,@7818| 7818:O4|0,@7819,2,1 7819:O1|@7820 7820:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@7822,@14447,I253,@7821| 7821:O4|0,@7823,1,1 7822:S9|7072696e742d726566 7823:O1|@7824 7824:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2512,@14449,I253| 7825:O1|@7826 7826:D3,48|00802b352903051a2e0002031a31003e2a6965420e0e0e0e000000000000000020000000000000000000000000000000|@93,@4555,@4554| 7827:O5|0,0,0,@7797,@7828 7828:O2|@7829,0 7829:O2|3,@7830 7830:S4|4465636c 7831:O2|@7832,0 7832:O2|3,@7833 7833:S5|5479706542 7834:D5,144|00802b352c362936293b1a8b000c0003291a8c000e0c00021a8d000e0e0c0002033429352c350402002f2b2b56a70e0e0e0c00045029352a363b2e69291a60000e0c000203041a6700103b50292b692c2a69270702182b350402002e2b2b56970e0c00045029352a362a2a6927042704420e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@7835,I253,I105,I218,@1363| 7835:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745472656557697468427074283129 7836:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7838,@7837| 7837:O1|@7839 7838:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283129 7839:D16,464|00822c353c1ad0010e0c0003036a2c362d37293b1ac9010e0e0c0003291ac8010e0c00021ac9010e0e0c000203322935040200322e2b330e0e0c00045029352a363b2d69291aa0010e0c000203041aa701103b503b50292b692c2a6927060215040200312d2b320e0e0c00045029352a362a2a6966660fdb2c353d1a5a010e0e0e0c000303c12c362937293b1a49010e0e0c000303482a352b382c391a61011a660134343468051a66012d2c2c6b3f2a69291a33010c000203041a3b01103b503b50220c35220d36220e371a4a010e0e0e0c00042a2a692f2a692708026629352b352c382d391a37011a1c01220c220c220c6805541a30014521051a320145292f462d472b482c496c502a30462a472c486c503f2a69291ace000e0e0e0c000203041ad300103b503b50220e35220f362210371ae2000e0e0e0c00042a2a69302a69270a6502692c3629352a372b382c3902025b001ae0001aad00343434680521051adb004521051add00452930462d472b482c496c502a2e462a472c482f496c503f2a69291a5f000c000203041a6700103b503b50220d35220e36220f371a76000e0e0e0c00042a2a69302a69270b440e0e0e0e0e0e0e0000000000000000c0010000000000000000000000000000|@7841,I251,I253,I105,I218,@1363,@7842,@7837,@7844,@7779,@7855,@7856,@7910,@7911,@7912,@7840| 7840:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@7846,@7845| 7841:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229 7842:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7843| 7843:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296173506172656e74283129 7844:D2,56|0080560968013b2a3b6a29563756483b1a2d00310e0e0e7b060500050e0e0e0e000000000000000028000000000000000000000000000000|@7846,@7845| 7845:O1|@7847 7846:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296765744e616d65283129 7847:D8,128|00832e352f3630371a7d000e0e0c00041a7d002f6928092a69291a7b000c000203041a7b00103b50293b69293b1a78000e0c000303032c020b2c2a1a72000e0e0e0c0003293b1a5f000c0003030330020b302a1a62000e0e0e0c0003322a6927061f040e0e0e0e0e000000000000000070000000000000000000000000000000|@7849,@7779,@7850,I105,@1363,I251,@7852,@7848| 7848:O1|@7854 7849:S31|4578706f72745472656528292e676574537472696e67417354726565283429 7850:D3,56|00803e561769291a36000e0e0e0c000203041a3300103b502964420e0e0e0e0e000000000000000028000000000000000000000000000000|@7851,I105,@1363| 7851:S34|4578706f72745472656528292e676574537472696e67417354726565283429283129 7852:O1|@7853 7853:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7852| 7854:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7848| 7855:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7843| 7856:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@7858,@7857| 7857:O4|@7860,@1469,@7859,@14348 7858:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e6728322967657454797065283129 7859:O2|@7908,@7857 7860:D22,648|00812b1a8a020e0e0e0c00021a890256272b6a28092a69291a85020e0e0c000203041a8302103b503b50280d2c69291a6e020e0e0e0c000203041a6b02103b503b503035313632371a65020e0e0c00042a2a692c2a691a5f0231220c220c6b33350a050053010c009b015a016201d701333629352a372b382c39040200220d3528051a3b020c00030350220d37220e382937293629353c1a26020e0e0e0c00036403182936293629121500010003001a0e020e0e0e0c00036502013b6403082b2b453b465002102936291afb010c00022d2d452a46260351020b1af3012a2a35452a36465129352a362f1ab3010c00021ae5010e0e0c0002039b2f353036293b1abd010e0e0c0003034221061ad1014521051ad30145292215462d472b48220d496c502a2f4632472e482a49220d4a6c503f2a69291a68010e0c000203041a6701103b503b50293b6966024621061a9f014521061aa101452933462b47220d483449121600010002004a6c502a2f4632472e482a49220d4a6c503f2a69291a1f010c000203041a1f01103b503b50293b696665020129333b1a25010e0e0c0003030329020b29341a56010e0e0e0c00032e2a69270a02b61a4e012b6902af3337292c696402a7333634381a430134692c68012a2a692d2a1a3e010e0e0e0c0003303b1adb000c0003030329020b29311a2e010e0e0e0c00032e2a692707026e33363437220c382c680156c82a692b3b692e2a69292c1a00010e0c0003323b1a9f000c0003030329020b29331afa000e0e0e0c0003302a6927090232333634372b680156b82a692c2a1acd000e0e0c00032f3b1a6b000c0003030329020b29301ace000e0e0e0c00032d2a692706270843000000000000000078020000000000000000000000000000|@7862,@6616,@7863,I105,@1363,@7779,@7865,I251,@2156,@7867,I218,@7868,@7870,@7872,@7873,@7890,@6045,@7892,@7876,@7903,@7905,@7861| 7861:O1|@7907 7862:S29|545950455f5452454528292e747970654578706f727454726565283229 7863:D3,56|00803b1a3a000e0e0e0c000256182d2b1a35003b5667317b070400060e0e0e0e000000000000000028000000000000000000000000000000|@7864,@1330,@1702| 7864:S44|545950455f5452454528292e747970654578706f727454726565283229636f6d6d6f6e50726f70732d283129 7865:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7866| 7866:S40|545950455f5452454528292e747970654578706f7274547265652832296173506172656e74283129 7867:O2|I48,0 7868:D2,56|0080560b6801561a68013b2b2b6a295647565856691a2800320e0e7b06060005000000000000000028000000000000000000000000000000|@7869,@7845| 7869:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d6765744e616d65283129 7870:D1,48|0080560a680156196801292b3b6a2956485657307e060003000000000000000020000000000000000000000000000000|@7871| 7871:S53|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d676574417267283129 7872:D2,56|0080560b6801561a68013b2b2b6a295647565856691a2800320e0e7b06060005000000000000000028000000000000000000000000000000|@7869,@7845| 7873:D5,96|0080296801561b2a69562a2a1a59000e0e0c00035639680156486801292b3b1a4e000e0e0e0c0004293b1a4b000c000303032c020b2c2a1a46000e0e0e0c000356772a692707420e000000000000000050000000000000000000000000000000|@7875,@7876,@7779,I251,@7874| 7874:O1|@7889 7875:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d67657441726773283129 7876:O1|@7877 7877:D5,80|00812c3b1a51000e0e0c000303033b02242b352c361a48002f2c2c6b3f2a69291a45000e0e0c000203041a4300103b50293b692704430e0e000000000000000040000000000000000000000000000000|@7879,I251,@7878,I105,@1363| 7878:D2,48|00802b56173b563856491a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7881,@7880| 7879:S26|4578706f72745472656528292e6578706f72744c697374283229 7880:O1|@7882 7881:S40|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283129283129 7882:D8,120|00842e1a7a000e0e0e0c00021a79000e0e0c000203043b5002041a7300102e352f36293b1a71000e0e0c000303033b021f1a6c001a71003232323268062968011a6d001a62002d2c3434680629680166292f326a292d69652f2e0e0e7d090002000000000000000068000000000000000000000000000000|@7884,I105,I218,@7885,I251,@7888,@7880,@7883| 7883:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7881| 7884:S37|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283329 7885:O4|@14358,@1714,0,@7886 7886:O5|@7887,88,0,88,0 7887:S34|6d6c736f757263652f4d4c436f6d70696c65722f4578706f7274547265652e736d6c 7888:D1,48|00802b56185629563a564b5657300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@7881| 7889:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7874| 7890:O1|@7891 7891:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7890| 7892:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7894,@7893| 7893:O1|@7895 7894:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283129 7895:D8,136|00822c3529352a362f3630371a81001a8600343434680521051a84004521061a8600452930462f472e482b492c4a6c502a34462e472a482c496c503f2a69291a6e000e0e0e0c000203041a6b00103b503b50220d35220e36220f371a62000e0e0e0c00042a2a692f2a69270b440e0e0e000000000000000078000000000000000000000000000000|@7897,@7898,@7893,@7900,@7896,I105,@1363,@7779| 7896:D5,88|0080560b6801561a6801292b3b6a56391a4d000e0e0c0002280d2a69291a48000e0c000203041a4700103b50293b692c567756882c1a4000220c0e7b06090005000000000000000048000000000000000000000000000000|@7902,@6616,I105,@1363,@7845| 7897:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283229 7898:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7899| 7899:S54|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 7900:D1,48|0080560a6801561968013b2b2b6a2956485657307e060003000000000000000020000000000000000000000000000000|@7901| 7901:S53|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c6428322967657454797065283129 7902:S52|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296765744c6162283129 7903:O1|@7904 7904:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7903| 7905:O1|@7906 7906:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7905| 7907:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7861| 7908:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7909| 7909:S29|545950455f5452454528292e747970654578706f727454726565283129 7910:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@7846,@7845| 7911:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7843| 7912:D6,96|0080560968011a5f002a69562a2a1a5f000c000356396801564868013b2b2b1a56000e0e0e0c0004293b1a53000c000303032c020b2c2a1a4e000e0e0e0c000356772a692707420e000000000000000050000000000000000000000000000000|@7914,@7915,@7876,@7779,I251,@7913| 7913:O1|@7918 7914:S68|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e73747273283129 7915:O1|@7916 7916:D2,48|00802b352c3629352a372c2a2c3b1a2700330e7b06070005000000000000000020000000000000000000000000000000|@7917,@7845| 7917:S84|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e737472732831296578706f7274436f6e73747273283129 7918:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7913| 7919:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7921,@7920| 7920:O1|@7922 7921:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283129 7922:D14,320|00822c37293b1a3f010c00032e38293b1a35010e0e0c0003303a293b1a29010e0e0c00033235333634391a23011a2801220f220f220f68052d1a24010e0c00021a25010e0e0c0002031e2d353b2a69291a0d010e0e0c000203041a1301103b503b50293b696502013b1a0c01220f6928092a69291ae9000e0e0c000203041aef00103b503b503d220c346a280d2a69291acd000e0e0c000203041ad300103b503b50293b692c2a6930680122142a69220c3b69220c2a69292c1ac4000e0c0003221a35221b36221c371abc000e0c0004220c3b1aba000e0e0e0c0003030329020b29220d1ab1000e0e0c0003293b1a9f000c000303032b020b2b2a1aa2000e0e0e0c0003293b1a87000c0003030331020b312a1a92000e0e0e0c000322112a69271a440e0e0e0e0e000000000000000030010000000000000000000000000000|@7924,I253,@7925,@7920,I105,I218,@1363,@7927,@7876,@7779,I251,@7929,@7931,@7923| 7923:O1|@7933 7924:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229 7925:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7926| 7926:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d617463682832296173506172656e74283129 7927:D8,112|00805607355617362d3c1a6b000c00032a2a1a6b000c00032f3c1a5b000c00032d2a1a5b000c0003293b691a5a002a691a5d002a691a60002a692f2a693b3b3b3b2d6805291a58000e0c000203041a5700103b5029270c42000000000000000060000000000000000000000000000000|@7928,I107,@6655,@871,@6775,@871,I105,@1363| 7928:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229283129 7929:O1|@7930 7930:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7929| 7931:O1|@7932 7932:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7931| 7933:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7923| 7934:O1|@7935 7935:D10,192|00812c1ac2000e0e0e0c00021ac1000e0e0c000203892c352d362d1aba000e0e0e0c00022b1ab0000e0c00022a2a1aaf000c000303482a3c1aad000e0e0c0003032d293c1aa1000e0e0c0003030c2f2d1a9d000e0e0c000302132c28081a98000e0c0003302a1a87000c000364020d2f28082e28082e1a87000c000602013b650310292e1a81000e0e0c00032b2a6964020a292e1a71002f7e0600036502013b430e0e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@283,I105,I218,I223,I232,I113,I251,I252,I154,@7934| 7936:O1|@7937 7937:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@7936| 7938:O1|@7939 7939:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7938| 7940:O1|@7941 7941:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7940| 7942:O1|@7943 7943:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7942| 7944:O1|@7945 7945:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7944| 7946:O2|13,@956 7947:O1|@7948 7948:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7947| 7949:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7951,@7950| 7950:O1|@7952 7951:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283129 7952:D15,328|00822c36293b1a47010c00032e352f3730383139040200342c2b220c0e0c00045029352a362a2a692b352e352a2a1a27010c000303033c024a2a1a23010c00021a25010e0e0c00020314291a12010e0e0e0c00021a11010e0e0c000202013b03212a3b2b3b28082e1a05010e0e0c00021a05010e0e0c00031a05010e0e0c000602013b6503392b362e361afb000c0003032a2b372e371aef000c0003031b2b382e381ae3000c0003030c2b392e391ad7000c000302013b02013b02013b02013b03032902631ac8001acd00221022102210680521051ac8004521061aca00452934463347220c482b492c4a6c502a22104632472a482c496c503f2a69291a60000e0c000203041aa700103b503b502212352213362214371a9e000e0e0e0c00042a2a69332a692706270a440e0e0e0e0e000000000000000038010000000000000000000000000000|@7954,I253,I251,I105,I218,I223,I239,I154,I113,@7955,@7950,@7957,@7953,@1363,@7779| 7953:D4,80|0080560b6801561a6801292b3b6a280d564969291a41000e0e0c000203041a3f00103b50293b692b566756782c1a3800340e0e7b06080005000000000000000040000000000000000000000000000000|@7959,I105,@1363,@7845| 7954:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229 7955:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7956| 7956:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 7957:D1,64|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@7958| 7958:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229676574457870283129 7959:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296765744c6162283129 7960:O1|@7961 7961:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7960| 7962:O1|@7963 7963:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7962| 7964:O1|@7965 7965:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7964| 7966:D1,64|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@7967| 7967:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657445787072283129 7968:D5,96|0080296801561b2a69562a2a1a59000e0e0c000356396801564868013b2b2b1a4e000e0e0e0c0004293b1a4b000c000303032c020b2c2a1a46000e0e0e0c000356772a692707420e000000000000000050000000000000000000000000000000|@7970,@7876,@7779,I251,@7969| 7969:O1|@7971 7970:S48|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296765744d617463686573283129 7971:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7969| 7972:O1|@7973 7973:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7972| 7974:O1|@7975 7975:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7974| 7976:D1,64|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@7967| 7977:D5,96|0080296801561b2a69562a2a1a59000e0e0c000356396801564868013b2b2b1a4e000e0e0e0c0004293b1a4b000c000303032c020b2c2a1a46000e0e0e0c000356772a692707420e000000000000000050000000000000000000000000000000|@7970,@7876,@7779,I251,@7978| 7978:O1|@7979 7979:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7978| 7980:O1|@7981 7981:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7980| 7982:D1,64|0080560968013b2a3b6a0402002a56482b56670e0e0c00045029352a362a2a692705420e0e0e0e0e000000000000000030000000000000000000000000000000|@7983| 7983:S44|4558504f52545f50415253455452454528292e6765744578706f727454726565283229676574457870283129 7984:O1|@7985 7985:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7984| 7986:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@7988,@7987| 7987:O1|@7989 7988:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283129 7989:D18,416|00822c37291aa0010e0c00021aa1010e0e0c000207ce29352e3a293528081a97010c000303642f35303831391a91011a9601220c220c220c6805541a92014521051a940145292f462d472b482c496c502a31462a472c486c503f2a69291a48010e0c000203041a7701103b503b50220e35220f362210371a6e010e0e0e0c00042a2a69302a692709026a2f35303831391a5d011a3201220c220c220c680521051a55014521051a570145292f462d472b482c496c502a220c4630472a482c496c503f2a69291ae0000e0c000203041a0f01103b503b50220e35220f362210371a0601020211000e0e0e0c00042a2a69302a6927096502892d3a293528081ab8000e0c000303162e352f39312b2b1af8001afd00330e0e0e7b060900052e352f3830391af3001aa000343434680521051aee004521051af00045292f462d472b482c496c502a344630472a482c496c503f2a69291a52000e0e0e0c000203041a7f00103b503b50220d35220e36220f371a76000e0e0e0c00042a2a69302a69270a64440e0e0e0e0e0e000000000000000090010000000000000000000000000000|@7991,I105,I218,I251,@7992,@7987,@7994,@7996,@1363,@7779,@7998,@7999,@8001,@8002,@7845,@8004,@8005,@7990| 7990:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@7997,@7845| 7991:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283229 7992:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7993| 7993:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296173506172656e74283129 7994:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@7995,@7857| 7995:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744f6654797065283129 7996:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@7997,@7845| 7997:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744e616d65283129 7998:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7993| 7999:D1,64|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@8000| 8000:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274457864656328322967657450726576696f7573457863283129 8001:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@7997,@7845| 8002:O2|@8003,0 8003:O2|13,@7393 8004:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@7993| 8005:D1,64|0080560a6801561968013b2b2b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@8000| 8006:O1|@8007 8007:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8006| 8008:O1|@8009 8009:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8008| 8010:O1|@8011 8011:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363b2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8010| 8012:O1|@8013 8013:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363d2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8012| 8014:O1|@8015 8015:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363c2b2b6a2c1a42000e0e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@8014| 8016:O1|@8017 8017:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8016| 8018:O1|@8019 8019:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8018| 8020:O1|@8021 8021:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8020| 8022:O1|@8023 8023:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363d2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8022| 8024:O1|@8025 8025:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8024| 8026:O1|@8027 8027:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8026| 8028:O1|@8029 8029:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8028| 8030:O1|@8031 8031:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8030| 8032:O1|@8033 8033:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8032| 8034:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@8035,@7857| 8035:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657454797065283129 8036:D1,64|0080560a680156196801292b3b6a0402002a56582b56770e0e0c00045029352a362a2a692706420e000000000000000030000000000000000000000000000000|@7967| 8037:O1|@8038 8038:D6,120|00802b352c3629362a372a3b1a71000e0e0c0003293b1a6f000c000303033b020c29352938291a67000c0002652e352f3630371a62000e0e0e0c00042a3b1a47000c0003030329020b292b1a52000e0e0e0c00032d2a692708420e0e0e0e0e0e000000000000000068000000000000000000000000000000|@8040,I253,I251,@2156,@7779,@8039| 8039:O1|@8041 8040:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745374727563744964656e74283129 8041:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8039| 8042:O1|@8043 8043:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8042| 8044:D103,1928|00802b363c1a88070e0c000303051a87070fdc2b3529353b1a85070e0e0c00036407dd2b3529362d363c1a7b070c00032a2a691a7a073b1a7e070e0e0e0c00032a2a0e0e0e0c00026429353b1a51070e0e0c000303932939291a64070e0c00021a65070e0e0c0002035f29361a51070e0e0c00021a51070e0e0c000203482935353e1a1b070c000303312935362928281a0d070e0e0c000303033c021b29287b1afd060e0e0c000303033c020b29285b1aed060e0e0c00036402013b1a09070e0e0c000202013b02013b03192a1a0007691a04072a691a07072a693b3e3c3b2d68056602012a64020129293b6902027b061af4062a691af7062a693b3c3b020208003b2d680527090fce2b363c1a80060e0c000303051adf060fd52b3529353c1a7d060e0e0c00036407dd2b3529362a372e363c1a71060e0e0c0003293b1a4f060c000303051ab7060fd1293c1a58060e0c0003293b1a37060c000303051aa7060fd12c362a3c1a3e060e0e0e0c00032a2a691a9a063b1a3e060e0e0e0c00031a95062a0e0c0002642a2a0e0e0c0002642d3c1afa050e0e0e0c000303051a7f060fce30372e3c1afe050e0e0e0c0003293b1adb050c000303051a6b060fcb2a362a3c1ae2050e0e0e0c00032a2a691a5e063b1ae205020292050e0e0e0c00032a2a0e0e0e0c0002642d3c1aa20502027a050e0e0e0c000303051a3b060fcd2e382e3c1aa20502021f020e0e0e0c00032a2a691a1a063b1a9e050202e7010e0e0e0c00032a2a0e0e0e0c000264313d1a5e05020284010e0e0e0c000303051aff0502d33235323c1a5e050e0e0e0c00032a2a691af2053b1a5e050e0e0e0c00032a2a0e0e0e0c000264220c3e1a210502022e010e0e0c000303051ad305027e220d37220d3c1a20050202bc000e0c00032a2a691a9a053b1a1e050e0e0e0c00032a2a0e0e0e0c00026422113922113c1af6040e0e0e0c00032a2a691a72053b1af6040e0e0e0c00032a2a020261000e0e0e0c000264291a7f05691a83052a691a86052a691a89052a691a8c052a69322a691a8c052a691a8f052a69270f1a90052a691a93052a692c2a691a93052a691a96052a6927091a97052a691a9a052a692c2a691a9a052a691a9d052a6927091a9e052a691aa1052a692c2a691aa1052a691aa4052a6927091aa5052a693b3c3b3b2d6805220c35333c1a4c040e0c00032a2a691ae2043b1a4e040e0e0e0c00032a2a0e0e0e0c000264291a7b05691a7f052a691a82052a691a85052a691a88052a69322a691a88052a691a8b052a6927101a8c052a691a8f052a692c2a691a8f052a691a92052a6927091a93052a693b3c3b3b2d68052d3c1add030e0e0c00032f2a691a82053b1ade030e0e0e0c00031a7d052a0e0c0002642a2a0e0e0c000264291a7305691a77052a691a7a052a692f2a69270a1a78052a693b3c3b3b2d6805293b691a71052a691a74052a693b3c3b3b2d6805270a0fcf2b363c1a61030e0e0c000303051a5f050fd12b3529353d1a5d030e0e0c00036407cd2b3529362a372e363c1a51030e0e0c0003293b1a2f030c000303051a37050fd2293c1a38030e0c00032c2a691a2e053b1a3a030e0e0e0c00031a29055687693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1a06030e0e0e0c0003293b1ae3020c000303051a03050fd12e362a3c1aea020e0e0e0c00032a2a691a66033b1aea020e0e0e0c00032a2a0e0e0e0c0002642d3c1aae020e0e0e0c000303051ad3040fcd32382e3c1ab202020272020e0e0e0c00032a2a691a2a033b1aae0202025e020e0e0e0c00032a2a020262010e0e0e0c000264313d1a6a020e0e0e0c000303051a970402d3220d35323c1a6d02020219010e0e0c00032a2a691afe023b1a6a020e0e0e0c00032a2a0e0e0e0c000264220c3e1a2d020e0e0c000303051a6304027e221137220d3c1a30020e0c00032a2a691aae023b1a32020202ae000e0e0e0c00032a2a0e0e0e0c00026422153922113c1a06020e0e0e0c00032a2a691a82023b1a06020e0e0e0c00032a2a020261000e0e0e0c000264291a0f04691a13042a691a16042a691a19042a691a1c042a69322a691a1c042a691a1f042a69270f1a20042a691a23042a692c2a691a23042a691a26042a6927091a27042a691a2a042a692c2a691a2a042a691a2d042a6927091a2e042a691a31042a692c2a691a31042a691a34042a6927091a35042a693b3c3b3b2d6805291a3004691a34042a691a37042a69302a69270a1a35042a693b3c3b3b2d6805293b691a2e042a691a31042a693b3c3b3b2d6805270a0fdb2b363c1a0e010e0e0e0c000303051a1b0402dd2b3529362d363c1a0f010c00032a2a6956483b1a13010c00032a2a0e0e0e0c00026429353b1ae9000e0e0c000303932939291afc000e0c00021afd000e0e0c0002035f29361ae9000e0e0c00021ae9000e0e0c000203482935353e1ab3000c000303312935362928281aa5000e0e0c000303033c021b29287b1a95000e0e0c000303033c020b29285b1a85000e0e0c00036402013b1aa1000e0e0c000202013b02013b03192a1a9800691a9c002a691a9f002a693b3e3c3b2d68056602012a64020129293b69020213001a54032a691a57032a693b3c3b3b2d68052709420e0e0e000000000000000078070000000000000000000000000000|@8046,I234,@1338,I251,I107,@14450,I253,I105,I218,@900,@901,@873,@871,@8049,@1338,@856,@884,@14447,@8056,@884,@884,@14301,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@887,@871,@1341,@871,@872,@871,@8062,@871,@872,@871,@8064,@899,@14298,@8066,@869,@871,@872,@873,@871,@8090,@1338,@856,@14442,@8097,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@869,@871,@872,@873,@871,@8098,@1338,@871,@8045| 8045:O5|0,0,0,@8106,@8105 8046:S14|7072696e742d66756e456e747279 8047:O1|@8048 8048:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8049:O5|0,0,0,@8051,@8050 8050:O2|@8054,0 8051:O2|@8052,0 8052:O2|0,@8053 8053:O5|@7800,221,221,0,0 8054:O2|3,@8055 8055:S13|46756e436f6e73747261696e74 8056:O4|0,@8057,3,1 8057:O1|@8058 8058:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8059,@14451,I253| 8059:S11|7072696e742d7479706573 8060:O1|@8061 8061:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8062:O2|3,@8063 8063:S10|6c6f636174696f6e203d 8064:O2|3,@8065 8065:S9|65787054797065203d 8066:O4|0,@8067,2,3 8067:O1|@8068 8068:D22,288|00802b363b1a20010e0c000303051a1f010fdd2b35362c363c1a1c010e0c00032a2a691a1a013b1a1e010e0e0e0c00031a1d012a0e0c0002642a2a0e0e0c0002642f363c1ae1000e0e0c000303051a070102862f353530363c1adc000e0c00032a2a691ada003b1ade000e0e0e0c00031aed002a0e0c0002642a2a0e0e0c00026433353734363c1aae000e0e0e0c00032a2a691aaa003b1aae000e0e0e0c00031ac5002a0e0c0002642a2a0e0e0c000264291abb00691abf002a691ac2002a691ac5002a691ac8002a69322a691ac8002a691acb002a69270f1acc002a691acf002a692c2a691acf002a691ad200020204002a6927091acf002a693b3c3b3b2d680565420e0e0e0e000000000000000010010000000000000000000000000000|@86,I234,@884,I107,@14447,I253,@8070,@884,@8073,@8079,@887,@871,@8085,@871,@872,@871,@8087,@871,@872,@871,@8069,@899| 8069:O2|3,@8089 8070:O4|0,@8071,1,1 8071:O1|@8072 8072:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@2512,@14449,I253| 8073:O4|0,@8074,3,1 8074:O1|@8075 8075:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@8076| 8076:O4|0,@8077,2,1 8077:O1|@8078 8078:D30,432|00802b363b1ab0010e0c000303051aaf010fcd2b35362c363c1aac010e0c00032a2a691aaa013b1aae010e0e0e0c00032a2a0e0e0e0c0002642f363c1a79010e0e0c000303051a97010fdc2f353830363c1a74010e0c00032a2a691a72013b1a76010e0e0e0c00032a2a0e0e0e0c00026433363d1a41010e0e0c000303051a670102d333353534363c1a3c010e0c00032a2a691a5a013b1a3e010e0e0e0c00032a2a0e0e0e0c000264220e363e1a08010e0c000303051a3f010282220e3537220f363c1a02010e0e0e0c00032a2a691afe003b1a02010e0e0e0c00032a2a0202a6000e0e0e0c000264221235392213363c1ad4000e0c00032a2a691ad2003b1ad6000e0e0e0c00032a2a0e0e0e0c000264291aeb00691aef002a691af2002a691af5002a69020246001af4002a69322a691af4002a691af7002a69270f1af8002a691afb002a692c2a691afb002a691afe002a6927091aff002a691a02012a692c2a691a02012a691a05012a6927091a06012a691a09012a692c2a691a09012a691a0c012a6927091a0d012a693b3c3b3b2d680565420e0e0000000000000000a0010000000000000000000000000000|@86,I234,@884,I107,@14301,I253,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899| 8079:O4|0,@8080,3,1 8080:O1|@8081 8081:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@8082| 8082:O4|0,@8083,2,2 8083:O1|@8084 8084:D35,528|00802b363b1a10020e0c000303051a0f020fcf2b35352c363c1a0c020e0c0003293b1af3010c000303051a03020fcd2a362a3c1af2010e0e0e0c00032a2a691af6013b1afa010e0e0e0c00032a2a0e0e0e0c0002642d3c1abe010e0e0e0c000303051ae3010fdc2e382e3c1aba010e0e0e0c00032a2a691abe013b1ac2010e0e0e0c00032a2a0e0e0e0c000264313d1a86010e0e0e0c000303051ab30102d33235323c1a82010e0e0e0c00032a2a691aa6013b1a8a010e0e0e0c00032a2a0e0e0e0c000264220c3e1a4d010e0e0c000303051a8b010282220d37220d3c1a4801020205010e0c00032a2a691a4a013b1a4e010e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1a1a010e0e0e0c00032a2a691a1e013b1a22010e0e0e0c00032a2a0e0e0e0c000264291a3701691a3b012a691a3e012a691a41012a69020246001a40012a69322a691a40012a691a43012a69270f1a44012a691a47012a692c2a691a47012a691a4a012a6927091a4b012a691a4e012a692c2a691a4e012a691a51012a6927091a52012a691a55012a692c2a691a55012a691a58012a6927091a59012a693b3c3b3b2d680530353631363c1a6f000c00032a2a691a96003b1a7a000e0e0e0c00032a2a0e0e0e0c000264291a2f01691a33012a691a36012a69302a69270c1a34012a693b3c3b3b2d680565420e000000000000000000020000000000000000000000000000|@86,I234,@856,I107,@884,@14301,I253,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@869,@871,@872,@873| 8085:O2|3,@8086 8086:S14|726563757273697665526566203d 8087:O2|3,@8088 8088:S10|6c6f63616c526566203d 8089:S13|6578706f72746564526566203d 8090:O5|0,0,0,@8092,@8091 8091:O2|@8095,0 8092:O2|@8093,0 8093:O2|0,@8094 8094:O5|@7800,219,219,0,0 8095:O2|3,@8096 8096:S8|46756e4964656e74 8097:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8046,I253| 8098:O5|0,0,0,@8100,@8099 8099:O2|@8103,0 8100:O2|@8101,0 8101:O2|0,@8102 8102:O5|@7800,222,222,0,0 8103:O2|3,@8104 8104:S10|46756e496e6669786564 8105:O2|@8109,0 8106:O2|@8107,0 8107:O2|0,@8108 8108:O5|@7800,220,220,0,0 8109:O2|3,@8110 8110:S8|46756e5074726565 8111:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8112| 8112:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283129 8113:D14,416|00812b353d1aa0010e0c000303452b362c371a9b012c30306b29680156472a692d2a1a93010c00033235333634371a8f010c0004293b1a6f010c000303032a020b2a2a1a82010e0e0e0c00032f2a6927080fd52b353b1a4f010c0003030e2b362d2a1a6b012e0e0e7e0500032b353e1a36010e0e0e0c0003031a2b360402002e2b2b56580e0c00045029352a362a2a6927040fd52b362c372a36293b1a39010e0e0c00032c372c1a36010e0e0e0c00021a35010e0e0c000203632c352935293b1a15010e0e0c00032b36293b1a09010e0e0c00032d37293b1afd000e0e0c0003291a0c010e0c00022e3b1abb000c0003030329020b292f1afe000e0e0e0c0003402e2b6a291ad8000e0c000203041aef00103b503b50293b69270a02013b280d2c69291aba0002025b000e0e0e0c000203041acb00103b503b503d2c69291a9f000c000203041ab700103b503b503435220c36220d371a67000c00042a2a692c2a69293b1a410002021a000e0e0c000303032e020b2e2a1a8e000e0e0e0c0003302a69270c430e0e000000000000000090010000000000000000000000000000|@8115,I251,@8116,@7876,@7779,@8118,@7857,I253,I105,I218,@8120,@8122,@1363,@8114| 8114:O1|@8124 8115:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283229 8116:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8117| 8117:S63|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e7472792832296173506172656e74283129 8118:O1|@8119 8119:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8118| 8120:O1|@8121 8121:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8120| 8122:O1|@8123 8123:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8122| 8124:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8114| 8125:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@8127,@8126| 8126:O1|@8128 8127:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283129 8128:D14,264|00822c362d36291a06010e0e0e0c00021a05010e0e0c0002030d2936293b1aff000c00036402013b6403602d3629352f37293b1af2000e0e0e0c0003293a32383435220c36220d371ae5000e0e0c00041ae5001aea00220e220e220e68052f2d2b220e1ae2000e0e0e0c00052b3b1aaf000c0003030329020b292c1ad2000e0e0e0c00032d2a69270a025e2d37293b1a96000e0e0e0c0003293a30383235333634371a8b000c00041aad001a9200220c220c220c68051aa700332e6a2a68012a2a69322a1aa1000e0e0c00032e3b1a4f000c0003030329020b292f1a92000e0e0e0c0003302a69270b64440e0e0e0e0e0000000000000000f8000000000000000000000000000000|@8130,I105,I218,I251,I253,@7779,@8131,@8126,@8133,@8146,@8148,@8150,@7876,@8129| 8129:O1|@8159 8130:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283229 8131:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@8132| 8132:S57|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274464228322961734368696c642d283129 8133:O1|@8134 8134:D12,424|00832e38293b1aa7010c0003303529352a362b372c38220c362b3c1a9a010e0e0e0c000303682d1a96010e0e0e0c00021a95010e0e0c000203512d35293528191a75010e0e0c0003033d2936291a70010e0c00021a71010e0e0c000203252936291a5c010e0c00021a5d010e0e0c0002030d2936293b1a3f010c00036402013b6402013b6402013b6402013b02013b03362d352e362a362b382a352b3629353e2c693c220c22166a3e2c69293b692b2a692d2a693d2a346a220c1a13010c00022a2a69270f02113c2d220e6a2e1a08010e0c00022a2a69652b1ae4000e0c00021ae5000e0e0c0002030b2b353b2a69293b696502013b311ac6000e0e0e0c00021ac5000e0e0c0002031e31353b2a69291aad000e0e0c000203041ac300103b503b50293b696502013b220e6801220e2a693e2f69293b69293b1a7c000e0c000303032e020b2e2a1a9e000e0e0e0c0003293b1a63000c0003030330020b302a1a8e000e0e0e0c0003292e1a8b000c0003303b1a43000c0003030329020b29311a7e0022167e18000327121f040e0e0e0e000000000000000098010000000000000000000000000000|@8136,I253,I251,I105,I218,@8137,@8139,@1363,@8141,@8143,@7876,@8135| 8135:O1|@8145 8136:S51|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727441436c61757365283329 8137:O1|@8138 8138:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363e2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8137| 8139:O1|@8140 8140:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363e2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8139| 8141:O1|@8142 8142:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8141| 8143:O1|@8144 8144:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8143| 8145:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8135| 8146:O1|@8147 8147:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8146| 8148:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@8149| 8149:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f727454686973283129 8150:D2,48|00802b352c36562756381a2b002f0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@8152,@8151| 8151:O1|@8153 8152:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283129 8153:D7,96|00832d372f35303631371a5b000c00041a5d001a6200323232326806302f2b321a5d000e0e0c00052b3b1a5b000c0003030329020b292c1a56000e0e0e0c00032d2a6927051f040e000000000000000050000000000000000000000000000000|@8155,@7779,@8156,@8151,@8133,I251,@8154| 8154:O1|@8158 8155:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283229 8156:D1,48|008056085619562a563b56472f0e0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@8157| 8157:S72|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c6175736528322961734368696c642d283129 8158:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8154| 8159:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8129| 8160:O1|@8161 8161:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8160| 8162:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@8164,@8163| 8163:O1|@8165 8164:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283129 8165:D7,112|00822c352d362e373035313632371a67000c00041a69001a6e003333336805296801312a692e3b69302a69292c1a60000e0c00032f3b1a5f000c0003030329020b29301a5a000e0e0e0c0003312a69270b440e0e0e0e0e0e000000000000000060000000000000000000000000000000|@8167,@7779,@8168,@8163,@7876,I251,@8166| 8166:O1|@8170 8167:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283229 8168:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@8169| 8169:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727456422832296578706f727454686973283129 8170:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8166| 8171:O1|@8172 8172:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8171| 8173:O1|@8174 8174:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8173| 8175:O1|@8176 8176:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8175| 8177:O1|@8178 8178:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8177| 8179:O1|@8180 8180:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8179| 8181:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@7777| 8182:O2|@8183,@7077 8183:D1,56|00802b352c360402002b2b2b56670e0e0e0c00045029352a362a2a692705420e000000000000000028000000000000000000000000000000|@8184| 8184:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283129 8185:O1|@8186 8186:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8187:O1|@8188 8188:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8189:O1|@8190 8190:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8191:D6,80|00802b352c3629352a3629565c1a48000e0c00032b2a692e2a1a440056976956981a44001a490056c956da56eb1a480022110e7b0b09000a000000000000000040000000000000000000000000000000|@8193,@8194,@8192,@6985,@6983,@6966| 8192:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 8193:S66|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657246696e616c54797065283129 8194:O1|@8195 8195:D7,136|00812c1a8a000e0e0e0c00021a89000e0e0c000203512c352d362a352b362c382d39313b1a79000e0e0c0003323b1a6f000c0003293c1a6f000c0003343b2b1a6e000e0e0e0c0004503b2c6930302b31313b3b680732220e1a5d000e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,I253,I106,I255,@8194| 8196:O1|@8197 8197:D14,336|00893435220c36220d372a07dc291a47010c00021a49010e0e0c000203043b5002041a4301103b5029352a362a352b36221123082212230c2a2a691a3201221322132f6b2a2f2b1a2e010e0e0e0c000429352937293629353c1a24010e0c000364031429362936291a1d011a12010e0e0e0c00036502013b6503033b028930291ad5000e0e0c00021ad5000e0e0c0002037329352a362a352b36221b2308221c230c2a2a691ae800221d221d2f6b2a2f2b1ac4000e0c00043b221d221d221d221d1ad4000e0c00063b221e221e221e221e1ac4000e0c00062b1ac4002c220f1abe002e221d2228020220002227222622241ab4000e0c000c5032250c260b1e7f3b270b02013b642709022929220e220d220d1a9b000c0005292d220f220e220d342210220f220f1a8e00220f0e0e0e7b0b10000a661f0a0e000000000000000040010000000000000000000000000000|@8199,I105,I218,@8200,@8202,@7218,I251,@14348,@8206,@6959,I48,@8208,@8251,@8198| 8198:O1|@8255 8199:S47|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e74283329 8200:O4|@14358,@1714,0,@8201 8201:O5|@6310,709,0,709,0 8202:D7,112|00802b1a72001a77000c00031a79005627693e2b69291a77000c000203041a7700103b50293b693b3b3b3b2d6805291a5e000e0e0e0c000203041a5b00103b5056583c2e56892d1a5600220c0e0e0e7b070800060e0e0e0e000000000000000060000000000000000000000000000000|@8204,@8205,@122,@8203,I105,@1363,@6975| 8203:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 8204:S66|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e742833296c6f6f6b75704661696c757265283129283129 8205:S14|20696e207369676e61747572652e 8206:D7,112|00802b1a72001a77000c00031a79005627693e2b69291a77000c000203041a7700103b50293b693b3b3b3b2d6805291a5e000e0e0e0c000203041a5b00103b5056583c2e56892d1a5600220c0e0e0e7b070800060e0e0e0e000000000000000060000000000000000000000000000000|@8204,@8205,@122,@8207,I105,@1363,@6975| 8207:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 8208:O1|@8209 8209:D34,1264|008a220c3533352a37293629353c1ae7040c000364031429362936291ae1041ad6040e0e0e0c00036502013b6403033c02272937293629353c1abc040e0c000364031429362936291ab5041aaa040e0e0e0c00036502013b6403033b0fca2a37293629353c1a90040e0c000303042937024129353b1a80040e0c000303042936023129363b2a291a7e040e0e0e0c00021a7d040e0e0c0002031729362b3c1a77040c0003292b25042504511e253b6502012a662c37293629353c1a3b040c000303042937024129353b1a2c040e0c000303042936023129363b2a291a2a040e0e0e0c00021a29040e0e0c0002031729362b3c1a23040c0003292b25042504511e253b6502012a662c2a1a14040e0c000327061afb030c0002036e1a0b043169220f220f1a0a040202a6030e0e0e0c0003220d220d1af9030e0e0c0003291af803691afc032a691aff032a691a02042a692e2a691a02042a691a05042a693b3e3b3b2d6805291aa0030e0c000203041af703103b503b5022113c220c22162d1aef0322147b071a00062a37293629353b1a66030e0e0e0c0003030d29382922100e0e0c00026402012a2c37293629353b1a46030e0e0e0c0003030d29382922100e0e0c00026402012a2c3629353b1a28030e0c00030383293829220e1a9a030e0e0e0c000303033b026d29220e1a91030e0e0c000329220e2a1a8d030e0e0c000329353c1af2020e0e0e0c0003031e2936292c1a7b030c000303041a7b03103b503b50292503511e313b640202293565293b1ac4020e0c000303033b0218293e1ab6020e0e0e0c000303043b5002041a4f03103b503c656402013b641ab2020e0e0e0c000207d7303522142a1a3a030e0e0e0c00033e2a69291a8d020e0e0c000203041ae302103b503b502f3729352a362b371a1b030c0004293b691a1a032a691a1d032a691a20032a692f2a693b3e3b3b2d6805291a50020e0c000203041aa702103b503b501a0703221969222022201a5d020e0e0c0003221e221e1a51020e0e0c00032c3b691aee022a691af1022a691af4022a692d2a691a44022a691a47022a691a4a022a69322a691a4a022a691a4d022a693b3e3b3b2d6805291ae8010e0c000203041a3f02103b503b5022263c2210222b2d1a37022229020205007b072f0006293629353b1aac010e0c00030383293829220e1a1e020e0e0e0c000303033b026d29220e1a15020e0e0c000329220e2a1a11020e0e0c000329353c1a76010e0e0e0c0003031e2936292c1aff010c000303041aff01103b503b50292503511e313b640202293565293b1a48010e0c000303033b0218293e1a3a010e0e0e0c000303043b5002041ad301103b503c656402013b641a36010e0e0e0c000207d72f3522112a1abe010e0e0e0c00033e2a69291a11010e0e0c000203041a6701103b503b502c3729352a362b371a9f010c0004293b691a9e012a691aa1012a691aa4012a692f2a693b3e3b3b2d6805291ad4000e0c000203041a2b01103b503b501aab01221969222022201ae1000e0e0c0003221e221e1ad5000e0e0c00032c3b691a72012a691a75012a691a78012a692d2a691ac8002a691acb002a691ace002a69322a691ace002a691ad1002a693b3e3b3b2d6805291a6c000e0c000203041ac300103b503b5022263c2210222b2d1abb002229020205007b072f00062c2a220d220d1a2f01220e7b06150005651f0b0e0e0e0e0e0000000000000000e0040000000000000000000000000000|@8211,I251,@14348,I105,I218,I106,I113,@8212,@8214,@8217,@871,@8224,@871,@1404,@8226,@1363,@6975,I234,I107,@4801,I231,@7063,@8228,@122,@8231,@871,@8234,@871,@8236,@871,@8220,@901,@8237,@8210| 8210:O1|@8238 8211:S35|5349474e41545552455328292e73696756616c28362973686172655479706573283829 8212:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8213,@6611| 8213:S50|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e745368617265283129283129 8214:O1|@8215 8215:D7,216|00812c35293629291ad5000e0e0c00021ad5000e0e0c0002031f29352a362a353b1acc000e0c000303052a68010207292503511e2c3b6502013b64291aa1000e0e0c00021aa1000e0e0c00020311293529353b1a9a000e0e0e0c00036402013b031c293529363b2a69291a73000c000203041a8300103b50293b696602013b2c35302a1a7a000e0e0e0c00033e2a69291a4d000e0e0c000203041a6b00103b50293b693b3b3b302d6805291a32000e0e0e0c000203041a4f00103b50292709430000000000000000c8000000000000000000000000000000|@8216,I105,I218,I251,@1363,@122,@1363| 8216:S62|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e74536861726528312973686f7754797065436f6e73283229 8217:O2|@901,@8218 8218:O2|@8220,@8219 8219:O2|@871,@8221 8220:O2|3,46 8221:O2|@8222,0 8222:O2|3,@8223 8223:S58|546865207479706520636f6e7374727563746f72732074616b6520646966666572656e74206e756d62657273206f6620617267756d656e74732e 8224:O2|3,@8225 8225:S9|776974682074797065 8226:O2|3,@8227 8227:S17|43616e6e6f742073686172652074797065 8228:O4|@14322,@596,@8230,@8229 8229:O5|@6310,504,0,504,0 8230:S5|6973566172 8231:O1|@8232 8232:D12,280|00822b1a1a011a1f010c000303033c02222b1a1b010c00021a1d010e0e0c000203102b3b1af9003b28081a13010c000602013b034c3b2d69291af4000e0c000203041a0301103b50293b693e3069291ade000e0e0e0c000203041af300103b50293b693b3b3b2e2d6805291ac2000e0e0e0c000203041ad700103b50292705027e3b2d69291aa8000e0c000203041ab700103b50293b693e3069291a92000e0e0e0c000203041aa700103b501aa9002f1aad000e0e0c0003291aac001aa1000e0e0c00033e2a69291a65000e0e0c000203041a7b00103b50293b691a92002a692e2a693b3b3b332d6805291a42000e0e0e0c000203041a5700103b5029270a44000000000000000008010000000000000000000000000000|@8233,I48,I251,I105,I218,I154,@1363,@1363,@2916,@122,@2914,@871| 8233:S25|5349474e41545552455328292e7072696e7444657363283329 8234:O2|3,@8235 8235:S21|697320616c726561647920646566696e6564206173 8236:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8213,@6611| 8237:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8213,@6611| 8238:D16,592|00832e3629353b1a4e020e0e0e0c000303112e3629353b1a3e020e0e0e0c00036402013b6403043b5002041a3202103b502e3629382f3629382b311a2a020e0e0e0c000329312a1a26020e0e0e0c000329353c1a02020e0e0e0c0003031e2936292c1a13020c000303041a1302103b503b50292503511e313b64020129652b331ae5010e0e0c000329332a1ae2010e0e0e0c000329353c1abe010e0e0e0c0003031e2936292c1acf010c000303041acf01103b503b50292503511e313b64020129652b353e1a90010e0c000303342b36293629353b1a80010e0c000303202b353e1a74010e0c000303112b36293629353b1a64010e0c00036502013b02013b6502013b03043b5002041a7c01103b502b362c372a3629362a372b382c392f37313632372a3629362a372b382c39322b1a5e010e0e0e0c000303033b0fd0322b1a56010e0e0e0c000303033202012a332c1a4d010e0e0c000303033302012b3303033c02012b220e301a25010e0e0c000303043b5002041a2f01103b50220d353c1ad5000e0e0c00030311220d36293b1a1e010e0e0e0c0003640203220d3603033c021a2e353c1aaf000c0003030d2e36293b1afb000c00036402022e363b2a693b22112b302f68051aed002a220f6a220c3b1a83000c000303042214020a2214220d1adb000c00033e2b2b6a3122241a76000e0e0e0c000322232a2c1ac9000e0e0c0004503122251a5d00020225000e0e0c00033322261a4e000e0e0e0c00033c2a6922262c2b1a9e0022290e0e0e7b052a000427171f04000000000000000040020000000000000000000000000000|@8240,I251,@8241,I107,@4801,I231,@7063,@8244,I113,I234,I233,@8247,I253,@473,@8239,@4755| 8239:O1|@8250 8240:S44|5349474e41545552455328292e73696756616c2836296c696e6b466c657869626c6554797065496473283229 8241:O4|@14322,@596,@8243,@8242 8242:O5|@6310,552,0,552,0 8243:S30|6c696e6b466c657869626c65547970654964733a206e6f7420626f756e64 8244:O4|@14322,@596,@8246,@8245 8245:O5|@6310,550,0,550,0 8246:S33|6c696e6b466c657869626c65547970654964733a206e6f74207661726961626c65 8247:O4|@14322,@596,@8249,@8248 8248:O5|@6310,540,0,540,0 8249:S38|6c696e6b466c657869626c65547970654964733a20646966666572656e742061726974696573 8250:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8239| 8251:O1|@8252 8252:D8,136|00832e1a8a000e0e0e0c00021a89000e0e0c000203512e352f362a352b3631230c1a7c0032322d6b1a7d002b2e2c1a7f000c0005293b1a7f000c000303122e220c220c220c1a7800220d0e7b060d000529352f220d220d220d1a64000e0c00052a2a69270902013b1f040e0e0e0e0e0e000000000000000078000000000000000000000000000000|@4144,I105,I218,@8253,@6990,@7116,I251,@8251| 8253:D7,112|00802b1a72001a77000c00031a79005627693e2b69291a77000c000203041a7700103b50293b693b3b3b3b2d6805291a5e000e0e0e0c000203041a5b00103b5056583c2e56892d1a5600220c0e0e0e7b070800060e0e0e0e000000000000000060000000000000000000000000000000|@8204,@8205,@122,@8254,I105,@1363,@6975| 8254:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 8255:D3,56|0088332e312f2f1a36000e0e0e0c0006313131220d220d1a2e00317b080b0007000000000000000028000000000000000000000000000000|@8257,@8258,@8256| 8256:O1|@8260 8257:S41|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329 8258:O1|@8259 8259:D6,112|00842f1a72000e0e0e0c00021a71000e0e0c000203392f3530362a3529282e1a66000e0e0e0c00033b333333331a60000e0c00062d2b2b6a2d220c220c220c220c1a54000e0c00062a2a69270702013b1f050e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@122,@6959,@8258| 8260:D13,344|0085040200311a57012a1a5b010c00021a5d010e0e0c0002031c2a352b362a2c1a55010e0e0c00032a2a2505250526031e2726030209292c2a35452a3646515129352a362a1a38011a3d010e0e0c0003291a3c013b3b1a3f010c00052b1a40011a25010e0e0c0003291a24013b3b1a27010c00052b291aef000c00021af1000e0e0c0002037c29352a362a1ada000e0e0e0c00021ad9000e0e0c000203043b5002041a0301103b502a352b362a352b362c372c291ab1000e0e0c00021ab1000e0e0c0002032e29352a362a352b362c373131312e2e2e221e221e2223222322231acd000e0e0c000c502c250626051e3b260502023b50502e250826071e87260702023b505029291a5e000e0e0e0c00021a5d000e0e0c0002032129352a362a221122112211221122111a8c000e0c000750292503511e2f3b6502013b27081f06000000000000000048010000000000000000000000000000|@8262,@473,I105,I218,@8263,@8268,@1497,I48,@8273,@8276,@8261,@8208,@8256| 8261:O4|@14358,@1714,0,@8279 8262:S56|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329736861726553747275637473283129 8263:O1|@8264 8264:D4,64|00812c35293729352a39303631371a37002c2b6a1a39002a2d6a2e342b1a3800220d0e7b050c0004000000000000000030000000000000000000000000000000|@8266,@8267,@8265,@1633| 8265:D8,224|00822c2c2a1ae0000e0c00021ae1000e0e0c000203ac2a352b362b352c362c35291ad4001ad9000e0e0c00036403442c351ac4001ac9000e0e0c000303043b5002041ac300102c375678220c1ac1000e0e0c000329282e1ab6000e0e0e0c00032b2a56b76a220e2a69292f69302a69270602402c35291a9f001a84000e0c000364032d2c351a90001a75000e0e0c000303043b5002041a6f00102c3729568856976a220c2a69292e69292e69270402032a2a692c2a2507250726051eb73b270502012965440e0e0e0000000000000000d0000000000000000000000000000000|@1636,I105,I218,@14325,I251,@1576,@122,@14314| 8266:S40|5349474e41545552455328292e73696756616c28362973747275637473416e645479706573283229 8267:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8268:O1|@8269 8269:D2,40|00802b351a29002a6964420e0e0e0e0e000000000000000018000000000000000000000000000000|@8271,@8270| 8270:D2,40|00802b3556172a1a26002e0e7e040003000000000000000018000000000000000000000000000000|@8272,I29| 8271:S59|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283129 8272:S62|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283229283129 8273:O1|@8274 8274:D8,296|00832e1a2a010e0e0e0c00021a29010e0e0c000203ca2e352f362a352b36312b1a1d010e0e0c000303033c024a311aff000c00021a01010e0e0c000203142a1aee000e0e0e0c00021aed000e0e0c000202013b0321313b2c3b28082f1ae9000e0e0c00021ae9000e0e0c00031ae9000e0e0c000602013b03132931692c332b331add00340e0e0e7b060b0005301aa0000e0c00021aa1000e0e0c000203323036293b1a9b000c000303122a3b692d2d2b341aac00220c0e7b060c00052a3b693232692e2e2c2c1a9700220d7b060d0005293b692c2c2b331a8600347b060b00052c1a4c000e0c00021a4d000e0e0c000203152c36293b1a47000c000303032c02032d2d696402012b1f040e0e0e0e0e0e000000000000000018010000000000000000000000000000|@8275,I105,I218,I251,I223,I239,I154,@8273| 8275:S54|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129676574457175616c73283429 8276:O1|@8277 8277:D2,40|00802b351a29002a6964420e0e0e0e0e000000000000000018000000000000000000000000000000|@8271,@8278| 8278:D2,40|00802b3556172a1a26002e0e7e040003000000000000000018000000000000000000000000000000|@8272,I29| 8279:O5|@6310,676,0,676,0 8280:O1|@8281 8281:D15,384|009d3c284022201a7e010e0e0e0c0004221e23081a79012a22206a2220230c1a76012a22216a1a77011a7c01222122212221222122211a770133222322232223220c680d0402002226353b1a6a010e0e0e0c000303382226362227370406002b2e2c3b22152e2221222122212221222122212221222122212221222c0e0c00115029352a392e2b452a46260602822226353d1a23010c0003033d22263629352a362b372c382d392c2b2d2c31220c221a222522252225222522252225222522252225222522240e0e0e0c0012302a35452a3946260802392226362227372228380406002c2c2c3122162e221b22232223221d222422242224222422241ac1000e0e0c00105029352a392f2b452a46260729352a361ab100220e2227221d2212221e220e68071aa800220e2227221e2213221f220f68071a9f00220e2223221f2214222022106807292c2c6a2e2a2f3c1a8e00323b1a91000e0e0c0008220d3b1a8e0022127e2e0003000000000000000070010000000000000000000000000000|@8283,I11,@8284,@8285,@6992,@6997,@7002,I251,@7021,@8286,@8294,@8282,I48,@7226,I253| 8282:D10,152|00802b352c3629352a362b372c382d392b353b1a8a000e0e0e0c000303043b5002041a830010567c3b1a84000e0c0003293c1a83000c0003569c3b2b1a81000e0e0c0004503b2b6930302b30303b3b6807332a1a720056e76956e81a72001a77001212000100030012130001000400121400010005001a670022167b0b0e000a000000000000000088000000000000000000000000000000|@8298,I251,@8291,I253,I106,I255,@8297,@6970,@6971,@6966| 8283:S65|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229 8284:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8285:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8286:D7,112|00802b352c3629352a36293b1a69000e0e0c000303032b02182a352b372c362b2a2c6a2d569c1a57000c00032a2a6927052d2a1a520056876956881a52001a570056b956ca56db1a560022100e0e0e7b0b08000a0e0e0e0e000000000000000060000000000000000000000000000000|@8288,I251,@8289,@8287,@6985,@6983,@6966| 8287:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 8288:S77|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657254797065283129 8289:O1|@8290 8290:D9,152|00812c1a9a000e0e0e0c00021a99000e0e0c000203612c352d362a352b362c372d382e392b353b1a86000e0e0e0c000303043b5002041a7f00103b50323b1a7f000c0003293c1a7f000c0003343b2b1a7e000e0e0e0c0004503b2b6930302b30303b3b680732220e1a6d000e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e000000000000000088000000000000000000000000000000|@1399,I105,I218,I251,@8291,I253,I106,I255,@8289| 8291:O4|@14322,@596,@8293,@8292 8292:O5|@6310,1141,0,1141,0 8293:S21|6e65774163636573733a204e6f7420466f726d616c 8294:D10,144|00802b352c3629352a362b372c382b353b1a84000e0c000303043b5002041a7f0010566c3b1a80000e0c0003293c1a7f000c0003568c3b2b1a7d000e0e0c0004503b2b692f2a2f2f6b322a1a720056d76956d81a72001a77001211000100030012120001000400121300010005001a670022157b0b0d000a000000000000000080000000000000000000000000000000|@8296,I251,@8291,I253,I106,I255,@8295,@6990,@6988,@6966| 8295:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 8296:S79|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e746572537472756374283129 8297:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 8298:S76|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657256616c283129 8299:D5,96|00801a63005617693e2d69291a61000e0e0c000203041a5f00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a4300103b5056483c2e56792d1a3e00347b07070006000000000000000050000000000000000000000000000000|@8301,@8300,I105,@1363,@6975| 8300:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8302,@6645| 8301:S32|5349474e41545552455328292e67697665537065634572726f72283329283129 8302:S35|5349474e41545552455328292e67697665537065634572726f72283329283129283129 8303:D4,72|0082560a23081a47002a56376a562a230c1a44002a56586a2b2a69293356791a3e000e0e0e0c0004312a35452706440e000000000000000038000000000000000000000000000000|@7219,@8305,@8304,@7218| 8304:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8305:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8306:S12|53706563696679696e672022 8307:S13|2220697320696c6c6567616c2e 8308:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8302,@6645| 8309:D1,40|00812c2c6956172c7d0400020e0e0e0e000000000000000018000000000000000000000000000000|@6969| 8310:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8302,@6645| 8311:D5,80|0082560b23081a4f002a56376a562b230c1a4c002a56586a2b2a691a4a005669567a346b2a342b1a46000e0e0e0c0004322a35452707440e000000000000000040000000000000000000000000000000|@7219,@8313,@8314,@8312,@7218| 8312:D5,96|00801a63005617693e2d69291a61000e0e0c000203041a5f00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a4300103b5056483c2e56792d1a3e00347b07070006000000000000000050000000000000000000000000000000|@8301,@8315,I105,@1363,@6975| 8313:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8314:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8315:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8302,@6645| 8316:O1|@8317 8317:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8318| 8318:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329283129 8319:O1|@8320 8320:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8318| 8321:D18,216|00842e3b1ad9000e0e0c0003292f1ad7000c0003293b1ad7000c000303051ad700028c293b1ad8000e0c0003030c291ad6001adb000c000302013b03043b5002041ad400103b502928403b1ad2000e0e0e0c00043b2b2a1ace000e0e0e0c000303043b50023c302a1ac5000e0e0c0003293b1ac3000c000303041ac300103b503b5029352c2c2b1abe000e0e0e0c0004502b3c1aba000e0e0e0c00032503511e4a5150291ab1000e0e0c00025029641aae002f2b336b661f050e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@8323,I253,I107,I113,I49,I233,72057594037927935,I234,@4398,I11,I232,@4801,I251,@1792,I255,I106,I47,@8322| 8322:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@8324,I234,I107,I105,I218,I15,I247,@599,I253| 8323:S34|5349474e41545552455328292e73696756616c283629747970654964456e76283129 8324:S37|5349474e41545552455328292e73696756616c283629747970654964456e76283129283129 8325:D44,1424|00902212353b1a8f050c0003034b2212362213370406002b22112c3b22132e2214221422142214221422142214221422142214121400010001000e0e0e0c00115029352a362b372c382d392e3a2e2e2e2e2e2e6806270902862212353d1a38050e0c0003033622123629352a362b372c382d392c2b2d2c3122182218221822182218221822182218221822182218221822170e0e0e0c0012270602432212362213372214380406002c2c2c221422142e220e221622162210221722172217221722171adb040c00105029352a362b372c382d392e3a2e2e2e2e2e2e6806270a29352a39040d002b2a1abd040e0e0c0003502923082a230c1ab6042212221222176b2b2b692922192c1aad040e0e0c000422181aab0422162216221a6b22151aa7040c00042a352937293629353c1a68040e0c000364031429362936291a91041a56040e0e0e0c00036502013b6503043b500fd02a35293729360402002a353b1a36040e0e0e0c000303152a3829220d0e0e0c00022b2a36452a3746260302092b2a2a36452a37465129352a362a353b1a06040e0e0e0c000303832a3829221a1a36040e0e0e0c000303033b026d29221a1a2d040e0e0c000329221a2a1a29040e0e0c000329353c1ace030e0e0e0c0003031e2936292c1a17040c000303041a1704103b503b50292503511e313b640202293565293b1aa0030e0c000303033b0218293e1a92030e0e0e0c000303043b5002041aeb03103b503c656402013b1ae703020247030c0002038e1ae3032223691ae50322221ae8030e0c0003291ae8031add030e0e0c00033e2a69291ae1030e0e0c000203041adf03103b503b502d352e362f371ad9030e0e0c0004293b691ad6032a691ad9032a691adc032a692e2a691adc032a691adf032a693b3e3b3b2d6805291a9a030e0e0e0c000203041a9703103b503b5022273c220e22222d1abf030c0006260e0fce2a353b1ada020e0e0e0c000303043b5002041aab03103b502a3829221a1a08030e0c000329221a2a1a05030e0e0c000329353c1aaa020e0e0e0c0003031e2936292c1af3020c000303041af302103b503b50292503511e313b640201296529353e1a7c020e0c000303112936293629353b1a6c020e0c00036502013b03043b5002041a4303103b502936293629372a382b392b353c1a48020e0c0003030d2b36293b1a2b030c00036402022b36032f220e1a24031a29031a2e030e0e0e0c0004293c1a1b020c0003641a84020202e2010e0c00021a79020e0e0c000202013b031e1a0c031a11032227222d222c2213222822211a0a030e0e0e0c0009500fcd220e3528051ad9010e0e0c00030396220e36220f382a222c2a3b1ac4010e0c0003030c293b1ab9010e0e0c0003024f2a352b362b1a42020e0e0e0c00021a11020e0e0c000203352b352c362c3528061a8f010c000303112c362b352a2a1a81010e0e0c00036502013b030d2b2a2506250626041e5b3b02013b6502013b65651acf010c000203033b02182937293629353d1a4d010e0e0c000303033b02032a6801656502013b293b1a36010e0e0e0c000303562a03221a50021a55022228222e222d2214222922221a36020202e2000e0e0e0c000950022f222922281a3a026a3d222c22126a1a38022a2c6a2e22251a37010c00033b2b6922252b2b1a2a020e0e0e0c0004260602a72935293629353b1ace000e0e0e0c0003035b29382922251afe000e0e0e0c000303053b2c6902432922251af3000c00032922252a1af1000e0e0c000329353c1a96000e0e0e0c0003031e2936292c1adf000c000303041adf00103b503b50292503511e313b64020129666402033b2b6929353e1a62000e0e0e0c000303112b32222622261aa1010e0e0c00055002162e22251a8b000c000322242a2c1a81010e0e0c0004512603502608260632270a1f110e0e0e0e0e0e0e000000000000000080050000000000000000000000000000|@8327,I251,@7021,@1571,@8328,@7218,@8331,@7306,@14348,I234,I107,@4801,I231,@7063,@8228,I218,@8335,@8337,@122,@1354,I105,@1363,@8231,@871,@8338,@871,@1404,@8340,@6975,@8342,@8345,I253,@8347,@8349,@1720,@8351,@8352,@8353,@8361,@8326,I48,@694,@4755,@8210| 8326:S21|6973206e6f7420612073696d706c6520747970652e 8327:S43|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729 8328:D7,112|00802b1a72001a77000c00031a79005627693e2b69291a77000c000203041a7700103b50293b693b3b3b3b2d6805291a5e000e0e0e0c000203041a5b00103b5056583c2e56892d1a5600220c0e0e0e7b070800060e0e0e0e000000000000000060000000000000000000000000000000|@8330,@8205,@122,@8329,I105,@1363,@6975| 8329:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 8330:S59|5349474e41545552455328292e73696756616c2836297369676e61747572655768657265547970652837296c6f6f6b75704661696c757265283129 8331:D3,64|0082560923085619230c2a2a691a380056475658326b2a322b1a34000e0c0004302a35452705440e000000000000000030000000000000000000000000000000|@7219,@8332,@7218| 8332:D5,96|00801a63005617693e2d69291a61000e0e0c000203041a5f00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a4300103b5056483c2e56792d1a3e00347b07070006000000000000000050000000000000000000000000000000|@8334,@8333,I105,@1363,@6975| 8333:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@7028,@6611| 8334:S28|5349474e41545552455328292e676976654572726f72283329283129 8335:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8336,@6611| 8336:S46|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729283129 8337:S2|6060 8338:O2|3,@8339 8339:S24|2068617320616c7265616479206265656e2073657420746f 8340:O2|3,@8341 8341:S30|43616e6e6f74206170706c792074797065207265616c69736174696f6e2e 8342:O4|@14322,@596,@8344,@8343 8343:O5|@6310,937,0,937,0 8344:S12|736574576865726554797065 8345:O4|@14322,@596,@8344,@8346 8346:O5|@6310,935,0,935,0 8347:O1|@8348 8348:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 8349:O1|@8350 8350:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 8351:S16|697320616e2065717479706520627574 8352:S25|646f6573206e6f74207065726d697420657175616c6974792e 8353:O1|@8354 8354:D17,248|00871afb0031691afe0032692a2a691afe0033691a0101331a05010e0e0c0003291a04011af9000e0e0c00033e2a69291afd000e0e0c000203041afb00103b503b503e221169291ae6000e0e0e0c000203041ae300103b503b503b1ae2000e0e0e0c0002220d1be8032b323b1ad9000e0e0c00063e221369291ab4000e0c000203041ab300103b503b50293b691ac0002a692c2a691ac0002a69302a691ac0002a69332a691ac0002a691ac3002a693b3e3b3b2d6805291a76000e0e0e0c000203041a7300103b503b5022183c2213221a2d1aa300221c7b071f00060e0e0e0e0000000000000000e8000000000000000000000000000000|@8356,@8357,@8359,@8355,@8337,@122,@1354,I105,@1363,@1330,@1469,@901,@871,@871,@1404,@8340,@6975| 8355:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8360,@6611| 8356:S53|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229 8357:D3,72|0080560723082c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@8358,I105,I218| 8358:S64|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e7453657428322974797065456e762d283129 8359:D3,72|00805607230c2c2a0e0c000264291a3f000c00021a41000e0e0c0002030b2935293b692968016502013b64420e0e0e0e000000000000000038000000000000000000000000000000|@8358,I105,I218| 8360:S56|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229283129 8361:S17|6973206120646174617479706520627574 8362:O1|@8363 8363:D4,80|00822c2c2a1a50000e0c00021a51000e0e0c0002031c2a352b36312b2d1a48000e0c00042a2a2505250526031e283b6602012965440e0e0e000000000000000040000000000000000000000000000000|@1636,I105,I218,@8364| 8364:O1|@8365 8365:D10,344|00822c35291a58011a5d010e0e0c00036403462c351a48011a4d010e0e0c000303043b5002041a4701102c37293729353b1a34010e0c0003031b2936293c1a37010c000329301a37010c000303032902012f6502012d650fdd2c35291a29011a06010e0e0e0c00036403462c351a18011af5000e0e0c000303043b5002041aef00102c37293629353b1adc000e0c0003031b2936293c1adf000c000329301adf000c000303032902012f6502012d6502882c35291ad9001aae000e0e0e0c00036403752c351ac8001a9d000e0e0c000303043b5002041a9700102c372936292e2a1ab4000e0c00021ab5000e0e0c0002033f2a352b362a3729353b1a6a000e0e0e0c0003031b2936293c1a6b000c0003292f1a6b000c000303032902012e6502012c2b2a2506250626041e4a3b27040201292704020301002b440e0e0e0e0e0e000000000000000048010000000000000000000000000000|@8366,@14310,I251,@1576,I106,I233,@14325,@14314,I105,I218| 8366:S44|434f5049455228292e6765744e65787452756e74696d654f66667365742831296765744f6666736574283329 8367:O1|@8368 8368:D27,704|00862f3b1ac1020e0e0c000329301abf020c0003332a1abf020c000365030d1abe02312a35452a3646640fdd312e2a1ab6020e0e0e0c000329353c1ab2020e0e0e0c0003031e2936292c1aab020c000303041aab02103b503b50292503511e313b640201296529353b1a84020e0c000303b52936293629353d1a74020e0c0003036c29362a372c371a7d0234220d6a1a7e022a692c1a80022b1a84020e0c00043d2f2b6a1a81022a2f6a3b2a69221022152b1a7b020c000422153c1a7a020e0e0e0c00030402002a2a221722172217221722171a6a020e0e0e0c00085029352a362f2a6922192c452a46270f0236343c1a45020e0e0c00030402002a2a220d220d220d220d220d020299011a32020e0e0e0c00085029352a362e2a69220f2c452a462705650fcc29353e1ac3010c000303043b5002041a0f02103b5029362a372a3629353b1aa8010e0c000303043b5002041afb01103b5029362a372b392e3729352a362b37311aee010e0e0e0c00021aed010e0e0c000203153136291ad8010e0c00021ad9010e0e0c00026402013b034d311ac2010e0e0e0c00021ac1010e0e0c0002032931353236293b1a41010e0e0c000303032a0213291aab010c00022b2a69641aa9010e0e0c00026502031aa6011aab012a1aaf010c000364020129220f3b1ae2000e0e0e0c0003293c1a47010202ae000c000322113b2b1a91010e0e0c00045022103b1abd000e0e0c0003293c1a23010c000322123b2b1a71010e0e0c00045030302f6a3b2c69220c353c1abd000e0e0c00030311220c36293b1a86000e0e0e0c0003640203220c363b2a693b22102b33221168052c2a2f6a3b2a69221b22202b1ac7000c000422203c1ac6000e0e0e0c00030402002a2a222222222222222222221ab6000e0e0e0c00085029352a362f2b69302b6922252b452a46271d641f070e0e0000000000000000b0020000000000000000000000000000|@8370,I253,I107,I113,@473,@4801,I251,I231,@7063,@8371,@8376,@8383,@1416,@694,@4755,I106,@8367,@8385,@8385,I105,I218,@8388,@104,I48,@8369,@122,I255| 8369:S8|73686172696e6720 8370:S31|5349474e41545552455328292e73696756616c2836296d6170496473283129 8371:D8,168|00802b3629353b1aa6000e0e0e0c0003037529382956381a9e000e0e0e0c000303033b025f2956381a95000e0e0c00032956472a1a91000e0e0c000329353c1a6e000e0e0e0c0003031c2936292c1a7f000c000303041a7f00103b50292503511e2f3b640201296529353b1a42000e0e0e0c000303043b5002041a6300102936296801666402013b64420e0e0e0e0e0e000000000000000098000000000000000000000000000000|@8373,I251,I234,I107,@4801,I231,@7063,@8372| 8372:O4|@14322,@596,@8375,@8374 8373:S40|5349474e41545552455328292e73696756616c2836296d6170496473283129636f70794964283129 8374:O5|@6310,1350,0,1350,0 8375:S21|6d61704964733a636f707954797065436f6e737472 8376:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@8378,@8379,@8377,@1551| 8377:O1|@8382 8378:S46|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129 8379:O1|@8380 8380:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8381| 8381:S49|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129283129 8382:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8381| 8383:O1|@8384 8384:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8378| 8385:O4|@14322,@596,@8387,@8386 8386:O5|@6310,1376,0,1376,0 8387:S6|6d6170496473 8388:O1|@8389 8389:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c36291a4a000e0e0e0c00022b2a69282c2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1666,I105,I218,@8388| 8390:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@8391,I234,I107,I105,I218,I15,I247,@599,I253| 8391:S36|5349474e41545552455328292e73696756616c2836296d617046756e6374696f6e283129 8392:D3,48|00802b352c3629382b2a56571a29001a2e00327b06060005000000000000000020000000000000000000000000000000|@6858,@6859,@6857| 8393:D3,56|00802b352c362a282e1a34000e0c00032a372a2a56671a2f00320e7b05070004000000000000000028000000000000000000000000000000|@6858,@122,@6885| 8394:D8,128|00821a83005617691a85002f1a89000e0e0c0003291a88001a7d000e0e0c00033e2a69291a81000e0e0c000203041a7f00103b50293b693b3b3b3b2d6805291a66000e0e0e0c000203041a6300103b5056683c3056992d1a5e00220d0e0e0e7b070b00060e0e0e0e000000000000000070000000000000000000000000000000|@6891,@8396,@8395,@122,@6895,I105,@1363,@6890| 8395:S8|46756e63746f7220 8396:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@6893,@6598| 8397:O1|@8398 8398:D59,2064|00a12223352224362225373c2840221c1a05080e0e0c00043c28403b1af9070e0e0c00042b221d221d221d221d222b1aee070e0e0e0c00073b222869221b23103b2a0e0e0e0c00023d2a69293b692d2a693c28401ad1071abe070e0e0e0c00043c28401aca071aaf070c00043d2b2b6a220e2a342f6b33372922112c1ab9070e0e0c0004293b1ab7070c000303051ab70702903b2a291ab7070c00021ab9070e0e0c0002031729362b3c1ab3070c0003292b25042504511e223b6502012a65291aa5071aaa070e0e0e0c000303041aa707103b503b502928403b1a3b070c00043b2c293b1a59070e0e0c000303043b50022629352a362d2d2c1a84070e0c0004502c3c1a5a070e0e0e0c0003292b2505250526031e32260351291a6b070c0002502965220f3b1a67070c0003220e373b2a291a1b070c00021a1d070e0e0c0002031729362b3c1a17070c0003292b25042504511e223b6502012a652b2a1a00070e0c000322133b2b1a15070e0e0c00045022133b1a19070e0e0c00032212352213362214382215391a0d0722333422366b1a0c072b2b6a2e353c1aa3060c000303592e362f382a3b1ae5060e0e0c00032a3b1adb060c0003293b1ad3060c0003293b1ae3060c000303051a7b0602242928403b1a42060e0e0e0c00042b3c2b3b2e1acc060e0c000650291a9b060c00025029643b2d2b6a270602012e292f3b302e220c68067881463c28403b1a09060e0e0c0004280b28403b1afc050e0c0004293b401a5a060e0e0e0c0004503c28402b1ae4050e0c00043c28401a7a061ad7050c00043c2a2e2d6b2704053a0e00ff6d29353f1ae9050e0e0c00030323403c1a5d060e0e0c00031a5d062a1a61060e0e0c00031a61061a66062b1a6a066b65103b503b502910040d002a2a1a61060e0e0c00035029372a382b23062c23082d23092e230a2f230c22281a4b061a90050e0c000303033c022a22281a92050e0e0e0c00021a91050e0e0c0002031422283b1a24063b28081a26060e0e0e0c000602013b1a72050e0e0e0c000203252228221b3422206b293b6922443b2b1a80050e0c000450222a2b692d0e0e0e0c00026502331af2052f22436a1af3052c2245221d6b1af205322248221e6b292c2c6a220e2a22113c1abf0522143b1ae1050e0e0c00082704221a680122293b2b1a2f050c0004501ad005223e2240326b1acf05223d223f326b1ace05223c223e306b1acd05223b223d336b1acc05223b223b223b223b223b32223c3332223e223e220d680d1aba05222c222e6a1aba0522482220222e221d224d223268071ab105222f6904060022562d2c2e31224d225b1a36053122401aa0050e0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e6806224f38293b1aa7040c00036403033b021b225b1a79051ad6040e0e0e0c0003292b22521a71050e0e0c000464303b1a6e051a73050c0004313b1a73051a68050e0c000422393b1a66040e0e0e0c0003293b2a1a1a040e0e0e0c00021a19040e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1ade030e0e0e0c000303051adb0302903b2a291adb030c00021add030e0e0c0002031729362b3c1ad7030c0003292b25042504511e223b6502012a65291ac9031ace030e0e0e0c000303041acb03103b503b502928403b1a5f030c00043b2c293b1a7d030e0e0c000303043b50022629352a362d2d2c1aa8030e0c0004502c3c1a7e030e0e0e0c0003292b2505250526031e32260351291a8f030c0002502965291a95040e0e0c0002293b1a9b030c000303051a33030fd82928403b1afa020e0e0e0c00043b292c1a46030e0e0e0c000303043b5002b22c2a1a55030e0e0c0003293629353b1af8020e0c0003037929362a382b392d372f220d1a04030e0c00033b2a69303629353d1ad5020e0e0c000303041a2b04103b503b5029353b1ac0020e0c00030322293729353c1ab2020e0e0e0c0003030d2936293b1af3020c0003640202293664020d2936293b1ae1020e0e0c0003643b2a693b322b333368052d2a316a270a02012a2d2d2b1ab2020e0e0e0c0004502c3c1a86020e0e0e0c0003250426031ebf260350291a9b02020206000c0002502964291a9d030e0e0c00023b2a293b1a39020e0e0c000303032a022b293c1a92030e0e0e0c00032a3c1a87030c00032e2a1a67020c0003292e69292d2506250626041e353b2704652d1a57030c00023b2a293b1af5010e0e0c000303032a026e293c1a4e030e0e0e0c00032a3c1a43030c00032b3c1a3b030c0003332a1a1b020c00032b1ad4010e0c00021ad5010e0e0c000203033c0210321a07030c00022c2a1a17030c00036403041a1603103b503b50322c1ae4010e0c0003292b6929316929302509250926071e783b27076522663b2b1ab5010e0e0c0004501aec02225e22362244312234226468071ae40222102b6a2214353c1a51010e0e0c000303592214362215382a3b1a8f010c00032a3b1a87010c0003293b1a7f010c0003293b1a8f010c000303051a270102242928403b1aee000e0e0e0c00042b3c2b3b2e1a78010e0c000650291a47010c00025029643b2d2b6a2706020222142922153022152e22376806291a70020e0c00023b311a6f020c0003293b1acf000c000303032a020b2a2a1a62020e0e0e0c000322683b2b1af5000e0e0c0004503b227069226323103b2a0e0e0c00023d2a69293b692d2a693c28401a79001a66000e0e0e0c00043c28401a72001a57000c00043d2b2b6a224722782b220f30680522782a69225b0e0c00025029680122773b2b1a99000e0e0c0004503b27591f220e0e0e0e0e0e000000000000000000080000000000000000000000000000|@8400,I11,@6900,-1,@2249,@8401,I251,I49,I105,I218,I106,72057594037927935,I231,@3441,I255,I47,I253,@8410,@8412,I113,I195,@8413,@243,@6963,@122,@14322,@596,@6964,@1571,I48,I154,@8415,@8417,@8418,@7226,@8419,@8420,@8421,@8422,@8429,@8431,@8433,@8437,@8439,@8763,@6885,@8751,@1633,@8764,I15,@1377,I240,I247,@599,@8766,@8768,@8671,@8680,@8399| 8399:O1|@8769 8400:S63|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229 8401:O1|@8402 8402:D5,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e362a2f2f1a50000e0c00042a30301a4e000e0e0e0c00042a2a69270402013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@8403,@8401| 8403:O1|@8404 8404:D8,208|00822d3529353b1ace000e0e0e0c000303112e3629353b1abe000e0e0e0c00036402013b6403043b5002041ab200103b502d3529362f3629362a372b382c39343729352a362b373b313131316805220f1a95001a82000e0e0e0c000303033c022a220f1a8a000e0e0e0c00021a89000e0e0c00020314220f3b1a6c003b28081a7e000e0e0e0c000602013b03032c0215220f282e1a71000e0e0c0003292e1a67000c000364292d2d6a3f220d22126a292d2c6a270f440e0e0000000000000000c0000000000000000000000000000000|@8406,I251,@8405,I48,I105,I218,I154,@122| 8405:O4|@14322,@596,@8408,@8407 8406:S70|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296d6b4964283129 8407:O5|@8409,2184,0,2184,0 8408:S29|6d6b49643a204e6f7420426f756e64206f72206e6f7420466f726d616c 8409:S34|6d6c736f757263652f4d4c436f6d70696c65722f535452554354555245535f2e4d4c 8410:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@8411,I234,I107,I105,I218,I15,I247,@599,I253| 8411:S98|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296172675369675769746853656c65637465642d6d6170546f53656c6563746564283129 8412:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8413:O1|@8414 8414:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8415:D3,72|00802b352c3656283b1a44000e0c00032a2a6956483b2b1a3e000e0e0e0c0004502c2c695657300e7d0700020e0e0e0e000000000000000038000000000000000000000000000000|@8416,I253,I255| 8416:S68|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132295f2d283129 8417:D4,80|00802b352c362956393b1a4b000c000456383b1a4a000e0e0e0c00032a2a6956583b2b1a42000e0e0e0c0004502d2c695667310e7d080002000000000000000040000000000000000000000000000000|@8416,@7606,I253,I255| 8418:D4,80|00802b352c362956393b1a4b000c000456383b1a4a000e0e0e0c00032a2a6956583b2b1a42000e0e0e0c0004502d2c695667310e7d080002000000000000000040000000000000000000000000000000|@8416,@7132,I253,I255| 8419:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 8420:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 8421:D2,80|00802b56190c0002293b1a4b000c0003031e2c56280c0002293b1a3b000c0003030a2d56372e0e0e7d050002296402012964420e0e0e0e0e000000000000000040000000000000000000000000000000|@6003,I251| 8422:D7,136|00803b56190c00023c28403b1a81000e0e0c00041a81002a6956380e0e0c00022a3b1a7b000c0003564723093b2a0e0e0e0c000264293b1a6e000e0e0e0c000303032a020b2a2a1a66000e0e0e0c0003293b1a53000c000303032e020b2e2a1a5600330e7e0900032706420e0e0e0e0e000000000000000078000000000000000000000000000000|@8424,I11,@8425,I253,I251,@8426,@8423| 8423:O1|@8428 8424:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229656e7657697468417267732d283129 8425:D3,64|00802b3556173b1a3e000e0e0e0c00032a2a6956373b2b1a36000e0e0e0c0004503b66420e0e0e0e000000000000000030000000000000000000000000000000|@6841,I253,I255| 8426:O1|@8427 8427:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8426| 8428:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8423| 8429:O1|@8430 8430:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8424| 8431:D9,200|00802b352c362d372e382f3956583b1abe000e0e0e0c0003293c1abb000c000356783b2b1ab9000e0e0c0004502e032e3c28401ab2001ab7000c00043c28401ab6001aab000c00043d2b2b6a322a2f3333336806661aa8000e0c0002022e3c28401a84001a89000e0e0c00043c28401a86001a7b000c00043d2b2b6a322a2f3333336806661a80000e0c000256873b1a3e000e0e0e0c00032a2a6956a73b2b1a3e000e0e0e0c0004502b270a420e0e0e0000000000000000b8000000000000000000000000000000|@8432,I253,I106,I255,-1,I11,@2249,@7051,@7039| 8432:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296e6577547970654964283129 8433:D14,264|0080560c3b1a08010e0c0003293b2a1a06010e0e0e0c00021a05010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1aea000e0e0e0c000303051ae70002903b2a291ac7000c00021ac9000e0e0c0002031729362b3c1ad3000c0003292b25042504511e223b6502012a65291ac5001aca000e0e0e0c000303041ac700103b503b502928403b1ac3000c00043b2c293b1a89000e0e0c000303043b50022629352a362d2d2c1aac000e0c0004502c3c1a7a000e0e0e0c0003292b2505250526031e32260351291a93000c00025029651a92005647565856692d568a569b680766420e0e0e0000000000000000f8000000000000000000000000000000|@8435,I253,I105,I218,I251,I49,I106,72057594037927935,I231,@3441,I11,I255,I47,@8434| 8434:D9,216|00802b561c1ad8000e0c0003030a2b56172c0e0e0e8000022b561b1ac2000e0e0e0c0003034e56093a2c2a1aba000e0e0e0c0003291ab8000e0c00021ab9000e0e0c000203033c021456281ab2000e0e0e0c00022a2a1aaf000c00036403041aae00103b503b5056282a1aab002f0e0e7e0500032b561b1a6e000e0e0e0c0003291a6c000e0c00021a6d000e0e0c000203033c0214561a1a66000e0e0e0c00022a2a1a63000c00036403041a6200103b503b50561a2a1a5f002e0e0e7e0400030000000000000000c8000000000000000000000000000000|@8436,I234,I107,I105,I218,I15,I247,@599,I253| 8435:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129 8436:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129283129 8437:D2,40|008056073b1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8438,I253| 8438:S73|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132297265735369672d283129 8439:O2|@8441,@8440 8440:O2|@8707,@8439 8441:D77,2792|00891aeb0a32326a1aed0a33336a2a2a69220e353d1ae80a0e0c000307d2220e3629352a362b372c382d392e3a3c28403b1ad40a0e0c00043b22150e0e0c00023b22150e0e0c00021ac50a2c22196a1ac60a2b2e2e6b040600342c221b2d221b221b221b221b31221b221a0e0e0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68062211220c220c2221222122141a8c0a0e0c0007293a2a372b3a3b2b291a840a0e0c00021a850a0e0e0c0002031729362b3c1a7f0a0c0003292b25042504511e233b6502012a652a2a1a680a0e0c00031a690a22196904020031312c221a2229221722223022291a5a0a020246020e0e0e0c000a5029352a3622173b2b1a4c0a0e0c000450221a07db2d321a460a0e0e0e0c00031a450a2c346a2a2a1a450a0e0e0c0003220c3729221e22311a3d0a0e0e0c00042b2a1a3b0a0c0003221e3b2b1a090a0e0e0c0004502a3b1aae090e0e0e0c000303051a230a02943b2b291ac3090c00021ac5090e0e0c0002031729362b3c1abf090c0003292b25042504511e223b6502012a65291af9091afe090e0e0e0c000303041afb09103b503b502928403b1a5f090c00043b2d293b1a4d090e0e0c000303043b50022629352a362d2d2c1a88090e0c0004502c3c1a66090e0e0e0c0003292b2505250526031e32260351290202ac001ab3090c00025029653b22310e0e0e0c00021aa9092a2c22136b2212352213362214382215393b22380e0e0c00021a95092b306a2e353c1adc080e0c000303592e362f382a3b1a85090e0e0c00032a3b1a7b090c0003293b1a73090c0003293b1a73090c000303051a2b0902242928403b1aaa080e0e0e0c00042b3c2b3b2e1a5c090e0c000650291a2b090c00025029643b2d2b6a270602012e22342a452f463b472e482b492c4a2710029e3b222a0c00021a31092a2d220d6b3435220c36220d38220e393b22310e0e0e0c00021a1d092b306a2e353c1a3c080e0c000303592e362f382a3b1ae5080e0e0c00032a3b1adb080c0003293b1ad3080c0003293b1ad3080c000303051a8b0802242928403b1a0a080e0e0e0c00042b3c2b3b2e1abc080e0c000650291a8b080c00025029643b2d2b6a270602012e222d2a452f463b472e482b492c4a2709271e0fdd220e353c1ac1070e0e0c000307dc220e36220f372210387881443c28403b1aaf070c0004280b28403b1aa4070e0c0004293b401ae2070e0e0e0c0004503c28402b1a8c070e0c00043c28401a5a081a7f070c00043c2a2e2d6b2704053a0e00ff6d29353f1a61070e0e0c00030323403c1a3d080e0e0c00031a3d082a1a41080e0e0c00031a41081a46082b1a4a086b65103b503b502910040d002a2a1a41080e0e0c00035029362a372b382c392d23062e23072f230830230931230a32230c221923061a22082a316a221b23081a20082a316a221d230c1a1e082a0202b406306a221f3a2220230b02025c001a11082222220c6a1a1108221322132213221330220d2214220d322214220c220f680d22172227222722272d2227221c22272226122600010001000e0e0c000a22192228222822282e2228221d222822282228222722297b0c29000b220e353e1a79060e0e0c000307dc220e36220f372210387881443c28403b1a67060c0004280b28403b1a5c060e0c0004293b401a9a060e0e0e0c0004503c28402b1a44060e0c00043c28401a7a071a37060c00043c2a2e2d6b2704053a0e00ff6d29353f1a19060e0e0c00030323403c1af5060e0e0c00031af5062a1af9060e0e0c00031af9061afe062b1a02076b65103b503b502910040d002a2a1af9060e0e0c00035029372a382b23062c23082d23092e230a2f230c221623061a11072a306a221823081a0f072a316a221a230c1a0d072a306a221c3a221d230b221e391a05072220220d6a020295011a01071a0607221222122e31220e1a0307220e322215220d2210680d22162225222522252d2225222522252224122400010001000e0c000a7881473c28403b1a5a050e0e0e0c0004280b28403b1a4c050e0c0004293b401a8a050e0e0e0c0004503c28402b1a34050e0c00043c28401aaa061a27050c00043c2a2e2d6b2704053a0e00ff6d29353f1a09050e0e0c00030323403c1ae5050e0e0c00031ae5052a1ae9050e0e0c00031ae9051aee052b1af2056b65103b503b502910040d002a2a1ae9050e0e0c00035029372a382b230a1a51062b2b2e6b221a1a50062b1a54060e0c00042936221d3b2b1af7040c0004503b221f69222a23103b2a0e0e0c00023d2a69293b692d2a693b22330e0c00023b22330e0e0c0002220f353c1a75040e0e0c00030359220f362210382a3b1a1b050c00032a3b1a13050c0003293b1a0b050c0003293b1a0b050c000303051ac30402242928403b1a42040e0e0e0c00042b3c2b3b2e1af4040e0c000650291ac3040c00025029643b2d2b6a27060202220f222f2a451ab405463b472d482b492c4a27290fcf220e353b1af8030e0c000307d3220e3629352a362b372c382d392e3a2f23063023072213230b302a0c000264291af7030c00021af9030e0e0c000207cd2935293529372b382c6801323b2b1a01040e0e0c000450040600220e221e221e221e221e221e220f221e31221e221d0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68061a28052226693b22240e0e0e0c00020402002c220e2d221622272f22203022271aa0030e0c000a5029352a36220f373b2a1aff040c0003293b1a3f030c000303032b020f2b2a1af2040202f9020e0e0e0c000322163b2b1a7103020277020e0e0c00045022123722133a3b2b291a33030c00021a35030e0e0c0002031b29362b3c1a2f030202d5010c0003292b25042504511e263b6502012a652a2a1a14030e0c000322163a2a2a1a28030e0c00031a9104342c6a2a2a1a29030e0e0c0003221a372a2a1a84040e0c000322253b2b1af9020e0e0c000450221b372922282225223a1a6e040e0e0e0c000522263b2b1ad9020e0e0c000450291a5f040c0002293b1a77020c000303051aef0202903b2a291a8f020c00021a91020e0e0c0002031729362b3c1a8b020c0003292b25042504511e223b6502012a65291ac5021aca020e0e0e0c000303041ac702103b503b502928403b1a2b020c00043b2c293b1a19020e0e0c000303043b50022629352a362d2d2c1a54020e0c0004502c3c1a32020e0e0e0c0003292b2505250526031e32260351291a83020c000250296522203a22203a2a2a1aba030e0e0e0c000303032a0201293b223c0c00021aad032a2f2226221a22293068072224352225362226383b22420e0e0e0c00022228391a92032a306a2e353c1a91010e0e0c000303592e362f382a3b1a39020e0e0c00032a3b1a2f020c0003293b1a27020c0003293b1a27020c000303051adf0102242928403b1a5e010e0e0e0c00042b3c2b3b2e1a10020e0c000650291adf010c00025029643b2d2b6a270602012e223f2a452f463b472e482b492d4a272f02741a1b03311a0f020c0003291a18031a05020e0e0c00031a1503221b693e2b69291a23010c000203041a0b03103b503b50293b693b3b3b3b2d6805291a08010e0c000203041aef02103b503b5022193c2e342d1ae9020e0e0c0006501ae80222172a35452a36462a37472a38482a39492a3a4a2707270a0271220e36220f37221038220d230c1ac6022213220f2d6b1ac5022b2f2c1ac7020c00052d3b2b1ace000e0e0e0c000450293b1a72000e0e0e0c0003031a1aaf02220d2a35452a36462a37472a38482a39492a3a4a64021929352937220e2a35452a36462a37472a38482a39492a3a4a652706661f0a0e0e0000000000000000d80a0000000000000000000000000000|@8443,@8444,@8446,I251,I11,@8447,@8449,@6900,I105,I218,I106,@8455,@8457,I255,I107,@8618,@1385,@8620,@8626,I49,72057594037927935,I231,@3441,I47,@8628,@8630,I253,I113,I195,@8631,@8633,@8634,@243,@6963,@122,@14322,@596,@6964,@1571,@8636,@8637,@8638,@8639,@8643,@8645,@8647,@8648,@8649,@8650,@8654,@8656,@8661,@8666,@8668,@473,@1633,I48,@8679,@8680,@8686,@8688,@8690,@8692,@8697,I234,@8699,@8701,@8702,@7026,@8703,@1363,@6890,@6297,@8442,@6990,@7116,@6297| 8442:D5,96|00801a63005617693e2d69291a61000e0e0c000203041a5f00103b50293b693b3b3b3b2d6805291a46000e0e0e0c000203041a4300103b5056483c2e56792d1a3e00347b07070006000000000000000050000000000000000000000000000000|@8706,@8705,I105,@1363,@6890| 8443:S28|535452554354555245535f28292e73747275637456616c7565283829 8444:D3,80|0080560823082c2a0e0c000264291a47000c00021a49000e0e0c0002031729353b56370e0e0c00022968012b2a69296801270402013b6442000000000000000040000000000000000000000000000000|@8445,I105,I218| 8445:S39|535452554354555245535f28292e73747275637456616c756528382974797065456e762d283129 8446:D3,80|00805608230c2c2a0e0c000264291a47000c00021a49000e0e0c0002031729353b56370e0e0c00022968012b2a69296801270402013b6442000000000000000040000000000000000000000000000000|@8445,I105,I218| 8447:D3,88|00802b352c362d372e382f392d2d2d2d2d680556680c000256673b1a42000e0e0e0c00032a2a6956873b2b1a3a000e0e0e0c0004502b2708420e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@8448,I253,I255| 8448:S52|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e744d616b65547970654964283129 8449:D2,40|00801a2b005617562856396b420e0e0e000000000000000018000000000000000000000000000000|@8451,@8450| 8450:D9,160|00802b56191aa0000e0c0003030a2b56172c0e0e0e80000256083b1a92000e0e0e0c000329291a8f000c00021a91000e0e0c0002033829352a362a3629353b1a86000e0e0e0c000303043b5002041a7f0010293829321a7f000c00036503052a68010207292503511e433b6502013b64293b1a53000c000303041a6300103b50293565420e0e0e0e000000000000000090000000000000000000000000000000|@8453,I234,I253,I105,I218,I251,@8452,I113,@1792| 8451:S51|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129 8452:O4|11,@49,0,@8454 8453:S54|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129283129 8454:O5|@8409,1738,0,1738,0 8455:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8456,@6791| 8456:S57|535452554354555245535f28292e73747275637456616c75652838296d61746368416374696f6e737c6d61746368526573756c74732d283129 8457:O1|@8458 8458:D23,376|008833373439220c3a2b3b1a72010e0e0e0c000303043b5002041a6b01103b50220d36291a69011a56010e0e0e0c000303033c0222291a5f010c00021a61010e0e0c00020310293b1a45013b28131a57010c000602013b6403051a5301020d220d2b2b3b220c1a4f010c0006220d37220e39220f3a1a4801220d2d2c6b22112c2c2f2d1a32010e0e0e0c0006293a2a372b3a3b2b291a00010e0c00021a01010e0e0c0002031729362b3c1a1b010c0003292b25042504511e233b6502012a652a2a1a04010e0c0003292e1a03010c0003293b1a03010c000303033c020b291aff001a04010e0c000303041a0301103b503b50293c1ad1000e0e0c00032928403b1af5000e0e0c0004293b2d1af2000e0e0e0c0004501af0002a326a1af2002b336a220f341af100221c221f221f220f321aed000e0e0c00092210220c1ad9002e221e22212221221f221e1adb000c000a22182c452a4627151f090e0e0e0e0e0e000000000000000068010000000000000000000000000000|@8460,I251,@8461,@6305,I105,I218,I154,@6297,@8464,@8479,I106,I107,I234,72057594037927934,I231,@1603,I11,I255,@8481,@8483,I48,@8485,@8459| 8459:O1|@8543 8460:S26|535452554354555245535f28292e6d6174636853696773283729 8461:O4|@14322,@596,@8463,@8462 8462:O5|@8409,1030,0,1030,0 8463:S48|43616e646964617465207374727563747572652077697468206e6f6e2d656d70747920626f756e64204944206c697374 8464:O1|@8465 8465:D21,320|00842f35303631387881473c28403b1a36010e0e0e0c0004280b28403b1a28010e0c0004293b401a26010e0e0e0c0004503c28402b1a10010e0c00043c28401a16011a03010c00043c2a2e2d6b270405380e00ff6d29353f1a05010e0e0c00030323403c1a01010e0e0c00031a01012a1a05010e0e0c00031a05011a0a012b1a0e016b65103b5029101a0c012a691a0f012b691a12012c69292c2c6a302a220f3b1a0c01220f3b1a0e010e0e0e0c00082e353c1aaa000e0e0e0c000303592e362f382a3b1af9000e0e0c00032a3b1aef000c0003293b1ae7000c0003293b1ae7000c000303051ae70002242928403b1a56000e0e0e0c00042b3c2b3b2e1ad8000e0c000650291ad7000c00025029643b2d2b6a270602012e2932220f33221022136806270a1f050e000000000000000030010000000000000000000000000000|@8467,I11,I255,@8468,I251,@243,@6963,@122,@14322,@596,@6964,@8470,@8474,@8466,I48,@7226,I253,I113,I49,I195,I47| 8466:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@8472,@14310,@1578,I251,@8477,@1597| 8467:S22|434f5049455228292e7265706c6163654d6170283529 8468:O1|@8469 8469:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8470:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@8472,@14314,@1578,I251,@8471,@1597| 8471:O1|@8473 8472:S32|434f5049455228292e7265706c6163654d6170283529747376456e762d283129 8473:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14314,I251,@8471| 8474:D6,96|00802b352c361a5f0028452b3b6b56372c1a5c000e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c00036456572e2b1a4c00330e0e7b050800040e0e0e0e000000000000000050000000000000000000000000000000|@8472,@14325,@1578,I251,@8475,@1597| 8475:O1|@8476 8476:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14325,I251,@8475| 8477:O1|@8478 8478:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14310,I251,@8477| 8479:D7,136|00802b56191a88000e0c0003030a2b56172c0e0e0e8000022b56191a7a000e0e0e0c000356182a2a1a75000e0e0c00021a75000e0e0c000203043b5002041a6f00102a352b362b3b1a6d000e0e0c000303032a02172b3c1a3e000e0e0e0c00032a2a2505250526031e413b642705420e000000000000000078000000000000000000000000000000|@8480,I234,I107,I105,I218,@611,I113| 8480:S42|535452554354555245535f28292e6d61746368536967732837297461726765742d6e65774d6170283129 8481:D7,120|00802b56181a78000e0c000303033b024b2b56181a71000e0e0c0003293b1a5f000c000303033c021456173b1a61000e0e0c00032a2a1a5f000c00036403041a5e00103b50293c1a5e000e0e0e0c000356272a1a3a002f0e7e050003420e0e0e000000000000000068000000000000000000000000000000|@8482,I234,I107,I253,I231,@1586,I106| 8482:S39|535452554354555245535f28292e6d61746368536967732837296c6f6f6b757054797065283129 8483:D9,120|00802b56181a78000e0c0003293b1a77000c000303033c021456173b1a71000e0e0c00032a2a1a6f000c00036403041a6e00103b50293c1a6e000e0e0e0c000356272a1a4a000e0e0e0c0003293b1a5f000c000303051a5f000202293566420e000000000000000068000000000000000000000000000000|@8484,I107,I234,I253,I231,@1586,I106,I251,@6119| 8484:S39|535452554354555245535f28292e6d6174636853696773283729726573756c7454797065283129 8485:O1|@8486 8486:D9,120|00873236291a78001a7d000e0e0c000303033c0222291a77000c00021a79000e0e0c00020310293b1a55003b28131a6f000c000602013b6403033b021f31351a660031220c3232220d33331a620068092a3b2b1a6200307b050c00041f080e0e000000000000000068000000000000000000000000000000|@8488,@6305,I251,I105,I218,I154,@8487,@8485,@1633| 8487:D4,96|00822c2c2a1a60000e0c00021a61000e0e0c0002032c2a352b36312b2d56775688569956aa56bb56cc56dd56ee1a48000e0c000c2a2a2505250526031e383b6602012965440e0e0e000000000000000050000000000000000000000000000000|@1636,I105,I218,@8489| 8488:S39|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329 8489:O1|@8490 8490:D27,1160|008a3435291a88041a8d040e0e0c00036407cf34351a78041a7d040e0e0c000303043b5002041a7704103b50343729352a361a7304220d69220c352922121a6f040c0003291a70040e0c00021a71040e0e0c00020358293529291a5b040c00021a5d040e0e0c0002034029352a362a35291a1c041a21040e0e0c00036403212a351a0c041a11040e0e0c000303043b5002041a0b04103b502a37296801640207292503511e4b3b6502013b6502013b293b1ae4030e0c000303162f2d22122211221122111a0104220f0e0e7b08140007293529352a363137293629353c1ab803020281020e0c000364031429362936291add031aa2030e0e0e0c00036502013b641abc030e0c000207d93137293629353b1a84030e0c0003036729382d372a22131ab4030e0c000303043b5002502a22131aac030e0c00032a68012a3b1a98030e0c000303033c021422133b1a99030e0e0c00032b2a1a97030c00036403041a9603103b503b502a3c1a94030e0c000322142a2c1a91030e0e0c000426045102023b503337293629353c1a0b030c000303042937024129353b1afc020e0c000303042936023129363b2a291a0a030e0e0e0c00021a09030e0e0c0002031729362b3c1a3b030c0003292b25042504511e253b6502012a662f37293629353c1ab70202027b010c000303042937024129353b1aa4020e0c000303042936023129363b2a291ab2020e0e0e0c00021ab1020e0e0c0002031729362b3c1ae3020c0003292b25042504511e253b6502012a662c2a1adc020e0c000327061a83020c0002031a2d220c1ad0023422192218221822181acc0222160e7b0a190009321a58020e0c00021a59020e0e0c00021a51020e0e0c00021a49020e0e0c0002031c2b1a36020e0e0e0c00021a35020e0e0c00021a2d020e0e0c000202013b031b2d220c1a85023422192218221822181a710222160e0e7b0a1900093337293629353d1ad6010e0e0e0c0003651af4010e0c0002036b3337293629353d1abc010e0c000303041a4b02103b503b5029353b1aa8010e0c00030322293729353c1a9a010e0e0e0c0003030d2936293b1adb010c0003640202293664020d2936293b1ac9010e0e0c0003646503122c1a0c020e0c00021a8d010e0e0c000202013b02013b031c2d220c1afa013422192218221822181ace0122160e0e0e7b0a1900093b6502013b270a0fd63435291add011a2a010e0e0e0c00036407d134351acc011a19010e0e0c000303043b5002041a1301103b503437323529220f1a16010e0e0e0c0003291a14010e0c00021a15010e0e0c00020358293529291aff000c00021a01010e0e0c0002034029352a362a35291a78011ac5000e0e0c00036403212a351a68011ab5000e0e0c000303043b5002041aaf00103b502a37296801640207292503511e4b3b6502013b6502013b293b1a88000e0c000303162c1a3601220f220e220e220e1aa300220c7b08110007293529372e37220c22141a1f0102022c000c000329282e1a120102021e000e0e0e0c00032c2c2b22152214221422132213221322130e0e7b0a1600093b1f0b0e0e0e0e0e000000000000000078040000000000000000000000000000|@8492,@14314,I251,@1576,@8493,@1578,I105,I218,@8504,@14348,I234,I107,I253,I231,@1614,I106,I255,I113,@8521,@8523,@8526,@1377,@8528,@8539,@14325,@8491,@122| 8491:O1|@8541 8492:S42|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329 8493:D4,56|008056071a39000e0e0c00022c2a1a37003b1a3b00300e7b060400050e0e0e0e000000000000000028000000000000000000000000000000|@8495,@8496,@8494,@1316| 8494:O2|@8500,@8499 8495:S56|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c617954797065283129 8496:O1|@8497 8497:D8,232|00802b230d29291ae6000e0e0e0c00021ae5000e0e0c0002032429352a362a35291adc001ae1000e0e0c00036403052a68010207292503511e323b6502013b64293b1ac3000c000303691ac300291a9f000c00021aa1000e0e0c0002032429352a362a35291a98001a9d000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a7f000c000303041a8700103b50293529351a65001a6a000e0e0e0c000303043b5002041a730010293765021a293529351a46001a4b000c000303043b5002041a57001029376465420e0000000000000000d8000000000000000000000000000000|@8498,I105,I218,@14398,I251,@2781,@2836,@1576| 8498:S27|535452554354555245535f28292e6572726f724465707468283129 8499:O1|@8503 8500:O1|@8501 8501:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8502| 8502:S58|535452554354555245535f28292e6d61746368536967732837296d617463684e616d65732833292833297072696e7454797065456e762d283129 8503:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8502| 8504:O1|@8505 8505:D15,224|00852b1ae2001ae7000c000303033c02222b1ae3000c00021ae5000e0e0c000203102b3b1ac1003b28081adb000c000602013b0304282e020b1ad4002c1ad8000e0c00031ad9002a1acd000e0e0c00033e2a69291aa1000e0e0c000203041ac700103b5033330e0e0e0c0002293b691abe002a691ac1002a693b3e3b3b2d6805291a74000e0c000203041a9b00103b50291aac00691ab0002a69302a693b3e3c3b2d6805291a50000e0c000203041a7700103b5022113c221222122d1a910022130e0e7b071400060000000000000000d0000000000000000000000000000000|@8507,I48,I251,I105,I218,I154,@8508,@122,@8509,@1363,@871,@8510,@8506,@871,@6890| 8506:O2|@871,@8512 8507:S36|535452554354555245535f28292e7369675374727563744d697373696e674d7367283629 8508:S18|20696e207375622d73747275637475726520 8509:S34|53747275637475726520646f6573206e6f74206d61746368207369676e6174757265 8510:O2|3,@8511 8511:S10|5369676e61747572653a 8512:O2|@8513,0 8513:O5|0,3,0,0,@8514 8514:O2|@8516,@8515 8515:O2|@871,@8518 8516:O2|3,@8517 8517:S10|5374727563747572653a 8518:O2|@8519,0 8519:O2|3,@8520 8520:S11|4e6f742070726573656e74 8521:O2|3,@8522 8522:S47|54797065732074616b6520646966666572656e74206e756d62657273206f66207479706520617267756d656e74732e 8523:O1|@8524 8524:D20,320|00872b1a42011a47010c000303033c02222b1a43010c00021a45010e0e0c000203102b3b1a21013b28081a3b010c000602013b0304282e020b1a34012c1a38010e0c00031a39012a1a2d010e0e0c00033e2a69291a01010e0e0c000203041a2701103b5034330e0e0e0c0002293b691a1e012a691a21012a693b3e3b3b2d6805291ad4000e0c000203041afb00103b502211220f0e0c0002293b691a02012a691a05012a693b3e3b3b2d6805291aa8000e0c000203041acf00103b5022143b691aed002a691af0002a693b3e3b3b2d6805291a83000c000203041aab00103b50293b691ada002a692f2a691ada002a69220d2a691ad9002a6922142a693b3e3c3b2d6805291a50000e0c000203041a7700103b50221e3c221f221f2d1ab90022200e0e7b07230006000000000000000030010000000000000000000000000000|@8525,I48,I251,I105,I218,I154,@8508,@122,@8509,@1363,@871,@8510,@871,@8516,@871,@7193,@871,@871,@871,@6890| 8525:S34|535452554354555245535f28292e7369675374727563744d617463684d7367283829 8526:O2|3,@8527 8527:S35|5479706520696e20737472756374757265206973206e6f742061206461746174797065 8528:O2|@8529,@1720 8529:D12,288|00802b37293629353d1a1c010e0c00036503952b352c37293629353c1a09010e0e0c000303042937024129353b1af8000e0c000303042936023129363b2a291aee000e0e0e0c00021aed000e0e0c0002031729362b3c1ae7000c0003292b25042504511e253b6502012a66291ad9001ade000e0e0e0c0003291adc000e0c000228052a30343b6805291ad4001ad90056a70c0004293c1a8f000c0003641a9800330e0e0e7d0a00022b37293629353d1a76000e0e0e0c000303041ab300103b503b5029353b1a60000e0c00030323293729353c1a52000e0e0e0c0003030e2936293b1a9300310e0e7e070003293664020f2936293b1a8000300e0e0e7e06000365420e0e0e0e0e0e000000000000000010010000000000000000000000000000|@8531,I251,I105,I218,I106,@8532,@1385,@8534,@8536,@8530,@1377,I253| 8530:O1|@8538 8531:S30|545950455f5452454528292e7065726d697473457175616c697479283129 8532:O1|@8533 8533:D4,48|00803c28401a30001a35000e0e0c0004291a34006964420e000000000000000020000000000000000000000000000000|@1384,@588,I11,79992| 8534:O1|@8535 8535:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@8534| 8536:O1|@8537 8537:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 8538:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@7060| 8539:O2|3,@8540 8540:S41|5479706520696e20737472756374757265206973206e6f7420616e20657175616c6974792074797065 8541:D5,88|00802b353e2a69291a55000e0e0c000203041a5300103b50293b691a52002a691a55002a693b3b3b3b2d6805291a30000e0c000203041a2f00103b5029270642000000000000000048000000000000000000000000000000|@8542,I105,@1363,@2241,@2206| 8542:S61|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c6179537472756374757265283129 8543:D11,168|00883336291aa8001aad000e0e0c000303033c0222291aa7000c00021aa9000e0e0c00020310293b1a85003b28131a9f000c000602013b6403033b024b32351a9600220c333333333322101a9200220c680a2a3b2b1a90000e0c00041a910030346a220d351a9000221032220f220f220d30221122112216680a2a2d2b1a6800340e0e7b051100041f090e0e0e0e0e0e000000000000000098000000000000000000000000000000|@8545,@6305,I251,I105,I218,I154,@8546,@8459,@1633,@8589,@8544| 8544:D4,104|00822c2c2a1a68000e0c00021a69000e0e0c000203302a352b36312b2d56775688569956aa56bb56cc56dd56ee56ff1a4e000e0e0e0c000d2a2a2505250526031e3c3b6602012965440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1636,I105,I218,@8592| 8545:S38|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329 8546:D4,104|00822c2c2a1a68000e0c00021a69000e0e0c000203302a352b36312b2d56775688569956aa56bb56cc56dd56ee56ff1a4e000e0e0e0c000d2a2a2505250526031e3c3b6602012965440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1636,I105,I218,@8547| 8547:O1|@8548 8548:D10,632|008b220c35291a77021a7c020e0c00036407ce220c351a67021a6c020e0c000303043b5002041a6702103b50220c3734352922101a61020e0e0c0003291a60020e0c00021a61020e0e0c00020358293529291a4b020c00021a4d020e0e0c0002034029352a362a35291a14021a19020e0e0c00036403212a351a04021a09020e0e0c000303043b5002041a0302103b502a37296801640207292503511e4b3b6502013b6502013b293b1adc010e0c00030304220f028a2935292e2210221022102210221022101ae7010c00095029362e362a2a22142b1ac7010c00021ac901020261000e0e0c000203142a1ab2010e0e0e0c00021ab1010e0e0c000202013b033c2b352c362c352d362c382b3729353b1a75010e0e0c0003031029363d3d2d326b2a2a692933696602012f2e2d2b250a250a250a26071e613b2707020129270627040fd0220c35291a6d011a3a010e0e0e0c00036407d8220c351a5b011a28010e0c000303043b5002041a2301103b50220c3734352922101a1d010e0e0c0003291a1c010e0c00021a1d010e0e0c00020358293529291a07010c00021a09010e0e0c0002034029352a362a35291a08011ad5000e0e0c00036403212a351af8001ac5000e0e0c000303043b5002041abf00103b502a37296801640207292503511e4b3b6502013b6502013b293b1a98000e0c00030304220f025c293529372e373422151aba000e0e0e0c000329282e1aae00020245000e0e0e0c00032c2c2b2215221522152215221522132215020229000c000a323629353b1a4c000e0c0003031029363b2c326a2a2a6929221a696602022216270727040201341f0c0e0e0e000000000000000068020000000000000000000000000000|@8550,@14314,I251,@1576,@1578,I105,I218,@8549,@14325,@122| 8549:O1|@8551 8550:S56|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d6174636853747275637475726573283329 8551:D15,640|008732353336333534362c352b352c37293629353c1a70020e0c000303042937024129353b1a60020e0c000303042936023129363b2a291a56020e0e0e0c00021a55020e0e0c0002031729362b3c1a4f020c0003292b25042504511e253b6502012a66291a41021a46020e0e0e0c00031a45022211693337293629353c1a08020e0c000303042937024129353b1af8010e0c000303042936023129363b2a291aee010e0e0e0c00021aed010e0e0c0002031729362b3c1ae7010c0003292b25042504511e253b6502012a663437293629353c1ab3010c000303042937024129353b1aa4010e0c000303042936023129363b2a291a9a010e0e0e0c00021a99010e0e0c0002031729362b3c1a93010c0003292b25042504511e253b6502012a662c2a1a9c010e0c000327061a6b010c000203033b0fdc28052b31220d3b680528052c31220c3b68052a2a221622161a78010e0c000529353c1a2e010e0e0e0c000303c9331a2a010e0e0e0c00021a29010e0e0c00021a21010e0e0c000203033b02a83b220d291a08010e0c00021a09010e0e0c0002031729362b3c1a03010c0003292b25042504511e233b6502012a653b220c291ada000e0e0e0c00021ad9000e0e0c0002031729362b3c1ad3000c0003292b25042504511e253b6502012a652a2a1aec000e0c00036503033b023b220c291a9c000e0c00021a9d000e0e0c0002032529352a362a220e220e221a221a02024e00221a1ac0000e0c000750292503511e313b6502013b64023529362215221322141aaa001aaf000c00052a2a0e0e0e0c000264221922192b31221a221a221a22191a9a00221a0e0e0e7b0a1a000966270b1f080e0e0e000000000000000070020000000000000000000000000000|@8553,I251,I105,I218,I106,@8554,@1385,@8557,I113,@8565,I232,@8582,@8552,@7172,@8523| 8552:S5|6d61746368 8553:S33|535452554354555245535f28292e636865636b54797065436f6e73747273283829 8554:O1|@8555 8555:D4,56|00803c28401a38001a3d000e0e0c000428062a1a3a006a64420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@8556,@588,I11,79992| 8556:S42|535452554354555245535f28292e636865636b54797065436f6e7374727328382974766172732d283129 8557:D4,56|008056071a39000e0e0c00022c2a1a37003b1a3b00300e7b060400050e0e0e0e000000000000000028000000000000000000000000000000|@8559,@8496,@8558,@1316| 8558:O2|@8561,@8560 8559:S52|535452554354555245535f28292e636865636b54797065436f6e737472732838296572726f72496e44617461747970652d283129 8560:O1|@8564 8561:O1|@8562 8562:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8563| 8563:S49|535452554354555245535f28292e636865636b54797065436f6e737472732838297072696e7454797065456e762d283129 8564:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8563| 8565:O1|@8566 8566:D11,120|00831a7b002d691a7e002a692f1a80002b1a84000e0c0004040200321a81002b1a85000e0e0c00045029352a36291a7f000c00022b2e1a7f000c0003291a80000e0c00021a81000e0e0c0002030829353b2a696402033c2f6927081f040e0e0e000000000000000068000000000000000000000000000000|@8568,@8569,@8571,@8578,@1416,@8567,@1414,@7142,@1326,I105,I218| 8567:O1|@8581 8568:S27|535452554354555245535f28292e6d617463685479706573283429 8569:D2,56|00802b3629353b1a36000e0e0e0c0003030a29382956372e7d0500023b64420e000000000000000028000000000000000000000000000000|@8570,I251| 8570:S36|535452554354555245535f28292e6d617463685479706573283429636f70794964283129 8571:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@8573,@8574,@8572,@1551| 8572:O1|@8577 8573:S45|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129 8574:O1|@8575 8575:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8576| 8576:S48|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129283129 8577:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8576| 8578:O1|@8579 8579:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@8580| 8580:S43|535452554354555245535f28292e6d617463685479706573283429636f7079546172676574283129283129 8581:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 8582:O1|@8583 8583:D13,256|0085303530291aff000c00021a01010e0e0c0002036d29352a362a35292e1af7000c000303033c024a291adb000c00021add000e0e0c000203142d1aca000e0e0e0c00021ac9000e0e0c000202013b0321293b2f3b2808321ac5000e0e0c00021ac5000e0e0c00031ac5000e0e0c000602013b6403033c0207292503511e783b6502013b6403033b025a291aaa00691aae002a69312a691aae002a69661ab0000e0c00023e2a69291a5d000e0e0c000203041aa300103b50293b693b3b3b3b2d6805291a42000e0e0e0c000203041a8700103b50323c33332d1a8400220c0e7b070d0006641f060e0000000000000000f0000000000000000000000000000000|@8585,I105,I218,I251,I223,I239,I154,@8586,@8588,@8584,@104,@1363,@6890| 8584:S30|4572726f72207768696c65206d61746368696e6720646174617479706520 8585:S48|535452554354555245535f28292e636865636b54797065436f6e73747273283829636865636b436f6e73747273283129 8586:O2|@8587,0 8587:S55|207761732070726573656e7420696e207468652073747275637475726520627574206e6f7420696e20746865207369676e61747572652e 8588:S14|3a20636f6e7374727563746f7220 8589:D21,576|00802b352c382d3929291a3b020c00021a3d020e0e0c0002031f29352a362a353b1a34020e0c000303052a68010207292503511e2a3b6502013b64291a09020e0e0c00021a09020e0e0c00020311293529353b1a02020e0e0e0c00036402013b031e293529363b2a69291adb010c000203041aeb01103b503b50293b696602013b3e2e69291ac0010e0c000203041ad701103b503b50293b693b3b3b2e2d6805291aa4010e0c000203041abb01103b503b503336293b1a9f010c0003039d301aae010e0e0e0c000229353d1a8a010e0e0e0c0003030829362968016402013b291a65010e0e0c00021a65010e0e0c0002033c293556c81a7f010c00023b1a80010e0c00022b2b2b121200010001003b1a76010e0e0e0c0006293b691a72012a691a75012a691a78012a69270702013b2d2a691a73012a691a76012a693b3b3b3b2d6805291a01010e0e0c000203041a1701103b503b5029270702ca291ae9000e0e0c00021ae9000e0e0c0002035d56981a05010e0e0c00023b1a04010e0c0002322b2b56e73b1aff000c0006293b691a26012a691a29012a691a2c012a69312a691a2c012a691a2f012a693b3b3b3b2d6805291a92000e0e0e0c000203041aa700103b503b5029270b025a56981aa8000e0c00023b1aa8000e0c0002322b2b56e73b1aa3000c0006293b691aca002a691acd002a691ad0002a69312a691ad0002a691adb002a693b3b3b3b2d6805291a36000e0e0e0c000203041a4b00103b503b5029270b270942000000000000000030020000000000000000000000000000|@8591,I105,I218,I251,@1363,@1363,@1435,@8496,@1330,@1469,@2241,@1457,@2242,@2241,@2239,@871,@2205,@901,@2241,@8590,@6650| 8590:O2|3,@2238 8591:S53|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329646973706c617956616c7565283129 8592:O1|@8593 8593:D26,720|008b220c35291acf021ad4020e0c00036407ce220c351abf021ac4020e0c000303043b5002041abf02103b50220c3729362a372b38220e352922131ab2020e0e0e0c0003291ab0020e0c00021ab1020e0e0c00020358293529291a9b020c00021a9d020e0e0c0002034029352a362a35291a64021a69020e0e0c00036403212a351a54021a59020e0e0c000303043b5002041a5302103b502a37296801640207292503511e4b3b6502013b6502013b291a45020e0e0c00021a45020e0e0c000207dc293529362a383c28403b1a39020e0e0c0004293b1a37022217691a39020202cc010e0e0c000450323b1af2010e0e0e0c000303162b3b1ae5010e0e0c000303051a1b0202031a1e02025a321ae8010e0c00021ae9010e0e0c0002031e2b1ad6010e0e0e0c00021ad5010e0e0c000203051afb0102031afe01022a2b3b1a9f010c000303051af701021b2b1aa9010e0e0c00021aa9010e0e0c000203051ae70102031aea0129353b1a74010e0c000307cd29362c33221722171adb010c000529353b1a5a010e0e0e0c0003033c29362216221622171ac7011acc010202f4000e0c00052a2a0e0e0e0c0002643122102b2218221b2219221922191ab2010e0e0e0c000950221b6502a62936303a291a26010e0e0e0c00021a25010e0e0c0002031429352936293b3c1a2c010e0c0004503b260302023b50312306291af9000e0e0c00021af9000e0e0c0002033c29350402002d1a61012b1a65010e0e0c00045029352a36291a5f010c00022d3b1a5f010c00032c2a692f3b2b1adb00020232000c0004503b260802023b50220e353b1a8d000e0e0c00030313220e363d2f2e220d6b2a2a6929222069660202221c6665021d29362e220d2b221522182216221622161aea000e0e0e0c000950221864270502172f220d2210220e220e220e1af6000e0e0e0c000750221227070201341f0c0e0e0e0e0e0e0000000000000000c0020000000000000000000000000000|@8595,@14310,I251,@1576,@1578,I105,I218,I11,@8596,I255,@1161,@8611,@1161,@8614,@541,@473,@1161,@8565,@8552,@7172,@8523,@8594,@1414,@7142,I253,@8504| 8594:O1|@8617 8595:S57|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d617463684c6f63616c56616c756573283329 8596:D17,536|00802b363c1a18020e0c000303051a17020fdd2b3529353b1a15020e0e0c00036407df2b3529362d363c1a0b020c00032a2a6956473b1a07020c00032a2a0e0e0e0c00026429353b1ae5010e0e0c000303932939291af0010e0c00021af1010e0e0c0002035f29361add010e0e0c00021add010e0e0c000203482935353e1aaf010c000303312935362928281aa1010e0e0c000303033c021b29287b1a91010e0e0c000303033c020b29285b1a81010e0e0c00036402013b1a95010e0e0c000202013b02013b03192a1a8c01691a90012a691a93012a693b3e3c3b2d68056602012a64020129293b691a84012a6902020a011a83012a693b3c3b3b2d680527090fdd00002b363c1a16010e0e0e0c000303051a6b010fdd2b3529362d363c1a17010c00032a2a691a5e013b1a12010e0e0e0c00032a2a0e0e0e0c00026429353b1aed000e0e0c000303932939291af8000e0c00021af9000e0e0c0002035f29361ae5000e0e0c00021ae5000e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1a9d000e0e0c000202013b02013b03192a1a9400691a98002a691a9b002a693b3e3c3b2d68056602012a64020502021b0029293b691aa8002a691aab002a693b3c3b020206003b2d68052709420e0e0e000000000000000008020000000000000000000000000000|@8598,I234,@1338,I251,I107,I253,I105,I218,@900,@901,@873,@871,@8599,@1338,@14454,@871,@8597| 8597:O5|0,0,0,@8601,@8608 8598:S15|7072696e742d6d6174636854797065 8599:O5|0,0,0,@8601,@8600 8600:O2|@8604,0 8601:O2|@8602,0 8602:O2|0,@8603 8603:O5|@8409,1261,1261,0,0 8604:O2|3,@8605 8605:S4|49734f4b 8606:O1|@8607 8607:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8608:O2|@8609,0 8609:O2|3,@8610 8610:S7|497357726f6e67 8611:O2|1,@8612 8612:O2|3,@8613 8613:S25|56616c7565206973206e6f7420616e20657863657074696f6e 8614:O2|1,@8615 8615:O2|3,@8616 8616:S26|56616c7565206973206e6f74206120636f6e7374727563746f72 8617:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 8618:D2,48|00802b56181a30000e0c000356172c0e0e8000020e0e0e0e000000000000000020000000000000000000000000000000|@8619,I106| 8619:S44|535452554354555245535f28292e73747275637456616c7565283829725369672d736f75726365732d283129 8620:O1|@8621 8621:D9,216|00822d1ada000e0e0e0c00021ad9000e0e0c000203a12d352e362a3629353b1ace000e0e0e0c000303043b5002041ac700103b5029362a392d37293529341abf006a303629353d1aa6000e0e0e0c000303041ab300103b503b5029353b1a90000e0c00030322293729353c1a82000e0e0e0c0003030d2936293b1a93000c0003640202293664020d2936293b1a81000e0e0c0003642f3b2b312f680565340e0e0e0c000230220d220d1a6c000e0c00042a2a69270a02013b440e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@1399,I105,I218,I251,@8623,@8622,@1377,I253,@8620| 8622:S29|437265617465642066726f6d206f7061717565207369676e6174757265 8623:O4|@14322,@596,@8625,@8624 8624:O5|@8409,1765,0,1765,0 8625:S9|4e6f7420426f756e64 8626:O1|@8627 8627:D7,120|00812c3b1a79000e0e0c000303172b3b1a6d000e0e0c000303043b5002041a6700103b02342c352d362d1a63000c00021a65000e0e0c000203043b5002041a5f00102d352e362a2d692c2b1a5a000e0e0e0c00032a2a692706430e0e0e0e0e0e000000000000000068000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@8626| 8628:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@8629,I234,I107,I105,I218,I15,I247,@599,I253| 8629:S42|535452554354555245535f28292e73747275637456616c7565283829725369672d6f6c644d6170283129 8630:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8631:D2,64|008056093a2c2a1a3e000e0e0e0c00036403092b56172c0e0e8000022b56182c0e8000020e0e0e0e000000000000000030000000000000000000000000000000|@8632,I234| 8632:S46|535452554354555245535f28292e73747275637456616c7565283829725369672d6d617463686564496473283129 8633:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8634:O1|@8635 8635:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8636:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8637:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8638:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8639:D3,80|00803b56180c0002561723093b2a0e0e0e0c000264293b1a3e000e0e0e0c000303032a020b2a2a1a36002f0e7e05000365420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@8641,I251,@8640| 8640:O1|@8642 8641:S40|535452554354555245535f28292e73747275637456616c75652838296c6f63616c456e762d283129 8642:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8640| 8643:O1|@8644 8644:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8641| 8645:O1|@8646 8646:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8647:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8648:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8649:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8650:D3,80|00803b56180c0002561723093b2a0e0e0e0c000264293b1a3e000e0e0e0c000303032a020b2a2a1a36002f0e7e05000365420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@8652,I251,@8651| 8651:O1|@8653 8652:S38|535452554354555245535f28292e73747275637456616c75652838296e6577456e762d283129 8653:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8651| 8654:O1|@8655 8655:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8652| 8656:O1|@8657 8657:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@8652,@8658| 8658:O4|@14322,@596,@8660,@8659 8659:O5|@8409,1568,0,1568,0 8660:S23|5369676e617475726520696e2053747275637420456e64 8661:O1|@8662 8662:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@8652,@8663| 8663:O4|@14322,@596,@8665,@8664 8664:O5|@8409,1569,0,1569,0 8665:S21|46756e63746f7220696e2053747275637420456e64 8666:O1|@8667 8667:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8668:D4,88|00822c2c2a1a58000e0c00021a59000e0e0c000203242a352b36312b2d5677568856991a4a000e0e0e0c00072a2a2505250526031e303b6602012965440e0e0e000000000000000048000000000000000000000000000000|@1636,I105,I218,@8669| 8669:O1|@8670 8670:D10,592|00852e352f363135291a4c021a51020e0e0c00036407db31351a3c021a41020e0e0c000303043b5002041a3b02103b50313729352a36291a36020e0e0e0c00021a35020e0e0c00021a2d020e0e0c00020310220c2c69330e0e0c0002502d2d6902ca2d2d693b2a690402002c2b2a1aff010c00021a01020e0e0c000203542a352b362a352b362c382d392e3a2f23063135323629352a363b2b6933332b343434346807292f692d3c1ad5010e0e0c00033d3d220d22126b2f2a692930692c2a692e2a6922132a2517251726151e5f26150209292c2a35452a3646515129352a362f35303731362b2a2c6a2e3b2a1a800102023b000e0c00021a7d010e0e0c000203152a352b362a2c692a2a2505250526031e253b66020129652a2a6922172a696522130e0e0c0002502d2709660fd73135291a53011a28010e0c000364035a31351a44011a19010e0e0c000303043b5002041a1301103b50313729382a37291a2e010e0e0e0c00023b2f69220e2a2d2f6b220f2a6965330e0e0c0002502e3c1afe000e0e0e0c00033b2b2f6a302a692931692c2a69270802983135291af9001abe000e0e0e0c000364038331351ae8001aad000e0e0c000303043b5002041aa700103b503137293729353e1a92000e0e0e0c00030310342b69300e0e0e0c0002502c2c6902452a362b382c392d3a2e23063b326922112f2b30303030680722122a69220e020229000e0c000250333c1a6e000e0e0e0c00033d3d31220c6b220c2a6929220d692c2a69270b6502032a2a69651f060e0e0e0e000000000000000040020000000000000000000000000000|@8672,@14314,I251,@1576,I105,I218,I106,@14325,@8671,@14310| 8671:O1|@8673 8672:S40|535452554354555245535f28292e73747275637456616c7565283829656e7465724974656d283329 8673:D4,48|00802b351a31001a3600692a3b2b1a3700300e7b05050004000000000000000020000000000000000000000000000000|@8675,@8674,@8671,@1633| 8674:D4,88|00822c2c2a1a58000e0c00021a59000e0e0c000203202a352b36312b2d56771a4e000e0e0e0c00052a2a2505250526031e2c3b6602012965440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1636,I105,I218,@8676| 8675:S32|535452554354555245535f28292e6d616b65436f7079416374696f6e73283129 8676:O1|@8677 8677:D8,320|00832d35291a40011a45010e0e0c00036403432d351a30011a35010e0e0c000303043b5002041a2f01102d37293629353b1a1c010e0c0003031829362b372f0e0e0c00023b2a2e6a2b2a69293369270402012e6502cd2d35291a04011af1000e0e0c000364033e2d351af4001ae1000e0e0c000303043b5002041adb00102d37293729353b1ac8000e0c0003031329362b383d3d2b2f6b2b2a69293369270402012e65027e2d35291abd001aa2000e0e0e0c000364036b2d351aac001a91000e0e0c000303043b5002041a8b00102d372936292f2a1a98000e0c00021a99000e0e0c000203372a352b362a3729353b1a5e000e0e0e0c0003031329362c383d3d2b306b2b2a69293169270402012c2b2a2506250626041e423b2704020129270402012c1f040e0e0e000000000000000030010000000000000000000000000000|@8678,@14325,I251,@1576,@14310,@14314,I105,I218| 8678:S45|535452554354555245535f28292e6d616b65436f7079416374696f6e732831296d61746368456e747279283329 8679:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8456,@6791| 8680:O1|@8681 8681:D9,192|00812b1ac2000e0e0e0c00021ac1000e0e0c0002038d2b352c362a3529353b1ab6000e0e0e0c000303043b5002041aaf001029362c3629353d1a9c000e0c000303041aa300103b5029353b1a8a000e0e0e0c00030322293729353c1a7a000e0e0e0c0003030d2936293b1a83000c0003640202293664020d2936293b1a71000e0e0c0003643c2a346a2c2a69343c1a67000c000329311a67000c00032b2a69270a02013b430e0e0e0000000000000000b0000000000000000000000000000000|@8683,I105,I218,I251,@8682,@1377,I253,I106,@8680| 8682:O4|@14322,@596,@8685,@8684 8683:S29|535452554354555245535f28292e6d6174636854797065496473283229 8684:O5|@8409,1403,0,1403,0 8685:S24|6d61746368547970654964733a204e6f7420466f726d616c 8686:O1|@8687 8687:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8686| 8688:D2,48|00802b56181a30000e0c000356172c0e0e8000020e0e0e0e000000000000000020000000000000000000000000000000|@8689,I106| 8689:S39|535452554354555245535f28292e73747275637456616c7565283829726573756c74732d283129 8690:O1|@8691 8691:D7,120|00812c3b1a79000e0e0c000303172b3b1a6d000e0e0c000303043b5002041a6700103b02342c352d362d1a63000c00021a65000e0e0c000203043b5002041a5f00102d352e362a2d692c2b1a5a000e0e0e0c00032a2a692706430e0e0e0e0e0e000000000000000068000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@8690| 8692:O1|@8693 8693:D10,224|00832e1ae2000e0e0e0c00021ae1000e0e0c000203ad2e352f362a3629353b1ad6000e0e0e0c000303043b5002041acf00103b5029362a392d3729351ac900220c1acc000e0c00032a220c2b6a313629353d1aa3000c000303041abb00103b503b5029353b1a90000e0c00030322293729353c1a82000e0e0e0c0003030d2936293b1a9b000c0003640202293664020d2936293b1a89000e0e0c000364303b2b322f680565220c0e0e0c0002293369322210221022101a6f000c00052a2a69270c02013b1f040e0e0000000000000000d0000000000000000000000000000000|@1399,I105,I218,I251,@8695,@8694,@122,@1377,I253,@8692| 8694:S30|437265617465642066726f6d206170706c79696e672066756e63746f7220 8695:O4|@14322,@596,@8625,@8696 8696:O5|@8409,1508,0,1508,0 8697:O1|@8698 8698:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8697| 8699:D10,176|00802b561c1ab0000e0c0003030a2b56172c0e0e0e80000256093a2c2a1aa0000e0c000364034956093a2c2a1a99000e0e0c0003291a98000e0c00021a99000e0e0c000203033c021456281a92000e0e0e0c00022a2a1a8f000c00036403041a8e00103b5056282a1a8d002f7e050003560b3a2c2a1a48000e0c00036403092b561a2c0e0e800002560b392c2a2d0e0e7d0400020e0e0e0e0000000000000000a0000000000000000000000000000000|@8700,I234,I231,I107,I105,I218,I15,I247,@599,I253| 8700:S48|535452554354555245535f28292e73747275637456616c7565283829676574436f6d62696e6564547970654964283129 8701:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8702:S9|46756e63746f722028 8703:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8704,@6791| 8704:S32|535452554354555245535f28292e676976654572726f72283329283129283129 8705:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8704,@6791| 8706:S29|535452554354555245535f28292e676976654572726f72283329283129 8707:D7,184|008833291ab9000e0e0c00021ab9000e0e0c0002038629352a362a353b1ab0000e0c0003031a2a362b372a2a220d2211220c220f1aa1000e0e0c0007260302522a353c1a8a000e0e0e0c000303222a362b37292b220d31342213221322132212221222121a79000e0e0c000c260302222a372b382c2b2b220d220d2213220e56c7220f2216221622161a5c000e0c000d2603292503511e933b6502013b641f090000000000000000a8000000000000000000000000000000|@8709,I105,I218,I251,@8710,@8731,@8708| 8708:O1|@8750 8709:S28|535452554354555245535f28292e7061737332537472756374283829 8710:O1|@8711 8711:D8,144|00852e23062f2308303931230c323a33230b1a8300220d220d6a1a8300220e220e6a1a8300220f220f6a1a8300221022106a220f3622102307221123092d2c3131220e220d221231221332220d22122215680d1a6200221322136a22162a2c22141a5c001a61000e0e0c00063b27101f060e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@8713,@8714,@8718,@8721,@8724,@8727,@8712,@7076| 8712:O1|@8729 8713:S45|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e283229 8714:D5,104|00802b365618372d2a0c00025156173b1a5d000e0e0c00033e2b69293b69293b1a55000e0e0c000303032b020b2b2a1a4e000e0e0e0c000356573b2b1a49000e0e0c0004503b2705420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@8716,I253,I251,@8715,I255| 8715:O1|@8717 8716:S55|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296e6577456e762d283129 8717:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8715| 8718:D5,104|00802b365618382d2a0c00025156173b1a5d000e0e0c00033d2b69293b69293b1a55000e0e0c000303032b020b2b2a1a4e000e0e0e0c000356573b2b1a49000e0e0c0004503b2705420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@8716,I253,I251,@8719,I255| 8719:O1|@8720 8720:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8719| 8721:D5,104|00805608352c2a0e0e0c00025156073b1a5d000e0e0c00032c352d363b2b2b6a293b69293b1a50000e0c000303032d020b2d2a1a4a000e0e0e0c000356673b2b1a45000e0e0c0004503b2706420e0e0e000000000000000058000000000000000000000000000000|@8716,I253,I251,@8722,I255| 8722:O1|@8723 8723:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8722| 8724:D5,104|00802b365618230a2d2a0e0e0e0c00025156173b1a59000e0e0c00033c2b69293b69293b1a51000e0e0c000303032b020b2b2a1a4a000e0e0e0c000356573b2b1a45000e0e0c0004503b2705420e0e0e000000000000000058000000000000000000000000000000|@8716,I253,I251,@8725,I255| 8725:O1|@8726 8726:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8725| 8727:D7,168|00832c3629353c1aa6000e0e0e0c000303562d352d352e362f373b2d291a98000e0c00021a99000e0e0c0002031729362b3c1a93000c0003292b25042504511e233b6502012a6556682d1a83000c0003292d2d6a2b3c220f220f2d6805665667310e0e0e7d0b00022d352d352e362f3756582c1a5a000e0e0e0c0003292c2c6a3d2f316a1a51002a2c6a27081f040e0e000000000000000098000000000000000000000000000000|@8728,I251,I105,I218,I106,@122,@694| 8728:S54|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296d616b654964283429 8729:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8730| 8730:S50|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832295f2d283129 8731:O1|@8732 8732:D21,376|008a7881453c28403b1a74010e0c0004280b28403b1a68010e0c0004293b401a66010e0e0e0c0004503c28402b1a50010e0c00043c28401a56011a43010c00043c2a2e2d6b2704053a0e00ff6d29353f1a45010e0e0c00030323403c1a41010e0e0c00031a41012a1a45010e0e0c00031a45011a4a012b1a4e016b65103b503b502910040d002a2a1a45010e0e0c00035029362a372b382c392d23062e23072f230830230931230a32230c221623061a26012a316a221823081a24012a316a221a230c1a22012a306a221c3a221d230b1a1d01221f220c6a1a1d01221322132213221330220d2214220d322214220c220f680d2222221e221e221e2d221f221f221f222622280e0e0e0c000a1af100222222156a1af100222322156a1af100222422106a1af100222522196a1ac9002a2e2e2219220d2213221a2213220f3422122215680d22272224222422242d222522252225222c222e22270e7b0b29000a000000000000000068010000000000000000000000000000|@8734,I11,I255,@8735,I251,@243,@6963,@122,@14322,@596,@6964,@1571,@8737,@8738,@8739,@8740,@8744,@8746,@8748,@8749,@8733| 8733:D1,48|00802b56180c0002505607362c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8747| 8734:S44|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229 8735:O1|@8736 8736:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 8737:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8738:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8739:D2,56|00802b56180c0002293b1a33000c0003030a2c56272d0e0e7d0400022964420e000000000000000028000000000000000000000000000000|@6003,I251| 8740:D3,80|00803b56180c0002561723093b2a0e0e0e0c000264293b1a3e000e0e0e0c000303032a020b2a2a1a36002f0e7e05000365420e0e0e0e0e0e000000000000000040000000000000000000000000000000|@8742,I251,@8741| 8741:O1|@8743 8742:S56|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c6465632832296c6f63616c456e762d283129 8743:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8741| 8744:O1|@8745 8745:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@8742| 8746:D1,48|00802b56180c0002505607372c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8747| 8747:S55|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229626f6479456e762d283129 8748:D1,48|00802b56180c0002505607382c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8747| 8749:D1,48|00802b56180c0002505607230a2c2a2d7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8747| 8750:D13,288|008b1a2301220e220c220c6b0403002a2a1a1c010e0c00035029352a361a18012210220e6a2211291a15010e0e0c00021a15010e0e0c000203bf29352a362a352b362c372d3822132c1a04010e0c000329282e1afa000e0e0e0c00030406002d34221522152215221e220c3131221d221f0c000b5029352a362b372c382d392e3a2e2e2e2e2e2e68062f3b1aca001acf000c00043b220f69222223103b2a0e0e0e0c00023d2a69293b692d2a693c28401ab5001aba000e0e0e0c00043c28401ab6001aab000c00043d2b2b6a22162a220c2f6b22172a69221e0c00025029680122163b2b1a99000e0e0c000450221a251d261c1ecc261c02023b505030230a2c310e0e0e7d130002000000000000000010010000000000000000000000000000|@8752,@8753,@6133,@8758,I105,I218,@122,@8751,@1633,-1,I11,@2249,I255| 8751:O1|@8760 8752:S48|535452554354555245535f28292e70617373325374727563742838297061737332537472756374757265446563283329 8753:D8,128|00821a83005617691a85002f1a89000e0e0c0003291a88001a7d000e0e0c00033e2a69291a81000e0e0c000203041a7f00103b50293b693b3b3b3b2d6805291a66000e0e0e0c000203041a6300103b5056683c3056992d1a5e00220d0e0e0e7b070b00060e0e0e0e000000000000000070000000000000000000000000000000|@8755,@8756,@8754,@122,@6895,I105,@1363,@6890| 8754:S10|53747275637475726520 8755:S56|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329 8756:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8757,@6601| 8757:S59|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329283129 8758:D3,64|00802b56180c000256173b1a3a000e0e0e0c00032a2a6956373b2b1a32000e0e0e0c0004502b6642000000000000000030000000000000000000000000000000|@8759,I253,I255| 8759:S61|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332963617074757265496473283129 8760:D10,232|00822c2c2a1ae8000e0c00021ae9000e0e0c000203b32a352b362a35291ae0001ae5000e0e0c000364038f2a351ad0001ad5000e0e0c000303043b5002041acf00102a37293a291aa6000e0e0e0c00021aa5000e0e0c0002031429352936293b3c1ab4000e0c0004503b260302023b502a2306291a79000e0e0c00021a79000e0e0c0002033029352c380402002a1a8f002b1a93000c00045029352a36291a8f000c00022b3b692f3b2b1a6b000c0004503b270702013b6602013b2a2a2505250526031ebf3b6602012965440e0e0e0e0000000000000000d8000000000000000000000000000000|@1636,I105,I218,@14310,I251,@1576,I255,@8761,@1414,@7142| 8761:O1|@8762 8762:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 8763:S3|28292e 8764:O1|@8765 8765:D4,80|00822c2c2a1a50000e0c00021a51000e0e0c0002031c2a352b36312b2d1a48000e0c00042a2a2505250526031e283b6602012965440e0e0e000000000000000040000000000000000000000000000000|@1636,I105,I218,@8364| 8766:D9,216|00802b561c1ad8000e0c0003030a2b56172c0e0e0e8000022b561b1ac2000e0e0e0c0003034e56093a2c2a1aba000e0e0e0c0003291ab8000e0c00021ab9000e0e0c000203033c021456281ab2000e0e0e0c00022a2a1aaf000c00036403041aae00103b503b5056282a1aab002f0e0e7e0500032b561b1a6e000e0e0e0c0003291a6c000e0c00021a6d000e0e0c000203033c0214561a1a66000e0e0e0c00022a2a1a63000c00036403041a6200103b503b50561a2a1a5f002e0e0e7e0400030000000000000000c8000000000000000000000000000000|@8767,I234,I107,I105,I218,I15,I247,@599,I253| 8767:S76|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229726573547970654d6170283129 8768:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 8769:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8399| 8770:D11,256|00802b352c362d372e382f3956583b1af6000e0e0e0c00033b2a291af2000e0e0e0c00021af1000e0e0c0002031729362b3c1aeb000c0003292b25042504511e253b6502012a652e03303c28401ad8001add000e0e0c00043c28401ada001acf000c00043d2b2b6a322a2e3333336806661acc000e0c0002022e3c28401aa8001aad000e0e0c00043c28401aaa001a9f000c00043d2b2b6a322a2e3333336806661aa4000e0c000256883b1a5a000e0e0e0c00032a2a6956a83b2b1a92000e0e0e0c00045056a73b1a3d000e0e0c00032c2a6956c73b2b1a76000e0e0e0c0004502d270c420e0e0e0000000000000000f0000000000000000000000000000000|@8771,I253,I105,I218,I106,-1,I11,@2249,@7051,@7039,I255| 8771:S52|535452554354555245535f28292e7061737332537472756374732833297061737332546f704465632832296d616b654964283129 8772:D3,48|00802b352c3629382b2a56571a29001a2e00327b06060005000000000000000020000000000000000000000000000000|@6858,@6859,@6857| 8773:O1|@8775 8774:S32|535452554354555245535f28292e706173733253747275637473283329283129 8775:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 8776:O1|@8777 8777:D9,128|00802b363c1a80000e0c000303051a7f0002532b35293b1a7e000e0e0e0c00036403051a7a00023e2b363c1a5a000e0e0e0c000303051a6f00022b2b35293c1a56000e0e0e0c00036403051a620002162b363c1a32000e0e0e0c000303051a570002031a5a00420e000000000000000070000000000000000000000000000000|@8779,I234,@1338,I251,@8780,@1338,@8787,@1338,@8778| 8778:O5|0,0,0,@8795,@8794 8779:S20|7072696e742d76616c7565436f657263696f6e73 8780:O5|0,0,0,@8782,@8781 8781:O2|@8785,0 8782:O2|@8783,0 8783:O2|0,@8784 8784:O5|@8409,129,129,0,0 8785:O2|3,@8786 8786:S18|436f6e7374727563746f72546f56616c7565 8787:O5|0,0,0,@8789,@8788 8788:O2|@8792,0 8789:O2|@8790,0 8790:O2|0,@8791 8791:O5|@8409,128,128,0,0 8792:O2|3,@8793 8793:S16|457863657074696f6e546f56616c7565 8794:O2|@8798,0 8795:O2|@8796,0 8796:O2|0,@8797 8797:O5|@8409,127,127,0,0 8798:O2|3,@8799 8799:S10|4e6f436f657263696f6e 8800:O3|@8802,@8904,@8801 8801:O3|@9198,@8905,@8904 8802:D3,64|00812c352d362e371a3d000e0e0c00042c352d362b564756581a3400310e0e7b070500060e0e0e0e000000000000000030000000000000000000000000000000|@8804,@7779,@8803| 8803:O1|@8805 8804:S34|535452554354555245535f28292e737472756374734578706f727454726565283229 8805:D7,120|00842f3b1a79000e0e0c000303052e2e6902461a7200301a76003030303468073f2a69291a71000e0e0c000203041a6f00103b503b50293b69293b1a42000e0e0e0c0003030330020b302a1a5a000e0e0e0c0003322a6927041f050e0e0e0e0e000000000000000068000000000000000000000000000000|@8807,I251,@8808,@8803,I105,@1363,@8806| 8806:O1|@8903 8807:S47|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229 8808:D2,56|00802b56173b56385649565a566b5677568c1a2b00340e7b0b03000a0e0e0e0e000000000000000028000000000000000000000000000000|@8810,@8809| 8809:O1|@8811 8810:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283129283129 8811:D10,168|0088321aaa000e0e0e0c00021aa9000e0e0c000203043b5002041aa300103b50323533361aa100333030220c220c220c68072968012b3b1a96000e0e0e0c000303033b02351a90001a9500220f220f220f220f220f220f220f220f680a2968011a85001a7a002f2c221122112211221122112211680a29680166292b220f6a292f220d220d1a6800220c0e7b06110005000000000000000098000000000000000000000000000000|@8813,I105,I218,@8814,@8816,I251,@8818,@8809,@8819,@8812| 8812:O1|@8820 8813:S58|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329 8814:O4|@14358,@1714,0,@8815 8815:O5|@8409,828,0,828,0 8816:D1,48|008056085619562a563b564c5657307b070300060e0e0e0e000000000000000020000000000000000000000000000000|@8817| 8817:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329283129 8818:D1,56|00802b56185629563a564b565c566d567e568f5697340e7b0b03000a0e0e0e0e000000000000000028000000000000000000000000000000|@8810| 8819:D1,56|00802b56185629563a564b565c566d567e568f5697340e7b0b03000a0e0e0e0e000000000000000028000000000000000000000000000000|@8810| 8820:D13,232|00831aeb002e6928092a69291ae9000e0e0c000203041ae700103b503b503035313632371ae1000e0e0c00042a2a691ade001ae30034343434680632353b1adf000c00030339323633371adb0034692c68012a2a692d2a1ad6000e0e0e0c0003303b1abb000c0003030329020b29311ac6000e0e0e0c00032e2a692707024d32353c1a9b000c00030335323633372b68011aac002a692c2a1a95000e0e0c00032f3b1a7b000c0003030329020b29301a96000e0e0e0c00032d2a692706020d3236342a33330e0e0e7e0c000327051f040000000000000000d8000000000000000000000000000000|@8822,@8823,I105,@1363,@7779,@8825,@8812,I251,@8827,@7876,@8888,@8890,@8821| 8821:O1|@8902 8822:S33|535452554354555245535f28292e746f704465634578706f727454726565283229 8823:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8824,@6598| 8824:S48|535452554354555245535f28292e746f704465634578706f727454726565283229636f6d6d6f6e50726f70732d283129 8825:D1,48|008056085619562a563b56472f0e0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@8826| 8826:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296173506172656e74283129 8827:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@8829,@8828| 8828:O1|@8830 8829:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283129 8830:D11,248|00822c3529372e362f3730383123063223070402002b3c1ae6000e0e0e0c0003030c2e353d1ad8000e0c000302013b031a2e3629352a362b372c382b2b2b6a296801302a452f4626080206293b452f465029352a36220e35220f362210371aa7000c00041aa9001aae00221122112211680521071aa9004521051aab004521071aad004521051aaf004529220c4633472b482e496c502a220f462a472e482c492d4a314b6c502b31462d472b482e496c502c22134630472e482c492b4a314b6c503f2a69291a78000e0c000203041a7700103b503b50293069220e2a692712440000000000000000e8000000000000000000000000000000|@8832,I251,@7779,@8833,@8828,@8835,@8837,@8885,@8831,I105,@1363| 8831:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@8887,@7845| 8832:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229 8833:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@8834| 8834:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296578706f727454686973283129 8835:D3,80|0080560c3b1a50000e0c00031a51000e0e0c00020304560a0202560b561968012a68013b2b2b6a2956585667310e0e0e7e0700030e0e0e0e000000000000000040000000000000000000000000000000|@8836,I251,I218| 8836:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574426f6479283129 8837:D4,80|0080560a68015619680156286801292c2c6a56473b1a40000e0c000303041a3f00103b5056473529352b2a1a3a00330e7e0900030e0e0e0e000000000000000040000000000000000000000000000000|@8839,I251,@1792,@8838| 8838:O2|@8841,@8840 8839:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574536967283129 8840:O2|@8852,@8851 8841:D13,216|00811adb002c6928092a69291ad9000e0e0c000203041ad700103b503b502e352f3630371ad1000e0e0c00042a2a691ace002e32326b30353d1acc000e0c000303071acb002b69027430353b1ab9000e0e0c00030335303631372b680156872a692c2a1ab2000e0e0e0c00032f3b1a97000c0003030329020b29301aa2000e0e0e0c00032d2a692706023230373138293b1a94000e0c0003291a94000e0c00022e3b1a63000c0003030329020b292f1a86000e0e0e0c00032d2a6927052705430000000000000000c8000000000000000000000000000000|@8843,@8844,I105,@1363,@7779,@8846,I251,@6045,@7876,@8848,I253,@2156,@8842| 8842:O1|@8850 8843:S29|5349474e41545552455328292e7369674578706f727454726565283229 8844:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8845,@6611| 8845:S44|5349474e41545552455328292e7369674578706f727454726565283229636f6d6d6f6e50726f70732d283129 8846:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8847| 8847:S40|5349474e41545552455328292e7369674578706f7274547265652832296173506172656e74283129 8848:O1|@8849 8849:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8848| 8850:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8842| 8851:O3|@8855,@8854,@8838 8852:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8853| 8853:S30|5349474e41545552455328292e737065634578706f727454726565283129 8854:O2|@8883,@8838 8855:D19,464|00811ad3012c6928092a69291ad1010e0e0c000203041acf01103b503b502e352f3630371ac9010e0e0c00042a2a691ac6012e32326b30350a05007f009900440078000c002401303631371ab2015688692c68012a2a692d2a1aac010e0c0003303b1aab010c0003030329020b29311aa6010e0e0e0c00032e2a6927070fde303631372b680156872a692c2a1a79010e0e0c00032f3b1a77010c0003030329020b29301a7a010e0e0e0c00032d2a6927060fdb1a72012b690fdb3036040200332b2b1a6b010c00045029352a362a2a69270402da3036313732382a352b362b1afe000e0e0e0c00021a4d010e0e0c000203422b35541a48014521051a4a0145292e462d472b4832496c502a2c462a4732486c503f2a69291ac6000e0e0e0c000203041ac300103b503b50293469322a69270502251a19012b2b316b3f2a69291a9e000e0e0e0c000203041a9b00103b503b50293269302a6966270502514f003036313732382a352b36541aeb004521051aed0045292d462c472b4831496c502a2e462a4731486c503f2a692902021e001a4d00020217000e0e0c000203041a4700103b503b50293369312a6927092705430e0e0e0e0e0e0e0000000000000000c0010000000000000000000000000000|@8857,@8858,I105,@1363,@7779,@8860,@8862,@7876,I251,@8873,@8875,@6045,@7077,I218,@8877,@8879,@8881,@8882,@8856| 8856:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@8880,@7845| 8857:S30|5349474e41545552455328292e737065634578706f727454726565283229 8858:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8859,@6645| 8859:S45|5349474e41545552455328292e737065634578706f727454726565283229636f6d6d6f6e50726f70732d283129 8860:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8861| 8861:S41|5349474e41545552455328292e737065634578706f7274547265652832296173506172656e74283129 8862:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@8864,@8863| 8863:O1|@8865 8864:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283129 8865:D8,136|00822c352d362e372f3829351a81001a8600343434680521051a84004521051a8600452930462f472b482c496c502a34462d472a482c496c503f2a69291a70000e0c000203041a6f00103b503b50220d35220e36220f371a66000e0e0e0c00042a2a69332a69270b440e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@8867,@8868,@8863,@8870,@8866,I105,@1363,@7779| 8866:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@8872,@7845| 8867:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229 8868:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@8869| 8869:S54|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296578706f727454686973283129 8870:D1,48|0080560a6801561968013b2b2b6a2956485657307e060003000000000000000020000000000000000000000000000000|@8871| 8871:S56|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229676574536967537472756374283129 8872:S51|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296765744e616d65283129 8873:O1|@8874 8874:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8873| 8875:O1|@8876 8876:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8875| 8877:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@8878,@7857| 8878:S40|5349474e41545552455328292e737065634578706f72745472656528322967657454797065283129 8879:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@8880,@7845| 8880:S40|5349474e41545552455328292e737065634578706f7274547265652832296765744e616d65283129 8881:D2,56|0080560968013b2a3b6a29563756483b1a2d00310e0e0e7b060500050e0e0e0e000000000000000028000000000000000000000000000000|@8880,@7845| 8882:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@8878,@7857| 8883:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8884| 8884:S29|5349474e41545552455328292e7369674578706f727454726565283129 8885:D4,80|0080560c3b1a50000e0c00031a51000e0e0c00020304560a0202560b56196801562868012b6801292c2c6a2956671a3700320e0e7e080003000000000000000040000000000000000000000000000000|@8886,I251,I218,@8838| 8886:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574417267283129 8887:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296765744e616d65283129 8888:O1|@8889 8889:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8888| 8890:O1|@8891 8891:D2,40|00802b352c361a27002d0e0e7e030003000000000000000018000000000000000000000000000000|@8893,@8892| 8892:O1|@8894 8893:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283129 8894:D8,120|00812b352c362d382e391a73001a780032326b541a79004521051a7b0045292f462e472b482c496c502a2d462a472c486c503f2a69291a67000c000203041a6700103b503435220c36220d371a61000e0e0c00042a2a69322a69270a430e0e0e000000000000000068000000000000000000000000000000|@8896,@8897,@8892,@8899,@8895,I105,@1363,@7779| 8895:D2,56|0080560a680156196801292b3b6a29564756583b1a2900320e0e0e7b06060005000000000000000028000000000000000000000000000000|@8901,@7845| 8896:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229 8897:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8898| 8898:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296578706f727454686973283129 8899:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@8900,@8838| 8900:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229676574536967283129 8901:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296765744e616d65283129 8902:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8821| 8903:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8806| 8904:O5|@8906,@8801,@14455,@14456,@8905 8905:O2|@9196,@8801 8906:D23,576|00811a43022c6928092a69291a41020e0e0c000203041a3f02103b503b502e352f3630371a39020e0e0c00042a2a691a36022e32326b30353d1a34020e0c00030346303629352a362b38541a2a024521051a2c024529220c462e472b4830496c502a2d462a4730486c503f2a69291adf010c000203041adf01103b503b502932692d2a6927080fdd30353c1ae2010e0e0e0c000303853036313732383c28403b1ae5010e0e0c0004293b1ae30156c856d96a1ae3010c0004501ae40156a7346a2e68012a2a692e1ade010e0e0e0c00023c3169293b69293b1a95010e0e0c000303032b020b2b2a1ac6010e0e0e0c0003292e1ac3010c0003220d3b1a72010e0e0e0c0003030329020b29220e1ab1010e0e0c0003332a69270d0fcb30353b1a4f010c00030373303629352a362b392c3a2d23062b3b1a90010e0c0003293b1a2f010c000303033b0205293529396421051a7d014521061a7f01452931462e472c482b490202be00344a6c502a22104632472a4834496c503f2a69291ad2000e0e0e0c000203041acf00103b503b5029220d69302a69270c028c30353e1ad1000e0e0c00030335303631372b6801568a2a692c2a1a02010e0e0e0c00032f3b1aaf000c0003030329020b29301a12010e0e0e0c00032d2a692706024a303731382a3b1ae40002023d000e0c0003293b1a7f000c000303033b02052935293864291ae6000e0e0e0c00022f3b1a63000c0003030329020b29301ad6000e0e0e0c00032d2a692706270543000000000000000030020000000000000000000000000000|@8908,@8909,I105,@1363,@7779,@8911,I251,@8913,@8915,I11,@8917,I255,@8929,@8931,@8933,@7876,@8935,I253,@8937,@8939,@8941,@2156,@8907| 8907:O1|@8943 8908:S38|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229 8909:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8910,@6791| 8910:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229636f6d6d6f6e50726f70732d283129 8911:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@8912| 8912:S49|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296173506172656e74283129 8913:D2,56|008056096801561868013b2b2b6a2956471a2c00300e0e0e7e0600030e0e0e0e000000000000000028000000000000000000000000000000|@8914,@8838| 8914:S53|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296765745369676e6174757265283129 8915:D1,48|0080560a680156196801292b3b6a2956485657307e060003000000000000000020000000000000000000000000000000|@8916| 8916:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229676574537472756374757265283129 8917:D16,528|00802b363c1a10020e0c000303051a0f020fdd2b3529353b1a0d020e0e0c00036407df2b3529362d363c1a03020c00032a2a6956473b1aff010c00032a2a0e0e0e0c00026429353b1add010e0e0c000303932939291ae8010e0c00021ae9010e0e0c0002035f29361ad5010e0e0c00021ad5010e0e0c000203482935353e1aa7010c000303312935362928281a99010e0e0c000303033c021b29287b1a89010e0e0c000303033c020b29285b1a79010e0e0c00036402013b1a8d010e0e0c000202013b02013b03192a1a8401691a88012a691a8b012a693b3e3c3b2d68056602012a64020129293b691a7c012a69020202011a7b012a693b3c3b3b2d680527090fdd00002b363c1a0e010e0e0e0c000303051a630102dd2b3529362d363c1a0f010c00032a2a6956483b1a0b010c00032a2a0e0e0e0c00026429353b1ae9000e0e0c000303932939291af4000e0c00021af5000e0e0c0002035f29361ae1000e0e0c00021ae1000e0e0c000203482935353e1ab3000c000303312935362928281aa5000e0e0c000303033c021b29287b1a95000e0e0c000303033c020b29285b1a85000e0e0c00036402013b1a99000e0e0c000202013b02013b03192a1a9000691a94002a691a97002a693b3e3c3b2d68056602012a64020129293b69020213001a9c002a691a9f002a693b3c3b3b2d68052709420e0e0e000000000000000000020000000000000000000000000000|@8919,I234,@1338,I251,I107,I253,I105,I218,@900,@901,@873,@871,@8920,@1338,@871,@8918| 8918:O5|0,0,0,@8922,@8927 8919:S16|7072696e742d616c6c456e7472696573 8920:O5|0,0,0,@8922,@8921 8921:O2|@8925,0 8922:O2|@8923,0 8923:O2|0,@8924 8924:O5|@8409,710,710,0,0 8925:O2|3,@8926 8926:S3|446563 8927:O2|@8928,0 8928:O2|3,@6970 8929:D2,72|00802b352c3629353b1a44000e0c0003030e29362b2a5657300e0e0e7e06000329362b2a5658300e7e0600030e0e0e0e000000000000000038000000000000000000000000000000|@8930,I251| 8930:S54|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296578706f7274456e7472696573283129 8931:O1|@8932 8932:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c363b2b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@8931| 8933:O1|@8934 8934:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8933| 8935:O1|@8936 8936:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8935| 8937:D1,48|0080560a6801561968013b2b2b6a2956485657307e060003000000000000000020000000000000000000000000000000|@8938| 8938:S54|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f72417267283129 8939:D3,64|0080560b6801561a6801292b3b6a56391a35000e0e0c00022a565756682c1a2f00330e7b06070005000000000000000030000000000000000000000000000000|@8940,@2156,@7845| 8940:S55|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f724e616d65283129 8941:O1|@8942 8942:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8941| 8943:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@8907| 8944:O4|@8945,@14458,@14455,@14456 8945:D138,2112|00802b363c1a40080e0c000303051a3f080fcd2b3529353b1a3d080e0e0c00036407d52b3529362a372b382f363c1a2f080c0003293b1a0f080c000303051a27080fce293c1a18080e0c00032d2a691a1e083b1a22080e0e0e0c00032a2a0e0e0e0c0002642c3c1ade070e0e0e0c000303051a0b080fd72c3c1ae4070e0c0003293b1ac3070c000303051afb070fd12e362a3c1aca070e0e0e0c00032a2a691aee073b1ad2070e0e0e0c00032a2a0e0e0e0c0002642d3c1a8e070e0e0e0c000303051ad3070fcd32382e3c1a92070e0e0e0c00032a2a691ab6073b1a9a07020242070e0e0e0c00032a2a0e0e0e0c000264313d1a52070202c0010e0e0e0c000303051a9b0702d7220d35323c1a5107020283010e0e0c00032a2a691a8a073b1a56070e0e0e0c00032a2a0e0e0e0c000264220c3e1a11070e0e0c000303051a6f070282221137220d3c1a140702022d010e0c00032a2a691a36073b1a1a070202ae000e0e0e0c00032a2a0e0e0e0c00026422153922113c1ae6060e0e0e0c00032a2a691a0a073b1aee060e0e0e0c00032a2a020261000e0e0e0c000264291a1707691a1b072a691a1e072a691a21072a691a24072a69322a691a24072a691a27072a69270f1a28072a691a2b072a692c2a691a2b072a691a2e072a6927091a2f072a691a32072a692c2a691a32072a691a35072a6927091a36072a691a39072a692c2a691a39072a691a3c072a6927091a3d072a693b3c3b3b2d6805303c1a3f060c0003332a691a2e073b1a4a060e0e0e0c00031a290712110001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c000264291a0f07691a13072a691a16072a691a19072a691a1c072a69312a691a1c072a691a1f072a69270e1a20072a691a23072a692c2a691a23072a691a26072a6927081a27072a693b3c3b3b2d6805293b691a20072a691a23072a693b3c3b3b2d6805270b0fda2b363c1a88050e0c000303051a0f070fcb2b3529353c1a85050e0e0c00036407cd2b3529362a372b382f363c1a77050c0003293b1a57050c000303051ae7060fda293c1a60050e0c00032d2a691ade063b1a6a050e0e0e0c00031ad9065698693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1a16050e0e0e0c000303051abb060fd22c3c1a1c050e0c00032f2a691a9a063b1a26050e0e0e0c00031aa50656c8693b2a3e3c6b642a0c0002642a2a0e0e0c0002642f3c1aea040e0e0e0c0003293b1ac7040c000303051a7f060fd131362a3c1ace0402048e048c040e0c00032a2a691aee043b1ad2040202d3010e0e0e0c00032a2a0e0e0e0c0002642d3c1a8a040e0e0e0c000303051a47060fdb220c382e3c1a8d04020282010e0e0c00032a2a691aae043b1a92040e0e0e0c00032a2a0e0e0e0c000264313d1a4e040e0e0e0c000303051a130602d3221035323c1a510402022d010e0e0c00032a2a691a8a043b1a56040e0e0e0c00032a2a0e0e0e0c000264220c3e1a11040e0e0c000303051adf05027e221437220d3c1a14040e0c00032a2a691a3a043b1a1e040202ae000e0e0e0c00032a2a0e0e0e0c00026422183922113c1aea030e0e0e0c00032a2a691a0e043b1af2030e0e0e0c00032a2a0e0e0e0c000264291a8f05691a93052a691a96052a6902024b001a95052a691a98052a69322a691a98052a691a9b052a69270f1a9c052a691a9f052a692c2a691a9f052a691aa2052a6927091aa3052a691aa6052a692c2a691aa6052a691aa9052a6927091aaa052a691aad052a692c2a691aad052a691ab0052a6927091ab1052a693b3c3b3b2d6805291aac05691ab0052a691ab3052a691ab6052a691ab9052a69322a691ab9052a691abc052a69270e1abd052a691ac0052a692c2a691ac0052a691ac3052a6927081ac4052a693b3c3b3b2d6805293b691abd052a691ac0052a693b3c3b3b2d6805270b0fcf2b363c1ac5020e0e0c000303051aab050fd12b3529362a372b382f363c1ac3020c0003293b1aa3020c000303051a93050fdb293c1aac020e0c00032c2a691a2a043b1ab6020e0e0e0c00031a7d055699693b2a3d3c6b642a0c0002642a2a0e0e0c0002642c3c1a62020e0e0e0c000303051a5f050fd72c3c1a68020e0c0003293b1a47020c000303051a4f050fd130362a3c1a4e020e0e0e0c00032a2a691a72023b1a56020e0e0e0c00032a2a0e0e0e0c0002642d3c1a12020e0e0e0c000303051a1f050fcd34382e3c1a16020202d6010e0e0e0c00032a2a691a36023b1a1a020202c2010e0e0e0c00032a2a0e0e0e0c000264313d1ad2010e0e0e0c000303051ae70402d7220f35323c020276011ad1010e0e0c00032a2a691a0e023b1ada010e0e0e0c00032a2a0e0e0e0c000264220c3e1a95010e0e0c000303051ab3040282221337220d3c1a980102021d010e0c00032a2a691aba013b1a9e010202ae000e0e0e0c00032a2a0e0e0e0c00026422173922113c1a6a010e0e0e0c00032a2a691a8e013b1a72010e0e0e0c00032a2a020261000e0e0e0c000264291a5b04691a5f042a691a62042a691a65042a691a68042a69322a691a68042a691a6b042a69270f1a6c042a691a6f042a692c2a691a6f042a691a72042a6927091a73042a691a76042a692c2a691a76042a691a79042a6927091a7a042a691a7d042a692c2a691a7d042a691a80042a6927091a81042a693b3c3b3b2d6805303c1ac3000c0003322a691ab2013b1ace000e0e0e0c00031a65042a0e0c0002642a2a0e0e0c000264291a5b04691a5f042a691a62042a691a65042a691a68042a69312a691a68042a691a6b042a69270e1a6c042a691a6f042a692c2a691a6f042a691a72042a6927081a73042a693b3c3b3b2d6805293b691a6c042a691a6f042a693b3c3b3b2d6805270b420e0e0e000000000000000030080000000000000000000000000000|@8947,I234,@1338,I251,I107,@884,@14452,I253,@884,@884,@14301,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@14447,@8948,@887,@871,@8951,@871,@872,@871,@8062,@871,@872,@871,@8953,@899,@871,@8955,@1338,@884,@14442,@8962,@884,@8963,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@887,@871,@8964,@871,@872,@871,@8966,@871,@872,@871,@8968,@899,@871,@8970,@1338,@884,@8977,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@8995,@887,@871,@9002,@871,@872,@871,@8964,@871,@872,@871,@9004,@899,@871,@8946| 8946:O5|0,0,0,@9007,@9006 8947:S15|7072696e742d737472756374446563 8948:D4,64|00801a43003b1a47000c00031a49005627693b2a3e3c6b642a0c0002642c2a2d7d0400020e0e0e0e000000000000000030000000000000000000000000000000|@864,@14442,I253,@8949| 8949:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8950,I253| 8950:S21|7072696e742d636f72654465636c61726174696f6e 8951:O2|3,@8952 8952:S6|76617273203d 8953:O2|3,@8954 8954:S5|646563203d 8955:O5|0,0,0,@8957,@8956 8956:O2|@8960,0 8957:O2|@8958,0 8958:O2|0,@8959 8959:O5|@8409,187,187,0,0 8960:O2|3,@8961 8961:S8|436f72654c616e67 8962:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8947,I253| 8963:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8947,I253| 8964:O2|3,@8965 8965:S6|6c696e65203d 8966:O2|3,@8967 8967:S6|64656373203d 8968:O2|3,@8969 8969:S6|626f6479203d 8970:O5|0,0,0,@8972,@8971 8971:O2|@8975,0 8972:O2|@8973,0 8973:O2|0,@8974 8974:O5|@8409,194,194,0,0 8975:O2|3,@8976 8976:S8|4c6f63616c646563 8977:D86,1280|00802b363b1a00050e0c000303051aff040fcd2b35392c363c1afc040e0c00032a2a691afa043b1afe040e0e0e0c00032a2a0e0e0e0c0002642f363c1ac9040e0e0c000303051ae7040fd32f353530363c1ac4040e0c0003293b1aab040c000303051ad3040fd12a362a3c1aaa040e0e0e0c00032a2a691ac6043b1aaa040e0e0e0c00032a2a0e0e0e0c0002642d3c1a76040e0e0e0c000303051aab040fdb2e382e3c1a72040e0e0e0c00032a2a691a8e043b1a72040e0e0e0c00032a2a0e0e0e0c000264313d1a3e040e0e0e0c000303051a7b0402d73235323c1a3a040202f7030e0e0e0c00032a2a691a6a043b1a36040e0e0e0c00032a2a0e0e0e0c000264220c3e1a01040e0e0c000303051a4f040282220d37220d3c1afc030202a0030e0c00032a2a691a16043b1afa030e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1ace030e0e0e0c00032a2a691aea033b1ace030e0e0e0c00032a2a0e0e0e0c000264291afb03691aff032a691a02042a6902024b001a01042a691a04042a69322a691a04042a691a07042a69270f1a08042a691a0b042a692c2a691a0b042a691a0e042a6927091a0f042a691a12042a692c2a691a12042a691a15042a6927091a16042a691a19042a692c2a691a19042a691a1c042a6927091a1d042a693b3c3b3b2d680534363d1a16030e0e0e0c000303051a0b040fd1343536220c363c1a0f030c00032a2a691a46033b1a12030e0e0e0c00032a2a0e0e0e0c000264220f363e1adc020e0c000303051adb030fd7220f353a2210363c1ad6020e0e0e0c0003293b1abb020c000303051ac3030fd12a362a3c1aba020e0e0e0c00032a2a691ad6023b1aba020e0e0e0c00032a2a0e0e0e0c0002642d3c1a86020e0e0e0c000303051a93030fdb2e382e3c1a82020e0e0e0c00032a2a691a9e023b1a82020e0e0e0c00032a2a0e0e0e0c000264313d1a4e020e0e0e0c000303051a630302d73235323c1a4a020202d5010e0e0e0c00032a2a691a7a023b1a46020e0e0e0c00032a2a0e0e0e0c000264220c3e1a11020e0e0c000303051a2f030282220d37220d3c1a0c0202027e010e0c00032a2a691a26023b1a0a020e0e0e0c00032a2a0202a6000e0e0e0c00026422113922113c1ade010e0e0e0c00032a2a691afa013b1ade010e0e0e0c00032a2a0e0e0e0c000264291adb02691adf022a691ae2022a6902024b001ae1022a691ae4022a69322a691ae4022a691ae7022a69270f1ae8022a691aeb022a692c2a691aeb022a691aee022a6927091aef022a691af2022a692c2a691af2022a691af5022a6927091af6022a691af9022a692c2a691af9022a691afc022a6927091afd022a693b3c3b3b2d68052214363f1a25010e0e0c000303051aeb020286221435382215363c1a1e010e0e0e0c00032a2a691ada023b1a1e010e0e0e0c00031ad5022a0e0c0002642a2a0e0e0c000264221835372219363c1aec000e0c00032a2a69121a00010001003b1aea000e0e0e0c00032a2a0e0e0e0c000264291a9f02691aa3022a691aa6022a691aa9022a691aac022a69322a691aac022a691aaf022a69270f1ab0022a691ab3022a692c2a691ab3022a691ab6022a69270a1ab7022a691aba022a692c2a691aba022a691abd022a6927091abe022a691ac1022a692c2a691ac1022a691ac4022a69270a1ac5022a691ac8022a692c2a691ac8022a691acb022a6927091acc022a693b3c3b3b2d680565420e0000000000000000f0040000000000000000000000000000|@86,I234,@884,I107,@14449,I253,@884,@884,@14301,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@884,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@884,@14447,@8979,@887,@871,@8988,@871,@872,@871,@8990,@871,@872,@871,@8992,@871,@872,@871,@1341,@871,@872,@871,@8964,@871,@872,@871,@8978,@899| 8978:O2|3,@8994 8979:O4|0,@8980,3,1 8980:O1|@8981 8981:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@2063,@14298,I253,@8982| 8982:O4|0,@8983,3,1 8983:O1|@8984 8984:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8985,@14457,I253| 8985:S16|7072696e742d73747275637456616c73 8986:O1|@8987 8987:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 8988:O2|3,@8989 8989:S7|76616c7565203d 8990:O2|3,@8991 8991:S8|76616c526566203d 8992:O2|3,@8993 8993:S9|6e616d654c6f63203d 8994:S9|68617665536967203d 8995:O4|0,@8996,3,1 8996:O1|@8997 8997:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@8998| 8998:O4|0,@8999,3,1 8999:O1|@9000 9000:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@9001,@14441,I253| 9001:S12|7072696e742d747970654964 9002:O2|3,@9003 9003:S17|74797065496473466f724465627567203d 9004:O2|3,@9005 9005:S10|62696e64696e6773203d 9006:O2|@9010,0 9007:O2|@9008,0 9008:O2|0,@9009 9009:O5|@8409,180,180,0,0 9010:O2|3,@9011 9011:S12|537472756374757265446563 9012:O1|@9013 9013:D32,1008|00802b363c1af0030e0c000303051aef030fca2b3529353b1aed030e0e0c000364039e2b3529362a372e363c1ae1030e0e0c0003293b1abf030c000303051ad703025a293c1ac8030e0c00032c2a691ace033b1ad2030e0e0e0c00032a2a0e0e0e0c0002642c3c1aa6030e0e0e0c00032e2a691aba033b1aae030e0e0e0c00032a2a0e0e0e0c000264291aab03691aaf032a691ab2032a692f2a6927091ab0032a693b3c3b3b2d6805293b691aa9032a691aac032a693b3c3b3b2d6805270a0fdb2b363c1a31030e0e0c000303051a97030fde2b3529353c1a2d030202f5020e0e0c00036407dd2b3529362d363c1a1f030c00032a2a691a76033b1a2a030e0e0e0c00032a2a0e0e0e0c00026429353b1af5020e0e0c000303992939291a58030e0c00021a59030e0e0c0002035f29361a45030e0e0c00021a45030e0e0c000203482935353e1abf020c000303312935362928281ab1020e0e0c000303033c021b29287b1aa1020e0e0c000303033c020b29285b1a91020e0e0c00036402013b1afd020e0e0c000202013b02013b031d2a1af402691af8022a69020236021af7022a693b3e3c3b2d68056602012a640203210229293b691ae6022a691ae9022a693b02020a003c3b3b2d680527090fdd2b363c1a22020e0e0e0c000303051acf020fdd2b3529353d1a1d020e0e0c00036407dd2b3529362d363c1a13020c00032a2a691ab2023b1a1e020e0e0e0c00032a2a0e0e0e0c00026429353b1ae9010e0e0c000303972939291a4c020e0c00021a4d020e0e0c0002035f29361a39020e0e0c00021a39020e0e0c000203482935353e1ab3010c000303312935362928281aa5010e0e0c000303033c021b29287b1a95010e0e0c000303033c020b29285b1a85010e0e0c00036402013b1af1010e0e0c000202013b02013b031d2a1ae801691aec012a691aef012a69020225013b3e3c3b2d68056602012a6402012902021201293b691af8012a691afb012a02020c00693b3c3b3b2d680527090fdd2b363c1a14010e0c000303051ae3010fdd2b3529362d363c1a17010c00032a2a691ad6013b1a22010e0e0e0c00032a2a0e0e0e0c00026429353b1aed000e0e0c000303932939291a50010e0c00021a51010e0e0c0002035f29361a3d010e0e0c00021a3d010e0e0c000203482935353e1ab7000c000303312935362928281aa9000e0e0c000303033c021b29287b1a99000e0e0c000303033c020b29285b1a89000e0e0c00036402013b1af5000e0e0c000202013b02013b03192a1aec00691af0002a691af3002a693b3e3c3b2d68056602012a64020129293b69020217001a20012a691a23012a693b3c3b020206003b2d68052709420e0e0e0000000000000000e0030000000000000000000000000000|@8950,I234,@1338,I251,I107,@856,@14296,I253,@14459,@869,@871,@872,@873,@871,@9017,@1338,@14457,I105,I218,@900,@901,@873,@871,@9024,@1338,@14445,@871,@9031,@1338,@14460,@871,@9014| 9014:O5|0,0,0,@9041,@9040 9015:O1|@9016 9016:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 9017:O5|0,0,0,@9019,@9018 9018:O2|@9022,0 9019:O2|@9020,0 9020:O2|0,@9021 9021:O5|@8409,114,114,0,0 9022:O2|3,@9023 9023:S7|436f7265466978 9024:O5|0,0,0,@9026,@9025 9025:O2|@9029,0 9026:O2|@9027,0 9027:O2|0,@9028 9028:O5|@8409,115,115,0,0 9029:O2|3,@9030 9030:S10|436f7265537472756374 9031:O5|0,0,0,@9033,@9032 9032:O2|@9036,0 9033:O2|@9034,0 9034:O2|0,@9035 9035:O5|@8409,113,113,0,0 9036:O2|3,@9037 9037:S8|436f726554797065 9038:O1|@9039 9039:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 9040:O2|@9044,0 9041:O2|@9042,0 9042:O2|0,@9043 9043:O5|@8409,112,112,0,0 9044:O2|3,@9045 9045:S9|436f726556616c7565 9046:O4|@9047,@14461,@14456,@14455 9047:D290,4584|00802b363c1ae8110e0c000303051ae7110fd52b3529353b1ae5110e0e0c00036407d12b3529362d363c1adb110c0003293b1abb110c000303051ad3110fd92a352a3c1ac2110e0e0e0c00032a2a6956683b1ac3110c00032a2a0e0e0e0c0002642d3c1a8a110e0e0e0c000303051aaf110fcd2e372e3c1a8e110e0e0e0c00032a2a691aa2113b1a8e110e0e0e0c00031a9d112a0e0c0002642a2a0e0e0c000264313d1a4a110e0e0e0c000303051a87110fca323a323c1a4e110e0e0e0c0003293b1a2b110c000303051a73110fd52a362a3c1a32110e0e0e0c00032a2a691a66113b1a32110202e2100e0e0e0c00032a2a0202fd040e0e0e0c0002642d3c1aee100e0e0e0c000303051a43110fdd2e382e3c1af2100202b5040e0e0e0c00032a2a691a22113b1aee100e0e0e0c00032a2a0e0e0e0c000264313d1ab210020274040e0e0e0c000303051a0b1102d33235323c1ab2100e0e0e0c00032a2a691afe103b1ab2100e0e0e0c00032a2a0e0e0e0c000264220c3e1a751002021e040e0e0c000303051adf10027e220d37220d3c1a74100e0c00032a2a691aaa103b1a76100202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1a4a100e0e0e0c00032a2a691a7e103b1a4a100e0e0e0c00032a2a0e0e0e0c000264291a8f10691a93102a691a961002024d002a691a95102a691a98102a69322a691a98102a691a9b102a69270f1a9c102a691a9f102a692c2a691a9f102a691aa2102a6927091aa3102a691aa6102a692c2a691aa6102a691aa9102a6927091aaa102a691aad102a692c2a691aad102a691ab0102a6927091ab1102a693b3c3b3b2d6805220d3e1a8a0f0e0e0e0c000303051a9f100fd1220e2307220e3c1a8b0f0c00032a2a691aa20f3b1a8e0f0e0e0e0c00031a851012160001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c00026422113f1a390f0e0e0c000303051a5f100fd122123622123c1a3c0f0e0c00032a2a691a8a0f3b1a3e0f0e0e0e0c00032a2a0e0e0e0c000264221528051a000f0e0c000303051a2f100fd72216230622163c1a030f0c0003293b1ae30e0c000303051a1b100fcd2a362a3c1aea0e0e0e0e0c00032a2a691a1e0f3b1aea0e0e0e0e0c00032a2a0e0e0e0c0002642d3c1aae0e02023e020e0e0e0c000303051ae70f0fdb2e382e3c1aae0e0e0e0e0c00032a2a691ae20e3b1aae0e0e0e0e0c00032a2a0e0e0e0c000264313d1a720e0e0e0e0c000303051ab70f02d73235323c1a760e0202d5010e0e0e0c00032a2a691abe0e3b1a720e0e0e0e0c00032a2a0e0e0e0c000264220c3e1a350e0e0e0c000303051a830f0282220d37220d3c1a380e02027e010e0c00032a2a691a6a0e3b1a360e0202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1a0a0e0e0e0e0c00032a2a691a3e0e3b1a0a0e0e0e0e0c00032a2a0e0e0e0c000264291a2f0f691a330f2a691a360f2a6902024b001a350f2a691a380f2a69322a691a380f2a691a3b0f2a69270f1a3c0f2a691a3f0f2a692c2a691a3f0f2a691a420f2a6927091a430f2a691a460f2a692c2a691a460f2a691a490f2a6927091a4a0f2a691a4d0f2a692c2a691a4d0f2a691a500f2a6927091a510f2a693b3c3b3b2d6805221a28061a490d0e0e0c000303051a3f0f0286221b38221b3c1a4c0d0e0c00032a2a691a620d3b1a4e0d0e0e0e0c00031a250f2a0e0c0002642a2a0e0e0c000264221f39221f3c1a1e0d0e0e0e0c00032a2a691a320d3b1a1e0d0e0e0e0c00031afd0e2a0e0c0002642a2a0e0e0c000264291af30e691af70e2a691afa0e2a691afd0e2a691a000f2a69322a691a000f2a691a030f2a69270f1a040f2a691a070f2a692c2a691a070f2a691a0a0f2a69270a1a0b0f2a691a0e0f2a692c2a691a0e0f2a691a110f2a6927091a120f2a691a150f2a692c2a691a150f2a691a180f2a6927091a190f2a691a1c0f2a692c2a691a1c0f2a691a1f0f2a69270a1a200f2a691a230f2a692c2a691a230f2a691a260f2a6927091a270f2a691a2a0f2a692c2a691a2a0f2a691a2d0f2a6927091a2e0f2a693b3c3b3b2d6805293b691a270f2a691a2a0f2a693b3c3b3b2d680527090fd52b363c1af70b0c000303051a170f0fd12b3529353c1af50b0e0e0c00036407d12b3529362a372b382f363c1ae70b0c0003293b1ac70b0c000303051aef0e0fca293c1ad00b0e0c00032d2a6956783b1ad30b0c00032a2a0e0e0e0c0002642c3c1a9a0b0e0e0e0c000303051ac70e0fd62c3c1aa00b0e0c00032f2a691abe0e3b1aa20b0e0e0e0c00031ab90e56c9693b2a3e3c6b642a0c0002642a2a0e0e0c0002642f3c1a6e0b0e0e0e0c0003293b1a4b0b0c000303051a930e0fd531362a3c1a520b0e0e0e0c00032a2a691a860b3b1a520b0202020b0e0e0e0c00032a2a0202f60a0e0e0e0c0002642d3c1a0e0b0202bf010e0e0e0c000303051a570e0fdb220c382e3c1a0d0b020282010e0e0c00032a2a691a3e0b3b1a0a0b0e0e0e0c00032a2a0e0e0e0c000264313d1ace0a0e0e0e0c000303051a230e02d3221035323c1ad10a02022d010e0e0c00032a2a691a1a0b3b1ace0a0e0e0e0c00032a2a0e0e0e0c000264220c3e1a910a0e0e0c000303051aef0d027e221437220d3c1a940a0e0c00032a2a691aca0a3b1a960a0202ae000e0e0e0c00032a2a0e0e0e0c00026422183922113c1a6a0a0e0e0e0c00032a2a691a9e0a3b1a6a0a0e0e0e0c00032a2a0e0e0e0c000264291a9f0d691aa30d2a691aa60d2a6902024b001aa50d2a691aa80d2a69322a691aa80d2a691aab0d2a69270f1aac0d2a691aaf0d2a692c2a691aaf0d2a691ab20d2a6927091ab30d2a691ab60d2a692c2a691ab60d2a691ab90d2a6927091aba0d2a691abd0d2a692c2a691abd0d2a691ac00d2a6927091ac10d2a693b3c3b3b2d6805291abc0d691ac00d2a691ac30d2a691ac60d2a691ac90d2a69322a691ac90d2a691acc0d2a69270e1acd0d2a691ad00d2a692c2a691ad00d2a691ad30d2a6927081ad40d2a693b3c3b3b2d6805293b691acd0d2a691ad00d2a693b3c3b3b2d6805270b0fd72b363c1a45090e0e0c000303051abb0d0fd12b3529353d1a41090e0e0c00036407d22b3529362d363c1a37090c0003293b1a17090c000303051a970d0fcf2a362a3c1a1e090e0e0e0c00032a2a691a8a0d3b1a1e090e0e0e0c00032a2a0e0e0e0c0002642d3c1ae2080e0e0e0c000303051a6f0d0fdb2e3a2e3c1ae6080e0e0e0c00032a2a691afa083b1ae6080e0e0e0c00031a550d56c7693b2a3e3c6b642a0c0002642a2a0e0e0c000264313d1a9a080e0e0e0c000303051a370d0fd53237323c1a9e080e0e0e0c00032a2a691a2a0d3b1a9e0802024e080e0e0e0c00032a2a020242080e0e0e0c000264220c3e1a59080202d2020e0e0c000303051a030d0fcd220d39220d3c1a5808020295020e0c00032a2a691a6a083b1a56080e0e0e0c00031ae50c2a0e0c0002642a2a0e0e0c00026422103f1a11080e0e0c000303051acf0c0fdb22113822113c1a1408020238020e0c0003293b1aef070c000303051ab70c0fcd2a362a3c1af6070e0e0e0c00032a2a691a2a083b1af6070e0e0e0c00032a2a0e0e0e0c0002642d3c1aba070202dd010e0e0e0c000303051a830c0fdb2e382e3c1aba070e0e0e0c00032a2a691aee073b1aba070e0e0e0c00032a2a0e0e0e0c000264313d1a7e07020288010e0e0e0c000303051a4f0c02d33235323c1a7e070e0e0e0c00032a2a691aca073b1a7e070e0e0e0c00032a2a0e0e0e0c000264220c3e1a41070e0e0c000303051a1f0c0282220d37220d3c1a440702021d010e0c00032a2a691a76073b1a42070202ae000e0e0e0c00032a2a0e0e0e0c00026422113922113c1a16070e0e0e0c00032a2a691a4a073b1a16070e0e0e0c00032a2a0e0e0e0c000264291acb0b691acf0b2a691ad20b2a6902024b001ad10b2a691ad40b2a69322a691ad40b2a691ad70b2a69270f1ad80b2a691adb0b2a692c2a691adb0b2a691ade0b2a6927091adf0b2a691ae20b2a692c2a691ae20b2a691ae50b2a6927091ae60b2a691ae90b2a692c2a691ae90b2a691aec0b2a6927091aed0b2a693b3c3b3b2d680522163522163c1a6b060c00032a2a69121c00010002003b1a6a060e0e0e0c00032a2a0e0e0e0c000264291abf0b691ac30b2a691ac60b2a691ac90b2a691acc0b2a69322a691acc0b2a691acf0b2a6927101ad00b2a691ad30b2a692c2a691ad30b2a691ad60b2a6927091ad70b2a691ada0b2a692c2a691ada0b2a691add0b2a6927091ade0b2a691ae10b2a692c2a691ae10b2a691ae40b2a6927091ae50b2a691ae80b2a692c2a691ae80b2a691aeb0b2a6927091aec0b2a693b3c3b3b2d6805293b691ae50b2a691ae80b2a693b3c3b3b2d680527090fcb2b363c1a7d050e0e0c000303051ad30b0fd12b3529353e1a79050e0e0c00036407d52b3529362a372b382f363c1a6b050c0003293b1a4b050c000303051aab0b0fcd293c1a54050e0c00032d2a691a72083b1a56050e0e0e0c00031a950b5699693b2a3e3c6b642a0c0002642a2a0e0e0c0002642c3c1a0a050e0e0e0c000303051a770b0fdb2c3c1a10050e0c0003293b1aef040c000303051a670b0fd52f362a3c1af6040e0e0e0c00032a2a691a2a053b1af6040e0e0e0c00032a2a0e0e0e0c0002642d3c1aba04020292040e0e0e0c000303051a330b0fcd33382e3c1aba0402027a040e0e0e0c00032a2a691aea043b1ab6040202d4010e0e0e0c00032a2a0e0e0e0c000264313d1a7604020298010e0e0e0c000303051af70a02d3220e35323c1a75040e0e0c00032a2a691ac2043b1a76040e0e0e0c00032a2a0e0e0e0c000264220c3e1a39040e0e0c000303051ac70a0282221237220d3c1a3c0402022d010e0c00032a2a691a6e043b1a3a040202ae000e0e0e0c00032a2a0e0e0e0c00026422163922113c1a0e040e0e0e0c00032a2a691a42043b1a0e040e0e0e0c00032a2a020261000e0e0e0c000264291a6f0a691a730a2a691a760a2a691a790a2a691a7c0a2a69322a691a7c0a2a691a7f0a2a69270f1a800a2a691a830a2a692c2a691a830a2a691a860a2a6927091a870a2a691a8a0a2a692c2a691a8a0a2a691a8d0a2a6927091a8e0a2a691a910a2a692c2a691a910a2a691a940a2a6927091a950a2a693b3c3b3b2d6805303c1a67030c0003322a691a7e033b1a6a030e0e0e0c00031a790a12110001000100693b2a3e3c6b642a0e0e0e0c0002642a2a0e0e0c000264291a5f0a691a630a2a691a660a2a691a690a2a691a6c0a2a69312a691a6c0a2a691a6f0a2a69270e1a700a2a691a730a2a692c2a691a730a2a691a760a2a6927081a770a2a693b3c3b3b2d6805293b691a700a2a691a730a2a693b3c3b3b2d6805270b0fd22b363c1ab0020e0c000303051a5f0a0fcd2b3529362a372b382f363c1aaf020c0003293b1a8f020c000303051a470a0fd3293c1a98020e0c0003293b1a77020c000303051a370a0fcd2b362a3c1a7e020e0e0e0c00032a2a691ab2023b1a7e020e0e0e0c00032a2a0e0e0e0c0002642d3c1a42020e0e0e0c000303051a070a0fdd2f382e3c1a46020e0e0e0c00032a2a691a7a023b1a46020e0e0e0c00032a2a0e0e0e0c000264313d1a0a020e0e0e0c000303051ad70902db3335323c1a0e020e0e0e0c00032a2a691a5a023b1a0e020202be010e0e0e0c00032a2a0202b2010e0e0e0c000264220c3e1ac9010e0e0c000303051a9f090282220e37220d3c1acc0102026a010e0c00032a2a691afe013b1aca010202ae000e0e0e0c00032a2a0e0e0e0c00026422123922113c1a9e010e0e0e0c00032a2a691ad2013b1a9e010e0e0e0c00032a2a0e0e0e0c000264291a4b09691a4f092a691a520902024d002a691a51092a691a54092a69322a691a54092a691a57092a69270f1a58092a691a5b092a692c2a691a5b092a691a5e092a6927091a5f092a691a62092a692c2a691a62092a691a65092a6927091a66092a691a69092a692c2a691a69092a691a6c092a6927091a6d092a693b3c3b3b2d68052d3c1adf000c000303051a5f0902762d3c1ae8000e0c0003312a691a36013b1aea000e0e0e0c00032a2a0e0e0e0c000264303c1ac6000e0e0e0c0003332a691ada003b1ac6000e0e0e0c00031a25092a0e0c0002642a2a0e0e0c000264291a1b09691a1f092a691a22092a691a25092a691a28092a69312a691a28092a691a2b092a69270d1a2c092a691a2f092a692c2a691a2f092a691a32092a6927091a33092a693b3c3b3b2d6805293b691a2c092a691a2f092a693b3c3b3b2d6805270b420e0e0e0000000000000000d8110000000000000000000000000000|@9049,I234,@1338,I251,I107,@884,I253,@884,@14447,@9050,@884,@884,@14301,@884,@884,@14296,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@884,@9060,@884,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@884,@9062,@9068,@887,@871,@8990,@871,@872,@871,@9077,@871,@872,@871,@8992,@871,@872,@871,@1341,@871,@872,@871,@9079,@871,@872,@871,@9081,@871,@872,@871,@9083,@871,@872,@871,@9085,@899,@871,@9087,@1338,@884,@884,@14442,@9094,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@887,@871,@8964,@871,@872,@871,@8966,@871,@872,@871,@8968,@899,@871,@9095,@1338,@884,@14463,@884,@9104,@884,@14449,@884,@9106,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@887,@871,@9112,@871,@872,@871,@9114,@871,@872,@871,@9116,@871,@872,@871,@9118,@871,@872,@871,@9120,@871,@872,@871,@9122,@899,@871,@9124,@1338,@884,@9131,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@9132,@887,@871,@9134,@871,@872,@871,@8062,@871,@872,@871,@9136,@899,@871,@9138,@1338,@884,@884,@884,@884,@884,@887,@871,@889,@871,@872,@871,@891,@871,@872,@871,@893,@871,@872,@871,@895,@871,@872,@871,@897,@899,@884,@9145,@887,@871,@8990,@871,@872,@871,@1341,@871,@872,@871,@8062,@899,@871,@9048| 9048:O5|0,0,0,@9152,@9151 9049:S17|7072696e742d73747275637456616c7565 9050:O4|0,@9051,3,1 9051:O1|@9052 9052:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@9053| 9053:O4|0,@9054,2,2 9054:O1|@9055 9055:D14,176|00802b363b1ab0000e0c000303051aaf0002762b35352c363c1aac000e0c00032a2a691aaa003b1aae000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a86000e0e0e0c00032a2a691a82003b1a86000e0e0e0c00032a2a0e0e0e0c000264291a7b00691a7f002a691a82002a691a85002a691a88002a69322a691a88002a691a8b002a69270f1a8c002a693b3c3b3b2d680565420e0000000000000000a0000000000000000000000000000000|@86,I234,@884,I107,@14441,I253,@887,@871,@9057,@871,@872,@871,@9056,@899| 9056:O2|3,@9059 9057:O2|3,@9058 9058:S8|736f75726365203d 9059:S6|64657374203d 9060:D4,64|00801a43003b1a47000c00031a49005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000000000000030000000000000000000000000000000|@864,@14442,I253,@9061| 9061:D10,152|00802b363b1a98000e0c000303051a9700025e2b35352c363c1a94000e0c00032a2a691a92003b1a96000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a6956773b1a6f000c00032a2a0e0e0e0c000264291a6700691a6b002a691a6e002a69302a69270b1a6c002a693b3c3b3b2d680565420e000000000000000088000000000000000000000000000000|@86,I234,@856,I107,@14301,I253,@869,@871,@872,@873| 9062:O4|0,@9063,3,1 9063:O1|@9064 9064:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@9065| 9065:O4|0,@9066,2,2 9066:O1|@9067 9067:D14,176|00802b363b1ab0000e0c000303051aaf0002762b35352c363c1aac000e0c00032a2a691aaa003b1aae000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a86000e0e0e0c00032a2a691a82003b1a86000e0e0e0c00032a2a0e0e0e0c000264291a7b00691a7f002a691a82002a691a85002a691a88002a69322a691a88002a691a8b002a69270f1a8c002a693b3c3b3b2d680565420e0000000000000000a0000000000000000000000000000000|@86,I234,@884,I107,@14441,I253,@887,@871,@9057,@871,@872,@871,@9056,@899| 9068:O4|0,@9069,3,1 9069:O1|@9070 9070:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@2063,@14298,I253,@9071| 9071:O4|0,@9072,3,1 9072:O1|@9073 9073:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@9074,@14462,I253| 9074:S14|7072696e742d66756e63746f7273 9075:O1|@9076 9076:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 9077:O2|3,@9078 9078:S8|726573496473203d 9079:O2|3,@9080 9080:S17|6d61746368546f417267756d656e74203d 9081:O2|3,@9082 9082:S9|66756c6c4c6f63203d 9083:O2|3,@9084 9084:S8|617267496473203d 9085:O2|3,@9086 9086:S5|617267203d 9087:O5|0,0,0,@9089,@9088 9088:O2|@9092,0 9089:O2|@9090,0 9090:O2|0,@9091 9091:O5|@8409,150,150,0,0 9092:O2|3,@9093 9093:S11|46756e63746f724170706c 9094:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8947,I253| 9095:O5|0,0,0,@9097,@9096 9096:O2|@9100,0 9097:O2|@9098,0 9098:O2|0,@9099 9099:O5|@8409,162,162,0,0 9100:O2|3,@9101 9101:S6|4c6574446563 9102:O1|@9103 9103:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 9104:D4,64|00801a43003b1a47000c00031a49005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000000000000030000000000000000000000000000000|@864,@14442,I253,@9105| 9105:D10,152|00802b363b1a98000e0c000303051a9700025e2b35352c363c1a94000e0c00032a2a691a92003b1a96000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a6956773b1a6f000c00032a2a0e0e0e0c000264291a6700691a6b002a691a6e002a69302a69270b1a6c002a693b3c3b3b2d680565420e000000000000000088000000000000000000000000000000|@86,I234,@856,I107,@14301,I253,@869,@871,@872,@873| 9106:O4|0,@9107,3,1 9107:O1|@9108 9108:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@864,@14442,I253,@9109| 9109:O4|0,@9110,2,2 9110:O1|@9111 9111:D14,176|00802b363b1ab0000e0c000303051aaf0002762b35352c363c1aac000e0c00032a2a691aaa003b1aae000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a86000e0e0e0c00032a2a691a82003b1a86000e0e0e0c00032a2a0e0e0e0c000264291a7b00691a7f002a691a82002a691a85002a691a88002a69322a691a88002a691a8b002a69270f1a8c002a693b3c3b3b2d680565420e0000000000000000a0000000000000000000000000000000|@86,I234,@884,I107,@14441,I253,@887,@871,@9057,@871,@872,@871,@9056,@899| 9112:O2|3,@9113 9113:S5|737472203d 9114:O2|3,@9115 9115:S8|7369674c6f63203d 9116:O2|3,@9117 9117:S11|6f7061717565496473203d 9118:O2|3,@9119 9119:S8|6f7061717565203d 9120:O2|3,@9121 9121:S19|6d61746368546f436f6e73747261696e74203d 9122:O2|3,@9123 9123:S6|63736967203d 9124:O5|0,0,0,@9126,@9125 9125:O2|@9129,0 9126:O2|@9127,0 9127:O2|0,@9128 9128:O5|@8409,169,169,0,0 9129:O2|3,@9130 9130:S13|536967436f6e73747261696e74 9131:D2,48|008056073b1a30000e0c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8947,I253| 9132:D4,64|00801a43003b1a47000c00031a49005627693b2a3d3d6b642a0c0002642c2a2d7d0400020e0e0e0e000000000000000030000000000000000000000000000000|@864,@14442,I253,@9133| 9133:D10,152|00802b363b1a98000e0c000303051a9700025e2b35352c363c1a94000e0c00032a2a691a92003b1a96000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a6956773b1a6f000c00032a2a0e0e0e0c000264291a6700691a6b002a691a6e002a69302a69270b1a6c002a693b3c3b3b2d680565420e000000000000000088000000000000000000000000000000|@86,I234,@856,I107,@14301,I253,@869,@871,@872,@873| 9134:O2|3,@9135 9135:S15|6d61746368546f526573756c74203d 9136:O2|3,@9137 9137:S7|616c697374203d 9138:O5|0,0,0,@9140,@9139 9139:O2|@9143,0 9140:O2|@9141,0 9141:O2|0,@9142 9142:O5|@8409,143,143,0,0 9143:O2|3,@9144 9144:S9|537472756374446563 9145:O4|0,@9146,3,1 9146:O1|@9147 9147:D4,56|00801a3b003b1a3f000c00031a41002a0e0c0002642c2a2d7d0400020e0e0e0e000000000000000028000000000000000000000000000000|@2063,@14298,I253,@9148| 9148:O4|0,@9149,3,1 9149:O1|@9150 9150:D3,48|00801a33003b1a37000c00032c2a2d0e7d0400020e0e0e0e000000000000000020000000000000000000000000000000|@8985,@14457,I253| 9151:O2|@9155,0 9152:O2|@9153,0 9153:O2|0,@9154 9154:O5|@8409,136,136,0,0 9155:O2|3,@9156 9156:S14|5374727563747572654964656e74 9157:O3|@9158,@14461,@14440 9158:D53,760|00802b363c1af8020e0c000303051af7020fda2b3529353b1af5020e0e0c00036403c22b3529362a372e363c1ae9020e0e0c0003293b1ac7020c000303051adf02027e293c1ad0020e0c00032c2a691ad6023b1ada020e0e0e0c00031ad9025687693b2a3d3d6b642a0c0002642a2a0e0e0c0002642c3c1a9e020e0e0e0c00032e2a691aba023b1aa6020e0e0e0c00032a2a0e0e0e0c000264291aab02691aaf022a691ab2022a691ab5022a691ab8022a69312a691ab8022a691abb022a69270d1abc022a693b3c3b3b2d6805293b691ab5022a691ab8022a693b3c3b3b2d6805270a0fdd2b363c1a15020202e9010e0e0c000303051a9f020fce2b3529353c1a0d020e0e0c00036403b22b3529362a372e363c1a01020e0e0c0003293b1adf010c000303051a7702026e293c1ae8010e0c00032c2a691a6e023b1af2010e0e0e0c00032a2a0e0e0e0c0002642c3c1ac6010e0e0e0c00032e2a691a52023b1ace010e0e0e0c00032a2a0e0e0e0c000264291a4302691a47022a691a4a022a691a4d022a691a50022a69312a691a50022a691a53022a69270d1a54022a693b3c3b3b2d6805293b691a4d022a691a50022a693b3c3b3b2d6805270a0fdd2b363c020214011a390102020d010e0e0c000303051a33020fdd2b3529362a372b382f363c1a33010c0003293b1a13010c000303051a1b0202bb293c1a1c010e0c00032d2a6956783b1a27010c00032a2a0e0e0e0c0002642c3c1ae6000e0e0e0c000303051af301026e2c3c1aec000e0c00032e2a691aea013b1af6000e0e0e0c00032a2a0e0e0e0c0002642f3c1aca000e0e0e0c0003322a691ace013b1ad2000e0e0e0c00032a2a0e0e0e0c000264291abf01691ac3012a691ac6012a691ac9012a691acc012a69312a691acc012a691acf012a69270d1ad00102023c002a691acf012a692c2a691acf012a691ad2012a692708020222001acf012a693b3c3b3b2d6805293b691ac8012a691acb012a693b3c3b3b2d6805270b420e0e0e0e0e0e0e0000000000000000e8020000000000000000000000000000|@9160,I234,@1338,I251,I107,@884,@14442,I253,@9161,@14457,@887,@871,@9162,@871,@872,@871,@9164,@899,@871,@9166,@1338,@884,@14449,@14301,@887,@871,@9173,@871,@872,@871,@9175,@899,@871,@9177,@1338,@884,@884,@14460,@14451,@887,@871,@9184,@871,@872,@871,@9186,@871,@872,@871,@9188,@899,@871,@9159| 9159:O5|0,0,0,@9191,@9190 9160:S19|7072696e742d76616c75654d61746368696e67 9161:D10,152|00802b363b1a98000e0c000303051a9700025e2b35352c363c1a94000e0c00032a2a691a92003b1a96000e0e0e0c00032a2a0e0e0e0c0002642f353630363c1a6e000e0e0e0c00032a2a6956773b1a6f000c00032a2a0e0e0e0c000264291a6700691a6b002a691a6e002a69302a69270b1a6c002a693b3c3b3b2d680565420e000000000000000088000000000000000000000000000000|@86,I234,@856,I107,@14301,I253,@869,@871,@872,@873| 9162:O2|3,@9163 9163:S17|736f75726365537472756374757265203d 9164:O2|3,@9165 9165:S15|636f6e74656e74734d61746368203d 9166:O5|0,0,0,@9168,@9167 9167:O2|@9171,0 9168:O2|@9169,0 9169:O2|0,@9170 9170:O5|@8409,121,121,0,0 9171:O2|3,@9172 9172:S14|5374727563747572654d61746368 9173:O2|3,@9174 9174:S12|736f7572636549644e6f203d 9175:O2|3,@9176 9176:S12|6973457175616c697479203d 9177:O5|0,0,0,@9179,@9178 9178:O2|@9182,0 9179:O2|@9180,0 9180:O2|0,@9181 9181:O5|@8409,123,123,0,0 9182:O2|3,@9183 9183:S11|5479706549644d61746368 9184:O2|3,@9185 9185:S12|74617267657454797065203d 9186:O2|3,@9187 9187:S13|736f7572636556616c7565203d 9188:O2|3,@9189 9189:S10|636f657263696f6e203d 9190:O2|@9194,0 9191:O2|@9192,0 9192:O2|0,@9193 9193:O5|@8409,119,119,0,0 9194:O2|3,@9195 9195:S10|56616c75654d61746368 9196:D1,40|00802b352c3656272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@9197| 9197:S33|535452554354555245535f28292e7374727563744578706f727454726565283129 9198:D13,264|00811a0b012c6928092a69291a09010e0e0c000203041a0701103b503b502e352f3630371a01010e0e0c00042a2a691afe002e32326b30353c1afc000e0c0003034d3036313732382c680156972a692d3b1ae4000e0c000303032c020b2c2e1ade000e0e0e0c0003292b1adb000c0003313b1ac3000c0003030329020b29321ace000e0e0e0c00032e2a692708025a30353b1aa3000c0003031a3036040200332b2b1ab3000c00045029352a362a2a6927040235303631371aa5005688692c68012a2a692c2a1a7f000c0003303b1a67000c0003030329020b29311a8a000e0e0e0c00032f2a6927072705430e0e0e0e0000000000000000f8000000000000000000000000000000|@9200,@9201,I105,@1363,@7779,@9203,I251,@9205,@7876,@9207,@7077,@9209,@9199| 9199:O1|@9222 9200:S33|535452554354555245535f28292e7374727563744578706f727454726565283229 9201:D2,40|008056072c1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@9202,@6601| 9202:S48|535452554354555245535f28292e7374727563744578706f727454726565283229636f6d6d6f6e50726f70732d283129 9203:D1,40|00805608561956272d0e0e0e7e030003000000000000000018000000000000000000000000000000|@9204| 9204:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296173506172656e74283129 9205:O1|@9206 9206:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9205| 9207:O1|@9208 9208:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9207| 9209:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@9211,@9210| 9210:O1|@9212 9211:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283129 9212:D10,232|00822c352d362e372f39303a0402002b3c1adc000e0c0003030c2c353d1ad0000e0c000302013b031a2c3629352a362b372c382b2b2b6a296801302a452f4626080206293b452d465029352a361aa8001aad00220e220e220e680521051aa8004521071aaa004521071aac004529344631472d482b492c4a2f4b6c502a220f462e472d482c492a4a2f4b6c502b2a462d472f482b496c503f2a69291a82000e0e0e0c000203041a7f00103b503b502211352212362213371a76000e0e0e0c00042a2a69220e2a69270f440e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@9214,I251,@9215,@9210,@9217,@9219,@9213,I105,@1363,@7779| 9213:D3,72|0080560c3b1a48000e0c00030304560a0202560b561968012a6801292b3b6a29565756683b1a3000330e0e7b06070005000000000000000038000000000000000000000000000000|@9221,I251,@7845| 9214:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229 9215:D1,40|008056085619562a56372e7b05030004000000000000000018000000000000000000000000000000|@9216| 9216:S57|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296578706f727454686973283129 9217:D4,80|0080560a680156193b1a4c000e0c000303041a4b00103b50561935293556386801564768012d2b2b6a292d1a3a00330e7e0900030e0e0e0e000000000000000040000000000000000000000000000000|@9218,I251,@1792,@8838| 9218:S59|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229676574536967537472756374283129 9219:D3,80|0080560c1a51000e0e0c00021a51000e0e0c00020304560a0202560b561968012a68013b2b2b6a2956585667310e0e0e7e0700030e0e0e0e000000000000000040000000000000000000000000000000|@9220,I105,I218| 9220:S55|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f7274534228322967657456616c7565283129 9221:S54|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296765744e616d65283129 9222:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9199| 9223:O1|@9224 9224:D16,448|00812c3529291abf010c00021ac1010e0e0c0002036929352a362a353c1ab8010e0c000303043b50024b2a353b1aa8010e0c000303332a3629291a8b010c00021a8d010e0e0c0002031a29352a362a36291a8c010e0c0002502a250426031e25260302023b5051020c2a36291a79010e0e0c000251292503511e743b6502013b643c28403b1a68010e0c00041a69012a690402001a69012e2b332e1a6a010e0e0e0c00065029352e3b2a1a1b010c00021a1d010e0e0c000203352a352b362a1a4e010e0e0e0c00022c3b1a0b010c0003030329020b292d1a3e010e0e0e0c00032b2a2506250626041e3f3b270402012965293b2a1ad1000e0e0c00021ad1000e0e0c000203152a352b362a2c692a2a2505250526031e223b6602012965280e2a3b6a2a291aa1000e0e0c00021aa1000e0e0c0002031d29352a362a353d1a98000e0c00030309292503511e273b02013b6502013c64030b291ac5000e0e0c00020201292d3b1a70000e0c00030303290204402e2b6a313b1aae000e0e0e0c0003323b1aa3000c0003293b1aa3000c0003343b2b1aa2000e0e0e0c0004502c2c69270e430e0e0e0e0e0000000000000000b0010000000000000000000000000000|@9226,I105,I218,I251,@9227,@9228,I11,@9316,@9318,@9322,@11125,@9225,@2349,I253,I106,I255| 9225:O1|@11136 9226:S31|535452554354555245535f28292e67656e636f646553747275637473283229 9227:O2|@9229,@9228 9228:O2|@9235,@9227 9229:D4,152|00802b353d1a98000e0c0003030e2b362935292c2e0e0e0e7d0500022b353c1a7e000e0e0e0c000303162b362c372a2c0e0c0002502956371a6d002f7e0500032b353b1a5a000e0e0e0c0003030e2b362935292c2e0e0e0e7d0500022b353e1a3e000e0e0e0c0003030e2b362956271a3e002e0e7e0400033b420e0e0e0e0e0e000000000000000088000000000000000000000000000000|@9231,I251,@9232,@9230| 9230:O1|@9234 9231:S53|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e53747275637456616c7565283129 9232:O1|@9233 9233:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203162c352d36292e1a41000e0e0c00032b2f2f0e7d0700023b430e0e000000000000000038000000000000000000000000000000|@1746,I105,I218,@9232| 9234:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203162c352d36292e1a41000e0e0c00032b2f2f0e7d0700023b430e0e000000000000000038000000000000000000000000000000|@1746,I105,I218,@9230| 9235:D7,144|00802b353c1a90000e0c0003031a2b362c372a2c1a89000e0e0c000350292c1a86002f0e7e0500032b353b1a6a000e0e0e0c0003030e2b36291a74002d0e0e0e7d0400022b3729291a6d000e0e0c00021a6d000e0e0c0002031929352a362a3756570e0e0e0c000250292503511e263b6502013b65420e0e000000000000000080000000000000000000000000000000|@9237,I251,@9238,@9240,@9236,I105,I218| 9236:O1|@9242 9237:S51|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e537472756374446563283129 9238:O1|@9239 9239:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203162c352d36292e1a41000e0e0c00032b2f2f0e7d0700023b430e0e000000000000000038000000000000000000000000000000|@1746,I105,I218,@9238| 9240:O1|@9241 9241:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203162c352d36292e1a41000e0e0c00032b2f2f0e7d0700023b430e0e000000000000000038000000000000000000000000000000|@1746,I105,I218,@9240| 9242:D15,1312|00802b350a1e007d02cd006102e5003802f5013e003e003e003e008901c001d90245013e0080003e004d003e0091023e00b40041003e003e0005023e003e00e0032e013e003b0fd62b36291ada042d0e7d0400022b3729291ad5040e0e0c00021ad5040e0e0c0002031929352a362a1ab6040e0e0e0c000250292503511e263b6502013b650fcf2b3829291aa2040e0e0e0c00021aa1040e0e0c0002031929352a362a381a81040e0e0c000250292503511e273b6502013b650fdb2b362c372a1a65040e0e0c000250291a5b042e0e0e7d0500022b362c372a1a4c040e0c000250291a43042e0e0e7d0500022b3629352a362a1a32040e0e0e0c00025029291a2e040e0e0e0c00021a2d040e0e0c0002031e29352a362a35291a0c040202e7030e0c0002502a250426031e2c3b6602013b27040fd02b362c37291aeb030c0002502a1ae3032e0e0e7d0500022b362c372a1ad4030202af030e0c00025029291ace030e0e0e0c00021acd030e0e0c0002031a29352a362a35291aac030e0c0002502a250426031e283b6602013b660fd02b36292902026f031a95030e0e0c00021a95030e0e0c0002031929352a362a351a75030e0e0c000250292503511e2a3b6502013b650fcb2b3729291a62030e0e0e0c00021a61030e0e0c0002031a29352a362a35291a40030e0c0002502a250426031e283b6602013b650fdb2b37291a26032d020200030e7d0400022b3629291a1d030e0e0c00021a1d030e0e0c0002031929352a362a1afe020e0e0e0c000250292503511e263b6502013b650fce2b3629352a362b372b1add020e0e0c000250291ad3020c0002502a1acb02300202a5020e0e7d0700022b3629352a362a1ab6020e0e0e0c000250291aab022f0e0e7d0600022b362935291a9c021ab1022f020273027e0500032b3629352a362a291a8d020e0e0c00021a8d020e0e0c0002031829352a362a351a6d020e0e0c000250292503511e265102023b5050291a57021a74023002022e020e0e0e7e0600032b36291a6a020e0e0e0c0002293b2a1a3e020e0e0e0c00021a3d020e0e0c000203202a352b362a2c1a4d020202f8010e0e0c00032a2a2505250526031e2e3b660201296529291a07020c00021a09020e0e0c0002035829352a362a352b36293b1a1d020e0e0c00032b352c3628062b2b6a2c1a13020c00021a15020e0e0c00022a2a1a13020c0003293b1a13020c00031ac5010e0e0c0002270503041a0902103b502c250626051e623b270502013b642c291a9b010c00021a9d010e0e0c0002034029352a362a3629291a83010c00021a85010e0e0c0002031a29352a362a36291a64010e0c0002502a250426031e25260302023b50502a250426031e4b3b6602013b27050fcc2b36293b2a1a41010e0e0c00021a41010e0e0c000203352a352b362a38293b1a57010c00032d3b1a6f010c0003030329020b292e1a72010e0e0e0c00032c2a2507250726051e413b270502012965293b2a1af5000e0e0c00021af5000e0e0c0002031c2a352b362a2c1a05010e0e0c00032a2a2505250526031e293b660201296529291ac3000c00021ac5000e0e0c0002035c29352a362a352b36293b1ad9000e0e0c00032b352c3628062b2b6a2c1acf000c00021ad1000e0e0c00022a2a1acf000c0003293b1acf00020252000c00031a7d000e0e0c0002270503041ac100103b502c250626051e663b270502013b642c291a53000c00021a55000e0e0c0002031a29352a362a36291a34000e0c0002502a250426031e253b6602013b270542000000000000000010050000000000000000000000000000|@9244,@9236,I105,I218,@9245,@9247,@9249,@9251,I253,@9279,@9281,@1326,I251,@9312,@9243| 9243:O1|@9315 9244:S59|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c54797065732832296c6561737447656e457870283129 9245:O1|@9246 9246:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031a2c352d36292e1a49000e0e0c00032b352930300e0e0e7d0800023b430e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1746,I105,I218,@9245| 9247:O1|@9248 9248:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031a2c352d36292e1a49000e0e0c00032b352930300e0e0e7d0800023b430e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1746,I105,I218,@9247| 9249:O1|@9250 9250:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a37293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@9249| 9251:O1|@9252 9252:D11,152|00812c382d2306293b1a94000e0c000303041a9300103b502935293b1a91000e0e0c0003292d1a8f000c0003291a90000e0c00020402002f1a8d002b1a91000e0e0c0004502936291a8d000e0e0c0002292d220d1a89000e0e0c0004220c3b1a3e000e0e0e0c0003030329020f29220d1a7500220e0e0e0e7e0e0003270a430e000000000000000088000000000000000000000000000000|@9254,I251,@1792,I253,@9255,@9261,@9268,@1414,@2262,@9271,@9253| 9253:O1|@9278 9254:S91|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e6365283229 9255:O1|@9256 9256:D10,160|00812c1aa2000e0e0e0c00021aa1000e0e0c000203692c352d360402002e1a97002b1a9b000c00045029352a36291a97000c00022b2f1a97000c0003293b1a97000c00031a69000e0e0c0002640320040200321a8a002b1a66000e0e0e0c0004502936291a61000e0e0c0002650201292e331a73000c00032a2a69270802013b430e0e0e0e0e0e0e000000000000000090000000000000000000000000000000|@1399,I105,I218,@9258,@1414,@7142,@1326,I251,@9257,@9255| 9257:O1|@9260 9258:O1|@9259 9259:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 9260:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 9261:O1|@9262 9262:D5,88|00802b3b1a59000e0e0c000303033b022c2b35293b1a48000e0c000303033b021b2c1a43000c00022d1a44000e0c00021a45000e0e0c00022a2a696564420e0e000000000000000048000000000000000000000000000000|@9264,I251,@9265,@9263,@9261| 9263:O1|@9267 9264:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832297472616e73706f7365283129 9265:O1|@9266 9266:D5,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a1a52000e0e0e0c00021a51000e0e0c000203043b5002041a4b00102a352a1a4c000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@1712,@9265| 9267:D5,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a1a52000e0e0e0c00021a51000e0e0c000203043b5002041a4b00102a362a1a4c000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@1715,@9263| 9268:O1|@9269 9269:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@9270| 9270:S107|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296f726967696e616c566172732d283129 9271:O1|@9272 9272:D5,112|00822d1a72000e0e0e0c00021a71000e0e0c000203142c1a5e000e0e0e0c00021a5d000e0e0c000202013b03262d352e362e352f362c2b311a4d000e0e0c00042c2b321a4a000e0e0e0c00042a2a69270602013b440e0e0e000000000000000060000000000000000000000000000000|@3592,I105,I218,@9273,@9271| 9273:O1|@9274 9274:D8,176|00822b291ab1000e0e0c00021ab1000e0e0c0002032429352a362a35293532352a2a1aa3000c00036603052a68010207292503511e313b6502013b64291a78000e0c00021a79000e0e0c0002033829352936293b1a79000e0e0c0003293b1a67000c0003030330020b302a1a6a000e0e0e0c00032b3b2b1a66000e0e0e0c0004502c2704020e3c28402f1a5b000c00042f2a696464440e0e0000000000000000a0000000000000000000000000000000|@9276,I105,I218,I251,I253,@9275,I255,I11| 9275:O1|@9277 9276:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296d6572676556617273283229 9277:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9275| 9278:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9253| 9279:O1|@9280 9280:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9279| 9281:O2|@9282,@2315 9282:D21,1056|00802b1a22040e0e0e0c00021a21040e0e0c000207d32b352c362a293528051a16040e0e0e0c0003035f29362a382937293629353d1a00040e0c00036503462937293629353d1aef030c000303043b5002041aeb03103b5029362a372a2f1ae7030c00031ae9032a690402002c2b2b1ae6030e0e0e0c000450293527072503511e653b02012b650257293528061aa8030e0c000303492936293b1ac3030c000329353f1a92030e0e0e0c000303172b3b56770e0e0e0c0003293528053b2b2d3b680565021729353c1a6d030e0e0c000303032b0207292503511ebe3b650201296429353e1a5103020214030e0e0c000307cc29362a372929353b1a3b030c00030304293702122936293b1a53030c0003292503511e1d3b656403b42c56672c1a46030e0e0e0c00043b2a291afa020e0e0e0c00021af9020e0e0c0002031729362b3c1a2b030c0003292b25042504511e253b6502012a653b2f291acb020c00021acd020e0e0c0002031729362b3c1aff020c0003292b25042504511e223b6502012a652a2a1af0020e0c00036503242b1aed020e0e0c0002292b6964301ae8020e0c00032c2a1ae7020c00033e2a2e6a6502193c28401adf021ae402020227000e0c000428062a1ade026a646402153c28401ac3021ac8020e0c000428062a1ac6026a64650fdd29353d1a4b020c000303b529362a372c56671ab4020e0c00033b2a291a22020e0e0e0c00021a21020e0e0c0002031729362b3c1a53020c0003292b25042504511e253b6502012a653b2f291af3010c00021af5010e0e0c0002031729362b3c1a27020c0003292b25042504511e223b6502012a652a2a1a18020e0c00036503290402002a2a1a49020e0e0c00035029352a362e2b69330c00022e2b69340e0c00023d2b2b6a270502143c28401a02021a07020c000428062a1a06026a64660fd6293528051a8a010e0e0e0c000307c929362a372b382c392a3729350202360129353c1a6c010e0c000303d53b2f291a50010e0c00021a51010e0e0c0002031729362b3c1a83010c0003292b25042504511e233b6502012a65312c2b56d71ab9010e0e0c00053b2a291a16010e0e0e0c00021a15010e0e0c0002031729362b3c1a47010c0003292b25042504511e253b6502012a653b34291ae7000c00021ae9000e0e0c0002031729362b3c1a1b010c0003292b25042504511e223b6502012a652a2a1a0c010e0c000365031c302a69220c1a0d0102047d003f000c000328052a32323268056402153c28401a03011a08010e0c000428062a1a06016a646502153c28401aeb001af0000e0c000428062a1aee006a642706023c293528061a71000e0e0c000303183c28401ac4001ac9000e0e0c000428062a1ac6006a6402163c28401aac001ab1000e0e0c000428062a1aae006a646602031a9600420e0e0e0e0e000000000000000010040000000000000000000000000000|@9284,I105,I218,I251,@1731,@1734,@9285,@1414,I253,@9286,I106,I113,@9291,@9293,@9302,@588,I11,79992,@9304,@3360,@9283| 9283:O1|@9307 9284:S27|545950455f5452454528292e6c6561737447656e6572616c283129 9285:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9286:O1|@9287 9287:D14,504|00822d1afa010e0e0e0c00021af9010e0e0c000207cf2d352e362a293528051aee010e0e0e0c0003035f29362a382937293629353d1ad8010e0c00036503462937293629353d1ac7010c000303043b5002041ac301103b5029362a372a2f1abf010c00031ac1012a690402002c2b2b1abe010e0e0e0c000450293527072503511e653b02012b650253293528061a80010e0c000303452936293b1a9b010c000329353f1a6a010e0e0e0c000303132b3b330c0003293528053b2b2d3b680565021729353c1a49010e0e0c000303032b0207292503511eba3b650201296429353e1a2d010202f4000e0e0c000303c029362f2a2a3b1a19010e0e0c0003030c293b1a0d010e0e0c0003028f2a352b362b1aee000e0e0e0c00021aed000e0e0c000203752b352c362c352b352a2a1ae1000e0e0c000303033c024a2a1ac3000c00021ac5000e0e0c00020314291ab2000e0e0e0c00021ab1000e0e0c000202013b03212a3b2b3b28082e1ad5000e0e0c00021ad5000e0e0c00031ad5000e0e0c000602013b65030d2b2a2506250626041e9c3b02013b6502013b6565030e291ab8000e0c00022968016402013b6402013b293b1a5c000e0c0003030e2b31311aa000320e0e7b0509000429352c32321a90000e0c00042a2a69270602013b440e0e0e0000000000000000e8010000000000000000000000000000|@4144,I105,I218,I251,@1731,@1734,@9289,@1414,I253,I223,I239,I154,@9288,@9286| 9288:O1|@9290 9289:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9290:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a362a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9288| 9291:O1|@9292 9292:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a362a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9291| 9293:O1|@9294 9294:D8,112|00812c1a72000e0e0e0c00021a71000e0e0c000203043b5002041a6b00103b502c35293b1a69000e0e0c000303033b021f2d1a63000c00022d0c00022e1a60000e0c00022e1a60000e0c00032a2a696564430e0e0e0e0e0e000000000000000060000000000000000000000000000000|@9296,I105,I218,@9297,I251,@9299,@9295,@9293| 9295:O1|@9301 9296:S39|545950455f5452454528292e6c6561737447656e6572616c2831296c6561737441726773283129 9297:O4|@14358,@1714,0,@9298 9298:O5|@1349,3041,0,3041,0 9299:O1|@9300 9300:D5,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a1a52000e0e0e0c00021a51000e0e0c000203043b5002041a4b00102a352a1a4c000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@1712,@9299| 9301:D5,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a1a52000e0e0e0c00021a51000e0e0c000203043b5002041a4b00102a362a1a4c000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@1715,@9295| 9302:O1|@9303 9303:D4,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203142b1a56000e0e0e0c00021a55000e0e0c000202013b031e2c352d362d352e362c35292c692d2c1a41000e0e0c00032a2a69270702013b430e0e0e000000000000000058000000000000000000000000000000|@3592,I105,I218,@9302| 9304:O1|@9305 9305:D10,320|00812c1a42010e0e0e0c00021a41010e0e0c000207cf2c352d362a293528051a36010e0e0e0c0003035f29362a382937293629353d1a20010e0c00036503462937293629353d1a0f010c000303043b5002041a0b01103b5029362a372a2f1a07010c00031a09012a690402002c2b2b1a06010e0e0e0c000450293527072503511e653b02012b650253293528061ac8000e0c000303452936293b1ae3000c000329353f1ab2000e0e0e0c000303132b3b320c0003293528053b2b2d3b680565021729353c1a91000e0e0c000303032b0207292503511eba3b650201296429353d1a750002023c000e0e0c0003030d29362a372a2a692968016602013b293b1a57000c0003030a2b301a7d00317e08000329352c311a71000e0e0c00032a2a69270602013b430e0e0e000000000000000030010000000000000000000000000000|@4144,I105,I218,I251,@1731,@1734,@9306,@1414,I253,@9304| 9306:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9307:D11,312|00832e1a3a010e0e0e0c00021a39010e0e0c000207ce2e352f362a293528051a2e010e0e0e0c0003035f29362a382937293629353d1a18010e0c00036503462937293629353d1a07010c000303043b5002041a0301103b5029362a372a2f1aff000c00031a01012a690402002c2b2b1afe000e0e0e0c000450293527072503511e653b02012b650253293528061ac0000e0c000303452936293b1adb000c000329353f1aaa000e0e0e0c000303132b3b320c0003293528053b2b2d3b680565021729353c1a89000e0e0c000303032b0207292503511eba3b650201296430301a9e00020231000e0e0e0c0004293b1a5f000c0003030e2a3131311a8b00320e7b0609000529352b3232321a7b000c00052a2a69270502013b1f040e0e0e0e0e0e000000000000000028010000000000000000000000000000|@4144,I105,I218,I251,@1731,@1734,@9309,@1414,I253,@9308,@9283| 9308:O1|@9310 9309:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9310:D6,240|00822d3528051aef000c000303c12d362e3829372f3629353c1adc000e0c000303112a3629353c1ace000e0e0e0c00036402013b6403152f3629362b3629362b2a1ab4000e0c0003270402392f3629353b1aa4000e0c000303112a3629353b1a96000e0e0e0c00036402013b6403152f3629382b3629382b2a1a84000e0c0003270402013b64033b3b2b291a7a000e0e0e0c00021a79000e0e0c0002031729362b3c1a73000c0003292b25042504511e253b6502012a65292f1a44000e0c00036402013b03052a680102013b6502013b440e0e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@9311,I251,I113,I105,I218,I106| 9311:S44|545950455f5452454528292e6c6561737447656e6572616c28312967657454797065436f6e73747273283129 9312:O4|@14322,@596,@9314,@9313 9313:O5|@7096,2206,0,2206,0 9314:S36|72656475636554797065733a20556e61626c6520746f2073657420747970652076617273 9315:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9243| 9316:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@9317,I253,I106,I255| 9317:S40|535452554354555245535f28292e67656e636f6465537472756374732832296d6b41646472283129 9318:O3|@9319,@6045,0 9319:O1|@9320 9320:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@9321,@542| 9321:S37|44454255474745525f28292e696e697469616c44656275676765725374617475732d283129 9322:O1|@9323 9323:D7,144|00842e1a92000e0e0e0c00021a91000e0e0c000203542e352f360402002b33302c331a83000c00065029352a360402002a2e2b220c220c1a76000e0e0e0c00065029352a362a3b1a6e000e0e0e0c000303032d020b2d2b1a66000e0e0e0c0003220d2a452b46270902052d3b4530461f050e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@9325,I105,I218,@9326,@9322,I251,@9324| 9324:O1|@11124 9325:S43|535452554354555245535f28292e67656e636f6465537472756374732832296d6170506169722833292829 9326:O1|@9327 9327:D15,272|00842f353c1a10010e0c000303072c3b452f460fcb2f353b1afd000e0e0c000303122f362f2a2f2f321af400310e0e7b070800062f363c28403b1aeb000c0004291aec00311af0006b293b692c3b690402001aeb002b220d220d1ad300303b1ae6003122111ae8000e0c000b5029352a362d1ae3000c00021ae5000e0e0c000203043b5002041adf00102f3b1ae1000e0e0c0003291ae0000e0c0002293b2a1ab6000e0e0e0c00021ab5000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1a4a000e0e0e0c0003030329020f292e1aa20002020e000e0e0e0c0003220f2a452e46270c1f050e0e0e0e0e0e000000000000000000010000000000000000000000000000|@9329,I251,@9330,I11,@2249,@473,I48,@11120,@9627,I105,I218,@2773,I253,@2776,@9328| 9328:O1|@11123 9329:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329 9330:O1|@9331 9331:D7,144|00842e1a92000e0e0e0c00021a91000e0e0c000203542e352f360402002b332b32321a83000c00065029352a360402002a2e2b220c220c1a76000e0e0e0c00065029352a362a3b1a6e000e0e0e0c000303032d020b2d2b1a66000e0e0e0c0003220d2a452b46270902052d3b4530461f050e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@9325,I105,I218,@9333,@9330,I251,@9332| 9332:O1|@11119 9333:O1|@9334 9334:D37,1192|00842f39293b1aa7040c0003312309293b1a9c040e0c000333352936220c36220d38220e3a220f23082210230a2211230b2f3b1a7a040e0e0e0c0003293b1a77040c000303041a7704103b5029353c28403c1a73040c00041a75042a693c28403b1a64040e0c00041a6d042a693c2a2c6a2e3629353d1a3f040c000303043b5002041a5b041029362a37303b1a21040e0e0c0003313b1a17040c0003293c1a47040c0003333b2b1a46040e0e0e0c0004502d3b2d1a39040e0e0c0004502c3b311a2d040e0e0c00045022103b1ae1030e0e0c0003293b1adf030c000303041a1704103b502935220d372937292223220c222322111a09040e0e0c000629352a3622153b1aaa030e0e0e0c0003292b2210222722151af1030e0e0c000629352a363c28403b1aa1030e0e0c000429221322171adc036b293b69221d3b1a72030e0e0e0c0003292e2217222e221c2f1ac8030e0c000729352a36221f3b1a52030e0e0e0c0003292b221b223222201ab1030e0e0c000629352a362a3b1a3b030c000303032e020b2e2b1a9e030e0e0e0c0003293b1a23030c00030304220d020a220d2a1a8c030e0c0003293b1a0b030c000303042212020a22122a1a7c030e0c0003222a1a7b031a80030e0c0003040200222d2b30222722252e223d1a73030c00085029352a362922331a6d032229222722396b22292227223e1a65030e0e0c0007223a230d29291a5f030c00021a61030e0e0c0002032429352a362a35291a58031a95020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a77020c000303691a3703291a1b030c00021a1d030e0e0c0002032429352a362a35291a14031a51020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a33020c000303041afb02103b50293529351ae1021a1e020e0e0e0c000303043b5002041ae70210293765021a293529351ac2021aff010c000303043b5002041acb02102937646503ba3c3b22221ac5026b2c3b1adf010c000303032f020b2f2d1aba020e0e0e0c00032a2a69293b1ac4010e0c000303032c0204402a2e6a222a3b1aa9010e0e0c0003293b2a1a56020e0e0e0c00021a55020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a68020e0c0002222f3b1a66010e0e0e0c000322303b1a5a010e0e0e0c0003293b1a87010c000322323b2b1a85010e0e0c0004502f3c223b2f2f6805270a1a32020e0e0e0c000202ba3c3b22221a0b026b2c3b1a25010e0e0c000303032f020b2f2d1a16020e0e0e0c00032a2a69293b1a08010e0c000303032c0204402a2e6a222a3b1aed000e0e0c0003293b2a1a9a010e0e0e0c00021a99010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aac010e0c0002222f3b1aaa000e0e0e0c000322303b1a9e000e0e0e0c0003293b1acb000c000322323b2b1ac9000e0e0c0004502f3c223b2f2f6805270a1a86010e0e0e0c00023c223b0e0e0c0002221e3729353d1a67000c000303043b5002041a83001029362a372a3b2e1a88000e0c000450293b1a56011a7b000c0004503c3b2e306b293b6922422a45224446273e1f050e0e0e0e000000000000000098040000000000000000000000000000|@9336,I253,I251,@1792,I11,@9337,@9339,@9340,I106,I255,@1792,@9342,@9366,@473,@9382,@9608,@9620,@9622,@9624,@8763,@122,@9626,@11090,@9716,I105,I218,@14390,@2781,@2836,@1576,@472,@11091,@2330,@11093,@11114,@9335,@2249| 9335:O1|@11116 9336:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e64283229 9337:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@9338,I253,I106,I255| 9338:S72|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e642832296d6b41646472283129 9339:D11,192|00802b352c362d372a3b1abb000c000303041abb00103b502a3b1abb000c0003034e2a3c1ab9000e0e0c0003293b1ab7000c0003030c2a3b1ab5000e0e0c000302013b03043b5002041aac00102c3b1a76000e0e0e0c000303041aa300103b503d2d692956671a9f00320e0e7e0800032903162b3b1a50000e0c000303041a8f00103b503b2c6902162b3b1a3a000e0e0e0c000303041a7700103b503d2c6966420e0e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@2319,I234,@2320,I233,I107,I113,I251,@2254,@2252,@2323,@2318| 9340:O4|101,@1426,0,@9341 9341:O5|@1380,509,0,509,0 9342:O1|@9343 9343:D10,296|00842c230d29291a26010e0e0e0c00021a25010e0e0c0002032429352a362a35291a1c011a21010e0e0c00036403052a68010207292503511e323b6502013b64293b1a03010c000303691a0301291adf000c00021ae1000e0e0c0002032429352a362a35291ad8001add000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1abf000c000303041ac700103b50293529351aa5001aaa000e0e0e0c000303043b5002041ab30010293765021a293529351a86001a8b000c000303043b5002041a970010293764651a67000c000203053b2f69022f04020030302b31301a82000e0e0e0c00065029352a360402002b2b33322d1a74000e0c00065029352a362a2a6927061f050e0e0e0e000000000000000018010000000000000000000000000000|@9345,I105,I218,@14402,I251,@2781,@2836,@1576,@9346,@9344| 9344:O1|@9357 9345:S37|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529 9346:O1|@9347 9347:D15,464|00842f3b1ad1010e0e0c000303072d3b452f460fd02f3530363035313632372d3529353b1ab1010e0e0c0003030d293628061aab012b3b6b64020e2e3529341aa6010e0e0e0c000364332e0e0e0c0002293b692b2a69280e2a3c6a2a291a90010e0c00021a91010e0e0c0002031d29352a362a353d1a60010e0c00030309292503511e263b02013b6502013c64030b291a6d010e0e0c00020201290402002a353d1a34010e0c0003030d1a5b012b692a3b452a4651021f3c22100e0e0e0c00021a4d012a22136a3c3b2c2f6b293b692d2a452c46260529352a36220e3629353b1af5000202c9000e0e0c00030377293622103722113629353d1adc000e0c000303041a1301103b5029353b1aca000e0e0e0c00030322293729353c1aba000e0e0e0c0003030d2936293b1af3000c0003640202293664020d2936293b1ae1000e0e0c0003643c28402b1adc000e0c00043c2a2f3b6b1ad8002a2f6a28052a22186a270702072805221022116a29220d692c220f2b6a04020022122b2b221a221a1ab5000e0e0c00065029352a362a3b1a46000e0e0e0c0003030331020b312b1a9e000e0e0e0c0003221b2a452b4627171f050e0e0e0e0e0e0000000000000000c0010000000000000000000000000000|@9349,I251,@472,@9350,I105,I218,@2349,@9352,@9354,@1377,I253,I11,@694,@9346,@9348| 9348:O1|@9356 9349:S47|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529666f6c64496473283229 9350:O1|@9351 9351:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9350,@2288,I253,I107,@2286| 9352:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9353:S29|434f44455452454528292e6d756c7469706c6555736573283329283129 9354:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9355:S35|434f44455452454528292e6d756c7469706c65557365732833296c6f6164466e283129 9356:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9348| 9357:D10,280|00842e352f373b1a16010e0e0e0c00023e2a1a13013c6b3c310c00023c3b2b2d6b293b693d2f3b6a220c35220d36220e352b2a1afa000e0e0e0c0003302a3b6a642b0e0e0e0c00023f2a692e3b691ae7002a692b2a69291ac6000e0e0e0c00023e2a1adb003c6b3d2a69221722130e0e0e0c0002221835221936221a352b2a1aae000e0e0e0c000322132a3b6a642b0e0e0c00023f2a692e3b691aab002a692b2a69291a7a000e0e0e0c00023e2a1a8f003c6b3d2a69293b69220d2a69293b1a8e000e0e0e0c00030304221a020a221a2a1a84000e0c0003293b1a73000c000303042228020a22282a1a74000e0c000322252a4522294627231f050e0e0e0e0e000000000000000008010000000000000000000000000000|@9359,@2273,@9360,I107,@719,@9361,@9362,I251,@9363,@9358| 9358:O1|@9365 9359:S26|44454255474745525f28292e7570646174655374617465283429 9360:O3|2,I72,0 9361:O3|2,I255,0 9362:O3|2,7,0 9363:O1|@9364 9364:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9363| 9365:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9358| 9366:O1|@9367 9367:D10,344|00842c230d29291a56010e0e0e0c00021a55010e0e0c0002032429352a362a35291a4c011a51010e0e0c00036403052a68010207292503511e323b6502013b64293b1a33010c000303691a3301291a0f010c00021a11010e0e0c0002032429352a362a35291a08011a0d010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aef000c000303041af700103b50293529351ad5001ada000e0e0e0c000303043b5002041ae30010293765021a293529351ab6001abb000c000303043b5002041ac700102937646503643b2f69040200312b2a1a84000e0c00021a85000e0e0c000203202a352b362a2c220c341aa2000e0e0e0c00052a2a2505250526031e2c26030209292c2a35452a3646515129352a360402002b2b34332d1a7d000e0e0c00065029352a362a2a69270702033b2f691f050e0e0e0e0e0e0e000000000000000048010000000000000000000000000000|@9369,I105,I218,@14402,I251,@2781,@2836,@1576,@9368,@9344| 9368:O1|@9370 9369:S37|44454255474745525f28292e6d616b655374727563744465627567456e7472696573283529 9370:D9,248|00832e352f3730383035313629352a362b37220d220c1ae7000c0003220c2d0e0e0c0002293b692b2a69280e2a3c6a2a291ad4000e0c00021ad5000e0e0c0002031d29352a362a353d1acc000e0c00030309292503511e263b02013b6502013c64030b291ab9000e0e0c00020201290402002a353d1aa0000e0c0003030d1aa7002b692a3b452a4651021f3c22120e0e0e0c00021a99002a22156a3c3b2c2f6b293b692d2a452c46260529352a363e2211221122116b2b3b1a5d000e0e0c00030304220e020a220e2c1a6c000e0c00032a220c692c220e2b6a2b2a6927151f040000000000000000e8000000000000000000000000000000|@9372,@9373,I105,I218,I251,@2349,@9379,@9380,@9371| 9371:O1|@9381 9372:S50|44454255474745525f28292e6d616b655374727563744465627567456e74726965732835296c6f6164537472756374283229 9373:O1|@9374 9374:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9373,@2288,I253,I107,@9375| 9375:O4|@14322,@596,@2311,@9377 9376:S27|56414c55455f4f505328292e636f64655374727563742832292829 9377:O5|@9378,707,0,707,0 9378:S32|6d6c736f757263652f4d4c436f6d70696c65722f56414c55455f4f50532e4d4c 9379:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9380:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9381:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9371| 9382:O1|@9383 9383:D10,344|00852d230d29291a56010e0e0e0c00021a55010e0e0c0002032429352a362a35291a4c011a51010e0e0c00036403052a68010207292503511e323b6502013b64293b1a33010c000303691a3301291a0f010c00021a11010e0e0c0002032429352a362a35291a08011a0d010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aef000c000303041af700103b50293529351ad5001ada000e0e0e0c000303043b5002041ae30010293765021a293529351ab6001abb000c000303043b5002041ac700102937646503683b3069040200322b2a1a84000e0c00021a85000e0e0c000203242a352b362a2c220d34220e220e1a9e000e0e0e0c00072a2a2505250526031e3026030209292c2a35452a3646515129352a360402002b2b220c342d1a78000e0c00065029352a362a2a69270702033b30691f060e0e0e000000000000000048010000000000000000000000000000|@9385,I105,I218,@14402,I251,@2781,@2836,@1576,@9384,@9344| 9384:O1|@9386 9385:S34|44454255474745525f28292e6d616b6556616c4465627567456e7472696573283629 9386:D10,336|00852f35303629352a362b37220c34343b220c1a42011a47010c0007342d0e0e0e0c0002293b692b2a69280e2a3c6a2a291a34010e0c00021a35010e0e0c0002031d29352a362a353d1a2c010e0c00030309292503511e263b02013b6502013c64030b291a19010e0e0c00020201290402002a353d1a00010e0c0003030d1a07012b692a3b452a4651021f3c220f0e0e0e0c00021af9002a22146a3c3b2c2f6b293b692d2a452c46260529352a36221536291ab3000c00021ab5000e0e0c0002031c29352a36221835221938221a392b2b2f2f2d680528062a692706022d293b1a95000e0e0c000303112216352217382218393c2c2c2c6b66021022163522173822183928072c2c2c6b662c3b1a68000e0c00030304220f020a220f2d1a78000e0c00032a220d692d220f2b6a2b2a6927131f060e0e0e0e000000000000000040010000000000000000000000000000|@9388,@6045,@9389,I105,I218,I251,@2349,@9605,@9606,@9387| 9387:O1|@9607 9388:S44|44454255474745525f28292e6d616b6556616c4465627567456e74726965732836296c6f6164566172283229 9389:O2|@9391,@9390 9390:O2|@9540,@9389 9391:D110,3360|0085303729353e1a1e0d0e0e0e0c000307d62936290a08001200b5001200b00031050406120044071200313532363c28403b1afb0c0c00041afd0c2a2c6a2c3c1afd0c0e0e0c0003292b2d6a220f1af70c2b221022102210221056f70e0c00082d3b1aeb0c0c0003293b2a1aea0c0e0e0e0c00021ae90c0e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291acc0c0e0c0002291acc0c0e0c00023c1acc0c1ad10c0e0e0c00032e1ad00c3b2d2d3c3b3c680828072a69270d0fdd1ac50c0fda2f1a870c0c00021a890c0e0e0c000207d02f353036291a720c0202e3090e0e0e0c00021a6d0c0e0e0c0002030d2936293b1a270c0c00036402013b03043b5002041a870c10293529352c353c28401a820c1a0f0c0c000428062a1a7e0c6a2b1a810c0e0e0c0002291a200c0e0c00021a210c0e0e0c000203c6293529362a37291a680c1a2d0c0e0e0c0003291afc0b0e0c00021afd0b0e0e0c0002036729352a36293b1ab50b0e0e0c000303272a1a420c69293c1a440c0e0c0003291a440c0e0c00023b2a3c6a3e2c2b6a3d2a220e6a2705022d2b310204230921091a2c0c02026e030e0c0003293c1a0f0c0c0003291a100c0e0c00023b2a3c6a3e2c2b6a27046502031a0c0c3d32316a3d342b6a2e353b221569293b692805302d342d68053d2a220e6a3d312b6a2f2a1aed0b221d221d1aee0b1af30b0c0007270d02013b2a3b1a160b0e0e0e0c000303051ae30b0fca2a3529352a37293b1ade0b0e0e0e0c0003035a1adb0b1ae00b0e0c00023e2a1adf0b3c6b1ae20b1acf0b0c00023e2a2c3c6b1adc0b1ac10b0e0e0c00023e2a2c3c6b1ad40b1a090b0e0e0c00023c1ad00b1a0d0b0e0e0c00032b1acc0b3b2d2d3c3b3c680828072a6927090fd4293c1a770b0c000303051ab70b025c291ab90b1ade0a0e0e0e0c0003280e2a3b6a2a291aa60a0e0e0e0c00021aa50a0e0e0c0002031d29352a362a353d1a5c0a0e0c00030309292503511e283b02013b6502013c64030f291a790b02022f020e0e0c0002020129293b69661a6e0b1a1b0b0c00023e2a1a6b0b3c6b2b1a0d0b0e0e0c00023e2a2c3c6b1a600b1afd0a0e0e0c00023e2a2c3c6b301a570b1a540a0e0c00031a550b2a69291a370a0c00023c1a500b1a3d0a0e0e0c00032d1a4c0b3b2d2d3c3b3c680828072a691a450b1a120a020224000e0e0e0c0002220e1a3b0b1a100a0e0c00032b1a380b3b2d2d3c3b3c680828072a6927102215352216363c28403b1a9d090e0e0c00042b3c1aa3090c00032f3529353f1a80090e0c0003033129362a37292d30301aff0a0c000529353d1a66090e0e0e0c0003030c292c3b1af00a0e0c0004020628062a2d3b6b66029929353d1a43090c0003037829362a372a3b1a5d090e0e0c00032a3b1a53090c000329352f2a1ac10a0e0e0c0003293b1abf0a0c000303041abf0a103b50293b1abf0a0c00030321293c1a9d0a0e0e0c00032d2a3b6a64330e0e0e0c000229331aa70a0c00036402142c3b1a840a0e0c000303041a9b0a103b503d2d693f2a692707021629353c1ac0080e0c000303043b5002041a830a10293629353d1aaa080e0e0e0c0003030c293c3b1a340a0e0c0004020628062a3c3b6b303b691a620a2a692b2a69291a71090e0e0c00023e2a1a570a3c6b323b1a98080e0c0003293b2a1a96080e0e0e0c00021a95080e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a78080e0c0002291a78080e0c00023c1a100a1a7d080e0e0c00032e1a0c0a3b2d2d3c3b3c680828072a692716270902293b1a4e080e0e0e0c00023c1af4091a51080e0e0c00031af1091af6093b2d2d3c3b3c680828072a69660fd92f1a0b080c00021a0d080e0e0c0002032a2f353036293b1ac5070e0e0c000303043b5002041ac709102a3529220c220c1ac409330e0e7b050d0004313532363c28403b1aa1070e0e0c00041ab1092a2c6a2c3c1aa1070e0e0c0003292b2d6a1aa5092a220f1a8f090c00042d3b1a97070c0003293b2a1a96070e0e0e0c00021a95070e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a78070e0c0002291a78070e0c00023c1a58091a7d070e0e0c00032e1a54093b2d2d3c3b3c680828072a69270d0fca2f1a38070202a6040e0c00021a35070e0e0c000203da2f353036293b1aed060e0e0c000303043b5002041a1f09102a353435220c363c28403b1ad8060e0c00041a11092a2c6a2c3c1ad9060e0e0c0003292b2d6a2f2a22121ac9080e0e0c00041af9081a96070e0e0e0c00023e2a2c3c6b293b69291a84070e0c00023e2a1ae3083c6b323b1aac060e0c0003293b2a1aaa060e0e0e0c00021aa9060e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a8c060e0c0002291a8c060202e2030e0c00023c1a98081a8d060e0e0c00032e1a94083b2d2d3c3b3c680828072a692715024e3b1a60060e0c00023c1a80081a65060e0e0c00031a7d081a82083b2d2d3c3b3c680828072a693b1a7a080e0e0e0c00023c1a78081a3d060e0e0c00032b1a74083b2d2d3b3b3c680828072a6927070fdd2f1af8050e0c00021af9050e0e0c000207d92f353036293b1ab1050e0e0c000303043b5002041a4308102a3531230d29291ac8050e0c00021ac9050e0e0c0002032429352a362a35291a28081a7d050e0e0c00036403052a68010207292503511e303b6502013b64293b1a5f050c000303691a0708291a83050c00021a85050e0e0c0002032429352a362a35291ae4071a39050e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1b050c000303041acb07103b50293529351ab1071a06050e0e0e0c000303043b5002041ab70710293765022202028f02293529351a8e071ae30402029f010c000303043b5002041a93071029376434230d29291af7040c00021af9040e0e0c0002032429352a362a35291a78071aad040e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a8f040c000303051a5707021a293529351a46071a7b040c000303043b5002041a2f07102937642211352212363c28403b1a66040e0e0e0c00041a2d072a2c6a2c3c1a65040e0e0c0003292b2d6a3d303b6a220d2b22191a50060e0c00043d220c3b6a1a0c071a19050e0e0c00023e2a2c3c6b293b691a39042a69280e2a3b6a2a1a3e040e0e0e0c00021a3d040e0e0c00021a35040e0e0c0002030c291a2a050e0e0e0c0002020129293b69291ad2040e0e0e0c00023e2a343c6b293b69291ac0040e0c00023e2a220f3c6b3d2a69293b69293b1abb030c000303051ad3030206402a1acc036a22153b1acd030e0e0c0003293b2a1aca030e0e0e0c00021ac9030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aac030e0c0002291aac030e0c00023c1a44061ab1030e0e0c00032e1a40063b2d2d3c3b3c680828072a6927270fdd2e230d29291a68030e0c00021a69030e0e0c0002032429352a362a35291ae8051a1d030e0e0c00036403052a68010207292503511e303b6502013b64293b1aff020c000303051aef05021a293529351ab6051aeb020c000303043b5002041a9f05102937643d2a3b6a1ad4051ac1030e0e0c00023e2a2c3c6b3d2a69293b69293b1abc020e0c000303051ad3020206402a1acc026a3b1aef020c00023c1aa8051af5020e0e0c00032b1aa4053b2d2d3c3b3c680828072a693b1acc020e0c00023c1a94051ad1020e0e0c00032b1a90053b2d2d3c3b3c680828072a02020300692710640fcc29353b1a55020e0e0c000303041a7305103b5029353f1a42020e0e0e0c000303ce29362a3733361a61052c2c6a2a3b1a29020e0e0c0003032f2b220c1a54050e0c000329353d1a12020e0e0e0c0003030e292e3b1a9c03340e0e7b050e000428062a2f3b6b6402832a3c1aee010e0e0e0c0003032f2b220c1a20050e0c000329353d1ad6010e0e0e0c0003030e292e3b1a6003340e0e7b050e000428062a2f3b6b6402472a1ae3010c00021ae5010e0e0c0002031e3b1aea040e0e0e0c000229220d220d2d1ae304220c02026a017b060e0005321acc040e0c000229220d220d2d1ac704220c7b060e000527040fd129353d1a66010e0e0e0c000303ce29362a372a3b1a7d010e0e0c00032a3b1a73010c0003220c361a9a042c2c6a2a3b1a3a010e0e0e0c00030325220d35220e362d352b2a1ac5020e0e0c0003302a3b6a642b0e0e0e0c00023f2a69270402792a3c1a08010e0c00030325220d35220e362d352b2a1a95020e0e0c0003302a3b6a642b0e0e0e0c00023f2a69270402492a1a09010e0e0c00021a09010e0e0c0002031a3b1a0e040e0e0e0c000229220f220f2d1a0704220e7b06100005341af4030e0c000229220f220f2d1aef03220e020276007b061000052706026d293632361ae9032b692a3b1a82000e0e0e0c000303032b02532a3c1a72000e0e0e0c000303032b02432a1a93000c00021a95000e0e0c0002031a3b1a9a030e0e0e0c000229220c220c2d1a9303340e7b060d0005311a80030e0c000229220c220c2d1a7b03340e7b060d000566641f060000000000000000100d0000000000000000000000000000|@9393,I251,I11,@9394,I106,@472,I253,I105,I218,@2330,@2332,@9395,@1385,@1004,@9397,@9404,@588,79992,@9407,@9411,@9414,@6634,@7165,@9415,@956,@9417,@9418,@9423,@9431,I113,@1009,@2273,@1109,@684,@9438,@718,@9439,@9441,@9442,@9445,@2349,@1009,@1109,@9438,@9448,@1109,@9450,@9452,@718,@9453,@9441,@9455,@2288,I107,I234,@2320,I233,@2323,@2318,@9375,@542,@9361,@9457,@9459,@9460,@9462,@9467,@9468,@2667,@9471,@1444,@9472,@9474,@9475,@9478,@9479,@9484,@9500,@9502,@9503,@9505,@9502,@9506,@9508,@9510,@9511,@14399,@2781,@2836,@1576,@14464,@9514,@9516,@684,@9517,@9519,@9520,@9522,@9523,@9519,@9525,@9527,@9528,@9531,@9534,@9536,@2268,@2270,@9538,@9392| 9392:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9435| 9393:S22|56414c55455f4f505328292e636f646556616c283629 9394:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9395:O1|@9396 9396:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9397:O3|2,@9398,0 9398:O1|@9399 9399:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9401,@9400| 9400:O4|103,@140,@9403,@9402 9401:S31|56414c55455f4f505328292e636f646556616c2836296765744c6f63283129 9402:O5|@9378,1049,0,1049,0 9403:S68|546865207370656369616c2066756e6374696f6e20506f6c794d4c2e736f757263654c6f636174696f6e2063616e6e6f74206265207573656420617320612076616c7565 9404:O4|@14322,@596,@9406,@9405 9405:O5|@9378,1043,0,1043,0 9406:S42|4f7665726c6f6164656420416464507265747479202d2077726f6e6720696e7374616e63652074797065 9407:O1|@9408 9408:D11,264|00802b3528061a07010c000303292b36293b1a03010c000329353c1af2000e0e0e0c000303033b020b291af3002e0e0e7d0500026502b52b3528051ad2000e0e0e0c000303a52b362c382937293629353d1abc000e0c0003651acc000e0c0002033b29373b2c291ac6000e0e0e0c00021ab5000e0e0c0002031729362b3c1ab7000c0003292b25042504511e253b6502012a652a2c2b6a29680166024b2937293629353d1a69000e0e0c000303043b5002041a8b001029362a372a2f1a89000e0e0c00031a89002a690402002c2b2b1a86000e0e0e0c000450293527071a40002e0e0e0e7d0500026502013b420e0e0e0000000000000000f8000000000000000000000000000000|@9410,I251,I253,@9407,I218,I105,I106,@1731,@1734,@9409,@1414| 9409:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9410:S36|56414c55455f4f505328292e636f646556616c283629666f6c6c6f775479706573283129 9411:O1|@9412 9412:D3,48|00803c28401a30001a35000e0e0c000428062a3d6a64420e000000000000000020000000000000000000000000000000|@9413,@588,I11| 9413:S36|56414c55455f4f505328292e636f646556616c2836295f2d74797065566172732d283129 9414:O2|@501,0 9415:O1|@9416 9416:D7,104|00812c1a6a000e0e0e0c00021a69000e0e0c000203352c352d362a1a620069293c1a64000e0c0003291a64000e0c00023b2a3c6a3e2c2b6a3d2a346a2f341a57000c00032a2a69270902013b430e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@9414,@6634,@7165,@9415| 9417:S14|6164645072657474795072696e74 9418:O1|@9419 9419:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@9421,@9420| 9420:O2|3,@9422 9421:S27|56414c55455f4f505328292e636f646556616c2836295f2d283129 9422:S133|6164645072657474795072696e7420656c656d656e742066756e6374696f6e73206d75737420686176652074797065202761202a20696e74202d3e207072657474792c202762202a20696e74202d3e207072657474792c202e2e2e2077697468206f6e652066756e6374696f6e20666f722065616368207479706520706172616d65746572 9423:O1|@9424 9424:D25,544|008530301a21020e0e0c0003291a20020e0c00021a21020e0e0c000207d429352f230d29291a08020e0c00021a09020e0e0c0002032429352a362a35291a00021a05020e0e0c00036403052a68010207292503511e303b6502013b64293b1ae7010c000303691ae701291ac3010c00021ac5010e0e0c0002032429352a362a35291abc011ac1010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aa3010c000303041aab01103b50293529351a89011a8e010e0e0e0c000303043b5002041a970110293765021a293529351a6a011a6f010c000303043b5002041a7b01102937641a7c01341a8001020210010e0c00033e2a69291a31010e0e0c000203041a6f01103b503b1a70010e0c0002220e2d2b1a6d013b1a71010e0e0c0006293b691a6e012a691a71012a693b3b3b3b2d6805291af4000e0c000203041a3301103b503b1a34010e0c00022215332b1a31013b1a35010e0e0c0006293b691a42012a691a45012a693b3b3b3b2d6805291ab8000e0c000203041af700103b5022171aff001afc001a29011a2e010e0e0e0c000522122a0e0e0c000264293b691a21012a692c2a691a21012a69342a691a21012a6922132a693b3b3c3b2d6805291a68000e0c000203041aa700103b503b221f0e0e0c00022968013c2a2d22246b2223382224230c2a3b3c1aee000e0e0e0c0004502b2a22240e0e0e7d2900023b641f06000000000000000010020000000000000000000000000000|@9426,@1326,I105,I218,@14398,I251,@2781,@2836,@1576,@9427,@122,@1363,@1330,@1702,@1469,@871,@9428,@871,@9425,@7171,@7172,@2241,@2241,@2241,I255| 9425:O2|3,@9430 9426:S26|56414c55455f4f505328292e636865636b505054797065283629 9427:S13|417267756d656e7420666f7220 9428:O2|3,@9429 9429:S14|526571756972656420747970653a 9430:S14|417267756d656e7420747970653a 9431:O3|2,@9432,0 9432:O1|@9433 9433:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9435,@9434| 9434:O4|103,@140,@9437,@9436 9435:S25|56414c55455f4f505328292e636f646556616c283629283129 9436:O5|@9378,1039,0,1039,0 9437:S68|6164645072657474795072696e743a2054686520617267756d656e74207479706520776173206e6f7420612073696d706c65207479706520636f6e737472756374696f6e 9438:O2|@712,0 9439:O1|@9440 9440:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9441:S7|61646450502d31 9442:O2|@9443,0 9443:O4|6,@9444,1,0 9444:O2|4,@7528 9445:O1|@9446 9446:D4,72|00802b3c1a49000e0e0c0003293b1a47000c000303041a4700103b503c2a693f2a6928062a3c3b6b66420e0e0e0e0e0e000000000000000038000000000000000000000000000000|@9447,I106,I234,@3576| 9447:S44|56414c55455f4f505328292e636f646556616c2836297072696e7446756e6374696f6e2d617267732d283129 9448:O1|@9449 9449:D3,56|00802b3b1a39000e0e0c000303041a3700103b503b2c693f2a6964420e0e0e0e000000000000000028000000000000000000000000000000|@3632,I234,@3576| 9450:O1|@9451 9451:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9452:S7|61646450502d32 9453:O1|@9454 9454:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9455:O1|@9456 9456:D12,256|00832e3629353f1afe000e0e0e0c0003033329362a37293131311af3000c000529353d1ae2000e0e0e0c0003030e292c3b1ae400320e0e7b050a000428062a2d3b6b66029b29353d1abd000e0e0c0003037829362a372a3b1ac5000e0e0c00032a3b1abb000c00032935332a1ab9000e0e0c0003293b1ab7000c000303041ab700103b50293b1ab7000c00030321293c1a95000e0e0c00032d2a3b6a64340e0e0e0c000229341a9f000c00036402142c3b1a7c000e0c000303041a9300103b503d2d693f2a692707021629353c1a38000e0c000303043b5002041a7b00102936641f040e0e0e0e0e0000000000000000f0000000000000000000000000000000|@9376,I251,@9455,@2288,I253,I107,I234,@2320,I233,@2323,@2318,@9375| 9457:O1|@9458 9458:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9459:S5|6164645050 9460:O1|@9461 9461:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9462:O3|2,@9463,0 9463:O1|@9464 9464:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9435,@9465| 9465:O4|103,@140,@9437,@9466 9466:O5|@9378,909,0,909,0 9467:S12|416464507265747479285029 9468:O4|@14322,@596,@9470,@9469 9469:O5|@9378,903,0,903,0 9470:S42|4f7665726c6f6164656420476574507265747479202d2077726f6e6720696e7374616e63652074797065 9471:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9472:O1|@9473 9473:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9474:S9|676574507265747479 9475:O4|@14322,@596,@9477,@9476 9476:O5|@9378,888,0,888,0 9477:S43|4f7665726c6f61646564204d616b65537472696e67202d2077726f6e6720696e7374616e63652074797065 9478:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9479:O2|@9480,0 9480:O3|14,@9481,0 9481:O2|@472,@9482 9482:O2|@9483,0 9483:O3|2,10000,0 9484:O3|2,@9485,0 9485:O1|@9486 9486:D16,320|00802b3b1a41010e0e0c0003291a40010e0c000203043b5002041a3b0110293b1a3d010e0e0c00036403512b3b1a18010e0c0003291a18010e0c000203043b5002041a130110293b1a15010e0e0c00036403043b5002041a0e01102b29362a372b382c396b2938291a05011a0a010e0e0e0c0003661a08012c8000022b3b1ac7000c0003291ac8000e0c000203043b5002041af30010293c1ac5000e0e0c000364034d2b3b1aa0000e0c0003291aa0000e0c000203043b5002041acb0010293c1a9d000e0e0c00036403043b5002041abe00102b29362a37692935291ab9001abe000e0e0e0c0003661abc002c8000022b3b1a53000c0003291a54000e0c000203043b5002041aa70010293e1a51000e0e0c00036403043b5002041a9a00102b36420e0e0e0e0e0e000000000000000030010000000000000000000000000000|@9488,I253,I105,@2943,I251,@9489,@9485,@9492,@104,@2943,@9494,@9496,@1385,@5875,@2943,@9487| 9487:O4|101,@1426,0,@9499 9488:S19|5072657474792e75676c795072696e74283129 9489:O4|101,@1426,0,@9490 9490:O5|@9491,98,0,98,0 9491:S30|6d6c736f757263652f4d4c436f6d70696c65722f5072657474792e736d6c 9492:O1|@9493 9493:D4,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d362a2e0e0c00022a2f1a43000c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@9492| 9494:O4|101,@1426,0,@9495 9495:O5|@9491,108,0,108,0 9496:O1|@9497 9497:D1,32|00802820420e0e0e000000000000000010000000000000000000000000000000|@9498| 9498:S22|5072657474792e75676c795072696e74283129283129 9499:O5|@9491,118,0,118,0 9500:O1|@9501 9501:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9502:S12|6d616b65737472696e672829 9503:O1|@9504 9504:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9505:O3|2,63,0 9506:O1|@9507 9507:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c362a353f1a58000e0c000303043b5002041a5300102a362a1a54000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@2334,@9506| 9508:O1|@9509 9509:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9510:S13|6d616b65737472696e67285029 9511:O4|@14322,@596,@9513,@9512 9512:O5|@9378,861,0,861,0 9513:S38|4f7665726c6f61646564205072696e74202d2077726f6e6720696e7374616e63652074797065 9514:O1|@9515 9515:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 9516:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9517:O1|@9518 9518:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9519:S7|7072696e742829 9520:O1|@9521 9521:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@2842| 9522:O2|@2663,0 9523:O1|@9524 9524:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9525:O1|@9526 9526:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9527:S8|7072696e74285029 9528:O4|@14322,@596,@9530,@9529 9529:O5|@9378,797,0,797,0 9530:S16|636f646556616c202d20466f726d616c 9531:D4,80|008056082c1a50000e0c000329353d1a4e000e0e0e0c0003030e2956273b1a47002f0e7b0504000428062a56373b6b64420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@9435,@9532,I251,@2288| 9532:O1|@9533 9533:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9532,@2288,I253,I107,@9375| 9534:O1|@9535 9535:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9534,@2288,I253,I107,@9375| 9536:O1|@9537 9537:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9536,@2288,I253,I107,@9375| 9538:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9539,I107| 9539:S32|56414c55455f4f505328292e636f646556616c2836296c6f6164566172283129 9540:D23,872|00863136291a68030e0c00021a69030e0e0c000203331a670356273432313168063b1a63030c00022933332d1a61030e0e0c0005343b69291a5d030e0e0c00023e2a2d3c6b27050fca293b1a52030e0e0e0c0003036732313131313156770e0e0e0c000733353d2a3b6a341a3a03692a2a692d2a69280e2a3b6a2a291af1020e0e0c00021af1020e0e0c0002031d29352a362a353d1a08030e0c00030309292503511e273b02013b6502013c640309291afd02347d1100022927070fd2323729353e1adb020c000307de293634352a0a080038001200fd013200120012009b0112004301220c343434343456a70c0007220c3b69291aa0020e0c00023e2a2d3c6b660fdb3d303b6a0fd7040200321a5f02020232020c00021a5d020e0e0c000203253236291a48020e0c00021a49020e0e0c0002030d2936293b1a63020c00036402013b6402013b036032353336293529352c3529293528061a44020e0c000303132936293b1a4f020c00032502501e1a3b64020129642b293528061a21020e0e0c000303172936293b1a2b020202b6010c00032502501e1f3b6402012964302b452a462608020d7c011a13022a2a35452a36465129352a361a0c022b2b6a220f353d1ada010e0e0e0c00030309220f362968016402013b293b1ac3010204420140010e0e0c0003031a3d2b3b6a22113b69291aa2010e0e0e0c00023e2a2d3c6b66020d1ac90122112e2e6b3d2a3b6a6427050fd6311a57010c00021a59010e0e0c0002030d3136293b1a73010c00036402013b03043b5002041a9b011031352935293b1a99010e0e0c00032c2a1a97011a9c010e0c0004220f3b69291a38010e0c00023e2a2d3c6b270602b6311aff000c00021a01010e0e0c0002030d3136293b1a1b010c00036402013b03043b5002041a6301103135293529220d220d1a5e010e0e0e0c0004220e3b69291ae8000e0c00023e2a2d3c6b293b69291a48010e0c00023e2a1a47013c6b27080254311a9d000e0e0c00021a9d000e0e0c000203113136293b1ab700020236000c00036402013b03043b5002041a1b01103135293529220d220d1af6000e0e0e0c0004220e3b69291a80000e0c00023e2a2d3c6b270565022033323232323256870e0e0e0c0007333b69291a5d000e0e0c00023e2a2d3c6b6664641f070e0e0e0e0e0e000000000000000058030000000000000000000000000000|@9542,I105,I218,@9543,@2268,@2270,@2273,I251,@684,@2349,I253,@9545,@9546,@9570,@9571,@2315,@9574,@9580,@9586,@9589,@9601,@546,@9541| 9541:O4|@14322,@596,@9604,@9603 9542:S28|56414c55455f4f505328292e6170706c7946756e6374696f6e283729 9543:D3,80|008056082c56293b564a565b56670e0e0e0c000729353d1a3e000e0e0e0c0003030e293c3b1a38002f0e0e7b0504000428062a3c3b6b6442000000000000000040000000000000000000000000000000|@9544,I251,@2288| 9544:S40|56414c55455f4f505328292e6170706c7946756e6374696f6e283729676574436f6e737472283129 9545:O2|@1444,@1444 9546:D2,48|00803d2c3b6a1a2f002a563756486b64420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@9548,@9547| 9547:D2,48|00802b5617562856391a2c002f0e0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@9550,@9549| 9548:S49|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f616447656e6572616c283129 9549:O1|@9551 9550:S48|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283129283129 9551:D12,264|00832e1a0a010e0e0e0c0002293f1a07010c000364033f2e3b3f1a03010c0004291a04011a09010e0e0c000303033c0222291a03010c00021a05010e0e0c00020310293b1ae1003b280c1afb000c000602013b6402013b03032c027b2b353e1ace000e0e0e0c0003033d2b36291ac8000e0c00021ac9000e0e0c000203252936291ab4000e0c00021ab5000e0e0c0002030d2936293b1a97000c00036402013b6402013b6402013b032c2b362935293629293528061a78000e0c000303132936293b1a8b000c00032502501e1a3b64020129270402012b291a7d000e0e0c0002302a311a7a00307b050800040e0e0e0e0000000000000000f8000000000000000000000000000000|@9553,I223,I233,@5831,@9554,I251,I105,I218,I154,I253,@9555,@9552| 9552:O2|@9565,@14443 9553:S45|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283229 9554:S4|636f6e76 9555:O1|@9556 9556:D9,168|00802b3528051aa7000c000303043b5002041aa300102b362c382937293629353b1a8c000e0c000303041a9300103b5029353d1a7a000e0e0e0c0003034a2b37293629353d1a68000e0c000303043b5002041a73001029362a372a311a71000e0e0c00031a71002a690402002c2b2b1a6e000e0e0e0c000450293527071a6800300e0e0e7d0700022b2704420e0e0e0e000000000000000098000000000000000000000000000000|@9558,I251,@9559,@9562,@1731,@1734,@9557,@1414,@9555| 9557:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9558:S42|56414c55455f4f505328292e6170706c7946756e6374696f6e283729666f6c6c6f775479706573283129 9559:O4|103,@140,@9561,@9560 9560:O5|@9378,1155,0,1155,0 9561:S52|496e76616c6964207479706520286e6f742061207479706520636f6e737472756374696f6e2920286164644f7665726c6f616429 9562:O4|103,@140,@9564,@9563 9563:O5|@9378,1153,0,1153,0 9564:S56|43616e6e6f7420696e7374616c6c20616e206f7665726c6f61642077697468696e206120737472756374757265206f722066756e63746f72 9565:D4,72|00822d2d2d6a56173b1a44000e0c00032f2f1a43000c00042a2a6956373b2b1a3e000e0e0e0c0004503b66440e0e0e0e000000000000000038000000000000000000000000000000|@9567,I253,@9566,I255| 9566:O1|@9568 9567:S28|5052494e545f5441424c4528292e6164644f7665726c6f6164283329 9568:D9,312|00822d1a3a010e0e0e0c00021a39010e0e0c000207d02d352e362a352b362a311a2d010e0e0c000303033c024a2a1a0f010c00021a11010e0e0c00020314301afe000e0e0e0c00021afd000e0e0c000202013b03212a3b323b2808220c1af8000e0c00021af9000e0e0c00031af9000e0e0c000602013b037b2f372a372a3629353c1acb000c000303112a3629353c1abe000e0e0e0c00036402013b6403152a3629362b3629362b2a1aa4000e0c00032704023d2a3629353b1a94000e0c000303112a3629353b1a86000e0e0e0c00036402013b6403192a3629382b3629382b2a1a8c0002022f000e0c0003270402013b6502013b030d2b31311a7b00320e7b050900042b31311a6e000e0e0e0c00042d2a69270502013b440e0e0e0e0e0e0e000000000000000028010000000000000000000000000000|@9569,I105,I218,I251,I223,I239,I154,I113,@9566| 9569:S37|5052494e545f5441424c4528292e6164644f7665726c6f616428332966696c746572283129 9570:D2,48|00802b5617562856391a2c002f0e0e7b060300050e0e0e0e000000000000000020000000000000000000000000000000|@9550,@9549| 9571:O4|@14322,@596,@9573,@9572 9572:O5|@9378,1126,0,1126,0 9573:S16|4f7665726c6f61642054797065446570 9574:O1|@9575 9575:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9577,@9576| 9576:O4|@14322,@596,@9579,@9578 9577:S37|56414c55455f4f505328292e6765744f7665726c6f6164496e7374616e6365283329283129 9578:O5|@9378,722,0,722,0 9579:S28|6765744f7665726c6f6164496e7374616e63653a204d697373696e67 9580:O2|@9581,@14443 9581:D3,48|008256073b1a30000e0c00032e2e2e1a2e002f7b06050005000000000000000020000000000000000000000000000000|@9583,I253,@9582| 9582:O1|@9584 9583:S28|5052494e545f5441424c4528292e6765744f7665726c6f6164283329 9584:D9,304|00832e1a32010e0e0e0c00021a31010e0e0c000207d02e352f362a352b362c37322c1a23010c000303033c024a321a07010c00021a09010e0e0c000203142b1af6000e0e0e0c00021af5000e0e0c000202013b0321323b2d3b2808301af1000e0e0c00021af1000e0e0c00031af1000e0e0c000602013b037b31372b372a3629353c1ac3000c000303112a3629353c1ab6000e0e0e0c00036402013b6403152a3629362b3629362b2a1a9c000e0c00032704023d2a3629353b1a8c000e0c000303112a3629353b1a7e000e0e0e0c00036402013b6403192a3629382b3629382b2a1a8400020224000e0c0003270402013b6502013b030329020e2c3333331a6f00340e7b060b0005270502083b2c2c0e7d0600021f040e0e000000000000000020010000000000000000000000000000|@9585,I105,I218,I251,I223,I239,I154,I113,@9582| 9585:S41|5052494e545f5441424c4528292e6765744f7665726c6f61642833297365617263684c697374283129 9586:O4|@14322,@596,@9588,@9587 9587:O5|@9378,1113,0,1113,0 9588:S17|4f7665726c6f6164204e6f74457175616c 9589:O4|@9590,@2463,@2569,@2651 9590:D16,208|00822c352d363c28403b1acb000c00041acd002a2c6a2c3c1acd000e0e0c0003292b2d6a332a1ac7003456a756b856c91ac5000e0e0c00081ac5001aca000e0e0e0c00023e2a2c3c6b2f3b1ac2000e0e0e0c0003293b2a1abe000e0e0e0c00021abd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa0000e0c0002291aa0000e0c00023c1aa0001aa5000e0e0c00032e1aa4003b2d2d3b3b3c680828072a69270f440e0e0e0e0e0000000000000000c0000000000000000000000000000000|@9592,I11,@9593,I106,@9594,@2313,@1007,@2273,I253,I105,I218,@2330,@9506,@9599,@1385,@9591| 9591:S8|657175616c697479 9592:S31|545950454944434f444528292e657175616c697479466f7254797065283329 9593:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9594:O1|@9595 9595:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9597,@9596| 9596:O1|@9598 9597:S45|545950454944434f444528292e657175616c697479466f7254797065283329726573756c74436f64652d283129 9598:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9596,@2288,I253,I107,@2286| 9599:O1|@9600 9600:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9601:O1|@9602 9602:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9601| 9603:O5|@9378,1100,0,1100,0 9604:S14|4f7665726c6f616420457175616c 9605:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9606:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9607:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9387| 9608:O1|@9609 9609:D10,296|00842c230d29291a26010e0e0e0c00021a25010e0e0c0002032429352a362a35291a1c011a21010e0e0c00036403052a68010207292503511e323b6502013b64293b1a03010c000303691a0301291adf000c00021ae1000e0e0c0002032429352a362a35291ad8001add000e0e0c00036403052a68010207292503511e2f3b6502013b64293b1abf000c000303041ac700103b50293529351aa5001aaa000e0e0e0c000303043b5002041ab30010293765021a293529351a86001a8b000c000303043b5002041a970010293764651a67000c000203053b2f69022f04020030302b31301a82000e0e0e0c00065029352a360402002b2b33322d1a74000e0c00065029352a362a2a6927061f050e0e0e0e000000000000000018010000000000000000000000000000|@9611,I105,I218,@14402,I251,@2781,@2836,@1576,@9610,@9344| 9610:O1|@9612 9611:S41|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529 9612:D15,512|00842f3b1a01020e0e0c000303072d3b452f460fcf2f3530363035313632372d3529372a350402002a2a1ae3010c000350293632352937293629353d1ac9010e0e0c000366031d3f2a346a29306932322b6a342a2213221322131abb0122147b071400062c3529220f1ab4010e0c0003220f330e0e0c0002293b692b2a69280e2a3c6a2a291aa0010e0c00021aa1010e0e0c0002031d29352a362a353d1a68010e0c00030309292503511e263b02013b6502013c64030b291a7d010e0e0c00020201290402002a353d1a3c010e0c0003030d1a6b012b692a3b452a465102233c22150202fa000e0e0e0c00021a59012a22186a3c3b2c2f6b293b692d2a452c46260529352a363f3422156a220e3629353b1af4000e0c00030377293622103722113629353d1ae0000e0c000303041a1f01103b5029353b1ace000e0e0e0c00030322293729353c1abe000e0e0e0c0003030d2936293b1aff000c0003640202293664020d2936293b1aed000e0e0c0003643c28402b1ae8000e0c00043c2a2f3b6b1ae4002a2f6a28052a22186a270702072805221022116a292213692c2a692e22162b6a04020022192b2b222122211a66000e0e0e0c00065029352a362a3b1a46000e0e0e0c0003030333020b332b1a9e000e0e0e0c000322222a452b46271e1f050e0e0e0e0e0e0000000000000000f0010000000000000000000000000000|@9614,I251,@1357,@9610,@9615,I105,I218,@2349,@9617,@9618,@1377,I253,I11,@694,@9613| 9613:O1|@9619 9614:S51|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529666f6c64496473283229 9615:O1|@9616 9616:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9615,@2288,I253,I107,@2286| 9617:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9618:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9619:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9613| 9620:O1|@9621 9621:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9620| 9622:O1|@9623 9623:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9622| 9624:O1|@9625 9625:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9624| 9626:O2|@9628,@9627 9627:O2|@9855,@9626 9628:D43,1472|008631353d1ac0050e0c000307ca313629352a39293b1ab7050c00032c3a293b1aad050e0e0c00030402002e220f220f220f220f2e220f220e0c00085029352a360402002a353d1a7e050e0e0e0c0003030d1a83052b692a3b452a4651021f3c22100e0e0e0c00021a75052a22116a3c3b2c2f6b293b692d2a452c46260529352a3631221222121a5e050e0e0e0c0004293b1a33050c000303032b020b2b2a1a4e050e0e0e0c0003293b1a1b050c000303032f020b2f2a1a3e050e0e0e0c000322132d0e0e0c000229341a33052218221822171a3205020210000e0e0e0c000722142c452a4627110fcd31353e1ad8040e0c000307cb31363238293b1ad1040e0e0c00033c28403b1a05050e0e0c00042932341a02056b293b69040200220e30220f220f220f2f3b1af504312212121200010001000c000b502935303b2a1ae7040c00021ae9040e0e0c000203352a352b362a22111ae0040e0c00032c3b1a67040c0003030329020b292d1ad2040e0e0e0c00032b2a2506250626041e3f3b270402012965293b2a1a9d040e0e0c00021a9d040e0e0c000203152a352b362a2c692a2a2505250526031e223b66020129652d1a73040202e6030c00021a71040202cf000e0e0c000203043b5002041a7704102f3b1af9030e0e0c0003291a70040e0c0002293b2a1a3e040e0e0e0c00021a3d040e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652e3b1ab2030e0e0e0c0003030329020b292f1a32040e0e0e0c0003280e2e3b6a2e291af2030e0e0e0c00021af1030e0e0c0002031d29352a362a353d1a78030e0c00030309292503511e283b02013b6502013c64030b291af5030e0e0c000202012929220e1aef032218221822171a86030e0e0e0c000722142d452a4627110fce31353c1a30030e0c000307d1313632373c28403b1a67030c00042931331a66036b293b69040200220d2e220e220e220e2f3b1aa903312211121100010001000c000b5029352a360402003122112c221122112e221122100c00085029352a362f1a33030c00021a35030e0e0c000203043b5002041a3f0310313b1ac1020e0e0c0003291a38030e0c0002293b2a1a06030e0e0e0c00021a05030e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1a7a020e0e0e0c0003030330020f302e1a1a0302023d020e0e0e0c0003293b1a5b0202021d000c000303032a020b2a2a1a02030e0e0e0c000322132a452f4627100fdb31353f1a34020e0c0003032f3137293b1a2f020c0003293b1a1f020c000303041ad702103b50293529311ad5020e0e0c0003303b452a4627040fd331362937293b1afe010e0e0e0c00032b38293b1af1010e0e0c00032d39293b1ae5010e0e0c00032f2307293b1ad8010e0c000331350402002a22132213221322132e221322120e0e0c00085029352a36292e1a7a0222152215220f6b2215221522141ada010e0e0e0c00073c22140e0e0c00023c28401a5e021acb010c00043c28401a5a021abf010c00043d2b2b6a1a55022a1a59023b6b2c3b2f1a5902020234010e0e0c0004502b3b22191a48020e0c000450220e2a1a45020e0e0c000329221a221a1a58010e0c0004220e3b1a2e01020201010e0e0e0c000303041a2702103b50220e35293729353f1a11010e0e0c0003033129362a3729221e1a10020e0c000329353d1af6000e0e0e0c0003030c292c3b1a00020e0c0004020628062a2d3b6b66025929353d1ad3000c0003033929362a372a3b1acd000e0e0c00032a3b1ac3000c0003221f352220362b352b2a1acb010c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a8f000c000303043b5002041aab01102936333b69291aa9010e0e0c00023e2a2d3c6b3c3b220e2c6b293169293b1a61000e0e0c000303042211020a22112a1a88010e0c0003220f3b1a86010e0e0e0c000303041a8301103b503d2210693f2a6922232c452a4627201f070e0e0e0e0e0e0e0000000000000000b0050000000000000000000000000000|@9630,I251,I253,@9631,@9632,@9633,@9707,@9709,@9711,@9716,I11,@473,@9800,I105,I218,@9803,@9827,@2773,@2776,@9829,@2349,@9831,@9835,@9837,@9839,@1792,@9841,@9843,-1,@2249,I48,@6297,I255,@9844,@9849,@9852,@2288,I107,@9375,@2273,@9629,I234,@3576| 9629:O1|@9854 9630:S47|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f6465283529 9631:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9632:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9633:O1|@9634 9634:D2,40|00822d2d2d1a28002e0e0e7b05050004000000000000000018000000000000000000000000000000|@9636,@9635| 9635:O1|@9637 9636:S47|535452554354555245535f28292e67656e636f6465537472756374732832296c6f61644f7061717565496473283329 9637:D10,240|00822d1af2000e0e0e0c00021af1000e0e0c000203b92d352e362a352b362a3529353d1ae2000e0e0e0c000303043b5002041adb001029362a373c340e0c00022b3b2b1ad2000e0e0e0c0004502a3b220c1ac4000e0c0004502e3629353d1aa7000c000303041ab700103b5029353b1a96000e0e0e0c00030322293729353c1a86000e0e0e0c0003030d2936293b1a97000c0003640202293664020d2936293b1a85000e0e0c0003642f2a220f220f1a7e000e0e0e0c00053c3b2e2c6b33221022101a73000c00042a2a69270d02013b440e0e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@1399,I105,I218,I251,@9340,I255,@1377,I253,@9638,@9635| 9638:O5|@9639,@2271,@2463,@2569,@2651 9639:D48,1216|00832e3629353d1abe040e0e0e0c000307dc29362a372a3b1aad040e0e0c000307d33c28403b1aa7040c00042930321aa6046b293b69331aa6040e0e0e0c000203051aa30402152c321aa4042c56a856b956ca1aa2040e0e0e0c00082d331a9f042d56b856c956da1a9d040e0e0c00082e341a9b042e56c856d956ea1a99040e0e0c00082c1a98040e0c00021a51040e0e0c000203043b5002041a8b04103b502e3b1a8b040c0003291a8c040e0c0002293b2a1a6a040e0e0e0c00021a21040e0e0c000203152a352b362a2c692a2a2505250526031e233b660201296556c73b691a5c042a691a5f042a692902021f021a5d04020277000e0e0c00023e2a1a57043c6b313b69332a692b2a69220d2a69280e2a3b6a2a291a06040e0e0e0c00021abd030e0e0c0002031d29352a362a353d1a94030e0c00030309292503511e283b02013b6502013c64030b291a11040e0e0c0002020129343b1a6c030e0c0003030329020540220c2b6a27140fdd3c28403b1a5b030c00042930321a5a036b293b693b2e291a98030e0c00021a51030e0e0c0002031729362b3c1acb030c0003292b25042504511e233b6502012a651abe035687691ac003342c322f1ac1030e0e0c0007220c1a17030c000203051a1703021d1ab2032f56a856b956ca68051aae03220c2d33301a96030e0e0e0c00071aa5033056b856c956da68051aa103220d2e34311a79030e0e0c00071a99033156c856d956ea68051a9503220e2f220c321a5c030e0c00072e1af4020e0c00021aad020e0e0c000203043b5002041ae702103b50303b1ae7020202bf000c0003291a64030e0c0002293b2a1ac2020e0e0e0c00021a79020e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652f3b691a35032a691a38032a69291aba020e0e0e0c00023e2a1a2f033c6b313b69332a692b2a69220d2a69280e2a3b6a2a291a66020e0e0e0c00021a1d020e0e0c0002031d29352a362a353d1af4010e0c00030309292503511e283b02013b6502013c64030b291a71020e0e0c0002020129343b1acc010e0c0003030329020540220c2b6a2716650fd02f35292e1ac2020e0e0e0c00030402002a353d1aa3010c0003030d1ab3022b692a3b452a4651021a3c310c00021aa9022a326a3c3b2c2f6b293b692d2a452c46260529352a36312a0e0e0c0002220c3629353d1a63010c000303041a8302103b503b5029353c1a50010e0c00030304293702022936293b1a6f020c00030304569702283b1a6a020e0e0e0c00022a1a68021a6d020e0e0c000356b71a6b023b2d2d3c3b3c680828072a6966293b691a60022a691a63022a69291a85010e0e0c00023e2a1a5b023c6b31353d1aeb000202bf000c0003030c313b3b1a4c020e0c000402062806323b3b6b32353d1aca000e0e0e0c0003030c323d3b1a2c020e0c000402062806333d3b6b33353d1aaa000e0e0e0c0003030c333e3b1a0c020e0c000402062806343e3b6b293b692b2a692e2a692e2a69280e2a3b6a2a291ad2000e0e0e0c00021a89000e0e0c0002031d29352a362a353d1a60000e0c00030309292503511e283b02013b6502013c64030b291add000e0e0c000202012922133b1a37000c000303032902054022142b6a2717641f040e0e0e0e0e0000000000000000b0040000000000000000000000000000|@9641,I251,I11,@473,I218,@542,@9642,@2313,@9647,@2374,@9652,@2390,I105,@2773,I253,@9657,@6866,@475,@2273,@6867,@2349,I106,@9659,@9640,@9661,@9675,@9681,@9682,@9688,@9689,@9695,@9696,@6866,@475,@6867,@9698,@9700,@9701,@9702,I113,@2332,@9705,@1385,@9640,@6866,@475,@6867,@2288| 9640:S14|7072696e742d68656c7065722829 9641:S32|545950454944434f444528292e636f646547656e657261746976654964283429 9642:O1|@9643 9643:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9645,@9644| 9644:O1|@9646 9645:S42|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283129 9646:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9644,@2288,I253,I107,@2286| 9647:O1|@9648 9648:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9650,@9649| 9649:O1|@9651 9650:S45|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283129 9651:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9649,@2288,I253,I107,@2286| 9652:O1|@9653 9653:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9655,@9654| 9654:O1|@9656 9655:S44|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283129 9656:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9654,@2288,I253,I107,@2286| 9657:O1|@9658 9658:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9657| 9659:D1,32|00815607430e0e0e000000000000000010000000000000000000000000000000|@9660| 9660:S47|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832292d45 9661:O1|@9662 9662:D20,432|00852e352f363c28403b1aab010c00041aad012a2c6a2c3c1aad010e0e0c0003292b2d6a3c28403b1a8d010e0e0c00041a9d012a691aa0012d69220d2a1aa0010e0c0003220d2a1a9e010e0e0e0c00033c2a693c28403b1a5e010e0e0e0c00042931302d6b29221169322a22180c00032a1a7c010e0c00021a7d010e0e0c000203043b5002041a7701103b502c3b1a77010c0003291a78010e0c0002293b2a1a4e010e0e0e0c00021a4d010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a4a010e0e0e0c000303032c0204402a2e6a22113b1a25010e0e0c0003293b2a1a02010e0e0e0c00021a01010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a04010e0c000222103b1ae2000e0e0e0c0003221e1af7001ae4000e0c000303033c022a221e1aae000e0e0e0c00021aad000e0e0c00020314221e3b1ad0003b28081ad2000e0e0e0c000602013b03051acc000202221e2b1acc000e0c0002221e1acb001a60000e0c0003302c3b2d2d3c323c680828072a69271c1f060e0e0000000000000000a0010000000000000000000000000000|@9664,I11,@9665,I106,@9666,@9668,@1385,@2702,I105,I218,@2773,I253,@9672,I251,@2330,I48,I154,@1004,@2332,@9663| 9663:O1|@9674 9664:S45|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229 9665:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9666:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@9667,I253,I106,I255| 9667:S54|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832296d6b41646472283129 9668:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@9670,@9669| 9669:D2,64|00802b352c362a56381a3c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@9671,I107| 9670:S53|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129 9671:S56|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129283129 9672:O1|@9673 9673:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9672| 9674:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9675:D3,48|008156072d1a30002e56485659566a1a2e00327b09040008000000000000000020000000000000000000000000000000|@9660,@9676,@2313| 9676:O1|@9677 9677:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9679,@9678| 9678:O1|@9680 9679:S45|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283229283129 9680:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9678,@2288,I253,I107,@2286| 9681:S10|657175616c6974792829 9682:D3,48|008156072d1a30002e56485659566a1a2e00327b09040008000000000000000020000000000000000000000000000000|@9660,@9683,@2374| 9683:O1|@9684 9684:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9686,@9685| 9685:O1|@9687 9686:S48|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283229283129 9687:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9685,@2288,I253,I107,@2286| 9688:S11|626f7865646e6573732829 9689:D3,48|008156072d1a30002e56485659566a1a2e00327b09040008000000000000000020000000000000000000000000000000|@9660,@9690,@2390| 9690:O1|@9691 9691:D2,48|00802b352c372a35292b1a2b00300e0e7e0600030e0e0e0e000000000000000020000000000000000000000000000000|@9693,@9692| 9692:O1|@9694 9693:S47|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283229283129 9694:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025a2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802152c353c1a33000c000303043b5002041a4f00102c36430e0e0e0000000000000000a8000000000000000000000000000000|@2287,I251,@9692,@2288,I253,I107,@2286| 9695:S6|73697a652829 9696:O1|@9697 9697:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9696| 9698:O1|@9699 9699:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025c2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a33000c000303043b5002041a4f00103b502c36430e0000000000000000a8000000000000000000000000000000|@2287,I251,@9698,@2288,I253,I107,@2286| 9700:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9701:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9702:O4|@14322,@596,@9704,@9703 9703:O5|@2312,1172,0,1172,0 9704:S15|416c726561647920636865636b6564 9705:O1|@9706 9706:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9707:O1|@9708 9708:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9707| 9709:O1|@9710 9710:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9709| 9711:O1|@9712 9712:D2,32|00811a2300100e0e000000000000000010000000000000000000000000000000|@9714,@9713| 9713:O4|11,@49,0,@9715 9714:S53|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835292d45 9715:O5|@8409,2783,0,2783,0 9716:O1|@9717 9717:D2,56|008504020031312b313134321a31000e0e0c0008502935641f060e0e0e0e0e0e000000000000000028000000000000000000000000000000|@9719,@9718| 9718:O1|@9720 9719:S51|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e73283529 9720:D20,568|008604020032353d1a35020e0e0c0003030d1a330233692a3b452a4651021b3c300c00021a29022a316a3c3b2c220e6b293b692d2a452c46260529352a363b34291a14020e0c00021a15020e0e0c0002031729362b3c1a0f020c0003292b25042504511e233b6502012a65293b1a00020e0c000303033c020b291afb011a00020e0c000303041aff01103b50293c1ad7010c00032928403b1af5010e0e0c0004293b2d1af2010e0e0e0c000450220d291aa5010e0e0c00021aa5010e0e0c0002035b29352a362a352b362968012b3b1a9e010e0e0e0c000303033c02142f3b1abe010e0e0e0c00032c2a1a93010c00036403041ab201103b502b3c1a6a010e0e0e0c0003302a2c1a8e010e0e0e0c0004502d250726061e673b270602013b642a3b1a7c010e0c00033b2a293b1a11010e0e0c000303032a0250293c1a72010e0e0e0c00032a3c1a67010c00032b3c1a5f010c0003293c1a0f010c0003312a1a3f010c0003293b1ad7000c000303041a4701103b5029352d2a692932692931250a250a26081e5a3b2708650402002a2a220f22112213220c22121a24011a29010e0e0c00095029352a3629030922122215453c460260280e2b3b6a2b291a99000e0e0c00021a99000e0e0c0002031d29352a362a353d1a68000e0c00030309292503511e273b02013b6502013c64030b291add000e0e0c0002020129220c3b1a3f000c0003030329020540220d2b6a22152a453b4666270c1f070e0e0e0e0e0e0e000000000000000028020000000000000000000000000000|@9722,I251,@9723,@9724,I105,I218,I106,I234,72057594037927934,I231,@1603,I11,I255,I253,@1614,I240,@1792,@9718,@9721,@2349| 9721:O1|@9725 9722:S71|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d61746368537562537472756374757265283229 9723:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 9724:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 9725:D6,128|0087321a82000e0e0e0c00021a81000e0e0c00020342323533360402002a2a220c220c220c220c220c220c1a6a000e0e0e0c00095029352a362a2a692e2a22102210221022102210221022101a510022110e0e7b0b10000a1a4d00322a35452a3646641f080e0e0e000000000000000070000000000000000000000000000000|@1746,I105,I218,@9721,@9726,@541| 9726:O1|@9727 9727:D50,1544|0088333629353c1a06060e0e0e0c000303b329362a37220c352a2c220d0c000329353f1aea050e0e0e0c0003033129362a3729220e1ae0050e0c000329353d1ace050e0e0e0c0003030c292c3b1ad0050e0c0004020628062a2d3b6b66025929353d1aab050c0003033929362a372a3b1ab5050e0e0c00032a3b1aab050c0003220f352210362b352b2a1aa3050c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a67050c000303043b5002041a8305102936292c69220f2a453b4627060fce29353d1a45050e0e0c000307d229362a372b3829352a382210352210352211363c28403b1a54050e0c000429221122111a50056b293b691a5105221132221533220f220e3022176809040200311a43052b1a47050c00045029352a36291a43050c0002291a44050e0c00022c22101a42050e0e0e0c0003291a40050e0c00021a41050e0e0c000203732935220f1a3b051a40050e0c00031a41053b1ac5040e0e0c0003292b1a3b050c0003501a2c053b1ab0040e0c000329392a1a2e052b1a32050e0e0e0c0004503b1a2f05020258040c00022e2a691a2a053b1a86040202a6030e0e0e0c00032a2a0e0e0e0c0002661a18050e0c0002501a1805103b5004020022111a15052b1a91040e0e0c0004502936291a0d050e0e0c0002291a0c050e0c00020402002f2b2a3b1a1e040e0e0e0c0003030c293b1a11040e0e0c0003025c2a352b362b1a72040e0e0e0c00021a71040e0e0c000203422b352c362c35291ad0040e0c0002293528061add030e0e0c0003031129362d352a2a1acd030e0e0c00036502013b65030d2b2a2506250626041e6a3b02013b6502013b65650330221e220c0c000222153729353b1a9b030c00030311293622142a1a7e040e0e0e0c00036402013b2c2c452a4626040fd72a1ae7030c00021ae9030e0e0c00021ae1030e0e0c000203232f1a56040e0e0e0c0002292220220f220f1a4e040e0e0e0c00052b2a453b4626030fd03b2b291aa9030e0e0c00021aa9030e0e0c0002031729362b3c1a2b040c0003292b25042504511e243b6502012a65221f352220363c28403b1a34030e0c00041a0d042a2c6a2c3c1afd030e0e0c0003292b2d6a1a01042b69302a1a02040e0e0e0c0003332a1aff030c00033c28403b1afd020e0e0c00041af5032a693c2c693c28403b1ae9020e0e0c000429312d2d6b29221c6922161a9e03020244010e0e0e0c000229342c221f1a94030e0c00052b1afc020e0c00021afd020e0e0c000203043b5002041aaf03102d3b1a890202020f010e0e0c0003291aa4030e0c0002293b2a1aca020e0e0e0c00021ac9020e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a2e020e0e0e0c000303032c0204402a2e6a22291a62031a9f020c000322133b1a26020e0e0e0c0003293b2a1a72020e0e0e0c00021a71020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a24030e0c0002220f3b1ae2010e0e0e0c00032d1a18031abd010e0e0c000303033c02222d1a1f020c00021a21020e0e0c000203102d3b1af5023b28081af7020c000602013b03051af40202012d2b1af5020e0e0c0002221c1af3021a98020e0c0003312c3b2d2d3c323c680828072a6922202a453b46262129352a36220e1ac5010e0e0c00021ac5010e0e0c000203043b5002041a77021022103b1a50010e0c0003291a70020e0c0002293b2a1a96010e0e0e0c00021a95010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1afa000e0e0e0c000303032d0204402a2f6a29221769221603142e030e221d3d1ada000e0e0e0c000302013b02013b22282b452a46271f02a129362a37220d35220d35220e362c360402002a353b1aac000e0c0003033b2a36220f220e0e0c000229353d1a96000e0e0e0c0003030c292b3b1a98000e0c0004020628062a2c3b6b2b311a67010c00032d2b452a46260502112e220f1ae5010e0e0c00032a2a453b465129352a360402002b332b221322152217221422140e0e0e0c00085029352a362a32693103092d03032a02013b02013b22172b452a46270e641f090000000000000000f8050000000000000000000000000000|@9729,I251,@9730,@2288,I253,I107,@9375,I11,@473,@9732,@9749,@1414,@7142,@9751,@1326,I105,I218,@4882,@122,@14558,@66,@190,@12,@9753,@14470,@9758,@9781,@9784,@2262,@9787,@1435,I113,@2268,@2270,I106,@9789,@9790,@1385,@2702,@9794,@2773,@2776,@9796,@2330,I48,I154,@1004,@2332,@9797,@9728| 9728:O1|@9799 9729:S85|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e283229 9730:O1|@9731 9731:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9730,@2288,I253,I107,@9375| 9732:D25,944|0080560c3729353b1aad030e0e0c000307d22936562b3b1a9e030e0e0e0c0003034b2d56370c000229353d1a8a030e0e0e0c0003030c292b3b1a84030e0c0004020628062a2c3b6b29353d1a6a030e0e0e0c0003030e293c3b1a6403320e0e7b0507000428062a3c3b6b650fdd562b3c1a45030e0e0c000307d7562a1a49030e0e0c000229353d1a2e030e0e0e0c0003030829362968016402013b291a31030e0e0c00021a31030e0e0c000207df5649355659363c28403b1a25030e0e0c00041a25032a2c6a2c3c1a25030e0e0c0003292b2d6a2956b70e0e0c000229353d1ad602020290010e0e0e0c0003030c29333b1acc020e0c0004020628062a343b6b3d56d83b6a291aef02692b2a69280e2a3b6a2a291ab9020e0e0c00021ab9020e0e0c0002031d29352a362a353d1a88020e0c00030309292503511e273b02013b6502013c64031329020227011ab1020202f7000e0e0c0002020129333b1aa8020e0c0003293b2a1a66020e0e0e0c00021a65020e0e0c0002031a2a352b362a35292d692b2a2506250626041e2539003b270402012965291a76020e0e0e0c0002291a74020e0c00023c1a74021a79020e0e0c00032e1a78023b2d2d3c3b3c680828072a692713027f2f56570e0e0c000229353d1ae2010e0e0e0c0003030c292d3b1adc010e0c0004020628062a2e3b6b3d56783b6a291a3f02692b2a69280e2a3b6a2a291ac9010e0e0c00021ac9010e0e0c0002031d29352a362a353d1a98010e0c00030309292503511e273b02013b6502013c64030d291ac501220d0e0e0e7d0d00022927066502292d56370c000229353d1a62010e0e0e0c0003030e292b3b1a5c01310e0e7b0506000428062a2c3b6b64640fcb561b3b1a3c010e0c0003036c1abb013b1a7f010c00031ab9013b1a75010e0e0c00031ab5013b1a69010e0e0c00031ab1013b1a5d010e0e0c00031aad012c2e2c2e6805566c32568d3b56ae2e1aa3010c000729353d1aea000e0e0e0c0003030e293c3b1ae400220c0e7b050a000428062a3c3b6b270602a6561b3c1ac4000e0c0003034e1a43013b1a07010c00031a41013b1afd000e0e0c00031a3d013b1af1000e0e0c00031a39013b1ae5000e0e0c00031a35012c2e2c2e6805566c32568d3b56ae2e1a3301220e020251007b080900071af5003b1ab9000e0e0c00031af1003b1aad000e0e0c00031aed003b1aa1000e0e0c00031ae9003b1a95000e0e0c00031ae5002c2e2c2e6805566c32568d3b56ae2e1adb00220e7b0809000764420e0e0000000000000000a0030000000000000000000000000000|@9734,I251,@2288,@1435,I105,I218,I11,@9735,I106,@9736,@2349,I253,@2330,@2332,@9737,@1385,@1004,@9739,@14465,@14466,@14467,@14468,I48,@9389,@9733| 9733:O1|@9740 9734:S96|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296c6f6164436f6465283129 9735:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9736:O2|@472,@684 9737:O1|@9738 9738:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9739:O2|@542,@684 9740:D19,280|00853038291a18010e0c000229353d1a16010e0e0e0c0003030829362968016402013b291a09010e0e0c00021a09010e0e0c000203a6323533363c28403b1aff000c00041a01012a2c6a2c3c1a01010e0e0c0003292b2d6a220d1afb000c000222111afb002c22122d221222121af8000e0c00082e3b1af7000c0003293b2a1aae000e0e0e0c00021aad000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ac8000e0c0002291ac8000e0c00023c1ac8001acd000e0e0c00032e1acc003b2d2d3c3b3c680828072a69270e0220301ac0000e0c0002341ac000220c220c2d220c220c1a7400220d0e7b090c0008661f060e000000000000000008010000000000000000000000000000|@9742,@1435,I251,I105,I218,I11,@9743,I106,@9744,@472,@9390,I253,@2330,@2332,@9746,@1385,@1004,@9741,@542| 9741:O1|@9748 9742:S29|56414c55455f4f505328292e636f6465457846756e6374696f6e283629 9743:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9744:O1|@9745 9745:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a3b3b6a2a1a46000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@9744| 9746:O1|@9747 9747:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9748:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a3b3b6a2a1a46000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@9741| 9749:O1|@9750 9750:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@1413| 9751:O1|@9752 9752:D4,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203252b352c362a360310291a4e000e0e0e0c00022b2a6964020a291a3e002e0e7d0500026502013b420e0e0e000000000000000048000000000000000000000000000000|@283,I105,I218,@9751| 9753:O2|@9754,@14469 9754:D2,40|008056073b1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@9755,I253| 9755:S29|706f6c79436f6d70696c65722832297072696e7444657074682d283129 9756:O1|@9757 9757:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@422,@421| 9758:O3|@9760,@9759,77 9759:O2|@9779,@14558 9760:D4,48|00802b561756281a2e001a33001a3800300e0e7b07030006000000000000000020000000000000000000000000000000|@9762,@9763,@9766,@9761| 9761:O1|@9768 9762:S28|506f6c794d4c2e7072657474794d61726b7570283129283129283129 9763:O1|@9764 9764:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@9765| 9765:S22|506f6c794d4c2e7072657474795072696e742d283129 9766:O1|@9767 9767:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@9765| 9768:D4,72|00842f3b2f313131311a44000e0c0008292f1a43000c0003641a44000e0c0002030a402f2c0e0e0e7d0700023b1f050e000000000000000038000000000000000000000000000000|@9770,@9769,I113,I218| 9769:O1|@9771 9770:S22|506f6c794d4c2e7072657474794d61726b7570283529 9771:D11,408|008631353d1a98010e0c000303032f0fcf31353f1a89010e0e0c00030327313632372a310e0c000250312a1a7a010e0e0e0c0003293b1a77010c000303032902013b660fd631353e1a55010e0e0c0003032b313629300e0e0e0c000250291a57010c0002312a1a3f010c0003293b1a3f010c000303032902013b660fdc31353c1a1d010e0e0c00030347313629293b1a1e010e0e0e0c000303182820310c000250293c1a02010e0e0e0c000325011e2102023b5050302a1aee000e0e0e0c0003293b1aeb000c000303032902013b6502ac3136323733383439342d1ae20002029b000e0e0e0c0003220d220c1ad9000e0e0c0003293b1aa7000c0003032e2c330e0c00022c3b220f220f2f22101ac00022112211220e1abf00020260000c000b2e340e0e0e0c00022a66024f29352d340e0c0002502c220e2a1aa4000e0c00021aa5000e0e0c000203282a352b362a302d2213221322130202220022131a70000e0c00082a2a2505250526031e3426030200512d330c000250296427061f070e000000000000000088010000000000000000000000000000|@9773,I251,I107,I233,I223,I106,@9774,@9769,@9772,I105,I218| 9772:O1|@9777 9773:S31|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329 9774:O1|@9775 9775:D8,256|00812c353d1a00010e0c000303033b02d52c353f1af1000e0e0c000303202c37292d1aeb000c000303102c2a1ae9000e0e0c00032968016402013b6402a82c353e1ac4000e0c000303282c36291ad0000e0c0002292e1ab7000c000303102d2a1ab5000e0e0c00032968016402013b6502742c353c1a90000e0c000303202c36292d1a8b000c000303102c2a1a89000e0e0c00032968016402013b6402482c392c68012a2a2a1a7f000c00021a81000e0e0c0002032d2a352b362b3b1a49000e0e0c000303033b020c2b352b2a1a68000e0c0003642a2a2505250526031e383b660201292704430e0000000000000000f0000000000000000000000000000000|@9776,I251,I232,I107,I223,I105,I218,@9774| 9776:S32|506f6c794d4c2e7072657474794d61726b757028352967657453697a65283229 9777:D11,736|0089341ae2020e0e0e0c00021ae1020e0e0c000207d33435220c362a353d1ad7020c0003035a40340e0c00025032293b1acd020e0e0c0003031c2820220c0e0e0e0c000250293c1abe020e0e0e0c000325011e2402023b505031331aaa020e0e0e0c00032a3b2b220e220e220e220e220e220e220e1a9802220f0e7b0c0f000b2a353b1a72020e0e0e0c0003033a32220d1a84020e0c00032b2a220e220e220d220c220c220f0e0e0e0c00082b3b2b220f220f220f220f220f220f220f1a500222100e7b0c10000b2a353f1a2a020e0e0e0c000303362a362b372a220d0c000250220d2a1a21020202d5010e0e0c00032c3b2b22102210221022102210221022101a0c0222110e7b0c11000b2a353e1ae6010e0e0e0c0003033a2a3629220c0e0e0c000250291af7010c0002220d2a1ad6010e0e0e0c00032c3b2b22102210221022102210221022101ac40122110e7b0c11000b2a362b372b3b1a9b010c00030304220d0fca342a1aad010e0e0c00033003033c0292220e2c1aac010e0c000303033c0283220e2c1a7d010e0e0c00032d2a2a1a52010e0e0e0c00021a51010e0e0c000203452a352b362a353c1a48010e0c000303052b6801022d2a2c1a70010e0c0003291a20010e0c00021a21010e0e0c0002031029352b2a2506250626041e4e3b6402013b6465020329680165293b1a04010e0c00031af5000e0e0c0002651aec000e0c0002035e40220e0c00025029293b1ae9000e0e0c000303202820220f0e0e0e0c000250293c1ada0002028a000e0e0e0c000325011e2802023b5050342a1ac2000e0e0e0c00032d2c2b22112211221122112211221122111ab00022120e7b0c12000b2b293b1a92000e0e0e0c0003031c2820220f0e0e0e0c000250293c1a82000e0e0e0c000325011e2502023b5050220e2c1a6d000e0e0c00032d3b2b22112211221122112211221122111a5c0022120e7b0c12000b27040201321f0a0e0e0e0e0e0000000000000000d0020000000000000000000000000000|@9778,I105,I218,I251,I233,I107,@9772,I106,I223,I232,@9774| 9778:S41|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329646f5072696e74283329 9779:D5,72|008056073b1a48000e0c0003292d1a47000c00035056173b1a35000e0e0c000329392a1a3a002b1a3e00317b05060004000000000000000038000000000000000000000000000000|@9780,I253,@66,@190,@12| 9780:S15|54657874494f2e7072696e74283129 9781:O4|@14322,@596,@9783,@9782 9782:O5|@8409,2601,0,2601,0 9783:S27|756e6966795479706573206661696c656420696e20706173732033 9784:O1|@9785 9785:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@9786| 9786:S97|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e28322964657374566172732d283129 9787:O1|@9788 9788:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a36293f1a67000c0003293b1a67000c0003641a50000e0c000264030f291a5d000e0e0c00022b2a6964020a291a4e002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I243,I251,@9787| 9789:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9790:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@9792,@9791| 9791:D2,64|00802b352c362a56381a3c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@9793,I107| 9792:S115|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129 9793:S118|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129283129 9794:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@9795,I253,I106,I255| 9795:S113|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d6d6b4164647273283129 9796:S3|285029 9797:O1|@9798 9798:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9799:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9728,@2288,I253,I107,@9375| 9800:O1|@9801 9801:D1,40|00802b352c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@9802| 9802:S61|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f646528352970726f63657373426f6479283129 9803:O1|@9804 9804:D15,360|00812c353b1a68010e0c0003035d2c37293b1a63010c00033c28403b1a61010e0e0c0004292f1a5f011a64016b293b692c3b2a1a62010e0e0e0c00021a61010e0e0c000203202a352b362a2c220d301a56010e0e0e0c00052a2a2505250526031e2e3b6602012927070fdd2c353c1aff000c000303512c36293b2a1a1a010e0e0e0c00021a19010e0e0c000203352a352b362a311a19010e0e0c00032c3b1acf000c0003030329020b292d1a0a010e0e0e0c00032b2a2506250626041e423b27040201296602852c37293b2a1ac9000e0e0c00021ac9000e0e0c0002036c2a352b362a38293b1a8f000c0003293b1a7f000c000303041ac700103b502935293629353d1a6a000e0e0e0c000303043b5002041ab300102936293b1a5b000c0003293b1aab000c000303041aab00103b503d2a693f2a69293469322a250d250d260b1e763b270b020302002966430e0e0e000000000000000058010000000000000000000000000000|@9806,I251,I253,I11,@9807,@473,I105,I218,@9813,@9803,@9805,@1792,@9340,I234,@3576| 9805:O1|@9826 9806:S49|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229 9807:O1|@9808 9808:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9810,@9809| 9809:O4|@14322,@596,@9812,@9811 9810:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229747970655661724d61702d283129 9811:O5|@8409,2889,0,2889,0 9812:S10|747970655661724d6170 9813:O1|@9814 9814:D15,256|00832e353d1a00010e0c0003035a2e362936292f2f1af8000e0c0004293b2a1af6000e0e0e0c00021af5000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965313b1aba000e0e0e0c0003030329020b29321aca00310e7e0a00032704027d2e353c1a9a000e0e0e0c000303102e36292e1ab3000c000329306965025f2e353e1a7c000e0c000303522e361aa1003b1aa5000e0e0c00031aa5003b1a99000e0e0c00031aa1003b1a8d000e0e0c00031a9d003b1a81000e0e0c00031a99002c2e2c2e68052e33333b1a94002e1a98000e0c000729220c69270702012d1f040e0000000000000000f0000000000000000000000000000000|@9816,I251,@9817,I105,I218,@9819,@9821,@14465,I253,@14466,@14467,@14468,I48,@9815,@9389| 9815:O17|@14472,@14473,@14474,@14475,@9823,@14466,I48,@2784,@2789,@14476,@14465,@14471,@5792,0,@14468,@14467,@2795 9816:S60|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f6164537472646563732832296c6f616456616c73283229 9817:O1|@9818 9818:D12,144|00822d1a92000e0e0e0c00021a91000e0e0c0002035d2d352e361a8b003b1a8f000c00031a91003b1a85000e0e0c00031a8d003b1a79000e0e0c00031a89003b1a6d000e0e0c00031a85002c2e2c2e68052f34343b1a80002e1a84000e0c00072f220c220c1a80000e0c00042a2a69270902013b440e0e0e000000000000000080000000000000000000000000000000|@1399,I105,I218,@14465,I253,@14466,@14467,@14468,I48,@9815,@9389,@9817| 9819:O1|@9820 9820:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9819| 9821:O1|@9822 9822:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9821,@2288,I253,I107,@9375| 9823:O1|@9824 9824:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@9825| 9825:S18|4c45585f28292e6e756c6c4c65782d283129 9826:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9805| 9827:O1|@9828 9828:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9827| 9829:O1|@9830 9830:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9829| 9831:O1|@9832 9832:D2,32|00811a2300100e0e000000000000000010000000000000000000000000000000|@9714,@9833| 9833:O4|11,@49,0,@9834 9834:O5|@8409,2771,0,2771,0 9835:O1|@9836 9836:D1,40|00802b352c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@9802| 9837:O1|@9838 9838:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9837| 9839:O1|@9840 9840:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9839| 9841:O1|@9842 9842:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9841,@2288,I253,I107,@9375| 9843:D8,144|008156092d2a1a8f000c00021a91000e0e0c000203043b5002041a8b00102a352b362b3b1a89000e0e0c000303042a3602162b3c1a81000e0e0c00032a2a2505250526031e3f3b642704293629353d1a6e000e0e0e0c000303142a2e564756581a65000e0e0c00053c2a696402022a3565430e0e0e0e0e0e000000000000000080000000000000000000000000000000|@9714,I105,I218,@611,I113,I107,I251,@9638| 9844:O1|@9845 9845:D6,120|00812c1a7a000e0e0e0c00021a79000e0e0c000203452c352d362a352b36293529353b1a6a000e0e0e0c000303043b5002041a63001029362b362c373f2c220c6a292c2c6a302a6932220e1a52000e0e0e0c00032a2a69270c02013b430e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,I251,@9846,@9844| 9846:O4|@14322,@596,@9848,@9847 9847:O5|@8409,2717,0,2717,0 9848:S37|6d616b6553656c65637465643a204e6f7420426f756e64206f72206e6f7420466f726d616c 9849:O4|@14322,@596,@9851,@9850 9850:O5|@8409,2726,0,2726,0 9851:S22|46756e63746f724170706c3a20756e646566696e6564 9852:O1|@9853 9853:D7,192|00812c3629353f1abe000e0e0e0c0003033329362a37292f1ab5000e0e0c000329353d1aa2000e0e0e0c0003030e292c3b1aa400320e0e7b0508000428062a2d3b6b66025b29353d1a7d000e0e0c0003033929362a372a3b1a85000e0e0c00032a3b1a7b000c0003303531362b352b2a1a75000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a692708021529353c1a37000c000303043b5002041a530010293664430e0e0e0e0e0e0000000000000000b0000000000000000000000000000000|@9376,I251,@9852,@2288,I253,I107,@9375| 9854:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9629| 9855:D20,592|0089331a52020e0e0e0c00021a51020e0e0c000207d1333534362a353b1a48020e0c000303782a363c28403b1a41020e0e0c00042a2a69293b693c28403b1a2f020c000432220f22112215221422123c3068081a220232221532221422142212221168080402002d3b2d2d2d1a11020e0e0c00065029352a362a3b1aea010e0e0e0c000303042211020a22112b1af8010e0c000322102a452b46270b0fd72a353c1ac4010e0c000303322a362b371adf012e2d343368051ade012f2d2c34680522112c221122112211221122113022112211221022120e7b0c12000b2a372b38293b1abb01020236010c0003040200220f2d2b221456a7220d2214221422171aa6010e0e0e0c000a5029352a362c2a2211220d22141a98010e0c000629352a363c28403b1a49010e0e0c000429221422161a84016b293b69040200221a220e2f221a221a2f3b221a31221a22190c000b5029352a362c1aff000c00021a01010e0e0c000203043b5002041a5301102e3b1a2d010202a5000e0e0c0003291a48010e0c0002293b2a1ace000e0e0e0c00021acd000e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1ab2000e0e0e0c0003030329020b292e1a0a010e0e0e0c0003293b1a97000c0003030334020b342a1afa000e0e0e0c0003293b1a7f000c00030304220f020a220f2a1ae8000e0c0003293b1a67000c00030304221c020a221c2a1ad8000e0c0003221b2a45314627166502152e220c3434343468062e0c00022d2a35452a3646641f0a0e0e000000000000000040020000000000000000000000000000|@9857,I105,I218,I251,I11,@9858,@9860,@11066,@11068,@11070,I253,@11072,@9342,@473,@2773,@2776,@11083,@11085,@11087,@9856| 9856:O1|@11089 9857:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829 9858:D1,72|00802b352c3629392a3a040200565856692d568a569b2f3356cc3156ed56f70e0e0c000b5029352a362a2a692707420e000000000000000038000000000000000000000000000000|@9859| 9859:S33|434f444547454e5f50415253455452454528292e67656e636f6465283829283129 9860:O3|@9862,@10297,@9861 9861:O2|@10988,@10525 9862:D59,2752|00842f1ac20a0e0e0e0c00021ac10a0e0e0c000207da2f3530362a352935281a1ab50a0e0e0c0003036e293631353236333734392d1aa80a0e0c0002292b2e302f1aa40a0e0c000629352a362a3b1a870a0c000303042211020a22112b1a900a0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220c30303068082213322b221b221b221a221c0e7b071c0006293528141a390a0e0e0c000307dd29362937293b1a490a0e0e0c00032b38293b1a3d0a0e0e0c00032d39293b1a310a0e0e0c0003220e35220f3622103722113522123622133722143922153a220c2b2e302f2e1a120a02029d090e0e0e0c000729352a36342a34220d220c1ae2090e0e0e0c000629352a3622102a220e2210220f1aec090e0c000629352a362a3b1aaf090c000303032d020b2d2b1ada090e0e0e0c0003293b1a97090c0003030331020b312a1aca090e0e0e0c0003293b1a7f090c000303042222020a22222a1ab8090e0c000322223522233622243722253822263a22272306222802021f0023072f2f2f2f220e30303068082224322b222c222c222b222d0e7b072d000629353b1a2e090e0e0e0c000307cd2936293a293b1a3d090e0e0c00032b352c372d382e39220e35220f3622103722113922123a301a4d090e0e0c000230030333020a291a46090e0e0e0c0002322a1a43090c00030402002a2a1a40090e0c00035029352a363b3169040200220f2c2c2b1ab1080e0e0c00021ab1080e0e0c000203142a1a9e080e0e0e0c00021a9d080e0e0c000202013b03282b352c362c352d362c2b2f2214221622271af7080c00072c2b2b25082508250826051e4c26050209292d2a35452a364651260329352a36220e230d29291a4b0802022d040c00021a49080e0e0c0002032429352a362a35291ab8081a3d080e0e0c00036403052a68010207292503511e333b6502013b64293b1a1f080c0003036b1a9708291a03080c00021a05080e0e0c0002032429352a362a35291a74081af9070e0e0c00036403052a68010207292503511e2f3b6502013b64293b1adb070c000303041a5b08103b503b50293529351a3f081ac4070e0c000303043b5002041a4708103b50293765021e293529351a20081aa5070e0e0c000303043b5002041a2708103b50293764312210221222102d1a1e080e0e0e0c0006220d2e2213221522141a84070e0c000629352a3622161a07080c0002292b2217221922181a69070e0e0c000629352a362a3b1a4b070c000303032e020b2e2b1ae6070e0e0e0c000322151ae3070c00023b2a693c28403b1ade070e0e0e0c000429221d221d2d6b29221b69222103d5221a22252a3b1a08070e0c00030319293b1afd060e0e0c000303043b5002041aaf07103b503b02aa2a352b362b1ad1060e0e0c00021ad1060e0e0c000203043b5002041a9307103b502b352c362c352937293629353c1ab8060e0c0003030d2938293c1aab060c00036402013b64031329362936293b301a67070c0004503b26030242293629353b1a86060e0e0e0c00030311293729353c1a76060e0e0e0c00036402013b6403043b5002041a3a07103b50293629372936293b311a23070c0004503b26042d2c2508250826061ec93b27066502013b222f3522303622313722323822332306223423072e2e2e2e2211220c30306808040200222c3b2c1af1062d22380e0e0e0c00065029352a36222c03a32225291ae9050e0e0c00021ae9050e0e0c0002038a29352a362a352937293629353c1ada050e0e0e0c0003030d2938293c1acb050c00036402013b64031329362936293b3b1a87060c0004503b26030242293629353b1aa6050e0e0e0c00030311293729353c1a96050e0e0e0c00036402013b6403043b5002041a5a06103b50293629372936293b3b1a43060c0004503b26042b250526041e963b270402013b6402013b223a35223b36223c37223d38223e2306223f23072e2e2e2e34221730306808040200223c3b2c22442d22430e0c00065029352a3622161a12050e0e0e0c00021a11050e0e0c000203043b5002041af305103b5022183b1a22050e0e0e0c0003291ae8050e0c0002293b2a1ade040e0e0e0c00021add040e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652d3b1ac2040e0e0e0c00030304220f020a220f2e1aa8050e0c0003293b1aa7040c000303032a020b2a2a1a9a050e0e0e0c0003293b1a8f040c000303042220020a22202a1a88050e0c0003293b1a77040c000303042229020a22292a1a78050e0c0003293b1a5f040c00030304222f020a222f2a1a68050e0c0003293b1a47040c00030304224d020a224d2a1a58050e0c0003224b2a45334627460fdd293528091a23040c000303a22936313532363337343a2d2b2d2c301a34050e0c00062e1a34050e0c0002220e35220f3622103722113922123a2e2b2e302f2e1a10040e0c000729352a362a3b1adb030c0003030332020b322b1a06050e0e0e0c0003293b1ac3030c000303042218020a22182a1af4040e0c0003221835221936221a37221b38221c3a221d2306221e23072f2f2f2f220d3030306808221a322b22222222222122230e7b07230006293528131a75030e0e0c0003034e29362939293b1a85030e0e0c00032b352c361aa1043231220e2f221168062b0202ff023b1a47030c000303032a020b2a2c1a8a040e0e0e0c000329221022102d2210220f22110e0e0e7b071100062935281c1a19030e0e0c000307dc29362a392d3633352c291af5020e0e0c00021af5020e0e0c0002035529352a362a38293b1a0b030c00032c372a291ad1020e0e0c00021ad1020e0e0c0002032229352a362a381a2104342210306b2a2a1a1f040c0003502b250526041e2f260402023b50502c250626051e613b270502013b64220c35220d36220e37220f3929312e1af5030e0e0c000429352a3632343032311aec030e0c0006293b1a73020c000303032b020b2b2a1ade030e0e0e0c000322153522163622173722183822193a221a2306221b23072f2f2f2f220d303030680804020022162a02026c011ab1030e0e0c00035029352a3629221a2e122000010002000e0c00042b3b1a13020c000303033b024b2b3b2a1af5010e0e0c00021af5010e0e0c0002031c2a352b362a2c1a75030e0e0c00032a2a2505250526031e293b66020129650402002a221d312c122400010001000e0e0c000550293565221a3b2a1aa9010e0e0c00021aa9010e0e0c000203352a352b362a38293b1abf010c00032d3b1a97010c0003030329020b292e1a1a030e0e0e0c00032c2a2507250726051e413b270502012965292211220e2210220f220e1a8d010e0e0c000729352a362a3b1a57010c000303032d020b2d2b1ae2020e0e0e0c0003293b1a3f010c000303032f020b2f2a1ad2020e0e0e0c0003293b1a27010c000303042213020a22132a1ac0020e0c0003293b1a0f010c00030304222a020a222a2a1ab0020e0c0003222a35222b36222c37222d38222e3a222f2306223023072f2f2f2f220f3030306808222c322b22342234223322350e7b073500062935280c1ac1000e0e0c0003036229360402002a2c342c56970c00055029352a362a3b1aa2000e0e0e0c00030304220c020a220c2b1a48020e0c0003220c35220d36220e37220f3822103a22112306221223072f2f2f2f220c3030306808220e322b22162216221522170e7b071700062a3232323231337b070a00066602112e2e692d0e0e0c00022c2a35452a3646641f050e0e0e0e0e0e0000000000000000b00a0000000000000000000000000000|@9864,I105,I218,I251,@9865,@9608,@9867,I253,@9382,@9366,@9869,@9871,@9873,@9875,@9877,@9879,@3360,@9961,@14406,@2781,@2836,@1576,@9974,@10147,@10149,@10151,I11,@5168,@5168,I255,@7453,@10153,@2773,@2776,@10156,@10158,@10160,@10162,@10164,@10166,@10168,@10231,@10233,@10235,@10237,@10241,@10243,@10245,@10255,@10258,@10267,@10269,@10271,@10286,@10288,@10290,@10292,@10294,@9863| 9863:O1|@10296 9864:S35|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429 9865:O1|@9866 9866:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a36293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@9865| 9867:O1|@9868 9868:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9867| 9869:O1|@9870 9870:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9869| 9871:O1|@9872 9872:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9871| 9873:O1|@9874 9874:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9873| 9875:O1|@9876 9876:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a36293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@9875| 9877:O1|@9878 9878:D7,160|00802b1aa2000e0e0e0c00021aa1000e0e0c000203692b352c362a352937293629353d1a92000e0e0e0c000303041a8f00103b5029353b1a7e000e0e0e0c00030322293729353c1a6e000e0e0e0c0003030d2936293b1a6f000c0003640202293664020d2936293b1a5d000e0e0c0003642d1a5b000c00022a2a69270702013b420e0e0e0e0e0e0e000000000000000090000000000000000000000000000000|@1399,I105,I218,I251,@1377,I253,@9877| 9879:O1|@9880 9880:D11,176|00812c3b1ab1000e0e0c000303172b3b1aa5000e0e0c000303043b5002041a9f00103b026c2c352d362d1a9b000c00021a9d000e0e0c000203043b5002041a9700102d352e362c36293b1a93000c000329362f3a2a1a90000e0c00022a1a90000e0c00020403002b2b2b1a8b000c00045029352a362b37342c2c346b292b69220e220d1a7a000e0e0e0c00032a2a692711430e0e0e0e0e0e0000000000000000a0000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,I253,@9882,@9884,@9881,@9879| 9881:O1|@9886 9882:O1|@9883 9883:D6,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203352b352c362a3829353d1a5e000e0e0e0c0003030a29362c35292b696502082b35291a4e0069642b1a50000e0c00022a2a69270502013b420e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I251,@588,@9882| 9884:O1|@9885 9885:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@9884| 9886:D15,264|00822d1a0a010e0e0e0c00020402002e3b1a04010e0c0003030d1a03012a2a35452a36465102ae3b2f291afb000c00021afd000e0e0c0002031729362b3c1af7000c0003292b25042504511e223b6502012a653b1ae9000e0e0c00022a1ae8001aed000e0e0c00031aed001af2003b2d2d3b3b3c680828072a693b34291aa8000e0c00021aa9000e0e0c0002031729362b3c1aa3000c0003292b25042504511e233b6502012a653b1a95000e0e0c00022a1ab4001a99000e0e0c00031ab1001a9e003b2d2d3b3b3c680828072a69332f452a46260b29352a362c311a9a000e0e0e0c0003302b452c462a472705440e0e0000000000000000f8000000000000000000000000000000|@9888,@9889,I251,@9895,I105,I218,I106,@9506,@9896,@1385,@808,@9898,@9899,@475,@9887| 9887:O1|@9901 9888:S34|44415441545950455f52455028292e63686f6f7365436f6e73747252657072283229 9889:O1|@9890 9890:D6,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203352b352c362a352b3629353c1a5c000e0c000303053b2b69020d291a55000e0e0c0002292c69642c1a50000e0c00022a2a69270602013b420e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I251,@9891,@9889| 9891:O1|@9892 9892:D10,272|00802b3528051a0f010c000303622b362c382937293629353d1afc000e0c00036503492937293629353d1aeb000c000303043b5002041ae7001029362a372a2f1ae5000e0e0c00031ae5002a690402002c2b2b1ae2000e0e0e0c000450293527071adc002e0e0e0e7d0500023d6502862b353d1aa2000e0e0e0c000303033c02752b353e1a91000e0e0c000303672b36291ab4000e0c00021ab5000e0e0c0002030d2936293b1a6f000c00036402013b030e29352936291a86002f0e7d0600023b2a291a82000e0e0e0c00021a81000e0e0c0002031729362b3c1a7b000c0003292b25042504511e253b6502012a652968016502013d420e000000000000000000010000000000000000000000000000|@9894,I251,@1731,@1734,@9893,@1414,@9891,I105,I218,I106| 9893:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 9894:S30|44415441545950455f52455028292e6765745475706c654b696e64283129 9895:O2|@808,@475 9896:O1|@9897 9897:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9898:S10|626f7865642f73697a65 9899:O1|@9900 9900:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9901:D25,808|00812c1a2a030e0e0e0c00021a29030e0e0c000203202c352d362a35293b1a1f030c0003030c2a3b1a15030e0e0c000302013b6602013b03b92c3529361a08031a0d031a12030e0e0e0c00032a1a10031aed020e0e0c000303033c02222a1acf020c00021ad1020e0e0c000203102a3b1aed023b28081aef020c000602013b03051aec0202012a3b1aed020e0e0c00023c1aec021af1020e0e0c00032c2c3b2d2d3b3b3c680828072a691a9b021ae0021ae5020e0e0c0003293b692b2a69280e2a3b6a2a1a69020e0e0c00021a69020e0e0c00021a61020e0e0c0002030c291abe020e0e0e0c0002020129293b69270d0fcb2c1a3a020e0e0e0c00021a39020e0e0c000203202c352d362a35293d1a2f020c0003030c2a3b1a25020e0e0c000302013b6602013b03152c3529361a78022e2b1a7b020c0004293b69660fd22c1aee010e0e0e0c00021aed010e0e0c000203202c352d362a35293c1ae3010c0003030c2a3b1ad9010e0e0c000302013b6602013b03152c3529361a2c022e2b1a2f020c0004293b69660fcc2c1aa2010e0e0e0c00021aa1010e0e0c0002032c2c352d362a35291a88010e0c00021a89010e0e0c000203102a3b1a8501020249010e0e0c000302013b6602013b03152c3529361ad4012e2b1ad7010c0004293b69660fce2c3b2a1a48010e0c00021a49010e0e0c000203312a352b362a35293b1a3f010c000303032c020f2c3c1aaa010202f6000e0e0e0c00032b2a2506250626041e3c3b270402012965293c1a92010e0e0e0c0003030e3b2d2f1a8c012f0e0e7b05050004293b1a77010c0003035a3b2e291adc000202b0000e0c00021ad9000e0e0c0002031729362b3c1a4b010c0003292b25042504511e273b6502012a65291aad000e0e0c00020303290207291a3f010c0002293c1a3f010c00033b312b1a3e01327b050800043b2e291a8200020256000e0e0e0c00021a7d000e0e0c0002031729362b3c1aef000c0003292b25042504511e293b6502012a65291a51000e0e0c00020303290207291ae3000c0002293c1ae3000c00033b30322c1ae900330e0e0e7b06080005430e0e0e0e0e0e0e000000000000000018030000000000000000000000000000|@9903,I105,I218,I251,@9904,@472,@9905,I48,I154,@1004,@9506,@9910,@1385,@542,@9912,@2349,@577,@9925,I106,I113,@9946,I152,I240,@9952,@9902| 9902:O1|@9957 9903:S47|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f736552657072283129 9904:O1|9 9905:O1|@9906 9906:D13,384|00812c350a090032014a00140145002d01f600ca009f00140040002b3b69291a66010e0e0e0c00023e2a1a63013c6b293b69291a52010e0e0e0c00023e2a1a57013c6b27050fdd1a56010fdd1a51010fdd2c362d372a1a4f010c000203041a4f01103b502a3b1a4f010c0003291a38010e0c000203043b5002041a4301102e353d1a44010e0c0003030c2e3b3b1a40010e0c0004020628062f3b3b6b280d2b2b2e6b270402bb2c362d382d353d1a18010e0c0003030c2d3b3b1a14010e0c0004020628062e3b3b6b280d2c2b2d6b6602902c362d372d353d1aed000e0e0c0003030c2d3b3b1ae8000e0c0004020628062e3b3b6b280d2c2b2d6b6602642c363d2a3b6a2d3b692a2a69291acb000c00023e2a1acb003c6b270502462c362d37280d2b02023b002f020236002c020231006b65022d1a690002282b3b69291a48000e0c00023e2a1a47003c6b293b69291a36000e0e0e0c00023e2a1a3b003c6b2705430e0e0e0e0e0e000000000000000070010000000000000000000000000000|@9908,@2273,@550,@546,@475,I105,@1363,I253,@2943,I251,@2288,@9907,@535| 9907:O1|@9909 9908:S29|44415441545950455f52455028292e636f6e7374724d61746368283229 9909:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@9907| 9910:O1|@9911 9911:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9912:O1|@9913 9913:D18,600|00812c350a0900f001ca00c100d300ce01b8006a01d6001400b3002c36293b1a3e020e0e0e0c000303032c028a291a37021a3c020e0c0003280e2a3c6a2a291a36020e0e0e0c00021a35020e0e0c0002031d29352a362a353d1a2c020e0c00030309292503511e283b02013b6502013c64030b291a19020e0e0c00020201293b1a15020e0e0c00023c1a14021ae1010e0e0c00032b1a10023b2d2d3b3b3c680828072a69333b69291a05020e0e0c00023e2a2d3c6b2709640fcf1afb010fcc2c363d2a3b6a640fcd2c363d2a3b6a640fd92c363d2a3b6a640fd22b0fd12c362d373d2b3b6a2a1ad7011a84010e0c00032a2a69280e2a3c6a2a291a7b010c00021a7d010e0e0c0002031d29352a362a353d1a74010e0c00030309292503511e253b02013b6502013c64030b291a61010e0e0c00020201293b1a5d010e0e0c00023c1a84011a29010e0e0c00032b1a58013b2d2d3b3b3c680828072a69220d3b69291a4c010e0c00023e2a2d3c6b270d02cd2c363d2a3b6a2d3b692a2a69280e2a3c6a2a291af1000204b300b1000c00021aed000202a7000e0e0c0002032529352a362a353d1ae0000206920090008e000e0c00030309292503511e373b02013b6502013c640309291ac500317d09000229270502692b3b691af5002a691af8002a69291aca000e0e0e0c00023e2a1aef003c6b270402472b3b69280e2a3c6a2a291a74000e0c00021a75000e0e0c0002031d29352a362a353d1a6c000e0c00030309292503511e263b02013b6502013c640309291a59002e7d0600022965430e000000000000000048020000000000000000000000000000|@9915,I113,@9916,@1385,I105,I218,I251,@2349,@9506,@9919,@1004,@2273,@542,@9921,@9914,@6866,@475,@6867| 9914:O1|@9924 9915:S29|44415441545950455f52455028292e636f6e7374724170706c79283229 9916:O1|@9917 9917:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@9918,@472| 9918:S49|44415441545950455f52455028292e636f6e7374724170706c792832297475706c654170706c79436f6465283229283129 9919:O1|@9920 9920:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9921:O1|@9922 9922:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@9923,@472| 9923:S52|44415441545950455f52455028292e636f6e7374724170706c792832297461675475706c654170706c79436f6465283329283129 9924:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9925:O1|@9926 9926:D17,408|00822d1a9a011a9f010c00032c1aa0011aa5010e0e0c000303033c02222c1a9f010c00021aa1010e0e0c000203102c3b1a7d013b28081a97010c000602013b03051a940102012c3b1a95010e0e0c00023c1a94011a99010e0e0c00032c2c3b2d2d3b3b3c680828072a69331a32011a87010c0003321a38011a3d010e0e0c000303033c0222321a37010c00021a39010e0e0c00020310323b1a15013b28081a2f010c000602013b03051a2c010201323b1a2d010e0e0c00023c1a44011a31010e0e0c00032c2c3b2d2d3b3b3c680828072a6922101ac9001a2e010e0e0e0c0003220f1acb001ad0000e0c000303033c022a220f1aca000e0e0e0c00021ac9000e0e0c00020314220f3b1aa4003b28081abe000e0e0e0c000602013b03051ab8000202220f3b1ab8000e0c00023c1ae0001abd000e0e0c00032c2c3b2d2d3b3b3c680828072a69293b69302a69220e2a69280e2a3b6a2a1a67000c00021a69000e0e0c00021a61000e0e0c0002030a291aa60022197d1b0002292716440e0e0e0e000000000000000088010000000000000000000000000000|@9928,@472,@9905,I48,I251,I105,I218,I154,@1004,@9506,@9929,@1385,@9912,@9931,@9933,@9927,@2349| 9927:O1|@9945 9928:S40|44415441545950455f52455028292e637265617465556e617279436f6e7374727563746f72283329 9929:O1|@9930 9930:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9931:O1|@9932 9932:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9933:O1|@9934 9934:D18,488|00812c350a0900a301b800c200c7007d01bd005a01ca001400b3002c36293b1ace010e0e0e0c000303032c028a291ac7011acc010e0c0003280e2a3b6a2a291ac6010e0e0e0c00021ac5010e0e0c0002031d29352a362a353d1abc010e0c00030309292503511e283b02013b6502013c64030b291aa9010e0e0c00020201293b1aa5010e0e0c00023c1aa4011a71010e0e0c00032b1aa0013b2d2d3b3b3c680828072a69333b69291a95010e0e0c00023e2a2d3c6b2709640fd51a8b010fd21a86010fcf1a81010fcc1a7c010fc92b0fc82c37291a79011a26010e0e0e0c0003280e2a3b6a2a291a1e010e0e0e0c00021a1d010e0e0c0002031d29352a362a353d1a14010e0c00030309292503511e283b02013b6502013c64030b291a01010e0e0c00020201293b1afd000e0e0c00023c1a24011ac9000e0e0c00032b1af8003b2d2d3b3b3c680828072a69333b69291aed000e0e0c00023e2a2d3c6b270a02692b353d1ab1000e0e0c0003030e2b3c3c1aec002e0e0e7b0504000428062c3c3c6b02462b1ae00069291ab300020c390037003500330031002f000e0e0c00023e2a1acb003c6b6502202b353d1a68000e0c0003030e2b3b3c1aa4002e0e0e7b0504000428062c3b3c6b430e0e0e0e0e0000000000000000d8010000000000000000000000000000|@9936,I113,@9937,@1385,I105,I218,I251,@2349,@9506,@9940,@1004,@2273,@542,@9942,@9935,@2288,@684,@2587| 9935:O1|@9944 9936:S32|44415441545950455f52455028292e636f6e7374724465737472756374283229 9937:O1|@9938 9938:D3,48|00802b3b1a31000e0e0c000328061a2f002b3c6b64420e0e000000000000000020000000000000000000000000000000|@9939,I106,@472| 9939:S55|44415441545950455f52455028292e636f6e73747244657374727563742832297475706c654465737472756374436f6465283329283129 9940:O1|@9941 9941:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9942:O1|@9943 9943:D3,48|00802b3c1a31000e0e0c000328061a2f002b3c6b64420e0e000000000000000020000000000000000000000000000000|@9939,I106,@472| 9944:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9945:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9946:O1|@9947 9947:D21,464|00822b1ad2010e0e0e0c00021ad1010e0e0c000207cf2b352c362a35291ab8010e0c00021ab9010e0e0c000203522935293b1ab3010c000303202c361ab101322b1ab4010e0c000433332f1ab2010e0e0e0c00042a2a696602232c3628082b6929332c1a92010e0e0e0c00043434301a8e010e0e0e0c00042a2a692704640fd3293c1a83010c000303202b361a8101312b1a64010e0c000432322e1a62010e0e0e0c00042a2a69660fcf293d1a59010e0e0c000303202b361a3501312b1a38010e0c000432322e1a36010e0e0e0c00042a2a69660fcc2b3628053269291a38011a3d010202c9000e0e0c00032b1a38011a15010e0e0c000303033c02222b1ad7000c00021ad9000e0e0c000203102b3b1a15013b28081a17010c000602013b03051a140102012b3b1a15010e0e0c00023c1a14011a19010e0e0c00032c2c3b2d2d3b3b3c680828072a692f1a0a011a0f01020258000c0003293b692b2a69280e2a3b6a2a1a71000e0e0c00021a71000e0e0c00021a6900020232000e0e0c0002030c291ae2000e0e0e0c000202012922143c1adb000c000329221522111a6000020209000e0c00042b2a69270f6602013b440e0e0e0e0e0e0000000000000000c0010000000000000000000000000000|@9949,I105,I218,I113,@1444,@9925,@9946,I251,@9950,@472,@9905,I48,I154,@1004,@9506,@9948,@1385,@542,@9912,@2349,I239| 9948:O1|@9951 9949:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707231283329 9950:O2|8,0 9951:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9952:O1|@9953 9953:D17,256|00822c1a02010e0e0e0c00021a01010e0e0c000203cd2c352d362a363d31306a291af4001af9000e0e0c00032b1af8001afd000e0e0c000303033c02222b1ac7000c00021ac9000e0e0c000203102b3b1ad5003b28081adf000c000602013b03051adc0002012b3b1add000e0e0c00023c1adc001ae1000e0e0c00032c2c3b2d2d3b3b3c680828072a692f1ad2001ad7000c0003293b692b2a69280e2a3b6a2a1a65000e0e0c00021a65000e0e0c00021a5d000e0e0c0002030c291ab2000e0e0e0c000202012922133c1aab000c000329220f22141aa8000e0c00042b2a69271102013b440e0e0e0000000000000000f0000000000000000000000000000000|@9955,I105,I218,@472,@9905,I48,I251,I154,@1004,@9506,@9954,@1385,@542,@9912,@2349,I239,@9952| 9954:O1|@9956 9955:S60|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963726561746552657072283229 9956:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9957:D21,416|00832c1aa2010e0e0e0c00021aa1010e0e0c000207d52c352d362a35291a88010e0c00021a89010e0e0c0002032929352c362a3f1a81010e0e0c000303082807342c336b0205280634326a29342c1a6f010c0004660fd0293c1a6c010e0c000303152b36280633316a29332c1a51010e0e0c0004650fce293d1a4c010e0c000303152b36280633316a29332c1a31010e0e0c00046502ce2b363c3b341a31010e0e0c0004291a30010e0c00023c2b336a291a2c011a31010e0e0c00032d1a30011a05010e0e0c000303033c02262d1ad7000c00021ad9000e0e0c000203142d3b1a0d013b28081a0f01020296000c000602013b03051a080102012d3b1a09010e0e0c00023c1a08011a0d010e0e0c00032c2c3b2d2d3b3b3c680828072a692f1afe001a030102023c000c0003293b692b2a69280e2a3b6a2a1a6d000e0e0c00021a6d0002021e000e0e0c00021a61000e0e0c0002030c291ad6000e0e0e0c0002020129270e323c1ace000e0e0e0c000329332e331ac9000e0e0c00052b2a69270602013b1f040e0e000000000000000090010000000000000000000000000000|@9959,I105,I218,I232,@9925,I251,I11,I47,@472,@9905,I48,I154,@1004,@9506,@9958,@1385,@542,@9912,@2349,I239,@9902| 9958:O1|@9960 9959:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707232283329 9960:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 9961:O1|@9962 9962:D7,136|00853036293b1a87000c00032936313532362b220c34341a7e000e0e0e0c0005313532363337343a302f2d2f2e2e1a6f000c000729352a362a3b1a6b000c0003030332020b322b1a66000e0e0e0c0003293b1a53000c0003030331020b312a1a56000e0e0e0c0003292c69270f1f060e000000000000000078000000000000000000000000000000|@9964,I253,@9965,@9382,I251,@9971,@9963| 9963:O1|@9973 9964:S48|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429646563436f6e73747273283329 9965:O1|@9966 9966:D7,168|00832e1aaa000e0e0e0c00021aa9000e0e0c000203142d1a96000e0e0e0c00021a95000e0e0c000202013b035e2e352f362f3530362c3729353d1a83000c000303043b5002041a7f00103b5029362a373c340e0e0e0c00022b3b2b1a72000e0e0e0c0004502a3b220c1a64000e0c0004503c3b2b316b302f220e220e1a59000e0e0c00052a2a69270a02013b1f040e0e000000000000000098000000000000000000000000000000|@3592,I105,I218,I251,@9967,I255,@9965| 9967:O4|@14322,@596,@9969,@9968 9968:O5|@9970,1035,0,1035,0 9969:S18|646563436f6e733a204e6f74206c6f63616c 9970:S51|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f434f444547454e5f5041525345545245452e736d6c 9971:O1|@9972 9972:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9971| 9973:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9963| 9974:O6|@9975,@2667,@2271,@2463,@2569,@2651 9975:D9,144|00842f2f1a91000e0e0c0003302a30305659566a567b1a87000c0008293b1a87000c000303041a8700103b503b50291a86000e0e0e0c00023e2a69332d34341a7e000e0e0e0c000534315677220c220c56a81a73000c0007293b1a4b000c000303032a020b2a2a1a66000e0e0e0c00032c2a6927071f050e000000000000000080000000000000000000000000000000|@9977,@9978,@9980,I251,@10046,@10049,@10054,@10058,@9976| 9976:O1|@10146 9977:S39|545950454944434f444528292e637265617465446174617479706546756e6374696f6e73283529 9978:O1|@9979 9979:D7,184|00812c1aba000e0e0e0c00021ab9000e0e0c000203812c352d362a3829352937293629353c1aa8000e0c000303042937024129353b1a98000e0c000303042936023129363b2a291a76000e0e0e0c00021a75000e0e0c0002031729362b3c1a77000c0003292b25042504511e253b6502012a66293b1a68000e0c00036603033c02013d300e0c00022c311a5b000c00032a2a69270602013b430e0e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@1399,I105,I218,I251,I106,I113,@9978| 9980:O1|@9981 9981:D5,104|008631311a69000e0e0c0003293b2a1a66000e0e0e0c00021a65000e0e0c000203282a352b362a2c220d220d31220e220e220e1a52000e0e0e0c00092a2a2505250526031e363b66020129661f070e0e000000000000000058000000000000000000000000000000|@9983,@2702,I105,I218,@9982| 9982:O1|@9984 9983:S36|545950454944434f444528292e657175616c697479466f72446174617479706573283429 9984:D54,1768|00873235293829352a362c35220e362a07d32c37293629353c1ad4060e0c000303042937024129353b1ac4060e0c000303042936023129363b2a291aba060e0e0e0c00021ab9060e0e0c0002031729362b3c1ab3060c0003292b25042504511e253b6502012a662f37293629353c1a7f060c000303042937024129353b1a70060e0c000303042936023129363b2a291a66060e0e0e0c00021a65060e0e0c0002031729362b3c1a5f060c0003292b25042504511e253b6502012a66291a51061a56060e0e0e0c00032214352215363c28403b1a4b060c00041a4d062a2c6a2c3c1a25060202b1050e0e0c0003292b2d6a2f3b1afb050c00030304221902511a2f062b69342a1a10060e0c0003312a1a27060c00031a29063032306b220e2a1af7050c00033c28403b1af5050e0e0c00041a15062a693c2e693c28403b1ae1050e0e0c000429332d2d6b29222469270a1afe05221a221d6a1afe051a03060c00023e2a1a03063c6b22132f3333220e222022202220220c34220d1af4050e0c000c3c2b1af3052c6b220c1a6c050e0c00021a6d050e0e0c00021a65050e0e0c000203c82216351ad8052a1adc050e0c0003291adc051ad1050e0e0c0003220c3b1ad6050e0e0e0c0003293b2a1a2a050e0e0e0c00021a29050e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa4050e0c00022c1aa4051ae9040e0e0c000303033c02222c1ae3040c00021ae5040e0e0c000203102c3b1a81053b28081a83050c000602013b03051a800502012c2a1a81050e0e0c00023d1a80051acd040e0e0c0003322c3b2d2d3c3b3c680828072a69221e2a6929222e69270c0fd33b220d291a87040c00021a89040e0e0c0002031729362b3c1a83040c0003292b25042504511e223b6502012a652221352222363c28403b1a7c040e0c00042b3c1a5b040c00033c28403b1a69040e0e0c00042a3c1a47040c00031a09052b2e302d306806302a1a45040e0e0c0003221c3c1a2a040e0e0e0c0003222a352d2a1aec040e0c0003293b1aeb040c000303041aeb04103b503b50293b1ae9040e0e0c00030371293c1ac5040e0e0c0003293b1ac3040c000303041ac304103b503b50293b1ac1040e0e0c00030325293c1a9d04020255030e0e0c00032d2a3b6a64340e0e0e0c000229341aa3040c00036402162c3b1a80040e0c000303041a9704103b503b503d2d6929321a82040e0e0e0c00036502162b3b1a5c040e0c000303041a7304103b503b503d2c693f2a692e3b1a53030c000303051a6304020d1a5e042f1a62040e0e0e0c0003291a60040e0c00023e2a2d3c6b2227351a59042a1abd030e0e0c0003291a54041ab1030e0e0c0003220e3b1ab6030e0e0e0c0003293b2a1a0a030e0e0e0c00021a09030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a84030e0c00022c1a84031ac9020e0e0c000303033c02222c1ac3020c00021ac5020e0e0c000203102c3b1a61033b28081a63030c000602013b03051a600302012c2a1ad1030e0e0c00023d1ad0031aad020e0e0c0003322c3b2d2d3b3b3c680828072a692232351abc032a1a00030e0c0003291ab8031af5020e0e0c0003221b3b1afa020e0e0e0c0003293b2a1a4e020e0e0e0c00021a4d020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ac8020e0c00022c1ac8021a0d020e0e0c000303033c02222c1a07020c00021a09020e0e0c000203102c3b1aa5023b28081aa7020c000602013b03051aa40202012c2a1a15030e0e0c000222231a2b031af0010e0c0003322c3b2d2d3b3b3c680828072a69223a2a69223b3c1ac4010e0c0003222e1aab010c00021aad010e0e0c000203043b5002041af702103b50222e352935293b1a2a020e0e0e0c0003291ae8020e0c0002293b2a1a76010e0e0e0c00021a75010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a42010e0e0e0c00030304222e0205402a22306a3d22401a43010c00032246351a9a022a1ab6010e0e0e0c0003291a94021aa9010e0e0c0003223c3b1aae010e0e0e0c0003293b2a1a02010e0e0e0c00021a01010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a7c010e0c00022c1a7c011ac1000e0e0c000303033c02222c1abb000c00021abd000e0e0c000203102c3b1a59013b28081a5b010c000602013b03051a580102012c2a1a59010e0e0c0002311a08021aa5000e0e0c0003332c3b2d2d3c3b3c680828072a6922122a6929225e6922152a69273d2713022f3b1a24010e0c00023d1adc011a71000e0e0c00031ad9011ade013b2d2d3c3b3c680828072a692d2a6929221469270527061f080e0e0e0e0e0000000000000000d8060000000000000000000000000000|@9986,I251,I105,I218,I106,@9987,@1385,I11,@9990,@9991,@2702,@9995,@9997,@9999,@10006,@10008,@535,@10010,@475,@10028,@122,@10029,I253,@2330,I48,I154,@1004,@2332,@10030,@10032,I107,I234,@2320,I233,@2323,@2318,@10006,@10034,@2273,@10028,@10029,@9506,@10036,@10028,@10038,@10039,@2773,@10041,@10028,@2742,@10043,@9985,@542,@849| 9985:O1|@10045 9986:S58|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229 9987:O1|@9988 9988:D4,48|00803c28401a30001a35000e0e0c0004291a34006964420e000000000000000020000000000000000000000000000000|@9989,@588,I11,79992| 9989:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322961726754797065732d283129 9990:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 9991:D2,40|00801a2b0056172d6a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@9993,@9992| 9992:D3,72|008056083d1a48000e0c00032c352d362a56471a42000e0e0e0c00032c2a3c6a642a0e0e0e0c00023f2a692704420e0e000000000000000038000000000000000000000000000000|@9994,I106,I107| 9993:S90|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129 9994:S93|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129283129 9995:D8,136|00802b3d1a89000e0e0c0003561956291a85000e0e0c0003293b1a83000c000303041a8300103b50293b1a83000c00030325293c1a61000e0e0c00032b2a3c6a6456380e0e0c00022956471a6a000e0e0e0c00036402142a3b1a44000e0c000303041a5b00103b503b2b693f2a696642000000000000000078000000000000000000000000000000|@9996,I106,I107,I234,@2320,I233,@2323,@2318| 9996:S98|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6c6f63616c4172674c6973742d283129 9997:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@9998,I253,I106,I255| 9998:S91|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6d6b41646472283129 9999:D2,48|00802b352c362d37563756481a2900300e0e0e7b07030006000000000000000020000000000000000000000000000000|@10001,@10000| 10000:O1|@10002 10001:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283129 10002:D9,328|00842c291a49010e0e0c00021a49010e0e0c0002039229352a362a35293829352937293629353c1a36010e0e0e0c00030311220e3629353c1a25010e0e0c00036402013b64031529362936220f3629362b2a1a0b010c000327040239293629353b1afc000e0c00030311220e3629353b1aed000e0e0c00036402013b64031529362938220f3629382b2a1adb000c0003270402013b270403052a68010207292503511e9f3b6502013b64293b1ab1000e0e0c0003030e303529301ab3002f0e0e7e0900032935293529362a372c363335343633352b2a1a9f000c00032d2a3b6a642b0e0e0e0c00023f2a69303b69302a691a8c002a692c2a69280e2a3b6a2a1a4e000e0e0e0c00021a4d000e0e0c00021a45000e0e0c0002030a291a6a0022137d1700022927101f050e0e0e0e0e0e0e000000000000000038010000000000000000000000000000|@10004,I105,I218,I251,I113,@10003,I107,@542,@2349| 10003:O1|@10005 10004:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283329 10005:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025c2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a33000c000303043b5002041a4f00103b502c36430e0000000000000000a8000000000000000000000000000000|@2287,I251,@10003,@2288,I253,I107,@2286| 10006:O2|@472,@10007 10007:O2|@540,0 10008:O1|@10009 10009:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10008| 10010:O1|@10011 10011:D31,896|008a220c1a81030e0e0c00021a81030e0e0c000207ca220c35220d362a362b372c382a2211221122111a6c030e0c00052c1a54030e0c00021a55030e0e0c0002030d2c35293c1a57030c00036402013b03c329353d1a48030e0c0003030c293c3b1a44030e0c0004020628062a3c3b6b293b69291a39030e0e0c00023e2a1a37033c6b2d353d1a17030c0003030c2d3b3b1a14030e0c0004020628062e3b3b6b1a1d031a0a030e0e0e0c00023e2a2c3c6b3c2d1a12032c6b31353d1ae2020e0e0e0c0003030c313b3b1adc020e0c000402062806323b3b6b1af5021ad20202027d020e0e0e0c00023e2a2c3c6b220f221d221d221d221d221d221d221d221d221d221d1ad2020e0e0e0c000c3c2e2c2c6b270c0fd0220e1ac6020e0e0e0c00022b353d1a7a020e0e0e0c000303112b37293528051a69020e0e0c00036402013b03043b5002041a9f02103b502b362c372936291a9a020e0e0e0c0002292e1a97020c00031a99022a690402002f2b2b1a96020e0e0e0c000450293529221422142214221a221a221a1a85020e0e0c0008220c221c221c221c1a7d020e0e0c000529353d1afa010e0e0e0c0003030c293d3b1af4010e0c0004020628062a3d3b6b221d221e1a59020e0e0c0003293b1a57020c000303041a5702103b503b50293b1a5502020274010e0e0c00030325293c1a2d020e0e0c00033b2a3c6a64221e0e0e0c000229221e1a36020e0e0e0c00036402031a32023f2a69293b69291a90010e0c00023e2a303c6b22142224222422241a1c020e0c000529353d1a62010e0e0e0c0003030c293d3b1a5c010e0c0004020628062a3d3b6b222522261ac1010e0e0c0003293b1abf010c000303041abf01103b503b50293b1abd010e0e0c00030325293c1a99010e0e0c00033c2a3c6a6422260e0e0c00022922261aa2010e0e0e0c00036402031aae013f2a69293b69291afc000e0c00023e2a303c6b293b69322a69291ae9000e0e0c00023e2a22153c6b221e353d1ac7000c0003030c221e3b3b1ac3000c000402072806221f3b3b6b1a6c011ab9000e0e0c00023e2a2c3c6b2221353d1a98000e0c0003030c22213b3b1a93000c00040207280622223b3b6b1a44011a89000e0e0c00023e2a2c3c6b3c2a311a39016b222922372237223722372237223722372237223722371a87000c000c3c2f2c2c6b2726270602031a0e011f0b0e0e0e0e000000000000000070030000000000000000000000000000|@10013,I105,I218,@10014,I251,@2288,@2273,@550,@718,@542,@10007,@10010,@10016,@10018,@10021,@1734,@10023,@1414,@2313,@10025,I107,I234,@2320,I233,@2323,@473,@10012,@541,@718,@10007,@542| 10012:O1|@10027 10013:S75|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322970726f63657373436f6e73747273283129 10014:O1|@10015 10015:D12,264|00832e353f1a08010e0c000303382e362f372936293131311afd000e0e0c000529353d1aea000e0e0e0c0003030e292d3b1aec00320e0e7b050a000428062a2e3b6b270402a42e353d1ac4000e0c0003037e2e362f372a3b1acd000e0e0c00032a3b1ac3000c00032935322a1ac1000e0e0c0003293b1abf000c000303041abf00103b503b50293b1abd000e0e0c00030321293c1a99000e0e0c00032d2a3b6a64330e0e0e0c000229331aa3000c00036402162c3b1a80000e0c000303041a9700103b503b503d2d693f2a692707021a2e353c1a3a000e0e0e0c000303043b5002041a7b00103b502e361f040e0e0e0e0000000000000000f8000000000000000000000000000000|@2287,I251,@10014,@2288,I253,I107,I234,@2320,I233,@2323,@2318,@2286| 10016:O1|@10017 10017:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10016| 10018:O4|@14322,@596,@10020,@10019 10019:O5|@1349,1515,0,1515,0 10020:S19|4e6f7420612066756e6374696f6e2074797065 10021:O1|@10022 10022:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c0002032d2b352c362a3528061a57000c000303043b5002041a5300102a362b372a2a692c1a4f000c00022a2a69270602013b420e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@1423,@10021| 10023:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@10024,I105,I218,I251| 10024:S41|545950455f5452454528292e636f6e7374727563746f72526573756c74283229676574417267283129 10025:O1|@10026 10026:D12,264|00832e353f1a08010e0c000303382e362f372936293131311afd000e0e0c000529353d1aea000e0e0e0c0003030e292d3b1aec00320e0e7b050a000428062a2e3b6b270402a42e353d1ac4000e0c0003037e2e362f372a3b1acd000e0e0c00032a3b1ac3000c00032935322a1ac1000e0e0c0003293b1abf000c000303041abf00103b503b50293b1abd000e0e0c00030321293c1a99000e0e0c00032d2a3b6a64330e0e0e0c000229331aa3000c00036402162c3b1a80000e0c000303041a9700103b503b503d2d693f2a692707021a2e353c1a3a000e0e0e0c000303043b5002041a7b00103b502e361f040e0e0e0e0000000000000000f8000000000000000000000000000000|@2287,I251,@10025,@2288,I253,I107,I234,@2320,I233,@2323,@2318,@2286| 10027:D12,264|00832e353f1a08010e0c000303382e362f372936293131311afd000e0e0c000529353d1aea000e0e0e0c0003030e292d3b1aec00320e0e7b050a000428062a2e3b6b270402a42e353d1ac4000e0c0003037e2e362f372a3b1acd000e0e0c00032a3b1ac3000c00032935322a1ac1000e0e0c0003293b1abf000c000303041abf00103b503b50293b1abd000e0e0c00030321293c1a99000e0e0c00032d2a3b6a64330e0e0e0c000229331aa3000c00036402162c3b1a80000e0c000303041a9700103b503b503d2d693f2a692707021a2e353c1a3a000e0e0e0c000303043b5002041a7b00103b502e361f040e0e0e0e0000000000000000f8000000000000000000000000000000|@2287,I251,@10012,@2288,I253,I107,I234,@2320,I233,@2323,@2318,@2286| 10028:S3|65712d 10029:S3|283229 10030:O1|@10031 10031:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10032:D7,192|0080560a561b1abf000c0003293b1abf000c000303041abf00103b50293b1abf000c00030369293c1a9d000e0e0c0003293b1a9b000c000303041a9b00103b50293b1a9b000c00030325293c1a79000e0e0c00032e2a3c6a6456390e0e0c00022956481a82000e0e0e0c00036402142d3b1a5c000e0c000303041a7300103b503b2e692956471a5f000c00036502142c3b1a3c000e0c000303041a5300103b503b2d693f2a6965420000000000000000b0000000000000000000000000000000|@10033,I107,I234,@2320,I233,@2323,@2318| 10033:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229706f6c79417267732d283129 10034:O1|@10035 10035:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10034| 10036:O1|@10037 10037:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10038:S6|283229285029 10039:O1|@10040 10040:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10041:O1|@10042 10042:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10041| 10043:O1|@10044 10044:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10045:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10046:O4|@14322,@596,@10048,@10047 10047:O5|@598,474,0,474,0 10048:S36|6d6b4d757475616c446563733a20656d707479206465636c61726174696f6e206c697374 10049:O1|@10050 10050:D6,104|00802b1a6a000e0e0e0c00021a69000e0e0c000203312b352c362a352b36293528071a5b000c000303043b5002041a57001029363b2c2b6a2d1a54000e0c00022a2a69270702013b420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I251,@10051,@10049| 10051:O4|@14322,@596,@10053,@10052 10052:O5|@598,478,0,478,0 10053:S53|6d6b4d757475616c446563733a20526563757273697665206465636c61726174696f6e206973206e6f7420612066756e6374696f6e 10054:O1|@10055 10055:D13,296|00832e1a2a010e0e0e0c00021a29010e0e0c000203142d1a16010e0e0e0c00021a15010e0e0c000202013b07cb2e352f362f3530362c362d372e3829352937293529353d1af9000e0e0c000303043b5002041af300103b5029362a373c22100e0e0c0002333b1ae7000c000303041ae700103b503b503d34693f2a691ae1001ae6000e0e0e0c00023e2a1ae3003c6b220c3b69220c2a692b2a692e2a69280e2a3b6a2a1a8a000e0e0e0c00021a89000e0e0c00021a81000e0e0c0002030c291ab6000e0e0e0c0002020129220c3b220c1aad000e0e0c000450343b221b1aa0000e0c0004503c3b220c2c6b22162215221d221d1a920002020d000e0e0e0c00052a2a69271902013b1f040e0e0e0e0e0e000000000000000018010000000000000000000000000000|@3592,I105,I218,I251,@9340,I234,@3576,@10056,@2273,@6867,@2349,I255,@10054| 10056:O2|@475,@10057 10057:O2|@6866,@684 10058:O1|@10059 10059:D5,104|0085301a6a000e0e0e0c00021a69000e0e0c00020331303531362a352b362c372d38220c220c220c220c220c1a51000e0e0c000a2a33333333331a4b000c00072a2a69270402013b1f060e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,@10060,@10058| 10060:O1|@10061 10061:D16,264|0088303529372a37293629353c1a00010e0c000303042937024129353b1af0000e0c000303042936023129363b2a291ae6000e0e0e0c00021ae5000e0e0c0002031729362b3c1adf000c0003292b25042504511e253b6502012a66340310220c3333220d1ac9000e0e0c00050233293b1ac5000e0e0c000303033002243b1abf000c00022a1ac0001ac5000e0e0c0003321ac4003b2d2d3c3b3c680828072a69662d3529220c1ab7000c000329353d1a5e000e0e0e0c0003030c293c3b1aa8000e0c0004020628062a3c3b6b2c3b691a9e002a692b2a69291a9d000e0e0c00023e2a1a9b003c6b3d2a69270e1f090e0e0000000000000000f8000000000000000000000000000000|@10063,I251,I105,I218,I106,@10064,I113,@2332,@10142,@1385,@10144,@10062,@2288,@542,@2273,@9361| 10062:O1|@10145 10063:S52|545950454944434f444528292e637265617465446174617479706546756e6374696f6e732835297365745072696e746572283429 10064:O1|@10065 10065:D65,1968|00832e3529353036303531363c28403b1aa5070e0e0c00041aa5072a2c6a2c3c1aa5070e0e0c0003292b2d6a3137293629353c1a9a070e0e0e0c000303042937024129353b1a88070e0c000303042936023129363b2a291a7e070e0e0e0c00021a7d070e0e0c0002031729362b3c1a57070c0003292b25042504511e253b6502012a66291a61071a66070e0e0e0c00030402002b3b1a60070e0c00030309292f452212465002673c28403b1a0a070e0e0e0c00041a49072a34220d6b313c1a07070c0003292b2d6a0402002f2b220c2c1a35070e0e0c00055029353c28403c1ad6060e0e0e0c00041a25072a693c2c693c28403b1ac1060e0e0c00042922102d2d6b29221d69220c32452a46260d29352a361a03071a08070e0c00023e2a1a07073c6b293b69291af6060e0e0e0c00023e2a1afb063c6b1afe061ae3060c00023e2a1ae3063c6b293b69291ad2060e0e0e0c00023e2a1ad7063c6b1ae2061abf060c00023e2a1adf063c6b1ae2061aaf060c00023e2a1acf063c6b1ada061a9f060c00023e2a1abf063c6b3c2c1ad0062c6b3c2f1ac9062c6b401acb062b6a3c1acd062b1ad1066b293b69291a71060e0e0c00023e2a1ac7063c6b3c220e2b1ab6066b3c22142b1aae066b1aba06291a06060e0e0e0c00021a05060e0e0c0002031d29352a362a353d1ae4050e0c00030309292503511e283b02013b6502013c64030b1a8a061a8f060c000202031a7f061a8c06291ac0050e0c00021ac1050e0e0c0002031d29352a362a353d1aa0050e0c00030309292503511e263b02013b6502013c64030b1a5e061a4b060c000202031a53061a5806291a7c050e0c00021a7d050e0e0c0002031d29352a362a353d1a5c050e0c00030309292503511e263b02013b6502013c64030b1a2a061a07060c000202031a1f061a2406291a38050e0c00021a39050e0e0c0002031d29352a362a353d1a18050e0c00030309292503511e263b02013b6502013c64030b1af6051ac3050c000202031aeb05291aef0569280e2a3c6a2a291aec040e0c00021aed040e0e0c0002031d29352a362a353d1acc040e0c00030309292503511e263b02013b6502013c64030b291a79050e0e0c0002020129293b692e2a69280e2a3c6a2a291aa1040e0e0c00021aa1040e0e0c0002031d29352a362a353d1a80040e0c00030309292503511e273b02013b6502013c64030b291a2d050e0e0c0002020129293b691a5f052a69280e2a3c6a2a1a54040e0c00021a55040e0e0c00021a4d040e0e0c0002030c291afa040e0e0e0c0002020129293b69220e2a69280e2a3c6a2a291a20040e0c00021a21040e0e0c0002031d29352a362a353d1a00040e0c00030309292503511e263b02013b6502013c64030b291aad040e0e0c0002020129293b6922132a69280e2a3c6a2a291ad4030e0c00021ad5030e0e0c0002031d29352a362a353d1ab4030e0c00030309292503511e263b02013b6502013c64030b291a61040e0e0c0002020129293b691a9b042a691a9e042a691aa1042a691aa4042a69280e2a3c6a2a291a78030e0c00021a79030e0e0c0002031d29352a362a353d1a58030e0c00030309292503511e263b02013b6502013c64030b291a05040e0e0c00020201293c221f2b1a5e046b401a61042b6a3c1a63042b1a67046b3b1a6a040e0e0e0c00023c1a68041a2d030e0e0c00032b1a64043b2d2d3c3d3c680828072a69224b224d22412244225422432f1a50040e0c000822433b1a06030e0e0e0c000303b41a4304224e1a46040e0e0e0c0003224137293b1a40040e0c0003293b2a1abe020e0e0e0c00021abd020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a10040e0c00022d1a10041a7d020e0e0c000303033c02222d1a77020c00021a79020e0e0c000203102d3b1aed033b28081aef030c000602013b03051aec0302012d2a1a95030e0e0c00023c1ae4031a59020e0e0c0003312c3b2d2d3c3b3c680828072a6927090fcf223f1a25020e0e0c00021a25020e0e0c000203043b5002041ab703103b50223f352935293b1a7a030e0e0e0c0003291aa8030e0c0002293b2a1aee010e0e0e0c00021aed010e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129651a7c0322531a2f030c0003224637293b1a2c030e0c0003293b2a1aaa010e0e0e0c00021aa9010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291afc020e0c00022d1afc021a69010e0e0c000303033c02262d1a63010c00021a6501020211010e0e0c000203102d3b1ad5023b28081ad7020c000602013b03051ad40202012d2a1a7d020e0e0c00023c1aec021a41010e0e0c0003220d2c3b2d2d3c3b3c680828072a69333b1a08010e0c0003030329020440342b6a1ac802225e1a6b020c0003291ac4021a61020e0e0c0003225b3b1a5e020e0e0e0c0003293b2a1ada000e0e0e0c00021ad9000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a2c020e0c00022c1a2c021a99000e0e0c000303033c02222c1a93000c00021a95000e0e0c000203102c3b1a09023b28081a0b020c000602013b03051a080202012c2a1ab1010e0e0c0002225a1a37021a74000e0c0003312c3b2d2d3c3b3c680828072a692719274f1f040e0e0e0e0000000000000000a0070000000000000000000000000000|@10067,I11,@10068,I106,I251,I105,I218,@10069,@1385,I113,@10072,@10073,@10085,@10087,@2273,@550,@546,@10088,@10090,@535,@10093,@10094,@475,@10097,@10101,@542,@546,@10103,@10104,@2349,@10105,@10106,@10105,@10106,@10107,@10110,@684,@472,@542,@475,@808,@542,@472,@10111,@5708,@472,@2332,@10113,@10115,@10116,@2757,@122,I253,@2330,I48,I154,@1004,@10135,@2773,@10137,@2757,@10139,@1308,@2742,@10066| 10066:O1|@10141 10067:S34|545950454944434f444528292e7072696e746572466f724461746174797065283329 10068:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10069:O1|@10070 10070:D4,48|00803c28401a30001a35000e0e0c0004291a34006964420e000000000000000020000000000000000000000000000000|@10071,@588,I11,79992| 10071:S46|545950454944434f444528292e7072696e746572466f72446174617479706528332961726754797065732d283129 10072:D7,256|00802b352c362d372a3b1afb000c000303041afb00103b503b502a3b1af9000e0e0c0003038a2a3c1af5000e0e0c0003293b1ad3000c000303041ad300103b503b50293b1ad1000e0e0c00030325293c1acd000e0e0c00032d2a2d6a6456590e0e0c00022956681abe000e0e0e0c00036402322a03192c3b1a8d000e0e0c000303041aab00103b503b503b2d6902162c3b1a74000e0c000303041a9300103b503b503d2d692956671a7d00327e0800032903182b3b1a50000e0c000303041a6f00103b503b503b2c6902162b3b1a38000e0c000303041a5700103b503b503d2c6966420e0e0e0e0e0000000000000000f0000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10073:O1|@10074 10074:D9,128|00833b2f291a80000e0c00021a81000e0e0c0002031729362b3c1a7b000c0003292b25042504511e233b6502012a65291a6d001a72000e0e0e0c0003292f1a6f000c0003312a1a6f000c00032b32321a6e000e0e0e0c0004302b452a4627051f040e0e0e0e0e0e0e000000000000000070000000000000000000000000000000|@10076,I105,I218,I106,@10077,@1385,@10080,@2702,@10075| 10075:O1|@10084 10076:S85|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329 10077:O1|@10078 10078:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@10079| 10079:S97|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d617028332961726741646472732d283129 10080:O1|@10081 10081:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c000203192c352d361a4b002b2f6a2a2f1a4b000c00032a2a69270402013b430e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10082,@10080| 10082:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3c6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@10083,I107| 10083:S96|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329617267732d283129283129 10084:D5,104|00822d1a6a000e0e0e0c00021a69000e0e0c000203312d352e362e352f362f352b2a1a5b000c00032e2a3c6a642b0e0e0e0c00023f2a692e34341a4b000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@1399,I105,I218,I107,@10075| 10085:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@10086,I253,I106,I255| 10086:S81|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b41646472283129 10087:O2|@3930,0 10088:O2|@10089,0 10089:O4|6,@3930,1,1 10090:O2|@5730,@10091 10091:O2|@10092,0 10092:O3|2,40,0 10093:O2|@5730,@2692 10094:O2|@5730,@10095 10095:O2|@10096,0 10096:O3|2,91,0 10097:O2|@10098,0 10098:O4|1,0,1,@10099 10099:O4|6,@10100,1,1 10100:O4|6,@3930,0,1 10101:O4|13,3,@10102,4 10102:O4|6,@10100,0,0 10103:O2|@808,@10091 10104:O3|14,@10103,1 10105:O2|@475,@9739 10106:O3|14,@10105,1 10107:O2|@808,@10108 10108:O2|@10109,0 10109:O3|2,41,0 10110:O3|14,@10107,1 10111:O2|@10112,0 10112:O4|1,0,0,@5756 10113:O1|@10114 10114:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10115:S12|706172656e74686573697365 10116:O1|@10117 10117:D40,1072|0086311a32040e0e0e0c00021a31040e0e0c0002031931352936291a1a040e0e0e0c00021a19040e0e0c00026502013b03043b5002171a0f04311a13040c00031a15041a1a042b1a1e046b64103b50313532362a3629352c352d372e382f392b220f1a0b040c00032a3b2a1aca030e0e0e0c00021ac9030e0e0c0002033d2a352b362a353b1af0030e0c0003031e2a363b2a69291aa1030e0e0c000203041adf03103b503b50293b696502012b2a2a2505250526031e4b3b66020129653d2f3b6a293b691ac1032a69280e2a3c6a2a291a65030e0e0c00021a65030e0e0c0002031d29352a362a353d1a8c030e0c00030309292503511e273b02013b6502013c64030b291a89030e0e0c0002020129293b69291a82030e0e0e0c00023d313b6a2a3b692a2a691a77032a691a7a032a691a7d032a69280e2a3c6a2a291af9020e0e0c00021af9020e0e0c0002031d29352a362a353d1a20030e0c00030309292503511e273b02013b6502013c64030b291a1d030e0e0c000202012922150303290fd5221e1a31030e0e0c00022213353d1ae5020e0e0c00030311221337293528051ad4020e0c00036402013b03043b5002041a0b03103b502213362214372936291a04030e0c0002292e1a03030c00031a05032a690402002f2b2b1a02030e0e0e0c00045029352219353d1a8a020e0e0e0c0003030c22193d3b1aeb020c000402072806221a3d3b6b1ae4021ae9020e0e0c00023e2a2c3c6b1ae402291a18020e0c00021a19020e0e0c0002031d29352a362a353d1a40020e0c00030309292503511e263b02013b6502013c64030f1ab6021a3b020202ec000c000202031aa7022d222d222b222d0e0c00041aa1021a86020e0e0e0c00023e2a1a9b023c6b293b692e2a69280e2a3b6a2a1aaa010e0e0e0c00021aa9010e0e0c00021aa1010e0e0c0002030c291ae6010e0e0e0c0002020129293b69291a3e020e0e0e0c00023e2a333c6b293b69291a2c020e0c00023e2a22363c6b293b69220e2a69221c2a69291a3b020c0002293b691a3a022a691a3d022a691a40022a691ab3012a69280e2a3c6a2a291a2f010c00021a31010e0e0c0002031d29352a362a353d1a58010e0c00030309292503511e253b02013b6502013c64030b291a55010e0e0c0002020129272422181aee000e0e0e0c00021aed000e0e0c00021ae5000e0e0c0002030329024e2211353d1a0c010e0c0003030c22113b3b1a6f010c00040207280622123b3b6b1ab8011a6d010e0e0c00023e2a2c3c6b221b2225222522252225222522251aa2010e0e0e0c00083c2b2f2c6b27041a9a01291a7e000e0e0e0c00021a7d000e0e0c0002031d29352a362a353d1aa4000e0c00030309292503511e283b02013b6502013c64030b1a6a011a9f000c000202031a5f011a64011af9000e0e0c00023e2a1a5f013c6b3c2a2d2f6b271e1f070e0e0e0e000000000000000020040000000000000000000000000000|@10119,I105,I218,@10120,@122,@14322,@596,@10121,@10122,I251,@1363,@808,@2349,@10124,@542,@542,@542,@10126,@10018,@10021,@1734,@10128,@1414,@2288,@9438,@2273,@2682,@2684,@10118,@2721,@10129,@542,@542,@475,@9438,@10116,@10131,@10134,@10118,@2715| 10118:O2|@1010,@467 10119:S59|545950454944434f444528292e7072696e746572466f7244617461747970652833297072696e746572466f72436f6e7374727563746f7273283129 10120:S16|4e6f20636f6e7374727563746f72733a 10121:O5|@2312,1063,0,1063,0 10122:O1|@10123 10123:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025c2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a33000c000303043b5002041a4f00103b502c36430e0000000000000000a8000000000000000000000000000000|@2287,I251,@10122,@2288,I253,I107,@2286| 10124:O1|@10125 10125:D7,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36291a8a000e0e0e0c0002293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d09000229270602031a4c00420e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@10124,I251,@2349,@542| 10126:O1|@10127 10127:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b3628062b2b6a2c1a41000e0e0c00022a2a69270602013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10126| 10128:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@10024,I105,I218,I251| 10129:O1|@10130 10130:D7,144|00802b1a92000e0e0e0c00021a91000e0e0c0002035b2b352c36291a8a000e0e0e0c0002293b692c2a69280e2a3b6a2a291a64000e0c00021a65000e0e0c0002031d29352a362a353d1a64000e0c00030309292503511e263b02013b6502013c640309291a5100327d09000229270602031a4c00420e0e0e000000000000000080000000000000000000000000000000|@1746,I105,I218,@10129,I251,@2349,@542| 10131:O2|@808,@10132 10132:O2|@10133,0 10133:O3|2,@855,0 10134:O3|14,@10131,1 10135:O1|@10136 10136:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10137:O1|@10138 10138:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a372a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10137| 10139:O1|@10140 10140:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10141:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10142:O1|@10143 10143:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10144:S18|7072696e742d7072696e7464656661756c74 10145:D7,184|00812c353f1ab8000e0c000303342c362d372936292f1aaf000c000329353d1a9e000e0e0e0c0003030e292d3b1aa000320e0e7b0508000428062a2e3b6b2704025c2c353d1a78000e0c000303392c362d372a3b1a81000e0e0c00032a3b1a77000c00032f3530362b352b2a1a71000e0e0c00032e2a3b6a642b0e0e0e0c00023f2a69270802172c353c1a33000c000303043b5002041a4f00103b502c36430e0000000000000000a8000000000000000000000000000000|@2287,I251,@10062,@2288,I253,I107,@2286| 10146:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9976| 10147:O1|@10148 10148:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a36293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@10147| 10149:O1|@10150 10150:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10149| 10151:O1|@10152 10152:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10151| 10153:O1|@10154 10154:D1,40|00802b352c3629392b2a6966420e0e0e000000000000000018000000000000000000000000000000|@10155| 10155:S57|434f444547454e5f50415253455452454528292e636f646553657175656e63652834296e657744656275677c6c6f63616c446563732d283129 10156:O1|@10157 10157:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10156| 10158:O1|@10159 10159:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10158| 10160:O1|@10161 10161:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10160| 10162:O1|@10163 10163:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10162| 10164:O1|@10165 10165:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10164| 10166:O1|@10167 10167:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10166| 10168:O1|@10169 10169:D11,256|00842f1a02010e0e0e0c00021a01010e0e0c000203cd2f3530362a36293b1af7000c00032c3a2a3729353d1af2000e0e0e0c000303043b5002041aeb00103b5029362a372d383c220f0c00022c3b2b1ade000e0e0e0c0004502b3b22101ad0000e0c0004502c3b1aae000e0e0e0c00032f35280e1aa9000e0e0c000303262f362936293b1a91000e0e0c00032b382a221422143b22152e1a9e000e0e0e0c0007270402242f3528081a75000e0e0c000303043b5002041a8700103b502b221022101a84000e0c00043c3b2c2c6b3422132213221322131a77000c00062a2a69270e02013b1f050e0e0000000000000000f0000000000000000000000000000000|@1399,I105,I218,I253,I251,@10171,I255,@9389,@10174,@10170,@10168| 10170:O4|@10178,@10186,@10211,@10177 10171:O4|@14322,@596,@10173,@10172 10172:O5|@9970,963,0,963,0 10173:S6|6c7641646472 10174:O4|@14322,@596,@10176,@10175 10175:O5|@9970,983,0,983,0 10176:S6|636f64654578 10177:O5|5,@10226,@1988,@1845,@423 10178:D11,184|008256093b3b6a293b691ab3005637692a1ab4000e0c00022931312d1ab1000e0e0c000556593b3b6a293b691aa9005688692a1a92000e0e0e0c000229220d220d2d1a8b000c0005220e353d1a91000e0e0c00030323220e3629220f220f1a87000c0004293b69291a85000e0e0c00023e2a343c6b2704020129293b691a78002a691a7b002a69291a65000e0e0c00023e2a1a73003c6b270f440e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@10180,@10181,@2268,@2270,@10179,I251,@2667,@2273,@6866,@475,@6867| 10179:D4,88|008056073729353c1a55000e0e0c000303043b5002041a4f0010293629353d1a3e000e0e0e0c0003030e293c3b1a4000300e0e7b0505000428062a3c3b6b6542000000000000000048000000000000000000000000000000|@10185,I251,@10182,@2288| 10180:S26|44415441545950455f52455028292e6d6b45784964656e283329 10181:D4,88|008056073729353c1a55000e0e0c000303043b5002041a4f0010293629353d1a3e000e0e0e0c0003030e293c3b1a4000300e0e7b0505000428062a3c3b6b6542000000000000000048000000000000000000000000000000|@10183,I251,@10182,@2288| 10182:O4|101,@1426,0,@10184 10183:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b65536f6d652d283129 10184:O5|@1380,508,0,508,0 10185:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b654e6f6e652d283129 10186:O7|@2070,@1161,@10188,@10187,@423,0,0 10187:O3|2,@10209,@10208 10188:O2|1,@10189 10189:O3|2,@2117,@10190 10190:O2|@10191,0 10191:O4|@14321,69,@10192,0 10192:O3|2,3,@10193 10193:O6|@607,@583,@10194,@1143,@2079,@581 10194:O2|@627,@10195 10195:O2|@10197,@10196 10196:O2|@10201,@10200 10197:O2|@1195,@10198 10198:O3|0,@10199,@609 10199:O8|@545,@2070,0,0,@805,0,0,1 10200:O2|@10205,0 10201:O2|@2483,@10202 10202:O3|0,@10203,@609 10203:O8|@10204,@2070,0,0,@805,0,0,1 10204:O3|14,@718,1 10205:O2|@2489,@10206 10206:O3|0,@10207,@609 10207:O8|@2097,@2070,0,0,@805,0,0,1 10208:O5|5,@10210,@1988,@1845,@423 10209:O3|6,@14477,79992 10210:O2|@10209,0 10211:O7|@2067,@464,@10212,@10208,@423,0,0 10212:O2|1,@10213 10213:O3|2,@2119,@10214 10214:O2|@10215,0 10215:O4|@14321,69,@10216,0 10216:O3|2,2,@10217 10217:O6|@607,@583,@10218,@1143,@2079,@581 10218:O2|@627,@10219 10219:O2|@10221,@10220 10220:O2|@10225,0 10221:O2|@1181,@10222 10222:O3|0,@10223,@609 10223:O8|@10224,@2067,0,0,@805,0,0,1 10224:O4|13,0,@472,0 10225:O2|@3597,@588 10226:O2|@10227,0 10227:O3|2,@10228,@924 10228:O3|3,@10229,@428 10229:O2|@10230,@5398 10230:O2|49,@7393 10231:O1|@10232 10232:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a36293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@10231| 10233:O1|@10234 10234:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10233| 10235:O1|@10236 10236:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10235| 10237:D4,168|00802b352c36562b35563b36564b37565b39566b3a567a2b2e302f2e1a91000e0e0c000729352a362a3b1a8b000c0003030332020b322b1a86000e0e0e0c0003323533363437220c38220d3a220e2306220f23072f2f2f2f220c303030680804020012150001000200332c121800010003002d121a00010001000e0e0e0c00065029352a362a2a692716420e0e0e0e0e000000000000000098000000000000000000000000000000|@10239,@9382,I251,@10238| 10238:O1|@10240 10239:S49|434f444547454e5f50415253455452454528292e636f646553657175656e636528342970726f636573735461696c283129 10240:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10238| 10241:O1|@10242 10242:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10241| 10243:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@10244,@7104| 10244:S53|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429636865636b56617273283129283129283129 10245:O1|@10246 10246:D3,64|00811a43002c69291a45000e0e0c00022e2a0e0e0e0c0002643c2a0e0e0c0002513b64430e0e0e0e000000000000000030000000000000000000000000000000|@10248,@10247,@1729| 10247:D2,40|00801a2b002a56272e6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@10250,@10249| 10248:S40|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229 10249:D12,248|008056093528051af6000e0e0e0c000303ca5609365619382937293629353d1ade000e0e0e0c000365035956271ad8000e0c00022a37293629353d1ac2000e0e0e0c000303043b5002041ac3001029362a372a301ac1000e0e0c00031ac1002a690402002c2b2b1abe000e0e0e0c000450293527072a0e0e0e0c0002642e2a2f7d0600022d03512937293529353d1a6f000c0003033e2936293b1a93000c0003293b1a93000c00036403252c351a90002a1a94000e0c0003291a94001a89000e0e0c00036556680e0e0c0002503b02013c6402013c6502013b6502012b420e0e0000000000000000e8000000000000000000000000000000|@10252,I251,@1729,@1731,@1734,@10253,@1414,I253,I234,@10254,@122,@10251| 10250:S53|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129 10251:S25|29206f7574736964652069747320646566696e6974696f6e2e 10252:S56|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129283129 10253:D4,112|00805607291a70000e0c00021a71000e0e0c0002032429352a362a352f352a352a2a1a63000c00036603052a68010207292503511e303b6502013b64293b1a47000c000303033b0208293529362968016564420e0e0e0e0e000000000000000060000000000000000000000000000000|@1738,I105,I218,I251| 10254:S44|54797065206f662065787072657373696f6e20636f6e7461696e73206c6f63616c2064617461747970652028 10255:O1|@10256 10256:D16,480|00822d352e362f372e230d29291ad8010e0c00021ad9010e0e0c0002032429352a362a35291ad0011ad5010e0e0c00036403052a68010207292503511e303b6502013b64293b1ab7010c000303691ab701291a93010c00021a95010e0e0c0002032429352a362a35291a8c011a91010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a73010c000303041a7b01103b50293529351a59011a5e010e0e0e0c000303043b5002041a670110293765021a293529351a3a011a3f010c000303043b5002041a4b0110293764651a1b010c000203033c029b2a3530352a2a1a1a010e0e0e0c000303033c024a2a1af3000c00021af5000e0e0c00020314291ae2000e0e0e0c00021ae1000e0e0c000202013b03212a3b2b3b28082e1afd000e0e0c00021afd000e0e0c00031afd000e0e0c000602013b6503392a3630361af3000c0003032a2a3730371ae7000c0003031b2a3830381adb000c0003030c2a3930391acf000c000302013b02013b02013b02013b03053b316902423b1abd000e0e0c00023e2a1abb003c6b3d323b6a293b691ab7002a692c2a69291a9e000e0e0e0c00023e2a1aab003c6b3d2a69293b69220c2211220c6a2a2a69270b66440e0e0e0e0e0000000000000000d0010000000000000000000000000000|@10257,I105,I218,@14402,I251,@2781,@2836,@1576,I223,I239,I154,I113,@2273,@9360,@569,@9361| 10257:S34|44454255474745525f28292e75706461746544656275674c6f636174696f6e283329 10258:O2|@10260,@10259 10259:O4|3,@10264,@2587,1 10260:D18,552|00842c230d29291a26020e0e0e0c00021a25020e0e0c0002032429352a362a35291a1c021a21020e0e0c00036403052a68010207292503511e323b6502013b64293b1a03020c0003036b1a0302291adf010c00021ae1010e0e0c0002032429352a362a35291ad8011add010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1abf010c000303041ac701103b503b50293529351aa3011aa8010e0c000303043b5002041ab301103b50293765021e293529351a84011a89010e0e0c000303043b5002041a9301103b50293764651a61010e0e0c000203033b0fdd2f3b1a82010e0e0e0c0003293b1a57010c0003031b3c28403b1a73010c0004296801323b2b1a6f010c0004502a65020229353c2e0c00023c3b2b56676b293b693235333634352b2a1a54010e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b293b69291a3c010e0c00023e2a1a3b013c6b2212352213362214352b2a1a1b010c0003220f2a3b6a642b0e0e0c00023f2a693d22193b6a3d22133b6a293b692b2a69280e2a3b6a2a291a9f000c00021aa1000e0e0c0002031d29352a362a353d1aa0000e0c00030309292503511e253b02013b6502013c02024e0064030b291ad1000e0e0c0002020129293b69291aca000e0e0e0c00023e2a333c6b3c220f2b1ac0006b3d2a69293b69293b1a54000e0c00030304221a020e221a2a1aac0022230e0e7e260003271f1f05000000000000000018020000000000000000000000000000|@10262,I105,I218,@14402,I251,@2781,@2836,@1576,I253,I11,I255,I107,@9601,@546,@2349,@2273,@542,@10261| 10261:O1|@10263 10262:S29|44454255474745525f28292e627265616b506f696e74436f6465283529 10263:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10261| 10264:O2|@10265,@2589 10265:O2|@10266,1 10266:O3|2,@14478,0 10267:O1|@10268 10268:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10267| 10269:O1|@10270 10270:D5,112|00812c1a72000e0e0e0c00021a71000e0e0c000203322c352d362a390402002b2a1a64000e0c00035029352a362c030b2e2b69322a452b466402092e2a69322c452a46642706020b1a45002c2a35452a364664430e0e0e0e000000000000000060000000000000000000000000000000|@1506,I105,I218,@10269,@1505| 10271:O1|@10272 10272:D7,160|00812c38293b1a9f000c00032e362f372a293528161a98000e0c0003030c2936292502501e133b64022e293528051a7f000c0003030c2937292502501e2b3b6402162935280b1a67000c000303043b5002041a630010293764291a63000c00022d2a2d1a62000e0e0e0c0004293b1a3f000c0003030332020b322a1a5200340e7e0b00032707430e000000000000000090000000000000000000000000000000|@10274,I253,I251,@10275,@10278,@10280,@10273| 10273:O1|@10285 10274:S61|434f444547454e5f50415253455452454528292e636f646552656356616c42696e64696e677328332976616c42696e64546f4676616c42696e64283229 10275:O4|@14322,@596,@10277,@10276 10276:O5|@9970,1534,0,1534,0 10277:S10|6765744d617463686573 10278:O1|@10279 10279:D7,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a352b362c392d3a3c28401a60001a65000e0e0c00041a65002a2d6a2d3b69292b3b3b6b293130306b321a59000e0e0c00022a2a69270c02013b420e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@588,I11,I48,@10278| 10280:O1|@10281 10281:D10,216|00822d1ada000e0e0e0c00021ad9000e0e0c000203a12d352e362a383c28401ace001ad3000c000428062a1ad2006a3c28401abb001ac0000e0c000428062a1abe006a3d2c2b6a2e2a1abc000e0c0003293b1abb000c00031a8d000e0e0c00026503041ab200103b503c28403c1a88000e0c00043c2840321a7d000e0e0c00043c28402f1a71000e0e0c00043c28402e1a65000e0e0c00042a220f2d2210302e680633221022101a76000e0e0e0c00042a2a69270d02013b440e0e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@1399,I105,I218,@588,I11,79992,@1326,I251,@10282,@10280| 10282:O4|@14322,@596,@10284,@10283 10283:O5|@9970,1553,0,1553,0 10284:S10|6d6b4656616c42696e64 10285:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10273| 10286:O1|@10287 10287:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10286| 10288:O1|@10289 10289:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10288| 10290:O1|@10291 10291:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10290| 10292:O1|@10293 10293:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10292| 10294:O1|@10295 10295:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10294| 10296:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9863| 10297:O2|@10299,@10298 10298:O3|@10526,@10525,@7077 10299:D26,832|00832c352d362e372f38303a331a38030e0c000234291a37030c00021a39030e0e0c0002033329352a362a37293b1a2f030c00032c382a381a2d03220d22132d6b2a2a1a2a030e0e0e0c0003502e250826071e3d3b270702013b64220c2e1a17030c0003220d2a2a3b1a14030e0c00030319293b1a09030e0e0c000303043b5002041a0303103b503b02732a352b362b1abd020e0e0c00021abd020e0e0c000203043b5002041ae702103b502b352c362c37293b1aa9020e0e0c0003293729353d1abc020e0c000303043b5002041ac702103b5029362a372a3b311ac2020e0e0e0c000450293b22131ab4020e0c000450302f250b250b26091e923b270965220e2e1aa3020c0003220f2a2d32220d220d2f220c22152218220c220f12170001000100221b1a88020e0c000f22102d2a3b1a4c020e0c00030319293b1a41020e0e0c000303043b5002041a6b02103b503b02732a352b362b1af5010e0e0c00021af5010e0e0c000203043b5002041a4f02103b502b352c362c37293b1ae1010e0e0c0003293729353d1af4010e0c000303043b5002041aff01103b5029362a372a3b311afa010e0e0e0c000450293b22161aec010e0c000450302f250b250b26091e923b270965220f3522103622113722123922133a342b2e302f2e1ae9010e0e0c000729352a362213230d29291a5f010c00021a61010e0e0c0002032429352a362a35291ac8011a75010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a57010c0003036b1aa701291a1b010c00021a1d010e0e0c0002032429352a362a35291a84011a31010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a13010c000303041a6b01103b503b50293529351a4f011afc000e0c000303043b5002041a5701103b50293765021e293529351a30011add000e0e0c000303043b5002041a3701103b5029376465033d220e1a31010e0e0c000250220e291a85000e0e0c00021a85000e0e0c0002031929352a362a22171a14010e0c000350292503511e263b6502013b6402013b333b1a83000c000303041afb00103b503b50331afa000e0e0e0c00023e2a69292e69221a2a452e4627181f040e0e0e0e000000000000000030030000000000000000000000000000|@10301,@10302,I105,I218,I253,@10304,@10245,@10306,I251,@5168,@5168,@10308,I255,@10311,@10320,@5168,@5168,@9382,@14403,@2781,@2836,@1576,@10507,@10300,@10046,@10049| 10300:O1|@10521 10301:S38|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329 10302:O1|@10303 10303:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a37293b1a47000c00032b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,I253,@10302| 10304:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@10305,@7104| 10305:S53|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329636865636b56617273283129283129 10306:O1|@10307 10307:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203182c363d2d0e0e0e0c00022a2e1a3b000c00032a2a696602013b43000000000000000038000000000000000000000000000000|@1399,I105,I218,@10306| 10308:O4|@14322,@596,@10310,@10309 10309:O5|@9970,1150,0,1150,0 10310:S15|73657456616c756541646472657373 10311:O1|@10312 10312:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10313,@10311| 10313:O1|@10314 10314:D6,80|00812c37293b1a4f000c000329381a4f002f690402002b2b2b1a4c000e0c0004502936291a49000e0e0c0002291a4800330e0e0e7d0b0002000000000000000040000000000000000000000000000000|@10316,I253,@10317,@1414,@2262,@10315| 10315:O1|@10319 10316:S48|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329676574506f6c79283129 10317:D4,184|00805607291ab8000e0c00021ab9000e0e0c0002038629352a362a3829353c1aae000e0e0e0c00030367293629291a8f000c00021a91000e0e0c0002032829352a362a352935220c352a2a1a82000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a63000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e0000000000000000a8000000000000000000000000000000|@10318,I105,I218,I251| 10318:S41|545950454944434f444528292e547970655661724d61702e6d61705479706556617273283129283129 10319:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a36293f1a67000c0003293b1a67000c0003641a50000e0c000264030f291a5d000e0e0c00022b2a6964020a291a4e002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I243,I251,@10315| 10320:O1|@10321 10321:D66,2728|008d220f1aa90a0e0e0c00021aa90a0e0e0c0002032b220e1a950a0e0e0c00021a950a0e0e0c00020314220d1a810a0e0e0c00021a810a0e0e0c000202013b02013b07cc220f352210362a35293b1a6f0a0c00032c37293b1a650a0e0e0c000329352f39293b1a570a0c0003313a293b1a4d0a0e0e0c000333363438221b35221c36221c35221d36221d341a3a0a0e0e0e0c00033b2e291a160a0e0e0e0c00021a150a0e0e0c0002031729362b3c1a1f0a0c0003292b25042504511e253b6502012a65301ae9090e0e0c00021ae9090e0e0c000203043b5002041afb09103b50303529352935291af6090e0e0e0c0002341af4092a1ab8090e0c00021ab9090e0e0c000203482a352b362b1aa209020276090e0e0e0c00021a9d090e0e0c0002030d2b36293b1ac7090c00036402013b030d2a36291ac0090e0c00026402012b2a2a2505250526031e543b66020129652223230d29291a57090c00021a59090e0e0c0002032429352a362a35291a90091a7d090e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a5f090c0003036b1a6f09291a13090c00021a15090e0e0c0002032429352a362a35291a4c091a39090e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a1b090c000303041a3309103b503b50293529351a17091a04090e0c000303043b5002041a1f09103b50293765021e293529351af8081ae5080e0e0c000303043b5002041aff08103b502937646503051afb08023e3b2a291a83080c00021a85080e0e0c0002031729362b3c1a8f080c0003292b25042504511e223b6502012a65293c1ad0080e0c00036403051ace080201293b2a291a45080e0e0c00021a45080e0e0c0002031729362b3c1a4f080c0003292b25042504511e243b6502012a650402002b1a16080e0e0e0c00021a15080e0e0c0002030d2b36293b1a3f080c00036402013b030a2b352a2a453b4651020b1a71082a2a35452a36465129352a3629341af8070e0c0003301a60080e0c0002292b2a1ac6070e0e0e0c00021ac5070e0e0c0002031c2a352b362a2c1acd070e0e0c00032a2a2505250526031e2a3b660201296522173c1a2a080e0e0e0c000307cd293c1a1d080e0e0c000303cb321a1a082a2a1ab5070e0e0c000303033c02a42a1a67070c00021a69070e0e0c00020392291a56070e0e0e0c00021a55070e0e0c0002037b2a352b362b352c362c2b2a2a1a77070c000303033c024f2a1a2b070c00021a2d070e0e0c0002033d291a1a070e0e0e0c00021a19070e0e0c000203262a352b362b352c362c2b1a3d070e0e0c0003030d2b2a2506250626041e4e3b02013b270402013b02013b65030d2b2a2506250626041ea53b02013b270402013b02013b65030e2d3c1aff0602020b000c000302013b02013b02013b221522191a50070e0c00033b220c2211341a4b070c00053b2a291a92060e0e0e0c00021a91060e0e0c0002031729362b3c1a9b060c0003292b25042504511e253b6502012a65222e35222f363c28403b1a14070e0c00041a15072a2c6a2c3c1a6d060e0e0c0003292b2d6a22213c1ad6060e0e0e0c000303b52f341af9060e0e0c000334220f1aee060e0e0e0c000329221a1ae2060e0e0e0c0003293c1aa7060c0003031d2b3b1ad5060e0e0c000303041ad306103b503b503b2c693f2a69640269293b1ac8060e0c000303041ac706103b503b501ac7062c692a2a1ac8060e0c0003280e2a3b6a2a291ac2050e0e0e0c00021ac1050e0e0c0002031d29352a362a353d1ae8050e0c00030309292503511e283b02013b6502013c64030b291a8d060e0e0c000202012966660261220d22181a9a050e0e0e0c000322142a321a75060e0e0c0004280e2a3b6a2a291a5e050e0e0e0c00021a5d050e0e0c0002031d29352a362a353d1a84050e0c00030309292503511e283b02013b6502013c64030b291a29060e0e0c0002020129663c28403c1ad1050e0e0c00041a21062a69220d3c1a21060e0e0c0003291a20066928282a69221e2a69661a1b060c000222143c1a82050e0e0e0c00031ae9040e0e0c00021a0906302b221f220f6805221d2a1ac3050c000322232a1afa050e0e0e0c0003223b3b2a1ab5040e0e0c00021ab5040e0e0c0002031c2a352b362a2c2f1adc050e0c00042a2a2505250526031e293b6602012965293b1ac3040c000303032a020b2a2a1abe050e0e0e0c00033c2a693c28403b1a1e050e0e0e0c000429220d342d6b29224069223f3522403922412307221a03033b021d2241224122463b2249220c22172216221a221e221e1a7d050e0e0c000c1a7d052223221722192217221d224522452222221a220d221d221b221b221222102250681129222c2214223c2236223532221a220c22191a4e050e0e0e0c000b3b221c291ae1030e0e0c00021ae1030e0e0c0002031729362b3c1aeb030c0003292b25042504511e243b6502012a652922201a4b040c00036403043b5002041a0e05103b502f1a9f030c00021aa1030e0e0c000203043b5002041afb04103b50313b1a93030c0003291af4040e0c0002293b2a1a72030e0e0e0c00021a71030e0e0c000203152a352b362a2c692a2a2505250526031e233b66020129652e3b1a86030e0e0e0c0003030329020b292f1ab6040e0e0e0c0003293b1a6b030c000303032d0204402a2f6a221c3b1a29030e0e0c0003293b2a1a0e030e0e0e0c00021a0d030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a68040e0c0002221a3b1ae6020e0e0e0c0003221b3b1ada020e0e0e0c0003293b1adf020c0003221d3b2b1a45040e0e0c000450221b1a42041ae7020c000303033c022a221b1a9a020e0e0e0c00021a99020e0e0c00020314221b3b1a1c043b28081a1e040e0e0e0c000602013b03051a18040202221b2d1a18040e0c000222281a17040c0002322c3b2d2d3c342237680828072a6922401a48020e0c00021a49020e0e0c00021a41020e0e0c00020304225802282258352259363c28403b1ad9020e0e0c00041ad9032a2c6a2c3c1a31020e0e0c0003292b2d6a2705224e37293b1a0e020e0e0e0c0003293729353d1a30020e0c000303043b5002041aab03103b5029362a372a3b22461a65030e0e0c000450293b22601a58030e0c0004502233032d22443069225322472246226422642264226422642264226422642264226422641a6c030e0c000f2a2a69650fd50402002f22441a610322412d224a2265220d224a224422431a57030c000c50293522481a6c010e0c00021a6d010e0e0c00021a65010e0e0c00020303290fd03b2249291a4c010e0c00021a4d010e0e0c0002031729362b3c1a57010c0003292b25042504511e233b6502012a6522451a08031a35010e0e0c00033237293b1a21010e0e0c0003293b2a1a06010e0e0e0c00021a05010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a60020e0c00022d1a68021a0d010e0e0c000303033c02262d1abf0002028f000c00021abd000e0e0c000203102d3b1a41023b28081a43020c000602013b03051a880202012d2a1a89020e0e0c0002301a88021a7d01020215000e0e0c0003322c3b2d2d3b3b3c680828072a69270a22473c1a86000e0e0e0c000329346922492c692258224c224b226922692269226922692269226922692269226922691a0a020e0e0e0c000f2a2a692c2a692708275402013b1f0e0e0e0e0e0e0000000000000000980a0000000000000000000000000000|@10323,I105,I218,I253,@122,I106,@10324,@10327,@474,I251,@10329,@14402,@2781,@2836,@1576,@474,I233,@474,@7528,@10348,I113,@470,@10350,@10352,I11,@10366,I107,I234,@3576,I232,@10367,@10370,@1385,@2349,@10372,@10376,@243,@4583,@104,@10378,@2702,@10382,@10388,@10390,@10398,@10405,@10470,@2773,@2776,@10473,@2330,I255,I48,I154,@1004,@10475,@10477,@10479,@10308,@10320,@10480,@10483,@9796,@1004,@9506,@10322| 10322:O1|@10506 10323:S52|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329 10324:O4|@14322,@596,@10326,@10325 10325:O5|@9970,1205,0,1205,0 10326:S23|6261646c7920666f726d65642070617273652074726565 10327:O1|@10328 10328:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a1a4a000e0e0e0c00022a1a48000e0c00022a2a69270402013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10329,@10327| 10329:O1|@10330 10330:D17,976|00802b350a1e003e003e0043000101e101d5013e003e003e003e00b0003e003e00c9018b0022023e003e0068006e013e003e00f5003e003e0021033e003e003e003e003e001a90030fcc2b362937293b1a8d030e0e0c0003291a8c030e0c00021a8d030e0e0c0002293b6927040fca2b36293b1a6a030e0e0e0c0003291a68030e0c00021a69030e0e0c0002293b69660fdc2b362937293b1a45030e0e0c0003291a44030e0c00021a45030e0e0c0002293b6927040fdc2b3629291a3a030e0e0e0c00021a29030e0e0c000203043b5002041a2b031029352a36293b1a29030e0e0c000303042a350207292503511e343b661a1b032d0e0e7d0400022b36291a0e032d0e7d0400022b362936291a08032a1ae402020299020e0c00021ad1020e0e0c0002034a2a352b362b1aca020e0e0e0c00021ab902020276020e0e0c0002030d2b36293b1abf020c00036402013b030d2a35291ab8020e0c00026402012b2a2a2505250526031e583b66020341022927040fd82b362935293b1a8a020e0e0e0c000303041a9702103b5029291a670202021c020c00021a55020e0e0c000203043b5002041a7f021029352a36293b1a55020e0e0c000303042a350207292503511e353b661a47022e0e0e7d0500022b36291a3a022d0e7d0400022b37291a2e022d0e7d0400022b3629362a37291a1e020e0e0e0c0002291afc010e0c00021aed010e0e0c0002030d2936293b1af7010c00036402013b030a2b1af201300e7d0700022927040fca2b37293b1ab0010e0c00032929353e1acd010e0e0c0003033529372929353b1abd01020262010e0e0c00030304293702122936293b1a7f010c0003292503511e233b65641a80010e0c0002640223293528061a8a010e0e0e0c000303132936293b1a53010c00032502501e5e3b6402013b6403051a9001028329293528051a5e010e0e0e0c0003032a29382937293629353d1a4a010e0e0e0c000303043b5002041a6b0110293729250526041e323b27040248293528061a25010e0e0c000303182936293b1aef000202bc000c0003292503511e593b65022229353e1a00010e0c000303043b5002041a2b01102936291a2c01300e0e0e7d070002646502892b37293b1ab1000e0e0c000329293528051acc000e0c0003032a29382937293629353d1aba000e0e0e0c000303043b5002041adb0010293729250526041e303b27040244293528061a95000e0e0c000303142936293b1a5f000c0003292503511e533b65022229353e1a74000e0c000303043b5002041a9f00102936291aa800300e0e0e7d07000266420e0e0e0e0e0e0000000000000000c0030000000000000000000000000000|@10332,@474,I253,@10333,I218,I105,@3387,I251,@10329,@474,@10336,@3387,@474,@10339,@10342,@10345,@10331| 10331:O1|@10347 10332:S33|434f444547454e5f50415253455452454528292e7475706c655769647468283129 10333:O11|@10334,@14352,@502,@1672,@1682,@1690,@510,@14323,@14356,@14354,@14318 10334:D3,584|00802b1a4a020e0e0e0c000229353f1a46020e0e0e0c000307d5293629293b1a36020e0e0e0c000303033b023d29352a362a37293629353c1a1d020e0e0c00036403182936293612090001000a002a1a06020e0e0e0c00036502013b6403033c0207292503511e493b65640306562868010fcc29293b1adf010c000303033b023529352a362a37293629353c1ac9010e0e0c00036403102936293656872a1ab7010c00036502013b6403033c0207292503511e3e3b65640306562968010fd029293b1a93010c000303033b023929352a362a37293629353c1a7d010e0e0c000364031429362936568f2a1a6b010202f4000c00036502013b6403033c0207292503511e423b65640306562a680102a129293b1a43010c000303033b023929352a362a37293629353c1a2d010e0e0c000364031429362936568e2a1a1b0102026f000c00036502013b6403033c0207292503511e423b65640306562b6801025129293b1af3000c000303033b023929352a362a37293629353c1add000e0e0c000364031429362936568d2a1acb0002021f000c00036502013b6403033c0207292503511e423b65640306562c680102013b293b1aa3000c000303033b022529352937293629353c1a8f000c0003640311293629362956871a7f00340e0e7e0a00033b65650248293528051a6c000e0c0003033a29362a382a3b1a5d000e0e0c000303262937293629353c1a4c000e0c0003640311293629362956771a3b00330e0e7e0900033b6402013b6502013b64420e000000000000000038020000000000000000000000000000|@10335,@1435,I251| 10335:S27|545950455f5452454528292e6973466c6f6174696e675074283129 10336:O4|@14322,@596,@10338,@10337 10337:O5|@9970,178,0,178,0 10338:S26|7475706c6557696474683a20656d707479206c6f63616c646563 10339:O4|@14322,@596,@10341,@10340 10340:O5|@1349,97,0,97,0 10341:S33|74634571756976616c656e743a204e6f74206120747970652066756e6374696f6e 10342:O4|@14322,@596,@10344,@10343 10343:O5|@1349,2978,0,2978,0 10344:S26|656e7472794e756d626572202d206e6f742061207265636f7264 10345:O1|@10346 10346:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203252b352c362a36291a50000e0c00021a41000e0e0c00022b1a48000e0c00022a2a69270502013b420e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@10333,@10345| 10347:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203252b352c362a36291a50000e0c00021a41000e0e0c00022b1a48000e0c00022a2a69270502013b420e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@10333,@10331| 10348:O1|@10349 10349:D5,120|00802b1a7a000e0e0e0c00021a79000e0e0c000203412b352c363b2b291a60000e0c00021a61000e0e0c0002031729362b3c1a5b000c0003292b25042504511e233b6502012a652a1a4d000e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000068000000000000000000000000000000|@1399,I105,I218,I106,@10348| 10350:O1|@10351 10351:D9,184|00812c1aba000e0e0e0c00021ab9000e0e0c000203812c352d362a3529352c362d372e38323c1aa7000c000303222c1a8e000e0e0e0c00021a8d000e0e0c000203043b5002041a8f00103b502c3502133c28401a8a001a8f000c000428192e2b2e6b643c28401a87001a7c000e0c00043c28401a7a001a6f000c00042e2c2c2c3131680632220e1a6e000e0e0e0c00032a2a69270c02013b430e0e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@1399,I105,I218,I113,@1712,@588,I11,@1444,@10350| 10352:O1|@10353 10353:D12,184|00832d1aba000e0e0e0c00021ab9000e0e0c0002032e2d352e36303b1ab1000e0e0c000303032a020b2a311aaa000e0e0e0c0003292b31311aa500320e0e0e7b060900052c1aa0001aa5000e0e0c00032c3c1aa3000c0003031c293b1a71000e0e0c000303032f020b2f2a1a92002e0e7e0700030223291a8e000e0e0e0c0002293b1a4b000c0003030330020b302a1a7e002f0e7e08000364641f040e0e0e0e0000000000000000a8000000000000000000000000000000|@10355,I105,I218,I251,@10356,@10352,@10358,@1385,I113,@10361,@10363,@10354| 10354:O1|@10365 10355:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229 10356:O1|@10357 10357:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10356| 10358:O1|@10359 10359:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@10360| 10360:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229706f6c795061726d732d283129 10361:O1|@10362 10362:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10361| 10363:O1|@10364 10364:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10363,@474| 10365:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10354| 10366:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10367:O4|@14322,@596,@10369,@10368 10368:O5|@9970,127,0,127,0 10369:S10|6d6b4172675475706c65 10370:D4,64|00802b56171a40000e0c0003293b1a3f000c000303041a3f00103b503b2a693f2a6965420e0e0e0e000000000000000030000000000000000000000000000000|@10371,I106,I234,@3576| 10371:S36|434f444547454e5f50415253455452454528292e6d6b4172675475706c65283229283129 10372:O1|@10373 10373:D15,392|00822d1a8a010e0e0e0c00021a89010e0e0c000207ca2d352e362d2f1a81010e0e0c00033b2c291a66010e0e0e0c00021a65010e0e0c0002031729362b3c1a67010c0003292b25042504511e253b6502012a652a2a1a48010e0c00033b2e291a2e010e0e0e0c00021a2d010e0e0c0002031729362b3c1a2f010c0003292b25042504511e253b6502012a65293c1a20010e0c0003031d2a3b1a1d010e0e0c000303041a1b01103b503b503b2b693f2a6964026d293b1a10010e0c000303041a0f01103b503b501a0f012b692a2a1a10010e0c0003280e2a3b6a2a291ab200020289000e0e0e0c00021aad000e0e0c0002031d29352a362a353d1aec000e0c00030309292503511e2c3b02013b6502013c64030b291ad9000e0e0c0002020129663b30291a6a000e0e0e0c00021a69000e0e0c0002031729362b3c1a6b000c0003292b25042504511e253b6502012a65342a1a54000e0c0003302a220d1a99000e0e0c00042c2a69270a02013b440e0e0e000000000000000078010000000000000000000000000000|@10375,I105,I218,I107,I106,I113,I234,@3576,I232,@10367,@10374,@1385,I251,@2349,@10372| 10374:D4,64|00802b56171a40000e0c0003293b1a3f000c000303041a3f00103b503b2a693f2a6965420e0e0e0e000000000000000030000000000000000000000000000000|@10371,I106,I234,@3576| 10375:S71|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296172674c6973742d6d616b6541726773283229 10376:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@10377,I253,I106,I255| 10377:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329666e4d6b41646472283129 10378:D2,48|00801a33005617562856392f565a6806420e0e0e0e0e0e0e000000000000000020000000000000000000000000000000|@10380,@10379| 10379:D3,96|0080560a561b1a5f000c00032956291a5e000e0e0e0c00032956381a52000e0e0e0c00032e352f362a56671a42000e0e0e0c00032c2a3c6a642a0e0e0e0c00023f2a692706420e0e000000000000000050000000000000000000000000000000|@10381,I106,I107| 10380:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129 10381:S67|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129283129 10382:O1|@10383 10383:D5,240|00822d2d2a1af0000e0c00021af1000e0e0c000203bb2a352b362f291ad9000e0e0c00021ad9000e0e0c0002032429352a362a3529352f352a2a1acb000c00036603052a68010207292503511e313b6502013b64293b1aaf000c00031aa1000e0e0c00026403033c024b2b291a89000e0e0c00021a89000e0e0c0002032429352a362a3529352f352a2a1a7b000c00036603052a68010207292503511e313b6502013b64293b1a5f000c00031a51000e0e0c00026403032b02092a1a520069292d69642a2a2505250526031ec73b6602012965440e0e0e0e0000000000000000e0000000000000000000000000000000|@10385,I105,I218,I251,@10384| 10384:O1|@10386 10385:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229 10386:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@10387,@2651| 10387:S87|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229636865636b506f6c796d6f72706869736d283229283129 10388:O1|@10389 10389:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10388| 10390:O1|@10391 10391:D17,600|008a220c1a59020e0e0c00021a59020e0e0c0002033b341a46020e0e0e0c00021a45020e0e0c00020324331a32020e0e0e0c00021a31020e0e0c0002030d3335293b1a2b020c00036402013b02013b02013b0370220c35220d36220d35220e36220e362d37293b1a0e020e0e0e0c0003293729353d1af8010e0c000303043b5002041afb01103b5029362a372a3b321af6010e0e0e0c000450293b22141ae8010e0c000450313030221622162216221622162216221622161ad50122170e0e7b0d17000c220c1a97010c00021a99010e0e0c0002032b341a86010e0e0e0c00021a85010e0e0c00020314331a72010e0e0e0c00021a71010e0e0c000202013b02013b07ce220c35220d36220d35220e36220e35220f362a220e220e1a7a010e0e0e0c0004220c3b1a4e010e0e0e0c0003220d3b1a42010e0e0e0c0003293c1a5f010c0003220f3b2b1a3d010e0e0c000450221235220f2a1a4e010e0e0e0c0003293b1a4b010c000303041a4b01103b503b50293b1a49010e0e0c00030325293c1a25010e0e0c0003332a3b6a6422100e0e0c00022922101a2e010e0e0e0c0003640216323b1a08010e0c000303041a1f01103b503b503d33693f2a69220d37293b1ab4000e0c0003293729353d1aa000020268000e0c000303043b5002041a9f00103b5029362a372a3b220d1a99000e0e0c000450293b221b1a8c000e0c000450220c1ad2000e0e0e0c00023e2a313c6b3c3b220f2c6b292220692215221422132c22232223222322232223222322231a5d0022240e0e7b0d24000c321f0b0e000000000000000048020000000000000000000000000000|@10393,I105,I218,I251,I253,@10308,I255,@10390,@10392,I106,I107,I234,@2320,I233,@2323,@2318,@2273| 10392:O1|@10394 10393:S73|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296372656174654170706c69636174696f6e73283429 10394:D6,160|00822d1aa2000e0e0e0c00021aa1000e0e0c0002036d2d352e362e291a89000e0e0c00021a89000e0e0c0002032429352a362a3529352f352a2a1a7b000c00036603052a68010207292503511e313b6502013b64293b1a5f000c000303041a5f00103b503b5029352936302a0e0c00022d33331a52000e0e0e0c00042a2a69270702013b440e0e0e000000000000000090000000000000000000000000000000|@1399,I105,I218,I251,@10395,@10392| 10395:O4|@14322,@596,@10397,@10396 10396:O5|@9970,1367,0,1367,0 10397:S31|6372656174654d6174636865733a204d697373696e67207479706520766172 10398:D14,336|0080120100010010002c12030001000b0012040001000a0012050001000c0012060001000e001a2f010c000729352a3612040001000a0012050001000b0012060001000c0012070001000d002d12090001000e003b120b0001000f006808564d565e566f3b2d569c0e0c00062c3b1aef000c00030303290204402d2b6a56673c1ae5000e0e0c000303032902a3566b3c1add000e0e0c0003567a568a1ad1000e0e0c0003293b1acf000c000303041acf00103b503b50293b1acd000e0e0c00030325293c1aa9000e0e0c00032b2a3c6a6456990e0e0c00022956a81ab2000e0e0e0c00036402162a3b1a8c000e0c000303041aa300103b503b503b2b693f2a6904020056b71a98002b1a9c000e0c00045029352a36291a97000c0002502a2a69312a2f1a920022130e0e0e7b051100042706420e0e0e0e0e000000000000000040010000000000000000000000000000|@10400,@9382,I251,I113,I107,I234,@2320,I233,@2323,@2318,@10401,@3651,I47,@10399| 10399:O1|@10404 10400:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329636f6465426f6479283129 10401:O1|@10402 10402:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@10403| 10403:S32|434f44455452454528292e6d6b536574436f6e7461696e65722d283329283129 10404:D3,184|00822d3528051ab7000c000303232d362e372a2f2f1ab0000e0c00042a30301aa6000e0e0e0c000428052b2b6a2704026a2d35280b1a88000e0c000303032d025a2d35401a79000e0e0c000303152d362e37292f2f1a70000e0c0004402c2b6a6602382d353c1a57000c000303272d362e372f382a30301a4e000e0e0e0c00042a31311a42000e0e0e0c00043c2e2c2c6b27050206280c2e2e2e6b440e0e0e0e0000000000000000a8000000000000000000000000000000|@3667,I251,@10399| 10405:O4|@10407,@10459,@10463,@10406 10406:O4|3,@10467,@2587,1 10407:D50,2744|00892c230d29291ab60a0e0e0e0c00021ab50a0e0e0c0002032429352a362a35291aac0a1ab10a0e0e0c00036403052a68010207292503511e323b6502013b64293b1a930a0c0003036b1a930a291a6f0a0c00021a710a0e0e0c0002032429352a362a35291a680a1a6d0a0e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a4f0a0c000303041a570a103b503b50293529351a330a1a380a0e0c000303043b5002041a430a103b50293765021e293529351a140a1a190a0e0e0c000303043b5002041a230a103b50293764651af1090e0e0c0002030a2e220c2c0e0e7d0c00023330693d2a3b6a293b693b1a020a0e0e0e0c00023e2a1aff093c6b3c310c00023c3b2b2d6b293b69220c35220d36220e352b2a1aea090e0e0e0c00032f2a3b6a642b0e0e0e0c00023f2a69291ad90969291abc090e0c00023e2a1ad3093c6b3c22130e0e0e0c00023c3b2b2d6b293b692217352218362219352b2a1aa2090e0e0e0c000322112a3b6a642b0e0e0c00023f2a69291aa10969291a74090e0c00023e2a1a8b093c6b3c221e0e0e0e0c00023c3b2b2d6b293b692222352223362224352b2a1a5a090e0e0e0c0003221c2a3b6a642b0e0e0c00023f2a69291a610969291a2c090e0c00023e2a1a43093c6b3c22290e0e0e0c00023c3b2b2d6b293b69222d35222e36222f352b2a1a12090e0e0e0c000322272a3b6a642b0e0e0c00023f2a69291a210969291ae4080e0c00023e2a1afb083c6b3c22340e0e0e0c00023c3b2b2d6b293b69223835223936223a352b2a1aca080e0e0e0c000322322a3b6a642b0e0e0c00023f2a69223d35223e36223f352b2a1aa7080c0003222c2a3b6a642b0e0e0c00023f2a692242352243362244352b2a1a87080c000322262a3b6a642b0e0e0c00023f2a692247352248362249352b2a1a67080c000322202a3b6a642b0e0e0c00023f2a69224c35224d36224e352b2a1a47080c0003221a2a3b6a642b0e0e0c00023f2a69293b692f2a69220c2a6922122a69280e2a3c6a2a1ad6070e0e0e0c00021ad5070e0e0c00021acd070e0e0c0002030c291a32080e0e0e0c0002020129293b691a2b082a69221c2a69291ad9070e0e0c00023e2a1a1f083c6b3d2a69293b69293b1aa2070e0e0e0c000303042226020a22262a1a08080e0c0003293b1a87070c000303042232020a22322a1af8070e0c0003293b1a6f070c00030304223e020a223e2a1ae8070e0c0003293b1a57070c00030304224a020a224a2a1ad8070e0c0003293b1a3f070c000303042256020a22562a1ac8070e0c000322643522653622663722662c0e0c0002293b69226d2a69280e2a3c6a2a291af3060c00021af5060e0e0c0002031d29352a362a353d1af4060e0c00030309292503511e253b02013b6502013c64030b291a39070e0e0c00020201290402002a353d1ac8060e0c0003030d1a5f072b692a3b452a4651021f3c226b0e0e0e0c00021a51072a226f6a3c3b2c2f6b293b692d2a452c46260529352a363d2275227222756b2933692b220c2b6a2271352272362273352b2a1aa4060e0c0003226b2a3b6a642b0e0e0c00023f2a693d303b6a293b691a07072a692c2a69291a6e060e0e0e0c00023e2a1afb063c6b227c35227d36227e352b2a1a63060c000322762a3b6a642b0e0e0c00023f2a69228122140e0e0c0002293b691ad2062a692c2a69291a29060e0e0c00023e2a1ac7063c6b2287352288362289352b2a1a1f060c000322812a3b6a642b0e0e0c00023f2a693d228f3b6a293b691aa2062a692c2a69291ae9050e0e0c00023e2a1a97063c6b3c22910e0e0e0c00023c3b2b129300010003006b293b692295352296362297352b2a1ac8050e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b229b35229c36229d352b2a1aa1050e0e0c0003220c2a3b6a642b0e0e0c00023f2a6922991a78050e0c00023e2a2c3c6b3c311a2a062c6b3d2228693d221e693d221469293b692b2a692d2a693d3069293b69293b1a28050e0c000303042216020a22162a1a00060e0c0003293b1a0f050c000303032c020b2c2a1af2050e0e0e0c0003293b1af7040c000303042240020a22402a1ae0050e0c000322ae3522af3622b0352b2a1a06050e0e0e0c0003229d2a3b6a642b0e0e0c00023f2a6922b33522b43622b5352b2a1ae3040c000322ad2a3b6a642b0e0e0c00023f2a692e3b691a4b052a692b2a69291ab2040e0e0e0c00023e2a1a87053c6b3d2a6922be3522bf3622c0352b2a1aa4040e0c000322a22a3b6a642b0e0e0c00023f2a6922c33522c43622c5352b2a1a83040c000322bd2a3b6a642b0e0e0c00023f2a692e3b691afb042a692b2a69291a52040e0e0e0c00023e2a1a27053c6b3d2a6922ce3522cf3622d0352b2a1a44040e0c000322a72a3b6a642b0e0e0c00023f2a6922d33522d43622d5352b2a1a23040c000322cd2a3b6a642b0e0e0c00023f2a692e3b691aab042a692b2a69291af2030e0e0e0c00023e2a1ac7043c6b3d2a6922de3522df3622e0352b2a1ae4030e0c000322ac2a3b6a642b0e0e0c00023f2a6922e33522e43622e5352b2a1ac3030c000322dd2a3b6a642b0e0e0c00023f2a692e3b691ae3032a692b2a69291a92030e0e0e0c00023e2a1a67043c6b3d2a69293b6922112a6922222a6922332a693c22f10e0c00023c3b2b1a4e046b293b693c22f40c00023c3b2b12f600010002006b293b6922f83522f93622fa352b2a1a50030e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b22fe3513ff0036130001352b2a1a27030c0003220c2a3b6a642b0e0e0c00023f2a6922fc1a00030e0c00023e2a2c3c6b1305013513060136130701352b2a1af6020e0e0e0c000322162a3b6a642b0e0e0c00023f2a69293b69291aca020e0e0e0c00023e2a323c6b3c22101a79032c6b3d2a69293b69221e3b1a8b020c0003030329020b29221f1a8d030e0e0c0003293b1a73020c000303042219020a22192a1a7c030e0c0003293b1a5b020c00030304221d020a221d2a1a6c030e0c00031313013513140136131501352b2a1a67020c000322242a3b6a642b0e0e0c00023f2a69280b2a692f3b1a1c020e0c0003030329020440302b6a22a91322010e0e0e0c000228052a2c6a3c131b010c00023c3b2b2d6b293b69131f013513200136132101352b2a1a0f020c00032f2a3b6a642b0e0e0e0c00023f2a690402001326012b132a011ae8022d132a01132901133201132f011ae0020e0c000a5029352a360402002b2b132a011329012d1ad0020e0c00065029353c1328010e0e0c00023c3b2b122a01010001006b293b69132c0135132d0136132e01352b2a1a99010e0e0c00032f2a3b6a642b0e0e0e0c00023f2a69280d3b2b3b6b1332013513330136133401352b2a1a6e010e0e0e0c0003220c2a3b6a642b0e0e0c00023f2a691330011a43010c00023e2a2c3c6b3c311af6012c6b3d2a69293b69293b1a09010e0e0c000303042210020a22102a1a38020e0c0003293b1aef000c000303042214020a22142a1a28020e0c0003224c3b1ad6000e0e0e0c0003030329020b29224d1a15020e0e0c0003293b1abb000c000303042220020a22202a1a04020e0c0003293b1aa3000c000303042292020a22922a1af4010e0c0003293b1a8b000c0003030422de020a22de2a1ae4010e0c00031342013513430136134401352b2a1a97000c000322292a3b6a642b0e0e0c00023f2a692e3b1a50000e0c00030303290204402f2b6a1943011f0a0e0e0e0e0e0e0000000000000000a80a0000000000000000000000000000|@10409,I105,I218,@14402,I251,@2781,@2836,@1576,@2273,@9360,I107,@10410,@2587,@10411,@10412,@10413,@2349,@10415,@9361,@10416,@10418,@10420,@10422,@10424,@10426,@10427,@719,@9361,@9362,@9361,@569,@9361,@542,@10428,@10430,@10432,@9361,@3335,@10434,@10436,@10438,@10440,@10443,@9344,@10448,@10450,@10452,@10454,@10456,@10408| 10408:O1|@10458 10409:S35|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029 10410:O2|@719,0 10411:O2|@9362,0 10412:O2|@569,0 10413:O2|@10414,0 10414:O3|2,5,0 10415:O3|2,5,0 10416:O1|@10417 10417:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10416| 10418:O1|@10419 10419:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10418| 10420:O1|@10421 10421:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10420| 10422:O1|@10423 10423:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10422| 10424:O1|@10425 10425:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10424| 10426:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 10427:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 10428:O1|@10429 10429:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10428| 10430:O1|@10431 10431:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10430| 10432:O1|@10433 10433:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10432| 10434:O1|@10435 10435:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10434| 10436:O1|@10437 10437:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10436| 10438:O1|@10439 10439:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10438| 10440:O1|@10441 10441:D1,32|00823b2e2e2e6b44000000000000000010000000000000000000000000000000|@10442| 10442:S57|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e7472792834292d45 10443:O1|@10444 10444:D7,216|008833353436220c37312c0e0e0c0002293b69220e2a69280e2a3c6a2a291abf000c00021ac1000e0e0c0002031d29352a362a353d1ab8000e0c00030309292503511e253b02013b6502013c64030b291aa5000e0e0c00020201290402002a353d1a8c000e0c0003030d1a93002b692a3b452a4651021f3c220e0e0e0e0c00021a85002a22116a3c3b2c2f6b293b692d2a452c46260529352a36220e220e221522150e0e0e0c00042933692b220c2b6a22142e452a46270e1f090e0e0e0e0e0e0000000000000000c8000000000000000000000000000000|@10446,I105,I218,I251,@2349,@10447,@10445| 10445:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 10446:S55|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e747279283429 10447:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 10448:O1|@10449 10449:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10448| 10450:O1|@10451 10451:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10450| 10452:O1|@10453 10453:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10452| 10454:O1|@10455 10455:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10454| 10456:O1|@10457 10457:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10456| 10458:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10408| 10459:O4|3,@10460,@2587,1 10460:O2|@10461,@2589 10461:O2|@10462,1 10462:O3|2,@14479,0 10463:O4|3,@10464,@2587,1 10464:O2|@10465,@2589 10465:O2|@10466,1 10466:O3|2,@14480,0 10467:O2|@10468,@2589 10468:O2|@10469,1 10469:O3|2,@14481,0 10470:O4|@14322,@596,@10472,@10471 10471:O5|@9970,1424,0,1424,0 10472:S23|417267756d656e74206c656e6774682070726f626c656d 10473:O1|@10474 10474:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10473| 10475:O1|@10476 10476:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c362a353f1a58000e0c000303043b5002041a5300102a362a1a54000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@2334,@10475| 10477:O1|@10478 10478:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3b692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10477| 10479:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10480:O1|@10481 10481:D1,32|00803b420e0e0e0e000000000000000010000000000000000000000000000000|@10482| 10482:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296261736546756e2d283129 10483:O1|@10484 10484:D26,544|008a321a22020e0e0e0c00021a21020e0e0c000207d132353336220e35220f363c28403b1a11020e0e0c00041a11022a2c6a2c3c1a11020e0e0c0003292b2d6a22131a0b021a10020e0c00031a11022214332e6b0402002c2c2c220c2d2217221722172217221722171afc010e0c000c5029352a36313b1af6010e0e0e0c0003293b2a1aa2010e0e0e0c00021aa1010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ac4010e0c0002301ac4011ac9010e0e0c000303033c0226301a5b010c00021a5d010e0e0c00020314303b1aa1013b28081aab0102023c000c000602013b03051aa4010201302a1aa5010e0e0c00023c1aa4011aa9010e0e0c0003302c3b2d2d3b220c3c680828072a69221d2a453b46271502da303c1a1e010e0e0e0c0003220d35220e3632352b2a1a7b010c00032d2a3b6a642b0e0e0e0c00023f2a691a6e01220c22146a342a1a54010e0c0003221422130e0c0002220c3c1a5a010e0e0e0c000303292a3b1a0d010e0e0c0003030329020b292b1a46010e0e0e0c00033e2a2f220f6b22132a453b4665025e2a1a35010e0e0c0002293b1adb000c000303032a020b2a2a1a26010e0e0e0c00033e2a303c6b3b3b3b22122d6805293b6922111a13011ad8000e0c0003280e2a3b6a2b3b1aa2000e0e0e0c00030303290204402c2b6a22192a453c46270827091f0b0e0e0e0e0e0e0e000000000000000010020000000000000000000000000000|@10486,I105,I218,I11,@10487,I106,@10488,@122,@10489,@10483,I253,@2330,I48,I251,I154,@1004,@9506,@10495,@1385,I107,@10497,I113,@10499,@10501,@10503,@10485| 10485:O1|@10505 10486:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429 10487:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10488:S3|283129 10489:D10,216|00802b352c362a56391ad4000e0c00033b2a3c6a642a0e0e0e0c00023f2a6956481ac4000e0c00021ac5000e0e0c00020311564836293b1abe000e0e0e0c00036402013b030c5648352a2a69293b696502473b5658291a8f000c00021a91000e0e0c0002031729362b3c1a93000c0003292b25042504511e223b6502012a651a86002b692a2a1a87000c00032956881a86000e0e0e0c0003663056670e0c0002293b1a53000c000303032a020b2a2a1a6e00330e7e0900032706420e0e0e0e0e0000000000000000c8000000000000000000000000000000|@10491,I107,I105,I218,I251,I106,@10492,@1385,@1734,@10490| 10490:O1|@10494 10491:S75|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e732834296e6578745061726d73283129 10492:D1,40|0080280656172d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@10493| 10493:S43|434f444547454e5f50415253455452454528292e6c6f61644172677346726f6d5475706c65283229283129 10494:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10490| 10495:O1|@10496 10496:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10497:D2,72|00805608355618365627352b2a1a40000e0c00032f2a3c6a642b0e0e0e0c00023f2a69293c692705420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@10498,I107| 10498:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429706f6c795061726d732d283129 10499:O1|@10500 10500:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10499| 10501:O1|@10502 10502:D5,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203142b352c36291a42000e0e0e0c00022b2a696602031a3b00420e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10501,@3928| 10503:O1|@10504 10504:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10503| 10505:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@3776,@3930| 10506:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10507:O1|@10508 10508:D6,112|00800402002c2a1a6e000e0e0e0c00035029352a362a3b2a1a65000e0e0c00021a65000e0e0c0002031c2a352b362a2c2f1a5c000e0c00042a2a2505250526031e293b6602012965030a2a1a4a002f0e7d0600023b66420e000000000000000060000000000000000000000000000000|@10510,@10511,I105,I218,@10509,@10507| 10509:O1|@10513 10510:S59|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129 10511:O1|@10512 10512:D7,176|00812c1ab2000e0e0e0c00021ab1000e0e0c000203762c352d362a3a291a98000e0c00021a99000e0e0c0002033129352935293b1a91000e0e0c0003293b1a8f000c000303152b36293b1a7b000c0003293b1a7b000c00036502013b6602013b0402002c2a1a70000e0c00035029352a362c030b2f2b69332a452b466402092f2a69332c452a46642707020b1a51002c2a35452a364664430000000000000000a0000000000000000000000000000000|@1506,I105,I218,I253,I251,@10511,@1505| 10513:D9,184|00822d3a291ab8000e0c00021ab9000e0e0c00020381293529352a37293b1aaf000c00030402002a2a331aab000c00045029352a362a1a87000c00021a89000e0e0c00021a81000e0e0c000203033402422a1a8b000c00022f3b1a73000c0003293b1a83000c000303032a020b2a2a1a7e000e0e0e0c0003313b2b1a7a000e0e0e0c000450303b2e1a6d000e0e0c0004503c66270702012d64440e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@10515,I105,I218,I253,@10516,@10518,I251,@10514,I255| 10514:O1|@10520 10515:S68|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129757064617465283229 10516:O1|@10517 10517:D9,240|00822d1af2000e0e0e0c00021af1000e0e0c000203b62d352e362a362e291ad7000c00021ad9000e0e0c0002036d29352a362a35292e1acf000c000303033c024a291ab3000c00021ab5000e0e0c000203142d1aa2000e0e0e0c00021aa1000e0e0c000202013b0321293b2f3b2808321a9d000e0e0c00021a9d000e0e0c00031a9d000e0e0c000602013b6403033c0207292503511e783b6502013b640402002c2a321a82000e0e0e0c00045029352a362c030b2f2b69342a452b466402092f2a69342c452a46642707020b1a61002d2a35452a364664440000000000000000e0000000000000000000000000000000|@1506,I105,I218,I251,I223,I239,I154,@10516,@1505| 10518:O1|@10519 10519:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10518| 10520:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10514| 10521:D13,240|00812c3a291af0000e0c00021af1000e0e0c0002033129352935293b1ae9000e0e0c0003293b1ae7000c000303152b36293b1ad3000c0003293b1ad3000c00036502013b6602013b6403852c352d3929293b1abb000c000303051abb00021b29352a362a353b1aa7000c000303042a360207292503511e263b65641aa2002c1aa6000e0e0e0c0003291aa4001a99000e0e0c0003291aa0001aa5000e0e0c0003291aa4000e0c00023b3e3b3b2d6805291a45000e0e0c000203041a9300103b503b3b2b316b34230c2a2a220d7d0e00023b430e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@10523,I105,I218,I253,I251,@6045,@10524,@122,@10522,@5823,@5826,@6242,@1363| 10522:S26|2920686173206e6f74206265656e207265666572656e6365642e 10523:S46|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c7565283229 10524:S18|56616c7565206964656e7469666965722028 10525:O5|@10868,@10298,@7077,@9860,@10867 10526:D38,1192|00842b352c362d372e3a3b33291aa0040e0c00021aa1040e0e0c0002031729362b3c1a9b040c0003292b25042504511e233b6502012a652d230d29291a71040e0e0c00021a71040e0e0c0002032429352a362a35291a70041a75040e0e0c00036403052a68010207292503511e313b6502013b64293b1a57040c0003036b1a5704291a2b040c00021a2d040e0e0c0002032429352a362a35291a2c041a31040e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a13040c000303041a1b04103b503b50293529351af7031afc030e0c000303043b5002041a0704103b50293765021e293529351ad8031add030e0e0c000303043b5002041ae703103b50293764650365333b2a1aa0030e0c00021aa1030e0e0c0002031d2a352b362a36292d1ac7030c00032b2a2506250626041e283b27040201296529291a6e030e0e0e0c00021a6d030e0e0c0002031929352a362a321a9d030e0e0c000350292503511e273b6502013b6502013b341a3c030e0c00021a3d030e0e0c000203043b5002041a7703103b5034352939040200220d353d1a36030e0e0e0c0003030e1a6303220e692a3b452a4651021e3c300e0e0e0c00021a55032a336a3c3b2c22126b293b692d2a452c46260529352a36322a0e0c000230330e0e0e0c0002313b1a33030c000303033c020b311a2f031a34030e0c000303041a3303103b503b50313c1ab9020e0e0c00032928403b1a25030e0e0c0004293b220c1a21030e0e0c0004501a2003121100010001002213121300010002002f22192f6807220f220f220f220f6b0402002217302217220d2f2f2f1af9020e0e0c00085029352a362907dd221703d22213230d29291a3f020c00021a41020e0e0c0002032429352a362a35291ad0021a45020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1a27020c0003036b1a2702291afb010c00021afd010e0e0c0002032429352a362a35291a8c021a01020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ae3010c000303041aeb01103b503b50293529351a57021acc010e0c000303043b5002041ad701103b50293765021e293529351a38021aad010e0e0c000303043b5002041ab701103b502937646502013b03192213020216003b221c220f1a15021a1a020e0e0e0c000602013b0217221703033b021022133b221c220f1a06021afb010c00062f3b1a03020c00033b292b1a02020e0e0e0c000303033b02b6293c1a32010e0e0e0c0003322a1adf010c0003293b1ae7010c00030386221e2c2a1a03010c00021a05010e0e0c000203043b5002041acf01103b502a352b362b3b1abb010c000303042a3902162b3c1abd010e0e0c00032a2a2505250526031e3f3b6427042c3c1acd000e0e0c0003293c1aa3010c00031aa5012a1aa9010e0e0c0003291aa8011a9d010e0e0c0003221d3b2226302d1a46010e0e0e0c0006260602023b502b3c1a8d010e0e0c00032503511ec23b6564221c343c34221a2222221f121f0001000200122000010001001a6c010e0c000a293b1a6b000c00030304220e020a220e2a1a5c010e0c0003293b1a53000c000303032f0204402a316a27191f050e0e0e000000000000000098040000000000000000000000000000|@10528,I105,I218,I106,@14403,I251,@2781,@2836,@1576,@10529,@10300,@10532,@10534,@10535,I234,72057594037927934,I231,@1603,I11,I255,@10536,@10547,@14404,@10842,@7104,@10843,I253,I247,I113,@611,I107,@243,@10844,@122,@10845,I239,@10846,@10527| 10527:O1|@10866 10528:S32|434f444547454e5f50415253455452454528292e636f64654d61746368283529 10529:O1|@10530 10530:D6,440|00812c3528161ab7010c0003030e2c36292d1ab3012e0e0e7e0500032c3528101a9d010e0e0c0003031a2c362d372a2e1a95010e0e0c00032a2a1a8b01300e0e7e0700032c3528051a75010e0e0c0003030e2c37292d1a6f012e0e0e7e0500032c3528111a59010e0e0c000303382c37292d2a1a5a010e0e0e0c00021a59010e0e0c0002031c2a352b362a2c1a39010e0e0c00032a2a2505250526031e2a3b66020129660fcb2c353d1a14010e0c0003030e2c362936292e1a0d012f7e0600032c35280f1af9000e0e0c000303392c38292d2a1afa000e0e0e0c00021af9000e0e0c0002031d2a352b362a38292d1ad7000c00032b2a2506250626041e2a3b27040201296602922c3528191ab2000e0e0e0c000303382c36292d2a1ab2000e0e0e0c00021ab1000e0e0c0002031c2a352b362a2c1a91000e0e0c00032a2a2505250526031e2a3b6602012966024b2c35280e1a6b000c0003033e2c362936293b1a7d000e0e0c00032936293b1a5100020226000e0e0c000303033c020f291a4f000c00021a51000e0e0c00026403032e0203292f696602012b430e0e0e0e0e0e0000000000000000a8010000000000000000000000000000|@10531,I251,@10529,I105,I218,I253| 10531:S41|434f444547454e5f50415253455452454528292e6765745661726961626c6573496e50617474283229 10532:O4|101,@1426,0,@10533 10533:O5|@9970,324,0,324,0 10534:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 10535:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 10536:D25,624|00802b3b1a71020e0e0c000303033c0214560c3b1a69020e0e0c00032c2a1a67020c00036403041a6602103b503b502b3c1a64020e0c0003561c2a1a42020e0e0e0c0003293c1a4f020c00032e3b1a27020c000303033c0214563c3b1a21020e0e0c00032f2a1a1f020c00036403041a2e02103b503b502e3c1a1c020e0c0003564c2a2c1a21020e0e0c0004040300566b322a1a1a020e0e0e0c00021a19020e0e0c000203043b5002041a1302103b502a352b362b3b1a0f020c0003030e2a2e2a35452a36462a3a475102132b3c1aff010c00032a2a2505250526031e4a50260429352a362b372f3e1aec010e0c000307dc2a3b1ae9010e0e0c000356a83556b83656c83756d83956e83a2e2b2e302f2e1ad4010e0c000729352a360402001ace01220d2b121700010003000e0c00045029351215000100020035121600010002003612170001000200372e2d2d1aa7010c000429352a362211302f31301a9f010c0006293b1a9f010c000303032b020b2b2a1a9a010e0e0e0c0003293b1a87010c0003030334020b342a1a8a010e0e0e0c0003121e000100020035121f00010002003612200001000200371221000100020038122200010002003a122300010002002306122400010002000202390023072f2f2f2f220e3030306808040200221f2b2b122a00010001000e0e0c0004502935333b1a10010e0c0003030329020440342b6a271e02462a3b1ad2000e0e0e0c0003291a08010e0c000256ba220e1a75000e0e0c0003293b1a4b000c000303041af300103b503b503d2a693f2a692c1aec000e0c00023e2a2c3c6b27062709420e0e0e0e0e0e000000000000000060020000000000000000000000000000|@10538,I234,I253,I231,@1586,I106,@1614,I255,I105,I218,@611,I113,I107,I232,@10529,@9382,@3597,@10255,@10258,I251,@10539,@10541,@10537,@3576,@2273| 10537:O1|@10543 10538:S56|434f444547454e5f50415253455452454528292e636f64654d61746368283529636f64655061747465726e45787072657373696f6e283129 10539:O1|@10540 10540:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10539| 10541:O1|@10542 10542:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10541| 10543:D9,128|00802b1a82000e0e0e0c00021a81000e0e0c0002034d2b352c362a3729353d1a76000e0e0e0c000303043b5002041a6f00102936293b1a6f000c0003293b1a6f000c000303041a6f00103b503d2a693f2a692e1a6a000e0e0e0c00022a2a69270802013b420e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,I251,@10544,I253,I234,@3576,@10537| 10544:O4|@14322,@596,@10546,@10545 10545:O5|@9970,376,0,376,0 10546:S7|6d616b65417267 10547:O1|@10548 10548:D22,656|00862c353b33291a8e020e0e0e0c00021a8d020e0e0c0002031729362b3c1a87020c0003292b25042504511e253b6502012a651a7a023c220c291a5b020c00021a5d020e0e0c0002033f29352a362a362b392e3c1a51020e0e0c00030403002c32322e22122e1a4f020c00075029352a362b372b2b2b6a292f33250d250d250d260a1e493b270a02012b66291a31020e0e0c000203033c02cf2b230d29291af7010c00021af9010e0e0c0002032429352a362a35291a10021a15020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1af7010c0003036b1af701291ab3010c00021ab5010e0e0c0002032429352a362a35291acc011ad1010e0e0c00036403052a68010207292503511e2f3b6502013b64293b1ab3010c000303041abb01103b503b50293529351a97011a9c010e0c000303043b5002041aa701103b50293765021e293529351a78011a7d010e0e0c000303043b5002041a8701103b50293764653c2c1a83010c00030404002c2b1a80013b2d1a83010c00065029352a362b372c382c2c2c2c6b30031d0404002a2a1a6f010c00035029352a362b372c382c2c2c2c6b2705020129293729293b1a19010e0e0c000303033b0285291ad3000c00021ad5000e0e0c000203043b5002041a3701103b5029353b2a1a35010e0e0c00036403033c0258291aa6000e0e0e0c00021aa5000e0e0c000203043b5002041a0701103b5029353b2a1a0d010e0e0c00036403033b0228291a76000e0e0e0c00021a75000e0e0c000203043b5002041aef00103b502936292502501e903b64641a56000e0e0e0c00021add002216221522172d221768062c22172b22151ad1000e0e0c000522122a452c4627101f070e0e000000000000000080020000000000000000000000000000|@10550,I105,I218,I106,@10551,@10553,@10738,@14402,I251,@2781,@2836,@1576,@10741,@10744,@10747,@10756,@1712,I113,I234,@1715,@10788,@10549| 10549:O1|@10797 10550:S37|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e73283629 10551:O3|0,@10552,0 10552:O1|4 10553:O1|@10554 10554:D43,1544|0085303528161a07060c00030316303631372a32322c32321afd05330e0e0e7b080a0007303528101ae5050e0e0c000303673036313732380403002b34342d342e1ad4050e0c00075029352a362b372f293528051ab9050e0e0c0003030c2937292502501e143b6402202935280e1a9f050c0003031129362936293b1aa1050e0e0c00036502031a9e0564292d69342a452d462c4727090fce303528051a70050e0c00030316303731382a32322c32321a6505330e0e0e7b080a0007303528121a4d050e0e0c0003038130363137323833392c3b1a49050e0e0c0003313532362b3c1a4b050c0003293528053b2b2d3b68053c28403b1a3f050c0004291a40051a45051a4a056b293b692c302b1a48050e0c00041a4905322217220e6b34220e220c2c1a42050e0e0e0c00052b2a22182218220e1a39050e0e0c000622132a35452a36462a374727110fd6303528111abe040e0e0e0c000303653036313732382b3b1abb04020283040c00033c28401a06051ac3040c000428062a1a02056a293b6928052a1a00051a05051a0a056805292e1a0b050c00032c3b692210321a770422123422122f1afe040e0e0e0c0008220d2a35452a36462a3747270b0fd23035281e1a4a040e0e0e0c0003030e2e302d1adc042e0e0e7b050800043035281b1a2d040e0e0c0003030e2e302d1ac0042e0e0e7b0508000430353d1a12040e0e0e0c000303d5303629352935280e1aff030c000303b629362936293b1a01040202c9030e0e0c00032b37293b1af1030e0e0c00032f363039220c382e2d2b1a77040c0004291a78040e0c00021a79041ac6032f221430221468063136293b1aaf030c0003031c322b221622161a61040e0e0c000522112a35452a36462a3747640246291a52040e0e0e0c00021a5104020259030e0e0c000203202936332a2d22182218311a41040e0e0c000722122a35452a36462a374765020e221422112a35452a36462a374764270c020c312e2a35452a36462a374764650fd63035280f1a2e030e0e0e0c000307c93037313832392b3b1a2b030c000330352a29353e1a0f030c0003033129372929353b1a01030e0e0c00030304293702122936293b1aff020c0003292503511e1f3b65641ab0030e0c0002640223293528061ad2020e0e0e0c000303132936293b1ad3020c00032502501e583b6402013b640311293c220e2e1a8b031a90030e0c000602013b2b293528051a99020e0e0c0003032a29382937293629353d1a86020e0e0e0c000303043b5002041a6703103b502937652502501e323b64026b293528061a610202043902d7000c000303132936293b1a5f020c00032502501e573b64024629353e1a3d020e0e0c000303043b5002041a2703103b5029363b2a291aec020e0c00021aed020e0e0c0002031729362b3c1a0f030c0003292b25042504511e233b6502012a6664291a00031a05030e0e0c00032f2a2a1ab2020e0e0e0c00021ab1020e0e0c0002032d2a352b362a352b382a341ae5020e0e0c0003292f2c1ae2020e0e0e0c00042d2a2508250826061e3a3b2706020129653c2840301acc010e0c000428192b2b336b292212221234221222121a950122130e0e7b08130007303528191a7d010e0e0c0003037930363138313629353e1a6a010e0e0e0c000303282936333534372e2c1a5f01220e220e220e1a76020e0e0e0c00073e2a69332d452a462c472705023a29353f1a34010e0c000303043b5002041a5702103b50323533372d220c1a2201220d30220d1a4a020e0e0e0c00073e2a69322d452a462c4727046602d93035280e1af6000e0e0e0c000303be30362936293b1af5000e0e0c00032b37293b1ae9000e0e0c000331382c2b2b1a74010e0c0004291a04020e0c00021a05021ac200220f220f220f68052f36293b1aab000c0003031c302b221222121a5d010e0e0c0005220d2a35452a36462a3747640256291a4e010e0e0e0c00021a4d010e0e0c000203202936312a2d22142214311a41010e0e0c0007220e2a35452a36462a3747650222040300221022122b1aeb000c00045029352a362b37342c6922112a452c462b472705270a020c2f2c2a35452a36462a3747641f060e0e0000000000000000f8050000000000000000000000000000|@10556,I251,@10553,I253,@6380,@2315,I11,@2249,@10557,@473,@9589,@10564,@10566,@10578,@588,79992,@1028,@1026,@423,@1326,@10593,@10672,@10681,@10694,@10696,@10698,I105,I218,@10649,@10710,@7104,@10339,@10711,I106,@10713,@1385,@10716,@10723,@10729,@10731,@10734,@10736,@10555| 10555:D2,64|00800403001a40002d56385649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@10697,@10659| 10556:S28|4d415443485f434f4d50494c455228292e6275696c64416f74283529 10557:O1|@10558 10558:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@10560,@10559| 10559:O4|@14322,@596,@10562,@10561 10560:S40|4d415443485f434f4d50494c455228292e6275696c64416f74283529657175616c6974792d283129 10561:O5|@10563,561,0,561,0 10562:S15|657175616c697479466f7254797065 10563:S48|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4d415443485f434f4d50494c45522e736d6c 10564:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@10565,@7104| 10565:S40|4d415443485f434f4d50494c455228292e6275696c64416f742835296c697456616c75652d283129 10566:O1|@10567 10567:D15,360|00832e352d3c1a67010c00032a2a1a67011a6c010e0c00042a352a2a6929352a366929352a367881352c353d1a59010e0e0c000303082c362968016402013b293b1a44010e0c000303041a4301103b50293522102a0c00022968016609cb00ff6d293528651a20010e0c000303033b0fcc293528081a10010e0c0003034729371a15012a1a19010e0e0c0003291a18011a0d010e0e0c00032922111a02010e0e0e0c0003291a08011af5000e0e0c000329301aeb000c00032704220d0e0c0002503b640281293528051abc000e0c0003032e1ae300220e1ac6000e0e0e0c0003291adc001ab9000e0e0c0003292d1aaf000c000365220c0e0e0c0002503b024629353c1a82000e0e0e0c000303041ab700103b501ab900220e1a84000e0c0003291ab4001a790002021c000e0e0c0003292d1a6b000c000365220c020207000e0e0c0002503b6427081f040e0e0e0e0e000000000000000058010000000000000000000000000000|@10569,@2315,@10570,@9580,I251,@1792,@10572,@122,@10573,@10568,@10574,@10568,@10575,@10577,@10568| 10568:S4|20746f20 10569:S30|56414c55455f4f505328292e6765744c69746572616c56616c7565283429 10570:O1|@10571 10571:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@9577,@9576| 10572:S22|436f6e76657273696f6e20657863657074696f6e2028 10573:S26|2920726169736564207768696c6520636f6e76657274696e6720 10574:S43|4f766572666c6f7720657863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 10575:O4|1,@207,0,@10576 10576:O5|@9378,1327,0,1327,0 10577:S34|457863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 10578:O1|@10579 10579:D4,120|00842d3629353d1a76000e0e0e0c0003031d29362f3530372b3431220c341a67000c00063d2a692c2a2d6a2705022a29353f1a4b000c000303043b5002041a4f00102e352f372f3b69332a346a293b693d2a692e2a2f6a2706641f050e0e0e0e000000000000000068000000000000000000000000000000|@10581,I251,@10582,@10580| 10580:O4|@14322,@596,@10592,@10591 10581:S30|4d415443485f434f4d50494c455228292e61646453636f6e737472283529 10582:O1|@10583 10583:D6,128|00842f1a82000e0e0e0c00021a81000e0e0c000203422f3530362a362b37302a34341a73000c000503182f3b69292c1a6e000e0e0e0c0003342a346a292f696602122b333333331a5e000e0e0e0c00062d2a69642704020b2b3b692f2a2f6a293b69651f050e0e0e000000000000000070000000000000000000000000000000|@10585,I105,I218,@10586,@10584,@10582| 10584:O1|@10589 10585:S41|4d415443485f434f4d50494c455228292e61646453636f6e737472283529616464436c697374283129 10586:O1|@10587 10587:D8,248|00832e1afa000e0e0e0c00021af9000e0e0c000203142d1ae6000e0e0e0c00021ae5000e0e0c000202013b03ad2e352e353d2b3b6a3d2b3b6a293b692b2a69280e2a3b6a2a291ab7000c00021ab9000e0e0c0002031d29352a362a353d1ab0000e0c00030309292503511e253b02013b6502013c64030b291a9d000e0e0c0002020129293b69291a96000e0e0e0c00023e2a220f3c6b220d230d2a2a3b1a88000e0c00043b2a0e0e0e0c00026429353d1a5d000e0e0c0003030829362968016402013b293b1a48000e0c000303041a5f00103b502935270e02013b1f040e0e0e0000000000000000e8000000000000000000000000000000|@10588,I105,I218,I251,@2349,@2273,@2245,@1792| 10588:S46|4d415443485f434f4d50494c455228292e61646453636f6e737472283529657175616c5370656369616c73283229 10589:D9,448|00812c3b1ac1010e0e0c000303032b0fd92b3b1ab2010e0e0e0c000303032c0fcb2c1aab010c00021aad010e0e0c000203043b5002041aa701102c352c1a90010e0c00021a91010e0e0c000203043b5002041a8b01102c352a2a1a8b010c00036503642c1a69010e0e0c00021a69010e0e0c000203043b5002041a6301102c352d1a4c010e0c00021a4d010e0e0c000203043b5002041a5701102d362d1a30010e0c00021a31010e0e0c000203043b5002041a3b01102d362a2a1a3b010c00032c2a6927040fd42c1a05010e0e0c00021a05010e0e0c000203043b5002041aff00102c352c1ae8000204b800b6000e0e0e0c00021ae1000e0e0c000203043b5002041adb00102c352a2a1af3000c00036503472c1ab9000e0e0c00021ab9000e0e0c000203043b5002041ab300102c352d1a9c000e0c00021a9d000e0e0c000203043b5002041aa700102d36292e1aa7000c00032b2a6966024a2b1a72000e0e0e0c00021a71000e0e0c000203043b5002041a6b00102b352c1a54000e0c00021a55000e0e0c000203043b5002041a5f00102c362e2a1a5f00020207000c00032b2a6966430e0e0e0000000000000000b0010000000000000000000000000000|@10590,I251,I105,I218,@1712,I113,@1715,@10584,I234| 10590:S24|4d415443485f434f4d50494c455228292e706c7573283229 10591:O5|@10563,351,0,351,0 10592:S36|61646453636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 10593:O1|@10594 10594:D9,112|0086301a72000e0e0e0c00021a71000e0e0c00020326303531361a6b001a70002b34343434343268091a6c003d2b220e220c331a6a00347b080c00071a69003030303068051a68003d2b220c33311a4f00320e7b080a0007000000000000000060000000000000000000000000000000|@10596,I105,I218,@10597,@10593,@10602,@10649,@10658,@10595| 10595:O7|@868,@464,@10661,@10641,@423,0,0 10596:S42|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229 10597:D7,352|00802b3629353f1a5e010e0e0e0c0003036d2c352d372e373b1a54012b6a30373b1a4c012b6a040300568e2d56aa56bb56cc2e56e90c00075029352a362b372b2b2b6a2e56d856e956fa121100010005001212000100060012130001000700121400010001000e0e0e0c0008293b692b2a693e2a69220e2a220f6a270f02c029353e1ae3000c000303043b5002041ae700103b502936291ae6000e0e0e0c00021ae5000e0e0c000203252936291ad0000e0c00021ad1000e0e0c0002030d2936293b1aa3000c00036402013b6402013b6403043b5002041ab600103b50293629352a36293530353137040300568e2f56aa56bb56cc2e56e90e0c00075029352a362b372b2b2b6a3056d856e956fa121100010005001212000100060012130001000700121400010001000e0e0e0c0008293b692b2a693e2a69332a346a270f64420e0e0e0e0e0e0e000000000000000050010000000000000000000000000000|@10599,I251,@10552,@10598,I105,I218,@10598| 10598:O4|@14322,@596,@10601,@10600 10599:S54|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c6973742832296d6b436f6e73506174283129 10600:O5|@10563,541,0,541,0 10601:S34|6d6b436f6e735061743a206261646c792d666f726d65642070617273652d74726565 10602:O7|@876,@1161,@10604,@10603,@423,0,0 10603:O3|2,@10642,@10641 10604:O2|1,@10605 10605:O3|2,@1146,@10606 10606:O2|@10607,0 10607:O4|@14321,69,@10608,0 10608:O3|2,3,@10609 10609:O6|@607,@583,@10610,@1143,@1049,@581 10610:O2|@627,@10611 10611:O2|@10613,@10612 10612:O2|@10617,@10616 10613:O2|@1181,@10614 10614:O3|0,@10615,@609 10615:O8|@545,@876,0,0,@805,0,0,1 10616:O2|@10630,0 10617:O2|@1188,@10618 10618:O3|0,@10619,@609 10619:O8|@10621,@876,0,0,@10620,0,2,1 10620:O2|@10627,0 10621:O3|10,@10623,@10622 10622:O3|14,@10625,1 10623:O2|@5718,@10624 10624:O2|@5720,0 10625:O2|@3930,@10626 10626:O2|@5730,0 10627:O2|1,@10628 10628:O2|@798,@10629 10629:O2|@5738,0 10630:O2|@1195,@10631 10631:O3|0,@10632,@609 10632:O8|@10634,@876,0,0,@10633,0,2,1 10633:O2|@10640,0 10634:O3|10,@10636,@10635 10635:O3|14,@10625,0 10636:O2|@10638,@10637 10637:O2|@10639,0 10638:O4|1,@655,0,@2097 10639:O4|1,@655,1,@722 10640:O2|1,@576 10641:O5|5,@10648,@1028,@1026,@423 10642:O3|3,@10643,@428 10643:O2|@10645,@10644 10644:O2|@10647,0 10645:O2|49,@10646 10646:O3|6,@14482,79992 10647:O2|50,@10641 10648:O2|@10646,0 10649:O1|@10650 10650:D5,152|00852d3629353b1a96000e0e0e0c0003032629362a37303531372c220d33220d34220e1a82000e0e0e0c00073b2a2e6a2c2a2d6a2706024029353f1a62000e0e0e0c000303043b5002041a6300102e352f372f3b6931373b1a5d002b6a64330e0e0c00022a312b220f6b293b693b2a220f6a2f2a306a2707641f060e0e0e0e0e000000000000000088000000000000000000000000000000|@10652,I251,@10653,@10651,@10552| 10651:O4|@14322,@596,@10657,@10656 10652:S29|4d415443485f434f4d50494c455228292e616464436f6e737472283629 10653:O1|@10654 10654:D10,248|0085301afa000e0e0e0c00021af9000e0e0c000203aa303531362a352b372c382935220c352a2a1ae6000e0e0e0c000303033c024a2a1ac7000c00021ac9000e0e0c00020314291ab6000e0e0e0c00021ab5000e0e0c000202013b03212a3b2b3b28082e1ab1000e0e0c00021ab1000e0e0c00031ab1000e0e0c000602013b650324333b69292d1aa6000e0e0e0c00032c220c0e0e0c00022a220c2b22116b293169270402162c220c220c220c220c220c1a84000e0c00072e2a6964270502192e3b692c373b1a77002b6a642f0c00022a2f2b346b293b69661f060e0e0e0e0e0000000000000000e8000000000000000000000000000000|@10655,I105,I218,I251,I223,I239,I154,@10584,@10653,@10552| 10655:S40|4d415443485f434f4d50494c455228292e616464436f6e737472283629616464436c697374283129 10656:O5|@10563,318,0,318,0 10657:S35|616464436f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 10658:D2,64|00800403001a40002d56385649565a2e56770e0e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@10660,@10659| 10659:O2|30,@6045 10660:S45|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229283129 10661:O2|1,@10662 10662:O3|2,@1144,@10663 10663:O2|@10664,0 10664:O4|@14321,69,@10665,0 10665:O3|2,2,@10666 10666:O6|@607,@583,@10667,@1143,@1049,@581 10667:O2|@627,@10668 10668:O2|@10669,@10220 10669:O2|@2489,@10670 10670:O3|0,@10671,@609 10671:O8|@10224,@868,0,0,@805,0,0,1 10672:O1|@10673 10673:D7,160|00822c352d362e372a353c1a9a000e0e0e0c000303142a36291a9400331a98000e0c00043c2a696502452a353b1a78000e0c000303192a362b372a1a7200341a7e000e0e0e0c00043b2a2c6a6602202a353e1a53000c000303142a36291a5000331a64000e0c00043e2a696502012a313b692b2a1a59000e0e0c0003312f452c462a472706440e0e000000000000000090000000000000000000000000000000|@10675,I251,@10672,@10676,@10678,@10674,@10584| 10674:O1|@10680 10675:S30|4d415443485f434f4d50494c455228292e61646444656661756c74283229 10676:O1|@10677 10677:D4,112|00822d1a72000e0e0e0c00021a71000e0e0c0002033d2d352e362a352b362c372d38040300322c2b220d0e0e0e0c00045029352a362b372b2b2b6a31312b316b33221022101a40000e0c00042a2a69270d02013b440e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@10676| 10678:O1|@10679 10679:D4,112|00822d1a72000e0e0e0c00021a71000e0e0c0002033d2d352e362a352b362c372d38040300322c2b220d0e0e0e0c00045029352a362b372b2b2b6a31312b316b33221022101a40000e0c00042a2a69270d02013b440e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@10678| 10680:D4,96|00822d1a62000e0e0e0c00021a61000e0e0c000203292d352e360403002e2c2b320c00045029352a362b372b2b2b6a2e34341a43000c00042a2a69270802013b440e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,@10674| 10681:O1|@10682 10682:D20,392|00822d352e372f380402002b353e1a7f010c000303112b362928081a72010e0e0e0c00036402013b07d81a6b013b1a6f010c00032d1a70010e0c0003291a70010e0c00022c353d1a46010e0e0e0c000303452c3629353e1a36010e0e0e0c000303152936291a50010e0c00021a51010e0e0c00026402013b0311293629352936291a44010e0c0002660209291a39010e0e0c00026402012c293528061af1000e0e0c000303043b5002041a23011029362b1a04010e0c00021a05010e0e0c0002030d2b36293b1ac7000c00036402013b030f2b35293528053b2b2d3b680565022a3c28401af1001af6000e0e0e0c000428062a1af2006a3f2e692b3b2b1af000020235000e0c0004502a661aea002a2c6a040200312b2b1ae6000e0e0e0c00045029352c3b69291ade000e0e0e0c0002332c452a46260b02261ad40030690402002c2b2b1ab9000e0e0c00045029352a36291ac3000c00022e2c452a46260629352a362a331ab8000e0c00032a270744000000000000000078010000000000000000000000000000|@10684,I251,@14443,I253,@10685,@10687,I105,I218,@1435,@7152,@588,I11,79992,I255,@10689,@1414,@10690,@10692,@10683,@1326| 10683:O1|@10693 10684:S30|56414c55455f4f505328292e676574506f6c796d6f72706869736d283329 10685:O1|@10686 10686:D8,184|00812c1aba000e0e0e0c00021ab9000e0e0c000203822c352d362a352b362c37302c1aab000c000303033c024a301a8f000c00021a91000e0e0c000203142b1a7e000e0e0e0c00021a7d000e0e0c000202013b0321303b2d3b2808301a79000e0e0c00021a79000e0e0c00031a79000e0e0c000602013b03112a2a692d321a6f000c00032a2a6965020a2c311a6100327e090003270502013b430e0e0e0e0e0e0000000000000000a8000000000000000000000000000000|@7146,I105,I218,I251,I223,I239,I154,@10685| 10687:O1|@10688 10688:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10687| 10689:D2,56|00802b352956281a36000e0e0e0c00036403065607680102013b420e0e0e0e0e000000000000000028000000000000000000000000000000|@7156,I251| 10690:O1|@10691 10691:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c362a3b3b6a2a1a46000e0e0e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10690| 10692:D4,184|00805607291ab8000e0c00021ab9000e0e0c0002038629352a362a3829353c1aae000e0e0e0c00030367293629291a8f000c00021a91000e0e0c0002032829352a362a352935220c352a2a1a82000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a63000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e0000000000000000a8000000000000000000000000000000|@10318,I105,I218,I251| 10693:D6,136|00802b1a8a000e0e0e0c00021a89000e0e0c000203512b352c362a352b362936293f1a7b000c0003293b1a7b000c0003641a64000e0c00022b36293c1a61000e0e0c0003293b1a5f000c0003641a48000e0c00022e2c2b6a301a54000e0c00022a2a69270a02013b420e0e0e0e0e0e0e000000000000000078000000000000000000000000000000|@1399,I105,I218,I243,I251,@10683| 10694:O1|@10695 10695:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10694| 10696:D1,64|008004030056182d5639564a565b2e56770c00075029352a362b372b2b2b6a2704420e0e0e0e0e0e000000000000000030000000000000000000000000000000|@10697| 10697:S36|4d415443485f434f4d50494c455228292e6275696c64416f74283529646f417267283129 10698:O1|@10699 10699:D6,168|00832c3629353c1aa6000e0e0e0c0003032d29362e352f373237291a9a000e0e0e0c00022d2a33220d220d22101a90000e0c00073c2a692e2a2f6a2707024729353f1a6b000c000303043b5002041a7700102d352e372e3b6930373b1a71002b6a64320e0e0c00023337291a4a000e0e0e0c00022c2a2d220f6b293b693c2a69312a326a2709641f040e0e0e0e0e0e0e000000000000000098000000000000000000000000000000|@10701,I251,@10702,@10705,@10700,@10552| 10700:O4|@14322,@596,@10709,@10708 10701:S31|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429 10702:O1|@10703 10703:D6,160|00802b353f1aa0000e0c000303512b362c372936291a98000e0c0002291a98000e0c00021a99000e0e0c0002032c29353d2a3b6a292f3b1a8e000e0e0e0c000429353d1a62000e0e0e0c0003030829362968016402013b6602013b270402282b353c1a43000c0003031c2b3629353d1a36000e0e0e0c0003030829362968016402013b6402013b42000000000000000090000000000000000000000000000000|@10704,I251,@10702,I105,I218,@2288| 10704:S30|4d415443485f434f4d50494c455228292e74657374416363657373283129 10705:O1|@10706 10706:D7,216|0085301ada000e0e0e0c00021ad9000e0e0c0002038a303531362a352b362c372d38220c1ab9000e0e0c00021ab9000e0e0c000203142b1aa6000e0e0e0c00021aa5000e0e0c000202013b0312220c352c352a2a1a99000e0e0c00036502013b0322343b69292e1a8e000e0e0e0c00032c220d0e0e0c00022a2f2b2f6b293269270402182d220d220d220d220d220d1a6e000e0e0e0c00072f2a6964270602192e3b692d373b1a5f002b6a642f0c00022a322b306b293b69661f060e0e0e0e0e0000000000000000c8000000000000000000000000000000|@10707,I105,I218,I251,@10584,@10705,@10552| 10707:S42|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429616464436c697374283129 10708:O5|@10563,403,0,403,0 10709:S37|6164644578636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 10710:S31|43616e27742066696e642061206669786564207265636f726420747970652e 10711:O4|@14322,@596,@10344,@10712 10712:O5|@1349,2973,0,2973,0 10713:O1|@10714 10714:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@10715,@10659| 10715:S37|4d415443485f434f4d50494c455228292e6275696c64416f7428352977696c64732d283129 10716:O1|@10717 10717:D13,288|00812b3528051a1f010c0003032a2b382937293629353d1a0e010e0e0e0c000303043b5002041a0701102937302a1a0701310e0e7e0800032b3528061ae9000e0e0c000303162b36293b1af3000c00032e2a1ae3002f0e0e7e0600032b353e1ac6000e0e0e0c000303043b5002041ad700102b363b2a293b1aad000e0e0c000303041acb00103b5029352a362a3529331a95000e0e0c000303033c024a291ab7000c00021ab9000e0e0c00020314321aa6000e0e0e0c00021aa5000e0e0c000202013b0321293b343b2808220e1a98000e0c00021a99000e0e0c00031a99000e0e0c000602013b03032d02142d3c1a8f000c0003292c2506250626041e863b642706430e0e0e0e0e000000000000000010010000000000000000000000000000|@10719,I251,@10339,@10716,I253,@10720,@10718,I105,I218,I223,I239,I154,I106| 10718:O4|101,@1426,0,@10722 10719:S26|545950455f5452454528292e656e7472794e756d626572283229 10720:O4|@14322,@596,@10344,@10721 10721:O5|@1349,2959,0,2959,0 10722:O5|@1349,2947,0,2947,0 10723:O1|@10724 10724:D6,96|00822c3b1a61000e0e0c000303041a5f00103b503b502c352d362f3b1a59000e0e0c000303052d2a6902192f3c1a50000e0c0003292b301a4e000e0e0e0c00042c2a696565440e0e000000000000000050000000000000000000000000000000|@10726,I251,@10725,I113,I107,@10723| 10725:O4|@14322,@596,@10728,@10727 10726:S39|4d415443485f434f4d50494c455228292e6275696c64416f742835296d657267656e2833292829 10727:O5|@10563,474,0,474,0 10728:S6|6d657267656e 10729:O1|@10730 10730:D7,152|0085303b1a99000e0e0c000303192f3b1a8d000e0e0c000303043b5002041a8700103b503b025630353136311a81000e0e0c00021a81000e0e0c000203043b5002041a7b00103b50313532360403002d2c3434342e22100e0e0c00075029352a362b372b2b2b6a302f22102210221022101a54000e0c00072a2a69270a1f060e000000000000000088000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@10729| 10731:O4|@14322,@596,@10733,@10732 10732:O5|@10563,448,0,448,0 10733:S31|7061747465726e206973206e6f742061207475706c6520696e20612d6f2d74 10734:O1|@10735 10735:D5,112|0085301a72000e0e0e0c00021a71000e0e0c0002033d3035313631373b1a68002b6a0403002d2b3434342e22100c00075029352a362b372b2b2b6a30221022102210221022101a47000c00072a2a69270a02013b1f060e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,@10552,@10734| 10736:O1|@10737 10737:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10736| 10738:O1|@10739 10739:D5,288|00802b3629353c1a1e010e0e0e0c0003035d2936293b2a1a16010e0e0e0c00021a15010e0e0c000203412a352b362a362b372d03033c02242a3b1aeb000c00031af5000e0e0c00021aed000e0e0c000203033c0207291ae7000c00022c2a2507250726051e4e3b270502012966029429353b1ab3000c000303412936293b2a1aae000e0e0e0c00021aad000e0e0c000203252a352b362a372c03033c020a291a9e000e0e0e0c00022b2a2506250626041e323b270402012966024829353e1a67000c0003033c2936293b2a1a62000e0e0e0c00021a61000e0e0c000203202a352b362b03033c02082a1a54000e0c00022a2a2505250526031e2e3b660201296602013b64420e0e0e000000000000000010010000000000000000000000000000|@10740,I251,I105,I218,@10738| 10740:S45|4d415443485f434f4d50494c455228292e636f6e7461696e734e6f6e436f6e7374457863657074696f6e283129 10741:O1|@10742 10742:D4,72|00812c2c1a49000e0e0c000303033b02172c3c1a42000e0e0e0c0003292d1a3f000c00032e2a6965430e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@10743,I233,I106,@10741| 10743:S26|4d415443485f434f4d50494c455228292e66726f6d2832292829 10744:O1|@10745 10745:D6,80|00802b35293b1a4f000c000303033b021b291a4b000c00021a4d000e0e0c000203043b5002041a4700102935293b691a46003b2b3c6b6642000000000000000040000000000000000000000000000000|@10746,I251,I105,I218,@1712,@836| 10746:S47|4d415443485f434f4d50494c455228292e6275696c645061747465726e436f64652833296669726550617474283129 10747:O1|@10748 10748:D14,968|00842f353036313729321ac3030c0003040400333b1ac0030e0c000303033c0260332b2a2a1ab0030e0c000303033c024f2a1aab030c00021aad030e0e0c0002033d291a9a030e0e0e0c00021a99030e0e0c000203262a352b362b352c362c2b1a8d030e0e0c0003030d2b2a2506250626041e4f3b02013b270402013b02013b650319333269330e0e0c00022a2a35452a36462a37472a3848510fd42c353f1a36030e0e0e0c0003031a2a3269330e0e0e0c00022a2a35452a36462a37472a3848510fd02c353d1a0e030e0e0e0c000303862c36293b2a1a06030e0e0e0c00021a05030e0e0c000203542a352b362a352b362c372a22131ad6020e0e0e0c0003293b1ad3020c000303032f02223d2d2c6a2a220c1ae1020e0e0c0003292214696422140e0e0c00022a2a69293369662e2a2509250926071e613b2707020129652c3469220c0c00022a2a3b2f1ab1020e0e0c000526040fca2c353c1a7a020e0e0e0c000303a22c36293b2a1a720202020a020e0e0e0c00021a6d020e0e0c0002036b2a352b362a352b372c382b22131a3e020202e6010e0e0e0c0003293b1a37020c000303032f023529341a4a020e0e0e0c00030404002d2b221622162d1a47020c00065029352a362b372c382c2c2c2c6b3c3269292b692922106927092e2a2509250926071e7c3b2707020129652c3469220c0e0c00022a2a3b2f1a01020e0e0c000526040fcf2c353b1aca010e0e0e0c000303a22c362d372a3b2a1ac001020258010e0c00021abd010e0e0c000203692a352b362a352b362c372d382c22151a8c010e0c0003293b1a8b010c0003030330023729220d1a9d010e0e0c00030404002d2b221822182d1a9b010c00065029352a362b372c382c2c2c2c6b3b32220c6a292b692922116927092f2a250a250a26081e783b2708020129652d220c69220d0e0e0c00022a2a2d301a51010e0e0c0005260502c42c362d36291a20010e0c00021a21010e0e0c000203112936293b1a03010202a3000c00036402013b6403192d36293529220e220e220e301a16010e0e0e0c00062603027f323c1a0f010c00033b2b291ad6000e0e0e0c00021ad5000e0e0c0002031729362b3c1aef000c0003292b25042504511e253b6502012a65293c1ae0000e0c00033b2a1adf000c000304040022102e2c2c221331341ab50022161ad0000e0c000a5029352a362b372c382c2c2c2c6b3b2a22156a220c2a453b462d472c48260c5029352a362b372c382b3b1a4f000c0003030331020b312c1a9a000e0e0e0c0003220c2e452a462c472b48270a1f050e0e0e0e0e0e0000000000000000b8030000000000000000000000000000|@10750,@10751,I251,I105,I218,I113,@10584,@10754,@10747,I106,I107,@10771,@10773,@10749| 10749:O1|@10787 10750:S28|4d415443485f434f4d50494c455228292e70617474436f6465283429 10751:O1|@10752 10752:D9,384|00812c3b1a81010e0e0c000303033c020b2b3b1a72010e0e0e0c000303033b0fd02c1a6b010c00021a6d010e0e0c000203043b5002041a6701102c352c1a50010e0c00021a51010e0e0c000203043b5002041a4b01102c352a2a1a4b010c00036503642c1a29010e0e0c00021a29010e0e0c000203043b5002041a2301102c352d1a0c010e0c00021a0d010e0e0c000203043b5002041a1701102d362d1af0000e0c00021af1000e0e0c000203043b5002041afb00102d362a2a1afb000c00032c2a69270402992c1ac5000e0e0c00021ac5000e0e0c000203043b5002041abf00102c352c1aa8000e0c00021aa90002026d000e0e0c000203043b5002041a9f00102c352a2a1ab7000c00036503292c1a7d000e0e0c00021a7d000e0e0c000203043b5002041a8700102c36292d1a87002e0e0e7e0500032b1a54000e0c00021a55000e0e0c000203043b5002041a5f00102b362d2a1a5f002e0e0e7e050003430e0e0e0e0e0e0e000000000000000070010000000000000000000000000000|@10753,I251,I105,I218,@1712,I113,@1715,@10751,I234| 10753:S29|4d415443485f434f4d50494c455228292e696e74657273656374283229 10754:O1|@10755 10755:D13,520|00833b2f291a08020e0c00021a09020e0e0c0002031729362b3c1a03020c0003292b25042504511e233b6502012a650402002a2f1af1010e0e0c0003030d1aef012a2a35452a364651020b2f3730382b2b452a46260329352a36313733291aaf010c00021ab1010e0e0c0002037729352a362a362937292f2a2a1abb010c000303033c024f2a1a87010c00021a89010e0e0c0002033d291a76010e0e0e0c00021a75010e0e0c000203262a352b362b352c362c2b1a71010e0e0c0003030d2b2a2506250626041e4e3b02013b270402013b02013b27040309292503511e7f3b02013b6502013c6429031133322a35452a36462a37472a3848640fcc342d2a1a0f010c00021a11010e0e0c000203212a352b362a3629372d2a1a25010e0e0c00032c2a2507250726051e2b3b270502012965220c2d2a1ad8000e0c00021ad9000e0e0c000203212a352b362a3629382d2a1acd000e0e0c00032c2a2507250726051e2c3b2705020129653c220d220d22106b293b2d2d6b2b3c1acd000e0e0c0003034d3b2d291a88000e0c00021a89000e0e0c0002031729362b3c1a83000c0003292b25042504511e233b6502012a65293d1a9c000e0c0003293c1a9b000c00032e2a1a9b00020223000c00036602013b030e29220d1a9000220e0e0e7e100003220c2b453b462d472c48270427061f040000000000000000f8010000000000000000000000000000|@10757,I105,I218,I106,I113,@473,I251,@10584,I233,I108,I107,I231,@10756| 10756:O1|@10758 10757:S43|4d415443485f434f4d50494c455228292e70617474436f64652834296d616b655061747454657374283329 10758:D5,104|00812c362d37292f1a65000e0e0c00033e2a693b2c291a5f000c00021a61000e0e0c0002031729362b3c1a5b000c0003292b25042504511e223b6502012a65302b452e462d472a482705430e0e0e0e0e000000000000000058000000000000000000000000000000|@10760,@10759,I105,I218,I106| 10759:O1|@10761 10760:S29|4d415443485f434f4d50494c455228292e6d616b654e61697665283129 10761:D10,152|00812c3b1a99000e0e0c000303033b026b2c1a93000c00021a95000e0e0c000203043b5002041a8f00102c35292d1a8f000c0003292b692b3b69302a1a89000e0e0c0003642f1a87000c00032c3b1a87000c000303212a3b69293b1a42000e0e0e0c000303032a020b2a2a1a7200320e7e0900036402032a2a692704430e0e0e000000000000000088000000000000000000000000000000|@10763,I251,I105,I218,@1712,@10764,@10767,@10759,I113,@10762| 10762:O1|@10770 10763:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655061747473283129 10764:O1|@10765 10765:D12,672|00812b3529353e1a9e020e0e0e0c0003035a29362d362a291a95020e0e0c00021a95020e0e0c0002032029352a362a36332a1a8b020c00036403052a68010207292503511e2d3b6502013b64293b1a57020c000303041a6f02103b50293529351a6d022d69292b6927060fda29353c1a36020e0e0e0c000307ce29362a382e362b3729293b1a20020e0c000303033b027b291a1b020c00021a1d020e0e0c000203043b5002041a2f02102935332a1a0f020c00036403033c0252291af2010e0e0e0c00021af1010e0e0c000203043b5002041a0302102935332a1a03020c00036403033b0226291ac6010e0e0e0c00021ac5010e0e0c000203043b5002041ae701102936292502501e853b646503131abe012a69312d1ad7010c00032a2a69650fd12a291a89010e0e0c00021a89010e0e0c000203b429352a362a36293729293b1a640102043a01d6000e0e0e0c000303033b0283291a57010c00021a59010e0e0c000203043b5002041a6b01102935220e2a1a4a010e0e0e0c00036403033c0256291a2a010e0e0e0c00021a29010e0e0c000203043b5002041a3b01102935220e2a1a3a010e0e0e0c00036403033b0226291afa000e0e0e0c00021af9000e0e0c000203043b5002041a1b01102936292502501e953b646603052a68010207292503511ec13b6502013b64293b1ab700020228000c000303041afb00103b50293529352a363c2b69292f69220d2c1ade000e0e0e0c00032a2a69270766026229353f1a82000e0e0e0c0003032129362a372b382f363d2c2c6a292b69332f1aae000e0e0e0c00032a2a692707023329353b1a53000c0003031d29362a372e363b2b69292b69322e1a85000e0e0c00032a2a692706020b2c361a54002a69293b696564430e0e0e0e000000000000000090020000000000000000000000000000|@10766,I251,I105,I218,I113,@1792,@577,@1712,I234,@1715,@10764,@1792| 10766:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655465737473283229 10767:O1|@10768 10768:D9,384|00812c3b1a81010e0e0c000303033b0fd62b3b1a72010e0e0e0c000303032c0fc82c1a6b010c00021a6d010e0e0c000203043b5002041a6701102c352c1a50010e0c00021a51010e0e0c000203043b5002041a4b01102c352a2a1a4b010c00036503452c1a29010e0e0c00021a29010e0e0c000203043b5002041a3301102c362c1a0c010e0c00021a0d010e0e0c000203043b5002041a1701102c362a2a1a17012f0e0e7e0600032c1ae4000e0c00021ae5000e0e0c000203043b5002041adf00102c352c1ac8000e0c00021ac9000e0e0c000203043b5002041ac300102c352a2a1adb0002047b0079000e0e0c00036503472c1a99000e0e0c00021a99000e0e0c000203043b5002041a9300102c352d1a7c000e0c00021a7d000e0e0c000203043b5002041a8700102d36292e1a87000c00032b2a6966022a2b1a52000e0e0e0c00021a51000e0e0c000203043b5002041a5b00102b362d2a1a5b002e0e0e7e050003430e0e0e000000000000000070010000000000000000000000000000|@10769,I251,I105,I218,@1712,I113,@1715,@10767,I234| 10769:S24|4d415443485f434f4d50494c455228292e64696666283229 10770:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10762| 10771:O1|@10772 10772:D4,72|00812c2c1a49000e0e0c000303033b02172c3c1a42000e0e0e0c0003292d1a3f000c00032e2a6965430e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@10743,I233,I106,@10771| 10773:O1|@10774 10774:D11,256|0088313b1a01010e0e0c000303033c020b333b1af2000e0e0e0c0003031a333369300e0e0e0c0002312a35452a36462a37472a38486402a9312f2f220d1ad0000e0c00052e2a2a1ace000e0e0e0c00021acd000e0e0c000203043b5002041ac700102a352b362b3b1ac5000e0e0c000303032a02172b3c1abe000e0e0e0c00032a2a2505250526031e423b6427042a3b69342a1aaa000e0e0e0c00031aa9001aae002b220d220d220d220d220d68080404002d22112c22122d220e0e0e0c00065029352a362b372c382c2c2c2c6b3f2a220f220d6b22132a453b462d472c48270c1f090e0e0e0e0e0000000000000000f0000000000000000000000000000000|@10776,I251,@10777,I105,I218,@611,I113,I107,@10767,@10775,@10773| 10775:D1,80|00802b352c360404002b2b56582c5679568a569b56ac56bd56c70e0e0e0c000a5029352a362b372c382c2c2c2c6b2707420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@10786| 10776:S48|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283329 10777:O1|@10778 10778:D2,48|00833b3b3b303231311a2c00320e0e7b090600080e0e0e0e000000000000000020000000000000000000000000000000|@10780,@10779| 10779:O1|@10781 10780:S30|4d415443485f434f4d50494c455228292e62657374436f6c756d6e283429 10781:D14,368|0086312f1a71010e0e0c00030303300fdc2d293b1a69010e0e0c000303033b027b291a63010c00021a65010e0e0c000203043b5002041a5f01102935332a1a37010c00036403033c0252291a3a010e0e0e0c00021a39010e0e0c000203043b5002041a3301102935332a1a33010c00036403033b0226291a0e010e0e0e0c00021a0d010e0e0c000203043b5002041a1701102936292502501e863b646403992c322a1ae3000c00021ae5000e0e0c000203043b5002041af700102a352b362b3b1ab5000e0e0c000303032a02172b3c1ae6000e0e0e0c00032a2a2505250526031e3f3b642704292d1ad500020261000e0e0c000329321acf000c0003031e333c1acd000e0e0c000329220c2c343434341ac500220c0e0e7b090c0008333c1aaf000c0003293434343434341aaa00220c0e0e0e7b090c0008313c1a93000c0003293232323232321a8e00337b090a00081f070e0e0e0e0e0e000000000000000060010000000000000000000000000000|@10783,I113,I251,I105,I218,@1712,I234,@1715,@611,I107,@10782,I233,I106,@10779| 10782:O1|@10784 10783:S44|4d415443485f434f4d50494c455228292e62657374436f6c756d6e28342966696e6444656570657374283329 10784:D9,416|00812c3629353e1a9e010e0e0e0c000303472936293b2a1a96010e0e0e0c00021a95010e0e0c0002032b2a352b362a321a8d010e0e0c0003292d1a8b010c000303032902012c2b2a2506250626041e383b2704020129660fce2d37292e1a70010e0c0003293b1a3f010c00031a49010e0e0c00020320291a36010e0e0e0c00021a35010e0e0c000203043b5002041a47011029350fdd2b353d1a0c010e0c0003033e2b363b2a291a06010e0e0e0c00021a05010e0e0c0002031729362b3c1a1f010c0003292b25042504511e253b6502012a65293c1a0801320e0e0e7e0900032b353c1ac2000e0e0e0c000303422b363b2a291aba000e0e0e0c00021ab9000e0e0c0002031729362b3c1ad3000c0003292b25042504511e253b6502012a65293c1abc0032020259000e0e0e7e0900032b353b1a72000e0e0e0c000303422b363b2a291a6a000e0e0e0c00021a69000e0e0c0002031729362b3c1a83000c0003292b25042504511e253b6502012a65293c02020c001a6800320e0e0e7e0900033b6564430e0e0e0e000000000000000090010000000000000000000000000000|@10785,I251,I105,I218,@10782,I233,@10751,@1712,I106| 10785:S29|4d415443485f434f4d50494c455228292e706174744465707468283229 10786:S51|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283129283129 10787:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10749| 10788:D7,104|00802b3b1a69000e0e0c00030328560a03041a6300103b5056090307280b56176902111a5a001a5f0056281a62002e7b0503000402122b3c1a5d000e0e0c0003561b2c0e0e800002420e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@10790,I113,@10791,@6581,@10794,@10789,I107| 10789:O1|@10795 10790:S48|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e732836296669726550617474283129 10791:O4|@14322,@596,@10793,@10792 10792:O5|@10563,1179,0,1179,0 10793:S33|636f646544656661756c742063616c6c6564206275742065786861757374697665 10794:O3|2,101,0 10795:D10,240|00823d2e3b6a2c352d362e372f3830392d1ae4001ae9000e0e0c000303033c02222d1ae3000c00021ae5000e0e0c000203102d3b1ac1003b28081adb000c000602013b031c2b3b1ad6000e0e0e0c0003030c293b1ac9000e0e0c000302013b02013b03051ac100020c2d2c2b2f2e68053d2a3b6a64293b691ab5002a69312a69220d2a69280e2a3b6a2a291a7a000e0e0e0c00021a79000e0e0c0002031d29352a362a353d1a58000e0c00030309292503511e283b02013b6502013c64030b291a75000e0e0c0002020129280b2a69270d440e0e0e0e0e0e0000000000000000e0000000000000000000000000000000|@10796,I48,I251,I105,I218,I154,I113,@542,@542,@2349| 10796:S34|4d415443485f434f4d50494c455228292e7261697365457863657074696f6e283329 10797:D2,48|00832b362c3830303b30322f2f1a2800340e0e7b09080008000000000000000020000000000000000000000000000000|@10799,@10798| 10798:O1|@10800 10799:S37|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429 10800:D15,512|0086313532363337313632373c2a0e0e0e0c00023c3b2b22106b2a3b1ae9010e0e0c000303041ae701103b503d2b693f2a6930291ae1010e0e0c00021ae1010e0e0c0002034329352a362a3729353d1ad6010e0e0e0c000303043b5002041acf011029362a372a3b341acc010e0c000450293b220d1ac0010e0c0004502c250626051e4f3b270502013b6432353e1a97010c0003031532362922132213221322131a9c010e0c0006640fcd32353c1a77010c00030325323633373438292b1a8701221522152215221532221c221c220e1a7d010e0e0c000c660fcf32353f1a47010c0003038a3236333734382213291a26010e0e0e0c00021a25010e0e0c0002032029352a362a352e2a1a4b010c00036403052a68010207292503511e2e3b6502013b64293b1aff000c000303041a2f01103b502935293629353d1aea000e0e0e0c0003030c292d3b1a1c010e0c0004020628062a2e3b6b2f2a221922192219221922191ae1000e0e0c00082707025c32353b1ab200020252000e0e0e0c0003032232363337292d69292214692c22162b22162216221622161aac000e0c000827040228301a7000020220000e0c00021a6d000e0e0c000203043b5002041aaf00103035220f0e0e0e0c00022d3b69293b1a54000e0c000303032a0204402a2c6a270c1f070e0e0e0000000000000000f0010000000000000000000000000000|@10802,I234,@3576,I105,I218,I251,@10803,I255,@10806,@10798,@10801,I113,@1792,@2288,@1712| 10801:O1|@10837 10802:S49|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d61746368283329 10803:O4|@14322,@596,@10805,@10804 10804:O5|@10563,611,0,611,0 10805:S7|73657441646472 10806:O1|@10807 10807:D8,176|00842f1ab2000e0e0e0c00021ab1000e0e0c000203043b5002041aab00102f3530362a352b362a2a3434341aa2000e0e0e0c00062a310e0e0e0c00022a3b1a97000c00030303290204402b2b6a2e1a67000c00021a69000e0e0c00021a61000e0e0c000203032902252d220d220d220d1a6d000e0e0c00052f220e220e220e220e1a64000e0c00063c2b2d2c6b6527071f050e0e0e0e0e0e0000000000000000a0000000000000000000000000000000|@10809,I105,I218,@10810,@10813,I251,@10808,@10806| 10808:O1|@10835 10809:S73|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d6d616b655061747465726e73283129 10810:O4|@14322,@596,@10812,@10811 10811:O5|@10563,1083,0,1083,0 10812:S16|6d616b6554657374733a20656d707479 10813:O1|@10814 10814:D13,456|00842f1aca010e0e0e0c00021ac9010e0e0c000207d42f3530362a352b362f3630373c2a0e0c00023c3b2b220e6b2a3b1aad010e0e0c000303041aab01103b503d2b693f2a692f291a85010e0e0c00021a85010e0e0c0002034329352a362a3729353d1a8a010e0e0e0c000303043b5002041a83011029362a372a3b341a80010e0c000450293b220d1a74010e0c0004502c250626051e4f3b270502013b6431353c1a4b010c0003032931360402002a2d22112c1a51010e0e0c0005502936220c22142b221422141a45010e0e0c00066602cd31353d1a17010c00030386313632372210291ae8000202bb000e0c00021ae5000e0e0c0002032029352a362a352e2a1a13010c00036403052a68010207292503511e303b6502013b64293b1acf000c000303041af700103b502935293629353d1aba000e0e0e0c0003030c292d3b1ae4000e0c0004020628062a2e3b6b220f22172b221722171ab4000e0c00062706023c31353b1a86000e0e0e0c0003031d3136292c6929221169220c22142f2c22141a8a000e0e0e0c00066602113222112c221122111a76000e0e0e0c00062d2a69270c02013b1f050e0e0e0e0e0e0000000000000000b8010000000000000000000000000000|@10816,I105,I218,I234,@3576,I251,@10803,I255,@10815,@10813,I113,@1792,@2288| 10815:O1|@10817 10816:S29|4d415443485f434f4d50494c455228292e6d616b654c6f616473283529 10817:D9,272|00832e353d1a10010e0c000303872e362f37293b1a01010e0e0c000303051aff00020729353d2a3b6a64293b69312a69280e2a3b6a2a291aee000e0e0e0c00021aed000e0e0c0002031d29352a362a353d1ac4000e0c00030309292503511e283b02013b6502013c64030b291ac9000e0e0c0002020129293b69291ac2000e0e0e0c00023e2a333c6b220c2a451a900046270a025a2e353c1a7d000e0e0c000303272e362d362e382b3b322d2d1a98000e0c00062c3b332e2e1a94000e0c0006302b452a46270502262e362f372e362f382c2c332d2d1a6f000c00062d2d342e2e1a6c000e0c0006312b452a4627061f040e0e0e0e0e0e0e000000000000000000010000000000000000000000000000|@10819,I251,@542,I105,I218,@2349,@2273,@10820,@10818| 10818:O1|@10828 10819:S35|4d415443485f434f4d50494c455228292e636f6e7374727563746f72436f6465283329 10820:O1|@10821 10821:D20,248|00842f36293b1af7000c000303812e353d1aec000e0c0003030c2e3b3b1ae8000e0c0004020628062f3b3b6b1ae1003b1ae5000e0e0c00031ae5003b1ad9000e0e0c00031ae1003b1acd000e0e0c00031add003b1ac1000e0e0c00031ad9002c2e2c2e6805220d34343b1ad3002e1ad7000c0007293b69302a69291ad2000e0e0e0c00023e2a1acf003c6b270a0248291acd000e0e0c00021acd000e0e0c000203043b5002041ac700101acb00312e6a3b1acc000e0c00022930302d1ac9000e0e0c0005313b69291ac5000e0e0c00023e2a2d3c6b2705641f050e0e0e0e0e0e0000000000000000e8000000000000000000000000000000|@10823,I251,@2288,@14465,I253,@14466,@14467,@14468,I48,@9815,@9389,@10008,@535,I105,I218,@10824,@10822,@2268,@2270,@2273| 10822:D11,144|00801a93003b1a97000c00031a99003b1a8d000e0e0c00031a95003b1a81000e0e0c00031a91003b1a75000e0e0c00031a8d002c2e2c2e680556573156783b1a86002e1a8a000e0e0e0c000729353d1a86000e0e0e0c0003030e293b3b1a8000340e0e7b0509000428062a3b3b6b2706420e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@10827,@14465,I253,@14466,@14467,@14468,I48,@9815,@9389,I251,@2288| 10823:S24|56414c55455f4f505328292e6d616b654775617264283529 10824:O4|@14322,@596,@10826,@10825 10825:O5|@9378,1248,0,1248,0 10826:S9|6d616b654775617264 10827:S33|56414c55455f4f505328292e6d616b654775617264283529746573746572283129 10828:D11,168|00842f36293b1aa7000c000303222e353d1a9c000e0c0003030e2e3d3c1a98002f0e0e7b0508000428062f3d3c6b0258291a8c000e0c00021a8d000e0e0c000203043b5002041a8700102935293c1a5f000c000303051a7f00022c1a8200322f6a3b1a83000c00022931312d1a81000e0e0c0005323b69291a7d000e0e0c00023e2a2d3c6b270564641f050e0e0e0e0e000000000000000098000000000000000000000000000000|@10830,I251,@2288,I105,I218,@10831,@542,@10829,@2268,@2270,@2273| 10829:D11,144|00801a93003b1a97000c00031a99003b1a8d000e0e0c00031a95003b1a81000e0e0c00031a91003b1a75000e0e0c00031a8d002c2e2c2e680556573156783b1a86002e1a8a000e0e0e0c000729353d1a86000e0e0e0c0003030e293d3b1a8000340e0e7b0509000428062a3d3b6b2706420e0e0e0e0e0e0e000000000000000080000000000000000000000000000000|@10834,@14465,I253,@14466,@14467,@14468,I48,@9815,@9389,I251,@2288| 10830:S26|56414c55455f4f505328292e6d616b65496e7665727365283529 10831:O4|@14322,@596,@10833,@10832 10832:O5|@9378,1275,0,1275,0 10833:S11|6d616b65496e7665727365 10834:S39|56414c55455f4f505328292e6d616b65496e7665727365283529676574496e7665727365283129 10835:D13,440|00832e1aba010e0e0e0c00021ab9010e0e0c000207db2e352f362a3529353c1aae010e0e0e0c0003036729362f373c2a0e0c00023c3b2b220d6b2a3b1a99010e0e0c000303041a9701103b503d2b693f2a690402002f2b220e2c1a8b010c00055029352a362e3b69342b221222121a7f010c00053c2d2b1a7e016b2b3b1a50010e0c00030303290204402c2b6a270c0fda29353d1a39010e0e0c0003038229362a3731291a19010e0e0c00021a19010e0e0c0002032029352a362a352e2a1a3f010c00036403052a68010207292503511e2d3b6502013b64293b1af3000c000303041a2301103b502935293629353d0202a4001ada000e0e0e0c0003030c292d3b1a0c010e0c0004020628062a2e3b6b302a220e220e1ad700220f7b060f000529353b1aaa000e0e0e0c0003035729362f373c2a0e0c00023c3b2b220d6b2a3b1a95000e0e0c000303041a9300103b503d2b693f2a692b3b692f2b6929220f693322112b22111a8700020227000c00052c3b1a5b000c00030303290204402d2b6a270a020f2a3131311a6400320e0e7b060900056602031a7e001f040e0e0e0e0000000000000000a8010000000000000000000000000000|@10836,I105,I218,I251,I234,@3576,@10815,@10808,@542,I113,@1792,@2288,@475| 10836:S34|4d415443485f434f4d50494c455228292e6d616b654e616976655465737473283429 10837:D10,272|008a220c3b1a10010e0c000303162e2e2e220c220c220c220c2211320e0e0e7b090d0008220c35220d362a352b3529353b1ae4000e0c0003030c220f3c1ae0000e0c000302013b6403522b3529362a372e362e1ad2000e0e0e0c00021ad1000e0e0c00021ac9000e0e0c000203043b5002041ac300102b2b34221122111ac0000e0c00062a2a220d2214221422142214221922110e0e0e7b091500082b360402002b3122102c1a9f000c00055029352a362c2a220c221322132213221322180e0e0c000822133c1a86000e0e0e0c0003302a2215221522152215221522152215221522151a71000e0e0c000c3c2e2d2c6b270a1f0b0e0e0e000000000000000000010000000000000000000000000000|@10839,I251,I113,I105,I218,@10838,@10818,@10815,I107,@10801| 10838:O4|@14322,@596,@10841,@10840 10839:S70|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d646f5061747465726e283229 10840:O5|@10563,1060,0,1060,0 10841:S21|646f5061747465726e3a206e6f7420617420656e64 10842:S31|48616e646c6572206361746368657320616c6c20657863657074696f6e732e 10843:S27|4d61746368657320617265206e6f7420657868617573746976652e 10844:S8|5061747465726e20 10845:S14|20697320726564756e64616e742e 10846:O1|@10847 10847:D39,992|0088331ae2030e0e0e0c00021ae1030e0e0c000207d4333534362a352b362c3a32363338220f3c1ace030e0e0e0c0003293b1acb030c000303033c0214220f3b1ac5030e0e0c00032a2a1ac3030c00036403041ac203103b503b50293c1ac0030e0c000322102a1a9e030e0e0e0c0003293e1ab3030c0003660325220f3c1a9f030c00032f22122b2212221222122212221222121a990322130e0e7b0b13000a2a352b363c28403b1a8d030e0e0c00041a8d032a2c6a2c3c1a65030e0e0c0003292b2d6a3c28403c1a6d030e0e0c00041a75032a6922133522143922153a22162307220f3b1a68030202d7020e0c00033b2a291af2020e0e0e0c00021af1020e0e0c0002031729362b3c1a13030c0003292b25042504511e253b6502012a65291a35031a3a030e0e0e0c00032b321a37030c0003292b1a37030c00032d2b2a3b1a35030e0e0c00030319293b1a29030e0e0c000303043b5002041a2303103b503b02672a352b362b1a7d020e0e0c00021a7d020e0e0c000203043b5002041a0703103b502b352c362c3729353d1ae8020e0c000303043b5002041af302103b5029362a372a3b2f1aee020e0e0e0c000450293b22161ae0020e0c0004502e2d2509250926071e873b2707652e32220e220c220e220c1ac8020e0c000729352a360402001ac202221b2b22230e0e0c00045029352b2a22101ab6020e0e0e0c000429352a36221c2d2216221422161aa8020e0c0006293b1a5f020c000303032b020b2b2a1a9a020e0e0e0c0003293b1a47020c0003030331020b312a1a8a020e0e0e0c0003293b1a2f020c00030304220c020a220c2a1a78020e0c000322152219221822213122183b2219680804020022242b2b222c0c00045029352c3b1af8010e0c00030303290204402d2b6a22313c1a65010e0e0c000322332a1a82010e0e0e0c00032224282f1a2d020e0e0c000322343c1a2a020e0e0e0c00032a2a1a17020c000322243b1a3e010e0e0e0c0003293b2a1a12010e0e0e0c00021a11010e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ae4010e0c000222233b1afa000e0e0e0c000322243b1aee000e0e0e0c0003293b1afb000c000322263b2b1a69010e0e0c0004502f1ab7011a3c010e0c000303033c02222f1a9f000c00021aa1000e0e0c000203102f3b1a95013b28081a97010c000602013b03051a940102012f2d1a95010e0e0c000222211a93011ae0000e0c0003220e2c3b2d2d3c343c680828072a693c3b22102c6b22423c1a81000e0e0c0003223922452b2245224522452245224522451a78000e0c000a2b2a69273c02013b1f090e0e0000000000000000d0030000000000000000000000000000|@10849,I105,I218,I107,I234,I253,I231,@1586,I106,I232,@10846,I11,@10850,@10851,@10529,@9448,@1385,@10853,@10855,I251,@5168,@5168,@10857,I255,@9382,@3597,@10255,@10258,@10859,@10861,@10863,@122,@243,@2330,I48,I154,@1004,@2332,@10848| 10848:O1|@10865 10849:S41|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729 10850:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10851:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@10852,I253,I106,I255| 10852:S53|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729666e4d6b4164647273283129 10853:O1|@10854 10854:D7,112|00812c1a72000e0e0e0c00021a71000e0e0c000203392c362c3b1a6b000c00032d3b1a63000c0003293c1a63000c00032f3b2b1a62000e0e0e0c0004502c301a5e000e0e0e0c00032c2a69270502013b430e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@1399,I105,I218,I253,I106,I255,@10853| 10855:O1|@10856 10856:D7,120|00812c3b1a79000e0e0c000303172b3b1a6d000e0e0c000303043b5002041a6700103b02342c352d362d1a63000c00021a65000e0e0c000203043b5002041a5f00102d352e363c3b2e2d6b2c2b1a58000e0c00032a2a692706430e0e0e0e0e0e000000000000000068000000000000000000000000000000|@3861,I251,@3860,I105,I218,@3860,@10855| 10857:O4|@14322,@596,@10805,@10858 10858:O5|@9970,451,0,451,0 10859:O1|@10860 10860:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10859| 10861:O1|@10862 10862:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10861| 10863:O1|@10864 10864:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10863| 10865:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10866:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10527| 10867:O2|@10955,@10298 10868:D67,3600|00822d350a1e003e00af00f80b0301910a67053e003e003e003e00060414053e002c02190d57093e007505c60c3f043e0059004a005b022806040a3e001c063e0032013e002c392c1acd0d452a46640fca2d36292e2e2d2f0e0e0e7b050600042d362e370402002b302b2f0e0e0c00045029352a363135323633373438220c3a220d2306220e23072f2f2f2f343030306808040200220c2b2b22110e0e0c00045029353c220c1a770d2c6b22122a45220c4627100fd12d362e370402002b302b2f0c00045029352a363135323633373438220c3a220d2306220e23072f2f2f2f343030306808040200220c2b2b22110e0e0c00045029353c220c2b1a1a0d6b22122a45220c4627100fd42d3629352a362f390402002c322b310202d50c0c0004502935332d2b3b220d56b70e0e0c0006322a452d4627070fce2d362e372f392f390402002c322b310e0c00045029352a360402001ad10c312b56b80e0e0c0004502935220c35220d36220e372e2d2d1abe0c0e0e0e0c000429352a36220c302f31301ab30c0202690c0c0006293b1aaf0c0c000303032b020b2b2a1aaa0c0e0e0e0c000322143522153622163722173822183a22192306221a23072f2f2f2f220d303030680804020022192b2b221d0e0e0c0004502935333b1a640c0202120c0e0c0003030329020440342b6a3d2a69293b693b1a590c0e0e0c000228092a692b3b1a3b0c0202e90b0c00030303290204402c2b6a3c221c2b1afc0b6b3b1a370c0c00023b2b2b6a22262a4522214627240fd12d362e372e390402002c312b300e0c0004502935322d1a140c3c220c56a70c000628052b2b6a322a452e4627070fd62d362e372e362f370402002d322b310c00045029352a360402002b353d1abe0b0e0e0e0c0003030d1adb0b2c692a3b452a4651021a3c2e0c00021ad10b2a316a3c3b2c306b293b692d2a452c46260529352a36302a0e0e0c000229353d1a7e0b0e0e0e0c0003030c293b3b1aa80b0e0c0004020628062a3b3b6b2a353d1a5e0b0e0e0e0c0003030c2a3c3b1a880b0e0c0004020628062b3c3b6b2b353d1a3e0b0202ec0a0e0e0e0c0003030c2b3d3b1a640b0e0c0004020628062c3d3b6b220c35220d36220e37220f382210392d1a4d0b1a0a0b0202b80a0e0e0e0c000303033c02222d1a3f0b0c00021a410b0e0e0c000203102d3b1a250b3b28081a370b0c000602013b031c2b3b1a320b0e0e0e0c0003030c293b1a250b0e0e0c000302013b02013b03051a1d0b020c2d2c2b2f2e68053d2a3b6a64293b69302a69322a69342a69280e2a3b6a2a291ad90a0e0e0c00021ad90a0e0e0c0002031d29352a362a353d1a780a0e0c00030309292503511e273b02013b6502013c64030b291acd0a0e0e0c000202012922113b1a4f0a0c000303032902054022122b6a280b2a69221e2a45221646271c0fdd2d362d390403002b2b2b566833311a9a0a0e0e0e0c00075029352a362b372b3b1a100a0e0c000303032a0204402c2c6a322a452b4627070fdd2d3629352a361a710a56482e2d6b0402002b3b332d2d56a90e0e0e0c00065029352a360402002b3b2a1a160a0e0e0e0c00021a150a0e0e0c000203043b5002041a3f0a103b502a352b36293b1aab090c0003034c2a353d1aa0090e0c000303043b5002041a230a103b502a362c3b2a1ad0090e0c00021ad1090e0e0c000203152a352b362a2c692a2a2505250526031e213b66020129652f2a452b46260302122a2c02020609692a2a2505250526031e8750260429352a362a3b1a3d090e0e0c00030303290204402b2b6a220d2a452e46270b0fca2d362e382a3b0202cd081ab0090e0c00032f39303a1aad092a690402002d2b2b1aaa090e0e0e0c0004502936291aa5090e0e0c0002291aa4090e0c0002220e322b221056ea0e0c0005220d2a453146270b0fda2d37292e2e2d2f0e0e7b050600042d362e372f382b3b1a51090e0e0c0003303531363239333a2d3528051aa5080e0e0c000303252d36291ae0080e0c00021ae1080e0e0c0002030d2936293b1a83080c00036402013b6402013b03043b5002041a2f09103b502d3629352f3b692a2a69293c1a250902020b080e0e0c0003291a20090e0c00023b2a3c6a3e2c2b6a3d2a220e6a220f221222162c220d22102212221522151a03090c000a22142a45220c4627120fda2c392c1aef07452a46640fd02d362e372f383039303531383239333a2e29353e1afa070202a8070e0e0e0c0003033129372929353b1ae5070e0e0c00030304293702122936293b1a6b080c0003292503511e1f3b65641a14080e0c0002640223293528061ab6070e0e0e0c000303132936293b1a3f080c00032502501e5f3b6402013b6403112c3c220e301a6f081a74080e0c000602013b2f293528051a7d070e0e0c0003032a29382937293629353d1a6a070e0e0e0c000303043b5002041a4b08103b502937652502501e323b64026b293528061a45070204f306f1060c000303132936293b1acb070c00032502501e573b64024629353e1a21070e0e0c000303043b5002041a0b08103b5029363b2a291a50070e0c00021a51070e0e0c0002031729362b3c1af3070c0003292b25042504511e233b6502012a6664293c1a3b070c00036403051ada07021131301adb070c000328061acb072b3b6b641ad4072c69040200332b2b1a59070e0e0c0004502936291a55070e0e0c0002291abc070e0c0002293b1a93060c000303783228231ab0070e0c00032922101aa6070e0e0e0c0003291ab4061a71060e0e0c000303033c0222291aab060c00021aad060e0e0c00020310293b1a91063b28081aa3060c000602013b03051a70070201293b1a71070e0e0c00023c1a70071a75070e0e0c0003332c3b2d2d3b3b3c680828072a6927060fcf3228231a38070e0c00032922101a2e070e0e0e0c0003291a3c061af9050e0e0c000303033c0222291a33060c00021a35060e0e0c00020310293b1a19063b28081a2b060c000602013b03051af8060201293b1af9060e0e0c00023c1a08071afd060e0e0c0003332c3b2d2d3b3b3c680828072a693b31291ae4050e0c00021ae5050e0e0c0002031729362b3c1a87060c0003292b25042504511e233b6502012a65221128231a96060e0e0e0c00032922181a8a060e0e0e0c0003291ab0061a7d060e0e0c0003291a8c051a4905020259000e0e0c000303033c0222291a7f050c00021a81050e0e0c00020310293b1a65053b28081a77050c000602013b03051a44060201293b1a45060e0e0c00022e1a64061a49060e0e0c0003302c3b2d2d3b3b3c680828072a69270f22122a45334627100fdd2d372e38291a22050e0e0e0c00021a21050e0e0c0002030d2936293b1ac3040c00036402013b030e2935293829313130327b050900042a3b1a3f050c00032f36303731393b2e291ae0040e0c00021ae1040e0e0c0002031729362b3c1a83050c0003292b25042504511e233b6502012a650402001ad305302b34220f3133220c321ace050e0e0e0c000a5029352a362a3b1a4e040e0e0e0c00030303290204402b2b6a220d2a452f46270b0fcd2d36291a77040c00021a79040e0e0c0002030d2936293b1a1b040c00036402013b03041a8705103b503b502d392a0202b5032c301a7e050e0e0e0c0004280e2a3b6a2a291a36040e0e0e0c00021a35040e0e0c0002031d29352a362a353d1ad4030e0c00030309292503511e283b02013b6502013c64030b291a29040e0e0c0002020129302a452d4627050fcd2d3629352a362b372c392d3a0402002e342b330e0e0c00045029352a360402001a6d03302b56d80e0e0c0004502935220e35220f362210372e2d2d1a5a03020218030e0e0e0c000429352a3634302f31301a4c030e0c0006293b1a4b030c000303032b020b2b2a1ac6040e0e0e0c0003221635221736221837221938221a3a221b2306221c23072f2f2f2f220d303030680804020022182b2b221f0e0e0c00045029350402001ae702221c2b122200010002000e0e0c000450293522223522233622243722192d2d1acd0202028b020e0e0c000429352a362220302f31301abf020c0006293b1abf020c000303032b020b2b2a1a42040e0e0e0c0003222a35222b36222c37222d38222e3a222f2306223023072f2f2f2f220d3030306808040200222d2b2b22330e0e0c0004502935221e3b1a73020c000303042214020640221f22166a343b1a5f020c000303032a020540220c2c6a3c222c2c2c6b22362a45222c4627340fdd2d3629352935280e1a36020e0e0e0c0003035c29362936293b1abd020e0e0c00032b37293b1ab1020e0e0c00032f363039220c35220d36220e3a302f2b1a99030e0e0c00040402002f22122b22110c00045029352a36342b30303034220d1a80030e0c000822132a452b46270f025c2a360402002b312b300e0e0c00045029352a36323533363437220c38220d3a220e2306220f23072f2f2f2f343030306808040200220c2b2b22120e0c00045029352a362a3b69291a30030e0c00023e2a22103c6b22162a452d462712650fdb2d362e372f3830392c3b1afe01020214010e0e0e0c0003313532391a05032b220d306b2d302e2c1a01030e0e0c0005293b1a3f010c00030309341a0e01452c46020d29353d2a3b6a220d2a452e4665270902d22d362936293b1aaf010c00032936291a56010e0e0e0c00021a55010e0e0c000203482c37293b1a8f010c00032e3833353436220c39220d3a1aa502322b2f31680532302c1a71020e0e0c00043b1a98020e0c0002292f2e2e1a95020e0e0c000522112a452f46270b0266293b1ab1000e0e0c000303242c38313532363339343a2f2c2b3b3032020248001a6b020c0007220c2a452c46270602362c37293b1a17010c00032e3833353436220c39220d3a312f2b1a02020e0e0e0c0004322d2c2c31331a3b020c0007220f2a452d4627092704440e0e0e0e0e0000000000000000000e0000000000000000000000000000|@10870,@542,@475,@3597,@10255,@10258,I251,@10871,@10873,@10875,@3335,@10877,@10878,@2288,I48,I105,I218,I154,I113,@542,@2349,@10879,@10889,@10905,@10907,I253,@10909,@1414,@2262,@10910,@10912,@6634,@7165,@10915,@10710,@7104,@10339,@10711,I106,@472,@10716,@10920,@10921,@122,@1004,@9506,@10923,@1385,@10925,@9796,@10927,@10929,@10935,@10944,@10947,@10949,@10951,@10681,@9390,@2273,@10953,@10566,@10869,@2268,@2270,@9733,@9389| 10869:D4,80|008056072c56283b5649565a1a49000e0e0c000729353d1a46000e0e0e0c0003030e293c3b1a40002f0e0e7b0504000428062a3c3b6b6442000000000000000040000000000000000000000000000000|@10954,@9389,I251,@2288| 10870:S35|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229 10871:O1|@10872 10872:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10871| 10873:O1|@10874 10874:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10873| 10875:O1|@10876 10876:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a293c692d1a3f000c00022a2a69270702013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@10875| 10877:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 10878:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 10879:O1|@10880 10880:D11,296|0085301a2a010e0e0e0c00021a29010e0e0c000203043b5002041a2301103b50303531362a352b360402001a1a012c2b220c0e0e0e0c0004502935323533363437220f2d2d1a08010e0c000429352a3631302f31301a00010e0c0006293b1aff000c000303032b020b2b2a1afa000e0e0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220d303030680804020022142b2b221c0e0e0c00045029352a3622173b1ab1000e0e0c0003030b221e220c452b462a47024504030022182b2b2221222122211a9f000c00075029352a362b373d2f69292d69293b1a7a000e0e0e0c000303042211020a22112a1a80000e0c000322252a452e462d47270727191f060e0e0e0e0e0e000000000000000018010000000000000000000000000000|@10882,I105,I218,@10883,@3597,@10255,@10258,I251,@10886,@10879,@10881| 10881:O1|@10888 10882:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f64654c697374283229 10883:O4|@14322,@596,@10885,@10884 10884:O5|@9970,697,0,697,0 10885:S22|4578705365713a20656d7074792073657175656e6365 10886:O1|@10887 10887:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10886| 10888:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10881| 10889:D2,48|00802b352c365627563856491a2900300e0e0e7b07030006000000000000000020000000000000000000000000000000|@10891,@10890| 10890:O1|@10892 10891:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283129 10892:D4,88|00842e390402002d2b2b3234331a50000e0c00075029352a362a3b1a4a000e0e0e0c0003030333020b332b1a42000e0e0e0c0003292b6927051f050e0e0e0e0e000000000000000048000000000000000000000000000000|@10894,@10895,I251,@10893| 10893:O1|@10904 10894:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229 10895:O1|@10896 10896:D11,288|0085301a22010e0e0e0c00021a21010e0e0c000207d4303531362a352b360402001a14012c2b220c0e0c0004502935323533363437220f2d2d1a04010e0c000429352a3631302f31301afc000e0c0006293b1afb000c000303032b020b2b2a1af6000e0e0e0c000322113522123622133722143822153a22162306221723072f2f2f2f220d303030680804020022142b2b221c0e0e0c00045029353d2a690402002218220f2b2221222122211ab1000e0e0c00075029352a362c3b692b3b1a8f000c0003030329020b292c1a9a000e0e0e0c0003293b1a77000c000303042210020e22102a1a880002020e000e0c000322242a452d46271f02052e3b4530461f060e0e0e0e0e0e0e000000000000000010010000000000000000000000000000|@10898,I105,I218,@3597,@10255,@10258,I251,@10899,@10895,@10901,@10897| 10897:O1|@10903 10898:S60|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229636f64654c697374283229 10899:O1|@10900 10900:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10899| 10901:O1|@10902 10902:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10901| 10903:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10897| 10904:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10893| 10905:O4|@14322,@596,@4293,@10906 10906:O5|@2295,357,0,357,0 10907:O4|@14322,@596,@4296,@10908 10908:O5|@2295,359,0,359,0 10909:D4,184|00805607291ab8000e0c00021ab9000e0e0c0002038629352a362a3829353c1aae000e0e0e0c00030367293629291a8f000c00021a91000e0e0c0002032829352a362a352935220c352a2a1a82000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a63000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e0000000000000000a8000000000000000000000000000000|@10318,I105,I218,I251| 10910:O1|@10911 10911:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a36293f1a67000c0003293b1a67000c0003641a50000e0c000264030f291a5d000e0e0c00022b2a6964020a291a4e002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I243,I251,@10910| 10912:O4|@14322,@596,@10914,@10913 10913:O5|@9970,632,0,632,0 10914:S22|4c6973743a2062616420656c656d656e742074797065 10915:O1|@10916 10916:D13,256|0088331a02010e0e0e0c00021a01010e0e0c000203a2333534360402002b220c2b220f0e0e0c00045029352b220e220e220e220e220e220e220e220e1ad9000e0e0c000a1ad900220d220d1ada000e0e0e0c00042a3b692c2a69280e2a3b6a2a291aa4000e0c00021aa5000e0e0c0002031d29352a362a353d1ab4000e0c00030309292503511e263b02013b6502013c64030b291aa1000e0e0c00020201291a7e002a2211221331221322131a910022130e0e7b091500081a8d002c311a68000e0c00041a89003130306b2a1a89000e0e0c00022932342d1a8500320e0e0e7b060e00050e0e0e0e0000000000000000f0000000000000000000000000000000|@10918,I105,I218,@10915,@10602,@10681,I251,@2349,@9390,@10595,@10917,@2268,@2270| 10917:D5,80|00801a53002c56273b564856591a50000e0c000729353d1a4e000e0e0e0c0003030e293c3b1a48002f0e0e7b0504000428062a3c3b6b6442000000000000000040000000000000000000000000000000|@10919,@10595,@9389,I251,@2288| 10918:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129 10919:S58|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129676574436f6e737472283129 10920:D4,184|00805607291ab8000e0c00021ab9000e0e0c0002038629352a362a3829353c1aae000e0e0e0c00030367293629291a8f000c00021a91000e0e0c0002032829352a362a352935220c352a2a1a82000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a63000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e0000000000000000a8000000000000000000000000000000|@10318,I105,I218,I251| 10921:O1|@10922 10922:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a36293f1a67000c0003293b1a67000c0003641a50000e0c000264030f291a5d000e0e0c00022b2a6964020a291a4e002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I243,I251,@10921| 10923:O1|@10924 10924:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10925:O1|@10926 10926:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10927:O1|@10928 10928:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10929:O1|@10930 10930:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@10932,@10931| 10931:O4|@14322,@596,@10934,@10933 10932:S38|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229283129 10933:O5|@9970,593,0,593,0 10934:S17|6d697373696e6720696e207265636f7264 10935:O1|@10936 10936:D12,312|0088321a3a010e0e0e0c00021a39010e0e0c000203b0323533362a352b380402002a220c2b220f0e0e0c00045029350402002a353d1a18010e0c0003030d1a17012b692a3b452a4651021f3c220d0e0e0e0c00021a09012a220e6a3c3b2c2f6b293b692d2a452c46260529352a362f220d1af4000e0c00031af5002b221022172d68050402002a342b2216221622162216221622161ae0000e0c000a5029352a362a3b1aaa000e0e0e0c000303032f020b2f2b1aca000e0e0e0c000322172a452b46270f02572b341abd000e0e0c0003280e2a3b6a2a291a66000e0e0e0c00021a65000e0e0c0002031d29352a362a353d1a5c000e0c00030309292503511e283b02013b6502013c64030b291a81000e0e0c0002020129343b452a46661f090e000000000000000028010000000000000000000000000000|@10938,I105,I218,I251,@10939,@10940,@10716,@10941,@10935,@10937,@1385,@2349| 10937:O1|@10943 10938:S45|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c697374283229 10939:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 10940:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 10941:D2,56|00802b561a1a38000e0c0003030a560856172c0e0e8000022b56192c0e800002000000000000000028000000000000000000000000000000|@10942,I113| 10942:S54|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c6973742832296c6f6f6b466e283129 10943:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10937| 10944:O4|@14322,@596,@10946,@10945 10945:O5|@9970,557,0,557,0 10946:S20|636f646567656e3a20556e617279207475706c65 10947:O1|@10948 10948:D4,88|00822d1a5a000e0e0e0c00021a59000e0e0c000203212d352e360402002b2f2b320c00045029352b31311a43000c00042a2a69270502013b440e0e0e0e0e0e0e000000000000000048000000000000000000000000000000|@1399,I105,I218,@10947| 10949:O1|@10950 10950:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10949| 10951:O1|@10952 10952:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10951| 10953:D2,48|008056073c562856392f1a2b00300e7b070300060e0e0e0e000000000000000020000000000000000000000000000000|@10932,@7104| 10954:S47|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229676574436f6e737472283129 10955:D53,1904|00832b362c372d3831293528161a68070e0c0003030c2936292502501e133b6402302935280b1a4f070c0003030429370220293528051a3f070c000303043b5002041a3b07103b502937292502501e453b6464040300311a2e070e0e0e0c00021a2d070e0e0c00021a25070e0e0c0002030e2d2a2a35452a36462a37475102292d352e363c28403b1a0d070e0e0c00041a0d072a2c6a2c3c1a0d070e0e0c00032e2a452b462c47260629352a362b373c28403c1ae2060e0e0e0c00041af1062a692f1ac3060c00021ac5060e0e0c000203043b5002041adf06103b502f352937293b1adb060c00032b38293b1ad1060e0e0c00032d36291ace060e0e0e0c00023b2a291a82060e0e0e0c00021a81060e0e0c0002031729362b3c1a8b060c0003292b25042504511e253b6502012a65293c1a9c060e0c00031a55060e0e0c0002031c22151a41060e0e0c00021a41060e0e0c00021a39060e0e0c000202013b07dd220f28281a70060e0c00032a3c1a6f060c00032a2a1a5f060c00032928291a56060e0e0e0c00033c28403b1a09060e0e0c00041a51062a22126a22123c1a07060c0003292b2d6a313c1a23060c000303051a3b060265313b1a3c060e0c000303041a3b06103b503b50311a3a061a3f060c0003280e2a3b6a2a291aaa050e0e0e0c00021aa9050e0e0c0002031d29352a362a353d1a80050e0c00030309292503511e283b02013b6502013c64030b291a05060e0e0c000202012965221d35221e39221f3a222023071af405122100010001002226221e313134221c0202ca0222113333680b29343022162215222932220d220c221f1acf050c000b333b1a5f050c0003293b2a1a1e050e0e0e0c00021a1d050e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a98050e0c0002221b3b1a1e050e0e0e0c0003221c3b1a12050e0e0e0c0003293b1aef040c0003221e3b2b1a75050e0e0c00045022111a72051aa7040c000303033c022a22111aaa040e0e0e0c00021aa9040e0e0c0002031422113b1a4c053b28081a4e050e0e0e0c000602013b03051a4805020222112d1a48050e0c000222171a47051af4040e0c0003322c3b2d2d3c343c680828072a693c222b0c00023c3b2b2d6b293b69222e35222f363c28403b1a4f040c00042b3c1a57040c00032232352a2a1a0c050e0c0003293b1a0b050c000303041a0b05103b503b50293b1a09050e0e0c00030321293c1ae5040e0e0c0003322a3b6a642e0e0e0e0c0002292e1aef040c0003640216313b1acc040e0c000303041ae304103b503b503d32693f2a6922251adb041a50040e0c0003291ac0030e0c00021ac1030e0e0c0002030d2936293b1a9b030c00036402013b030d29351ab5042a69293b696502423b2a291a8f030c00021a91030e0e0c0002031729362b3c1a9b030c0003292b25042504511e223b6502012a65291a85041aea030e0e0e0c0003292c1a7f040c000365291a7f040c0002291a80040e0c00023e2a2f3c6b22391a7a041a87030c0003343b1a67030c0003293b2a1a26030e0e0e0c00021a25030e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291aa0030e0c00022c1aa8031add020e0e0c000303033c02222c1adf020c00021ae1020e0e0c000203102c3b1a85033b28081a87030c000602013b03051a840302012c2a1afd030e0e0c00023c1afc031a31030e0e0c0003302c3b2d2d3b3b3c680828072a6922163b1a80020e0c000303032902054022172b6a27330fcd220f1ad1031ac6020e0e0e0c00033c28403b1a79020e0e0c00041ac1032a220f6a220f3c1a77020c0003292b2d6a221935221a39221b3a221c23071aa803121d00010001002222221a30322217220f3232680a29331a960322122211222532220c220c221b1ab6020e0e0e0c000b323b1a43020c0003293b2a1a02020e0e0e0c00021a01020e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a7c020e0c000222173b1a02020e0e0e0c000322183b1af6010e0e0e0c0003293b1ad301020279010c0003221a3b2b1a55020e0e0c00045022101a52021a87010c000303033c022a22101a8a010e0e0e0c00021a89010e0e0c0002031422103b1a2c023b28081a2e020e0e0e0c000602013b03051a2802020222102d1a28020e0c00023c1ac8021ad5010e0e0c0003322c3b2d2d3c343c680828072a69222b1a35010e0e0c00021a35010e0e0c00021a2d010e0e0c00020303290fcc3b222c291a14010e0c00021a15010e0e0c0002031729362b3c1a1f010c0003292b25042504511e233b6502012a6522161a68021a35010e0e0c000322223b1a12010e0e0e0c0003293b2a1ace000e0e0e0c00021acd000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291a48010e0c00022c1a50011a85000e0e0c000303033c02222c1a87000c00021a89000e0e0c000203102c3b1a2d013b28081a2f010c000602013b03051a2c0102012c2a1a2d010e0e0c00022f1adc011ad900020215000e0e0c0003312c3b2d2d3c3b3c680828072a692709271627121f040e0e000000000000000060070000000000000000000000000000|@10957,I251,@10958,I105,I218,I11,@10961,I106,@10962,@10964,I253,@10329,I113,@122,@243,@10967,@472,I232,@10367,@10968,@1385,@2349,@10970,@10405,@2330,I255,I48,I154,@1004,@2332,@10972,I107,I234,@2320,I233,@2323,@2318,@10974,@472,@10977,@1734,@10979,@2273,@10488,@9506,@10981,@10488,@10983,@10984,@472,@10985,@9796,@10956| 10956:O1|@10987 10957:S33|434f444547454e5f50415253455452454528292e636f64654c616d626461283429 10958:O4|@14322,@596,@10960,@10959 10959:O5|@9970,798,0,798,0 10960:S42|676574466e426f64793a206e6f74206120636f6e73747261696e656420666e2d65787072657373696f6e 10961:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10962:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@10963,I253,I106,I255| 10963:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429666e4d6b41646472283129 10964:O4|@14322,@596,@10966,@10965 10965:O5|@9970,814,0,814,0 10966:S43|636f64654c616d6264613a20626f6479206f6620666e206973206e6f74206120636c61757365206c697374 10967:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10968:O1|@10969 10969:D4,64|00802b3b1a41000e0e0c0003293b1a3f000c000303041a3f00103b503b2a693f2a6965420e0e0e0e000000000000000030000000000000000000000000000000|@10371,I106,I234,@3576| 10970:D1,64|0080560b561c562d563e2f565f3b12080001000a00680856185629563a3b2d5667310e7b07040006000000000000000030000000000000000000000000000000|@10971| 10971:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429636f6465416c7473283129 10972:O1|@10973 10973:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10974:O1|@10975 10975:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@10976| 10976:S44|434f444547454e5f50415253455452454528292e636f64654c616d62646128342972657350726f632d283129 10977:O1|@10978 10978:D2,40|008028061a29002d3b6b420e0e0e0e0e000000000000000018000000000000000000000000000000|@10493,@472| 10979:O1|@10980 10980:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10979| 10981:O1|@10982 10982:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10983:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 10984:D2,64|0080560a561b562c563d2f565e3b567f6808561856291a2f003b2d5667310e7b070400060e0e0e0e000000000000000030000000000000000000000000000000|@10971,@472| 10985:O1|@10986 10986:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10987:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 10988:D4,104|00822b352c382d3a2e2306313b2a1a5f000c00021a61000e0e0c000203282a352b362a2c30220d3356d7220d3422131a4e000e0e0e0c000a2a2a2505250526031e333b660201292706440e0e0e0e0e0e000000000000000058000000000000000000000000000000|@10990,I105,I218,@10989| 10989:O1|@10991 10990:S44|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329 10991:D45,1424|00883338293b1a8f050c0003220c35220d36220e372c3b1a86050e0e0e0c00030304285f02492c1a7e050e0e0e0c0002291a7c050e0c00021a7d050e0e0c0002032929352a36293b1a55050e0e0c000303032a0213291a67050c00022b2a69641a65050e0e0c00026502031a6205642d220f1a63050c0003293b2a1a32050e0e0e0c00021a31050e0e0c0002032c2a352b362b3b1a09050e0e0c000303032a020b2a2c1a3a050e0e0e0c00032a2a2505250526031e3a3b66020129653b2a291aee040e0e0e0c00021aed040e0e0c0002031729362b3c1a0f050c0003292b25042504511e253b6502012a650407002a3b1afd040e0e0c0003031d22112a2a35452a36462a37472a39482a3a492a23064a2a23074b51028c3c28403c1ada040e0e0e0c00041ad9042a6922133629352a363c28403b1ac1040e0e0c00041ac9042a2c6a2c3c1aa1040e0e0c0003292b2d6a1abd042b69342a1abe040e0e0e0c0003220d2a1aba040e0e0e0c0003221d3a3c2b693c28403b1a7f040c00042930220f2d6b292d692222352223392224230722142c45220c462213472b482d493b4a2a4b261529352a362b372c382d392e3a2f23062217220c1a6f040c000329282d1a66040e0e0e0c00033131312c32323232680804020022112b2b221d0e0e0c00045029350402002a353d1ab4030e0c0003030d1a3b042b692a3b452a4651021b3c340c00021a31042a220e6a3c3b2c2f6b293b692d2a452c46260529352a36221d220e220e220d6b220e2b0e0e0e0c000204020022192b22192e2d1a03040c00065029352a36291a6f030c0002030c22211a65030e0e0c000202013b031522223b2222221c1ae1031ae6030e0e0e0c000602013b2223230d29291a34030e0c00021a35030e0e0c0002032429352a362a35291ac4031a09030e0e0c00036403052a68010207292503511e303b6502013b64293b1aeb020c0003036b1aa303291aef020c00021af1020e0e0c0002032429352a362a35291a80031ac5020e0e0c00036403052a68010207292503511e2f3b6502013b64293b1aa7020c000303041a6703103b503b50293529351a4b031a90020e0c000303043b5002041a5303103b50293765021e293529351a2c031a71020e0e0c000303043b5002041a3303103b50293764650339221c3b1a2c030e0c000329291a5b020c00021a5d020e0e0c0002031929352a362a22281a14030e0c000350292503511e243b6502013b6502013b22173b1a6a020e0e0e0c0003031c2c3b1a0d020e0e0c0003030331020b312d1ae6020e0e0e0c00030fd02227372228363c2b0e0e0e0c000222141af3010c00021af5010e0e0c000203043b5002041abf02103b502214352935293b1aba010e0e0e0c0003291ab0020e0c0002293b2a1abe010e0e0e0c00021abd010e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965343b1a82010e0e0e0c000303042210020a2210220c1a6f020c0003293b1a67010c000303032a020b2a2a1a62020e0e0e0c000322281a5f020c0002280e2a3b6a2a291a52010e0e0e0c00021a51010e0e0c0002032129352a362a353d1a28010202db000e0c00030309292503511e2c3b02013b6502013c64030b291a21020e0e0c00020201292c3b1afc000e0c00030303290204402d2b6a222237293b1adf000c0003293b2a1aee000e0e0e0c00021aed000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ad0010e0c00023b22260e0e0c00022a1ac8010e0c0002222b1ac7011a0c010e0c0003301ac4013b2d2d3b313c680828072a693c3b22162c6b223622323b221a221a221a22361aaa010e0e0e0c00083b22182219221922351aa0010e0c00063d2a69292c692d2a69271c293b1a44000e0c00030304222a020e222a2a1a840122250e0e7e2c000327211f09000000000000000080050000000000000000000000000000|@10993,I253,I251,@10994,I105,I218,@10996,@104,I48,@10998,@11006,I106,I113,I11,@11008,@11010,@11011,@1385,@2702,@122,@11015,@11016,@11017,@11034,@7104,@14403,@2781,@2836,@1576,@10529,@10300,@11035,@2773,@2776,@11037,@11039,@11041,@2349,@2330,@9506,@11046,@9796,@11048,@11055,@10992| 10992:O1|@11065 10993:S58|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229 10994:O1|@10995 10995:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a352a1a40000e0c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@10994| 10996:O1|@10997 10997:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c000203192b352c36291a4a000e0e0e0c00022b2a69287c2a69270402013b420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@1666,I105,I218,@10996| 10998:O1|@10999 10999:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031d2c352d362a2e1a49000e0e0c00032a2f1a47000c00032a2a69270402013b430e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@11000,@10998| 11000:O1|@11001 11001:D5,72|00812c381a49002d690402002b2b2b1a46000e0e0e0c0004502936291a41000e0e0c0002291a4000310e0e0e7d090002000000000000000038000000000000000000000000000000|@11003,@11004,@1414,@2262,@11002| 11002:O1|@11005 11003:S77|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229706f6c7956617273466f7256616c732d283129 11004:D4,184|00805607291ab8000e0c00021ab9000e0e0c0002038629352a362a3829353c1aae000e0e0e0c00030367293629291a8f000c00021a91000e0e0c0002032829352a362a352935220c352a2a1a82000e0e0e0c00036603052a68010207292503511e333b6502013b64293b1a63000c0003030a2c250626051e733b02122935293529352a3628062b2b6a29680127056502082a250426031e923b6602013b64420e0000000000000000a8000000000000000000000000000000|@10318,I105,I218,I251| 11005:D6,112|00802b1a72000e0e0e0c00021a71000e0e0c0002033d2b352c362a36293f1a67000c0003293b1a67000c0003641a50000e0c000264030f291a5d000e0e0c00022b2a6964020a291a4e002e0e7d0500026502013b420e0e0e000000000000000060000000000000000000000000000000|@283,I105,I218,I243,I251,@11002| 11006:O1|@11007 11007:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11006| 11008:D4,72|008056073b1a48000e0c000356173b1a3e000e0e0e0c0003292e1a3b000c000356373b2b1a39000e0e0c0004502b6642000000000000000038000000000000000000000000000000|@11009,I253,I106,I255| 11009:S106|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d666e4d6b41646472283129 11010:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 11011:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@11013,@11012| 11012:D2,64|00802b352c362a56381a3c000e0c000356372a3c6a642a0e0e0c00023f2a6966420e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@11014,I107| 11013:S107|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129 11014:S110|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129283129 11015:D1,32|00805607420e0e0e000000000000000010000000000000000000000000000000|@9353| 11016:D2,64|00802b352c365628352b2a1a3a000e0e0e0c000356472a3b6a642b0e0e0c00023f2a692704420e0e000000000000000030000000000000000000000000000000|@9355,I107| 11017:O1|@11018 11018:D15,312|0084040300301a37013c31312e1a38010e0c00075029352a362b372b2b2b6a3c1a2d010e0e0c00020404002b2b1a28013b2d1a2b010c00065029352a362b372c382c2c2c2c6b0404002a2a1a1a010e0e0e0c00035029352a362b372c382c2c2c2c6b2b293b1a08010e0c000303033b0285291a03010c00021a05010e0e0c000203043b5002041aff00103b5029353b2a1afd000e0e0c00036403033c0258291ad6000e0e0e0c00021ad5000e0e0c000203043b5002041acf00103b5029353b2a1ad5000e0e0c00036403033b0228291aa6000e0e0e0c00021aa5000e0e0c000203043b5002041ab700103b502936292502501e8f3b64641a86000e0e0e0c00022a2219221922191a9e000e0e0e0c000522162a452b4627141f050e0e0e0e0e0e000000000000000028010000000000000000000000000000|@11020,@10551,@10553,@11021,@11023,@10747,@10756,I251,I105,I218,@1712,I113,I234,@1715,@11019| 11019:O1|@11025 11020:S38|4d415443485f434f4d50494c455228292e636f646542696e64696e675061747465726e283429 11021:O1|@11022 11022:D4,72|00802b3c1a49000e0e0c000303033b02172b3c1a42000e0e0e0c0003291a40000e0c00022d2a6965420e0e0e0e0e0e0e000000000000000038000000000000000000000000000000|@10743,I233,I106,@11021| 11023:O1|@11024 11024:D6,80|00802b35293b1a4f000c000303033b021b291a4b000c00021a4d000e0e0c000203043b5002041a4700102935293b691a46003b2b3c6b6642000000000000000040000000000000000000000000000000|@10746,I251,I105,I218,@1712,@836| 11025:D19,456|00832e3529353e1ac6010e0e0e0c000303152936291ac0010e0c00021ac1010e0e0c00026402013b6403043b5002041ab601102e3529362935293532363337313632373c2a0c00023c3b2b22106b2a3b1a9d010e0e0c000303041a9b01103b503d2b693f2a6930291a6d010e0e0c00021a6d010e0e0c0002034329352a362a3729353d1a4a010e0e0e0c000303043b5002041a6b011029362a372a3b341a68010e0c000450293b220d1a5c010e0c0004502c250626051e4f3b270502013b6430293b1a0b010c000303033b027b291a07010c00021a09010e0e0c000203043b5002041a2b011029353b2a1a2b010c00036403033c0252291ade000e0e0e0c00021add000e0e0c000203043b5002041aff001029353b2a1ad7000c00036403033b0226291ab2000e0e0e0c00021ab1000e0e0c000203043b5002041ae300102936292502501e843b64641a94000e0c000203033b022a322b3b22121acb000c00051acd001ad20022131ad5000e0e0c00043c2b1ad3002c6b3d2a69293b692704333c2d3b22141ac8000e0c0006293b1a3f000c000303032a020b2a2a1aba000e0e0e0c00032f2a6927101f040e0e0e0e0e0000000000000000b8010000000000000000000000000000|@11027,I251,I105,I218,@11028,I234,@3576,@10803,I255,@1712,I113,@1715,@10808,@11031,@11032,@10789,@542,@10813,@11026| 11026:O1|@11033 11027:S31|4d415443485f434f4d50494c455228292e636f646542696e64696e67283429 11028:O4|@14322,@596,@11030,@11029 11029:O5|@10563,1124,0,1124,0 11030:S42|636f646542696e64696e673a2073686f756c64206265206e61697665207061747465726e206d61746368 11031:S4|42696e64 11032:O3|2,100,0 11033:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11026| 11034:S26|5061747465726e206973206e6f7420657868617573746976652e 11035:O1|@11036 11036:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11035| 11037:O1|@11038 11038:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11037| 11039:O1|@11040 11040:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11039| 11041:O1|@11042 11042:D9,128|00802b1a82000e0e0e0c00021a81000e0e0c0002034d2b352c362a3729353d1a76000e0e0e0c000303043b5002041a6f00102936293b1a6f000c0003293b1a6f000c000303041a6f00103b503d2a693f2a692e1a6a000e0e0e0c00022a2a69270802013b420e0e0e000000000000000070000000000000000000000000000000|@1399,I105,I218,I251,@11043,I253,I234,@3576,@11041| 11043:O4|@14322,@596,@11045,@11044 11044:O5|@9970,1641,0,1641,0 11045:S7|6c6f616456616c 11046:O1|@11047 11047:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11048:O1|@11049 11049:D18,496|0086311af2010e0e0e0c00021af1010e0e0c00020314301ade010e0e0e0c00021add010e0e0c000202013b07d431353236323533363c330e0e0c00022d3729353d1ac4010e0c000303043b5002041abf01103b5029362a372a3b2e1aba010e0e0e0c000450293b220e1aac010e0c0004502e3b1a92010e0e0e0c000303363b220d220e220e220e1a96010e0e0e0c000629353d1a72010e0e0e0c0003030c2922103b1a83010c0004020728062a22113b6b640fca3b2f291a3e010e0e0e0c00021a3d010e0e0c0002031729362b3c1a5f010c0003292b25042504511e253b6502012a65220d35220e363c28403b1a48010e0c00041a49012a2c6a2c3c1a31010202d0000e0e0c0003292b2d6a220c2a2215221522151a08010e0c000629353d1ae6000e0e0e0c0003030c2922173b1af7000c0004020728062a22183b6b2e3b1a06010e0e0e0c0003293b2a1aaa000e0e0e0c00021aa9000e0e0c000203182a352b362a35292d692b2a2506250626041e253b270402012965291ad40002022a000e0c0002291ad0000e0c0002220c1acf001ad4000e0c00032e1ad4003b2d2d3b3b3c680828072a69270f3c3b2f2c6b22103c1a7b000c000332312b22132213221322131ab2000e0e0e0c00082b2a69270c02013b1f070e0e0000000000000000e0010000000000000000000000000000|@11051,I105,I218,I251,@11052,I255,@11055,@2288,I106,I11,@11063,I253,@2330,@9506,@11050,@1385,@9796,@11048| 11050:O1|@11064 11051:S85|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6c6f616446756e6374696f6e73283329 11052:O4|@14322,@596,@11054,@11053 11053:O5|@9970,1680,0,1680,0 11054:S13|6c6f616446756e6374696f6e73 11055:O1|@11056 11056:D10,160|00843b30291aa0000e0c00021aa1000e0e0c0002031729362b3c1a9b000c0003292b25042504511e233b6502012a65291a8d001a92000e0e0e0c0003312a1a8f000c00033135323632352b2a1a89000e0e0c0003332a3b6a642b0e0e0e0c00023f2a69332f220f1a76000e0e0e0c0004291a74000e0c00023e2a2d3c6b270a1f050e0e0e0e0e0e0e000000000000000090000000000000000000000000000000|@11058,I105,I218,I106,@11059,@1385,@2702,I107,@11057,@2273| 11057:O1|@11062 11058:S83|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e283229 11059:O1|@11060 11060:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11061| 11061:S93|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e2832297661724e6f732d283129 11062:D7,184|00822d1aba000e0e0e0c00021ab9000e0e0c000203852d352e362e291aa1000e0e0c00021aa1000e0e0c0002032429352a362a3529352f352a2a1a93000c00036603052a68010207292503511e313b6502013b64293b1a77000c000303051a77000226293529363035313632352b2a1a6e000e0e0e0c00032d2a3c6a642b0e0e0e0c00023f2a6927062b31311a59000e0e0c00042a2a69270502013b440e0e0e0000000000000000a8000000000000000000000000000000|@1399,I105,I218,I251,@2651,I107,@11057| 11063:D7,144|00802b352c362d372a3b1a8b000c000303041a8b00103b502a3b1a8b000c000303222a3c1a89000e0e0c00032c2a2c6a6456480e0e0c00022956571a7a00310e7e0700032903162b3b1a4c000e0c000303041a6b00103b503b2c6902162b3b1a36000e0e0e0c000303041a5300103b503d2c6966420e0e0e000000000000000080000000000000000000000000000000|@2319,I234,@2320,I233,I107,@2323,@2318| 11064:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11065:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@10992| 11066:O1|@11067 11067:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11066| 11068:D1,88|00802b352c362d372e382f39303a0402002e56882f2f2f2f220c56e93112110001000400121200010001000e0e0c000b5029352a362a2a692709420e0e0e0e0e000000000000000048000000000000000000000000000000|@11069| 11069:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f636573735461696c283129 11070:D1,88|00802b352c362d372e382f39303a0402002e56882f2f2f2f220c56e93112110001000400121200010001000e0e0c000b5029352a362a2a692709420e0e0e0e0e000000000000000048000000000000000000000000000000|@11071| 11071:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f63657373426f6479283129 11072:O1|@11073 11073:D7,160|0088321aa2000e0e0e0c00021aa1000e0e0c00020368323533360402002b220e2b220d220d220d220d220d220d1a88000e0c000a5029352a360402002a2e2b2210221022102210221022101a72000e0e0e0c000a5029352a362a3b1a6a000e0e0e0c000303032d020b2d2b1a62000e0e0e0c000322112a452b4627090205313b4534461f090e0e0e000000000000000090000000000000000000000000000000|@9325,I105,I218,@11075,@11072,I251,@11074| 11074:O1|@11082 11075:O1|@11076 11076:D10,256|008833363437220c38293b1afa000e0e0e0c0003293b1af7000c000303041af700103b502935220c2e1af4000e0c000329282e1aea000e0e0e0c00030402002f2b2213220f220f2e221322150e0c00085029352a363c220f0e0c00022f3629353d1aac000e0c000303043b5002041ab7001029362a372a3b2e1ab4000e0c000450293b22131aa8000e0c000450323b692922122214221722171a9c000e0c000629352a363c3b32346b293b692c3b1a5f000c0003030329020b292d1a82000e0e0e0c0003293b1a47000c00030304220c020a220c2a1a70000e0c0003221e2a452e4627161f090e0e0000000000000000f0000000000000000000000000000000|@11078,I253,I251,@1792,@122,@9340,I255,@9366,@11079,@11077| 11077:O1|@11081 11078:S65|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829636f646553747275637475726542696e64283229 11079:O1|@11080 11080:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11079| 11081:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11077| 11082:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11074| 11083:O1|@11084 11084:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11083| 11085:O1|@11086 11086:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11085| 11087:O1|@11088 11088:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11087| 11089:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9856| 11090:D8,144|008156092d2a1a8f000c00021a91000e0e0c000203043b5002041a8b00102a352b362b3b1a89000e0e0c000303042a3602162b3c1a81000e0e0c00032a2a2505250526031e3f3b642704293629353d1a6e000e0e0e0c000303142a2e564756581a65000e0e0c00053c2a696402022a3565430e0e0e0e0e0e000000000000000080000000000000000000000000000000|@9714,I105,I218,@611,I113,I107,I251,@9638| 11091:O1|@11092 11092:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11091| 11093:O1|@11094 11094:D2,48|00802b352c362d372e382f391a2900300e0e0e7b07030006000000000000000020000000000000000000000000000000|@11096,@11095| 11095:O1|@11097 11096:S25|434f44455452454528292e6d6b4d6163726f50726f63283129 11097:D14,248|00842c3b1af9000e0e0c0003036e2d1af6001aeb000c000303033c02222d1aef000c00021af1000e0e0c000203102d3b1ad5003b28081ae7000c000602013b03051ae40002012d2d1ae5000e0e0c0002301ae4001ae9000e0e0c0003322c3b2d2d3b343c68083b2a1add006a3b2a1adf000c00033d3b2b6a270602602d1a88001a7d000e0e0c000303033c02222d1a7f000c00021a81000e0e0c000203102d3b1a65003b28081a77000c000602013b03051a740002012d2d1a9d000e0e0c0002301a9c001a79000e0e0c0003322c3b2d2d3b343c680828072a6927041f050e0e0000000000000000e8000000000000000000000000000000|@11096,I251,I48,I105,I218,I154,@1004,@11099,@11101,@1385,@11103,@11109,@11111,@11098| 11098:O1|@11113 11099:O1|@11100 11100:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c362a353f1a58000e0c000303043b5002041a5300102a362a1a54000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@2334,@11099| 11101:O1|@11102 11102:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11103:O1|@11104 11104:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@11106,@11105| 11105:O4|@14322,@596,@11108,@11107 11106:S28|434f44455452454528292e6d6b4d6163726f50726f63283129283129 11107:O5|@598,362,0,362,0 11108:S20|6d6b4d6163726f50726f633a20636c6f73757265 11109:O1|@11110 11110:D4,104|00812c3b1a69000e0e0c0003030e1a670028452d3b6b293b6964022c2c352d362a35291a52001a47000c000364030d292e1a4c002f0e0e0e7e060003292e1a3f000c00032b2a6966430e0e0e0e0e0e0e000000000000000058000000000000000000000000000000|@2298,I251,@14321,@11109| 11111:O1|@11112 11112:D6,96|00802b1a62000e0e0e0c00021a61000e0e0c000203292b352c362a353f1a58000e0c000303043b5002041a5300102a362a1a54000e0c00022a2a69270402013b420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I251,@2334,@11111| 11113:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11114:O1|@11115 11115:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11114| 11116:D10,136|00802b352c362d372e382f392b1a80001a85000e0e0c000303033c02222b1a7f000c00021a81000e0e0c000203102b3b1a5d003b28081a77000c000602013b03051a740002012b2b1a75000e0e0c00022e1a74001a79000e0e0c0003302c3b2d2d3c323c680828072a692709420e0e0e000000000000000078000000000000000000000000000000|@3632,I48,I251,I105,I218,I154,@1004,@2332,@11117,@1385| 11117:O1|@11118 11118:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11119:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9332| 11120:O1|@11121 11121:D1,40|00802b352c372a2a6965420e0e0e0e0e000000000000000018000000000000000000000000000000|@11122| 11122:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f706465637328332964656275677c636f64652d283129 11123:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9328| 11124:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9324| 11125:O1|@11126 11126:D10,224|00802b353c1ae0000e0c000303033b02b12b353b1ad1000e0e0c0003033a2b36291acc000e0c0002293b2a1aca000e0e0e0c00021ac9000e0e0c000203152a352b362a2c692a2a2505250526031e233b660201292704026a2b362c37293b1aa7000c00032b1aa8001aad000e0e0c00032a1aac000e0c0002293b2a1a7a000e0e0e0c00021a79000e0e0c000203152a352b362a2c692a2a2505250526031e233b6602012965293b1a3e000e0e0e0c000303032b020b2b2a1a6e00330e7e0900032706420e0e0e0e0e0000000000000000d0000000000000000000000000000000|@11128,I251,@11129,I105,I218,I253,@2249,@9803,@11131,@11127| 11127:O1|@11135 11128:S45|535452554354555245535f28292e67656e636f6465537472756374732832296c6f6164546f7064656373283129 11129:O1|@11130 11130:D10,160|00802b1aa2000e0e0e0c00021aa1000e0e0c000203692b352c362a3a293b1a97000c0003293b1a97000c000303041a9700103b502935293729353d1a82000e0e0e0c000303043b5002041a8300102936293b1a63000c0003293b1a7b000c000303041a7b00103b503d2a693f2a69311a76000e0e0e0c00022a2a69270b02013b420e0e0e0e0e0e0e000000000000000090000000000000000000000000000000|@1399,I105,I218,I253,I251,@1792,@9340,I234,@3576,@11129| 11131:O1|@11132 11132:D5,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a35291a48000e0c00022b1a48000e0c00022a2a69270502013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@11133,@11131| 11133:O1|@11134 11134:D11,208|00802b353f1ad0000e0c000303342b362c372936291ac8000e0c000229353d1ab6000e0e0e0c0003030e292d3b1ab800320e0e7b0507000428062a2e3b6b270402722b353d1a90000e0c000303502b362c372a3b1a99000e0e0c00032a3b1a8f000c000329353b2a1a8d000e0e0c0003293b1a8b000c000303043b5002041a8700102c3b1a89000e0e0c000303041a8700103b503d2d693f2a69270702162b353c1a34000e0c000303043b5002041a6f00102b36420e0e0e0000000000000000c0000000000000000000000000000000|@2287,I251,@11133,@2288,I253,I107,I113,@2254,I234,@2252,@2286| 11135:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11127| 11136:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@9225| 11137:O1|@11139 11138:S45|434f4d50494c45525f424f445928292e62617365436f6d70696c657228332965786563757465436f6465283129 11139:D6,184|00812b350406002a1ab5002a1ab9000e0e0c00021ab9000e0e0c0002031c2a352b362a2c341ab0000e0c00042a2a2505250526031e292603021629362c2a35452a36462a37472a38482a39492a3a4a515129352a362b372c382d392e3a2e3b1a7e000e0e0e0c00032d3b1a73000c00032b3b1a6b000c00032e3b1a63000c0003313b1a5b000c00032f3b1a53000c00032e2b2f2e2d316806270e430e0e0e0e0e0000000000000000a8000000000000000000000000000000|@11141,@11142,I105,I218,@11148,@11140| 11140:O1|@11198 11141:S29|535452554354555245535f28292e706173733453747275637473283229 11142:O4|0,@5988,0,@11143 11143:O1|@11144 11144:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@11146,@11145| 11145:O4|11,@49,0,@11147 11146:S39|535452554354555245535f28292e706173733453747275637473283229726573756c742d283129 11147:O5|@8409,3255,0,3255,0 11148:O1|@11149 11149:D21,672|00822c352d3629352a362b372c382d392e3a3437220c38220e353c1a8a020e0e0e0c00030338220e36292b1a82020e0e0e0c00032e3b1a6f020c0003030329020b292f1a72020e0e0e0c0003333333332d336806220d2a30306b27040fd1220e353b1a43020c00030360220e36332f690402002b2b2a1a47020c00021a49020e0e0c000203202a352b362a2c2215331a3e020e0e0e0c00052a2a2505250526031e2b26030209292c2a35452a3646515129352a36220c220c220c2c220c220c68062b2a32326b27060fdc220e36220f37293b1a03020c0003220c3b690402002b2b2a1adb010c00021add010e0e0c0002039f2a352b362a3629353b1aaa010e0e0e0c000303043b5002041ad3011029362a372d372f353036221b353d1a89010e0e0c00030310221b2b3b1abb0102024e010c000402072806221c2c3b6b3c2a692e353c1a62010e0e0e0c0003030d2e36293b1a83010c00036402022e363c28402b1a8c010e0c00043c2a333b6b2c2a326a303c1a82010e0e0e0c00032a31692a2a69220f2a2513251326111eaa26110209292c2a35452a3646515129352a36293b1a04010202d7000e0c000303051a4f0102903b2a291a07010c00021a09010e0e0c0002031729362b3c1a2b010c0003292b25042504511e223b6502012a65291a25011a2a010e0e0e0c000303041a2701103b502928403b1af5000e0e0c00043b2c293b1aa1000e0e0c000303043b50022629352a362d2d2c1a04010e0c0004502c3c1ad2000e0e0e0c0003292b2505250526031e32260351291aeb000c00025029651aea00322b220c6b2c221269040200332c2c2c221b1add000e0e0c00065029352a362e1ad7000c0002220f2a1a86000e0e0e0c00032c2c2b326b270f270a440e0e0e0e0e0e000000000000000090020000000000000000000000000000|@11151,I251,@11152,@11160,I105,I218,@11162,I253,@11170,@2288,I11,I106,I49,72057594037927935,I231,@3441,I255,I47,@11172,@11150,I15| 11150:O1|@11174 11151:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229 11152:O1|@11153 11153:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c0002032d2c352d362a362b37293b1a55000e0e0c000329311a53000c00032c2a692e331a50000e0c00032a2a69270802013b430e0e0e000000000000000050000000000000000000000000000000|@1399,I105,I218,I253,@11154,@11152| 11154:O1|@11155 11155:D10,168|00812c352d362e372f383039313a1a9f00322e2c6b1aa0002c2b6a30353c1a9f000c00030359303631382a3b1a99000e0e0c00032a3b1a8f000c0003293b1a87000c0003293b1a87000c000303051a870002242928403b1a86000e0e0e0c00042b3c2b3b2e1a80000e0c000650291a7f000c00025029643b2d2b6a2706020130293131312e3168062709430e0e0e0e0e000000000000000098000000000000000000000000000000|@11157,@11158,@11156,I251,I253,I113,I49,I11,I195,I47| 11156:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11157:S61|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e6174757265283129 11158:D7,136|00802b56191a88000e0c0003030a2b56172c0e0e0e8000022b56191a7a000e0e0e0c000356182a2a1a75000e0e0c00021a75000e0e0c000203043b5002041a6f00102a352b362b3b1a6d000e0e0c000303032a02172b3c1a3e000e0e0e0c00032a2a2505250526031e413b642705420e000000000000000078000000000000000000000000000000|@11159,I234,I107,I105,I218,@611,I113| 11159:S70|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e61747572652831296d6170494473283129 11160:O1|@11161 11161:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11160| 11162:O1|@11163 11163:D15,440|00832e382f3a2f35303630353d1ab0010e0c0003030c302b3b1aac010e0c000402062806312c3b6b2c3b1aa3010c0003293b1a8b010c000303041a9b01103b502935293529352a372c362d382e392c352d362e372f383039313a1a830122162e2c6b1a83012c2b6a30353c1a52010e0e0e0c00030359303631382a3b1a51010e0e0c00032a3b1a47010c0003293b1a3f010c0003293b1a57010c000303051a570102242928403b1a56010e0e0e0c00042b3c2b3b2e1a50010e0c000650291a4f010c00025029643b2d2b6a2706020130293131312e316806220f3622103822102b2d2c6b220e35220f3622103722113822123922133a1a1f012d2b221a22142212222868071a18012c2b6a30353c1aaf000c00030359303631382a3b1ab1000e0e0c00032a3b1aa7000c0003293b1a9f000c0003293b1ab7000c000303051ab70002242928403b1ab6000e0e0e0c00042b3c2b3b2e1ab0000e0c000650291aaf000c00025029643b2d2b6a2706020130293131312e3168063c22206934221b2b2d221c680522233c1a9d000e0e0c000322262b69292225692b2a6927291f040e0000000000000000a8010000000000000000000000000000|@11165,I251,@2288,I253,@1792,@11166,@11168,I113,I49,I11,I195,I47,@11169,@11164,I106| 11164:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11165:S66|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e64283229 11166:D7,136|00802b56191a88000e0c0003030a2b56172c0e0e0e8000022b56191a7a000e0e0e0c000356182a2a1a75000e0e0c00021a75000e0e0c000203043b5002041a6f00102a352b362b3b1a6d000e0e0c000303032a02172b3c1a3e000e0e0e0c00032a2a2505250526031e413b642705420e000000000000000078000000000000000000000000000000|@11167,I234,I107,I105,I218,@611,I113| 11167:S75|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e642832296e65774d6170283129 11168:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11169:D11,360|00802b56181a68010e0c000303562b56181a64010e0c000356172a2a1a61010e0e0c00021a61010e0e0c000203043b5002041a5b01102a352b362b3b1a59010e0e0c000303032a02172b3c1a2a010e0e0e0c00032a2a2505250526031e413b6427050fcb2b561b1a06010e0e0e0c000303cf2b561b1a00010e0c0003040300562a2b2a1afa000e0e0e0c00021af9000e0e0c000203043b5002041af300102a352b362b3b1af1000e0e0c0003030e2a2e2a35452a36462a37475102132b3c1ab7000c00032a2a2505250526031e4a50260429352a362b3729352a362b3756891abe001ac3000c000303033c022a56891a8e000e0e0e0c00021a8d000e0e0c0002031456893b1a98003b28081aa2000e0e0e0c000602013b03032b02195689282e1a95000e0e0c0003292d1a8b00020217000c000364292c2c6a30302b6a270a02072b561c2c800002420e0e0e0e0e0e0e000000000000000058010000000000000000000000000000|@11167,I231,I107,I105,I218,@611,I113,I48,I251,I154,@122| 11170:O4|@14322,@596,@8625,@11171 11171:O5|@8409,3162,0,3162,0 11172:D9,120|00802b56191a78000e0c0003030a2b56172c0e0e0e8000022b56191a6a000e0e0e0c0003291a68000e0c00021a69000e0e0c000203033c021456181a62000e0e0e0c00022a2a1a5f000c00036403041a5e00103b5056182a1a5d002e7e040003000000000000000068000000000000000000000000000000|@11173,I234,I107,I105,I218,I15,I247,@599,I253| 11173:S58|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296d617054797065496473283129 11174:D8,328|00842d352e3629352a362b372c382d392e3a220e353b1a37010c00030352220e37293b1a32010e0e0e0c000329220f2a1a2d010e0e0c00021a2d010e0e0c000203202a352b362a2c221222161a21010e0e0c00052a2a2505250526031e2d3b66020a2922102a35452a364664270402bc220e353c1ad9000e0e0c00030352220e3629220e2a1ad8000e0c00021ad9000e0e0c0002032d2a352b360402002b22142e2c22141ad1000e0e0c00065029352a362a2a692d2a2508250826061e383b2706020a29220f2a35452a36466466025c220e37312b690402002b2b2a1a81000e0e0c00021a81000e0e0c000203202a352b362a2c221322171a85000e0e0c00052a2a2505250526031e2d26030209292c2a35452a3646515129352a3633333333332e680622112c452a46270627081f05000000000000000038010000000000000000000000000000|@11176,I251,I253,I105,I218,@11177,@11150,@11175| 11175:O1|@11195 11176:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374537472756374283329 11177:O1|@11178 11178:D21,752|00832e353d1af0020e0c000307cf2e3629352a363035313629352a362b372c382d392e3a303b69040200332b2a1ad0020e0c00021ad1020e0e0c000203742a352b362a352b362c382d392f353036221a353d1aa3020c0003030c221a2b3b1aaf020c000402072806221b2c3b6b3c2a6930302b31313b3b68072d3c1a9a020e0e0e0c00032a3b69293b1a6c020e0c000303032e020b2e2a1a86020e0e0e0c00032b2a69220d2a25112511260f1e80260f0209292c2a35452a3646515129352a36220d2a692922131a5e021a63020c0004220f350402002a2a1a5d02020223000e0e0c0003502936292d6929220f6922102a22102210221022106806322a6927170fdb2e353b1af0010e0c000303292e362f372a2a693035313629352a362b372c382d392e3a312f69292f2f2f2f2f6806322a69270d0fdb2e353c1abb010c000307d72e362e352f3629352a362b372c382d392e3a313729352a362b382c391adf012a22126a2d353c1a8d010e0e0c000303592d362e382a3b1acd010e0e0c00032a3b1ac3010c0003293b1abb010c0003293b1abb010c000303051abb0102242928403b1aba010e0e0e0c00042b3c2b3b2e1ab4010e0c000650291ab3010c00025029643b2d2b6a270602012d292e3b2f2e3b68062210352215353d0202f2001a16010e0e0e0c00030310221522113b1a1e010e0e0e0c000402082806221622123b6b3c2a692213382c2b2f2c6b22143c0202bd001a0101020220000e0e0c00032e2b6929221069221522152215221522152e68062c2a69271a02962e3629352a362b372c382d393335343629352a362b372c382d392e3a33353e1a9b000c000303033302242211353d1a8c000e0c0003030c2211313b1a97000c0004020728062212323b6b3c2a69641aec002212691aee002a69220c1aef002b1af3000c0004221022102e2c22103b3b6807220c3c1a66000e0e0e0c000322122b69293469220d220d2b220d220d220d68062c2a6927171f040e0e0e0e0e0000000000000000e0020000000000000000000000000000|@11180,I251,I105,I218,@2288,I106,@11181,I48,@7224,@1357,@11183,I253,I113,I49,I11,I195,I47,@11184,@11186,@11179,@1416| 11179:O1|@11193 11180:S56|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296d616b6544656373283229 11181:O1|@11182 11182:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@11181| 11183:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11184:D2,64|00802b3629353b1a3e000e0e0e0c0003031029382956370e0e0c00022968016502013b64420e0e0e000000000000000030000000000000000000000000000000|@11185,I251| 11185:S69|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129636f70794964283129 11186:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@11188,@11189,@11187,@1551| 11187:O1|@11192 11188:S81|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129 11189:O1|@11190 11190:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11191| 11191:S84|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129283129 11192:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11191| 11193:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11194| 11194:S63|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129283129 11195:D12,264|00832e352f3630383035313631353d1afe000e0e0e0c0003030c312b3b1af8000e0c000402062806322c3b6b2c3b1aef000c0003293b1ad7000c000303041ae700103b502935293729352a362b382c391add002a22116a2d353c1ab3000c000303592d362e382a3b1ab5000e0e0c00032a3b1aab000c0003293b1aa3000c0003293b1ab3000c000303051ab30002242928403b1ab2000e0e0e0c00042b3c2b3b2e1aac000e0c000650291aab000c00025029643b2d2b6a270602012d292e3b2f2e3b6806220c3c1a96000e0e0e0c00033b221169293b693c220e6922122a2f2d6b22132a69292212692f2a6927171f040000000000000000f8000000000000000000000000000000|@11197,I251,@2288,I253,@1792,@11196,I113,I49,I11,I195,I47,I106| 11196:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11197:S68|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296578747261637453747275637475726542696e64283229 11198:D5,80|00812c1a52000e0e0e0c00021a51000e0e0c0002031e2c352d362a352a2a1a47000c00032c30692a2a1a4400320e0e0e7e0900032b430e0e000000000000000040000000000000000000000000000000|@11200,I105,I218,@11199,@11140| 11199:O1|@11201 11200:S41|535452554354555245535f28292e70617373345374727563747328322972657646696c746572283229 11201:D8,184|00812c1aba000e0e0e0c00021ab9000e0e0c000203852c352d362a352e2a1aaf000c000303033c024a2e1a93000c00021a95000e0e0c00020314291a82000e0e0e0c00021a81000e0e0c000202013b03212e3b2b3b28082e1a7d000e0e0c00021a7d000e0e0c00031a7d000e0e0c000602013b1a52000e0e0e0c000264030f292e1a6c000e0c00032b2a6964020a292e1a5d002f7e0600036502013b430e0e0e0000000000000000a8000000000000000000000000000000|@283,I105,I218,I251,I223,I239,I154,@11199| 11202:O1|@11203 11203:D26,776|00811a0b033b1a0f030c0003291a10031a15030e0e0c0003502c3c1afa020e0e0e0c00031ae9023b1aed020e0e0c0003292b1af3020c0003503c28403b1af0020e0c0004293b1aef021af4020e0c0004502f1af3020c0002293f1af3020c00036403033b02362f3e1aad020e0e0c0003291ae4020e0c00021ae5020e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64293b1ac7020c000303043b5002b6293529352a372a1abc021ab1020e0e0c000303033c02222a1a93020c00021a95020e0e0c000203102a3b1a99023b28081a9b020c000602013b03043b50022d1a24023b1a28020e0c0003291a88021a2d020e0e0c0003501a0c023b1a10020e0c0003292d1a17020c00032603293b1a6d020e0e0c000303043b5002381ae7013b1aeb010c0003291a5c021af1010e0e0c0003502a3c1a56020e0e0e0c00031ac5013b1ac9010e0e0c0003292b1acf010c0003260426031aad013b1ab1010e0e0c0003291a30021ab5010e0e0c00035032291ada010e0e0e0c00021ad9010e0e0c0002033629352a361a7b013b1a7f010c0003292c1a87010c0003501a68013b1a6c010e0c000329401a73010c0003502b250526041e44260402023b50501a46013b1a4a010e0e0e0c0003291ad0011a4d010e0e0c0003501a2c013b1a30010e0c000329392a1abe012b1ac2010e0e0e0c0004503c28403b1a2c010e0c0004293b1a2b011a30010e0c000450220c1a2e010e0e0e0c0002293f1a2b010c00036403033b0236220c3e1ae4000e0c0003291a1c010e0c00021a1d010e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291af0000e0c00021af1000e0e0c000203043b500212220d35220e36220f372b2b2b1a37016b6610293529352a362b372c382d393c28403b1a91000e0e0c0004293b1a1f011a94000e0c00045022143b1a61000e0e0c000322153c1a56000e0e0e0c000322163d1a4a000e0e0e0c000331302f333268052c2c2c2c6b291aec00221a0e0e7d1b00020e0e0e0e0000000000000000f8020000000000000000000000000000|@11205,@14558,I253,@11206,@66,I11,@228,I255,I15,I250,I105,I218,I251,I48,I154,@11207,I113,@11208,@243,@11209,@11204,@190,@12,@257,@226,I14| 11204:S14|456e64206f662074726163650a0a 11205:S30|506f6c794d4c2e457863657074696f6e2e7072696e745472616365283229 11206:S32|457863657074696f6e20747261636520666f7220657863657074696f6e202d20 11207:S11|2072616973656420696e20 11208:S6|206c696e6520 11209:S2|0a0a 11210:O2|3,@11211 11211:S24|436f6d70696c6174696f6e20696e7465727275707465640a 11212:O4|1,@207,0,@11213 11213:O5|@11214,220,0,220,0 11214:S36|6d6c736f757263652f4d4c436f6d70696c65722f434f4d50494c45525f424f44592e4d4c 11215:S26|457863657074696f6e2d20496e7465726e616c4572726f723a20 11216:S23|20726169736564207768696c6520636f6d70696c696e67 11217:O5|@11214,229,0,229,0 11218:S11|457863657074696f6e2d20 11219:S36|20756e65787065637465646c7920726169736564207768696c6520636f6d70696c696e67 11220:O3|3,@11243,@428 11221:O3|3,@11222,@1827 11222:O2|@11224,@11223 11223:O2|@11226,@11225 11224:O2|49,@1847 11225:O2|@11231,0 11226:O2|50,@11227 11227:O3|2,@956,@11228 11228:O5|5,@11229,@1988,@1845,@423 11229:O2|@11230,0 11230:O5|5,0,@1692,@1690,0 11231:O2|51,@11232 11232:O5|5,@11233,@1028,@1026,@423 11233:O2|@11234,0 11234:O5|5,0,@11236,@11235,@423 11235:O3|@11236,@423,@11237 11236:S9|756e6976657273616c 11237:O3|@11239,@11242,@11238 11238:O3|@11236,@450,@449 11239:O2|1,@11240 11240:O3|2,@11241,0 11241:O4|0,@14483,3,1 11242:O4|1,@14484,0,0 11243:O2|@11245,@11244 11244:O2|@11248,0 11245:O2|49,@11246 11246:O5|5,@11247,@1988,@1845,@423 11247:O2|@1250,0 11248:O2|50,@11249 11249:O5|5,@11250,@1988,@1845,@423 11250:O2|@11251,0 11251:O3|2,@956,@11252 11252:O3|3,@11254,@11253 11253:O3|0,@11272,1 11254:O2|@11256,@11255 11255:O2|@11259,@11258 11256:O2|@11257,@1860 11257:S5|6669786573 11258:O2|@11262,@11261 11259:O2|@11260,@1921 11260:S5|7479706573 11261:O2|@11265,@11264 11262:O2|@11263,@1901 11263:S6|76616c756573 11264:O2|@11268,@11267 11265:O2|@11266,@1931 11266:S8|66756e63746f7273 11267:O2|@11270,0 11268:O2|@11269,@1881 11269:S10|7369676e617475726573 11270:O2|@11271,@1963 11271:S10|73747275637475726573 11272:O2|@11257,@11273 11273:O2|@11260,@11274 11274:O2|@11263,@11275 11275:O2|@11266,@11276 11276:O2|@11269,@11277 11277:O2|@11271,0 11278:O2|@11280,@11279 11279:O2|@11281,0 11280:S13|50546e6578745369626c696e67 11281:O4|@14310,69,@11282,0 11282:O7|@11280,@704,@11283,@1233,@423,0,0 11283:O2|1,@11284 11284:O3|14,@11285,0 11285:O2|@11287,@11286 11286:O2|@11291,@11290 11287:O2|7,@11288 11288:O8|@11289,@11280,0,0,@470,0,0,1 11289:O4|13,5,@712,13 11290:O2|@11295,0 11291:O2|7,@11292 11292:O8|@11293,@11280,0,0,@470,0,0,1 11293:O3|14,@11294,1 11294:O2|@10415,@718 11295:O2|7,@11296 11296:O8|@722,@11280,0,0,@470,0,0,1 11297:O2|@11299,@11298 11298:O2|@11300,0 11299:S17|4465627567676572496e74657266616365 11300:O4|@14325,69,@11301,0 11301:O4|@11299,@694,@11302,@423 11302:O6|@11304,I48,0,@423,@11303,0 11303:O1|@11960 11304:O4|1,@14486,@14487,@14485 11305:O2|@406,40 11306:O2|@11898,@11897 11307:O2|@11309,@11308 11308:O2|@11310,0 11309:S9|456e76547970656964 11310:O4|@14310,69,@11311,0 11311:O7|@11309,@11313,@11314,@11312,@423,0,0 11312:O3|2,@11332,@11331 11313:O2|0,8 11314:O2|1,@11315 11315:O3|14,@11316,0 11316:O2|@11318,@11317 11317:O2|@11322,@11321 11318:O2|7,@11319 11319:O8|@11320,@11309,0,0,@470,0,0,1 11320:O4|13,5,@712,7 11321:O2|@11329,0 11322:O2|7,@11323 11323:O8|@11324,@11309,0,0,@470,0,0,1 11324:O4|3,@551,@11325,1 11325:O2|7,@11326 11326:O8|@11327,@1004,0,0,@470,0,0,1 11327:O3|14,@11328,1 11328:O2|@10415,@1007 11329:O2|7,@11330 11330:O8|@1013,@11309,0,0,@470,0,0,1 11331:O5|5,0,@11348,@11347,@423 11332:O3|3,@11333,@428 11333:O2|@11335,@11334 11334:O2|@11346,0 11335:O2|49,@11336 11336:O5|5,0,@11338,@11337,@423 11337:O3|@11338,@423,@11339 11338:S6|747970654964 11339:O3|@11341,@11344,@11340 11340:O3|@11345,@450,@449 11341:O2|1,@11342 11342:O3|2,@11343,0 11343:O4|0,@14489,3,1 11344:O4|1,@14490,0,0 11345:S31|506f6c794d4c2e4465627567676572496e746572666163652e747970654964 11346:O2|50,@11336 11347:O3|@11348,@423,@11349 11348:S12|656e7669726f6e456e747279 11349:O3|@11351,@11354,@11350 11350:O3|@11355,@450,@449 11351:O2|1,@11352 11352:O3|2,@11353,0 11353:O4|0,@14491,3,1 11354:O4|1,@14492,0,0 11355:S37|506f6c794d4c2e4465627567676572496e746572666163652e656e7669726f6e456e747279 11356:O2|@11358,@11357 11357:O2|@11359,0 11358:S14|456e76456e6446756e6374696f6e 11359:O4|@14310,69,@11360,0 11360:O7|@11358,@11313,@11362,@11361,@423,0,0 11361:O3|2,@11389,@11331 11362:O2|1,@11363 11363:O3|14,@11364,0 11364:O2|@11366,@11365 11365:O2|@11370,@11369 11366:O2|7,@11367 11367:O8|@11368,@11358,0,0,@470,0,0,1 11368:O4|13,0,@712,7 11369:O2|@11380,0 11370:O2|7,@11371 11371:O8|@11372,@11358,0,0,@470,0,0,1 11372:O4|3,@551,@11373,1 11373:O2|7,@11374 11374:O8|@11375,@1004,0,0,@470,0,0,1 11375:O3|14,@11376,1 11376:O2|@542,@11377 11377:O2|@712,@11378 11378:O2|@1010,@11379 11379:O2|@5723,0 11380:O2|7,@11381 11381:O8|@11382,@11358,0,0,@470,0,0,1 11382:O4|3,@551,@11383,1 11383:O2|7,@11384 11384:O8|@11385,@1004,0,0,@470,0,0,1 11385:O3|14,@11386,0 11386:O2|@722,@11387 11387:O2|@1019,@11388 11388:O2|@5754,0 11389:O3|3,@11390,@1827 11390:O2|@1865,@11391 11391:O2|@11393,@11392 11392:O2|@11394,0 11393:O2|50,@724 11394:O2|51,@11395 11395:O5|5,0,@11397,@11396,@423 11396:O3|@11397,@423,@11398 11397:S9|6c6f63616c54797065 11398:O3|@11400,@11403,@11399 11399:O3|@11404,@450,@449 11400:O2|1,@11401 11401:O3|2,@11402,0 11402:O4|0,@14493,3,1 11403:O4|1,@14494,0,0 11404:S34|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065 11405:O2|@11407,@11406 11406:O2|@11408,0 11407:S10|64656275675374617465 11408:O4|@14314,69,@11409,0 11409:O2|@11410,0 11410:O3|@11407,@423,@11411 11411:O3|@694,@11413,@11412 11412:O3|@11435,@450,@449 11413:O3|2,0,@11414 11414:O3|3,@11415,@1827 11415:O2|@11417,@11416 11416:O2|@11421,@11420 11417:O2|49,@11418 11418:O5|5,@11419,@1028,@1026,@423 11419:O2|@11331,0 11420:O2|@11434,0 11421:O2|50,@11422 11422:O5|5,@11423,@1028,@1026,@423 11423:O2|@11424,0 11424:O5|5,0,@11426,@11425,@423 11425:O3|@11426,@423,@11427 11426:S11|6d616368696e65576f7264 11427:O3|@11429,@11432,@11428 11428:O3|@11433,@450,@449 11429:O2|1,@11430 11430:O3|2,@11431,0 11431:O4|0,@14495,3,1 11432:O4|1,@14496,0,0 11433:S36|506f6c794d4c2e4465627567676572496e746572666163652e6d616368696e65576f7264 11434:O2|51,@724 11435:S35|506f6c794d4c2e4465627567676572496e746572666163652e64656275675374617465 11436:O2|@11438,@11437 11437:O2|@11439,0 11438:S9|6d616b6556616c7565 11439:O4|@14310,69,@11440,0 11440:O7|@11438,2,@11442,@11441,@423,0,0 11441:O3|2,@11483,@11482 11442:O2|1,@11443 11443:O3|2,@11444,0 11444:O1|@11445 11445:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11447,@11446| 11446:D5,80|00802b352c362d372e381a4b005657691a4d002a692d1a4f002b1a53000c00043d2d3b6a3c2a69313d2b2e333b3b68072709420e0e0e0e0e000000000000000040000000000000000000000000000000|@11449,@11450,@11474,@11448,@1416| 11447:S24|44454255474745525f28292e6d616b6556616c7565283129 11448:O1|@11481 11449:S27|44454255474745525f28292e6d616b6556616c7565283129283129 11450:D3,96|00802b3529353c1a5e000e0e0e0c000303112c3629353c1a4e000e0e0e0c00036402013b6403033b02162b5617355627365637371a39000e0e0c000529680164420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@11452,I251,@11451| 11451:O1|@11453 11452:S35|44454255474745525f28292e72756e54696d6554797065283229636f70794964283129 11453:D22,576|00831a43022f692e2e2b1a43020c0004293b1a43020c000307d3303629353c1a36020e0e0e0c000307d4293732373b1a2e020e0e0e0c00023d1a2c021a31020e0e0c00031a31021a36023b2d2d3c3b3c680828072a691a2f021a34020e0c00023e2a1a33023c6b291a3502692c2a69280e2a3b6a2a1a30020e0c00021a31020e0e0c00021a29020e0e0c0002030c291a26020e0e0e0c00020201293c2a6922153629353d1ab1010e0e0c000303041a0f02103b5029353b1a9e010e0e0e0c00030322293729353c1a8e010e0e0e0c0003030d2936293b1aef010c000364020229366402112936293b1add0102022d010e0e0c0003643c28402b1ad401020213000e0c00043c2a22113b6b2d2a22116a27110fce29353b1a3f010c000307d4293632373b1a3a010e0e0e0c00023d1aa8011a3d010e0e0c00031a3d011a42013b2d2d3c3b3c680828072a691a93011a40010e0c00023e2a1a3f013c6b291a4101692c2a69280e2a3b6a2a1a3c010e0c00021a3d010e0e0c00021a35010e0e0c0002030c291a32010e0e0e0c00020201293c2a6922153629353d1abd000e0e0c000303041a1b01103b5029353b1aaa000e0e0e0c00030322293729353c1a9a000e0e0e0c0003030d2936293b1afb000c000364020229366402112936293b1ae900020236000e0e0c0003643c28402b1ae000020213000e0c00043c2a22113b6b2d2a22116a2711021229362a3733373d2c2c6a1ad4002a2c6a27046402022935651f040e0e0e0e0e0e0e000000000000000030020000000000000000000000000000|@11455,@11456,@11465,I251,@2332,@11468,@1385,@475,@6865,@11454,@2273,@6867,@6861,I105,I218,@2349,@1377,I253,I11,@11470,@11454,@694| 11454:O2|@475,@11472 11455:S25|44454255474745525f28292e73656172636854797065283429 11456:D2,48|00802b352c3656271a2d002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@11458,@11457| 11457:O1|@11459 11458:S33|44454255474745525f28292e736561726368547970652834296d61746368283129 11459:D4,208|00822d3528051acf000c000303a82d362e37293629353c1abe000e0e0e0c000303112e3629353c1aae000e0e0e0c00036402013b640315293629362f3629362b2a1a94000e0c000327040239293629353b1a84000e0c000303112e3629353b1a76000e0e0e0c00036402013b640315293629382f3629382b2a1a64000e0c0003270402013b032b2a3629353c1a49000e0e0c000303043b5002041a4b00102b373d313b6a3c2a69292d2d6a296801270502013b6502013b440000000000000000c0000000000000000000000000000000|@11461,I251,I113,@11460| 11460:O4|@14322,@596,@11463,@11462 11461:S33|44454255474745525f28292e736561726368547970652834296d61746368283229 11462:O5|@11464,160,0,160,0 11463:S24|736561726368547970653a205479706546756e6374696f6e 11464:S33|6d6c736f757263652f4d4c436f6d70696c65722f44454255474745525f2e736d6c 11465:O1|@11466 11466:D5,232|00822d1aea000e0e0e0c00021ae9000e0e0c000203142c1ad6000e0e0e0c00021ad5000e0e0c000202013b039f2d352e362e352f362c2b69300c0002293b1abf000c0003037c2d350a07002d005100390045001f00100069005d002c2b321aa700330e7b050a000402562c32321a9800330e0e7b050a00042c2b321a8a00337b050a00042c2b321a7e00337b050a00042c2b321a7200337b050a00042c2b321a6600337b050a00042c2b321a5a00337b050a00042c2b321a4e00337b050a00040206293529680164270502013b440e0e0000000000000000d8000000000000000000000000000000|@11467,I105,I218,I251,@11465| 11467:S25|44454255474745525f28292e736561726368456e7673283329 11468:O1|@11469 11469:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11470:O1|@11471 11471:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@2339,@474| 11472:O2|@6866,@11473 11473:O2|@2271,0 11474:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@11476,@11477,@11475,@1551| 11475:O1|@11480 11476:S29|44454255474745525f28292e72756e54696d6554797065283229283129 11477:O1|@11478 11478:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11479:S32|44454255474745525f28292e72756e54696d6554797065283229283129283129 11480:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11481:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11476| 11482:O3|2,@11484,@1907 11483:O5|5,0,@11407,@11410,@423 11484:O3|3,@11485,@5758 11485:O2|@1865,@11486 11486:O2|@11488,@11487 11487:O2|@11490,@11489 11488:O2|50,@11395 11489:O2|@11501,0 11490:O2|51,@11491 11491:O5|5,0,@11493,@11492,@423 11492:O3|@11493,@423,@11494 11493:S16|6c6f636174696f6e50726f704c697374 11494:O3|@11496,@11499,@11495 11495:O3|@11500,@450,@449 11496:O2|1,@11497 11497:O3|2,@11498,0 11498:O4|0,@14497,3,1 11499:O4|1,@14498,0,0 11500:S41|506f6c794d4c2e4465627567676572496e746572666163652e6c6f636174696f6e50726f704c697374 11501:O2|52,@11424 11502:O2|@11504,@11503 11503:O2|@11505,0 11504:S12|456e76457863657074696f6e 11505:O4|@14310,69,@11506,0 11506:O7|@11504,@11313,@11508,@11507,@423,0,0 11507:O3|2,@11525,@11331 11508:O2|1,@11509 11509:O3|14,@11510,0 11510:O2|@11512,@11511 11511:O2|@11516,@11515 11512:O2|7,@11513 11513:O8|@11514,@11504,0,0,@470,0,0,1 11514:O4|13,1,@712,7 11515:O2|@11523,0 11516:O2|7,@11517 11517:O8|@11518,@11504,0,0,@470,0,0,1 11518:O4|3,@551,@11519,1 11519:O2|7,@11520 11520:O8|@11521,@1004,0,0,@470,0,0,1 11521:O3|14,@11522,1 11522:O2|@475,@11377 11523:O2|7,@11524 11524:O8|@11382,@11504,0,0,@470,0,0,1 11525:O3|3,@11526,@1827 11526:O2|@1865,@11527 11527:O2|@11488,@11528 11528:O2|@11490,0 11529:O2|@11531,@11530 11530:O2|@11532,0 11531:S9|7365744f6e45786974 11532:O4|@14310,69,@11533,0 11533:O7|@11531,2,@11535,@11534,@423,0,0 11534:O3|2,@11545,@956 11535:O2|1,@11536 11536:O3|2,@11537,0 11537:O2|@11538,@14479 11538:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203172b351a55002a6956273b2b1a54000e0c0004503b65020d56073b3b1a44000e0c0004503b420e0e0e0e0e000000000000000048000000000000000000000000000000|@11540,I105,I218,@11539,I255| 11539:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@11542,@11541| 11540:S24|44454255474745525f28292e7365744f6e45786974283129 11541:O1|@11543 11542:S22|44454255474745525f28292e77726170283129283129 11543:D13,424|00811aab010c00012928051aaa010e0e0e0c00032a28061a9e010e0e0e0c00032b28071a92010e0e0e0c00032c28081a86010e0e0e0c000378810733330c000209d000ff6d2e28052f1a74010e0c0004502e28062e1a68010e0c0004502e28072d1a5c010e0c0004502e28082c1a50010e0c0004503c28403b1a4c010e0c0004293b1a4b011a38010e0c0004502a1a47010c0002293f1a47010c00036403033b02362a3e1a11010e0e0c0003291a38010e0c00021a39010e0e0c0002031829352a362b372c382d392d2b2e2c2f6805296801270602013b64291a0c010e0c00021a0d010e0e0c000203043b50020f2b352c362d372b2b2b1afe006b6610293529352a362b372c382d393c28403b1ab800020242000e0c0004293b1ae3001aa0000e0c000450323b1a8e000e0e0e0c0003333c1a83000c0003343d1a7b000c000331302f333268052c2c2c2c6b291ab8000e0c0002270f502d28052e1a62000e0e0e0c0004502d28062d1a54000e0c0004502d28072c1a48000e0c0004502d28082b1a3c00330e0e7b050900040e0e0e0e000000000000000098010000000000000000000000000000|@11544,I72,I253,I255,I11,@228,I15,I250,I105,I218,@257,@226,I14| 11544:S19|44454255474745525f28292e77726170283229 11545:O5|5,@11546,@1988,@1845,@423 11546:O2|@11547,0 11547:O3|2,@11548,@956 11548:O3|3,@11549,@428 11549:O2|@1865,@11550 11550:O2|@11393,0 11551:O2|@11553,@11552 11552:O2|@11554,0 11553:S14|6d616b6554797065436f6e737472 11554:O4|@14310,69,@11555,0 11555:O7|@11553,2,@11557,@11556,@423,0,0 11556:O3|2,@11483,@11564 11557:O2|1,@11558 11558:O3|2,@11559,0 11559:O1|@11560 11560:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11562,@11561| 11561:D2,64|00802b352937295637355647365657371a35000e0e0c00052b352c362a2a2d6a293b692706420e0e000000000000000030000000000000000000000000000000|@11563,@11451| 11562:S29|44454255474745525f28292e6d616b6554797065436f6e737472283129 11563:S32|44454255474745525f28292e6d616b6554797065436f6e737472283129283129 11564:O3|2,@11565,@1831 11565:O5|5,0,@11567,@11566,@423 11566:O3|@11567,@423,@11568 11567:S15|6c6f63616c54797065436f6e737472 11568:O3|@11570,@11573,@11569 11569:O3|@11574,@450,@449 11570:O2|1,@11571 11571:O3|2,@11572,0 11572:O4|0,@14499,3,1 11573:O4|1,@14500,0,0 11574:S40|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065436f6e737472 11575:O2|@11577,@11576 11576:O2|@11578,0 11577:S13|6d616b65457863657074696f6e 11578:O4|@14310,69,@11579,0 11579:O7|@11577,2,@11580,@11441,@423,0,0 11580:O2|1,@11581 11581:O3|2,@11582,0 11582:O1|@11583 11583:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11585,@11584| 11584:D5,80|00802b352c362d372e381a4b005657691a4d002a692d1a4f002b1a53000c00043d2d3b6a3c2a69313b2b2e333b3b68072709420e0e0e0e0e000000000000000040000000000000000000000000000000|@11587,@11588,@11589,@11586,@1416| 11585:S28|44454255474745525f28292e6d616b65457863657074696f6e283129 11586:O1|@11594 11587:S31|44454255474745525f28292e6d616b65457863657074696f6e283129283129 11588:D3,96|00802b3529353c1a5e000e0e0e0c000303112c3629353c1a4e000e0e0e0c00036402013b6403033b02162b5617355627365637371a39000e0e0c000529680164420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@11452,I251,@11451| 11589:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@11476,@11591,@11590,@1551| 11590:O1|@11593 11591:O1|@11592 11592:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11593:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11594:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11476| 11595:O2|@11597,@11596 11596:O2|@11598,0 11597:S8|6c6f63616c536967 11598:O4|@14314,69,@11599,0 11599:O2|@11600,0 11600:O3|@11597,@423,@11601 11601:O3|@11603,@11606,@11602 11602:O3|@11607,@450,@449 11603:O2|1,@11604 11604:O3|2,@11605,0 11605:O4|0,@14501,3,1 11606:O4|1,@14502,0,0 11607:S33|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c536967 11608:O2|@11610,@11609 11609:O2|@11611,0 11610:S13|6d616b65537472756374757265 11611:O4|@14310,69,@11612,0 11612:O7|@11610,2,@11614,@11613,@423,0,0 11613:O3|2,@11483,@11628 11614:O2|1,@11615 11615:O3|2,@11616,0 11616:O1|@11617 11617:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11619,@11618| 11618:D2,48|00802b352c362d372e3856471a2900300e0e0e7b07030006000000000000000020000000000000000000000000000000|@11621,@11620| 11619:S28|44454255474745525f28292e6d616b65537472756374757265283129 11620:O1|@11622 11621:S31|44454255474745525f28292e6d616b65537472756374757265283129283129 11622:D10,176|00842e352f3630383139323a1aa90031691aac002c2b6a2f353c1aab000c000303592f3630382a3b1aa5000e0e0c00032a3b1a9b000c0003293b1a93000c0003293b1a93000c000303051a930002242928403b1a92000e0e0e0c00042b3c2b3b2e1a8c000e0c000650291a8b000c00025029643b2d2b6a270602012f29303b312e3168063d220d3b6a3c2a6922112a2d22126b270b1f050e0000000000000000a0000000000000000000000000000000|@11624,@11625,@11623,I251,I253,I113,I49,I11,I195,I47| 11623:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@1644,@1643| 11624:S28|44454255474745525f28292e6d616b65537472756374757265283529 11625:D5,64|00803b3b1a41002e3b68051a42002a1a46006a295637355647365657371a4000310e0e7b06050005000000000000000030000000000000000000000000000000|@11627,@473,@694,@11626,@11451| 11626:O3|I48,@450,@449 11627:S40|44454255474745525f28292e6d616b65537472756374757265283529676574467265654964283129 11628:O3|2,@11629,@1969 11629:O3|3,@11630,@5758 11630:O2|@1865,@11631 11631:O2|@11632,@11487 11632:O2|50,@11633 11633:O5|5,0,@11597,@11600,@423 11634:O2|@11636,@11635 11635:O2|@11637,0 11636:S10|7365744f6e456e747279 11637:O4|@14310,69,@11638,0 11638:O7|@11636,2,@11639,@11534,@423,0,0 11639:O2|1,@11640 11640:O3|2,@11641,0 11641:O2|@11642,@14481 11642:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203172b351a55002a6956273b2b1a54000e0c0004503b65020d56073b3b1a44000e0c0004503b420e0e0e0e0e000000000000000048000000000000000000000000000000|@11644,I105,I218,@11643,I255| 11643:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@11542,@11541| 11644:S25|44454255474745525f28292e7365744f6e456e747279283129 11645:O2|@11647,@11646 11646:O2|@11648,0 11647:S12|456e76537472756374757265 11648:O4|@14310,69,@11649,0 11649:O7|@11647,@11313,@11651,@11650,@423,0,0 11650:O3|2,@11668,@11331 11651:O2|1,@11652 11652:O3|14,@11653,0 11653:O2|@11655,@11654 11654:O2|@11659,@11658 11655:O2|7,@11656 11656:O8|@11657,@11647,0,0,@470,0,0,1 11657:O4|13,3,@712,7 11658:O2|@11666,0 11659:O2|7,@11660 11660:O8|@11661,@11647,0,0,@470,0,0,1 11661:O4|3,@551,@11662,1 11662:O2|7,@11663 11663:O8|@11664,@1004,0,0,@470,0,0,1 11664:O3|14,@11665,1 11665:O2|@808,@11377 11666:O2|7,@11667 11667:O8|@11382,@11647,0,0,@470,0,0,1 11668:O3|3,@11669,@1827 11669:O2|@1865,@11670 11670:O2|@11632,@11528 11671:O2|@11567,@11672 11672:O2|@11673,0 11673:O4|@14314,69,@11674,0 11674:O2|@11566,0 11675:O2|@11677,@11676 11676:O2|@11678,0 11677:S9|756e697456616c7565 11678:O4|@14310,69,@11679,0 11679:O7|@11677,2,@11680,@1907,@423,0,0 11680:O2|1,@11681 11681:O3|2,@11682,0 11682:O7|I48,2,@694,@956,0,0,0 11683:O2|@11348,@11684 11684:O2|@11685,0 11685:O4|@14314,69,@11686,0 11686:O2|@11347,@11687 11687:O2|@11360,@11688 11688:O2|@11506,@11689 11689:O2|@11691,@11690 11690:O2|@11649,@11710 11691:O7|@11693,@11313,@11692,@11361,@423,0,0 11692:O2|1,@11694 11693:S16|456e76537461727446756e6374696f6e 11694:O3|14,@11695,0 11695:O2|@11697,@11696 11696:O2|@11701,@11700 11697:O2|7,@11698 11698:O8|@11699,@11693,0,0,@470,0,0,1 11699:O4|13,2,@712,7 11700:O2|@11708,0 11701:O2|7,@11702 11702:O8|@11703,@11693,0,0,@470,0,0,1 11703:O4|3,@551,@11704,1 11704:O2|7,@11705 11705:O8|@11706,@1004,0,0,@470,0,0,1 11706:O3|14,@11707,1 11707:O2|@2378,@11377 11708:O2|7,@11709 11709:O8|@11382,@11693,0,0,@470,0,0,1 11710:O2|@11712,@11711 11711:O2|@11311,@11736 11712:O7|@11714,@11313,@11715,@11713,@423,0,0 11713:O3|2,@11732,@11331 11714:S10|456e7654436f6e737472 11715:O2|1,@11716 11716:O3|14,@11717,0 11717:O2|@11719,@11718 11718:O2|@11723,@11722 11719:O2|7,@11720 11720:O8|@11721,@11714,0,0,@470,0,0,1 11721:O4|13,4,@712,7 11722:O2|@11730,0 11723:O2|7,@11724 11724:O8|@11725,@11714,0,0,@470,0,0,1 11725:O4|3,@551,@11726,1 11726:O2|7,@11727 11727:O8|@11728,@1004,0,0,@470,0,0,1 11728:O3|14,@11729,1 11729:O2|@1246,@1007 11730:O2|7,@11731 11731:O8|@1013,@11714,0,0,@470,0,0,1 11732:O3|3,@11733,@428 11733:O2|@1865,@11734 11734:O2|@11735,0 11735:O2|50,@11565 11736:O2|@11738,@11737 11737:O2|@11768,0 11738:O7|@11740,@11313,@11741,@11739,@423,0,0 11739:O3|2,@11753,@11331 11740:S10|456e7656436f6e737472 11741:O2|1,@11742 11742:O3|14,@11743,0 11743:O2|@11745,@11744 11744:O2|@11749,@11748 11745:O2|7,@11746 11746:O8|@11747,@11740,0,0,@470,0,0,1 11747:O4|13,6,@712,7 11748:O2|@11751,0 11749:O2|7,@11750 11750:O8|@716,@11740,0,0,@470,0,0,1 11751:O2|7,@11752 11752:O8|@722,@11740,0,0,@470,0,0,1 11753:O3|3,@11755,@11754 11754:O3|0,@11763,1 11755:O2|@1865,@11756 11756:O2|@11488,@11757 11757:O2|@11759,@11758 11758:O2|@11761,@11760 11759:O2|51,@426 11760:O2|@11762,0 11761:O2|52,@501 11762:O2|53,@11491 11763:O2|49,@11764 11764:O2|50,@11765 11765:O2|51,@11766 11766:O2|52,@11767 11767:O2|53,0 11768:O7|@11770,@11313,@11769,@11507,@423,0,0 11769:O2|1,@11771 11770:S8|456e7656616c7565 11771:O3|14,@11772,0 11772:O2|@11774,@11773 11773:O2|@11778,@11777 11774:O2|7,@11775 11775:O8|@11776,@11770,0,0,@470,0,0,1 11776:O4|13,7,@712,7 11777:O2|@11785,0 11778:O2|7,@11779 11779:O8|@11780,@11770,0,0,@470,0,0,1 11780:O4|3,@551,@11781,1 11781:O2|7,@11782 11782:O8|@11783,@1004,0,0,@470,0,0,1 11783:O3|14,@11784,1 11784:O2|@9362,@11377 11785:O2|7,@11786 11786:O8|@11382,@11770,0,0,@470,0,0,1 11787:O2|@11426,@11788 11788:O2|@11789,0 11789:O4|@14314,69,@11790,0 11790:O2|@11425,0 11791:O2|@11714,@11792 11792:O2|@11793,0 11793:O4|@14310,69,@11712,0 11794:O2|@11338,@11795 11795:O2|@11796,0 11796:O4|@14314,69,@11797,0 11797:O2|@11337,0 11798:O2|@11770,@11799 11799:O2|@11800,0 11800:O4|@14310,69,@11768,0 11801:O2|@11397,@11802 11802:O2|@11803,0 11803:O4|@14314,69,@11804,0 11804:O2|@11396,0 11805:O2|@11807,@11806 11806:O2|@11808,0 11807:S18|6d616b65416e6f6e796d6f757356616c7565 11808:O4|@14310,69,@11809,0 11809:O7|@11807,2,@11811,@11810,@423,0,0 11810:O3|2,@11483,@11826 11811:O2|1,@11812 11812:O3|2,@11813,0 11813:O1|@11814 11814:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11816,@11815| 11815:D6,80|00802b352c361a4f005637691a51002a692c1a53002b1a57000c00043d2d3b6a3c2a691a52003d2b2e3b3b3b68072707420e0e0e0e0e0e0e000000000000000040000000000000000000000000000000|@11818,@11819,@11820,@11817,@1416,I48| 11816:S33|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129 11817:O1|@11825 11818:S36|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129283129 11819:D3,96|00802b3529353c1a5e000e0e0e0c000303112c3629353c1a4e000e0e0e0c00036402013b6403033b02162b5617355627365637371a39000e0e0c000529680164420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@11452,I251,@11451| 11820:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@11476,@11822,@11821,@1551| 11821:O1|@11824 11822:O1|@11823 11823:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11824:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11825:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11476| 11826:O3|2,@11827,@1907 11827:O3|3,@11828,@428 11828:O2|@11830,@11829 11829:O2|@11831,0 11830:O2|49,@11395 11831:O2|50,@11424 11832:O2|@11834,@11833 11833:O2|@11835,0 11834:S18|7365744f6e45786974457863657074696f6e 11835:O4|@14310,69,@11836,0 11836:O7|@11834,2,@11838,@11837,@423,0,0 11837:O3|2,@11846,@956 11838:O2|1,@11839 11839:O3|2,@11840,0 11840:O2|@11841,@14480 11841:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203172b351a55002a6956273b2b1a54000e0c0004503b65020d56073b3b1a44000e0c0004503b420e0e0e0e0e000000000000000048000000000000000000000000000000|@11843,I105,I218,@11842,I255| 11842:D2,40|00802b56170c00021a25002a6964420e000000000000000018000000000000000000000000000000|@11845,@11844| 11843:S33|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129 11844:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@11542,@11541| 11845:S36|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129283129 11846:O5|5,@11847,@1988,@1845,@423 11847:O2|@11848,0 11848:O3|2,@11548,@11849 11849:O3|2,@7393,@956 11850:O2|@11740,@11851 11851:O2|@11852,0 11852:O4|@14310,69,@11738,0 11853:O2|@11493,@11854 11854:O2|@11855,0 11855:O4|@14314,69,@11856,0 11856:O2|@11492,0 11857:O2|@11693,@11858 11858:O2|@11859,0 11859:O4|@14310,69,@11691,0 11860:O2|@11862,@11861 11861:O2|@11863,0 11862:S15|6d616b65436f6e7374727563746f72 11863:O4|@14310,69,@11864,0 11864:O7|@11862,2,@11866,@11865,@423,0,0 11865:O3|2,@11483,@11881 11866:O2|1,@11867 11867:O3|2,@11868,0 11868:O1|@11869 11869:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@11871,@11870| 11870:D5,88|00802b352c362d372e382f39303a1a4f005677691a51002a692f1a53002b1a57000c00043d2d3b6a3c2a69313169342a2c2f343b3b6807270c420e0e0e0e0e0e000000000000000048000000000000000000000000000000|@11873,@11874,@11875,@11872,@1416| 11871:S30|44454255474745525f28292e6d616b65436f6e7374727563746f72283129 11872:O1|@11880 11873:S33|44454255474745525f28292e6d616b65436f6e7374727563746f72283129283129 11874:D3,96|00802b3529353c1a5e000e0e0e0c000303112c3629353c1a4e000e0e0e0c00036402013b6403033b02162b5617355627365637371a39000e0e0c000529680164420e0e0e0e0e0e0e000000000000000050000000000000000000000000000000|@11452,I251,@11451| 11875:D4,64|00800403002c56271a3d001a42003b2e1a45000e0e0c00075029352a362b372b2b2b6a2704420e0e000000000000000030000000000000000000000000000000|@11476,@11877,@11876,@1551| 11876:O1|@11879 11877:O1|@11878 11878:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11879:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11479| 11880:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@11476| 11881:O3|2,@11882,@1907 11882:O3|3,@11884,@11883 11883:O3|0,@11891,1 11884:O2|@1865,@11885 11885:O2|@11488,@11886 11886:O2|@11759,@11887 11887:O2|@11761,@11888 11888:O2|@11762,@11889 11889:O2|@11890,0 11890:O2|54,@11424 11891:O2|49,@11892 11892:O2|50,@11893 11893:O2|51,@11894 11894:O2|52,@11895 11895:O2|53,@11896 11896:O2|54,0 11897:O2|@11899,0 11898:S15|7365744f6e427265616b506f696e74 11899:O4|@14310,69,@11900,0 11900:O7|@11898,2,@11902,@11901,@423,0,0 11901:O3|2,@11908,@956 11902:O2|1,@11903 11903:O3|2,@11904,0 11904:O2|@11905,@14478 11905:D5,88|00802b1a5a000e0e0e0c00021a59000e0e0c000203172b351a55002a6956273b2b1a54000e0c0004503b65020d56073b3b1a44000e0c0004503b420e0e0e0e0e000000000000000048000000000000000000000000000000|@11907,I105,I218,@11906,I255| 11906:D2,40|00802b56171a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@11542,@11541| 11907:S30|44454255474745525f28292e7365744f6e427265616b506f696e74283129 11908:O5|5,@11909,@1988,@1845,@423 11909:O2|@11910,0 11910:O3|2,@11911,@956 11911:O3|3,@11912,@428 11912:O2|@1259,@11913 11913:O2|@11914,0 11914:O2|50,@11915 11915:O5|5,@7198,@7370,@11916,@423 11916:O3|@7370,@423,@11917 11917:O3|@11919,@11959,@11918 11918:O3|@7370,@450,@449 11919:O2|1,@11920 11920:O3|2,@11922,@11921 11921:O2|@11938,0 11922:O4|@11924,@14503,@11933,@11923 11923:O1|@11936 11924:O1|@11925 11925:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@11926,I251| 11926:S11|65712d68656c7065722829 11927:O1|@11928 11928:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@11930,@11929| 11929:O1|@11931 11930:S37|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129 11931:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@11932,@446| 11932:S40|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129283129 11933:O1|@11934 11934:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@11935| 11935:S14|626f7865642d68656c7065722829 11936:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@11937| 11937:S13|73697a652d68656c7065722829 11938:O4|@14321,69,@11939,0 11939:O3|2,4,@11940 11940:O5|@623,@11942,@11958,@11941,@581 11941:O4|@11922,@11924,@11933,@11923 11942:O2|@627,@11943 11943:O2|@11945,@11944 11944:O2|@11949,@11948 11945:O2|@1181,@11946 11946:O3|0,@11947,@609 11947:O8|@535,@11926,0,0,@470,0,0,1 11948:O2|@11952,@11951 11949:O2|@11950,@588 11950:O3|0,@14503,0 11951:O2|@11955,0 11952:O2|@1188,@11953 11953:O3|0,@11954,@609 11954:O8|@2378,@11935,0,0,@470,0,0,1 11955:O2|@1195,@11956 11956:O3|0,@11957,@609 11957:O8|@475,@11937,0,0,@470,0,0,1 11958:O3|2,2,2 11959:O4|1,@14360,1,0 11960:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 11961:O2|@11963,@11962 11962:O2|@11964,0 11963:S10|6d616b65737472696e67 11964:O4|@14310,69,@11965,0 11965:O7|@11963,2,@11967,@11966,@423,0,0 11966:O3|2,@11968,@500 11967:O2|3,5 11968:O3|6,@14504,79993 11969:O2|@11971,@11970 11970:O2|@11972,0 11971:S6|505474797065 11972:O4|@14310,69,@11973,0 11973:O7|@11971,@704,@11975,@11974,@423,0,0 11974:O3|2,@5474,@723 11975:O2|1,@11976 11976:O3|14,@11977,0 11977:O2|@11979,@11978 11978:O2|@11983,@11982 11979:O2|7,@11980 11980:O8|@11981,@11971,0,0,@470,0,0,1 11981:O4|13,13,@712,13 11982:O2|@11988,0 11983:O2|7,@11984 11984:O8|@11985,@11971,0,0,@470,0,0,1 11985:O3|14,@11986,1 11986:O2|@11987,@718 11987:O3|2,13,0 11988:O2|7,@11989 11989:O8|@722,@11971,0,0,@470,0,0,1 11990:O2|@1212,@11991 11991:O2|@11992,0 11992:O4|@14314,69,@11993,0 11993:O2|@1211,@11994 11994:O2|@1159,@11995 11995:O2|@11996,0 11996:O7|@908,@1161,@11998,@11997,@423,0,0 11997:O3|2,@12025,@1210 11998:O2|1,@11999 11999:O3|2,@1201,@12000 12000:O2|@12001,0 12001:O4|@14321,69,@12002,0 12002:O3|2,3,@12003 12003:O6|@607,@583,@12004,@1198,@1175,@581 12004:O2|@627,@12005 12005:O2|@12007,@12006 12006:O2|@12012,@12011 12007:O2|@2489,@12008 12008:O3|0,@12009,@609 12009:O8|@12010,@908,0,0,@794,0,0,1 12010:O4|13,1,@712,1 12011:O2|@12019,0 12012:O2|@12014,@12013 12013:O3|0,@12015,@609 12014:O2|1,@1074 12015:O8|@12016,@908,0,0,@10620,0,2,1 12016:O3|10,@10623,@12017 12017:O3|14,@12018,1 12018:O2|@475,@10625 12019:O2|@1055,@12020 12020:O3|0,@12021,@609 12021:O8|@12022,@908,0,0,@10633,0,2,1 12022:O3|10,@12023,@10635 12023:O2|@5749,@12024 12024:O2|@5751,0 12025:O3|3,@12026,@428 12026:O2|@1865,@12027 12027:O2|@12028,0 12028:O2|50,@500 12029:O2|@1252,@12030 12030:O2|@12031,0 12031:O4|@14314,69,@12032,0 12032:O2|@1251,0 12033:O2|@12035,@12034 12034:O2|@12036,0 12035:S7|50546465664964 12036:O4|@14310,69,@12037,0 12037:O7|@12035,@704,@12038,@969,@423,0,0 12038:O2|1,@12039 12039:O3|14,@12040,0 12040:O2|@12042,@12041 12041:O2|@12046,@12045 12042:O2|7,@12043 12043:O8|@12044,@12035,0,0,@470,0,0,1 12044:O4|13,3,@712,13 12045:O2|@12048,0 12046:O2|7,@12047 12047:O8|@806,@12035,0,0,@470,0,0,1 12048:O2|7,@12049 12049:O8|@722,@12035,0,0,@470,0,0,1 12050:O2|@908,@12051 12051:O2|@12052,0 12052:O4|@14310,69,@11996,0 12053:O2|@12055,@12054 12054:O2|@12056,0 12055:S16|6164645072657474795072696e746572 12056:O4|@14310,69,@12057,0 12057:O7|@12055,2,@12059,@12058,@423,0,0 12058:O3|2,@12060,@956 12059:O2|3,1 12060:O3|2,@501,@12061 12061:O3|2,@12063,@12062 12062:O3|2,@12064,@924 12063:O3|6,@14505,79992 12064:O3|6,@14506,79992 12065:O2|@926,@12066 12066:O2|@12067,0 12067:O4|@14314,69,@12068,0 12068:O2|@925,@12069 12069:O2|@5694,@12070 12070:O2|@12072,@12071 12071:O2|@12097,@12096 12072:O7|@831,@771,@12074,@12073,@423,0,0 12073:O3|2,@12094,@924 12074:O2|1,@12075 12075:O3|2,@827,@12076 12076:O2|@12077,0 12077:O4|@14321,69,@12078,0 12078:O3|2,3,@12079 12079:O6|@607,@583,@12080,@815,@785,@581 12080:O2|@627,@12081 12081:O2|@12083,@12082 12082:O2|@12088,@12087 12083:O2|@2489,@12084 12084:O3|0,@12085,@609 12085:O8|@12086,@831,0,0,@794,0,0,1 12086:O4|13,1,@712,4 12087:O2|@12091,0 12088:O2|@12014,@12089 12089:O3|0,@12090,@609 12090:O8|@12016,@831,0,0,@10620,0,2,1 12091:O2|@1055,@12092 12092:O3|0,@12093,@609 12093:O8|@12022,@831,0,0,@10633,0,2,1 12094:O3|3,@12095,@428 12095:O2|@5761,@5398 12096:O2|@769,@12114 12097:O7|@839,@12099,@12098,@924,@423,0,0 12098:O2|1,@12100 12099:O2|1,5 12100:O3|2,@835,@12101 12101:O2|@12102,0 12102:O4|@14321,69,@12103,0 12103:O3|2,2,@12104 12104:O6|@607,@583,@12105,@815,@785,@581 12105:O2|@627,@12106 12106:O2|@12108,@12107 12107:O2|@12112,0 12108:O2|@1137,@12109 12109:O3|0,@12110,@609 12110:O8|@12111,@839,0,0,@794,0,0,1 12111:O4|13,2,@712,4 12112:O2|@12113,@588 12113:O3|0,@836,0 12114:O2|@12115,0 12115:O7|@843,@771,@12117,@12116,@423,0,0 12116:O3|2,@12146,@924 12117:O2|1,@12118 12118:O3|2,@818,@12119 12119:O2|@12120,0 12120:O4|@14321,69,@12121,0 12121:O3|2,3,@12122 12122:O6|@607,@583,@12123,@815,@785,@581 12123:O2|@627,@12124 12124:O2|@12126,@12125 12125:O2|@12133,@12132 12126:O2|@12128,@12127 12127:O3|0,@12130,@609 12128:O2|1,@12129 12129:O2|2,14 12130:O8|@12131,@843,0,0,@794,0,0,1 12131:O4|13,4,@712,4 12132:O2|@12141,0 12133:O2|@12135,@12134 12134:O3|0,@12137,@609 12135:O2|1,@12136 12136:O2|2,15 12137:O8|@12138,@843,0,0,@10620,0,2,1 12138:O3|10,@10623,@12139 12139:O3|14,@12140,1 12140:O2|@1246,@10625 12141:O2|@12143,@12142 12142:O3|0,@12145,@609 12143:O2|1,@12144 12144:O2|2,16 12145:O8|@12022,@843,0,0,@10633,0,2,1 12146:O3|3,@12147,@428 12147:O2|@1865,@5398 12148:O2|@839,@12149 12149:O2|@12150,0 12150:O4|@14310,69,@12097,0 12151:O2|@754,@12152 12152:O2|@12153,0 12153:O4|@14314,69,@12154,0 12154:O2|@753,@12155 12155:O2|@12157,@12156 12156:O2|@12173,@12172 12157:O7|@12159,@704,@12160,@12158,@423,0,0 12158:O3|2,@11915,@723 12159:S12|5054627265616b506f696e74 12160:O2|1,@12161 12161:O3|14,@12162,0 12162:O2|@12164,@12163 12163:O2|@12168,@12167 12164:O2|7,@12165 12165:O8|@12166,@12159,0,0,@470,0,0,1 12166:O4|13,0,@712,13 12167:O2|@12170,0 12168:O2|7,@12169 12169:O8|@1191,@12159,0,0,@470,0,0,1 12170:O2|7,@12171 12171:O8|@722,@12159,0,0,@470,0,0,1 12172:O2|@12193,@12192 12173:O7|@12175,@704,@12176,@12174,@423,0,0 12174:O3|2,@12190,@723 12175:S13|5054636f6d706c6574696f6e73 12176:O2|1,@12177 12177:O3|14,@12178,0 12178:O2|@12180,@12179 12179:O2|@12184,@12183 12180:O2|7,@12181 12181:O8|@12182,@12175,0,0,@470,0,0,1 12182:O4|13,1,@712,13 12183:O2|@12188,0 12184:O2|7,@12185 12185:O8|@12186,@12175,0,0,@470,0,0,1 12186:O3|14,@12187,1 12187:O2|@475,@718 12188:O2|7,@12189 12189:O8|@722,@12175,0,0,@470,0,0,1 12190:O5|5,@12191,@1028,@1026,@423 12191:O2|@500,0 12192:O2|@12037,@12209 12193:O7|@12195,@704,@12194,@703,@423,0,0 12194:O2|1,@12196 12195:S12|50546465636c617265644174 12196:O3|14,@12197,0 12197:O2|@12199,@12198 12198:O2|@12203,@12202 12199:O2|7,@12200 12200:O8|@12201,@12195,0,0,@470,0,0,1 12201:O4|13,2,@712,13 12202:O2|@12207,0 12203:O2|7,@12204 12204:O8|@12205,@12195,0,0,@470,0,0,1 12205:O3|14,@12206,1 12206:O2|@2378,@718 12207:O2|7,@12208 12208:O8|@722,@12195,0,0,@470,0,0,1 12209:O2|@1232,@12210 12210:O2|@11282,@12211 12211:O2|@702,@12212 12212:O2|@12214,@12213 12213:O2|@12231,@12230 12214:O7|@12216,@704,@12215,@1233,@423,0,0 12215:O2|1,@12217 12216:S8|5054706172656e74 12217:O3|14,@12218,0 12218:O2|@12220,@12219 12219:O2|@12224,@12223 12220:O2|7,@12221 12221:O8|@12222,@12216,0,0,@470,0,0,1 12222:O4|13,7,@712,13 12223:O2|@12228,0 12224:O2|7,@12225 12225:O8|@12226,@12216,0,0,@470,0,0,1 12226:O3|14,@12227,1 12227:O2|@9362,@718 12228:O2|7,@12229 12229:O8|@722,@12216,0,0,@470,0,0,1 12230:O2|@12248,@12247 12231:O7|@12233,@704,@12232,@1233,@423,0,0 12232:O2|1,@12234 12233:S17|505470726576696f75735369626c696e67 12234:O3|14,@12235,0 12235:O2|@12237,@12236 12236:O2|@12241,@12240 12237:O2|7,@12238 12238:O8|@12239,@12233,0,0,@470,0,0,1 12239:O4|13,8,@712,13 12240:O2|@12245,0 12241:O2|7,@12242 12242:O8|@12243,@12233,0,0,@470,0,0,1 12243:O3|14,@12244,1 12244:O2|@569,@718 12245:O2|7,@12246 12246:O8|@722,@12233,0,0,@470,0,0,1 12247:O2|@989,@12267 12248:O7|@12250,@704,@12251,@12249,@423,0,0 12249:O3|2,@12266,@723 12250:S7|50547072696e74 12251:O2|1,@12252 12252:O3|14,@12253,0 12253:O2|@12255,@12254 12254:O2|@12259,@12258 12255:O2|7,@12256 12256:O8|@12257,@12250,0,0,@470,0,0,1 12257:O4|13,9,@712,13 12258:O2|@12264,0 12259:O2|7,@12260 12260:O8|@12261,@12250,0,0,@470,0,0,1 12261:O3|14,@12262,1 12262:O2|@12263,@718 12263:O3|2,9,0 12264:O2|7,@12265 12265:O8|@722,@12250,0,0,@470,0,0,1 12266:O3|2,@501,@924 12267:O2|@968,@12268 12268:O2|@1268,@12269 12269:O2|@11973,0 12270:O2|@12195,@12271 12271:O2|@12272,0 12272:O4|@14310,69,@12193,0 12273:O2|@12250,@12274 12274:O2|@12275,0 12275:O4|@14310,69,@12248,0 12276:O2|@831,@12277 12277:O2|@12278,0 12278:O4|@14310,69,@12072,0 12279:O2|@12159,@12280 12280:O2|@12281,0 12281:O4|@14310,69,@12157,0 12282:O2|@12284,@12283 12283:O2|@12285,0 12284:S8|436f646554726565 12285:O4|@14325,69,@12286,0 12286:O4|@12284,@694,@12287,@423 12287:O6|@12289,I48,0,@423,@12288,0 12288:O1|@12625 12289:O4|1,@14508,@14509,@14507 12290:O2|@12618,@12617 12291:O2|@12293,@12292 12292:O2|@12294,0 12293:S12|6d6b4d757475616c44656373 12294:O4|@14310,69,@12295,0 12295:O7|@12293,2,@12297,@12296,@423,0,0 12296:O3|2,@12303,@12302 12297:O2|1,@12298 12298:O3|2,@12299,0 12299:O1|@12300 12300:D4,64|00802b3b1a41000e0e0c000303041a3f00103b502b1a40000e0c00023e2a6964420e0e0e0e0e0e0e000000000000000030000000000000000000000000000000|@12301,I251,@10046,@10049| 12301:S26|434f44455452454528292e6d6b4d757475616c44656373283129 12302:O5|5,0,@12310,@12309,@423 12303:O5|5,@12304,@1028,@1026,@423 12304:O2|@12305,0 12305:O3|3,@12306,@428 12306:O2|@5761,@12307 12307:O2|@12308,0 12308:O2|50,@5344 12309:O3|@12310,@423,@12311 12310:S11|636f646542696e64696e67 12311:O3|@12313,@12316,@12312 12312:O3|@12317,@450,@449 12313:O2|1,@12314 12314:O3|2,@12315,0 12315:O4|0,@14511,3,1 12316:O4|1,@14512,0,0 12317:S27|506f6c794d4c2e436f6465547265652e636f646542696e64696e67 12318:O2|@12320,@12319 12319:O2|@12321,0 12320:S5|6d6b456e76 12321:O4|@14310,69,@12322,0 12322:O7|@12320,2,@12324,@12323,@423,0,0 12323:O3|2,@12329,@5344 12324:O2|1,@12325 12325:O3|2,@12326,0 12326:O1|@12327 12327:D2,56|00802b352c362a3b1a35000e0e0c00030303290204402b2b6a65420e0e0e0e0e000000000000000028000000000000000000000000000000|@12328,I251| 12328:S29|434f4445545245455f46554e4354494f4e5328292e6d6b456e76283129 12329:O3|3,@12330,@428 12330:O2|@12331,@12307 12331:O2|49,@12332 12332:O5|5,@12333,@1028,@1026,@423 12333:O2|@12302,0 12334:O2|@12336,@12335 12335:O2|@12337,0 12336:S10|6d6b46756e6374696f6e 12337:O4|@14310,69,@12338,0 12338:O7|@12336,2,@12340,@12339,@423,0,0 12339:O3|2,@12348,@5344 12340:O2|1,@12341 12341:O3|2,@12342,0 12342:O1|@12343 12343:D11,144|00802b352c362d372e382f392c1a88001a8d000e0e0c00032c1a8c001a91000e0e0c000303033c02222c1a8b000c00021a8d000e0e0c000203102c3b1a69003b28081a83000c000602013b03051a800002012c2c1a81000e0e0c00022b1a80000e0c0002312c3b2d2d3c333c680828072a69270a420e0e0e000000000000000080000000000000000000000000000000|@12345,@12344,@1385,I48,I251,I105,I218,I154,@1004,@10475,@10477| 12344:O1|@12346 12345:S41|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283129 12346:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@12347| 12347:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283529283129 12348:O3|3,@12349,@11754 12349:O2|@12351,@12350 12350:O2|@1842,@12352 12351:O2|49,@5344 12352:O2|@12354,@12353 12353:O2|@12356,@12355 12354:O2|51,@500 12355:O2|@12359,0 12356:O2|52,@12357 12357:O5|5,@12358,@1028,@1026,@423 12358:O2|@5344,0 12359:O2|53,@501 12360:O2|@12362,@12361 12361:O2|@12363,0 12362:S7|6d6b5768696c65 12363:O4|@14310,69,@12364,0 12364:O7|@12362,2,@12366,@12365,@423,0,0 12365:O3|2,@12371,@5344 12366:O2|1,@12367 12367:O3|2,@12368,0 12368:O1|@12369 12369:D5,88|00802b352c363d2a69293b693b1a50000e0c000228092a692b3b1a4b000c00030303290204402c2b6a3c302b1a41006b3b1a44000e0c00023b2b2b6a2709420e000000000000000048000000000000000000000000000000|@12370,@10873,I251,@542,@10875| 12370:S21|434f44455452454528292e6d6b5768696c65283129 12371:O3|3,@12372,@428 12372:O2|@12351,@12307 12373:O2|@12375,@12374 12374:O2|@12376,0 12375:S11|6d6b426567696e4c6f6f70 12376:O4|@14310,69,@12377,0 12377:O7|@12375,2,@12379,@12378,@423,0,0 12378:O3|2,@12386,@5344 12379:O2|1,@12380 12380:O3|2,@12381,0 12381:O1|@12382 12382:D2,48|00802b352c36291a2e000e0e0e0c00023b2c2b6a66420e0e000000000000000020000000000000000000000000000000|@12384,@12383| 12383:O1|@12385 12384:S25|434f44455452454528292e6d6b426567696e4c6f6f70283129 12385:D4,80|00802b1a52000e0e0e0c00021a51000e0e0c0002031d2b352c362a352b363b2b2b6a293c692d1a3f000c00022a2a69270702013b420e0e0e000000000000000040000000000000000000000000000000|@1399,I105,I218,@12383| 12386:O3|3,@12387,@428 12387:O2|@12351,@12388 12388:O2|@12389,0 12389:O2|50,@12303 12390:O2|@5346,@12391 12391:O2|@12392,0 12392:O4|@14314,69,@12393,0 12393:O2|@5345,0 12394:O2|@12396,@12395 12395:O2|@12397,0 12396:S10|6d6b436f6e7374616e74 12397:O4|@14310,69,@12398,0 12398:O7|@12396,2,@12400,@12399,@423,0,0 12399:O3|2,@12405,@5344 12400:O2|1,@12401 12401:O3|2,@12402,0 12402:O1|@12403 12403:D1,32|00803d2c3b6a420e000000000000000010000000000000000000000000000000|@12404| 12404:S21|434f44455452454528292e6d6b436f6e7374283129 12405:O5|5,0,@11426,@12406,@423 12406:O3|@11426,@423,@12407 12407:O3|@12409,@12412,@12408 12408:O3|@12413,@450,@449 12409:O2|1,@12410 12410:O3|2,@12411,0 12411:O4|0,@14513,3,1 12412:O4|1,@14514,0,0 12413:S27|506f6c794d4c2e436f6465547265652e6d616368696e65576f7264 12414:O2|@12416,@12415 12415:O2|@12417,0 12416:S14|6d6b4c6f6164417267756d656e74 12417:O4|@14310,69,@12418,0 12418:O7|@12416,2,@12420,@12419,@423,0,0 12419:O3|2,@501,@5344 12420:O2|1,@12421 12421:O3|2,@9448,0 12422:O2|@12424,@12423 12423:O2|@12425,0 12424:S11|72747346756e6374696f6e 12425:O4|@14310,69,@12426,0 12426:O7|@12424,2,@12427,@12419,@423,0,0 12427:O2|1,@12428 12428:O3|2,@12429,0 12429:O1|@12430 12430:D2,48|00802b1a32000e0e0e0c00023d2a3b6a64420e0e0e0e0e0e000000000000000020000000000000000000000000000000|@12431,I189| 12431:S25|434f44455452454528292e72747346756e6374696f6e283129 12432:O2|@926,@12433 12433:O2|@12434,0 12434:O4|@14310,69,@12435,0 12435:O7|@926,2,@12437,@12436,@423,0,0 12436:O3|2,@5344,@924 12437:O2|1,@12438 12438:O3|2,@2843,0 12439:O2|@12441,@12440 12440:O2|@12442,0 12441:S5|6d6b446563 12442:O4|@14310,69,@12443,0 12443:O7|@12441,2,@12445,@12444,@423,0,0 12444:O3|2,@12305,@12302 12445:O2|1,@12446 12446:O3|2,@12447,0 12447:O1|@12448 12448:D1,40|00802b352c363c3b2c2c6b65420e0e0e000000000000000018000000000000000000000000000000|@12449| 12449:S19|434f44455452454528292e6d6b446563283129 12450:O2|@12452,@12451 12451:O2|@12453,0 12452:S16|6d6b496e6c696e6546756e6374696f6e 12453:O4|@14310,69,@12454,0 12454:O7|@12452,2,@12455,@12339,@423,0,0 12455:O2|1,@12456 12456:O3|2,@12457,0 12457:O1|@12458 12458:D11,144|00802b352c362d372e382f392c1a88001a8d000e0e0c00032c1a8c001a91000e0e0c000303033c02222c1a8b000c00021a8d000e0e0c000203102c3b1a69003b28081a83000c000602013b03051a800002012c2c1a81000e0e0c00022b1a80000e0c0002312c3b2d2d3b333c680828072a69270a420e0e0e000000000000000080000000000000000000000000000000|@12460,@12459,@1385,I48,I251,I105,I218,I154,@1004,@10475,@10477| 12459:O1|@12461 12460:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283129 12461:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@12462| 12462:S50|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283529283129 12463:O2|@12465,@12464 12464:O2|@12466,0 12465:S4|6d6b4966 12466:O4|@14310,69,@12467,0 12467:O7|@12465,2,@12469,@12468,@423,0,0 12468:O3|2,@12474,@5344 12469:O2|1,@12470 12470:O3|2,@12471,0 12471:O1|@12472 12472:D1,40|00802b352c362d373c2c2c2c6b66420e000000000000000018000000000000000000000000000000|@12473| 12473:S4|436f6e64 12474:O3|3,@12475,@1827 12475:O2|@12351,@12476 12476:O2|@12308,@12477 12477:O2|@12478,0 12478:O2|51,@5344 12479:O2|@12481,@12480 12480:O2|@12482,0 12481:S7|67656e436f6465 12482:O4|@14310,69,@12483,0 12483:O7|@12481,2,@12485,@12484,@423,0,0 12484:O3|2,@12491,@12490 12485:O2|1,@12486 12486:O3|2,@12487,0 12487:O2|@12488,@2245 12488:D1,40|00802b352c362d3756372e7b05030004000000000000000018000000000000000000000000000000|@12489| 12489:S21|434f44455452454528292e67656e436f6465283129 12490:O3|2,@956,@5344 12491:O3|3,@12492,@1827 12492:O2|@12351,@12493 12493:O2|@12495,@12494 12494:O2|@12496,0 12495:O2|50,@11232 12496:O2|51,@501 12497:O2|@12499,@12498 12498:O2|@12500,0 12499:S5|4c64657863 12500:O4|@14310,69,@12501,0 12501:O7|@12499,2,@12502,@5344,@423,0,0 12502:O2|1,@12503 12503:O3|2,@3335,0 12504:O2|@12506,@12505 12505:O2|@12507,0 12506:S5|6d6b496e64 12507:O4|@14310,69,@12508,0 12508:O7|@12506,2,@12510,@12509,@423,0,0 12509:O3|2,@12305,@5344 12510:O2|1,@12511 12511:O3|2,@12512,0 12512:O1|@12513 12513:D3,64|00802b352c3629353d1a3c000e0c0003030e292b3b1a3800300e0e7b0505000428062a2c3b6b6542000000000000000030000000000000000000000000000000|@12514,I251,@2288| 12514:S37|434f4445545245455f46554e4354494f4e5328292e6d6b496e646972656374283129283129 12515:O2|@11426,@12516 12516:O2|@12517,0 12517:O4|@14314,69,@12518,0 12518:O2|@12406,0 12519:O2|@12521,@12520 12520:O2|@12522,0 12521:S6|6576616c7565 12522:O4|@14310,69,@12523,0 12523:O7|@12521,2,@12525,@12524,@423,0,0 12524:O3|2,@5344,@12530 12525:O2|1,@12526 12526:O3|2,@12527,0 12527:O1|@12528 12528:D2,48|00802b353d1a30000e0c000303082b362968016402013b42000000000000000020000000000000000000000000000000|@12529,I251| 12529:S30|434f4445545245455f46554e4354494f4e5328292e6576616c7565283129 12530:O5|5,@12531,@1988,@1845,@423 12531:O2|@12405,0 12532:O2|@12534,@12533 12533:O2|@12535,0 12534:S9|6d6b4e756c6c446563 12535:O4|@14310,69,@12536,0 12536:O7|@12534,2,@12538,@12537,@423,0,0 12537:O3|2,@5344,@12302 12538:O2|1,@12539 12539:O3|2,@12540,0 12540:O1|@12541 12541:D1,32|00803d2c69420e0e000000000000000010000000000000000000000000000000|@12542| 12542:S11|4e756c6c42696e64696e67 12543:O2|@12545,@12544 12544:O2|@12546,0 12545:S6|6d6b4c6f6f70 12546:O4|@14310,69,@12547,0 12547:O7|@12545,2,@12549,@12548,@423,0,0 12548:O3|2,@12357,@5344 12549:O2|1,@12550 12550:O3|2,@12551,0 12551:O1|@12552 12552:D2,48|00802b1a32000e0e0e0c000228092a6964420e0e0e0e0e0e000000000000000020000000000000000000000000000000|@12554,@12553| 12553:O1|@12555 12554:S20|434f44455452454528292e6d6b4c6f6f70283129 12555:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@12553| 12556:O2|@12558,@12557 12557:O2|@12559,0 12558:S13|6d6b4c6f6164436c6f73757265 12559:O4|@14310,69,@12560,0 12560:O7|@12558,2,@12561,@12419,@423,0,0 12561:O2|1,@12562 12562:O3|2,@12563,0 12563:O1|@12564 12564:D3,56|00802b3b1a39000e0e0c000303041a3700103b503c2c693f2a6964420e0e0e0e000000000000000028000000000000000000000000000000|@3632,I234,@3576| 12565:O2|@12310,@12566 12566:O2|@12567,0 12567:O4|@14314,69,@12568,0 12568:O2|@12309,0 12569:O2|@12571,@12570 12570:O2|@12572,0 12571:S8|6d6b48616e646c65 12572:O4|@14310,69,@12573,0 12573:O7|@12571,2,@12574,@12365,@423,0,0 12574:O2|1,@12575 12575:O3|2,@12576,0 12576:O1|@12577 12577:D1,40|00802b352c3628052b2b6a65420e0e0e000000000000000018000000000000000000000000000000|@12578| 12578:S22|434f44455452454528292e6d6b48616e646c65283129 12579:O2|@12581,@12580 12580:O2|@12582,0 12581:S6|6d6b43616c6c 12582:O4|@14310,69,@12583,0 12583:O7|@12581,2,@12585,@12584,@423,0,0 12584:O3|2,@12592,@5344 12585:O2|1,@12586 12586:O3|2,@12587,0 12587:O1|@12588 12588:D2,48|00802b352c36291a2e000e0e0e0c00023e2a2d3c6b66420e000000000000000020000000000000000000000000000000|@12590,@12589| 12589:O1|@12591 12590:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c6543616c6c283129 12591:D4,72|00802b1a4a000e0e0e0c00021a49000e0e0c000203152b352c362a3c692a1a3f000c00022a2a69270402013b420e0e0e000000000000000038000000000000000000000000000000|@1399,I105,I218,@12589| 12592:O3|3,@12593,@428 12593:O2|@12351,@12594 12594:O2|@12595,0 12595:O2|50,@12357 12596:O2|@12598,@12597 12597:O2|@12599,0 12598:S7|6d6b5261697365 12599:O4|@14310,69,@12600,0 12600:O7|@12598,2,@12602,@12601,@423,0,0 12601:O3|2,@5344,@5344 12602:O2|1,@12603 12603:O3|2,@12604,0 12604:O1|@12605 12605:D1,32|0080280b2c69420e000000000000000010000000000000000000000000000000|@12606| 12606:S5|5261697365 12607:O2|@12609,@12608 12608:O2|@12610,0 12609:S7|6d6b5475706c65 12610:O4|@14310,69,@12611,0 12611:O7|@12609,2,@12612,@12548,@423,0,0 12612:O2|1,@12613 12613:O3|2,@12614,0 12614:O1|@12615 12615:D5,96|0080280e2c3b6a2c291a5c000e0c00021a5d000e0e0c0002031d29352a362a353d1a54000e0c00030309292503511e263b02013b6502013c640309291a41002d7d0400022964420e000000000000000050000000000000000000000000000000|@12616,I105,I218,I251,@2349| 12616:S35|434f4445545245455f46554e4354494f4e5328292e6d6b5265636f7264283129283129 12617:O2|@12619,0 12618:S11|6d6b4c6f61644c6f63616c 12619:O4|@14310,69,@12620,0 12620:O7|@12618,2,@12621,@12419,@423,0,0 12621:O2|1,@12622 12622:O3|2,@12623,0 12623:O1|@12624 12624:D3,56|00802b3b1a39000e0e0c000303041a3700103b503d2c693f2a6964420e0e0e0e000000000000000028000000000000000000000000000000|@3632,I234,@3576| 12625:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 12626:O2|@1308,@12627 12627:O2|@12628,0 12628:O4|@14310,69,@12629,0 12629:O7|@1308,2,@12631,@12630,@423,0,0 12630:O3|2,@12632,@12632 12631:O2|3,7 12632:O3|6,@14515,79993 12633:O2|@843,@12634 12634:O2|@12635,0 12635:O4|@14310,69,@12115,0 12636:O2|@12216,@12637 12637:O2|@12638,0 12638:O4|@14310,69,@12214,0 12639:O2|@726,@12640 12640:O2|@12641,0 12641:O4|@14314,69,@12642,0 12642:O2|@725,0 12643:O2|@12175,@12644 12644:O2|@12645,0 12645:O4|@14310,69,@12173,0 12646:O2|@12647,0 12647:O4|@14310,69,@12231,0 12648:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 12649:O2|@12651,@12650 12650:O2|@12652,0 12651:S3|6d6f64 12652:O4|@14310,69,@12653,0 12653:O7|@12651,2,@424,@12654,@423,0,0 12654:O3|2,@427,@432 12655:O2|@1028,@12656 12656:O2|@12657,0 12657:O4|@14314,69,@12658,0 12658:O2|@1026,@12659 12659:O2|@10602,@12660 12660:O2|@10595,0 12661:O2|@12663,@12662 12662:O2|@12664,0 12663:S5|6172726179 12664:O4|@14314,69,@12665,0 12665:O2|@12666,0 12666:O3|@12663,@423,@12667 12667:O3|@12669,@12688,@12668 12668:O3|@12689,@450,@449 12669:O2|1,@12670 12670:O3|2,@12672,@12671 12671:O2|@12679,0 12672:O4|@12674,@14516,@12676,@12673 12673:O1|@12678 12674:O1|@12675 12675:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@11926,I251| 12676:O1|@12677 12677:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@11935| 12678:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@11937| 12679:O4|@14321,69,@12680,0 12680:O3|2,4,@12681 12681:O5|@623,@12683,@11958,@12682,@581 12682:O4|@12672,@12674,@12676,@12673 12683:O2|@627,@12684 12684:O2|@11945,@12685 12685:O2|@12686,@11948 12686:O2|@12687,@588 12687:O3|0,@14516,0 12688:O4|1,@14363,1,0 12689:S11|41727261792e6172726179 12690:O2|@1988,@12691 12691:O2|@12692,0 12692:O4|@14314,69,@12693,0 12693:O2|@1845,@12694 12694:O2|@10211,@12695 12695:O2|@10186,0 12696:O2|@2067,@12697 12697:O2|@12698,0 12698:O4|@14310,69,@10211,0 12699:O2|42,@12700 12700:O2|@12701,0 12701:O4|@14310,69,@12702,0 12702:O7|42,2,@424,@12654,@423,0,0 12703:O2|@1692,@12704 12704:O2|@12705,0 12705:O4|@14314,69,@12706,0 12706:O2|@1690,0 12707:O2|43,@12708 12708:O2|@12709,0 12709:O4|@14310,69,@12710,0 12710:O7|43,2,@424,@12654,@423,0,0 12711:O2|126,@12712 12712:O2|@12713,0 12713:O4|@14310,69,@12714,0 12714:O7|126,2,@424,@675,@423,0,0 12715:O2|45,@12716 12716:O2|@12717,0 12717:O4|@14310,69,@12718,0 12718:O7|45,2,@424,@12654,@423,0,0 12719:O2|@12721,@12720 12720:O2|@12722,0 12721:S9|426f6f747374726170 12722:O4|@14325,69,@12723,0 12723:O4|@12721,@694,@12724,@423 12724:O6|@12726,I48,0,@423,@12725,0 12725:O1|@13806 12726:O4|1,@14518,@14519,@14517 12727:O2|@13794,@13793 12728:O2|@12730,@12729 12729:O2|@12731,0 12730:S24|7265706f7274556e7265666572656e636564496473546167 12731:O4|@14310,69,@12732,0 12732:O7|@12730,2,@12734,@12733,@423,0,0 12733:O5|5,@7198,@12745,@12744,@423 12734:O2|1,@12735 12735:O3|2,@12736,0 12736:O3|@12738,@12741,@12737 12737:O2|@12743,@14403 12738:O2|@12739,@14403 12739:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12740:S19|556e6976657273616c2e746167283129283129 12741:O2|@12742,@14403 12742:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12743:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12744:O3|@12745,@423,@12746 12745:S3|746167 12746:O3|@12748,@12781,@12747 12747:O3|@12745,@450,@449 12748:O2|1,@12749 12749:O3|2,@12751,@12750 12750:O2|@12764,0 12751:O4|0,@14521,@12759,@12752 12752:O1|@12762 12753:O1|@12754 12754:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12756,@12755| 12755:O1|@12757 12756:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129 12757:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12758,@446| 12758:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129283129 12759:O1|@12760 12760:D1,32|00803e420e0e0e0e000000000000000010000000000000000000000000000000|@12761| 12761:S9|626f7865642d746167 12762:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@12763| 12763:S8|73697a652d746167 12764:O4|@14321,69,@12765,0 12765:O3|2,4,@12766 12766:O5|@623,@12768,@1196,@12767,@581 12767:O3|@12751,@12759,@12752 12768:O2|@627,@12769 12769:O2|@10225,@12770 12770:O2|@12772,@12771 12771:O2|@12775,@12774 12772:O2|@12773,@588 12773:O3|0,@14521,0 12774:O2|@12778,0 12775:O2|@1181,@12776 12776:O3|0,@12777,@609 12777:O8|@808,@12761,0,0,@470,0,0,1 12778:O2|@1188,@12779 12779:O3|0,@12780,@609 12780:O8|@475,@12763,0,0,@470,0,0,1 12781:O4|1,@14522,1,0 12782:O2|@12784,@12783 12783:O2|@12785,0 12784:S11|726f6f7454726565546167 12785:O4|@14310,69,@12786,0 12786:O7|@12784,2,@12788,@12787,@423,0,0 12787:O5|5,@12797,@12745,@12744,@423 12788:O2|1,@12789 12789:O3|2,@12790,0 12790:O3|@12792,@12794,@12791 12791:O2|@12796,@14437 12792:O2|@12793,@14437 12793:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12794:O2|@12795,@14437 12795:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12796:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12797:O2|@12798,0 12798:O3|3,@12800,@12799 12799:O3|0,@12811,1 12800:O2|@12802,@12801 12801:O2|@12807,@12806 12802:O2|@12804,@12803 12803:O5|5,@12805,@1988,@1845,@423 12804:S4|6e657874 12805:O2|@1249,0 12806:O2|@12809,0 12807:O2|@12808,@12803 12808:S6|706172656e74 12809:O2|@12810,@12803 12810:S8|70726576696f7573 12811:O2|@12804,@12812 12812:O2|@12808,@12813 12813:O2|@12810,0 12814:O2|@12816,@12815 12815:O2|@12817,0 12816:S17|636f6d70696c65724f7574707574546167 12817:O4|@14310,69,@12818,0 12818:O7|@12816,2,@12820,@12819,@423,0,0 12819:O5|5,@12829,@12745,@12744,@423 12820:O2|1,@12821 12821:O3|2,@12822,0 12822:O3|@12824,@12826,@12823 12823:O2|@12828,@14408 12824:O2|@12825,@14408 12825:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12826:O2|@12827,@14408 12827:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12828:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12829:O2|@12830,0 12830:O3|2,@924,@956 12831:O2|@12833,@12832 12832:O2|@12834,0 12833:S17|62696e64696e67436f756e746572546167 12834:O4|@14310,69,@12835,0 12835:O7|@12833,2,@12837,@12836,@423,0,0 12836:O5|5,@12846,@12745,@12744,@423 12837:O2|1,@12838 12838:O3|2,@12839,0 12839:O3|@12841,@12843,@12840 12840:O2|@12845,@14389 12841:O2|@12842,@14389 12842:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12843:O2|@12844,@14389 12844:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12845:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12846:O2|@12847,0 12847:O3|2,@956,@501 12848:O2|@12850,@12849 12849:O2|@12851,0 12850:S15|617373656d626c79436f6465546167 12851:O4|@14310,69,@12852,0 12852:O7|@12850,2,@12853,@12733,@423,0,0 12853:O2|1,@12854 12854:O3|2,@12855,0 12855:O3|@12857,@12859,@12856 12856:O2|@12861,@14396 12857:O2|@12858,@14396 12858:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12859:O2|@12860,@14396 12860:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12861:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12862:O2|@12864,@12863 12863:O2|@12865,0 12864:S17|696e6c696e6546756e63746f7273546167 12865:O4|@14310,69,@12866,0 12866:O7|@12864,2,@12867,@12733,@423,0,0 12867:O2|1,@12868 12868:O3|2,@12869,0 12869:O3|@12871,@12873,@12870 12870:O2|@12875,@14390 12871:O2|@12872,@14390 12872:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12873:O2|@12874,@14390 12874:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12875:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12876:O2|@12878,@12877 12877:O2|@12879,0 12878:S27|6e6172726f774f7665726c6f6164466c65785265636f7264546167 12879:O4|@14310,69,@12880,0 12880:O7|@12878,2,@12881,@12733,@423,0,0 12881:O2|1,@12882 12882:O3|2,@12883,0 12883:O3|@12885,@12887,@12884 12884:O2|@12889,@14405 12885:O2|@12886,@14405 12886:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12887:O2|@12888,@14405 12888:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12889:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12890:O2|@12892,@12891 12891:O2|@12893,0 12892:S19|6572726f724d65737361676550726f63546167 12893:O4|@14310,69,@12894,0 12894:O7|@12892,2,@12896,@12895,@423,0,0 12895:O5|5,@12905,@12745,@12744,@423 12896:O2|1,@12897 12897:O3|2,@12898,0 12898:O3|@12900,@12902,@12899 12899:O2|@12904,@14435 12900:O2|@12901,@14435 12901:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12902:O2|@12903,@14435 12903:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12904:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12905:O2|@12906,0 12906:O3|2,@12907,@956 12907:O3|3,@12909,@12908 12908:O3|0,@12920,1 12909:O2|@12911,@12910 12910:O2|@12914,@12913 12911:O2|@12912,@426 12912:S4|68617264 12913:O2|@12917,@12916 12914:O2|@1212,@12915 12915:O5|5,@5770,@1988,@1845,@423 12916:O2|@12919,0 12917:O2|@12918,@924 12918:S7|6d657373616765 12919:O2|@726,@724 12920:O2|@12912,@12921 12921:O2|@1212,@12922 12922:O2|@12918,@12923 12923:O2|@726,0 12924:O2|@12926,@12925 12925:O2|@12927,0 12926:S10|62797465566563746f72 12927:O4|@14314,69,@12928,0 12928:O2|@12929,0 12929:O3|@12926,@423,@12930 12930:O3|@12932,@12981,@12931 12931:O3|@12926,@450,@449 12932:O2|1,@12933 12933:O3|2,@12935,@12934 12934:O2|@12942,0 12935:O4|@12936,@14523,2,1 12936:O1|@12937 12937:D5,88|00812c1a5a000e0e0e0c00022c1a50000e0c00022a2a1a4f000c0003031a28082b1a4c000e0c00032f3b303b2d1a4800330e0e7b070700063b65430e0e0e0e0e000000000000000048000000000000000000000000000000|@12938,I15,I251,I238,I154| 12938:S13|62797465566563746f722d6571 12939:O1|@12940 12940:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12941,@446| 12941:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f547970655072696e746572283129 12942:O4|@14321,69,@12943,0 12943:O3|2,4,@12944 12944:O5|@623,@12946,@836,@12945,@581 12945:O2|@12935,@12936 12946:O2|@627,@12947 12947:O2|@12949,@12948 12948:O2|@12979,@2486 12949:O2|@1181,@12950 12950:O3|0,@12951,@609 12951:O8|@12953,@12938,0,0,@12952,0,3,1 12952:O2|@10640,@10633 12953:O3|10,@12955,@12954 12954:O4|1,@12963,@12962,@542 12955:O2|@12957,@12956 12956:O2|@12960,0 12957:O4|1,@576,0,@12958 12958:O4|3,@551,@12959,1 12959:O3|2,I15,0 12960:O4|1,@578,1,@12961 12961:O4|3,@537,@12959,1 12962:O3|10,@12968,@12967 12963:O4|3,@12964,@535,1 12964:O2|@3929,@12965 12965:O2|@12966,0 12966:O2|@5730,1 12967:O4|3,@12973,@556,1 12968:O2|@12969,0 12969:O4|1,@578,2,@12970 12970:O4|3,@12972,@12971,1 12971:O3|2,I238,0 12972:O2|@568,@3928 12973:O2|@538,@12974 12974:O2|@560,@12975 12975:O2|@539,@12976 12976:O2|@560,@12977 12977:O2|@12978,0 12978:O2|@5732,1 12979:O2|@12980,@588 12980:O3|0,@14523,0 12981:O4|1,@14524,0,0 12982:O2|@12984,@12983 12983:O2|@12985,0 12984:S19|6c6f776c6576656c4f7074696d697365546167 12985:O4|@14310,69,@12986,0 12986:O7|@12984,2,@12987,@12733,@423,0,0 12987:O2|1,@12988 12988:O3|2,@12989,0 12989:O3|@12991,@12993,@12990 12990:O2|@12995,@14395 12991:O2|@12992,@14395 12992:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 12993:O2|@12994,@14395 12994:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 12995:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 12996:O2|@12998,@12997 12997:O2|@12999,0 12998:S11|636f646574726565546167 12999:O4|@14310,69,@13000,0 13000:O7|@12998,2,@13001,@12733,@423,0,0 13001:O2|1,@13002 13002:O3|2,@13003,0 13003:O3|@13005,@13007,@13004 13004:O2|@13009,@14385 13005:O2|@13006,@14385 13006:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13007:O2|@13008,@14385 13008:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13009:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13010:O2|@13012,@13011 13011:O2|@13013,0 13012:S23|6372656174655072696e7446756e6374696f6e73546167 13013:O4|@14310,69,@13014,0 13014:O7|@13012,2,@13015,@12733,@423,0,0 13015:O2|1,@13016 13016:O3|2,@13017,0 13017:O3|@13019,@13021,@13018 13018:O2|@13023,@14406 13019:O2|@13020,@14406 13020:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13021:O2|@13022,@14406 13022:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13023:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13024:O2|@13026,@13025 13025:O2|@13027,0 13026:S19|636f64657472656541667465724f7074546167 13027:O4|@14310,69,@13028,0 13028:O7|@13026,2,@13029,@12733,@423,0,0 13029:O2|1,@13030 13030:O3|2,@13031,0 13031:O3|@13033,@13035,@13032 13032:O2|@13037,@14397 13033:O2|@13034,@14397 13034:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13035:O2|@13036,@14397 13036:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13037:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13038:O2|@13040,@13039 13039:O2|@13041,0 13040:S16|7472616365436f6d70696c6572546167 13041:O4|@14310,69,@13042,0 13042:O7|@13040,2,@13043,@12733,@423,0,0 13043:O2|1,@13044 13044:O3|2,@13045,0 13045:O3|@13047,@13049,@13046 13046:O2|@13051,@14401 13047:O2|@13048,@14401 13048:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13049:O2|@13050,@14401 13050:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13051:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13052:O2|@13054,@13053 13053:O2|@13055,0 13054:S14|70737461636b5472616365546167 13055:O4|@14310,69,@13056,0 13056:O7|@13054,2,@13057,@12733,@423,0,0 13057:O2|1,@13058 13058:O3|2,@13059,0 13059:O3|@13061,@13063,@13060 13060:O2|@13065,@14394 13061:O2|@13062,@14394 13062:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13063:O2|@13064,@14394 13064:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13065:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13066:O2|@13068,@13067 13067:O2|@13069,0 13068:S11|676c6f62616c5370616365 13069:O4|@14310,69,@13070,0 13070:O7|@13068,2,@13071,@1847,@423,0,0 13071:O2|1,@13072 13072:O3|2,@13073,0 13073:O18|@13075,@13091,@13096,@13101,@13106,@13111,@13118,@13123,@13128,@13133,@13138,@13143,@13146,@13149,@13154,@13157,@13162,@13074 13074:O2|@13165,@403 13075:O2|@13076,@403 13076:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13079,@13077| 13077:O1|@13083 13078:S25|4d414b455f28292e6462456e76416c6c283129283129283129 13079:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13080,@1633| 13080:O1|@13082 13081:S22|4d414b455f28292e6462456e76416c6c283329283129 13082:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14350,I251,@1576| 13083:D24,1384|00811a6b050c0001291a6c050e0c0002293f1a6b050c00036403033b020a293f1a65050e0e0c0003293b1a63050c000303033b02032968013d2a692c3c1a48050e0c0003293c1a4f050c0003293c1a4f050c00033b2a692c28061a3b050c0003293b1a3b050c000303033d0223293d1a2e050e0e0e0c000303033e0213293f1a1e050e0e0e0c00031a1d050e0e0c00023c2a69293b692d2a69322a691ad1040e0e0c0001293c1adf040c00031a01053b3b1a04050e0c000429352a362d1ab8040e0c0002293f1ab7040c00036403033b020a2d3f1ab1040e0e0c00031ad104291add040e0e0c00021abd040e0e0c0002034829352a362a353d1aa4040e0c0003032e2a36291ab8040e0c00021a99040e0e0c000203162935293b1aab040c000303041aab04103b50296402013b640207292503511e553b6502012a641a31040e0e0c00011a91042d1a95040e0e0c000329311a43040c00032f2a1a8b040c00032c3c2b1a8a040e0e0e0c000450331a07040c0002293f1a07040c00036403033b020a333f1a01040e0e0c00032e2a1aff030c00036403043b50020a280f2e1a57040c000350303f1aee030e0e0e0c0003293f1aeb030c00036403321ab2030e0e0e0c0001293e1abf030c0003293b1abf030c0003651ad0030e0c0002030c280b3b1a14040e0c000302013b02013b3b221d3b1a93030c0003293c1aa3030c00036403033b0222291b204e1a83030c000303033b0213293c1ae6030e0e0e0c0003292502501e353b6464221d1ada030e0e0e0c0002293b1a67030c000303033b02103c221f1ab1030e0e0c000326031e603b657881093b22210e0c000209d100ff6d221e1aaa030e0e0e0c0002293c1a2f030c000303043b500217221f1a99030e0e0c0002503d22201a6d030e0e0c0003501adc020e0c0001293c1aeb020c000322113b3b1a11030e0e0c000429352a362d1ac4020e0c0002293f1ac3020c00036403033b020a2d3f1abd020e0e0c000322151aeb020c00021acd020e0e0c0002033122201ad9020e0e0c00021ab9020e0e0c0002031a222035293b1aca020e0e0e0c000303041ac702103b50296402013b0201291a59020e0e0c00011ab9022d1abd020e0e0c000329311a6b020202ae000c00032f2a1aaf020c00032c3c2b1aae020e0e0e0c000450331a2b020c0002293f1a2b020c00036403033b020a333f1a25020e0e0c00032e2a1a23020c00036403043b50020a280f2e1a7b020c000350303f1a12020e0e0e0c0003293f1a0f020c00036403341ad6010e0e0e0c0001293e1ae3010c0003293b1ae3010c0003651af4010e0c0002030d280b3b1a38020e0c00035002023b5002023b50220c35220d36220e372b2b2b1a44026b6610221e1a2c020e0c0002293c1ab3010c000303043b500217221f1a1d020e0e0c0002503d22201af1010e0e0c0003501a60010e0c0001293c1a6f010c000322113b3b1a95010e0e0c000429352a362d1a48010e0c0002293f1a47010c00036403033b020a2d3f1a41010e0e0c000322151a6f010c00021a51010e0e0c0002033122201a5d010e0e0c00021a3d010e0e0c0002031a222035293b1a4e010e0e0e0c000303041a4b01103b50296402013b0201291add000e0e0c00011a3d012d1a41010e0e0c000329311aef000c00032f2a1a37010c00032c3c2b1a36010e0e0e0c000450331ab3000c0002293f1ab3000c00036403033b020a333f1aad000e0e0c00032e2a1aab000c00036403043b50020a280f2e1a03010c000350303f1a9a000e0e0e0c0003293f1a97000c00036403341a5e000e0e0e0c0001293e1a6b000c0003293b1a6b000c0003651a7c000e0c0002030d280b3b1ac0000e0c00035002023b5002023b50220c2728430e0e0e0e0e0e000000000000000058050000000000000000000000000000|@13085,I72,I15,I248,I253,I113,I243,I251,I218,@13086,@14,I105,I232,@13087,-1,I244,I242,I255,I73,I106,I71,I70,I69,@13084| 13084:O5|@13090,155,0,155,0 13085:S18|4d414b455f28292e70726f74656374283229 13086:O2|@464,0 13087:O4|12,@19,@13089,@13088 13088:O5|@21,346,0,346,0 13089:S40|54686520737461636b2073697a65206d7573742062652067726561746572207468616e207a65726f 13090:S28|6d6c736f757263652f4d4c436f6d70696c65722f4d414b455f2e4d4c 13091:O2|@13092,@403 13092:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13093,@13077| 13093:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13094,@1633| 13094:O1|@13095 13095:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14351,I251,@1576| 13096:O2|@13097,@403 13097:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13098,@13077| 13098:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13099,@1633| 13099:O1|@13100 13100:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14310,I251,@1576| 13101:O2|@13102,@403 13102:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13103,@13077| 13103:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13104,@1633| 13104:O1|@13105 13105:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14314,I251,@1576| 13106:O2|@13107,@403 13107:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13108,@13077| 13108:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13109,@1633| 13109:O1|@13110 13110:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14349,I251,@1576| 13111:O2|@13112,@403 13112:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13113,@13077| 13113:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14350,@1578,I251,@13115,@1597| 13114:S27|4d414b455f28292e6462456e76456e746572283129283129283129 13115:O1|@13117 13116:S24|4d414b455f28292e6462456e76456e746572283429283129 13117:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14350,I251,@13115| 13118:O2|@13119,@403 13119:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13120,@13077| 13120:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14351,@1578,I251,@13121,@1597| 13121:O1|@13122 13122:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14351,I251,@13121| 13123:O2|@13124,@403 13124:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13125,@13077| 13125:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14310,@1578,I251,@13126,@1597| 13126:O1|@13127 13127:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14310,I251,@13126| 13128:O2|@13129,@403 13129:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13130,@13077| 13130:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13131,@1633| 13131:O1|@13132 13132:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14325,I251,@1576| 13133:O2|@13134,@403 13134:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13135,@13077| 13135:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14314,@1578,I251,@13136,@1597| 13136:O1|@13137 13137:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14314,I251,@13136| 13138:O2|@13139,@403 13139:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13140,@13077| 13140:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14350,I251,@1576| 13141:S28|4d414b455f28292e6462456e764c6f6f6b7570283129283129283129 13142:S25|4d414b455f28292e6462456e764c6f6f6b7570283329283129 13143:O2|@13144,@403 13144:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13145,@13077| 13145:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14351,I251,@1576| 13146:O2|@13147,@403 13147:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13148,@13077| 13148:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14310,I251,@1576| 13149:O2|@13150,@403 13150:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13151,@13077| 13151:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14349,@1578,I251,@13152,@1597| 13152:O1|@13153 13153:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14349,I251,@13152| 13154:O2|@13155,@403 13155:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13156,@13077| 13156:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14314,I251,@1576| 13157:O2|@13158,@403 13158:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13159,@13077| 13159:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14325,@1578,I251,@13160,@1597| 13160:O1|@13161 13161:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14325,I251,@13160| 13162:O2|@13163,@403 13163:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13164,@13077| 13164:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14349,I251,@1576| 13165:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13166,@13077| 13166:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14325,I251,@1576| 13167:O2|@13169,@13168 13168:O2|@13170,0 13169:S3|757365 13170:O4|@14310,69,@13171,0 13171:O7|@13169,2,@13173,@13172,@423,0,0 13172:O3|2,@500,@956 13173:O2|1,@13174 13174:O3|2,@13175,0 13175:O2|@13176,@403 13176:D2,40|00802b3b56271a27002e0e7b05030004000000000000000018000000000000000000000000000000|@13178,@13177| 13177:O1|@13179 13178:S27|4d414b455f28292e757365496e746f456e76283129283129283129 13179:D28,824|00821a3b032e1a3f030c000329401a37030c00031a39033b1a3d030e0e0c0003292b1a3b030c0003501a24033b1a28030e0c000329392a1a2e032b1a32030e0e0e0c00043c3b1a2f030c000329291a2f030c00021a31030e0e0c0002035929352a362a1a2a031a2f030c000303033c02222a1a0b030c00021a0d030e0e0c000203102a3b1a09033b401a14030e0c000602013b0311291ae7020c00021ae9020e0e0c000202013b030429350207292503511e643b650202282e6429220d1ae8020e0c00030402002a2a1ae4020e0c00035029352a3629282e1a6d020e0e0c0003291ad4021a61020e0e0c00032c1a90020e0c00021a91020e0e0c000203522c35291abc021a91020e0e0c000303033c0222291a6b020c00021a6d020e0e0c00020310293b1a99023b28081a73020c000602013b03032a02152a282e1a0a020e0e0e0c0003292b1aff010c000364640201297881c278810b3e3b2f1a6b020c0004056200ff6d0403002a351a63021a28020e0c0003030e2a2a2a35452a36462a37475102302a353c1a0e020e0e0e0c000303101a43022a2a35452a36462a37475102122d2b1a39026a2a1a2402451a3802462a475129352a362b372b2b2b1a30026b270410292d3c1a2e020e0e0e0c00043c2a693c28402b1a26020e0e0e0c00043c28483c1a19020e0e0c00043c2b2b6a3c28482b1a09020e0e0c00043c28483c1afd010e0e0c0004292b6929220c69270909ca0e0e0e00ff6d29351ab2011a77010c000303043b500202291078810b3e3b341a93010c0004056200ff6d0403002a351a8b011a50010e0c0003030e2a2a2a35452a36462a37475102302a353c1a36010e0e0e0c000303101a6b012a2a35452a36462a3747510212322b1a61016a2a1a4c01451a6001462a475129352a362b372b2b2b1a58016b27041029323c1a56010e0e0e0c00043c2a693c28402b1a4e010e0e0e0c00043c28483c1a41010e0e0c00043c2b2b6a3c28482b1a31010e0e0c00043c28483c1a250102020e000e0e0c0004292b6929221169270a29352a3622141a12010e0e0e0c00022a2c22186a2a0e0e0e0c0002512a352b36291aff002c1a5b0022197b051900040e0e0e0e000000000000000028030000000000000000000000000000|@13181,@13182,@122,@14558,I253,@66,@190,@12,I150,I105,I218,@13183,I251,I154,@13184,@13227,@13233,I48,I61,@14294,@206,@13234,@187,@13235,@293,I11,@13237,@13180| 13180:O1|@13409 13181:S21|4d414b455f28292e757365496e746f456e76283329 13182:S5|5573653a20 13183:S2|2d49 13184:O6|@13186,@13202,@13213,@14525,@13222,@13185 13185:O1|@13225 13186:D16,696|00810403002d1ab7021abc020e0c000303033c02222d1ab7020c00021ab9020e0e0c000203102d3b1a95023b28081aaf020c000602013b03101aac022a2a35452a36462a37475102592d56280e0c000229352a362b372c38321a94020e0c0002292b1a93020c0003342c2b1a92020e0e0e0c00042956ab1a8e020e0e0e0c00032e030b301a51020e0e0c000202013b03071a2c022a690201293331452a463247260b29352a362b37040300301a11021a16020e0e0e0c000303033c0222301a0f020c00021a11020e0e0c00020310303b1aed013b28081a07020c000602013b03101a04022a2a35452a36462a37475102593056680e0c000229352a362b372c38220c1aeb010c0002292b1aeb010c0003220e2c2b1ae9010e0e0c00042956eb1ae6010e0e0e0c00032e030b301aa9010e0e0c000202013b03071a84012a690201293331452a463247260b29352a362b3729030b56891ab8013b1abc016b103b503b502b1a5a011a5f010c000303033c02222b1a5b010c00021a5d010e0e0c000203102b3b1a39013b28081a53010c000602013b1a42010e0e0e0c000203702f569a0c00022c56aa0e0e0c00022a2a1a17010c000303033c024a2a1a13010c00021a15010e0e0c00020314291a02010e0e0e0c00021a01010e0e0c000202013b03212a3b2b3b28082e1a05010e0e0c00021a2d010e0e0c00031ae5000e0e0c000602013b651ad1000e0e0c000202013b030b56891afa003b1a0e016b103b503b503356980e0e0c0002293764035f2a1a9f000c00021aa1000e0e0c000203382a35291a7c001a81000e0e0c000303033c0222291a7b000c00021a7d000e0e0c00020310293b1a59003b28081a73000c000602013b6402013b03042a3602012a302a3056c7220e0e0e7b050d00042e2b1a9f000c0003302a3056c7220e7b050d00040000000000000000a8020000000000000000000000000000|@13188,I48,I251,I105,I218,I154,@13189,I223,I107,@5831,@13190,@13196,@13197,I239,@13199,@13187| 13187:O1|@13200 13188:S17|4f532e506174682e636f6e636174283229 13189:O3|I48,0,0 13190:O1|@13191 13191:D3,56|00812c1a3a000e0e0e0c00023b3b2b30301a3400310e0e7b070500060e0e0e0e000000000000000028000000000000000000000000000000|@13193,I223,@13192| 13192:O1|@13194 13193:S16|537472696e672e6669656c6473283229 13194:D9,200|00842e2e1ac9000e0e0c0003031c2e301ac5000e0e0c00032d312b1ac2000e0e0e0c0004293b6965027e2c1aba000e0e0e0c000203032c02142e28081ab1000e0e0c00032d2a1aaf000c0003642c0e0e0e0c000203392e301a7d000e0e0c00032d312b1a7a000e0e0e0c0004303c1a8f000c0003313c1a87000c0003292b3333331a84000e0c00062c2a69270502192e3c1a6c000e0c0003302a3030301a6800310e0e7b070800061f050e0e0e0e0e0e0000000000000000b8000000000000000000000000000000|@13195,I113,I107,@5831,I105,I239,I252,I106,@13192| 13195:S25|537472696e672e6669656c64732832296669656c6427283229 13196:S4|50617468 13197:O5|@13198,582,0,582,0 13198:S14|2e2f62617369732f4f532e736d6c 13199:O5|@13198,584,0,584,0 13200:D7,144|00812c1a92000e0e0e0c00021a91000e0e0c0002035d2c352d36293b1a89000e0e0c0003033b2a1a86001a7b000c000303033c02222a1a5f000c00021a61000e0e0c000203102a3b1a65003b28081a67000c000602013b03032d02032a2e69020f292e1a5a000e0e0e0c00032b2a69646502012b430e0e0e000000000000000080000000000000000000000000000000|@13201,I105,I218,I251,I48,I154,@13187| 13201:S32|4f532e506174682e636f6e636174283229636f6e636174417263732832292829 13202:O7|@13204,@14525,@13213,47,@14526,@13218,@13203 13203:O1|@13220 13204:D12,232|00822d2c69561c0e0e0c00021ae1000e0e0c0002030b56071add003b1ae1006b103b503b502c291ade000e0e0e0c00021abd000e0e0c0002032129352a362a564b0c00021aa9000e0e0c000203033c0207292503511e2f3b6502013b64030b560a1aac003b1ab0006b103b503b502b3c1aad000e0e0c0003030c2d56191aa8000e0c000302012d2d56291aa3000c00032a2a69651aa1000e0e0c00022956280e0e0c00022935292f1a75000e0e0c00031a3d000e0e0c0002030b56371a39003b1a7d006b103b503b502b66440e0e0e0e0000000000000000d8000000000000000000000000000000|@13206,I218,@13196,@13207,I105,@13208,@13209,I251,@122,@13210,@104,@13205| 13205:O5|@13198,402,0,402,0 13206:S19|4f532e506174682e746f537472696e67283329 13207:O5|@13198,384,0,384,0 13208:S10|496e76616c6964417263 13209:O5|@13198,387,0,387,0 13210:O1|@13211 13211:D5,88|00812c1a5a000e0e0e0c00021a59000e0e0c000203282c352d36293b1a51000e0e0c000303052a3b690210292e1a48000e0c00032e2a692c2a69656502013b43000000000000000048000000000000000000000000000000|@13212,I105,I218,I251,@13210| 13212:S33|4f532e506174682e746f537472696e6728332961726373546f4c696e6b73283129 13213:O1|@13214 13214:D10,168|00800404002c1aa7000c0002293b1aa7000c00036403402c1a95000e0e0c00023b2a1a9b000c00036403041a9a00103b502c1a9b000c000203032c020b2c28081a95000e0e0c000329282f1a92000e0e0e0c00036402013b03131a8b002a2a35452a36462a37472a38485102111a80002a2a35452a36462a37472a38485129352a362b372c382c2c2c2c6b2705420e0e000000000000000098000000000000000000000000000000|@13216,I223,I233,I231,@70,I105,I252,I251,@13217,@13215| 13215:O4|0,I48,0,0 13216:S33|4f532e506174682e6d61746368566f6c756d65507265666978506f736978283129 13217:O4|1,I48,1,1 13218:O1|@13219 13219:D8,160|00802b1aa2000e0e0e0c00023b292b1a9e000e0e0e0c000303033b02522d1a97000c000203032d02142928081a91000e0e0c00032e2a1a8f000c00036429282f1a8d000e0e0c000303033c020b293b1a7e000e0e0e0c00030305296801020f2a3c1a5c000e0c00032502501e5e3b6464293b1a5b000c00031a5d000e0e0c0002651a54002c800002000000000000000090000000000000000000000000000000|@3632,I223,I247,I105,I239,I252,I251,I218| 13220:D6,88|00802b35291a58001a5d000e0e0c000303033c0224291a57000c00021a59000e0e0c00020312293b1a35003b28081a4f00310e7b070400063b64420e0e0e0e0e000000000000000048000000000000000000000000000000|@13221,I48,I251,I105,I218,I154| 13221:S23|4f532e506174682e76616c6964566f6c756d652d283129 13222:O1|@13223 13223:D1,32|00802b420e0e0e0e000000000000000010000000000000000000000000000000|@13224| 13224:S27|4f532e506174682e746f43616e6f6e6963616c436173652d283129 13225:D2,40|00802b282f1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@13226,I251| 13226:S23|4f532e506174682e6973536570617261746f722d283129 13227:O2|@13228,@13185 13228:D8,144|00812c1a92000e0e0e0c0002293c1a8f000c000356272f2c1a8d000e0e0c0005291a8c000e0c00021a8d000e0e0c0002033e29352f3b2b1a86000e0e0e0c00042a3c1a83000c00032d2c1a53000c0003293c1a4b000c0003332c2b1a62000e0e0e0c0004296801342a452f46270702052d3b452f4665430e000000000000000080000000000000000000000000000000|@13230,I223,I107,@13229,I105,I218,@5831,I106| 13229:O1|@13231 13230:S23|4f532e506174682e73706c697442617365457874283129 13231:D13,376|00832e3b1a79010e0e0c000303033b0fd02e3b1a72010e0e0e0c000303033c02102c1a6b010c00022f2a1a6b010c00036403041a6a01103b503b502c1a69010e0e0c000203032c02142e28081a61010e0e0c00032d2a1a5f010c0003642e0e0e0e0c000203033b0fcc2e3b1a1a010e0e0e0c000303033c02102c1a13010c00022f2a1a13010c00036403041a1201103b503b502c1a11010e0e0c000203032c02142e28081a09010e0e0c00032d2a1a07010c00036429282e1a05010e0e0c00036403832b3c1a00010e0c00032f2a1aff000c00036403033b026a2e3c1ae900020279000e0e0c0003293b1a9b000c000303033c02102d1a97000c00022a2a1a97000c00036403041a9600103b503b502d1a95000e0e0c000203032d02142928081a8d000e0e0c00032e2a1a8b000c000364642e020225000e0e0c000203033b02032e680102162e3c1a7d000e0e0c00032e2e2e1a82002f7b060600051f040e0e000000000000000068010000000000000000000000000000|@13232,I232,I234,I223,I231,@70,I105,I239,I252,I251,I107,I113,@13229| 13232:S32|4f532e506174682e73706c697442617365457874283129676574457874283129 13233:S3|353630 13234:S13|54657874494f2e6f70656e496e 13235:O5|@13236,293,0,293,0 13236:S18|2e2f62617369732f54657874494f2e736d6c 13237:O1|@13238 13238:D20,168|00801aab002c691aae002d691ab1002e691ab4002f691ab70030691aba0031691abd0032691ac00033691ac30034691ac600220c691ac800220d691aca00220e691acc00220f691ace002210691ad0002211691ad2002212691ad4002213691ad6002214692e2c2f2f2d2210220d2211322212221b2219221c2213221d2217221c221e68121ab8002a22176a29271442000000000000000098000000000000000000000000000000|@13240,@13241,@13243,@13245,@13247,@13249,@13251,@13253,@13257,@13261,@13265,@13269,@13273,@13277,@13281,@13285,@13289,@13293,@13297,@13239| 13239:D2,48|00802b352c362d37563756481a2900300e0e0e7b07030006000000000000000020000000000000000000000000000000|@13302,@13301| 13240:S25|4d414b455f28292e636f6d70696c65496e746f456e76283129 13241:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13242,@13077| 13242:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14350,I251,@1576| 13243:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13244,@13077| 13244:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14310,I251,@1576| 13245:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13246,@13077| 13246:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14314,I251,@1576| 13247:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13248,@13077| 13248:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14351,I251,@1576| 13249:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13250,@13077| 13250:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14325,I251,@1576| 13251:D3,48|00805607355617361a2d002a2f6a292c1a2d00307e060003000000000000000020000000000000000000000000000000|@13141,@13252,@13077| 13252:D7,144|0080560756181a8f000c0003291a90000e0c00021a91000e0e0c00020356293529291a7b000c00021a7d000e0e0c0002033e29352a362a35291a74001a79000e0e0c000364031f2a351a64001a69000e0e0c000303043b5002041a6300102a37296801640207292503511e493b6502013b6502013b64420e000000000000000080000000000000000000000000000000|@13142,@1578,I105,I218,@14349,I251,@1576| 13253:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13254,@13077| 13254:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14350,@1578,I251,@13255,@1597| 13255:O1|@13256 13256:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14350,I251,@13255| 13257:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13258,@13077| 13258:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14310,@1578,I251,@13259,@1597| 13259:O1|@13260 13260:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14310,I251,@13259| 13261:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13262,@13077| 13262:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14314,@1578,I251,@13263,@1597| 13263:O1|@13264 13264:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14314,I251,@13263| 13265:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13266,@13077| 13266:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14325,@1578,I251,@13267,@1597| 13267:O1|@13268 13268:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14325,I251,@13267| 13269:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13270,@13077| 13270:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14351,@1578,I251,@13271,@1597| 13271:O1|@13272 13272:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14351,I251,@13271| 13273:D3,56|00802b352c365627355637361a31002a2e2e6b292c1a3000320e0e0e7e080003000000000000000028000000000000000000000000000000|@13114,@13274,@13077| 13274:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14349,@1578,I251,@13275,@1597| 13275:O1|@13276 13276:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14349,I251,@13275| 13277:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13278,@13077| 13278:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13279,@1633| 13279:O1|@13280 13280:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14350,I251,@1576| 13281:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13282,@13077| 13282:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13283,@1633| 13283:O1|@13284 13284:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14310,I251,@1576| 13285:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13286,@13077| 13286:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13287,@1633| 13287:O1|@13288 13288:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14314,I251,@1576| 13289:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13290,@13077| 13290:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13291,@1633| 13291:O1|@13292 13292:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14351,I251,@1576| 13293:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13294,@13077| 13294:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13295,@1633| 13295:O1|@13296 13296:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14325,I251,@1576| 13297:D3,48|00805607355617361a2d002a69292c1a2e00300e7e060003000000000000000020000000000000000000000000000000|@13078,@13298,@13077| 13298:D3,48|008056073b1a30001a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13081,@13299,@1633| 13299:O1|@13300 13300:D6,120|00822c2c2a1a78000e0c00021a79000e0e0c000203462a352b362a35291a70001a75000e0e0c00036403222a351a60001a65000e0e0c000303043b5002041a5f00102a37322a69292e696502012b2a2a2505250526031e523b6602012965440e000000000000000068000000000000000000000000000000|@1636,I105,I218,@14349,I251,@1576| 13301:O1|@13303 13302:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283129 13303:D37,832|00843c28403c1a3f030c00043c28403b1a35030e0e0c00041a35032a2c336b7882cb2c3b1a31030e0e0c00031a31030e0e0c000207dd1a2f032e691a320328452b3b6b1a32032845220f3b6b291a3003692b2a691a31032a691a34032a69293b1a35030e0e0c000303042210020a22102a1a2c030e0c00032210342b1a29030e0e0c00042936291a26030e0e0e0c00021acd020e0e0c000203043b5002041a170310293578810b2b1a15030e0e0c0002052800ff6d2935280d1adc020e0c000303043b5002022910293729352a362a2a1af5020e0e0c0003270429352a362b372c382d392e3a2e291ac50202028f010e0e0c00021a69020e0e0c0002032e29352a362a352b36221e35221f361ac1022a2e020263012e6b292c1abc020e0c0003502e250826071e3f260702023b50502c291a7c020e0c00021a25020e0e0c0002032a29352a362a352b36221e35221f361a8d022a2e2e6b292c1a7c020e0c0003502e250826071e36260702023b505029291a3c020e0c00021ae5010e0e0c0002032a29352a362a352b36221e35221f361a55022a2e2e6b292c1a3c020e0c0003502e250826071e36260702023b50502a291afc010e0c00021aa5010e0e0c0002032a29352a362a352b36221e35221f361a1d022a2e2e6b292c1afc010e0c0003502e250826071e36260702023b50502b291abc010e0c00021a65010e0e0c0002032a29352a362a352b36221e35221f361ae5012a2e2e6b292c1abc010e0c0003502e250826071e36260702023b50502d291a7c010e0c00021a25010e0e0c0002032a29352a362a352b36221e35221f361aad012a2e2e6b292c1a7c010e0c0003502e250826071e36260702023b502613204e023b271202013b05a90e0e0e00ff6d293528671a10010e0c0003031e293733353436291a70012c1a74010e0c00045028671a72012d1a76016b103b50293c1aa5000e0e0c00031a6d012a1a71010e0e0c0003291a70011a65010e0e0c00031a6d013b1a81000e0e0c0003292b1a67010c0003501a58013b1a6c000e0c000329392a1a5a012b1a16010e0e0e0c000450220f35221036291a4d012c1a01010e0e0c0004503135323633372b2b2b1a3f016b6610661f050e000000000000000030030000000000000000000000000000|@13305,I11,@13306,I253,I218,@13328,@14386,@14388,@13330,@13371,@13374,I251,@13375,@5785,I105,@13377,I32,@11202,@13380,@13077,@13383,@13386,@13389,@13392,@13395,@13398,@12,@140,@13405,@11218,@122,@13406,@14558,@66,@190,@13407,@13304| 13304:O5|@13090,326,0,326,0 13305:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329 13306:D7,128|0080560935561936291a7c002c1a80000e0c0004293b1a7f000c0003030e56373b3c1a7b000c0004503b0233293529401a65000e0e0c0003032356483b1a68000e0c0003293c1a67000c000356683b2b1a4d000e0e0c0004502c6502012a6466420e0e0e0e0e0e0e000000000000000070000000000000000000000000000000|@13308,@13307,@12,I251,I255,I253,I106| 13307:O1|@13309 13308:S41|4d414b455f28292e636f6d70696c65496e746f456e7628312975736528332967657443686172283129 13309:D11,152|00802b3b1a99000e0e0c00030402002a3c2b1a93000c00045029352a362a1a8f000c0002303b2c1a8e000e0e0e0c000450291a8b000c0002293b1a8b000c00036403033b0236291a76000e0e0e0c00023b2a1a7b000c00036403041a7a00103b50291a7b000c0002030329020b2928081a75000e0e0c0003296801642705420e000000000000000088000000000000000000000000000000|@13311,I253,@13310,@104,I255,I223,I113,I231,@70,I105,I252| 13310:O2|@13313,@13312 13311:S32|4261736963496d7065726174697665494f28292e696e70757431283129283129 13312:O2|@13318,I48 13313:D10,320|00822d353b1a40010e0c000307d32d362e372f3830392c1a36010e0e0e0c0002293b1a33010c0003030b2d3b69312a452e466402ca292c1a26010e0e0e0c0003322a1a23010c00036403363168012e2d2b1a1c010e0c000429352a362b371a17010c0004293b692f220d1a13010c00033b33332c336805220d2c452a462706027e292c1ada000e0e0e0c0003322a1ac7000c00036403202d2c3b1ad3000c000429352a362b371acf000c0004293b69332a453046660248292c1aa4000e0c0003322a1a9b000c00030402002f2b2b340e0e0c00045029352a3632313b1a9100020220000e0e0c000429352a362b371a87000c0004292d69220f2a452d4627082705021e2d362e372a2a306a2956472c1a76000e0e0e0c00042f2a35452a36462704440e0e0e0e0e0e000000000000000030010000000000000000000000000000|@13315,I251,I223,I113,I107,I234,@212,@13314,I106,@12| 13314:O1|@13316 13315:S29|426173696353747265616d494f28292e696e7075744e4c697374283229 13316:D15,232|00822b1aea000e0e0e0c00022e3b1ae7000c0003030c2d2a1add000e0e0c000302013b03032c02a02d3b1acb000c000303051acb0002912d3c1abc000e0c000303162e28081ac0000e0c00032d2a1abf002f0e0e7e0700032d28101aaa000e0e0e0c0003293c1aaf000c00032928081aae000e0e0e0c0003291aac001ab1000e0e0c000303041aaf00103b502928413b1aad000e0e0c000429321aab000c0003502808331a61000e0e0c0003312a2c2808220d1a9a000e0e0e0c0006502a1a97000c0002502a270564440e0e0e0e0e0e0000000000000000d8000000000000000000000000000000|@13317,I223,I251,I48,I239,I252,I240,I241,72057594037927935,I247,@124,I11,I151,I198,I47| 13317:S19|537562737472696e672e766563746f72283129 13318:D2,64|00802b352c362d370402002c2c2c2c56871a34000e0c00065029352a362a2a692706420e0e0e0e0e000000000000000030000000000000000000000000000000|@13320,@13319| 13319:O1|@13321 13320:S30|426173696353747265616d494f28292e696e7075744e4c69737427283129 13321:D11,328|00842f3b1a49010e0e0c000329353d1a46010e0e0e0c0003030f2c3b693c32326a2f2b452a46650fcb29353b1a29010e0e0c000303b229362a372b382b1a20010e0c0002293b1a1f010c000303102c3b693c2d220d6a332b452a46650286322a1a0d010e0e0c000303343268012d3b2b1a05010e0e0c000429352a362b371aff000c0004293b693c3022106a3b322b2211336805220e2c452a4627060246322a1ac5000e0e0c000303102c3b693c2d220d6a332b452a4665022a322a1ac9000e0e0c00030402002d220d2c2c220d1abf000c00065029352a36302b69220d2a452b4627052704024504020031312b301aa600020237000e0e0e0c00055029352a362a1a5b000c0002293b1a5b000c000364030b2a3b69312a452b4664020e33333333331a6a00347b070b000666641f05000000000000000038010000000000000000000000000000|@13323,I253,I251,I223,I113,I234,@212,@13314,I107,@13319,@13322| 13322:O1|@13324 13323:S30|426173696353747265616d494f28292e696e7075744e4c69737427283329 13324:D12,232|00832e3b1ae9000e0e0c000329353c1ae6000e0e0e0c0003038a2936292309291add000e0e0c00021add000e0e0c000203043b5002172a35291ad4001ad9006a1add001ae2002b1ae6006b64103b5029352b3a2c230b2a3b1a9d000e0e0c000303033b020b2a353b2a0c0002296801652a2d0e0e0e0c00023c2840321ab9000e0e0c00043b2b2b2e6b220f3b2b1ab0000e0c0004503c2b22106a220e2d452a46270a022829353d1a4e000e0e0e0c0003030c3c30306a2e2e452a4664020e29362a373c2a326a302c452a4666641f040e0000000000000000d8000000000000000000000000000000|@13326,I253,I251,I105,I218,@194,@13327,@14294,@187,@13325,I11,I255| 13325:O5|@189,140,0,140,0 13326:S25|426173696353747265616d494f28292e696e70757427283229 13327:S5|696e707574 13328:D2,40|008056073b1a28002d0e0e0e7e030003000000000000000018000000000000000000000000000000|@13329,I253| 13329:S39|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329636f64652d283129 13330:O2|@13332,@13331 13331:O2|@2800,@13342 13332:O4|@14435,69,@13333,0 13333:O1|@13334 13334:D15,160|00802b352c372d3829352a372d03051a960002031a99002a3c1a9c000e0c00032e1a9c000e0c0002291a9c00691aa0002a692c2a691aa0002a69312a691aa0002a69312a6927091a9e000e0e0e0c00021a9d003b1aa1000e0e0c0003292b1a9f000c0003501a88003b1a8c000e0c000329392a1a92002b1a9600220e0e0e0e7b050c00040e0e0e0e000000000000000090000000000000000000000000000000|@13336,@13337,@13338,@243,@9485,@13339,@13340,@13341,@13335,@104,@14558,I253,@66,@190,@12| 13335:S5|20696e2027 13336:S43|4d414b455f28292e636f6d70696c65496e746f456e762831297573652833296572726f7250726f63283129 13337:S6|4572726f722d 13338:S8|5761726e696e672d 13339:O2|10,0 13340:S2|2e0a 13341:S8|272c206c696e6520 13342:O2|@13344,@13343 13343:O2|@2830,@13345 13344:O4|@14403,69,1,0 13345:O2|@13347,@13346 13346:O2|@13364,@13363 13347:O4|@14464,69,@13348,0 13348:O1|@13349 13349:D3,48|00802b1a320028461a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13351,@9759,@13350| 13350:O1|@13352 13351:S24|5072657474792e7072657474795072696e74283129283129 13352:D4,72|00822d3b2d2f2f1a46000e0e0e0c0006292d1a43000c0003641a44000e0c0002030a402d2c0e0e0e7d0500023b440e0e000000000000000038000000000000000000000000000000|@13354,@13353,I113,I218| 13353:O1|@13355 13354:S21|5072657474792e7072657474795072696e74283329 13355:D18,488|00842f3b1ae9010e0e0c0003291ae8010e0c000203043b5002041ae30110293b1ae5010e0e0c00036403a52f3b1ac0010e0c0003291ac0010e0c000203043b5002041abb0110293b1abd010e0e0c00036403043b5002041ab601102f3630373139312c1ab2010e0e0e0c000333321aaf010c0003293b1a8f010c000303162b332e342e220c1aa0011aa501220e0e0e7b090c000829352c342a1a5c010e0c00021a95010e0e0c000203202a352b362a302d221022101a70010e0c00062a2a2505250526031e2c26030200512927060fd52f3b1a1b010c0003291a1c010e0c000203043b5002041a570110293c1a19010e0e0c00036403762f3b1af4000e0c0003291af4000e0c000203043b5002041a2f0110293c1af1000e0e0c00036403043b5002041a2201102f3629293b1a21010e0e0c0003031828202f0c000250293c1a16010e0e0e0c000325011e2002023b50502e2a1a02010e0e0e0c0003293b1aef000c000303032902013b65025e2f3b1a7e000e0e0e0c0003291a7c000e0c000203043b5002041ad70010293e1a79000e0e0c00036403043b5002041aca00102f36292e020224000e0e0c000250291abf000c00022f2a1a9f000c0003293b1a8f000c000303032902013b661f050e0e0e0000000000000000d8010000000000000000000000000000|@13357,I253,I105,@2943,I251,@9489,I106,@13358,@13353,@13356,I218,@2943,@9494,I233,I107,@2943,@9487,I223| 13356:O1|@13361 13357:S30|5072657474792e7072657474795072696e742833296c61794f7574283329 13358:O1|@13359 13359:D15,416|00812c3b1aa1010e0e0c0003291aa0010e0c000203043b5002041a9b0110293b1a9d010e0e0c00036403852c3b1a78010e0c0003291a78010e0c000203043b5002041a730110293b1a75010e0e0c00036403043b5002041a6e01102c29362a372b382c396b29382e68012a2a2a1a40010e0c00021a59010e0e0c0002032d2a352b362b3b1a39010e0e0c000303033b020c2b352b2a1a40010e0c0003642a2a2505250526031e393b66020129270602d42c3b1af3000c0003291af4000e0c000203043b5002041a170110293c1af1000e0e0c00036403572c3b1acc000e0c0003291acc000e0c000203043b5002041aef0010293c1ac9000e0e0c00036403043b5002041ae200102c29362a37692935292f1adc000e0c000303102e2a1ad9000e0e0c00032968016402013b6602562c3b1a75000e0e0c0003291a74000e0c000203043b5002041ab70010293e1a71000e0e0c00036403043b5002041aaa00102c361aac000e0c0002292d1a83000c000303102c2a1a81000e0e0c00032968016402013b64430e0e0e000000000000000090010000000000000000000000000000|@13360,I253,I105,@2943,I251,@9489,I218,@13358,@2943,@9494,I232,I107,@2943,@9487,I223| 13360:S31|5072657474792e7072657474795072696e7428332967657453697a65283229 13361:D16,736|0086311ae2020e0e0e0c00021ae1020e0e0c000207cc313532362a3b1ad9020e0e0c0003291ac0020e0c000203043b5002041acb0210293c1acd020e0e0c00036407cf291aa1020e0e0c00021aa1020e0e0c00021a99020e0e0c00020303320fdd2a3b1a92020e0e0e0c0003291a78020e0c000203043b5002041a830210293c1a85020e0e0c00036403043b5002041a7e02102a362b373303033c02bb342b1a76020e0e0e0c000303033c02ab342b1a6e020e0e0e0c00032c2a2a1a2a020e0e0e0c00021a29020e0e0c000203692a352b362a3b1a21020e0e0c0003291a08020202db010e0c000203043b5002041a0f0210293c1a11020e0e0c00036403052b680102302a2c1a1f020c0003291ad8010202fe000e0c00021ad5010e0e0c0002031029352b2a2506250626041e723b6402013b6465020329680165290202d0003b1ac4010e0c00031aa5010e0e0c0002651a9c010e0c0002036a40330e0c000250312a1aca010e0e0e0c000329293b1ac6010e0e0e0c0003031c2820220c0e0e0e0c000250293c1a96010e0e0e0c000325011e2502023b505031331a82010e0e0e0c0003292c1a77010c00032e2a220f220f220f220f220f1a850122100e0e7b091000082a293b1a6e010e0e0e0c000303182820340c000250293c1a42010e0e0e0c000325011e2102023b5050342b1a2e010e0e0e0c00032c2a220d220d220d220d220d1a3901220e0e0e7b090e000802aa2a3b1ae1000e0e0c0003291ac8000e0c000203043b5002041a1b0110293e1ad5000e0e0c00036403612a3b1ab8000e0c0003291aa0000e0c000203043b5002041af30010293e1aad000e0e0c00036403043b5002041ae600102a3629320e0e0c000250291adf000c0002342a1a9f000c00032c2a220d220d220d220d220d1aad00220e0e0e7b090e00082a30343332320e0e0e0c00062a2a34343434341a8e00220c0e0e0e7b090c0008650201301f070e0e0e0e0e0e0000000000000000d0020000000000000000000000000000|@13362,I105,I218,I253,@2943,I251,@9494,I232,I107,@13358,I106,I233,@13356,@2943,@9487,I223| 13362:S40|5072657474792e7072657474795072696e742833296c61794f7574283329646f5072696e74283229 13363:O2|@2804,@13367 13364:O4|@14399,69,@13365,0 13365:O1|@13366 13366:D1,32|00802814420e0e0e000000000000000010000000000000000000000000000000|@13329| 13367:O2|@2806,@13368 13368:O2|@2814,@13369 13369:O2|@2808,@13370 13370:O2|@2812,0 13371:O4|@14408,69,@13372,0 13372:O1|@13373 13373:D3,48|00802b1a320028461a35002e0e0e0e7b050300040e0e0e0e000000000000000020000000000000000000000000000000|@13351,@9759,@13350| 13374:O4|@14401,69,1,0 13375:O1|@13376 13376:D4,72|00812c1a4a000e0e0e0c00021a49000e0e0c000203142c352d36292e1a41000e0e0c00032b2a696602012b430e0e0e0e000000000000000038000000000000000000000000000000|@1374,I105,I218,@13375| 13377:O4|103,@140,@13379,@13378 13378:O5|@13090,303,0,303,0 13379:S13|537461746963204572726f7273 13380:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14350,@1578,I251,@13381,@1597| 13381:O1|@13382 13382:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14350,I251,@13381| 13383:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14310,@1578,I251,@13384,@1597| 13384:O1|@13385 13385:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14310,I251,@13384| 13386:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14325,@1578,I251,@13387,@1597| 13387:O1|@13388 13388:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14325,I251,@13387| 13389:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14351,@1578,I251,@13390,@1597| 13390:O1|@13391 13391:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14351,I251,@13390| 13392:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14349,@1578,I251,@13393,@1597| 13393:O1|@13394 13394:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14349,I251,@13393| 13395:D6,96|00801a6300284556293b6b561756281a5e000e0e0e0c0003293b1a5b000c000303052a3b69020e2935292c1a52000e0e0e0c000364563756482b1a4b00310e7b050600040e0e0e0e000000000000000050000000000000000000000000000000|@13116,@14314,@1578,I251,@13396,@1597| 13396:O1|@13397 13397:D6,96|00812c1a62000e0e0e0c00021a61000e0e0c000203292c352d362a35291a58001a5d000e0e0c00036403052d2a69020c292e1a53000c00032b2a69646502032b3b69430e0e0e0e0e000000000000000050000000000000000000000000000000|@1601,I105,I218,@14314,I251,@13396| 13398:O1|@13399 13399:D5,88|00802b3b1a59000e0e0c00032929353b1a55000e0e0c0003030c2937292502501e133b64021229362a372a1a42002b1a4600327b0507000465420e0e0e0e0e0e000000000000000048000000000000000000000000000000|@13401,I253,I251,@13400,@12| 13400:O1|@13402 13401:S33|4261736963496d7065726174697665494f28292e636c6f7365496e283129283129 13402:D5,112|00802b293b1a70000e0c000329353c1a6e000e0e0e0c0003031a293629382c3b1a65001a6a000e0e0e0c0004503b2a307d07000229353d1a46000e0e0e0c000303033b020a2937292503511e483b6465420e0e0e0e0e0e0e000000000000000060000000000000000000000000000000|@13404,I253,I251,@13403,I255| 13403:O1|2 13404:S26|426173696353747265616d494f28292e646f436c6f7365283129 13405:O5|@13090,320,0,320,0 13406:S8|207261697365640a 13407:O1|@13408 13408:D5,88|00802b3b1a59000e0e0c00032929353b1a55000e0e0c0003030c2937292502501e133b64021229362a372a1a42002b1a4600327b0507000465420e0e0e0e0e0e000000000000000048000000000000000000000000000000|@13401,I253,I251,@13400,@12| 13409:D5,88|00802b3b1a59000e0e0c00032929353b1a55000e0e0c0003030c2937292502501e133b64021229362a372a1a42002b1a4600327b0507000465420e0e0e0e0e0e000000000000000048000000000000000000000000000000|@13401,I253,I251,@13400,@12| 13410:O2|@13412,@13411 13411:O2|@13413,0 13412:S8|6465627567546167 13413:O4|@14310,69,@13414,0 13414:O7|@13412,2,@13415,@12733,@423,0,0 13415:O2|1,@13416 13416:O3|2,@13417,0 13417:O3|@13419,@13421,@13418 13418:O2|@13423,@14402 13419:O2|@13420,@14402 13420:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13421:O2|@13422,@14402 13422:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13423:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13424:O2|@12663,@13425 13425:O2|@13426,0 13426:O4|@14314,69,@13427,0 13427:O2|@13428,0 13428:O3|@12663,@423,@13429 13429:O3|@13431,@13450,@13430 13430:O3|@13451,@450,@449 13431:O2|1,@13432 13432:O3|2,@13434,@13433 13433:O2|@13441,0 13434:O4|@13436,@14527,@13438,@13435 13435:O1|@13440 13436:O1|@13437 13437:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@11926,I251| 13438:O1|@13439 13439:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@11935| 13440:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@11937| 13441:O4|@14321,69,@13442,0 13442:O3|2,4,@13443 13443:O5|@623,@13445,@11958,@13444,@581 13444:O4|@13434,@13436,@13438,@13435 13445:O2|@627,@13446 13446:O2|@11945,@13447 13447:O2|@13448,@11948 13448:O2|@13449,@588 13449:O3|0,@14527,0 13450:O4|1,@14362,1,0 13451:S12|4172726179322e6172726179 13452:O2|@13454,@13453 13453:O2|@13455,0 13454:S24|7265706f727444697363617264656456616c756573546167 13455:O4|@14310,69,@13456,0 13456:O7|@13454,2,@13458,@13457,@423,0,0 13457:O5|5,@9414,@12745,@12744,@423 13458:O2|1,@13459 13459:O3|2,@13460,0 13460:O3|@13462,@13464,@13461 13461:O2|@13466,@14407 13462:O2|@13463,@14407 13463:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13464:O2|@13465,@14407 13465:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13466:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13467:O2|@13469,@13468 13468:O2|@13470,0 13469:S15|636f6d70696c657256657273696f6e 13470:O4|@14310,69,@13471,0 13471:O7|@13469,2,@13472,@500,@423,0,0 13472:O2|1,@13473 13473:O3|2,@13474,0 13474:S11|352e362052656c65617365 13475:O2|@13477,@13476 13476:O2|@13478,0 13477:S27|7265706f72744578686175737469766548616e646c657273546167 13478:O4|@14310,69,@13479,0 13479:O7|@13477,2,@13480,@12733,@423,0,0 13480:O2|1,@13481 13481:O3|2,@13482,0 13482:O3|@13484,@13486,@13483 13483:O2|@13488,@14404 13484:O2|@13485,@14404 13485:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13486:O2|@13487,@14404 13487:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13488:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13489:O2|@13491,@13490 13490:O2|@13492,0 13491:S11|66696c654e616d65546167 13492:O4|@14310,69,@13493,0 13493:O7|@13491,2,@13495,@13494,@423,0,0 13494:O5|5,@12191,@12745,@12744,@423 13495:O2|1,@13496 13496:O3|2,@13497,0 13497:O3|@13499,@13501,@13498 13498:O2|@13503,@14388 13499:O2|@13500,@14388 13500:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13501:O2|@13502,@14388 13502:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13503:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13504:O2|@13506,@13505 13505:O2|@13507,0 13506:S20|70726f66696c65416c6c6f636174696f6e546167 13507:O4|@14310,69,@13508,0 13508:O7|@13506,2,@13509,@13457,@423,0,0 13509:O2|1,@13510 13510:O3|2,@13511,0 13511:O3|@13513,@13515,@13512 13512:O2|@13517,@14392 13513:O2|@13514,@14392 13514:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13515:O2|@13516,@14392 13516:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13517:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13518:O2|@13520,@13519 13519:O2|@13521,0 13520:S13|6572726f724465707468546167 13521:O4|@14310,69,@13522,0 13522:O7|@13520,2,@13523,@13457,@423,0,0 13523:O2|1,@13524 13524:O3|2,@13525,0 13525:O3|@13527,@13529,@13526 13526:O2|@13531,@14398 13527:O2|@13528,@14398 13528:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13529:O2|@13530,@14398 13530:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13531:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13532:O2|@13534,@13533 13533:O2|@13535,0 13534:S12|757365576974685061726d73 13535:O4|@14310,69,@13536,0 13536:O7|@13534,2,@13538,@13537,@423,0,0 13537:O3|2,@11232,@13172 13538:O2|1,@13539 13539:O3|2,@13540,0 13540:O2|@13541,@403 13541:D2,40|00801a2b002c56276a420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@13543,@13542| 13542:D2,40|00802b561756281a26002e7b05030004000000000000000018000000000000000000000000000000|@13178,@13177| 13543:S24|4d414b455f28292e757365496e746f456e76283129283129 13544:O2|@13546,@13545 13545:O2|@13547,0 13546:S16|7072696e74446570746846756e546167 13547:O4|@14310,69,@13548,0 13548:O7|@13546,2,@13549,@12836,@423,0,0 13549:O2|1,@13550 13550:O3|2,@13551,0 13551:O3|@13553,@13555,@13552 13552:O2|@13557,@14399 13553:O2|@13554,@14399 13554:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13555:O2|@13556,@14399 13556:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13557:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13558:O2|@6417,@13559 13559:O2|@13560,0 13560:O4|@14310,69,@13561,0 13561:O7|@6417,2,@13563,@13562,@423,0,0 13562:O3|2,@500,@13583 13563:O2|1,@13564 13564:O3|2,@13565,0 13565:O1|@13566 13566:D15,280|00802b1a1a010e0e0e0c0002293d1a17010c00036403402b1a05010e0e0c00023d2a1a0b010c00036403041a0a01103b502b1a0b010c000203032b020b2b401a06010e0e0e0c00032928781a02010e0e0e0c00036402013b03033d02013c2c1abe000e0e0e0c00021aed002e2b6a3b2a2d1aec000e0c0004291ac4000e0c00021ae5000e0e0c00020338293529352a362a1adc001a91000e0e0c000303041ad700103b502a1a98000e0c000203032a02072a1acb000c0002292b69296801270502013b291a79000e0e0c00021a99000e0e0c0002030a293529352968016502013b291a5b000c00021a7d000e0e0c000203043b5002041a8f001029352706420e000000000000000008010000000000000000000000000000|@13568,I223,I233,I231,@70,I105,I252,I251,@13569,@13570,I218,@3652,@13576,I152,@13567| 13567:O4|8,@13581,@13582,@13580 13568:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129776f72644f66537472696e67283129 13569:D5,104|00802b56181a68000e0c000303033b023a56071a62000e0e0e0c00020304560702172b28081a58000e0c000356172a1a56000e0e0e0c0003642c3c1a42000e0e0e0c00032a2a6929680166420e0e0e0e000000000000000058000000000000000000000000000000|@6345,I251,I105,I239,I252| 13570:O1|@13571 13571:D12,1480|00822b3d1ac9050e0e0c00030304281002212b3c1ab9050e0e0c000303034002122b3e1aaa050e0e0e0c00030304280802013d2e2e0c0002291a9c050e0c00021a9d050e0e0c000207ce293529352928301a7c050e0c000307d12a3629320e0e0e0c0002291a70050e0c00021a71050e0e0c000207d0293529352a362a28771a4e050e0e0e0c000307d2343d1a41050e0e0c000307c829220d0c0002291a38050e0c00021a39050e0e0c000207dd293529352a362a28781a16050e0e0e0c000303033c020b2a28581a05050e0e0c000303c8220f3d1af8040e0c000303103b3b2b22131a02050e0e0e0c000502aa3b3b2b2922140e0c0002291adc040e0c00021add040e0e0c0002037b293529352a362a28301ada0402028f040e0e0e0c00030319283022141acf0402028a030c00032b2a1acb040c00036402013b03372e22141ac404020257030e0c0003292c1aa7040c00032928301ab6040204a801f3000e0c00033c2a2e250a250a250a26071e7e3b66020d2f03092e2e692968016402013b6602112c030d2b0202c2002b692968016402013b270402b2220f3d1a30040e0c000303103b3b2f22131a3a040e0e0e0c000502963b3b2f2922140e0c0002291a14040e0c00021a15040e0e0c0002036b293529352a362a28301a12040e0e0e0c00030315283022141a0b040c00032b2a1a0b040c00036402013b032f2e22141a04040e0c0003292c1aeb030c00032928301afa030e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27046602013b6402b1343d1a78030e0c000303103b3b2b220f1a82030e0e0e0c000502963b3b2b2922100e0c0002291a5c030e0c00021a5d030e0e0c0002036b293529352a362a28301a5a030e0e0e0c00030315283022101a53030c00032b2a1a53030c00036402013b032f2e22101a4c030e0c0003292c1a33030c00032928301a42030e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27040fdd2a28781ac4020e0c000303033c020b2a28581ab5020e0e0c0003030c343d1aa9020e0e0c000302013b03b9343d1a9a020e0e0e0c000303103b3b2b220f1aa2020e0e0e0c0005029a3b3b2b2922100e0c0002291a7c020e0c00021a7d020e0e0c0002036b293529352a362a28301a7a020e0e0e0c00030315283022101a73020c00032b2a1a73020c00036402013b032f2e22101a6c020e0c0003292c1a53020c00032928301a62020e0e0e0c00033c2a2e250a250a250a26071e6e3b66020d2f03092e2e692968016402013b6602112c03092b2b692968016402050202b7003b270402b2343d1ae1010e0e0c000303103b3b220f220f1ae9010e0e0c000502963b3b220f2922100c0002291ac4010e0c00021ac5010e0e0c0002036b293529352a362a28301ac2010e0e0e0c00030315283022101abb010c00032b2a1abb010c00036402013b032f2e22101ab4010e0c0003292c1a9b010c00032928301aaa010e0e0e0c00033c2a2e250a250a250a26071e6d3b66020d2f03092e2e692968016402013b66020d2c03092b2b692968016402013b27046602013b293b1a2b010c000303093b2c6929680164020129660fde2a3628092b1a59010e0e0c0003030c2a280d1a4c010e0c000302013b03033c020c2a28201af2000e0e0e0c0003030e2932321a3401330e0e7b050a0004303d1ad7000c0003030e3b3b34341ae300340e7b060a00053b3b3429220c0e0e0e0c0002291abc000e0c00021abd000e0e0c0002036d293529352a362a28301aba000e0e0e0c000303152830220c1ab3000c00032b2a1ab3000c00036402013b032f2e220c1aac000e0c0003292c1a93000c00032928301aa2000e0e0e0c00033c2a2e250a250a250a26071e703b66020d2f03092e2e692968016402013b66020f0f002c03092b2b692968016402013b27056502013b65440e0e0e0e0000000000000000b8050000000000000000000000000000|@13573,I251,I105,I218,@13572,I231,I106,I234,I108,I107,I248,@13570| 13572:O1|@13574 13573:S11|7363616e576f7264283329 13574:D9,336|00832c2c0e0c0002291a4c010e0c00021a4d010e0e0c000207cb293529352a362a28301a42010e0e0e0c0003030c2a28391a3c010e0c000302013b032f3128101a35010e0e0c0003292c1a33010c00032928301a32010e0e0e0c00033c2a2e220c1a2c01220d0e7b060d00052a28411af6000e0e0e0c0003030c2a28461af0000e0c000302013b03373128101ae9000e0e0c0003292c1ae7000c00032928411ae6000e0e0e0c000329401ad3000c00033c2a2f220d1ad800220e0e7b060e00052a28611aa2000e0e0e0c0003030c2a28661a9c000e0c000302013b033b3128101a9500020241000e0e0c0003292c1a8f000c00032928611a8e000e0e0e0c000329401a7b000c00033c2a2f220d1a8000220e0e7b060e00053203093131692968016402013b66020d2f03092e2e692968016402013b641f04000000000000000040010000000000000000000000000000|@13575,I105,I218,I231,I232,I108,I106,I107,@13572| 13575:S29|7363616e576f7264283329726561645f6865785f646967697473283329 13576:O4|5,@13578,0,@13577 13577:O5|@13579,297,0,297,0 13578:S8|4f766572666c6f77 13579:S21|2e2f62617369732f4c61726765576f72642e736d6c 13580:O5|@5343,548,0,548,0 13581:S10|436f6e76657273696f6e 13582:S21|496e76616c696420776f726420636f6e7374616e74 13583:O5|5,0,@1684,@1682,0 13584:O2|@13586,@13585 13585:O2|@13587,0 13586:S16|6d6178496e6c696e6553697a65546167 13587:O4|@14310,69,@13588,0 13588:O7|@13586,2,@13589,@13457,@423,0,0 13589:O2|1,@13590 13590:O3|2,@13591,0 13591:O3|@13593,@13595,@13592 13592:O2|@13597,@14391 13593:O2|@13594,@14391 13594:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13595:O2|@13596,@14391 13596:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13597:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13598:O2|@13600,@13599 13599:O2|@13601,0 13600:S12|706172736574726565546167 13601:O4|@14310,69,@13602,0 13602:O7|@13600,2,@13603,@12733,@423,0,0 13603:O2|1,@13604 13604:O3|2,@13605,0 13605:O3|@13607,@13609,@13606 13606:O2|@13611,@14393 13607:O2|@13608,@14393 13608:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13609:O2|@13610,@14393 13610:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13611:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13612:O2|@13614,@13613 13613:O2|@13615,0 13614:S14|636f6e76537472696e674e616d65 13615:O4|@14310,69,@13616,0 13616:O7|@13614,2,@13617,@500,@423,0,0 13617:O2|1,@13618 13618:O3|2,@6427,0 13619:O2|@13621,@13620 13620:O2|@13622,0 13621:S14|7072696e744f7574707574546167 13622:O4|@14310,69,@13623,0 13623:O7|@13621,2,@13624,@12819,@423,0,0 13624:O2|1,@13625 13625:O3|2,@13626,0 13626:O3|@13628,@13630,@13627 13627:O2|@13632,@14464 13628:O2|@13629,@14464 13629:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13630:O2|@13631,@14464 13631:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13632:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13633:O2|@1684,@13634 13634:O2|@13635,0 13635:O4|@14314,69,@13636,0 13636:O2|@13637,0 13637:O3|@1684,@423,@13638 13638:O3|@13640,@13639,@1685 13639:O4|1,@14529,0,0 13640:O2|1,@13641 13641:O3|2,@13642,0 13642:O4|I53,@14528,1,1 13643:O1|@13644 13644:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12941,@446| 13645:O2|@13647,@13646 13646:O2|@13648,0 13647:S21|636f6d70696c657256657273696f6e4e756d626572 13648:O4|@14310,69,@13649,0 13649:O7|@13647,2,@13650,@501,@423,0,0 13650:O2|1,@13651 13651:O3|2,560,0 13652:O2|@13654,@13653 13653:O2|@13655,0 13654:S9|556e6976657273616c 13655:O4|@14325,69,@13656,0 13656:O4|@13654,@694,@13657,@423 13657:O6|@13659,I48,0,@423,@13658,0 13658:O1|@13709 13659:O4|1,@14531,@14532,@14530 13660:O1|@13661 13661:D2,40|00802b401a29002d7e0300030e0e0e0e000000000000000018000000000000000000000000000000|@408,@407| 13662:O2|@11236,@13706 13663:O2|@13665,@13664 13664:O2|@13666,0 13665:S10|74616750726f6a656374 13666:O4|@14310,69,@13667,0 13667:O7|@13665,2,@13669,@13668,@423,0,0 13668:O3|2,@13675,@13674 13669:O2|1,@13670 13670:O3|2,@13671,0 13671:O1|@13672 13672:D1,32|00802b37420e0e0e000000000000000010000000000000000000000000000000|@13673| 13673:S29|556e6976657273616c2e74616750726f6a6563742d2370726f6a656374 13674:O3|2,@11234,@13677 13675:O5|5,@13676,@12745,@12744,@423 13676:O2|@13677,0 13677:O3|6,@14534,79992 13678:O2|@12745,@13679 13679:O2|@13680,0 13680:O4|@14314,69,@13681,0 13681:O2|@12744,0 13682:O2|@13684,@13683 13683:O2|@13685,0 13684:S9|746167496e6a656374 13685:O4|@14310,69,@13686,0 13686:O7|@13684,2,@13688,@13687,@423,0,0 13687:O3|2,@13675,@13693 13688:O2|1,@13689 13689:O3|2,@13690,0 13690:O1|@13691 13691:D1,32|00802b36420e0e0e000000000000000010000000000000000000000000000000|@13692| 13692:S27|556e6976657273616c2e746167496e6a6563742d23696e6a656374 13693:O3|2,@13677,@11234 13694:O2|@13696,@13695 13695:O2|@13697,0 13696:S5|7461674973 13697:O4|@14310,69,@13698,0 13698:O7|@13696,2,@13700,@13699,@423,0,0 13699:O3|2,@13675,@13705 13700:O2|1,@13701 13701:O3|2,@13702,0 13702:O1|@13703 13703:D1,32|00802b35420e0e0e000000000000000010000000000000000000000000000000|@13704| 13704:S19|556e6976657273616c2e74616749732d236973 13705:O3|2,@11234,@426 13706:O2|@13707,0 13707:O4|@14314,69,@13708,0 13708:O2|@11235,0 13709:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 13710:O2|@6427,@13711 13711:O2|@13712,0 13712:O4|@14310,69,@13713,0 13713:O7|@6427,2,@13715,@13714,@423,0,0 13714:O3|2,@500,@500 13715:O2|1,@13716 13716:O3|2,@13717,0 13717:O1|@13718 13718:D5,64|00802b1a42000e0e0e0c00021a41002d2b6a3b2b2b301a3f000c00051a41002e7d0500020e0e0e0e000000000000000030000000000000000000000000000000|@13720,I223,@13721,@13719,@5875| 13719:O1|@13723 13720:S22|4d6973632e756e657363617065537472696e67283129 13721:D10,144|00802b56181a90000e0c000303033b02662b3b1a8a000e0e0e0c000303033c021456071a82000e0e0e0c00022c2a1a7f000c00036403041a7e00103b5056071a7e000e0e0e0c00020304560702172b28081a74000e0c000356172a1a72000e0e0e0c0003642c3c1a6e000e0e0e0c00032a2a692968016642000000000000000080000000000000000000000000000000|@13722,I113,I234,I223,I231,@70,I105,I239,I252,I106| 13722:S28|4d6973632e756e657363617065537472696e67283129726472283129 13723:D17,328|00832e2e1a49010e0e0c000303033b0fdd2e292e1a41010e0e0c0003291a40010e0c00021a41010e0e0c000203ca29352935291a3a011a3f010c000303033c0222291a1b010c00021a1d010e0e0c00020310293b1a19013b28081a23010c000602013b03832a3629331ae4000e0c000303033b025a293b1a0e010e0e0e0c000303033c0210301a07010c00022a2a1a07010c00036403041a0601103b50301abf000c000203033002142928081af9000e0e0c0003312a1af7000c0003642a3c1af6000e0e0e0c00032a2a6929680166293b1aa4000e0c000303033b02082a250626051ed03b65020d2a362a2a02023d0069296801656502013b65291a62000e0e0e0c00021a61000e0e0c000203043b5002041aab0010293529352a36293232321aa5000e0e0c00052b2a6927051f040e000000000000000038010000000000000000000000000000|@13725,I113,@13726,I105,I218,I48,I251,I154,I234,I223,I231,@70,I239,I252,I106,@13724,@13719| 13724:O4|8,@13581,@13736,@13735 13725:S34|4d6973632e756e657363617065537472696e67283129636f6e764368617273283129 13726:O1|@13727 13727:D14,928|00812c2c0e0c0002291a9c030e0c00021a9d030e0e0c000207d4293529352a362a28201a92030e0e0e0c000303033c020b287e2b1a81030e0e0c000303033b0fca2a285c1a79030e0e0c000307cf29300e0c0002291a50030e0c00021a51030e0e0c000207dc293529352928751a50030e0c000303342a363b3f2b220d1a48030e0c0005291a20030e0c00021a21030e0e0c00020310293529352a362a2a69296801270402013b650fd029285e1a10030e0c000303872a3629340e0e0e0c0002291ae4020e0c00021ae5020e0e0c00020367293529352a362a28401af2020e0e0e0c00030310285f2b1ae40202028d020e0c000302013b033c2a28401ad9020e0e0c0003293b1ad70202026d020c000303033c020f2928ff1acd02020254020e0e0c000303041ac702103b50292b692968016502013b6602013b650fd129282202022b021a79020e0e0c0003030c2a3628222a69296801650fd229285c1a60020e0c0003030c2a36285c2a69296801650fcc2928721a48020202f0010e0c0003030c2a36280d2a69296801650fd22928661a2c020e0c0003030c2a36280c2a69296801650fcf2928761a14020e0c0003030c2a36280b2a69296801650fce29286e1afc010e0c0003030b2a36402a69296801650fdb2928741ae5010e0e0c0003030c2a3628092a69296801650fdd2928621acc010e0c0003030c2a3628082a69296801650fcb2928611ab40102025c010e0c0003030c2a3628072a69296801650fd62a3628092b1ace0102023e010e0e0e0c000303102a280d1abc0102022c010e0c000302013b03033c020c2a28201a6e010e0e0e0c000303c32929220c02020a010e0e0e0c0002291a3c010e0c00021a3d010202f5000e0e0c0002034a293529352a3628092b1a6e010202de000e0e0e0c0003030c2a280d1a5c010e0c000302013b03033c02102a28201a12010202ba000e0e0e0c0003030a29250526041e643b02012d6602012a02029f006534020299000e0e0c0002291acc000e0c00021acd000e0e0c0002032f293529352a362a285c1aca00020272000e0e0e0c00031aad000e0e0c000203033b02091af0002a69296801646602013b64024e28302b1ad5000e0e0c0003030c2a28321ac8000e0c000302013b03313b3e2f220d1ac7000c0005291a60000e0c00021a61000e0e0c00020310293529352a362a2a69296801270402013b6402013b646502013b6402072a2a69296801646602091a80002e69296801646443000000000000000090030000000000000000000000000000|@13729,I105,I218,I250,I251,@13730,I231,I107,I234,I233,@118,I248,I48,@13728| 13728:O1|@13733 13729:S16|436861722e7363616e42617365283229 13730:O1|@13731 13731:D14,576|00832d3b1a41020e0e0c0003033b2e28ff1a3c020e0c000303033b022a2e3b1a36020e0e0e0c000303033c020b2e28ff1a1d020e0e0c000303041a2302103b502e2d69296801640fd32c2c0e0e0c0002291a14020e0c00021a15020e0e0c000207ca293529352a3628302b1a0a020e0e0e0c0003030c2a28391afc010e0c000302013b033b313c1af6010e0e0e0c00033328101af2010e0e0e0c0003292d1aef010c00032928301ad6010e0e0e0c0003292d2f220d1ae001220e0e7b060e000528612b1ab2010e0e0e0c0003030c2a28661aa4010e0c000302013b0347313c1a9e010e0e0e0c00033328101a9a010e0e0e0c0003292d1a97010c00032928611a7e010e0e0e0c000329401a83010c0003292e30220e1a8001220f020202010e7b060f000528412b1a4e010202a8000e0e0e0c0003030c2a28461a3c010e0c000302013b0343313c1a36010e0e0e0c00033328101a32010e0e0e0c0003292d1a2f010c00032928411a16010e0e0e0c000329401a1b010c0003292e30220e1a1801220f0e7b060f0005311a14011a19010e0e0c000303033c020b3228ff1ab1000e0e0c000303033b022a323b1aaa000e0e0e0c000303033c020b3228ff1a91000e0e0c000303041a9700103b50323169296801646602492e1ac6001acb000c000303033c020b2f28ff1a65000e0e0c000303033b022a2f3b1a5e000e0e0e0c000303033c020b2f28ff1a45000e0e0c000303041a4b00103b502f2e6929680164641f040e0e0e0e0e0e000000000000000030020000000000000000000000000000|@13732,I113,I233,I234,@118,I105,I218,I248,I107,I108,I106,@13730,-1,I231| 13732:S16|436861722e7265616448657827283429 13733:D13,296|00832d3b1a29010e0e0c0003033b2e28ff1a24010e0c000303033b022a2e3b1a1e010e0e0e0c000303033c020b2e28ff1a05010e0e0c000303041a0b01103b502e2d692968016402c32c2c0e0e0c0002291afc000e0c00021afd000e0e0c0002035e293529352a3628302b1af2000e0e0e0c0003030c28392b1aec000e0c000302013b0337313c1ae6000e0e0e0c000333401ae3000c0003292d1ae3000c00032928301aca000e0e0e0c0003292d2f220d1ad400220e0e7b060e00053b66024b2f28ff1a72000e0e0e0c000303033c020b2e3b1a62000e0e0e0c000303033b022a2f3b1a5a000e0e0e0c000303033c020b2f28ff1a41000e0e0c000303041a4700103b502f2e6929680164641f040e0e000000000000000018010000000000000000000000000000|@13734,I113,I233,I234,@118,I105,I218,I248,I231,I107,I108,I106,@13728| 13734:S15|436861722e72656164446563283429 13735:O5|@13737,91,0,91,0 13736:S23|496e76616c696420737472696e6720636f6e7374616e74 13737:S32|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f4d6973632e4d4c 13738:O2|@6425,@13739 13739:O2|@13740,0 13740:O4|@14310,69,@13741,0 13741:O7|@6425,2,@13743,@13742,@423,0,0 13742:O3|2,@500,@501 13743:O2|1,@13744 13744:O3|2,@13745,0 13745:O1|@13746 13746:D13,288|00802b1a22010e0e0e0c0002293e1a1f010c000364033f2b3b3d1a1b010c0004291a1c011a21010e0e0c000303033c0222291a1b010c00021a1d010e0e0c00020310293b1af9003b401a14010e0c000602013b6402013b03033c02532b1ac8000e0c0002293f1ac7000c000364033f2b3b3e1ac3000c0004291aec001ac9000e0e0c000303033c0222291ac3000c00021ac5000e0e0c00020310293b1ac9003b280b1abb000c000602013b6402013b03033d02013c2c1a6f000c00021ab1002e2b6a3b2a2d1ab0000e0c0004291a80000e0c00021a81000e0e0c0002030a293529352968016502013b291a63000c00021a65000e0e0c000203043b5002041a7f001029352705420e000000000000000010010000000000000000000000000000|@13748,I223,I231,@5831,@5983,I251,I105,I218,I154,@13749,@13750,@6346,@13747| 13747:O4|8,@13581,@13752,@13751 13748:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129696e744f66537472696e67283129 13749:S3|7e3078 13750:D5,104|00802b56181a68000e0c000303033b023a56071a62000e0e0e0c00020304560702172b28081a58000e0c000356172a1a56000e0e0e0c0003642c3c1a42000e0e0e0c00032a2a6929680166420e0e0e0e000000000000000058000000000000000000000000000000|@6345,I251,I105,I239,I252| 13751:O5|@5343,537,0,537,0 13752:S24|496e76616c696420696e746567657220636f6e7374616e74 13753:O2|@13755,@13754 13754:O2|@13756,0 13755:S9|6f6666736574546167 13756:O4|@14310,69,@13757,0 13757:O7|@13755,2,@13758,@12836,@423,0,0 13758:O2|1,@13759 13759:O3|2,@13760,0 13760:O3|@13762,@13764,@13761 13761:O2|@13766,@14387 13762:O2|@13763,@14387 13763:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13764:O2|@13765,@14387 13765:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13766:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13767:O2|@13769,@13768 13768:O2|@13770,0 13769:S13|6c696e654c656e677468546167 13770:O4|@14310,69,@13771,0 13771:O7|@13769,2,@13772,@13457,@423,0,0 13772:O2|1,@13773 13773:O3|2,@13774,0 13774:O3|@13776,@13778,@13775 13775:O2|@13780,@14400 13776:O2|@13777,@14400 13777:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13778:O2|@13779,@14400 13779:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13780:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13781:O2|@13783,@13782 13782:O2|@13784,0 13783:S9|627974654172726179 13784:O4|@14314,69,@13785,0 13785:O2|@13786,0 13786:O3|@13783,@423,@13787 13787:O3|@13789,@13792,@13788 13788:O3|@13783,@450,@449 13789:O2|1,@13790 13790:O3|2,@13791,0 13791:O4|I251,@14535,2,1 13792:O4|1,@14361,0,0 13793:O2|@13795,0 13794:S13|6c696e654e756d626572546167 13795:O4|@14310,69,@13796,0 13796:O7|@13794,2,@13797,@12836,@423,0,0 13797:O2|1,@13798 13798:O3|2,@13799,0 13799:O3|@13801,@13803,@13800 13800:O2|@13805,@14386 13801:O2|@13802,@14386 13802:D2,40|00802b352956271a26002e0e7e040003000000000000000018000000000000000000000000000000|@12740,I251| 13803:O2|@13804,@14386 13804:D1,40|0080560728452d3b6b420e0e0e0e0e0e000000000000000018000000000000000000000000000000|@12740| 13805:D3,56|00802b3556171a37000c000303043b5002041a3300102b37420e0e0e0e0e0e0e000000000000000028000000000000000000000000000000|@12740,I251,@1576| 13806:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 13807:O2|47,@13808 13808:O2|@13809,0 13809:O4|@14310,69,@13810,0 13810:O7|47,2,@424,@12654,@423,0,0 13811:O2|@13813,@13812 13812:O2|@13814,0 13813:S3|646976 13814:O4|@14310,69,@13815,0 13815:O7|@13813,2,@424,@12654,@423,0,0 13816:O2|@13818,@13817 13817:O2|@13819,0 13818:S6|766563746f72 13819:O4|@14314,69,@13820,0 13820:O2|@13821,0 13821:O3|@13818,@423,@13822 13822:O3|@13824,@13905,@13823 13823:O3|@13818,@450,@449 13824:O2|1,@13825 13825:O3|2,@13827,@13826 13826:O2|@13843,0 13827:O4|@13829,@14536,@13838,@13828 13828:O1|@13841 13829:O1|@13830 13830:D2,32|00801a23002c6942000000000000000010000000000000000000000000000000|@13832,@13831| 13831:D5,120|00812c1a7a000e0e0e0c00022c1a70000e0c00022a2a1a6f000c0003033d3b2b2a1a64000e0c000303033c022b563735302b1a5b000c0003302c1a53000c00032b0c0003640310293c1a4c000e0c000325011e333b02013b6402013b65430e0e000000000000000068000000000000000000000000000000|@13833,I15,I251,I253,I239| 13832:S11|766563746f722d65712829 13833:S9|766563746f722d6571 13834:O1|@13835 13835:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12756,@13836| 13836:O1|@13837 13837:D2,32|00801a2300420e0e000000000000000010000000000000000000000000000000|@12758,@446| 13838:O1|@13839 13839:D1,32|00803d420e0e0e0e000000000000000010000000000000000000000000000000|@13840| 13840:S12|626f7865642d766563746f72 13841:D1,32|00803c420e0e0e0e000000000000000010000000000000000000000000000000|@13842| 13842:S11|73697a652d766563746f72 13843:O4|@14321,69,@13844,0 13844:O3|2,4,@13845 13845:O5|@623,@13847,@11958,@13846,@581 13846:O4|@13827,@13829,@13838,@13828 13847:O2|@627,@13848 13848:O2|@13850,@13849 13849:O2|@13896,@13895 13850:O2|@1181,@13851 13851:O3|0,@13852,@609 13852:O8|@13854,@13832,0,0,@13853,0,0,1 13853:O2|@13882,0 13854:O2|7,@13855 13855:O8|@13856,@13833,0,@1123,@12952,0,3,1 13856:O3|10,@12955,@13857 13857:O4|1,@12963,@13858,@542 13858:O3|0,@13860,@13859 13859:O2|@13880,0 13860:O4|1,@13862,@475,@13861 13861:O4|1,@13865,@13864,@542 13862:O4|3,@13863,@535,1 13863:O2|@3929,@12977 13864:O2|9,@13874 13865:O4|3,@13866,@1101,1 13866:O2|@13868,@13867 13867:O2|@13871,0 13868:O2|@13869,1 13869:O4|3,@13870,@2587,1 13870:O2|@538,@12977 13871:O2|@13872,1 13872:O4|3,@13873,@2587,1 13873:O2|@539,@12977 13874:O2|@13875,0 13875:O2|@13876,1 13876:O4|3,@13877,@565,1 13877:O2|@12978,@13878 13878:O2|@13879,0 13879:O2|@475,1 13880:O2|@13881,1 13881:O3|@580,2,@542 13882:O2|1,@13883 13883:O2|@13884,0 13884:O3|2,0,@13885 13885:O2|@13886,0 13886:O3|0,@578,@13887 13887:O2|@13889,@13888 13888:O2|@13893,0 13889:O4|3,@13890,@2587,1 13890:O2|@538,@13891 13891:O2|@13892,0 13892:O2|@5733,1 13893:O4|3,@13894,@2587,1 13894:O2|@539,@13891 13895:O2|@13899,@13898 13896:O2|@13897,@588 13897:O3|0,@14536,0 13898:O2|@13902,0 13899:O2|@1188,@13900 13900:O3|0,@13901,@609 13901:O8|@2378,@13840,0,0,@470,0,0,1 13902:O2|@1195,@13903 13903:O3|0,@13904,@609 13904:O8|@475,@13842,0,0,@470,0,0,1 13905:O4|1,@14537,1,0 13906:O2|60,@13907 13907:O2|@13908,0 13908:O4|@14310,69,@13909,0 13909:O7|60,2,@424,@425,@423,0,0 13910:O2|62,@13911 13911:O2|@13912,0 13912:O4|@14310,69,@13913,0 13913:O7|62,2,@424,@425,@423,0,0 13914:O2|@13916,@13915 13915:O2|@13917,0 13916:S7|52756e43616c6c 13917:O4|@14325,69,@13918,0 13918:O4|@13916,@694,@13919,@423 13919:O6|@13921,I48,0,@423,@13920,0 13920:O1|@14209 13921:O4|1,@14539,@14540,@14538 13922:O2|@14205,@14204 13923:O2|@13925,@13924 13924:O2|@13926,0 13925:S9|537562736372697074 13926:O4|@14310,69,@13927,0 13927:O7|@13925,0,@13928,@7393,@423,0,0 13928:O2|1,@982 13929:O2|@13931,@13930 13930:O2|@13932,0 13931:S10|756e7361666543617374 13932:O4|@14310,69,@13933,0 13933:O7|@13931,2,@13935,@13934,@423,0,0 13934:O3|2,@13940,@13939 13935:O2|1,@13936 13936:O2|7,@13937 13937:O8|@472,@13938,0,0,@470,0,0,1 13938:S13|756e7361666543617374283129 13939:O3|6,@14543,79992 13940:O3|6,@14542,79992 13941:O2|@13943,@13942 13942:O2|@13944,0 13943:S8|5857696e646f7773 13944:O4|@14310,69,@13945,0 13945:O7|@13943,0,@13947,@13946,@423,0,0 13946:O3|2,@500,@7393 13947:O2|1,@1008 13948:O2|@11031,@13949 13949:O2|@13950,0 13950:O4|@14310,69,@13951,0 13951:O7|@11031,0,@13952,@7393,@423,0,0 13952:O2|1,@11032 13953:O2|@13955,@13954 13954:O2|@13956,0 13955:S7|466f726569676e 13956:O4|@14310,69,@13957,0 13957:O7|@13955,0,@13958,@13946,@423,0,0 13958:O2|1,@13959 13959:O3|2,23,0 13960:O2|@13581,@13961 13961:O2|@13962,0 13962:O4|@14310,69,@13963,0 13963:O7|@13581,0,@13964,@13946,@423,0,0 13964:O2|1,@569 13965:O2|@13967,@13966 13966:O2|@13968,0 13967:S4|4661696c 13968:O4|@14310,69,@13969,0 13969:O7|@13967,0,@13970,@13946,@423,0,0 13970:O2|1,@13971 13971:O3|2,103,0 13972:O2|@13974,@13973 13973:O2|@13975,0 13974:S11|6164644f7665726c6f6164 13975:O4|@14310,69,@13976,0 13976:O7|@13974,2,@13978,@13977,@423,0,0 13977:O3|2,@13979,@13172 13978:O2|3,0 13979:O3|2,@13981,@13980 13980:O3|6,@14545,79992 13981:O3|6,@14544,79992 13982:O2|@6581,@13983 13983:O2|@13984,0 13984:O4|@14310,69,@13985,0 13985:O7|@6581,0,@13986,@7393,@423,0,0 13986:O2|1,@10794 13987:O2|@13989,@13988 13988:O2|@13990,0 13989:S6|537973457272 13990:O4|@14310,69,@13991,0 13991:O7|@13989,0,@13993,@13992,@423,0,0 13992:O3|2,@13994,@7393 13993:O2|1,@2378 13994:O3|3,@13995,@428 13995:O2|@1865,@13996 13996:O2|@13997,0 13997:O2|50,@13998 13998:O5|5,@9414,@1988,@1845,@423 13999:O2|@14001,@14000 14000:O2|@14002,0 14001:S3|446976 14002:O4|@14310,69,@14003,0 14003:O7|@14001,0,@14004,@7393,@423,0,0 14004:O2|1,@9362 14005:O2|@14007,@14006 14006:O2|@14008,0 14007:S7|45785472616365 14008:O4|@14310,69,@14009,0 14009:O7|@14007,0,@14011,@14010,@423,0,0 14010:O3|2,@14012,@7393 14011:O2|1,@11987 14012:O3|3,@14013,@428 14013:O2|@14015,@14014 14014:O2|@14016,0 14015:O2|49,@12190 14016:O2|50,@7393 14017:O2|@5196,@14018 14018:O2|@14019,0 14019:O4|@14310,69,@14020,0 14020:O7|@5196,0,@14021,@7393,@423,0,0 14021:O2|1,@475 14022:O2|@14024,@14023 14023:O2|@14025,0 14024:S8|4f766572666c6f77 14025:O4|@14310,69,@14026,0 14026:O7|@14024,0,@14027,@7393,@423,0,0 14027:O2|1,@10415 14028:O2|@14030,@14029 14029:O2|@14031,0 14030:S9|72756e5f63616c6c30 14031:O4|@14310,69,@14032,0 14032:O7|@14030,2,@14034,@14033,@423,0,0 14033:O3|2,@501,@14047 14034:O2|1,@14035 14035:O2|7,@14036 14036:O8|@14037,@14030,0,0,@470,0,1,1 14037:O3|10,@14039,@14038 14038:O2|7,@14043 14039:O2|@14040,0 14040:O4|1,0,0,@14041 14041:O4|3,@551,@14042,1 14042:O3|2,I189,0 14043:O8|@14045,@14046,0,@14044,@470,0,0,1 14044:O2|@1182,0 14045:O4|3,0,@1109,1 14046:S12|72756e5f63616c6c30283129 14047:O3|2,@956,@14048 14048:O3|6,@14546,79992 14049:O2|@14051,@14050 14050:O2|@14052,0 14051:S9|72756e5f63616c6c31 14052:O4|@14310,69,@14053,0 14053:O7|@14051,2,@14055,@14054,@423,0,0 14054:O3|2,@501,@14059 14055:O2|1,@14056 14056:O2|7,@14057 14057:O8|@14041,@14058,0,0,@470,0,0,1 14058:S12|72756e5f63616c6c31283129 14059:O3|2,@14048,@14060 14060:O3|6,@14547,79992 14061:O2|@14063,@14062 14062:O2|@14064,0 14063:S11|72756e5f63616c6c324332 14064:O4|@14310,69,@14065,0 14065:O7|@14063,2,@14067,@14066,@423,0,0 14066:O3|2,@501,@14087 14067:O2|1,@14068 14068:O2|7,@14069 14069:O8|@14070,@14063,0,0,@470,0,1,1 14070:O3|10,@14039,@14071 14071:O2|7,@14072 14072:O8|@14074,@14073,0,@14044,@470,0,1,1 14073:S14|72756e5f63616c6c324332283129 14074:O3|10,@14076,@14075 14075:O3|14,@14083,0 14076:O2|@14077,0 14077:O5|0,0,0,2,@14078 14078:O4|3,@14079,@1109,1 14079:O2|@14081,@14080 14080:O2|@14082,@3928 14081:O2|@712,1 14082:O2|@1010,1 14083:O2|@14085,@14084 14084:O2|@14086,0 14085:O4|6,@3930,0,0 14086:O4|6,@3930,1,0 14087:O3|2,@14089,@14088 14088:O3|3,@14094,@428 14089:O3|3,@14090,@428 14090:O2|@14092,@14091 14091:O2|@14093,0 14092:O2|49,@14048 14093:O2|50,@14060 14094:O2|@14096,@14095 14095:O2|@14098,0 14096:O2|49,@14097 14097:O3|6,@14548,79992 14098:O2|50,@14099 14099:O3|6,@14549,79992 14100:O2|@14102,@14101 14101:O2|@14103,0 14102:S9|72756e5f63616c6c32 14103:O4|@14310,69,@14104,0 14104:O7|@14102,2,@14106,@14105,@423,0,0 14105:O3|2,@501,@14116 14106:O2|1,@14107 14107:O2|7,@14108 14108:O8|@14109,@14102,0,0,@470,0,1,1 14109:O3|10,@14039,@14110 14110:O2|7,@14111 14111:O8|@14113,@14112,0,@14044,@470,0,0,1 14112:S12|72756e5f63616c6c32283129 14113:O4|3,@14114,@1109,1 14114:O2|@14081,@14115 14115:O2|@14082,0 14116:O3|2,@14089,@14097 14117:O2|@14119,@14118 14118:O2|@14120,0 14119:S9|72756e5f63616c6c33 14120:O4|@14310,69,@14121,0 14121:O7|@14119,2,@14123,@14122,@423,0,0 14122:O3|2,@501,@14135 14123:O2|1,@14124 14124:O2|7,@14125 14125:O8|@14126,@14119,0,0,@470,0,1,1 14126:O3|10,@14039,@14127 14127:O2|7,@14128 14128:O8|@14130,@14129,0,@14044,@470,0,0,1 14129:S12|72756e5f63616c6c33283129 14130:O4|3,@14131,@1109,1 14131:O2|@14081,@14132 14132:O2|@14082,@14133 14133:O2|@14134,0 14134:O2|@5723,1 14135:O3|2,@14136,@14099 14136:O3|3,@14137,@1827 14137:O2|@14092,@14138 14138:O2|@14093,@14139 14139:O2|@14140,0 14140:O2|51,@14097 14141:O2|@14143,@14142 14142:O2|@14144,0 14143:S9|72756e5f63616c6c34 14144:O4|@14310,69,@14145,0 14145:O7|@14143,2,@14147,@14146,@423,0,0 14146:O3|2,@501,@14160 14147:O2|1,@14148 14148:O2|7,@14149 14149:O8|@14150,@14143,0,0,@470,0,1,1 14150:O3|10,@14039,@14151 14151:O2|7,@14152 14152:O8|@14154,@14153,0,@14044,@470,0,0,1 14153:S12|72756e5f63616c6c34283129 14154:O4|3,@14155,@1109,1 14155:O2|@14081,@14156 14156:O2|@14082,@14157 14157:O2|@14134,@14158 14158:O2|@14159,0 14159:O2|@5725,1 14160:O3|2,@14162,@14161 14161:O3|6,@14550,79992 14162:O3|3,@14163,@5758 14163:O2|@14092,@14164 14164:O2|@14093,@14165 14165:O2|@14140,@14166 14166:O2|@14167,0 14167:O2|52,@14099 14168:O2|@14170,@14169 14169:O2|@14171,0 14170:S9|72756e5f63616c6c35 14171:O4|@14310,69,@14172,0 14172:O7|@14170,2,@14174,@14173,@423,0,0 14173:O3|2,@501,@14189 14174:O2|1,@14175 14175:O2|7,@14176 14176:O8|@14177,@14170,0,0,@470,0,1,1 14177:O3|10,@14039,@14178 14178:O2|7,@14179 14179:O8|@14181,@14180,0,@14044,@470,0,0,1 14180:S12|72756e5f63616c6c35283129 14181:O4|3,@14182,@1109,1 14182:O2|@14081,@14183 14183:O2|@14082,@14184 14184:O2|@14134,@14185 14185:O2|@14159,@14186 14186:O2|@14187,0 14187:O2|@14188,1 14188:O4|6,@472,4,0 14189:O3|2,@14191,@14190 14190:O3|6,@14551,79992 14191:O3|3,@14192,@11754 14192:O2|@14092,@14193 14193:O2|@14093,@14194 14194:O2|@14140,@14195 14195:O2|@14167,@14196 14196:O2|@14197,0 14197:O2|53,@14161 14198:O2|@14200,@14199 14199:O2|@14201,0 14200:S6|546872656164 14201:O4|@14310,69,@14202,0 14202:O7|@14200,0,@14203,@13946,@423,0,0 14203:O2|1,@1281 14204:O2|@14206,0 14205:S4|53697a65 14206:O4|@14310,69,@14207,0 14207:O7|@14205,0,@14208,@7393,@423,0,0 14208:O2|1,@1246 14209:D2,32|00801a2300100e0e000000000000000010000000000000000000000000000000|@2161,@2160| 14210:O2|@868,@14211 14211:O2|@14212,0 14212:O4|@14310,69,@10595,0 14213:O2|@1674,@14214 14214:O2|@14215,0 14215:O4|@14314,69,@14216,0 14216:O2|@1672,0 14217:O2|@7370,@14218 14218:O2|@14220,@14219 14219:O2|@14245,0 14220:O4|@14314,69,@14221,0 14221:O2|@11916,@14222 14222:O2|@14223,0 14223:O7|@7370,@541,@14225,@14224,@423,0,0 14224:O3|2,@14243,@14242 14225:O2|1,@14226 14226:O3|14,@14227,0 14227:O2|@14229,@14228 14228:O2|@14232,@14231 14229:O2|7,@14230 14230:O8|@475,@7370,0,0,@470,0,0,1 14231:O2|@14238,0 14232:O2|7,@14233 14233:O8|@14234,@7370,0,0,@470,0,0,1 14234:O4|3,@14235,@6867,1 14235:O2|@13879,@14236 14236:O2|@14237,@551 14237:O2|@6866,1 14238:O2|7,@14239 14239:O8|@14240,@7370,0,0,@470,0,0,1 14240:O4|3,@14241,@2587,1 14241:O2|@538,@2589 14242:O5|5,@14244,@7370,@11916,@423 14243:O3|6,@14552,79992 14244:O2|@14243,0 14245:O4|@14310,69,@14223,0 14246:O2|@958,@14247 14247:O2|@14248,0 14248:O4|@14314,69,@14249,0 14249:O2|@957,0 14250:O2|61,@14251 14251:O2|@14252,0 14252:O4|@14310,69,@14253,0 14253:O7|61,2,@14255,@14254,@423,0,0 14254:O3|2,@14256,@426 14255:O2|3,2 14256:O3|3,@14257,@428 14257:O2|@14259,@14258 14258:O2|@14261,0 14259:O2|49,@14260 14260:O3|6,@14553,79996 14261:O2|50,@14260 14262:O2|@1684,@14263 14263:O2|@14264,0 14264:O4|@14314,69,@14265,0 14265:O2|@1682,0 14266:O2|@876,@14267 14267:O2|@14268,0 14268:O4|@14310,69,@10602,0 14269:O2|@2070,@14270 14270:O2|@14271,0 14271:O4|@14310,69,@10186,0 14272:O2|@511,@14273 14273:O2|@14274,0 14274:O4|@14314,69,@14275,0 14275:O2|@510,0 14276:O2|@438,@14277 14277:O2|@14278,0 14278:O4|@14314,69,@14279,0 14279:O2|@437,@14280 14280:O2|@462,@14281 14281:O2|@680,0 14282:O2|@14283,0 14283:O4|@14314,69,@14284,0 14284:O2|@502,0 14285:O2|@14562,@14563 14286:S7|3c737464696e3e 14289:MO1|@4 14290:MO1|1 14291:MO1|0 14292:MO1|0 14293:MO1|0 14294:MO1|@82 14295:MO1|@90 14296:MO1|@102 14297:MO1|0 14298:MO1|@141 14299:MO1|@170 14300:MO1|0 14301:MO1|@241 14302:MO1|@353 14303:MO1|2 14304:MO1|0 14305:MO1|0 14306:MO1|@14309 14307:MO1|@405 14308:MO1|38 14309:MO81|80,0,0,0,0,0,0,0,@413,0,@453,@458,@476,0,@491,@657,0,0,0,@670,@676,0,@688,0,0,0,@12649,@12655,0,0,0,0,0,0,@12661,0,@12690,0,0,0,0,@12696,@12699,@12703,@12707,@12711,@12715,@12719,@13807,0,0,0,0,@13811,@13816,@13906,@13910,@13914,@14210,@14213,@14217,@14246,@14250,@14262,0,@14266,0,0,0,0,0,0,0,0,0,0,0,@14269,@14272,@14276,@412 14310:MO1|@418 14311:MO1|@433 14312:MO1|@444 14313:MO1|1 14314:MO1|@418 14315:MO1|@487 14316:MO1|0 14317:MO1|@444 14318:MO1|1 14319:MO1|@444 14320:MO1|@418 14321:MO1|@418 14322:MO1|@592 14323:MO1|1 14324:MO1|@588 14325:MO1|@418 14326:MO1|@14329 14327:MO1|@405 14328:MO1|35 14329:MO81|80,@698,@765,0,0,0,0,0,0,@949,0,@964,@985,@1156,0,0,0,@1228,0,@1264,@1284,0,@5680,0,@5691,0,@5775,0,@11278,0,0,0,0,@11297,@11961,@11969,0,0,0,0,@11990,0,@12029,0,@12033,@12050,@12053,0,0,0,0,@12065,0,0,@12148,@12151,@12270,@12273,@12276,0,@12279,@12282,@12626,0,0,0,@12633,@12636,@12639,0,0,0,0,0,0,0,@12643,0,0,0,@697 14330:MO1|@760 14331:MO1|0 14332:MO1|@850 14333:MO1|@859 14334:MO1|@881 14335:MO1|0 14336:MO1|1 14337:MO1|0 14338:MO1|@14341 14339:MO1|@1292 14340:MO1|7 14341:MO11|10,@1295,@2163,0,@2167,@5355,@5503,0,0,@5561,@1294 14342:MO1|@14345 14343:MO1|@1303 14344:MO1|4 14345:MO11|10,0,@1306,0,@2132,0,0,0,@2143,0,@1305 14346:MO1|@1339 14347:MO1|@1365 14348:MO1|0 14349:MO1|@418 14350:MO1|@418 14351:MO1|@418 14352:MO1|0 14353:MO1|@1679 14354:MO1|1 14355:MO1|@444 14356:MO1|1 14357:MO1|@444 14358:MO1|0 14359:MO1|0 14360:MO1|1 14361:MO1|1 14362:MO1|1 14363:MO1|1 14364:MO1|@760 14365:MO1|0 14366:MO1|@760 14367:MO1|0 14368:MO1|@760 14369:MO1|0 14370:MO1|@760 14371:MO1|0 14372:MO1|@760 14373:MO1|0 14374:MO1|@760 14375:MO1|0 14376:MO1|@2058 14377:MO1|1 14378:MO1|@14381 14379:MO1|@2175 14380:MO1|5 14381:MO11|10,@2178,@2182,0,@5310,0,0,0,0,@5320,@2177 14382:MO1|0 14383:MO1|0 14384:MO1|@418 14385:MO1|@418 14386:MO1|@418 14387:MO1|@418 14388:MO1|@418 14389:MO1|@418 14390:MO1|@418 14391:MO1|@418 14392:MO1|@418 14393:MO1|@418 14394:MO1|@418 14395:MO1|@418 14396:MO1|@418 14397:MO1|@418 14398:MO1|@418 14399:MO1|@418 14400:MO1|@418 14401:MO1|@418 14402:MO1|@418 14403:MO1|@418 14404:MO1|@418 14405:MO1|@418 14406:MO1|@418 14407:MO1|@418 14408:MO1|@418 14409:MO1|@4351 14410:MO257|256,2,1,2,2,1,2,1,2,1,2,3,7,1,3,1,1,1,3,7,3,3,3,9,3,3,3,3,3,2,1,2,2,3,2,2,2,2,2,2,2,2,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,4,5,5,1,1,1,1,1,1,2,2,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,5,2,2,1,1,2,2,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,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 14411:MO1|213 14412:MO257|256,@4901,@4902,@4903,@4904,@4905,@4906,@4907,@4908,@4909,@4910,@4911,@4912,@4913,@4914,@4915,@4916,@4917,@4918,@4919,@4920,@4921,@4922,@4923,@4924,@4925,@4926,@4927,@4928,@4929,@4930,@4931,@4932,@4933,@4934,@4935,@4936,@4937,@4938,@4939,@4940,@4941,@4942,@4943,@4944,@4945,@4946,@4947,@4948,@4949,@4950,@4951,@4952,@4953,@4954,@4955,@4956,@4957,@4958,@4959,@4960,@4961,@4962,@4963,@4964,@4965,@4966,@4967,@4968,@4969,@4970,@4971,@4972,@4973,@4974,@4975,@4976,@4977,@4978,@4979,@4980,@4981,@4982,@4983,@4984,@4985,@4986,@4987,@4988,@4989,@4990,@4991,@4992,@4993,@4994,@4995,@4996,@4997,@4998,@4999,@5000,@5001,@5002,@5003,@5004,@5005,@5006,@5007,@5008,@5009,@5010,@5011,@5012,@5013,@5014,@5015,@5016,@5017,@5018,@5019,@5020,@5021,@5022,@5023,@5024,@5025,@5026,@5027,@5028,@5029,@5030,@5031,@5032,@5033,@5034,@5035,@5036,@5037,@5038,@5039,@5040,@5041,@5042,@5043,@5044,@5045,@5046,@5047,@5048,@5049,@5050,@5051,@5052,@5053,@5054,@5055,@5056,@5057,@5058,@5059,@5060,@5061,@5062,@5063,@5064,@5065,@5066,@5067,@5068,@5069,@5070,@5071,@5072,@5073,@5074,@5075,@5076,@5077,@5078,@5079,@5080,@5081,@5082,@5083,@5084,@5085,@5086,@5087,@5088,@5089,@5090,@5091,@5092,@5093,@5094,@5095,@5096,@5097,@5098,@5099,@5100,@5101,@5102,@5103,@5104,@5105,@5106,@5107,@5108,@5109,@5110,@5111,@5112,@5113,@5114,@5115,@5116,@5117,@5118,@5119,@5120,@5121,@5122,@5123,@5124,@5125,@5126,@5127,@5128,@5129,@5130,@5131,@5132,@5133,@5134,@5135,@5136,@5137,@5138,@5139,@5140,@5141,@5142,@5143,@5144,@5145,@5146,@5147,@5148,@5149,@5150,@5151,@5152,@5153,@5154,@5155,@4900 14413:MO1|@5262 14414:MO1|@760 14415:MO1|0 14416:MO1|@14419 14417:MO1|@5363 14418:MO1|11 14419:MO21|20,@5365,@5386,0,0,0,@5399,0,0,@5410,@5420,@5430,0,0,@5443,0,@5453,0,@5475,@5479,@5364 14420:MO1|@760 14421:MO1|0 14422:MO1|@14425 14423:MO1|@5511 14424:MO1|4 14425:MO11|10,@5514,@5537,0,@5541,0,0,0,0,0,@5513 14426:MO1|@14429 14427:MO1|@5569 14428:MO1|3 14429:MO11|10,0,@5572,0,@5581,0,@5571,0,0,0,0 14430:MO1|@14433 14431:MO1|@5602 14432:MO1|5 14433:MO11|10,0,@5605,0,@5642,0,0,0,@5652,@5662,@5604 14434:MO1|@588 14435:MO1|@418 14436:MO1|0 14437:MO1|@418 14438:MO1|@6125 14439:MO1|@433 14440:MO1|@8776 14441:MO1|@6909 14442:MO1|@6932 14443:MO1|0 14444:MO1|@7539 14445:MO1|@7497 14446:MO1|@8189 14447:MO1|@7803 14448:MO1|@418 14449:MO1|@7825 14450:MO1|@8047 14451:MO1|@8060 14452:MO1|@8185 14453:MO1|@8187 14454:MO1|@8606 14455:MO1|@8944 14456:MO1|@9046 14457:MO1|@8986 14458:MO1|@9012 14459:MO1|@9015 14460:MO1|@9038 14461:MO1|@9157 14462:MO1|@9075 14463:MO1|@9102 14464:MO1|@418 14465:MO1|0 14466:MO1|0 14467:MO1|0 14468:MO1|0 14469:MO1|0 14470:MO1|@9756 14471:MO1|0 14472:MO1|32 14473:MO1|I48 14474:MO1|48 14475:MO1|0 14476:MO1|41 14477:MO1|@588 14478:MO1|0 14479:MO1|0 14480:MO1|0 14481:MO1|0 14482:MO1|@588 14483:MO1|@760 14484:MO1|0 14485:MO1|@14488 14486:MO1|@11305 14487:MO1|27 14488:MO41|40,@11307,@11356,@11405,@11436,0,0,@11502,@11529,@11551,@11575,@11595,0,0,@11608,0,@11634,0,0,@11645,0,@11671,0,0,@11675,@11683,@11787,@11791,@11794,@11798,@11801,@11805,@11832,@11850,0,@11853,@11857,@11860,0,0,@11306 14489:MO1|@760 14490:MO1|0 14491:MO1|@760 14492:MO1|0 14493:MO1|@760 14494:MO1|0 14495:MO1|@760 14496:MO1|0 14497:MO1|@760 14498:MO1|0 14499:MO1|@760 14500:MO1|0 14501:MO1|@760 14502:MO1|0 14503:MO1|@11927 14504:MO1|@588 14505:MO1|@588 14506:MO1|@588 14507:MO1|@14510 14508:MO1|@11305 14509:MO1|27 14510:MO41|40,@12291,@12318,@12334,@12360,@12373,@12390,@12394,@12414,0,@12422,@12432,0,@12439,0,0,0,0,@12450,0,0,@12463,@12479,0,@12497,@12504,@12515,0,0,@12519,@12532,@12543,@12556,@12565,0,0,@12569,@12579,@12596,@12607,@12290 14511:MO1|@760 14512:MO1|0 14513:MO1|@760 14514:MO1|0 14515:MO1|@588 14516:MO1|@11927 14517:MO1|@14520 14518:MO1|@405 14519:MO1|41 14520:MO81|80,@12728,@12782,@12814,@12831,0,0,0,@12848,0,@12862,0,@12876,@12890,@12924,@12982,@12996,0,0,0,0,0,0,0,@13010,@13024,@13038,@13052,@13066,0,0,0,@13167,@13410,@13424,0,0,0,0,0,0,@13452,@13467,@13475,@13489,@13504,@13518,@13532,@13544,0,0,@13558,0,@13584,0,0,@13598,@13612,0,0,0,@13619,0,@13633,0,@13645,@13652,@13710,@13738,0,0,0,@13753,@13767,@13781,0,0,0,@12727,0,0 14521:MO1|@12753 14522:MO1|0 14523:MO1|@12939 14524:MO1|1 14525:MO1|0 14526:MO1|0 14527:MO1|@11927 14528:MO1|@13643 14529:MO1|1 14530:MO1|@14533 14531:MO1|@13660 14532:MO1|5 14533:MO11|10,0,@13663,@13678,0,0,@13682,@13694,0,0,@13662 14534:MO1|@588 14535:MO1|@444 14536:MO1|@13834 14537:MO1|1 14538:MO1|@14541 14539:MO1|@11305 14540:MO1|23 14541:MO41|40,0,0,@13923,@13929,0,@13941,0,0,0,0,0,@13948,@13953,0,0,0,0,@13960,@13965,@13972,0,@13982,0,0,@13987,@13999,@14005,@14017,@14022,@14028,@14049,@14061,@14100,@14117,@14141,@14168,0,0,@14198,@13922 14542:MO1|@588 14543:MO1|@588 14544:MO1|@588 14545:MO1|@588 14546:MO1|@588 14547:MO1|@588 14548:MO1|@588 14549:MO1|@588 14550:MO1|@588 14551:MO1|@588 14552:MO1|@588 14553:MO1|@588 14554:MVO1|0 14555:MVO1|1 14556:MVO1|0 14557:MVO1|1 14558:MVO1|@31 14559:MVO1|1 14560:MVO1|0 14561:MVO1|1 14562:MVO1|1 14563:MVO1|@350 14564:MVO1|1 14565:MVO1|@380 14566:MVO1|1 14567:MVO1|1 14568:MVO1|1 14287:MB4096|4372656174656420737472756374757265204d4c436f6d70696c65720a73696f6e0a0a69670a670a540a46554e4354494f4e530a202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 14288:MB4096|20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 polyml-5.6/imports/polymlx86_64.txt000066400000000000000000174272231265146633400173650ustar00rootroot00000000000000Objects 20299 Root 0 0:O1|@1 1:D5,656|483b65187303ff554848b808b019f1a37f0000488b009090ff158a020000ff750848b8d60106c9a37f00005048896508ff750848b8220106c9a37f0000504889650848b800c306c9a37f0000ff155e0200004889c148b8002a28c9a37f00004889ca9090ff12ff750848b8b60006c9a37f0000504889650848c7c30100000048c7c02700000048bad0b3dc0000000000ff124883c4085948894d08eb2190488b65084883c4085b48895d0848c7c00100000048ba908edc0000000000ff12ff750848b9060106c9a37f000051488965084889c148c7c0010000004889ca909090ff124883c4085848894508eb0e90488b65084883c4085b48895d08483b65187303ff5548e95dffffff90488b65084883c4085b48895d08ff750848b86a0106c9a37f0000504889650848c7c30100000048c7c02700000048bad0b3dc0000000000909090ff124883c4085948894d08eb2190488b65084883c4085b48895d0848c7c00300000048ba908edc0000000000ff12ff750848b9ba0106c9a37f000051488965084889c148c7c0010000004889ca909090ff124883c4085848894508eb0e90488b65084883c4085b48895d08483b65187303ff5548e95affffff90488b65084883c4085b48895d0848c7c00300000050ff750848b8260206c9a37f0000504889650848c7c30100000048c7c02700000048bad0b3dc0000000000909090ff124883c4085948894d08eb2190488b65084883c4085b48895d08488b042448ba908edc0000000000909090ff12ff750848b9760206c9a37f000051488965084889c148c7c0010000004889ca909090ff124883c4085848894508eb0e90488b65084883c4085b48895d08483b65187303ff5548e95affffff9090909090909000000000000000008802000000000000|@15445,2097151,@20020,@15444,@14426|11,0,@20022 35,0,$1+446 53,0,$1+266 68,0,@371 87,0,@15441 107,0,$1+158 136,0,I150 180,0,I1 195,0,$1+238 284,0,$1+338 313,0,I150 360,0,I1 375,0,$1+418 472,0,$1+526 501,0,I150 545,0,I1 563,0,$1+606 2:O2|@4,@3 3:O2|@8,@7 4:O2|@5,@20284 5:D3,40|488b520848c7020100000048c7c001000000c3909090909000000000000000002000000000000000|@6,5,@15447| 6:S19|466f726569676e4d656d6f72792e5f2d283129 7:O2|@247,@246 8:O1|@9 9:D6,280|483b65187303ff5548ff750848b8720406c9a37f0000504889650849c7c00100000048c7c30100000048c7c001000000ff15fa00000048c7c1ffffffff483348084883c1014883e105480b08498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848b9200506c9a37f00004889084889c348c7c00f00000048ba90a0dc0000000000909090ff1248c7c0010000004883c4085948894d08c3909090488b65084883c4085b48895d08488338197408488b5d089090ff1348b848f020f9a37f0000488b0048bb581606c9a37f0000ff155600000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000ff253d000000909090909000000000000000001001000000000000|@217,2097151,@15480,@17,@218,@179|14,0,$9+170 114,0,@10 137,0,I73 199,0,@20288 212,0,@59 228,0,@20288 245,0,@60 10:O1|@11 11:D5,352|483b65187303ff554848c7c30100000048c7c00300000048bad09ddc0000000000909090ff124883f801756c48b818f020f9a37f0000488b004883f803753948b918f020f9a37f00004833c04883c0fef0480fc1014883c0fe4883f801751948c7c30300000048c7c001000000909090ff1502010000eb6e49c7c00100000048c7c30100000048c7c001000000909090ff15ea000000eb05e96700000048c7c1ffffffff483348084883c1014883e105480b08498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848b9c80606c9a37f0000488908eb05e9500000004889c348c7c00f00000048ba90a0dc000000000090ff12eb37ff750848b95e0606c9a37f00005148896508488b4808488b104889c8ff124883c4085848894508eb0e90488b65084883c4085b48895d08483b65187303ff5548e9c0feffff9090909090909000000000000000005801000000000000|@23,2097151,@15450,@14,@17|25,0,I62 46,0,@20285 65,0,@20285 217,0,@12 247,0,I73 265,0,$11+302 12:O1|@13 13:D4,40|483b65187303ff554848c7c301000000ff252a000000909000000000000000002000000000000000|@15,2097151,@15448,@14| 14:D3,840|483b65187303ff55484883fb01756f48c7c00100000048b918f020f9a37f0000488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebb848b918f020f9a37f00004833c04883c0fef0480fc1014883c0fe4883f801eb05e92d000000742b48bb18f020f9a37f000048c7c00300000048ba90a0dc0000000000ff12483b65187303ff5548e95fffffff488b4578488b40084883e00d4883f801750948c7c005000000eb294883f805750948c7c007000000eb1a4883f809740948c7c001000000eb0748c7c0030000004883f0024883f8057418488b4d78488b5578488b52084883e2f34883ca05488951085048c7c00100000048b928f020f9a37f0000488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebb848b928f020f9a37f00004833c04883c0fef0480fc1014883c0fe4883f801742e48bb28f020f9a37f000048c7c00300000048ba90a0dc0000000000909090ff12483b65187303ff5548e963ffffff48b838f020f9a37f0000488b00a8017525ff7008488b1848c7c00900000048ba90a0dc0000000000ff1258483b65187303ff5548ebd748c7c00100000048b938f020f9a37f000048890148b928f020f9a37f00004833c04883c002f0480fc1014883c0024883f803743848b828f020f9a37f000048ba909fdc00000000009090ff1248bb28f020f9a37f000048c7c00500000048ba90a0dc0000000000909090ff12488b457848833c2403742948833c2401741948833c2407740948c7c101000000eb1948c7c105000000eb1048c7c109000000eb0748c7c10d000000488b5578488b52084883e2f3480bca4889480848833c2401740748833c24037528488b4578488b40184883f801741a48c7c30100000048c7c01700000048ba90a0dc0000000000ff1248b918f020f9a37f00004883c4084833c04883c002f0480fc1014883c0024883f803743548b818f020f9a37f000048ba909fdc00000000009090ff1248bb18f020f9a37f000048c7c00500000048ba90a0dc0000000000ff2248c7c001000000c39000000000000000004003000000000000|@16,2097151,@15449|24,0,@20285 96,0,@20285 135,0,@20285 152,0,I73 284,0,@20286 356,0,@20286 388,0,@20286 405,0,I73 434,0,@20287 464,0,I73 495,0,@20287 508,0,@20286 540,0,@20286 550,0,I69 564,0,@20286 581,0,I73 716,0,I73 728,0,@20285 764,0,@20285 774,0,I69 788,0,@20285 805,0,I73 15:S38|5369676e616c2e73696754687265616428312962726f6164436173745765616b283129283129 16:S35|5369676e616c2e73696754687265616428312962726f6164436173745765616b283229 17:D3,376|483b65187303ff5548a8017568488b08488339057512488b48084889c8483b65187303ff5548ebe148833903756f4883790803750948c7c20d000000eb274883790801750948c7c209000000eb174883790807740948c7c201000000eb0748c7c205000000480bd34c89c64883e60d4883fe01eb05e9ca0000007415488b480848b8b00c06c9a37f0000488b5d0890ff134c89c64883ce0d4c89c7eb05e9150000004989f04889de4889d3488b48084889c8e949ffffff4883790801753c4c89c24883e2034883fa017416488b480848b8b00c06c9a37f0000488b5d089090ff134c89c24883ca034c89c64989d0488b48084889c8e906ffffff4889da4883ca034c89c64883e6034883fe017417488b480848b8b00c06c9a37f0000488b5d08909090ff134c89c64883ce034c89c74989f04889de4889d3488b48084889c8e9bcfeffff498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c39090909000000000000000007001000000000000|@24,127,@15451|130,0,@18 209,0,@18 276,0,@18 18:O4|12,@20,@21,@19 19:O5|@22,216,0,216,0 20:S6|546872656164 21:S53|5468652073616d65206174747269627574652061707065617273206d6f7265207468616e206f6e636520696e20746865206c697374 22:S18|2e2f62617369732f5468726561642e736d6c 23:S19|5369676e616c2e736967546872656164283129 24:S38|5468726561642e5468726561642e6174747273546f576f7264283129636f6e76657274283329 25:O6|@26,@20024,@27,@20025,@20289,@20023 26:O2|4096,@15452 27:O14|@29,@30,@34,0,0,@36,0,@37,@45,@49,4096,0,@52,@28 28:O1|@56 29:S6|7374644f7574 30:O1|@31 31:O2|@32,I149 32:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c03b00000048ba909ddc0000000000ff229000000000000000003000000000000000|@33,2097151,@15453|29,0,I61 33:S50|4c696272617279494f537570706f72742e777261704f757446696c654465736372283529746578745072696d57722d283129 34:O2|@35,I149 35:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c00f00000048ba909ddc0000000000ff229000000000000000003000000000000000|@33,2097151,@15454|29,0,I61 36:O1|I149 37:O1|@38 38:O2|@39,I149 39:D3,200|483b65187303ff5548488b4810f600017416488b18f6c30174084883fb017d21eb06f643ff107419488b5808488b3048b8501106c9a37f0000488b5d089090ff13f64008017418488b700840f6c60174084883fe017d1eeb06f646ff107416488b700848b8501106c9a37f0000488b5d089090ff13498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f084c8b41084c89074989f8488b5a0848c7c01700000048ba909ddc0000000000ff2290900000000000000000c000000000000000|@44,2097151,@15455|49,0,@40 101,0,@40 172,0,I61 40:O4|11,@42,0,@41 41:O5|@43,153,0,153,0 42:S9|537562736372697074 43:S26|2e2f62617369732f4c696272617279537570706f72742e736d6c 44:S49|4c696272617279494f537570706f72742e777261704f757446696c65446573637228352977726974654172726179283129 45:O1|@46 46:O2|@47,I149 47:D3,208|483b65187303ff5548f600017416488b08f6c10174084883f9017d25eb06f641ff10741d488b4808488b5810488b3048b8501106c9a37f0000488b5d089090ff13f64008017417488b5808f6c30174084883fb017d23eb06f643ff10741b488b5808488b701048b8501106c9a37f0000488b5d08909090ff134883c110498d77e0483b75107303ff55404989f748c746f80300000048895e1048894e08488b481048890e4989f0488b5a0848c7c01700000048ba909ddc0000000000ff2290900000000000000000c800000000000000|@48,2097151,@15456|49,0,@40 104,0,@40 180,0,I61 48:S50|4c696272617279494f537570706f72742e777261704f757446696c6544657363722835297772697465566563746f72283129 49:O1|@50 50:O2|@51,I149 51:D3,96|483b65187303ff554849c7c001000000488b5a0848c7c03900000048ba909ddc0000000000909090ff12a80174084883f8017f10eb06f640ff10740848c7c001000000c348c7c003000000c39090909000000000000000005800000000000000|@33,2097151,@15457|29,0,I61 52:O1|@53 53:O3|@54,@38,@50 54:D3,120|483b65187303ff5548505248c7c001000000488b4a104889ca909090ff124883f8017435488b0424488b4808488b4424084889caff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c0010000004883c410c390909000000000000000007000000000000000|@55,1048575,@15458| 55:S40|5072696d494f28292e6175676d656e7457726974657228312977726974654172724e42272d283129 56:O3|@57,@46,@50 57:D3,120|483b65187303ff5548505248c7c001000000488b4a104889ca909090ff124883f8017435488b0424488b4808488b4424084889caff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c0010000004883c410c390909000000000000000007000000000000000|@58,1048575,@15459| 58:S40|5072696d494f28292e6175676d656e7457726974657228312977726974655665634e42272d283129 59:S31|556e61626c6520746f20637265617465207369676e616c207468726561640a 60:O1|@61 61:D5,752|483b65187303ff5548488b4808488b09488b50104883f901750848c7c001000000c3f64238017470498d5fe0483b5d107303ff55404989df48c743f80300000048bec01906c9a37f00004889731048bed81906c9a37f000048897308488b32488933498d7fd8483b7d107303ff55404989ff48c747f80400000049b8281a06c9a37f00004c89471848895f1048bb881a06c9a37f0000eb05e92400000048895f0848bb58b019f1a37f000048891f488b184c8b40084889f8488b5d08909090ff13488b5a38488b700848c7060100000048c7c701000000ff33ff30ff325157ff750848b8e61706c9a37f00005048896508488b442418a801740b40f6c7017405482bc77105ff5570ebf64883c001498d4ff0483b4d107303ff55404989cf48c741f8010000004889014989c84889fb488b442428ff15ce010000488b54243090ff124883c4085948894d08eb6490488b65084883c4085b48895d086a016a016a01488b08483b0da5010000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a084889e2eb05e9b700000048c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bbc01906c9a37f000048895a1048894208488b5c242848891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bbd05006c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff134889c1f6c1017410f6042401740a488d49ff48030c247105ff5570ebf1f6c101750af6442408017503ff5570483b4c2408750c48c7c0010000004883c428c3a8017410f6042401740a488d40ff480304247105ff5570ebf14889c74883c408483b65187303ff5548e904feffff9090909090900000000000000000e802000000000000|@177,1048575,@15473,@171,@20027|66,0,@62 80,0,@63 124,0,@65 142,0,@67 163,0,@20027 228,0,$61+334 416,0,@169 474,0,@62 510,0,@20027 526,0,@67 571,0,@170 62:S8|666c7573684f7574 63:O4|@20026,@64,0,0 64:S20|426c6f636b696e674e6f74537570706f72746564 65:O5|@66,514,0,515,0 66:S25|2e2f62617369732f426173696353747265616d494f2e736d6c 67:S2|496f 68:O1|@69 69:O1|@70 70:D3,976|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bab81e06c9a37f0000eb63488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48be68b019f1a37f0000488b36504889d84889f29090ff12488b0c24488b5108f6c201740d4883fa037d19eb0be9c4020000f642ff10740c48bbb81e06c9a37f0000eb68488b19f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b531048891648bf78b019f1a37f0000488b3f504889f04889faff12488b4c2408488b11488b5908f6c30174064883eb02710cff5570eb05e97c010000ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e48bf78b019f1a37f0000488b3f504889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048bab04f06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e04f06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f04e06c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8105006c9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f04e06c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8485006c9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9785006c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c30000000000000000c803000000000000|@168,1048575,@15472|34,0,@71 100,0,@20028 156,0,@71 222,0,@20029 313,0,@20029 360,0,@159 405,0,@152 446,0,@161 487,0,@152 528,0,@153 601,0,@152 642,0,@163 686,0,@152 727,0,@153 804,0,@152 845,0,@165 886,0,@167 71:O2|@72,0 72:O2|3,@73 73:S4|2e2e2e7d 74:O1|@75 75:D4,48|483b65187303ff55484c8b400848c7c301000000488b084889c8ff252800000000000000000000002800000000000000|@115,1048575,@15470,@76| 76:D3,6240|483b65187303ff5548f60001745948833805755841f6c00174084983f8037f15eb0741f640ff10740c48b8f83706c9a37f0000eb6d41f6c00174064983e8027105ff5570ebf541f6c00174084983f8017d1feb0741f640ff10741648b8283806c9a37f0000eb6ce994140000e985040000488b48104c89c2f6c20174064883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f802000000eb05e98a01000048895308488b1148891348be78b019f1a37f0000488b364150514889d84889f290ff12595af6c201740deb05e9f50000004883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b490848890b48b998b019f1a37f0000488b09505348b8704d06c9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04e06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8284f06c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c7000100000048833801754ff6402001754e488b48204883790801745b488b1148833a07755748817a08b7000000745e48817a08f7000000745948837a08517457498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c6010000e92a01000048bec04e06c9a37f000048897308488903eb0ae9a9010000e977000000498d77e8483b75107314eb0fe993010000e98e010000e989010000ff55404989f748c746f80200000048895e0848bb284f06c9a37f000048891e498d47d0483b45107303ff55404989c748c740f8050000004889702048c740180100000048c740100300000048c740080700000048c70001000000eb70498d5fe8483b5d107303ff55404989df48c743f80200000048bec04e06c9a37f000048897308488903498d77e8483b75107303ff55404989f748c746f80200000048895e0848bb284f06c9a37f000048891e498d47d0483b45107303ff55404989c748c740f80500000048897020eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04e06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9284f06c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889482048c740180100000048c740100300000048c740080700000048c70001000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9404f06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8604f06c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c348833815756d41f6c00174064983e8027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004c894108488b501048891148bb78b019f1a37f0000488b1bff70084889c84889da9090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108eb05e9b602000048c7010700000048833801754ff6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c348833819757241f6c00174064983e8027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004c894108488b501048891148bb78b019f1a37f0000488b1bff70084889c84889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000eb05e9af02000048833801754ff6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c34883382f757241f6c00174064983e8027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004c894108488b501048891148bb78b019f1a37f0000488b1bff70084889c84889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000eb05e9af02000048833801754ff6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c3488138cf000000757341f6c00174064983e8027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004c894108488b501048891148bb78b019f1a37f0000488b1bff70084889c84889da90ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000eb05e9af02000048833801754ff6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c348833811757241f6c00174064983e8027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004c894108488b501048891148bb78b019f1a37f0000488b1bff70084889c84889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000eb05e9af02000048833801754ff6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c3488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c3488b08488b09f6c101756b41f6c00174064983e8027105ff5570ebf5488b5008488b5810498d47e8483b45107303ff55404989c748c740f8020000004c89400848891852488b1190ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000488338017556eb05e9a9020000f6402001754e488b502048837a0801745b488b1a48833b07755748817b08b7000000745e48817b08f7000000745948837b08517457498d77e8483b75107303ff55404989f748c746f802000000eb0ae9c6010000e92a01000048bfc04e06c9a37f000048897e08488906eb0ae9a9010000e977000000498d7fe8483b7d107314eb0fe993010000e98e010000e989010000ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f8050000004889782048c740180100000048c740100300000048c740080700000048c70001000000eb70498d77e8483b75107303ff55404989f748c746f80200000048bfc04e06c9a37f000048897e08488906498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848be284f06c9a37f0000488937498d47d0483b45107303ff55404989c748c740f80500000048897820eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d57e8483b55107303ff55404989d748c742f80200000048bbc04e06c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba284f06c9a37f00004889104889c2498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889502048c740180100000048c740100300000048c740080700000048c70001000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba404f06c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000c3488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c39090909000000000000000005818000000000000|@158,1048575,@15471|43,0,@77 93,0,@79 179,0,@20029 264,0,@20031 279,0,@144 332,0,@150 377,0,@152 418,0,@153 491,0,@154 658,0,@150 732,0,@154 830,0,@150 875,0,@154 980,0,@150 1025,0,@154 1158,0,@155 1199,0,@156 1330,0,@20029 1494,0,@150 1568,0,@154 1666,0,@150 1711,0,@154 1816,0,@150 1861,0,@154 1994,0,@155 2144,0,@20029 2306,0,@150 2380,0,@154 2478,0,@150 2523,0,@154 2628,0,@150 2673,0,@154 2806,0,@155 2956,0,@20029 3118,0,@150 3192,0,@154 3290,0,@150 3335,0,@154 3440,0,@150 3485,0,@154 3618,0,@155 3771,0,@20029 3934,0,@150 4008,0,@154 4106,0,@150 4151,0,@154 4256,0,@150 4301,0,@154 4434,0,@155 4584,0,@20029 4746,0,@150 4820,0,@154 4918,0,@150 4963,0,@154 5068,0,@150 5113,0,@154 5246,0,@155 5590,0,@150 5664,0,@154 5762,0,@150 5807,0,@154 5912,0,@150 5957,0,@154 6090,0,@155 77:O2|3,@78 78:S3|2e2e2e 79:O2|@80,0 80:O2|3,@81 81:S4|2e2e2e29 82:O1|@83 83:D5,176|483b65187303ff554848bb683906c9a37f0000488b009090ff15aa000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba604106c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c700450000009090ff155e0000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c3909090909090900000000000000000a800000000000000|@115,1048575,@15463,@116,@109|11,0,@84 56,0,@108 84:O1|@85 85:D6,360|483b65187303ff55484881f8b9000000750b48b8203b06c9a37f0000c34883f845750b48b8383b06c9a37f0000c34883f84372094881f8fd000000765b4883f841745a4883f80f750b48b8503b06c9a37f0000c34883f811750b48b8683b06c9a37f0000c34883f813750b48b8803b06c9a37f0000c34883f815750b48b8983b06c9a37f0000c34883f817751548b8b03b06c9a37f0000c3e9b5000000e9b00000004883f819750b48b8c83b06c9a37f0000c34883f81b750b48b8e03b06c9a37f0000c34883f8417362a80174094881c0800000007105ff5570ebf2a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1eeb06f640ff1075164889c148b8f83b06c9a37f0000488b5d08909090ff134889c348b8903c06c9a37f0000ff255400000049c7c01500000048c7c3070000009090ff15460000004889c348c7c0b9000000ff253e000000c3909090909000000000000000006001000000000000|@104,2097151,@15460,@100,@105,@100|20,0,@86 37,0,@87 75,0,@88 92,0,@89 109,0,@90 126,0,@91 143,0,@92 170,0,@93 187,0,@94 264,0,@95 286,0,@99 86:S2|5c5c 87:S2|5c22 88:S2|5c61 89:S2|5c62 90:S2|5c74 91:S2|5c6e 92:S2|5c76 93:S2|5c66 94:S2|5c72 95:O4|@20030,@97,0,@96 96:O5|@98,268,0,268,0 97:S3|436872 98:S18|2e2f62617369732f537472696e672e736d6c 99:S2|5c5e 100:D3,392|a801740948c7c103000000eb08488b08488d4c0901f6c301740948c7c203000000eb08488b13488d5412014883f90175044889d8c34883fa017501c34889ce488d76ff4803f24889f74883c71e48c1ef034883cf01483b3d2401000072134989c048b8583e06c9a37f0000488b5d08ff134989c84889f94889c748c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ee488937488d7436014983f80375114c89c848d1e848884708488d440001eb2b4c89ce4889f84889c74c89c148d1e94883c6084883c708f3a4488d7c3f01488d743601488d4c09014889c74883fa03751a4983c01049d1e848d1eb4a881c07488d5c1b014f8d440001eb364983c0104889de4889f84889c74889d148d1e94883c60849d1e84903f84f8d440001f3a4488d7c3f01488d743601488d4c09014889c7488067ffbf4889f8c390909090909000000000000000007801000000000000ffffffffffffff01|@107,255,@15462|99,0,@101 101:O4|4,@103,0,@102 102:O5|@43,182,0,182,0 103:S4|53697a65 104:S16|436861722e746f537472696e67283129 105:D4,520|483b65187303ff55484883fb01750b48b8509adc0000000000c3f6c30174064883eb027105ff5570ebf5a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c10300000041f6c00174084983f8017d12eb0741f640ff10740948c7c201000000eb0748c7c203000000483bca75054889c1eb5e4883fa0174334c89c1f6c10174064883e9027105ff5570ebf54889c2f6c201740af6c1017405482bd17105ff5570ebf64883c2014889d1eb384c89c1f6c10174064883c1027105ff5570ebf54889c2f6c2017411f6c101740c482bd1eb05e90e0000007105ff5570ebef4883c2014889d1415050534c89c34889c848ba90a9dc0000000000ff124c8b4424105b90e8f2feffff50488b5c2410488b44240848bad0a9dc000000000090ff124883f801745e488b4c2410f6c10174084883f9017d11eb06f641ff10740948c7c201000000eb0748c7c203000000a80174084883f8017d11eb06f640ff10740948c7c301000000eb0748c7c303000000483bd3741ea8017415f6c1017410488d40ffeb05e90a0000004803c17105ff5570ebeba80174064883c0607105ff5570ebf5a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1eeb06f640ff1075164889c148b8f83b06c9a37f0000488b5d08909090ff134889c3584883c410ff252d000000909090909000000000000000000002000000000000|@106,2097151,@15461,@100|17,0,I48 248,0,I109 283,0,I110 468,0,@95 106:S18|436861722e6f6374496e7452657072283329 107:S4|5e283229 108:O2|34,0 109:D4,624|a801756948837808017504488b00c34889c148c7c201000000f6c1017544488b3140f6c601740948c7c303000000eb08488b1e488d5c1b01f6c201740ef6c3017409488d52ff4803d37105ff5570ebf2488b59084889d9483b65187303ff5548ebb74889d14883f9017512eb05e9d501000048b8509adc0000000000c34883f9037564a80174164889c148b8184406c9a37f0000488b5d08909090ff13488b08483b0de10100007432f6c10175434889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017516488b4008483b6518730aeb05e909000000ff5548eb92488b00c3f6c1017413f6c10174084883f9017d1ceb06f641ff1074144889c248b8884406c9a37f0000488b5d0890ff134889ca4883c21e48c1ea034883ca01483b153101000072144889c348b8583e06c9a37f0000488b5d0890ff134889cb4889d14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1eb48891f488d5c1b0148c7c011000000f6c2017569488b1af6c301740948c7c103000000eb08488b0b488d4c09014883f903751648d1e848d1eb48881c07488d5c1b01488d440001eb3f4889de4989f84c89c74989c94c89c948d1e94883c60848d1e84803f8488d440001f3a4488d7c3f01488d743601488d4c0901eb05e9220000004c89c94c89c7488d40ff4803c1488b4a084889ca483b65187303ff5548e96bffffff488067ffbf4889f8c348b8509adc0000000000c390909090909000000000000000006002000000000000ffffffffffffff01|@118,255,@15465,I48|116,0,I48 140,0,@110 179,0,I48 274,0,@113 318,0,@101 585,0,I48 110:O4|103,@112,I48,@111 111:O5|@98,626,0,626,0 112:S4|4661696c 113:O4|4,@103,0,@114 114:O5|@43,148,0,148,0 115:S7|61646450502d31 116:D3,624|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c09014883f90375054889daff2248c7c20100000048c7c601000000505351483b3424746b4889f04883c0024883c610488b4c241048d1ee480fb63431488d74360152504889f0488b54241890ff12a801740948c7c103000000eb08488b08488d4c0901f6c1017412f644240801740b488d49ff48034c24087105ff5570ebf05e4883c4084889ca483b6518730aeb05e905000000ff5548eb85f6c2017413f6c20174084883fa017d18eb06f642ff10741048b8884406c9a37f0000488b5d08ff13483b142475064883c41058c34889d04883c01e48c1e8034883c801483b056901000072144889c148b8583e06c9a37f0000488b5d0890ff134889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ea488917488d54120148c7c01100000048c7c10100000057483b4c240874634889ca4883c210488b5c241848d1ea480fb61413488d54120150514889d0488b542420909090ff12a801740948c7c103000000eb08488b08488d4c09014883f9037525488b542410488b5c240848d1eb48d1e84888041a488d440001488d5c1b01eb3ee9610000004889c6488b7c24104889c84889c1488b54240848d1e94883c60848d1ea4803fa488d541201f3a4488d7c3f01488d743601488d4c09014889c1584883c002488d49ff48030c244889ca4889c14883c4084889d0483b65187303ff5548e930ffffff488b0424488060ffbf4883c420c39090909090909000000000000000006002000000000000ffffffffffffff01|@117,1048575,@15464|207,0,@113 262,0,@101 117:S19|537472696e672e746f537472696e6773283229 118:S16|537472696e672e636f6e636174283129 119:O1|@120 120:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba584806c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@143,7,@15467|29,0,@121 121:D3,624|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8f04a06c9a37f0000c348833801750b48b8204b06c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8f04a06c9a37f0000c3488b5208488b18f6c10174064883e9027105ff5570ebf5498d47e8483b45107303ff55404989c748c740f80200000048894808488b1b488918488b520890ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be184c06c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb484c06c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848be804c06c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8984c06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b84c06c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000006802000000000000|@142,1048575,@15466|34,0,@122 51,0,@124 81,0,@122 238,0,@132 317,0,@134 358,0,@136 491,0,@137 532,0,@138 122:O2|3,@123 123:S3|2e2e2e 124:O5|0,0,0,@126,@125 125:O2|@130,0 126:O2|@127,0 127:O2|0,@128 128:O5|@129,0,0,0,0 129:S14|5374616e64617264204261736973 130:O2|3,@131 131:S4|4e4f4e45 132:O2|@134,@133 133:O2|@135,0 134:O3|1,0,0 135:O2|3,41 136:O2|3,40 137:O3|1,1,0 138:O5|0,0,0,@126,@139 139:O2|@140,0 140:O2|3,@141 141:S4|534f4d45 142:S12|7072696e742d6f7074696f6e 143:S13|7072696e746f7074696f6e2829 144:O4|0,@145,3,1 145:O1|@146 146:D3,48|483b65187303ff554848b9a8b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@149,1048575,@15469|11,0,@20032 147:O1|@148 148:D3,96|483b65187303ff5548488b1848c7c00500000048bad0b3dc0000000000909090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c39090909090909000000000000000005800000000000000|@115,2097151,@15468|21,0,I150 149:S17|7072696e742d4f532e7379736572726f72 150:O2|@151,0 151:O2|3,41 152:O3|1,1,0 153:O2|3,44 154:O2|3,40 155:O3|1,1,1 156:O2|3,@157 157:S6|537973457272 158:S11|65786e5072696e74283329 159:O2|@160,0 160:O2|3,125 161:O2|3,@162 162:S6|6e616d65203d 163:O2|3,@164 164:S10|66756e6374696f6e203d 165:O2|3,@166 166:S7|6361757365203d 167:O2|3,123 168:S14|7072696e742d6c6162656c6c6564 169:S9|496e74657272757074 170:O5|@66,501,0,501,0 171:D3,320|41f6c001756cf6c3017413f6c30174084883fb017d1beb06f643ff1074134889c148b8501106c9a37f0000488b5d08ff1341f600017416498b08f6c10174084883f9017d1ceb06f641ff1074144889c148b8501106c9a37f0000488b5d0890ff134889da488d52ff4803d1483b10761deb05e93d0000004889c248b8685206c9a37f0000488b5d08909090ff134889c2498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c3f6c3017413f6c30174084883fb017d1deb06f643ff1074154889c148b8501106c9a37f0000488b5d089090ff13483b1876134889c148b8f85206c9a37f0000488b5d08ff13488b08482bcb4883c1014889c2498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c390909090909000000000000000003801000000000000|@178,79,@15474|35,0,@40 82,0,@40 124,0,@172 209,0,@40 235,0,@175 172:O4|11,@42,0,@173 173:O5|@174,111,0,111,0 174:S33|2e2f62617369732f566563746f72536c6963654f7065726174696f6e732e736d6c 175:O4|11,@42,0,@176 176:O5|@174,101,0,101,0 177:S28|426173696353747265616d494f28292e666c7573684f757427283129 178:S32|566563746f72536c6963654f7065726174696f6e7328292e736c696365283329 179:D3,1024|483b65187303ff5548488b4d78488b49084889ca4883e20d4883fa01741f488b557848c7c6f3ffffff4823f14883ce094889720848c7c201000000eb0748c7c201000000514150505348c7c001000000488b4c2410488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebbd488b4c24104833c04883c0fef0480fc1014883c0fe4883f80174264889cb48c7c00300000048ba90a0dc00000000009090ff12483b65187303ff5548e975ffffff48c7c001000000ff750848b8b65406c9a37f00005048896508488b442418488b54241090ff124883c4085948894d08eb5b90488b65084883c4085b48895d08488b5424104833c94883c102f0480fc10a4883c1024883f90374374889c14889d048ba909fdc00000000009090ff1251488b5c241848c7c00500000048ba90a0dc0000000000909090ff12eb06e9f101000050488b4578488b4c2420488948084883e1094883f9097529488b4578488b40184883f801741b48c7c30100000048c7c01700000048ba90a0dc000000000090ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048b9d85706c9a37f0000488908488b0c2448b8ffffffffffffff00482341f8488d4400014883f8097257488b4118a8017554498d57c0483b55107303ff55404989d748c742f805000000488b581048895a20488b702048897218488b780848897a104c8b40184c8942084c8b084c890a4c8d523049c742f801000000498912eb15e90900000049c7c201000000eb0749c7c20100000041f6c2017444498d47d8483b45107303ff55404989c748c740f80400000048ba406806c9a37f000048895018488b511048895010488b590848895808488b31488930488b5d089090ff13498b02498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c7020100000048bb706806c9a37f000048891a488b11488b5908488b4910498d77a8483b75107303ff55404989f748c746f805000000488b78184883c40848897e204c8b40084c8946184c8b48204c894e104c8b58104c895e084c8b204c89264c8d6e3049c745f8040000004989751849894d1049895d08498955004c89e848bad091dc00000000009090ff12488b5424104883c4104833c94883c102f0480fc10a4883c1024883f90374334889c14889d048ba909fdc0000000000909090ff1251488b5c240848c7c00500000048ba90a0dc0000000000909090ff12eb0150488b4578488b4c2410488948084883e1094883f909752a488b4578488b40184883f801741c48c7c30100000048c7c01700000048ba90a0dc00000000009090ff12584883c410c30000000000000000f803000000000000|@245,2097151,@15491|186,0,I73 224,0,$179+262 310,0,I69 337,0,I73 411,0,I73 459,0,@180 476,0,36028797018963967 639,0,@206 721,0,@207 842,0,I14 893,0,I69 921,0,I73 990,0,I73 180:O1|@181 181:D3,1480|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8d85d06c9a37f0000c348833801750b48b8f05d06c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8d85d06c9a37f0000c3488b10f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9283806c9a37f0000eb6a4889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e48bf78b019f1a37f0000488b3fff722051ff7218ff7210ff72084889f04889fa909090ff12488b4c2418f6c101740f4883f903eb05e9a90300007d14eb06f641ff10740c48b9283806c9a37f0000eb5bf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9b8b019f1a37f0000488b09504889d04889caff12488b4c2420f6c101740d4883f9057d19eb0be9b9020000f641ff10740c48b9283806c9a37f0000eb5df6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c241048890a48b9b8b019f1a37f0000488b09504889d04889ca90ff12488b4c2428f6c101740d4883f9077d19eb0be9cd010000f641ff10740c48b9283806c9a37f0000eb6cf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c242048890a48b9b8b019f1a37f0000488b09504889d04889ca90ff12488b4c2430f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e9d2000000ff55404989d748c742f80200000048894a08488b4c243848890a48b9b8b019f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04e06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c428488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9284f06c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8f04e06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9386706c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090900000000000000000c005000000000000|@205,1048575,@15478|34,0,@182 51,0,@183 81,0,@182 130,0,@79 195,0,@20029 263,0,@79 326,0,@20033 377,0,@79 441,0,@20033 493,0,@79 557,0,@20033 644,0,@20033 692,0,@150 737,0,@152 778,0,@153 857,0,@152 898,0,@153 977,0,@152 1018,0,@153 1097,0,@152 1138,0,@153 1218,0,@154 1343,0,@152 1384,0,@198 182:O2|3,@123 183:O5|0,0,0,@185,@184 184:O2|@189,0 185:O2|@186,0 186:O2|0,@187 187:O5|@188,40,40,0,0 188:S27|2e2f62617369732f506f6c794d4c457863657074696f6e2e736d6c 189:O2|3,@190 190:S10|4e6f4c6f636174696f6e 191:O1|@192 192:D4,96|483b65187303ff554848c7c303000000488b0048baa05f06c9a37f0000909090ff15520000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c390909000000000000000005800000000000000|@115,2097151,@15477,@194|21,0,@193 193:O9|@194,1152921504606846976,15,1000000000000000000,18,1152921504606846976,20,2305843009213693952,61 194:D5,696|483b65187303ff55486a016a016a014883fb0575224889e148c701210000004889e1488b5a08488959084889e1488b721048897110eb634883fb0375224889e148c701150000004889e1488b5a18488959084889e1488b722048897110eb4f4883fb0775224889e148c701110000004889e1488b5a28488959084889e1488b723048897110eb274889e148c701050000004889e1488b5a38eb05e90f000000488959084889e1488b724048897110a80174084883f8017c11eb06f640ff10750948c7c101000000eb0748c7c103000000a80174084883f8017c4ceb06f640ff107549a801740ef60424017408483b04247d53eb05ff5570ebf3a80174084883f8157d60eb06f640ff10745da80174064883c0607105ff5570ebf5a80174124883f8017d12eb2ae9ab000000e9a6000000f640ff10751aa80174104881f8ff0100007e2eeb0be98c000000f640ff1075214889c148b8f83b06c9a37f0000488b5d08eb0ae90e000000e9090000009090ff134883c418c3a80174094881c0820000007105ff5570ebf2a80174064883e8147105ff5570ebf5a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1beb06f640ff1075134889c148b8f83b06c9a37f0000488b5d08ff134883c418c3a80174084883f8017d28eb06f640ff10742048c7c201000000f6c2017409a8017405482bd07105ff5570ebf64883c201eb034889c26a016a01f6c201743451ff742420ff742430ff7424284c8d54242049c7c10100000049c7c00100000048c7c3010000004889d09090ff158a000000eb526a016a01514c8d442408488b5c24304889d048ba50a8dc0000000000ff12ff3424ff742438ff742448ff7424404c8d5424384c8b4c24584c8b44242848c7c301000000488b442430ff15420000004883c418488b0424488060ffbf4883c428c30000000000000000b002000000000000|@196,2097151,@15475,@195,@195|341,0,@95 451,0,@95 604,0,I104 195:D3,1000|483b65187303ff55484883f801755e4983f801755d48837c242001745a4883c3024889d84883c01e48c1e8034883c801483b05a903000072144889c148b8583e06c9a37f0000488b5d0890ff134889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107216eb0fe9e6010000e9de000000e94a000000493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1eb48891f488d5c1b01c647087e49893a49c742081300000048c7c001000000c220004889d84883c01e48c1e8034883c801483b05fc02000072134889c148b8583e06c9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1eb48891f488d5c1b0149893a49c742081100000048c7c001000000c22000488d5bff4903d96a016a0141f6c001743241524151ff742440ff742440ff742440ff7424404c8d54243049c7c1010000004c89c049c7c00100000090e86afeffffeb56415241516a016a01534c89c04c8d442408488b5c245048ba50a8dc0000000000ff12ff742458ff742458ff742458ff7424584c8d5424484c8b4c24684c8b442428488b5c2420488b4424309090e816feffff4883c41848c7c001000000483b0424742d488b4c2418488d49ff4803c8488b54241048d1e948c6040a30488d4c09014883c002483b65187303ff5548ebcd488b442418488d40ff48030424488b4c24084883c408488b5424084889114889410848c7c0010000004883c418c220006a016a01415253415141504c8d442420488b5c243848ba50a8dc000000000090ff12488b442428a80174084883f8157d54eb06f640ff10744ca80174064883c0607105ff5570ebf5a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e5eeb06f640ff10755b4889c148b8f83b06c9a37f0000488b5d08909090ff13a80174094881c0820000007105ff5570ebf2a80174064883e8147105ff5570ebf5a80174084883f8017d08eb27f640ff107521a80174174881f8ff010000eb0ae923000000e91e0000007e1ceb06f640ff1075144889c148b8f83b06c9a37f0000488b5d0890ff13488b4c24104883c102488b5424084883ea026a016a0150ff742468ff742468ff742468ff7424684c8d5424284989d14c8b4424384889cb488b442458e87afcffff58488b0c24488b54240848d1ea48d1e848880411488d440001488d5412014883c202488b4424284889084889500848c7c0010000004883c440c220009090909090900000000000000000d003000000000000ffffffffffffff01ffffffffffffff01|@197,2097151,@15476|62,0,@101 227,0,@101 432,0,I104 623,0,I104 716,0,@95 822,0,@95 196:S10|496e742e666d74283229 197:S20|496e742e666d74283229746f4368617273283429 198:O5|0,0,0,@200,@199 199:O2|@203,0 200:O2|@201,0 201:O2|0,@202 202:O5|@188,41,41,0,0 203:O2|3,@204 204:S12|536f6d654c6f636174696f6e 205:S21|7072696e742d52756e74696d654c6f636174696f6e 206:O5|@188,83,0,83,0 207:O1|@208 208:D3,1480|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8d85d06c9a37f0000c348833801750b48b8706e06c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8d85d06c9a37f0000c3488b10f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9283806c9a37f0000eb6a4889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e48bf78b019f1a37f0000488b3fff722051ff7218ff7210ff72084889f04889fa909090ff12488b4c2418f6c101740f4883f903eb05e9a90300007d14eb06f641ff10740c48b9283806c9a37f0000eb5bf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9b8b019f1a37f0000488b09504889d04889caff12488b4c2420f6c101740d4883f9057d19eb0be9b9020000f641ff10740c48b9283806c9a37f0000eb5df6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c241048890a48b9b8b019f1a37f0000488b09504889d04889ca90ff12488b4c2428f6c101740d4883f9077d19eb0be9cd010000f641ff10740c48b9283806c9a37f0000eb6cf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c242048890a48b9b8b019f1a37f0000488b09504889d04889ca90ff12488b4c2430f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e9d2000000ff55404989d748c742f80200000048894a08488b4c243848890a48b9b8b019f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04e06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8104f06c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c428488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9284f06c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8f04e06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9006f06c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090900000000000000000c005000000000000|@205,1048575,@15479|34,0,@182 51,0,@209 81,0,@182 130,0,@79 195,0,@20029 263,0,@79 326,0,@20033 377,0,@79 441,0,@20033 493,0,@79 557,0,@20033 644,0,@20033 692,0,@150 737,0,@152 778,0,@153 857,0,@152 898,0,@153 977,0,@152 1018,0,@153 1097,0,@152 1138,0,@153 1218,0,@154 1343,0,@152 1384,0,@213 209:O5|0,0,0,@210,@184 210:O2|@211,0 211:O2|0,@212 212:O5|@188,68,68,0,0 213:O5|0,0,0,@214,@199 214:O2|@215,0 215:O2|0,@216 216:O5|@188,69,69,0,0 217:S20|5369676e616c2e666f726b546872656164283129 218:D14,696|483b65187303ff5548488b4828488b094883f9037559f6c301740948c7c103000000eb08488b0b488d4c09014883f901750948c7c101000000eb6b4889caf6c20174064883ea027105ff5570ebf5f6c20174084883fa017d08eb38f642ff107532f6c301740e48c7c603000000eb0de9d7010000488b33488d743601f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1a4889c648b8f07206c9a37f0000488b5d08eb05e941000000ff13f6c30174054889daeb114883c21048d1ea480fb61413488d5412014883fa15741ef6c10174064883e9027105ff5570ebf5483b65187303ff5548e940ffffff4883f9017559f6c301740948c7c103000000eb08488b0b488d4c0901498d57e0483b55107303ff55404989d748c742f80300000048894a1048c742080100000048891a52ff359a0100004c8b40204889e3909090ff15920100004883c410c3498d57f0483b55107303ff55404989d748c742f80100000048890a4889c74989d94989ca4989d048c7c3010000004c89c8ff155e010000498d4fe0483b4d107303ff55404989cf48c741f803000000488b500848895110488b1848895908488b701048893151ff353101000057415141524c8b4720488d5c24184889f8ff1522010000488b4424104c8b402048bb881606c9a37f0000909090ff150e01000049c7c0010000005b5890ff1506010000498d4fe0483b4d107303ff55404989cf48c741f803000000488b500848895110488b1848895908488b701048893151ff35d9000000488b4c24104c8b41204889e34889c89090ff15ca0000004883c428c3f6c301740948c7c103000000eb08488b0b488d4c0901498d57e0483b55107303ff55404989d748c742f80300000048894a1048c742080100000048891a52ff35890000004c8b40204889e39090ff15820000004883c410c390909090900000000000000000b002000000000000|@222,2097151,@15481,@223,@179,@240,@243,@179,@179,@240,@244,@179,@221,@179|152,0,@219 473,0,@60 219:O4|11,@42,0,@220 220:O5|@98,680,0,680,0 221:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@229,1048575,@15490,@224| 222:S29|54657874494f2e5465787453747265616d494f2e6f7574707574283229 223:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@229,1048575,@15482,@224| 224:D7,344|483b65187303ff5548488b4810488b5018488b124883fa037570498d57e0483b55107303ff55404989d748c742f80300000048bec87506c9a37f00004889721048bee07506c9a37f000048897208488b31488932498d7fd8483b7d107303ff55404989ff48c747f80400000049b8287606c9a37f00004c8947184889571048ba881a06c9a37f0000eb05e91e0000004889570848ba58b019f1a37f00004889174889c24889f8488b5d0890ff13488b10488b731040f6c601740cf602017407483b327e30eb05ff5570ebf456ff7308ff33509090ff15960000004c8b4c24184c8b442410488b5c2408584883c418ff2584000000488b7828488b3f4883ff0575134989f14c8b4308488b334889f3ff256c000000488b7b084c8b042448893c2452504c8b134989f14d89c34c8b02488b580848c7c0010000004153ff25470000009090909090909000000000000000005001000000000000|@233,1048575,@15483,@61,@234,@234,@230|52,0,@225 66,0,@226 110,0,@228 128,0,@67 149,0,@20027 225:S6|6f7574707574 226:O4|@20034,@227,0,0 227:S12|436c6f73656453747265616d 228:O5|@66,610,0,610,0 229:S34|426173696353747265616d494f28292e6f7574707574566563746f72283129283129 230:D7,1056|483b65187303ff5548488b034c89c1f6c1017409a8017405482bc87105ff5570ebf64883c10141f6c101740af6c10174054c3bc9eb05ff5570ebf67d6c488b03498d4ff0483b4d107303ff55404989cf48c741f8010000004c89094889df4989c34989c8488b5c24184c89d0ff15c6030000488b4c241041f6c301741541f6c30174084983fb017d2ceb0741f643ff107423488b5010488b18488b700848b8501106c9a37f0000eb05e9c9000000488b5d0890ff134c89da488d52ff48035008483b11761c488b5010488b18488b700848b8f87a06c9a37f0000488b5d0890ff13f640100174254d8d5bff4c0318488b4010488b510849d1eb48d1e84a88041a488d4400014f8d5c1b01eb43488b104883c210488b70104889fb488b7908488b480848d1e948d1ea4803f2488d54120149d1eb4903fb4f8d5c1b01f3a4488d7c3f01488d743601488d4c09014889df488b07a801740f41f6c1017409488d40ff4903c17105ff5570ebf248890748c7c001000000c21800488b0341f6c0017409a80174054c2bc07105ff5570ebf64983c001488b03498d4ff0483b4d107303ff55404989cf48c741f8010000004c89014889df4d89c34989c44989c8488b5c24184c89d0ff1576020000488b4c241041f6c401741641f6c40174084983fc017d28eb0841f64424ff10741e488b5010488b18488b700848b8501106c9a37f0000488b5d08909090ff134c89e2488d52ff48035008483b11761c488b5010488b18488b700848b8f87a06c9a37f0000488b5d0890ff13f640100174264d8d6424ff4c0320488b4010488b510849d1ec48d1e84a880422488d4400014f8d642401eb43488b104883c210488b70104889fb488b7908488b480848d1e948d1ea4803f2488d54120149d1ec4903fc4f8d642401f3a4488d7c3f01488d743601488d4c09014889df488b07a801740f41f6c3017409488d40ff4903c37105ff5570ebf248890757415141524153488b4424289090ff1572010000488b442438a8017410f6042401740a488d40ff480304247105ff5570ebf1488b4c2410f6c101740cf60424017406482b0c247105ff5570ebf54883c101498d57f0483b55107303ff55404989d748c742f80100000048890a4989d04889c3488b442408909090ff150e010000488b4c243048c7c201000000488d52ff48035008483b11761e488b5010488b18488b700848b8f87a06c9a37f0000488b5d08909090ff13f6401001742c48c7c201000000488d52ff480310488b4010488b590848d1ea48d1e848880413488d440001488d541201eb32488b104883c210488b7010488b7908488b480848d1e948d1ea4803f2488d541201f3a4488d7c3f01488d743601488d4c0901488b442410a801740cf60424017406482b04247105ff5570ebf54883c0014883c4185948890148c7c001000000c2180090909000000000000000001804000000000000|@242,1048575,@15487,@240,@240,@61,@240|159,0,@40 210,0,@231 504,0,@40 550,0,@231 872,0,@231 231:O4|11,@42,0,@232 232:O5|@98,1637,0,1637,0 233:S31|426173696353747265616d494f28292e6f7574707574566563746f72283229 234:D6,952|483b65187303ff5548488b4810f64140017570488b514048c7c601000000ff31ff32534150415156ff750848b83e7c06c9a37f0000504889650840f6c6017412f644242001740b488d76ff48037424207105ff5570ebf0488b442418a801740ef6442410017407482b4424107105ff5570ebf44883c001498d4ff0483b4d10730aeb05e9c2010000ff55404989cf48c741f8010000004889014989c84889f3488b442428ff1526030000488b54243090ff124883c4085948894d08eb6490488b65084883c4085b48895d086a016a016a01488b08483b0dfd020000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a084889e2eb05e9b700000048c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bbc87506c9a37f000048895a1048894208488b5c244048891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bb787f06c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff134889c1f6c1017410f6042401740a488d49ff48030c247105ff5570ebf1f6c101750af6442408017503ff5570483b4c2408750c48c7c0010000004883c430c3a8017410f6042401740a488d40ff480304247105ff5570ebf14889c64883c408483b65187303ff5548e9ddfdfffff64138017470498d57e0483b55107303ff55404989d748c742f80300000048bec87506c9a37f00004889721048bed81906c9a37f000048897208488b31488932498d7fd8483b7d107303ff55404989ff48c747f80400000049baa87f06c9a37f00004c8957184889571048ba881a06c9a37f0000eb05e91c0000004889570848ba58b019f1a37f00004889174889f8488b5d089090ff13488b5138488b0148c7c1050000004889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48c7c0010000004883f815731c48d1e848c6040720488d4400014883c002483b65187303ff5548ebde498d47e8483b45107303ff55404989c748c740f8020000004889780848c70015000000488b12488b0c244889142450564989fa4c89c84989d94889c348c7c00100000051ff253a00000090900000000000000000b003000000000000|@239,1048575,@15484,@240,@20027,@237|45,0,$234+190 272,0,@169 330,0,@225 366,0,@20027 382,0,@67 427,0,@235 618,0,@225 632,0,@63 676,0,@236 694,0,@67 715,0,@20027 235:O5|@66,577,0,577,0 236:O5|@66,604,0,605,0 237:D6,864|483b65187303ff55484889d9f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174084883f9157c0feb06f641ff10750748c7c1150000004889c2f6c201740f41f6c0017409488d52ff4903d07105ff5570ebf2498d77f0483b75107303ff55404989f748c746f80100000048890e4c89c74989db4989c44989cd4989f04889d34c89c8909090ff15e602000048c7c101000000488d49ff480348084883f915761e488b4810488b10488b580848b8f87a06c9a37f0000488b5d08909090ff13f6401001742f48c7c101000000488d49ff480308488b401048d1e948d1e84988040a488d440001488d4c090148c7c001000000eb41488b084883c110488b70104889fa4c89d74889cb488b480848d1e948d1eb4803f3488d5c1b01f3a4488d7c3f01488d743601488d4c090148c7c0010000004889d7415241515741534154ff750848b8728106c9a37f00005048896508498d47f0483b45107303ff55404989c748c740f8010000004c89284989c048c7c301000000488b442448ff15fa010000488b54245090ff124883c4085948894d08eb6490488b65084883c4085b48895d086a016a016a01488b08483b0dd1010000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a084889e2eb05e9b700000048c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bbc87506c9a37f000048895a1048894208488b5c244848891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bb788306c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff134889c1f6c1017410f6042401740a488d49ff48030c247105ff5570ebf1f6c101750af6442408017503ff5570483b4c2408750e48c7c0010000004883c428c21800a8017410f6042401740a488d40ff480304247105ff5570ebf1488b4c2440488b542438488b5c243048894c2440488954243848895c24304c8b5424204c8b4c24184c8b4424104883c4085b4883c418e9b2fcffff909000000000000000005803000000000000|@241,1048575,@15486,@240,@171,@20027|180,0,@231 329,0,$237+410 492,0,@169 550,0,@225 586,0,@20027 602,0,@67 647,0,@238 238:O5|@66,595,0,595,0 239:S27|426173696353747265616d494f28292e7772697465566563283429 240:D3,360|41f6c0017559a801740948c7c103000000eb08488b08488d4c0901f6c3017413f6c30174084883fb017d1eeb06f643ff1074164889c248b8501106c9a37f0000488b5d08909090ff1341f60001741b498b10f6c201740d4883fa017d20eb0be964000000f642ff1074134889c248b8501106c9a37f0000488b5d08ff134889de488d76ff4803f2483bf176154889c148b8685206c9a37f0000488b5d089090ff134889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048895008488918c3f6c3017413f6c30174084883fb017d1deb06f643ff1074154889c148b8501106c9a37f0000488b5d089090ff13a801740948c7c103000000eb08488b08488d4c0901483bd976164889c248b8f85206c9a37f0000488b5d08909090ff13482bcb4883c1014889c2498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c3909090909000000000000000006001000000000000|@178,95,@15485|56,0,@40 111,0,@40 145,0,@172 229,0,@40 276,0,@175 241:S38|426173696353747265616d494f28292e7772697465566563283429666f7263654f7574283129 242:S46|426173696353747265616d494f28292e6f7574707574566563746f72283229616464566563546f42756666283129 243:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@229,1048575,@15488,@224| 244:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@229,1048575,@15489,@224| 245:S20|5468726561644c69622e70726f74656374283329 246:O2|@263,@262 247:O2|@249,@248 248:O3|@251,@253,@20290 249:D3,48|483b65187303ff5548488b5a0848c7c02500000048bad0b3dc0000000000ff2200000000000000002800000000000000|@250,2097151,@15492|22,0,I150 250:S28|426173696353747265616d494f28292e646f4f6e456e747279283129 251:D4,152|483b65187303ff5548488b4210488b0048c7c10100000052a801755dff7008ff750848b9e68706c9a37f00005148896508488b08488b5424184c8b4120488b5a084889c8ff15660000004883c4085948894d08eb1590488b65084883c4085b48895d0848c7c0010000004889c158483b65187303ff5548eb9f4889c84883c408c39090909090909000000000000000009000000000000000|@252,2097151,@15493,@179|36,0,$251+86 252:S27|426173696353747265616d494f28292e636c6f7365416c6c283129 253:O3|@254,@20291,@20290 254:D4,56|483b65187303ff5548488b4810ff71104c8b4210488b5a08ff153200000048c7c0010000005aff2200000000000000003000000000000000|@256,2097151,@15494,@255| 255:D5,312|483b65187303ff5548488b4818488b094883f903750848c7c001000000c3488b481848c7010300000050534150ff701848c7c001000000488b4c2410488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebbd488b4c24104833c04883c0fef0480fc1014883c0fe4883f80174274889cb48c7c00300000048ba90a0dc0000000000909090ff12483b65187303ff5548e974ffffff488b442408488b005b909090ff158200000059488901488b0c244833c04883c002f0480fc1014883c0024883f803742a4889c848ba909fdc0000000000909090ff124889cb48c7c00500000048ba90a0dc00000000009090ff124883c40858ff25370000009090909090909000000000000000003001000000000000|@258,2097151,@15495,@259,@257|161,0,I73 241,0,I69 266,0,I73 256:S28|426173696353747265616d494f28292e636c6f73654f757427283129 257:D5,752|483b65187303ff5548488b4808488b09488b50104883f901750848c7c001000000c3f64238017470498d5fe0483b5d107303ff55404989df48c743f80300000048bec01906c9a37f00004889731048bed81906c9a37f000048897308488b32488933498d7fd8483b7d107303ff55404989ff48c747f80400000049b8281a06c9a37f00004c89471848895f1048bb881a06c9a37f0000eb05e92400000048895f0848bb58b019f1a37f000048891f488b184c8b40084889f8488b5d08909090ff13488b5a38488b700848c7060100000048c7c701000000ff33ff30ff325157ff750848b8fe8b06c9a37f00005048896508488b442418a801740b40f6c7017405482bc77105ff5570ebf64883c001498d4ff0483b4d107303ff55404989cf48c741f8010000004889014989c84889fb488b442428ff15ce010000488b54243090ff124883c4085948894d08eb6490488b65084883c4085b48895d086a016a016a01488b08483b0da5010000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a084889e2eb05e9b700000048c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bbc01906c9a37f000048895a1048894208488b5c242848891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bbd05006c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff134889c1f6c1017410f6042401740a488d49ff48030c247105ff5570ebf1f6c101750af6442408017503ff5570483b4c2408750c48c7c0010000004883c428c3a8017410f6042401740a488d40ff480304247105ff5570ebf14889c74883c408483b65187303ff5548e904feffff9090909090900000000000000000e802000000000000|@177,1048575,@15497,@261,@20027|66,0,@62 80,0,@63 124,0,@65 142,0,@67 163,0,@20027 228,0,$257+334 416,0,@169 474,0,@62 510,0,@20027 526,0,@67 571,0,@170 258:S35|426173696353747265616d494f28292e7465726d696e61746553747265616d27283129 259:D3,112|483b65187303ff5548a8017545488b08483b5918743051488b40089090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9aeffffff48c7c001000000c390909090909000000000000000006800000000000000|@260,11,@15496| 260:S16|4c6973742e66696c7465722832292829 261:D3,320|41f6c001756cf6c3017413f6c30174084883fb017d1beb06f643ff1074134889c148b8501106c9a37f0000488b5d08ff1341f600017416498b08f6c10174084883f9017d1ceb06f641ff1074144889c148b8501106c9a37f0000488b5d0890ff134889da488d52ff4803d1483b10761deb05e93d0000004889c248b8685206c9a37f0000488b5d08909090ff134889c2498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c3f6c3017413f6c30174084883fb017d1deb06f643ff1074154889c148b8501106c9a37f0000488b5d089090ff13483b1876134889c148b8f85206c9a37f0000488b5d08ff13488b08482bcb4883c1014889c2498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c390909090909000000000000000003801000000000000|@178,79,@15498|35,0,@40 82,0,@40 124,0,@172 209,0,@40 235,0,@175 262:O2|@343,0 263:O4|@264,@20293,@20292,I148 264:D6,240|483b65187303ff55485249c7c00300000048bba09106c9a37f0000488b421848bab89106c9a37f0000909090ff15d6000000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f801000000c640ff4048890848c7c203000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff48488911498d57e0483b55107303ff55404989d748c742f80300000048894a104889420848c7020300000052ff3554000000488b4424104c8b40104889e3488b48084889c890ff15420000004883c418c390909090900000000000000000e800000000000000|@321,2097151,@15521,@268,@320,@179|19,0,@265 33,0,@266 265:S5|737464496e 266:O2|@268,@267 267:O4|@315,@319,@314,@314 268:D4,1520|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048be189806c9a37f000048893148894108488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf489906c9a37f000048893e48894608488066ffbf6a016a016a016a014983f801744f498d57e0483b55107303ff55404989d748c742f801000000488932488d721048c746f80100000048890e4889e14889114889e1488971084889e148c74110010000004889e148c7411801000000eb70498d7fe0483b7d107303ff55404989ff48c747f80300000049b8e89906c9a37f00004c89074c8b42084c89470848897710488067ffbf498d77d0483b75107303ff55404989f748c746f80100000048893e488d7e1048c747f80300000049b9709a06c9a37f00004c890f4c894708eb05e94700000048894f10488067ffbf498d4ff0483b4d107303ff55404989cf48c741f8010000004889394889e748c707010000004889e748c74708010000004889e7488977104889e648894e186a016a016a01535049c7c0010000004889c348c7c03d00000048ba909ddc0000000000909090ff12a80174084883f8057f30eb06f640ff107428488d44241048c70001000000488d44241048c7400801000000488d44241048c7401001000000eb6eff750848b81e9406c9a37f0000504889650849c7c001000000488b5c241048c7c02500000048ba909ddc000000000090ff1248c7c0030000004883c4085948894d08eb249090488b65084883c4085b48895d08488338057408488b5d089090ff1348c7c0010000004883f801eb05e92a010000744f498d4fe8483b4d107303ff55404989cf48c741f80200000048bac09a06c9a37f0000488911488b142448895108488061ffbf498d5ff0483b5d107303ff55404989df48c743f80100000048890beb0748c7c3010000004883f801744f498d4fe8483b4d107303ff55404989cf48c741f80200000048ba609b06c9a37f0000488911488b142448895108488061ffbf498d77f0483b75107303ff55404989f748c746f80100000048890eeb0748c7c6010000004883f801744f498d47e8483b45107303ff55404989c748c740f80200000048b9089c06c9a37f0000488908488b0c2448894808488060ffbf498d57f0483b55107303ff55404989d748c742f801000000488902eb0748c7c201000000488d442410488918488d44241048897008488d44241048895010498d47e8483b45107303ff55404989c748c740f80200000048b9a89c06c9a37f0000488908488b0c2448894808488060ffbf5049c7c0010000004889cb48c7c01f00000048ba909ddc000000000090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048bac89d06c9a37f0000488911488b54240848895108488061ffbf498d5fd8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f80200000048be709e06c9a37f000048893148895108488061ffbf498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048bff89e06c9a37f000048893948895108488061ffbf498dbf70ffffff483b7d107303ff55404989ff48c747f801000000488917488d571048c742f80f0000004c8b4424184c8942704c8b4c24404c894a684c8b4c24484c894a604889425848897250488b44243048894248488b44243848894240488b4424204889423848897a304c894228488b4424284889422048894a1848895a10584883c40848894208584883c4384889026a016a016a016a016a016a016a016a016a016a016a016a016a016a016a014889e34889d0909090ff15ce000000498d4780483b45107303ff55404989c748c740f80f000000488b4c247048894870488b4c246848894868488b4c246048894860488b4c245848894858488b4c245048894850488b4c244848894848488b4c244048894840488b4c243848894838488b4c243048894830488b4c242848894828488b4c242048894820488b4c241848894818488b4c241048894810488b4c240848894808594883c470488908c3909090909090900000000000000000e805000000000000|@312,2097151,@15518,@288|35,0,@269 81,0,@271 220,0,@273 289,0,@275 409,0,I61 485,0,$268+550 519,0,I61 623,0,@276 715,0,@278 807,0,@280 919,0,@282 963,0,I61 1000,0,@284 1066,0,@286 1127,0,@287 269:D3,200|483b65187303ff5548488b4810f600017416488b18f6c30174084883fb017d21eb06f643ff107419488b5808488b3048b8501106c9a37f0000488b5d089090ff13f64008017418488b700840f6c60174084883fe017d1eeb06f646ff107416488b700848b8501106c9a37f0000488b5d089090ff13498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f084c8b41084c89074989f8488b5a0848c7c01100000048ba909ddc0000000000ff2290900000000000000000c000000000000000|@270,2097151,@15499|49,0,@40 101,0,@40 172,0,I61 270:S47|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329726561644172726179283129 271:D3,56|483b65187303ff55484989c0488b5a0848c7c01500000048ba909ddc0000000000ff22909090909000000000000000003000000000000000|@272,2097151,@15500|25,0,I61 272:S48|4c696272617279494f537570706f72742e77726170496e46696c65446573637228332972656164566563746f72283129 273:D3,40|483b65187303ff5548488b5a10488b4a084889caff22909000000000000000002000000000000000|@274,1048575,@15501| 274:S34|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283129283129 275:D3,40|483b65187303ff5548488b5a10488b4a084889caff22909000000000000000002000000000000000|@274,1048575,@15502| 276:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c02500000048ba909ddc0000000000ff229000000000000000003000000000000000|@277,2097151,@15503|29,0,I61 277:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129676574506f732d283129 278:D3,64|483b65187303ff55484989c0488b5a0848c7c02700000048ba909ddc0000000000909090ff1248c7c001000000c3909000000000000000003800000000000000|@279,2097151,@15504|25,0,I61 279:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129736574506f732d283129 280:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c02900000048ba909ddc0000000000ff229000000000000000003000000000000000|@281,2097151,@15505|29,0,I61 281:S46|4c696272617279494f537570706f72742e67657452616e64416363657373466e73283129656e64506f732d283129 282:D3,184|483b65187303ff5548ff750848b8ee9c06c9a37f0000504889650849c7c001000000488b5a0848c7c02300000048ba909ddc000000000090ff124883c4085948894d08eb2390488b65084883c4085b48895d08488338057408488b5d089090ff1348c7c0ffffffffa80174084883f8017c27eb06f640ff10751f4889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909090909090900000000000000000b000000000000000|@283,2097151,@15506|14,0,$282+70 47,0,I61 283:S43|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329617661696c283129 284:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c03700000048ba909ddc0000000000ff229000000000000000003000000000000000|@285,2097151,@15507|29,0,I61 285:S49|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329746578745072696d52642d283129 286:D3,96|483b65187303ff554849c7c001000000488b5a0848c7c02100000048ba909ddc0000000000909090ff12a80174084883f8017f10eb06f640ff10740848c7c001000000c348c7c003000000c39090909000000000000000005800000000000000|@285,2097151,@15508|29,0,I61 287:D3,56|483b65187303ff554849c7c001000000488b5a0848c7c00f00000048ba909ddc0000000000ff229000000000000000003000000000000000|@285,2097151,@15509|29,0,I61 288:D3,1136|488378480175614883784001745f488b4840498d57e0483b55107303ff55404989d748c742f80300000048bef0a306c9a37f0000488932488b3148897208488b785848897a10488062ffbf4d8d47f04c3b45107303ff55404d89c749c740f801000000498910eb12e90900000049c7c001000000eb044c8b4048488378400175624883784801750948c7c101000000eb56488b4848498d57e8483b55107303ff55404989d748c742f80200000048be38a706c9a37f0000488932488b3148897208488062ffbf498d4ff0483b4d107303ff55404989cf48c741f801000000488911eb04488b48404883786801755b48837860017559f6405001755841f6c0017557488b5050498d77e0483b75107303ff55404989f748c746f80300000048bff8a806c9a37f000048893e498b3848897e084c8b0a4c894e10488066ffbf4d8d57f04c3b55107319eb14e98f000000e926000000e918000000e913000000ff55404d89d749c742f801000000498932eb6349c7c201000000eb5f488b5060498d77e0483b75107303ff55404989f748c746f80300000048bfd0a906c9a37f000048893e488b3a48897e084c8b48584c894e10488066ffbf4d8d57f04c3b55107303ff55404d89d749c742f801000000498932eb0ee909000000e9040000004c8b50684883786001755a48837868017558f64050017557f6c1017557488b5050498d77e0483b75107303ff55404989f748c746f80300000048bfd0ac06c9a37f000048893e488b3948897e084c8b0a4c894e10488066ffbf4d8d5ff04c3b5d107319eb14e987000000e926000000e918000000e913000000ff55404d89df49c743f801000000498933eb5b49c7c301000000eb57488b5068498d77e8483b75107303ff55404989f748c746f80200000048bfa8ad06c9a37f000048893e488b3a48897e08488066ffbf4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb0ee909000000e9040000004c8b58604983f801756af6401001756941f6c2017568488b5010498d77d8483b75107303ff55404989f748c746f80400000048bf10af06c9a37f000048893e488b3848897e084d8b024c8946104c8b0a4c894e18488066ffbf4d8d67f04c3b65107303ff55404d89e749c74424f801000000eb0fe919000000e90b000000e90600000049893424eb0c49c7c401000000eb034d89c44883f9017569f6401001756841f6c3017567488b4810498d57d8483b55107303ff55404989d748c742f80400000048bec8b006c9a37f0000488932488b3048897208498b3b48897a104c8b014c894218488062ffbf4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000eb0fe918000000e90a000000e905000000498911eb0c49c7c101000000eb034989c9488b0848890b488b500848895308488b701048897310488b781848897b184c8b40204c8943204c8b68284c896b284c8b70304c897330488b483848894b384c894b404c8963484c8b48504c894b504c8b60584c8963584c895b604c8953684c8b50704c89537048c7c001000000c300000000000000006804000000000000|@313,8191,@15519|44,0,@289 175,0,@293 287,0,@297 407,0,@299 536,0,@300 656,0,@302 770,0,@303 915,0,@308 289:D4,648|483b65187303ff5548a801740ef64210017408483b42107c0beb05ff5570ebf3488b4210a8017412a80174084883f8017d1beb06f640ff1074134889c148b8884406c9a37f0000488b5d08ff134883f801742f483b052602000076154889c148b8a8a606c9a37f0000488b5d089090ff134889c14883c10e48c1e9034883c901eb0748c7c1030000004889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48c7c001000000483bd8761c48d1e848c6040720488d4400014883c002483b65187303ff5548ebdf498d47c8483b45107303ff55404989c748c740f802000000488978084889184889c1488d401848c740f803000000488948104889580848c7000100000051488b520890ff12498d4ff0483b4d107303ff55404989cf48c741f8010000004889014989c848c7c30100000058ff153a010000488b48104883780801750b48b8509adc0000000000c348837808037518488b10488b590848d1ea480fb61413488d5412014889d0c3488b50084883c21e48c1ea034883ca01483b15c60000007219488b18488b700848b8583e06c9a37f0000488b5d089090ff13488b59084889d1488b10488b700848c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ee488937488d7436014889f04889de4889f94889cf4889cb4889c148d1e948d1ea4803f2488d5412014883c708f3a4488d7c3f01488d743601488d4c0901488063ffbf4889d8c390909000000000000000007002000000000000ffffffffffffff01e1ffffffffffff0f|@292,1048575,@15510,@171|63,0,@113 97,0,@290 371,0,I48 445,0,@101 290:O4|4,@103,0,@291 291:O5|@43,169,0,169,0 292:S37|5072696d494f28292e6175676d656e7452656164657228312972656164566563272d283129 293:D3,264|483b65187303ff5548ff30ff7010488b4008488b52089090ff12488b0c24a801740948c7c203000000eb08488b10488d541201f6442408017418488b5c2408f6c30174084883fb017d1beb06f643ff1074134889c348b8501106c9a37f0000488b5d08ff13488d5bff4803da483b1976144889c348b868a806c9a37f0000488b5d0890ff13a801741f488b4908488b54240848d1ea48d1e848880411488d440001488d541201eb324889c6488b79084889d1488b54240848d1e94883c60848d1ea4803fa488d541201f3a4488d7c3f01488d743601488d4c09014889c1f6c101740948c7c003000000eb08488b01488d4400014883c410c300000000000000000001000000000000|@296,1048575,@15511|87,0,@40 118,0,@294 294:O4|11,@42,0,@295 295:O5|@98,1182,0,1182,0 296:S37|5072696d494f28292e6175676d656e7452656164657228312972656164417272272d283129 297:D3,120|483b65187303ff5548505248c7c001000000488b4a104889ca909090ff124883f8017435488b0424488b4808488b4424084889caff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c0010000004883c410c390909000000000000000007000000000000000|@298,1048575,@15512| 298:S39|5072696d494f28292e6175676d656e74526561646572283129726561645665634e42272d283129 299:D4,720|483b65187303ff5548a801740ef64210017408483b42107c0beb05ff5570ebf3488b4210a8017412a80174084883f8017d1beb06f640ff1074134889c148b8884406c9a37f0000488b5d08ff134883f801742f483b056e02000076154889c148b8a8a606c9a37f0000488b5d089090ff134889c14883c10e48c1e9034883c901eb0748c7c1030000004889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48c7c001000000483bd8761c48d1e848c6040720488d4400014883c002483b65187303ff5548ebdf498d47c8483b45107303ff55404989c748c740f802000000488978084889184889c1488d401848c740f803000000488948104889580848c7000100000051488b520890ff12a8017563498d4ff0483b4d107303ff55404989cf48c741f801000000488b004889014989c848c7c301000000488b04249090ff1576010000488b48104883780801750c48ba509adc0000000000eb6b4883780803751d488b10488b590848d1ea480fb61413eb05e9fc000000488d541201eb6d488b50084883c21e48c1ea034883ca01483b15fc0000007217488b18488b700848b8583e06c9a37f0000488b5d08ff13488b59084889d1488b10488b700848c7c001000000eb05e989000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ffeb05e96300000048d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ee488937488d7436014889f04889de4889f94889cf4889cb4889c148d1e948d1ea4803f2488d5412014883c708f3a4488d7c3f01488d743601488d4c0901488063ffbf4889da498d47f0483b45107303ff55404989c748c740f8010000004889104883c408c348c7c0010000004883c408c390900000000000000000b802000000000000ffffffffffffff01e1ffffffffffff0f|@298,1048575,@15513,@171|63,0,@113 97,0,@290 383,0,I48 463,0,@101 300:D3,120|483b65187303ff5548505248c7c001000000488b4a104889ca909090ff124883f8017435488b0424488b4808488b4424084889caff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c0010000004883c410c390909000000000000000007000000000000000|@301,1048575,@15514| 301:S39|5072696d494f28292e6175676d656e74526561646572283129726561644172724e42272d283129 302:D3,320|483b65187303ff5548ff30ff7010488b4008488b52089090ff12a801756b488b0c24488b18f6c301740948c7c203000000eb08488b13488d541201f6442408017419488b74240840f6c60174084883fe017d1aeb06f646ff10741248b8501106c9a37f0000488b5d089090ff13488d76ff4803f2483b31761848b868a806c9a37f0000488b5d08eb05e98f00000090ff13f6c301741f488b4908488b54240848d1ea48d1eb48881c11488d5c1b01488d541201eb324889de488b79084889d1488b54240848d1e94883c60848d1ea4803fa488d541201f3a4488d7c3f01488d743601488d4c0901f6c301740948c7c103000000eb08488b0b488d4c0901498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c0010000004883c410c39090909090909000000000000000003801000000000000|@301,1048575,@15515|93,0,@40 123,0,@294 303:D3,232|483b65187303ff5548525048c7c001000000488b4a184889ca909090ff12488b442408488b4810584889ca90ff12a8017475488b0c24498d57e0483b55107303ff55404989d748c742f80300000048bb20b006c9a37f000048895a1048bbd81906c9a37f000048895a08488b490848890a498d4fd8483b4d107303ff55404989cf48c741f80400000048bb38b006c9a37f0000488959184889511048ba881a06c9a37f0000eb05e91d0000004889510848ba58b019f1a37f00004889114889c24889c8488b5d08ff13488b004883c408c3909090909090900000000000000000e000000000000000|@307,1048575,@15516|80,0,@304 94,0,@63 139,0,@305 157,0,@67 178,0,@20027 304:S7|72656164566563 305:O5|@306,239,0,242,0 306:S18|2e2f62617369732f5072696d494f2e736d6c 307:S38|5072696d494f28292e6175676d656e745265616465722831297265616456656327272d283129 308:D3,232|483b65187303ff5548525048c7c001000000488b4a184889ca909090ff12488b442408488b4810584889ca90ff12a8017475488b0c24498d57e0483b55107303ff55404989d748c742f80300000048bbd8b106c9a37f000048895a1048bbd81906c9a37f000048895a08488b490848890a498d4fd8483b4d107303ff55404989cf48c741f80400000048bbf0b106c9a37f0000488959184889511048ba881a06c9a37f0000eb05e91d0000004889510848ba58b019f1a37f00004889114889c24889c8488b5d08ff13488b004883c408c3909090909090900000000000000000e000000000000000|@311,1048575,@15517|80,0,@309 94,0,@63 139,0,@310 157,0,@67 178,0,@20027 309:S7|72656164417272 310:O5|@306,262,0,265,0 311:S38|5072696d494f28292e6175676d656e745265616465722831297265616441727227272d283129 312:S35|4c696272617279494f537570706f72742e77726170496e46696c654465736372283329 313:S25|5072696d494f28292e6175676d656e74526561646572283129 314:O1|11 315:D3,352|483b65187303ff554852ff750848b91eb306c9a37f000051488965084889da90ff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c4085948894d084883c408c3488b65084883c4085b48895d0848833805750a488b4810f6410801740e4889c14889c8488b5d089090ff13488b5108488b1c2448837b18017426488b7318488b3a40f6c7017508f606017503ff5570483b3e750c48c7c0010000004883c408c348837b10017426488b7310488b3a40f6c7017508f606017503ff5570483b3e750c48c7c0010000004883c408c348837b0801741a488b5b08488b3240f6c6017508f603017503ff5570483b337441498d5fd8483b5d107303ff55404989df48c743f80400000048be58b406c9a37f00004889731848894b10488b700848897308488b3848893b4889d8488b5d08ff1348c7c0010000004883c408c39090909090909000000000000000005801000000000000|@318,1048575,@15520|15,0,$315+78 278,0,@316 316:O5|@317,118,0,118,0 317:S28|2e2f62617369732f4c696272617279494f537570706f72742e736d6c 318:S31|4c696272617279494f537570706f72742e6e6f6e426c6f636b696e67283229 319:O1|115 320:D3,32|488b520848891048c7c001000000c39000000000000000001800000000000000|@322,5,@15522| 321:S19|54657874494f2e6f6e53746172745570283129 322:S37|4261736963496d7065726174697665494f28292e736574496e73747265616d283229283129 323:O5|0,@325,@324,1285,0 324:O3|1,@20035,@20294 325:S1286|282a0a20202020436f707972696768742028632920323030362d31302020446176696420432e204a2e204d617474686577730a0a2020202054686973206c696272617279206973206672656520736f6674776172653b20796f752063616e2072656469737472696275746520697420616e642f6f720a202020206d6f6469667920697420756e64657220746865207465726d73206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e7365206173207075626c697368656420627920746865204672656520536f66747761726520466f756e646174696f6e3b206569746865720a2020202076657273696f6e20322e31206f6620746865204c6963656e73652c206f722028617420796f7572206f7074696f6e2920616e79206c617465722076657273696f6e2e0a202020200a2020202054686973206c69627261727920697320646973747269627574656420696e2074686520686f706520746861742069742077696c6c2062652075736566756c2c0a2020202062757420574954484f555420414e592057415252414e54593b20776974686f7574206576656e2074686520696d706c6965642077617272616e7479206f660a202020204d45524348414e544142494c495459206f72204649544e45535320464f52204120504152544943554c415220505552504f53452e20205365652074686520474e550a202020204c65737365722047656e6572616c205075626c6963204c6963656e736520666f72206d6f72652064657461696c732e0a202020200a20202020596f752073686f756c642068617665207265636569766564206120636f7079206f662074686520474e55204c65737365722047656e6572616c205075626c69630a202020204c6963656e736520616c6f6e6720776974682074686973206c6962726172793b206966206e6f742c20777269746520746f20746865204672656520536f6674776172650a20202020466f756e646174696f6e2c20496e632e2c203531204672616e6b6c696e2053742c20466966746820466c6f6f722c20426f73746f6e2c204d41202030323131302d3133303120205553410a2a290a0a282a20436f6d70696c65722074686520636f6d70696c657220616e64206578706f7274206974206173206120706f727461626c652066696c652e20205468652072657374206f66207468650a202020626f6f7473747261702070726f63657373206973207468656e20646f6e65207768656e2074686520706f727461626c652066696c6520697320696d706f727465642e202a290a0a506f6c794d4c2e7072696e745f646570746820303b0a0a506f6c794d4c2e757365202262617369732f52756e74696d6543616c6c73223b0a0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c65722f426f6f74223b0a506f6c794d4c2e6d616b6520226d6c736f757263652f4d4c436f6d70696c6572223b0a0a506f6c794d4c2e7368617265436f6d6d6f6e44617461204d4c436f6d70696c65722e7368656c6c3b0a0a506f6c794d4c2e6578706f7274506f727461626c652822706f6c7974656d70222c0a20202020666e202829203d3e20284d4c436f6d70696c65722e7368656c6c28293b204f532e50726f636573732e65786974204f532e50726f636573732e73756363657373292068616e646c65205f203d3e204f532e50726f636573732e65786974204f532e50726f636573732e6661696c757265293b0a 326:O2|1,@327 327:O15|@265,@329,@330,@332,0,0,@333,0,@334,@336,@338,4096,@340,@328,0 328:O1|@342 329:O2|@282,I148 330:O1|@331 331:O2|@284,I148 332:O2|@287,I148 333:O1|I148 334:O1|@335 335:O2|@269,I148 336:O1|@337 337:O2|@271,I148 338:O1|@339 339:O2|@286,I148 340:O1|@341 341:O3|@300,@335,@339 342:O3|@297,@337,@339 343:O2|@345,@344 344:O3|@346,@347,@20295 345:D3,48|483b65187303ff5548488b5a0848c7c02500000048bad0b3dc0000000000ff2200000000000000002800000000000000|@250,2097151,@15523|22,0,I150 346:D4,152|483b65187303ff5548488b4210488b0048c7c10100000052a801755dff7008ff750848b9c6bd06c9a37f00005148896508488b08488b5424184c8b4120488b5a084889c8ff15660000004883c4085948894d08eb1590488b65084883c4085b48895d0848c7c0010000004889c158483b65187303ff5548eb9f4889c84883c408c39090909090909000000000000000009000000000000000|@252,2097151,@15524,@179|36,0,$346+86 347:O3|@348,@20296,@20295 348:D4,56|483b65187303ff5548488b4810ff71104c8b4210488b5a08ff153200000048c7c0010000005aff2200000000000000003000000000000000|@256,2097151,@15525,@349| 349:D5,312|483b65187303ff5548488b4818488b094883f903750848c7c001000000c3488b481848c7010300000050534150ff701848c7c001000000488b4c2410488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebbd488b4c24104833c04883c0fef0480fc1014883c0fe4883f80174274889cb48c7c00300000048ba90a0dc0000000000909090ff12483b65187303ff5548e974ffffff488b442408488b005b909090ff158200000059488901488b0c244833c04883c002f0480fc1014883c0024883f803742a4889c848ba909fdc0000000000909090ff124889cb48c7c00500000048ba90a0dc00000000009090ff124883c40858ff25370000009090909090909000000000000000003001000000000000|@258,2097151,@15526,@350,@61|161,0,I73 241,0,I69 266,0,I73 350:D3,112|483b65187303ff5548a8017545488b08483b5918743051488b40089090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9aeffffff48c7c001000000c390909090909000000000000000006800000000000000|@260,11,@15527| 351:O2|@353,@352 352:O2|@25,0 353:O6|@354,@20037,@355,@20038,@20297,@20036 354:O2|4096,@15528 355:O14|@357,@358,@360,0,0,@361,0,@362,@364,@366,4096,0,@368,@356 356:O1|@370 357:S6|737464457272 358:O1|@359 359:O2|@32,I202 360:O2|@35,I202 361:O1|I202 362:O1|@363 363:O2|@39,I202 364:O1|@365 365:O2|@47,I202 366:O1|@367 367:O2|@51,I202 368:O1|@369 369:O3|@54,@363,@367 370:O3|@57,@365,@367 371:O2|@20298,@372 372:O4|1,@20040,@20041,@20039 373:O2|@374,80 374:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@377,2097151,@15529,@375| 375:D3,312|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c090148c7c201000000504883f901746d4889c84883e8024883e902f60424017406488b0c24eb154883c110488b342448d1e9480fb60c0e488d4c0901f6c1017513488b31f641ff10740348f7de488d743601eb034889ce4889c148c7c00f0000004883e80148d1ea48f7e24883c001488d541201488d40ff4803c6eb05e9110000004889c2483b65187303ff5548e977fffffff6c3017513488b03f643ff10740348f7d8488d440001eb034889d84889d14889c34889c84883c4084883eb017503ff55684883e8014833d248f7f34883c3014883c201488d440001f6c20174084883fa017d21eb06f642ff1074194889d348b810c506c9a37f000048bad0a8dc0000000000ff224889d0c39000000000000000003001000000000000|@378,2097151,@15530|271,0,@376 281,0,I106 376:B8|0000000000000080 377:S25|486173685461626c652e6861736856616c7565283129283129 378:S22|486173685461626c652e6861736856616c7565283229 379:O2|@470,@15438 380:O2|@382,@381 381:O2|@383,0 382:S2|3c3d 383:O4|@20043,69,@384,0 384:O7|@382,2,@391,@392,@390,0,0 385:O1|@386 386:O1|@387 387:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@15531|2,0,@388 388:O2|3,63 389:S13|7072696e742d64656661756c74 390:O2|@419,0 391:O2|3,8 392:O3|2,@394,@393 393:O5|5,0,@405,@404,0 394:O3|3,@396,@395 395:O3|0,@402,1 396:O2|@398,@397 397:O2|@401,0 398:O2|49,@399 399:O3|6,@20044,79992 400:O2|4,0 401:O2|50,@399 402:O2|49,@403 403:O2|50,0 404:O3|@405,@390,@406 405:S4|626f6f6c 406:O3|@408,@415,@407 407:O3|@405,@417,@416 408:O2|1,@409 409:O3|2,@410,0 410:O4|I251,@20045,1,1 411:O1|@412 412:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@414,1,@15532|2,0,@413 413:O2|3,63 414:S37|545950455f5452454528292e64656661756c744d6f6e6f547970655072696e746572283129 415:O4|1,@20046,0,0 416:S8|496e204261736973 417:O5|@418,0,0,0,0 418:S14|5374616e64617264204261736973 419:O2|0,@417 420:O2|@422,@421 421:O2|@423,0 422:S2|3e3d 423:O4|@20043,69,@424,0 424:O7|@422,2,@391,@392,@390,0,0 425:O2|@427,@426 426:O2|@428,0 427:S4|74727565 428:O4|@20043,69,@429,0 429:O7|@427,@431,@430,@393,@390,0,0 430:O2|1,@432 431:O2|1,2 432:O3|14,@433,0 433:O2|@435,@434 434:O2|@442,0 435:O2|7,@436 436:O8|@438,@427,0,0,@437,0,0,1 437:O2|@441,0 438:O4|13,1,@439,1 439:O2|4,@440 440:O2|0,0 441:O2|1,0 442:O3|2,1,0 443:O2|@445,@444 444:O2|@446,0 445:S3|65786e 446:O4|@20047,69,@447,0 447:O2|@448,0 448:O3|@445,@390,@449 449:O3|@451,@457,@450 450:O3|@445,@417,@416 451:O2|1,@452 452:O3|2,@453,0 453:O4|0,@20048,2,1 454:O1|@455 455:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@456,1,@15533|2,0,@413 456:S40|545950455f5452454528292e6d616b655479706528332964656661756c745072696e746572283129 457:O4|1,@20049,0,0 458:O2|@460,@459 459:O2|@461,0 460:S3|636872 461:O4|@20043,69,@462,0 462:O7|@460,2,@464,@463,@390,0,0 463:O3|2,@468,@467 464:O2|1,@465 465:O2|7,@466 466:O8|@439,@460,0,0,@437,0,0,1 467:O5|5,0,@478,@477,0 468:O5|5,0,@470,@469,0 469:O3|@470,@390,@471 470:S3|696e74 471:O3|@473,@476,@472 472:O3|@470,@417,@416 473:O2|1,@474 474:O3|2,@475,0 475:O4|I113,@20050,3,1 476:O4|1,@20051,0,0 477:O3|@478,@390,@479 478:S6|737472696e67 479:O3|@481,@623,@480 480:O3|@478,@417,@416 481:O2|1,@482 482:O3|2,@484,@483 483:O2|@489,@488 484:O4|@485,@20052,3,1 485:O1|@486 486:D3,120|483bc3750848c7c003000000c3a801754ef6c3017549f6c301740948c7c103000000eb08488b0b488d4c09014883c1104889c64889df48d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740848c7c001000000c348c7c003000000c348c7c001000000c39000000000000000007000000000000000|@487,59,@15534| 487:S14|737472696e67457175616c697479 488:O2|@586,0 489:O4|@20053,69,@490,0 490:O2|@492,@491 491:O2|0,@585 492:O2|@494,@493 493:O2|@494,0 494:O4|@20054,69,@495,0 495:O3|0,@497,@496 496:O5|@549,@576,I49,@582,@548 497:O8|@499,@487,0,0,@498,0,0,1 498:O2|@541,@540 499:O4|1,@501,@442,@500 500:O4|1,@510,@522,@509 501:O4|3,@503,@502,1 502:O3|2,I251,0 503:O2|@505,@504 504:O2|@506,0 505:O2|@439,1 506:O2|@507,1 507:O2|4,@508 508:O2|0,1 509:O3|2,0,0 510:O4|1,@512,@511,@509 511:O4|3,@519,@513,1 512:O4|3,@514,@513,1 513:O3|2,I218,0 514:O2|@515,0 515:O2|@516,1 516:O4|3,@518,@517,1 517:O3|2,I105,0 518:O2|@505,0 519:O2|@520,0 520:O2|@521,1 521:O4|3,@504,@517,1 522:O4|3,@524,@523,1 523:O3|2,I154,0 524:O2|@505,@525 525:O2|@527,@526 526:O2|@506,@528 527:O2|@509,1 528:O2|@527,@529 529:O2|@530,0 530:O2|@531,1 531:O4|3,@533,@532,1 532:O3|2,I239,0 533:O2|@535,@534 534:O2|@537,0 535:O2|@536,1 536:O3|2,8,0 537:O2|@538,1 538:O4|3,@504,@539,1 539:O3|2,I223,0 540:O2|@546,0 541:O2|1,@542 542:O2|@544,@543 543:O2|@544,@545 544:O1|3 545:O2|@544,0 546:O2|1,@547 547:O2|@544,@542 548:O1|@583 549:D5,64|483b65187303ff5548ff7208ff35460000004c8b52204c8b4a184c8b42104889e3909090ff15360000004883c410c39000000000000000003800000000000000|@570,1048575,@15540,@574,@550| 550:D3,672|483b65187303ff55486a016a014152415141504889d9488d5c24184889ca9090ff126a016a01488b4424284883380175174889e1488b50084889114889e1488b581048895908eb6c488b480848833905741348b828de06c9a37f0000488b5d08909090ff13f6410801741e488b5c241048baffffffffffffff00482353f8488d541201483b5108771048b8b0df06c9a37f0000488b5d08ff13488b5108488b5493fc4883fa01751948b830e006c9a37f0000eb05e969000000488b5d089090ff13f64108017517488b7108488b16f646ff10740348f7da488d541201eb04488b51084883c202488b742418488b5496fc488b790840f6c70174064883c7027105ff5570ebf5524889f8488b5424289090ff12488d4c24085a4889114889e148894108488b44243048833801756f498d4fd0483b4d107303ff55404989cf48c741f80500000048bac0e006c9a37f0000488911488b501048895108488b5c241048895910488b5c241848895918488b5c242048895920488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048894b10488b4808eb05e90d00000048894b0848c70301000000eb6d48833805756c498d4fd0483b4d107303ff55404989cf48c741f80500000048ba38e206c9a37f0000488911488b501048895108488b5c241048895910488b5c241848895918488b5c242048895920488061ffbf498d5fe0483b5d107303ff55404989df48c743f803000000eb0ae924000000e91500000048894b10488b480848894b0848c70305000000eb0a48bb30e306c9a37f0000498d47c8483b45107303ff55404989c748c740f803000000488b4c240848894810594883c4304889480848c700010000004889c1488d402048c740f80200000048895808488908c39090909000000000000000009802000000000000|@575,1048575,@15542|84,0,@551 114,0,36028797018963967 139,0,@560 170,0,@563 327,0,@566 462,0,@571 572,0,@573 551:O4|@20055,@557,@558,@552 552:O5|@559,314,0,314,0 553:O1|@554 554:O1|@555 555:D3,48|483b65187303ff554848b978b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@556,1048575,@15535|11,0,@20029 556:S12|7072696e742d737472696e67 557:S13|496e7465726e616c4572726f72 558:S43|636f646574726565206e6577456e7669726f6e3a204e6f742045787472616374206f7220436f6e73746e74 559:S40|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245452e4d4c 560:O4|11,@42,0,@561 561:O5|@562,114,0,114,0 562:S18|2e2f62617369732f566563746f722e736d6c 563:O4|@20055,@557,@565,@564 564:O5|@559,310,0,310,0 565:S33|5265666572656e636520746f206e6f6e2d6578697374656e742062696e64696e67 566:D3,104|483b65187303ff5548498d5fe8483b5d107303ff55404989df48c743f80200000048b950e106c9a37f000048890b488b4a0848894b08488063ffbf4c8b52204c8b4a184c8b421048baf0e106c9a37f0000ff22909090909000000000000000006000000000000000|@570,1048575,@15537|35,0,@567 73,0,@569 567:D3,64|483b65187303ff554853488b52089090ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000003800000000000000|@568,1048575,@15536| 568:S39|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e2832292d45 569:O1|@550 570:S40|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283129283129 571:D3,104|483b65187303ff5548498d5fe8483b5d107303ff55404989df48c743f80200000048b9c8e206c9a37f000048890b488b4a0848894b08488063ffbf4c8b52204c8b4a184c8b421048baf0e106c9a37f0000ff22909090909000000000000000006000000000000000|@570,1048575,@15539|35,0,@572 73,0,@569 572:D3,64|483b65187303ff554853488b52089090ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000003800000000000000|@568,1048575,@15538| 573:O1|1 574:D3,64|483b65187303ff554853488b52089090ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000003800000000000000|@568,1048575,@15541| 575:S37|434f44455452454528292e67656e436f64652833292831296e6577456e7669726f6e283229 576:O2|@577,0 577:D3,160|488b5208f6c20174144889c148b8c0e406c9a37f0000488b5d0890ff134883f8017505488b12eb1ea80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbe498d47d0483b45107303ff55404989c748c740f8020000004889500848c700030000004889c1488d401848c740f80200000048ba30e306c9a37f000048895008488908c390909090909000000000000000009800000000000000|@581,7,@15543|14,0,@578 122,0,@573 578:O4|11,@42,0,@579 579:O5|@580,97,0,97,0 580:S16|2e2f62617369732f4c6973742e736d6c 581:S49|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429696e6c696e65436f64652d283129 582:O1|@485 583:D3,24|48c7c001000000c300000000000000001000000000000000|@584,1,@15544| 584:S38|434f44455452454528292e67656e436f64652833292831296669656c6450726f70732d283129 585:O2|0,@440 586:O4|@20054,69,@587,0 587:O3|2,4,@588 588:O5|@590,@592,I49,@607,@589 589:O2|@609,@608 590:D5,64|483b65187303ff5548ff7208ff35460000004c8b52204c8b4a184c8b42104889e3909090ff15360000004883c410c39000000000000000003800000000000000|@570,1048575,@15545,@591,@550| 591:D3,64|483b65187303ff554853488b52089090ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000003800000000000000|@568,1048575,@15546| 592:O2|@594,@593 593:O2|@597,@596 594:D3,88|488b5208f6c20174144889c148b8c0e406c9a37f0000488b5d0890ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbf90909000000000000000005000000000000000|@595,7,@15547|14,0,@578 595:S39|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129283129 596:O2|@600,@599 597:O2|@598,@495 598:O3|0,@485,@493 599:O2|@603,@602 600:O2|@601,@573 601:O3|0,@20052,0 602:O2|@605,0 603:O2|@604,@573 604:O3|0,3,0 605:O2|@606,@573 606:O3|0,1,0 607:O1|@484 608:O2|@610,0 609:D3,88|488b5208f6c20174144889c148b8c0e406c9a37f0000488b5d0890ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbf90909000000000000000005000000000000000|@584,7,@15548|14,0,@578 610:O2|@489,@611 611:O2|@613,@612 612:O2|@613,0 613:O4|@20054,69,@614,0 614:O3|2,4,@615 615:O4|@617,@619,@616,@484 616:O2|@493,@491 617:D3,272|a8017513488b08f640ff10740348f7d9488d4c0901eb034889c1488b5a18488b4c8bfc488b72104889c740f6c60174154989c048b8c0e406c9a37f0000488b5d089090ff134883ff017505488b36eb2040f6c70174064883ef027105ff5570ebf5488b7608483b65187303ff5548ebba498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048894f0848c70701000000488b4a08f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbd498d47e8483b45107303ff55404989c748c740f80200000048894808488938c3909000000000000000000801000000000000|@618,127,@15549|53,0,@578 165,0,@578 618:S81|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c2831297475706c6550726f70732d696e6c696e6550726f702d7475706c65456e747279283129 619:O2|@495,@620 620:O2|@573,@621 621:O2|@573,@622 622:O2|@573,0 623:O4|1,@20056,0,0 624:O2|@626,@625 625:O2|@627,0 626:S2|3c3e 627:O4|@20043,69,@628,0 628:O7|@626,2,@630,@629,@390,0,0 629:O3|2,@631,@393 630:O2|3,6 631:O3|3,@632,@395 632:O2|@634,@633 633:O2|@636,0 634:O2|49,@635 635:O3|6,@20057,79996 636:O2|50,@635 637:O2|@639,@638 638:O2|@640,0 639:S3|616273 640:O4|@20043,69,@641,0 641:O7|@639,2,@391,@642,@390,0,0 642:O3|2,@399,@399 643:O2|@645,@644 644:O2|@646,0 645:S5|66616c7365 646:O4|@20043,69,@647,0 647:O7|@645,@431,@648,@393,@390,0,0 648:O2|1,@649 649:O3|14,@650,0 650:O2|@652,@651 651:O2|@509,0 652:O2|7,@653 653:O8|@654,@645,0,0,@437,0,0,1 654:O4|13,0,@439,1 655:O2|@657,@656 656:O2|@658,0 657:S6|506f6c794d4c 658:O4|@20058,69,@659,0 659:O4|@657,@661,@660,@390 660:O6|@663,I48,0,@390,@662,0 661:O2|1,@509 662:O1|@13848 663:O4|1,@20060,@20061,@20059 664:O2|@13436,@13846 665:O2|@667,@666 666:O2|@668,0 667:S10|50546f70656e65644174 668:O4|@20043,69,@669,0 669:O7|@667,@671,@672,@670,@390,0,0 670:O3|2,@691,@690 671:O2|0,14 672:O2|1,@673 673:O3|14,@674,0 674:O2|@676,@675 675:O2|@681,@680 676:O2|7,@677 677:O8|@678,@667,0,0,@437,0,0,1 678:O4|13,6,@679,13 679:O4|6,@439,0,0 680:O2|@687,0 681:O2|7,@682 682:O8|@683,@667,0,0,@437,0,0,1 683:O3|14,@684,1 684:O2|@686,@685 685:O2|@439,0 686:O3|2,6,0 687:O2|7,@688 688:O8|@689,@667,0,0,@437,0,0,1 689:O4|6,@439,1,1 690:O5|5,0,@721,@720,@390 691:O5|5,0,@693,@692,@390 692:O3|@693,@390,@694 693:S8|6c6f636174696f6e 694:O3|@661,@696,@695 695:O3|@719,@417,@416 696:O3|2,0,@697 697:O3|3,@699,@698 698:O3|0,@714,1 699:O2|@701,@700 700:O2|@704,@703 701:O2|@702,@467 702:S4|66696c65 703:O2|@707,@706 704:O2|@705,@468 705:S7|656e644c696e65 706:O2|@710,@709 707:O2|@708,@468 708:S9|73746172744c696e65 709:O2|@712,0 710:O2|@711,@468 711:S11|656e64506f736974696f6e 712:O2|@713,@468 713:S13|7374617274506f736974696f6e 714:O2|@702,@715 715:O2|@705,@716 716:O2|@708,@717 717:O2|@711,@718 718:O2|@713,0 719:S15|506f6c794d4c2e6c6f636174696f6e 720:O3|@721,@390,@722 721:S12|707450726f70657274696573 722:O3|@724,@730,@723 723:O3|@731,@417,@416 724:O2|1,@725 725:O3|2,@726,0 726:O4|0,@20063,3,1 727:O1|@728 728:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@729,1,@15550|2,0,@413 729:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f747970655072696e746572283129 730:O4|1,@20064,0,0 731:S19|506f6c794d4c2e707450726f70657274696573 732:O2|@734,@733 733:O2|@735,0 734:S12|507265747479537472696e67 735:O4|@20043,69,@736,0 736:O7|@734,@738,@739,@737,@390,0,0 737:O3|2,@467,@891 738:O2|0,5 739:O2|1,@740 740:O3|2,@742,@741 741:O2|@749,0 742:O3|@744,@746,@743 743:O1|@748 744:O1|@745 745:D3,40|48833807740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@734,1,@15551| 746:O1|@747 747:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c39000000000000000003000000000000000|@734,3,@15552| 748:D3,24|488b4008c390909000000000000000001000000000000000|@734,1,@15553| 749:O4|@20054,69,@750,0 750:O3|2,3,@751 751:O5|@571,@753,@782,@752,@548 752:O22|@784,@788,@791,@787,@786,@796,@799,@795,@794,@804,@802,@744,@746,@743,@742,@808,@811,@807,@785,@814,@20065,@783 753:O2|@594,@754 754:O2|@756,@755 755:O2|@767,@766 756:O2|@758,@757 757:O3|0,@760,@576 758:O2|1,@759 759:O2|2,10 760:O8|@762,@734,0,0,@761,0,0,1 761:O2|@763,0 762:O4|13,3,@679,4 763:O2|1,@764 764:O2|@765,0 765:O3|2,0,@545 766:O2|@777,0 767:O2|@769,@768 768:O3|0,@771,@576 769:O2|1,@770 770:O2|2,11 771:O8|@773,@734,0,0,@772,0,0,1 772:O2|@776,0 773:O3|14,@774,1 774:O2|@775,@685 775:O3|2,3,0 776:O2|1,@545 777:O2|@779,@778 778:O3|0,@781,@576 779:O2|1,@780 780:O2|2,12 781:O8|@689,@734,0,0,@772,0,0,1 782:O21|2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2 783:O4|@814,@20065,3,1 784:O6|@783,@786,@794,@802,@742,@785 785:O3|@808,@811,@807 786:O3|@788,@791,@787 787:O1|@793 788:O1|@789 789:D3,40|48833801740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@790,1,@15554| 790:S11|507265747479426c6f636b 791:O1|@792 792:D3,80|488b4818488b5010488b5808488b30498d47d0483b45107303ff55404989c748c740f8050000004889482048895018488958104889700848c70001000000c39000000000000000004800000000000000|@790,31,@15555| 793:D3,72|488b4820488b5018488b5810488b7008498d47d8483b45107303ff55404989c748c740f804000000488948184889501048895808488930c300000000000000004000000000000000|@790,31,@15556| 794:O3|@796,@799,@795 795:O1|@801 796:O1|@797 797:D3,40|48833803740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@798,1,@15557| 798:S11|507265747479427265616b 799:O1|@800 800:D3,64|488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39000000000000000003800000000000000|@798,7,@15558| 801:D3,56|488b4810488b5008498d47e8483b45107303ff55404989c748c740f80200000048894808488910c300000000000000003000000000000000|@798,7,@15559| 802:O2|@804,@803 803:O1|2 804:O1|@805 805:D3,40|48833805740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@806,1,@15560| 806:S15|5072657474794c696e65427265616b 807:O1|@813 808:O1|@809 809:D3,40|48833809740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@810,1,@15561| 810:S21|507265747479537472696e67576974685769647468 811:O1|@812 812:D3,64|488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70009000000c39000000000000000003800000000000000|@810,7,@15562| 813:D3,56|488b4810488b5008498d47e8483b45107303ff55404989c748c740f80200000048894808488910c300000000000000003000000000000000|@810,7,@15563| 814:O1|@815 815:D3,24|48c7c001000000c300000000000000001000000000000000|@816,1,@15564| 816:S5|6e6f2d6571 817:O2|@818,@20065 818:D3,3384|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c3488b1848833b017568f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9c01607c9a37f0000eb6b4889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308488937eb05e9a304000049b848b419f1a37f00004d8b0052ff732051ff7318ff73104889f84c89c290ff12488b4c2410f6c101740feb05e94d0300004883f9037d14eb06f641ff10740c48b9c01607c9a37f0000eb5bf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9f8b319f1a37f0000488b09504889d04889caff12488b4c2418f6c101740d4883f9057d19eb0be959020000f641ff10740c48b9c01607c9a37f0000eb6bf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c241048890a48b9c8b719f1a37f0000488b09505248b8801c07c9a37f00004889ca90ff124889c1584889ca909090ff12488b4c2420f6c101740deb05e95f0100004883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c242848890a48b9c8b719f1a37f0000488b09488b5c2430498d77e8483b75107303ff55404989f748c746f80200000048bfe82907c9a37f000048893e488b5b0848895e08488066ffbf4889c3498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889700848c7000100000053524889ca909090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c428488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801750948c7c001000000eb0748c7c0030000004883f002498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9582a07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c348833b037571f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9c01607c9a37f0000eb684889caf6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b530848891648bf48b419f1a37f0000eb05e922020000488b3fff7310514889f04889fa90ff1259f6c10174064883e902710cff5570eb05e9d8000000ebee498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a48b948b419f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801750948c7c001000000eb0748c7c0030000004883f002498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b82a07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c348833b05750b48b8182b07c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c348833b077563f6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4b0848890a48be68b419f1a37f0000488b364889d04889f2909090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5008f6c20174084883fa037d13eb06f642ff10740b48b8901607c9a37f0000c3488b30f6c20174064883ea027105ff5570ebf5f6c20174084883fa017d14eb06f642ff10740c48bac01607c9a37f0000eb704889d740f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808488b7e0849893849b968b419f1a37f00004d8b09ff7610524c89c04c89ca909090ff1259f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e9c9000000ff55404989d748c742f80200000048894a085948890a48b948b419f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801750948c7c001000000eb0748c7c0030000004883f002498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9102c07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909090900000000000000000300d000000000000|@873,1048575,@15570|34,0,@819 89,0,@821 163,0,@20050 227,0,@821 290,0,@20045 341,0,@821 405,0,@20066 420,0,@842 512,0,@20066 554,0,@872 680,0,@831 725,0,@833 766,0,@834 845,0,@833 886,0,@834 965,0,@833 1006,0,@834 1086,0,@835 1233,0,@833 1274,0,@874 1369,0,@819 1421,0,@821 1487,0,@20050 1576,0,@20050 1624,0,@831 1669,0,@833 1710,0,@834 1786,0,@835 1933,0,@833 1974,0,@877 2069,0,@819 2086,0,@880 2116,0,@819 2184,0,@20052 2309,0,@883 2378,0,@884 2419,0,@835 2552,0,@833 2593,0,@885 2692,0,@819 2741,0,@821 2808,0,@20052 2892,0,@20050 2940,0,@831 2985,0,@833 3026,0,@834 3099,0,@835 3246,0,@833 3287,0,@888 819:O2|3,@820 820:S3|2e2e2e 821:O2|@822,0 822:O2|3,@823 823:S4|2e2e2e29 824:O2|@825,@20066 825:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb981707c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@841,15,@15566|29,0,@826 826:D3,784|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c348833801750b48b8d01a07c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c3488b18f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9c01607c9a37f0000eb71488b72084889cf40f6c70174064883ef027105ff5570ebf5498d47e8483b45107303ff55404989c748c740f80200000048897808488b3b48893852ff730851488b560890ff1259f6c10174064883e9027105ff5570ebf5498d57c0483b55107303ff55404989d748c742f802000000eb05e9fa00000048894a085948890a488b0c24488b5910488b1b488b71084889c7488d421848c740f8040000004c8b46184c8940184c8b4e104c8948104c8b56084c89500848c7000100000057524889daff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c81b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909000000000000000000803000000000000|@840,1048575,@15565|34,0,@819 51,0,@827 81,0,@819 130,0,@821 372,0,@831 417,0,@833 458,0,@834 538,0,@835 649,0,@833 690,0,@836 827:O5|0,0,0,@390,@828 828:O2|@829,0 829:O2|3,@830 830:S3|6e696c 831:O2|@832,0 832:O2|3,41 833:O3|1,1,0 834:O2|3,44 835:O2|3,40 836:O5|0,0,0,@390,@837 837:O2|@838,0 838:O2|3,@839 839:S2|3a3a 840:S10|7072696e742d6c697374 841:S11|7072696e746c6973742829 842:O4|0,@843,3,1 843:O1|@844 844:D3,48|483b65187303ff554848b9d8b719f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@871,1048575,@15568|11,0,@20067 845:O1|@846 846:D3,2528|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c3488b1048833a017569f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb6b488b5a084889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308eb05e99206000048893749b848b419f1a37f00004d8b0051534889f84c89c29090ff12488b4c2408f6c101740f4883f903eb05e9530500007d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48be48b419f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be68b419f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48be48b419f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b948b419f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c82807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5808f6c30174084883fb037d13eb06f643ff10740b48b8901607c9a37f0000c3f6c30174064883eb027105ff5570ebf5f6c30174084883fb017d14eb06f643ff10740c48bbc01607c9a37f0000eb6e4889de40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b720848893749b868b419f1a37f00004d8b00ff7210534889f84c89c290ff1259f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e9c9000000ff55404989d748c742f80200000048894a085948890a48b968b419f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0858488903498d47e8483b45107303ff55404989c748c740f8020000004889580848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000a801498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9482907c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3900000000000000000d809000000000000|@871,1048575,@15567|34,0,@819 89,0,@847 167,0,@20050 223,0,@847 290,0,@20050 341,0,@847 408,0,@20052 461,0,@847 529,0,@20050 620,0,@20050 668,0,@850 713,0,@833 754,0,@852 795,0,@833 836,0,@834 909,0,@833 953,0,@854 997,0,@833 1038,0,@834 1111,0,@833 1155,0,@856 1199,0,@833 1240,0,@834 1313,0,@833 1357,0,@858 1401,0,@833 1442,0,@834 1519,0,@833 1563,0,@860 1604,0,@862 1729,0,@833 1770,0,@863 1869,0,@819 1915,0,@821 1982,0,@20052 2064,0,@20052 2112,0,@831 2157,0,@833 2198,0,@834 2271,0,@835 2396,0,@833 2437,0,@867 847:O2|@848,0 848:O2|3,@849 849:S4|2e2e2e7d 850:O2|@851,0 851:O2|3,125 852:O2|3,@853 853:S15|7374617274506f736974696f6e203d 854:O2|3,@855 855:S11|73746172744c696e65203d 856:O2|3,@857 857:S6|66696c65203d 858:O2|3,@859 859:S13|656e64506f736974696f6e203d 860:O2|3,@861 861:S9|656e644c696e65203d 862:O2|3,123 863:O5|0,0,0,@390,@864 864:O2|@865,0 865:O2|3,@866 866:S15|436f6e746578744c6f636174696f6e 867:O5|0,0,0,@390,@868 868:O2|@869,0 869:O2|3,@870 870:S15|436f6e7465787450726f7065727479 871:S13|7072696e742d636f6e74657874 872:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@873,1048575,@15569| 873:S12|7072696e742d707265747479 874:O5|0,0,0,@390,@875 875:O2|@876,0 876:O2|3,@790 877:O5|0,0,0,@390,@878 878:O2|@879,0 879:O2|3,@798 880:O5|0,0,0,@390,@881 881:O2|@882,0 882:O2|3,@806 883:O2|@884,@831 884:O3|1,0,0 885:O5|0,0,0,@390,@886 886:O2|@887,0 887:O2|3,@734 888:O5|0,0,0,@390,@889 889:O2|@890,0 890:O2|3,@810 891:O5|5,0,@893,@892,@390 892:O3|@893,@390,@894 893:S6|707265747479 894:O3|@896,@914,@895 895:O3|@915,@417,@416 896:O2|1,@897 897:O3|2,@783,@898 898:O2|@899,0 899:O4|@20054,69,@900,0 900:O3|2,4,@901 901:O5|@571,@902,@782,@752,@548 902:O2|@594,@903 903:O2|@905,@904 904:O2|@911,@599 905:O2|@907,@906 906:O3|0,@909,@576 907:O2|1,@908 908:O2|2,18 909:O8|@509,@816,0,0,@910,0,0,1 910:O2|@441,@437 911:O2|@912,@573 912:O2|1,@913 913:O2|2,19 914:O4|1,@20068,0,0 915:S13|506f6c794d4c2e707265747479 916:O2|@918,@917 917:O2|@919,0 918:S14|736f757263654c6f636174696f6e 919:O4|@20043,69,@920,0 920:O7|@918,2,@922,@921,@390,0,0 921:O3|2,@923,@691 922:O2|3,3 923:O5|5,0,@925,@924,0 924:O3|@925,@390,@926 925:S4|756e6974 926:O3|@661,@928,@927 927:O3|@925,@417,@925 928:O3|2,0,@929 929:O3|3,0,@930 930:O3|0,0,1 931:O2|@933,@932 932:O2|@934,0 933:S7|50547265664964 934:O4|@20043,69,@935,0 935:O7|@933,@671,@937,@936,@390,0,0 936:O3|2,@468,@690 937:O2|1,@938 938:O3|14,@939,0 939:O2|@941,@940 940:O2|@945,@944 941:O2|7,@942 942:O8|@943,@933,0,0,@437,0,0,1 943:O4|13,11,@679,13 944:O2|@950,0 945:O2|7,@946 946:O8|@947,@933,0,0,@437,0,0,1 947:O3|14,@948,1 948:O2|@949,@685 949:O3|2,11,0 950:O2|7,@951 951:O8|@689,@933,0,0,@437,0,0,1 952:O2|@954,@953 953:O2|@955,0 954:S12|50547265666572656e636573 955:O4|@20043,69,@956,0 956:O7|@954,@671,@958,@957,@390,0,0 957:O3|2,@987,@690 958:O2|1,@959 959:O3|14,@960,0 960:O2|@962,@961 961:O2|@966,@965 962:O2|7,@963 963:O8|@964,@954,0,0,@437,0,0,1 964:O4|13,10,@679,13 965:O2|@978,0 966:O2|7,@967 967:O8|@968,@954,0,0,@437,0,0,1 968:O4|3,@518,@969,1 969:O2|7,@970 970:O8|@972,@971,0,0,@437,0,0,1 971:S6|3c616e6f6e3e 972:O3|14,@973,1 973:O2|@975,@974 974:O2|@679,@976 975:O3|2,10,0 976:O2|@977,0 977:O4|6,@439,1,0 978:O2|7,@979 979:O8|@980,@954,0,0,@437,0,0,1 980:O4|3,@518,@981,1 981:O2|7,@982 982:O8|@983,@971,0,0,@437,0,0,1 983:O3|14,@984,0 984:O2|@689,@985 985:O2|@986,0 986:O4|6,@439,2,1 987:O3|3,@988,@395 988:O2|@990,@989 989:O2|@991,0 990:O2|49,@393 991:O2|50,@992 992:O5|5,@994,@995,@993,@390 993:O3|@995,@390,@996 994:O2|@691,0 995:S4|6c697374 996:O3|@998,@1122,@997 997:O3|@995,@417,@416 998:O2|1,@999 999:O3|2,@1001,@1000 1000:O2|@1013,0 1001:O4|@1003,@20066,@1008,@1002 1002:O1|@1011 1003:O1|@1004 1004:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa03b07c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1007,7,@15572|29,0,@1005 1005:D3,152|483b65187303ff554852483bc3750c48c7c0030000004883c408c3a8017556f6c3017545488b0c24488b5108ff7308ff7008488b1b488b00488b324889f29090ff124883f8017415488b5c2408584883c408483b65187303ff5548ebad48c7c0010000004883c418c348c7c0010000004883c408c348c7c0010000004883c408c39090909090909000000000000000009000000000000000|@1006,1048575,@15571| 1006:S10|65712d6c697374283229 1007:S13|65712d6c697374283229285029 1008:O1|@1009 1009:D3,24|48c7c007000000c300000000000000001000000000000000|@1010,1,@15573| 1010:S10|626f7865642d6c697374 1011:D3,24|48c7c003000000c300000000000000001000000000000000|@1012,1,@15574| 1012:S9|73697a652d6c697374 1013:O4|@20054,69,@1014,0 1014:O3|2,4,@1015 1015:O5|@571,@1017,@1110,@1016,@548 1016:O12|@1112,@1115,@1117,@1114,@1113,@1120,@1111,@1003,@20066,@1008,@1002,@1001 1017:O2|@594,@1018 1018:O2|@1020,@1019 1019:O2|@1099,@1098 1020:O2|@1022,@1021 1021:O3|0,@1024,@576 1022:O2|1,@1023 1023:O2|2,6 1024:O8|@1026,@1007,0,0,@1025,0,0,1 1025:O2|@1091,0 1026:O2|7,@1027 1027:O8|@1029,@1006,0,@1090,@1028,0,10,1 1028:O2|@546,@540 1029:O3|0,@1031,@1030 1030:O2|@1086,@1085 1031:O4|1,@1033,@442,@1032 1032:O4|1,@1043,@1042,@509 1033:O4|3,@1034,@502,1 1034:O2|@1036,@1035 1035:O2|@1039,0 1036:O2|@1037,1 1037:O2|4,@1038 1038:O2|2,4 1039:O2|@1040,1 1040:O2|4,@1041 1041:O2|2,5 1042:O4|1,@1049,@1048,@509 1043:O4|3,@1044,@513,1 1044:O2|@1045,0 1045:O2|@1046,1 1046:O4|3,@1047,@517,1 1047:O2|@1036,0 1048:O3|10,@1054,@1053 1049:O4|3,@1050,@513,1 1050:O2|@1051,0 1051:O2|@1052,1 1052:O4|3,@1035,@517,1 1053:O4|1,@1067,@1066,@509 1054:O2|@1056,@1055 1055:O2|@1059,@1058 1056:O4|1,@545,6,@1057 1057:O4|6,@1037,0,1 1058:O2|@1062,@1061 1059:O4|1,@545,7,@1060 1060:O4|6,@1037,1,1 1061:O2|@1064,0 1062:O4|1,@545,8,@1063 1063:O4|6,@1040,0,1 1064:O4|1,@545,9,@1065 1065:O4|6,@1040,1,1 1066:O2|9,@1077 1067:O4|3,@1069,@1068,1 1068:O4|6,@1076,0,0 1069:O2|@1071,@1070 1070:O2|@1073,0 1071:O2|@1072,1 1072:O2|4,@1023 1073:O2|@1074,1 1074:O2|4,@1075 1075:O2|2,8 1076:O2|4,@441 1077:O2|@1079,@1078 1078:O2|@1082,0 1079:O2|@1080,1 1080:O2|4,@1081 1081:O2|2,7 1082:O2|@1083,1 1083:O2|4,@1084 1084:O2|2,9 1085:O2|@1088,0 1086:O2|@1087,1 1087:O3|@547,4,@439 1088:O2|@1089,1 1089:O3|@547,5,@507 1090:O2|@440,0 1091:O2|1,@1092 1092:O2|@1093,0 1093:O3|2,0,@1094 1094:O2|@1095,0 1095:O3|0,@545,@1096 1096:O2|@1072,@1097 1097:O2|@1074,0 1098:O2|@1102,@1101 1099:O2|@1100,@573 1100:O2|1,@1081 1101:O2|@1106,0 1102:O2|@1104,@1103 1103:O3|0,@1105,@576 1104:O2|1,@1075 1105:O8|@775,@1010,0,0,@437,0,0,1 1106:O2|@1108,@1107 1107:O3|0,@1109,@576 1108:O2|1,@1084 1109:O8|@442,@1012,0,0,@437,0,0,1 1110:O11|2,2,2,2,2,2,2,1,2,2,2 1111:O2|@1120,0 1112:O3|@1001,@1113,@1111 1113:O3|@1115,@1117,@1114 1114:O1|@1119 1115:O1|@1116 1116:D3,48|a801750948c7c001000000eb0748c7c0030000004883f002c39090909090909000000000000000002800000000000000|@839,1,@15575| 1117:O1|@1118 1118:D3,56|488b4808488b10498d47e8483b45107303ff55404989c748c740f80200000048894808488910c39000000000000000003000000000000000|@839,7,@15576| 1119:D3,56|488b4808488b10498d47e8483b45107303ff55404989c748c740f80200000048894808488910c39000000000000000003000000000000000|@839,7,@15577| 1120:O1|@1121 1121:D3,40|4883f801740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@830,1,@15578| 1122:O4|1,@20069,1,0 1123:O2|@866,@1124 1124:O2|@1125,0 1125:O4|@20043,69,@1126,0 1126:O7|@866,@1128,@1129,@1127,@390,0,0 1127:O3|2,@691,@1177 1128:O2|0,2 1129:O2|1,@1130 1130:O3|2,@1132,@1131 1131:O2|@1139,0 1132:O3|@1134,@1136,@1133 1133:O1|@1138 1134:O1|@1135 1135:D3,40|48833801740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@866,1,@15579| 1136:O1|@1137 1137:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c39000000000000000003000000000000000|@866,3,@15580| 1138:D3,24|488b4008c390909000000000000000001000000000000000|@866,1,@15581| 1139:O4|@20054,69,@1140,0 1140:O3|2,3,@1141 1141:O5|@571,@1143,@1165,@1142,@548 1142:O12|@1167,@1134,@1136,@1133,@1132,@1170,@1172,@1169,@1168,@1175,@20067,@1166 1143:O2|@594,@1144 1144:O2|@1146,@1145 1145:O2|@1153,@1152 1146:O2|@1148,@1147 1147:O3|0,@1150,@576 1148:O2|1,@1149 1149:O2|2,0 1150:O8|@1151,@866,0,0,@761,0,0,1 1151:O4|13,0,@679,1 1152:O2|@1160,0 1153:O2|@1155,@1154 1154:O3|0,@1157,@576 1155:O2|1,@1156 1156:O2|2,1 1157:O8|@1158,@866,0,0,@772,0,0,1 1158:O3|14,@1159,1 1159:O2|@509,@685 1160:O2|@1162,@1161 1161:O3|0,@1164,@576 1162:O2|1,@1163 1163:O2|2,2 1164:O8|@689,@866,0,0,@772,0,0,1 1165:O11|2,2,2,2,2,2,2,2,2,1,2 1166:O4|@1175,@20067,3,1 1167:O3|@1166,@1132,@1168 1168:O3|@1170,@1172,@1169 1169:O1|@1174 1170:O1|@1171 1171:D3,40|48833803740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@870,1,@15582| 1172:O1|@1173 1173:D3,64|488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39000000000000000003800000000000000|@870,7,@15583| 1174:D3,56|488b4810488b5008498d47e8483b45107303ff55404989c748c740f80200000048894808488910c300000000000000003000000000000000|@870,7,@15584| 1175:O1|@1176 1176:D3,24|48c7c001000000c300000000000000001000000000000000|@816,1,@15585| 1177:O5|5,0,@1179,@1178,@390 1178:O3|@1179,@390,@1180 1179:S7|636f6e74657874 1180:O3|@1182,@1193,@1181 1181:O3|@1194,@417,@416 1182:O2|1,@1183 1183:O3|2,@1166,@1184 1184:O2|@1185,0 1185:O4|@20054,69,@1186,0 1186:O3|2,4,@1187 1187:O5|@571,@1188,@1165,@1142,@548 1188:O2|@594,@1189 1189:O2|@1191,@1190 1190:O2|@1192,@599 1191:O2|@1104,@906 1192:O2|@1108,@573 1193:O4|1,@20070,0,0 1194:S14|506f6c794d4c2e636f6e74657874 1195:O2|@1197,@1196 1196:O2|@1198,0 1197:S12|505466697273744368696c64 1198:O4|@20043,69,@1199,0 1199:O7|@1197,@671,@1201,@1200,@390,0,0 1200:O3|2,@1216,@690 1201:O2|1,@1202 1202:O3|14,@1203,0 1203:O2|@1205,@1204 1204:O2|@1209,@1208 1205:O2|7,@1206 1206:O8|@1207,@1197,0,0,@437,0,0,1 1207:O4|13,4,@679,13 1208:O2|@1214,0 1209:O2|7,@1210 1210:O8|@1211,@1197,0,0,@437,0,0,1 1211:O3|14,@1212,1 1212:O2|@1213,@685 1213:O3|2,4,0 1214:O2|7,@1215 1215:O8|@689,@1197,0,0,@437,0,0,1 1216:O3|2,@923,@1217 1217:O5|5,0,@1219,@1218,@390 1218:O3|@1219,@390,@1220 1219:S9|706172736554726565 1220:O3|@661,@1222,@1221 1221:O3|@1230,@417,@416 1222:O3|2,0,@1223 1223:O3|3,@1224,@395 1224:O2|@1226,@1225 1225:O2|@1227,0 1226:O2|49,@691 1227:O2|50,@1228 1228:O5|5,@1229,@995,@993,@390 1229:O2|@690,0 1230:S16|506f6c794d4c2e706172736554726565 1231:O2|@1233,@1232 1232:O2|@1234,0 1233:S13|50547374727563747572654174 1234:O4|@20043,69,@1235,0 1235:O7|@1233,@671,@1236,@670,@390,0,0 1236:O2|1,@1237 1237:O3|14,@1238,0 1238:O2|@1240,@1239 1239:O2|@1244,@1243 1240:O2|7,@1241 1241:O8|@1242,@1233,0,0,@437,0,0,1 1242:O4|13,12,@679,13 1243:O2|@1249,0 1244:O2|7,@1245 1245:O8|@1246,@1233,0,0,@437,0,0,1 1246:O3|14,@1247,1 1247:O2|@1248,@685 1248:O3|2,12,0 1249:O2|7,@1250 1250:O8|@689,@1233,0,0,@437,0,0,1 1251:O2|@1253,@1252 1252:O2|@1254,0 1253:S9|4e616d655370616365 1254:O4|@20058,69,@1255,0 1255:O4|@1253,@661,@1256,@390 1256:O6|@1258,I48,0,@390,@1257,0 1257:O1|@7704 1258:O4|1,@20072,@20073,@20071 1259:O1|@1260 1260:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@15586,@375| 1261:O2|@7623,@7622 1262:O2|@1264,@1263 1263:O2|@1265,0 1264:S11|54797065436f6e73747273 1265:O4|@20058,69,@1266,0 1266:O4|@1264,@661,@1267,@390 1267:O6|@1269,I48,0,@390,@1268,0 1268:O1|@2057 1269:O4|1,@20076,@20077,@20075 1270:O1|@1271 1271:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@15587,@375| 1272:O2|@2047,@2046 1273:O2|@1275,@1274 1274:O2|@1276,0 1275:S5|7072696e74 1276:O4|@20043,69,@1277,0 1277:O7|@1275,2,@1279,@1278,@390,0,0 1278:O3|2,@1725,@891 1279:O2|1,@1280 1280:O3|2,@1281,0 1281:O1|@1282 1282:D4,216|483b65187303ff5548f6401001756f488b4810498d57e8483b55107303ff55404989d748c742f80200000048bb506307c9a37f000048891a488b1948895a08488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf306407c9a37f000048893e48895e08488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f80200000048897708488917eb0a48bfd06407c9a37f000049c7c1010000004989f8488b5808488b084889c848ba886507c9a37f0000ff25280000000000000000000000d000000000000000|@1724,2097151,@15742,@1293|45,0,@1283 94,0,@1285 156,0,@1286 186,0,@1291 1283:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@15588| 1284:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d616b6554797065456e76283129283129 1285:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@15589| 1286:O2|@1288,@1287 1287:O1|@1290 1288:O1|@1289 1289:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@15590| 1290:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@15591| 1291:O4|@1293,@1415,@1613,@1292 1292:O13|@1633,@1632,@20081,@20051,@469,@20085,@1587,@20087,@1597,@20089,@1605,@20056,@477 1293:D18,2360|483b65187303ff554848837808017568488b08488b7110488b7e0848833f05755cf6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c34989d24989db4c8b2148c7c00100000090ff15fa0800004151415050ff77104152415341544989c04c89db488b4708498b52109090ff12eb0ae98d040000e9080200006a016a014989c34889e3488b442410909090ff15be080000498d47e8483b45107303ff55404989c748c740f8020000004883c408594883c4084889480848c70007000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1359f6c10174064883e9027105ff5570ebf5488b14244153504c8b5424304c8b4c24284c8b4424204889cb488b442418488b5208ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014883f9017506488b0424eb0e4889cb488b042490ff1582070000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c430488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9507107c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c34c8b41104d8b480849833905751348b8807107c9a37f0000488b5d08909090ff134983390175224d8b511049833a03750f4d8b5a084d8b1b4983fb017524eb1649837a0801740feb194d8b51084d8b124983fa01750c49ba687107c9a37f0000eb0a49ba387207c9a37f00004d8d5fe84c3b5d107303ff55404d89df49c743f8020000004d89530849c7030700000041f6c301741048b8f86f07c9a37f0000488b5d08ff134983390375064d8b5110eb3e4983390175064d8b5108eb3249c7c2010000004d8b610841f6c401752141f6c20174064983c2027105ff5570ebf54d8b642408483b65187303ff5548ebd9525351415348bb507207c9a37f00004c89d0909090ff15b60500004889c648c7c001000000ff15ae050000488b4c24184989c0488b5c24104889f0488b51109090ff12488b4c24086a016a014989c34889e3488b01ff1586050000498d47e8483b45107303ff55404989c748c740f8020000004883c408594889480848c70007000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014883f901740f4889cb4c89d8ff151a0500004989c3498d47e8483b45107303ff55404989c748c740f8020000004c89580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3488b08f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c34889d64889df4c8b50084989cb4c8b61084c8b2948c7c0010000009090ff153a040000498b4b10488b510848833a037506488b5a10eb3c48833a017506488b5a08eb3048c7c3010000004c8b720841f6c601751ff6c30174064883c3027105ff5570ebf54d8b7608483b65187303ff5548ebdb4151415056575041524153415441554989de48bb187307c9a37f00004c89f0909090ff15ca0300004989c04c89c0ff15c6030000498d4fd0483b4d107303ff55404989cf48c741f805000000488b54240848895120488b542410488951185b4883c408488959104889410848c7010b000000488b442420514c89c34c8b4424184889de488b5c2420488b78104889f04889faff12488b4c24086a016a014989c34889e3488b01ff1556030000498d47e8483b45107303ff55404989c748c740f8020000004883c408594889480848c70007000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048bab07307c9a37f0000488951084889014883f90174114889cb4c89d89090ff15e20200004989c3498d47e8483b45107303ff55404989c748c740f8020000004c89580848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8007407c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c2420f6c10174064883e9027105ff5570ebf5f644241001756e488b542410488b1a488b74242850ff720851ff742418ff7608ff742440ff742460ff7424704c8b56184989c94c8b4318488b134889d348c7c0030000009090ff15e201000059f6c10174064883e9027105ff5570ebf5488b54243850ff742430ff742450ff7424604c8b5208eb05e9890000004c8b4c24304c8b42184889cb488b442420909090ff15a20100004883f8017506488b0424eb104889c3488b0424909090ff158e010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100300000048c741080500000048c70101000000f6c101742248b8f86f07c9a37f0000488b5d08909090ff1348b9307407c9a37f0000506a016a01498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f802000000488941084883c410584883c440488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3909000000000000000003009000000000000|@1322,2097151,@15595,@1323,@1348,@1352,@1354,@1323,@1348,@1361,@1323,@1354,@1362,@1348,@1364,@1365,@1412,@1321|54,0,@819 207,0,@1294 327,0,@833 368,0,@1302 409,0,@833 508,0,@833 553,0,@1303 635,0,@1294 671,0,@819 696,0,@1305 768,0,@1304 780,0,@1309 831,0,@1294 926,0,@1310 1059,0,@1294 1159,0,@833 1274,0,@1294 1314,0,@819 1458,0,@1313 1659,0,@1294 1699,0,@1315 1767,0,@1317 1808,0,@1318 1887,0,@1294 2164,0,@1294 2183,0,@1320 2327,0,@1294 1294:O4|@20079,@1299,@1300,@1295 1295:O5|@1301,111,0,111,0 1296:O1|@1297 1297:O1|@1298 1298:D3,48|483b65187303ff554848b978b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@556,1048575,@15592|11,0,@20029 1299:S4|43617374 1300:S9|746f41646472657373 1301:S35|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f416464726573732e4d4c 1302:O2|3,61 1303:O2|3,@1304 1304:S4|74797065 1305:O4|@20055,@557,@1307,@1306 1306:O5|@1308,345,0,345,0 1307:S18|6973457175616c6974793a2054797065466e 1308:S34|6d6c736f757263652f4d4c436f6d70696c65722f5354525543545f56414c532e4d4c 1309:S6|657174797065 1310:O1|@1311 1311:D3,96|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f1700200488908c300000000000000005800000000000000|@1312,3,@15593|30,0,@573 1312:S28|545950455f5452454528292e74635479706556617273283129283129 1313:O1|@1314 1314:D3,96|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f1700200488908c300000000000000005800000000000000|@1312,3,@15594|30,0,@573 1315:O2|@833,@1316 1316:O2|@1302,0 1317:O3|1,1,2 1318:O2|3,@1319 1319:S8|6461746174797065 1320:O2|3,I48 1321:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15623| 1322:S40|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d6170283429 1323:D3,192|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048b9e87507c9a37f0000488908498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700ffffffff498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004889c2498d47e0483b45107303ff55404989c748c740f80300000048bb687b07c9a37f00004889184889480848895010488060ffbfc3909090900000000000000000b800000000000000|@1347,15,@15600|37,0,@1324 147,0,@1342 1324:O1|@1325 1325:D3,848|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b8282707c9a37f0000eb6e488b104889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf48b919f1a37f0000488b3f51524889f04889faff12595af6c20174064883ea027105ff5570ebf5498d5fe8483b5d10730aeb05e970010000ff55404989df48c743f80200000048895308488b0948890b48b978b019f1a37f0000488b09504889d84889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e07907c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9107a07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b02807c9a37f0000488901498d47a0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000488d483048c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8407a07c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090909000000000000000004803000000000000|@1341,1048575,@15597|34,0,@1326 80,0,@847 149,0,@20080 231,0,@20029 280,0,@850 325,0,@833 366,0,@1329 407,0,@833 448,0,@834 521,0,@833 562,0,@1331 603,0,@862 714,0,@833 755,0,@1333 1326:O2|3,@123 1327:O1|@1328 1328:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@15596|2,0,@388 1329:O2|3,@1330 1330:S6|6e616d65203d 1331:O2|3,@1332 1332:S7|656e747279203d 1333:O5|0,0,0,@1335,@1334 1334:O2|@1339,0 1335:O2|@1336,0 1336:O2|0,@1337 1337:O5|@1338,1124,1124,0,0 1338:S32|6d6c736f757263652f4d4c436f6d70696c65722f545950455f545245452e4d4c 1339:O2|3,@1340 1340:S5|4e616d6573 1341:S11|7072696e742d6e616d6573 1342:D5,288|483b65187303ff5548488b4a08488b09f6c101753e488b19488b7308488b3e483b38751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498918eb194c8b41084c89c1483b65187303ff5548ebbd49c7c00100000041f6c00175074d8b00498b00c3488b4a10488b09f6c10174064883c1027105ff5570ebf5488b5a1048890b488b48084883e1094883f901750948c7c14f000000eb0a48b9c07c07c9a37f0000488b1b5250514889d890ff15820000004889c3589090ff157e000000498d4fd0483b4d107303ff55404989cf48c741f8020000005a48895108488901488b1424488b5a08488b1b488d711848c746f80200000048895e0848890e488b52084883c408488932c39090909000000000000000001801000000000000|@1345,2097151,@15598,@1344,@100|158,0,@1343 1343:S2|2727 1344:D4,360|483b65187303ff5548a80174084883f8357c65eb06f640ff107562a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f90374134889c1f6c10174064883e9327108ff5570ebf54889c15048c7c3350000004889c848ba90a9dc00000000009090ff12a8017412eb0ae917000000e9120000004883e8027105ff5570ebf5e86effffffeb0e4889c148b8509adc0000000000515048c7c335000000488b44240848bad0a9dc0000000000909090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0347105ff5570ebf5a80174094881c0c20000007105ff5570ebf2a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1deb06f640ff1075154889c148b8f83b06c9a37f0000488b5d089090ff134889c3584883c408ff25290000009000000000000000006001000000000000|@1346,2097151,@15599,@100|102,0,I109 153,0,I48 177,0,I110 313,0,@95 1345:S33|545950455f5452454528292e7661724e616d6553657175656e6365283129283129 1346:S40|545950455f5452454528292e7661724e616d6553657175656e63652831292831296e616d65283129 1347:S30|545950455f5452454528292e7661724e616d6553657175656e6365283129 1348:D5,528|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c090148c7c201000000488d52ff4803d16a016a014883fa017551498d77c0483b75107303ff55404989f748c746f8030000004889461048c7460801000000488916488d562048c742f8030000004889421048894a0848c702010000004889e74889374889e648895608eb6f4889d64883ee02a80174054889c6eb114883c61048d1ee480fb63430488d7436014883fe5d74124883ea02483b65187303ff5548e970ffffff4889d6498d7fe0483b7d107303ff55404989ff48c747f803000000488947104889770848c707010000004889ce482bf24883c601eb05e9300000004d8d47e04c3b45107303ff55404d89c749c740f80300000049894010498970084989104889e248893a4889e24c894208488b0c244883790801751d48b9509adc000000000048890b4889430848c7c0010000004883c410c36a016a016a01488b4108a80174084883f8037d29eb06f640ff1074214889e2488b314889324889e248c74208010000004889e2488b791048897a10eb1f4883e8024889e2488b314889324889e2488942084889e0488b5110488950104989d94c8b442410488b5c2408584883c410909090ff155e000000488b4c24084989c24c8b4110488b5908488b01909090ff154a0000004d89114989410848c7c0010000004883c410c39090909090909000000000000000000802000000000000|@1350,511,@15601,@1349,@1349|312,0,I48 1349:D3,288|41f6c001740948c7c103000000eb08498b08488d4c09014883f8017509483bd975044c89c0c34883fb01750b48b8509adc0000000000c34883fb0375124883c01048d1e8490fb60400488d440001c34889d94883c11e48c1e9034883c901483b0db300000072164889c248b8583e06c9a37f0000488b5d08909090ff134889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1eb48891f488d5c1b014883c2104c89c64889f84889c74889d948d1e948d1ea4803f2488d5412014883c708f3a4488d7c3f01488d743601488d4c0901488060ffbfc390909000000000000000001001000000000000ffffffffffffff01|@1351,127,@15602|46,0,I48 108,0,@101 1350:S27|5554494c49544945535f28292e73706c6974537472696e67283129 1351:S19|537562737472696e672e737472696e67283129 1352:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15603| 1353:S15|4c6973742e40283229617070283129 1354:D3,416|483b65187303ff5548a80174084883f8017c08eb1cf640ff1074164889c148b8608507c9a37f0000488b5d08909090ff13a801740b483b055c0100007d08eb19f640ff1075134889c148b8e08507c9a37f0000488b5d08ff134889c1f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891748c7c001000000575253a8017410f6442408017409483b4424087c07eb49ff5570ebf250488b542408909090ff12488b0c24f6c10174064883c1027105ff5570ebf5488b5424184889448afc58a80174064883c0027105ff5570ebf5483b65187303ff5548eba3488b4424104883c410488b0048c7c1010000004883f80175084889c84883c408c34889c24883ea024883e802a80174064883c0027105ff5570ebf5488b1c24488b4483fc498d77e8483b75107303ff55404989f748c746f80200000048894e084889064889d04889f1483b65187303ff5548eb9f909090909000000000000000009001000000000000fdffffffffffff01|@1360,1048575,@15604|32,0,@1355 75,0,@1358 1355:O4|4,@103,0,@1356 1356:O5|@1357,175,0,175,0 1357:S17|2e2f62617369732f41727261792e736d6c 1358:O4|4,@103,0,@1359 1359:O5|@1357,123,0,123,0 1360:S16|4c6973742e746162756c617465283229 1361:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15605| 1362:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@15606| 1363:S13|4c6973742e6d61702832292829 1364:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15607| 1365:D5,1144|483b65187303ff55486a016a014151535041524c89c14c8d44242048bbe08c07c9a37f00004889c8ff1562040000488b44242890ff155e04000048837c240801750948c7c001000000eb0748c7c005000000498d4fe0483b4d107303ff55404989cf48c741f8030000004889411048c741080300000048c70103000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b44242048833805755851ff7008488b5c2468488b4010488b5424109090ff1248837c241801750c48b8688d07c9a37f0000eb0a48b8e08d07c9a37f0000488b4c2428f6c10174084883f9017f19eb06f641ff10741148ba008e07c9a37f0000eb70e92a020000498d57e8483b55107303ff55404989d748c742f802000000488b5c242048895a0848c70207000000f6c20174134889c348b8f86f07c9a37f0000488b5d08ff134889d3498d57e8483b55107303ff55404989d748c742f80200000048be188e07c9a37f000048897208eb05e90300000048891a498d5fb8483b5d107303ff55404989df48c743f80200000048895308488903488d431848c740f8050000004889582048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c248b8f86f07c9a37f0000488b5d08ff13f6c10174084883f9017e6beb06f641ff107568f6c10174064883e9027105ff5570ebf5504c8b5424504c8b4c24584c8b4424604889cb488b442408488b542468909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f802000000eb0ae918000000e9130000004889480848b9488e07c9a37f0000488908eb0b4889c148c7c00100000051498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594889084883c430c2280048837c240801750c48b8688d07c9a37f0000eb0a48b8e08d07c9a37f0000488b542418f6c20174084883fa017f14eb06f642ff10740c48baa81607c9a37f0000eb05488b542410498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c70307000000f6c30174134889c248b8f86f07c9a37f0000488b5d08ff13498d57a0483b55107303ff55404989d748c742f80200000048c742080100000048891a488d5a1848c743f80200000048895308488903488d431848c740f8050000004889582048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c248b8f86f07c9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f802000000488950084889084883c430c2280090909090909000000000000000007004000000000000|@1381,2097151,@15609,@1382,@1380|29,0,@1366 132,0,@1294 192,0,@1369 204,0,@1373 238,0,@1374 303,0,@1294 346,0,@1375 455,0,@1294 603,0,@1377 731,0,@1294 817,0,@1369 829,0,@1373 863,0,@820 923,0,@1294 1047,0,@1294 1366:O1|@1367 1367:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@15608| 1368:S39|545950455f5452454528292e67656e6572616c6973652831296e65774d617463687c742d283129 1369:O5|0,0,0,0,@1370 1370:O2|@1372,@1371 1371:O2|@1317,0 1372:O2|3,124 1373:O3|1,0,2 1374:O2|@819,0 1375:O2|@1377,@1376 1376:O2|@1378,0 1377:O3|1,1,4 1378:O2|3,@1379 1379:S2|6f66 1380:D3,208|483b65187303ff5548a801756d488b08488b5108488b5a084883e3094883fb01740948c7c301000000eb0748c7c3030000004883f302488b72084883e6034883fe01740948c7c601000000eb0748c7c6030000004883f602498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f08eb05e937000000488b1948891f57488b70084889f0e86effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000c800000000000000|@1363,63,@15620| 1381:S53|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e737472283429 1382:D4,168|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048beb09007c9a37f000048893248894a0848895a10488062ffbf41505149b898a207c9a37f00004889d39090ff154a00000059488b09488b142448890248894a0848c7c0010000004883c408c3909090909090900000000000000000a000000000000000|@1411,2097151,@15619,@1390|70,0,@1383 99,0,@1408 1383:D5,240|483b65187303ff55484883380d755b488b481048c1e9034883c901f6c10174084883f9017d2aeb06f641ff1074225052ff70084889cb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb0b4889c34889c85352ff73084881f81f4e0000740b4883c41058c3e96c000000488b4424084c8b4010488b5808488b442410909090ff157e000000488b0c24488b0948833907753d4883380d74144889c248b8d89107c9a37f0000488b5d0890ff1350ff700849b8489207c9a37f0000488b5c24184889c890ff154200000059488901eb0150584883c418c3c3909090900000000000000000e800000000000000|@1396,2097151,@15611,@1397,@1390|56,0,@376 66,0,I106 162,0,@1384 183,0,@1387 1384:O4|101,@1386,0,@1385 1385:O5|@1338,90,0,90,0 1386:S5|4d61746368 1387:O1|@1388 1388:D3,24|c39090909090909000000000000000001000000000000000|@1389,1,@15610| 1389:S47|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129283129 1390:D6,560|483b65187303ff5548534150ff15360200004883380975154889c148b8489507c9a37f0000488b5d089090ff13488b0848ba1a9307c9a37f0000488d548afcffe290e93a000000909090e941000000909090e948000000909090e9be000000909090e913000000909090e917010000909090e9030000009090904883c4085aff2248b8d09507c9a37f00004883c410c348b830e306c9a37f00004883c410c350ff7010ff70084c8b442418488b5c2420488b042490e846ffffff504c8b442420488b5c2428488b442410909090e82effffff488b0c24483b4c24087511483b442410750a4883c418584883c410c34889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c700050000004883c430c350ff7010ff70084c8b4c24184c8b44242048bbe09507c9a37f0000488b0424ff150e010000483b0424750a4883c410584883c410c34889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c700070000004883c428c350ff7020ff7018ff70084c8b4c24204c8b44242848bbe09507c9a37f0000488b0424ff15aa00000050488b442410488b542428909090ff12488b0c24483b4c24087511483b442410750a4883c420584883c410c34889c2498d47d0483b45107303ff55404989c748c740f805000000488b5c24184889582048895018488b12488950104889480848c7000b0000004883c438c39090909090909000000000000000002802000000000000|@1400,2097151,@15613,@1401,@1405,@1399|29,0,@1391 50,0,$1390+66 131,0,@1394 146,0,@573 304,0,@1395 412,0,@1395 1391:O4|@20055,@557,@1393,@1392 1392:O5|@1338,708,0,708,0 1393:S27|636f7079547970653a204f7665726c6f616453657420666f756e64 1394:O1|0 1395:O1|@1390 1396:S44|545950455f5452454528292e67656e6572616c6973655479706573283229636f707954797065566172283129 1397:D3,496|483b65187303ff55484883380d74164889c148b8d89107c9a37f0000488b5d08909090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b501048895108488b7008488931488b3b40f6c701753b4c8b0f4d8b5108493b32751d4d8d5ff04c3b5d107303ff55404d89df49c743f8010000004d890beb194c8b5f084c89df483b65187303ff5548ebbf49c7c3010000004983fb017563535156524889c84c89c290ff124883f8017555488b04244883e0094883f801740948c7c001000000eb0748c7c0030000004883f002488b0c244883e1034883f901740948c7c101000000eb0748c7c1030000004883f102498d57f0483b5510730feb0ae9cd000000e9c0000000ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a4883f801750948c7c001000000eb0748c7c0090000004881c8f1700200480bc14889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c7000d000000488b4c2408488b0948890a498d4fd0483b4d107303ff55404989cf48c741f802000000488b54241048895108488901488b542418488b12488d591848c743f8020000004889530848890b488b4c24184889194883c420c3488b004883c420c34d8b1b498b03c3909090909090900000000000000000e801000000000000|@1398,1048575,@15612|20,0,@1384 286,0,@573 1398:S36|545950455f5452454528292e67656e6572616c6973655479706573283229747673283129 1399:D3,168|483b65187303ff5548a801755550ff7008ff3041514150534d89c8488b5c2408488b442418488b1424909090ff12504c8b4c24184c8b442410488b5c2408488b4424289090e8b6ffffff488b0c24483b4c24207512483b442428750b4883c43058c3e9270000004889c2498d47e8483b45107303ff55404989c748c740f802000000488950084889084883c438c348c7c001000000c390900000000000000000a000000000000000|@1407,1048575,@15617| 1400:S23|545950455f5452454528292e636f707954797065283329 1401:D4,480|483b65187303ff55484883380d7563488b4808488b0950ff7008ff7010514889c8e8daffffff483b04247408488b4c24104889014883380975064883c41858c348833807756948c7c101000000488b5008f6c2017526f6c10174064883c1027105ff5570ebf5488b5208483b6518730aeb05e951010000ff5548ebd5488b501048833a017506488b5208eb12488b5208488b12483b65187303ff5548ebe248c7c301000000f6c2017526f6c301eb05e90301000074064883c3027105ff5570ebf5488b5208483b65187303ff5548ebd54889daf6c1017508f6c2017503ff5570483bca7533488b4810488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f90174054883c420c34883c41858c3488b4810488339017506488b4908eb12488b4908488b09483b65187303ff5548ebe2ff70104c8b442410488b58084889c8909090ff15a6000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1424488951104889410848c70107000000488b44241848890848833a017506488b5210eb12488b5208488b12483b65187303ff5548ebe24883fa0174084889c84883c428c34883c42058c34883380375064883c41858c34883c420c3c3909090909090900000000000000000d801000000000000|@1403,2097151,@15614,@1402| 1402:D3,1320|483b65187303ff5548a801755cf6c301755c488b0b488b3040f6c601740948c7c203000000eb08488b16488d5412014c8b0941f6c101740948c7c703000000eb08498b39488d7c3f01f6c201750940f6c7017503ff5570483bd77560493bf1745240f6c601755aeb0ae994040000e91703000041f6c101754841f6c101740948c7c203000000eb08498b11488d5412014883c2104c89cf4889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750e48c7c101000000eb45e9500000004c8b134c8b5b084c8b60084989dd4c8b304c89cb4c89f048ba1095dc00000000009090ff124883f801750948c7c103000000eb0748c7c1ffffffff4c89ebeb5e4c8b5b084c8b134c8b60084c8b30eb6840f6c601740948c7c203000000eb08488b16488d54120141f6c101740948c7c703000000eb08498b39488d7c3f01f6c201740b40f6c7017405483bd7eb05ff5570ebf67c0e48c7c103000000eb0ce91500000048c7c1ffffffff4c8b5b084c8b134c8b60084989f64883f901753341524c89db4c89e09090e872feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3f6c10174084883f9017d66eb06f641ff1074634c89c048c1e8034883c801a80174084883f8017d2aeb06f640ff107422415041545341564889c348b810c506c9a37f000048bad0a8dc0000000000ff12eb0741504154534156488b4c24184883e1094883f901741348c7c101000000eb11e912010000e90d01000048c7c1030000004883f102488b5424184883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933a8017513488b30f640ff10740348f7de488d743601eb034889c6488d34f5f9ffffff4883f901750948c7c001000000eb0748c7c009000000480bc6480bc2498d4fc8483b4d107303ff55404989cf48c741f803000000488941104889590848c7010d000000488d412048c740f8020000004889480859488908504c8b442418488b5c2408488b442410e8eefcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c3498d47e8483b45107303ff55404989c748c740f8020000004c8960084c893041524c89db909090e89afcffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34c89c148c1e9034883c901f6c10174084883f9017d2ceb06f641ff1074244150ff7008ff304889cb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb0e488b5008488b184889c841505253488b4c24104883e1094883f901740948c7c101000000eb0748c7c1030000004883f102488b5424104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933a8017513488b30f640ff10740348f7de488d743601eb034889c6488d34f5f9ffffff4883f901750948c7c001000000eb0748c7c009000000480bc6480bc2498d4fc8483b4d107303ff55404989cf48c741f803000000488941104889590848c7010d000000488d412048c740f8020000004889480859488908504c8b44241048c7c301000000488b44240890e826fbffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c34883fb01750848c7c001000000c34889d8c39090909000000000000000002005000000000000|@1404,2097151,@15615|218,0,I27 494,0,@376 504,0,I106 633,0,@573 948,0,@376 958,0,I106 1086,0,@573 1403:S23|545950455f5452454528292e6576656e7475616c283129 1404:S39|545950455f5452454528292e6576656e7475616c283129616464546f496e7374616e6365283229 1405:D3,200|483b65187303ff5548a8017559488b0850ff31ff7008ff710841514150534d89c8488b5c2408488b442418488b142490ff12504c8b4c24184c8b442410488b5c2408488b4424289090e8b2ffffff488b0c24483b4c24207512483b442428750b4883c43858c3e93f000000498d57d0483b55107303ff55404989d748c742f80200000048894a08488b4c243048890a4889c1488d421848c740f802000000488948084889104883c440c348c7c001000000c39090909090900000000000000000c000000000000000|@1406,1048575,@15616| 1406:S40|545950455f5452454528292e636f707954797065283329636f70795265636f72644c697374283129 1407:S34|545950455f5452454528292e636f707954797065283329636f70794c697374283129 1408:O1|@1409 1409:D3,24|c39090909090909000000000000000001000000000000000|@1410,1,@15618| 1410:S40|545950455f5452454528292e67656e6572616c6973655479706573283229636f706965642d283129 1411:S30|545950455f5452454528292e67656e6572616c6973655479706573283229 1412:D5,232|483b65187303ff5548a801756df6c30174084883fb017d12eb06f643ff10740a48c7c001000000c21800488b08415241514150ff70085341514152ff742450ff742450ff7424504d89c24989d94c8b4118488b1948c7c00100000090ff159e00000059f6c10174064883e9027105ff5570ebf550ff742440eb05e94c000000ff742440ff7424404c8b5424384c8b4c24304c8b4424284889cb488b442420909090e85affffff4883f8017508584883c420c218004889c3488b04244883c428594883c41851ff253d00000048c7c001000000c218009090900000000000000000e000000000000000|@1414,2097151,@15621,@1365,@1413| 1413:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15622| 1414:S57|545950455f5452454528292e646973706c617954797065436f6e73747273576974684d61702834297056616c436f6e73747252657374283229 1415:O12|@1416,@20051,@469,@20085,@1587,@20087,@1597,@20089,@1605,@20056,@477,@20081 1416:D4,88|483b65187303ff5548488b4a20488b342448890c24ff7228ff7230ff7238ff7240ff7248ff7250ff72584152415141504c8b52184c8b4a104c8b420856ff252d000000909090909000000000000000005000000000000000|@1451,2097151,@15627,@1417| 1417:D22,4792|488dbc2438ffffff483b7d187303ff555041524151415053ff15b2120000488b0848ba62a607c9a37f0000488d548afcffe2e945010000909090e94e010000909090e957010000909090e9f1040000909090e9f9070000909090e99f0b0000909090e903000000909090498d4fe8483b4d107303ff55404989cf48c741f802000000488b501048895108488b5808488919488b1b48833b0375524889c8488b5424289090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c420c25800488b4c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c24384c8b742430488b44242848894c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c24384c8974243048894424284c8b5424184c8b4c24104c8b4424084889da488b1c244889d04883c420e984feffff48b8a8b907c9a37f00004883c420c2580048b8d8b907c9a37f00004883c420c25800488b0c24f6c10174084883f9017f19eb06f641ff10741148b8901607c9a37f00004883c420c25800ff7010488b4008909090ff150211000048833805756e488b4c2408f6c10174084883f9037f14eb06f641ff10740c48b8901607c9a37f0000eb70f6c10174064883e9027105ff5570ebf5ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000eb05e9da000000ffb42480000000ffb42480000000ffb424800000004c8b5424784c8b4c2470eb05e9350100004c8b4424684889cbe87efdffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174704889c148b8f86f07c9a37f0000488b5d08ff13488b4c2408f6c10174064883e9027105ff5570ebf5ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000eb05e91f000000ffb424800000004c8b5424784c8b4c24704c8b4424684889cb90e856fcffff488b4c2408f6c10174064883e9027105ff5570ebf550ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424800000004c8b4c24784c8b4424704889cb488b4424609090e8d2fbffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b808ba07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c420c25800488b0c24f6c10174084883f9017f19eb06f641ff10741148b8901607c9a37f00004883c420c25800ff7008ff70109090ff156a0d00004883f801746d488b442408909090ff155e0d0000ff742420ff742430ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b942480000000eb05e97e00000049b938ba07c9a37f00004989c0488b5c247848c7c05500000090ff15e20c00004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c430c2580048bb48ba07c9a37f0000488b44240890ff15760c0000488b4c2410f6c10174064883e9027105ff5570ebf5ff742428ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424800000004c8b4c247849b838ba07c9a37f00004889c34889c8909090ff15f20b0000488b0c24488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f901740948c7c1fb000000eb1e48837c240801740c48b9a0bb07c9a37f0000eb0a48b9582707c9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70207000000f6c20174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f901740c4889cb909090ff153a0b0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b02807c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c430c258004883780801751148b8d8b907c9a37f00004883c420c25800488b48084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2408483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017422498d4ff0483b4d107303ff55404989cf48c741f801000000488b542410488911eb6a488b48084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2418483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e97c010000488b542478488911eb6a488b48084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2470483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e903010000488b542468488911eb6a488b48084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2460483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e98a000000488b542458488911eb6a488b48084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2450483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e911000000488b542448488911eb0748c7c1010000004883f9017569488b400890ff153a0800004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c420c25800488b01498d57d0483b55107303ff55404989d748c742f80500000048c742200100000048894218488b1848895a1048c742080100000048c7020b000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c24504c8b6424484c8b6c24404c8b742438488b4c2430488b442428488974247848897c24704c894424684c894c24604c895424584c895c24504c896424484c896c24404c8974243848894c243048894424284c8b5424184c8b4c24104c8b442408488b1c244889d04883c420e902f4ffff488b4818488b5110488b5a0848833b03750b488b7308483b7424407405488b31eb04488b7010498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c7070100000049b8b8bb07c9a37f00004c89076a016a01ff700851ff7424504989ca4c8b4c24604c8d44241848c7c3010000004889f090ff159a06000048837c2418017507488b442410eb63488b0424f6442458017527488b4810488b510848833a017519488b5c2458488b4218488b139090ff12488b4010488b00eb0b488b4810488b5110488b02483b054f0600007438a80175664889c648bf509adc000000000048c7c11100000048d1e9eb05e9ce000000483bc9f3a6488d7c3f01488d743601488d4c0901753e48837c241803752f498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480848c7007f000000eb61e907000000488b442410eb5a6a016a01ff7424604c8b5424184c8b4c24704c8d44240848c7c30100000090ff15ba05000048837c2408017506488b0424eb4348837c2428037536498d47e8483b45107303ff55404989c748c740f802000000eb0ae920000000e91b000000488b4c24204889480848c7007f000000eb05488b4424204883c410a801754548837808017505488b00eb43488b18488b40089090ff154e0500004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488918ff152e050000eb0a48b8509adc0000000000488b0c24488b5110488b5a0848833b037514488b7308483b742460750948c7c701000000eb64488b710840f6c6017538488b3e48833f01751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498938eb19488b7e084889fe483b65187303ff5548ebc249c7c00100000041f6c001756f498b3048833e01756b498d7fe8483b7d10730aeb05e973000000ff55404989ff48c747f8020000004c8b4e084c894f0848c7070100000040f6c70174154989c248b8f86f07c9a37f0000488b5d089090ff134989fa498d7fe8483b7d107303ff55404989ff48c747f802000000eb0ae912000000e90d00000048c74708010000004c8917eb0748c7c701000000498d77e8483b75107303ff55404989f748c746f8020000004889460848c7060700000040f6c601741048b8f86f07c9a37f0000488b5d08ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488930488d701848c746f8050000004889462048897e1848c746100100000048c746080100000048c7060100000040f6c601741048b8f86f07c9a37f0000488b5d08ff13f6442408017560488b44240856ff7008488b384889f890ff156e030000f6042401741c50909090ff15660300004883f8017565488b0424488338057505eb5e50eb60488b4c2438f6c10174064883e9027105ff5570ebf5ffb424b0000000ffb424b0000000eb05e97b020000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb0fe942000000e93d000000e938000000ffb424b0000000ffb424b0000000ffb424b00000004c8b9424a80000004c8b8c24a00000004c8b8424980000004889cb90e86eefffffeb6d488b442438a80174084883f8037f14eb06f640ff10740c48b8901607c9a37f0000eb6da80174064883e8027105ff5570ebf5ff742448ff742458ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb05e9d7000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb05e9b40000004c8b9424a800000049b938ba07c9a37f00004c8b8424880000004889c348c7c059000000909090ff15fa0100009090ff15fa0100004883f801750c48b888be07c9a37f0000eb164889c348b888be07c9a37f0000909090ff15da0100004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004883c4105a488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b9781b07c9a37f000048890a498d4fb8483b4d107303ff55404989cf48c741f80200000048895108488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c440c258004889f04883c440c2580090900000000000000000b012000000000000|@1453,2097151,@15628,@1401,@1401,@1454,@1456,@1457,@1459,@1465,@1471,@1472,@1475,I48,@1475,@1584,@109,@1401,@1454,@1457,@1586,@1452|35,0,$1417+50 213,0,@1294 382,0,@1418 399,0,@1420 439,0,@819 502,0,@819 668,0,@831 713,0,@835 795,0,@1294 1123,0,@1317 1164,0,@1422 1205,0,@1317 1320,0,@1294 1369,0,@819 1520,0,@1424 1621,0,@1294 1646,0,@1425 1783,0,@1424 1865,0,@1430 1877,0,@849 1930,0,@1294 2028,0,@862 2107,0,@1294 2137,0,@1420 2845,0,@1294 3145,0,@1431 3292,0,I48 3598,0,I48 3789,0,@1294 3907,0,@1294 4007,0,@1294 4269,0,@819 4403,0,@1424 4454,0,@1449 4469,0,@1449 4557,0,@1294 4643,0,@833 4741,0,@1294 1418:O2|3,@1419 1419:S3|626164 1420:O2|3,@1421 1421:S7|6e6f2074797065 1422:O2|3,@1423 1423:S2|2d3e 1424:O1|@1417 1425:O1|@1426 1426:D3,72|488b08498d47e8483b45107303ff55404989c748c740f80200000048bac8ba07c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1429,7,@15625|29,0,@1427 1427:D3,48|483b65187303ff5548488b18488b420848ba9095dc0000000000ff229090909000000000000000002800000000000000|@1428,63,@15624|18,0,I29 1428:S48|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283229283129 1429:S45|545950455f5452454528292e74446973702835296469737050283229736f727465645265634c6973742d283129 1430:S6|2c202e2e2e7d 1431:O1|@1432 1432:D3,160|488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b890bc07c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833803750b48b870bd07c9a37f0000c3f6c10174084883f9037c13eb06f641ff10750b48b8f0bd07c9a37f0000c348b8707907c9a37f0000c3909090909000000000000000009800000000000000|@1448,3,@15626|25,0,@1326 42,0,@1433 72,0,@1326 89,0,@1440 119,0,@1444 130,0,@1326 1433:O5|0,0,0,@1435,@1434 1434:O2|@1438,0 1435:O2|@1436,0 1436:O2|0,@1437 1437:O5|@1338,893,893,0,0 1438:O2|3,@1439 1439:S10|466f756e644d61746368 1440:O5|0,0,0,@1435,@1441 1441:O2|@1442,0 1442:O2|3,@1443 1443:S13|466f756e644e6f744d61746368 1444:O5|0,0,0,@1435,@1445 1445:O2|@1446,0 1446:O2|3,@1447 1447:S8|4e6f74466f756e64 1448:S13|7072696e742d6973466f756e64 1449:O2|@835,@1450 1450:O2|@884,0 1451:S20|545950455f5452454528292e7444697370283529 1452:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15694| 1453:S28|545950455f5452454528292e74446973702835296469737050283229 1454:D4,336|483b65187303ff5548488338077559f64008017558488b4808f64108017565488b501048833a017506488b5210eb12488b5208488b12483b65187303ff5548ebe24883fa01745848c7c203000000f6c101755a488b01ff710852ff3048c7c3030000004889d0eb0ae9c7000000e9c200000048baa05f06c9a37f0000ff15e6000000eb05e9ab000000483b0424744ff60424017564a8017565a8017415eb05e98800000048c7c103000000eb0de972000000488b08488d4c09014883c110488b34244889c748d1e9483bc9f3a6488d7c3f01488d743601488d4c0901753a488b442408a80174064883c0027105ff5570ebf5488b4c2410eb0ae91a000000e9150000004889c24883c418483b65187303ff5548e936ffffff48c7c0010000004883c418c348c7c003000000c348c7c001000000c348c7c001000000c39090909000000000000000004801000000000000|@1455,2097151,@15629,@194|116,0,@193 1455:S28|545950455f5452454528292e697350726f6475637454797065283129 1456:D3,96|483b65187303ff5548a8017539488b08ff7108488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@15630| 1457:D7,1784|488dbc2460ffffff483b7d187303ff555041f6c001755c4983780801755a415241515350498b0090ff15e206000048833c2455751848833805740f50ff15d60600004883f8017508eb6750eb0350eb66488b442410a80174084883f8037f1eeb06f640ff10741648b8901607c9a37f0000eb6de962060000e90a020000a80174064883e8027105ff5570ebf5ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000eb0ae930010000e92b010000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000eb05e9d4000000ffb424800000004c8b9424e00000004c8b8c24e80000004c8b4424784889c3488b442458488b5424709090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889084883c428c26800ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb424800000004c8b9424e00000004c8b8c24e80000004c8b442478488b5c2468488b442458488b54247090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889084883c428c26800f6c30174084883fb017f15eb06f643ff10740d48b8008e07c9a37f0000c2680041524151535041ff7008498b00ff156604000048837c240855751b48833805741250909090ff15560400004883f8017508eb6450eb0350eb63488b442418a80174084883f8037f14eb06f640ff10740c48b9901607c9a37f0000eb72a80174064883e8027105ff5570ebf5ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000eb0ae9fa000000e9f5000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424e8000000eb05e9490100004c8b8c24f00000004c8b8424800000004889c3488b442458488b54247890ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101747048b8f86f07c9a37f0000488b5d0890ff13ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424e80000004c8b8c24f0000000eb05e9220000004c8b842480000000488b5c2470488b442458488b542478ff124889c14883c4086a0148837c241059740948c7c001000000eb0748c7c0030000004883f002498d57e0483b55107303ff55404989d748c742f80300000048c74210010000004889420848c70203000000f6c201741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f802000000488b5c24104883c4084889580848c70007000000a80174144889c648b8f86f07c9a37f0000488b5d0890ff13498d7788483b75107303ff55404989f748c746f80200000048c7460801000000488906488d461848c740f80200000048897008488910488d501848c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2410f6c10174064883e9027105ff5570ebf550ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b9424900000004c8b8c24880000004c8b4424704889cb488b4424789090e876f9ffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2680048c7c001000000c26800909090900000000000000000f006000000000000|@1458,2097151,@15631,@1401,@1454,@1401,@1454|105,0,@819 300,0,@831 345,0,@835 427,0,@1294 668,0,@1374 761,0,@819 948,0,@831 993,0,@835 1070,0,@1294 1297,0,@1294 1366,0,@1294 1510,0,@1294 1704,0,@833 1458:S41|545950455f5452454528292e744469737028352964697370502832297072657474794c697374283329 1459:D4,48|483b65187303ff55484989d848c7c301000000ff252f0000009090909090909000000000000000002800000000000000|@1461,1048575,@15632,@1460| 1460:D4,200|483b65187303ff5548a801757148837808017523488b08498d47e8483b45107303ff55404989c748c740f80200000048895808488908c353ff304150ff7008488b4424104c89c290ff126a016a014989c04889e3488b442410909090ff157e0000004c8b442418488b5c242858e88effffff498d4fe8483b4d10730aeb05e92c000000ff55404989cf48c741f80200000048894108488b4424184889014c8b4424104889cb584883c420e951ffffff4889d8c390909090900000000000000000c000000000000000|@1463,1048575,@15633,@1462| 1461:S17|4d6973632e717569636b536f7274283229 1462:D3,256|483b65187303ff5548a801756853ff304150ff7008488b4424104c89c2909090ff126a016a01504c8b442420488d5c2408488b442418909090e8c2ffffff48833c2401744d498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c2428488908488b4c2430eb05e95e000000488901488b4424104889410848c7c0010000004883c438c3498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b4c2428488908488b4c2430488b5424084889114889410848c7c0010000004883c438c348c7030100000048c743080100000048c7c001000000c3900000000000000000f800000000000000|@1464,1048575,@15634| 1463:S22|4d6973632e717569636b536f72742832297173283229 1464:S19|4c6973742e706172746974696f6e2832292829 1465:D6,944|488dbc2460ffffff483b7d187303ff5550f6c301756e488b0ba80174084883f8017f15eb06f640ff10740d48b8008e07c9a37f0000c260004d89cb4d89c44c8b6b084989c6ff710848c7c375000000488b019090ff156e030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c1017417eb05e90603000048b8f86f07c9a37f0000488b5d08ff134c89f0a80174064883e8027105ff5570ebf54152415341544155415651ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424f00000004c8b8c24800000004d89d84889c3488b8424880000004c89e2ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901f644240801750c48b830d007c9a37f0000eb0748c7c0010000004883f801740f4889c34889c8ff151e0200004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901f644240801740948c7c001000000eb72488b0424a80174064883e8027105ff5570ebf551ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b942488000000eb05e9450000004c8b8c24800000004c8b442478488b5c2470e836fdffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb01514883f8017506488b0424eb0d4889c3488b0424ff15c6000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889084883c438c2600048c7c001000000c26000909090909090900000000000000000a803000000000000|@1469,1048575,@15635,@100,@1470,@1468|45,0,@1374 139,0,@1294 347,0,@833 399,0,@1466 505,0,@1294 747,0,@833 852,0,@1294 1466:O2|@884,@1467 1467:O2|@834,0 1468:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15637| 1469:S35|545950455f5452454528292e7444697370283529646973705028322970526563283229 1470:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15636| 1471:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15638| 1472:D3,976|483b65187303ff5548a801756348837808017561488b08488b5108f6c2017538488b1a48833b01751d498d77f0483b75107303ff55404989f748c746f80100000048891eeb19488b5a084889da483b65187303ff5548ebc348c7c60100000040f6c601756e488b1648833a01756aeb0ae93f030000e93b010000498d5fe8483b5d107303ff55404989df48c743f802000000488b7a0848897b0848c70301000000f6c301741348b8f86f07c9a37f0000488b5d08909090ff134d8d47e84c3b45107303ff55404d89c749c740f802000000eb0ae912000000e90d00000049c7400801000000498918eb0749c7c001000000498d57e8483b55107303ff55404989d748c742f802000000488b1948895a0848c70207000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13498d77b8483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f805000000488972204c89421848c742100100000048c742080100000048c70201000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488910c3488b08488b5108f6c2017538488b1a48833b01751d498d77f0483b75107303ff55404989f748c746f80100000048891eeb19488b5a084889da483b65187303ff5548ebc348c7c60100000040f6c601756d488b1648833a017569498d5fe8483b5d107303ff55404989df48c743f802000000488b7a0848897b0848c70301000000f6c30174164c8b400848b8f86f07c9a37f0000488b5d089090ff134d8d47e84c3b45107303ff55404d89c749c740f80200000049c7400801000000eb0ae90a000000e905000000498918eb0749c7c001000000498d57e8483b55107303ff55404989d748c742f802000000488b1948895a0848c70207000000f6c2017415488b700848b8f86f07c9a37f0000488b5d0890ff13498d77b8483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f805000000488972204c89421848c742100100000048c742080100000048c70201000000f6c2017415488b700848b8f86f07c9a37f0000488b5d0890ff1352488b70084889f0e8c2fcffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810d607c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090900000000000000000c803000000000000|@1474,127,@15639|168,0,@1294 286,0,@1294 386,0,@1294 577,0,@1294 698,0,@1294 802,0,@1294 860,0,@1473 901,0,@884 1473:O2|3,47 1474:S42|545950455f5452454528292e744469737028352964697370502832297072696e745443636f6e73283129 1475:D6,408|483b65187303ff5548483b05a00100007431a80175424889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901751549891849c740080500000048c7c001000000c208006a016a014d89c34989dc4d89d54d89ce4889e390ff1546010000498d47e8483b45107303ff55404989c748c740f8020000004c896008488b4c2408488908415341554156504d89e94d89f04889c3488b44243890ff150e0100004883f805752b488b44243848894424384c8b5424104c8b4c24084c8b442418488b1c244883c420584883c408e91dffffff4883f80375716a016a01ff7424484c8b5424284c8b4c24204c8d442408488b5c2418488b442438909090e8eefeffff48837c2408017523488b442428488b0c24488908488b4c24084889480848c7c0010000004883c440c20800488b442428488b0c2448890848c740080300000048c7c001000000eb05e9070000004883c440c20800488b442418488b0c2448890848c740080100000048c7c0010000004883c430c2080000000000000000009001000000000000|@1582,2097151,@15690,I48,@1348,@1476|27,0,I48 1476:D7,680|483b65187303ff5548f6c301756848837b0801756641514150488b08488b034889ca9090ff124883f801750c48c7c0050000004883c410c3488b08488b11498d5fe8483b5d107303ff55404989df48c743f80200000048be30db07c9a37f0000488933488b342448897308488063ffbf6a016a01eb0ae910020000e9b30000006a01ff32ff7108488d7424105649c7c20100000049b9f0db07c9a37f000049b8f0db07c9a37f0000488b442438909090ff150a020000498d47e8483b45107303ff55404989c748c740f80200000048b978dc07c9a37f00004889085948894808488060ffbf6a016a016a014889e15149c7c20100000049b9f0db07c9a37f000049b8f0db07c9a37f00004889c3488b4424209090ff15ae0100004883c4105b4883c41858ff15a60100004883f0024883c410c341514150ff7308488b4808488b034889caff124883f801750c48c7c0050000004883c418c3488b08488b11488b5a106a016a016a016a016a016a016a016a016a016a016a016a016a01ff7320ff7108488b33488d5c24104889f048ba00dd07c9a37f000090ff153a01000048833c24017507488b442408eb3e488b0424488b08498d47e0483b45107303ff55404989c748c740f80300000048ba800208c9a37f0000488910488b5424084889500848894810488060ffbf498d4fe0483b4d107303ff55404989cf48c741f80300000048bad81208c9a37f00004883c450488911488941085a4883c41848895110488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bbe81308c9a37f000048891a488942085848894210488062ffbf498d47e8483b45107303ff55404989c748c740f802000000488950084889084c8b4c24104c8b4424085b4883c410e975fdffff48c7c005000000c390909090900000000000000000a002000000000000|@1583,2097151,@15691,@1554,@1554,@1564,@1484|88,0,@1477 150,0,@1479 160,0,@1479 208,0,@1482 248,0,@1479 258,0,@1479 399,0,@1483 461,0,@1541 516,0,@1578 575,0,@1580 1477:D3,96|483b65187303ff5548f64208017536488b480848833901752c488b5208488b4118488b12ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005800000000000000|@1478,1048575,@15640| 1478:S40|545950455f5452454528292e657154797065436f6e73747273283429636f70794964283129283129 1479:O1|@1480 1480:D3,24|c39090909090909000000000000000001000000000000000|@1481,1,@15641| 1481:S33|545950455f5452454528292e657154797065436f6e737472732834296964283129 1482:D3,96|483b65187303ff5548f64208017536488b480848833901752c488b5208488b4118488b12ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005800000000000000|@1478,1048575,@15642| 1483:O7|@1484,@20043,@20047,@20083,@20058,@20084,@20082 1484:D3,808|498d4fe0483b4d107303ff55404989cf48c741f80300000048be90e007c9a37f0000488931488b72084889710848894110488061ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b820e607c9a37f00004c89074c8b42104c89470848894710488067ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049ba08e707c9a37f00004d89114c8b52184d89510849894110498061ffbf4d8d5fe04c3b5d107303ff55404d89df49c743f80300000049bcf0e707c9a37f00004d89234c8b62204d89630849894310498063ffbf4d8d6fe04c3b6d107303ff55404d89ef49c745f80300000049bed8e807c9a37f00004d8975004c8b72284d89750849894510498065ffbf498d77e0483b75107303ff55404989f748c746f80300000049b8c0e907c9a37f00004c89064c8b42304c89460848894610488066ffbf4d8d57e04c3b55107303ff55404d89d749c742f80300000049bca8ea07c9a37f00004d8922498942084c8b62084d896210498062ffbf4d8d77e04c3b75107303ff55404d89f749c746f80300000049b8d0f407c9a37f00004d8906498946084c8b42104d894610498066ffbf4d8d67e04c3b65107303ff55404d89e749c74424f80300000049b8a8f607c9a37f00004d89042449894424084c8b42184d8944241049806424ffbf4d8d47e04c3b45107303ff55404d89c749c740f8030000005348bb80f807c9a37f000049891849894008488b5a2049895810498060ffbf498d5fe0483b5d107303ff55404989df48c743f803000000415349bb58fa07c9a37f00004c891b488943084c8b5a284c895b10488063ffbf4d8d5fe04c3b5d107303ff55404d89df49c743f8030000005648be30fc07c9a37f000049893349894308488b723049897310498063ffbf498d77e0483b75107303ff55404989f748c746f803000000415049b808fe07c9a37f00004c8906488b52084889560848894610488066ffbf488b4424184c8920488958084c8950104c8970184c8948204c896828488948304c895838488978404889704859488948505948894858594889486048c7c0010000004883c408c39090909090909000000000000000002003000000000000|@1540,8191,@15672|26,0,@1485 80,0,@1498 134,0,@1499 188,0,@1500 242,0,@1501 297,0,@1502 351,0,@1503 405,0,@1521 460,0,@1523 519,0,@1525 575,0,@1527 630,0,@1529 686,0,@1531 1485:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15643,@1490|61,0,@1486 1486:O4|101,@1488,0,@1487 1487:O5|@1489,56,0,56,0 1488:S5|4d61746368 1489:S20|2e2f62617369732f556e6976657273616c2e4d4c 1490:D5,112|483b65187303ff554848833801752353ff7010488b48084889d84889ca909090ff124c8b4424085b4883c408ff2556000000488b4808488b09488b4018488b0053504889d84889caff124c8b4424085b4883c408ff253600000090909090909000000000000000006800000000000000|@1495,1048575,@15644,@1496,@1492| 1491:S31|5354525543545f56414c5328292e6d616b654c6f6f6b283129283129283129 1492:D3,296|483b65187303ff5548a80174084883f8017d08eb1ef640ff107518488b0ba801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b4c8bfcf6c10175564c3b01745641f6c0017555f601017550488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104c89c6488b394c8b49084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017416eb30e948000000e9060000004c8b4908eb204c8b4908498d47f0483b45107303ff55404989c748c740f8010000004c8908c34883f8017503488b03a80174064883e8027105ff5570ebf5e9f7feffff48c7c001000000c39090909090909000000000000000002001000000000000|@1497,255,@15646|56,0,@1493 1493:O4|11,@42,0,@1494 1494:O5|@1357,143,0,143,0 1495:S20|486173685461626c652e68617368537562283229 1496:D3,272|483b65187303ff5548a801741848b9ffffffffffffff0048234bf8488d4c0901483bc172144889c148b8b0df06c9a37f0000488b5d0890ff13488b4c83fcf6c10175564c3b01745641f6c0017555f601017550488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104c89c6488b394c8b49084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017416eb30e958000000e9060000004c8b4908eb204c8b4908498d47f0483b45107303ff55404989c748c740f8010000004c8908c34883f801751348b8ffffffffffffff00482343f8488d440001a80174064883e8027105ff5570ebf5e90affffff48c7c001000000c3909000000000000000000801000000000000|@1497,255,@15645|15,0,36028797018963967 42,0,@560 209,0,36028797018963967 1497:S27|486173685461626c652e6861736853756228322966696e64283129 1498:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15647,@1490|61,0,@1486 1499:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15648,@1490|61,0,@1486 1500:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15649,@1490|61,0,@1486 1501:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15650,@1490|61,0,@1486 1502:D4,184|483b65187303ff5548524889c3488b4210909090ff15b6000000a801756e488b00a801755e488b08488b1424488b19483b5a08753c483b5a08741248b878e107c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b71104889304883c408c3488b70084889f0483b65187303ff5548eb9e48c7c001000000eb05e9050000004883c408c348c7c0010000004883c408c39090909090900000000000000000b000000000000000|@1491,1048575,@15651,@1490|61,0,@1486 1503:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15652,@1490,@1512,@1504| 1504:D8,848|483b65187303ff55484883380374704d89c24989db4989c44c89db48b858ef07c9a37f0000909090ff153a03000048bb90ef07c9a37f0000ff1532030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8ef07c9a37f0000488951184889411048b8704406c9a37f00004889410848c701cf000000eb05e9090000004889c8488b5d08ff13488b4818488b09488b11488b7008488b3651ff7008ff701852ff70104150534889d84889f29090ff12498d4fe8483b4d107303ff55404989cf48c741f802000000488b542408488951085a4883c4084889114989c84889c3488b4424209090ff1586020000488b0424488b00a80174064883c0027105ff5570ebf5488b0c24488901488b0948c7c30b0000004889c848ba50a9dc00000000009090ff125048c7c309000000488b44241048ba50a9dc0000000000909090ff12a801740ef60424017408483b04247d69eb05ff5570ebf3488b442410a80174054803c07105ff5570ebf64883e801a80174084883f8017d08eb1bf640ff107515a801740b483b05b70100007c1eeb06f640ff1075164889c148b820f007c9a37f0000488b5d08909090ff134889c1f6c101740d4883c102eb05e9630100007105ff5570ebee4889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488917498d47e8483b45107303ff55404989c748c740f80200000048b958c306c9a37f000048890848895008488060ffbf488b4c2418488939488b4c2420488901488b442428488b00a80174064883e8027105ff5570ebf55752a80174084883f8017d14eb06f640ff10740c48c7c0010000004883c440c3a80174084883f8017d08eb23f640ff10751d488b4c2438488b09a801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b542438488b4c8afcf6c10175255051488b5c2410488b01909090ff158a00000041584889c3488b442410ff1582000000eb015058a80174064883e8027105ff5570ebf5483b65187303ff5548e937ffffff48c7c0010000004883c430c3909090909000000000000000004003000000000000fdffffffffffff01|@1515,2097151,@15654,@100,@100,@1514,@375,@1514|29,0,@1505 48,0,@1506 88,0,@1507 106,0,@112 286,0,I108 313,0,I108 416,0,@1509 545,0,@374 688,0,@1493 1505:S34|417474656d707420746f2073657420612076616c75652077697468206e616d652028 1506:S24|2920696e20612066726f7a656e2068617368207461626c65 1507:O5|@1508,128,0,128,0 1508:S37|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f486173685461626c652e4d4c 1509:O4|4,@103,0,@1510 1510:O5|@1357,132,0,132,0 1511:S32|5354525543545f56414c5328292e6d616b65456e746572283129283129283129 1512:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15653| 1513:S36|556e6976657273616c5461626c652e756e6976456e746572283429736561726368283129 1514:D4,64|483b65187303ff554841f6c00175154d89c14d8b004889d94889c34889c8ff253400000048c7c001000000c39090909000000000000000003800000000000000|@1519,255,@15655,@1516| 1515:S20|486173685461626c652e68617368536574283329 1516:D3,424|483b65187303ff5548a80174084883f8017d08eb1ef640ff107518488b0ba801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b4c8bfcf6c10175594c3b017448f60101755441f6c001755341f6c001740948c7c203000000eb08498b10488d5412014883c210488b314c89c74889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756aa80174174883f8017d17eb2de976000000e954000000e94f000000f640ff107518488b0ba801740af6c1017405483bc1eb05ff5570ebf67c154889c148b810f407c9a37f0000488b5d089090ff13a80174064883c0027105ff5570ebf54c894c83fc48c7c001000000c34883f8017503488b03a80174064883e8027105ff5570ebf5e9c6feffffa80174084883f8017d08eb1ef640ff107518488b0ba801740af6c1017405483bc1eb05ff5570ebf67c154889c148b810f407c9a37f0000488b5d089090ff13a80174064883c0027105ff5570ebf54c894c83fc48c7c001000000c39090900000000000000000a001000000000000|@1520,255,@15656|56,0,@1493 241,0,@1517 361,0,@1517 1517:O4|11,@42,0,@1518 1518:O5|@1357,148,0,148,0 1519:S31|486173685461626c652e68617368536574283329656e746572546162283329 1520:S39|486173685461626c652e68617368536574283329656e746572546162283329656e746572283129 1521:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15657,@1490,@1522,@1504| 1522:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15658| 1523:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15659,@1490,@1524,@1504| 1524:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15660| 1525:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15661,@1490,@1526,@1504| 1526:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15662| 1527:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15663,@1490,@1528,@1504| 1528:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15664| 1529:D6,208|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b000000488b7210488931ff305251488b5c2410488b4208909090ff15920000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb19488b4c24084c8b0424488b5910488b00909090ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c800000000000000|@1511,2097151,@15665,@1490,@1530,@1504| 1530:D3,160|483b65187303ff5548a801755d488b08483b197524488b4808498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c351488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c3909000000000000000009800000000000000|@1513,75,@15666| 1531:D5,64|483b65187303ff5548ff7208ff35460000004989e048c7c301000000488b4210ff153a0000004883c410c3909090909000000000000000003800000000000000|@1536,1048575,@15669,@1537,@1532| 1532:D3,320|483b65187303ff55486a016a01488338017554488b501048b9ffffffffffffff0048234af8488d4c0901498d77e8483b75107303ff55404989f748c746f80200000048bfe8ff07c9a37f000048893e48895608488066ffbf4889e748890f4889e148897108eb45488b4018488b00488b08498d57e8483b55107303ff55404989d748c742f80200000048be980008c9a37f000048893248894208488062ffbf4889e04889084889e04889500848c7c0010000004150a8017410f6442408017409483b4424087c0feb05ff5570ebf24889d84883c418c35350488b542420909090ff12a801751a4c8b442408488b5808488b084889c8488b5424109090ff12eb05488b442408594883c408f6c10174064883c1027105ff5570ebf54889c24889c84889d3483b65187303ff5548eb87909000000000000000003801000000000000|@1539,1048575,@15671|25,0,36028797018963967 68,0,@1533 139,0,@1535 1533:D3,80|a801741c488b5a0848b9ffffffffffffff0048234bf8488d4c0901483bc172154889c148b8b0df06c9a37f0000488b5d089090ff13488b4483fcc3909090909000000000000000004800000000000000|@1534,15,@15667|10,0,36028797018963967 37,0,@560 1534:S35|486173685461626c652e666f6c642833296765744974656d7c6c656e6774682d283129 1535:D3,112|a80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c134889c148b838e407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b5208488b4482fcc390909090909000000000000000006800000000000000|@1534,7,@15668|51,0,@1493 1536:S35|5354525543545f56414c5328292e6d616b65416c6c4e616d6573283129283129283129 1537:D3,104|f6c3017545488b0b488b31483b72087521498d7fe8483b7d107303ff55404989ff48c747f8020000004c894708488907eb034c89c74989f8488b7b084889fb483b65187303ff5548ebb64889c14c89c0c39090909090909000000000000000006000000000000000|@1538,127,@15670| 1538:S38|556e6976657273616c5461626c652e666f6c64283329666f6c6448617368456e747279283329 1539:S17|486173685461626c652e666f6c64283329 1540:S24|5354525543545f56414c5328292e6d616b65456e76283129 1541:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@15673,@1542| 1542:D4,48|483b65187303ff554841504889da9090ff125bff252f0000009090909090909000000000000000002800000000000000|@1576,2097151,@15686,@1544| 1543:S29|545950455f5452454528292e636f6d706f73654d617073283129283129 1544:D4,272|483b65187303ff5548488b4808488339057573498d57e8483b55107303ff55404989d748c742f80200000048bea80408c9a37f000048893248895a08488062ffbf498d5fe8483b5d107303ff55404989df48c743f80200000048be800508c9a37f000048893348895308488063ffbfff7010ff30ff71084989d848bb201208c9a37f0000eb05e961000000488b411090ff1592000000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70105000000498d47e0483b45107303ff55404989c748c740f803000000488b5424084889501048894808594883c408488908c3488339037501c3488b41184889daff229090909000000000000000000801000000000000|@1577,2097151,@15687,@1390|45,0,@1545 91,0,@1548 124,0,@1574 1545:D3,96|483b65187303ff5548488b480848833903750848c7c001000000c3488b5a0848ba300508c9a37f0000909090ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005800000000000000|@1547,1048575,@15674|33,0,@1546 1546:O1|@1544 1547:S42|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f70794964283129 1548:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9300608c9a37f000049b8c80608c9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@1563,2097151,@15680,@1554|28,0,@1549 38,0,@1552 1549:O1|@1550 1550:D3,24|c39090909090909000000000000000001000000000000000|@1551,1,@15675| 1551:S51|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129283129 1552:O1|@1553 1553:D3,24|c39090909090909000000000000000001000000000000000|@1551,1,@15676| 1554:D7,808|483b65187303ff5548488b4810488b510848833a057568498d77d8483b75107303ff55404989f748c746f80400000048bf880a08c9a37f000048893e48895e084c894e104c895618488066ffbf50ff7110ff31ff72084151ff72104989f048bb200c08c9a37f0000488b0424ff15ce020000483b04247535488b442428eb05e9bb000000488b4c2438488b10488911488b580848895908488b70104889711048c7c0010000004883c430c20800488b4c242850488b01488b54241090ff12498d4fe0483b4d107303ff55404989cf48c741f8030000005a48895110488b5424104889510848c70105000000498d57e0483b55107303ff55404989d748c742f803000000488b5c242048895a1048894a08488b4c241848890a488b4c2428488b5c2438488903488b490848894b084889531048c7c0010000004883c430c2080050415141524889c84889da9090ff12a8017567488b4c24106a016a014c8b184889e3488b01ff15de010000488b4424104883c4084153a8017559488b0851ff7008488b5c2410488b4110909090ff15be0100004883f8017452488b4424086a016a014889e3488b084889c89090ff15a6010000488b442408eb05e92c010000483b4424287457a8017558f6442428017556eb05e993000000488b542428f6c201740e48c7c103000000eb0de93c000000488b0a488d4c09014883c1104889c64889d748d1e9483bc9f3a6488d7c3f01488d743601488d4c09017417eb37e910000000e92d000000e9280000006a016a01eb22498d47f0483b45107303ff55404989c748c740f801000000488b4c2418488908eb264883c410584883c408483b65187303ff5548e90bffffff48c7c0010000006a016a016a016a014883f801753f488b442440488b084889c8488b54243890ff12488b4c2440488b542450488902488b490848894a08488b4424204889421048c7c0010000004883c448c20800488b08488b542450488b1948891a488b710848897208488b791048897a1048c7c0010000004883c448c20800488b442410488b4c2420488b10488911488b580848895908488b70104889711048c7c0010000004883c418c2080000000000000000002003000000000000|@1572,2097151,@15683,@1390,@1348,@1564,@1348|49,0,@1555 96,0,@1561 1555:D3,128|483b65187303ff55486a016a016a014889e1514c8b52184c8b4a1049b8300b08c9a37f0000488b5a0848bac80b08c9a37f000090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c39090909090909000000000000000007800000000000000|@1560,1048575,@15678|29,0,@1556 43,0,@1559 1556:O1|@1557 1557:D3,24|c39090909090909000000000000000001000000000000000|@1558,1,@15677| 1558:S56|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129283129 1559:O1|@1554 1560:S53|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529636f7069656445717569762d283129 1561:O1|@1562 1562:D3,24|c39090909090909000000000000000001000000000000000|@1560,1,@15679| 1563:S48|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129636f7069656445717569762d283129 1564:D4,192|483b65187303ff5548488b480848833905752c488b530848833a05752249b8a00d08c9a37f0000488b5a10488b411048bab00d08c9a37f0000ff2599000000488339037524488b530848833a03751a488b7108483b7208740848c7c001000000c348c7c003000000c3488339017533488b530848833a017529488b711840f6c6017509f64218017503ff5570483b7218740848c7c001000000c348c7c003000000c348c7c001000000c39090909090900000000000000000b800000000000000|@1573,1048575,@15684,@1568|31,0,@1565 49,0,@1566 1565:O1|@1564 1566:O2|@1568,@1567 1567:O2|@1570,@1566 1568:D3,520|483b65187303ff55484883380b755948833b0b7558488b4818488b7318415052ff7308ff7008488b5e10488b41104c89c2909090ff124883f80174595859a8017558f6c1017558ff7108ff70084c8b442418488b19488b00488b542410e89effffff4883f801eb0ae968000000e9630000007415488b4c2408584883c408483b65187303ff5548ebb548c7c0010000004883c420c3e92f000000e90c00000048c7c0010000004883c410c34883f901740c48c7c0010000004883c410c348c7c0030000004883c410c348c7c0010000004883c420c348833805754a48833b057544415052ff7310ff7010488b5b08488b4008909090e806ffffff4883f80174194c8b442418488b5c2408584883c4085a4883c408e9e7feffff48c7c0010000004883c420c348833807756048833b07755f488b4810488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f901744a488b4b10488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f901741a488b5b08488b4008eb0ae91b000000e916000000488b5208ff2248c7c001000000c348c7c001000000c34883380d752048833b0d751a488b4008483b4308740848c7c001000000c348c7c003000000c348833803751648833b03740848c7c001000000c348c7c003000000c348c7c001000000c390909000000000000000000002000000000000|@1569,1048575,@15681| 1569:S40|545950455f5452454528292e657175616c54797065496473283229657175616c5479706573283229 1570:D3,264|483b65187303ff5548a8017559f6c3017559488b08488b33488b39483b3e745740f6c7017566f6060175664c8b1641f6c201740949c7c103000000eb084d8b0a4f8d4c09014983c1104889fe4c89d74c89c948d1e9483bc9f3a6488d7c3f01488d743601eb0ae976000000e969000000488d4c0901755a488b08488b334150ff7308ff700852488b5e08eb0ae940000000e93b000000488b4108488b7a084889fa909090ff124883f80174194c8b442418488b5c2410488b4424085a4883c418e93bffffff48c7c0010000004883c420c348c7c001000000c348c7c001000000c34883fb01740848c7c001000000c348c7c003000000c39000000000000000000001000000000000|@1571,1048575,@15682| 1571:S46|545950455f5452454528292e657175616c54797065496473283229657175616c5265636f72644c69737473283229 1572:S38|545950455f5452454528292e636f707954797065436f6e737472576974684361636865283529 1573:S27|545950455f5452454528292e657175616c54797065496473283229 1574:O1|@1575 1575:D3,24|c39090909090909000000000000000001000000000000000|@1563,1,@15685| 1576:S26|545950455f5452454528292e636f6d706f73654d617073283329 1577:S33|545950455f5452454528292e636f6d706f73654d6170732833296d617032283129 1578:D3,160|483b65187303ff554852488b4a104889ca909090ff12a8017565488b0c24498d57f0483b55107303ff55404989d748c742f801000000488b490848890a498d4fe8483b4d107303ff55404989cf48c741f80200000048895108488b00488901498d47f0483b45107303ff55404989c748c740f8010000004889084883c408c348c7c0010000004883c408c3909090909000000000000000009800000000000000|@1579,1048575,@15688| 1579:S55|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b757054797065283129 1580:D3,160|483b65187303ff554852488b4a104889ca909090ff12a8017565488b0c24498d57f0483b55107303ff55404989d748c742f801000000488b490848890a498d4fe8483b4d107303ff55404989cf48c741f80200000048895108488b00488901498d47f0483b45107303ff55404989c748c740f8010000004889084883c408c348c7c0010000004883c408c3909090909000000000000000009800000000000000|@1581,1048575,@15689| 1581:S57|545950455f5452454528292e7444697370283529646973705028322966696e64547970652832297375624c6f6f6b7570537472756374283129 1582:S41|545950455f5452454528292e744469737028352964697370502832296e616d65546f4c697374283229 1583:S39|545950455f5452454528292e7444697370283529646973705028322966696e6454797065283229 1584:D3,120|483b65187303ff5548a8017551ff30488b40089090e8e6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7005d000000c348c7c001000000c3909000000000000000007000000000000000|@1585,3,@15692| 1585:S25|537472696e672e636f6e636174576974682832296d6b283129 1586:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15693|64,0,@883 1587:O3|@1589,@390,@1588 1588:O3|@1591,@1596,@1590 1589:S4|7265616c 1590:O3|@1589,@417,@416 1591:O2|1,@1592 1592:O3|2,@1593,0 1593:O4|0,@20086,2,1 1594:O1|@1595 1595:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@456,1,@15695|2,0,@413 1596:O4|1,@20085,0,0 1597:O3|@1599,@390,@1598 1598:O3|@1601,@1604,@1600 1599:S4|776f7264 1600:O3|@1599,@417,@416 1601:O2|1,@1602 1602:O3|2,@1603,0 1603:O4|I251,@20088,1,1 1604:O4|1,@20087,0,0 1605:O3|@1607,@390,@1606 1606:O3|@1609,@1612,@1608 1607:S4|63686172 1608:O3|@1607,@417,@416 1609:O2|1,@1610 1610:O3|2,@1611,0 1611:O4|I251,@20090,1,1 1612:O4|1,@20089,0,0 1613:O2|@1614,@1415 1614:D5,448|483b65187303ff5548a801756448837808017562488b08498d77e0483b75107303ff55404989f748c746f803000000488b790848897e104c8b094c894e0848c7060d00000049c7c20100000049b9381c08c9a37f00004889f0488b5208909090ff124889c1498d47e8483b4510730feb0ae931010000e920000000ff55404989c748c740f80200000048ba201d08c9a37f000048895008488908c3f6c30174084883fb037f13eb06f643ff10740b48b8008e07c9a37f0000c34d89c14c8b42084889d94889c34889c8909090ff15060100009090ff1506010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f80200000048ba201d08c9a37f000048895008488908c348c7c001000000c3900000000000000000b801000000000000|@1623,1048575,@15698,@1624,@1622|78,0,@1615 139,0,@1621 176,0,@1374 248,0,@884 289,0,@835 366,0,@1294 407,0,@1621 1615:O2|@1617,@1616 1616:O1|@1620 1617:O1|@1618 1618:D3,24|48c7c001000000c300000000000000001000000000000000|@1619,1,@15696| 1619:S28|545950455f5452454528292e656d70747954797065456e762d283129 1620:D3,24|48c7c001000000c300000000000000001000000000000000|@1619,1,@15697| 1621:O2|@833,0 1622:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8481b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15701|64,0,@831 1623:S28|545950455f5452454528292e7072696e745479706556617273283329 1624:D4,456|483b65187303ff5548a80174084883f8017f13eb06f640ff10740b48b8008e07c9a37f0000c3f6c301740848c7c001000000c3f6c30174154889c148b8e81f08c9a37f0000488b5d089090ff13488b0b498d57e0483b55107303ff55404989d748c742f803000000488b710848897210488b3948897a0848c7020d00000041514150505349c7c20100000049b9381c08c9a37f00004c8b4424184889c34889d0488b542410909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048baa0be07c9a37f000048895108488901f6042401741048b8582008c9a37f0000488b5d08ff13488b0424f6400801740948c7c001000000eb6da801741148b8582008c9a37f0000488b5d0890ff13488b542408f6c20174064883ea027105ff5570ebf5514c8b4c24204c8b442418488b58084889d090e8c2feffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901eb05e92b000000498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908eb01514883f8017506584883c420c34889c3584883c420ff252c000000909090900000000000000000c001000000000000|@1631,1048575,@15699,@1630|29,0,@1374 61,0,@1625 141,0,@1615 196,0,@1450 219,0,@1628 258,0,@1628 348,0,@833 396,0,@834 1625:O4|@20091,@1627,0,@1626 1626:O5|@580,84,0,84,0 1627:S5|456d707479 1628:O4|@20091,@1627,0,@1629 1629:O5|@580,85,0,85,0 1630:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15700| 1631:S36|545950455f5452454528292e7072696e7454797065566172732833297056617273283229 1632:O6|@1717,@20094,@20095,@20096,@20093,@20081 1633:D4,120|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000051ff7218ff7220ff7228ff7230ff7238ff7240ff7248ff7250ff7258ff72604c8b52104c8b4a084989c89090ff153200000058488b00c3909090909000000000000000007000000000000000|@1659,2097151,@15714,@1634| 1634:D49,11896|488dbc2448ffffff483b7d187303ff55504152415141505350909090ff156e2e000050488b442410ff156a2e0000488b0c244883390b751d488b5118488b5a10488b730848833e03750b488b7e08483b7c242874234883380b752b488b5018488b5a10488b730848833e037519488b7e08483b7c2428750e48c7c0010000004883c430c2500048833901750e48c7c0010000004883c430c2500048833801750e48c7c0010000004883c430c250004883390d755e4883380d755d498d57d0483b55107303ff55404989d748c742f802000000488b591048895a08488b7108488932488d7a1848c747f8020000004c8b40104c8947084c8b48084c890f4c8b16493bf1751848c7c0010000004883c430c25000e903080000e9fe0700004883e3054883fb017471488b942480000000488b5c24784c8b5424704c8b5c24684c8b6424604c8b6c24584c8b742450488b4c2448488b7424404c8b4c243848b8585208c9a37f00004889842480000000488b4424204889442478488b4424284889442470488954246848895c24604c895424584c895c2450eb05e9460000004c896424484c896c24404c89742438488b44243048894c243048897424284c894c24204c8b5424184c8b4c24104c8b442408488b1c24504889f85f4883c42057ff25be2c0000498b1949833a07756948833b0775684d8d5fd04c3b5d107303ff55404d89df49c743f8020000004d8b62104d8963084d8b6a084d892b4d8d731849c746f802000000488b7310498976084c8b4b084d890e4c8b400849bd30e306c9a37f00004d8928488b490849b830e306c9a37f0000eb0ae9c2010000e9bd0100004c8901575052ff742430ff742440ff742450ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c89d149ba585208c9a37f00004989d94989c84c89f34c89d890ff15d22b000048b9585208c9a37f000051ff742440ff742450ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b9424980000004c8b8c24900000004c8b8424880000004889c3488b44247890ff155a2b0000488b842498000000488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c245049bc585208c9a37f00004c89a424980000004c8b6424384c89a424900000004c8b6424404c89a42488000000488984248000000048894c2478488954247048895c2468488974246048897c24584c894424504c8b6424484c894c24484c895424404c895c24384c8b5424304c8b4c24284c8b442420488b5c2408584883c4304154ff259d2a000049833a09756848833b0975674989fc4989c54989d656488b4308498b5a08909090ff157e2a00004883f8017566498d47d8483b45107303ff55404989c748c740f80400000048b9685208c9a37f000048894818488b4c241848894810488b4c24104889480848c70001000000eb0ae97d020000e978020000488b4c2420488b09f6c101751348c7c0010000004883c438c25000e931000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b44242048890848c7c0010000004883c438c25000498b4d0848ba30e306c9a37f0000488911488b142448bb30e306c9a37f000048891aa80175464883780801753f488b10498d5fd0483b5d107303ff55404989df48c743f80500000048c743200100000048895318488b324889731048c743080100000048c7030b000000eb6d498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5fc8483b5d107303ff55404989df48c743f80300000048c74310f17002004889530848c7030d000000488d732048c746f8020000004889460848c70609000000eb05e9030000004889324155415648b8585208c9a37f000050ff742440ff742450ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b9424980000004c8b8c24900000004c8b8424880000004c89e0909090ff1582280000488b842498000000488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c245049bc585208c9a37f00004c89a424980000004c8b6424384c89a424900000004c8b6424404c89a42488000000488984248000000048894c2478488954247048895c2468488974246048897c24584c894424504c8b6424484c894c24484c895424404c895c24384c8b5424304c8b4c24284c8b442420488b5c2408584883c4304154ff25c527000049833a037571488b9c2480000000488b7c24784c8b5424704c8b5c24684c8b6424604c8b6c24584c8b742450488b4c2448488b7424404c8b4c243849b8585208c9a37f00004c898424800000004c8b4424204c894424784c8b4424284c8944247048895c246848897c24604c895424584c895c2450eb05e9460000004c896424484c896c24404c897424384c8b44243048894c243048897424284c894c24204c8b5424184c8b4c241041504c8b4424104889c34889d05a4883c42052ff250b27000048833b037571488b942480000000488b5c24784c8b5424704c8b5c24684c8b6424604c8b6c24584c8b742450488b4c2448488b7424404c8b4c243848b8585208c9a37f00004889842480000000488b4424204889442478488b4424284889442470488954246848895c24604c895424584c895c2450eb05e9460000004c896424484c896c24404c89742438488b44243048894c243048897424284c894c24204c8b5424184c8b4c24104c8b442408488b1c24504889f85f4883c42057ff2551260000498d57d8483b55107303ff55404989d748c742f80400000048bb985208c9a37f000048895a18488b5c241048895a10488b5c240848895a0848c70201000000488b5c2418488b1bf6c301750e48c7c0010000004883c430c25000498d5ff0483b5d107303ff55404989df48c743f801000000488913488b54241848891a48c7c0010000004883c430c250004883390d755f498d57e8483b55107303ff55404989d748c742f802000000488b591048895a08488b71084889324883e3054883fb017509488b3648833e09755c4883380b755b488b5818488b7310488b7e0848833f03750b4c8b47084c3b442428740deb05e90e05000048833f05746a4883380b756948833f03750b4c8b47084c3b442428740648833f057457488b8c24800000004c8b442478eb0ae924040000e96c0300004c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b742448488b5c2440488b74243848bf585208c9a37f0000eb0fe931020000e97a010000e9730000004889bc2480000000488b7c242048897c2478488b7c242848897c247048894c24684c894424604c894c24584c895424504c895c24484c896424404c896c2438488b7c24304c8974243048895c242848897424204c8b5424184c8b4c24104c8b4424084889c34889d04883c42057ff257224000048833f057415488b500848b8c05208c9a37f0000488b5d0890ff13488b5808488b4708909090ff154e240000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba505308c9a37f000048891148894108488061ffbf6a016a014989e04889cb488b47109090ff1512240000584883c40890ff150e240000488b8c2480000000488b542478488b5c2470488b742468488b7c24604c8b4424584c8b4c24504c8b5424484c8b5c24404c8b64243848898c2480000000488954247848895c2470488974246848897c24604c894424584c894c24504c895424484c895c24404c896424384c8b5424284c8b4c24204c8b4424184889c3584883c428e988f4ffff488b8c24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b742448488b5c2440488b74243848bf585208c9a37f00004889bc2480000000488b7c242048897c2478488b7c242848897c247048894c24684c894424604c894c24584c895424504c895c24484c896424404c896c2438488b7c24304c8974243048895c242848897424204c8b5424184c8b4c24104c8b4424084889c34889d04883c42057ff25de22000048833f057415488b500848b8c05208c9a37f0000488b5d0890ff13488b5808488b4708909090ff15ba220000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba405408c9a37f000048891148894108488061ffbf6a016a014989e04889cb488b47109090ff157e220000584883c40890ff157a220000488b8c2480000000488b542478488b5c2470488b742468488b7c24604c8b4424584c8b4c24504c8b5424484c8b5c24404c8b64243848898c2480000000488954247848895c2470488974246848897c24604c894424584c894c24504c895424484c895c24404c896424384c8b5424284c8b4c24204c8b4424184889c3584883c428e9d4f2ffff488b8c2480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c243849be585208c9a37f00004c89b424800000004c8b7424204c897424784c8b7424284c8974247048894c246848895c2460488974245848897c24504c894424484c894c24404c895424384c8b7424304c895c24304c896424284c896c24204c8b5424184c8b4c24104c8b4424084889c34889d04883c4204156ff2549210000488b8c2480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c243849be585208c9a37f00004c89b424800000004c8b7424204c897424784c8b7424284c8974247048894c246848895c2460488974245848897c24504c894424484c894c24404c895424384c8b7424304c895c24304c896424284c896c24204c8b5424184c8b4c24104c8b4424084889c34889d04883c4204156ff259e2000004883380d7556488b50104883e2054883fa01750d488b5008488b1248833a09755f4883390b755e488b5118488b5a10488b730848833e03750b488b7e08483b7c2428740648833e0574684883380d7567498d7fe8483b7d10730aeb05e966050000ff55404989ff48c747f8020000004c8b40104c8947084c8b48084c890feb0ae9d1030000e95b0200004c8b9424800000004c8b5c24784c8b6424704c8b6c24684c8b742460488b4c2458488b542450eb0ae91a010000e98f000000488b5c2448488b7424404c8b4c243848b8585208c9a37f00004889842480000000488b4424204889442478488b44242848894424704c895424684c895c24604c896424584c896c24504c8974244848894c24404889542438488b44243048895c243048897424284c894c24204c8b5424184c8b4c24104c8b442408488b1c24504889f85f4883c42057ff255b1f0000488bbc24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b742448488b4c2440488b5424384889bc24800000004c894424784c894c24704c895424684c895c24604c896424584c896c24504c8974244848894c244048895424384c8b5424284c8b4c24204c8b4424184889c3584883c428e99defffff48833e0574144889c748b8c05208c9a37f0000488b5d0890ff134889c74c8b4610488b5908488b4608ff15ae1e0000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf85408c9a37f000048891148894108488061ffbf6a016a01574c89c04c8d4424084889cbff15721e0000488b44240890ff156e1e0000488b8c2498000000488b942490000000488b9c2488000000488bb42480000000488b7c24784c8b4424704c8b4c24684c8b5424604c8b5c24584c8b64245048898c2498000000488994249000000048899c24880000004889b4248000000048897c24784c894424704c894c24684c895424604c895c24584c896424504c8b5424404c8b4c24384c8b4424305b4883c440e989eeffff4883380d7570498d57e8483b55107303ff55404989d748c742f802000000488b581048895a08488b7008488932488bbc24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b742448488b4c2440488b74243848b8585208c9a37f00004889842480000000eb05e96e000000488b4424204889442478488b442428488944247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c2438488b4424304c8974243048894c242848897424204c8b5424184c8b4c24104c8b442408488b1c24504889d05a4883c42052ff25f81c0000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c2438488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c24384c8b5424284c8b4c24204c8b4424184889c34889c84883c430e918edffff4883380d7570498d57e8483b55107303ff55404989d748c742f802000000488b581048895a08488b7008488932488bbc24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b742448488b4c2440488b74243848b8585208c9a37f00004889842480000000eb05e96e000000488b4424204889442478488b442428488944247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c2438488b4424304c8974243048894c242848897424204c8b5424184c8b4c24104c8b442408488b1c24504889d05a4883c42052ff258f1b0000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c2438488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c24384c8b5424284c8b4c24204c8b4424184889c34889c84883c430e9a7ebffff4883390b755f4883380b755e488b5118488b5a10488b730848833e03750b488b7e08483b7c2428741d488b78184c8b47104d8b48084983390375194d8b51084c3b542428750e48c7c0010000004883c430c2500048833e05756d48833e0574204989c2eb0ae9df050000e9da05000048b8c05208c9a37f0000488b5d0890ff134989c24c8b5e10488b5908488b4608ff157a1a0000498d4fe8483b4d107303ff55404989cf48c741f80200000048bab05508c9a37f000048891148894108488061ffbf6a01eb05e9ab0000006a0141524c8d4424084889cb4c89d8ff15361a0000488b842498000000488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c2450488984249800000048898c2490000000488994248800000048899c2480000000488974247848897c24704c894424684c894c24604c895424584c895c24504c8b5424404c8b4c24384c8b4424305b584883c438e930eaffff49833905756a4983390574154c8b500848b8c05208c9a37f0000488b5d0890ff13488b5808498b4108909090ff1576190000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba685608c9a37f000048891148894108488061ffbf6a016a014989e04889cb498b4110eb05e99d000000909090ff1532190000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e91ee9ffff49833905756c4983390574174c8b500848b8c05208c9a37f0000488b5d08909090ff13488b5808498b4108909090ff1572180000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba205708c9a37f000048891148894108488061ffbf6a016a014989e04889cb498b4110eb05e99d000000909090ff152e180000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e90ae8ffff48833e03751249833903750c4c8b56084d3b51087554eb2648833e01755a4983390175594c8b561841f6c201750a41f64118017503ff55704d3b511875694c8b50084c8b590841f6c301756041f6c201755f41ff730841ff7208ffb42490000000ffb42490000000eb05e9c1010000ffb42490000000eb0ae9b3010000e9ae010000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000eb0fe984010000e9db000000e94b000000ffb42490000000ffb42490000000498b024c8b9424880000004c8b8c24800000004c8b4424784889c3498b0390e822e7ffff4c8b5c2408415a4883c408483b65187303ff5548e945ffffff498d47d8483b45107303ff55404989c748c740f80400000048b9d85708c9a37f000048894818488b4c241048894810488b5424084889500848c70001000000488b5c2418488b1bf6c301750e48c7c0010000004883c430c25000498d5ff0483b5d107303ff55404989df48c743f801000000488903488b44241848891848c7c0010000004883c430c250004983fa01745a498d47d8483b45107303ff55404989c748c740f80400000048b9d85708c9a37f000048894818488b4c241048894810488b5424084889500848c70001000000488b5c2418488b1bf6c301751348c7c0010000004883c430c25000e931000000498d5ff0483b5d107303ff55404989df48c743f801000000488903488b44241848891848c7c0010000004883c430c2500048c7c0010000004883c430c250004d8d57d04c3b55107303ff55404d89d749c742f80500000049897a20498952184989421049894a0849c702030000004c8b5c24184d8b1b41f6c301750e48c7c0010000004883c430c250004d8d5ff04c3b5d107303ff55404d89df49c743f8010000004d89134c8b5424184d891a48c7c0010000004883c430c250004883390975604883380b755f488b5018488b5a10488b730848833e03750b488b7e08483b7c2428746a48833e05756948833e057416488b780848b8c05208c9a37f0000488b5d089090ff13488b7e10488b5808488b4608909090ff1596140000498d4fe8eb0ae95a060000e955060000483b4d107303ff55404989cf48c741f80200000048ba085808c9a37f0000488911eb0ae9b8000000e9b300000048894108488061ffbf6a016a014989e04889cb4889f8909090ff1542140000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e90ee4ffff48833e037519488b7e08483b7c2428750e48c7c0010000004883c430c2500048833e05756c48833e057414488b780848b8c05208c9a37f0000488b5d08ff13488b7e10488b5808488b4608909090ff1562130000498d4fe8483b4d107303ff55404989cf48c741f80200000048bac05808c9a37f000048891148894108488061ffbf6a016a014989e04889cb4889f8eb05e99a000000ff1522130000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e9dee2fffff64008017454488b79084883ff01750948c7c701000000eb514c8b0748833e03751a4d8b48104d8b510849833a03750c4c8b5e084d3b5a087547eb3c48833e01753f4d8b48104d8b510849833a0175314c8b5e1841f6c301eb05e94b000000751141f6421801750aeb05e927000000ff55704d3b5a18750948c7c703000000eb154c8b47084c89c7483b65187303ff5548e974ffffff4883ff01740e48c7c0010000004883c430c25000488b79084883ff01750948c7c701000000eb3a4c8b074d8b48104d8b510849833a0375174c8b9c24800000004d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebb74883ff017422498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4424784c8907eb6a488b79084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24704d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e97c0100004c8b4424684c8907eb6a488b79084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24604d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e9030100004c8b4424584c8907eb6a488b79084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24504d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e98a0000004c8b4424484c8907eb6a488b79084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24404d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e9110000004c8b4424384c8907eb0748c7c70100000040f6c701756e488b0f4d8d47a04c3b45107303ff55404d89c749c740f80500000049c7402001000000498948184c8b094d89481049c740080100000049c7000b0000004d8d503049c742f8050000004989522049894a18498942104d89420849c702030000004c8b4424184d8b0041f6c001eb05e941000000750e48c7c0010000004883c430c250004d8d47f04c3b45107303ff55404d89c749c740f8010000004d89104c8b5424184d890248c7c0010000004883c430c25000498d7fd8483b7d107303ff55404989ff48c747f80400000049b8785908c9a37f00004c8947184889471048894f0848c70701000000488b4c2418488b09f6c101750e48c7c0010000004883c430c25000498d4ff0483b4d107303ff55404989cf48c741f801000000488939488b7c241848890f48c7c0010000004883c430c250004883390b755f48833809755e488b5118488b5a10488b730848833e03750b488b7e08483b7c2428746948833e05756848833e0574154889c748b8c05208c9a37f0000488b5d089090ff134889c74c8b4610488b5908488b4608ff15f20d0000498d4fe8eb0ae92b050000e926050000483b4d107303ff55404989cf48c741f80200000048baa85908c9a37f0000488911eb0ae9ba000000e9b500000048894108488061ffbf6a016a01574c89c04c8d4424084889cbff159e0d0000488b842498000000488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c2450488984249800000048898c2490000000488994248800000048899c2480000000488974247848897c24704c894424684c894c24604c895424584c895c24504c8b5424404c8b4c24384c8b4424305b584883c438e948ddfffff64108017454488b78084883ff01750948c7c701000000eb514c8b0748833e03751a4d8b48104d8b510849833a03750c4c8b5e084d3b5a087547eb3c48833e01753f4d8b48104d8b510849833a0175314c8b5e1841f6c301eb05e94b000000751141f6421801750aeb05e927000000ff55704d3b5a18750948c7c703000000eb154c8b47084c89c7483b65187303ff5548e974ffffff4883ff01740e48c7c0010000004883c430c25000488b78084883ff01750948c7c701000000eb3a4c8b074d8b48104d8b510849833a0375174c8b9c24800000004d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebb74883ff017422498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4424784c8907eb6a488b78084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24704d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e97c0100004c8b4424684c8907eb6a488b78084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24604d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e9030100004c8b4424584c8907eb6a488b78084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24504d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e98a0000004c8b4424484c8907eb6a488b78084883ff01750948c7c701000000eb374c8b074d8b48104d8b510849833a0375144c8b5c24404d3b5a08750948c7c703000000eb124c8b5f084c89df483b65187303ff5548ebba4883ff017429498d7ff0483b7d107303ff55404989ff48c747f801000000eb05e9110000004c8b4424384c8907eb0748c7c70100000040f6c701756e488b074d8d47a04c3b45107303ff55404d89c749c740f80500000049c7402001000000498940184c8b084d89481049c740080100000049c7000b0000004d8d503049c742f80500000049894220498952184d89421049894a0849c702030000004c8b4424184d8b0041f6c001eb05e941000000750e48c7c0010000004883c430c250004d8d47f04c3b45107303ff55404d89c749c740f8010000004d89104c8b5424184d890248c7c0010000004883c430c25000498d7fd8483b7d107303ff55404989ff48c747f80400000049b8785908c9a37f00004c8947184889471048894f0848c70701000000488b442418488b00a801750e48c7c0010000004883c430c25000498d47f0483b45107303ff55404989c748c740f801000000488938488b7c241848890748c7c0010000004883c430c2500048833909751b4883380975154889c248b8605a08c9a37f0000488b5d089090ff134883390b755f488b5118488b5a10488b730848833e03750b488b7e08483b7c2428746848833e05756748833e0574154889c748b8c05208c9a37f0000488b5d089090ff134889c74c8b4610488b5908488b4608ff1552080000498d4fe8483b4d10730aeb05e95d010000ff55404989cf48c741f80200000048baf05a08c9a37f000048891148894108eb0ae9b7000000e9b2000000488061ffbf6a016a01574c89c04c8d4424084889cb90ff1502080000488b842498000000488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c2450488984249800000048898c2490000000488994248800000048899c2480000000488974247848897c24704c894424684c894c24604c895424584c895c24504c8b5424404c8b4c24384c8b4424305b584883c438e99cd7ffff498d7fd8483b7d107303ff55404989ff48c747f80400000049b8985208c9a37f00004c8947184889471048894f0848c70701000000488b442418488b00a801750e48c7c0010000004883c430c25000498d47f0483b45107303ff55404989c748c740f801000000488938488b7c241848890748c7c0010000004883c430c250004883380b7560488b5018488b5a10488b730848833e03750b488b7e08483b7c2428746948833e05756848833e057416488b780848b8c05208c9a37f0000488b5d089090ff13488b7e10488b5808488b4608909090ff159a060000498d4fe8483b4d10730aeb05e988020000ff55404989cf48c741f80200000048baa85b08c9a37f000048891148894108eb0ae9b1000000e9ac000000488061ffbf6a016a014989e04889cb4889f8ff154e060000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e9dad5ffff48833e037519488b7e08483b7c2428750e48c7c0010000004883c430c2500048833e05756c48833e057414488b780848b8c05208c9a37f0000488b5d08ff13488b7e10488b5808488b4608909090ff156e050000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba605c08c9a37f000048891148894108488061ffbf6a016a014989e04889cb4889f8eb05e99a000000ff152e050000488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b4424285b4883c408584883c428e9aad4ffff498d7fd8483b7d107303ff55404989ff48c747f80400000049b8985208c9a37f00004c89471848894f104889470848c70701000000488b4c2418488b09f6c101750e48c7c0010000004883c430c25000498d4ff0483b4d107303ff55404989cf48c741f801000000488939488b7c241848890f48c7c0010000004883c430c25000488339057569488338057568ff7010ff7110ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424880000004c8b8c24800000004c8b442478eb0ae9a7000000e9a2000000488b5808488b410890e8a2d3ffff488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c2448488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c8b5424384c8b4c24304c8b442428488b5c2408584883c438e90ed3ffff48833903751448833803750e48c7c0010000004883c430c2500048833907756b48833807756a498d57d0483b55107303ff55404989d748c742f802000000488b591048895a08488b7108488932488d7a1848c747f8020000004c8b40104c8947084c8b48084c890fff742418ff742428ff742438ffb42498000000ffb42498000000ffb42498000000eb0ae962000000e95d000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb4249800000049ba585208c9a37f00004989c14989c84889fb4889d09090ff152202000048c7c0010000004883c430c25000498d57d8483b55107303ff55404989d748c742f80400000048bb985208c9a37f000048895a184889421048894a0848c70201000000488b442418488b00a801750e48c7c0010000004883c430c25000498d47f0483b45107303ff55404989c748c740f801000000488910488b4c241848890148c7c0010000004883c430c25000909090900000000000000000702e000000000000|@1666,2097151,@15715,@1401,@1401,@1667,@1660,@1667,@1667,@1709,@1667,@1667,@1667,@1667,@1667,@1699,@1382,@1401,@1667,@1699,@1382,@1401,@1667,@1667,@1667,@1699,@1382,@1401,@1667,@1667,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1699,@1382,@1660|349,0,@1635 569,0,@573 586,0,@573 699,0,@1635 728,0,@1635 918,0,@1635 1122,0,@1636 1258,0,@573 1275,0,@573 1390,0,@573 1483,0,@1635 1670,0,@1635 1864,0,@1635 2058,0,@1635 2217,0,@1637 2538,0,@1635 2690,0,@1638 2748,0,@1641 2991,0,@1635 3126,0,@1638 3184,0,@1643 3427,0,@1635 3606,0,@1635 3935,0,@1635 4206,0,@1638 4268,0,@1644 4571,0,@1635 4940,0,@1635 5322,0,@1638 5384,0,@1645 5602,0,@1638 5660,0,@1646 5876,0,@1638 5936,0,@1647 6417,0,@1648 6562,0,@1648 6877,0,@1638 6952,0,@1649 7203,0,@1638 7264,0,@1650 8448,0,@1651 8609,0,@1638 8684,0,@1652 9878,0,@1651 9997,0,@1653 10065,0,@1638 10135,0,@1656 10366,0,@1637 10521,0,@1638 10591,0,@1657 10839,0,@1638 10900,0,@1658 11120,0,@1637 11706,0,@1635 11774,0,@1637 1635:O1|@1634 1636:S27|28496e636f6d70617469626c65206f7665726c6f6164696e677329 1637:S20|28496e636f6d70617469626c6520747970657329 1638:O4|@20055,@557,@1640,@1639 1639:O5|@1338,1533,0,1533,0 1640:S35|6d616b654571756976616c656e743a204e6f74206120747970652066756e6374696f6e 1641:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15702| 1642:S38|545950455f5452454528292e6d616b654571756976616c656e74283229676574417267283129 1643:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15703| 1644:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15704| 1645:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15705| 1646:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15706| 1647:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15707| 1648:S32|28446966666572656e74206e756d62657273206f6620617267756d656e747329 1649:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15708| 1650:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15709| 1651:S29|28446966666572656e74207479706520636f6e7374727563746f727329 1652:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15710| 1653:O4|@20055,@557,@1655,@1654 1654:O5|@1338,2381,0,2381,0 1655:S36|556e696669636174696f6e3a204f7665726c6f61645365742f4f7665726c6f6164536574 1656:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15711| 1657:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15712| 1658:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15713| 1659:S25|545950455f5452454528292e756e6966795479706573283229 1660:D5,1160|488dbc2450ffffff483b7d187303ff5550488b4808488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe2488b530848833a017506488b5210eb12488b5208488b12483b65187303ff5548ebe24883f90174634883fa01746248c7c601000000488b3840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda48c7c7010000004c8b1b41f6c301752c40f6c70174064883c7027105ff5570ebf54d8b5b08483b6518730feb0ae98d000000e988000000ff5548ebce40f6c601750940f6c7017503ff5570483bf7746f498d77d8483b75107303ff55404989f748c746f80400000048bf086208c9a37f000048897e184c894e104c89460848c70601000000488b7c2468488b3f40f6c7017423498d7ff0483b7d107303ff55404989ff48c747f801000000488937488b74246848893e48c7c601000000eb74415052415151ff7308ff7008ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000005241504151514c89d64c8b9424080100004c8b8c2410010000eb05e9160000004989f0488b1b488b009090ff15c60200004889c6eb0c415052415151ff7308ff700848837c241001746b48837c2420017568488b44240848833801750948c7c001000000eb3a488b4808488b0948833903750e4889c8483b65187303ff5548ebd6488b4808498d47f0483b45107303ff55404989c748c740f8010000004889084883f80175224889c148b8386208c9a37f0000eb0ae920000000e913000000488b5d08909090ff13488b00488b0c244889084883c42858c2680048837c2420017466488b042448833801750948c7c001000000eb3a488b4808488b0948833903750e4889c8483b65187303ff5548ebd6488b4808498d47f0483b45107303ff55404989c748c740f8010000004889084883f801751b4889c148b8386208c9a37f0000488b5d08eb05e91a00000090ff13488b00488b4c24084889084883c418584883c410c26800488b042448833801750948c7c001000000eb3a488b4808488b0948833903750e4889c8483b65187303ff5548ebd6488b4808498d47f0483b45107303ff55404989c748c740f8010000004889084883f80175164889c148b8386208c9a37f0000488b5d08909090ff13488b4c240848833901750948c7c101000000eb3a488b5108488b1248833a03750e4889d1483b65187303ff5548ebd6488b5108498d4ff0483b4d107303ff55404989cf48c741f8010000004889114883f9017514488b1048b8386208c9a37f0000488b5d0890ff13488b10483b117459488b194889d74889f09090ff15ae000000498d4fc8483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7010100000048890f488d412048c740f8020000004889780848c70003000000488903498d47e0483b45107303ff55404989c748c740f803000000488b0c24488948104889700848c700070000004883c430c268009090909000000000000000008004000000000000|@1712,1048575,@15736,@1713,@1711|251,0,@1661 596,0,@1662 739,0,@1662 872,0,@1662 978,0,@1662 1661:S28|28446966666572656e74206e756d626572206f66206669656c647329 1662:O4|@20092,@1664,0,@1663 1663:O5|@1665,52,0,52,0 1664:S6|4f7074696f6e 1665:S18|2e2f62617369732f4f7074696f6e2e736d6c 1666:S33|545950455f5452454528292e756e69667954797065732832296d61746368283229 1667:D8,1224|483b65187303ff5548488b08488b094889da4152415141505350514889d09090ff15ba0400004883380b7569488b4818488b5110488b5a0848833b05755c48833b057415488b700848b8c05208c9a37f0000488b5d0890ff13488b7b10488b7308488b58084889f0ff157a040000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba206808c9a37f0000488911eb0ae937000000e93200000048894108488061ffbf6a016a014989e04889cb4889f8909090ff15320400005a4883c408483b65187303ff5548e94affffff4883380d7520488b4c2408488b5008483b11740948c7c301000000eb1048c7c303000000eb0748c7c301000000488b0c244883390975725053ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424e80000004c8b8c24f00000004c8b842488000000488b5c24704889c8488b9424f8000000eb05e90500000090ff12eb684883390775675053ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424e80000004c8b8c24f00000004c8b842488000000eb0ae91d000000e916000000488b5c24704889c8488b9424f80000009090ff12eb02505348833c2401740e48c7c0010000004883c440c26800488b442418488b48084883e1054883f901745a498d47d8483b45107303ff55404989c748c740f80400000048b9d86808c9a37f000048894818488b4c243048894810488b4c24284889480848c70001000000488b4c2438488b09f6c101751348c7c0010000004883c440c26800e931000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b44243848890848c7c0010000004883c440c26800ff7424384c8b5424384c8b4c24304989c0488b5c241048c7c00100000090ff150e0200004883f801745a498d47d8483b45107303ff55404989c748c740f80400000048b9186908c9a37f000048894818488b4c243048894810488b4c24284889480848c70001000000488b4c2438488b09f6c101751348c7c0010000004883c440c26800e931000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b44243848890848c7c0010000004883c440c26800488b442418488b48084883e1094883f901746a49b8586908c9a37f000048bb106d08c9a37f0000488b442420488b9424a0000000ff124883f803756d498d47d8483b45107303ff55404989c748c740f80400000048b9a06d08c9a37f000048894818488b4c243048894810488b4c24284889480848c70001000000eb05e937000000488b4c2438488b09f6c101742a498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e90b000000488901488b442438488908488b442418488b48084883e1034883f901743248b8c86d08c9a37f00009090ff15a20000004889c1488b4424204889ca909090ff124889c148c7c0010000004889ca90ff12488b442438488b00a801750e48c7c0010000004883c440c26800488b442418488b00488b4c242048890848c7c0010000004883c440c2680090900000000000000000c004000000000000|@1698,2097151,@15728,@1401,@1699,@1382,@1701,@1687|74,0,@1638 136,0,@1668 592,0,@1669 778,0,@1670 917,0,@1671 927,0,@1676 982,0,@1679 1102,0,@1680 1668:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15716| 1669:S42|2843616e6e6f7420756e6966792077697468206578706c696369742074797065207661726961626c6529 1670:S44|2854797065207661726961626c6520746f20626520756e6966696564206f636375727320696e207479706529 1671:O1|@1672 1672:D4,496|483b65187303ff5548488b48084883e1094883f901740848c7c005000000c3488b48084883e1054883f901740848c7c003000000c3488b480848c1e9034883c901f6c10174084883f9017d24eb06f641ff10741c504889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb074889c24889c852488b0c24488b51084883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933a8017513488b30f640ff10740348f7de488d743601eb034889c6488d34f5f9ffffff4883ce09480bd6498d47e0483b45107303ff55404989c748c740f803000000488950104889580848c7000d000000488b11488b12488b094883c40848890148833a0975614989d8488b420890ff15ce000000a801756e4883780801754d488b08498d57d0483b55107303ff55404989d748c742f80500000048c742200100000048894a18488b1948895a1048c742080100000048c7020b00000049891048c7c005000000c3e93d000000498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e9160000004889410848c7010900000049890848c7c005000000c348c7c003000000c348891348c7c005000000c39090909090900000000000000000e801000000000000|@1674,2097151,@15717,@1673|90,0,@376 100,0,I106 187,0,@573 1673:D3,200|483b65187303ff5548a8017559488b08488b5110488b5a0848833b057517488b700848b8807107c9a37f0000488b5d08909090ff1348833b017522488b731048833e03750f488b7e08488b3f4883ff017450eb1d48837e08017516eb45488b7308488b36eb05e9430000004883fe01743151488b4008909090e882ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b70084889f0e952ffffff48c7c001000000c390900000000000000000c000000000000000|@1675,63,@15718|36,0,@1305 1674:S54|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b45715476283129 1675:S63|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e28322963616e4d6b4571547628312966696c746572283129 1676:O1|@1677 1677:D3,24|48c7c003000000c300000000000000001000000000000000|@1678,1,@15719| 1678:S45|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229283129 1679:S24|28526571756972657320657175616c697479207479706529 1680:O1|@1681 1681:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba486e08c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1686,7,@15722|29,0,@1682 1682:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@1684,2097151,@15720,@1683| 1683:D3,432|483b65187303ff554848833b0d756a488b43104883e0034883f801740848c7c001000000c3488b4308488b0048833809750848c7c001000000c3488b4b1048c1e9034883c901f6c10174084883f9017d33eb06f641ff10742b50ff7308ff73104889cb48b810c506c9a37f000048bad0a8dc0000000000eb05e9130100009090ff12eb0d4889c24889c852ff7308ff7310488b0c244883e1094883f901740948c7c101000000eb0748c7c1030000004883f102488b14244883e2054883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f00004883c408488933a8017513488b30f640ff10740348f7de488d743601eb034889c6488d34f5f9ffffff4883f901750948c7c001000000eb0748c7c009000000480bc64883fa01750948c7c101000000eb0748c7c105000000480bc14883c803498d4fe0483b4d107303ff55404989cf48c741f803000000488941104889590848c7010d000000584889085848890348c7c001000000c348c7c001000000c3909090909090900000000000000000a801000000000000|@1685,2097151,@15721|101,0,@376 111,0,I106 243,0,@573 1684:S60|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129283129 1685:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283229 1686:S57|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296d616b655072696e74697479283129 1687:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad87108c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1708,7,@15734|29,0,@1688 1688:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb507208c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@1697,15,@15727|29,0,@1689 1689:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1692,2097151,@15723,@1690| 1690:D6,280|483b65187303ff55484150504889d890ff151a01000050488b542410ff124889c1488b4424084889ca909090ff12488b0c24488b1148bbee7208c9a37f0000488d5c93fcffe3e94b000000909090e948000000909090e945000000909090e95e000000909090e976000000909090e973000000909090e903000000909090488b4908488b094c8b4424104889cb4883c418e96affffff4883c418c34883c418c3ff71084c8b442418488b591090e84effffff4c8b4424185b4883c418e93fffffff4989c14c8b44241048bb007408c9a37f0000488b41084883c418ff25570000004883c418c34989c14c8b44241048bb007408c9a37f0000488b41084883c418ff253a000000909000000000000000001001000000000000|@1694,2097151,@15724,@1401,@1695,@1693|55,0,$1690+70 203,0,@1691 240,0,@1691 1691:O1|@1690 1692:S34|545950455f5452454528292e666f6c6454797065283129666f6c6454283129283129 1693:D3,72|483b65187303ff5548a80175224150ff3053488b4008909090e8e2ffffff4c8b442410488b5c24085a4883c410ff224c89c8c3909090909000000000000000004000000000000000|@1696,1048575,@15726| 1694:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283229 1695:D3,72|483b65187303ff5548a8017522415053ff30488b4008909090e8e2ffffff594c8b442408488b59085a4883c408ff224c89c8c3909090909000000000000000004000000000000000|@1696,1048575,@15725| 1696:S15|4c6973742e666f6c64722833292829 1697:S31|545950455f5452454528292e666f6c6454797065283129666f6c6454283129 1698:S42|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e283229 1699:D3,144|483b65187303ff5548a8017565f6c3017560498d4fe8483b4d107303ff55404989cf48c741f802000000488b1348895108488b3048893151488b53084889d3488b50084889d0909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1700,31,@15729| 1700:S15|4c697374506169722e7a6970283229 1701:D8,1208|483b65187303ff55484883f801756e4152415141504889d8ff15b2040000488338077530488b4c242048894c24204c8b5424104c8b4c24084c8b042448bbc87b08c9a37f0000488b40084883c418ff258404000048833805756eff7010ff7424284c8b5424204c8b4c24184c8b442410488b580848c7c001000000eb05e91c040000909090e876ffffff4883f801740e48c7c0030000004883c420c20800488b44242848894424284c8b5424184c8b4c24104c8b4424085b48c7c0010000004883c418e938ffffff4883380b7568488b4818488b5110488b5a0848833b05755b48833b057417488b700848b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b58084889f0ff15ce030000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad87b08c9a37f0000eb0ae988000000e95000000048891148894108488061ffbf6a016a014989e04889cb4889f8909090ff1586030000488b44243048894424304c8b5424204c8b4c24184c8b4424105b4883c40848c7c0010000004883c418e970feffff488b74242048897424204c8b5424104c8b4c24084c8b042448bbc87b08c9a37f0000488b78084889f84883c418ff252d0300004883380d756b488b0c24488b510848c1ea034883ca01f6c20174084883fa017d2ceb06f642ff107424ff7008ff70104889d348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb0d488b5808488b70104889d05356488b0c2448c1e9034883c901f6c101740f4883f901eb05e9570200007d25eb06f641ff10741d504889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb074889c24889c852a801740ef60424017408483b04247e0beb05ff5570ebf3488b0424488b4c240848c1e9034883c901f6c10174084883f9017d26eb06f641ff10741e504889cb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c24889c852a8017509f60424017503ff5570483b04247467488b4424104883e0054883f801745d498d47d8483b45107303ff55404989c748c740f80400000048b9907c08c9a37f000048894818488b4c243048894810488b4c24284889480848c70001000000488b4c2440488b09f6c1017465498d4ff0483b4d10730feb0ae91c010000e91b000000ff55404989cf48c741f801000000488901488b442440488908eb75488b4424104883e0094883f801740948c7c001000000eb0748c7c0030000004883f002488b4c24104883e1034883f9017410eb05e9c300000048c7c101000000eb0748c7c1030000004883f102498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f0000eb05e98200000048891af60424017517488b3424488b1ef646ff10740348f7db488d5c1b01eb04488b1c24488d1cddf9ffffff4883f801750948c7c001000000eb0748c7c009000000480bc3480bc1498d4fe0483b4d107303ff55404989cf48c741f803000000488941104889510848c7010d000000488b442418488b00488902488b442418488908488b4424204883c418488b0c24483b08740e48c7c0010000004883c420c2080048c7c0030000004883c420c2080048c7c0010000004883c418c2080048c7c003000000c208000000000000000000b004000000000000|@1706,2097151,@15731,@1401,@1707,@1699,@1382,@1705|62,0,@1702 236,0,@1638 300,0,@1703 426,0,@1702 503,0,@376 513,0,I106 585,0,@376 595,0,I106 680,0,@376 690,0,I106 771,0,@1704 977,0,@573 1702:O1|@1701 1703:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15730| 1704:S44|2854797065207661726961626c65206973206672656520696e20737572726f756e64696e672073636f706529 1705:D3,104|483b65187303ff5548a801753e415241514150ff3053ff742430488b4008909090e8daffffff488b4c243048894c24304c8b5424204c8b4c24184c8b442410488b5c24085a4883c420ff2248c7c001000000c2080090909000000000000000006000000000000000|@1696,1048575,@15733| 1706:S61|545950455f5452454528292e756e69667954797065732832296d6174636828322961737369676e2832296f6363757273436865636b4661696c73283229 1707:D3,104|483b65187303ff5548a801753e41524151415053ff30ff742430488b4008909090e8daffffff59488b54242848895424284c8b5424184c8b4c24104c8b442408488b59085a4883c418ff2248c7c001000000c2080090909000000000000000006000000000000000|@1696,1048575,@15732| 1708:S23|545950455f5452454528292e666f6c6454797065283129 1709:D3,256|483b65187303ff5548a80175564889d94883f901750948c7c101000000eb55488b10488b31488b7a104c8b470849833803751a4c8b4e104d8b510849833a03750c4d8b58084d3b5a087547eb3c49833801753f4c8b4e104d8b510849833a017531eb05e97f0000004d8b581841f6c3017511eb05e92e00000041f64218017503ff55704d3b5a18750948c7c103000000eb15488b71084889f1483b65187303ff5548e969ffffff4883f9017431ff30488b40089090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e919ffffff48c7c001000000c3900000000000000000f800000000000000|@1710,1023,@15735| 1710:S47|545950455f5452454528292e756e69667954797065732832296d61746368283229696e746572736563742832292829 1711:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@15738| 1712:S48|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f726473283429 1713:D11,1840|488dbc2430ffffff483b7d187303ff5550a801755f488b08f6c301755c488b13488b3940f6c701740948c7c603000000eb08488b37488d7436014c8b2241f6c401740949c7c303000000eb094d8b1c244f8d5c1b0140f6c601750941f6c3017503ff5570493bf37560493bfc746040f6c701eb0ae9ea050000e945050000755c41f6c401755641f6c401740948c7c603000000eb09498b3424488d7436014883c6104989f34889fe4c89e74c8b69084c8b314c89d948d1e9483bc9f3a6488d7c3f01488d743601eb0ae97c000000e912000000488d4c09017514eb4e4c8b69084989feeb094c8b69084989feeb3c4c8b18ff7308ff7008ff72085053524c89e34c89f048ba1095dc0000000000909090ff124883f801750948c7c003000000eb6048c7c0ffffffffeb5c488b08488b70084889c748c7c001000000ff730856ff72085753524989cbeb6340f6c701740948c7c603000000eb08488b37488d74360141f6c401740949c7c303000000eb094d8b1c244f8d5c1b0140f6c6017417eb0ae94f000000e94a00000041f6c3017405493bf3eb05ff5570ebf67c15488b70084989c348c7c003000000eb13e923000000488b70084989c348c7c0ffffffffff730856ff7208415353524c8b69084989fe4989cb4883f801756d4153415241514150ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c00000004c8b9424180100004c8b4c24604c8b442458488b9c24880000004c89e8eb05e9cb000000488b5424509090ff12ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c80000004c8b9424880000004c8b8c24800000004c8b442478488b9c24c0000000488b8424b800000090e816fdffff4889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c418594889084883c430c27800a80174084883f8017d64eb06f640ff10746148837c245001745e4d89ca4c89f348b8308808c9a37f00009090ff15fe03000048bb488808c9a37f0000ff15f6030000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44244048894110488b542448eb0fe9f1000000e9ec000000e93d0000004889510848c70101000000498b1af6c301741e498d5ff0483b5d107303ff55404989df48c743f80100000048890b49891a4883c410584883c418c278004153ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000488b9c2488000000488b8424a0000000e8aefbffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c430c2780048837c24380174694d89ca4c89e348b8308808c9a37f0000ff15be02000048bb488808c9a37f0000ff15b6020000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44244048894110488b5424484889510848c70101000000498b1af6c3017425498d5ff0eb05e926000000483b5d107303ff55404989df48c743f80100000048890b49891a4883c408584883c420c27800ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000488b9c24a0000000488b842488000000e86afaffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c244889084883c430c2780048837c242001746a4d89ca4989c3488b1948b8308808c9a37f00009090ff158201000048bb488808c9a37f0000ff157a010000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44241048894110488b5424184889510848c70101000000498b1af6c301742aeb05e920000000498d5ff0483b5d107303ff55404989df48c743f80100000048890b49891aeb034989c34c89d8c27800f6c301756d488b0348837c24080174674d89ca4989db488b1848b8308808c9a37f00009090ff15ea00000048bb488808c9a37f0000ff15e2000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44241048894110488b5424184889510848c70101000000eb0ae936000000e928000000498b1af6c3017423498d5ff0483b5d107303ff55404989df48c743f80100000048890b49891aeb034989db4c89d8c2780048c7c001000000c2780090909090909000000000000000002807000000000000|@1716,1048575,@15737,@100,@100,@100,@100,@100,@100,@100,@100|261,0,I27 826,0,@1714 844,0,@1715 1164,0,@1714 1180,0,@1715 1494,0,@1714 1512,0,@1715 1662,0,@1714 1680,0,@1715 1714:S7|284669656c6420 1715:S9|206d697373696e6729 1716:S64|545950455f5452454528292e756e69667954797065732832296d61746368283229756e6966795265636f7264732834296d617463684c6162656c6c6564283229 1717:D7,1080|483b65187303ff554853415052909090ff153a04000048833803750c48c7c0030000004883c418c348833801750c48c7c0030000004883c418c34883380975154889c148b8388d08c9a37f0000488b5d089090ff13488338077568488b400890ff15f203000048c7c105000000a801755751ff70084c8b442418488b5c2420488b00488b5424109090e872ffffff4883f8057515488b4c2408584883c408483b65187303ff5548ebc44883f801752348c7c101000000584883c408483b6518730feb0ae91e000000e911000000ff5548eb9b48c7c0030000004883c428c34889c84883c418c34883380b7568488b4818488b5110488b5a0848833b03751a488b3424488b7b08483b7e28750c48c7c0030000004883c418c348833b05756e48833b057415488b700848b8c05208c9a37f0000488b5d0890ff13488b7b10488b7308488b58084889f0ff1512030000498d4fe8eb05e92a020000483b4d107303ff55404989cf48c741f80200000048bac08d08c9a37f000048891148894108488061ffbf6a016a014989e0eb05e9260000004889cb4889f890ff15ca0200004c8b442418488b5c2420584883c4085a4883c410e949feffff48833b03750e488b3424488b7b08483b7e20743c48833b03750e488b3424488b7b08483b7e18742848833b03750e488b3424488b7b08483b7e10741448833b03751a488b3424488b7b08483b7e08750c48c7c0050000004883c418c348833b057514488b700848b8807107c9a37f0000488b5d08ff1348833b017522488b731048833e03750f488b7e08488b3f4883ff01745ceb1648837e0801750feb56488b7308488b364883fe017463488b700848c7c70500000040f6c601755757ff76084c8b442418488b5c2420488b06488b542410e872fdffff4883f8057521488b7c24085e4883c408483b6518730feb0ae947000000e942000000ff5548ebb84883f801752348c7c7010000005eeb0ae928000000e91b0000004883c408483b65187303ff5548eb8f48c7c0030000004883c428c34889f84883c418c3ff7008488b4110488b5424189090ff124883f803750c48c7c0030000004883c420c3488b0c24f6c101756150ff71084c8b442420488b5c2428488b01488b5424189090e8c6fcffff4883f8057515488b442408594883c408483b65187303ff5548ebc34883f801751748c7c001000000594883c408483b65187303ff5548eba648c7c0030000004883c430c34883c420c348833805750c48c7c0030000004883c418c3498d4fe8483b4d107303ff55404989cf48c741f802000000488b501048895108488b58084889194883e2094883fa01740c48c7c0050000004883c418c3488b1b48833b077539534889c8488b542410ff124883f803750c48c7c0030000004883c420c34c8b442410488b5c2418488b04244883c4085a4883c410e9ecfbffff4889c84883c4085a4883c408ff2290909090909000000000000000003004000000000000|@1723,2097151,@15740,@1401,@1722,@1699,@1382|69,0,@1718 298,0,@1638 367,0,@1721 543,0,@1305 1718:O4|@20055,@557,@1720,@1719 1719:O5|@1338,1664,0,1664,0 1720:S28|657175616c697479202d204f7665726c6f616473657420666f756e64 1721:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15739| 1722:D3,96|483b65187303ff5548a8017539488b08ff7108488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@15741| 1723:S23|545950455f5452454528292e657175616c697479283329 1724:S58|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065436f6e737472283129 1725:O3|3,@1727,@1726 1726:O3|0,@2028,1 1727:O2|@1729,@1728 1728:O2|@1741,@1740 1729:O2|49,@1730 1730:O5|5,0,@1732,@1731,@390 1731:O3|@1732,@390,@1733 1732:S10|74797065436f6e737472 1733:O3|@1735,@1738,@1734 1734:O3|@1739,@417,@416 1735:O2|1,@1736 1736:O3|2,@1737,0 1737:O4|0,@20097,3,1 1738:O4|1,@20098,0,0 1739:S39|506f6c794d4c2e4e616d6553706163652e54797065436f6e737472732e74797065436f6e737472 1740:O2|@1742,0 1741:O2|50,@468 1742:O2|51,@1743 1743:O5|5,@1745,@1887,@1744,@390 1744:O3|@1887,@390,@1945 1745:O2|@1746,0 1746:O5|5,0,@1748,@1747,@390 1747:O3|@1748,@390,@1749 1748:S9|6e616d655370616365 1749:O3|@661,@1751,@1750 1750:O3|@1944,@417,@416 1751:O3|2,0,@1752 1752:O3|3,@1754,@1753 1753:O3|0,@1926,1 1754:O2|@1756,@1755 1755:O2|@1777,@1776 1756:O2|@1758,@1757 1757:O3|2,@923,@1759 1758:S6|616c6c466978 1759:O5|5,@1760,@995,@993,@390 1760:O2|@1761,0 1761:O3|3,@1762,@395 1762:O2|@1764,@1763 1763:O2|@1765,0 1764:O2|49,@467 1765:O2|50,@1766 1766:O5|5,0,@1768,@1767,@390 1767:O3|@1768,@390,@1769 1768:S6|666978697479 1769:O3|@1771,@1774,@1770 1770:O3|@1775,@417,@416 1771:O2|1,@1772 1772:O3|2,@1773,0 1773:O4|0,@20099,3,1 1774:O4|1,@20100,0,0 1775:S31|506f6c794d4c2e4e616d6553706163652e496e66697865732e666978697479 1776:O2|@1797,@1796 1777:O2|@1779,@1778 1778:O3|2,@923,@1780 1779:S6|616c6c536967 1780:O5|5,@1781,@995,@993,@390 1781:O2|@1782,0 1782:O3|3,@1783,@395 1783:O2|@1764,@1784 1784:O2|@1785,0 1785:O2|50,@1786 1786:O5|5,0,@1788,@1787,@390 1787:O3|@1788,@390,@1789 1788:S12|7369676e617475726556616c 1789:O3|@1791,@1794,@1790 1790:O3|@1795,@417,@416 1791:O2|1,@1792 1792:O3|2,@1793,0 1793:O4|0,@20101,3,1 1794:O4|1,@20102,0,0 1795:S40|506f6c794d4c2e4e616d6553706163652e5369676e6174757265732e7369676e617475726556616c 1796:O2|@1817,@1816 1797:O2|@1799,@1798 1798:O3|2,@923,@1800 1799:S6|616c6c56616c 1800:O5|5,@1801,@995,@993,@390 1801:O2|@1802,0 1802:O3|3,@1803,@395 1803:O2|@1764,@1804 1804:O2|@1805,0 1805:O2|50,@1806 1806:O5|5,0,@1808,@1807,@390 1807:O3|@1808,@390,@1809 1808:S5|76616c7565 1809:O3|@1811,@1814,@1810 1810:O3|@1815,@417,@416 1811:O2|1,@1812 1812:O3|2,@1813,0 1813:O4|0,@20103,3,1 1814:O4|1,@20104,0,0 1815:S29|506f6c794d4c2e4e616d6553706163652e56616c7565732e76616c7565 1816:O2|@1827,@1826 1817:O2|@1819,@1818 1818:O3|2,@923,@1820 1819:S7|616c6c54797065 1820:O5|5,@1821,@995,@993,@390 1821:O2|@1822,0 1822:O3|3,@1823,@395 1823:O2|@1764,@1824 1824:O2|@1825,0 1825:O2|50,@1730 1826:O2|@1847,@1846 1827:O2|@1829,@1828 1828:O3|2,@923,@1830 1829:S8|616c6c46756e6374 1830:O5|5,@1831,@995,@993,@390 1831:O2|@1832,0 1832:O3|3,@1833,@395 1833:O2|@1764,@1834 1834:O2|@1835,0 1835:O2|50,@1836 1836:O5|5,0,@1838,@1837,@390 1837:O3|@1838,@390,@1839 1838:S10|66756e63746f7256616c 1839:O3|@1841,@1844,@1840 1840:O3|@1845,@417,@416 1841:O2|1,@1842 1842:O3|2,@1843,0 1843:O4|0,@20105,3,1 1844:O4|1,@20106,0,0 1845:S36|506f6c794d4c2e4e616d6553706163652e46756e63746f72732e66756e63746f7256616c 1846:O2|@1851,@1850 1847:O2|@1849,@1848 1848:O3|2,@1761,@923 1849:S8|656e746572466978 1850:O2|@1855,@1854 1851:O2|@1853,@1852 1852:O3|2,@1782,@923 1853:S8|656e746572536967 1854:O2|@1859,@1858 1855:O2|@1857,@1856 1856:O3|2,@1802,@923 1857:S8|656e74657256616c 1858:O2|@1879,@1878 1859:O2|@1861,@1860 1860:O3|2,@923,@1862 1861:S9|616c6c537472756374 1862:O5|5,@1863,@995,@993,@390 1863:O2|@1864,0 1864:O3|3,@1865,@395 1865:O2|@1764,@1866 1866:O2|@1867,0 1867:O2|50,@1868 1868:O5|5,0,@1870,@1869,@390 1869:O3|@1870,@390,@1871 1870:S12|73747275637475726556616c 1871:O3|@1873,@1876,@1872 1872:O3|@1877,@417,@416 1873:O2|1,@1874 1874:O3|2,@1875,0 1875:O4|0,@20107,3,1 1876:O4|1,@20108,0,0 1877:S40|506f6c794d4c2e4e616d6553706163652e537472756374757265732e73747275637475726556616c 1878:O2|@1883,@1882 1879:O2|@1881,@1880 1880:O3|2,@1822,@923 1881:S9|656e74657254797065 1882:O2|@1890,@1889 1883:O2|@1885,@1884 1884:O3|2,@467,@1886 1885:S9|6c6f6f6b7570466978 1886:O5|5,@1888,@1887,@1744,@390 1887:S6|6f7074696f6e 1888:O2|@1766,0 1889:O2|@1896,@1895 1890:O2|@1892,@1891 1891:O3|2,@467,@1893 1892:S9|6c6f6f6b7570536967 1893:O5|5,@1894,@1887,@1744,@390 1894:O2|@1786,0 1895:O2|@1902,@1901 1896:O2|@1898,@1897 1897:O3|2,@467,@1899 1898:S9|6c6f6f6b757056616c 1899:O5|5,@1900,@1887,@1744,@390 1900:O2|@1806,0 1901:O2|@1906,@1905 1902:O2|@1904,@1903 1903:O3|2,@1832,@923 1904:S10|656e74657246756e6374 1905:O2|@1912,@1911 1906:O2|@1908,@1907 1907:O3|2,@467,@1909 1908:S10|6c6f6f6b757054797065 1909:O5|5,@1910,@1887,@1744,@390 1910:O2|@1730,0 1911:O2|@1916,@1915 1912:O2|@1914,@1913 1913:O3|2,@1864,@923 1914:S11|656e746572537472756374 1915:O2|@1921,0 1916:O2|@1918,@1917 1917:O3|2,@467,@1919 1918:S11|6c6f6f6b757046756e6374 1919:O5|5,@1920,@1887,@1744,@390 1920:O2|@1836,0 1921:O2|@1923,@1922 1922:O3|2,@467,@1924 1923:S12|6c6f6f6b7570537472756374 1924:O5|5,@1925,@1887,@1744,@390 1925:O2|@1868,0 1926:O2|@1758,@1927 1927:O2|@1779,@1928 1928:O2|@1799,@1929 1929:O2|@1819,@1930 1930:O2|@1829,@1931 1931:O2|@1849,@1932 1932:O2|@1853,@1933 1933:O2|@1857,@1934 1934:O2|@1861,@1935 1935:O2|@1881,@1936 1936:O2|@1885,@1937 1937:O2|@1892,@1938 1938:O2|@1898,@1939 1939:O2|@1904,@1940 1940:O2|@1908,@1941 1941:O2|@1914,@1942 1942:O2|@1918,@1943 1943:O2|@1923,0 1944:S26|506f6c794d4c2e4e616d6553706163652e6e616d655370616365 1945:O3|@1947,@2027,@1946 1946:O3|@1887,@417,@416 1947:O2|1,@1948 1948:O3|2,@1950,@1949 1949:O2|@1975,0 1950:O4|@1952,@20109,@1970,@1951 1951:O1|@1973 1952:O1|@1953 1953:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba08ab08c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1956,7,@15744|29,0,@1954 1954:D3,80|483b65187303ff5548483bc3750848c7c003000000c3a801751cf6c301750f488b5208488b1b488b00488b12ff2248c7c001000000c348c7c001000000c3909000000000000000004800000000000000|@1955,1048575,@15743| 1955:S12|65712d6f7074696f6e283229 1956:S15|65712d6f7074696f6e283229285029 1957:O1|@1958 1958:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba40ac08c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@1969,7,@15746|29,0,@1959 1959:D3,624|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c348833801750b48b8d8ae08c9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8901607c9a37f0000c3488b5208488b18f6c10174064883e9027105ff5570ebf5498d47e8483b45107303ff55404989c748c740f80200000048894808488b1b488918488b520890ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950af08c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000006802000000000000|@1968,1048575,@15745|34,0,@819 51,0,@1960 81,0,@819 238,0,@883 317,0,@884 358,0,@835 491,0,@833 532,0,@1964 1960:O5|0,0,0,@390,@1961 1961:O2|@1962,0 1962:O2|3,@1963 1963:S4|4e4f4e45 1964:O5|0,0,0,@390,@1965 1965:O2|@1966,0 1966:O2|3,@1967 1967:S4|534f4d45 1968:S12|7072696e742d6f7074696f6e 1969:S13|7072696e746f7074696f6e2829 1970:O1|@1971 1971:D3,24|48c7c007000000c300000000000000001000000000000000|@1972,1,@15747| 1972:S12|626f7865642d6f7074696f6e 1973:D3,24|48c7c003000000c300000000000000001000000000000000|@1974,1,@15748| 1974:S11|73697a652d6f7074696f6e 1975:O4|@20054,69,@1976,0 1976:O3|2,4,@1977 1977:O5|@571,@1979,@1110,@1978,@548 1978:O12|@2017,@2019,@2018,@2021,@2023,@2025,@2016,@1952,@20109,@1970,@1951,@1950 1979:O2|@594,@1980 1980:O2|@1982,@1981 1981:O2|@1099,@2008 1982:O2|@1022,@1983 1983:O3|0,@1984,@576 1984:O8|@1986,@1956,0,0,@1985,0,0,1 1985:O2|@2000,0 1986:O2|7,@1987 1987:O8|@1989,@1955,0,@1090,@1988,0,0,1 1988:O2|@541,@1999 1989:O4|1,@501,@442,@1990 1990:O4|1,@512,@1991,@509 1991:O4|1,@511,@1992,@509 1992:O4|3,@1993,@1068,1 1993:O2|@1995,@1994 1994:O2|@1997,0 1995:O2|@1996,1 1996:O4|6,@439,0,1 1997:O2|@1998,1 1998:O4|6,@507,0,1 1999:O2|@541,0 2000:O2|1,@2001 2001:O2|@2002,0 2002:O3|2,0,@2003 2003:O2|@2004,0 2004:O3|0,@2006,@2005 2005:O2|@1996,@2007 2006:O2|@544,@622 2007:O2|@1998,0 2008:O2|@2010,@2009 2009:O2|@2013,0 2010:O2|@1104,@2011 2011:O3|0,@2012,@576 2012:O8|@775,@1972,0,0,@437,0,0,1 2013:O2|@1108,@2014 2014:O3|0,@2015,@576 2015:O8|@442,@1974,0,0,@437,0,0,1 2016:O3|@2021,@2023,@2025 2017:O3|@1950,@2018,@2016 2018:O2|@2019,0 2019:O1|@2020 2020:D3,40|4883f801740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@1963,1,@15749| 2021:O1|@2022 2022:D3,48|a801750948c7c001000000eb0748c7c0030000004883f002c39090909090909000000000000000002800000000000000|@1967,1,@15750| 2023:O1|@2024 2024:D3,48|4889c1498d47f0483b45107303ff55404989c748c740f801000000488908c39000000000000000002800000000000000|@1967,3,@15751| 2025:O1|@2026 2026:D3,24|488b00c39090909000000000000000001000000000000000|@1967,1,@15752| 2027:O4|1,@20110,1,0 2028:O2|49,@2029 2029:O2|50,@2030 2030:O2|51,0 2031:O2|@2033,@2032 2032:O2|@2034,0 2033:S4|6e616d65 2034:O4|@20043,69,@2035,0 2035:O7|@2033,2,@2037,@2036,@390,0,0 2036:O3|2,@1730,@467 2037:O2|1,@2038 2038:O3|2,@2039,0 2039:O1|@2040 2040:D3,24|488b00488b00c39000000000000000001000000000000000|@2041,1,@15753| 2041:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7254797065283129 2042:O2|@1732,@2043 2043:O2|@2044,0 2044:O4|@20047,69,@2045,0 2045:O2|@1731,0 2046:O2|@2048,0 2047:S10|70726f70657274696573 2048:O4|@20043,69,@2049,0 2049:O7|@2047,2,@2051,@2050,@390,0,0 2050:O3|2,@1730,@1228 2051:O2|1,@2052 2052:O3|2,@2053,0 2053:O1|@2054 2054:D4,40|483b65187303ff5548488b00488b4008ff252a000000909000000000000000002000000000000000|@2056,31,@15754,@2055| 2055:D3,392|483b65187303ff5548a801755e488b08488339057543498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70217000000f6c2017464488b700848b8f86f07c9a37f0000488b5d08909090ff1348833907754e498d57e8483b5510730aeb05e9fe000000ff55404989d748c742f802000000488b590848895a0848c70219000000f6c2017461488b700848b8f86f07c9a37f0000488b5d08eb05e992000000ff1348833903754a498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c7020d000000f6c201745e488b700848b8f86f07c9a37f0000488b5d08eb05e945000000909090ff13498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70205000000f6c2017414488b700848b8f86f07c9a37f0000488b5d08ff1352488b70084889f0e8b6feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008001000000000000|@1363,31,@15755|72,0,@1294 152,0,@1294 229,0,@1294 303,0,@1294 2056:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7254797065436f6e737472283129 2057:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@15756|2,0,@2058 2058:O4|11,@42,0,@2059 2059:O5|@1308,533,0,533,0 2060:S35|5354525543545f56414c5328292e6d616b65456d707479476c6f62616c283129283129 2061:O2|@1748,@2062 2062:O2|@2063,0 2063:O4|@20047,69,@2064,0 2064:O2|@1747,0 2065:O2|@2067,@2066 2066:O2|@2068,0 2067:S10|53747275637475726573 2068:O4|@20058,69,@2069,0 2069:O4|@2067,@661,@2070,@390 2070:O6|@2072,I48,0,@390,@2071,0 2071:O1|@7382 2072:O4|1,@20112,@20113,@20111 2073:O1|@2074 2074:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@15757,@375| 2075:O2|@7359,@7358 2076:O2|@1870,@2077 2077:O2|@2078,0 2078:O4|@20047,69,@2079,0 2079:O2|@1869,0 2080:O2|@1275,@2081 2081:O2|@2082,0 2082:O4|@20043,69,@2083,0 2083:O7|@1275,2,@2085,@2084,@390,0,0 2084:O3|2,@7335,@891 2085:O2|1,@2086 2086:O3|2,@2087,0 2087:O1|@2088 2088:D4,48|483b65187303ff55484c8b4010488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@2102,2097151,@15762,@2089| 2089:D5,1176|483b65187303ff554841f6c001756b498d4fe8483b4d107303ff55404989cf48c741f80200000048baa0c708c9a37f0000488911498b1048895108488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf40c808c9a37f000048893e48895608488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f8020000004889770848890feb0a48bfe0c808c9a37f0000f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488b4818f6c1017538488b1148833a01751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b51084889d1483b65187303ff5548ebc348c7c60100000040f6c601756f488b0e48833901756b498d57e8483b55107303ff55404989d748c742f8020000004c8b41084c89420848c70201000000f6c20174184c8b48104c8b1048b8f86f07c9a37f0000488b5d0890ff134d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049c7410801000000eb0ae90a000000e905000000498911eb0749c7c101000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000f6c1017415488b501048b8f86f07c9a37f0000488b5d0890ff13498d77b8483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f805000000488971204c89491848c741100100000048c741080100000048c70101000000f6c1017415488b501048b8f86f07c9a37f0000488b5d0890ff13498d77e8483b75107303ff55404989f748c746f80200000049b898c908c9a37f00004c89460848890e498d4fe8483b4d107303ff55404989cf48c741f8020000004889710848be781b07c9a37f0000488931498d77e8483b75107303ff55404989f748c746f80200000048894e0848b9e0c908c9a37f000048890e498d4fd0483b4d107303ff55404989cf48c741f8050000004889712048c741180100000048c741100100000048c741080100000048c70101000000f6c1017415488b501048b8f86f07c9a37f0000488b5d0890ff13f6c30174064883eb027105ff5570ebf5488b70104c8b46084c3b0588010000744141f6c00175604c89c64989f948bf509adc00000000004989ca48c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740e4c89d14c89cfeb254989ca4989f9415249c7c20100000049c7c003000000488b48104889c8ff152a010000eb3e498d47e8483b45107303ff55404989c748c740f8020000004c89400848c70007000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff1351498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000009004000000000000|@2117,2097151,@15768,I48,@2103|41,0,@2090 90,0,@2091 152,0,@2092 181,0,@819 330,0,@1294 450,0,@1294 554,0,@1294 595,0,@2097 640,0,@833 681,0,@2100 762,0,@1294 824,0,I48 956,0,@1294 1027,0,@1317 1138,0,@1294 2090:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@15758| 2091:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@15759| 2092:O2|@2094,@2093 2093:O1|@2096 2094:O1|@2095 2095:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@15760| 2096:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@15761| 2097:O2|@884,@2098 2098:O2|@2099,0 2099:O2|3,58 2100:O2|3,@2101 2101:S9|737472756374757265 2102:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283129 2103:D10,784|488dbc2438ffffff483b7d187303ff55506a016a016a016a016a016a016a016a016a016a016a016a016a0153ff3041ff710841ff31ff70204152488d5c2430488b44242048ba00dd07c9a37f00009090ff15d2020000f6042401755b488b0424498d4fe0483b4d107303ff55404989cf48c741f80300000048bad0cd08c9a37f0000488911488b54240848895108488b0048894110488061ffbf498d47f0483b45107303ff55404989c748c740f801000000488908eb20498d47f0483b45107303ff55404989c748c740f801000000488b4c2408488908498d4fd8483b4d107303ff55404989cf48c741f80400000048ba28ce08c9a37f00004883c410488911488941085a48895110488b54245848895118488061ffbf498d57d8483b55107303ff55404989d748c742f80400000048bb20cf08c9a37f000048891a488942085b48895a10488b5c247048895a18488062ffbf498d5fd0483b5d107303ff55404989df48c743f8020000004889530848890b488d731848c746f8020000004889560848890e488b4c2408f6c10174084883f9037f14eb06f641ff10740c48b8d8cf08c9a37f0000eb69498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c7020100000052ff355d010000565350524c8d44242048c7c301000000488b442430ff154a01000058488b0048bbf0cf08c9a37f0000ff153e01000048c7c101000000a8017560488b10eb05e95d000000ff700851ff742410ff7424284c8b54242849b938d108c9a37f00004c8b442450488b5a08488b029090ff150201000048833c2401740d488b1c24909090ff15f60000004889c14883c40858483b65187303ff5548eb9c4889c84883c428ff15de000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b848d108c9a37f00004883c478488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c390909090909000000000000000000803000000000000|@2123,2097151,@15769,@1484,@2124,@1532,@1459,@2125,@7334,@2118|70,0,@1483 122,0,@2104 241,0,@2105 305,0,@2107 415,0,@2108 500,0,@2109 554,0,@2114 664,0,@2115 747,0,@1294 2104:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@15763,@1542| 2105:D3,144|483b65187303ff55485250488b4a184889ca9090ff12a801754b488b4c2408498d57e8483b55107303ff55404989d748c742f802000000488b490848894a08488b00488902498d47f0483b45107303ff55404989c748c740f8010000004889104883c410c3488b442408488b4810488b04244889ca4883c410ff22909090909000000000000000008800000000000000|@2106,1048575,@15764| 2106:S41|56414c55455f4f505328292e646973706c6179536967283529636f6d706f73697465456e762d283129 2107:D3,144|483b65187303ff55485250488b4a184889ca9090ff12a801754b488b4c2408498d57e8483b55107303ff55404989d748c742f802000000488b490848894a08488b00488902498d47f0483b45107303ff55404989c748c740f8010000004889104883c410c3488b442408488b4810488b04244889ca4883c410ff22909090909000000000000000008800000000000000|@2106,1048575,@15765| 2108:O2|@833,@1374 2109:O1|@2110 2110:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba70d008c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@2113,7,@15767|29,0,@2111 2111:D3,48|483b65187303ff5548488b5208488b18488b0248bad094dc0000000000ff229000000000000000002800000000000000|@2112,63,@15766|21,0,I26 2112:S36|56414c55455f4f505328292e646973706c61795369672835296f72646572283129283129 2113:S33|56414c55455f4f505328292e646973706c61795369672835296f72646572283129 2114:O1|@2103 2115:O2|3,@2116 2116:S3|736967 2117:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953747275637473283329 2118:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17679|64,0,@2119 2119:O2|@833,@2120 2120:O2|@2121,0 2121:O2|3,@2122 2122:S3|656e64 2123:S25|56414c55455f4f505328292e646973706c6179536967283529 2124:D3,120|f6c301755c498d4fd0483b4d107303ff55404989cf48c741f802000000488b3348897108488901488b7a08488b3f4c8d411849c740f80200000049897808498908488b4a084c890149c7c001000000488b73084889f3483b65187303ff5548eb9f4889c14c89c0c300000000000000007000000000000000|@1538,127,@15770| 2125:D17,2536|483b65187303ff5548488b03483b05ed0900007564483b05ec090000741348b878e107c9a37f0000488b5d08909090ff1341f6c00174064983e8027105ff5570ebf5488b4b1041f6c00174084983f8017f15eb0741f640ff10740c48ba901607c9a37f0000eb64488b5118f6c201753f488b3248833e01eb05e949030000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488937eb19488b72084889f2483b65187303ff5548ebbc48c7c70100000040f6c7017568488b1748833a017564498d77e8eb05e9b1020000483b75107303ff55404989f748c746f8020000004c8b5a084c895e0848c7060100000040f6c601741048b8f86f07c9a37f0000488b5d08ff134d8d67e84c3b65107303ff55404d89e749c74424f802000000eb0ae914000000e90f00000049c74424080100000049893424eb0749c7c401000000498d57e8483b55107303ff55404989d748c742f802000000488b71084889720848c70207000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13498d7fb8483b7d107303ff55404989ff48c747f80200000048c7470801000000488917488d571848c742f80500000048897a204c89621848c742100100000048c742080100000048c70201000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13498d7fe8483b7d107303ff55404989ff48c747f80200000049bbb07307c9a37f00004c895f08488917498d57e8483b55107303ff55404989d748c742f80200000048897a0848bf781b07c9a37f000048893a498d7fe8483b7d107303ff55404989ff48c747f8020000004889570848baf8dd08c9a37f0000488917498d57d0483b55107303ff55404989d748c742f80500000048897a2048c742180100000048c742100100000048c742080100000048c70201000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13524c89d749c7c2010000004d89cb4989f94c89c749c7c0030000004889fb4889c84c89da909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f8020000004889410858488901488d511848c742f80500000048894a2048c742180100000048c742100100000048c742080100000048c70201000000f6c201741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c74008010000004889104889c1488d401848c740f8020000004889480848b9e07307c9a37f0000488908c21000483b05420600007563483b0541060000741048b878e107c9a37f0000488b5d08ff1341f6c00174064983e8027105ff5570ebf5488b4b1041f6c00174084983f8017f15eb0741f640ff10740c48ba901607c9a37f0000eb64488b5118f6c201753f488b3248833e017524eb05e9e7030000498d7ff0483b7d107303ff55404989ff48c747f801000000488937eb19488b72084889f2483b65187303ff5548ebbc48c7c70100000040f6c7017568488b1748833a017564498d77e8eb05e951030000483b75107303ff55404989f748c746f8020000004c8b5a084c895e0848c7060100000040f6c601741048b8f86f07c9a37f0000488b5d08ff134d8d67e84c3b65107303ff55404d89e749c74424f802000000eb0ae914000000e90f00000049c74424080100000049893424eb0749c7c401000000498d57e8483b55107303ff55404989d748c742f802000000488b314889720848c70207000000f6c201741248b8f86f07c9a37f0000488b5d089090ff13498d7fb8483b7d107303ff55404989ff48c747f80200000048c7470801000000488917488d571848c742f80500000048897a204c89621848c742100100000048c742080100000048c70201000000f6c201741148b8f86f07c9a37f0000488b5d0890ff13498d7fe8483b7d107303ff55404989ff48c747f80200000049bb98c908c9a37f00004c895f08488917498d57e8483b55107303ff55404989d748c742f80200000048897a0848bf781b07c9a37f000048893a498d7fe8483b7d107303ff55404989ff48c747f8020000004889570848bae0c908c9a37f0000488917498d57d0483b55107303ff55404989d748c742f80500000048897a2048c742180100000048c742100100000048c742080100000048c70201000000f6c201741148b8f86f07c9a37f0000488b5d0890ff1341f6c00174064983e8027105ff5570ebf5488b79104c8b5f084c3b1d97030000743e41f6c30175334c89de48bf509adc00000000004c8b611048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740aeb304989fceb2b4989fc524c89d14c8b5424184c89ce4989c94c89c149c7c0030000004889cb4c89e04889f29090ff12eb3e498d47e8483b45107303ff55404989c748c740f8020000004c89580848c70007000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff1352498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f8020000004889410858488901488d511848c742f80500000048894a2048c742180100000048c742100100000048c742080100000048c70201000000f6c201741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c74008010000004889104889c1488d401848c740f8020000004889480848b9e07307c9a37f0000488908c21000483b0502020000756f483b0501020000741048b878e107c9a37f0000488b5d08ff134c8b4c24104c89c14c8b442408488b43104889cb48ba886507c9a37f000090ff15d2010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f802000000eb05e9140000004889480848b9e07307c9a37f0000488908c21000483b0589010000756e483b0588010000741348b878e107c9a37f0000488b5d08909090ff13488b4b10f6410801750a48c7c001000000c210004c8b4c24104c89c24d89d04889d34889c89090ff154e010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb05e920000000488d411848c740f8020000004889480848b9e07307c9a37f0000488908c21000483b0505010000756f483b0504010000741348b878e107c9a37f0000488b5d08909090ff13488b4b10488b5908488b01ff15e6000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908eb05e903000000c2100048c7c001000000c2100090900000000000000000e009000000000000|@2135,2097151,@15771,@20084,@20084,@20058,@20058,I48,@20047,@20047,@1293,@20043,@20043,@2136,@20083,@20083,@2128|32,0,@1486 93,0,@819 251,0,@1294 370,0,@1294 470,0,@1294 511,0,@1315 556,0,@833 597,0,@2126 674,0,@1294 783,0,@1317 880,0,@1294 953,0,@1317 987,0,@1486 1045,0,@819 1203,0,@1294 1321,0,@1294 1422,0,@1294 1463,0,@2097 1508,0,@833 1549,0,@2100 1626,0,@1294 1686,0,I48 1824,0,@1294 1895,0,@1317 1992,0,@1294 2065,0,@1317 2099,0,@1486 2135,0,@1291 2210,0,@1317 2244,0,@1486 2366,0,@1317 2400,0,@1486 2487,0,@1317 2126:O2|3,@2127 2127:S9|7369676e6174757265 2128:D5,856|483b65187303ff554848833b03757450488b4b0848c7c3030000004889c848baa05f06c9a37f0000ff1542030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f802000000eb05e9a100000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c0e108c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101746948b8f86f07c9a37f0000488b5d08ff1348833b01755850488b4b0848c7c3030000004889c848baa05f06c9a37f0000ff152a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741f48b8f86f07c9a37f0000eb0ae9d5000000e9c5000000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f0e108c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741e48b8f86f07c9a37f0000488b5d08909090ff1348b920e208c9a37f000050498d47e8483b45107303ff55404989c748c740f8020000005a4889500848c70007000000a80174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba781b07c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390909090909000000000000000005003000000000000|@7333,2097151,@17677,@194,@194|32,0,@193 88,0,@1294 165,0,@833 206,0,@2129 283,0,@1294 320,0,@193 376,0,@1294 458,0,@833 499,0,@2131 576,0,@1294 595,0,@2133 649,0,@1294 718,0,@833 816,0,@1294 2129:O2|3,@2130 2130:S6|696e66697872 2131:O2|3,@2132 2132:S5|696e666978 2133:O2|3,@2134 2134:S6|6e6f6e666978 2135:S39|56414c55455f4f505328292e646973706c6179536967283529646973706c617953706563283229 2136:D18,2272|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f802000000498b500848895108498b30488931f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c34883780803756a4d89ca4989cb4989dc4c8b68184c8b084c8b402048c7c30300000048b808ec08c9a37f0000909090ff15760800004889c648c7c001000000ff156e080000564d89d94989c04c89e34c89e848ba40a507c9a37f0000909090ff1556080000498d4fd0483b4d10730aeb05e9ab000000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3f6400801756a4d89ca4989cb4989dc4c8b68184c8b084c8b402048c7c30300000048b820ec08c9a37f0000909090ff156e0700004889c648c7c001000000ff1566070000564d89d94989c04c89e34c89e848ba40a507c9a37f0000909090ff154e070000498d4fd0483b4d10730aeb05e9ab000000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c348837808017564488b782040f6c70175384c8b1749833a01751d4d8d5ff04c3b5d107303ff55404d89df49c743f8010000004d8913eb194c8b57084c89d7483b65187303ff5548ebc249c7c30100000041f6c301756f498b3b48833f01756b4d8d57e84c3b5510730aeb05e97c030000ff55404d89d749c742f8020000004c8b67084d89620849c7020100000041f6c20174184c8b68184c8b3048b8f86f07c9a37f0000488b5d0890ff134d8d6fe84c3b6d107303ff55404d89ef49c745f802000000eb0ae913000000e90e00000049c74508010000004d895500eb0749c7c501000000498d7fe8483b7d107303ff55404989ff48c747f8020000004c8b104c89570848c7070700000040f6c70174174c8b501848b8f86f07c9a37f0000488b5d08909090ff134d8d5fb84c3b5d107303ff55404d89df49c743f80200000049c743080100000049893b498d7b1848c747f8050000004c895f204c896f1848c747100100000048c747080100000048c7070100000040f6c70174144c8b501848b8f86f07c9a37f0000488b5d08ff134d8d5fd04c3b5d107303ff55404d89df49c743f80200000049c743080100000049893b498d7b1848c747f8020000004c895f0849bb781b07c9a37f00004c891f4d8d5fe84c3b5d107303ff55404d89df49c743f80200000049897b0848bf40ec08c9a37f000049893b498d7fd0483b7d107303ff55404989ff48c747f8050000004c895f2048c747180100000048c747100100000048c747080100000048c7070100000040f6c70174164c8b501848b8f86f07c9a37f0000488b5d089090ff1341515153574c8b50184c89d0909090ff1536040000488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c101000000f6c101756e488b3148c7c00100000090ff15fa0300004c8b5424184c8b4c24104989c0488b5c24084889f048ba40a507c9a37f0000909090ff15da030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808eb05e96100000048b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8688e07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998ec08c9a37f0000488908eb0748c7c001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c3488b781048833f0375344c8b570849833a0575214d8d5ff04c3b5d107303ff55404d89df49c743f8010000004d8b62084d8923eb1049c7c301000000eb0749c7c30100000041f6c301756d4d89ca4989cc4989dd4c8b70184c8b084c8b402048c7c30100000048b808ec08c9a37f00009090ff154e0200004152415441554156504d89e84c89f3498b03ff153e020000498d4fe8483b4d107303ff55404989cf48c741f80200000048bab0c908c9a37f000048895108eb05e94e000000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb584d89ca4989cb4989dc4c8b68184c8b084c8b402048c7c30300000048b808ec08c9a37f00009090ff159e010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c741080100000048890141524153415441554889ce48c7c00100000090ff156a010000564c8b5424204c8b4c24184989c0488b5c2410488b44240848ba40a507c9a37f0000ff154a010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f00004889084883f8017506488b0424eb104889c3488b0424909090ff15f60000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c428c390900000000000000000d808000000000000|@2144,2097151,@15772,@2145,@1323,@1416,@2145,@1323,@1416,@1401,@1323,@1416,@2145,@2147,@2145,@1323,@1416,@2143|68,0,@819 113,0,@2137 161,0,@1415 238,0,@833 349,0,@1294 401,0,@2138 449,0,@1415 526,0,@833 637,0,@1294 810,0,@1294 932,0,@1294 1039,0,@1294 1106,0,@833 1147,0,@2139 1229,0,@1294 1357,0,@1415 1434,0,@2141 1475,0,@1378 1516,0,@2142 1640,0,@1294 1762,0,@2137 1828,0,@2098 1880,0,@833 1954,0,@2137 2056,0,@1415 2123,0,@833 2233,0,@1294 2137:S3|76616c 2138:S11|636f6e7374727563746f72 2139:O2|3,@2140 2140:S9|657863657074696f6e 2141:O3|1,1,3 2142:O3|1,1,1 2143:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17676| 2144:S28|56414c55455f4f505328292e646973706c617956616c756573283429 2145:D3,832|6a016a014883fb0174174889e148c701010000004889e148c7410875000000eb154889e148c701030000004889e148c741087b000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1341f6c0017538498b0048833801751d498d57f0483b55107303ff55404989d748c742f801000000488902eb19498b40084989c0483b65187303ff5548ebc248c7c201000000f6c2017568488b02488338017564498d5fe8483b5d107303ff55404989df48c743f802000000488b70084889730848c70301000000f6c301741148b8f86f07c9a37f0000488b5d0890ff13498d7fe8483b7d107303ff55404989ff48c747f80200000048c7470801000000eb0ae90a000000e90500000048891feb0748c7c701000000498d47e8483b45107303ff55404989c748c740f8020000004c89480848c70007000000a80174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57b8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f805000000488950204889781848c740100100000048c740080100000048c70001000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57e0483b55107303ff55404989d748c742f80300000048c74210010000005b48895a0848c70203000000f6c20174134889c348b8f86f07c9a37f0000488b5d08ff13498d5fe8483b5d107303ff55404989df48c743f8020000005e4889730848c70307000000f6c30174134889c648b8f86f07c9a37f0000488b5d08ff13498d77a0483b75107303ff55404989f748c746f80200000048c746080100000048891e488d5e1848c743f80200000048897308488913488d531848c742f80200000048895a08488902488d421848c740f8020000004889500848ba781b07c9a37f0000488910498d57b8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000003803000000000000|@2146,255,@15773|96,0,@1294 242,0,@1294 357,0,@1294 460,0,@1294 531,0,@1294 591,0,@1294 696,0,@833 794,0,@1294 2146:S38|56414c55455f4f505328292e646973706c617956616c75657328342976616c50617274283229 2147:D14,992|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048be68f508c9a37f000048893248894a08488062ffbf498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd8483b7d107303ff55404989ff48c747f80400000049b928cd06c9a37f00004c894f184889571048ba10f608c9a37f000048895708488937498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048893a6a016a01515652415053504c8d44243048bb08f808c9a37f0000488b4424089090ff15f6020000488b44243890ff15f20200009090ff15f2020000ff3424ff35f102000090ff15f20200004989e14c8b44242848bb10f608c9a37f000048ba98f808c9a37f00009090ff15d6020000504c8b44243048bb10f608c9a37f0000488b44242048baf87a09c9a37f0000909090ff15b6020000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424284889510848c70105000000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f802000000488951085a4883c428488911498d57e0483b55107303ff55404989d748c742f80300000048c742100100000048894a0848c7021d000000f6c1017524488b1948833b057512488b59084889d9483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740e504889d09090ff15e6010000eb074889c14889d051498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8909090ff15b6010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000f6042401741148b808c009c9a37f0000488b5d0890ff134883c40858488b004889cbff156601000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f801742a4889d9498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889430848c70315000000584883c410488b004989c04889d848c7c30100000048ba88c009c9a37f000090ff15d60000004889c148c7c0010000004889ca90ff12488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c1010000004883f901751348b8386208c9a37f0000488b5d08909090ff13488b01c39090900000000000000000d803000000000000|@7327,2097151,@17670,@1382,@7328,@7329,@7330,@7332,@2165,@2531,@2211,@2166,@7326,@2634|70,0,@2148 151,0,@440 169,0,@2150 237,0,@2160 304,0,@2150 314,0,@2163 338,0,@2150 353,0,@2530 698,0,@2630 867,0,@2633 952,0,@1662 2148:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@2149,15,@15774| 2149:S41|56414c55455f4f505328292e7072696e7456616c7565466f72547970652833296d6b41646472283129 2150:O3|0,@2151,@20115 2151:O1|@2152 2152:D3,128|4883780801750748837810017413488b0848b8e8f608c9a37f0000488b5d08ff13488b08f6c10174084883f9017c08eb18f641ff10741248b860f708c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c390909000000000000000007800000000000000|@2159,3,@15775|19,0,@2153 57,0,@2156 2153:O4|@20055,@557,@2155,@2154 2154:O5|@559,90,0,90,0 2155:S12|626f74746f6d206c6576656c 2156:O4|@20055,@557,@2158,@2157 2157:O5|@559,87,0,87,0 2158:S14|6c6f61643a206e65676174697665 2159:S25|434f44455452454528292e626f74746f6d4c6576656c283129 2160:O1|@2161 2161:D3,24|48c7c001000000c300000000000000001000000000000000|@2162,1,@15776| 2162:S46|56414c55455f4f505328292e7072696e7456616c7565466f725479706528332964756d6d7954797065732d283129 2163:O7|@2165,@2326,@2432,@2514,@2527,@2530,@2164 2164:O2|7,@2629 2165:D5,168|483b65187303ff55484883f80175084889d84c89caff2253524150504889d84c89ca9090ff12488b4c241050ff742410ff7120ff7128ff71304c8b5424404c8b49184c8b4110488b5908488b44242890ff156a0000009090ff156a0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000005a4883c420488950104889480848c70007000000c390900000000000000000a000000000000000|@2167,2097151,@15777,@2168,@2166| 2166:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@15828| 2167:S32|545950454944434f444528292e6170706c79546f496e7374616e636527283429 2168:D4,200|483b65187303ff5548a801756e488b0841524151415053ff700841514152ff742458ff742458ff742458ff7424584d89c24989d94c8b4110488b5908488b0190ff159a00000050ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b44242890e88affffff4889c1eb05e927000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c22000909090909090900000000000000000c000000000000000|@1363,2097151,@15788,@2169| 2169:D12,1312|483b65187303ff55484883fb0175064983f801746b4883fb01742d415241515041504152ff7424584d89ca4c8b4c245049b8300109c9a37f0000488b5c245890ff15f2040000eb0f4889c1488b4424184152415151415050ff742420ff7424604c8b5424284c8b4c245849b8b80c09c9a37f0000488b5c2460488b442420eb05e959010000909090ff15b204000048837c240801741a504c8b442450488b5c2458488b442418488b54244090ff12eb094889c1488b4424305150ff742430ff7424704c8b5424384c8b4c246849b8b80c09c9a37f0000488b5c2470488b442430ff1562040000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808488b4c2408488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740f4889c8594883c43051ff25780300004889c8c2300041524151504c8b5424484c8b4c24104c8b4424084889c3488b4424389090ff15560300004883f8017564ff7424484c8b5424184c8b4c24104c8b44244048c7c303000000488b44240890ff153203000048c7c101000000488b542438f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017410a801740c482bc8eb05e9820200007105ff5570ebef4883c1016a016a016a01488b442450a80174164889c248b8c0e406c9a37f0000488b5d08909090ff134883f9017524488b084889e2488b1948891a4889e2488b7108488972084889e2488b791048897a10eb1ff6c10174064883e9027105ff5570ebf5488b4008483b65187303ff5548eb9dff742428ff7424684c8b5424304c8b4c246049b8e00e09c9a37f0000488b5c2418488b442428ff155202000050ff742430ff7424704c8b5424384c8b4c246849b8081109c9a37f0000488b5c2420488b442430909090ff152a020000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fb0483b4d107303ff55404989cf48c741f80200000048894108488b442438488901488d511848c742f80200000048894a08488b4c244848890a488d5a1848c743f80300000048c74310010000004889530848c7031d000000f6c201740b4889d8ff1592010000eb034889d85048c7c003000000488b542418ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57c8483b55107303ff55404989d748c742f80300000048894a1048894208488b4c241848890a488b0c24488b09488d5a2048c743f80200000048894b0848891359488919488b4c24505a4883c408488b19f6c301740af602017405482b1a7105ff5570ebf64883c3014889c2498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488910488b510890ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700090000004883c418c23000488b00488b4c2440488b104889c84883c4185b4883c43053ff2290909000000000000000001805000000000000|@2218,2097151,@15789,@2219,@2295,@2285,@2211,@2263,@2313,@2295,@2285,@2211|50,0,@2170 108,0,@2199 206,0,@2199 656,0,@578 766,0,@2203 811,0,@2207 2170:O1|@2171 2171:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@2177,1048575,@15778,@2172| 2172:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@15779,@2178|263,0,@2173 2173:O4|@20055,@557,@2175,@2174 2174:O5|@2176,83,0,83,0 2175:S9|4e6f20616363657373 2176:S34|6d6c736f757263652f4d4c436f6d70696c65722f545950454944434f44452e736d6c 2177:S62|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296571436f64652d283129 2178:D8,976|483b65187303ff5548488338057565488b4810f6c101753e488b11488b32483b35c3030000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c70100000040f6c7017561488b0f488b11483b1580030000741feb05e944020000488b70084c8b481048b878e107c9a37f0000488b5d08ff13488b71104989d940f6c601741b4c8b50084c8b581048b8c0e406c9a37f0000488b5d08909090ff134983f901750a488b36eb2ce92000000041f6c10174064983e9027105ff5570ebf5488b7608483b65187303ff5548ebaf48c7c601000000488b4810f6c1017544488b11488b3a483b3df20200007523483b3df102000074144c8b480848b878e107c9a37f0000488b5d08ff134c8b4a10eb1c4c8b49084c89c9483b65187303ff5548ebb749b930e306c9a37f00004983390575684889d8498b5110ff12488b084883390174164889c248b8200809c9a37f0000488b5d08909090ff13488b7908488b5808488b4110909090ff157e0200004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c3f64008017564f64008017414488b480848b8f86f07c9a37f0000488b5d08ff13488b5008480fb64aff488d4c09014883e1074883f9017552f6c201741348b8f86f07c9a37f0000488b5d08909090ff1348b9ffffffffffffff0048234af8488d4c0901f6c301751aeb05e91b000000488b3bf643ff10740348f7df488d7c3f01eb034889df483bcf77214983f801751048b8f00809c9a37f0000488b5d08ff1348b8800909c9a37f0000c3f6c201741048b8f86f07c9a37f0000488b5d08ff13f6c3017513488b0bf643ff10740348f7d9488d4c0901eb034889d9488b4c8afc498d47e0483b45107303ff55404989c748c740f803000000488970104889480848c70005000000c34883381d75584c3b40107414488b480848b8180a09c9a37f0000488b5d08ff1348c7c101000000488b5008f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c301740ff6c101740a483bd9eb0ae970000000ff5570ebf17d47488b4008a80174164889c148b8c0e406c9a37f0000488b5d08909090ff134883fb017504488b00c3f6c30174064883eb027105ff5570ebf5488b4008483b65187303ff5548ebbd4983f801751148b8b00a09c9a37f0000488b5d0890ff1348b8800909c9a37f0000c34889c1498d47d8483b45107303ff55404989c748c740f8040000004c894018488958104889480848c7000d000000c3900000000000000000c803000000000000|@2197,1048575,@15780,@20053,@20053,@20054,@20054,@2196|131,0,@1486 168,0,@578 279,0,@1486 319,0,@573 356,0,@2179 455,0,@1294 500,0,@1294 519,0,36028797018963967 583,0,@2183 599,0,@2186 615,0,@1294 719,0,@2190 820,0,@578 886,0,@2193 903,0,@2186 2179:O4|@20055,@557,@2181,@2180 2180:O5|@2182,309,0,309,0 2181:S30|66696e64456e747279496e426c6f636b3a206e6f7420636f6e7374616e74 2182:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f46554e4354494f4e532e736d6c 2183:O4|@20055,@557,@2185,@2184 2184:O5|@2182,323,0,323,0 2185:S33|66696e64456e747279496e426c6f636b3a20696e76616c69642061646472657373 2186:O2|11,@2187 2187:O3|2,@2188,0 2188:O4|@20055,@557,@2189,0 2189:S36|496e76616c6964206c6f616420656e636f756e746572656420696e20636f6d70696c6572 2190:O4|@20055,@557,@2192,@2191 2191:O5|@2182,281,0,281,0 2192:S41|66696e64456e747279496e426c6f636b3a207475706c652f6461746174797065206d69736d61746368 2193:O4|@20055,@557,@2185,@2194 2194:O5|@2182,288,0,288,0 2195:S28|545950454944434f444528292e636f64654163636573732832292829 2196:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@15781,@20054|75,0,@20054 2197:S40|434f4445545245455f46554e4354494f4e5328292e66696e64456e747279496e426c6f636b283329 2198:S35|434f4445545245455f46554e4354494f4e5328292e736574496e6c696e652832292829 2199:O1|@2200 2200:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@2202,1048575,@15782,@2201| 2201:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@15783,@2178|263,0,@2173 2202:S72|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d657465722833296765745479706556616c7565466f724944283129 2203:O1|@2204 2204:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@2206,1048575,@15784,@2205| 2205:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@15785,@2178|263,0,@2173 2206:S65|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329626f786564436f64652d283129 2207:O1|@2208 2208:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@2210,1048575,@15786,@2209| 2209:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@15787,@2178|263,0,@2173 2210:S64|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d6574657228332973697a65436f64652d283129 2211:D6,808|483b65187303ff55484883381d75594883780801750b48b880d606c9a37f0000c348c7c101000000488b5008f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017518488b11f641ff10740348f7da488d541201eb08e9830200004889ca4883fa017409483b15a30200007216488b580848b8901609c9a37f0000488b5d089090ff134889cb4889d1488b500848c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f575348bbe81609c9a37f00004889d0ff15560200004c8b44240848c7c3010000009090ff154a0200004889c1f6c101751df60101740f488b4908483b65187303ff5548ebe748c7c101000000eb0748c7c1030000004883f901740948c7c001000000eb694889c74889f890ff150a0200004889c1f6c1017524488b1148833a037512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740948c7c001000000eb6f498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90c01000048ba18eb06c9a37f00004889114889410848897910488b44240848894118488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048894a10488b0c2448894a0848c70205000000eb05e95c000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000004889511048c741088b00000048ba88b419f1a37f0000488911498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000004889791048c741088b00000048ba78b419f1a37f00004889114889c2498d47e8483b45107303ff55404989c748c740f80200000048895008488908488b4c24084883c408488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c700050000004883c408c34883380574134889c148b8f81609c9a37f0000488b5d08ff13c390909090909000000000000000001803000000000000ffffffffffffff01|@2319,1048575,@15824,@2320,@2321,@2318|24,0,@509 133,0,@2212 217,0,@2214 425,0,@617 554,0,@20054 646,0,@20053 763,0,@2215 2212:O4|4,@103,0,@2213 2213:O5|@1301,159,0,159,0 2214:O1|@2211 2215:O4|@20055,@557,@2217,@2216 2216:O5|@2182,210,0,210,0 2217:S31|6d616b6556616c202d206e6f7420636f6e7374616e74206f72207475706c65 2218:S52|545950454944434f444528292e6170706c79546f496e7374616e6365272834296d616b65506f6c79506172616d65746572283329 2219:D14,1184|483b65187303ff554848833807756ef6400801752b488b480848837908017520488b11488b742410488b7c2408488974241048897c2408488b4208e9c0ffffff498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f803000000eb05e98901000048bee81c09c9a37f000048893248894a08488b730848897210488062ffbf488b3b40f6c70174064883c7027105ff5570ebf54d8d5fe04c3b5d107303ff55404d89df49c743f80300000049894b104989530849893b51ff7424104153415041514c89d24c8b5424384989d149b8102209c9a37f000048c7c301000000488b40089090ff15ae03000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff155a0300009090ff155a030000505348bb202209c9a37f000048c7c005000000909090ff1546030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8b02209c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c210004883380b7568488b4818488b5110488b720848833e05755b48833e057414488b780848b8c05208c9a37f0000488b5d08ff134889df4c8b5e10488b5808488b4608ff1586020000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad02209c9a37f0000488911eb0ae9a7000000e95900000048894108488061ffbf6a016a01415241514150574c8d4424204889cb4c89d89090ff1536020000488b442440488b4c2438488944244048894c24384c8b5424184c8b4c24104c8b4424085b4883c418584883c408e924fdffff488b7c24104c8b5c24084c894c241048895c240848bb102209c9a37f00004c8b0c2448891c2441504c89d34d89da4d89c84989f94d89c44989d8488b58084889c84154ff25c30100004883380d74164889c148b8882309c9a37f0000488b5d08909090ff13488b4808488b09488339037568534c89d14c8b5424104c89ca4c8b4c24184989c84889c34889d0ff15820100004883f80175154889c148b8082409c9a37f0000488b5d089090ff13488b00488b08584889ca90ff1248833805751f49c7c00100000048c7c301000000594883c41051ff2542010000e9390000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d000000c2100048833909756d4152415141505348c7c30100000048ba982409c9a37f00009090ff15e6000000488b4c2430488b542428488b5c241048895c24305b48895c242048bb102209c9a37f0000488b74241848895c24185b4883c408488b3c2448891c244989d24989c94989f848c7c301000000eb05e90700000056ff2595000000488b442410488b542408488944241048895424084889c8e971fbffff9000000000000000009804000000000000|@2255,2097151,@15797,@2256,@2258,@2259,@1354,@1699,@1382,@2254,@2263,@2178,@2242,@2254|132,0,@2220 239,0,@2229 370,0,@2230 465,0,@2233 559,0,@1638 620,0,@2234 754,0,@2229 816,0,@2235 889,0,@2238 1034,0,@2241 1078,0,@2229 2220:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@15790,@2226|41,0,@2221 195,0,@2224 269,0,@2224 2221:O4|@20055,@557,@2223,@2222 2222:O5|@559,104,0,104,0 2223:S34|6d6b4c6f61643a206c6576656c206d757374206265206e6f6e2d6e65676174697665 2224:O4|@20055,@557,@2158,@2225 2225:O5|@559,101,0,101,0 2226:D3,544|488b0bf6c101754a488b11483b02744f488b3248833e017521488338017550488b7e0840f6c7017509f64008017503ff5570483b78087452eb5548833e03753448833803754e488b7e0840f6c7017517eb05e99a000000f6400801750aeb05e954000000ff5570483b78087557eb49e96800000048833e05753248833805755c488b7e0840f6c701eb0fe929000000e948000000e9430000007509f64008017503ff5570483b7808740eeb3048833e07752a488338077524498d77f0483b7510730aeb05e913000000ff55404989f748c746f801000000488916eb1c488b79084889f9483b65187303ff5548e912ffffff48c7c601000000488b0b4883fe017565f6c1017565488b11488b720840f6c60174064883c6027105ff5570ebf5498d7fd0483b7d107303ff55404989ff48c747f80200000048897708488907488d471848c740f80200000048894808488938488903488b4208a80174064883c0027111ff5570eb0ae976000000e929000000ebe94889c3498d47e8483b45107303ff55404989c748c740f8020000004889580848c70003000000c3498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048c740080100000048890848890348b840cd06c9a37f0000c3488b36498d47e8483b45107303ff55404989c748c740f802000000488b76084889700848c70003000000c39090909000000000000000001802000000000000|@2228,63,@15791|472,0,@441 2227:S34|434f44455452454528292e6e65774c6576656c283129746869734c6576656c283129 2228:S36|434f4445545245455f46554e4354494f4e5328292e616464546f436c6f73757265283229 2229:O1|@2219 2230:O1|@2231 2231:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15792|2,0,@441 2232:S33|434f44455452454528292e6d6b53696d706c6546756e6374696f6e283629283129 2233:S10|65717b2e2e2e7d283229 2234:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15793| 2235:O4|@20055,@557,@2237,@2236 2236:O5|@2176,723,0,723,0 2237:S21|457175616c69747920666f722066756e6374696f6e 2238:O4|@20055,@557,@2240,@2239 2239:O5|@2176,687,0,687,0 2240:S40|6d616b6545713a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2241:O11|@2242,@20051,@469,@20085,@1587,@20087,@1597,@20089,@1605,@20056,@477 2242:D7,152|483b65187303ff5548529090ff159e00000048833805752e488b480848833907751af64108017514488b5108488b1a488b430890ff157e000000eb0a4889c890ff157a000000488b0c24488b51284883c408488b1c2448891424ff7130ff7138ff7140ff7148ff71504c8b51204c8b49184c8b41104889de488b590856ff2545000000909090909000000000000000009000000000000000|@2252,2097151,@15795,@1401,@1401,@1401,@2243| 2243:D5,1024|483b65187303ff55484883380b756e488b4818488b5110488b720848833e0574064889c8c2300048833e057414488b780848b8c05208c9a37f0000488b5d08ff134889df4c8b5e10488b5808488b4608ff15c2030000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba102a09c9a37f0000488911eb05e98200000048894108488061ffbf6a016a01415241514150574c8d4424204889cb4c89d8909090ff1576030000488b442460488b4c2458488b542450488b5c2448488b742440488b7c2438488944246048894c2458488954245048895c2448488974244048897c24384c8b5424184c8b4c24104c8b4424085b4883c418584883c408e9fcfeffff4883380d74134889c148b8c82a09c9a37f0000488b5d08ff13488b4808488b09488339097417488b500848b8582b09c9a37f0000488b5d08909090ff13488b51084883fa01750948c7c201000000eb32488b32488b7e104c8b5f0849833b03750f493b5b08750948c7c203000000eb124c8b62084c89e2483b65187303ff5548ebbf4883fa01741d498d4ff0483b4d107303ff55404989cf48c741f8010000004c8901eb68488b51084883fa01750948c7c201000000eb32488b1a488b7310488b7e0848833f03750f4c3b4f08750948c7c203000000eb124c8b42084c89c2483b65187303ff5548ebbf4883fa017422498d4ff0483b4d107303ff55404989cf48c741f8010000004c8911eb6fe972010000488b51084883fa01750948c7c201000000eb37488b1a488b7310488b7e0848833f0375144c8b4424304c3b4708750948c7c203000000eb124c8b42084c89c2483b65187303ff5548ebba4883fa017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e903010000488b542428488911eb6a488b51084883fa01750948c7c201000000eb37488b1a488b7310488b7e0848833f0375144c8b4424204c3b4708750948c7c203000000eb124c8b42084c89c2483b65187303ff5548ebba4883fa017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e98a000000488b542418488911eb6a488b49084883f901750948c7c101000000eb37488b11488b5a10488b730848833e037514488b7c2410483b7e08750948c7c103000000eb12488b79084889f9483b65187303ff5548ebba4883f9017429498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e911000000488b542408488911eb0748c7c1010000004883f9017517488b500848b8b02b09c9a37f0000488b5d08909090ff13488b11498d5fd0483b5d107303ff55404989df48c743f80500000048c743200100000048895318488b324889731048c743080100000048c7030b000000488b40084889184889d0c23000900000000000000000f803000000000000|@2253,2097151,@15796,@1699,@1382|51,0,@1638 112,0,@2244 271,0,@2245 304,0,@2248 916,0,@2250 2244:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15794| 2245:O4|@20055,@557,@2247,@2246 2246:O5|@1338,2708,0,2708,0 2247:S40|74797065436f6e73747246726f6d4f7665726c6f61643a204e6f206d61746368696e672074797065 2248:O4|@20055,@557,@2247,@2249 2249:O5|@1338,2700,0,2700,0 2250:O4|@20055,@557,@2247,@2251 2251:O5|@1338,2698,0,2698,0 2252:S37|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f6164283229 2253:S48|545950455f5452454528292e74797065436f6e73747246726f6d4f7665726c6f61642832297072656654797065283129 2254:D10,392|483b65187303ff5548488b4810488b510848833a03750d488b7208483b357e010000743948833a03750d488b7208483b3573010000742648833a03750d488b7208483b3568010000741348833a03751a488b7208483b355d010000750d48b8d0d506c9a37f0000c22000498d47e0483b45107303ff55404989c748c740f803000000488b742418488970104889580848890841524151415053488b5424289090ff1248833805751849c7c00100000048c7c3010000009090ff1502010000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d000000f604240174074883c420c2200050ff742440ff742440ff7424404c8b5424604c8b4c24384c8b442430488b5c2428488b442420909090ff15960000009090ff15960000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000005a488950104889480848c700070000004883c420c220009090909000000000000000008001000000000000|@2280,2097151,@15810,@20093,@20096,@20095,@20094,@2178,@2279,@2166|95,0,@502 2255:S22|545950454944434f444528292e6d616b654571283429 2256:D4,456|483b65187303ff5548a8017570488b08415241514150ff7008534152ff7424504d89ca4c8b4c24404c8b442448488b5c2450488b4108488b54242090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b14244889511048bb10cd06c9a37f00004889590848c7010d000000eb05e928010000498d5fd8483b5d107303ff55404989df48c743f80400000048c74318010000004889531048be50d606c9a37f00004889730848c7030d000000498d77d0483b75107303ff55404989f748c746f80200000048c746080100000048891e488d5e1848c743f8020000004889730848890b4889c64889d890ff15e2000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c7010700000058a80174064883c0027105ff5570ebf551ff742448ff742448ff742448ff7424484c8b5424404c8b4c24384c8b4424304889c3488b442428e896feffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048ba80d606c9a37f00004889501848894810594883c4204889480848c70003000000c2200048b858cd06c9a37f0000c22000900000000000000000c001000000000000|@2257,1048575,@15798,@2166|104,0,@439 168,0,@507 391,0,@509 428,0,@442 2257:S39|545950454944434f444528292e6d616b654571283429636f6d62696e65456e7472696573283229 2258:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@15799| 2259:D3,128|483b65187303ff5548a8017555488b08488339097417488b500848b8103209c9a37f0000488b5d08909090ff13ff7108488b48084889c89090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@15800|28,0,@2260 2260:O4|@20055,@557,@2262,@2261 2261:O5|@559,79,0,79,0 2262:S9|646545787472616374 2263:D10,864|483b65187303ff554848833b057561498d47e8483b45107303ff55404989c748c740f80200000048b9483609c9a37f00004889084c894008488060ffbf498d4fd8483b4d107303ff55404989cf48c741f80200000048c74108ffffffff488901488d411848c740f801000000488908c348833b0b7568488b4b18488b5110488b720848833e05755b48833e0574134889c748b8c05208c9a37f0000488b5d08ff134889c74c8b5e10488b43084889c3488b460890ff15be020000498d4fe8483b4d107303ff55404989cf48c741f80200000048bac83609c9a37f0000eb0ae967010000e94800000048891148894108488061ffbf6a016a01415041524151574c8d4424204889cb4c89d89090ff156e0200004c8b5424104c8b4c24084c8b442418488b5c2420584883c428e9d0fefffff6430801744a41f6c1017549498b394c8b074d8b50104d8b5a0849833b03751248833e03750c4d8b63084c3b66087552eb3149833b01754a48833e0175444d8b631841f6c4017515f6461801750feb0ae9bf000000e93d000000ff55704c3b6618751f4d8d67f04c3b65107303ff55404d89e749c74424f80100000049893c24eb1c4d8b61084d89e1483b65187303ff5548e96fffffff49c7c4010000004983fc017506ff25ae0100004d8b2424498d47e8483b45107303ff55404989c748c740f80200000048bf803709c9a37f00004889384d8b6424084c896008488060ffbf498d7fd8483b7d107303ff55404989ff48c747f80200000048c74708ffffffff488907488d471848c740f801000000488938c3ff254601000048833b0d7568498d4fe8483b4d107303ff55404989cf48c741f802000000488b531048895108488b7308488931488b3648833e09756e415041524151504889d948c7c3010000004889c848ba982409c9a37f00009090ff15f2000000498d4fd0483b4d107303ff55404989cfeb05e98800000048c741f80500000048c741200100000048894118488b004889411048c741080100000048c7010b0000004c8b542410eb05e9170000004c8b4c24084c8b4424184889cb584883c418e9f6fcffff48833e03752d4d89d04889cb9090ff15820000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c34889f3e9bbfcffffff255d000000909090909000000000000000005803000000000000|@2271,2097151,@15805,@1699,@1382,@2268,@2268,@2242,@2272,@2268|41,0,@2264 147,0,@1638 212,0,@2266 504,0,@2267 662,0,@2241 2264:D3,24|488b4208c390909000000000000000001000000000000000|@2265,5,@15801| 2265:S48|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229283129 2266:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15802| 2267:D3,24|488b4208c390909000000000000000001000000000000000|@2265,5,@15803| 2268:D4,360|483b65187303ff5548a8017555488b08488b11488b12ff7008ff710853f6c2017555488b0250ff7208488b5c2410488b084889c8ff15460100004883f8017427498d47f0483b45107303ff55404989c748c740f801000000488b4c2408488908eb20e9e40000005a4883c408483b65187303ff5548eba648c7c0010000006a016a01a801756a488b00498d4fe0483b4d107303ff55404989cf48c741f80300000048ba583909c9a37f0000488911488b400848894108488b44241848894110488061ffbf48c7c001000000488b542420f6c2017525a80174064883c0027105ff5570ebf5488b5208483b6518730aeb05e947000000ff5548ebd6a80174064883c0027105ff5570ebf5498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c428c3488b5c24104883c42058e9b5feffff48c7c001000000c3909090909000000000000000006001000000000000|@2277,2097151,@15808,@2276|163,0,@2269 2269:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@2270,1048575,@15804| 2270:S68|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229283129 2271:S45|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f6465283229 2272:D3,352|483b65187303ff5548a8017563488b08488b511848833a03755b488b720840f6c601753d488b3e4c8b0f4d8b114c3b13751d4d8d5ff04c3b5d107303ff55404d89df49c743f80100000049893beb194c8b5e084c89de483b65187303ff5548ebbd49c7c3010000004983fb017518eb0ae984000000e973000000488b70084889f0e97affffff4d8b1b48c7c301000000488b700840f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdbf6c30174064883c3027105ff5570ebf5498d47e8483b45107303ff55404989c748c740f802000000488958084d8b5b084c8918c3488b70084889f0e907ffffff498d47e8483b45107303ff55404989c748c740f80200000048b9383c09c9a37f00004889084c894008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3909000000000000000005801000000000000|@2275,1023,@15807|275,0,@2273 2273:D3,24|488b4208c390909000000000000000001000000000000000|@2274,5,@15806| 2274:S70|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229283129 2275:S67|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d54797065566172283229 2276:D5,776|483b65187303ff5548539090ff150e03000050488b442408ff150a030000488b0c244883390d754e4883380d7548488b5108488b12488b5808488b1b48833a03752848833b037522488b4908483b4808740c48c7c0010000004883c410c348c7c0030000004883c410c348c7c0010000004883c410c348833905753b488338057535ff7010ff7110488b5808488b410890e86affffff4883f801740f488b5c2408584883c418e955ffffff48c7c0010000004883c420c3488339077554488338077553488b4908488b40084883f901751e4883f801740c48c7c0010000004883c410c348c7c0030000004883c410c3a801755f488b11488b18488b32483b33745640f6c6017555f6030175554c8b03eb0ae9bf000000e9ba00000041f6c001740948c7c703000000eb08498b38488d7c3f014883c7104989f94c89c74c8b51084c89c948d1e9483bc9f3a6488d7c3f01eb14e972000000e91e000000e913000000e90e000000488d743601488d4c0901740ceb2a4c8b5108eb244c8b5108ff70084152488b43084889c3488b4208909090e86afeffff4883f8017421eb07ff70084152eb18488b442408594883c408483b65187303ff5548e90effffff48c7c0010000004883c420c348c7c0010000004883c410c34883390b75544883380b7553488b5118488b5818488b7210488b7e0848833f03751a4c8b43104d8b480849833903750c4c8b57084d3b51087559eb3a48833f0175564c8b43104d8b480849833901755e4c8b571841f6c201eb0ae9b5000000e9b0000000750a41f64118017503ff55704d3b511875644c8b51084c8b58084983fa01752f4983fb01741848c7c001000000eb0ae970000000e96b0000004883c410c348c7c0030000004883c410c3e95500000041f6c301754341ff730841ff7208498b1b498b0290e85efdffff4883f801741d4c8b5c2408eb05e929000000415a4883c408483b65187303ff5548eb8e48c7c0010000004883c420c348c7c0010000004883c410c348c7c0010000004883c410c348c7c0010000004883c410c390909000000000000000000003000000000000|@2278,2097151,@15809,@1401,@1401| 2277:S65|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322966696e64436f646546726f6d4361636865283229 2278:S56|545950454944434f444528292e547970655661724d61702e66696e6443616368656454797065436f646528322973616d6554797065283229 2279:D4,168|483b65187303ff5548a801756e41524151415053ff7008ff742440ff742440ff742440488b009090ff159200000050ff742448ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b44242090e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e90b000000594883c428488908c2180048c7c001000000c218009090900000000000000000a000000000000000|@1363,2097151,@15811,@2281| 2280:S48|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229 2281:D7,488|483b65187303ff55484883380d7558488b4808488b0948833903754b4c89d14d89ca4d89c14989d84889c34889c89090ff15ca0100004883f80175154889c148b8504409c9a37f0000488b5d089090ff13488b00488b4c2418488b104889c85b4883c41853ff224151415053504152415041514989da4c8b4c24104c8b442440488b5c2450488b5424489090ff1250ff742420ff7424304c8b5424284c8b4c24184c8b442448488b5c2458488b442420ff155201000050ff742428ff7424384c8b5424304c8b4c24204c8b442450488b5c2460488b442428ff1532010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740f4889c8594883c41851ff25470000004889c8c21800900000000000000000e001000000000000|@2294,2097151,@15813,@2263,@2295,@2285,@2211|65,0,@2282 307,0,@509 2282:O4|@20055,@557,@2284,@2283 2283:O5|@2176,635,0,635,0 2284:S6|676574417267 2285:D10,928|483b65187303ff554841524151415053504c8b5424304c8b4c24384c8b4424204889c3488b442418ff158a0300004883f8017564488b042448833807755ff64008017543488b480848837908017538488b11488b5c2438488b74243048895c243848897424304c8b5424204c8b4c24184c8b442410488b5c2408488b42084883c428e979ffffff48c7c101000000488b4008a801752beb0ae97f020000e97a000000f6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebd14889c8a80174084883f8097f3deb06f640ff1074354889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c700050000004883c428c2100048b858cd06c9a37f00004883c428c210004883380b7568488b4818488b5110488b5a0848833b05755b48833b057417488b700848b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b58084889f0ff155a020000498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04809c9a37f0000eb0ae9b0000000e95400000048891148894108488061ffbf6a016a014989e04889cb4889f8909090ff1512020000488b442448488b4c2440488944244848894c24404c8b5424304c8b4c24284c8b442420488b5c2418584883c430e918feffff488b742438488b7c24304c8b4424204c8944243848897424304c8b44242848897c24284c8b4c24184c894c242049ba784909c9a37f00004c8b4c24084d89c34c8b442410488b58084889c84883c4204153ff25910100004883380d741048b8884909c9a37f0000488b5d08ff13488b4808488b0948833903751348b8104a09c9a37f0000488b5d08909090ff1348833909756d48c7c30100000048ba982409c9a37f0000ff1546010000488b4c2438488b542430488b5c242048895c243848894c2430488b5c24284889542428488b742418488974242049ba784909c9a37f00004c8b4c24084c8b4424104889de48c7c3010000004883c42056ff25f8000000488b442438488b542430488944243848895424304c8b5424204c8b4c24184c8b442410488b5c24084889c84883c428e9e4fcffff488b00488b08488b4424084889ca9090ff1248833805751e49c7c00100000048c7c3070000004883c428594883c41051ff25960000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010070000004889480848c7000d0000004883c428c210009000000000000000009803000000000000|@2310,2097151,@15818,@2263,@1699,@1382,@2309,@2242,@2309,@2178|269,0,@442 320,0,@1638 384,0,@2286 535,0,@2287 583,0,@2288 612,0,@2291 644,0,@2241 705,0,@2287 2286:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15812| 2287:O1|@2285 2288:O4|@20055,@557,@2290,@2289 2289:O5|@2176,459,0,459,0 2290:S25|73697a65466f72547970653a20556e6b6e6f776e2074797065 2291:O4|@20055,@557,@2293,@2292 2292:O5|@2176,433,0,433,0 2293:S38|73697a653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2294:S57|545950454944434f444528292e6d616b654571283429657175616c697479466f72436f6e737472756374696f6e283229676574417267283129 2295:D10,800|483b65187303ff554841524151415053504c8b5424304c8b4c24384c8b4424204889c3488b442418ff150a0300004883f8017564488b042448833807755ff64008017543488b480848837908017538488b11488b5c2438488b74243048895c243848897424304c8b5424204c8b4c24184c8b442410488b5c2408488b42084883c428e979ffffff48b8704e09c9a37f00004883c428c21000e9ff0100004883380b756a488b4818488b5110488b5a0848833b05755d48833b057416488b700848b8c05208c9a37f0000488b5d089090ff13488b7b10488b7308488b58084889f0ff155a020000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba904e09c9a37f0000488911eb0ae9ad000000e95100000048894108488061ffbf6a016a014989e04889cb4889f8909090ff1512020000488b442448488b4c2440488944244848894c24404c8b5424304c8b4c24284c8b442420488b5c2418584883c430e998feffff488b742438488b7c24304c8b4424204c8944243848897424304c8b44242848897c24284c8b4c24184c894c242049ba484f09c9a37f00004c8b4c24084d89c34c8b442410488b58084889c84883c4204153ff25910100004883380d741048b8584f09c9a37f0000488b5d08ff13488b4808488b0948833903751348b8e04f09c9a37f0000488b5d08909090ff1348833909756d48c7c30100000048ba982409c9a37f0000ff1546010000488b4c2438488b542430488b5c242048895c243848894c2430488b5c24284889542428488b742418488974242049ba484f09c9a37f00004c8b4c24084c8b4424104889de48c7c3010000004883c42056ff25f8000000488b442438488b542430488944243848895424304c8b5424204c8b4c24184c8b442410488b5c24084889c84883c428e964fdffff488b00488b08488b4424084889ca9090ff1248833805751e49c7c00100000048c7c3050000004883c428594883c41051ff25960000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d0000004883c428c210009000000000000000001803000000000000|@2306,2097151,@15815,@2263,@1699,@1382,@2305,@2242,@2305,@2178|137,0,@2296 193,0,@1638 256,0,@2297 407,0,@2298 455,0,@2299 484,0,@2302 516,0,@2241 577,0,@2298 2296:O3|2,2,0 2297:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15814| 2298:O1|@2295 2299:O4|@20055,@557,@2301,@2300 2300:O5|@2176,397,0,397,0 2301:S30|626f7865646e657373466f72547970653a20556e6b6e6f776e2074797065 2302:O4|@20055,@557,@2304,@2303 2303:O5|@2176,381,0,381,0 2304:S43|626f7865646e6573733a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2305:D6,288|483b65187303ff5548488b4810498d47e0483b45107303ff55404989c748c740f8030000004c89481048895808488908415041514152534c89c29090ff1248833805751849c7c00100000048c7c3050000009090ff15de000000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d000000f604240174074883c420c2200050ff742418ff742428ff7424404c8b5424504c8b4c24584c8b442460488b5c2428488b442420909090ff15720000009090ff15720000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000005a488950104889480848c700070000004883c420c2200000000000000000001801000000000000|@2308,1048575,@15816,@2178,@2307,@2166| 2306:S32|545950454944434f444528292e626f7865646e657373466f7254797065283429 2307:D4,408|483b65187303ff5548a801757041524151415053ff7008415141524d89c24c8b4c24404c8b442448488b5c2450488b00488b542418909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba58cc06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f802000000eb05e9fa0000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017409909090ff158a00000050ff742448ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b44242090e8aefeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2180048c7c001000000c21800909000000000000000009001000000000000|@1363,1048575,@15817,@2211|84,0,@434 136,0,@509 177,0,@509 2308:S59|545950454944434f444528292e626f7865646e657373466f7254797065283429626f7865646e657373466f72436f6e737472756374696f6e283229 2309:D6,288|483b65187303ff5548488b4810498d47e0483b45107303ff55404989c748c740f8030000004c89481048895808488908415041514152534c89c29090ff1248833805751849c7c00100000048c7c3070000009090ff15de000000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010070000004889480848c7000d000000f604240174074883c420c2200050ff742418ff742428ff7424404c8b5424504c8b4c24584c8b442460488b5c2428488b442420909090ff15720000009090ff15720000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000005a488950104889480848c700070000004883c420c2200000000000000000001801000000000000|@2312,1048575,@15819,@2178,@2311,@2166| 2310:S27|545950454944434f444528292e73697a65466f7254797065283429 2311:D4,440|483b65187303ff5548a801756f41524151415053ff7008415141524d89c24c8b4c24404c8b442448488b5c2450488b00488b542418909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b980d606c9a37f0000488908eb05e917010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b980d606c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740d4889c89090ff1592000000eb034889c850ff742448ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b442420e892feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2180048c7c001000000c218009090909090900000000000000000b001000000000000|@1363,1048575,@15820,@2211|111,0,@509 159,0,@509 200,0,@509 2312:S49|545950454944434f444528292e73697a65466f725479706528342973697a65466f72436f6e737472756374696f6e283229 2313:D7,624|483b65187303ff554841504151415253504c8b5424304c8b4c24104c8b4424184889c3488b442420ff155a0200004883f8017557488b0424488338077552488b4008488b4c2408a8017536488b10ff7008ff7424384c8b5424204c8b4c24284c8b4424304889cb488b42089090e88effffff4889c158483b65187303ff5548ebc64889c84883c428c20800e9960100004883380b7568488b4818488b5110488b5a0848833b05755b48833b057417488b700848b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b58084889f0ff15b6010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba985a09c9a37f0000eb0ae9bf000000e94a00000048891148894108488061ffbf6a016a014989e04889cb4889f8909090ff156e010000488b44244048894424404c8b5424204c8b4c24284c8b442430488b5c2418584883c430e9aefeffff4c8b6808488b5c24204889c89090ff153a010000a8017410f6442408017409483b4424087d0ceb05ff5570ebf2488b44240841f6c501753141ff7508ff7424384c8b5424204c8b4c24284c8b4424304889c3498b450090e852feffff415d483b65187303ff5548ebc94883c428c208004883380d7552488b4008488b0048833803750c4883c408584883c418c2080048833809750c4883c408584883c418c20800488b4c243048894c24304c8b5424104c8b4c24184c8b4424204883c4085b4883c418e9e6fdffff4883c408584883c418c20800488b00488b4808f6c1017410f6442408017409483b4c24087e11eb05ff5570ebf24889c84883c428c208004883c408584883c418c2080090909000000000000000006802000000000000|@2316,2097151,@15822,@2263,@1699,@1382,@2315|180,0,@1638 244,0,@2314 2314:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15821| 2315:D3,304|483b65187303ff5548f6c3017556488b0b488b511848833a017556488b720840f6c6017559488b3e4c8b47104d8b480849833903751a4c8b50104d8b5a0849833b03750c4d8b61084d3b6308754eeb434983390175464c8b50104d8b5a0849833b01eb05e9ac00000075314d8b6118eb05e99300000041f6c4017511eb05e92e00000041f64318017503ff55704d3b6318750949c7c403000000eb1c4c8b56084c89d6483b65187303ff5548e96effffff49c7c4010000004983fc01743f48c7c001000000488b730840f6c601751ea80174064883c0027105ff5570ebf5488b7608483b65187303ff5548ebdca80174064883c0027105ff5570ebf5c3488b73084889f3e9f7feffff488b73084889f3e9ebfeffff48c7c0ffffffffc390909000000000000000002801000000000000|@2317,2047,@15823| 2316:S27|545950454944434f444528292e6765744d61784465707468283329 2317:S47|545950454944434f444528292e547970655661724d61702e636865636b54797065436f6e7374727563746f72283229 2318:D5,184|483b65187303ff5548a8017570488b08f6c1017544488b11488b1a483b1dae0000007523483b1dad0000007414488b700848b878e107c9a37f0000488b5d08ff13488b7210eb1c488b71084889f1483b65187303ff5548ebb748be30e306c9a37f000056488b400890e892ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090909090900000000000000000b000000000000000|@1363,31,@15827,@20054,@20054|51,0,@1486 91,0,@573 2319:S46|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129 2320:D3,112|483b65187303ff5548a801754553ff7008488b004889da90ff1250488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@15825| 2321:D3,136|483b65187303ff5548a8017561488b08488339057417488b500848b8905f09c9a37f0000488b5d08909090ff13488b510849895498fc4883c302ff7110488b70084889f090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008000000000000000|@2325,95,@15826|28,0,@2322 2322:O4|@20055,@557,@2324,@2323 2323:O5|@2182,179,0,179,0 2324:S12|6e6f7420636f6e7374616e74 2325:S58|434f4445545245455f46554e4354494f4e5328292e6d616b65436f6e737456616c2831296d616b6556616c283129636f7079546f566563283229 2326:O3|2,@2328,@2327 2327:O2|@2337,0 2328:O4|@2330,@2329,2,1 2329:O1|@2333 2330:O1|@2331 2331:D3,24|48c7c001000000c300000000000000001000000000000000|@2332,1,@15829| 2332:S10|6572726f72436f646532 2333:D3,32|48b8806109c9a37f0000c3909090909000000000000000001800000000000000|@2336,1,@15830|2,0,@2334 2334:O2|3,@2335 2335:S2|666e 2336:S14|7072696e742d66756e6374696f6e 2337:O4|@20054,69,@2338,0 2338:O3|2,4,@2339 2339:O5|@571,@2341,@2357,@2358,@2340 2340:O2|@609,@2381 2341:O2|@594,@2342 2342:O2|@2344,@2343 2343:O2|@2350,@2349 2344:O2|@2346,@2345 2345:O3|0,@2348,@576 2346:O2|1,@2347 2347:O2|2,3 2348:O8|@509,@2332,0,0,@910,0,0,1 2349:O2|@2355,@602 2350:O2|@2352,@2351 2351:O3|0,@2353,@576 2352:O2|1,@1038 2353:O8|@2354,@2336,0,0,@437,0,0,1 2354:O3|2,@2334,0 2355:O2|@2356,@573 2356:O3|0,2,0 2357:O14|2,2,2,2,2,2,2,2,2,2,2,2,2,2 2358:O15|@2360,@2364,@2363,@2362,@2330,@2329,@2328,@2369,@2368,@2373,@2372,@2376,@2361,@2378,@2359 2359:O4|I251,@2378,1,1 2360:O6|@2362,@2328,@2368,@2372,@2361,@2359 2361:O4|@485,@2376,3,1 2362:O4|@2364,@2363,3,1 2363:O1|@2366 2364:O1|@2365 2365:D3,24|48c7c001000000c300000000000000001000000000000000|@2332,1,@15831| 2366:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@2367,1,@15832|2,0,@413 2367:S13|7072696e742d64656661756c74 2368:O4|I113,@2369,3,1 2369:O1|@2370 2370:D3,48|483b65187303ff554848b948b419f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2371,1048575,@15833|11,0,@20050 2371:S9|7072696e742d696e74 2372:O4|I251,@2373,1,1 2373:O1|@2374 2374:D3,48|483b65187303ff554848b9f8b319f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2375,1048575,@15834|11,0,@20045 2375:S10|7072696e742d626f6f6c 2376:O1|@2377 2377:D3,48|483b65187303ff554848b968b419f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@556,1048575,@15835|11,0,@20052 2378:O1|@2379 2379:D3,48|483b65187303ff554848b9e8b919f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2380,1048575,@15836|11,0,@20090 2380:S10|7072696e742d63686172 2381:O2|@2383,@2382 2382:O2|0,@2421 2383:O2|@2385,@2384 2384:O2|@2406,0 2385:O4|@20053,69,@2386,0 2386:O2|0,@2387 2387:O2|0,@2388 2388:O2|0,@2389 2389:O2|0,@2390 2390:O2|@2391,@440 2391:O2|@2393,@2392 2392:O2|@2401,@2400 2393:O4|@20053,69,@2394,0 2394:O2|@2395,@491 2395:O2|@2397,@2396 2396:O2|@2397,0 2397:O4|@20054,69,@2398,0 2398:O3|0,@497,@2399 2399:O5|@566,@496,I49,@607,@589 2400:O2|@2401,0 2401:O4|@20054,69,@2402,0 2402:O3|2,4,@2403 2403:O4|@617,@2405,@2404,@2361 2404:O2|@2396,@491 2405:O2|@2398,@620 2406:O4|@20054,69,@2407,0 2407:O3|2,6,@2408 2408:O4|@617,@2410,@2409,@2360 2409:O2|0,@2415 2410:O2|@573,@2411 2411:O2|@573,@2412 2412:O2|@573,@2413 2413:O2|@573,@2414 2414:O2|@2402,@622 2415:O2|0,@2416 2416:O2|0,@2417 2417:O2|0,@2418 2418:O2|@2419,@440 2419:O2|@2420,@2400 2420:O4|@20053,69,@2404,0 2421:O2|0,@2422 2422:O2|0,@2423 2423:O2|0,@2424 2424:O2|0,@2425 2425:O2|0,@2426 2426:O2|0,@2427 2427:O2|0,@2428 2428:O2|0,@2429 2429:O2|0,@2430 2430:O2|0,@2431 2431:O2|@2391,@585 2432:O2|@2434,@2433 2433:O2|@2456,@2455 2434:O2|@469,@2435 2435:O3|2,@2368,@2436 2436:O2|@2437,0 2437:O4|@20054,69,@2438,0 2438:O3|2,4,@2439 2439:O5|@571,@2440,@2357,@2358,@2340 2440:O2|@594,@2441 2441:O2|@2443,@2442 2442:O2|@2445,@599 2443:O2|@2444,@573 2444:O3|0,I113,0 2445:O2|@1022,@2446 2446:O3|0,@2447,@576 2447:O8|@2448,@2371,0,0,@772,0,0,1 2448:O4|3,@518,@2449,1 2449:O4|3,@2451,@2450,1 2450:O3|2,I253,0 2451:O2|@2453,@2452 2452:O2|@527,0 2453:O2|@2454,1 2454:O3|2,@20050,0 2455:O2|@2477,@2476 2456:O2|@404,@2457 2457:O3|2,@2372,@2458 2458:O2|@2459,0 2459:O4|@20054,69,@2460,0 2460:O3|2,4,@2461 2461:O5|@571,@2462,@2357,@2358,@2340 2462:O2|@594,@2463 2463:O2|@2465,@2464 2464:O2|@2468,@2467 2465:O2|@2466,@573 2466:O3|0,I251,0 2467:O2|@605,@602 2468:O2|@1104,@2469 2469:O3|0,@2470,@576 2470:O8|@2471,@2375,0,0,@772,0,0,1 2471:O4|3,@518,@2472,1 2472:O4|3,@2473,@2450,1 2473:O2|@2474,@2452 2474:O2|@2475,1 2475:O3|2,@20045,0 2476:O2|@2497,0 2477:O2|@477,@2478 2478:O3|2,@2361,@2479 2479:O2|@2393,@2480 2480:O2|@2481,0 2481:O4|@20054,69,@2482,0 2482:O3|2,4,@2483 2483:O5|@571,@2484,@2357,@2358,@2340 2484:O2|@594,@2485 2485:O2|@2487,@2486 2486:O2|@2489,@599 2487:O2|@2488,@2398 2488:O3|0,@485,@2396 2489:O2|@758,@2490 2490:O3|0,@2491,@576 2491:O8|@2492,@556,0,0,@772,0,0,1 2492:O4|3,@518,@2493,1 2493:O4|3,@2494,@2450,1 2494:O2|@2495,@2452 2495:O2|@2496,1 2496:O3|2,@20052,0 2497:O2|@1605,@2498 2498:O3|2,@2359,@2499 2499:O2|@2500,0 2500:O4|@20054,69,@2501,0 2501:O3|2,4,@2502 2502:O5|@571,@2503,@2357,@2358,@2340 2503:O2|@594,@2504 2504:O2|@2465,@2505 2505:O2|@2506,@2467 2506:O2|@779,@2507 2507:O3|0,@2508,@576 2508:O8|@2509,@2380,0,0,@772,0,0,1 2509:O4|3,@518,@2510,1 2510:O4|3,@2511,@2450,1 2511:O2|@2512,@2452 2512:O2|@2513,1 2513:O3|2,@20090,0 2514:O3|2,@2362,@2515 2515:O2|@2516,0 2516:O4|@20054,69,@2517,0 2517:O3|2,4,@2518 2518:O5|@571,@2519,@2357,@2358,@2340 2519:O2|@594,@2520 2520:O2|@2522,@2521 2521:O2|@2523,@599 2522:O2|@1148,@2345 2523:O2|@1155,@2524 2524:O3|0,@2525,@576 2525:O8|@2526,@2367,0,0,@437,0,0,1 2526:O3|2,@413,0 2527:O2|7,@2528 2528:O8|@509,@2529,0,0,@910,1,0,1 2529:S10|6e6f457175616c697479 2530:O4|@2531,@2326,@2432,@2514 2531:D4,56|483b65187303ff5548488b0c244c8904244c8b52184c8b4a104c8b420851ff252c0000009090909000000000000000003000000000000000|@2599,2097151,@15852,@2532| 2532:D58,6144|483b65187303ff554848833805756d48b8689509c9a37f0000a8017524488b08488339057512488b48084889c8483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741248b8b89509c9a37f0000ff15ba170000eb0a48b8b89509c9a37f00004889c348c7c001000000ff15a6170000eb05e99a000000505348bbd89509c9a37f000048c7c003000000ff158e170000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8b06109c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c20800488338077566f64008017565488b48084883790801755f488b11498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fe0483b7d107303ff55404989ff48c747f80300000049bb309609c9a37f00004c891f488977084c8b5b08eb0fe97b0d0000e96e0c0000e9f10500004c895f10488067ffbf4c8b2341f6c40174064983c4027105ff5570ebf54d8d6fe04c3b6d107303ff55404d89ef49c745f8030000004989751049897d084d89650056ff32ff7424184c89eb488b4208e816feffff4889c348b828f506c9a37f000090ff1532160000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c701070000004989ca48bbb89709c9a37f00005890ff15f6150000498d4fb0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8500107c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740a4152ff1536150000eb02415248b9d09709c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b8009809c9a37f0000909090ff15e6140000eb0e4889c148b8009809c9a37f00005148b9389809c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b8889809c9a37f0000909090ff158a140000eb0e4889c148b8889809c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808488b4c2410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908909090ff15fa13000048b9a89809c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b8f89809c9a37f0000909090ff15ae130000eb0e4889c148b8f89809c9a37f000051498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a488911498d57c8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f80300000048c74010010000004889500848c7001d000000f6c2017524488b0a488339057512488b4a084889ca483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff1506130000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff15ea11000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15961100009090ff1596110000505348bb189909c9a37f000048c7c003000000909090ff1582110000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8709909c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c20800488b501048833a017506488b5210eb12488b5208488b12483b65187303ff5548ebe24883fa01745848c7c20300000041524151415053ff7008f6c101755f488b01ff710852ff3048c7c3030000004889d048baa05f06c9a37f00009090ff15a6100000483b0424744ff60424017566a8017567a801740e48c7c103000000eb0de9de000000488b08488d4c09014883c110488b34244889c748d1e9eb05e959000000483bc9f3a6488d7c3f01488d743601488d4c09017536488b442408a80174064883c0027105ff5570ebf54889c24883c410eb0ae914000000e90f00000059483b65187303ff5548e94bffffff48c7c0010000004883c418eb0748c7c0030000004883f801745248c7c001000000488b0c24f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda80174084883f8057d11eb06f640ff10740948c7c001000000eb2148c7c003000000eb1848c7c001000000eb0f48c7c0010000004152415141505351488b4c2408498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fe0483b5d107303ff55404989df48c743f80300000048be909909c9a37f000048893348895308488b710848897310488063ffbf488b3940f6c70174064883c7027105ff5570ebf54d8d47e04c3b45107303ff55404d89c749c740f803000000498950104989580849893848c7c301000000488b3c2440f6c701751ff6c30174064883c3027105ff5570ebf5488b7f08483b65187303ff5548ebdb525041504889df48bb189b09c9a37f00004889f89090ff15be0e00004889c3488b44241848bab09b09c9a37f0000ff15ae0e000048837c240801751048bbc89d09c9a37f0000ff159e0e000048837c240801750948c7c1f7000000eb0748c7c151000000498d57b0483b55107303ff55404989d748c742f80300000048c742100100000048894a0848c70205000000488d4a2048c741f80200000048c7410801000000488911488d511848c742f80200000048894a0848b9500107c9a37f000048890a498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889510848c7011d000000f6c2017524488b1a48833b057512488b5a084889da483b65187303ff5548ebe048c7c201000000eb0748c7c2030000004883fa01740e504889c89090ff15c20d0000eb074889c24889c85250ff742448ff742460ff742420ff7424304c8b5424604c8b4c245849b8389f09c9a37f000048c7c301000000488b442428ff158a0d0000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c418488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15ee0c0000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740790ff15ce0b0000594883c428488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15760b00009090ff15760b0000505348bb489f09c9a37f000048c7c003000000909090ff15620b0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8709909c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080048b8a09f09c9a37f0000a8017524488b08488339057512488b48084889c8483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741248b808a009c9a37f0000ff159a0a0000eb0a48b808a009c9a37f00004889c348c7c001000000ff15860a0000505348bb28a009c9a37f000048c7c003000000909090ff15720a0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8709909c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c208004883380b7568488b4818488b5110488b720848833e05755b48833e057414488b780848b8c05208c9a37f0000488b5d08ff134889df4c8b5e10488b5808488b4608ff15b2090000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba80a009c9a37f0000488911eb0ae914060000e94f00000048894108488061ffbf6a016a01415241514150574c8d4424204889cb4c89d89090ff1562090000488b44243848894424384c8b5424184c8b4c24104c8b4424085b4883c418584883c408e932f0ffff498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d5fe04c3b5d107303ff55404d89df49c743f80300000049bc38a109c9a37f00004d892349897b084c8b63084d896310498063ffbf4c8b2b41f6c50174064983c5027105ff5570ebf54d8d77e04c3b75107303ff55404d89f749c746f80300000049897e104d895e084d892e415241514150ff700857ff701041564989f94d89e04c89eb488b02909090ff158e08000048833805751849c7c00100000048c7c3030000009090ff157a080000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d00000050ff742448ff7424104c8b5424484c8b4c24404c8b44243848bb389f09c9a37f0000488b442430909090ff151a08000048837c242001756f498d47e8483b45107303ff55404989c748c740f80200000048b998f006c9a37f000048894808488b0c2448890890ff15e6070000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c70107000000eb05e9ac0100004889cb48b828f506c9a37f000090ff159a070000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c701070000004989ca488b5c241048b8c0a209c9a37f000090ff155a070000488b4c2418488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff1502070000483b1d030700007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15be0600005053415248bbd8a209c9a37f000048c7c00300000090ff15aa060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c440c20800498d4fe8483b4d107303ff55404989cf48c741f80200000048ba98f006c9a37f000048895108488b14244889114889c34889c8909090ff15f6050000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c701070000004889ce4889d8909090ff15b6050000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c701070000004889cb48b828f506c9a37f00009090ff157a050000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c701070000004989ca488b5c241048b8c0a209c9a37f000090ff153a050000488b4c2418488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15e2040000483b1de30400007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff159e0400005053415248bb30a309c9a37f000048c7c00300000090ff158a040000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c440c208004883380d756a488b4808488b094883390975624152415141505348c7c30100000048ba982409c9a37f0000909090ff15de030000498d4fd0483b4d107303ff55404989cf48c741f80500000048c741200100000048894118488b004889411048c741080100000048c7010b000000eb0ae9df000000e926000000488b44242848894424284c8b5424184c8b4c24104c8b4424085b4883c4184889c8e9d2e9ffff48833903755a534889c3488b442410909090ff15620300004883f80175154889c148b888a309c9a37f0000488b5d089090ff13488b00488b08584889ca90ff1248833805751f49c7c00100000048c7c303000000594883c40851ff2522030000e9390000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c20800488b4008488b00488b4c240848894c2408e91ee9ffff48b820a409c9a37f0000a8017524488b08488339057512488b48084889c8483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741348b888a409c9a37f000090ff1586020000eb0a48b888a409c9a37f00004889c348c7c001000000ff1572020000505348bba8a409c9a37f000048c7c003000000909090ff155e020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b800a509c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080090909090900000000000000000f817000000000000|@2605,2097151,@15855,@2211,@2259,@1354,@2166,@100,@2211,@2211,@2211,@2606,@2211,@2211,@2211,@2258,@2259,@1354,@194,@1354,@2561,@1459,@2211,@2607,@2211,@2211,@2258,@2259,@1354,@2211,@2259,@1354,@1699,@1382,@2628,@2178,@2600,@2166,@2166,@100,@2258,I48,@2259,@1354,@2166,@2166,@2166,@100,@2258,I48,@2259,@1354,@2242,@2263,@2178,@2211,@2259,@1354|17,0,@2533 80,0,@2536 98,0,@2536 133,0,@2537 225,0,@2336 370,0,@2539 495,0,@685 562,0,@2540 662,0,@775 784,0,@2541 849,0,@2543 873,0,@2543 884,0,@2545 949,0,@2548 973,0,@2548 1120,0,@2549 1185,0,@2552 1209,0,@2552 1431,0,@509 1472,0,@509 1513,0,@442 1554,0,@509 1774,0,@2553 1869,0,@2555 2010,0,@193 2363,0,@2556 2503,0,@2557 2532,0,@2560 2556,0,@2566 2678,0,@775 2836,0,@2571 3084,0,@509 3125,0,@509 3166,0,@442 3207,0,@509 3430,0,@2572 3525,0,@2555 3585,0,@2574 3648,0,@2578 3666,0,@2578 3694,0,@2579 3789,0,@2555 3883,0,@1638 3944,0,@2581 4107,0,@2582 4336,0,@2571 4392,0,@651 4452,0,@2450 4487,0,@685 4559,0,@2583 4689,0,I48 4731,0,@971 4760,0,@2584 4936,0,@651 5004,0,@2450 5094,0,@685 5167,0,@2583 5297,0,I48 5339,0,@971 5368,0,@2586 5553,0,@2241 5713,0,@2588 5860,0,@2591 5923,0,@2595 5942,0,@2595 5970,0,@2596 6065,0,@2598 2533:O2|@775,@2534 2534:O2|@2535,0 2535:O3|2,@2335,0 2536:O3|14,@2533,1 2537:O1|@2538 2538:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15837|2,0,@441 2539:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@15838,@2226|41,0,@2221 195,0,@2224 269,0,@2224 2540:S2|203d 2541:O2|@442,@2542 2542:O2|@442,@651 2543:O3|14,@2544,1 2544:O2|@442,@2542 2545:O2|@775,@2546 2546:O2|@2547,0 2547:O3|2,125,0 2548:O3|14,@2545,1 2549:O2|@775,@2550 2550:O2|@2551,0 2551:O3|2,123,0 2552:O3|14,@2549,1 2553:O1|@2554 2554:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15839|2,0,@441 2555:S14|7072696e742d6c6162656c6c6564 2556:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@15840,@2226|41,0,@2221 195,0,@2224 269,0,@2224 2557:O1|@2558 2558:D3,24|c39090909090909000000000000000001000000000000000|@2559,1,@15841| 2559:S52|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296669656c64732d283129 2560:O2|@2561,@20116 2561:D3,312|483b65187303ff55484883f801755a4883fb01744c498d47d8483b45107303ff55404989c748c740f80400000048b9289d09c9a37f00004889481848c740100100000048b9809d09c9a37f000048894808488b5208488910488b5d08909090ff1348c7c001000000c3f6c3017453498d4fd8483b4d107303ff55404989cf48c741f80400000048be289d09c9a37f00004889711848c741100100000048be809d09c9a37f000048897108488b7208488931488b78084c8b004889c8488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b3348897108488b384889395251488b73084889f3488b70084889f0909090e802ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c3909000000000000000003001000000000000|@2565,127,@15842|47,0,@2562 69,0,@2564 136,0,@2562 158,0,@2564 2562:O5|@2563,51,0,51,0 2563:S20|2e2f62617369732f4c697374506169722e736d6c 2564:S14|556e657175616c4c656e67746873 2565:S17|4c697374506169722e7a69704571283229 2566:O1|@2567 2567:D3,72|488b00488b08498d47e8483b45107303ff55404989c748c740f80200000048ba489e09c9a37f000048891048894808488060ffbfc390909000000000000000004000000000000000|@2570,7,@15844|32,0,@2568 2568:D3,48|483b65187303ff5548488b00488b18488b420848ba9095dc0000000000ff229000000000000000002800000000000000|@2569,63,@15843|21,0,I29 2569:S59|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283229283129 2570:S56|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832297072696e744974656d732d283129 2571:O1|@2532 2572:O1|@2573 2573:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15845|2,0,@441 2574:O2|@775,@2575 2575:O2|@2576,0 2576:O3|2,@2577,0 2577:S2|2829 2578:O3|14,@2574,1 2579:O1|@2580 2580:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15846|2,0,@441 2581:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@15847| 2582:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@15848,@2226|41,0,@2221 195,0,@2224 269,0,@2224 2583:S6|7072696e742d 2584:O1|@2585 2585:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15849|2,0,@441 2586:O1|@2587 2587:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15850|2,0,@441 2588:O4|@20055,@557,@2590,@2589 2589:O5|@2176,474,0,474,0 2590:S48|7072696e746572466f72547970653a2073686f756c6420616c72656164792068617665206265656e2068616e646c6564 2591:O2|@775,@2592 2592:O2|@2593,0 2593:O3|2,@2594,0 2594:S7|3c656d7074793e 2595:O3|14,@2591,1 2596:O1|@2597 2597:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@15851|2,0,@441 2598:S11|7072696e742d656d707479 2599:S30|545950454944434f444528292e7072696e746572466f7254797065283329 2600:D6,504|483b65187303ff5548a801757041524151415053ff7008ff30ff742440488b5c2440488b442408488b542418ff1250ff742428ff7424384c8b5424304c8b4c245849b888a709c9a37f0000488b5c2450488b442418909090ff15b201000050ff742430ff7424404c8b5424384c8b4c246049b888a709c9a37f0000eb05e956010000488b5c2458488b442420ff1586010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b980d606c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff159e000000eb034889c850ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b442418e852feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2100048c7c001000000c210009090909090900000000000000000f001000000000000|@1363,2097151,@15864,@2295,@2285,@2211|67,0,@2601 115,0,@2601 267,0,@509 2601:O1|@2602 2602:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@2604,1048575,@15853,@2603| 2603:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@15854,@2178|263,0,@2173 2604:S70|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f64652832296d616b655072696e7465724964283129636f6465466f724964283129 2605:S42|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f6465283229 2606:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c348b880d606c9a37f0000c30000000000000000d800000000000000|@1696,1048575,@15856,@2211|199,0,@509 2607:D26,3000|483b65187303ff5548a80174144889c148b898b709c9a37f0000488b5d0890ff1348837808017572488b08488b11ff32ff7108ff7424284c89d34c8b5424384c89ce4989d94c89c34989f04889de488b5c2428488b42084889f29090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000005a4889511048ba50f406c9a37f00004889510848c7010d000000eb05e9170400004889c34889ce48b8f0b709c9a37f000090ff151a0b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba08b809c9a37f0000488951104889410848c70107000000498d47b0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f80200000048894108488931488d411848c740f80300000048c74010010000004889480848c7001d000000f6c101740b539090ff15860a0000eb0153498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c890ff155e0a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c701070000006a016a0148837c24200174174889e048c700010000004889e048c7400853000000eb6d4989ca48bbb89709c9a37f0000488b44241090ff15fa090000498d4fb0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f80200000048c7400801000000488908488d481848c741f80200000048894108eb05e92d01000048b8500107c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740b415290ff1532090000eb02415248b9d09709c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b828b809c9a37f0000909090ff15e2080000eb0e4889c148b828b809c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908488d4c2408488901488d44240848c74008fb000000eb0151498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b4c24104889480848c70005000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9500107c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15b2070000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594889084883f8017506488b0424eb104889c3488b0424909090ff15620700004883c418594883c42051ff255a070000488b08488b116a016a0148837c24180174174889e648c706010000004889e648c7460853000000eb6f4d89cb4d89c44989dd4c8b7008ff7108ff720848bbb89709c9a37f0000488b0290ff1512070000498d4fb0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f80200000048c7400801000000488908488d4818eb05e94901000048c741f8020000004889410848b8500107c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174134152415341544155415690ff1542060000eb0a4152415341544155415648b9d09709c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b860b809c9a37f0000909090ff15ea050000eb0e4889c148b860b809c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908488d4c2438488901488d44243848c74008fb000000eb10ff7108ff720841524151415053ff7008ff7424604c8b5424704c8b4c24284c8b442420488b5c2460488b442430488b5424189090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b5424304889511048ba50f406c9a37f00004889510848c7010d0000004889c34889ce48b8f0b709c9a37f0000ff150a050000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba08b809c9a37f0000488951104889410848c70107000000498d47b0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f80200000048894108488931488d411848c740f80300000048c74010010000004889480848c7001d000000f6c101740b539090ff1576040000eb0153498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c890ff154e040000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c7010700000048b898b809c9a37f0000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174135148b8e8b809c9a37f0000ff15d6030000eb0b48b8e8b809c9a37f00005148b9d09709c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174155048b808b909c9a37f00009090ff157e030000eb0e4889c148b808b909c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014883f9017507488b442438eb104889cb488b4424389090ff1502030000488b4c2408f6c10174064883c1027105ff5570ebf550ff742470ff742470ff742470ff7424704c8b5424484c8b4c24404c8b4424384889cb488b4424289090e866f6ffff4889c3584883c4089090ff15b60200004989c2488b5c243848b8a81607c9a37f0000ff15a6020000498d4fb0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8500107c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740a4152ff15e6010000eb024152498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8ff15be010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424084889510848c70105000000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848bad03707c9a37f00004889114889c34889c8ff154a010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba28b909c9a37f0000488951104889410848c70107000000498d47d8483b45107303ff55404989c748c740f8040000005a4883c44048895018488958104889480848c70003000000c220009090909090900000000000000000b00b000000000000|@2623,1048575,@15857,@2166,@2211,@2166,@100,@2211,@2211,@2211,@2624,@2625,@100,@2211,@2211,@2166,@2211,@2166,@2211,@2211,@2626,@2627,@100,@2211,@2622,@2166|18,0,@2608 133,0,@679 167,0,@2610 216,0,@2611 474,0,@2540 585,0,@775 708,0,@2541 773,0,@2612 797,0,@2612 986,0,@775 1268,0,@2540 1377,0,@775 1516,0,@2541 1581,0,@2614 1605,0,@2614 1789,0,@679 1816,0,@2610 1864,0,@2611 2084,0,@2616 2148,0,@2619 2166,0,@2619 2177,0,@2541 2242,0,@2620 2265,0,@2620 2484,0,@820 2582,0,@775 2847,0,@977 2904,0,@2621 2608:O4|@20091,@1627,0,@2609 2609:O5|@2176,569,0,569,0 2610:O2|@977,@434 2611:O3|2,I107,0 2612:O3|14,@2613,1 2613:O2|@442,@2542 2614:O3|14,@2615,1 2615:O2|@442,@2542 2616:O2|@775,@2617 2617:O2|@2618,0 2618:O3|2,44,0 2619:O3|14,@2616,1 2620:O3|14,@2541,1 2621:O3|2,I234,0 2622:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c348b880d606c9a37f0000c30000000000000000d800000000000000|@1696,1048575,@15862,@2211|199,0,@509 2623:S53|545950454944434f444528292e7072696e746572466f72547970652833297072696e74436f646528322961735265636f7264283229 2624:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15858| 2625:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c348b880d606c9a37f0000c30000000000000000d800000000000000|@1696,1048575,@15859,@2211|199,0,@509 2626:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15860| 2627:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c34889d8c3909090909090900000000000000000d800000000000000|@1696,1048575,@15861,@2211| 2628:D5,456|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25aa0100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057557488b4808488b09488b4010488b00f6c301740af600017405482b187105ff5570ebf64883c301f6c30174084883fb017c08eb17f643ff10741148b8701e09c9a37f0000488b5d0890ff13f6c301740d4883fb017e58eb0be9c0000000f643ff10754bf6c30174064883eb027105ff5570ebf5498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848890841514c89c2909090ff125b90ff15c6000000eb48f6c10174084883f9017c08eb18f641ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c34883380374144889c148b8000309c9a37f0000488b5d0890ff13488b4008c39090909090900000000000000000c001000000000000|@2195,1048575,@15863,@2178,@2226|178,0,@2221 313,0,@2224 414,0,@2173 2629:O8|@2526,@2367,0,0,@437,1,0,1 2630:O4|@20055,@557,@2632,@2631 2631:O5|@2176,144,0,144,0 2632:S19|6765744361636865645479706556616c756573 2633:O3|@2634,@20143,@20117 2634:D19,1864|483b65187303ff55484889d9f6c101753e488b31488b3e483b3d42070000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498931eb194c8b49084c89c9483b65187303ff5548ebbd49c7c1010000004983f901756948b998c809c9a37f0000f6c101753e488b31488b3e483b3df0060000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498931eb194c8b49084c89c9483b65187303ff5548ebbd49c7c1010000004983f901751b4889c148b8c0cf09c9a37f0000eb05e931000000488b5d0890ff13498b09488b31483b359206000074154889c748b878e107c9a37f0000488b5d089090ff13488b7910eb26498b09488b31483b357006000074134889c748b878e107c9a37f0000488b5d08ff13488b79104989da41f6c201753f4d8b1a4d8b234c3b2549060000751e4d8d6ff04c3b6d107303ff55404d89ef49c745f8010000004d895d00eb194d8b6a084d89ea483b65187303ff5548ebbb49c7c5010000004983fd01750c49ba68d009c9a37f0000eb2a4d8b55004d8b1a4c3b1df805000074134989c448b878e107c9a37f0000488b5d08ff134d8b5a104d89da4883ff017422525341525741505048bae0d009c9a37f0000ff15c6050000488b54241890ff12eb134989c348c7c0010000005253415257415041536a016a016a016a01488b442448ff70104c8b50084c8d4c24084c8b442430488b5c2448488b44242890ff1582050000488b44240890ff157e05000048833803756548837c2410017506488b0424eb30498d47e0483b45107303ff55404989c748c740f803000000488b0c2448894810488b4c24104889480848c700150000006a016a0148837c24400174265048bae0d009c9a37f0000909090ff1522050000488b542450eb05e97d0000009090ff12eb0b4889c148c7c00100000051488b442460ff70104c8b50084c8d4c24104c8b442460488b5c2438488b44240890ff15e6040000498d47e0483b45107303ff55404989c748c740f80300000048b9e0720ac9a37f00004883c408488908488b4c240848894808594883c40848894810488060ffbf4883c450c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000048ba98730ac9a37f0000488911488b4c2418f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0ddd0300007c1ceb06f641ff1075144889c248b820f007c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b44241848890752574889fb4889d048ba70760ac9a37f0000ff15ce030000488b0424488b004883f801750c48b8909adc0000000000eb674889c14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b34244889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbf488b4c2428f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0daa0200007c1deb06f641ff1075154889c248b820f007c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf54889c248b880d606c9a37f00004883c408488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b442420488907488b4c24185257f6c1017525ff71084c8b442408488b5c2410488b01909090ff159602000059483b65187303ff5548ebd648c7c001000000488b0424488b0048c7c1010000004883f80174534889c24883ea024883e802a80174064883c0027105ff5570ebf5488b1c24488b4483fc498d77e8483b75107303ff55404989f748c746f80200000048894e084889064889d04889f1483b65187303ff5548eba7498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24184883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740c4889c890ff1592010000eb034889c848837c242001742f4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b4c24204889480848c700150000006a016a0148837c245001741e5048bae0d009c9a37f0000909090ff153e010000488b54246090ff12eb0b4889c148c7c00100000051488b442470ff70104c8b50084c8d4c24104c8b442470488b5c2448488b44240890ff150a010000498d47d0483b45107303ff55404989c748c740f80500000048b9107b0ac9a37f00004883c408488908488b4c241048894808488b4c241848894810488b4c240848894818594883c41848894820488060ffbf4883c450c390909000000000000000003007000000000000fdffffffffffff01fdffffffffffff01|@6767,2097151,@17384,@20126,@20126,@20126,@20126,@20141,@20141,@2699,@6768,@7283,@2699,@3135,@3123,@7287,@2211,@2699,@3135|94,0,@2635 187,0,@2690 229,0,@1486 271,0,@1486 376,0,@2694 407,0,@1486 444,0,@2697 629,0,@2697 740,0,@3101 820,0,@3103 882,0,@1509 988,0,@3121 1017,0,I49 1181,0,@1509 1218,0,@509 1665,0,@2697 1768,0,@3130 2635:O2|@2637,@2636 2636:O2|@2642,@2641 2637:O4|@20118,69,@2638,0 2638:O1|@2639 2639:D3,24|48c7c001000000c300000000000000001000000000000000|@2640,1,@15865| 2640:S18|44656275672e64656661756c74732d283129 2641:O2|@2646,@2645 2642:O4|@20119,69,@2643,0 2643:O1|@2644 2644:D3,24|48c7c001000000c300000000000000001000000000000000|@2640,1,@15866| 2645:O2|@2648,@2647 2646:O4|@20120,69,I48,0 2647:O2|@2652,@2651 2648:O4|@20121,69,@2649,0 2649:O1|@2650 2650:D3,24|48c7c001000000c300000000000000001000000000000000|@2640,1,@15867| 2651:O2|@2654,@2653 2652:O4|@20122,69,1,0 2653:O2|@2656,@2655 2654:O4|@20123,69,80,0 2655:O2|@2658,@2657 2656:O4|@20124,69,0,0 2657:O2|@2660,@2659 2658:O4|@20125,69,0,0 2659:O2|@2662,@2661 2660:O4|@20126,69,0,0 2661:O2|@2664,@2663 2662:O4|@20127,69,0,0 2663:O2|@2666,@2665 2664:O4|@20128,69,1,0 2665:O2|@2668,@2667 2666:O4|@20129,69,0,0 2667:O2|@2670,@2669 2668:O4|@20130,69,0,0 2669:O2|@2672,@2671 2670:O4|@20131,69,6,0 2671:O2|@2676,@2675 2672:O4|@20132,69,@2673,0 2673:O1|@2674 2674:D3,24|48c7c001000000c300000000000000001000000000000000|@2640,1,@15868| 2675:O2|@2678,@2677 2676:O4|@20133,69,77,0 2677:O2|@2680,@2679 2678:O4|@20134,69,0,0 2679:O2|@2682,@2681 2680:O4|@20135,69,0,0 2681:O2|@2684,@2683 2682:O4|@20136,69,0,0 2683:O2|@2686,@2685 2684:O4|@20137,69,0,0 2685:O2|@2688,@2687 2686:O4|@20138,69,0,0 2687:O2|@2689,0 2688:O4|@20139,69,1,0 2689:O4|@20140,69,1,0 2690:O4|@20055,@557,@2692,@2691 2691:O5|@2693,126,0,126,0 2692:S11|746167206d697373696e67 2693:S28|6d6c736f757263652f4d4c436f6d70696c65722f44656275672e4d4c 2694:O1|@2695 2695:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@15869| 2696:S19|5072657474792e676574546167283229283129 2697:O3|@2699,@2698,@20054 2698:O2|@3081,@2697 2699:D43,8304|483b65187303ff5548488b0848bb36d109c9a37f0000488d5c8bfcffe390e9f7020000909090e9b3040000909090e90f080000909090e95b000000909090e9e3090000909090e95f0b0000909090e9930c0000909090e92f0e0000909090e94b150000909090e94e150000909090e92b160000909090e973180000909090e923190000909090e9631c0000909090e9cf1e0000909090488b481048833905751052ff70084889c89090e852ffffffeb6948833909750e52ff70084889c8e83effffffeb5a52ff70084889c89090e82effffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f80200000048894808eb0ae98f000000e98a00000048b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff1350488b5c2410488b442408ff15ca1e00009090ff15ca1e0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100300000048c741080500000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8e07307c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4104889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c352ff70084889d3488b4010909090ff156a1d00009090ff156a1d0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f0f209c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442408488b54241090e83efcffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7018ff7010488b4008e812fbffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b828f309c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442408488b54241890e846faffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b858f309c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442418488b54242090e87af9ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888f309c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3f6400801745af6400801751b488b4808488b581048b8b8f309c9a37f0000488b5d08909090ff1348837808017566488b4810f6c1017540488b19488b33483b72107522498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb1ee92b010000488b79084889f9483b65187303ff5548ebbb48c7c7010000004883ff01755c488b400848ba28f409c9a37f0000eb05e9f700000090ff15c61700004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b0f488b19483b5a107417488b700848b878e107c9a37f0000488b5d08909090ff13488b711048833e01752c498d47e8483b45107303ff55404989c748c740f8020000004c8b46084c89400848c7000f000000e985f6ffff488b400848ba28f409c9a37f0000909090ff151e1700004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b400848ba28f409c9a37f0000ff15d21600004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b480848833907750b48b890260ac9a37f0000c348833903756a48c7c303000000488b410848baa05f06c9a37f00009090ff15621600004889c348b8c8260ac9a37f000090ff15561600004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a801741d4889c148b8f86f07c9a37f0000eb05e90a000000488b5d08909090ff13c348833905756b48c7c303000000488b410848baa05f06c9a37f0000909090ff15f21500004889c348b8e0260ac9a37f000090ff15e61500004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a801741d4889c148b8f86f07c9a37f0000eb05e90a000000488b5d08909090ff13c348c7c303000000488b410848baa05f06c9a37f000090ff158a1500004889c348b8f8260ac9a37f000090ff157e1500004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c352ff7010488b4008909090e846f4ffff50488b442408488b542410e836f4ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810270ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b840270ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7018ff7010488b4008e80af3ffff5048c7c303000000488b44240848baa05f06c9a37f0000909090ff15da13000048837c241001750c48b9509adc0000000000eb0a48b970270ac9a37f0000498d57a0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848c701bb000000488d511848c742f80200000048894a08488902488d421848c740f8020000004889500848c700b7000000ff155a130000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8e08d07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4184889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c3488b48084883792801740c48bb509adc0000000000eb0a48bb88270ac9a37f000052ff31ff7110ff7118ff713053ff7108488b592048c7c0010000009090ff1532120000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca5b48c7c045000000ff15d611000048c7c345000000909090ff15ce110000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f8020000005a4889500848c70007000000a80174144889c248b8f86f07c9a37f0000488b5d0890ff134152515048c7c303000000488b44241848baa05f06c9a37f000090ff153e11000048bba0270ac9a37f0000ff1536110000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889cb488b442420909090ff15f21000004989da4989c348c7c35100000048b8b8270ac9a37f0000909090ff15da100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b5c24484c89d8ff15961000009090ff1596100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134989c248c7c3b700000048b8d0270ac9a37f0000909090ff150e100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442440909090ff15ca0f00009090ff15ca0f0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0270ac9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b850280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8601b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880280ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080900000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff1350488b442408488b54241090e80aebffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080500000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c348b8b0280ac9a37f0000c34989d24c8b580848c7c35100000048b8e0280ac9a37f0000909090ff15860b0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13514c89d34c89d8ff15460b00009090ff15460b0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7010488b5a08488b40089090ff15c60a0000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100300000048c741080500000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b54241090e8eae8ffff498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100300000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba48d208c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f8280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b828290ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c352488b40089090e806e7ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f00004883c40848895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958290ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3488b481048c7c30100000048c7c60100000052ff7008ff7018ff31ff7010483b74240873704889f04883c002488b0c246a016a015350ff71084c8d44241848c7c3110000004889f048ba50a8dc0000000000ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901eb05e9520000004823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085e4883c4184889c3483b65187303ff5548e932ffffff4889d848c7c30300000048baa05f06c9a37f00009090ff15d20600005048c7c303000000488b44241048baa05f06c9a37f0000909090ff15ba060000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba88290ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7005f000000488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b8290ac9a37f000048890890ff1532060000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442418488b54242890e856e4ffff50488b442428488b542430e846e4ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4284889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b4808f6c10174084883f9017d2beb06f641ff10742352ff7010ff70184889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb0e488b5810488b70184889c852535648c7c30500000048baa05f06c9a37f000090ff154a040000488b0c24f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c85248c7c30500000048baa05f06c9a37f0000ff15fe030000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad8290ac9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a0290ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f0290ac9a37f0000488908909090ff155e030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b54241090e86ae1ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c34883781001750c48b9082a0ac9a37f0000eb0a48b9202a0ac9a37f00004989d24c8b580848c7c3510000004889c8ff151a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13514c89d34c89d8ff15da0100009090ff15da010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000006820000000000000|@3022,2097151,@15873,@3023,@3025,@3026,@3054,@2713,@2713,@2713,@194,@100,@194,@100,@194,@100,@194,@109,@3055,@100,@100,@194,@100,@3069,@100,@3070,@3071,@100,@3072,@3073,@100,@3074,@3075,@3076,@194,@194,@109,@194,@194,@109,@100,@3080,@3021|14,0,$2699+30 236,0,@883 293,0,@884 334,0,@835 413,0,@1294 484,0,@884 525,0,@835 602,0,@1294 670,0,@1317 776,0,@1294 852,0,@2700 931,0,@1294 988,0,@883 1033,0,@884 1074,0,@835 1115,0,@884 1230,0,@1294 1315,0,@833 1356,0,@2702 1435,0,@1294 1519,0,@833 1560,0,@2704 1639,0,@1294 1723,0,@833 1764,0,@2706 1843,0,@1294 1910,0,@833 1983,0,@833 2098,0,@1294 2136,0,@2708 2252,0,@2711 2321,0,@1294 2356,0,@1486 2433,0,@2711 2497,0,@1294 2520,0,@2711 2581,0,@1294 2610,0,@2983 2638,0,@193 2659,0,@2985 2721,0,@1294 2765,0,@193 2787,0,@2986 2849,0,@1294 2887,0,@193 2907,0,@2987 2969,0,@1294 3044,0,@831 3089,0,@833 3130,0,@2988 3207,0,@2990 3286,0,@1294 3333,0,@193 3360,0,I48 3372,0,@2992 3528,0,@1294 3598,0,@1373 3704,0,@1294 3735,0,I48 3747,0,@2993 3856,0,@1294 3948,0,@1294 4010,0,@1294 4043,0,@193 4060,0,@2994 4116,0,@1294 4165,0,@2995 4224,0,@1294 4366,0,@1294 4393,0,@2996 4452,0,@1294 4594,0,@1294 4635,0,@2997 4680,0,@833 4753,0,@833 4826,0,@833 4899,0,@833 4972,0,@833 5013,0,@3001 5054,0,@833 5095,0,@832 5136,0,@833 5213,0,@833 5254,0,@3003 5333,0,@1294 5419,0,@1317 5534,0,@1294 5552,0,@3005 5577,0,@3007 5636,0,@1294 5774,0,@1294 5876,0,@1294 6001,0,@1294 6043,0,@2119 6088,0,@1317 6129,0,@3008 6170,0,@833 6247,0,@1317 6288,0,@3010 6367,0,@1294 6420,0,@883 6469,0,@3012 6551,0,@1294 6640,0,I104 6814,0,@193 6845,0,@193 6888,0,@3014 6988,0,@3016 7048,0,@1294 7124,0,@883 7169,0,@833 7210,0,@834 7251,0,@884 7389,0,@1294 7441,0,@376 7451,0,I106 7487,0,@193 7531,0,@376 7541,0,I106 7572,0,@193 7612,0,@3017 7657,0,@3015 7734,0,@3018 7796,0,@1294 7856,0,@883 7901,0,@833 8016,0,@1294 8043,0,@3019 8055,0,@3020 8128,0,@1294 8266,0,@1294 2700:O2|3,@2701 2701:S10|424547494e4c4f4f5028 2702:O2|3,@2703 2703:S2|6966 2704:O2|3,@2705 2705:S4|7468656e 2706:O2|3,@2707 2707:S4|656c7365 2708:O4|@20079,@1299,@2710,@2709 2709:O5|@1301,114,0,114,0 2710:S7|746f53686f7274 2711:O3|@2713,@2712,@20079 2712:O256|@2728,@2729,@2730,@2731,@2732,@2733,@2734,@2735,@2736,@2737,@2738,@2739,@2740,@2741,@2742,@2743,@2744,@2745,@2746,@2747,@2748,@2749,@2750,@2751,@2752,@2753,@2754,@2755,@2756,@2757,@2758,@2759,@2760,@2761,@2762,@2763,@2764,@2765,@2766,@2767,@2768,@2769,@2770,@2771,@2772,@2773,@2774,@2775,@2776,@2777,@2778,@2779,@2780,@2781,@2782,@2783,@2784,@2785,@2786,@2787,@2788,@2789,@2790,@2791,@2792,@2793,@2794,@2795,@2796,@2797,@2798,@2799,@2800,@2801,@2802,@2803,@2804,@2805,@2806,@2807,@2808,@2809,@2810,@2811,@2812,@2813,@2814,@2815,@2816,@2817,@2818,@2819,@2820,@2821,@2822,@2823,@2824,@2825,@2826,@2827,@2828,@2829,@2830,@2831,@2832,@2833,@2834,@2835,@2836,@2837,@2838,@2839,@2840,@2841,@2842,@2843,@2844,@2845,@2846,@2847,@2848,@2849,@2850,@2851,@2852,@2853,@2854,@2855,@2856,@2857,@2858,@2859,@2860,@2861,@2862,@2863,@2864,@2865,@2866,@2867,@2868,@2869,@2870,@2871,@2872,@2873,@2874,@2875,@2876,@2877,@2878,@2879,@2880,@2881,@2882,@2883,@2884,@2885,@2886,@2887,@2888,@2889,@2890,@2891,@2892,@2893,@2894,@2895,@2896,@2897,@2898,@2899,@2900,@2901,@2902,@2903,@2904,@2905,@2906,@2907,@2908,@2909,@2910,@2911,@2912,@2913,@2914,@2915,@2916,@2917,@2918,@2919,@2920,@2921,@2922,@2923,@2924,@2925,@2926,@2927,@2928,@2929,@2930,@2931,@2932,@2933,@2934,@2935,@2936,@2937,@2938,@2939,@2940,@2941,@2942,@2943,@2944,@2945,@2946,@2947,@2948,@2949,@2950,@2951,@2952,@2953,@2954,@2955,@2956,@2957,@2958,@2959,@2960,@2961,@2962,@2963,@2964,@2965,@2966,@2967,@2968,@2969,@2970,@2971,@2972,@2973,@2974,@2975,@2976,@2977,@2978,@2979,@2980,@2981,@2982,@2727 2713:D13,1328|483b65187303ff5548a8017458a80174084883f8017d23eb06f640ff10741b4889c348b810c506c9a37f000048bad0a8dc00000000009090ff1248c7c30500000048baa05f06c9a37f000090ff15f60400004889c348b8f8010ac9a37f0000ff25eb040000a8017458498d4fd8483b4d107303ff55404989cf48c741f80400000048bb207007c9a37f00004889591848bbe07007c9a37f00004889591048bbc87007c9a37f000048895908488b5a104889194889c64889c8488b5d08909090ff1350524889c348c7c0cd00000048bad0b3dc000000000090ff124883f801746348c7c0010000004881f80102000075154889c148b810020ac9a37f0000488b5d089090ff135048ba90bddc0000000000ff12483b4424107551f60424017422488b442408488b500848b9ffffffffffffff0048234af8488d4c0901483b0c247718eb05e94000000048b8b0df06c9a37f0000488b5d0890ff13488b0c24488b4c8afc4889c84883c418c358a80174064883c0027105ff5570ebf5483b65187303ff5548e95fffffff488b4c2408480fb641ff488d4400014883e0074883f805753e4889cb48c7c0d300000048bad0b3dc0000000000909090ff124889c348b890020ac9a37f000090ff158a03000048c7c3450000004883c410ff2581030000480fb641ff488d4400014883e0074883f803755f48b8ffffffffffffff00482341f8488d440001a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff1248c7c31100000048ba50a9dc000000000090ff12a801740d4883f8217c14eb0be94e000000f640ff10750748c7c021000000ff742408ff35fa0200004889e3909090ff15f602000048bb683906c9a37f00004883c410ff15ea0200004889c348b8a8020ac9a37f00004883c410ff25db020000f6c1017457488b0424498d57d8483b55107303ff55404989d748c742f80400000048bb207007c9a37f000048895a1848bbe07007c9a37f000048895a1048bbc87007c9a37f000048895a08488b581048891a4889d0488b5d0890ff13480fb641ff488d4400014883e0074883f8017571f6c1017457488b0424498d57d8483b55107303ff55404989d748c742f80400000048bb207007c9a37f000048895a1848bbe07007c9a37f000048895a1048bbc87007c9a37f000048895a08488b581048891a4889d0488b5d0890ff1348b8ffffffffffffff00482341f8488d440001eb05e97f010000a80174084883f8017d21eb06f640ff1074194889c348b810c506c9a37f000048bad0a8dc0000000000ff12a80174084883f8037c65eb06f640ff107562f6442408017460488b0424498d4fd8483b4d107303ff55404989cf48c741f80400000048ba207007c9a37f00004889511848bae07007c9a37f00004889511048bac87007c9a37f000048895108488b50104889114889c8488b5d08eb0fe9e0000000e9db000000e905000000909090ff13488b442408488b00a8017570a801745c488b0c24498d57d8483b55107303ff55404989d748c742f80400000048bb207007c9a37f000048895a1848bbe07007c9a37f000048895a1048bbc87007c9a37f000048895a08488b491048890a4889c14889d0488b5d08909090ff13480fb648ff488d4c09014883e107eb05e9410000004883f905753b4889c348c7c0d300000048bad0b3dc0000000000ff124889c348b8c8020ac9a37f000090ff159e00000048c7c3450000004883c410ff259500000048b8e0020ac9a37f00004883c410c348b8e0020ac9a37f00004883c410c39090909090909000000000000000002805000000000000|@2723,2097151,@15870,@194,@100,@100,@100,@2724,@2722,@116,@100,@100,@100|36,0,@376 46,0,I106 67,0,@193 87,0,@2714 131,0,@1295 145,0,@1300 159,0,@1299 207,0,I150 245,0,@2715 264,0,I189 298,0,36028797018963967 330,0,@560 429,0,I150 447,0,@2718 501,0,36028797018963967 541,0,@376 551,0,I106 571,0,I108 636,0,@84 659,0,@2719 712,0,@1295 726,0,@1300 740,0,@1299 824,0,@1295 838,0,@1300 852,0,@1299 883,0,36028797018963967 930,0,@376 940,0,I106 1005,0,@1295 1019,0,@1300 1033,0,@1299 1127,0,@1295 1141,0,@1300 1155,0,@1299 1228,0,I150 1243,0,@2720 1277,0,@2721 1292,0,@2721 2714:S3|4c4954 2715:O4|103,@112,@2717,@2716 2716:O5|@1301,416,0,416,0 2717:S17|556e6b6e6f776e2052545320656e747279 2718:S6|434f44452022 2719:S9|425954452064617461 2720:S5|46554e2022 2721:S20|4c4954203c6c6f6e6720776f726420646174613e 2722:D3,328|483b65187303ff55484883f803750c48c7c0010000004889daff224883f801750b48b8509adc0000000000c3a8017412a80174084883f8017d1beb06f640ff1074134889c148b8884406c9a37f0000488b5d08ff134889c14883c11e48c1e9034883c901483b0dd500000072144889c248b8583e06c9a37f0000488b5d0890ff134889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ea488917488d54120148c7c001000000535752483b0424733c4889c14883c1105051488b5424209090ff12488b4c24185a48d1ea48d1e848880411488d440001488d541201584883c002483b65187303ff5548ebbe488b4424084883c408488060ffbf4883c410c39000000000000000003801000000000000ffffffffffffff01|@2726,1048575,@15872|35,0,I48 71,0,@113 114,0,@101 2723:S23|416464726573732e737472696e674f66576f7264283129 2724:D3,64|a8017513488b08f640ff10740348f7d9488d4c0901eb034889c1488b520848d1e9480fb60c0a488d4c09014889c8c39000000000000000003800000000000000|@2725,7,@15871| 2725:S31|416464726573732e737472696e674f66576f7264283129646174612d283129 2726:S18|537472696e672e746162756c617465283229 2727:S20|504f4c595f5359535f61737369676e5f776f7264 2728:S5|2052545330 2729:S13|504f4c595f5359535f65786974 2730:S5|2052545332 2731:S5|2052545333 2732:S5|2052545334 2733:S5|2052545335 2734:S5|2052545336 2735:S5|2052545337 2736:S5|2052545338 2737:S14|504f4c595f5359535f6368646972 2738:S6|205254533130 2739:S20|504f4c595f5359535f616c6c6f635f73746f7265 2740:S21|504f4c595f5359535f616c6c6f635f756e696e6974 2741:S6|205254533133 2742:S15|504f4c595f5359535f726169736578 2743:S19|504f4c595f5359535f6765745f6c656e677468 2744:S6|205254533136 2745:S18|504f4c595f5359535f6765745f666c616773 2746:S6|205254533138 2747:S6|205254533139 2748:S6|205254533230 2749:S6|205254533231 2750:S6|205254533232 2751:S20|504f4c595f5359535f7374725f636f6d70617265 2752:S6|205254533234 2753:S6|205254533235 2754:S19|504f4c595f5359535f74657374737472677472 2755:S19|504f4c595f5359535f746573747374726c7373 2756:S19|504f4c595f5359535f74657374737472676571 2757:S19|504f4c595f5359535f746573747374726c6571 2758:S24|504f4c595f5359535f657863657074696f6e5f7472616365 2759:S22|504f4c595f5359535f676976655f65785f7472616365 2760:S27|504f4c595f5359535f657863657074696f6e5f74726163655f666e 2761:S25|504f4c595f5359535f676976655f65785f74726163655f666e 2762:S6|205254533334 2763:S6|205254533335 2764:S6|205254533336 2765:S6|205254533337 2766:S6|205254533338 2767:S6|205254533339 2768:S6|205254533430 2769:S6|205254533431 2770:S6|205254533432 2771:S6|205254533433 2772:S6|205254533434 2773:S6|205254533435 2774:S6|205254533436 2775:S16|504f4c595f5359535f6c6f636b736567 2776:S20|504f4c595f5359535f656d707479737472696e67 2777:S19|504f4c595f5359535f6e756c6c766563746f72 2778:S6|205254533530 2779:S16|504f4c595f5359535f6e6574776f726b 2780:S20|504f4c595f5359535f6f735f7370656369666963 2781:S20|504f4c595f5359535f65715f6c6f6e67776f7264 2782:S21|504f4c595f5359535f6e65715f6c6f6e67776f7264 2783:S21|504f4c595f5359535f6765715f6c6f6e67776f7264 2784:S21|504f4c595f5359535f6c65715f6c6f6e67776f7264 2785:S20|504f4c595f5359535f67745f6c6f6e67776f7264 2786:S20|504f4c595f5359535f6c745f6c6f6e67776f7264 2787:S6|205254533539 2788:S6|205254533630 2789:S20|504f4c595f5359535f696f5f6469737061746368 2790:S23|504f4c595f5359535f7369676e616c5f68616e646c6572 2791:S6|205254533633 2792:S6|205254533634 2793:S6|205254533635 2794:S6|205254533636 2795:S6|205254533637 2796:S6|205254533638 2797:S21|504f4c595f5359535f61746f6d69635f7265736574 2798:S20|504f4c595f5359535f61746f6d69635f696e6372 2799:S20|504f4c595f5359535f61746f6d69635f64656372 2800:S20|504f4c595f5359535f7468726561645f73656c66 2801:S24|504f4c595f5359535f7468726561645f6469737061746368 2802:S22|504f4c595f5359535f706c75735f6c6f6e67776f7264 2803:S23|504f4c595f5359535f6d696e75735f6c6f6e67776f7264 2804:S21|504f4c595f5359535f6d756c5f6c6f6e67776f7264 2805:S21|504f4c595f5359535f6469765f6c6f6e67776f7264 2806:S21|504f4c595f5359535f6d6f645f6c6f6e67776f7264 2807:S22|504f4c595f5359535f616e64625f6c6f6e67776f7264 2808:S21|504f4c595f5359535f6f72625f6c6f6e67776f7264 2809:S22|504f4c595f5359535f786f72625f6c6f6e67776f7264 2810:S6|205254533832 2811:S6|205254533833 2812:S18|504f4c595f5359535f6b696c6c5f73656c66 2813:S28|504f4c595f5359535f73686966745f6c6566745f6c6f6e67776f7264 2814:S29|504f4c595f5359535f73686966745f72696768745f6c6f6e67776f7264 2815:S35|504f4c595f5359535f73686966745f72696768745f61726974685f6c6f6e67776f7264 2816:S17|504f4c595f5359535f70726f66696c6572 2817:S27|504f4c595f5359535f6c6f6e67776f72645f746f5f746167676564 2818:S27|504f4c595f5359535f7369676e65645f746f5f6c6f6e67776f7264 2819:S29|504f4c595f5359535f756e7369676e65645f746f5f6c6f6e67776f7264 2820:S16|504f4c595f5359535f66756c6c5f6763 2821:S20|504f4c595f5359535f737461636b5f7472616365 2822:S24|504f4c595f5359535f74696d696e675f6469737061746368 2823:S6|205254533935 2824:S6|205254533936 2825:S6|205254533937 2826:S6|205254533938 2827:S16|504f4c595f5359535f6f626a73697a65 2828:S17|504f4c595f5359535f73686f7773697a65 2829:S7|20525453313031 2830:S7|20525453313032 2831:S7|20525453313033 2832:S16|504f4c595f5359535f71756f7472656d 2833:S17|504f4c595f5359535f69735f73686f7274 2834:S14|504f4c595f5359535f61706c7573 2835:S15|504f4c595f5359535f616d696e7573 2836:S13|504f4c595f5359535f616d756c 2837:S13|504f4c595f5359535f61646976 2838:S13|504f4c595f5359535f616d6f64 2839:S13|504f4c595f5359535f616e6567 2840:S13|504f4c595f5359535f786f7261 2841:S15|504f4c595f5359535f657175616c61 2842:S12|504f4c595f5359535f6f7261 2843:S13|504f4c595f5359535f616e6461 2844:S7|20525453313136 2845:S17|504f4c595f5359535f5265616c5f737472 2846:S17|504f4c595f5359535f5265616c5f676571 2847:S17|504f4c595f5359535f5265616c5f6c6571 2848:S17|504f4c595f5359535f5265616c5f677472 2849:S17|504f4c595f5359535f5265616c5f6c7373 2850:S16|504f4c595f5359535f5265616c5f6571 2851:S17|504f4c595f5359535f5265616c5f6e6571 2852:S22|504f4c595f5359535f5265616c5f4469737061746368 2853:S17|504f4c595f5359535f4164645f7265616c 2854:S17|504f4c595f5359535f5375625f7265616c 2855:S17|504f4c595f5359535f4d756c5f7265616c 2856:S17|504f4c595f5359535f4469765f7265616c 2857:S17|504f4c595f5359535f4162735f7265616c 2858:S17|504f4c595f5359535f4e65675f7265616c 2859:S7|20525453313331 2860:S7|20525453313332 2861:S18|504f4c595f5359535f636f6e765f7265616c 2862:S20|504f4c595f5359535f7265616c5f746f5f696e74 2863:S20|504f4c595f5359535f696e745f746f5f7265616c 2864:S18|504f4c595f5359535f737172745f7265616c 2865:S17|504f4c595f5359535f73696e5f7265616c 2866:S17|504f4c595f5359535f636f735f7265616c 2867:S20|504f4c595f5359535f61726374616e5f7265616c 2868:S17|504f4c595f5359535f6578705f7265616c 2869:S16|504f4c595f5359535f6c6e5f7265616c 2870:S7|20525453313432 2871:S7|20525453313433 2872:S7|20525453313434 2873:S7|20525453313435 2874:S7|20525453313436 2875:S7|20525453313437 2876:S14|504f4c595f5359535f737464696e 2877:S15|504f4c595f5359535f7374646f7574 2878:S20|504f4c595f5359535f70726f636573735f656e76 2879:S26|504f4c595f5359535f7365745f737472696e675f6c656e677468 2880:S28|504f4c595f5359535f6765745f66697273745f6c6f6e675f776f7264 2881:S22|504f4c595f5359535f706f6c795f7370656369666963 2882:S19|504f4c595f5359535f627974657665635f6571 2883:S7|20525453313535 2884:S7|20525453313536 2885:S7|20525453313537 2886:S7|20525453313538 2887:S7|20525453313539 2888:S20|504f4c595f5359535f636d656d5f6c6f61645f38 2889:S21|504f4c595f5359535f636d656d5f6c6f61645f3136 2890:S21|504f4c595f5359535f636d656d5f6c6f61645f3332 2891:S21|504f4c595f5359535f636d656d5f6c6f61645f3634 2892:S24|504f4c595f5359535f636d656d5f6c6f61645f666c6f6174 2893:S25|504f4c595f5359535f636d656d5f6c6f61645f646f75626c65 2894:S21|504f4c595f5359535f636d656d5f73746f72655f38 2895:S22|504f4c595f5359535f636d656d5f73746f72655f3136 2896:S22|504f4c595f5359535f636d656d5f73746f72655f3332 2897:S22|504f4c595f5359535f636d656d5f73746f72655f3634 2898:S25|504f4c595f5359535f636d656d5f73746f72655f666c6f6174 2899:S26|504f4c595f5359535f636d656d5f73746f72655f646f75626c65 2900:S7|20525453313732 2901:S7|20525453313733 2902:S7|20525453313734 2903:S7|20525453313735 2904:S7|20525453313736 2905:S7|20525453313737 2906:S7|20525453313738 2907:S7|20525453313739 2908:S7|20525453313830 2909:S7|20525453313831 2910:S7|20525453313832 2911:S7|20525453313833 2912:S7|20525453313834 2913:S7|20525453313835 2914:S7|20525453313836 2915:S7|20525453313837 2916:S7|20525453313838 2917:S21|504f4c595f5359535f696f5f6f7065726174696f6e 2918:S12|504f4c595f5359535f666669 2919:S7|20525453313931 2920:S7|20525453313932 2921:S7|20525453313933 2922:S26|504f4c595f5359535f7365745f636f64655f636f6e7374616e74 2923:S19|504f4c595f5359535f6d6f76655f776f726473 2924:S31|504f4c595f5359535f73686966745f72696768745f61726974685f776f7264 2925:S7|20525453313937 2926:S19|504f4c595f5359535f6d6f76655f6279746573 2927:S7|20525453313939 2928:S19|504f4c595f5359535f636f64655f666c616773 2929:S21|504f4c595f5359535f736872696e6b5f737461636b 2930:S15|504f4c595f5359535f737464657272 2931:S7|20525453323033 2932:S24|504f4c595f5359535f63616c6c636f64655f7475706c6564 2933:S25|504f4c595f5359535f666f726569676e5f6469737061746368 2934:S7|20525453323036 2935:S7|20525453323037 2936:S7|20525453323038 2937:S17|504f4c595f5359535f5857696e646f7773 2938:S7|20525453323130 2939:S7|20525453323131 2940:S7|20525453323132 2941:S22|504f4c595f5359535f69735f6269675f656e6469616e 2942:S23|504f4c595f5359535f62797465735f7065725f776f7264 2943:S23|504f4c595f5359535f6f66667365745f61646472657373 2944:S25|504f4c595f5359535f73686966745f72696768745f776f7264 2945:S17|504f4c595f5359535f776f72645f6e6571 2946:S17|504f4c595f5359535f6e6f745f626f6f6c 2947:S7|20525453323139 2948:S7|20525453323230 2949:S7|20525453323231 2950:S7|20525453323232 2951:S22|504f4c595f5359535f737472696e675f6c656e677468 2952:S7|20525453323234 2953:S7|20525453323235 2954:S7|20525453323236 2955:S7|20525453323237 2956:S20|504f4c595f5359535f746f7563685f66696e616c 2957:S7|20525453323239 2958:S7|20525453323330 2959:S16|504f4c595f5359535f696e745f676571 2960:S16|504f4c595f5359535f696e745f6c6571 2961:S16|504f4c595f5359535f696e745f677472 2962:S16|504f4c595f5359535f696e745f6c7373 2963:S24|504f4c595f5359535f6c6f61645f627974655f696d6d7574 2964:S24|504f4c595f5359535f6c6f61645f776f72645f696d6d7574 2965:S7|20525453323337 2966:S17|504f4c595f5359535f6d756c5f776f7264 2967:S18|504f4c595f5359535f706c75735f776f7264 2968:S19|504f4c595f5359535f6d696e75735f776f7264 2969:S17|504f4c595f5359535f6469765f776f7264 2970:S16|504f4c595f5359535f6f725f776f7264 2971:S17|504f4c595f5359535f616e645f776f7264 2972:S17|504f4c595f5359535f786f725f776f7264 2973:S24|504f4c595f5359535f73686966745f6c6566745f776f7264 2974:S17|504f4c595f5359535f6d6f645f776f7264 2975:S17|504f4c595f5359535f776f72645f676571 2976:S17|504f4c595f5359535f776f72645f6c6571 2977:S17|504f4c595f5359535f776f72645f677472 2978:S17|504f4c595f5359535f776f72645f6c7373 2979:S16|504f4c595f5359535f776f72645f6571 2980:S18|504f4c595f5359535f6c6f61645f62797465 2981:S18|504f4c595f5359535f6c6f61645f776f7264 2982:S20|504f4c595f5359535f61737369676e5f62797465 2983:O2|3,@2984 2984:S9|526563757273697665 2985:S7|436c6f73757265 2986:S5|4c6f63616c 2987:S3|417267 2988:O2|3,@2989 2989:S4|57495448 2990:O2|3,@2991 2991:S7|48414e444c4528 2992:S5|282a562a29 2993:S7|696e6c696e652c 2994:S8|206c6f63616c732c 2995:S8|636c6f737572653d 2996:S14|726563757273697665207573653d 2997:O2|@833,@2998 2998:O2|@2999,0 2999:O2|3,@3000 3000:S2|2a29 3001:O2|3,@3002 3002:S2|282a 3003:O2|3,@3004 3004:S3|666e28 3005:O2|3,@3006 3006:S5|4c44455843 3007:S4|4c4f4f50 3008:O2|3,@3009 3009:S2|696e 3010:O2|3,@3011 3011:S3|6c6574 3012:O2|3,@3013 3013:S6|524149534528 3014:O2|@3015,0 3015:S2|2c20 3016:S13|534554434f4e5441494e455228 3017:O2|44,0 3018:S8|5441475445535428 3019:S5|5455504c45 3020:S8|4441544154595045 3021:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15903|64,0,@883 3022:S22|42617365436f6465547265652e707265747479283129 3023:D3,344|483b65187303ff5548a801757148837808017535488b00488b004889da909090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008488b014889da9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f0000eb05e9b900000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e812ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000005001000000000000|@3024,1048575,@15874|116,0,@1466 206,0,@1294 268,0,@833 3024:S23|42617365436f6465547265652e704c6973742833292829 3025:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15875|64,0,@883 3026:D13,2336|483b65187303ff5548a801756a48837808017568488b00488b08ff711053ff3148c7c303000000488b410848baa05f06c9a37f0000909090ff15fa0800004889c348b8b0360ac9a37f000090ff15ee080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000eb0ae988080000e9b4030000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff1592080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff154e0800009090ff154e080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b442420488b542418ff12498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8307407c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000f6c101741048b8f86f07c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b08488b1153ff7008ff7210ff3248c7c303000000488b420848baa05f06c9a37f0000909090ff15fe0400004889c348b8b0360ac9a37f000090ff15f2040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff15a2040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff155e0400009090ff155e040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b442418488b542428ff12498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8307407c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000f6c101741048b8f86f07c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f80200000048ba30d007c9a37f000048895008488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b5c2410488b44240890e84af7ffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000001809000000000000|@3024,2097151,@15876,@194,@100,@100,@3032,@3052,@194,@100,@100,@3053,@3028|45,0,@193 67,0,@3027 136,0,@1294 165,0,I48 224,0,@1294 366,0,@1294 485,0,@1294 554,0,@1317 595,0,@1302 636,0,@833 677,0,@2999 718,0,@833 791,0,@833 832,0,@1320 873,0,@3001 914,0,@833 1027,0,@1294 1105,0,@193 1127,0,@3027 1184,0,@1294 1213,0,I48 1272,0,@1294 1414,0,@1294 1533,0,@1294 1602,0,@1317 1643,0,@1302 1684,0,@833 1725,0,@2999 1766,0,@833 1839,0,@833 1880,0,@1320 1921,0,@3001 1962,0,@833 2075,0,@1294 2115,0,@1466 2196,0,@1294 2260,0,@833 3027:S9|76616c204c6f63616c 3028:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15887|64,0,@3029 3029:O2|@884,@3030 3030:O2|@3031,0 3031:O2|3,93 3032:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15877,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3033:D12,768|483b65187303ff554848833805756dff701048c7c303000000488b400848baa05f06c9a37f000090ff15ea0200004889c348b8903c0ac9a37f000090ff15de02000048c7c3b7000000909090ff15d6020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c1017417eb05e9a900000048b8f86f07c9a37f0000488b5d08ff135148bba83c0ac9a37f0000488b442408909090ff15860200009090ff1586020000498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3488338017571488b5808488b4010ff1502020000504889d948bba83c0ac9a37f00004889c890ff15f20100009090ff15f2010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f802000000eb05e9280100004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b808ba07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8601b07c9a37f00004889014883f9017506488b0424eb104889cb488b0424909090ff150a010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f00004883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c348833803740b48b8b83c0ac9a37f0000c348b8d03c0ac9a37f0000c39090909090900000000000000000f802000000000000|@3040,2097151,@15878,@194,@100,@100,@3041,@3042,@3043,@3050,@3051,@3039|31,0,@193 51,0,@3034 131,0,@1294 148,0,@3035 282,0,@1294 324,0,@3035 380,0,@835 428,0,@833 469,0,@1422 510,0,@833 551,0,@832 620,0,@835 703,0,@1294 726,0,@3036 737,0,@3037 3034:S8|5573654669656c64 3035:O1|@3033 3036:O2|3,95 3037:O2|3,@3038 3038:S6|4578706f7274 3039:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15884| 3040:S27|42617365436f6465547265652e7072657474795573616765283129 3041:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3024,1048575,@15879|108,0,@1466 198,0,@1294 260,0,@833 3042:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15880|64,0,@3029 3043:D3,160|483b65187303ff5548a801756e4883780801750b48b878400ac9a37f0000c3488b40089090e8d6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a8400ac9a37f0000eb05e904000000488908c348c7c001000000c39090909000000000000000009800000000000000|@3024,3,@15881|22,0,@3044 72,0,@833 113,0,@3046 3044:O2|@3045,0 3045:O2|3,45 3046:O5|0,0,0,0,@3047 3047:O2|@3045,@3048 3048:O2|@884,@3049 3049:O2|@1372,0 3050:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0400ac9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3024,1048575,@15882|108,0,@3048 198,0,@1294 260,0,@833 3051:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15883|64,0,@883 3052:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15885|64,0,@3029 3053:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15886,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3054:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15888|64,0,@883 3055:D10,744|483b65187303ff55484883fb01750848c7c001000000c3488b0bff730850ff31ff710848c7c30300000048baa05f06c9a37f0000ff15c60200004889c348b8f8260ac9a37f000090ff15ba020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff156a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff15260200009090ff1526020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c40848890148833c2401740948c7c001000000eb0a48b8f8480ac9a37f0000f644241001750c48ba58490ac9a37f0000eb0748c7c2010000004883fa0174124889ce4889d3909090ff150e0100004889f14883f80174124889c34889c8909090ff15fe0000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080900000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c40859f6c10174064883c1027105ff5570ebf550488b5c24084889c89090e852fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c390900000000000000000e002000000000000|@3065,2097151,@15889,@194,@100,@100,@3066,@3067,@3068,@3064|44,0,@193 63,0,@2987 120,0,@1294 149,0,I48 208,0,@1294 350,0,@1294 418,0,@833 483,0,@3056 500,0,@3060 633,0,@1294 3056:O2|@833,@3057 3057:O2|@3058,0 3058:O2|3,@3059 3059:S5|3a7265616c 3060:O2|@884,@3061 3061:O2|@834,@3062 3062:O2|@3063,0 3063:O3|1,1,0 3064:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15893| 3065:S34|42617365436f6465547265652e7072657474792831297072696e7441726773283229 3066:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15890,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3067:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15891|64,0,@3029 3068:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15892| 3069:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@15894| 3070:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3024,1048575,@15895|108,0,@1466 198,0,@1294 260,0,@833 3071:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15896|64,0,@883 3072:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15897,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3073:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15898|64,0,@3029 3074:D3,344|483b65187303ff5548a801757148837808017535488b00488b004889da909090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008488b014889da9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f0000eb05e9b900000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e812ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000005001000000000000|@3024,1048575,@15899|116,0,@1466 206,0,@1294 268,0,@833 3075:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15900|64,0,@883 3076:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30550ac9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3024,1048575,@15901|108,0,@3077 198,0,@1294 260,0,@833 3077:O2|@884,@3078 3078:O2|@3079,0 3079:O2|3,59 3080:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3024,1048575,@15902|108,0,@1466 198,0,@1294 260,0,@833 3081:D16,2288|483b65187303ff554848833801756fff702052ff7018ff700848c7c303000000488b401048baa05f06c9a37f00009090ff15d20800004889c348b8b0360ac9a37f000090ff15c6080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741748b8f86f07c9a37f0000eb05e9c7030000488b5d08ff134989ca48c7c3b700000048b8509adc0000000000909090ff1572080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff152e0800009090ff152e080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff135048c7c303000000488b44241848baa05f06c9a37f0000ff15a60700004889c348b870600ac9a37f000090ff159a070000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b44242051488b5008488b442430ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b890600ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8307407c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4204889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c348833805750a488b4008488b5208ff2248833807756d488b5a08488b4008ff15d2040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c0600ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c7400801000000eb05e92000000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7018ff700848c7c303000000488b401048baa05f06c9a37f00009090ff15320400004889c348b8b0360ac9a37f000090ff1526040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff15d6030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff15920300009090ff1592030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c241850488b442418488b5108ff12498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8307407c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4184889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390900000000000000000e808000000000000|@3088,2097151,@15904,@194,@100,@100,@3089,@3090,@194,@100,@3091,@194,@100,@100,@3100,@3087|38,0,@193 59,0,@3027 116,0,@1294 149,0,I48 208,0,@1294 350,0,@1294 380,0,@193 399,0,@3082 456,0,@1294 543,0,@833 584,0,@3083 625,0,@833 698,0,@833 739,0,@2999 780,0,@833 853,0,@833 894,0,@1320 935,0,@3001 976,0,@833 1082,0,@1294 1164,0,@3085 1250,0,@1294 1286,0,@193 1307,0,@3027 1364,0,@1294 1393,0,I48 1452,0,@1294 1594,0,@1294 1717,0,@1294 1786,0,@1317 1827,0,@1302 1868,0,@833 1909,0,@2999 1950,0,@833 2023,0,@833 2064,0,@1320 2105,0,@3001 2146,0,@833 2252,0,@1294 3082:S12|3d20436f6e7461696e657220 3083:O2|3,@3084 3084:S4|77697468 3085:O2|3,@3086 3086:S8|76616c2072656320 3087:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15913|64,0,@3029 3088:S29|42617365436f6465547265652e70726574747942696e64696e67283129 3089:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15905,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3090:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15906|64,0,@3029 3091:D13,2248|483b65187303ff5548a801756948837808017567488b08ff711053ff3148c7c303000000488b410848baa05f06c9a37f00009090ff15a60800004889c348b8e0260ac9a37f000090ff159a080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101eb0ae931080000e989030000741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff153e080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff15fa0700009090ff15fa070000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f802000000488b5424184889500848c7000f00000051488b5424189090ff12498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008ff7110ff3148c7c303000000488b410848baa05f06c9a37f00009090ff15d60400004889c348b8e0260ac9a37f000090ff15ca040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134989ca48c7c3b700000048b8509adc0000000000909090ff157a040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b442410909090ff15360400009090ff1536040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f802000000488b5424104889500848c7000f00000051488b5424289090ff12498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b950280ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048baf06c0ac9a37f000048895008488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b5c2410488b44240890e8a2f7ffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090900000000000000000c008000000000000|@3024,2097151,@15907,@194,@100,@100,@3097,@3098,@194,@100,@100,@3099,@3096|42,0,@193 63,0,@2986 132,0,@1294 161,0,I48 220,0,@1294 362,0,@1294 521,0,@1294 590,0,@1317 631,0,@1302 672,0,@833 713,0,@2999 754,0,@833 827,0,@3001 868,0,@833 981,0,@1294 1058,0,@193 1079,0,@2986 1136,0,@1294 1165,0,I48 1224,0,@1294 1366,0,@1294 1525,0,@1294 1594,0,@1317 1635,0,@1302 1676,0,@833 1717,0,@2999 1758,0,@833 1831,0,@3001 1872,0,@833 1985,0,@1294 2027,0,@3092 2108,0,@1294 2172,0,@833 3092:O2|@884,@3093 3093:O2|@3094,0 3094:O2|3,@3095 3095:S5|20616e6420 3096:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15911|64,0,@3029 3097:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15908,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3098:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15909|64,0,@3029 3099:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15910,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3100:D5,328|483b65187303ff5548a801756d48837808017531488b0090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff7008488b0090ff1516010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b1000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b4424089090e81effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c300000000000000004001000000000000|@3024,2097151,@15912,@3033,@3033|108,0,@1466 198,0,@1294 256,0,@833 3101:D3,104|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c244889c2498d47e0483b45107303ff55404989c748c740f803000000488b49084883c408488948104889500848c70005000000c39090909090909000000000000000006000000000000000|@3102,1048575,@15914| 3102:S24|434f44455452454528292e67656e436f6465283329283129 3103:O1|@3104 3104:D3,160|488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b870740ac9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833803750b48b850750ac9a37f0000c3f6c10174084883f9037c13eb06f641ff10750b48b8d0750ac9a37f0000c348b8707907c9a37f0000c3909090909000000000000000009800000000000000|@3120,3,@15915|25,0,@1326 42,0,@3105 72,0,@1326 89,0,@3112 119,0,@3116 130,0,@1326 3105:O5|0,0,0,@3107,@3106 3106:O2|@3110,0 3107:O2|@3108,0 3108:O2|0,@3109 3109:O5|@559,197,197,0,0 3110:O2|3,@3111 3111:S9|556e56697369746564 3112:O5|0,0,0,@3107,@3113 3113:O2|@3114,0 3114:O2|3,@3115 3115:S14|5669736974656447656e6572616c 3116:O5|0,0,0,@3107,@3117 3117:O2|@3118,0 3118:O2|3,@3119 3119:S14|566973697465645370656369616c 3120:S11|7072696e742d7669736974 3121:O2|@3123,@3122 3122:O2|@3125,@3121 3123:D5,264|483b65187303ff5548488338017567488b480848c7c601000000488b791840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda5352488b58104889f0909090ff15ca000000a8017530488b0c24488b10ff70084c8b442410488b5a08488b02488b5108eb05e91b00000090ff1258483b65187303ff5548ebcc48c7c0010000004883c410c348833805754e5352488b5810488b48084889c8909090ff1576000000a8017528488b0c24488b10ff70084c8b442410488b5a08488b02488b5108ff1258483b65187303ff5548ebd448c7c0010000004883c410c348c7c001000000c390909090909000000000000000000001000000000000|@3124,1048575,@15916,@1354,@1354| 3124:S32|434f44455452454528292e67656e436f646528332966696e6444656373283129 3125:D3,520|483b65187303ff554848833801750848c7c001000000c3488b480848833905741048b8407a0ac9a37f0000488b5d08ff13488b710840f6c60174084883fe017d08eb21f646ff10751b498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff1340f6c60174064883c6027105ff5570ebf5498b74b0fc4883fe03757048833b03750848c7c001000000c3488b710840f6c60174084883fe017d08eb21f646ff10751b498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1348b810f407c9a37f0000488b5d08909090ff1340f6c60174064883c6027105ff5570ebf549c744b0fc05000000eb05e90f0000004889de4c89c34889f0488b5208ff224883fe05750848c7c001000000c348833b037561488b5108f6c20174084883fa017d08eb1ff642ff107519498b18f6c201740af6c3017405483bd3eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13f6c20174064883c2027105ff5570ebf549c74490fc0300000048c7c001000000c3488b710840f6c60174084883fe017d08eb21f646ff10751b498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf549c744b0fc050000004889de4c89c34889f0488b5208ff22909000000000000000000002000000000000|@3129,1048575,@15917|35,0,@3126 102,0,@1493 212,0,@1517 347,0,@1517 447,0,@1517 3126:O4|@20055,@557,@3128,@3127 3127:O5|@559,242,0,242,0 3128:S36|646f47656e6572616c3a206e6f74204c6f61644c6f63616c206f7220436f6e7374616e74 3129:S41|434f44455452454528292e67656e436f646528332970726f6365737347656e416e6453706563283229 3130:D6,696|483b65187303ff55485248c7c001000000488b4a204889caff12a80174134889c148b8087e0ac9a37f0000488b5d08ff13a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b08488b1424488b5a18f6c301753e488b33488b3e483b3d6a020000751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498930eb194c8b43084c89c3483b65187303ff5548ebbd49c7c0010000004983f801750948c7c301000000eb43498b18488b33483b351e02000074154889c748b878e107c9a37f0000488b5d089090ff13488b7310498d5ff0483b5d107303ff55404989df48c743f801000000488933f6c3017533498d77e8483b75107303ff55404989f748c746f80200000048bfc8e906c9a37f000048893e488b1b48895e08488066ffbfeb0a48bed8da06c9a37f000051565048c7c0010000004889f290ff12488b4c2418488b511048833a01756d498d5fd0483b5d107303ff55404989df48c743f80500000048bee8da06c9a37f0000488933488b721048897308488b790848897b104c8b04244c8943184c8b4424084c894320488063ffbf4d8d47e04c3b45107303ff55404d89c749c740f80300000049895810488b5a08eb05e90d0000004989580849c70001000000eb6b48833a05756a498d5fd0483b5d107303ff55404989df48c743f80500000048beb0e606c9a37f0000488933488b721048897308488b790848897b104c8b04244c8943184c8b4424084c894320488063ffbf4d8d47e04c3b45107303ff55404d89c749c740f803000000eb0ae924000000e91500000049895810488b5a084989580849c70005000000eb0a49b830e306c9a37f00004c89c34883c41090ff156e0000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4084889480848c70005000000c39090909090900000000000000000b002000000000000|@3102,1048575,@15918,@20053,@20053,@3134|35,0,@3131 58,0,@1294 193,0,@1486 271,0,@609 298,0,@548 363,0,@549 496,0,@590 604,0,@573 3131:O4|@20055,@557,@3133,@3132 3132:O5|@559,282,0,282,0 3133:S31|526573756c7420766563746f72206973206e6f7420616e2061646472657373 3134:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@15919,@20054|75,0,@20054 3135:D9,544|483b65187303ff5548f6c30174084883fb017d08eb1cf643ff107516f6c301740b483b1df00100007c1beb06f643ff1075134889c148b820f007c9a37f0000488b5d08ff134889d9f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891f498d47e8483b45107303ff55404989c748c740f80200000048b918820ac9a37f000048890848897808488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048be68840ac9a37f000048893148897908488061ffbf498d77c8483b75107303ff55404989f748c746f80600000049bb78850ac9a37f00004c891e4c8946084889461048894e184c895620488b44240848894628488066ffbf4151575241524150534889f34889d09090ff15ee0000006a016a014c8b4c241049b8b86315c9a37f000048bbb86315c9a37f000090ff15d2000000ff742420ff7424504c8b5424284c8b4c242049b8b86315c9a37f000048bbb86315c9a37f0000ff15ae000000ff7424484c8b5424284c8d4c24084c8b442420488b5c24189090ff1596000000488b5c2430488b442428ff158e000000488b5c240848ba186415c9a37f0000909090ff157e000000488b4c24385a4883c4304889114889410848c7c0010000004883c408c208009090909090909000000000000000001002000000000000fdffffffffffff01|@7292,2097151,@17666,@3169,@3306,@3330,@3220,@7290,@6759|55,0,@1509 174,0,@3136 220,0,@3142 266,0,@3144 341,0,@6756 351,0,@6756 386,0,@6756 396,0,@6756 465,0,@6758 3136:D3,232|4883380574134889c148b828830ac9a37f0000488b5d08ff13488b4808f6c10174084883f9017d08eb23f641ff10751d488b5a08488b1bf6c101740af6c3017405483bcbeb05ff5570ebf67c144889c348b838e407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf5488b5208488b4c8afcf6c1017532488b01488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70001000000c34889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c30000000000000000e000000000000000|@3141,15,@15920|11,0,@3137 82,0,@1493 3137:O4|@20055,@557,@3139,@3138 3138:O5|@3140,246,0,246,0 3139:S33|6c6f6f6b7570436f6e7374616e743a20746f702d6c6576656c2072656163686564 3140:S68|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e532e736d6c 3141:S66|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296c6f6f6b757041646472283129 3142:D3,152|498d4ff0483b4d107303ff55404989cf48c741f801000000488b5808488919488b3040f6c60174084883fe017d08eb25f646ff10751f488b7a08488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5488b520848894cb2fc48c7c001000000c39000000000000000009000000000000000|@3143,63,@15921|87,0,@1517 3143:S64|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329636f6e746578742d283129 3144:D4,64|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0856ff25290000009000000000000000003800000000000000|@3148,2097151,@15928,@3145| 3145:D12,1680|483b65187303ff55484883381d756348837810017461498d4fc8483b4d107303ff55404989cf48c741f80600000048bae88c0ac9a37f0000488911488959084c8941104c8949184c895120488b54240848895128488061ffbf4889cb488b4008ff1542060000498d4fe0483b4d10730feb0ae95d010000e969000000ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff15d2050000eb684889c8eb68498d4fc8483b4d107303ff55404989cf48c741f80600000048bab08d0ac9a37f0000488911488959084c8941104c8949184c895120488b54240848895128488061ffbf4889cb488b400890ff1582050000498d4fe0483b4d107303ff55404989cfeb0ae966000000e96100000048c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff1512050000eb034889c84889c1498d47f0483b45107303ff55404989c748c740f801000000488908c2080048833815757141524151415053ff7010488b4008ff15da040000ff742410ff7424204c8b5424184c8b4c24404c8b44243048bb588d0ac9a37f000090ff15ba040000498d4fc8483b4d107303ff55404989cf48c741f80600000048ba208e0ac9a37f0000488911488b54240848895108488b542410eb05e9af00000048895110488b54241848895118488b54242048895120488b54243048895128488061ffbf504889cb488b442408909090ff155204000048833c240175254889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c430c20800498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b04244889410848c70115000000498d47f0483b45107303ff55404989c748c740f8010000004889084883c430c208004883380f756e488b4808488b5130f6c20174084883fa017d08eb1cf642ff107516f6c201740b483b155c0300007c1beb06f642ff10751348b820f007c9a37f0000488b5d08909090ff13f6c20174064883c2027105ff5570ebf5488b4130488b7138488b79284c8b49204c8b59104c8b6108eb05e9500200004c8b294c8b71184889d14889c248c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488917498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fd0483b4d107303ff55404989cf48c741f805000000415249ba908e0ac9a37f00004c8911488941084c8941104c89711848897920488061ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049bad0900ac9a37f00004d891049897808498060ffbf498d7fc8483b7d107303ff55404989ff48c747f80600000049bae0910ac9a37f00004c891748895f0848894f104c894718488b0c2448894f204c8b4424184c894728488067ffbf535256415141534154504889fb4c89e890ff153602000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d1498d57a0483b55107303ff55404989d748c742f808000000488b5c241848895a38488b5c242048895a30488b74243848897228488b7424104889722048894a18488b742408488972105e4883c41848897208488902488d424848c740f8020000004889500848c7000f0000004883f901753a4c8b5424284c8b4c24104c8b442408ff156a0100004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c420c208004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c420c2080048833809756d488b40084c89c2909090ff12488338017541498d4fd0483b4d107303ff55404989cf48c741f803000000488b501048895110488b58084889590848c70105000000488d412048c740f801000000488908c20800498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e92d000000488b40084889410848c70109000000498d47f0483b45107303ff55404989c748c740f801000000488908c2080048c7c001000000c208009000000000000000008006000000000000fdffffffffffff01|@3167,2097151,@15930,@3168,@2211,@3190,@2211,@3191,@3206,@3169,@3169,@3156|48,0,@3146 255,0,@3149 519,0,@3147 560,0,@3150 824,0,@1509 1022,0,@3151 1080,0,@3153 1126,0,@3155 3146:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba588d0ac9a37f000056ff2290909000000000000000004000000000000000|@3148,1048575,@15922|42,0,@3147 3147:O1|@3145 3148:S50|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283129283129 3149:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba588d0ac9a37f000056ff2290909000000000000000004000000000000000|@3148,1048575,@15923|42,0,@3147 3150:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba588d0ac9a37f000056ff2290909000000000000000004000000000000000|@3148,1048575,@15924|42,0,@3147 3151:D4,448|483b65187303ff5548488338037562488b4a18488b4008f6c10174154889c348b8c0e406c9a37f0000488b5d089090ff134883f8017505488b01eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbd52488b4a104889ca9090ff1248833801750a4883c408c3e93f000000488b0c24488b5908488b40089090ff154e0100004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700030000004883c408c348833805756a488b4808f6c10174084883f9017d08eb23f641ff10751d488b5a20488b1bf6c101740af6c3017405483bcbeb05ff5570ebf67c164889c348b838e407c9a37f0000488b5d08909090ff13f6c10174064883c1027105ff5570ebf5488b5220488b4c8afcf6c1017539eb05e959000000488b01488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70001000000c34889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c34889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39090909090900000000000000000b801000000000000|@3152,1048575,@15925,@2226|33,0,@578 244,0,@1493 3152:S61|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e732834296c6f6f6b75704c6f63616c283129 3153:D3,152|498d4ff0483b4d107303ff55404989cf48c741f801000000488b5808488919488b3040f6c60174084883fe017d08eb25f646ff10751f488b7a08488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5488b520848894cb2fc48c7c001000000c39000000000000000009000000000000000|@3154,63,@15926|87,0,@1517 3154:S58|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429636f6e746578742d283129 3155:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba588d0ac9a37f000056ff2290909000000000000000004000000000000000|@3148,1048575,@15927|42,0,@3147 3156:D14,864|483b65187303ff55484c89c1f6c101753e488b11488b32483b355a030000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01756948b998c809c9a37f0000f6c101753e488b11488b32483b3508030000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751b4889c148b8c0cf09c9a37f0000eb05e934000000488b5d0890ff13488b0f488b11483b15aa02000074154889c648b878e107c9a37f0000488b5d089090ff134883791001745eeb2a488b0f488b11483b158502000074144889c648b878e107c9a37f0000488b5d0890ff13488379100174704c89c640f6c60175464c8b1e4d8b234c3b255a02000075254d8d6ff04c3b6d107303ff55404d89ef49c745f801000000eb05e9990000004d895d00eb194c8b6e084c89ee483b65187303ff5548ebb449c7c5010000004983fd01752b415241514150535048bae0d009c9a37f0000eb05e95b000000909090ff15fa01000048c7c001000000eb5b498b75004c8b1e4c3b1deb01000074164989c448b878e107c9a37f0000488b5d08909090ff134152415141505350ff761048bae0d009c9a37f00009090ff15be0100005a90ff12eb124889c648c7c00100000041524151415053566a016a014c8b4c241849b830960ac9a37f000048bb30960ac9a37f0000488b442410ff1586010000ff742428ff7424384c8b5424304c8b4c242849b830960ac9a37f000048bb30960ac9a37f0000ff1562010000ff7424304c8b5424304c8d4c24084c8b442428488b5c24209090ff154a010000ff750848b82e950ac9a37f0000504889650848c7c001000000488b542410ff124889c1498d47e0483b45107303ff55404989c748c740f803000000488b542418488950104889480848c700050000004883c4085948894d084883c438c3909090488b65084883c4085b48895d084883380375144889c148b8a0970ac9a37f0000488b5d0890ff13498d4fc8483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f8020000004889480848c700170000004883c438c39090909000000000000000005803000000000000|@3305,2097151,@15978,@20130,@20130,@20130,@20130,@20141,@2699,@20141,@2699,@3306,@3330,@3220|94,0,@2635 187,0,@2690 229,0,@1486 274,0,@1486 398,0,@2697 452,0,@1486 482,0,@2697 533,0,@3157 543,0,@3157 582,0,@3157 592,0,@3157 643,0,$3156+734 758,0,@3164 3157:O1|@3158 3158:D3,40|48b890960ac9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@3163,1,@15929|2,0,@3159 3159:O4|@20055,@557,@3161,@3160 3160:O5|@3162,473,0,473,0 3161:S17|546f70206c6576656c2072656163686564 3162:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4c414d4244415f4c4946542e736d6c 3163:S49|434f4445545245455f4c414d4244415f4c49465428292e636f646547656e6572617465283329746f706c6576656c283129 3164:O4|1,@3166,0,@3165 3165:O5|@3140,83,0,83,0 3166:S9|496e74657272757074 3167:S47|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e73283429 3168:D4,112|483b65187303ff5548a801754553ff7008488b00ff156e00000050488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@15931,@3169| 3169:D4,80|483b65187303ff554853504889da9090ff124883f801751a4c8b44240848bb78990ac9a37f0000584883c408ff2536000000488b004883c410c390909090909000000000000000004800000000000000|@3173,1048575,@15932,@3171|31,0,@3170 3170:O1|@3169 3171:D9,1296|483b65187303ff5548488b0848baa6990ac9a37f0000488d548afcffe290e9c7000000909090e91b010000909090e988010000909090e981010000909090e9e4010000909090e9dd010000909090e92f020000909090e978020000909090e931030000909090e934030000909090e923000000909090e956030000909090e986030000909090e9e4030000909090e92c0400009090904150ff701053488b4008ff158204000050488b5c2418488b442410488b5424089090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c70015000000c3415053ff70104c89c3488b4008488b542408ff12504c8b442418488b5c2410488b4424089090ff151a0400004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c70001000000c3415053ff7018ff70104c89c3488b4008488b54241090ff1250488b5c2420488b442408488b5424189090ff1250488b5c2428488b442418488b5424209090ff124889c1498d47d8483b45107303ff55404989c748c740f804000000488948185948894810594883c4204889480848c70003000000c3c3415053ff7018ff70084c89c3488b4010488b542410909090ff12504c8b442420488b5c2418488b4424089090ff154a0300004889c1498d47d8483b45107303ff55404989c748c740f804000000488b542410488950185a4883c420488950104889480848c70007000000c3c3415053ff70104c89c3488b4008488b5424089090ff1250488b5c2418488b442408488b5424109090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c7000b000000c3ff7018ff70104889d94c89c3488b40084889ca909090ff124889c1498d47d8483b45107303ff55404989c748c740f804000000488b542408488950185a4883c408488950104889480848c7000d000000c3488b4808415053ff7138ff7130ff7128ff7120ff7110ff7108ff71184c89c3488b01488b5424389090ff12504c8b442448488b5c2440488b4424089090ff152a020000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243848895138488b54243048895130488b54242848895128488b5424204889512048894118488b44241848894110488b44241048894108584883c448488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c348b8f09e0ac9a37f0000c3488b400890ff159e0100004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70013000000c34889d94c89c3488b40084889ca9090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70017000000c3415053ff7010ff70084c89c3488b4018488b5424109090ff1250488b5c2420488b442408488b5424189090ff124889c1498d47d8483b45107303ff55404989c748c740f8040000005a4883c408488950185a4883c410488950104889480848c70019000000c3ff7018ff70084889d94c89c3488b40104889ca9090ff124889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4084889480848c7001b000000c3ff7010488b40089090ff15820000004889c1498d47e0483b45107303ff55404989c748c740f8030000005a488950104889480848c7001d000000c390909090909000000000000000000805000000000000|@3175,1048575,@15933,@3176,@3184,@3185,@3186,@3189,@3174|14,0,$3171+30 918,0,@3172 3172:O1|8 3173:S27|42617365436f6465547265652e6d6170436f646574726565283229 3174:D3,128|483b65187303ff5548a8017555415053ff70084c89c3488b00488b5424089090ff12504c8b442418488b5c2410488b442408909090e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,1048575,@15941| 3175:S34|42617365436f6465547265652e6d6170436f6465747265652832296d617074283129 3176:D4,120|483b65187303ff5548a8017551415053ff7008488b009090ff1572000000504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909000000000000000007000000000000000|@1363,1048575,@15934,@3177| 3177:D4,320|483b65187303ff554848833801755dff7018ff7010ff70084889d94c89c3488b40204889ca909090ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048894820488b4c241048894818488b4c240848894810594883c4104889480848c70001000000c34883380575374889d94c89c3488b40084889ca90ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c3488338077532488b400890ff159e0000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c3ff7010ff70084889d94c89c3488b40184889caff124889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c240848894810594883c4084889480848c70003000000c39000000000000000003801000000000000|@3183,1048575,@15935,@3178| 3178:D3,256|483b65187303ff5548a801756c488b08498d57e8483b55107303ff55404989d748c742f802000000488b71104889720848c7020f000000415053ff7008ff7108ff314c89c34889d0488b542418909090ff124883380f74154889c148b850a30ac9a37f0000488b5d089090ff13498d4fe0483b4d10730aeb05e964000000ff55404989cf48c741f803000000488b400848894110488b44240848894108584883c408488901514c8b442418488b5c2410488b442408e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c39090909090900000000000000000f800000000000000|@1363,1048575,@15936|93,0,@3179 3179:O4|@20055,@557,@3181,@3180 3180:O5|@3182,500,0,500,0 3181:S8|64654c616d626461 3182:S45|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f42617365436f6465547265652e736d6c 3183:S47|42617365436f6465547265652e6d6170436f6465747265652832296d6170742831296d617062696e64696e67283129 3184:D3,224|483b65187303ff5548a801756d488b08488b11415053ff7008ff7108ff7208ff324c89c3488b4210488b542420909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b44240848894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000005aeb05e94700000048895008488908504c8b442418488b5c2410488b442408909090e862ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390900000000000000000d800000000000000|@1363,1048575,@15937| 3185:D3,168|483b65187303ff5548a801756e488b08415053ff7008ff71084c89c3488b01488b542410ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901514c8b442418488b5c2410488b442408909090e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90d00000048894808594883c418488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,1048575,@15938| 3186:D3,200|483b65187303ff5548a801756f498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70109000000415053ff70084c89c34889c8488b542408ff124883380974154889c148b808a70ac9a37f0000488b5d089090ff13ff70084c8b442418488b5c2410488b4424089090e886ffffffeb05e9280000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909090909090900000000000000000c000000000000000|@1363,1048575,@15939|81,0,@3187 3187:O4|@20055,@557,@2262,@3188 3188:O5|@3182,499,0,499,0 3189:D3,168|483b65187303ff5548a801756e488b08415053ff7008ff71084c89c3488b01488b542410ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901514c8b442418488b5c2410488b442408909090e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90d00000048894808594883c418488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,1048575,@15940| 3190:D4,112|483b65187303ff5548a801754553ff7008488b00ff156e00000050488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@15942,@3169| 3191:D5,88|483b65187303ff5548a8017530ff30488b40089090e8e6ffffff50488b442408ff154a00000048833c240175054883c410c35b4883c408ff253b00000048c7c001000000c390909000000000000000005000000000000000|@1696,1048575,@15943,@3193,@3192| 3192:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15948| 3193:D4,808|483b65187303ff5548488338077561f64008017414488b480848b8e81f08c9a37f0000488b5d08ff13488b4808488b11498d5fe8483b5d107303ff55404989df48c743f802000000488b7208488973084889336a016a01f6c1017574488b11488b720840f6c6017413f60301740eeb05e970020000483b337d07eb08ff5570ebf4488b33488b7a0840f6c70174064883c7027105ff5570ebf540f6c701740ef64308017408483b7b087e07eb09ff5570ebf3488b7b08498d5fe8483b5d107303ff55404989df48c743f802000000eb05e91c00000048897b08488933488b51084889d1483b65187303ff5548e966ffffff4889e1488b134889114889e1488b730848897108488b4c2408f6c101740cf60424017406482b0c247105ff5570ebf54883c101f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0ddd0100007c1ceb06f641ff107514488b780848b820f007c9a37f0000488b5d08ff134889cf40f6c70174064883c7027105ff5570ebf54989c84889f9488b780848c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89074c89c848b938ad0ac9a37f0000574151a8017569488b10488b5a08f6c301740ef6442410017407482b5c24107105ff5570ebf44883c301f6c30174084883fb017d08eb25f643ff10751f488b742408488b36f6c301740b40f6c6017405483bdeeb05ff5570ebf67c1d488b700848b838e407c9a37f0000488b5d08eb05e95d0000009090ff13f6c30174064883c3027105ff5570ebf5488b742408488b5c9efc4883fb01751fff70084c8b5424084989f14c8b4424184889cb4889d090ff15c2000000eb08488b50084889c8524889c158483b65187303ff5548e931ffffff488b411048c7c1010000004883c420a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8c34889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c39090909000000000000000001803000000000000fdffffffffffff01|@3200,1048575,@15944,@3195|27,0,@1625 339,0,@1509 448,0,@3194 554,0,@1493 3194:O3|0,0,0 3195:D4,920|483b65187303ff5548488b4810498d57e8483b55107303ff55404989d748c742f802000000488b730848897208488902488b780840f6c701740b41f6c0017405492bf87105ff5570ebf64883c7014d8d5fd84c3b5d107303ff55404d89df49c743f8020000004c8b234d8963084d89234d8d6b1849c745f8010000004d895d0040f6c70174084883ff017d08eb21f647ff10751b4d8b1940f6c701740b41f6c3017405493bfbeb05ff5570ebf67c164c8b580848b810f407c9a37f0000488b5d089090ff134989fb41f6c30174064983c3027105ff5570ebf54f896c99fc41f6c40174064983c4027105ff5570ebf54d8d5fe04c3b5d107303ff55404d89df49c743f8030000004c8b6b104d896b10498953084d89236a016a016a01488b5118ff7008ff3341515741504152f6c201753cff7208ff74243048b820b10ac9a37f0000504c8b5424304c8b4c24204c8b4424184c89db488b02ff15520200004989c35a483b65187303ff5548ebbf488d442430498b0b488908488d442430498b530848895008488d442430498b5b1048895810488b442410a80174084883f8017d08eb24f640ff10751e488b742418488b36a801740b40f6c6017405483bc6eb05ff5570ebf67c1248b838e407c9a37f0000488b5d089090ff13a80174064883c0027105ff5570ebf5488b742418488b4486fc4883f80175154889c648b8386208c9a37f0000488b5d089090ff13488b00488b4008a801750af6442420017503ff5570483b442420756a6a016a01488b44244848c7c601000000a80174144889c748b830b10ac9a37f0000488b5d0890ff13488b384c8b470841f6c001750af6442438017503ff55704c3b44243875394d8d4fe84c3b4d107303ff55404d89cf49c741f802000000498971084989394889e6eb05e9b90000004c8b50084c89164889e64c894e08eb374d8d4fe84c3b4d107303ff55404d89cf49c741f802000000498971084989394c89ce4c8b48084c89c8483b65187303ff5548e95affffff498d77e8483b75107303ff55404989f748c746f8020000004c8b4c24084c894e0848c706070000004d8d4fc84c3b4d107303ff55404d89cf49c741f8020000004c8b6424504d896108498931498d411848c740f8030000004c8948105e4883c40848897008488b7424304889304883c448c3498d47e0483b45107303ff55404989c748c740f803000000488b74244048897010488b74243848897008488b7424304889304883c448c300000000000000009003000000000000|@3202,1048575,@15945,@3201|181,0,@1517 314,0,@3196 457,0,@1493 509,0,@1662 578,0,@3197 3196:O1|@3195 3197:O4|@20055,@557,@3199,@3198 3198:O5|@2182,430,0,430,0 3199:S11|737461636b20656d707479 3200:S48|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e6773283129 3201:D5,808|483b65187303ff55484883380575604c89c1f6c1017537488b11488b700840f6c6017509f64208017503ff5570483b7208750948c7c703000000eb19488b51084889d1483b65187303ff5548ebc448c7c7010000004883ff01746e488b4808f6c101741241f6c101740c492bc9eb05e99a0200007105ff5570ebef4883c101f6c10174084883f9017d08eb1ff641ff107519498b12f6c101740af6c2017405483bcaeb05ff5570ebf67c16488b500848b838e407c9a37f0000488b5d089090ff134889caf6c201eb05e93a02000074064883c2027105ff5570ebf5498b5492fcf6c201755a488b5308f6c2017537488b32488b780840f6c7017509f64608017503ff5570483b7e08750949c7c003000000eb19488b72084889f2483b65187303ff5548ebc449c7c0010000004983f801746af6c101740d4883f9017d0deb23e98d000000f641ff107518498b02f6c1017409a8017405483bc8eb05ff5570ebf67c1348b838e407c9a37f0000488b5d08909090ff13f6c10174064883c1027105ff5570ebf5498b4c8afc4883f901751948b8386208c9a37f0000eb05e927000000488b5d089090ff13488b094989db4c89c84d89d14989c0488b19488b442410ff157a010000eb034989db4c89d8c210004c89c2f6c201754b488b32488b7e0840f6c7017509f64008017503ff5570483b7808751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb194c8b5a084c89da483b65187303ff5548ebb049c7c3010000004983fb01751048b8386208c9a37f0000488b5d08ff1341524151514d89c24c8b4c24104c8b442408498b03488b54242090ff12488b0c24f6c10174084883f9017d08eb24f641ff10751e488b542410488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c164889c248b838e407c9a37f0000488b5d08909090ff13f6c10174064883c1027105ff5570ebf5488b5424104883c408488b4c8afc4883f90175144889c348b8386208c9a37f0000488b5d0890ff13488b094989c24989d141584883c408488b5908488b442410909090ff15460000004c89d0c210004889d8c210004889d8c210009090909000000000000000002003000000000000|@3204,1048575,@15946,@3203,@3203|177,0,@1493 356,0,@1493 402,0,@1662 563,0,@1662 664,0,@1493 722,0,@1662 3202:S66|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e74283229 3203:D3,328|a801740b41f6c0017405492bc07105ff5570ebf64883c001a80174084883f8017d08eb1ef640ff107518498b09a801740af6c1017405483bc1eb05ff5570ebf67c134889c148b838e407c9a37f0000488b5d08ff134889c1f6c10174064883c1027105ff5570ebf5498b4c89fc4883f90175164889c248b8386208c9a37f0000488b5d08909090ff13488b11f6c301740ef64208017408483b5a087e0beb05ff5570ebf3488b5a08498d77d8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e488d7e1848c747f801000000488937a80174084883f8017d08eb1ff640ff107519498b31a801740b40f6c6017405483bc6eb05ff5570ebf67c154889c648b810f407c9a37f0000488b5d089090ff13a80174064883c0027105ff5570ebf549897c81fc48c7c001000000c390909000000000000000004001000000000000|@3205,255,@15947|71,0,@1493 120,0,@1662 265,0,@1517 3204:S80|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297374726f6e67636f6d706f6e656e7428322970726f636573734c696e6b283229 3205:S60|434f4445545245455f46554e4354494f4e5328292e706172746974696f6e4d757461626c6542696e64696e67732831297570646174654d696e283229 3206:D11,2024|483b65187303ff55484883f801750a48c7c001000000c21000488b0848833901756e498d57c0483b55107303ff55404989d748c742f80700000048be10c00ac9a37f000048893248895a084c895210488b74241048897218488b7c240848897a204c8942284c894a30488062ffbf41524151415053ff7008ff7118ff7110ff71084889d3488b4120ff1572070000eb05e98f000000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44241048894118488b44240848894110584883c4104889410848c7010100000051ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b442418e806ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c21000488339077568f64108017567488b510848837a08017561488b32498d7fa8483b7d107303ff55404989ff48c747f8020000004c8b5e104c895f0848c7070f0000004c8d671849c74424f80400000049897c2418488b7e0849897c24104c8b2e4d896c240849c7042403000000eb0fe9e1030000e936000000e9310000004c8b7008498d44242848c740f8020000004c8970084c89204c8b6424104c8b7424084c896424104c89742408e92efeffff41524151415053ff7008ff742438ff742438488b4108ff151a0600004889c1f6c1017558488b11488b5a10488b731840f6c6017564488b3e48833f0575604989c041f6c001753f4d8b084c8b570841f6c201750a41f64108017503ff55704d3b5108750949c7c303000000eb204d8b48084d89c8483b6518730aeb05e967000000ff5548ebbb49c7c3010000004983fb017421488b7e08eb0ae91f000000e9110000004889fe483b65187303ff5548e97bffffff48c7c601000000eb0748c7c6030000004883fe017415488b71084889f1483b65187303ff5548e940ffffff48c7c101000000eb0748c7c1030000004883f901746e4889c74889f8909090ff153a050000498d4fb0483b4d107303ff55404989cf48c741f8020000004889790848c70107000000488d511848c742f80200000048c742080100000048890a488d4a1848c741f80300000048c74110010000004889410848c7011d000000a801752beb05e9c7010000488b1848833b057512488b58084889d8483b65187303ff5548ebda48c7c001000000eb0748c7c0030000004883f801740d57524889c8ff15a2040000eb054889c85752498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70115000000488b042448c7c201000000a8017531488b18f6c201740ef64308017408483b53087d0beb05ff5570ebf3488b5308488b58084889d8483b65187303ff5548ebcb4889d0a80174064883c0027105ff5570ebf54c8b5424204c8b4c24184c8b4424284889c34889c8ff150e0400005948c7c20100000050f6c1017572488b01ff710852ff700849c7c0010000004889d3488b442418909090ff15e60300004883380574154889c148b880c00ac9a37f0000488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f802000000488b501048895108488b5808488919488d411848c740f802000000eb05e9310000004889480859488908488b542448ff1258a80174064883c0027105ff5570ebf54889c259483b65187303ff5548e953ffffff4889d0488b4424404883c408488b4c2430488944243848894c24304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e9fffaffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010700000051ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b442418909090e8b2faffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c428c21000488339057570498d57c0483b55107303ff55404989d748c742f80700000048bef8c00ac9a37f000048893248895a084c895210488b74241048897218488b7c240848897a204c8942284c894a30488062ffbf41524151415053ff70084889d3488b410890ff154e020000498d4fe8483b4d10730aeb05e96d000000ff55404989cf48c741f8020000004889410848c7010500000051ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b442418909090e8caf9ffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c21000498d57c0483b55107303ff55404989d748c742f80700000048be68c10ac9a37f000048893248895a084c895210488b74241048897218488b7c240848897a204c8942284c894a30488062ffbf41524151415053ff7008ff7110ff71084889d3488b411890ff156e010000488338057570498d4fd0483b4d107303ff55404989cf48c741f802000000488b501048895108488b5808488919488d411848c740f80200000048894808488b4c2408488908488b542440ff12488b442448488b4c2440488944244848894c24404c8b5424304c8b4c24284c8b442420488b5c2418eb05e90e0000004883c410584883c420e9adf8ffff498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44240848894110488b04244889410848c7010300000051ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b442428e852f8ffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c438c210000000000000000000e007000000000000|@3214,2097151,@15952,@3169,@3215,@3213,@2211,@3156,@2178,@3169,@3169|60,0,@3207 1101,0,@3208 1432,0,@3211 1658,0,@3212 3207:D3,72|483b65187303ff5548488b4a30488b1c2448890c244c8b52284c8b4a204c8b42184889de488b5a10488b4a084889ca56ff2290909090909000000000000000004000000000000000|@3148,1048575,@15949| 3208:O4|@20055,@557,@3210,@3209 3209:O5|@3140,205,0,205,0 3210:S14|4e6f74206120636f6e7374616e74 3211:D3,72|483b65187303ff5548488b4a30488b1c2448890c244c8b52284c8b4a204c8b42184889de488b5a10488b4a084889ca56ff2290909090909000000000000000004000000000000000|@3148,1048575,@15950| 3212:D3,72|483b65187303ff5548488b4a30488b1c2448890c244c8b52284c8b4a204c8b42184889de488b5a10488b4a084889ca56ff2290909090909000000000000000004000000000000000|@3148,1048575,@15951| 3213:D3,168|483b65187303ff5548a801756e488b08498d57d0483b55107303ff55404989d748c742f802000000488b590848895a0848c70205000000488d721848c746f8020000004889560848c7060900000056488b50084889d0909090e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c3909090909090900000000000000000a000000000000000|@1363,31,@15955| 3214:S65|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636746756e7328342970726f6365737342696e64696e6773283129 3215:D4,352|483b65187303ff5548a801756d488b08498d57c0483b55107303ff55404989d748c742f80700000048be90c40ac9a37f000048893248895a084c895210488b74241048897218488b7c240848897a204c8942284c894a30488062ffbf4d8d5fe84c3b5d107303ff55404d89df49c743f8020000004c8b6110eb05e9c50000004d89630849c7030f00000041524151415053ff7008ff7108ff314889d34c89d890ff15d20000004883380f74154889c148b800c50ac9a37f0000488b5d089090ff13498d4fe0483b4d107303ff55404989cf48c741f803000000488b400848894110488b44240848894108584883c40848890151ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b44241890e8e6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2100048c7c001000000c21000909000000000000000005801000000000000|@1363,1048575,@15954,@3169|42,0,@3216 177,0,@3217 3216:D3,72|483b65187303ff5548488b4a30488b1c2448890c244c8b52284c8b4a204c8b42184889de488b5a10488b4a084889ca56ff2290909090909000000000000000004000000000000000|@3148,1048575,@15953| 3217:O4|@20055,@557,@3219,@3218 3218:O5|@3140,174,0,174,0 3219:S24|70726f63657373456e7472793a206e6f74206c616d626461 3220:D15,704|483b65187303ff55486a016a016a01415141504c89d14c8b5424304989c94c8d44241090ff15ae020000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c700010000004c8b4424184889c3488b442410909090ff1576020000488b0c24f6c101753e488b11488b1a483b1d68020000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1d16020000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13488b0e488b11483b15b601000074154889c348b878e107c9a37f0000488b5d089090ff134883791001745eeb2a488b0e488b11483b159101000074144889c348b878e107c9a37f0000488b5d0890ff1348837910017468488b1c24f6c3017545488b3b4c8b074c3b056601000075244d8d4ff04c3b4d107303ff55404d89cf49c741f801000000eb05e985000000498939eb194c8b4b084c89cb483b65187303ff5548ebb649c7c1010000004983f90175245048bac8c80ac9a37f0000eb05e94f000000909090ff150e01000048c7c001000000eb48498b19488b3b483b3d0001000074134989c048b878e107c9a37f0000488b5d08ff1350ff731048bac8c80ac9a37f000090ff15de0000005a90ff12eb0b4889c348c7c001000000534c8b442420488b5c2408584883c4089090ff15be00000048837808017507488b4c2418eb17488b30488b5808488b442418ff15a60000004889c1eb03488b30488b04244889304889480848c7c0010000004883c420c2080090909090900000000000000000b802000000000000|@3387,2097151,@16020,@3388,@3513,@20130,@20130,@20130,@20130,@20141,@3223,@20141,@3223,@3640,@3386|192,0,@2635 285,0,@2690 329,0,@1486 374,0,@1486 490,0,@3221 543,0,@1486 563,0,@3221 3221:O2|@3223,@3222 3222:O2|@3296,@3221 3223:D55,9312|483b65187303ff5548488b0848bb16c90ac9a37f0000488d5c8bfcffe390e947020000909090e903040000909090e95b080000909090e9130a0000909090e95f0a0000909090e963000000909090e9bf0a0000909090e94f0e0000909090e96f0f0000909090e9a3100000909090e90b130000909090e91b1a0000909090e91e1a0000909090e9fb1a0000909090e95f1c0000909090e90f1d0000909090e94f200000909090e9bb220000909090ff7018ff7010524889d3488b4008ff15b62300009090ff15b6230000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820ef0ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442410488b54240890e8aafeffff48837c241801740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048c74208010000005b4883c41848891a498d5fe8483b5d107303ff55404989df48c743f8020000004889530848ba781b07c9a37f0000488913498d57d0483b55107303ff55404989d748c742f80200000048895a0848890a488d4a1848c741f8020000004889510848ba781b07c9a37f0000488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c352ff70084889d3488b4010909090ff150a2200009090ff150a220000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f0f209c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442408488b54241090e8eefcffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3f6402001756f488b4820488b19f6c30174084883fb017d2aeb06f643ff10742252ff7018ff7010ff700848b810c506c9a37f000048bad0a8dc0000000000ff12eb14488b7018488b78104c8b40084889d8525657415048c7c30500000048baa05f06c9a37f0000909090ff15fa1f00004889c3eb05e91400000048b880ef0ac9a37f00009090ff15e61f0000eb3948837820037418488b4818488b5810488b700848b898ef0ac9a37f0000eb16488b4818488b5810488b700848b8b0ef0ac9a37f000052515356498d4fe8483b4d107303ff55404989cf48c741f80200000048bac8ef0ac9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f8ef0ac9a37f000048890890ff155a1f0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b54242090e866faffff50488b5c2428488b442418909090ff15021f000050488b442428488b542430e842faffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810f00ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134989c248bb40f00ac9a37f000048b858f00ac9a37f0000ff15221e000048c7c3fb000000909090ff151a1e0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47d0483b45107303ff55404989c748c740f802000000488948084c8910488d481848c741f8020000004889410848b8781b07c9a37f00004889014883f9017506488b0424eb0d4889cb488b0424ff15521d0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c420488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c352ff7018ff7010488b4008e862f7ffff50488b442408488b542418e852f7ffff50488b442418488b542420e842f7ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870f00ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b970f00ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b988f00ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3488b400848ba28f409c9a37f0000ff156e1a00004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c348c7c303000000488b400848baa05f06c9a37f000090ff151a1a00004889c348b8b8f00ac9a37f000090ff150e1a00004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b480848833907756e4883781001750c48ba509adc0000000000eb0a48bad8f00ac9a37f0000498d5fe8483b5d107303ff55404989df48c743f80200000048bef0f00ac9a37f000048897308488913498d47e8483b45107303ff55404989c748c740f8020000004889580848b908f10ac9a37f0000eb05e94b0000004889089090ff154e1900004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c34883390375704883781001750c48ba509adc0000000000eb0a48bad8f00ac9a37f00005248c7c303000000488b410848baa05f06c9a37f000090ff15d6180000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0f00ac9a37f0000488951085a488911498d57d0483b5510730aeb05e979000000ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b928f10ac9a37f000048890890ff156a1800004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c34883390175704883781001750c48ba509adc0000000000eb0a48bad8f00ac9a37f00005248c7c303000000488b410848baa05f06c9a37f000090ff15f2170000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0f00ac9a37f0000488951085a488911498d57d0483b5510730aeb05e979000000ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b940f10ac9a37f000048890890ff15861700004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c34883781001750c48ba509adc0000000000eb0a48bad8f00ac9a37f00005248c7c303000000488b410848baa05f06c9a37f0000909090ff1512170000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0f00ac9a37f0000488951085a488911498d57d0483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b958f10ac9a37f0000488908ff15ae1600004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c352ff700848c7c303000000488b401048baa05f06c9a37f000090ff15561600004889c348b870f10ac9a37f000090ff154a16000048bba0290ac9a37f0000ff1542160000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b54241090e8c6f0ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4104889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7010488b4008909090e81ef0ffff50488b442408488b542410e80ef0ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810270ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b840270ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c34883781801750c48b990f10ac9a37f0000eb0a48b9b0f10ac9a37f0000498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848c70307000000f6c301741a488b4808488b701048b8f86f07c9a37f0000488b5d089090ff135253ff7008488b4010909090e882eeffff4989c248c7c35100000048b8d0f10ac9a37f00009090ff159e130000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415251488b5c2420488b4424109090ff15561300009090ff1556130000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c3488b4808498d5fe8483b5d107303ff55404989df48c743f802000000488b71084889730848c70307000000f6c301741348b8f86f07c9a37f0000488b5d08909090ff134883793801740c48bfe8f10ac9a37f0000eb0a48bf00f20ac9a37f00004989d24989db4c8b214c8b69104c8b7128ff7140ff7118ff7120ff71304889fb48b818f20ac9a37f0000ff1542110000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415241535141544155415648c7c303000000488b44243048baa05f06c9a37f00009090ff15e61000004889c348b830f20ac9a37f000090ff15da100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff135148c7c303000000488b44244048baa05f06c9a37f0000ff158a1000004889c348b848f20ac9a37f000090ff157e100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889cb488b442448909090ff153a100000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b860f20ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff135350488b442460ff15ba0f0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b890f20ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1348837c241801740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848bac8f20ac9a37f0000488911498d57d0483b55107303ff55404989d748c742f80500000048894a2048c742180100000048c742100100000048c742080300000048c70201000000f6c20174164889c148b8f86f07c9a37f0000488b5d08909090ff134989c24989d348c7c35100000048b8f8f20ac9a37f0000ff15760e0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134152415351488b5c2458488b442438ff152e0e00009090ff152e0e0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b442440488b54245890e812e8ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba10f30ac9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b960f30ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c348b8b0280ac9a37f0000c34989d24c8b580848c7c35100000048b8e0280ac9a37f0000909090ff15de0a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13514c89d34c89d8ff159e0a00009090ff159e0a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c34989d24c8b58104c8b600848c7c35100000048b890f30ac9a37f00009090ff150e0a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134152514153498b5a084c89e0909090ff15c609000050488b442408488b542418e8f6e3ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f00004889084883f8017506488b0424eb0e4889c3488b042490ff1552090000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084883c410584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352488b40089090e802e3ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f00004883c40848895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958290ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3488b481048c7c30100000048c7c60100000052ff7008ff7018ff31ff7010483b74240873704889f04883c002488b0c246a016a015350ff71084c8d44241848c7c3110000004889f048ba50a8dc0000000000ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901eb05e9520000004823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085e4883c4184889c3483b65187303ff5548e932ffffff4889d848c7c30300000048baa05f06c9a37f00009090ff151e0700005048c7c303000000488b44241048baa05f06c9a37f0000909090ff1506070000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba88290ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7005f000000488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b8290ac9a37f000048890890ff157e060000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442418488b54242890e852e0ffff50488b442428488b542430e842e0ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4284889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3488b4808f6c10174084883f9017d2beb06f641ff10742352ff7010ff70184889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb0e488b5810488b70184889c852535648c7c30500000048baa05f06c9a37f000090ff1596040000488b0c24f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c85248c7c30500000048baa05f06c9a37f0000ff154a040000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad8290ac9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a0290ac9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f0290ac9a37f0000488908909090ff15aa030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b54241090e866ddffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c34989d24c8b580848c7c35100000048b8a8f30ac9a37f00009090ff157a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13514c89d34c89d8ff153a0200009090ff153a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000005824000000000000|@3272,2097151,@15956,@3273,@3275,@3276,@3280,@194,@100,@109,@3281,@100,@100,@3282,@2713,@194,@100,@109,@194,@109,@194,@109,@194,@109,@194,@100,@100,@100,@3283,@3284,@100,@194,@100,@194,@100,@3285,@3287,@100,@3289,@3290,@100,@3291,@3292,@100,@3293,@3294,@194,@194,@109,@194,@194,@109,@100,@3295,@3271|14,0,$3223+30 232,0,@3224 311,0,@1294 352,0,@3226 364,0,@3227 442,0,@833 502,0,@833 600,0,@1294 676,0,@2700 755,0,@1294 812,0,@883 857,0,@884 898,0,@835 939,0,@884 1054,0,@1294 1114,0,@376 1124,0,I106 1165,0,@193 1194,0,@3228 1233,0,@3229 1257,0,@3230 1295,0,@3231 1340,0,@3233 1400,0,@1294 1523,0,@833 1564,0,@3234 1643,0,@1294 1662,0,@3236 1672,0,@3237 1744,0,@1294 1814,0,@833 1874,0,@833 1940,0,@833 1985,0,@835 2026,0,@833 2173,0,@1294 2264,0,@883 2309,0,@884 2350,0,@3238 2423,0,@884 2464,0,@3238 2541,0,@3239 2623,0,@1294 2644,0,@2711 2705,0,@1294 2735,0,@193 2755,0,@3241 2817,0,@1294 2853,0,I48 2865,0,@3242 2899,0,@3243 2944,0,@3244 3017,0,@1294 3049,0,I48 3061,0,@3242 3083,0,@193 3124,0,@3243 3196,0,@3245 3261,0,@1294 3293,0,I48 3305,0,@3242 3327,0,@193 3368,0,@3243 3440,0,@3246 3505,0,@1294 3531,0,I48 3543,0,@3242 3565,0,@193 3608,0,@3243 3673,0,@3247 3737,0,@1294 3771,0,@193 3791,0,@3248 3808,0,@3015 3864,0,@1294 3924,0,@831 4034,0,@1294 4108,0,@831 4153,0,@833 4194,0,@2988 4271,0,@2990 4350,0,@1294 4375,0,@3249 4387,0,@3250 4445,0,@1294 4490,0,@3251 4548,0,@1294 4694,0,@1294 4735,0,@831 4780,0,@833 4857,0,@833 4972,0,@1294 5040,0,@1294 5066,0,@3252 5078,0,@3253 5120,0,@3254 5176,0,@1294 5218,0,@193 5239,0,@3255 5296,0,@1294 5328,0,@193 5347,0,@3256 5404,0,@1294 5468,0,@3257 5547,0,@1294 5604,0,@3259 5683,0,@1294 5707,0,@3226 5719,0,@3227 5780,0,@3261 5860,0,@1294 5892,0,@3263 5948,0,@1294 6094,0,@1294 6152,0,@3264 6197,0,@833 6302,0,@833 6375,0,@833 6448,0,@833 6589,0,@833 6666,0,@833 6707,0,@3267 6789,0,@1294 6808,0,@3005 6833,0,@3007 6892,0,@1294 7030,0,@1294 7066,0,@3269 7124,0,@1294 7204,0,@883 7249,0,@833 7394,0,@1294 7448,0,@883 7497,0,@3012 7579,0,@1294 7668,0,I104 7842,0,@193 7873,0,@193 7916,0,@3014 8016,0,@3016 8076,0,@1294 8152,0,@883 8197,0,@833 8238,0,@834 8279,0,@884 8417,0,@1294 8469,0,@376 8479,0,I106 8515,0,@193 8559,0,@376 8569,0,I106 8600,0,@193 8640,0,@3017 8685,0,@3015 8762,0,@3018 8824,0,@1294 8884,0,@883 8929,0,@833 9044,0,@1294 9078,0,@3270 9136,0,@1294 9274,0,@1294 3224:O2|3,@3225 3225:S2|2428 3226:O2|3,71 3227:O2|3,70 3228:S4|54414720 3229:S3|494e54 3230:S4|574f5244 3231:O2|@3232,0 3232:S2|2028 3233:S5|4341534520 3234:O2|3,@3235 3235:S5|454c53453a 3236:S4|43415345 3237:S3|29207b 3238:O2|3,@3015 3239:O2|3,@3240 3240:S3|494628 3241:S10|434f4e5441494e455220 3242:S6|2c206c617374 3243:O2|41,0 3244:S10|52454355525349564528 3245:S5|434c4f5328 3246:S6|504152414d28 3247:S6|4c4f43414c28 3248:S9|494e44495245435428 3249:S10|4b494c4c414654455228 3250:S11|4b494c4c4245464f524528 3251:S6|204b494c4c3d 3252:S4|74727565 3253:S5|66616c7365 3254:S3|434c3d 3255:S4|2043523d 3256:S8|204c4f43414c533d 3257:O2|3,@3258 3258:S5|415247533d 3259:O2|3,@3260 3260:S9|4152474c495645533d 3261:O2|3,@3262 3262:S4|5245533d 3263:S6|20434c4f533d 3264:O2|@3265,0 3265:O2|3,@3266 3266:S9|297b4c414d4244417d 3267:O2|3,@3268 3268:S7|4c414d42444128 3269:S5|424c4f434b 3270:S9|524543434f4e535452 3271:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15974|64,0,@883 3272:S33|4261636b656e64496e7465726d656469617465436f64652e707265747479283129 3273:D3,744|483b65187303ff5548a80175714883780801756f488b08ff7108488b014889daff1248833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f0000eb0ae94d020000e9940000004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008ff7108488b014889daff1248833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f00004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e87efdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c30000000000000000e002000000000000|@3274,1048575,@15957|43,0,@3226 55,0,@3227 116,0,@833 230,0,@1294 311,0,@3226 323,0,@3227 384,0,@833 486,0,@1294 527,0,@1466 610,0,@1294 672,0,@833 3274:S34|4261636b656e64496e7465726d656469617465436f64652e704c6973742833292829 3275:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15958|64,0,@883 3276:D9,1672|483b65187303ff5548a801756b48837808017569488b08488b11ff7108ff720853ff721048c7c303000000488b0248baa05f06c9a37f0000ff15620600005048c7c303000000488b44240848baa05f06c9a37f0000909090ff154a060000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae9f3050000e96a02000048ba38ff0ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700f7000000488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968ff0ac9a37f000048890890ff15b2050000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442410488b542408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1348833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f00004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b08488b1153ff7008ff7108ff7208ff721048c7c303000000488b0248baa05f06c9a37f000090ff159e0300005048c7c303000000488b44240848baa05f06c9a37f0000909090ff1586030000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38ff0ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700f7000000488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968ff0ac9a37f000048890890ff15fa020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b542420ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1348833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f00004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e8def9ffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c300000000000000008006000000000000|@3274,2097151,@15959,@194,@194,@109,@194,@194,@109|48,0,@193 77,0,@193 132,0,@3277 236,0,@3279 296,0,@1294 379,0,@833 494,0,@1294 518,0,@3226 530,0,@3227 591,0,@833 693,0,@1294 779,0,@193 809,0,@193 852,0,@3277 956,0,@3279 1016,0,@1294 1099,0,@833 1214,0,@1294 1238,0,@3226 1250,0,@3227 1311,0,@833 1413,0,@1294 1455,0,@1466 1538,0,@1294 1600,0,@833 3277:O2|@3278,0 3278:S8|20757365737d203d 3279:S6|4445434c2023 3280:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15960|64,0,@883 3281:D7,1040|483b65187303ff5548a801756648837808017564488b08488b5108f6c20174084883fa017d26eb06f642ff10741eff31534889d348b810c506c9a37f000048bad0a8dc0000000000ff12eb064889d0ff315348c7c30500000048baa05f06c9a37f000090ff15be03000048c7c375000000eb0ae97c030000e92f010000909090ff15aa030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442410488b542408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b08488b5108f6c20174084883fa017d2aeb06f642ff10742253ff7008ff314889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb0b488b70084889d05356ff3148c7c30500000048baa05f06c9a37f0000ff152e02000048c7c375000000909090ff1526020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b442408488b542418ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e85afcffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000000804000000000000|@3274,2097151,@15961,@194,@100,@194,@100|54,0,@376 64,0,I106 91,0,@193 176,0,@1294 259,0,@833 374,0,@1294 465,0,@376 475,0,I106 508,0,@193 580,0,@1294 663,0,@833 778,0,@1294 819,0,@1466 902,0,@1294 964,0,@833 3282:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15962| 3283:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3274,1048575,@15963|108,0,@1466 198,0,@1294 260,0,@833 3284:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15964|64,0,@883 3285:D3,232|483b65187303ff5548a801755c4883780801754348833801740c48b850ef0ac9a37f0000eb0a48b868ef0ac9a37f00004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c348833801741148b950ef0ac9a37f0000eb0fe95e00000048b968ef0ac9a37f000051488b4008e87effffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090900000000000000000e000000000000000|@3286,3,@15965|28,0,@3226 40,0,@3227 95,0,@3226 112,0,@3227 160,0,@833 3286:S50|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172675479706573283129 3287:D5,360|483b65187303ff5548a80175684883780801756648c7c303000000488b0048baa05f06c9a37f0000ff1552010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b4510730feb0ae9d2000000e91a000000ff55404989c748c740f80200000048c7400801000000488908c3ff700848c7c303000000488b0048baa05f06c9a37f0000ff15d2000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351488b4424089090e802ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c39090909000000000000000006001000000000000|@3288,2097151,@15966,@194,@194|32,0,@193 88,0,@1294 168,0,@193 224,0,@1294 284,0,@833 3288:S49|4261636b656e64496e7465726d656469617465436f64652e7072657474792831297072657474794172674c696665283129 3289:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3274,1048575,@15967|108,0,@1466 198,0,@1294 260,0,@833 3290:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15968|64,0,@883 3291:D3,744|483b65187303ff5548a80175714883780801756f488b08ff7108488b014889daff1248833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f0000eb0ae94d020000e9940000004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008ff7108488b014889daff1248833c2401740c48b950ef0ac9a37f0000eb0a48b968ef0ac9a37f0000498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f00004883c408488911498d57b8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e87efdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c30000000000000000e002000000000000|@3274,1048575,@15969|43,0,@3226 55,0,@3227 116,0,@833 230,0,@1294 311,0,@3226 323,0,@3227 384,0,@833 486,0,@1294 527,0,@1466 610,0,@1294 672,0,@833 3292:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15970|64,0,@883 3293:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30550ac9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3274,1048575,@15971|108,0,@3077 198,0,@1294 260,0,@833 3294:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@15972| 3295:D3,336|483b65187303ff5548a801756d48837808017531488b004889da9090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c353ff7008488b004889da90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108eb05e9b5000000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e81affffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c39090909000000000000000004801000000000000|@3274,1048575,@15973|108,0,@1466 198,0,@1294 260,0,@833 3296:D9,768|483b65187303ff554848833803750a488b4008488b5208ff2248833805756d4989d24c8b580848c7c35100000048b880160bc9a37f000090ff15da020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1351498b5a084c89d8909090ff1596020000eb05e97d000000909090ff158e020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c352ff7010ff701848c7c303000000488b400848baa05f06c9a37f00009090ff15fe0100005048c7c303000000488b44240848baa05f06c9a37f0000909090ff15e6010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38ff0ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700f7000000488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968ff0ac9a37f000048890890ff155a010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b44240851488b5008488b442408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c39090909090900000000000000000f802000000000000|@3299,2097151,@15975,@100,@3300,@3298,@194,@194,@109|47,0,@3297 104,0,@1294 254,0,@1294 290,0,@193 321,0,@193 364,0,@3277 468,0,@3279 528,0,@1294 615,0,@833 730,0,@1294 3297:S6|4d555455414c 3298:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@15977|64,0,@883 3299:S40|4261636b656e64496e7465726d656469617465436f64652e70726574747942696e64696e67283129 3300:D9,1328|483b65187303ff5548a80175714883780801756f488b08ff710853ff711048c7c303000000488b0148baa05f06c9a37f00009090ff150e0500005048c7c303000000488b44240848baa05f06c9a37f0000909090ff15f6040000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38ff0ac9a37f0000eb0ae995040000e9bc01000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700f7000000488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968ff0ac9a37f000048890890ff155e040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f802000000488b5424084889500848c7001500000051488b54240890ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b0853ff7008ff7108ff711048c7c303000000488b0148baa05f06c9a37f0000909090ff15f20200005048c7c303000000488b44240848baa05f06c9a37f0000909090ff15da020000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38ff0ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700f7000000488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968ff0ac9a37f000048890890ff154e020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f8020000005a4889500848c7001500000051488b54241090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048bae01c0bc9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff1350488b5c2410488b44240890e836fbffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c300000000000000002805000000000000|@3274,2097151,@15976,@194,@194,@109,@194,@194,@109|42,0,@193 73,0,@193 116,0,@3277 232,0,@3279 292,0,@1294 411,0,@833 526,0,@1294 605,0,@193 637,0,@193 680,0,@3277 784,0,@3279 844,0,@1294 959,0,@833 1070,0,@1294 1111,0,@3301 1194,0,@1294 1256,0,@833 3301:O2|@884,@3302 3302:O2|@3303,0 3303:O2|3,@3304 3304:S5|20414e4420 3305:S63|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465546f436f6e7374616e74283329 3306:D4,328|483b65187303ff55484983f901746a41f6c10174084983f9017d09eb3141f641ff10752a50415141505348bb081f0bc9a37f00004c89c848ba90c8dc0000000000909090ff124883f8017419eb0650415141505348b8181f0bc9a37f0000488b5d0890ff13488b442410a80174064883c07e710cff5570eb05e91a000000ebee48c7c38100000048ba90a9dc0000000000909090ff12eb104889c148c7c0030000005141514150534889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f498d47d0483b45107303ff55404989c748c740f80500000048b9981f0bc9a37f000048890859488948085948894810594889481848897820488060ffbf4889c358ff252d000000909090909000000000000000004001000000000000|@3329,2097151,@15988,@3169|44,0,@3307 57,0,I233 86,0,@3308 137,0,I109 262,0,@3311 3307:B8|ffffffffffffff7f 3308:O4|4,@103,0,@3309 3309:O5|@3310,64,0,64,0 3310:S21|2e2f62617369732f426f6f6c41727261792e736d6c 3311:D6,1000|483b65187303ff554848833815757152ff70084889d3488b40109090ff15de030000488b4c240850ff712048bac0230bc9a37f0000524c8b51184c8b49104c8b41084889cb488b4424189090ff15b6030000498d4fd0483b4d107303ff55404989cf48c741f8030000005a4883c410488951104889410848c70115000000eb05e910000000488d412048c740f801000000488908c34883380f756f488b4808498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77e8483b75107303ff55404989f748c746f80200000048bfd0230bc9a37f000048893e48895e08488066ffbf498d7fc8483b7d107303ff55404989ff48c747f806000000eb05e90501000049b878240bc9a37f00004c89074c8b42084c8947084c8b4a104c894f104c8b52204c8957184c8b5a184c895f204c8b61184c896728488067ffbfff7138ff7130ff71204154ff7108534c8b4c24204989f04889fb488b0148bac0230bc9a37f0000ff12488b0c24488b094883f901750948c7c101000000eb0a48b990da06c9a37f0000498d5790483b55107303ff55404989d748c742f808000000488b5c24284883c40848895a38488b5c241848895a3048c7422803000000488b5c241048895a20488b5c240848895a1848894a10594883c42048894a08488902488d424848c740f8020000004889500848c7000f0000004889c1488d401848c740f801000000488908c3488338077561488b481048833909755cff7018514889d3488b400890ff15da010000498d4fc8483b4d107303ff55404989cf48c741f804000000488b542408488951185a4883c408488951104889410848c70107000000488d412848c740f801000000488908c3e90800000048c7c001000000c3488338097554488b480848833901744f48833903750e50488b4108488b520890ff12eb4e4883390775125048c7c001000000488b52109090ff12eb6d488b5908f6c30174084883fb017d08eb2ff643ff107529f6c301741feb0ae9e4000000e9c1000000f6421801740d483b5a187c21eb0ae9af000000ff5570ebee4889c648b800260bc9a37f0000488b5d089090ff13506a016a01524c8d44240848c7c311000000488b4108eb05e97800000048ba50a8dc0000000000ff12488b0424488b4c2408488b502048d1e9480fb60c0a488d4c09014889cb488b4c241048c7c6030000004883ee014883f97f760748c7c17f00000048d1e948d3e64883ce01488d4c0901480bde4883c408594883c40848d1e948d1eb48881c0a488d5c1b01488d4c0901eb0150498d47f0483b45107303ff55404989c748c740f80100000059488908c348c7c001000000c390909090900000000000000000e003000000000000|@3320,2097151,@15981,@3169,@3321,@3319|45,0,@3312 220,0,@3313 273,0,@3315 360,0,@3312 394,0,@545 777,0,@3316 824,0,I104 3312:O1|@3306 3313:D3,40|488b520848c7020300000048c7c001000000c3909090909000000000000000002000000000000000|@3314,5,@15979| 3314:S66|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f526563757273697665283129 3315:D3,352|483b65187303ff5548488b4a28f6c10174134889c348b8c0e406c9a37f0000488b5d08ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbf48833901750848c7c001000000c348833903750a488b4108488b5208ff2248833907750d48c7c001000000488b5210ff22488b4108a80174084883f8017d08eb1df640ff107517a801740ef64220017408483b42207c18eb05ff5570ebf348b800260bc9a37f0000488b5d0890ff136a016a01524c8d44240848c7c31100000048ba50a8dc0000000000ff12488b0424488b4c2408488b501848d1e9480fb60c0a488d4c09014889cb488b4c241048c7c6030000004883ee014883f97f760748c7c17f00000048d1e948d3e64883ce01488d4c0901480bde4883c408594883c40848d1e948d1eb48881c0a488d5c1b01488d4c090148c7c001000000c3909090909000000000000000005801000000000000|@3318,2097151,@15980|23,0,@578 174,0,@3316 208,0,I104 3316:O4|11,@42,0,@3317 3317:O5|@3310,417,0,417,0 3318:S64|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b4c616d626461283829726566546f436c6f73757265283129 3319:D4,160|483b65187303ff5548a801756e488b0853ff7008ff7108488b019090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151488b5c2410488b442408e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908eb05e901000000c348c7c001000000c39090909090909000000000000000009800000000000000|@1363,1048575,@15987,@3169| 3320:S47|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f6465283129 3321:D8,816|483b65187303ff5548a8017569488b08488339017565ff7118ff711053ff7120ff742430ff742430488b48084889c89090e8caffffff50488b5c2410488b442408909090ff15fe020000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44242048894118488b442418eb0ae99a020000e93a0000004889411048c741080100000048c70101000000498d47e8483b45107303ff55404989c748c740f8020000005a4883c42048895008488908c2100048833905756c53ff7108ff742420ff742420488b48084889c89090e826ffffff50488b5c2410488b442408909090ff1562020000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f8020000005a4883c41048895008488908c2100048833907756e415241514150ff7108ff742430ff742430488b48084889c8909090e8aefeffff50ff7424304c8b5424404c8b4c24284c8b442420488b5c2418488b442410ff15e20100004c8b442438488b5c2420ff15da010000498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e9260000004889410848c70107000000488d411848c740f8020000005a4883c42048895008488908c21000534152ff7110ff7118ff742430ff742430488b48084889c89090e816feffff50488b5c2420488b442408909090ff156a010000488b4c2410f6c10174084883f9017d08eb20f641ff10751af6c1017410f6442418017409483b4c24187c1ceb05ff5570ebf24889c248b8382b0bc9a37f0000488b5d089090ff136a016a01504c8d44240848c7c3110000004889c848ba50a8dc000000000090ff12488b442408488b4c245048d1e8480fb60401488d440001488b4c241048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801750948c7c001000000eb0a48b890da06c9a37f0000498d4fc0483b4d107303ff55404989cf48c741f8040000005a4883c41048895118488b542410488951104889410848c70103000000488d412848c740f8020000005a4883c42048895008488908c2100048c7c001000000c210009000000000000000002803000000000000|@3325,2097151,@15982,@3169,@3169,@3326,@3324,@3169|565,0,@3322 603,0,I104 701,0,@545 3322:O4|11,@42,0,@3323 3323:O5|@3310,411,0,411,0 3324:D3,360|483b65187303ff5548a801756d488b08488b5108f6c20174084883fa017d08eb1cf642ff107516f6c201740af6c3017405483bd3eb05ff5570ebf67c14488b700848b8382b0bc9a37f0000488b5d08ff136a016a01415053ff7008ff7110524c8d44242848c7c3110000004889d048ba50a8dc0000000000eb05e9cf00000090ff12488b442428488b4c242048d1e8480fb60401488d440001488b4c243048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801750948c7c001000000eb0a48b890da06c9a37f0000498d4fe0483b4d107303ff55404989cf48c741f803000000488b542408488951105a4883c40848895108488901514c8b442418488b5c2410488b442408909090e8dafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c3909000000000000000006001000000000000|@1363,2097151,@15986|67,0,@3322 112,0,I104 217,0,@545 3325:S61|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429636865636b436f646528312970726f6365737344656373283129 3326:D3,480|483b65187303ff5548a8017572488b08488b5110498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fe8483b7d107303ff55404989ff48c747f80200000049bb782f0bc9a37f00004c891f48897708488067ffbf4d8d5fc84c3b5d107303ff55404d89df49c743f806000000eb05e94001000049bcc82f0bc9a37f00004d892349895b084d8943104d8953184d894b204c8b62184d896328498063ffbf41524151415053ff7008ff7108ff7238ff7230ff72204154ff7208564c8b4c24204989f84c89db488b02488b542468909090ff12488b0c24488b094883f901750948c7c101000000eb0a48b990da06c9a37f0000498d5798483b55107303ff55404989d748c742f808000000488b5c24284883c40848895a38488b5c241848895a3048c7422803000000488b5c241048895a20488b5c240848895a1848894a10594883c42048894a08488902488d424848c740f80300000048895010594889480848c7000100000050ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b44241090e866feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2080048c7c001000000c2080090900000000000000000d801000000000000|@1363,1048575,@15985|81,0,@3327 134,0,@3328 250,0,@545 3327:D3,40|488b520848c7020300000048c7c001000000c3909090909000000000000000002000000000000000|@3314,5,@15983| 3328:D3,352|483b65187303ff5548488b4a28f6c10174134889c348b8c0e406c9a37f0000488b5d08ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbf48833901750848c7c001000000c348833903750a488b4108488b5208ff2248833907750d48c7c001000000488b5210ff22488b4108a80174084883f8017d08eb1df640ff107517a801740ef64220017408483b42207c18eb05ff5570ebf348b800260bc9a37f0000488b5d0890ff136a016a01524c8d44240848c7c31100000048ba50a8dc0000000000ff12488b0424488b4c2408488b501848d1e9480fb60c0a488d4c09014889cb488b4c241048c7c6030000004883ee014883f97f760748c7c17f00000048d1e948d3e64883ce01488d4c0901480bde4883c408594883c40848d1e948d1eb48881c0a488d5c1b01488d4c090148c7c001000000c3909090909000000000000000005801000000000000|@3318,2097151,@15984|23,0,@578 174,0,@3316 208,0,I104 3329:S35|434f4445545245455f4c414d4244415f4c49465428292e636865636b426f6479283429 3330:D4,272|483b65187303ff554841f6c10174084983f9017d09eb1f41f641ff10751841f6c101740b4c3b0ddd0000007c1ceb0741f641ff1075134889c148b820f007c9a37f0000488b5d08ff134c89c9f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c890f498d47c0483b45107303ff55404989c748c740f80700000048b9c8320bc9a37f0000488908488958084c89401048897818488b4c241048894820488b5c2408488958284c895030488060ffbf4889c34889d05a4883c41052ff2532000000909000000000000000000001000000000000fdffffffffffff01|@3385,1048575,@16019,@3169|59,0,@1509 178,0,@3331 3331:D15,1072|483b65187303ff554848833815756e52ff701048b980370bc9a37f000051ff7220ff7228ff72304c8b52184c8b4a104c8b42084889d3488b40089090ff150604000050488b5c2410488b442408909090ff15fa030000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c41048894108eb05e92300000048c70115000000498d47f0483b45107303ff55404989c748c740f801000000488908c34883380f7574488b4808ff7128ff7130ff7138ff7208ff7210ff721848bb80370bc9a37f000053ff7220ff7228ff72304c8b51204c8b49184c8b4110488b5908488b01ff156a030000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c7010f000000488d411848c740f801000000eb05e904000000488908c34883380975706a016a014c8b52184c8b4a104c8b42084889e3488b4008909090ff1512030000488b042448833803750848837c240801741148b890370bc9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084883c4104889410848c70109000000eb05e91c000000498d47f0483b45107303ff55404989c748c740f801000000488908c3488338077563488b48104883390f755e488b590848837b10017558498d77d0483b75107303ff55404989f748c746f80200000048c746080100000048891e488b78184c8b4008488d461848c740f80200000048c740080100000048893052574150ff7220ff7228eb0fe9e8010000e9c7000000e9ba000000ff723049ba80370bc9a37f00004c8b4a184c8b4210488b5a08ff1512020000a80174134889c148b8e81f08c9a37f0000488b5d08ff13488b08ff31ff7108488b5c2420488b44241090ff15ea0100004889c6589090ff15e60100004883f80174114889c34889f09090ff15da0100004889c6498d47c8483b45107303ff55404989c748c740f804000000488b4c241048894818594883c418488948104889700848c700070000004889c1488d402848c740f801000000488908c348c7c001000000c34883390975686a016a0152ff7018ff70084c8b52184c8b4a104c8b4208488d5c2418488b410890ff15620100006a016a01488b442428488338037542498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084889410848c701090000004889e04889084889e0eb05e9a1000000488b4c243048894808eb164889e1488b40084889014889e0488b4c243048894808488b5c2420488b44241090ff15f20000004889c6488b4424089090ff15ea0000004883f80174114889c34889f09090ff15de0000004889c6498d47c8483b45107303ff55404989c748c740f804000000488b4c241848894818594883c430488948104889700848c700070000004889c1488d402848c740f801000000488908c348c7c001000000c348c7c001000000c390909000000000000000002804000000000000|@3337,2097151,@15989,@3338,@3169,@3345,@3349,@3341,@3380,@3381,@3382,@3349,@3383,@3384,@3336|21,0,@3332 195,0,@3332 354,0,@3333 572,0,@3332 607,0,@1625 3332:O1|@3330 3333:O4|@20055,@557,@3335,@3334 3334:O5|@3162,222,0,222,0 3335:S30|4c69667465642066756e6374696f6e206f7574206f6620636f6e74657874 3336:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16018| 3337:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f6465283129 3338:D10,1632|483b65187303ff5548a8017569488b0848833901756541524151415053ff7008ff7118ff7110488b41209090ff1546060000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44240848894118584883c4084889411048c741080100000048c7010100000051ff742450eb0ae9c9050000e954000000ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b442428e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048833905756d41524151415053ff7008488b4108ff1592050000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010500000051ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b4424289090e8befeffff4889c1eb05e927000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c22000488339077569488b510848c7c603000000f6c201754e488b3a48833f01752c4c8b5f1049837b100175184883fe03740948c7c601000000eb1948c7c603000000eb1048c7c601000000eb0748c7c601000000488b7a084889fa483b65187303ff5548ebad4889f24883fa01746beb05e9310200004989db4c8b60084c8b69084c89e8909090ff158a040000415241514150415341544155ff742448ff742448ff7424484c8b5424684c8b4c24404c8b442438488b5c24309090ff155e040000594883f80175204883f901746948b8a03f0bc9a37f0000eb05e916010000488b5d08909090ff13f6c1017417488b5008488b1848b8a03f0bc9a37f0000488b5d08ff13488b11498d5ff0483b5d107303ff55404989df48c743f801000000488b30488933488b7a0840f6c701740d4883ff017d0deb2be973000000f647ff1075204c8b4424204d8b0040f6c701740b41f6c0017405493bf8eb05ff5570ebf67c16488b700848b810f407c9a37f0000488b5d089090ff1340f6c70174064883c7027105ff5570ebf54c8b44242049895cb8fc488b51084889d1488b50084889d0483b65187303ff5548e913ffffff488b442448488b4c2440488b542438488b5c2430488944244848894c2440488954243848895c24304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e99afcffff41524151415053ff7008ff742440ff742440ff7424404c8b5424604c8b4c24384c8b442430488b5c2428488b4108ff15fe020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010700000051ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b4424289090e812fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048837908017565488b511848833a0f7560488b720848837e1001755a498d7fc0483b7d107303ff55404989ff48c747f8010000004c8b59104c891f4c8d671049c74424f80200000049897c240849893424488b7808498d44241848c740f80200000048c7400801000000eb0fe919010000e914010000e90f0100004c892041524151415053574153ff742448ff742448ff7424484c8b5424684c8b4c24404c8b442438488b5c2430ff15da010000a80174134889c148b8e81f08c9a37f0000488b5d08ff13498d4ff0483b4d107303ff55404989cf48c741f801000000488b00488901488b0424a80174084883f8017d08eb23f640ff10751d488b542428488b12a801740af6c2017405483bc2eb05ff5570ebf67c1348b810f407c9a37f0000488b5d08909090ff13a80174064883c0027105ff5570ebf5488b5424284883c40848894c82fc488b442448488b4c2440488b5c2438488b742430488944244848894c244048895c243848897424304989d24c8b4c24184c8b442410488b5c2408584883c420e95efaffff41524151415053ff7008ff7110488b411890ff15ee000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584889411048c741080100000048c7010300000051ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b44242890e8e6f9ffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c22000909000000000000000005806000000000000|@3342,2097151,@15990,@3169,@3169,@3343,@3341,@3344,@3341,@3169|577,0,@3339 615,0,@3339 729,0,@1517 1231,0,@1625 1328,0,@1517 3339:O4|@20116,@2564,0,@3340 3340:O5|@2563,75,0,75,0 3341:D14,1008|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004889c64889cf4989db4889f0ff15ca0300004889f15641525741514150415350f6c1017554488b01488b10488b5a18ff7108f6c301756c488b03488338057550488b4c2408f6c1017539488b11f6c2017509f64008017503ff5570483b5008750948c7c603000000eb20488b51084889d1483b6518730aeb05e9c3000000ff5548ebc248c7c6010000004883fe01756b6a016a01ff73084c8b5424384c8b4c2430eb05e98a0000004c8b442428488d5c24089090ff152a030000488b44240848833801743b488b5c2440488b40089090ff1516030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb08e9180000004889c1488b5c2440488b442410909090ff15de020000eb076a016a01ff73085b4883c410483b65187303ff5548e900ffffff59483b65187303ff5548e9dffeffff48c7c001000000488b442420488b0048c7c101000000a801753a488b10498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b4889d9488b50084889d0483b65187303ff5548ebc24889c84889c34889d89090ff155602000048c7c1010000004889daf6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc53ff742420ff742430ff742440ff742470ff742470ff742470504c8b5424504c8b4c24484c8b4424404889cb488b442470909090ff15f60100004889c6488b4424389090ff15ee0100004889c74889f8ff15ea010000498d4fb0483b4d107303ff55404989cf48c741f8020000004889710848c70107000000488d511848c742f80200000048c742080100000048890a488d4a1848c741f80300000048c74110010000004889410848c7011d000000a8017524488b1848833b057512488b58084889d8483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741057524889c8909090ff1556010000eb054889c85752498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c701150000005848c7c201000000a8017528f6c201740cf600017407483b107d0aeb05ff5570ebf4488b10488b4008483b65187303ff5548ebd44889d0a80174064883c0027105ff5570ebf56a016a01ff7424604c8b5424704c8d4c24084c8b4424604889c34889c8ff15c600000048c7c0010000005a9090ff12498d4fe0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c7010500000041594883c4304989c848c7c30100000058594883c41851ff257d00000090909090900000000000000000e803000000000000|@3357,2097151,@15998,@3358,@3349,@2226,@3360,@3361,@3362,@3377,@3378,@2211,@3220,@3356| 3342:S65|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f63657373436f646528312970726f6365737344656373283129 3343:D3,160|483b65187303ff5548a801756e488b08498d57d8483b55107303ff55404989d748c742f801000000488b590848891a488d721048c746f80200000048895608488b511048891656488b78084889f8909090e8aaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908eb05e901000000c348c7c001000000c39090909090909000000000000000009800000000000000|@1363,63,@15991| 3344:D4,264|483b65187303ff5548a801756f488b08488b511041524151415053ff7008ff7108ff7228ff7230ff723853415041514152ffb42480000000ffb42480000000ffb424800000004c8b52204c8b4a184c8b4210488b5a08488b02909090ff15be000000498d4fe0483b4d107303ff55404989cf48c741f803000000eb05e96700000048894110584889410848c7010100000051ff742448ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b4424209090e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2180048c7c001000000c2180090909090909000000000000000000001000000000000|@1363,1048575,@15996,@3345| 3345:D3,352|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57c8483b55107303ff55404989d748c742f80600000048be48480bc9a37f000048893248894a08488b74243848897210488b7c243048897a184c8b4424284c8942204c894a28488062ffbf41525351ff742430ff7424304c8b5424304c8b4c247049b8a84c0bc9a37f00004889d3488b542448909090ff1259488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c2498d47b8483b45107303ff55404989c748c740f808000000488b5c245048895838488b7424584889703048c7402803000000488b7c2408488978204889481848c7401001000000594883c40848894808488910c250009090909000000000000000005801000000000000|@3355,1048575,@15997|70,0,@3346 145,0,@3352 3346:D6,264|483b65187303ff5548488b4a28f6c10174134889c348b8c0e406c9a37f0000488b5d08ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbf6a016a01524c8b52204c8b4a184c8b4210488d5c24084889c890ff15b2000000488b44240848833801743a488b0c24488b5908488b4008909090ff159a000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb034889c1488b04244989ca488b58084883c410589090ff15620000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c8910c39090909090909000000000000000000001000000000000|@3348,1048575,@15992,@3349,@2226,@3347|23,0,@578 3347:D4,112|483b65187303ff5548a80175454989d84c8b48084c89c3488b009090ff1566000000504c89c34c89c8e8d2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,255,@15994,@2226| 3348:S77|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829636c6f73757265526566283129 3349:D3,400|483b65187303ff5548488338017536498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010300000048890b48c743080100000048c7c001000000c348833803752953488b40084c89c290ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c34883380775315348c7c0010000004c89ca909090ff12488b0c2448ba484c0bc9a37f00004889114889410848c7c0010000004883c408c3488b4808f6c10174084883f9017d08eb1ff641ff107519498b12f6c101740af6c2017405483bcaeb05ff5570ebf67c164889c248b838e407c9a37f0000488b5d08909090ff13f6c10174064883c1027105ff5570ebf5498b4c8afc4883f9017536498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010300000048890b48c743080100000048c7c001000000c3488b01498d57e8483b55107303ff55404989d748c742f802000000488b304889720848c70201000000488913488b50084889530848c7c001000000c3909000000000000000008801000000000000|@3351,1048575,@15993|144,0,@3350 224,0,@1493 3350:O2|1,@544 3351:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352966696e6442696e64696e67283129 3352:O1|@3353 3353:D3,24|48c7c001000000c300000000000000001000000000000000|@3354,1,@15995| 3354:S81|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f7375726528382970726f636573736564426f64792d283129 3355:S64|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f647928352970726f636573734c616d62646157697468436c6f73757265283829 3356:D4,192|483b65187303ff5548a801756e41514150ff70085349c7c001000000488b442410909090ff15ae000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424184889510848890158a80174064883c0027105ff5570ebf5514989d14c8b4424104889c3488b4424089090e88affffff4889c1eb05e925000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c39090900000000000000000b800000000000000|@3379,1048575,@16012,@2178| 3357:S51|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d62646173283129 3358:D3,120|483b65187303ff5548a801754d488b084883790801750c488b48084889c8e9ddffffff488b5108ff32488b58084889d890e8caffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007000000000000000|@3359,15,@15999| 3359:S20|4c6973742e6d61705061727469616c2832292829 3360:D4,112|483b65187303ff5548a80175454989d84c8b48084c89c3488b009090ff1566000000504c89c34c89c8e8d2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,255,@16000,@2226| 3361:D3,96|483b65187303ff5548a8017536488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848b940cd06c9a37f0000488908c348c7c001000000c3909090909000000000000000005800000000000000|@1363,3,@16001|55,0,@441 3362:D4,216|483b65187303ff5548a801756f488b0841524151415053ff70084152ff742468ff742468ff742468ff742468ff742468ff742468ff7424684d89ca4d89c14989d8488b5908488b01ff15a200000050ff742468ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450eb05e93b000000488b5c2448488b4424409090e86effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2380048c7c001000000c2380090900000000000000000d000000000000000|@1363,1048575,@16006,@3363| 3363:D6,632|483b65187303ff554848c7c101000000488b5020f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc51ff355102000053ff7038ff7030ff7008ff7020ff30ff70184151415251488d5c24504c89c09090ff1532020000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57a8483b55107303ff55404989d748c742f80a00000048bb98540bc9a37f000048891a4889420848894a105b48895a18488b9c248800000048895a205e48897228488bb4249000000048897230488bbc248800000048897a3841584c89424041584c894248488062ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049b990590bc9a37f00004d890849894008498060ffbf51ff742468ff7424684c8b5424684c8b4c24304889d3488b442418488b9424800000009090ff12594883c408488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d148837c2440017506488b1424eb1e4889ce4889c7488b5c2440488b0424ff15e20000004889c24889f14889f8498d5fb8483b5d107303ff55404989df48c743f808000000488b7424184883c40848897338488b7424084889733048c74328030000004889532048894b1848c7431001000000594883c41048894b0848890348833c2401750948c7c001000000eb07488b0424488b004889c1498d47e0483b45107303ff55404989c748c740f803000000488958104889480848c700010000004883c418c240009090909090909000000000000000007002000000000000|@3374,1048575,@16007,@3375,@1354,@3373|163,0,@3364 271,0,@3371 3364:D8,584|483b65187303ff5548488b4a48f6c10174134889c348b8c0e406c9a37f0000488b5d08ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbf488339057566488b4240a8017532488b18f6c3017509f64108017503ff5570483b5908750948c7c603000000eb19488b58084889d8483b65187303ff5548ebca48c7c6010000004883fe0174554989d0498b58104889c8909090ff15b2010000498d4fd0483b4d10730aeb05e931000000ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f8020000004d8b40084c894008488908c36a016a01524c8b52384c8b4a304c8b4228488d5c24084889c8909090ff1556010000488b44240848833801743a488b0c24488b5920488b4008909090ff153e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb034889c1488b04244989ca488b5820488b4424109090ff150601000049833a017470498b4a084883390374134889c248b830570bc9a37f0000488b5d08ff13488b1424488b5908f6c3017410f6421801740a488d5bff48035a187105ff5570ebf1498d77d0483b75107303ff55404989f748c746f80200000048895e0848c70601000000488d5e1848c743f802000000eb05e90d0000004889730848c70303000000eb034c89d3488b0c244889df488b59184883c418ff156e0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488938c390909000000000000000004002000000000000|@3369,1048575,@16002,@2226,@3349,@2226,@3370,@3368|23,0,@578 391,0,@3365 3365:O4|@20055,@557,@3367,@3366 3366:O5|@3162,415,0,415,0 3367:S8|6d6170546f417267 3368:D3,192|483b65187303ff5548a801756f488b08488339037417488b500848b830570bc9a37f0000488b5d08909090ff13488b5108f6c201740ef6c3017409488d52ff4803d37105ff5570ebf2498d77e8483b75107303ff55404989f748c746f8020000004889560848c7060100000056488b48084889c890e886ffffffeb05e9240000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090900000000000000000b800000000000000|@1363,31,@16004|28,0,@3365 3369:S82|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229636c6f73757265526566283129 3370:D4,112|483b65187303ff5548a80175454989d84c8b48084c89c3488b009090ff1566000000504c89c34c89c8e8d2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,255,@16003,@2226| 3371:D3,24|488b4208c390909000000000000000001000000000000000|@3372,5,@16005| 3372:S84|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563757273697665526566283129 3373:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16009| 3374:S69|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229 3375:D3,80|a8017410f6420801740a488d40ff480342087105ff5570ebf14889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c300000000000000004800000000000000|@3376,7,@16008| 3376:S80|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831297472616e73666f726d4c616d626461283229726563417267732d283129 3377:D3,120|483b65187303ff5548a8017551488b084883790801750948c7c201000000eb0a488b5108488b1a4889da52488b48084889c8909090e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007000000000000000|@1363,15,@16010| 3378:D3,160|483b65187303ff5548a801756e498d4fd0483b4d107303ff55404989cf48c741f802000000488b104889510848c70105000000488d591848c743f80200000048894b0848c7030900000053488b48084889c8909090e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e90500000059488908c348c7c001000000c390909000000000000000009800000000000000|@1363,15,@16011| 3379:S61|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f64792835296c6966744c616d626461732831296765744974656d283229 3380:D4,160|483b65187303ff5548a801756e488b0853ff7008ff7108488b019090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151488b5c2410488b442408e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908eb05e901000000c348c7c001000000c39090909090909000000000000000009800000000000000|@1363,1048575,@16013,@3169| 3381:D3,160|483b65187303ff5548a801756e498d4fd0483b4d107303ff55404989cf48c741f802000000488b104889510848c70109000000488d591848c743f80200000048c743080300000048890b53488b48084889c8909090e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e90500000059488908c348c7c001000000c390909000000000000000009800000000000000|@1363,15,@16014| 3382:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16015| 3383:D4,160|483b65187303ff5548a801756e488b0853ff7008ff7108488b019090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151488b5c2410488b442408e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908eb05e901000000c348c7c001000000c39090909090909000000000000000009800000000000000|@1363,1048575,@16016,@3169| 3384:D3,160|483b65187303ff5548a801756e498d4fd0483b4d107303ff55404989cf48c741f802000000488b104889510848c70109000000488d591848c743f80200000048c743080300000048890b53488b48084889c8909090e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e90500000059488908c348c7c001000000c390909000000000000000009800000000000000|@1363,15,@16017| 3385:S37|434f4445545245455f4c414d4244415f4c49465428292e70726f63657373426f6479283529 3386:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17376| 3387:S48|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e636f646547656e6572617465283329 3388:D5,160|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000006a016a01415051ff357f000000488d54241852415141524989ca4989d949b820630bc9a37f000048bbb0640bc9a37f0000909090ff155a00000058488b00488b0c24488b54240848891148894108488b4424104889411048c7c0010000004883c418c39000000000000000009800000000000000|@3505,2097151,@16067,@3506,@3399|75,0,@3389 85,0,@3396 3389:O1|@3390 3390:D3,40|48b880630bc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@3395,1,@16021|2,0,@3391 3391:O4|@20055,@557,@3393,@3392 3392:O5|@3394,1431,0,1431,0 3393:S31|6f75746572206c6576656c207265616368656420696e20636f7079436f6465 3394:S63|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f5354415449435f4c494e4b5f414e445f43415345532e736d6c 3395:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229746f704c6576656c283129 3396:O1|@3397 3397:D3,40|48b880630bc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@3398,1,@16022|2,0,@3391 3398:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836292d45 3399:D9,1072|488dbc2458ffffff483b7d187303ff555041f6c10174084983f9017d09eb1f41f641ff10751841f6c101740b4c3b0df50300007c1ceb0741f641ff1075134889c148b820f007c9a37f0000488b5d08ff134c89c9f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c890f41f6c10174084983f9017d09eb1f41f641ff10751841f6c101740b4c3b0d5e0300007c19eb0741f641ff10751048b820f007c9a37f0000488b5d08ff134c89c8a80174064883c0027105ff5570ebf54889c148c7c0010000004889fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c890f41f6c10174084983f9017d09eb1f41f641ff10751841f6c101740b4c3b0dc80200007c1beb0741f641ff10751248b820f007c9a37f0000488b5d089090ff134c89c8a80174064883c0027105ff5570ebf54889c148c7c0010000004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c890f48833a057555ff7210565748b8f0690bc9a37f000050ff742428415341524c8b5424584d89c14989d8488b5c24484889d048ba006a0bc9a37f0000909090ff1546020000488b4c2420488901584889410848c7c001000000c2200048833a15757157ff7210565748b8f0690bc9a37f000050ff742430415341524c8b5424604d89c14989d8488b5c24504889d048ba006a0bc9a37f0000909090ff15f2010000504c8b442420488b5c2410488b4424089090ff15e2010000488b4c24305a4883c4104889114889410848c7c001000000eb05e903000000c2200048833a0f756e488b42086a016a016a016a01415356415053ff7028ff7030ff7038488d4c243851534150ffb42490000000565748b9f0690bc9a37f000051ffb424a0000000ffb424a00000004c8b50204c8b48184c8b4010488b5808488b084889c89090ff155e010000ff742460ff742418eb05e9a2000000ff7424284c8b5424204c8b4c241849c7c003000000488b5c2440488b442438ff1532010000f644243801740948c7c101000000eb53498d4fc0483b4d107303ff55404989cf48c741f80400000048c7411801000000488b5424384889511048c741088b000000488b5424484889114889cb488d492848c741f80200000048c7410801000000488919488b5424584883c44048890248894a0848c7c001000000c22000565748b8f0690bc9a37f000050ff742420415341524c8b5424504d89c14989d8488b5c24404889d048ba006a0bc9a37f0000909090ff1582000000488b4c241848890148c741080100000048c7c001000000c2200000000000000000001004000000000000fdffffffffffff01fdffffffffffff01fdffffffffffff01|@3510,2097151,@16069,@3403,@3403,@3508,@3414,@3443,@3403|67,0,@1509 207,0,@1509 349,0,@1509 459,0,@3400 497,0,@3401 551,0,@3400 589,0,@3401 717,0,@3400 951,0,@3400 989,0,@3401 3400:O1|@3399 3401:O2|@3403,@3402 3402:O2|@3487,@3401 3403:D22,3440|488dbc2440ffffff483b7d187303ff5550488b0848be566a0bc9a37f0000488d748efcffe690e92a060000909090e915070000909090e953070000909090e95b000000909090e975070000909090e9b0070000909090e945080000909090e995080000909090e931090000909090e936090000909090e988090000909090e9290b0000909090e9700b0000909090e90e0c0000909090e96a0c0000909090488b48104883390f7573ff701841524151415053ff71084152ff742468ff742468ff742468ff742468ff742468ff7424684d89ca4d89c14989d84889d3488b48084889c89090ff159e0c0000488b0c246a016a016a016a0150ff7128ff7130ff7138488d54242052ff742458ff742468ff742478ffb424c0000000eb05e9a1000000ffb424c0000000ffb424c0000000ffb42480000000ffb424c80000004c8b51204c8b49184c8b4110488b5908488b0190ff153a0c0000ff742448ffb42490000000ff7424784c8b5424584c8b4c24504c8b442430488b5c2428488b4424209090ff15120c00004889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424504889501848894810594883c4504889480848c7000b000000c23000488339057565488b711040f6c601753e488b3e4c8b1f4c3b5c2418751f4d8d67f04c3b65107303ff55404d89e749c74424f80100000049893c24eb194c8b66084c89e6483b65187303ff5548ebbc49c7c40100000041f6c4017533498b3424488b3e483b7c2418741feb05e9bc0000004c8b58184c8b680848b878e107c9a37f0000488b5d08ff134c8b5e10eb0749c7c301000000ff7018ff7110ff71084152ff742450ff742450ff74245053ff742458ff74245852ff7424604d89ca4d89c14d89d8488b580848c7c00100000090ff150a0b0000498d4fb8483b4d107303ff55404989cf48c741f803000000488b542408488951105a4883c4084889510848c701070000004889c2488d412048c740f8040000005b48895818488948104889500848c7000b000000c2300048833909756a488b710848833e077565ff7018415241514150ff742450ff7424385253ff742468ff742468ff742468ff742460488b580848c7c00100000090ff15760a000050ff742458ff7424404c8b5424284c8b4c24204c8b44241848c7c30100000048b880da06c9a37f0000eb0ae93f020000e95600000090ff15420a0000498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c7010d000000488d411848c740f804000000488b5424204889501848894810594883c4204889480848c7000b000000c2300048833e0375326a016a01ff70184152415141505352ff7008564c8d44244048c7c301000000488b4608488b54242090ff12488b442448eb5c48833e07745b48833e01745a488b7e0840f6c70174084883ff017d08eb26f647ff1075204c8b5c24284d8b1b40f6c701740b41f6c3017405493bfbeb05ff5570ebf67c2c4c8b58184c8b600848b838e407c9a37f0000488b5d08eb0fe974000000e949000000e92d000000909090ff1340f6c70174064883c7027105ff5570ebf54c8b5c2428498b7cbbfc4c8b60184c8b68084889f8eb2c488b78184c8b580848c7c0010000004989fc4d89ddeb15488b78184c8b580848c7c0010000004989fc4d89dd6a016a0141544152415141505352415556ff742430ffb42488000000ffb42488000000ffb42488000000ff742438ffb42490000000ffb42490000000ff742448ffb424980000004c8b5424704c8b4c24684989c0488b5c245048c7c001000000909090ff159608000050ffb42488000000ff7424704c8b5424484c8b4c24404c8b44243848c7c301000000488b442418909090ff156e080000498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c7010d000000488d411848c740f804000000488b5424404889501848894810594883c4504889480848c7000b000000c23000ff70184152415141505352514152ff742470ff742470ff742470ff742470ff742470ff7424704d89ca4d89c14989d84889d3488b400890ff15ea07000050ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424604c8b4c24584c8b442450488b5c2448488b442438488b542440e8e6f9ffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424384889501848894810594883c4384889480848c7000b000000c230004d89d6415141505352ff7010ff70084c8b5424584c8b4c24404c8b442460488b5c2438488b442408909090ff154a070000415650ff742470ff742470ff742470ff742470ff742470ff7424704d89f24c8b4c24684c8b442460488b5c2458488b442440488b542450e83ef9ffff50ff742440ff742418ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b5424784c8b4c24704c8b442468488b5c2448488b4424609090ff15c20600004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4404889480848c70001000000c2300041514152ff742440ff742440ff742440ff742440ff742440ff7424404d89c24989d94c8b4018488b5810488b48084889c8488b5208909090ff12594883c43051ff2552060000488b4810488b5008498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70007000000c23000ff742430ff74241848c7c303000000488b400890ff150e0600004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000d000000c230004152415141505352ff7008ff742460ff742460ff742460ff742460ff742460ff742460488b4010909090e8cef7ffff50ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c2448488b442438488b542440e892f7ffff4889c1498d47e0483b45107303ff55404989c748c740f8030000005a4883c430488950104889480848c70011000000c2300052ff7010ff742440ff742440ff742440ff742440ff742440ff742440488b400890e83af7ffff4889c1498d47e0483b45107303ff55404989c748c740f8030000005a4883c408488950104889480848c7000f000000c23000488b48086a016a016a016a01415241514150ff7128ff7130ff7138488d54243052415041514152ffb424a0000000ffb424a0000000ffb424a000000053ffb424a80000004c8b51204c8b49184c8b4110488b5908488b0190ff159a040000488b442468488b4c2448488b5424104889542468488944246048894c24584c8b54240841594883c41049c7c003000000488b5c2408584883c4185a4883c41852ff255c04000048b860780bc9a37f0000c230004152ff742438ff742438ff742438ff742438ff742438ff7424384d89ca4d89c14989d84889d3488b400890ff15260400004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70017000000c23000498d4fd0483b4d107303ff55404989cf48c741f802000000488b70104889710848c70105000000488d791848c747f80200000048c747080100000048890f4883ff017509488b48084889c8eb1c4989db4989d44889fb488b48084889c8ff15a20300004c89db4c89e25253415041514152ff742448ff7424484c8b5424604c8b4c24484c8b442468488b5c2440ff157a0300006a016a0148c7c101000000a80174144889c248b870780bc9a37f0000488b5d0890ff134883780801756f488b1048833a03741048b8f8780bc9a37f0000488b5d08ff1348c7c301000000f6c1017534498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1948891e4889f3488b4908483b65187303ff5548ebc74889d94889e348890b4889e1488b5a0848895908eb37498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548e93bffffff48833c240175084883c40858c23000498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810488b0c244889480848c700190000004883c410c2300052ff742438ff742438ff742438ff742438ff742438ff742438488b4008e832f4ffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c7001b0000004883c408c230004152415141505352ff7010ff7008ff742468ff742468ff742468ff742468ff742468ff742468488b4018e8d6f3ffff50ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c2450488b442438488b542448e89af3ffff4889c1498d47d8483b45107303ff55404989c748c740f8040000005a4883c408488950185a4883c428488950104889480848c7001d000000c2300052ff7018ff7008ff742448ff742448ff742448ff742448ff742448ff742448488b401090e836f3ffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4104889480848c7001f000000c230004152ff742438ff742438ff742438ff742438ff742438ff7424384d89ca4d89c14989d84889d3488b400890ff15e20000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70021000000c23000900000000000000000680d000000000000|@3412,2097151,@16023,@3413,@3414,@3443,@3448,@3450,@3446,@3451,@3446,@3452,@3453,@3456,@3458,@3446,@3414,@3443,@3466,@3467,@3468,@3411|22,0,$3403+38 571,0,@1486 851,0,@544 1091,0,@1493 2462,0,@3404 2730,0,@3405 2763,0,@3408 3404:O1|10 3405:O4|@20055,@557,@3407,@3406 3406:O5|@3394,1062,0,1062,0 3407:S30|64656353657175656e63655769746846696e616c4578703a20656d707479 3408:O4|@20055,@557,@3410,@3409 3409:O5|@3394,1064,0,1064,0 3410:S46|64656353657175656e63655769746846696e616c4578703a206c617374206973206e6f742061204e756c6c446563 3411:D3,224|483b65187303ff5548a801756e41524151415053ff7008ff742458ff742458ff742458ff742458ff742458ff7424584c8b9424900000004c8b4c24504c8b442448488b5c2440488b00488b5424389090ff1250ff742468ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c2458eb05e9400000004c8b442450488b5c2448488b4424409090e86affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2380048c7c001000000c238009090909090900000000000000000d800000000000000|@1363,1048575,@16062| 3412:S74|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129 3413:D3,256|483b65187303ff5548a8017570488b0841524151415053ff7008ff7108ff742460ff742460ff742460ff742460ff742460ff7424604c8b9424980000004c8b4c24584c8b442450488b5c2448488b01488b542440ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151ff742468eb05e962000000ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c2448488b4424409090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2380048c7c001000000c2380090900000000000000000f800000000000000|@1363,1048575,@16024| 3414:D4,968|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fe8483b7d107303ff55404989ff48c747f80200000049b818800bc9a37f00004c890748897708488067ffbf4d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c7000100000049bbd8800bc9a37f00004d891849c7c0010000004d89d341f6c301752041f6c00174064983c0027105ff5570ebf54d8b5b08483b65187303ff5548ebda41f6c00174084983f8017d09eb1f41f640ff10751841f6c001740b4c3b059d0200007c1ceb0741f640ff1075134989c348b820f007c9a37f0000488b5d08ff134d89c341f6c30174064983c3027105ff5570ebf54989cc4c89d94989c348c7c0050000004989fd488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c8907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000006a016a014889d9498d5fb0483b5d107303ff55404989df48c743f80900000049b8a0830bc9a37f00004c89034c894b084c89631048895318488b542450488953204c8b4424484c8943284c8b4c24404c894b304c8b7424384c897338488b54243048895340488063ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049b9f0880bc9a37f00004d890849897808498060ffbf565150415257415441504c8d4424384150ff742460ff7424604989c24c8b8c24b80000004d89e84c89d8488b542478ff1258488b00488b0c24488b0948c7c2010000004883f90174664889cb4883eb024889ce4883ee024883e902f6c10174064883c1027105ff5570ebf5488b3c24488b4c8ffc4883f9017521498d4fe8483b4d107303ff55404989cf48c741f80200000048895108488931eb034889d14889ca4889d9483b65187303ff5548eb944889d34889c64883c4085890ff15ca00000059488b09498d57c0483b55107303ff55404989d748c742f80700000048c7423001000000488b7c247048897a2848894a204889421848c74210010000005848894208488b442408488902498d47e8483b45107303ff55404989c748c740f8020000004889500848c70013000000594883c410488b09488b5424484889024889720848894a1048895a1848c7c001000000c26000909090909090900000000000000000b803000000000000fdffffffffffff01|@3442,1048575,@16031,@3441|140,0,@3415 198,0,@3417 307,0,@1509 478,0,@3435 577,0,@3440 3415:D3,48|4883f801740b488b520848c7020300000048b880da06c9a37f0000c39090909000000000000000002800000000000000|@3416,5,@16025|19,0,@544 3416:S88|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382972656343616c6c283129 3417:O1|@3418 3418:D3,160|488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b8b0810bc9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833803750b48b888820bc9a37f0000c3f6c10174084883f9037c13eb06f641ff10750b48b808830bc9a37f0000c348b8707907c9a37f0000c3909090909000000000000000009800000000000000|@3434,3,@16026|25,0,@1326 42,0,@3419 72,0,@1326 89,0,@3426 119,0,@3430 130,0,@1326 3419:O5|0,0,0,@3421,@3420 3420:O2|@3424,0 3421:O2|@3422,0 3422:O2|0,@3423 3423:O5|@3394,1329,1329,0,0 3424:O2|3,@3425 3425:S7|54726943616c6c 3426:O5|0,0,0,@3421,@3427 3427:O2|@3428,0 3428:O2|3,@3429 3429:S10|547269436c6f73757265 3430:O5|0,0,0,@3421,@3431 3431:O2|@3432,0 3432:O2|3,@3433 3433:S8|547269556e726566 3434:S9|7072696e742d747269 3435:D4,96|483b65187303ff55484150ff7220ff7228ff7230ff7238ff72404c8b52184c8b4a104c8b42089090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005800000000000000|@3398,1048575,@16027,@3436| 3436:D4,568|483b65187303ff554841f6c00174164889c148b8c0e406c9a37f0000488b5d08909090ff134883f80175054d8b00eb1ea80174064883e8027105ff5570ebf54d8b4008483b65187303ff5548ebbb4983380375216a016a01415241514150498b40084c8d442418488b542450ff12488b442420eb5a4983380775206a016a014152415141504889d8488b542448909090ff1248c7c001000000eb5549833801751e6a016a01415241514150498b4008488b542440ff1248c7c001000000eb644883fb017463498b4008a801740feb05e9e40000004883f8017d08eb2af640ff107524488b4c2410488b09a8017411eb05e9c3000000f6c1017405483bc1eb05ff5570ebf67c1348b810f407c9a37f0000488b5d08909090ff13a80174124883c002eb0ae990000000e91e0000007105ff5570ebe9488b4c241048c74481fc0300000048c7c001000000eb0748c7c001000000498b4008a80174084883f8017d08eb23f640ff10751d488b4c2408488b09a801740af6c1017405483bc1eb05ff5570ebf67c1048b838e407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b4c2408488b4481fc6a016a01415241514150488b4c2408488b09488b542410488b124889c64c8b5424104c8b4c240841584883c4204889d34889c8909090ff1566000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80200000048897008488908c22800909090909000000000000000003002000000000000|@3438,1048575,@16028,@3437|20,0,@578 264,0,@1517 391,0,@1493 3437:D3,336|483b65187303ff5548a801754b4c3b00744b488b0848833901752149833801754e488b5108f6c201750a41f64008017503ff5570493b5008744feb52488339037532498338037554488b5108f6c201751641f6400801eb0ae994000000e9580000007503ff5570493b50087554eb4be961000000488339057534498338057555488b5108f6c201eb0ae92c000000e942000000751141f6400801eb05e9340000007503ff5570493b5008740eeb2748833907752149833807751bf6c301740deb05e90f0000004883eb027105ff5570ebf54889d8c3f6c30174064883eb027105ff5570ebf5488b48084889c8e90fffffff498b01498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c8901498909498b02a80174064883c0027105ff5570ebf5498902a80174064883e8027105ff5570ebf5c3909090909000000000000000004801000000000000|@3439,463,@16029| 3438:S85|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d62646128382970726576283229 3439:S104|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829707265762832296d616b65436c6f73757265456e747279283229 3440:D3,256|4883fb01756ea80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c154889c148b838e407c9a37f0000488b5d089090ff134889c1f6c10174064883c1027105ff5570ebf5488b5a08488b4c8bfc4883f903740e48c7c101000000eb15e90900000048c7c103000000eb0748c7c103000000a80174084883f8017d08eb22f640ff10751c488b5a08488b1ba801740af6c3017405483bc3eb05ff5570ebf67c164889c348b810f407c9a37f0000488b5d08909090ff13a80174064883c0027105ff5570ebf5488b520848894c82fc48c7c001000000c39090900000000000000000f800000000000000|@3398,15,@16030|57,0,@1493 188,0,@1517 3441:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@16032| 3442:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f70794c616d626461283829 3443:D4,336|483b65187303ff5548488338137568488b4808ff7128ff7120ff7118ff7108ff314150ff74243841504c89d24c8b5424504c89ce4c8b4c24584989d04889da4889f34889d0909090ff151a01000048c7c101000000a801753b498d57e8483b55107303ff55404989d748c742f80200000048894a08eb05e9bd000000488b0848890a4889d1488b4008483b65187303ff5548ebc14889c848833c2401751ea801750948c7c101000000eb0748c7c1030000004883f1024883f102eb0748c7c103000000498d57c0483b55107303ff55404989d748c742f80700000048894a30488b4c24284883c40848894a28488b4c241848894a20488b4c241048894a1848894210488b44240848894208584883c420488902498d47e8483b45107303ff55404989c748c740f8020000004889500848c70013000000c21800c218009090909000000000000000004801000000000000|@3445,1048575,@16033,@3444| 3444:D4,176|483b65187303ff5548a801756e41524151415053ff70084152ff7424404d89ca4d89c14989d8488b5c2440488b009090ff159200000050ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b44241890e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90f00000048894808594883c428488908c2100048c7c001000000c21000909090909090900000000000000000a800000000000000|@1363,1048575,@16034,@3446| 3445:S83|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f707950726f63436c6f73757265283329 3446:D3,400|483b65187303ff554848833803751b6a016a014c89c14989e0488b40084889caff12584883c408c2100048833807750e4889d84c89ca594883c41051ff22488338017535ff7008488b04244c89d29090ff12498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000c210004883fb01746d488b4808f6c10174084883f9017d08eb24f641ff10751e488b542410488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c1148b810f407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf5488b54241048c7448afc0300000048c7c101000000eb0748c7c101000000488b4808f6c10174084883f9017d08eb24f641ff10751e488b542408488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf5488b442408488b4c88fc498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c210009090909090909000000000000000008801000000000000|@3447,1048575,@16035|182,0,@1517 298,0,@1493 3447:S75|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296c6f6361646472283229 3448:D6,1016|488dbc2440ffffff483b7d187303ff55504883fb01750a48c7c001000000c24800488b0b488b1148833a0f756d4c89c640f6c6017529a8017508f606017503ff5570483b06750948c7c603000000eb16488b7608483b65187303ff5548ebd148c7c6010000004883f602488b7a086a016a016a016a01415241514150ff730850ff710856ff7728ff7730ff77384c8d5c2450415341514152eb05e931010000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d00000004c8b57204c8b4f184c8b4710488b5f08488b07ff152e030000ffb424a0000000ffb424a0000000ffb424800000004c8b5424484c8b4c24404c8b442418488b5c2458488b442450ff1502030000498d4fe8483b4d107303ff55404989cf48c741f8020000004883c4085a4889510848890158a80174064883c0027105ff5570ebf551ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b5424684c8b4c24604c8b442458488b5c2450909090e85afeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c440488908c2480048833a09756d4c89c640f6c6017529a8017508f606017503ff5570483b06750948c7c603000000eb16488b7608483b65187303ff5548ebd148c7c6010000004883f602415241514150ff730850ff7108ff742470ff7424504c8b9424880000004c8b4c24384c8b4424304889f3488b4208eb05e9bc000000ff15d2010000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c7010d000000488d411848c740f8020000005a4889500848890859f6c10174064883c1027105ff5570ebf550ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c24504889c8909090e826fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c24800415241514150ff730850ff7108ff742470ff742470ff742470ff742468ff742468ff7424604c8b9424a80000004c8b4c24584c8b442450488b9c24880000004889d0488b54247090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890158a80174064883c0027105ff5570ebf551ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c24509090e842fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c248000000000000000000f003000000000000|@3449,1048575,@16036,@3414,@3443,@3446| 3449:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e736572742831296d617041726773283229 3450:D4,544|483b65187303ff55484883fb01750a48c7c001000000c24000488b0b488b1148833a09756f488b720848833e01756aa8017509f64608017503ff5570483b4608740948c7c701000000eb0748c7c7030000004883f702415241514150ff730850ff7108ff742470ff7424704889fb4889f0909090ff15be010000498d4fd0483b4d107303ff55404989cf48c741f802000000eb0ae99f000000e99a0000004889410848c7010d000000488d411848c740f8020000005a4889500848890859f6c10174064883c1027105ff5570ebf550ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c24484889c8909090e8f2feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c24000415241514150ff730850ff7108ff742470ff742458ff742458ff742458ffb42488000000ff742460488b9c24880000004889d0488b94249000000090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890158a80174064883c0027105ff5570ebf551ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c24489090e81efeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c240009090909000000000000000001802000000000000|@3449,1048575,@16037,@3446| 3451:D6,1016|488dbc2440ffffff483b7d187303ff55504883fb01750a48c7c001000000c24800488b0b488b1148833a0f756d4c89c640f6c6017529a8017508f606017503ff5570483b06750948c7c603000000eb16488b7608483b65187303ff5548ebd148c7c6010000004883f602488b7a086a016a016a016a01415241514150ff730850ff710856ff7728ff7730ff77384c8d5c2450415341514152eb05e931010000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d00000004c8b57204c8b4f184c8b4710488b5f08488b07ff152e030000ffb424a0000000ffb424a0000000ffb424800000004c8b5424484c8b4c24404c8b442418488b5c2458488b442450ff1502030000498d4fe8483b4d107303ff55404989cf48c741f8020000004883c4085a4889510848890158a80174064883c0027105ff5570ebf551ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b5424684c8b4c24604c8b442458488b5c2450909090e85afeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c440488908c2480048833a09756d4c89c640f6c6017529a8017508f606017503ff5570483b06750948c7c603000000eb16488b7608483b65187303ff5548ebd148c7c6010000004883f602415241514150ff730850ff7108ff742470ff7424504c8b9424880000004c8b4c24384c8b4424304889f3488b4208eb05e9bc000000ff15d2010000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c7010d000000488d411848c740f8020000005a4889500848890859f6c10174064883c1027105ff5570ebf550ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c24504889c8909090e826fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c24800415241514150ff730850ff7108ff742470ff742470ff742470ff742468ff742468ff7424604c8b9424a80000004c8b4c24584c8b442450488b9c24880000004889d0488b54247090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890158a80174064883c0027105ff5570ebf551ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c24509090e842fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c248000000000000000000f003000000000000|@3449,1048575,@16038,@3414,@3443,@3446| 3452:D3,256|483b65187303ff5548a8017570488b0841524151415053ff7008ff7108ff742460ff742460ff742460ff742460ff742460ff7424604c8b9424980000004c8b4c24584c8b442450488b5c2448488b01488b542440ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151ff742468eb05e962000000ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c2448488b4424409090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2380048c7c001000000c2380090900000000000000000f800000000000000|@1363,1048575,@16039| 3453:D4,144|483b65187303ff5548a8017569488b08488b114c89d64c89cf4d89c34989dc4c8b68084989f24989f94d89d84c89e3488b420890ff156e000000504989f24989f94d89d84c89e34c89e8909090e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008800000000000000|@1363,4095,@16040,@3454| 3454:D3,320|4889c1488b03488b13f6c20174064883c2027105ff5570ebf5488913f6c10174084883f9017d08eb1ff641ff107519498b10f6c101740af6c2017405483bcaeb05ff5570ebf67c154889c248b810f407c9a37f0000488b5d089090ff134889caf6c20174064883c2027105ff5570ebf549c74490fc01000000f6c10174084883f9017d08eb1ff641ff107519498b11f6c101740af6c2017405483bcaeb05ff5570ebf67c144889c248b810f407c9a37f0000488b5d0890ff134889caf6c20174064883c2027105ff5570ebf549894491fcf6c10174084883f9017d08eb1ff641ff107519498b12f6c101740af6c2017405483bcaeb05ff5570ebf67c144889c248b810f407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf549c7448afc01000000c3909090909000000000000000003801000000000000|@3455,463,@16041|77,0,@1517 170,0,@1517 258,0,@1517 3455:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836296d616b654465636c283129 3456:D3,296|483b65187303ff5548a8017565f6c3017565488b08488b11415241514150ff7308ff7008ff7108ff33ff742468ff742468ff742468ff742468ff742468ff7424684c8b9424a00000004c8b8c24a80000004c8b442460488b5c2458488b4210488b542450ff12498d4fe0483b4d10730feb0ae991000000e98c000000ff55404989cf48c741f803000000488b5424084889511048894108584883c40848890151ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c2450488b442448e822ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2400048c7c001000000c2400090909090909000000000000000002001000000000000|@3457,1048575,@16042| 3457:S17|4c697374506169722e6d61702833292829 3458:D4,856|483b65187303ff554848833803755af6402001755948c7c101000000488b5010f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c10174084883f9097f11eb06f641ff10740948c7c101000000eb6848c7c103000000eb64e9d6020000f64010017421488b4820488b5018488b5810488b700848b8e81f08c9a37f0000488b5d0890ff13488b4810488b11498d5fe8483b5d107303ff55404989df48c743f802000000488b7208488973084889336a016a01f6c101eb0ae9fd010000e9f8010000754e488b11488b7208483b337203488b33488b7a08483b7b087704488b7b08498d5fe8483b5d107303ff55404989df48c743f80200000048897b08488933488b51084889d1483b65187303ff5548eba14889e1488b134889114889e1488b73084889710848c7c101000000488b781040f6c701751ff6c10174064883c1027105ff5570ebf5488b7f08483b65187303ff5548ebdbf6c10174084883f90f7e64eb06f641ff107561488b7c240840f6c70174084883ff017d32eb06f647ff10742aff7020ff7018ff7010ff7008514889fb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb284c8b40204c8b48184c8b50104c8b58084889f841504151eb0ae9d5000000e9d00000004152415351488b4c2428f6c10174084883f9017d24eb06f641ff10741c504889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174084883f9017d11eb06f641ff10740948c7c001000000eb0748c7c0030000004883f8037410f6c10174064883e9047105ff5570ebf548c7c3070000004889c848ba90a9dc0000000000ff12a801740ef60424017408483b04247e10eb05ff5570ebf348c7c101000000eb1e48c7c103000000eb1548c7c101000000ff7020ff7018ff7010ff70086a014883c408eb106a016a01ff7020ff7018ff7010ff70084883f9017447498d47d0483b45107303ff55404989c748c740f805000000488b4c241848894820488b4c241048894818488b4c240848894810488b0c244889480848c700030000004883c430c34c8b4c24104c8b0424488b5c24184883c408584883c420ff252c000000c390909000000000000000005003000000000000|@3462,2097151,@16043,@3459|134,0,@1625 420,0,@376 430,0,I106 514,0,@376 524,0,I106 636,0,I109 3459:D5,536|483b65187303ff5548a8017564488b08f6c3017534498d57d8483b55107303ff55404989d748c742f804000000488b33488972184c894210488b790848897a0848c7021f000000eb684883fb037567498d57b0483b55107303ff55404989d748c742f80300000048c7421001000000eb05e989010000488b71084889720848c70207000000488d7a2048c747f80200000048c7470801000000488917488d571848c742f80200000048897a084c8902eb0ae9fe000000e94e000000488b394c8b50084889d0909090ff1562010000498d57d8483b55107303ff55404989d748c742f80400000048c742180300000048b908a60bc9a37f000048894a104889420848c7020b000000eb6f498d57b0483b55107303ff55404989d748c742f80300000048c7421001000000488b71084889720848c70207000000488d7a2048c747f80200000048c7470801000000488917488d571848c742f80200000048897a084c8902488b394c8b50084889d0ff15c6000000498d57d8eb05e93e000000483b55107303ff55404989d748c742f80400000048c742180300000048b928a60bc9a37f000048894a104889420848c7020b000000eb07488b394c8b500857524c89d090e83afeffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c240848894810594883c4084889480848c70005000000c34c89c8c3909090909000000000000000001002000000000000|@3464,511,@16044,@3465,@3463|240,0,@3460 411,0,@3461 3460:O3|3,I251,0 3461:O3|3,I113,0 3462:S81|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e7665727443617365283129 3463:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@16046| 3464:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f64652836297265636f6e76657274436173652831297265636f6e76657274283129 3465:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@16045| 3466:D3,256|483b65187303ff5548a8017570488b0841524151415053ff7008ff7108ff742460ff742460ff742460ff742460ff742460ff7424604c8b9424980000004c8b4c24584c8b442450488b5c2448488b01488b542440ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151ff742468eb05e962000000ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c2448488b4424409090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2380048c7c001000000c2380090900000000000000000f800000000000000|@1363,1048575,@16047| 3467:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16048| 3468:D18,1976|488dbc2438ffffff483b7d187303ff5550a8017568488b08488339017564488b71184889df4d89cb4d89d44d89c54c8b7120ff70084d89e24d89d94d89e84889fb488b4110909090ff15820700005056574153415441554156ff742478ff742478ff742478ff742478ff742478ff742478ff7424784d89e24d89d9eb0ae917070000e9030100004d89e84889fb488b442470909090e866ffffff50ff742410ff742420ff742468ff742468ff742440ff7424504c8b9424900000004c8b8c24980000004c8b8424a0000000488b9c24a8000000488b442438488b9424b0000000ff12498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424304889510848c70109000000498d57e0483b55107303ff55404989d748c742f80300000048894a10488b4c243848894a0848c70201000000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f8020000005b4883c440488958084889084889c1488d401848c740f80200000048894808488910c2380048833905756f53415141524150ff7108ff742460ff742460ff742460ff742460ff742460ff742460ff742460488b48084889c8e83efeffff50ff742410ff742420ff742450ff742450ff742440ff7424504c8b5424784c8b8c24800000004c8b842488000000488b9c2490000000488b442438eb05e9ba000000488b942498000000ff12488338197569498d4fd0483b4d107303ff55404989cf48c741f802000000488b50104889510848c70103000000488d591848c743f802000000488b34244889730848890b4883fb01750e488b48084889c84883c430c23800488b48084889c84883c430594883c43851ff255b050000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f802000000488b1424488950084889084883c430c2380048833907756e4989de415141524150ff7008ff71084c89f3488b04249090ff15fe040000ff742460ff742460ff742460ff742460ff742460ff742460ff7424604c8b5424504c8b4c24584c8b4424484c89f3488b442440e8e6fcffff50ff742420ff742448ff742470ff7424504c8b542438eb05e90c0100004c8b4c24684c8b442470488b5c2478488b44242890ff1596040000ff742450ff742450ff7424384c8b5424704c8b4c243049c7c00100000048c7c3010000009090ff15720400006a016a014889e3909090ff156a040000f60424017432488b442408909090ff155e04000048837c24100175074883c440c23800488b5c24104883c440594883c43851ff2542040000488b04249090ff153e040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701050000004989c8488b442408909090ff151204000048837c241001740c488b5c241090ff15060400004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89004883c440c23800488b511848833a0f756e4889de4c89cf4d89d34d89c44c8b68084c8b7110ff72084d89da4989f94d89e04889f34c89f090ff15ae030000488b0c246a016a016a016a015657415341544155504156ff7128ff7130ff7138488d54245052ffb424a8000000ffb424a8000000ffb424a800000041544153eb05e9d9010000ffb424b8000000ffb424e0000000ffb424c00000004c8b51204c8b49184c8b4110488b5908488b01ff1542030000488b0424a80174084883f8017d08eb23f640ff10751d488b4c2420488b09a801740af6c1017405483bc1eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b4c2420488b54245048895481fcffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004989ca4c8b4c24604c8b442450488b5c2468488b4424489090e862faffff48837c244801740948c7c103000000eb64488b0c24f6c10174084883f9017d08eb24f641ff10751e488b542418488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c154889c248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b542418488b4c8afc50ffb42480000000ff742428ff7424404c8b9424a00000004c8b8c24a80000004989c8488b5c2460488b442458ff15f2010000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424104889410848c70101000000498d47e8483b45107303ff55404989c748c740f8020000005a4883c46048895008488908c238004889de4c89cf4d89d34d89c44c8b68084989d64d89da4989f94d89e04889f3488b4110ff157e010000565741534154415650ff742468ff742468ff742468ff742468ff742468ff742468ff7424684d89da4989f94d89e04889f34c89e8909090e802f9ffff50ff742418ff742428ff742458ff742458ff742448ff7424584c8b9424800000004c8b8c24880000004c8b842490000000488b9c2498000000488b442440488b9424a0000000ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424084889410848c70101000000498d47e8483b45107303ff55404989c748c740f8020000005a4883c43048895008488908c2380048c7c001000000c2380090909090900000000000000000b007000000000000|@3470,1048575,@16049,@3454,@3471,@3472,@3473,@3476,@3479,@3480,@3481,@3482,@3486,@3469,@3454,@3414,@3443,@3454|1315,0,@1517 1513,0,@1493 3469:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16061| 3470:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129 3471:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16050| 3472:D4,144|483b65187303ff5548a8017565488b084c89d64c89cf4d89c34989dc4c8b68084989f24989f94d89d84c89e3488b4108ff1572000000504989f24989f94d89d84c89e34c89e8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,4095,@16051,@3454| 3473:D4,200|483b65187303ff5548a801756e488b0841524151415053ff700841514152ff742458ff742458ff742458ff7424584d89c24989d94c8b4110488b5908488b0190ff159a00000050ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b44242890e88affffff4889c1eb05e927000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c22000909090909090900000000000000000c000000000000000|@1363,1048575,@16052,@3474| 3474:D4,408|483b65187303ff55486a016a016a016a015341ff702841ff703041ff7038488d4424205041514152ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004d8b50204d8b4818498b4010498b4808498b104989c04889cb4889d09090ff153a01000048837c2418017469488b0424a80174084883f8017d08eb23f640ff10751d488b4c2450488b09a801740af6c1017405483bc1eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b4c245048c74481fc0300000048c7c001000000eb0748c7c001000000488b0424a80174084883f8017d08eb23f640ff10751d488b4c2448488b09a801740af6c1017405483bc1eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b4c2448488b54242048895481fc498d47e0483b45107303ff55404989c748c740f803000000488b54241048895010488b542408488950085a4883c420488910c230009090909000000000000000009001000000000000|@3475,1048575,@16053,@3414|179,0,@1517 291,0,@1517 3475:S103|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e73283129636f7079446563283329 3476:D5,608|483b65187303ff5548a8017569488b08488b11f6c20174084883fa017d08eb20f642ff10751a498b31f6c201740b40f6c6017405483bd6eb05ff5570ebf67c15488b700848b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5498b5491fc4883fa01746041524151eb05e95d01000053ff7008ff31ff7424384151ff7424404c8b5424584c8b4c243849c7c003000000488b5910488b4108ff15ce010000488b0c24f6c10174084883f9017d08eb2bf641ff107525488b542430488b12f6c1017411eb05e9b7000000f6c2017405483bcaeb05ff5570ebf67c134889c248b838e407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf5488b5424304883c408488b4c8afc498d5fe8483b5d107303ff55404989df48c743f8020000004889430848890b53ff742440ff742440524c8b5424384c8b4c243049c7c003000000488b5c2428488b4424209090e89efeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c21800498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c2418488b742410488b7c240848895c2418488974241048897c24084889d3488b48084889c8e928feffff4983f8017535488b442418488b4c2410488b54240848895424184c89d64d89ca4989c94989c04889df4889f34889f85e4883c41056ff256d000000488b442418488b4c2410488b542408488944241848894c2410488954240849c7c0010000004889de48c7c3010000004889f0e9b6fdffff90909090909000000000000000005802000000000000|@3478,1048575,@16054,@3443,@3477|70,0,@1493 235,0,@1493 3477:D4,312|483b65187303ff5548a801755e488b0841524151415053ff7008ff3141514152ff7424484d89c24989d949c7c001000000488b5910488b4108909090ff150e010000488b0c24f6c10174084883f9017d08eb2bf641ff107525488b542438488b12f6c1017411f6c201eb05e9a80000007405483bcaeb05ff5570ebf67c134889c248b838e407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf5488b5424384883c408488b4c8afc498d5fe8483b5d107303ff55404989df48c743f8020000004889430848890b53524c8b5424304c8b4c24284c8b442420488b5c2418488b442410e812ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2080048c7c001000000c2080090909090909000000000000000003001000000000000|@1363,1048575,@16055,@3443|131,0,@1493 3478:S111|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629696e73657274283129636f70794465636c61726174696f6e7328312970726f63657373436c6f7375726573283329 3479:D3,264|483b65187303ff5548a801756c488b08488b510848833a13740948c7c601000000eb0748c7c6030000006a016a01535156488d5c2418488b4008909090e8beffffff48833c2401744d498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b4c2408488908488b4c2410eb05e95e000000488901488b4424204889410848c7c0010000004883c428c3498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2408488908488b4c2410488b5424184889114889410848c7c0010000004883c428c348c7030100000048c743080100000048c7c001000000c3909090909000000000000000000001000000000000|@1464,31,@16056| 3480:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020100000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@16057| 3481:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16058| 3482:D3,176|483b65187303ff5548a8017568488b08488b510848833a137417488b580848b898bf0bc9a37f0000488b5d08909090ff13498d5fe8483b5d107303ff55404989df48c743f802000000488b720848897308488b3948893b534c8b40084c89c09090e89affffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090909090900000000000000000a800000000000000|@1363,127,@16059|32,0,@3483 3483:O4|@20055,@557,@3485,@3484 3484:O5|@3394,1024,0,1024,0 3485:S8|61734d757475616c 3486:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020100000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@16060| 3487:D7,1392|483b65187303ff55484151415250524150ff742458ff742458ff742458ff742458ff742458ff7424584c8b9424900000004c8b8c24980000004c8b4424484889d9488b5c24504889c8488b4a084889caff12488b0c2448833903754450ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424604c8b4c24684c8b4118488b5910488b4108488b54245090e862ffffffeb46488b54240850ff742460ff742460ff742460ff742460ff742460ff7424604c8b9424980000004c8b8c24a00000004c8b442450488b5c24584889c8488b4a084889ca9090ff12488b4c241050ff742468ff742468ff742468ff742468ff742468ff7424684c8b9424a00000004c8b8c24a80000004c8b442458488b5c2460488b442450488b510890ff12498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048bb78c60bc9a37f000048891a488b5c243048895a08488062ffbf4889114989c54c89e8909090ff15f6030000a801754c488b08488b142448833a037551488b5a08488b710848833b0d754848833e0d7557488b7b08483b7e08745248833f0175374c8b46084983380175554c8b4f0841f6c101751141f6400801eb05e92b0300007503ff55704d3b48087457eb5ae99d020000e9bb00000048833f0375394c8b460849833803eb0ae9a6000000e97400000075524c8b4f0841f6c1017511eb05e98500000041f64008017503ff55704d3b4808755deb4f48833f0575394c8b4608eb0ae93e000000e95d0000004983380575574c8b4f0841f6c101751141f6400801750aeb05e93f000000ff55704d3b48087412eb3448833f07752e488b760848833e077524498d77f0483b7510730aeb05e913000000ff55404989f748c746f80100000048893eeb5748c7c601000000eb4e48833b0f754148833e0f753b488b7b1040f6c7017509f64610017503ff5570483b7e10740948c7c601000000eb20488b7608488b7b084889fb483b65187303ff5548e9abfeffff48c7c601000000488b5910483b5a20750948c7c703000000eb39f6c301752df6422001751e488b7a204c8b034c3b07740948c7c701000000eb1948c7c703000000eb1048c7c701000000eb0748c7c70100000040f6c601756a4883ff037569498d77e8483b75107303ff55404989f748c746f802000000488b3948897e084c8b4424084c89064989d84c8b4a184c8b52084989f3488b4210ff15f2010000498d4fb8483b4d107303ff55404989cf48c741f802000000488941084c8919488d4118eb0ae92b000000e92600000048c740f8050000004c8940204c894818488948104c89500848c700030000004883c438c24000498d77e8483b75107303ff55404989f748c746f802000000488b3948897e084c8b4424084c89064d8d47e84c3b45107303ff55404d89c749c740f80200000049c7400801000000498930534150ff71084889d09090ff154a0100004889c1498d47d0483b45107303ff55404989c748c740f805000000488b5424104889502048894818488b4c240848894810594883c4104889480848c700030000004883c438c24000498d5fe8483b5d107303ff55404989df48c743f802000000488b3148897308488b7c240848893b498d7fb8483b7d107303ff55404989ff48c747f80200000048c747080100000048891f488d471848c740f805000000488b5910488958204889501848897810488b51084889500848c700030000004883c438c240004155488b442408909090ff157e0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c241048894810594889480848c700050000004883c438c2400090909000000000000000006805000000000000|@3502,2097151,@16064,@3503,@3501,@3458,@3458|359,0,@3488 3488:D3,632|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b818c90bc9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0b48890e488b5208488b124889f0909090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f8c90bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090909000000000000000007002000000000000|@3500,1048575,@16063|34,0,@1326 51,0,@3489 81,0,@1326 242,0,@883 321,0,@884 362,0,@835 495,0,@833 536,0,@3496 3489:O5|0,0,0,@3491,@3490 3490:O2|@3494,0 3491:O2|@3492,0 3492:O2|0,@3493 3493:O5|@3394,1127,1127,0,0 3494:O2|3,@3495 3495:S9|446966666572656e74 3496:O5|0,0,0,@3491,@3497 3497:O2|@3498,0 3498:O2|3,@3499 3499:S7|53696d696c6172 3500:S16|7072696e742d73696d696c6172697479 3501:D3,136|483b65187303ff5548a801755d488b08498d57e8483b55107303ff55404989d748c742f802000000488b590848895a08488b3148893252488b78084889f8909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,63,@16066| 3502:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e64283329 3503:D5,584|4883381f754e498d4fc0483b4d107303ff55404989cf48c741f801000000488b5018488911488d591048c743f80300000048894b10488b481048894b08488b7008488933488d432048c740f801000000488918c34883380b755e488b4810488339077559488b5108483b15f1010000740948c7c301000000eb0748c7c303000000483b15e0010000740948c7c601000000eb0748c7c6030000004883fb0175064883fe017450f6400801754f488b7008f64608017563eb0ae971010000e964010000488b7e0848837f080175654c8b064d8b0849833907755e4c8b1741f6410801745941f6410801751f48b8b8f309c9a37f0000eb0ae923010000e967000000488b5d08909090ff134883f3024d8d5fd04c3b5d10730aeb05e949000000ff55404d89df49c743f80300000049895b10eb0fe930000000e92b000000e91e000000498b1a49895b084d8b61084d8923498d432048c740f8010000004c8918c348c7c001000000c3f64008017554488b7008f6460801755f488b7e0848837f080175594c8b074d8b0849833907756a4c8b1641f6410801746541f6410801751248b8b8f309c9a37f0000488b5d089090ff134883f3024d8d5fd04c3b5d10730aeb05e950000000ff55404d89df49c743f803000000eb0ae93b000000e93600000049895b10498b1a49895b084d8b61084d8923498d4320eb0ae919000000e90c00000048c740f8010000004c8918c348c7c001000000c348c7c001000000c348c7c001000000c348c7c001000000c348c7c001000000c3909000000000000000004002000000000000|@3504,2047,@16065,I113,I251|236,0,@2708 417,0,@2708 3504:S87|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629636f7079436f6e6428332966696e6443617365283129 3505:S54|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229 3506:O1|@3507 3507:D3,24|48c7c001000000c300000000000000001000000000000000|@3398,1,@16068| 3508:D4,432|483b65187303ff55484883381d75554d89c14989d848bb00d10bc9a37f0000488b400890ff159e0100004889c1f6c101751df60101740f488b4908483b65187303ff5548ebe748c7c101000000eb0748c7c1030000004883f901740d48c7c001000000c3e95d000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000004889411048c741088b00000048b878b419f1a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488338097569488b4808488339057564488b5108f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1248b838e407c9a37f0000488b5d089090ff13f6c20174064883c2027105ff5570ebf5488b5493fcf6c2017414eb0ae95c000000e94f00000048c7c001000000c3498d5fc0483b5d107303ff55404989df48c743f80400000048c74318010000004889531048c743088b0000004c8903488d432848c740f80200000048c7400801000000488918c348c7c001000000c348c7c001000000c390900000000000000000a801000000000000|@3512,1048575,@16070,@3511|23,0,@3509 151,0,@20053 265,0,@1493 3509:O1|@3508 3510:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f6465283629 3511:D3,136|483b65187303ff5548a80175614151415053ff70084d89c8488b5c2410488b00488b542408909090ff12504c8b4c24204c8b442418488b5c2410488b4424089090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c3909000000000000000008000000000000000|@1363,1048575,@16071| 3512:S76|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7374617469634c696e6b416e644361736573283229636f7079436f646528362967657450726f7073283129 3513:D4,504|483b65187303ff554841f6c00174084983f8017d09eb1f41f640ff10751841f6c001740b4c3b05c50100007c1ceb0741f640ff1075134889c148b820f007c9a37f0000488b5d08ff134c89c1f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c890741f6c00174084983f8017d09eb1f41f640ff10751841f6c001740b4c3b052e0100007c19eb0741f640ff10751048b820f007c9a37f0000488b5d08ff134c89c0a80174064883c0027105ff5570ebf54889c148c7c0010000004889fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c8907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701030000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c7010100000049baa0d40bc9a37f00004d89114c8b0c244889042457514d89c24c89c84989d94989f048bb68e00bc9a37f00004889c14889d048ba78e00bc9a37f000051ff253c000000909090900000000000000000e001000000000000fdffffffffffff01fdffffffffffff01|@3639,2097151,@16118,@3552|59,0,@1509 199,0,@1509 402,0,@3514 437,0,@3549 453,0,@3550 3514:O1|@3515 3515:D3,888|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b8282707c9a37f0000eb6d488b104889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e48bf78bd19f1a37f0000488b3f51525648b8f0dd0bc9a37f00004889fa90ff124889c1584889ca909090ff12595af6c201740deb05e9990100004883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b490848890b48b978bd19f1a37f0000488b09505348b880de0bc9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810df0bc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b940df0bc9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b02807c9a37f0000488901498d47a0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000488d483048c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870df0bc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090909000000000000000007003000000000000|@3548,1048575,@16078|34,0,@1326 80,0,@847 148,0,@20142 164,0,@3531 252,0,@20142 267,0,@3534 320,0,@850 365,0,@833 406,0,@3537 447,0,@833 488,0,@834 561,0,@833 602,0,@3539 643,0,@862 754,0,@833 795,0,@3541 3516:O1|@3517 3517:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad0d80bc9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@115,7,@16075|29,0,@3518 3518:D5,64|483b65187303ff5548488b5208ff7208ff35420000004c8b40084889e3488b084889c890ff15360000004883c410c39000000000000000003800000000000000|@3527,1048575,@16072,@3528,@3519| 3519:D3,768|483b65187303ff554848b9ffffffffffffff00482348f8488d4c0901f6c10174064883e9027105ff5570ebf541f6c00174084983f8017f15eb0741f640ff10740c48b870dc0bc9a37f0000eb6341f6c001740af6c10174054c2bc17105ff5570ebf64983c001498d57e8483b55107303ff55404989d748c742f8020000004c89420848beb8dc0bc9a37f000048893248beffffffffffffff00482370f8488d7436015150534883fe01750a488b02eb67e9d10100004889f04883e8024889f14883e9024883ee02488b5c2408488b74b3fc48837a08017544488b5208f6c20174064883c2027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848ba70dc0bc9a37f0000488911eb64e966010000488b7a0840f6c70174084883ff017d3eeb06f647ff10743640f6c70174064883c7027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f8020000004889790848c70101000000eb6940f6c70174064883ef02710cff5570eb05e9ef000000ebee50ff7208ff32514889fb4889f0488b542420ff12488b0c24f6c101750af6442430017503ff5570483b4c24307460498d4fe8483b4d107303ff55404989cf48c741f802000000488b54240848895108eb05e99400000048baf04e06c9a37f0000488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b9104f06c9a37f000048890aeb05488b542408498d4fe8483b4d107303ff55404989cf48c741f802000000488951084889014883c41058a80174064883c0027105ff5570ebf54889ca498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488911eb0450eb01505e4889ca483b65187303ff5548e923feffff4883c418498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e8dc0bc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000c390909090900000000000000000f802000000000000|@3530,1048575,@16074|11,0,36028797018963967 67,0,@3520 132,0,@3523 145,0,36028797018963967 266,0,@3520 474,0,@152 515,0,@153 676,0,@3525 3520:O2|@3521,0 3521:O2|3,@3522 3522:S4|2e2e2e5d 3523:O2|@3524,0 3524:O2|3,93 3525:O2|3,@3526 3526:S9|66726f6d4c6973745b 3527:S7|61646450502d32 3528:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@3529,1048575,@16073| 3529:S18|566563746f722e7072657474792833292d45 3530:S16|566563746f722e707265747479283329 3531:O4|0,@3532,3,1 3532:O1|@3533 3533:D3,48|483b65187303ff554848b9b8b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2371,1048575,@16076|11,0,@20033 3534:O4|0,@3535,3,1 3535:O1|@3536 3536:D3,48|483b65187303ff554848b9b8b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2371,1048575,@16077|11,0,@20033 3537:O2|3,@3538 3538:S8|6c6f63616c73203d 3539:O2|3,@3540 3540:S6|61726773203d 3541:O5|0,0,0,@3543,@3542 3542:O2|@3546,0 3543:O2|@3544,0 3544:O2|0,@3545 3545:O5|@3394,218,218,0,0 3546:O2|3,@3547 3547:S8|5573616765536574 3548:S14|7072696e742d7573616765536574 3549:O1|@3513 3550:O3|@3552,@3625,@3551 3551:O2|@3633,@3550 3552:D24,5256|483b65187303ff5548488b0848becee00bc9a37f0000488d748efcffe690e922010000909090e989080000909090e9bd0e0000909090e9020f0000909090e92c0f0000909090e95b000000909090e9460f0000909090e9710f0000909090e9b50f0000909090e931100000909090e988100000909090e98d100000909090e9d4100000909090e971120000909090e9ac120000909090e932130000909090e982130000909090ff701841524151415053ff7010524152ff742458ff742458ff7424584d89ca4d89c14989d84889d3488b40089090ff15c613000050ff742458ff742458ff7424584c8b5424484c8b4c24404c8b442438488b5c2430488b442428488b542420e8f6feffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424384889501848894810594883c4384889480848c7000b000000c21800488b4c2408488b09f6c10174064883c1027105ff5570ebf5488b74240848890e488b36498b084883f901750c48b9909adc0000000000eb6f4889cf4889f94c8b58104c8b600848c7c0010000004989fd488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04c89c64889f94889cf4989ce4c89e948d1e94883c608f348a5488d7c3f01488d743601eb05e912000000488d4c0901498066ffbf4c89f14889c6eb084c8b58104c8b6008498b014883f801750c48b8909adc0000000000eb6d4889cf4889c14989c548c7c0010000004989fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04c89ce4889f94889cf514c89e948d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e916000000488b0c24488061ffbf4889c64889c84883c4084c89f1498d7fe8483b7d107303ff55404989ff48c747f80200000048894f08488907488b442410488b004883f801750c48b8909adc0000000000eb704889c14989c548c7c0010000004989fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424104889f94889cf514c89e948d1e94883c608f348a5488d7c3f01488d743601488d4c0901488b0c24eb05e912000000488061ffbf4889c64889c84883c4084c89f7488b4c2410488b0949c7c50100000041524c3be9720949c7c201000000eb314d89ea41f6c20174064983c2027105ff5570ebf54c8b7424184bc74496fc030000004983c502483b65187303ff5548ebc1488b4c2420488b094c8b54242049c702030000004d89dd41f6c501756e4d8b55004d8b3241f6c60174084983fe017d09eb2241f646ff10751b4d8b3041f6c601740d41f6020174074d3b327f1ceb05ff5570ebf44989c648b810f407c9a37f0000488b5d089090ff134d8b3241f6c60174064983c6027105ff5570ebf54bc744b0fc010000004d8b32eb05e97d00000041f6c60174084983fe017d09eb2741f646ff1075204c8b7424184d8b3641f6c601740d41f6020174074d3b327f1beb05ff5570ebf44989c648b810f407c9a37f0000488b5d0890ff134d8b1241f6c20174064983c2027105ff5570ebf54c8b7424184bc74496fc010000004d8b6d08483b65187303ff5548e90affffff49c7c201000000415141505352415356575051ff742468ff742468ff7424684c8b5424604c89e090e80efbffff4989c0488b5c2438488b44242090ff15a20f0000488b4c2438488b094883f901750c48b9909adc0000000000eb6d4889ca4889d14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b7424384889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004889c14889d8488b542440488b124883fa01750c48ba909adc0000000000eb6e4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424404889f94889cf4989c94889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000498061ffbf4c89ca4889d9498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488913488b4c24685a488911488b342448baffffffffffffff00482356f8488d54120148c7c70100000040f6c701740ef6c2017409488d7fff4803fa7105ff5570ebf24c8b4c24584d8b0940f6c701740b41f6c1017405493bf9eb05ff5570ebf67e164889c748b808f60bc9a37f0000488b5d08909090ff13488b7c24584889d148d1e94883c708f348a5488d7c3f01488d743601488d4c0901498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004889194889c2488d411848c740f80200000048894808488b4c24084889084150524c8b5424684c8b4c24704c8b442448488b5c245090ff156e0d0000a8017511f6400801750b488b4808488379080174164889c148b860f60bc9a37f0000488b5d08909090ff13f601017513488b0848b8d8f60bc9a37f0000488b5d08ff13488b10ff30f6c201752d488b7a084c8b4c24484c8b442428488b5c2450488b02909090ff150a0d00004889fa483b65187303ff5548ebce48c7c001000000488b5c2408488b44243048bab09b09c9a37f000090ff15e20c0000ff742458ffb42480000000ffb42480000000ffb424800000004c8b5424704c8b4c24684c8b442460488b5c245890ff15b60c00004889c3488b4424309090ff15ae0c00004889d94889c34889c848bab09b09c9a37f0000909090ff159a0c0000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424104889410848c70101000000f6042401740a4889c84883c460c21800498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048894810488b0c244889480848c700130000004883c460c21800498b084883f901750c48b9909adc0000000000eb704889ce4889f1488b78204c8b58084c8b60104c8b681848c7c0010000004989fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04c89c64889f94889cf514889c148d1e94883c608f348a5488d7c3f01eb05e91c000000488d743601488d4c0901488b0424488060ffbf4889c14883c408eb104c8b70204c8b68184c8b60104c8b5808498b014883f801750c48b8909adc0000000000eb6d4889ce4889c14889c748c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04c89ce4889f94889cf51488b4c240848d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e916000000488b0c24488061ffbf4889c64889c84883c4104889f141524151415053524156415350514154ff742468ff742468ff7424684c89e8909090e8d2f5ffff488b4c2438488b094883f901750c48b9909adc0000000000eb6d4889ca4889d14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b7424384889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004889c14889d8488b542440488b124883fa01750c48ba909adc0000000000eb6e4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424404889f94889cf4989c84889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000498060ffbf4c89c24889d9498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488913488b54240848b9ffffffffffffff0048234af8488d4c090148c7c60100000040f6c601740ef6c1017409488d76ff4803f17105ff5570ebf2488b7c2438488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67e164889c648b808f60bc9a37f0000488b5d08909090ff134889d6488b7c243848d1e94883c708f348a5488d7c3f01488d743601488d4c0901488b74241048b9ffffffffffffff0048234ef8488d4c090148c7c70100000040f6c701740ef6c1017409488d7fff4803f97105ff5570ebf24c8b4424404d8b0040f6c701740b41f6c0017405493bf8eb05ff5570ebf67e134889c748b808f60bc9a37f0000488b5d08ff13488b7c244048d1e94883c708f348a5488d7c3f01488d743601488d4c09015053ff742438ff742448ff742468ffb42490000000ffb42490000000ffb424900000004c8b9424800000004c8b4c24504c8b4424784889d3488b442440ff150e0800006a016a014889e3909090ff1506080000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b5424104889104c8b9424800000004c8b8c24880000004c8b442460488b5c2468909090ff15c2070000a80174134889c148b8582008c9a37f0000488b5d08ff134989c3498b5b0858909090ff15a2070000498d4fe8483b4d107303ff55404989cf48c741f8020000005a488951085a48891150f6c10175274c8b51084c8b442448488b5c2450488b019090ff156a0700004c89d1483b65187303ff5548ebd448c7c0010000004153ffb42480000000ffb42480000000ffb424800000004c8b5424784c8b4c24704c8b442468488b5c2460488b442448488b54245890e81af2fffff604240174154889c148b8e81f08c9a37f0000488b5d089090ff1359488339017507488b4c2408eb5f488b54240848833a1b75594889c3488b7210488b7a08488b01ff15da0600004883ff0174114989d84889fb9090ff15ce0600004c89c3498d4fe0483b4d107303ff55404989cf48c741f803000000488971104889410848c7011b000000eb40e93e0000004889c3488b01909090ff1596060000498d4fe0483b4d107303ff55404989cf48c741f803000000488b542408488951104889410848c7011b0000004889d84889c2498d47d0483b45107303ff55404989c748c740f805000000488b5c24304889582048894818594883c458488948104889500848c70003000000c21800488b4c2418488b742410488b7c24084c894c24184c8954241048894c24084c8b0c2448893424574d89c24d89c84989d94c89c34c8b40184989db488b58104c8b60084c89e0488b52104153ff22488b4810488b5008498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70007000000c21800488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c21800488b4c2408488b542418488b5c241048895c24184d89c24c89ce4989d14989f04889cb488b40085e4883c41056ff255405000052ff7010ff742428ff742428ff742428488b400890e81af0ffff4889c1498d47e0483b45107303ff55404989c748c740f8030000005a4883c408488950104889480848c7000f000000c218004152415141505352ff7008ff742448ff742448ff742448488b40109090e8c6efffff50ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b442420488b542428e896efffff4889c1498d47e0483b45107303ff55404989c748c740f8030000005a4883c430488950104889480848c70011000000c21800488b4808ff7128ff713053415041514152ff742448ff742448ff7424484c8b51204c8b49184c8b4110488b5908488b01488b5208ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70015000000c2180048b850f70bc9a37f0000c218004152ff742420ff742420ff7424204d89ca4d89c14989d84889d3488b40089090ff15fa0300004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70019000000c21800498d4fd0483b4d107303ff55404989cf48c741f802000000488b70104889710848c70103000000488d791848c747f80200000048c747080100000048890f4883ff017509488b48084889c8eb1c4989db4989d44889fb488b48084889c8ff15760300004c89db4c89e24152ff742420ff742420ff742420ff72084d89ca4d89c14989d84889d3909090ff15520300006a016a0148c7c101000000a80174144889c248b860f70bc9a37f0000488b5d0890ff134883780801756f488b1048833a03741048b8b8f70bc9a37f0000488b5d08ff1348c7c301000000f6c1017534498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1948891e4889f3488b4908483b65187303ff5548ebc74889d94889e348890b4889e1488b5a0848895908eb37498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548e93bffffff48833c240175084883c40858c21800498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810488b0c244889480848c7001b0000004883c410c2180052ff742420ff742420ff742420488b4008e8eeecffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c7001d0000004883c408c218004152415141505352ff7010ff7008ff742450ff742450ff742450488b4018e89eecffff50ff742458ff742458ff7424584c8b5424504c8b4c24484c8b442440488b5c2438488b442420488b542430e86eecffff4889c1498d47d8483b45107303ff55404989c748c740f8040000005a4883c408488950185a4883c428488950104889480848c7001f000000c2180052ff7018ff7008ff742430ff742430ff742430488b401090e816ecffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4104889480848c70021000000c218004152ff742420ff742420ff7424204d89ca4d89c14989d84889d3488b400890ff15f60000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70023000000c21800909090909000000000000000008014000000000000|@3567,2097151,@16079,@3568,@3570,@3571,@3581,@2561,@3586,@3587,@2561,@3588,@3589,@3571,@3591,@3598,@3596,@3600,@3594,@3601,@3603,@3604,@3605,@3566|14,0,$3552+30 371,0,I49 534,0,I49 727,0,I49 1041,0,@1517 1154,0,@1517 1302,0,I49 1448,0,I49 1630,0,36028797018963967 1716,0,@3553 1884,0,@3555 1911,0,@3558 1999,0,@2560 2093,0,@2560 2239,0,I49 2421,0,I49 2622,0,I49 2768,0,I49 2942,0,36028797018963967 3028,0,@3553 3085,0,36028797018963967 3171,0,@3553 3383,0,@1628 3569,0,@1625 4349,0,@3561 4602,0,@3562 4635,0,@3564 3553:O4|11,@42,0,@3554 3554:O5|@1357,210,0,210,0 3555:O4|@20055,@557,@3557,@3556 3556:O5|@3394,409,0,409,0 3557:S15|636f6d707574654b696c6c53657473 3558:O4|@20055,@557,@3560,@3559 3559:O5|@3394,410,0,410,0 3560:S14|4e6f74206b696c6c4265666f7265 3561:O1|11 3562:O4|@20055,@557,@3407,@3563 3563:O5|@3394,567,0,567,0 3564:O4|@20055,@557,@3410,@3565 3565:O5|@3394,569,0,569,0 3566:D3,176|483b65187303ff5548a8017572415241514150ff3053ff742448ff742448ff742448ff742448488b4008909090e8ceffffff50ff742448ff742448ff7424484c8b5424684c8b4c24404c8b442438488b5c2430488b442428488b542420909090ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90f0000005a4883c42848895008488908c2200048c7c001000000c220009090900000000000000000a800000000000000|@3569,1048575,@16111| 3567:S65|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129 3568:D3,200|483b65187303ff5548a801757341524151415053ff30ff742448ff742448ff742448ff742448488b4008909090e8ceffffff488b0c2450ff7108ff742450ff742450ff7424504c8b5424704c8b4c24484c8b442440488b5c2438488b01488b5424309090ff12498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e9230000005a48895108488901488d411848c740f8020000005a4883c42848895008488908c2200048c7c001000000c220009090909090900000000000000000c000000000000000|@3569,1048575,@16080| 3569:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296d617072696768742832292829 3570:D3,288|483b65187303ff5548a8017568488b08488b11f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c15488b700848b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5488b5493fc488b3140f6c601740feb05e98c0000004883fe017d08eb21f646ff10751b488b3b40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c16488b780848b810f407c9a37f0000488b5d089090ff1340f6c60174064883c6027105ff5570ebf548c744b3fc0100000052488b48084889c89090e81effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000001801000000000000|@1363,63,@16081|70,0,@1493 169,0,@1517 3571:D4,832|483b65187303ff55484883fb01750c48b9909adc0000000000eb6ff6c30174084883fb017e1eeb06f643ff107516f6c301740b483b1dfe0200007c1deb06f643ff1075154889c148b840ff0bc9a37f0000488b5d089090ff134889d94889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e9eb05e9da00000048894ff8c647ff4057f348ab5f48c7c001000000f6c3017409a8017405483bd8eb05ff5570ebf67e5e4889d148c7c601000000f6c10175684c8b19a801741c4d8b6b0849bcffffffffffffff004d2365f84f8d642401493bc472134989c448b8b0df06c9a37f0000488b5d08ff134d8b6c85fc4983fd01751840f6c60174064883c602710ceb05e943000000ff5570ebee4c8b59084c89d9483b6518730aeb05e905000000ff5548eb894889f148894c87fca80174064883c0027105ff5570ebf5483b65187303ff5548e945ffffff488067ffbf4889f94889d04d8b004983f801750c48ba909adc0000000000eb6941f6c00174084983f8017e21eb0741f640ff10751841f6c001740b4c3b05900100007c1feb0741f640ff1075164889c248b840ff0bc9a37f0000488b5d08909090ff134889ca4c89c14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d10720ceb05e9ef000000493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c00100000041f6c0017409a80174054c3bc0eb05ff5570ebf67e5e4889d948c7c601000000f6c10175684c8b19a801741b4d8b2b49bcffffffffffffff004d2365f84f8d642401493bc472144989c448b8b0df06c9a37f0000488b5d0890ff134d8b6c85fc4983fd01751840f6c60174064883c602710ceb05e943000000ff5570ebee4c8b59084c89d9483b6518730aeb05e905000000ff5548eb894889f148894c87fca80174064883c0027105ff5570ebf5483b65187303ff5548e944ffffff488067ffbf4889d04889fa4889c14889d848c7c3010000004889c640f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdb488b342448890c244989d84889d356ff25390000009000000000000000002803000000000000ffffffffffffff01ffffffffffffff01|@3575,8191,@16082,@3574|17,0,I49 73,0,@3572 212,0,36028797018963967 239,0,@560 372,0,I49 432,0,@3572 575,0,36028797018963967 602,0,@560 3572:O4|4,@103,0,@3573 3573:O5|@562,147,0,147,0 3574:D4,144|483b65187303ff5548a801756741524151415053ff7008ff742430488b009090ff158200000050ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b44241090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2080048c7c001000000c20800909000000000000000008800000000000000|@1363,8191,@16083,@3576| 3575:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129 3576:D4,520|483b65187303ff554848b9ffffffffffffff0048234bf8488d4c090148c7c20100000048c7c601000000483bf1735f4889f74883c7024c8b5cb3fc4983fb01745241f6c301750941f6c0017503ff55704d3bd8746440f6c601741c4c8b2049bbffffffffffffff004d235c24f84f8d5c1b01493bf372264c8b58084c8b2048b8b0df06c9a37f0000488b5d08eb0ae9e6000000e9d0000000909090ff134d8b5cb4fc4983fb0175614d8b194983fb01755d4883fe017535eb05e9aa0000004889d6498d57e8483b55107303ff55404989d748c742f8020000004889720848bef0020cc9a37f0000488932eb7040f6c60174064883ee027105ff5570ebf54d8d5fb04c3b5d10730feb0ae95a000000e955000000ff55404d89df49c743f8020000004989730849c70301000000498d731848c746f80300000048c74610030000004c895e0848c7060d0000004989d3488d562048c742f802000000eb05e9070000004c895a084889324889fe483b65187303ff5548e9b1feffff488b5c240848b9ffffffffffffff0048234bf8488d4c090148c7c60100000051ff700841504152483b742418720a4889d04883c420c208004889f04883c002488b4c2428488b4cb1fc4889c7ff34244c8b5424184c8b4c24104989d04889cb4889f090ff153e0000004889fe4889c2483b65187303ff5548ebad909090909000000000000000000002000000000000|@3579,8191,@16084,@3578|11,0,36028797018963967 96,0,36028797018963967 128,0,@560 223,0,@3577 384,0,36028797018963967 3577:O3|6,@544,1 3578:D3,320|4883fb01745af6c301750941f6c1017503ff5570493bd9745ea801741848b9ffffffffffffff0049234af8488d4c0901483bc172144889c148b8b0df06c9a37f0000488b5d0890ff134d8b5482fc4983fa017570a801740d4883f8017d0deb2fe96a000000f640ff107524488b4c2408488b09a801eb05e953000000740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b542408488b4c8afceb05e9060000004883f90174064c89c0c20800498d4fb0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80300000048c74010030000004889480848c7000d0000004889c1488d402048c740f8020000004c894008488908c2080000000000000000003801000000000000|@3580,463,@16085|31,0,36028797018963967 58,0,@560 148,0,@1493 3579:S93|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129 3580:S96|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f6d707574654b696c6c5365744c69737473283129636f6d707574654b696c6c73283129283329 3581:D3,344|4883380d74134889c148b8d8060cc9a37f0000488b5d08ff13488b4808488339077532488b13f6c20174084883fa017e08eb16f642ff10741048b810f407c9a37f0000488b5d08ff134c89430848c7c001000000c348833905755f488b5108f6c20174084883fa017d08eb1ff642ff107519498b19f6c201740af6c3017405483bd3eb05ff5570ebf67c1248b810f407c9a37f0000488b5d089090ff13f6c20174064883c2027105ff5570ebf54d894491fc48c7c001000000c348833901741148b8d8060cc9a37f0000488b5d0890ff13488b5108f6c20174064883c2027105ff5570ebf5f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1348b810f407c9a37f0000488b5d08909090ff13f6c20174064883c2027105ff5570ebf54c894493fc48c7c001000000c390909090909000000000000000005001000000000000|@3585,223,@16086|11,0,@3582 59,0,@1517 141,0,@1517 194,0,@3582 276,0,@1517 3582:O4|@20055,@557,@3584,@3583 3583:O5|@3394,421,0,421,0 3584:S14|4e6f7420616e2045787472616374 3585:S78|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129657874656e644c696665283129 3586:D3,232|483b65187303ff5548a801756d41524151415053ff30ff742448ff742448ff742448ff742448488b4008909090e8ceffffff488b0c24488b114883c40850ff7108ff32ff742450ff742450ff7424504c8b5424704c8b4c24484c8b442440488b5c2438488b4208488b542430ff12498d4fe0483b4d10730aeb05e94a000000ff55404989cf48c741f803000000488b5424084889511048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000005a4883c42048895008488908c2200048c7c001000000c2200090909090900000000000000000e000000000000000|@3569,1048575,@16087| 3587:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@16088| 3588:D3,840|483b65187303ff5548a8017565488b0848baffffffffffffff00482353f8488d54120148c7c60100000040f6c601740ef6c2017409488d76ff4803f27105ff5570ebf2498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67e1b488b700848b808f60bc9a37f0000488b5d08eb05e9b1020000ff134889de4c89c74c8b59084c8b214889d148d1e94883c708f348a5488d7c3f01488d743601488d4c090148b9ffffffffffffff00492349f8488d4c090148c7c201000000f6c201740ef6c1017409488d52ff4803d17105ff5570ebf2498b32f6c201740b40f6c6017405483bd6eb05ff5570ebf67e17488b500848b808f60bc9a37f0000488b5d08909090ff134c89ce4c89d748d1e94883c708f348a5488d7c3f01488d743601488d4c090141524151415053ff70084153ff742448ff742448ff7424484c8b5424684c8b4c2440488b5c24704c89e0488b54247890ff12488b4c2418488b094883f901750c48b9909adc0000000000eb6d4889ca4889d14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b7424184889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004889c14889d8488b542428488b124883fa01750c48ba909adc0000000000eb6e4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424284889f94889cf4989c84889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000498060ffbf4c89c24889d9498d5fb8483b5d107303ff55404989df48c743f80200000048894b08488913488d4b1848c741f8020000005a48895108488901488d411848c740f8020000004889580848890850ff742460ff742460ff742460ff742460ff742460ff7424604c8b5424584c8b4c24504c8b442448488b5c2440488b44243890e802fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2300048c7c001000000c2300090909090909000000000000000004003000000000000|@1363,1048575,@16089|18,0,36028797018963967 100,0,@3553 164,0,36028797018963967 244,0,@3553 358,0,I49 504,0,I49 3589:D3,184|483b65187303ff55484883f801751748c7030100000048c743080100000048c7c001000000c3488b086a016a0153ff7108ff31488d5c2418488b48084889c89090e8baffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c24184889480859488908498d4fe8483b4d107303ff55404989cf48c741f802000000488b542418488951085a488911488b142448890248894a0848c7c0010000004883c418c3900000000000000000b000000000000000|@3590,15,@16090| 3590:S17|4c697374506169722e756e7a6970283129 3591:D6,368|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13488b0848833b017505488b11eb66488b1148833a1b7562488b7008488b79084c8b42104c8b4a08488b0390ff150e0100004983f90174104c8b53084c89cb90ff1502010000eb044c8b5308498d57e0483b55107303ff55404989d748c742f8030000004c8942104889420848c7021b000000eb52e941000000488b7008488b79084989d0488b03ff15c2000000498d57e0483b55107303ff55404989d748c742f8030000004c8942104889420848c7021b0000004c8b5308eb0c488b79084c8b5308488b7008498d47e8483b45107303ff55404989c748c740f80200000048897808488910504c89d34889f0e8c6feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3909000000000000000006801000000000000|@3595,511,@16091,@3596,@3597,@3594|23,0,@3592 59,0,@3592 3592:O4|@20116,@2564,0,@3593 3593:O5|@2563,68,0,68,0 3594:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010300000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@16094| 3595:S19|4c697374506169722e6d617045712833292829 3596:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010300000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@16092| 3597:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16093| 3598:D3,408|488b0b48c7c201000000483bd173654889d640f6c60174064883c6027105ff5570ebf5488b74b3fcf6c201741b4c8b0848bfffffffffffffff00492379f8488d7c3f01483bd77219488b78084c8b0848b8b0df06c9a37f0000488b5d089090ff13498b7c91fc4883ff01742d4883fe01750ceb05e94b0000004889feeb1b40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c034889fe4889d740f6c70174064883c7027105ff5570ebf5488974bbfc4883c202483b65187303ff5548e946ffffff498b0848c7c201000000483bd1720c488b500848c7c001000000c34889d3f6c30174064883c3027105ff5570ebf5498b5c98fcf6c201741c488b780848beffffffffffffff00482377f8488d743601483bd67215488b700848b8b0df06c9a37f0000488b5d0890ff13488b7497fc4883fe0174254883fb0175054889f3eb1af6c301740b40f6c6017405483bdeeb05ff5570ebf67c034889f34889d640f6c60174064883c6027105ff5570ebf549895cb0fc4883c202483b65187303ff5548e946ffffff00000000000000009001000000000000|@3599,255,@16095|50,0,36028797018963967 81,0,@560 258,0,36028797018963967 286,0,@560 3599:S71|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f646528332961646446726f6d5361766564283129 3600:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16096| 3601:D3,1640|488338037556488b0bf6c10174064883c1027105ff5570ebf548890b498b08f6c10174084883f9017e08eb1df641ff107417488b480848b838e407c9a37f0000488b5d08909090ff13498b48084883f901750e4d8b094983f102eb0ce9e100000049c7c101000000488b1b498b08f6c10174084883f9017e08eb1af641ff107414488b480848b838e407c9a37f0000488b5d08ff13498b48084883f90174244883fb0175054889cbeb19f6c301740af6c1017405483bd9eb05ff5570ebf67c034889cb498b08f6c10174084883f9017e08eb1af641ff107414488b480848b810f407c9a37f0000488b5d08ff1349895808498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084889410848c70103000000498d47e0483b45107303ff55404989c748c740f8030000004c8948104889480848c7000d000000c20800488338077569488b03a80174064883c0027105ff5570ebf5488903498b00a80174084883f8017e08eb19f640ff10741348b838e407c9a37f0000488b5d08909090ff13498b40084883f80175094d8b094983f102eb0749c7c101000000488b1b498b00a801740d4883f8017e0deb1ce9a3000000f640ff10741148b838e407c9a37f0000488b5d0890ff13498b40084883f80174234883fb0175054889c3eb18f6c3017409a8017405483bd8eb05ff5570ebf67c034889c3498b00a80174084883f8017e08eb18f640ff10741248b810f407c9a37f0000488b5d089090ff1349895808498d47e0483b45107303ff55404989c748c740f8030000004c89481048b980da06c9a37f00004889480848c7000d000000c2080048833805756d488b0bf6c10174064883c1027105ff5570ebf548890b488b4808f6c10174084883f9017d08eb1ff641ff107519498b12f6c101740af6c2017405483bcaeb05ff5570ebf67c1048b838e407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf5498b4c8afceb05e99e0100004883f9017566488b4808f6c10174084883f9017d08eb24f641ff10751e488b542408488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf5488b542408488b4c8afc4883f102eb0748c7c101000000488b1b488b5008f6c20174084883fa017d08eb20f642ff10751a498b32f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5498b5492fc4883fa0174244883fb0175054889d3eb19f6c301740af6c2017405483bdaeb05ff5570ebf67c034889d3488b5008f6c20174084883fa017d08eb20f642ff10751a498b32f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13f6c20174064883c2027105ff5570ebf549895c92fc498d57e8483b55107303ff55404989d748c742f802000000488b40084889420848c70205000000498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c7000d000000c20800488b0bf6c10174064883c1027105ff5570ebf548890b488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017d08eb1ff641ff107519498b10f6c101740af6c2017405483bcaeb05ff5570ebf67c14488b500848b838e407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf5498b4c88fc4883f90175094d8b094983f102eb0749c7c101000000488b4808f6c10174064883c1027105ff5570ebf5488b1b488b5008f6c20174064883c2027105ff5570ebf5f6c20174084883fa017d08eb20f642ff10751a498b30f6c201740b40f6c6017405483bd6eb05ff5570ebf67c15488b700848b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5498b5490fc4883fa0174244883fb0175054889d3eb19f6c301740af6c2017405483bdaeb05ff5570ebf67c034889d3f6c10174084883f9017d08eb1ff641ff107519498b10f6c101740af6c2017405483bcaeb05ff5570ebf67c15488b500848b810f407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf549895c88fc498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084889410848c70101000000498d47e0483b45107303ff55404989c748c740f8030000004c8948104889480848c7000d000000c208009000000000000000006006000000000000|@3602,479,@16097|56,0,@1493 135,0,@1493 223,0,@1517 372,0,@1493 446,0,@1493 529,0,@1517 579,0,@544 679,0,@1493 782,0,@1493 890,0,@1493 1019,0,@1517 1227,0,@1493 1378,0,@1493 1506,0,@1517 3602:S66|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f64652833296c6f6361646472283129 3603:D3,200|483b65187303ff5548a801757341524151415053ff30ff742448ff742448ff742448ff742448488b4008909090e8ceffffff488b0c2450ff7108ff742450ff742450ff7424504c8b5424704c8b4c24484c8b442440488b5c2438488b01488b5424309090ff12498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e9230000005a48895108488901488d411848c740f8020000005a4883c42848895008488908c2200048c7c001000000c220009090909090900000000000000000c000000000000000|@3569,1048575,@16098| 3604:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16099| 3605:D13,1752|483b65187303ff5548a801756b488b08488339037567415241514150ff710853ff742450ff742450ff742450ff742450ff742450488b48084889c89090e8beffffff50ff742450ff742450ff7424504c8b5424704c8b4c24404c8b442438488b5c2430488b442428488b542420909090ff124883381beb0ae93d060000e9ac0000007569498d4fd0483b4d107303ff55404989cf48c741f802000000488b50104889510848c70103000000488d591848c743f802000000488b34244889730848890b4883fb01750e488b48084889c84883c430c22800488b48084889c84883c430594883c42851ff2503060000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f802000000488b1424488950084889084883c430c22800488339057569488b510848c7c601000000ff7008ff7108f6c2017542488b02488b48084883fe017506488b7110eb1d4889df4c8b5a084889f3488b411090ff15860500004889c64889fbeb044c8b5a084c89da483b65187303ff5548ebb94889f0488b0c24f6c101756d488b11eb05e964020000488b3240f6c60174084883fe017d08eb21f646ff10751b498b3940f6c601740b40f6c7017405483bf7eb05ff5570ebf67c154889c748b838e407c9a37f0000488b5d089090ff1340f6c60174064883c6027105ff5570ebf5498b74b1fc4883fe01eb05e99700000074154889c648b800240cc9a37f0000488b5d089090ff13488b3240f6c60174084883fe017d08eb26f646ff107520488b7c2428488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c154889c748b810f407c9a37f0000488b5d089090ff1340f6c60174064883c6027105ff5570ebf5488b7c242848c744b7fc01000000488b51084889d1483b65187303ff5548e9f2feffff48c7c1010000004152415141505350ff742460ff742460ff742460ff742460ff742460488b442458e832fdffff488b4c2448488b09f6c10174064883c1027105ff5570ebf5488b54244848890a50ff742468ff742468ff742468524c8b5424484c8b4c24404c8b442438488b5c2430488b442428909090ff15e20300009090ff15e20300009090ff15e203000050ff742470ff742470ff742470ff7424704c8b5424504c8b4c24484c8b442440488b5c2470488b442458ff15ba030000488b5c242890ff15b6030000a801742948837c2408017508584883c440c22800488b5c2408488b04244883c448594883c42851ff2591030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010500000048837c2408017506488b0424eb154889ce488b5c2408488b0424ff15560300004889f14889c2498d47e8483b45107303ff55404989c748c740f802000000488950084889084883c448c22800488b5108f6c20174084883fa017d08eb20f642ff10751a498b31f6c201740b40f6c6017405483bd6eb05ff5570ebf67c16488b700848b838e407c9a37f0000488b5d089090ff13f6c20174064883c2027105ff5570ebf5498b5491fc4883fa017415488b500848b880240cc9a37f0000488b5d0890ff13488b5108f6c20174084883fa017d08eb25f642ff10751f488b742418488b36f6c201740b40f6c6017405483bd6eb05ff5570ebf67c16488b700848b810f407c9a37f0000488b5d089090ff13f6c20174064883c2027105ff5570ebf5488b74241848c74496fc0100000041524151415053ff7108ff7110ff742458ff74245856ff742458ff742458488b48084889c890e8eefaffff488b4c2408f6c10174084883f9017d08eb24f641ff10751e488b542420488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c154889c248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b542420488b4c8afc488b5c2440488b1bf6c30174064883c3027105ff5570ebf5488b74244048891e4883f90175155051488b442410ff158e0100004883f8017412eb045051eb0c4883c408584883c430c22800ff742460ff742460ff7424604c8b9424800000004c8b4c24504c8b442448488b5c2440488b442428488b54243890ff12488b4c2418f6c10174084883f9017d08eb24f641ff10751e488b542430488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c154889c248b810f407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b54243048c7448afc01000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b14244889511848894110488b4424184889410848c70101000000498d47e8483b45107303ff55404989c748c740f802000000488b542408488950084889084883c440c2280048c7c001000000c22800909090900000000000000000d006000000000000|@3613,2097151,@16100,@3614,@3615,@3616,@3617,@3618,@3619,@3620,@3622,@3623,@3612|473,0,@1493 529,0,@3606 605,0,@1517 1085,0,@1493 1134,0,@3609 1209,0,@1517 1357,0,@1493 1581,0,@1517 3606:O4|@20055,@557,@3608,@3607 3607:O5|@3394,500,0,500,0 3608:S21|6170706c79466e3a20416c72656164792075736564 3609:O4|@20055,@557,@3611,@3610 3610:O5|@3394,462,0,462,0 3611:S30|636f70794465636c61726174696f6e733a20416c72656164792075736564 3612:D3,792|483b65187303ff5548488b0848ba26250cc9a37f0000488d548afcffe290e983000000909090e97b000000909090e989000000909090e9cb000000909090e9cb000000909090e9cb000000909090e9a8010000909090e9a8010000909090e9a9010000909090e93b000000909090e933000000909090e92b000000909090e9af010000909090e91b000000909090e913000000909090e90b000000909090e91602000090909048833813740848c7c001000000c348c7c003000000c3ff7018ff7010488b4008909090e832ffffff4883f8017426488b042490e822ffffff4883f801740a4883c40858e912ffffff48c7c0010000004883c410c348c7c0010000004883c410c348c7c003000000c348c7c003000000c3488b481048833907756af64108017417488b500848b8f86f07c9a37f0000488b5d08909090ff13ff7008ff7108488b1c2448c7c0cd00000048bad0b3dc0000000000ff124883f8017459488b1c2448c7c0cf00000048ba90b4dc0000000000909090ff124823058f010000483b0580010000eb05e964000000754a488b442408a8017535488b08ff7008488b019090e856feffff4883f801741358483b6518730aeb05e929000000ff5548ebd348c7c0010000004883c418c348c7c0030000004883c410c348c7c0010000004883c410c348c7c0010000004883c410c348c7c001000000c348c7c003000000c3488b4008e9f4fdffffff7010488b40089090e8e6fdffff4883f801740658e9dafdffff48c7c0010000004883c408c3488b4808ff7010f6c101755c488b01488338037517ff7108488b48084889c8e8aafdffff4883f8017431eb2348833805741aff7108488b48104889c8909090e88afdffff4883f8017411eb03ff710859483b65187303ff5548ebac48c7c0010000004883c408eb0748c7c0030000004883f801740658e953fdffff48c7c0010000004883c408c3488b4008a801752bff7008488b009090e832fdffff4883f801740c58483b65187303ff5548ebdd48c7c0010000004883c408c348c7c003000000c39090909000000000000000000003000000000000010000c000000000010000c000000000|@3624,2097151,@16110|14,0,$3612+30 300,0,@1294 336,0,I150 365,0,I153 3613:S84|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129 3614:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16101| 3615:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16102| 3616:D3,232|483b65187303ff5548a8017571488b4808488b10498d47e8483b45107303ff55404989c748c740f8020000004889500848c7000d0000004152415141505351ff742440ff742440ff7424404c8b5424604c8b4c24384c8b442430488b5c2428488b542420ff1250ff742450ff742450ff742450ff7424504c8b542448eb05e9450000004c8b4c24404c8b442438488b5c2430488b4424289090e862ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c220009090909090900000000000000000e000000000000000|@1363,1048575,@16103| 3617:D3,120|483b65187303ff5548a801754d488b084883390d75384883791003753151488b4008909090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,3,@16104| 3618:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010300000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@16105| 3619:D3,256|483b65187303ff5548a801756f488b08488b510841524151415053ff7008ff31ff7228ff7230415041514152ff742478ff742478ff742478ff7424784c8b52204c8b4a184c8b4210488b5a08488b02488b542458ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048c741100100000048894108eb05e95f0000005848890151ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b4424289090e84affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c220009090909090900000000000000000f800000000000000|@1363,1048575,@16106| 3620:D3,344|483b65187303ff5548a8017569488b08488b11f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c15488b700848b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5488b5493fc4883fa017513488b4808eb05e9c30000004889c8e97dffffff488b3140f6c60174084883fe017d08eb21f646ff10751b488b3b40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c14488b780848b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf548c744b3fc01000000498d77e0483b75107303ff55404989f748c746f80300000048895610488b510848895608488b3948893e564c8b40084c89c0e8e6feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005001000000000000|@3621,127,@16107|70,0,@1493 187,0,@1517 3621:S98|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329696e73657274283129636f70794465636c61726174696f6e73283129636f7079456e7472696573283129 3622:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16108| 3623:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16109| 3624:S50|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e7369646545666665637446726565283129 3625:O2|@3626,@3550 3626:D5,608|483b65187303ff554848c7c1010000004c89ce40f6c601751ff6c10174064883c1027105ff5570ebf5488b7608483b65187303ff5548ebdbf6c10174064883c1027105ff5570ebf5f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0df10100007c1ceb06f641ff1075144889c648b820f007c9a37f0000488b5d0890ff134889ce40f6c60174064883c6027105ff5570ebf54889cf4889f14889c648c7c0010000004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c891f4152415153575241504d89d04889fb4889f0488b542468909090ff12488b4c240850ff742458ff742458ff742458ff7424584c8b9424800000004c8b8c24880000004c8b842490000000488b5908488b442428909090ff153e0100009090ff153e010000488b4c2418488b0948c7c2010000004883f90174554889cb4883eb024883e902f6c10174064883c1027105ff5570ebf5488b742418488b4c8efc498d7fe8483b7d107303ff55404989ff48c747f8020000004889570848890f4889d94889fa483b65187303ff5548eba5f6c20174144889c148b8e81f08c9a37f0000488b5d0890ff13f6c20174134889c148b8582008c9a37f0000488b5d08ff134889c1498d47b0483b45107303ff55404989c748c740f809000000488b5a0848895840488b74247848897038488b3a488978304c8b8424800000004c8940284c8b4c24304c8948204c8b4c24284c89481848894810488b4c242048894808594883c430488908c24800909000000000000000005002000000000000fdffffffffffff01|@3631,1048575,@16112,@3632,@3627|118,0,@1509 438,0,@1625 463,0,@1628 3627:D3,176|483b65187303ff5548a801756c488b084883390d7417488b500848b8f8330cc9a37f0000488b5d08909090ff13498d57e0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c7020d00000052488b78084889f890e896ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090900000000000000000a800000000000000|@1363,63,@16114|28,0,@3628 3628:O4|@20055,@557,@3630,@3629 3629:O5|@3394,647,0,647,0 3630:S11|6d617020636c6f73757265 3631:S69|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f70794c616d626461283729 3632:D3,216|483b65187303ff5548a801756e415241514150ff3053ff742448ff742448ff742448ff742448488b4008909090e8ceffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000488b5424084889500848c7000d00000051ff742448ff742448ff7424484c8b5424684c8b4c24404c8b442438eb05e938000000488b5c2430488b5424209090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000005a4883c42848895008488908c2200048c7c001000000c220009090909090900000000000000000d000000000000000|@3569,1048575,@16113| 3633:D11,2032|483b65187303ff5548498b0a4883f901750c48b9909adc0000000000eb6f4889ce4889f14889c748c7c0010000004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04c89d64889f94889cf4989cc4889c148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90c00000049806424ffbf4c89e14c89d8488b742428488b364883fe01750c48be909adc0000000000eb714889cf4889f14989c348c7c0010000004989fc488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424284889f94889cf4989cd4889c148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90e000000498065ffbf4c89ee4c89e14c89d841524151505241505651ff742450ff742450ff7424504c8b5424704c8b4c24784c8b4424484889df488b5c24404889f8488b7a084889fa90ff12488b4c2430488b094883f901750c48b9909adc0000000000eb6d4889ca4889d14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b7424304889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004889c14889d8488b542460488b124883fa01750c48ba909adc0000000000eb6e4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424604889f94889cf4989c84889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000498060ffbf4c89c24889d9498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488913488b142448b9ffffffffffffff0048234af8488d4c090148c7c60100000040f6c601740ef6c1017409488d76ff4803f17105ff5570ebf2488b7c2430488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67e134889c648b808f60bc9a37f0000488b5d08ff134889d64883c408488b7c242848d1e94883c708f348a5488d7c3f01488d743601488d4c0901488b142448b9ffffffffffffff0048234af8488d4c090148c7c60100000040f6c601740ef6c1017409488d76ff4803f17105ff5570ebf2488b7c2458488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67e144889c648b808f60bc9a37f0000488b5d0890ff134889d64883c408488b7c245048d1e94883c708f348a5488d7c3f01488d743601488d4c0901488b4c24085053ff742450ff742450ff7424504c8b5424704c8b4c24784c8b442448488b5c2440488b442428488b51089090ff12488b4c2430488b094883f901750c48b9909adc0000000000eb6d4889ca4889d14889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b7424304889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004889c14889d8488b542460488b124883fa01750c48ba909adc0000000000eb6e4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0488b7424604889f94889cf4989c84889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000498060ffbf4c89c24889d9498d5fb8483b5d107303ff55404989df48c743f80200000048894b08488913488d4b1848c741f80200000048c74108010000004889194889c2488d411848c740f80200000048894808488b0c24488908524c8b5424504c8b4c24584c8b442468488b5c2460909090ff155e020000a8017511f6400801750b488b4808488379080174164889c148b8203e0cc9a37f0000488b5d08909090ff134c8b114c8b184c8b442438488b5c2468488b4424089090ff151e020000488b44242041524153ff742468ff742468ff7424684c8b9424880000004c8b8c24900000004c8b442460488b5c2458488b4808488b4424504889ca909090ff1248833c24017507488b4c2420eb62488b4c24204883391b755c4889c3488b7110488b7908488b04249090ff15b60100004883ff0174114989d84889fb9090ff15aa0100004c89c3498d4fe0483b4d107303ff55404989cf48c741f803000000488971104889410848c7011b000000eb40e93e0000004889c3488b04249090ff1572010000498d4fe0483b4d107303ff55404989cf48c741f803000000488b542420488951104889410848c7011b0000004889d848837c2408017507488b542410eb66488b54241048833a1b75604889cb4889c6488b7a104c8b4208488b4424089090ff15160100004983f80174114989d94c89c39090ff150a0100004c89cb498d57e0483b55107303ff55404989d748c742f80300000048897a104889420848c7021b000000eb44e9450000004889cb4889c6488b4424089090ff15ce000000498d57e0483b55107303ff55404989d748c742f803000000488b4c241048894a104889420848c7021b0000004889d94889f04889c3498d47d8483b45107303ff55404989c748c740f80400000048895018488948104889580848c700050000004883c450c22800909090909090900000000000000000e807000000000000|@3637,1048575,@16115,@3571,@3598,@3596,@3638,@3594,@3596,@3636,@3594|20,0,I49 174,0,I49 390,0,I49 536,0,I49 709,0,36028797018963967 795,0,@3553 852,0,36028797018963967 938,0,@3553 1058,0,I49 1204,0,I49 1476,0,@3634 3634:O4|@20055,@557,@3557,@3635 3635:O5|@3394,693,0,693,0 3636:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16117| 3637:S67|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329636f7079436f6e64283329 3638:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16116| 3639:S56|434f4445545245455f5354415449435f4c494e4b5f414e445f434153455328292e6c69666554696d6573283229636f7079436f6465283329 3640:D9,696|483b65187303ff554848833815756d488b4808488b4120488b5128488b7140488b79184c8b014c8b490848c7c1030000004989c248c7c0010000004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f5357eb05e9ff00000041525256415341504c89c84989d94989f84889c348c7c001000000ff152e0200006a016a016a016a01498d5fe8483b5d107303ff55404989df48c743f80200000048b928430cc9a37f000048890b48894308488063ffbf50ff742440ff742450ff742460ff742470488d4c2428514c8b5424604c8b4c245849c7c001000000488b442450909090ff15ca0100004c8b5424204c8b4c24184c8b442410488b5c2408584883c45890ff15b2010000498d4fe8483b4d107303ff55404989cf48c741f80200000048bae0a00cc9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c348c7c1030000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f53525741504989d94989f848bb50a10cc9a37f000048c7c00100000090ff15fa0000006a016a016a016a01506a03ff742430ff742440ff742458488d4c24285149c7c20100000049c7c10100000049c7c00100000048bb70a10cc9a37f0000488b44246090ff15ba0000004c8b5424204c8b4c24184c8b442410488b5c2408584883c44090ff15a2000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba98a20cc9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c30000000000000000b002000000000000|@4310,2097151,@16181,@4311,@4326,@3869,@4311,@4326,@3869|196,0,@3641 328,0,@3859 472,0,@3861 546,0,@3862 624,0,@3868 3641:D5,256|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f802000000488b52084889500848c70001000000498b4838488b09498d57d0483b55107303ff55404989d748c742f80500000048c742200100000048c742180100000048c742100100000048c7420803000000488902415151415041ff704841ff7038498b40104989d04889cb909090ff1586000000488b442418a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb60440cc9a37f0000488b44240890ff1552000000488b4424184883c4105948890848c740080100000048c7c0010000004883c408c3900000000000000000f800000000000000|@3833,2097151,@16129,@3834,@3643|186,0,@3642 3642:S11|70757368436f6465526566 3643:D12,592|483b65187303ff5548488b4858488b094c8b50404989c34989cc4d89c548c7c015000000ff153e02000048c7c315000000909090ff15360200004152415341ff733841ff7318415441ff730841554c89d2909090ff125848c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8a8017529ff7008488b5c2430488b0048ba40470cc9a37f00009090ff15be01000058483b65187303ff5548ebd348b888920cc9a37f0000488b542428909090ff12488b442418488b0048c7c30300000048baa05f06c9a37f000090ff1586010000488b54242890ff1248b8a0920cc9a37f0000488b542428909090ff12488b0424488b0048c7c30300000048baa05f06c9a37f00009090ff1552010000488b5424284883c40890ff1248b8b8920cc9a37f0000488b542420909090ff1248c7c3030000005848baa05f06c9a37f0000ff1522010000488b54241890ff1248c7c015000000488b5424189090ff1248b8d0920cc9a37f0000488b542418909090ff12488b04244c8b4c24184883c4084c8b4010488b5808488b084889c8909090ff15da00000048c7c015000000488b5424109090ff1258488b00a80174084883f8017f08eb4bf640ff107545488b0c244889c74889fb488b41109090ff15a6000000574c8b4424104889c34889f89090ff159a00000058a80174064883e8027105ff5570ebf5483b65187303ff5548eba948b8e8920cc9a37f00004883c4085aff2290909090909000000000000000004802000000000000|@3847,2097151,@16131,@100,@100,@3646,@194,@194,@194,@3848,@3852,@3842|170,0,@3644 200,0,@3828 235,0,@193 260,0,@3829 294,0,@193 324,0,@3830 352,0,@193 392,0,@3831 555,0,@3832 3644:O2|@3646,@3645 3645:O2|@3810,@3809 3646:D104,9200|483b65187303ff5548488b0848be8e470cc9a37f0000488d748efcffe690e941020000909090e99a020000909090e9b9020000909090e9cd030000909090e9dd040000909090e9d9050000909090e9d1060000909090e9d5070000909090e9c1080000909090e905090000909090e9f9090000909090e90d0b0000909090e9ed0c0000909090e9f90d0000909090e9350f0000909090e939100000909090e959100000909090e979100000909090e9c1100000909090e9e5100000909090e9f6100000909090e921110000909090e969110000909090e9c6110000909090e985120000909090e9b1120000909090e981130000909090e9b2140000909090e9bd140000909090e901150000909090e9f5150000909090e99d170000909090e91d180000909090e965180000909090e976180000909090e9fd180000909090e91d190000909090e94a190000909090e9aa190000909090e9bb000000909090e9fa190000909090e9191a0000909090e9391a0000909090e9721a0000909090e9a51a0000909090e9dd1a0000909090e9021b0000909090e90d1b0000909090e9911b0000909090e9c11b0000909090e9f91b0000909090e9d91c0000909090e9511d0000909090e95d1d0000909090e9291e0000909090e9a91e0000909090e9391f0000909090e9451f0000909090e9d91f0000909090e959200000909090e99d200000909090e945210000909090e96521000090909053ff7010ff700848b8b06e0cc9a37f00004889da9090ff125890ff15d2210000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff125890ff15b6210000488b14249090ff12eb5c53ff7010ff700848b8e06e0cc9a37f00004889daff1248c7c3030000005848baa05f06c9a37f0000ff1586210000488b54240890ff1248b8006f0cc9a37f0000488b542408909090ff125890ff156a210000488b14249090ff12eb41e90f21000053ff700848b8186f0cc9a37f00004889da9090ff125890ff1546210000488b14249090ff12eb56488b480848ba764a0cc9a37f0000488d548afcffe2e9ce200000e92b000000909090e934000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3fe98d20000048b9586f0cc9a37f0000eb2e48b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58204c8b60184c8b681048bbd06f0cc9a37f00004889c8909090ff158a20000041524153415441554c89d2909090ff124c8b4c24184c8b44240848bbe86f0cc9a37f0000584883c40890ff156220000048c7c041000000488b5424089090ff1248c7c3030000005848baa05f06c9a37f0000ff1542200000488b14249090ff12eb5e488b480848ba8e4b0cc9a37f0000488d548afcffe290e92b000000909090e92f000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3f48b9586f0cc9a37f0000eb33e9691f000048b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58204c8b60184c8b681048bbd06f0cc9a37f00004889c8909090ff158a1f000041524153415441554c89d2909090ff124c8b4c24184c8b44240848bbe86f0cc9a37f0000584883c40890ff15621f000048b8c86e0cc9a37f0000488b542408909090ff125848ba28f409c9a37f0000909090ff15421f0000488b14249090ff12eb5e488b480848baa64c0cc9a37f0000488d548afcffe290e92b000000909090e92f000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3f48b9586f0cc9a37f0000eb33e9511e000048b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58184c8b601048bbf86f0cc9a37f00004889c8909090ff158e1e00004152415341544c89d290ff125890ff15821e0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff1248c7c3030000005848baa05f06c9a37f0000ff15561e0000488b14249090ff12eb5e488b480848baaa4d0cc9a37f0000488d548afcffe290e92b000000909090e92f000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3f48b9586f0cc9a37f0000eb33e94d1d000048b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58184c8b601048bbf86f0cc9a37f00004889c8909090ff15a21d00004152415341544c89d290ff125890ff15961d0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff125848ba28f409c9a37f0000909090ff156e1d0000488b14249090ff12eb5e488b480848baaa4e0cc9a37f0000488d548afcffe290e92b000000909090e92f000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3f48b9586f0cc9a37f0000eb33e94d1c000048b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58184c8b60104c8b682048bb10700cc9a37f00004889c8909090ff15b61c000041524153415441554c89d2909090ff125890ff15a61c0000488b54241090ff1248b8c86e0cc9a37f0000488b542410909090ff124c8b4c24104c8b44240848bbe86f0cc9a37f0000584883c40890ff15721c0000eb5e488b480848bab64f0cc9a37f0000488d548afcffe290e92b000000909090e92f000000909090e938000000909090e93c000000909090e940000000909090e94400000090909048b9406f0cc9a37f0000eb3f48b9586f0cc9a37f0000eb33e9411b000048b9706f0cc9a37f0000eb2248b9886f0cc9a37f0000eb1648b9a06f0cc9a37f0000eb0a48b9b86f0cc9a37f00004989da4c8b58184c8b601048bb28700cc9a37f00004889c8909090ff15c61b00004152415341544c89d290ff125890ff15ba1b0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff125890ff159e1b0000488b14249090ff12eb6853ff7010ff700848b840700cc9a37f00004889daff125890ff157e1b0000488b54240890ff1248b860700cc9a37f0000488b542408909090ff125890ff15621b0000488b14249090ff12eb6153ff700848b878700cc9a37f00004889da909090ff12488b0424eb05e9431a000048833807751548b898700cc9a37f0000488b5424089090ff12eb6548833801752a488b4008488b582048b8b8700cc9a37f0000ff15061b0000488b542408eb05e9fe1900009090ff12eb6748833805753aff700848b8d0700cc9a37f0000488b542410ff125848ba28f409c9a37f0000909090ff15ce1a0000488b542408eb05e9ba1900009090ff12eb63488338037536ff700848b8b8270ac9a37f0000488b542410ff125848ba28f409c9a37f0000eb05e988190000ff15921a0000488b54240890ff12eb6248b8a8260ac9a37f0000488b54240890ff12eb5c53ff700848b8e8700cc9a37f00004889daeb05e94c190000ff1248813c2491000000751448b800710cc9a37f0000488b54240890ff12eb5e48813c2481000000751f48b828710cc9a37f0000eb05e911190000488b542408ff12eb5ee90319000048813c24a1000000751548b848710cc9a37f0000488b5424089090ff12eb5e48813c24b1000000751a48b870710cc9a37f0000eb05e9c9180000488b542408ff12eb6848813c24d1000000751a48b890710cc9a37f0000eb05e9a5180000488b542408ff12eb6548813c24e1000000751a48b8a8710cc9a37f0000eb05e981180000488b542408ff12eb5748c7c303000000488b042448baa05f06c9a37f0000909090ff1572190000eb05e953180000488b5424089090ff12eb2c488b4810488b5110488b12488b7008eb05e93218000048bf2a530cc9a37f0000488d7cb7fcffe7e91c180000e91718000090e96b000000909090e973000000909090e97b000000909090e983000000909090e98b000000909090e993000000909090e9a7000000909090e9b4000000909090e9c6000000909090e9d3000000909090e9e0000000909090e903000000909090488b481848b8c8710cc9a37f0000eb56488b481848b8e8710cc9a37f0000eb57488b481848b808720cc9a37f0000eb5c488b481848b828720cc9a37f0000eb61488b481848b848720cc9a37f0000eb56488b481848b868720cc9a37f0000eb5b488b4818eb05e97800000048b890720cc9a37f0000eb59e967000000488b481848b8a8720cc9a37f0000eb57e952000000488b481848b8c8720cc9a37f0000eb42e93d000000e938000000488b481848b8e8720cc9a37f0000eb28e923000000488b481848b808730cc9a37f0000eb13e90e000000488b481848b828730cc9a37f00005351524889da90ff1248b848730cc9a37f0000488b542410909090ff1248c7c3030000005848baa05f06c9a37f0000ff15be170000488b54240890ff1248833c2403751348b860730cc9a37f0000488b542408ff12eb3148833c2405752f48b880730cc9a37f0000488b5424089090ff12eb72488b480848ba02550cc9a37f0000488d548afcffe2e946160000e941160000909090e93b000000909090e948000000909090e950000000909090e958000000909090e960000000909090e968000000909090e975000000909090e982000000909090488b481048b8a0730cc9a37f0000eb55e9e9150000488b481048b8b8730cc9a37f0000eb55488b481048b8d8730cc9a37f0000eb58488b481048b8f8730cc9a37f0000eb48488b481048b810740cc9a37f0000eb38488b481048b830740cc9a37f0000eb28e923000000488b481048b850740cc9a37f0000eb13e90e000000488b481048b870740cc9a37f000053514889daff125848ba28f409c9a37f0000909090ff157e160000488b14249090ff12eb6a488b480848ba0a560cc9a37f0000488d548afcffe290e93b000000909090e94c000000909090e958000000909090e964000000909090e970000000909090e981000000909090e992000000909090e9a3000000909090488b4818488b501048b8a0730cc9a37f0000eb55e9db140000488b4818488b501048b8b8730cc9a37f0000eb55488b4818488b501048b8d8730cc9a37f0000eb5a488b4818488b501048b8f8730cc9a37f0000eb5d488b4818488b501048b810740cc9a37f0000eb49e944000000488b4818488b501048b830740cc9a37f0000eb30e92b000000488b4818488b501048b850740cc9a37f0000eb17e912000000488b4818488b501048b870740cc9a37f00005351524889da9090ff1248c7c041000000488b5424109090ff124c8b4c24104c8b44240848bbe86f0cc9a37f0000584883c40890ff153a150000eb66488b480848ba4e570cc9a37f0000488d548afcffe290e93b000000909090e948000000909090e950000000909090e958000000909090e960000000909090e968000000909090e975000000909090e982000000909090488b481048b8a0730cc9a37f0000eb55e99b130000488b481048b8b8730cc9a37f0000eb55488b481048b8d8730cc9a37f0000eb58488b481048b8f8730cc9a37f0000eb48488b481048b810740cc9a37f0000eb38488b481048b830740cc9a37f0000eb28e923000000488b481048b850740cc9a37f0000eb13e90e000000488b481048b870740cc9a37f000053514889daff1248c7c041000000488b5424089090ff125890ff153e140000488b14249090ff12eb6353ff700848b898740cc9a37f00004889da909090ff125890ff151e140000488b14249090ff12eb6953ff700848b8b0740cc9a37f00004889da909090ff125890ff15fe130000488b14249090ff12eb6353ff7010ff700848b8b0740cc9a37f0000eb05e9921200004889da90ff125890ff15d6130000488b54240890ff1248833c2401745b48b8c8740cc9a37f0000eb05e964120000488b54240890ff12eb6253ff700848b8b0740cc9a37f00004889daeb05e942120000ff125890ff1592130000488b14249090ff12eb635348b8e0740cc9a37f00004889da9090ff12eb5ce9111200005348b808750cc9a37f00004889da90ff1248b8902b07c9a37f0000eb05e9ef11000090ff154e130000488b14249090ff12eb6a4883780801742253ff701048b828750cc9a37f0000eb05e9c01100004889da90ff12eb1ae9b311000053ff701048b850750cc9a37f00004889da9090ff125890ff1506130000488b14249090ff12eb604883781001742153ff7018ff700848b828750cc9a37f0000eb05e96d1100004889da9090ff12eb1653ff7018ff700848b850750cc9a37f00004889daff124c8b4c24104c8b44240848bbe86f0cc9a37f0000584883c40890ff15a6120000eb66e927110000488b400848b9265a0cc9a37f0000488d4c81fcffe1e94c000000909090e933000000909090e948000000909090e94c000000909090e950000000909090e954000000909090e958000000909090e96100000090909048b870750cc9a37f0000eb4de9c110000048b890750cc9a37f0000eb4b48b8a8750cc9a37f0000eb3f48b8c0750cc9a37f0000eb3348b8e0750cc9a37f0000eb2748b800760cc9a37f0000eb1b48b820760cc9a37f0000eb0fe90a00000048b838760cc9a37f0000534889da9090ff12eb4953ff70085248b858760cc9a37f00004889da9090ff12488b0424488b48084883c408584889ca9090ff12488b14249090ff12eb5a488b481048ba265b0cc9a37f0000488d548afcffe2e912100000e940000000909090e948000000909090e950000000909090e958000000909090e960000000909090e903000000909090488b480848b878760cc9a37f0000eb53e9cd0f0000488b480848b890760cc9a37f0000eb3e488b480848b8a8760cc9a37f0000eb2e488b480848b8c0760cc9a37f0000eb1e488b480848b8d8760cc9a37f0000eb0e488b480848b8f0760cc9a37f000053514889da9090ff1248c7c041000000488b5424089090ff125890ff15de100000488b14249090ff12eb6a53ff7008ff7010ff7020ff701848b808770cc9a37f00004889da9090ff125890ff15b6100000488b54241890ff1248b828770cc9a37f0000488b542418909090ff125890ff159a100000488b54241090ff1248c7c015000000488b5424109090ff125859a801756deb05e9e50e0000488b10488b5a10488b1bf6c10174084883f9017d28eb06f641ff107420ff700851534889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb0a488b50084889c852515348c7c30500000048baa05f06c9a37f000090ff151e100000488b542418eb05e97a0e00009090ff1248b840770cc9a37f0000488b542418909090ff1248c7c3030000005848baa05f06c9a37f0000ff15ea0f0000488b54241090ff1248c7c015000000488b5424109090ff12584883c0024889c158483b65187303ff5548e92bffffff5348b858770cc9a37f00004889da90ff12eb68488b4008488b4010488b00535048c7c0990000004889da90ff1248c7c3030000005848baa05f06c9a37f0000ff157e0f0000488b14249090ff1248c7c075000000488b1424909090ff12eb6153ff700848b878770cc9a37f00004889da909090ff12488b0424eb05e99b0d000048833807751548b898700cc9a37f0000488b5424089090ff12eb6548833801752a488b4008488b582048b8b8700cc9a37f0000ff15120f0000488b542408eb05e9560d00009090ff12eb6748833805753aff700848b8d0700cc9a37f0000488b542410ff125848ba28f409c9a37f0000909090ff15da0e0000488b542408eb05e9120d00009090ff12eb69488338037536ff700848b8b8270ac9a37f0000488b542410ff125848ba28f409c9a37f0000eb05e9e00c0000ff159e0e0000488b54240890ff12eb6748b8a8260ac9a37f0000488b54240890ff12eb5853ff7020ff7010ff7018ff700848b898770cc9a37f0000eb05e99e0c00004889da909090ff12f60424017536488b0424488b0090ff154e0e0000488b54242090ff1248b8b8770cc9a37f0000488b542420eb0ae9640c0000e95f0c0000909090ff1248c7c3030000004883c4085848baa05f06c9a37f0000ff15120e0000488b54241090ff12488b042448833807753cff700848b8b8770cc9a37f0000488b5424189090ff125890ff15ea0d0000488b54241090ff1248b8d0770cc9a37f0000488b542410909090ff12eb6448833805753aff700848b8b8770cc9a37f0000488b542418ff125890ff15b20d0000488b54241090ff1248b8e8770cc9a37f0000488b542410909090ff12eb62488338037542ff700848b8b8770cc9a37f0000488b542418ff125890ff157a0d0000eb05e951000000488b5424109090ff1248b800780cc9a37f0000488b542410909090ff12eb3248833801752cff700848b8b8770cc9a37f0000488b542418eb05e91300000090ff125890ff15320d0000488b54241090ff1248b8006f0cc9a37f00004883c408488b542408909090ff125890ff15120d0000488b14249090ff12eb6453ff7010ff700848b818780cc9a37f00004889daff125890ff15f20c0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff12488b0424488338037525488b400848ba28f409c9a37f00009090ff15be0c0000488b54240890ff12eb68e9a10a00004c8b4c24084c8b4018488b5810488b48084889c8909090ff159a0c0000eb64488b480853ff7010ff712048b838780cc9a37f00004889daff1258488b542408ff1248b8006f0cc9a37f0000488b542408909090ff125890ff15620c0000488b1424eb05e9350a0000909090ff12eb665348b858780cc9a37f00004889da9090ff12eb57e9150a000053ff7010ff700848b880780cc9a37f00004889da909090ff125890ff151e0c0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff12488b042448833803752c488b4008eb0ae9c1090000e9bc09000048ba28f409c9a37f00009090ff15de0b0000488b54240890ff12eb644c8b4c24084c8b4018488b5810488b48084889c8ff15c20b0000eb5853ff700848b898780cc9a37f00004889da909090ff125890ff15aa0b0000488b14249090ff12eb6a53ff700848b8c0780cc9a37f00004889da909090ff125890ff158a0b0000eb05e933090000488b1424909090ff12eb68e92309000053ff7010ff700848b8e0780cc9a37f00004889da909090ff125890ff155a0b0000488b54240890ff1248b8f8780cc9a37f0000eb05e9e7080000488b542408ff1248c7c3030000005848baa05f06c9a37f0000ff152a0b0000488b14249090ff12eb60e9b908000053ff7010ff700848b8e0780cc9a37f00004889da909090ff125890ff15020b0000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff125848ba28f409c9a37f0000909090ff15da0a0000488b14249090ff12eb64e95908000053ff700848b810790cc9a37f00004889da9090ff125890ff15b60a0000488b14249090ff12eb6453ff700848b828790cc9a37f00004889da909090ff125890ff15960a0000488b14249090ff12eb6c53ff700848b840790cc9a37f0000eb05e9f50700004889daff1248c7c3030000005848baa05f06c9a37f0000ff15620a0000488b14249090ff12eb6ce9c907000053ff700848b840790cc9a37f00004889da9090ff125848ba28f409c9a37f0000909090ff15320a0000eb05e999070000488b1424909090ff12eb6853ff7010ff700848b858790cc9a37f00004889daff124c8b4c24104c8b44240848bbe86f0cc9a37f0000eb05e95d070000584883c4089090ff15ea090000eb5f53ff700848b870790cc9a37f00004889da909090ff125890ff15d2090000488b14249090ff12eb5be9210700005348b870710cc9a37f00004889da90ff12eb5b53ff700848b888790cc9a37f00004889da909090ff1248833c24097513eb05e9ea06000048b8a0790cc9a37f0000eb4d48833c2407751148b8c0790cc9a37f0000eb3ae9c606000048833c2405751148b8e0790cc9a37f0000eb22e9ae06000048833c2403740c48b8007a0cc9a37f0000eb0a48b8207a0cc9a37f0000488b5424084883c4089090ff12eb6853ff700848b8407a0cc9a37f00004889da909090ff1248c7c3030000005848baa05f06c9a37f0000ff15fe080000488b14249090ff12eb5b53ff700848b8607a0cc9a37f00004889da909090ff1248c7c3030000005848baa05f06c9a37f0000ff15ce080000eb05e915060000488b1424909090ff12eb7048837818037519488b4808488b501048b8887a0cc9a37f0000eb32e9ea05000048837818057414488b4808488b501048b8b07a0cc9a37f0000eb12488b4808488b501048b8d87a0cc9a37f00005351524889da90ff1248c7c041000000488b5424109090ff125890ff1556080000eb05e995050000488b5424089090ff1248b8007b0cc9a37f0000488b542408909090ff12488b0424a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff1248c7c30500000048baa05f06c9a37f000090ff15f2070000488b5424084883c40890ff12eb7248837810037510488b480848b8887a0cc9a37f0000eb2548837810057410488b480848b8b07a0cc9a37f0000eb0e488b480848b8d87a0cc9a37f000053514889da909090ff1248c7c041000000488b5424089090ff125890ff158e070000488b14249090ff1248b8187b0cc9a37f0000eb05e9ab040000488b142490ff12eb635348b8307b0cc9a37f00004889da9090ff12eb6e53ff7010ff700848b8507b0cc9a37f00004889daff12488b0424488338037520488b400848ba28f409c9a37f00009090ff152a070000488b54241090ff12eb224c8b4c24104c8b4018488b5810eb05e93a040000488b48084889c890ff150607000048b8787b0cc9a37f0000eb05e91b0400004883c408488b542408ff12488b0424a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff1248c7c30500000048baa05f06c9a37f000090ff15aa060000488b5424084883c40890ff12eb6f53ff7010ff700848b8907b0cc9a37f00004889daff12488b0424488338037520488b400848ba28f409c9a37f00009090ff156e060000488b54241090ff12eb1a4c8b4c24104c8b4018488b5810488b48084889c8ff155206000048b8c86e0cc9a37f00004883c408488b542408eb05e946030000ff125890ff1536060000488b14249090ff12eb6f53ff7010ff700848b8b87b0cc9a37f00004889daff12488b0424488338037520488b400848ba28f409c9a37f00009090ff15fe050000488b54241090ff12eb1a4c8b4c24104c8b4018488b5810488b48084889c8ff15e205000048b8c86e0cc9a37f00004883c408488b542408eb05e9be020000ff1248c7c3030000005848baa05f06c9a37f0000ff15b6050000488b14249090ff12eb635348b8e07b0cc9a37f00004889da9090ff12eb6e53ff7010ff700848b8007c0cc9a37f00004889daff12488b0424488338037520488b400848ba28f409c9a37f00009090ff156a050000488b54241090ff12eb224c8b4c24104c8b4018488b5810eb05e932020000488b48084889c890ff154605000048b8c86e0cc9a37f0000eb05e9130200004883c408488b542408ff125848ba28f409c9a37f0000909090ff151e050000488b14249090ff12eb6f53ff7010ff700848b8287c0cc9a37f00004889daff12488b0424488338037520488b400848ba28f409c9a37f00009090ff15e6040000488b54241090ff12eb1a4c8b4c24104c8b4018488b5810488b48084889c8ff15ca04000048b8c86e0cc9a37f00004883c408488b542408eb05e976010000ff125890ff15ae040000488b14249090ff12eb6553ff7010ff700848b8507c0cc9a37f00004889daff125890ff158e040000488b54240890ff1248b8c86e0cc9a37f0000488b542408909090ff125890ff1572040000488b14249090ff12eb6653ff7010ff7018ff700848b8707c0cc9a37f00004889daeb05e9f80000009090ff124c8b4c24184c8b44240848bbe86f0cc9a37f0000584883c40890ff152e04000048b8907c0cc9a37f0000488b542408909090ff12488b0424a801740d4883f8017d26eb0be9ab000000f640ff1074194889c348b810c506c9a37f000048bad0a8dc0000000000ff1248c7c30500000048baa05f06c9a37f000090ff15d6030000488b5424084883c40890ff12eb6653ff700848b8a87c0cc9a37f00004889da909090ff125890ff15b2030000488b14249090ff12eb3e488b4008488b4010488b00535048b8c87c0cc9a37f00004889da9090ff1248c7c3030000005848baa05f06c9a37f0000ff157a030000488b14249090ff126a014883c4086a014883c4086a014883c4086a014883c4086a014883c40848c7c0150000005aff2290900000000000000000e823000000000000|@3781,2097151,@16119,@3770,@3770,@194,@3770,@3770,@100,@3782,@194,@100,@3782,@2713,@100,@3770,@194,@100,@3770,@2713,@100,@3770,@3782,@100,@3770,@3770,@3770,@3770,@100,@2713,@2713,@194,@194,@2713,@3782,@3770,@3770,@3787,@3770,@3770,@3770,@3770,@3782,@3770,@3770,@3770,@194,@194,@194,@100,@2713,@2713,@3770,@194,@3770,@3770,@3770,@3770,@3770,@3770,@2713,@3782,@3770,@3770,@2713,@3782,@3770,@3770,@3770,@194,@3770,@2713,@3770,@3770,@194,@2713,@3782,@3770,@194,@194,@3770,@194,@3770,@2713,@3782,@194,@2713,@3782,@3770,@2713,@3782,@194,@2713,@3782,@2713,@2713,@3782,@3770,@3770,@3770,@3782,@194,@3770,@194|14,0,$3646+30 543,0,@3647 576,0,@3648 621,0,@3649 644,0,@193 668,0,@3650 715,0,@3651 754,0,$3646+774 824,0,@3652 841,0,@3653 853,0,@3654 865,0,@3655 877,0,@3656 889,0,@3657 914,0,@3658 962,0,@3659 1008,0,@193 1038,0,$3646+1054 1104,0,@3652 1116,0,@3653 1133,0,@3654 1145,0,@3655 1157,0,@3656 1169,0,@3657 1194,0,@3658 1242,0,@3659 1264,0,@3648 1285,0,@2711 1318,0,$3646+1334 1384,0,@3652 1396,0,@3653 1413,0,@3654 1425,0,@3655 1437,0,@3656 1449,0,@3657 1470,0,@3660 1520,0,@3648 1548,0,@193 1578,0,$3646+1594 1644,0,@3652 1656,0,@3653 1673,0,@3654 1685,0,@3655 1697,0,@3656 1709,0,@3657 1730,0,@3660 1780,0,@3648 1801,0,@2711 1834,0,$3646+1850 1900,0,@3652 1912,0,@3653 1929,0,@3654 1941,0,@3655 1953,0,@3656 1965,0,@3657 1990,0,@3661 2044,0,@3648 2074,0,@3659 2102,0,$3646+2118 2168,0,@3652 2180,0,@3653 2197,0,@3654 2209,0,@3655 2221,0,@3656 2233,0,@3657 2254,0,@3662 2304,0,@3648 2349,0,@3663 2380,0,@3664 2422,0,@3665 2457,0,@3666 2492,0,@3667 2535,0,@3668 2553,0,@2711 2599,0,@2995 2617,0,@2711 2650,0,@2984 2674,0,@3669 2706,0,@3670 2736,0,@3671 2777,0,@3672 2808,0,@3673 2844,0,@3674 2880,0,@3675 2917,0,@193 2976,0,$3646+3002 3104,0,@3676 3120,0,@3677 3136,0,@3678 3152,0,@3679 3168,0,@3680 3184,0,@3681 3207,0,@3682 3228,0,@3683 3249,0,@3684 3275,0,@3685 3296,0,@3686 3317,0,@3687 3336,0,@3688 3364,0,@193 3395,0,@3689 3421,0,@3690 3446,0,$3646+3474 3544,0,@3691 3565,0,@3692 3581,0,@3693 3597,0,@3694 3613,0,@3695 3629,0,@3696 3650,0,@3697 3671,0,@3698 3689,0,@2711 3722,0,$3646+3738 3812,0,@3691 3837,0,@3692 3857,0,@3693 3877,0,@3694 3897,0,@3695 3922,0,@3696 3947,0,@3697 3972,0,@3698 4018,0,@3659 4046,0,$3646+4062 4132,0,@3691 4153,0,@3692 4169,0,@3693 4185,0,@3694 4201,0,@3695 4217,0,@3696 4238,0,@3697 4259,0,@3698 4314,0,@3699 4354,0,@3700 4397,0,@3700 4443,0,@3701 4474,0,@3700 4515,0,@3702 4540,0,@3703 4556,0,@884 4601,0,@3704 4635,0,@3705 4684,0,@3704 4717,0,@3705 4742,0,@3659 4775,0,$3646+4790 4856,0,@3706 4873,0,@3707 4885,0,@3708 4897,0,@3709 4909,0,@3710 4921,0,@3711 4933,0,@3712 4950,0,@3713 4975,0,@3714 5026,0,$3646+5046 5100,0,@3715 5121,0,@3716 5137,0,@3717 5153,0,@3718 5169,0,@3719 5185,0,@3720 5251,0,@3721 5284,0,@3722 5386,0,@376 5396,0,I106 5427,0,@193 5460,0,@3723 5488,0,@193 5552,0,@3724 5604,0,@193 5650,0,@3725 5685,0,@3666 5720,0,@3667 5763,0,@3668 5781,0,@2711 5827,0,@2995 5845,0,@2711 5878,0,@2984 5911,0,@3726 5964,0,@3727 6008,0,@193 6045,0,@3727 6080,0,@3728 6111,0,@3727 6144,0,@3729 6175,0,@3727 6216,0,@3730 6247,0,@3727 6288,0,@3650 6337,0,@3731 6368,0,@3648 6402,0,@2711 6477,0,@3732 6500,0,@3650 6547,0,@3733 6578,0,@3734 6612,0,@3648 6658,0,@2711 6718,0,@3735 6758,0,@3736 6814,0,@3737 6848,0,@3738 6880,0,@193 6918,0,@3737 6952,0,@3648 6973,0,@2711 7011,0,@3739 7050,0,@3740 7090,0,@3741 7120,0,@193 7155,0,@3741 7173,0,@2711 7217,0,@3742 7242,0,@3659 7278,0,@3743 7320,0,@3673 7342,0,@3744 7374,0,@3745 7393,0,@3746 7417,0,@3747 7441,0,@3748 7453,0,@3749 7482,0,@3750 7508,0,@193 7538,0,@3751 7564,0,@193 7613,0,@3752 7645,0,@3753 7665,0,@3754 7724,0,@3755 7769,0,@376 7779,0,I106 7799,0,@193 7841,0,@3752 7864,0,@3753 7880,0,@3754 7932,0,@3756 7959,0,@3757 7985,0,@3758 8014,0,@2711 8076,0,@3759 8129,0,@376 8139,0,I106 8159,0,@193 8197,0,@3760 8226,0,@2711 8280,0,@3648 8333,0,@3761 8362,0,@2711 8416,0,@3648 8452,0,@193 8479,0,@3762 8505,0,@3763 8534,0,@2711 8596,0,@3648 8625,0,@2711 8661,0,@3764 8690,0,@2711 8744,0,@3648 8797,0,@3765 8828,0,@3648 8876,0,@3766 8910,0,@3659 8932,0,@3767 8982,0,@376 8992,0,I106 9011,0,@193 9046,0,@3768 9095,0,@3769 9120,0,@193 3647:S7|4d6f7665525220 3648:S4|203c3d20 3649:S11|416c6c6f6353746f726520 3650:S4|203d3e20 3651:S19|416c6c6f6353746f72655661726961626c6520 3652:S3|416464 3653:S3|416e64 3654:S3|436d70 3655:S2|4f72 3656:S3|537562 3657:S3|586f72 3658:S3|4d4320 3659:O1|4 3660:S3|524320 3661:S3|524d20 3662:S3|525220 3663:S12|4c6f636b6564584164642028 3664:S6|29203c3d3e20 3665:S13|43616c6c46756e6374696f6e20 3666:S14|76696120436c6f73757265526567 3667:S5|434f44452d 3668:S5|636f64653d 3669:S8|43616c6c52545320 3670:S17|537461636b4f766572666c6f7743616c6c 3671:S12|486561704f766572666c6f77 3672:S19|537461636b4f766572666c6f7743616c6c4578 3673:S14|5261697365457863657074696f6e 3674:S8|5261697365446976 3675:S12|417262456d756c6174696f6e 3676:S12|4a756d704f766572666c6f77 3677:S9|4a756d704166746572 3678:S10|4a756d704265666f7265 3679:S9|4a756d70457175616c 3680:S11|4a756d7047726561746572 3681:S18|4a756d70477265617465724f72457175616c 3682:S8|4a756d704c657373 3683:S15|4a756d704c6573734f72457175616c 3684:S12|4a756d704e6f744166746572 3685:S13|4a756d704e6f744265666f7265 3686:S12|4a756d704e6f74457175616c 3687:S15|4a756d704e6f744f766572666c6f77 3688:S2|204c 3689:S16|20507265646963744e6f7454616b656e 3690:S13|205072656469637454616b656e 3691:S5|4650416464 3692:S9|4650436f6d70617265 3693:S15|4650436f6d70617265416e64506f70 3694:S8|4650446976696465 3695:S15|465052657665727365446976696465 3696:S10|46504d756c7469706c79 3697:S10|46505375627472616374 3698:S17|4650526576657273655375627472616374 3699:S7|46504672656520 3700:S7|46504c6f616420 3701:S7|20284c41535429 3702:S22|46504c6f6164496e74416e64506f7020282545535029 3703:S9|465053746174757320 3704:S17|465053746f7265416e64506f70203d3e20 3705:S11|465053746f7265203d3e20 3706:S12|46504368616e67655369676e 3707:S5|4650416273 3708:S5|4650436f73 3709:S9|46504c6f61644f6e65 3710:S10|46504c6f61645a65726f 3711:S15|46505061727469616c41726374616e 3712:S5|465053696e 3713:S12|4650537175617265526f6f74 3714:S13|46726565526567697374657220 3715:S3|4e4f54 3716:S3|444956 3717:S4|49444956 3718:S4|494d554c 3719:S3|4d554c 3720:S3|4e4547 3721:S12|496e64657865644361736520 3722:S6|207769746820 3723:S5|203d3e204c 3724:S14|496e74657272757074436865636b 3725:S15|4a756d70546f46756e6374696f6e20 3726:S12|4c6f61644164647265737320 3727:S3|202b20 3728:S3|2a3820 3729:S3|2a3420 3730:S3|2a3220 3731:S10|4d6f7665427974655220 3732:S12|4c6f6164436f646552656620 3733:S18|4c6f616448616e646c657241646472657373 3734:S7|4d6f76654d5220 3735:S19|4c6f636b4d757461626c655365676d656e7420 3736:S9|4d616b655361666520 3737:S7|4d6f7665435220 3738:S3|203c3d 3739:S5|506f705220 3740:S6|446574616720 3741:S6|507573684320 3742:S6|507573684d20 3743:S6|507573685220 3744:S7|52657065617420 3745:S10|53746f7265576f726473 3746:S10|53746f72654279746573 3747:S9|4d6f7665576f726473 3748:S12|436f6d706172654279746573 3749:S9|4d6f76654279746573 3750:S11|5265736574537461636b20 3751:S19|52657475726e46726f6d46756e6374696f6e20 3752:S23|5368696674205269676874204172697468656d65746963 3753:S18|5368696674204c656674204c6f676963616c 3754:S19|5368696674205269676874204c6f676963616c 3755:S4|20627920 3756:S7|20627920454358 3757:S12|537461727448616e646c6572 3758:S23|53746f726542797465436f6e7374546f4d656d6f727920 3759:S6|203c3d203078 3760:S21|53746f726542797465526567546f4d656d6f727920 3761:S19|53746f7265436f6e7374546f4d656d6f727920 3762:S16|53746f7265496e697469616c69736564 3763:S23|53746f72654c6f6e67436f6e7374546f4d656d6f727920 3764:S17|53746f7265526567546f4d656d6f727920 3765:S9|54616756616c756520 3766:S12|54657374427974654d656d20 3767:S3|203078 3768:S9|546573745461675220 3769:S14|556e636f6e644272616e6368204c 3770:D15,600|483b65187303ff5548488338017562488b4808f6c10174084883f9017d26eb06f641ff10741e4889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889c848c7c30500000048baa05f06c9a37f0000ff15120200004889c348b8c87f0cc9a37f0000ff2507020000483b0508020000741a48833801741f488338037519488378080175124883781001750b48b8e07f0cc9a37f0000c3483b05e2010000741a48833801741f488338037519488378080775124883781001750b48b8f87f0cc9a37f0000c3483b05bc010000741a48833801741f488338037519488378080375124883781001750b48b810800cc9a37f0000c3483b0596010000741a48833801741f488338037519488378080575124883781001750b48b828800cc9a37f0000c3483b0570010000741a48833801741f488338037519488378080975124883781001750b48b840800cc9a37f0000c3483b054a010000741a48833801741f488338037519488378080b75124883781001750b48b858800cc9a37f0000c3483b0524010000741a48833801741f488338037519488378080d75124883781001750b48b870800cc9a37f0000c3483b05fe000000741a48833801741f488338037519488378080f75124883781001750b48b888800cc9a37f0000c3488338017513488b4008a80174064883c0207123ff5570ebf548837810037513488b4008a80174064883c0107109ff5570ebf5488b400848c7c30300000048baa05f06c9a37f0000909090ff158e0000004889c348b8a0800cc9a37f0000ff258300000090909000000000000000005002000000000000|@3803,2097151,@16125,@194,@100,@884,@3804,@833,@3805,@3806,@3807,@3808,@3802,@194,@100|43,0,@376 53,0,I106 80,0,@193 99,0,@3771 150,0,@3772 196,0,@3773 242,0,@3774 288,0,@3775 334,0,@3776 380,0,@3777 426,0,@3778 472,0,@3779 545,0,@193 567,0,@3780 3771:S2|6670 3772:S4|25726178 3773:S4|25726278 3774:S4|25726378 3775:S4|25726478 3776:S4|25727370 3777:S4|25726270 3778:S4|25727369 3779:S4|25726469 3780:S2|2572 3781:S33|5838364f5554505554434f444528292e7072696e744f7065726174696f6e283229 3782:D9,352|483b65187303ff55484151535048c7c3030000004c89c048baa05f06c9a37f0000909090ff154e010000488b54241090ff1248c7c051000000488b5424109090ff125890ff1536010000488b54240890ff1248c7c053000000488b5424089090ff12488b0424488338077533ff700848c7c0b7000000488b54241090ff125890ff1502010000488b54240890ff1248b8a8820cc9a37f00004883c4085aff22488338057532ff700848c7c0b7000000488b542410ff125890ff15d2000000488b54240890ff1248b8c0820cc9a37f00004883c4085aff22488338037532ff700848c7c0b7000000488b542410ff125890ff15a2000000488b54240890ff1248b8d8820cc9a37f00004883c4085aff2248833801752fff700848c7c0b7000000488b542410ff125890ff1572000000488b54240890ff1248c7c0bb0000004883c4085aff2248c7c0010000004883c410c300000000000000005801000000000000|@3786,2097151,@16120,@194,@3770,@3770,@3770,@3770,@3770|25,0,@193 144,0,@3783 200,0,@3784 256,0,@3785 3783:S3|2a385d 3784:S3|2a345d 3785:S3|2a325d 3786:S51|5838364f5554505554434f444528292e7072696e744f7065726174696f6e2832297072696e74426173654f6666736574283329 3787:D4,48|483b65187303ff55484889c148c7c019000000dd01ddd9ff252b00000090909000000000000000002800000000000000|@3794,2097151,@16121,@3788| 3788:D21,864|483b65187303ff55484889c1d9c0d8d9dfe04881e0004400004881f000400000488d440001740b48b8b0870cc9a37f0000c3d9c0dc0d1e030000ddd2dc1d0e030000dfe04881e0004400004881f000400000488d440001742ad9eed8d9dfe04881e000450000488d440001740b48b8c8870cc9a37f0000c348b8e0870cc9a37f0000c3514989c848c7c305000000498d47f0483b45107303ff55404989c748c740f801000000c640ff01d9c0dd1848ba90abdc0000000000ff12488b10f6c201740948c7c103000000eb08488b0a488d4c0901488b5808f6c301740ef60424017408483b1c247e07eb18ff5570ebf3f6c30174084883fbf77c08eb65f643ff1074644883f90374634c8b48104989da4989d34989cc49c7c00300000048c7c3010000004c89d89090ff154a0200004d89cd48c7c35d000000ff154202000041f6c40174064983ec027105ff5570ebf54989c14d89e048c7c3030000004c89d8eb0fe976000000e971000000e917000000ff15120200004889c34c89c8ff150e0200004889c2eb074c8b68104989da48c7c38b0000004889d0ff15fa01000041f6c20174064983ea027105ff5570ebf541555048c7c3030000004c89d048baa05f06c9a37f00009090ff15d20100004889c3589090ff15ce010000eb64f6c30174084883fb017f5eeb06f643ff10745648c7c101000000f6c101740af6c3017405482bcb7105ff5570ebf64883c1014c8b50104989d34889c8ff15920100004889c348b8f8870cc9a37f000090ff15860100004c89db909090ff1582010000eb64e9da000000f6c101740af6c3017405483bcbeb05ff5570ebf67f4ef6c301740af6c1017405482bd97105ff5570ebf64883c3014c8b50104989d34889d8909090ff15420100004889c34c89d8ff153e01000048bb10880cc9a37f0000ff1536010000eb6ae9740000004c8b48104989da4989d34989cc4d89d048c7c3010000004c89d890ff15160100004d89cd48c7c35d000000ff150e01000041f6c401740b41f6c20174054d2be27105ff5570ebf64983c4014989c14d89e04c89d34c89d8ff15ea0000004889c34c89c8eb05e90a00000090ff15de0000004d89ea415248833c240174144889c348c7c0fd0000004883c410ff25c60000004883c410c3900000000000000000480300000000000000000000000000000000000000000000|@3798,2097151,@16122,@3795,@100,@3795,@100,@100,@194,@100,@3799,@100,@100,@3799,@100,@100,@3795,@100,@3795,@100,@100|41,0,@3789 111,0,@3790 122,0,@3791 176,0,I117 446,0,@193 547,0,@3792 660,0,@3793 3789:S3|6e616e 3790:S3|696e66 3791:S4|7e696e66 3792:S2|302e 3793:S2|2e30 3794:S17|5265616c2e67656e466d74283129283129 3795:D3,432|a801740948c7c103000000eb08488b08488d4c0901f6c3017413f6c30174084883fb017d1ceb06f643ff1074144889c248b8501106c9a37f0000488b5d0890ff1341f6c001741541f6c00174084983f8017d1eeb0741f640ff1074154889c248b8501106c9a37f0000488b5d089090ff134889da488d52ff4903d0483bd176154889c148b8288a0cc9a37f0000488b5d089090ff13a801740948c7c103000000eb08488b08488d4c09014883fb0175064c3bc17501c34983f801750b48b8509adc0000000000c34983f80375154883c31048d1eb480fb61c18488d5c1b014889d8c34c89c14883c11e48c1e9034883c901483b0db000000072134889c248b8583e06c9a37f0000488b5d08ff134889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f49d1e84c89074f8d4400014883c3104889d64889f84889c74c89c148d1e948d1eb4803f3488d5c1b014883c708f3a4488d7c3f01488d743601488d4c0901488060ffbfc39090900000000000000000a001000000000000ffffffffffffff01|@3801,127,@16124|50,0,@40 97,0,@40 133,0,@3796 190,0,I48 255,0,@101 3796:O4|11,@42,0,@3797 3797:O5|@98,719,0,719,0 3798:S14|5265616c2e67656e466d74283229 3799:D4,96|483b65187303ff5548a80174084883f8017f13eb06f640ff10740b48b8509adc0000000000c3a80174064883e8027105ff5570ebf5e8c6ffffff4889c348c7c061000000ff252e00000090909090909000000000000000005800000000000000|@3800,255,@16123,@100|29,0,I48 3800:S16|5265616c2e6164645a65726f73283129 3801:S19|537472696e672e737562737472696e67283329 3802:O3|1,7,0 3803:S26|5838364f5554505554434f444528292e72656752657072283129 3804:O3|1,3,0 3805:O3|1,2,0 3806:O3|1,4,0 3807:O3|1,5,0 3808:O3|1,6,0 3809:O23|@884,@833,@3805,@3804,@3806,@3807,@3808,@3802,@3819,@2142,@3820,@3821,@3822,@3823,@3824,@3825,@440,@508,@1128,@3826,@3827,@738,@3818 3810:D8,432|483b65187303ff554848c7c10100000048c7c30300000048c7c60100000050524883f92f74684889cf40f6c70174064883c7027105ff5570ebf54989d84f8d4400ff4823d84883fb01745e56415057ff750848bbd68d0cc9a37f00005348896508f6c101741c4c8b4a0848bbffffffffffffff00492359f8488d5c1b01483bcb721748b8b0df06c9a37f0000eb05e98e000000488b5d08ff13498b4c89fc4883c4085b48895d08eb34e950000000488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d5fe8483b5d107303ff55404989df48c743f8020000004889730848890beb084889f36a014150574889de4c89c34889f94883c418483b65187303ff5548e9fffeffff4889f04883c410ff159a000000a801754648837808017505488b00eb44488b18488b4008909090ff15820000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488918ff1562000000eb0a48b8509adc00000000004889c348c7c0b7000000ff154e00000048c7c3bb000000ff2549000000900000000000000000a801000000000000|@3816,2097151,@16126,@3817,@3815,@109,@100,@100|84,0,$3810+174 108,0,36028797018963967 132,0,@560 198,0,@3811 378,0,I48 3811:O4|@20055,@557,@3813,@3812 3812:O5|@3814,520,0,520,0 3813:S19|426164207265676973746572206e756d626572 3814:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364f5554505554434f44452e4d4c 3815:D3,120|483b65187303ff5548a8017551ff30488b40089090e8e6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c70059000000c348c7c001000000c3909000000000000000007000000000000000|@1585,3,@16128| 3816:S36|5838364f5554505554434f444528292e5265675365742e72656753657452657072283129 3817:D4,104|483b65187303ff5548a8017541ff7008488b0090ff156600000050488b44240890e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c3909000000000000000006000000000000000|@1363,2097151,@16127,@3770| 3818:O2|0,6 3819:O3|1,0,1 3820:O3|1,2,1 3821:O3|1,3,1 3822:O3|1,4,1 3823:O3|1,5,1 3824:O3|1,6,1 3825:O3|1,7,1 3826:O2|0,3 3827:O2|0,4 3828:S4|7073703d 3829:S5|206c696d3d 3830:S5|207273703d 3831:S5|726567733d 3832:S2|2d0a 3833:S28|47454e45524154455f434f444528292e636f646567656e2839292d45 3834:D3,680|483b65187303ff5548488b08488b09488339037418488b104889c648b800960cc9a37f0000488b5d089090ff13488b5108488b12f6c301740af6c2017405483bdaeb05ff5570ebf67d60f6c30174084883fb017d08eb22f643ff10751c488b4108488b00f6c3017409a8017405483bd8eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13f6c30174064883c3027105ff5570ebf5488b49084c894499fc48c7c001000000c3488b5108488b124150ff710853ff30ff700848c7c3070000004889d048ba50a9dc0000000000ff12488b4c2410f6c10174064883c1027105ff5570ebf5a801740af6c1017405483bc1eb05ff5570ebf67f034889c8a80174084883f8017d08eb1bf640ff107515a801740b483b05840100007c1beb06f640ff1075134889c148b820f007c9a37f0000488b5d08ff134889c1f6c10174064883c1027105ff5570ebf54889c258488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488917488b442410488b0048c7c101000000f6c101740da8017409488d49ff4803c87105ff5570ebf2488b17f6c101740af6c2017405483bcaeb05ff5570ebf67e144889c148b8c8960cc9a37f0000488b5d0890ff13488b7424104889f94889cf4889ca4889c148d1e94883c6084883c708f348a5488d7c3f01488d743601488d4c0901498d47e8483b45107303ff55404989c748c740f8020000004889500848c7000300000059488901488b0424a80174084883f8017d08eb1ef640ff107518488b0aa801740af6c1017405483bc1eb05ff5570ebf67c1148b810f407c9a37f0000488b5d0890ff13a80174064883c0027105ff5570ebf54883c4105948894c82fc48c7c001000000c390909090909000000000000000009802000000000000fdffffffffffff01|@3841,2097151,@16130|29,0,@3835 123,0,@1517 200,0,I108 299,0,@1509 454,0,@3839 602,0,@1517 3835:O4|103,@112,@3837,@3836 3836:O5|@3838,93,0,93,0 3837:S39|417474656d707420746f207570646174652061206c6f636b656420737472657463684172726179 3838:S40|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f5374726574636841727261792e4d4c 3839:O4|11,@42,0,@3840 3840:O5|@1357,200,0,200,0 3841:S22|5374726574636841727261792e757064617465283329 3842:D11,432|483b65187303ff5548f6c301756e4150ff7320ff7318ff7310ff33ff730848c7c30300000048baa05f06c9a37f000090ff1592010000488b54242890ff1248c7c041000000488b5424289090ff1248c7c3030000005848baa05f06c9a37f0000ff156a010000488b54242090ff1248c7c041000000488b542420eb05e913010000909090ff12488b5c242058ff154601000048833c2401743548833c2401742e48b860990cc9a37f0000488b54241890ff12488b042448ba58470cc9a37f0000ff151a010000488b54241890ff1248837c240801751648b878990cc9a37f0000488b542418909090ff12eb4a48c7c303000000488b44240848baa05f06c9a37f00009090ff15de0000004889c348b890990cc9a37f000090ff15d200000048c7c341000000909090ff15ca000000488b54241890ff12f6442410017549488b442410ff3048b8a8990cc9a37f0000488b54242090ff1248c7c3030000005848baa05f06c9a37f0000ff1592000000488b54241890ff1248c7c053000000488b5424189090ff1248c7c0150000004883c4185aff2248c7c001000000c3909090900000000000000000a801000000000000|@3857,2097151,@16135,@194,@194,@3854,@3810,@194,@100,@100,@194|39,0,@193 88,0,@193 162,0,@3843 184,0,@3645 216,0,@3844 250,0,@193 271,0,@3845 326,0,@3846 352,0,@193 3843:S4|20696e20 3844:S6|2074656d7020 3845:S6|206c69666520 3846:S10|20746f20626173654028 3847:S29|434f444547454e5f5441424c4528292e7072696e74537461636b283329 3848:D4,120|483b65187303ff554848c7c101000000504151f6c10174084883f92d7e14eb06f641ff10750c48c7c0010000004883c410c3514c8b442408488b5c24104889c8ff154a00000058a80174064883c0027105ff5570ebf54889c1483b65187303ff5548ebaf9090909000000000000000007000000000000000|@3850,2097151,@16132,@3849| 3849:D5,376|483b65187303ff5548a80174084883f8017d08eb1ef640ff107518488b0ba801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b4c8bfcf6c10174084883f9017e68eb06f641ff1075655141505048c7c0410000004c89c29090ff12ff750848b8869b0cc9a37f00005048896508f644241001740848837c24102f721248b8b0df06c9a37f0000488b5d089090ff13488b44241048b9688c0cc9a37f0000488b4481fc4883c40859eb0ae984000000e97f00000048894d08eb319090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13909090ff1572000000488b5424084883c40890ff1248c7c07b000000488b1424909090ff1248c7c303000000488b44240848baa05f06c9a37f0000ff15420000005a4883c408ff2248c7c001000000c390909000000000000000007001000000000000|@3851,2097151,@16133,@3770,@194|56,0,@1493 139,0,$3849+230 169,0,@560 192,0,@3809 254,0,@3811 328,0,@193 3850:S28|434f444547454e5f5441424c4528292e7072696e7452656773283429 3851:S39|434f444547454e5f5441424c4528292e7072696e74526567732834297072696e74526567283129 3852:D3,272|488b08488b09488339017566488b710848baffffffffffffff00482356f8488d541201f6c301740af6c2017405483bdaeb05ff5570ebf67d3ef6c301741848b8ffffffffffffff00482346f8488d440001483bd8721348b8b0df06c9a37f0000488b5d08909090ff13488b5c9efc4889d8c3e905000000488b4008c3488b5108488b12f6c301740af6c2017405483bdaeb05ff5570ebf67d5df6c30174084883fb017d08eb22f643ff10751c488b4108488b00f6c3017409a8017405483bd8eb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c30174064883c3027105ff5570ebf5488b4908488b5c99fc4889d8c3488b4008c3909090909000000000000000000801000000000000|@3853,31,@16134|18,0,36028797018963967 64,0,36028797018963967 88,0,@560 202,0,@1493 3853:S19|5374726574636841727261792e737562283229 3854:D9,472|483b65187303ff5548488b0848ba369e0cc9a37f0000488d548afcffe290e93a000000909090e959000000909090e9b5000000909090e901010000909090e90b000000909090e93e01000090909053488b400890ff15960100005aff2253ff700848c7c0510000004889da90ff1258488b4020488b142490ff1248c7c0530000005aff2253ff700848c7c0b70000004889da9090ff1258a8017543ff700848c7c303000000488b0048baa05f06c9a37f00009090ff153e010000488b54240890ff1248c7c041000000488b5424089090ff1258483b65187303ff5548ebb948c7c0bb0000005aff2253ff7010488b4008ff150a010000488b54240890ff1248b848a00cc9a37f0000488b542408909090ff1248c7c3030000005848baa05f06c9a37f0000ff15de000000488b14249090ff1248c7c0530000005aff22f6400801743bf64008017515488b480848b8b8f309c9a37f0000488b5d0890ff135348c7c303000000488b400848baa05f06c9a37f000090ff15960000005aff2248c7c07f0000004889daff2253ff700848b860a00cc9a37f00004889da9090ff1248c7c3030000005848baa05f06c9a37f0000ff1562000000488b14249090ff1248c7c0530000005aff220000000000000000d001000000000000|@3858,2097151,@16136,@3770,@194,@3770,@194,@194,@194|14,0,$3854+30 170,0,@193 256,0,@3855 284,0,@193 334,0,@2708 363,0,@193 399,0,@3856 424,0,@193 3855:S2|4028 3856:S6|626173654028 3857:S29|434f444547454e5f5441424c4528292e7072696e74456e747279283329 3858:S34|434f444547454e5f5441424c4528292e7072696e74537461636b556e696f6e283229 3859:D3,24|488b4208c390909000000000000000001000000000000000|@3860,5,@16137| 3860:S29|47454e45524154455f434f444528292e67656e636f6465283329283129 3861:S11|3c746f70206c6576656c3e 3862:O1|@3863 3863:D3,40|48b8d0a10cc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@3833,1,@16138|2,0,@3864 3864:O4|@20055,@557,@3866,@3865 3865:O5|@3867,2523,0,2523,0 3866:S17|746f70206c6576656c2072656163686564 3867:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f47454e45524154455f434f44452e4d4c 3868:D3,80|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b520848891048ba50c1dc0000000000ff229090909000000000000000004800000000000000|@3860,2097151,@16139|50,0,I204 3869:D10,552|483b65187303ff554841f6c00174084983f8297c69eb0741f640ff107565504151534c89c348c7c0f1ffffff48ba50a9dc00000000009090ff124989c448c7c3a100000048b8788b0cc9a37f00009090ff15ea010000498d4fd0483b4d107303ff55404989cf48c741f80500000048ba788b0cc9a37f000048895120eb0ae968000000e9630000004c89611848bae86f0cc9a37f00004889511048ba98a50cc9a37f00004889510848c7013d000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a4883f80174554889c34889d09090ff15620100004889c2eb424983fa0174264989c44d89cd4989de48c7c39100000048b8088c0cc9a37f000090ff153e0100004889c2eb1048c7c2010000004989c44989de4d89cd4154415541565848c7c101000000a8017534498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0848890b4889d9488b4008483b65187303ff5548ebc84889c84883f801740f4889c34889d0ff15d60000004889c252488b5c24104889d048baa8a50cc9a37f0000ff15c2000000488b4424104883b888000000017443488b0c246a016a014989e149c7c00100000048c7c3010000004889c8909090ff159600000048837c2408037510594883c408483b65187303ff5548ebc7488b0424eb08488b04246a016a014c8b4424204883c4185b4883c40848ba70a70cc9a37f0000ff255a000000909000000000000000002002000000000000|@6714,2097151,@17362,@6715,@6720,@6715,@6721,@3872,@6704,@3876|46,0,I108 70,0,@3802 112,0,@3802 142,0,@3659 156,0,@3870 259,0,@3806 400,0,@3871 520,0,@3875 3870:O1|@3806 3871:O2|@3872,@3644 3872:D4,304|483b65187303ff55484883bba000000001746a4889c148c7c603000000f6c1017537488b3948833f39751c4c8b47084d8b481049893140f6c60174064883c6027105ff5570ebf5488b79084889f9483b65187303ff5548ebc44889f1488b4b20483b0de10000007439f6c101754a4889ce48bf509adc0000000000eb05e99200000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017516ff7350525048c7c07f000000488b54241090ff12eb12ff73505250488b4320488b5424109090ff1248b820a70cc9a37f0000488b542410909090ff1258a8017523488b0c24ff7008488b5c2410488b00488b51089090ff1258483b65187303ff5548ebd948c7c0150000004883c4085aff2248c7c001000000c39090909000000000000000002801000000000000|@3874,1048575,@16140,I48|115,0,I48 204,0,@3873 3873:S2|3a0a 3874:S36|5838364f5554505554434f444528292e7072696e744c6f774c6576656c436f6465283229 3875:O3|@3876,@3645,@3871 3876:D14,2680|483b65187303ff5548535241504c8b4210488b1c24909090ff15720a0000488b0424488b4818488b09488b9080000000488b12ff7050ffb0a0000000ff7030ff704851ff7070ff702052ff30ff7010ff7038488b442410488b00a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f801745b48c7c31f000000488b442458909090ff15a609000048b888b20cc9a37f0000ff159e090000488b4c2458488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff157e090000483b65187303ff5548e91affffff48c7c001000000488b442410488b00488b4c2458488b11488b124889d34883c310488b3148891e5049c7c1110000004989d048c7c301000000488b4110909090ff1532090000488b442418488b0048ba10a5dc0000000000ff124889c14889c848ba90a4dc00000000009090ff12a80174084883f8017d24eb06f640ff10741c514889c348b810c506c9a37f000048bad0a8dc0000000000ff12eb01515048bb10c506c9a37f0000488b44240848ba10a2dc000000000090ff1248bb98b20cc9a37f000048ba909bdc00000000009090ff124883f801750c48b810c506c9a37f0000eb0748c7c001000000a8017410f6042401740a488d40ff480304247105ff5570ebf1488b4c24704883c410a80174084883f8017c3beb06f640ff107533a801752750ff7110ff3148bba8b20cc9a37f000048bad0c8dc0000000000909090ff124883f8017410eb1f50ff7110ff31eb1750ff7110ff3148b8c0b20cc9a37f0000488b5d0890ff13488b0424488b004889c14883c1105a48890a49c7c1110000004989c0488b5c2408584883c40890ff15ea070000488b442438a8017533488b08ff7008ff7424184c8b5424704c8b4c24284c8b4110488b5908488b019090ff15c207000058483b65187303ff5548ebc948c7c001000000488b442418488b0048c1e8034883c801f6442420017518488b542420488b0af642ff10740348f7d9488d4c0901eb05488b4c2420488d40ff4803c14883c0084883f8017409483b051307000072164889c148b8901609c9a37f0000488b5d08909090ff134889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f498d47d8483b45107303ff55404989c748c740f8020000004889780848c70001000000488d481848c741f801000000c641ff40488901498d47f0483b45107303ff55404989c748c740f801000000488908488b542408488902488b442418488b00488b542410488b1248833a017509488b1948833b0174144889c348b840b30cc9a37f0000488b5d0890ff13488b19488b7a0848beffffffffffffff00482377f8488d7436014c8b4b0849b8ffffffffffffff004d2341f84f8d440001488d34f5f9ffffff4e8d04c5f9ffffff4c2bc04983c001483bf072064983f80173154889c648b828b40cc9a37f0000488b5d089090ff134889fe4c89cf4889ca4889c148d1e9f3a4488d7c3f01488d743601488d4c0901488b442418488b0048c1e8034883c8014889c14883c106f6442420017518488b7c2420488b37f647ff10740348f7de488d743601eb05488b742420488d49ff4803ce488d0ccdf9ffffff48c7c60700000040f6c6017412f644242001740b488d76ff48037424207105ff5570ebf0525049c7c1110000004989c84889f34889d0909090ff1572050000488b442408488b004883380174154889c148b880b40cc9a37f0000488b5d089090ff13ff700848c7c385000000488b042448ba50c0dc0000000000909090ff12498d47e8483b45107303ff55404989c748c740f802000000594889480848c70005000000488b4c2408488901488b014883380574164889c248b810b50cc9a37f0000488b5d08909090ff13488b580848baffffffffffffff00482353f8488d541201483b1424771348b8a8b50cc9a37f0000488b5d08909090ff13488b1424488b74243848897493fc4883c20248be00b60cc9a37f000048c7c70100000040f6c601755b488b0e4c8b014983380175154d8b480841f6c10174064983c1207125ff5570ebf5498378100375154d8b480841f6c10174064983c1107109ff5570ebf54d8b480841f6c10175194d8b1141f641ff10740349f7da4f8d541201eb08e95a0000004d89ca4c8b41084c89d149c7c1030000004983e9014883f97f760748c7c17f00000048d1e949d3e14983c901488d4c09014c238c24800000004983f90174094983f9017403490bf8488b7608483b65187303ff5548e940ffffff4889f9488b742408488b3648833e05741048b810b50cc9a37f0000488b5d08ff134c8b460848bfffffffffffffff00492378f8488d7c3f01483bfa771048b8a8b50cc9a37f0000488b5d08ff1349894c90fc594883c104488b1424488b1248833a05741148b810b50cc9a37f0000488b5d0890ff134c8b4a0848bfffffffffffffff00492379f8488d7c3f01483bf9771048b8a8b50cc9a37f0000488b5d08ff13488b7c243849897c89fc488b4c2440f6c1017564488b01488b501048833a01745c48833a03755b488b5a08488b1b488b3424488b3648833e017519488b10488b780848b840ba0cc9a37f0000488b5d089090ff13488b384c8b4008488b460848ba10c4dc00000000009090ff12ff71084989f94c89c1eb0fe974000000e95d000000e9280000004989c04889cb488b44247090ff15a2020000488b442450488b004883e802488b4c2450488901eb33ff71084c8b084c8b4208488b5808488b44247090ff157a020000488b442450488b004883e802488b4c2450488901eb03ff710859483b65187303ff5548e91effffff48c7c001000000488b442448488b004883f8017573488b0424488b004883380574154889c148b8c8ba0cc9a37f0000488b5d089090ff13ff700848c7c305000000488b042448ba50c0dc0000000000909090ff12498d47e8483b45107303ff55404989c748c740f802000000594889480848c70003000000488b0c2448890148c7c001000000eb0748c7c00100000048837c245001742a488b0424488b00488338017517488b480848b840ba0cc9a37f0000488b5d08909090ff13488b4008eb46488b0424488b00488338017515488b480848b840ba0cc9a37f0000488b5d0890ff13488b4808498d47f0483b45107303ff55404989c748c740f801000000488908488060ffbf488b4c2468488b5178488b1250f6c201753f498d47e8483b45107303ff55404989c748c740f802000000488b0c2448894808488b5c2470488918ff7208488b12909090ff125a483b65187303ff5548ebbc48c7c00100000048837c246001745f4c8b442470488b5c2408488b442410ff15de00000048b860bb0cc9a37f0000488b542468909090ff12488b442478488b4808488b8424800000004889ca9090ff12488b54246890ff1248b880bb0cc9a37f0000488b542468909090ff12eb0748c7c001000000584881c480000000c3909090900000000000000000680a000000000000ffffffffffffff01|@4108,2097151,@16141,@4109,@4200,@4215,@4192,@4246,@4246,@4290,@4246,@4295,@4295,@3950|113,0,@376 123,0,I106 143,0,I110 244,0,@3877 392,0,I91 410,0,I89 446,0,@376 456,0,I106 472,0,@376 487,0,I79 500,0,@3878 510,0,I53 530,0,@376 611,0,@3879 621,0,I234 658,0,@3880 868,0,@2212 1078,0,@3883 1102,0,36028797018963967 1125,0,36028797018963967 1181,0,@3887 1385,0,@3889 1417,0,I200 1488,0,@3892 1511,0,36028797018963967 1536,0,@3895 1573,0,@3897 1799,0,@3892 1819,0,36028797018963967 1843,0,@3895 1882,0,@3892 1903,0,36028797018963967 1927,0,@3895 2009,0,@3942 2038,0,I215 2221,0,@3945 2253,0,I200 2352,0,@3942 2394,0,@3942 2564,0,@3948 2616,0,@3949 3877:O1|25 3878:B8|0000000000000000 3879:B16|00000000000000000100000000000000 3880:O4|@20055,@557,@3882,@3881 3881:O5|@3814,415,0,415,0 3882:S20|67656e3634753a20696e76616c696420776f7264 3883:O4|@20055,@557,@3885,@3884 3884:O5|@3886,134,0,134,0 3885:S49|63736567436f70795365673a2063616e206f6e6c7920636f7079206265747765656e206279746520736567656d656e7473 3886:S50|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f434f44455f41525241592e4d4c 3887:O4|11,@42,0,@3888 3888:O5|@3886,130,0,130,0 3889:O4|@20055,@557,@3891,@3890 3890:O5|@3886,97,0,97,0 3891:S37|63736567436f6e76657274546f436f64653a206e6f7420612062797465207365676d656e74 3892:O4|@20055,@557,@3894,@3893 3893:O5|@3886,193,0,193,0 3894:S41|63736567507574576f72643a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 3895:O4|11,@42,0,@3896 3896:O5|@3886,190,0,190,0 3897:O2|@3899,@3898 3898:O2|@3902,@3901 3899:O2|@3900,1 3900:O3|1,0,0 3901:O2|@3904,@3903 3902:O2|@833,2 3903:O2|@3906,@3905 3904:O2|@3805,4 3905:O2|@3908,@3907 3906:O2|@3804,8 3907:O2|@3910,@3909 3908:O2|@3808,16 3909:O2|@3912,@3911 3910:O2|@3802,32 3911:O2|@3914,@3913 3912:O2|@3819,64 3913:O2|@3916,@3915 3914:O2|@2142,128 3915:O2|@3918,@3917 3916:O2|@3820,256 3917:O2|@3920,@3919 3918:O2|@3821,512 3919:O2|@3922,@3921 3920:O2|@3822,1024 3921:O2|@3924,@3923 3922:O2|@3823,2048 3923:O2|@3926,@3925 3924:O2|@3824,4096 3925:O2|@3929,@3928 3926:O2|@3927,8192 3927:O2|0,0 3928:O2|@3931,@3930 3929:O2|@508,16384 3930:O2|@3933,@3932 3931:O2|@1128,32768 3932:O2|@3935,@3934 3933:O2|@3826,65536 3934:O2|@3937,@3936 3935:O2|@3827,131072 3936:O2|@3939,@3938 3937:O2|@738,262144 3938:O2|@3940,0 3939:O2|@3818,524288 3940:O2|@3941,1048576 3941:O2|0,7 3942:O4|@20055,@557,@3944,@3943 3943:O5|@3886,109,0,109,0 3944:S28|63736567416464723a206e6f74206120636f6465207365676d656e74 3945:O4|@20055,@557,@3947,@3946 3946:O5|@3886,105,0,105,0 3947:S47|63736567436f6e76657274546f436f64653a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 3948:S15|526567697374657220736574203d20 3949:S2|0a0a 3950:D192,19840|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498b5020483b15614d0000743af6c201755a4889d648bf509adc00000000004989c948c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c9eb254989c941ff7050415141ff704841ff7018505348c7c07f000000488b5424289090ff12eb1a41ff70505141ff704841ff701850534889d0488b54242890ff1248b820a70cc9a37f0000488b542428909090ff12488b442420488b00483b442408736f488b442420488b00a80174084883f8017d23eb06f640ff10741b4889c348b810c506c9a37f000048bad0a8dc00000000009090ff1248c7c30500000048baa05f06c9a37f000090ff157e4c0000488b54242890ff1248c7c013000000488b5424289090ff12488b442420488b00eb05e9174c0000488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272154889c248b8280f0dc9a37f0000488b5d089090ff1348d1e8480fb60403488d4400014881f8e1010000753048b8800f0dc9a37f0000488b5424289090ff12488b442420488b004883c002488b4c242048890148c7c001000000eb0748c7c001000000488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272144889c248b8280f0dc9a37f0000488b5d0890ff1348d1e8480fb60403488d4400014881f881000000721f4881f89f0000007716488b542420488b124883c202488b742420488916eb0748c7c0010000004889c24883e2114883fa01740948c7c201000000eb0748c7c2030000004883f2024889c64883e6094883fe01740948c7c601000000eb0748c7c6030000004883f6024889c74883e7054883ff01740948c7c701000000eb0748c7c7030000004883f7024989c04983e0034983f801740949c7c001000000eb0749c7c0030000004983f0024c8b4c24204d8b094c8b14244d8b124d8b620849bbffffffffffffff004d235c24f84f8d5c1b014e8d1cddf9ffffff4d3bcb72144989c348b8280f0dc9a37f0000488b5d0890ff1349d1e94f0fb60c0c4f8d4c09014c8b5c24204d8b1b4983c3024c8b6c24204d895d004989c34989d648b8980f0dc9a37f000090ff154a4a00004c3bc8743048b8a80f0dc9a37f0000909090ff153a4a00004c3bc8741848b8b80f0dc9a37f0000909090ff152a4a00004c3bc8755b498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001a801740d4883f8017d16eb0be9bd020000f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf54151415348c7c31100000048ba90a9dc000000000090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f80d750c48b8c80f0dc9a37f0000eb5a4883f80b750c48b8e00f0dc9a37f0000eb4d4883f809750c48b8f80f0dc9a37f0000eb524883f807750c48b810100dc9a37f0000eb4f4883f805750c48b828100dc9a37f0000eb3d4883f803751648b840100dc9a37f0000eb2be926000000e9210000004883f801741148b858100dc9a37f0000eb0fe90a00000048b870100dc9a37f0000488b54243890ff1248b8b80f0dc9a37f0000ff158a480000483b442408751348c7c0c5000000488b542438909090ff12eb0e48c7c0d9000000488b542438ff1248b888100dc9a37f0000488b542438909090ff12ff7424204c8b5424304c8b4c24404c8b442418488b5c2438488b44240890ff153248000048c7c0590000004883c408488b5424309090ff1248b8a80f0dc9a37f0000ff1516480000483b04247528ff7424304c8b5424204c8b4c24284c8b442410488b5c243048c7c00100000090ff15f2470000eb65488b442428488b00488b4c2408488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272154889c248b8280f0dc9a37f0000488b5d089090ff1348d1e8480fb60403488d440001a80174104881f8010100007c2eeb0be9ee460000f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542428488b124883c202488b74242848891648c7c30500000048baa05f06c9a37f00009090ff153a470000488b54243090ff12eb6c48b8785107c9a37f00009090ff15264700004c3bc8755a48b8a0100dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae91f460000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15fa450000488b54242890ff12eb6c48b8404607c9a37f00009090ff15e64500004c3bc8755a48b8b8100dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae9cd440000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15ba440000488b54242890ff12eb6c48b8a00007c9a37f00009090ff15a64400004c3bc8755a48b8d0100dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae97d430000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff157a430000488b54242890ff12eb6c48b848ff06c9a37f00009090ff15664300004c3bc8755a48b8e8100dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae92d420000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff153a420000488b54242890ff12eb6c48b8304107c9a37f00009090ff15264200004c3bc8755a48b800110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae9dd400000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15fa400000488b54242890ff12eb6c48b8f86209c9a37f00009090ff15e64000004c3bc8755a48b818110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae98d3f0000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15ba3f0000488b54242890ff12eb6c48b8e83e07c9a37f00009090ff15a63f00004c3bc8755a48b830110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae93d3e0000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff157a3e0000488b54242890ff12eb6c48b8e84007c9a37f00009090ff15663e00004c3bc8755a48b848110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae9ed3c0000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff153a3d0000488b54242890ff12eb6c48b8905007c9a37f00009090ff15263d00004c3bc8755a48b860110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae99d3b0000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15fa3b0000488b54242890ff12eb6c48b8a04f07c9a37f00009090ff15e63b00004c3bc8755a48b878110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae94d3a0000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15ba3a0000488b54242890ff12eb6c48b8f84507c9a37f00009090ff15a63a00004c3bc8755a48b890110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae9fd380000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff157a390000488b54242890ff12eb6c48b8684507c9a37f00009090ff15663900004c3bc8755a48b8a8110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae9ad370000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff153a380000488b54242890ff12eb6c48b8c0110dc9a37f00009090ff15263800004c3bc8755a48b8d0110dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae95d360000e9da000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b742420488916488b16f6c20174084883fa017d26eb06f642ff10741e504889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c74889d057a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000909090ff15fa360000488b54242890ff12eb6248b8e8110dc9a37f00009090ff15e63600004c3bc87565498b4500488b1c2490ff15da360000488b4c2420488b094883c108488b54242048890a5048b8f8110dc9a37f0000488b5424309090ff12488b442428488b00a801740d4883f8017d2eeb0be917350000f640ff1074214889c348b810c506c9a37f0000eb05e94b00000048bad0a8dc000000000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000ff1546360000488b54242890ff12eb6248b830e306c9a37f00009090ff15323600004c3bc87565498b4500488b1c2490ff1526360000488b4c2420488b094883c108488b54242048890a5048b810120dc9a37f0000488b5424309090ff12488b442428488b00a801740d4883f8017d2eeb0be94b340000f640ff1074214889c348b810c506c9a37f0000eb05e94b00000048bad0a8dc000000000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c40848baa05f06c9a37f0000ff1592350000488b54242890ff12eb6848b828120dc9a37f00009090ff157e3500004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae979330000e956010000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf541535648c7c31100000048ba90a9dc0000000000909090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048b838120dc9a37f0000488b54244090ff12ff7424284c8b5424384c8b4c24484c8b442420488b5c2440488b44241890ff154e34000048c7c059000000488b5424409090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff15e6330000488b5424404883c41890ff12eb644c89c84883e00f4883f807755c4983f97f735b498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0fe9b5310000e922020000e91d020000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf5415141535648c7c31100000048ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf5488b4c241048c1e9034883c9014883e10f4883f90d750f4889c148b8c80f0dc9a37f0000eb544883f90b750f4889c148b8e00f0dc9a37f0000eb594883f909750f4889c148b8f80f0dc9a37f0000eb5e4883f907750f4889c148b810100dc9a37f0000eb5b4883f90575144889c148b828100dc9a37f0000eb46e9410000004883f90375144889c148b840100dc9a37f0000eb2ce9270000004883f90174144889c148b858100dc9a37f0000eb12e90d0000004889c148b870100dc9a37f000051488b542448909090ff1248c7c013000000488b5424489090ff12ff7424304c8b5424404c8b4c24504c8b442428488b5c2448488b44241890ff15ce31000048c7c059000000488b5424489090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff1566310000488b5424484883c42090ff12eb6848b850120dc9a37f00009090ff154e3100004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae9212f0000e956010000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf541535648c7c31100000048ba90a9dc0000000000909090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048b838120dc9a37f0000488b54244090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff15e22f0000488b5424404883c41090ff1248c7c059000000488b5424309090ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15aa2f0000eb6848b860120dc9a37f00009090ff159e2f00004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae9552d0000e956010000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf541535648c7c31100000048ba90a9dc0000000000909090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048b870120dc9a37f0000488b54244090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff15322e0000488b5424404883c41090ff1248c7c059000000488b5424309090ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15fa2d0000eb6848b888120dc9a37f00009090ff15ee2d00004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae98d2b0000e906030000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf541535748c7c31100000048ba90a9dc0000000000909090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048b898120dc9a37f0000488b54244090ff1248837c2408017456488b0424a80174064883c0107105ff5570ebf548c7c30300000048baa05f06c9a37f00009090ff15ae2c00004889c348c7c0e5000000ff15a62c000048c7c385000000909090ff159e2c0000488b54244090ff12eb25488b0424a80174224883f80172214883f80f776248b992de0cc9a37f0000488d4c81fcffe1e990010000e947000000e9420000009090e971000000909090e97d000000909090e989000000909090e995000000909090e9a1000000909090e9d2000000909090e9fe000000909090e92201000090909048c7c303000000488b042448baa05f06c9a37f000090ff150a2c00004889c348c7c0e5000000ff15022c0000488b54244090ff12eb5a48b8b0120dc9a37f0000488b54244090ff12eb5748b8c8120dc9a37f0000488b54244090ff12eb5c48b8e0120dc9a37f0000488b54244090ff12eb6148b8f8120dc9a37f0000488b54244090ff12eb6848837c2410017418eb05e9af00000048b810130dc9a37f0000eb0fe99e00000048b828130dc9a37f0000488b54244090ff12eb60e98500000048837c241001741148b840130dc9a37f0000eb0fe96c00000048b858130dc9a37f0000488b542440909090ff12eb56e95100000048837c241001740c48b870130dc9a37f0000eb0a48b888130dc9a37f0000488b542440ff12eb2ae92500000048837c241001740c48b8a0130dc9a37f0000eb0a48b8b8130dc9a37f0000488b542440ff1248c7c0590000004883c410488b5424309090ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15ba2a0000eb6448b8d0130dc9a37f00009090ff15ae2a00004c3bc8726948b8e8130dc9a37f0000909090ff159e2a00004c3bc877564983e10f498d47e0483b45107303ff55404989c748c740f8030000004c8940104c89480848c700030000009090ff156e2a0000eb05e9192800004889c348b800140dc9a37f00009090ff155a2a0000eb0ae90f000000e90a000000488b54242890ff12eb6448b818140dc9a37f00009090ff153a2a00004c3bc8726948b830140dc9a37f0000909090ff152a2a00004c3bc877564983e10f498d47e0483b45107303ff55404989c748c740f8030000004c8940104c89480848c700030000009090ff15fa290000eb05e9832700004889c348b848140dc9a37f00009090ff15e6290000eb0ae90f000000e90a000000488b54242890ff12eb6748b888b20cc9a37f00009090ff15c62900004c3bc8751548b860140dc9a37f0000488b5424289090ff12eb6048b878140dc9a37f00009090ff15a22900004c3bc87569498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201eb05e9ec260000488d14d5f9ffffff483bc2721c4889c248b8280f0dc9a37f0000488b5d08eb05e9c72600009090ff1348d1e8480fb60403488d440001a801740f4883f801eb05e94b0100007d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf541535648c7c31100000048ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048b888140dc9a37f0000488b54244090ff12ff7424284c8b5424384c8b4c24484c8b442420488b5c2440488b44241890ff156a28000048c7c059000000488b5424409090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff1502280000488b5424404883c41890ff12eb5c48b8a0140dc9a37f00009090ff15ea2700004c3bc8726648b8b8140dc9a37f0000909090ff15da2700004c3bc8775341514150415648b838120dc9a37f0000488b542440ff1248833c2401745f488b442438488b00488b5c2418eb05e9fb240000909090ff15a227000048c7c30500000048baa05f06c9a37f0000eb0ae9ae000000e9a900000090ff1586270000488b54244090ff12488b442438488b004883c010488b4c2438488901eb26ff7424404c8b5424304c8b4c24384c8b442420488b5c244048c7c00100000090ff154a270000488b4424104883e00f4889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c700030000009090ff15122700004889c348c7c059000000ff150a270000488b5424404883c41890ff12eb6848b8d0140dc9a37f00009090ff15f22600004c3bc87556415348b8e0140dc9a37f0000488b542430ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15be26000048c7c0590000004883c408488b5424289090ff12ff742428eb0ae9bf230000e9260000004c8b5424184c8b4c24204c8b442408488b5c242848c7c001000000909090ff157e260000eb6948b800150dc9a37f00009090ff15722600004c3bc87557415348b810150dc9a37f0000488b542430ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff153e26000048c7c0590000004883c408488b5424289090ff12488b442420eb0ae926230000e9bd000000488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272144889c248b8280f0dc9a37f0000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b74242048891648c7c30500000048baa05f06c9a37f0000909090ff156e250000488b54242890ff12eb6848b830150dc9a37f00009090ff155a2500004c3bc8753d48b840150dc9a37f0000488b5424289090ff12ff7424284c8b5424184c8b4c24204c8b442408488b5c242848c7c001000000909090ff1522250000eb6748b858150dc9a37f00009090ff1516250000eb05e9f72100004c3bc8756d48b840150dc9a37f0000488b542428909090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc2721ceb05e9a42100004889c248b8280f0dc9a37f0000488b5d089090ff1348d1e8480fb60403eb05e970000000488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b74242048891648c7c30500000048baa05f06c9a37f0000ff153a240000488b54242890ff12eb6848b868150dc9a37f00009090ff15262400004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae9a3200000e91a010000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf5415348c7c31100000048ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f80d750c48b878150dc9a37f0000eb2e4883f809750c48b890150dc9a37f0000eb1c4883f805740c48b8a8150dc9a37f0000eb0a48b8c0150dc9a37f0000488b542430ff1248c7c013000000488b5424309090ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15b6220000eb6848b850f70bc9a37f00009090ff15aa2200004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae9131f0000e9b6010000a80174084883f8017d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf5415348c7c31100000048ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f80f745a4883f80d74594883f80b74584883f80974394883f80774244883f801740f4889c148b8a8150dc9a37f0000eb554889c148b8d8150dc9a37f0000eb584889c148b8f0150dc9a37f0000eb494889c148b808160dc9a37f0000eb3ae928000000e90f0000004889c148b820160dc9a37f0000eb214889c148b838160dc9a37f0000eb12e90d0000004889c148b850160dc9a37f000051488b54243890ff1248c7c013000000488b5424389090ff12ff7424204c8b5424304c8b4c24404c8b442418488b5c2438488b44241090ff15de20000048833c2401756348c7c059000000488b542438909090ff12ff7424384c8b5424284c8b4c24304c8b442418488b5c243848c7c001000000909090ff15a6200000eb6048b868160dc9a37f00009090ff159a2000004c3bc87569498b4500488b0c24488b09488b5908eb05e9271d000048baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc2721c4889c248b8280f0dc9a37f0000488b5d08eb05e9ef1c00009090ff1348d1e8480fb60403488d440001a801740f4883f801eb05e9e70100007d11eb06f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf5415348c7c31100000048ba90a9dc000000000090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f80774244883f801740f4889c148b8a8150dc9a37f0000eb1c4889c148b878160dc9a37f0000eb0d4889c148b890160dc9a37f000051488b542438ff1248c7c013000000488b5424389090ff12ff7424204c8b5424304c8b4c24404c8b442418488b5c2438488b44241090ff15261f000048833c2401756b48c7c059000000488b542438909090ff12488b442430488b00488b4c2410488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001a8017412eb05e94f1b00004881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542430488b124883c202488b74243048891648c7c30500000048baa05f06c9a37f0000ff155a1e0000488b54243890ff12eb6b48b8f09e0ac9a37f00009090ff15461e00004c3bc8743048b860780bc9a37f0000909090ff15361e00004c3bc8741848b8a8160dc9a37f0000909090ff15261e00004c3bc87563498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201eb05e9781a0000488d14d5f9ffffff483bc272144889c248b8280f0dc9a37f0000488b5d0890ff1348d1e8480fb60403488d440001a801740d4883f8017d16eb0be945020000f640ff10740948c7c201000000eb0748c7c2030000004883fa03740fa80174064883e80e7105ff5570ebf54151415348c7c31100000048ba90a9dc000000000090ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf54883f80f750c48b8b8160dc9a37f0000eb2e4883f80b750c48b8d0160dc9a37f0000eb1c4883f809740c48b8a8150dc9a37f0000eb0a48b8e8160dc9a37f0000488b542438ff1248c7c013000000488b5424389090ff12ff7424204c8b5424304c8b4c24404c8b442418488b5c2438488b44240890ff15b21c000048c7c0590000004883c408488b5424309090ff1248b8f09e0ac9a37f0000ff15961c0000483b0424751048c7c063000000488b542430ff12eb6548b860780bc9a37f00009090ff15761c0000483b0424751448b800170dc9a37f0000488b54243090ff12eb6b488b442428488b00488b4c2408488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc2721d4889c2eb05e98418000048b8280f0dc9a37f0000488b5d08909090ff1348d1e8480fb60403488d440001a80174124881f801010000eb05e9521800007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542428488b124883c202488b74242848891648c7c30500000048baa05f06c9a37f0000ff159e1b0000488b54243090ff12eb6848b880da06c9a37f00009090ff158a1b00004c3bc87556498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272134889c248b8280f0dc9a37f0000488b5d08ff1348d1e8480fb60403488d440001eb0ae985170000e9a2040000498b55004883c202498955004881f86d01000074094881f883010000755f498b5500488b3c24488b3f4c8b4f0849b8ffffffffffffff004d2341f84f8d4400014e8d04c5f9ffffff493bd072164989c048b8280f0dc9a37f0000488b5d08909090ff1348d1ea490fb61411488d541201f6c201740d4883fa017d16eb0be968010000f642ff10740949c7c001000000eb0749c7c0030000004983f8037410f6c20174064883ea0e7105ff5570ebf54153565048c7c3110000004889d048ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf548813c246d010000740f4889c148b818170dc9a37f0000eb0d4889c148b830170dc9a37f000051488b54244890ff12ff7424304c8b5424404c8b4c24504c8b442428488b5c2448488b44242090ff15c619000048c7c059000000488b5424489090ff12f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542410488950104889480848c70003000000909090ff155e190000488b5424484883c42090ff12eb5ba801740b4881f8010100007c5eeb06f640ff10755ba801740b4881f81f0100007f5eeb06f640ff10745b498b550050488b5c24084889d090ff151a190000488b4c2428488b094883c108488b54242848890a488b0c24f6c101eb05e934150000743e4881f901010000eb0ae914020000e90f020000722e4881f91f010000eb0ae9ff010000e9fa010000771e48bbe2f30cc9a37f0000488d9c8bfcfbffffffe3e98d000000e988000000e983000000909090e98a000000909090e973000000909090e989000000909090e990000000909090e997000000909090e99e000000909090e9a5000000909090e9b6000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e9a2000000909090e9ae000000909090e9bf000000909090e9cb0000009090904889c148b848170dc9a37f0000eb5a4889c148b860170dc9a37f0000eb504889c148b878170dc9a37f0000eb554889c148b890170dc9a37f0000eb5a4889c148b8a8170dc9a37f0000eb5f4889c148b8c0170dc9a37f0000eb554889c148b8d8170dc9a37f0000eb5ae967000000e9620000004889c148b8f0170dc9a37f0000eb53e94e0000004889c148b808180dc9a37f0000eb3fe93a0000004889c148b820180dc9a37f0000eb2be926000000e9210000004889c148b838180dc9a37f0000eb12e90d0000004889c148b850180dc9a37f000051488b542438909090ff12488b442430488b00a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3050000004883c41048baa05f06c9a37f0000ff15e6160000488b54242890ff12eb645048b868180dc9a37f0000488b542430ff1248c7c3050000005848baa05f06c9a37f0000ff15ba160000488b54242890ff12eb5848b880180dc9a37f00009090ff15a61600004c3bc87546415348b848140dc9a37f0000488b542430ff12ff742418eb05e9a71200004c8b5424284c8b4c24384c8b442410488b5c2430488b4424089090ff156a160000eb5ce97f12000048b890180dc9a37f000090ff155a1600004c3bc8751548b8a0180dc9a37f0000488b5424289090ff12eb6448b8b8180dc9a37f00009090ff15361600004c3bc8751a48b8c8180dc9a37f0000488b5424289090ff12eb71e91f12000048b8e0180dc9a37f000090ff150e1600004c3bc8755b48b8f0180dc9a37f0000488b5424289090ff12488b442420488b00eb05e9e5110000488b1c24909090ff15e2150000488b4c2420488b094883c104488b54242048890a48c7c30500000048baa05f06c9a37f0000eb0ae9ac110000e91100000090ff15b2150000488b54242890ff12eb6c48b808190dc9a37f00009090ff159e1500004c3bc8755a48b818190dc9a37f0000488b5424289090ff12488b442420488b00488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc272204889c248b8280f0dc9a37f0000eb0ae925110000e982000000488b5d0890ff1348d1e8480fb60403488d440001a801740b4881f8010100007c29eb06f640ff107521a80174094881e8fe0100007105ff5570ebf2a80174064883e8027105ff5570ebf5488b542420488b124883c202488b74242048891648c7c30500000048baa05f06c9a37f0000909090ff15ca140000488b54242890ff12eb6048b808c806c9a37f00009090ff15b61400004c3bc8726148b838190dc9a37f0000909090ff15a61400004c3bc87770498b4500488b0c24488b09488b590848baffffffffffffff00482353f8488d541201488d14d5f9ffffff483bc27223eb05e9391000004889c248b8280f0dc9a37f0000488b5d08eb05e9eb0e00009090ff1348d1e8480fb60403488d4400014889c248c1ea034883ca014883e20feb05e9c40e00004c89ce4883e60f4889c74881e7810100004881ff81010000756b4889c74883e70f4883fe0175634883fa03756240f6c70174084883ff017d23eb06f647ff10741b4889fb48b810c506c9a37f000048bad0a8dc0000000000ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15be1300004889c348b850190dc9a37f0000eb0fe9b60a0000e9b5030000e920000000ff15a213000048c7c353000000909090ff159a130000488b54242890ff12eb684883fa01756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15461300004889c348b870190dc9a37f000090ff153a130000eb0ae9090a0000e91a00000048c7c353000000909090ff1526130000488b54242890ff12eb684883fa07756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15d21200004889c348b890190dc9a37f000090ff15c6120000eb0ae97d090000e91a00000048c7c353000000909090ff15b2120000488b54242890ff12eb684883fa0f756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff155e1200004889c348b8b0190dc9a37f000090ff1552120000eb0ae9f1080000e91a00000048c7c353000000909090ff153e120000488b54242890ff12eb684883fa0d756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15ea1100004889c348b8d0190dc9a37f000090ff15de110000eb0ae965080000e91a00000048c7c353000000909090ff15ca110000488b54242890ff12eb684883fa0b756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15761100004889c348b8f0190dc9a37f000090ff156a110000eb0ae9d9070000e91a00000048c7c353000000909090ff1556110000488b54242890ff12eb684883fa09756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15021100004889c348b8101a0dc9a37f000090ff15f6100000eb0ae94d070000e91a00000048c7c353000000909090ff15e2100000488b54242890ff12eb5c5048c7c3050000004c89c848baa05f06c9a37f0000909090ff15c2100000488b54243090ff1248c7c3050000005848baa05f06c9a37f0000ff15aa100000488b54242890ff12eb634883fe0b75624883fa01756140f6c701740feb05e9cd0600004883ff017d25eb06f647ff10741d4889fb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff154a1000004889c3eb0fe97e060000e98f010000e92a00000048b8301a0dc9a37f0000ff152e10000048c7c353000000909090ff1526100000488b54242890ff12eb684883fa07756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15d20f00004889c348b8501a0dc9a37f000090ff15c60f0000eb0ae9dd050000e91a00000048c7c353000000909090ff15b20f0000488b54242890ff12eb684883fa05756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff155e0f00004889c348b8681a0dc9a37f000090ff15520f0000eb0ae951050000e91a00000048c7c353000000909090ff153e0f0000488b54242890ff12eb5c5048c7c3050000004c89c848baa05f06c9a37f0000909090ff151e0f0000488b54243090ff1248c7c3050000005848baa05f06c9a37f0000ff15060f0000488b54242890ff12eb664883fe0f75654883fa0975204883ff01751aeb05e9d104000048b8801a0dc9a37f0000488b542428ff12eb625048c7c3050000004c89c848baa05f06c9a37f0000909090ff15ba0e0000488b54243090ff1248c7c3050000005848baa05f06c9a37f0000eb0ae97f040000e910000000ff15960e0000488b54242890ff12eb634883fe0375624883fa037561eb05e95704000040f6c70174084883ff017d25eb06f647ff10741d4889fb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15360e00004889c3eb0fe902040000e9af030000e92a00000048b8a01a0dc9a37f0000ff151a0e000048c7c353000000909090ff15120e0000488b54242890ff12eb684883fa01756740f6c70174084883ff017d26eb06f647ff10741e4889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889f848c7c30500000048baa05f06c9a37f0000ff15be0d00004889c348b8b81a0dc9a37f000090ff15b20d0000eb0ae961030000e91a00000048c7c353000000909090ff159e0d0000488b54242890ff12eb584883fa0f75574883ff0f751448b8d01a0dc9a37f0000488b54242890ff12eb654883ff05751648b8e81a0dc9a37f0000488b542428909090ff12eb664883ff0d752048b8001b0dc9a37f0000488b542428909090ff12eb60e9e5020000e95b0000005048c7c3050000004c89c848baa05f06c9a37f000090ff151e0d0000488b542430eb05e9b80200009090ff1248c7c3050000005848baa05f06c9a37f0000eb05e99b02000090ff15f60c0000488b54242890ff12eb57e9850200004883fa0d75554883ff0f751348b8181b0dc9a37f0000488b542428ff12eb654883ff07751648b8301b0dc9a37f0000488b542428909090ff12eb664883ff0d751f48b8481b0dc9a37f0000488b542428eb05e92e020000ff12eb5ce95c0000005048c7c3050000004c89c848baa05f06c9a37f00009090ff15720c0000488b542430eb05e9fc0100009090ff1248c7c3050000005848baa05f06c9a37f0000eb05e9df01000090ff154a0c0000488b54242890ff12eb57e9c90100004883fa0b75554883ff03751348b8601b0dc9a37f0000488b542428ff12eb654883ff0d751648b8781b0dc9a37f0000488b542428909090ff12eb664883ff01751f48b8901b0dc9a37f0000488b542428eb05e972010000ff12eb5ce95c0000005048c7c3050000004c89c848baa05f06c9a37f00009090ff15c60b0000488b542430eb05e9400100009090ff1248c7c3050000005848baa05f06c9a37f0000eb05e92301000090ff159e0b0000488b54242890ff12eb64e90d0100004883fa09755e4883ff01751348b8a81b0dc9a37f0000488b542428ff12eb6b5048c7c3050000004c89c848baa05f06c9a37f0000909090ff155a0b0000488b54243090ff1248c7c3050000005848baa05f06c9a37f0000ff15420b0000eb0ae9a9000000e90a000000488b54242890ff12eb6c5048c7c3050000004c89c848baa05f06c9a37f0000eb05e97e000000ff15120b0000488b54243090ff1248c7c3050000005848baa05f06c9a37f0000ff15fa0a0000488b54242890ff12eb4e5048c7c3050000004c89c848baa05f06c9a37f0000909090ff15da0a0000eb05e929000000488b5424309090ff1248c7c3050000005848baa05f06c9a37f0000ff15ba0a0000488b54242890ff12488b442420488b004883c002488b4c2420488901eb594883fe0b75584883fa057518415348b8c01b0dc9a37f0000488b542430909090ff12eb644883fa077516415348b8d81b0dc9a37f0000488b54243090ff12eb6a4883fa017522415348b8f01b0dc9a37f0000488b542430eb0ae95c040000e96200000090ff12eb5841535048c7c3050000004c89c848baa05f06c9a37f000090ff151e0a0000eb05e9cd020000488b5424389090ff1248c7c3050000005848baa05f06c9a37f0000eb05e9ab02000090ff15f6090000488b54243090ff12eb5de9950200004883fe0975574883fa0f7517415348b8081c0dc9a37f0000488b5424309090ff12eb5d4883fa0d7516415348b8201c0dc9a37f0000488b54243090ff12eb604883fa097522415348b8381c0dc9a37f0000488b542430eb0ae938020000e9f200000090ff12eb614883fa07751e415348b8501c0dc9a37f0000488b542430eb05e9100200009090ff12eb614883fa03751e415348b8681c0dc9a37f0000eb05e9f1010000488b5424309090ff12eb614883fa0b751e415348b8801c0dc9a37f0000488b542430eb05e9c80100009090ff12eb664883fa01751e415348b8981c0dc9a37f0000488b542430eb05e9a40100009090ff12eb5841535048c7c3050000004c89c848baa05f06c9a37f0000eb05e9800100009090ff15d2080000488b54243890ff1248c7c3050000005848baa05f06c9a37f0000eb05e95701000090ff15b2080000488b54243090ff12eb62e9410100004883fe0f755c4883fa0b7517415348b8b01c0dc9a37f0000488b5424309090ff12eb6241535048c7c3050000004c89c848baa05f06c9a37f000090ff156a080000488b54243890ff1248c7c3050000005848baa05f06c9a37f0000eb0ae9df000000e910000000ff1546080000488b54243090ff12eb624883fe0775614883fa01751ceb05e9b7000000415348b8c81c0dc9a37f0000488b542430ff12eb6d41535048c7c3050000004c89c848baa05f06c9a37f000090ff15fe070000488b54243890ff1248c7c3050000005848baa05f06c9a37f0000eb0ae963000000e910000000ff15da070000488b54243090ff12eb4e41535048c7c3050000004c89c848baa05f06c9a37f0000eb05e9300000009090ff15b2070000488b54243890ff1248c7c3050000005848baa05f06c9a37f0000ff159a070000488b54243090ff12ff7424184c8b5424284c8b4c24384c8b442410488b5c2430488b44240890ff15760700004883c408eb5848b8e01c0dc9a37f00009090ff15660700004c3bc8751548b8f01c0dc9a37f0000488b5424289090ff12eb6548b8081d0dc9a37f00009090ff15420700004c3bc8751a48b8181d0dc9a37f0000488b5424289090ff12eb62e9d90000004981f949010000751648b8301d0dc9a37f0000488b542428909090ff12eb624981f94b010000751b48b8481d0dc9a37f0000eb05e9a0000000488b54242890ff12eb624981f94d010000751b48b8601d0dc9a37f0000488b542428eb05e97700000090ff12eb644981f955010000751b48b8781d0dc9a37f0000488b542428eb05e95300000090ff12eb4e4981f957010000751b48b8901d0dc9a37f0000488b542428eb05e92f00000090ff12eb2a48c7c3050000004c89c848baa05f06c9a37f0000ff1562060000eb05e909000000488b5424289090ff126a014883c4086a016a014883c4084883c4086a014883c4086a0148c7c0150000004883c408488b542428ff12483b65187303ff5548e966b3ffff48c7c0150000004883c4285aff2290900000000000000000784d000000000000|@4302,2097151,@16176,I48,@194,@4215,@4215,@4215,@4215,@4297,@4215,@4303,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@194,@4215,@4236,@194,@4215,@4236,@194,@4215,@4297,@3770,@4297,@3770,@4215,@3770,@4297,@4215,@3770,@4297,@4215,@194,@100,@100,@194,@100,@4297,@4215,@4215,@3770,@100,@4215,@4215,@3770,@100,@4215,@4215,@4297,@3770,@4215,@4215,@4305,@194,@4303,@3770,@100,@4215,@4297,@4303,@4215,@4297,@194,@4215,@4303,@4215,@194,@4215,@4297,@4215,@4297,@4303,@4215,@4297,@194,@4215,@4215,@4215,@4297,@4215,@4215,@194,@4215,@4297,@3770,@4236,@194,@194,@4215,@4297,@4215,@4215,@4215,@4307,@194,@4215,@194,@4215,@4215,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@194,@194,@100,@100,@194,@100,@100,@194,@100,@100,@194,@194,@194,@194,@194,@100,@100,@194,@100,@100,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@194,@4297,@4215,@4215,@194|67,0,I48 180,0,@3873 244,0,@376 254,0,I106 275,0,@193 342,0,36028797018963967 377,0,@3951 417,0,@3953 491,0,36028797018963967 526,0,@3951 754,0,36028797018963967 790,0,@3951 847,0,@3954 869,0,@3955 893,0,@3956 932,0,36028797018963967 967,0,@3951 1067,0,I109 1087,0,I110 1167,0,@3957 1185,0,@3958 1203,0,@3959 1221,0,@3960 1239,0,@3961 1257,0,@3962 1285,0,@3963 1302,0,@3964 1320,0,@3956 1376,0,@3965 1452,0,@3955 1534,0,36028797018963967 1569,0,@3951 1686,0,@193 1714,0,@1163 1737,0,@3966 1775,0,36028797018963967 1810,0,@3951 1952,0,@376 1962,0,I106 2021,0,@193 2050,0,@1084 2073,0,@3967 2111,0,36028797018963967 2146,0,@3951 2288,0,@376 2298,0,I106 2357,0,@193 2386,0,@770 2409,0,@3968 2447,0,36028797018963967 2482,0,@3951 2624,0,@376 2634,0,I106 2693,0,@193 2722,0,@759 2745,0,@3969 2783,0,36028797018963967 2818,0,@3951 2960,0,@376 2970,0,I106 3029,0,@193 3058,0,@1041 3081,0,@3970 3119,0,36028797018963967 3154,0,@3951 3296,0,@376 3306,0,I106 3365,0,@193 3394,0,@2347 3417,0,@3971 3455,0,36028797018963967 3490,0,@3951 3632,0,@376 3642,0,I106 3701,0,@193 3730,0,@1023 3753,0,@3972 3791,0,36028797018963967 3826,0,@3951 3968,0,@376 3978,0,I106 4037,0,@193 4066,0,@1038 4089,0,@3973 4127,0,36028797018963967 4162,0,@3951 4304,0,@376 4314,0,I106 4373,0,@193 4402,0,@1156 4425,0,@3974 4463,0,36028797018963967 4498,0,@3951 4640,0,@376 4650,0,I106 4709,0,@193 4738,0,@1149 4761,0,@3975 4799,0,36028797018963967 4834,0,@3951 4976,0,@376 4986,0,I106 5045,0,@193 5074,0,@1081 5097,0,@3976 5135,0,36028797018963967 5170,0,@3951 5312,0,@376 5322,0,I106 5381,0,@193 5410,0,@1075 5433,0,@3977 5471,0,36028797018963967 5506,0,@3951 5648,0,@376 5658,0,I106 5717,0,@193 5746,0,@3978 5769,0,@3979 5807,0,36028797018963967 5842,0,@3951 5984,0,@376 5994,0,I106 6053,0,@193 6082,0,@3980 6141,0,@3981 6194,0,@376 6211,0,I106 6260,0,@193 6286,0,@573 6345,0,@3982 6398,0,@376 6415,0,I106 6464,0,@193 6490,0,@3983 6528,0,36028797018963967 6563,0,@3951 6669,0,I109 6691,0,I110 6766,0,@3984 6980,0,36028797018963967 7015,0,@3951 7128,0,I109 7147,0,I110 7247,0,@3957 7268,0,@3958 7289,0,@3959 7310,0,@3960 7331,0,@3961 7357,0,@3962 7383,0,@3963 7403,0,@3964 7602,0,@3985 7640,0,36028797018963967 7675,0,@3951 7781,0,I109 7803,0,I110 7878,0,@3984 8058,0,@3986 8096,0,36028797018963967 8131,0,@3951 8237,0,I109 8259,0,I110 8334,0,@3987 8514,0,@3988 8552,0,36028797018963967 8587,0,@3951 8693,0,I109 8715,0,I110 8790,0,@3989 8842,0,@193 8922,0,$3950+8954 9031,0,@193 9074,0,@3990 9094,0,@3991 9114,0,@3992 9134,0,@3993 9169,0,@3994 9186,0,@3995 9219,0,@3996 9236,0,@3997 9271,0,@3998 9283,0,@3999 9315,0,@4000 9327,0,@4001 9402,0,@4002 9425,0,@4003 9510,0,@4004 9550,0,@4005 9573,0,@4006 9658,0,@4007 9698,0,@3877 9721,0,@4008 9742,0,@4009 9780,0,36028797018963967 9822,0,@3951 9932,0,I109 9951,0,I110 10026,0,@4010 10206,0,@4011 10229,0,@4012 10259,0,@3984 10319,0,@193 10510,0,@4013 10535,0,@4014 10662,0,@4015 10687,0,@4016 10791,0,36028797018963967 10826,0,@3951 10937,0,@193 10966,0,@4017 10989,0,@4018 11050,0,@4019 11080,0,@4018 11119,0,36028797018963967 11161,0,@3951 11280,0,@193 11306,0,@4020 11344,0,36028797018963967 11379,0,@3951 11484,0,I109 11503,0,I110 11583,0,@4021 11601,0,@4022 11619,0,@4023 11631,0,@4024 11702,0,@3561 11740,0,36028797018963967 11775,0,@3951 11880,0,I109 11899,0,I110 12012,0,@4023 12027,0,@4025 12042,0,@4026 12057,0,@4027 12082,0,@4028 12097,0,@4029 12117,0,@4030 12254,0,@4031 12299,0,36028797018963967 12334,0,@3951 12443,0,I109 12463,0,I110 12552,0,@4023 12567,0,@4032 12582,0,@4033 12696,0,36028797018963967 12731,0,@3951 12848,0,@193 12874,0,@3172 12897,0,@3404 12921,0,@4034 12960,0,36028797018963967 13002,0,@3951 13103,0,I109 13123,0,I110 13203,0,@4035 13221,0,@4036 13239,0,@4023 13251,0,@4037 13340,0,@3172 13378,0,@3404 13402,0,@4038 13442,0,36028797018963967 13484,0,@3951 13604,0,@193 13630,0,@544 13668,0,36028797018963967 13703,0,@3951 13789,0,36028797018963967 13824,0,@3951 13932,0,I109 13951,0,I110 14038,0,@4039 14053,0,@4040 14374,0,$3950+14410 14543,0,@4041 14558,0,@4042 14573,0,@4043 14588,0,@4044 14603,0,@4045 14618,0,@4046 14633,0,@4047 14658,0,@4048 14678,0,@4049 14698,0,@4050 14723,0,@4051 14743,0,@4052 14793,0,@376 14803,0,I106 14852,0,@193 14879,0,@4053 14904,0,@193 14930,0,@4054 14955,0,@4007 15023,0,@4055 15045,0,@4056 15066,0,@4057 15089,0,@4058 15115,0,@4059 15137,0,@4060 15211,0,@193 15250,0,@4061 15273,0,@4062 15311,0,36028797018963967 15346,0,@3951 15469,0,@193 15498,0,@400 15521,0,@4063 15560,0,36028797018963967 15602,0,@3951 15730,0,@376 15740,0,I106 15764,0,@193 15783,0,@4064 15871,0,@376 15881,0,I106 15908,0,@193 15927,0,@4065 16011,0,@376 16021,0,I106 16048,0,@193 16067,0,@4066 16151,0,@376 16161,0,I106 16188,0,@193 16207,0,@4067 16291,0,@376 16301,0,I106 16328,0,@193 16347,0,@4068 16431,0,@376 16441,0,I106 16468,0,@193 16487,0,@4069 16571,0,@376 16581,0,I106 16608,0,@193 16627,0,@4070 16693,0,@193 16728,0,@193 16796,0,@376 16806,0,I106 16832,0,@193 16868,0,@4071 16939,0,@376 16949,0,I106 16976,0,@193 16995,0,@4072 17079,0,@376 17089,0,I106 17116,0,@193 17135,0,@4073 17201,0,@193 17236,0,@193 17287,0,@4074 17317,0,@193 17352,0,@193 17432,0,@376 17442,0,I106 17468,0,@193 17504,0,@4075 17575,0,@376 17585,0,I106 17612,0,@193 17631,0,@4076 17698,0,@4077 17724,0,@4078 17752,0,@4079 17795,0,@193 17836,0,@193 17887,0,@4080 17912,0,@4081 17940,0,@4082 17982,0,@193 18024,0,@193 18075,0,@4083 18100,0,@4084 18128,0,@4085 18170,0,@193 18212,0,@193 18263,0,@4086 18293,0,@193 18328,0,@193 18377,0,@193 18416,0,@193 18453,0,@193 18496,0,@193 18556,0,@4087 18586,0,@4088 18614,0,@4089 18659,0,@193 18700,0,@193 18753,0,@4090 18782,0,@4091 18810,0,@4092 18850,0,@4093 18886,0,@4094 18922,0,@4095 18958,0,@4096 18999,0,@193 19040,0,@193 19093,0,@4097 19127,0,@193 19160,0,@193 19219,0,@4098 19251,0,@193 19284,0,@193 19335,0,@193 19376,0,@193 19442,0,@4099 19465,0,@4100 19486,0,@4101 19509,0,@4102 19544,0,@4103 19575,0,@4104 19611,0,@4105 19647,0,@4106 19683,0,@4107 19720,0,@193 3951:O4|11,@42,0,@3952 3952:O5|@3886,144,0,144,0 3953:S5|6c6f636b20 3954:O1|6 3955:O1|5 3956:O1|7 3957:S3|786f72 3958:S3|737562 3959:S3|616e64 3960:S3|736262 3961:S3|616463 3962:S2|6f72 3963:S3|636d70 3964:S3|616464 3965:S5|5f72657609 3966:S5|6a65202009 3967:S6|6a6e65202009 3968:S5|6a6f202009 3969:S6|6a6e6f202009 3970:S5|6a6c202009 3971:S5|6a67202009 3972:S5|6a6c652009 3973:S5|6a67652009 3974:S5|6a62202009 3975:S5|6a61202009 3976:S5|6a6e612009 3977:S5|6a6e622009 3978:O1|15 3979:S5|6a6d702009 3980:O1|14 3981:S4|6a6d7009 3982:S5|63616c6c09 3983:O1|22 3984:S5|6d6f766c09 3985:O1|23 3986:O1|37 3987:S7|7863686e676c09 3988:O1|19 3989:S5|6d6f766209 3990:S3|25616c 3991:S3|25636c 3992:S3|25646c 3993:S3|25626c 3994:S4|2573696c 3995:S3|256168 3996:S4|2564696c 3997:S3|256368 3998:S4|2562706c 3999:S3|256468 4000:S4|2573706c 4001:S3|256268 4002:O2|30,0 4003:O2|30,7 4004:S6|707573686c09 4005:O2|27,0 4006:O2|27,7 4007:S4|706f7009 4008:S3|6e6f70 4009:O1|16 4010:S5|6c65616c09 4011:O2|20,0 4012:O2|20,7 4013:O1|21 4014:S9|6d6f766c5f72657609 4015:O1|18 4016:S9|6d6f76625f72657609 4017:O1|28 4018:S5|7075736809 4019:O1|29 4020:O1|13 4021:S4|70757368 4022:S4|6a6d7020 4023:S3|3f3f3f 4024:S4|63616c6c 4025:S5|746573746c 4026:S4|6e65676c 4027:S4|6d756c6c 4028:S5|696d756c6c 4029:S4|6469766c 4030:S5|696469766c 4031:O1|12 4032:S5|7465737462 4033:S4|6e656762 4034:O1|9 4035:S4|73617220 4036:S4|73687220 4037:S4|73686c20 4038:S2|636c 4039:S6|786164646c09 4040:S6|6d6f767a6c09 4041:S4|3f3f3f09 4042:S3|6a6f09 4043:S3|6a6209 4044:S4|6a6e6209 4045:S3|6a6509 4046:S4|6a6e6509 4047:S4|6a6e6109 4048:S3|6a6109 4049:S3|6a6c09 4050:S4|6a676509 4051:S4|6a6c6509 4052:S3|6a6709 4053:S4|65736309 4054:O1|26 4055:O1|32 4056:S3|726574 4057:O1|35 4058:S3|737463 4059:O1|33 4060:S4|72657409 4061:O1|36 4062:S10|74657374620925616c2c 4063:O2|4,7 4064:S11|666d756c0973742c737428 4065:S11|666164640973742c737428 4066:S9|66636f6d7009737428 4067:S12|66646976720973742c737428 4068:S11|666469760973742c737428 4069:S12|66737562720973742c737428 4070:S11|667375620973742c737428 4071:S9|666672656509737428 4072:S8|6673747009737428 4073:S8|6673742009737428 4074:S9|666e73747377096178 4075:S8|6678636809737428 4076:S8|666c642009737428 4077:S4|66636f73 4078:S5|6673717274 4079:S4|6673696e 4080:S7|66696e63737470 4081:S6|66706174616e 4082:S7|66646563737470 4083:S4|666c6631 4084:S4|666c647a 4085:S4|666c6431 4086:S4|66636873 4087:S4|66737409 4088:S5|6673747009 4089:S5|666c642009 4090:S6|666469767209 4091:S5|6664697609 4092:S5|6673756209 4093:S6|66636f6d7009 4094:S5|666d756c09 4095:S6|667375627209 4096:S5|6661646409 4097:S6|66696c647109 4098:S6|66696c646c09 4099:O1|34 4100:S5|736168660a 4101:O1|31 4102:S4|72657009 4103:S6|6d6f7673620a 4104:S6|6d6f76736c0a 4105:S6|636d7073620a 4106:S6|73746f73620a 4107:S6|73746f736c0a 4108:S36|5838364f5554505554434f444528292e637265617465436f64655365676d656e74283329 4109:D4,56|483b65187303ff5548ff3353504c89c2ff124c8b442410488b5c2408584883c410ff25290000009000000000000000003000000000000000|@4191,2097151,@16142,@4110| 4110:D504,42104|483b65187303ff5548a8017517488b08488b1148be721e0dc9a37f0000488d7496fcffe6e90ea3000090e9175e0000909090e9d3610000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e92f690000909090e9a3010000909090e99b010000909090e93b690000909090e9d76a0000909090e91f710000909090e91f720000909090e973720000909090e9c1740000909090e923750000909090e923780000909090e9087a0000909090e9977a0000909090e90b7b0000909090e9c7800000909090e923820000909090e92b010000909090e91f820000909090e94b820000909090e94b840000909090e9a7840000909090e903010000909090e9fb000000909090e9f3000000909090e9ab840000909090e9e3000000909090e9db000000909090e9ef850000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e93b860000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e957860000909090e97b000000909090e99f870000909090e903920000909090e963000000909090e95b000000909090e997930000909090e962940000909090e95b9a0000909090e93b000000909090e9f79a0000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9019b0000909090488339737535488b510848833a037517488b700848b890d20dc9a37f0000488b5d08909090ff13488b700848b820d30dc9a37f0000488b5d08ff13488b1148beba200dc9a37f0000488d7496fcffe690e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e97f2c0000909090e9ab010000909090e9ab2c0000909090e98f2d0000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e9b22e0000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9ef2f0000909090e9ab000000909090e937310000909090e9ef340000909090e9bb350000909090e9073b0000909090e983000000909090e99b430000909090e973000000909090e96b000000909090e99f440000909090e993470000909090e953000000909090e94b000000909090e943000000909090e9d7480000909090e933000000909090e92b000000909090e97f500000909090e923510000909090e98f510000909090e923570000909090e903000000909090488339077515488b500848b820d30dc9a37f0000488b5d0890ff13488b1148bee2220dc9a37f0000488d7496fcffe690e9f3010000909090e9eb010000909090e9df030000909090e9db010000909090e9bb120000909090e9e3120000909090e9af140000909090e90b150000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e9f7150000909090e97b160000909090e923170000909090e9eb000000909090e94b180000909090e9db000000909090e9d3000000909090e93f1e0000909090e993260000909090e9e7270000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e903000000909090488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13415053ff7008ff7208ff721048c7c31f000000488b442418909090ff15be9d000048c7c091000000480b0424488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff158e9d000048b8b80f0dc9a37f0000ff15869d0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15669d000048833c2409756d488b442410488b08488b094889ca4883c202488b1848891349c7c0c90000004889cb488b48104889c89090ff15369d000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15229d0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3eb05e90d000000488b411090ff15fa9c0000eb4e48833c240f761248b828d40dc9a37f0000488b5d089090ff1348c7c0c1000000480b0424488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15b29c0000488b4424104883c408488b08488b094889ca4883c202488b1848891349c7c0ff0100004889cb488b48104889c890ff15869c0000488b442408488b08488b094889ca4883c202488b1848891349c7c07f0100004889cb488b48104889c890ff155e9c00004c8b442410488b5c2408584883c410e972f7ffff488b5120f6c201740b4881fa01ffffff7c4eeb06f642ff10754bf6c201740b4881fa010100007d52eb06f642ff10744f4883790805750948c7c60f000000eb54488379080b750948c7c60d000000eb504883790809751348c7c60b000000eb40e991060000e98c0600004883790803751348c7c609000000eb26e977060000e9720600004883790807740e48c7c601000000eb0ce90700000048c7c603000000488b791048833f0374154c8b480848b8a0d30dc9a37f0000488b5d0890ff13415053ff700852ff711856ff7708ff771048c7c31f000000488b4424309090ff156e9b000048c7c091000000480b0424488b4c24304883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff153e9b000048b8980f0dc9a37f0000ff15369b0000488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15169b000048837c241001750748833c240b7541488b442410a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409757248837c24080f761148b8a0d40dc9a37f0000488b5d0890ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000eb05e975000000480bc24883c809488b542428488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210ff151a9a000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15069a0000488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15e6990000eb5548837c24080f761148b8a0d40dc9a37f0000488b5d0890ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff134883f907742c4883f903741d4883f905740948c7c001000000eb1e48c7c003000000eb15e96400000048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000480bc2480b0424488b542428488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b42109090ff152e9900004983fe03756a488b442428488b4c2410f6c101740b483b0d6a9800007c1eeb06f641ff107516f6c101740b483b0d4c9800007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff158e970000488b4424184883c0024d89f04889c3488b4424209090ff157a970000488b4424184883c00441584889c3488b442418909090ff1566970000488b4424104883c00641584883c4104889c358909090ff1552970000eb6a4983fe057569488b442428488b4c2410f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff1586960000488b4424284883c418488b0c24f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8909090ff15c6950000eb504883790805750948c7c60f000000eb4c488379080b750948c7c60d000000eb3c4883790809750948c7c60b000000eb2c4883790803750948c7c609000000eb1c4883790807740e48c7c601000000eb0ce98d07000048c7c603000000488b791048833f0374174c8b480848b8a0d30dc9a37f0000488b5d08909090ff13415053ff700852ff711856ff7708ff771048c7c31f000000488b4424309090ff152a95000048c7c091000000480b0424488b4c24304883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15fa94000048b8a80f0dc9a37f0000ff15f2940000488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15d294000048837c241001750748833c240b7541488b442410a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409757248837c24080f761148b8a0d40dc9a37f0000488b5d0890ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000eb05e975000000480bc24883c809488b542428488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210ff15d693000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15c2930000488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15a2930000eb5548837c24080f761148b8a0d40dc9a37f0000488b5d0890ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff134883f907742c4883f903741d4883f905740948c7c001000000eb1e48c7c003000000eb15e96400000048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000480bc2480b0424488b542428488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b42109090ff15ea9200004983fe03756a488b442428488b4c2410f6c101740b483b0da69100007c1eeb06f641ff107516f6c101740b483b0d889100007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff154a910000488b4424184883c0024d89f04889c3488b4424209090ff1536910000488b4424184883c00441584889c3488b442418909090ff1522910000488b4424104883c00641584883c4104889c358909090ff150e910000eb6a4983fe057569488b442428488b4c2410f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff1542900000488b4424284883c418488b0c24f6c101740b483b0dc98e00007c1eeb06f641ff107516f6c101740b483b0dab8e00007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15aa8e0000488b4424184883c0024d89f04889c3488b4424209090ff15968e0000488b4424184883c00441584889c3488b442418909090ff15828e0000488b4424104883c00641584883c4104889c3584883c408909090ff156a8e00004c8b442410488b5c2408584883c410e986e8ffff415053ff70084989d94c8b4118488b5910488b410890ff15428e00004c8b442410488b5c2408584883c410e956e8ffff488b511048833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13498d77a8483b75107303ff55404989f748c746f80300000048c7461007000000488b790848897e0848c706010000004c8d4e2049c741f80400000049c741180100000049c74110030000004c8b52104d89510849c701010000004d8d592849c743f8010000004d890b415053ff7008ff7118ff7208564152415348c7c31f000000488b44243090ff158a8d0000f6042401754a48837c240801750948c7c001000000eb0748c7c0090000004881c891000000488b4c2430488b11488b124889d34883c302488b3148891e4989c04889d3488b4110909090ff15428d00004883c4105890ff153e8d0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff151e8d000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004883c80b488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15d28c0000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b44240848bbd09507c9a37f0000909090ff159e8c00004c8b442410488b5c2408584883c410e982e6ffff498d57e0483b55107303ff55404989d748c742f80300000048c7421007000000488b71084889720848c70201000000415053ff70084989da4c8b49204c8b4110488b59184889d0909090ff15428c00004c8b442410488b5c2408584883c410e91ee6ffff498d57e0483b55107303ff55404989d748c742f80300000048c7421007000000488b71084889720848c70201000000488b791848833f0374164c8b480848b8a0d30dc9a37f0000488b5d089090ff134c8b49104983390374164c8b500848b8a0d30dc9a37f0000488b5d089090ff13415053ff7008ff770841ff710852ff771041ff711048c7c31f000000488b4424309090ff159e8b000048833c2401750948c7c001000000eb0748c7c0090000004881c891000000480b442408488b4c24304883c410488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15568b00005890ff15568b0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15368b000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15c68a00004c8b442410488b5c2408584883c410e97ae4ffff488b511048833a09754848837908017516488b700848b818d60dc9a37f0000488b5d089090ff13488b7108415053ff70084989da4c8b49204c8b06488b591848b878140dc9a37f000090ff156a8a0000eb26415053ff7008534c8b51204989d14c8b4108488b591848b878140dc9a37f0000ff154a8a00004c8b442410488b5c2408584883c410e9eee3ffff488b511048833a037515488b700848b8a0d60dc9a37f0000488b5d0890ff13488b721048833e097529415053ff70084989da4c8b49084c8b4208488b5a1848b828d70dc9a37f00009090ff15ee890000eb4a498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4a084c890f415053ff7008534c8b51084989f14989f848c7c30100000048b828d70dc9a37f0000909090ff15aa8900004c8b442410488b5c2408584883c410e93ee3ffff488b511048833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13498d77b0483b75107303ff55404989f748c746f802000000488b7a0848897e0848c706290000004c8d4e1849c741f80400000049c741180100000049c741100300000049c74108010000004c8b52104d89114d8d592849c743f8010000004d890b415053ff7008ff7108564152415348c7c31f000000488b442428ff15fe880000f6042401753648c7c091000000480b442408488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15ca8800004883c4105890ff15c6880000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15a68800004c8b44241048c7c3010000005890ff159a8800004c8b442410488b5c2408584883c410e906e2ffff488b510848833a037549488b711048833e017544488b7e1048833f09754ff6400801754e4c8b48084d8b1149833a6175594c8b5e084c3b1d52880000742649833b01745c49833b03755b49837b08097559eb0ae9f2040000e9ed04000049837b1001756441505341ff7108eb0ae9d8040000e9d30400005241ff7208ff7618415348c7c311000000eb05e9bb040000488b44241048ba50a9dc0000000000eb0fe92d000000e928000000e923000000909090ff12a8017415f644240801740e483b4424087e6eeb1de905000000ff5570ebed41505341ff71085241ff7208ff76184153eb54488b442408a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883e80e7105ff5570ebf548c7c31100000048ba90a9dc0000000000eb0ae996030000e991030000ff12a8017410f6442410017409483b4424107c0ceb05ff5570ebf2488b4424104883f801756f48837c24080174134889c148b838d70dc9a37f0000488b5d08ff13488b4c2410f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174064883e9027105ff5570ebf5488b44241848833803741148b8a0d30dc9a37f0000488b5d0890ff13498d57e8483b5510730aeb05e97b010000ff55404989d748c742f802000000488b580848895a0848c702370000004883781001750948c7c601000000eb0a48beb8d70dc9a37f000051525648c7c31f000000488b442440ff1572860000f60424017570488b0424488b084883791001750948c7c201000000eb0748c7c2110000004881ca810000004883790801750948c7c301000000eb0748c7c309000000480bd34883791801750948c7c301000000eb0748c7c305000000480bd3480b11488b5c2440488b33488b364889f74883c702eb05e9190000004c8b034989384989d0488b53104889f34889d0ff15e68500004883c4085890ff15e2850000488b4c2430488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15c285000048833c24017507488b442428eb42498d47d0483b45107303ff55404989c748c740f802000000488b0c244889480848c700610000004889c1488d401848c740f802000000488b542428488950084889084c8b4424384883c4084883c4285b4883c408e9b3deffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70161000000505148c7c31100000048ba50a9dc000000000090ff12488b4c2418f6c1017409a8017405482bc87105ff5570ebf64883c101498d47d8483b45107303ff55404989c748c740f8040000004889481848b9e86f0cc9a37f000048894810488b4c24104889480848c70001000000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424284889410848c70145000000488b442420a801750af6442408017503ff5570483b4424087507488b442430eb56a801740ef6442408017407482b4424087105ff5570ebf44883c001498d57d0483b55107303ff55404989d748c742f8020000004889420848c70261000000488d421848c740f802000000488b5c243048895808488910498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f80200000048895008594883c4084889084c8b4424304883c4285b4883c408e937ddffff4c8b5424284c8b4c24184c8b0424488b5c240848b828120dc9a37f00009090ff15c2830000498d47d0483b45107303ff55404989c748c740f802000000488b4c24104889480848c700610000004889c1488d401848c740f802000000488b542420488950084889084c8b4424304883c4285b4883c408e9bcdcffff488b711048833e017544488b7e1048833f09753a415053ff70084989da4989d14c8b4608488b5e1848b828120dc9a37f00009090ff153a8300004c8b442410488b5c2408584883c410e96edcffff48833e017415488b780848b8f0d70dc9a37f0000488b5d0890ff13498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4e084c890f415053ff7008534989d24c8b4e104989f8488b5e1848b828120dc9a37f000090ff15ce8200004c8b442410488b5c2408584883c410e9fadbffff488b510848833a01756f48837910037416488b700848b878d80dc9a37f0000488b5d089090ff13415053ff7008524989da49c7c10300000049c7c00b00000048c7c30d00000048c7c00700000090ff156e820000488b042448833801741148b810d90dc9a37f0000488b5d0890ff13488b40084883c408eb05e9420000004883c0024881e0ff0100004c8b54240849c7c10b00000049c7c0070000004889c348c7c007000000ff151e8200004c8b442410488b5c2408584883c410e93adbffff415053ff700852ff711048c7c305000000488b042448bad0a9dc0000000000909090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0047105ff5570ebf54883f8017565488b44240848833803741148b8a0d30dc9a37f0000488b5d0890ff1348833803741a488b4808488b501048b8a0d30dc9a37f0000488b5d089090ff13ff7008ff701048c7c31f000000488b44242890ff155681000048833c2401750e48c7c001000000eb0ce91901000048c7c0090000004881c891000000480b0424488b4c24284883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff150a81000048b880d90dc9a37f0000ff1502810000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15e280000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff13488b0424488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110909090ff156e80000048833c240174594c8b4c24184c8b0424488b5c240848c7c0010000009090ff1552800000eb54f60424017453f6042401751148b8b8f309c9a37f0000488b5d0890ff13488b0424a801740b4881f8010000807c5feb06f640ff10755ca801eb05e95b050000740b483b05487d00007d6aeb06f640ff107467eb0ae941050000e9fe020000488b4c240848833903741048b8a0d30dc9a37f0000488b5d08ff13ff7108ff711048c7c31f000000488b442428eb0ae9ca020000e9c502000090ff15ba7f000048c7c091000000480b0424488b4c24284883c408eb0ae9a3020000e99e020000488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff157e7f000048b8d0140dc9a37f0000ff15767f0000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15567f000048833c240f761048b828d40dc9a37f0000488b5d08ff1348c7c081010000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff150e7f0000488b442418488b0c24f6c101740b483b0d097c00007c1eeb06f641ff107516f6c101740b483b0deb7b00007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff157a7d0000488b4424184883c0024d89f04889c3488b4424209090ff15667d0000488b4424184883c00441584889c3488b442418909090ff15527d0000488b4424104883c00641584883c4104889c358909090ff153e7d0000eb6e488b44240848833803741248b8a0d30dc9a37f0000488b5d089090ff13498d4fb0483b4d107303ff55404989cf48c741f802000000488b50084889510848c70129000000488d591848c743f80400000048c743180100000048c743100300000048c7430801000000488b7010eb05e9cb010000488933488d7b2848c747f80100000048891f51565748c7c31f000000488b442430ff15aa7c0000f6042401753648c7c091000000480b442408488b4c2430488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15767c00004883c4105890ff15727c0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15527c0000488b442418488b08488b094889ca4883c210488b18488913488b1424f6c20174084883fa017d11eb06f642ff10740948c7c601000000eb0748c7c6030000004883fe037413f6c2017409482b15c17800007105ff5570ebf2ff70105148bb01000000000000024889d048ba90a9dc0000000000909090ff1248c7c30102000048bad0a9dc000000000090ff124883f801743aa80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f9037412a80174094881c0000200007105ff5570ebf25049c7c10f0000004c8b442408488b5c2418488b442410909090ff156e7b0000488b0424a80174084883f8017d1aeb06f640ff107412a80174094881c0000200007105ff5570ebf24883c408594883c10e49c7c1030000004989c84889c358909090ff152e7b00004c8b4424204883c410488b5c2408584883c410e99ed3ffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13498d77b0483b75107303ff55404989f748c746f802000000488b7a0848897e0848c706290000004c8d4e1849c741f80400000049c741180100000049c741100300000049c74108010000004c8b52104d89114d8d592849c743f8010000004d890b415053ff7008ff7110564152415348c7c31f000000488b442428ff157e7a0000f6042401753648c7c091000000480b442408488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff154a7a00004883c4105890ff15467a0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15267a0000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b44240848c7c3010000009090ff15f67900004c8b442410488b5c2408584883c410e942d2ffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13488b711048833e037416488b780848b8a0d30dc9a37f0000488b5d089090ff13415053ff7008ff7208ff7608ff7210ff761048c7c31f000000488b44242890ff158679000048833c2401750948c7c001000000eb0748c7c0090000004881c891000000480b442408488b4c24284883c410488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff153e79000048b850120dc9a37f0000ff1536790000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff151679000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15a67800004c8b442410488b5c2408584883c410e9cad0ffff415053ff70084989da4c8b49104c8b410848c7c30100000048b8a0d90dc9a37f0000ff15727800004c8b442410488b5c2408584883c410e98ed0ffff415053ff7008ff710848c7c31f000000488b44241090ff154a78000048b868150dc9a37f0000ff1542780000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1522780000488b442410488b08488b094889ca4883c202488b1848891349c7c0ab0000004889cb488b48104889c890ff15fa770000f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff010000488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae7700004c8b442410488b5c2408584883c410e9a2cfffff488b5110488b7220488b36483b35b07300007417488b700848b8b0d90dc9a37f0000488b5d08909090ff13498d77e8483b75107303ff55404989f748c746f802000000488b790848897e0848c70605000000415053ff7008ff72185648c7c31f000000488b4424189090ff15327700005890ff1532770000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1512770000488b442410488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff15ea760000488b442418488b004883c0fe488b4c2410498d57d8483b55107303ff55404989d748c742f8020000004889420848c70203000000488d5a1848c743f801000000c643ff40488913488b5168488b12483bc27307488b5168488902488b4128488b00498d57e8483b55107303ff55404989d748c742f8020000004889420848891a488b4128488910488b1424488b12498d77e8483b75107303ff55404989f748c746f8020000004889560848891e5a4889324c8b4424104889cb584883c410e90fceffff488b511048be4e500dc9a37f0000488d7496fcffe6e934000000909090e935000000909090e936000000909090e937000000909090e938000000909090e90300000090909048c7c205000000eb2b48c7c20d000000eb2248c7c20f000000eb1948c7c20b000000eb1048c7c209000000eb0748c7c207000000488b710848833e037415488b780848b8a0d30dc9a37f0000488b5d0890ff13415053ff7008ff760852ff761048c7c31f000000488b4424209090ff157675000048c7c091000000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff154675000048b850f70bc9a37f0000ff153e750000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff151e75000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15ae7400004c8b442410488b5c2408584883c410e95accffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13498d77e8483b75107303ff55404989f748c746f802000000488b7a0848897e0848c7063700000048837a1001750949c7c101000000eb0a49b9b8d70dc9a37f0000415053ff700856415148c7c31f000000488b44241890ff1526740000f60424017570488b0424488b084883791001750948c7c201000000eb0748c7c2110000004881ca810000004883790801750948c7c301000000eb0748c7c309000000480bd34883791801750948c7c301000000eb0748c7c305000000480bd3480b11488b5c2418488b33488b364889f74883c702eb05e9190000004c8b034989384989d0488b53104889f34889d0ff159a7300004883c4085890ff1596730000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15767300004c8b442410488b5c2408584883c410e902cbffff488b5108f6c201740b4881fa01ffffff7c5eeb06f642ff10755bf6c201740b4881fa010100007d6aeb06f642ff107467415053ff70085248c7c31f000000488b442410909090ff151e73000048b858150dc9a37f0000ff1516730000488b4c2410488b11488b124889d34883c302eb0ae9ed000000e9e8000000488b3148891e4989c04889d3488b4110ff15ea720000eb0ae9cb000000e9c6000000488b442410488b0c24f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8909090ff1522720000eb69415053ff70085248c7c31f000000488b44241090ff150e72000048b830150dc9a37f0000ff1506720000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15e6710000488b442410488b0c24f6c1017412483b0d516d0000eb05e9dc0100007c1eeb06f641ff107516f6c101740b483b0d2c6d00007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff154e700000488b4424184883c0024d89f04889c3488b4424209090ff153a700000488b4424184883c00441584889c3488b442418909090ff1526700000488b4424104883c00641584883c4104889c3584883c408909090ff150e7000004c8b442410488b5c2408584883c410e942c7ffff415053ff7008ff710848c7c31f000000488b44241090ff15e66f000048b868150dc9a37f0000ff15de6f0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15be6f0000488b442410488b08488b094889ca4883c202488b1848891349c7c06b0000004889cb488b48104889c890ff15966f0000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b44240848bbd09507c9a37f0000909090ff15626f00004c8b442410488b5c2408584883c410e96ec6ffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13415053ff7008ff7110ff7208ff721048c7c31f000000488b442420ff15166f000048833c2401743548c7c081000000480b0424488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15e26e000048b868150dc9a37f00004883c408ff15d66e0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15b66e000048837c240801750748833c240b7541488b442408a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409756f4883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff0100004883c8614883c809488b542418488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210eb05e94c000000ff15e66d000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15d26d0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15b26d0000eb6e48833c240f761248b828d40dc9a37f0000488b5d089090ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff0100004883c861480b0424488b542418488b1aeb05e923000000488b1b4889de4883c602488b3a4889374989ce4989c0488b4210909090ff15226d00004983fe03756a488b442418488b4c2408f6c101740b483b0dee6700007c1eeb06f641ff107516f6c101740b483b0dd06700007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15826b0000488b4424184883c0024d89f04889c3488b4424209090ff156e6b0000488b4424184883c00441584889c3488b442418909090ff155a6b0000488b4424104883c00641584883c4104889c358909090ff15466b0000eb6a4983fe057569488b442418488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff157a6a00004c8b4424204883c410488b5c2408584883c410e91ac1ffff488b510848833a017572415053ff70085248c7c31f000000488b44241090ff15466a000048b8d0130dc9a37f0000ff153e6a0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff151e6a000048c7c31f000000488b4424109090ff15126a000048b8d0130dc9a37f0000eb05e9cd06000090ff15026a0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15e2690000488b042448833801741148b830da0dc9a37f0000488b5d0890ff13488b40084883c4084881e0ff0100004c8b54240849c7c10300000049c7c0010000004889c348c7c007000000909090ff159a690000488b442408488b4858488b094883f9017415488b485848b888da0dc9a37f0000488b5d0890ff13488b485848c701030000004989c249b9902b07c9a37f000049b838920cc9a37f000048c7c3e1ffffff48b878140dc9a37f0000ff15426900004c8b54240849b9902b07c9a37f000049b8288c0cc9a37f000048c7c32100000048b818db0dc9a37f0000ff151a690000488b442408488b1848b8684507c9a37f0000ff150a690000488b4c2408488b11488b124889d64883c602488b394889374989de4989c04889d3488b411090ff15e6680000488b442408488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff15be6800004d8b364983c6fe488b442408498d4fd8483b4d107303ff55404989cf48c741f8020000004c89710848c70103000000488d511848c742f801000000c642ff4048890a488b4868488b094c3bf17307488b48684c8931488b4828488b09498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4828488919488d5b1848c743f80200000048c74308010000004889135348c7c31f00000090ff151e68000048b868150dc9a37f0000ff1516680000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15f6670000488b442410488b08488b094889ca4883c202488b1848891349c7c0ab0000004889cb488b48104889c890ff15ce670000488b442410488b08488b094889ca4883c202488b1848891349c7c0810000004889cb488b48104889c890ff15a6670000488b5c241058ff15a267000048c7c31f000000488b4424089090ff1596670000488b442408488b08488b094889ca4883c202488b1848891349c7c0930000004889cb488b48104889c890ff156e67000048b850120dc9a37f0000ff1566670000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1546670000488b442408488b08488b094889ca4883c202488b1848891349c7c08f0100004889cb488b48104889c890ff151e67000048c7c31f000000488b4424089090ff1512670000488b442408488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff15ea66000048b8d0140dc9a37f0000ff15e2660000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15c2660000488b442408488b08488b094889ca4883c202488b1848891349c7c0810000004889cb488b48104889c890ff159a660000488b442408488b08488b094889ca4883c202488b1848891349c7c0f10100004889cb488b48104889c890ff1572660000488b442408488b08488b094889ca4883c208488b184889134c8b70105149c7c0030000004889cb4c89f0ff154a660000488b04244883c00249c7c0010000004889c34c89f090ff1536660000488b04244883c00449c7c0010000004889c34c89f090ff1522660000584883c00649c7c0010000004889c34c89f0ff151266000048c7c31f000000488b4424089090ff150666000048b800150dc9a37f0000ff15fe650000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15de650000488b442408488b08488b094889ca4883c202488b1848891349c7c0810000004889cb488b48104889c890ff15b6650000488b442408488b08488b094889ca4883c202488b1848891349c7c0ff0100004889cb488b48104889c890ff158e650000488b442408488b08488b094889ca4883c202488b1848891349c7c0030000004889cb488b48104889c890ff156665000048c7c31f000000488b4424089090ff155a65000048b838db0dc9a37f0000ff1552650000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1532650000488b442408488b08488b094889ca4883c202488b1848891349c7c0310000004889cb488b48104889c890ff150a6500004c8b54240849b9902b07c9a37f000049b8088c0cc9a37f000048c7c31100000048b850120dc9a37f0000ff15e264000048c7c31f000000488b4424089090ff15d664000048b818140dc9a37f0000ff15ce640000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae640000488b442408488b485848c701010000004c8b4424104889c3584883c410e9ccb9ffff48833a037417488b700848b8a0d30dc9a37f0000488b5d08909090ff13498d77e8483b75107303ff55404989f748c746f802000000488b7a0848897e0848c7063d00000048837a1001750949c7c101000000eb0a49b9b8d70dc9a37f0000415053ff700856415148c7c31f000000488b44241890ff151a640000f60424017570488b0424488b084883791001750948c7c201000000eb0748c7c2110000004881ca810000004883790801750948c7c301000000eb0748c7c309000000480bd34883791801750948c7c301000000eb0748c7c305000000480bd3480b11488b5c2418488b33488b364889f74883c702eb05e9190000004c8b034989384989d0488b53104889f34889d0ff158e6300004883c4085890ff158a630000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff156a6300004c8b442410488b5c2408584883c410e976b8ffff415053ff7008ff710848c7c31f000000488b44241090ff154263000048b8081d0dc9a37f0000ff153a630000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff151a63000048833c2405740748833c24097532488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c8909090ff15e262000048833c2409750948c7c057010000eb3748833c2407750948c7c055010000eb2748833c2405750948c7c04b010000eb1748833c2403740948c7c04d010000eb0748c7c049010000488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15766200004c8b442410488b5c2408584883c410e95ab7ffff488379080375724883791803750948c7c20f000000eb174883791805740948c7c209000000eb0748c7c20b000000488b711048833e037417488b780848b8a0d30dc9a37f0000488b5d08909090ff13415053ff7008ff760852ff761048c7c31f000000488b4424209090ff15fa61000048c7c091000000eb05e9e4000000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15c261000048b8f09e0ac9a37f0000ff15ba610000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff159a61000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff152a610000eb734883791803750948c7c20f000000eb174883791805740948c7c209000000eb0748c7c20b000000488b711048833e037414488b780848b8a0d30dc9a37f0000488b5d08ff13415053ff7008ff7108ff760852ff761048c7c31f000000488b442428909090ff15c660000048c7c091000000eb05e90e010000480b0424488b4c24284883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff158e60000048b8a8160dc9a37f0000ff1586600000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff156660000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15f65f0000488b442410488b08488b094889ca4883c202488b1848891341584889cb488b48104889c89090ff15d25f00004c8b442410488b5c2408584883c410e95eb4ffff4883791003750948c7c20f000000eb174883791005740948c7c209000000eb0748c7c20b000000488b710848833e037416488b780848b8a0d30dc9a37f0000488b5d089090ff13415053ff7008ff760852ff761048c7c31f000000488b4424209090ff155e5f000048c7c091000000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff152e5f000048b860780bc9a37f0000ff15265f0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15065f000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15965e00004c8b442410488b5c2408584883c410e9fab2ffff488b510848833a037515488b700848b850db0dc9a37f0000488b5d0890ff13488b721048833e09756f488b7a0848833f0374144c8b480848b8a0d30dc9a37f0000488b5d08ff13415053ff7008ff7110ff7218ff7708ff771048c7c31f000000488b44242890ff151e5e000048c7c091000000480b0424488b4c24284883c408488b11488b124889d34883c302488b3148891e4989c0eb05e9c50400004889d3488b41109090ff15e65d000048b8d0140dc9a37f0000ff15de5d0000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15be5d000048837c240801750748833c240b7541488b442408a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409756b4883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff0100004883c809488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210eb05e94c000000ff15f25c000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15de5c0000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15be5c0000eb6d48833c240f761248b828d40dc9a37f0000488b5d089090ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000480b0424488b542420488b1a488b1beb05e9200000004889de4883c602488b3a4889374989ce4989c0488b4210909090ff15325c00004983fe03756a488b442420488b4c2408f6c101740b483b0d465400007c1eeb06f641ff107516f6c101740b483b0d285400007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15925a0000488b4424184883c0024d89f04889c3488b4424209090ff157e5a0000488b4424184883c00441584889c3488b442418909090ff156a5a0000488b4424104883c00641584883c4104889c358909090ff15565a0000eb6a4983fe057569488b442420488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae9b7000000e9b2000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff158a590000eb52498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4a084c890f415053ff7008ff71105349ba902b07c9a37f00004989f14989f8488b5a1848b8d0140dc9a37f000090ff15425900006a016a01488b4424204883c410488b0c24f6c101740b483b0d155100007c1eeb06f641ff107516f6c101740b483b0df75000007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15a6570000488b4424184883c0024d89f04889c3488b4424209090ff1592570000488b4424184883c00441584889c3488b442418909090ff157e570000488b4424104883c00641584883c4104889c3584883c408909090ff15665700004c8b442410488b5c2408584883c410e93aabffff488b510848833a037515488b700848b8e0db0dc9a37f0000488b5d0890ff13488b721048833e097529415053ff70084989da4c8b49104c8b4208488b5a1848b850120dc9a37f00009090ff150a570000eb46498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4a084c890f415053ff7008534c8b51104989f14989f8488b5a1848b850120dc9a37f00009090ff15ca5600004c8b442410488b5c2408584883c410e98eaaffff498d57d8483b55107303ff55404989d748c742f801000000488b7110488932488d7a1048c747f8020000004889770848c70701000000415053ff7008534c8b51084989f94989d048c7c30300000048b878140dc9a37f00009090ff155e5600004c8b442410488b5c2408584883c410e91aaaffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13415053ff7008ff7110ff7118ff7208ff721048c7c31f000000488b44242890ff150e56000048833c2401743548c7c081000000480b0424488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15da55000048b868160dc9a37f00004883c408ff15ce550000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae55000048837c240801750748833c240b7541488b442408a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409756b4883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff0100004883c809488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210eb05e94c000000ff15e254000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15ce540000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae540000eb6d48833c240f761248b828d40dc9a37f0000488b5d089090ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000480b0424488b542420488b1a488b1beb05e9200000004889de4883c602488b3a4889374989ce4989c0488b4210909090ff15225400004983fe03756a488b442420488b4c2408f6c101740b483b0d6e4b00007c1eeb06f641ff107516f6c101740b483b0d504b00007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff1582520000488b4424184883c0024d89f04889c3488b4424209090ff156e520000488b4424184883c00441584889c3488b442418909090ff155a520000488b4424104883c00641584883c4104889c358909090ff1546520000eb6a4983fe057569488b442420488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff157a5100004883c4105848ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15325100004c8b442410488b5c2408584883c410e97ea4ffff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13483b1500510000741a48833a01745e48833a03755d48837a0801755b48837a10017559415053ff700848c7c31f000000488b4424089090ff15d250000048b808190dc9a37f0000ff15ca500000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3eb14e94d000000e948000000e943000000e93e000000488b41109090ff1592500000488b442408488b08488b094889ca4883c202488b1848891349c7c0030000004889cb488b48104889c890ff156a500000eb5648837a1001750748837a0809724d498d77c8483b75107303ff55404989f748c746f80400000048c746180100000048c746100100000048c7460801000000488b7a1048893e4c8d4e2849c741f801000000498931eb0ce97701000049c7c101000000415053ff7008ff7208415148c7c31f000000488b442418909090ff15ee4f0000f60424017570488b0424488b084883791001750948c7c201000000eb0748c7c2110000004881ca810000004883790801750948c7c301000000eb0748c7c309000000480bd34883791801750948c7c301000000eb0748c7c305000000480bd3480b11488b5c2418488b33488b364889f74883c702eb05e9190000004c8b034989384989d0488b53104889f34889d0ff15624f000048b868160dc9a37f00004883c408ff15564f0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15364f000048833c240f761048b828d40dc9a37f0000488b5d08ff1348c7c081010000480b0424488b4c24104883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15ee4e0000488b442408488b08488b094889ca4883c202488b1848891349c7c0030000004889cb488b48104889c890ff15c64e00004c8b442410488b5c2408584883c410e9baa1ffff488b5358488b124883fa017416488b500848b888da0dc9a37f0000488b5d089090ff13488b535848c70203000000488b710840f6c60174064883c6027105ff5570ebf5415053ff7008ff711048c7c3110000004889f048ba50a9dc00000000009090ff1248c7c101000000f6c1017409a8017405482bc87105ff5570ebf64883c1014c8b5424104c8b0c2449b838920cc9a37f00004889cb48b878140dc9a37f0000ff15124e00004c8b5424104c8b0c2449b8288c0cc9a37f000048c7c32100000048b818db0dc9a37f00009090ff15ee4d0000488b442410488b1848b8684507c9a37f0000ff15de4d0000488b4c2410488b11488b124889d64883c602488b394889374989de4989c04889d3488b411090ff15ba4d0000488b442410488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff15924d00004d8b364983c6fe488b442410498d4fd8483b4d107303ff55404989cf48c741f8020000004c89710848c70103000000488d511848c742f801000000c642ff4048890a488b4868488b094c3bf17307488b48684c8931488b4828488b09498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4828488919488d5b1848c743f80200000048c74308010000004889135348c7c31f00000090ff15f24c000048b868150dc9a37f0000ff15ea4c0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ca4c0000488b442418488b08488b094889ca4883c202488b1848891349c7c0ab0000004889cb488b48104889c890ff15a24c0000488b442418488b08488b094889ca4883c202488b1848891349c7c0810000004889cb488b48104889c890ff157a4c0000488b5c241858ff15764c0000488b042448833803741148b8a0d30dc9a37f0000488b5d0890ff13ff7008ff701048c7c31f000000488b44242090ff154a4c000048833c2401750948c7c001000000eb0748c7c0090000004881c8910000004883c803488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15024c000048b850120dc9a37f0000ff15fa4b0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15da4b000048833c240f761048b8a0d40dc9a37f0000488b5d08ff13584883c408488d04c5f9ffffff4881e0ff0100004881c8810100004883c80f488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15824b00004c8b442410488b5c2408584883c410e9f69dffff488b5358488b124883fa017416488b500848b838dc0dc9a37f0000488b5d089090ff13488b535848c70203000000488b710848833e037417488b780848b8a0d30dc9a37f0000488b5d08909090ff13415053ff700856ff7608ff761048c7c31f000000488b4424209090ff15064b000048c7c091000000480b0424488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15d64a000048b850f70bc9a37f0000ff15ce4a0000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae4a000048833c240f761048b828d40dc9a37f0000488b5d08ff1348c7c0b1010000480b0424488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15664a0000488b042448833803741148b8a0d30dc9a37f0000488b5d0890ff13ff7008ff701048c7c31f000000488b44242090ff153a4a000048833c2401750948c7c001000000eb0748c7c0090000004881c8910000004883c803488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15f249000048b890dc0dc9a37f0000ff15ea490000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ca49000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c8810100004883c80f488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15764900004c8b5424104c8b0c2449b8288c0cc9a37f000048c7c32100000048b818db0dc9a37f00009090ff1552490000488b442410488b1848b8905007c9a37f0000ff1542490000488b4c2410488b11488b124889d64883c602488b394889374989de4989c04889d3488b411090ff151e490000488b442410488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff15f64800004d8b364983c6fe488b442410498d4fd8483b4d107303ff55404989cf48c741f8020000004c89710848c70103000000488d511848c742f801000000c642ff4048890a488b4868488b094c3bf17307488b48684c8931488b4828488b09498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4828488919488d5b1848c743f80200000048c7430801000000488913488b142448833a03741048b8a0d30dc9a37f0000488b5d08ff1353ff7208ff721048c7c31f00000090ff153648000048833c2401750948c7c001000000eb0748c7c0090000004881c8910000004883c803488b4c24284883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15ee47000048b818db0dc9a37f0000ff15e6470000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15c647000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c8810100004883c80f488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff1572470000488b442418488b1848b8905007c9a37f0000ff1562470000488b4c2418488b11488b124889d64883c602488b394889374989de4989c04889d3488b411090ff153e470000488b442418488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff15164700004d8b364983c6fe488b442418498d4fd8483b4d107303ff55404989cf48c741f8020000004c89710848c70103000000488d511848c742f801000000c642ff4048890a488b4868488b094c3bf17307488b48684c8931488b4828488b09498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4828488919488d5b1848c743f80200000048c7430801000000488913534889c3488b442408ff157646000048c7c31f000000488b4424209090ff156a46000048b868150dc9a37f0000ff1562460000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1542460000488b442420488b08488b094889ca4883c202488b1848891349c7c0ab0000004889cb488b48104889c890ff151a460000488b442420488b08488b094889ca4883c202488b1848891349c7c0810000004889cb488b48104889c890ff15f2450000488b5c2420584883c408ff15ea450000488b042448833803741148b8a0d30dc9a37f0000488b5d0890ff13ff7008ff701048c7c31f000000488b44242090ff15be45000048833c2401750948c7c001000000eb0748c7c0090000004881c8910000004883c803488b4c24204883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff157645000048b850120dc9a37f0000ff156e450000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff154e45000048833c240f761048b8a0d40dc9a37f0000488b5d08ff13584883c408488d04c5f9ffffff4881e0ff0100004881c8810100004883c80f488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15f64400004c8b442410488b5c2408584883c410e95a96ffff415053ff7008488b4108ff15da4400004c8b442410488b5c2408584883c410e93696ffff415053ff7008ff7110ff710848c7c31f000000488b4424189090ff15ae44000048b8b0dc0dc9a37f0000ff15a6440000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1586440000488b042448b982880dc9a37f0000488d4c81fcffe1909090e93b000000909090e94c000000909090e94d000000909090e94e000000909090e94f000000909090e913000000909090e948000000909090e94900000090909048833c240b740948c7c001000000eb3d48c7c003000000eb3448c7c005000000eb2b48c7c007000000eb2248c7c00d000000eb1948c7c00f000000eb1048c7c009000000eb0748c7c00b0000004883f80f76144889c148b8a0d40dc9a37f0000488b5d0890ff13488d04c5f9ffffff4881e0ff0100004883c80b488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff158e430000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b44240848c7c3050000009090ff155e4300004c8b442410488b5c2408584883c410e99294ffff488b510848bece890dc9a37f0000488d7496fcffe6909090e93b000000909090e94c000000909090e94d000000909090e94e000000909090e94f000000909090e913000000909090e948000000909090e949000000909090488379080b740948c7c201000000eb3d48c7c203000000eb3448c7c205000000eb2b48c7c207000000eb2248c7c20d000000eb1948c7c20f000000eb1048c7c209000000eb0748c7c20b000000488b711048833e037414488b780848b8a0d30dc9a37f0000488b5d08ff13415053ff7008ff711852ff7608ff761048c7c31f000000488b442428909090ff156a42000048833c2401743548c7c081000000480b0424488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff153642000048b8b0dc0dc9a37f00004883c408ff152a420000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff150a42000048837c241001750748833c240b7541488b442410a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409757248837c24080f761148b8a0d40dc9a37f0000488b5d0890ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000eb05e975000000480bc24883c809488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210ff150e41000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15fa400000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15da400000eb5548837c24080f761148b8a0d40dc9a37f0000488b5d0890ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff134883f907742c4883f903741d4883f905740948c7c001000000eb1e48c7c003000000eb15e96400000048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000480bc2480b0424488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b42109090ff15224000004983fe03756a488b442420488b4c2410f6c101740b483b0dd63400007c1eeb06f641ff107516f6c101740b483b0db83400007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15823e0000488b4424184883c0024d89f04889c3488b4424209090ff156e3e0000488b4424184883c00441584889c3488b442418909090ff155a3e0000488b4424104883c00641584883c4104889c358909090ff15463e0000eb6a4983fe057569488b442420488b4c2410f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff157a3d00004c8b4424284883c418488b5c2408584883c410e9428effff488b511048833a017415488b700848b8c8dc0dc9a37f0000488b5d0890ff13488b710848bf3a900dc9a37f0000488d7cb7fcffe7e93b000000909090e94c000000909090e94d000000909090e94e000000909090e94f000000909090e913000000909090e948000000909090e949000000909090488379080b740948c7c601000000eb3d48c7c603000000eb3448c7c605000000eb2b48c7c607000000eb2248c7c60d000000eb1948c7c60f000000eb1048c7c609000000eb0748c7c60b000000488b7a084883c7024881e7ff010000415053ff70084989da49c7c1010000004989f04889fb48c7c00700000090ff15763c00004c8b442410488b5c2408584883c410e93a8dffff488b510848833a017415488b700848b840dd0dc9a37f0000488b5d0890ff13415053ff70084989da49c7c10b00000049c7c001000000488b5a0848c7c00700000090ff15223c00004c8b442410488b5c2408584883c410e9de8cffff488b5008488b7108dd06dc1d86300000dfe04881e0004400004881f000400000488d440001756e41505352564989da49c7c10300000049c7c00b00000048c7c30d00000048c7c007000000909090ff15c23b0000488b1c2448c7c02300000048ba50addc000000000090ff124883f80174664c8b54241049c7c10300000049c7c00900000048c7c30100000048c7c007000000eb05e908000000ff157e3b0000eb6edd06dc1de42f0000dfe04881e0004400004881f000400000488d4400017535415053524989da49c7c10300000049c7c00b000000eb05e96101000048c7c30100000048c7c007000000909090ff15323b0000eb6edd06dc1d882f0000dfe04881e0004400004881f000400000eb05e929010000488d440001755e415053524989da49c7c10300000049c7c00b00000048c7c30100000048c7c007000000909090ff15e63a00004c8b54240849c7c10300000049c7c00900000048c7c301000000eb05e9d300000048c7c0070000009090ff15be3a0000eb73415053525648c7c31f000000488b442410909090ff15aa3a000048b838db0dc9a37f0000ff15a23a0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15823a0000488b442410488b08488b094889ca4883c202488b1848891349c7c00b000000eb05e94a0000004889cb488b48104889c89090ff15523a0000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b44240848c7c3050000009090ff15223a00006a014c8b4424184883c408488b5c2408584883c410e9888affff488b510848833a017417488b700848b830da0dc9a37f0000488b5d08909090ff13488b72084881e6ff010000415053ff70084989da49c7c10300000049c7c0010000004889f348c7c007000000909090ff15ba3900004c8b442410488b5c2408584883c410e91e8affff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13415053ff7008ff7208ff721048c7c31f000000488b442418909090ff156e39000048833c2401743548c7c081000000480b0424488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff153a39000048b838db0dc9a37f00004883c408ff152e390000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff150e39000048833c240b750948c7c005000000eb0748c7c00100000048833c2409756b4883f80774274883f80374184883f805740948c7c101000000eb1948c7c103000000eb1048c7c105000000eb0748c7c10700000048c1e1064883e93f4881e1ff0100004883c909488b542410488b1a488b1b4889de4883c602488b3a4889374989c64989c8488b4210eb05e94c000000ff158238000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff156e380000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff154e380000eb6e48833c240f76164889c148b828d40dc9a37f0000488b5d08909090ff134883f80774274883f80374184883f805740948c7c101000000eb1948c7c103000000eb1048c7c105000000eb0748c7c10700000048c1e1064883e93f4881e1ff010000480b0c24488b542410488b1aeb05e923000000488b1b4889de4883c602488b3a4889374989c64989c8488b4210909090ff15be3700004983fe03756d488b442410488b08488b094889ca4883c208488b184889134c8b70105149c7c0010000004889cb4c89f09090ff158e370000488b04244883c00249c7c0010000004889c34c89f090ff157a370000488b04244883c00449c7c0010000004889c34c89f090ff156637000058eb05e91a0000004883c00649c7c0010000004889c34c89f090ff154e370000eb364983fe057530488b442410488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff151e3700004c8b4424184883c408488b5c2408584883c410e91687ffff415053ff700848c7c31f000000488b442408ff15f6360000488b442408488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff15ce36000048b8f09e0ac9a37f0000ff15c6360000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15a6360000488b442408488b08488b094889ca4883c202488b1848891349c7c0790000004889cb488b48104889c890ff157e36000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff156a360000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff154a36000048c7c31f000000488b4424089090ff153e36000048b838190dc9a37f0000ff1536360000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1516360000488b442408488b08488b094889ca4883c202488b1848891349c7c0590000004889cb488b48104889c890ff15ee35000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15da350000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ba350000498d47e8483b45107303ff55404989c748c740f802000000594889480848b998dd0dc9a37f00004889084c8b4424085b4883c408e92985ffff415053ff700848c7c31f000000488b442408909090ff156e35000048b838190dc9a37f0000ff1566350000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1546350000488b442408488b08488b094889ca4883c202488b1848891349c7c0c10100004889cb488b48104889c890ff151e3500004c8b442410488b5c2408584883c410e99284ffff488b511048833a017415488b700848b8b0dd0dc9a37f0000488b5d0890ff134883790801750948c7c605000000eb0748c7c607000000488b7a084883c7024881e7ff010000415053ff70084989da49c7c10b0000004989f04889fb48c7c007000000ff15aa3400004c8b442410488b5c2408584883c410e91684ffff4883791001750948c7c205000000eb0748c7c207000000488b710848833e037416488b780848b8a0d30dc9a37f0000488b5d089090ff13415053ff7008ff711852ff7608ff761048c7c31f000000488b442428909090ff154234000048833c2401743548c7c081000000480b0424488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff150e34000048b838db0dc9a37f00004883c408ff1502340000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15e233000048837c241001750748833c240b7541488b442410a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409757248837c24080f761148b8a0d40dc9a37f0000488b5d0890ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000eb05e975000000480bc24883c809488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210ff15e632000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15d2320000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15b2320000eb5548837c24080f761148b8a0d40dc9a37f0000488b5d0890ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff134883f907742c4883f903741d4883f905740948c7c001000000eb1e48c7c003000000eb15e96400000048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000480bc2480b0424488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b42109090ff15fa3100004983fe03756a488b442420488b4c2410f6c101740b483b0dbe2400007c1eeb06f641ff107516f6c101740b483b0da02400007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff155a300000488b4424184883c0024d89f04889c3488b4424209090ff1546300000488b4424184883c00441584889c3488b442418909090ff1532300000488b4424104883c00641584883c4104889c358909090ff151e300000eb6a4983fe057569488b442420488b4c2410f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae963000000e95e000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff15522f00004c8b4424284883c418488b5c2408584883c410e9527effff6a016a01488b510848be12a00dc9a37f0000488d7496fcffe6909090e952000000909090e933000000909090e959000000909090e968000000909090e977000000909090e98b000000909090e99f000000909090e9ba0000009090904889e248c702010000004889e248c7420809000000eb5c4889e248c702030000004889e248c7420809000000eb614889e248c7020f0000004889e248c742080f000000eb5e4889e248c702010000004889e248c742080b000000eb564889e248c7020d0000004889e248c742080b000000eb59e9540000004889e248c702070000004889e248c742080d000000eb3de9380000004889e248c7020d0000004889e2eb05e92400000048c742080f000000eb1ae9150000004889e248c702050000004889e248c742080f000000415053ff70084989da49c7c1030000004c8b442420488b5c241848c7c00700000090ff15f22d00004c8b442410488b5c2408584883c420e9ee7cffff488b48084889c8e9e27cffff415053ff70084989da4c8b49104c8b4108488b5920488b411890ff15ba2d00004c8b442410488b5c2408584883c410e9ae7cffff415053ff70084989da49b9088c0cc9a37f000049b8288c0cc9a37f000048c7c33100000048b818db0dc9a37f0000ff157a2d0000488b442408488b1848b8684507c9a37f0000ff156a2d0000488b4c2408488b11488b124889d64883c602488b394889374989de4989c04889d3488b411090ff15462d0000488b442408488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c890ff151e2d00004d8b364983c6fe488b442408498d4fd8483b4d107303ff55404989cf48c741f8020000004c89710848c70103000000488d511848c742f801000000c642ff4048890a488b4868488b094c3bf17307488b48684c8931488b4828488b09498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4828488919488d5b1848c743f80200000048c74308010000004889135348c7c31f00000090ff157e2c000048b868150dc9a37f0000ff15762c0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15562c0000488b442410488b08488b094889ca4883c202488b1848891349c7c0ab0000004889cb488b48104889c890ff152e2c0000488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff15062c0000488b5c241058ff15022c00004c8b442410488b5c2408584883c410e9a67affff488b5108488b7218488b36415053ff7008ffb398000000ff72204889f090ff15d22b0000488b442408488b00498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901584889084c8b442410488b5c2408584883c410e9427affff415053ff7008488b4108ff158a2b00004c8b442410488b5c2408584883c410e91e7affff488b510848833a037415488b700848b8a0d30dc9a37f0000488b5d0890ff13498d77b0483b75107303ff55404989f748c746f802000000488b7a0848897e0848c706290000004c8d4e1849c741f80400000049c741180100000049c741100300000049c74108010000004c8b52104d89114d8d592849c743f8010000004d890b415053ff7008ff7110564152415348c7c31f000000488b442428ff15de2a0000f6042401753648c7c091000000480b442408488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15aa2a00004883c4105890ff15a62a0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15862a0000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700030000004c8b44240848c7c3010000009090ff15562a00004c8b442410488b5c2408584883c410e9c278ffff498d57d8483b55107303ff55404989d748c742f801000000488b7108488932488d7a1048c747f8020000004889770848c70701000000415053ff7008534989f24989f94989d048c7c30300000048b878140dc9a37f0000909090ff15ea2900004c8b442410488b5c2408584883c410e94e78ffff415053ff7008ff71084989da4c8b0c244d89c84883c40848c7c3ffffffff48b878140dc9a37f00009090ff15ae2900004c8b442410488b5c2408584883c410e90a78ffff415053ff70084989da49b9c88b0cc9a37f000049b8288c0cc9a37f000048c7c31100000048b828120dc9a37f0000ff156e29000048c7c325000000488b4424089090ff1562290000488b442408ff30488b0424488b0048c7c107000000482bc84883c1014883e1074883f901745548c7c31f000000488b442410ff153229000048b888b20cc9a37f0000ff152a290000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff150a290000483b65187303ff5548eb8c48c7c31f0000004883c408488b442408909090ff15ee28000048b868150dc9a37f0000ff15e6280000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15c6280000488b442408488b08488b094889ca4883c202488b1848891349c7c0270000004889cb488b48104889c890ff159e2800004c8b442410488b5c2408584883c410e9b276fffff64008017560488b5008488b3248833e31753b498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b4a084c894f0848890f488d471848c740f80200000048897808488930e96476ffff48833e617565488b790840f6c7017417f64608017411eb05e925050000488d7fff48037e087105ff5570ebf14d8d4fd04c3b4d107303ff55404d89cf49c741f8020000004989790849c70161000000498d411848c740f802000000488b4a08488948084c8908e9f975fffff641080175184c8b4908498b3941f641ff10740348f7df488d7c3f01eb04488b7908488d3cfdf9ffffff40f6c70174084883ff017d27eb06f647ff10741f415053524889fb48b810c506c9a37f000048bad0a8dc0000000000ff12eb074889f841505352a801740b4881f801ffffff7c5deb06f640ff10755aa801740b4881f8010100007d52eb06f640ff10746f5048c7c31f000000488b4424109090ff1536270000488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c8eb0fe946010000e941010000e93c010000ff15fe26000048b8980f0dc9a37f0000ff15f6260000488b4c2410488b11eb05e917010000488b124889d34883c302488b3148891e4989c04889d3488b411090ff15ce260000488b442410488b08488b094889ca4883c202488b1848891349c7c0890100004889cb488b48104889c890ff15a6260000488b442410488b0c24f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8909090ff15ea250000eb6d5048c7c31f000000488b442410909090ff15da250000488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff15b225000048b8a80f0dc9a37f0000ff15aa250000488b4c2410488b11488b124889d34883c302488b31eb05e93802000048891e4989c04889d3488b411090ff1582250000488b442410488b08488b094889ca4883c202488b1848891349c7c0890100004889cb488b48104889c890ff155a250000488b442410488b0c24f6c101740b483b0da51600007c1eeb06f641ff107516f6c101740b483b0d871600007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15c6230000488b4424184883c0024d89f04889c3488b4424209090ff15b2230000488b4424184883c00441584889c3488b442418909090ff159e230000488b4424104883c00641584883c4104889c3584883c408909090ff15862300004c8b442410488b5c2408584883c410e92271fffff64108017517488b7108488b16f646ff10740348f7da488d541201eb04488b5108488d14d5f9fffffff6c20174084883fa017d2aeb06f642ff107422415053ff70084889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb0b488b48084889d041505351a801740b4881f801ffffff7c5deb06f640ff10755aa801740b4881f8010100007d52eb06f640ff10746f5048c7c31f000000488b4424109090ff15d2220000488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c8eb0fe946010000e941010000e93c010000ff159a22000048b8980f0dc9a37f0000ff1592220000488b4c2410488b11eb05e917010000488b124889d34883c302488b3148891e4989c04889d3488b411090ff156a220000488b442410488b08488b094889ca4883c202488b1848891349c7c0890100004889cb488b48104889c890ff1542220000488b442410488b0c24f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8909090ff1586210000eb6d5048c7c31f000000488b442410909090ff1576210000488b442410488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff154e21000048b8a80f0dc9a37f0000ff1546210000488b4c2410488b11488b124889d34883c302488b31eb05e93802000048891e4989c04889d3488b411090ff151e210000488b442410488b08488b094889ca4883c202488b1848891349c7c0890100004889cb488b48104889c890ff15f6200000488b442410488b0c24f6c101740b483b0db91100007c1eeb06f641ff107516f6c101740b483b0d9b1100007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15621f0000488b4424184883c0024d89f04889c3488b4424209090ff154e1f0000488b4424184883c00441584889c3488b442418909090ff153a1f0000488b4424104883c00641584883c4104889c3584883c408909090ff15221f00004c8b442410488b5c2408584883c410e9466cffff48837908017557415053ff7008ff730848c7c31f000000488b4424109090ff15f21e000048b890180dc9a37f0000ff15ea1e0000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ca1e0000eb6f415053ff7008ff730848c7c311000000488b410848ba50a9dc00000000009090ff12a8017513488b08f640ff10740348f7d9488d4c0901eb034889c15148c7c31f000000488b442418909090ff157e1e000048b8e0180dc9a37f0000ff15761e0000488b4c2418488b11488b12eb05e9be0000004889d34883c302488b3148891e4989c04889d3488b411090ff154e1e0000488b042448ba10a5dc0000000000ff1248ba90a4dc0000000000ff124881e0ff010000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff150a1e00005848c1e8084883c80148ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15be1d00005848c700030000004c8b442410488b5c2408584883c410e99a6affff415053ff7008ff7108ff33ff7340ff730848c7c325000000488b44242890ff15861d0000488b442428ff30488b0424488b0048c7c105000000482bc84883c1014883e1074883f901745548c7c31f000000488b442430ff15561d000048b888b20cc9a37f0000ff154e1d0000488b4c2430488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff152e1d0000483b65187303ff5548eb8c4883c4085848c70001000000488b442408488b005948890158488b00594889014c8b442410488b5c2408584883c410e9c769ffff488b510848833a037516488b700848b808de0dc9a37f0000488b5d089090ff13488b721048833e097569488b7a0848833f0374144c8b480848b8a0d30dc9a37f0000488b5d08ff13415053ff7008ff7110ff7218ff7708ff771048c7c31f000000488b44242890ff158a1c000048833c2401743d48c7c081000000480b0424488b4c2428488b11488b124889d34883c302eb05e9d3040000488b3148891e4989c04889d3488b4110909090ff154e1c000048b800150dc9a37f00004883c408ff15421c0000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15221c000048837c240801750748833c240b7541488b442408a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409756b4883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff0100004883c809488b542420488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210eb05e94c000000ff15561b000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff15421b0000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15221b0000eb6d48833c240f761248b828d40dc9a37f0000488b5d089090ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000480b0424488b542420488b1a488b1beb05e9200000004889de4883c602488b3a4889374989ce4989c0488b4210909090ff15961a00004983fe03756a488b442420488b4c2408f6c101740b483b0d820a00007c1eeb06f641ff107516f6c101740b483b0d640a00007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e989010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15f6180000488b4424184883c0024d89f04889c3488b4424209090ff15e2180000488b4424184883c00441584889c3488b442418909090ff15ce180000488b4424104883c00641584883c4104889c358909090ff15ba180000eb6a4983fe057569488b442420488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c21eb06f641ff107519488b5010488b1848b898d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c302488b3048891eeb0ae9b7000000e9b2000000f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c8909090ff15ee170000eb52498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4a084c890f415053ff7008ff71105349ba902b07c9a37f00004989f14989f8488b5a1848b800150dc9a37f000090ff15a61700006a016a01488b4424204883c410488b08488b094889ca4883c202488b1848891341584889cb488b48104889c89090ff157a1700004c8b442410488b5c2408584883c410e9c663ffff488b510848833a037515488b700848b898de0dc9a37f0000488b5d0890ff13488b721048833e097529415053ff70084989da4c8b49104c8b4208488b5a1848b888120dc9a37f00009090ff151e170000eb46498d7ff0483b7d107303ff55404989ff48c747f8010000004c8b4a084c890f415053ff7008534c8b51104989f14989f8488b5a1848b888120dc9a37f00009090ff15de1600004c8b442410488b5c2408584883c410e91a63ffff488b5358488b124883fa037416488b480848b828df0dc9a37f0000488b5d089090ff13488b535848c70201000000488b48084889c8e9e062ffff488b5108488b7220488b36483b352e0600007567488b7360488b36488b7b6048c707010000004c8b4b084d8b094983f901756d4c8b48084c8b521848b8c0110dc9a37f0000909090ff154a160000488b0b488b094889ca4883c2024c8b1b4989134d89c6534151415256ff730841534989c0488b43104889cbeb05e917010000ff151a160000488b442428488b08488b094889ca4883c202488b18488913eb05e9c900000049c7c0010000004889cb488b48104889c89090ff15ea15000058488b004883c0fe488b4c2420498d57d8483b55107303ff55404989d748c742f8020000004889420848c70203000000488d5a1848c743f801000000c643ff40488913488b5168488b12483bc27307488b5168488902488b4128488b00498d57e8483b55107303ff55404989d748c742f8020000004889420848891a488b41284889105a48c70203000000498d77e8483b75107303ff55404989f748c746f8020000005a4889560848891e4d89f0eb0753ff7008ff7218488b0424488b004883f801740f4889c34889f0ff15221500004889c658488930eb5953ff700841505648c7c31f000000488b4424189090ff1506150000488b442408488b00488b0c24f6c10174084883f9017d2ceb06f641ff107424504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb0ce90f0400004889c24889c852488b0c24f6c10174084883f9017d25eb06f641ff10741d504889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb074889c24889c852594883c410f6c1017409a8017405482bc87105ff5570ebf64883c1014889c8a80174064883e8047105ff5570ebf5a801740b4881f801ffffff7c60eb06f640ff10755da801740b4881f8010100007d55eb06f640ff10746d5048c7c31f000000488b442418ff151e14000048b8c0110dc9a37f0000ff1516140000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3eb0fe9e1000000e9dc000000e9d7000000488b4110909090ff15e2130000488b442418488b0c24f6c101eb05e9b7000000740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c1feb06f641ff107517488b5010488b1848b898d50dc9a37f0000488b5d08ff13488b10488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8909090ff1522130000eb695148c7c31f000000488b442418909090ff151213000048b8e8110dc9a37f0000ff150a130000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ea12000058a80174064883e80a7105ff5570ebf5488b4c2410a8017412eb05e9e0010000483b050b0200007c1deb06f640ff107515a801740b483b05ee0100007c1deb06f640ff1075154889c248b818d50dc9a37f0000488b5d089090ff13488b11488b124889d34883c308488b3148891ea8017414ff71105248bad0a4dc00000000009090ff12eb644889c3488b03f643ff10740348f7d8488d440001ff7110525348ba10a5dc000000000090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff154a110000488b4424184883c0024d89f04889c3488b4424209090ff1536110000488b4424184883c00441584889c3488b442418909090ff1522110000488b4424104883c00641584883c4104889c358909090ff150e110000eb0241504158488b5c2408584883c408e9c95cffff48c7c001000000c390000000000000000048a3000000000000010000000100000001000000fffffffff1ffffffffffff0f010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff000000000000f0bf000000000000f03f0000000000000000010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000fffffffff1ffffffffffff0ffeffffffffffff01010000000100000001000000ffffffff0100008000000000010000000100000001000000ffffffff010000000100000001000000ffffffff010000000100000001000000ffffffff|@4199,2097151,@16143,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4241,@4200,@4192,@4215,@4192,@4192,@4242,@4249,@4200,@4192,@4215,@4192,@4192,@4249,@4251,@4249,@4251,@4200,@4192,@4215,@4192,@4253,@3806,@4200,@4192,@4215,@4192,@4249,@4249,@4251,@4270,@4270,@4200,@4192,@4215,@4192,@4192,@4241,@4200,@4192,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4246,@4246,@4200,@4192,@4215,@4192,@4242,@4200,@4192,@4215,@4192,@4192,@4249,@4200,@4215,@4192,@4192,@4192,@4200,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4200,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4192,@4192,@4200,@4215,@4192,@4192,@4242,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4215,@4192,@4200,@4215,@4192,@4270,@4249,@4249,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4212,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4192,@4200,@4215,@4192,@4192,@4249,@4200,@4215,@4192,@4200,@4192,@4215,@4192,@4200,@4215,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4251,@4192,@4192,@4192,@4192,@4249,@4251,@4251,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@884,@4200,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4249,@4249,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4212,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4249,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4215,@4192,@4192,@4212,@4200,@4215,@4192,@4192,@4192,@4212,@4200,@4192,@4215,@4192,@4192,@4272,@4200,@4215,@4192,@4192,@4242,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4270,@4270,@4270,@4270,@4270,@4270,@4270,@4200,@4215,@4192,@4192,@4242,@4270,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4200,@4215,@4192,@4192,@4239,@4192,@4200,@4215,@4192,@4192,@4270,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4270,@4278,@4249,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4212,@4212,@4286,@4200,@4192,@4215,@4192,@4242,@4251,@4249,@4249,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4192,@4200,@4200,@4215,@4192,@4200,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4251,@4192,@4249,@4251,@4215,@4192,@4192,@4288,@4200,@4200,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4192,@4192|21,0,$4110+42 568,0,@4111 591,0,@4114 610,0,$4110+626 1142,0,@4114 1162,0,$4110+1178 1698,0,@4117 1804,0,@3956 1916,0,@3870 1926,0,@3659 2001,0,@4120 2366,0,@4117 2476,0,@3954 2634,0,@4123 2792,0,@3870 2802,0,@3659 2870,0,@4123 2894,0,@4120 3119,0,@4126 3173,0,I90 3213,0,I91 3229,0,@376 3244,0,I115 3263,0,@376 3273,0,I80 3304,0,I86 3316,0,I89 3348,0,I86 3360,0,I89 3392,0,I86 3404,0,I89 3431,0,I89 3629,0,@4129 3836,0,@4129 4080,0,@4117 4192,0,@3955 4350,0,@4123 4508,0,@3870 4518,0,@3659 4586,0,@4123 4610,0,@4120 4835,0,@4126 4889,0,I90 4929,0,I91 4945,0,@376 4960,0,I115 4979,0,@376 4989,0,I80 5020,0,I86 5032,0,I89 5064,0,I86 5076,0,I89 5108,0,I86 5120,0,I89 5147,0,I89 5345,0,@4129 5552,0,@4126 5602,0,I90 5641,0,I91 5657,0,@376 5672,0,I115 5691,0,@376 5701,0,I80 5732,0,I86 5744,0,I89 5776,0,I86 5788,0,I89 5820,0,I86 5832,0,I89 5859,0,I89 6074,0,@4117 6371,0,@4123 6489,0,@1394 6689,0,@4117 6721,0,@4117 6915,0,@4123 6939,0,@4120 7069,0,@4132 7111,0,@4009 7152,0,@4009 7202,0,@4135 7250,0,@4138 7325,0,@4138 7378,0,@4117 7824,0,I108 7972,0,I109 8043,0,@4139 8114,0,@4117 8193,0,@4142 8571,0,I108 8640,0,@3659 8926,0,@3983 9070,0,@3983 9118,0,@4144 9187,0,@3983 9245,0,@4147 9318,0,@4150 9437,0,I110 9530,0,@4117 9561,0,@4117 9688,0,@4153 9751,0,@4123 9774,0,@4120 9918,0,@2708 10011,0,@4117 10132,0,@4013 10195,0,@4120 10328,0,@4126 10378,0,I90 10417,0,I91 10433,0,@376 10448,0,I115 10467,0,@376 10477,0,I80 10508,0,I86 10520,0,I89 10552,0,I86 10564,0,I89 10596,0,I86 10608,0,I89 10635,0,I89 10777,0,@4117 11124,0,72057594037927936 11137,0,I109 11159,0,I110 11378,0,@4117 11726,0,@4117 11757,0,@4117 11892,0,@3985 11955,0,@4123 11979,0,@4120 12112,0,@4154 12176,0,@4020 12408,0,@4155 12791,0,$4110+12806 12922,0,@4117 13028,0,@3561 13091,0,@4123 13115,0,@4120 13238,0,@4117 13310,0,@4142 13644,0,@4019 13784,0,@4129 13948,0,@4017 14071,0,@4126 14118,0,I90 14157,0,I91 14173,0,@376 14188,0,I115 14207,0,@376 14217,0,I80 14248,0,I86 14260,0,I89 14292,0,I86 14304,0,I89 14336,0,I86 14348,0,I89 14375,0,I89 14556,0,@4020 14701,0,@1394 14754,0,@4117 14864,0,@4020 15140,0,@3870 15150,0,@3659 15217,0,@4120 15427,0,@4126 15481,0,I90 15521,0,I91 15537,0,@376 15552,0,I115 15571,0,@376 15581,0,I80 15612,0,I86 15624,0,I89 15656,0,I86 15668,0,I89 15700,0,I86 15712,0,I89 15739,0,I89 15937,0,@4129 16140,0,@4002 16216,0,@4002 16290,0,@4158 16382,0,@4160 16413,0,@884 16423,0,@3825 16440,0,@4009 16461,0,@884 16471,0,@3807 16488,0,@4163 16512,0,@1075 16788,0,@4020 17020,0,@3985 17192,0,@4013 17492,0,@4015 17712,0,@4164 17821,0,@884 17831,0,@3806 17848,0,@3985 17884,0,@4005 17984,0,@4117 18058,0,@4142 18344,0,@4101 18660,0,@4117 18776,0,@3172 18839,0,@4123 18863,0,@4120 19007,0,@4117 19124,0,@4034 19187,0,@4123 19211,0,@4120 19417,0,@4117 19524,0,@3404 19587,0,@4123 19611,0,@4120 19734,0,@4165 19775,0,@4117 19892,0,@4013 20160,0,@3870 20170,0,@3659 20237,0,@4120 20443,0,@4126 20497,0,I90 20537,0,I91 20553,0,@376 20568,0,I115 20587,0,@376 20597,0,I80 20628,0,I86 20640,0,I89 20672,0,I86 20684,0,I89 20716,0,I86 20728,0,I89 20755,0,I89 20953,0,@4129 21139,0,@884 21159,0,@4013 21244,0,@4126 21294,0,I90 21333,0,I91 21349,0,@376 21364,0,I115 21383,0,@376 21393,0,I80 21424,0,I86 21436,0,I89 21468,0,I86 21480,0,I89 21512,0,I86 21524,0,I89 21551,0,I89 21718,0,@4168 21766,0,@3985 21838,0,@3985 21954,0,@4009 22006,0,@4117 22120,0,@4031 22392,0,@3870 22402,0,@3659 22469,0,@4120 22675,0,@4126 22729,0,I90 22769,0,I91 22785,0,@376 22800,0,I115 22819,0,@376 22829,0,I80 22860,0,I86 22872,0,I89 22904,0,I86 22916,0,I89 22948,0,I86 22960,0,I89 22987,0,I89 23185,0,@4129 23333,0,I91 23348,0,I89 23442,0,@4117 23520,0,@4061 23928,0,@4031 23995,0,@4120 24153,0,@4160 24222,0,I108 24275,0,@3825 24288,0,@4009 24313,0,@3807 24330,0,@4163 24356,0,@1075 24632,0,@4020 24806,0,@4117 24928,0,@3985 24991,0,@4123 25117,0,@4170 25160,0,@4117 25268,0,@3561 25331,0,@4120 25414,0,@4117 25536,0,@4172 25599,0,@4123 25693,0,@3807 25710,0,@4163 25736,0,@1156 26007,0,@4117 26124,0,@4163 26187,0,@4123 26280,0,@1156 26576,0,@4020 26754,0,@4117 26876,0,@3985 26939,0,@4123 27116,0,@4173 27176,0,$4110+27194 27346,0,@4123 27508,0,$4110+27526 27683,0,@4117 27796,0,@4173 27958,0,@4123 28116,0,@3870 28126,0,@3659 28194,0,@4123 28218,0,@4120 28443,0,@4126 28497,0,I90 28537,0,I91 28553,0,@376 28568,0,I115 28587,0,@376 28597,0,I80 28628,0,I86 28640,0,I89 28672,0,I86 28684,0,I89 28716,0,I86 28728,0,I89 28755,0,I89 28953,0,@4129 29134,0,@4174 29155,0,$4110+29170 29398,0,@4177 29571,0,I124 29880,0,@4164 30088,0,@4158 30194,0,@4117 30304,0,@4164 30512,0,@3870 30522,0,@3659 30592,0,@4120 31028,0,@3172 31132,0,@3870 31142,0,@3659 31220,0,@4063 31324,0,@3870 31334,0,@3659 31421,0,@4179 31476,0,@4063 31614,0,@4180 31761,0,@4117 31876,0,@4164 32038,0,@4123 32196,0,@3870 32206,0,@3659 32274,0,@4123 32298,0,@4120 32523,0,@4126 32577,0,I90 32617,0,I91 32633,0,@376 32648,0,I115 32667,0,@376 32677,0,I80 32708,0,I86 32720,0,I89 32752,0,I86 32764,0,I89 32796,0,I86 32808,0,I89 32835,0,I89 33033,0,@4129 33208,0,$4110+33226 33629,0,@3806 33639,0,@3807 33656,0,@4163 33680,0,@1075 33956,0,@4020 34290,0,@4117 34701,0,@4009 34770,0,@4009 34817,0,@3804 34827,0,@3807 34844,0,@3983 34936,0,@3877 35028,0,@4020 35406,0,@376 35416,0,I106 35564,0,@3954 35736,0,@4129 35944,0,@3955 36116,0,@4126 36166,0,I90 36205,0,I91 36221,0,@376 36236,0,I115 36255,0,@376 36265,0,I80 36296,0,I86 36308,0,I89 36340,0,I86 36352,0,I89 36384,0,I86 36396,0,I89 36423,0,I89 36645,0,@376 36655,0,I106 36808,0,@3954 36980,0,@4129 37188,0,@3955 37360,0,@4126 37410,0,I90 37449,0,I91 37465,0,@376 37480,0,I115 37499,0,@376 37509,0,I80 37540,0,I86 37552,0,I89 37584,0,I86 37596,0,I89 37628,0,I86 37640,0,I89 37667,0,I89 37856,0,@4055 37934,0,I108 37996,0,@4059 38064,0,I91 38076,0,I89 38145,0,I91 38160,0,I89 38340,0,@3877 38473,0,@4182 38515,0,@4117 38636,0,@4015 38908,0,@3870 38918,0,@3659 38985,0,@4120 39191,0,@4126 39245,0,I90 39285,0,I91 39301,0,@376 39316,0,I115 39335,0,@376 39345,0,I80 39376,0,I86 39388,0,I89 39420,0,I86 39432,0,I89 39464,0,I86 39476,0,I89 39503,0,I89 39701,0,@4129 39887,0,@884 39907,0,@4015 40010,0,@4185 40058,0,@3988 40130,0,@3988 40185,0,@4188 40285,0,@3978 40695,0,@376 40705,0,I106 40761,0,@376 40771,0,I106 40900,0,@3978 41043,0,@4129 41200,0,@3980 41329,0,@4126 41374,0,I90 41415,0,I91 41429,0,@376 41444,0,I115 41463,0,@376 41473,0,I80 41508,0,I86 41520,0,I89 41552,0,I86 41564,0,I89 41596,0,I86 41608,0,I89 41635,0,I89 4111:O4|@20055,@557,@4113,@4112 4112:O5|@3814,3040,0,3040,0 4113:S39|53746f72654c6f6e67436f6e7374546f4d656d6f72793a20436f6e7374616e7441646472657373 4114:O4|@20055,@557,@4116,@4115 4115:O5|@3814,1624,0,1624,0 4116:S17|67656e4d656d6f7279436f6e7374616e74 4117:O4|@20055,@557,@4119,@4118 4118:O5|@3814,498,0,498,0 4119:S30|6765745265673a206e6f7420612067656e6572616c207265676973746572 4120:O4|@20055,@557,@4122,@4121 4121:O5|@3814,940,0,940,0 4122:S13|6d6f64726d3a2062616420726d 4123:O4|@20055,@557,@4125,@4124 4124:O5|@3814,939,0,939,0 4125:S13|6d6f64726d3a20626164207267 4126:O4|@20055,@557,@4128,@4127 4127:O5|@3814,404,0,404,0 4128:S20|67656e3332733a20696e76616c696420776f7264 4129:O4|@20055,@557,@4131,@4130 4130:O5|@3814,382,0,382,0 4131:S19|67656e38733a20696e76616c69642062797465 4132:O4|@20055,@557,@4134,@4133 4133:O5|@3814,2732,0,2732,0 4134:S29|4c6f6164416464726573733a206e6f2062617365206f7220696e646578 4135:O4|@20055,@557,@4137,@4136 4136:O5|@3814,2707,0,2707,0 4137:S26|4c6f616442797465523a20436f6e7374616e7441646472657373 4138:O1|24 4139:O4|@20055,@557,@4141,@4140 4140:O5|@3814,2652,0,2652,0 4141:S21|63674f703a206f6666736574206e6f6e2d7a65726f 4142:O1|@4143 4143:O4|1,0,0,0 4144:O4|@20055,@557,@4146,@4145 4145:O5|@3814,2688,0,2688,0 4146:S25|4c6f61644d656d523a20436f6e7374616e7441646472657373 4147:O4|@20055,@557,@4149,@4148 4148:O5|@3814,2625,0,2625,0 4149:S44|4d6f7665204c69746572616c536f7572636520746f206670207265673a20696e76616c696420736f75726365 4150:O4|@20055,@557,@4152,@4151 4151:O5|@3814,1957,0,1957,0 4152:S5|6670726567 4153:O3|0,5,3 4154:O1|17 4155:O4|@20055,@557,@4157,@4156 4156:O5|@3814,2850,0,2850,0 4157:S21|436f6e646974696f6e616c206a756d70206261636b 4158:O4|@20055,@557,@4152,@4159 4159:O5|@3814,1948,0,1948,0 4160:O4|@20055,@557,@4162,@4161 4161:O5|@3814,2044,0,2044,0 4162:S35|416c6c6f636174696f6e207374617274656420627574206e6f7420636f6d706c657465 4163:O3|0,2,3 4164:O2|4,5 4165:O4|@20055,@557,@4167,@4166 4166:O5|@3814,3017,0,3017,0 4167:S33|53746f7265526567546f4d656d6f72793a20436f6e7374616e7441646472657373 4168:O4|@20055,@557,@4167,@4169 4169:O5|@3814,2992,0,2992,0 4170:O4|@20055,@557,@4162,@4171 4171:O5|@3814,2060,0,2060,0 4172:O3|0,0,3 4173:O2|4,4 4174:O4|@20055,@557,@4176,@4175 4175:O5|@3814,3317,0,3317,0 4176:S14|63674f703a204650417269746852 4177:O4|@20055,@557,@4152,@4178 4178:O5|@3814,3359,0,3359,0 4179:O2|48,1 4180:O4|@20055,@557,@4152,@4181 4181:O5|@3814,3300,0,3300,0 4182:O4|@20055,@557,@4184,@4183 4183:O5|@3814,3092,0,3092,0 4184:S39|53746f726542797465436f6e7374546f4d656d6f72793a20436f6e7374616e7441646472657373 4185:O4|@20055,@557,@4187,@4186 4186:O5|@3814,3067,0,3067,0 4187:S37|53746f726542797465526567546f4d656d6f72793a20436f6e7374616e7441646472657373 4188:O4|@20055,@557,@4190,@4189 4189:O5|@3814,3113,0,3113,0 4190:S44|466f756e642053746f7265496e697469616c6973656420627574206e6f7420696e20616c6c6f636174696f6e 4191:S31|5838364f5554505554434f444528292e636f646547656e6572617465283229 4192:D3,576|488b084883390375144889c248b858e20dc9a37f0000488b5d0890ff13488b710848baffffffffffffff00482356f8488d5412014889d7488d3cfdf9ffffff483bdf731f4c89c048d1eb48d1e84888041e488d440001488d5c1b0148c7c001000000c34883390174144989c148b8f0e20dc9a37f0000488b5d0890ff134989c148c7c0070000004883e80148d1ea48f7e24883c001488d5412014889da48c1ea034883ca014883c202483bc277034889d04883f8017409483b057a01000072154889c248b8901609c9a37f0000488b5d089090ff134889c148c7c0010000004889fa488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f498d47d8483b45107303ff55404989c748c740f8020000004889780848c70001000000488d481848c741f801000000c641ff40488901498b3148833e0175094c8b1149833a0174154989c248b840b30cc9a37f0000488b5d089090ff13488b094c8b5e0849baffffffffffffff004d2353f84f8d5412014c8b690849bcffffffffffffff004d2365f84f8d6424014e8d14d5f9ffffff4e8d24e5f9ffffff4c2be24983c4014c3bd272064983fc0173154989c248b828b40cc9a37f0000488b5d089090ff134c89de4989fa4c89ef4889d148d1e9f3a4488d7c3f01488d743601488d4c09014c89c148d1eb48d1e949880c1a488d4c0901488d5c1b0149890148c7c001000000c3909090909000000000000000003002000000000000ffffffffffffff01|@4289,4095,@16173|14,0,@4193 35,0,36028797018963967 110,0,@4196 197,0,@2212 361,0,@3883 386,0,36028797018963967 409,0,36028797018963967 465,0,@3887 4193:O4|@20055,@557,@4195,@4194 4194:O5|@3886,148,0,148,0 4195:S42|637365675365743a2063616e2774206368616e6765206c6f636b656420636f646520736567656d656e74 4196:O4|@20055,@557,@4198,@4197 4197:O5|@3886,157,0,157,0 4198:S34|637365675365743a2063616e277420657874656e6420636f6465207365676d656e74 4199:S38|5838364f5554505554434f444528292e636f646547656e657261746528322963674f70283129 4200:D6,312|483b65187303ff5548488b4808488b094883f9017556488b4860488b094883f9017435488b500848c70201000000ffb098000000ff30ff70405053ff7060524889cb9090ff1506010000488b44240848c70001000000eb26ffb098000000ff30ff704050536a01ff7008eb12ffb098000000ff30ff704050536a01ff7008488b0424488b004c8b4424104889c3488b4424189090ff15be000000584883c41048c70001000000488b0424488b4860488b094883f901741f488b500848c70201000000ff70604889cbff15920000005848c70001000000488b4424104883c408488b0059488901488b442408488b00a801751f488b0c24488b09488b1048890a488b48084889c8483b65187303ff5548ebdd4883c4085848c7000100000048c7c001000000c390909000000000000000003001000000000000|@4210,2097151,@16144,@4201,@4211,@4201| 4201:D16,1464|483b65187303ff5548f6c3017560488b0b488b09488339017559ff730850ff7010ff7108ff7040ff30488b5c2418488b44241090ff1596050000488b0c24488b09f6c10174084883f9017d30eb06f641ff107428504889cb48b810c506c9a37f000048bad0a8dc0000000000eb0ae928050000e9d4020000ff12eb074889c24889c852488b4c2418f6c10174084883f9017d25eb06f641ff10741d504889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174064883e9087105ff5570ebf5488b442408488b00488b54241048890248833c2401741348b878eb0dc9a37f0000488b5d08909090ff134883f901756e48b888b20cc9a37f0000909090ff15ae040000488b4c24184883e9024989c64d89f04889cb488b442420909090ff15960400004d89f0488b5c2418488b44242090ff158a040000488b4424184883c0024d89f04889c3488b4424209090ff1576040000488b4424184883c004eb05e9320000004d89f04889c3488b442420909090ff155a040000488b4424184883c0064d89f04889c3488b4424209090ff1546040000eb65f6c10174134889c848bad0a4dc00000000009090ff12eb60488b01f641ff10740348f7d8488d4400015148ba10a5dc0000000000ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174255b48b810c506c9a37f0000eb05e96203000048ba50a2dc0000000000ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2430488b442438909090ff1516030000488b4424304883c0024d89f04889c3488b4424389090ff1502030000488b4424304883c00441584889c3488b442430909090ff15ee020000488b4424284883c00641584883c4084889c3488b442420909090ff15d6020000eb63488b5010488b12488b7a0848beffffffffffffff00482377f8488d743601488d34f5f9ffffff483b710877154889c648b8280f0dc9a37f0000488b5d089090ff13488b710848d1ee480fb63437488d74360140f6c60174104881fe010100007c32eb0be9d4010000f646ff10752540f6c60174094881eefe0100007105ff5570ebf240f6c60174064883ee027105ff5570ebf54c8b004d8b0041f6c00174084983f8017d37eb0741f640ff10742eff730850ff7010ff7040ff30ff7108564c89c348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb1a4989c14c89c0ff7308415141ff711041ff714041ff31ff710856488b4c2408f6c10174084883f9017d26eb06f641ff10741e504889cb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174064883e9027105ff5570ebf5488b442410488b00488b542418488902f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c1aeb06f641ff10751248b808ec0dc9a37f0000488b5d089090ff1348833c2401741148b880ec0dc9a37f0000488b5d0890ff13f6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b01f641ff10740348f7d8488d440001eb034889c84881e0ff0100004989c04883c408488b1c24488b442418909090ff15ba000000488b5c2420584883c418ff15b20000006a016a016a016a016a01488b5c24304883c428584883c408e965faffff48c7c001000000c390909090900000000000000000b005000000000000|@4237,2097151,@16154,@4236,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4231|90,0,@376 100,0,I106 161,0,@376 171,0,I106 256,0,@4202 281,0,@3877 454,0,I90 488,0,I91 501,0,@376 516,0,I115 535,0,@376 552,0,I80 584,0,I86 596,0,I89 628,0,I86 640,0,I89 672,0,I86 684,0,I89 711,0,I89 857,0,36028797018963967 893,0,@3951 1039,0,@376 1049,0,I106 1120,0,@376 1130,0,I106 1253,0,@4205 1278,0,@4208 4202:O4|@20055,@557,@4204,@4203 4203:O5|@3814,1080,0,1080,0 4204:S39|7265616c6c794669784272616e636865733a206a756d7020616c72656164792070617463686564 4205:O4|@20055,@557,@4207,@4206 4206:O5|@3814,1064,0,1064,0 4207:S14|6a756d7020746f6f206c61726765 4208:O4|@20055,@557,@4204,@4209 4209:O5|@3814,1067,0,1067,0 4210:S28|5838364f5554505554434f444528292e646f50656e64696e67283229 4211:D9,944|483b65187303ff55484883fb01750948c7c1ff000000eb0748c7c1c9000000488b5028488b1248c7c601000000f6c201752040f6c60174064883c6027105ff5570ebf5488b5208483b65187303ff5548ebdb4889f250ff7028ff70684150ff30ff7060ff700853514889d348c7c00b00000048ba50a9dc0000000000ff1248c7c1ff000000f6c1017409a8017405482bc87105ff5570ebf64883c101f6c101740ef60424017408483b0c247e0deb05ff5570ebf3488b0424eb034889c8a801740ef6442428017407482b4424287105ff5570ebf44883c00148837c240801740a488b4c2420488b09eb0c488b4c2420488b094883c104488b5424384883c408488b12504c8b4c24284989c8488b5c24184889d090ff15ae020000488b4c2430488b09483b0d7f020000745a488b4c2420488b09488b542430488b12f6c10174084883f9017d26eb06f641ff10741e50524889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb084889c34889c85352488b0c24f6c101740d4883f9017d29eb0be95f000000f641ff10741c504889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb074889c24889c852594883c408f6c1017409a8017405482bc87105ff5570ebf64883c101f6c1017410f6442408017409483b4c24087e67eb08ff5570ebf250eb6248837c241001740948c7c001000000eb56488b44241848c7000300000048b8c0110dc9a37f000090ff15b6010000488b4c2448488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1596010000488b442448eb0fe938010000e933010000e9d4000000488b08488b094889ca4883c202488b1848891349c7c0010000004889cb488b48104889c8ff155e010000488b442428488b004883c0fe488b4c2448498d57d8483b55107303ff55404989d748c742f8020000004889420848c70203000000488d5a1848c743f801000000c643ff40488913488b5168488b12483bc27307488b5168488902488b4128488b00498d57e8483b55107303ff55404989d748c742f8020000004889420848891a488b4128488910498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918488b4c243848baf1ffffffffffff0f488911488b542440488b1250ff742410ff742458514c8b5424504c8b4c24484c8b442420488b5c24404889d090ff157a000000488b4c2448488901488b5c2450584883c450ff256a00000048c7c0010000004883c450c39090909090900000000000000000a003000000000000f1ffffffffffff0f|@4213,2097151,@16145,@4214,@4215,@4192,@4192,@4217,@4212|116,0,I108 341,0,@376 351,0,I106 406,0,@376 416,0,I106 523,0,@3978 819,0,576460752303423480 4212:D5,192|483b65187303ff55484883f801750848c7c001000000c3488b4b60488b094883f9017423488b7360488b7b404c8b43084c8b0b4989da4889cb909090ff15960000004c89d3eb0f488b7360488b7b404c8b43084c8b0b56574150415153488b4c2408488b09514c8b5424084c8b4c24184c8b442420488b5c24109090ff155e000000488b4c2410488b09483b0c24740f4883c408483b65187303ff5548ebbe4883c4285948890148c7c001000000c3900000000000000000b800000000000000|@4229,2097151,@16149,@4230,@4222| 4213:S34|5838364f5554505554434f444528292e636865636b4272616e63684c697374283329 4214:D3,416|483b65187303ff5548a801756341514150ff3053488b400890e8e2ffffff488b4c2408488b0948833903755c488b1424488b12f6c2017525488b1a483b5c2408750948c7c603000000eb19488b5a084889da483b65187303ff5548ebd648c7c6010000004883fe01740c4883c420eb05e913010000c3488b542410f6c201740d4883fa017d2eeb0be9f6000000f642ff10742150ff71084889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb0a4889c34889d053ff7108488b0c24f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c852594883c408f6c1017409a8017405482bc87105ff5570ebf64883c101f6c1017410f6042401740a488d49ff48030c247105ff5570ebf148c7c0c9000000a801740ef6442420017407482b4424207105ff5570ebf44883c001f6c1017409a8017405483bc8eb05ff5570ebf67e1558a80174064883c00a7105ff5570ebf54883c420c3584883c420c34883c420c348c7c001000000c300000000000000009801000000000000|@1696,2097151,@16146|156,0,@376 166,0,I106 219,0,@376 229,0,I106 4215:D3,1088|488b0848ba1ef40dc9a37f0000488d548afcffe29090e933010000909090e9a4010000909090e9a4010000909090e9ac020000909090e9ac020000909090e9b3020000909090e9fb000000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9ab020000909090e9bd020000909090e9bd020000909090e9bd020000909090e9bd020000909090e9bd020000909090e9bd020000909090e9bd020000909090e9cf020000909090e9cf020000909090e9cf020000909090e9e1020000909090e9e1020000909090e9e1020000909090e9e1020000909090e9e1020000909090e9e1020000909090e9e102000090909048c7c007010000c34883780805750948c7c10f000000eb47488378080b750948c7c10d000000eb374883780809750948c7c10b000000eb274883780803750948c7c109000000eb174883780807740948c7c101000000eb0748c7c103000000488d0ccdf9ffffff4881e1ff010000488d49ff480348104881e1ff0100004889c8c348c7c0d1010000c3488b480848baeef50dc9a37f0000488d548afcffe29090e974000000909090e975000000909090e976000000909090e977000000909090e978000000909090e979000000909090e97a000000909090e985000000909090e98b000000909090e996000000909090e90b000000909090e9030000009090904883780815740948c7c001000000eb4848c7c003000000eb4448c7c00f000000eb4948c7c005000000eb4e48c7c009000000eb4a48c7c01f000000eb4d48c7c01b000000eb4448c7c019000000eb3b48c7c01d000000eb32e92d000000e92800000048c7c00d000000eb1fe91a00000048c7c007000000eb11e90c000000e90700000048c7c00b0000004881c0e00000004881e0ff010000c348c7c01f000000c348c7c1b1010000480b48084889c8c348c7c003010000c348c7c001010000c348c7c0a3010000c348c7c083010000c348c7c0a7010000c348c7c0ef010000c348c7c0ed010000c348c7c0ff010000c348c7c0d3010000c348c7c0d7010000c348c7c01b010000c348c7c083010000c348c7c08d010000c348c7c011010000c348c7c171010000488d49ff480348084881e1ff0100004889c8c348c7c08f010000c348c7c017010000c348c7c013010000c348c7c06d010000c348c7c021010000c348c7c01f010000c348c7c1b1000000488d49ff480348084881e1ff0100004889c8c348c7c0d1000000c348c7c0d5000000c348c7c1a1000000488d49ff480348084881e1ff0100004889c8c348c7c0e7010000c348c7c087010000c348c7c085010000c348c7c03d010000c348c7c0f3010000c348c7c051010000c348c7c00f010000c39090909000000000000000003804000000000000|@4216,7,@16147|5,0,$4215+22 469,0,$4215+486 4216:S26|5838364f5554505554434f444528292e6f70546f496e74283129 4217:D10,1216|483b65187303ff5548a8017563ff3041514152415053ff742440ff742440ff742440488b4008909090e8d2ffffff488b4c2420488b094883390374154889c248b8c0fd0dc9a37f0000488b5d089090ff13488b1424488b12f6c201752a488b1a483b5c2420750e48c7c603000000eb1ee92e040000488b5a084889da483b65187303ff5548ebd148c7c6010000004883fe01745f48837c240801745c488b542418488b12f6c20174084883fa017d29eb06f642ff10742150ff71084889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb0a4889c34889d053ff7108488b0c24f6c10174124883f9017d2feb10e986000000e97b000000f641ff10741d504889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c10148c7c0ff000000a801740ef6442418017407482b4424187105ff5570ebf44883c001f6c1017409a8017405483bc8eb05ff5570ebf67c0eeb3c50ff7108eb0650ff7108eb30498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24304889084883c438c21800488b442428488b00a80174084883f8017d24eb06f640ff10741c4889c348b810c506c9a37f000048bad0a8dc0000000000909090ff12488b0c24f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c10148c7c0c9000000a801740ef6442420017407482b4424207105ff5570ebf44883c001f6c1017409a8017405483bc8eb05ff5570ebf67f65488b442428488b00a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff12488b0c24f6c10174084883f9017d2beb06f641ff107423504889cb48b810c506c9a37f000048bad0a8dc0000000000eb05e93d000000ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c101f6c1017410f6442450017409483b4c24507f07eb6eff5570ebf2498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24304889084889c3488b442448909090ff158201000048b8e8110dc9a37f0000ff157a010000488b4c2448488b11488b124889d34883c302488b3148891e4989c04889d3eb05e9ce000000488b411090ff1552010000488b442448488b08488b094889ca4883c208488b184889134c8b70105149c7c0010000004889cb4c89f0ff152a010000488b04244883c00249c7c0010000004889c34c89f090ff1516010000488b04244883c00449c7c0010000004889c34c89f090ff1502010000584883c00649c7c0010000004889c34c89f0ff15f2000000488b442428488b004883c0f8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488b4424304889084883c408584883c428c21800488b442440488b00483b0424760c488b442440488b0c24488908498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24304889084883c438c2180048c7c001000000c218009090900000000000000000b804000000000000|@4221,2097151,@16148,@4201,@4215,@4192,@4192,@4192,@4192,@4192|65,0,@4218 192,0,@376 202,0,I106 265,0,@376 275,0,I106 467,0,@376 477,0,I106 519,0,@376 529,0,I106 661,0,@376 671,0,I106 711,0,@376 721,0,I106 856,0,@3980 4218:O4|@20055,@557,@4220,@4219 4219:O5|@3814,1227,0,1227,0 4220:S23|4c6f6e67206a756d7020696e206c6162656c206c697374 4221:S50|5838364f5554505554434f444528292e636865636b4272616e63684c697374283329636f6e766572744c6162656c73283129 4222:D4,824|483b65187303ff5548a8017563488b08488b0948833901755c488b13f6c20174084883fa017d35eb06f642ff10742d41524151415053ff7008ff7108ff304889d348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb22488b7008488b384889d04152415141505356eb0ae9a5020000e90b010000ff710857488b4c2408f6c10174084883f9017d26eb06f641ff10741e504889cb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c1014883f9097563488b442418488b00488b4c2420488b09483bc1771348b8f0010ec9a37f0000488b5d08909090ff13488b4424084883c0fe488b4c2418488901488b44242848c700010000004c8b5424304989c14c8b4424204889cb4883c410584883c420e9c4feffff4c8b5424304c8b4c24284c8b442420488b5c2418488b442410e8a6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c244889084883c438c3488b13f6c20174084883fa017d35eb06f642ff10742d41524151415053ff7008ff30ff71084889d348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb16488b7008488b384889d0415241514150535657ff7108488b0c24f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c85259f6c1017409a8017405482bc87105ff5570ebf64883c1014883f903756b488b442418488b00488b4c2420488b09483bc1745b488b442418488b00488b4c2420488b09483bc1771248b878020ec9a37f0000488b5d089090ff13488b04244883c0fe488b4c2418488901488b5c2430488b04249090ff15ba000000488b44242848c70001000000eb0ae925000000e9200000004c8b5424304989c14c8b442420488b5c24184883c410584883c420e932fdffff4c8b5424304c8b4c24284c8b442420488b5c2418488b4424109090e812fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24084889084883c438c348c7c001000000c390909090909000000000000000003003000000000000|@4232,2097151,@16151,@4231|67,0,@376 77,0,I106 156,0,@376 166,0,I106 240,0,@4223 431,0,@376 441,0,I106 507,0,@376 517,0,I106 613,0,@4226 4223:O4|@20055,@557,@4225,@4224 4224:O5|@3814,1152,0,1152,0 4225:S26|4261636b696e6720757020746f6f206661722028333262697429 4226:O4|@20055,@557,@4228,@4227 4227:O5|@3814,1138,0,1138,0 4228:S25|4261636b696e6720757020746f6f2066617220283862697429 4229:S24|5838364f5554505554434f444528292e6669787570283229 4230:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16150| 4231:D4,88|483b65187303ff5548488b4b6848baf1ffffffffffff0f488911488b5328488b12488b73284989c84889c34889d09090ff153a00000048890648c7c001000000c39090909090909000000000000000005000000000000000|@4234,95,@16152,@4233|15,0,576460752303423480 4232:S36|5838364f5554505554434f444528292e6669787570283229636865636b4c616273283129 4233:D3,144|483b65187303ff5548a801755d488b08488b09488339037556483b59087509488b4008e9d8ffffff498b10483b51087607488b4908498908ff30488b4008909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3e909000000488b4008e988ffffff48c7c001000000c300000000000000008800000000000000|@4235,79,@16153| 4234:S30|5838364f5554505554434f444528292e72656d6f76654c6162656c283229 4235:S44|5838364f5554505554434f444528292e72656d6f76654c6162656c28322972656d6f7665456e747279283129 4236:D3,536|483b65187303ff5548488b0b488b710848baffffffffffffff00482356f8488d541201488d14d5f9ffffff483bc272154889c248b8280f0dc9a37f0000488b5d089090ff134889c248d1ea480fb61416488d5412014889c74883c7024c8b034d8b500849b9ffffffffffffff004d234af84f8d4c09014e8d0ccdf9ffffff493bf972164989c148b8280f0dc9a37f0000488b5d08909090ff1348d1ef490fb63c3a488d7c3f014989c14983c1044c8b1b4d8b6b0849bcffffffffffffff004d2365f84f8d6424014e8d24e5f9ffffff4d3bcc72154989c448b8280f0dc9a37f0000488b5d089090ff1349d1e94f0fb64c0d004f8d4c09014883c006488b1b4c8b730849bcffffffffffffff004d2366f84f8d6424014e8d24e5f9ffffff493bc472134989c448b8280f0dc9a37f0000488b5d08ff1348d1e8490fb60406488d440001a801740b4881f8010100007c1aeb06f640ff107512a80174094881e8000200007105ff5570ebf25257415148c7c30102000048ba50a9dc00000000009090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf15048c7c301020000488b44241048ba50a9dc00000000009090ff12a8017412f644241801740b488d40ff48034424187105ff5570ebf05048c7c301000200488b44240848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf14883c428c300000000000000001002000000000000|@4238,2097151,@16155|18,0,36028797018963967 53,0,@3951 101,0,36028797018963967 136,0,@3951 182,0,36028797018963967 217,0,@3951 260,0,36028797018963967 295,0,@3951 374,0,I108 426,0,I108 480,0,I108 4237:S36|5838364f5554505554434f444528292e7265616c6c794669784272616e63686573283229 4238:S25|5838364f5554505554434f444528292e676574333273283229 4239:D3,672|488338077570488b480848833903741148b8a0d30dc9a37f0000488b5d0890ff13498d57d0483b55107303ff55404989d748c742f802000000488b711048897208488b790848893a4c8d421849c740f8020000004c8b4a084d8948084c8b124d89104d8b004e8d04c5f9ffffff4981e0ff010000eb05e9090000004981c881010000eb6f48833805756e488b480848833903741148b8a0d30dc9a37f0000488b5d0890ff13498d57d0483b55107303ff55404989d748c742f802000000488b711048897208488b790848893a4c8d421849c740f8020000004c8b4a084d8948084c8b124d89104d8b004e8d04c5f9ffffffeb0ae925010000e9100000004981e0ff0100004981c801010000eb6e48833803756d488b480848833903741048b8a0d30dc9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f802000000488b711048897208488b790848893a4c8d421849c740f8020000004c8b4a084d8948084c8b124d89104d8b004e8d04c5f9ffffffeb0ae99d000000e9100000004981e0ff0100004981c881000000eb6e48833801756d488b480848833903741048b8a0d30dc9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f802000000488b711048897208488b790848893a4c8d421849c740f8020000004c8b4a084d8948084c8b124d89104d8b004e8d04c5f9ffffffeb0ae915000000e9090000004981e0ff010000eb0749c7c0410000004883fb01750948c7c00b000000eb5d488b0348833803741048b8a0d30dc9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f802000000488b501048895108488b7008488931488d791848c747f8020000004c8b49084c894f084c8b114c8917488b07490bc0c390909000000000000000009802000000000000|@4240,511,@16156|18,0,@4117 150,0,@4117 287,0,@4117 423,0,@4117 567,0,@4117 4240:S22|5838364f5554505554434f444528292e736962283229 4241:D25,2200|483b65187303ff554841f6c001740b4981f801ffffff7c4eeb0741f640ff10754a41f6c001740b4981f8010100007d4feb0741f640ff10745a4883f805750948c7c00f000000eb504883f80b750948c7c00d000000eb4d4883f809751348c7c00b000000eb3ee91c020000e9170200004883f803750e48c7c009000000eb25e9030200004883f807741348c7c001000000eb11e9ef010000e90700000048c7c00300000048833b0374134889c148b8a0d30dc9a37f0000488b5d08ff1341504151ff730850ff731048c7c31f0000004c89c89090ff15d607000048c7c091000000480b0424488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15a607000048b8980f0dc9a37f0000ff159e070000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff157e07000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24084883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff150e070000488b0424488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b104883c408488b124889d34883c302488b3048891ef6c10174084883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84883c4084889d3488b48104889c8ff255106000041f6c001740b4c3b05fc0500007c4eeb0741f640ff10754a41f6c001740b4c3b05dc0500007d4feb0741f640ff10745a4883f805750948c7c00f000000eb504883f80b750948c7c00d000000eb4d4883f809751348c7c00b000000eb3ee94e030000e9490300004883f803750e48c7c009000000eb25e9350300004883f807741348c7c001000000eb11e921030000e90700000048c7c00300000048833b0374154889c148b8a0d30dc9a37f0000488b5d089090ff1341504151ff730850ff731048c7c31f0000004c89c89090ff158605000048c7c091000000480b0424488b4c24184883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff155605000048b8a80f0dc9a37f0000ff154e050000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff152e05000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c24080f761048b828d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004881c881010000480b0424488b4c24084883c408488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15be040000488b0424488b4c2408f6c101740b483b0d290400007c1eeb06f641ff107516f6c101740b483b0d0b0400007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b104883c408488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44241848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff1526030000488b4424184883c0024d89f04889c3488b4424209090ff1512030000488b4424184883c00441584889c3488b442418909090ff15fe020000488b4424104883c00641584883c4104889c3584883c408ff25e902000048c7c1030000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f41515352574c89c04989f848c7c301000000ff158e020000488b0424488060ffbf488b4c241048833903741348b8a0d30dc9a37f0000488b5d08909090ff13498d57e0483b55107303ff55404989d748c742f80300000048c7421007000000488b5c240848895a0848c70201000000498d5fc8483b5d107303ff55404989df48c743f80400000048c743180100000048c7431003000000488b71104889730848c70301000000488d7b2848c747f80100000048891fff710852565748c7c31f000000488b442438909090ff15de010000f6042401754a48837c240801750948c7c001000000eb0748c7c0090000004881c891000000488b4c2438488b11488b124889d34883c302488b3148891e4989c04889d3488b4110909090ff15960100004883c4105890ff1592010000488b4c2420488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff157201000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1358488d04c5f9ffffff4881e0ff0100004883c80b488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff1526010000498d47e8483b45107303ff55404989c748c740f802000000594883c4104889480848c70005000000415848c7c305000000ff25f70000009090909090909000000000000000007008000000000000010000000100000001000000ffffffff010000000100000001000000ffffffff|@4243,2097151,@16157,@4200,@4192,@4215,@4192,@4192,@4192,@4200,@4192,@4215,@4192,@4192,@4192,@4192,@4192,@4192,@4244,@4200,@4192,@4215,@4192,@4192,@4242|175,0,@4117 276,0,@3954 339,0,@4123 363,0,@4120 512,0,@4129 813,0,@4117 916,0,@3955 979,0,@4123 1003,0,@4120 1152,0,@4126 1206,0,I90 1245,0,I91 1261,0,@376 1276,0,I115 1295,0,@376 1305,0,I80 1336,0,I86 1348,0,I89 1380,0,I86 1392,0,I89 1424,0,I86 1436,0,I89 1463,0,I89 1712,0,@4117 2015,0,@4123 4242:D9,848|483b65187303ff5548f6c3017544498b8880000000488b09f6c10174064883c1027105ff5570ebf5498b908000000048890a488b12498d4ff0483b4d107303ff55404989cf48c741f801000000488911eb034889d94883fb05741ff6c301750948c7c201000000eb0748c7c2030000004883f2024883f202eb0748c7c201000000498b7048488b364883c602498b7848488937498b30488b364d8d4fc84c3b4d107303ff55404d89cf49c741f8030000004989411049897108498909498b4018488b00498d492048c741f802000000488941084c8909498b40184889084883fa017454498b08488b094889ca4883c210498b1848891341ff70105149c7c10f0000004989c848c7c303000000488b442408909090ff154e020000584883c00e49c7c1030000004989c048c7c30100000058ff25390200004883fb03740948c7c103000000eb0748c7c1f7fffffff6c101740b483b0def0100007c1eeb06f641ff107516f6c101740b483b0dd10100007c18eb06f641ff10751048b818d50dc9a37f0000488b5d08ff13498b10488b124889d34883c308498b3048891ef6c101741741ff7010524889c848bad0a4dc000000000090ff12eb64488b01f641ff10740348f7d8488d44000141ff7010525148ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff159e000000488b4424184883c0024d89f04889c3488b4424209090ff158a000000488b4424184883c00441584889c3488b442418909090ff1576000000488b4424104883c00641584883c4104889c358ff2565000000909090909000000000000000003803000000000000010000000100000001000000ffffffff|@4247,2097151,@16159,@4246,@4246,@4192,@4192,@4192,@4192|379,0,@4126 427,0,I90 465,0,I91 481,0,@376 496,0,I115 515,0,@376 525,0,I80 560,0,I86 572,0,I89 604,0,I86 616,0,I89 648,0,I86 660,0,I89 687,0,I89 4243:S27|5838364f5554505554434f444528292e67656e496d6d6564283429 4244:D3,304|483b65187303ff55484883fb11750848c7c001000000c34150535048c7c30102000048bad0a9dc0000000000ff124883f801743aa80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f9037412a80174094881c0000200007105ff5570ebf2a8017513488b08f640ff10740348f7d9488d4c0901eb034889c14881e1ff010000488b442410488b54240848d1ea48d1e948880c10488d4c0901488d541201488b0c24f6c10174084883f9017d11eb06f641ff10740948c7c301000000eb0748c7c3030000004883fb037413f6c10174094881e9fe0100007105ff5570ebf248c7c3010200004883c4084889c848ba90a9dc0000000000909090ff12594883c10241584889cbe9e7feffff9090909090909000000000000000002801000000000000|@4245,2097151,@16158|36,0,I110 253,0,I109 4245:S36|5838364f5554505554434f444528292e67656e496d6d65642834297365744d656d283229 4246:D4,312|483b65187303ff55484983f901750848c7c001000000c350415141505348c7c301020000488b042448bad0a9dc00000000009090ff124883f801743aa80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f9037412a80174094881c0000200007105ff5570ebf2a8017513488b08f640ff10740348f7d9488d4c0901eb034889c14881e1ff0100004989c8488b5c2408488b442418ff15a6000000488b0424a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f9037412a80174094881e8fe0100007105ff5570ebf248c7c3010200004883c40848ba90a9dc0000000000909090ff12594883c1025af6c20174064883ea027105ff5570ebf54989d14989c84889c358e9d9feffff9000000000000000003001000000000000|@4248,2097151,@16160,@4192|42,0,I110 245,0,I109 4247:S32|5838364f5554505554434f444528292e616464436f6e7374546f566563283329 4248:S27|5838364f5554505554434f444528292e7365744279746573283429 4249:D21,1704|483b65187303ff55484983380374164889c148b8a0d30dc9a37f0000488b5d08909090ff134983390374164889c148b8a0d30dc9a37f0000488b5d08909090ff1353415241ff710841ff70085041ff701041ff711048c7c31f0000004c89d090ff155a060000488b44241048833823752d488b4c2428488b11488b124889d34883c302488b3148891e49c7c0e10100004889d3488b411090ff152a06000048833c2401750948c7c001000000eb0748c7c0090000004881c891000000480b442408488b4c24284883c410488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15e2050000488b042448833823753c48b880da06c9a37f00009090ff15ce050000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ae050000eb3e48833831753848b880da06c9a37f0000ff159e050000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff157e0500005890ff157e050000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff155e05000048837c241801750748833c240b7541488b442418a801740b4881f801ffffff7c1deb06f640ff107515a801740b4881f8010100007c11eb06f640ff10750948c7c103000000eb1048c7c105000000eb0748c7c10100000048833c2409757248837c24080f761148b8a0d40dc9a37f0000488b5d0890ff134883f90774274883f90374184883f905740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000eb05e975000000480bc24883c809488b542410488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b4210ff156204000048bb98a50cc9a37f000048b8e86f0cc9a37f00009090ff154e040000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff152e040000eb5548837c24080f761148b8a0d40dc9a37f0000488b5d0890ff1348833c240f761148b828d40dc9a37f0000488b5d0890ff134883f907742c4883f903741d4883f905740948c7c001000000eb1e48c7c003000000eb15e96400000048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff010000488b542408488d14d5f9ffffff4881e2ff010000480bc2480b0424488b542410488b1a488b1b4889de4883c602488b3a4889374989ce4989c0488b42109090ff15760300004983fe03756a488b442410488b4c2418f6c101740b483b0dda0200007c1eeb06f641ff107516f6c101740b483b0dbc0200007c1feb06f641ff107517488b5010488b1848b818d50dc9a37f0000488b5d08ff13488b10488b124889d34883c308488b3048891ef6c101741fff7010eb05e988010000524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44243048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15d6010000488b4424184883c0024d89f04889c3488b4424209090ff15c2010000488b4424184883c00441584889c3488b442418909090ff15ae010000488b4424104883c00641584883c4104889c3584883c420ff25990100004983fe05756a488b442410488b4c2418f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c101740feb05e95a0000004883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c84883c420ff25d200000048c7c0010000004883c420c390909090909000000000000000009006000000000000010000000100000001000000ffffffff|@4250,2097151,@16161,@4200,@4192,@4192,@4215,@4192,@4215,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192|20,0,@4117 48,0,@4117 250,0,@544 316,0,@544 522,0,@4123 680,0,@3870 690,0,@3659 758,0,@4123 782,0,@4120 1007,0,@4126 1061,0,I90 1101,0,I91 1117,0,@376 1132,0,I115 1151,0,@376 1161,0,I80 1192,0,I86 1204,0,I89 1236,0,I86 1248,0,I89 1280,0,I86 1292,0,I89 1319,0,I89 1516,0,@4129 4250:S26|5838364f5554505554434f444528292e67656e4f704541283529 4251:D21,2264|483b65187303ff55486a016a0141f6c0017535498b084883390374154889c248b8a0d30dc9a37f0000488b5d089090ff134889e2488b71084889324889e2488b791048897a08eb154889e148c701010000004889e148c7410801000000498339077524498b49084883390374144889c248b8a0d30dc9a37f0000488b5d0890ff13488b5110eb58498339057526498b49084883390374164889c248b8a0d30dc9a37f0000488b5d08909090ff13488b5110eb5c49833903752b498b49084883390374164889c248b8a0d30dc9a37f0000488b5d08909090ff13488b5110eb3ce93700000049833901752a498b49084883390374154889c248b8a0d30dc9a37f0000488b5d089090ff13488b5110eb0ce90700000048c7c20100000049833a0374144889c148b8a0d30dc9a37f0000488b5d0890ff136a016a0141f6c001756d4883fb01750848837c24100b753ef6c301740b4881fb01ffffff7c1eeb06f643ff107516f6c301740b4881fb010100007c11eb06f643ff10750948c7c103000000eb1048c7c105000000eb0748c7c101000000498d77f0483b75107303ff55404989f748c746f801000000eb05e915000000498b3848893e4989e349890b4889e148897108eb154889e148c701010000004889e148c7410801000000534150415141ff7208505241ff721048c7c31f000000488b4424609090ff15f206000048833c2401750948c7c001000000eb0748c7c0090000004881c89100000048837c240801750948c7c101000000eb0748c7c105000000480bc1480b442450488b4c24604883c410488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff158e060000488b042448833831753a48b880da06c9a37f00009090ff157a060000488b4c2450488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff155a0600005890ff155a060000488b4c2448488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff153a06000048833c240f761048b8a0d40dc9a37f0000488b5d08ff1348837c242007742b48837c242003741a48837c242005740948c7c001000000eb1948c7c003000000eb1048c7c005000000eb0748c7c00700000048c1e0064883e83f4881e0ff01000059488d0ccdf9ffffff4881e1ff010000480bc14883c809488b4c2440488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15a2050000488b5c242058ff159e050000488b4c2438488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff157e05000048837c2410037569488b442438488b4c2408f6c101740b483b0d000500007c1eeb06f641ff107516f6c101740b483b0de20400007c21eb06f641ff107519488b5010488b1848b818d50dc9a37f0000488b5d089090ff13488b10488b124889d34883c308488b3048891ef6c101741feb05e991010000ff7010524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff15da030000488b4424184883c0024d89f04889c3488b4424209090ff15c6030000488b4424184883c00441584889c3488b442418909090ff15b2030000488b4424104883c00641584883c4104889c3584883c430594883c40851ff259703000048837c241005756a488b442438488b4c2408f6c101740b4881f901ffffff7c1eeb06f641ff107516f6c101740b4881f9010100007c22eb06f641ff10751a488b5010488b1848b898d50dc9a37f0000488b5d08909090ff13488b10488b124889d34883c302488b3048891ef6c101740feb05e9600000004883f9017d1beb06f641ff107413f6c10174094881c1000200007105ff5570ebf2f6c1017513488b19f641ff10740348f7db488d5c1b01eb034889cb4881e3ff0100004989d84889d3488b48104889c84883c430594883c40851ff25c802000048833c24017568488b442438488b4c2408f6c101740b483b0d130200007c1eeb06f641ff107516f6c101740b483b0df50100007c20eb06f641ff107518488b5010488b1848b818d50dc9a37f0000488b5d0890ff13488b10488b124889d34883c308488b3048891ef6c101741feb05e991010000ff7010524889c848bad0a4dc0000000000909090ff12eb64488b5810488b01f641ff10740348f7d8488d440001535248ba10a5dc0000000000909090ff125048bb10c506c9a37f0000488b44242048ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e901000000585048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff1526010000488b4424184883c0024d89f04889c3488b4424209090ff1512010000488b4424184883c00441584889c3488b442418909090ff15fe000000488b4424104883c00641584883c4104889c3584883c430594883c40851ff25e300000048c7c0010000004883c430c2080090909090900000000000000000b008000000000000010000000100000001000000ffffffff010000000100000001000000ffffffff|@4252,2097151,@16162,@4200,@4192,@4215,@4192,@4215,@4192,@4192,@4239,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192,@4192|33,0,@4117 114,0,@4117 156,0,@4117 200,0,@4117 249,0,@4117 294,0,@4117 630,0,@544 743,0,@4123 1017,0,@4126 1073,0,I90 1113,0,I91 1129,0,@376 1144,0,I115 1163,0,@376 1173,0,I80 1204,0,I86 1216,0,I89 1248,0,I86 1260,0,I89 1292,0,I86 1304,0,I89 1331,0,I89 1536,0,@4129 1750,0,@4126 1805,0,I90 1845,0,I91 1861,0,@376 1876,0,I115 1895,0,@376 1905,0,I80 1936,0,I86 1948,0,I89 1980,0,I86 1992,0,I89 2024,0,I86 2036,0,I89 2063,0,I89 4252:S31|5838364f5554505554434f444528292e67656e4f70496e6465786564283629 4253:D6,368|483b65187303ff5548488b4838488b09f6c1017549488b09488b0948833901751048b840ba0cc9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f802000000488b49084889480848c70005000000ff252a010000498b08488b09498b9080000000488b12498d77d0483b75107303ff55404989f748c746f80500000048bfc82e0ec9a37f000048893e4c89460848895e104889561848894e20488066ffbf488b7838488b3f40f6c7017537488b3f488b3f48833f0175144889c648b840ba0cc9a37f0000488b5d0890ff1341505350514989d24989d9488b5f08ff15a6000000eb3b488b4878488b09498d57e8483b55107303ff55404989d748c742f80200000048894a08488932488b48784889114889c148c7c00100000041505351498d47e8483b45107303ff55404989c748c740f802000000594889480848c700010000004c8b4424085b4883c408ff253d000000909090909000000000000000006801000000000000|@4269,2097151,@16165,@4242,@4255,@4242|35,0,@3942 136,0,@4254 198,0,@3942 4254:D4,72|483b65187303ff5548488b4a20488b1c2448890c244c8b52184c8b4a104c8b42084889de488b5808488b384889f856ff252b00000090909000000000000000004000000000000000|@4267,2097151,@16163,@4255| 4255:D7,1328|483b65187303ff5548498b00488b00498b4838488b0941f6c101756841f6c20174064983c2027105ff5570ebf541f6c20174064983ea027105ff5570ebf541f6c20174064983c2047105ff5570ebf541f6c20174064983c2027105ff5570ebf55141ff7048535048c7c3110000004c89d048ba50a9dc000000000090ff12a801751aeb05e97b020000488b08f640ff10740348f7d9488d4c0901eb034889c1488d49ff48030c24f644241801741348b8b8340ec9a37f0000488b5d08909090ff13488b4424184883c408488b10488b1248833a057413488b1848b828350ec9a37f0000488b5d08ff13488b720848bbffffffffffffff0048235ef8488d5c1b01488d1cddf9ffffff483bd97714488b1848b8c0350ec9a37f0000488b5d0890ff13ff305149c7c1010000004c8b4424104889cb4889f048bad0bedc0000000000ff1258482b4424284883e807a80174084883f8017d24eb06f640ff10741c4889c348b810c506c9a37f000048bad0a8dc0000000000909090ff12a801740e48bad0a4dc0000000000ff12eb604889c1488b01f641ff10740348f7d8488d4400015148ba10a5dc000000000090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2440488b442418909090ff159e020000488b4424404883c0024d89f04889c3488b4424189090ff158a020000488b4424404883c00441584889c3488b442410909090ff1576020000488b4424384883c00641584883c4084889c3584883c408909090ff155e020000eb694983f905751348b818360ec9a37f0000488b5d08909090ff134983f901756ff6c101741148b8b8340ec9a37f0000488b5d0890ff13488b01488b004883380574144889c248b828350ec9a37f0000488b5d0890ff13488b700848baffffffffffffff00482356f8eb05e9ec000000488d541201488d14d5f9ffffff483b542408771748b8c0350ec9a37f0000eb05e92d000000488b5d08ff135141ff704849c7c1010000004989d8488b5c24184889f048bad0bedc00000000009090ff12eb6bf6c101741048b8b8340ec9a37f0000488b5d08ff13488b01488b004883380574144889c248b828350ec9a37f0000488b5d0890ff13488b700848baffffffffffffff00482356f8488d541201488d14d5f9ffffff483b542408771a48b8c0350ec9a37f0000488b5d08eb05e92a000000909090ff135141ff704849c7c1030000004989d8488b5c24184889f048bad0bedc00000000009090ff12488b0424488b004883e802488b0c24488901488b094883f9017573f644240801741148b8b8340ec9a37f0000488b5d0890ff13488b442408488b08488b09488339057413488b1048b8c8ba0cc9a37f0000488b5d08ff13ff30ff710848c7c305000000488b042448ba50c0dc000000000090ff12498d47e8483b45107303ff55404989c748c740f802000000eb05e91e000000594889480848c700030000005948890148c7c0010000004883c410c2080048c7c0010000004883c410c2080090909000000000000000002805000000000000|@4268,2097151,@16164,@4192,@4192,@4192,@4192|115,0,I108 176,0,@4256 219,0,@4259 239,0,36028797018963967 274,0,@4262 312,0,I194 355,0,@376 365,0,I106 384,0,I90 419,0,I91 433,0,@376 448,0,I115 467,0,@376 477,0,I80 512,0,I86 524,0,I89 556,0,I86 568,0,I89 600,0,I86 612,0,I89 639,0,I89 780,0,@4264 810,0,@4256 842,0,@4259 863,0,36028797018963967 904,0,@4262 950,0,I194 971,0,@4256 1002,0,@4259 1023,0,36028797018963967 1057,0,@4262 1106,0,I194 1154,0,@4256 1191,0,@3945 1223,0,I200 4256:O4|@20055,@557,@4258,@4257 4257:O5|@3814,981,0,981,0 4258:S5|7363536574 4259:O4|@20055,@557,@4261,@4260 4260:O5|@3886,223,0,223,0 4261:S45|63736567507574436f6e7374616e743a206e6f7420616e20756e6c6f636b656420636f6465207365676d656e74 4262:O4|11,@42,0,@4263 4263:O5|@3886,219,0,219,0 4264:O4|@20055,@557,@4266,@4265 4265:O5|@3814,1005,0,1005,0 4266:S25|6f6e436f6d706c6574696f6e3a204e6f6e4164647241726561 4267:S43|5838364f5554505554434f444528292e636f6465436f6e73742833296f6e436f6d706c6574696f6e283129 4268:S43|5838364f5554505554434f444528292e636f6465436f6e73742833296f6e436f6d706c6574696f6e283229 4269:S28|5838364f5554505554434f444528292e636f6465436f6e7374283329 4270:D7,224|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f8020000004c89490848c701090000004152534150505148c7c31f0000004c89d0909090ff15b20000005890ff15b2000000488b4c2418488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15920000005848c1e0064883e83f4881e0ff01000059488d0ccdf9ffffff4881e1ff010000480bc1480b0424488b4c24084883c408488b114883c408488b124889d34883c302488b3148891e4989c04889d3488b4110ff25430000009090900000000000000000d800000000000000|@4271,2097151,@16166,@4200,@4215,@4192,@4192| 4271:S32|5838364f5554505554434f444528292e67656e466c6f6174696e675074283229 4272:D53,2360|483b65187303ff554848833803756fff3353ff700848c7c31f000000488b442408909090ff1526090000488b442408488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff15fe08000048b898430ec9a37f0000ff15f6080000488b4c2408488b11488b124889d34883c302eb05e95d010000488b3148891e4989c04889d3488b411090ff15ce080000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b042448c7c301000000909090ff159e08000048c7c325000000488b0424909090ff1592080000488b0424ff30488b0424488b0048c7c101000000482bc84883c1014883e1074883f901745648c7c31f000000488b44240890ff156208000048b888b20cc9a37f0000ff155a080000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff153a080000483b65187303ff5548eb8b48c7c31f0000004883c408488b0424ff152208000048b868150dc9a37f0000ff151a080000488b0c24488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15fa070000488b0424488b084883c408488b094889ca4883c202488b1848891349c7c0250000004889cb488b401090ff15d2070000eb62488338057561ff3353ff700848c7c325000000488b442408ff15ba070000488b442408ff30488b0424488b0048c7c101000000482bc84883c1014883e1074883f901746148c7c31f000000488b442410ff158a07000048b888b20cc9a37f0000eb0ae99b060000e9f4000000ff1576070000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1556070000483b65187303ff5548eb8048c7c31f0000004883c408488b442408909090ff153a07000048b868150dc9a37f0000ff1532070000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1512070000488b442408488b08488b094889ca4883c202488b1848891349c7c02b0000004889cb488b48104889c890ff15ea060000498d47e8483b45107303ff55404989c748c740f802000000594889480848c70005000000415848bbd09507c9a37f00009090ff15ba060000eb62488338017561ff3353ff700848c7c325000000488b442408ff15a2060000488b442408ff30488b0424488b0048c7c101000000482bc84883c1014883e1074883f901746148c7c31f000000488b442410ff157206000048b888b20cc9a37f0000eb0ae93b050000e9d8000000ff155e060000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff153e060000483b65187303ff5548eb8048c7c31f0000004883c408488b442408909090ff152206000048b868150dc9a37f0000ff151a060000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15fa050000488b442408488b08488b094889ca4883c202488b1848891349c7c02b0000004889cb488b48104889c890ff15d20500004c8b44240848bbd09507c9a37f0000584883c4089090ff15be050000eb64488338077563ff335348c7c325000000488b0424ff15aa050000488b0424ff30488b0424488b0048c7c101000000482bc84883c1014883e1074883f901746548c7c31f000000488b44240890ff157a05000048b888b20cc9a37f0000ff1572050000eb0ae9f5030000e9b6000000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1546050000483b65187303ff5548e97cffffff48c7c31f0000004883c408488b042490ff152a05000048b868150dc9a37f0000ff1522050000488b0c24488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff1502050000488b0424488b084883c408488b094889ca4883c202488b1848891349c7c0250000004889cb488b401090ff15da040000eb68ff335348c7c325000000488b04249090ff15ca040000488b0424ff30488b0424488b0048c7c103000000482bc84883c1014883e1074883f901745e48c7c31f000000488b44240890ff159a04000048b888b20cc9a37f0000ff1592040000488b4c2408488b11eb05e9cd020000488b124889d34883c302488b3148891e4989c04889d3488b411090ff156a040000483b65187303ff5548eb8348c7c31f0000004883c408488b0424ff155204000048b830e306c9a37f0000ff154a040000488b0c24488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff152a040000488b442408488b00a80174084883f8017d22eb06f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff12a80174064883c0087105ff5570ebf548c7c101000000f6c1017409a8017405482bc87105ff5570ebf64883c101488b0424f6c101740b483b0d310200007c1eeb06f641ff107516f6c101740b483b0d130200007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b104883c408488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d44000153525148ba10a5dc00000000009090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff1532020000488b4424184883c0024d89f04889c3488b4424209090ff151e020000488b4424184883c00441584889c3488b442418909090ff150a020000488b4424104883c00641584883c4104889c358909090ff15f6010000488b0424488b004883e0074883f805741248b8b0430ec9a37f0000488b5d089090ff1348c7c0010000004883c408c39090909090909000000000000000002009000000000000010000000100000001000000ffffffff|@4277,2097151,@16167,@4200,@4192,@4215,@4192,@4242,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4242,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4253,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4200,@4200,@4215,@4192,@4200,@4215,@4192,@4192,@4192,@4192,@4192|92,0,@4273 288,0,@3877 376,0,@4020 568,0,@3877 672,0,@4020 814,0,@1394 920,0,@3877 1024,0,@4020 1133,0,@1394 1240,0,@3877 1344,0,@4020 1528,0,@3877 1624,0,@573 1709,0,@376 1719,0,I106 1832,0,@4126 1886,0,I90 1926,0,I91 1941,0,@376 1956,0,I115 1975,0,@376 1985,0,I80 2020,0,I86 2032,0,I89 2064,0,I86 2076,0,I89 2108,0,I86 2120,0,I89 2147,0,I89 2293,0,@4274 4273:O2|20,2 4274:O4|@20055,@557,@4276,@4275 4275:O5|@3814,1821,0,1821,0 4276:S30|63616c6c46756e6374696f6e3a2063616c6c206e6f7420616c69676e6564 4277:S31|5838364f5554505554434f444528292e63616c6c46756e6374696f6e283229 4278:D21,1440|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000048c7c2010000004c89ce40f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdb48833b0374144889c648b8a0d30dc9a37f0000488b5d0890ff13498d77b0483b75107303ff55404989f748c746f802000000488b7b0848897e0848c706290000004c8d5e1849c743f80400000049c743180100000049c743100300000049c74308010000004c8b63104d89234d8d6b2849c745f8010000004d895d0041ff3241524151515241ff720853415450415056415548c7c31f0000004c89d090ff15ba040000f6042401753648c7c091000000480b442420488b4c2450488b11488b124889d34883c302488b3148891e4989c04889d3488b41109090ff15860400004883c4085890ff1582040000488b4c2440488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1562040000498d47e8483b45107303ff55404989c748c740f802000000488b4c24304889480848c700030000004c8b44244048c7c3010000009090ff152e04000048c7c3f1ffffff5848ba50a9dc0000000000ff12a80174064883e8087105ff5570ebf5a801740b483b05c00300007d08eb1bf640ff107515a801740b483b05a30300007d08eb68f640ff1075674c8b4c24384989c0488b5c241048c7c00100000090ff15ce030000498d47d8483b45107303ff55404989c748c740f801000000488b4c2410488908488d501048c742f802000000488b1c2448895a0848c70205000000ff7424384989ca4989d1eb0ae922000000e91d0000004989c048c7c30100000048b878140dc9a37f000090ff156a030000eb5e498d4fd8483b4d107303ff55404989cf48c741f801000000488b542410488911488d591048c743f802000000488b34244889730848c70305000000ff7424384989d24989d94989c84889c348b878140dc9a37f0000909090ff151203000048837c2408017455498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c740100100000048c7400801000000488b4c2408488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb0748c7c1010000005148c7c31f000000488b44244090ff15a2020000f60424017570488b0424488b084883791001750948c7c201000000eb0748c7c2110000004881ca810000004883790801750948c7c301000000eb0748c7c309000000480bd34883791801750948c7c301000000eb0748c7c305000000480bd3480b11488b5c2440488b33488b364889f74883c702eb05e9190000004c8b034989384989d0488b53104889f34889d0ff151602000048b868150dc9a37f00004883c418ff150a020000488b4c2428488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff15ea010000488b042448833803741148b8a0d30dc9a37f0000488b5d0890ff13488378080f7615488b480848b828d40dc9a37f0000488b5d0890ff1348c7c1c10100004883c408480b4808488b442420488b10488b124889d34883c302488b3048891e4989c84889d3488b48104889c8909090ff157e0100005848c7000300000048c7c3110000005848ba50a9dc0000000000ff12a80174064883c0067105ff5570ebf54889c3488b442410909090ff154a010000488b442418488b004883e0074883f805745548c7c31f000000488b442410ff152e01000048b888b20cc9a37f0000ff1526010000488b4c2410488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1506010000483b65187303ff5548eb99488b442418488b005948890158a8017524ff70084c8b442410488b5c2408488b009090ff15da00000058483b65187303ff5548ebd848c7c0010000004883c410c3909000000000000000008805000000000000010000000100000001000000ffffffff|@4283,2097151,@16168,@4200,@4192,@4215,@4192,@4242,@4241,@4251,@4251,@4200,@4192,@4215,@4192,@4192,@4200,@4200,@4215,@4192,@4279|102,0,@4117 436,0,I108 623,0,@4009 717,0,@4009 1004,0,@4020 1074,0,@4117 1102,0,@4120 1196,0,I108 1276,0,@3877 4279:D16,552|483b65187303ff5548488b4820488b09483b0d090200007414488b481848b8784d0ec9a37f0000488b5d08ff13488b701848b8e8110dc9a37f000090ff15fe010000488b0b488b094889ca4883c202488b3b4889174989de5641504989c04889cb498b4610909090ff15da010000498b06488b004889c14883c108498b1648890a5049c7c0010000004889c3498b4610ff15ba010000488b04244883c00249c7c0010000004889c3498b4610ff15a6010000488b04244883c00449c7c0010000004889c3498b4610ff1592010000584883c00649c7c0010000004889c3498b4610909090ff157e01000058488b004883c0f8498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f801000000c640ff40488908498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b0424488b004883f80174114889c34889c89090ff150a0100004889c15848890848b888b20cc9a37f000090ff15fa000000498b0e488b094889ca4883c202498b1e4889134989c04889cb498b461090ff15de00000048b888b20cc9a37f0000ff15d6000000498b0e488b094889ca4883c202498b1e4889134989c04889cb498b461090ff15ba00000048b888b20cc9a37f0000ff15b2000000498b0e488b094889ca4883c202498b1e4889134989c04889cb498b4610ff25970000009090909090909000000000000000001802000000000000f1ffffffffffff0f|@4285,8191,@16169,@4215,@4192,@4192,@4192,@4192,@4192,@4284,@4215,@4192,@4215,@4192,@4215,@4192|31,0,@4280 51,0,@3980 367,0,@3877 420,0,@3877 472,0,@3877 4280:O4|@20055,@557,@4282,@4281 4281:O5|@3814,2483,0,2483,0 4282:S7|6164644a756d70 4283:S30|5838364f5554505554434f444528292e696e646578656443617365283529 4284:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16170| 4285:S40|5838364f5554505554434f444528292e696e6465786564436173652835296164644a756d70283129 4286:D33,1608|483b65187303ff554848833803756fff730853ff700848c7c31f000000488b4424089090ff1536060000488b442408488b08488b094889ca4883c202488b1848891349c7c0910000004889cb488b48104889c890ff150e06000048b898430ec9a37f0000ff1506060000488b4c2408488b11488b124889d34883c302eb05e9cd000000488b3148891e4989c04889d3488b411090ff15de050000498d47e8483b45107303ff55404989c748c740f802000000594889480848c700050000004c8b042448c7c301000000909090ff15ae05000048c7c31f000000488b0424909090ff15a205000048b868150dc9a37f0000ff159a050000488b0c24488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff157a050000488b0424488b084883c408488b094889ca4883c202488b1848891349c7c0450000004889cb488b401090ff1552050000eb6a488338057569ff730853ff700848c7c31f000000488b442408909090ff153605000048b868150dc9a37f0000ff152e050000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff150e050000488b442408488b08488b094889caeb0ae957040000e95c0000004883c202488b1848891349c7c04b0000004889cb488b48104889c890ff15da040000498d47e8483b45107303ff55404989c748c740f802000000594889480848c70005000000415848bbd09507c9a37f00009090ff15aa040000eb6a488338017569ff730853ff700848c7c31f000000488b442408909090ff158e04000048b868150dc9a37f0000ff1586040000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff1566040000488b442408488b08488b094889caeb0ae987030000e9400000004883c202488b1848891349c7c04b0000004889cb488b48104889c890ff15320400004c8b44240848bbd09507c9a37f0000584883c4089090ff151e040000eb69488338077568ff73085348c7c31f000000488b0424909090ff150604000048b868150dc9a37f0000ff15fe030000488b0c24488b11488b124889d34883c302488b3148891e4989c04889d3488b411090ff15de030000488b0424488b084883c408488b094889caeb0ae9d4020000e9210000004883c202488b1848891349c7c0450000004889cb488b401090ff15aa030000eb65ff730853ff3348c7c31f000000488b4424089090ff159603000048b8e8110dc9a37f0000ff158e030000488b4c2408488b11488b124889d34883c302488b3148891e4989c04889d3488b4110ff156e030000488b0424488b00a801740d4883f8017d27eb0be944020000f640ff10741a4889c348b810c506c9a37f000048bad0a8dc000000000090ff12a80174064883c0087105ff5570ebf548c7c1010000004883c408f6c1017409a8017405482bc87105ff5570ebf64883c101488b0424f6c101740b483b0d0d0200007c1eeb06f641ff107516f6c101740b483b0def0100007c22eb06f641ff10751a488b5010488b1848b818d50dc9a37f0000488b5d08909090ff13488b104883c408488b124889d34883c308488b3048891ef6c1017417ff7010524889c848bad0a4dc00000000009090ff12eb64488b5810488b01f641ff10740348f7d8488d44000153525148ba10a5dc00000000009090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442420909090ff156e010000488b4424184883c0024d89f04889c3488b4424209090ff155a010000488b4424184883c00441584889c3488b442418909090ff1546010000488b4424104883c00641584883c4104889c358909090ff15320100005848c7000300000048c7c001000000c3909000000000000000003006000000000000010000000100000001000000ffffffff|@4287,2097151,@16171,@4200,@4192,@4215,@4192,@4242,@4200,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4242,@4200,@4215,@4192,@4192,@4253,@4200,@4215,@4192,@4192,@4200,@4215,@4192,@4192,@4192,@4192,@4192|92,0,@4273 232,0,@4020 372,0,@4020 526,0,@1394 580,0,@4020 701,0,@1394 756,0,@4020 900,0,@3980 989,0,@376 999,0,I106 1116,0,@4126 1170,0,I90 1210,0,I91 1225,0,@376 1240,0,I115 1259,0,@376 1269,0,I80 1304,0,I86 1316,0,I89 1348,0,I86 1360,0,I89 1392,0,I86 1404,0,I89 1431,0,I89 4287:S33|5838364f5554505554434f444528292e6a756d70546f46756e6374696f6e283229 4288:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16172| 4289:S21|434f44455f41525241592e63736567536574283329 4290:D8,736|483b65187303ff55484883f80575664983380575654d8b0941f6400801741248b8f86f07c9a37f0000488b5d089090ff13498b480848b8ffffffffffffff00482341f8488d440001488d04c5f9ffffff4883f8117510480fb651ff488d5412014883fa03741f4889c248b8405a0ec9a37f0000eb0ae946020000e941020000488b5d08ff1348c7c2010000005341515041ff70084152483b542410750948c7c001000000eb524889d0488b4c240848d1e8480fb60401488d440001488b1c24488b33488b364889f74883c7024c8b034989384989d64989c0488b43104889f390ff15120200004983c6024c89f2483b65187303ff5548eb9e4883c41858482b04244883e807a80174084883f8017d23eb06f640ff10741b4889c348b810c506c9a37f000048bad0a8dc00000000009090ff12a801740e48bad0a4dc0000000000ff12eb604889c1488b01f641ff10740348f7d8488d4400015148ba10a5dc000000000090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2418488b442428909090ff159e000000488b4424184883c0024d89f04889c3488b4424289090ff158a000000488b4424184883c00441584889c3488b442420909090ff1576000000488b4424104883c006488b4c242041584883c4104889c34889c85a4883c40852ff255800000048c7c001000000c208009090909090900000000000000000d802000000000000|@4294,2097151,@16174,@4192,@4192,@4192,@4192,@4192|33,0,@1294 55,0,36028797018963967 107,0,@4291 284,0,@376 294,0,I106 312,0,I90 347,0,I91 361,0,@376 376,0,I115 395,0,@376 405,0,I80 440,0,I86 452,0,I89 484,0,I86 496,0,I89 528,0,I86 540,0,I89 567,0,I89 4291:O4|@20055,@557,@4293,@4292 4292:O5|@3814,4038,0,4038,0 4293:S34|7075744e6f6e41646472436f6e73743a204e6f742061207265616c206e756d626572 4294:S54|5838364f5554505554434f444528292e637265617465436f64655365676d656e742833297075744e6f6e41646472436f6e7374283329 4295:D7,1064|483b65187303ff554841f6c1017568488b08488b09488b4038488b004d8b0941f6c10174064983e9027105ff5570ebf541f6c10174064983c1047105ff5570ebf541f6c10174064983c1027105ff5570ebf5534150505148c7c3110000004c89c848ba50a9dc000000000090ff12a801751a488b08eb05e96f020000f640ff10740348f7d9488d4c0901eb034889c1488d49ff48030c24f644240801741348b8b8340ec9a37f0000488b5d08909090ff134883c40858488b10488b1248833a057413488b1848b828350ec9a37f0000488b5d08ff13488b720848bbffffffffffffff0048235ef8488d5c1b01488d1cddf9ffffff483bd97714488b1848b8c0350ec9a37f0000488b5d0890ff13ff305149c7c1010000004c8b4424104889cb4889f048bad0bedc0000000000ff1258482b4424104883e807a80174084883f8017d24eb06f640ff10741c4889c348b810c506c9a37f000048bad0a8dc0000000000909090ff12a801740e48bad0a4dc0000000000ff12eb604889c1488b01f641ff10740348f7d8488d4400015148ba10a5dc000000000090ff125048bb10c506c9a37f0000488b44240848ba10abdc0000000000ff124883f80174215b48b810c506c9a37f000048ba50a2dc0000000000909090ff12eb06e905000000584883c4085048c7c33100000048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c321000000488b44240848bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100005048c7c311000000488b44241048bad0a3dc0000000000ff1248ba90a4dc0000000000ff124881e0ff0100004889c1488b44241048ba90a4dc000000000090ff124881e0ff0100004989ce4989c0488b5c2428488b442418909090ff15aa010000488b4424284883c0024d89f04889c3488b4424189090ff1596010000488b4424284883c00441584889c3488b442410909090ff1582010000488b4424204883c00641584883c4084889c3584883c410ff256d0100004983f905750848c7c001000000c34983f903756e488b4038488b00a80174134889c148b8b8340ec9a37f0000488b5d08ff13488b00488b004883380574144889c148b828350ec9a37f0000488b5d0890ff13488b500848b9ffffffffffffff0048234af8488d4c0901488d0ccdf9ffffff483bcb771848b8c0350ec9a37f0000eb05e91d000000488b5d0890ff1349c7c1030000004889d048bad0bedc0000000000ff22488b4038488b00a80174134889c148b8b8340ec9a37f0000488b5d08ff13488b00488b004883380574144889c148b828350ec9a37f0000488b5d0890ff13488b500848b9ffffffffffffff0048234af8488d4c0901488d0ccdf9ffffff483bcb771048b8c0350ec9a37f0000488b5d08ff1349c7c1010000004889d048bad0bedc0000000000ff229000000000000000002004000000000000|@4296,2097151,@16175,@4192,@4192,@4192,@4192|99,0,I108 160,0,@4256 199,0,@4259 219,0,36028797018963967 254,0,@4262 292,0,I194 335,0,@376 345,0,I106 364,0,I90 399,0,I91 413,0,@376 428,0,I115 447,0,@376 457,0,I80 492,0,I86 504,0,I89 536,0,I86 548,0,I89 580,0,I86 592,0,I89 619,0,I89 783,0,@4256 814,0,@4259 835,0,36028797018963967 867,0,@4262 901,0,I194 927,0,@4256 958,0,@4259 979,0,36028797018963967 1011,0,@4262 1037,0,I194 4296:S50|5838364f5554505554434f444528292e637265617465436f64655365676d656e74283329636f6e73744c6162656c73283429 4297:D16,2088|483b65187303ff5548488b0b498b10488b7a0848beffffffffffffff00482377f8488d743601488d34f5f9ffffff483bce72164889c648b8280f0dc9a37f0000488b5d08909090ff1348d1e9480fb60c0f488d4c0901488b334883c602488933f6c10174084883f9017d11eb06f641ff10740948c7c601000000eb0748c7c6030000004883fe0374144889ce40f6c60174064883ee7e7108ff5570ebf54889ce41515341504152505148c7c3810000004889f048ba90a9dc0000000000909090ff125048c7c311000000488b44240848bad0a9dc0000000000909090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf5488b4c24104883e1054883f901740948c7c101000000eb0748c7c1030000004883f102488b5424104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f20248833c2407755fa8017513488b08f640ff10740348f7d9488d4c0901eb034889c14881e1ff010000498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70003000000ff158a060000488b5424304883c438594883c40851ff224883f809756d488b442428488b00488b5c2420488b1b488b7b0848beffffffffffffff00482377f8488d743601488d34f5f9ffffff483bc672144889c648b8280f0dc9a37f0000488b5d0890ff1348d1e8480fb60407488d440001488b742428488b364883c6024c8b442428498930a801eb05e9df03000074084883f8017d11eb06f640ff10740948c7c601000000eb0748c7c6030000004883fe0374144889c640f6c60174064883ee7e7108ff5570ebf54889c652515048c7c3810000004889f048ba90a9dc000000000090ff12488b0c24f6c10174084883f9017d11eb06f641ff10740948c7c201000000eb0748c7c2030000004883fa037410f6c10174064883e90e7105ff5570ebf55048c7c3110000004889c848ba90a9dc0000000000ff1248c7c31100000048bad0a9dc000000000090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf55048c7c311000000488b44241048bad0a9dc00000000009090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0107105ff5570ebf548837c2428037567488b4c2450488b09488b542448488b12488b720848bbffffffffffffff0048235ef8488d5c1b01488d1cddf9ffffff483bcb72164889c348b8280f0dc9a37f0000488b5d08909090ff1348d1e9480fb60c0e488d4c0901f6c10174104881f9010100007c30eb0be965000000f641ff107523f6c10174094881e9fe0100007105ff5570ebf2f6c10174064883e9027105ff5570ebf5488b5c2450488b1b4883c302488b7c245048891f5048c7c3050000004889c848baa05f06c9a37f0000909090ff15e6030000488b54246090ff12eb3948837c24280574064883f80b752a50ff7424604c8b5424784c8b4c24504c8b442458488b5c246048c7c0010000009090ff15ae030000eb015048c7c051000000488b542460909090ff1248837c243001750748833c240b7465f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542428488950104889480848c70003000000ff1536030000488b54246090ff1248837c240809746cf6442408017518488b4c2408488b01f641ff10740348f7d8488d440001eb05488b4424084881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542420488950104889480848c70003000000ff15ce0200004889c348c7c059000000eb05e95f00000090ff15be02000048837c241001750c48b988680ec9a37f0000eb3248837c241003750c48b9a0680ec9a37f0000eb1e48837c241005740c48b9b8680ec9a37f0000eb0a48b9d0680ec9a37f00004889cb90ff1576020000488b54246090ff1248c7c0530000004883c430488b5424304883c438594883c40851ff2248833c240175554883f80b754f48c7c051000000488b54243090ff12ff7424304c8b5424484c8b4c24204c8b442428488b5c243048c7c001000000909090ff151602000048c7c053000000488b5424304883c438594883c40851ff2248833c24037565488b4c2428488b09488b5c2420488b1b488b7b0848beffffffffffffff00482377f8488d743601488d34f5f9ffffff483bce72144889c648b8280f0dc9a37f0000488b5d0890ff1348d1e9480fb60c0f488d4c0901f6c10174104881f9010100007c30eb0be965000000f641ff107523f6c10174094881e9fe0100007105ff5570ebf2f6c10174064883e9027105ff5570ebf5488b742428488b364883c6024c8b442428498930525048c7c3050000004889c848baa05f06c9a37f00009090ff153a010000488b54244090ff12eb3248833c240575295250ff7424404c8b5424584c8b4c24304c8b442438488b5c244048c7c001000000ff150a010000eb025250f60424017517488b0c24488b01f641ff10740348f7d8488d440001eb04488b04244881e0ff0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408488950104889480848c70003000000909090ff15ae0000004889c348c7c051000000ff15a600000048c7c353000000909090ff159e000000488b5424404883c4104883c438594883c40851ff229000000000000000002008000000000000|@4309,2097151,@16180,@3770,@194,@4303,@3770,@3770,@100,@100,@4303,@194,@4303,@3770,@100,@100|21,0,36028797018963967 56,0,@3951 181,0,I109 209,0,I110 483,0,36028797018963967 518,0,@3951 651,0,I109 736,0,I109 755,0,I110 842,0,I110 945,0,36028797018963967 980,0,@3951 1105,0,@193 1460,0,@4298 1480,0,@4299 1500,0,@4300 1512,0,@4301 1687,0,36028797018963967 1722,0,@3951 1846,0,@193 4298:S2|2c31 4299:S2|2c32 4300:S2|2c38 4301:S2|2c34 4302:S28|5838364f5554505554434f444528292e7072696e74436f6465283329 4303:D7,320|483b65187303ff5548488b0341525341514c89c3ff153e010000488b4c2408488b094883c108488b54240848890a4883f803755c488b0c24488b094883f901745e488b124883ea08488b4c2410488b09f6c1017556488b19488b731048833e017560488b7e08483b530875444c8b4424204989d24989c34d89c4488b5f2048c7c07b000000909090ff15d2000000eb05e96e0000004c89e24883c41859eb05e95f0000004883c40851ff22e9270000004c8b41084c89c1483b65187303ff5548eb8e488b79084889f9483b65187303ff5548e979ffffff488b4c242052505148c7c30500000048baa05f06c9a37f0000ff15720000005a4883c428594883c40851ff22488b4c24205148c7c30500000048baa05f06c9a37f00009090ff154e0000005a4883c418594883c40851ff229000000000000000003801000000000000|@4304,2097151,@16177,@4236,@100,@194,@194|232,0,@193 274,0,@193 4304:S38|5838364f5554505554434f444528292e7072696e74436f64652833297072696e743332283129 4305:D3,1048|483b65187303ff5548488b0b488b710848baffffffffffffff00482356f8488d541201488d14d5f9ffffff483bc272154889c248b8280f0dc9a37f0000488b5d089090ff134889c248d1ea480fb61416488d5412014889c74883c7024c8b034d8b500849b9ffffffffffffff004d234af84f8d4c09014e8d0ccdf9ffffff493bf972164989c148b8280f0dc9a37f0000488b5d08909090ff1348d1ef490fb63c3a488d7c3f014989c14983c1044c8b1b4d8b6b0849bcffffffffffffff004d2365f84f8d6424014e8d24e5f9ffffff4d3bcc72154989c448b8280f0dc9a37f0000488b5d089090ff1349d1e94f0fb64c0d004f8d4c09014989c44983c4064c8b33498b760848b9ffffffffffffff0048234ef8488d4c0901488d0ccdf9ffffff4c3be172144889c148b8280f0dc9a37f0000488b5d0890ff1349d1ec4e0fb624264f8d6424014889c14883c1084c8b034d8b580849baffffffffffffff004d2353f84f8d5412014e8d14d5f9ffffff493bca72154989c248b8280f0dc9a37f0000488b5d089090ff1348d1e9490fb60c0b488d4c09014989c24983c20a4c8b2b4d8b750848beffffffffffffff00492376f8488d743601488d34f5f9ffffff4c3bd672154889c648b8280f0dc9a37f0000488b5d089090ff1349d1ea4f0fb614164f8d5412014889c64883c60c4c8b034d8b680849bbffffffffffffff004d235df84f8d5c1b014e8d1cddf9ffffff493bf372154989c348b8280f0dc9a37f0000488b5d089090ff1348d1ee490fb6743500488d7436014883c00e488b1b4c8b730849bbffffffffffffff004d235ef84f8d5c1b014e8d1cddf9ffffff493bc372134989c348b8280f0dc9a37f0000488b5d08ff1348d1e8490fb60406488d440001a801740b4881f8010100007c1aeb06f640ff107512a80174094881e8000200007105ff5570ebf25257415141545141525648c7c30102000048ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf148c7c3010200004883c40848ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf14883c408c39090909000000000000000001004000000000000|@4306,2097151,@16178|18,0,36028797018963967 53,0,@3951 101,0,36028797018963967 136,0,@3951 182,0,36028797018963967 217,0,@3951 263,0,36028797018963967 298,0,@3951 342,0,36028797018963967 377,0,@3951 422,0,36028797018963967 457,0,@3951 502,0,36028797018963967 537,0,@3951 580,0,36028797018963967 615,0,@3951 700,0,I108 748,0,I108 796,0,I108 844,0,I108 892,0,I108 940,0,I108 988,0,I108 4306:S25|5838364f5554505554434f444528292e676574363473283229 4307:D3,272|483b65187303ff5548488b0b488b710848baffffffffffffff00482356f8488d541201488d14d5f9ffffff483bc272154889c248b8280f0dc9a37f0000488b5d089090ff134889c248d1ea480fb61416488d5412014883c002488b1b4c8b430848bfffffffffffffff00492378f8488d7c3f01488d3cfdf9ffffff483bc772154889c748b8280f0dc9a37f0000488b5d089090ff1348d1e8490fb60400488d440001a801740b4881f8010100007c1aeb06f640ff107512a80174094881e8000200007105ff5570ebf25248c7c30102000048ba50a9dc000000000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf14883c408c39090909000000000000000000801000000000000|@4308,2097151,@16179|18,0,36028797018963967 53,0,@3951 98,0,36028797018963967 133,0,@3951 211,0,I108 4308:S37|5838364f5554505554434f444528292e7072696e74436f6465283329676574313673283229 4309:S38|5838364f5554505554434f444528292e7072696e74436f64652833297072696e744541283129 4310:S26|47454e45524154455f434f444528292e67656e636f6465283329 4311:D12,1456|483b65187303ff55484889c74989da4c89c848ba40770ec9a37f0000ff15a605000048c7c11f0000004889c248c7c0010000004889fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f498d47d8483b45107303ff55404989c748c740f8020000004889780848c70001000000488d481848c741f801000000c641ff40488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff40415449bcf1ffffffffffff0f4d89264d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c704240100000041534d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c7030100000041544d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c704240100000041504d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c7000100000041504d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c7000100000041564d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c7060100000041544d89cc525741f6c4017543498b1424488b3a483b3d220300007521498d57f0483b55107303ff55404989d748c742f8010000004d8b24244c8922eb1941ff742408415c483b65187303ff5548ebb748c7c2010000004883fa01756948ba98c809c9a37f0000f6c201753e488b3a4c8b274c3b25cc0200007520498d7ff0483b7d107303ff55404989ff48c747f801000000488b12488917eb16ff72085a483b65187303ff5548ebbd48c7c7010000004883ff01751b4889c248b8c0cf09c9a37f0000eb05e92d000000488b5d0890ff13488b174c8b224c3b256e02000074115048b878e107c9a37f0000488b5d08ff13488b7a10eb29488b3a4c8b274c3b255002000074135048b878e107c9a37f0000488b5d089090ff13488b57104889d75041f6c101753d498b114c8b224c3b2528020000751d498d47f0483b45107303ff55404989c748c740f801000000488910eb1841ff71084159483b65187303ff5548ebbd48c7c0010000004883f801756b48b898c809c9a37f0000a8017540488b104c8b0a4c3b0dd8010000751f4d8d67f04c3b65107303ff55404d89e749c74424f80100000049891424eb194c8b60084c89e0483b65187303ff5548ebbc49c7c4010000004983fc01751948b8c0cf09c9a37f0000488b5d08eb05e92a0000009090ff13498b0424488b10483b1579010000741048b878e107c9a37f0000488b5d08ff134c8b4810eb26488b104c8b0a4c3b0d5c010000741348b878e107c9a37f0000488b5d08909090ff134c8b4a10498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c2498d8750ffffff483b45107303ff55404989c748c740f8150000004889b8a0000000488b7c24284889b898000000488b7c24484889b8900000004c898888000000488b7c24404889b880000000488b7c243848897878488b7c243048897870488b7c242048897868488b7c24184889786048895058488b54241048895050488b542408488950484c8970404c895838488958304c8968284c89502048897018488948104c894008594883c448488908c390909090900000000000000000a805000000000000|@4325,8191,@16186,@4313,@20129,@20129,@20129,@20129,@20128,@20128,@20128,@20128|20,0,@4312 416,0,576460752303423480 754,0,@2635 847,0,@2690 887,0,@1486 925,0,@1486 1031,0,@2635 1122,0,@2690 1163,0,@1486 1200,0,@1486 4312:O2|@4313,@20141 4313:D3,240|a801753b488b08488b19483b5a08751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19488b70084889f0483b65187303ff5548ebc148c7c6010000004883fe01750c48b870780ec9a37f0000eb24488b06488b08483b4a08741148b878e107c9a37f0000488b5d0890ff13488b48104889c8498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba509adc00000000004889114889c2498d47e0483b45107303ff55404989c748c740f80300000048bbc0780ec9a37f00004889184889480848895010488060ffbfc390909090900000000000000000e800000000000000|@4324,31,@16185|78,0,@4314 102,0,@1486 154,0,I48 194,0,@4316 4314:O1|@4315 4315:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@16182| 4316:D8,568|483b65187303ff5548488b4a08488b094989d24889c34889c8909090ff152e020000a801740948c7c103000000eb08488b08488d4c09016a016a0148c7c20100000048c7c301000000488d5bff4803d9483bd37551498d5fc0483b5d107303ff55404989df48c743f8030000004889431048894b0848c70301000000488d732048c746f8030000004889461048c74608010000004889164889e248891a4889e248897208eb6fa80175164889d34883c31048d1eb480fb61c18488d5c1b01eb034889c34883fb1574124883c202483b65187303ff5548e967ffffff4889d3498d77e0483b75107303ff55404989f748c746f8030000004889461048895e0848c706010000004889cb482bda4883c301498d7fe0eb05e92c000000483b7d107303ff55404989ff48c747f8030000004889471048895f084889174889e24889324889e248897a08488b4424084883780801752b488b04244c8b4010488b5808488b084889c8ff15ee0000004d8b520849890248c7c0010000004883c410c3488b0c244c8b4110488b5908488b01ff15ce0000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134152498b521090ff12488b0424488b480848ba509adc000000000048891149c7c00100000048c7c303000000488b4424109090ff155e0000004c8b4010488b5808488b084889c8ff15520000005a4883c410e9d8fdffff00000000000000003002000000000000|@4322,1048575,@16183,@100,@1349,@1349,@4317,@1349|449,0,@1294 484,0,I48 4317:D3,376|41f6c0017566f6c3017413f6c30174084883fb017d23eb06f643ff10741b488b4810488b10488b700848b8501106c9a37f0000488b5d08ff1341f600017416498b08f6c10174084883f9017d2ceb06f641ff107424488b4810488b10488b700848b8501106c9a37f0000eb05e95f000000488b5d089090ff134889da488d52ff4803d1483b50087618488b5010488b3048b8e87c0ec9a37f0000488b5d0890ff13488d5bff480318488b5010498d47e0483b45107303ff55404989c748c740f8030000004889501048894808488918c3f6c3017413f6c30174084883fb017d25eb06f643ff10741d488b4810488b5008488b3048b8501106c9a37f0000488b5d089090ff13483b5808761e488b4810488b5008488b3048b8407d0ec9a37f0000488b5d08909090ff134889d9488d49ff480308488b5008482bd34883c201488b5810498d47e0483b45107303ff55404989c748c740f8030000004889581048895008488908c3909000000000000000007001000000000000|@4323,95,@16184|43,0,@40 98,0,@40 146,0,@4318 245,0,@40 280,0,@4320 4318:O4|11,@42,0,@4319 4319:O5|@174,131,0,131,0 4320:O4|11,@42,0,@4321 4321:O5|@174,121,0,121,0 4322:S40|5072657474792e67657453696d706c655072696e7465722831297072696e7453747265616d283129 4323:S35|566563746f72536c6963654f7065726174696f6e7328292e737562736c696365283329 4324:S26|5072657474792e67657453696d706c655072696e746572283129 4325:S29|5838364f5554505554434f444528292e636f6465437265617465283429 4326:D29,2744|488dbc24f0feffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c7020100000052515341505041524151488b5c2448488b44245890ff155e0a0000488b4c2458f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0d1a0a00007c1deb06f641ff1075154889c248b820f007c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf54889c248c7c0ffffffff488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b442458488907488b4c2448f6c101753e488b19488b33483b35bb090000751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498918eb194c8b41084c89c1483b65187303ff5548ebbd49c7c0010000004983f801756a48b998c809c9a37f0000f6c101753e488b19488b33483b3569090000751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498918eb194c8b41084c89c1483b65187303ff5548ebbd49c7c0010000004983f801751848b8c0cf09c9a37f0000488b5d08eb05e92900000090ff13498b08488b19483b1d0e090000741148b878e107c9a37f0000488b5d0890ff13488b7110eb26498b08488b19483b1df0080000741348b878e107c9a37f0000488b5d08909090ff13488b71104883fe03740948c7c601000000eb0748c7c6030000004c8b4a584d8b094c8b52584d8b1241f6c20174064983c2027105ff5570ebf54c8b5a584d89134d8b134c8b62304d8b242441f6c201740b41f6c40174054d3bd4eb05ff5570ebf67e0a4d8b1b4c8b52304d891a4d8d57a84c3b55107303ff55404d89d749c742f8020000004d894a0849c7020b0000004c8b5a384d8b1b4d8d621849c74424f8010000004d890c244d8d4c241049c741f8050000004d89612049c741180100000049c741100100000049c74108030000004d89115256415357ff7248ff72384d89c84c89db488b42109090ff15f2070000488b442418a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb188a0ec9a37f0000488b44242090ff15be070000488b4424204883c408488b4c2438f6c10174084883f9017e68eb06f641ff107565ff7040ff704848c7c309000000ff15920700004883780801741048b8308a0ec9a37f0000488b5d08ff13488b442428488b4838488b0951ff7048ff703849b8008b0ec9a37f00004889cb488b50104889d0ff1556070000488b442410a801eb0ae9d1010000e9cc01000074064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb508b0ec9a37f0000488b44243890ff1516070000488b4424384883c408488b1c24488b48104889c89090ff1502070000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff15e60600004889c348b8688b0ec9a37f000090ff15da060000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba908b0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f805000000488b502048895120488b5c245048895918488b701048897110488b7808488979084c8b004c89014c8b4c24304989c8488b1c24498b4110ff153606000048837c240801746f48b8c08b0ec9a37f0000488b542410909090ff1248c7c303000000488b042448baa05f06c9a37f000090ff1506060000488b54241090ff1248b8f08b0ec9a37f0000488b542410909090ff1248c7c303000000488b44245048baa05f06c9a37f0000ff15d6050000488b542410eb05e9140000009090ff1248c7c015000000488b5424109090ff12584883c410eb0748c7c0ffffffff488b4c2448488b094883f901750948c7c101000000eb194889c64889cb48c7c001000000ff15860500004889c14889f0488b54244848890a4889c3488b442420ff15720500004889de49b8108c0ec9a37f000048bb588c0ec9a37f0000909090ff155a0500004889c34889d8ff155605000048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c8498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000048bad08c0ec9a37f00004889116a016a015350564c8b5424404c8b4c24704c8d442418488b5c2450488b44241090ff15da04000048837c241801750c48b8909adc0000000000eb6e48c7c001000000488b4c2418f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05c40300007d08eb19f640ff1075134889c148b818930ec9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9670000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24184883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f84883bc24a800000001740948c7c101000000eb0748c7c1030000004883f1024883f901740c48b9902b07c9a37f0000eb0a48b928cd06c9a37f0000488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889ca4889d948c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c0901498d4fe0483b4d107303ff55404989cf48c741f801000000488919488d711048c746f8010000004889165351ff742438ff742458ffb42490000000ffb42488000000ff742430ff742440ff742470ffb424c0000000ffb42488000000ffb424f0000000ff74247050ffb424d8000000ffb4240801000048b870930ec9a37f00005049c7c2010000004989f14989c848c7c303000000488b8424e000000048ba80930ec9a37f000090ff158a02000048833c240175144889c148b8e8dc0ec9a37f0000488b5d0890ff13f604240175684883f80175144889c148b870dd0ec9a37f0000488b5d0890ff13488b4c2450488b11488b124883fa017420498d57f0483b55107303ff55404989d748c742f801000000488b00488902eb6b6a016a016a014989e249c7c1030000004c8b442420488b184889c8eb05e966000000ff15fe010000488b8424980000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15da010000488b8c2490000000488901498d57f0483b5510730aeb05e91f000000ff55404989d748c742f801000000584883c408488902eb0748c7c201000000488b442450488b08488b094883f90175484989c0488b5c242048c7c001000000909090ff157e010000488b8c2480000000488b094883f901740b4889cb9090ff156a010000488b8c248000000048890148c7c001000000eb0748c7c001000000488b8424800000004883c450488b00488b0c24488b5130488b12488b49184883c438488b4908488b095b488b1b488b7424084889064889560848894e1048895e1848c7c001000000c22800909090900000000000000000a00a000000000000ffffffffffffff01fdffffffffffff01|@6691,2097151,@17353,@6692,@20124,@20124,@20124,@20124,@3834,@3643,@4529,@3834,@3643,@3852,@194,@100,@3834,@194,@194,@6694,@6695,@6601,@6696,@6697,@4366,@4504,@6703,@4668,@6690|165,0,@1509 349,0,@2635 439,0,@2690 478,0,@1486 516,0,@1486 814,0,@4327 895,0,@4328 930,0,@4332 1006,0,@4334 1073,0,@193 1095,0,@4335 1136,0,@4336 1154,0,@557 1175,0,@20055 1292,0,@4337 1323,0,@193 1348,0,@4338 1380,0,@193 1515,0,@4339 1525,0,@4342 1636,0,@4347 1696,0,I49 1779,0,@4361 1963,0,@884 1975,0,@440 2232,0,@4363 2271,0,@4364 2298,0,@4381 2330,0,@4384 4327:S5|696e637370 4328:O4|@20055,@557,@4330,@4329 4329:O5|@4331,3122,0,3122,0 4330:S27|72656769737465724172673a206e6f6e2d656d70747920636f6465 4331:S53|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f434f444547454e5f5441424c452e4d4c 4332:O5|@4333,1,0,0,0 4333:O3|4,@3805,0 4334:S7|70757368526567 4335:S22|7365744c69666574696d653a206e6f20656e74727920 4336:O5|@4331,482,0,482,0 4337:S26|706172616d65746572496e52656769737465723a206c6f636e3d 4338:S10|206c69666554696d653d 4339:O2|@440,@4340 4340:O2|@508,@4341 4341:O2|@1128,0 4342:O2|@884,@4343 4343:O2|@3804,@4344 4344:O2|@3819,@4345 4345:O2|@2142,@4346 4346:O2|@3820,0 4347:O1|@4348 4348:D3,1168|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1048833a017562f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48beb8b019f1a37f0000488b364889d84889f29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998910ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5808f6c30174084883fb037d13eb06f643ff10740b48b8707907c9a37f0000c3488b30f6c30174064883eb027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895f08488b5e0848891f49b8b8b019f1a37f00004d8b004889f84c89c29090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b970920ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000008804000000000000|@4360,1048575,@16187|34,0,@1326 105,0,@20033 229,0,@883 298,0,@884 339,0,@835 472,0,@833 513,0,@4349 612,0,@1326 677,0,@20033 782,0,@883 861,0,@884 902,0,@835 1035,0,@833 1076,0,@4356 4349:O5|0,0,0,@4351,@4350 4350:O2|@4354,0 4351:O2|@4352,0 4352:O2|0,@4353 4353:O5|@3867,177,177,0,0 4354:O2|3,@4355 4355:S8|417267496e526567 4356:O5|0,0,0,@4351,@4357 4357:O2|@4358,0 4358:O2|3,@4359 4359:S10|4172674f6e537461636b 4360:S17|7072696e742d6172674c6f636174696f6e 4361:O4|4,@103,0,@4362 4362:O5|@562,124,0,124,0 4363:O1|@4326 4364:O5|@4366,@5050,@5163,@5051,@4365 4365:O3|@5637,@4364,@5163 4366:D159,16632|488dbc24a8feffff483b7d187303ff55504983f803740948c7c101000000eb0748c7c1030000004883f102488b3048bf12940ec9a37f0000488d7cb7fcffe7909090e915010000909090e931020000909090e92f110000909090e9b9110000909090e999120000909090e963000000909090e9f1120000909090e917150000909090e930160000909090e993230000909090e94b260000909090e9c3260000909090e9bd270000909090e93e2c0000909090e9bd2e0000909090e98c320000909090e9da370000909090e91939000090909041504151ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004d89c24989d94c8b4018488b5808488b48104889c8488b5220ff12eb6e4150415152ff7008ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb424800000004c8b9424e80000004c8b8c24f0000000eb05e9893d00004c8b8424f80000004889d3488b40109090ff152a3f0000ffb42498000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ff742468ffb42488000000ffb424880000004c8b9424880000004989c14c8b842410010000488b9c240801000048c7c001000000909090ff159a3e0000eb5a41f6c1017559498b09488339017514488b5908f6c30174064883c3207124ff5570ebf548837910037514488b5908f6c30174064883c3107109ff5570ebf5488b5908f6c301751d488b33f643ff10740348f7de488d743601eb0de9753c0000e94a0000004889de4889f148c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c0901498d4ff0483b4d107303ff55404989cf48c741f801000000488919eb154983f80174054c89c1eb0a48b9d0d90ec9a37f000048c7c301000000488b701040f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdb4150415152415251ff7018ff7020ff7008ff70104889d848bbe0d90ec9a37f0000ff15863d00004889c35848bab09b09c9a37f0000ff157a3d000048bb78da0ec9a37f0000ff15723d00009090ff15723d00009090ff15723d00006a016a016a01f6442420017526488b4c24204889e248c702030000004889e248c74208010000004889e2488b1948895a10eb66a80174144889c148b8e81f08c9a37f0000488b5d0890ff13488b08498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848891a6a016a014889c640f6c6017555488b3e4c8b47084c3b0272034c8b024c8b4f084c3b4a08770beb05e96b0000004c8b4a08498d57e8483b55107303ff55404989d748c742f8020000004c894a084c8902488b7e084889fe483b65187303ff5548eba54889e6488b3a48893e4889e64c8b42084c894608488d74241048c70601000000488d74241041594c894e08488d74240841594c894e1050ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d800000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b842498000000488b9424c0000000e88efaffff4883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13488b8c24d0000000488b5138488b12488b5908488b1b488b7128488b36498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f08488917488b5138488b124c8b4108498910488b5158488b124c8b49284989116a016a016a015653574c8d54241849c7c10300000049c7c09fff0000488b184889c890ff15363b000048c7c39fff0000488b842400010000909090ff15263b000048837c245801740948c7c101000000eb0748c7c103000000ff30ff7008ff7424484989ca4c8b4c24104c8b442430488b5c2458488b4424609090ff15ee3a000048837c2438017506488b0c24eb1f488b7008488b78104c8b00488b5c2438488b0424ff15ce3a00004889c1eb0b488b7810488b70084c8b004883f90174114889cb4c89c09090ff15b23a00004989c0488b8424080100004883c408488b004883f801740f4889c34c89c0ff15963a00004989c0488b8424000100004c8900488b8c24080100004989f0488b5c2428488b4110ff15763a0000a801746e4150575048c7c303000000488b44244048baa05f06c9a37f0000ff155a3a00004889c348b890dc0ec9a37f000090ff154e3a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff10742041505749c7c003000000488b5c2438488b84241801000090ff15ba390000eb61498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b9424080100004150574989d0488b5c2438498b4210909090ff156639000048c7c001000000488b8c2410010000488b094883f901740c4889cb909090ff154a390000488b8c2410010000488901488b842418010000488b50184c8b4a104c8b4208488b1a488b442410909090ff1522390000488b8c2410010000488b094883f901740b4889cb9090ff150e390000488b8c2410010000488901488b8424180100004c8b50584c8b48484c8b4040488b5838488b50104889d0ff15e6380000488b8c2418010000488b512048c70203000000488b1948c70303000000498d77e0483b75107303ff55404989f748c746f80300000048c7461001000000488946085f48893e504889cb4889f09090ff159a380000488b8c2410010000488b094883f901740b4889cb9090ff1586380000488b8c2410010000488901488b442458488b542408488b5c24484883fa01750948c7c001000000eb634883fb017562498d4fd0483b4d107303ff55404989cf48c741f802000000488b1a4889590848c70139000000488d711848c746f80200000048c746080100000048890e488b8c2410010000488b094883f9017427488b7a084989c04889cb4889f0eb0ae9fa000000e939000000ff15f23700004889c64c89c0eb04488b7a08488b8c24100100004889314883c00248c7c3010000004889fa483b65187303ff5548e94bffffff488b0b483b4108751d4883c002488b4b084889cb488b5208483b65187303ff5548e925ffffff498d77d0483b75107303ff55404989f748c746f802000000488b3a48897e0848c706390000004c8d461849c740f80200000049c7400801000000498930488bb42410010000488b364883fe0174244c8b4a084989c24989db4889f34c89c0909090ff153a3700004989c04c89db4c89d0eb044c8b4a08488b8c24100100004c89014883c0024c89ca483b65187303ff5548e98ffeffffffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb424200100004c8b9424000100004c8b8c24100100004c8b8424f800000048c7c303000000488b8424f0000000488b942408010000e896f4ffff4883bc24800000000175144889c148b8e8dc0ec9a37f0000488b5d0890ff13f6842480000000017556488b8c24800000004883f80175144889c248b870dd0ec9a37f0000488b5d0890ff13488b942418010000488b1a488b1b4883fb017425498d5ff0483b5d107303ff55404989df48c743f801000000488b00488903eb68e9800000006a016a016a014989e249c7c1030000004c8b01488b184889d090ff15d2350000488b8424280100004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15ae350000488b8c2420010000488901498d5ff0483b5d10730aeb05e91f000000ff55404989df48c743f801000000584883c408488903eb0748c7c301000000f684249800000001755f488b842418010000488b08488b094883f901754b4889de4989c0488b9c24d000000048c7c001000000ff1542350000488b8c2410010000488b094883f901740b4889cb9090ff152e350000488b8c241001000048890148c7c001000000eb0a48c7c0010000004889de6a016a01488b842428010000488b4820488b094883f90174174889e148c701010000004889e148c7410801000000eb6d56ff70204c8b50584c8b48484c8b4040488b5838488b48104889c890ff15c6340000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0feb05e90e01000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1c2448895910488941084c8901488d442408488908488d44240848895008eb0156488b842428010000488b004883f8017507488b442410eb114889c3488b442410909090ff1546330000488b8c242801000048890148833c2401750948c7c001000000eb6b488b0424488b942430010000488b384889fb488b421090ff1516330000a801746d575048c7c3030000004889f848baa05f06c9a37f0000ff15fe3200004889c348b890dc0ec9a37f000090ff15f2320000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c0030000004889fb488b8424300100009090ff155a320000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b8c24300100004989d04889fb498b4110ff150e32000048c7c001000000488b8c2428010000488b094883f901740c4889cb909090ff15f2310000488b8c242801000048890148c7c001000000ffb42428010000ffb424b0000000ffb42448010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42410010000ffb42430010000ffb424280100004c8b9424c00100004c8b8c24a80000004c8b8424f0000000488b9c24b0000000488b8424000100009090ff153a3100006a016a014989e24c8b4c24404989c0488b9c2440010000488b4424189090ff151e310000488b842440010000488b4808488b542448488911488b5028488b5c245048891a488b9c2438010000488b1b4883fb017507488b5c2408eb0f488b44240890ff15e23000004889c3488b842438010000488918594881c4c0000000eb6f41504152ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000eb05e9512d00004d89ca4d89c14c8b4018488b5810488b48084889c8488b521090ff12eb6d498d4fb8483b4d107303ff55404989cf48c741f802000000488b40084889410848c70107000000488b442470488b5038488b12488d591848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890b415052ff7048ff7038eb05e9be2c00004989d84889d3488b48104889c890ff15ba2f0000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bbf0dd0ec9a37f0000488b8424880000009090ff15822f0000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908eb634150488b5808488b44247890ff15562f0000488b4c2470488b094883f9017506488b4808eb15488b304889cb488b4008ff153a2f00004889c1eb03488b30488b442470488908498d4ff0483b4d107303ff55404989cf48c741f801000000488931eb63e9e02b000041506a016a0151ff742440ffb42480000000ff742448ffb424980000004c8b9424b00000004c8b8c24b80000004c8d442428488b5810488b50084889d0909090ff15ca2e0000488b842488000000488b004883f801750c488b442410eb14e97a2b00004889c3488b44241090ff15a62e0000488b8c248800000048890148833c24017422498d47f0483b45107303ff55404989c748c740f801000000488b542408488910eb6e488b842490000000488b5c2408488b50104889d09090ff155e2e0000a80174715048c7c303000000488b44241048baa05f06c9a37f0000909090ff15422e00004889c348b890dc0ec9a37f000090ff15362e0000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e9bd2a000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2408488b842490000000ff159e2d0000eb61498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424900000004d8b48104989d0488b5c24084c89c8909090ff154a2d000048c7c001000000488b8c2488000000488b094883f901740c4889cb909090ff152e2d0000488b8c248800000048890148c7c001000000eb71415052ff7010ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000eb05e93229000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b400890e8cee9ffff4883f80175154889c148b810dc0ec9a37f0000488b5d089090ff134c8b842488000000488b18584883c408909090ff15522c0000488b4c2470488b094883f9017506488b4808eb15488b304889cb488b4008ff15362c00004889c1eb03488b30488b442470488908498d4ff0483b4d107303ff55404989cf48c741f801000000488931eb6d498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b58084889194150ff742428ffb42488000000ff742470ffb4248000000051ff35cb2b00004151524152ff70105349c7c0ffffff00488d5c2428488b8424d00000009090ff15ae2b0000eb05e90c280000488b8c24c8000000488b094883f901740c4889cb909090ff15922b0000488b8c24c8000000488901488b8424d0000000488b5018488b5a08488b1b4881cbffffff00488b720848891e488b5858488b1b488b7838488b3f4c8b40084d8b004c8b48284d8b094d8d57e04c3b55107303ff55404d89d749c742f8030000004d894a104d89420849893a488b7838488b3f4c8b580849893b488b7858488b3f4c8b602849893c24488b094883f901750c48b910de0ec9a37f0000eb1d4889df4889cb48b810de0ec9a37f000090ff15e62a00004889c14889fb488b8424c8000000488908488b8c24d0000000488b5158488b12488b7158488b3640f6c60174064883c6027105ff5570ebf5488b7958488937488b374c8b59304d8b1b40f6c601740b41f6c3017405493bf3eb05ff5570ebf67e0a488b3f488b713048893e498d77a8483b75107303ff55404989f748c746f8020000004889560848c7060b000000488b7938488b3f4c8d5e1849c743f801000000498913498d531048c742f8050000004c895a2048c742180100000048c742100100000048c74208030000004889324151415041525357ff7148ff71384989d04889fb488b4110909090ff15fe290000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb188a0ec9a37f0000488b8424000100009090ff15c6290000488b8424000100004883c408488b4858488b09f6c10174064883c1027105ff5570ebf54889cbff15a2290000488b8c24f0000000488b094883f9017506488b4810eb1a488b7008488b384889cb488b401090ff157e2900004889c1eb07488b7008488b38488b8424f0000000488908488b004883f801750c48b848de0ec9a37f0000eb144889c348b848de0ec9a37f000090ff1546290000488b8c24f0000000488901f6442448017559488b442448488b1048833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c30175184c8b03f643ff10740349f7d84f8d440001eb08e94a0000004989d84c89c148c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c0901498d4ff0483b4d107303ff55404989cf48c741f801000000488919eb1f4883bc248000000001740a488b8c2480000000eb0a48b9d0d90ec9a37f0000515657ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb42418010000ffb424180100004c8b9424c800000049c7c1010000004989c848c7c303000000488b8424b8000000488b9424d000000090e8cae4ffff48837c24100175134889c148b8e8dc0ec9a37f0000488b5d08ff13f6442410017555488b4c24104883f80175164889c248b870dd0ec9a37f0000488b5d08909090ff13488b942410010000488b1a488b1b4883fb017425498d5ff0483b5d107303ff55404989df48c743f801000000488b00488903eb68e9800000006a016a016a014989e249c7c1030000004c8b01488b184889d090ff153e270000488b8424200100004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff151a270000488b8c2418010000488901498d5ff0483b5d10730aeb05e91f000000ff55404989df48c743f801000000584883c408488903eb0748c7c301000000488b8424100100004889df488b1c24488b48104889c890ff15ca260000a801746e575048c7c303000000488b44241048baa05f06c9a37f00009090ff15ae2600004889c348b890dc0ec9a37f000090ff15a2260000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff1074205749c7c003000000488b5c2408488b842418010000909090ff150e260000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b8c2410010000574989d0488b5c2408498b411090ff15be25000048c7c001000000488b8c2410010000488b094883f901740c4889cb909090ff15a2250000488b8c2410010000488901488b5c2420488b8424180100009090ff158a250000488b8c2410010000488b094883f901740b4889cb9090ff1576250000488b8c2410010000488901f644246801755e488b842418010000488b10488b124883fa01754a4989c0488b9c24d000000048c7c0010000009090ff153e250000488b8c2410010000488b094883f901740b4889cb9090ff152a250000488b8c241001000048890148c7c001000000eb0748c7c0010000006a016a01488b842428010000488b4820488b094883f90174174889e148c701010000004889e148c7410801000000eb6fff70204c8b50584c8b48484c8b4040488b5838488b48104889c890ff15c6240000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891aeb05e906010000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b5c241048895910488941084c89014889e04889084889e048895008488b842420010000488b004883f8017507488b442408eb0f4889c3488b44240890ff154e230000488b8c242001000048890148837c241001750948c7c001000000eb6e488b442410488b942428010000488b384889fb488b4210909090ff151a230000a801746d575048c7c3030000004889f848baa05f06c9a37f0000ff15022300004889c348b890dc0ec9a37f000090ff15f6220000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c0030000004889fb488b8424280100009090ff155e220000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b8c24280100004989d04889fb498b4110ff151222000048c7c001000000488b8c2420010000488b094883f901740c4889cb909090ff15f6210000488b8c242001000048890148c7c0010000004c8b842428010000488b5c2438488b4424209090ff15d2210000488b8c2420010000488b094883f901740b4889cb9090ff15be210000488b8c2420010000488901ffb42430010000ffb4243001000051ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb42430010000ffb424300100004c8b9424e00000004c8b8c24f00000004c8b8424a000000048c7c303000000488b8424d8000000488b9424e80000009090e862ddffff48837c24280175134889c148b8e8dc0ec9a37f0000488b5d08ff13f6442428017555488b4c24284883f80175164889c248b870dd0ec9a37f0000488b5d08909090ff13488b942428010000488b1a488b1b4883fb017425498d4ff0483b4d107303ff55404989cf48c741f801000000488b00488901eb68e9800000006a016a016a014989e249c7c1030000004c8b01488b184889d090ff1586200000488b8424380100004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff1562200000488b8c2430010000488901498d4ff0483b4d10730aeb05e91f000000ff55404989cf48c741f801000000584883c408488901eb0748c7c1010000006a016a014989e24c8b4c24504989c8488b9c2438010000488b442410909090ff150a200000488b842438010000488b4808488b542458488911488b5028488b5c246048891a488b9c2430010000488b1b4883fb017507488b5c2408eb0f488b44240890ff15ce1f00004889c3488b842430010000488918594881c4b8000000eb6648837818017464488b48084150415153524152ff7010f6c1017555ff7108ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb0fe9a81a0000e906010000e962000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b94248800000049c7c10100000049c7c00300000048c7c303000000488b01488b942490000000909090e816dbffff59483b65187303ff5548e93fffffffffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a80000004c8b9424800000004c8b8c24980000004c8b8424a0000000488b9c2490000000488b442478488b9424880000009090e86adaffffeb734150524152ff7008ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000eb05e91e190000488b401090e8e6d9ffff5950f6c101756eff7108ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000eb05e93d0000004c8b94248800000049c7c10100000049c7c00300000048c7c303000000488b01488b94249000000090e83ed9ffff59483b65187303ff5548e94bffffff584883c4106a016a016a016a016a01eb684150ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b9424e00000004c8b8c24e800000048bba8de0ec9a37f0000488b4008488b52189090ff12498d4ff0483b4d10730aeb05e9df170000ff55404989cf48c741f801000000488901eb6e415048c7c303000000488b442478ff156a1c0000488b4c2470488b094883f9017506488b4008eb104889cb488b4008909090ff154e1c0000488b4c2470488901488b094883f901750948c7c001000000eb124889cb48c7c0010000009090ff152a1c0000488b4c2470488901eb05e94c170000488b442478488b5038488b1252ff7048ff703849b838df0ec9a37f00004889d3488b70104889f0ff15f61b0000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb508b0ec9a37f0000488b8424880000009090ff15be1b0000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908eb734983fa017517488b580848b888df0ec9a37f0000488b5d08909090ff13498b1a415051ff33ff7308ff7310ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000eb05e942160000ffb42490000000ffb42490000000ffb424900000004c8b9424000100004c8b8c24080100004989d0488b5c2468488b4008909090ff15f21a00004c8b8c24900000004c8b842498000000488b1c249090ff15de1a00005950f6c1017563488b0148833803755f488b942498000000488b5a18ff7108ff7008ff72484c8b4b104c8b4308488b334889f3488b4424089090ff15a61a000048833c2401744750488b44241090ff159a1a00004889c348b810e00ec9a37f000090ff158e1a0000eb0ae968000000e95100000049c7c0010000004889c3488b8424b8000000ff15721a0000eb0150488b8424b0000000488b004883f8017506488b0424eb0e4889c3488b042490ff15521a0000488b8c24b00000004883c418488901eb03ff710859483b65187303ff5548e92bffffff58a801756e488b8c2490000000488b78084c8b004c89c3488b4110ff15161a0000a80174715741505048c7c3030000004c89c048baa05f06c9a37f00009090ff15fa1900004889c348b890dc0ec9a37f000090ff15ee190000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e91b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff107420574c89c049c7c0030000004889c3488b8424980000009090ff1552190000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b942490000000574d89c34989d04c89db498b4210ff150219000048c7c001000000488b8c2490000000488b094883f901740c4889cb909090ff15e6180000488b8c249000000048890158483b65187303ff5548e96efeffff48c7c0010000005aff12488b842488000000488b482048c70103000000488b1424488b1a488b1bf6c30174064883c3027105ff5570ebf5488b3248891e498d5fd0483b5d107303ff55404989df48c743f8020000004889530848c7037d000000488d7b1848c747f80200000048c747080100000048891f4889f84883c4089090ff154e180000488b4c2478488b094883f901740a4889cb90ff153e180000488b4c247848890148833c2401746b488b842480000000488b5038488b1252ff7048ff703849b830e00ec9a37f00004889d3488b70104889f090ff1506180000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742949c7c00100000048bbf0dd0ec9a37f0000488b842490000000eb05e92b000000909090ff15c6170000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908eb5a48c7c001000000eb56488b4c2470488b5908488b1b488b7128488b36488b7938488b3f4c8b590849893b488b7958488b3f4c8b612849893c24488b781048833f0d75514c8b6f0849837d0005754641f6c00175404d8d77d8eb0ae9d7110000e9d21100004c3b75107303ff55404d89f749c746f8020000004d8946084d8b5d084d891e498d4e1848c741f8010000004c8931eb0748c7c101000000488b7808415041515241525653ff70105140f6c701756e488b442428ff7708ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a80000004c8b9424100100004c8b8c2418010000eb05e9280000004c8b842420010000488b5c2468488b4808488b074889caff125f483b65187303ff5548e95fffffff48c7c001000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b80000004c8b9424980000004c8b8c24a80000004c8b8424b000000048c7c303000000488b842480000000488b9424a000000090e82ad1ffff488b8c24b00000004883c410488b5108488b1250ff7138488b0424488b00f6c2017507a8017503ff5570483bd0750948c7c001000000eb3b488b8424b00000004889d74889fb488b48104889c890ff156615000040f6c70174064883c7027105ff5570ebf54889fa483b65187303ff5548eba4488b8424b00000004883c408488b4808488b542408488911488b5028488b5c241048891a5b4883c428eb6f4150ff742450ff35181500005251ff700849c7c20100000049c7c1010000004c8d44241848c7c3ffffff00488b8424a000000048ba78e00ec9a37f0000909090ff15e6140000488b8c2498000000488b094883f901740b4889cb9090ff15d2140000488b8c2498000000488901eb05e92d0f0000ffb424a8000000ffb424a800000051ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a800000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b442478488b94248800000090e886cfffff4883f80175154889c148b810dc0ec9a37f0000488b5d089090ff136a016a016a014989e249c7c10300000049c7c003000000488b18488b8424b800000090ff15f213000048837c241001750c48b8602f0fc9a37f0000eb18488b5c241048b8602f0fc9a37f0000909090ff15ce130000488b8c24b00000004883c408488b094883f901740b4889cb9090ff15b6130000488b8c24a8000000488901488b8424b0000000488b1c24488b50104889d0ff159a130000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff157e1300004889c348b890dc0ec9a37f000090ff1572130000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b8424b000000090ff15e2120000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424b00000004d8b48104989d0488b1c244c89c8ff159212000048c7c001000000488b8c24a80000004883c418488b094883f901740c4889cb909090ff1572120000488b8c2490000000488901488b842498000000488b502048c70203000000488b1848c7030300000048833c2401746f488b7038488b3656ff7048ff703849b830e00ec9a37f00004889f3488b50104889d090ff1522120000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bbf0dd0ec9a37f0000488b8424a80000009090ff15ea110000498d47f0eb05e91e000000483b45107303ff55404989c748c740f8010000004883c40859488908eb6b48c7c6010000004889f0eb64415052ff7010ff7008ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000eb0ae95f0b0000e95a0b0000ffb42498000000ffb42498000000ffb4249800000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b4018e812ccffff4883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13488b0c2448833923756dff30ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42480000000eb05e92f000000ff7424784c8b9424200100004c8b8c249800000049c7c00100000048c7c301000000488b410890ff1556100000eb6dff30ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000eb05e96001000049c7c20100000049c7c10100000049c7c00100000048c7c3030000004889c8488b942490000000e8aecaffff4883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13488b4c241048c7c2ffffffff48c7c301000000ff30ff31483b1c2473704889d84883c002488b4c24206a016a01525053ff71084c8d44242048c7c311000000488b44240848ba50a8dc000000000090ff12488b4424205948d1e8480fb60401488d440001488b4c242048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01eb05e94d000000488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017507488b442410eb04488b04244883c4085b4883c4184889c2483b65187303ff5548e938ffffffff742408ffb424a8000000ff7424204c8b9424c00000004989d14c8b44243848c7c30100000048c7c001000000909090ff158e0e00004883c410488b842498000000488b1c24488b48104889c8909090ff15760e0000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff155a0e00004889c348b890dc0ec9a37f000090ff154e0e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b84249800000090ff15be0d0000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424980000004d8b48104989d0488b1c244c89c8ff156e0d000048c7c001000000488b8c24900000004883c420488b094883f901740c4889cb909090ff154e0d0000488b4c247048890148833c24037467488b442478488b5038488b1252ff7048ff703849b830e00ec9a37f00004889d3488b70104889f0ff151a0d0000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742949c7c00100000048bbf0dd0ec9a37f0000488b842488000000eb05e92b000000909090ff15da0c0000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908eb6c48c7c001000000eb68498d8f58ffffff483b4d107303ff55404989cf48c741f80200000048c7410803000000488b5810488919488d711848c746f80300000048c7461001000000488b780848897e0848c706070000004c8d5e2049c743f80200000049c7430803000000eb0ae9fd050000e9f8050000498933498d731848c746f80200000048c74608010000004c891e4c8d5e1849c743f8020000004989730849890b498d4b1848c741f80400000048c741180300000048be08a60bc9a37f0000488971104c89590848c7010b000000415052ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb4248800000048c7c3030000004889c8909090e81ac6ffffeb6e48c7c101000000488b5808f6c301751ff6c10174064883c1027105ff5570ebf5488b5b08483b65187303ff5548ebdc4883f9017514488b580848b8882f0fc9a37f0000488b5d08ff13415051ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff742470eb05e9a7040000ff742470ff742470ff742470ff7424704c8b9424d80000004c8b8c24e00000004c8b8424e80000004889d3488b40089090ff15c60a000050488b9c248800000090ff15be0a00004889c1f6c1017524488b1148833a05750948c7c303000000eb19488b51084889d1483b65187303ff5548ebd748c7c3010000004883fb01746f6a016a01ff742458ff742420ff7424304c8b5424784c8b8c24b00000004c8d44241848c7c301000000488b442428909090ff15560a0000488b842490000000488b004883f8017507488b442408eb104889c3488b4424089090ff15360a0000488b8c2490000000488901488b09eb05e9540000004883f901750c48b808300fc9a37f0000eb154889cb48b808300fc9a37f00009090ff15020a0000488b8c2490000000488901498d47f0483b45107303ff55404989c748c740f8010000005a4883c408488910eb6d498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b542408488911f6c20175154889c348b8b8f309c9a37f0000488b5d089090ff134883fa017409483b150205000072154889c348b8901609c9a37f0000488b5d089090ff134889cb4889d14889c2eb05e9e902000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000005753f6c20175274c8b52084c8b0c244c8b4424084889c3488b02ff150e0900004c89d2483b65187303ff5548ebd4488b4424104883c408a801756f488b8c2490000000488b78084c8b004c89c3488b411090ff15de080000a80174715741505048c7c3030000004c89c048baa05f06c9a37f00009090ff15c20800004889c348b890dc0ec9a37f000090ff15b6080000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e91b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff107420574c89c049c7c0030000004889c3488b8424980000009090ff151a080000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b942490000000574d89c34989d04c89db498b4210ff15ca07000048c7c001000000488b8c2490000000488b094883f901740c4889cb909090ff15ae070000488b8c249000000048890158483b65187303ff5548e96dfeffff48c7c001000000498d47b8483b45107303ff55404989c748c740f802000000594889480848c70007000000488b8c2488000000488b5138488b12488d581848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890352ff7148ff71384989d84889d3488b41109090ff151a070000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bbf0dd0ec9a37f0000488b8424980000009090ff15e2060000498d47f0483b45107303ff55404989c748c740f8010000004883c408594889084883c4084883c4086a016a016a016a014889c34883c4204889d86a014883c4084889c14889c86a016a016a016a016a014889c14883c4284889c86a016a016a014889c14883c4184889c84889c14889c86a016a016a014883c418a801755e48833c2403755c488b4c2478488b384889fb488b41109090ff154e060000a8017472575048c7c3030000004889f848baa05f06c9a37f0000ff15360600004889c348b890dc0ec9a37f000090ff152a060000498d4fd8483b4d10730feb0ae9f8000000e9ec000000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f20eb06f641ff10741849c7c0030000004889fb488b44247890ff1592050000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c24784989d04889fb498b4110909090ff154605000048c7c0010000004883c408c278004883c408c2780048833c2403741348b820300fc9a37f0000488b5d08909090ff1348c7c0010000004883c408c27800900000000000000000e840000000000000ffffffffffffff01|@4498,2097151,@16232,@4499,@4574,@1354,@2561,@1459,@4638,@4639,@4504,@4529,@4641,@4649,@4650,@4651,@3852,@194,@100,@4422,@3834,@4652,@4428,@4653,@4594,@4654,@4664,@4665,@4666,@4504,@4667,@4668,@4672,@4594,@4673,@3852,@194,@100,@4422,@3834,@4674,@4675,@4686,@4767,@3834,@3643,@4768,@4776,@4777,@4783,@3852,@194,@100,@4422,@3834,@4784,@4785,@4793,@4794,@4800,@4808,@4809,@3834,@3643,@4810,@4853,@4854,@4504,@4855,@3852,@194,@100,@4422,@3834,@4856,@4857,@4862,@4668,@4863,@4594,@4864,@3852,@194,@100,@4422,@3834,@4865,@4866,@4888,@4504,@4889,@4686,@4890,@4529,@4891,@4892,@3834,@3643,@4893,@4897,@4428,@3770,@100,@3643,@4904,@3852,@194,@100,@4422,@3834,@4905,@4906,@4909,@3834,@3643,@3852,@4910,@4406,@4912,@4504,@4913,@4914,@3852,@194,@100,@4422,@3834,@4915,@3834,@3643,@4916,@5020,@3852,@194,@100,@4422,@3834,@5025,@3834,@3643,@5026,@5032,@5033,@5041,@5042,@5043,@3852,@194,@100,@4422,@3834,@4497,@3834,@3643,@3852,@194,@100,@4422,@3834|48,0,$4366+66 827,0,@4367 908,0,@4368 928,0,@2560 944,0,@4371 1034,0,@1625 1405,0,@4376 1816,0,@193 1835,0,@4379 1876,0,@4380 1894,0,@557 1915,0,@20055 2938,0,@4381 2982,0,@4384 3451,0,576460752303423480 3852,0,@193 3871,0,@4379 3919,0,@4380 3937,0,@557 3958,0,@20055 4806,0,@4387 5181,0,@193 5203,0,@4379 5251,0,@4380 5269,0,@557 5290,0,@20055 5693,0,@4376 6105,0,@4388 6123,0,@4388 6418,0,@4327 6564,0,@4390 6579,0,@4390 6803,0,@4367 6979,0,@4381 7016,0,@4384 7274,0,@193 7295,0,@4379 7336,0,@4380 7354,0,@557 7375,0,@20055 7915,0,576460752303423480 8312,0,@193 8331,0,@4379 8379,0,@4380 8397,0,@557 8418,0,@20055 8875,0,@4381 8912,0,@4384 10026,0,@4393 10218,0,@4396 10282,0,@4334 10352,0,@4398 10635,0,@4401 10814,0,@193 10835,0,@4379 10883,0,@4380 10901,0,@557 10922,0,@20055 11361,0,@4402 11426,0,@4387 12201,0,@4404 12421,0,@4376 12488,0,@4488 12505,0,@4488 12609,0,@193 12631,0,@4379 12672,0,@4380 12690,0,@557 12711,0,@20055 12989,0,@4402 13054,0,@4387 13305,0,@4376 13661,0,@4376 13747,0,I104 14005,0,@193 14027,0,@4379 14068,0,@4380 14086,0,@557 14107,0,@20055 14358,0,@4402 14422,0,@4387 14673,0,@3460 14883,0,@4490 15191,0,@4493 15206,0,@4493 15313,0,@2708 15349,0,@2212 15550,0,@193 15571,0,@4379 15619,0,@4380 15637,0,@557 15658,0,@20055 16070,0,@4387 16268,0,@193 16287,0,@4379 16340,0,@4380 16358,0,@557 16379,0,@20055 16576,0,@4494 4367:O1|32719 4368:O1|@4369 4369:D3,24|c39090909090909000000000000000001000000000000000|@4370,1,@16188| 4370:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6f7264657265642d283129 4371:O1|@4372 4372:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baf8da0ec9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4375,7,@16190|29,0,@4373 4373:D3,104|488b4a08488b19488b30488b7b08483b7e08752d4c8b410841f6c001740ef640080174084c3b40087e0feb05ff5570ebf348c7c001000000c348c7c003000000c3483b7e08720848c7c001000000c348c7c003000000c39000000000000000006000000000000000|@4374,127,@16189| 4374:S51|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6571283129283129 4375:S48|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6571283129 4376:O4|@20055,@557,@4378,@4377 4377:O5|@3867,1082,0,1082,0 4378:S21|67656e546f537461636b3a206e6f20726573756c74 4379:S23|696e6372557365436f756e743a206e6f20656e74727920 4380:O5|@4331,464,0,464,0 4381:O4|@20055,@557,@4383,@4382 4382:O5|@3867,1150,0,1150,0 4383:S29|67656e546f52656769737465723a206e6f742061207265676973746572 4384:O4|@20055,@557,@4386,@4385 4385:O5|@3867,1149,0,1149,0 4386:S24|67656e546f52656769737465723a206e6f20726573756c74 4387:S9|70757368436f6e7374 4388:O2|@4389,0 4389:O3|44,@3807,8 4390:O2|@4391,0 4391:O3|58,@4392,@3806 4392:O4|0,@3807,@3659,8 4393:O1|@4394 4394:D3,24|48c7c001000000c300000000000000001000000000000000|@4395,1,@16191| 4395:S45|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d283129 4396:O5|@4397,1,0,0,0 4397:O3|4,@3900,0 4398:O4|@20055,@557,@4400,@4399 4399:O5|@3867,549,0,549,0 4400:S27|4e6f20426567696e4c6f6f7020666f72204c6f6f7020696e737472 4401:S15|756e6c6f636b52656769737465723a 4402:O5|@4403,1,0,0,0 4403:O2|3,0 4404:O2|@4406,@4405 4405:O2|@4465,@4464 4406:D9,264|483b65187303ff55484989c34989dc4d89cd4d89d65241504d89d94d8b433848c7c30100000048c7c001000000909090ff15ea0000004153415441ff7348415541ff733841ff733041ff735841ff7318415648bb08e20ec9a37f0000ff15c6000000488b4c2450ff3424ff742410ff742420ff742430ff742440ff742460ff7424584c8b51084c8b8c24800000004c8b44247848c7c3010000009090ff158e00000048837c243001744250488b44244048ba58470cc9a37f00009090ff15760000004889c348b888e30ec9a37f000090ff156a0000004c8b04244889c3488b4424489090ff155e000000eb0150584883c458c3909090909000000000000000000001000000000000|@4417,2097151,@16194,@4418,@1459,@4413,@3810,@100,@3643|84,0,@4407 178,0,@3645 199,0,@4412 4407:O1|@4408 4408:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba88e20ec9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4411,7,@16193|29,0,@4409 4409:D3,96|488b520848833801750848c7c003000000c348833a01750848c7c001000000c3488b12f6c201740cf600017407483b107e0feb05ff5570ebf448c7c001000000c348c7c003000000c39090909090909000000000000000005800000000000000|@4410,5,@16192| 4410:S41|434f444547454e5f5441424c4528292e707573685265676973746572732835296c6571283129283129 4411:S38|434f444547454e5f5441424c4528292e707573685265676973746572732835296c6571283129 4412:S13|70757368526567697374657273 4413:D17,2360|488dbc2450ffffff483b7d187303ff5550a8017560488b08488b78084989db4c8b61084c89e3498b40109090ff151e090000a801755a488b084883390975564152415141505741534154ff7018ff7008ff7010ff7108ff70204c89e04c89ca90ff124883f801751248c7c0010000004883c430eb67e9a2080000488b442408488338017520488b4808f6c1017412eb0ae9fd070000e9060400004883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017518488b11f641ff10740348f7da488d541201eb08e9c10700004889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c090148235424684883fa0174064883fa01750948c7c001000000eb6448837c241801752349c7c001000000488b5c2428488b442440909090ff150e08000048c7c001000000eb6548837c2460017562ffb42490000000ff742418ffb42498000000ffb42498000000ff742438ff742448ff742458ffb424b00000004989c2eb05e9090300004c8b4c24404c8b842480000000488b9c249000000048c7c001000000909090ff15aa070000eb5fe9dd02000048c7c1ffffffff48334c24684883c10148234c24104883f90174664883f901746548c7c1ffffffff48334c24684883c10148234c241048c7c20100000048c7c3030000004883fa2f751a48b878ed0ec9a37f0000488b5d08eb05e97e020000909090ff134889de4823f14883fe0175204883c202488d5c1bff483b6518730feb0ae9f1000000e9ec000000ff5548ebb4f6c20174084883fa017d24eb06f642ff10741c4889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb034889d0ff750848b976e60ec9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13ff742410ff742430ff742428ff742438ff7424204c8b9424b00000004c8b4c24304c8b442468488b9c249800000090ff1536060000eb6a488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760eeb05e9f700000048c7c17f00000048d1e948d3e24883ca01488d4c09014881e20100fe004883fa0174064883fa01750948c7c19fff0000eb0748c7c10100fe0048c7c2ffffffff48335424684883c2014823ca4889cb488b8424880000009090ff156e0500004883f8017558ffb42490000000ff742418ffb42498000000ffb42498000000ff742438ff742448ff742458ffb424b00000004c8b5424484c8b4c24404c8b842480000000488b9c249000000048c7c001000000909090ff151a050000eb3aff742410ff742430ff742428ff742438ff7424204c8b9424b00000004c8b4c24304c8b442468488b9c2498000000488b00909090ff15e60400004883c430eb644883390575634883780801742d4152415141505741534154ff7018ff7008ff7010ff7020ff7110ff71084c89e04c89caff124883f801741feb344152415141505741534154ff7018ff7008ff7010ff7020ff7110ff710848c7c0010000004883c438eb5fe999030000e972030000488b0424488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017518488b11f641ff10740348f7da488d541201eb08e93a0300004889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c090148235424704883fa0174064883fa01750948c7c001000000eb6448837c242001752049c7c001000000488b5c2430488b442448ff15ba03000048c7c001000000eb6548837c246801756250ff742410ffb424a0000000ffb424b0000000ffb424a8000000ff742448ff742458ff742468ffb424c00000004c8b542460eb05e9620200004c8b4c24584c8b842490000000488b9c24a000000048c7c001000000ff1556030000eb5fe93902000048c7c1ffffffff48334c24704883c10148234c24184883f90174664883f901746548c7c1ffffffff48334c24704883c10148234c241848c7c20100000048c7c3030000004883fa2f751a48b878ed0ec9a37f0000488b5d08eb05e9da010000909090ff134889de4823f14883fe0175204883c202488d5c1bff483b6518730feb0ae9ed000000e9e8000000ff5548ebb4f6c20174084883fa017d24eb06f642ff10741c4889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb034889d0ff750848b9faea0ec9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13ff742420ff742430ff742420ff742460ff7424504c8b5424304c8b4c24404c8b8424b8000000488b5c2428ff15e6010000eb6b48c7c1ffffffff48334c24704883c1014881e19fff00004889cb488b8424900000009090ff15c20100004883f8017560ff3424ff742410ffb424a0000000ffb424b0000000ffb424a8000000ff742448ff742458ff742468ffb424c00000004c8b5424604c8b4c2458eb05e9560000004c8b842490000000488b9c24a000000048c7c00100000090ff1566010000eb36ff742420ff742430ff742420ff742460ff7424504c8b5424304c8b4c24404c8b8424b8000000488b5c2428488b009090ff15360100004883c438eb2248c7c001000000415241514150574153eb1048c7c00100000041524151415057415348833c2401740d488b1c24909090ff1502010000488b4c24604883c408488b542450488b5c2448488b742440488b7c24384c8b4424304c8b4c242848894c2458488954245048895c2448488974244048897c24384c894424304c894c24284c8b5424184c8b4c24104c8b4424084889c3584883c418e9e4f6ffff4889d8c2380090909090909000000000000000003009000000000000|@4421,2097151,@16196,@3852,@4422,@4436,@4440,@4452,@4436,@4440,@4422,@4454,@4459,@4452,@4454,@4459,@4420|521,0,@4414 613,0,@376 623,0,I106 644,0,$4413+718 672,0,@560 691,0,@3809 742,0,@3811 1677,0,@4414 1769,0,@376 1779,0,I106 1800,0,$4413+1874 1828,0,@560 1847,0,@3809 1898,0,@3811 4414:O4|@20055,@557,@4416,@4415 4415:O5|@3814,599,0,599,0 4416:S12|6f6e654f663a20656d707479 4417:S32|434f444547454e5f5441424c4528292e70757368526567697374657273283529 4418:D4,328|483b65187303ff5548498b08a801740af6c1017405483bc1eb05ff5570ebf67c044889d8c34889df4989c24c89d3498b41109090ff1526010000a801755d488b084883390975594c89d2f6c20174064883c2027105ff5570ebf5498d5fd0483b5d107303ff55404989df48c743f8020000004c895308488b70184889334c8d531849c742f80200000049897a0849891a4c89d34889d0e965ffffffe9760000004883390575544c89d2f6c20174064883c2027105ff5570ebf5498d5fd0483b5d107303ff55404989df48c743f8020000004c895308488b70184889334c8d531849c742f80200000049897a0849891a4c89d34889d0e906ffffff41f6c20174064983c2027105ff5570ebf54889fb4c89d0e9eafeffff41f6c20174064983c2027105ff5570ebf54889fb4c89d0e9cefeffff90909090909000000000000000004001000000000000|@4419,511,@16195,@3852| 4419:S44|434f444547454e5f5441424c4528292e70757368526567697374657273283529656e756d6572617465283229 4420:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16225| 4421:S46|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e7472696573283229 4422:D23,1528|483b65187303ff55484889c74989d94c89cb488b47109090ff15f2050000a80175516a016a0148837810017407488378100175174889e148c701010000004889e148c7410801000000eb624983f801742d488b084883390b751e488b5108f6c20174084883fa017f15eb4df642ff10740deb45e96405000048833909753a57ff30ff77184151ff7018488b5810488b4424109090ff157e050000488d4c242848c70101000000488d4c2428eb05e92700000048894108eb2c4889e2488b581048891a4889e248c74208010000005751ff77184151ff7018eb0b57ff30ff77184151ff701848837c242801740848837c2428017564488b44242049c7c001000000488b5c2408488b48104889c8ff150e050000488b44241848833803755f488b480848c7c201000000ff7010f6c1017563488b442428488b79084989d04c8b094c89cb488b48104889c8909090ff15d60400004883f801eb05e91f040000746b488b4424284c89cb488b48104889c89090ff15ba040000a8017455eb05e91d03000057415041515048c7c3030000004c89c8eb05e95201000048baa05f06c9a37f00009090ff158e0400004889c348b890dc0ec9a37f000090ff1582040000498d4fd8483b4d10730feb0ae908010000e945000000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c57415049c7c0030000004c89cb488b442438909090e8a6fdffffeb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a4c8b5c24285741504989d04c89cb498b4310ff159a03000048c7c00100000048833c240175054989c0eb10488b1c24909090ff15820300004989c04883c408eb01574c89c259483b65187303ff5548e941feffff4889d059f6c1017564488b542420488b79084989c04c8b094c89cb488b4210909090ff15460300004883f8017468488b4424204c89cb488b48104889c890ff1532030000a801746f57415041515048c7c3030000004c89c848baa05f06c9a37f0000ff15160300004889c3eb05e98f01000048b890dc0ec9a37f00009090ff1502030000498d4fd8483b4d107303ff55404989cfeb05e90601000048c741f80400000048bab8dc0ec9a37f00004889511848894110eb05e92700000048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c57415049c7c0030000004c89cb488b442430909090e8f2fbffffeb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a4c8b5c24205741504989d04c89cb498b4310ff151602000048c7c00100000048833c240175054989c0eb10488b1c24909090ff15fe0100004989c04883c408eb01574c89c059483b65187303ff5548e950feffff48833805751c488b4c24104c8b49104c8b4108488b19488b4008ff15ca010000eb2b48833809751e488b4c24104c8b49104c8b4108488b19488b40089090ff15ae010000eb0748c7c00100000050488b442428488b4838488b09f6c10174064883e9027105ff5570ebf5488b5008488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c344889cf4c8b40384889fb488b48104889c89090ff155a010000a801750948c7c001000000eb15498938483b65187303ff5548eb9348c7c00100000048833c240175064883c43858c3488b1c244883c43858ff2524010000498d47d0483b45107303ff55404989c748c740f80500000048c7402001000000488b0c2448894818488b4c24284889481048c7400801000000488b4c2418488908488b4c24204989c0488b5c2408488b41109090ff15d20000004883c43058c348c7c001000000c3909090900000000000000000f005000000000000|@4424,2097151,@16197,@3852,@4425,@3834,@3852,@3852,@194,@100,@3834,@4434,@3852,@3852,@194,@100,@3834,@4435,@4428,@4428,@3852,@4423,@3834|410,0,@193 431,0,@4379 484,0,@4380 502,0,@557 516,0,@20055 836,0,@193 862,0,@4379 911,0,@4380 936,0,@557 950,0,@20055 4423:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16204| 4424:S30|434f444547454e5f5441424c4528292e72656d6f7665456e747279283329 4425:D5,392|483b65187303ff554848c7c10100000048c7c20300000048c7c60100000050534883f92f74684889cf40f6c70174064883c7027105ff5570ebf54989d04f8d4400ff4823d34883fa01745356415057ff750848baaef80ec9a37f00005248896508f6c10174064883f92f721148b8b0df06c9a37f0000488b5d0890ff1348ba688c0cc9a37f0000488b4c8afceb05e9860000004883c4085a48895508eb37e953000000909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d57e8483b55107303ff55404989d748c742f8020000004889720848890aeb084889f26a014150574889d64c89c24889f94883c418483b65187303ff5548e907ffffff48c7c1010000004883c40840f6c6017543488b0424ff7608514c8b48104c8b4008488b18488b06ff155a00000048833c2401740d488b1c24909090ff154e0000004889c14883c4085e483b65187303ff5548ebb74889c84883c408c390909000000000000000008001000000000000|@4427,2097151,@16198,@4428,@4426|84,0,$4425+166 110,0,@560 127,0,@3809 190,0,@3811 4426:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16201| 4427:S26|434f444547454e5f5441424c4528292e66726565536574283229 4428:D6,696|483b65187303ff5548488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c10174084883f9017d08eb1ff641ff107519488b13f6c101740af6c2017405483bcaeb05ff5570ebf67c134889c248b838e407c9a37f0000488b5d08ff134889caf6c20174064883c2027105ff5570ebf5488b5493fc4883fa017553504151525351ff750848be72fb0ec9a37f00005648896508f6c10174064883f92f721348b8b0df06c9a37f0000488b5d08909090ff1348be688c0cc9a37f0000488b748efc4889f04883c4085e48897508eb37e99e000000909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13909090ff159e0100004889c348b870fd0ec9a37f000090ff1592010000498d4fd8483b4d107303ff55404989cf48c741f80400000048baa0fd0ec9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff134889d640f6c60174064883ee027105ff5570ebf5f6c10174084883f9017d08eb20f641ff10751a488b3bf6c101740b40f6c7017405483bcfeb05ff5570ebf67c134889c748b810f407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf54889748bfc4883fa03756e498b09488338017514488b5008f6c20174064883c2207124ff5570ebf548837810037514488b5008f6c20174064883c2107109ff5570ebf5488b5008f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889ca4889d948c7c3030000004883eb014883f97feb05e924000000760748c7c17f00000048d1e948d3e34883cb01488d4c0901480bd3498911ff254500000048c7c001000000c390909090900000000000000000b002000000000000|@4432,2097151,@16199,@3770,@100,@4431|115,0,@1493 170,0,$4428+250 196,0,@560 215,0,@3809 274,0,@3811 311,0,@4429 352,0,@4430 370,0,@557 384,0,@20055 475,0,@1517 4429:S28|667265653a20726567697374657220616c726561647920667265653a 4430:O5|@4331,176,0,176,0 4431:D3,360|488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014881e20100fe004883fa0174684883fa017467488338017513488b4008a80174064883c0207123ff5570ebf548837810037513488b4008a80174064883c0107109ff5570ebf5488b4008a8017513488b08f640ff10740348f7d9488d4c0901eb034889c148c7c0030000004883e8014883f97feb0ae958000000e953000000760748c7c17f00000048d1e948d3e04883c801488d4c0901498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70131000000488d411848c740f80200000048c7400801000000488908c348c7c001000000c300000000000000006001000000000000|@4433,7,@16200| 4432:S23|434f444547454e5f5441424c4528292e66726565283429 4433:S29|5838364c4f574c4556454c28292e667265655265676973746572283129 4434:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16202| 4435:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16203| 4436:D7,744|483b65187303ff5548415041524d89c84889d848c7c3010000004889c1488b4424084889ca909090ff12498d4fd0483b4d107303ff55404989cf48c741f802000000488b14244889510848c7015b000000488d591848c743f80200000048c743080100000048890b6a016a0148837c246001746e48833a017514488b5208f6c20174064883c2207124ff5570ebf548837a10037514488b5208f6c20174064883c2107109ff5570ebf5488b5208f6c2017513488b0af642ff10740348f7d9488d4c0901eb034889d148c7c2030000004883ea014883f97f760748c7c17f000000eb05e93e00000048d1e948d3e24883ca01488d4c0901480b54245853504889d3488b442460909090ff15f2010000488d4c241048c70101000000488d4c241048894108eb6e48833a017514488b5208f6c20174064883c2207124ff5570ebf548837a10037514488b5208f6c20174064883c2107109ff5570ebf5488b5208f6c2017513488b0af642ff10740348f7d9488d4c0901eb034889d148c7c2030000004883ea014883f97f760748c7c17f000000eb05e92700000048d1e948d3e24883ca01488d4c0901480b5424584889e14889114889e148c74108010000005350488b442458488b00498d4fa8483b4d107303ff55404989cf48c741f8020000004889410848c7010b000000488d511848c742f801000000488902488d421048c740f80500000048895020488b54244848895018488b5c241048895810488b5c245048895808488908488b4c24284989c0488b5c2440488b4110ff15ca000000488b442458488b00a80174064883c0027105ff5570ebf5488b4c2458488901488b09488b442438488b00f6c1017409a8017405483bc8eb05ff5570ebf67e10488b442458488b00488b4c243848890148833c24017507488b442408eb0f488b1c24488b442408ff15660000004883f801750c4883c418584883c410c240004889c3488b4424184883c430594883c44051ff2544000000909090900000000000000000e002000000000000|@4438,2097151,@16205,@4425,@3834,@4439,@4437| 4437:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16207| 4438:S72|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d736176655265674f6e537461636b283129 4439:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16206| 4440:D11,1464|483b65187303ff5548488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c090148235424284883fa0174064883fa017564498339017563488338017562498d4f90483b4d107303ff55404989cf48c741f8030000004889411048c741080300000048c7012b000000488d512048c742f80300000048c74210010000004c894a0848c70223000000488d722048c746f802000000eb0fe9d7020000e90b020000e92000000048c7460801000000488916488d561848c742f8020000004889720848890aeb6e498d8f70ffffff483b4d107303ff55404989cf48c741f80400000048c741180100000048c74110030000004889410848c7012d000000488d512848c742f80300000048c74210010000004c894a0848c70223000000488d722048c746f80200000048c7460801000000488916eb05e941020000488d561848c742f8020000004889720848890a488d4a1848c741f8020000004889510848ba600b0fc9a37f0000488911498d57d8483b55107303ff55404989d748c742f80400000048c74218ffffffff48bee86f0cc9a37f0000488972104889420848c70201000000498d77b8483b75107303ff55404989f748c746f80300000048c74610030000004889560848c7066b000000488d562048c742f80400000048c74218f1ffffff48bfe86f0cc9a37f000048897a104889420848c70201000000498dbf78ffffff483b7d107303ff55404989ff48c747f80300000048c74710030000004889570848c7076f000000488d572048c742f8030000004889421048c742080300000048c702010000004c8d5a2049c743f80200000049c7430801000000498913498d531848c742f8020000004c895a0848893a488d7a1848c747f802000000488957084889374883ff0175054889caeb674889c64989db4889fb4889c8ff15ca0200004889c24889f04c89dbeb68488338017567498d4f98483b4d107303ff55404989cf48c741f8030000004889411048c741080300000048c7012b000000488d512048c742f8020000004c894a0848c70225000000eb05e97f000000488d721848c746f80200000048c7460801000000488916eb0ae961000000e915000000488d561848c742f8020000004889720848890aeb47498d4fc8483b4d107303ff55404989cf48c741f8030000004c8949104889410848c7014f000000488d512048c742f80200000048c742080100000048890aeb0748c7c2010000005241505041524151534d8b4a104d8b4208498b1a488b442408ff15da010000488b4c2418488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe4823542458504889d3488b44241890ff154601000050ff7424284c8b5424284c8b4c24204c8b442438488b5c2418488b442468ff152a010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424284889510848c70109000000498d57d0483b55107303ff55404989d748c742f805000000488b5c244848895a20488b7424504889721848c7421001000000488b7c245848897a0848890a488b4c2430504989d0488b5c2468488b41109090ff15aa00000048837c2440017507488b442410eb11488b5c2440488b44241090ff15920000004883f8017507488b442408eb0f4889c3488b44240890ff157e0000004883f8017508584883c440c228004889c3488b04244883c448594883c42851ff2561000000900000000000000000b005000000000000|@4443,2097151,@16208,@4444,@4428,@4425,@4445,@3834,@4450,@4451,@4442|451,0,@4441 496,0,@3659 584,0,@3659 4441:O1|56 4442:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16215| 4443:S70|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665526567496e526567283129 4444:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16209| 4445:D8,552|483b65187303ff5548488b0ba801740af6c1017405483bc1eb05ff5570ebf67d4c4889df4989c34c89db498b40109090ff150a020000a801754a488b084883390575464c3b49087445488b510848833a017512498339017555488b5a08493b5908743aeb5948833a037558eb05e99a010000498339037562488b5a08493b5908755deb0fe91e010000e919010000e90a000000488b7210493b7110756b415241514150574153ff7020ff7018eb05e9e2000000ff7010ff7008ff7110eb0ae9d2000000e9cd0000004d8b4a104d8b4208498b1a488b442440eb0ae9b6000000e9b1000000ff155e010000488b4c2438488b51184989c24c8b4a104c8b4208488b1a488b442458eb05e988000000909090ff153a010000498d47b0483b45107303ff55404989c748c740f8030000005948894810488b4c24504889480848c70005000000488d502048c742f805000000488b5c241848895a20488b5c241048895a18488b5c240848895a105b4883c41848895a08488902488b44241041524989d0488b5c2408488b50104889d0ff15c600000058eb2248c7c001000000415241514150574153eb1048c7c00100000041524151415057415359f6c10174064883c1027105ff5570ebf550ff7424304c8b5424284c8b4c24204c8b442418488b5c24104889c890e816feffff48833c240175074883c428c20800488b1c244883c428594883c40851ff255400000048c7c001000000c20800909000000000000000002002000000000000|@4447,2097151,@16210,@3852,@4428,@4448,@3834,@4446| 4446:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16212| 4447:S83|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665526567496e5265672831297265674368616e676564283129 4448:D3,440|488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c10174084883f9017d08eb1ff641ff107519488b13f6c101740af6c2017405483bcaeb05ff5570ebf67c144889c248b838e407c9a37f0000488b5d0890ff134889caf6c20174064883c2027105ff5570ebf5488b5493fc4889d640f6c60174064883c6027105ff5570ebf5f6c10174084883f9017d08eb20f641ff10751a488b3bf6c101740b40f6c7017405483bcfeb05ff5570ebf67c134889c748b810f407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf54889748bfc4883fa01756d498b09488338017513488b4008a80174064883c0207123ff5570ebf548837810037513488b4008a80174064883c0107109ff5570ebf5488b4008a8017513488b10f640ff10740348f7da488d541201eb034889c24889c84889d148c7c2030000004883ea014883f97f760eeb05e92800000048c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe4823c249890148c7c001000000c348c7c001000000c39090909090900000000000000000b001000000000000|@4449,191,@16211|106,0,@1493 215,0,@1517 4449:S23|434f444547454e5f5441424c4528292e696e6372283429 4450:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16213| 4451:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16214| 4452:D3,808|483b65187303ff5548488b4810488b094823cb4883f90174064883f901750848c7c001000000c348c7c20100000048c7c3030000004883fa2f751e488b7010488b78084c8b0048b878ed0ec9a37f0000488b5d08909090ff134889de4823f14883fe0175144883c202488d5c1bff483b65187303ff5548ebbcf6c20174084883fa017d2ceb06f642ff107424ff7010ff7008ff304889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb11488b4810488b5808488b304889d0515356ff750848b93e140fc9a37f00005148896508a80174064883f82f72144889c148b8b0df06c9a37f0000488b5d0890ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c10174084883f9017d08eb23f641ff10751d488b1424488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c134889c248b810f407c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf55a48c7448afc03000000488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901488b0c24488b09480bca5a48890a488b0c24488b09488338017514488b5008f6c20174064883c2207124ff5570ebf548837810037514488b5008f6c20174064883c2107109ff5570ebf5488b5008f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889ca4889d948c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c09014883f3fe4823d3594889114889c1498d47f0483b45107303ff55404989c748c740f801000000488908c39090909090909000000000000000002003000000000000|@4453,2097151,@16216|72,0,@4414 153,0,@376 163,0,I106 198,0,$4452+270 226,0,@560 243,0,@3809 294,0,@3811 427,0,@1517 4453:S40|434f444547454e5f5441424c4528292e67657441636365707461626c655265676973746572283229 4454:D9,912|483b65187303ff5548415041524d89c84889d848c7c3010000004889c1488b4424084889ca909090ff12488b0c244881e19fff00004883f90174654883f9017464488b0c244881e19fff000048c7c20100000048c7c3030000004883fa2f75154889c648b878ed0ec9a37f0000488b5d089090ff134889de4823f14883fe0175144883c202488d5c1bff483b65187303ff5548ebc5f6c20174144883fa01eb0ae9ec000000e9e70000007d24eb06f642ff10741c504889d348b810c506c9a37f000048bad0a8dc0000000000ff12eb074889c14889d051ff750848b9de170fc9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c7015b000000488d411848c740f80200000048c7400801000000488908eb4c498d4fc8483b4d107303ff55404989cf48c741f803000000488b54245048895110488b5c24584889590848c701590000004889c6488d412048c740f80200000048c740080100000048890856488b4c2450504c8b49104c8b4108488b19488b44246890ff15ae0100006a016a0148837c246001742b50488b5c2428488b442470909090ff1596010000488d4c240848c70101000000488d4c240848894108eb174889e1488b5424204889114889e148c741080100000050488b442460488b00498d4fa8483b4d107303ff55404989cf48c741f8020000004889410848c7010b000000488d511848c742f801000000488902488d421048c740f80500000048895020488b54245048895018488b5c240848895810488b5c245848895808488908488b4c24304989c0488b5c2448488b4110909090ff15ee000000488b442460488b00a80174064883c0027105ff5570ebf5488b4c2460488901488b09488b442440488b00f6c1017409a8017405483bc8eb05ff5570ebf67e10488b442460488b00488b4c244048890148837c2420017507488b442418eb12488b5c2420488b4424189090ff15860000004883f8017506488b0424eb104889c3488b0424909090ff15720000004883f801750c4883c410584883c420c248004889c3488b4424104883c438594883c44851ff255000000000000000000000008803000000000000|@4456,2097151,@16217,@4428,@4425,@3834,@4457,@4458,@4455|101,0,@4414 186,0,@376 196,0,I106 220,0,$4454+294 248,0,@560 267,0,@3809 318,0,@3811 4455:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16220| 4456:S75|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d736176654469726563744f6e537461636b283129 4457:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16218| 4458:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16219| 4459:D9,1880|483b65187303ff554850415141525341504d8b4810498b4808498b104989c84889d3488b44240890ff1542070000488b4c2420488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe4823542418504889d3488b44240890ff15ae060000488b4c2428488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c090148235424204883fa01740f4883fa01740948c7c101000000eb60488b4c24204881e19fff00004883f90174604883f901745f488b4c24204881e19fff000048c7c20100000048c7c3030000004883fa2f75164889c648b878ed0ec9a37f0000488b5d08909090ff134889de4823f14883fe0175274883c202eb05e9a4040000488d5c1bff483b6518730feb0ae9f3030000e9ee030000ff5548ebb1f6c20174084883fa017d25eb06f642ff10741d504889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb074889c14889d051ff750848b9ee1e0fc9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1348833801756b488b4c2430488339017565498d5790483b55107303ff55404989d748c742f80300000048894a1048c742080300000048c7022b000000488d5a2048c743f80300000048c74310010000004889430848c70323000000488d432048c740f80200000048c7400801000000eb0ae9f4010000e918000000488918488d481848c741f80200000048894108488911eb6e498d9770ffffff483b55107303ff55404989d748c742f80400000048c742180100000048c742100300000048894a0848c7022d000000488d5a2848c743f80300000048c74310010000004889430848c70323000000488d432048c740f80200000048c7400801000000488918eb05e9ce020000488d581848c743f80200000048894308488913488d431848c740f8020000004889580848ba600b0fc9a37f0000488910498d57d8483b55107303ff55404989d748c742f80400000048c74218ffffffff48bbe86f0cc9a37f000048895a1048894a0848c70201000000498d5fb8483b5d107303ff55404989df48c743f80300000048c74310030000004889530848c7036b000000488d532048c742f80400000048c74218f1ffffff48bee86f0cc9a37f00004889721048894a0848c70201000000498db778ffffff483b75107303ff55404989f748c746f80300000048c74610030000004889560848c7066f000000488d562048c742f80300000048894a1048c742080300000048c70201000000488d7a2048c747f80200000048c7470801000000488917488d571848c742f80200000048897a08488932488d721848c746f8020000004889560848891e4883fe0175054889c1eb694889f3ff157e0200004889c1eb60488b4c243048833901755a498d5798483b55107303ff55404989d748c742f80300000048894a1048c742080300000048c7022b000000488d5a2048c743f8020000004889430848c70325000000488d431848c740f802000000eb0fe90a010000e905010000e92000000048c7400801000000488918488d481848c741f80200000048894108488911eb6d498d57c8483b55107303ff55404989d748c742f8030000004889421048894a0848c7024f000000488d4a2048c741f80200000048c7410801000000488911eb6d498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424184889511848bae86f0cc9a37f0000eb05e96e00000048895110488b5424104889510848c70101000000498d57e0483b55107303ff55404989d748c742f80300000048894a10488b4c242848894a08eb05e92e00000048c70245000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c741080100000048891150eb0150498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b5424304889500848c70009000000498d57d0483b55107303ff55404989d748c742f805000000488b5c245048895a20488b7424584889721848c7421001000000488b7c246048897a08488902488b442448514989d0488b5c2448488b50104889d0ff158e00000048833c24017507488b442410eb12488b1c24488b442410909090ff15760000004883f801750c4883c408584883c430c228004889c3488b4424084883c440594883c42851ff25540000009090909000000000000000005007000000000000|@4461,2097151,@16221,@4428,@4425,@4462,@3834,@4463,@4460|420,0,@4414 513,0,@376 523,0,I106 548,0,$4459+622 576,0,@560 595,0,@3809 646,0,@3811 968,0,@4441 1013,0,@3659 1101,0,@3659 1524,0,@3659 4460:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16224| 4461:S73|434f444547454e5f5441424c4528292e7075736852656769737465727328352970757368456e747269657328322970757368546869732d73617665446972656374496e526567283129 4462:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16222| 4463:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16223| 4464:O2|@4475,@4404 4465:D7,576|483b65187303ff554841f6c001756a488b4858488b09f6c101740d41f600017407493b087f07eb19ff5570ebf44889c148b8b0280fc9a37f0000488b5d0890ff13488b4858488b09f6c101750941f600017503ff5570493b0875044889d8c36a016a015341505052ff7058488d5c2428488b4a084889caeb05e9b70000009090ff1248837c242801742248837c2420017507488b442430eb63488b5c2420488b44243090ff15ae010000eb55488b0424488b00a80174064883c0027105ff5570ebf5488b0c2448890148837c2420017507488b442430eb12488b5c2420488b4424309090ff15760100004883f801751648b838290fc9a37f0000eb1ee919000000e9140000004889c348b838290fc9a37f000090ff154e0100004c8b4424184883c4084889c3488b4424085a4883c428e9cbfeffff488b4858488b09488b7038488b3640f6c60174064883ee027105ff5570ebf553505240f6c60174084883fe017c52eb06f646ff10754f488b4424084889f74989c84889fb488b48104889c8ff15ea000000a8017546f6402001753b488b4020488b00a80174064883c0027105ff5570ebf5a801741541f6c001740f493bc0eb0fe93e000000e939000000ff5570ebec7f0d4c89c0eb084c89c0eb034c89c040f6c70174064883ef027105ff5570ebf54889fe4889c1483b65187303ff5548e95fffffff4889c8498d4ff0483b4d107303ff55404989cf48c741f8010000004889014989c8488b5c2410488b4424085a4883c410e9d3fdffff90909000000000000000003802000000000000|@4472,1048575,@16226,@4473,@4474,@4471,@3852|50,0,@4466 242,0,@4469 267,0,@4469 4466:O4|@20055,@557,@4468,@4467 4467:O5|@4331,949,0,949,0 4468:S32|707573685265676973746572733a20756e707573686564207265676973746572 4469:O2|@4470,0 4470:O2|42,1 4471:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16229| 4472:S29|434f444547454e5f5441424c4528292e616c69676e537461636b283329 4473:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16227| 4474:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16228| 4475:D3,200|483b65187303ff5548488b4858488b09498d77e0483b75107303ff55404989f748c746f80300000048bf082c0fc9a37f000048893e48894e0848894610488066ffbf5351ff705849c7c20100000049c7c1010000004989f048c7c3ffffff00488b520890ff12488b0c24488b09f6c101750af6442408017503ff5570483b4c2408740948c7c101000000eb0748c7c1030000004883f102488b5424104883c41048890a4889420848c7c0010000004883c408c390909090900000000000000000c000000000000000|@4487,1048575,@16231|42,0,@4476 4476:D4,240|483b65187303ff5548488b4a104889d74889c3488b411090ff15ea000000a80174134889c148b8282d0fc9a37f0000488b5d08ff13488b084883390b7537488b5108f6c201740ef64708017408483b57087f07eb18ff5570ebf348b8b82d0fc9a37f0000488b5d08909090ff1348c7c001000000c3f64020017556488b5020488b1af6c301740ef64708017408483b5f087c07eb18ff5570ebf348b8482e0fc9a37f0000488b5d08909090ff13f6c3017509f64708017503ff5570483b5f08740848c7c001000000c348c7c003000000c348c7c001000000c3909090909090900000000000000000e800000000000000|@4486,63,@16230,@3852|39,0,@4477 92,0,@4480 156,0,@4483 4477:O4|@20055,@557,@4479,@4478 4478:O5|@4331,885,0,885,0 4479:S33|70757368416e79456e747279417443757272656e7453503a206e6f20656e747279 4480:O4|@20055,@557,@4482,@4481 4481:O5|@4331,890,0,890,0 4482:S40|70757368416e79456e747279417443757272656e7453503a20656e7472792061626f766520727370 4483:O4|@20055,@557,@4485,@4484 4484:O5|@4331,899,0,899,0 4485:S39|70757368416e79456e747279417443757272656e7453503a20756e70757368656420656e747279 4486:S56|434f444547454e5f5441424c4528292e70757368416e79456e747279417443757272656e74535028312973656c656374456e747279283129 4487:S42|434f444547454e5f5441424c4528292e70757368416e79456e747279417443757272656e745350283129 4488:O2|@4489,0 4489:O1|46 4490:O4|@20055,@557,@4492,@4491 4491:O5|@3867,898,0,898,0 4492:S17|5a65726f2073697a656420766563746f72 4493:O2|@4441,0 4494:O4|@20055,@557,@4496,@4495 4495:O5|@3867,1069,0,1069,0 4496:S39|67656e6364653a20526573756c742077616e74656420627574206e6f6e6520737570706c696564 4497:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16510| 4498:S35|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529 4499:D6,624|488dbc2438ffffff483b7d187303ff5550a8017570488b08488b1141524151415053ff7008ff7210ff32ff7208ff7108415041514152ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb05e9c6010000ffb424c000000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b842480000000488b9424a0000000909090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff1348833c2401740948c7c19fff0000eb0748c7c10100fe006a016a016a014989e249c7c1030000004989c8488b18488b44245090ff1572010000488b4424584883c408488b004883f8017507488b442408eb0f4889c3488b44240890ff1552010000488b4c2450488901488b44241848833815751c488b40084883783801751148b818340fc9a37f0000488b5d0890ff134c8b5424484c8b4c24404c8b442428488b5c2420488b0424909090ff150a01000048837c242801750948c7c0ffffffffeb04488b042450ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c00000004c8b9424b80000004c8b8c24b00000004c8b8424a8000000488b9c24a0000000488b84249800000090e8dafdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c458488908c2600048c7c001000000c2600090909090909000000000000000006802000000000000|@1363,2097151,@16233,@4504,@4572,@4503|205,0,@4376 350,0,@4500 4500:O4|@20055,@557,@4502,@4501 4501:O5|@3867,472,0,472,0 4502:S29|4c6f6f704172673a20737461746963206c696e6b2066756e6374696f6e 4503:D12,672|483b65187303ff5548f6c30174084883fb017d08eb1ff643ff107519498b09f6c301740af6c1017405483bd9eb05ff5570ebf67c144889c148b810f407c9a37f0000488b5d0890ff13f6c30174064883c3027105ff5570ebf549894499fc4983f801756e4889c74889fb498b42109090ff1542020000a801745d5741525048c7c3030000004889f848baa05f06c9a37f00009090ff15260200004889c348b890dc0ec9a37f000090ff151a020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb0ae9bf000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f1beb06f641ff10741349c7c0030000004889fb4c89d0ff258d010000498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4989d04889fb498b421090ff154a01000048c7c001000000c34889c74889fb498b4210ff153a010000a801746e57415241505048c7c3030000004889f848baa05f06c9a37f0000ff151e0100004889c348b8688b0ec9a37f000090ff1512010000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba908b0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f805000000488b5020488951204c894118488b581048895910488b7008488971084c8b004c89014989c84889fb498b4210909090ff157600000048c7c001000000c390909090909000000000000000009802000000000000|@4573,2097151,@16261,@3852,@194,@100,@4422,@3834,@3852,@194,@100,@3834|58,0,@1517 138,0,@193 159,0,@4379 200,0,@4380 230,0,@557 244,0,@20055 444,0,@193 463,0,@4335 504,0,@4336 522,0,@557 543,0,@20055 4504:D44,4704|488dbc2438ffffff483b7d187303ff55504889c74989db4c89db488b47109090ff15521200004883f801757441525741534151ff771841505048c7c3030000004c89d848baa05f06c9a37f0000909090ff152a1200004889c348b8804b0fc9a37f000090ff151e120000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff134c8b60104c8b284c8b702041525741534151ff77184150ff7018ff70084c89db488b4710909090ff15a2110000a80174134889c148b8e04b0fc9a37f0000488b5d08ff134883780803740948c7c001000000eb0748c7c00300000049837d00097555498b4d08488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017518488b1af642ff10740348f7db488d5c1b01eb08e9e20100004889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014923d04883fa0174604883fa01745f4983f9017534498d4fd8483b4d107303ff55404989cf48c741f8020000004c895908498b5508488911488d591848c743f80100000048890beb5a4883f8017459498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae939010000e93401000048c7410801000000498b550848891148c7c301000000f6c1017564488b3148833e0175214c8b560841f6c2017412eb0ae9f8000000e9e50000004983c2207125ff5570ebf548837e100375154c8b560841f6c20174064983c2107109ff5570ebf54c8b560841f6c20175194d8b3241f642ff10740349f7de4f8d743601eb08e9450000004d89d6488b71084c89f149c7c2030000004983ea014883f97f760748c7c17f00000048d1e949d3e24983ca01488d4c0901490bda4889f1483b65187303ff5548e94dffffff4889d950415441555249b8604c0fc9a37f00004889cb4889f890ff15920f0000498d47d8483b45107303ff55404989c748c740f802000000488b4c2448488948085a488910488d581848c743f801000000488903eb5148c7c3010000005041544155eb575041544155eb5548c7c3010000005041544155eb604c89e14923c84883f90174594883f90174584c89e14923c848c7c20100000048c7c3030000004883fa2f7526eb05e96e0400004889c648b878ed0ec9a37f0000eb0ae95a040000e955040000488b5d08ff134889de4823f14883fe017525eb0fe93c040000e92b040000e9260400004883c202488d5c1bff483b65187303ff5548eba3f6c20174084883fa017d2beb06f642ff107423504154415541564889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb0d4889c14889d051415441554156ff750848b9223c0fc9a37f00005148896508a80174064883f82f72144889c148b8b0df06c9a37f0000488b5d0890ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1348837c244001746a488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760eeb05e97c00000048c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe4823542410498d4fd0483b4d107303ff55404989cf48c741f805000000488b1c2448895920488b5c24284889591848895110488b54242048895108488b542408488911488b5c2450504989c8488b4b10488b5c24504889c89090ff150e0d0000eb2b488b4c2450488b51184989c24c8b4a104c8b4208488b1a4c89d09090ff15f20c000048c7c0010000004152498d47b0483b45107303ff55404989c748c740f80300000048c7401001000000488b0c244889480848c70009000000488b542458488b5a38488b1b488d702048c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890653ff7248ff72384989f0488b421090ff15720c0000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb508b0ec9a37f0000488b44246890ff153e0c0000488b4424684883c408488b5c2458488b48104889c890ff152a0c0000a801746e5048c7c303000000488b44246048baa05f06c9a37f0000909090ff150e0c00004889c348b890dc0ec9a37f000090ff15020c0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2458488b442460909090ff15720b0000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424604d8b48104989d0488b5c24584c89c89090ff15220b0000498d47d8483b45107303ff55404989c748c740f8020000005948894808594883c408488908488d581848c743f801000000488903eb0c48c7c30100000050415441554883fb0175556a016a01488b44241048833805756448837c241801740848837c2418017559488b4808488339017514488b5108f6c20174064883c220712bff5570ebf54883791003751b488b5108f6c20174064883c2107110eb05e9c3090000ff5570ebee488b5108f6c201751f488b1af642ff10740feb0ae952010000e92601000048f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c090148235424384883fa01745d4883fa01745c48837c2420017459488b4c2440488b500848833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c30174174883fb017d17eb32e982000000e97d000000e978000000f643ff10751d488b31488b36f6c301740b40f6c6017405483bdeeb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c30174064883c3027105ff5570ebf5488b31488b5c9efc4883fb0375264989d24c8b49104c8b41084889f34c89d0ff154e0900004889e14c89114889e148894108eb4d488b5c2438488b44245890ff15360900004889e1488b104889114889e1488b580848895908eb26488b5c2438488b4424589090ff15160900004889e1488b104889114889e1488b580848895908488b442458488b5c2450488b48104889c890ff15f2080000a80174134889c148b8f04c0fc9a37f0000488b5d08ff1348837c2448017555488b084883390b752b488b5108f6c20174084883fa017f11eb06f642ff10740948c7c303000000eb4e488b5c24204883f302eb48488339057559488b5108483b1424750948c7c303000000eb5b48833a017545eb05e9b2000000488b1c2448833b017526488b7208483b7308741348c7c301000000eb55e997000000e99200000048c7c303000000eb5048c7c301000000eb55e96b00000048833a037558488b1c2448833b03eb05e950000000753e488b7208483b73087526488b7a10483b7b10740e48c7c301000000eb31e92c00000048c7c303000000eb23e91e00000048c7c301000000eb15e91000000048c7c301000000eb0748c7c3010000004883f302eb1048c7c301000000eb0748c7c3010000004883fb01746b488b4c2458488b78204c8b40184c8b48084c8b104c8b58104989dc488b5c2450488b41109090ff1596070000a801747057415041514152415341545048c7c303000000488b84248800000048baa05f06c9a37f000090ff156e0700004889c348b890dc0ec9a37f0000eb05e9220100009090ff155a070000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f000048895118eb05e92a0000004889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f34eb06f641ff10742c574150415141524153415449c7c003000000488b9c2480000000488b8424880000009090ff15ba060000eb6b498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b68104c896a1048894a08488b0848890a4c8b74245857415041514152415341544989d0488b9c2480000000498b4610909090ff155e06000048c7c001000000eb26e921000000488b4820488b5018488b7008488b384c8b401048c7c00100000051525657415053488b4c241048833903756df641080174134889c248b8e81f08c9a37f0000488b5d08ff13488b5108488b9c24880000004889c74c8b02488b43104c89c39090ff15f20500004883f8017570575048c7c3030000004c89c048baa05f06c9a37f00009090ff15d60500004889c348b8804b0fc9a37f0000eb05e9810000009090ff15c2050000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b084883390b741348b8704d0fc9a37f0000488b5d08909090ff13488b5108eb0a48c7c2010000004889c757524c8b442440488b9c2490000000488b842498000000ff152a050000498d4fb0483b4d107303ff55404989cf48c741f8030000005a48895110488b5424384889510848c70109000000488b9c2490000000488b7338488b36488d792048c747f80500000048c747200100000048c747180100000048c747100100000048c747080300000048890f5650ff7348ff73384989f8488b4b104889f34889c89090ff15aa040000488b442418a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb508b0ec9a37f0000488b8424a80000009090ff157204000048837c2420017456488b442450488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017518488b11f641ff10740348f7da488d541201eb08e9130200004889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901480b542428498d4fd0483b4d107303ff55404989cf48c741f805000000488b5c244848895920488b5c24404889591848895110488b54243848895108488b542430488911488b9424a80000004989c8488b9c24a0000000488b4210909090ff1586030000488b8424a8000000488b48184c8b49104c8b4108488b19488b4424509090ff156a030000488b8424a8000000488b9c24a0000000488b48104889c8909090ff1552030000a801746e5048c7c303000000488b8424a800000048baa05f06c9a37f0000ff15360300004889c348b890dc0ec9a37f000090ff152a030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff10742049c7c003000000488b9c24a0000000488b8424a800000090ff1596020000eb63498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424a80000004d8b48104989d0488b9c24a00000004c89c8ff154202000048c7c001000000eb0ce90700000048c7c0010000004989c5488b8424a80000004883c4089090ff151e02000048837c2450017507488b4c2410eb1b4889c6488b5c2450488b4424109090ff15020200004889c14889f04883f9017506488b0c24eb184889c64889cb488b04249090ff15e60100004889c14889f04883f90174164889c64889cb4c89e890ff15d20100004989c54889f04983fd01740c4c89eb909090ff15c2010000488b8c24a80000004883c408488b5424404889115a4883c448488951084889411048c7c0010000004883c458c3488b03488b4c2450488b10488911488b70084889710848c741100100000048c7c0010000004883c458c390909000000000000000005812000000000000|@4520,2097151,@16235,@3852,@194,@100,@3852,@4521,@3834,@4448,@3834,@3643,@3852,@194,@100,@4422,@3834,@4448,@4529,@4529,@3852,@3852,@194,@100,@4422,@3834,@3852,@194,@100,@4540,@3834,@3643,@3834,@4448,@3852,@194,@100,@4422,@3834,@4562,@4569,@4570,@4571,@4519|69,0,@193 91,0,@4505 132,0,@4506 150,0,@557 171,0,@20055 247,0,@4507 753,0,@4510 919,0,@4414 1025,0,@376 1035,0,I106 1066,0,$4504+1138 1094,0,@560 1111,0,@3809 1162,0,@3811 1638,0,@4334 1705,0,@193 1727,0,@4379 1768,0,@4380 1786,0,@557 1807,0,@20055 2390,0,@1493 2583,0,@4513 2963,0,@193 2983,0,@4379 3032,0,@4380 3057,0,@557 3071,0,@20055 3343,0,@1625 3410,0,@193 3431,0,@4505 3480,0,@4506 3498,0,@557 3519,0,@20055 3552,0,@4516 3790,0,@4334 4148,0,@193 4167,0,@4379 4208,0,@4380 4226,0,@557 4247,0,@20055 4505:S28|70737461636b5265616c456e7472793a206e6f7420656e7472793a20 4506:O5|@4331,264,0,264,0 4507:O4|@20055,@557,@4509,@4508 4508:O5|@4331,492,0,492,0 4509:S23|6c6173745265666572656e63653a206e6f20656e747279 4510:O1|@4511 4511:D3,24|48c7c003000000c300000000000000001000000000000000|@4512,1,@16234| 4512:S46|434f444547454e5f5441424c4528292e72656d6f766552656769737465727346726f6d4361636865283229283129 4513:O4|@20055,@557,@4515,@4514 4514:O5|@4331,1433,0,1433,0 4515:S24|6c6f6164456e7472793a20656e7472792064656c65746564 4516:O4|@20055,@557,@4518,@4517 4517:O5|@4331,1464,0,1464,0 4518:S48|6c6f616450737461636b456e7472793a20636f6e7461696e657220656e747279206973206e6f74206f6e20737461636b 4519:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16259| 4520:S33|434f444547454e5f5441424c4528292e6c6f6164456e747279546f536574283429 4521:D7,144|483b65187303ff5548488b4838488b095053ff70484d89c24989d94989c04889cb48c7c001000000ff157a00000048833c2401744350488b44241048ba58470cc9a37f0000909090ff15620000004889c348b8984f0fc9a37f000090ff15560000004c8b04244889c3488b4424189090ff154a000000eb0150584883c418c39000000000000000008800000000000000|@4524,2097151,@16236,@4523,@3810,@100,@3643|61,0,@3645 83,0,@4522 4522:S15|72656d6f766546726f6d4361636865 4523:D5,192|483b65187303ff5548a801740af6c3017405483bc3eb05ff5570ebf67d6241524151415053504989c04c89cb488b442410909090ff159e0000005048c7c001000000488b54242890ff124883f8017435488b442408a80174064883c0027105ff5570ebf54c8b5424284c8b4c24204c8b442418488b5c241090e882ffffffeb0ce92100000048c7c0010000004883f8017506584883c428c34889c3584883c428ff253a00000048c7c001000000c390900000000000000000b800000000000000|@4526,2097151,@16237,@4527,@4525| 4524:S34|434f444547454e5f5441424c4528292e72656d6f766546726f6d4361636865283329 4525:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16239| 4526:S44|434f444547454e5f5441424c4528292e72656d6f766546726f6d4361636865283329636c6561722832292829 4527:D7,640|483b65187303ff55484889c74989d94c89c3488b47109090ff157a020000a8017557488378100174074883781001750848c7c001000000c348c7c1ffffffff4933c94883c10148234810488b50104923d1488378080175524883f90174514883f9017450488b1848833b057569488b730848833e01751ceb05e9e40100004c8b560841f6c20174064983c2207136ff5570ebf548837e100375264c8b560841f6c20174174983c210eb0fe937010000e92d010000e9280100007109ff5570ebe44c8b560841f6c201751b4d8b1a41f642ff10740aeb05e94b00000049f7db4f8d5c1b01eb034d89d34989ca4c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014d23cb4983f901745d4983f901745ceb5f48833b09755e488b730848833e0175154c8b560841f6c20174064983c2207125ff5570ebf548837e100375154c8b560841f6c20174064983c2107109ff5570ebf54c8b560841f6c201752a4d8b1a41f642ff10eb14e981000000e97c000000e961000000e94d000000740349f7db4f8d5c1b01eb034d89d34989ca4c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014d23cb4983f901742d4983f9017511eb254989caeb204989caeb054989caeb164c89c049c7c0010000004889c34889f8ff259f000000498d4fd0483b4d107303ff55404989cf48c741f805000000488b582048895920488b7018488971184c8951104c8b48084c8949084c8b104c891152ff77184d89c34989c84c89db488b4710ff1556000000488b5c2408584883c408ff254e00000048c7c001000000c390909090909000000000000000007802000000000000|@4528,2097151,@16238,@3852,@4422,@3834,@4425| 4528:S34|434f444547454e5f5441424c4528292e636c6561724361636865456e747279283329 4529:D16,632|483b65187303ff554850ff704853ff7018488b0424909090ff15720200004883f8017571ff742408ff742408ff35660200004989e0488b5c2420488b44243090ff155a02000050488b5c2428488b442420909090ff154e0200004883f8017570ff742428ff742428ff354202000049c7c20300000049c7c1030000004989e0488b5c2440488b44245048ba78e00ec9a37f0000eb05e9620100009090ff1516020000504c8d442428488b5c2448488b4424589090ff150602000050488b5c2450488b442448909090ff15fa010000eb05e9f50000004883f801756f50488b44245848ba58470cc9a37f000090ff15de0100004889c348b8b0570fc9a37f000090ff15d2010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bad8570fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff1348837c2428017507488b4c2408eb1b488b30488b5c2428488b442408909090ff155e0100004889c1eb03488b304883f9017506488b0424eb104889cb488b0424909090ff15420100004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488930eb68488b08498d47e8483b45107303ff55404989c748c740f802000000488b1424488950084889086a016a016a016a016a01eb3f488b08498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889086a016a016a016a016a016a016a01eb05e9040000006a016a0148837c245801741d504c8b400848bb08580fc9a37f0000488b44246890ff1592000000eb0150584883c468c39000000000000000007002000000000000|@4534,2097151,@16240,@4452,@4535,@4521,@4452,@4537,@4406,@4521,@4452,@3810,@100,@4539,@4533,@3643|139,0,@4404 227,0,@3645 247,0,@4530 288,0,@4531 306,0,@557 320,0,@20055 586,0,@4532 4530:S19|4e6f2066726565207265676973746572733a20 4531:O5|@4331,1170,0,1170,0 4532:S16|6765745265676973746572496e536574 4533:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16244| 4534:S35|434f444547454e5f5441424c4528292e6765745265676973746572496e536574283229 4535:D5,104|483b65187303ff554852488b5a10488b42089090ff1566000000a8017528488b0c24488b51084c8b4a104c8b4208488b1a488b00ff154e00000048c7c0010000004883c408c348c7c0030000004883c408c390909090909000000000000000006000000000000000|@4536,2097151,@16241,@4452,@4428| 4536:S65|434f444547454e5f5441424c4528292e6765745265676973746572496e53657428322972416e64436f64652d756e74696c536f6d657468696e6746726565283129 4537:D5,104|483b65187303ff554852488b5a10488b42089090ff1566000000a8017528488b0c24488b51084c8b4a104c8b4208488b1a488b00ff154e00000048c7c0010000004883c408c348c7c0030000004883c408c390909090909000000000000000006000000000000000|@4538,2097151,@16242,@4452,@4428| 4538:S58|434f444547454e5f5441424c4528292e6765745265676973746572496e53657428322972416e64436f64652d70757368496e737472732d283129 4539:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16243| 4540:D20,4208|483b65187303ff55484889c74989d94c89cb488b47109090ff156a1000004883f801757457ff774841514150ff7758ff77185048c7c3030000004c89c848baa05f06c9a37f000090ff15421000004889c348b8804b0fc9a37f000090ff1536100000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13498338017514498b4808f6c10174064883c1207124ff5570ebf549837810037514498b4808f6c10174064883c1107109ff5570ebf5498b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901482350104883fa01740f4883fa01740948c7c001000000eb614883781001745f4883781001745d48c7c10100000048c7c2030000004883f92f7517488b581048b878ed0ec9a37f0000488b5d08909090ff134889d3482358104883fb0175144883c102488d5412ff483b65187303ff5548ebc2f6c1017419eb0fe9200d0000e9f5030000e9f00300004883f9017d2eeb06f641ff10742657ff7748415141504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb0b4889c857ff774841514150ff750848b9965d0fc9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1348833801756a488b0c24488339017565498d5790483b55107303ff55404989d748c742f80300000048894a1048c742080300000048c7022b000000488d4a2048c741f80300000048c74110010000004889410848c70123000000488d412048c740f80200000048c7400801000000eb0ae9f2010000e91b0000004889084889c1488d401848c740f80200000048894808488910eb6e498d9770ffffff483b55107303ff55404989d748c742f80400000048c742180100000048c742100300000048894a0848c7022d000000488d5a2848c743f80300000048c74310010000004889430848c70323000000488d432048c740f80200000048c7400801000000488918eb05e94b0b0000488d581848c743f80200000048894308488913488d431848c740f8020000004889580848ba600b0fc9a37f0000488910498d57d8483b55107303ff55404989d748c742f80400000048c74218ffffffff48bbe86f0cc9a37f000048895a1048894a0848c70201000000498d5fb8483b5d107303ff55404989df48c743f80300000048c74310030000004889530848c7036b000000488d532048c742f80400000048c74218f1ffffff48bee86f0cc9a37f00004889721048894a0848c70201000000498db778ffffff483b75107303ff55404989f748c746f80300000048c74610030000004889560848c7066f000000488d562048c742f80300000048894a1048c742080300000048c70201000000488d4a2048c741f80200000048c7410801000000488911488d511848c742f80200000048894a08488932488d4a1848c741f802000000488951084889194883f90174684889cb909090ff15be0b0000eb5f488b0c2448833901755a498d5798483b55107303ff55404989d748c742f80300000048894a1048c742080300000048c7022b000000488d4a2048c741f8020000004889410848c70125000000488d411848c740f802000000eb0fe98d090000e988090000e92300000048c74008010000004889084889c1488d401848c740f80200000048894808488910eb57498d57c8483b55107303ff55404989d748c742f8030000004889421048894a0848c7024f000000488d422048c740f80200000048c7400801000000488910eb64488b08488b1148bb16610fc9a37f0000488d5c93fcffe3e9040900009090e9bf030000909090e902040000909090e913060000909090e929060000909090e90b000000909090e93d0800009090904c3b4108745b488b510848833a01751949833801eb05e9b7080000752c488b5a08493b58087522eb6048833a03751a498338037514488b5a08493b5808750a488b7210493b7010746648833a017565498338017564498d5f90483b5d10730aeb05e925030000ff55404989df48c743f8030000004c89431048c743080300000048c7032b000000eb05e9fd020000488d732048c746f80300000048c74610010000004889560848c70623000000eb0fe9d7020000e90d020000e92c0000004c8d462049c740f80200000049c7400801000000498930498d401848c740f8020000004c894008488918eb6e498d9f70ffffff483b5d107303ff55404989df48c743f80400000048c743180100000048c74310030000004c89430848c7032d000000488d732848c746f80300000048c74610010000004889560848c706230000004c8d562049c742f80200000049c7420801000000498932eb05e96d070000498d721848c746f8020000004c89560848891e488d5e1848c743f8020000004889730848be600b0fc9a37f0000488933498d77d8483b75107303ff55404989f748c746f80400000048c74618ffffffff49bae86f0cc9a37f00004c8956104c89460848c706010000004d8d57b84c3b55107303ff55404d89d749c742f80300000049c74210030000004989720849c7026b000000498d722048c746f80400000048c74618f1ffffff49bbe86f0cc9a37f00004c895e104c89460848c706010000004d8d9f78ffffff4c3b5d107303ff55404d89df49c743f80300000049c74310030000004989730849c7036f000000498d732048c746f8030000004c89461048c746080300000048c706010000004c8d462049c740f80200000049c7400801000000498930498d701848c746f8020000004c8946084c891e4c8d461849c740f802000000498970084d89104983f80175054889d8eb694889de4c89c34889f09090ff15e6070000eb5b49833801755a498d5f98483b5d107303ff55404989df48c743f8030000004c89431048c743080300000048c7032b000000488d732048c746f8020000004889560848c706250000004c8d461849c740f802000000eb0fe9a9050000e9a4050000e92000000049c7400801000000498930498d401848c740f8020000004c894008488918eb63498d5fc8483b5d107303ff55404989df48c743f803000000488953104c89430848c7034f000000488d432048c740f80200000048c7400801000000488918eb6648c7c001000000eb62498d57c8483b55107303ff55404989d748c742f803000000eb05e9170500004c894210488b590848895a0848c70241000000488d422048c740f80200000048c7400801000000488910eb6af6410801741e48b8e81f08c9a37f0000eb0ae9d4040000e9cf040000488b5d089090ff13488b51084c8b124c89d3488b471090ff159a0600004883f801756e57ff774841514150ff77585048c7c3030000004c89d048baa05f06c9a37f0000ff15760600004889c3eb05e97404000048b8804b0fc9a37f00009090ff1562060000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f00004889511848894110eb05e92600000048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b084883390b741348b8686c0fc9a37f0000488b5d08909090ff13488b5758488b12f6c201740cf64108017406482b51087105ff5570ebf54883c201f6c20174064883ea027105ff5570ebf54883fa017556498d57e0483b55107303ff55404989d748c742f80300000048bb088c0cc9a37f000048895a104c89420848c7024f000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488910eb7057ff77484151415048c7c3110000004889d048ba50a9dc00000000009090ff12498d4fd0483b4d107303ff55404989cf48c741f8050000005a488951204889411848b8e86f0cc9a37f00004889411048b898a50cc9a37f00004889410848c7013d000000498d47e8483b4510730aeb05e91b000000ff55404989c748c740f80200000048c7400801000000488908eb5f57ff77484151eb5c57ff774841514c8b57184989f9488b5910488b410890ff15b6040000eb62498338017561498d57e0483b55107303ff55404989d748c742f8030000004c89421048c742080300000048c7022b000000f64108017452eb0ae97c020000e977020000f6410801751048b8b8f309c9a37f0000488b5d08ff134883790801741deb0ae953020000e9e300000048b8c06c0fc9a37f0000488b5d0890ff1348bb986d0fc9a37f0000eb69f6410801741248b8f86f07c9a37f0000488b5d089090ff13488b7108480fb65eff488d5c1b014883fb03753140f6c601741248b8f86f07c9a37f0000488b5d089090ff1348bbffffffffffffff0048235ef8488d5c1b014883fb03741748b8a86d0fc9a37f0000eb05e909000000488b5d08ff134889f3498d77b8483b75107303ff55404989f748c746f80200000048895e0848c70621000000488d5e1848c743f80200000048c7430801000000488933488d431848c740f80200000048895808488910eb6ef6410801746df6410801751248b8b8f309c9a37f0000488b5d089090ff13488b5108f6c20174054803d27105ff5570ebf64883ea01f6c20174064883c2027105ff5570ebf5498d5fc8483b5d107303ff55404989df48c743f803000000488953104c89430848c7034b000000eb0ae9e2000000e919000000488d432048c740f80200000048c7400801000000488918eb6a498d57c8483b55107303ff55404989d748c742f803000000488b590848895a104c89420848c7024d000000488d422048c740f80200000048c7400801000000488910eb72488b5758488b12f6c201740cf64108017406482b51087105ff5570ebf54883c201f6c201eb05e95500000074064883ea027105ff5570ebf557ff774841514150ff771848c7c3110000004889d048ba50a9dc000000000090ff12415a4c8b4c241841584889c348b8088c0cc9a37f0000eb05e90900000090ff151a020000eb1657ff77484151eb0e57ff77484151eb0657ff774841516a014883c408eb0657ff77484151488b4c24104889c7488b1c24488b4110ff15e6010000a801746e575048c7c303000000488b44241048baa05f06c9a37f00009090ff15ca0100004889c348b890dc0ec9a37f000090ff15be010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c003000000488b5c2408488b4424189090ff152e010000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c2410574989d0488b5c2408498b4110ff15e200000048c7c00100000048833c2401740a488b1c24ff15d200000048837c241001741e504989c048bb406e0fc9a37f0000488b442420909090ff15b6000000eb0150584883c420c3909090909000000000000000006810000000000000|@4553,2097151,@16245,@3852,@194,@100,@4554,@4555,@3852,@194,@100,@4556,@4556,@3852,@194,@100,@4422,@3834,@4552,@3643|63,0,@193 83,0,@4505 124,0,@4506 142,0,@557 163,0,@20055 376,0,@4414 475,0,@376 485,0,I106 516,0,$4540+590 544,0,@560 563,0,@3809 614,0,@3811 938,0,@4441 983,0,@3659 1071,0,@3659 1464,0,$4540+1486 1920,0,@4441 1965,0,@3659 2053,0,@3659 2533,0,@1625 2612,0,@193 2638,0,@4505 2680,0,@4506 2705,0,@557 2719,0,@20055 2752,0,@4541 2850,0,@3806 2930,0,I108 2977,0,@3659 2991,0,@3870 3167,0,@2708 3202,0,@4543 3219,0,@4547 3237,0,@1294 3281,0,@1294 3299,0,36028797018963967 3324,0,@4548 3441,0,@2708 3719,0,I108 3744,0,@3806 3846,0,@193 3867,0,@4379 3908,0,@4380 3926,0,@557 3947,0,@20055 4156,0,@4551 4541:O4|@20055,@557,@4518,@4542 4542:O5|@4331,1337,0,1337,0 4543:O4|@20055,@557,@4545,@4544 4544:O5|@4546,129,0,129,0 4545:S40|6d6f7665436f6e7374616e74546f52656769737465723a2073686f7274207265616c2076616c7565 4546:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364c4f574c4556454c2e4d4c 4547:B8|0000000000000000 4548:O4|@20055,@557,@4550,@4549 4549:O5|@4546,132,0,132,0 4550:S48|6d6f7665436f6e7374616e74546f526567697374657220746f206670207265673a20696e76616c696420736f75726365 4551:S15|6c6f616450737461636b456e747279 4552:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16253| 4553:S34|434f444547454e5f5441424c4528292e6c6f616450737461636b456e747279283329 4554:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16246| 4555:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16247| 4556:D9,1424|483b65187303ff5548498338017514498b4808f6c10174064883c1207124ff5570ebf549837810037514498b4808f6c10174064883c1107109ff5570ebf5498b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014881e20100fe004883fa01745f4883fa01745e53504150415248c7c39fff00004c89c89090ff15f6040000488b0c24ff7008ff304c8b49104c8b4108488b19488b04249090ff15de040000488b0c2448833901756f488b54241848833a017569498d5f90483b5d10730feb0ae90c040000e907040000ff55404989df48c743f8030000004889531048c743080300000048c7032b000000488d532048c742f80300000048c742100100000048894a0848c70223000000488d722048c746f802000000eb0ae906020000e92000000048c7460801000000488916488d561848c742f8020000004889720848891aeb6e498d9f70ffffff483b5d107303ff55404989df48c743f80400000048c743180100000048c74310030000004889530848c7032d000000488d732848c746f80300000048c746100100000048894e0848c70623000000488d7e2048c747f80200000048c7470801000000488937eb05e938020000488d771848c746f80200000048897e0848891e488d5e1848c743f8020000004889730848be600b0fc9a37f0000488933498d77d8483b75107303ff55404989f748c746f80400000048c74618ffffffff48bfe86f0cc9a37f000048897e104889560848c70601000000498d7fb8483b7d107303ff55404989ff48c747f80300000048c74710030000004889770848c7076b000000488d772048c746f80400000048c74618f1ffffff49b8e86f0cc9a37f00004c8946104889560848c706010000004d8d8778ffffff4c3b45107303ff55404d89c749c740f80300000049c74010030000004989700849c7006f000000498d702048c746f8030000004889561048c746080300000048c70601000000488d562048c742f80200000048c7420801000000488932488d721848c746f802000000488956084c8906488d561848c742f8020000004889720848893a4883fa0175054889daeb674889c64889d84889d390ff156a0200004889c24889f0eb6a488b54241848833a017564498d5f98483b5d107303ff55404989df48c743f8030000004889531048c743080300000048c7032b000000488d532048c742f80200000048894a0848c70225000000eb05e976000000488d721848c746f80200000048c7460801000000eb0ae95b000000e918000000488916488d561848c742f8020000004889720848891aeb3e498d5fc8483b5d107303ff55404989df48c743f80300000048894b104889530848c7034f000000488d532048c742f80200000048c742080100000048891a498d4fd8483b4d107303ff55404989cf48c741f804000000488b5c24284889591848bbe86f0cc9a37f000048895910488b5c24204889590848c70101000000498d5fe0483b5d107303ff55404989df48c743f80300000048894b105948894b0848c70345000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c741080100000048891948833c2401741e4889c64889d7488b1c244889c89090ff15fa0000004889c14889fa4889f04883f90174174889c64889cb4889d09090ff15e20000004889c24889f04883fa0175054883c428c34889d34883c428ff25cc000000498d4fd8483b4d107303ff55404989cf48c741f8040000004889591848bae86f0cc9a37f0000488951104889410848c70101000000498d47c8483b45107303ff55404989c748c740f803000000488948104c89400848c700450000004889c1488d402048c740f80200000048c7400801000000488908c3909090909000000000000000008805000000000000|@4558,2097151,@16248,@4529,@4428,@4559,@4560,@4561,@4557|525,0,@4441 570,0,@3659 658,0,@3659 1091,0,@3659 1314,0,@3659 4557:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16252| 4558:S51|434f444547454e5f5441424c4528292e6c6f616450737461636b456e7472792833296d6f766546726f6d4d656d6f7279283329 4559:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16249| 4560:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16250| 4561:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16251| 4562:D4,264|483b65187303ff5548488b4828488b09488b5038488b12488b5858488b1b4989db4c8b60584989c14989d04889cb48c7c001000000909090ff15e200000041f6c3017409a80174054c3bd8eb05ff5570ebf67e6f4989042441f6c3017409a80174054c2bd87105ff5570ebf64983c3014983fb01750848c7c001000000c341f6c30174084983fb017c09eb1941f643ff10741248b880790fc9a37f0000488b5d089090ff13498d47d0483b45107303ff55404989c748c740f8020000004c895808eb05e92200000048c700610000004889c1488d401848c740f80200000048c7400801000000488908c348c7c001000000c390909090909000000000000000000001000000000000|@4567,2047,@16254,@4566|149,0,@4563 4563:O4|@20055,@557,@4565,@4564 4564:O5|@4546,322,0,322,0 4565:S20|7265736574537461636b3a206e65676174697665 4566:D4,296|483b65187303ff5548a801750941f6c0017503ff5570493bc075044889d8c34889df4989c24c89d3498b4110ff150e010000a8017565488b0848833909754a41f6c20174064983c2027105ff5570ebf5488b5110f6c20174064883c2027105ff5570ebf5f6c201740b40f6c7017405483bd7eb05ff5570ebf67f034889fa4889d34c89d0e977ffffff4883390b755141f6c201740d4983c202eb05e95c0000007105ff5570ebee488b5108f6c20174064883c2027105ff5570ebf5f6c201740b40f6c7017405483bd7eb05ff5570ebf67f034889fa4889d34c89d0e920ffffff41f6c20174064983c2027105ff5570ebf54889fb4c89d0e904ffffff41f6c20174064983c2027105ff5570ebf54889fb4c89d0e9e8feffff00000000000000002001000000000000|@4568,511,@16255,@3852| 4567:S46|434f444547454e5f5441424c4528292e72656d6f76654f6c644974656d7346726f6d5265616c537461636b283129 4568:S57|434f444547454e5f5441424c4528292e72656d6f76654f6c644974656d7346726f6d5265616c537461636b2831296d6178537461636b283229 4569:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16256| 4570:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16257| 4571:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16258| 4572:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16260| 4573:S45|47454e45524154455f434f444528292e636f646567656e2839296c6f63616c4465636c61726174696f6e283329 4574:D12,1408|488dbc2438ffffff483b7d187303ff5550a80174084883f8297f08eb1cf640ff1075164889c148b818840fc9a37f0000488b5d08909090ff13488b0b4152415141505350514d8b50584d8b4848498b5040498b7038498b78104989d04889f34889f89090ff152e05000050488b5c2420488b442428909090ff1522050000488b4c2418488b094883f9017506488b4808eb15488b304889cb488b4008ff15060500004889c1eb03488b30488b442418488908498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4fa04c3b4d107303ff55404d89cf49c741f8050000004989512049894918498959104d894108498939498d493048c741f8020000004c89490848c70139000000488d511848c742f80200000048c742080100000048890a488b084883f901740f4889cb4889d0ff15da0300004889c2488b442418488910488b4c2420488b5158488b12498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47b84c3b45107303ff55404d89c749c740f80800000049ba90840fc9a37f00004d89104989400849895010498948184989782049895828488b1424498950304c8b5424284d895038498060ffbf4d8d5fd04c3b5d107303ff55404d89df49c743f803000000498973104d8943084d890b498d732048c746f8010000004c891e5753ffb424c80000005150ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d80000004989f24c8b8c24c80000004c8b8424d000000048c7c303000000488b8424d8000000488b9424b8000000909090ff12488b0c24488b094883f90174064883f9017514488b4c2408488b09f6c10174074883c448c28000488b442428488b4c2418488908488b0c24488b09488b542408488b12488b5c2430488b7338488b36ff7320ff3352516a0349c7c2010000004989f149c7c001000000488b442438ff150202000049b8688d0fc9a37f00005b488b4424489090ff15f2010000ff3424ff35f101000049c7c20100000049c7c1010000004989e048c7c3ffffff00488b44245848ba78e00ec9a37f00009090ff15ca0100004883c4185948c701010000005948c70101000000488b4c2428488b094883f901740a4889cb90ff15a6010000488b4c2428488901488b442420a80174064883c0027105ff5570ebf5488b9424c8000000488b9c24c0000000488bb424b8000000488bbc24b00000004c8b8424a80000004c8b8c24a00000004c8b9424980000004c8b9c24900000004c8ba424880000004c8bac24800000004c8b742478488b4c247051488b4c247051488b4c247051488b4c247051488b4c247048899424e800000048899c24e00000004889b424d80000004889bc24d00000004c898424c80000004c898c24c00000004c899424b80000004c899c24b00000004c89a424a80000004c89ac24a00000004c89b42498000000488b5424184889942490000000488b5424104889942488000000488b54240848899424800000005a4883c418488954245848894c24504c8b5424404c8b4c24384c8b4424304883c4285b4883c418e995faffff909090909000000000000000007805000000000000|@4593,2097151,@16268,@4594,@4598,@4605,@4606,@4607,@4521,@4636,@4406,@4592|40,0,@4575 243,0,576460752303423480 589,0,@4578 952,0,@4589 1014,0,@4404 4575:O4|@20055,@557,@4577,@4576 4576:O5|@3867,492,0,492,0 4577:S13|726570726f636573734c6f6f70 4578:D6,320|483b65187303ff5548524c8b4238488b5a30488b42189090ff153a010000488b0c24488b5128488b12480b10488b5928488913488b5120488b124883fa017506488b4008eb104889d3488b4008909090ff150a010000488b0c24488b5120488902488b4118488b5858488b1bf6c301740cf64110017406482b59107105ff5570ebf54883c3014883fb01750948c7c301000000eb5ef6c30174084883fb017c08eb17f643ff10741148b880790fc9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f80200000048895e0848c70661000000488d5e1848c743f80200000048c7430801000000488933488b7108488b364883fe0174154889df4889f34889f8909090ff15560000004889c3488b0424488b40084883c40848891848c7c001000000c39090909000000000000000003801000000000000|@4580,8191,@16262,@4581,@4588,@4579|170,0,@4563 4579:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16266| 4580:S67|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d726570726f636573734c6f6f702831296f6e4c6f6f70283129 4581:D4,72|483b65187303ff5548488b0c2448890424534d89c24c8b483849c7c00100000048c7c30100000048c7c00100000051ff252b00000090909000000000000000004000000000000000|@4586,8191,@16263,@4582| 4582:D4,1120|483b65187303ff5548498b09a8017508f6c1017503ff5570483bc17522498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c210004c89d1f6c1017529a8017508f601017503ff5570483b01750948c7c103000000eb16488b4908483b65187303ff5548ebd248c7c1010000004883f9017428a80174064883c0027105ff5570ebf5488b4c2410488b54240848894c24104889542408e95bffffff488b4c24104889df4989c34c89db488b411090ff15ba030000488b4c2408488b1948baffffffffffffff00482353f8488d54120141f6c301740af6c20174054c3bdaeb05ff5570ebf67c0948c7c201000000eb3c41f6c301741848baffffffffffffff00482353f8488d5412014c3bda72164889c248b8b0df06c9a37f0000488b5d08909090ff134a8b5c9bfc4889da4883f801755ff6c201752f41f6c30174064983c3027105ff5570ebf5480b7a10488b442410488944241048894c24084889fb4c89d8e991feffff41f6c30174064983c3027105ff5570ebf5488b442410488944241048894c24084889fb4c89d8e966fefffff6c201756a48c7c3ffffffff483358104883c30148235a10480bdf488b30488b3e49bc2e890fc9a37f00004d8d64bcfc41ffe490e9ac000000909090e9be000000909090e9d2000000909090e9e6000000909090e906010000909090e903000000909090488b3a48833f0b746aeb05e91102000048833f0575244d8d67e84c3b65107303ff55404d89e749c74424f8020000004d894424084d891c24eb4248833f09741348b8f08b0fc9a37f0000488b5d08909090ff134d8d67e84c3b65107303ff55404d89e749c74424f8020000004d89442408eb05e97c0100004d891c244d89e0eb5d488b1248833a01745948b8f08b0fc9a37f0000488b5d0890ff13488b1248833a03746248b8f08b0fc9a37f0000488b5d08909090ff13488b1248833a05746648b8f08b0fc9a37f0000488b5d08909090ff13488b1248833a07745aeb0ae911010000e90c01000048b8f08b0fc9a37f0000488b5d08909090ff13488b3a48833f057537eb05e9e90000004d8d67e84c3b65107303ff55404d89e749c74424f802000000eb05e9c90000004d894424084d891c24eb58e9b900000048833f09741248b8f08b0fc9a37f0000488b5d089090ff134c8b66084c3b6708744e49833c240175184c8b6f0849837d0001754d4d8b7424084d3b75087431eb4e49833c240375474c8b6f0849837d0003eb05e95e00000075354d8b7424084d3b7508752a498b4c2410493b4d10751f488b4e10f6c1017510f6471001750aeb05e909000000ff5570483b4f107421498d4fe8483b4d107303ff55404989cf48c741f8020000004c8941084c8919eb034c89c14989cc4d89e041f6c30174064983c3027105ff5570ebf5488b4c2410488b54240848894c241048895424084c89d8e9e1fbffff41f6c30174064983c3027105ff5570ebf5488b442410488944241048894c24084889fb4c89d8e9b6fbffff90909090909000000000000000005804000000000000|@4587,8191,@16264,@3852|200,0,36028797018963967 257,0,36028797018963967 284,0,@560 445,0,$4582+462 576,0,@4583 650,0,@4583 676,0,@4583 704,0,@4583 744,0,@4583 833,0,@4583 4583:O4|@20055,@557,@4585,@4584 4584:O5|@4331,3066,0,3066,0 4585:S13|46756e6e7920656e7472696573 4586:S36|434f444547454e5f5441424c4528292e636f6d706172654c6f6f70537461746573283329 4587:S52|434f444547454e5f5441424c4528292e636f6d706172654c6f6f7053746174657328332970726f636573735461626c6573283329 4588:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16265| 4589:O1|@4590 4590:D3,24|48c7c003000000c300000000000000001000000000000000|@4591,1,@16267| 4591:S40|434f444547454e5f5441424c4528292e726573746f72654c6f6f7053746174652834295f2d283129 4592:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16291| 4593:S58|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d726570726f636573734c6f6f70283129 4594:D7,712|483b65187303ff5548488b0b488b1b4d8b124883f901750c48b8909adc0000000000eb68f6c10174084883f9017e1eeb06f641ff107516f6c101740b483b0d7d0200007c1ceb06f641ff1075144889c248b840ff0bc9a37f0000488b5d0890ff134889ca4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff720aeb05e97b000000ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000535256a8017410f6442408017409483b4424087c07eb39ff5570ebf24989c34c89db488b0424ff15060200004a89449ffc41f6c30174064983c3027105ff5570ebf54c89d8483b65187303ff5548ebb3488067ffbf4889f84883c410eb01534889c1498d47e0483b45107303ff55404989c748c740f8030000004c895010488b1424488950084889084983f901746e50514150415248b8d0910fc9a37f00004c89c2ff1248c7c015000000488b5424089090ff1248b8f0910fc9a37f0000488b542408909090ff1248c7c303000000488b44242048baa05f06c9a37f0000ff1556010000488b54240890ff1248b8b8920cc9a37f0000488b542408eb05e9ec000000ff1248c7c3030000005848baa05f06c9a37f0000ff1526010000488b14249090ff1248c7c015000000488b1424909090ff12488b442418a80174084883f8017c60eb06f640ff10755d488b54240848b9ffffffffffffff0048234af8488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67d42a801741848b9ffffffffffffff0048234af8488d4c0901483bc1721f4889c148b8b0df06c9a37f0000eb0ae94b000000e946000000488b5d08ff13488b4c82fceb0748c7c101000000504c8b4424084889cbff157a00000058a80174064883e8027105ff5570ebf5483b65187303ff5548e94bffffff506a016a014883c410584883c408c390909090900000000000000000b802000000000000ffffffffffffff01|@4597,2097151,@16269,@3852,@194,@194,@3842|26,0,I49 82,0,@3572 325,0,@4595 356,0,@4596 388,0,@193 412,0,@3830 444,0,@193 512,0,36028797018963967 556,0,36028797018963967 583,0,@560 4595:S9|736176655374617465 4596:S5|207073703d 4597:S28|434f444547454e5f5441424c4528292e736176655374617465283129 4598:D6,176|483b65187303ff5548535090ff15b60000005948c7c20100000050f6c1017552488339ff743dff7108524c8b0148c7c3ffffff00488b442418909090ff158e00000048833c240175054889c2eb0f488b1c249090ff157e0000004889c24883c408eb03ff710859483b65187303ff5548eba94889d04889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c39090900000000000000000a800000000000000|@4600,2097151,@16270,@4601,@4527,@4599| 4599:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16272| 4600:S38|434f444547454e5f5441424c4528292e6765744c6f6f7044657374696e6174696f6e73283229 4601:D6,408|483b65187303ff5548a8017563488338ff750c48b9d09507c9a37f0000eb564889df4c8b40084c8b084c89cb488b4710ff157a0100004883f80175745741505048c7c3030000004c89c848baa05f06c9a37f0000ff155e0100004889c348b8804b0fc9a37f000090ff1552010000eb0ae909010000e9cb000000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b08488339097529488b4108498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb3d4883390b741048b8b8950fc9a37f0000488b5d08ff13488b4108498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701050000004889fbeb044c8b4008534150514c89c090e8aafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000009001000000000000|@1363,2097151,@16271,@3852,@194,@100|21,0,@1394 76,0,@193 95,0,@4505 148,0,@4506 166,0,@557 187,0,@20055 267,0,@4602 4602:O4|@20055,@557,@4604,@4603 4603:O5|@4331,3016,0,3016,0 4604:S29|6765744c6f6f70446573743a2077726f6e6720656e7472792074797065 4605:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16273| 4606:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16274| 4607:D19,2160|488dbc2458ffffff483b7d187303ff555048837b4801746e53ff73484150ff7358ff7328ff73384152ff7318504151ff7340ff7008ff701048b858a00fc9a37f0000488b54241090ff1248c7c015000000488b5424109090ff1248b8f0910fc9a37f0000488b542410909090ff1248c7c303000000488b44240848baa05f06c9a37f0000eb05e91a01000090ff15f6070000488b54241090ff1248b8b8920cc9a37f0000488b542410909090ff1248c7c3030000005848baa05f06c9a37f0000ff15ca070000488b54240890ff1248c7c015000000488b5424089090ff1258a80174084883f8017c5feb06f640ff10755c488b4c2410488b1948baffffffffffffff00482353f8488d541201a801740af6c2017405483bc2eb05ff5570ebf67c0948c7c201000000eb43a801741848baffffffffffffff00482353f8488d541201483bc2721feb0ae94f000000e94a0000004889c248b8b0df06c9a37f0000488b5d08ff13488b5c83fc4889da504c8b4424084889d39090ff151a07000058a80174064883e8027105ff5570ebf5483b65187303ff5548e943ffffff48c7c001000000eb234889c148c7c00100000053ff73484150ff7358ff7328ff73384152ff73185141516a01f6442440017569488b442440488b4c2410f60001741b488b1948baffffffffffffff00482353f8488d541201483b107714488b1048b8b0df06c9a37f0000488b5d0890ff13488b10488b5493fcf6c201741348b870a00fc9a37f0000488b5d08909090ff13488b3248833e09750deb05e920010000488b7e08eb6b48837a1001740748837a1001751048b8f8a00fc9a37f0000488b5d08ff1348c7c70100000049c7c0030000004883ff2f751048b878ed0ec9a37f0000488b5d08ff134d89c14c234a104983f90175144883c7024f8d4400ff483b65187303ff5548ebc940f6c701740feb05e9b40000004883ff017d23eb06f647ff10741b4889fb48b810c506c9a37f000048bad0a8dc0000000000ff12eb034889f8ff750848b96e9a0fc9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4889c74883c4085848894508eb39488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1348bfe88b0cc9a37f0000488b442428488b00a80174064883e8027105ff5570ebf5574c8b442458488b5c2410909090ff150e050000504c8b4c24284c8b442460488b5c243848c7c001000000909090ff15f6040000488b4c2420488b542448488b591048891a488b742438488b36488b7c24384c8b41084c890750ff742478ff742440574c8b5424484c8b8c24800000004989f04889cb48c7c00100000090ff15ae040000488b4c2450488b09488b542440488b12f6c20174064883ea027105ff5570ebf550f6c20174084883fa017c4deb06f642ff10754a488b4424704889d74989c84889fb488b48104889c890ff1566040000a8017537488b084883390b742ef64020017528488b502041f6c0017416f6020174114c3b027e14eb0fe932000000e92d000000ff5570ebea4c8b0240f6c70174064883ef027105ff5570ebf54889fa4c89c1483b65187303ff5548e971ffffff4889c8488b4c2458488b09a801740af6c1017405483bc1eb05ff5570ebf67d69488b4c2450488b09a801740af6c1017405483bc1eb05ff5570ebf67d164889c148b878a10fc9a37f0000488b5d08909090ff13488b4c2458488b09488b542458488902f6c1017409a8017405482bc87105ff5570ebf64883c1014883f901750e48c7c001000000eb69e969000000f6c10174084883f9017c08eb18f641ff10741248b880790fc9a37f0000488b5d089090ff13498d47d0483b45107303ff55404989c748c740f8020000004889480848c700610000004889c1488d401848c740f80200000048c7400801000000488908eb0ce90700000048c7c00100000048837c2410017507488b4c2408eb194889c6488b5c2410488b442408ff15ee0200004889c14889f04883f9017506488b0c24eb184889c64889cb488b04249090ff15d20200004889c14889f04883f901740c4889cb909090ff15c202000048837c24600175284889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000eb56488b4c2418488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017518488b1af642ff10740348f7db488d5c1b01eb08e9950100004889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901504889d3488b44247890ff1502020000498d4fb0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424204889510848c70109000000488b542478488b5a38488b1b488d712048c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890eff700853ff7248ff72384989f0488b42109090ff1586010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb508b0ec9a37f0000488b8424900000009090ff154e010000498d47f0483b45107303ff55404989c748c740f8010000004883c4085948890848837c2408017506488b0c24eb184889c6488b5c2408488b0424ff15160100004889c14889f04883f901750948c7c101000000eb194889c64889cb48c7c001000000ff15f60000004889c14889f04889c2498d47e8483b45107303ff55404989c748c740f802000000488948084889104883c41048837c246801741e504c8b400848bb58a00fc9a37f0000488b4424789090ff15ae000000eb0150584883c478c2080090909000000000000000006808000000000000|@4619,2097151,@16275,@194,@194,@3842,@4620,@4623,@4627,@3852,@4632,@4633,@4634,@4529,@3834,@3643,@4635,@4618,@3643|58,0,@4608 92,0,@4596 124,0,@193 156,0,@3830 184,0,@193 251,0,36028797018963967 304,0,36028797018963967 343,0,@560 483,0,36028797018963967 510,0,@560 540,0,@4609 595,0,@4612 631,0,@4414 710,0,@376 720,0,I106 740,0,$4607+814 768,0,@560 787,0,@3809 838,0,@3811 863,0,@3805 1268,0,@4615 1365,0,@4563 1922,0,@4334 2109,0,@4608 4608:S8|7365745374617465 4609:O4|@20055,@557,@4611,@4610 4610:O5|@4331,1116,0,1116,0 4611:S25|70537461636b5265616c456e7472793a206e6f20656e747279 4612:O4|@20055,@557,@4614,@4613 4613:O5|@4331,1906,0,1906,0 4614:S24|73657453746174653a206e6f742061207265676973746572 4615:O4|@20055,@557,@4617,@4616 4616:O5|@4331,2061,0,2061,0 4617:S31|556e70757368656420656e7472792062656c6f7720737461636b206d61726b 4618:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16289| 4619:S27|434f444547454e5f5441424c4528292e7365745374617465283629 4620:D5,144|483b65187303ff5548a801740af6c3017405483bc3eb05ff5570ebf67d0848c7c001000000c34150535049c7c0030000004889c3488b442410909090ff156600000059f6c10174064883e9027105ff5570ebf5504c8b442410488b5c24084889c8e89affffff4883f8017506584883c410c34889c3584883c410ff253000000000000000000000008800000000000000|@4622,2097151,@16276,@4422,@4621| 4621:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16277| 4622:S39|434f444547454e5f5441424c4528292e73657453746174652836296672656541626f7665283129 4623:D9,328|483b65187303ff5548488b0ba801740af6c1017405483bc1eb05ff5570ebf67c0848c7c001000000c34889df4989c24c89d3498b40109090ff1522010000a801755a488b08488339057525498b501841514150574152ff70104c8b4a104c8b4208488b1a488b4108ff15fa000000eb4448833909752b498b501841514150574152ff70104c8b4a104c8b4208488b1a488b410890ff15d6000000eb18e93b000000488b481048c7c001000000415141505741525150488b5c2408488b44242890ff15b200000048833c24017421488b1c24909090ff15a6000000eb1248c7c001000000415141505741526a016a014883c41059f6c10174064883c1027105ff5570ebf5504c8b4c24184c8b442410488b5c24084889c8909090e8e2feffff48833c240175054883c420c35b4883c418ff255300000090909000000000000000004001000000000000|@4625,2097151,@16278,@3852,@4428,@4428,@4425,@4626,@4624| 4624:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16280| 4625:S35|434f444547454e5f5441424c4528292e73657453746174652836296672656573283129 4626:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16279| 4627:D18,1680|483b65187303ff5548a801740ef64308017408483b43087c11eb05ff5570ebf348c7c001000000c21800488b1348b9ffffffffffffff0048234af8488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67c0948c7c101000000eb37a801741848b9ffffffffffffff0048234af8488d4c0901483bc172134889c148b8b0df06c9a37f0000488b5d08ff13488b5482fc4889d16a016a01a801740b41f6c0017405493bc0eb05ff5570ebf67c174889e248c702010000004889e248c7420801000000eb514889c74989db4989cc4889fb498b41109090ff15ca050000a80175174889e1488b50084889114889e1488b582048895908eb154889e048c700010000004889e048c74008010000004c89e14889f84c89db5041514152415053514989c84889c3498b41109090ff157e050000f60424017563488b0424488b0848833905752b488b5424184c8b50184c8b58104c8b60084989cd4c8b4a104c8b4208488b1a488b4108ff154a050000eb57488339097532488b5424184c8b50184c8b58104c8b60084989cd4c8b4a104c8b4208488b1a488b4108eb05e98f040000ff151a050000eb1f488b5018488b5810488b700848c7c0010000004989d24989db4989f44989cd48c7c10100000048c7c20300000048c7c3010000005041524153415441554883f92f746b4889ce40f6c60174064883c6027105ff5570ebf54889d7488d7c3fff4923d34883fa017452535756ff750848ba72a90fc9a37f00005248896508f6c10174064883f92f721148b8b0df06c9a37f0000488b5d0890ff1348ba688c0cc9a37f0000488b4c8afc4883c408eb05e9810000005a48895508eb37e953000000909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d57e8483b55107303ff55404989d748c742f80200000048895a0848890aeb074889da6a0157564889d34889fa4889f14883c418483b65187303ff5548e909ffffff48c7c101000000f6c301754b488b4424404c8b7308514c8b48104c8b4008488b13488b184889d090ff15be03000048833c2401740d488b1c24909090ff15b20300004889c14883c4084c89f3483b65187303ff5548ebb04889c84883bc248000000001740948c7c101000000eb4d498d4fd0483b4d107303ff55404989cf48c741f805000000488b542460488951204c8951184c8959104c8961084c8929488b542448504989c8488b5c2458488b4210ff15460300004889c1eb0150488b442458a80174064883c0027105ff5570ebf5ffb42488000000ffb42488000000ffb424880000004c8b5424604c8b4c24684c8b442458488b5c2450e826fcffff4883bc2480000000017466488b4c2478488b09f6c1017410f6442458017409483b4c24587e31eb05ff5570ebf2488b4c24504889c7488b5c2458488b4110ff15c2020000a8017506488b4008eb1648c7c001000000eb0d4889c148c7c0010000004889cfa8017417f6442460017410eb05e98d010000483b4424607e68eb05ff5570ebf2488b4c2460f6c1017409a8017405482bc87105ff5570ebf64883c101488b4424504989c8488b5c2458488b48104889c89090ff1552020000a80174725741505048c7c303000000488b44247048baa05f06c9a37f0000ff15360200004889c3eb05e90f01000048b890dc0ec9a37f00009090ff1522020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff1341f6c0017410f6400801740a4d8d40ff4c0340087105ff5570ebf141f6c00174084983f8017f24eb0741f640ff10741b5749c7c003000000488b5c2460488b44245890ff158a010000eb52498d4fd0483b4d107303ff55404989cf48c741f805000000488b502048895120488b581848895918488b7010488971104c8941084c8b004c89014c8b4c2450574989c8488b5c2460498b4110ff153e01000048c7c001000000eb1548c7c00100000057eb0b4889c148c7c0010000005148837c2430017507488b442408eb13488b5c2430488b442408909090ff15060100004883f8017508584883c470c218004889c3488b04244883c478594883c41851ff25e9000000488b442428a80174064883c0027105ff5570ebf5488b4c2458488b542450488b5c244848894c2458488954245048895c24484c8b5424184c8b4c24204c8b4424104883c4085b4883c430e982f9ffff909000000000000000008806000000000000|@4629,2097151,@16281,@3852,@3834,@4448,@4448,@4448,@4630,@3834,@3852,@3852,@194,@100,@4422,@3834,@4631,@4628|47,0,36028797018963967 100,0,36028797018963967 127,0,@560 536,0,$4627+618 562,0,@560 579,0,@3809 642,0,@3811 1196,0,@193 1222,0,@4379 1264,0,@4380 1282,0,@557 1303,0,@20055 4628:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16284| 4629:S42|434f444547454e5f5441424c4528292e73657453746174652836297075744f6e456e7472696573283129 4630:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16282| 4631:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16283| 4632:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16285| 4633:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16286| 4634:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16287| 4635:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16288| 4636:D3,80|488b5208f6c201752ba8017508f602017503ff5570483b02750b4889c148c7c003000000c3488b5208483b65187303ff5548ebd04889c148c7c001000000c39000000000000000004800000000000000|@4637,7,@16290| 4637:S45|434f444547454e5f5441424c4528292e726573746f72654c6f6f7053746174652834297075736865732d283129 4638:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@16292| 4639:D3,248|483b65187303ff5548a801756bf6400801756a488b4808488b11488b18488b7308483b7208752f53488b410890e8ceffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f802000000488b790848897808eb0ae95c000000e93000000048891053909090e872ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b08498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c348c7c001000000c3909090909090900000000000000000f000000000000000|@4640,63,@16293| 4640:S51|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d66696c746572283129 4641:D7,1288|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bef1ffffffffffff0f488932498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67d04c3b65107303ff55404d89e749c74424f805000000498954242049894c241849897424104d895c240849893c244889c1482bcb4883c103f6c10174084883f9017d2feb06f641ff10742741544151415053505741524889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb114889c24889c8415441514150535257415248bbf0b90fc9a37f000090ff15ca03000048837c244001740948c7c101000000eb6948833c24017467488b4c240848c70107000000498d4f90483b4d107303ff55404989cf48c741f80400000048c7411803000000488b5424304889511048c741080500000048c70117000000488d592848c743f802000000488b7424204889730848c7037b000000eb0ae972020000e92c000000488d7b1848c747f80200000048c747080100000048891f488d5f1848c743f80200000048897b0848890beb13488b4c240848c7010500000048c7c301000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b5424304889511048c741080300000048c70117000000488b74241840f6c60174084883fe017d26eb06f646ff10741e5053514889f348b810c506c9a37f000048bad0a8dc0000000000ff12eb094889c74889f0575351a80174054803c07105ff5570ebf64883e801a80174064883c0027105ff5570ebf5498d4fa8483b4d107303ff55404989cf48c741f80400000048894118488b4424384889411048c741080500000048c70109000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f802000000488951085a488911498d57d8483b55107303ff55404989d748c742f80400000048c7421803000000488b5c244048895a1048c742080100000048c70217000000488b74242040f6c60174084883fe017d26eb06f646ff10741e51524889f348b810c506c9a37f000048bad0a8dc000000000090ff12eb054889f05152a80174054803c07105ff5570ebf64883e801a80174064883c0027105ff5570ebf5498d4fa8483b4d107303ff55404989cf48c741f80400000048894118488b4424404889411048c741080500000048c70109000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f802000000488951085a48891148837c2408017506488b1424eb194889ce488b5c2408488b042490ff15020100004889c24889f14883fa01740f4889d34889c8ff15f20000004889c14883c410eb0150498d47d0483b45107303ff55404989c748c740f805000000488b54243048895020488b54242848895018488b142448895010488b5c24204889580848c70035000000498d5fe8483b5d107303ff55404989df48c743f80200000048c74308010000004889034883f90174124889d84889cb909090ff15760000004889c3498d47e0483b45107303ff55404989c748c740f803000000488b4c243848894810594883c43848894808488918c2080090909000000000000000000005000000000000|@4646,2097151,@16295,@1354,@4647,@4648,@4645|74,0,576460752303423480 285,0,@376 295,0,I106 327,0,@4642 626,0,@376 636,0,I106 873,0,@376 883,0,I106 4642:O1|@4643 4643:D3,256|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c706010000004889c7498d47d0483b45107303ff55404989c748c740f8050000004889482048897818488950104889700848891848c70303000000c390909090900000000000000000f800000000000000|@4644,63,@16294|65,0,576460752303423480 4644:S38|5838364c4f574c4556454c28292e696e6465786564436173652836296d616b654c6162283129 4645:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16298| 4646:S28|5838364c4f574c4556454c28292e696e646578656443617365283629 4647:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16296| 4648:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16297| 4649:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16299| 4650:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16300| 4651:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16301| 4652:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16302| 4653:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16303| 4654:D5,288|483b65187303ff5548488b4b20488b094883f90175134889c148b8e8c00fc9a37f0000488b5d08ff134883f801750848c7c001000000c3a80174164889c148b860c10fc9a37f0000488b5d08909090ff13488b4b38488b0950ff33ff73206a0149c7c2010000004989c949c7c001000000488b48084889c8ff15ba0000005948c701010000005948c70101000000f60424017415488b480848b8b8c10fc9a37f0000488b5d0890ff1359498d57e8483b55107303ff55404989d748c742f802000000488b0948894a0848c70239000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f9017505488b4008c34889cb488b4008ff2535000000909090909000000000000000001801000000000000|@4663,2097151,@16304,@4607,@4662|27,0,@4655 64,0,@4658 154,0,@4660 4655:O4|@20055,@557,@4657,@4656 4656:O5|@4331,2662,0,2662,0 4657:S12|4e6f74206272616e63686564 4658:O4|101,@1386,0,@4659 4659:O5|@4331,1885,0,1885,0 4660:O4|101,@1386,0,@4661 4661:O5|@4331,1884,0,1884,0 4662:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16305| 4663:S24|434f444547454e5f5441424c4528292e6669787570283229 4664:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16306| 4665:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16307| 4666:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16308| 4667:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16309| 4668:D5,312|483b65187303ff55484889d8ff153e01000048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c8498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70163000000488d411848c740f80200000048c7400801000000488908498b4858488b09f6c10174064883e9027105ff5570ebf54883f901750948c7c101000000eb60f6c10174084883f9017c08eb19f641ff1074134889c248b880790fc9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70261000000488d4a1848c741f80200000048c74108010000004889114883f90174094889cbff154a000000498b482048c70103000000498b1048c70203000000c39090909000000000000000003001000000000000|@4670,79,@16310,@4671,@4669|183,0,@4563 4669:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16312| 4670:S33|47454e45524154455f434f444528292e636f646567656e28392965786974283129 4671:D3,104|483b65187303ff5548a801753e48833801752fff30488b4008e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e9b5ffffff48c7c001000000c3909090909000000000000000006000000000000000|@260,3,@16311| 4672:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16313| 4673:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16314| 4674:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16315| 4675:D19,2344|488dbc2410ffffff483b7d187303ff5550f6c301750641f6c00174154889c148b8c0d20fc9a37f0000488b5d089090ff13498b08483b4108746f4883c002498d57d0483b55107303ff55404989d748c742f802000000488b710848897208488b3948893a4c8d5a1849c743f8020000004d8b60084d896308498913488b9424900000004c8bac24880000004c8bb424800000004c8b4424784c8b642470488b7c2468488b4c2460eb05e9fe000000488b74245841524c8b54245841514c8b4c245841534c8b5c2458ff7308488b5c245850488b44245850488b44245850488b44245850488b44245850488b44245850488b44245848899424e00000004c89ac24d80000004c89b424d00000004c898424c80000004c89a424c00000004889bc24b800000048898c24b00000004889b424a80000004c899424a00000004c898c24980000004c899c249000000048899c2488000000488b4c242048898c2480000000488b4c241848894c2478488b4c241048894c2470488b4c240848894c2468594883c42048894c243848894424304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e954feffff498d57e0483b55107303ff55404989d748c742f80300000048c74210010000004c894a08488b3348893241524151ff730841ff7008ff31504c89d34889d09090ff154e070000488b8c24c0000000488b094883f901740b4889cb9090ff153a070000488b8c24c0000000488901488b442428488b5038488b12488b5808488b1b488b7028488b36498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f08488917488b5038488b124c8b4008498910488b5058488b124c8b4828498911565357ffb424c80000005051ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d80000004c8b9424c80000004c8b8c24d00000004c8b8424d800000048c7c303000000488b842498000000488b942448010000909090ff1248837c24600175134889c148b8e8dc0ec9a37f0000488b5d08ff13f644246001756a488b4c24604883f80175164889c248b870dd0ec9a37f0000488b5d08909090ff13488b542440488b1a488b1b4883fb017420498d5ff0483b5d107303ff55404989df48c743f801000000488b00488903eb6b6a016a016a014989e249c7c1030000004c8b01488b18eb05e96b0000004889d09090ff15ae050000488b8424f00000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff158a050000488b8c24e8000000488901498d5ff0483b5d10730aeb05e91f000000ff55404989df48c743f801000000584883c408488903eb0748c7c301000000f644245801755e488b442440488b08488b094883f901754d4889de4989c0488b9c248800000048c7c0010000009090ff1522050000488b8c24d8000000488b094883f901740b4889cb9090ff150e050000488b8c24d800000048890148c7c001000000eb0a48c7c0010000004889def644242801740a4889f04883c448c290006a016a01488b442450488b4820488b094883f90174174889e148c701010000004889e148c7410801000000eb6f56ff70204c8b50584c8b48484c8b4040488b5838488b48104889c8909090ff1596040000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0feb05e90e01000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1c2448895910488941084c8901488d442408488908488d44240848895008eb0156488b8424f0000000488b004883f8017507488b442410eb114889c3488b442410909090ff1516030000488b8c24f000000048890148833c2401750948c7c001000000eb71488b0424488b542458488b384889fb488b4210ff15ea020000a8017459575048c7c3030000004889f848baa05f06c9a37f0000ff15d20200004889c348b890dc0ec9a37f000090ff15c6020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb0ae9f9000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f20eb06f641ff10741849c7c0030000004889fb488b44245890ff1536020000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c24584989d04889fb498b4110909090ff15ea01000048c7c001000000488b8c24f0000000488b094883f901740c4889cb909090ff15ce010000488b8c24f000000048890148c7c001000000488b4424304883c4084883c002ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004c8b9424e00000004c8b8c24d80000004c8b8424c8000000488b9c24d00000009090e862f7ffff6a016a014989e24c8b4c24204989c0488b5c2460488b44241090ff15f2000000488b442460488b4808488b542428488911488b5028488b5c243048891a488b9c24f8000000488b1b4883fb017507488b5c2408eb0e488b442408ff15ba0000004889c3488b8424f8000000488918584883c460c290009090909000000000000000002009000000000000|@4680,2097151,@16316,@4654,@4681,@4504,@4682,@4668,@4683,@4594,@4684,@3852,@194,@100,@4422,@3834,@4685,@4686,@4679|33,0,@4676 787,0,@4381 824,0,@4384 1307,0,576460752303423480 1704,0,@193 1723,0,@4379 1764,0,@4380 1794,0,@557 1808,0,@20055 4676:O4|@20055,@557,@4678,@4677 4677:O5|@3867,884,0,884,0 4678:S24|67656e43617365202d206e756c6c2063617365206c697374 4679:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16356| 4680:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d67656e4361736573283329 4681:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16317| 4682:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16318| 4683:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16319| 4684:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16320| 4685:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16321| 4686:D13,1440|483b65187303ff55484883f80175134d890249c742080100000048c7c001000000c3488b4b20488b094883f901746da80174164889c148b860c10fc9a37f0000488b5d08909090ff13a80174144889c148b8a0dc0fc9a37f0000488b5d0890ff13415250ff33ff73206a0149c7c2030000004d8b094c8b4010488b48084889c8ff15320500005948c701010000005948c70101000000f6042401eb05e9a4000000741a488b08488b500848b8b8c10fc9a37f0000488b5d08909090ff1359498d57e8483b55107303ff55404989d748c742f802000000488b0948894a0848c70239000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f9017506488b4808eb18488b304889cb488b4008909090ff159a0400004889c1eb03488b30488b04244889304889480848c7c0010000004883c408c3a80174144889c148b860c10fc9a37f0000488b5d0890ff13a80174144889c148b8a0dc0fc9a37f0000488b5d0890ff136a016a016a01415250ff33ff7320534151488d4c2430514d89ca4d89c14989d8488b5810488b48084889c8ff152204000048837c243001746a6a016a01488b442418488b4820488b094883f90174174889e148c701010000004889e148c7410801000000eb75ff70204c8b50584c8b48484c8b4040488b5838488b48104889c8909090ff15d2030000498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e9d6020000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0feb05e90901000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b5c244848895910488941084c89014889e04889084889e048895008f644243001741048b860c10fc9a37f0000488b5d08ff13488b442430a8017417488b480848b8a0dc0fc9a37f0000488b5d08909090ff13488b4c24106a0149c7c2030000004c8b094c8b4010488b5c2420488b50084889d09090ff151a020000488b4c242848c70101000000488b4c242048c701010000006a016a01ff70084c8d5424084c8b4c24284c8b00488b5c2430488b44241890e806fcfffff644244801741048b8b8c10fc9a37f0000488b5d08ff13488b442448498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70139000000498d47e8483b45107303ff55404989c748c740f80200000048c740080100000048890848837c2468017507488b4c2420eb1a4889c6488b5c2468488b44242090ff155e0100004889c14889f04883f901740c4889cb909090ff154e0100004883f8017506488b0424eb104889c3488b0424909090ff153a0100004883f8017507488b442410eb0f4889c3488b44241090ff1526010000488b4c24504883c4085a4883c4184889114889410848c7c0010000004883c448c3f644242001741348b8b8c10fc9a37f0000488b5d08909090ff13488b442420498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70139000000498d47e8483b45107303ff55404989c748c740f80200000048c740080100000048890848837c244001740b488b5c2440ff1592000000488b4c2428488b5424384889114889410848c7c0010000004883c448c3909090909000000000000000009805000000000000|@4690,2097151,@16322,@4607,@4691,@4692,@4594,@4607,@4763,@4764,@4765,@4766,@4689|56,0,@4658 82,0,@4687 172,0,@4660 334,0,@4658 358,0,@4687 582,0,576460752303423480 871,0,@4658 900,0,@4687 1027,0,@4660 1276,0,@4660 4687:O4|101,@1386,0,@4688 4688:O5|@4331,1886,0,1886,0 4689:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16355| 4690:S27|434f444547454e5f5441424c4528292e6d657267654c6162283429 4691:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16323| 4692:D37,3952|488dbc2408ffffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004983784801746d51415041ff7048415141ff70585041ff701841ff703841525341ff700841ff704049c7c00100000048bbd0ee0fc9a37f0000488b4424509090ff150e0f0000488b442430ff7008ff701048b8f0ee0fc9a37f0000488b542410ff1248c7c015000000488b5424109090ff12eb05e94001000048b8f0910fc9a37f0000488b542410ff1248c7c303000000488b44240848baa05f06c9a37f0000ff15b60e0000488b54241090ff1248b8b8920cc9a37f0000488b542410909090ff1248c7c3030000005848baa05f06c9a37f0000ff158a0e0000488b54240890ff1248c7c015000000488b5424089090ff1258a80174084883f8017c5feb06f640ff10755c488b4c2430488b1948baffffffffffffff00482353f8488d541201a801740af6c2017405483bc2eb05ff5570ebf67c0948c7c201000000eb43a801741848baffffffffffffff00482353f8488d541201483bc2721feb0ae94f000000e94a0000004889c248b8b0df06c9a37f0000488b5d08ff13488b5c83fc4889da504c8b4424084889d39090ff15da0d000058a80174064883e8027105ff5570ebf5483b65187303ff5548e943ffffff48c7c001000000eb294889c248c7c00100000051415041ff7048415141ff70585241ff701841ff703841525341ff70086a01488b442408488b00488b4c2418a8017508f601017503ff5570483b01741148b810ef0fc9a37f0000488b5d0890ff136a016a0148837c242001753548837c245001741048b880ef0fc9a37f0000488b5d08ff134889e048bae88b0cc9a37f00004889104889e048c7400801000000eb6d488b442420f6442450017413488b1048b880ef0fc9a37f0000488b5d08ff13488b542450488b5c2440f60001741b488b3b48beffffffffffffff00482377f8488d743601483b307716488b3048b8b0df06c9a37f0000488b5d08909090ff13488b00488b4487fca801741ceb05e92a0400004889c648b870a00fc9a37f0000488b5d089090ff13488b3048833e0975064c8b4608eb6b4883781001740748837810017517488b701048b810f00fc9a37f0000488b5d08909090ff1349c7c00100000049c7c1030000004983f82f7514488b701048b878ed0ec9a37f0000488b5d08ff134d89ca4c2350104983fa01751b4983c0024f8d4c09ff483b6518730aeb05e9b9000000ff5548ebbe41f6c00174084983f8017d27eb0741f640ff10741eff324c89c348b810c506c9a37f000048bad0a8dc000000000090ff12eb054c89c0ff32ff750848b93ee20fc9a37f00005148896508a80174064883f82f72144889c148b8b0df06c9a37f0000488b5d0890ff1348b9688c0cc9a37f0000488b4481fc4989c04883c4085848894508eb31488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13ff32498338017513498b4008a80174064883c0207123ff5570ebf549837810037513498b4008a80174064883c0107109ff5570ebf5498b4008a8017513488b08f640ff10740348f7d9488d4c0901eb034889c148c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c09016a016a016a0141504c8d54240849c7c1030000004989c0488b5c2420488b84248800000090ff15be0a0000488b842488000000488b5c2410488b48104889c89090ff15aa0a0000a801746e5048c7c303000000488b44241848baa05f06c9a37f0000909090ff158e0a00004889c348b890dc0ec9a37f000090ff15820a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2410488b842488000000ff15f2090000eb61498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424880000004d8b48104989d0488b5c24104c89c8909090ff159e09000048c7c001000000488b0c24488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901504889d3488b84249000000090ff150a09000048837c2420017506488b4008eb12488b5c2420488b4008909090ff15f20800004883f8017506488b0424eb104889c3488b0424909090ff15de080000488d4c24304883c4085a4883c4204889114889e148894108488b442430488b00a80174064883e8027105ff5570ebf5488b4c242848c7c201000000ff31a801740ef60424017408483b04247c59eb05ff5570ebf3505249c7c0030000004889c3488b44247890ff157a08000048833c2401740d488b1c24909090ff156e0800004883c40859f6c10174064883e9027105ff5570ebf54889c24889c8483b65187303ff5548eb974889d0488b4c24384883c408488b09f6c10174064883e9027105ff5570ebf548c7c20100000050f6c10174084883f9017c3feb06f641ff107537514c8b4c24504c8b4424704889cb4889d090ff15fe07000059f6c10174064883e9027105ff5570ebf54889c2483b65187303ff5548ebb64889d0488b4c2438488b09f6c10174064883e9027105ff5570ebf548c7c20100000050f6c10174084883f9017c54eb06f641ff107551488b4424704889cf4989d04889fb488b48104889c8ff1596070000a8017543488b084883390b753a488b5108f6c20174064883c2027105ff5570ebf5f6c201741541f6c001740f493bd0eb0fe936000000e931000000ff5570ebec7f084c89c2eb034c89c240f6c70174064883ef027105ff5570ebf54889f9483b65187303ff5548e966ffffff4889d0488b4c2450488b542440488b12f6c20174064883ea027105ff5570ebf5488b591050f6c20174084883fa017c5feb06f642ff10755c488b4424784889d74989d84889fb488b50104889d090ff15de060000488b4c2458488b1948baffffffffffffff00482353f8488d54120140f6c701740af6c2017405483bfaeb05ff5570ebf67c1348c7c201000000eb44e9cc000000e9c700000040f6c701741848baffffffffffffff00482353f8488d541201483bfa72144889c248b8b0df06c9a37f0000488b5d0890ff13488b5cbbfc4889daa8017548488b004883380b745bf6c2017556488b024883380b754d41f6c001740ef640080174084c3b40087e0beb05ff5570ebf34c8b400841f6c0017413f6042401740d4c3b04247c0ceb1ce917000000ff5570ebee48b888f00fc9a37f0000488b5d089090ff1340f6c70174064883ef027105ff5570ebf54889fa4c89c3483b65187303ff5548e9c5feffff4889d8a801740ef60424017408483b04247d0beb05ff5570ebf3488b0424488b542460488b12a801740af6c2017405483bc2eb05ff5570ebf67d6e488b542460488b12f6c2017409a8017405482bd07105ff5570ebf64883c2014883fa01750948c7c201000000eb67f6c20174084883fa017c08eb19f642ff1074134889c348b880790fc9a37f0000488b5d08ff13498d5fd0483b5d107303ff55404989df48c743f802000000eb05e92c0000004889530848c70361000000488d531848c742f80200000048c742080100000048891a488b5c2460488903eb0748c7c201000000ff74247851ff35ee0400005249c7c20100000049c7c1010000004c8d44240848c7c3ffffff00488b84249800000048ba78e00ec9a37f000090ff15c2040000488b4c2468488b09f6c10174064883e9027105ff5570ebf5504c8b5424784c8b8c24800000004c8b8424a000000048c7c3010000004889c89090ff158a040000488b4c2470488b09f6c10174064883e9027105ff5570ebf548c7c20100000050f6c10174084883f9017c54eb06f641ff10754c51ffb424b80000004c8b9424900000004c8b8c24980000004c8b8424b80000004889cb4889d090ff153204000059f6c10174064883e9027105ff5570ebf54889c2483b65187303ff5548eba14889d0488b8c2488000000488b942490000000488b12f6c201740ef64110017408483b51107e1feb05ff5570ebf3488b9424b000000048c7020300000048c7c301000000eb0748c7c301000000488b9424b0000000488b124883fa01740948c7c101000000eb27504c8b8c24b00000004c8b8424980000004889cb48c7c00100000090ff15920300004889c1eb01506a016a014883bc24b00000000175174889e048c700010000004889e048c7400801000000eb6d498d47b0483b45107303ff55404989c748c740f80300000048c7401001000000488b5424604889500848c70009000000488b9424c0000000488b5a38488b1b488d702048c746f80500000048c746200100000048c746180100000048c746100100000048c7460803000000eb05e9910000004889065153ff7248ff72384989f0488b42109090ff15e2020000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb508b0ec9a37f0000488b8424d80000009090ff15aa020000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908488d4c2408488901488d44240848c7400801000000eb01514883bc24c000000001742149c7c00100000048bbd0ee0fc9a37f0000488b8424c80000009090ff154e020000488b8424d0000000488b0048837c2470017507488b4c2460eb1c4889c6488b5c2470488b442460909090ff15260200004889c14889f04883f9017507488b4c2458eb174889c64889cb488b442458ff150a0200004889c14889f04883f9017507488b4c2430eb174889c64889cb488b442430ff15ee0100004889c14889f04883f9017507488b4c2428eb174889c64889cb488b442428ff15d20100004889c14889f04883f9017507488b4c2420eb174889c64889cb488b442420ff15b60100004889c14889f04883f9017507488b4c2418eb174889c64889cb488b442418ff159a0100004889c14889f04883f9017506488b0c24eb184889c64889cb488b04249090ff157e0100004889c14889f04883f9017507488b4c2410eb174889c64889cb488b442410ff15620100004889c14889f0488b9424e00000004883c408488902584881c4c80000004889420848894a1048c7c001000000c208009090900000000000000000680f000000000000|@4708,2097151,@16324,@3643,@194,@194,@3842,@4504,@3852,@194,@100,@4422,@3834,@4529,@4709,@4710,@4422,@4711,@4712,@3852,@3852,@4717,@4406,@4719,@4730,@4751,@3834,@3643,@3643,@4756,@4757,@4758,@4759,@4760,@4761,@4762,@4707|101,0,@4693 135,0,@4694 175,0,@4596 204,0,@193 228,0,@3830 256,0,@193 323,0,36028797018963967 376,0,36028797018963967 415,0,@560 566,0,@4695 603,0,@4698 622,0,@3805 663,0,@4698 697,0,36028797018963967 724,0,@560 765,0,@4609 816,0,@4701 859,0,@4414 941,0,@376 951,0,I106 974,0,$4692+1046 1002,0,@560 1019,0,@3809 1070,0,@3811 1305,0,@193 1327,0,@4379 1368,0,@4380 1386,0,@557 1407,0,@20055 2364,0,36028797018963967 2431,0,36028797018963967 2458,0,@560 2569,0,@4704 2751,0,@4563 2895,0,@4404 3462,0,@4334 3562,0,@4693 4693:S10|6d657267655374617465 4694:S11|7361766564207374617465 4695:O4|@20055,@557,@4697,@4696 4696:O5|@4331,2157,0,2157,0 4697:S6|4d61726b6572 4698:O4|@20055,@557,@4700,@4699 4699:O5|@4331,2190,0,2190,0 4700:S37|6d657267655374617465202d204d69736d61746368656420726573756c7420737461746573 4701:O4|@20055,@557,@4703,@4702 4702:O5|@4331,2175,0,2175,0 4703:S14|4e6f742061207265676973746572 4704:O4|@20055,@557,@4706,@4705 4705:O5|@4331,2321,0,2321,0 4706:S28|6d6572676553746174653a20756e70757368656420656e7472696573 4707:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16350| 4708:S29|434f444547454e5f5441424c4528292e6d657267655374617465283529 4709:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16325| 4710:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16326| 4711:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16327| 4712:D16,1048|483b65187303ff55484889c74989da4c89d3498b40109090ff1512040000498b1148b9ffffffffffffff0048234af8488d4c090141f6c201740af6c10174054c3bd1eb05ff5570ebf67c0948c7c101000000eb3941f6c201741848b9ffffffffffffff0048234af8488d4c09014c3bd172134889c148b8b0df06c9a37f0000488b5d08ff134a8b5492fc4889d1a8017561f6c10175614883782001745f488b5020f6412001755a488b5920488b3240f6c6017508f603017503ff5570483b33746a5741524150ff31ff30ff7110ff7010ff7018ff700852ff7108ff3348c7c3030000004889f048baa05f06c9a37f0000eb14e9f1020000e9d6020000e9b4000000e9b30000009090ff152a0300004889c348b8e8f70fc9a37f000090ff151e03000048c7c341000000eb05e989000000ff15120300005048c7c303000000488b44240848baa05f06c9a37f0000909090ff15fa0200004889c3584883c4089090ff15f2020000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba18f80fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b51204883780801740748837908017555488b5010483b5110741f483b51107419574c89c149c7c0010000004c89d34889c8ff1572020000eb4b488b1848833b05754f488b3148833e05754b4c8b4b084c3b4e08745249833901751d4c8b5e0849833b01eb05e91301000075544d8b61084d3b63087440eb554983390375544c8b5e08eb05e9b001000049833b03755ceb0ae972000000e96d0000004d8b61084d3b63087546eb05e90a0000004d8b69104d3b6b1075354c8b5b1041f6c301eb05e9260000007515f6461001eb0ae919000000e9140000007503ff55704c3b5e10750948c7c001000000eb1a574d89c349c7c0010000004c89d34c89d890ff15ae010000eb5357eb5548833b0b7554488b3148833e0b754b4c8b4b0841f6c1017509f64608017503ff55704c3b4e08750948c7c001000000eb1c574d89c349c7c0010000004c89d34c89d8909090ff1566010000eb4c57eb4ee9dc000000e9d7000000574c89c149c7c0010000004c89d34889c89090ff1546010000eb64483b50207463f6402001752af6c2017525488b4820488b19f6c3017514f60201750feb0ae993000000e98e000000ff5570483b1a745e498d4fd0483b4d107303ff55404989cf48c741f80500000048895120488b501848895118488b581048895910eb0ae953000000e926000000488b7008488971084c8b084c8909574d8b58104989c84c89d34c89d89090ff15ba000000eb015748c7c001000000eb1e574c89c049c7c0010000004c89d3ff15a2000000eb0848c7c0010000005748833c240175054883c408c35bff258d000000909090909000000000000000001004000000000000|@4716,2097151,@16328,@3852,@194,@100,@100,@194,@100,@4422,@4422,@4422,@4422,@3834,@4422,@4715|35,0,36028797018963967 92,0,36028797018963967 119,0,@560 232,0,@193 275,0,@4713 325,0,@193 384,0,@4714 402,0,@557 416,0,@20055 4713:S30|6d657267653a206d69736d6174636865642064657374696e6174696f6e20 4714:O5|@4331,2232,0,2232,0 4715:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16329| 4716:S40|434f444547454e5f5441424c4528292e6d657267655374617465283529666978456e747279283229 4717:D4,256|483b65187303ff5548488b4a104889c74989d04889fb488b41109090ff15f60000004d8b4008498b1048b9ffffffffffffff0048234af8488d4c090140f6c701740af6c1017405483bf9eb05ff5570ebf67c0948c7c101000000eb3940f6c701741848b9ffffffffffffff0048234af8488d4c0901483bf972134889c148b8b0df06c9a37f0000488b5d08ff13488b7cbafc4889f9a801751f488b1848833b0b7516f6c1017511488b3148833e0b750848c7c001000000c3a8017526f6c1017519488b094883390b740848c7c001000000c348c7c003000000c348c7c001000000c348c7c001000000c39090909090900000000000000000f800000000000000|@4718,127,@16330,@3852|43,0,36028797018963967 100,0,36028797018963967 127,0,@560 4718:S40|434f444547454e5f5441424c4528292e6d6572676553746174652835296d75737450757368283129 4719:D7,1152|483b65187303ff5548a80174084883f8017c63eb06f640ff1075604889df4989c34c89db498b4010ff156a040000498b1148b9ffffffffffffff0048234af8488d4c090141f6c301740af6c10174054c3bd9eb05ff5570ebf67c0948c7c101000000eb4541f6c301742448b9ffffffffffffff00eb0ae9ed030000e9e803000048234af8488d4c09014c3bd972134889c148b8b0df06c9a37f0000488b5d08ff134a8b549afc4889d1a801755f488b1048833a0b750948c7c101000000eb64f6c1017564488b1948833b09755b498d77f0483b75107303ff55404989f748c746f8010000004c8b63084c8926415241514150574153ff7020ff7018415041524c8b50084c8b48104989d0eb05e9fd0200004889f34c89d890ff15820300004889c1eb5ae9db02000048833a057554f6c1017554488b1948833b057568488b721040f6c6017509f64310017503ff5570483b7310743c4c8b60184c8b68204c8b7008415241514150574153ff701048b830ff0fc9a37f0000488b5d08eb0fe99c020000e96a020000e965020000909090ff134c8b62084c3b6308745e49833c2401751feb05e9480200004c8b6b0849837d000175354d8b7424084d3b7508752aeb5f49833c240375214c8b6b0849837d000375164d8b7424084d3b7508750b498b542410493b55107467488b5110482350104883fa01745eeb05e9e10100004883fa017456488b49104823481048c7c20100000048c7c3030000004883fa2feb05e9ba010000753e488b70184c8b60204c8b68084c8b70104152415141505741534156ff3048b878ed0ec9a37f0000eb0fe98a010000e930010000e92b010000488b5d08ff134889de4823f14883fe0175144883c202488d5c1bff483b65187303ff5548eb95f6c20174084883fa017d3ceb06f642ff107434415241514150574153ff7010ff30ff7018ff7020ff70084889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb26488b4818488b5820488b70084c8b60104c8b284889d041524151415057415341544155515356ff750848b9a6fd0fc9a37f00005148896508a80174064883f82f72134889c148b8b0df06c9a37f0000488b5d08ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb1e48c7c101000000415241514150574153ff7010ff30ff7018ff7020ff7008ff742408ff742418ff742448ff7424604c8b5424204c8b4c24404c8b4424384889cb488b44244890ff15d20000004889c14883c428eb3f48c7c101000000415241514150574153eb2d48c7c101000000415241514150574153eb1b415241514150574153eb1048c7c10100000041524151415057415358a80174064883e8027105ff5570ebf548833c240174174889c6488b1c244889c890ff156a0000004889c14889f04c8b5424184883c4084c8b4c240841584883c4104889cbe998fbffff4889d8c39090909000000000000000007804000000000000|@4724,2097151,@16331,@3852,@4725,@4725,@4723|51,0,36028797018963967 108,0,36028797018963967 147,0,@560 367,0,@4720 582,0,@4414 692,0,@376 702,0,I106 759,0,$4719+830 787,0,@560 803,0,@3809 854,0,@3811 4720:O4|@20055,@557,@4722,@4721 4721:O5|@4331,2487,0,2487,0 4722:S25|6d657267653a206d69736d617463686564206f666673657473 4723:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16336| 4724:S43|434f444547454e5f5441424c4528292e6d6572676553746174652835296c6f6164456e7472696573283229 4725:D15,968|483b65187303ff55486a016a01f6c3017545498338097544498b4808483b0b745e488339017515488b1348833a01753b488b7108483b7208745eeb2f488339037529488b1348833a037520488b7108483b72087516eb0ae9a4010000e90a000000488b7910483b7a107462488b0b48833901751b488b5108f6c201740deb05e98a0000004883c220712bff5570ebf54883791003751beb05e971000000488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017518488b32f642ff10740348f7de488d743601eb08e93c0000004889d64889f148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014923d14883fa01743d4883fa017437488b4c2420488b51184989c34c8b234c8b4a104c8b4208488b1a4c89e090ff15ae0200004889e04c89204889e048c7400801000000eb6d488b0b488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b32f642ff10740348f7de488d743601eb034889d64889f148c7c2030000004883ea014883f97f760eeb05e94300000048c7c17f00000048d1e948d3e24883ca01488d4c0901504152ff334889d3488b4424389090ff1506020000488d4c24185a488911488d4c2410488b400848894108eb3441534152eb2e50415248c7c39fff0000488b44243090ff15da010000488d4c2410488b10488911488d4c2410488b580848895908488b442430488b5c2408488b48104889c890ff15b2010000a8017548488b004883380b753f488b4424284c8b48104c8b4008488b18488b442410ff159201000048837c24180175074883c420c22000488b5c24184883c420594883c42051ff25760100004c8b442410488b5c2408488b442430909090ff1566010000488b4c24304889c7488b5c2408488b411090ff1556010000a801751a5749c7c001000000488b5c2410488b442438ff1542010000eb0848c7c00100000057498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424184889510848c70109000000498d57d0483b55107303ff55404989d748c742f805000000488b5c244848895a20488b7424404889721848c7421001000000488b7c240848897a0848890a488b4c2438504989d0488b5c2418488b4110ff15ba00000048837c2428017507488b442408eb11488b5c2428488b44240890ff15a20000004883f8017508584883c428c220004889c3488b04244883c430594883c42051ff258500000090909090900000000000000000c003000000000000|@4727,2097151,@16332,@4448,@4529,@4529,@3852,@4428,@4728,@4540,@3852,@4422,@3834,@4729,@4726| 4726:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16335| 4727:S41|434f444547454e5f5441424c4528292e6d6572676553746174652835296c6f6164546f526567283729 4728:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16333| 4729:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16334| 4730:D13,1632|483b65187303ff55484889c74989db4c89db498b40109090ff155a060000498b1148b9ffffffffffffff0048234af8488d4c090141f6c301740af6c10174054c3bd9eb05ff5570ebf67c0948c7c101000000eb3941f6c301741848b9ffffffffffffff0048234af8488d4c09014c3bd972134889c148b8b0df06c9a37f0000488b5d08ff134a8b549afc4889d1a8017563f6c1017563488b10488b1a48be360710c9a37f0000488d749efcffe690e96c010000909090e915020000909090e92f020000909090e99c030000909090e90b000000909090e941040000909090488b5a0848833b017521488b730840f6c6017412eb0ae926050000e9210500004883c6207125ff5570ebf548837b10037515488b730840f6c60174064883c6107109ff5570ebf5488b730840f6c60175134c8b06f646ff10740349f7d84f8d440001eb034989f0488b314c8b49104c89c149c7c0030000004983e8014883f97f760748c7c17f00000048d1e949d3e04983c801488d4c09014d23c14983f80174064983f801755048833e0b751248b8600d10c9a37f0000488b5d089090ff1348833e09754d483b5e08744c48833b017516488b4e084883390175434c8b43084c3b41087539eb5148833b037531488b4e0848833903eb05e93c00000075204c8b43084c3b410875164c8b4b104c3b4910eb0ae915000000e91c000000741a488b4c240848c70103000000eb0c488b4c240848c7010300000048c7c101000000eb6e488b1948833b017421488b70104c8b48204c8b60184c8b680848b8e00d10c9a37f0000488b5d0890ff13488b7010482371104d8d4fd04c3b4d107303ff55404d89cf49c741f8050000004c8b60204d8961204c8b68184d896918498971104c8b70084d897108498911574152eb05e98a030000ff70105641ff70104d89c84c89db58909090ff15d603000048c7c0ffffffff483304244883c00148234424084889c34883c410589090ff15ba030000eb60488b0948833903741048b8580e10c9a37f0000488b5d08ff1348c7c101000000eb61488b5910483b58107406483b5810750948c7c601000000eb5f488b3148833e0574294c8b48104c8b60204c8b68184c8b700848b8e00e10c9a37f0000eb05e9e2020000488b5d089090ff134c8b4a084c3b4e0874534983390175264c8b6608eb05e9bb02000049833c240175524d8b69084d3b6c2408eb05e9f50000007430eb5d49833903755c4c8b660849833c240375564d8b69084d3b6c240875694d8b71104d3b742410eb05e902000000755c482358104d8d67d04c3b6510730aeb05e992000000ff55404d89e749c74424f8050000004c8b68204d896c2420eb0fe973000000e96e000000e9690000004c8b70184d8974241849895c24104c8b70084d89742408eb0ae94b000000e9460000004c8b304d893424574152ff70105341ff70104d89e04c89db5890ff156e02000048c7c0ffffffff483304244883c00148234424084889c34883c410589090ff1552020000eb174c8b44240849c7000300000049c7c2010000004c89d0574889c6eb6b57eb6d488b1948833b077421488b70104c8b48204c8b60184c8b680848b8600f10c9a37f0000488b5d0890ff13488b7010482371104d8d4fd04c3b4d107303ff55404d89cf49c741f8050000004c8b60204d8961204c8b68184d896918498971104c8b70084d897108eb0ae93a010000e935010000498911574152ff70105641ff70104d89c84c89db589090ff15aa01000048c7c0ffffffff483304244883c00148234424084889c34883c410589090ff158e010000eb68488b1948833b0b7564488b720840f6c6017509f64308017503ff5570483b730874234c8b48104c8b60204c8b68184c8b700848b8d80f10c9a37f0000488b5d08909090ff134c8b48104c2349104d8d67d04c3b65107303ff55404d89e749c74424f805000000eb0ae982000000e9660000004c8b68204d896c24204c8b70184d897424184d894c24104c8b70084d897424084c8b304d893424574152ff7010415141ff70104d89e04c89db58ff15e200000048c7c0ffffffff483304244883c00148234424084889c34883c410589090ff15c6000000eb17488b74240848c7060300000049c7c0010000004c89c0574889c64889f1eb01574889c84889c1eb0b57eb0848c7c1010000005748833c2401750a4889c84883c408c20800488b1c244889c84883c408594883c40851ff25710000009000000000000000005806000000000000|@4750,2097151,@16337,@3852,@3834,@4425,@3834,@4425,@3834,@4425,@3834,@4425,@4749|35,0,36028797018963967 92,0,36028797018963967 119,0,@560 158,0,$4730+174 397,0,@4731 570,0,@4734 731,0,@4737 806,0,@4740 1154,0,@4743 1360,0,@4746 4731:O4|@20055,@557,@4733,@4732 4732:O5|@4331,2554,0,2554,0 4733:S21|6d657267653a20756e70757368656420656e747279 4734:O4|@20055,@557,@4736,@4735 4735:O5|@4331,2570,0,2570,0 4736:S16|436f6465726566206d69736d61746368 4737:O4|@20055,@557,@4739,@4738 4738:O5|@4331,2604,0,2604,0 4739:S27|6d657267653a206d69736d61746368656420436f6e7461696e6572 4740:O4|@20055,@557,@4742,@4741 4741:O5|@4331,2585,0,2585,0 4742:S24|6d657267653a206d69736d61746368656420446972656374 4743:O4|@20055,@557,@4745,@4744 4744:O5|@4331,2564,0,2564,0 4745:S16|4c69746572616c206d69736d61746368 4746:O4|@20055,@557,@4748,@4747 4747:O5|@4331,2594,0,2594,0 4748:S31|6d657267653a206d69736d61746368656420737461636b20656e7472696573 4749:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16338| 4750:S44|434f444547454e5f5441424c4528292e6d657267655374617465283529636865636b456e7472696573283229 4751:D7,280|483b65187303ff5548498b08f6c101740ef64310017408483b4b107c08eb05ff5570ebf3c36a016a01504151415053488d5c24204c89c848ba10260fc9a37f0000909090ff15e600000048837c242001743448837c2418017507488b442428eb11488b5c2418488b44242890ff15c60000004c8b4c24104c8b4424085b4883c428e97affffff488b442408488b00a80174064883c0027105ff5570ebf5488b4c24084889014c8b4c24104989c8488b1c2448b838290fc9a37f00009090e83effffff48837c2418017507488b4c2428eb1b4889c6488b5c2418488b4424289090ff155a0000004889c14889f04883f90175054883c430c34889cb4883c430ff25440000009090909000000000000000001001000000000000|@4753,1048575,@16339,@4475,@4754,@4755,@4752|57,0,@4464 179,0,@4469 4752:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16342| 4753:S50|434f444547454e5f5441424c4528292e6d657267655374617465283529616c69676e436f64652d616464416c69676e283129 4754:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16340| 4755:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16341| 4756:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16343| 4757:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16344| 4758:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16345| 4759:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16346| 4760:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16347| 4761:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16348| 4762:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16349| 4763:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16351| 4764:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16352| 4765:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16353| 4766:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16354| 4767:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16357| 4768:D7,320|483b65187303ff5548505349c7c00100000048c7c30100000048ba90e00ec9a37f000090ff152e0100006a016a014c8b4c24184989e04889c3488b4424109090ff151a010000498d47b0483b45107303ff55404989c748c740f80300000048c7401001000000594889480848c70003000000488b4c2410488b5138488b12488d582048c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890352ff7148ff71384989d84889d3488b41109090ff15a2000000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d4c8b44241048bbd01b10c9a37f0000488b442420909090ff156e000000498d47e8483b45107303ff55404989c748c740f802000000488b4c24104883c40848894808594883c418488908c300000000000000003801000000000000|@4771,2097151,@16358,@4465,@4770,@3834,@3643|27,0,@4405 236,0,@4769 4769:S17|72657365727665537461636b5370616365 4770:D4,40|483b65187303ff55484c89c14989d84889cbff252800000000000000000000002000000000000000|@4773,2097151,@16359,@4772| 4771:S36|434f444547454e5f5441424c4528292e72657365727665537461636b5370616365283229 4772:D6,472|483b65187303ff55484883f801751348c703010000004c89430848c7c001000000c3a80174064883e8027105ff5570ebf56a016a01534151488d5c2410e8beffffff488b0424488b4858488b09488b5058488b12f6c20174064883c2027105ff5570ebf5488b5858488913488b13488b7030488b36f6c201740b40f6c6017405483bd6eb05ff5570ebf67e0a488b1b488b503048891a498d57a8483b55107303ff55404989d748c742f80200000048894a0848c7020b000000488b5838488b1b488d721848c746f80100000048890e488d4e1048c741f8050000004889712048c741180100000048c741100100000048c741080300000048891153ff7048ff70384989c8488b48104889c890ff15de000000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb188a0ec9a37f0000488b44241090ff15aa000000498d47e8483b45107303ff55404989c748c740f802000000488b4c24204883c40848894808594883c40848890848837c241001750c48b938290fc9a37f0000eb214889c6488b5c241048b838290fc9a37f0000909090ff15560000004889c14889f0488b142448890248894a0848c7c0010000004883c418c3900000000000000000d001000000000000|@4775,2097151,@16360,@3834,@3643,@4774|314,0,@4327 389,0,@4469 409,0,@4469 4773:S50|434f444547454e5f5441424c4528292e72657365727665537461636b537061636528322970757368456e7472696573283229 4774:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16361| 4775:S52|434f444547454e5f5441424c4528292e72657365727665537461636b537061636528322970757368456e74726965732832292829 4776:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16362| 4777:D27,2216|483b65187303ff5548488338057566488b4808f6c10174084883f9017d08eb1ff641ff107519498b11f6c101740af6c2017405483bcaeb05ff5570ebf67c1248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5498b4c89fc4883fb01740e48c7c001000000eb71e95c0100004889cf4889fb498b4210ff1536080000a801745d41505741525048c7c3030000004889f848baa05f06c9a37f0000ff151a0800004889c348b890dc0ec9a37f000090ff150e080000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb0ae9cd000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f20eb06f641ff10741841505749c7c0030000004889fb4c89d0ff157e070000eb57498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4150574989d04889fb498b421090ff153607000048c7c001000000eb08e903000000415051488b4c24085a4889114889410848c7c0010000004883c408c22000488338017564f6400801741e488b54242048b9ffffffffffffff0048234af8488d4c0901483b48087715488b480848b8b0df06c9a37f0000488b5d0890ff13488b4008488b4482fc48833803756948c7c101000000ff7008498b4238488b00f6c1017410a801740ceb05e955040000483bc8eb05ff5570ebf67c6e498d47a8483b45107303ff55404989c748c740f802000000488b0c244889480848c7000b000000498b5238488b12488d581848c743f801000000eb05e99d02000048890b488d731048c746f80500000048895e2048c746180100000048c746100100000048c7460803000000eb05e969000000488906415041525241ff724841ff72384989f04889d3498b42109090ff1502060000488b442410a80174064883c0027105ff5570ebf5488b0c2448890148837c240801741d49c7c00100000048bbc02910c9a37f0000488b44241890ff15ca050000488b442410eb594889cf4889fb498b421090ff15ba050000a801755f488b084883390b755b488b5108f6c2017509f60424017503ff5570483b142475694889fb498b42109090ff158e050000a801745b415041526a016a0141ff72385750eb05e98201000048c7c3030000004889f848baa05f06c9a37f0000eb0ae945010000e94001000090ff15560500004889c348b890dc0ec9a37f000090ff154a050000498d4fd8eb0ae9f8000000e94b000000483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f2ceb06f641ff107424415041526a016a0141ff72385749c7c0030000004889fb4c89d09090ff15ae040000eb5a498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a415041526a016a0141ff7238574989d04889fb498b4210909090ff155a04000058eb4440f6c70174064883c7027105ff5570ebf54889f9483b65187303ff5548e943fdffff40f6c70174064883c7027105ff5570ebf54889f9483b65187303ff5548e921fdffff488b4c24204883c42048890148c741080100000048c7c0010000004883c410c220004883fb01756d488b78084889fb498b4210ff15e2030000a801745d41504152575048c7c3030000004889f848baa05f06c9a37f0000ff15c60300004889c348b890dc0ec9a37f000090ff15ba030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb0ae9c9000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c41506a015749c7c0030000004889fb4c89d09090ff1526030000eb5b498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a41506a01574989d04889fb498b4210909090ff15da020000eb0741506a01ff7008488b442410594883c40848890848c740080100000048c7c0010000004883c408c22000498d4fe0483b4d107303ff55404989cf48c741f80300000048bae02910c9a37f0000488911488b542418488951084c895110488061ffbf6a016a0141504152534c8d4c24184d89d04889cb488b5424389090ff1248833c2401746548837c2430017462488b442408488b5c2440488b48104889c89090ff153a020000a80174765048c7c303000000488b44244848baa05f06c9a37f0000909090ff151e0200004889c348b890dc0ec9a37f000090ff1512020000498d4fd8483b4d10730feb0ae9f9000000e9f4000000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2440488b442408909090ff1576010000eb5f498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424084d8b48104989d0488b5c24404c89c89090ff152601000048c7c001000000eb0ce90700000048c7c00100000048837c242001740b488b5c2420ff1506010000488b4c24104883c410488b5424084889114889410848c7c0010000004883c418c220009090900000000000000000a008000000000000|@4782,2097151,@16364,@3852,@194,@100,@4422,@3834,@3834,@3643,@3852,@3852,@194,@100,@4422,@3834,@3852,@194,@100,@4422,@3834,@3852,@194,@100,@4422,@3834,@4781|65,0,@1493 160,0,@193 179,0,@4379 220,0,@4380 250,0,@557 264,0,@20055 489,0,36028797018963967 518,0,@560 786,0,@4778 919,0,@193 951,0,@4379 1004,0,@4380 1022,0,@557 1036,0,@20055 1372,0,@193 1391,0,@4379 1432,0,@4380 1462,0,@557 1476,0,@20055 1716,0,@4779 1833,0,@193 1855,0,@4379 1908,0,@4380 1926,0,@557 1947,0,@20055 4778:S9|70757368537461636b 4779:D8,392|483b65187303ff5548488b42104889d7488b5f08488b48104889c890ff157e010000a801746e575048c7c303000000488b470848baa05f06c9a37f0000909090ff15620100004889c348b890dc0ec9a37f000090ff1556010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f20eb06f641ff1074185749c7c003000000488b5f08488b4710ff15ca000000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4f10574989d0488b5f08498b41109090ff157e000000488b0424488b4808498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889084883c408c390909090909000000000000000008001000000000000|@4780,2097151,@16363,@3852,@194,@100,@4422,@3834|53,0,@193 75,0,@4379 116,0,@4380 134,0,@557 155,0,@20055 4780:S48|47454e45524154455f434f444528292e636f646567656e2839296c6f6361646472283229636f64657c6465632d283129 4781:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16365| 4782:S36|47454e45524154455f434f444528292e636f646567656e2839296c6f6361646472283229 4783:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16366| 4784:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16367| 4785:D32,2384|483b65187303ff55484889c74989d94c89cb498b40109090ff154a0900004883f8017574415057415141ff703841ff70505048c7c3030000004c89c848baa05f06c9a37f00009090ff15220900004889c348b8804b0fc9a37f000090ff1516090000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b0848833907756a4c8b51084c89cb498b4010909090ff15aa080000a8017457415057415141525048c7c3030000004c89c848baa05f06c9a37f00009090ff158a0800004889c348b890dc0ec9a37f000090ff157e080000498d4fd8483b4d107303ff55404989cf48c741f804000000eb0ae936030000e93700000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff1074204150574151415249c7c0030000004c89cb488b4424189090ff15e6070000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b58104c895a1048894a08488b0848890a4150576a0141524d8b60104989d04c89cb4c89e09090ff1596070000f60424017468f6042401751348b8b8f309c9a37f0000488b5d08909090ff1348833c2401756c488b442418488b4838488b0951ff7048ff703849b830e00ec9a37f00004889cb488b50104889d090ff154a070000488b442410a80174064883c0027105ff5570ebf559488901eb05e95a00000048833c2401742649c7c00100000048bbf0dd0ec9a37f0000488b442428eb05e936000000909090ff1506070000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594889084883c420c3f60424017558f6042401741248b8f86f07c9a37f0000488b5d089090ff13488b0c2448b8ffffffffffffff00482341f8488d440001f6442410017518488b5c2410488b13f643ff10740348f7da488d541201eb05488b542410483bc2771048b8103810c9a37f0000488b5d08ff13f6c101741348b8f86f07c9a37f0000488b5d08909090ff13f6442410017518488b542410488b02f642ff10740348f7d8488d440001eb05488b442410488b4481fc498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488b442418488b5038488b12488d591848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890b52ff7048ff70384989d84889d3488b48104889c8ff15ba050000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44242890ff1586050000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594889084883c420c348833903756c488b5108f6c201741348b8c0e406c9a37f0000488b5d08909090ff134883ff017505488b12eb2040f6c70174064883ef027105ff5570ebf5488b5208483b65187303ff5548ebbd4889d74889fb498b40109090ff1502050000a801747241504151575048c7c303000000eb05e97d0200004889f848baa05f06c9a37f000090ff15de0400004889c348b890dc0ec9a37f000090ff15d2040000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c415041515749c7c0030000004889fb488b442410ff1542040000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a41504151574d8b58104989d04889fb4c89d8ff15f6030000488b442410488b5c2408488b48104889c890ff15e6030000a801746e5048c7c303000000488b44241048baa05f06c9a37f0000909090ff15ca0300004889c348b890dc0ec9a37f000090ff15be030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2408488b442410909090ff152e030000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424104d8b48104989d0488b5c24084c89c89090ff15de020000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000594883c410488908c36a016a016a0141505741ff703841ff70504c8d5424204c89ca49c7c10100000049c7c09fff00004889d3488b4424189090ff1586020000488b442418488b5c2428488b48104889c890ff1576020000a801746e5048c7c303000000488b44243048baa05f06c9a37f0000909090ff155a0200004889c348b890dc0ec9a37f000090ff154e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2428488b442418909090ff15be010000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424184d8b48104989d0488b5c24284c89c89090ff156e01000048c7c001000000488b0424488b00488b4c2408488b09ff3424ff742410ff742420ff7424484c8b5424404c8b4c243849c7c0010000004889cb90ff15360100004889c1498d47e8483b45107303ff55404989c748c740f8020000004883c4305a48895008488908c390909090909000000000000000004809000000000000|@4791,2097151,@16368,@3852,@194,@100,@3852,@194,@100,@4422,@3834,@3834,@3643,@3834,@3643,@3852,@194,@100,@4422,@3834,@3852,@194,@100,@4422,@3834,@4504,@3852,@194,@100,@4422,@3834,@4789|62,0,@193 83,0,@4505 124,0,@4506 142,0,@557 163,0,@20055 238,0,@193 259,0,@4379 312,0,@4380 330,0,@557 344,0,@20055 536,0,@2708 581,0,@4402 653,0,@4387 741,0,@1294 763,0,36028797018963967 823,0,@4786 844,0,@1294 1062,0,@4387 1144,0,@578 1251,0,@193 1271,0,@4379 1312,0,@4380 1330,0,@557 1351,0,@20055 1565,0,@193 1587,0,@4379 1628,0,@4380 1646,0,@557 1667,0,@20055 1981,0,@193 2003,0,@4379 2044,0,@4380 2062,0,@557 2083,0,@20055 4786:O4|@20055,@557,@4788,@4787 4787:O5|@4331,1772,0,1772,0 4788:S35|696e646972656374202d20696e76616c696420636f6e7374616e742061646472657373 4789:D12,1080|483b65187303ff5548a801740af6c3017405483bc3eb05ff5570ebf67c6d498b41184d89cb4c8b48104c8b4008488b184c89d090ff1516040000488b442420488b00488b4c2418488b09a801740af6c1017405483bc1eb05ff5570ebf67e10488b442418488b00488b4c24204889014153415248c7c311000000488b44242048ba50a9dc0000000000eb05e9c6000000ff12498d4fb0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70105000000488b0424488b5038488b12488d592048c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890b52ff7048ff70384989d84889d3488b48104889c8ff154a030000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d4c8b44242048bb483d10c9a37f0000488b442410909090ff15160300004883c408584883c408c220004889c74989db4889fb498b411090ff15fe020000a801754b488b0848833905754f4983f8017508488b54242048893a4c3b5108744a488b510848833a01751249833a01755c488b5a08493b5a087430eb5548833a03755449833a037553488b5a08eb05e923020000493b5a08755feb05e916020000488b7210493b7210754e41514152574153ff711048c7c311000000488b44243848ba50a9dc0000000000eb14e927000000e922000000e91d000000e91800000090ff12a8017509f60424017503ff5570483b04247563eb0b415141525741536a01eb5b488b442420488b5c2410488b48104889c890ff152a020000a80174765048c7c303000000488b44241848baa05f06c9a37f0000909090ff150e0200004889c348b890dc0ec9a37f000090ff1502020000498d4fd8eb0ae9fd000000e9f8000000483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2410488b442420909090ff1566010000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424204d8b48104989d0488b5c24104c89c89090ff15160100004883c410584883c410c22000488b442410a80174064883c0027105ff5570ebf5488b4c2448488b542440488b5c2438488b74243048894c2448488954244048895c243848897424304c8b5424184c8b4c242049c7c0030000004883c4085b4883c418e91ffcffff40f6c70174064883c7027105ff5570ebf5488b442420488b4c2418488b542410488b5c2408488944242048894c2418488954241048895c24084c89db4889f8e9dbfbffff90909000000000000000003004000000000000|@4792,2097151,@16369,@4448,@3834,@3643,@3852,@3852,@194,@100,@4422,@3834|129,0,I108 308,0,@4790 493,0,I108 601,0,@193 623,0,@4379 676,0,@4380 694,0,@557 715,0,@20055 4790:S8|696e646972656374 4791:S27|434f444547454e5f5441424c4528292e696e646972656374283329 4792:S36|434f444547454e5f5441424c4528292e696e646972656374283329736561726368283329 4793:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16370| 4794:D4,64|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0856ff25290000009000000000000000003800000000000000|@4796,2097151,@16371,@4795| 4795:D4,264|483b65187303ff554848c7c10b0000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70709000000498d47d8483b45107303ff55404989c748c740f8020000004889780848c70003000000488d481848c741f801000000c641ff40488901498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889085052415041514152f6c3017534ff7308ff742408ff7424404c8b5424204c8b4c24304c8b442428488b03488b5c2438ff15420000005b483b65187303ff5548ebc748c7c0010000004883c428c2080000000000000000000001000000000000|@4798,2097151,@16372,@4797| 4796:S45|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f616473283129283129 4797:D7,1504|483b65187303ff5548488b0848ba4e4010c9a37f0000488d548afcffe290e995000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e90d010000909090e96d010000909090e9d2020000909090e9e7020000909090e943000000909090e93b000000909090e933000000909090e915030000909090e961030000909090e91b000000909090e913000000909090e90b000000909090e9d404000090909048c7c001000000c21000488b481041524151415053ff7008f6c101755b488b01488b10ff7108ff720849c7c003000000488b1a488b4424189090ff150a050000ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b4424109090e8eafeffff4883c40859483b65187303ff5548eba0488b442438488b4c2430488944243848894c24304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e9a8feffff41524151415053ff7008ff742438ff742438488b4010909090e88afeffff58a8017537488b08ff7008ff742438ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b0190e85afeffff58483b65187303ff5548ebc548c7c0010000004883c420c21000488b48084883390375254983f80174154883781001740e4c89d04c89ca594883c41051ff2248c7c001000000c21000488339057551488b78104c8b41084889da4c89c34889d09090ff15f20300004883f80175694883ff01746841f6c00174084983f8017d09eb2a41f640ff107523488b442410488b0041f6c001740ea801740a4c3bc0eb0ae959000000ff5570ebf17c1348b838e407c9a37f0000488b5d08909090ff1341f6c00174064983c0027105ff5570ebf5488b442410eb0ae918000000e9130000004e8b4480fc4c89c04c89ca594883c41051ff2248c7c001000000c21000488339017560f6410801741e488b5c240848baffffffffffffff00482353f8488d541201483b51087717488b501048b8b0df06c9a37f0000488b5d08909090ff13488b5108488b5493fc48833a01752548837810017414488b42084c89ca594883c41051ff22e91400000048c7c001000000c2100048c7c001000000c2100048c7c001000000c21000488b4c2410488b54240848894c24104889542408488b4008e9b6fcffff41524151415053ff7010ff742438ff742438488b400890e89afcffff488b442438488b4c2430488944243848894c24304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e968fcffff488b400841524151415053a8017537488b08ff7008ff742438ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b0190e82efcffff58483b65187303ff5548ebc548c7c0010000004883c420c21000488b480841524151415053ff7010f6c1017560488b01488338037530ff7108ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b48084889c8909090e8cafbffffeb5e48833805755d488b5008ff7108ff7008f6c2017531488b02ff720849c7c003000000488b18eb05e9e9000000488b442420909090ff15960100005a483b65187303ff5548ebca58a8017568488b08488b5008498d47e8483b4510730feb0ae9a3000000e955000000ff55404989c748c740f802000000488b49084889480848c7001500000052ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428909090e81efbffff58483b6518730aeb05e94e000000ff5548eb8aff7108ff701049c7c003000000488b5808488b44241890ff15fe000000ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b4424109090e8c6faffff4883c40859483b65187303ff5548e9adfeffff488b442438488b4c2430488944243848894c24304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e981faffff488b400841524151415053a8017534ff7008ff742438ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b0090e84afaffff58483b65187303ff5548ebc848c7c0010000004883c420c210000000000000000000d805000000000000|@4799,2097151,@16373,@3834,@3852,@3834,@3834|14,0,$4797+30 596,0,@1493 695,0,36028797018963967 724,0,@560 4798:S42|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f616473283229 4799:S50|47454e45524154455f434f444528292e636f646567656e2839296964656e746966794c6f6164732832296c6f616473283129 4800:D5,304|483b65187303ff5548488b4838488b09f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0df90000007c1ceb06f641ff1075144889c248b820f007c9a37f0000488b5d0890ff134889caf6c20174064883c2027105ff5570ebf54889ce4889d14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488937498d47e8483b45107303ff55404989c748c740f80200000048b9484810c9a37f000048890848897808488060ffbf415052574889da90ff12ff3424ff742410ff356100000049c7c20100000049c7c1010000004989e0488b5c2428488b44242048ba78e00ec9a37f0000ff153e0000004883c430c39000000000000000002001000000000000fdffffffffffff01|@4807,2097151,@16375,@4803,@4406|62,0,@1509 188,0,@4801 260,0,@4404 4801:D3,224|a80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c134889c148b838e407c9a37f0000488b5d08ff134889c1f6c10174064883c1027105ff5570ebf5488b5a08488b4c8bfcf6c10174064883c1027105ff5570ebf5a80174084883f8017d08eb1ef640ff107518488b1ba801740af6c3017405483bc3eb05ff5570ebf67c164889c348b810f407c9a37f0000488b5d08909090ff13a80174064883c0027105ff5570ebf5488b520848894c82fc48c7c001000000c39090900000000000000000d800000000000000|@4802,15,@16374|51,0,@1493 156,0,@1517 4802:S32|434f444547454e5f5441424c4528292e70757368416c6c427574283329283129 4803:D5,320|483b65187303ff5548488b4a084889c74989d04889fb488b41109090ff1536010000a80174134889c148b8f84a10c9a37f0000488b5d08ff1340f6c70174084883ff017d08eb24f647ff10751e498b4810488b0940f6c701740af6c1017405483bf9eb05ff5570ebf67c26488b4818488b5010488b5808488b304c8b482048b838e407c9a37f0000488b5d08909090ff134889f9f6c10174064883c1027105ff5570ebf5498b5010488b4c8afcf6c101740ef64008017408483b48087d0feb05ff5570ebf348c7c003000000c3f64020017553498d4fd0483b4d107303ff55404989cf48c741f80500000048c7412001000000488b581848895918488b7010488971104c8b48084c8949084c8b104c89114d8b58084989c84889fb498b431090ff153a00000048c7c001000000c3909000000000000000003801000000000000|@4802,2097151,@16376,@3852,@3834|43,0,@4804 128,0,@1493 4804:O4|@20055,@557,@4806,@4805 4805:O5|@4331,998,0,998,0 4806:S20|70757368416c6c4275743a206e6f20656e747279 4807:S29|434f444547454e5f5441424c4528292e70757368416c6c427574283329 4808:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16377| 4809:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16378| 4810:D9,536|483b65187303ff55485350ff703848c7c39fff0000909090ff151202000059488b09498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d9f78ffffff483b5d107303ff55404989df48c743f80300000048895310488b304889730848c70343000000488d7b2048c747f80200000048c747080100000048891f488d5f1848c743f80300000048c74310010000004889730848c703090000004c8b04244d8b48384d8b094c8d532049c742f80500000049c742200100000049c742180100000049c742100100000049c742080300000049891a57ff70085152415141ff704841ff7038498b58104d89d04989da4c89cb4c89d09090ff152e010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb508b0ec9a37f0000488b44243090ff15fa0000006a016a014989e14c8b442448488b5c2418488b442440ff15e6000000498d47e8483b45107303ff55404989c748c740f802000000488b4c242848894808488b4c242048890848837c2430017507488b4c2438eb1a4889c6488b5c2430488b44243890ff15a20000004889c14889f04883f9017507488b4c2408eb174889c64889cb488b442408ff15860000004889c14889f04889c2498d47e0483b45107303ff55404989c748c740f8030000004889481048895008594883c448488908c39090909000000000000000001002000000000000|@4812,2097151,@16379,@4529,@3834,@3643,@4813,@4852,@4811|306,0,@4334 4811:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16401| 4812:S30|434f444547454e5f5441424c4528292e7075736841646472657373283229 4813:D6,232|483b65187303ff55484c89c1f6c10174064883e9027105ff5570ebf56a016a0141514150ff7058504c8d4c24204989c8ff15ca000000488b442408488b00a8017410f6442410017409483b4424107e18eb05ff5570ebf2488b5c2410488b0424ff15a2000000eb0748c7c001000000488b4c2408488b09f6c101750af6442410017503ff5570483b4c241074144889c148b8f05010c9a37f0000488b5d0890ff1348837c242801740d488b5c24289090ff155a000000488b4c24184883c418488b5424084889114889410848c7c0010000004883c418c3900000000000000000e000000000000000|@4818,2097151,@16380,@4819,@4840,@4817|146,0,@4814 4814:O4|@20055,@557,@4816,@4815 4815:O5|@4331,1696,0,1696,0 4816:S40|7075736856616c7565546f537461636b3a20436f756c646e2774207075736820746f20737461636b 4817:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16399| 4818:S35|434f444547454e5f5441424c4528292e7075736856616c7565546f537461636b283329 4819:D33,2744|483b65187303ff5548488b4828488b0941f6c001740af6c10174054c3bc1eb05ff5570ebf67f054889caeb034c89c2488b7028488916488b5058488b12f6c201750941f6c0017503ff5570493bd0740948c7c201000000eb0748c7c2030000004889cf4989f24c8b58304c8b60584989c54989de524c89f3498b4510ff154e0a00004883f80175744151574152415341544155415041565048c7c3030000004c89f048baa05f06c9a37f0000ff15260a00004889c348b8804b0fc9a37f000090ff151a0a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b084883390b755948833c240174574883781001740748837810017574415157415241534154415541504156ff71084c89c34c89e890ff158e090000488b4c2420488b09f6c10174064883e9027105ff5570ebf5f6c1017418f60424017412eb0ae92d020000e9f6010000482b0c247105ff5570ebf54883c1015048c7c3110000004889c848ba50a9dc0000000000eb05e9cb010000ff12488b4c24204889c7488b5c2410488b411090ff1522090000a801746e575048c7c303000000488b44242048baa05f06c9a37f00009090ff15060900004889c348b890dc0ec9a37f000090ff15fa080000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c003000000488b5c2418488b4424289090ff156a080000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c2420574989d0488b5c2418498b4110ff151e080000488b442430488b00a80174064883c0027105ff5570ebf5488b4c2430488901498d47e0483b45107303ff55404989c748c740f8030000005a4889501048ba088c0cc9a37f00004889500848c70059000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890248833c2401745a488b1c244889d0ff159e0700004889c2eb59415157415241534154415541504d89e24d89c14d89f04c89eb48c7c00100000090ff157a0700004889c26a016a016a01eb6048833905755f48833c2401745d4883781001740eeb05e9a105000048837810017571415157eb05e990050000415241534154415541504156ff7110ff71084c89c34c89e8909090ff152a070000488b4c24204889c7488b5c2410488b4110eb0fe957050000e9f8010000e9bf010000ff150a070000a8017472575048c7c303000000488b44242048baa05f06c9a37f0000eb05e996010000909090ff15e60600004889c348b890dc0ec9a37f000090ff15da060000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c003000000488b5c2418488b4424289090ff154a060000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c2420574989d0488b5c2418498b4110ff15fe050000488b442430488b00a80174064883c0027105ff5570ebf5488b4c2430488901498d47e0483b45107303ff55404989c748c740f803000000488b54241048895010488b5424084889500848c70059000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890248833c24017459488b1c244889d090ff157e0500004889c2eb5f415157415241534154415541504d89e24d89c14d89f04c89eb48c7c00100000090ff155a0500004889c26a016a016a016a01eb6248833907756148833c2401745f415157eb05e93f030000415241534154415541504156ff71084c89c3eb05e9260300004c89e89090ff151a050000488b4c24184889c7488b5c2408488b411090ff150a050000a8017470575048c7c303000000eb0fe9ef020000e9aa020000e973020000488b44241848baa05f06c9a37f000090ff15de0400004889c348b890dc0ec9a37f000090ff15d2040000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f00004889511848894110eb05e92600000048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c003000000488b5c2410488b4424209090ff1542040000eb52498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b4c2418574989d0488b5c2410498b4110ff15f6030000488b442428488b00a80174064883c0027105ff5570ebf5488b4c2428488901f6442408017458f644240801751248b8b8f309c9a37f0000488b5d089090ff13488b442408a801740b4881f8010000807c5beb06f640ff107558a801740b483b05b20200007d6ceb06f640ff107469a801751948b8b8f309c9a37f0000eb05e97d000000488b5d089090ff13a80174054803c07105ff5570ebf64883e801a80174064883c0027111ff5570eb0ae94f000000e94a000000ebe9498d57d0483b55107303ff55404989d748c742f802000000eb0ae929000000e9240000004889420848c70255000000488d421848c740f80200000048c7400801000000488910eb42498d47d0483b45107303ff55404989c748c740f802000000488b5424084889500848c700570000004889c2488d401848c740f80200000048c740080100000048891048833c240175054889c2eb63488b1c24ff15a60200004889c2eb59415157415241534154415541504d89e24d89c14d89f04c89eb48c7c00100000090ff15820200004889c26a016a016a01eb3e415157415241534154415541504d89e24d89c14d89f04c89eb48c7c001000000eb0ae917000000e912000000909090ff154a0200004889c26a016a016a016a014883c408498d47a8483b45107303ff55404989c748c740f802000000488b4c24184883c4184889480848c7000b000000488b5c2408488b7338488b36488d781848c747f80100000048890f488d4f1048c741f8050000004889792048c741180100000048c741100100000048c74108030000004889015256ff7348ff73384989c8488b43104889f3909090ff15b6010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb085e10c9a37f0000488b44242090ff1582010000488b442428488b00488b4c2430488b09a801740af6c1017405483bc1eb05ff5570ebf67e10488b442428488b00488b4c2430488901488b4424384883c408488b4c2438488908488b44244059488908594883c4304889480848c7c0010000004883c410c39090909090900000000000000000a80a0000000000000100008000000000|@4826,2097151,@16381,@3852,@194,@100,@4827,@3852,@194,@100,@4422,@3834,@4834,@4821,@4827,@3852,@194,@100,@4422,@3834,@4835,@4821,@4827,@3852,@194,@100,@4422,@3834,@4836,@4821,@4821,@3834,@3643|164,0,@193 183,0,@4505 224,0,@4506 242,0,@557 263,0,@20055 421,0,I108 482,0,@193 503,0,@4379 544,0,@4380 562,0,@557 583,0,@20055 816,0,@3806 1082,0,@193 1111,0,@4379 1152,0,@4380 1170,0,@557 1191,0,@20055 1675,0,@193 1695,0,@4379 1736,0,@4380 1761,0,@557 1775,0,@20055 1993,0,@2708 2062,0,@2708 2594,0,@4820 4820:S16|7075736856616c7565546f537461636b 4821:D20,1056|483b65187303ff55486a016a016a0153415241514c8d54241849c7c1010000004c89c049c7c09fff00004889c3488b4424109090ff15fe030000488b442410488b48184c8b50484c8b49104c8b4108488b19488b44241890ff15e20300004983fa01743c488b442418909090ff15d60300004889c348b8f86210c9a37f000090ff15ca03000049c7c0010000004889c3488b442410909090ff15ba030000eb0748c7c001000000488b1c24488b442410ff15aa030000488b4c2408488b09f6c1017509f60424017503ff5570483b0c247561488b4c2408488b09f6c10174064883c1027105ff5570ebf5488b54240848890a498d4fd0483b4d107303ff55404989cf48c741f802000000488b5424184889510848c7015b000000488d591848c743f80200000048c743080100000048890beb57488b4c2408488b09f6c101740cf60424017406482b0c247105ff5570ebf54883c101f6c10174064883e9027105ff5570ebf55048c7c3110000004889c848ba50a9dc00000000009090ff12a801740d4883f8017c0deb1fe99e000000f640ff1074144889c148b8186310c9a37f0000488b5d0890ff13498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f00004889411048b8088c0cc9a37f00004889410848c70101000000498d47c8483b45107303ff55404989c748c740f803000000488b542420488950104889480848c70075000000488d582048c743f80200000048c7430801000000488903eb0150488b442418488b481853ff70484c8b49104c8b4108488b194889d0909090ff151602000048833c24017439488b4424309090ff150a0200004889c348b810e00ec9a37f000090ff15fe01000049c7c0010000004889c3488b442428909090ff15ee010000488b4424284883c408488b5c2430488b48104889c890ff15da010000a801746e5048c7c303000000488b44243848baa05f06c9a37f0000909090ff15be0100004889c348b890dc0ec9a37f000090ff15b2010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2430488b442420909090ff1522010000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424204d8b48104989d0488b5c24304c89c89090ff15d200000048837c2438017507488b442408eb11488b5c2438488b44240890ff15ba0000004883f8017506584883c438c34889c3584883c438ff25a800000000000000000000001804000000000000|@4838,2097151,@16390,@4504,@4448,@3770,@100,@3643,@4827,@4428,@3770,@100,@3643,@3852,@194,@100,@4422,@3834,@4839,@4837|119,0,@4822 370,0,I108 410,0,@4823 455,0,@3659 469,0,@3806 619,0,@4401 705,0,@193 727,0,@4379 768,0,@4380 786,0,@557 807,0,@20055 4822:S13|6c6f636b52656769737465723a 4823:O4|@20055,@557,@4825,@4824 4824:O5|@4546,299,0,299,0 4825:S43|73746f72655265676973746572546f537461636b3a204e6567617469766520737461636b206f6666736574 4826:S31|434f444547454e5f5441424c4528292e73746f7265496e537461636b283329 4827:D4,144|483b65187303ff5548f6c30174084883fb017c63eb06f643ff10755b488b4858488b09f6c301740af6c1017405483bd9eb05ff5570ebf67d3e488b4838488b09f6c10174064883e9027105ff5570ebf5488b5018488b3424488914244c8b50584989d94989c048c7c3010000004889c856ff253100000048c7c001000000c39000000000000000008800000000000000|@4829,2097151,@16382,@4828| 4828:D10,1240|483b65187303ff5548a80174084883f8017d0eeb06f640ff1074064889d8c208004889df4989c34c89db498b40109090ff15ba040000a801755c488b084883390b755841f6c1017509f64108017503ff55704c3b490875606a016a014883781001745a4883781001745848c7c20100000048c7c3030000004883fa2f752b488b4818488b70084c8b601048b878ed0ec9a37f0000eb0ae9c1030000e9bc030000488b5d08909090ff134889de482370104883fe017525eb0fe987030000e90a010000e9050100004883c202488d5c1bff483b65187303ff5548eb9df6c20174084883fa017d36eb06f642ff10742e574152415141504153ff7018ff7008ff70104889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb1b488b4818488b5808488b70104889d0574152415141504153515356ff750848b9266610c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13488d4c2440488901488d44244048c7400801000000eb73574152415141504153ff7018ff7008ff7010ff710848c7c39fff00004c89c090ff1506030000488b4c2438488b09f6c10174064883e9027105ff5570ebf5f6c101740cf60424017406482b0c247105ff5570ebf54883c101ff30ff700848c7c3110000004889c848ba50a9dc0000000000eb05e9b7000000ff12498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f00004889411048b8088c0cc9a37f00004889410848c70101000000498d47c8483b45107303ff55404989c748c740f80300000048894810488b4c24084889480848c70045000000488d502048c742f80200000048c742080100000048890248833c24017412488b1c244889d09090ff15220200004889c2488d4424584883c408594883c408488908488d44244048895008488b442440488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe482314244889d34883c408488b4424509090ff156e010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424384889510848c70109000000498d57d0483b55107303ff55404989d748c742f80500000048c7422001000000488b5c240848895a1848c74210010000005b4883c40848895a0848890a488b4c2408504989d0488b5c2408488b4110909090ff15ee00000048837c2438017506488b0424eb42488b5c2438488b0424909090ff15d6000000eb2e48c7c0010000006a016a015741524151415041536a01eb1648c7c0010000006a016a015741524151415041536a014883c40859f6c10174064883e9027105ff5570ebf548837c24180174124889ce488b5c241890ff15820000004889f1488b54243848895424384c8b5424104c8b4c240841584883c4284889c34889c8e93afbffff90900000000000000000d004000000000000|@4831,2097151,@16383,@3852,@4529,@4832,@4425,@3834,@4833,@4830|140,0,@4414 261,0,@376 271,0,I106 316,0,$4828+390 344,0,@560 363,0,@3809 414,0,@3811 565,0,I108 612,0,@3659 626,0,@3806 4829:S45|434f444547454e5f5441424c4528292e6c6f6164456e7472794265666f72654f76657277726974696e67283229 4830:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16386| 4831:S60|434f444547454e5f5441424c4528292e6c6f6164456e7472794265666f72654f76657277726974696e6728322966696e64546865456e747279283229 4832:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16384| 4833:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16385| 4834:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16387| 4835:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16388| 4836:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16389| 4837:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16392| 4838:S53|434f444547454e5f5441424c4528292e73746f7265496e537461636b28332967656e6572616c53746f7265496e537461636b283129 4839:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16391| 4840:D6,368|483b65187303ff5548488b4858488b09488b5038488b12f6c20174064883ea027105ff5570ebf550ff704853ff705851ff70184c8b5424104989d94989c048c7c3010000004889d0ff153a010000488b4c2408488b09f6c1017509f60424017503ff5570483b0c2474134889c148b8607010c9a37f0000488b5d08ff13488b4c24084883c408488b09f6c101740ef6442408017407482b4c24087105ff5570ebf44883c1014883f901750948c7c101000000eb63f6c10174084883f9017c08eb1cf641ff1074164889c248b880790fc9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70261000000488d4a1848c741f80200000048c74108010000004889114883f80175054889c8eb0c4889c34889c8ff1562000000595a48891148833c2401741e504989c048bbf87010c9a37f0000488b442410909090ff1542000000eb0150584883c410c39000000000000000006801000000000000|@4846,2097151,@16393,@4847,@4845,@3643|111,0,@4841 204,0,@4563 320,0,@4844 4841:O4|@20055,@557,@4843,@4842 4842:O5|@4331,1245,0,1245,0 4843:S47|726573657442757452656c6f61643a206d75737420686176652070757368656420736f6d657468696e67206d6f7265 4844:S14|726573657442757452656c6f6164 4845:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16398| 4846:S33|434f444547454e5f5441424c4528292e726573657442757452656c6f6164283229 4847:D10,1240|483b65187303ff5548a80174084883f8017d0eeb06f640ff1074064889d8c208004889df4989c34c89db498b40109090ff15ba040000a8017556488b084883390b755241f6c101740ef641080174084c3b49087f65eb05ff5570ebf36a016a01488378100174584883781001745648c7c20100000048c7c3030000004883fa2f752b488b4818488b70084c8b6010eb0ae9c7030000e9c203000048b878ed0ec9a37f0000488b5d08909090ff134889de482370104883fe01eb0fe985030000e90c010000e90701000075144883c202488d5c1bff483b65187303ff5548eb9df6c20174084883fa017d36eb06f642ff10742e574152415141504153ff7018ff7008ff70104889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb1b488b4818488b5808488b70104889d0574152415141504153515356ff750848b95a7310c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13488d4c2440488901488d44244048c7400801000000eb72574152415141504153ff7018ff7008ff7010ff710848c7c39fff00004c89c090ff1502030000488b4c2438488b095af6c201740af6c1017405482bd17105ff5570ebf64883c201f6c20174064883c2027105ff5570ebf5ff30ff700848c7c3f1ffffff4889d048ba50a9dc0000000000eb05e9b400000090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f00004889411048b8088c0cc9a37f00004889410848c70101000000498d47c8483b45107303ff55404989c748c740f80300000048894810488b4c24084889480848c70045000000488d502048c742f80200000048c742080100000048890248833c24017412488b1c244889d09090ff151e0200004889c2488d4424504883c40859488908488d44244048895008488b442440488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014883f2fe482314244889d34883c408488b4424509090ff156e010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b5424384889510848c70109000000498d57d0483b55107303ff55404989d748c742f80500000048c7422001000000488b5c240848895a1848c74210010000005b4883c40848895a0848890a488b4c2408504989d0488b5c2408488b4110909090ff15ee00000048837c2438017506488b0424eb42488b5c2438488b0424909090ff15d6000000eb2e48c7c0010000006a016a015741524151415041536a01eb1648c7c0010000006a016a015741524151415041536a014883c40859f6c10174064883e9027105ff5570ebf548837c24180174124889ce488b5c241890ff15820000004889f1488b54243848895424384c8b5424104c8b4c240841584883c4284889c34889c8e93afbffff90900000000000000000d004000000000000|@4849,2097151,@16394,@3852,@4529,@4850,@4425,@3834,@4851,@4848|156,0,@4414 265,0,@376 275,0,I106 320,0,$4847+394 348,0,@560 367,0,@3809 418,0,@3811 568,0,I108 616,0,@3659 630,0,@3806 4848:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16397| 4849:S47|434f444547454e5f5441424c4528292e726573657442757452656c6f61642832296c6f6164456e7472696573283229 4850:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16395| 4851:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16396| 4852:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16400| 4853:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16402| 4854:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16403| 4855:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16404| 4856:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16405| 4857:D13,584|483b65187303ff55486a016a016a01504c8d54240849c7c10100000049c7c09fff000090ff1536020000498d47e0483b45107303ff55404989c748c740f803000000488b4c24084889481048b980de0ec9a37f00004889480848c70075000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b04244889cf488b5c2410488b48104889c89090ff15ca010000a801746e575048c7c303000000488b44242048baa05f06c9a37f00009090ff15ae0100004889c348b890dc0ec9a37f000090ff15a2010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c003000000488b5c2418488b4424089090ff1512010000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b0c24574989d0488b5c2418498b411090ff15c600000048c7c0010000004989c5488b442408909090ff15b600000048837c2420017506488b0c24eb184889c6488b5c2420488b0424ff159e0000004889c14889f04883f90174164889c64889cb4c89e890ff158a0000004989c54889f04983fd0175054883c428c34c89eb4883c428ff25740000009090909000000000000000004002000000000000|@4859,2097151,@16406,@4504,@3852,@194,@100,@4422,@3834,@4562,@4860,@4861,@4858|77,0,@4392 178,0,@193 199,0,@4379 240,0,@4380 258,0,@557 279,0,@20055 4858:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16409| 4859:S32|434f444547454e5f5441424c4528292e72656c6f616448616e646c6572283229 4860:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16407| 4861:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16408| 4862:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16410| 4863:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16411| 4864:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16412| 4865:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16413| 4866:D9,304|483b65187303ff5548ff7008415041ff7038ff3041ff702041ff305341ff705849b8408310c9a37f000048c7c3ffffff00488b4424309090ff150a010000595a4889115948c701010000005948c701010000004889c65890ff15f200000059488b09f6c10174064883e9027105ff5570ebf548c7c2010000005056f6c1017410f6442418017409483b4c24187c57eb05ff5570ebf2515249c7c0010000004889cb488b4424209090ff15aa00000048833c2401740d488b1c24909090ff159e0000004883c40859f6c10174064883e9027105ff5570ebf54889c2483b65187303ff5548eb964889d048833c2401740b488b1c2490ff156e0000004883f801750a4883c408584883c410c34889c34883c408584883c410ff25540000009090909000000000000000002801000000000000|@4871,2097151,@16415,@4521,@4872,@4422,@4886,@4887,@4870|34,0,@4867 4867:O1|@4868 4868:D3,24|48c7c003000000c300000000000000001000000000000000|@4869,1,@16414| 4869:S32|434f444547454e5f5441424c4528292e636c6561724361636865283129283129 4870:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16422| 4871:S25|434f444547454e5f5441424c4528292e666978757048283329 4872:D6,200|483b65187303ff5548498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70169000000488d411848c740f80200000048c74008010000004889084883f801750c48b8788510c9a37f0000eb154889c348b8788510c9a37f00009090ff15760000004883f801750c48b8b08510c9a37f0000eb164889c348b8b08510c9a37f0000909090ff15560000004883f801750b48b8408610c9a37f0000c34889c348b8408610c9a37f0000ff253a00000090900000000000000000c000000000000000|@4883,15,@16416,@4884,@4885,@4882|75,0,@4873 90,0,@4873 114,0,@4875 129,0,@4875 154,0,@4880 168,0,@4880 4873:O2|@4874,0 4874:O3|34,@3806,@4392 4875:O2|@4877,@4876 4876:O2|@4878,0 4877:O2|48,2 4878:O3|34,@3804,@4879 4879:O4|0,@3806,@3659,8 4880:O2|@4881,0 4881:O3|58,@4392,@3804 4882:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16419| 4883:S29|5838364c4f574c4556454c28292e737461727448616e646c6572283129 4884:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16417| 4885:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16418| 4886:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16420| 4887:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16421| 4888:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16423| 4889:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16424| 4890:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16425| 4891:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16426| 4892:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16427| 4893:D3,640|488dbc2458ffffff483b7d187303ff5550a8017555f6c3017555488b08488b1348833a01750948c7c601000000eb6548833a05750948c7c601000000eb5b488b720848833e017515488b7e0840f6c70174064883c7207131ff5570ebf548837e10037521488b7e08eb0ae9f1010000e9ec01000040f6c70174064883c7107109ff5570ebf5488b7e0840f6c701751f4c8b1feb0ae967000000e95d000000f647ff10740349f7db4f8d5c1b01eb034989fb488b394c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c0901498d77f0483b75107303ff55404989f748c746f8010000004c891eeb08488b39eb03488b39415241514150ff7308ff700841514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c20100000049c7c1010000004989f048c7c3030000004889f8488b942488000000909090ff124883f80175154889c148b8508e10c9a37f0000488b5d089090ff13ff30ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b9424900000004c8b8c24880000004c8b842480000000488b5c2478488b44247090e8cafdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2680048c7c001000000c2680090909090909000000000000000007802000000000000|@3457,1048575,@16428|417,0,@4894 4894:O4|@20055,@557,@4896,@4895 4895:O5|@3867,563,0,563,0 4896:S18|6576616c4172673a206e6f20726573756c74 4897:D11,704|483b65187303ff5548a801755df6c3017417488b08488b500848b8f89110c9a37f0000488b5d08ff13488b0b48833901753dff30488b4b084889cb488b40089090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3e91902000048833905756e6a016a0141514150ff7308ff70084c8d4c24204c8b4108488b18488b442410ff153e020000488b442418488b004883f8017507488b442428eb0f4889c3488b44242890ff1522020000488b4c24184889014989c94c8b442410488b5c2408584883c41890e822ffffff4889c1eb05e925000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c3ff3041514150ff7108488b4b084889cb488b4008e8dafeffff488b0c24488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09016a016a016a01504c8d54240849c7c1010000004989d0488b5c2438488b442428ff151a010000488b442430488b004883f8017507488b442418eb0f4889c3488b44241890ff15fe000000488b4c2430488901488b442428488b48184c8b50484c8b49104c8b4108488b19488b44242090ff15da0000004983fa01743a488b442420909090ff15ce0000004889c348b8f86210c9a37f000090ff15c200000049c7c0010000004889c3488b442428909090ff15b2000000498d47e8483b45107303ff55404989c748c740f802000000594883c40848894808594883c428488908c34883fb01741348b8f89110c9a37f0000488b5d08909090ff1348c7c001000000c3909090909090900000000000000000b802000000000000|@4902,2097151,@16429,@4819,@4903,@4504,@4901,@4448,@3770,@100,@3643|27,0,@4898 567,0,@4822 656,0,@4898 4898:O4|@20055,@557,@4900,@4899 4899:O5|@3867,594,0,594,0 4900:S30|6d6f7665417267733a204d69736d61746368656420617267756d656e7473 4901:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16431| 4902:S53|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6d6f766541726773283229 4903:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16430| 4904:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16432| 4905:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16433| 4906:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8509510c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@16434|64,0,@4907 4907:O2|@4908,0 4908:O1|27 4909:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16435| 4910:D3,56|a8017509f64208017503ff5570483b4208740848c7c001000000c348c7c003000000c3909090909000000000000000003000000000000000|@4911,5,@16436| 4911:S39|434f444547454e5f5441424c4528292e707573685370656369666963456e747279283229283129 4912:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16437| 4913:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16438| 4914:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16439| 4915:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16440| 4916:D11,1512|488dbc2458ffffff483b7d187303ff5550a801757041524151ff70084150534152ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb05e93e05000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b00488b942490000000909090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13488b4c2438488b1424f6c201740cf601017407483b117d70eb05ff5570ebf4f6c20174084883fa017d08eb1cf642ff107516f6c201740cf601017407483b117c1beb05ff5570ebf4488b1848b8e09e10c9a37f0000488b5d0890ff136a016a01ff30ff71084c8d44241048c7c3110000004889d048ba50a8dc000000000090ff12488b442410eb05e9450000005948d1e8480fb60401488d440001488b4c241048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f8017464eb086a016a01ff30eb5f4c8b8c24c00000004c8b442420488b1c24488b442448909090ff1536040000488b8c24b8000000488b094883f901740b4889cb9090ff1522040000488b8c24b8000000488901488b442418a80174064883c0027111ff5570eb0ae92f010000e92a010000ebe9488b542420f6c20174064883c2027105ff5570ebf5488b9c24c0000000488bb424b0000000488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247052488b54247050488b44247050488b44247050488b44247050488b44247048899c24e800000048898c24e00000004889b424d80000004889bc24d00000004c898424c80000004c898c24c00000004c899424b80000004c899c24b00000004c89a424a80000004c89ac24a00000004c89b424980000004889942490000000488b4c241048898c2488000000488b4c240848898c2480000000594883c41048894c246048894424584c8b5424484c8b4c24404c8b4424085b4883c4084883c428584883c410e9c7fcffff488b8424c0000000488b1c24488b48104889c8ff15be020000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff15a20200004889c348b890dc0ec9a37f000090ff1596020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b8424c000000090ff1506020000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424c00000004d8b48104989d0488b1c244c89c8ff15b601000048c7c001000000488b8c24b8000000488b094883f901740c4889cb909090ff159a010000488b8c24b8000000488901488b442418a80174064883c0027105ff5570ebf5488b9424c0000000488b9c24b0000000488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246850488b44246850488b44246850488b44246850488b44246848899424e000000048898c24d800000048899c24d00000004889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4c241048898c2480000000488b4c240848894c2478594883c41048894c245848894424504c8b5424404c8b4c24384c8b4424285b4883c428584883c410e938faffff48c7c001000000c280009090909090900000000000000000e005000000000000|@4920,2097151,@16441,@4921,@5019,@3852,@194,@100,@4422,@3834,@4919|193,0,@4376 286,0,@4917 327,0,I104 869,0,@193 891,0,@4379 932,0,@4380 950,0,@557 971,0,@20055 4917:O4|11,@42,0,@4918 4918:O5|@3310,212,0,212,0 4919:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16490| 4920:S54|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d73657456616c756573283329 4921:D28,1688|483b65187303ff55484889c74989da4889fb498b41109090ff1592060000a801746e415157415241505048c7c3030000004889f848baa05f06c9a37f00009090ff15720600004889c348b890dc0ec9a37f000090ff1566060000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c4151574152415049c7c0030000004889fb4c89c8ff15d6050000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b58104c895a1048894a08488b0848890a415157415241504989d04889fb498b411090ff158a05000048c7c001000000498d4fb8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000488b542410488b5a38488b1b488d711848c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890e5053ff7248ff72384989f0488b421090ff1516050000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44242890ff15e2040000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24184883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c2410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848ba88a710c9a37f0000488911498d57f0483b55107303ff55404989d748c742f80100000048890a4883fa0175154889c148b8b8cd10c9a37f0000488b5d089090ff134889c148c7c20100000050f6c1017565488b442420488b79084989d04c8b094c89cb488b48104889c89090ff15ea030000a801747157415041515048c7c3030000004c89c848baa05f06c9a37f0000ff15ce0300004889c348b890dc0ec9a37f000090ff15c2030000498d4fd8483b4d10730aeb05e911010000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c57415049c7c0030000004c89cb488b4424309090ff152a030000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a4c8b5c24205741504989d04c89cb498b4310ff15de02000048c7c00100000048833c2401740a488b1c24ff15ce0200004889c24883c40859483b65187303ff5548e980feffff4889d0488b0c2448c7c20100000050f6c1017566488b442428488b79084989d04c8b094c89cb488b48104889c8909090ff158a020000a801747157415041515048c7c3030000004c89c848baa05f06c9a37f0000ff156e0200004889c348b890dc0ec9a37f000090ff1562020000498d4fd8483b4d10730aeb05e911010000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c57415049c7c0030000004c89cb488b4424389090ff15ca010000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a4c8b5c24285741504989d04c89cb498b4310ff157e01000048c7c00100000048833c2401740a488b1c24ff156e0100004889c24883c40859483b65187303ff5548e97ffeffff4889d0ff742428ff35530100004889c148c7c00300000090ff154a0100006a016a01514c8d5424084c8b4c24504c8b442430488d5c241890ff153201000048837c2438017507488b442428eb11488b5c2438488b44242890ff151a0100004883f8017506488b0424eb104889c3488b0424909090ff15060100004883f801750a4883c410584883c440c34889c34883c410584883c440ff25ec0000009090909000000000000000009006000000000000|@4986,2097151,@16465,@3852,@194,@100,@4422,@3834,@3834,@3643,@3852,@194,@100,@4422,@3834,@4987,@3852,@194,@100,@4422,@3834,@4988,@4989,@4923,@4991,@5017,@5018,@4985|54,0,@193 75,0,@4379 116,0,@4380 134,0,@557 155,0,@20055 490,0,@4387 652,0,@4922 701,0,@4982 788,0,@193 807,0,@4379 855,0,@4380 873,0,@557 894,0,@20055 1188,0,@193 1207,0,@4379 1255,0,@4380 1273,0,@557 1294,0,@20055 4922:O1|@4923 4923:D3,32|48b8e0a710c9a37f0000c3909090909000000000000000001800000000000000|@4981,1,@16464|2,0,@4924 4924:O1|@4925 4925:D4,64|483b65187303ff554849b960a810c9a37f000049c7c00300000048bbf0c110c9a37f0000ff252e00000090909090909000000000000000003800000000000000|@4975,2097151,@16461,@4972|11,0,@4926 28,0,@4971 4926:O1|@4927 4927:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bae0a810c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4969,7,@16457|29,0,@4928 4928:D11,912|483b65187303ff55484889c148c7c303000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c60eb06f643ff10755df6c301740b483b1de50200007d6beb06f643ff107468498d77e8eb0ae983020000e949020000483b75107303ff55404989f748c746f80200000048895e0848c70605000000488b7a086a016a014989c34989e24989f1eb0ae912020000e90d02000049c7c003000000488b5f08488b0790ff159a020000eb0ae9f1010000e9ec010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b14244889104c89db48c7c605000000f6c30174144889c748b8c0e406c9a37f0000488b5d0890ff134883fe017505488b1beb2040f6c60174064883ee027105ff5570ebf5488b5b08483b65187303ff5548ebbc48833b077557f64308017456f643080175134889c648b8b8f309c9a37f0000488b5d08ff13488b730840f6c601740b4881fe010000807c61eb06f646ff10755e40f6c601740b483b35a30100007d66eb06f646ff107463498d47e8eb0ae9da000000e99b000000483b45107303ff55404989c748c740f8020000004889700848c700050000006a016a014989e24989c149c7c005000000eb0ae964000000e95f0000004889cb4889d0909090ff156e01000058eb0ae948000000e94300000090ff1562010000488b1c249090ff155e0100004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c700010000004883c410c348b9d8ac10c9a37f0000488b54241048894c241049c7c20500000049c7c10100000049c7c09fff00004889c34c89d84883c41052ff25fc00000048b9d8ac10c9a37f0000488b54241048894c241049c7c20500000049c7c10100000049c7c09fff00004889c34c89d84883c41052ff25ca00000048b928b410c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff259d00000048b928b410c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff25700000000000000000000000780300000000000001000080000000000100008000000000|@4954,2097151,@16455,@4955,@4955,@4970,@4932,@4949,@4949,@4949,@4949|29,0,@578 110,0,@2708 342,0,@578 423,0,@2708 660,0,@4929 718,0,@4929 776,0,@4946 829,0,@4946 4929:O1|@4930 4930:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba58ad10c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16445|29,0,@4931 4931:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,2097151,@16442,@4943,@4932| 4932:D3,824|483b65187303ff5548a8017521f6400801751b488b4808f64108017511488b510848837a080175064883fb0174134889c148b858b110c9a37f0000488b5d08ff13488b1848833b057547488b3148833e05741248b8d0b110c9a37f0000488b5d089090ff13f64608017416f6460801751048b8b8f309c9a37f0000488b5d08ff1348b828b210c9a37f0000488b5d08ff1348833b03741248b8d0b110c9a37f0000488b5d089090ff13488b3148833e05756df6460801751148b8b8f309c9a37f0000488b5d0890ff13488b7e0840f6c70174084883ff017d2beb06f647ff107423ff32ff73084889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb084889f8ff32ff730848c7c31100000048ba50a9dc0000000000eb05e93a000000ff12498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f000048894110584889410848c70101000000eb6748833e03741148b8d0b110c9a37f0000488b5d0890ff13498d7fc0483b7d107303ff55404989ff48c747f8020000004c8b46084c89470848c70705000000488d4f1848c741f80400000048c74118f9ffffff48897910488b7b084889790848c70101000000ff32488b042448833801751248b880b210c9a37f0000488b5d089090ff13488338057569f64008017468f64008017516488b500848b8b8f309c9a37f0000488b5d089090ff13488b4008a80174054803c07105ff5570ebf64883e801a80174064883c0027105ff5570ebf5498d57c8483b55107303ff55404989d748c742f8030000004889421048894a08eb0ae97b000000e92300000048c7026f000000488d422048c740f80200000048c74008010000004889104883c408c3498d57e0483b55107303ff55404989d748c742f803000000488b40084889421048894a0848c70273000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889104883c408c3498d57e0483b55107303ff55404989d748c742f803000000488b40084889421048894a0848c70275000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889104883c408c3909090909000000000000000003003000000000000|@4944,2097151,@16444|51,0,@4933 85,0,@4936 115,0,@2708 131,0,@4938 153,0,@4936 186,0,@2708 235,0,@376 245,0,I106 277,0,I108 324,0,@3659 358,0,@4936 465,0,@4940 505,0,@2708 4933:O4|@20055,@557,@4935,@4934 4934:O5|@4546,624,0,624,0 4935:S12|67656e53746f7265576f7264 4936:O4|@20055,@557,@4935,@4937 4937:O5|@4546,613,0,613,0 4938:O4|@20055,@557,@4935,@4939 4939:O5|@4546,612,0,612,0 4940:O4|@20055,@557,@4935,@4941 4941:O5|@4546,622,0,622,0 4942:S42|5838364c4f574c4556454c28292e67656e6572617465496e737472756374696f6e283129283129283129 4943:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16443|28,0,@1662 4944:S29|5838364c4f574c4556454c28292e67656e53746f7265576f7264283229 4945:S39|5838364c4f574c4556454c28292e67656e6572617465496e737472756374696f6e283129283129 4946:O1|@4947 4947:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa8b410c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4969,7,@16454|29,0,@4948 4948:D8,472|483b65187303ff55484889c148c7c305000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c64eb06f643ff107561f6c301740b483b1d2d0100007d58eb06f643ff107455498d47e8eb0ae9d3000000e999000000483b45107303ff55404989c748c740f8020000004889580848c70005000000488b72086a016a014989e24989c149c7c005000000eb14e95e000000e959000000e954000000e94f000000488b5e08488b069090ff15da0000005890ff15da000000488b1c249090ff15d60000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c348b9d8ac10c9a37f0000488b1c2448890c2449c7c20500000049c7c10100000049c7c09fff00004889d9488b5a0851ff257d00000048b9d8ac10c9a37f0000488b1c2448890c2449c7c20500000049c7c10100000049c7c09fff00004889d9488b5a0851ff25500000000000000000000000c8010000000000000100008000000000|@4954,2097151,@16448,@4955,@4967,@4932,@4949,@4949|29,0,@578 110,0,@2708 344,0,@4929 397,0,@4929 4949:D4,920|483b65187303ff55484c89d1a80174154889c248b8c0e406c9a37f0000488b5d089090ff134883f9017505488b00eb1ff6c10174064883e9027105ff5570ebf5488b4008483b65187303ff5548ebbd48833805755e4983f9017406488b4010eb04488b40084c89c14823c84883f90174644883f90174634923c048c7c10100000048c7c2030000004883f92f75134889c648b878ed0ec9a37f0000488b5d08ff134889d64823f04883fe01751b4883c102eb05e90e020000488d5412ff483b65187303ff5548ebc0f6c10174124883f9017d35eb10e974010000e96f010000f641ff10742341514152534889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb084889c84151415253ff750848b92eb810c9a37f00005148896508a80174064883f82f72154889c148b8b0df06c9a37f0000488b5d089090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b14246a016a014989c34989e24989c94c8b442418488b5a08488b02909090ff15da010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084153488b5424289090ff124889c1498d47d0483b45107303ff55404989c748c740f805000000488b54241848895020488b5424104889501848894810594883c4184889480848c70007000000c20800498d47c8483b45107303ff55404989c748c740f80600000048b998ba10c9a37f0000488908488958084c8940104c8948184c895020488b4c240848894828488060ffbf4889c2498d47d0483b45107303ff55404989c748c740f8050000004c8948204c8940184c8950104889500848c70005000000c208006a016a014c89c04881e09fff00004883f80174154883f801740f4889e04c89004889e04c894808eb154889e048c7009fff00004889e048c7400801000000498d47c8483b45107303ff55404989c748c740f80600000048b950bb10c9a37f0000488908488958084c8940104c8948184c895020488b4c241848894828488060ffbf4889c2498d47d0483b45107303ff55404989c748c740f805000000488b5c2408488958205b4883c408488958184c8950104889500848c70005000000c20800909000000000000000009003000000000000|@4968,2097151,@16453,@4955|21,0,@578 147,0,@4414 239,0,@376 249,0,I106 277,0,$4949+350 305,0,@560 323,0,@3809 374,0,@3811 616,0,@4950 798,0,@4953 4950:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba08bb10c9a37f000056ff2290909000000000000000004000000000000000|@4952,1048575,@16446|42,0,@4951 4951:O1|@4949 4952:S34|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283129283129283129 4953:D3,72|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0848ba08bb10c9a37f000056ff2290909000000000000000004000000000000000|@4952,1048575,@16447|42,0,@4951 4954:S41|5838364c4f574c4556454c28292e6c6f6164546f5265674f724c69746572616c283129283129283129 4955:D5,320|483b65187303ff55484889c14c89c2f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fa017505488b09eb1ff6c20174064883ea027105ff5570ebf5488b4908483b65187303ff5548ebbcf6c10175154889c148b878bd10c9a37f0000488b5d089090ff134889de4889c74c89c34889f8909090ff15d6000000498d4ff0483b4d107303ff55404989cf48c741f8010000004c890941f6c00174064983c0027105ff5570ebf54983f801743940f6c70174134889c248b808be10c9a37f0000488b5d08ff1341f6c00174064983e8027105ff5570ebf5488b7f08483b65187303ff5548ebc1498d57e8483b55107303ff55404989d748c742f80200000048897a0848890a4883fa01740c4889d3909090ff15420000004989024989720848c7c001000000c390909000000000000000003801000000000000|@4962,511,@16449,@4963,@4961|25,0,@578 93,0,@4956 191,0,@4959 4956:O4|@20055,@557,@4958,@4957 4957:O5|@4546,422,0,422,0 4958:S39|7265706c6163654f706572616e643a204f706572616e6420616c72656164792070726573656e74 4959:O4|11,@42,0,@4960 4960:O5|@580,112,0,112,0 4961:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16451| 4962:S31|5838364c4f574c4556454c28292e7265706c6163654f706572616e64283429 4963:D3,136|483b65187303ff55484883fb01750848c7c001000000c3a80174164889c148b8c0bf10c9a37f0000488b5d08909090ff13f6c30174064883eb027105ff5570ebf5ff30488b40089090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390909090909000000000000000008000000000000000|@4966,11,@16450|32,0,@4964 4964:O4|11,@42,0,@4965 4965:O5|@580,108,0,108,0 4966:S12|4c6973742e74616b65283229 4967:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16452|28,0,@1662 4968:S28|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283629 4969:S38|5838364c4f574c4556454c28292e6c6f6164546f5265674f724c69746572616c283129283129 4970:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16456|28,0,@1662 4971:O2|@491,0 4972:D7,1696|483b65187303ff5548a801755a488b08488339077556f64008017555488b5008488b3248833e07754df6460801741af646080175144889c748b8b8f309c9a37f0000488b5d0890ff134983f803750948c7c701000000eb32f6430801751d48c7c701000000eb1be98c000000e987000000e982000000e97d00000048c7c7030000004883f7024883f7024d8d57d84c3b55107303ff55404d89d749c742f80400000049bbf0c810c9a37f00004d891a49895a084d8942104d894a18498062ffbf498d47d0483b45107303ff55404989c748c740f8050000004889782048c740189fff000048c74010010000004c89500848c70005000000c3a801755e488b0848833905755a488b51104881e29fff00004883fa0174634883fa017462488b51104881e29fff000041514150ff33ff73084c8b4424084889d3488b442410909090ff157205000048c7c10100000048c7c2030000004883f92feb0ae98d040000e988040000751f4889c348b878ed0ec9a37f0000488b5d08eb0ae905020000e900020000ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebaff6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b92ec410c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff136a016a0148837c24200375184889e1488b5424104889114889e148c7410801000000eb4bf64424100175184889e1488b5424104889114889e148c7410801000000eb2c498d4ff0483b4d107303ff55404989cf48c741f8010000004889014889e248890a4889e148c7410803000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701030000006a016a014989c34989e24989c949c7c001000000488b5c2410488b442428909090ff15b2030000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084153488b5424309090ff124889c1498d47d0483b45107303ff55404989c748c740f805000000488b5424104889502048c740180100000048894810594883c4304889480848c70007000000c3488b51084881e29fff00004883fa0174644883fa017463488b51084881e29fff00005341514c89c64c8b034889d34889f0ff150e03000048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175204883c102488d5412ffeb0ae97d010000e978010000483b65187303ff5548ebbbf6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b996c610c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b5424086a016a014989c34989e24989c949c7c001000000488b5a08488b02ff15ca010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084153488b5424089090ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740180100000048894810594883c4104889480848c70007000000c3498d57d8483b55107303ff55404989d748c742f80400000048be98c910c9a37f000048893248895a084c8942104c894a18488062ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889500848c70005000000c34983f803750948c7c001000000eb1ef6430801750948c7c001000000eb0748c7c0030000004883f0024883f002498d4fd8483b4d107303ff55404989cf48c741f80400000048baf8c910c9a37f0000488911488959084c8941104c894918488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f8050000004889502048c740189fff000048c74010010000004889480848c70005000000c390909090909000000000000000009806000000000000|@4979,2097151,@16462,@4978,@4955,@4978,@4955|58,0,@2708 164,0,@4973 363,0,@4414 445,0,@376 455,0,I106 476,0,$4972+550 504,0,@560 523,0,@3809 574,0,@3811 979,0,@4414 1061,0,@376 1071,0,I106 1092,0,$4972+1166 1120,0,@560 1139,0,@3809 1190,0,@3811 1428,0,@4976 1587,0,@4977 4973:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba50c910c9a37f0000ff229090909090909000000000000000003000000000000000|@4975,1048575,@16458|23,0,@4974 4974:O1|@4972 4975:S38|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283129283129283129 4976:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba50c910c9a37f0000ff229090909090909000000000000000003000000000000000|@4975,1048575,@16459|23,0,@4974 4977:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba50c910c9a37f0000ff229090909090909000000000000000003000000000000000|@4975,1048575,@16460|23,0,@4974 4978:D3,672|483b65187303ff5548a8017555488b004823c348c7c10100000041f6c001755441f600017553498b10488b3248833e037564488b7e0848833f0175154c8b4f0841f6c10174064983c1207138ff5570ebf548837f100375284c8b4f0841f6c101eb05e91f02000074064983c1107115ff5570eb0ae979000000e95c000000ebe94c8b4f0841f6c101751b4d8b1141f641ff10740aeb05e93f00000049f7da4f8d541201eb034d89ca4989c94c89d149c7c2030000004983ea014883f97f760748c7c17f00000048d1e949d3e24983ca01488d4c09014d0bcaeb034989c94c89c94d8b4008483b65187303ff5548e928ffffff4883f1fe4823c14883f801745b4883f801745a48c7c10100000048c7c2030000004883f92f75144889c348b878ed0ec9a37f0000488b5d0890ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc6f6c10174124883f9017d30eb10e923010000e91e010000f641ff10741e4889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb034889c8ff750848b932cc10c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13488338017513488b4008a80174064883c0207123ff5570ebf548837810037513488b4008a80174064883c0107109ff5570ebf5488b4008a8017513488b08f640ff10740348f7d9488d4c0901eb034889c148c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c0901c34889d8c34889d8c390909090909000000000000000009802000000000000|@4980,2097151,@16463|286,0,@4414 367,0,@376 377,0,I106 400,0,$4978+474 428,0,@560 447,0,@3809 498,0,@3811 4979:S32|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283429 4980:S26|5838364c4f574c4556454c28292e707265664173536574283329 4981:S36|5838364c4f574c4556454c28292e73746f7265576f72644e65676f746961746f72283129 4982:O4|@20055,@557,@4984,@4983 4983:O5|@4331,2944,0,2944,0 4984:S26|6d6f7665546f5665633a204e6f7420696d706c656d656e746564 4985:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16488| 4986:S28|434f444547454e5f5441424c4528292e6d6f7665546f566563283429 4987:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16466| 4988:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16467| 4989:D7,168|483b65187303ff5548a8017566488b4a08488b591852ff30ff71484c8b4b104c8b4308488b034889c3488b4424089090ff158a00000048833c24017441488b4424089090ff157e0000004889c348b810e00ec9a37f000090ff1572000000488b4c241049c7c0010000004889c3488b4108eb05e912000000ff155a00000048c7c0ffffffff4883c418c348c7c0ffffffffc39090909090900000000000000000a000000000000000|@4990,2097151,@16468,@4428,@3770,@100,@3643|79,0,@4401 4990:S35|434f444547454e5f5441424c4528292e646174614f7028342966696e616c4f70283129 4991:D5,120|483b65187303ff554841ff714853415141524150504c89c34c89c890ff156e0000005a90ff12488b4c2410488b54242848894c2428488b4c2418488b5c242048894c242048895c24184c8b54240849c7c10100000049c7c0010000005b4883c41052ff253000000000000000000000007000000000000000|@4996,2097151,@16470,@4997,@4992| 4992:D39,2280|483b65187303ff554848833803755541525341514150ff7010488b5808488b4424409090ff15d6080000ff30ff7008488b442408488b542410909090ff1250488b5c2430488b442458909090ff15b60800005a90ff1248837c241801750b488b0c24eb20e97b0000004889c6488b5c2418488b0424909090ff15920800004889c14889f0498d57e8483b55107303ff55404989d748c742f802000000488b5c24204883c40848895a085b4883c41848891a488b5c2428488b742420488b7c241848895c2428488974242048897c24184c8b5424084989d14989c85b4883c408e91cffffff48833805756e4889d9488b5010f6c1017423488b7008488b78104c8b58204c8b601848b8c0e406c9a37f0000488b5d08909090ff134883fa017505488b09eb1ff6c20174064883ea027105ff5570ebf5488b4908483b65187303ff5548ebae6a016a016a0141525341514150ff7008ff7010eb05e94c0100004c8d5424304c8b48204c8b40184889cb488b4424609090ff159e070000488b1c24488b44242090ff1596070000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5424384889115af6c20174064883c2027105ff5570ebf5488b5c24184883fa01743af6c30174164889c648b808be10c9a37f0000488b5d08909090ff13f6c20174064883ea027105ff5570ebf5488b5b08483b65187303ff5548ebc04883fb0174124889c64889c8ff150e0700004889c14889f04883f901740c4889cb909090ff15fe060000504889c3488b44246090ff15f6060000488b54240890ff1248837c2410017507488b4c2440eb1b4889c6488b5c2410488b4424409090ff15d20600004889c14889f0488b542460488b5c2458488b742450488954246048895c245848897424504c8b5424284c8b4c24184989c85b4883c440e957fdffff48833807756c488b4c2418488b51184989db4d89cc4d89c54c8b7008ff7010ff7020ff71484c8b4a104c8b4208488b1a4c89f0ff156606000048833c24017447415241534154415541564c89f09090ff15520600004889c348b8f86210c9a37f000090ff154606000049c7c001000000eb05e9c40100004889c3488b442458ff1532060000eb1148c7c0010000004152415341544155415648837c243001745f498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c2448890848c7c201000000a801755b488b08488339017514488b5908f6c30174064883c320712bff5570ebf54883791003751b488b5908f6c301eb05e98f00000074064883c3107109ff5570ebf5488b5908f6c3017518488b33f643ff10740348f7de488d743601eb08e9420000004889de4889f148c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c0901480bd3488b4008483b65187303ff5548e95affffff4889d049b8f8db10c9a37f00004889c3488b4424589090ff152e050000eb0748c7c00100000050488b5c2420488b4424609090ff151a050000488b54244090ff1248837c2410017506488b0c24eb184889c6488b5c2410488b0424ff15fa0400004889c14889f0498d57e8483b55107303ff55404989d748c742f802000000488b5c24184883c40848895a085b4883c41048891a488b5c2440488b742438488b7c243048895c2440488974243848897c24304c8b5424084989d14989c85b4883c420e91cfbffff48837808017469488b4808488b542418488b72184989db4d89cc4d89c54c8b701051ff31ff72484c8b4e104c8b4608488b1e488b44240890ff155e04000048833c2401744741524153415441554156488b442430ff154a0400004889c348b8f86210c9a37f000090ff153e040000eb05e92a00000049c7c0010000004889c3488b442458ff152a040000eb2f48c7c00100000041524153415441554156eb1c488b4810488b500848c7c001000000526a016a014152534151415051488b442438488b542450909090ff12488b4c241048c7c20100000050f6c101756a488b442460488b5818ff710852ff31ff70484c8b4b104c8b4308488b0b4889cb488b442408909090ff15b203000048833c2401744350488b44241090ff15a60300004889c348b810e00ec9a37f000090ff159a03000049c7c0010000004889c3488b842488000000eb05e93d00000090ff1582030000eb015048837c2418017506488b0424eb0f488b5c2418488b0424ff156a0300004889c24883c42059483b65187303ff5548e94fffffff4889d0488b4c242048c7c20100000050f6c1017565488b442468488b79084989d04c8b094c89cb488b48104889c89090ff1526030000a801747157415041515048c7c3030000004c89c848baa05f06c9a37f0000ff150a0300004889c348b890dc0ec9a37f000090ff15fe020000498d4fd8483b4d10730aeb05e911010000ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c57415049c7c0030000004c89cb488b4424789090ff1566020000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a4c8b5c24685741504989d04c89cb498b4310ff151a02000048c7c00100000048833c2401740a488b1c24ff150a0200004889c24883c40859483b65187303ff5548e980feffff4889d048837c245801744548837c24180174154889c6488b5c2418488b442410ff15d6010000eb0b4889c1488b4424104889ce564989c048bb48dc10c9a37f0000488b4424709090ff15b6010000eb0b4889c148c7c0010000005148837c2420017507488b442418eb10488b5c2420488b442418ff15920100004883f8017507488b442408eb0f4889c3488b44240890ff157e0100004883f8017506488b0424eb104889c3488b0424909090ff156a010000488b4c24384883c4105a4883c4204889114889410848c7c0010000004883c420c21800909090909090900000000000000000e008000000000000|@5006,2097151,@16474,@4529,@4997,@5007,@4504,@4963,@5008,@5009,@4997,@5010,@4448,@3770,@100,@3643,@4521,@4997,@5011,@4448,@3770,@100,@3643,@4428,@3770,@100,@3643,@5012,@3852,@194,@100,@4422,@3834,@5013,@5014,@3643,@5015,@5016,@5005|264,0,@578 472,0,@4959 771,0,@4822 1058,0,@4993 1347,0,@4822 1543,0,@4401 1720,0,@193 1739,0,@4379 1787,0,@4380 1805,0,@557 1826,0,@20055 2101,0,@4995 4993:O1|@4994 4994:D3,24|48c7c003000000c300000000000000001000000000000000|@4512,1,@16469| 4995:S14|706572666f726d416374696f6e73 4996:S33|434f444547454e5f5441424c4528292e706572666f726d416374696f6e73283429 4997:D4,48|483b65187303ff55484c8b40584889d94889c34889c8ff252c0000009090909000000000000000002800000000000000|@4999,2097151,@16471,@4998| 4998:D4,120|483b65187303ff5548a8017551415053ff7008488b009090ff1572000000504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909000000000000000007000000000000000|@1363,2097151,@16472,@5000| 4999:S32|434f444547454e5f5441424c4528292e617267734173536f7572636573283229 5000:D10,1744|483b65187303ff55484889df4989c14c89cb488b47109090ff15ca0600004883f801757041505741515048c7c3030000004c89c848baa05f06c9a37f00009090ff15aa0600004889c348b8804b0fc9a37f000090ff159e060000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13498d4fa0483b4d107303ff55404989cf48c741f805000000488b502048895120488b581848895918488b7010488971104c8b50084c8951084c8b184c89194c8d613049c74424f8050000004c8b69204d896c24204c8b71184d897424184c8b59104d895c24104c8b51084d89542408488b31498934244c89cb488b47109090ff15ca050000a80174134889c148b8e04b0fc9a37f0000488b5d08ff134883780803740948c7c001000000eb0748c7c00300000049837c241001746d49837c241001746a4883f801742d498d47e0483b45107303ff55404989c748c740f803000000498b4c2410488948104889480848c70005000000c3498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004d8b6424104c89600848c70005000000eb0ae906000000e901000000c3498b0c24488b1148bbd6df10c9a37f0000488d5c93fcffe39090e90c020000909090e92c020000909090e9d6030000909090e9fe030000909090e90b000000909090e9160400009090904883f8017455488b4108488338017514488b5008f6c20174064883c2207124ff5570ebf548837810037514488b5008f6c20174064883c2107109ff5570ebf5488b5008f6c2017518488b1af642ff10740348f7db488d5c1b01eb08e9d00000004889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901488338017513488b4008a80174064883c0207123ff5570ebf548837810037513488b4008a80174064883c0107109ff5570ebf5488b4008a8017513488b08f640ff10740348f7d9488d4c0901eb034889c148c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c09014889c1498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70005000000c3488b4108488338017514488b5008f6c20174064883c2207124ff5570ebf548837810037514488b5008f6c20174064883c2107109ff5570ebf5488b5008f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c09014889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c3498d47e8483b45107303ff55404989c748c740f802000000488b51084889500848c70003000000c3f6410801741048b8e81f08c9a37f0000488b5d08ff13488b41084c8b084c89cb488b471090ff15a60200004883f801757641505048c7c3030000004c89c848baa05f06c9a37f000090ff158a0200004889c348b8804b0fc9a37f000090ff157e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff13498d4fa0483b4d107303ff55404989cf48c741f805000000488b502048895120488b581848895918488b701048897110488b7808488979084c8b084c89094c8d513049c742f8050000004c8b59204d895a204c8b61184d8962184c8b69104d896a104c8b71084d8972084c8b094d890a498b3a48833f0b741348b808e510c9a37f0000488b5d08909090ff134d8b0041f6c001740cf647080174064c2b47087105ff5570ebf54983c00141f6c00174064983e8027105ff5570ebf548c7c3110000004c89c048ba50a9dc0000000000ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c3498d47e0483b45107303ff55404989c748c740f803000000488b511048895010488b59084889580848c70001000000c3498d47e8483b45107303ff55404989c748c740f802000000488b51084889500848c70007000000c34d8b0041f6c00174064983e8027105ff5570ebf541f6c001740cf641080174064c2b41087105ff5570ebf54983c00148c7c3110000004c89c048ba50a9dc0000000000ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048b9088c0cc9a37f00004889480848c70001000000c390909090900000000000000000c806000000000000|@5004,2097151,@16473,@3852,@194,@100,@3852,@3852,@194,@100|54,0,@193 75,0,@4505 116,0,@4506 134,0,@557 155,0,@20055 319,0,@4507 493,0,$5000+510 1087,0,@1625 1143,0,@193 1163,0,@4505 1204,0,@4506 1222,0,@557 1236,0,@20055 1388,0,@5001 1464,0,I108 1660,0,I108 1703,0,@3806 5001:O4|@20055,@557,@5003,@5002 5002:O5|@4331,2834,0,2834,0 5003:S44|6172674173536f757263653a20636f6e7461696e657220656e747279206973206e6f74206f6e20737461636b 5004:S46|434f444547454e5f5441424c4528292e617267734173536f75726365732832296172674173536f75726365283129 5005:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16485| 5006:S45|434f444547454e5f5441424c4528292e706572666f726d416374696f6e73283429756e74696c446f6e65283429 5007:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16475| 5008:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16476| 5009:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16477| 5010:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16478| 5011:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16479| 5012:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16480| 5013:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16481| 5014:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16482| 5015:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16483| 5016:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16484| 5017:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16486| 5018:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16487| 5019:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16489| 5020:D13,952|483b65187303ff5548a80174084883f8017d08eb1cf640ff107516a801740d41f600017407493b007c1beb05ff5570ebf44889c148b8e09e10c9a37f0000488b5d0890ff136a016a01415241514150535041ff70084c8d44243048c7c31100000048ba50a8dc000000000090ff12488b4424305948d1e8480fb60401488d440001488b4c243048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f8017463488b0424a801750af6442418017503ff5570483b4424187463488b4c2420488b5c2450488b4110909090ff15ea020000a801746f5048c7c303000000488b44245848baa05f06c9a37f0000909090ff15ce0200004889c348b890dc0ec9a37f0000eb05e9370200009090ff15ba020000498d4fd8483b4d10730aeb05e918010000ff55404989cf48c741f80400000048bab8dc0ec9a37f00004889511848894110eb05e92700000048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2450488b442420909090ff1522020000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b4424204d8b48104989d0488b5c24504c89c89090ff15d201000048c7c001000000488b4c2448488b094883f901740b4889cb9090ff15ba010000488b4c244848890148c7c001000000eb0748c7c0010000004c8b442420488b5c2450488b0424ff1596010000488b4c2448488b094883f9017506488b4808eb15488b304889cb488b4008ff157a0100004889c1eb03488b30488b4424484889084c8b4c24204c8b4424084889f3488b442440ff155a010000488b4c2448488b094883f901740a4889cb90ff154a010000488b4c2448488901488b0424a801750af6442418017503ff5570483b442418750e48c7c0010000004883c438c21800a80174064883c0027105ff5570ebf5488b542408f6c20174064883c2027105ff5570ebf5488b5c2450488b74244048895c245048894c244848897424404c8b5424204c8b4c24184c8b4424104889d34883c438e9abfcffff488b0424a80174064883c0027105ff5570ebf5488b4c2450488b542448488b5c244048894c2450488954244848895c24404c8b5424204c8b4c24184c8b4424104883c4085b4883c428e95dfcffff90909090900000000000000000b003000000000000|@5022,2097151,@16491,@3852,@194,@100,@4422,@3834,@5023,@4785,@5024,@4921,@5021|54,0,@4917 99,0,I104 249,0,@193 271,0,@4379 327,0,@4380 352,0,@557 366,0,@20055 5021:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16494| 5022:S49|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d636f7079283229 5023:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16492| 5024:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16493| 5025:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16495| 5026:D5,456|488dbc2458ffffff483b7d187303ff5550a801756d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e92101000049c7c10100000049c7c00100000048c7c303000000488b00488b94248000000090ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b442418909090ff150a010000488b4c2420488b094883f9017506488b4808eb15488b304889cb488b4008ff15ee0000004889c1eb03488b30488b44242048890856ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004989c24c8b8c24800000004c8b442478488b5c2470488b442468e882feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2600048c7c001000000c260009090909090900000000000000000c001000000000000|@1363,2097151,@16496,@5030,@5029|181,0,@5027 5027:O4|@20055,@557,@4378,@5028 5028:O5|@3867,1103,0,1103,0 5029:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16498| 5030:D8,544|483b65187303ff55484889df4989c04889fb498b40109090ff151a0200004883f80175765741505048c7c3030000004889f848baa05f06c9a37f0000ff15fe0100004889c348b8804b0fc9a37f000090ff15f2010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff13488b08488339097555488b510848833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c3017518488b33f643ff10740348f7de488d743601eb08e9bc0000004889de4889f148c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c09014881e00100fe004883f801745e4883f80174585741506a016a016a014989e249c7c10100000049c7c09fff00004889fb488b4424189090ff15d6000000498d47e8483b45107303ff55404989c748c740f802000000488b4c24104883c40848894808594883c418488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488938c3574c89c24989f848c7c30100fe004889d0909090ff15720000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390909090909000000000000000001802000000000000|@5031,2097151,@16497,@3852,@194,@100,@4504,@4527|52,0,@193 71,0,@4505 112,0,@4506 130,0,@557 144,0,@20055 5031:S37|434f444547454e5f5441424c4528292e656e737572654e6f416c6c6f636174696f6e283229 5032:D6,384|483b65187303ff5548a801756b4889df4c8b40084c8b084c89cb488b47109090ff15720100004883f801756f5741505048c7c3030000004c89c848baa05f06c9a37f0000ff15560100004889c348b8804b0fc9a37f000090ff154a010000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e9e500000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b08488339017529498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70201000000eb39488339077529498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70203000000eb0a48bab00607c9a37f0000574150524889fb4c89c0909090e8c6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000007801000000000000|@1363,2097151,@16499,@3852,@194,@100|60,0,@193 79,0,@4505 127,0,@4506 145,0,@557 166,0,@20055 288,0,@803 5033:D6,232|483b65187303ff5548a80175684889d9f6c10174064883c1027105ff5570ebf56a016a014150415153ff30ff742448ff742448ff7424484c8d4424384889cb488b40089090e8b6ffffff4c8b4c24104c8b4424085b4883c410488b4424089090ff159a00000048837c2410017414488b5c2410eb05e9260000009090ff1586000000488b0c24488b5424084889114889410848c7c0010000004883c418c21800488b442410488b4c2408488b5424184c8954241848895424104d89c24989c848c7c3010000005e4883c40856ff253e0000009090909090900000000000000000e000000000000000|@5035,2097151,@16500,@4921,@5036,@5034| 5034:D12,1736|483b65187303ff554841f6c00175054d8b00eb0749c7c09fff00004152535041514c89c34c89c890ff15b2060000498d4fb0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b104889510848c70109000000488b1c24488b7338488b36488d792048c747f80500000048c747200100000048c747180100000048c747100100000048c747080300000048890f56ff700852ff7348ff73384989f8488b43104889f390ff1536060000488b442420a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb508b0ec9a37f0000488b44242090ff150206000048837c245001746f498d47b8483b45107303ff55404989c748c740f802000000488b4c24484889480848c70007000000488b542420488b5a38488b1b488d701848c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890653ff7248ff72384989f0eb05e9ef020000488b42109090ff1582050000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44243090ff154e0500004c8b4c24304883c4084c8b4424305b488b4424189090ff153a050000488b4c2428f6c10174064883c1027105ff5570ebf5488b5424304883ca214883fa017473498d5fd8483b5d107303ff55404989df48c743f80400000048c74318ffffffff48bee86f0cc9a37f000048897310488b7424084889730848c70301000000498d7fb8483b7d107303ff55404989ff48c747f8030000004889571048895f0848c7076b000000488d572048c742f804000000eb05e9a500000048c74218f1ffffff48bbe86f0cc9a37f000048895a104889720848c70201000000498d9f78ffffff483b5d107303ff55404989df48c743f80300000048894b104889530848c7036f000000488d532048c742f8030000004889721048894a0848c70201000000488d4a2048c741f80200000048c7410801000000488911488d511848c742f80200000048894a0848891a488d4a1848c741f80200000048895108488939eb6f505148c7c3010000024889d048ba50a9dc0000000000909090ff124889c3488b042448bad0aadc000000000090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118f1ffffff48bae86f0cc9a37f000048895110488b5424184889510848c70101000000eb05e97e000000498d5fc0483b5d107303ff55404989df48c743f8030000004889431048894b0848c7036f000000488d432048c740f80300000048895010594889480848c70001000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8488d491848c741f80200000048894108488919eb015048837c2418017413488b5c24184889c89090ff15f60200004889c14883f9017506488b0424eb0d4889cb488b0424ff15e2020000488b4c24404883c408488b5424184889114889410848c7c0010000004883c440c2100048837c2430017470498d47d8483b45107303ff55404989c748c740f80400000048c74018ffffffff48b9e86f0cc9a37f000048894810488b4c24084889480848c70001000000498d57b8483b55107303ff55404989d748c742f803000000488b5c243048895a104889420848c7026b000000488d4220eb05e9b200000048c740f80400000048c74018f1ffffff48bbe86f0cc9a37f0000488958104889480848c70001000000498d9f78ffffff483b5d107303ff55404989df48c743f803000000488b742428488973104889430848c7036f000000488d432048c740f803000000488948104889700848c70001000000488d482048c741f80200000048c7410801000000488901488d411848c740f80200000048894808488918488d481848c741f80200000048894108488911eb6e48c7c301000002488b44243048ba50a9dc00000000009090ff124889c3488b44242848bad0aadc0000000000ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118f1ffffff48bae86f0cc9a37f000048895110488b5424084889510848c70101000000eb05e980000000498d5fc0483b5d107303ff55404989df48c743f8030000004889431048894b0848c7036f000000488d432048c740f80300000048895010488b4c24284889480848c70001000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8488d491848c741f8020000004889410848891948837c2410017412488b5c24104889c890ff158e0000004889c1488b442438488b5424184889104889480848c7c0010000004883c440c21000909090900000000000000000c006000000000000|@5038,2097151,@16502,@4529,@3834,@3643,@3834,@3643,@4921,@5039,@5040,@5037|218,0,@4334 414,0,@4387 532,0,@3659 628,0,@3659 797,0,I108 819,0,I114 864,0,@3659 1155,0,@3659 1256,0,@3659 1430,0,I108 1452,0,I114 1496,0,@3659 5035:S60|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6c6f6164536d616c6c566563746f72283229 5036:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16501| 5037:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16505| 5038:S39|47454e45524154455f434f444528292e636f646567656e28392963616c6c676574766563283429 5039:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16503| 5040:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16504| 5041:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16506| 5042:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16507| 5043:D3,384|4883380575134889c148b8680811c9a37f0000488b5d08ff13488338017563498d4fd8483b4d107303ff55404989cf48c741f80400000048bae80811c9a37f00004889114c8941084c89491048895918488061ffbf488b5008488b7238488b3640f6c601756a488b36488b3648833e01751748b840ba0cc9a37f0000488b5d08eb05e98a000000ff13f6c301751348b8b8f309c9a37f0000488b5d08909090ff13488b760849897498fc498b09f6c10174064883e9027105ff5570ebf54989094d8b094983f9017534498060ffbfeb2d488b7278488b36498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848890f488b4a78488939f6c30174064883c3027105ff5570ebf54889d8c3f6c3017517488b480848b8b8f309c9a37f0000488b5d08909090ff13488b400849894498fc498b01a80174064883e8027105ff5570ebf54989014d8b094983f9017505498060ffbff6c30174064883c3027105ff5570ebf54889d8c390909000000000000000007801000000000000|@5049,255,@16509|11,0,@5044 57,0,@5047 116,0,@3942 144,0,@2708 284,0,@2708 5044:O4|@20055,@557,@5046,@5045 5045:O5|@3867,944,0,944,0 5046:S17|6164644974656d3a204e6f74436f6e7374 5047:D3,128|f64218017517488b480848b8b8f309c9a37f0000488b5d08909090ff13488b4a08488b5a18488b400848894499fc488b4210488b00a80174064883e8027105ff5570ebf5488b7210488906488b364883fe01750d488061ffbf48c7c001000000c348c7c001000000c39090909090909000000000000000007800000000000000|@5048,31,@16508|12,0,@2708 5048:S55|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d7365744974656d283129283129 5049:S52|47454e45524154455f434f444528292e636f646567656e28392967656e636465283529726573756c742d6164644974656d283229 5050:O3|@5052,@4364,@5051 5051:O2|@5066,@4364 5052:D6,928|488dbc2458ffffff483b7d187303ff5550488338037569415041514152ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff74247849c7c20100000049c7c10100000049c7c00300000048c7c303000000488b4008488b5208909090ff1248c7c001000000c26000488338057564488b4808f6c1017560488b19488b3340f6c60174084883fe017d08eb21f646ff10751b498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67c15488b780848b810f407c9a37f0000488b5d0890ff1340f6c60174064883c6027111ff5570eb0ae9ce000000e920000000ebe949c744b0fcffffffff488b59084889d9483b65187303ff5548e976ffffff48c7c101000000488b4c2460488b5c2458488b742450488b7c24484c8b5c24404c8b6424384c8b6c24304c8b74242841524c8b54242841514c8b4c242841504c8b442428ff7008488b44242848898c248000000048895c2478488974247048897c24684c895c24604c896424584c896c24504c897424484c895424404c894c24384c8944243048894424284c8b52104c8b4c24184c8b442410488b5c2408584883c418ff25fb0100004883fb01750948c7c101000000eb2a488b0b488b700840f6c6017508f601017503ff5570483b31740948c7c101000000eb07488b59084889d9488b581048833b15756e498d77c8483b75107303ff55404989f748c746f80600000048bf380e11c9a37f000048893e4c895608488b780848897e104c8b58184c895e184c8946204c894e28488066ffbf4152ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468ff742468eb05e931000000ff742468ff742468ff7424684d89ca4d89c14989c8488b4b084889f34889c8488b52109090ff1248c7c001000000c26000415241514150ff7018ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c20100000049c7c1010000004989c848c7c303000000488b4010488b52089090ff124883f80175154889c148b8a00f11c9a37f0000488b5d089090ff134c8b5424184c8b4c24104c8b4424085b4883c418488b00ff155a000000488b0c24488b094883f901740b4889cb9090ff154a0000005948890148c7c001000000c260009090909000000000000000009803000000000000|@5059,2097151,@16513,@5060,@4503,@5058|202,0,@1517 538,0,@5053 825,0,@5056 5053:D5,104|483b65187303ff5548524c8b52284c8b4a204c8b4218488b5a109090ff155e000000488b0c24488b5108488b124883fa01740b4889d39090ff154a000000488b0c24488b49084883c40848890148c7c001000000c390909000000000000000006000000000000000|@5055,2097151,@16511,@4503,@5054| 5054:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16512| 5055:S53|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e672832296e6578744d757475616c283129 5056:O4|@20055,@557,@4378,@5057 5057:O5|@3867,2426,0,2426,0 5058:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16517| 5059:S40|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e67283229 5060:D3,336|483b65187303ff5548a801756e488b08498d9758ffffff483b55107303ff55404989d748c742f81400000048be281211c9a37f0000488932488b70084889720848895a104c8942184c894a204c895228488b7c246048897a304c8b5c24584c895a384c8b6424504c8962404c8b6c24484c896a484c8b742440eb05e9b40000004c897250488b44243848894258488b74243048897260488b7c242848897a684c8b5c24204c895a704c8b6424184c8962784c8b6c24104c89aa800000004c8b7424084c89b288000000488b0148898290000000488b411048898298000000488062ffbf4151ff742468ff742468ff742468ff742468ff742468ff742468565741534154415541564d89d14d89c24d89c84989d94c89c349c7c001000000534889d3488b41085a9090ff1248c7c001000000c2600048c7c001000000c26000909000000000000000004801000000000000|@5065,1048575,@16516|45,0,@5061 5061:D5,184|483b65187303ff5548524c8b52184c8b4a104c8b8298000000488b9a90000000ff15aa000000488b0c24488b5120488b124883fa01740b4889d39090ff1596000000488b0c24488b5120488902488b41304883c408488b1c2448890424ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000ffb1880000004c8b51284989d14c8b41184889de488b5910488b410848ba181311c9a37f000056ff22900000000000000000b000000000000000|@5064,2097151,@16514,@4503,@5063|156,0,@5062 5062:O1|@5060 5063:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16515| 5064:S69|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e6728322967656e4d757475616c446563732831296e6578744d757475616c283129 5065:S56|47454e45524154455f434f444528292e636f646567656e283929636f646542696e64696e6728322967656e4d757475616c44656373283129 5066:D66,5016|488dbc24d8feffff483b7d187303ff5550534152ff7020ff7028ff7040ff7018ff30ff7008415152ff70104150ff7038ff7030ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d00000004c8b9424380100004c8b8c24c00000004c8b842488000000488b5a08488b442478ff150213000050488b5c2468ff15fe1200004889c148c7c201000000f6c101752b488b1948833b057510f6c20174064883c2027105ff5570ebf5488b59084889d9483b65187303ff5548ebd04889d14883f901756f48c7c1030000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f57524c8b8c24980000004989f8488b5c244848c7c001000000909090ff1556120000eb05e90d0300006a016a016a016a01498d5fe0483b5d107303ff55404989df48c743f80300000048b9002a11c9a37f000048890b488b4c242048894b0848894310488063ffbf50ffb42490000000ffb424a0000000ff742440ffb424d8000000488d4c2428514c8b9424b00000004c8b8c24a800000049c7c001000000488b8424a0000000488b9424e000000090ff124c8b5424204c8b4c24184c8b442410488b5c2408584883c43090ff15ae110000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488b442468488b5038488b12488d591848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890b52ff7048ff70384989d84889d3488b48104889c8ff153e110000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44247890ff150a110000488b4424104883c408a801756d488b4c2470488b78084c8b004c89c3488b41109090ff15ea100000a80174715741505048c7c3030000004c89c048baa05f06c9a37f00009090ff15ce1000004889c348b890dc0ec9a37f000090ff15c2100000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e91701000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c574c89c049c7c0030000004889c3488b44247890ff152a100000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b542470574d89c34989d04c89db498b4210909090ff15da0f000048c7c001000000488b8c24f0000000488b094883f901740c4889cb909090ff15be0f0000488b8c24f000000048890158483b65187303ff5548e973feffff48c7c001000000488b0424488b542478ff12584883c478c268004889c64889cf48c7c3030000004889f09090ff157a0f00004883f801750c48b8909adc0000000000eb7048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0dae0e00007d08eb1bf641ff1075154889c248b818930ec9a37f0000488b5d089090ff134889c248c7c0010000004889fb488d3c8d04000000eb05e96800000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f84889df48c7c1030000004889c248c7c0010000004889fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f565253574c8b8c24a80000004989f8488b5c245848c7c0030000009090ff15220e00006a016a016a016a01498d5fe0483b5d107303ff55404989df48c743f80300000048b9502f11c9a37f000048890b488b4c243848894b08488b54243048895310488063ffbf50ffb424a0000000ffb424b0000000ff742438ffb424e8000000488d742428564c8b9424c00000004c8b8c24b80000004c8b442478488b8424b0000000488b9424f000000090ff124c8b5424204c8b4c24184c8b442410488b5c2408584883c42890ff157e0d0000488b4c2418f6c101751e488339ff750948c7c103000000eb16488b4908483b65187303ff5548ebdd48c7c10100000048837c242801746e488b1424f6c20174064883c2027105ff5570ebf54883f901750948c7c101000000eb0748c7c1810000006a016a0150ffb424e0000000ffb424e00000004c8d5424184c8b8c24a80000004c8b4424584889cb4889d09090ff15f20c0000488b842410010000488b004883f801eb05e9480700007507488b442410eb114889c3488b442410909090ff15ca0c0000488b8c2410010000488901498d47b8483b45107303ff55404989c748c740f8020000005a4889500848c70007000000488b942490000000488b5a38488b1b488d701848c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890653ff7248ff72384989f0488b4210909090ff154e0c0000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bbf0dd0ec9a37f0000488b8424a00000009090ff15160c00004c8b8c24a00000004883c40849c7c0010000005b488b04249090ff15fe0b0000488b8c2408010000488b094883f901740b4889cb9090ff15ea0b0000488b8c2408010000488901ff3424514c8b5424284c8b8c24a000000049c7c001000000488b5c2430488b44243890ff15be0b0000488b842408010000488b004883f801750c48b808300fc9a37f0000eb134889c348b808300fc9a37f0000ff15960b0000488b8c2408010000488901488b842490000000488b1c24488b50104889d0ff157a0b0000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff155e0b00004889c348b890dc0ec9a37f000090ff15520b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b84249000000090ff15c20a0000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424900000004d8b48104989d0488b1c244c89c8ff15720a000048c7c001000000488b8c2408010000488b094883f901740c4889cb909090ff15560a0000488b8c2408010000488901488b0424488b942498000000909090ff12488b442450ffb42490000000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42410010000ffb42488000000ff7424784c8b9424d80000004c8b480849c7c001000000488b9c24c8000000488b8424a800000090ff15a6090000488b842490000000488b1c24488b48104889c8909090ff1592090000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff15760900004889c348b890dc0ec9a37f000090ff156a090000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b84249000000090ff15da080000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424900000004d8b48104989d0488b1c244c89c8ff158a08000048c7c001000000488b8c2408010000488b094883f901740c4889cb909090ff156e080000488b8c240801000048890148b8403411c9a37f00004883f801751048b8983c11c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910ffb42490000000ff35170800006a016a014989e24c8b8c24b00000004989c0488d5c241048b8c03411c9a37f00009090ff15f6070000488b8424280100004883c408488b004883f8017506488b0424eb0d4889c3488b0424ff15d6070000488b8c24200100004883c418488901488b842490000000488b1c24488b50104889d0ff15b6070000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff159a0700004889c348b890dc0ec9a37f000090ff158e070000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b84249000000090ff15fe060000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424900000004d8b48104989d0488b1c244c89c8ff15ae06000048c7c001000000488b8c2408010000488b094883f901740c4889cb909090ff1592060000488b8c2408010000488901584881c498000000c26800504c8b8c24000100004c8b842488000000488b5c2418488b44242090ff1562060000498d4fb8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000488b942480000000488b5a38488b1b488d711848c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890e5053ff7248ff72384989f0488b421090ff15f2050000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bbf0dd0ec9a37f0000488b8424980000009090ff15ba050000498d47e8483b45107303ff55404989c748c740f802000000488b4c24104883c40848894808594883c4084889084889c3488b8424800000009090ff1582050000488b8c24f8000000488b094883f9017506488b4808eb16488b304889cb488b400890ff15620500004889c1eb03488b30488b8424f8000000488908488b8c24800000004889f74889fb488b411090ff153e050000a8017474575048c7c3030000004889f848baa05f06c9a37f0000ff15260500004889c348b890dc0ec9a37f000090ff151a050000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c5749c7c0030000004889fb488b84248800000090ff158a040000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b8c2480000000574989d04889fb498b4110909090ff153a04000048c7c001000000488b8c2400010000488b094883f901740c4889cb909090ff151e040000488b8c2400010000488901488b0424488b942490000000909090ff12488b442448ffb42488000000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42408010000ffb42480000000ff7424784c8b9424d00000004c8b480849c7c001000000488b9c24c0000000488b8424a000000090ff156e030000488b842488000000488b1c24488b48104889c8909090ff155a030000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff153e0300004889c348b890dc0ec9a37f000090ff1532030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b1c24488b84248800000090ff15a2020000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424880000004d8b48104989d0488b1c244c89c8ff155202000048c7c001000000488b8c2400010000488b094883f901740c4889cb909090ff1536020000488b8c2400010000488901584881c490000000c2680000000000000000008813000000000000ffffffffffffff01|@5112,2097151,@16534,@5113,@5118,@4311,@3869,@3834,@3643,@3852,@194,@100,@4422,@3834,@5119,@5120,@4311,@3869,@5034,@5122,@3834,@3643,@4921,@5123,@5124,@5128,@3852,@194,@100,@4422,@3834,@5129,@5130,@3852,@194,@100,@4422,@3834,@5133,@5134,@4991,@5135,@3852,@194,@100,@4422,@3834,@5136,@5137,@3834,@3643,@5142,@5153,@3852,@194,@100,@4422,@3834,@5154,@5155,@3852,@194,@100,@4422,@3834,@5111|403,0,@5067 698,0,@4387 778,0,@193 799,0,@4379 847,0,@4380 865,0,@557 886,0,@20055 1182,0,I49 1265,0,@4361 1560,0,@5076 2066,0,@4387 2221,0,@4493 2236,0,@4493 2305,0,@193 2327,0,@4379 2368,0,@4380 2386,0,@557 2407,0,@20055 2849,0,@193 2871,0,@4379 2912,0,@4380 2930,0,@557 2951,0,@20055 3175,0,@5081 3191,0,@5108 3282,0,@5085 3397,0,@193 3419,0,@4379 3460,0,@4380 3478,0,@557 3499,0,@20055 3926,0,@4387 4116,0,@193 4135,0,@4379 4176,0,@4380 4194,0,@557 4208,0,@20055 4657,0,@193 4679,0,@4379 4720,0,@4380 4738,0,@557 4759,0,@20055 5067:D4,72|483b65187303ff554841514c8b52104c8b4a0890ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000004000000000000000|@3833,2097151,@16518,@5068| 5068:D9,840|483b65187303ff554848833803756a488b400841f6c10174144889c148b8c0e406c9a37f0000488b5d0890ff134883f80175054d8b09eb1ea80174064883e8027105ff5570ebf54d8b4908483b65187303ff5548ebbd49833905751148b8182e11c9a37f0000488b5d0890ff1349833901756d498d47b8eb05e9c5010000483b45107303ff55404989c748c740f8020000004d8b49084c89480848c70001000000498b4838488b09488d501848c742f80500000048c742200100000048c742180100000048c742100100000048c742080300000048890251415041ff7048eb05e97a00000041ff7038498b40104989d04889cb90ff1566020000488b442418a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb60440cc9a37f0000488b44240890ff1532020000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c41059488908c3498d47b8483b45107303ff55404989c748c740f8020000004d8b49084c89480848c70007000000498b4838488b09488d501848c742f80500000048c742200100000048c742180100000048c742100100000048c742080300000048890241505141ff704841ff7038498b40104989d04889cb909090ff1596010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44241090ff1562010000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594883c408488908c348833807741048b8982e11c9a37f0000488b5d08ff13498d47b8483b45107303ff55404989c748c740f8020000004c89500848c70001000000498b4838488b09488d501848c742f80500000048c742200100000048c742180100000048c742100100000048c742080300000048890241505141ff704841ff7038498b40104989d04889cb90ff15b2000000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb60440cc9a37f0000488b44241090ff157e000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594883c408488908c39000000000000000004003000000000000|@5075,2097151,@16519,@3834,@3643,@3834,@3643,@3834,@3643|30,0,@578 94,0,@5069 290,0,@3642 514,0,@4387 587,0,@5072 758,0,@3642 5069:O4|@20055,@557,@5071,@5070 5070:O5|@3867,1202,0,1202,0 5071:S18|70726576696f75733a204e6f74436f6e7374 5072:O4|@20055,@557,@5074,@5073 5073:O5|@3867,1204,0,1204,0 5074:S15|70726576696f75733a206c6f63616c 5075:S47|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332970726576696f7573283329 5076:D4,72|483b65187303ff554841514c8b52104c8b4a0890ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000004000000000000000|@3833,2097151,@16520,@5077| 5077:D9,840|483b65187303ff5548488338037564488b480841f6c1017414488b500848b8c0e406c9a37f0000488b5d08ff134883f90175054d8b09eb1ff6c10174064883e9027105ff5570ebf54d8b4908483b65187303ff5548ebbc49833905756df6400801742048b9ffffffffffffff0049234af8eb05e997020000488d4c0901483b48087716488b480848b8b0df06c9a37f0000488b5d089090ff13488b4008498b4482fc4883f80175154889c148b8386208c9a37f0000488b5d089090ff134150ff3048c7c001000000eb05e96b0000004889da9090ff12ff70084c8b442410488b18488b4424089090ff157202000048833c24017506488b4808eb18488b30488b1c24488b40089090ff155a0200004889c1eb03488b30498d47e8483b45107303ff55404989c748c740f802000000488948084889304883c418c349833901756e498d47b8483b45107303ff55404989c748c740f8020000004d8b49084c89480848c70001000000498b4838488b09488d501848c742f80500000048c742200100000048c742180100000048c742100100000048c742080300000048890241505141ff704841ff7038498b4010eb05e9780000004989d04889cb909090ff15ae010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb60440cc9a37f0000488b44241090ff157a010000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594883c408488908c3498d47b8483b45107303ff55404989c748c740f8020000004d8b49084c89480848c70007000000498b4838488b09488d501848c742f80500000048c742200100000048c742180100000048c742100100000048c742080300000048890241505141ff704841ff7038498b40104989d04889cb909090ff15da000000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44241090ff15a6000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004883c408594883c408488908c348833807741048b8683311c9a37f0000488b5d08ff1348c7c0010000004889daff229090909090909000000000000000004003000000000000|@5075,2097151,@16521,@4785,@5080,@3834,@3643,@3834,@3643|31,0,@578 101,0,36028797018963967 137,0,@560 173,0,@1662 490,0,@3642 718,0,@4387 791,0,@5078 5078:O4|@20055,@557,@5074,@5079 5079:O5|@3867,1248,0,1248,0 5080:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16522| 5081:O1|@5082 5082:O2|@5083,0 5083:O1|@5084 5084:D3,32|48b8c03411c9a37f0000c3909090909000000000000000001800000000000000|@5107,1,@16533|2,0,@5085 5085:O1|@5086 5086:D5,120|483b65187303ff55484889c34889d890ff157a000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889015349b8803511c9a37f000048bb083811c9a37f00004889c8909090ff153e0000004889c1584889caff22909090909000000000000000007000000000000000|@5104,1048575,@16530,@5105,@5100|60,0,@5087 70,0,@5094 5087:O1|@5088 5088:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba003611c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16525|29,0,@5089 5089:D4,184|483b65187303ff5548488b4208488b5808488b084889c890ff15b2000000a8017516488b0848833903750d488378080175064883fb0174154889c148b8e83611c9a37f0000488b5d089090ff13498d57b0483b55107303ff55404989d748c742f802000000488b71084889720848c70247000000488d7a1848c747f80200000048c7470801000000488917488d471848c740f803000000488978104889580848c70001000000c3900000000000000000b000000000000000|@4942,63,@16523,@5093|61,0,@5090 5090:O4|@20055,@557,@5092,@5091 5091:O5|@4546,642,0,642,0 5092:S10|67656e4c6f636b536567 5093:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16524|28,0,@1662 5094:O1|@5095 5095:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb903811c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16528|33,0,@5096 5096:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb103911c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16527|29,0,@5097 5097:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16526,@4949| 5098:S31|5838364c4f574c4556454c28292e6c6f6164546f4f6e654f66283129283129 5099:S34|5838364c4f574c4556454c28292e616c6c496e526567697374657273283229283129 5100:D3,200|483b65187303ff5548488b0848c7c201000000f6c1017573f60101751ff6c20174064883c2027105ff5570ebf5488b4908483b65187303ff5548ebd7498d4fe0483b4d107303ff55404989cf48c741f80300000048bee03a11c9a37f0000488931488959084c894110488061ffbf4889c6498d47e8483b45107303ff55404989c748c740f802000000eb05e92300000048894808488910565341504889da9090ff124889c1488b4424104889ca4883c418ff224c89c2ff220000000000000000c000000000000000|@5106,1048575,@16532|86,0,@5101 5101:D3,48|483b65187303ff55484c8b4210488b5a0848ba383b11c9a37f0000ff2290909000000000000000002800000000000000|@5103,1048575,@16529|19,0,@5102 5102:O1|@5100 5103:S37|5838364c4f574c4556454c28292e616c6c417267732833296e657874417267283229283129 5104:S38|5838364c4f574c4556454c28292e6e6f726573756c744e65676f746961746f72283129283129 5105:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16531| 5106:S24|5838364c4f574c4556454c28292e616c6c41726773283329 5107:S33|5838364c4f574c4556454c28292e696e7374724c6f636b5365672d283229283129 5108:O4|@20055,@557,@5110,@5109 5109:O5|@3867,1338,0,1338,0 5110:S32|4c6f636b20696e737472756374696f6e206e6f7420696d706c656d656e746564 5111:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16573| 5112:S36|47454e45524154455f434f444528292e636f646567656e28392967656e50726f63283329 5113:D11,1376|488dbc2458ffffff483b7d187303ff5550a8017564488b084883390d7560488b510848833a01755b41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000eb0fe9c2040000e921030000e9a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c20100000049c7c10100000049c7c00100000048c7c3030000004889c8488b942480000000ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b442418909090ff1586040000488b4c2420488b094883f9017506488b4808eb15488b304889cb488b4008ff156a0400004889c1eb03488b30488b442420488908eb6948833a057568488b720840f6c60174084883fe017d08eb21f646ff10751b498b3840f6c601740b40f6c7017405483bf7eb05ff5570ebf67c14488b780848b838e407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5498b74b0fc4883feffeb0ae904030000e90d010000750948c7c6ffffffffeb6d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e98400000049c7c10100000049c7c00100000048c7c3030000004889c8488b942480000000ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b442418909090ff1522030000488b4c2420488b094883f9017506488b4808eb15488b304889cb488b4008ff15060300004889c1eb03488b30488b442420488908eb6b41524151415053ff7008eb6441524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000eb0ae98e010000e989010000ffb424a000000049c7c20100000049c7c10100000049c7c00100000048c7c3030000004889c8488b94248000000090ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b442418909090ff152a020000488b4c2420488b094883f9017506488b4808eb15488b304889cb488b4008ff150e0200004889c1eb03488b30488b442420488908eb6d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e98400000049c7c10100000049c7c00100000048c7c3030000004889c8488b9424800000009090ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b442418909090ff1542010000488b4c2420488b094883f9017506488b4808eb15488b304889cb488b4008ff15260100004889c1eb03488b30488b44242048890856ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424880000004c8b8c24800000004c8b442478488b5c2470488b442468909090e8eafaffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2600048c7c001000000c2600090909090909000000000000000005805000000000000|@1363,2097151,@16535,@5030,@5115,@5030,@5116,@5030,@5117,@5030,@5114|209,0,@5027 359,0,@1493 581,0,@5027 845,0,@5027 1093,0,@5027 5114:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16539| 5115:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16536| 5116:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16537| 5117:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16538| 5118:D6,408|483b65187303ff5548a8017563488338ff750c48b9b00607c9a37f0000eb564889df4c8b40084c8b084c89cb488b4710ff157a0100004883f80175745741505048c7c3030000004c89c848baa05f06c9a37f0000ff155e0100004889c348b8804b0fc9a37f000090ff1552010000eb0ae905010000e9c7000000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b08488339017529488b4108498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000eb39488339077529488b4108498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb0a48b9b00607c9a37f00004889fbeb044c8b4008534150514c89c090e8aefeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000009001000000000000|@1363,2097151,@16540,@3852,@194,@100|21,0,@803 76,0,@193 95,0,@4505 148,0,@4506 166,0,@557 187,0,@20055 308,0,@803 5119:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16541| 5120:D3,200|483b65187303ff55484883f801750848c7c001000000c3488b0848833905755e498d57f0483b55107303ff55404989d748c742f80100000048891af6c30174064883c3027105ff5570ebf552488b48084889c89090e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c3909090909090900000000000000000c000000000000000|@5121,15,@16542| 5121:S48|47454e45524154455f434f444528292e636f646567656e28392967656e50726f632833296d616b65496e646578283229 5122:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16543| 5123:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16544| 5124:D13,880|483b65187303ff5548a801755af6c301755a488b0b488339057556488338ff7555498b5138488b1241524151ff7308ff700841505241ff714841ff713849b830e00ec9a37f00004889d3498b41109090ff1532030000488b442410a80174064883c002711beb14e9e3020000e9d4020000e91f010000e936000000ff5570ebdf5948890148833c2401741f49c7c00100000048bbf0dd0ec9a37f0000488b442428909090ff15e60200004883c40858eb14488b5008488b304889f041524151ff7308524150f6042401741e488b54242048b9ffffffffffffff0048234af8488d4c0901483b0c2477144889c148b8b0df06c9a37f0000488b5d0890ff13488b0c24488b4c8afc4883f90175154889c348b8386208c9a37f0000488b5d089090ff134c8b4c24184c8b014889c3488b442438909090ff155e020000488b4c2430488b094883f901740a4889cb90ff154e020000488b4c243048890158a80174064883c0027105ff5570ebf5488b542430488954243048894c24284c8b5424184c8b4c24104989c0488b5c2408584883c418e96bfeffff488b7b084c8b58084c8b204c89e3498b411090ff15fa010000a801747241524151574153415041545048c7c3030000004c89e048baa05f06c9a37f00009090ff15d60100004889c348b890dc0ec9a37f000090ff15ca010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff10742041524151574153415049c7c0030000004c89e34c89c89090ff1536010000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b68104c896a1048894a08488b0848890a4152415157415341504989d04c89e3498b4110909090ff15e600000048c7c001000000488b4c2430488b094883f901740b4889cb9090ff15ce000000488b4c243048890158a80174064883c0027105ff5570ebf5488b542430488954243048894c24284c8b5424184c8b4c24104989c0488b5c2408584883c418e9bbfcffff48c7c001000000c2100048c7c001000000c210009090909090909000000000000000006803000000000000|@5126,2097151,@16545,@3834,@3643,@4921,@5127,@3852,@194,@100,@4422,@3834,@5125|63,0,@4402 148,0,@4387 210,0,36028797018963967 238,0,@560 273,0,@1662 458,0,@193 479,0,@4379 520,0,@4380 538,0,@557 559,0,@20055 5125:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16547| 5126:S50|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332966696c6c436c6f73757265283329 5127:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16546| 5128:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16548| 5129:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16549| 5130:D5,696|488dbc2458ffffff483b7d187303ff5550a8017568f6c3017568488338ff756741524151ff7308ff700841504152ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb0fe915020000e910020000e9f7000000ffb424b0000000ffb424b0000000ffb424b000000049c7c20100000049c7c10100000049c7c001000000488b0348c7c303000000488b942490000000ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13f6042401741e488b54243848b9ffffffffffffff0048234af8488d4c0901483b0c247714488b0848b8b0df06c9a37f0000488b5d0890ff13488b0c24488b4c8afc4883f9017515488b1848b8386208c9a37f0000488b5d089090ff134c8b8c24a80000004c8b01488b18488b442430ff1576010000488b8c24a0000000488b094883f901740b4889cb9090ff1562010000488b8c24a0000000488901eb0c41524151ff7308ff7008415058a80174064883c0027105ff5570ebf5488b8c24a0000000488b942498000000488b9c2490000000488bb42488000000488bbc24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b74244850488b44244850488b44244850488b44244850488b44244848898c24c000000048899424b800000048899c24b00000004889b424a80000004889bc24a00000004c898424980000004c898c24900000004c899424880000004c899c24800000004c896424784c896c24704c89742468488b4c241048894c2460488b4c240848894c2458594883c41048894c243848894424304c8b5424204c8b4c24184158488b5c2408584883c418e969fdffff48c7c001000000c28000909090909090900000000000000000b002000000000000|@5132,2097151,@16550,@4921,@5131|213,0,@4376 242,0,36028797018963967 270,0,@560 305,0,@1662 5131:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16551| 5132:S52|47454e45524154455f434f444528292e636f646567656e28392967656e50726f6328332966696c6c526563757273697665283329 5133:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16552| 5134:D7,168|483b65187303ff5548a8017566488b4a08488b591852ff30ff71484c8b4b104c8b4308488b034889c3488b4424089090ff158a00000048833c24017441488b4424089090ff157e0000004889c348b810e00ec9a37f000090ff1572000000488b4c241049c7c0010000004889c3488b4108eb05e912000000ff155a00000048c7c0ffffffff4883c418c348c7c0ffffffffc39090909090900000000000000000a000000000000000|@4990,2097151,@16553,@4428,@3770,@100,@3643|79,0,@4401 5135:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16554| 5136:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16555| 5137:D4,96|483b65187303ff5548a801753af6c301753541514150ff33ff30488b5b08488b4008909090e8d6ffffff4c8b5424184c8b4c24104989c0488b5c2408584883c418ff253100000048c7c001000000c39000000000000000005800000000000000|@5139,2097151,@16556,@5138| 5138:D9,424|483b65187303ff554848833b0575234889c1498d47e8483b45107303ff55404989c748c740f8020000004c894008488908c34889c74889fb498b4110ff157e010000a801746e415057415241515048c7c3030000004889f848baa05f06c9a37f00009090ff155e0100004889c348b890dc0ec9a37f000090ff1552010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c41506a01415249c7c0030000004889fb4c89c890ff15c2000000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b58104c895a1048894a08488b0848890a41506a0141524989d04889fb498b41109090ff157600000048c7c001000000488b0c24488b094883f901740c4889cb909090ff155e000000594883c40848890158c3909090900000000000000000a001000000000000|@5141,2097151,@16557,@3852,@194,@100,@4422,@3834,@5140|90,0,@193 111,0,@4379 152,0,@4380 170,0,@557 191,0,@20055 5139:S19|4c697374506169722e666f6c64722834292829 5140:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16558| 5141:S55|47454e45524154455f434f444528292e636f646567656e28392967656e50726f632833296e6f6e436f6e7374456e74726965732d283329 5142:D20,1144|483b65187303ff55486a016a014889d948ba28cd06c9a37f00005053f6c1017560488339ff7528498d47e8483b45107303ff55404989c748c740f802000000488b5a0848895808488b32488930eb64488b442408488b79084c8b42084c8b0a4c8b114c89d3488b48104889c8ff151e040000a8017567488b00488338037563eb05e9f4010000488b4424084c89d3488b48104889c8909090ff15fa030000a8017470574150415141525048c7c303000000eb05e9ad0100004c89d048baa05f06c9a37f0000909090ff15d20300004889c348b890dc0ec9a37f0000eb0ae961010000e95c01000090ff15ba030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb05e92e000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f28eb06f641ff1074205741504151415249c7c0030000004c89d3488b4424289090ff1526030000eb61498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b58104c895a1048894a08488b0848890a4c8b642408574150415141524989d04c89d3498b442410909090ff15d202000048c7c00100000048837c240801740d488b5c24089090ff15be020000498d4fd0483b4d107303ff55404989cf48c741f802000000488b542410488951085a4883c4104889114889c2488d411848c740f80200000048894808488910eb25498d47e8483b45107303ff55404989c748c740f8020000004c8940084c890857eb03ff71084889c259483b65187303ff5548e9a2fdffff488d442410488b0a488908488d442410488b5a084889580849c7c00100000048c7c301000000488b44240848ba90e00ec9a37f000090ff15120200005048c7c39fff0000488b44241090ff1506020000488b4c2410488b5118ff70084c8b4a104c8b4208488b1a488b00ff15ee0100006a016a01504c8b442430488d5c2408488b4424289090ff15da010000498d47b0483b45107303ff55404989c748c740f803000000488b4c244048894810488b4c24084889480848c70003000000488b4c2430488b5138488b12488d582048c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890352ff7148ff71384989d84889d3488b411090ff155e010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d4c8b44242048bb285f11c9a37f0000488b442440909090ff152a01000048837c2448017507488b442430eb11488b5c2448488b44243090ff15120100004883f8017507488b442428eb0f4889c3488b44242890ff15fe0000004883f8017507488b442410eb0f4889c3488b44241090ff15ea0000004883f8017507488b442420eb0f4889c3488b44242090ff15d60000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c408594883c448488908c3909000000000000000007004000000000000|@5145,2097151,@16559,@3852,@3852,@194,@100,@4422,@3834,@5146,@4465,@4529,@4428,@5147,@3834,@3643,@5150,@5151,@5152,@5144|18,0,@440 189,0,@193 211,0,@4379 264,0,@4380 289,0,@557 303,0,@20055 679,0,@4405 944,0,@5143 5143:S18|637265617465537461636b436c6f73757265 5144:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16566| 5145:S37|434f444547454e5f5441424c4528292e637265617465537461636b436c6f73757265283229 5146:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16560| 5147:D7,368|483b65187303ff55484883f801751748c7030100000048c743080100000048c7c001000000c36a016a01534150ff30488d5c2418488b400890e8c2ffffff488b442408488b4858488b0948833c24ff756c488b5038488b125152ff7048ff703849b830e00ec9a37f00004889d3488b70104889f0ff150e010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44242090ff15da0000004883c40858eb05488b042451594883c408f6c10174064883c1027105ff5570ebf56a016a014989e14989c84889c3488b442410909090ff15a6000000498d47e8483b45107303ff55404989c748c740f802000000488b4c2420488948085948890848837c2420017506488b0c24eb1b4889c6488b5c2420488b0424909090ff15660000004889c14889f0488b5424104883c41048890248894a0848c7c0010000004883c418c39090909000000000000000006801000000000000|@5149,2097151,@16561,@3834,@3643,@4813,@5148|98,0,@4402 162,0,@4387 5148:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16562| 5149:S49|434f444547454e5f5441424c4528292e637265617465537461636b436c6f7375726528322970757368456e747279283129 5150:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16563| 5151:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16564| 5152:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16565| 5153:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16567| 5154:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16568| 5155:D5,696|488dbc2458ffffff483b7d187303ff5550a8017568f6c3017568488338ff756741524151ff7308ff700841504152ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb0fe915020000e910020000e9f7000000ffb424b0000000ffb424b0000000ffb424b000000049c7c20100000049c7c10100000049c7c001000000488b0348c7c303000000488b942490000000ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13f6042401741e488b54243848b9ffffffffffffff0048234af8488d4c0901483b0c247714488b0848b8b0df06c9a37f0000488b5d0890ff13488b0c24488b4c8afc4883f9017515488b1848b8386208c9a37f0000488b5d089090ff134c8b8c24a80000004c8b01488b18488b442430ff1576010000488b8c24a0000000488b094883f901740b4889cb9090ff1562010000488b8c24a0000000488901eb0c41524151ff7308ff7008415058a80174064883c0027105ff5570ebf5488b8c24a0000000488b942498000000488b9c2490000000488bb42488000000488bbc24800000004c8b4424784c8b4c24704c8b5424684c8b5c24604c8b6424584c8b6c24504c8b74244850488b44244850488b44244850488b44244850488b44244848898c24c000000048899424b800000048899c24b00000004889b424a80000004889bc24a00000004c898424980000004c898c24900000004c899424880000004c899c24800000004c896424784c896c24704c89742468488b4c241048894c2460488b4c240848894c2458594883c41048894c243848894424304c8b5424204c8b4c24184158488b5c2408584883c418e969fdffff48c7c001000000c28000909090909090900000000000000000b002000000000000|@5132,2097151,@16569,@5157,@5156|213,0,@4376 242,0,36028797018963967 270,0,@560 305,0,@1662 5156:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16572| 5157:D12,616|483b65187303ff55484889df4989c24c89d3498b41109090ff15620200004989c34889fb498b4110ff155a020000a801746e4151415057415241535048c7c3030000004889f848baa05f06c9a37f0000ff153a0200004889c348b890dc0ec9a37f000090ff152e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f28eb06f641ff10742041514150574152415349c7c0030000004889fb4c89c89090ff159a010000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b60104c89621048894a08488b0848890a4151415057415241534989d04889fb498b4110909090ff154a01000048c7c001000000f6042401750d488b0c24488b1148833a0374154889c148b8d06b11c9a37f0000488b5d089090ff13498d5f98483b5d107303ff55404989df48c743f802000000488b72104883c40848897308488b7c240848893b4c8d431849c740f80300000049895810488b5a084989580849c700030000004d8d482049c741f8050000004c8b51204d8951204c8b59184d8959184c8b61104d8961104c8b69084d8969084d89014c8b442418504d8b70104d89c8488b5c24084c89f0ff158e0000004c8b4c24204c8b442418488b5c2410488b4424089090ff157a00000048833c240175054883c428c35b4883c420ff256b00000090909000000000000000006002000000000000|@5162,2097151,@16570,@3852,@3852,@194,@100,@4422,@3834,@3834,@4921,@5161|72,0,@193 91,0,@4379 132,0,@4380 150,0,@557 171,0,@20055 381,0,@5158 5158:O4|@20055,@557,@5160,@5159 5159:O5|@4331,3258,0,3258,0 5160:S39|736574526563757273697665436c6f73757265456e7472793a206e6f7420636f6e7461696e6572 5161:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16571| 5162:S43|434f444547454e5f5441424c4528292e736574526563757273697665436c6f73757265456e747279283429 5163:O3|@5165,@4364,@5164 5164:O3|@5180,@4364,@5050 5165:D33,5104|488dbc2410ffffff483b7d187303ff5550488b4c2470488b7138488b36488b7908488b3f4c8b59284d8b1b4d8d67e04c3b65107303ff55404d89e749c74424f8030000004d895c241049897c240849893424488b7138488b364c8b690849897500488b7158488b364c8b712849893648833b1d742748833b0d741848833b07740948c7c601000000eb1948c7c603000000eb1048c7c603000000eb0748c7c6030000006a016a016a014883fe01741a4889e648c706030000004889e64c8946084889e648895e10eb184889e648c706010000004889e648895e084889e34c89431041524151524153574154ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a80000004c8b9424100100004989c94c8b842420010000488b9c2490000000488b72104889f2909090ff124883f801756f488b8424b8000000488b4808488b542408488911488b5028488b5c241048891a488b5c2418488bb424c8000000488bbc24c00000004c8b8424b00000004c8b8c24a80000004c8b9424a00000004c8b9c24980000004c8ba424900000004c8bac24880000004c8bb42480000000eb05e9d7000000488b4c2478488b54247052488b54247052488b54247052488b54247052488b5424704889bc24e800000048898424e00000004c898424d80000004c898c24d00000004c899424c80000004c899c24c00000004c89a424b80000004c89ac24b00000004c89b424a800000048898c24a0000000488b4424184889842498000000488b4424104889842490000000488b4424084889842488000000584883c418488944246048895424584989f24c8b4c24284c8b442420488b430848c7c3030000004889c1488b4424384889ca4883c448594883c40851ff22488b8c24b8000000488b11488b124883fa017471488b5108488b5c240848891a488b5928488b7424104889334889cb9090ff151a110000488b8c24b0000000488b094883f901740b4889cb9090ff1506110000488b8c24b0000000488901488b442418488b9424c8000000488b9c24c0000000488bb424b8000000488bbc24a8000000eb05e9000100004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247041564c8b74247041564c8b74247041564c8b74247041564c8b74247048899c24e80000004889b424e000000048898c24d80000004889bc24d00000004c898424c80000004c898c24c00000004c899424b80000004c899c24b00000004c89a424a80000004c89ac24a0000000488b4c241848898c2498000000488b4c241048898c2490000000488b4c240848898c2488000000594883c41848894c24604c897424584989d24c8b4c24284c8b44242048c7c303000000488b4808488b4424404889ca4883c448594883c40851ff226a016a01f644243801755c488b542438488b1a48833b017515488b730840f6c60174064883c6207125ff5570ebf548837b10037515488b730840f6c60174064883c6107109ff5570ebf5488b730840f6c6017518488b3ef646ff10740348f7df488d7c3f01eb08e9f40100004889f74889f948c7c6030000004883ee014883f97f760748c7c17f00000048d1e948d3e64883ce01488d4c0901498d4ff0483b4d107303ff55404989cf48c741f801000000488931488b7c2428505156ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004c8b9424680100004989d14989c848c7c303000000488b8424d8000000488b570890ff1248837c24080175134889c148b8e8dc0ec9a37f0000488b5d08ff13f644240801756a4883f80175134889c148b870dd0ec9a37f0000488b5d08ff13488b8c24e0000000488b11488b124883fa017420498d57f0483b55107303ff55404989d748c742f801000000488b00488902eb6c6a016a016a014989e249c7c1030000004c8b442418488b184889c8eb05e96700000090ff15f60d0000488b8424f00000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15d20d0000488b8c24e8000000488901498d57f0483b5510730aeb05e91f000000ff55404989d748c742f801000000584883c408488902eb0748c7c201000000488d4424184883c408488910488d4424105948894808eb6c48837c2430017569488b54242850ffb424d800000051ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000eb0ae9f5050000e934040000ffb424d80000004c8b9424580100004c8b8c24b80000004c8b8424b000000048c7c303000000488b8424c8000000488b72084889f2ff12488b8c24d0000000488b11488b124883fa017417488d542408488902488d44240848c7400801000000eb6b4883f80175164889c248b8688211c9a37f0000488b5d08909090ff13488b384889fb488b411090ff15820c00004883f801756f575048c7c3030000004889f848baa05f06c9a37f00009090ff15660c00004889c348b8804b0fc9a37f000090ff155a0c0000498d4fd8eb05e91e050000483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b08488339097521498d57f0483b55107303ff55404989d748c742f801000000488b590848891aeb0748c7c2010000004883fa01750948c7c29fff0000eb57488b1a48833b017515488b730840f6c60174064883c6207125ff5570ebf548837b10037515488b730840f6c60174064883c6107109ff5570ebf5488b730840f6c60175184c8b06f646ff10740349f7d84f8d440001eb08e9500000004989f04c89c148c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c09014881e00100fe004883f80174064883f801750948c7c29fff0000eb0748c7c20100fe00576a016a016a014989e249c7c1030000004989d04889fb488b8424f0000000ff15f20a0000488b8424e80000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15ce0a0000488b8c24e0000000488901498d47f0483b45107303ff55404989c748c740f801000000488b1424488910488b9c24e80000004889c7488b43104889d39090ff15920a00004883f8017576575048c7c303000000488b44241048baa05f06c9a37f0000ff15760a00004889c348b8804b0fc9a37f000090ff156a0a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff13488b08488339097521498d57f0483b55107303ff55404989d748c742f801000000488b590848891aeb0748c7c2010000004883fa01751148b8386208c9a37f0000488b5d0890ff13488b1a48833b017515488b730840f6c60174064883c6207125ff5570ebf548837b10037515488b730840f6c60174064883c6107109ff5570ebf5488b730840f6c60175134c8b06f646ff10740349f7d84f8d440001eb034989f04c89c14883c41848c7c0030000004883e8014883f97f760748c7c17f00000048d1e948d3e04883c801488d4c0901498d4ff0483b4d107303ff55404989cf48c741f801000000488901488d442408488938488d44240848894808eb73488b54242850ffb424d800000051ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d80000004c8b942458010000eb05e9440100004c8b8c24b80000004c8b8424b000000048c7c303000000488b8424c8000000488b72084889f2909090ff1248837c24380175134889c148b8e8dc0ec9a37f0000488b5d08ff13f6442438017555488b4c24384883f80175164889c248b870dd0ec9a37f0000488b5d08909090ff13488b9424d0000000488b1a488b1b4883fb017425498d5ff0483b5d107303ff55404989df48c743f801000000488b00488903eb68e9800000006a016a016a014989e249c7c1030000004c8b01488b184889d090ff15de070000488b8424e00000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15ba070000488b8c24d8000000488901498d5ff0483b5d10730aeb05e91f000000ff55404989df48c743f801000000584883c408488903eb0748c7c301000000488d442408488918488d442408488b4c243848894808f644244001755c488b8424d0000000488b08488b094883f90175484989c0488b9c248800000048c7c001000000ff153e070000488b8c24c8000000488b094883f901740b4889cb9090ff152a070000488b8c24c800000048890148c7c001000000eb0748c7c0010000006a016a01488b8424e0000000488b4820488b094883f90174174889e148c701010000004889e148c7410801000000eb6fff70204c8b50584c8b48484c8b4040488b5838488b48104889c890ff15c6060000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891aeb05e906010000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f803000000488b5c241848895910488941084c89014889e04889084889e048895008488b8424d8000000488b004883f8017507488b442408eb0f4889c3488b44240890ff154e050000488b8c24d800000048890148837c241801750948c7c001000000eb6e488b442418488b9424e0000000488b384889fb488b4210909090ff151a050000a801746d575048c7c3030000004889f848baa05f06c9a37f0000ff15020500004889c348b890dc0ec9a37f000090ff15f6040000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c0030000004889fb488b8424e00000009090ff155e040000eb59498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b40104c89421048894a08488b0848890a4c8b8c24e00000004989d04889fb498b4110ff151204000048c7c001000000488b8c24d8000000488b094883f901740c4889cb909090ff15f6030000488b8c24d800000048890148c7c001000000488b9c24e0000000488b442410909090ff15d6030000488b8c24d8000000488b094883f901740b4889cb9090ff15c2030000488b8c24d800000048890148837c2420017572488b442440ffb424e8000000ffb424e800000051ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004c8b942468010000eb05e9280000004c8b8c24c80000004c8b84249800000048c7c303000000488b5008488b8424e000000090ff12eb72488b442440ffb424e8000000ffb424e800000051ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004c8b942468010000eb05e92a0100004c8b8c24c80000004c8b84249800000048c7c303000000488b5008488b8424e00000009090ff1248837c24200175134889c148b8e8dc0ec9a37f0000488b5d08ff13f6442420017555488b4c24204883f80175164889c248b870dd0ec9a37f0000488b5d08909090ff13488b9424e0000000488b1a488b1b4883fb017425488b08498d47f0483b45107303ff55404989c748c740f801000000488908eb68e9800000006a016a016a014989e249c7c1030000004c8b01488b184889d090ff15de010000488b8424f00000004883c408488b004883f8017507488b442408eb104889c3488b4424089090ff15ba010000488b8c24e8000000488901498d47f0483b4510730aeb05e91f000000ff55404989c748c740f8010000005a4883c408488910eb0748c7c0010000006a016a014989e24c8b4c24384989c0488b9c24f0000000488b442410909090ff1562010000488b8424f0000000488b4808488b542440488911488b5028488b5c244848891a488b9c24e8000000488b1b4883fb017507488b5c2408eb0f488b44240890ff15260100004889c3488b8424e8000000488918584883c478c280000000000000000000e813000000000000|@5170,2097151,@16574,@4654,@5171,@4504,@5172,@3852,@194,@100,@4504,@5173,@3852,@194,@100,@4504,@5174,@4668,@5175,@4594,@5176,@3852,@194,@100,@4422,@3834,@5177,@4654,@5178,@4504,@5179,@4686,@5169|1431,0,@4381 1463,0,@4384 1924,0,@5166 1978,0,@193 1999,0,@4505 2047,0,@4506 2065,0,@557 2086,0,@20055 2516,0,@193 2535,0,@4505 2576,0,@4506 2594,0,@557 2608,0,@20055 2694,0,@1662 3067,0,@4381 3104,0,@4384 3587,0,576460752303423480 3984,0,@193 4003,0,@4379 4051,0,@4380 4069,0,@557 4090,0,@20055 4715,0,@4381 4752,0,@4384 5166:O4|@20055,@557,@5168,@5167 5167:O5|@3867,1751,0,1751,0 5168:S18|67656e436f6e643a206e6f20726573756c74 5169:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16584| 5170:S36|47454e45524154455f434f444528292e636f646567656e28392967656e436f6e64283629 5171:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16575| 5172:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16576| 5173:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16577| 5174:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16578| 5175:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16579| 5176:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16580| 5177:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16581| 5178:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16582| 5179:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16583| 5180:D69,13024|488dbc2410ffffff483b7d187303ff5550488b0848be468811c9a37f0000488d748efcffe690e98b000000909090e948010000909090e9c3030000909090e9880d0000909090e96b000000909090e98d0f0000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e9782f0000909090e91b000000909090e913000000909090e9bb300000909090e903000000909090488b4c2460488b742458488b7c24504c8b5c24484c8b6424404c8b6c24384c8b74243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c248800000048898c2480000000488974247848897c24704c895c24684c896424604c896c24584c897424504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff257d310000f6401001756e488b481048837908017568488b31498dbf58ffffff483b7d107303ff55404989ff48c747f80200000048c74708030000004c8b58084c891f4c8d671849c74424f80300000049c7442410010000004c8b6e084d896c240849c70424070000004d8d74242049c746f802000000eb0ae945010000e94001000049c74608030000004d89264d8d661849c74424f80200000049c7442408010000004d8934244d8d74241849c746f8020000004d89660849893e498d7e1848c747f80400000048c747180300000049bc28a60bc9a37f00004c8967104c89770848c7070b0000004d8d67d84c3b65107303ff55404d89e749c74424f8040000004c8b70184d897424184c8b1e4d895c241049897c240849c7042405000000488b7c2460488b4424584c8b742450488b4c24484c8b5c2440488b7424384c8b6c243041524c8b54243041514c8b4c243041504c8b44243052488b54243053488b5c24304889bc248800000048898424800000004c8974247848894c24704c895c246848897424604c896c24584c895424504c894c24484c89442440488954243848895c24304c8b5424204c8b4c24184c8b4424105b4c89e05a4883c418e9c7fcffff488b4c2460488b742458488b7c24504c8b5c24484c8b6424404c8b6c24384c8b74243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c248800000048898c2480000000488974247848897c24704c895c24684c896424604c896c24584c897424504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25022f0000498b4938488b09498b7108488b36498b7928488b3f4d8d5fe04c3b5d107303ff55404d89df49c743f80300000049897b104989730849890b498b4938488b094d8b610849890c24498b4958488b094d8b692849894d00498b4938488b094d8b34244d8b65004d8d6fe04c3b6d107303ff55404d89ef49c745f8030000004d8965104d89750849894d00498b4938488b0941524d8b510849890a498b4958488b094d8b512849890a415141505253ff7010575641544156ff701841534155ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c80000004c8b9424c000000048c7c301000000488b4008909090e8d6faffff4883f801756f488b442458488b4808488b542418488911488b5028488b5c242048891a488b5c2428488919488b5c243048891a488b9c24c8000000488bb424c0000000488bbc24b80000004c8b8424b00000004c8b8c24a80000004c8b9424a00000004c8b9c24980000004c8ba42490000000eb05e99b0000004c8bac24880000004c8bb42480000000488b4c2478488b44247048899c24c80000004889b424c00000004889bc24b80000004c898424b00000004c898c24a80000004c899424a00000004c899c24980000004c89a424900000004c89ac24880000004c89b4248000000048894c247848894424704c8b5424604c8b4c24584c8b442450488b5c2440488b4424384883c4485a4883c418e9c1f9ffff488b4c2458488b11488b124883fa017474488b5108488b5c241848891a488b5928488b742420488933488b742428488932488b7424304889334889cb90ff15862c0000488b4c2460488b094883f901740a4889cb90ff15762c0000488b4c2460488901488b8424c8000000488b9424c0000000488b9c24b8000000488bb424b0000000eb05e9b9000000488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247048898424c800000048899424c000000048899c24b80000004889b424b00000004889bc24a80000004c898424a00000004c898c24980000004c899424900000004c899c24880000004c89a424800000004c896c24784c897424704989ca4c8b4c24584c8b442450488b5c2440488b4424104883c4485a4883c418e97ef8ffff50ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d0000000ffb424d00000004c8b9424c80000004989c94c8b8424b8000000488b9c24a8000000488b8424a0000000488b9424b0000000909090e8f6f7ffff6a016a01488b4c2470488b5120488b124883fa0174174889e248c702010000004889e248c7420801000000eb6d50ff71204c8b51584c8b49484c8b4140488b5938488b411090ff15c22a0000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891aeb05e90b010000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488941084c8901488d442408488908488d44240848895008eb0150488b842480000000488b004883f8017507488b442410eb114889c3488b442410909090ff1542290000488b8c2480000000488901488b5c2478488b44241890ff152e290000488b8c2480000000488b094883f901740b4889cb9090ff151a290000488b8c2480000000488901488b4424604883f002ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004989ca4c8b8c24d80000004c8b8424d00000004889c3488b842490000000488b9424c800000090e856f5ffff6a016a01504c8d5424084c8b4c243849c7c001000000488b9c2490000000488b442418909090ff1562280000488b842490000000488b4808488b542450488911488b5028488b5c245848891a488b9c2498000000488b1b4883fb017507488b5c2410eb0f488b44241090ff15262800004889c3488b8424980000004889186a016a01488b8c24a0000000488b5120488b124883fa0174174889e248c702010000004889e248c7420801000000eb70ff71204c8b51584c8b49484c8b4140488b5938488b411090ff15d2270000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891a498d5ff0eb05e901010000483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488941084c89014889e04889084889e048895008488b8424a8000000488b004883f8017507488b442408eb104889c3488b4424089090ff155a260000488b8c24a8000000488901488b9c24a0000000488b4424309090ff1542260000488b8c24a8000000488b094883f901740b4889cb9090ff152e260000488b8c24a80000004889016a016a014989e24c8b4c246049c7c001000000488b9c24b0000000488b442420909090ff1502260000488b8424b00000004883c408488b4808488b542478488911488b5028488b9c248000000048891a488b9c24b0000000488b1b4883fb017506488b1c24eb0d488b0424ff15c22500004889c3488b8424b00000004883c408488918584881c4a8000000c260004883780803740948c7c001000000eb0748c7c003000000483bc375636a016a01498b4120488b004883f80174174889e048c700010000004889e048c7400801000000eb73415241ff71204d8b5158498b4148498b4940498b5138498b59104989c14989c84889d84889d3909090ff153a250000498d4ff0483b4d10730aeb05e987010000ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000eb05e91c010000c642ff4048bbf1ffffffffffff0f48891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a04c3b45107303ff55404d89c749c740f8050000004989502049894818498958104989780849893048c70603000000498d483048c741f8020000004c89410848c7017d000000488d511848c742f80200000048c742080100000048890a5948c70103000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488941084c8901488d442408488908488d44240848895008eb024152488b0424488b004883f8017507488b442410eb114889c3488b442410909090ff15b623000059488901584883c408c2600048c7c001000000c26000488b4810488339077550f6400801754f488b7008f64608017559488b7e08f647080175544c8b5f0841f6430801755a4d8b630841f64424080175634d8b6c240849837d0801755c4d8b75004d8b2c244d8b1b488b3f488b36eb0ae9071f0000e93d1e0000488b4908483b0d39230000756eeb0ae91d180000e92a030000498d4fe8483b4d10730aeb05e954020000ff55404989cf48c741f802000000eb0ae93f020000e93a02000048c74108010000004d8b364c89314d8d77d04c3b75107303ff55404d89f749c746f80200000049894e08498b4d0049890e4d8d6618eb05e93901000049c74424f8020000004d897424084d8b1b4d891c244d8d5fe84c3b5d107303ff55404d89df49c743f8020000004d896308488b3f49893b498d7fe8483b7d107303ff55404989ff48c747f8020000004c895f08488b36488937488b7424604c8b5c24584c8b6424504c8b742448488b4c24404c8b6c243841524c8b54243841514c8b4c243841504c8b44243850488b44243853488b5c243857488b7c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b542428488954247848897424704c895c24684c896424604c8974245848894c24504c896c24484c895424404c894c2438488b4c24304c89442430488944242848895c242048897c24184c8b5424104c8b4c240849b838bd11c9a37f000048bba0d811c9a37f0000584883c41051ff2593210000488b4c2460488b742458488b7c24504c8b5c24484c8b7424404c8b6424384c8b6c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c248800000048898c2480000000488974247848897c24704c895c24684c897424604c896424584c896c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25d62000004c8b6424604c8b6c24584c8b742450488b4c2448488b742440488b7c24384c8b5c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c24880000004c89a424800000004c896c24784c8974247048894c2468488974246048897c24584c895c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25192000004c8b1f4c8b264c8b69084c3b2d10200000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b898d911c9a37f000048bbd0f411c9a37f0000584883c41051ff25f01e00004c3b2df11e0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b838f711c9a37f000048bba0f911c9a37f0000584883c41051ff25d11d00004c3b2dd21d0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b808fc11c9a37f000048bb480a12c9a37f0000584883c41051ff25b21c00004c3b2db31c0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8180d12c9a37f000048bbd82c12c9a37f0000584883c41051ff25931b00004c3b2d941b0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8a82f12c9a37f000048bb783212c9a37f0000584883c41051ff25741a00004c3b2d751a0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8483512c9a37f000048bb183812c9a37f0000584883c41051ff25551900004c3b2d56190000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8e83a12c9a37f000048bbb83d12c9a37f0000584883c41051ff25361800004c3b2d37180000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8884012c9a37f000048bbf04212c9a37f0000584883c41051ff25171700004c3b2d18170000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8584512c9a37f000048bbc04712c9a37f0000584883c41051ff25f81500004c3b2df9150000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8284a12c9a37f000048bb904c12c9a37f0000584883c41051ff25d91400004c3b2dda140000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8f84e12c9a37f000048bb605112c9a37f0000584883c41051ff25ba1300004c3b2dbb130000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8c85312c9a37f000048bba06f12c9a37f0000584883c41051ff259b1200004c3b2d9c120000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8a87312c9a37f000048bbb07712c9a37f0000584883c41051ff257c1100004c3b2d7d110000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8b87b12c9a37f000048bbc07f12c9a37f0000584883c41051ff255d1000004c3b2d5e100000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8c88312c9a37f000048bbd08712c9a37f0000584883c41051ff253e0f00004c3b2d3f0f0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8d88b12c9a37f000048bbe08f12c9a37f0000584883c41051ff251f0e00004c3b2d200e0000756e4d8d77d04c3b75107303ff55404d89f749c746f80200000049c7460801000000498b0b49890e4d8d6e1849c745f8020000004d8975084d8b34244d897500488b742460488b7c2458488b4c24504c8b5c24484c8b6424404c8b74243841524c8b54243841514c8b4c24384150eb05e9b30000004c8b44243850488b44243853488b5c243841554c8b6c2438488b52084889942490000000488b5424184889942488000000488b5424204889942480000000488b5424284889542478488974247048897c246848894c24604c895c24584c896424504c897424484c895424404c894c2438488b4c24304c89442430488944242848895c24204c896c24184c8b5424104c8b4c240849b8e89312c9a37f000048bbf09712c9a37f0000584883c41051ff25000d00004c8b742460488b4c24584c8b6c24504c8b642448488b742440488b7c24384c8b5c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c24880000004c89b4248000000048894c24784c896c24704c89642468488974246048897c24584c895c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25430c0000488b3e4c8b59084c3b1d3d0c0000756e4883f3024c8b6424604c8b6c24584c8b742450488b442448488b4c24404c8b5c2438488b74243041524c8b54243041514c8b4c243041504c8b44243052488b54243053488b5c24304c89a424880000004c89ac24800000004c89742478488944247048894c24684c895c2460eb05e93b00000048897424584c895424504c894c24484c89442440488954243848895c24304c8b5424204c8b4c24184c8b4424105b488b075a4883c418e9cdd6ffff4c3b1d8e0b000075644c8b2749833c2407755f41f644240801745c4c8b6c24604c8b742458488b442450488b4c24484c8b5c2440488b742438488b7c24304c8b64242841524c8b54242841514c8b4c242841504c8b44242852488b5424284c89ac24800000004c89742478eb0fe917040000e9ff000000e955000000488944247048894c24684c895c2460488974245848897c24504c896424484c895424404c894c24384c8944243048895424284c8b5424184c8b4c24104c8b44240848b8f89b12c9a37f00005a4883c418e9fcd5ffff4c8b6c24604c8b742458488b442450488b4c24484c8b5c2440488b742438488b7c24304c8b64242841524c8b54242841514c8b4c242841504c8b44242852488b5424284c89ac24800000004c89742478488944247048894c24684c895c2460488974245848897c24504c896424484c895424404c894c24384c8944243048895424284c8b5424184c8b4c24104c8b44240848b8189c12c9a37f00005a4883c418e957d5ffff4883fb01750c49bd389c12c9a37f0000eb0a49bd88a212c9a37f00004d8d77e84c3b75107303ff55404d89f749c746f80200000049c74608010000004d892650498d47e8483b45107303ff55404989c748c740f80200000048b9a8a312c9a37f0000488948084c893041524151415052534c89ea909090ff12a8017568488b08f64108017564488b510848837a0801755e488b5c2408ff31ff742418ff742428ff742438ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000eb0fe954010000e94f010000e94a010000ffb424b0000000ffb424b0000000ffb424b000000049c7c20100000049c7c10100000049c7c001000000488b730848c7c303000000488b024889f2ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b004889015148c7c001000000488b542408ff126a016a01ff70084c8d5424084c8b4c24404c8b44241848bb58a412c9a37f0000488b00909090ff157a080000488b4424404c8b50584c8b48484c8b4040488b5838488b48104889c89090ff155e0800004889c1498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048894808594883c408488908488b4c2438488b094883f9017506488b0c24eb174889c64889cb488b042490ff15120800004889c14889f0488b5424384883c41848890a4883c430c26000488b442408488b8c2490000000488b942488000000488b9c2480000000488b742478488b7c24704c8b4424684c8b4c24604c8b5424584c8b5c24504c8b6424484c8b6c24404c8b74243841564c8b7424204c89b424980000004c8b7424284c89b4249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c89642440488b4c24384c896c24385a488b5c242848895424284c8b5424104c8b48084989d8488b1c2448c7c0010000004883c42851ff252c0700004c8b6424604c8b6c24584c8b742450488b4c24484c8b5c2440488b742438488b7c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c24880000004c89a424800000004c896c24784c8974247048894c24684c895c2460488974245848897c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff256f060000488b742460488b7c24584c8b5c24504c8b6424484c8b6c24404c8b742438488b4c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c24880000004889b4248000000048897c24784c895c24704c896424684c896c24604c8974245848894c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25b2050000488b742460488b7c24584c8b5c24504c8b6424484c8b6c24404c8b742438488b4c243041524c8b54243041514c8b4c243041504c8b44243050488b44243053488b5c243053488b5c242048899c2490000000488b5c242848899c24880000004889b4248000000048897c24784c895c24704c896424684c896c24604c8974245848894c24504c895424484c894c24404c89442438488b4c243048894424305848894424204c8b5424104c8b4a084c8b4424085b4883c41848c7c00100000051ff25f5040000488b48084152415141505253ff7010f6c101756e488b442410ff7108ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b9424900000004c8b8c2488000000eb05e9270000004c8b84248000000048c7c301000000488b5010488b01ff1259483b65187303ff5548e961ffffff488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c2438488984249000000048898c2488000000488994248000000048895c2478488974247048897c24684c894424604c894c24584c895424504c895c24484c896424404c896c24384c8b5424284c8b4c24204c8b442418488b5c2408584883c4085a4883c418e99aceffff498d8f58ffffff483b4d107303ff55404989cf48c741f80200000048c7410803000000488b7010488931488d791848c747f80300000048c74710010000004c8b58084c895f0848c707070000004c8d672049c74424f80200000049c74424080300000049893c24498d7c241848c747f80200000048c74708010000004c89274c8d671849c74424f80200000049897c240849890c24498d4c241848c741f80400000048c741180300000048bf08a60bc9a37f0000488979104c89610848c7010b000000488b7c24604c8b6424584c8b6c24504c8b7424484c8b5c2440488b442438488b74243041524c8b54243041514c8b4c243041504c8b44243052488b54243053488b5c24304889bc24880000004c89a424800000004c896c24784c897424704c895c2468488944246048897424584c895424504c894c24484c89442440488954243848895c24304c8b5424204c8b4c24184c8b4424105b4889c85a4883c418e934cdffff909090900000000000000000d832000000000000|@5606,2097151,@16811,@5584,@5584,@4654,@5607,@4594,@5608,@4654,@5609,@4686,@5610,@4594,@5611,@4654,@5612,@4686,@5613,@4594,@5614,I154,@5615,@5584,@5584,I251,@5615,I217,@5615,I113,@5615,I231,@5615,I232,@5615,I233,@5615,I234,@5615,I247,@5615,I248,@5615,I249,@5615,I250,@5615,I122,@5615,I123,@5615,I118,@5615,I119,@5615,I120,@5615,I121,@5615,@5584,I218,I105,@4991,@4594,@5627,@5584,@5584,@5584,@5584|22,0,$5180+38 584,0,@3461 2199,0,576460752303423480 2999,0,576460752303423480 3725,0,576460752303423480 4575,0,@5181 4585,0,@5233 5282,0,@5237 5292,0,@5262 5585,0,@5267 5595,0,@5272 5888,0,@5277 5898,0,@5301 6191,0,@5306 6201,0,@5350 6494,0,@5355 6504,0,@5360 6797,0,@5365 6807,0,@5370 7100,0,@5375 7110,0,@5380 7403,0,@5385 7413,0,@5390 7706,0,@5395 7716,0,@5400 8009,0,@5405 8019,0,@5410 8312,0,@5415 8322,0,@5420 8615,0,@5425 8625,0,@5470 8918,0,@5478 8928,0,@5486 9221,0,@5494 9231,0,@5502 9524,0,@5510 9534,0,@5518 9827,0,@5526 9837,0,@5534 10130,0,@5542 10140,0,@5550 10738,0,@5558 10903,0,@5559 10929,0,@5560 10941,0,@5573 11011,0,@5578 11237,0,@4376 11330,0,@5581 12818,0,@3460 5181:O1|@5182 5182:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8bd11c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16604|30,0,@5183 5183:O1|@5184 5184:D4,40|483b65187303ff554848c7c313000000ff252a000000909000000000000000002000000000000000|@5230,127,@16602,@5185| 5185:D3,576|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a84c3b45107303ff55404d89c749c740f80500000049894820498940184989501049897808498930498d403048c740f80400000048b998c011c9a37f000048890848897008488958104c894018488060ffbf498d4fd0483b4d107303ff55404989cf48c741f80500000048bab0cc11c9a37f000048891148897108488959104c89411848894120488061ffbf498d57c8483b55107303ff55404989d748c742f80600000048bf18d011c9a37f000048893a4889720848895a104c8942184889422048894a28488062ffbf498d47e8483b45107303ff55404989c748c740f80200000048b950d511c9a37f000048890848895008488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048ba40d611c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048ba30d711c9a37f000048891048894808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f8020000004c894008488908c39000000000000000003802000000000000|@5231,127,@16603|65,0,576460752303423480 238,0,@5186 292,0,@5216 350,0,@5219 412,0,@5222 458,0,@5224 504,0,@5226 5186:D3,96|4889c1498d47d0483b45107303ff55404989c748c740f80500000048bb20c111c9a37f0000488918488b5a0848895808488b721048897010488b7a184889781848894820488060ffbfc390909090909000000000000000005800000000000000|@5215,63,@16590|29,0,@5187 5187:D5,120|483b65187303ff5548488b42204889d3488b084889c89090ff15720000004c8b4b184c8b4310488b4b084889cb909090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c390909000000000000000007000000000000000|@5210,2097151,@16585,@5211,@5188| 5188:D8,1400|483b65187303ff5548a801754c488b08488339037548f64008017549488b5008f6420801753f488b7208488b3e48833f037532f6460801752c4c8b560841f642080175214d8b5a084d8b2349833c2403751349837b0801eb0ae907000000e90200000074144889c148b898c711c9a37f0000488b5d0890ff134c8b69084c3b2d0c050000741c49837d0001744a49837d0003754849837d080d755049837d1001754e4c8b77084c3b35eb040000741a49833e01744f49833e03754e49837e080f754c49837e1001754a498b442408483b05cb040000eb0ae943000000e93e000000744e488338017436eb0ae92f000000e92a0000004883380375244883780803751deb14e916000000e911000000e90c000000e9070000004883781001741248b810c811c9a37f0000488b5d089090ff13488b3340f6c60174064883c6027105ff5570ebf5488933498d5fc0483b5d107303ff55404989df48c743f80400000048c74318010000004c894b104c89430848c70317000000488d732848c746f80200000049b890c811c9a37f00004c89460848891e498b1a48833b05755df6430801751248b8b8f309c9a37f0000488b5d089090ff1348837b0801750949c7c001000000eb6d4c8b430841f6c00174084983f8017d2feb0741f640ff10742656ff324c89c348b810c506c9a37f000048bad0a8dc0000000000eb05e97500000090ff12eb064c89c056ff32498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8788b0cc9a37f0000eb05e9380000004889411048c741080100000048c701090000004d8d47e84c3b45107303ff55404d89c749c740f80200000049c7400801000000498908eb6956ff32eb6948833b03741348b8d0c911c9a37f0000488b5d08909090ff134d8d47b84c3b45107303ff55404d89c749c740f8030000004c8b4b084d8948104d89480849c700770000004d8d582049c743f8040000004d894b1848b9788b0cc9a37f000049894b10eb0ae98b000000e98600000049c743080100000049c7030f000000498d4f90483b4d107303ff55404989cf48c741f80400000048c74118050000004c89491048c741080300000048c701650000004c8d692849c745f80200000049c745080100000049894d00498d4d1848c741f8020000004c8969084c89194d89c34c8d411849c740f802000000498948084d891856ff32488b042448833805755df64008017515488b480848b8b8f309c9a37f0000488b5d0890ff134883780801750948c7c001000000eb74488b4808f6c10174084883f9017d2ceb06f641ff10742441504889cb48b810c506c9a37f000048bad0a8dc0000000000eb05e972000000ff12eb054889c84150498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8488c0cc9a37f00004889411048c7410801000000eb05e92c00000048c70109000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb6e4150eb6f48833803741148b8d0c911c9a37f0000488b5d0890ff13498d4fb8483b4d107303ff55404989cf48c741f803000000488b5008488951104889510848c70177000000488d592048c743f8040000004889531848be488c0cc9a37f00004889731048c7430801000000eb0ae97e000000e97900000048c7030f000000498d7790483b75107303ff55404989f748c746f80400000048c74618050000004889561048c746080300000048c70665000000488d7e2848c747f80200000048c7470801000000488937488d771848c746f80200000048897e0848891e488d461848c740f8020000004889700848890841504883f8017506488b0424eb0f4889c3488b04249090ff155a0000004883f80175064883c41058c34889c34883c41058ff254800000000000000000000007005000000000000|@5213,2097151,@16587,@3808,@3802,@833,@5214,@5212|106,0,@5189 289,0,@5192 389,0,@5195 421,0,@2708 486,0,@376 496,0,I106 552,0,@3802 636,0,@5207 714,0,@3802 894,0,@2708 955,0,@376 965,0,I106 1019,0,@3808 1102,0,@5207 1178,0,@3808 5189:O4|@20055,@557,@5191,@5190 5190:O5|@4546,1876,0,1876,0 5191:S15|67656e657261746542797465566563 5192:O4|@20055,@557,@5194,@5193 5193:O5|@4546,1847,0,1847,0 5194:S19|496e636f727265637420726567697374657273 5195:O2|@5197,@5196 5196:O2|@5199,@5198 5197:O2|36,@833 5198:O2|@5201,@5200 5199:O2|36,@3808 5200:O2|@5203,@5202 5201:O2|36,@3802 5202:O2|@5205,@5204 5203:O2|47,0 5204:O2|@5206,0 5205:O4|7,2,@833,@833 5206:O4|50,1,@833,2 5207:O4|@20055,@557,@5209,@5208 5208:O5|@4546,1862,0,1862,0 5209:S9|6765744f6666736574 5210:S45|5838364c4f574c4556454c28292e67656e4279746556656328322967656e6572617465436f6465283129283129 5211:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16586|28,0,@1662 5212:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16589| 5213:S45|5838364c4f574c4556454c28292e67656e4279746556656328322967656e657261746542797465566563283129 5214:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16588| 5215:S42|5838364c4f574c4556454c28292e67656e4279746556656328322967656e6572617465436f6465283129 5216:D3,104|4889c1498d47c8483b45107303ff55404989c748c740f80600000048bb40cd11c9a37f0000488918488b5a0848895808488b721048897010488b7a184889781848894820488b4a2048894828488060ffbfc390909090909000000000000000006000000000000000|@4969,63,@16593|29,0,@5217 5217:D8,480|483b65187303ff55484889c148c7c307000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c60eb06f643ff10755df6c301740b483b1d350100007d6beb06f643ff107468498d47e8eb0ae9e0000000e9ac000000483b45107303ff55404989c748c740f8020000004889580848c70005000000488b72206a016a014989d34989e24989c1eb0ae975000000e97000000049c7c007000000488b5e08488b0690ff15ea000000eb0ae954000000e94f000000584883c40890ff15da0000004d8b4b184d8b4310498b5b089090ff15ce0000004889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c3488b4a28488b1c2448890c2449c7c20700000049c7c10100000049c7c09fff00004889de488b5a2056ff2578000000488b4a28488b1c2448890c2449c7c20700000049c7c10100000049c7c09fff00004889de488b5a2056ff2551000000900000000000000000d0010000000000000100008000000000|@4954,2097151,@16591,@4955,@5218,@5188,@4949,@4949|29,0,@578 110,0,@2708 5218:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16592|28,0,@1662 5219:D3,112|4889c1498d47c0483b45107303ff55404989c748c740f80700000048bbb0d011c9a37f0000488918488b5a0848895808488b721048897010488b7a18488978184c8b42204c89402048894828488b4a2848894830488060ffbfc390909090909000000000000000006800000000000000|@4969,127,@16596|29,0,@5220 5220:D11,912|483b65187303ff55484889c148c7c303000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c60eb06f643ff10755df6c301740b483b1de50200007d67eb06f643ff107464498d77e8eb0ae984020000e950020000483b75107303ff55404989f748c746f80200000048895e0848c70605000000488b7a286a016a014989d34989c44989e2eb0ae919020000e9140200004989f149c7c003000000488b5f08488b07eb0ae9fc010000e9f70100009090ff158a020000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b14244889104c89e348c7c607000000f6c30174144889c748b8c0e406c9a37f0000488b5d0890ff134883fe017505488b1beb2040f6c60174064883ee027105ff5570ebf5488b5b08483b65187303ff5548ebbc48833b077557f64308017456f643080175134889c648b8b8f309c9a37f0000488b5d08ff13488b730840f6c601740b4881fe010000807c61eb06f646ff10755e40f6c601740b483b359f0100007d6aeb06f646ff107467498d47e8eb0ae9e3000000e9aa000000483b45107303ff55404989c748c740f8020000004889700848c700050000006a016a014989e24989c149c7c007000000eb0ae973000000e96e0000004889cb4889d0909090ff156a010000584883c408eb0ae953000000e94e00000090ff155a0100004d8b4b184d8b4310498b5b089090ff154e0100004889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c700010000004883c410c34d8b5b20488b4c24104c895c241049c7c20700000049c7c10100000049c7c09fff00004889c34c89e04883c41051ff25ef0000004d8b5b20488b4c24104c895c241049c7c20700000049c7c10100000049c7c09fff00004889c34c89e04883c41051ff25c3000000488b4a30488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889de488b5a2856ff259c000000488b4a30488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889de488b5a2856ff257500000090909090900000000000000000780300000000000001000080000000000100008000000000|@4954,2097151,@16594,@4955,@4955,@5221,@5188,@4949,@4949,@4949,@4949|29,0,@578 110,0,@2708 346,0,@578 427,0,@2708 5221:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16595|28,0,@1662 5222:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbc8d511c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5098,15,@16598|29,0,@5223 5223:D4,72|483b65187303ff5548488b4a10488b1c2448890c2449c7c20900000049c7c10300000049c7c0050000004889de488b5a0856ff252800000000000000000000004000000000000000|@4952,2097151,@16597,@4949| 5224:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbb8d611c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5098,15,@16600|29,0,@5225 5225:D4,72|483b65187303ff5548488b4a10488b1c2448890c2449c7c20500000049c7c10300000049c7c0010100004889de488b5a0856ff252800000000000000000000004000000000000000|@4952,2097151,@16599,@4949| 5226:D4,80|483b65187303ff5548488b5208488b0c244889142449c7c20100000049c7c10300000049c7c08100000048bbb0d711c9a37f000051ff252d000000909090909000000000000000004800000000000000|@4952,2097151,@16601,@4949|44,0,@5227 5227:O2|@5228,0 5228:O2|0,@5229 5229:O2|0,@491 5230:S30|5838364c4f574c4556454c28292e67656e42797465566563283129283129 5231:S27|5838364c4f574c4556454c28292e67656e42797465566563283229 5232:S51|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d706172652833292d45 5233:O1|@5234 5234:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b830d911c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16606|30,0,@5235 5235:O1|@5236 5236:D4,40|483b65187303ff554848c7c305000000ff252a000000909000000000000000002000000000000000|@5230,127,@16605,@5185| 5237:O1|@5238 5238:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b828da11c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16616|30,0,@5239 5239:O1|@5240 5240:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b998db11c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16615|65,0,576460752303423480 238,0,@5241 5241:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c313000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16612,@5245|11,0,@5242 5242:O1|@5243 5243:D3,24|488b00c39090909000000000000000001000000000000000|@5244,1,@16607| 5244:S26|5838364c4f574c4556454c28292e6e6f54616754657374283129 5245:D9,4968|483b65187303ff5548a80174144889c148b840f011c9a37f0000488b5d0890ff13488b08488339057563f64008017415488b500848b840f011c9a37f0000488b5d0890ff13488b5008488b3248833e05756b48837a080175694150534151ff7610ff7608488b5910488b4108ff150e13000050488b5c2410488b442408909090ff1502130000488b4c2428eb05e9c3040000488b11488b12f6c20174064883c2027105ff5570ebf5488b19488913498d9738ffffff483b5510730feb0ae914010000e90f010000ff55404989d748c742f80400000048c742180100000048894a10488b7424204889720848c70217000000488d7a2848c747f804000000488947184c8b04244c89471048c747080500000048c7070f0000004c8d4f2849c741f80200000049c7410801000000498939498d791848c747f8020000004c89470848c707030000004c8d471849c740f8020000004989400849c70003000000498d401848c740f80500000048894820488970184c894010488978084c890852488b5424209090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c430488901498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c348833e07756a48837a080175684150534151ff7608488b5910488b410890ff1596110000488b4c2418488b11488b12f6c20174064883c2027105ff5570ebf5488b19488913498d57d8483b55107303ff55404989d748c742f80400000048c742180100000048894a10488b742410eb0ae98e010000e9890100004889720848c70217000000f6042401746ff604240175164889c748b8b8f309c9a37f0000488b5d08909090ff13488b3c2440f6c70174054803ff7105ff5570ebf64883ef0140f6c70174064883c7027105ff5570ebf54d8d47d84c3b45107303ff55404d89c749c740f804000000498978184989401049c7400805000000eb05e90900000049c70009000000eb334d8d47d84c3b45107303ff55404d89c749c740f804000000488b3c24498978184989401049c740080500000049c7000b000000498dbf70ffffff483b7d107303ff55404989ff48c747f80200000048c74708010000004c89074c8d471849c740f80200000049897808498910498d501848c742f8020000004889420848c70203000000488d421848c740f802000000488b3c244889780848c700050000004889c7488d401848c740f805000000488948204889701848897810488950084c89004883c4085a4883c41090ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c348833e01750748837a0801741348b840f011c9a37f0000488b5d08909090ff134150534151ff7610ff7608488b5910488b4108ff15860f0000488b4c2420488b11488b12f6c20174064883c2027105ff5570ebf5488b19488913498d9710ffffff483b55107303ff55404989d748c742f80400000048c742180100000048894a10488b7424184889720848c70217000000488d7a2848c747f805000000488947204c8b4424084c8947184c8b0c244c894f1048c747080500000048c7070d0000004c8d573049c742f80200000049c742080100000049893a498d7a1848c747f8020000004c895708488917488d571848c742f8020000004889420848c70203000000488d421848c740f8030000004c8940104c89480848c700010000004989c0488d402048c740f80500000048894820488970184c894010488950084889384883c4105a4883c410909090ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c3488339077566f64008017414488b500848b840f011c9a37f0000488b5d08ff13488b5008488b3248833e07756e48837a0801756c498d7fd8483b7d107303ff55404989ff48c747f80400000049bab8f011c9a37f00004c891748895f084c8947104c894f18488067ffbfeb05e939070000498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff0000eb0ae919000000e91400000048c74010010000004889780848c70005000000c348833e05755548837a080175534150534151ff7108488b5e10488b460890ff156e0d0000488b4c2418488b11488b12f6c20174064883c2027105ff5570ebf5488b19488913488b54241048bef6e211c9a37f0000488d7496fcffe6e987020000e982020000909090e97f000000909090e980000000909090e94b000000909090e979000000909090e97a000000909090e97b000000909090e97c000000909090e97d000000909090e97e000000909090e989000000909090e90b000000909090e90300000090909048837c24100574134889c248b858f111c9a37f0000488b5d08ff1348c7c205000000eb4848c7c203000000eb4448c7c201000000eb4748c7c20b000000eb3e48c7c20d000000eb3548c7c207000000eb2c48c7c209000000eb2348c7c211000000eb1a48c7c20f000000eb11e90c000000e90700000048c7c213000000498d77d8483b75107303ff55404989f748c746f80400000048c746180100000048894e104889560848c70617000000f60424017473f604240175134889c748b8b8f309c9a37f0000488b5d08ff13488b3c2440f6c70174054803ff7105ff5570ebf64883ef0140f6c70174064883c7027105ff5570ebf54d8d47d84c3b45107303ff55404d89c749c740f804000000498978184989401049c740080500000049c70009000000eb334d8d47d84c3b45107303ff55404d89c749c740f804000000488b3c24498978184989401049c740080500000049c7000b000000498dbf70ffffff483b7d107303ff55404989ff48c747f80200000048c74708010000004c89074c8d471849c740f80200000049897808498930498d701848c746f8020000004889460848c70603000000488d461848c740f802000000488b3c244889780848c700050000004889c7488d401848c740f805000000488948204889501848897810488970084c89004883c4085a4883c410ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c348833e01750748837a0801741348b840f011c9a37f0000488b5d08909090ff134883fb0d744f4883fb0b744e4883fb09744d4883fb077459f64108017458f6410801751048b8b8f309c9a37f0000488b5d08ff13488b790840f6c701740b4881ff010000807c66eb06f647ff10756340f6c701eb0fe91e030000e919030000e9140300007415483b3dde0900007d50eb10e902030000e9fd020000f647ff1074434d8b104d8b1241f6c20174064983c2027105ff5570ebf54d8b184d89134989da49bc5ee611c9a37f0000eb0ae9c6020000e9c10200004f8d6494fc41ffe4e9b4020000e9af020000e97b000000909090e97c000000909090e94b000000909090e975000000909090e976000000909090e977000000909090e978000000909090e979000000909090e97a000000909090e985000000909090e90b000000909090e9030000009090904883fb05741148b858f111c9a37f0000488b5d0890ff1348c7c305000000eb4848c7c303000000eb4448c7c301000000eb4748c7c30b000000eb3e48c7c30d000000eb3548c7c307000000eb2c48c7c309000000eb2348c7c311000000eb1a48c7c30f000000eb11e90c000000e90700000048c7c3130000004d8d57d84c3b55107303ff55404d89d749c742f80400000049c74218010000004d89421049895a0849c7021700000040f6c701747040f6c701751348b8b8f309c9a37f0000488b5d08909090ff1340f6c70174054803ff7105ff5570ebf64883ef0140f6c70174064883c7027105ff5570ebf54d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c2420488b7e1049897c24184c8b6e084d896c2410eb05e91300000049c74424080500000049c7042405000000eb414d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c24204c8b6e104d896c24184c8b76084d8974241049c74424080500000049c7042407000000498d7f98483b7d107303ff55404989ff48c747f80200000048c74708010000004c89274c8d671849c74424f80200000049897c24084d891424498d7c241848c747f8030000004c8b56104c8957104c8b6e084c896f0848c707010000004c8d772049c746f802000000488b41084989460849c70605000000498d47d0483b45107303ff55404989c748c740f8050000004c894020488958184c897010488978084c89204c89ca90ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c3498d7fd8483b7d107303ff55404989ff48c747f80400000049bae0f111c9a37f00004c891748895f084c8947104c894f18488067ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c74010030000004889780848c70005000000c3488339017414488b500848b840f011c9a37f0000488b5d08ff13f64008017416488b500848b840f011c9a37f0000488b5d089090ff13488b5008488b3248833e01756f48837a0801756d498d7fd8483b7d107303ff55404989ff48c747f80400000049ba40f211c9a37f00004c891748895f084c8947104c894f18488067ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c7401001000000eb0ae911000000e90c0000004889780848c70005000000c348833e05755848837a080175564150534151ff7110ff7108488b5e10488b460890ff15ba050000488b4c2420488b11488b12f6c20174064883c2027105ff5570ebf5488b19488913488b54241848beb2ea11c9a37f0000488d7496fcffe6e9ff010000e9fa010000909090e97f000000909090e980000000909090e94b000000909090e979000000909090e97a000000909090e97b000000909090e97c000000909090e97d000000909090e97e000000909090e989000000909090e90b000000909090e90300000090909048837c24180574134889c248b858f111c9a37f0000488b5d08ff1348c7c205000000eb4848c7c203000000eb4448c7c201000000eb4748c7c20b000000eb3e48c7c20d000000eb3548c7c207000000eb2c48c7c209000000eb2348c7c211000000eb1a48c7c20f000000eb11e90c000000e90700000048c7c213000000498db710ffffff483b75107303ff55404989f748c746f80400000048c746180100000048894e104889560848c70617000000488d7e2848c747f805000000488947204c8b4424084c8947184c8b0c244c894f1048c747080500000048c7070d0000004c8d573049c742f80200000049c742080100000049893a498d7a1848c747f8020000004c895708488937488d771848c746f8020000004889460848c70603000000488d461848c740f8030000004c8940104c89480848c700010000004989c0488d402048c740f80500000048894820488950184c894010488970084889384883c4105a4883c410ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c348833e07750748837a0801741348b840f011c9a37f0000488b5d08909090ff134883fb0d744f4883fb0b744e4883fb09744d4883fb077459f64608017458f6460801751048b8b8f309c9a37f0000488b5d08ff13488b7e0840f6c701740b4881ff010000807c63eb06f647ff10756040f6c701eb0fe932020000e92d020000e9280200007415483b3da20200007d6ceb10e916020000e911020000f647ff10745f4d8b104d8b1241f6c20174064983c2027105ff5570ebf54d8b184d89134d8d57d84c3b5510730feb0ae9dd010000e9d8010000ff55404d89d749c742f80400000049c74218010000004d89421049895a0849c70217000000eb0ae9ac010000e9a701000040f6c701747040f6c701751348b8b8f309c9a37f0000488b5d08909090ff1340f6c70174054803ff7105ff5570ebf64883ef0140f6c70174064883c7027105ff5570ebf54d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c2420488b791049897c24184c8b69084d896c2410eb05e91300000049c74424080500000049c7042405000000eb414d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c24204c8b69104d896c24184c8b71084d8974241049c74424080500000049c7042407000000498d7f98483b7d107303ff55404989ff48c747f80200000048c74708010000004c89274c8d671849c74424f80200000049897c24084d891424498d7c241848c747f8030000004c8b51104c8957104c8b69084c896f0848c707010000004c8d772049c746f802000000488b46084989460849c70605000000498d47d0483b45107303ff55404989c748c740f8050000004c894020488958184c897010488978084c89204c89ca90ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c3498d7fd8483b7d107303ff55404989ff48c747f80400000049baa0f211c9a37f00004c891748895f084c8947104c894f18488067ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c74010010000004889780848c70005000000c3900000000000000000501300000000000001000080000000000100008000000000|@5259,2097151,@16613,@5258,@5258,@5258,@5258,@5258,@5258|18,0,@5246 54,0,@5246 620,0,@2708 1000,0,@5246 1383,0,@5246 1443,0,@5249 1626,0,$5245+1654 1763,0,@5252 1939,0,@2708 2308,0,@5246 2363,0,@2708 2488,0,$5245+2526 2630,0,@5252 2804,0,@2708 3239,0,@5255 3339,0,@5246 3365,0,@5246 3427,0,@5256 3606,0,$5245+3634 3743,0,@5252 4152,0,@5246 4207,0,@2708 4412,0,@2708 4847,0,@5257 5246:O4|@20055,@557,@5248,@5247 5247:O5|@4546,1779,0,1779,0 5248:S11|74657374416374696f6e73 5249:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba18f111c9a37f0000ff229090909090909000000000000000003000000000000000|@5251,1048575,@16608|23,0,@5250 5250:O1|@5245 5251:S31|5838364c4f574c4556454c28292e74657374416374696f6e73283129283129 5252:O4|@20055,@557,@5254,@5253 5253:O5|@4546,896,0,896,0 5254:S29|72657665727365546573744f703a20756e6b6e6f776e206272616e6368 5255:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba18f111c9a37f0000ff229090909090909000000000000000003000000000000000|@5251,1048575,@16609|23,0,@5250 5256:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba18f111c9a37f0000ff229090909090909000000000000000003000000000000000|@5251,1048575,@16610|23,0,@5250 5257:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba18f111c9a37f0000ff229090909090909000000000000000003000000000000000|@5251,1048575,@16611|23,0,@5250 5258:D3,280|483b65187303ff55484881e09fff000048c7c10100000048c7c2030000004883f92f75154889c348b878ed0ec9a37f0000488b5d089090ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc5f6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9d6f311c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08c3488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1390909000000000000000001001000000000000|@5260,2097151,@16614|41,0,@4414 113,0,@376 123,0,I106 144,0,$5258+214 172,0,@560 191,0,@3809 238,0,@3811 5259:S28|5838364c4f574c4556454c28292e74657374416374696f6e73283429 5260:S29|5838364c4f574c4556454c28292e63686f6f736547656e526567283229 5261:S30|5838364c4f574c4556454c28292e6d616b654272616e6368283129283129 5262:O1|@5263 5263:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b860f511c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16619|30,0,@5264 5264:O1|@5265 5265:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9d0f611c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16618|65,0,576460752303423480 238,0,@5266 5266:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c305000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16617,@5245|11,0,@5242 5267:O1|@5268 5268:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8f711c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16622|30,0,@5269 5269:O1|@5270 5270:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b938f911c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16621|65,0,576460752303423480 238,0,@5271 5271:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c305000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16620,@5245|11,0,@5242 5272:O1|@5273 5273:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b830fa11c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16625|30,0,@5274 5274:O1|@5275 5275:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9a0fb11c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16624|65,0,576460752303423480 238,0,@5276 5276:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c313000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16623,@5245|11,0,@5242 5277:O1|@5278 5278:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b900fd11c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16639|130,0,@5279 5279:O1|@5280 5280:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b970fe11c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16638|65,0,576460752303423480 238,0,@5281 5281:D4,56|483b65187303ff554849b9d8fe11c9a37f00004c8b420848c7c313000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16637,@5245|11,0,@5282 5282:O1|@5283 5283:D4,56|483b65187303ff55484c8b50204c8b48184c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@5290,2047,@16626,@5284| 5284:D12,1272|483b65187303ff554848833b05750df64308017506ff25f5040000c349833805750e41f64008017506ff25e9040000c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bef1ffffffffffff0f488932498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57804c3b55107303ff55404d89d749c742f8050000004989522049894a18498972104d894a0849893a48c70703000000498d4a3048c741f80400000048c74118050000004c89511048c741081300000048c70117000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f801000000c641ff4048c70101000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8da730ffffff4c3b65107303ff55404d89e749c74424f805000000498974242049894c241849897c24104d895c24084d890c2449c70103000000498d4c243048c741f80400000048c74118050000004c89611048c741081300000048c70117000000488d712848c746f80200000048c746080100000048890e488d4e1848c741f8020000004c89510848c70139000000488d791848c747f80200000048c747080100000048890f488d4f1848c741f8020000004c89610848c701390000004c8d491849c741f80200000049c7410801000000498909498338017539498d4fd8483b4d107303ff55404989cf48c741f8040000004d8b50104c89511848c74110030000004d8b58084c89590848c70179000000eb424983380374154889c148b8b80412c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f8020000004d8b40084c89410848c7017b0000004d8d47e84c3b45107303ff55404d89c749c740f80200000049c740080100000049890848833b017539498d4fd8483b4d107303ff55404989cf48c741f8040000004c8b53104c89511848c74110030000004c8b5b084c89590848c70179000000eb4248833b0374154889c148b8b80412c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b5b084889590848c7017b000000498d5fe8483b5d107303ff55404989df48c743f80200000048c743080100000048890b4883fb0174134989c24889d090ff15ee0000004889c24c89d04883fa0174164989c24889d34c89c090ff15da0000004989c04c89d04983f80174164989c24c89c34889f090ff15c60000004889c64c89d04883fe01750c48b9280512c9a37f0000eb1e4989c04889f348b8280512c9a37f00009090ff159e0000004889c14c89c04883f90174164889c64889cb4c89c890ff158a0000004989c14889f04983f90174164889c64c89cb4889f890ff15760000004889c74889f04883ff017501c34889fbff25680000000000000000000000f004000000000000|@5292,2047,@16627,@5293,@5294,@5295,@5296,@5297,@5298,@5299,@5300,@5291|113,0,576460752303423480 395,0,576460752303423480 801,0,@5285 965,0,@5285 1144,0,@5288 1162,0,@5288 5285:O4|@20055,@557,@5287,@5286 5286:O5|@4546,844,0,844,0 5287:S8|6d616b6554657374 5288:O2|@5289,0 5289:O2|10,112 5290:S27|5838364c4f574c4556454c28292e65715465737454616773283129 5291:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16636| 5292:S27|5838364c4f574c4556454c28292e65715465737454616773283529 5293:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8280512c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@16628|64,0,@5288 5294:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8280512c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@16629|64,0,@5288 5295:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16630| 5296:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16631| 5297:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16632| 5298:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16633| 5299:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16634| 5300:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16635| 5301:O1|@5302 5302:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9400b12c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16642|130,0,@5303 5303:O1|@5304 5304:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9b00c12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16641|65,0,576460752303423480 238,0,@5305 5305:D4,56|483b65187303ff554849b9d8fe11c9a37f00004c8b420848c7c305000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16640,@5245|11,0,@5282 5306:O1|@5307 5307:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9100e12c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16667|130,0,@5308 5308:O1|@5309 5309:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9800f12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16666|65,0,576460752303423480 238,0,@5310 5310:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c30b000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16665,@5245|11,0,@5311 5311:O1|@5312 5312:D4,56|483b65187303ff55484c8b50204c8b48184c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@5323,8191,@16643,@5313| 5313:D10,1728|483b65187303ff554849833805757241f640080175134889c148b8801712c9a37f0000488b5d08ff13498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bef1ffffffffffff0f488932498d77f0483b7510730aeb05e90d050000ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d5f804c3b5d107303ff55404d89df49c743f8050000004989532049894b18498973104d89430849893b48c70703000000498d4b3048c741f80400000048c74118030000004c89591048c741080500000048c70117000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f801000000c641ff4048c70101000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6fa04c3b6d107303ff55404d89ef49c745f8050000004989752049894d1849897d104d8965084d89450049c70003000000498d4d3048c741f8020000004c89690848c7017d000000488d711848c746f80200000048c746080100000048890e48833b0374164889c148b8081812c9a37f0000488b5d08909090ff13498b0a488b09f6c10174064883c1027105ff5570ebf5498b3a48890f4983f90d7535498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000004c89511048c741081300000048c70117000000eb634983f90b7535498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118010000004c89511048c741081300000048c70117000000eb6a4983f909753c498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000eb05e96b0000004c89511048c741080500000048c70117000000eb564983f90774164889c148b8901812c9a37f0000488b5d08909090ff13498d4fd8483b4d10730aeb05e929000000ff55404989cf48c741f80400000048c74118010000004c89511048c741080500000048c701170000004d8d8748ffffff4c3b45107303ff55404d89c749c740f8020000004d89680849c700390000004d8d481849c741f80200000049c74108010000004d89014d8d411849c740f80400000049c74018ffffffff49c74010210000004c8b63084d89600849c700790000004d8d682849c745f80200000049c74508010000004d8945004d8d451849c740f8020000004d896808498908498d481848c741f8020000004c89590848c701390000004c8d591849c743f80200000049c743080100000049890b48833b017535498d4fd8483b4d107303ff55404989cf48c741f8040000004c8b6b104c89691848c74110030000004c89610848c70179000000eb3d48833b0374144889c148b8b80412c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f8020000004c89610848c7017b0000004d8d6fe84c3b6d107303ff55404d89ef49c745f80200000049c745080100000049894d004983fd0174164989c64c89eb4889d090ff15ba0100004889c24c89f04883fa01740c4889d3909090ff15aa0100004883f80174114889c34889f09090ff159e0100004889c64883fe0174124889f34c89d8909090ff158e0100004989c34983fb0174124c89db4c89c0909090ff157e0100004989c04983f80175044c89c8c34c89c34c89c8ff256d01000048833b0575144c89c948ba121612c9a37f0000488d548afcffe2e9ee000000e97f000000909090e980000000909090e94b000000909090e979000000909090e97a000000909090e97b000000909090e97c000000909090e97d000000909090e97e000000909090e989000000909090e90b000000909090e9030000009090904983f90574154889c148b858f111c9a37f0000488b5d089090ff1348c7c105000000eb4848c7c103000000eb4448c7c101000000eb4748c7c10b000000eb3e48c7c10d000000eb3548c7c107000000eb2c48c7c109000000eb2348c7c111000000eb1a48c7c10f000000eb11e90c000000e90700000048c7c1130000004989c94c89c14989d84889cbe960f9ffff49c7c101000000ff255b0000009090900000000000000000b806000000000000|@5325,8191,@16644,@5326,@5327,@5328,@5329,@5330,@5331,@5324|27,0,@5314 106,0,576460752303423480 395,0,576460752303423480 624,0,@5317 864,0,@5320 1202,0,@5285 1438,0,$5313+1458 1565,0,@5252 5314:O4|@20055,@557,@5316,@5315 5315:O5|@4546,906,0,906,0 5316:S27|7465737454616773466f72436f6d70617269736f6e3a206c6f6e67 5317:O4|@20055,@557,@5319,@5318 5318:O5|@4546,912,0,912,0 5319:S30|7465737454616773466f72436f6d70617269736f6e3a206e6f7420726567 5320:O4|@20055,@557,@5322,@5321 5321:O5|@4546,925,0,925,0 5322:S26|7465737454616773466f72436f6d70617269736f6e3a206f7063 5323:S38|5838364c4f574c4556454c28292e7465737454616773466f72436f6d70617269736f6e283129 5324:D16,1520|483b65187303ff55486a016a014989c34d89cc4d89c54889d84889e3ff15e60500006a016a014889e34c89e8ff15de0500006a016a014983fc017471498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000eb05e9f6000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498dbf60ffffff483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f48c70303000000488d473048c740f80400000048c74018030000004889781048c740081700000048c70017000000488d482848c741f80200000048c7410801000000488901488d411848c740f8020000004889780848c70039000000488d501848c742f80200000048c74208010000004889024889e04889084889e048895008eb154889e048c700010000004889e048c7400801000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7f90483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f48c70303000000488d473048c740f8020000004889780848c7007d000000488d481848c741f80200000048c7410801000000488901488d411848c740f801000000c640ff4048c70001000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbf1ffffffffffff0f48891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c706010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d8f70ffffff4c3b4d107303ff55404d89cf49c741f8050000004989512049894118498959104d894108498931498d413048c740f8020000004c89480848c70039000000488d501848c742f80200000048c7420801000000488902488d421848c740f8020000004889780848c70039000000488d581848c743f80200000048c7430801000000488903488b06a80174064883c0027105ff5570ebf5488906498d47d0483b45107303ff55404989c748c740f8020000004c89480848c7007d000000488d701848c746f80200000048c746080100000048890648837c2420017507488b442410eb234889df4989c84989d1488b5c2420488b44241090ff159a0100004889fb4c89ca4c89c14883f801741e4889df4989c84889c34889d0909090ff157e0100004889c24889fb4c89c14883fa01741e4889df4989c84889d34c89d8909090ff15620100004989c34889fb4c89c14983fb017506488b0424eb194889df4989c84c89db488b0424ff15420100004889fb4c89c14883f80174164889df4889c34889c890ff152e0100004889c14889fb4883f9017507488b442428eb144889df4889cb488b442428ff15120100004889fb4883f8017507488b442418eb174889df4889c3488b442418909090ff15f60000004889fb4883f8017507488b442408eb174889df4889c3488b442408909090ff15da0000004889fb4883f801750c48b8280512c9a37f0000eb1a4889df4889c348b8280512c9a37f000090ff15b60000004889fb4883f80174154889df4889c34889f0ff15a60000004889c64889fb4883fe0175084889d84883c430c34889d84889f34883c430ff258a00000090900000000000000000e805000000000000|@5333,4095,@16651,@5334,@5334,@5340,@5341,@5342,@5343,@5344,@5345,@5346,@5347,@5348,@5349,@5332|125,0,576460752303423480 510,0,576460752303423480 775,0,576460752303423480 1409,0,@5288 1427,0,@5288 5325:S38|5838364c4f574c4556454c28292e7465737454616773466f72436f6d70617269736f6e283529 5326:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16645| 5327:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16646| 5328:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16647| 5329:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16648| 5330:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16649| 5331:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16650| 5332:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16664| 5333:S25|5838364c4f574c4556454c28292e7465737454616773283429 5334:D4,696|483b65187303ff554848833805752df6400801751048b8a02612c9a37f0000488b5d08ff1348c7030100000048c743080100000048c7c001000000c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bef1ffffffffffff0f488932498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d8f60ffffff4c3b4d107303ff55404d89cf49c741f8050000004989512049894918498971104d89410849893948c70703000000498d493048c741f80400000048c74118030000004c89491048c741080500000048c70117000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f8020000004c894908488911488d511848c742f802000000488b710848897208488b3948893a4883380175394d8d47d84c3b45107303ff55404d89c749c740f8040000004c8b48104d89481849c74010030000004c8b50084d89500849c70079000000eb434883380374164989c048b8b80412c9a37f0000488b5d08909090ff134d8d47e84c3b45107303ff55404d89c749c740f802000000488b40084989400849c7007b000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c89004883f8017505488b02eb194989d84c8b4a084889c3488b0290ff157a0000004c89c3eb044c8b4a08498d4fd0483b4d107303ff55404989cf48c741f8020000004c89490848c70139000000488d511848c742f80200000048c742080100000048890a4889034889530848c7c001000000c30000000000000000b002000000000000|@5339,511,@16652,@5338|23,0,@5335 125,0,576460752303423480 476,0,@5285 5335:O4|@20055,@557,@5337,@5336 5336:O5|@4546,856,0,856,0 5337:S23|74657374546167733a206c6f6e6720636f6e7374616e74 5338:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16653| 5339:S36|5838364c4f574c4556454c28292e7465737454616773283429636865636b546167283129 5340:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16654| 5341:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16655| 5342:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16656| 5343:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16657| 5344:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16658| 5345:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16659| 5346:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16660| 5347:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16661| 5348:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16662| 5349:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16663| 5350:O1|@5351 5351:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9d02d12c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16670|130,0,@5352 5352:O1|@5353 5353:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9402f12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16669|65,0,576460752303423480 238,0,@5354 5354:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c309000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16668,@5245|11,0,@5311 5355:O1|@5356 5356:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9a03012c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16673|130,0,@5357 5357:O1|@5358 5358:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9103212c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16672|65,0,576460752303423480 238,0,@5359 5359:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c307000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16671,@5245|11,0,@5311 5360:O1|@5361 5361:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9703312c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16676|130,0,@5362 5362:O1|@5363 5363:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9e03412c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16675|65,0,576460752303423480 238,0,@5364 5364:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c30d000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16674,@5245|11,0,@5311 5365:O1|@5366 5366:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9403612c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16679|130,0,@5367 5367:O1|@5368 5368:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9b03712c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16678|65,0,576460752303423480 238,0,@5369 5369:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c30d000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16677,@5245|11,0,@5311 5370:O1|@5371 5371:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9103912c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16682|130,0,@5372 5372:O1|@5373 5373:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9803a12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16681|65,0,576460752303423480 238,0,@5374 5374:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c307000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16680,@5245|11,0,@5311 5375:O1|@5376 5376:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9e03b12c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16685|130,0,@5377 5377:O1|@5378 5378:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9503d12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16684|65,0,576460752303423480 238,0,@5379 5379:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c309000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16683,@5245|11,0,@5311 5380:O1|@5381 5381:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9b03e12c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5232,1048575,@16688|130,0,@5382 5382:O1|@5383 5383:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9204012c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16687|65,0,576460752303423480 238,0,@5384 5384:D4,56|483b65187303ff554849b9e80f12c9a37f00004c8b420848c7c30b000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16686,@5245|11,0,@5311 5385:O1|@5386 5386:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8184112c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16691|30,0,@5387 5387:O1|@5388 5388:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9884212c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16690|65,0,576460752303423480 238,0,@5389 5389:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c303000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16689,@5245|11,0,@5242 5390:O1|@5391 5391:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8804312c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16694|30,0,@5392 5392:O1|@5393 5393:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9f04412c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16693|65,0,576460752303423480 238,0,@5394 5394:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c311000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16692,@5245|11,0,@5242 5395:O1|@5396 5396:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e84512c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16697|30,0,@5397 5397:O1|@5398 5398:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9584712c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16696|65,0,576460752303423480 238,0,@5399 5399:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c301000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16695,@5245|11,0,@5242 5400:O1|@5401 5401:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8504812c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16700|30,0,@5402 5402:O1|@5403 5403:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9c04912c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16699|65,0,576460752303423480 238,0,@5404 5404:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c30f000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16698,@5245|11,0,@5242 5405:O1|@5406 5406:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b84a12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16703|30,0,@5407 5407:O1|@5408 5408:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9284c12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16702|65,0,576460752303423480 238,0,@5409 5409:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c30f000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16701,@5245|11,0,@5242 5410:O1|@5411 5411:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8204d12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16706|30,0,@5412 5412:O1|@5413 5413:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9904e12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16705|65,0,576460752303423480 238,0,@5414 5414:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c301000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16704,@5245|11,0,@5242 5415:O1|@5416 5416:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8884f12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16709|30,0,@5417 5417:O1|@5418 5418:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9f85012c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16708|65,0,576460752303423480 238,0,@5419 5419:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c311000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16707,@5245|11,0,@5242 5420:O1|@5421 5421:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f05112c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16712|30,0,@5422 5422:O1|@5423 5423:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9605312c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16711|65,0,576460752303423480 238,0,@5424 5424:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c303000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16710,@5245|11,0,@5242 5425:O1|@5426 5426:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8585412c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16728|30,0,@5427 5427:O1|@5428 5428:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9c85512c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16727|65,0,576460752303423480 238,0,@5429 5429:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9685612c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16726|26,0,@5430 5430:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9085712c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba986012c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16725|26,0,@5431 79,0,@5451 5431:D4,56|483b65187303ff55484c8b4a0849c7c013000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16713,@5432| 5432:D5,1440|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b8485d12c9a37f0000488b5d08ff136a016a014983f81175154889e2488b1848891a4889e2488b3148897208eb5f4983f80175154889e2488b1848891a4889e2488b3148897208eb504983f80375154889e2488b1948891a4889e2488b3048897208eb354983f80f75154889e2488b1948891a4889e2488b3048897208eb1a4889e2488b1848891a4889e2eb05e907000000488b3148897208488b142448833a057568f6420801743af6420801751048b8b8f309c9a37f0000488b5d08ff1348837a0801741148b8c06c0fc9a37f0000488b5d0890ff1348ba986d0fc9a37f0000eb71f6420801741248b8f86f07c9a37f0000488b5d089090ff13488b7208480fb65eff488d5c1b01eb05e9770000004883fb03753240f6c601741348b8f86f07c9a37f0000488b5d08909090ff1348bbffffffffffffff0048235ef8488d5c1b014883fb03741748b8a86d0fc9a37f0000eb05e909000000488b5d08ff134889f2498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c70321000000eb6d48833a03741248b8b85d12c9a37f0000488b5d089090ff13488b5a0848833b037529498d5fe8483b5d107303ff55404989df48c743f802000000488b52084889530848c70325000000eb36498d5fe0483b5d107303ff55404989df48c743f80300000048c7431001000000eb05e90f000000488b52084889530848c70323000000488b54240848833a057531498d77e0483b75107303ff55404989f748c746f803000000488b52084889561048c746080500000048c70619000000eb5a48833a03741148b8105e12c9a37f0000488b5d0890ff13488b720848833e03753e498d77d8483b75107303ff55404989f748c746f80400000048c7461801000000488b52084889561048c746080500000048c7061b000000eb34e92f000000498d77e0483b75107303ff55404989f748c746f803000000488b52084889561048c746080500000048c7061d0000004c89c248bf7a5a12c9a37f0000488d7c97fcffe79090e97b000000909090e97c000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e955000000909090e956000000909090e957000000909090e90b000000909090e9030000009090904983f805741148b8685e12c9a37f0000488b5d0890ff1348c7c201880000eb2b48c7c2018a0000eb2248c7c2018a0000eb1948c7c2010a0000eb1048c7c2010a0000eb0748c7c201880000498b394883c410488b3f40f6c70174064883c7027105ff5570ebf54d8b1149893a4983f813740948c7c705000000eb0748c7c7130000004d8d5fc04c3b5d107303ff55404d89df49c743f80400000049c74318010000004d894b1049897b0849c70317000000498d7b2848c747f80200000049bcc05e12c9a37f00004c8967084c891f4983f805740f4983f813740949c7c001000000eb0a49b8f05e12c9a37f0000f6c20174084883fa017d2aeb06f642ff10742257415056534889d348b810c506c9a37f000048bad0a8dc00000000009090ff12eb084889d05741505653498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8902b07c9a37f00004889411048c741080300000048c70109000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba305f12c9a37f0000488910498d57e8483b55107303ff55404989d748c742f8020000004889420848890a4883fa017506488b0424eb0d4889d3488b0424ff15460000004883f80175064883c40858c34889c34883c40858ff25340000009090909000000000000000009805000000000000|@5449,2097151,@16714,@5450,@5448|35,0,@5433 211,0,@2708 234,0,@4543 251,0,@4547 269,0,@1294 320,0,@1294 339,0,36028797018963967 364,0,@4548 433,0,@5436 622,0,@5438 761,0,$5432+778 882,0,@5440 1065,0,@5442 1103,0,@5444 1140,0,@376 1150,0,I106 1202,0,@884 1327,0,@5446 5433:O4|@20055,@557,@5435,@5434 5434:O5|@4546,1984,0,1984,0 5435:S7|67656e54657374 5436:O4|@20055,@557,@5248,@5437 5437:O5|@4546,1945,0,1945,0 5438:O4|@20055,@557,@5248,@5439 5439:O5|@4546,1951,0,1951,0 5440:O4|@20055,@557,@5248,@5441 5441:O5|@4546,1962,0,1962,0 5442:O2|@5443,0 5443:O2|36,@3900 5444:O2|@5445,0 5445:O4|4,5,@3900,16384 5446:O1|20 5447:S27|5838364c4f574c4556454c28292e67656e54657374283129283129 5448:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16716| 5449:S24|5838364c4f574c4556454c28292e67656e54657374283429 5450:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16715| 5451:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16719,@5453|15,0,@5452 5452:O2|@585,0 5453:D5,536|483b65187303ff5548a801756d488b08488339017569498d57e0483b55107303ff55404989d748c742f80300000048be606312c9a37f000048893248895a084c894210488062ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c7401001000000eb0ae917010000e90c0000004889500848c70005000000c3f64008017568488b5008488b3248833e01756048837a0801755e498d7fe0483b7d107303ff55404989ff48c747f80300000049b9006412c9a37f00004c890f48895f084c894710488067ffbf498d47d0483b45107303ff55404989c748c740f80500000048c7402001000000eb0fe926000000e921000000e91c00000048c740189fff000048c74010030000004889780848c70005000000c34150ff73089090ff15fa0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488b142448895008488908488b542408909090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4084889480848c70001000000c34150ff730890ff15960000004889c1498d47e8483b45107303ff55404989c748c740f802000000488b142448895008488908488b542408909090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4084889480848c70001000000c390909090909000000000000000001002000000000000|@5459,2097151,@16720,@5460,@5458|48,0,@5454 196,0,@5457 5454:D3,48|483b65187303ff55484c8b4210488b5a0848bab86312c9a37f0000ff2290909000000000000000002800000000000000|@5456,1048575,@16717|19,0,@5455 5455:O1|@5453 5456:S38|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283129283129283129 5457:D3,48|483b65187303ff55484c8b4210488b5a0848bab86312c9a37f0000ff2290909000000000000000002800000000000000|@5456,1048575,@16718|19,0,@5455 5458:D4,104|483b65187303ff5548a8017541ff7008488b0090ff156600000050488b44240890e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c3909000000000000000006000000000000000|@1363,2097151,@16723,@5466| 5459:S32|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283329 5460:D4,104|483b65187303ff5548a8017541ff7008488b0090ff156600000050488b44240890e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c3909000000000000000006000000000000000|@1363,2097151,@16721,@5461| 5461:D3,1056|483b65187303ff5548488338077528488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c34883380574144889c148b8006a12c9a37f0000488b5d0890ff13488b48104881e10100fe004883f90174664883f9017465488b40104881e00100fe0048c7c10100000048c7c2030000004883f92f75164889c348b878ed0ec9a37f0000488b5d08909090ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc4f6c10174144883f901eb0ae9d3000000e9ce0000007d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9026712c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c3488b48084881e10100fe004883f90174634883f9017462488b40084881e00100fe0048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc7f6c10174144883f901eb0ae9d3000000e9ce0000007d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b94e6812c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c348c7c10100000048c7c2030000004883f92f7515488b580848b878ed0ec9a37f0000488b5d0890ff134889d3482358084883fb0175144883c102488d5412ff483b65187303ff5548ebc4f6c10174084883f9017d23eb06f641ff10741b4889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb034889c8ff750848b96e6912c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39090909000000000000000001804000000000000|@5465,2097151,@16722|66,0,@5462 140,0,@4414 225,0,@376 235,0,I106 256,0,$5461+330 284,0,@560 303,0,@3809 354,0,@3811 475,0,@4414 557,0,@376 567,0,I106 588,0,$5461+662 616,0,@560 635,0,@3809 686,0,@3811 774,0,@4414 846,0,@376 856,0,I106 876,0,$5461+950 904,0,@560 923,0,@3809 974,0,@3811 5462:O4|@20055,@557,@5464,@5463 5463:O5|@4546,1920,0,1920,0 5464:S31|6e65676f746961746546503a206e6f7420726567206f72206c69746572616c 5465:S46|5838364c4f574c4556454c28292e6c6f6164426173654f666673657473283329617267546f536f75726365283129 5466:D3,1056|483b65187303ff5548488338077528488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c34883380574144889c148b8006a12c9a37f0000488b5d0890ff13488b48104881e10100fe004883f90174664883f9017465488b40104881e00100fe0048c7c10100000048c7c2030000004883f92f75164889c348b878ed0ec9a37f0000488b5d08909090ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc4f6c10174144883f901eb0ae9d3000000e9ce0000007d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9126c12c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c3488b48084881e10100fe004883f90174634883f9017462488b40084881e00100fe0048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc7f6c10174144883f901eb0ae9d3000000e9ce0000007d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b95e6d12c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c348c7c10100000048c7c2030000004883f92f7515488b580848b878ed0ec9a37f0000488b5d0890ff134889d3482358084883fb0175144883c102488d5412ff483b65187303ff5548ebc4f6c10174084883f9017d23eb06f641ff10741b4889cb48b810c506c9a37f000048bad0a8dc0000000000ff12eb034889c8ff750848b97e6e12c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39090909000000000000000001804000000000000|@5465,2097151,@16724|66,0,@5462 140,0,@4414 225,0,@376 235,0,I106 256,0,$5466+330 284,0,@560 303,0,@3809 354,0,@3811 475,0,@4414 557,0,@376 567,0,I106 588,0,$5466+662 616,0,@560 635,0,@3809 686,0,@3811 774,0,@4414 846,0,@376 856,0,I106 876,0,$5466+950 904,0,@560 923,0,@3809 974,0,@3811 5467:S30|5838364c4f574c4556454c28292e66705465737473283229283129283129 5468:S27|5838364c4f574c4556454c28292e66705465737473283229283129 5469:S27|5838364c4f574c4556454c28292e66705465737473283129283129 5470:O1|@5471 5471:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8307012c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16734|30,0,@5472 5472:O1|@5473 5473:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9a07112c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16733|65,0,576460752303423480 238,0,@5474 5474:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9407212c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16732|26,0,@5475 5475:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9e07212c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba487312c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16731|26,0,@5476 79,0,@5477 5476:D4,56|483b65187303ff55484c8b4a0849c7c005000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16729,@5432| 5477:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16730,@5453|15,0,@5452 5478:O1|@5479 5479:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387412c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16740|30,0,@5480 5480:O1|@5481 5481:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9a87512c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16739|65,0,576460752303423480 238,0,@5482 5482:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9487612c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16738|26,0,@5483 5483:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9e87612c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba507712c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16737|26,0,@5484 79,0,@5485 5484:D4,56|483b65187303ff55484c8b4a0849c7c005000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16735,@5432| 5485:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16736,@5453|15,0,@5452 5486:O1|@5487 5487:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8407812c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16746|30,0,@5488 5488:O1|@5489 5489:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9b07912c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16745|65,0,576460752303423480 238,0,@5490 5490:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9507a12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16744|26,0,@5491 5491:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9f07a12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba587b12c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16743|26,0,@5492 79,0,@5493 5492:D4,56|483b65187303ff55484c8b4a0849c7c013000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16741,@5432| 5493:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16742,@5453|15,0,@5452 5494:O1|@5495 5495:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8487c12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16752|30,0,@5496 5496:O1|@5497 5497:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9b87d12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16751|65,0,576460752303423480 238,0,@5498 5498:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9587e12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16750|26,0,@5499 5499:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9f87e12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba607f12c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16749|26,0,@5500 79,0,@5501 5500:D4,56|483b65187303ff55484c8b4a0849c7c003000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16747,@5432| 5501:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16748,@5453|15,0,@5452 5502:O1|@5503 5503:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8508012c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16758|30,0,@5504 5504:O1|@5505 5505:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9c08112c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16757|65,0,576460752303423480 238,0,@5506 5506:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9608212c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16756|26,0,@5507 5507:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9008312c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba688312c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16755|26,0,@5508 79,0,@5509 5508:D4,56|483b65187303ff55484c8b4a0849c7c011000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16753,@5432| 5509:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16754,@5453|15,0,@5452 5510:O1|@5511 5511:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8588412c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16764|30,0,@5512 5512:O1|@5513 5513:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9c88512c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16763|65,0,576460752303423480 238,0,@5514 5514:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9688612c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16762|26,0,@5515 5515:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9088712c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba708712c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16761|26,0,@5516 79,0,@5517 5516:D4,56|483b65187303ff55484c8b4a0849c7c001000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16759,@5432| 5517:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16760,@5453|15,0,@5452 5518:O1|@5519 5519:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8608812c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16770|30,0,@5520 5520:O1|@5521 5521:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9d08912c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16769|65,0,576460752303423480 238,0,@5522 5522:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9708a12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16768|26,0,@5523 5523:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9108b12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba788b12c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16767|26,0,@5524 79,0,@5525 5524:D4,56|483b65187303ff55484c8b4a0849c7c00f000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16765,@5432| 5525:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16766,@5453|15,0,@5452 5526:O1|@5527 5527:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8688c12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16776|30,0,@5528 5528:O1|@5529 5529:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9d88d12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16775|65,0,576460752303423480 238,0,@5530 5530:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9788e12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16774|26,0,@5531 5531:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9188f12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba808f12c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16773|26,0,@5532 79,0,@5533 5532:D4,56|483b65187303ff55484c8b4a0849c7c00f000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16771,@5432| 5533:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16772,@5453|15,0,@5452 5534:O1|@5535 5535:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8709012c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16782|30,0,@5536 5536:O1|@5537 5537:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9e09112c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16781|65,0,576460752303423480 238,0,@5538 5538:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9809212c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16780|26,0,@5539 5539:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9209312c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba889312c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16779|26,0,@5540 79,0,@5541 5540:D4,56|483b65187303ff55484c8b4a0849c7c001000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16777,@5432| 5541:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16778,@5453|15,0,@5452 5542:O1|@5543 5543:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8789412c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16788|30,0,@5544 5544:O1|@5545 5545:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9e89512c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16787|65,0,576460752303423480 238,0,@5546 5546:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9889612c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16786|26,0,@5547 5547:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9289712c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba909712c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16785|26,0,@5548 79,0,@5549 5548:D4,56|483b65187303ff55484c8b4a0849c7c011000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16783,@5432| 5549:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16784,@5453|15,0,@5452 5550:O1|@5551 5551:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8809812c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5232,3,@16794|30,0,@5552 5552:O1|@5553 5553:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b9f09912c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5469,63,@16793|65,0,576460752303423480 238,0,@5554 5554:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9909a12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080300000048c70003000000c39090909090909000000000000000007000000000000000|@5468,7,@16792|26,0,@5555 5555:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9309b12c9a37f0000488908488b520848895008488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba989b12c9a37f000048891048894808488060ffbfc39090909000000000000000007000000000000000|@5467,7,@16791|26,0,@5556 79,0,@5557 5556:D4,56|483b65187303ff55484c8b4a0849c7c003000000488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5447,2097151,@16789,@5432| 5557:D4,48|483b65187303ff55484c8b420848bbf86012c9a37f0000ff252b00000090909000000000000000002800000000000000|@5456,2097151,@16790,@5453|15,0,@5452 5558:O3|3,1,0 5559:O3|3,0,0 5560:O1|@5561 5561:D3,88|498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848b8c89c12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c300000000000000005000000000000000|@5572,3,@16798|33,0,@5562 5562:O1|@5563 5563:D4,40|483b65187303ff554848c7c305000000ff252a000000909000000000000000002000000000000000|@5570,127,@16796,@5564| 5564:D3,320|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47a84c3b45107303ff55404d89c749c740f80500000049894820498940184989501049897808498930498d403048c740f80400000048b9989e12c9a37f0000488908488958084c89401048897018488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f8020000004c894008488908c390909000000000000000003801000000000000|@5571,127,@16797|65,0,576460752303423480 238,0,@5565 5565:D4,632|483b65187303ff5548a80174144889c148b840a112c9a37f0000488b5d0890ff13488b0848833905756748837808017565488b5a18488b1bf6c30174064883c3027105ff5570ebf5488b721848891e498d5fd8483b5d107303ff55404989df48c743f80400000048c7431801000000488b7a1048897b104c8b42084c89430848c7031700000053488b5910488b4108eb0ae986000000e98100000090ff15ee010000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c7017b000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70001000000c348833901756d4883780801756b488b5a18488b1bf6c30174064883c3027105ff5570ebf5488b721848891e498d9f60ffffff483b5d107303ff55404989df48c743f80400000048c7431801000000488b7a1048897b104c8b42084c89430848c703170000004c8d4b2849c741f804000000eb0ae972000000e96d0000004c8b51104d89511849c74110030000004c8b59084d89590849c701790000004d8d612849c74424f80200000049c7442408010000004d890c244d8d4c241849c741f8020000004d896108498919498d411848c740f8030000004c89481048c740080100000048c70001000000c34883390775074883780801741248b840a112c9a37f0000488b5d089090ff13498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c74010010000004889500848c70005000000c39090909090909000000000000000007002000000000000|@5569,2097151,@16795,@5258|18,0,@5566 533,0,@5566 5566:O4|@20055,@557,@5568,@5567 5567:O5|@4546,1810,0,1810,0 5568:S17|6c656e67746854657374416374696f6e73 5569:S41|5838364c4f574c4556454c28292e6c656e6774685465737428322974657374416374696f6e73283129 5570:S30|5838364c4f574c4556454c28292e6c656e67746854657374283129283129 5571:S27|5838364c4f574c4556454c28292e6c656e67746854657374283229 5572:S21|5838364c4f574c4556454c28292e4c6f6e67283129 5573:O1|@5574 5574:D3,88|498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848b818a312c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c300000000000000005000000000000000|@5577,3,@16800|33,0,@5575 5575:O1|@5576 5576:D4,40|483b65187303ff554848c7c313000000ff252a000000909000000000000000002000000000000000|@5570,127,@16799,@5564| 5577:S22|5838364c4f574c4556454c28292e53686f7274283129 5578:O1|@5579 5579:D3,64|488338077520488b4808498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909000000000000000003800000000000000|@5580,3,@16801| 5580:S39|47454e45524154455f434f444528292e636f646567656e28392967656e54657374283229283129 5581:O1|@5582 5582:D3,24|48c7c001000000c300000000000000001000000000000000|@5583,1,@16802| 5583:S43|434f444547454e5f5441424c4528292e636f6d70617265416e644272616e6368283329636f64652d283129 5584:D10,592|483b65187303ff55484883fb01750c48b898a712c9a37f0000eb0a48b828aa12c9a37f0000498d4fe8483b4d107303ff55404989cf48c741f80200000048bac0ac12c9a37f0000488951084c89014889c2498d47e8483b45107303ff55404989c748c740f80200000048bbd8ac12c9a37f000048895808488908415241519090ff124883f80175154889c148b898ad12c9a37f0000488b5d089090ff13488b08ff31ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff7424784c8b9424e00000004c8b8c24e80000004c8b442470488b5c2468488b4108ff15720100004889c34889d8ff156e01000048c7c101000000f6c301753e488b134883f9017506488b4a08eb1d4889c6488b7b084889cb488b420890ff15460100004889c14889f0eb04488b7b084889fb483b65187303ff5548ebbd515048c7c001000000488b5424109090ff126a016a01ff70084c8d5424084c8b8c24b00000004c8b44241848bb28ae12c9a37f0000488b00ff15f6000000488b8424b00000004c8b50584c8b48484c8b4040488b5838488b48104889c8909090ff15d60000004889c1498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048894808594883c40848890848837c2410017506488b0c24eb194889c6488b5c2410488b042490ff158e0000004889c14889f0488b9424980000004883c430488b124883fa0174174889c64889d34889c89090ff156a0000004889c14889f0488b54246848890ac270009000000000000000004802000000000000|@5629,2097151,@16828,@5630,@5634,@5635,@4991,@4594,@5636,@5628|17,0,@5585 29,0,@5591 63,0,@5597 107,0,@5598 141,0,@5601 377,0,@5604 5585:O1|@5586 5586:D3,88|498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848b828a812c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c300000000000000005000000000000000|@5590,3,@16805|33,0,@5587 5587:O1|@5588 5588:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b998a912c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16804|65,0,576460752303423480 238,0,@5589 5589:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c305000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16803,@5245|11,0,@5242 5590:S24|5838364c4f574c4556454c28292e74657374457157283129 5591:O1|@5592 5592:D3,88|498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848b8b8aa12c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c300000000000000005000000000000000|@5596,3,@16808|33,0,@5593 5593:O1|@5594 5594:D3,312|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fb8483b7d107303ff55404989ff48c747f80500000048894f2048894718488957104889770848891f488d473048c740f80200000048b928ac12c9a37f000048890848897808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048897808488908c390909000000000000000003001000000000000|@5261,63,@16807|65,0,576460752303423480 238,0,@5595 5595:D4,56|483b65187303ff554849b900dc11c9a37f00004c8b420848c7c313000000ff252c0000009090909000000000000000003000000000000000|@5251,2097151,@16806,@5245|11,0,@5242 5596:S25|5838364c4f574c4556454c28292e746573744e657157283129 5597:O2|@5559,0 5598:O1|@5599 5599:D3,64|488338077520488b4808498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909000000000000000003800000000000000|@5600,3,@16809| 5600:S55|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e4f746865725465737473283129283129 5601:O4|@20055,@557,@5603,@5602 5602:O5|@3867,1426,0,1426,0 5603:S33|636f6d70617265416e644272616e63682072657475726e6564206661696c757265 5604:O1|@5605 5605:D3,24|48c7c001000000c300000000000000001000000000000000|@5583,1,@16810| 5606:S36|47454e45524154455f434f444528292e636f646567656e28392967656e54657374283229 5607:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16812| 5608:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16813| 5609:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16814| 5610:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16815| 5611:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16816| 5612:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16817| 5613:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16818| 5614:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16819| 5615:D8,744|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bae8b512c9a37f000048891148895908488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bb88b612c9a37f000048891a4c894208488062ffbf4983f90175034889d14889c2498d47e8483b45107303ff55404989c748c740f80200000048bbe0b612c9a37f000048895808488910415241514889ca909090ff124883f8017571488b842490000000488b8c2488000000488b942480000000488b5c2478488b742470488b7c24684c8b4424604c8b4c24584c8b5424504c8b5c24484c8b6424404c8b6c24384c8b74243041564c8b74243041564c8b74243041564c8b74243048899424a800000048899c24a0000000eb05e97d0000004889b424980000004889bc24900000004c898424880000004c898c24800000004c895424784c895c24704c896424684c896c2460488b5424104889542458488b54240848895424505a4883c41048895424304c897424284989ca4989c14c8b442408488b1c2448c7c0010000004883c410594883c41051ff2561010000488b08ff31ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff742478ff7424784c8b9424e00000004c8b8c24e80000004c8b8424f0000000488b9c24f8000000488b4108ff150a0100005048c7c001000000488b54240890ff126a016a01ff70084c8d5424084c8b8c24a80000004c8b44241848bba0b712c9a37f0000488b00ff15d6000000488b8424a80000004c8b50584c8b48484c8b4040488b5838488b48104889c8909090ff15b60000004889c1498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048894808594883c408488908488b8c2490000000488b094883f9017506488b0c24eb184889c64889cb488b04249090ff15660000004889c14889f0488b9424900000004883c41848890a4883c410c2800090900000000000000000e002000000000000|@5625,2097151,@16824,@5584,@5626,@4991,@4594,@5624|35,0,@5616 81,0,@5618 139,0,@5619 553,0,@5622 5616:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@5617,1048575,@16820| 5617:S51|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d706172652833292d50 5618:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@5617,1048575,@16821| 5619:O1|@5620 5620:D3,64|488338077520488b4808498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909000000000000000003800000000000000|@5621,3,@16822| 5621:S52|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d70617265283329283129 5622:O1|@5623 5623:D3,24|48c7c001000000c300000000000000001000000000000000|@5583,1,@16823| 5624:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16826| 5625:S49|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e436f6d70617265283329 5626:D3,392|488dbc2458ffffff483b7d187303ff5550a801756d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e9e500000049c7c10100000049c7c00100000048c7c303000000488b00488b94248000000090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13ff30ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424880000004c8b8c24800000004c8b442478488b5c2470488b442468909090e8befeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2600048c7c001000000c26000909000000000000000008001000000000000|@1363,1048575,@16825|181,0,@4376 5627:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16827| 5628:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16833| 5629:S52|47454e45524154455f434f444528292e636f646567656e28392967656e5465737428322967656e4f746865725465737473283129 5630:D3,432|488dbc2458ffffff483b7d187303ff5550a801756d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e90901000049c7c10100000049c7c00100000048c7c301000000488b00488b94248000000090ff124883f80175154889c148b888bd12c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b0048890151ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424880000004c8b8c24800000004c8b442478488b5c2470488b4424689090e89afeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2600048c7c001000000c260009090909090900000000000000000a801000000000000|@1363,1048575,@16829|181,0,@5631 5631:O4|@20055,@557,@5633,@5632 5632:O5|@3867,1415,0,1415,0 5633:S18|67656e546573743a206e6f20726573756c74 5634:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@16830| 5635:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16831| 5636:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16832| 5637:D140,21336|488dbc2440ffffff483b7d187303ff555048833815756f488b4808498d77f0483b75107303ff55404989f748c746f801000000488906488b7c24784c8b4c24704c8b9c24800000004c8b6424684c8b6c24604c8b742458488b44245041504c8b44245041524c8b54245053488b5c2450ff7138488b4c245056488b74245056488b742450eb05e9c500000056488b74245056488b74245056488b7424504889bc24c80000004c898c24c00000004c899c24b8000000488b520848899424b00000004c89a424a80000004c89ac24a00000004c89b4249800000048898424900000004c898424880000004c8994248000000048895c247848894c2470488b4424184889442468488b4424104889442460488b4424084889442458584883c4184889442430488b44242848897424284c8b5424204c8b4c24184c8b442410488b5c24084889c1584883c42051ff25205200004883380d7551488b480848833907740948c7c601000000eb0748c7c603000000488339057570488b790840f6c70174084883ff017d08eb2bf647ff1075254c8b4c24784d8b0940f6c701741041f6c101740a493bf9eb0ae95a040000ff5570ebf17c164989c148b838e407c9a37f0000488b5d08909090ff1340f6c70174064883c7027105ff5570ebf54c8b4c2478498b7cb9fceb05e9d90000004c8b5c24704989d44989dd4989c6564889fb498b4310909090ff156e5100004883f80175744154415041524155415641ff76105048c7c3030000004889f848baa05f06c9a37f000090ff15465100004889c348b8804b0fc9a37f000090ff153a510000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91c0000004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b0048833803740948c7c001000000eb0748c7c0030000004883f002eb1a4889c148c7c00300000056488b79104989ce4989dd4989d4eb04498b7e1048833c240174644883ff01756348837c2468017460488b4c24784889c7488b5c2460488b4110ff1582500000a801747441544150415241554156575048c7c303000000488b84249800000048baa05f06c9a37f000090ff155a5000004889c348b890dc0ec9a37f0000eb0fe94d010000e948010000e943010000ff153e500000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000eb05e92e000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1027105ff5570ebf5f6c10174084883f9017f34eb06f641ff10742c415441504152415541565749c7c003000000488b9c2490000000488b8424a80000009090ff159e4f0000eb69498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b5c247841544150415241554156574989d0488b9c2490000000498b4310909090ff15424f000048c7c001000000488b8c24a0000000488b094883f901740c4889cb909090ff15264f0000488b8c24a0000000488901eb0b415441504152415541565048837c243001740948c7c001000000eb20498d47f0483b45107303ff55404989c748c740f801000000488b4c2408488908488b8c24b0000000488b9424a8000000488b9c24b8000000488b742428488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246850488b44246850488b44246850488b44246850488b44246850488b44246848898c24e000000048899424d800000048899c24d0000000488b76084889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4c241848898c2480000000488b4c241048894c2478488b4c240848894c2470594883c41848894c2448488b4c244048894424404c8b5424284c8b4c24204c8b442418488b5c2408584883c43851ff25ba4d00004883380775684889d64889c74889d8909090ff15aa4d0000f647080174154889c148b8f86f07c9a37f0000488b5d089090ff135641504152535750ff77084151488b5c240848c7c0cd00000048bad0b3dc0000000000ff124883f8017469488b442408483b05604d00007560eb05e9a04b0000488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b642478eb0ae9f4490000e9060100004c8b6c24704c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8581713c9a37f00004883c43051ff25fb4b0000483b05fc4b0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8781f13c9a37f00004883c43051ff25a34a0000483b05a44a0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8282713c9a37f00004883c43051ff254b490000483b054c490000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8d02e13c9a37f00004883c43051ff25f3470000483b05f4470000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8903b13c9a37f00004883c43051ff259b460000483b059c460000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8204b13c9a37f00004883c43051ff2543450000483b0544450000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8585213c9a37f00004883c43051ff25eb430000483b05ec430000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8587213c9a37f00004883c43051ff2593420000483b0594420000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8487413c9a37f00004883c43051ff253b410000483b053c410000756d498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480848b9189c12c9a37f0000488908488b8c24b8000000488b9424b0000000488b9c24c0000000488b742438488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b942490000000eb05e9160100004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b44247050488b44247050488b44247050488b44247050488b44245848898424f0000000488b44246048898424e800000048898c24e000000048899424d800000048899c24d0000000488b76084889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4424204889842480000000488b4424184889442478488b442410488b4c24704889442470488b4424084889442468584883c42048894424384c8b5424284c8b4c24204c8b4424305b48b8a89613c9a37f00004883c43051ff25ba3f0000483b05bb3f00007570488b442410ff15b63f0000488b8c24b8000000488b9424b0000000488b9c24c0000000488b742438488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b442470eb05e9f000000050488b44247050488b44247050488b44247050488b44245848898424f0000000488b44246048898424e800000048898c24e000000048899424d800000048899c24d0000000488b76084889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4424204889842480000000488b4424184889442478488b442410488b4c24704889442470488b4424084889442468584883c42048894424384c8b5424284c8b4c24204c8b4424305b48b8809813c9a37f00004883c43051ff25643e0000483b05653e0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8589a13c9a37f00004883c43051ff250c3d0000483b050d3d0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8e09b13c9a37f00004883c43051ff25b43b0000483b05b53b0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8689d13c9a37f00004883c43051ff255c3a0000483b055d3a0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8d89e13c9a37f00004883c43051ff2504390000483b0505390000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8e0bc13c9a37f00004883c43051ff25ac370000483b05ad370000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b860c213c9a37f00004883c43051ff2554360000483b0555360000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8e8c713c9a37f00004883c43051ff25fc340000483b05fd340000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b858c913c9a37f00004883c43051ff25a4330000483b05a5330000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b888dc13c9a37f00004883c43051ff254c320000483b054d320000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b810de13c9a37f00004883c43051ff25f4300000483b05f5300000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b898df13c9a37f00004883c43051ff259c2f0000483b059d2f0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b860f113c9a37f00004883c43051ff25442e0000483b05452e0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b810fc13c9a37f00004883c43051ff25ec2c0000483b05ed2c0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8c81314c9a37f00004883c43051ff25942b0000483b05952b0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8a81a14c9a37f00004883c43051ff253c2a0000483b053d2a0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8502214c9a37f00004883c43051ff25e4280000483b05e52800007547f6442410017545488b442410488b0848833907754cf6400801754b488b5008488b1a48833b077557f64208017556488b720848837e08017562f64108017461f6410801752beb0ae943050000e9e603000048b8b8f309c9a37f0000488b5d08eb0ae9d1030000e9cc030000909090ff1348837908037569f64308017468eb0ae9b3030000e9ae030000f6430801751d48b8b8f309c9a37f0000eb0ae997030000e93f020000488b5d0890ff1348817b0881000000756e488b7c2438ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000eb0ae9ff010000e9fa010000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000eb05e9bb010000ffb424b8000000ffb424b800000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b06488b570890ff124883f80175154889c148b898f510c9a37f0000488b5d089090ff13488b18488b8424b0000000ff1562270000488b8c24a8000000488b094883f9017506488b4808eb16488b304889cb488b400890ff15422700004889c1eb03488b30488b8424a80000004889086a016a0156ffb42490000000ffb424900000004c8d5424184c8b8c24d80000004c8b44245048c7c38100000048c7c003000000ff15fe260000488b8424c0000000488b004883f8017507488b442410eb104889c3488b4424109090ff15de260000488b8c24c00000004889014c8b8c24c800000049c7c0010000005b488b0424909090ff15be260000488b8c24b8000000488b094883f901740b4889cb9090ff15aa260000488b8c24b8000000488901488b094883f901750c48b808300fc9a37f0000eb144889cb48b808300fc9a37f000090ff157e260000488b8c24b800000048890148837c243803750e48c7c0010000004883c450c28000498d47f0483b45107303ff55404989c748c740f801000000488b14244889104883c450c28000488bbc24b80000004c8b8424b00000004c8b8c24c00000004c8b5424384c8b9c24a80000004c8ba424a00000004c8bac24980000004c8bb42490000000488b8c2488000000488b842480000000488b5c2478488b542470488b74246856488b74246856488b74246856488b74246856488b74246856488b7424504889b424e8000000488b7424584889b424e00000004889bc24d80000004c898424d00000004c898c24c80000004d8b52084c899424c00000004c899c24b80000004c89a424b00000004c89ac24a80000004c89b424a000000048898c2498000000488984249000000048899c24880000004889942480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8882914c9a37f00004883c43051ff25ec240000488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8882914c9a37f00004883c43051ff259c230000483b059d230000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8204614c9a37f00004883c43051ff2544220000483b0545220000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8b04614c9a37f00004883c43051ff25ec200000483b05ed200000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8a05914c9a37f00004883c43051ff25941f0000483b05951f0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8885a14c9a37f00004883c43051ff253c1e0000483b053d1e0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8586314c9a37f00004883c43051ff25e41c0000483b05e51c0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8986614c9a37f00004883c43051ff258c1b0000483b058d1b0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8d86914c9a37f00004883c43051ff25341a0000483b05351a0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8186d14c9a37f00004883c43051ff25dc180000483b05dd180000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8807514c9a37f00004883c43051ff2584170000483b0585170000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8b87814c9a37f00004883c43051ff252c160000483b052d160000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8b08314c9a37f00004883c43051ff25d4140000483b05d5140000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8008414c9a37f00004883c43051ff257c130000483b057d130000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8388714c9a37f00004883c43051ff2524120000483b0525120000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8708a14c9a37f00004883c43051ff25cc100000483b05cd100000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8a88d14c9a37f00004883c43051ff25740f0000483b05750f0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8209214c9a37f00004883c43051ff251c0e0000483b051d0e0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8709214c9a37f00004883c43051ff25c40c0000483b05c50c0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8c09214c9a37f00004883c43051ff256c0b0000483b056d0b0000756e488b8424b8000000488b8c24b0000000488b9424c0000000488b5c2438488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b7424684156eb05e9ec0000004c8b74246841564c8b74246841564c8b7424504c89b424e80000004c8b7424584c89b424e000000048898424d800000048898c24d000000048899424c8000000488b5b0848899c24c00000004889b424b80000004889bc24b00000004c898424a80000004c898c24a00000004c899424980000004c899c24900000004c89a424880000004c89ac2480000000488b4424204889442478488b4424184889442470488b442410488b4c24684889442468488b4424084889442460584883c42048894424304c8b5424204c8b4c24184c8b442428488b5c241048b8d0a314c9a37f00004883c43051ff25140a000048833c2401744a483b050e0a00007446483b050d0a0000744d483b050c0a00007449483b050b0a00007450483b050a0a00007455483b05090a00007455483b05080a0000745a483b05070a00007456eb0ae931020000e9b1000000483b05fa090000745aeb0ae9a1000000e99c000000483b05ed0900007457eb05e98c000000483b05e5090000eb05e97e0000007457eb05e975000000483b05d6090000eb0ae967000000e9620000007454483b05c90900007450483b05c8090000eb05e9490000007447483b05c0090000743eeb05e937000000483b05b8090000742e483b05b7090000eb05e920000000741e483b05af0900007415483b05ae090000eb0ae907000000e9020000007571498d47d8483b45107303ff55404989c748c740f804000000488b4c243048894818488b4c241848894810488b4c24204889480848c7000b000000488b4c2438488b9424c0000000488b9c24b8000000488bb424b0000000488bbc24a80000004c8b8424a00000004c8b8c2498000000eb05e9050100004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b44247050488b44247050488b44247050488b4424705048c7c00100000048898424f000000048899c24e80000004889b424e00000004889bc24d80000004c898424d00000004c898c24c80000004c899424c00000004c899c24b80000004c89a424b00000004c89ac24a80000004c89b424a0000000488b4424204889842498000000488b4424184889842490000000488b4424104889842488000000488b4424084889842480000000584883c42048894424504989d24c8b4c243049b8189c12c9a37f000048bbf89b12c9a37f000058488b51104883c440ff22498d47f0483b45107303ff55404989c748c740f801000000488b4c2418488908488b8c24b8000000488b9424b0000000488b9c24c0000000488b742438488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b44247050488b44247050488b44247050488b44247048898c24e800000048899424e000000048899c24d8000000488b76084889b424d00000004889bc24c80000004c898424c00000004c898c24b80000004c899424b00000004c899c24a80000004c89a424a00000004c89ac24980000004c89b42490000000488b4c241848898c2488000000488b4c241048898c2480000000488b4c240848894c2478594883c41848894c2450488b4c244848894424484c8b5424384c8b4c24304c8b44242848c7c303000000584883c44051ff25da060000498d47f0483b45107303ff55404989c748c740f801000000488b4c2418488908488b8c24b8000000488b9424b0000000488b9c24c0000000488b742438488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b44247050488b44247050488b44247050488b44247048898c24e800000048899424e000000048899c24d8000000488b76084889b424d00000004889bc24c80000004c898424c00000004c898c24b80000004c899424b00000004c899c24a80000004c89a424a00000004c89ac24980000004c89b42490000000488b4c241848898c2488000000488b4c241048898c2480000000488b4c240848894c2478594883c41848894c2450488b4c244848894424484c8b5424384c8b4c24304c8b44242848c7c303000000584883c44051ff258f050000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b442478488b742470488bbc24800000004c8b4c24684c8b5c24604c8b6424584c8b6c24504c8b74244841504c8b44244841524c8b54244853488b5c244851488b4c244851488b4c244851488b4c244851488b4c244851488b4c244848898424c00000004889b424b80000004889bc24b0000000488b520848899424a80000004c898c24a00000004c899c24980000004c89a424900000004c89ac24880000004c89b424800000004c894424784c8954247048895c2468488b4424184889442460488b4424104889442458488b4424084889442450584883c4184889442428488b44242048894c24204c8b5424184c8b4c24104c8b44240848c7c3030000004889c2584883c41852ff256d040000909090909000000000000000005053000000000000|@6581,2097151,@17295,@6573,@3852,@194,@100,@3852,@194,@100,@4422,@3834,@6582,@6573,@6583,I72,@6584,I15,@6584,I17,@6584,I152,@6584,I223,@6584,I151,@6584,I106,@6584,I107,@6584,I108,@6584,I111,@6584,I218,@6592,@6584,I242,@6584,I243,@6584,I244,@6584,I245,@6584,I216,@6584,I196,@6584,I244,@6584,I238,@6584,I239,@6584,I240,@6584,I241,@6584,I246,@6584,I252,@6584,I253,@6584,I70,@6584,I71,@6584,I11,@5030,@6594,@5034,@6595,@4921,@6596,@6597,@6584,@6584,I255,@6584,I254,@6584,I47,@6584,I125,@6584,I126,@6584,I127,@6584,I128,@6584,I129,@6584,I130,@6584,I135,@6584,I134,@6584,I136,@6584,I137,@6584,I138,@6584,I139,@6584,I140,@6584,I141,@6584,I198,@6584,I195,@6584,I251,I217,I113,I231,I232,I233,I234,I247,I248,I249,I250,I122,I123,I118,I119,I120,I121,I105,I154,@6573,@6573,@6573|440,0,@1493 555,0,@193 575,0,@4505 616,0,@4506 634,0,@557 655,0,@20055 815,0,@193 835,0,@4379 892,0,@4380 917,0,@557 931,0,@20055 1577,0,@1294 1620,0,I150 1994,0,@5638 2354,0,@5661 2714,0,@5680 3074,0,@5699 3434,0,@5724 3794,0,@5751 4154,0,@5770 4514,0,@5816 4874,0,@5822 4937,0,@5559 5275,0,@5875 5641,0,@5880 6001,0,@5888 6361,0,@5894 6721,0,@5900 7081,0,@5905 7441,0,@5964 7801,0,@5977 8161,0,@5990 8521,0,@5995 8881,0,@6055 9241,0,@6061 9601,0,@6067 9961,0,@6117 10321,0,@6147 10681,0,@6180 11041,0,@6193 11401,0,@6212 11512,0,@2708 11574,0,@2708 11789,0,@5027 12068,0,@4493 12083,0,@4493 12489,0,@6228 12833,0,@6228 13193,0,@6295 13553,0,@6297 13913,0,@6335 14273,0,@6339 14633,0,@6360 14993,0,@6370 15353,0,@6380 15713,0,@6390 16073,0,@6413 16433,0,@6423 16793,0,@6446 17153,0,@6448 17513,0,@6458 17873,0,@6468 18233,0,@6478 18593,0,@6491 18953,0,@6493 19313,0,@6495 19673,0,@6535 20310,0,@5559 20320,0,@5558 5638:O1|@5639 5639:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e81713c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16844|30,0,@5640 5640:O1|@5641 5641:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba681813c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5659,7,@16843|29,0,@5642 5642:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba381913c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@16841,@5657,@4978|68,0,@5643 5643:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8d01913c9a37f000048bb881c13c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@16840,@5100|61,0,@5644 71,0,@5652 5644:O1|@5645 5645:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba501a13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16836|29,0,@5646 5646:D4,192|483b65187303ff5548488b4208488b5808488b084889c890ff15ba0000004883f8017505f6c301741048b8401b13c9a37f0000488b5d08ff13498d47e0483b45107303ff55404989c748c740f80300000048b9b81b13c9a37f000048894810488b0b4889480848c70045000000498d57c8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f803000000488950104889580848c70001000000c3909090900000000000000000b800000000000000|@4942,15,@16834,@5651|43,0,@5647 83,0,@5650 5647:O4|@20055,@557,@5649,@5648 5648:O5|@4546,1541,0,1541,0 5649:S10|74687265616453656c66 5650:O4|0,@3807,@3659,120 5651:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16835|28,0,@1662 5652:O1|@5653 5653:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb101d13c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16839|33,0,@5654 5654:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb901d13c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16838|29,0,@5655 5655:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16837,@4949| 5656:S37|5838364c4f574c4556454c28292e676574526573756c745265676973746572283629283129 5657:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16842| 5658:S37|5838364c4f574c4556454c28292e67656e6572616c4e65676f746961746f72283129283129 5659:S35|5838364c4f574c4556454c28292e696e73747254687265616453656c66283229283129 5660:S56|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e2833292d45 5661:O1|@5662 5662:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8082013c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16855|30,0,@5663 5663:O1|@5664 5664:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba882013c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5679,7,@16854|29,0,@5665 5665:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba582113c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@16852,@5678,@4978|68,0,@5666 5666:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8f02113c9a37f000048bbf82413c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@16851,@5100|61,0,@5667 71,0,@5674 5667:O1|@5668 5668:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba702213c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16847|29,0,@5669 5669:D4,320|483b65187303ff5548488b4208488b5808488b084889c890ff153a010000a8017515488b0848833903750c48837808017505f6c30174164889c148b8e02313c9a37f0000488b5d08909090ff13498d5790483b55107303ff55404989d748c742f803000000488b33488972104889720848c70277000000488d7a2048c747f8050000004889772048c74718f1ffffff4c8b41084c89471048c747080300000048c7070d0000004c8d4f3049c741f80300000049baffffffffffffff014d8951104989710849c7014b0000004d8d57984c3b55107303ff55404d89d749c742f80200000049c74208010000004d890a4d8d4a1849c741f8020000004d895108498939498d791848c747f8020000004c894f08488917488d471848c740f803000000488978104889580848c70001000000c300000000000000003801000000000000|@4942,511,@16845,@5673|60,0,@5670 180,0,72057594037927935 5670:O4|@20055,@557,@5672,@5671 5671:O5|@4546,1532,0,1532,0 5672:S6|7665634c656e 5673:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16846|28,0,@1662 5674:O1|@5675 5675:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb802513c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16850|33,0,@5676 5676:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb002613c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16849|29,0,@5677 5677:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16848,@4949| 5678:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16853| 5679:S31|5838364c4f574c4556454c28292e696e7374725665636c656e283229283129 5680:O1|@5681 5681:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b82713c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16866|30,0,@5682 5682:O1|@5683 5683:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba382813c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5698,7,@16865|29,0,@5684 5684:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba082913c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@16863,@5697,@4978|68,0,@5685 5685:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8a02913c9a37f000048bb982c13c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@16862,@5100|61,0,@5686 71,0,@5693 5686:O1|@5687 5687:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba202a13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16858|29,0,@5688 5688:D4,296|483b65187303ff5548488b4208488b5808488b084889c890ff1522010000a8017515488b0848833903750c48837808017505f6c30174164889c148b8782b13c9a37f0000488b5d08909090ff13498d57b8483b55107303ff55404989d748c742f803000000488b33488972104889720848c70277000000488d7a2048c747f80400000048c74718ffffffff49b8e86f0cc9a37f00004c8947104c8b41084c89470848c707010000004d8d4f904c3b4d107303ff55404d89cf49c741f803000000498979104989710849c7013f000000498d792048c747f80200000048c74708010000004c890f4c8d4f1849c741f80200000049897908498911498d411848c740f8030000004c8948104889580848c70001000000c390909000000000000000002001000000000000|@4942,255,@16856,@5692|60,0,@5689 141,0,@3659 5689:O4|@20055,@557,@5691,@5690 5690:O5|@4546,1155,0,1155,0 5691:S11|67656e566563466c616773 5692:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16857|28,0,@1662 5693:O1|@5694 5694:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb202d13c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16861|33,0,@5695 5695:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bba02d13c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16860|29,0,@5696 5696:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16859,@4949| 5697:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16864| 5698:S33|5838364c4f574c4556454c28292e696e737472566563666c616773283229283129 5699:O1|@5700 5700:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8602f13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16882|30,0,@5701 5701:O1|@5702 5702:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bae02f13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5723,7,@16881|29,0,@5703 5703:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048bab03013c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@16879,@5722,@4978|68,0,@5704 5704:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8483113c9a37f000048bb583913c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@16878,@5100|61,0,@5705 71,0,@5718 5705:O1|@5706 5706:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bac83113c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16874|29,0,@5707 5707:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,8191,@16867,@5712,@5708| 5708:D7,856|483b65187303ff5548a8017515488b0848833903750c48837808017505f6c30174134889c148b8083613c9a37f0000488b5d08ff13498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d9798feffff4c3b55107303ff55404d89d749c742f805000000498972204989521849897a104d894a084d890249c70003000000498d523048c742f80400000048c74218010000004c89521048c742080500000048c70217000000488d722848c746f80200000048c7460801000000488916488d561848c742f8020000004c895208488932488d721848c746f802000000488b7a0848897e084c8b024c89064c8d4e1849c741f8030000004c8b134d8951104d89510849c701770000004d8d592049c743f80200000049c74308010000004d890b4d8d4b1849c741f8020000004c8b66084d89610849c701390000004d8d691849c745f80200000049c74508010000004d894d004d8d4d1849c741f80300000049c74110090000004d89510849c701330000004d8d712049c746f80200000049c74608010000004d890e4d8d4e1849c741f80400000049c74118ffffffff49c7411021000000488b41084989410849c70179000000498d47d8483b45107303ff55404989c748c740f80400000048c740180100000049bae86f0cc9a37f00004c895010488b49084889480848c70001000000498d4fb0483b4d107303ff55404989cf48c741f80300000048894110488b1b4889590848c70145000000488d412048c740f80200000048c7400801000000488908488d481848c741f802000000488941084c89094883f9017505488b06eb0d4889cb488b0690ff15720000004883f80174114889c34c89f09090ff15660000004989c64983fe0174124c89f34c89e8909090ff15560000004989c54983fd0175044c89d8c34c89eb4c89d8ff2545000000909090909000000000000000005003000000000000|@5714,8191,@16869,@5715,@5716,@5717,@5713|39,0,@5709 118,0,576460752303423480 631,0,@3659 5709:O4|@20055,@557,@5711,@5710 5710:O5|@4546,1175,0,1175,0 5711:S12|67656e46697273744c6f6e67 5712:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16868|28,0,@1662 5713:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16873| 5714:S29|5838364c4f574c4556454c28292e67656e46697273744c6f6e67283229 5715:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16870| 5716:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16871| 5717:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16872| 5718:O1|@5719 5719:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bbe03913c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16877|33,0,@5720 5720:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb603a13c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16876|29,0,@5721 5721:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16875,@4949| 5722:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16880| 5723:S37|5838364c4f574c4556454c28292e696e73747247657446697273744c6f6e67283229283129 5724:O1|@5725 5725:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8203c13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16900|30,0,@5726 5726:O1|@5727 5727:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa03c13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5750,7,@16899|29,0,@5728 5728:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba703d13c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@16897,@5749,@4978|68,0,@5729 5729:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8083e13c9a37f000048bbe84813c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@16896,@5100|61,0,@5730 71,0,@5745 5730:O1|@5731 5731:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba883e13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16892|29,0,@5732 5732:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,8191,@16883,@5737,@5733| 5733:D9,1304|483b65187303ff5548a8017515488b0848833903750c48837808017505f6c30174134889c148b8984413c9a37f0000488b5d08ff13498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d9750ffffff4c3b55107303ff55404d89d749c742f805000000498972204989521849897a104d894a084d890249c70003000000498d523048c742f80400000048c74218050000004c89521048c742080500000048c70217000000488d722848c746f80200000048c7460801000000488916488d561848c742f8020000004c895208488932488d721848c746f802000000488b7a0848897e084c8b024c89064c8d4e1849c741f80100000041c641ff4049c701010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049bbf1ffffffffffff0f4d891a4d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8db720ffffff4c3b75107303ff55404d89f749c746f8050000004d8956204d894e184d895e104d896e084d892649c70424030000004d8d4e3049c741f8020000004d89710849c7017d0000004d8d511849c742f80200000049c74208010000004d890a4d8d4a1849c741f8020000004d8971084d89114d8d511849c742f8020000004d8b59084d895a084d8b214d89224d8d6a1849c745f8020000004d8b72084d89750849c7450039000000498d451848c740f80200000048c74008010000004c89284c8d681849c745f8030000004c8b034d8945104d89450849c74500770000004d8d47d84c3b45107303ff55404d89c749c740f80400000049c740180100000048bae86f0cc9a37f000049895010488b51084989500849c70001000000498dbf60ffffff483b7d107303ff55404989ff48c747f8030000004c8947104c8b034c89470848c70745000000488d572048c742f80200000048c742080100000048893a488d7a1848c747f802000000488957084c892f488d571848c742f8020000004c8b6e084c896a0848c702390000004c8d421849c740f80200000049c7400801000000498910498d501848c742f80300000048c7421007000000488b1b48895a0848c7024b000000498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488913488d531848c742f802000000488b490848894a0848c7027b000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f9017505488b0eeb1650534889cb488b06909090ff15aa0000004889c1eb0250534883f9017506488b0424eb0d4889cb488b0424ff15920000004883f8017505498b02eb0d4889c3498b0290ff15820000004883f80174114889c34c89c09090ff15760000004989c04983f80174124c89c34889f8909090ff15660000004889c74883ff0175064883c40858c34889fb4883c40858ff25510000009000000000000000001005000000000000|@5739,8191,@16885,@5740,@5741,@5742,@5743,@5744,@5738|39,0,@5734 118,0,576460752303423480 451,0,576460752303423480 835,0,@3659 5734:O4|@20055,@557,@5736,@5735 5735:O5|@4546,1195,0,1195,0 5736:S15|67656e537472696e674c656e677468 5737:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16884|28,0,@1662 5738:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16891| 5739:S32|5838364c4f574c4556454c28292e67656e537472696e674c656e677468283229 5740:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16886| 5741:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16887| 5742:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16888| 5743:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16889| 5744:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16890| 5745:O1|@5746 5746:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb704913c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16895|33,0,@5747 5747:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bbf04913c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16894|29,0,@5748 5748:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16893,@4949| 5749:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16898| 5750:S37|5838364c4f574c4556454c28292e696e737472537472696e674c656e677468283229283129 5751:O1|@5752 5752:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b04b13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16910|30,0,@5753 5753:O1|@5754 5754:D3,32|48b8084c13c9a37f0000c3909090909000000000000000001800000000000000|@5769,1,@16909|2,0,@5755 5755:O1|@5756 5756:D5,120|483b65187303ff55484889c34889d890ff157a000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889015349b8c84c13c9a37f000048bb205013c9a37f00004889c8909090ff153e0000004889c1584889caff22909090909000000000000000007000000000000000|@5104,1048575,@16907,@5768,@5100|60,0,@5757 70,0,@5764 5757:O1|@5758 5758:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba484d13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@16903|29,0,@5759 5759:D4,384|483b65187303ff5548488b4208488b5808488b084889c890ff157a010000a8017529488b08488339037520f6400801751a488b5008488b3248833e03750d48837a080175064883fb0174164889c148b8f84e13c9a37f0000488b5d08909090ff13498d7fb8483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c89470848c707770000004c8d4f2049c741f80400000049c741180100000049bae86f0cc9a37f00004d8951104c8b51084d89510849c701010000004d8d9f50ffffff4c3b5d107303ff55404d89df49c743f8030000004d8943104d894b0849c703750000004d8d4b2049c741f80400000049c74118050000004d89411049c741080300000049c701650000004d8d612849c74424f80200000049c7442408010000004d890c244d8d4c241849c741f8020000004d8961084d89194d8d591849c743f8020000004d894b0849893b498d431848c740f8030000004c8958104889580848c70001000000c3909090909000000000000000007801000000000000|@4942,2047,@16901,@5763|80,0,@5760 162,0,@3659 5760:O4|@20055,@557,@5762,@5761 5761:O5|@4546,1211,0,1211,0 5762:S24|67656e536574537472696e67537472696e674c656e677468 5763:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16902|28,0,@1662 5764:O1|@5765 5765:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bba85013c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@16906|33,0,@5766 5766:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb285113c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@16905|29,0,@5767 5767:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@16904,@4949| 5768:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@16908| 5769:S40|5838364c4f574c4556454c28292e696e737472536574537472696e674c656e677468283229283129 5770:O1|@5771 5771:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9505313c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5660,1048575,@16932|130,0,@5772 5772:O1|@5773 5773:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad05313c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16931|29,0,@5774 5774:D4,48|483b65187303ff554849b8305413c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16929,@5779|11,0,@5775 5775:O2|0,@5776 5776:O1|@5777 5777:D4,56|483b65187303ff554849c7c1030000004c8b4010488b5808488b084889c8ff252c0000009090909000000000000000003000000000000000|@5778,4095,@16911,@5324| 5778:S28|5838364c4f574c4556454c28292e7465737454616773283129283129 5779:D6,2552|483b65187303ff5548a801754f488b0848833905755bf6400801755a488b500848837a08017563488b3248833e05755f498338097506488b7910eb08488b7910480b7e104883ff0174064883ff017573498d7fe0483b7d10730aeb05e993080000ff55404989ff48c747f803000000eb0ae924030000e91f03000049b9285f13c9a37f00004c890feb0ae90b030000e90603000048895f084c894710488067ffbf498d47d0483b45107303ff55404989c748c740f80500000048c7402003000000eb05e91c00000048c740189fff000048c74010010000004889780848c70005000000c34150ff711049c7c0010000004989d94889fb4c89c8909090ff150e09000048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc7f6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9ba5613c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901482314244883fa01746a4883fa017469498d4fe0483b4d107303ff55404989cf48c741f80300000048bac85f13c9a37f0000488911488b5424084889510848894110488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401801000000eb0ae919000000e914000000488948104889500848c700070000004883c410c3498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b542408488911498d57e8483b55107303ff55404989d748c742f80200000048bb606c13c9a37f000048891a48894a08488062ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401803000000488950104889480848c700070000004883c410c348833905755df6400801755c488b500848837a08017556488379100174074883791001756d498d77e0483b75107303ff55404989f748c746f80300000048bf306f13c9a37f000048893e48895e084c894610488066ffbf498d47d0483b45107314eb0fe9c1010000e9bc010000e9b7010000ff55404989c748c740f80500000048c740200300000048c740189fff0000eb05e91400000048c74010010000004889700848c70005000000c3415049c7c0010000004889de488b59104889f0ff15ba05000048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc7f6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9165a13c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe0483b4d107303ff55404989cf48c741f80300000048ba886f13c9a37f00004889115a4889510848894110488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401801000000488948104889500848c70007000000c349833809756f498d57e0483b55107303ff55404989d748c742f80300000048bee06f13c9a37f000048893248895a084c894210488062ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889500848c70005000000eb05e901000000c3f64008017560488b5008488b3248833e05755848837a0801755648837e1001740748837e1001756d498d7fe0483b7d107303ff55404989ff48c747f80300000049b9387013c9a37f00004c890f48895f084c894710488067ffbf498d47d0483b45107314eb0fe9dd010000e9d8010000e9d3010000ff55404989c748c740f80500000048c740200300000048c740189fff0000eb05e91400000048c74010010000004889780848c70005000000c3415049c7c0010000004889df488b5e104889f890ff151a03000048c7c10100000048c7c2030000004883f92f75134889c348b878ed0ec9a37f0000488b5d08ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebc7f6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b9be5c13c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488941085a488911498d57e8483b55107303ff55404989d748c742f80200000048bb907013c9a37f000048891a48894a08488062ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401803000000488950104889480848c70007000000c3498d57e0483b55107303ff55404989d748c742f80300000048bee87013c9a37f000048893248895a084c894210488062ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889500848c70005000000c3498338097572498d47e0483b45107303ff55404989c748c740f80300000048b9407113c9a37f0000488908488958084c894010488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889480848c70005000000eb05e901000000c3498d47e0483b45107303ff55404989c748c740f80300000048b9987113c9a37f0000488908488958084c894010488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889480848c70005000000c390909090900000000000000000f009000000000000|@5814,2097151,@16930,@4978,@4978,@4978|125,0,@5780 283,0,@4414 353,0,@376 363,0,I106 384,0,$5779+458 412,0,@560 431,0,@3809 482,0,@3811 673,0,@5783 839,0,@5800 985,0,@5806 1143,0,@4414 1213,0,@376 1223,0,I106 1244,0,$5779+1318 1272,0,@560 1291,0,@3809 1342,0,@3811 1391,0,@5807 1507,0,@5808 1664,0,@5809 1823,0,@4414 1893,0,@376 1903,0,I106 1924,0,$5779+1998 1952,0,@560 1971,0,@3809 2022,0,@3811 2103,0,@5810 2208,0,@5811 2324,0,@5812 2444,0,@5813 5780:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16912|19,0,@5781 5781:O1|@5779 5782:S37|5838364c4f574c4556454c28292e776f726453656c65637444657374283129283129283129 5783:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5796,2097151,@16914,@5784| 5784:D5,2240|483b65187303ff5548a80174144889c148b8186913c9a37f0000488b5d0890ff13f64008017416488b480848b8186913c9a37f0000488b5d089090ff13488b4808488b1148833a05755a4883790801755848c7c60100000048c7c7030000004883fe2f751048b878ed0ec9a37f0000488b5d08ff134989f94c234a084983f90175144883c602488d7c3fff483b65187303ff5548ebc940f6c60174124883fe017d36eb10e90d030000e908030000f646ff1074244150ff33ff73084889f348b810c506c9a37f000048bad0a8dc00000000009090ff12eb0a4889f04150ff33ff7308ff750848b94e6113c9a37f00005148896508a80174064883f82f72134889c148b8b0df06c9a37f0000488b5d08ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4ff0483b4d107303ff55404989cf48c741f801000000488b54241048891148837c24080575144889c348b8906913c9a37f0000488b5d0890ff1348837c24080b754c498d5fc0483b5d107303ff55404989df48c743f80400000048c74318030000004889531048c743080100000048c70309000000488d732848c746f80200000048c746080100000048891eeb6148837c240803745e48837c240807745b48837c2408097558498d5fc0483b5d107303ff55404989df48c743f80400000048c74318030000004889531048c743080100000048c70309000000488d732848c746f80200000048c7460801000000eb14e92d000000e921000000e913000000e90500000048891eeb1948c7c601000000eb1048c7c601000000eb0748c7c601000000498d5fd8483b5d107303ff55404989df48c743f8040000004889431848895310488b7c240848897b0848c7030f0000004883ff01753c498d7fd0483b7d107303ff55404989ff48c747f8020000004889570848c707530000004c8d471849c740f80200000049c7400801000000498938eb0749c7c001000000498d7f98483b7d107303ff55404989ff48c747f8020000004c89470848891f488d5f1848c743f8020000004889530848c70303000000488d531848c742f8020000004889420848c70203000000488d421848c740f80300000048895010488958084889385156488b542410ff124883f8017506488b0424eb104889c3488b0424909090ff15560500004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104883c408594883c4184889480848c70001000000c348833a07755748837908017555f64208017454f6420801751248b8b8f309c9a37f0000488b5d089090ff1348833b0b751a488b720840f6c60174054803f67105ff5570ebf64883ee01eb6448833b03753a488b720840f6c6017416eb0fe923020000e91e020000e9ab0100004803f67105ff5570ebf64883ee0140f6c60174064883c602715bff5570ebf548833b077530488b720840f6c60174054803f67105ff5570ebf64883ee0140f6c601eb05e96300000074064883c602715bff5570ebf548833b09751f488b720840f6c60174054803f67105ff5570ebf64883ee01eb36e93100000048833b01741348b8086a13c9a37f0000488b5d08909090ff13488b720840f6c60174054803f67105ff5570ebf64883ee01498d7ff0483b7d107303ff55404989ff48c747f8010000004c890748837a0801750f48833b03740948c7c301000000eb6d4d8d8f70ffffff4c3b4d107303ff55404d89cf49c741f804000000498971184d894110488b334989710849c701090000004d8d512849c742f80200000049c74208010000004d890a4d8d4a1849c741f8020000004d89410849c701030000004d8d411849c740f802000000eb05e9330000004c8b5a084d89580849c70005000000498d401848c740f8030000004c8940104c8948084c891057488b530890ff124889c3eb0157498d47e0483b45107303ff55404989c748c740f80300000048895810594889480848c70001000000c3498d77e0483b75107303ff55404989f748c746f80300000048bf886a13c9a37f000048893e48895e084c894610488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c74010030000004889700848c70005000000c348833a0175074883790801741148b8186913c9a37f0000488b5d0890ff13498d77f0483b75107303ff55404989f748c746f8010000004c890648833b05751348b8906913c9a37f0000488b5d08909090ff1348833b0b754c498d7fc0483b7d107303ff55404989ff48c747f80400000048c74718030000004c89471048c747080100000048c707090000004c8d4f2849c741f80200000049c7410801000000498939eb5e48833b03745d48833b07745c48833b09755b498d7fc0483b7d107303ff55404989ff48c747f80400000048c74718030000004c89471048c747080100000048c707090000004c8d4f2849c741f80200000049c7410801000000498939eb28e923000000e917000000e90900000049c7c101000000eb1049c7c101000000eb0749c7c101000000498d7fd0483b7d107303ff55404989ff48c747f8050000004c8947204c8b52104c8957184c8b5a084c895f104c8b234c89670848c7070d0000004983fc01753d4d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d89450849c74500530000004d8d751849c746f80200000049c74608010000004d892eeb0749c7c6010000004d8d6f904c3b6d107303ff55404d89ef49c745f8020000004d89750849897d00498d7d1848c747f8020000004c89470848c707030000004c8d471849c740f8030000004d8950104d89580849c70001000000498d402048c740f8030000004c894010488978084c8928564151488b5308909090ff124883f8017506488b0424eb104889c3488b0424909090ff15660000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104883c408594889480848c70001000000c39090909090900000000000000000b808000000000000|@5798,2097151,@16915,@5799,@5797|18,0,@5785 45,0,@5785 103,0,@4414 192,0,@376 202,0,I106 231,0,$5784+302 259,0,@560 275,0,@3809 326,0,@3811 394,0,@5788 977,0,@2708 1188,0,@5791 1511,0,@5794 1610,0,@5785 1660,0,@5788 5785:O4|@20055,@557,@5787,@5786 5786:O5|@4546,1072,0,1072,0 5787:S10|616464576f7264417267 5788:O4|@20055,@557,@5790,@5789 5789:O5|@4546,964,0,964,0 5790:S13|706f737454616741646a757374 5791:O4|@20055,@557,@5793,@5792 5792:O5|@4546,1053,0,1053,0 5793:S18|616464576f72644172673a206f70636f6465 5794:D3,48|483b65187303ff55484c8b4210488b5a0848bae06a13c9a37f0000ff2290909000000000000000002800000000000000|@5796,1048575,@16913|19,0,@5795 5795:O1|@5784 5796:S36|5838364c4f574c4556454c28292e776f726453656c65637465644c656674283129283129 5797:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16917| 5798:S33|5838364c4f574c4556454c28292e776f726453656c65637465644c656674283329 5799:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16916| 5800:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@5804,2097151,@16919,@5801| 5801:D5,360|483b65187303ff5548a8017556488b08488339077552f64008017559488b500848837a0801756bf6410801746a48c7c101000000a8017547498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008eb0ae999000000e994000000483b6518730aeb05e987000000ff5548ebb54889c84c8b4308488b0b4889cbff25ee000000e96a000000498d77e8483b75107303ff55404989f748c746f80200000048bf586e13c9a37f000048893e48895e08488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff000048c74010010000004889700848c70005000000c348c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84c8b4308488b0b4889cbff2535000000909090909000000000000000006001000000000000|@5805,2097151,@16920,@5784,@5784|177,0,@5802 5802:D3,48|483b65187303ff5548488b5a0848bab06e13c9a37f0000ff229090909090909000000000000000002800000000000000|@5804,1048575,@16918|15,0,@5803 5803:O1|@5801 5804:S37|5838364c4f574c4556454c28292e776f726453656c65637465645269676874283129283129 5805:S34|5838364c4f574c4556454c28292e776f726453656c65637465645269676874283229 5806:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16921|19,0,@5781 5807:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5796,2097151,@16922,@5784| 5808:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16923|19,0,@5781 5809:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16924|19,0,@5781 5810:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@5804,2097151,@16925,@5801| 5811:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16926|19,0,@5781 5812:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16927|19,0,@5781 5813:D3,48|483b65187303ff55484c8b4210488b5a0848ba805f13c9a37f0000ff2290909000000000000000002800000000000000|@5782,1048575,@16928|19,0,@5781 5814:S31|5838364c4f574c4556454c28292e776f726453656c65637444657374283329 5815:S34|5838364c4f574c4556454c28292e776f726453656c65637444657374283129283129 5816:O1|@5817 5817:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9507313c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5660,1048575,@16935|130,0,@5818 5818:O1|@5819 5819:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad07313c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16934|29,0,@5820 5820:D4,48|483b65187303ff554849b8307413c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16933,@5779|11,0,@5821 5821:O2|4,@5776 5822:O1|@5823 5823:D4,536|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b8a07613c9a37f0000488b5d08ff13ff30ff31909090ff15f2010000a801755bf6400801755a488b480848837908017554f601017554488b11f602017465f60201751048b8b8f309c9a37f0000488b5d08ff1348833a05756d498d5fe8483b5d107303ff55404989df48c743f80200000048c7430801000000eb14e95a010000e975000000e970000000e96b000000488b742408488933498d77e8483b7510730aeb05e946000000ff55404989f748c746f80200000048895e0848bb187713c9a37f0000eb05e92300000048891e498d47f0483b45107303ff55404989c748c740f8010000004889304883c410c348c7c0010000004883c410c3f6400801755b488b480848837908017555f600017555488b10f60201746ff60201751248b8b8f309c9a37f0000488b5d089090ff1348833a057557498d5fe8483b5d107303ff55404989df48c743f80200000048c7430801000000488b3424eb0fe96e000000e969000000e964000000488933498d77e8483b75107303ff55404989f748c746f802000000eb0ae936000000e93100000048895e0848bb187713c9a37f000048891e498d47f0483b45107303ff55404989c748c740f8010000004889304883c410c348c7c0010000004883c410c348c7c0010000004883c410c348c7c0010000004883c410c300000000000000001002000000000000|@5874,1048575,@16962,@5873|35,0,@5824 103,0,@2708 222,0,@5827 321,0,@2708 441,0,@5827 5824:O4|@20055,@557,@5826,@5825 5825:O5|@4546,1448,0,1448,0 5826:S9|696e7374724d756c41 5827:O1|@5828 5828:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba987713c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5872,7,@16961|29,0,@5829 5829:D4,48|483b65187303ff55484c8b420848bbf87713c9a37f0000ff252b00000090909000000000000000002800000000000000|@5869,2097151,@16959,@5849|15,0,@5830 5830:O1|@5831 5831:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@5836,8191,@16936,@5832| 5832:D14,2128|483b65187303ff5548f6c301741348b8388113c9a37f0000488b5d08909090ff13498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048baf1ffffffffffff0f488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d8760ffffff4c3b45107303ff55404d89c749c740f8050000004989482049894018498950104989780849893048c70603000000498d403048c740f8020000004c89400848c7007d000000488d481848c741f80200000048c7410801000000488901488d411848c740f8020000004c894008488908488d481848c741f802000000488b500848895108488b30488931488d791848c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049b9f1ffffffffffff0f4d89084d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8da750ffffff4c3b65107303ff55404d89e749c74424f8050000004d8944242049897c24184d894c24104d895c24084d89142449c70203000000498d7c243048c747f80400000048c74718030000004c89671048c747080500000048c707170000004c8d472849c740f80200000049c7400801000000498938498d781848c747f8020000004c8967084c89074c8d471849c740f8020000004c8b4f084d8948084c8b174d89104d8d581849c743f80100000041c643ff4049c703010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049bdf1ffffffffffff0f4d892c244d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c70601000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d8750ffffff483b45107303ff55404989c748c740f8050000004c8960204c8958184c896810488970084c893049c70603000000488d503048c742f80400000048c74218030000004889421048c742081700000048c70217000000488d722848c746f80200000048c7460801000000488916488d561848c742f80200000048894208488932488d421848c740f802000000488b7208488970084c8b1a4c89184c8d601849c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049bef1ffffffffffff0f4d8975004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c706010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c70201000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d8f48ffffff4c3b4d107303ff55404d89cf49c741f8050000004d8969204d8961184d897110498979084d8911498d793048c747f8020000004c894f0848c707390000004c8d571849c742f80200000049c742080100000049893a498d7a1848c747f8020000004c894f084c89174c8d4f1849c741f8020000004c8b57084d8951084c8b274d89214d8d691849c745f80400000049c74518030000004c8b334d89751049c745080900000049c74500090000004d8d77d04c3b75107303ff55404d89f749c746f80200000049c74608010000004d892e4d8d6e1849c745f8020000004c8b59084d895d0849c74500390000004d8d5fe84c3b5d107303ff55404d89df49c743f80200000049c74308010000004d892b4d8b6908498b5500488b12f6c20174064883c2027105ff5570ebf5498b7500488916498d5788483b55107303ff55404989d748c742f8020000004c896a0848c7027d0000004c8d621849c74424f80200000049c74424080100000049891424498d54241848c742f802000000498b780848897a0848c702390000004c8d521849c742f80200000049c7420801000000498912498d521848c742f802000000488b780848897a0848c70239000000498dbf78ffffff483b7d107303ff55404989ff48c747f80200000048c7470801000000488917488d571848c742f804000000488b33488972184889721048c742080100000048c7020f0000004c8d6a2849c745f80200000049c745080100000049895500498d551848c742f8020000004889720848c7027b000000488d5a1848c743f80200000048c74308010000004889134883fb0175054d8b00eb13488b31ff30498b00ff153e0100004989c0eb05ff30488b314983f80175054d8b09eb124c89c3498b01909090ff15220100004989c14983f90174124c89cb4c89e8909090ff15120100004989c54983fd017506488b0424eb0d4c89eb488b0424ff15fe0000004883f80174114889c34889f09090ff15f20000004889c64883fe0174124889f34889f8909090ff15e20000004889c74883ff0174124889fb4c89d0909090ff15d20000004989c24983fa01750c48b8280512c9a37f0000eb134c89d348b8280512c9a37f0000ff15b20000004883f80174114889c34c89e09090ff15a60000004989c44983fc0174124c89e34c89d8909090ff15960000004989c34983fb0175084c89f04883c408c34c89db4c89f04883c408ff257d000000909090909000000000000000004808000000000000|@5838,8191,@16937,@5839,@5840,@5841,@5842,@5843,@5844,@5845,@5846,@5847,@5848,@5837|16,0,@5833 98,0,576460752303423480 412,0,576460752303423480 755,0,576460752303423480 1093,0,576460752303423480 2001,0,@5288 2016,0,@5288 5833:O4|@20055,@557,@5835,@5834 5834:O5|@4546,1415,0,1415,0 5835:S10|67656e41646453656c66 5836:S27|5838364c4f574c4556454c28292e67656e41646453656c66283129 5837:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16948| 5838:S27|5838364c4f574c4556454c28292e67656e41646453656c66283229 5839:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16938| 5840:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16939| 5841:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16940| 5842:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16941| 5843:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16942| 5844:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16943| 5845:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16944| 5846:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16945| 5847:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16946| 5848:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16947| 5849:D5,872|483b65187303ff5548a80174144889c148b8308b13c9a37f0000488b5d0890ff1348837808017415488b0848b8308b13c9a37f0000488b5d089090ff13488b0848833905755e488b51104881e29fff00004883fa0174654883fa017464488b51104881e29fff000048c7c60100000048c7c7030000004883fe2f751148b878ed0ec9a37f0000488b5d0890ff134989f84c23c24983f801751b4883c602488d7c3fffeb05e918020000483b65187303ff5548ebc240f6c6017414eb0ae96e010000e9690100004883fe017d24eb06f646ff10741c534889f348b810c506c9a37f000048bad0a8dc0000000000ff12eb044889f053ff750848b9d28813c9a37f00005148896508a80174064883f82f72154889c148b8b0df06c9a37f0000488b5d089090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4f88483b4d107303ff55404989cf48c741f801000000488901488d511048c742f8020000004889420848c70203000000488d5a1848c743f801000000488913488d531048c742f80200000048c742080100000048891a488d5a1848c743f80400000048bec08b13c9a37f00004889335e4889730848894b1048895318488063ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401801000000488958104889480848c70007000000c353415049c7c00100000048c7c39fff0000488b0424ff1536010000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba909413c9a37f0000488911488b542408488951085a4883c40848895110488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f80500000048c74020030000004889501848c74010010000004889480848c70005000000c353415049c7c00100000048c7c39fff0000488b04249090ff15aa000000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba289513c9a37f0000488911488b542408488951085a4883c40848895110488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f80500000048c74020030000004889501848c74010010000004889480848c70005000000c390909000000000000000006003000000000000|@5871,2097151,@16960,@4978,@4978|18,0,@5850 45,0,@5850 126,0,@4414 218,0,@376 228,0,I106 249,0,$5849+322 277,0,@560 295,0,@3809 346,0,@3811 471,0,@5853 612,0,@5867 760,0,@5870 5850:O4|@20055,@557,@5852,@5851 5851:O5|@4546,593,0,593,0 5852:S34|6c6f6164446573744172673a206e6f7420612073696e676c6520617267756d656e74 5853:D4,56|483b65187303ff55484c8b52184c8b4a1049c7c09fff0000488b5a08ff252e00000090909090909000000000000000003000000000000000|@5856,2097151,@16949,@5854| 5854:D4,72|483b65187303ff554848b9a08c13c9a37f0000488b142448890c245341514d89c149c7c0010000004889c34c89d052ff252b00000090909000000000000000004000000000000000|@5863,2097151,@16953,@5857|11,0,@5855 5855:O1|@5854 5856:S26|5838364c4f574c4556454c28292e676574417267283129283129 5857:D6,1136|483b65187303ff5548a801755cf60001755cf6c3017416488b480848b8909113c9a37f0000488b5d089090ff1341f6c00174064983c0027105ff5570ebf5488b4c2418488b542410488b74240848894c241848895424104889742408488b5b08488b4008e997ffffffe96a030000f6c3017416488b480848b8909113c9a37f0000488b5d089090ff13488b0b488339057560488b51084923d14883fa0174584883fa017457488b51084923d148c7c60100000048c7c7030000004883fe2f75154c8b580848b878ed0ec9a37f0000488b5d0890ff134989fb4c23da4983fb0175254883c602488d7c3fff483b65187314eb0fe957020000e9cc010000e9c7010000ff5548ebb440f6c60174084883fe017d2eeb06f646ff10742641524151ff700841504889f348b810c506c9a37f000048bad0a8dc00000000009090ff12eb0e488b50084889f041524151524150ff750848b97a8e13c9a37f00005148896508a80174064883f82f72134889c148b8b0df06c9a37f0000488b5d08ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff134889c6488b1c24488b442418909090ff15aa020000498d4fc0483b4d107303ff55404989cf48c741f8020000004889710848c70103000000488d511848c742f80100000048890a488d4a1048c741f802000000488b5c2408488959084889114883f901740c4889cb909090ff1556020000498d4fc8483b4d107303ff55404989cf48c741f80600000048bae89113c9a37f0000488911488b54243848895108488b5c243048895910488b7c241048897918488b7c24284889792048894128488061ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200100000041584883c4184c894018488948104889700848c70007000000c21800498d47c8483b45107303ff55404989c748c740f80600000048ba489213c9a37f0000488910488b54241848895008488b742410488970104c894818488b7c2408488978204c895028488060ffbf4989c2498d47d0483b45107303ff55404989c748c740f80500000048c74020010000004c8948184c8940104c89500848c70005000000c21800498d47c8483b45107303ff55404989c748c740f80600000048baa89213c9a37f0000488910488b54241848895008488b742410488970104c894818488b7c2408488978204c895028488060ffbf4989c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740189fff00004c8940104c89480848c70005000000c218004883fb01741348b8909113c9a37f0000488b5d08909090ff134c89d0ff159e0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488b54240848895008488908488b5424109090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b4c24084889480848c70001000000c218009090909000000000000000006804000000000000|@5865,2097151,@16954,@4963,@5866,@5864|29,0,@5858 121,0,@5858 198,0,@4414 296,0,@376 306,0,I106 339,0,$5857+410 367,0,@560 383,0,@3809 434,0,@3811 596,0,@5860 738,0,@5861 872,0,@5862 992,0,@5858 5858:O4|@20091,@1627,0,@5859 5859:O5|@4546,412,0,412,0 5860:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@5856,1048575,@16950| 5861:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@5856,1048575,@16951| 5862:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@5856,1048575,@16952| 5863:S23|5838364c4f574c4556454c28292e676574417267283529 5864:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@16956|28,0,@1662 5865:S33|5838364c4f574c4556454c28292e6765744172672835296e657874417267283329 5866:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16955| 5867:D3,48|483b65187303ff55484c8b4210488b5a0848bae89413c9a37f0000ff2290909000000000000000002800000000000000|@5869,1048575,@16957|19,0,@5868 5868:O1|@5849 5869:S31|5838364c4f574c4556454c28292e6c6f616444657374417267283129283129 5870:D3,48|483b65187303ff55484c8b4210488b5a0848bae89413c9a37f0000ff2290909000000000000000002800000000000000|@5869,1048575,@16958|19,0,@5868 5871:S28|5838364c4f574c4556454c28292e6c6f616444657374417267283329 5872:S27|5838364c4f574c4556454c28292e6d756c41436f6e737432283129 5873:D3,112|483b65187303ff5548a801754553ff7008488b004889da90ff1250488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@16963| 5874:S26|5838364c4f574c4556454c28292e696e7374724d756c41283229 5875:O1|@5876 5876:D3,192|483b65187303ff55484889c15053f6c1017533ff7108488b01488b5424089090ff124883f8017412f60001750d48c7c0030000004883c408eb1359483b65187303ff5548ebc848c7c0010000004883f801740c48c7c0010000004883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9a09713c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c30000000000000000b800000000000000|@5660,1048575,@16966|130,0,@5877 5877:O1|@5878 5878:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba209813c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16965|29,0,@5879 5879:D4,48|483b65187303ff554849b8307413c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16964,@5779|11,0,@5821 5880:O1|@5881 5881:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8109913c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16970|30,0,@5882 5882:O1|@5883 5883:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba909913c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16969|29,0,@5884 5884:D4,48|483b65187303ff554849b8f09913c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16968,@5779|11,0,@5885 5885:O2|5,@5886 5886:O1|@5887 5887:D3,24|488b00c39090909000000000000000001000000000000000|@5244,1,@16967| 5888:O1|@5889 5889:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e89a13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16973|30,0,@5890 5890:O1|@5891 5891:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba689b13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16972|29,0,@5892 5892:D4,48|483b65187303ff554849b8c89b13c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16971,@5779|11,0,@5893 5893:O2|3,@5886 5894:O1|@5895 5895:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8709c13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16976|30,0,@5896 5896:O1|@5897 5897:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baf09c13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16975|29,0,@5898 5898:D4,48|483b65187303ff554849b8509d13c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16974,@5779|11,0,@5899 5899:O2|1,@5886 5900:O1|@5901 5901:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f89d13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@16979|30,0,@5902 5902:O1|@5903 5903:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba789e13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@16978|29,0,@5904 5904:D4,48|483b65187303ff554849b8f09913c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@16977,@5779|11,0,@5885 5905:O1|@5906 5906:D3,328|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b858a013c9a37f0000488b5d08ff1350ff30488b014889da9090ff124883f8017551498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9d0a013c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3f600017513488b0848b8b8f309c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30b313c9a37f0000488911488b0048894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c410c300000000000000004001000000000000|@5963,1048575,@16999|35,0,@5907 103,0,@5910 159,0,@2708 199,0,@5953 5907:O4|@20055,@557,@5909,@5908 5908:O5|@4546,1338,0,1338,0 5909:S10|7368696674496e737472 5910:O1|@5911 5911:D3,112|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba78a113c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048ba78b213c9a37f000048891048894808488060ffbfc390909000000000000000006800000000000000|@5952,7,@16994|26,0,@5912 72,0,@5951 5912:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbf0a113c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5950,15,@16992|29,0,@5913 5913:D4,56|483b65187303ff55484c8b4a1049b858a213c9a37f0000488b5a08ff252f0000009090909090909000000000000000003000000000000000|@5947,2097151,@16990,@5937|15,0,@5914 5914:O1|@5915 5915:D4,48|483b65187303ff554849c7c001000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@5930,8191,@16980,@5916| 5916:D9,1064|483b65187303ff5548a8017528488b0848833903751ff64008017519488b5008488b3248833e03750c48837a08017505f6c30174144889c148b848a713c9a37f0000488b5d0890ff13488b7908483b3b744f48833f0175154c8b0b49833901752f4c8b57084d3b51087525eb3448833f03751d4c8b0b4983390375144c8b57084d3b5108750a4c8b5f104d3b5910741148b8c0a713c9a37f0000488b5d0890ff134c8b4e084c3b0d94030000742b49833901741449833903750e498379080375074983791001741148b848a813c9a37f0000488b5d0890ff134d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049bcf1ffffffffffff0f4d89234d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c70601000000498d8700ffffff483b45107303ff55404989c748c740f8050000004c8958204c8950184c8960104c8970084c892849c74500030000004c8d503049c742f80400000049c74218050000004989421049c742080f00000049c702170000004d8d5a2849c743f80200000049c74308010000004d89134d8d531849c742f802000000498942084d891a498d421848c740f8020000004d8b5a084c8958084d8b224c89204c8d681849c745f80400000049c74518030000004c8b334d89751049c745080700000049c7450009000000498d552848c742f8030000004c8942104c89720848c70267000000488d4a2048c741f80200000048bf68c911c9a37f000048897908488911498d57d0483b55107303ff55404989d748c742f80200000048894a084c892a488d4a1848c741f8020000004889510848bac0c811c9a37f0000488911498d57d0483b55107303ff55404989d748c742f802000000488b780848897a0848c702390000004c8d6a1849c745f80200000049c7450801000000498955004983f801754c498d57c0483b55107303ff55404989d748c742f80400000048c74218030000004c89721048c742080900000048c702090000004c8d422849c740f80200000049c7400801000000498910eb0749c7c0010000004983f801750c48bad0a813c9a37f0000eb1e51ff304c89c348b8d0a813c9a37f0000909090ff15ae0000004889c2eb0351ff304883fa017506488b0424eb104889d3488b0424909090ff15920000004883f801750c48b810a913c9a37f0000eb164889c348b810a913c9a37f0000909090ff15720000004883f80174114889c34c89e89090ff15660000004989c54983fd0175064883c40858c34c89eb4883c40858ff25510000009000000000000000002004000000000000|@5932,8191,@16981,@833,@5933,@5934,@5935,@5936,@5931|58,0,@5917 146,0,@5920 202,0,@5923 284,0,576460752303423480 652,0,@5204 716,0,@5197 887,0,@5926 905,0,@5926 966,0,@5928 981,0,@5928 5917:O4|@20055,@557,@5919,@5918 5918:O5|@4546,1327,0,1327,0 5919:S11|67656e5661725368696674 5920:O4|@20055,@557,@5922,@5921 5921:O5|@4546,1306,0,1306,0 5922:S27|67656e56617253686966743a20646966666572656e742072656773 5923:O4|@20055,@557,@5925,@5924 5924:O5|@4546,1307,0,1307,0 5925:S29|67656e56617253686966743a207368696674206e6f7420696e20656378 5926:O2|@5927,0 5927:O4|4,2,@833,127 5928:O2|@5929,0 5929:O3|37,@833,127 5930:S31|5838364c4f574c4556454c28292e67656e5661725368696674283129283129 5931:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16986| 5932:S28|5838364c4f574c4556454c28292e67656e5661725368696674283329 5933:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16982| 5934:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16983| 5935:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16984| 5936:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@16985| 5937:D3,720|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b820af13c9a37f0000488b5d08ff13488b1048833a05755e488b72104881e69fff00004883fe0174654883fe017464488b5a104881e39fff000048c7c60100000048c7c7030000004883fe2f751148b878ed0ec9a37f0000488b5d0890ff134989f94c23cb4983f901751b4883c602488d7c3fffeb05e9ac010000483b65187303ff5548ebc240f6c6017414eb0ae922010000e91d0100004883fe017d28eb06f646ff10742041504889f348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb054889f04150ff750848b962ad13c9a37f00005148896508a80174064883f82f72144889c148b8b0df06c9a37f0000488b5d0890ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe0483b4d107303ff55404989cf48c741f80300000048baa8af13c9a37f00004889115a4889510848894110488061ffbf4889c2498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c7401801000000488948104889500848c70007000000c3498d77d8483b75107303ff55404989f748c746f80400000048bf08b113c9a37f000048893e48895e084c8946104c894e18488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889700848c70005000000c3498d77d8483b75107303ff55404989f748c746f80400000048bfb0b113c9a37f000048893e48895e084c8946104c894e18488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010010000004889700848c70005000000c390909090900000000000000000c802000000000000|@5949,2097151,@16991|35,0,@5938 114,0,@4414 207,0,@376 217,0,I106 242,0,$5937+314 270,0,@560 287,0,@3809 338,0,@3811 387,0,@5941 497,0,@5945 611,0,@5948 5938:O4|@20055,@557,@5940,@5939 5939:O5|@4546,1243,0,1243,0 5940:S28|6c6f6164526573756c744172673a2062616420617267756d656e7473 5941:D3,216|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a10488908488d581048c743f80200000048894b0848c70303000000488d731848c746f80200000048bfa8b013c9a37f000048897e0848891e498d5fd8483b5d107303ff55404989df48c743f80100000048890b4889c7488d431048c740f8020000004889580848893057488b4a084889ca909090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390900000000000000000d000000000000000|@5944,1048575,@16987|77,0,@5942 5942:O2|@5943,0 5943:O2|1,@833 5944:S28|5838364c4f574c4556454c28292e66696e6973686564283129283129 5945:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba68b113c9a37f0000ff229090909090909000000000000000003000000000000000|@5947,1048575,@16988|23,0,@5946 5946:O1|@5937 5947:S36|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283129283129283129 5948:D3,56|483b65187303ff55484c8b4a184c8b4210488b5a0848ba68b113c9a37f0000ff229090909090909000000000000000003000000000000000|@5947,1048575,@16989|23,0,@5946 5949:S30|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283429 5950:S33|5838364c4f574c4556454c28292e6c6f6164526573756c74417267283129283129 5951:D4,80|483b65187303ff5548488b5208488b0c244889142449c7c20300000049c7c10300000049c7c00500000048bbf86012c9a37f000051ff252d000000909090909000000000000000004800000000000000|@4952,2097151,@16993,@4949|44,0,@5452 5952:S33|5838364c4f574c4556454c28292e7661726961626c655368696674283129283129 5953:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bbd0b313c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bb20bc13c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@16998|26,0,@5954 79,0,@5961 5954:D4,48|483b65187303ff55484c8b420848c7c301000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@16995,@5955| 5955:D3,1768|483b65187303ff55484983f801750848c7c001000000c34883fb037565f64008017416488b480848b840bb13c9a37f0000488b5d089090ff13488b4008498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b104889511048c741080700000048c701090000004983f87f760e48c7c37f000000eb08e9890000004c89c351524889d848ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000498d4fa8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70165000000488d412848c740f80200000048c74008010000004889084889c1488d401848c740f8020000004889480859488908c34883fb05756df64008017415488b480848b840bb13c9a37f0000488b5d0890ff13488b40084983f87f7659498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411003000000488b004889410848c7014b000000498d47e8483b45107303ff55404989c748c740f802000000eb05e9d000000048c7400801000000488908c3498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b104889511048c741080700000048c7010900000052514c89c048ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411805000000488b542408488951104889410848c70165000000488d412848c740f80200000048c74008010000004889084889c1488d401848c740f80200000048894808594883c408488908c3f64008017417488b480848b840bb13c9a37f0000488b5d08909090ff13488b40084983f87f7652498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411003000000488b004889410848c7014b000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c34983f8077569498d4fa0483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000488d591848c743f8050000004889532048c74318f3ffffff48894b1048c743080100000048c7033d000000488d433048c740f80200000048c7400801000000488918c34983f8057569498d4fa0483b4d107303ff55404989cf48c741f802000000488b104889510848c70105000000488d591848c743f8050000004889532048c74318fbffffff48894b1048c743080100000048c7033d000000488d433048c740f80200000048c7400801000000488918c34983f8037572498d4f90483b4d107303ff55404989cf48c741f801000000488b10488911488d591048c743f8020000004889530848c70301000000488d731848c746f8050000004889562048c74618ffffffff48895e1048894e0848c7063d000000488d463048c740f80200000048c7400801000000eb05e904000000488930c34983f841736448c7c1030000004c89c24150ff304883fa7f73554889c84889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901f6c20174084883fa017d32eb06f642ff10742a504889d348b810c506c9a37f0000eb0ae935010000e92c00000048bad0a8dc00000000009090ff12eb074889c14889d0514889c35848ba50a9dc0000000000909090ff12eb335248bb10c506c9a37f00004889c848ba50a9dc0000000000ff12594883e97e4889ca4889c1483b65187303ff5548e941ffffffa80174064883e8027105ff5570ebf5498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b04244889411048c741080900000048c7010900000051488b44241048ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b542408488951104889410848c70165000000488d412848c740f80200000048c74008010000004889084889c1488d401848c740f80200000048894808594883c410488908c3498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b104889511048c741080700000048c7010900000052514c89c048ba10a5dc0000000000909090ff1248ba90a4dc0000000000ff124881e0ff010000498d8f68ffffff483b4d107303ff55404989cf48c741f80400000048c7411801000000488b542408488951104889410848c70165000000488d412848c740f80400000048c74018030000004889501048c740080900000048c70009000000488d502848c742f80200000048c7420801000000488902488d421848c740f802000000488950084889084889c1488d401848c740f80200000048894808594883c408488908c39090900000000000000000e006000000000000|@5960,2097151,@16996|41,0,@5956 145,0,I91 160,0,I89 290,0,@5956 465,0,I91 480,0,I89 612,0,@5956 1168,0,@376 1190,0,I106 1217,0,I108 1235,0,@376 1248,0,I108 1357,0,I91 1372,0,I89 1553,0,I91 1568,0,I89 5956:O4|@20055,@557,@5958,@5957 5957:O5|@4546,1298,0,1298,0 5958:S13|67656e436f6e73745368696674 5959:S33|5838364c4f574c4556454c28292e67656e436f6e73745368696674283129283129 5960:S30|5838364c4f574c4556454c28292e67656e436f6e73745368696674283329 5961:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@16997,@5849| 5962:S33|5838364c4f574c4556454c28292e636f6e7374616e745368696674283129283129 5963:S30|5838364c4f574c4556454c28292e696e7374725570736869667457283129 5964:O1|@5965 5965:D3,328|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b858a013c9a37f0000488b5d08ff1350ff30488b014889da9090ff124883f8017551498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b960be13c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3f600017513488b0848b8b8f309c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048bad8c013c9a37f0000488911488b0048894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c410c300000000000000004001000000000000|@5976,1048575,@17008|35,0,@5907 103,0,@5966 159,0,@2708 199,0,@5973 5966:O1|@5967 5967:D3,112|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba08bf13c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048ba58c013c9a37f000048891048894808488060ffbfc390909000000000000000006800000000000000|@5952,7,@17004|26,0,@5968 72,0,@5972 5968:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb80bf13c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5950,15,@17002|29,0,@5969 5969:D4,56|483b65187303ff55484c8b4a1049b8e8bf13c9a37f0000488b5a08ff252f0000009090909090909000000000000000003000000000000000|@5947,2097151,@17001,@5937|15,0,@5970 5970:O1|@5971 5971:D4,48|483b65187303ff554849c7c005000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@5930,8191,@17000,@5916| 5972:D4,80|483b65187303ff5548488b5208488b0c244889142449c7c20300000049c7c10300000049c7c00500000048bbf86012c9a37f000051ff252d000000909090909000000000000000004800000000000000|@4952,2097151,@17003,@4949|44,0,@5452 5973:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bb78c113c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bbd8c113c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@17007|26,0,@5974 79,0,@5975 5974:D4,48|483b65187303ff55484c8b420848c7c305000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@17005,@5955| 5975:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17006,@5849| 5976:S32|5838364c4f574c4556454c28292e696e737472446f776e736869667457283129 5977:O1|@5978 5978:D3,328|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b858a013c9a37f0000488b5d08ff1350ff30488b014889da9090ff124883f8017551498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b9e0c313c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3f600017513488b0848b8b8f309c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba58c613c9a37f0000488911488b0048894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c410c300000000000000004001000000000000|@5989,1048575,@17017|35,0,@5907 103,0,@5979 159,0,@2708 199,0,@5986 5979:O1|@5980 5980:D3,112|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba88c413c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048bad8c513c9a37f000048891048894808488060ffbfc390909000000000000000006800000000000000|@5952,7,@17013|26,0,@5981 72,0,@5985 5981:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb00c513c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5950,15,@17011|29,0,@5982 5982:D4,56|483b65187303ff55484c8b4a1049b868c513c9a37f0000488b5a08ff252f0000009090909090909000000000000000003000000000000000|@5947,2097151,@17010,@5937|15,0,@5983 5983:O1|@5984 5984:D4,48|483b65187303ff554849c7c003000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@5930,8191,@17009,@5916| 5985:D4,80|483b65187303ff5548488b5208488b0c244889142449c7c20300000049c7c10300000049c7c00500000048bbf86012c9a37f000051ff252d000000909090909000000000000000004800000000000000|@4952,2097151,@17012,@4949|44,0,@5452 5986:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bbf8c613c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bb58c713c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@17016|26,0,@5987 79,0,@5988 5987:D4,48|483b65187303ff55484c8b420848c7c303000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@17014,@5955| 5988:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17015,@5849| 5989:S37|5838364c4f574c4556454c28292e696e737472446f776e7368696674417269746857283129 5990:O1|@5991 5991:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b878c813c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17020|30,0,@5992 5992:O1|@5993 5993:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baf8c813c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@17019|29,0,@5994 5994:D4,48|483b65187303ff554849b8f09913c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@17018,@5779|11,0,@5885 5995:O1|@5996 5996:D4,616|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b800cc13c9a37f0000488b5d08ff13ff30ff31509090ff1542020000a8017564f64008017563488b48084883790801755df60101755d488b11498d5fe8483b5d107303ff55404989df48c743f80200000048be78cc13c9a37f0000488933488b3248897308488063ffbf498d7fe8483b7d107303ff55404989ff48c747f802000000eb14e958010000e94d000000e948000000e94300000048c74708010000004c8b4424104c89074d8d47d84c3b45107303ff55404d89c749c740f80200000049897808498918498d401848c740f8010000004c89004883c418c3f64008017566488b480848837908017560f600017560488b10498d5fe8483b5d107303ff55404989df48c743f80200000048bed0cd13c9a37f0000488933488b3248897308488063ffbf498d7fe8483b7d107303ff55404989ff48c747f80200000048c7470801000000eb0fe945000000e940000000e93b0000004c8b4424084c89074d8d47d84c3b45107303ff55404d89c749c740f80200000049897808498918498d401848c740f8010000004c89004883c418c3498d47e8483b45107303ff55404989c748c740f802000000488b0c244889480848b928cf13c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c418c3498d47e8483b45107303ff55404989c748c740f802000000488b0c244889480848b958da13c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c418c3909090909000000000000000006002000000000000|@6054,1048575,@17040,@6053|35,0,@5997 117,0,@6000 304,0,@6003 469,0,@6006 549,0,@6049 5997:O4|@20055,@557,@5999,@5998 5998:O5|@4546,1432,0,1432,0 5999:S9|696e7374724d756c57 6000:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bb18cd13c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bb78cd13c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@17023|26,0,@6001 79,0,@6002 6001:D4,48|483b65187303ff55484c8b420848c7c301000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@17021,@5955| 6002:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17022,@5849| 6003:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bb70ce13c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bbd0ce13c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@17026|26,0,@6004 79,0,@6005 6004:D4,48|483b65187303ff55484c8b420848c7c301000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@17024,@5955| 6005:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17025,@5849| 6006:O1|@6007 6007:D3,32|48b880cf13c9a37f0000c3909090909000000000000000001800000000000000|@6048,1,@17037|2,0,@6008 6008:O1|@6009 6009:D4,48|483b65187303ff554848bbf0cf13c9a37f0000ff252f0000009090909090909000000000000000002800000000000000|@6043,63,@17035,@6023|11,0,@6010 6010:O1|@6011 6011:D3,32|48b848d013c9a37f0000c3909090909000000000000000001800000000000000|@6022,1,@17027|2,0,@6012 6012:O2|@6014,@6013 6013:O2|@6016,@6015 6014:O2|36,@3805 6015:O2|@6018,@6017 6016:O4|4,0,@3900,1 6017:O2|@6020,@6019 6018:O3|25,@3805,3 6019:O2|@6021,0 6020:O4|50,1,@3805,2 6021:O4|4,4,@3900,1 6022:S36|5838364c4f574c4556454c28292e67656e4d756c7469706c79556e7369676e6564283129 6023:D3,472|a8017555f64008017554488b480848837908017563488b1048833a05755f488b72104883e6034883fe0174564883fe017455498d77e8483b75107303ff55404989f748c746f80200000048bfa8d313c9a37f000048893eeb0ae9d0000000e9cb00000048895e08488066ffbf498d47d0483b45107319eb14e9b1000000e9ac000000e93d000000e938000000ff55404989c748c740f80500000048c740200300000048c74018010000004889701048b9902b07c9a37f00004889480848c70007000000c3498d77e8483b75107303ff55404989f748c746f80200000048bfb0d813c9a37f000048893e48895e08488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740180300000048c74010010000004889700848c70005000000c3a8017511f6400801750b488b40084883780801741248b848d913c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048b9a0d913c9a37f000048890848895808488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740180300000048c74010010000004889480848c70005000000c39090909090900000000000000000d001000000000000|@6047,63,@17036|76,0,@6024 176,0,@884 222,0,@6041 325,0,@6044 367,0,@6046 6024:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@6035,63,@17031,@6025| 6025:D3,472|a8017555f64008017554488b480848837908017563488b1148833a05755f488b72104883e6094883fe0174564883fe017455498d77e8483b75107303ff55404989f748c746f80200000048bf00d613c9a37f000048893eeb0ae9d0000000e9cb00000048895e08488066ffbf498d47d0483b45107319eb14e9b1000000e9ac000000e93d000000e938000000ff55404989c748c740f80500000048c740200300000048c74018030000004889701048bbe88b0cc9a37f00004889580848c70007000000c3498d77e8483b75107303ff55404989f748c746f80200000048bf10d713c9a37f000048893e48895e08488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740180900000048c74010030000004889700848c70005000000c3a8017511f6400801750b488b40084883780801741248b8a8d713c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048b928d813c9a37f000048890848895808488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740180900000048c74010030000004889480848c70005000000c39090909090900000000000000000d001000000000000|@6040,63,@17032|76,0,@6026 176,0,@3805 222,0,@6033 325,0,@6036 367,0,@6039 6026:D3,96|483b65187303ff554848b888d613c9a37f0000488b520890ff124889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048b9a0d613c9a37f00004889480848c70001000000c39000000000000000005800000000000000|@5944,1048575,@17028|11,0,@6027 59,0,@6028 6027:O2|@6029,@6028 6028:O1|@3900 6029:O2|@6031,@6030 6030:O2|@6032,0 6031:O2|1,@3900 6032:O2|1,@3805 6033:D3,48|483b65187303ff5548488b5a0848ba68d713c9a37f0000ff229090909090909000000000000000002800000000000000|@6035,1048575,@17029|15,0,@6034 6034:O1|@6025 6035:S28|5838364c4f574c4556454c28292e6c6f616441726732283129283129 6036:O4|@20055,@557,@6038,@6037 6037:O5|@4546,1376,0,1376,0 6038:S23|6c6f6164417267313a2062616420617267756d656e7473 6039:D3,48|483b65187303ff5548488b5a0848ba68d713c9a37f0000ff229090909090909000000000000000002800000000000000|@6035,1048575,@17030|15,0,@6034 6040:S25|5838364c4f574c4556454c28292e6c6f616441726732283229 6041:D3,48|483b65187303ff5548488b5a0848ba08d913c9a37f0000ff229090909090909000000000000000002800000000000000|@6043,1048575,@17033|15,0,@6042 6042:O1|@6023 6043:S28|5838364c4f574c4556454c28292e6c6f616441726731283129283129 6044:O4|@20055,@557,@6038,@6045 6045:O5|@4546,1365,0,1365,0 6046:D3,48|483b65187303ff5548488b5a0848ba08d913c9a37f0000ff229090909090909000000000000000002800000000000000|@6043,1048575,@17034|15,0,@6042 6047:S25|5838364c4f574c4556454c28292e6c6f616441726731283229 6048:S29|5838364c4f574c4556454c28292e696e7374724d756c57283229283129 6049:O1|@6050 6050:D3,32|48b8b0da13c9a37f0000c3909090909000000000000000001800000000000000|@6048,1,@17039|2,0,@6051 6051:O1|@6052 6052:D4,48|483b65187303ff554848bbf0cf13c9a37f0000ff252f0000009090909090909000000000000000002800000000000000|@6043,63,@17038,@6023|11,0,@6010 6053:D3,272|483b65187303ff5548a801756553ff7008488b004889da90ff12a8017559f600017516488b0848b8b8f309c9a37f0000488b5d08909090ff1348833801750948c7c001000000eb62488b0048c7c1010000004883f8037529498d47f0483b45107303ff55404989c748c740f801000000eb0ae97f000000e938000000488908eb3a4889c24883e2034883fa03750948c7c001000000eb2448d1e84883c8014883c102483b6518730aeb05e90c000000ff5548eb9e48c7c00100000050488b5c2410488b442408909090e832ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000000801000000000000|@1363,1048575,@17041|40,0,@2708 6054:S26|5838364c4f574c4556454c28292e696e7374724d756c57283229 6055:O1|@6056 6056:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b818dd13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17044|30,0,@6057 6057:O1|@6058 6058:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba98dd13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@17043|29,0,@6059 6059:D4,48|483b65187303ff554849b8f8dd13c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@17042,@5779|11,0,@6060 6060:O2|0,@5886 6061:O1|@6062 6062:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a0de13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17047|30,0,@6063 6063:O1|@6064 6064:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba20df13c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5815,7,@17046|29,0,@6065 6065:D4,48|483b65187303ff554849b880df13c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5782,2097151,@17045,@5779|11,0,@6066 6066:O2|4,@5886 6067:O1|@6068 6068:D3,456|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b898e113c9a37f0000488b5d08ff1350ff30488b014889da9090ff12a8017557f600017516488b0848b8b8f309c9a37f0000488b5d08909090ff1348833801750948c7c001000000eb65488b0048c7c1010000004883f8037522498d47f0483b45107303ff55404989c748c740f801000000488908eb38e92c0000004889c24883e2034883fa03750948c7c001000000eb1d48d1e84883c8014883c102483b65187303ff5548ebac48c7c0010000004883f8017551498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b910e213c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3498d4fe8483b4d107303ff55404989cf48c741f80200000048ba08f013c9a37f0000488911488b0048894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c410c390909090900000000000000000c001000000000000|@5660,1048575,@17066|35,0,@6069 76,0,@2708 250,0,@6072 322,0,@6114 6069:O4|@20055,@557,@6071,@6070 6070:O5|@4546,1516,0,1516,0 6071:S11|636865636b506f77657232 6072:O1|@6073 6073:D3,32|48b868e213c9a37f0000c3909090909000000000000000001800000000000000|@6113,1,@17062|2,0,@6074 6074:O1|@6075 6075:D3,32|48b8c0e213c9a37f0000c3909090909000000000000000001800000000000000|@6112,1,@17061|2,0,@6076 6076:O3|1,4,@6077 6077:O1|@6078 6078:D3,32|48b838e313c9a37f0000c3909090909000000000000000001800000000000000|@6111,1,@17060|2,0,@6079 6079:O1|@6080 6080:D4,88|483b65187303ff554848b9d0e313c9a37f0000488b142448890c2449c7c20100000049c7c10300000049c7c00300000048bb48ef13c9a37f000052ff252f0000009090909090909000000000000000005000000000000000|@4952,2097151,@17059,@4949|11,0,@6081 50,0,@6110 6081:O1|@6082 6082:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba50e413c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17058|29,0,@6083 6083:D4,80|483b65187303ff554848b9d0e413c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17057,@4949|11,0,@6084 6084:O1|@6085 6085:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba50e513c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17056|29,0,@6086 6086:D5,112|483b65187303ff5548488b4208488b5808488b084889c890ff156a0000005349c7c0030000009090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006800000000000000|@4942,8191,@17048,@6103,@6087| 6087:D10,944|483b65187303ff5548a801751af64008017514488b4808488b1148833a037507488379080174164889c148b808ea13c9a37f0000488b5d08909090ff13498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d9f60ffffff4c3b5d107303ff55404d89df49c743f8050000004989732049895b1849897b104d8953084d890b49c70103000000498d5b3048c743f80400000048c74318050000004c895b1048c743081300000048c70317000000488d732848c746f80200000048c746080100000048891e488d5e1848c743f8020000004c895b08488933488d731848c746f802000000488b7b0848897e084c8b0b4c890e4c8b52084c3b1529020000743d49833a01741449833a03750e49837a0801750749837a100174234c3b150e020000741a49833a01742749833a03752149837a0805751a49837a1001751348b880ea13c9a37f0000488b5d08909090ff134983f801750c49b8d8ea13c9a37f0000eb0a49b830eb13c9a37f00004d8d5fa04c3b5d107303ff55404d89df49c743f80400000049c74318030000004d89531049c743080100000049c703090000004d8d632849c74424f80300000049c7442410010000004d8954240849c70424330000004d8d6c242049c745f80200000049be80eb13c9a37f00004d8975084d8965004d8da778ffffff4c3b65107303ff55404d89e749c74424f8020000004d896c24084d891c244d8d5c241849c743f8020000004c8b6e084d896b0849c703390000004d8d731849c746f80200000049c74608010000004d891e4d8d5e1849c743f80400000049c74318030000004d89531049c743080900000049c70309000000498d432848c740f80200000048c74008010000004c89184883f8017505488b06eb0f4889c3488b06909090ff15a60000004883f801750c48b8c0eb13c9a37f0000eb164889c348b8c0eb13c9a37f0000909090ff15860000004883f80174114889c34c89f09090ff157a0000004989c64983fe0174124c89f34c89e0909090ff156a0000004989c44983fc0175044c89c0c34c89e34c89c0ff2559000000900000000000000000a803000000000000|@6105,8191,@17050,@884,@3805,@6106,@6107,@6108,@6109,@6104|44,0,@6088 126,0,576460752303423480 480,0,@6091 505,0,@6093 517,0,@6096 626,0,@6099 826,0,@6101 841,0,@6101 6088:O4|@20055,@557,@6090,@6089 6089:O5|@4546,1497,0,1497,0 6090:S9|67656e4469764d6f64 6091:O4|@20055,@557,@6090,@6092 6092:O5|@4546,1476,0,1476,0 6093:O2|@5443,@6094 6094:O2|@6095,0 6095:O4|4,0,@3805,1 6096:O2|@6014,@6097 6097:O2|@6098,0 6098:O3|59,@3900,@3900 6099:O2|@6100,@6019 6100:O4|7,5,@3805,@3805 6101:O2|@6102,0 6102:O2|10,104 6103:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17049|28,0,@1662 6104:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17055| 6105:S26|5838364c4f574c4556454c28292e67656e4469764d6f64283329 6106:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17051| 6107:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17052| 6108:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17053| 6109:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17054| 6110:O2|@585,@6028 6111:S38|5838364c4f574c4556454c28292e676574576f726b696e675265676973746572283429283129 6112:S41|5838364c4f574c4556454c28292e676574576f726b696e675265676973746572283129283129283129 6113:S30|5838364c4f574c4556454c28292e6469764d6f64436f6465283129283129 6114:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048bba8f013c9a37f0000488919488b520848895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bb08f113c9a37f00004889184889480848895010488060ffbfc300000000000000007000000000000000|@5962,15,@17065|26,0,@6115 79,0,@6116 6115:D4,48|483b65187303ff55484c8b420848c7c305000000ff252e00000090909090909000000000000000002800000000000000|@5959,2097151,@17063,@5955| 6116:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17064,@5849| 6117:O1|@6118 6118:D3,456|483b65187303ff5548a8017511f6400801750b488b4808488379080174134889c148b898e113c9a37f0000488b5d08ff1350ff30488b014889da9090ff12a8017557f600017516488b0848b8b8f309c9a37f0000488b5d08909090ff1348833801750948c7c001000000eb65488b0048c7c1010000004883f8037522498d47f0483b45107303ff55404989c748c740f801000000488908eb38e92c0000004889c24883e2034883fa03750948c7c001000000eb1d48d1e84883c8014883c102483b65187303ff5548ebac48c7c0010000004883f8017551498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848b960f313c9a37f00004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3498d4fe8483b4d107303ff55404989cf48c741f80200000048ba18f813c9a37f0000488911488b0048894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b1424488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c410c390909090900000000000000000c001000000000000|@5660,1048575,@17080|35,0,@6069 76,0,@2708 250,0,@6119 322,0,@6137 6119:O1|@6120 6120:D3,32|48b8b8f313c9a37f0000c3909090909000000000000000001800000000000000|@6113,1,@17075|2,0,@6121 6121:O1|@6122 6122:D3,32|48b810f413c9a37f0000c3909090909000000000000000001800000000000000|@6112,1,@17074|2,0,@6123 6123:O3|1,4,@6124 6124:O1|@6125 6125:D3,32|48b888f413c9a37f0000c3909090909000000000000000001800000000000000|@6111,1,@17073|2,0,@6126 6126:O1|@6127 6127:D4,88|483b65187303ff554848b920f513c9a37f0000488b142448890c2449c7c20100000049c7c10300000049c7c00300000048bbf0f713c9a37f000052ff252f0000009090909090909000000000000000005000000000000000|@4952,2097151,@17072,@4949|11,0,@6128 50,0,@6135 6128:O1|@6129 6129:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa0f513c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17071|29,0,@6130 6130:D4,80|483b65187303ff554848b920f613c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17070,@4949|11,0,@6131 6131:O1|@6132 6132:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa0f613c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17069|29,0,@6133 6133:D5,112|483b65187303ff5548488b4208488b5808488b084889c890ff156a0000005349c7c0010000009090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006800000000000000|@4942,8191,@17067,@6134,@6087| 6134:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17068|28,0,@1662 6135:O2|@585,@6136 6136:O1|@3805 6137:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@6145,15,@17078,@6138| 6138:D3,120|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba10f913c9a37f000048891148895908488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f80300000048bb58fb13c9a37f00004889184889480848895010488060ffbfc39090909000000000000000007000000000000000|@6146,15,@17079|26,0,@6139 75,0,@6144 6139:D3,376|483b65187303ff5548f64008017416488b480848b8b0fa13c9a37f0000488b5d089090ff13488b400848837a087f760848c7c001000000c3488b52084883c20248c7c103000000ff304883fa7f735d4889c84889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901f6c20174084883fa017d2aeb06f642ff107422504889d348b810c506c9a37f000048bad0a8dc000000000090ff12eb0ce91b0000004889c14889d0514889c35848ba50a9dc00000000009090ff12eb335248bb10c506c9a37f00004889c848ba50a9dc0000000000ff12594883e97e4889ca4889c1483b65187303ff5548e94affffffa80174064883e8027105ff5570ebf5498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584889411048c741080300000048c70109000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c390909090909000000000000000007001000000000000|@6143,2097151,@17076|21,0,@6140 149,0,@376 159,0,I106 190,0,I108 207,0,@376 220,0,I108 6140:O4|@20055,@557,@6142,@6141 6141:O5|@4546,1461,0,1461,0 6142:S7|67656e4d61736b 6143:S35|5838364c4f574c4556454c28292e6d61736b4269747328322967656e4d61736b283129 6144:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@5869,2097151,@17077,@5849| 6145:S28|5838364c4f574c4556454c28292e6d61736b42697473283129283129 6146:S25|5838364c4f574c4556454c28292e6d61736b42697473283229 6147:O1|@6148 6148:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a0fc13c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17097|30,0,@6149 6149:O1|@6150 6150:D3,168|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba80fd13c9a37f000048891148894108488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bbc00914c9a37f000048891a4889420848894a10488062ffbf4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbd80a14c9a37f00004889184889480848895010488060ffbfc390900000000000000000a000000000000000|@6179,15,@17096|26,0,@6151 72,0,@6168 125,0,@6171 6151:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbf8fd13c9a37f0000488918488b52084889500848894810488060ffbfc390909090909000000000000000004800000000000000|@6167,15,@17088|29,0,@6152 6152:D6,240|483b65187303ff5548488b42104883780801756eff304c8b042448c7c39fff0000488b4208909090ff15da000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba28ff13c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f8030000004889481048895008eb05e90800000048c70003000000c3488b5808488b084889c8909090ff156e0000005349c7c0010000009090ff15660000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390900000000000000000e800000000000000|@6166,2097151,@17086,@4978,@6165,@6155|72,0,@6153 6153:D3,88|498d4fd0483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80300000048bba8ff13c9a37f000048891848894808488b520848895010488060ffbfc3909000000000000000005000000000000000|@5656,15,@17085|41,0,@6154 6154:D5,120|483b65187303ff55484889d3488b4310ff157a0000005349c7c001000000488b4b084889cb909090ff156a000000488b0c244889c2498d47e0483b45107303ff55404989c748c740f80300000048895010488b49084883c4084889480848c70001000000c390909000000000000000007000000000000000|@4942,2097151,@17081,@6162,@6155| 6155:D4,1488|483b65187303ff5548a80174144889c148b8580614c9a37f0000488b5d0890ff13488b08488339037559f64008017415488b500848b8580614c9a37f0000488b5d0890ff13488b5008488b3248833e05755448837a08017552f6c30175524983f8037567f6460801751348b8b8f309c9a37f0000488b5d08909090ff13488b7e08eb05e9b404000040f6c70174084883ff017d40eb06f647ff107438ff33ff71084889fbeb0fe9c0000000e9bb000000e9b600000048b810c506c9a37f000048bad0a8dc0000000000eb05e99b000000ff12eb084889f8ff33ff710848c7c31100000048ba50a9dc0000000000909090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f000048894110584889410848c70101000000498d47c8483b45107303ff55404989c748c740f80300000048894810594889480848c700450000004889c1488d402048c740f80200000048c7400801000000488908c348833e05755e48837a0801755cf6c301755c4983f801755b498d7fe0483b7d107303ff55404989ff48c747f8030000004c8b034c8947104c89470848c70777000000f6460801751248b8b8f309c9a37f0000488b5d089090ff134c8b4e0841f6c101eb14e9eb000000e9e6000000e9e1000000e9dc00000074084983f9017d2deb0741f641ff107424ff71085741504c89cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb094c89c8ff7108574150498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8e86f0cc9a37f000048894110488b4424104889410848c70101000000498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c7003f000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908c348833e03756248837a08017560f6c30175604983f803755f498d7f88483b7d107303ff55404989ff48c747f8020000004c8b46084c89470848c707050000004c8d4f1849c741f80400000049c74118f9ffffff49897910488b79084989790849c70101000000eb14e945000000e940000000e93b000000e9360000004d8d512849c742f8030000004d894a10488b1b49895a0849c70245000000498d422048c740f80200000048c74008010000004c8910c348833e03751248837a0801750bf6c30175064983f801741048b8580614c9a37f0000488b5d08ff13488b7e08483b3b746348833f0175154c8b0349833801752f4c8b4f084d3b48087525eb6648833f03751d4c8b034983380375144c8b4f084d3b4808750a4c8b57104d3b501074434d8d47d04c3b45107303ff55404d89c749c740f8020000004989780849c70049000000eb05e9190000004d8d481849c741f80200000049c74108010000004d8901eb0749c7c1010000004d8d8710ffffff4c3b45107303ff55404d89c749c740f8030000004c8b134d8950104d89500849c700770000004d8d582049c743f80200000049897b0849c703010000004d8d631849c74424f80400000049c7442418010000004d895c24104c8b59084d895c240849c70424010000004d8d6c242849c745f8030000004d8965104d89550849c745003f0000004d8d652049c74424f80400000049c74424180500000049897c241049c74424080300000049c70424650000004d8d74242849c746f80200000049c74608010000004d89264d8d661849c74424f8020000004d897424084d892c244d8d6c241849c745f8020000004d8965084d8945004983fd0175044c89c8c34c89eb4c89c8ff25ac000000488339057417488b500848b8580614c9a37f0000488b5d08909090ff13f64008017519488b5008488b3248833e05750c48837a08017505f6c3017415488b500848b8580614c9a37f0000488b5d0890ff13f64608017416f6460801751048b8b8f309c9a37f0000488b5d08ff1348b8d00614c9a37f0000488b5d08ff13909090909090900000000000000000c805000000000000|@6164,2097151,@17083,@6163|18,0,@6156 54,0,@6156 108,0,@2708 183,0,@376 193,0,I106 229,0,I108 272,0,@3659 437,0,@2708 511,0,@376 521,0,I106 575,0,@3659 907,0,@6156 1352,0,@6156 1406,0,@6156 1435,0,@2708 1451,0,@6159 6156:O4|@20055,@557,@6158,@6157 6157:O5|@4546,726,0,726,0 6158:S12|67656e4c6f6164496e737472 6159:O4|@20055,@557,@6161,@6160 6160:O5|@4546,690,0,690,0 6161:S21|67656e4c6f6164576f72643a206e6f74207a65726f 6162:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17082|28,0,@1662 6163:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17084| 6164:S29|5838364c4f574c4556454c28292e67656e4c6f6164496e737472283329 6165:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17087|28,0,@1662 6166:S40|5838364c4f574c4556454c28292e676574526573756c745265676973746572283129283129283129 6167:S37|5838364c4f574c4556454c28292e676574526573756c745265676973746572283129283129 6168:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb400a14c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@6170,15,@17090|29,0,@6169 6169:D4,48|483b65187303ff55484c8b4a184c8b4210488b5a08ff252d000000909090909000000000000000002800000000000000|@4975,2097151,@17089,@4972| 6170:S35|5838364c4f574c4556454c28292e6c6f61644261736541646472657373283129283129 6171:D4,56|483b65187303ff55484c8b521049c7c1010000004c8b420848bbf86012c9a37f0000ff252800000000000000000000003000000000000000|@6175,2097151,@17094,@6172|26,0,@5452 6172:D7,1664|483b65187303ff5548a801755ef6400801755d488b4808488b1148833a057555488b72104881e69fff00004883fe0174654883fe017464488b72104881e69fff0000ff334152ff73084c89c34c8b4424104889df4889f34889f89090ff153606000048c7c101000000eb0fe984050000e94f040000e94a04000048c7c2030000004883f92f75224889c348b878ed0ec9a37f0000eb0ae9bf010000e9ba010000488b5d08909090ff134889d34823d84883fb0175144883c102488d5412ff483b65187303ff5548ebb8f6c10174084883f9017d24eb06f641ff10741c4889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb034889c8ff750848b98a0c14c9a37f00005148896508a80174064883f82f72164889c148b8b0df06c9a37f0000488b5d08909090ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff1348833c2401751d498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb04488b0c24498d57e8483b55107303ff55404989d748c742f8020000004889420848c702030000006a016a014989c34989e24989d149c7c0030000004889cb488b442420ff15ba040000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084153488b5424109090ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740180300000048894810594883c4184889480848c70007000000c34983f9017460488b72084881e69fff00004883fe0174674883fe017466488b72084881e69fff000048c7c70100000049c7c0030000004883ff2f751348b878ed0ec9a37f0000488b5d08909090ff134d89c14c23ce4983f901751b4883c7024f8d4400ffeb05e989010000483b65187303ff5548ebc040f6c7017414eb0ae971010000e96c0100004883ff017d28eb06f647ff1074204152534889fb48b810c506c9a37f000048bad0a8dc00000000009090ff12eb064889f8415253ff750848b9a20e14c9a37f00005148896508a80174064883f82f72134889c148b8b0df06c9a37f0000488b5d08ff1348b9688c0cc9a37f0000488b4481fc4883c4085948894d08eb32909090488b65084883c4085b48895d084883381775144889c148b8288f0cc9a37f0000488b5d0890ff13488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b14246a016a014989c34989e24989c949c7c003000000488b5a08488b0290ff15ce020000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084153488b5424109090ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048c740180300000048894810594883c4104889480848c70007000000c3498d77d0483b75107303ff55404989f748c746f80500000048bf081214c9a37f000048893e48895e084c8946104c894e184c895620488066ffbf498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010030000004889700848c70005000000c3f64008017561488b4808488b1148833a07755948837908017557498d77e8483b75107303ff55404989f748c746f802000000488b7a0848897e0848c706050000006a016a014d89d34989c44989e24989f149c7c003000000488b4308488b334889c34889f0eb0fe94b000000e946000000e9410000009090ff156e010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c40848890841544c89daff124889c1584889caff22498d47d0483b45107303ff55404989c748c740f80500000048b9a81214c9a37f0000488908488958084c8940104c8948184c895020488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010030000004889480848c70005000000c3498d47d0483b45107303ff55404989c748c740f80500000048b9081314c9a37f0000488908488958084c8940104c8948184c895020488060ffbf4889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200300000048c740189fff000048c74010030000004889480848c70005000000c390909000000000000000007806000000000000|@6178,2097151,@17095,@4978,@4955,@4955,@4955|140,0,@4414 225,0,@376 235,0,I106 256,0,$6172+330 284,0,@560 303,0,@3809 354,0,@3811 664,0,@4414 760,0,@376 770,0,I106 795,0,$6172+866 823,0,@560 839,0,@3809 890,0,@3811 1128,0,@6173 1429,0,@6176 1550,0,@6177 6173:D3,56|483b65187303ff55484c8b52204c8b4a184c8b4210488b5a0848ba681214c9a37f0000ff2290909000000000000000003000000000000000|@6175,1048575,@17091|27,0,@6174 6174:O1|@6172 6175:S32|5838364c4f574c4556454c28292e6c6f6164496e646578283129283129283129 6176:D3,56|483b65187303ff55484c8b52204c8b4a184c8b4210488b5a0848ba681214c9a37f0000ff2290909000000000000000003000000000000000|@6175,1048575,@17092|27,0,@6174 6177:D3,56|483b65187303ff55484c8b52204c8b4a184c8b4210488b5a0848ba681214c9a37f0000ff2290909000000000000000003000000000000000|@6175,1048575,@17093|27,0,@6174 6178:S26|5838364c4f574c4556454c28292e6c6f6164496e646578283529 6179:S31|5838364c4f574c4556454c28292e67656e4c6f6164576f7264283129283129 6180:O1|@6181 6181:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8581414c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17108|30,0,@6182 6182:O1|@6183 6183:D3,168|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba381514c9a37f000048891148894108488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bb601914c9a37f000048891a4889420848894a10488062ffbf4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb401a14c9a37f00004889184889480848895010488060ffbfc390900000000000000000a000000000000000|@6179,15,@17107|26,0,@6184 72,0,@6190 125,0,@6192 6184:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbb01514c9a37f0000488918488b52084889500848894810488060ffbfc390909090909000000000000000004800000000000000|@6167,15,@17103|29,0,@6185 6185:D6,240|483b65187303ff5548488b42104883780801756eff304c8b042448c7c39fff0000488b4208909090ff15da000000498d4fe8483b4d107303ff55404989cf48c741f80200000048bae01614c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f8030000004889481048895008eb05e90800000048c70003000000c3488b5808488b084889c8909090ff156e0000005349c7c0030000009090ff15660000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390900000000000000000e800000000000000|@6166,2097151,@17101,@4978,@6189,@6155|72,0,@6186 6186:D3,88|498d4fd0483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80300000048bb601714c9a37f000048891848894808488b520848895010488060ffbfc3909000000000000000005000000000000000|@5656,15,@17100|41,0,@6187 6187:D5,120|483b65187303ff55484889d3488b4310ff157a0000005349c7c003000000488b4b084889cb909090ff156a000000488b0c244889c2498d47e0483b45107303ff55404989c748c740f80300000048895010488b49084883c4084889480848c70001000000c390909000000000000000007000000000000000|@4942,2097151,@17098,@6188,@6155| 6188:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17099|28,0,@1662 6189:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17102|28,0,@1662 6190:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bbe01914c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@6170,15,@17105|29,0,@6191 6191:D4,48|483b65187303ff55484c8b4a184c8b4210488b5a08ff252d000000909090909000000000000000002800000000000000|@4975,2097151,@17104,@4972| 6192:D4,56|483b65187303ff55484c8b521049c7c1030000004c8b420848bbf86012c9a37f0000ff252800000000000000000000003000000000000000|@6175,2097151,@17106,@6172|26,0,@5452 6193:O1|@6194 6194:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8381b14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17119|30,0,@6195 6195:O1|@6196 6196:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bab81b14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6211,7,@17118|29,0,@6197 6197:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba881c14c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@17116,@6210,@4978|68,0,@6198 6198:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8201d14c9a37f000048bb182014c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@17115,@5100|61,0,@6199 71,0,@6206 6199:O1|@6200 6200:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa01d14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17111|29,0,@6201 6201:D4,304|483b65187303ff5548488b4208488b5808488b084889c890ff152a010000a8017515488b0848833903750c48837808017505f6c30174164889c148b8001f14c9a37f0000488b5d08909090ff13498d9730ffffff483b55107303ff55404989d748c742f80400000048c7421805000000488b334889721048c742080100000048c70209000000488d7a2848c747f803000000488977104c8b41084c89470848c707110000004c8d4f2049c741f80300000049c74110050000004989710849c7014b0000004d8d512049c742f80200000049c74208010000004d890a4d8d4a1849c741f8020000004d895108498939498d791848c747f8020000004c894f08488917488d471848c740f803000000488978104889580848c70001000000c390909000000000000000002801000000000000|@4942,511,@17109,@6205|60,0,@6202 6202:O4|@20055,@557,@6204,@6203 6203:O5|@4546,1554,0,1554,0 6204:S8|61746f6d69634f70 6205:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17110|28,0,@1662 6206:O1|@6207 6207:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bba02014c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@17114|33,0,@6208 6208:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb202114c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@17113|29,0,@6209 6209:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@17112,@4949| 6210:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@17117| 6211:S35|5838364c4f574c4556454c28292e696e73747241746f6d6963496e6372283229283129 6212:O1|@6213 6213:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e02214c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17130|30,0,@6214 6214:O1|@6215 6215:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba602314c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6227,7,@17129|29,0,@6216 6216:D5,152|483b65187303ff55484889d3ff159e000000504989c0488b4b0848c7c39fff00004889c8ff158e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba302414c9a37f00004889115a48895108488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090909000000000000000009000000000000000|@5658,2097151,@17127,@6226,@4978|68,0,@6217 6217:D4,104|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b520848891049b8c82414c9a37f000048bb502714c9a37f0000ff252b00000090909000000000000000006000000000000000|@5656,1048575,@17126,@5100|61,0,@6218 71,0,@6222 6218:O1|@6219 6219:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba482514c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17122|29,0,@6220 6220:D4,304|483b65187303ff5548488b4208488b5808488b084889c890ff152a010000a8017515488b0848833903750c48837808017505f6c30174164889c148b8001f14c9a37f0000488b5d08909090ff13498d9730ffffff483b55107303ff55404989d748c742f80400000048c74218fdffffff488b334889721048c742080100000048c70209000000488d7a2848c747f803000000488977104c8b41084c89470848c707110000004c8d4f2049c741f80300000049c74110fdffffff4989710849c7014b0000004d8d512049c742f80200000049c74208010000004d890a4d8d4a1849c741f8020000004d895108498939498d791848c747f8020000004c894f08488917488d471848c740f803000000488978104889580848c70001000000c390909000000000000000002801000000000000|@4942,511,@17120,@6221|60,0,@6202 6221:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17121|28,0,@1662 6222:O1|@6223 6223:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bbd82714c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@17125|33,0,@6224 6224:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb582814c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@17124|29,0,@6225 6225:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@17123,@4949| 6226:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@17128| 6227:S35|5838364c4f574c4556454c28292e696e73747241746f6d696344656372283229283129 6228:O1|@6229 6229:D3,824|483b65187303ff5548a801751bf64008017515488b4808f6410801750b488b510848837a080174154889c148b8f82c14c9a37f0000488b5d089090ff13ff30ff32ff3153488b4424184889daff1250488b442410488b542408909090ff12f60424017567a8017568488b0c24f601017514488b1048b8b8f309c9a37f0000488b5d0890ff134883390b7356f600017515488b1048b8b8f309c9a37f0000488b5d089090ff13ff31488b0048ba10a5dc0000000000ff1248ba90a4dc0000000000ff124881e0ff010000eb0ae95d000000e9580000004883e0074883f801753feb04ff31eb39f6042401751248b8b8f309c9a37f0000488b5d089090ff13498d47f0483b45107303ff55404989c748c740f801000000488b0c24488908eb1848c7c0010000004883c4086a01eb0948c7c0010000006a0150488b442420488b542418909090ff12a801756af600017516488b0848b8b8f309c9a37f0000488b5d08909090ff13488b0048ba10a5dc00000000009090ff1248ba90a4dc0000000000ff124881e0ff01000048833c24017569498d4fe8483b4d107303ff55404989cf48c741f80200000048ba882d14c9a37f0000eb05e96001000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b542428488910498d57e8483b5510730aeb05e950000000ff55404989d748c742f80200000048894208488b442430488902498d47d8483b45107303ff55404989c748c740f802000000488950084889084889c1488d401848c740f8010000004889084883c438c3488b0c24488b11f6c20174084883fa017d24eb06f642ff10741c504889d348b810c506c9a37f000048bad0a8dc0000000000ff12eb074889c34889d053498d4fe0483b4d107303ff55404989cf48c741f80300000048bae03914c9a37f0000488911488941085848894110488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b542428488910498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f8010000004889104883c438c348c7c0010000004883c438c390909000000000000000003003000000000000|@6294,2097151,@17158|45,0,@6230 118,0,@2708 149,0,@2708 172,0,I91 184,0,I89 237,0,@2708 340,0,@2708 362,0,I91 376,0,I89 426,0,@6233 622,0,@376 632,0,I106 677,0,@6273 6230:O4|@20055,@557,@6232,@6231 6231:O5|@4546,838,0,838,0 6232:S37|696e737472416c6c6f6353746f72653a2057726f6e67206e756d626572206f662061726773 6233:D3,168|498d4fe0483b4d107303ff55404989cf48c741f80300000048bb582e14c9a37f0000488919488b52084889510848894110488061ffbf498d47e8483b45107303ff55404989c748c740f80200000048ba203814c9a37f000048891048894808488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba103914c9a37f000048891048894808488060ffbfc390900000000000000000a000000000000000|@6272,15,@17143|26,0,@6234 80,0,@6269 129,0,@6271 6234:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bbd82e14c9a37f0000488918488b5a0848895808488b72104889701048894818488060ffbfc390909090909000000000000000005000000000000000|@6167,31,@17139|29,0,@6235 6235:D6,256|483b65187303ff5548488b421848837808017568ff30524c8b44240848c7c301010000488b421090ff15ea000000488b0c24498d57e0483b55107303ff55404989d748c742f80300000048bb183014c9a37f00004883c40848891a488b490848894a085948894a10488062ffbf4889c1498d47e0483b4510730aeb05e91e000000ff55404989c748c740f803000000488950104889480848c70003000000c34889d3488b7008488b084889c8ff156e0000004989f24c8b43084c89d3ff15660000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104c89500848c70001000000c39090900000000000000000f800000000000000|@6166,2097151,@17137,@4978,@6268,@6238|76,0,@6236 6236:D3,96|498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80400000048bba03014c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc3909000000000000000005800000000000000|@5656,15,@17136|41,0,@6237 6237:D5,112|483b65187303ff55484889d3488b4318ff15720000004989da4d8b4210498b5a08909090ff15660000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104d8b52084c89500848c70001000000c39090909090909000000000000000006800000000000000|@4942,511,@17131,@6264,@6238| 6238:D5,312|483b65187303ff5548a8017528488b0848833903751ff64008017519488b5008488b3248833e03750c48837a08017505f6c301741048b8b83214c9a37f0000488b5d08ff134c89c34883e3034883fb01750c48bb303314c9a37f0000eb0a48bb603314c9a37f0000498d7fe0483b7d107303ff55404989ff48c747f8030000004c89471049b8283414c9a37f00004c89470848c7076b0000004d8d47e84c3b45107303ff55404d89c749c740f80200000049b9503414c9a37f00004d894808498938498d7fe8483b7d107303ff55404989ff48c747f8020000004c89470849b8583514c9a37f00004c89074883ff0174144989d84889fb4c89c09090ff154e0000004889c34883fb01750b48b8703514c9a37f0000c348b8703514c9a37f0000ff2532000000909000000000000000003001000000000000|@6266,255,@17133,@6267,@6265|55,0,@6239 84,0,@6242 96,0,@6244 134,0,@6251 179,0,@6252 224,0,@6261 269,0,@6262 280,0,@6262 6239:O4|@20055,@557,@6241,@6240 6240:O5|@4546,796,0,796,0 6241:S11|67656e566172416c6c6f63 6242:O2|@6243,0 6243:O2|47,4 6244:O2|@5443,@6245 6245:O2|@6247,@6246 6246:O2|@6249,@6248 6247:O2|47,3 6248:O2|@6250,0 6249:O4|50,1,@3900,2 6250:O4|50,3,@833,0 6251:O4|0,@3802,@3659,-1 6252:O2|@6254,@6253 6253:O2|@5206,@6256 6254:O3|58,@6255,@833 6255:O4|0,@3802,@3659,-8 6256:O2|@6258,@6257 6257:O2|@6259,0 6258:O2|1,@3802 6259:O5|30,0,@6260,4,@3802 6260:O2|2,@833 6261:O2|45,@3802 6262:O2|@6263,@4493 6263:O2|40,@3802 6264:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17132|28,0,@1662 6265:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17135| 6266:S28|5838364c4f574c4556454c28292e67656e566172416c6c6f63283329 6267:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17134| 6268:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17138|28,0,@1662 6269:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb983814c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@5098,15,@17141|29,0,@6270 6270:D4,72|483b65187303ff5548488b4a10488b1c2448890c2449c7c20300000049c7c10300000049c7c0030000004889de488b5a0856ff252800000000000000000000004000000000000000|@4952,2097151,@17140,@4949| 6271:D4,80|483b65187303ff5548488b5208488b0c244889142449c7c20100000049c7c10300000049c7c00500000048bbf86012c9a37f000051ff252d000000909090909000000000000000004800000000000000|@4952,2097151,@17142,@4949|44,0,@5452 6272:S57|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229616c6c6f6353746f72655661724c656e677468283129283129 6273:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb603a14c9a37f0000488918488b5a0848895808488b72104889701048894818488060ffbfc390909090909000000000000000005000000000000000|@6293,31,@17157|29,0,@6274 6274:D5,224|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048bb783b14c9a37f0000488919488b5a0848895908488b721048897110488061ffbf4889cf4989d0909090ff15a60000005057498b48184989c048c7c39fff00004889c8909090ff1592000000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba104314c9a37f00004889115a488951085a48895110488061ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70003000000c39090900000000000000000d800000000000000|@5658,2097151,@17155,@6292,@4978|35,0,@6275 136,0,@6287 6275:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bbf83b14c9a37f0000488918488b5a0848895808488b72104889701048894818488060ffbfc390909090909000000000000000005000000000000000|@4945,31,@17150|29,0,@6276 6276:D5,112|483b65187303ff5548488b4218488b58084889d6488b084889c89090ff1566000000534c8b4e104c8b460890ff155e0000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c3909000000000000000006800000000000000|@4942,2097151,@17144,@6281,@6277| 6277:D7,720|483b65187303ff5548a8017515488b0848833903750c48837808017505f6c30174134889c148b8b83f14c9a37f0000488b5d08ff13ff33ff7108ff35a8020000ff3341504151488d5c24184c89c09090ff159a02000048833c2401746f498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118ffffffff48bae86f0cc9a37f000048895110488b5424104889510848c70101000000498d5fb8483b5d107303ff55404989df48c743f803000000488b34244889731048894b0848c7036b000000488d4b20eb05e9b200000048c741f80400000048c74118f1ffffff48bee86f0cc9a37f0000488971104889510848c70101000000498db778ffffff483b75107303ff55404989f748c746f803000000488b7c240848897e1048894e0848c7066f000000488d4e2048c741f803000000488951104889790848c70101000000488d512048c742f80200000048c742080100000048890a488d4a1848c741f80200000048895108488931488d511848c742f80200000048894a0848891aeb6f5048c7c301000002488b44240848ba50a9dc00000000009090ff124889c3488b44241048bad0aadc0000000000ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118f1ffffff48bae86f0cc9a37f000048895110488b5424184889510848c70101000000eb05e97f000000498d5fc0483b5d107303ff55404989df48c743f8030000004889431048894b0848c7036f000000488d432048c740f80300000048895010488b4c24104889480848c70001000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d511848c742f80200000048894a0848891aeb01504883fa017506488b0424eb0f4889d3488b04249090ff15660000004883f801750f48b808300fc9a37f00004883c438c34889c348b808300fc9a37f00004883c438ff254200000090900000000000000000c802000000000000|@6283,2097151,@17146,@6284,@1354,@6286,@6282|39,0,@6278 127,0,@3659 227,0,@3659 402,0,I108 424,0,I114 468,0,@3659 666,0,@4493 684,0,@4493 6278:O4|@20055,@557,@6280,@6279 6279:O5|@4546,755,0,755,0 6280:S13|67656e4669786564416c6c6f63 6281:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17145|28,0,@1662 6282:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17149| 6283:S30|5838364c4f574c4556454c28292e67656e4669786564416c6c6f63283429 6284:D3,160|483b65187303ff55485248c7c31100000048ba50a9dc000000000090ff12488b0c24498d57d8483b55107303ff55404989d748c742f8040000004889421848b8e86f0cc9a37f000048894210488b41104889420848c70201000000498d47e0483b45107303ff55404989c748c740f803000000488b49084883c408488948104889500848c70075000000c3909090909000000000000000009800000000000000|@6285,2097151,@17147|19,0,I108 64,0,@3659 6285:S44|5838364c4f574c4556454c28292e67656e4669786564416c6c6f63283429696e697469616c69736572283129 6286:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17148| 6287:D4,96|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808488b4a104889084c8b420848bba04314c9a37f0000ff25290000009000000000000000005800000000000000|@5656,1048575,@17154,@5100|65,0,@6288 6288:O1|@6289 6289:D3,80|488b4808488b10498d47e0483b45107303ff55404989c748c740f80300000048bb284414c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@5099,15,@17153|33,0,@6290 6290:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bba84414c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc390909090909000000000000000005000000000000000|@5098,15,@17152|29,0,@6291 6291:D4,72|483b65187303ff5548488b4a18488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a0856ff252b00000090909000000000000000004000000000000000|@4952,2097151,@17151,@4949| 6292:D3,88|483b65187303ff5548a8017530488b4008e8eaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000005000000000000000|@1363,3,@17156| 6293:S59|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229616c6c6f6353746f726546697865644c656e677468283129283129 6294:S32|5838364c4f574c4556454c28292e696e737472416c6c6f6353746f7265283229 6295:O1|@6296 6296:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888a710c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17159|30,0,@4922 6297:O1|@6298 6298:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8404714c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17175|30,0,@6299 6299:O1|@6300 6300:D3,256|48b8784814c9a37f000048c7c101000000a801756e488b1048833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c3017513488b33f643ff10740348f7de488d743601eb034889de4889cb4889f148c7c6030000004883ee014883f97feb05e933000000760748c7c17f00000048d1e948d3e64883ce01488d4c0901480bde4889d9488b50084889d0483b65187303ff5548e956ffffff4889c84889c1498d47e8483b45107303ff55404989c748c740f80200000048bad84814c9a37f000048891048894808488060ffbfc30000000000000000f800000000000000|@6334,31,@17174|2,0,@6301 219,0,@6305 6301:O2|@884,@6302 6302:O2|@3804,@6303 6303:O2|@833,@6304 6304:O2|@3805,0 6305:D7,496|483b65187303ff55484889c148c7c305000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c63eb06f643ff107560f6c301740b483b1d450100007d57eb06f643ff10746f498d57e8eb0ae9e7000000e9aa000000483b55107303ff55404989d748c742f80200000048895a0848c702050000006a016a014989c34989e24989d149c7c005000000eb0fe970000000e96b000000e96600000048c7c30100000048b838d406c9a37f00009090ff15ee000000eb05e946000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c40848890849b9104b14c9a37f000049c7c0030000004889c34c89d8ff25a900000048b9585814c9a37f0000488b1c2448890c2449c7c20500000049c7c1010000004c8b42084889d948bb405914c9a37f000051ff257900000048b9585814c9a37f0000488b1c2448890c2449c7c20500000049c7c1010000004c8b42084889d948bb405914c9a37f000051ff2549000000900000000000000000e0010000000000000100008000000000|@4954,2097151,@17173,@4955,@4972,@4949,@4949|29,0,@578 110,0,@2708 266,0,@491 332,0,@6306 361,0,@6329 400,0,@6332 417,0,@6329 456,0,@6332 6306:O1|@6307 6307:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba904b14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4969,7,@17170|29,0,@6308 6308:D8,472|483b65187303ff55484889c148c7c303000000f6c10174154889c648b8c0e406c9a37f0000488b5d089090ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbc488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c64eb06f643ff107561f6c301740b483b1d2d0100007d58eb06f643ff107455498d47e8eb0ae9d3000000e999000000483b45107303ff55404989c748c740f8020000004889580848c70005000000488b72086a016a014989e24989c149c7c003000000eb14e95e000000e959000000e954000000e94f000000488b5e08488b069090ff15da0000005890ff15da000000488b1c249090ff15d60000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c348b9b84d14c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff257d00000048b9b84d14c9a37f0000488b1c2448890c2449c7c20300000049c7c10100000049c7c09fff00004889d9488b5a0851ff25500000000000000000000000c8010000000000000100008000000000|@4954,2097151,@17168,@4955,@6328,@6312,@4949,@4949|29,0,@578 110,0,@2708 344,0,@6309 397,0,@6309 6309:O1|@6310 6310:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba384e14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17167|29,0,@6311 6311:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,2097151,@17160,@6322,@6312| 6312:D7,1080|483b65187303ff5548a8017521f6400801751b488b4808f64108017511488b510848837a080175064883fb0174134889c148b8585314c9a37f0000488b5d08ff136a016a01488b1948833b03756f498d7788483b75107303ff55404989f748c746f80400000048c7461805000000488b7b0848897e1048c746080300000048c706650000004c8d462849c740f80200000049c7400801000000498930498d701848c746f80300000048897e1048897e0848c706770000004c8d4e20eb05e92200000049c741f80200000049c74108010000004989314889e64c89064889e64c894e08eb154889e648c706010000004889e648c7460801000000488b3048833e05754348833b05741148b8d05314c9a37f0000488b5d0890ff13f64308017416f6430801751048b8b8f309c9a37f0000488b5d08ff1348b8285414c9a37f0000488b5d08ff1348833e03741248b8d05314c9a37f0000488b5d089090ff1348833b057573f6430801751048b8b8f309c9a37f0000488b5d08ff13488b7b0840f6c70174084883ff017d2beb06f647ff107423ff32ff76084889fb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb084889f8ff32ff7608498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e9200000004889411848b8e86f0cc9a37f000048894110584889410848c70101000000eb6648833b03741048b8d05314c9a37f0000488b5d08ff13498d7fc0483b7d107303ff55404989ff48c747f8020000004c8b43084c89470848c70701000000488d4f1848c741f80400000048c741180100000048897910488b7e084889790848c70101000000ff32488b0424488338057572f64008017514488b500848b8b8f309c9a37f0000488b5d08ff1351488b400848ba10a5dc0000000000ff1248ba90a4dc0000000000ff124881e0ff010000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c7016b000000498d47e8483b4510730aeb05e946000000ff55404989c748c740f80200000048c740080100000048890848837c240801740b488b5c2408ff15420100004883f80175064883c41058c34889c34883c41058ff253001000048833803741348b8805414c9a37f0000488b5d08909090ff13498d9750ffffff483b55107303ff55404989d748c742f803000000488b580848895a1048895a0848c70277000000488d722048c746f80300000048895e1048894e0848c7066d000000488d4e2048c741f80400000048c74118050000004889591048c741080300000048c70165000000488d792848c747f80200000048c747080100000048890f488d4f1848c741f80200000048897908488931488d711848c746f80200000048894e0848891648837c2408017413488b5c24084889f09090ff155a0000004889c64883fe0175064883c41058c34889f34883c41058ff2545000000909090909000000000000000003004000000000000|@6324,2097151,@17162,@6325,@6326,@6327,@6323|51,0,@6313 266,0,@6316 295,0,@2708 311,0,@6318 333,0,@6316 363,0,@2708 411,0,@376 421,0,I106 481,0,@3659 515,0,@6316 631,0,@2708 652,0,I91 664,0,I89 816,0,@6320 6313:O4|@20055,@557,@6315,@6314 6314:O5|@4546,1136,0,1136,0 6315:S12|67656e53746f726542797465 6316:O4|@20055,@557,@6315,@6317 6317:O5|@4546,1119,0,1119,0 6318:O4|@20055,@557,@6315,@6319 6319:O5|@4546,1118,0,1118,0 6320:O4|@20055,@557,@6315,@6321 6321:O5|@4546,1133,0,1133,0 6322:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17161|28,0,@1662 6323:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17166| 6324:S29|5838364c4f574c4556454c28292e67656e53746f726542797465283229 6325:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17163| 6326:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17164| 6327:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17165| 6328:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17169|28,0,@1662 6329:O1|@6330 6330:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad85814c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6170,7,@17172|29,0,@6331 6331:D4,56|483b65187303ff554849b9104b14c9a37f000049c7c003000000488b5a08ff252c0000009090909000000000000000003000000000000000|@4975,2097151,@17171,@4972|11,0,@6306 6332:O2|@6333,0 6333:O2|0,@585 6334:S26|5838364c4f574c4556454c28292e73746f726542797465283129 6335:O1|@6336 6336:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8305a14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17177|30,0,@6337 6337:O1|@6338 6338:D3,32|48b8c03411c9a37f0000c3909090909000000000000000001800000000000000|@5107,1,@17176|2,0,@5085 6339:O1|@6340 6340:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8185b14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17184|30,0,@6341 6341:O1|@6342 6342:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba985b14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6359,7,@17183|29,0,@6343 6343:D4,112|483b65187303ff554849b808e606c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba385c14c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17182,@4978|11,0,@585 67,0,@6344 6344:O1|@6345 6345:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b908e606c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048baf05c14c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17181|45,0,@585 85,0,@6346 6346:D4,48|483b65187303ff554849b8505d14c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17180,@5453|11,0,@6347 6347:O1|@6348 6348:D4,56|483b65187303ff554849c7c10100000049c7c001000000488b5808488b084889c8ff25290000009000000000000000003000000000000000|@6357,1023,@17178,@6349| 6349:D3,944|a8017516f64008017510488b480848837908017505f6c30174134889c148b8a06114c9a37f0000488b5d08ff136a016a016a01488b1148833a037553488b720848833e017564488b3848833f0375454c8b570849833a01753b4d8b5a084c3b5e0877164989e14989394989e1498951084989e14d894110eb5f4989e04989104989e0498978084989e04d894810eb52e92f0000004989e04989104989e0498978084989e04d894810eb374889e74c8b084c890f4889e7488957084889e74c894710eb1e4889e6488b3848893e4889e6488956084889e6eb05e9040000004c894610488b342448833e05756af6460801743cf6460801751248b8b8f309c9a37f0000488b5d089090ff1348837e0801741148b8c06c0fc9a37f0000488b5d0890ff1348be986d0fc9a37f0000eb71f6460801741248b8f86f07c9a37f0000488b5d089090ff134c8b4608490fb678ff488d7c3f01eb05e9770000004883ff03753241f6c001741348b8f86f07c9a37f0000488b5d08909090ff1348bfffffffffffffff00492378f8488d7c3f014883ff03741748b8a86d0fc9a37f0000eb05e909000000488b5d08ff134c89c6498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848c70721000000eb6d48833e03741248b8186214c9a37f0000488b5d089090ff13488b7e0848833f037529498d7fe8483b7d107303ff55404989ff48c747f802000000488b76084889770848c70725000000eb36498d7fe0483b7d107303ff55404989ff48c747f80300000048c7471001000000eb05e90f000000488b76084889770848c70723000000488b74240848833e0575324d8d47e04c3b45107303ff55404d89c749c740f803000000488b760849897010488b7424104989700849c70019000000eb5a48833e03741048b8706214c9a37f0000488b5d08ff134c8b460849833803753f4d8d47d84c3b45107303ff55404d89c749c740f80400000049c7401801000000488b760849897010488b7424104989700849c7001b000000eb35e9300000004d8d47e04c3b45107303ff55404d89c749c740f803000000488b760849897010488b7424104989700849c7001d000000498d77e0483b75107303ff55404989f748c746f803000000488b1b4883c41848895e1048c746080300000048c7062b000000498d5fb8483b5d107303ff55404989df48c743f80200000048c743080100000048893b488d7b1848c747f80200000048895f084c8907488d471848c740f80200000048897808488930c39090909090900000000000000000a803000000000000|@6358,1023,@17179|31,0,@6350 249,0,@2708 274,0,@4543 291,0,@4547 309,0,@1294 360,0,@1294 379,0,36028797018963967 404,0,@4548 473,0,@6353 663,0,@6355 6350:O4|@20055,@557,@6352,@6351 6351:O5|@4546,2039,0,2039,0 6352:S11|67656e42696e6172794650 6353:O4|@20055,@557,@6352,@6354 6354:O5|@4546,2025,0,2025,0 6355:O4|@20055,@557,@6352,@6356 6356:O5|@4546,2031,0,2031,0 6357:S31|5838364c4f574c4556454c28292e67656e42696e6172794650283129283129 6358:S28|5838364c4f574c4556454c28292e67656e42696e6172794650283429 6359:S25|5838364c4f574c4556454c28292e6765744650283129283129 6360:O1|@6361 6361:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e86314c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17190|30,0,@6362 6362:O1|@6363 6363:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba686414c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6359,7,@17189|29,0,@6364 6364:D4,112|483b65187303ff554849b808e606c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba086514c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17188,@4978|11,0,@585 67,0,@6365 6365:O1|@6366 6366:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b908e606c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048bac06514c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17187|45,0,@585 85,0,@6367 6367:D4,48|483b65187303ff554849b8206614c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17186,@5453|11,0,@6368 6368:O1|@6369 6369:D4,56|483b65187303ff554849c7c10f00000049c7c00d000000488b5808488b084889c8ff25290000009000000000000000003000000000000000|@6357,1023,@17185,@6349| 6370:O1|@6371 6371:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8286714c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17196|30,0,@6372 6372:O1|@6373 6373:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa86714c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6359,7,@17195|29,0,@6374 6374:D4,112|483b65187303ff554849b808e606c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba486814c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17194,@4978|11,0,@585 67,0,@6375 6375:O1|@6376 6376:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b908e606c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba006914c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17193|45,0,@585 85,0,@6377 6377:D4,48|483b65187303ff554849b8606914c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17192,@5453|11,0,@6378 6378:O1|@6379 6379:D4,56|483b65187303ff554849c7c10b00000049c7c00b000000488b5808488b084889c8ff25290000009000000000000000003000000000000000|@6357,1023,@17191,@6349| 6380:O1|@6381 6381:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8686a14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17202|30,0,@6382 6382:O1|@6383 6383:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bae86a14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6359,7,@17201|29,0,@6384 6384:D4,112|483b65187303ff554849b808e606c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba886b14c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17200,@4978|11,0,@585 67,0,@6385 6385:O1|@6386 6386:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b908e606c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba406c14c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17199|45,0,@585 85,0,@6387 6387:D4,48|483b65187303ff554849b8a06c14c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17198,@5453|11,0,@6388 6388:O1|@6389 6389:D4,56|483b65187303ff554849c7c10900000049c7c007000000488b5808488b084889c8ff25290000009000000000000000003000000000000000|@6357,1023,@17197,@6349| 6390:O1|@6391 6391:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a86d14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17209|30,0,@6392 6392:O1|@6393 6393:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba286e14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6412,7,@17208|29,0,@6394 6394:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048bac86e14c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17207,@4978|11,0,@440 67,0,@6395 6395:O1|@6396 6396:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba806f14c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17206|45,0,@440 85,0,@6397 6397:D4,48|483b65187303ff554849b8e06f14c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17205,@5453|11,0,@6398 6398:O1|@6399 6399:D4,48|483b65187303ff554849c7c001000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17203,@6400| 6400:D3,840|a801750c48837808017505f6c30174154889c148b8c07314c9a37f0000488b5d089090ff13488b0848833905756bf6410801743df6410801751348b8b8f309c9a37f0000488b5d08909090ff134883790801741148b8c06c0fc9a37f0000488b5d0890ff1348ba986d0fc9a37f0000eb71f6410801741248b8f86f07c9a37f0000488b5d089090ff13488b7108480fb656ff488d541201eb05e9770000004883fa03753240f6c601741348b8f86f07c9a37f0000488b5d08909090ff1348baffffffffffffff00482356f8488d5412014883fa03741748b8a86d0fc9a37f0000eb05e909000000488b5d08ff134889f2498d77e8483b75107303ff55404989f748c746f8020000004889560848c70621000000eb6948833903741248b8387414c9a37f0000488b5d089090ff13488b510848833a037525498d77e8483b75107303ff55404989f748c746f8020000004889560848c70625000000eb32498d77e0483b75107303ff55404989f748c746f80300000048c7461001000000eb05e90b0000004889560848c706230000004983f80b756d498d57e0483b55107303ff55404989d748c742f803000000488b1b48895a1048c742080300000048c7022b000000498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488933488d731848c746f80200000048895e0848bb907414c9a37f0000eb05e99e00000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848bea87414c9a37f0000488933498d77e8483b75107303ff55404989f748c746f80200000048895e0848bbc07414c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848bed87414c9a37f0000488933498d47e8483b45107303ff55404989c748c740f80200000048895808488910c3498d57e0483b55107303ff55404989d748c742f803000000488b1b48895a1048c742080300000048c7022b000000498d5fa0483b5d107303ff55404989df48c743f8020000004c89430848c7032f000000488d7b1848c747f80200000048c7470801000000488937488d771848c746f80200000048897e0848891e488d461848c740f80200000048897008488910c3909090909000000000000000004003000000000000|@6411,127,@17204|21,0,@6401 60,0,@2708 86,0,@4543 103,0,@4547 121,0,@1294 172,0,@1294 191,0,36028797018963967 216,0,@4548 285,0,@6404 503,0,@6406 551,0,@6407 592,0,@6408 633,0,@6409 6401:O4|@20055,@557,@6403,@6402 6402:O5|@4546,2069,0,2069,0 6403:S10|67656e556e6172794650 6404:O4|@20055,@557,@6403,@6405 6405:O5|@4546,2048,0,2048,0 6406:O2|15,@3941 6407:O2|23,3 6408:O2|24,4194304 6409:O2|23,5 6410:S30|5838364c4f574c4556454c28292e67656e556e6172794650283129283129 6411:S27|5838364c4f574c4556454c28292e67656e556e6172794650283329 6412:S30|5838364c4f574c4556454c28292e676574556e6172794650283129283129 6413:O1|@6414 6414:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8107614c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17215|30,0,@6415 6415:O1|@6416 6416:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba907614c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6412,7,@17214|29,0,@6417 6417:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba307714c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17213,@4978|11,0,@440 67,0,@6418 6418:O1|@6419 6419:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048bae87714c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17212|45,0,@440 85,0,@6420 6420:D4,48|483b65187303ff554849b8487814c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17211,@5453|11,0,@6421 6421:O1|@6422 6422:D4,48|483b65187303ff554849c7c003000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17210,@6400| 6423:O1|@6424 6424:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8487914c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17228|30,0,@6425 6425:O1|@6426 6426:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bac87914c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6445,7,@17227|29,0,@6427 6427:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba687a14c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17226,@4978|11,0,@440 67,0,@6428 6428:O1|@6429 6429:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba207b14c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17225|45,0,@440 85,0,@6430 6430:D4,80|483b65187303ff554848b9a07b14c9a37f0000488b1c2448890c2449c7c20100000049c7c10300000049c7c09fff00004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17224,@4949|11,0,@6431 6431:O1|@6432 6432:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba207c14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17223|29,0,@6433 6433:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,8191,@17216,@6439,@6434| 6434:D7,784|483b65187303ff5548a8017515488b0848833903750c48837808017505f6c30174134889c148b8188014c9a37f0000488b5d08ff13498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bff1ffffffffffff0f48893e498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d9740ffffff4c3b55107303ff55404d89d749c742f805000000498972204989521849897a104d894a084d890249c70003000000498d523048c742f80400000048c74218050000004c89521048c742081300000048c70217000000488d722848c746f80200000048c7460801000000488916488d561848c742f8020000004c895208488932488d721848c746f802000000488b7a0848897e084c8b024c89064c8d4e1849c741f803000000488b1b4989591049c741080300000049c7012b000000498d5fe8483b5d107303ff55404989df48c743f80200000049ba908014c9a37f00004c8953084c890b4d8d8f70ffffff4c3b4d107303ff55404d89cf49c741f8020000004c8b56084d89510849c701390000004d8d591849c743f80200000049c74308010000004d890b4d8d4b1849c741f8020000004c8b61084d89610849c7017b0000004d8d691849c745f8020000004d89650849c745005b0000004d8d751849c746f80200000049c74608010000004d892e4d8d6e1849c745f8020000004d8975084d894d004983fd0175054c8b0eeb1a4989d94c89eb488b069090ff15960000004c89c94989c14889cb4983f901750c48b8280512c9a37f0000eb1c4889df4c89cb48b8280512c9a37f0000909090ff156a0000004889fb4883f80174154889df4889c34c89d8ff155a0000004989c34889fb4983fb0175044889d8c34889d84c89dbff254600000090909090909000000000000000000803000000000000|@6441,8191,@17218,@6442,@6443,@6444,@6440|39,0,@6435 118,0,576460752303423480 456,0,@6438 675,0,@5288 693,0,@5288 6435:O4|@20055,@557,@6437,@6436 6436:O5|@4546,2098,0,2098,0 6437:S15|67656e496e74546f4650496e737472 6438:O2|@3988,0 6439:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17217|28,0,@1662 6440:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17222| 6441:S32|5838364c4f574c4556454c28292e67656e496e74546f4650496e737472283229 6442:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17219| 6443:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17220| 6444:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17221| 6445:S27|5838364c4f574c4556454c28292e67656e496e74546f4650283129 6446:O1|@6447 6447:D3,24|48c7c001000000c300000000000000001000000000000000|@5660,1,@17229| 6448:O1|@6449 6449:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8908414c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17235|30,0,@6450 6450:O1|@6451 6451:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba108514c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6412,7,@17234|29,0,@6452 6452:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048bab08514c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17233,@4978|11,0,@440 67,0,@6453 6453:O1|@6454 6454:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba688614c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17232|45,0,@440 85,0,@6455 6455:D4,48|483b65187303ff554849b8c88614c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17231,@5453|11,0,@6456 6456:O1|@6457 6457:D4,48|483b65187303ff554849c7c00f000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17230,@6400| 6458:O1|@6459 6459:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c88714c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17241|30,0,@6460 6460:O1|@6461 6461:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba488814c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6412,7,@17240|29,0,@6462 6462:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048bae88814c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17239,@4978|11,0,@440 67,0,@6463 6463:O1|@6464 6464:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048baa08914c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17238|45,0,@440 85,0,@6465 6465:D4,48|483b65187303ff554849b8008a14c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17237,@5453|11,0,@6466 6466:O1|@6467 6467:D4,48|483b65187303ff554849c7c00d000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17236,@6400| 6468:O1|@6469 6469:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8008b14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17247|30,0,@6470 6470:O1|@6471 6471:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba808b14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6412,7,@17246|29,0,@6472 6472:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba208c14c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17245,@4978|11,0,@440 67,0,@6473 6473:O1|@6474 6474:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048bad88c14c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17244|45,0,@440 85,0,@6475 6475:D4,48|483b65187303ff554849b8388d14c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17243,@5453|11,0,@6476 6476:O1|@6477 6477:D4,48|483b65187303ff554849c7c005000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17242,@6400| 6478:O1|@6479 6479:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8388e14c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17255|30,0,@6480 6480:O1|@6481 6481:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bab88e14c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@6490,7,@17254|29,0,@6482 6482:D3,120|498d47e8483b45107303ff55404989c748c740f80200000048b9588f14c9a37f0000488908488b520848895008488060ffbf4889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100800048c70003000000c39090909090909000000000000000007000000000000000|@6112,7,@17253|26,0,@6483 6483:D3,72|498d47e8483b45107303ff55404989c748c740f80200000048b9c88f14c9a37f0000488908488b520848895008488060ffbfc3909090909000000000000000004000000000000000|@6111,7,@17252|26,0,@6484 6484:D4,112|483b65187303ff554849b828cd06c9a37f000048c7c30100fe00488b42089090ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048ba689014c9a37f0000488950104889480848c70003000000c3909090909000000000000000006800000000000000|@6166,2097151,@17251,@4978|11,0,@440 67,0,@6485 6485:O1|@6486 6486:D3,128|498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8020000004889480848b928cd06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048ba209114c9a37f000048891048894808488060ffbfc390909090909000000000000000007800000000000000|@5656,7,@17250|45,0,@440 85,0,@6487 6487:D4,48|483b65187303ff554849b8809114c9a37f0000488b5a08ff252b00000090909000000000000000002800000000000000|@5456,2097151,@17249,@5453|11,0,@6488 6488:O1|@6489 6489:D4,48|483b65187303ff554849c7c00b000000488b5808488b084889c8ff252800000000000000000000002800000000000000|@6410,127,@17248,@6400| 6490:S31|5838364c4f574c4556454c28292e67657441726374616e4650283129283129 6491:O1|@6492 6492:D3,24|48c7c001000000c300000000000000001000000000000000|@5660,1,@17256| 6493:O1|@6494 6494:D3,24|48c7c001000000c300000000000000001000000000000000|@5660,1,@17257| 6495:O1|@6496 6496:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8509314c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17275|30,0,@6497 6497:O1|@6498 6498:D3,32|48b8a89314c9a37f0000c3909090909000000000000000001800000000000000|@6534,1,@17274|2,0,@6499 6499:O1|@6500 6500:D4,88|483b65187303ff554848b9409414c9a37f0000488b142448890c2449c7c20100000049c7c10300000049c7c08100000048bbb0d711c9a37f000052ff252f0000009090909090909000000000000000005000000000000000|@4952,2097151,@17273,@4949|11,0,@6501 50,0,@5227 6501:O1|@6502 6502:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bac09414c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17272|29,0,@6503 6503:D4,80|483b65187303ff554848b9409514c9a37f0000488b1c2448890c2449c7c20500000049c7c10300000049c7c0010100004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17271,@4949|11,0,@6504 6504:O1|@6505 6505:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bac09514c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17270|29,0,@6506 6506:D4,80|483b65187303ff554848b9409614c9a37f0000488b1c2448890c2449c7c20900000049c7c10300000049c7c0050000004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17269,@4949|11,0,@6507 6507:O1|@6508 6508:D4,56|483b65187303ff554849b8b89614c9a37f000048bb30a014c9a37f0000ff252d000000909090909000000000000000003000000000000000|@6533,1048575,@17268,@5100|11,0,@6509 21,0,@6528 6509:O1|@6510 6510:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba389714c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17264|29,0,@6511 6511:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,2097151,@17258,@6523,@6512| 6512:D6,1136|483b65187303ff5548a801754a488b08488339037548f64008017542488b5008f64208017538488b5a08488b3348833e03752bf64308017525488b7b08f6470801751b4c8b47084d8b0849833903750e4983780801eb05e90200000074134889c148b8889c14c9a37f0000488b5d08ff134c8b1749833a05755b41f6420801751048b8b8f309c9a37f0000488b5d08ff1349837a0801750949c7c301000000eb704d8b5a0841f6c30174084983fb017d2feb0741f643ff107426ff324c89db48b810c506c9a37f000048bad0a8dc0000000000eb05e9740000009090ff12eb054c89d8ff32498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8788b0cc9a37f000048894110eb05e93400000048c741080100000048c701090000004d8d5fe84c3b5d107303ff55404d89df49c743f80200000049c743080100000049890beb6eff32eb6f49833a03741148b8009d14c9a37f0000488b5d0890ff134d8d5fb84c3b5d107303ff55404d89df49c743f8030000004d8b62084d8963104d89630849c703770000004d8d6b2049c745f8040000004d89651849be788b0cc9a37f00004d89751049c7450801000000eb0ae982000000e97d00000049c745000f0000004d8d77904c3b75107303ff55404d89f749c746f80400000049c74618050000004d89661049c746080300000049c70665000000498d4e2848c741f80200000048c74108010000004c89314c8d711849c746f80200000049894e084d892e4c89d94d8d5e1849c743f8020000004d89730849890bff32488b042448833805755ef64008017516488b480848b8b8f309c9a37f0000488b5d089090ff134883780801750948c7c001000000eb74488b4808f6c10174084883f9017d2ceb06f641ff10742441534889cb48b810c506c9a37f000048bad0a8dc0000000000eb05e972000000ff12eb054889c84153498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b8488c0cc9a37f00004889411048c7410801000000eb05e92c00000048c70109000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb6e4153eb6f48833803741148b8009d14c9a37f0000488b5d0890ff13498d4fb8483b4d107303ff55404989cf48c741f803000000488b5008488951104889510848c70177000000488d592048c743f8040000004889531848be488c0cc9a37f00004889731048c7430801000000eb0ae97e000000e97900000048c7030f000000498d7790483b75107303ff55404989f748c746f80400000048c74618050000004889561048c746080300000048c70665000000488d7e2848c747f80200000048c7470801000000488937488d771848c746f80200000048897e0848891e488d461848c740f80200000048897008488908415390ff15760000004883f8017506488b0424eb104889c3488b0424909090ff15620000004883f801750f48b8589d14c9a37f00004883c410c34889c348b8589d14c9a37f00004883c410ff253e00000090909090909000000000000000006804000000000000|@6525,2097151,@17260,@6526,@6527,@6524|99,0,@6513 131,0,@2708 193,0,@376 203,0,I106 259,0,@3802 342,0,@6516 418,0,@3802 597,0,@2708 659,0,@376 669,0,I106 723,0,@3808 806,0,@6516 882,0,@3808 1078,0,@6518 1096,0,@6518 6513:O4|@20055,@557,@6515,@6514 6514:O5|@4546,1585,0,1585,0 6515:S11|627974654d656d4d6f7665 6516:O4|@20055,@557,@5209,@6517 6517:O5|@4546,1577,0,1577,0 6518:O2|@5197,@6519 6519:O2|@5199,@6520 6520:O2|@5201,@6521 6521:O2|@6522,0 6522:O2|47,1 6523:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17259|28,0,@1662 6524:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17263| 6525:S28|5838364c4f574c4556454c28292e627974654d656d4d6f7665283229 6526:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b868c911c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17261|64,0,@5204 6527:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17262| 6528:O1|@6529 6529:D3,80|488b08488b5008498d47e0483b45107303ff55404989c748c740f80300000048bbb8a014c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@6532,15,@17267|33,0,@6530 6530:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb38a114c9a37f0000488918488b5a0848895808488b72104889701048894818488060ffbfc390909090909000000000000000005000000000000000|@4969,31,@17266|29,0,@6531 6531:D6,448|483b65187303ff55484889c1488b5a10f6c10174144889c648b8c0e406c9a37f0000488b5d0890ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbd488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c5eeb06f643ff10755bf6c301740b483b1d190100007d65eb06f643ff107462498d77e8eb0ae9c7000000e996000000483b75107303ff55404989f748c746f80200000048895e0848c70605000000488b7a186a016a014989c34c8b6208eb0ae961000000e95c0000004989e24989f14c8b4210488b5f08488b07eb0ae944000000e93f000000ff15c2000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c40848890841534c89e2ff124889c1584889caff22488b4a08488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a1856ff2565000000488b4a08488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a1856ff2541000000900000000000000000b0010000000000000100008000000000|@4954,2097151,@17265,@4955,@4949,@4949|26,0,@578 106,0,@2708 6532:S39|5838364c4f574c4556454c28292e616c6c496e526567734f724c69746572616c73283229283129 6533:S27|5838364c4f574c4556454c28292e616c6c41726773283129283129 6534:S30|5838364c4f574c4556454c28292e67656e4d656d4d6f7665283129283129 6535:O1|@6536 6536:D3,88|498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b860a414c9a37f0000488901498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000005000000000000000|@5660,3,@17293|30,0,@6537 6537:O1|@6538 6538:D3,32|48b8b8a414c9a37f0000c3909090909000000000000000001800000000000000|@6534,1,@17292|2,0,@6539 6539:O1|@6540 6540:D4,88|483b65187303ff554848b950a514c9a37f0000488b142448890c2449c7c20100000049c7c10300000049c7c08100000048bbb0d711c9a37f000052ff252f0000009090909090909000000000000000005000000000000000|@4952,2097151,@17291,@4949|11,0,@6541 50,0,@5227 6541:O1|@6542 6542:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad0a514c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17290|29,0,@6543 6543:D4,80|483b65187303ff554848b950a614c9a37f0000488b1c2448890c2449c7c20500000049c7c10300000049c7c0010100004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17289,@4949|11,0,@6544 6544:O1|@6545 6545:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad0a614c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@5098,7,@17288|29,0,@6546 6546:D4,80|483b65187303ff554848b950a714c9a37f0000488b1c2448890c2449c7c20900000049c7c10300000049c7c0050000004889d9488b5a0851ff252a000000909000000000000000004800000000000000|@4952,2097151,@17287,@4949|11,0,@6547 6547:O1|@6548 6548:D4,56|483b65187303ff554849b8c8a714c9a37f000048bbe8b014c9a37f0000ff252d000000909090909000000000000000003000000000000000|@6533,1048575,@17286,@5100|11,0,@6549 21,0,@6569 6549:O1|@6550 6550:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba48a814c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@4945,7,@17282|29,0,@6551 6551:D5,104|483b65187303ff5548488b4208488b5808488b084889c890ff15620000005390ff15620000004889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70001000000c390909090909000000000000000006000000000000000|@4942,2097151,@17276,@6564,@6552| 6552:D6,1048|483b65187303ff5548a801754a488b08488339037548f64008017542488b5008f64208017538488b5a08488b3348833e03752bf64308017525488b7b08f6470801751b4c8b47084d8b0849833903750e4983780801eb05e90200000074134889c148b840ad14c9a37f0000488b5d08ff134c8b1749833a05755b41f6420801751048b8b8f309c9a37f0000488b5d08ff1349837a0801750949c7c301000000eb734d8b5a0841f6c30174084983fb017d2feb0741f643ff107426ff324c89db48b810c506c9a37f000048bad0a8dc0000000000eb05e9890000009090ff12eb054c89d8ff3248c7c31100000048ba50a9dc00000000009090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e9460000004889411848b8788b0cc9a37f00004889411048c741080100000048c701090000004d8d5fe84c3b5d107303ff55404d89df49c743f80200000049c743080100000049890beb69ff32eb6a49833a03741048b898ad14c9a37f0000488b5d08ff134d8d5fb84c3b5d107303ff55404d89df49c743f8020000004d8b62084d89630849c703050000004d8d6b1849c745f80500000049be788b0cc9a37f00004d89752049c74518f9ffffff4d895d10eb0ae940000000e93b00000049bbf0ad14c9a37f00004d895d0849c745003d0000004d8d5fe84c3b5d107303ff55404d89df49c743f80200000049c74308010000004d892bff32488b042448833805755cf64008017514488b480848b8b8f309c9a37f0000488b5d08ff134883780801750948c7c001000000eb6f488b4808f6c10174084883f9017d2ceb06f641ff10742441534889cb48b810c506c9a37f000048bad0a8dc0000000000eb05e987000000ff12eb054889c8415348c7c31100000048ba50a9dc00000000009090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e9460000004889411848b8488c0cc9a37f00004889411048c741080100000048c70109000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb694153eb6a48833803741048b898ad14c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084889410848c70105000000498d47d0483b45107303ff55404989c748c740f80500000048ba488c0cc9a37f000048895020eb0ae94e000000e94900000048c74018f9ffffff4889481048b900ae14c9a37f00004889480848c7003d0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908415390ff15720000004883f8017506488b0424eb104889c3488b0424909090ff155e0000004883f801750f48b810ae14c9a37f00004883c410c34889c348b810ae14c9a37f00004883c410ff253a000000909000000000000000001004000000000000|@6566,2097151,@17278,@6567,@6568,@6565|99,0,@6553 131,0,@2708 193,0,@376 203,0,I106 238,0,I108 287,0,@3802 363,0,@6555 430,0,@3802 468,0,@6557 547,0,@2708 607,0,@376 617,0,I106 650,0,I108 699,0,@3808 775,0,@6555 854,0,@3808 892,0,@6558 994,0,@6559 1012,0,@6559 6553:O4|@20055,@557,@6515,@6554 6554:O5|@4546,1609,0,1609,0 6555:O4|@20055,@557,@5209,@6556 6556:O5|@4546,1602,0,1602,0 6557:O1|@3802 6558:O1|@3808 6559:O2|@5197,@6560 6560:O2|@5199,@6561 6561:O2|@5201,@6562 6562:O2|@6563,0 6563:O2|47,2 6564:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17277|28,0,@1662 6565:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17281| 6566:S28|5838364c4f574c4556454c28292e776f72644d656d4d6f7665283229 6567:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b868c911c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17279|64,0,@5204 6568:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17280| 6569:O1|@6570 6570:D3,80|488b08488b5008498d47e0483b45107303ff55404989c748c740f80300000048bb70b114c9a37f00004889184889500848894810488060ffbfc390909090909000000000000000004800000000000000|@6532,15,@17285|33,0,@6571 6571:D3,88|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bbf0b114c9a37f0000488918488b5a0848895808488b72104889701048894818488060ffbfc390909090909000000000000000005000000000000000|@4969,31,@17284|29,0,@6572 6572:D6,448|483b65187303ff55484889c1488b5a10f6c10174144889c648b8c0e406c9a37f0000488b5d0890ff134883fb017505488b09eb1ff6c30174064883eb027105ff5570ebf5488b4908483b65187303ff5548ebbd488339077556f64108017455f641080175144889c348b8b8f309c9a37f0000488b5d0890ff13488b5908f6c301740b4881fb010000807c5eeb06f643ff10755bf6c301740b483b1d190100007d65eb06f643ff107462498d77e8eb0ae9c7000000e996000000483b75107303ff55404989f748c746f80200000048895e0848c70605000000488b7a186a016a014989c34c8b6208eb0ae961000000e95c0000004989e24989f14c8b4210488b5f08488b07eb0ae944000000e93f000000ff15c2000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c40848890841534c89e2ff124889c1584889caff22488b4a08488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a1856ff2565000000488b4a08488b1c2448890c244c8b521049c7c10100000049c7c09fff00004889de488b5a1856ff2541000000900000000000000000b0010000000000000100008000000000|@4954,2097151,@17283,@4955,@4949,@4949|26,0,@578 106,0,@2708 6573:D76,5408|488dbc2438ffffff483b7d187303ff55504889c64c89c090ff151a1500004c89c74989db49b8108c0ec9a37f000048bb588c0ec9a37f0000ff15021500004889c34889d8ff15fe1400009090ff15fe1400004983f903740948c7c101000000eb0748c7c1030000004883f1024983fa01740948c7c201000000eb0748c7c2030000004883f2024883fa01740c48ba902b07c9a37f0000eb0a48ba28cd06c9a37f0000f64424780175464c8b4424784983fb01744a493b10744a48833a0175154d8b084983390175534c8b52084d3b51087438eb5548833a0375544d8b084983390375624c8b52084d3b5108755deb05e9c90000004c8b5a104d3b5910eb0ae9a7000000e90200000075684989f952515356575041f6c101755eeb05e977000000498b0141ff7108eb0ae969000000e9640000004c8b8c24b80000004c8b8424c0000000eb0ae94d000000e948000000488b5808488b084889c8909090ff15f61300004883f80174194159483b6518730feb0ae920000000e912000000ff5548eb9248c7c0010000004883c408eb4048c7c003000000eb374989c148c7c00100000052515356574151eb244989c148c7c00100000052515356574151eb114989c048c7c00100000052515356574150f644241001755c488b4c2410488b1148833a07755e498d5fe8483b5d107303ff55404989df48c743f802000000488b34244889730848bee88b0cc9a37f000048893348c7c601000000f6c3017565488b0b488339017523488b790840f6c701740deb05e9aa0000004883c720712cff5570eb05e99a000000ebee48837910037515488b790840f6c70174064883c7107109ff5570ebf5488b790840f6c70175184c8b07f647ff10740349f7d84f8d440001eb08e9420000004989f84c89c148c7c7030000004883ef014883f97f760748c7c17f00000048d1e948d3e74883cf01488d4c0901480bf7488b5b08483b65187303ff5548e94fffffff4889f15051488b4208909090ff1586120000480b0424eb0d4889c148c7c0ffffff00516a0148837c2420017426488b8c24c0000000488b5118488b5a08488b1b480bd8488b720848891e48c7c301000000eb0748c7c30100000048837c242001746e488b4c2420488b1148833a07750948c7c3ffffffffeb5c50ffb424d0000000ffb424d0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb0ae9e7010000e9df010000ffb424c0000000ffb424c0000000ffb424c000000049c7c20100000049c7c10100000049c7c00100000048c7c3030000004889d0488b9424300100009090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff1348837c241001746b488b8c24c8000000488b384889fb488b411090ff154a1100004883f801756f575048c7c3030000004889f848baa05f06c9a37f00009090ff152e1100004889c348b8804b0fc9a37f000090ff1522110000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90701000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13576a016a01488b084883390b7558488b5108f6c20174084883fa017d4eeb06f642ff1074466a016a016a014989e249c7c10100000049c7c09fff00004889fb488b8424f8000000ff157e100000488d4424184883c40859488908488d4424085948894808eb29e9130000004889e348893b4889e348c7430801000000eb114889e248893a4889e248c7420801000000488b8424c8000000488b004883f8017507488b442408eb0e4889c3488b442408ff151e100000488b8c24c80000004889015b4883c410eb10488b18eb0b50eb0848c7c3ffffffff5053ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424800000004c8b9424400100004c8b8c24480100004c8b842430010000488b9c24a8000000488b84249800000090ff15720f000048837c241801746d48c7c101000000f6c1017414f68424a000000001740a482b8c24a00000007105ff5570ebf14883c1014c8b9424b80000004c8b8c24d00000004989c8488b5c243890ff152a0f00006a016a016a016a0150ffb424e0000000ffb424d8000000ff7424384c8b942410010000eb05e9340700004c8b8c24f00000004c8b442470488d5c242048c7c001000000909090ff15e60e0000488b44246090ff15e20e000048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c8a801750df68424c8000000017503ff5570483b8424c8000000750948c7c101000000eb706a016a016a01504c8d54240849c7c10100000049c7c09fff0000488b9c24e0000000488b842418010000909090ff15660e0000488b842400010000488b004883f8017507488b442418eb104889c3488b4424189090ff15460e0000488b8c2400010000488901488b842418010000eb05e98f010000488b5c2410488b50104889d0ff15220e0000a801746e5048c7c303000000488b44241848baa05f06c9a37f0000909090ff15060e00004889c348b890dc0ec9a37f000090ff15fa0d0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c49c7c003000000488b5c2410488b842418010000ff156a0d0000eb61498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b701848897218488b781048897a1048894a08488b0848890a4c8b8424180100004d8b48104989d0488b5c24104c89c8909090ff15160d000048c7c001000000488b8c2400010000488b094883f901740c4889cb909090ff15fa0c0000488b8c2400010000488901498d4ff0483b4d107303ff55404989cf48c741f801000000488b442408488901eb076a016a016a0150488b8424e8000000a801740cf60424017406482b04247105ff5570ebf54883c001f6c101750948c7c201000000eb0748c7c2030000004883f2024883f202488b9c24180100004883c420488b7358488b36a801740f40f6c6017409488d40ff4803c67105ff5570ebf2a801740af6c2017405482bc27105ff5570ebf64883c0014883f801750948c7c001000000eb62a80174084883f8017c08eb1cf640ff1074164889c248b880790fc9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848c70261000000488d421848c740f80200000048c7400801000000488910488b9424e0000000488b124883fa0174114889ce4889d39090ff15be0b00004889f1488b9424e0000000488902f6c101756e498d47e8483b45107303ff55404989c748c740f802000000488b094889480848c7005b000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b124883fa0174124889d34889c8909090ff15520b00004889c1488b8424e0000000eb05e903000000488908488b8424b800000048c70003000000f6442408017546488b4c24084c8b8424f8000000488b5c2410488b019090ff15120b0000488b8c24e0000000488b094883f901740b4889cb9090ff15fe0a0000488b8c24e0000000488901eb41488b8c24e0000000488b094883f901750c48b980cb14c9a37f0000eb194889cb48b880cb14c9a37f0000909090ff15c60a00004889c1488b8424e0000000488908488b442420a8017569488b8c24f8000000488b5118ff7008ff30ff71484c8b4a104c8b4208488b1a488b442408909090ff158a0a000048833c2401744350488b44241090ff157e0a00004889c348b810e00ec9a37f000090ff15720a000049c7c0010000004889c3488b842418010000eb05e94d00000090ff155a0a0000eb0150488b842400010000488b004883f8017506488b0424eb0e4889c3488b042490ff153a0a0000488b8c24000100004883c41848890158483b65187303ff5548e941ffffff48837c2418017506488b0424eb10488b5c2418488b042490ff15060a0000a801756e488b8c24f8000000488b78084c8b004c89c3488b4110ff15ee090000a80174715741505048c7c3030000004c89c048baa05f06c9a37f00009090ff15d20900004889c348b890dc0ec9a37f000090ff15c6090000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e98e05000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff107420574c89c049c7c0030000004889c3488b8424000100009090ff152a090000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b9424f8000000574d89c34989d04c89db498b4210ff15da08000048c7c001000000488b8c24e8000000488b094883f901740c4889cb909090ff15be080000488b8c24e800000048890158483b65187303ff5548e96efeffff498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b1424488911504c8b4424104889cb488b8424d8000000ff1572080000488b8c24c0000000488b094883f9017506488b4808eb16488b304889cb488b400890ff15520800004889c1eb03488b30488b8424c00000004889086a016a01564c8b5424584989c14c8b8424f0000000488d5c2408488b442418ff15220800006a016a016a016a01ffb424f8000000ffb424f0000000ff7424504c8b9424280100004c8b8c24080100004c8b842488000000488d5c241848c7c001000000ff15e6070000488b442428a80174084883f8017c1beb06f640ff1075134889c3488b842410010000ff15c6070000eb0748c7c001000000488b8c24d000000048c70103000000f60424017520488b1424504c8b842418010000488b5c2410488b02909090ff1592070000eb0e4889c248b8b0cb14c9a37f00005248833c2401740d488b1c24909090ff1576070000488b8c24000100004883c418488b094883f901740b4889cb9090ff155e070000488b8c24e800000048890148837c2408017507488b442410eb12488b5c2408488b4424109090ff153a070000a8017568488b8c2400010000488b5118ff7008ff30ff71484c8b4a104c8b4208488b1a488b4424089090ff151207000048833c2401744350488b44241090ff15060700004889c348b810e00ec9a37f000090ff15fa06000049c7c0010000004889c3488b842420010000eb05e94d00000090ff15e2060000eb0150488b842408010000488b004883f8017506488b0424eb0e4889c3488b042490ff15c2060000488b8c24080100004883c41848890158483b65187303ff5548e942ffffff48837c2420017506488b0424eb10488b5c2420488b042490ff158e060000a801756e488b8c2400010000488b78084c8b004c89c3488b4110ff1576060000a80174715741505048c7c3030000004c89c048baa05f06c9a37f00009090ff155a0600004889c348b890dc0ec9a37f000090ff154e060000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e91b01000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f28eb06f641ff107420574c89c049c7c0030000004889c3488b8424080100009090ff15b2050000eb5d498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b48104c894a1048894a08488b0848890a4c8b942400010000574d89c34989d04c89db498b4210ff156205000048c7c001000000488b8c24f0000000488b094883f901740c4889cb909090ff1546050000488b8c24f000000048890158483b65187303ff5548e96efeffff49b8e0cb14c9a37f00004883c430488b5c2408488b8424d000000090ff1512050000488b8c24b8000000488b094883f901740b4889cb9090ff15fe040000488b8c24b80000004889016a016a016a016a016a01488b4424604883c440a8017567488338017466488b08488b9424b8000000488b5a18ff7008ff31ff72484c8b4b104c8b4308488b334889f3488b442408ff15ae04000048833c2401744750488b44241090ff15a20400004889c348b810e00ec9a37f000090ff159604000049c7c001000000eb0ae961000000e94a0000004889c3488b8424d8000000ff157a040000eb0150488b8424c0000000488b004883f8017506488b0424eb0e4889c3488b042490ff155a040000488b8c24c00000004883c418488901eb03ff700858483b65187303ff5548e92fffffff48833c2401741f488b8424b8000000488b482048c70103000000488b1048c70203000000eb5d488b442420a8017559488338017558488b8c24b8000000488b5158488b12f6c20174064883ea027105ff5570ebf5488b595848891348837948017430ff700849c7c00100000048bb30cc14c9a37f00004889c89090ff15be030000eb17e91e000000e919000000e905000000ff7008eb03ff700858483b65187303ff5548eb8548837c242801750e48c7c0010000004883c438c28800488b8424b8000000488b48184c8b49104c8b4108488b19488b442430909090ff1566030000488b8c24a0000000488b094883f901740b4889cb9090ff1552030000488b8c24a0000000488901498d47b0483b45107303ff55404989c748c740f80300000048c7401001000000488b5424304889500848c70009000000488b9424b8000000488b5a38488b1b488d702048c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890653ff7248ff72384989f0488b4210909090ff15ca020000488b442410a80174064883c0027105ff5570ebf55948890148833c2401742149c7c00100000048bb508b0ec9a37f0000488b8424c80000009090ff1592020000498d47f0483b45107303ff55404989c748c740f8010000004883c408594889084883c438c2880090909000000000000000001815000000000000|@6599,2097151,@17308,@6600,@6601,@6603,@6604,@6605,@6607,@3852,@194,@100,@4504,@6609,@6610,@6615,@6622,@6627,@4504,@6628,@3852,@194,@100,@4422,@3834,@6629,@6630,@6631,@6632,@6645,@6646,@4428,@3770,@100,@3643,@6647,@6648,@3852,@194,@100,@4422,@3834,@6649,@6650,@6659,@6660,@6622,@4840,@6669,@6682,@6683,@6684,@4428,@3770,@100,@3643,@6685,@6686,@3852,@194,@100,@4422,@3834,@6687,@4521,@6688,@4428,@3770,@100,@3643,@6689,@3643,@4448,@6598,@3834,@3643|38,0,@4339 48,0,@4342 142,0,@884 154,0,@440 517,0,@3805 1005,0,@4376 1074,0,@193 1095,0,@4505 1143,0,@4506 1161,0,@557 1182,0,@20055 1969,0,@193 1991,0,@4379 2032,0,@4380 2050,0,@557 2071,0,@20055 2504,0,@4563 2858,0,@6574 2873,0,@6574 2983,0,@4401 3182,0,@193 3203,0,@4379 3251,0,@4380 3269,0,@557 3290,0,@20055 3861,0,@6576 4039,0,@4401 4238,0,@193 4259,0,@4379 4307,0,@4380 4325,0,@557 4346,0,@20055 4590,0,@6578 4763,0,@4401 4999,0,@6580 5326,0,@4334 6574:O2|@6575,0 6575:O2|29,@3659 6576:O2|@6577,0 6577:O2|9,@3659 6578:O1|@6579 6579:D3,24|48c7c003000000c300000000000000001000000000000000|@4512,1,@17294| 6580:S5|6465637370 6581:S36|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629 6582:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17296| 6583:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17297| 6584:D8,728|483b65187303ff55484152415141504889d948bbb0d014c9a37f00004889c24889c89090ff124883f801756e498d47f0483b45107303ff55404989c748c740f801000000488b4c2408488908488b8c24b0000000488b9424a8000000488b9c24a0000000488bb42498000000488bbc24900000004c8b8424880000004c8b8c24800000004c8b5424784c8b5c24704c8b6424684c8b6c2460eb05e9ef0000004c8b74245850488b44245850488b44245850488b44245850488b44245850488b44245850488b44245850488b44245848899c24e80000004889b424e00000004889bc24d80000004c898424d00000004c898c24c80000004c899424c00000004c899c24b80000004c89a424b00000004c89ac24a80000004c89b424a0000000488b5c242848899c2498000000488b5c242048899c2490000000488b5c241848899c2488000000488b5c241048899c2480000000488b5c240848895c24785b4883c42848895c244048894424384989d24989c94c8b44241848c7c303000000584883c418594883c41051ff2562010000488b08ff31ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb424800000004c8b9424e80000004c8b8c24000100004c8b842408010000488b9c24f0000000488b410890ff15e6000000ff742408ffb424a8000000ff35dd00000050488b442428488b5424209090ff126a016a014989e24c8b8c24d00000004c8b442410488d5c241890ff15b6000000488b8424b8000000488b004883f8017507488b442408eb104889c3488b4424089090ff1596000000488b8c24b800000048890148837c243803750e48c7c0010000004883c450c29800498d47f0483b45107303ff55404989c748c740f801000000488b14244889104883c450c29800909090909090900000000000000000d002000000000000|@6589,2097151,@17299,@6573,@6590,@6591,@4991,@6588|20,0,@6585 6585:O1|@6586 6586:D3,64|488338077520488b4808498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909000000000000000003800000000000000|@6587,3,@17298| 6587:S57|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e283329283129 6588:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17302| 6589:S54|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c283629636f646552545346756e6374696f6e283329 6590:D3,392|488dbc2458ffffff483b7d187303ff5550a801756d41524151415053ff7008415041514152ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a000000049c7c201000000eb05e9e500000049c7c10100000049c7c00100000048c7c303000000488b00488b94248000000090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13ff30ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b9424880000004c8b8c24800000004c8b442478488b5c2470488b442468909090e8befeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2600048c7c001000000c26000909000000000000000008001000000000000|@1363,1048575,@17300|181,0,@4376 6591:D11,512|483b65187303ff5548a801756748837a10037565488b4a08488b591852ff30ff71484c8b4b104c8b4308488b034889c3488b442408909090ff15da01000048833c24017449488b4424089090ff15ce0100004889c348b810e00ec9a37f000090ff15c2010000488b4c241049c7c001000000eb0ae9eb000000e91c0000004889c3488b4108909090ff15a201000048c7c0ffffffff4883c418c3498d4fb0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b004889410848c70109000000488b4208488b5838488b1b488d712048c746f80500000048c746200100000048c746180100000048c746100100000048c746080300000048890e5253ff7048ff70384989f0488b48104889c8ff151e010000488b442410a80174064883c0027105ff5570ebf55948890148833c24017421488b44241049c7c00100000048bb508b0ec9a37f0000488b400890ff15e60000004883c408584883c408c348837a1003750848c7c0ffffffffc3488b4208488b4838488b095251ff7048ff703849b830e00ec9a37f00004889cb488b70104889f09090ff15a6000000488b442410a80174064883c0027105ff5570ebf55948890148833c24017421488b44241049c7c00100000048bbf0dd0ec9a37f0000488b400890ff156e0000004883c408584883c408c3909090900000000000000000f801000000000000|@4990,2097151,@17301,@4428,@3770,@100,@3643,@3834,@3643,@3834,@3643|87,0,@4401 327,0,@4334 392,0,@4402 463,0,@4387 6592:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8e0d614c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17303|64,0,@6593 6593:O2|@5558,0 6594:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17304| 6595:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17305| 6596:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17306| 6597:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17307| 6598:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17352| 6599:S50|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f73757265283229 6600:D3,120|483b65187303ff5548a8017551488b084883790801740948c7c201000000eb0748c7c2030000004883f20252488b48084889c89090e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007000000000000000|@1363,7,@17309| 6601:D3,336|483b65187303ff5548a801756148833801756041f6c001755f498d4ff0483b4d107303ff55404989cf48c741f801000000498b1048891151498b50084989d0488b40089090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3e9c2000000e931000000488b400890e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c3f6c3017554498d4ff0483b4d107303ff55404989cf48c741f801000000488b1348891151488b53084889d3488b400890e822ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008909090e8f2feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c348c7c001000000c390909000000000000000004801000000000000|@6602,79,@17310| 6602:S35|5838364c4f574c4556454c28292e61726752656773283129616c6c6f63526567283329 6603:D3,104|483b65187303ff5548a801753e48833801742fff30488b4008e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e9b5ffffff48c7c001000000c3909090909000000000000000006000000000000000|@260,3,@17311| 6604:D3,128|483b65187303ff5548a801755548833801751a488b4808488b1048b8386208c9a37f0000488b5d08909090ff13488b08ff31488b48084889c8e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@17312|28,0,@1662 6605:D6,360|483b65187303ff5548488338157509488b4008488b4038c34883380d7568488b4808488339057563488b5108f6c20174084883fa017d08eb1ff642ff107519498b18f6c201740af6c3017405483bd3eb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5498b5490fc4889d74889fbeb0ae9c4000000e9b7000000498b4110ff15e60000004883f80175765048c7c3030000004889f848baa05f06c9a37f0000909090ff15ca0000004889c348b8804b0fc9a37f000090ff15be000000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f0000eb05e90e0000004889014889c8488b5d089090ff13488b0048833803740948c7c001000000eb0748c7c0030000004883f002c348c7c003000000c348c7c003000000c39000000000000000006001000000000000|@6606,2097151,@17313,@3852,@194,@100|90,0,@1493 173,0,@193 195,0,@4505 236,0,@4506 254,0,@557 268,0,@20055 6606:S65|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296e6f6e436f6e7461696e6572283229 6607:D3,320|483b65187303ff55484889c348c7c0cf00000048ba90b4dc0000000000909090ff1248b900b60cc9a37f000048c7c201000000f6c1017547488b194889c6482373084883fe0174254889d6498d57e8483b55107303ff55404989d748c742f80200000048897208488b33488932488b59084889d9483b65187303ff5548ebb44889d148c7c001000000f6c101756f488b1148833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c3017513488b33f643ff10740348f7de488d743601eb034889de488b51084889f148c7c3030000004883eb014883f97feb05e92c000000760748c7c17f00000048d1e948d3e34883cb01488d4c0901480bc34889d1483b65187303ff5548e95bffffffc39000000000000000003801000000000000|@6608,2097151,@17314|21,0,I153 36,0,@3897 6608:S44|434f444547454e5f5441424c4528292e6765745265676973746572536574466f7246756e6374696f6e283129 6609:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17315| 6610:D8,1232|488dbc2458ffffff483b7d187303ff55504883f80175204883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c27000f6c3017419488b4808488b1048b8700f0cc9a37f0000488b5d089090ff13488b0848833b01756d415241514150ff7308ff700841514152ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000eb05e94a00000049c7c20100000049c7c10100000049c7c00100000048c7c303000000488b01488b94248800000090ff124883f80175154889c148b810dc0ec9a37f0000488b5d089090ff13488b00eb63488b13488b3148833e07750948c7c701000000eb5f488b3a48833f0175154c8b5f0841f6c30174064983c3207125ff5570ebf548837f100375154c8b5f0841f6c30174064983c3107109ff5570ebf54c8b5f0841f6c30175204d8b2341f643ff10eb05e90a010000740349f7dc4f8d642401eb08e9480000004d89dc4c89e149c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c0901498d7ff0483b7d107303ff55404989ff48c747f8010000004c891f415241514150ff7308ff700841514152ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a800000049c7c20100000049c7c1010000004989f848c7c3030000004889f0488b942488000000909090ff124883f80175154889c148b890e614c9a37f0000488b5d089090ff13488b0048837c2430017468488b4c24204889c74889fb488b411090ff153e0200004883f801756f575048c7c3030000004889f848baa05f06c9a37f00009090ff15220200004889c348b8804b0fc9a37f000090ff1516020000498d4fd8483b4d107303ff55404989cf48c741f804000000eb05e90501000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f0000eb05e91d0000004889410848b898b419f1a37f00004889014889c8488b5d08909090ff13576a016a01488b084883390b7558488b5108f6c20174084883fa017d4eeb06f642ff1074466a016a016a014989e249c7c10100000049c7c09fff00004889fb488b442450909090ff1572010000488d4424184883c40859488908488d4424085948894808eb29e9130000004889e348893b4889e348c7430801000000eb114889e248893a4889e248c7420801000000488b8424b0000000488b004883f8017507488b442408eb0e4889c3488b442408ff1512010000488b8c24b0000000488901584883c41050ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a00000004c8b9424980000004c8b8c24900000004c8b842488000000488b9c2480000000488b442478909090e86afbffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c270000000000000000000c804000000000000|@3595,2097151,@17316,@3852,@194,@100,@4504,@6614|31,0,@3592 69,0,@3592 261,0,@4376 633,0,@6611 702,0,@193 723,0,@4505 771,0,@4506 789,0,@557 810,0,@20055 6611:O4|@20055,@557,@6613,@6612 6612:O5|@3867,1952,0,1952,0 6613:S17|6c64417267733a204e6f20726573756c74 6614:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17317| 6615:D11,656|483b65187303ff5548a801755af6c3017417488b4808488b1048b888ea14c9a37f0000488b5d08ff1348833b01756d6a016a0141524151ff7308ff700841504c8d4c2428488b18488b442418ff1556020000488b442420488b004883f801750c488b442430eb13e9f00100004889c3488b442430ff1536020000488b4c242048890158a80174064883c0027105ff5570ebf54989ca4c8b4c2410eb05e93d0000004989c0488b5c2408584883c418909090e84affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c3488b0b41524151ff30ff31488b4b084889cb488b400890e806ffffff488b0c24488339017514488b5108f6c20174064883c2207124ff5570ebf548837910037514488b5108f6c20174064883c2107109ff5570ebf5488b5108f6c2017513488b1af642ff10740348f7db488d5c1b01eb034889d34889d948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09016a016a016a01504c8d54240849c7c1010000004989d0488b5c2428488b442430ff1516010000488b442438488b004883f8017507488b442418eb0f4889c3488b44241890ff15fa000000488b4c2438488901488b442430488b48184c8b50484c8b49104c8b4108488b19488b44242090ff15d60000004983fa01743a488b442420909090ff15ca0000004889c348b8f86210c9a37f000090ff15be00000049c7c0010000004889c3488b442430909090ff15ae000000498d47e8483b45107303ff55404989c748c740f802000000594883c40848894808594883c428488908c34883fb01741348b888ea14c9a37f0000488b5d08909090ff1348c7c001000000c390909000000000000000008802000000000000|@6620,2097151,@17318,@4819,@6621,@4504,@6619,@4448,@3770,@100,@3643|27,0,@6616 523,0,@4822 612,0,@6616 6616:O4|@20055,@557,@6618,@6617 6617:O5|@3867,1986,0,1986,0 6618:S25|6d6f7665417267733a204c656e677468206d69736d61746368 6619:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17320| 6620:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296d6f766541726773283329 6621:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17319| 6622:D12,1288|483b65187303ff55484983f80175714983f901752948c7030100000048c743080100000048c743100100000048c743180100000048c7c001000000c21800534c8b4c24204d89d048bbe88b0cc9a37f0000488b4424189090ff15c2040000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000eb05e936000000488901488b042448c7000100000048c74008010000004889481048b9c04814c9a37f00004889481848c7c0010000004883c408c21800498b00488338077569f64008017417488b480848b8f86f07c9a37f0000488b5d08909090ff13534152ff7008488b1c2448c7c0cd00000048bad0b3dc0000000000ff124883f801746f498d47b8483b45107303ff55404989c748c740f802000000488b0c244889480848c70007000000eb05e954030000488b4c2408488b5138488b12488d581848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890352ff7148eb05e9a0000000ff71384989d84889d3488b4110909090ff159a030000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44241890ff1566030000498d47f0483b45107303ff55404989c748c740f8010000004883c40859488908488b4c241048890148c741080300000048c741100100000048c741180100000048c7c0010000004883c418c21800488b0424488b00498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488b442408488b5038488b12488d591848c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890b52ff7048ff70384989d84889d3488b48104889c8909090ff159e020000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44241890ff156a020000488b4c241048b8ffffffffffffff00482341f8488d4400014883f803754e498d47f0483b45107303ff55404989c748c740f801000000488b4c2408488908488b4c242048890148c741080100000048c741100100000048c741180100000048c7c0010000004883c428c21800498d47f0483b45107303ff55404989c748c740f801000000488b542408488910498d57b8483b55107303ff55404989d748c742f80200000048894a0848c70207000000488b4c2418488b5938488b1b488d721848c746f80500000048c746200100000048c746180100000048c746100100000048c74608030000004889165053ff7148ff71384989f0488b411090ff1572010000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bbf0dd0ec9a37f0000488b44243090ff153e0100004c8b4c24584883c4084c8b44242848bbe88b0cc9a37f00005890ff1526010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b4424285a48891048c74008010000004889481048b9c04814c9a37f00004889481848c7c0010000004883c428c21800534c8b4c24204d89d048bbe88b0cc9a37f0000488b4424109090ff15ba000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b042448890848c740080300000048c740100100000048b9c04814c9a37f00004889481848c7c0010000004883c408c218009090909000000000000000000005000000000000|@6624,2097151,@17321,@6623,@3834,@3643,@3834,@3643,@3834,@3643,@6623,@6623|73,0,@3805 161,0,@6304 208,0,@1294 244,0,I150 438,0,@4387 706,0,@4387 733,0,36028797018963967 1022,0,@4387 1058,0,@3805 1132,0,@6304 1169,0,@3805 1242,0,@6304 6623:D9,344|483b65187303ff554848833b017514488b4b08f6c10174064883c1207124ff5570ebf548837b10037514488b4b08f6c10174064883c1107109ff5570ebf5488b4b08f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09016a016a016a0141505341514c8d54241849c7c1010000004989d04889c3488b442410909090ff15be000000488b0424488b004883f8017507488b442428eb104889c3488b4424289090ff15a200000059488901488b442408488b48184c8b50484c8b49104c8b4108488b19488b04249090ff15820000004983fa017436488b0424ff157a0000004889c348b8f86210c9a37f000090ff156e00000049c7c0010000004889c3488b442408909090ff155e0000004883c418584883c408c39090909000000000000000005001000000000000|@6626,2097151,@17322,@4504,@6625,@4448,@3770,@100,@3643|275,0,@4822 6624:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296c6f616450726f63283129 6625:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17323| 6626:S60|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832296c6f6164526567283229 6627:D3,104|483b65187303ff5548a801753e48833801752fff30488b4008e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e9b5ffffff48c7c001000000c3909090909000000000000000006000000000000000|@260,3,@17324| 6628:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17325| 6629:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17326| 6630:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17327| 6631:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17328| 6632:D12,904|483b65187303ff55484889c74989d94889fb498b40109090ff15820300004883f801757057415041515048c7c3030000004889f848baa05f06c9a37f00009090ff15620300004889c348b8804b0fc9a37f000090ff1556030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b0848833909754b4983f9017427488b5108483b15ed020000742c48833a01741448833a03750e48837a0805750748837a1001741248b830fb14c9a37f0000488b5d089090ff1348b8c8fb14c9a37f0000eb684883390175674983f901741048b8f8fb14c9a37f0000488b5d08ff13498d57b8483b55107303ff55404989d748c742f802000000488b590848895a0848c70201000000488d721848c746f8020000004889560848c7063b000000488d461848c740f802000000eb0ae9c2000000e90d00000048c7400801000000488930eb6a48833907741348b888fc14c9a37f0000488b5d08909090ff134983f9017429498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70203000000eb2e498d57e8483b55107303ff55404989d748c742f802000000488b590848895a08eb05e94100000048c70205000000498d77d0483b75107303ff55404989f748c746f8020000004889560848c7063b000000488d461848c740f80200000048c74008010000004889304989c14889fb498b40109090ff157a010000a801746e57415041515048c7c3030000004889f848baa05f06c9a37f0000ff155e0100004889c348b890dc0ec9a37f000090ff1552010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c574150415149c7c0030000004889fb488b442408ff15c2000000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a6a016a0141514d8b58104989d04889fb4c89d8909090ff1572000000584883c410c39090909000000000000000008003000000000000|@6644,2097151,@17329,@3852,@194,@100,@3805,@3852,@194,@100,@4422,@3834|54,0,@193 75,0,@4505 116,0,@4506 134,0,@557 155,0,@20055 233,0,@6633 251,0,@6636 275,0,@6638 396,0,@6641 604,0,@193 623,0,@4379 664,0,@4380 682,0,@557 703,0,@20055 6633:O4|@20055,@557,@6635,@6634 6634:O5|@4331,2966,0,2966,0 6635:S47|6a756d70546f436f64653a204e6f7420696e646972656374696f6e207468726f75676820636c6f7375726520726567 6636:O2|@6637,0 6637:O2|29,@544 6638:O4|@20055,@557,@6640,@6639 6639:O5|@4331,2959,0,2959,0 6640:S36|6a756d70546f436f64653a20696e6469726563742063616c6c20746f20636f6465526566 6641:O4|@20055,@557,@6643,@6642 6642:O5|@4331,2969,0,2969,0 6643:S38|6a756d70546f436f64653a204e6f74206120636f6e7374616e74206f72207265676973746572 6644:S29|434f444547454e5f5441424c4528292e6a756d70546f436f6465283329 6645:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17330| 6646:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17331| 6647:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17332| 6648:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17333| 6649:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17334| 6650:D6,200|483b65187303ff55485350ff35cf0000004981f8ffffff00741b4981f8ffffff00740948c7c101000000eb1048c7c103000000eb0748c7c1030000004883f1025053ff703849c7c2010000004989c94c89c14c8d4424184889cb48ba78e00ec9a37f0000ff157e000000504c8b5424184c8b4c24104c8b44240848c7c30100000048c7c001000000ff15620000004889c1498d47e8483b45107303ff55404989c748c740f8020000005a4883c43048895008488908c390900000000000000000c000000000000000|@6652,2097151,@17335,@6653,@4406,@6651|92,0,@4404 6651:D12,664|483b65187303ff5548498b08f6c301740af6c1017405483bd9eb05ff5570ebf67d6e4c89c9f6c101752af6c3017508f601017503ff5570483b19750948c7c103000000eb16488b4908483b65187303ff5548ebd148c7c1010000004883f9017415f6c30174064883c3027105ff5570ebf5e98affffff4889c74989db4c89db498b421090ff1526020000a8017567eb05e9eb010000488b0848833909755c4883780801745a498b52184d89cc4d89c54989feff71084c8b4a104c8b4208488b1a488b0424ff15ee01000049837a4801745341524154415541564153488b442428ff15da0100004889c348b8f86210c9a37f0000eb0fe94b010000e968000000e955000000ff15be01000049c7c0010000004889c3488b442420909090ff15ae010000eb0a41524154415541564153498d7fe8483b7d107303ff55404989ff48c747f802000000488b44240848894708488b442428488907eb5d6a014152415141506a014153eb5448833905755348837808017469498b52184d89cc4d89c54989fe6a014152415441556a014153ff71084c8b4a104c8b4208488b1a488b042490ff153201000049837a480174574156488b442408eb0fe996000000e991000000e972000000909090ff15120100004889c348b8f86210c9a37f0000eb05e9470000009090ff15fe00000049c7c0010000004889c3488b442430909090ff15ee000000eb024156498d7fe8483b7d107303ff55404989ff48c747f802000000584889470858488907eb286a014152415141506a014153eb1a6a014152415141506a014153eb0c6a014152415141506a014153584883c408a80174064883c0027105ff5570ebf54c8b5424104c8b4c240841584883c4184889c34889f8e980fdffffc39090909090909000000000000000009002000000000000|@6658,2097151,@17337,@3852,@4448,@3770,@100,@3643,@4448,@3770,@100,@3643|235,0,@4822 467,0,@4822 6652:S35|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e7473283329 6653:D5,272|483b65187303ff5548488b4a084889c74989d04889fb488b41109090ff1506010000a80174134889c148b8580515c9a37f0000488b5d08ff13488b4808f6c10174084883f9037e08eb47f641ff107441498b5010f6c201752b40f6c7017508f602017503ff5570483b3a750948c7c203000000eb16488b5208483b65187303ff5548ebd048c7c2010000004883fa01750848c7c003000000c3f64020017553498d57d0483b55107303ff55404989d748c742f80500000048c7422001000000488b581848895a18488b70104889721048894a084c8b084c890a4d8b40084d8b50104989d04889fb4c89d09090ff153e00000048c7c001000000c390909090909000000000000000000801000000000000|@6657,2097151,@17336,@3852,@3834|43,0,@6654 6654:O4|@20055,@557,@6656,@6655 6655:O5|@4331,1062,0,1062,0 6656:S26|707573684e6f6e417267756d656e74733a206e6f20656e747279 6657:S45|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e7473283329696e737472732d283129 6658:S53|434f444547454e5f5441424c4528292e707573684e6f6e417267756d656e747328332967657452656769737465724c697374283229 6659:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17338| 6660:D4,64|483b65187303ff5548488b0c244c890c244c89d24d89c24989d94989d048c7c3ffffffff51ff252d000000909090909000000000000000003800000000000000|@6665,2097151,@17339,@6661| 6661:D11,816|483b65187303ff5548a801756941f6c001741a488b4808488b1048b8f00a15c9a37f0000488b5d08909090ff1349833801756df6c30174084883fb017d11eb06f643ff107409498b4a58488b09eb034889d94889caf6c20174064883c2027105ff5570ebf56a016a014151415241ff7008ff7008eb05e972020000514c8d4c24284989d0488b184c89d09090ff15b6020000488b442440488b004883f801eb05e99d0000007507488b442430eb104889c3488b4424309090ff1592020000488b4c244048890158a80174064883c0027105ff5570ebf56a016a01514c8b5424284c8d4c24084c8b4424204889c3488b442418909090e806ffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c2430488908488b4c24285a4883c4204889114889410848c7c0010000004883c418c20800498b086a016a0141514152ff30ff31ff7424384c8d4c2428498b48084989c8488b4008e896feffff488b0424488338017514488b4808f6c10174064883c1207124ff5570ebf548837810037514488b4808f6c10174064883c1107109ff5570ebf5488b4808f6c1017513488b11f641ff10740348f7da488d541201eb034889ca4889d148c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09016a016a016a014989e249c7c1010000004989d0488b5c2420488b442428909090ff1546010000488b4424504883c408488b004883f8017507488b442408eb0f4889c3488b44240890ff1526010000488b4c2448488901488b442420488b50184c8b50484c8b4a104c8b4208488b1a488b44241090ff15020100004983fa01743a488b442410909090ff15f60000004889c348b8f86210c9a37f000090ff15ea00000049c7c0010000004889c3488b442420909090ff15da000000498d47e8483b45107303ff55404989c748c740f802000000488b4c243848894808594883c420488908488b0c24488b5424084889114889410848c7c0010000004883c418c208004983f801741248b8f00a15c9a37f0000488b5d089090ff1349891949c741080100000048c7c001000000c2080090909090909000000000000000002803000000000000|@6667,2097151,@17340,@4813,@6668,@4504,@6666,@4448,@3770,@100,@3643|28,0,@6662 639,0,@4822 757,0,@6662 6662:O4|@20055,@557,@6664,@6663 6663:O5|@3867,2082,0,2082,0 6664:S23|6c64417267733a204c656e677468206d69736d61746368 6665:S61|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f737572652832297075736841726773283129 6666:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17342| 6667:S70|47454e45524154455f434f444528292e636f646567656e28392967656e4576616c28362963616c6c436c6f7375726528322970757368417267732831296c6441726773283329 6668:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17341| 6669:D12,904|483b65187303ff55484889c74989d94889fb498b40109090ff15820300004883f801757057415041515048c7c3030000004889f848baa05f06c9a37f00009090ff15620300004889c348b8804b0fc9a37f000090ff1556030000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab04b0fc9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b0848833909754b4983f9017427488b5108483b15ed020000742c48833a01741448833a03750e48837a0805750748837a1001741248b8101115c9a37f0000488b5d089090ff1348b8a81115c9a37f0000eb684883390175674983f901741048b8d81115c9a37f0000488b5d08ff13498d57b8483b55107303ff55404989d748c742f802000000488b590848895a0848c70201000000488d721848c746f8020000004889560848c70613000000488d461848c740f802000000eb0ae9c2000000e90d00000048c7400801000000488930eb6a48833907741348b8681215c9a37f0000488b5d08909090ff134983f9017429498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70203000000eb2e498d57e8483b55107303ff55404989d748c742f802000000488b590848895a08eb05e94100000048c70205000000498d77d0483b75107303ff55404989f748c746f8020000004889560848c70613000000488d461848c740f80200000048c74008010000004889304989c14889fb498b40109090ff157a010000a801746e57415041515048c7c3030000004889f848baa05f06c9a37f0000ff155e0100004889c348b890dc0ec9a37f000090ff1552010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bab8dc0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13488b4808f6c10174064883c1fe7105ff5570ebf5f6c10174084883f9017f24eb06f641ff10741c574150415149c7c0030000004889fb488b442408ff15c2000000eb56498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b7018488972184c8b50104c89521048894a08488b0848890a6a016a0141514d8b58104989d04889fb4c89d8909090ff1572000000584883c410c39090909000000000000000008003000000000000|@6681,2097151,@17343,@3852,@194,@100,@3805,@3852,@194,@100,@4422,@3834|54,0,@193 75,0,@4505 116,0,@4506 134,0,@557 155,0,@20055 233,0,@6670 251,0,@6673 275,0,@6675 396,0,@6678 604,0,@193 623,0,@4379 664,0,@4380 682,0,@557 703,0,@20055 6670:O4|@20055,@557,@6672,@6671 6671:O5|@4331,2993,0,2993,0 6672:S45|63616c6c436f64653a204e6f7420696e646972656374696f6e207468726f75676820636c6f7375726520726567 6673:O2|@6674,0 6674:O2|9,@544 6675:O4|@20055,@557,@6677,@6676 6676:O5|@4331,2986,0,2986,0 6677:S34|63616c6c436f64653a20696e6469726563742063616c6c20746f20636f6465526566 6678:O4|@20055,@557,@6680,@6679 6679:O5|@4331,2996,0,2996,0 6680:S36|63616c6c436f64653a204e6f74206120636f6e7374616e74206f72207265676973746572 6681:S27|434f444547454e5f5441424c4528292e63616c6c436f6465283329 6682:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17344| 6683:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17345| 6684:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17346| 6685:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17347| 6686:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17348| 6687:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17349| 6688:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17350| 6689:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17351| 6690:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17361| 6691:S26|47454e45524154455f434f444528292e636f646567656e283929 6692:D8,1104|483b65187303ff55484889df4989c04889f848ba40770ec9a37f0000ff154604000048c7c1310000004889c248c7c0010000004889fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7072f000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701ffffff00498d77e0483b75107303ff55404989f748c746f80300000048894e104889460848893e41f6c00174084983f8017d09eb1f41f640ff10751841f6c001740b4c3b05510300007c1ceb0741f640ff10751348b820f007c9a37f0000488b5d08909090ff134c89c0a80174064883c0027105ff5570ebf54889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c8907498d47d8483b45107303ff55404989c748c740f8020000004889780848c70003000000488d481848c741f801000000c641ff40488901498d47d8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f801000000c641ff4048c70101000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700030000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c745000100000057f6c301753e488b3b4c8b374c3b358b0100007520498d7ff0483b7d107303ff55404989ff48c747f801000000488b1b48891feb16ff73085b483b65187303ff5548ebbd48c7c7010000004883ff01756948bb98c809c9a37f0000f6c301753e488b3b4c8b374c3b35390100007520498d7ff0483b7d107303ff55404989ff48c747f801000000488b1b48891feb16ff73085b483b65187303ff5548ebbd48c7c7010000004883ff01751c4889c348b8c0cf09c9a37f0000eb05e92e000000488b5d089090ff13488b1f4c8b334c3b35da00000074115048b878e107c9a37f0000488b5d08ff13488b7b10eb26488b1f4c8b334c3b35bc00000074135048b878e107c9a37f0000488b5d089090ff13488b7b1050498d4798483b45107303ff55404989c748c740f80c000000488b5c2408488958584c8968504889784848895040488948384c8940304c8960284c89502048897018594883c408488948104c8958084c8908c300000000000000004004000000000000fdffffffffffff01|@6693,8191,@17354,@4313,@20127,@20127,@20127,@20127|20,0,@4312 260,0,@1509 805,0,@2635 898,0,@2690 939,0,@1486 977,0,@1486 6693:S29|434f444547454e5f5441424c4528292e74746162437265617465283229 6694:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17355| 6695:D3,112|483b65187303ff5548a801754948833801740948c7c101000000eb0748c7c1030000004883f10251488b400890e8ceffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000006800000000000000|@1363,3,@17356| 6696:D3,104|483b65187303ff5548a801753e48833801752fff30488b4008e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e9b5ffffff48c7c001000000c3909090909000000000000000006000000000000000|@260,3,@17357| 6697:D13,1288|483b65187303ff5548a801756b48833801756af6c3017415488b480848b8d02315c9a37f0000488b5d0890ff136a016a0141504c8d442408488b5b08488b400890e8baffffff488b442410a80174064883e8027105ff5570ebf5498d4fd0483b4d107303ff55404989cf48c741f80200000048894108eb0ae94a040000e94b00000048c70103000000488d411848c740f802000000488b54240848895008488908488b4c2410f6c10174064883e9027105ff5570ebf5488b142448890248894a0848c7c0010000004883c418c3488b08f6c3017414488b500848b8d02315c9a37f0000488b5d08ff136a016a01415041524151ff33ff314c8d442428488b5b08488b48084889c89090e8f2feffff488b442410488b004883f801750948c7c001000000eb114889c348c7c00100000090ff15ea030000488b4c2410488901488b442418488b4c2408f6c10174084883f9017e5deb06f641ff10755a488b142448833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c301751d488b33f643ff10740348f7de488d743601eb0de9b0020000e9ab0200004889de4889f148c7c3030000004883eb014883f97f760748c7c17f00000048d1e948d3e34883cb01488d4c0901ff7040ff7048909090ff15320300004883780801741048b8308a0ec9a37f0000488b5d08ff13498d47b0483b45107303ff55404989c748c740f80300000048c7401001000000488b4c24104889480848c70009000000488b4c2428488b5138488b12488d582048c743f80500000048c743200100000048c743180100000048c743100100000048c743080300000048890352ff7148ff71384989d84889d3488b4110909090ff159e020000488b442410a80174064883c0027105ff5570ebf55948890148833c2401741d49c7c00100000048bb508b0ec9a37f0000488b44243890ff156a020000488b4424384883c408488b1c24488b48104889c89090ff1556020000a801746e5048c7c303000000488b44240848baa05f06c9a37f0000909090ff153a0200004889c348b8688b0ec9a37f000090ff152e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba908b0ec9a37f0000488951184889411048b818df06c9a37f000048894108eb05e91800000048b898b419f1a37f00004889014889c8488b5d089090ff13498d4fd0483b4d107303ff55404989cf48c741f805000000488b502048895120488b5c242048895918488b701048897110488b7808488979084c8b004c89014c8b4c24304989c8488b1c24498b4110ff158a01000048837c240801746f48b8c08b0ec9a37f0000488b542410909090ff1248c7c303000000488b042448baa05f06c9a37f000090ff155a010000488b54241090ff1248b8f08b0ec9a37f0000488b542410909090ff1248c7c303000000488b44242048baa05f06c9a37f0000ff152a010000488b542410eb05e9140000009090ff1248c7c015000000488b5424109090ff12584883c410eb0748c7c0ffffffff498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f802000000488b5424284883c42048895008488908488b0c24488901488b4424104889410848c7c0010000004883c418c34883fb01741048b8d02315c9a37f0000488b5d08ff1349c7000100000049c740080100000048c7c001000000c39090909000000000000000000005000000000000|@6702,2097151,@17358,@6701,@4529,@3834,@3643,@3852,@194,@100,@3834,@194,@194|30,0,@6698 219,0,@6698 511,0,@4328 698,0,@4334 765,0,@193 787,0,@4335 828,0,@4336 846,0,@557 867,0,@20055 984,0,@4337 1015,0,@193 1040,0,@4338 1072,0,@193 1231,0,@6698 6698:O4|@20055,@557,@6700,@6699 6699:O5|@3867,188,0,188,0 6700:S35|4d69736d61746368656420617267756d656e742074797065732f6c69666574696d6573 6701:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17359| 6702:S36|47454e45524154455f434f444528292e636f646567656e2839296d617041726773283229 6703:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17360| 6704:D4,3936|483b65187303ff5548a8017517488b08488b1148bec22515c9a37f0000488d7496fcffe6e9100f000090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e901020000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e947050000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e912080000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e982080000909090e97b000000909090e9ff090000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9440a0000909090498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e9b0fdfffff6400801754d488b5008488b3248833e09754d488b7910483b7e10744848833f0175164c8b561049833a0175514c8b5f084d3b5a087439eb5548833f0375544c8b561049833a03754f4c8b5f084d3b5a08eb05e9f8020000755c4c8b6710eb0ae9eb020000e9060000004d3b621075594883790801740e4883790809eb05e989020000755548837e08017418eb0fe979020000e974020000e96f02000048837e080975596a016a014883790809756648837e0809eb05e95102000075454c8b411841f6c001741eeb05e93e020000f646180174114d8d40ffeb05e92d0200004c0346187105ff5570ebea4989e249c702090000004989e24d894208eb68e90a02000048837e0801741848b8283515c9a37f0000eb05e98a000000488b5d0890ff134c8b411841f6c001740ef646180174084c3b46187c3ceb05ff5570ebf341f6c001740cf646180174064c2b46187105ff5570ebf54983c0014989e249c70209000000eb05e93a0100004989e24d894208eb614c8b561841f6c201740b41f6c00174054d2bd07105ff5570ebf64983c2014989e349c703010000004989e34d895308eb644883790801741248b8283515c9a37f0000488b5d089090ff1348837e080975594c8b411841f6c0017415f6461801eb05e9cb00000074084c3b46187c41eb05ff5570ebf341f6c001740cf646180174064c2b46187105ff5570ebf54983c0014989e2eb05e99700000049c702010000004989e24d894208eb62e9310000004c8b561841f6c201740b41f6c00174054d2bd07105ff5570ebf64983c2014989e349c703090000004989e34d895308eb5148837e0801741348b8283515c9a37f0000488b5d08909090ff134c8b411841f6c0017417f64618017411eb05e9200000004d8d40ff4c0346187105ff5570ebf14989e249c702010000004989e24d8942084d8d47d84c3b45107303ff55404d89c749c740f8040000004c8b5424084d89501849897810415a4883c4084d89500849c700090000004d8d57e84c3b55107303ff55404d89d749c742f8020000004c8b5a084d895a084d890249c7c0030000004c89d0e9a4faffff4d8d57d04c3b55107303ff55404d89d749c742f8020000004c8b5a084d895a084989324d8d621849c74424f80200000049895c240849890c244c89e34c89d0e960faffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e932fafffff64008017559488b5008488b3248833e7d755af64208017559488b7a084c8b1749833a3975614d8b5a084c8b61104d8b6c24084d8b6d0041f6c501750f4d8b6500483b65187303ff5548ebe24d8b7424184d3b73187563488339177562eb05e9c10200004c8b41104d8b20eb0ae9b3020000e9ae0200004d8b242441f6c401740f4983fc01eb05e9990200007f1deb0841f64424ff10741348b8f03515c9a37f0000488b5d08909090ff134d8b204d8b242441f6c4017412eb0ae90b020000e9140000004983ec027105ff5570ebf54d8b284d896500eb564883397d75504c8b41084d8b204d8b242441f6c40174084983fc017f1aeb0841f64424ff10741048b8683615c9a37f0000488b5d08ff134d8b204d8b242441f6c40174064983ec027105ff5570ebf54d8b284d8965004d8d47e84c3b45107303ff55404d89c749c740f8020000004c8b67084d8960084d89104c8b690849bece2c15c9a37f00004f8d74aefc41ffe690e964000000909090e965000000909090e94b000000909090e95e000000909090e95f000000909090e960000000909090e961000000909090e962000000909090e963000000909090e96e000000909090e974000000909090e97f00000090909049c7c513000000eb4849c7c50f000000eb4449c7c511000000eb4949c7c50d000000eb4e49c7c50b000000eb4a49c7c509000000eb4d49c7c507000000eb4449c7c501000000eb3b49c7c503000000eb32e92d000000e92800000049c7c505000000eb1fe91a00000049c7c517000000eb11e90c000000e90700000049c7c5150000004883791803750949c7c605000000eb174883791805740949c7c601000000eb0749c7c603000000498d4fc0483b4d107303ff55404989cf48c741f8040000004c8971184c8b76084c8971104c89690848c701170000004c8d692849c745f80200000049895d0849894d004c89c149c7c0030000004c89eb4889c8e968f7ffff4d8d67b84c3b65107303ff55404d89e749c74424f8020000004c8b6f084d896c24084d8914244d8d74241849c746f8020000004d8966084989364d8d661849c74424f80200000049895c240849890c244c89e34c89f0e90df7ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e9dff6ffff488b5108488b32488b364883fe01751349c7c003000000488b70084889f0e9bcf6ffff488b7208488b364883fe017569f64008017568488b7008488b3e48833f7d75604c8b47084d8b50084d8b124983fa0174094c8b5a084d8913eb224d8d57f04c3b55107303ff55404d89d749c742f8010000004d89024c8b5a084d89134d8d57d04c3b55107303ff55404d89d749c742f802000000eb0fe934000000e92f000000e92a00000049895a0849890a498d5a1848c743f8020000004c89530848893b49c7c003000000488b4608e90df6ffff498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e4889f3488b70084889f0e9dff5fffff64008017563488b5008488b3248833e69742548833e397555488b7e084c8b174d8b1241f6c20174084983fa017f09eb5441f642ff10754d498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b52084c8957084889374c8d5f1849c743f802000000eb0ae9f1000000e91200000049895b0849890b4c89db4889f8e95af5ffff48833e177550488b7e104c8b074d8b0041f6c00174084983f8017f1beb0741f640ff10741248b8f03515c9a37f0000488b5d089090ff134c8b074d8b0041f6c00174064983e8027105ff5570ebf54c8b174d8902eb5248833e7d754c488b7e084c8b074d8b0041f6c00174084983f8017f19eb0741f640ff10741048b8683615c9a37f0000488b5d08ff134c8b074d8b0041f6c00174064983e8027105ff5570ebf54c8b174d8902498d7fe8483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f49c7c0030000004889f8e980f4ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e952f4fffff64008017568488b5008488b3248833e617560488b790840f6c7017410f6460801740a488d7fff48037e087105ff5570ebf14d8d47d04c3b45107303ff55404d89c749c740f8020000004989780849c70061000000498d781848c747f8020000004c8b52084c8957084c8907eb0ae914000000e90f00000049c7c0030000004889f8e9cbf3ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e99df3ffff488b5108f64008017552488b7008488b3e48833f39755e4c8b57084c8b5a184d3b5a1875554883391775684c8b41104d8b204d8b242441f6c40174084983fc017f24eb0841f64424ff10741a48b8f03515c9a37f0000488b5d08eb05e947020000909090ff134d8b204d8b242441f6c4017412eb0ae9e4000000e99a0000004983ec027105ff5570ebf54d8b284d896500eb514883397d754b4c8b024d8b0041f6c00174084983f8017f1beb0741f640ff10741248b8683615c9a37f0000488b5d089090ff134c8b024d8b0041f6c00174064983e8027105ff5570ebf54c8b224d8904244d8d47e84c3b45107303ff55404d89c749c740f8020000004c8b66084d8960084989384d89c549c7c0030000004c89e8e984f2ffff4d8d67d04c3b65107303ff55404d89e749c74424f8020000004c8b6e084d896c240849893c244d8d74241849c746f80200000049895e0849890e4c89f34c89e0e93ff2ffff48833f69742548833f3975634c8b57084d8b1a4d8b1b41f6c30174084983fb017f09eb4b41f643ff1075444d8d57d04c3b55107303ff55404d89d749c742f8020000004c8b5e084d895a0849893a4d8d621849c74424f80200000049895c240849890c244c89e34c89d0e9d0f1ffff48833f17754e4c8b47104d8b104d8b1241f6c20174084983fa017f19eb0741f642ff10741048b8f03515c9a37f0000488b5d08ff134d8b104d8b1241f6c20174064983ea027105ff5570ebf54d8b184d8913eb5248833f7d754c4c8b47084d8b104d8b1241f6c20174084983fa017f19eb0741f642ff10741048b8683615c9a37f0000488b5d08ff134d8b104d8b1241f6c20174064983ea027105ff5570ebf54d8b184d89134d8d47e84c3b45107303ff55404d89c749c740f8020000004c8b56084d8950084989084d89c349c7c0030000004c89d8e9f5f0ffff498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e4889f3488b70084889f0e9c7f0ffff4889d848c7c301000000ff252f000000909090909090900000000000000000580f000000000000|@6735,2097151,@17369,@6722|21,0,$6704+42 859,0,@6705 1021,0,@6705 1196,0,@6705 1640,0,@6709 1743,0,@6712 1829,0,$6704+1846 2765,0,@6709 2851,0,@6712 3249,0,@6709 3353,0,@6712 3671,0,@6709 3755,0,@6712 6705:O4|@20055,@557,@6707,@6706 6706:O5|@6708,160,0,160,0 6707:S20|666f72776172643a20417269746852436f6e7374 6708:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f583836436f64652f5838364f5054494d4953452e4d4c 6709:O4|@20055,@557,@6711,@6710 6710:O5|@6708,54,0,54,0 6711:S9|656c696d696e617465 6712:O4|@20055,@557,@6711,@6713 6713:O5|@6708,52,0,52,0 6714:S25|5838364c4f574c4556454c28292e636f7079436f6465283529 6715:D6,632|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bef1ffffffffffff0f488932498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d8f30ffffff4c3b4d107303ff55404d89cf49c741f8050000004989512049894918498971104d89410849893948c70703000000498d493048c741f80400000048c74118050000004c89491048c741081100000048c70117000000488d512848c742f80200000048c742080100000048890a488d4a1848c741f8020000004c894908488911488d511848c742f802000000488b710848897208488b3948893a4c8d421849c740f8050000004989402049c740183100000048b8288c0cc9a37f00004989401049c740080500000049c7000d000000498d4788483b45107303ff55404989c748c740f80200000048c74008010000004c89004c8d401849c740f8020000004989580849c70015000000498d581848c743f80200000048c74308010000004c89034c8d431849c740f8020000004c8b4a084d89480849c700390000004d8d501849c742f80200000049c74208010000004d89024983fa01741d4989c04c8b1a4889d84c89d3909090ff155e0000004889c34c89c0eb034c8b1a4883fb0174154889c64c89d8909090ff15460000004989c34889f04983fb017501c34c89dbff253800000000000000000000007002000000000000|@6717,1023,@17363,@6718,@6719,@6716|74,0,576460752303423480 377,0,@3807 6716:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17366| 6717:S54|5838364c4f574c4556454c28292e636f7079436f64652835297072656c756465436f64652d74657374526567416e6454726170283229 6718:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17364| 6719:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17365| 6720:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17367| 6721:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17368| 6722:D5,5928|483b65187303ff5548a8017517488b08488b1148be9a3c15c9a37f0000488d7496fcffe6e9db16000090e921020000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e95e020000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e984030000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e9ce040000909090e92b010000909090e9c0120000909090e91b010000909090e9a7130000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e99f130000909090498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e9b0fdffff41514150ff70085351ff71084c8b511049c7c10100000049c7c00100000048c7c301000000488b4424189090ff15be1400004883f8017543498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b0c244889084c8b4c24204c8b4424184889c34883c410584883c410e935fdffff4c8b4c242049c7c0030000004883c4085b4883c418e91bfdffff488b5110488b7208488b3640f6c6017568488b36488b7e08488b3f40f6c701750e488b37483b65187303ff5548ebe54989f0488b32488b3640f6c60174064883ee027105ff5570ebf5488b3a488937498b30488b3640f6c60174084883fe037d23eb06f646ff10741b488b700848b8d05315c9a37f0000eb05e9aa000000488b5d08ff13498b30488b3640f6c60174064883c6027105ff5570ebf54d8b10498932488b3f40f6c70174084883ff017d1ceb06f647ff107414488b700848b8505415c9a37f0000488b5d08ff13498d77c0483b75107303ff55404989f748c746f804000000488b791848897e184c8946104c8b59084c895e0848c706170000004c8d662849c74424f8020000004c8b68084d896c24084989342449c7c0030000004c89e0e9f3fbffff498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e4889f3488b70084889f0e9c5fbfffff6400801754a488b5008488b3248833e2b754a48837e08037548488b7908483b7e10744f48833f0175164c8b561049833a0175534c8b5f084d3b5a087440eb5548833f0375544c8b561049833a03eb05e9ff00000075634c8b5f08eb0ae9f2000000e9ed0000004d3b5a08756c4c8b6710eb05e9060000004d3b6210756048837910017423eb05e98400000049c7c003000000eb0ae976000000e971000000488b4208e91dfbffff4d8d47c84c3b45107303ff55404d89c7eb05e95100000049c740f8030000004c8b56104d89501049c7400801000000eb0ae932000000e92d00000049c7002b0000004d8d582049c743f8020000004c8b62084d8963084d890349c7c0030000004c89d8e9b5faffff4d8d57d04c3b55107303ff55404d89d749c742f8020000004c8b5a084d895a084989324d8d621849c74424f80200000049895c240849890c244c89e34c89d0e971faffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e943fafffff6400801751c488b5008488b32488b3e49ba564215c9a37f00004d8d54bafc41ffe2e9ad0d00009090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9fd010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e902020000909090e93f020000909090e97c020000909090e97b010000909090e9f1050000909090e92e060000909090e963010000909090e95b010000909090e961080000909090e99e080000909090e943010000909090e93b010000909090e90b0c0000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9fc0b0000909090e9cb000000909090e9c3000000909090e9290c0000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e903000000909090498d7fe8483b7d107303ff55404989ff48c747f80200000048895f0848890f4889fb4889d0e9f8f7ffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e9b3f7ffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e96ef7ffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e929f7ffff488b7e1048833f0175154c8b570841f6c20174064983c2207125ff5570ebf548837f100375154c8b570841f6c20174064983c2107109ff5570ebf54c8b570841f6c20175144d8b1a41f642ff10740349f7db4f8d5c1b01eb034d89d34c8b51084c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014d23da4983fb0174574983fb01745648833f017514488b4f08f6c10174064883c1207124ff5570ebf548837f10037514488b4f08f6c10174064883c1107109ff5570ebf5488b4f08f6c101751d4c8b19f641ff10740349f7db4f8d5c1b01eb0de94e020000e9490200004989cb4c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014983f3fe4d23d34983fa0174064983fa017569498d4fe8483b4d107303ff55404989cf48c741f8020000004c8b52084c89510848893148833f0175154c8b5f0841f6c30174064983c3207125ff5570ebf548837f100375154c8b5f0841f6c30174064983c3107109ff5570ebf54c8b5f0841f6c301751b4d8b23eb05e98500000041f643ff10740349f7dc4f8d642401eb034d89dc4989cb4c89e149c7c4030000004983ec014883f97f760748c7c17f00000048d1e949d3e44983cc01488d4c0901498d4fd0483b4d107303ff55404989cf48c741f8020000004c89610848c701310000004c8d611849c74424f80200000049895c240849890c244c89e34c89d8e902f5ffff498d4fb8483b4d107303ff55404989cf48c741f8020000004c89510848c701310000004c8d511849c742f8020000004c8b5a084d895a0849890a498d4a1848c741f8020000004c89510848893148833f0175154c8b570841f6c20174064983c2207125ff5570ebf548837f100375154c8b570841f6c20174064983c2107109ff5570ebf54c8b570841f6c20175144d8b2241f642ff10740349f7dc4f8d642401eb034d89d44989ca4c89e149c7c4030000004983ec014883f97f760748c7c17f00000048d1e949d3e44983cc01488d4c0901498d4fd0483b4d107303ff55404989cf48c741f8020000004c89610848c701310000004c8d611849c74424f80200000049895c240849890c244c89e34c89d0e9ecf3ffff498d4fd0483b4d107303ff55404989cf48c741f8020000004c8b42084c8941084c8b104c89114c8d591849c743f80200000049894b0849893349c7c0030000004c89d8e9a4f3ffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e95ff3ffff488b7e0848833f0175154c8b470841f6c00174064983c0207125ff5570ebf548837f100375154c8b470841f6c00174064983c0107109ff5570ebf54c8b470841f6c00175144d8b1041f640ff10740349f7da4f8d541201eb034d89c24c8b41084c89d149c7c2030000004983ea014883f97f760748c7c17f00000048d1e949d3e24983ca01488d4c09014d23d04983fa0174574983fa01745648833f017514488b4f08f6c10174064883c1207124ff5570ebf548837f10037514488b4f08f6c10174064883c1107109ff5570ebf5488b4f08f6c101751d4c8b11f641ff10740349f7da4f8d541201eb0de914010000e90f0100004989ca4c89d149c7c2030000004983ea014883f97f760748c7c17f00000048d1e949d3e24983ca01488d4c09014983f2fe4d23c24983f80174064983f8017554498d4fc8483b4d107303ff55404989cf48c741f80300000048c74110030000004889790848c701230000004c8d412049c740f8020000004c8b52084d8950084989084c89c149c7c0030000004889c8e9d7f1ffff498d4f98483b4d107303ff55404989cf48c741f80300000048c74110030000004889790848c701230000004c8d512049c742f8020000004d89420849c702310000004d8d421849c740f8020000004c8b5a084d8958084d89104d8d501849c742f8020000004d89420849890a49c7c0030000004c89d0e95cf1ffff498d4fd0483b4d107303ff55404989cf48c741f8020000004c8b42084c8941084c8b104c89114c8d591849c743f80200000049894b0849893349c7c0030000004c89d8e914f1ffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e9cff0ffff488b7e1048833f0175154c8b570841f6c20174064983c2207125ff5570ebf548837f100375154c8b570841f6c20174064983c2107109ff5570ebf54c8b570841f6c20175144d8b1a41f642ff10740349f7db4f8d5c1b01eb034d89d34c8b51084c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014d23da4983fb0174574983fb01745648833f017514488b4f08f6c10174064883c1207124ff5570ebf548837f10037514488b4f08f6c10174064883c1107109ff5570ebf5488b4f08f6c101751d4c8b19f641ff10740349f7db4f8d5c1b01eb0de94e020000e9490200004989cb4c89d949c7c3030000004983eb014883f97f760748c7c17f00000048d1e949d3e34983cb01488d4c09014983f3fe4d23d34983fa0174064983fa017569498d4fe8483b4d107303ff55404989cf48c741f8020000004c8b52084c89510848893148833f0175154c8b5f0841f6c30174064983c3207125ff5570ebf548837f100375154c8b5f0841f6c30174064983c3107109ff5570ebf54c8b5f0841f6c301751b4d8b23eb05e98500000041f643ff10740349f7dc4f8d642401eb034d89dc4989cb4c89e149c7c4030000004983ec014883f97f760748c7c17f00000048d1e949d3e44983cc01488d4c0901498d4fd0483b4d107303ff55404989cf48c741f8020000004c89610848c701310000004c8d611849c74424f80200000049895c240849890c244c89e34c89d8e9a8eeffff498d4fb8483b4d107303ff55404989cf48c741f8020000004c89510848c701310000004c8d511849c742f8020000004c8b5a084d895a0849890a498d4a1848c741f8020000004c89510848893148833f0175154c8b570841f6c20174064983c2207125ff5570ebf548837f100375154c8b570841f6c20174064983c2107109ff5570ebf54c8b570841f6c20175144d8b2241f642ff10740349f7dc4f8d642401eb034d89d44989ca4c89e149c7c4030000004983ec014883f97f760748c7c17f00000048d1e949d3e44983cc01488d4c0901498d4fd0483b4d107303ff55404989cf48c741f8020000004c89610848c701310000004c8d611849c74424f80200000049895c240849890c244c89e34c89d0e992edffff498d4fd0483b4d107303ff55404989cf48c741f8020000004c8b42084c8941084c8b104c89114c8d591849c743f80200000049894b0849893349c7c0030000004c89d8e94aedffff488b7908480b7e084d8d47d04c3b45107303ff55404d89c749c740f8020000004989780849c70031000000498d781848c747f8020000004c8b52084c8957084c890749c7c0030000004889f8e9f9ecffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e9b4ecffff498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b42084c89470848890f4c8d571849c742f80200000049897a0849893249c7c0030000004c89d0e96fecffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a4889d3488b48084889c8e941ecffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c702010000004d89c24c8b58084989dc4989cd4c8b7120ff7118ff7108524889d3488b4110909090ff153e030000488b0c24488b094883f901746e498d4fd0483b4d107303ff55404989cf48c741f8050000004c897120488b5424104889511848894110488b4424084889410848c70135000000498d47e8483b45107303ff55404989c748c740f8020000004c89600848890849c7c0030000004889c34c89d84883c418e97bebffff498d47e8483b45107303ff55404989c748c740f8020000004c8960084c89284d89d04889c34c89d84883c418e94aebffff488b5108488b32488b364883fe01751349c7c003000000488b70084889f0e927ebffff488b7208488b36f6400801756a488b78084c8b1749833a3975624d8b5a084d8b63084d8b24244983fc0175554883fe0174094d8b4308498930eb22498d77f0483b75107303ff55404989f748c746f8010000004889164d8b4308498930498d77d0483b75107303ff55404989f748c746f802000000eb0fe93b000000e936000000e9310000004c8b67084c8966084c89164c8d6e1849c745f80200000049895d0849894d0049c7c0030000004c89eb4889f0e970eaffff498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e4889f3488b70084889f0e942eaffff488b5108488b7208488b3640f6c6017568488b36488b7e08488b3f40f6c701750e488b37483b65187303ff5548ebe54989f0488b32488b3640f6c60174064883ee027105ff5570ebf5488b3a488937498b30488b3640f6c60174084883fe037d26eb06f646ff10741e488b700848b8d05415c9a37f0000eb05e99a000000488b5d08909090ff13498b30488b3640f6c60174064883c6027105ff5570ebf54d8b10498932488b3f40f6c70174084883ff017d1ceb06f647ff107414488b700848b8485515c9a37f0000488b5d08ff13498d77d0483b75107303ff55404989f748c746f8020000004c89460848c7067d000000488d7e1848c747f8020000004c8b58084c895f0848893749c7c0030000004889f8e92ae9ffff498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e4889f3488b70084889f0e9fce8ffff4989194d89410848c7c001000000c3909090909000000000000000002017000000000000|@6737,2097151,@17370,@6738,@6736|21,0,$6722+42 852,0,@6723 931,0,@6726 1487,0,$6722+1510 5677,0,@6729 5759,0,@6732 6723:O4|@20055,@557,@6725,@6724 6724:O5|@6708,215,0,215,0 6725:S18|436f6e646974696f6e616c4272616e636831 6726:O4|@20055,@557,@6728,@6727 6727:O5|@6708,217,0,217,0 6728:S18|436f6e646974696f6e616c4272616e636832 6729:O4|@20055,@557,@6731,@6730 6730:O5|@6708,199,0,199,0 6731:S13|556e636f6e644272616e636831 6732:O4|@20055,@557,@6734,@6733 6733:O5|@6708,201,0,201,0 6734:S13|556e636f6e644272616e636832 6735:S35|5838364f5054494d49534528292e6f7074696d697365283229666f7277617264283329 6736:D4,112|483b65187303ff5548a80175454889df4c8b40084889fb488b009090ff1566000000504889fb4c89c0e8d2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,127,@17374,@6748| 6737:S35|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329 6738:D5,2008|483b65187303ff5548a8017517488b08488b1148befa5615c9a37f0000488d7496fcffe6e98f07000090e9fd010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e933030000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e910040000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e9cd040000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e9cd040000909090e9fd040000909090e951050000909090e981050000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048c7c001000000c208004983f9017517488b500848b8e05e15c9a37f0000488b5d08909090ff13488b511048833a017515488b720840f6c60174064883c6207125ff5570ebf548837a10037515488b720840f6c60174064883c6107109ff5570ebf5488b720840f6c6017513488b3ef646ff10740348f7df488d7c3f01eb034889f7488b71084889f948c7c7030000004883ef014883f97f760748c7c17f00000048d1e948d3e74883cf01488d4c09014923f84883ff0174104883ff01740a48c7c001000000c208004889f1f6c10174064883c1027105ff5570ebf54152ff700853525648c7c3110000004889c848ba50a9dc00000000009090ff12498d4fc0483b4d107303ff55404989cf48c741f801000000488b542408488911488d591048c743f805000000488b742420488973204889431848b8e86f0cc9a37f00004889431048894b0848c7033d000000488b44241048c7c101000000a8017534498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0848890e4889f1488b4008483b65187303ff5548ebc84889c890ff1532040000488b4c2430f6c1017410f6042401740a488d49ff48030c247105ff5570ebf1f6c10174064883c1027105ff5570ebf5498d57c8483b55107303ff55404989d748c742f8030000004883c4085e4883c4084889721048894a0848c70201000000488d4a2048c741f8020000005e4883c408488971084889114883f90174124889de4889cb909090ff15ae0300004889f34889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488918c208004c3b5108743c488b510848833a01751249833a017536488b7208493b72087422eb2a48833a03752449833a03751e488b7208493b72087514488b7a10493b7a10750a48c7c001000000c20800498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e48833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c3017513488b3bf643ff10740348f7df488d7c3f01eb034889df4889f948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901490bd0488b4c240848894c24084989d04889f3488b4008e989faffff4c3b5108743c488b510848833a01751249833a017536488b7208493b72087422eb2a48833a03752449833a03751e488b7208493b72087514488b7a10493b7a10750a48c7c001000000c20800498d77e8483b75107303ff55404989f748c746f80200000048895e0848890e48833a017514488b5a08f6c30174064883c3207124ff5570ebf548837a10037514488b5a08f6c30174064883c3107109ff5570ebf5488b5a08f6c3017513488b3bf643ff10740348f7df488d7c3f01eb034889df4889f948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901490bd0488b4c240848894c24084989d04889f3488b4008e984f9ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c240848895c24084889d3488b48084889c8e94cf9ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c240848895c24084889d3488b48084889c8e914f9ffff4983f9017417488b500848b8805f15c9a37f0000488b5d08909090ff13498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c240848895c240849c7c1030000004889d3488b48084889c8e9b8f8ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c240848895c24084889d3488b48084889c8e980f8ffff498d57e8483b55107303ff55404989d748c742f80200000048895a0848890a488b5c240848895c24084889d3488b48084889c8e948f8ffff48c7c001000000c208009090909090900000000000000000d007000000000000|@6746,2097151,@17371,@6747,@6745|21,0,$6738+42 568,0,@6739 786,0,I108 857,0,@3659 1784,0,@6742 6739:O4|@20055,@557,@6741,@6740 6740:O5|@6708,356,0,356,0 6741:S49|416c6c6f6353746f726520666f756e6420627574206c61737420616c6c6f636174696f6e206e6f7420636f6d706c657465 6742:O4|@20055,@557,@6744,@6743 6743:O5|@6708,360,0,360,0 6744:S41|53746f7265496e697469616c6973656420666f756e642077697468206e6f20616c6c6f636174696f6e 6745:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17373| 6746:S49|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329736561726368416c6c6f63283429 6747:D3,112|483b65187303ff5548a8017545488b0848833971743051488b40089090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9aeffffff48c7c001000000c390909090909000000000000000006800000000000000|@260,3,@17372| 6748:D3,224|488b4808488b09f6c1017565488b09488b5108488b12f6c201750e488b0a483b65187303ff5548ebe6488b104889c8488b0af6c10174064883e9027105ff5570ebf548890a488b08488b09f6c10174084883f9037d23eb06f641ff10741b4889c148b8806215c9a37f0000488b5d08eb05e95300000090ff13488b08488b09f6c10174064883c1027105ff5570ebf5488b3048890e488b12f6c20174084883fa017d1eeb06f642ff1074164889c148b8f86215c9a37f0000488b5d08909090ff1348c70303000000c3c39090909090900000000000000000d800000000000000|@6755,31,@17375|99,0,@6749 176,0,@6752 6749:O4|@20055,@557,@6751,@6750 6750:O5|@6708,234,0,234,0 6751:S14|496e64657865644272616e636831 6752:O4|@20055,@557,@6754,@6753 6753:O5|@6708,236,0,236,0 6754:S14|496e64657865644272616e636832 6755:S51|5838364f5054494d49534528292e6f7074696d69736528322972657665727365283329666f72776172644272616e6368283129 6756:O1|@6757 6757:D3,40|48b890960ac9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@3163,1,@17377|2,0,@3159 6758:O2|@6759,@20053 6759:D8,376|483b65187303ff55484883fb017501c34883f80175044889d8c36a016a014889c64889df4989d14d8b41084889e34889f0909090ff15560100006a016a014d8b41084889e34889f8ff154a010000f644241001756df6042401756c488b442410488b0c24488b10488b1a493b5908741148b878e107c9a37f0000488b5d0890ff13488b31488b3e493b7908741048b878e107c9a37f0000488b5d08ff1341514d89c8488b5e10488b42109090ff15ee000000488b0c24498d57d8483b5510730feb0ae981000000e97c000000ff55404989d748c742f80400000048c74218010000004889421048c742088b000000488b49084883c40848890a48837c2408017507488b442418eb194889d6488b5c2408488b442418909090ff158a0000004889f24889c1498d47e8483b45107303ff55404989c748c740f802000000488948084889104883c420c34883ff0175084889f04883c420c34889fb4889f04883c420ff254a000000909000000000000000007001000000000000|@6761,1048575,@17378,@6762,@6764,@6765,@6766,@6760|114,0,@1486 143,0,@1486 6760:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17383| 6761:S51|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e6d657267655475706c6550726f7073283229 6762:D3,208|483b65187303ff5548a8017570488b084c3b01752e498d57f0483b55107303ff55404989d748c742f80100000048890a488913488b50084889530848c7c001000000c36a016a015351488d5c2410488b4008909090e8a6ffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808eb05e92000000059488908488b0c24488b5424084889114889410848c7c0010000004883c418c348c7030100000048c743080100000048c7c001000000c3909090909090900000000000000000c800000000000000|@6763,79,@17379| 6763:S48|4261636b656e64496e7465726d656469617465436f64652e436f6465546167732e73706c697450726f70732832292829 6764:D3,208|483b65187303ff5548a8017570488b084c3b01752e498d57f0483b55107303ff55404989d748c742f80100000048890a488913488b50084889530848c7c001000000c36a016a015351488d5c2410488b4008909090e8a6ffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808eb05e92000000059488908488b0c24488b5424084889114889410848c7c0010000004883c418c348c7030100000048c743080100000048c7c001000000c3909090909090900000000000000000c800000000000000|@6763,79,@17380| 6765:D3,176|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff134150ff7308ff7008488b1b488b004c89c29090ff12504c8b442418488b5c2410488b442408909090e88affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c390900000000000000000a800000000000000|@3595,1048575,@17381|23,0,@3592 59,0,@3592 6766:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17382| 6767:S21|434f44455452454528292e67656e436f6465283329 6768:D4,120|483b65187303ff55486a016a0141514152ff7424284989da4c8d4c24184c89c149c7c0030000004889cb9090ff155e000000488b442408488b0c24488b10488911488b581048895908488b700848897110488b7c24104889791848c7c0010000004883c418c2080000000000000000007000000000000000|@7026,2097151,@17517,@6769| 6769:D18,1248|483b65187303ff55486a016a016a014152415141504c8d4424189090ff15d604000048833c2401750848837c2428017464488b442410a801753e488b08488b11483b15b9040000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01756c48b898c809c9a37f0000a8017545eb05e90b040000488b08488b11483b1561040000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebb748c7c3010000004883fb01751848b8c0cf09c9a37f0000eb05e92d000000488b5d0890ff13488b03488b08483b0d06040000741148b878e107c9a37f0000488b5d0890ff13488b5010eb26488b03488b08483b0de8030000741348b878e107c9a37f0000488b5d08909090ff13488b5010488b74241040f6c601753e488b3e4c8b074c3b05bf030000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb194c8b4e084c89ce483b65187303ff5548ebbc49c7c1010000004983f901750c48be987015c9a37f0000eb29498b31488b3e483b3d70030000741348b878e107c9a37f0000488b5d08909090ff13488b7e104889fe488b7c24184989f14989d24c8b4710488b1f488b47089090ff153e0300004983fa017418415141525048b8e87015c9a37f00004c89ca9090ff12eb0f4889c148c7c001000000415141525148837c2408017421488b042448bae0d009c9a37f0000909090ff15fa020000488b54241090ff12eb0748c7c001000000ff35eb0200004c8b54244049b9287115c9a37f000049b8b87115c9a37f000048bb00ed06c9a37f0000488b442408909090ff15c202000048837c24080174165048b8287315c9a37f0000488b5424189090ff12eb0b4889c148c7c0010000005148837c2410017421488b042448bae0d009c9a37f0000909090ff1582020000488b54241890ff12eb0748c7c001000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b542440488911498d57e8483b55107303ff55404989d748c742f80200000048bb687315c9a37f000048891a48894a08488062ffbf498d5fc8483b5d107303ff55404989df48c743f80300000048894310488b74243048897308488913488d532048c742f80200000048bf207415c9a37f000048893a48895a08488062ffbf50514889d3488b442410ff15aa0100006a016a016a01488b4c2420488b094883f9017426488b4c2418488b09488b542420488b124889e34889034889e0488948084889e048895010eb2a488b4c2418488b09ffb424800000004c8b9424900000004c8d4c24084989c8488b5c2460ff154e01000048837c243801741648b8e85016c9a37f0000488b542440909090ff12eb0748c7c00100000048837c2438017421488b042448bae0d009c9a37f0000909090ff1512010000488b54244090ff12eb0748c7c001000000488b842488000000488b8c2480000000488984248800000048898c24800000004c8b5424584c8b4c24504c8b442410488b5c2408584883c470e95bfbffff488b442408488b4c2418488908488b4c24204889480848c7c0010000004883c430c21000909090909090900000000000000000d804000000000000|@7048,2097151,@17528,@7049,@20126,@20126,@20126,@20126,@20141,@20141,@7278,@2699,@7280,@7167,@2699,@3169,@7027,@2699|135,0,@2635 231,0,@2690 270,0,@1486 308,0,@1486 417,0,@6770 444,0,@1486 511,0,@6772 557,0,@2697 604,0,@6774 614,0,@6777 624,0,@622 657,0,@6784 701,0,@2697 832,0,@6786 906,0,@6788 1052,0,@7024 1093,0,@2697 6770:O1|@6771 6771:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@17385| 6772:O2|3,@6773 6773:S20|4f7574707574206f662073696d706c6966696572 6774:O1|@6775 6775:D3,24|48c7c001000000c300000000000000001000000000000000|@6776,1,@17386| 6776:S44|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632d283429283129 6777:O1|@6778 6778:D3,40|48b8187215c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@6783,1,@17387|2,0,@6779 6779:O4|@20055,@557,@6781,@6780 6780:O5|@6782,1459,0,1459,0 6781:S30|746f70206c6576656c207265616368656420696e206f7074696d69736572 6782:S51|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f4f5054494d495345522e736d6c 6783:S42|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836292d45 6784:O2|3,@6785 6785:S17|4f7574707574206f6620636c65616e6572 6786:D3,56|488b4208488b00488b4a08488b09f6c10174064883c1027105ff5570ebf5488b520848890ac3909000000000000000003000000000000000|@6787,7,@17388| 6787:S66|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f63657373547265652833296d616b6541646472283129 6788:D4,56|483b65187303ff554849b800ed06c9a37f0000488b5a0848ba887415c9a37f0000ff25290000009000000000000000003000000000000000|@6793,1048575,@17516,@6791|11,0,@622 25,0,@6789 6789:O3|@6791,@6820,@6790 6790:O2|@6849,@6789 6791:D15,2056|483b65187303ff5548488b0848bede7415c9a37f0000488d748efcffe690e97b000000909090e9da000000909090e963000000909090e932010000909090e953000000909090e94b000000909090e938050000909090e903060000909090e933000000909090e92b000000909090e9c7060000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048c7c001000000c34c89c1f6c1017524488b3148833e057512488b71084889f1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017426488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c34c89c1f6c1017524488b3148833e057512488b71084889f1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017427488b52089090ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3488b481048833903756f488b731048c70603000000498d7fd8483b7d107303ff55404989ff48c747f80400000049b9507d15c9a37f00004c890f4889570848895f104c894718488067ffbf4d8d4fd84c3b4d107303ff55404d89cf49c741f8040000004c8b50184d8951184c8b59104d8959104c8b6008eb05e9000100004d89610849c7010700000041505352ff71084152ff711841544889fb4c89c89090ff150e060000498d4fd8483b4d107303ff55404989cf48c741f80400000048bae07d15c9a37f0000488911488b54242048895108488b54242848895110488b54243048895118488061ffbf498d57d8483b55107303ff55404989d748c742f804000000488b5c241048895a18488b5c240848895a105b4883c41048895a0848c70207000000504889cb4889d0ff158a050000498d4fd8483b4d107303ff55404989cf48c741f804000000488941185848894110584883c4184889410848c70103000000498d47f0483b45107303ff55404989c748c740f801000000488908c34883390f756f41505352ff7018ff71084989d84889d3488b48084889c8ff15220500004889c34889d8ff151e050000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424204889410848c70101000000498d47e8483b45107303ff55404989c748c740f802000000eb05e91a01000048c74008010000004889086a016a01488b4c2420534c8d54240849c7c1010000004c8b4424184889c3488b442430488b511090ff12498d47d8483b45107303ff55404989c748c740f804000000488b4c242048894818488b4c241048894810594889480848c7000700000048833c240174634989c0488b04249090ff155a040000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f80200000048c74008010000004889084883f80175054c89c0eb314889c1498d47e0483b4510730aeb05e91d000000ff55404989c748c740f8030000004c8940104889480848c700150000004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c438c341505352ff7018514989d84889d3488b4008909090ff15ae0300004889c34889d8ff15aa030000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424204889410848c70101000000498d47c0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f80400000048ba387e15c9a37f0000488911488b54241048895108488b5424184889511048894118488061ffbf534889cb488b4424089090ff151e030000498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424104889511848894110584883c4284889410848c70107000000498d47f0483b45107303ff55404989c748c740f801000000488908c34883781801756e498d4fa0483b4d107303ff55404989cf48c741f8030000004c894110488b70104889710848c70105000000488d792048c747f80200000048c747080100000048890f488d4f1848c741f80400000049b8907e15c9a37f00004c8901488951084889591048897918488061ffbfeb05e951000000564889cb488b4008909090ff154a020000498d4fc8483b4d107303ff55404989cf48c741f80400000048c74118010000005a488951104889410848c7010d000000488d412848c740f801000000488908c348c7c001000000c36a016a014989e249c7c1030000004c89c14c8b40084889de4889cb4889f0488b5210ff1248833c24017507488b442408eb6e488b0424ff15ce010000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f80200000048c74008010000004889084883f8017507488b442408eb364889c1498d47e0483b45107303ff55404989c748c740f803000000eb05e914000000488b542408488950104889480848c700150000004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c341505352ff70104c8b4a104989d84889d3488b400890ff151a010000498d4fd8483b4d107303ff55404989cf48c741f80400000048bae87e15c9a37f0000488911488b54240848895108488b54241048895110488b54241848895118488061ffbf504889cb488b442408ff15ce000000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c4204889410848c70115000000498d47f0483b45107303ff55404989c748c740f801000000488908c390909090909000000000000000000008000000000000|@6799,1048575,@17394,@3169,@3169,@6800,@6802,@6803,@6804,@6806,@3169,@3169,@6807,@6798,@3169|14,0,$6791+30 412,0,@6792 556,0,@6794 1283,0,@6795 1506,0,@6796 1904,0,@6797 6792:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17389| 6793:S35|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283129283129 6794:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17390| 6795:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17391| 6796:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17392| 6797:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17393| 6798:D4,128|483b65187303ff5548a80175554151415053ff7008488b00ff157a000000504c8b4c24204c8b442418488b5c2410488b4424089090e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,1048575,@17406,@6808| 6799:S32|434f4445545245455f4f5054494d4953455228292e6f7074696d697365283329 6800:D4,216|483b65187303ff5548a801756f488b08498d57e0483b55107303ff55404989d748c742f80300000048be288115c9a37f000048893248895a084c894210488062ffbf415053ff7008ff71084889d3488b01909090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901eb05e93d000000514c8b442418488b5c2410488b442408e86affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390900000000000000000d000000000000000|@1363,1048575,@17396,@3169|42,0,@6801 6801:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17395|11,0,@545 6802:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17397| 6803:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020100000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@17398| 6804:D4,216|483b65187303ff5548a801756f488b08498d57e0483b55107303ff55404989d748c742f80300000048bec88315c9a37f000048893248895a084c894210488062ffbf415053ff7008ff71084889d3488b01909090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901eb05e93d000000514c8b442418488b5c2410488b442408e86affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390900000000000000000d000000000000000|@1363,1048575,@17400,@3169|42,0,@6805 6805:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17399|11,0,@545 6806:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17401| 6807:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020100000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@17402| 6808:D7,544|483b65187303ff5548488338017571498d4fe0483b4d107303ff55404989cf48c741f80300000048bac88715c9a37f0000488911488959084c894110488061ffbfff7018ff7010ff70084889cb488b4020909090ff15de0100004889c1498d47d0483b45107303ff55404989c748c740f80500000048894820488b4c2410eb05e91e00000048894818488b4c240848894810594883c4104889480848c70001000000c3488338057568498d4fe0483b4d107303ff55404989cf48c741f80300000048ba208815c9a37f0000488911488959084c894110488061ffbf4889cb488b40089090ff15560100004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c348833807756d488b400848c7c10100000041504151a801752bff70084c8b4c24104c8b4424084889cb488b00909090ff15020100004889c158483b65187303ff5548ebd14889c84889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700070000004883c410eb05e901000000c3498d4fd8483b4d107303ff55404989cf48c741f80400000048ba788815c9a37f0000488911488959084c894110488b500848895118488061ffbfff7010524889cb488b401890ff157a0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c240848894810594883c4084889480848c70003000000c39000000000000000001802000000000000|@6816,1048575,@17407,@3169,@3169,@6812,@3169|41,0,@6809 195,0,@6810 420,0,@6811 6809:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17403|11,0,@545 6810:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17404|11,0,@545 6811:D3,48|483b65187303ff55484c8b4218488b5a10488b4a084889caff2290909090909000000000000000002800000000000000|@6793,1048575,@17405| 6812:D5,224|483b65187303ff55486a016a0153ff30ff70084c8d5424184c89c949c7c1050000004c89c24c8b4010488b5c24084889c8909090ff12488b4424204883380f741048b8e88915c9a37f0000488b5d08ff13498d4fe0483b4d107303ff55404989cf48c741f803000000488b4008488941105848894108488b04244889014989c94889c34883c408488b442408ff156600000048833c2401740d488b1c24909090ff155a0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89084883c418c39090900000000000000000d800000000000000|@6818,1048575,@17408,@6819,@6817|67,0,@6813 6813:O4|@20055,@557,@6815,@6814 6814:O5|@6782,945,0,945,0 6815:S22|6d617062696e64696e673a206e6f74206c616d626461 6816:S45|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e67283129 6817:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17410| 6818:S57|434f4445545245455f4f5054494d4953455228292e6f7074696d6973652833296d617062696e64696e672831296d6170526563446563283229 6819:D3,136|483b65187303ff5548a8017561488b08498d57e0483b55107303ff55404989d748c742f803000000488b710848897210488b3948897a0848891a524c8b40084c89c0909090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008000000000000000|@1363,127,@17409| 6820:O2|@6821,@6789 6821:D14,1696|483b65187303ff55484c89c148c7c601000000f6c1017538488b3948833f05751d40f6c601740ef64708017408483b77087d0beb05ff5570ebf3488b7708488b79084889f9483b65187303ff5548ebc34889f14889ce40f6c60174064883c6027105ff5570ebf54883fe01746b40f6c60174084883fe017d08eb33f646ff10752d53525051ff33ff731056415048bb081f0bc9a37f00004889f048ba90c8dc0000000000ff124883f8017421eb0c53525051ff33ff731056415048b8181f0bc9a37f0000488b5d08909090ff13488b442408a801740deb05e9230000004883c07e7105ff5570ebf548c7c38100000048ba90a9dc0000000000909090ff12eb164889c748c7c00300000053525751ff33ff73105641504889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f5857a8017569488b08488339057565488b5108f6c20174084883fa017d08eb20f642ff10751af6c2017410f6442408017409483b5424087c1eeb05ff5570ebf2488b580848b800260bc9a37f0000488b5d08909090ff136a016a01ff70084c8d44240848c7c3110000004889d0eb0ae994000000e97500000048ba50a8dc0000000000909090ff12488b442408488b4c241848d1e8480fb60401488d440001488b4c241048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901480bc2488b4c2418488b54240848d1ea48d1e848880411488d440001488d541201eb076a016a01ff7008584883c410483b65187303ff5548e9fafeffff48c7c00100000048c7c001000000488b4c24084883f901746d4889ca4883ea024889cb4883eb024883e9026a016a015052534c8d44241848c7c3110000004889c848ba50a8dc0000000000909090ff12488b442418488b4c242848d1e8480fb60401488d440001488b4c242048c7c2030000004883ea014883f97f760748c7c17f000000eb05e97800000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f803752a498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b0c24488908eb05488b4424104883c408594883c418483b65187303ff5548e910ffffff4883c4105948c70103000000a801756648837808017564ff30ff3534030000ff30488d5c2408488b442428ff152a030000488b4c2430498d57e0483b55107303ff55404989d748c742f80300000048bb609315c9a37f000048891a488b490848894a08488b4c243848894a10488062ffbf4889d3eb0ae969000000e964000000909090ff15da020000ff342450ff35d8020000488b442418a80174064883c0027105ff5570ebf54889e390ff15c20200004889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d0000004883c458c35048c7c001000000488b5424089090ff1248c7c101000000488b1424f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d5a1848c743f8020000004889530848c70309000000ff342453ff3513020000515053488d5c2418488b4424489090ff1506020000488b4c2450498d57e0483b55107303ff55404989d748c742f80300000048bbb89315c9a37f000048891a488b490848894a08488b4c245848894a10488062ffbf4889d3909090ff15c2010000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44241048894118488b5424084889511048c741080100000048c70101000000488b5c2440f6c30174064883c3027105ff5570ebf5a8017508f6c3017503ff5570483bc3754252ff356001000051488d5c24089090ff155a010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb534889cf4c8b0c244c8b44243048c7c30100000048c7c001000000909090ff1512010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d0000006a016a0157498d47e8483b45107303ff55404989c748c740f80200000048c74008010000005a4883c4484889104883f80175084889c84883c428c34889c2498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c700150000004883c428c3909090909000000000000000009806000000000000|@6825,2097151,@17413,@6826,@6828,@3169,@6830,@1354,@6832,@6828,@3169,@6843,@1354,@6824|143,0,@3307 156,0,I233 188,0,@3308 241,0,I109 416,0,@3316 469,0,I104 677,0,I104 949,0,@6822 1281,0,@6823 6822:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17411|11,0,@545 6823:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17412|11,0,@545 6824:D3,304|483b65187303ff554841f6c0017567a801750941f600017503ff5570493b00755a498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488959104c89490848c7010d000000a80174064883c0027105ff5570ebf5f6c30174064883c3027105ff5570ebf5514d8b4008eb0ae99c000000e92a00000090e87affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3a80174064883c0027105ff5570ebf5498d4fe8483b4d107303ff55404989cf48c741f802000000498b500848895108498b304889314989c8909090e816ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848b980d606c9a37f0000488908c348c7c001000000c39000000000000000002801000000000000|@6848,223,@17422|267,0,@509 6825:S33|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329 6826:D4,104|483b65187303ff554848833805751149c7c001000000488b5a08ff25600000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b5208488950104889480848c7000d000000c39000000000000000006000000000000000|@6827,1048575,@17414,@2178| 6827:S42|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296669656c642d283129 6828:D3,464|483b65187303ff5548488b0848ba969615c9a37f0000488d548afcffe290e978000000909090e9ab000000909090e963000000909090e95b000000909090e953000000909090e9e4000000909090e943000000909090e93b000000909090e933000000909090e913010000909090e90c010000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904889daff22ff7010488b4008909090e856ffffff4889c1498d47e0483b45107303ff55404989c748c740f8030000005a488950104889480848c70001000000c353ff7008ff7018488b4010e81affffff50488b5c2418488b442408e80affffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818594883c40848894810594883c4084889480848c70003000000c353ff7010488b40089090e8c2feffff50488b5c2410488b442408e8b2feffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4104889480848c7000b000000c3c3ff7008488b4010909090e872feffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70015000000c39090909090900000000000000000c801000000000000|@6829,1048575,@17415|14,0,$6828+30 6829:S49|434f4445545245455f4f5054494d4953455228292e6f70744669656c647328332970757368436f6e7461696e6572283229 6830:D3,56|a8017509f64210017503ff5570483b4210740b48b880d606c9a37f0000c3488b4208c3909090909000000000000000003000000000000000|@6831,5,@17416|21,0,@509 6831:S44|434f4445545245455f4f5054494d4953455228292e6f70744669656c64732833296d6b4669656c6473283129 6832:D4,104|483b65187303ff55485250488b421090ff156a000000488b4c24084889c2498d47d8483b45107303ff55404989c748c740f804000000488b49084889481848895010594883c4084889480848c70019000000c3909090909000000000000000006000000000000000|@6839,2097151,@17418,@6833| 6833:D5,656|483b65187303ff55484889c148c7c2fffffffff6c1017528f6c201740cf601017407483b117d0aeb05ff5570ebf4488b11488b4908483b65187303ff5548ebd34889d1f6c10174064883c1027105ff5570ebf54883f9017473f6c10174084883f9017d08eb2cf641ff107526515048bb081f0bc9a37f00004889c848ba90c8dc0000000000909090ff124883f8017415eb02515048b8181f0bc9a37f0000488b5d0890ff13488b442408a80174064883c07e7105ff5570ebf548c7c38100000048ba90a9dc0000000000eb05e907000000909090ff12eb0c4889c248c7c00300000051524889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f5857a801756e488b08f6c10174084883f9017d08eb20f641ff10751af6c1017410f6442408017409483b4c24087c1eeb05ff5570ebf2488b500848b800260bc9a37f0000488b5d08909090ff136a016a01ff70084c8d44240848c7c3110000004889c848ba50a8dc0000000000909090ff12eb05e977000000488b442408488b4c241848d1e8480fb60401488d440001488b4c241048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901480bc2488b4c2418488b54240848d1ea48d1e848880411488d440001488d541201584883c410483b65187303ff5548e912ffffff48c7c001000000ff3424ff35800000006a016a014989e0488d5c2410488b44242848bab89c15c9a37f000090ff1566000000488b442408488060ffbf498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c428488908c3909000000000000000008802000000000000|@6841,2097151,@17419,@6840,@6835|112,0,@3307 125,0,I233 150,0,@3308 194,0,I109 356,0,@3316 397,0,I104 571,0,@6834 6834:O2|@6835,@3307 6835:D3,592|483b65187303ff5548a80174084883f8017d1eeb06f640ff1074164889c148b8489f15c9a37f0000488b5d08909090ff134883f801750948c7c103000000eb6aa80174084883f8017d08eb1df640ff107517a801740ef64208017408483b42087e1beb05ff5570ebf34889c148b8181f0bc9a37f0000488b5d0890ff134889c1f6c10174064883c17e7105ff5570ebf54150505348c7c3810000004889c848ba90a9dc0000000000eb05e90800000090ff124889c1eb044150505348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48c7c00100000048c7c10300000048c7c20100000048c7c30100000057f6c3017410f6442410017409483b5c24107d64eb05ff5570ebf2525351504889d8488b54242890ff124883f801740b488b442408480b0424eb03586a0148817c2408010100007560488b4c2420488b54241848d1ea48d1e848880411488d440001488d541201488b442410a80174064883c002710ceb05e964000000ff5570ebee4883c2024889c348c7c10300000048c7c0010000004883c420483b65187303ff5548e958ffffff488b4c2410f6c10174064883c1027105ff5570ebf5488b542408488d5412ff4889cb4889d14883c4185a483b65187303ff5548e920ffffff4883f8017418488b0c2448d1ea48d1e848880411488d440001488d541201488b442418488b4c2410488908594883c4104889480848c7c0010000004883c408c39090909090909000000000000000004802000000000000|@6838,2097151,@17417|32,0,@6836 110,0,@3308 160,0,I109 6836:O4|4,@103,0,@6837 6837:O5|@3310,114,0,114,0 6838:S12|746162756c61746527283229 6839:S48|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329736574436f6e7461696e6572283129 6840:D3,160|483b65187303ff55486a016a01524c8d44240848c7c31100000048ba50a8dc0000000000ff12488b04244883c40859488b400848d1e9480fb60c08488d4c09014889c85948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f002c39090909090909000000000000000009800000000000000|@6842,2097151,@17420|28,0,I104 6841:S38|434f4445545245455f4f5054494d4953455228292e6669656c6473546f46696c746572283129 6842:S22|426f6f6c41727261792e766563746f72283129283129 6843:D3,160|488b4a08f6c10174084883f9017c08eb1cf641ff1074164889c348b8f0a115c9a37f0000488b5d08909090ff13498d5fa8483b5d107303ff55404989df48c743f80200000048894b0848c70305000000488d731848c746f80200000048895e0848c706090000004889c3488d461848c740f80400000048c7401801000000488958104889700848c7000d000000c3909000000000000000009800000000000000|@6847,31,@17421|28,0,@6844 6844:O4|@20055,@557,@6846,@6845 6845:O5|@2182,247,0,247,0 6846:S27|6d6b4c6f616478783a20617267756d656e74206e65676174697665 6847:S47|434f4445545245455f46554e4354494f4e5328292e6d6b5475706c6546726f6d436f6e7461696e6572283229283129 6848:S53|434f4445545245455f4f5054494d4953455228292e6f70744669656c6473283329636f6e7461696e65722d6d6b4669656c64283329 6849:D24,3920|488dbc2420ffffff483b7d187303ff5550498378100174204889d6488b78104c8b58084c8b204889d8498b5810909090ff15320f0000eb1d488b4810488b7008488b384889d84889fb4889cf4989f34989dc4889d64983f905740948c7c101000000eb0748c7c103000000498b1048833a0775514883f9017550488b4a0848c7c3010000004883f901750948c7c103000000eb604c8b294d8b750049833e0975584d8b6e0849837d000175604c8b294d8b75004d8b6e08f6c301751641f6450801750feb0ae9df010000e9da010000ff5570493b5d08752bf6c30174064883c3027105ff5570ebf5488b4908483b6518730feb0ae91a000000e90e000000ff5548eb8248c7c101000000eb0748c7c1010000004883f901745f488b4a08498b582041524883f90175184883fb01740948c7c101000000eb4c48c7c103000000eb43f6c30175374c8b114c8b2b4d8b72084d3b750075194c8b6b084c89eb4c8b69084c89e9483b65187303ff5548ebb448c7c101000000eb0ce93200000048c7c1010000004883f901741c488b4a18493b4838740948c7c301000000eb1b48c7c303000000eb1248c7c301000000eb0948c7c30100000041524883fb01750948c7c101000000eb5e488b4a10488339097559488b590848833b0375734d8b50184c8b6b0841f6c20174144989c648b8c0e406c9a37f0000488b5d0890ff134983fd0175054d8b12eb2c41f6c50174064983ed027105ff5570ebf54d8b5208483b6518730feb0ae988000000e94a000000ff5548ebaf4d8d6fd84c3b6d107303ff55404d89ef49c745f802000000eb05e91d0000004d89550849c7450009000000498d4d1848c741f8010000004c8929eb4248c7c101000000eb39488339057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b5210488911eb1248c7c101000000eb0948c7c10100000041524883f9017565498378280175634889c1f6c1017524488b1148833a03750948c7c303000000eb19488b51084889d1483b65187303ff5548ebd748c7c3010000004883fb017469498d47f0483b45107303ff55404989c748c740f801000000c640ff40498b4830488908eb0ae9f90b0000e932010000498d57e8483b55107303ff55404989d748c742f80200000048bb20b315c9a37f000048891a48894208488062ffbf498d5fc0483b5d10730aeb05e9f3000000ff55404989df48c743f80300000048897b104c895b08488913488d532048c742f80300000048bfc0b315c9a37f000048893a488b76084889720848895a10488062ffbf41ff703841ff702841ff702041ff701841ff701041ff7008504889d3498b00ff15a20b000059488b09498d57a0483b55107303ff55404989d748c742f808000000488b5c242848895a3848894a30488b4c242048894a28488b4c241848894a20488b4c241048894a18488b4c240848894a10594883c42848894a08488902488d424848c740f8020000004889500848c7000f000000488b0c2448c701010000004889410848c7c0010000004883c408c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40498b5030488911498d5fe8483b5d107303ff55404989df48c743f80200000049ba18b415c9a37f00004c891348894b08488063ffbf4d8d57c04c3b55107303ff55404d89d749c742f80300000049897a104d895a0849891a498d5a2048c743f80300000049bd78b415c9a37f00004c892b488b7608488973084c895310488063ffbf41ff703841ff702841ff702041ff701841ff701041ff7008574153504154514151498b0090ff15560a0000488b4c2420f6c101753e488b11488b1a483b1d470a0000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1df5090000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751c4889c148b8c0cf09c9a37f0000eb05e932000000488b5d089090ff13488b0e488b11483b159609000074154889c348b878e107c9a37f0000488b5d089090ff13488b5910eb26488b0e488b11483b157409000074134889c348b878e107c9a37f0000488b5d08ff13488b591048c7c7010000004c8b44244841f6c001752040f6c70174064883c7027105ff5570ebf54d8b4008483b65187303ff5548ebda4883fb01740e48833c2401750748c7c3d1070000504989d84889fb9090ff150e0900006a016a016a01488338077527488b442428488b004889e148c701030000004889e1488b542418488951084889e148894110eb5a488338037559488b500848b9ffffffffffffff0048234af8488d4c090148c7c301000000483bd9720948c7c301000000eb41488b749afc4883fe017427498d5ff0483b5d107303ff55404989df48c743f801000000488933eb19e933010000e9b90000004883c302483b65187303ff5548ebb14883fb01746e48c7c101000000488b5c2460f6c301751ff6c10174064883c1027105ff5570ebf5488b5b08483b65187303ff5548ebdc488b5c2428488b1bff742478534c8b5424604989c94989d0488b5c2478488b442428ff15120800004889e148c701010000004889e1488941084889e0eb05e90a00000048c7401001000000eb65488b4c2428488b094889e348c703030000004889e3488b742418488973084889e348894b10eb694883380575434c8b4c24284c8b4008488b5c2468488b44241890ff15ae070000488b4c2428488b094889e248c702010000004889e2488942084889e0eb05e93200000048894810eb2c488b442428488b004889e148c701010000004889e1488b54241848895108eb05e9070000004889e148894110498d47b8483b45107303ff55404989c748c740f808000000488b4c247848894838488b4c2410488948305948894828488b4c246048894820488b54245848895018488b54245048895010488b54244848895008488b14244889106a016a0148837c247803755c5048c7c303000000488b4424489090ff15e606000048833801755ef6400801755d488b4808f64108017558488b5108488b5c241848833b0f7566498d77d0483b75107303ff55404989f748c746f80200000048c7460801000000eb05e95e050000488b3a48893e4c8d461849c740f80200000049897008eb0fe9a1000000e99c000000e997000000488b31498930f6420801751149b930e306c9a37f0000eb09e92d0000004c8b48104d8d57e04c3b55107303ff55404d89d749c742f8030000004d894a104d89420849c70201000000eb50498d77c8483b75107303ff55404989f748c746f80200000048c7460801000000488b3948893e4c8d561849c742f80300000049b830e306c9a37f00004d8942104989720849c70201000000eb034989c24152488b842480000000909090ff15ce0500006a016a01488b4c241048833901755ff6410801755e488b5108488b5c246048c7c601000000ff7110ff720850f6c301755c488b0348833801753eff730856488b48104889c890ff158a050000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901eb10e995010000e9900100004889f1ff73084889ce5b483b65187303ff5548eb9f4889f0a80174134889c148b8d0b415c9a37f0000488b5d08ff13f64008017544488b4808488b7108488b19488b104889d0ff151a0500004889c1498d47e8483b45107303ff55404989c748c740f80200000048897008488908483b65187303ff5548eb9f488b005b90ff15ea040000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151488b442440ff15c6040000488338057552488b4c2408488339037560488b4c24704883f901750948c7c101000000eb5a488b1148833a017556488b5a08f6c301752b488b3348833e05750948c7c703000000eb20488b73084889f3483b6518730aeb05e968000000ff5548ebd048c7c7010000004883ff01741aeb05e94f00000048c7c103000000eb34e92f000000e915000000488b51084889d1483b65187303ff5548e978ffffff488b51084889d1483b65187303ff5548e963ffffff4883f901751148b830e306c9a37f0000eb05488b442408488d4c24105a4883c4084889114889e148894108eb66488b4c2460f6c1017524488b1148833a03750948c7c303000000eb19488b51084889d1483b65187303ff5548ebd748c7c3010000004883fb01744b498d4fe8483b4d107303ff55404989cf48c741f80200000048c741080100000048890151488b442438eb05e936000000909090ff157a030000488d4c24085a4889114889e148894108eb1b4889e048c700010000004889e048b930e306c9a37f000048894808f60424017563488b0424f64008017525488b44247048c700030000004c8d442420488b5c2458488b4424189090ff1522030000eb5b488b4c240848833905752e488b44247048c700030000004c8d4c24204c8b442458488b5908488b4424189090ff15f6020000eb53e917010000488b08f6c1017554488b1148833a017550f6420801754f488b5a0848837b0801eb05e9650100007511488b721048833e05750748837e1001745b488b3340f6c6017543488b3e48833f057528eb05e93901000048837f1001751aeb0fe964000000e934000000e94500000049c7c003000000eb19488b7e084889fe483b65187303ff5548ebb749c7c0010000004983f8017514eb1be90d00000048833a05751048837a1001750948c7c303000000eb1c488b51084889d1483b65187303ff5548e93effffff48c7c3010000004883fb017429488b4c247048c701030000004c8d4c24204c8b442458488b18488b442418909090ff15fe010000eb64488d442420488b4c2418488908488d44242048c7400801000000eb57488b442408488338057529488b4c247048c701030000004c8d4c24204c8b442458488b5808488b4424189090ff15b6010000eb41488d442420488b4c2418488908488d442420eb05e92800000048c7400801000000eb1ee9190000004889e14889014889e048c74008010000006a016a016a016a01488b442420488378280175334883bc2498000000037528f6442460017515488b4c2460488b1148833a0375074883790801740c488b4c247048c70103000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010f000000488b8424a80000004883c4285a4883c4784889104889480848c7c0010000004883c408c3488b042448c70001000000488b094889480848c7c0010000004883c408c3909090909090900000000000000000480f000000000000|@6869,2097151,@17431,@6870,@3169,@3169,@20123,@20123,@20123,@20123,@6871,@6875,@6899,@6905,@6924,@6925,@6928,@6929,@6930,@6930,@6935,@6857,@6954,@6857|494,0,@578 833,0,@6850 909,0,@6852 1174,0,@6853 1243,0,@6854 1401,0,@2635 1494,0,@2690 1537,0,@1486 1579,0,@1486 1745,0,36028797018963967 2387,0,@573 2499,0,@573 2699,0,@6855 3029,0,@573 3215,0,@573 6850:D3,56|488b4208488b00488b4a08488b09f6c10174064883c1027105ff5570ebf5488b520848890ac3909000000000000000003000000000000000|@6851,7,@17423| 6851:S47|434f4445545245455f4f5054494d4953455228292e6f70744c616d6264612834296f7074436f6e746578742d283129 6852:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17424|11,0,@545 6853:D3,56|488b4208488b00488b4a08488b09f6c10174064883c1027105ff5570ebf5488b520848890ac3909000000000000000003000000000000000|@6851,7,@17425| 6854:D3,48|483b65187303ff554849b890da06c9a37f0000488b5a10488b4a084889caff2200000000000000002800000000000000|@6793,1048575,@17426|11,0,@545 6855:O4|@20091,@1627,0,@6856 6856:O5|@6782,504,0,504,0 6857:D9,1416|488dbc2460ffffff483b7d187303ff55504151ff7038ff7020ff700853ff7028ff7030ff7018ff30415048c7c0010000004c89c2ff125048c7c001000000488b54240890ff1248c7c101000000488b542418f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70203000000488d4a1848c741f80200000048bb08bb15c9a37f000048891948895108488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048bed8bb15c9a37f000048893348894b0848895310488063ffbf50488b44241890ff15a604000048c7c101000000488b542448f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc498d57a8483b55107303ff55404989d748c742f80200000048894a0848c70201000000488d4a1848c741f8020000004889510848c70109000000488d511848c742f80400000048894a18488b4c243848894a104889420848c702190000004889d3488b442448ff1512040000498d4fd0483b4d107303ff55404989cf48c741f802000000488b14244889510848c70105000000488d711848c746f80200000048c746080100000048890e4883fe017507488b4c2420eb1e4889c74989d84889f3488b44242090ff15ba0300004889c14889f84c89c3488b542428f6c20174064883c2027105ff5570ebf5498d77b8483b75107303ff55404989f748c746f80800000048c746380300000048895630488b542430488956284889462048894e1848b890da06c9a37f000048894610488b4424404889460848891e498d4fe8483b4d107303ff55404989cf48c741f80200000048897108488b542408488911488b5c243848c7c60100000048c7c70100000051ff33483b3c24736f4889f84883c002488b4c24486a016a015650ff71084c8d44241848c7c3110000004889f848ba50a8dc0000000000909090ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01eb05e957000000488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085f4883c4184889c6483b65187303ff5548e92fffffff4989f048c7c3010000004883c408488b442450909090ff152e0200009090ff152e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba804507c9a37f0000488951104889410848c70107000000498d47b8483b45107303ff55404989c748c740f805000000488948204c89401848c740100100000048c740080100000048c70001000000488d483048c741f80200000048c74108010000004889015148bbb8be15c9a37f0000488b442448909090ff159601000048833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c70015000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424184883c4084889510848c70105000000498d57a0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f808000000488b5c24584889593848c741300300000048c7412801000000488b5c2450488959204889511848ba90da06c9a37f000048895110488b54244848895108488901498d47e8483b45107303ff55404989c748c740f80200000048894808488b542408488910498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f802000000488950085a4883c458488910488b142448890a4889420848c7c0010000004883c408c300000000000000008005000000000000|@7019,2097151,@17511,@3169,@7020,@7021,@7022,@7018,@6980|167,0,@6858 213,0,@6860 587,0,@545 713,0,I104 948,0,@1076 1052,0,@6865 1258,0,@545 6858:D3,104|488338097544488b400848833807753a498d47d8483b45107303ff55404989c748c740f802000000488b52084889500848c700090000004889c1488d401848c740f801000000488908c348c7c001000000c390909090909000000000000000006000000000000000|@6859,7,@17427| 6859:S45|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329646f4d6170283129 6860:D4,304|483b65187303ff55484883380f756e488b4808ff7138ff7130ff7128ff7120ff7110ff7108ff31488b5a08488b411890ff1512010000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b5424184889512048894118488b442410eb05e94b00000048894110488b44240848894108584883c430488901498d47d8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c1488d401848c740f801000000488908c3488338097544488b400848833807753a498d47d8483b45107303ff55404989c748c740f802000000488b52104889500848c700090000004889c1488d401848c740f801000000488908c348c7c001000000c39000000000000000002801000000000000|@6864,1048575,@17428,@6861| 6861:D4,192|483b65187303ff5548a801756e498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000053ff70084889c89090ff15960000004883380974154889c148b828be15c9a37f0000488b5d089090ff13ff7008488b5c2410488b442408909090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@1363,1048575,@17429,@3169|77,0,@6862 6862:O4|@20055,@557,@2262,@6863 6863:O5|@6782,230,0,230,0 6864:S39|434f4445545245455f4f5054494d4953455228292e6f6e6c7946756e6374696f6e283129283129 6865:O1|@6866 6866:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b940bf15c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@6868,3,@17430|41,0,@6867 6867:O2|4,@1149 6868:S49|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833297368696d426f64792d283129 6869:S33|434f4445545245455f4f5054494d4953455228292e6f70744c616d626461283429 6870:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17432| 6871:D4,704|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70203000000f6c30174084883fb017d08eb1cf643ff107516f6c301740b483b1d4a0200007c1deb06f643ff1075154889c648b820f007c9a37f0000488b5d089090ff134889de40f6c60174064883c6027105ff5570ebf54889cf4889f14889c648c7c0030000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891f4989fd4989d64151415141564d89ea49c7c1030000004c89c049c7c0030000004889c34889f0ff15c60100004883f801750f48b880da06c9a37f00004883c408c3488b0424488b004883f801750f48b8d09507c9a37f00004883c408c34d8b364983fe01746a498b45004883f801750c48b8909adc0000000000eb594889c14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89ee4889f84889c74889d148d1e94883c608f348a5eb0ae944000000e914000000488d7c3f01488d743601488d4c0901488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000004883c408c3498b45004883f801750c48b8909adc0000000000eb664889c14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89ee4889f84889c74889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbf4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700030000004883c408c390900000000000000000b002000000000000fdffffffffffff01|@6873,8191,@17433,@6872|125,0,@1509 282,0,@544 310,0,@1394 344,0,I49 523,0,I49 6872:D3,2704|483b65187303ff55484883fb01750a48c7c001000000c21000488b0848ba76c315c9a37f0000488d548afcffe290e918020000909090e98f020000909090e929030000909090e960030000909090e99f050000909090e9e4050000909090e929060000909090e96f060000909090e98a070000909090e9b5070000909090e923000000909090e9f4070000909090e93a080000909090e949090000909090e98f090000909090488b4808415241514150ff7010f6c1017560488b0148833801755cf6c30174084883fb037c18eb06f643ff107510f6c30174064883eb02710cff5570ebf548c7c301000000ff7108ff742438ff7424384c8b5424304c8b4c242849c7c001000000488b48204889c8909090e8eafeffffeb59e9fb00000048833805752dff7108ff742438ff7424384c8b5424304c8b4c242849c7c001000000488b48084889c8909090e8b2feffffeb64488338077563488b5008ff7108f6c201755c488b02498d4fe8483b4d10730aeb05e990000000ff55404989cf48c741f802000000488b70104889710848c7010f000000ff7208ff742440ff7424404c8b5424384c8b4c243049c7c0010000004889c8eb0fe94d000000e920000000e9160000009090e836feffff4889c35a483b65187303ff5548eb844889d8eb28ff7108ff742438ff7424384c8b5424304c8b4c242849c7c001000000488b48184889c8e8fafdffff4889c359483b65187303ff5548e99bfeffff4889d8488b4c2430488b54242848894c243048895424284c8b5424184c8b4c24104c8b4424084889c3584883c418e9b5fdffff488b481041524151ff7008f6c101753a488b01488b10ff7108ff742430ff7424304c8b5424284c8b4c242049c7c001000000488b4210e87afdffff4889c359483b65187303ff5548ebc14889d8488b4c2428488b54242048894c242848895424204c8b5424104c8b4c240849c7c0010000004889c3584883c410e936fdfffff6c30174084883fb057c18eb06f643ff107510f6c30174064883eb04710cff5570ebf548c7c301000000415241514150ff7008ff7010ff742438ff742438488b401890e8eefcffffff742438ff7424384c8b5424304c8b4c24284c8b4424204889c3488b442410e8cafcffff488b4c24384883c408488b54242848894c243048895424284c8b5424184c8b4c241049c7c0010000004889c3584883c418e994fcfffff64008017533f6c30174084883fb037c1eeb06f643ff107516f6c30174064883eb027105ff5570ebf54889d8c2100048c7c001000000c210004889d8c21000488b4810488339097558488b510848833a0775534983f9037552488b700848c7c70100000040f6c601755f4c8b0e4d8b1949833b0975234d8b630849833c2401751840f6c701750b41f6442408017503ff5570493b7c2408746b40f6c7017419eb0fe935010000e930010000e92b0100004883ff017d08eb28f647ff1075224d8b2240f6c7017412eb05e97100000041f6c4017405493bfceb05ff5570ebf67c154c8b600848b810f407c9a37f0000488b5d0890ff134989fc41f6c401740d4983c402eb05e9100000007105ff5570ebee4bc744a2fc0100000040f6c70174064883c7027105ff5570ebf54c8b66084c89e6483b65187303ff5548e925ffffff488b74241048c706030000004983f801750c488b7c240848c70701000000f6c30174084883fb077c18eb06f643ff107510f6c30174064883eb06710cff5570ebf548c7c301000000488b7808415240f6c701753e488b07ff7708ff742420ff7424204c8b54241849c7c10300000049c7c001000000488b084889c8909090e8d2faffff4889c35f483b65187303ff5548ebbc4889d84883c408c21000f6c30174084883fb057c18eb06f643ff107510f6c30174064883eb04710cff5570ebf548c7c301000000488b500841524151ff7010f6c201753c488b02ff7208ff742430ff7424304c8b5424284c8b4c242049c7c001000000488b084889c8909090e852faffff4889c35a483b65187303ff5548ebbf4889d8488b4c2428488b54242048894c242848895424204c8b5424104c8b4c240849c7c0010000004889c3584883c410e90efaffff488b40084883380775104983f903750a48c7c001000000c21000f6c30174084883fb037c1eeb06f643ff107516f6c30174064883eb027105ff5570ebf54889d8c2100048c7c001000000c2100041524151ff7008ff742428ff742428488b4010909090e8a6f9ffff488b4c2428488b54242048894c242848895424204c8b5424104c8b4c240849c7c0010000004889c3584883c410e974f9fffff6c30174084883fb037c18eb06f643ff107510f6c30174064883eb02710cff5570ebf548c7c301000000488b4c2410488b54240848894c2410488954240849c7c001000000488b4008e926f9ffff488b4808488b5118f6c2017524488b3248833e07750948c7c703000000eb19488b72084889f2483b65187303ff5548ebd748c7c7010000004883ff01740a48c7c001000000c2100048c7c201000000488b712040f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdb48c7c601000000488b791840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebdaf6c201740f40f6c6017409488d52ff4803d67105ff5570ebf2f6c301740af6c2017405483bdaeb05ff5570ebf67c1af6c301740af6c2017405482bda7105ff5570ebf64883c301eb0748c7c301000000488b542410488b7424084889542410488974240849c7c10100000049c7c001000000488b01e903f8fffff6c30174084883fb037c1eeb06f643ff107516f6c30174064883eb027105ff5570ebf54889d8c2100048c7c001000000c21000488b400841524151a8017539488b08ff7008ff742428ff7424284c8b5424204c8b4c241849c7c001000000488b01909090e89af7ffff4889c358483b65187303ff5548ebc34889d84883c410c21000f6c30174084883fb037c18eb06f643ff107510f6c30174064883eb02710cff5570ebf548c7c301000000488b4c2410488b54240848894c2410488954240849c7c001000000488b4008e933f7ffff488b48084883391d7570488b510841524151ff7018f6c2017536ff7208ff742430ff7424304c8b5424284c8b4c242049c7c001000000488b02909090e8f2f6ffff4889c35a483b65187303ff5548ebc54889d8488b4c2428488b54242048894c242848895424204c8b5424104c8b4c240849c7c001000000eb05e90d0000004889c3584883c410e9a7f6ffff488b5010f6c301740cf602017407483b1a7c21eb05ff5570ebf4f6c301740af602017405482b1a7105ff5570ebf64883c301eb0748c7c30100000041524151ff7018ff742428ff74242849c7c0010000004889c8e84ef6ffff488b4c2428488b54242048894c242848895424204c8b5424104c8b4c240849c7c0010000004889c3584883c410e91cf6fffff6c30174084883fb037c18eb06f643ff107510f6c30174064883eb02710cff5570ebf548c7c301000000488b4c2410488b54240848894c2410488954240849c7c001000000488b4010e9cef5ffff488b400841524151a8017533ff7008ff742428ff7424284c8b5424204c8b4c241849c7c001000000488b00e89ef5ffff4889c358483b65187303ff5548ebc94889d84883c410c2100090909090900000000000000000880a000000000000|@6874,2047,@17434|30,0,$6872+46 1106,0,@1517 6873:S40|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329 6874:S51|434f4445545245455f4f5054494d4953455228292e6576616c75617465496e6c696e696e67283329636865636b557365283429 6875:D10,640|483b65187303ff55486a016a016a01415141524150506a016a01488d4c243051415049c7c20100000049c7c1010000004c8b4424384889d948c7c3010000004889c89090ff154e02000048837c243001750c48b8909adc0000000000eb6e48c7c001000000488b4c2430f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05e00100007d08eb19f640ff1075134889c148b818930ec9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9670000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24304883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f849b960d115c9a37f00004c8b4424084889c3584883c40890ff154a0100004989c248bbf09f09c9a37f000058ff153e01000050415248bb48d215c9a37f0000488b442410ff152e01000048837c241801740c488b5c241890ff15220100004989c0488b4424209090ff151a010000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54244048895138488b5c24384889593048c7412803000000488941204c89411848b890da06c9a37f000048894110488b44240848894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004989c0584883c4089090ff15960000004889c1498d47d8483b45107303ff55404989c748c740f804000000488b542410488950184c8940104889480848c70007000000c2100000000000000000007002000000000000ffffffffffffff01|@6884,1048575,@17437,@6885,@6887,@100,@1354,@6897,@6898,@6883|84,0,I49 167,0,@4361 314,0,@6876 347,0,@2577 367,0,@6880 482,0,@545 6876:O1|@6877 6877:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f8040000004889581848bae8d115c9a37f0000488950104889480848c70007000000c39090909090909000000000000000004800000000000000|@6879,15,@17435|33,0,@6878 6878:O2|4,@544 6879:S53|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e672834292d45 6880:O1|@6881 6881:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39000000000000000003000000000000000|@6882,3,@17436| 6882:S60|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372973756246756e6374696f6e2d283129 6883:D3,136|483b65187303ff5548a801755d488b08498d57e8483b55107303ff55404989d748c742f802000000488b590848895a08488b3148893252488b78084889f8909090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,63,@17448| 6884:S45|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e283729 6885:D3,768|483b65187303ff55484883f801756c48c7c00100000041f6c2017534498d4fe8483b4d107303ff55404989cf48c741f80200000048894108498b024889014889c84d8b5208483b65187303ff5548ebc6488b4c242048c7c201000000f6c101753b498d5fe8483b5d107303ff55404989df48c743f802000000eb05e98100000048895308488b114889134889da488b4908483b65187303ff5548ebc04889d1488b54241848c7c301000000f6c2017534498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1a48891e4889f3488b5208483b65187303ff5548ebc74889da488b5c241048890348894b084889531048c7c001000000c22000488b08498d57e8483b55107303ff55404989d748c742f80200000048895a0848c70201000000f6c301741d488b7c240848beffffffffffffff00482377f8488d743601483bde7214488b700848b8b0df06c9a37f0000488b5d08ff13488b7c9ffc4883ff01746df6c30174064883c3027105ff5570ebf54c89c640f6c60174064883c6027105ff5570ebf5498d7fb8483b7d107303ff55404989ff48c747f8020000004c895708488917488d571848c742f8020000004c89420848c702030000004c8d421849c740f8020000004c8b542418eb05e93c0000004d895008498910488b5424204c8b5c24104c8b64240848895424204c894424184c895c24104c896424084989fa4989f0488b48084889c8e9eafdfffff6c30174064883c3027105ff5570ebf54c89ce40f6c60174064883c6027105ff5570ebf5498d7f80483b7d107303ff55404989ff48c747f8020000004889570848c70709000000488d571848c742f8030000004c8b59084c895a104c8b214c89620848893a488d7a2048c747f8020000004c8b6c24204c896f08488917488d571848c742f8020000004c894a0848c702010000004c8d4a1849c741f8020000004c8b7424184d897108498911488b5424104c8b64240848897c24204c894c241848895424104c896424084989f1488b4008e914fdffff909090900000000000000000f802000000000000|@6886,8191,@17438|307,0,36028797018963967 335,0,@560 6886:S55|434f4445545245455f4f5054494d4953455228292e6c69667452656375727369766546756e6374696f6e28372967657441726773283729 6887:D4,136|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048ba20d815c9a37f0000488911488959084c8949104c894118488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bb98dd15c9a37f000048891a48894a08488062ffbf4889d3ff252a000000909000000000000000008000000000000000|@6896,1048575,@17445,@3169|35,0,@6888 89,0,@6894 6888:D4,296|483b65187303ff554848833809756c488b4808488339017567f6410801741d488b720848bbffffffffffffff0048235ef8488d5c1b01483b5908771148b8b0df06c9a37f0000488b5d0890ff13488b5908488b5c9efc498d7fd8483b7d107303ff55404989ff48c747f80200000048895f0848c70709000000eb0ae915000000e910000000488d471848c740f801000000488938c3488338077563488b481048833909755e488b590848833b07755952ff70184989d14c8b421848c7c301000000488b48084889c8ff1572000000488b4c24085b4883c408488b5110ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908eb0fe90b000000e906000000e901000000c348c7c001000000c3909000000000000000002001000000000000|@6892,1048575,@17441,@6889|37,0,36028797018963967 62,0,@560 6889:D4,320|483b65187303ff55484883f801750848c7c001000000c3488b08f6c301741848baffffffffffffff00492350f8488d541201483bda7216488b500848b8b0df06c9a37f0000488b5d089090ff13498b5498fc4883fa01741cf6c30174064883c3027105ff5570ebf5488b48084889c8e98cffffff498d57e8483b55107303ff55404989d748c742f80200000048bee8da15c9a37f00004889324c894a08488062ffbf41514150ff700853ff71084889d3488b0190ff159e000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890158a80174064883c0027105ff5570ebf5514c8b4c24184c8b4424104889c3488b442408e8fefeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c390909090909000000000000000003801000000000000|@6893,1048575,@17442,@3169|33,0,36028797018963967 61,0,@560 142,0,@6890 6890:D4,232|483b65187303ff55484883380f756e488b4808ff7138ff7130ff7128ff7120ff7110ff7108ff31488b5a08488b411890ff15ca000000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b5424184889512048894118488b442410eb05e94b00000048894110488b44240848894108584883c430488901498d47d8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c1488d401848c740f801000000488908c3488b5208ff2290909090900000000000000000e000000000000000|@6864,1048575,@17439,@6891| 6891:D4,192|483b65187303ff5548a801756e498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000053ff70084889c89090ff15960000004883380974154889c148b828be15c9a37f0000488b5d089090ff13ff7008488b5c2410488b442408909090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@1363,1048575,@17440,@3169|77,0,@6862 6892:S62|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e747279283129 6893:S71|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429726570456e7472792831296d6170417267283229 6894:D4,232|483b65187303ff55484883380f756e488b4808ff7138ff7130ff7128ff7120ff7110ff7108ff31488b5a08488b411890ff15ca000000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b5424184889512048894118488b442410eb05e94b00000048894110488b44240848894108584883c430488901498d47d8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c1488d401848c740f801000000488908c3488b5208ff2290909090900000000000000000e000000000000000|@6864,1048575,@17443,@6895| 6895:D4,192|483b65187303ff5548a801756e498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000053ff70084889c89090ff15960000004883380974154889c148b828be15c9a37f0000488b5d089090ff13ff7008488b5c2410488b442408909090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@1363,1048575,@17444,@3169|77,0,@6862 6896:S51|434f4445545245455f4f5054494d4953455228292e6d6170436f6465466f7246756e6374696f6e526577726974696e67283429 6897:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17446| 6898:D3,136|483b65187303ff5548a801755d488b08498d57e8483b55107303ff55404989d748c742f802000000488b591048895a08488b710848893252488b78084889f89090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,63,@17447| 6899:D5,400|483b65187303ff55486a016a014d89c650415641514c8d54241849c7c10100000049c7c0010000004889d948c7c3010000004889c8909090ff156a01000048837c241001750c48b8909adc0000000000eb6e48c7c001000000488b4c2410f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05fc0000007d08eb19f640ff1075134889c148b818930ec9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9670000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24104883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f849b9e0e215c9a37f00004d89f04889c358909090ff156a0000004889c1498d47e0483b45107303ff55404989c748c740f8030000005a4883c408488950104889480848c70001000000c3909000000000000000008001000000000000ffffffffffffff01|@6903,1048575,@17450,@6902,@6887|72,0,I49 155,0,@4361 302,0,@6900 6900:O1|@6901 6901:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70013000000c39000000000000000003000000000000000|@6879,3,@17449| 6902:D3,680|483b65187303ff55484883f801756848c7c00100000041f6c0017534498d4fe8483b4d107303ff55404989cf48c741f80200000048894108498b004889014889c84d8b4008483b65187303ff5548ebc648c7c10100000041f6c101753b498d57e8483b55107303ff55404989d748c742f802000000eb05e92d00000048894a08498b0948890a4889d14d8b4908483b65187303ff5548ebbf49890249894a0848c7c001000000c21000488b08f6c301741d488b74241048baffffffffffffff00482356f8488d541201483bda7217488b500848b8b0df06c9a37f0000488b5d08909090ff13488b749efc4883fe01746f4889daf6c20174064883c2027105ff5570ebf5498d77d0483b75107303ff55404989f748c746f80200000048895e0848c70601000000488d5e1848c743f8020000004c894b08488933488b742410488b7c2408488974241048897c24084989d94889d3488b48084889c8e9a1feffff488b542408488b12488b742408488b3640f6c60174064883c6027105ff5570ebf5488b7c24084889374889de40f6c60174064883c6027105ff5570ebf5f6c30174084883fb017c08eb1cf643ff1074164c8b580848b8f0a115c9a37f0000488b5d089090ff134d8d9f50ffffff4c3b5d107303ff55404d89df49c743f80200000049895b0849c70301000000498d5b1848c743f8020000004c895b0848c703090000004c8d5b1849c743f80300000049895b1049895308488b590849891b4d8d632049c74424f8020000004c8b294d896c24084d891c244d8d5c241849c743f8020000004d8943084d89234d8d431849c740f8020000004989500849c70005000000498d501848c742f8020000004c894a084c89024c8b4424104c8944241048897c24084989d14d89d84889f3488b50084889d0e968fdffff0000000000000000a002000000000000|@6904,4095,@17451|184,0,36028797018963967 212,0,@560 437,0,@6844 6903:S52|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f70283429 6904:S62|434f4445545245455f4f5054494d4953455228292e7265706c6163655461696c526563757273697665576974684c6f6f702834296d617041726773283429 6905:D8,632|483b65187303ff5548a8017563488b0848833905755f488b5108f6c20174064883c2027105ff5570ebf5ff7108ff355d0200006a016a0153ff70084c8d442410488d5c24204889d048bab89c15c9a37f00009090ff153e020000488b442418488060ffbf498d4fe8483b4d10730feb0ae9db010000e94f000000ff55404989cf48c741f80200000048894108488b442410488901498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010010000004889480848c70005000000eb564883390175554883fb0174054889daeb0748c7c2050000006a016a016a016a0153ff7008ff71104889d3488b41089090e802ffffff6a016a014883380175214889e1488b50084889114889e1488b581048895908eb1be900010000e9d20000004889e148c701010000004889e148894108488b44241090ff155a01000048837c2420057549488b4c241050f6c101752fff7108488b0190ff1542010000483b0503010000740d48c7c0030000004883c408eb1359483b65187303ff5548ebcc48c7c0010000004883f8017415eb0350eb1048b830e306c9a37f00004883c408eb69498d47c8483b45107303ff55404989c748c740f802000000488b4c240848894808488b0c244889084889c1488d401848c740f803000000488b542410488950104889480848c700010000004883c408eb25488b480848b830e306c9a37f00006a016a016a016a01eb05e90800000053516a016a016a014883c41848833c240175054883c430c350488b5c2410488b4424089090e8befdffff4889c3584883c430ff256000000048b830e306c9a37f0000c3909090909000000000000000006802000000000000010000e000000000|@6908,2097151,@17452,@6909,@6835,@6911,@6917,@6906|74,0,@6834 412,0,@573 513,0,@573 594,0,@573 6906:D6,1208|483b65187303ff554848833801756848833b017567ff7310ff701049b878ee15c9a37f0000488b5b08488b4008909090ff159a040000a801740f48b830e306c9a37f00004883c410c350488b5c2410488b44240890e8a6ffffff4889c1498d47e0483b45107303ff55404989c748c740f803000000eb0ae91a000000e91500000048894810594889480848c700010000004883c410c348833805756848833b057567488b480848c7c201000000488b31ff7008ff7318ff7018ff7310ff7010ff73084883fe01746f4889f04883e8024889f14883e9024883ee02488b5c24286a016a01525051ff73084c8d44242048c7c3110000004889f048ba50a8dc0000000000eb0ae98d030000e9880300009090ff12488b4424205948d1e8480fb60401488d440001488b4c242048c7c2030000004883ea01eb05e9880000004883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f803752a498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b0c24488908eb05488b4424104883c4085e4883c4184889c2483b65187303ff5548e9fefeffff488b042448c7c101000000488b18524883fb01746c4889d84883e8024889da4883ea024883eb02488b7424086a016a01515052ff76084c8d4424204889df48c7c3110000004889f848ba50a8dc00000000009090ff12488b4424205948d1e8480fb60401488d440001488b4c242048c7c2030000004883ea014883f97f760eeb05e98200000048c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f803752a498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b0c24488908eb05488b4424104883c4085b4883c4184889c1483b65187303ff5548e907ffffff58483bc1750948c7c003000000eb4da8017542f6c1017534488b10f6c2017508f601017503ff5570483b117516488b4908488b50084889d0483b65187303ff5548ebbe48c7c001000000eb1048c7c001000000eb0748c7c0010000004883f801746448837c240801750948c7c001000000eb05488b44241048837c241801750948c7c101000000eb05488b4c24204889c2498d47d8483b45107303ff55404989c748c740f8040000004889481848895010488b4c24284889480848c700050000004883c430c348837c241801746a48837c2420017467488b442428488b0c24488b10f6c201740cf601017407483b117e07eb08ff5570ebf4488b115051ff35090100006a016a014989e0488d5c24104889d048bab89c15c9a37f0000ff15f2000000488b442408488060ffbf498d4fe8483b4d10730feb0ae97e000000e979000000ff55404989cf48c741f80200000048894108584883c42048890148837c240801750948c7c001000000eb05488b44241048837c241801750948c7c201000000eb05488b5424204889c3498d47d8483b45107303ff55404989c748c740f80400000048895018488958104889480848c700050000004883c430c348b830e306c9a37f00004883c430c348b830e306c9a37f0000c3909090909090900000000000000000b004000000000000|@6920,2097151,@17458,@6921,@6919,@6835|29,0,@6907 60,0,@573 250,0,I104 526,0,I104 992,0,@6834 1161,0,@573 1176,0,@573 6907:O1|@6906 6908:S36|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e283229 6909:D3,56|a8017509f64208017503ff5570483b4208740848c7c001000000c348c7c003000000c3909090909000000000000000003000000000000000|@6910,5,@17453| 6910:S42|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e28322970312d283129 6911:D5,296|483b65187303ff5548a80175696a016a01ff7008488d5c2408488b00ff151e010000488b442408a80174084883f8037f14eb06f640ff10740c48b830e306c9a37f0000eb706a016a014989e048bbc0f015c9a37f000048bab89c15c9a37f0000ff15e2000000488b442408488060ffbf498d4fe8eb05e98f000000483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d8483b45107303ff55404989c748c740f804000000eb05e91c00000048c7401801000000488b542410488950104889480848c7000500000050488b44240890e81effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000002001000000000000|@1363,2097151,@17455,@6915,@6835|59,0,@573 78,0,@6912 88,0,@6834 6912:O1|@6913 6913:D3,24|48c7c003000000c300000000000000001000000000000000|@6914,1,@17454| 6914:S33|434f4445545245455f4f5054494d4953455228292e6d6170417267283129283129 6915:D3,664|483b65187303ff5548488b0848ba66f115c9a37f0000488d548afcffe290e973000000909090e982000000909090e90d010000909090e95b000000909090e9c0010000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e9a7010000909090e91b000000909090e913000000909090e90b000000909090e99001000090909048c7030300000048c743080100000048c7c001000000c36a016a0153ff7018488d5c2410488b4010909090e83affffff6a016a014889e3488b442410909090e826ffffff488b442420a8017509f60424017503ff5570483b0424752e48837c242801750948c7c101000000eb05488b4c2408488b54241848890248894a0848c7c0010000004883c430c3488b44241848c7000300000048c740080100000048c7c0010000004883c430c3f6400801752ff64008017415488b480848b8f86f07c9a37f0000488b5d0890ff13488b5008480fb64aff488d4c09014883f901741748c7030300000048c743080100000048c7c001000000c3f6c201741048b8f86f07c9a37f0000488b5d08ff1348b9ffffffffffffff0048234af8488d4c0901f6c10174084883f9017d25eb06f641ff10741d534889cb48b810c506c9a37f000048bad0a8dc000000000090ff12eb044889c853488b0c2448890148c741080300000048c7c0010000004883c408c348c7030300000048c743080100000048c7c001000000c3488b4010e9ddfdffff4883781001754448c7c101000000488b4008a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c848890348c743080100000048c7c001000000c348c7030300000048c743080100000048c7c001000000c390909000000000000000009002000000000000|@6916,2097151,@17456|14,0,$6915+30 338,0,@1294 403,0,@1294 419,0,36028797018963967 461,0,@376 471,0,I106 6916:S33|434f4445545245455f4f5054494d4953455228292e66696e645475706c65283129 6917:D3,736|483b65187303ff5548488b0848ba5ef415c9a37f0000488d548afcffe290e97e000000909090e97e000000909090e963000000909090e9a4000000909090e953000000909090e944010000909090e968010000909090e93b000000909090e961010000909090e961010000909090e961010000909090e9e1010000909090e9eb010000909090e9eb010000909090e9ec01000090909048b8010000e000000000c348c7c001000000c3ff7018ff7010488b40089090e846ffffff50488b44240890e83affffff4823042450488b44241890e82affffff482304244883c420c3488b4810488339057565f64108017416488b500848b8f86f07c9a37f0000488b5d089090ff13ff7008ff7108488b1c2448c7c0cd00000048bad0b3dc0000000000ff124883f8017453488b1c2448c7c0cf00000048ba90b4dc0000000000909090ff12488b4c2408f6c101752aeb05e934000000488b11ff710850488b02e89efeffff482304244883c40859483b65187303ff5548ebd14883c410c348c7c0010000004883c410c348c7c001000000c3ff7010488b4008909090e862feffff480b053301000050488b4424089090e84efeffff482304244883c410c3488b4008e93cfeffff48c7c001000000c348c7c001000000c3ff7008488b40109090e81efeffff59f6c1017569488b1148833a01750fff710850488b4220e802feffffeb4048833a057512ff710850488b4208909090e8eafdffffeb2848833a07750f4889c348b8010000e000000000eb0fff710850488b4218e8c6fdffffeb04ff710853482304244883c40859483b6518730aeb05e905000000ff5548eb88c3488b400890e89afdffff48230563000000c348c7c001000000c3488b4010e981fdffff488b400848b9010000e000000000a8017524ff700851488b0090e862fdffff482304244889c14883c40858483b65187303ff5548ebd84889c8c3909090909090900000000000000000c802000000000000ffffff7fffffffff0100008000000000|@6918,2097151,@17457|14,0,$6917+30 152,0,1879048192 245,0,@1294 280,0,I150 309,0,I153 547,0,1879048192 645,0,1879048192 6918:S33|434f4445545245455f46554e4354494f4e5328292e636f646550726f7073283129 6919:D3,496|483b65187303ff5548488b4a10a801740cf601017407483b017d6eeb05ff5570ebf4a80174084883f8017d08eb1bf640ff107515a801740cf601017407483b017c1beb05ff5570ebf44889c348b8e09e10c9a37f0000488b5d0890ff136a016a015052ff71084c8d44241848c7c31100000048ba50a8dc0000000000ff12488b4424185948d1e8eb05e941000000480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f8017416eb086a016a015052eb0c48c7c0030000004883c420c3488b0424488b4808488b542408f6c201740cf601017407483b117d6eeb05ff5570ebf4f6c20174084883fa017d08eb1cf642ff107516f6c201740cf601017407483b117c19eb05ff5570ebf448b8e09e10c9a37f0000488b5d089090ff136a016a01ff71084c8d44240848c7c3110000004889d048ba50a8dc0000000000909090ff12488b442408eb05e95c000000594883c40848d1e8480fb60401488d4400015948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883c420c348c7c0010000004883c420c39090909090900000000000000000e801000000000000|@6923,2097151,@17461|78,0,@4917 116,0,I104 305,0,@4917 345,0,I104 6920:S51|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229 6921:D4,128|483b65187303ff5548a8017559f6c30175544150ff7308ff7008488b1b488b00ff1572000000504c8b442418488b5c2410488b442408909090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909000000000000000007800000000000000|@3457,1048575,@17459,@6922| 6922:D3,176|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff134150ff7308ff7008488b1b488b004c89c29090ff12504c8b442418488b5c2410488b442408909090e88affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c390900000000000000000a800000000000000|@3595,1048575,@17460|23,0,@3592 59,0,@3592 6923:S60|434f4445545245455f4f5054494d4953455228292e757365546f5061747465726e2832296d657267655061747465726e283229756e696f6e2d283129 6924:D4,120|483b65187303ff5548a801754d488b08ff700848c7c301000000488b41089090ff156a00000050488b44240890e8ceffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c390909090909000000000000000007000000000000000|@1363,2097151,@17462,@6905| 6925:D5,296|483b65187303ff5548a80175696a016a01ff7008488d5c2408488b00ff151e010000488b442408a80174084883f8037f14eb06f640ff10740c48b830e306c9a37f0000eb706a016a014989e048bbc0fd15c9a37f000048bab89c15c9a37f0000ff15e2000000488b442408488060ffbf498d4fe8eb05e98f000000483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d8483b45107303ff55404989c748c740f804000000eb05e91c00000048c7401801000000488b542410488950104889480848c7000500000050488b44240890e81effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000002001000000000000|@1363,2097151,@17464,@6915,@6835|59,0,@573 78,0,@6926 88,0,@6834 6926:O1|@6927 6927:D3,24|48c7c003000000c300000000000000001000000000000000|@6914,1,@17463| 6928:D3,160|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13488b08488339057403488b0b51488b5b08488b4008909090e89affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390909090909000000000000000009800000000000000|@3595,15,@17465|23,0,@3592 59,0,@3592 6929:D3,184|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13488b0b48833905751a488b1048833a05740c48be30e306c9a37f0000eb084889ceeb034889ce56488b4b084889cb488b40089090e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000b000000000000000|@3595,31,@17466|23,0,@3592 59,0,@3592 93,0,@573 6930:D4,304|483b65187303ff5548488338157509488b4010e9e8ffffff48833803751dff7018488b4010e8d6ffffff4883380575054883c408c358e9c5ffffff4883381d75694883781001756748c7c101000000488b4008a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c86a016a014989e048bb180116c9a37f000048bab89c15c9a37f0000ff15ae000000488b442408488060ffbf498d4fe8eb0ae964000000e954000000483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c70005000000c348b830e306c9a37f0000c348b830e306c9a37f0000c3909000000000000000002801000000000000|@6934,2097151,@17468,@6835|130,0,@6931 140,0,@6834 266,0,@573 277,0,@573 6931:O1|@6932 6932:D3,24|48c7c003000000c300000000000000001000000000000000|@6933,1,@17467| 6933:S43|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129283129 6934:S40|434f4445545245455f4f5054494d4953455228292e626f647952657475726e735475706c65283129 6935:D12,1272|483b65187303ff5548488b084883390f74134889c248b8480716c9a37f0000488b5d08ff13488b51084150ff7038ff7020ff7008ff7238ff7220ff7030ff7028ff7018515348c7c0010000004889da90ff125048c7c001000000488b54240890ff1248c7c101000000488b542418f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70203000000488d4a1848c741f80200000048bbc00716c9a37f000048891948895108488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be900816c9a37f000048893348894b0848895310488063ffbf50488b44241890ff15fa03000048c7c101000000488b542450f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4989c94989c24d89c848c7c301000000488b44243890ff15b6030000498d4fa8483b4d107303ff55404989cf48c741f804000000488b542440488951184c8951104889410848c70107000000488d412848c740f802000000488b1c244889580848c70005000000488d701848c746f80200000048c74608010000004889064883fe017507488b442420eb144889cf4889f3488b442420ff153e0300004889f948837c243801741b4889c64889cf488b5c2438488b442450909090ff1522030000eb0e4889c2488b4424504889d64889cf498d4fb8483b4d107303ff55404989cf48c741f808000000488b54244048895138488b5c243048895930488b5c242848895928488941204889711848b890da06c9a37f000048894110488b44244848894108488939498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4c240848890b5348bbe00a16c9a37f00004c89c8909090ff158a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b840cd06c9a37f00004889014989c848c7c301000000488b4424589090ff15520200004989c148c7c301000000488b442440909090ff15420200004883f80174114889c34c89c89090ff15360200004989c1498d47d8483b45107303ff55404989c748c740f804000000488b4c24604889481848ba804507c9a37f0000488950104c89480848c700070000004d89c24989c348c7c35b000000488b442450909090ff15e6010000498d4fb8483b4d107303ff55404989cf48c741f808000000488b5424484889513848c741300100000048c7412801000000488b542440488951204c89511848ba90da06c9a37f000048895110488941084c8919498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f802000000488b5424104889510848c70105000000498d57a0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f808000000488b5c24604889593848c741300100000048c7412801000000488b5c2458488959204889511848ba90da06c9a37f000048895110488b54245048895108488901498d47e8483b45107303ff55404989c748c740f80200000048894808488b542408488910498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f802000000488950085a4883c460488910488b142448890a4889420848c7c0010000004883c408c3909090909090900000000000000000f004000000000000|@6947,1048575,@17473,@3169,@6948,@6950,@6951,@1354,@6952,@6953,@6946,@100|23,0,@6936 195,0,@6939 241,0,@6941 595,0,@545 658,0,@6943 708,0,@441 824,0,@1076 938,0,@545 1107,0,@545 6936:O4|@20055,@557,@6938,@6937 6937:O5|@6782,918,0,918,0 6938:S15|6465637572727946756e6374696f6e 6939:D3,104|488338097544488b400848833807753a498d47d8483b45107303ff55404989c748c740f802000000488b52084889500848c700090000004889c1488d401848c740f801000000488908c348c7c001000000c390909090909000000000000000006000000000000000|@6940,7,@17469| 6940:S47|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229646f4d6170283129 6941:D4,304|483b65187303ff55484883380f756e488b4808ff7138ff7130ff7128ff7120ff7110ff7108ff31488b5a08488b411890ff1512010000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b5424184889512048894118488b442410eb05e94b00000048894110488b44240848894108584883c430488901498d47d8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c1488d401848c740f801000000488908c3488338097544488b400848833807753a498d47d8483b45107303ff55404989c748c740f802000000488b52104889500848c700090000004889c1488d401848c740f801000000488908c348c7c001000000c39000000000000000002801000000000000|@6864,1048575,@17470,@6942| 6942:D4,192|483b65187303ff5548a801756e498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000053ff70084889c89090ff15960000004883380974154889c148b828be15c9a37f0000488b5d089090ff13ff7008488b5c2410488b442408909090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@1363,1048575,@17471,@3169|77,0,@6862 6943:O1|@6944 6944:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000c39000000000000000003000000000000000|@6945,3,@17472| 6945:S12|4c6f6164417267756d656e74 6946:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17479| 6947:S39|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e283229 6948:D3,224|483b65187303ff55484883f801750848c7c001000000c3488b084889daf6c201740f41f6c0017409488d52ff4903d07105ff5570ebf2498d77b8483b75107303ff55404989f748c746f8020000004889560848c70601000000488d561848c742f8020000004889720848c70209000000488d721848c746f802000000488b3948897e08488916f6c30174064883c3027105ff5570ebf556488b50084889d0909090e85affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c39090909090900000000000000000d800000000000000|@6949,127,@17474| 6949:S50|434f4445545245455f4f5054494d4953455228292e6465637572727946756e6374696f6e2832296d61704172672833292829 6950:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17475| 6951:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17476| 6952:D3,208|483b65187303ff55484883f801750848c7c001000000c3488b084889daf6c20174064883c2027105ff5570ebf5498d77b8483b75107303ff55404989f748c746f8020000004889560848c70603000000488d561848c742f8020000004889720848c70209000000488d721848c746f802000000488b3948897e08488916f6c30174064883c3027105ff5570ebf556488b50084889d0e866ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000c800000000000000|@6949,63,@17477| 6953:D3,192|483b65187303ff55484883f801750848c7c001000000c3488b08498d57b8483b55107303ff55404989d748c742f80200000048895a0848c70201000000488d721848c746f8020000004889560848c70609000000488d561848c742f802000000488b3948897a08488932f6c30174064883c3027105ff5570ebf552488b70084889f0909090e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000b800000000000000|@6949,63,@17478| 6954:D8,1200|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b50304889116a016a016a014151ff7038ff7020ff7008ff702851ff7018415053ff30ff7424304989ca4c8d4c245849c7c00100000048c7c301000000488b442410ff155a04000048837c246001750c48b8909adc0000000000eb6e48c7c001000000488b4c2460f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05ec0300007d08eb19f640ff1075134889c148b818930ec9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9670000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24604883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f848c7c101000000488b542418f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc498d57c8483b55107303ff55404989d748c742f80200000048894a0848c70203000000488d4a1848c741f80300000048bb581516c9a37f00004889194889510848894110488061ffbf498d5fd8483b5d107303ff55404989df48c743f80400000048beb81616c9a37f000048893348894b084889531048894318488063ffbf58ff15be02000050488b5c2438488b442408909090ff15b20200004989c14c89cb488b442458909090ff15a602000050415148c7c001000000488b542420909090ff125048c7c001000000488b54242890ff1248837c2468017507488b4c2418eb31498d4fe0483b4d107303ff55404989cf48c741f803000000488b54241848895110488b5424684889510848c70115000000498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d5a1848c743f80200000048c74308010000004889134883fb017507488b542430eb1a4889c64889cf488b442430ff15f20100004889c24889f94889f0488b5c2438488b1b498d77b8483b75107303ff55404989f748c746f808000000488b7c245848897e3848895e30488b5c244048895e28488b5c240848895e204889561848ba90da06c9a37f000048895610488b5424484889560848890e498d4fc0483b4d107303ff55404989cf48c741f80200000048897108488b1c24488919488d711848c746f80400000048897e1849b8804507c9a37f00004c8946104c8b4424104c89460848c706070000004d8d47884c3b45107303ff55404d89c749c740f8020000004989580849c70005000000498d581848c743f80200000048c74308010000004c89034c8d431849c740f8080000004989783849c740300100000049c7402801000000488b7c24504883c448498978204989581848bb90da06c9a37f00004989581049895008498930498d57b8483b55107303ff55404989d748c742f8020000004c894208488902488d421848c740f80200000048c7400801000000488910488d501848c742f8020000004889420848890a488b4424184883c4184c89004889500848c7c0010000004883c420c39090909090900000000000000000a004000000000000ffffffffffffff01|@6960,2097151,@17483,@6961,@3169,@7009,@7017,@6959|120,0,I49 203,0,@4361 445,0,@6955 495,0,@6957 836,0,@545 913,0,@1076 1050,0,@545 6955:D3,240|488338097566488b4808488339077537498d5fd8483b5d107303ff55404989df48c743f802000000488b52084889530848c70309000000488d431848c740f801000000488918c348833901756ef64108017424488b721048bbffffffffffffff0048235ef8488d5c1b01eb05e963000000483b5908771248b8b0df06c9a37f0000488b5d089090ff13488b5908488b5c9efc498d7fd8483b7d107303ff55404989ff48c747f80200000048895f0848c70709000000488d4718eb05e90c00000048c740f801000000488938c348c7c001000000c348c7c001000000c3909090900000000000000000e800000000000000|@6956,63,@17480|89,0,36028797018963967 121,0,@560 6956:S53|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329646f4d6170283129 6957:D4,440|483b65187303ff55484883380f756e488b4808ff7138ff7130ff7128ff7120ff7110ff7108ff31488b5a08488b411890ff159a010000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b5424184889512048894118488b442410eb05e94b00000048894110488b44240848894108584883c430488901498d47d8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c1488d401848c740f801000000488908c3488338097566488b4808488339077537498d5fd8483b5d107303ff55404989df48c743f802000000488b52104889530848c70309000000488d431848c740f801000000488918c348833901756df64108017424488b721848bbffffffffffffff0048235ef8488d5c1b01eb05e962000000483b5908771148b8b0df06c9a37f0000488b5d0890ff13488b5908488b5c9efc498d7fd8483b7d107303ff55404989ff48c747f80200000048895f0848c70709000000488d4718eb05e90c00000048c740f801000000488938c348c7c001000000c348c7c001000000c30000000000000000b001000000000000|@6864,1048575,@17481,@6958|294,0,36028797018963967 326,0,@560 6958:D4,192|483b65187303ff5548a801756e498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010900000053ff70084889c89090ff15960000004883380974154889c148b828be15c9a37f0000488b5d089090ff13ff7008488b5c2410488b442408909090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@1363,1048575,@17482,@3169|77,0,@6862 6959:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17510| 6960:S45|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329 6961:D9,2976|483b65187303ff55484883f801752149c7010100000049c741080100000049c741100100000048c7c001000000c20800488b0848833901755bf6410801755a488b510848837a08017565488b711048833e05756048837e1001755e498d7f90483b7d107303ff55404989ff48c747f8020000004c89470848c707010000004c8d5f1849c743f80200000049c7430801000000eb0ae93a050000e92904000049893b498d7b1848c747f802000000eb0fe94a010000e945010000e94001000048895f0848c707010000004c8d671849c74424f80200000049c74424080100000049893c24498d7c241848c747f8010000004c8b6e084c892f6a016a016a0141514152ff70084150534152ff7424504c8d5424384989f94d89e04c89db4889d09090ff15920a000058a80174064883c0027105ff5570ebf559f6c10174064883c1027105ff5570ebf56a016a016a01ff7424504c8b5424284c8d4c24084989c84889c3488b442420909090e892feffff498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2428488908498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488b542428488911498d57e8483b55107303ff55404989d748c742f8020000005b4883c41048895a08488b5c241848891a488b1c2448890348894b084889531048c7c0010000004883c420c20800488b3240f6c601752b488b3e48833f05751048837f1001750949c7c303000000eb19488b7e084889fe483b65187303ff5548ebcf49c7c3010000004983fb01746e498d77a0483b75107303ff55404989f748c746f8020000004c89460848c70601000000488d7e1848c747f80200000048c7470801000000488937488d771848c746f80200000048895e0848c706010000004c8d5e1849c743f80200000049c74308010000004989336a016a01eb05e9080100006a0141514152ff70084150534152ff7424504c8d54243849c7c1010000004d89d84889fb4889d0909090ff15de08000058a80174064883c0027105ff5570ebf559f6c10174064883c1027105ff5570ebf56a016a016a01ff7424504c8b5424284c8d4c24084989c84889c3488b442420909090e8d6fcffff498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2428488908498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488b542428488911498d57e8483b55107303ff55404989d748c742f8020000005b4883c41048895a08488b5c241848891a488b1c2448890348894b084889531048c7c0010000004883c420c208004889de40f6c60174064883c6027105ff5570ebf54c89c740f6c70174064883c7027105ff5570ebf56a016a016a014151415053ff7424384c8d4c24204989f84889f3488b70084889f09090e8f6fbffff498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f802000000488b54241848895008488908488d481848c741f8020000005a4889510848c70101000000498d57e8483b55107303ff55404989d748c742f802000000488b5c241848895a0848890a488b0c24488b5c2408488919488941084889511048c7c0010000004883c420c208004889daf6c20174064883c2027105ff5570ebf54c89c640f6c60174064883c6027105ff5570ebf56a016a016a014151415053ff7424384c8d4c24204989f04889d3488b48084889c89090e8eafaffff498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f802000000488b54241848895008488908488d481848c741f8020000005a4889510848c70101000000498d57e8483b55107303ff55404989d748c742f802000000488b5c241848895a0848890a488b0c24488b5c2408488919488941084889511048c7c0010000004883c420c2080048833905756348837910017561488b510848c7c601000000488b3a41514152ff7008415053ff71084883ff01746e4889f84883e8024889f94883e9024883ef02488b14246a016a01565051ff72084c8d44242048c7c3110000004889f848ba50a8dc0000000000eb0ae93e040000e92c0300009090ff12488b4424205948d1e8480fb60401488d440001488b4c242048c7c2030000004883ea01eb05e9880000004883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f803752a498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b0c24488908eb05488b4424104883c4085f4883c4184889c6483b65187303ff5548e9fffeffff488b442408a80174064883c0027105ff5570ebf5488b0c2448c7c20100000048c7c3010000005650ff31483b1c24736e4889d84883c002488b4c24186a016a015250ff71084c8d4424184889de48c7c3110000004889f048ba50a8dc0000000000909090ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e2eb05e95b0000004883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085b4883c4184889c2483b65187303ff5548e92cfffffff6c2017412f644242801740b488d52ff48035424287105ff5570ebf06a016a016a01ff7424684c8b5424584c8d4c24084989d0488b5c2428488b4424509090e8c2f7ffff488b442450488b00488b4c2450488b09f6c10174064883c1027105ff5570ebf5488b54245048890aff742440ff355803000050488d5c2408488b44244890ff154e030000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b04244889411048c741080100000048c701030000004889cf488b5c2450488b4424409090ff150e030000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424184889510848893948837c24200174134889ce488b5c24209090ff15da0200004889f1498d57e8483b55107303ff55404989d748c742f8020000005b4883c42048895a0848c70205000000498d5fe8483b5d107303ff55404989df48c743f8020000005e4883c44048897308488913488b142448890a4889420848895a1048c7c0010000004883c408c208004889daf6c20174064883c2027105ff5570ebf54c89c640f6c60174064883c6027105ff5570ebf56a016a016a014151415053ff7424384c8d4c24204989f04889d3488b48084889c8909090e83ef6ffff498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f802000000488b54241848895008488908488d481848c741f8020000005a4889510848c70101000000498d57e8483b55107303ff55404989d748c742f802000000488b5c241848895a0848890a488b0c24488b5c2408488919488941084889511048c7c0010000004883c420c208004889daf6c20174064883c2027105ff5570ebf54c89c640f6c60174064883c6027105ff5570ebf56a016a016a014151415053ff7424384c8d4c24204989f04889d3488b48084889c89090e832f5ffff498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f802000000488b54241848895008488908488d481848c741f8020000005a4889510848c70101000000498d57e8483b55107303ff55404989d748c742f802000000488b5c241848895a0848890a488b0c24488b5c2408488919488941084889511048c7c0010000004883c420c2080090909090900000000000000000980b000000000000|@6963,2097151,@17484,@6964,@6964,@7006,@6980,@7008,@6962|1586,0,I104 1877,0,I104 6962:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17505| 6963:S58|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e283329 6964:D8,1152|483b65187303ff5548a80174144889c148b8e81f08c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901488b442410488b00488b542410488b12f6c20174064883c2027105ff5570ebf5488b74241048891641525041504151514989ca4c8b4c24304c8b4424084889c890ff150a040000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b4424184889411048c741080100000048c701030000005149b8804507c9a37f000048c7c301000000488b442408909090ff15be030000488b4c240848c7c20100000050f6c101755a488b0148c7c301000000ff710852a801755e488b0848833905755a48837910017558488b510848c7c60100000048c7c701000000ff700853ff32ff7108483b7c2408736f4889f84883c002488b0c246a016a015650ff7108eb05e9480100004c8d44241848c7c3110000004889f8eb0fe900010000e9c9000000e9c400000048ba50a8dc0000000000909090ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea01eb05e96e0000004883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085f4883c4184889c6483b65187303ff5548e917ffffff40f6c6017412f644241001740b488d76ff48037424107121ff5570ebf0f6c30174064883c3027105ff5570ebf54889deff70086a016a016a014889f34883c41858483b65187303ff5548e999feffff4889d8a8017410f6042401740a488d40ff480304247105ff5570ebf14889c24883c40859483b65187303ff5548e954feffff4889d0f644241801750948c7c101000000eb0748c7c1030000004883f102a801740ef6c1017409488d40ff4803c17105ff5570ebf2f644241801756f488b4c24184889c2f6c20174064883ea027105ff5570ebf5f6c20174084883fa017c08eb19f642ff1074134889c348b8f0a115c9a37f0000488b5d08ff13498d5fd0483b5d107303ff55404989df48c743f8020000004889530848c70301000000488d531848c742f802000000eb05e92100000048895a0848c702090000004889c64989d0488b19488b042490ff153e010000eb0a4889c1488b04244889ce4989c24989f348bbe82b16c9a37f00004883c408488b44243890ff151a01000050415248bb002c16c9a37f00004c89d89090ff150a010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424284889411848b890da06c9a37f000048894110488b44240848894108584883c408488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f802000000488b5424204889510848c70105000000488b5424285b4883c42048891a4889420848894a1048c7c0010000004883c408c210009090909000000000000000007804000000000000|@6970,2097151,@17486,@6971,@6999,@6969,@100,@1354|18,0,@1625 197,0,@1076 373,0,I104 775,0,@6844 894,0,@6965 923,0,@6966 1005,0,@545 6965:S2|2d45 6966:O1|@6967 6967:D3,32|48b8700107c9a37f0000c3909090909000000000000000001800000000000000|@6968,1,@17485|2,0,@776 6968:S84|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429746869734172672d283129 6969:D3,344|483b65187303ff55484883380b7557415053ff7010488b4008e8e2ffffff504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c7000b000000c3488338177501c348833815753bff7008488b4010909090e87effffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70015000000c3488338037563415053ff7008ff7018488b4010e83affffff504c8b442420488b5c2418488b442408909090e822ffffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818594883c40848894810594883c4104889480848c70003000000c34889c1498d47d8483b45107303ff55404989c748c740f8040000004c894018488958104889480848c70019000000c3909000000000000000005001000000000000|@7005,75,@17502| 6970:S73|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e74283429 6971:D11,1168|483b65187303ff5548a801757448c7c101000000488b10f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4883780801751c41f6c001750948c7c201000000eb0748c7c2030000004883f202eb0748c7c2010000004989d34989dc4d89cd4d89c6ff70085148bb983316c9a37f0000eb05e9330100004c89e8909090ff1516040000415341545041524155415648bbb03316c9a37f0000488b442430ff15fe03000048c7c101000000488b542420f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc5048bb703416c9a37f00004889c8ff15c20300005048bbe00a16c9a37f0000488b4424409090ff15b20300004883f8017506488b0424eb104889c3488b0424909090ff159e0300004c8b5424204883c4084c8b4c24104c8b4424084889c3488b442440e8b6feffff498d4fa0483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424304889513048c74128010000005a4883c41848895120488b5424084889511848c74110010000005a4883c42048895108488901488d414848c740f8020000004889480848c7000f000000c3f6c301741348b8582008c9a37f0000488b5d08909090ff13534150488b43084889c34c89d09090ff15ea020000f6042401756c488b0c24488b1148c7c30100000048c7c601000000ff3150ff32483b3424736e4889f04883c002488b4c24106a016a015350ff71084c8d44241848c7c3110000004889f048ba50a8dc00000000009090ff12488b4424185948d1e8480fb60401488d440001488b4c2418eb05e9ac01000048c7c2030000004883ea014883f97f760748c7c17f00000048d1e9eb05e95e00000048d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085e4883c4184889c3483b65187303ff5548e929fffffff644242001741148b8e81f08c9a37f0000488b5d0890ff13488b4424204883c408498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c701090000004889ce58ff15aa010000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c70107000000488d412848c740f805000000488948204889581848c740100100000048b990da06c9a37f00004889480848c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889015148bbe03416c9a37f0000488b442408909090ff151601000048833c240175054883c420c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c420c3f64424080174154889c148b8e81f08c9a37f0000488b5d089090ff13488b4c2408498d57c0483b55107303ff55404989d748c742f802000000488b0948894a0848c702090000004889c1488d421848c740f80400000048c7401803000000488950104889480848c700070000004883c410c3909090909000000000000000008804000000000000|@6981,2097151,@17490,@100,@1354,@1354,@1354,@6982,@6983,@6993,@6980|119,0,@6972 159,0,@6973 229,0,@6976 249,0,@6943 448,0,@1628 562,0,I104 742,0,@1625 891,0,@545 948,0,@6978 1045,0,@1625 6972:S2|2d50 6973:O1|@6974 6974:D3,32|48b8700107c9a37f0000c3909090909000000000000000001800000000000000|@6975,1,@17487|2,0,@776 6975:S88|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229283129 6976:O1|@6977 6977:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39000000000000000003000000000000000|@6975,3,@17488| 6978:O1|@6979 6979:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b940bf15c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@6975,3,@17489|41,0,@6867 6980:D5,168|483b65187303ff55484989d94989c048c7c30100000048c7c001000000909090ff159a000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25390000004889c8c390909090900000000000000000a000000000000000|@6997,2097151,@17497,@6996,@2211| 6981:S85|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b283229 6982:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17491| 6983:D4,64|483b65187303ff5548a801751a4c8b480849b8a03716c9a37f0000488b084889c8ff253100000048c7c001000000c39000000000000000003800000000000000|@6989,2097151,@17492,@6985|19,0,@6984 6984:O1|@6983 6985:D5,568|483b65187303ff5548a801755a488b0848833905755648837910017565f6c3017565488b510848c7c601000000488b3a41514150ff7308ff7008ff33ff71084883ff01746f4889f84883e8024889f94883e9024883ef02488b14246a016a01565051ff7208eb0ae9b2010000e91f0100004c8d44242048c7c3110000004889f8eb0ae909010000e90401000048ba50a8dc00000000009090ff12488b4424205948d1e8480fb60401488d440001488b4c2420eb05e99300000048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f803752a498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b0c24488908eb05488b4424104883c4085f4883c4184889c6483b65187303ff5548e9f3feffff4883c4085b4889f0ff15f6000000504c8b4c24204c8b442418488b5c2410488b4424089090e88afeffff4883f8017506584883c420c34889c3584883c420ff25c8000000f6c3017414488b480848b8203a16c9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f802000000488b334889720848c70209000000488d7a1848c747f80200000048c747080300000048891757488b53084889d3488b48084889c8e806feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34c89c84c89c2ff22909000000000000000003002000000000000|@6991,2097151,@17493,@6992,@6990|142,0,I104 411,0,@6986 6986:O4|@20055,@557,@6988,@6987 6987:O5|@6782,713,0,713,0 6988:S17|6d6170417267733a206d69736d61746368 6989:S95|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d617041726773283229 6990:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17495| 6991:S104|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272795061636b2832296d6170417267732832296d6170417267283229 6992:D3,192|483b65187303ff5548a801756a498d4fa8483b4d107303ff55404989cf48c741f8020000004889590848c70109000000488d511848c742f80400000048c7421801000000488b304889721048894a0848c7020d000000488d4a2848c741f80200000048c741080300000048891151488b50084889d0eb05e92a00000090e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000b800000000000000|@1363,31,@17494| 6993:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8783d16c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17496|64,0,@6994 6994:O2|@6995,0 6995:O2|@6867,1 6996:D3,440|483b65187303ff5548a801750941f600017503ff5570493b00750848c7c001000000c3a80174084883f8017d08eb1cf640ff107516a801740d41f600017407493b007c1deb05ff5570ebf44889c148b8e09e10c9a37f0000488b5d08909090ff136a016a0141514150535041ff70084c8d44242848c7c31100000048ba50a8dc0000000000909090ff12488b4424285948d1e8480fb60401488d440001488b4c242848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801746d488b442408488b542418ff12488b0c24f6c10174064883c1027105ff5570ebf5488b542408f6c20174064883c2027105ff5570ebf5504c8b4c24204c8b4424184889d34889c890e8e2feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e909000000594889084883c430c3488b0424a80174064883c0027105ff5570ebf54c8b4c24184c8b442410488b5c24089090e88afeffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848b980d606c9a37f00004889084883c430c3900000000000000000b001000000000000|@6998,2097151,@17498|80,0,@4917 125,0,I104 407,0,@509 6997:S38|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229 6998:S47|434f4445545245455f4f5054494d4953455228292e6275696c6446756c6c5475706c65283229657874417267283229 6999:D4,520|483b65187303ff55484883f80175044c89c0c34150ff700853ff30488b1c24488b442408ff15f60100005948c7c20100000050f6c1017561488b0148833805755d4883781001755b488b580848c7c60100000048c7c701000000ff710852ff33ff7008483b7c2408736b4889f84883c002488b0c246a016a015650ff71084c8d44241848c7c3110000004889f848ba50a8dc0000000000eb0fe9f3000000e9bc000000e9b7000000ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760eeb05e96800000048c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085f4883c4184889c6483b65187303ff5548e921ffffff40f6c6017412f644241001740b488d76ff48037424107121ff5570ebf0f6c20174064883c2027105ff5570ebf54889d6ff71086a016a016a014889f24883c41859483b65187303ff5548e9a2feffff4889d0a8017412f644240801740b488d40ff48034424087105ff5570ebf0498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b542418488951105a4883c4084889510848c701070000004989c84889c3584883c408e908feffff00000000000000000002000000000000|@7001,2097151,@17499,@7000|143,0,I104 7000:D5,648|483b65187303ff5548f6c3017567488b0b4883390575634883791001756150ff357b020000ff730850ff7108488d5c2418488b0424909090ff156a020000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488901488b042448c7c20100000048c7c301000000eb0fe9f0010000e933010000e92e01000051ff30483b1c24736d4889d84883c002488b4c24106a016a015250ff71084c8d4424184889de48c7c3110000004889f048ba50a8dc00000000009090ff12488b4424185948d1e8480fb60401488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e2eb05e95b0000004883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085b4883c4184889c2483b65187303ff5548e92dfffffff6c2017412f644241801740b488d52ff48035424187105ff5570ebf0488b5c24204883c4084889d0909090e876feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c3a80174084883f8017c08eb1bf640ff1074154889c248b8f0a115c9a37f0000488b5d089090ff13498d57b8483b55107303ff55404989d748c742f8020000004889420848c70201000000488d721848c746f8020000004889560848c70609000000488d561848c742f80200000048c7420803000000488932a80174064883c0027105ff5570ebf552488b4b084889cbe8bafdffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008002000000000000|@7003,2097151,@17500,@7002,@6980|182,0,I104 457,0,@6844 7001:S86|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c79283329 7002:D3,144|a8017410f6420801740a488d40ff480342087105ff5570ebf1a80174084883f8017c08eb1cf640ff1074164889c148b8f0a115c9a37f0000488b5d08909090ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c39090909000000000000000008800000000000000|@7004,7,@17501|48,0,@6844 7003:S97|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229 7004:S100|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833297472616e73666f726d46756e6374696f6e417267756d656e7428342963757272794170706c792833296d616b6541726773283229283129 7005:S40|434f4445545245455f46554e4354494f4e5328292e6d6b536574436f6e7461696e65722833292829 7006:D3,144|a8017410f6420801740a488d40ff480342087105ff5570ebf1a80174084883f8017c08eb1cf640ff1074164889c148b8f0a115c9a37f0000488b5d08909090ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c39090909000000000000000008800000000000000|@7007,7,@17503|48,0,@6844 7007:S67|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e417267732833296d61705061747465726e2833297475706c652d283129 7008:D3,240|483b65187303ff5548a8017574f6c30174084883fb017c08eb1ff643ff107419488b4808488b1048b8f0a115c9a37f0000488b5d089090ff13498d4fa8483b4d107303ff55404989cf48c741f8020000004889590848c70101000000488d511848c742f80200000048894a0848c70209000000488d4a1848c741f804000000eb05e94c00000048c7411801000000488b30488971104889510848c7010d00000051488b50084889d090e852ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090909090900000000000000000e800000000000000|@1363,31,@17504|41,0,@6844 7009:D5,456|483b65187303ff55484883f801751e4883fb01741048b8684b16c9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b08488b500848b8684b16c9a37f0000488b5d08ff13ff30ff33488b5b08488b4008e8a6ffffff488b4c240848833905756548837910017563488b510848c7c30100000048c7c60100000050ff32ff7108483b742408736d4889f04883c002488b0c246a016a015350ff71084c8d44241848c7c3110000004889f048ba50a8dc0000000000ff12488b4424185948d1e8480fb60401eb0ae9be000000e9b9000000488d440001488b4c241848c7c2030000004883ea014883f97f760748c7c17f000000eb05e96100000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017414488b442408a80174064883c002710aff5570ebf5488b4424085e4883c4184889c3483b65187303ff5548e926ffffff4889d848bbc04b16c9a37f00004883c41090ff156a00000048833c240175054883c418c35b4883c410ff255b0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c244889084883c410c30000000000000000c001000000000000|@7016,2097151,@17507,@1354,@7015|23,0,@7010 59,0,@7010 176,0,I104 355,0,@7012 7010:O4|@20116,@2564,0,@7011 7011:O5|@2563,89,0,89,0 7012:O1|@7013 7013:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@7014,1,@17506|2,0,@441 7014:S57|434f4445545245455f4f5054494d4953455228292e7472616e73666f726d46756e6374696f6e41726773283329657870616e64283329283129 7015:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17508| 7016:S21|4c697374506169722e666f6c647245712834292829 7017:D3,192|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13488b0b498d57e8483b55107303ff55404989d748c742f802000000488b3148897208488b3848893a524c8b43084c89c3488b78084889f890e87affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c39090909090900000000000000000b800000000000000|@3595,127,@17509|23,0,@3592 59,0,@3592 7018:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8783d16c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17515|64,0,@6994 7019:S37|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c74283329 7020:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8d0cc06c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17512|64,0,@437 7021:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17513| 7022:D3,192|483b65187303ff55484883f801750848c7c001000000c3488b08498d57b8483b55107303ff55404989d748c742f80200000048895a0848c70201000000488d721848c746f8020000004889560848c70609000000488d561848c742f802000000488b3948897a08488932f6c30174064883c3027105ff5570ebf552488b70084889f0909090e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000b800000000000000|@7023,63,@17514| 7023:S48|434f4445545245455f4f5054494d4953455228292e64657475706c65526573756c742833296d61704172672833292829 7024:O2|3,@7025 7025:S19|4f7574707574206f66206f7074696d69736572 7026:S41|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d69736572283329 7027:D4,240|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f802000000c642ff4048be885216c9a37f000048893248c7420801000000498d77c8483b75107303ff55404989f748c746f80600000048bfd05b16c9a37f000048893e48894e0848895e104c895618488b7c240848897e2048895628488066ffbf48897208488062ffbf41514150514889d3909090ff154e00000059488b09488b542408488902584889420848894a1048c7c0010000004883c408c208009090900000000000000000e800000000000000|@7282,1048575,@17661,@3169|74,0,@7028 119,0,@7042 7028:D5,496|483b65187303ff554848833815757152ff70104c8b42084889d3488b40089090ff15e201000050488b5c2410488b442408909090ff15d6010000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c4104889410848c70115000000498d47f0483b45107303ff55404989c748c740f801000000eb05e904000000488908c34883380f7564488b48084883791801755e4883792803755c498d5fc8483b5d107303ff55404989df48c743f80300000048894b1048c743080100000048c70301000000488d732048c746f80200000048c746080100000048891e6a016a014889e34889f0488b5208eb0fe9df000000e9d2000000e9cd0000009090ff1248833c24017550f6442408017515488b442408488b084883390375074883780801741048b8b05416c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b49184889084883c410c3488b04244883780801750848837c2408017415488b0848b8b05416c9a37f0000488b5d089090ff13488b00498d4fe8483b4d107303ff55404989cf48c741f802000000488b40104889410848c7010f000000498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c348c7c001000000c348c7c001000000c3900000000000000000e801000000000000|@7033,1048575,@17518,@7032,@3169|299,0,@7029 373,0,@7029 7029:O4|@20055,@557,@7031,@7030 7030:O5|@6782,1411,0,1411,0 7031:S14|70726f636573734c616d62646173 7032:D4,80|483b65187303ff5548a8017529415053ff30488b4008909090e8e2ffffff4c8b4c24104c8b4424084889c3584883c410ff253200000048c7c001000000c3909000000000000000004800000000000000|@1696,1048575,@17519,@7034| 7033:S65|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129 7034:D9,792|483b65187303ff554848833801756f53ff7018ff7010ff70084c89c3488b4020ff150a030000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44241048894118488b44240848894110584883c4104889410848c70101000000498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000005a48895008488908c3488338057548534c89c3488b40089090ff1596020000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f8020000005a48895008488908c348833807756f6a016a0153488d5c2408488b40084c89ca909090ff12f644240801740948c7c001000000eb42498d47d0483b45107303ff55404989c748c740f802000000488b4c24084889480848c700070000004889c1488d401848c740f80200000048c740080100000048890848833c2401eb05e928000000740c488b1c249090ff15de0100004883f80175064883c41058c34889c34883c41058ff25cc010000488b48184883390f7569498d57c8483b55107303ff55404989d748c742f803000000488b710848897210488b781048897a084c8b40084c89024c8d522049c742f80200000049c74208010000004989126a016a0153488d5c24084c89d04c89caff1248837c240801752348833c2401750deb05e9a90000004883c41058c3488b1c244883c41058ff2547010000488b4424084883780801750848837c2410017414488b0848b8705916c9a37f0000488b5d0890ff13488b08498d57a8483b55107303ff55404989d748c742f802000000488b591048895a0848c7020f000000488d721848c746f80400000048895618488b510848895610488b3948897e0848c70603000000488d462848c740f8020000004c8b04244c8940084889304883c418c353ff7010ff70084c89c34889c89090ff15a6000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44240848894110584883c4084889410848c70103000000498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c300000000000000001003000000000000|@7039,1048575,@17520,@3169,@3169,@7040,@7041,@7038,@3169|546,0,@7035 7035:O4|@20055,@557,@7037,@7036 7036:O5|@6782,1424,0,1424,0 7037:S13|636865636b42696e64696e6773 7038:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17523| 7039:S81|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332972756e436865636b73283129636865636b42696e64696e6773283229 7040:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17521| 7041:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17522| 7042:D8,888|483b65187303ff5548488b4a08488b09488b720848c7060100000053525051488b5a2890ff1566030000488b4c2410488b5108488b1248833c24017414488b590848c7030300000048c7c601000000eb0748c7c6010000004883fa017560488b542408f6c2017529488b1a488b731048837e2801750948c7c703000000eb19488b7a084889fa483b65187303ff5548ebd248c7c7010000004883ff017555488b542408f6c2017559488b1a488b7310488b7e1840f6c701755c4c8b07eb05e9bf0000004983380575634c8b4c240841f6c101754b4d8b114d8b5a0841f6c301750a41f64008017503ff55704d3b58087515eb05e98a00000049c7c403000000eb25e96f0000004d8b61084d89e1483b6518730aeb05e930000000ff5548ebaf49c7c4010000004983fc01750949c7c103000000eb1c4c8b47084c89c7483b65187303ff5548e969ffffff49c7c1010000004983f901740948c7c703000000eb1c488b7a084889fa483b65187303ff5548e92effffff48c7c7010000004883ff01741c488b4c241848890148c741080100000048c7c0010000004883c420c34889c74889f8ff15ee010000498d4fb0483b4d107303ff55404989cf48c741f8020000004889790848c70107000000488d511848c742f80200000048c742080100000048890a488d4a1848c741f80300000048c74110010000004889410848c7011d000000a8017524488b1848833b057512488b58084889d8483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741057524889c8909090ff155a010000eb054889c85752498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70115000000488b042448c7c201000000a8017531488b18f6c201740ef64308017408483b53087d0beb05ff5570ebf3488b5308488b58084889d8483b65187303ff5548ebcb4889d0a80174064883c0027105ff5570ebf56a016a01488b542428ff72204c8b52184c8d4c24084c8b42104889c34889c89090ff15ba00000048c7c0010000005a9090ff12498d4fe0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c70105000000488b442418488b400848c700030000004989c848c7c30100000058909090ff156a000000488b4c241848c701010000004889410848c7c0010000004883c420c390909090909000000000000000007003000000000000|@7044,2097151,@17524,@7045,@7046,@2211,@3135,@7043| 7043:D4,208|483b65187303ff5548a801756e488b084150ff700853ff7108ff3149c7c001000000488b44242090ff15ba000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b44240848894110584883c4084889410848c7010300000058a80174064883c0027105ff5570ebf5514c8b442410eb05e9360000004889c3488b44240890e872ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390900000000000000000c800000000000000|@7047,1048575,@17527,@2178| 7044:S70|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129 7045:D4,280|483b65187303ff5548a801756f488b08488b511053ff7008ff7108ff31ff7238ff7230ff7228ff7220ff7218ff7210ff7208488b02909090ff15f2000000498d4f98483b4d107303ff55404989cf48c741f808000000488b54243048895138488b54242848895130488b54242048895128488b54241848895120eb05e979000000488b54241048895118488b542408488951105a4883c43048895108488901488d414848c740f80300000048894810488b4c240848894808594883c40848890850488b5c2410488b4424089090e82effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000001001000000000000|@1363,1048575,@17525,@3169| 7046:D3,168|483b65187303ff5548a801756e488b08498d57d0483b55107303ff55404989d748c742f802000000488b590848895a0848c70205000000488d721848c746f8020000004889560848c7060900000056488b50084889d0909090e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c3909090909090900000000000000000a000000000000000|@1363,31,@17526| 7047:S83|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e28332970726f636573734c616d62646173283129676574526573756c7473283229 7048:S55|434f4445545245455f4f5054494d4953455228292e636f6465747265654f7074696d6973657228332970726f6365737354726565283329 7049:D4,552|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000f6c30174084883fb017d08eb1cf643ff107516f6c301740b483b1dd50100007c1ceb06f643ff1075144889c248b820f007c9a37f0000488b5d0890ff134889daf6c20174064883c2027105ff5570ebf54889ce4889d14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891f498d47e8483b45107303ff55404989c748c740f80200000048b9106616c9a37f000048890848897808488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048bb106716c9a37f000048891948897908488061ffbf498d5fe8483b5d107303ff55404989df48c743f80200000048bf806916c9a37f000048893b48897308488063ffbf498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4fd84c3b4d107303ff55404d89cf49c741f8040000004989591849894910498979084989016a016a016a01415057564c8d4424184c89cb4889d048ba206a16c9a37f0000909090ff1586000000498d47e0483b45107303ff55404989c748c740f803000000488b4c242848894810488b4c242048894808488b4c241848890859488b095a488b12488b1c2448890348894b084889531048c7c0010000004883c420c39000000000000000001802000000000000fdffffffffffff01|@7277,1048575,@17657,@7062|90,0,@1509 216,0,@7050 262,0,@7052 308,0,@7058 425,0,@7060 7050:D3,152|498d4ff0483b4d107303ff55404989cf48c741f801000000488b5808488919488b3040f6c60174084883fe017d08eb25f646ff10751f488b7a08488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5488b520848894cb2fc48c7c001000000c39000000000000000009000000000000000|@7051,63,@17529|87,0,@1517 7051:S47|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229656e74657241646472283129 7052:D3,312|4883380375134889c148b8706816c9a37f0000488b5d08ff13488338077541498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80200000048ba30e306c9a37f000048895008488908c3488338017541498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80200000048ba30e306c9a37f000048895008488908c3488b4808f6c10174084883f9017d08eb23f641ff10751d488b5a08488b1bf6c101740af6c3017405483bcbeb05ff5570ebf67c1248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b5208488b4c8afc4883f901751148b8386208c9a37f0000488b5d0890ff13488b01c39090909090909000000000000000003001000000000000|@7057,15,@17530|11,0,@7053 80,0,@573 151,0,@573 221,0,@1493 270,0,@1662 7053:O4|@20055,@557,@7055,@7054 7054:O5|@7056,921,0,921,0 7055:S31|746f70206c6576656c207265616368656420696e2073696d706c6966696572 7056:S52|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f53494d504c49464945522e736d6c 7057:S48|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296c6f6f6b757041646472283129 7058:D3,56|488b4208488b00488b4a08488b09f6c10174064883c1027105ff5570ebf5488b520848890ac3909000000000000000003000000000000000|@7059,7,@17531| 7059:S44|434f4445545245455f53494d504c494649455228292e73696d706c69666965722832296d6b41646472283129 7060:O7|@7062,@7069,@7082,@7108,@7147,@7217,@7061 7061:O7|@7236,@7060,@7069,@7082,@7108,@7147,@7217 7062:D7,1072|483b65187303ff5548488b0848bebe6a16c9a37f0000488d748efcffe690e973000000909090e9b6000000909090e963000000909090e9c1000000909090e9d4000000909090e94b000000909090e957010000909090e906030000909090e933000000909090e92b000000909090e95f030000909090e91b000000909090e913000000909090e90b000000909090e96f030000909090498d4fe0483b4d107303ff55404989cf48c741f80300000048be186f16c9a37f0000488931488b52304889510848895910488061ffbf41504889cb909090ff156e0300005bff256f0300004d89c24989d94c8b4018488b5810488b48084889c8488b5210ff224d89c24989d94c8b4018488b5808488b48104889c8488b5218ff224150488b4008488b5310909090ff12488b08488339017531498d57e0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70205000000eb27498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c70209000000488b1c2448891348c7430801000000488b50084889531048c7c0010000004883c408c36a016a016a01415052ff7010ff70184c8d442420488b4008909090e836feffff488b442430488338057569488b4810488b4424084889ca909090ff12488b08488339017531498d57e0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70205000000eb2e498d57e8483b55107303ff55404989d748c742f802000000488b5908eb05e93000000048895a0848c70209000000488b5c2418488913488b54242848895308488b50084889531048c7c0010000004883c438c348833c2401745d488b44242048833805751749c7c003000000488b5c2408909090ff15be010000eb5c498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488b4c240848894810488b4c24204889480848c7000d000000eb5f488b44242048833805751b49c7c001000000488b5c24089090ff156a010000eb3ee939000000498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4c240848894810488b4c24204889480848c7000d000000488b4c2418488901488b4424284889410848b830e306c9a37f00004889411048c7c0010000004883c438c36a016a0141504c8d54240849c7c10100000049c7c001000000488b4008488b52209090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848c7000f000000488b0c2448890148c7410801000000488b4424104889411048c7c0010000004883c418c3498d4fe8483b4d107303ff55404989cf48c741f802000000488b701048897108488b78084889394889c8488b5228ff224d89c14989d8488b5810488b48084889c8488b5208ff229090909090909000000000000000002804000000000000|@7066,1048575,@17533,@3169,@7065,@2178,@2178|14,0,$7062+30 176,0,@7063 841,0,@573 7063:D3,56|483b65187303ff5548488b4a104c8b51184c8b49104c8b4108488b19488b72084889f2ff2290909000000000000000003000000000000000|@7064,1048575,@17532| 7064:S39|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283129283129 7065:D6,336|483b65187303ff554848833805755c498d4fe0483b4d107303ff55404989cf48c741f803000000488b501048895110488b70084889710848c70105000000f6c201754a488b3a4c8b074c3b051801000075294c3b0517010000741a48b878e107c9a37f0000488b5d08eb05e93e000000909090ff134c8b4f10eb1c4c8b4a084c89ca483b65187303ff5548ebb149b930e306c9a37f000048890b48c74308010000004c894b1048c7c001000000c34883381575646a016a016a0153ff7008488d5c2410488b40109090e832ffffff48837c2418017506488b0424eb12488b5c2418488b0424909090ff158a000000488b4c24084883c408488b54240848891148894108488b4424184889411048c7c0010000004883c420c348890348c743080100000048b830e306c9a37f00004889431048c7c001000000c39090909090909000000000000000004801000000000000|@7068,255,@17534,@20054,@20054,@7067|93,0,@1486 143,0,@573 293,0,@573 7066:S36|434f4445545245455f53494d504c494649455228292e73696d705370656369616c283229 7067:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17535| 7068:S44|434f4445545245455f53494d504c494649455228292e73696d705370656369616c28322973706c6974283129 7069:O2|@7070,@7060 7070:D8,408|483b65187303ff554848c7c1010000004889c640f6c601751ff6c10174064883c1027105ff5570ebf5488b7608483b65187303ff5548ebdb41515153488b5a08ff156a0100006a016a014889e3909090ff1562010000488b04249090ff155e0100004889c1f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017439498d4fe0483b4d107303ff55404989cf48c741f803000000488b542410488951104889410848c7011d0000004889c89090ff15f6000000eb2f4889c1498d47e0483b45107303ff55404989c748c740f803000000488b542410488950104889480848c7001d0000004889c6488b44240890ff15be000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba387416c9a37f00004889115a4883c41048895108488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048894a105948894a0848c70205000000488b0c24488931488941084889511048c7c0010000004883c408c300000000000000009001000000000000|@7074,1048575,@17537,@7075,@3589,@7079,@2211,@7073|300,0,@7071 7071:D3,88|488b5208f6c20174144889c148b8c0e406c9a37f0000488b5d0890ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbf90909000000000000000005000000000000000|@7072,7,@17536|14,0,@578 7072:S45|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329737065635265632d283129 7073:D4,72|483b65187303ff5548a801751fff30488b40089090e8e6ffffff4883f801750258c34889c358ff253400000048c7c001000000c39090909000000000000000004000000000000000|@1696,15,@17543,@7081| 7074:S34|434f4445545245455f53494d504c494649455228292e73696d705475706c65283329 7075:D4,256|483b65187303ff5548a80175716a016a016a01415053ff70084c8d442418488b5c2410488b00488b54240890ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c242848894810488b4c242048894808488b4c24184889086a016a014989e0488b5c2420ff15a6000000498d47e8483b4510730aeb05e95f000000ff55404989c748c740f802000000488b4c240848894808594883c408488908504c8b442418488b5c2410488b442408909090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c39090909090900000000000000000f800000000000000|@1363,1048575,@17538,@7076| 7076:D4,440|483b65187303ff5548488b08488339097551498d57d0483b55107303ff55404989d748c742f802000000488b590848895a0848c70203000000488d721848c746f802000000488b781048897e08488916498930488b50084989500848c7c001000000c3488339057559498d57c8483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70201000000488d7a2048c747f8020000004c8b48104c894f08488917498938488b50084989500848c7c001000000c3415051ff7008ff701048c7c001000000488b53189090ff12498d8f78ffffff483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d511848c742f80200000048894a0848c70203000000488d4a1848c741f8020000005b48895908488911488d511848c742f804000000488b5c240848895a184889421048c742080100000048c70203000000488d422848c740f80200000048c74008010000004889104883f8017506488b0424eb134889ce4889c3488b0424ff154a0000004889f1488b5424104883c41048890a4889420848c7c0010000004883c408c39090900000000000000000b001000000000000|@7078,1048575,@17539,@7077| 7077:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17540| 7078:S36|434f4445545245455f53494d504c494649455228292e6d616b654e65774465636c283229 7079:D4,216|483b65187303ff5548a8017568488b08488b1148833a017542488b78084c8b4208488b5908488b4210909090ff15be000000498d4fe0483b4d107303ff55404989cf48c741f803000000488941104c89410848c70105000000eb32498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e940000000488b52084889510848c70109000000488b7808514889f8e86affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090909090900000000000000000d000000000000000|@1363,127,@17541,@7080| 7080:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17542,@20054|75,0,@20054 7081:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17544| 7082:O2|@7083,@7060 7083:D13,1640|483b65187303ff55486a016a016a0141524151524150534c8d4424284c89cb488b4a084889ca9090ff12488b44242848833805757048837808017507488b442408eb04488b04246a016a016a01488b4c24284989e0488b5c2430488b51089090ff1248837c2408017507488b442448eb11488b5c2408488b44244890ff15fe050000488b4c24385a4883c40848891148894108584889411048c7c0010000004883c440eb05e901000000c34c8b4424384889c3488b442430ff15ca0500006a016a016a01488b4c2428504c8d442408488b5c2438488b442420488b5108909090ff126a016a016a01488b4424484989e0488b5c2450488b4808488b4424404889ca909090ff12488b44242048833817756d4c8b4424304889c3488b4424289090ff156a050000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba80d606c9a37f00004889511848894110488b4424184889410848c70103000000498d47d0483b45107303ff55404989c748c740f80200000048894808eb05e94400000048c70005000000488d481848c741f802000000488b54240848895108488901488b442458488b142448891048894808488b4c24104889481048c7c0010000004883c478c348833805755848837c2428017555488b0c2448833905756848837c2408017565488b5008483b51087560498d4fe8483b4d107303ff55404989cf48c741f802000000488b5c24184889590848c70105000000498d5fe8483b5d10730feb0ae9e2020000e994010000ff55404989df48c743f80200000048c7430801000000eb0fe977010000e972010000e92900000048890b488b4c24584889014889590848bb30e306c9a37f00004889591048c7c0010000004883c478c34883fa0375364883790801752f488b4c2458488b5c241848891948c741080100000048bb30e306c9a37f00004889591048c7c0010000004883c478c34883fa01756948837908037567498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5c24184889194889c890ff159e030000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba18d706c9a37f000048895110eb0ae93a000000e9350000004889410848c70107000000488b44245848890848c740080100000048b930e306c9a37f00004889481048c7c0010000004883c478c3498d5fd8483b5d107303ff55404989df48c743f80400000048894b1848894310488b4c241848894b0848c70303000000488b4c245848891948c741080100000048bb30e306c9a37f00004889591048c7c0010000004883c478c3488b0c2448833917756d4c8b4424104889cb488b4424089090ff15be020000498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b880d606c9a37f000048894110488b4424184889410848c70103000000498d47d0483b45107303ff55404989c748c740f80200000048894808eb05e94500000048c70005000000488d481848c741f802000000488b54242848895108488901488b442458488b54242048891048894808488b4c24304889481048c7c0010000004883c478c34c8b4424304889c3488b442428909090ff150e0200004989c14c8b442410488b1c24488b44240890ff15fe010000498d4fd8483b4d107303ff55404989cf48c741f804000000488941184c894910488b4424184889410848c70103000000488b44245848890848c740080100000048b930e306c9a37f00004889481048c7c0010000004883c478c3488b0c244883391775734c8b4424104889cb488b44240890ff158e010000498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b880d606c9a37f000048894110488b4424184889410848c70103000000498d47d0483b45107303ff55404989c748c740f8020000004889480848c70005000000eb05e93e000000488d481848c741f802000000488b54242848895108488901488b442458488b54242048891048894808488b4c24304889481048c7c0010000004883c478c34c8b4424304889c3488b442428909090ff15de0000004989c14c8b442410488b1c24488b44240890ff15ce000000498d4fd8483b4d107303ff55404989cf48c741f804000000488941184c894910488b4424184889410848c70103000000488b44245848890848c740080100000048b930e306c9a37f00004889481048c7c0010000004883c478c39090909000000000000000006006000000000000|@7085,1048575,@17545,@7086,@7087,@7094,@7096,@7097,@7099,@7101,@7103,@7105,@7084|320,0,@509 615,0,@573 675,0,@573 796,0,@513 849,0,@573 939,0,@573 1024,0,@509 1268,0,@573 1352,0,@509 1596,0,@573 7084:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17563,@7107,@7088| 7085:S39|434f4445545245455f53494d504c494649455228292e73696d7049665468656e456c7365283429 7086:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17546| 7087:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17547,@7092,@7088| 7088:D4,376|483b65187303ff55484883f80175044889d8c348833b09755b488b4b084883390575564889c2f6c20174164889c648b8d88616c9a37f0000488b5d08909090ff1348837a08017505488b12eb0f488b5208483b65187303ff5548ebca48833a037563488b710840f6c6017515f6421001750feb0ae9c3000000e9be000000ff5570483b7210755f48c7c7010000004989c041f6c001752040f6c70174064883c7027105ff5570ebf54d8b4008483b65187303ff5548ebda40f6c70174064883ef02710ceb05e947000000ff5570ebee4c8b42184889fb9090ff15b20000004c89c3e91affffff4889c2498d47e0483b45107303ff55404989c748c740f803000000488958104889500848c70015000000c34889c2498d47e0483b45107303ff55404989c748c740f803000000488958104889500848c70015000000c34889c1498d47e0483b45107303ff55404989c748c740f803000000488958104889480848c70015000000c39000000000000000007001000000000000|@7093,127,@17549,@4963|48,0,@7089 7089:O4|@20091,@1627,0,@7090 7090:O5|@580,88,0,88,0 7091:S43|434f4445545245455f53494d504c494649455228292e7370656369616c546f47656e6572616c2833292829 7092:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17548,@20054|75,0,@20054 7093:S30|434f4445545245455f53494d504c494649455228292e6d6b456e76283229 7094:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17550,@7095,@7088| 7095:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17551,@20054|75,0,@20054 7096:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@17552| 7097:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17553,@7098,@7088| 7098:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17554,@20054|75,0,@20054 7099:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17555,@7100,@7088| 7100:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17556,@20054|75,0,@20054 7101:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17557,@7102,@7088| 7102:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17558,@20054|75,0,@20054 7103:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17559,@7104,@7088| 7104:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17560,@20054|75,0,@20054 7105:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17561,@7106,@7088| 7106:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17562,@20054|75,0,@20054 7107:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17564,@20054|75,0,@20054 7108:O3|@7109,@7060,@7061 7109:D14,2304|483b65187303ff55486a016a016a0141525241515341ff71084150504c8d4424384c89cb488b4a084889ca90ff12488b042448833809756d498d4fe8483b4d107303ff55404989cf48c741f802000000c641ff4048bab89e16c9a37f000048891148c7410801000000498d57e0483b55107303ff55404989d748c742f80300000048bb709f16c9a37f000048891a48894a08488b580848895a10488062ffbf48895108eb05e958000000488061ffbf488b54241851f6c201753f488b02ff72084c8b44240848c7c301000000488b084889c89090ff153e0800004883f801740d48c7c0030000004883c408eb1e5a483b65187303ff5548ebbc48c7c001000000eb0948c7c0010000006a01488b4c24504883390175674883f8017566488b410848c7c201000000488b5820f6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdc48c7c301000000488b74242040f6c601752bf6c30174064883c3027105ff5570ebf5488b7608483b6518730feb0ae936030000e931030000ff5548ebcff6c2017508f6c3017503ff5570483bd37417488b10488b583048b898a716c9a37f0000488b5d08ff13488b54241848c70203000000488b542428488b5830f6c30174084883fb017d08eb1cf643ff107516f6c301740b483b1d0f0700007c1eeb06f643ff107516488b3048b820f007c9a37f0000488b5d08909090ff13f6c30174064883c3027105ff5570ebf5488b71104889d9488b18488b783048c7c0010000004989f8488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c8907488b44243053ff7218ff720857564989d0488b5808488b442448909090ff159a0600006a016a014889e3909090ff159206000048833c2401750c48b8909adc0000000000eb6f48c7c001000000488b0c24f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b050e0600007d08eb1bf640ff1075154889c148b818930ec9a37f0000488b5d089090ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9660000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b0c244883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f84889c64883c4085890ff159e050000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba28a816c9a37f00004889115a4889510848897110488b142448895118488061ffbf498d5fe8483b5d107303ff55404989df48c743f80200000048be30aa16c9a37f000048893348895308488063ffbf498d57d8483b55107303ff55404989d748c742f804000000488b7424104883c4084889721848894a10594883c40848894a0848891a6a016a016a01488b4c2450504c8d4424084889d3488b442420488b5108909090ff1248837c2410017506488b0424eb12488b5c2410488b0424909090ff15c60400004883f8017507488b442470eb0f4889c3488b44247090ff15b2040000488b4c24604883c4085a4883c40848891148894108584883c4084889411048c7c0010000004883c458c3488b442440488338057571488b4c2430ff70084c8b442430488b5910488b442428909090ff1566040000f604240174154889c148b8f86f07c9a37f0000488b5d089090ff1350488b5c240848c7c0cd00000048bad0b3dc0000000000ff124883f8017461488b5c240848c7c0cf00000048ba90b4dc0000000000eb05e928030000909090ff124881e0010000604881f8010000607566488b0424a801752c488b08488b1148833a057512488b58084889d8483b65187303ff5548ebde48c7c001000000eb0ce97502000048c7c0030000004883f8017465488b042490ff15b6030000f644240801741c4889c148b8f86f07c9a37f0000488b5d08eb05e93e0200009090ff1350488b5c241048c7c0cd00000048bad0b3dc0000000000ff124883f8017432488b5c241048c7c0cf00000048ba90b4dc0000000000eb05e9fe010000909090ff124881e0010000604881f801000060741348b840ab16c9a37f0000488b5d08909090ff13498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b0c244889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff15ca0200009090ff15ca0200004883380574154889c148b8b8ab16c9a37f0000488b5d089090ff13ff750848b9869c16c9a37f00005148896508f6442420017417488b480848b8f86f07c9a37f0000488b5d08909090ff13488b4808498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c242048890848ba50c1dc000000000090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c701050000004883c4085848894508eb699090488b65084883c4085b48895d08488338037548498d4fd8483b4d107303ff55404989cf48c741f80400000048ba40ac16c9a37f000048895118488b501048895110488b580848895908488b304889314889c24889c8488b5d08ff13498d4fc8483b4d10730aeb05e978000000ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f8020000004889480848c700170000004889c1eb3b498d4fd8483b4d107303ff55404989cf48c741f804000000488b44242048894118488b44245048894110488b04244889410848c701070000006a01488b4424504883c418488908488b4c24484889480848b930e306c9a37f00004889481048c7c0010000004883c458c3488b4c24304c8b442428488b5910488b442420ff15ee000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b54241048895118488b542440488951104889410848c70107000000488b442438488908488b4c24484889480848b930e306c9a37f00004889481048c7c0010000004883c458c39090909090900000000000000000e808000000000000ffffffffffffff01fdffffffffffff01|@7138,2097151,@17572,@7113,@7139,@3589,@7140,@7142,@7143,@7144,@7146,@2211,@2211,@7136|86,0,@7110 131,0,@7112 423,0,@7119 504,0,@1509 671,0,I49 753,0,@4361 940,0,@7122 999,0,@7127 1261,0,@1294 1292,0,I150 1322,0,I153 1446,0,@1294 1484,0,I150 1514,0,I153 1552,0,@7129 1697,0,@7132 1718,0,$7109+1870 1744,0,@1294 1803,0,I204 1915,0,@7135 2121,0,@573 2242,0,@573 7110:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@7111,1048575,@17565| 7111:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283129 7112:D4,624|483b65187303ff5548488338077524498d47e8483b45107303ff55404989c748c740f80200000048c7400803000000488918c34883380f756a488b4008488b401852a801754b498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70109000000488b3424ff70084c8b46084889c89090ff15060200004889c358483b65187303ff5548ebb14889d84889c1498d47e8483b4510730aeb05e91e000000ff55404989c748c740f80200000048c74008030000004889084883c408c34883380975544883fb01740948c7c003000000eb53488b4808483b4a10750948c7c003000000eb5a488339017548488b5a1048833b017535488b710840f6c6017509f64308017503ff5570483b7308740e48c7c001000000eb55e91601000048c7c003000000eb55e9e100000048c7c001000000eb55488339037554488b5a10eb05e9c700000048833b037535488b710840f6c6017509f64308017503ff5570483b7308740e48c7c001000000eb53e99a00000048c7c003000000eb53e98c00000048c7c001000000eb5be97e000000488339057548488b5a1048833b057535488b710840f6c6017509f64308017503ff5570483b7308740e48c7c001000000eb4ce94700000048c7c003000000eb3ee93900000048c7c001000000eb30488339077523eb05e923000000488b521048833a07740948c7c001000000eb1048c7c003000000eb0748c7c0010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39000000000000000006802000000000000|@7115,1048575,@17566,@7113| 7113:D4,120|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f802000000488958084889084150514c89c2909090ff124883780801751d4c8b4c240849b8b8a216c9a37f0000488b18584883c408ff2536000000488b004883c410c390909090909000000000000000007000000000000000|@7117,1048575,@17567,@7116|68,0,@7114 7114:O1|@7113 7115:S75|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c28342969735265637572736976654172672d636f6e7461696e7346756e6374696f6e283229 7116:D3,1008|483b65187303ff5548488b0848ba46a316c9a37f0000488d548afcffe290e988010000909090e9cd010000909090e9ff010000909090e9fb010000909090e93c020000909090e938020000909090e957020000909090e95e020000909090e9c1020000909090e9bd020000909090e923000000909090e9e6020000909090e9ed020000909090e90b030000909090e912030000909090488b48084151ff70104150f6c1017559488b01488338017519ff71084c8b442418488b48204889c8488b54240890ff12eb5e48833805751aff71084c8b442418488b48084889c8488b5424089090ff12eb63488338077562488b5008ff7108f6c201755b488b02eb05e990000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b701048897108eb05e95700000048c7010f000000ff72084c8b4424204889c8488b5424109090ff124889c3eb0fe932000000e916000000e90c0000005a483b65187303ff5548eb8f4889d8eb17ff71084c8b442418488b48184889c8488b54240890ff124889c359483b65187303ff5548e90dffffff4889d84c8b4424104889c3488b4424085a4883c410ff22488b481041514150ff7008f6c101752a488b01488b10ff71084c8b442418488b4210488b5424109090ff124889c359483b65187303ff5548ebd14889d84c8b4424104889c3585a4883c408ff2241514150ff7018ff70104d89c8488b4008488b5424109090ff124c8b4424184889c358488b542408ff124c8b4424104889c3585a4883c408ff224889d8c341514150ff70084d89c8488b4010488b542408909090ff1259f6c1017526488b11ff71084c8b4424104889c3488b02488b5424089090ff1259483b65187303ff5548ebd54883c410c34889d8c341514150ff70104d89c8488b4008488b5424089090ff124c8b4424104889c3585a4883c408ff224c89c14d89c8488b40084889caff22488b4808488b511841514150ff31f6c2017545498d47e8483b45107303ff55404989c748c740f802000000488b0a4889480848c70009000000ff72084c8b442418488b54241090ff124889c35a483b65187303ff5548ebb64889d84c8b4424104889c3585a4883c408ff224889d8c3488b400841514150a8017525488b08ff70084c8b442410488b01488b54240890ff124889c358483b65187303ff5548ebd74889d84883c410c34c89c14d89c8488b40084889caff2241514150ff70084d89c8488b4018488b54240890ff124c8b4424104889c3585a4883c408ff224c89c14d89c8488b40104889caff22488b400841514150a8017524ff70084c8b442410488b00488b542408909090ff124889c358483b65187303ff5548ebd84889d84883c410c39090900000000000000000e803000000000000|@7118,1048575,@17568|14,0,$7116+30 7117:S24|42617365436f6465547265652e666f6c6474726565283329 7118:S32|42617365436f6465547265652e666f6c64747265652833296674726565283229 7119:O4|@20055,@557,@7121,@7120 7120:O5|@7056,589,0,589,0 7121:S35|73696d7046756e6374696f6e43616c6c3a20617267756d656e74206d69736d61746368 7122:D3,272|483b65187303ff55484883380775164889c148b860a916c9a37f0000488b5d08909090ff1348833803750a488b4008488b5208ff22488338017544f6400801741d488b5a1048b9ffffffffffffff0048234bf8488d4c0901483b48087717488b480848b8b0df06c9a37f0000488b5d08909090ff13488b4008488b4483fcc3488b4808f6c10174084883f9017d08eb23f641ff10751d488b5a18488b1bf6c101740af6c3017405483bcbeb05ff5570ebf67c1248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b5218488b4c8afc4883f901751148b8386208c9a37f0000488b5d0890ff13488b01c39090909090909000000000000000000801000000000000|@7126,1048575,@17569|20,0,@7123 71,0,36028797018963967 100,0,@560 181,0,@1493 230,0,@1662 7123:O4|@20055,@557,@7125,@7124 7124:O5|@7056,619,0,619,0 7125:S27|6c6f63616c4f6c64416464723a204c6f6164526563757273697665 7126:S56|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c2834296c6f63616c4f6c6441646472283129 7127:D3,152|498d4ff0483b4d107303ff55404989cf48c741f801000000488b5808488919488b3040f6c60174084883fe017d08eb25f646ff10751f488b7a08488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5488b520848894cb2fc48c7c001000000c39000000000000000009000000000000000|@7128,63,@17570|87,0,@1517 7128:S59|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429736574546162466f72496e6c696e65283129 7129:O4|@20055,@557,@7131,@7130 7130:O5|@7056,118,0,118,0 7131:S13|6e6f74206561726c7920727473 7132:O4|@20055,@557,@7134,@7133 7133:O5|@7056,124,0,124,0 7134:S26|6d616b65436f6e737456616c3a204e6f7420636f6e7374616e74 7135:O5|@7056,133,0,133,0 7136:D4,216|483b65187303ff5548a801756f488b08498d57e0483b55107303ff55404989d748c742f80300000048be78ad16c9a37f000048893248895a084c894210488062ffbf415053ff7008ff71084889d3488b01909090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901eb05e93d000000514c8b442418488b5c2410488b442408e86affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390900000000000000000d000000000000000|@1363,1048575,@17581,@3169|42,0,@7137 7137:D3,56|483b65187303ff5548488b4a104c8b51184c8b49104c8b4108488b19488b72084889f2ff2290909000000000000000003000000000000000|@7064,1048575,@17571| 7138:S41|434f4445545245455f53494d504c494649455228292e73696d7046756e6374696f6e43616c6c283429 7139:D4,256|483b65187303ff5548a801756f488b086a016a016a01415053ff70084c8d442418488b5c2410488b01488b5424089090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c242848894810488b4c242048894808488b4c24184889086a016a014989e0488b5c2420ff15a2000000498d47e8eb05e965000000483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908504c8b442418488b5c2410488b442408909090e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c390900000000000000000f800000000000000|@1363,1048575,@17573,@7076| 7140:D4,72|483b65187303ff5548a801751fff30488b40089090e8e6ffffff4883f801750258c34889c358ff253400000048c7c001000000c39090909000000000000000004000000000000000|@1696,15,@17574,@7141| 7141:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17575| 7142:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17576| 7143:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17577| 7144:D4,216|483b65187303ff5548a801756f488b08498d57e0483b55107303ff55404989d748c742f80300000048be48b216c9a37f000048893248895a084c894210488062ffbf415053ff7008ff71084889d3488b01909090ff1596000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901eb05e93d000000514c8b442418488b5c2410488b442408e86affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390900000000000000000d000000000000000|@1363,1048575,@17579,@3169|42,0,@7145 7145:D3,56|483b65187303ff5548488b4a104c8b51184c8b49104c8b4108488b19488b72084889f2ff2290909000000000000000003000000000000000|@7064,1048575,@17578| 7146:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17580| 7147:O2|@7148,@7061 7148:D6,976|483b65187303ff5548488b4830f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0d9c0300007c2feb06f641ff107527488b7038488b78204c8b58084c8b60284c8b284c8b701848b820f007c9a37f0000488b5d08ff13f6c10174064883c1027105ff5570ebf5488b7038488b78204c8b58084c8b60284c8b284c8b7018ff703048c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b442408488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000041524d8d57e84c3b55107303ff55404d89d749c742f8020000005648be58b716c9a37f000049893249897a08498062ffbf498d77b8483b75107303ff55404989f748c746f808000000415349bb58b816c9a37f00004c891e4c894e0848894e10488946184c8b4b104c894e204c8946284c89763048897e38488066ffbf498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47e84c3b45107303ff55404d89c749c740f80200000049bbb0be16c9a37f00004d891849897808498060ffbf4d8d5fc84c3b5d107303ff55404d89df49c743f80600000049be50bf16c9a37f00004d8933488b5208498953084d895310488b530849895318498973204d894328498063ffbf51415457504c89db4c89e890ff15b601000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d15a488b1248833c2403750948c7c303000000eb08488b5c2408488b1b4883fb037433515352ff35460100004989d249b9b0bf16c9a37f000049b800c016c9a37f000048bb00ed06c9a37f000090ff1526010000eb03515352498d4fb8483b4d107303ff55404989cf48c741f808000000488b542430488951385a48895130488b142448895128488b5c243848895920488b5c24084889591848c7411001000000488b742420488971084889014883fa03750c48b830e306c9a37f0000eb58498d47e8483b45107303ff55404989c748c740f80200000048baf8e306c9a37f000048891048895808488060ffbf4889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70001000000488b5424304883c43048890a4889420848c7c0010000004883c418c3909090909090900000000000000000c003000000000000fdffffffffffff01|@7169,2097151,@17591,@3169,@7170,@7167|79,0,@1509 297,0,@7149 345,0,@7151 454,0,@7160 500,0,@7162 687,0,@7163 697,0,@7165 707,0,@622 819,0,@573 855,0,@577 7149:D3,152|498d4ff0483b4d107303ff55404989cf48c741f801000000488b5808488919488b3040f6c60174084883fe017d08eb25f646ff10751f488b7a08488b3f40f6c601740b40f6c7017405483bf7eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff1340f6c60174064883c6027105ff5570ebf5488b520848894cb2fc48c7c001000000c39000000000000000009000000000000000|@7150,63,@17582|87,0,@1517 7150:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429736574546162283129 7151:D4,488|483b65187303ff5548488338037564488b4a30488b4008f6c10174154889c348b8c0e406c9a37f0000488b5d089090ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbd48833905753df64228017537488b4228488b5908f6c301eb05e9560000007508f600017503ff5570483b187516488b721048c7060300000048b870ba16c9a37f0000c3524889c8488b4a204889caff12488b0c244c8b51184883c4084c8b49104c8b4108488b5808488b104889d0ff2532010000488338077541498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80200000048ba30e306c9a37f000048895008488908c3488338017541498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80200000048ba30e306c9a37f000048895008488908c3488b4808f6c10174084883f9017d08eb23f641ff10751d488b5a38488b1bf6c101740af6c3017405483bcbeb05ff5570ebf67c1148b838e407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf5488b5238488b4c8afc4883f901751148b8386208c9a37f0000488b5d0890ff13488b01c39090900000000000000000e001000000000000|@7158,1048575,@17585,@7153|33,0,@578 148,0,@7152 261,0,@573 332,0,@573 402,0,@1493 450,0,@1662 7152:O2|@3350,@573 7153:D4,496|483b65187303ff5548488338037539488b480848833905752f41f6c0017529488b5108f6c201750941f600017503ff5570493b10751249c7010300000048b870ba16c9a37f0000c3488338017531498d4fe0483b4d107303ff55404989cf48c741f803000000488b501048895110488b70084889710848c70101000000eb394989db4c89d3488b4008909090ff1576010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701030000004c89db48833b03750c48b830e306c9a37f0000eb6948833b017568498d47d0483b45107303ff55404989c748c740f80500000048baa8bc16c9a37f00004889104c8940084c8948104c895018488b531048895020488060ffbf4889c6498d47e0483b45107303ff55404989c748c740f80300000048897010488b7308eb0ae97e000000e90d0000004889700848c70001000000eb6c498d47d0483b45107303ff55404989c748c740f80500000048ba98bd16c9a37f00004889104c8940084c8948104c895018488b531048895020488060ffbf4889c6498d47e0483b45107303ff55404989c748c740f80300000048897010488b73084889700848c700050000004889c2498d47e8483b45107303ff55404989c748c740f80200000048895008488908c3909090909090900000000000000000e801000000000000|@7159,1023,@17586,@2226|63,0,@7152 192,0,@573 234,0,@7154 356,0,@7157 7154:D3,80|483b65187303ff554852488b4a204889ca909090ff12488b0c244c8b51184883c4084c8b49104c8b4108488b5808488b104889d048ba20bd16c9a37f0000ff2200000000000000004800000000000000|@7156,1048575,@17583|54,0,@7155 7155:O1|@7153 7156:S82|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229636f6e76657274456e76283129283129 7157:D3,80|483b65187303ff554852488b4a204889ca909090ff12488b0c244c8b51184883c4084c8b49104c8b4108488b5808488b104889d048ba20bd16c9a37f0000ff2200000000000000004800000000000000|@7156,1048575,@17584|54,0,@7155 7158:S50|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129 7159:S66|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296c6f63616c4f6c6441646472283129636f6e76657274526573756c74283229 7160:D3,56|488b4208488b00488b4a08488b09f6c10174064883c1027105ff5570ebf5488b520848890ac3909000000000000000003000000000000000|@7161,7,@17587| 7161:S44|434f4445545245455f53494d504c494649455228292e73696d704c616d6264612834296d6b41646472283129 7162:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17588| 7163:O1|@7164 7164:D3,24|48c7c001000000c300000000000000001000000000000000|@6776,1,@17589| 7165:O1|@7166 7166:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c39000000000000000003000000000000000|@6783,3,@17590| 7167:D4,224|483b65187303ff554841f6c20174084983fa017d09eb1f41f642ff10751841f6c201740b4c3b15ad0000007c1ceb0741f642ff1075134889c148b820f007c9a37f0000488b5d08ff134c89d1f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c8917488b4424084889442408488b0c2448893c244d89c249b880c116c9a37f00004889d051ff2537000000909090909090900000000000000000d000000000000000fdffffffffffff01|@7215,2097151,@17615,@7172|59,0,@1509 175,0,@7168 7168:O1|@7167 7169:S35|434f4445545245455f53494d504c494649455228292e73696d704c616d626461283429 7170:O1|@7171 7171:D3,24|48c7c001000000c300000000000000001000000000000000|@6783,1,@17592| 7172:D5,192|483b65187303ff5548504152415141504152ff742438ff7424384d89ca4d89c149b810c316c9a37f00009090ff15a60000004883f801756e498d47c8483b45107303ff55404989c748c740f80600000048b920c316c9a37f0000488908488b0c2448894808488b4c240848894810488b4c241048894818488b4c243048894820488b54242848895028488060ffbf4889c3488b4424184883c4205e4883c41056ff253a000000488b004883c420c210000000000000000000b800000000000000|@7216,2097151,@17616,@7175,@3169|34,0,@7173 82,0,@7174 7173:O1|@7172 7174:D4,88|483b65187303ff5548488b4a18488b1c2448890c24ff7220ff72284c8b52104c8b4a0849b810c316c9a37f00004889de48bb90da06c9a37f000056ff252f0000009090909090909000000000000000005000000000000000|@7180,2097151,@17593,@7175|37,0,@7173 50,0,@545 7175:D10,1592|483b65187303ff5548488b0848bac6c316c9a37f0000488d548afcffe290e97d000000909090e915010000909090e963000000909090e9e6010000909090e9ea020000909090e94b000000909090e98b030000909090e946040000909090e933000000909090e92b000000909090e988040000909090e91b000000909090e913000000909090e90b000000909090e91a05000090909048c7c001000000c21800415241514150ff7010ff742430ff7424304c8b5424484c8b4c24284c8b442420488b4008488b542418909090ff1250ff742438ff7424384c8b5424504c8b4c24304c8b442428488b5c2420488b442418ff155a050000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c4204889410848c70101000000498d47f0483b45107303ff55404989c748c740f801000000488908c2180041524151415053ff7018ff7010ff742440ff7424404c8b5424584c8b4c24384c8b44243048bb90da06c9a37f0000488b4008488b54242890ff1250ff742448ff7424484c8b5424604c8b4c24404c8b442438488b5c2428488b442418488b542430909090ff1250ff742450ff7424504c8b5424684c8b4c24484c8b442440488b5c2430488b442428488b542438909090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488941185848894110584883c4304889410848c70103000000498d47f0483b45107303ff55404989c748c740f801000000488908c2180041524151415053ff7018ff7010ff742440ff7424404c8b5424584c8b4c24384c8b442430488b5c2428488b40089090ff15020400004889c34889d8ff15fe030000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424104889410848c70101000000498d47e8483b45107303ff55404989c748c740f80200000048c740080100000048890853ff742448ff7424484c8b5424604c8b4c24404c8b4424384889c3488b442418488b5424309090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424104889511848894110584883c4304889410848c70107000000498d47f0483b45107303ff55404989c748c740f801000000488908c21800488b48084883390775174889d84c89d2909090ff1248b880da06c9a37f0000eb5b488339037510488b4108488b542418909090ff12eb4548833901750f51488b4108488b542418ff1258eb30f6c301741348b840ca16c9a37f0000488b5d08909090ff134889cf4c8b4424084889d8488b5908ff15c20200004889f8498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f801000000488908c218004883781801756f498d4fc8483b4d107303ff55404989cf48c741f80300000048895910488b50104889510848c70105000000488d592048c743f80200000048c743080100000048890b52ff742418ff7424184c89d14c8b5424304c89ce4989c94c89c14989f0488b40084889ca90ff12498d4fc8eb05e93e000000483b4d107303ff55404989cf48c741f80400000048c74118010000005a488951104889410848c7010d000000488d412848c740f801000000488908c2180048c7c001000000c21800ff742410ff7424104c89d14c8b5424284c89ca4989c94989d0488b40089090ff15aa010000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c7010f000000488d411848c740f801000000488908c21800415241514150ff7008ff742430ff7424304c8b5424484c8b4c24284c8b442420488b4010488b542418ff1250ff742440ff7424404c8b5424304c8b4c24284c8b442420488b5c2440488b442418ff152a0100004883f8017506488b0424eb2e4889c1498d47e0483b45107303ff55404989c748c740f803000000488b1424488950104889480848c700150000004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c428c21800488378100175674152ff742420ff742420ff7424204d89ca4d89c14989d848c7c301000000488b40089090ff15a2000000498d4fd0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000488d412048c740f801000000488908c2180048c7c001000000c2180090909000000000000000003006000000000000|@7182,2097151,@17594,@7183,@7184,@7185,@7186,@7189,@7208,@7181|14,0,$7175+30 358,0,@545 836,0,@544 896,0,@7176 7176:O4|@20055,@557,@7178,@7177 7177:O5|@7179,126,0,126,0 7178:S25|636c65616e457874726163743a20656d707479207573616765 7179:S58|6d6c736f757263652f4d4c436f6d70696c65722f436f6465547265652f434f4445545245455f52454d4f56455f524544554e44414e542e736d6c 7180:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283129283129 7181:D4,384|483b65187303ff5548a801755a4c89c148c7c201000000ff7008ff30f6c1017556488b01488338057558f6c3017509f64008017503ff5570483b5808753e4883fa017506488b5010eb274889de488b79084889d3488b48104889c890ff15360100004889c2eb05e9f80000004889f3eb37488b7908eb31e93d000000488b7908eb264889d6498d57e8483b55107303ff55404989d748c742f80200000048897208488902488b79084889f9483b65187303ff5548e963ffffff4889d04883f801750a48b890da06c9a37f000041524151415053ff742440ff7424404c8b5424584c8b4c24604c8b4424284889c3488b442430488b54242090ff1259f6c10174064883c1027105ff5570ebf550ff742450ff742450ff742450ff7424504c8b5424384c8b4c24304c8b4424284889cb488b4424489090e8c6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c22000909000000000000000007801000000000000|@7214,1048575,@17613,@7213|196,0,@545 7182:S62|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e283229 7183:D3,280|483b65187303ff5548a801756d488b08488b11f602017505488b32eb0a48be90da06c9a37f000041524151415053ff7008ff7108ff7208ff32ff742450ff7424504889f3488b4210488b542430909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424084889410858eb05e9790000004883c408488901498d47e8483b45107303ff55404989c748c740f8020000005a4889500848890850ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b44241890e832ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2100048c7c001000000c2100090909090909000000000000000001001000000000000|@1363,1048575,@17595|31,0,@545 7184:D3,208|483b65187303ff5548a8017571488b0841524151415053ff7008ff7108ff742440ff74244048bb90da06c9a37f0000488b01488b54242090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b442418eb05e9310000009090e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2100048c7c001000000c2100090900000000000000000c800000000000000|@1363,1048575,@17596|39,0,@545 7185:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17597| 7186:D4,232|483b65187303ff5548f6c30174084883fb017d08eb1ff643ff107519498b08f6c301740af6c1017405483bd9eb05ff5570ebf67c144889c148b838e407c9a37f0000488b5d0890ff134889d9f6c10174064883c1027105ff5570ebf5498b4c88fc4883f90174124889de4889cb909090ff158a0000004889f3f6c30174084883fb017d08eb1ff643ff107519498b08f6c301740af6c1017405483bd9eb05ff5570ebf67c144889c148b810f407c9a37f0000488b5d0890ff13f6c30174064883c3027105ff5570ebf549894498fc48c7c001000000c390900000000000000000e000000000000000|@7188,95,@17598,@7187|58,0,@1493 170,0,@1517 7187:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17599| 7188:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f632836296164644c6f63616c557365283229 7189:D8,1872|488dbc2460ffffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000048c7c201000000488b702040f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdbf6c20174084883fa017d08eb1cf642ff107516f6c201740b483b15c50600007c30eb06f642ff107528488b7038488b78304c8b58284c8b60084c8b68204989c648b820f007c9a37f0000488b5d0890ff134889d640f6c60174064883c6027105ff5570ebf54889cf4889f1488b70384c8b58304c8b60284c8b68084c8b702050ff7018ff3048c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488917498d47e8483b45107303ff55404989c748c740f80200000048b9b0d916c9a37f000048890848897808488060ffbf498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f8020000005648beb8db16c9a37f000048893248894a08488062ffbf4889de415349c7c30100000041545351505240f6c601755c488b0648833803752b498d4fe8483b4d107303ff55404989cf48c741f8020000004c89590848ba30e306c9a37f0000488911eb564883380175274983fb017506488b4808eb444c89db488b48084889c890ff15560500004889c1eb2ee93e000000498d4fe8483b4d107303ff55404989cf48c741f8020000004c89590848ba80da06c9a37f00004889114989cb488b7608483b65187303ff5548e95bffffff4c89d84c89c14d8d47c04c3b45107303ff55404d89c749c740f80700000048ba00dd16c9a37f0000498910488b542438498950084d8948104d895018488b5c246849895820488b742460498970284c8b5c24484d895830498060ffbf4155574156415241515150ff7424404c8b5424684c8b4c24404889c3488b8424800000004889ca909090ff12488b4c2448488b094889ca48c7c301000000f6c201755f488b3248833e03752b498d7fe8483b7d107303ff55404989ff48c747f80200000048895f0848bb30e306c9a37f000048891feb6948833e01753b4883fb017506488b7e08eb294889cf4989c04c8b4a08488b4608909090ff151a040000eb05e95f0000004889f94889c74c89c0eb404c8b4a08eb3a498d7fe8483b7d107303ff55404989ff48c747f80200000048895f0848bb80da06c9a37f0000eb05e90900000048891f4c8b4a08eb044c8b4a084889fb4c89ca483b65187303ff5548e938ffffff4889daf6c1017540488b1c24f6c301752a488b3348833e03740648833e07750948c7c703000000eb19488b73084889f3483b65187303ff5548ebd148c7c7010000004883ff01740948c7c201000000eb5a488b1c24f6c3017524488b3348833e057512488b73084889f3483b65187303ff5548ebe048c7c301000000eb0748c7c3030000004883fb01745b4889d3f6c301752b488b3348833e057519488b73084889f3483b6518730aeb05e925010000ff5548ebd948c7c301000000eb0748c7c3030000004883fb01746048c7c301000000f6c20175594883fb03750e48c7c303000000eb63e9e0000000488b1a48833b0574154889c648b838de16c9a37f0000488b5d089090ff13488b342440f6c6017569488b3e48833f0574214989c048b8b0de16c9a37f0000eb0ae99b000000e967000000488b5d089090ff134c8b470841f6c0017510eb05e93c000000f64308017503ff55704c3b430874124c8b4e084c89ce483b65187303ff5548eb9e4c8b4b0848c7c301000000eb0e488b730848c7c3030000004989f1488b5208483b65187303ff5548e936ffffff4889da4883fa01741d498d57f0483b55107303ff55404989d748c742f80100000048890aeb1348c7c201000000eb0a48ba08df16c9a37f00004883fa01756e488b542470488b1248c7c301000000f6c201753a488b32498d7fe8483b7d107303ff55404989ff48c747f80200000048895f08488b1e48891f4889fb488b72084889f2483b65187303ff5548ebc14889da4889d34889ce4889c7488b4424209090ff157a010000488b4c2428eb05e9cc000000488b0948c7c2010000004883f90174554989c84983e8024883e902f6c10174064883c1027105ff5570ebf54c8b4c2428498b4c89fc4d8d57e84c3b55107303ff55404d89d749c742f8020000004989520849890a4c89c14c89d2483b65187303ff5548eba54989d84989f14889d3ff15020100004889c1498d47b8483b45107303ff55404989c748c740f808000000488b54246848895038488b54246048895030488b54245848895028488948204c8940184c894810488b4c2430488948084889384881c490000000c2100048833a017507488b442450eb0f488b1a488b44245090ff1596000000488b8c24a0000000488b94249800000048898c24a000000048899424980000004c8b5424184c8b4c24104c8b4424084889c34881c48800000058e9cff8ffff9090909090909000000000000000004007000000000000fdffffffffffff01|@7204,1048575,@17605,@7205,@7206,@7207,@1699,@7203|166,0,@1509 317,0,@7190 399,0,@7193 482,0,@573 570,0,@544 634,0,@7196 800,0,@573 908,0,@544 1205,0,@7197 1245,0,@7200 1417,0,@7202 7190:D4,256|483b65187303ff5548a80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b7208488b4c8efc4883f901741c4889d74989c04889d84889cb90ff15960000004889c34c89c04889faa80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c144889c148b810f407c9a37f0000488b5d0890ff13a80174064883c0027105ff5570ebf5488b520848895c82fc48c7c001000000c39090900000000000000000f800000000000000|@7192,127,@17600,@7191|60,0,@1493 190,0,@1517 7191:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17601| 7192:S65|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229636865636b417267283229 7193:D4,72|483b65187303ff5548488b4a08488b094883f901740f4889d64889cbff153e0000004889f2488b520848890248c7c001000000c39090909000000000000000004000000000000000|@7195,31,@17602,@7194| 7194:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17603| 7195:S63|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229616464526566283129 7196:D5,256|483b65187303ff5548488b4a30f6c10174134889c648b8c0e406c9a37f0000488b5d08ff134883f8017505488b09eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbf48833907751a524889d8488b4a104889ca90ff1248b880da06c9a37f0000eb6548833903751052488b4108488b72184889f2ff12eb554883390175135251488b4108488b72204889f290ff1258eb3cf6c301741348b840ca16c9a37f0000488b5d08909090ff134889d74989c94c8b47284889d8498b59089090ff154a0000004c89c8eb05e90100000057488b0c24488b59084883c408ff253500000090909090900000000000000000f800000000000000|@6783,1048575,@17604,@7186,@2226|23,0,@578 100,0,@544 164,0,@7176 7197:O4|@20055,@557,@7199,@7198 7198:O5|@7179,101,0,101,0 7199:S12|6e6f74205573654669656c64 7200:O4|@20055,@557,@7199,@7201 7201:O5|@7179,98,0,98,0 7202:O1|@545 7203:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17609| 7204:S54|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e4c616d626461283229 7205:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17606| 7206:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17607| 7207:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17608| 7208:D9,1256|483b65187303ff5548a8017559488b08488339017555ff7118ff71105341524151ff71204150ff742448ff742448488b48084889c8e8c6ffffff488b4c2428f6c10174084883f9017d08eb30f641ff10752a488b542420488b12f6c1017416f6c2017411eb0ae930040000e91a010000483bcaeb05ff5570ebf67c154889c248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b542420488b4c8afc4883f901753250488b44241090ff15420400004823051b040000483b050c040000740c48b890da06c9a37f0000eb1048c7c001000000eb074889c34889c853a8017408584883c438c2100050ff742450ff7424384c8b5424684c8b4c24384c8b44243048bb90da06c9a37f0000488b442428488b5424209090ff12498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44244048894118488b44243848894110584889410848c70101000000498d47e8483b45107303ff55404989c748c740f802000000488b1424488950084889084883c440c2100048833905756f53415241514150ff7108ff742438ff742438488b48084889c8e852feffff50488b442408ff154e0300004823050f030000483b05000300007508584883c428c21000ff742438ff7424304c8b5424504c8b4c24304c8b44242848bb90da06c9a37f0000488b442418488b542420eb05e943000000ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f802000000488b1424488950084889084883c430c210004883390775655341524151ff7108ff742430ff742430488b48084889c890e896fdffff50ff742418ff742440ff7424404c8b5424284c8b4c243849c7c00100000048c7c301000000488b442420ff1576020000488b5c242090ff1572020000a801740d584883c420c21000e941000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f802000000488b1424488950084889084883c428c2100053415241514150ff7110ff7118ff742440ff742440488b48084889c890e8e6fcffff488b4c2408f6c10174084883f9017d08eb24f641ff10751e488b542428488b12f6c101740af6c2017405483bcaeb05ff5570ebf67c154889c248b838e407c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf5488b542428488b4c8afc4883f901753250488b44240890ff158e01000048230527010000483b0518010000740c48b890da06c9a37f0000eb1048c7c001000000eb074889c34889c853a8017408584883c430c21000488b4c24084883390f754a50ff742448ff7424404c8b5424604c8b4c24404c8b4424384889c3488b4108ff152e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010f000000eb2a50ff742448ff7424404c8b5424604c8b4c24404c8b4424384889c34889c8488b5424309090ff124889c1498d47c0483b45107303ff55404989c748c740f80400000048894818488b4c241848894810594889480848c700030000004889c1488d402848c740f802000000488b1424488950084889084883c438c2100048c7c001000000c210009090900000000000000000b004000000000000010000c000000000010000c000000000010000c000000000010000c000000000010000c000000000010000c000000000|@7210,2097151,@17610,@6917,@6917,@7211,@7209,@6917,@7189|129,0,@1493 208,0,@545 272,0,@545 491,0,@545 853,0,@1493 932,0,@545 7209:D3,232|483b65187303ff5548a8017569488b08488b11f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c15488b700848b838e407c9a37f0000488b5d0890ff13f6c20174064883c2027105ff5570ebf5488b5493fc498d77e0483b7510730aeb05e953000000ff55404989f748c746f803000000488b790848897e104c8b014c89460848891656488b50084889d09090e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000e000000000000000|@1363,127,@17612|70,0,@1493 7210:S76|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f6365737344656373283129 7211:D4,496|483b65187303ff5548a8017569488b08488b5108f6c20174084883fa017d08eb20f642ff10751a498b31f6c201740b40f6c6017405483bd6eb05ff5570ebf67c14488b700848b838e407c9a37f0000488b5d08ff13f6c20174064883c2027105ff5570ebf5498b5491fc4883fa017553498d57e8eb05e919010000483b55107303ff55404989d748c742f80200000048895a0848890a488b5c2418488b742410488b7c240848895c2418488974241048897c24084889d3488b48084889c8e93dffffff498d77e8483b75107303ff55404989f748c746f8020000004889560848ba80da06c9a37f000048891641524151ff700853ff7108ff74243041514c8b5424484c8b4c24504c8b4424304889f3488b411090ff15ee000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941085848890151ff742440ff742440ff7424404c8b5424384c8b4c243049c7c003000000488b5c2420488b442428909090e896feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c218004983f801750a48c7c001000000c21800488b442418488b4c2410488b542408488944241848894c2410488954240849c7c0010000004889de48c7c3010000004889f0e925feffff90909090900000000000000000e801000000000000|@7212,1048575,@17611,@7189|71,0,@1493 225,0,@544 7212:S93|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734465637328312970726f636573734d757475616c73283329 7213:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17614| 7214:S77|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229646f436c65616e28322970726f636573734669656c64283229 7215:S40|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629 7216:S52|434f4445545245455f52454d4f56455f524544554e44414e5428292e636c65616e50726f63283629636c65616e436f6465283229 7217:O3|@7218,@7060,@7147 7218:D4,72|483b65187303ff5548488b0c2448891c24ff7308ff7210ff70084c8b52084c8b0b4c89c64c8b43184889f3488b0051ff252b00000090909000000000000000004000000000000000|@7226,2097151,@17617,@7219| 7219:D15,2584|488dbc2428ffffff483b7d187303ff5550a8017569488b0848833901756553ff7118415041524151ff7008ff7110ff712048c7c0010000004c89c290ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d511848c742f80200000048894a0848c70203000000488d4a18eb0ae963090000e9df05000048c741f80200000048bb30e306c9a37f0000488959084889114889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c240848890852488b5424209090ff126a016a016a014989e0488b9c2480000000488b442420488b542440909090ff12488b042448833819756a488b4818488339097524488b510848833a05751a488b5a08f6c301750af6442418017503ff5570483b5c2418741b488b4810488b500848b840f716c9a37f0000488b5d08909090ff13ff7010ff700848c7c001000000488b54245890ff12498d4fb8483b4d10730aeb05e921040000ff55404989cf48c741f8020000004889410848c70105000000488d511848c742f80200000048894a0848c70203000000488d4a1848c741f80200000048bb30e306c9a37f0000488959084889114889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c243848890852488b542450909090ff126a016a016a01ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b9424900000004c8b8c24880000004c8b842498000000488d5c2420488b842480000000e8cafdffff48c7c001000000488b5424789090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b542420488951184889411048c741080100000048c70103000000a80174084883f8017c08eb1bf640ff1074154889c248b8f0a115c9a37f0000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d421848c740f8020000004889500848c70009000000488b54242848c7c301000000488b3251504883fe01746e4889f04883e8024889f14883e9024883ee02488b5424386a016a01535051ff72084c8d44242048c7c3110000004889f048ba50a8dc0000000000ff12488b4424205948d1e8480fb60401488d440001488b4c242048c7c2030000004883ea014883f97f760748c7c17f000000eb05e9a600000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f8017507488b442410eb53498d47c0483b45107303ff55404989c748c740f80400000048c7401801000000488b0c2448894810488b4c24284889480848c7000d0000004889c2488d402848c740f802000000488b5c2410488958084889104883c4085e4883c4184889c3483b65187303ff5548e9e1feffff48c7c0010000004889d9f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801750df6842490000000017503ff5570483b842490000000741248b8c8f716c9a37f0000488b5d089090ff13498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848c7001d000000f6c3017524488b0b488339057512488b4b084889cb483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff1562050000498d4fa8483b4d107303ff55404989cf48c741f80400000048894118488b4424284883c4084889411048c741080100000048c70103000000488b8424b000000048c70003000000488d512848c742f802000000488b5c241048895a0848890a488d4a1848c741f802000000488951085a4889114883f9017507488b4c2438eb134889cb488b4424389090ff15da0400004889c1488b8424880000005a4883c40848891048894808594883c4184889481048c7c0010000004883c460c220006a016a016a01ffb42498000000ffb42498000000ffb42498000000ffb424980000004c8b5424784c8b4c24704c8b842480000000488d5c2420488b442468909090e82efaffff488b5c2418488b442420ff155e040000498d4fd0483b4d107303ff55404989cf48c741f80500000048894120488b44246848894118488b4424304889411048c741080100000048c70101000000498d47e8483b45107303ff55404989c748c740f802000000488b54240848895008488908488b4c24705a4883c40848891148894108584889411048c7c0010000004883c460c2200048833907756f6a016a014889df4c8b58084889e3488b410890ff15c203000048837c2408017506488b0424eb12488b5c2408488b0424909090ff15aa030000574150415241514153504d89c8488b5c2420ff159a0300004c8b5424104c8b4c24604c8b4424504889c358909090ff1586030000eb05e99d0000006a016a016a0150ff742478ff742478ff742478ff7424784c8b5424504c8b4c24484c8b442458488d5c2428488b442440e8eaf8ffff498d47e8483b45107303ff55404989c748c740f802000000594889480848c700070000009090ff152603000048837c240801740c488b5c240890ff151a030000488b4c24385a4883c40848891148894108584883c4204889411048c7c0010000004883c418c220004883390575596a016a016a0153415041524151ff70084c8d442428488b5c2460488b41084c89d2909090ff12488b44242848833817752d488b4c2420488901488b44243048894108488b4424384889411048c7c0010000004883c440c22000e9c00000006a016a016a01ff742478ff742478ff742478ff7424784c8b5424484c8b4c24404c8b442450488d5c2420488b442438e8eaf7ffff498d47e8483b45107303ff55404989c748c740f802000000488b4c24404889480848c70005000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b542408488951084889014883f9017507488b442448eb0f4889cb488b44244890ff15fa010000488b4c24385a4883c40848891148894108584889411048c7c0010000004883c440c220006a016a016a0153415041524151ff7008ff71104c8d442430488b5c2468488b41184c89d29090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c244048894810488b54243848895008488b5c243048891848833b17751e488b442428488918488950084889481048c7c0010000004883c448c220006a016a014989e0488b5c2478ff154e010000498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2408488908488b542418ff126a016a016a01ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b5424584c8b4c24504c8b442460488d5c2420488b442448e862f6ffff48837c2408017507488b442418eb11488b5c2408488b44241890ff15ca000000488b4c24485a4883c40848891148894108584883c4084889411048c7c0010000004883c448c22000488b442408488b4c24204989d84889cb4c89d25e4883c42056ff22909090909090900000000000000000100a000000000000|@7228,2097151,@17618,@2211,@7229,@7088,@7230,@7231,@7232,@7233,@3193,@7234,@7235,@7076,@7227|146,0,@573 308,0,@7220 425,0,@573 657,0,@6844 804,0,I104 1109,0,@7223 7220:O4|@20055,@557,@7222,@7221 7221:O5|@7056,394,0,394,0 7222:S32|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e6572 7223:O4|@20055,@557,@7225,@7224 7224:O5|@7056,404,0,404,0 7225:S37|636f7079446563733a20436f6e7461696e65722f536574436f6e7461696e65722073697a65 7226:S35|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229 7227:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17626| 7228:S46|434f4445545245455f53494d504c494649455228292e73696d704e6577656e76283229636f707944656373283129 7229:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17619| 7230:D3,264|483b65187303ff5548a801756c488b08488b511048837a2801740948c7c601000000eb0748c7c6030000006a016a01535156488d5c2418488b40089090e8beffffff48833c2401744d498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b4c2408488908488b4c2410eb05e95e000000488901488b4424204889410848c7c0010000004883c428c3498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2408488908488b4c2410488b5424184889114889410848c7c0010000004883c428c348c7030100000048c743080100000048c7c001000000c3909090909000000000000000000001000000000000|@1464,31,@17620| 7231:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17621| 7232:D3,264|483b65187303ff5548a801756f488b08415053ff7008ff710848c7c0010000004889da90ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d511848c742f80200000048894a0848c70203000000488d4a1848c741f80200000048bb30e306c9a37f000048895908eb05e96d0000004889114889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c2448890852488b542420ff124c8b442420488b5c2418488b442410e83affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c3909000000000000000000001000000000000|@1363,1048575,@17622|110,0,@573 7233:D3,400|483b65187303ff5548a8017567f6c3017567488b08498d57e0483b55107303ff55404989d748c742f801000000488b7108488932488d7a1048c747f8010000004c8b1b4c891f6a016a01415241514150ff7308ff70084153564c8d5424384989f94989d0488b5c2428488b4110488b542420eb0ae9f9000000e9f40000009090ff12498d47a0483b45107303ff55404989c748c740f802000000488b4c24084889480848c70005000000488d501848c742f8020000004889420848c70203000000488d421848c740f802000000488b5c2440488958084889104889c2488d401848c740f80200000048895008488b1424488910488b5424304883c408ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c243048894810594889480848c70001000000504c8b5424284c8b4c24204c8b442418488b5c2410488b442408e8b6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c438488908c348c7c001000000c390909090909000000000000000008801000000000000|@3457,1048575,@17623| 7234:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17624| 7235:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17625| 7236:D23,2312|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f8040000004c8951184c8949104c894108488919488b3048bfaeff16c9a37f0000488d7cb7fcffe79090e97b000000909090e9fb010000909090e963000000909090e942020000909090e98e020000909090e94b000000909090e91e030000909090e90a050000909090e933000000909090e92b000000909090e952050000909090e91b000000909090e9b6050000909090e9fa060000909090e9e707000090909048c7c001000000c3498b084d89cb4d89c44989dd4989d6ff7008ff701051488b442408909090ff1536080000488b5c241090ff1532080000498d4fc8483b4d107303ff55404989cf48c741f80600000048ba380917c9a37f00004889114c8971084c8969104c8961184c8959204c895128488061ffbf415241534154415541564889cb909090ff15e60700004889c14889c8ff15e20700004883f8017520498d47f0483b45107303ff55404989c748c740f8010000004889084883c440c3488b442410488b4c2428488908ff7424184989c24c8b4c24084c8b442410488b5c2428488b442438ff1596070000498d4fc8483b4d107303ff55404989cf48c741f80600000048ba980917c9a37f0000488911488b142448895108488b54240848895110488b54241048895118488b54241848895120488b54242048895128488061ffbf504889cb488b442440909090ff1536070000498d4fd0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c70101000000488d412048c740f8010000004889084883c440c36a016a016a014989e24989c94c8b4018488b5810488b48084889c8488b5218909090ff124c8b4424105b584883c408909090ff15ca0600004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c36a016a016a014989e24989c94c8b4018488b5808488b48104889c8488b5220ff124c8b4424105b584883c408909090ff157e0600004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c3488b40084c89caff12488b08488339017531498d57e0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70205000000eb27498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c702090000004c8b40084889d348c7c001000000909090ff15e60500004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c36a016a016a016a016a016a01ff7010ff70184c8d4424104889cb488b4008488b520890ff12488b442420488338057569488b4810488b4424084889ca909090ff12488b08488339017531498d57e0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70205000000eb2e498d57e8483b55107303ff55404989d748c742f802000000488b5908eb05e93000000048895a0848c70209000000488d5c2428488913488d542428488b5c241848895a08488d542428488b580848895a10eb6448833c24017462488b44241048833805751749c7c003000000488b5c2408909090ff15da040000eb60498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488b4c240848894810488b4c24104889480848c7000d000000eb63e987000000488b44241048833805751a49c7c001000000488b5c240890ff1582040000eb3ee939000000498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4c240848894810488b4c24104889480848c7000d000000488d4c2428488901488d442428488b4c241848894808488d44242848b930e306c9a37f0000488948104c8b4424384883c4285b584883c4089090ff150a0400004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c36a016a014989e249c7c10100000049c7c0010000004889cb488b4008488b5228909090ff12498d47d8483b45107303ff55404989c748c740f802000000594883c4084889480848c7000f0000004889c1488d401848c740f801000000488908c3498d5fe8483b5d107303ff55404989df48c743f802000000488b701048897308488b780848893b6a016a016a014989e04989d94889cb4c89c8488b52309090ff124c8b4424105b584883c408909090ff153e0300004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c3498d77c8483b75107303ff55404989f748c746f80600000048bff80917c9a37f000048893e4889560848895e104c8946184c894e204c895628488066ffbf52ff701051ff70084889f3488b40189090ff15d20200006a016a016a01488b4c2430504c8d442408488b5c2428488b442420488b5108909090ff12488b442418488338057570ff7010ff35a20200004889e3488b4008909090ff159a020000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d0000004c8b4c24404883c4104c8b4424104889cb488b04249090ff155a0200004889c1498d47f0483b4510730aeb05e916000000ff55404989c748c740f8010000004889084883c440c34c8b4c24304c8b442410488b5c2408488b042490ff151e0200004889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c440c3498d4fc8483b4d107303ff55404989cf48c741f80600000048be580a17c9a37f000048893148895108488959104c8941184c8949204c895128488061ffbfff7008ff70184889cb488b4010ff15b201000048833805754af64008017426f64008017515488b480848b8b8f309c9a37f0000488b5d0890ff13488b4008483b442408740f48b8b80a17c9a37f00004883c410c348b8c80a17c9a37f00004883c410c3498d4fd8483b4d107303ff55404989cf48c741f804000000488b14244889511848894110488b4424084889410848c7011b000000498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c36a016a016a014989e14989c8488b5810488b48084889c8488b5210909090ff124c8b4424105b584883c408909090ff15e20000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000000009000000000000|@7244,2097151,@17631,@7245,@7088,@3169,@7246,@7248,@3169,@7250,@7252,@7254,@2178,@2178,@7256,@7258,@3169,@7260,@1354,@7262,@7262,@3169,@7243|53,0,$7236+70 272,0,@7237 452,0,@7238 1355,0,@573 1659,0,@7239 1991,0,@7240 2070,0,@2708 2098,0,@7241 2113,0,@7242 7237:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17627| 7238:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17628| 7239:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17629| 7240:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17630| 7241:O1|@509 7242:O1|@442 7243:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17655,@7276,@7088| 7244:S36|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c283529 7245:D3,160|483b65187303ff5548a801756e488b08488b11498d5fd8483b5d107303ff55404989df48c743f804000000488b721048897318488b7a0848897b104c8b024c89430848c70303000000534c8b48084c89c8e8aaffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908eb05e901000000c348c7c001000000c39090909090909000000000000000009800000000000000|@1363,255,@17632| 7246:D3,136|483b65187303ff5548488338197509488b4008e9e8ffffff4883380b7509488b4010e9d9ffffff488338037525ff7018488b401090e8c6ffffff4883f801740c48c7c0030000004883c408c358e9aeffffff488338157509488b4010e99fffffff48833813740848c7c001000000c348c7c003000000c39000000000000000008000000000000000|@7247,1,@17633| 7247:S46|434f4445545245455f53494d504c494649455228292e73696d7047656e6572616c2835296861734c6f6f70283129 7248:D4,480|483b65187303ff5548a8017571488b08488b1141524151415053ff7008ff7108ff32ff7210ff720848c7c0010000004889da9090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d511848c742f80200000048894a0848c70203000000488d4a1848c741f802000000eb05e93d01000048bb30e306c9a37f0000488959084889114889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c2448890852488b542438ff12498d47c8483b45107303ff55404989c748c740f80600000048b9900f17c9a37f0000488908488b4c244048894808488b54243848895010488b5c244848895818488b74245848897020488b7c243048897828488060ffbf4889c3488b442410909090ff15ce000000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c4104889410858488901498d47e8483b45107303ff55404989c748c740f8020000005a4889500848890850ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b442410e86afeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2080048c7c001000000c208009090909090900000000000000000d801000000000000|@1363,1048575,@17635,@3169|133,0,@573 220,0,@7249 7249:D3,56|483b65187303ff55484c8b52284c8b4a204c8b4218488b5a10488b4a084889caff2290909090909000000000000000003000000000000000|@7064,1048575,@17634| 7250:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17636,@7251,@7088| 7251:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17637,@20054|75,0,@20054 7252:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17638,@7253,@7088| 7253:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17639,@20054|75,0,@20054 7254:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17640,@7255,@7088| 7255:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17641,@20054|75,0,@20054 7256:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17642,@7257,@7088| 7257:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17643,@20054|75,0,@20054 7258:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17644,@7259,@7088| 7259:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17645,@20054|75,0,@20054 7260:D3,136|483b65187303ff5548488b5208909090ff12488b08488339017530498d47e0483b45107303ff55404989c748c740f803000000488b511048895010488b59084889580848c70005000000c3498d47e8483b45107303ff55404989c748c740f802000000488b49084889480848c70009000000c3909090909000000000000000008000000000000000|@7261,1048575,@17646| 7261:S7|6f283229283129 7262:D20,1912|483b65187303ff5548488b0b48babe1917c9a37f0000488d548afcffe290e993000000909090e9d5000000909090e963000000909090e95b000000909090e953000000909090e92e010000909090e943000000909090e93b000000909090e933000000909090e979010000909090e97a010000909090e91b000000909090e913000000909090e90b000000909090e98b0100009090904c89c64989c04889d84c89cb9090ff15e60600004889c34889f0ff25e20600004150ff731049c7c001000000488b5b08909090e832ffffff498d4fe0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c701010000004889cb58ff25a00600004150504151ff7308ff731849c7c001000000488b5b10909090e8e2feffff504c8b4c241849c7c001000000488b5c2408488b442420e8c6feffff498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584883c40848894110584883c4104889410848c701030000004889cb58ff252f0600004150504151ff731049c7c001000000488b5b0890e86efeffff504c8b4c241049c7c001000000488b5c2408488b442418e852feffff498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584883c4184889410848c7010b0000004889cb58ff25cc0500004c89c0ff25cb05000048837b0801741e4889c6488b7b10488b5b084c89c09090ff15b60500004989c04889f0eb04488b7b104889fbe9e2fdffff4150504d89c8488b5b0848c7c00100000090ff1592050000504c8b4424104889c348c7c0010000009090ff15820500004883f8017558498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b0c244889480848c7001d000000f6c1017529488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0ce9de00000048c7c1030000004883f90174089090ff151205000048c7c101000000488b1424f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc6a016a01504c8d44240848bbc82117c9a37f00004889c848bab89c15c9a37f00009090ff15c2040000488b442410488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b442408488901498d47d8483b45107303ff55404989c748c740f804000000488b5424204889501848894810594883c4104889480848c700190000004889c34883c41058ff2559040000488b086a016a01ff31488d5c2408488b4108909090ff1546040000498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b542408488910488b1c2448833b05756a48c7c60300000048c7c70100000050ff7308483b7c241873564889f84883c0026a016a0156504c8d44241048c7c3110000004889f848ba50a8dc0000000000ff12488b442410488b4c244048d1e8480fb60401488d440001488b4c241848c7c2030000004883ea01eb0ae9b6020000e9630000004883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f0024883f801750948c7c001000000eb05488b4424085f4883c4184889c6483b65187303ff5548e93bffffff488b44243848c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c856a801755d488b08488339017559488b542408f6c2017509f64110017503ff5570483b51107565488b5918f6c301750af6442420017503ff5570483b5c2420754b48833c24017444498d77d8483b75107303ff55404989f748c746f802000000eb0ae979000000e929000000488b780848897e084c8b41204c89064c8d4e1849c741f801000000498931eb5b49c7c101000000eb5248833903753cff7008488b4118909090ff1552020000482305c3010000483b05b4010000750f58483b65187303ff5548e937ffffff49c7c1010000004883c408eb1049c7c101000000eb0749c7c1010000004983f901756b498d47e8483b45107303ff55404989c748c740f802000000488b4c24184889480848c70009000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b54243848895118488b542410488951104889410848c701190000004889cb4883c44058ff25ad010000498b01498d4fd8483b4d107303ff55404989cf48c741f804000000488b54243848895118488b5424084889511048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f802000000488b580848895a0848890a48c7c101000000f6c2017534498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0a48890e4889f1488b5208483b65187303ff5548ebc7488b184889c84883c448ff2506010000498d4fc0483b4d107303ff55404989cf48c741f8020000004889590848c70109000000488d511848c742f804000000488b5c242048895a184889421048894a0848c702190000004889d34883c42858ff25b90000009000000000000000006007000000000000010000c000000000010000c000000000|@7267,2097151,@17648,@7268,@7088,@7088,@7088,@7088,@7088,@7269,@7270,@7272,@2211,@6835,@7088,@7266,@6917,@7088,@7088,@7088|14,0,$7262+30 769,0,@7263 782,0,@6834 1044,0,I104 7263:O1|@7264 7264:D3,24|48c7c003000000c300000000000000001000000000000000|@7265,1,@17647| 7265:S48|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429283129 7266:D5,640|483b65187303ff55484889c148c7c2fffffffff6c1017528f6c201740cf601017407483b117d0aeb05ff5570ebf4488b11488b4908483b65187303ff5548ebd34889d1f6c10174064883c1027105ff5570ebf54883f9017473f6c10174084883f9017d08eb2cf641ff10752653515048bb081f0bc9a37f00004889c848ba90c8dc00000000009090ff124883f8017415eb0353515048b8181f0bc9a37f0000488b5d08ff13488b442408a80174064883c07e7105ff5570ebf548c7c38100000048ba90a9dc0000000000eb05e907000000909090ff12eb0d4889c248c7c0030000005351524889c148c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f5857a801756d488b08f6c10174084883f9017d08eb20f641ff10751af6c1017410f6442408017409483b4c24087c1deb05ff5570ebf2488b500848b800260bc9a37f0000488b5d089090ff136a016a01ff70084c8d44240848c7c3110000004889c848ba50a8dc0000000000909090ff12eb05e977000000488b442408488b4c241848d1e8480fb60401488d440001488b4c241048c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c0901480bc2488b4c2418488b54240848d1ea48d1e848880411488d440001488d541201584883c410483b65187303ff5548e913ffffff48c7c001000000ff3424ff35700000006a016a014989e0488d5c2410488b44242848bab89c15c9a37f000090ff1556000000488b442408488060ffbf488b4c2430488b14244889114889410848c7c0010000004883c438c300000000000000007802000000000000|@7275,2097151,@17653,@7274,@6835|113,0,@3307 126,0,I233 151,0,@3308 194,0,I109 357,0,@3316 397,0,I104 571,0,@6834 7267:S45|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429 7268:D3,344|483b65187303ff55484883380b7557415053ff7010488b4008e8e2ffffff504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c7000b000000c3488338177501c348833815753bff7008488b4010909090e87effffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70015000000c3488338037563415053ff7008ff7018488b4010e83affffff504c8b442420488b5c2418488b442408909090e822ffffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818594883c40848894810594883c4104889480848c70003000000c34889c1498d47d8483b45107303ff55404989c748c740f8040000004c894018488958104889480848c70019000000c3909000000000000000005001000000000000|@7005,75,@17649| 7269:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17650| 7270:D3,360|483b65187303ff55484883fb01750848c7c001000000c3a801740d41f600017407493b007c0feb05ff5570ebf448c7c001000000c3a80174084883f8017d08eb1cf640ff107516a801740d41f600017407493b007c1beb05ff5570ebf44889c148b8e09e10c9a37f0000488b5d0890ff136a016a01ff334150ff73085041ff70084c8d44242848c7c31100000048ba50a8dc000000000090ff12488b4424285948d1e8480fb60401488d440001488b4c242848c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f8017450488b0424a80174064883c0027105ff5570ebf54c8b442410488b5c24089090e8fafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24184889084883c430c3488b0424a80174064883c0027105ff5570ebf54c8b4424104883c4085b4883c420e9a8feffff00000000000000006001000000000000|@7271,2097151,@17651|98,0,@4917 143,0,I104 7271:S54|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e657228342973656c656374283229 7272:D3,744|483b65187303ff55484883fb017501c3488b0b488339097552488b510848833a05756e4c89c640f6c6017556488b3e48833f03753b4c8b4f1041f6c1017509f64208017503ff55704c3b4a0875224d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb1ee95e020000488b7e084889fe483b65187303ff5548eba449c7c20100000041f6c201754deb05e938020000498b3248833e03754b488b7e1848833f0d754e4c8b4f0849833909754948837f18017550a80175514c8b184d8b234d3b6108745549833c240175534d8b690849837d0001eb05e9e5010000755a4d8b742408eb05e9d701000041f6c6017522eb0ae9ca010000e9c501000041f6450801750feb0ae9b7010000e951010000ff55704d3b75087451eb54e99600000049833c2403752f4d8b690849837d000375544d8b742408eb05e91b01000041f6c601750a41f64508017503ff55704d3b75087556eb5949833c2405753b4d8b690849837d00057561eb0ae947000000e9e50000004d8b74240841f6c601751141f6450801eb05e9ce0000007503ff55704d3b75087420eb5a49833c240775584d8b690849837d0007eb0ae9aa000000e902000000756941f6430801741848b8e81f08c9a37f0000eb05e98b000000488b5d0890ff134d8b6b084c8b771041f6c601741941f645000174124d3b75007e69eb0fe962000000e95d000000ff5570ebe9498d4fc0483b4d107303ff55404989cf48c741f8020000004c896908eb05e9350000004c8931488d511848c742f80200000048894a08498b490848890a4c8d521849c742f801000000498912488b5b084c89d0e9a3fdffff48c7c001000000c3498d47c0483b45107303ff55404989c748c740f80200000048c74008010000004c8b5f104c89184c8d601849c74424f8020000004989442408498b4108498904244d8d6c241849c745f8010000004d8965004c8b63084c89e34c89e8e93afdffff48c7c001000000c348c7c001000000c390900000000000000000e002000000000000|@7273,8191,@17652|451,0,@1625 7273:S59|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e6572283429636865636b4669656c6473283229 7274:D3,160|483b65187303ff55486a016a01524c8d44240848c7c31100000048ba50a8dc0000000000ff12488b04244883c40859488b400848d1e9480fb60c08488d4c09014889c85948c7c2030000004883ea014883f97f760748c7c17f00000048d1e948d3e24883ca01488d4c09014823c24883f801740948c7c001000000eb0748c7c0030000004883f002c39090909090909000000000000000009800000000000000|@6842,2097151,@17654|28,0,I104 7275:S62|434f4445545245455f53494d504c494649455228292e73696d70506f7374536574436f6e7461696e65722834296669656c6473546f46696c746572283129 7276:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17656,@20054|75,0,@20054 7277:S35|434f4445545245455f53494d504c494649455228292e73696d706c6966696572283229 7278:D5,128|483b65187303ff55484883f801754648833b05753c488b7b08488b43104c89c3ff15720000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889780848c70005000000c34889d8c35048c7c001000000e89effffff4889c358ff25340000009090909000000000000000007800000000000000|@7091,127,@17658,@7279,@7088| 7279:D4,224|483b65187303ff55484883f801756f48833b03750848c7c001000000c3498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb05e901000000c3488b08488b11483b1567000000750c488b70084889f0e961ffffff51488b400890e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000d800000000000000|@2198,31,@17659,@20054|75,0,@20054 7280:O1|@7281 7281:D3,24|48c7c001000000c300000000000000001000000000000000|@6783,1,@17660| 7282:S53|434f4445545245455f4f5054494d4953455228292e6c616d6264614c696674416e64436f6e7374616e7446756e6374696f6e283329 7283:D5,240|483b65187303ff5548488338057568ff7010ff35f0000000ff7008488d5c2408488b0424ff15e60000004889c1f6c1017528488b11488b5a0848833b037512488b71084889f1483b65187303ff5548ebdc48c7c101000000eb0748c7c1030000004883f901741648b830e306c9a37f00004883c418eb05e95f000000c3498d4fe8483b4d107303ff55404989cf48c741f80200000048bac0e706c9a37f000048891148894108488061ffbf498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700050000004883c418c3c3909090900000000000000000e800000000000000|@7286,1048575,@17662,@7284,@1354|105,0,@573 151,0,@594 7284:D3,104|483b65187303ff554852488b4a084889ca909090ff12ff30488b400848ba003317c9a37f00009090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c390909090909000000000000000006000000000000000|@7261,1048575,@17663|30,0,@7285 7285:O1|@7283 7286:S36|434f44455452454528292e67656e436f646528332973696d706c69667953706563283129 7287:D5,880|483b65187303ff554848833801756aff7010ff35700300004150ff701053488d5c2418488b401890ff1562030000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000f6442408017425488b142448b8ffffffffffffff00482342f8488d440001eb05e99c000000483b442408771048b8b0df06c9a37f0000488b5d08ff13488b442408488b4482fc4883f8017469488b442408a80174084883f8017d08eb23f640ff10751d488b542410488b12a801740af6c2017405483bc2eb05ff5570ebf67c1048b810f407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b54241048894c82fc48c7c0010000004883c428c348c7c0010000004883c428c348833805750848c7c001000000c3488338077568488b4008a8017565488b08488b5108f6c20174084883fa017c08eb1bf642ff107415488b700848b8f0a115c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f8020000004889560848c70605000000488d7e1848c747f802000000eb0ae9c0000000e9b30000004889770848c70709000000f6c201741848beffffffffffffff00482373f8488d743601483bd67215488b700848b8b0df06c9a37f0000488b5d0890ff13488b7493fc4883fe017456f6c20174084883fa017d08eb20f642ff10751a498b30f6c201740b40f6c6017405483bd6eb05ff5570ebf67c14488b700848b810f407c9a37f0000488b5d08ff13f6c20174064883c2027105ff5570ebf549897c90fc488b48084889c8483b65187303ff5548e9dffeffff48c7c001000000c3488b4810f6c10174084883f9017c08eb19f641ff10741348b8f0a115c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70205000000488d721848c746f8020000004889560848c70609000000f6c101741848baffffffffffffff00482353f8488d541201483bca721148b8b0df06c9a37f0000488b5d0890ff13488b5c8bfc4883fb01745af6c10174084883f9017d08eb1ff641ff107519498b10f6c101740af6c2017405483bcaeb05ff5570ebf67c1148b810f407c9a37f0000488b5d0890ff13f6c10174064883c1027105ff5570ebf549897488fc48c7c001000000c348c7c001000000c390909090909000000000000000006803000000000000|@7289,1048575,@17664,@7288,@1354|102,0,36028797018963967 135,0,@560 219,0,@1517 342,0,@6844 434,0,36028797018963967 462,0,@560 539,0,@1517 628,0,@6844 710,0,36028797018963967 734,0,@560 806,0,@1517 7288:D3,160|488b4a08f6c10174084883f9017c08eb1cf641ff1074164889c348b8f0a115c9a37f0000488b5d08909090ff13498d5fa8483b5d107303ff55404989df48c743f80200000048894b0848c70305000000488d731848c746f80200000048895e0848c706090000004889c3488d461848c740f80400000048c7401801000000488958104889700848c7000d000000c3909000000000000000009800000000000000|@6847,31,@17665|28,0,@6844 7289:S31|434f44455452454528292e67656e436f646528332961646444656373283129 7290:D4,488|483b65187303ff5548488338157509488b4010e9e8ffffff4883381d75744989d848bb003a17c9a37f0000488b400890ff15ca0100004889c1f6c101751df60101740f488b4908483b65187303ff5548ebe748c7c101000000eb0748c7c1030000004883f901740848c7c001000000c3498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000eb05e93d0000004889411048c741088b00000048b878b419f1a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c348833809756a488b480848833905741148b828830ac9a37f0000488b5d0890ff13488b5108f6c20174084883fa017d08eb20f642ff10751a488b33f6c201740b40f6c6017405483bd6eb05ff5570ebf67c1348b838e407c9a37f0000488b5d08909090ff13f6c201740d4883c202eb05e97a0000007105ff5570ebee488b5493fcf6c2017533488b1a498d77e0483b75107303ff55404989f748c746f803000000488b7b0848897e104c8b034c89460848c70601000000eb23498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7060300000048833e017505488b4610c348c7c001000000c3488338057505488b4010c348c7c001000000c390900000000000000000e001000000000000|@7294,1048575,@17667,@7293|35,0,@7291 165,0,@20053 230,0,@3137 296,0,@1493 7291:O1|@7290 7292:S53|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e6572617465283329 7293:D3,128|483b65187303ff5548a8017555415053ff70084c89c3488b00488b5424089090ff12504c8b442418488b5c2410488b442408909090e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,1048575,@17668| 7294:S68|434f4445545245455f434f444547454e5f434f4e5354414e545f46554e4354494f4e5328292e636f646547656e65726174652833296578747261637450726f7073283129 7295:O1|@7296 7296:D3,1808|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1048833a017562f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48beb8b019f1a37f0000488b364889d84889f29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a04217c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5808f6c30174084883fb037d13eb06f643ff10740b48b8707907c9a37f0000c3488b3048833e037560f6c30174064883eb027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895f08488b5e0848891f49b8b8b019f1a37f00004d8b004889f84c89c2ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9804317c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b780840f6c70174084883ff037d13eb06f647ff10740b48b8707907c9a37f0000c34c8b0049833805756340f6c70174064883ef027105ff5570ebf54d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049897908498b780849893949bab8b019f1a37f00004d8b124c89c84c89d29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9604417c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b480841f6c10174084983f9037c14eb0741f641ff10750b48b8404517c9a37f0000c348b8707907c9a37f0000c3909000000000000000000807000000000000|@7325,1048575,@17669|34,0,@1326 105,0,@20033 229,0,@883 298,0,@884 339,0,@835 472,0,@833 513,0,@7297 612,0,@1326 683,0,@20033 805,0,@883 874,0,@884 915,0,@835 1048,0,@833 1089,0,@7304 1189,0,@1326 1261,0,@20033 1385,0,@883 1454,0,@884 1495,0,@835 1628,0,@833 1669,0,@7311 1770,0,@7318 1781,0,@1326 7297:O5|0,0,0,@7299,@7298 7298:O2|@7302,0 7299:O2|@7300,0 7300:O2|0,@7301 7301:O5|@3394,120,120,0,0 7302:O2|3,@7303 7303:S14|50324c6f6164417267756d656e74 7304:O5|0,0,0,@7306,@7305 7305:O2|@7309,0 7306:O2|@7307,0 7307:O2|0,@7308 7308:O5|@3394,121,121,0,0 7309:O2|3,@7310 7310:S13|50324c6f6164436c6f73757265 7311:O5|0,0,0,@7313,@7312 7312:O2|@7316,0 7313:O2|@7314,0 7314:O2|0,@7315 7315:O5|@3394,119,119,0,0 7316:O2|3,@7317 7317:S11|50324c6f61644c6f63616c 7318:O5|0,0,0,@7320,@7319 7319:O2|@7323,0 7320:O2|@7321,0 7321:O2|0,@7322 7322:O5|@3394,122,122,0,0 7323:O2|3,@7324 7324:S15|50324c6f6164526563757273697665 7325:S16|7072696e742d70324c6f6164466f726d 7326:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@17675| 7327:S32|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329 7328:D3,96|483b65187303ff5548a8017539488b08ff7108488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@17671| 7329:D3,184|483b65187303ff5548a801756e488b08488b51084883e2094883fa01740948c7c201000000eb0748c7c2030000004883f202498d5fe0483b5d107303ff55404989df48c743f80300000048c74310010000004889530848ba703007c9a37f000048891353488b48084889c89090e88effffff4889c1498d47e8eb05e91d000000483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090900000000000000000b000000000000000|@1363,15,@17672|88,0,@923 7330:D3,64|498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b52084889500848c70005000000c300000000000000003800000000000000|@7331,5,@17673| 7331:S44|56414c55455f4f505328292e7072696e7456616c7565466f7254797065283329706f6c79436f64652d283129 7332:D3,112|483b65187303ff5548a8017545488b084883790801742f51488b400890e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9aeffffff48c7c001000000c390909090909000000000000000006800000000000000|@260,3,@17674| 7333:S31|56414c55455f4f505328292e646973706c6179466978537461747573283129 7334:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17678| 7335:O3|3,@7336,@1726 7336:O2|@7337,@1728 7337:O2|49,@1868 7338:O2|@2033,@7339 7339:O2|@7340,0 7340:O4|@20043,69,@7341,0 7341:O7|@2033,2,@7343,@7342,@390,0,0 7342:O3|2,@1868,@467 7343:O2|1,@7344 7344:O3|2,@7345,0 7345:O1|@7346 7346:D3,24|488b00c39090909000000000000000001000000000000000|@7347,1,@17680| 7347:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72537472756374283129 7348:O2|@2047,@7349 7349:O2|@7350,0 7350:O4|@20043,69,@7351,0 7351:O7|@2047,2,@7353,@7352,@390,0,0 7352:O3|2,@1868,@1228 7353:O2|1,@7354 7354:O3|2,@7355,0 7355:O1|@7356 7356:D4,40|483b65187303ff5548488b4018ff252d000000909090909000000000000000002000000000000000|@7357,31,@17681,@2055| 7357:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72537472756374283129 7358:O2|@7360,0 7359:S4|636f6465 7360:O4|@20043,69,@7361,0 7361:O7|@7359,2,@7363,@7362,@390,0,0 7362:O3|2,@1868,@7372 7363:O2|1,@7364 7364:O3|2,@7365,0 7365:O1|@7366 7366:D3,56|488b480848833903741348b8184f17c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000003000000000000000|@7371,3,@17682|12,0,@7367 7367:O4|103,@112,@7369,@7368 7368:O5|@7370,1341,0,1341,0 7369:S22|4e6f74206120676c6f62616c20737472756374757265 7370:S34|6d6c736f757263652f4d4c436f6d70696c65722f494e495449414c4953455f2e4d4c 7371:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f72537472756374283129 7372:O5|5,0,@7374,@7373,@390 7373:O3|@7374,@390,@7375 7374:S8|636f646574726565 7375:O3|@7377,@7380,@7376 7376:O3|@7381,@417,@416 7377:O2|1,@7378 7378:O3|2,@7379,0 7379:O4|0,@20144,3,1 7380:O4|1,@20145,0,0 7381:S24|506f6c794d4c2e436f6465547265652e636f646574726565 7382:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17683|2,0,@2058 7383:O2|@7385,@7384 7384:O2|@7386,0 7385:S6|56616c756573 7386:O4|@20058,69,@7387,0 7387:O4|@7385,@661,@7388,@390 7388:O6|@7390,I48,0,@390,@7389,0 7389:O1|@7530 7390:O4|1,@20147,@20148,@20146 7391:O2|@374,20 7392:O2|@7521,@7520 7393:O2|@7395,@7394 7394:O2|@7396,0 7395:S13|7072696e745769746854797065 7396:O4|@20043,69,@7397,0 7397:O7|@7395,2,@7399,@7398,@390,0,0 7398:O3|2,@7411,@891 7399:O2|1,@7400 7400:O3|2,@7401,0 7401:O1|@7402 7402:D4,208|483b65187303ff5548f6401001756f488b4810498d57e8483b55107303ff55404989d748c742f80200000048bb105517c9a37f000048891a488b1948895a08488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bfb05517c9a37f000048893e48895e08488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f80200000048897708488917eb0a48bf505617c9a37f000049c7c1010000004989f8488b5808488b084889c8ff252a00000090900000000000000000c800000000000000|@7410,2097151,@17688,@2136|45,0,@7403 94,0,@7404 156,0,@7405 7403:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17684| 7404:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17685| 7405:O2|@7407,@7406 7406:O1|@7409 7407:O1|@7408 7408:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17686| 7409:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17687| 7410:S54|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617956616c756573283129 7411:O3|3,@7412,@1726 7412:O2|@7413,@1728 7413:O2|49,@1806 7414:O2|@1275,@7415 7415:O2|@7416,0 7416:O4|@20043,69,@7417,0 7417:O7|@1275,2,@7419,@7418,@390,0,0 7418:O3|2,@7424,@891 7419:O2|1,@7420 7420:O3|2,@7421,0 7421:O1|@7422 7422:D4,152|483b65187303ff5548488b0848837908057567488b511048833a03755d488b5a0848833b057521498d77f0483b75107303ff55404989f748c746f801000000488b7b0848893eeb0748c7c6010000004883fe017514488b780848b8386208c9a37f0000488b5d08ff134c8b4008488b5918488b06ff253600000048b8307407c9a37f0000c390909000000000000000009000000000000000|@7423,2097151,@17689,@2147|91,0,@1662 124,0,@1320 7423:S26|56414c55455f4f505328292e7072696e7456616c756573283129 7424:O3|3,@7425,@395 7425:O2|@7413,@7426 7426:O2|@1741,0 7427:O2|@7429,@7428 7428:O2|@7430,0 7429:S11|6973457863657074696f6e 7430:O4|@20043,69,@7431,0 7431:O7|@7429,2,@7433,@7432,@390,0,0 7432:O3|2,@1806,@393 7433:O2|1,@7434 7434:O3|2,@7435,0 7435:O1|@7436 7436:D3,40|4883780801740848c7c001000000c348c7c003000000c39000000000000000002000000000000000|@7437,1,@17690| 7437:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973457863657074696f6e283129 7438:O2|@7440,@7439 7439:O2|@7441,0 7440:S13|6973436f6e7374727563746f72 7441:O4|@20043,69,@7442,0 7442:O7|@7440,2,@7443,@7432,@390,0,0 7443:O2|1,@7444 7444:O3|2,@7445,0 7445:O1|@7446 7446:D3,56|f6400801750848c7c003000000c34883780801740848c7c001000000c348c7c003000000c390909000000000000000003000000000000000|@7447,1,@17691| 7447:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296973436f6e7374727563746f72283129 7448:O2|@2047,@7449 7449:O2|@7450,0 7450:O4|@20043,69,@7451,0 7451:O7|@2047,2,@7453,@7452,@390,0,0 7452:O3|2,@1806,@1228 7453:O2|1,@7454 7454:O3|2,@7455,0 7455:O1|@7456 7456:D4,144|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f802000000488b50184889510848c7011b000000f6c1017414488b502048b8f86f07c9a37f0000488b5d08ff134889cf488b48204889c890ff154e0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488938c390909000000000000000008800000000000000|@7457,63,@17692,@2055|59,0,@1294 7457:S46|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7256616c7565283129 7458:O2|@7460,@7459 7459:O2|@7461,0 7460:S14|7479706545787072657373696f6e 7461:O4|@20047,69,@7462,0 7462:O2|@7463,0 7463:O3|@7460,@390,@7464 7464:O3|@7466,@7469,@7465 7465:O3|@7470,@417,@416 7466:O2|1,@7467 7467:O3|2,@7468,0 7468:O4|0,@20150,3,1 7469:O4|1,@20151,0,0 7470:S38|506f6c794d4c2e4e616d6553706163652e56616c7565732e7479706545787072657373696f6e 7471:O2|@2033,@7472 7472:O2|@7473,0 7473:O4|@20043,69,@7474,0 7474:O7|@2033,2,@7476,@7475,@390,0,0 7475:O3|2,@1806,@467 7476:O2|1,@7477 7477:O3|2,@7478,0 7478:O1|@7479 7479:D3,24|488b00c39090909000000000000000001000000000000000|@7480,1,@17693| 7480:S24|5354525543545f56414c5328292e76616c4e616d65283129 7481:O2|@7483,@7482 7482:O2|@7484,0 7483:S9|7072696e7454797065 7484:O4|@20043,69,@7485,0 7485:O7|@7483,2,@7487,@7486,@390,0,0 7486:O3|2,@7499,@891 7487:O2|1,@7488 7488:O3|2,@7489,0 7489:O1|@7490 7490:D5,240|483b65187303ff5548f6401001756f488b4810498d57e8483b55107303ff55404989d748c742f80200000048bb986417c9a37f000048891a488b1948895a08488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf386517c9a37f000048893e48895e08488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f80200000048897708488917eb0a48bfd86517c9a37f0000488b70084c8b0048c7c0010000009090ff154e00000049c7c2010000004989f94c89c14989c04889f34889c848ba40a507c9a37f0000ff25300000000000000000000000e800000000000000|@7498,2097151,@17698,@1323,@1416|45,0,@7491 94,0,@7492 156,0,@7493 210,0,@1415 7491:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17694| 7492:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17695| 7493:O2|@7495,@7494 7494:O1|@7497 7495:O1|@7496 7496:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17696| 7497:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17697| 7498:S55|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617954797065457870283129 7499:O3|3,@7500,@1726 7500:O2|@7501,@1728 7501:O2|49,@7502 7502:O5|5,0,@7460,@7463,@390 7503:O2|@1808,@7504 7504:O2|@7505,0 7505:O4|@20047,69,@7506,0 7506:O2|@1807,0 7507:O2|@7359,@7508 7508:O2|@7509,0 7509:O4|@20043,69,@7510,0 7510:O7|@7359,2,@7512,@7511,@390,0,0 7511:O3|2,@1806,@7372 7512:O2|1,@7513 7513:O3|2,@7514,0 7514:O1|@7515 7515:D3,64|4883780805750a488b48104883390374144889c148b8306917c9a37f0000488b5d0890ff13488b4108c390909090909000000000000000003800000000000000|@7519,3,@17699|22,0,@7516 7516:O4|103,@112,@7518,@7517 7517:O5|@7370,1283,0,1283,0 7518:S18|4e6f74206120676c6f62616c2076616c7565 7519:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7256616c7565283129 7520:O2|@7522,0 7521:S6|747970656f66 7522:O4|@20043,69,@7523,0 7523:O7|@7521,2,@7525,@7524,@390,0,0 7524:O3|2,@1806,@7502 7525:O2|1,@7526 7526:O3|2,@7527,0 7527:O1|@7528 7528:D3,24|488b4018c390909000000000000000001000000000000000|@7529,1,@17700| 7529:S26|5354525543545f56414c5328292e76616c547970654f66283129 7530:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17701|2,0,@2058 7531:O2|@7533,@7532 7532:O2|@7534,0 7533:S10|5369676e617475726573 7534:O4|@20058,69,@7535,0 7535:O4|@7533,@661,@7536,@390 7536:O6|@7538,I48,0,@390,@7537,0 7537:O1|@7587 7538:O4|1,@20153,@20154,@20152 7539:O1|@7540 7540:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@17702,@375| 7541:O2|@2047,@7578 7542:O2|@1275,@7543 7543:O2|@7544,0 7544:O4|@20043,69,@7545,0 7545:O7|@1275,2,@7547,@7546,@390,0,0 7546:O3|2,@7561,@891 7547:O2|1,@7548 7548:O3|2,@7549,0 7549:O1|@7550 7550:D4,48|483b65187303ff55484c8b4010488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@7559,2097151,@17707,@7551| 7551:D4,1000|483b65187303ff554841f6c001756b498d4fe8483b4d107303ff55404989cf48c741f80200000048bab87217c9a37f0000488911498b1048895108488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf587317c9a37f000048893e48895608488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f8020000004889770848890feb0a48bff87317c9a37f0000f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488b4818f6c1017538488b1148833a01751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b51084889d1483b65187303ff5548ebc348c7c60100000040f6c601756b488b0e488339017567498d57e8483b55107303ff55404989d748c742f8020000004c8b41084c89420848c70201000000f6c20174144989c148b8f86f07c9a37f0000488b5d0890ff134d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049c7410801000000eb0ae90a000000e905000000498911eb0749c7c101000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b50084889510848c70107000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d77b8483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f805000000488971204c89491848c741100100000048c741080100000048c70101000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff13498d77e8483b75107303ff55404989f748c746f80200000049b8b07307c9a37f00004c89460848890e498d4fe8483b4d107303ff55404989cf48c741f8020000004889710848be781b07c9a37f0000488931498d77e8483b75107303ff55404989f748c746f80200000048894e0848b9f8dd08c9a37f000048890e498d4fd0483b4d107303ff55404989cf48c741f8050000004889712048c741180100000048c741100100000048c741080100000048c70101000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff135149c7c2010000004989f949c7c00300000090ff15e2000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c39090909090900000000000000000e003000000000000|@7560,2097151,@17708,@2103|41,0,@7552 90,0,@7553 152,0,@7554 181,0,@819 326,0,@1294 446,0,@1294 549,0,@1294 591,0,@1315 636,0,@833 677,0,@2126 757,0,@1294 851,0,@1317 962,0,@1294 7552:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17703| 7553:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17704| 7554:O2|@7556,@7555 7555:O1|@7558 7556:O1|@7557 7557:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17705| 7558:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17706| 7559:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283129 7560:S52|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617953696773283329 7561:O3|3,@7562,@1726 7562:O2|@7563,@1728 7563:O2|49,@1786 7564:O2|@1788,@7565 7565:O2|@7566,0 7566:O4|@20047,69,@7567,0 7567:O2|@1787,0 7568:O2|@2033,@7569 7569:O2|@7570,0 7570:O4|@20043,69,@7571,0 7571:O7|@2033,2,@7573,@7572,@390,0,0 7572:O3|2,@1786,@467 7573:O2|1,@7574 7574:O3|2,@7575,0 7575:O1|@7576 7576:D3,24|488b4008c390909000000000000000001000000000000000|@7577,1,@17709| 7577:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72536967283129 7578:O2|@7579,0 7579:O4|@20043,69,@7580,0 7580:O7|@2047,2,@7582,@7581,@390,0,0 7581:O3|2,@1786,@1228 7582:O2|1,@7583 7583:O3|2,@7584,0 7584:O1|@7585 7585:D4,40|483b65187303ff5548488b4018ff252d000000909090909000000000000000002000000000000000|@7586,31,@17710,@2055| 7586:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f72536967283129 7587:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17711|2,0,@2058 7588:O2|@7590,@7589 7589:O2|@7591,0 7590:S7|496e6669786573 7591:O4|@20058,69,@7592,0 7592:O4|@7590,@661,@7593,@390 7593:O6|@7595,I48,0,@390,@7594,0 7594:O1|@7621 7595:O4|1,@20157,@20158,@20156 7596:O1|@7597 7597:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@17712,@375| 7598:O2|@1768,@7618 7599:O2|@1275,@7600 7600:O2|@7601,0 7601:O4|@20043,69,@7602,0 7602:O7|@1275,2,@7604,@7603,@390,0,0 7603:O3|2,@1766,@891 7604:O2|1,@7605 7605:O3|2,@7606,0 7606:O1|@7607 7607:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@7333,2097151,@17713,@2128| 7608:O2|@2033,@7609 7609:O2|@7610,0 7610:O4|@20043,69,@7611,0 7611:O7|@2033,2,@7613,@7612,@390,0,0 7612:O3|2,@1766,@467 7613:O2|1,@7614 7614:O3|2,@7615,0 7615:O1|@7616 7616:D3,24|488b00c39090909000000000000000001000000000000000|@7617,1,@17714| 7617:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f72466978283129 7618:O2|@7619,0 7619:O4|@20047,69,@7620,0 7620:O2|@1767,0 7621:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17715|2,0,@2058 7622:O2|@7624,0 7623:S8|46756e63746f7273 7624:O4|@20058,69,@7625,0 7625:O4|@7623,@661,@7626,@390 7626:O6|@7628,I48,0,@390,@7627,0 7627:O1|@7703 7628:O4|1,@20161,@20162,@20160 7629:O1|@7630 7630:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@17716,@375| 7631:O2|@7359,@7691 7632:O2|@1275,@7633 7633:O2|@7634,0 7634:O4|@20043,69,@7635,0 7635:O7|@1275,2,@7637,@7636,@390,0,0 7636:O3|2,@7664,@891 7637:O2|1,@7638 7638:O3|2,@7639,0 7639:O1|@7640 7640:D4,200|483b65187303ff5548f6401001756f488b4810498d57e8483b55107303ff55404989d748c742f80200000048bbc88117c9a37f000048891a488b1948895a08488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf688217c9a37f000048893e48895e08488066ffbf498d7fe8483b7d10730aeb05e917000000ff55404989ff48c747f80200000048897708488917eb0a48bf088317c9a37f00004989f8488b5808488b084889c8ff2529000000900000000000000000c000000000000000|@7661,2097151,@17724,@7648|45,0,@7641 94,0,@7642 156,0,@7643 7641:D3,120|483b65187303ff5548488b5208488b5270909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17717| 7642:D3,120|483b65187303ff5548488b5208488b9288000000ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@1284,1048575,@17718| 7643:O2|@7645,@7644 7644:O1|@7647 7645:O1|@7646 7646:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17719| 7647:D3,24|48c7c001000000c300000000000000001000000000000000|@1284,1,@17720| 7648:D11,2368|488dbc2440ffffff483b7d187303ff5550f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488b08488b5110488b31483b3518090000743a40f6c601752f48bf509adc00000000004c8b0948c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750ceb6c4989f1eb054989f1eb67498d4fe8483b4d107303ff55404989cf48c741f8020000004c89490848c70107000000f6c1017420488b7018488b78084c8b50204c8b1848b8f86f07c9a37f0000488b5d0890ff13498d77e8483b75107303ff55404989f748c746f802000000eb0ae9a0000000e99b00000048bf98c908c9a37f000048897e0848890e498d4fd0483b4d107303ff55404989cf48c741f8050000004889712048c741180100000048c741100100000048c741080100000048c70101000000f6c101741f488b7018488b78084c8b50204c8b1848b8f86f07c9a37f0000488b5d08ff13498d77e8483b75107303ff55404989f748c746f80200000048bfb08d07c9a37f000048897e0848890eeb0748c7c6010000004889d9f6c10174064883e9027105ff5570ebf5488b7a08483b3db3070000744140f6c70175684989f24889fe48bf509adc00000000004989cb48c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740e4c89d94c89d6eb404989cb4989f2ff701853ff7008ff70204150ff324151ff30415249c7c2010000004d89c149c7c001000000eb05e90e0000004c89db4889d0ff153a070000eb5b488b4818488b78084c8b50204c8b18498d47e8483b45107303ff55404989c748c740f8020000004c8b62084c89600848c70007000000a80174134989c548b8f86f07c9a37f0000488b5d08ff1351535741524150ff324151415356498d4fe8483b4d107303ff55404989cf48c741f80200000048ba688d17c9a37f0000488951084889014883f9017506488b0424eb0e4889cb488b042490ff15a2060000488b4c2410483b0d9e0600007432f6c101756b4889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756e6a016a016a016a016a016a016a016a016a016a016a016a016a0150488d5c2408488b84248800000048ba00dd07c9a37f0000ff153a060000498d47e0eb05e99a000000483b45107303ff55404989c748c740f80300000048b9c88d17c9a37f0000488908488b8c2490000000eb05e96a00000048894808488b54244848895010488060ffbf498d57e0483b55107303ff55404989d748c742f80300000048bbb88e17c9a37f000048891a48894a08488b4c246848894a10488062ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048895108488901eb6d488b4c2420498d57d8483b55107303ff55404989d748c742f80400000048bb708f17c9a37f000048891a488b5c240848895a0848894a10488b5c241048895a18488062ffbf488b19498d4fe8483b4d107303ff55404989cf48c741f802000000488951084889196a016a01eb05e9170000006a016a016a016a016a016a016a016a016a016a016a0150488b842498000000a8017538488b1048833a01751d498d5ff0483b5d107303ff55404989df48c743f801000000488913eb19488b50084889d0483b65187303ff5548ebc448c7c301000000f6c301756a488b03488338017561498d57e8483b55107303ff55404989d748c742f802000000488b70084889720848c70201000000f6c201741048b8f86f07c9a37f0000488b5d08ff13498d7fe8483b7d107303ff55404989ff48c747f80200000048c7470801000000488917eb0748c7c701000000498d47e8483b45107303ff55404989c748c740f802000000488b9424a00000004889500848c70007000000a80174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57b8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f805000000488950204889781848c740100100000048c740080100000048c70001000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57e8483b55107303ff55404989d748c742f80200000048bb509017c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba781b07c9a37f0000488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8809017c9a37f0000488902498d47d0483b45107303ff55404989c748c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f8050000005b4881c4a000000048895a2048c742180100000048c742100100000048c742080100000048c70201000000f6c20174144889c348b8f86f07c9a37f0000488b5d0890ff13498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488913488d531848c742f80200000048895a0848bbe08d07c9a37f000048891a498d5fb8483b5d107303ff55404989df48c743f80200000048895308488903488d431848c740f8050000004889582048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff135af6c20174064883ea027105ff5570ebf5488b1c24488b7308483b35b3010000743840f6c601755748bf509adc00000000004989c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c1eb254989c85049c7c2010000004d89c149c7c0030000004889d3488b442408ff155e010000eb424889c1498d47e8483b45107303ff55404989c748c740f802000000488b5b084889580848c70007000000a80174134889c248b8f86f07c9a37f0000488b5d08ff1351498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9e08d07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3909000000000000000003809000000000000|@7663,2097151,@17725,I48,I48,@2103,@7662,I48,@1484,I48,@2103|38,0,@819 74,0,I48 186,0,@1294 239,0,@2097 335,0,@1294 375,0,@1371 445,0,I48 623,0,@1294 677,0,@7649 742,0,I48 824,0,@1483 871,0,@7653 941,0,@7655 1034,0,@7656 1275,0,@1294 1385,0,@1294 1488,0,@1294 1531,0,@7657 1576,0,@833 1617,0,@7659 1696,0,@1294 1790,0,@1294 1858,0,@1373 1956,0,@1294 2015,0,I48 2151,0,@1294 2219,0,@1373 2334,0,@1294 7649:O2|@884,@7650 7650:O2|@7651,@1621 7651:O2|3,@7652 7652:S2|293a 7653:D3,144|483b65187303ff55485052488b4a104889ca9090ff12a8017546498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3488b0424488b4008488b08488b4424084889ca4883c410ff229090909090909000000000000000008800000000000000|@7654,1048575,@17721| 7654:S40|56414c55455f4f505328292e646973706c617946756e63746f7273283329617267456e762d283129 7655:D3,144|483b65187303ff55485052488b4a104889ca9090ff12a8017546498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c3488b0424488b4008488b4808488b4424084889ca4883c410ff2290909090909000000000000000008800000000000000|@7654,1048575,@17722| 7656:D3,184|483b65187303ff5548483b42187447a8017565f64218017564488b5a18f6c301740948c7c103000000eb08488b0b488d4c09014883c1104889c64889df48d1e9483bc9f3a6488d7c3f01488d743601488d4c09017546498d47d8483b45107303ff55404989c748c740f80200000048c7400801000000eb0ae91f000000e91a000000488b52084889104889c1488d401848c740f801000000488908c3488b5210488b5208ff2290900000000000000000b000000000000000|@7654,1048575,@17723| 7657:O2|@833,@7658 7658:O2|@835,0 7659:O2|3,@7660 7660:S7|66756e63746f72 7661:S56|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296578706f72746564446973706c617946756e63746f7273283129 7662:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17726| 7663:S30|56414c55455f4f505328292e646973706c617946756e63746f7273283329 7664:O3|3,@7665,@1726 7665:O2|@7666,@1728 7666:O2|49,@1836 7667:O2|@2033,@7668 7668:O2|@7669,0 7669:O4|@20043,69,@7670,0 7670:O7|@2033,2,@7672,@7671,@390,0,0 7671:O3|2,@1836,@467 7672:O2|1,@7673 7673:O3|2,@7674,0 7674:O1|@7675 7675:D3,24|488b4008c390909000000000000000001000000000000000|@7676,1,@17727| 7676:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296e616d65466f7246756e63746f72283129 7677:O2|@2047,@7678 7678:O2|@7679,0 7679:O4|@20043,69,@7680,0 7680:O7|@2047,2,@7682,@7681,@390,0,0 7681:O3|2,@1836,@1228 7682:O2|1,@7683 7683:O3|2,@7684,0 7684:O1|@7685 7685:D4,40|483b65187303ff5548488b4020ff252d000000909090909000000000000000002000000000000000|@7686,31,@17728,@2055| 7686:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312970726f7073466f7246756e63746f72283129 7687:O2|@1838,@7688 7688:O2|@7689,0 7689:O4|@20047,69,@7690,0 7690:O2|@1837,0 7691:O2|@7692,0 7692:O4|@20043,69,@7693,0 7693:O7|@7359,2,@7695,@7694,@390,0,0 7694:O3|2,@1836,@7372 7695:O2|1,@7696 7696:O3|2,@7697,0 7697:O1|@7698 7698:D3,56|488b481048833903741348b8c89617c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000003000000000000000|@7702,3,@17729|12,0,@7699 7699:O4|103,@112,@7701,@7700 7700:O5|@7370,1385,0,1385,0 7701:S20|4e6f74206120676c6f62616c2066756e63746f72 7702:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129636f6465466f7246756e6374283129 7703:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17730|2,0,@2058 7704:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@17731|2,0,@2058 7705:O2|@7707,@7706 7706:O2|@7708,0 7707:S20|707265747479526570726573656e746174696f6e 7708:O4|@20043,69,@7709,0 7709:O7|@7707,2,@7711,@7710,@390,0,0 7710:O3|2,@7712,@891 7711:O2|3,4 7712:O3|3,@7713,@395 7713:O2|@7714,@7426 7714:O2|49,@7715 7715:O3|6,@20164,79993 7716:O2|@790,@7717 7717:O2|@7718,0 7718:O4|@20043,69,@7719,0 7719:O7|@790,@738,@7721,@7720,@390,0,0 7720:O3|2,@7782,@891 7721:O2|1,@7722 7722:O3|2,@786,@7723 7723:O2|@7724,0 7724:O4|@20054,69,@7725,0 7725:O3|2,3,@7726 7726:O5|@571,@7727,@782,@752,@548 7727:O2|@594,@7728 7728:O2|@7730,@7729 7729:O2|@7735,@7734 7730:O2|@1148,@7731 7731:O3|0,@7732,@576 7732:O8|@7733,@790,0,0,@761,0,0,1 7733:O4|13,0,@679,4 7734:O2|@7767,0 7735:O2|@1155,@7736 7736:O3|0,@7737,@576 7737:O8|@7739,@790,0,0,@7738,0,4,1 7738:O2|@7759,0 7739:O3|10,@7741,@7740 7740:O3|14,@7751,1 7741:O2|@7743,@7742 7742:O2|@7745,@7744 7743:O4|1,@545,0,@679 7744:O2|@7747,@7746 7745:O4|1,@545,1,@977 7746:O2|@7749,0 7747:O4|1,@545,2,@7748 7748:O4|6,@439,2,0 7749:O4|1,@545,3,@7750 7750:O4|6,@439,3,0 7751:O2|@509,@7752 7752:O2|@6867,@7753 7753:O2|@7755,@7754 7754:O2|@7757,@7756 7755:O2|4,@1156 7756:O2|@7758,0 7757:O2|4,@1163 7758:O2|4,@2347 7759:O2|1,@7760 7760:O2|@765,@7761 7761:O2|@7763,@7762 7762:O2|@7765,@7764 7763:O3|2,1,@545 7764:O2|@7766,0 7765:O3|2,2,@545 7766:O3|2,3,@545 7767:O2|@1162,@7768 7768:O3|0,@7769,@576 7769:O8|@7770,@790,0,0,@540,0,4,1 7770:O3|10,@7772,@7771 7771:O3|14,@7752,0 7772:O2|@7774,@7773 7773:O2|@7776,@7775 7774:O4|1,@622,0,@689 7775:O2|@7778,@7777 7776:O4|1,@622,1,@986 7777:O2|@7780,0 7778:O4|1,@622,2,@7779 7779:O4|6,@439,3,1 7780:O4|1,@622,3,@7781 7781:O4|6,@439,4,1 7782:O3|3,@7784,@7783 7783:O3|0,@7796,1 7784:O2|@7786,@7785 7785:O2|@7788,@7787 7786:O2|49,@468 7787:O2|@7790,@7789 7788:O2|50,@393 7789:O2|@7793,0 7790:O2|51,@7791 7791:O5|5,@7792,@995,@993,@390 7792:O2|@1177,0 7793:O2|52,@7794 7794:O5|5,@7795,@995,@993,@390 7795:O2|@891,0 7796:O2|49,@7797 7797:O2|50,@7798 7798:O2|51,@7799 7799:O2|52,0 7800:O2|@7802,@7801 7801:O2|@7803,0 7802:S8|636f6d70696c6572 7803:O4|@20043,69,@7804,0 7804:O7|@7802,2,@7806,@7805,@390,0,0 7805:O3|2,@12429,@12428 7806:O2|1,@7807 7807:O3|2,@7808,0 7808:O1|@7809 7809:D4,48|483b65187303ff55484c8b4010488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@12419,2097151,@19663,@7810| 7810:D20,1216|483b65187303ff55484150504889d94c89c34889c848bac0aa17c9a37f000090ff15b2040000488b4c2408f6c101753e488b11488b1a483b1da3040000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1d51040000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751c4889c148b8c0cf09c9a37f0000eb05e932000000488b5d089090ff13488b0e488b11483b15f203000074154889c348b878e107c9a37f0000488b5d089090ff13488b5910eb26488b0e488b11483b15d003000074134889c348b878e107c9a37f0000488b5d08ff13488b5910488b7c240840f6c701753e4c8b074d8b084c3b0da7030000751d4d8d57f04c3b55107303ff55404d89d749c742f8010000004d8902eb194c8b57084c89d7483b65187303ff5548ebbc49c7c2010000004983fa01750c48bf60b317c9a37f0000eb29498b3a4c8b074c3b055803000074134989c148b878e107c9a37f0000488b5d08ff134c8b47104c89c7575053ff750849b8fea717c9a37f00004150488965084883fb01746d498d5fd8483b5d107303ff55404989df48c743f80400000049b8b0b317c9a37f00004c890348894308488b44242848894310488b44243048894318488063ffbfff750848b8aaa717c9a37f000050488965084889d848ba5096dc000000000090ff124883c4085948894d08eb49e932000000488b65084883c4085b48895d084883381b740c4889c14889c8488b5d08ff13488b4810488b5908488b01ff1586020000eb124c8b442430488b5c24289090ff157a0200004883c4085948894d084883c428c39090488b65084883c4085b48895d084883380375285048b820ae25c9a37f0000488b542418909090ff1248b860ae25c9a37f0000488b5d08909090ff13488b08483b0d2d020000756e5048bb683906c9a37f0000488b48104889c890ff151a0200004889c348b8f0ae25c9a37f000090ff150e02000048bb20af25c9a37f0000ff15060200004989c248c7c3150000004c89d090ff15fa0100004889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9750000004889480848c70007000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134152488b542420ff12498d47d8483b45107303ff55404989c748c740f80400000048b948af25c9a37f000048894818594889481048b9704406c9a37f00004889480848c700cf000000488b5d0890ff13488b40084889c348b878af25c9a37f00009090ff155201000048bb98af25c9a37f0000ff154a0100004989c248c7c3150000004c89d090ff153e0100004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134152488b542418ff12498d47d8483b45107303ff55404989c748c740f80400000048b9d0af25c9a37f000048894818594889481048b9704406c9a37f00004889480848c700cf000000488b5d0890ff13909090909090900000000000000000b804000000000000|@12426,2097151,@19664,@7812,@20134,@20134,@20134,@20134,@20141,@20141,@12420,@7824,@20055,@116,@100,@100,@100,@100,@100,@100|23,0,@7811 125,0,@2635 218,0,@2690 261,0,@1486 303,0,@1486 409,0,@7821 439,0,@1486 468,0,$7810+686 514,0,@7823 557,0,$7810+602 575,0,I32 708,0,@12408 728,0,@12410 760,0,@84 787,0,@12413 804,0,@12414 892,0,@1294 944,0,@12415 963,0,@112 998,0,@12416 1016,0,@12417 1097,0,@1294 1148,0,@12418 1167,0,@112 7811:O2|@7812,@20165 7812:D17,1664|483b65187303ff55484889d9f6c101753b488b31488b3e483b7a08751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498930eb194c8b41084c89c1483b65187303ff5548ebc049c7c0010000004983f801750c48b9f0b117c9a37f0000eb27498b08488b31483b720874144889c248b878e107c9a37f0000488b5d0890ff13488b51104889d14889daf6c201753e488b32488b3e483b3df7050000751d4d8d47f04c3b45107303ff55404d89c749c740f801000000498930eb194c8b42084c89c2483b65187303ff5548ebbd49c7c0010000004983f801750c48baf0c809c9a37f0000eb29498b10488b32483b35a805000074134889c748b878e107c9a37f0000488b5d08ff13488b72104889f24889de40f6c601753e488b3e4c8b074c3b057e050000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb194c8b4e084c89ce483b65187303ff5548ebbc49c7c1010000004983f901756a48be98c809c9a37f000040f6c601753e488b3e4c8b074c3b052b050000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb194c8b4e084c89ce483b65187303ff5548ebbc49c7c1010000004983f901751a4889c648b8c0cf09c9a37f0000eb05e930000000488b5d08ff13498b31488b3e483b3dce04000074154989c048b878e107c9a37f0000488b5d089090ff134c8b4610eb26498b31488b3e483b3dac04000074134989c048b878e107c9a37f0000488b5d08ff134c8b46104989da41f6c201753f4d8b1a4d8b234c3b2585040000751e4d8d6ff04c3b6d107303ff55404d89ef49c745f8010000004d895d00eb194d8b6a084d89ea483b65187303ff5548ebbb49c7c5010000004983fd01756b49ba98c809c9a37f000041f6c201753f4d8b1a4d8b234c3b2531040000751e4d8d6ff04c3b6d107303ff55404d89ef49c745f8010000004d895d00eb194d8b6a084d89ea483b65187303ff5548ebbb49c7c5010000004983fd01751b4989c248b8c0cf09c9a37f0000eb05e931000000488b5d0890ff134d8b55004d8b1a4c3b1dd103000074144989c448b878e107c9a37f0000488b5d0890ff134d8b6210eb2a4d8b55004d8b1a4c3b1daf03000074164989c448b878e107c9a37f0000488b5d08909090ff134d8b6210535141505241545048c7c001000000ff125048c7c001000000488b54242090ff12488b4c2430f6c101753e488b11488b1a483b1d63030000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1d11030000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751c4889c148b8c0cf09c9a37f0000eb05e932000000488b5d089090ff13488b0e488b11483b15b202000074154889c348b878e107c9a37f0000488b5d089090ff13488b5910eb26488b0e488b11483b159002000074134889c348b878e107c9a37f0000488b5d08ff13488b5910498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707410000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700610000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049ba509adc00000000004d89114d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703530000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff404c8b34244d8975004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff405e498936498d77f0483b75107303ff55404989f748c746f801000000c646ff40488906498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488901498d8770ffffff483b45107303ff55404989c748c740f811000000488998800000004889707848894870488b4c242848894868488b4c2420488948604c8960584c8968504c895848488b4c241848894840488b4c241048894838488b4c2408488948304c897028594883c428488948204c8950184c8940104c894808488938c390909000000000000000007806000000000000|@7820,1048575,@17733,@20118,@20118,@20119,@20119,@20119,@20119,@20120,@20120,@20120,@20120,@20121,@20121,@20121,@20121|91,0,@7813 118,0,@1486 225,0,@2638 255,0,@1486 362,0,@2635 456,0,@2690 497,0,@1486 539,0,@1486 644,0,@2635 739,0,@2690 782,0,@1486 824,0,@1486 965,0,@2635 1058,0,@2690 1101,0,@1486 1143,0,@1486 1263,0,I48 7813:O1|@7814 7814:D3,40|48b850b217c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@7819,1,@17732|2,0,@7815 7815:O4|103,@112,@7817,@7816 7816:O5|@7818,99,0,99,0 7817:S20|4572726f7220696e20736f7572636520636f6465 7818:S27|6d6c736f757263652f4d4c436f6d70696c65722f4c45585f2e4d4c 7819:S37|4c45585f28292e696e697469616c2832296572726f724d65737361676550726f632d283129 7820:S17|4c45585f28292e696e697469616c283229 7821:O1|@7822 7822:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@17734| 7823:D4,48|483b65187303ff55484c8b4218488b5a10488b4208ff252d000000909090909000000000000000002800000000000000|@10419,2097151,@18751,@7824| 7824:D21,1880|483b65187303ff55484c89c1f6c101753e488b11488b32483b3552070000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01750c48b920bc17c9a37f0000eb2c488b0f488b11483b150307000074164889c648b878e107c9a37f0000488b5d08909090ff13488b51104889d14c89c2f6c201753e488b32488b3e483b3dd7060000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498931eb194c8b4a084c89ca483b65187303ff5548ebbd49c7c1010000004983f901756948ba98c809c9a37f0000f6c201753e488b32488b3e483b3d85060000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498931eb194c8b4a084c89ca483b65187303ff5548ebbd49c7c1010000004983f901751c4889c248b8c0cf09c9a37f0000eb05e932000000488b5d089090ff13498b11488b32483b352606000074154889c748b878e107c9a37f0000488b5d089090ff13488b7a10eb26498b11488b32483b350406000074134889c748b878e107c9a37f0000488b5d08ff13488b7a104d8d57e84c3b55107303ff55404d89d749c742f80200000049bb70bc17c9a37f00004d891a49895a08498062ffbf4d8d5f904c3b5d107303ff55404d89df49c743f80d0000004c8ba3880000004d8963604c8bab800000004d896b584c8b73784d8973504d8953484c8b53704d8953404c8b4b684d894b38488b536049895330488b735849897328488b535049895320488b5348498953184c8b53384d895310488b7330498973084c8b63284d89234c8b68504d8b6d004c8b60784d8b24244c8b50104d8b12488b5048488b124883fa5375034c89d24883fa61752341544155ff703050415041535157ff735048ba98bd17c9a37f0000ff15f6040000eb1e488b50304989c248c7c00100000041544155524152415041535157ff7350488b442420a801753e488b08488b11483b15c8040000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01750c48b838ad0ac9a37f0000eb26488b03488b08483b0d79040000741048b878e107c9a37f0000488b5d08ff13488b48104889c8488b4c2428488b5110488b12488b5948488b1b4883fb5375034889d34883fb6174064883fb017570488b4118488b004883f801740f48b828cd06c9a37f00004883c448c3488b4128488b00488b4970488b09498d57d0483b55107303ff55404989d748c742f805000000488b5c244048895a2048894a18488b4c243848894a1048894208488b442430488902498d47c0483b4510730aeb05e94a000000ff55404989c748c740f80200000048c7400801000000488910488d481848c741f801000000488901488d411048c740f80200000048ba180218c9a37f0000488950084889084883c448c36a016a016a014989c04889e348c7c0010000009090ff1566030000498d47e0483b45107303ff55404989c748c740f80300000048b9f00218c9a37f00004883c408488908488b4c241048894808488b4c240848894810488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c40848890141504989c8488b5c243048b8880318c9a37f00009090ff15ee02000048837c241001746c5049c7c1214e000049b8509adc0000000000488b1848b8180418c9a37f0000909090ff15c60200004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a801741deb05e9210000004889c148b8f86f07c9a37f0000488b5d08909090ff13488b5424209090ff12eb0b4889c148c7c00100000051488b442438488b4818488b094883f901740f48b828cd06c9a37f00004883c458c34c8b4424284889c3488b042448ba78ae18c9a37f00009090ff151a020000488b442438488b4818488b094883f9017451488b1c24488b44240848ba60ab1dc9a37f000090ff15f6010000498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048c74008010000004889084883c458c34889c3488b0424ff15ba010000488b4c2438488b4918488b094883f9017451488b1c24488b44240848ba60ab1dc9a37f000090ff1596010000498d4fd8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048c74008010000004889084883c458c34c8b4008488b5c2430488b084889c848ba88c009c9a37f00009090ff1546010000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba00c71ec9a37f0000488911488b14244889510848894110488061ffbf4989cb4889d3488b44240848ba60ab1dc9a37f0000909090ff15fa000000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f8010000004c89184889c2488d401048c740f802000000488950084889084883c458c3909090909000000000000000005007000000000000|@10488,2097151,@18793,@20141,@20141,@20125,@20125,@20125,@20125,@7831,@20192,@20192,@8796,@10489,@8143,@8172,@9959,@10420,@9959,@2634,@9959|94,0,@7825 124,0,@1486 233,0,@2635 326,0,@2690 369,0,@1486 411,0,@1486 455,0,@7827 668,0,@7830 800,0,@3194 827,0,@1486 903,0,@440 1059,0,@7981 1132,0,@7986 1218,0,@7988 1252,0,I48 1265,0,@7991 1360,0,@1294 1419,0,@440 1446,0,@8171 1491,0,@9957 1603,0,@9957 1690,0,@2633 1732,0,@10365 1773,0,@9957 7825:O1|@7826 7826:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@17735| 7827:D4,48|483b65187303ff5548488b520848c7c001000000488b5210ff12ff252800000000000000000000002800000000000000|@7829,1048575,@17736,@7828| 7828:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17737| 7829:S42|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329676c6f62616c732d283129 7830:O2|@7831,@20166 7831:D5,240|483b65187303ff5548488b4848488b094883f9537413488b404848c7005300000048c7c001000000c3488b4810488b094883f901756d5250ff7010ff7070ff7078ff7028ff7050ff7040488b483848c7c0010000004889caff125048c7c001000000488b54240890ff12488b4c2418488b09488b54241048890a488b4c24185a4883c418488911488b4c2408488b095a48890a5948890148bbd8be17c9a37f0000eb05e921000000488b442408909090ff155200000048b810bf17c9a37f0000488b5d08909090ff13488b481048c70153000000488b5a08ff253200000090900000000000000000e800000000000000|@7847,2097151,@17740,@7848,@7836|153,0,@7832 184,0,@7833 7832:S34|756e657870656374656420656e64206f662066696c6520656e636f756e7465726564 7833:O4|@20055,@557,@7835,@7834 7834:O5|@7818,600,0,600,0 7835:S11|656e64206f662066696c65 7836:D22,2616|483b65187303ff55485350ff7010ff30ff700890ff15360a0000488b4c241850ff7170ff7178ff7128ff7150ff714048c7c001000000488b51389090ff125048c7c001000000488b54240890ff12488b4c2418488b09488b54241048890a488b4c24185a4883c418488911488b4c2408488b095a48890a5948890148833c245d756a488b442420488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb2bff30488b482048c7c0010000004889ca909090ff124883f801750948c7c009000000eb03488b0059488901488b442410488b004883f85d7436488b442410488b00eb05e99d0100004889c348b880ca17c9a37f00009090ff15520900004889c3488b4424209090ff154a090000eb66488b442420ff7070ff7028ff7040488b483848c7c0010000004889caff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442420488b4858488b09f6c101751b488b5058488b590848891a488b30488b3948893eeb2ee971080000ff30488b482048c7c0010000004889ca90ff124883f801750948c7c009000000eb03488b0059488901488b442410488b004883f85d742e488b442410488b004889c348b8a0ca17c9a37f000090ff15920800004889c3488b4424209090ff158a080000eb69488b44241848c70073000000488b4c2420ff7170ff7128ff714048c7c001000000488b5138909090ff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442420488b4858488b09f6c101751d488b5058488b590848891aeb05e99e070000488b30488b3948893eeb5eff30488b482048c7c0010000004889ca909090ff124883f801750948c7c009000000eb03488b0059488901eb6348813c24fb000000755e488b44241848c7005d000000488b4c2420488b5158488b12f6c201751d488b5958488b7208eb05e930070000488933488b394c8b024c8907eb5fff3148c7c001000000488b512090ff124883f801751348c7c009000000eb0de9fe060000e909000000488b0059488901eb5e48813c24f70000007559488b44241848c70041000000488b4c2420488b5158488b12f6c201751d488b5958eb05e9be060000488b7208488933488b394c8b024c8907eb5fff3148c7c001000000488b5120909090ff124883f8017515eb0ae98d060000e91200000048c7c009000000eb03488b0059488901eb6348813c24bf000000755e488b44241848c70079000000488b4c2420488b5158488b12f6c201751deb05e948060000488b5958488b7208488933488b394c8b024c8907eb5fff3148c7c001000000488b512090ff124883f801751348c7c009000000eb0de90e060000e909000000488b0059488901eb5e48813c24bb0000007559488b44241848c7005b000000488b4c2420488b5158488b12f6c201751d488b5958eb05e9ce050000488b7208488933488b394c8b024c8907eb5fff3148c7c001000000488b5120909090ff124883f8017515eb0ae99d050000e91200000048c7c009000000eb03488b0059488901eb6348813c24b7000000755e488b44241848c7003f000000488b4c2420488b5158488b12f6c201751deb05e958050000488b5958488b7208488933488b394c8b024c8907eb60ff3148c7c001000000488b512090ff124883f801751348c7c009000000eb0de91e050000e909000000488b0059488901eb6148833c2453755f488b44241848c7005f000000488b4c2420488b5158488b12f6c201751d488b5958488b7208eb05e9dd040000488933488b394c8b024c8907eb5eff3148c7c001000000488b51209090ff124883f801751348c7c009000000eb0de9aa040000e909000000488b0059488901eb5948833c24517557488b442420488b4858488b09f6c101751d488b5058488b590848891a488b30488b39eb05e96c04000048893eeb35ff30488b482048c7c0010000004889ca909090ff124883f801751348c7c009000000eb0de93e040000e931000000488b0059488901488b442410488b004883f855740e488b44241848c70043000000eb5e488b44242090ff158e040000eb5548833c2459755e488b44241848c70017000000488b4c2420488b5158488b12f6c2017516488b5958488b7208488933488b394c8b024c8907eb5aff3148c7c001000000488b512090ff124883f801eb0ae9b3030000e9ae030000750e48c7c009000000eb08e909000000488b0059488901eb5f48833c2477751f488b44241848c70061000000488b4c241048c70141000000eb5ee96f03000048833c24457520488b5c2428488b4424209090ff15e2030000488b44241848c70069000000eb5d48833c2447755b488b442420488b4858eb05e931030000488b09f6c101751d488b5058488b590848891a488b30488b39eb05e91103000048893eeb32ff30488b482048c7c0010000004889caff124883f801751348c7c009000000eb0de9e6020000e955000000488b0059488901488b442410488b004883f8457520488b5c2428488b4424209090ff154e030000488b44241848c70011000000eb604c8b44242048bbc8ca17c9a37f000048c7c0470000009090ff152a030000eb5948813c24fd000000756b488b442420488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb34ff30488b482048c7c001000000eb05e9470200004889caff124883f801750e48c7c009000000eb08e92e020000488b0059488901488b442410488b004883f8617241eb05e95a0000004883f8737734488b5c242048c7c003000000ff159e020000488b442408488b004889c348c7c0fd000000ff158e020000488b4c2408488901eb584c8b44242048bbc8ca17c9a37f000048c7c0fd0000009090ff156e020000eb5d48833c2409750e488b44241848c70001000000eb5e48833c2461722148833c2473771a488b5c242048c7c00100000090ff153e020000eb64e97b01000048813c2483000000720a48813c24b5000000762948813c24c30000007211eb05e95601000048813c24f5000000760e48833c244feb05e94001000075274c8b44242048bbc0cb17c9a37f000048b8509adc000000000090ff15e2010000eb6ee91701000048c7c0290000004883f801750948c7c001000000eb3c4889c14883c10e48ba68cb17c9a37f000048d1e9480fb60c0a488d4c0901483b0c24750948c7c003000000eb0f4883e802483b65187303ff5548ebb54883f801742b4c8b44242048bbc8ca17c9a37f0000eb05e9a900000048b8509adc0000000000909090ff1562010000eb65488b0424ff155e0100004889c348b890cc17c9a37f000090ff155201000048c7c345000000909090ff154a0100004889c3488b4424209090ff1542010000488b442420488b4858488b09f6c101751b488b5058488b590848891a488b30488b3948893eeb2fe92a000000ff30488b482048c7c0010000004889ca9090ff124883f801750948c7c009000000eb03488b0059488901488b442418488b004883f8537513488b5c24284883c420584883c408e9ebf5ffff48c7c0010000004883c430c3909090909090900000000000000000300a000000000000|@7937,2097151,@17747,@7938,@100,@7848,@100,@7848,@7940,@7948,@7948,@7860,@7963,@100,@7860,@7963,@7860,@7860,@85,@100,@100,@7848|246,0,@7837 455,0,@7838 1871,0,@7839 2083,0,@7839 2237,0,@7843 2247,0,I48 2300,0,@7841 2364,0,@7839 2381,0,I48 2415,0,@7846 7837:S16|756e6b6e6f776e2073796d626f6c202e 7838:S17|756e6b6e6f776e2073796d626f6c202e2e 7839:O1|@7840 7840:D3,104|48c7c1290000004883f901750b4889c148c7c001000000c34889ca4883c20e48bb68cb17c9a37f000048d1ea480fb61413488d541201483bd0750b4889c148c7c003000000c34883e902483b65187303ff5548ebb290909000000000000000006000000000000000|@7842,15,@17738|33,0,@7841 7841:S20|3a3d3c3e2b2a215e2f7c26257e2d3f60405c2423 7842:S27|436861722e636f6e7461696e732831296d61746368283129283129 7843:O1|@7844 7844:D3,112|4881f88300000072094881f8b5000000761e4881f8c300000072094881f8f5000000760c4883f861720e4883f873770848c7c003000000c34883f84f750848c7c003000000c34881f8bf000000740848c7c001000000c348c7c003000000c39000000000000000006800000000000000|@7845,1,@17739| 7845:S24|4c45585f28292e6973416c7068614e756d65726963283129 7846:S19|756e6b6e6f776e206368617261637465722022 7847:S18|4c45585f28292e696e73796d626f6c283129 7848:D5,360|483b65187303ff55485053ff7070ff7028ff7040488b483848c7c0010000004889ca9090ff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442408488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f5748bb80ce17c9a37f0000488b44240890ff15d20000009090ff15d2000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a4883c408488950184889481048c740080100000048c70003000000488b0c24488b51184883c40848c70203000000488b5160ff22909000000000000000006001000000000000|@7854,1048575,@17742,@7855,@7852|154,0,@7849 248,0,@1294 7849:O1|@7850 7850:D3,64|4883f813720e4883f81b770848c7c003000000c34883f841740848c7c001000000c348c7c003000000c390909090909000000000000000003800000000000000|@7851,1,@17741| 7851:S15|436861722e69735370616365283129 7852:D3,312|483b65187303ff5548a801756948837808017567498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb0ae99d000000e901000000c3498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000f6c1017415488b500848b8f86f07c9a37f0000488b5d0890ff1351488b50084889d0e832ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b878d017c9a37f0000c3909090909000000000000000003001000000000000|@7859,7,@17745|65,0,@1294 178,0,@1294 236,0,@833 282,0,@7853 7853:O2|@1320,0 7854:S18|4c45585f28292e6c65784572726f72283229 7855:D4,80|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c09014989da4989c14989c848c7c30100000048c7c001000000ff252d000000909090909000000000000000004800000000000000|@7857,1048575,@17743,@7856| 7856:D5,608|483b65187303ff5548f6c301750941f6c0017503ff5570493bd87569a8017508f6c3017503ff5570483bc3750848c7c001000000c3f6c3017409a8017405482bd87105ff5570ebf64883c3014989d84889c34c89c8909090ff151a0200004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3f6c30174084883fb017d08eb33f643ff10752d41f6c101740948c7c103000000eb08498b09488d4c0901f6c301740af6c1017405483bd9eb05ff5570ebf67c144889c148b8f07206c9a37f0000488b5d0890ff1341f6c101751c4889d94883c11048d1e9490fb60c09488d4c09014889c24889c8eb094889c14c89c84889ca52415153415241504c89d290ff124883f8017460488b442420a801750af6442410017503ff5570483b442410754b488b442410a80174064883c0027105ff5570ebf5488b4c2410f6c10174064883c1027105ff5570ebf54c8b5424084c8b4c24184c8b04244889c34889c84883c428e988feffffe99d000000488b4c2410f6c1017409a8017405482bc87105ff5570ebf64883c1014989c84889c3488b442418ff15d6000000488b4c2410f6c10174064883c1027105ff5570ebf5488b542410f6c20174064883c2027105ff5570ebf5504c8b5424104c8b4c24204c8b4424084889cb4889d0909090e80efeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c428c3488b442410a80174064883c0027105ff5570ebf54c8b5424084c8b4c24184c8b04244889c34883c42058e9b7fdffff9090909090909000000000000000005802000000000000|@7858,1048575,@17744,@3795,@3795|202,0,@219 7857:S16|537472696e672e746f6b656e73283229 7858:S23|537472696e672e746f6b656e73283229746f6b27283229 7859:S32|4c45585f28292e627265616b576f726473283129616464427265616b73283129 7860:D11,648|483b65187303ff5548415041ff3041ff701041ff70089090ff1582020000488b4c2410488b094883f95d755d488b4c2418488b5158488b12f6c201751d488b5958488b7208488933488b394c8b024c890749c7c101000000eb3450ff3148c7c001000000488b5120ff124883f801750948c7c009000000eb03488b005948890149c7c101000000eb06e91a01000050488b442418488b004881f88300000072094881f8b500000076124881f8c300000072344881f8f5000000772b48c7c35d000000488b04249090ff15da0100004c8b44242048bbc0cb17c9a37f00004883c428e91affffff48c7c1290000004883f901750948c7c101000000eb3b4889ca4883c20e48bb68cb17c9a37f000048d1ea480fb61413488d541201483bd0750948c7c103000000eb0f4883e902483b65187303ff5548ebb64883f901742948c7c35d000000488b0424ff15620100004c8b44242048bbc8ca17c9a37f00004883c428e99afeffff4989c2488b1c2448b838d717c9a37f000090ff153a01000048c7c35d000000909090ff15320100004c89d3909090ff152e0100004889c34883c42058ff2528010000488b0c24488901a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9017e56eb06f641ff107565a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9017e08eb1cf641ff1074164889c148b8f07206c9a37f0000488b5d08909090ff13a8017511480fb64808488d4c0901eb08e9120000004889c14883f94f750948c7c075000000eb284889c348b860d717c9a37f0000909090ff15860000004883f801750948c7c031000000eb03488b00488b4c240848890148c7c0010000004883c420c300000000000000008002000000000000|@7980,1048575,@17760,@7975,@100,@100,@100,@100,@100,@7848,@1490|213,0,@7843 261,0,@7841 341,0,@7839 367,0,@7861 516,0,@219 577,0,@7862 7861:S20|696e76616c6964206964656e7469666572202d20 7862:O3|0,@7864,@7863 7863:O200|0,0,0,0,0,0,@7867,@7868,@7869,0,@7870,0,0,0,0,0,0,0,0,@7871,@7872,0,0,0,0,@7874,0,0,@7875,0,0,0,0,0,0,@7876,0,0,0,0,0,0,@7877,0,0,0,0,0,0,0,0,0,0,0,0,0,@7878,0,@7880,0,@7881,@7883,0,0,0,0,0,0,0,0,@7884,@7885,@7887,0,0,@7888,0,@7889,0,@7891,0,0,0,0,@7892,0,0,@7894,@7895,@7897,@7898,@7899,@7900,@7902,@7904,@7905,0,@7907,@7908,@7909,0,0,@7910,0,@7912,0,0,0,0,0,0,@7914,0,0,0,@7916,0,0,0,0,0,0,@7918,@7919,@7920,0,0,0,0,0,0,0,0,0,0,@7922,@7923,@7925,0,0,0,0,0,0,0,0,0,@7927,0,0,0,0,0,0,0,@7928,0,0,0,0,0,0,0,0,0,0,0,@7930,0,0,0,@7931,0,0,@7932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,@7934,0,0,0,0,0,0,0,0,@7866 7864:O2|@7865,200 7865:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@377,2097151,@17746,@375| 7866:O2|@7936,63 7867:O2|@2130,29 7868:O2|@2134,36 7869:O2|@2132,28 7870:O2|@3084,65 7871:O2|@2703,25 7872:O2|@7873,49 7873:S7|73686172696e67 7874:O2|@1379,37 7875:O2|@1319,12 7876:O2|35,23 7877:O2|42,6 7878:O2|@7879,7 7879:S4|63617365 7880:O2|58,9 7881:O2|@7882,1 7882:S7|61627374797065 7883:O2|61,17 7884:O2|@2127,51 7885:O2|@7886,44 7886:S3|726563 7887:O2|@2335,19 7888:O2|@3009,26 7889:O2|@7890,13 7890:S2|646f 7891:O2|@1423,4 7892:O2|@7893,42 7893:S5|7261697365 7894:O2|@2140,18 7895:O2|@7896,22 7896:S6|68616e646c65 7897:O2|@2137,61 7898:O2|95,60 7899:O2|@2101,54 7900:O2|@7901,10 7901:S2|3a3e 7902:O2|@7903,56 7903:S2|3d3e 7904:O2|@1304,59 7905:O2|@7906,38 7906:S2|6f70 7907:O2|@2116,50 7908:O2|@1309,16 7909:O2|@3011,34 7910:O2|@7911,5 7911:S2|6173 7912:O2|@7913,66 7913:S8|7769746874797065 7914:O2|@7915,20 7915:S3|66756e 7916:O2|@7917,35 7917:S5|6c6f63616c 7918:O2|124,62 7919:O2|@2705,55 7920:O2|@7921,40 7921:S6|6f72656c7365 7922:O2|@2707,14 7923:O2|@7924,27 7924:S7|696e636c756465 7925:O2|@7926,64 7926:S5|7768696c65 7927:O2|@7660,21 7928:O2|@7929,53 7929:S6|737472756374 7930:O2|@3959,2 7931:O2|@2122,15 7932:O2|@7933,39 7933:S4|6f70656e 7934:O2|@7935,3 7935:S7|616e64616c736f 7936:S5|7768657265 7937:S20|4c45585f28292e7061727365546f6b656e283129 7938:D3,208|483b65187303ff5548488b08488b094883f91372064883f91b76064883f941756450ff7070ff7028ff7040488b483848c7c0010000004889ca909090ff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b0424488b4858488b09f6c101751b488b5058488b590848891a488b30488b3948893eeb2fe930000000ff30488b482048c7c0010000004889ca9090ff124883f801750948c7c009000000eb03488b005948890158e946ffffff4889c8c390900000000000000000c800000000000000|@7939,1048575,@17748| 7939:S24|4c45585f28292e736b697057686974655370616365283129 7940:D4,64|483b65187303ff5548ff304c8b40204889c348c7c001000000909090ff15360000005948890148c7c001000000c3909000000000000000003800000000000000|@7943,1048575,@17749,@7941| 7941:D4,88|483b65187303ff554841505348c7c0010000004c89c29090ff124883f801750948c7c009000000eb03488b0049b920e717c9a37f00004c8b4424085b4883c408ff252a000000909000000000000000005000000000000000|@7946,1048575,@17750,@7944|46,0,@7942 7942:O1|@7941 7943:S22|4c45585f28292e7061727365436f6d6d656e74283129 7944:D4,288|483b65187303ff55484883f80975515053ff7370ff7328ff734048c7c001000000488b5338909090ff125048c7c001000000488b54240890ff12488b4c24105a4883c4104889115948890148bba8e817c9a37f0000589090ff15da00000058c350534150415148c7c0010000004c89c2ff124883f801750948c7c009000000eb03488b0048837c24185575304883f853752a48c7c001000000488b5424089090ff124883f801750c48c7c0090000004883c420c3488b004883c420c348837c24185175354883f855752f4c8b442408488b5c241048c7c001000000488b142490ff124c8b0c244c8b4424084883c4105b4883c408e907ffffff4c8b0c244c8b4424084883c4105b4883c408e9f0feffff00000000000000001801000000000000|@7947,1048575,@17751,@7848|77,0,@7945 7945:S28|656e64206f662066696c6520666f756e6420696e20636f6d6d656e74 7946:S36|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129 7947:S54|4c45585f28292e7061727365436f6d6d656e74283129736b6970436f6d6d656e74283129736b6970436f6d6d656e74426f6479283129 7948:D6,336|483b65187303ff5548488b4858488b09f6c1017516488b5058488b7108488932488b384c8b014c8907eb325053ff7008ff30488b482048c7c0010000004889caff124883f801750948c7c009000000eb03488b00488b0c24488901eb065053ff700857ff750848b85eea17c9a37f000050488965084c8b4c24204c8b442428488b5c241048c7c00100000090ff15d600000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848bae8ea17c9a37f00009090ff158a000000488b4c241848890148c7c0010000004883c4085948894d084883c420c3909090488b65084883c4085b48895d08488b08483b4c24107408488b5d089090ff1348bba8ec17c9a37f00004883c41858ff253e00000090909090909000000000000000004801000000000000|@7961,2097151,@17753,@7953,@7950,@7848|104,0,$7948+262 214,0,@7949 295,0,@7952 7949:O2|@7950,72057594037927935 7950:D3,336|a801756848c7c1010000004889c3f6c301751ff6c10174064883c1027105ff5570ebf5488b5b08483b65187303ff5548ebdcf6c1017413f6c10174084883f9017d1feb06f641ff107417488b184889c648b8884406c9a37f0000488b5d0890ff134883f903750b488b00eb05e9c3000000c34889cb4883c31e48c1eb034883cb01483b5a0872164889c248b8583e06c9a37f0000488b5d08909090ff134889ca4889d94889c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1ea488917488d54120148c7c011000000f6c301752d488b0b48d1e848d1e948880c07488d4c0901488d4400014883c002488b4b084889cb483b65187303ff5548ebce488067ffbf4889f8c348b8509adc0000000000c39000000000000000004801000000000000|@7951,63,@17752|82,0,@113 140,0,@101 310,0,I48 7951:S31|4c696272617279537570706f72742e737472696e67496d706c6f6465283129 7952:S36|6e6f206d61746368696e672071756f746520666f756e64206f6e2074686973206c696e65 7953:D12,1744|483b65187303ff5548488b0b4881f9b90000007560498b4858488b09f6c101751d498b5058488b7108488932498b384c8b114c891749c7c301000000eb3c41514150535041ff3048c7c001000000498b50209090ff124883f801750948c7c009000000eb03488b005948890149c7c301000000eb0be949030000415141505350488b442408488b00488b4c2410488b5158488b12f6c201751d488b5958488b7208488933488b394c8b024c890749c7c101000000eb2f50ff3148c7c001000000488b5120ff124883f801750948c7c009000000eb03488b005948890149c7c101000000eb015048833c2413720748833c241b760748833c2441756a488b442418ff15e20500004881f8b9000000745b488b442410488b0048bb683906c9a37f0000909090ff15c60500004889c348b820f417c9a37f000090ff15ba05000048bb48f417c9a37f0000ff15b20500004889c3488b4424189090ff15aa050000488b442410eb0ae90b010000e998000000488b004881f8b9000000745f488b442410488b004883f8457456488b442410488b004883f8097456488b442418488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb3bff30488b482048c7c0010000004889ca9090ff124883f801751aeb0ae928000000e92300000048c7c009000000eb08e915000000488b0059488901483b65187303ff5548e957ffffff488b442418488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb2aff30488b482048c7c0010000004889ca9090ff124883f801750948c7c009000000eb03488b00594889014c8b4c24204c8b442418488b5c24104883c408584883c418e98bfdffff48813c24bd0000007556488b442410488b00488b4c2418488b5158488b12f6c201751d488b5958488b7208488933488b394c8b024c890749c7c101000000eb3550ff3148c7c001000000488b512090ff124883f801750e48c7c009000000eb08e98f000000488b005948890149c7c101000000eb0150498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480848c700b9000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c701bd000000488d411848c740f80200000048894808488b0c244889084c8b4c24284883c4084c8b4424184883c4105b4883c410e997fcffff498d47d0483b45107303ff55404989c748c740f802000000488b4c24084889480848c700b90000004889c1488d401848c740f80200000048894808488b0c244889084c8b4c24204c8b4424184883c4105b4883c410e93dfcffff4883f91575694151415053505141ff707041ff702841ff704048c7c001000000498b503890ff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442418488b4858488b09f6c101751b488b5058488b590848891a488b30488b3948893eeb2ee976000000ff30488b482048c7c0010000004889ca90ff124883f801750948c7c009000000eb03488b0059488901498d47d8483b45107303ff55404989c748c740f80400000048b968f417c9a37f00004889481848c740100100000048b998f417c9a37f000048894808488b4c2420488908488b5d08909090ff134883f94575686a0141506a015041ff707041ff702841ff704048c7c001000000498b5038909090ff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442410488b4858488b09f6c101751d488b5058488b590848891a488b30488b39eb05e93600000048893eeb2bff30488b482048c7c0010000004889ca909090ff124883f801750948c7c009000000eb03488b0059488901584883c418c3498b5058488b12f6c2017516498b7058488b7a0848893e4d8b104c8b1a4d891aeb324151415053505141ff3048c7c001000000498b5020909090ff124883f801750948c7c009000000eb03488b0059488901eb074151415053505148833c2409754d498d47d8483b45107303ff55404989c748c740f80400000048b9b8f417c9a37f00004889481848c740100100000048b998f417c9a37f000048894808488b4c2420488908488b5d08909090ff1348833c2443720a48813c24fd000000760748833c24417540498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b0c244889084c8b4c24204c8b4424184883c4105b4883c410e9a3f9ffff488b0424909090ff15a60000004889c348b8e8f417c9a37f000090ff159a00000048bb10f517c9a37f0000ff15920000004889c3488b4424189090ff158a0000004c8b4c24204c8b442418488b5c24104883c408584883c418e945f9ffff90909090900000000000000000c806000000000000|@7962,2097151,@17754,@7938,@116,@100,@100,@7848,@85,@100,@100,@7848|281,0,@84 303,0,@7954 320,0,@7955 1146,0,@7956 1168,0,@7957 1490,0,@7958 1512,0,@7957 1647,0,@7959 1664,0,@7960 7954:S21|756e65787065637465642063686172616374657220 7955:S11|20696e205c202e2e2e205c 7956:O5|@7818,350,0,350,0 7957:S9|456e644f664c696e65 7958:O5|@7818,389,0,389,0 7959:S22|756e7072696e7461626c652063686172616374657220 7960:S16|20666f756e6420696e20737472696e67 7961:S21|4c45585f28292e7061727365537472696e67283129 7962:S33|4c45585f28292e7061727365537472696e67283129676574537472696e67283129 7963:D16,1944|483b65187303ff5548488b4b1048c7013d000000ff73085351ff33ff7358504989d848bbb8fd17c9a37f000048b8509adc00000000009090ff1572070000488b4c242848890148833c24017559488b442410488b004881f8ef0000007556488b014883f861756c488b442420488b5058488b12f6c2017516488b5858488b7208488933488b384c8b024c8907eb32ff30488b502048c7c00100000090ff124883f8017515eb05e9fe01000048c7c009000000eb08e9f0010000488b0059488901488b442410488b004881f8f1000000756beb05e9d1010000488b442420488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb29ff30488b482048c7c0010000004889ca90ff124883f801750948c7c009000000eb03488b0059488901488b442410488b004883f861720d4883f873eb05e9c700000076244881f8c300000072094881f8cd00000076124881f88300000072484881f88d000000773f488b44241848c700870000004c8b44242048bb48fe17c9a37f000048b810ff17c9a37f0000ff1526060000488b4c242848890148c7c0010000004883c430c3488b442410488b00498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848c700f1000000488b4c2408488901488b44241048c700ef00000048c7c0010000004883c430c3488b442410488b004883f86172484883f8737742488b44241848c700870000004c8b44242048bbb8fd17c9a37f000048b828ff17c9a37f0000909090ff1576050000488b4c242848890148c7c0010000004883c430c3488b442410488b00498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b442408488908488b44241048c700ef00000048c7c0010000004883c430c3488b442410488b004881f8f10000007566488b014883f8617562488b442420488b5058488b12f6c2017516488b5858488b7208488933488b384c8b024c8907eb26ff30488b502048c7c00100000090ff124883f801750948c7c009000000eb03488b0059488901488b442410488b004883f8617212eb0ae9b0000000e9ab0000004883f87376244881f8c300000072094881f8cd00000076124881f883000000723f4881f88d00000077364c8b44242048bb48fe17c9a37f000048b840ff17c9a37f0000909090ff1552040000488b4c242848890148c7c0010000004883c430c3488b442410488b00498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b442408488908488b44241048c700f100000048c7c0010000004883c430c3488b442410488b004883f85d7422488b442410488b004881f88b0000007411488b442410488b004881f8cb000000755c488b442410488b004883f85d7569488b44241848c70057000000488b1148c7c35d0000004889d0ff159e030000488b4c2428488901488b442420488b5058488b12f6c201751b488b5858488b7208488933488b384c8b024c8907eb32e913030000ff30488b502048c7c00100000090ff124883f801eb05e98d000000750948c7c009000000eb03488b0059488901488b442410488b004883f86172064883f8737641488b442428488b004889c348b858ff17c9a37f0000ff1516030000488b4c2410488b094889cb909090ff150a0300004889c3488b4424209090ff1502030000eb26488b442428488b004c8b44242048bbb8fd17c9a37f000090ff15ea020000488b4c2428488901488b442410488b004881f88b0000007411488b442410488b004881f8cb000000755a488b442410488b00488b4c2420488b5158488b12f6c2017516488b5958488b7208488933488b394c8b024c8907eb3050ff3148c7c001000000488b5120909090ff124883f801750948c7c009000000eb03488b0059488901eb06e9de01000050488b442418488b004881f8fd0000007565488b442428488b4858488b09f6c1017516488b5058488b590848891a488b30488b3948893eeb28ff30488b482048c7c0010000004889caff124883f801750948c7c009000000eb03488b0059488901488b442418488b004883f86172604883f873775aeb05e9b5000000488b44242048c70057000000488b442430488b0048bb80ff17c9a37f0000909090ff15c60100004c8b44242848bbb8fd17c9a37f0000909090ff15b6010000488b4c243048890148c7c0010000004883c438c3488b442418488b00498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848c700fd000000488b4c2410488901488b442418488b0c2448890848c7c0010000004883c438c3488b442418488b004883f86172544883f873774e488b44242048c70057000000488b442430488b0048c7c38b00000090ff15120100004c8b44242848bbb8fd17c9a37f0000909090ff1502010000488b4c243048890148c7c0010000004883c438c3488b442418488b00498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488b442410488908488b442418488b0c2448890848c7c0010000004883c438c348c7c0010000004883c430c348c7c0010000004883c430c390909000000000000000009007000000000000|@7976,1048575,@17757,@7975,@7975,@7975,@7975,@100,@100,@100,@7848,@7975,@100,@7975,@100,@7975|36,0,@7964 46,0,I48 378,0,@7967 388,0,@7970 559,0,@7964 569,0,@7971 859,0,@7967 869,0,@7972 1204,0,@7973 1271,0,@7964 1569,0,@7974 1593,0,@7964 1789,0,@7964 7964:O1|@7965 7965:D3,56|4883f86172164883f873760848c7c001000000c348c7c003000000c348c7c001000000c39090909000000000000000003000000000000000|@7966,1,@17755| 7966:S15|436861722e69734469676974283129 7967:O1|@7968 7968:D3,104|4883f861720e4883f873770848c7c003000000c34881f8c300000072114881f8cd000000770848c7c003000000c34881f88300000072194881f88d000000760848c7c001000000c348c7c003000000c348c7c001000000c300000000000000006000000000000000|@7969,1,@17756| 7969:S18|436861722e69734865784469676974283129 7970:S3|307778 7971:S2|3077 7972:S2|3078 7973:S23|6d616c666f726d6564207265616c206e756d6265723a20 7974:S2|457e 7975:D5,96|483b65187303ff5548504d89c1498b084989d84889cb48c7c001000000909090ff15520000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908ff25310000009000000000000000005800000000000000|@7978,1048575,@17758,@7977,@109| 7976:S21|4c45585f28292e70617273654e756d626572283229 7977:D3,280|483b65187303ff5548488b035041514150534c89c2909090ff124883f8017466488b442410ff7070ff7028ff7040488b483848c7c0010000004889caff125048c7c001000000488b54240890ff12488b4c24105a4883c41048891159488901488b442410488b4858488b09f6c101751b488b5058488b590848891a488b30488b3948893eeb2ee96f000000ff30488b482048c7c0010000004889ca90ff124883f801750948c7c009000000eb03488b00594889014c8b4c24104c8b442408488b1c2448c7c001000000e832ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24184889084883c420c348c7c0010000004883c420c3909000000000000000001001000000000000|@7979,1048575,@17759| 7978:S19|4c45585f28292e726561644368617273283329 7979:S26|4c45585f28292e7265616443686172732833296c6f6f70283129 7980:S20|4c45585f28292e70617273654964656e74283329 7981:O1|@7982 7982:O1|@7983 7983:D3,32|48b8800218c9a37f0000c3909090909000000000000000001800000000000000|@7985,1,@17761|2,0,@7984 7984:O6|0,0,0,0,0,0 7985:S34|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329283129 7986:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17762| 7987:S24|4d6973632e6c6f6f6b757044656661756c74283229283129 7988:O1|@7989 7989:D3,56|4883f861750848c7c003000000c34883f801740848c7c001000000c348c7c003000000c39090909000000000000000003000000000000000|@7990,1,@17763| 7990:S15|53796d5365742e2b2b283229283129 7991:O1|@7992 7992:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@8169,2097151,@17842,@7993| 7993:D6,512|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c34883380175724989d949b8f80f0dc9a37f0000488b580848b8c80618c9a37f0000ff15ca010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9809017c9a37f0000eb05e95a0000004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c34883380375734989d949b8f80f0dc9a37f0000488b580848b838ac18c9a37f000090ff15fa000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f8dd08c9a37f0000eb05e95a0000004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3488b400848ba60a018c9a37f0000ff253e0000009090909090900000000000000000f801000000000000|@8170,2097151,@17843,@8143,@8143,@8150|30,0,@819 50,0,@3959 64,0,@7994 108,0,@833 149,0,@7659 238,0,@1294 265,0,@3959 279,0,@8166 324,0,@833 365,0,@2126 454,0,@1294 476,0,@8147 7994:O1|@7995 7995:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@8162,2097151,@17837,@7996| 7996:D11,1368|483b65187303ff5548488b086a016a014883783003755e488b500848833a057554488b7208498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46184c8947104c8b4e104c894f084c8b56084c89174c8d5f2049c743f80100000049893b4889e74c891f4889e74c8b1e4c895f08eb154889e248c702010000004889e2488b7008488972084989da4c8b59104c8b2148c7c351000000488b48184889c89090ff15c6040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134c3b258c040000743b41f6c40175414c89e648bf509adc00000000004889c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084889c1eb0c4889c848c7c101000000eb714989cd48bbf80c18c9a37f00004c89e0909090ff1532040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889c8498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e91400000048bab08d07c9a37f0000488951084889014c89e84c89d2f6c20174064883ea027105ff5570ebf5504152514889d34c89d848ba100d18c9a37f00009090ff159a030000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014883f9017506488b0424eb0d4889cb488b0424ff1566030000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13f644241801756d488b442418488b1048837a0801750c48bbf80c18c9a37f0000eb0a48bb089418c9a37f0000498d77e8483b75107303ff55404989f748c746f80200000048895e0848c7060700000040f6c601741348b8f86f07c9a37f0000488b5d08909090ff13488b5c2408f6c301740deb05e9820000004883eb027105ff5570ebf55156488b0248ba100d18c9a37f0000ff1582020000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0b4889c848c7c10100000050488b442410a80174064883e8027105ff5570ebf5514889c3488b44243048bae89418c9a37f00009090ff15ee010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f00004889084883f8017506488b0424eb0e4889c3488b042490ff154a010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8601b07c9a37f00004883c408488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4104889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3909000000000000000005005000000000000|@8164,2097151,@17838,@100,I48,@100,@8000,@8165,@8000,@8139,@8163|212,0,@1294 249,0,I48 314,0,@7997 376,0,@1294 429,0,@1371 478,0,@7998 620,0,@1294 661,0,@7997 673,0,@8133 724,0,@1294 776,0,@7998 843,0,@833 930,0,@8137 999,0,@833 1040,0,@1302 1081,0,@833 1148,0,@832 1229,0,@833 1335,0,@1294 7997:S2|203a 7998:O2|@8000,@7999 7999:O2|@8022,@8021 8000:D11,1112|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488338057570488b4808ff712053ff7110ff711852488b410890e8baffffff4889c648c7c0010000004883c408ff1516040000564989c0488b5c2418488b44240848ba281a08c9a37f00009090ff15fe030000498d4fe8483b4d107303ff55404989cf48c741f802000000488b54241048895108eb05e98802000048c70107000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff13488b542418f6c20174064883ea027105ff5570ebf5505152488b4424389090ff159a0300004889c648c7c001000000ff159203000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff1572030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014883f9017506488b0424eb0e4889cb488b042490ff15ae020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9507107c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9001218c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4204889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c348833801756d4989d949b8509adc0000000000488b5808488b4208909090ff15520100009090ff1552010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e96400000048b948d108c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3909000000000000000005004000000000000|@8003,2097151,@17764,@1323,@1614,@8004,@1323,@1416,@8018,@8019,@8002|30,0,@819 106,0,@1613 179,0,@1294 255,0,@1615 272,0,@1415 339,0,@833 380,0,@1302 421,0,@833 520,0,@833 565,0,@1303 606,0,@833 647,0,@8001 688,0,@833 794,0,@1294 821,0,I48 884,0,@833 932,0,@2115 1014,0,@1294 1078,0,@1294 8001:O2|3,@7936 8002:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17776|64,0,@2119 8003:S27|5349474e41545552455328292e646973706c617953696773283229 8004:D10,816|483b65187303ff5548488b0848baee1218c9a37f0000488d548afcffe290e9cb000000909090e923000000909090e9c6000000909090e907010000909090e932010000909090e95b020000909090488b4808488b5128488b1252ff7108ff712048bb601618c9a37f0000488b01909090ff15d2020000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70101000000498d57b8483b55107303ff55404989d748c742f80200000048c742080100000048890a4889c1488d421848c740f80500000048895020488b542408488950185a4883c408488950104889480848c7000b000000c348b8d09507c9a37f0000c3ff7018488b400890e8fafeffff50488b44240890e8eefeffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4084889480848c70005000000c3488b4808498d47e0483b45107303ff55404989c748c740f803000000488b510848895010488b194889580848c7000d000000c3ff701048bb601618c9a37f0000488b40089090ff15c20100009090ff15c20100004889c34889d8ff15be010000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1424488951104889410848c701010000004883fa017542498d47f0483b45107303ff55404989c748c740f801000000c640ff40488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000498d47e0483b45107303ff55404989c748c740f803000000488948104889580848c700070000004883fa01755f498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004889114883c408c34883c408c348bb601618c9a37f0000488b4008ff15ae00000048c7c303000000909090ff15a60000004889c34889d8ff15a2000000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000c390909000000000000000002803000000000000|@8007,2097151,@17765,@8008,@8009,@8010,@8014,@8015,@8016,@8006|14,0,$8004+30 98,0,@8005 240,0,@1394 378,0,@8005 608,0,@573 680,0,@8005 8005:O1|@8004 8006:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17773| 8007:S32|545950455f5452454528292e7479706546726f6d547970655061727365283129 8008:D3,112|483b65187303ff5548a801754553ff7008488b004889da90ff1250488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@17766| 8009:D4,368|483b65187303ff5548a801755f488b08488b1153ff7008ff32488b41084889daff125950f6c101740948c7c003000000eb08488b01488d440001a80174084883f8037f08eb58f640ff107557f6c101740948c7c003000000eb08488b01488d440001a801740f4883f801eb05e9e50000007e08eb18f640ff10741248b8f07206c9a37f0000488b5d089090ff13f6c1017516480fb64108488d440001eb0de958000000e9530000004889c84883f861754af6c101740948c7c003000000eb08488b01488d440001a80174064883e8027105ff5570ebf54989c048c7c3030000004889c890ff159e0000004889c1483b65187303ff5548e929ffffff4889c8498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151488b5c2410488b442408e8d2feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000006801000000000000|@1363,1048575,@17767,@3795|125,0,@219 8010:D4,72|483b65187303ff5548a8017521488b0851ff31488b40089090e8e2ffffff4c8b4424085b4883c408ff253200000048c7c001000000c3909000000000000000004000000000000000|@8012,1023,@17768,@8011| 8011:D3,528|483b65187303ff5548a801755c488b08f6c301740948c7c203000000eb08488b13488d541201488b3940f6c701740948c7c603000000eb08488b37488d743601f6c201750940f6c6017503ff5570483bd67556483bdf7456f6c301755640f6c701755040f6c701eb05e968010000740948c7c203000000eb08488b17488d5412014883c2104889de4c8b094889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017414eb1be964000000e9050000004989f9eb0c4989f948c7c101000000eb454989c24989db4c89cb4c89d848ba1095dc00000000009090ff124883f801750948c7c103000000eb0748c7c1ffffffff498b4208498b124889c34c89d04889de4c89dbeb56488b7008488b10eb60f6c301740948c7c203000000eb08488b13488d54120140f6c701740948c7c603000000eb08488b37488d743601f6c201740b40f6c6017405483bd6eb05ff5570ebf67c0e48c7c103000000eb0ce90e00000048c7c1ffffffff488b7008488b10f6c10174084883f9017f2beb06f641ff1074234889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c8900c3524889f090e84efeffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004c8900c390909090909000000000000000000802000000000000|@8013,1023,@17769|210,0,I27 8012:S25|545950455f5452454528292e736f72744c6162656c73283129 8013:S35|545950455f5452454528292e736f72744c6162656c73283129656e7465722833292829 8014:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17770| 8015:D3,112|483b65187303ff5548a801754553ff7008488b004889da90ff1250488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@17771| 8016:D4,192|483b65187303ff5548a801756eff700853ff3048c7c303000000488b44240848baa05f06c9a37f0000909090ff15a6000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890158a80174064883c0027105ff5570ebf5514889c3488b4424089090e88effffff4889c1498d47e8eb05e921000000483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c3909090909090900000000000000000b800000000000000|@8017,2097151,@17772,@194|33,0,@193 8017:S26|545950455f5452454528292e6d6170746f5265636f7264283229 8018:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17774| 8019:D3,696|483b65187303ff5548f6c301756348837b0801756141f6c10174084983f9017f14eb0741f641ff10740b48b8008e07c9a37f0000c34889c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b1b4889184889ca909090ff124889c1498d47e8483b4510730feb0ae92a020000e91a000000ff55404989c748c740f80200000048c7400801000000488908c341f6c10174084983f9017f14eb0741f641ff10740b48b8008e07c9a37f0000c34983f85974184983f877740948c7c101000000eb1048c7c103000000eb0748c7c1030000004883f1024889c2498d47e8483b45107303ff55404989c748c740f8020000004c894808488b334889304151524150ff730851ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70103000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57e8483b55107303ff55404989d748c742f802000000488b5c240848895a0848c70207000000f6c20174134889c648b8f86f07c9a37f0000488b5d08ff13498d7788483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f8020000004889720848890a488d4a1848c741f80200000048895108488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2418f6c10174064883e9027105ff5570ebf5504989c94989d8488b5c2408488b4424189090e8aefdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c30000000000000000b002000000000000|@8020,1048575,@17775|44,0,@1374 172,0,@1374 324,0,@1294 391,0,@1294 534,0,@1294 624,0,@833 8020:S27|5349474e41545552455328292e646973706c61794c697374283429 8021:O3|@8025,@8024,@7998 8022:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@8023,1048575,@17777| 8023:S28|5349474e41545552455328292e646973706c61795370656373283129 8024:O2|@8135,@7998 8025:D17,1992|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488b0848be462318c9a37f0000488d748efcffe6909090e9fb000000909090e917010000909090e9cf030000909090e99b040000909090e90b000000909090e98f050000909090ff7210ff35690700004989d949b8f80f0dc9a37f0000488b58084889e090ff1556070000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e0c908c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3f6c30174064883eb027105ff5570ebf5488b400848ba682b18c9a37f0000ff258e060000488b4810f6401801756a488b50184989da4c8b1a48bbf80c18c9a37f0000488b0190ff156e060000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1341f6c20174064983ea02710cff5570eb05e94f010000ebee5141524c89d890ff15160600004889c648c7c001000000ff150e06000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff15ee050000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b840ec08c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c3498d57e8483b55107303ff55404989d748c742f802000000488b1948895a0848c70207000000f6c201741048b8f86f07c9a37f0000488b5d08ff13498d77d0483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f8020000004889720848be98ec08c9a37f0000488932498d77e8483b75107303ff55404989f748c746f8020000004889560848ba40ec08c9a37f0000488916498d47d0483b45107303ff55404989c748c740f8050000004889702048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c248b8f86f07c9a37f0000488b5d0890ff13c3f6c30174064883eb027105ff5570ebf54989d949b8509adc0000000000488b5808488b420890ff15ca030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9709018c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c34883781001740c48b9889018c9a37f0000eb0748c7c101000000514989d949c7c07b000000488b581848b8a09018c9a37f0000909090ff15ee0200004883f8017506488b0424eb104889c3488b0424909090ff15da020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9609118c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3488b48104989da4c8b581848bbf80c18c9a37f0000488b019090ff1516020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1341f6c20174064983ea027105ff5570ebf55141524c89d8ff15c60100004889c648c7c001000000ff15be01000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff159e010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c86818c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c39090909090900000000000000000c007000000000000|@8131,2097151,@17820,@8132,@8019,@8028,@100,@8004,@1323,@1416,@8019,@8019,@8130,@100,@8004,@1323,@1416|30,0,@819 44,0,$8025+62 124,0,@3959 176,0,@833 221,0,@2100 303,0,@1294 340,0,@8026 376,0,@7997 436,0,@1294 515,0,@1615 532,0,@1415 599,0,@833 672,0,@2142 713,0,@2139 792,0,@1294 855,0,@1294 922,0,@2142 963,0,@2139 1042,0,@1294 1079,0,I48 1132,0,@833 1173,0,@8124 1255,0,@1294 1279,0,@8125 1313,0,@8126 1388,0,@833 1433,0,@8129 1515,0,@1294 1543,0,@7997 1604,0,@1294 1675,0,@1615 1692,0,@1415 1759,0,@833 1832,0,@2142 1873,0,@8073 1952,0,@1294 8026:O3|@8028,@8118,@8027 8027:O2|@8122,@8026 8028:D49,10888|483b65187303ff554852ff35902a0000f6c30174084883fb017f17eb06f643ff10740f48b8901607c9a37f00004883c410c3488b0848bee62b18c9a37f0000488d748efcffe6e93b010000909090e9ff050000909090e953070000909090e90b0a0000909090e9cb0b0000909090e93b0e0000909090e9af0f0000909090e9cb110000909090e9f3140000909090e9fa140000909090e9d3150000909090e9a7160000909090e973170000909090e95b180000909090e983000000909090e9fb190000909090e93f1b0000909090e9931c0000909090e9671d0000909090e9ef1e0000909090e98f200000909090e967210000909090e9bb220000909090e997230000909090e96f240000909090e9bf240000909090e993250000909090e9bf260000909090e9c6260000909090e987270000909090e92b290000909090488b4008488b08498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c3488b48084883791803756e4889daf6c20174064883ea027105ff5570ebf553ff31ff712049b9c05718c9a37f00004989d048bbf80f0dc9a37f0000488b4110909090ff15da280000f6042401740948c7c101000000eb71488b4c2410f6c10174064883e9027105ff5570ebf55049b9306118c9a37f0000eb05e97e0200004989c848bbf80f0dc9a37f0000488b4424089090ff15922800009090ff1592280000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000eb05e9310000004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8306518c9a37f0000488901eb0150488b442418a80174064883e8027105ff5570ebf5514c8d4c24284989c048c7c377000000488b4424189090ff150a280000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100300000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b990600ac9a37f00004889084883f8017506488b0424eb104889c3488b0424909090ff153a2700004883f801750c48b8201d08c9a37f0000eb164889c348b8201d08c9a37f0000909090ff151a2700004883f8017507488b442408eb0f4889c3488b44240890ff1506270000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c428488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9486518c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889daf6c20174064883ea027105ff5570ebf553ff712049b9c05718c9a37f00004989d048bbf80f0dc9a37f0000488b4110ff1526260000f6042401740948c7c101000000eb6e488b4c2408f6c10174064883e9027105ff5570ebf55049b9306118c9a37f00004989c848bbf80f0dc9a37f0000488b44240890ff15e6250000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b4510730aeb05e94a000000ff55404989c748c740f8020000004889480848b9306518c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901eb01504883f9017506488b0424eb0f4889cb488b04249090ff154e250000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9007407c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70104889cb488b4008e88af9ffff488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e862f9ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8606518c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c410c3488b4808488b710848833e33755cf6460801755b488b7e08f647080175564c8b470849837808017563488379180375614989d941f6c10174064983e9027105ff5570ebf5535241ff30ff314c89cb488b079090e8faf7ffff50488b5c2420488b442408488b542418eb0fe949010000e944010000e93f0100009090e8d2f7ffff488b4c2420f6c1017412eb0ae927010000e9220100004883e9027105ff5570ebf5504889cb488b442418488b542420e89ef7ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c420488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889df40f6c70174064883ef027105ff5570ebf55352564889fb488b019090e876f6ffff488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e84ef6ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c3488b48084889de40f6c60174064883ee027105ff5570ebf55352ff71084889f3488b01e86af5ffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba786518c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8906518c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13488b4c2410f6c10174064883e9027105ff5570ebf5488b542408504c8b4a084989c848c7c3f9000000488b44240890ff155e1f0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4184889084889c1488d401848c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c3488b48084889de40f6c60174064883ee027105ff5570ebf55352ff7108ff71104889f3488b0190e89ef3ffff488b4c2418f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542418e876f3ffff488b4c2420f6c10174064883e9027105ff5570ebf5504889cb488b442418488b542420e84ef3ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888f309c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b858f309c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c420488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b828f309c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70084889cb488b4010e82ef1ffff50488b442408ff15221c00004889c648c7c001000000ff151a1c000049c7c20100000049b9381c08c9a37f00004989c0488b5c24184889f048ba40a507c9a37f0000ff15f61b0000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c410c3488b4808498d57e8483b55107303ff55404989d748c742f802000000488b591048895a0848c70207000000f6c201741348b8f86f07c9a37f0000488b5d08909090ff13498d77e8483b75107303ff55404989f748c746f802000000488b791848897e0848c7060700000040f6c601741348b8f86f07c9a37f0000488b5d08909090ff134d8d47d04c3b45107303ff55404d89c749c740f80200000049c7400801000000498930498d701848c746f8020000004c89460849b8781b07c9a37f00004c89064d8d47e84c3b45107303ff55404d89c749c740f8020000004989700848be007407c9a37f0000498930498d77e8483b75107303ff55404989f748c746f8020000004c89460849b8781b07c9a37f00004c89064d8d47e84c3b45107303ff55404d89c749c740f8020000004989700848be387107c9a37f0000498930498d77e8483b75107303ff55404989f748c746f8020000004c89460849b8781b07c9a37f00004c89064d8d47d04c3b45107303ff55404d89c749c740f80200000049897008498910498d501848c742f8020000004c89420848be781b07c9a37f0000488932498d77e8483b75107303ff55404989f748c746f8020000004889560848ba007407c9a37f0000488916498d47d0483b45107303ff55404989c748c740f8050000004889702048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c248b8f86f07c9a37f0000488b5d0890ff134883c410c3488b480848833903756953ff701048c7c303000000488b410848baa05f06c9a37f0000909090ff159e180000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b4510730aeb05e9af000000ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c0e108c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101746948b8f86f07c9a37f0000488b5d08ff1348833901755853ff701048c7c303000000488b410848baa05f06c9a37f0000ff1586170000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741f48b8f86f07c9a37f0000eb0ae9d8000000e9c5000000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f0e108c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101742148b8f86f07c9a37f0000488b5d08909090ff1348b920e208c9a37f000053ff7010488b442408a80174064883e8027105ff5570ebf55149b9a86518c9a37f00004989c048bb509adc0000000000488b442408ff1546160000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4104889084889c1488d401848c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c348b8686618c9a37f00004883c410c352ff359c150000f6c30174064883eb027105ff5570ebf54989e14989d848bbf80f0dc9a37f0000488b4008ff157a150000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b940ec08c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3f6c30174064883eb027105ff5570ebf54989e14989d848c7c377000000488b400890ff15aa1400009090ff15aa140000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3f6c30174064883eb027105ff5570ebf54c8b4a084989d848c7c3f9000000488b4010ff15de130000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9806109c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3ff721052ff35301300004889e151ff352e130000f6c30174064883eb027105ff5570ebf54989e14989d848bbf80f0dc9a37f0000488b40089090ff150a130000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c428488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9986618c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70104889cb488b4008e8cee6ffff488b4c2410f6c10174064883e9027105ff5570ebf5488b542408504c8b4a084989c848c7c3f9000000488b442408ff150a120000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b06618c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100300000048c741080700000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4184889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c410c3f6c30174064883eb027105ff5570ebf5ff7018ff70084989d0488b442408ff159610000048833c2401740c48b9702707c9a37f0000eb72f644240801750c48b9a0bb07c9a37f0000eb0a48b9582707c9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70207000000f6c20174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e90b00000048c74108010000004889114883f90174094889cbff15fa0f0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b02807c9a37f00004883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70104889cb488b4008e8d2e3ffff488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e8aae3ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c86618c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c410c3f6c30174064883eb027105ff5570ebf54c8b4a104989d848c7c359000000488b4010ff15fa0d00009090ff15fa0d0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e06618c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3488b4820488b11483b15480d00007432f6c20175664889d648bff86618c9a37f000048c7c12500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017560498d4fe8483b4d107303ff55404989cf48c741f80200000048ba186718c9a37f000048895108488b4010488901498d47e8483b4510730aeb05e922000000ff55404989c748c740f8020000004889480848c7004500000090ff15be0c0000eb63483b15bd0c00007432f6c201755a4889d648bf306718c9a37f000048c7c12100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756d498d4fe8483b4d107303ff55404989cf48c741f80200000048ba186718c9a37f000048895108eb0ae944000000e93b000000488b4010488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9486718c9a37f0000488908909090ff15260c0000eb04488b40104889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3488b48084883791001750c48ba40290ac9a37f0000eb0a48ba00e317c9a37f0000498d77e8483b75107303ff55404989f748c746f8020000004889560848c7060700000040f6c601741148b8f86f07c9a37f0000488b5d0890ff134889daf6c20174064883ea027105ff5570ebf55356ff314c8d4c24184989d048c7c377000000488b410890ff155a0b0000488b4c2410f6c10174064883e9027105ff5570ebf5504c8d4c24204989c848c7c377000000488b442408ff15320b00009090ff15320b00004883f801750c48b8606718c9a37f0000eb164889c348b8606718c9a37f0000909090ff15120b00004883f8017506488b0424eb104889c3488b0424909090ff15fe0a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c410488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4084889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c3488b4008f6c30174064883eb027105ff5570ebf549b9906718c9a37f00004989d848bb509adc0000000000488b00ff15320a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9686818c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70104889cb488b4008e882ddffff488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e85addffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8806818c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c410c352488b40089090e83edcffff498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f00004883c40848895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c3f6c30174064883eb027105ff5570ebf552488b40089090e84adbffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f00004883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8986818c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c3488b580848c7c047000000909090ff155a0600004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c3f6c30174064883eb027105ff5570ebf54c8b4a104989d848c7c359000000488b4008ff15f6050000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8902b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908ff15a60500004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c3f6400801750e488b4808488b1148837a2803740c48b9687107c9a37f0000eb0a48b9387207c9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70207000000f6c2017415488b480848b8f86f07c9a37f0000488b5d0890ff13f6c30174064883eb027105ff5570ebf55249b9306118c9a37f00004989d848bbf80f0dc9a37f0000488b4008909090ff15b6040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f80200000048894808594889084889c1488d401848c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c348b8b06818c9a37f00004883c410c3f6c30174064883eb027105ff5570ebf54989d0488b4008ff15fa030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c86818c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134883c410c34889d9f6c10174064883e9027105ff5570ebf55352ff70084889cb488b4010e822d7ffff488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e8fad6ffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e06818c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f86818c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134883c410c348b8b83c0ac9a37f00004883c410c39090900000000000000000802a000000000000|@8082,2097151,@17788,@8083,@8038,@8038,@8085,@8038,@8086,@8087,@8088,@8038,@8038,@8089,@8038,@8004,@1323,@1416,@194,@194,@8038,@8090,@8038,@8038,@8095,@8038,@8096,@8105,@8038,@8038,@8107,@8109,@8038,@8110,@8060,@109,@8062,@109,@8038,@8038,@8111,@8112,@8113,@8038,@100,@8038,@8114,@8038,@8076|37,0,@819 55,0,$8028+70 369,0,@1294 428,0,@8029 441,0,@3959 501,0,@8040 521,0,@3959 580,0,@833 631,0,@8046 760,0,@1294 830,0,@833 871,0,@3083 918,0,@1621 933,0,@1621 1008,0,@833 1053,0,@8047 1135,0,@1294 1179,0,@8029 1192,0,@3959 1249,0,@8040 1262,0,@3959 1312,0,@833 1360,0,@8046 1401,0,@833 1472,0,@833 1517,0,@1318 1599,0,@1294 1747,0,@833 1788,0,@8048 1829,0,@833 1944,0,@1294 2199,0,@833 2272,0,@833 2387,0,@1294 2535,0,@833 2650,0,@1294 2736,0,@8049 2781,0,@833 2822,0,@8050 2901,0,@1294 3000,0,@833 3106,0,@1294 3303,0,@833 3344,0,@2706 3385,0,@833 3458,0,@833 3499,0,@2704 3540,0,@833 3617,0,@833 3658,0,@2702 3737,0,@1294 3831,0,@1615 3852,0,@1415 3919,0,@833 3960,0,@2099 4001,0,@833 4116,0,@1294 4188,0,@1294 4252,0,@1294 4322,0,@833 4363,0,@1318 4404,0,@833 4445,0,@1302 4486,0,@833 4546,0,@833 4587,0,@1318 4666,0,@1294 4713,0,@193 4772,0,@1294 4849,0,@833 4890,0,@2129 4967,0,@1294 5004,0,@193 5060,0,@1294 5142,0,@833 5183,0,@2131 5260,0,@1294 5279,0,@2133 5314,0,@8051 5327,0,I48 5376,0,@833 5482,0,@1294 5504,0,@8054 5548,0,@3959 5596,0,@833 5641,0,@2139 5723,0,@1294 5820,0,@884 5861,0,@835 5943,0,@1294 6032,0,@833 6073,0,@2334 6155,0,@1294 6218,0,@3959 6268,0,@833 6313,0,@8056 6395,0,@1294 6532,0,@833 6573,0,@8057 6650,0,@1294 6718,0,@833 6824,0,@1294 6891,0,@850 6910,0,@1430 6922,0,@849 6975,0,@1294 7076,0,@862 7159,0,@1294 7307,0,@833 7348,0,@8058 7389,0,@833 7504,0,@1294 7604,0,@884 7645,0,@8059 7727,0,@1294 7772,0,@8060 7838,0,@8061 7927,0,@8062 7993,0,@8061 8054,0,@8063 8127,0,@1294 8159,0,@3011 8171,0,@7917 8222,0,@1294 8350,0,@8064 8365,0,@8064 8440,0,@833 8550,0,@1294 8592,0,@8066 8605,0,I48 8652,0,@833 8693,0,@8069 8775,0,@1294 8923,0,@833 8964,0,@8070 9005,0,@833 9120,0,@1294 9180,0,@883 9229,0,@884 9270,0,@835 9349,0,@1294 9451,0,@833 9496,0,@8071 9575,0,@1294 9661,0,@1294 9752,0,@884 9793,0,@835 9881,0,@1294 9924,0,@1304 9936,0,@1309 9990,0,@1294 10024,0,@8040 10037,0,@3959 10088,0,@833 10190,0,@1294 10212,0,@8072 10284,0,@833 10325,0,@8073 10407,0,@1294 10555,0,@833 10596,0,@8074 10637,0,@833 10714,0,@833 10755,0,@8075 10834,0,@1294 10856,0,@3036 8029:O1|@8030 8030:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@8035,1048575,@17779,@8031| 8031:D7,480|483b65187303ff5548488b70104889df4c8b004c8b482848c7c0010000009090ff15d2010000565741504989c04889fb4c89c848ba281a08c9a37f0000909090ff15ba010000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff135af6c20174064883ea027105ff5570ebf5505149b9585a18c9a37f00004989d048c7c3f9000000488b442410909090ff154e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9387107c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883f8017506488b0424eb0d4889c3488b0424ff15a20000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c39090909090900000000000000000d801000000000000|@8037,1048575,@17780,@1323,@1614,@8038,@8036|53,0,@1613 116,0,@1294 154,0,@8032 216,0,@833 257,0,@1302 298,0,@833 437,0,@1294 8032:O1|@8033 8033:D6,456|483b65187303ff5548488b08498d57e8483b55107303ff55404989d748c742f802000000488b591048895a0848c70207000000f6c2017415488b700848b8f86f07c9a37f0000488b5d0890ff13f6410801756d488b710852ff7008488b069090ff157a0100004889c648c7c001000000ff157201000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff1552010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000eb05e974000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8688e07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb0848c7c00100000052498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080500000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c390900000000000000000c001000000000000|@8034,2097151,@17778,@8004,@1323,@1416|62,0,@1294 127,0,@1615 144,0,@1415 218,0,@833 259,0,@1378 300,0,@833 421,0,@1294 8034:S56|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436f6e7374727563746f72283129 8035:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283129 8036:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17782| 8037:S57|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446174617479706542696e64283229 8038:D4,760|483b65187303ff554841f6c00174084983f8017f14eb0741f640ff10740b48b8008e07c9a37f0000c3a801755848837808017556488b08498d47e8483b45107303ff55404989c748c740f8020000004c8940084889084c89ca909090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3e952020000488b08488b5008498d47e8483b45107303ff55404989c748c740f8020000004c8940084889084150415153524c89ca909090ff1248837c240859745a48837c2408777457488b4c2408483b0d360200007457f6c10175494889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740948c7c101000000eb3548c7c103000000eb2ce920000000e91200000048c7c101000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f102498d57e0483b55107303ff55404989d748c742f80300000048c742100100000048894a0848c70203000000f6c20174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b5c24084889590848c70107000000f6c10174134889c648b8f86f07c9a37f0000488b5d08ff13498d7788483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f80200000048897108488911488d511848c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2418f6c10174064883e9027105ff5570ebf5504c8b4c24184989c8488b44240890e872fdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c3909090900000000000000000f002000000000000|@8039,1048575,@17781,I48|32,0,@1374 230,0,I48 389,0,@1294 455,0,@1294 598,0,@1294 684,0,@833 8039:S30|5052494e545f50415253455452454528292e7072696e744c697374283429 8040:O1|@8041 8041:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@8043,2097151,@17783,@8042| 8042:D9,552|483b65187303ff55484889de488b78104c8b004c8b483048c7c0010000009090ff151a020000565741504989c04889f34c89c848ba281a08c9a37f0000909090ff1502020000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13f6042401756d488b14245051488b02ff15b60100004889c648c7c001000000ff15ae01000049c7c20100000049b9381c08c9a37f00004989c0488b5c24184889f048ba40a507c9a37f0000ff158a010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000eb05e974000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb0c4889c248c7c0010000005251498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014883f9017506488b0424eb0d4889cb488b0424ff15b20000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c418c390909090909000000000000000002002000000000000|@8045,2097151,@17784,@1323,@1614,@8004,@1323,@1416,@8044|53,0,@1613 116,0,@1294 179,0,@1615 200,0,@1415 274,0,@833 315,0,@1302 356,0,@833 509,0,@1294 8043:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283129 8044:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17785| 8045:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745479706542696e64283229 8046:O2|3,@7913 8047:O2|3,@7882 8048:O2|3,@7935 8049:O2|@833,@1376 8050:O2|3,@7879 8051:O1|@8052 8052:D3,80|488b08498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3909000000000000000004800000000000000|@8053,3,@17786|47,0,@1294 8053:S40|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229283129 8054:O2|3,@8055 8055:S7|3c456d7074793e 8056:O2|3,@7915 8057:O2|3,@7896 8058:O2|3,@7911 8059:O2|3,91 8060:S10|636f6e76537472696e67 8061:O2|34,0 8062:S8|636f6e7643686172 8063:S2|2322 8064:O2|@833,@8065 8065:O2|@3008,@1621 8066:O1|@8067 8067:D3,88|488b00488b08498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000005000000000000000|@8068,3,@17787|50,0,@1294 8068:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e745374724e616d65283129 8069:O2|3,@7933 8070:O2|3,@7921 8071:O2|3,@7893 8072:O2|3,@2577 8073:O2|3,@2137 8074:O2|3,@7890 8075:O2|3,@7926 8076:D5,792|483b65187303ff5548a801756f488b08f6c30174084883fb017f13eb06f643ff10740b48b8008e07c9a37f0000c34883792001750948c7c201000000eb0a48ba606c18c9a37f00004889de40f6c60174064883ee027105ff5570ebf5524150ff700853ff71084889f3488b014c89c290ff12488b4c2408f6c101eb05e97b02000074064883e9027105ff5570ebf5504889cb488b442408488b542420ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff1348837c240801753d498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014883f90175064883c41858c34889cb4883c41858ff2542010000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba906c18c9a37f0000488951084889014883f9017507488b442418eb0e4889cb488b442418ff1506010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b0424a80174064883e8027105ff5570ebf5514c8b4424184889c3488b442410909090e852fdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c420c348c7c001000000c39090909000000000000000001003000000000000|@8116,1048575,@17814,@8117,@8115|37,0,@1374 64,0,@8077 211,0,@833 252,0,@1302 293,0,@833 408,0,@1294 520,0,@8079 628,0,@1294 716,0,@833 8077:O2|@8078,@1621 8078:O2|3,@7886 8079:O2|@833,@8080 8080:O2|@8081,0 8081:O2|3,@3959 8082:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229 8083:D3,48|483b65187303ff5548488b08488b5808488b01488b5208ff229090909090909000000000000000002800000000000000|@8084,1048575,@17789| 8084:S60|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61794c69737457697468427074732d283129 8085:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8201d08c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17790|64,0,@1621 8086:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17791| 8087:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17792| 8088:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17793| 8089:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17794| 8090:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@8092,2097151,@17795,@8091| 8091:D7,720|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000f6c1017419488b5028488b701048b8f86f07c9a37f0000488b5d0890ff13f6401001756d488b701051ff7028415053488b06909090ff157e0200004889c648c7c001000000ff157602000049c7c20100000049b9381c08c9a37f00004989c0488b1c244889f048ba40a507c9a37f000090ff1552020000498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e97c00000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8688e07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb10488b502848c7c0010000005152415053488b4c241048833911750948c7c101000000eb71488b1424f6c20174064883ea027105ff5570ebf5504889d34889c8488b542410909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d10730aeb05e94d000000ff55404989cf48c741f8020000004889410848b8387107c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901eb01504883f9017506488b0424eb0d4889cb488b0424ff15be000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084883c42058488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c39090909090900000000000000000c802000000000000|@8094,2097151,@17796,@8004,@1323,@1416,@8093|62,0,@1294 131,0,@1615 151,0,@1415 226,0,@833 267,0,@1378 308,0,@833 447,0,@833 495,0,@1302 539,0,@833 682,0,@1294 8092:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283129 8093:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17797| 8094:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74457842696e64283229 8095:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17798|64,0,@883 8096:D4,384|483b65187303ff5548488b08488b5808f6c30174064883eb027105ff5570ebf5ff710852ff70084c8b4a104c8b4208488b019090ff155e01000059f6c10174064883e9027105ff5570ebf5488b1424504889cb488b442410488b5208ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8387107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390909090909000000000000000007801000000000000|@8098,2097151,@17799,@8097|147,0,@833 188,0,@1302 229,0,@833 344,0,@1294 8097:D19,2384|483b65187303ff5548f60001754a488b08488b1148833a337555f64208017554488b7208f6460801755e488b7e0848837f08017558488379080175564883781003756e4c8b48084989da41f6c20174064983ea02710ceb05e9cd020000ff5570ebeeff701853ff37415041ff31eb0ae9b6020000e9b10200004c89d3488b064c89c29090ff12eb0fe99d020000e998020000e993020000498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e9740200005a4889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13488b542410f6c20174064883ea027105ff5570ebf550514889d3488b442418488b542410909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c41048890158a80174064883e8027105ff5570ebf5f6042401756e488b14245150488b029090ff158e0700004889c648c7c001000000ff158607000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff1566070000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb05e971000000488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb0848c7c001000000514883f8017506488b0424eb0d4889c3488b0424ff15b20600004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c410c3f600017555488b08488b1148833a337559f64208017558488b7208f64608017567488b7e0848837f080175614883781003755f4c8b50084989db41f6c30174064983eb027105ff5570ebf5534150ff70184151ff7108ff37eb05e97503000041ff324c89db488b06eb0ae965030000e9600300004c89c2909090ff12498d4fe8483b4d107314eb0fe947030000e942030000e93d030000ff55404989cf48c741f8020000005a4889510848c70107000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff13488b542428f6c20174064883ea027105ff5570ebf550514889d3488b442410488b542430909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b01b07c9a37f0000488901488b442420a80174064883e8027105ff5570ebf5514c8b4c24104989c048bb509adc0000000000488b44240890ff1526040000488b4c2428f6c10174064883e9047105ff5570ebf5f644241801756d488b5424185051488b02ff15020400004889c648c7c001000000ff15fa03000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff15da030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb05e971000000488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb0b4889c148c7c001000000514883f8017506488b0424eb0e4889c3488b042490ff15220300004883f8017507488b442408eb0f4889c3488b44240890ff150e0300004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c438c3488b4808498d57e8483b55107303ff55404989d748c742f802000000488b314889720848c70207000000f6c2017418488b78184c8b0048b8f86f07c9a37f0000488b5d0890ff13498d7fe8483b7d107303ff55404989ff48c747f80200000049b8201d08c9a37f00004c8947084889174889daf6c20174064883ea027105ff5570ebf55357ff70184989d048bb509adc0000000000488b104889d0909090ff1516020000488b4c2410f6c10174064883e9047105ff5570ebf5f6042401756e488b14245051488b029090ff15f20100004889c648c7c001000000ff15ea01000049c7c20100000049b9381c08c9a37f00004989c05b4889f048ba40a507c9a37f0000ff15ca010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb05e971000000488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908eb0b4889c148c7c001000000514883f8017506488b0424eb0e4889c3488b042490ff15120100004883f8017507488b442410eb0f4889c3488b44241090ff15fe0000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c420c3909000000000000000004809000000000000|@8100,2097151,@17800,@8004,@1323,@1416,@8101,@8038,@8004,@1323,@1416,@8102,@8103,@8038,@8004,@1323,@1416,@8104,@8099|204,0,@1294 315,0,@833 388,0,@833 499,0,@1615 516,0,@1415 590,0,@833 631,0,@2099 672,0,@833 789,0,@1294 997,0,@1294 1080,0,@883 1125,0,@833 1198,0,@833 1275,0,@884 1316,0,@835 1358,0,I48 1447,0,@1615 1464,0,@1415 1538,0,@833 1579,0,@2099 1620,0,@833 1769,0,@1294 1846,0,@1294 1887,0,@1621 1931,0,I48 2023,0,@1615 2040,0,@1415 2114,0,@833 2155,0,@2099 2196,0,@833 2345,0,@1294 8098:S51|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74436c61757365283129 8099:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17805| 8100:S48|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e74446563283229 8101:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17801| 8102:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17802| 8103:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17803| 8104:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17804| 8105:D4,168|483b65187303ff5548488b08488b5808f6c30174064883eb027105ff5570ebf54c8b4a084989d848c7c3f9000000488b41089090ff15860000004889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c39090909090900000000000000000a000000000000000|@8106,1048575,@17806,@8038|129,0,@1294 8106:S53|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e746676616c62696e64283129 8107:D5,984|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8008e07c9a37f0000c3a801756848837808017566488b084c8b51184d89c34989dc48bbb89709c9a37f0000488b01ff159e030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1341f6c401eb0ae924030000e9f300000074064983ec027105ff5570ebf5514c89e34c89d04c89daff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b084d89c24989db4c8b60084c8b691848bbb89709c9a37f0000488b019090ff1542020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134c89d8a80174064883e8027105ff5570ebf5415241534154514889c34c89e84c89d290ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba30d007c9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2408f6c10174064883e9027105ff5570ebf5504c8b4424184889cb488b44240890e892fcffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909090900000000000000000d003000000000000|@8108,1048575,@17807,@100,@100|30,0,@1374 65,0,@2540 124,0,@1294 235,0,@833 346,0,@1294 419,0,@2540 480,0,@1294 587,0,@833 698,0,@1294 739,0,@1466 822,0,@1294 908,0,@833 8108:S54|5052494e545f50415253455452454528292e646973706c6179506172736574726565283229646973706c61795265634c697374283229 8109:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17808| 8110:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b858370ac9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17809|64,0,@3029 8111:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17810|64,0,@2119 8112:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17811| 8113:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17812| 8114:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8782b07c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17813|64,0,@883 8115:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17816| 8116:S52|5052494e545f50415253455452454528292e646973706c61795061727365747265652832297072696e7456616c42696e64283229 8117:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17815| 8118:O2|@8119,@8026 8119:D3,376|483b65187303ff5548488b08488b5808f6c30174064883eb027105ff5570ebf5ff3152ff7008488b4108488b72084889f2909090ff1259f6c10174064883e9027105ff5570ebf5488b1424504889cb488b442410488b5208ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8908f18c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c3909000000000000000007001000000000000|@8121,1048575,@17817|143,0,@833 184,0,@8120 225,0,@833 340,0,@1294 8120:O2|3,@7903 8121:S33|5052494e545f50415253455452454528292e646973706c61794d61746368283129 8122:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@8123,1048575,@17818| 8123:S37|5052494e545f50415253455452454528292e646973706c6179506172736574726565283129 8124:O2|3,@7924 8125:O2|@1303,@1621 8126:O1|@8127 8127:D3,88|488b00488b08498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000005000000000000000|@8128,3,@17819|50,0,@1294 8128:S31|5349474e41545552455328292e646973706c61795370656373283229283129 8129:O2|3,@7873 8130:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17822| 8131:S28|5349474e41545552455328292e646973706c61795370656373283229 8132:D3,440|483b65187303ff5548488b08488b5918498d77e8483b75107303ff55404989f748c746f802000000488b790848897e0848c7060700000040f6c60174144c8b400848b8f86f07c9a37f0000488b5d08ff1348837b0801750c49b8f80c18c9a37f0000eb0a49b8089418c9a37f00004d8d4fe84c3b4d107303ff55404d89cf49c741f8020000004d89410849c7010700000041f6c10174164c8b400848b8f86f07c9a37f0000488b5d089090ff134c8b400841f6c00174064983e8027105ff5570ebf55641514c8b134c89c34c89d0488b52089090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47b8483b45107303ff55404989c748c740f80200000048894808594889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c39090909090900000000000000000b001000000000000|@8134,1048575,@17821|67,0,@1294 90,0,@7997 102,0,@8133 157,0,@1294 267,0,@833 401,0,@1294 8133:S3|203a3e 8134:S46|5349474e41545552455328292e646973706c61795370656373283229646973706c61795369677342696e64283129 8135:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@8136,1048575,@17823| 8136:S27|5349474e41545552455328292e646973706c617953696773283129 8137:O2|@8139,@8138 8138:O2|@8148,@8147 8139:D10,1528|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488338057570488b48084889de40f6c60174064883ee027105ff5570ebf5ff710853ff7110524889f3488b019090e8a6ffffff48837c240801750c48b9f80c18c9a37f0000eb0a48b9089418c9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70207000000eb05e91c010000f6c20174164889c148b8f86f07c9a37f0000488b5d08909090ff134883c41059f6c10174064883e9027105ff5570ebf550524889cb488b44241048ba100d18c9a37f00009090ff1522050000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47b8483b45107303ff55404989c748c740f80200000048894808594883c4084889084889c1488d401848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c34883380375744889d9f6c10174064883e9027105ff5570ebf55352ff70084989c949c7c077000000488b5810488b42089090ff1522040000488b4c2410f6c10174064883e9027105ff5570ebf5504889cb488b442408488b542410e8e2fdffff498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e94901000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f8280ac9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f000048890890ff15620300004883f8017506488b0424eb104889c3488b0424909090ff154e030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c420488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b928290ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3488338017570488b48084989da4989d34c8b2148c7c351000000488b4108ff1586020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134153514c89d34c89e04c89dae80afcffff498d4fe8eb05e9c5000000483b4d107303ff55404989cf48c741f80200000048ba782b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c348833807756d4989d949b8509adc0000000000488b5808488b4208909090ff154e0100009090ff154e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e96400000048b9709b18c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080300000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3488b4808498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c39090909090900000000000000000f005000000000000|@8142,2097151,@17824,@8000,@8143,@8145,@8146,@100,@8143,@8141|30,0,@819 100,0,@7997 112,0,@8133 172,0,@1294 222,0,@7998 291,0,@833 429,0,@1294 602,0,@833 643,0,@3008 684,0,@833 760,0,@833 805,0,@3010 887,0,@1294 980,0,@1294 1047,0,@883 1092,0,@884 1207,0,@1294 1233,0,I48 1296,0,@833 1344,0,@8140 1426,0,@1294 1490,0,@1294 8140:O2|3,@7929 8141:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17828|64,0,@2119 8142:S35|535452554354555245535f28292e646973706c617953747275637456616c7565283229 8143:D3,696|483b65187303ff5548f6c301756348837b0801756141f6c10174084983f9017f14eb0741f641ff10740b48b8008e07c9a37f0000c34889c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b1b4889184889ca909090ff124889c1498d47e8483b4510730feb0ae92a020000e91a000000ff55404989c748c740f80200000048c7400801000000488908c341f6c10174084983f9017f14eb0741f641ff10740b48b8008e07c9a37f0000c34983f85974184983f877740948c7c101000000eb1048c7c103000000eb0748c7c1030000004883f1024889c2498d47e8483b45107303ff55404989c748c740f8020000004c894808488b334889304151524150ff730851ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70103000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57e8483b55107303ff55404989d748c742f802000000488b5c240848895a0848c70207000000f6c20174134889c648b8f86f07c9a37f0000488b5d08ff13498d7788483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f8020000004889720848890a488d4a1848c741f80200000048895108488901488d411848c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2418f6c10174064883e9027105ff5570ebf5504989c94989d8488b5c2408488b4424189090e8aefdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c30000000000000000b002000000000000|@8144,1048575,@17825|44,0,@1374 172,0,@1374 324,0,@1294 391,0,@1294 534,0,@1294 624,0,@833 8144:S28|535452554354555245535f28292e646973706c61794c697374283429 8145:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17826|64,0,@2119 8146:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17827| 8147:O3|@8150,@8138,@8137 8148:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@8149,1048575,@17829| 8149:S30|535452554354555245535f28292e646973706c6179537472756374283129 8150:D11,672|483b65187303ff5548f6c30174084883fb017f13eb06f643ff10740b48b8901607c9a37f0000c3488338017524f6c30174064883eb027105ff5570ebf5488b400848ba682b18c9a37f0000ff25670200004883380375714889d9f6c10174064883e9027105ff5570ebf553ff7008524989c949c7c077000000488b5810488b4208909090ff1536020000488b4c2410f6c10174064883e9027105ff5570ebf5488b1424504989c949c7c077000000488b5c2410488b420890ff150a0200009090ff150a020000eb05e9ed0000004883f801750c48b8606718c9a37f0000eb134889c348b8606718c9a37f0000ff15e60100004883f8017506488b0424eb104889c3488b0424909090ff15d2010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c420488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b910a418c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3ff7210ff35250100004989d949b8f80f0dc9a37f0000488b58104889e090ff1512010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e0c908c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c390909090909000000000000000009802000000000000|@8153,2097151,@17830,@8028,@8143,@8143,@8154,@8155,@8156,@8152,@8143|30,0,@819 67,0,@8026 213,0,@8064 228,0,@8064 300,0,@833 345,0,@8151 427,0,@1294 456,0,@3959 508,0,@833 553,0,@2100 635,0,@1294 8151:O2|3,@7917 8152:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@8159,2097151,@17834,@8157| 8153:S30|535452554354555245535f28292e646973706c6179537472756374283229 8154:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b848d208c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@17831|64,0,@2119 8155:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17832| 8156:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17833| 8157:D5,776|483b65187303ff55486a016a014883782003755e488b4810488339057554488b5108498d77d0483b75107303ff55404989f748c746f803000000488b7a1848897e104c8b4a104c894e084c8b52084c89164c8d5e2049c743f8010000004989334889e64c891e4889e64c8b1a4c895e08eb154889e148c701010000004889e1488b501048895108498d4fe8483b4d107303ff55404989cf48c741f802000000488b40084889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13f60424017569488b0424488b1048837a0801750c48bef80c18c9a37f0000eb0a48be089418c9a37f0000498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848c7070700000040f6c701741148b8f86f07c9a37f0000488b5d0890ff134889de40f6c601740deb05e98b0000004883ee027105ff5570ebf551415053574889f3488b0248ba100d18c9a37f0000909090ff15be010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901eb0e4889c848c7c1010000005041505358a80174064883e8027105ff5570ebf5514889c3488b442420488b542408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880a918c9a37f00004889014883f9017506488b0424eb0f4889cb488b04249090ff15b2000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084883c410584883c410488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000000003000000000000|@8161,2097151,@17835,@8000,@8160|181,0,@1294 219,0,@7997 231,0,@8133 282,0,@1294 337,0,@7998 407,0,@833 551,0,@833 592,0,@8158 738,0,@1294 8158:O2|3,@2540 8159:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283129 8160:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17836| 8161:S50|535452554354555245535f28292e646973706c6179537472756374283229646973706c617953747275637442696e64283229 8162:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283129 8163:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17840| 8164:S49|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617946756e637442696e64283229 8165:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17839| 8166:O1|@8167 8167:D5,344|483b65187303ff5548488b084c8b51204c8b580848bbb89709c9a37f0000488b41089090ff1546010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff1341f6c30174064983eb027105ff5570ebf5514c89db4c89d048ba100d18c9a37f000090ff15ea000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000005001000000000000|@8168,2097151,@17841,@100,@8000|22,0,@2540 84,0,@1294 127,0,@7998 195,0,@833 306,0,@1294 8168:S47|535452554354555245535f28292e646973706c6179546f70446563283229646973706c617953696742696e64283129 8169:S30|535452554354555245535f28292e646973706c6179546f70446563283129 8170:S30|535452554354555245535f28292e646973706c6179546f70446563283229 8171:O2|@8172,@20167 8172:D9,1032|488dbc24e8feffff483b7d187303ff55506a016a016a014989d14989da4c8b184889e348c7c0010000009090ff15ee030000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b54240848895008488b1c244889186a016a016a014989c44889e348c7c0010000009090ff15aa0300006a016a016a014889e348c7c0010000009090ff159a030000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b542408488950085b4889186a016a016a014989c54889e348c7c00100000090ff155a0300006a016a016a014889e348c7c0010000009090ff154a030000498d47e0483b45107303ff55404989c748c740f80300000048b9f0b218c9a37f00004883c408488908498b483048894808488b54246048895010488060ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be60b318c9a37f0000488933498b704048897308488b7c244848897b10488063ffbf4d8d77e04c3b75107303ff55404d89f749c746f80300000048bad0b318c9a37f0000498916498b506049895608488b7c243049897e10498066ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000048b940b418c9a37f000048890f498b482848894f08488b74242048897710488067ffbf498d77e0483b75107303ff55404989f748c746f80300000048bab0b418c9a37f0000488916498b505848895608488b4c240848894e10488066ffbf498d4fe0483b4d107303ff55404989cf48c741f80300000048ba20b518c9a37f00004889114c894108488b54245048895110488061ffbf498d5790483b55107303ff55404989d748c742f80d0000004c897260488972584c8b7424284c89725048894a4848895a40488b0c2448894a384889423048897a28498b402048894220488b5c244048895a18488b5c245848895a10488b5c241848895a0849be70b718c9a37f00004c89324d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c70601000000498d5fe8483b5d107303ff55404989df48c743f80200000048b9f8b718c9a37f000048890b4c897308488063ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048b8a8b818c9a37f00004889014c897108488061ffbf52ff742420ff74247041ff7030ff74246841ff7040ff74246041ff7060ffb424900000004150ffb424a8000000ffb4249800000041ff702057ff742470ffb424a00000005641ff710853415441554c89d04989ca4d89f14989c048c7c3010000004c89d8909090ff1592000000498d47e8483b45107303ff55404989c748c740f80200000048b958bb18c9a37f00004883c450488908488b4c241048894808488060ffbf5a4883c410ff229090909000000000000000000004000000000000|@9887,2097151,@18583,@8796,@8796,@8796,@8796,@8796,@8197|272,0,@8173 335,0,@8174 394,0,@8175 453,0,@8176 512,0,@8177 571,0,@8178 702,0,@8183 775,0,@8186 821,0,@8188 976,0,@8192 8173:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17844| 8174:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17845| 8175:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17846| 8176:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17847| 8177:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17848| 8178:D4,176|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bb00b618c9a37f000048891848894808488060ffbf5251488b5a104889da9090ff1258488b00488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252c000000909090900000000000000000a800000000000000|@8182,1048575,@17850,@8181|73,0,@8179 8179:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8180,15,@17849| 8180:S48|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d65732831295f2d283129 8181:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17851| 8182:S43|535452554354555245535f28292e706173733253747275637473283329616c6c56616c4e616d6573283129 8183:O1|@8184 8184:D3,24|48c7c001000000c300000000000000001000000000000000|@8185,1,@17852| 8185:S36|535452554354555245535f28292e706173733253747275637473283329656e762d283129 8186:D3,72|488b5208488b1248c7c001000000f6c201751ea80174064883c0027105ff5570ebf5488b5208483b65187303ff5548ebddc390909090909000000000000000004000000000000000|@8187,5,@17853| 8187:S48|535452554354555245535f28292e706173733253747275637473283329746f704c6576656c49644e756d626572283129 8188:D3,384|488b5208488b1248c7c001000000f6c2017534498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b024889014889c8488b5208483b65187303ff5548ebc74883f801750c48b8909adc0000000000eb6f48c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0de50000007d08eb1af641ff1075144889c248b818930ec9a37f0000488b5d0890ff134889c248c7c001000000488d3c8d0400000048f7dfeb05e9620000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f84889c1498d47e8483b45107303ff55404989c748c740f80200000048ba50ba18c9a37f000048891048894808488060ffbfc39090909090909000000000000000007001000000000000ffffffffffffff01|@8191,39,@17855|79,0,I49 162,0,@4361 332,0,@8189 8189:D3,80|a801741c488b5a0848b9ffffffffffffff0048234bf8488d4c0901483bc172154889c148b8b0df06c9a37f0000488b5d089090ff13488b4483fcc3909090909000000000000000004800000000000000|@8190,15,@17854|10,0,36028797018963967 37,0,@560 8190:S52|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129283129 8191:S49|535452554354555245535f28292e7061737332537472756374732833296d616b65546f704c6576656c4964456e76283129 8192:D5,216|483b65187303ff5548ff7008488b00488b520890ff12a801751b488b08f64128017512488b5128488b1a488b730848c70603000000488b0424f64030017570488b48306a016a01ff314c8d44240848bb68bc18c9a37f0000488b48184889c890ff158a000000488b44241090ff1586000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c2408488908594883c41048890148c7c0010000004883c408eb05e901000000c348c7c0010000004883c408c3909090909090900000000000000000d000000000000000|@8196,2097151,@17857,@1382,@8195|80,0,@8193 8193:O1|@8194 8194:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17856| 8195:D3,208|483b65187303ff5548a801756d488b08488b5108488b5a084883e3094883fb01740948c7c301000000eb0748c7c3030000004883f302488b72084883e6034883fe01740948c7c601000000eb0748c7c6030000004883f602498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f08eb05e937000000488b1948891f57488b70084889f0e86effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000c800000000000000|@1363,63,@17858| 8196:S32|535452554354555245535f28292e706173733253747275637473283329283129 8197:D9,2720|488dbc24b0feffff483b7d187303ff5550a8017565488b08488339037561415241514150ff7008ff7108ff7110ff30f6c3017570488b03488b08488b5008498d47e8483b45107303ff55404989c748c740f80200000048bed8c818c9a37f0000488930488b74242048897008488060ffbfff730852488b11eb0ae961090000e9d0020000ff1258488b08498d47e8483b45107303ff55404989c748c740f802000000eb05e93000000048ba50d818c9a37f0000488910488b54242848895008488060ffbf4889ca90ff125b483b65187303ff5548e956ffffff48c7c001000000498d47d8483b45107303ff55404989c748c740f80400000048b950db18c9a37f00004889085948894808488b4c2418488948105a48895018488060ffbf6a016a016a014889e39090ff158a090000488b442430488b0048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c85048c7c001000000488b542440ff12488b4c242050f6c1017545488b01ff7108ff742410ff742410ffb42410010000ff742458ff7424404c8b50204c8b48184c8b4010488b5808488b084889c8ff150a09000059483b65187303ff5548ebb6488b8424f00000004883c4105a4883c41890ff12488b8424c8000000488b8c24c0000000488b9424b8000000488b9c24b0000000488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b742468488984240801000048898c240001000048899424f800000048899c24f00000004889b424e80000004889bc24e00000004c898424d80000004c898c24d00000004c899424c80000004c899c24c00000004c89a424b80000004c89ac24b0000000488b44243848898424a8000000488b44243048898424a0000000488b4424284889842498000000488b4424204889842490000000488b4424184889842488000000488b4424104889842480000000488b4424084889442478584883c43848894424304c897424284c8b5424184c8b4c24104c8b44240848c7c301000000584883c418e9acfcffff48833901756c415241514150ff7008ff30ff7108ff7110f6c301755b488b03488b08488b5008498d47e8483b45107303ff55404989c748c740f80200000048be18e018c9a37f0000488930488b74242048897008488060ffbfff730852488b11ff1258488b08498d47e8483b4510730feb0ae961030000e93d000000ff55404989c748c740f80200000048ba88e018c9a37f0000488910488b54242848895008488060ffbf4889caff125b483b65187303ff5548e95effffff48c7c001000000498d47d8483b45107303ff55404989c748c740f80400000048b900e118c9a37f0000488908488b4c241048894808488b4c2420488948105a48895018488060ffbf6a016a016a014889e39090ff1562060000488b442438488b0048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c85048c7c001000000488b542448ff12488b4c242050f6c1017572488b01ff7108ff7028ff7030ff7038ff7040ff7048ff7050ff7058ff742448ff742448ffb42450010000ffb42498000000ffb42450010000ffb42450010000ffb42450010000ffb42450010000ffb42450010000ffb42450010000ffb42450010000ffb42450010000ffb42498010000eb05e96d000000ffb42458010000ffb42458010000ffb42458010000ffb42458010000ffb42458010000ffb42458010000ffb42458010000ffb42458010000ffb424000100004c8b50204c8b48184c8b4010488b5808488b084889c8909090ff154605000059483b65187303ff5548e917ffffff488b8424900000004883c4105a4883c4209090ff12488b8424c8000000488b8c24c0000000488b9424b8000000488b9c24b0000000488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b74246841564c8b742468488984240801000048898c240001000048899424f800000048899c24f00000004889b424e80000004889bc24e00000004c898424d80000004c898c24d00000004c899424c80000004c899c24c00000004c89a424b80000004c89ac24b0000000488b44243848898424a8000000488b44243048898424a0000000488b4424284889842498000000488b4424204889842490000000488b4424184889842488000000488b4424104889842480000000488b4424084889442478584883c43848894424304c897424284c8b5424184c8b4c24104c8b44240848c7c301000000584883c418e9d4f8ffff498d57e0483b55107303ff55404989d748c742f80300000048bed0e218c9a37f0000488932488b7110488972084c894a10488062ffbf498d7fb8483b7d107303ff55404989ff48c747f80200000048c74708010000004c8b59084c891f4d8b60504d8b24244d8b68284d8b6d004d8b70784d8b364d8b58704d8b1b488d4f1848c741f8050000004c8971204c8959184c8961104c896908498b7030488931415241514150ff700853415051ff35fb020000ff7424604c8b9424f00000004c8b4c24404c8b4424604889d34889f848ba58e718c9a37f000090ff15d6020000488b442410488b4818488b094883f901740948c7c101000000eb43498d4fd0483b4d107303ff55404989cf48c741f802000000488b54243048895108488b5c24384889194889ce488d491848c741f802000000488b3c2448897908488931488b9424d00000004883c408488b9c24c0000000488bb424b8000000488bbc24b00000004c8b8424a80000004c8b8c24a00000004c8b9424980000004c8b9c24900000004c8ba424880000004c8bac24800000004c8b742478488b44247051488b4c247051488b4c247051488b4c247051488b4c247051488b4c247051488b4c247051488b4c247051488b4c247051488b4c2470488994241001000048899c24080100004889b424000100004889bc24f80000004c898424f00000004c898c24e80000004c899424e00000004c899c24d80000004c89a424d00000004c89ac24c80000004c89b424c000000048898424b8000000488b44243848898424b0000000488b44243048898424a8000000488b44242848898424a0000000488b4424204889842498000000488b4424184889842490000000488b4424104889842488000000488b4424084889842480000000584883c438488944243848894c24304c8b5424204c8b4c24184c8b4424105b584883c418e920f6ffff4150f6c301756f488b03488b08488b5008498d47e8483b45107303ff55404989c748c740f80200000048be00781dc9a37f0000488930488b342448897008488060ffbfff730852488b119090ff1258488b08498d47e8483b45107303ff55404989c748c740f80200000048ba70781dc9a37f0000eb05e926000000488910488b54240848895008488060ffbf4889ca90ff125b483b65187303ff5548e961ffffff48c7c0010000004883c408c2a800900000000000000000980a000000000000|@9922,2097151,@18605,@8510,@9923,@8510,@9888,I48,@8250|88,0,@8198 171,0,@8224 250,0,@8229 916,0,@8237 992,0,@8238 1070,0,@8239 1862,0,@8242 2043,0,@8248 2571,0,@9885 2636,0,@9886 8198:D4,64|483b65187303ff5548488b480849b948c918c9a37f00004c8b4208488b5918488b304889f0ff252d000000909090909000000000000000003800000000000000|@8222,1048575,@17866,@8208|15,0,@8199 8199:O2|@8200,@2164 8200:D7,504|483b65187303ff55484889d348c7c00100000090ff15f6010000535048bba0cb18c9a37f000048c7c005000000909090ff15e2010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120584889411848c741100100000048b8f8cb18c9a37f00004889410848b858cd06c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b0c24488d501848c742f80200000048c7420801000000488b49084883c40848890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848ba20cc18c9a37f0000488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b958cd06c9a37f000048890a4889c34889d0ff15ea000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048ba60cc18c9a37f000048895008488908498d4fc8483b4d107303ff55404989cf48c741f80200000048894108488919488d411848c740f80300000048c74010010000004889480848c7001d000000f6c1017406ff2547000000c39090909090900000000000000000f001000000000000|@8207,1048575,@17860,@2259,@1354,@2166,@2211|30,0,@8201 121,0,@8203 135,0,@442 246,0,@8204 287,0,@442 344,0,@8205 393,0,@8206 8201:O1|@8202 8202:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@17859|2,0,@441 8203:S21|636f6465466f72556e6971756549642d657175616c 8204:O3|2,64,0 8205:O3|2,I11,0 8206:O2|@775,@434 8207:S31|545950454944434f444528292e636f6465466f72556e697175654964283129 8208:D4,168|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d0483b55107303ff55404989d748c742f80500000048be80cd18c9a37f000048893248894a084c8942104c894a1848894220488062ffbf4889d0909090ff154e0000004889c14889d84889ca90ff124889c148c7c0010000004889ca90ff1248c7c001000000c390900000000000000000a000000000000000|@8223,1048575,@17867,@1687|70,0,@8209 8209:D3,104|4889c1498d47c8483b45107303ff55404989c748c740f80600000048bb10ce18c9a37f000048891848894808488b4a0848894810488b5a1048895818488b721848897020488b7a2048897828488060ffbfc390909090909000000000000000006000000000000000|@8221,63,@17865|29,0,@8210 8210:D4,64|483b65187303ff5548488b4a28488b1c2448890c244c8b52204c8b4a184c8b42104889de488b5a0856ff25290000009000000000000000003800000000000000|@8216,2097151,@17861,@8211| 8211:D8,1056|483b65187303ff554848833b0d7555488b4308488b00488338037561488b431048c1e8034883c801a80174084883f8017d37eb06f640ff10742fff73084151ff7310415241504889c348b810c506c9a37f000048bad0a8dc0000000000909090ff12eb11e996030000ff73084151ff7310415241504883f8037569eb0eff73084151ff731041524150eb5e488b0424488b009090ff159e0300004889c348c7c0bf000000ff1596030000488b0c24488b09f6c10174064883c1027105ff5570ebf5488b142448890a488b4c2418488b5150488b12488b5928488b1b488b7178488b36eb0ae908030000e903030000488b7970488b3f4d8d47b04c3b45107303ff55404d89c749c740f80500000049897020498978184989501049895808488b5130498910498d583048c743f80300000048bef0d218c9a37f0000488973104c8943084889035041505348c7c001000000488b542420909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b4424284883e0094883f801740948c7c001000000eb0748c7c0030000004883f002498d57f0483b55107303ff55404989d748c742f801000000c642ff40488902498d47a0483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889500848c70003000000488d502848c742f8030000005b48895a104889420848890a488d422048c740f802000000594889480848c70001000000498d8f50ffffff483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8030000004889501048894808488b0c24488908488d502048c742f80500000048c74220010000004889421848894a1048c742080100000048c7020b000000488b4424204883c408488b4850488b09488b5828488b1b488b7078488b36488b7870488b3f4c8d423049c740f80500000049897020498978184989481049895808488b4830498908498d583048c743f80200000048be28d318c9a37f000048897308488b742430488933498d47e8483b45107303ff55404989c748c740f8020000004889580848b998d318c9a37f00004889084989d24d89c390ff151a0100004152415348bb80ce17c9a37f0000ff150e0100009090ff150e010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70001000000488b4c2420488b51609090ff12488b4424285948890848c7c0010000004883c428c2080048c7c0010000004883c428c2080048c7c001000000c208009090909090909000000000000000001804000000000000|@8218,2097151,@17862,@8219,@100,@109,@7855,@8217|75,0,@376 85,0,I106 306,0,@8212 740,0,@8213 790,0,@8215 820,0,@7849 908,0,@1294 8212:S38|436f6e73747275637465642066726f6d206120667265652074797065207661726961626c652e 8213:O2|@8214,0 8214:S65|2920636f6e7461696e73206120667265652074797065207661726961626c652e2053657474696e6720697420746f206120756e69717565206d6f6e6f747970652e 8215:S13|5468652074797065206f662028 8216:S56|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129283129 8217:D3,312|483b65187303ff5548a801756948837808017567498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb0ae99d000000e901000000c3498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000f6c1017415488b500848b8f86f07c9a37f0000488b5d0890ff1351488b50084889d0e832ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b878d017c9a37f0000c3909090909000000000000000003001000000000000|@7859,7,@17864|65,0,@1294 178,0,@1294 236,0,@833 282,0,@7853 8218:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283229 8219:D4,360|483b65187303ff5548a80174084883f8357c65eb06f640ff107562a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f90374134889c1f6c10174064883e9327108ff5570ebf54889c15048c7c3350000004889c848ba90a9dc00000000009090ff12a8017412eb0ae917000000e9120000004883e8027105ff5570ebf5e86effffffeb0e4889c148b8509adc0000000000515048c7c335000000488b44240848bad0a9dc0000000000909090ff124883f8017437a80174084883f8017d11eb06f640ff10740948c7c101000000eb0748c7c1030000004883f903740fa80174064883c0347105ff5570ebf5a80174094881c0c20000007105ff5570ebf2a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1deb06f640ff1075154889c148b8f83b06c9a37f0000488b5d089090ff134889c3584883c408ff25290000009000000000000000006001000000000000|@8220,2097151,@17863,@100|102,0,I109 153,0,I48 177,0,I110 313,0,@95 8220:S50|545950455f5452454528292e636865636b466f7246726565547970655661726961626c657328342967656e4e616d65283129 8221:S53|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429636865636b5479706573283129 8222:S49|535452554354555245535f28292e706173733253747275637473283329636865636b5661726961626c6573283229283129 8223:S40|545950455f5452454528292e636865636b466f7246726565547970655661726961626c6573283429 8224:D5,64|483b65187303ff55484989d24c8b580848c7c35d000000488b009090ff15360000004d8b4208498b5b10ff253000000000000000000000003800000000000000|@8222,1048575,@17868,@100,@8225| 8225:D5,64|483b65187303ff5548504150ff35460000004989e0488b0348c7c30100000090ff153a0000004883c418c3909090909000000000000000003800000000000000|@8228,1048575,@17869,@8226,@1532| 8226:D11,320|483b65187303ff55485052f6c3017569488b03488b08483b0d3b010000755f488b14244c8b53084989c3488b5c2408488b421090ff152601000048c7c35d000000909090ff151e010000498b0b483b0d1c01000074134889c248b878e107c9a37f0000488b5d08ff13498b5310488b1c2441524c8b4308eb0ae9a7000000e915000000488b5a1048bae8da18c9a37f0000909090ff12eb6c488b10483b15d60000007565488b34244c8b53084989c3488b5c2408488b4610ff15c2000000498b0b483b0dc000000074134889c248b878e107c9a37f0000488b5d08ff13498b5310488b1c24415249b948c918c9a37f00004c8b4308488b5a18909090ff158e000000eb0fe90a00000048c7c001000000ff73084989c05b483b65187303ff5548e9e6feffff4c89c04883c410c390909000000000000000003801000000000000|@1538,1048575,@17870,@20058,@100,@100,@20058,@20043,@100,@20043,@8208|91,0,@1486 137,0,@8227 207,0,@1486 233,0,@8199 8227:O1|@8225 8228:S66|535452554354555245535f28292e706173733253747275637473283329636865636b537472756374536967466f7246726565547970655661726961626c6573283229 8229:D7,280|483b65187303ff5548ff7208ff351e0100004989d24889c348b8b0dc18c9a37f00009090ff150e01000048bbd0dc18c9a37f0000ff1506010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff154a0000004883c410c3909090909000000000000000001001000000000000|@8233,1048575,@17871,@8234,@100,@100,@8232|26,0,@8230 44,0,@8231 100,0,@1294 206,0,@1294 8230:S10|5369676e617475726520 8231:S43|2068617320616c7265616479206265656e20626f756e6420696e2074686973206465636c61726174696f6e 8232:D7,424|483b65187303ff5548488b4868f6c101753e488b11488b32483b35a1010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01756948b998c809c9a37f0000f6c101753e488b11488b32483b354f010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751a4889c148b8c0cf09c9a37f0000eb05e930000000488b5d08ff13488b0f488b11483b15f200000074154889c648b878e107c9a37f0000488b5d089090ff13488b7110eb26488b0f488b11483b15d000000074134889c648b878e107c9a37f0000488b5d08ff13488b71105350415141524889f04c89c2909090ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542408488950185a4883c4084889501048894808488b4c2408488908488b14244883f901740b488b4a1848c70103000000488b52604883c410ff2290900000000000000000a001000000000000|@8236,1048575,@17873,@20131,@20131,@20131,@20131|95,0,@2635 188,0,@2690 229,0,@1486 271,0,@1486 8233:S51|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329 8234:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@8235,2097151,@17872,@7993| 8235:S54|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322973456e762d283329283129 8236:S29|535452554354555245535f28292e6572726f724d73674e656172283529 8237:D4,64|483b65187303ff5548488b480849b948c918c9a37f00004c8b4208488b5918488b304889f0ff252d000000909090909000000000000000003800000000000000|@8222,1048575,@17874,@8208|15,0,@8199 8238:D5,64|483b65187303ff55484989d24c8b580848c7c35d000000488b009090ff15360000004d8b4208498b5b10ff253000000000000000000000003800000000000000|@8222,1048575,@17875,@100,@8225| 8239:D7,280|483b65187303ff5548ff7208ff351e0100004989d24889c348b860e218c9a37f00009090ff150e01000048bbd0dc18c9a37f0000ff1506010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff154a0000004883c410c3909090909000000000000000001001000000000000|@8233,1048575,@17876,@8241,@100,@100,@8232|26,0,@8240 44,0,@8231 100,0,@1294 206,0,@1294 8240:S8|46756e63746f7220 8241:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@8235,2097151,@17877,@7993| 8242:D5,544|483b65187303ff5548488b4a10488b0948c7c301000000f6c101751ff6c30174064883c3027105ff5570ebf5488b4908483b65187303ff5548ebdc4889d94883780801746e498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c703ffffffff498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf10f608c9a37f000048893e498d7fa8483b7d107303ff55404989ff48c747f8030000004889771048895f08eb05e94400000048c70705000000488b5820488b70184c8b40104c8b08488d472048c740f80600000048895828488970204c89401848894810488978084c89084989d0ff153e010000eb6e498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c703ffffffff498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf10f608c9a37f000048893e498d7fa8483b7d107303ff55404989ff48c747f8030000004889771048895f08eb05e94300000048c70705000000488b5820488b70184c8b40104c8b08488d472048c740f80600000048895828488970204c89401848894810488978084c89084989d090ff158e000000498b4810488b09498d57e8483b55107303ff55404989d748c742f80200000048894a08488902498b4810488911498b5008488b12498d5fe8483b5d107303ff55404989df48c743f80200000048895308488903498b500848891ac390909000000000000000001802000000000000|@8244,255,@17878,@8245,@8243|134,0,@2150 317,0,@2150 8243:D3,136|498d4f98483b4d107303ff55404989cf48c741f802000000488b50184889510848c70101000000488d591848c743f805000000488b702048897320488b781048897b1848894b10488b0848894b0848c70301000000488b4828488b5008488d433048c740f8030000004889481048895808488910c390909000000000000000008000000000000000|@8247,63,@17880| 8244:S52|535452554354555245535f28292e7061737332537472756374732833297061737332546f704465632832296d616b654964283129 8245:D3,168|498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b5018488911498d5f98483b5d107303ff55404989df48c743f80200000048894b0848c70303000000488d4b1848c741f805000000488b702048897120488b78104889791848895910488b184889590848c70101000000488b5028488b5808488d413048c740f8030000004889501048894808488918c3909090900000000000000000a000000000000000|@8246,63,@17879| 8246:S40|5354525543545f56414c5328292e6d616b65426f756e644964576974684571557064617465283129 8247:S28|5354525543545f56414c5328292e6d616b65426f756e644964283129 8248:O2|@8250,@8249 8249:O2|@9305,@8248 8250:D6,264|483b65187303ff55485341504151415252a8017565488b08488339017526ff7008ff7424504c8b5424484c8b4c24304c8b442418488b5910488b4108ff15de000000eb68488339037542ff7008ff742428ff742428ff742428ff742468ff742468ff7424684c8b5424684c8b4c24384c8b442440488b5908eb05e966000000488b411090ff159e000000eb4a488b1424ff7008ff742428ff742448ff7208ff742450ff742440ff742440eb05e925000000ff7424404c8b9424800000004c8b8c24880000004c8b4118488b59104889c8ff155a00000058483b65187303ff5548e92cffffff48c7c0010000004883c428c22000909090909000000000000000000001000000000000|@8263,2097151,@17886,@8264,@9287,@8251| 8251:D7,832|488dbc2450ffffff483b7d187303ff5550498d4fd8483b4d107303ff55404989cf48c741f80400000048ba58ec18c9a37f0000488911488941084c8949104c895118488061ffbf6a016a016a014989da4889e34889c89090ff15fa020000498d47e0483b45107303ff55404989c748c740f80300000048b9d0ee18c9a37f00004889084c894008488b4c245048894810488060ffbf50415141f6c2017574498b024c8b58184c8b60084c8b284c8b70104c89e3488b442458ff15a202000048c7c35d000000909090ff159a0200006a016a016a016a016a016a0141ff7208415341544155ff742450415550488d44243850ffb424b80000004c8b9424a80000004c8b8c24b00000004c8b8424b8000000eb05e9fb010000488b9c24800000004c89f0488b9424c80000009090ff12498d47c8483b45107303ff55404989c748c740f806000000488b4c244848894828488b4c244048894820488b4c243848894818488b4c243048894810488b4c242848894808488b4c24204889085049b8a8ef18c9a37f000048c7c3010000004889c8ff15da010000498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848c70001000000488b4c24585048c7c001000000488b91800000009090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fa0483b5d107303ff55404989df48c743f803000000488953104889430848c70305000000488d432048c740f80400000048894818594883c4084889481048895808488b0c244889084889c2488d402848c740f8020000004889500848890852488b54246890ff12498d47f0483b45107303ff55404989c748c740f801000000594883c40848890859488901415a4883c430483b65187303ff5548e986fdffff488b4424304883c410488b48504889c85a4883c410594883c43851ff229000000000000000003803000000000000|@9304,1048575,@18352,@8510,@100,@100,@1532|43,0,@8252 120,0,@8257 382,0,@8259 613,0,@2150 8252:D7,280|483b65187303ff5548ff7208ff351e0100004989d24889c348b8b8ed18c9a37f00009090ff150e01000048bbd0dc18c9a37f0000ff1506010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff154a0000004883c410c3909090909000000000000000001001000000000000|@8255,1048575,@17881,@8254,@100,@100,@8232|26,0,@8253 44,0,@8231 100,0,@1294 206,0,@1294 8253:S10|53747275637475726520 8254:D4,48|483b65187303ff55484889c3488b420848ba60a018c9a37f0000ff252800000000000000000000002800000000000000|@8256,2097151,@17882,@8150|18,0,@8147 8255:S56|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329 8256:S59|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332973456e762d283329283129 8257:D3,96|483b65187303ff554852488b4a104889ca909090ff12488b0c24488b5108488b12498d5fe8483b5d107303ff55404989df48c743f80200000048895308488903488b49084883c408488919c39090909000000000000000005800000000000000|@8258,1048575,@17883| 8258:S61|535452554354555245535f28292e7061737332537472756374283829706173733253747275637475726544656328332963617074757265496473283129 8259:O1|@8260 8260:D7,288|483b65187303ff5548f6c301756b488b03488b08483b0d1d0100007561483b0d1c010000741348b878e107c9a37f0000488b5d08909090ff13488b5010f64228017512488b7228488b3e4c8b470849c70003000000f6423001756d488b72306a016a01ff7308ff364c8d44241048bb20f118c9a37f0000eb0ae98c000000e963000000488b421890ff15ba000000488b44241890ff15b6000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c241048890859488901eb05e90900000048c7c001000000eb1e48c7c0010000006a016a01ff7308eb0e48c7c0010000006a016a01ff73084989c05b4883c410483b65187303ff5548e9fffeffff4c89c0c3909000000000000000001801000000000000|@1538,2097151,@17885,@20043,@20043,@1382,@8195|40,0,@1486 111,0,@8261 8261:O1|@8262 8262:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17884| 8263:S28|535452554354555245535f28292e7061737332537472756374283829 8264:D4,424|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048ba78f318c9a37f0000488911488959084c894110488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048be18f518c9a37f000048893248895a084c894210488062ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf70f618c9a37f000048893e48895e084c894610488066ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049bbd0f718c9a37f00004c891f48895f084c894710488067ffbf498d9f70ffffff483b5d107303ff55404989df48c743f80d0000004d8b58604c895b604d8b60584c89635848897b50498b784848897b484d8b68404c896b404d8b70384c8973384d8b68304c896b304d8b68284c896b284d8b58204c895b204889531848894b10498b480848894b08488933488d537048c742f80300000048be28f918c9a37f00004889324c894a084c895210488062ffbf49baf0fa18c9a37f00004c8b4c24084989d84889d348ba88fb18c9a37f0000ff153200000048c7c001000000c208000000000000000000a001000000000000|@9286,2097151,@18339,@8281|35,0,@8265 85,0,@8268 135,0,@8270 185,0,@8272 337,0,@8274 363,0,@8276 384,0,@8279 8265:D4,168|483b65187303ff5548488b4a1052ff7008488b5110909090ff12488b442408488b4808488b09498d57e8483b55107303ff55404989d748c742f8020000005b48895a0848c70207000000498d5fe8483b5d107303ff55404989df48c743f80200000048c74308010000004889134883fb01740e4889c89090ff15420000004889c1488b0424488b40084883c40848890848c7c001000000c30000000000000000a000000000000000|@8267,1048575,@17887,@8266| 8266:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17888| 8267:S55|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296e6577456e762d283129 8268:D4,168|483b65187303ff5548488b4a1052ff7008488b5118909090ff12488b442408488b4808488b09498d57e8483b55107303ff55404989d748c742f8020000005b48895a0848c70205000000498d5fe8483b5d107303ff55404989df48c743f80200000048c74308010000004889134883fb01740e4889c89090ff15420000004889c1488b0424488b40084883c40848890848c7c001000000c30000000000000000a000000000000000|@8267,1048575,@17889,@8269| 8269:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17890| 8270:D4,176|483b65187303ff5548488b4a105250488b119090ff12488b442408488b4808488b09488b1424498d5fc8483b5d107303ff55404989df48c743f803000000488b72084883c40848897310488b3a48897b0848c703010000004c8d432049c740f80200000049c74008010000004989184983f80174104c89c34889c890ff15460000004889c1488b0424488b40084883c40848890848c7c001000000c3909090900000000000000000a800000000000000|@8267,1048575,@17891,@8271| 8271:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17892| 8272:D4,168|483b65187303ff5548488b4a1052ff7008488b5150909090ff12488b442408488b4808488b09498d57e8483b55107303ff55404989d748c742f8020000005b48895a0848c70203000000498d5fe8483b5d107303ff55404989df48c743f80200000048c74308010000004889134883fb01740e4889c89090ff15420000004889c1488b0424488b40084883c40848890848c7c001000000c30000000000000000a000000000000000|@8267,1048575,@17893,@8273| 8273:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17894| 8274:D5,328|483b65187303ff5548498b480848833903756d48c7c601000000498b3840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda4989da4989c34989f44d8b69104d8b7108ff7208498b19488b42109090ff15fa000000498d4fb0483b4d107303ff55404989cf48c741f803000000eb05e9310000004c8969104c897108488901488d412048c740f805000000488948204c8950184c89581048c74008030000004c89205aff224989ca4d8b184d8b61104d8b6908498b19488b421090ff1596000000498d4fa0483b4d107303ff55404989cf48c741f8030000004c8961104c896908488901488d412048c740f8030000004c8950104c89580848c700050000004889c2488d402048c740f803000000488948104889500848b908f206c9a37f0000488908c390909000000000000000004001000000000000|@8275,1048575,@17895,@100,@100|297,0,@661 8275:S54|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832296d616b654964283429 8276:O1|@8277 8277:D3,24|48c7c001000000c300000000000000001000000000000000|@8278,1,@17896| 8278:S50|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e2832295f2d283129 8279:O2|@8281,@8280 8280:O5|@8943,@9277,@20179,@20180,@20173 8281:D4,216|483b65187303ff5548498d4f88483b4d107303ff55404989cf48c741f80e000000498b70604889716848bfd8fc18c9a37f000048897960498b7858488979584d8b58504c8959504d8b60484c8961484d8b68404c8969404d8b70384c8971384d8b68304c8969304d8b68284c896928498b702048897120498b7018488971184d8b68104c896910498b7808488979084d8b284c8929488b34244c890c24534152ff72084989c24989c14989c848c7c30100000048c7c00300000056ff252f000000909090909090900000000000000000d000000000000000|@8290,2097151,@17900,@8285|43,0,@8282 8282:O1|@8283 8283:D3,24|48c7c001000000c300000000000000001000000000000000|@8284,1,@17897| 8284:S37|54595045434845434b5f50415253455452454528292e7061737332283529656e762d283129 8285:D4,240|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba80fe18c9a37f00004889114c894108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048be68ff18c9a37f00004889324c894208488062ffbf498d77e8483b75107303ff55404989f748c746f8020000004889560848890e488b4c2420488b542418488b7c24104c8b5c24084c89542420488944241848b8080019c9a37f000048894424104889542408488b042448893c244153534c89d34989f24c89ce4989c94989dc4889f34889c64c89e056ff25280000000000000000000000e800000000000000|@8649,2097151,@18036,@8291|35,0,@8286 81,0,@8288 164,0,@8289 8286:D3,120|483b65187303ff5548488b5208488b5240909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@8287,1048575,@17898| 8287:S56|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352974797065456e762d283129 8288:D3,120|483b65187303ff5548488b5208488b5268909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@8287,1048575,@17899| 8289:O1|@8285 8290:S30|54595045434845434b5f50415253455452454528292e7061737332283529 8291:D131,18352|488dbc2418ffffff483b7d187303ff55504883382d754f488b4c2438488b542430488b742428488b7c24204c8b5c24184c8b6424104c8b6c240848894c24384889542430488974242848897c24204c895c24184c896424104c896c2408488b4008e99affffff4883381175154889c148b8204c19c9a37f0000488b5d089090ff134883382175164889c148b8f04c19c9a37f0000488b5d08909090ff134883383d75164889c148b8804d19c9a37f0000488b5d08909090ff13488b0848ba160119c9a37f0000488d548afcffe290e946020000909090e9b6020000909090e9f5060000909090e9a20f0000909090e9dc130000909090e9641b0000909090e94b200000909090e9bc220000909090e9b3000000909090e920230000909090e9b7230000909090e998240000909090e9a2250000909090e9e4250000909090e983000000909090e990280000909090e973000000909090e9d0290000909090e9502b0000909090e9582e0000909090e913330000909090e9e4380000909090e943000000909090e91d3d0000909090e9b5400000909090e9b4400000909090e94c410000909090e908420000909090e90d420000909090e94c420000909090e903000000909090488b4808498d57e8483b55107303ff55404989d748c742f802000000498b706848897208498b783048893aff7118534151ff35cb4500004150ff7120ff7108ff7110ff71184c8d4c24284c8b014889d348b8084e19c9a37f0000ff15aa450000488b4810488339077518488379081175115048c7c30100000090ff1592450000eb33506a016a014989e048bb304e19c9a37f0000488b48184889c8909090ff1576450000488b44240890ff1572450000584883c408488b0c24f64128017537488b5128488b1a488b33488b36498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b742408488937488b3348893ef6413001752f488b5130488b1a488b1b498d77e8483b75107303ff55404989f748c746f80200000048895e08488906488b1a488933488b542410488902488b54241848890a488b4c24284883c4205a4883c428488b494848890ac23800488b4808488b542438488b5c2408488b742420488b7c24184c8b5424284c8b5c24104c8b6424304c8b69284c896c24384c894c2430488954242848895c242048897424184c8944241048897c24084c8b04244c891424415341544c8b51204c8b49184d89c64c8b4110488b5908488b014156ff255f440000498d4fc0483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5010488911488d591848c743f80200000048894b08488b480848890b488d731848c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fd8483b7d107303ff55404989ff48c747f8040000004c8b58184c895f184889771048895f0848c707330000004152415150415357ff742460ff742460ff742460ff742460ff742460ff742460ff7424604889c34889f8e8b6fbffff5048c7c30300000048b8804e19c9a37f0000ff15964300004889c34889d8ff1592430000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c700070000004889c3488b042448bab06507c9a37f0000909090ff153a430000a8017570ff304c8b5424304c8b4c24284c8b442408488b5c241048b8b04e19c9a37f00009090ff15164300004889c649b9d04e19c9a37f00004c8b4424304c89c3488b44242848bae84e19c9a37f00009090ff15f2420000564889c1488b4424084889ca9090ff12498d4fd0483b4d10730aeb05e979020000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8085e19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c24204889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15d6400000564889c3488b44242048ba682b18c9a37f0000909090ff15c2400000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51609090ff12eb0748c7c00100000048b830c706c9a37f00004883c430c23800488b48084152415141505350ff7110ff7120ff7108ff31ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000488b442438e8d6f7ffff50ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424800000004c8b4c24784c8b442470488b5c2468488b44244890e882f7ffff50488b442430ff15a63f00004883f801740948c7c001000000eb6a498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908f684248800000001751b488b942488000000488b0af642ff10740348f7d9488d4c0901eb08488b8c2488000000488d0ccdf9ffffff498d57e0483b5510730aeb05e93d000000ff55404989d748c742f80300000048894a104889420848c7020d0000004889d3488b44240848bab06507c9a37f000090ff15fa3e000048c7c001000000488b4424089090ff15ee3e0000488338057538498d4fd8483b4d107303ff55404989cf48c741f802000000488b501048895108488b5808488919488d711848c746f80100000048890eeb70498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80300000048c74110f17002004889410848c7010d000000488d412048c740f801000000c640ff4048ba30e306c9a37f0000eb05e9d1020000488910498d57c0483b55107303ff55404989d748c742f80300000048c74210f17002004889420848c7020d000000488d422048c740f803000000488948104889500848c700050000005152488b5c241848bab06507c9a37f000090ff15e23d0000a80175704c8b5424604c8b4c24584c8b442418488b5c242048b8605e19c9a37f0000ff15c23d0000504c8b5424684c8b4c24604c8b442418488b5c243048b8805e19c9a37f0000909090ff15a23d0000498d4fe8483b4d107303ff55404989cf48c741f80200000048baa05e19c9a37f0000eb05e9bc01000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a85f19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13488b4c24584889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15423c0000564889c3488b44245048ba682b18c9a37f0000909090ff152e3c0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542438488950185b488958104889480848c70003000000488b4c2458488b591848c70303000000488b51609090ff1248c7c601000000eb37498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b0c24488908488d701848c746f8010000004889064883c41040f6c601756f488b06ff7008488b5c2408488b084889c848bab06507c9a37f000090ff15723b0000a8017570ff304c8b5424604c8b4c24584c8b442418488b5c242048b8605e19c9a37f00009090ff154e3b0000504c8b5424684c8b4c24604c8b442418488b5c243048b8805e19c9a37f0000eb05e92c030000ff152a3b00004889c649b9d04e19c9a37f00004c8b4424684c89c3488b442460eb05e9ef02000048bae84e19c9a37f0000909090ff15fe3a0000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a85f19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24504889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff159e380000564889c3488b44244848ba682b18c9a37f0000909090ff158a380000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542430488950185a488950104889480848c70003000000488b4c2450488b511848c70203000000488b51609090ff12488b442430488b0c244889084889c84883c460c2380048b8d09507c9a37f00004883c458c23800488b4808498d5798483b55107303ff55404989d748c742f80c00000048bbf85f19c9a37f000048891a488942084c894a10488b5c243848895a18488b742430488972204c8952284c894230488b7c242848897a384c8b5c24204c895a404c8b6424184c8962484c8b6c24104c896a504c8b7424084c897258488062ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be10091ac9a37f00004889731048bed88d18c9a37f000048897308488913498d57d0483b55107303ff55404989d748c742f80500000048894220488b71184889721848c74210f900000048bed80e1ac9a37f00004889720848bef00e1ac9a37f000048893241524151415050ff7110ff7118ff314989d84889d3488b4108909090ff15f636000050ff742478ff742478ff742478ff742478ff742478ff742478ff7424784c8b5424704c8b4c24684c8b442460488b5c2458488b44244090e81aeeffff50488b442408ff15b636000048833805756aff7010488b5c2408488b400848bab06507c9a37f00009090ff159a360000a8017570488b3049b9d04e19c9a37f00004c8b4424484c89c3488b44244048bae84e19c9a37f00009090ff15723600004889c14889f04889ca90ff12488b4c24404889c6ff7128ff7130eb05e9ba000000ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000eb05e98f0000004c8b51204c8b49184c8b4110488b5908488b019090ff1516360000564889c3488b44243848ba682b18c9a37f0000909090ff1502360000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542428488950185a488950104889480848c70003000000488b4c2440488b511848c70203000000488b51609090ff1258eb6d498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47c0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000488d482048c741f80300000048894110488b1c24eb05e92d0100004889590848c70105000000504889cb4889d048bab06507c9a37f000090ff151a350000a801756d488b3049b9d04e19c9a37f00004c8b4424484c89c3488b44244048bae84e19c9a37f00009090ff15f23400004889c14889f04889ca90ff12488b4c24404889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b5120eb05e98c0000004c8b49184c8b4110488b5908488b0190ff159e340000564889c3488b44243848ba682b18c9a37f0000909090ff158a340000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542428488950185a488950104889480848c70003000000488b4c2440488b511848c70203000000488b51609090ff12eb0748c7c001000000584883c420594883c420488901c23800488b480841524151415050ff7118ff7108ff7110ff31ff742478ff742478ff742478ff742478ff742478ff742478ff7424784889c3488b442438e8f2eaffff50ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb42480000000ffb424800000004c8b5424784c8b4c24704c8b442468488b5c2460488b442448e8a2eaffff50ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424800000004c8b4c24784c8b442470488b5c2468488b44245890e84eeaffff5048bb30c706c9a37f0000488b44241048bab06507c9a37f0000ff151e330000a8017570ff304c8b5424584c8b4c24504c8b442418488b5c242048b8280f1ac9a37f00009090ff15fa3200004889c649b9d04e19c9a37f00004c8b4424584c89c3488b44245048bae84e19c9a37f00009090ff15d6320000564889c1488b4424084889ca9090ff12498d4fd0483b4d10730aeb05e977020000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8400f1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c24484889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15ba300000564889c3488b44244048ba682b18c9a37f0000909090ff15a6300000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542438488950185b488958104889480848c70003000000488b4c2448488b591848c70303000000488b51609090ff12488b1c24488b44240848bab06507c9a37f0000909090ff153a300000a8017576ff304c8b5424584c8b4c24504c8b442410488b5c242848b8980f1ac9a37f00009090ff1516300000504c8b5424604c8b4c24584c8b442410488b5c243848b8b00f1ac9a37f0000909090ff15f62f00004889c649b9d04e19c9a37f00004c8b4424604c89c3488b44245848bae84e19c9a37f0000eb05e9f6020000909090ff15ca2f0000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c80f1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24484889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff156a2d0000564889c3488b44244048ba682b18c9a37f0000909090ff15562d0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542438488950185a488950104889480848c70003000000488b4c2448488b511848c70203000000488b51609090ff1248b8d09507c9a37f00004883c458c238004883c408584883c448c2380041524151415050ff7018ff7010ff7008ff742470ff742470ff742470ff742470ff742470ff742470ff742470488b44244090e86ae3ffff498d5fd8483b5d107303ff55404989df48c743f80400000048b920101ac9a37f000048890b488b4c242848894b08488b54241848895310488b74242048897318488063ffbf504989c8488b44240848bab8c019c9a37f00009090ff15522c0000504889c3488b44240848bab06507c9a37f0000909090ff153e2c0000a8017570ff304c8b5424484c8b4c24404c8b442410488b5c242048b870ce19c9a37f00009090ff151a2c00004889c648c7c001000000ff15122c00005649c7c2010000004c8b4c24504989c048c7c3214e0000488b44241048ba40a507c9a37f0000ff15ee2b0000498d4fd0483b4d10730aeb05e9bb030000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888ce19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c649b9d04e19c9a37f00004c8b4424504c89c3488b44244848bae84e19c9a37f0000909090ff15062b0000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c0ce19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24384889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15a6280000564889c3488b44243048ba682b18c9a37f0000909090ff1592280000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542428488950185a488950104889480848c70003000000488b4c2438488b511848c70203000000488b51609090ff12584883c440c23800488b4808498d57e8483b55107303ff55404989d748c742f802000000498b706848897208498b784048893aff7108534151ff35032800004151415050ff7110ff31ff7108ff71184c8d442438488b1c244889d0909090ff15e62700006a016a014989c34889e3488b442410909090ff15d6270000488b0424483b05d32700007431a80175364889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750948c7c001000000eb37488b4c2438ff742418ff742438ff742450ff358827000041534c8d4c24084989c0488b596848b8688c19c9a37f0000ff1572270000eb0a6a016a016a016a014153488b0c24498d57e8483b55107303ff55404989d748c742f8020000004883c4485b48895a0848c70201000000488b5c241850ff7108ff315248c7c001000000488b9380000000ff12498d4f98483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f802000000488941085848890158488d511848c742f803000000488b581048895a1048894a08488b742410488932524989ca4c8b4c24104989d0488b4424089090ff159e260000498d4fe8483b4d107303ff55404989cf48c741f802000000488941085a4883c41048891151a8017543488b4c2418488b10488b5808498d47e8483b45107303ff55404989c748c740f80200000048895008488b1248891053488b51109090ff1258483b65187303ff5548ebb9488b442418488b4818498d47e8483b45107303ff55404989c748c740f8020000005a488950085a4883c4384889104889ca90ff1248b8d09507c9a37f0000c23800488b48104150ff7008f6c1017555488b442408498d57d0483b55107303ff55404989d748c742f802000000488b1c2448895a08488b31488932488b38488d421848c740f80200000048895008488930ff71084889faff1259483b65187303ff5548eba648b8d09507c9a37f00004883c410c23800498d4fe0483b4d107303ff55404989cf48c741f80300000048ba40111ac9a37f00004889114c89490848894110488061ffbf6a016a016a014989c24889e34889c8ff153e250000498b42084883c408415141504152a801752eff70084c8b5424204c8b4c24084c8b442418488b5c2410488b009090ff151225000058483b65187303ff5548ebce48c7c00100000048b8d09507c9a37f00004883c428c23800488b400848b9d09507c9a37f000041514150a8017564488b08ff7008ff31ff742418ff742448ff742448ff7424484c8b5424204c8b4c24784c8b442430488b5c2448488b442470488b5424689090ff12f644240801755b50488b5c242090ff1592240000a801754f6a016a01ff304c8d442408488b5c2420eb05e96000000048b838ad0ac9a37f0000488b542450ff12415a41594883c4084c8b44240848c7c301000000488b44242090ff154e240000eb19e90900000048c7c001000000eb0b4889c148c7c00100000051594883c40858483b65187303ff5548e933ffffff4889c84883c410c23800498d4f98483b4d107303ff55404989cf48c741f80c00000048ba20121ac9a37f0000488911488941084c894910488b54243848895118488b5c2430488959204c8951284c894130488b74242848897138488b7c2420488979404c8b4424184c8941484c8b5c24104c8959504c8b6424084c896158488061ffbf4d8d6fe04c3b6d107303ff55404d89ef49c745f80300000049be10091ac9a37f00004d89751049bed88d18c9a37f00004d89750849894d00498d4fd0483b4d107303ff55404989cf48c741f805000000488941204c8b70184c89711848c74110f900000049bed80e1ac9a37f00004c89710849bea8121ac9a37f00004c8931ff70084d89e84889cb488b4010ff151223000059488901c2380041504151ff7424484152ff742448ff742448ff742448ff742448ff7424484c8b5424784c8b48204c8b4018488b5810488b48084889c890ff15d622000048b8d09507c9a37f0000c2380041524151415050ff7018ff7010ff742468ff742468ff742468ff742468ff742468ff742468ff7424684889c3488b48084889c8909090e8a6d8ffff498d4f98483b4d107303ff55404989cf48c741f80c00000048bae8121ac9a37f0000488911488b54241048895108488b5c242048895910488b74246848897118488b7c2460488979204c8b4424284c8941284c8b4c24184c8949304c8b4c24584c8949384c8b5424504c8951404c8b5c24484c8959484c8b6424404c8961504c8b6c24384c896958488061ffbf4d8d77e04c3b75107303ff55404d89f749c746f80300000049b810091ac9a37f00004d89461049b8d88d18c9a37f00004d89460849890e498d4fd0483b4d107303ff55404989cf48c741f805000000488951204c8b4424084c89411848c74110f900000048bbd80e1ac9a37f00004889590848bb70131ac9a37f0000488919504c8b5424304c8b4c24284d89f04889cb488b442408ff156e210000498d4fe0483b4d107303ff55404989cf48c741f803000000488b14244889511048bba8131ac9a37f00004889590848c701050000004889cb48bab06507c9a37f0000ff152e210000a801756d488b3049b9d04e19c9a37f00004c8b4424304c89c3488b44242848bae84e19c9a37f00009090ff15062100004889c14889f04889ca90ff12488b4c24284889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b5120eb05e98c0000004c8b49184c8b4110488b5908488b0190ff15b2200000564889c3488b44242048ba682b18c9a37f0000909090ff159e200000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2428488b511848c70203000000488b51609090ff12eb0748c7c001000000584883c430c23800ff7010ff7008ff742448ff742448ff742448ff742448ff742448ff742448ff7424485048bbd8131ac9a37f0000488b4018ff15062000009090ff15062000004889c34889d8ff1502200000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1424488951104889410848c701010000004883fa017542498d47f0483b45107303ff55404989c748c740f801000000c640ff40488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000498d47e0483b45107303ff55404989c748c740f803000000488948104889580848c700070000004883fa01755a498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004889114883c40859488901c23800498d4f98483b4d107303ff55404989cf48c741f80c00000048bae8131ac9a37f0000488911488941084c8941104c8949184c895120488b54243848895128488b5c243048895930488b74242848897138488b7c2420488979404c8b4424184c8941484c8b5c24104c8959504c8b6424084c896158488061ffbf4d8d6fe04c3b6d107303ff55404d89ef49c745f80300000049be20d119c9a37f00004d89751049be882b18c9a37f00004d89750849894d00498d4fd0483b4d107303ff55404989cf48c741f805000000488941204c8b70184c89711848c741105900000049be80d519c9a37f00004c89710849be98d519c9a37f00004c8931ff70084d89e84889cb488b4010ff15fa1d000048833801750c48b8d09507c9a37f0000eb64498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80500000048bae0c606c9a37f00004889502048ba083a07c9a37f00004889501848ba403a07c9a37f0000488950104889480848c7000b00000059488901c238004152415153ff7008ff701848c7c303000000488b4020909090ff15661d00009090ff15661d0000488338057568ff701048bbc0d006c9a37f0000488b400848bab06507c9a37f000090ff15461d0000a8017570488b3049b9d04e19c9a37f00004c8b4424284c89c3488b44242048bae84e19c9a37f00009090ff151e1d00004889c14889f04889ca90ff12488b4c24204889c6eb05e9c0000000ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000eb05e98f0000004c8b51204c8b49184c8b4110488b5908488b019090ff15c21c0000564889c3488b44242048ba682b18c9a37f0000909090ff15ae1c0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542410488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51609090ff1258eb73498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47c0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000488d482048c741f8030000004889411048bbc0d006c9a37f0000eb05e92f0100004889590848c70105000000504889cb4889d048bab06507c9a37f0000909090ff15be1b0000a801756d488b3049b9d04e19c9a37f00004c8b4424284c89c3488b44242048bae84e19c9a37f00009090ff15961b00004889c14889f04889ca90ff12488b4c24204889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b5120eb05e98c0000004c8b49184c8b4110488b5908488b0190ff15421b0000564889c3488b44242048ba682b18c9a37f0000909090ff152e1b0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542410488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51609090ff12eb0748c7c001000000584883c408594883c418488901c23800488b48086a016a016a014c8b114c8b59104c8b61204c8b69084889e348c7c0010000009090ff159a1a00006a016a016a014889e348c7c0010000009090ff158a1a00006a016a016a014889e348c7c0010000009090ff157a1a00004983fb017514488b442450a80174064883c002710aff5570ebf5488b442450498d4fe0483b4d107303ff55404989cf48c741f80300000048bab8141ac9a37f00004883c408488911498b503048895108488b5c243848895910488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be28151ac9a37f0000488933498b704048897308488b7c242048897b10488063ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049be98151ac9a37f00004c89374d8b70684c897708488b54240848895710488067ffbf498d57e0483b55107303ff55404989d748c742f80300000048be08161ac9a37f00004889324c894208488b74242848897210488062ffbf498d7788483b75107303ff55404989f748c746f80e00000048897e684d8b70604c8976604d8b70584c8976584c8b34244c8976504889564848895e404d8b70384c89763848894e304d8b70284c8976284d8b70204c8976204c8b7424184c8976184c8b7424304c8976104d8b70084c89760849be30181ac9a37f00004c893649bed09507c9a37f00004151415050415241535741ff706041ff705852535141ff702841ff702041545641f6c501755e498b450041ff7508ff742478ffb424e8000000ffb424e8000000ffb424e80000004c8b104c8b8c24180100004c8b442428488b9c2488000000488b842410010000488b942408010000909090ff124989c6415d483b65187303ff5548eb9c4c89f0498d47d8483b45107303ff55404989c748c740f80400000048b980181ac9a37f00004883c408488908488b4c246048894808488b9424a0000000488950105a48895018488060ffbf498d57e0483b55107303ff55404989d748c742f80300000048bb70191ac9a37f000048891a48894a08488b9c248000000048895a10488062ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048bed8191ac9a37f000048893348894b08488b74246848897310488063ffbf498d7788483b75107303ff55404989f748c746f80e000000488b7c243848897e68488b7c243048897e60488b7c242848897e5848895e50488b5c242048895e48488b5c241848895e40488b593848895e38488b7c241048897e30488b7c240848897e285f4883c43848897e204889561848894610488b410848894608488b114889165f4883f702415849b9d09507c9a37f0000575641f6c0017564498b0041ff7008ff30ff742430ffb424a0000000ffb424a0000000ffb424a00000004c8b5424204c8b8c24d00000004c8b442430488b5c2440488b8424c8000000488b9424c00000009090ff1248837c2418017466f644240801756450488b5c2438eb05e9860000009090ff15a2160000a80175506a016a01ff304c8d442408488b5c242048b838ad0ac9a37f0000488b9424a8000000ff12415a41594883c4084c8b44240848c7c301000000488b44243890ff1562160000eb1ee90e000000e90900000048c7c001000000eb0b4889c148c7c0010000005141594883c4084158483b65187303ff5548e90bffffff4c89c84883c468c23800488b48084151415050ff7120ff7118ff7110ff31ff750848bada3519c9a37f00005248896508498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c7020100000048c7c11700000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bb401a1ac9a37f0000488919498d5fd8483b5d107303ff55404989df48c743f804000000488943184889531048894b0848c703030000004883c4085848894508eb6d90488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15ea1400004889c348b8489319c9a37f000090ff15de140000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff1353ff750848b8823719c9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bea81a1ac9a37f0000488931498d77d8483b75107303ff55404989f748c746f804000000488946184889561048894e0848c706030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15521300004889c348b8489319c9a37f000090ff1546130000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff1356ff750848b82a3919c9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bf101b1ac9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184889571048894f0848c707030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15ba1100004889c348b8489319c9a37f000090ff15ae110000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff13574c8b4c24384c8b442448488b5c2440488b4424189090ff1536110000a8017534488b08ff7008ff7424184c8b5424104c8b4c24504c8b442418488b5908488b019090ff151211000058483b65187303ff5548ebc848c7c00100000049b8781b1ac9a37f000048c7c301000000488b44241090ff15ea100000488b4c242048890149b8301c1ac9a37f000048c7c30100000058ff15d2100000488b4c242048890149b8981c1ac9a37f000048c7c301000000584883c420ff15b6100000594883c41848890148b8d09507c9a37f0000c23800498d4fc0483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5010488911488d591848c743f80200000048894b08488b480848890b488d731848c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fd8483b7d107303ff55404989ff48c747f8040000004c8b58184c895f184889771048895f0848c707330000004152415150415357ff742460ff742460ff742460ff742460ff742460ff742460ff7424604889c34889f89090e8e6c4ffff5048c7c30300000048b8001d1ac9a37f0000ff15d60f00004889c34889d8ff15d20f0000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c700070000004889c3488b042448bab06507c9a37f0000909090ff157a0f0000a8017570ff304c8b5424304c8b4c24284c8b442408488b5c241048b8b04e19c9a37f00009090ff15560f00004889c649b9d04e19c9a37f00004c8b4424304c89c3488b44242848bae84e19c9a37f00009090ff15320f0000564889c1488b4424084889ca9090ff12498d4fd0483b4d10730aeb05e979020000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8601d1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c24204889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15160d0000564889c3488b44242048ba682b18c9a37f0000909090ff15020d0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51609090ff12eb0748c7c00100000048b830c706c9a37f00004883c430c238004152415150ff7010ff7008ff742460ff742460ff742460ff742460ff742460ff742460ff7424604889c3488b4424389090e822c1ffff5048bba8131ac9a37f000048bab06507c9a37f000090ff15460c0000a8017570ff304c8b5424304c8b4c24284c8b442408488b5c241048b8b81d1ac9a37f00009090ff15220c00004889c649b9d04e19c9a37f00004c8b4424304c89c3488b44242848bae84e19c9a37f00009090ff15fe0b0000564889c1488b4424084889ca9090ff12498d4fd0483b4d10730aeb05e977020000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d01d1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c24204889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15e2090000564889c3488b44242048ba682b18c9a37f0000909090ff15ce090000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51609090ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004883c4304889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000c23800488b4010c23800ff7010ff742440ff742440ff742440ff742440ff742440ff742440ff7424405348bbd8131ac9a37f0000488b4008909090ff15e208000048c7c303000000909090ff15da0800004889c34889d8ff15d6080000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c7000700000059488901c23800498d4fe0483b4d107303ff55404989cf48c741f80300000048ba281e1ac9a37f00004889114c89490848894110488061ffbf6a016a016a014989c24889e34889c8ff154a0800004151415041ff72084d89d14c8b442410488b5c2408488b042490ff153208000059f6c101753fa801753bff7008ff7108ff7424104c8b5424304c8b4c24604c8b442420488b18488b0190ff150a080000488b442408594883c408483b65187303ff5548ebbc48c7c00100000048b8d09507c9a37f00004883c428c2380048b8703007c9a37f0000c238004151ff7424404152ff742440ff742440ff742440ff742440ff7424404d89c24c8b4c24704c8b4018488b5810488b48084889c890ff159e07000048b8d09507c9a37f0000c2380041524151415050ff7008ff7018ff7010ff742470ff742470ff742470ff742470ff742470ff742470ff7424704889c3488b4424389090e8bebbffff5048bb30c706c9a37f000048bab06507c9a37f000090ff1542070000a8017570ff304c8b5424404c8b4c24384c8b442408488b5c241048b8e81e1ac9a37f00009090ff151e0700004889c649b9d04e19c9a37f00004c8b4424404c89c3488b44243848bae84e19c9a37f00009090ff15fa060000564889c1488b4424084889ca9090ff12498d4fd0483b4d10730aeb05e977020000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8001f1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13488b4c24304889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15de040000564889c3488b44242848ba682b18c9a37f0000909090ff15ca040000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2430488b511848c70203000000488b51609090ff12ff742478ff742478ff742478ff742478ff742478ff742478ff7424784c8b5424704c8b4c24684c8b442460488b5c2458488b4424509090e876b8ffff48b8703007c9a37f00004883c440c2380090909090900000000000000000a847000000000000|@8683,2097151,@18052,@8684,@8525,@8542,@1382,@8195,@8685,@8016,@8522,@1633,@8503,@8310,@8349,@8028,@8819,@1633,@1401,@1633,@8503,@8503,@8349,@8028,@1633,@8503,@8503,@8310,@8349,@8028,@8573,@1401,@1633,@8310,@8349,@8028,@1633,@8310,@8349,@8028,@1633,@8503,@8310,@8349,@8028,@1633,@8503,@8503,@8310,@8349,@8028,@8473,@1633,@8503,@1323,@1416,@8310,@8349,@8028,@8823,@8370,@1348,I48,@8824,@8408,@8825,@8510,@8833,@8843,@8347,@8573,@8851,@8573,@1633,@8310,@8349,@8028,@8905,@8010,@8572,@8573,@8542,@1401,@1633,@8310,@8349,@8028,@1633,@8310,@8349,@8028,@8796,@8796,@8796,@8843,@8347,@194,@100,@194,@100,@194,@100,@8906,@8908,@1532,@1532,@1532,@8016,@8522,@1633,@8503,@8310,@8349,@8028,@1633,@8503,@8310,@8349,@8028,@8919,@8016,@8522,@8510,@8920,@8923,@8650,@1633,@8503,@8310,@8349,@8028|113,0,@8292 140,0,@8296 168,0,@8299 190,0,$8291+206 536,0,@8302 594,0,@8303 993,0,@573 1108,0,@8305 1213,0,@1292 1258,0,@8307 1279,0,@8308 1302,0,@8309 1394,0,@2141 1435,0,@8326 1514,0,@1294 1582,0,@833 1659,0,@833 1700,0,@8328 1779,0,@1294 1877,0,@8026 1993,0,@393 2231,0,@573 2351,0,@1292 2478,0,@573 2550,0,@573 2647,0,@1292 2688,0,@8330 2725,0,@8331 2768,0,@8332 2820,0,@833 2893,0,@833 2934,0,@8340 3013,0,@1294 3113,0,@8026 3311,0,@1292 3354,0,@8330 3393,0,@8331 3419,0,@8308 3449,0,@8309 3535,0,@2141 3576,0,@8326 3655,0,@1294 3722,0,@833 3795,0,@833 3872,0,@833 3913,0,@8340 3992,0,@1294 4093,0,@8026 4222,0,@1394 4267,0,@8342 4388,0,@8583 4402,0,@8118 4463,0,@8590 4477,0,@8591 4614,0,@1292 4639,0,@8308 4662,0,@8309 4789,0,@8026 4927,0,@573 5031,0,@1292 5055,0,@8308 5078,0,@8309 5197,0,@8026 5557,0,@393 5572,0,@1292 5614,0,@8592 5635,0,@8308 5658,0,@8309 5750,0,@2141 5791,0,@8326 5870,0,@1294 5938,0,@833 6015,0,@833 6056,0,@8593 6135,0,@1294 6233,0,@8026 6349,0,@1292 6394,0,@8595 6433,0,@8596 6455,0,@8308 6478,0,@8309 6571,0,@2141 6612,0,@8326 6691,0,@1294 6758,0,@833 6831,0,@833 6908,0,@833 6949,0,@8597 7028,0,@1294 7129,0,@8026 7236,0,@1394 7344,0,@8599 7398,0,@8472 7425,0,@1292 7470,0,@8487 7532,0,@1415 7606,0,@833 7647,0,@8488 7726,0,@1294 7746,0,@8308 7769,0,@8309 7855,0,@2141 7896,0,@8326 7975,0,@1294 8042,0,@833 8115,0,@833 8192,0,@833 8233,0,@8490 8312,0,@1294 8413,0,@8026 8664,0,I48 8752,0,@8371 9148,0,@1394 9260,0,@1394 9301,0,@8601 9419,0,@1394 9440,0,@1394 9563,0,@3194 9693,0,@8603 9814,0,@8583 9828,0,@8118 9890,0,@8590 9904,0,@8604 10004,0,@1394 10100,0,@8605 10241,0,@8583 10255,0,@8118 10317,0,@8590 10331,0,@8606 10404,0,@8607 10428,0,@1292 10451,0,@8308 10474,0,@8309 10593,0,@8026 10752,0,@8608 10980,0,@573 11077,0,@8609 11198,0,@8500 11212,0,@8027 11274,0,@8507 11288,0,@8508 11326,0,@1394 11385,0,@390 11399,0,@993 11413,0,@995 11493,0,@467 11507,0,@1292 11531,0,@8308 11554,0,@8309 11681,0,@8026 11819,0,@573 11894,0,@467 11929,0,@1292 11955,0,@8308 11978,0,@8309 12097,0,@8026 12375,0,@8611 12438,0,@8612 12497,0,@8613 12556,0,@8614 12701,0,@8618 12714,0,@1394 12883,0,@8620 12955,0,@8622 13013,0,@8623 13181,0,@1394 13332,0,@3194 13471,0,$8291+13714 13648,0,@8624 13750,0,@193 13771,0,@8394 13812,0,@8395 13842,0,@557 13856,0,@20055 13891,0,$8291+14138 14071,0,@8626 14174,0,@193 14195,0,@8394 14236,0,@8395 14266,0,@557 14280,0,@20055 14315,0,$8291+14562 14495,0,@8628 14598,0,@193 14619,0,@8394 14660,0,@8395 14690,0,@557 14704,0,@20055 14827,0,@8630 14864,0,@8633 14896,0,@8635 14932,0,@1394 15023,0,@573 15140,0,@8637 15245,0,@1292 15290,0,@8307 15311,0,@8308 15334,0,@8309 15426,0,@2141 15467,0,@8326 15546,0,@1294 15614,0,@833 15691,0,@833 15732,0,@8640 15811,0,@1294 15909,0,@8026 16025,0,@393 16097,0,@8607 16107,0,@1292 16150,0,@8642 16171,0,@8308 16194,0,@8309 16286,0,@2141 16327,0,@8326 16406,0,@1294 16474,0,@833 16551,0,@833 16592,0,@8643 16671,0,@1294 16769,0,@8026 16904,0,@573 17009,0,@8608 17161,0,@8645 17316,0,@1394 17333,0,@923 17404,0,@1394 17477,0,@393 17487,0,@1292 17530,0,@8646 17551,0,@8308 17574,0,@8309 17666,0,@2141 17707,0,@8326 17786,0,@1294 17854,0,@833 17931,0,@833 17972,0,@8647 18051,0,@1294 18149,0,@8026 18316,0,@923 8292:O4|@20055,@557,@8294,@8293 8293:O5|@8295,1406,0,1406,0 8294:S28|61737369676e54797065733a20656d7074797472656520666f756e64 8295:S53|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f54595045434845434b5f5041525345545245452e736d6c 8296:O4|@20055,@557,@8298,@8297 8297:O5|@8295,1403,0,1403,0 8298:S34|61737369676e54797065733a206c617965726564207061747465726e20666f756e64 8299:O4|@20055,@557,@8301,@8300 8300:O5|@8295,1400,0,1400,0 8301:S27|61737369676e54797065733a2077696c646361726420666f756e64 8302:S20|56616c7565206f7220636f6e7374727563746f72 8303:O1|@8304 8304:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17901| 8305:O2|@393,@8306 8306:O2|@393,0 8307:S10|417267756d656e74733a 8308:S5|756e696679 8309:O2|@8310,@1415 8310:D3,80|498d47d0483b45107303ff55404989c748c740f80500000048b9784f19c9a37f00004889084c894008488b5208488950104c89481848895820488060ffbfc39000000000000000004800000000000000|@8325,207,@17907|26,0,@8311 8311:D10,1384|483b65187303ff554848833803756f4989d24c8b58204c8b60104c8b68184c8b7008498b5a1848b8405519c9a37f0000ff154a050000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13514152415341544d8b4a10eb05e9270200004d89e8498b5a204c89f0909090ff15f2040000488b4c2410488b5118483b15ea040000743ef6c201752d4889d648bfd04e19c9a37f000048c7c11b00000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740c48b9585519c9a37f0000eb0a48b9a8600ac9a37f0000498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70207000000f6c20174154889c148b8f86f07c9a37f0000488b5d089090ff13488b4c241050524c8b49104c8b442418488b5908488b4424109090ff154a040000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba705519c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c34989d24c8b58184c8b60104c8b6808498b5a1848b8405519c9a37f000090ff15d2020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889ce48c7c00100000090ff158e02000041525641534154498b4a20498b521049c7c2010000004989c94989c048c7c3d10700004c89e8ff124889c648c7c001000000ff155e020000488b4c24185649c7c2010000004c8b49084989c048c7c3d1070000488b442408488b51109090ff12498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424104889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f0000488911498d57d0483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b85519c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390909090909000000000000000006005000000000000|@8319,1048575,@17902,@100,@8318,@8308,@8318,@100,@1323,@1323|40,0,@8312 96,0,@1294 178,0,@8308 220,0,@8313 232,0,@3084 285,0,@1294 360,0,@8314 405,0,@833 478,0,@833 555,0,@833 666,0,@1294 703,0,@8312 760,0,@1294 940,0,@1294 1010,0,@833 1070,0,@833 1111,0,@8317 1152,0,@833 1229,0,@833 1344,0,@1294 8312:S6|43616e277420 8313:S2|746f 8314:O2|@833,@8315 8315:O2|@8316,0 8316:O2|3,@1651 8317:O2|3,@8313 8318:D4,64|483b65187303ff5548498b4810488b5110488b342448891c2441504989c24c8b4210488b5a08488b0256ff252800000000000000000000003800000000000000|@8321,1048575,@17903,@8320| 8319:S50|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129 8320:D11,1264|483b65187303ff55484889de4889c748c7c0010000009090ff15ea040000415056574c89d149c7c2010000004c89ca4c8b4c24284989c048c7c3d10700004889c8909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889016a016a014989cb4889e3488b442410ff1592040000488b4424304883c4086a016a014889e3488b084889c8ff157e040000488b442410483b4424087449a8017552f644240801754b488b542408f6c201740948c7c103000000eb08488b0a488d4c09014883c1104889c64889d748d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750d48c7c0010000004883c418eb72498d47e8483b45107303ff55404989c748c740f802000000488b4c24204889480848c70001000000a80174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f802000000eb05e928010000488b5c24184889580848c70007000000a80174164889c348b8f86f07c9a37f0000488b5d08909090ff13498d5fb8483b5d107303ff55404989df48c743f80200000048c7430801000000488903488d431848c740f805000000488958204889501848c740100100000048c740080100000048c70001000000a80174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba781b07c9a37f0000488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8387107c9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba781b07c9a37f00004889104883c418488b4c2410483b0d790200007432f6c10175364889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750948c7c101000000eb71498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424084889510848c70101000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a4989c24989d4488b5c2410eb05e90201000048b868280ac9a37f0000ff15be01000048bb38280ac9a37f0000ff15b6010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f805000000488941204c89611848c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f00004889014c89d04883f901740c4889cb909090ff15ca0000004883f80174114889c34c89d89090ff15be0000004989c3498d47d0483b45107303ff55404989c748c740f8050000004c89582048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134883c418c210000000000000000000e804000000000000|@8323,1048575,@17904,@1323,@1348,@1348,I48,@100,@100,@8324,@8322|301,0,@1294 396,0,@1294 500,0,@1294 570,0,@833 611,0,@1302 652,0,@833 691,0,I48 790,0,@1294 860,0,@3002 876,0,@3000 932,0,@1294 1034,0,@1294 1102,0,@833 1225,0,@1294 8321:S71|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e737472283329 8322:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17906| 8323:S87|545950455f5452454528292e756e69667954797065734572726f725265706f72742834297265706f72744572726f72283129657870616e64656454797065436f6e7374722833297072696e745769746844657363283329 8324:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17905| 8325:S36|545950455f5452454528292e756e69667954797065734572726f725265706f7274283429 8326:O2|3,@8327 8327:S7|526561736f6e3a 8328:O2|3,@8329 8329:S46|417267756d656e7473206f6620616e64616c736f206d7573742068617665207479706520626f6f6c2a626f6f6c2e 8330:S9|46756e6374696f6e3a 8331:S9|417267756d656e743a 8332:O2|@833,@8333 8333:O2|@8334,0 8334:O5|0,0,0,0,@8335 8335:O2|@8326,@8336 8336:O2|@2141,@8337 8337:O2|@8338,0 8338:O2|3,@8339 8339:S49|56616c7565206265696e67206170706c69656420646f6573206e6f74206861766520612066756e6374696f6e2074797065 8340:O2|3,@8341 8341:S35|54797065206572726f7220696e2066756e6374696f6e206170706c69636174696f6e2e 8342:D4,88|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff7240ff7248ff7250ff72584c8b52204c8b4a184c8b42104889de488b5a0856ff252f0000009090909090909000000000000000005000000000000000|@8361,2097151,@17916,@8343| 8343:D5,568|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048baf06219c9a37f00004889114c8941084c894910488061ffbf6a016a016a014c8b58104c8b60184c8b284c8b70084889e34889c89090ff15f201000041f6c20174064983c2027105ff5570ebf54153415441504155415141526a014150ffb42490000000ffb42490000000415149ba106819c9a37f000049c7c1010000004c8b442428488b5c24604c89f0909090ff15a2010000488b4c2478498d57e0483b55107303ff55404989d748c742f80300000048bbf86919c9a37f000048891a488b593048895a08488b74244048897210488062ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf686a19c9a37f000048893e48894e08488b7c243048897e10488066ffbf498d7f88483b7d107303ff55404989ff48c747f80e0000004c8b41684c8947684c8b49604c894f604c8b51584c8957584c8b59504c895f5048897748488b7140488977404c8b61384c89673848895730488b5128488957284c8b69204c896f204c8b71184c897718488b591048895f10488b7108488977084c8b294c892f50ff742420ff742478ff742478ff7424784c8b5424384c8b4c24304989f8488b5c2478488b442428488b94249800000090ff12488b4c2428488901488b4c2430488b14244889114889c1498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c700050000004883c450c23800909090909000000000000000003002000000000000|@8509,2097151,@17976,@8510,@8362|35,0,@8344 145,0,@8352 213,0,@8355 272,0,@8356 8344:D5,136|483b65187303ff55484d8b402041f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bbe06319c9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8348,2097151,@17908,@100,@8347|54,0,@8345 70,0,@8346 8345:O5|I48,0,0,0,0 8346:S37|2068617320616c7265616479206265656e20626f756e6420696e2074686973206d61746368 8347:D5,408|483b65187303ff55484889de4889c74d89cb4d89c44d89d5ff7728ff7730ff7738ff7740ff7748ff7750ff7758ff7760ff7768ff7770ff7778ffb7800000004c8b57204c8b4f184c8b4710488b5f08488b079090ff1556010000498d4fe8483b4d107303ff55404989cf48c741f8020000004c89690848c70107000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff13498d57b8483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8050000004889512048c741180100000048c741100100000048c741080100000048c70101000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff1356574153514889c34c89e048ba682b18c9a37f00009090ff159a000000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542408488950185a4883c4084889501048894808488b4c2408488908488b14244883f901740b488b4a1848c70103000000488b52604883c410ff2290909090909000000000000000009001000000000000|@8350,2097151,@17909,@8349,@8028|135,0,@1294 241,0,@1294 270,0,@8026 8348:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d61746368547265652832296d657373466e283329 8349:D7,304|488b442420a801753e488b08488b11483b1532010000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01756948b898c809c9a37f0000a801753e488b08488b11483b15e1000000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01751848b8c0cf09c9a37f0000488b5d08eb05e92d00000090ff13488b03488b08483b0d86000000741148b878e107c9a37f0000488b5d0890ff13488b48104889c8c26000488b03488b08483b0d64000000741348b878e107c9a37f0000488b5d08909090ff13488b48104889c8c26000909090909000000000000000002801000000000000|@8351,15,@17910,@20131,@20131,@20131,@20131|86,0,@2635 175,0,@2690 214,0,@1486 256,0,@1486 8350:S30|5052494e545f50415253455452454528292e6572726f724e656172283529 8351:S21|4c45585f28292e6572726f72446570746828313729 8352:O1|@8353 8353:D3,384|498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f8030000004889531048894b0848c70305000000488d4b2048c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fc0483b7d107303ff55404989ff48c747f8030000004889771048894f08488917488d4f2048c741f801000000488939488d511048c742f801000000c642ff4048c70201000000498d77b0483b75107303ff55404989f748c746f801000000488916488b5010488b78084c8b00488d461048c740f807000000488970304889482848895020488978184889581048c74008030000004c8900c3909090909000000000000000007801000000000000|@8354,127,@17911|65,0,@2150 8354:S28|56414c55455f4f505328292e6d616b654c6f63616c56283129283129 8355:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@17912| 8356:D4,176|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bb486b19c9a37f000048891848894808488060ffbf5251488b5a104889da9090ff1258488b00488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252c000000909090900000000000000000a800000000000000|@8360,1048575,@17914,@8359|73,0,@8357 8357:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@17913| 8358:S57|54595045434845434b5f50415253455452454528292e7061737332283529737472696e67734f665365617263684c6973742834295f2d283129 8359:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17915| 8360:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229626f6479456e762d283129 8361:S63|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283129283129 8362:D62,6296|488dbc2400ffffff483b7d187303ff5550488b0848ba566d19c9a37f0000488d548afcffe290e9f3000000909090e9eb000000909090e9f0000000909090e9db000000909090e9d3000000909090e910060000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e9ab0a0000909090e92e0f0000909090e978100000909090e904120000909090e97c130000909090e95b000000909090e953000000909090e94b000000909090e968160000909090e93b000000909090e933000000909090e98b160000909090e923000000909090e91c170000909090e913000000909090e90b000000909090e91117000090909048b8d09507c9a37f0000c22800488b4808488b1148833a1d756d488b7208488b7c24104c8b5e204c8b67484d89234d8d6fe84c3b6d107303ff55404d89ef49c745f8020000004c8b77684d897508488b573049895500ff761850ff742430ff352e1700004152415141505350ff7110ff7120ff7108ff7610ff7608ff7618ff364c8d4c2460eb05e91c0100004c8b04244c89eb48b8c88719c9a37f000090ff15f616000048837808017406f64008017567488b4810488339077517488379081175105048c7c301000000ff15d2160000eb33506a016a014989e048bbe88719c9a37f0000488b48184889c8909090ff15b6160000488b44240890ff15b2160000584883c408488b4c24185a488911488b4c2418488901eb63488b08483b0d98160000745cf6c101752d4889ce48bf388819c9a37f000048c7c12700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901744648bb588819c9a37f0000488b04249090ff15561600004989c24c8b4c24084c8b442438eb0ae97a000000e91700000048c7c303000000488b8424a00000009090ff152e16000048b8d09507c9a37f0000eb526a016a016a016a014152415141505350ff7110ff7120ff710849ba808819c9a37f00004c8b4c24084989c048c7c303000000488b842480000000ff15ea15000048b8d09507c9a37f00006a016a016a016a0150ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b9424880000004c8b8c24800000004c8b442478488b5c2470488b4424509090e89efcffff50488b442408ff158a150000488338057568ff7010488b5c2408488b400848bab06507c9a37f00009090ff156e150000a801756e488b3049b9d04e19c9a37f00004c8b8424b00000004c89c3488b8424b800000048bae84e19c9a37f0000ff15421500004889c14889f04889ca90ff12488b8c24b8000000eb05e9c80000004889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170eb05e99d000000ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b01909090ff15e2140000564889c3488b44245848ba682b18c9a37f0000909090ff15ce140000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542448488950185a488950104889480848c70003000000488b8c24b8000000488b511848c70203000000488b5160909090ff1258eb6d498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47c0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000488d482048c741f80300000048894110488b1c24eb05e9390100004889590848c70105000000504889cb4889d048bab06507c9a37f000090ff15e2130000a8017570488b3049b9d04e19c9a37f00004c8b8424b00000004c89c3488b8424b800000048bae84e19c9a37f0000ff15b61300004889c14889f04889ca90ff12488b8c24b80000004889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000eb05e9950000004c8b51204c8b49184c8b4110488b5908488b019090ff155e130000564889c3488b44245848ba682b18c9a37f0000909090ff154a130000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542448488950185a488950104889480848c70003000000488b8c24b8000000488b511848c70203000000488b5160909090ff12eb0748c7c001000000584883c440594883c448488901c2280050ff7018ff7010ff7008ff742448ff742448ff742448ff742448ff742448488b442430909090e872f9ffff498d5fd8483b5d107303ff55404989df48c743f80400000048b9c08819c9a37f000048890b488b4c244048894b08488b54241848895310488b74243048897318488063ffbf504989c8488b44240848bab8c019c9a37f00009090ff1552120000504889c3488b44240848bab06507c9a37f0000909090ff153e120000a8017570ff304c8b5424504c8b4c24584c8b442410488b5c242048b870ce19c9a37f00009090ff151a1200004889c648c7c001000000ff15121200005649c7c2010000004c8b4c24584989c048c7c3214e0000488b44241048ba40a507c9a37f0000ff15ee110000498d4fd0483b4d10730aeb05e9bb030000ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888ce19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c649b9d04e19c9a37f00004c8b4424584c89c3488b44246048bae84e19c9a37f0000909090ff1506110000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c0ce19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24504889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15a60e0000564889c3488b44243048ba682b18c9a37f0000909090ff15920e0000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542428488950185a488950104889480848c70003000000488b4c2450488b511848c70203000000488b51609090ff12584883c428c22800488b48086a016a014d89d34d89cc4d89c54989de50ff7110ff7118ff7108ff31ff7120488d5c2430488b44240890ff15060e000048837c246801740c48b810cf19c9a37f0000eb64488b442430483b05ee0d00007431a80175574889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017540488b4424504153415441554156488b4830488b4424284889ca9090ff124883f8017518eb0ae98d000000e91100000048b810cf19c9a37f0000eb65488b00eb65488b442450498d4fe8483b4d107303ff55404989cf48c741f802000000488b506848895108488b58304889194153415441554156ff742438ff742450ffb42490000000ff353a0d00004989e14c8b4424484889cb48b8c88719c9a37f0000eb0ae91a000000e91500000090ff151a0d00004883c420eb084153415441554156488b4c2470488b542420488b594848891a48837808017406f6400801755748837c241001743849ba50cf19c9a37f00004c8b4c24384c8b44244848c7c303000000488b842480000000909090ff15c20c000048b8d09507c9a37f0000eb69488b542430488902f6400801750e488b5008488b32eb57e90001000050488b50184889d09090ff15920c0000488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c1010000004883f901741348c7c001000000eb11e96a020000e91400000048c7c0030000004883f0024883f0024889c6eb01504883fe017455488b0424488b48104883390775164883790811750f48c7c301000000ff15160c0000eb646a016a014989e048bb98cf19c9a37f0000488b48184889c8ff15fe0b0000488b44240890ff15fa0b0000584883c408eb3349bae8cf19c9a37f00004c8b4c24404c8b44245048c7c303000000488b842488000000ff15d20b000048b8d09507c9a37f00004883c408eb6d498d47e8483b45107303ff55404989c748c740f802000000488b5424384889500848c70001000000488bb424800000005048c7c001000000488b9680000000909090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d4118eb05e94a01000048c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048ba30e306c9a37f0000488910f6442408017518488b5c2408488b13f643ff10740348f7da488d541201eb05488b542408488d14d5f9ffffff498d5fc0483b5d107303ff55404989df48c743f803000000488953104889430848c7030d000000488d432048c740f8030000004889481048895808488b4c2428488908488b542418ff12504c8b442440488b9c2488000000488b442430909090ff15760a000049c7c2010000004c8b4c24404c8b842488000000488b5c2470488b442430ff155a0a0000498d47e8483b45107303ff55404989c748c740f802000000488b0c2448894808488b542430488910488b54240890ff12488b442438488b0c24488908488b41184883c4084883c440594883c418488901c22800ff7010ff7008ff74241853415041514152ff7424604c8b5424504c8b4c24584c8b44246048bb30d019c9a37f0000488b401890ff15d60900009090ff15d60900004889c34889d8ff15d2090000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1424488951104889410848c701010000004883fa017542498d47f0483b45107303ff55404989c748c740f801000000c640ff40488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000498d47e0483b45107303ff55404989c748c740f803000000488948104889580848c700070000004883fa01755a498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004889114883c40859488901c228004152415141505350ff7018ff7010ff742460ff742460ff742460ff742460ff74246049c7c103000000488b48084889c89090e8a6eeffff50ff742468ff742468ff742468ff742468ff7424684c8b5424604c8b4c24584c8b442450488b5c2448488b44243090e872eeffff4889c3488b042448bab06507c9a37f000090ff1552080000a801756d488b3049b9d04e19c9a37f00004c8b4424584c89c3488b44246048bae84e19c9a37f00009090ff152a0800004889c14889f04889ca90ff12488b4c24604889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b5120eb05e98c0000004c8b49184c8b4110488b5908488b0190ff15d6070000564889c3488b44242048ba682b18c9a37f0000909090ff15c2070000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2460488b511848c70203000000488b51609090ff12eb0748c7c001000000584883c438c22800498d4fa8483b4d107303ff55404989cf48c741f80a00000048ba40d019c9a37f0000488911488959084c8941104c8949184c895120488b54242848895128488b5c242048895930488b74241848897138488b7c2410488979404c8b4424084c894148488061ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049ba20d119c9a37f00004d89511049ba882b18c9a37f00004d895108498909498d4fd0483b4d107303ff55404989cf48c741f805000000488941204c8b50184c89511848c741105900000049bb80d519c9a37f00004c89590849bb98d519c9a37f00004c8919ff70084989f24d89cb4989d94d89d84889cb488b40109090ff155e06000048833801750c48b8d09507c9a37f0000eb64498d4fb8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80500000048bae0c606c9a37f00004889502048ba083a07c9a37f00004889501848ba403a07c9a37f0000488950104889480848c7000b00000059488901c2280050ff7008ff701848c7c303000000488b48204889c8ff15ce0500009090ff15ce050000488338057568ff701048bbc0d006c9a37f0000488b400848bab06507c9a37f000090ff15ae050000a8017570488b3049b9d04e19c9a37f00004c8b4424384c89c3488b44244048bae84e19c9a37f00009090ff15860500004889c14889f04889ca90ff12488b4c24404889c6eb05e9c0000000ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000eb05e98f0000004c8b51204c8b49184c8b4110488b5908488b019090ff152a050000564889c3488b44242048ba682b18c9a37f0000909090ff1516050000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542410488950185a488950104889480848c70003000000488b4c2440488b511848c70203000000488b51609090ff1258eb73498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47c0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000488d482048c741f8030000004889411048bbc0d006c9a37f0000eb05e92f0100004889590848c70105000000504889cb4889d048bab06507c9a37f0000909090ff1526040000a801756d488b3049b9d04e19c9a37f00004c8b4424384c89c3488b44244048bae84e19c9a37f00009090ff15fe0300004889c14889f04889ca90ff12488b4c24404889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b5120eb05e98c0000004c8b49184c8b4110488b5908488b0190ff15aa030000564889c3488b44242048ba682b18c9a37f0000909090ff1596030000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542410488950185a488950104889480848c70003000000488b4c2440488b511848c70203000000488b51609090ff12eb0748c7c001000000584883c408594883c408488901c22800488b4c2428488b542420488b742418488b7c24104c8b5c240848894c24284889542420488974241848897c24104c895c2408488b4008e982e8ffffff7010ff74241053415041514152ff7424584c8b5424484c8b4c24504c8b44245848bb30d019c9a37f0000488b4008909090ff15ba02000048c7c303000000909090ff15b20200004889c34889d8ff15ae020000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c7000700000059488901c2280048b8703007c9a37f0000c22800498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000c22800909000000000000000009018000000000000|@8523,2097151,@17983,@8524,@8525,@8542,@1382,@8195,@8366,@100,@8347,@8347,@1401,@1633,@8310,@8349,@8028,@1633,@8310,@8349,@8028,@8473,@1633,@8503,@1323,@1416,@8310,@8349,@8028,@1348,I48,@8557,@8525,@8347,@1401,@8542,@1382,@8195,@8347,@8558,@8564,@8570,@8010,@8572,@1633,@8310,@8349,@8028,@8573,@8542,@1401,@1633,@8310,@8349,@8028,@1633,@8310,@8349,@8028,@8582,@8016,@8522|22,0,$8362+38 288,0,@1394 435,0,@8363 506,0,@8364 588,0,@8366 630,0,@8367 700,0,@1394 737,0,@8368 776,0,@1394 898,0,@1292 923,0,@8308 952,0,@8309 1081,0,@8026 1223,0,@573 1327,0,@1292 1351,0,@8308 1380,0,@8309 1501,0,@8026 1704,0,@8369 1758,0,@8472 1785,0,@1292 1830,0,@8487 1892,0,@1415 1966,0,@833 2007,0,@8488 2086,0,@1294 2106,0,@8308 2129,0,@8309 2215,0,@2141 2256,0,@8326 2335,0,@1294 2402,0,@833 2475,0,@833 2552,0,@833 2593,0,@8490 2672,0,@1294 2773,0,@8026 2948,0,@8492 2981,0,I48 3070,0,@8492 3171,0,@8363 3252,0,@8493 3296,0,@1394 3493,0,@8494 3535,0,@8496 3576,0,@1394 3773,0,@573 4087,0,@8497 4316,0,@573 4503,0,@1292 4527,0,@8308 4550,0,@8309 4669,0,@8026 4817,0,@8498 4920,0,@8500 4934,0,@8027 4995,0,@8507 5009,0,@8508 5058,0,@1394 5117,0,@390 5131,0,@993 5145,0,@995 5221,0,@467 5235,0,@1292 5259,0,@8308 5282,0,@8309 5409,0,@8026 5547,0,@573 5622,0,@467 5657,0,@1292 5683,0,@8308 5706,0,@8309 5825,0,@8026 6049,0,@8497 6177,0,@923 6218,0,@573 8363:S11|436f6e7374727563746f72 8364:O1|@8365 8365:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17917| 8366:S11|3c756e646566696e65643e 8367:S21|206973206e6f74206120636f6e7374727563746f72 8368:S46|436f6e7374727563746f7220696e2061207061747465726e20776173206e6f7420616e206964656e746966696572 8369:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796848897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@17919,@8389,@8370| 8370:D15,616|483b65187303ff55486a016a014d89c34c8b204c8b68084889d84889e3909090ff155a020000488b0424483b05570200007431a801753d4889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175104153488b4424104c89e29090ff12eb6841534d89d94989c04c89eb48b8688c19c9a37f0000909090ff15fe010000a8017563488b00488b48106a016a016a016a016a016a016a016a016a016a016a016a016a01ff7120488d5c2408488b0148ba00dd07c9a37f0000ff15c6010000488b842480000000eb05e996000000488b5424489090ff124883f801750e48c7c001000000eb69e9480000004c8b1048c7c35d000000488b442478909090ff158a0100004989c0488b1c244c89d0ff15820100004889c1498d47f0483b45107303ff55404989c748c740f801000000488908eb2d48b8888c19c9a37f00006a016a016a016a016a016a016a016a01eb05e90c0000006a016a016a016a016a016a014883c4704883f801756548bbe0ef0ac9a37f000048b8308e19c9a37f0000909090ff1516010000488b5c241090ff151201000048bb508e19c9a37f0000ff150a010000488b4c2408483b0d060100007439f6c10175404889ce48bf509adc000000000048c7c11100000048d1e9eb05e962000000483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9509adc0000000000eb1f4989c2488b5c240848b8788e19c9a37f000090ff15ae0000004889c14c89d04889cb90ff15a6000000488b14249090ff1248b8988c19c9a37f00004883c418c3488b004883c418c39090909090909000000000000000006002000000000000|@8407,2097151,@17925,@1348,I48,@8408,@1484,@100,@8391,@100,@100,@100,I48,@100,@100|60,0,I48 129,0,@8371 196,0,@1483 328,0,@8372 383,0,@3232 393,0,@8385 424,0,@8386 462,0,I48 511,0,I48 531,0,@8387 572,0,@8373 8371:S9|537472756374757265 8372:O1|@8373 8373:O2|@8374,0 8374:O3|@8376,@390,@8375 8375:O3|@8378,@8383,@8377 8376:S9|756e646566696e6564 8377:O3|@8376,@417,@8384 8378:O2|1,@8379 8379:O3|2,@8380,0 8380:O4|0,@20168,3,1 8381:O1|@8382 8382:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@456,1,@17918|2,0,@413 8383:O4|1,@20081,0,0 8384:S9|556e646566696e6564 8385:S16|5479706520636f6e7374727563746f72 8386:S23|2920686173206e6f74206265656e206465636c61726564 8387:S14|20696e2073747275637475726520 8388:S28|545950455f5452454528292e61737369676e54797065732833292d45 8389:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@17920,@8347| 8390:S45|54595045434845434b5f50415253455452454528292e7061737332283529676976654572726f72283329283129 8391:D8,800|488dbc2458ffffff483b7d187303ff555041505350ff750848b9829019c9a37f00005148896508498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004889ca48c7c11700000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bee09219c9a37f0000488931498d77d8483b75107303ff55404989f748c746f804000000488946184889561048894e0848c706030000004883c4085848894508eb6f909090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15f20100004889c348b8489319c9a37f000090ff15e6010000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0156488d5c24084889f048ba00dd07c9a37f00009090ff1556010000488b442470488b08498d47e8483b45107303ff55404989c748c740f802000000488b54247048895008488b09488908488b5424209090ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba989319c9a37f000048891148894108488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bb389419c9a37f000048895a1048894a0848b9789519c9a37f000048890a50ff35970000006a014c8b94249800000049c7c1030000004c8b8424900000004889d3488b4424189090ff1576000000584881c488000000488b004883f80175164889c148b8386208c9a37f0000488b5d08909090ff13488b00c390909000000000000000001803000000000000|@8421,2097151,@17933,@194,@100,@1484,@8422,@8412|26,0,$8391+274 206,0,@8392 310,0,@193 331,0,@8394 372,0,@8395 402,0,@557 416,0,@20055 482,0,@1483 615,0,@8396 661,0,@8398 679,0,@8403 760,0,@1662 8392:O1|@8393 8393:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@17921,@375| 8394:S16|486173685461626c652e686173683a20 8395:O5|@1508,88,0,88,0 8396:D3,64|498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901488b520848890a48c7c001000000c3909000000000000000003800000000000000|@8397,7,@17922| 8397:S38|434f5049455228292e66756c6c436f70794461746174797065283329726573456e762d283129 8398:O1|@8399 8399:D4,128|483b65187303ff5548488b1848b8f89419c9a37f00009090ff157a000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba189519c9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff1390909000000000000000007800000000000000|@8397,255,@17923,@100|14,0,@8400 56,0,@8401 74,0,@557 88,0,@20055 8400:S12|656e74657253747275637420 8401:O5|@8402,258,0,258,0 8402:S30|6d6c736f757263652f4d4c436f6d70696c65722f434f504945522e736d6c 8403:O1|@8404 8404:D4,128|483b65187303ff5548488b1848b8389619c9a37f00009090ff157a000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba589619c9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff1390909000000000000000007800000000000000|@8397,255,@17924,@100|14,0,@8405 56,0,@8406 74,0,@557 88,0,@20055 8405:S9|656e74657256616c20 8406:O5|@8402,259,0,259,0 8407:S24|56414c55455f4f505328292e6c6f6f6b7570547970283329 8408:D13,1264|488dbc2450ffffff483b7d187303ff55506a016a014989c34d89cc4989dd4889e34c89c0ff15de040000488b0424483b05db0400007431a801753d4889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901751041534154488b4424184c89eaff12eb68415341544d89e14989c04c89eb48b8688c19c9a37f00009090e86affffffa8017565488b08488b51106a016a016a016a016a016a016a016a016a016a016a016a016a0151ff7228ff7220ff7118488d5c2420488b0248ba00dd07c9a37f000090ff153a040000eb05e90e03000058a801753f488b08488339017524498d57f0483b5510730aeb05e9bf020000ff55404989d748c742f80100000048890aeb19488b48084889c8483b65187303ff5548ebbd48c7c201000000f6c2017549488b02488338017540498d4fd0483b4d107303ff55404989cf48c741f802000000488b58084889590848c70107000000488d711848c746f80200000048c746080100000048890eeb0748c7c60100000056488b8424a0000000488b9424800000009090ff124883f801750948c7c001000000eb64488b08488b5110498d5fe0483b5d107303ff55404989df48c743f80300000048be189c19c9a37f0000488933488b722048897308488b7c240848897b10488063ffbf488b3a48833f03756a4c8b47084d8b004c8b4f184d8b094d8b114983fa017513eb05e9da01000049b9909adc0000000000eb70488b014c8b59184c8b61084c89d14989c548c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8eb05e973000000c647ff4057f348ab5f4c89ce4889f84889c74c89d148d1e94883c608f348a5488d7c3f01488d743601eb05e90f000000488d4c0901488060ffbf4989c1eb0b4c8b59184c8b61084c8b29498d47e0483b45107303ff55404989c748c740f8030000004c8948104c89400848c70001000000eb0e4889f84c8b59184c8b61084c8b29498d4fc8483b4d107303ff55404989cf48c741f806000000488b7424104889712848895920488b5a184889591848c7411001000000488b72084889710848890149833c24017533498d47e0483b45107303ff55404989c748c740f803000000488b7c2418488978104d8b6424084c89600848c70009000000eb034c89e04983fb017506488b3c24eb1e4889cf4989c04c89db488b04249090ff159e0100004889f94889c74c89c0498d57c8483b55107303ff55404989d748c742f80400000048897a1848894a10488942084c892a488d422848c740f801000000488910eb2948c7c0010000006a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a014881c4880000004883f801756748bbe0ef0ac9a37f0000488b442408ff151a010000488b5c241890ff151601000048bb508e19c9a37f0000ff150e010000488b4c2410483b0d0a0100007439f6c10175404889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01eb05e955000000488d743601488d4c0901750c48b9509adc0000000000eb1f4989c2488b5c241048b8788e19c9a37f000090ff15b20000004889c14c89d04889cb90ff15aa000000488b14249090ff1248c7c0010000004883c420c3488b08498d47f0483b45107303ff55404989c748c740f8010000004889084883c420c39090900000000000000000e804000000000000|@8411,1048575,@17927,@1348,I48,@1484,@8410,@100,@100,@100,I48,@100,@100|64,0,I48 135,0,@8371 207,0,@1483 458,0,@8409 532,0,I49 1019,0,@3232 1052,0,@8386 1090,0,I48 1139,0,I48 1159,0,@8387 8409:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@17926,@1542| 8410:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17928| 8411:S30|56414c55455f4f505328292e6c6f6f6b7570537472756374757265283429 8412:D7,224|483b65187303ff55485053415241504151ff74243049c7c20100000049c7c103000000488b5c2418ff15ca00000050504989c249c7c1010000004c8b442418488b5c2420488b442430909090ff15ae000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba489e19c9a37f00004883c408488911488b54240848895108488b5c24104889591048894118488061ffbf51ff74242050ff7424505352ff742430ff355c0000004989e048c7c301000000488b44246090ff154e0000004883c468c21000909090909090900000000000000000d800000000000000|@8429,1048575,@17935,@8430,@8430,@8427,@1532|108,0,@8413 8413:D4,216|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bb509f19c9a37f0000488919488b5a0848895908488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf10a019c9a37f000048893e488b7a1048897e08488066ffbf6a016a016a014989e041504c8b52184989f149b8a8a019c9a37f00004889cbff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c39090900000000000000000d000000000000000|@8420,2097151,@17932,@1554|35,0,@8414 85,0,@8416 129,0,@8418 8414:D3,88|483b65187303ff5548488b480848833901752a488b4118488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005000000000000000|@8415,1048575,@17929| 8415:S48|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129636f70794964283129 8416:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@8417,255,@17930,@100| 8417:S42|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129283129 8418:O1|@8419 8419:D3,24|c39090909090909000000000000000001000000000000000|@8417,1,@17931| 8420:S39|434f5049455228292e6c6f63616c436f7079536967283729636f707954797065436f6e73283129 8421:S28|434f5049455228292e66756c6c436f70794461746174797065283329 8422:O1|@8423 8423:D3,40|48b8c0a119c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@8426,1,@17934|2,0,@8424 8424:O4|11,@42,0,@8425 8425:O5|@8402,261,0,261,0 8426:S33|434f5049455228292e66756c6c436f707944617461747970652833295f2d283129 8427:D4,120|483b65187303ff55485052f6c3017549488b0424ff7308ff701848b9f8a219c9a37f000051ff7020ff7028ff7030ff70384c8b50104c8b4808488b1b488b442440909090ff15460000004989c05b483b65187303ff5548ebb24c89c04883c410c39090909090909000000000000000007000000000000000|@1538,2097151,@17959,@8449|28,0,@8428 8428:O1|@8412 8429:S24|434f5049455228292e6c6f63616c436f7079536967283729 8430:D7,112|483b65187303ff554853415241514150ff357200000050415241514150534c8d442428488b5c2458ff1562000000ff742418ff742418ff742418ff742418ff35540000004989e04889c3488b44244890ff154a0000004883c478c2080090909000000000000000006800000000000000|@8432,1048575,@17936,@8433,@1532,@8431,@1532| 8431:D4,96|483b65187303ff55485052f6c3017535488b0424ff7308ff7018ff70204c8b50104c8b4808488b1b488b442420909090ff15420000004989c05b483b65187303ff5548ebc64c89c04883c410c390909000000000000000005800000000000000|@1538,2097151,@17944,@8436| 8432:S41|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629 8433:D7,272|483b65187303ff55485052f6c3017568488b03488b08483b0d0b010000755e483b0d0a010000741148b878e107c9a37f0000488b5d0890ff13488b5010488b7210488b3c244c8b53084d89c34c8b264c8b6e20488b5c2408488b4720ff15d600000048c7c35d000000909090ff15ce000000488b0c24eb0ae977000000e95a000000498d57e0483b55107303ff55404989d748c742f80300000048bb10a619c9a37f000048891a4c896a08488b590848895a10488062ffbf415241534c8b51184c8b49104989d04889c34c89e048ba68a619c9a37f000090ff12eb064c89c0ff73084989c05b483b65187303ff5548e917ffffff4c89c04883c410c39090909000000000000000000801000000000000|@1538,1048575,@17938,@20058,@20058,@100,@100|42,0,@1486 156,0,@8434 207,0,@8435 8434:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@17937,@1542| 8435:O1|@8430 8436:D8,672|483b65187303ff5548488b03483b05a50200007572483b05a4020000741348b878e107c9a37f0000488b5d08909090ff13488b4b10498d57e8483b55107303ff55404989d748c742f80200000048be68a919c9a37f00004889324c894a08488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf10aa19c9a37f0000eb05e9fd01000048893e4c895608488066ffbf488b394c8b5f104d8b630849833c2405756e48837c24100174064c89c0c210004d8d57d84c3b55107303ff55404d89d749c742f80400000049bde0aa19c9a37f00004d892a4989720849895210488b54240849895218498062ffbf415057415141ff731041ff3341ff7424084d89d048bb88ac19c9a37f0000498b442410eb05e9b0000000909090ff15a2010000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70105000000498d47e0483b45107303ff55404989c748c740f803000000488b5424084889501048894808594883c408488908488b4c24084989c2488b195890ff154201000059498d57c8483b55107303ff55404989d748c742f8030000004c895210488b490848894a08488902488d422048c740f8020000005948894808488910c2100048837c24100175064c89c0c2100049833c2401752d4150574151498b4424184c89d290ff12498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb0c48c7c1010000004150574151f6c1017561488b4424084c8b11488b18488b042490ff15a2000000488b4c2408498d57c8483b55107303ff55404989d748c742f8030000004c895210488b490848894a08488902488d422048c740f802000000488b4c2410488948084889104883c418c210004883c41058c210004c89c0c210009000000000000000009802000000000000|@8448,2097151,@17945,@20047,@20047,@1390,@100,@100|32,0,@1486 79,0,@8437 125,0,@8439 210,0,@8441 265,0,@8446 8437:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@8438,255,@17939,@100| 8438:S64|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c6454797065732833296d616b654e616d65283129 8439:D3,88|483b65187303ff5548488b480848833901752a488b4118488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005000000000000000|@8440,1048575,@17940| 8440:S62|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f70794964283129 8441:D4,120|483b65187303ff55486a016a016a014889e1514c8b52184c8b4a1049b888ab19c9a37f0000488b5a08909090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007000000000000000|@8445,2097151,@17942,@1554|29,0,@8442 8442:O1|@8443 8443:D3,24|c39090909090909000000000000000001000000000000000|@8444,1,@17941| 8444:S71|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129283129 8445:S68|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329636f7069656445717569762d283129 8446:O1|@8447 8447:D3,24|c39090909090909000000000000000001000000000000000|@8445,1,@17943| 8448:S53|434f5049455228292e6c6f63616c436f70795369672837296275696c64547970654361636865283629666f6c645479706573283329 8449:D16,2232|483b65187303ff5548488b0b483b0dbd0800007569483b0dbc08000074134889c248b878e107c9a37f0000488b5d08ff13488b5310488b72104983f9017469498d7fe0483b7d107303ff55404989ff48c747f80300000049b868b619c9a37f00004c89074c8b46204c8947084c895710488067ffbf4c8b0e49833903eb05e9bf05000075684d8b51084d8b124d8b59184d8b1b4d8b234983fc01751149bb909adc0000000000eb6fe91f0100004c89e14989c548c7c0010000004989fe488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348abeb05e9900000005f488b4628488b4e184c8b46084c89de4989f94c89cf4989cb4c89e148d1e94883c608eb05e928000000f348a5488d7c3f01488d743601488d4c0901498061ffbf4c89d94d89cb4c89f74889c64c89e8eb15488b4e284c8b46184c8b4e084889ce4c89c14d89c84d8d4fe04c3b4d107303ff55404d89cf49c741f8030000004d8959104d89510849c70101000000eb15488b4e284c8b46184c8b56084889ce4c89c14d89d04d8d57c84c3b55107303ff55404d89d749c742f8060000004989722849897a2049894a1849c74210010000004d8942084d890aeb6f50ff7218ff7208ff32ff7628ff7618ff7608ff364152ff7620ff750848bf06b019c9a37f00005748896508498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c7070100000048c7c11700000048c7c0010000004989f8488d3c8d0400000048f7df4903ffeb05e99b030000483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bfc0b619c9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184c89471048894f0848c707030000004883c4085848894508eb6c488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15c60500004889c348b8489319c9a37f000090ff15ba050000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048b928b719c9a37f000048890848897808488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000049b840b919c9a37f00004c890148897908488061ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049b920bb19c9a37f00004d890849897808498060ffbf4d8d4fc04c3b4d107303ff55404d89cf49c741f80300000049894910498941084d8901498d412048c740f80300000048b900bd19c9a37f000048890859488948084c895010488060ffbf4989fa4989c34d89cc488b5c24404883c408488b442470ff156e04000048c7c35d000000909090ff15660400004152ff742468ff7424684989c249c7c1010000004d89d84c89e3488b442418488b942480000000909090ff12488b042448833803756a488b4808488b09488b4018488b00488b104883fa01750c48b8909adc0000000000eb6f4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f84889c7eb05e9540000004889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9030000004889d9498d57e0483b55107303ff55404989d748c742f8030000004889421048894a0848c70201000000eb034889c24d8d57c84c3b55107303ff55404d89d749c742f806000000488b4424204883c41049894228488b44245849894220488b4c240849894a1849c7421001000000594883c41049894a08498912eb0950ff7218ff7208ff32498d47c0483b45107303ff55404989c748c740f804000000488b4c2410488948184c895010488b4c240848894808594883c410488908488b4c24184889c2488d402848c740f802000000488950085a488910488b51105b4883c43053ff22488b13483b15b40200007575483b15b302000074164889c648b878e107c9a37f0000488b5d08909090ff13488b7310498d7fe8483b7d107303ff55404989ff48c747f80200000049b858bd19c9a37f00004c89074c895708488067ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049b9d8bd19c9a37f0000eb05e9e20000004d89084c8b4c24304d894808498060ffbf6a016a016a0150ff76084c8d54241041524c8b5424484d89c149b830be19c9a37f00004889fb488b069090ff1506020000498d47e0483b45107303ff55404989c748c740f803000000488b4c242048894810488b4c241848894808488b4c241048890850488b5c2438488b44240890ff15ca010000488b4c2440498d57e8483b55107303ff55404989d748c742f80200000048894208488b0424488902498d47e8483b45107303ff55404989c748c740f80200000048895008488b542410488910488b51084883c4305b4883c43053ff22483b156f010000756f483b156e010000741148b878e107c9a37f0000488b5d0890ff13488b4310ff30ff7030ff7028ff7020ff7010ff700850ff70184c8b44244848bb80be19c9a37f0000488b0424909090ff152e010000483b0424745a498d4fc0483b4d107303ff55404989cf48c741f807000000eb05e974000000488b54243048895130488b54242848895128488b5424204889512048894118488b44241848894110488b44241048894108488b442438488901eb05488b4c2408488b4424504883c438488b10498d47e8483b45107303ff55404989c748c740f8020000004889480859488908594883c43051ff2248c7c001000000c230009090900000000000000000b008000000000000|@8471,2097151,@17961,@20058,@20058,@194,@100,@100,@100,@20047,@20047,@1554,@8468,@20043,@20043,@1390|35,0,@1486 89,0,@8450 158,0,I49 490,0,$8449+742 677,0,@8451 778,0,@193 799,0,@8394 840,0,@8395 870,0,@557 884,0,@20055 939,0,@8453 985,0,@8456 1031,0,@8458 1100,0,@8460 1249,0,I49 1628,0,@1486 1675,0,@8461 1721,0,@8462 1780,0,@8463 1982,0,@1486 2029,0,@8465 8450:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@17946,@1542| 8451:O1|@8452 8452:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@17947,@375| 8453:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048be18b419f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@8455,2097151,@17948,@1490,@8454,@1504|59,0,@20047 8454:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@17949,@20047| 8455:S39|434f5049455228292e6c6f63616c436f70795369672837292833296e65775369672d5f2d283129 8456:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048bec8b419f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@8455,2097151,@17950,@1490,@8457,@1504|59,0,@20058 8457:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@17951,@20058| 8458:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048bed8b319f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@8455,2097151,@17952,@1490,@8459,@1504|59,0,@20043 8459:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@17953,@20043| 8460:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@17954,@1542| 8461:D3,88|483b65187303ff5548488b480848833901752a488b4118488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005000000000000000|@8415,1048575,@17955| 8462:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@8417,255,@17956,@100| 8463:O1|@8464 8464:D3,24|c39090909090909000000000000000001000000000000000|@8417,1,@17957| 8465:O1|@8466 8466:D3,24|c39090909090909000000000000000001000000000000000|@8467,1,@17958| 8467:S37|434f5049455228292e6c6f63616c436f7079536967283729636f7079547970283129283129 8468:D4,256|483b65187303ff5548a801756c488b0853ff7008ff7130ff7128ff7120ff7110ff7108ff3151ff71184989d848bb38c019c9a37f0000488b04249090ff15d6000000483b0424745a498d4fc0483b4d107303ff55404989cf48c741f807000000488b54243848895130488b54243048895128488b542428eb05e9640000004889512048894118488b44242048894110488b44241848894108488b442410488901eb05488b4c240851488b5c2450488b442448909090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c450488908c348c7c001000000c39090909090900000000000000000f800000000000000|@1363,2097151,@17962,@1390|46,0,@8469 8469:O1|@8470 8470:D3,24|c39090909090909000000000000000001000000000000000|@8467,1,@17960| 8471:S27|434f5049455228292e6c6f63616c436f7079536967283729283329 8472:O2|@8473,@20081 8473:D4,40|483b65187303ff55484d89c14c8b4208ff252a000000909000000000000000002000000000000000|@8479,2097151,@17963,@8474| 8474:D15,1584|483b65187303ff5548488b0848ba46c119c9a37f0000488d548afcffe290e9a3030000909090e923000000909090e99e030000909090e9f3030000909090e91e040000909090e94f050000909090488b48086a01ff7108ff71204151415053ff31ff71284c8d442438488b5c2428488b442430488b542410ff12488b442438488b4810488b510848833a03750b488b5a08483b5c2418746648833a037506488b5a10eb3c48833a017506488b5a08eb3048c7c301000000488b720840f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdb48c7c601000000488b7c240840f6c701752740f6c601740d4883c602eb05e9190200007105ff5570ebee488b7f08483b65187303ff5548ebd3f6c301750940f6c6017503ff5570483bde7473ff30564889df48c7c3030000004889f848baa05f06c9a37f00009090ff15fa0400005048c7c303000000488b44240848baa05f06c9a37f0000909090ff15e2040000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f802000000eb05e9680100004889480848b9e0c719c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b900c819c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b920c819c9a37f000048890890ff150604000048bb80ce17c9a37f0000ff15fe0300009090ff15fe030000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f804000000488b542428488950184889481048c740080100000048c70003000000488b4c2420488b591848c70303000000488b5160909090ff12eb17488b1c2448890348c7c001000000eb0748c7c0010000004c8b5424204883c4084c8b4c24104c8b44240848bb48c819c9a37f0000584883c418909090ff1522030000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70101000000498d57b8483b55107303ff55404989d748c742f80200000048c742080100000048890a4889c1488d421848c740f80500000048895020488b542408488950185a4883c408488950104889480848c7000b000000c348b8d09507c9a37f0000c34151415053ff7018488b4008e81efcffff504c8b4c24204c8b442418488b5c2410488b4424089090e802fcffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4204889480848c70005000000c3488b4808498d47e0483b45107303ff55404989c748c740f803000000488b510848895010488b194889580848c7000d000000c3ff70104d89ca4d89c14989d848bb48c819c9a37f0000488b400890ff15f60100009090ff15f60100004889c34889d8ff15f2010000498d4fe0483b4d107303ff55404989cf48c741f803000000488b1424488951104889410848c701010000004883fa017542498d47f0483b45107303ff55404989c748c740f801000000c640ff40488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000498d47e0483b45107303ff55404989c748c740f803000000488948104889580848c700070000004883fa01755f498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f00004889114889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004889114883c408c34883c408c34d89ca4d89c14989d848bb48c819c9a37f0000488b4008909090ff15d600000048c7c303000000909090ff15ce0000004889c34889d8ff15ca000000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000c390909000000000000000002806000000000000|@8481,2097151,@17964,@194,@194,@109,@7855,@8482,@8483,@8484,@8010,@8485,@8486,@8016,@8480|14,0,$8474+30 318,0,@193 349,0,@193 426,0,@8475 503,0,@8476 576,0,@8477 596,0,@7849 684,0,@1294 824,0,@8478 968,0,@1394 1135,0,@8478 1364,0,@573 1445,0,@8478 8475:S13|2074797065287329206e6f7420 8476:S11|2920726571756972657320 8477:S18|5479706520636f6e7374727563746f722028 8478:O1|@8474 8479:S26|545950455f5452454528292e61737369676e5479706573283329 8480:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17970| 8481:S46|545950455f5452454528292e61737369676e54797065732833297479706546726f6d547970655061727365283129 8482:D3,312|483b65187303ff5548a801756948837808017567498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb0ae99d000000e901000000c3498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c70107000000f6c1017415488b500848b8f86f07c9a37f0000488b5d0890ff1351488b50084889d0e832ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b878d017c9a37f0000c3909090909000000000000000003001000000000000|@7859,7,@17965|65,0,@1294 178,0,@1294 236,0,@833 282,0,@7853 8483:D3,144|483b65187303ff5548a801756941524151415053ff70084d89d14c8b442418488b5c2410488b00488b542408ff12504c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c3909000000000000000008800000000000000|@1363,1048575,@17966| 8484:D4,408|483b65187303ff5548a801755e488b08488b1141524151415053ff7008ff324d89d14c8b442420488b5c2418488b4108488b542410909090ff125950f6c101740948c7c003000000eb08488b01488d440001a80174084883f8037f08eb58f640ff107557f6c1017410eb05e90e01000048c7c003000000eb08488b01488d440001a80174084883f8017e08eb18f640ff10741248b8f07206c9a37f0000488b5d089090ff13f6c1017516480fb64108488d440001eb0de958000000e9530000004889c84883f861754af6c101740948c7c003000000eb08488b01488d440001a80174064883e8027105ff5570ebf54989c048c7c3030000004889c890ff15ae0000004889c1483b65187303ff5548e929ffffff4889c8498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901514c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8aafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c3909000000000000000009001000000000000|@1363,1048575,@17967,@3795|149,0,@219 8485:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17968| 8486:D3,144|483b65187303ff5548a801756941524151415053ff70084d89d14c8b442418488b5c2410488b00488b542408ff12504c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c3909000000000000000008800000000000000|@1363,1048575,@17969| 8487:S6|56616c75653a 8488:O2|3,@8489 8489:S11|436f6e73747261696e743a 8490:O2|3,@8491 8491:S33|54797065206d69736d6174636820696e207479706520636f6e73747261696e742e 8492:O7|@8366,2,@661,@1394,@390,0,0 8493:S49|4964656e746966696572206265666f72652060617327206d757374206e6f74206265206120636f6e7374727563746f722e 8494:O1|@8495 8495:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17971| 8496:S51|436f6e7374727563746f72206d757374206265206170706c69656420746f20616e20617267756d656e74207061747465726e2e 8497:O1|@8362 8498:D3,88|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff7240ff72484c8b52204c8b4a184c8b42104889de488b5a0848ba30d019c9a37f000056ff229090909090909000000000000000005000000000000000|@8499,1048575,@17972|54,0,@8497 8499:S79|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e28362970726f63657373456c656d656e74283129 8500:O1|@8501 8501:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa0d119c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@8506,7,@17975|29,0,@8502 8502:D4,56|483b65187303ff5548488b4a084c8b51084c8b094c8b4010488b5808488b304889f0ff252800000000000000000000003000000000000000|@8504,2097151,@17973,@8503| 8503:D7,616|483b65187303ff55484c89d64c89c74989db4989c441ff712841ff713041ff713841ff714041ff714841ff715041ff715841ff716041ff716841ff717041ff717841ffb1800000004d8b5120498b4118498b4910498b5108498b194989c14989c84889d84889d390ff1512020000498d4fe8483b4d107303ff55404989cf48c741f8020000004c89610848c70107000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff135156574889c34c89d848ba682b18c9a37f0000ff15c60100004889c648c7c001000000ff15be0100005649c7c2010000004c8b4c24104989c048c7c3214e0000488b44240848ba40a507c9a37f0000ff159a010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c390909090909000000000000000006002000000000000|@8505,2097151,@17974,@8349,@8028,@1323,@1416|155,0,@1294 180,0,@8026 240,0,@1415 307,0,@833 348,0,@2099 389,0,@833 466,0,@833 577,0,@1294 8504:S50|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129283129 8505:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283529 8506:S47|54595045434845434b5f50415253455452454528292e706173733228352976616c547970654d657373616765283129 8507:S4|4974656d 8508:S40|456c656d656e747320696e2061206c697374206861766520646966666572656e742074797065732e 8509:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734d6174636854726565283229 8510:D3,216|498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048be20d719c9a37f000048893248894a08488062ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf90d819c9a37f000048893e48894e0848894610488066ffbf498d47e8483b45107303ff55404989c748c740f80200000048bf88da19c9a37f000048893848894808488060ffbf488913488973084889431048c7c001000000c3909090900000000000000000d000000000000000|@8521,63,@17982|61,0,@8511 107,0,@8515 157,0,@8519 8511:D4,48|483b65187303ff5548488b5208488b124889c34889d0ff252c0000009090909000000000000000002800000000000000|@8513,1048575,@17977,@8512| 8512:D3,112|483b65187303ff5548a8017545488b08ff7108ff3153488b48084889c8e8deffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b4c24084889085a4883c410ff2248c7c001000000c390909090909000000000000000006800000000000000|@8514,1048575,@17978| 8513:S36|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c79283129 8514:S43|5554494c49544945535f28292e6e6f4475706c6963617465732831296170706c792831296170706c283129 8515:D4,56|483b65187303ff55484c8b4a104c8b4208488b5808488b084889c8ff252f0000009090909090909000000000000000003000000000000000|@8517,1048575,@17979,@8516| 8516:D3,248|483b65187303ff5548498b08f6c1017558488b11483b027455f602017555a8017551a801740948c7c603000000eb08488b30488d7436014883c6104889f7488b324989fa4889c74c8b59084c89d148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017416eb26e932000000e9060000004c8b5908eb164c8b59084c89c14989d84889de488b5a084c89caff224c89d9483b65187303ff5548e96cffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048895908488901498b10488d711848c746f8020000004889560848890e4989304889c148c7c001000000c390909090900000000000000000f000000000000000|@8518,1048575,@17980| 8517:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283129 8518:S36|5554494c49544945535f28292e6e6f4475706c696361746573283129656e746572283229 8519:D3,192|488b5208488b12f6c2017552488b0a483b017455f60101754aa8017546a801740948c7c303000000eb08488b18488d5c1b014883c310488b314889c74c8b41084889d948d1e9483bc9f3a6488d7c3f01488d743601488d4c09017411eb2ee93b0000004c8b4108eb234c8b41084889c1498d47f0483b45107303ff55404989c748c740f8010000004c8900c3488b5208483b65187303ff5548e969ffffff4889c148c7c001000000c3909090909090900000000000000000b800000000000000|@8520,127,@17981| 8520:S37|5554494c49544945535f28292e6e6f4475706c6963617465732831296c6f6f6b7570283129 8521:S28|5554494c49544945535f28292e6e6f4475706c696361746573283129 8522:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18009| 8523:S62|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e283629 8524:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@17984,@8347| 8525:D15,992|488dbc2438ffffff483b7d187303ff55506a016a014989c34d89cc4c8b2b4c8b73084889e34c89c0ff15ca030000488b0424483b05c70300007431a801753d4889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901751041534154488b4424184c89eaff12eb58415341544d89e14989c04c89f348b8688c19c9a37f000090ff156e030000a8017565488b08488b5110488b5918f6c301753d488b3348833e017522498d7ff0483b7d107303ff55404989ff48c747f801000000488937eb1ee91e020000488b73084889f3483b65187303ff5548ebbe48c7c70100000040f6c7017550488b1f48833b017547eb05e9be010000498d77d0483b75107303ff55404989f748c746f8020000004c8b43084c89460848c706070000004c8d4e1849c741f80200000049c7410801000000498931eb0749c7c1010000006a016a016a016a016a016a016a016a016a016a016a016a016a01415151ff7220488d5c2418488b0248ba00dd07c9a37f0000909090ff1586020000488b842498000000488b54244890ff124883f801750948c7c001000000eb71488b08498d57e8483b55107303ff55404989d748c742f80200000048bb80e119c9a37f000048891a488b1c2448895a08488062ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be40e219c9a37f0000488933488bb424900000004889730848895310488063ffbfeb05e9d1000000ff7120ff7110ff7108ff314989d848bb68e419c9a37f0000488b411890ff15d6010000498d4fc0483b4d107303ff55404989cf48c741f80700000048c741300100000048c7412801000000488b5424184889512048894118488b44241048894110488b44240848894108584883c4184889014c8b442410488b5c24084889c89090ff157a0100004889c1498d47f0483b45107303ff55404989c748c740f801000000488908eb2a48b8b8e419c9a37f00006a016a016a016a016a016a016a016a016a016a016a016a016a016a016a016a014881c4800000004883f801756748bbe0ef0ac9a37f0000488b442408ff1516010000488b5c241890ff151201000048bb508e19c9a37f0000ff150a010000488b4c2410483b0d060100007439f6c10175404889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01eb05e958000000488d743601488d4c0901750c48b9509adc0000000000eb1f4989c2488b5c241048b8788e19c9a37f000090ff15ae0000004889c14c89d04889cb90ff15a6000000488b14249090ff1248b810cf19c9a37f00004883c420c3488b004883c420c3909090909090900000000000000000d803000000000000|@8538,2097151,@17990,@1348,I48,@8408,@1484,@1390,@8537,@100,@100,@100,I48,@100,@100|68,0,I48 139,0,@8371 377,0,@1483 454,0,@8526 504,0,@8528 559,0,@8534 712,0,@8536 767,0,@3232 800,0,@8386 838,0,I48 887,0,I48 907,0,@8387 948,0,@8492 8526:D3,88|483b65187303ff5548488b480848833901752a488b4118488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005000000000000000|@8527,1048575,@17985| 8527:S41|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70794964283129 8528:D4,176|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bb20e319c9a37f0000488919488b5a0848895908488061ffbf6a016a016a014889e65649c7c2010000004989c949b8d8e319c9a37f0000488b5a10909090ff1562000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c3909090909090900000000000000000a800000000000000|@8533,2097151,@17988,@1554|35,0,@8529 81,0,@8531 8529:D5,56|483b65187303ff55484989c248c7c35d000000488b420890ff15320000004c89d3ff25310000009000000000000000003000000000000000|@8530,511,@17986,@100,@100| 8530:S49|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129283129 8531:O1|@8532 8532:D3,24|c39090909090909000000000000000001000000000000000|@8530,1,@17987| 8533:S46|56414c55455f4f505328292e6c6f6f6b757056616c7565283429666f756e642d636f70696564547970652d283129 8534:O1|@8535 8535:D3,24|c39090909090909000000000000000001000000000000000|@8533,1,@17989| 8536:O1|@8492 8537:D5,368|483b65187303ff5548488b481048833903756a498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c7020300000048837820017425488b70184889d74c8b48084c8b10488b58204c89c09090ff152a0100004989c04889faeb0b488b70184c8b48084c8b10498d47c0483b4510730aeb05e932000000ff55404989c748c740f80700000048c740300100000048c74028010000004c89402048897018488950104c8948084c8910c3488339017558498d57e0483b55107303ff55404989d748c742f80300000048895a10488b590848895a0848c702090000004883782001742b488b70184889d74c8b48084c8b10488b58204c89c0909090ff15860000004989c04889faeb10e947000000488b70184c8b48084c8b10498d47c0483b45107303ff55404989c748c740f80700000048c740300100000048c74028010000004c89402048897018488950104c8948084c8910c3c39000000000000000006801000000000000|@8540,511,@17991,@8541,@8539| 8538:S26|56414c55455f4f505328292e6c6f6f6b757056616c7565283429 8539:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17993| 8540:S28|56414c55455f4f505328292e6d6b53656c6563746564566172283329 8541:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@17992| 8542:D11,576|483b65187303ff5548488b481048833907755d4883790811755b48bab8c019f1a37f0000488b124c8b50184989db488b184889d0ff151e0200009090ff151e0200004983fb01743249833a0574134889c148b878ea19c9a37f0000488b5d08ff13415250498b4210ff15fa010000eb51e987010000e98201000049833a057538498b4a0848833907751ef64108017518488b5108488b1a415250488b43089090ff15ca010000eb194152504889c89090ff15c2010000eb094889c14c89d04152514883380d74164889c148b800eb19c9a37f0000488b5d08909090ff13f6042401754a488b0c244883790801753f488b11498d5fd0483b5d107303ff55404989df48c743f80500000048c743200100000048895318488b324889731048c743080100000048c7030b000000eb71498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f0000488911498d5fc8483b5d107303ff55404989df48c743f80300000048c74310f170020048894b0848c7030d000000488d532048c742f802000000488b34244889720848c70209000000eb05e903000000488911498d4fe0483b4d107303ff55404989cf48c741f80300000048ba98eb19c9a37f00004883c40848891148895908488b400848894110488061ffbf6a016a014989e04889cb488b44241090ff158a000000584883c410c36a016a014989e048bb40ec19c9a37f0000488b48184889c8ff156e000000488b44240890ff156a000000584883c408c39090909000000000000000003802000000000000|@8554,2097151,@17996,@8555,@8553,@1401,@1401,@1401,@1382,@1382,@8195|28,0,@20169 83,0,@8543 204,0,@8546 331,0,@573 448,0,@8549 517,0,@8551 8543:O4|@20055,@557,@8545,@8544 8544:O5|@1338,2522,0,2522,0 8545:S26|676574526573756c74202d206e6f7420612066756e6374696f6e 8546:O4|@20055,@557,@8548,@8547 8547:O5|@1338,2537,0,2537,0 8548:S42|67656e6572616c6973654f7665726c6f6164202d20617267206973206e6f742061207479706520766172 8549:D3,72|488b00483b42107520498d47f0483b45107303ff55404989c748c740f801000000488b5208488910c348c7c001000000c39090909090909000000000000000004000000000000000|@8550,5,@17994| 8550:S38|545950455f5452454528292e67656e6572616c6973654f7665726c6f6164283329742d283129 8551:O1|@8552 8552:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@17995| 8553:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@17998| 8554:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296f7665726c6f616454797065283229 8555:D3,256|483b65187303ff5548a801755c488b08483b197459f6c3017559f601017554488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104889de488b394c8b41104c8b49084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741eeb6ae979000000e90a0000004c8b41104c8b4908eb5b4c8b41104c8b4908498d4fe8483b4d107303ff55404989cf48c741f8020000004c8941084c890951488b4008e852ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908eb0ae906000000e901000000c3488b4008e919ffffff48c7c001000000c3900000000000000000f800000000000000|@8556,255,@17997| 8556:S42|5052494e545f5441424c4528292e6765744f7665726c6f6164732831297365617263684c697374283129 8557:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@17999,@8347| 8558:D4,48|483b65187303ff55484989d94889c348c7c003000000ff252c0000009090909000000000000000002800000000000000|@8562,1048575,@18000,@8559| 8559:D7,464|483b65187303ff5548f6c301740948c7c103000000eb08488b0b488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67e0848c7c001000000c34889c1f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d08eb32f641ff10752cf6c301740948c7c203000000eb08488b13488d541201f6c101740af6c2017405483bcaeb05ff5570ebf67c134889c248b8f07206c9a37f0000488b5d08ff13f6c30174054889d9eb114883c11048d1e9480fb60c0b488d4c09014883f95d75724d89ca4d89c348b8b0f119c9a37f00009090ff150e01000048bbd0f119c9a37f0000ff15060100004152415348bb80ce17c9a37f0000ff15fa0000009090ff15fa000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c7411001000000eb05e96d00000048c741080700000048c70101000000f6c101741048b8f86f07c9a37f0000488b5d08ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b51184883c40848c70203000000488b5160ff22a80174064883c0027105ff5570ebf5e946feffff9090909090900000000000000000c801000000000000|@8563,1048575,@18001,@100,@100,@7855,@8482|147,0,@219 202,0,@8560 220,0,@8561 240,0,@7849 335,0,@1294 8560:S15|7175616c6966696564206e616d6520 8561:S13|20696c6c6567616c2068657265 8562:S28|5554494c49544945535f28292e636865636b466f72446f7473283329 8563:S36|5554494c49544945535f28292e636865636b466f72446f7473283329636865636b283129 8564:D12,536|483b65187303ff5548483b05200200007461a801752d4889c648bf70cb06c9a37f000048c7c11900000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901745d483b05ee0100007459a80175344889c648bfc8ef06c9a37f000048c7c11b00000048d1e9483bc9f3a6488d7c3f01eb05e92a010000488d743601488d4c09017462483b05b5010000745ea80175394889c648bf301b07c9a37f0000eb0ae9fd000000e9f800000048c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017462483b0577010000745ea80175394889c648bf281c07c9a37f0000eb0ae9b7000000e9b200000048c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017459483b05390100007455a80175394889c648bfe0f419c9a37f0000eb0ae971000000e96c00000048c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901744c4983fa017464483b05f5000000743da801eb0ae934000000e92f00000075694889c648bff8f419c9a37f000048c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175574d89ca4989db4d89c44889c348b810f519c9a37f0000ff15a2000000eb05e93400000048bb40f519c9a37f000090ff15920000004c89d14989c2eb05e9160000004989c94d89d848c7c3030000004c89e0ff257700000048c7c001000000c39090909090909000000000000000001002000000000000|@8569,2097151,@18002,@427,@645,@830,@839,@8565,@8566,@100,@100,@8347|27,0,@427 85,0,@645 150,0,@830 220,0,@839 290,0,@8565 378,0,@8566 432,0,@8567 455,0,@8568 8565:S3|726566 8566:S2|6974 8567:S25|526562696e64696e67206f722073706563696679696e672022 8568:S12|2220697320696c6c6567616c 8569:S48|54595045434845434b5f50415253455452454528292e7061737332283529636865636b466f724275696c74496e283529 8570:D4,472|483b65187303ff5548a801755d488b0841524151415053ff7008ff31ff7108ff742440415041514152ffb424880000004c8b5424704c8b4c24784c8b842480000000488b9c2488000000488b4118488b54244090ff12594889015950f6c101740e48c7c003000000eb0de949010000488b01488d440001a80174084883f8037f08eb5ff640ff10755ef6c101740948c7c003000000eb08488b01488d440001a80174084883f8017e08eb16f640ff10741048b8f07206c9a37f0000488b5d08ff13f6c101750c480fb64108488d440001eb034889c84883f8617558f6c1017415eb0ae94c000000e94700000048c7c003000000eb08488b01488d440001a80174064883e8027105ff5570ebf54989c048c7c3030000004889c8909090ff15ce0000004889c1483b65187303ff5548e929ffffff4889c8498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848890151ff742460ff742460ff742460ff742460ff742460ff7424604c8b5424584c8b4c24504c8b442448488b5c2440488b44243890e872feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2300048c7c001000000c230009090909090900000000000000000d001000000000000|@8571,1048575,@18003,@3795|179,0,@219 8571:S74|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352970726f636573735061747465726e2836296d61704c6162656c73283129 8572:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18004| 8573:D4,312|483b65187303ff5548a801757148837808017508488b00498b10ff22ff7318ff7320ff3341ff7010415241ff7008ff731050ff7308415141ff30ff7008488b084889c8488b542408ff12488b4c2418488b54246048894c2460488b4c2420488b5c245848894c2458488b4c2428488b74245048894c2450488b4c2430eb05e94b000000488b7c244848894c2448488b4c24384c8b44244048894c24404c8944243848897c2430488974242848895c24204c8b5424104c8b4c240841584883c41848c7c30300000052ff2582000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000c3909000000000000000003001000000000000|@8578,2097151,@18005,@8574|236,0,@573 8574:D19,2312|488dbc2460ffffff483b7d187303ff555041f6c00175684152415141ff70085341ff3050488b4424084c89caff12504889c3488b44240848bab06507c9a37f0000909090ff15d6080000a801756a488b4c2430488b30ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb180000000eb05e96f0800004c8b51204c8b49184c8b4110488b5908488b0190ff158a08000048837c241803752a4989f24989c348bba8031ac9a37f0000eb05e9a2070000488b842480000000909090ff1562080000eb604989f24989c348bbc0031ac9a37f0000488b842480000000ff154a080000415241535048c7c303000000488b44243048baa05f06c9a37f0000909090ff152e0800004889c3589090ff152a08000048c7c375000000909090ff1522080000eb0441524153498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134889ce488b5c2428488b842488000000909090ff15d2070000564c8b8c24800000004c8b442408488b9c2488000000ff15be070000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889ce48c7c00100000090ff15620700005649c7c2010000004c8b8c24800000004989c048c7c3214e0000488b44242848ba40a507c9a37f000090ff153a070000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134889c1498d47e8483b45107303ff55404989c748c740f802000000488b54246848895008488b5c243848891851488b54246890ff12488b4c2428f6c10174064883c1027105ff5570ebf55048c7c3030000004889c848baa05f06c9a37f0000ff158a050000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad8031ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700410000004889c1488d401848c740f80200000048894808488b8c2498000000488908ff15220500004889c1498d47e0483b45107303ff55404989c748c740f803000000488b54241848895010488b542428488950084889085a90ff124889c649b9d04e19c9a37f00004c8b4424704c89c3488b44244048bae84e19c9a37f00009090ff15ca040000564889c1488b4424104889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424684889510848c70107000000f6c10174164889c348b8f86f07c9a37f0000488b5d08909090ff13498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488903488d431848c740f8020000004889580848bb78ec08c9a37f0000488918498d5fe8483b5d107303ff55404989df48c743f8020000004889430848b8d85d19c9a37f0000488903498d47d0483b45107303ff55404989c748c740f8050000004889582048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c348b8f86f07c9a37f0000488b5d0890ff13498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488903488d431848c740f8020000004889580848bb781b07c9a37f0000488918498d5fe8483b5d107303ff55404989df48c743f8020000004889430858488903498d47e8483b45107303ff55404989c748c740f8020000004889580848bb781b07c9a37f0000488918498d5fe8483b5d107303ff55404989df48c743f80200000048894308584883c408488903498d47e8483b45107303ff55404989c748c740f8020000004889580848bb781b07c9a37f0000488918498d5fb8483b5d107303ff55404989df48c743f8020000004889430848890b488d431848c740f8050000004889582048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c24304889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff153e020000564889c3488b44245048ba682b18c9a37f0000909090ff152a020000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542448488950185b488958104889480848c70003000000488b4c2430488b591848c70303000000488b51609090ff12488b442418a80174064883c0027105ff5570ebf5488b8c2480000000488b542478488b5c2470488b742468488b7c24604c8b4424584c8b4c24504c8b5424484c8b5c244048898c2480000000488954247848895c2470488974246848897c24604c894424584c894c24504c895424484c895c24404c8b5424304c8b4c24284c8b4424204889c348b8d09507c9a37f00004883c438e9a1f7ffff488b442418a80174064883c0027105ff5570ebf5488b8c2480000000488b542478488b5c2470488b742468488b7c24604c8b4424584c8b4c24504c8b5424484c8b5c244048898c2480000000488954247848895c2470488974246848897c24604c894424584c894c24504c895424484c895c24404c8b5424304c8b4c24284c8b4424204889c34883c408584883c428e90df7ffffc24800909000000000000000000009000000000000|@8580,2097151,@18006,@1633,@8349,@100,@100,@194,@100,@100,@4963,@8579,@1323,@1416,@194,@109,@8310,@8349,@8028|57,0,@1292 174,0,@8575 216,0,@8576 257,0,@193 350,0,@1294 484,0,@1294 551,0,@1415 619,0,@833 660,0,@2099 701,0,@833 774,0,@833 889,0,@1294 992,0,@193 1032,0,@8577 1175,0,@8308 1198,0,@8309 1280,0,@1294 1350,0,@2141 1391,0,@8326 1470,0,@1294 1538,0,@833 1611,0,@833 1688,0,@833 1786,0,@1294 1885,0,@8026 2126,0,@1394 8575:S3|20313a 8576:S4|7320312d 8577:O2|58,0 8578:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c697374283329 8579:D4,760|483b65187303ff554841f6c00174084983f8017f14eb0741f640ff10740b48b8008e07c9a37f0000c3a801755848837808017556488b08498d47e8483b45107303ff55404989c748c740f8020000004c8940084889084c89ca909090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3e952020000488b08488b5008498d47e8483b45107303ff55404989c748c740f8020000004c8940084889084150415153524c89ca909090ff1248837c240859745a48837c2408777457488b4c2408483b0d360200007457f6c10175494889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740948c7c101000000eb3548c7c103000000eb2ce920000000e91200000048c7c101000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f102498d57e0483b55107303ff55404989d748c742f80300000048c742100100000048894a0848c70203000000f6c20174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b5c24084889590848c70107000000f6c10174134889c648b8f86f07c9a37f0000488b5d08ff13498d7788483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f80200000048897108488911488d511848c742f80200000048894a08488902488d421848c740f8050000004889502048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2418f6c10174064883e9027105ff5570ebf5504c8b4c24184989c8488b44240890e872fdffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c3909090900000000000000000f002000000000000|@8581,1048575,@18007,I48|32,0,@1374 230,0,I48 389,0,@1294 455,0,@1294 598,0,@1294 684,0,@833 8580:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833296170706c794c697374283329 8581:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737369676e4c6973742833297072696e744c697374283429 8582:D3,208|483b65187303ff5548a801756d41524151415053ff7008ff742430415041514152ff7424784c8b5424604c8b4c24684c8b442470488b5c2478488b00488b542430909090ff1250ff742460ff742460ff742460ff742460ff742460ff7424604c8b5424584c8b4c24504c8b442448488b5c2440488b442438eb05e9310000009090e87affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2300048c7c001000000c230009090909090900000000000000000c800000000000000|@1363,1048575,@18008| 8583:O1|@8584 8584:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba90091ac9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@8589,7,@18012|29,0,@8585 8585:D4,56|483b65187303ff5548488b4a084c8b51084c8b094c8b4010488b5808488b304889f0ff252800000000000000000000003000000000000000|@8587,2097151,@18010,@8586| 8586:D8,952|483b65187303ff55484c89d64c89c74989db4989c441ff712841ff713041ff713841ff714041ff714841ff715041ff715841ff716041ff716841ff717041ff717841ffb1800000004d8b5120498b4118498b4910498b5108498b194989c14989c84889d84889d390ff1562030000498d4fe8483b4d107303ff55404989cf48c741f8020000004c89610848c70107000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff134889c2f6c20174064883ea027105ff5570ebf551565741ff33504889d3498b430848ba682b18c9a37f0000ff15fe02000059f6c10174064883e9027105ff5570ebf5504889cb488b44240848ba682b18c9a37f00009090ff15da020000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8908f18c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134889c648c7c00100000090ff15c60100005649c7c2010000004c8b4c24104989c048c7c3214e0000488b44240848ba40a507c9a37f0000ff15a2010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c39090909090900000000000000000b003000000000000|@8588,2097151,@18011,@8349,@8028,@8028,@1323,@1416|155,0,@1294 204,0,@8026 246,0,@8026 315,0,@833 356,0,@8120 397,0,@833 512,0,@1294 576,0,@1415 643,0,@833 684,0,@2099 725,0,@833 802,0,@833 913,0,@1294 8587:S52|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129283129 8588:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283529 8589:S49|54595045434845434b5f50415253455452454528292e70617373322835296d61746368547970654d657373616765283129 8590:S6|436c61757365 8591:S37|436c617573657320696e2063617365206861766520646966666572656e742074797065732e 8592:S3|49663a 8593:O2|3,@8594 8594:S46|436f6e646974696f6e20696e2069662d73746174656d656e74206d7573742068617665207479706520626f6f6c2e 8595:S5|5468656e3a 8596:S5|456c73653a 8597:O2|3,@8598 8598:S46|54797065206d69736d61746368206265747765656e207468656e2d7061727420616e6420656c73652d706172742e 8599:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796848897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@18013,@8600,@8370| 8600:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18014,@8347| 8601:D5,80|483b65187303ff55484d89c24989d348bbd0dc18c9a37f0000909090ff15460000004c89d14989c24989c94d8b431048c7c303000000498b4308ff253000000000000000000000004800000000000000|@8602,2097151,@18015,@100,@8347|17,0,@8231 8602:S66|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296d657373466e283329 8603:D4,88|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff7240ff7248ff7250ff72584c8b52204c8b4a184c8b42104889de488b5a0856ff252f0000009090909090909000000000000000005000000000000000|@8361,2097151,@18016,@8343| 8604:S46|436c617573657320696e20666e2065787072657373696f6e206861766520646966666572656e742074797065732e 8605:D4,88|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff7240ff7248ff7250ff72584c8b52204c8b4a184c8b42104889de488b5a0856ff252f0000009090909090909000000000000000005000000000000000|@8361,2097151,@18017,@8343| 8606:S40|436c617573657320696e2068616e646c6572206861766520646966666572656e742074797065732e 8607:O5|5,0,@445,@448,0 8608:O1|@8291 8609:D3,88|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff7240ff7248ff7250ff72584c8b52204c8b4a184c8b42104889de488b5a0848bad8131ac9a37f000056ff229000000000000000005000000000000000|@8610,1048575,@18018|60,0,@8608 8610:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283129283129 8611:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18019| 8612:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18020| 8613:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18021| 8614:D4,176|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bbe8161ac9a37f000048891848894808488060ffbf5251488b5a104889da9090ff1258488b00488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252c000000909090900000000000000000a800000000000000|@8617,1048575,@18023,@8616|73,0,@8615 8615:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18022| 8616:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18024| 8617:S69|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c7565732832296c6f63616c456e762d283129 8618:O1|@8619 8619:D3,24|48c7c001000000c300000000000000001000000000000000|@8617,1,@18025| 8620:D3,112|483b65187303ff5548488b4a18488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b480848890b488b721848891e5052488b5a104889da90ff12488b0424488b40084883c408488b4810584889caff229090909000000000000000006800000000000000|@8621,1048575,@18026| 8621:S68|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229626f6479456e762d283129 8622:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4818584889caff229090909000000000000000003800000000000000|@8621,1048575,@18027| 8623:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4850584889caff229090909000000000000000003800000000000000|@8621,1048575,@18028| 8624:O1|@8625 8625:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18029,@375| 8626:O1|@8627 8627:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18030,@375| 8628:O1|@8629 8629:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18031,@375| 8630:O1|@8631 8631:D3,48|498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c300000000000000002800000000000000|@8632,73,@18032| 8632:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229283329 8633:O1|@8634 8634:D3,48|498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c300000000000000002800000000000000|@8632,73,@18033| 8635:O1|@8636 8636:D3,48|498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c300000000000000002800000000000000|@8632,73,@18034| 8637:O2|@8639,@8638 8638:O2|@8639,0 8639:O5|5,0,@405,@404,0 8640:O2|3,@8641 8641:S45|417267756d656e7473206f66206f72656c7365206d7573742068617665207479706520626f6f6c2a626f6f6c2e 8642:S6|52616973653a 8643:O2|3,@8644 8644:S42|457863657074696f6e20746f20626520726169736564206d757374206861766520747970652065786e2e 8645:D5,136|483b65187303ff55484d8b400841f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bbd0dc18c9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8602,2097151,@18035,@100,@8347|54,0,@8345 70,0,@8231 8646:S6|5768696c653a 8647:O2|3,@8648 8648:S55|4c6f6f7020636f6e646974696f6e206f66207768696c652d65787072657373696f6e206d7573742068617665207479706520626f6f6c2e 8649:S45|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529 8650:D9,824|488dbc2430ffffff483b7d187303ff555041f6c10174064983c1027105ff5570ebf54889c1498d47e8483b45107303ff55404989c748c740f80200000048ba30231ac9a37f00004889104c894808488060ffbf4152415151534150488b139090ff12488b0424488b08498d47e0483b45107303ff55404989c748c740f80300000048bad0251ac9a37f0000488910488b54242048895008488b5c241848895810488060ffbf4889caff12498d47e0483b45107303ff55404989c748c740f80300000048b9682a1ac9a37f0000488908488b4c246848894808488b54246048895010488060ffbf6a016a016a014889e390ff155a0200006a016a016a014889e348c7c0010000009090ff154a020000ff742450ffb42498000000ff7424584c8b9424a00000004c8b8c24b00000004c8b442420488b5c2438488b442458ff151e0200004889c1488b54244050f6c101756cf6c201756cff7208ff7108ff742448ff742420ffb424a8000000ffb424c8000000ffb424b0000000ffb424b0000000ffb424b0000000ffb42498000000ffb424b8000000ffb424e8000000ffb424f80000004c8b9424a80000004c8b8c24800000004c8b8424c0000000eb0ae929000000e924000000488b1a488b01ff1596010000488b542408594883c408483b65187303ff5548e961ffffff48c7c001000000584883c418488b4c24284883f80175184883f901746e48b8a03f0bc9a37f0000488b5d089090ff13f6c1017417488b5008488b1848b8a03f0bc9a37f0000488b5d08ff13488b11ff7108ff7008ff7210ff30488b420890ff1522010000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba882b1ac9a37f0000488911eb05e968000000488b94249800000048895108488b9c24a000000048895910488061ffbf51ffb424980000004c8b5424184989d94989c0488b5c2460488b44241048ba802c1ac9a37f00009090ff15b2000000488b4c24184883c410584883c408483b65187303ff5548e919ffffff498d47e8483b45107303ff55404989c748c740f80200000048b950481ac9a37f0000488908488b4c243848894808488060ffbf5a4883c438594883c44051ff2290909090909000000000000000003003000000000000|@8936,2097151,@18166,@8510,@8796,@8937,@8925,@8819,@8664|63,0,@8651 131,0,@8655 196,0,@8659 521,0,@3339 551,0,@3339 616,0,@8661 694,0,@8663 764,0,@8681 8651:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@8653,2097151,@18037,@8652| 8652:D4,352|483b65187303ff5548498d47e0483b45107303ff55404989c748c740f803000000488b4b0848894810488b134889500848c7000d0000004150909090ff15360100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b48104883e1094883f901740948c7c101000000eb0748c7c1030000004883f102488b50104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933f60424017517488b3c24488b37f647ff10740348f7de488d743601eb04488b3424488d34f5f9ffffff4883f901750948c7c101000000eb0748c7c109000000480bce4883c905480bca498d57e0483b55107303ff55404989d748c742f80300000048894a1048895a0848c7020d000000488b40084883c40848891048c7c001000000c390909000000000000000005801000000000000|@8654,2097151,@18038,@1401|77,0,@1384 191,0,@573 8653:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283129 8654:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833295f2d283229 8655:D4,56|483b65187303ff55484c8b4a104c8b4208488b5808488b084889c8ff252f0000009090909090909000000000000000003000000000000000|@8653,2097151,@18039,@8656| 8656:D5,392|483b65187303ff5548415153498b5060ff124883f801756c488b0424488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c7000d0000009090ff154e0100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b48104883e1094883f901740e48c7c101000000eb0ce9dc00000048c7c1030000004883f102488b50104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933f6442408017518488b7c2408488b37f647ff10740348f7de488d743601eb05488b742408488d34f5f9ffffff4883f901750948c7c101000000eb0748c7c109000000480bce4883c905480bca498d57e0483b55107303ff55404989d748c742f80300000048894a1048895a0848c7020d000000488b400848891048c7c0010000004883c410c3488b1c24488b004883c410ff2532000000909000000000000000008001000000000000|@8654,2097151,@18040,@1401,@8657|93,0,@1384 212,0,@573 8657:D5,520|483b65187303ff55484889c1498d47e0483b45107303ff55404989c748c740f803000000488b510848895010488b314889700848c7000d0000005351ff15de0100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b4c2408488b5008488b5810498d47e0483b45107303ff55404989c748c740f803000000488b710848897010488b394889780848c7000d00000052539090ff15860100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b0c2448c1e9034883c901f6c10174084883f9017d2ceb06f641ff107424ff7008ff70104889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb0d488b5008488b58104889c852535948c1e9034883c901f6c10174084883f9017d27eb06f641ff10741f504889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb074889c24889c852a801740ef60424017408483b04247d4eeb05ff5570ebf3488b442428498d4fe0483b4d107303ff55404989cf48c741f803000000488b500848895110488b184889590848c7010d000000488b74241848890e48c7c0010000004883c430c3488b442420498d4fe0483b4d107303ff55404989cf48c741f803000000488b500848895110488b184889590848c7010d000000488b74240848890e48c7c0010000004883c430c39090909000000000000000000002000000000000|@8658,2097151,@18041,@1401,@1401|77,0,@1384 173,0,@1384 231,0,@376 241,0,I106 303,0,@376 313,0,I106 8658:S27|545950455f5452454528292e6c696e6b5479706556617273283229 8659:D5,136|483b65187303ff55484d8b402041f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bbd0dc18c9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8660,2097151,@18042,@100,@8347|54,0,@8345 70,0,@8231 8660:S75|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e2833296e6577456e762d283329 8661:D5,128|483b65187303ff5548488b42104889d6ff7028ff7030ff7038ff7040ff7048ff7050ff7058ff7060ff7068ff7070ff7078ffb0800000004c8b50204c8b48184c8b4010488b5808488b084889c8909090ff15420000004889c3488b460848ba682b18c9a37f0000ff253300000090909000000000000000007800000000000000|@8662,2097151,@18043,@8349,@8028|95,0,@8026 8662:S45|54595045434845434b5f50415253455452454528292e7061737332283529666f756e644e656172283129283129 8663:O12|@8664,@1415,@20051,@469,@20085,@1587,@20087,@1597,@20089,@1605,@20056,@477 8664:D8,448|488dbc2460ffffff483b7d187303ff5550498b4968f6c101753e488b31488b3e483b3db1010000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb194c8b59084c89d9483b65187303ff5548ebbd49c7c3010000004983fb01756948b998c809c9a37f0000f6c101753e488b31488b3e483b3d5f010000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb194c8b59084c89d9483b65187303ff5548ebbd49c7c3010000004983fb01751a4889c148b8c0cf09c9a37f0000eb05e930000000488b5d08ff13498b0b488b31483b350201000074154889c748b878e107c9a37f0000488b5d089090ff13488b7910eb26498b0b488b31483b35e000000074134889c748b878e107c9a37f0000488b5d08ff13488b79104d8d67e84c3b65107303ff55404d89e749c74424f8020000004d8944240849c70424030000006a016a0150ff720850ff742430ff742440415257ff7210ff7218ff7220ff7228ff7230ff7238ff7240ff7248ff7250ff72584d89ca4989d94c8d8424880000004889c34c89e0909090ff155a00000048c7c0010000004883c418c21000909090900000000000000000b801000000000000|@8674,2097151,@18045,@20138,@20138,@20138,@20138,@8665|103,0,@2635 196,0,@2690 237,0,@1486 279,0,@1486 8665:D11,3384|488dbc2408ffffff483b7d187303ff555041505041524151ff7008ff304889d8ff152a0d0000488338077572ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb42498000000eb05e9500000004c8b9424300100004c8b8c24980000004c8b84249000000048bb983c1ac9a37f0000488b4008909090ff15860c0000488b4c2428488b10488911488b58084889590848c7c0010000004883c430c280004883380575726a016a01ff7008ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000ffb424c8000000eb05e974010000ffb424c80000004c8b9424b00000004c8b8c24a80000004c8d842488000000488b5810488b8424b80000009090e85efeffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b4c2408488908488b8c24c8000000488b9424c0000000488b9c24b8000000488bb424b0000000488bbc24a80000004c8b8424a00000004c8b8c24980000004c8b9424900000004c8b9c24880000004c8ba424800000004c8b6c24784c8b74247050488b44247050488b44247050488b44247050488b44247048898c24e800000048899424e000000048899c24d80000004889b424d00000004889bc24c80000004c898424c00000004c898c24b80000004c899424b00000004c899c24a80000004c89a424a00000004c89ac24980000004c89b42490000000488b4c241048898c2488000000488b4c240848898c2480000000594883c41048894c246048894424584c8b5424384c8b4c24304c8b442448488b5c2408584883c448e91cfdffff4883380b756c488b4818488b5110488b5a0848833b05755f48833b057417488b700848b8c05208c9a37f0000488b5d08909090ff13488b78084c8b4310488b73084889fb4889f090ff152e0a0000498d4fe8483b4d107303ff55404989cf48c741f80200000048baa83c1ac9a37f0000eb0ae95c020000e99601000048891148894108488061ffbf6a016a01574c89c04c8d4424084889cbff15e60900006a016a01ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d80000004c8b9424c00000004c8b8c24b80000004c8d842480000000488b9c2498000000488b8424c8000000909090e8dafbffff6a016a01ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424900000004c8b9424d80000004c8b8c24d000000049b8983c1ac9a37f0000488d9c2488000000488b8424a800000090ff159e080000488b442460594883c430488908488b4c24084889480848c7c0010000004883c430c28000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424980000004c8b9424300100004c8b8c24980000004c8b84249000000048bb983c1ac9a37f0000488b70084889f090ff15e2070000488b4c2428488b10488911488b58084889590848c7c0010000004883c430c280004883380d7564488b481048c1e9034883c901f6c10174084883f9017d2ceb06f641ff107424ff7008ff70104889cb48b810c506c9a37f000048bad0a8dc0000000000909090ff12eb0d488b5008488b58104889c85253a8017415f644242001740e483b4424207c65eb0ae9d8060000ff5570ebed488b042448c1e8034883c801a80174084883f8017d21eb06f640ff1074194889c348b810c506c9a37f000048bad0a8dc0000000000ff124881f81f4e0000745e488b442408488b00488338097455488b4424184883f002eb05e9120200004883f8017415488b4c2420f6c10174064883e902710cff5570ebf548c7c11f4e0000488b14244883e2054883fa0174634883f801746248837c241001745feb0ae9cd010000e9c80100005150ffb424c0000000ffb424c0000000ffb424c00000004c8b9424e00000004c8b8c24e80000004c8b44245048bb603d1ac9a37f000048b8903d1ac9a37f000090ff1566060000eb0fe913000000e90e000000e90900000048c7c001000000eb0a4889c2488b4424105152488b4c24104883e1094883f901740948c7c101000000eb0748c7c1030000004883f10248833c24017425488b5424104883e2054883fa01740948c7c201000000eb0748c7c2030000004883f202eb0748c7c201000000488b5c24104883e3034883fb01740948c7c301000000eb0748c7c3030000004883f302498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f00004883c40848893ef604240175184c8b0424498b3841f640ff10740348f7df488d7c3f01eb04488b3c24488d3cfdf9ffffff4883f901750948c7c101000000eb0748c7c109000000480bcf4883fa01750948c7c201000000eb0748c7c205000000480bca480bcb498d57c8483b55107303ff55404989d748c742f80300000048894a104889720848c7020d000000488b4c24104883c408488b0948890e488b4c2408488911488d522048c742f802000000488b5c241848895a08488902eb0b488b5424304883c4086a01488b4424084883c408488b004883bc2490000000037565488338097564488b48084883f901750948c7c101000000eb3a488b19488b7310488b7e0848833f0375174c8b8424880000004c3b4708750948c7c103000000eb124c8b41084c89c1483b65187303ff5548ebb74883f9017431498d47f0483b4510730feb0ae9bf020000e967020000ff55404989c748c740f801000000488b8c2480000000488908eb6a488b48084883f901750948c7c101000000eb37488b19488b7310488b7e0848833f0375144c8b4424784c3b4708750948c7c103000000eb124c8b41084c89c1483b65187303ff5548ebba4883f9017429498d47f0483b45107303ff55404989c748c740f801000000eb05e97c010000488b4c2470488908eb6a488b48084883f901750948c7c101000000eb37488b19488b7310488b7e0848833f0375144c8b4424684c3b4708750948c7c103000000eb124c8b41084c89c1483b65187303ff5548ebba4883f9017429498d47f0483b45107303ff55404989c748c740f801000000eb05e903010000488b4c2460488908eb6a488b48084883f901750948c7c101000000eb37488b19488b7310488b7e0848833f0375144c8b4424584c3b4708750948c7c103000000eb124c8b41084c89c1483b65187303ff5548ebba4883f9017429498d47f0483b45107303ff55404989c748c740f801000000eb05e98a000000488b4c2450488908eb6a488b40084883f801750948c7c001000000eb37488b08488b5910488b730848833e037514488b7c2448483b7e08750948c7c003000000eb12488b78084889f8483b65187303ff5548ebba4883f8017429498d47f0483b45107303ff55404989c748c740f801000000eb05e911000000488b4c2440488908eb0748c7c0010000004883f80175154889c148b8a83d1ac9a37f0000488b5d089090ff13488b08498d5fd0483b5d107303ff55404989df48c743f80500000048c743200100000048894b18488b314889731048c743080100000048c7030b000000488b3c2448891feb5048833807754752ffb424b0000000ffb424b0000000ffb424b00000004c8b9424d00000004c8b8c24d80000004c8b44244048bb303e1ac9a37f000048b8903d1ac9a37f0000ff15aa010000eb0752eb0452eb0152488b442408488b00488b8c24c0000000488b9424b8000000488b9c24b0000000488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246850488b44246850488b44246850488b44246850488b44246848898c24e000000048899424d800000048899c24d00000004889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4c241048898c2480000000488b4c240848894c2478594883c41048894c245848894424504c8b5424304c8b4c24284c8b4424405b584883c438e902f3ffff488b442420488b4c2428488b10488911488b58084889590848c7c0010000004883c430c28000909090900000000000000000300d000000000000|@8676,2097151,@18046,@1401,@8677,@1699,@1382,@8678,@8679,@8675,@8675|189,0,@8666 776,0,@1638 844,0,@8667 1203,0,@8666 1408,0,@8666 1511,0,@376 1521,0,I106 1614,0,@376 1624,0,I106 1793,0,@8668 1803,0,@8669 2005,0,@573 2877,0,@8670 3014,0,@8673 3024,0,@8669 8666:O1|@8665 8667:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18044| 8668:S29|696e636c75646573206120667265652074797065207661726961626c65 8669:S4|54797065 8670:O4|@20055,@557,@8672,@8671 8671:O5|@1338,2825,0,2825,0 8672:S25|67656e6572616c3a204e6f206d61746368696e672074797065 8673:S32|697320616e20756e7265736f6c76656420666c657869626c65207265636f7264 8674:S34|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729 8675:D8,848|483b65187303ff55484889de4889c748c7c0010000009090ff154a030000498b4868f6c101753e488b11488b1a483b1d3c030000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498913eb194c8b59084c89d9483b65187303ff5548ebbd49c7c3010000004983fb01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1dea020000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498913eb194c8b59084c89d9483b65187303ff5548ebbd49c7c3010000004983fb01751d4889c148b8c0cf09c9a37f0000eb05e933000000488b5d08909090ff13498b0b488b11483b158a02000074154889c348b878e107c9a37f0000488b5d089090ff13488b5910eb26498b0b488b11483b156802000074134889c348b878e107c9a37f0000488b5d08ff13488b59104d8d67e84c3b65107303ff55404d89e749c74424f80200000049897c240849c704240700000041f6c40174144889c748b8f86f07c9a37f0000488b5d0890ff1341504154564c89d749c7c2010000004d89cd4c8b4c24304989c04889f84c89ea909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba781b07c9a37f0000488911498d57d0483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff135048c7c001000000488b5424209090ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185b488958104889480848c70003000000488b0c24488b59184883c40848c70303000000488b51605e4883c41856ff2290909000000000000000004803000000000000|@8680,1048575,@18050,@1323,@20131,@20131,@20131,@20131|116,0,@2635 209,0,@2690 253,0,@1486 295,0,@1486 362,0,@1294 460,0,@1294 530,0,@833 590,0,@833 701,0,@1294 8676:S44|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e28372967656e6572616c283229 8677:D3,384|488dbc2448ffffff483b7d187303ff5550a801756d41524151415053ff30ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000eb05e9db000000ffb424a8000000ffb424a8000000488b4008e862ffffff596a016a01ff742428ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b8000000ffb424b80000004c8b9424a00000004c8b8c24980000004c8d842480000000488b5908488b942490000000ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c428488908c28000488b442408c2800090909090909000000000000000007801000000000000|@1696,1048575,@18047| 8678:D3,544|488dbc2438ffffff483b7d187303ff5550a80175716a016a014152415153ff304150ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb05e967010000ffb424c0000000ffb424c0000000ffb424c0000000488d9c24b0000000488b400890e84effffff498d47e8483b45107303ff55404989c748c740f802000000488b4c243048894808488b4c2428488908488b8c24c0000000488b9424b8000000488b9c24b0000000488bb424a8000000488bbc24a00000004c8b8424980000004c8b8c24900000004c8b9424880000004c8b9c24800000004c8b6424784c8b6c24704c8b74246850488b44246850488b44246850488b44246850488b44246848898c24e000000048899424d800000048899c24d00000004889b424c80000004889bc24c00000004c898424b80000004c898c24b00000004c899424a80000004c899c24a00000004c89a424980000004c89ac24900000004c89b42488000000488b4c241048898c2480000000488b4c240848894c2478594883c41048894c245848894424504c8b5424284c8b4c24204c8b442418488b5c2410585a4883c430594883c40851ff22488b44240848890348c743080300000048c7c001000000c288009090909000000000000000001802000000000000|@1696,1048575,@18048| 8679:D3,384|488dbc2440ffffff483b7d187303ff5550a801756d415241514150ff3053ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000ffb424a8000000eb05e9df000000ffb424a8000000ffb424a8000000488b4008e862ffffff6a016a01ff742430ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c00000004c8b9424a80000004c8b8c24a00000004c8d842480000000488b9c2498000000488b94249000000090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c430488908c28000488b442408c28000909000000000000000007801000000000000|@1696,1048575,@18049| 8680:S46|545950455f5452454528292e616c6c6f7747656e6572616c69736174696f6e283729676976654572726f72283229 8681:D3,120|483b65187303ff5548488b480848837930017515488b1848b8386208c9a37f0000488b5d089090ff13488b5930488b3348c70601000000488b5208488b38498d47e8483b45107303ff55404989c748c740f80200000048894808488938488b5210ff22909090909000000000000000007000000000000000|@8682,1048575,@18051|25,0,@1662 8682:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329656e746572446563283129 8683:S57|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229 8684:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18053,@8347| 8685:D13,1728|488dbc2460ffffff483b7d187303ff5550498d4fe0483b4d107303ff55404989cf48c741f80300000048ba40511ac9a37f0000488911488b54244848895108488b5c244048895910488061ffbf6a016a016a014989c34889e34889c8ff157606000041534151415041524c8b5424284c8b8c24800000004c8b442468488b5c2470488b4424089090ff1552060000504c8b9424800000004c8b8c24880000004c8b442438488b5c2468488b4424089090ff1532060000488b4c2408f6c1017568a8017569488b11498d5fe0483b5d107303ff55404989df48c743f80300000048be509adc000000000048897310488b722048897308488b3a48893b4d8d47e84c3b45107303ff55404d89c749c740f8020000004989700849c700010000004c8b8c2488000000eb0ae9b9010000e9b4010000ff7008ff71085756ff720853ff30ff7230415048c7c001000000498b918000000090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f802000000488b542408488950085a4883c408488910514c8b4c24084989c048c7c30100000048c7c001000000488b9424a8000000ff12498d4fc8483b4d107303ff55404989cf48c741f80300000048894110488b042448894108488b542420488911488d592048c743f80200000048c743080100000048890b488b4c2410488919a801740c48b8b06319c9a37f0000eb05488b442418534989c0488b9c24c80000004889d0909090ff158a040000498d47e8483b45107303ff55404989c748c740f802000000488b0c2448894808488b542428488910488b54247090ff12488b8424a8000000488b4818498d47e8483b45107303ff55404989c748c740f8020000005a4883c420488950085a4889104889ca9090ff12488b442408594883c408483b65187303ff5548e9d5fdffff48c7c001000000498d47e0483b45107303ff55404989c748c740f80300000048b958521ac9a37f0000488908488b8c248800000048894808488b94248000000048895010488060ffbf6a016a016a014889e3ff15ba0300006a016a016a014889e348c7c0010000009090ff15aa030000ffb424b0000000ff742428ff742458ff7424204c8b9424880000004c8b8c24b80000004c8b8424d8000000488b5c2450488b44246090ff1576030000488b9c24900000004883c40848ba60531ac9a37f0000ff156203000048837c244001751a488b842490000000488b48104889c8488b5424109090ff12eb6f6a016a016a014889e348c7c001000000ff1532030000498d47e0483b45107303ff55404989c748c740f80300000048b9d8711ac9a37f0000488908488b8c24a800000048894808488b54240848895010488060ffbf498d57d8483b55107303ff55404989d748c742f804000000eb05e95502000048bba0721ac9a37f000048891a488b593048895a08488b74243848897210488b74241048897218488062ffbf498d77d8483b75107303ff55404989f748c746f80400000048bf30731ac9a37f000048893e48894e08488b7c242848897e105f4883c41048897e18488066ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b8f0761ac9a37f00004c890748894f084c8b04244c894710488067ffbf4d8d47e04c3b45107303ff55404d89c749c740f80300000049b9c0771ac9a37f00004d89084c8b49404d8948084c8b5424084d895010498060ffbf4d8d57884c3b55107303ff55404d89d749c742f80e0000004c8b59684d895a684c8b61604d8962604c8b69584d896a584c8b71504d897250498972484d894240488b71384989723849895230488b5128498952284c8b41204d89422049897a1849894210488b410849894208488b3949893a488b5c244849b9d09507c9a37f00004152f6c301755c488b03ff7308ffb424c0000000ffb424b0000000ffb424a8000000ffb424a00000004c8b104c8b8c24d80000004c8b442428488b9c24d0000000488b8424a0000000488b9424b000000090ff124989c15b483b65187303ff5548eb9f488b4424304883c4089090ff150a010000488b8c24b8000000488901488b442428a8017568488b10488b5a10488b730848833e03751448837e1803750d488b7e0848c70701000000eb3148833e01750a488b7e1048833f037416488b780848b828621ac9a37f0000488b5d089090ff134c8b470849c70001000000488b78084889f8483b65187303ff5548eb9448c7c00100000048b8d09507c9a37f00004883c468c250009090909090900000000000000000b806000000000000|@8788,2097151,@18082,@8510,@8789,@8792,@8558,@8510,@8796,@8806,@8691,@8796,@8787|43,0,@8686 225,0,I48 575,0,@8345 775,0,@8688 928,0,@8690 1024,0,@8775 1094,0,@8777 1162,0,@8778 1226,0,@8784 1280,0,@8786 1434,0,@1394 1637,0,@8726 1691,0,@1394 8686:D5,136|483b65187303ff55484d8b004d8b400841f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bbd0dc18c9a37f0000909090ff15460000004c89d14989c24989c94d8b431048c7c303000000498b4308ff253000000000000000000000008000000000000000|@8687,2097151,@18054,@100,@8347|57,0,@8345 73,0,@8231 8687:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836296d657373466e283329 8688:D5,136|483b65187303ff55484d8b402041f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bb18531ac9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8687,2097151,@18055,@100,@8347|54,0,@8345 70,0,@8689 8689:S52|2068617320616c7265616479206265656e2075736564206173206120636f6e7374727563746f7220696e20746869732074797065 8690:O3|@8691,@1632,@20170 8691:D6,432|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d77e8483b75107303ff55404989f748c746f80200000048bf70551ac9a37f000048893e488b7a1048897e08488066ffbf4889316a016a014989c04989d94989d24889e348b840611ac9a37f000090ff1546010000ff742408415141ff7208ff742418ff353a0100004c89c04150a8017523ff70084c8b442438488b5c2440488b0090ff152201000058483b65187303ff5548ebd958a801756a488b08488b11ff700852ff7210488b0424488d542418909090ff124883f8037464498d47e8483b45107303ff55404989c748c740f80200000048b908cc06c9a37f000048894808488b0c24488908488b5424409090ff12488b442408488b4810488b510848833a03eb05e959000000751948837a18037512488b5a0848c70303000000eb30e92b00000048833a01750a488b5a1048833b03741048b828621ac9a37f0000488b5d08ff13488b730848c706030000004883c41058483b65187303ff5548e934ffffff48c7c0010000004883c438c390909090900000000000000000a801000000000000|@8732,1048575,@18064,@8733,@8741,@8729|70,0,@8692 115,0,@8723 258,0,@431 355,0,@8726 8692:D3,1184|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b01756af6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4b0848890a48bed8c019f1a37f0000488b365248b8585e1ac9a37f00004889f29090ff124889c1584889ca909090ff12488338017555f6402001eb05e9be0100007559488b4820f64108017561488b1148833a07751b48837a0851745648817a08f7000000746b48817a08b70000007466498d5fe8483b5d107303ff55404989df48c743f802000000eb05e9c400000048be782b07c9a37f0000eb05e9ae00000048897308488903498d77e8eb0ae99c000000e997000000483b75107303ff55404989f748c746f80200000048895e08eb0ae978000000e97300000048bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9685f1ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c3488b3840f6c60174064883ee027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897008488b7708498930488b5208488b124c89c0909090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b940601ac9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000009804000000000000|@8722,1048575,@18062|34,0,@1326 105,0,@20171 119,0,@8702 244,0,@883 320,0,@884 361,0,@835 494,0,@833 535,0,@8708 635,0,@1326 798,0,@883 877,0,@884 918,0,@835 1051,0,@833 1092,0,@8715 8693:O1|@8694 8694:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bab85a1ac9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@115,7,@18059|29,0,@8695 8695:D5,200|483b65187303ff5548488b5208488b4808f6c10174084883f9017f14eb06f641ff10740c48bab85b1ac9a37f0000eb154c8b4208488b184889c89090ff159e0000004889c24889d0ff159a000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d05b1ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090900000000000000000c000000000000000|@3527,1048575,@18056,@8699,@8698|38,0,@8696 108,0,@8697 8696:O2|@77,0 8697:O2|3,91 8698:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8b8dc0bc9a37f0000c39090909090909000000000000000005800000000000000|@8701,3,@18058|64,0,@3523 8699:D3,384|483b65187303ff5548f6c301756948837b080175674883f801750b48b8b85b1ac9a37f0000c34889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b1b4889184c89c29090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000eb0ae9ec000000e904000000488908c34883f801750b48b8b85b1ac9a37f0000c34889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b13488910514150ff73084c89c2ff12488b4c2410f6c10174064883e9027105ff5570ebf5504c8b442410488b5c24084889c8e812ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f04e06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9104f06c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c300000000000000007801000000000000|@8700,1048575,@18057|29,0,@8696 141,0,@8696 268,0,@152 309,0,@153 8700:S21|7072696e745f6c697374283329706c697374283229 8701:S6|402832292829 8702:O4|0,@8703,3,1 8703:O1|@8704 8704:D3,48|483b65187303ff554848b9e8c019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@8707,1048575,@18061|11,0,@20172 8705:O1|@8706 8706:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18060|2,0,@388 8707:S19|7072696e742d74797065436f6e737472536574 8708:O5|0,0,0,@8710,@8709 8709:O2|@8713,0 8710:O2|@8711,0 8711:O2|0,@8712 8712:O5|@1338,1679,1679,0,0 8713:O2|3,@8714 8714:S7|4e6f745365656e 8715:O5|0,0,0,@8717,@8716 8716:O2|@8720,0 8717:O2|@8718,0 8718:O2|0,@8719 8719:O5|@1338,1678,1678,0,0 8720:O2|3,@8721 8721:S9|50726f636573736564 8722:S11|7072696e742d7374617465 8723:O1|@8724 8724:D3,128|488b4808488339037524488b530848833a03751a488b7108483b7208740848c7c001000000c348c7c003000000c3488339017533488b530848833a017529488b711840f6c6017509f64218017503ff5570483b7218740848c7c001000000c348c7c003000000c348c7c001000000c39000000000000000007800000000000000|@8725,31,@18063| 8725:S26|5554494c49544945535f28292e6d61705461626c652831292d45 8726:O4|@20055,@557,@8728,@8727 8727:O5|@1308,352,0,352,0 8728:S41|736574457175616c6974793a2063616e27742073657420657175616c69747920617474726962757465 8729:D3,608|483b65187303ff5548488b0851415050488b41104889da90ff12a8017565488b0848833901741248b848651ac9a37f0000488b5d089090ff13498d57e8483b55107303ff55404989d748c742f802000000488b590848895a08488b3424488932488b742410488b7e104c8b470849833805751a48b8807107c9a37f0000488b5d08eb05e951010000909090ff134983380175224d8b481049833903750f4d8b51084d8b124983fa017418eb5e4983790801755ceb0d4d8b48084d8b094983f9017564f6c301741248b8e81f08c9a37f0000488b5d089090ff134c8b0b4d8b114d8b5a104d8b630849833c2405751348b8807107c9a37f0000488b5d08909090ff1349833c24017537eb0ae93f000000e93a0000004d8b6c241049837d000375164d8b7508eb05e9230000004d8b364983fe01751aeb5549837d08017453eb0f4d8b6c24084d8b6d004983fd01745d4989d141f6c1017559498b01488b08488b5910488b730848833e03751448837e1803750d4c8b560849c70203000000eb4548833e0175164c8b5610eb0ae970000000e96b00000049833a03741e48b828621ac9a37f0000488b5d08eb0ae950000000e94b0000009090ff134d8b5a0849c703030000004d8b51084d89d1483b65187303ff5548e978ffffff498d57e8483b55107303ff55404989d748c742f80200000048c7420801000000488b0424488902488b442410498d4fd0483b4d107303ff55404989cf48c741f8020000004889510848c70101000000488b5010488d411848c740f802000000488948084889104883c4085a4883c408ff2290909090909000000000000000005802000000000000|@8751,1048575,@18071|41,0,@8730 117,0,@1305 201,0,@1625 240,0,@1305 413,0,@8726 8730:O4|101,@1386,0,@8731 8731:O5|@1338,1688,0,1688,0 8732:S40|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229 8733:D3,168|498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048bea8661ac9a37f000048893248894a0848894210488062ffbf498d77e0483b75107303ff55404989f748c746f80300000048bfc8681ac9a37f000048893e4889460848894e10488066ffbf4889134889730848c7c001000000c390900000000000000000a000000000000000|@8740,63,@18068|61,0,@8734 111,0,@8738 8734:D4,208|483b65187303ff5548488b4a08488b094889cb5250ff3051f6c3017538488b03488b4c2418ff7308488b5c2410488b00488b5110ff124883f801740d48c7c0030000004883c408eb135b483b65187303ff5548ebc348c7c0010000004883f801741e488b4424184c8b442408488b5810584883c408909090ff156a000000eb05584883c408498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901488b0424488b40084883c40848890848c7c001000000c3909090900000000000000000c800000000000000|@8736,1048575,@18065,@8735| 8735:D3,144|483b65187303ff5548a8017565488b08ff7008514150534c89c3488b01488b1424909090ff124883f80174064883c41858c34c8b442408488b1c24488b44241890e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24104889084883c420c348c7c001000000c390909090909000000000000000008800000000000000|@8737,1048575,@18066| 8736:S32|5554494c49544945535f28292e6d61705461626c65283129656e746572283129 8737:S35|5554494c49544945535f28292e6d61705461626c6528312964656c6574652832292829 8738:D3,152|483b65187303ff5548488b4a10488b095052f6c101755e488b01488b1424ff7008ff7108488b5c2418488b084889c8488b4a084889ca9090ff124883f8017425498d47f0483b45107303ff55404989c748c740f801000000488b4c24084889084883c420c3594883c408483b65187303ff5548eb9d48c7c0010000004883c410c39090909090909000000000000000009000000000000000|@8739,1048575,@18067| 8739:S33|5554494c49544945535f28292e6d61705461626c652831296c6f6f6b7570283129 8740:S24|5554494c49544945535f28292e6d61705461626c65283129 8741:D3,632|483b65187303ff55485052488b4a204889ca9090ff124883f801755d488b442408488b4808488339017553488b1424488b4118488b5a184889da9090ff124883f801750948c7c003000000eb0748c7c005000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb14e90c00000048b9886c1ac9a37f0000eb03488b0848833903751f48833903741048b8a06c1ac9a37f0000488b5d08ff13488b41084883c410c3488b0424488b5008498d47e8483b45107303ff55404989c748c740f80200000048bb40cd06c9a37f000048895808488b5c240848891851909090ff12488b042448833801741148b848651ac9a37f0000488b5d0890ff13488b480848c7c205000000f6c10175694883fa03750948c7c003000000eb5f488b01488b5808ff7108f6c3017555488b03488b4818488339057412488b73084889f3483b65187303ff5548ebdc48833905741148b8f86c1ac9a37f0000488b5d0890ff13488b742410ff73085249b8506d1ac9a37f0000eb0fe975000000e95b000000e9490000004889f3488b4108488b5610ff124883f803750948c7c003000000eb344883f801750948c7c001000000eb04488b0424488b5c24084889c24883c410483b65187303ff5548e958ffffff4889d06a016a014883c410eb03ff71084889c259483b65187303ff5548e918ffffff4889d0488b4c24084883f8017425498d57e8483b55107303ff55404989d748c742f8020000004889420848c70203000000eb04488b14244889c3498d47e8483b45107303ff55404989c748c740f80200000048895008488b54241048891053488b510890ff12584883c418c300000000000000007002000000000000|@8750,1048575,@18070|128,0,@8742 155,0,@8743 212,0,@441 250,0,@8730 350,0,@8745 376,0,@8747 8742:O2|1,1 8743:O4|101,@1386,0,@8744 8744:O5|@1338,1687,0,1687,0 8745:O4|101,@1386,0,@8746 8746:O5|@1338,93,0,93,0 8747:O1|@8748 8748:D3,24|48c7c005000000c300000000000000001000000000000000|@8749,1,@18069| 8749:S57|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229636f6e737472457128332965712d283129 8750:S54|545950455f5452454528292e636f6d707574654461746174797065457175616c697469657328322967656e457175616c697479283129 8751:S43|545950455f5452454528292e636f6d707574654461746174797065457175616c6974696573283229283129 8752:O1|@8753 8753:D3,160|488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b8506f1ac9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833803750b48b828701ac9a37f0000c3f6c10174084883f9037c13eb06f641ff10750b48b800711ac9a37f0000c348b8707907c9a37f0000c3909090909000000000000000009800000000000000|@3434,3,@18072|25,0,@1326 42,0,@8754 72,0,@1326 89,0,@8761 119,0,@8768 130,0,@1326 8754:O5|0,0,0,@8756,@8755 8755:O2|@8759,0 8756:O2|@8757,0 8757:O2|0,@8758 8758:O5|@1338,1577,1577,0,0 8759:O2|3,@8760 8760:S5|4d61796265 8761:O5|0,0,0,@8763,@8762 8762:O2|@8766,0 8763:O2|@8764,0 8764:O2|0,@8765 8765:O5|@1338,1576,1576,0,0 8766:O2|3,@8767 8767:S2|4e6f 8768:O5|0,0,0,@8770,@8769 8769:O2|@8773,0 8770:O2|@8771,0 8771:O2|0,@8772 8772:O5|@1338,1575,1575,0,0 8773:O2|3,@8774 8774:S3|596573 8775:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4810584889caff229090909000000000000000003800000000000000|@8776,1048575,@18073| 8776:S80|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657256616c466e283129 8777:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18074| 8778:D5,320|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bba8741ac9a37f000048891848894808488060ffbf5251488b5a184889da9090ff1258488b00498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000488b14244889c3498d47e8483b45107303ff55404989c748c740f80200000048be18751ac9a37f000048893048894808488060ffbf5351488b72104889f290ff1258488b00488b4c2408488b49085048c7c001000000488b514890ff124883f8017506488b0424eb104889c3488b0424909090ff154e0000004883f801750a4883c408584883c408c34889c34883c408584883c408ff25340000009090909000000000000000003801000000000000|@8782,1048575,@18077,@8783,@8781|73,0,@8779 178,0,@8780 8779:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18075| 8780:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18076| 8781:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18079| 8782:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d616c6c56616c4e616d6573283129 8783:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18078| 8784:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4818584889caff229090909000000000000000003800000000000000|@8785,1048575,@18080| 8785:S81|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c756573283529617373416273446174612836295f2d646563456e762d656e74657254797065466e283129 8786:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18081| 8787:D3,184|483b65187303ff5548a8017570488b08488b5110488b5a0848833b057517488b700848b8807107c9a37f0000488b5d08909090ff1348833b017519488b731048833e037509488b7e08488b3feb10488b7e08eb0a488b7308488b364889f757488b70084889f0909090e892ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090909090900000000000000000b000000000000000|@1363,63,@18103|36,0,@1305 8788:S58|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629 8789:D4,136|483b65187303ff5548a801755d41524151415053ff7008488b009090ff157e000000504c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,1048575,@18083,@8790| 8790:D4,768|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048ba509adc000000000048895110488b502048895108488b3048893148c7c7010000004c8b582841f6c301752040f6c70174064883c7027105ff5570ebf54d8b5b08483b65187303ff5548ebda4883fb017554498d5fe8483b5d107303ff55404989df48c743f80200000048bf30e306c9a37f000048897b08488b782848893b564152415152ff70084989c94c89c14989d848c7c30300000048c7c0010000004889caff12eb6f498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c703ffffffff4d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049bb10f608c9a37f00004d89184d8d5fd04c3b5d107303ff55404d89df49c743f8030000004d89431049895b08eb05e96f00000049c70305000000498d5b2048c743f801000000c643ff4048c703010000004d8d47b84c3b45107303ff55404d89c749c740f80400000049c7401803000000498978104989580849c70003000000488b5808498d402848c740f803000000488948104c8940084c891856415241515253498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424084889510848c70101000000488b5c2410505148c7c001000000488b9380000000ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47b0483b45107303ff55404989c748c740f8030000005a4889501048894808488b542420488910488d582048c743f80200000048c74308010000004889035e48891e488d5b1848c743f80200000048c7430801000000488903f6c101740c48b9b06319c9a37f0000eb04488b0c2450534989c8488b5c24184889d0909090ff155a000000498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2420488908488b542418ff12584883c420c30000000000000000f802000000000000|@8791,1048575,@18084,@8558|35,0,I48 142,0,@573 266,0,@2150 666,0,@8345 8791:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737341627344617461283629656e74657254636f6e283129 8792:D4,256|483b65187303ff5548a8017566488b08f64110017562488b51104889de498d5fd0483b5d107303ff55404989df48c743f80500000048bfd07e1ac9a37f000048893b4c8943084c894b104c89531848897320488063ffbf41524151415056ff70084d89c8488b0248bab8c019c9a37f0000eb0ae96e000000e90b000000909090ff1592000000eb16488b480848b830e306c9a37f00004152415141505351504c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c390900000000000000000f800000000000000|@1363,2097151,@18088,@8473|55,0,@8793 105,0,@8472 142,0,@573 8793:D5,176|483b65187303ff5548488b4a20498d77e0483b75107303ff55404989f748c746f80300000048bfb87f1ac9a37f000048893e488b794048897e084c8b4a084c894e10488066ffbf4d8d57e84c3b55107303ff55404d89d749c742f8020000004c8b59684d895a0849893253ff7218ff7210ff355100000041504c8d4424084889c34c89d0ff1546000000488b0c24488b0048890148c7c0010000004883c428c30000000000000000a800000000000000|@8388,2097151,@18086,@8795,@8370|39,0,@8794 8794:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18085| 8795:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18087,@8347| 8796:D3,208|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba88811ac9a37f000048891148894108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bef8821ac9a37f000048893248894208488062ffbf498d77e8483b75107303ff55404989f748c746f80200000048bfb8831ac9a37f000048893e48894608488066ffbf48890b488953084889731048c7c001000000c30000000000000000c800000000000000|@8805,63,@18093|61,0,@8797 107,0,@8801 153,0,@8803 8797:D4,48|483b65187303ff5548488b5208488b124889c34889d0ff252c0000009090909000000000000000002800000000000000|@8799,1048575,@18089,@8798| 8798:D3,112|483b65187303ff5548a8017545488b08ff7108ff3153488b48084889c8e8deffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b4c24084889085a4883c410ff2248c7c001000000c390909090909000000000000000006800000000000000|@8800,1048575,@18090| 8799:S34|5554494c49544945535f28292e7365617263684c6973742831296170706c79283129 8800:S41|5554494c49544945535f28292e7365617263684c6973742831296170706c792831296170706c283129 8801:D3,96|498d4fd0483b4d107303ff55404989cf48c741f802000000488b580848895908488b30488931488b7a08488b3f4c8d411849c740f80200000049897808498908488b52084c890248c7c001000000c39000000000000000005800000000000000|@8802,127,@18091| 8802:S34|5554494c49544945535f28292e7365617263684c697374283129656e746572283129 8803:D3,192|488b5208488b12f6c2017552488b0a483b017455f60101754aa8017546a801740948c7c303000000eb08488b18488d5c1b014883c310488b314889c74c8b41084889d948d1e9483bc9f3a6488d7c3f01488d743601488d4c09017411eb2ee93b0000004c8b4108eb234c8b41084889c1498d47f0483b45107303ff55404989c748c740f8010000004c8900c3488b5208483b65187303ff5548e969ffffff4889c148c7c001000000c3909090909090900000000000000000b800000000000000|@8804,127,@18092| 8804:S35|5554494c49544945535f28292e7365617263684c6973742831296c6f6f6b7570283129 8805:S26|5554494c49544945535f28292e7365617263684c697374283129 8806:D4,192|483b65187303ff5548a801756cf6c301756c415241514150ff7308ff7008ff742448ff742448ff742448ff742448488b1b488b00ff159e00000050ff742450ff742450ff742450ff7424504c8b5424484c8b4c24404c8b442438488b5c2430488b44242890e896ffffff4889c1498d47e8483b4510730feb0ae922000000e91d000000ff55404989c748c740f80200000048894808594883c428488908c2200048c7c001000000c220009090909090900000000000000000b800000000000000|@3457,2097151,@18096,@8807| 8807:D6,632|483b65187303ff554848c7c101000000488b5010f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4c8b58084c8b204989dd4989ceff7010ff7020488b402890ff153a020000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c701010000004153415441554151415641504152505148c7c001000000498b9080000000ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f80500000048894820488b4c242848894818488b542430488950105b4889580848c7000b0000005048bbb0881ac9a37f0000488b4424409090ff155e010000ff3424ff742420ff7424704c8b9424800000004c8b4c24284c8b442420488b5c2438ff153e0100004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24284883c42048890848837c24380174704889c2498d47e8483b45107303ff55404989c748c740f80200000048895008488b5c241048891852488b5424389090ff12488b442408498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488b542410488911488b5018488d411848c740f802000000eb05e91200000048894808488b4c24184889089090ff12eb32488b0c244889c2498d47e8483b45107303ff55404989c748c740f80200000048895008488b5c241048891852488b5118ff12488b442420488b0c244889084889c84883c430c220009090909000000000000000007002000000000000|@8817,2097151,@18100,@8818,@1459,@8813|293,0,@8808 8808:O1|@8809 8809:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba30891ac9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@8812,7,@18095|29,0,@8810 8810:D3,56|483b65187303ff5548488b5208488b5810488b421048ba1095dc0000000000ff229090909090909000000000000000003000000000000000|@8811,63,@18094|23,0,I27 8811:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129283129 8812:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e737472732832296c6571283129 8813:D6,816|483b65187303ff5548a801756f488b086a016a01f64108017567488b51084889de498d5fd0483b5d107303ff55404989df48c743f80500000048bfd08d1ac9a37f000048893b4c8943084c894b104c89531848897320488063ffbf41524151415056ff7008ff7110ff314d89c8488b0248bab8c019c9a37f0000eb0ae993020000e94b0000009090ff15ba020000498d4fe0483b4d107303ff55404989cf48c741f803000000488b542460488951104889410848c70105000000488d442438488908488d44243848c7400801000000eb254889e2488b7424284889324889e248c742080300000041524151415053ff7008ff7110ff31498d47e8483b45107303ff55404989c748c740f802000000488b0c244889480848c70001000000488b5424285048c7c001000000488b9a800000004889daff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fc8483b5d107303ff55404989df48c743f803000000488953104889430848c70305000000488d432048c740f802000000488b54245848895008488b742440488930498d77c0483b75107303ff55404989f748c746f80700000048c746300100000048c746280100000048894e20488b4c243848894e1848895e1048894608488b442408488906564c8b442408488b5c2430ff15e600000049c7c2030000004c8b4c24084c8b442430488b5c2438488b442410909090ff15ca000000498d47e8483b45107303ff55404989c748c740f802000000488b0c2448894808488b542410488910488b54245890ff12ff742468ff742468ff7424684c8b5424504c8b4c24484c8b442440488b5c2438488b4424309090e816fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c448488908c2180048c7c001000000c21800909000000000000000002803000000000000|@1363,2097151,@18102,@8473,@8558,@8564|59,0,@8814 114,0,@8472 453,0,@2150 8814:D5,176|483b65187303ff5548488b4a20498d77e0483b75107303ff55404989f748c746f80300000048bfb88e1ac9a37f000048893e488b794048897e084c8b4a084c894e10488066ffbf4d8d57e84c3b55107303ff55404d89d749c742f8020000004c8b59684d895a0849893253ff7218ff7210ff355100000041504c8d4424084889c34c89d0ff1546000000488b0c24488b0048890148c7c0010000004883c428c30000000000000000a800000000000000|@8388,2097151,@18098,@8816,@8370|39,0,@8815 8815:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18097| 8816:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18099,@8347| 8817:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296173734162734461746128362967656e56616c7565436f6e73747273283229 8818:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@18101| 8819:D4,632|483b65187303ff5548488b0848bac6901ac9a37f0000488d548afcffe290e9f3000000909090e9eb000000909090e9f9000000909090e9db000000909090e9d3000000909090e90b010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e9cc000000909090e9cc000000909090e973000000909090e904010000909090e94c010000909090e95b000000909090e953000000909090e94b000000909090e934010000909090e93b000000909090e92d010000909090e92d010000909090e923000000909090e960010000909090e913000000909090e90b000000909090e90300000090909048833817740848c7c001000000c348c7c003000000c3488b4808ff7108488b019090ff15520100004883f801740658e9b6feffff48c7c0010000004883c408c3488b4010e9a1feffff48c7c003000000c3488b401848c7c103000000a8017535488b104883f9017411ff7008488b4218909090e872feffffeb0c488b480848c7c001000000514889c158483b65187303ff5548ebc74889c8c34883781001750848c7c003000000c3488b401048c7c103000000a801752e4883f901740dff7008488b00e822feffffeb0c488b480848c7c001000000514889c158483b65187303ff5548ebce4889c8c348c7c003000000c3488b4008e9f0fdffff48c7c003000000c3488b400848c7c103000000a80175304883f901740fff7008488b009090e8c6fdffffeb0c488b480848c7c001000000514889c158483b65187303ff5548ebcc4889c8c348c7c003000000c3909090909000000000000000007002000000000000|@8821,2097151,@18104,@8820|14,0,$8819+30 8820:D6,240|483b65187303ff55484883382d7509488b4008e9e8ffffff4883380b7509488b4010e9d9ffffff4883381d755a488b4008488b4008488b0048837808017406f64008017552488b4018909090ff15b6000000488338057556488b4010ff15ae0000004883380b754b488b4018488b4810488b510848833a03752b488b5a08483b1d93000000eb05e947000000740e48c7c601000000eb2ce92f00000048c7c603000000eb1e48c7c601000000eb15e90900000048c7c601000000eb0748c7c6010000004883f6024889f0c348c7c001000000c348c7c001000000c390909090900000000000000000e800000000000000|@8822,2097151,@18105,@1401,@1401,@20093| 8821:S60|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c7565732835296e6f6e457870616e73697665283129 8822:S67|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352969734e6f6e526566436f6e7374727563746f72283129 8823:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18106,@8347| 8824:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18107,@8347| 8825:D4,136|483b65187303ff5548a801755d41524151415053ff7008488b009090ff157e000000504c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,2097151,@18110,@8826| 8826:D4,264|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048bae8971ac9a37f00004889114c89410848895910488061ffbf4152ff7008ff30ff701041514989c848bbf0981ac9a37f0000488b4018ff15c2000000488b4c240848833901753948833c24017432488b1424488b5908498d4fe0483b4d107303ff55404989cf48c741f803000000488b12488951104889590848c701090000004889c2498d47c0483b45107303ff55404989c748c740f80700000048c740300100000048c7402801000000488b5c24204883c410488958204889501848894810488b4c240848894808594883c410488908c39090909000000000000000000001000000000000|@8832,2097151,@18111,@1390|35,0,@8827 76,0,@8829 8827:D3,112|488b4810488b590848833b03751a488b7210488b7e0848833f03750c4c8b43084c3b47087534eb2d48833b01752c488b7210488b7e0848833f01751e4c8b431841f6c0017509f64718017503ff55704c3b47187505488b4208c3c3909090909000000000000000006800000000000000|@8828,127,@18108| 8828:S91|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f707954797065436f6e73283129 8829:O1|@8830 8830:D3,24|c39090909090909000000000000000001000000000000000|@8831,1,@18109| 8831:S89|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129636f7079547970283129283129 8832:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f707941436f6e7374727563746f72283129 8833:D11,1200|488dbc2450ffffff483b7d187303ff5550f6401001756f488b48104889da498d5fd8483b5d107303ff55404989df48c743f80400000048be289f1ac9a37f00004889334c8943084c894b1048895318488063ffbfff3052ff7020415041514152ff7008ff7028488b0148bab8c019c9a37f000090ff154e040000498d4fe0483b4d10730aeb05e929000000ff55404989cf48c741f80300000048baa8131ac9a37f0000488951104889410848c70105000000eb1c48b9a8131ac9a37f0000ff3053ff7020415041514152ff7008ff7028498d47e8483b45107303ff55404989c748c740f802000000488b5424284889500848c70001000000488b5c2420515048c7c001000000488b9380000000909090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901488b4424084883381d7571488b5008488b5c2438498d77e8483b75107303ff55404989f748c746f802000000488b7b6848897e084c8b43304c8906ff7218ff742428ff742438ff352403000051ff7220ff7210ff7208ff7218ff324c8d4c24304c8b04244889f348b848a01ac9a37f0000909090ff15fe020000eb05e945010000488378080174584c8b50184989c3488b1c2448c7c0510000009090ff15de02000048bb68a01ac9a37f0000ff15d6020000415241534989c24c8b4c24184c8b84248000000048c7c303000000488b842488000000909090ff15b2020000eb04ff701850488b44242059488908488b442420488b0c24488908488b842490000000488b542428488b584848891a498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf10f608c9a37f000048893e498d7fa0483b7d107303ff55404989ff48c747f803000000488977104889570848c70705000000488d572048c742f80700000048c742300100000048c7422801000000488b7424304889722048894a1848897a1048c7420801000000488b8c24980000004883c45848890aeb6f48833811741148b890a01ac9a37f0000488b5d0890ff13498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fa0483b5d10730aeb05e959000000ff55404989df48c743f803000000488953104889430848c70305000000488d532048c742f80700000048c742300100000048c742280100000048894a20488b04244889421848895a1048c7420801000000488b4424404889024883c41058488910498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b5c242848891852488b5424089090ff124c8b442420488b5c2418488b442430909090ff15b200000049c7c2030000004c8b4c24204c8b442418488b5c2410488b442430909090ff1596000000488b442428488b4810498d47e8483b45107303ff55404989c748c740f8020000005a4883c428488950085a4889104889caff229090900000000000000000a804000000000000|@8842,2097151,@18114,@8473,@8841,@8525,@100,@100,@8347,@8558,@8564|56,0,@8834 107,0,@8472 155,0,@8607 182,0,@8607 457,0,@8836 516,0,@8837 686,0,@2150 814,0,@8838 894,0,@2150 8834:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796848897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@18112,@8835,@8370| 8835:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18113,@8347| 8836:S9|457863657074696f6e 8837:S22|29206973206e6f7420616e20657863657074696f6e2e 8838:O4|@20055,@557,@8840,@8839 8839:O5|@8295,1271,0,1271,0 8840:S41|70726f63657373457863657074696f6e3a206261646c792d666f726d65642070617273652d74726565 8841:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18115,@8347| 8842:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f63657373457863657074696f6e283129 8843:D13,848|483b65187303ff5548488b5b68f6c301753e488b0b488b11483b1549030000751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19488b73084889f3483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1df7020000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751a4889c148b8c0cf09c9a37f0000eb05e930000000488b5d08ff13488b0e488b11483b159a02000074154889c348b878e107c9a37f0000488b5d089090ff13488b5910eb26488b0e488b11483b157802000074134889c348b878e107c9a37f0000488b5d08ff13488b59104883fb05755b90ff155a0200004883380d750948c7c003000000eb634883380b7562488b4818488b5110488b5a0848833b05755548833b057416488b700848b8c05208c9a37f0000488b5d089090ff13488b7b10488b7308488b58084889f0eb05e9b600000090ff1502020000498d4fe8483b4d107303ff55404989cfeb0fe97f000000e954000000e94600000048c741f80200000048bab8a51ac9a37f000048891148894108488061ffbf6a016a014989e04889cb4889f89090ff15b6010000584883c408483b65187303ff5548e939ffffff48c7c001000000eb264883380775194883780801740948c7c001000000eb1048c7c003000000eb0748c7c0010000004883f801750b48b870a61ac9a37f0000c348c7c001000000c34883fb03756990ff15560100004883380b7561488b4818488b5110488b5a0848833b05756e48833b057415488b700848b8c05208c9a37f0000488b5d0890ff13488b7b10488b7308488b58084889f0ff1516010000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae980000000e94c00000048bab8a61ac9a37f000048891148894108488061ffbf6a01eb05e9240000006a014989e04889cb4889f8ff15ca000000584883c408483b65187303ff5548e951ffffff48c7c001000000eb1648833805740948c7c001000000eb0748c7c0030000004883f801750848c7c001000000c348b870a71ac9a37f0000c348c7c001000000c39090909090909000000000000000004803000000000000|@8850,2097151,@18118,@20140,@20140,@20140,@20140,@1401,@1699,@1382,@1401,@1699,@1382|95,0,@2635 188,0,@2690 229,0,@1486 271,0,@1486 353,0,@1638 441,0,@8844 556,0,@8845 622,0,@1638 696,0,@8847 808,0,@8848 8844:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18116| 8845:O1|@8846 8846:S36|41206e6f6e20756e69742076616c7565206973206265696e67206469736361726465642e 8847:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18117| 8848:O1|@8849 8849:S36|412066756e6374696f6e2076616c7565206973206265696e67206469736361726465642e 8850:S27|545950455f5452454528292e636865636b44697363617264283229 8851:D7,792|488dbc2460ffffff483b7d187303ff555041f6c20174064983c2027105ff5570ebf54889c1498d47e8483b45107303ff55404989c748c740f80200000048ba48ab1ac9a37f00004889104c895008488060ffbf415251534150488b13ff12488b0424488b08498d47e0483b45107303ff55404989c748c740f80300000048bae8ad1ac9a37f0000488910488b54246848895008488b5c241848895810488060ffbf4889caff12498d47e0483b45107303ff55404989c748c740f80300000048b910b01ac9a37f0000488908488b4c246048894808488b54245848895010488060ffbf6a016a016a014889e390ff153e020000488b442428a801752fff70084c8b5424104c8b4c24784c8b442438488b9c2480000000488b00ff151a02000058483b65187303ff5548ebcd48c7c001000000488b442428a8017572ff7008ff742470ffb42490000000ffb42488000000ff742430ff742428ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424800000004c8b9424900000004c8b8c24d80000004c8b442478488b9c2480000000488b00909090ff1596010000eb05e90f00000058483b65187303ff5548e976ffffff48c7c0010000004883c42858a801756e488b08488b5110488b12488b5a20f6c3017521488b3348833e017506488b7e08eb1c488b73084889f3483b65187303ff5548ebda48bfb06319c9a37f0000498d5fe0483b5d107303ff55404989df48c743f80300000048be30b11ac9a37f0000488933488b74244048897308eb05e9b30000004c8b4424484c894310488063ffbfff700852ff7110ff32ff723053ff7424684989fa4d89c149c7c003000000488b5c2438488b421848ba802c1ac9a37f00009090ff15be00000048833c2401751048b8386208c9a37f0000488b5d08ff1358488b0048c70001000000488b442470488b4810498d47e8483b45107303ff55404989c748c740f802000000488b542410488950085b4889184889ca909090ff12585948890858483b65187303ff5548e9d6feffff48c7c0010000004883c408c248009090909000000000000000001003000000000000|@8868,2097151,@18126,@8510,@8869,@8861,@8664|63,0,@8852 127,0,@8856 192,0,@8858 518,0,@8345 552,0,@8860 634,0,@8663 659,0,@1662 8852:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@8854,2097151,@18119,@8853| 8853:D4,352|483b65187303ff5548498d47e0483b45107303ff55404989c748c740f803000000488b4b0848894810488b134889500848c7000d0000004150909090ff15360100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b48104883e1094883f901740948c7c101000000eb0748c7c1030000004883f102488b50104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933f60424017517488b3c24488b37f647ff10740348f7de488d743601eb04488b3424488d34f5f9ffffff4883f901750948c7c101000000eb0748c7c109000000480bce4883c905480bca498d57e0483b55107303ff55404989d748c742f80300000048894a1048895a0848c7020d000000488b40084883c40848891048c7c001000000c390909000000000000000005801000000000000|@8855,2097151,@18120,@1401|77,0,@1384 191,0,@573 8854:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283129 8855:S70|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834295f2d283229 8856:D4,56|483b65187303ff55484c8b4a104c8b4208488b5808488b084889c8ff252f0000009090909090909000000000000000003000000000000000|@8854,2097151,@18121,@8857| 8857:D5,392|483b65187303ff5548415153498b5060ff124883f801756c488b0424488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c7000d0000009090ff154e0100004883380d74154889c148b8d89107c9a37f0000488b5d089090ff13488b48104883e1094883f901740e48c7c101000000eb0ce9dc00000048c7c1030000004883f102488b50104883e2034883fa01740948c7c201000000eb0748c7c2030000004883f202498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be30e306c9a37f0000488933f6442408017518488b7c2408488b37f647ff10740348f7de488d743601eb05488b742408488d34f5f9ffffff4883f901750948c7c101000000eb0748c7c109000000480bce4883c905480bca498d57e0483b55107303ff55404989d748c742f80300000048894a1048895a0848c7020d000000488b400848891048c7c0010000004883c410c3488b1c24488b004883c410ff2532000000909000000000000000008001000000000000|@8855,2097151,@18122,@1401,@8657|93,0,@1384 212,0,@573 8858:D5,136|483b65187303ff55484d8b402041f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bbd0dc18c9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8859,2097151,@18123,@100,@8347|54,0,@8345 70,0,@8231 8859:S73|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e2834296d7367466e283329 8860:D5,128|483b65187303ff5548488b42104889d6ff7028ff7030ff7038ff7040ff7048ff7050ff7058ff7060ff7068ff7070ff7078ffb0800000004c8b50204c8b48184c8b4010488b5808488b084889c8909090ff15420000004889c3488b460848ba682b18c9a37f0000ff253300000090909000000000000000007800000000000000|@8662,2097151,@18124,@8349,@8028|95,0,@8026 8861:D11,1584|488dbc2430ffffff483b7d187303ff5550488b4810488b09498d57f0483b55107303ff55404989d748c742f801000000c642ff4048be30e306c9a37f0000488932498d77e0483b75107303ff55404989f748c746f80300000048c74610f17002004889560848c7060d000000488b50084151ff7018515641505350ff7028ff304152f6c201756eff7208ff742408ffb424b8000000ffb424b8000000ffb424b8000000ff742430ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ff742478ffb424a00000004c8b9424c00000004c8b8c24b0000000eb05e92b0000004c8b8424a0000000488b9c2498000000488b02909090ff15320500005a483b65187303ff5548e95dffffff488b4424584883c418a80175224c8b4008488b5c2420488b009090ff150a0500004c89c0483b65187303ff5548ebda488b442420488b5818488b44241848bab06507c9a37f0000ff15e6040000a8017572498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b1424488911498d57d0483b55107303ff55404989d748c742f805000000488b5c242848895a20488b74241048897218488b7424084889721048894a0848c7021900000052ff304c8b9424a0000000eb05e9210400004c8b4c24404c8b4424284889d348b8605e19c9a37f0000ff1556040000488b4c2430498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be10cf19c9a37f0000488933498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf80b81ac9a37f000048893e498d7fb8483b7d107303ff55404989ff48c747f80500000048897720488b742438488977184889571048895f08488b11488917488d5f3048c743f80200000048897b0848c7031d000000504c8b9424a80000004c8b4c24484c8b411848b840b91ac9a37f0000ff15720300004889c649b9d04e19c9a37f00004c8b8424a80000004c89c3488b44244848bae84e19c9a37f0000909090ff154a030000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b860b91ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24384889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff15ea000000564889c3488b44240848ba682b18c9a37f0000909090ff15d6000000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542438488950185a4883c408488950104889480848c70003000000488b4c2430488b511848c70203000000488b51604883c4385b4883c45853ff2248c7c0010000004883c438c258009090909000000000000000002806000000000000|@8876,2097151,@18128,@8877,@8875,@1633,@8503,@8503,@8310,@8349,@8028|54,0,@573 356,0,@1292 508,0,@8330 557,0,@573 598,0,@8492 639,0,@8862 744,0,@8865 763,0,@8308 789,0,@8309 875,0,@2141 916,0,@8326 995,0,@1294 1062,0,@833 1135,0,@833 1212,0,@833 1253,0,@8866 1332,0,@1294 1433,0,@8026 8862:O1|@8863 8863:D3,24|48c7c001000000c300000000000000001000000000000000|@8864,1,@18125| 8864:S95|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6b4964656e74283229283129 8865:S9|5661726961626c653a 8866:O2|3,@8867 8867:S62|54797065206f662066756e6374696f6e20646f6573206e6f74206d617463682074797065206f6620726563757273697665206170706c69636174696f6e2e 8868:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e283429 8869:D6,928|483b65187303ff5548f640080174164889c148b800be1ac9a37f0000488b5d08909090ff13488b4808488b11488b32488b7e084d8d5fe84c3b5d107303ff55404d89df49c743f8020000004c8b67104d89630849c70301000000ff374152ff7010ff7210534151ff7020564150415348c7c001000000488b9380000000909090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048ba30e306c9a37f0000488910f60424017517488b1c24488b13f643ff10740348f7da488d541201eb04488b1424488d14d5f9ffffff498d5fd0483b5d107303ff55404989df48c743f803000000488953104889430848c7030d000000488d432048c740f801000000c640ff4048c700ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048be10f608c9a37f00004883c408488932498d77d0483b75107303ff55404989f748c746f803000000488956104889460848c70605000000488d462048c740f801000000c640ff4048c70001000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47c04c3b45107303ff55404d89c749c740f8030000004989781049894008498910498d402048c740f8010000004c8900488d501048c742f801000000c642ff4048c70201000000498d7fb0483b7d107303ff55404989ff48c747f801000000488917488d571048c742f80700000048897a304889422848894a2048895a184889721048c7420805000000488b4424384889025948c7c301000000488b09f6c101751ff6c30174064883c3027105ff5570ebf5488b4908483b65187303ff5548ebdc4889d95b48890b4883f901752b5249ba98be1ac9a37f00004c8b4c24184c8b44240848c7c303000000488b4424109090ff15ae000000eb0848c7c001000000524c8b442418488b5c2410488b44243090ff159600000049c7c2010000004c8b4c24184c8b442410488b5c2408488b442430909090ff157a000000488b442420488b0c24488908498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24304883c4284889085a4883c408ff229090909090909000000000000000009803000000000000|@8874,2097151,@18127,@8347,@8558,@8564|20,0,@8870 238,0,@573 382,0,@2150 740,0,@8873 8870:O4|@20055,@557,@8872,@8871 8871:O5|@8295,1668,0,1668,0 8872:S41|66696e644e616d65416e6450617474733a206261646c792d666f726d65642070617273652d74726565 8873:S46|436c617573616c2066756e6374696f6e20646f6573206e6f74206861766520616e7920706172616d65746572732e 8874:S84|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342966696e644e616d65416e645061747473283129 8875:D5,136|483b65187303ff5548488b4010488b0048837828017516488b482848b8386208c9a37f0000488b5d089090ff13488b4028488b08488b11488b12488b31488b7910488b1b4889d090ff1552000000488b0f4883f901740b4889cb9090ff154600000048890748c7060100000048c7c001000000c39090909000000000000000008000000000000000|@8903,63,@18142,@8904,@8902|29,0,@1662 8876:S82|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e67283129 8877:D23,3464|488dbc2420ffffff483b7d187303ff5550488b08498d57d8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d721848c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4049bb10cf19c9a37f00004c891f4d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049bcd09507c9a37f00004d89234d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049bdd09507c9a37f00004d892c244d8d6f804c3b6d107303ff55404d89ef49c745f8060000004d89652849897520488b70104989751849897d10498955084d895d00498d553848c742f80200000048c74208010000004c892a488d7a1848c747f805000000488977204c89471848895f104889570848c70719000000488b51084c8b5a084d8b49184d890b4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049bcb8ce1ac9a37f00004d89214d89510849897910498061ffbf6a016a016a014989f44989fd4c8b7008ff711853ff31488d5c24184c89c890ff15fe0b0000488b8424a0000000a80174064883c0027105ff5570ebf54152415441554156504150ff742450504c8b9424c80000004c8b8c24d00000004c8b8424d8000000488b5c2438488b44244090ff15b60b0000a801756c4883780801746a5048c7c303000000909090ff15a20b00004889c34889d8ff159e0b0000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000eb1ce9090000004889c1488b0151eb0e4889c148b8d09507c9a37f000051488b8c24b8000000488901488b8424c8000000498d57d8483b55107303ff55404989d748c742f80400000048bb30d01ac9a37f000048891a488b583048895a08488bb424b000000048897210488b7c246048897a18488062ffbf488b7c24404c8b4424084d8d4fd84c3b4d107303ff55404d89cf49c741f80400000049bac0d01ac9a37f00004d89114c8b50604d8951084d8b40084d894110488b7f0849897918498061ffbf498d7fd8483b7d107303ff55404989ff48c747f80400000049b850d11ac9a37f00004c8907488947084c8b8424a80000004c8947104c8b5c24504c895f18488067ffbf4d8d5f884c3b5d107303ff55404d89df49c743f80e0000004c8b60684d8963684d894b604c8b48584d894b584c8b68504d896b5049897b48488b784049897b404c8b70384d89733849895330488b502849895328488b482049894b20488b581849895b18488b701049897310488b780849897b08488b0849890bff742430ffb424a0000000ffb424a0000000ffb424a00000004c8b5424384d89d14d89d8488b9c24a0000000488b442430488b9424c00000009090ff12f644244801756f488b4c2448498d5fd8483b5d107303ff55404989df48c743f80400000048ba28d51ac9a37f0000488913488b54243048895308488bb424c000000048897310488bbc24c800000048897b18488063ffbf504989d0488b0148bab8c019c9a37f00009090ff1532090000504889c3eb05e956040000488b44240848bab06507c9a37f0000ff151a090000a801756eff304c8b9424e80000004c8b4c24484c8b442410488b5c243048b848d61ac9a37f0000909090ff15f20800004889c648c7c001000000ff15ea0800005649c7c2010000004c8b8c24f00000004989c048c7c3214e0000488b44241048ba40a507c9a37f000090ff15c2080000eb05e9c5030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888ce19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c649b9d04e19c9a37f00004c8b8424f00000004c89c3488b44245048bae84e19c9a37f0000ff15da070000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b868d61ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24404889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff157a050000564889c3488b44243848ba682b18c9a37f0000909090ff1566050000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542440488950185b488958104889480848c70003000000488b4c2440488b591848c70303000000488b51609090ff12584883c408488b4c24784889014889c3584883c41890ff15fa04000050488b5c245848bab06507c9a37f00009090ff15ea040000a801756eff304c8b9424c00000004c8b4c24204c8b442408488b5c241048b8c8d61ac9a37f0000909090ff15c20400004889c648c7c001000000ff15ba0400005649c7c2010000004c8b8c24c80000004989c048c7c3214e0000488b44246848ba40a507c9a37f000090ff1592040000eb05e9c7030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e0d61ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff134889c649b9d04e19c9a37f00004c8b8424c80000004c89c3488b44242848bae84e19c9a37f0000ff15aa030000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b818d71ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24184889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff154a010000564889c3488b44241048ba682b18c9a37f0000909090ff1536010000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542418488950185a488950104889480848c70003000000488b4c2418488b511848c70203000000488b51609090ff12eb0748c7c00100000048c7c0010000004883c450c27000909090909090900000000000000000800d000000000000|@8900,2097151,@18139,@8510,@8901,@8016,@8522,@8473,@1633,@8503,@1323,@1416,@8310,@8349,@8028,@8899,@1633,@8503,@1323,@1416,@8310,@8349,@8028|108,0,@8492 150,0,@1394 194,0,@1394 357,0,@8878 629,0,@1394 683,0,@8881 764,0,@8882 830,0,@8883 1092,0,@8889 1150,0,@8472 1184,0,@1292 1229,0,@8891 1295,0,@1415 1370,0,@833 1411,0,@8488 1490,0,@1294 1510,0,@8308 1536,0,@8309 1619,0,@2141 1660,0,@8326 1739,0,@1294 1806,0,@833 1879,0,@833 1956,0,@833 1997,0,@8892 2076,0,@1294 2177,0,@8026 2318,0,@1292 2365,0,@8894 2431,0,@1415 2506,0,@833 2547,0,@8895 2626,0,@1294 2646,0,@8308 2672,0,@8309 2755,0,@2141 2796,0,@8326 2875,0,@1294 2942,0,@833 3015,0,@833 3092,0,@833 3133,0,@8897 3212,0,@1294 3313,0,@8026 8878:D5,136|483b65187303ff55484d8b402041f6c0017521498b08488339017506488b5908eb1c498b48084989c8483b65187303ff5548ebd948bbb06319c9a37f00004989da4989d348bb78cf1ac9a37f00009090ff154a0000004c89d14989c24989c94d8b431048c7c303000000498b4308ff25340000009090909000000000000000008000000000000000|@8880,2097151,@18129,@100,@8347|54,0,@8345 70,0,@8879 8879:S39|2068617320616c7265616479206265656e20626f756e6420696e207468697320636c617573652e 8880:S107|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c617573652831296d657373466e283329 8881:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18130| 8882:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18131| 8883:D5,320|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bbc8d21ac9a37f000048891848894808488060ffbf5251488b5a184889da9090ff1258488b00498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000488b14244889c3498d47e8483b45107303ff55404989c748c740f80200000048be38d31ac9a37f000048893048894808488060ffbf5351488b72104889f290ff1258488b00488b4c2408488b49085048c7c001000000488b514890ff124883f8017506488b0424eb104889c3488b0424909090ff154e0000004883f801750a4883c408584883c408c34889c34883c408584883c408ff25340000009090909000000000000000003801000000000000|@8887,1048575,@18134,@8888,@8886|73,0,@8884 178,0,@8885 8884:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18132| 8885:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18133| 8886:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18136| 8887:S109|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129626f6479456e762d283129 8888:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18135| 8889:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796848897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@18137,@8890,@8370| 8890:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18138,@8347| 8891:S11|45787072657373696f6e3a 8892:O2|3,@8893 8893:S51|426f6479206f662066756e2062696e64696e6720646f6573206e6f74206d61746368207479706520636f6e73747261696e742e 8894:S7|436c617573653a 8895:O2|3,@8896 8896:S14|4f7468657220636c61757365733a 8897:O2|3,@8898 8898:S59|54797065206f6620636c6175736520646f6573206e6f74206d61746368207468652074797065206f662070726576696f757320636c61757365732e 8899:D3,96|483b65187303ff5548a8017539ff30488b40089090e8e6ffffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70005000000c34889d8c390909090909000000000000000005800000000000000|@1696,11,@18141| 8900:S98|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e6728312970726f63657373436c61757365283129 8901:D4,192|483b65187303ff5548a801757041524151415053ff70086a015341504151415249ba106819c9a37f000049c7c1010000004c8b442458488b5c2460488b009090ff159200000050ff742440ff7424404c8b5424384c8b4c24304c8b442428488b5c2420488b44241890e892ffffff4889c1498d47e8483b4510730aeb05e91d000000ff55404989c748c740f80200000048894808594883c428488908c2100048c7c001000000c21000909090909090900000000000000000b800000000000000|@1363,2097151,@18140,@8362|34,0,@8352 8902:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18144| 8903:S93|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737346756e4465636c61726174696f6e28342970726f6365737342696e64696e672831296d6f766552656673283129 8904:D3,128|483b65187303ff5548a8017555498d4fe8483b4d107303ff55404989cf48c741f80200000048895908488b1048891151488b50084889d09090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,15,@18143| 8905:D3,256|483b65187303ff5548a8017570488b0841524151415053ff7008ff31ff7108ff742478ff742478ff742478ff742478ff742478ff742478ff742478488b5c2478488b4118488b542450909090ff1259488901498d4fe8483b4d107303ff55404989cf48c741f802000000488941085848890151ff742470ff742470eb05e962000000ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c2450488b4424489090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2400048c7c001000000c2400090900000000000000000f800000000000000|@1363,1048575,@18145| 8906:D5,296|483b65187303ff5548a801756a488b08ff711041514150ff35230100004151415053ff7008ff71104c8d4c24284c8b01488b53684889d348b8688c19c9a37f0000909090ff15fe0000004883f801750948c7c001000000eb48498d4fe8483b4d107303ff55404989cf48c741f802000000488b1424eb05e98e00000048895108488b00488901498d47f0483b45107303ff55404989c748c740f8010000004889084883f801751d4c8b4c24204c8b442418488b5c24104883c408584883c438e93cffffffff304c8b4c24284c8b442420488b5c2418488b442410909090e81effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c448c348c7c001000000c390909090909000000000000000002001000000000000|@3359,1048575,@18146,@8907,@8408|57,0,@8371 8907:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18147,@8347| 8908:D5,584|483b65187303ff5548488b4818f6c1017538488b1148833a01751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b51084889d1483b65187303ff5548ebc348c7c60100000040f6c601756c488b0e488339017568498d57a0483b55107303ff55404989d748c742f802000000488b790848897a0848c702070000004c8d5a1849c743f80200000049895b0849c70303000000498d5b1848c743f80200000048c74308010000004c891b4c8d5b1849c743f802000000eb0ae90e000000e90900000049895b08498913eb3a498d4fd0483b4d107303ff55404989cf48c741f8020000004889590848c701030000004c8d591849c743f80200000049c743080100000049890b498d4fd0483b4d107303ff55404989cf48c741f80500000048ba78e01ac9a37f00004889114c8949084c894110488941184c895920488061ffbf498d57d0483b55107303ff55404989d748c742f80500000048bb68e21ac9a37f000048891a4c894a084c895210488942184c895a20488062ffbf498d5fd0483b5d107303ff55404989df48c743f80500000048bed8e51ac9a37f00004889334c894b08488b74240848897310488943184c895b20488063ffbf498d7fe0483b7d107303ff55404989ff48c747f8030000004889571048894f0848891f4989fa4c8b581048c7c35d000000488b0090ff156200000041ff7320ff34246a014c89d14989c249c7c1030000004c8b4424104889cb498b0390ff154200000048c7c0010000004883c408c208009090909000000000000000004002000000000000|@8918,1048575,@18155,@100,@8412|298,0,@8909 356,0,@8912 414,0,@8917 8909:D5,176|483b65187303ff5548488b48084c8b3052ff314c8b4220488b5a18488b410890ff15a2000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901488b04245141564989c84c89f3488b50104889d09090ff156e000000488b442410488b4008488b4818498d47e8483b45107303ff55404989c748c740f802000000488b542408488950085a4883c4104889104889caff229090900000000000000000a800000000000000|@8911,2097151,@18148,@8910,@1504| 8910:D4,120|483b65187303ff5548a801754d4d89c34989dc4c8b68084d89d84c89e3488b00ff156a000000504d89d84c89e34c89e890e8caffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007000000000000000|@1363,4095,@18149,@8537| 8911:S76|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e74726965732832295f2d283129 8912:D5,136|483b65187303ff55484c8b104989d34d8b4320498b5b18488b400890ff157e00000050415241534989c04c89d3498b4310909090ff156e000000488b0424488b40084883c408488b4850498d47e8483b45107303ff55404989c748c740f802000000488b542408488950085a4883c4084889104889caff2200000000000000008000000000000000|@8911,2097151,@18150,@8913,@1504| 8913:D5,320|483b65187303ff5548488b4808488339037570498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848c7020300000048837818017421488b70104889d74c8b08488b58184c89c09090ff15fe0000004989c04889faeb07488b70104c8b08498d47d8483b45107303ff55404989c748c740f804000000eb05e9100000004c89401848897010488950084c8908c348833901756d498d57e0483b55107303ff55404989d748c742f80300000048895a10488b590848895a0848c7020900000048837818017422488b7010488b384989d1488b58184c89c0909090ff15760000004989c04c89caeb07488b7010488b38498d47d8483b45107303ff55404989c7eb05e91800000048c740f8040000004c8940184889701048895008488938c3c39090909090909000000000000000003801000000000000|@8915,255,@18151,@8916,@8914| 8914:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18153| 8915:S35|5354525543545f56414c5328292e6d616b6553656c6563746564537472756374283329 8916:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18152| 8917:D5,144|483b65187303ff55484c8b184989d44d8b442420498b5c2418488b4008909090ff158200000050415341544989c04c89db498b4424109090ff1572000000488b0424488b40084883c408488b4810498d47e8483b45107303ff55404989c748c740f802000000488b542408488950085a4883c4084889104889caff229090909000000000000000008800000000000000|@8911,2097151,@18154,@8537,@1504| 8918:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c756573283229636f7079456e7472696573283229 8919:D3,208|483b65187303ff5548a801757141524151415053ff7008ff742468ff742468ff742468ff742468ff742468ff742468ff742468488b5c2468488b00488b542440ff1250ff742470ff742470ff742470ff742470ff742470ff742470ff742470ff7424704c8b5424684c8b4c24604c8b442458488b5c2450488b442448eb05e9310000009090e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2400048c7c001000000c2400090900000000000000000c800000000000000|@1363,1048575,@18156| 8920:D4,232|483b65187303ff5548a8017563488b08f6411001755f488b51104889de498d5fd8483b5d107303ff55404989df48c743f80400000048bf08e91ac9a37f000048893b4c8943084c894b1048897318488063ffbf4151415056ff7008488b0248bab8c019c9a37f0000ff1592000000eb19e959000000488b480848b830e306c9a37f0000415141505351504c8b4c24204c8b442418488b5c2410488b442408909090e85affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c390900000000000000000e000000000000000|@1363,2097151,@18159,@8473|55,0,@8921 96,0,@8472 123,0,@573 8921:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796848897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@18157,@8922,@8370| 8922:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@8390,2097151,@18158,@8347| 8923:D4,992|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f802000000488b50204889510848c70101000000ff30ff70084152524150ff70284151ff7030535148c7c001000000498b90800000009090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901488b042448833803756e498d47e0483b45107303ff55404989c748c740f80300000048ba509adc000000000048895010488b54242848895008488b5c2440488918498d77e8483b75107303ff55404989f748c746f80200000048bf30e306c9a37f000048897e08488b7c240848893e514989c14989f0eb05e94000000048c7c301000000488b442420488b5424189090ff12498d4fe0483b4d107303ff55404989cf48c741f803000000488941105848894108488b442440488901eb504883380b754f488b5008488b5c24084883fa0175184883fb01740948c7c201000000eb5848c7c203000000eb4ff6c3017543488b3248833e0d7531488b3b4c8b46084c3b077525488b7b084889fbeb0ae951010000e969000000488b7a084889fa483b65187303ff5548eba348c7c201000000eb0748c7c2010000004883fa01750948c7c201000000eb3f488b5018488b5a10488b730848833e05750948c7c201000000eb24498d57f0483b55107303ff55404989d748c742f80100000048891aeb0748c7c2010000004883fa017570498d57e0483b55107303ff55404989d748c742f80300000048bb509adc000000000048895a10488b5c242848895a08488b742440488932498d7fe8483b7d107303ff55404989ff48c747f80200000048894708488b442408488907514989d14989f848c7c301000000488b442420eb05e933000000488b54241890ff12498d4fe0483b4d107303ff55404989cf48c741f803000000488941105848894108488b442440488901eb2e4889c8498d4fe0483b4d107303ff55404989cf48c741f803000000488b124889511048894108488b442440488901514c8b442430488b5c24289090ff15de000000498d47e8483b45107303ff55404989c748c740f802000000488b0c2448894808488b542448488910488b54243890ff12498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908488b542440488902488b442458498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488b4818488d421848c740f80200000048895008488b5424484889104889ca4883c450594883c40851ff22909090900000000000000000d803000000000000|@8924,1048575,@18160,@8558|200,0,I48 255,0,@573 587,0,I48 8924:S71|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c75657328322970726f6365737354797065283229 8925:D10,1480|483b65187303ff554848837b20017438498d4fe0483b4d107303ff55404989cf48c741f80300000048bab8f41ac9a37f0000488911498b5030488951084c894910488061ffbfeb04498b4830488b542458498d77d8483b75107303ff55404989f748c746f80400000048bf28f51ac9a37f000048893e498b786048897e084c8b4a084c894e104d8b52084c895618488066ffbf48837b200174394d8d57e04c3b55107303ff55404d89d749c742f80300000049bbb8f51ac9a37f00004d891a4d8942084c8b5c24504d895a10498062ffbfeb044d8b50484d8d5f884c3b5d107303ff55404d89df49c743f80e0000004d8b60684d89636849897360498b7058498973584d8b68504d896b504d8953484d8b50404d8953404d8b70384d89733849894b30498b482849894b284d8b50204d8953204d8b50184d8953184d8b60104d896310498b480849894b08498b30498933ff7310ff7308ff732050ff33ff742468ff742468ff742468ff7424684c8b5424384d89d14d89d8488b5c2460488b442468488b9424900000009090ff12504889c3488b44241048bab06507c9a37f0000909090ff1536040000a801756fff304c8b5424484c8b4c24784c8b442418488b5c241048b8f0f71ac9a37f00009090ff1512040000504c8b5424504c8b8c24800000004c8b442410488b5c243048b848d61ac9a37f0000ff15f20300004889c649b9d04e19c9a37f00004c8b4424504c89c3488b842480000000eb05e9ee02000048bae84e19c9a37f0000ff15c6030000564889c1488b4424104889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d85d19c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b808f81ac9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13488b4c24704889c6ff7128ff7130ff7138ff7140ff7148ff7150ff7158ff7160ff7168ff7170ff7178ffb1800000004c8b51204c8b49184c8b4110488b5908488b0190ff1566010000564889c3488b44244048ba682b18c9a37f0000909090ff1552010000498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542430488950185b488958104889480848c70003000000488b4c2470488b591848c70303000000488b51609090ff12eb0748c7c00100000048837c2418017469488b4424204883382d750f488b4008483b65187303ff5548ebeb48833817750948c7c003000000eb1c4883380b750f488b4010483b65187303ff5548ebc748c7c0010000004883f801753a488b442470488b4c243849ba60f81ac9a37f00004c8b4c24284989c8eb05e91700000048c7c3030000004883c4305a4883c45852ff256c00000048c7c0010000004883c430c258009090909090900000000000000000c005000000000000|@8942,2097151,@18170,@1633,@8503,@8503,@8310,@8349,@8028,@8347|42,0,@8926 107,0,@8927 180,0,@8928 409,0,@1292 454,0,@8932 496,0,@8891 515,0,@8308 548,0,@8309 631,0,@2141 672,0,@8326 751,0,@1294 818,0,@833 891,0,@833 968,0,@833 1009,0,@8933 1088,0,@1294 1189,0,@8026 1398,0,@8935 8926:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18161| 8927:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18162| 8928:D4,176|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700010000004889c1498d47e8483b45107303ff55404989c748c740f80200000048bb98f61ac9a37f000048891848894808488060ffbf5251488b5a104889da9090ff1258488b00488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252c000000909090900000000000000000a800000000000000|@8931,1048575,@18164,@8930|73,0,@8929 8929:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8358,15,@18163| 8930:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18165| 8931:S88|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b54797065732832296e6577456e762d283129 8932:S8|5061747465726e3a 8933:O2|3,@8934 8934:S47|5061747465726e20616e642065787072657373696f6e206861766520696e636f6d70617469626c652074797065732e 8935:S51|526563757273697665206465636c61726174696f6e206973206e6f74206f662074686520666f726d2060666e206d6174636827 8936:S65|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329 8937:D4,264|483b65187303ff5548a801756f488b08498d57d0483b55107303ff55404989d748c742f80500000048be38fa1ac9a37f0000488932488b7118488972084c894210488b792048897a1848895a20488062ffbf41524151415053ff70085741514152ff742458ff74245849ba58fb1ac9a37f000049c7c101000000eb05e9670000004c8b4424584889d3488b01ff158e00000050ff742448ff742448ff7424484c8b5424404c8b4c24384c8b442430488b5c2428488b44242090e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c2180048c7c001000000c2180090909090909000000000000000000001000000000000|@1363,2097151,@18169,@8362|42,0,@8938 107,0,@8940 8938:D3,144|483b65187303ff554852ff700850488b4a204889ca909090ff12488b44241048837818017410488b4810488b04244889ca909090ff12488b4424104883c408488b4808488b09498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a488b40084883c40848891048c7c001000000c39090909090909000000000000000008800000000000000|@8939,1048575,@18167| 8939:S85|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329646f56616c283129656e74657256616c73283129 8940:O1|@8941 8941:D3,384|498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f8030000004889531048894b0848c70305000000488d4b2048c741f801000000c641ff4048c70101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fc0483b7d107303ff55404989ff48c747f8030000004889771048894f08488917488d4f2048c741f801000000488939488d511048c742f801000000c642ff4048c70201000000498d77b0483b75107303ff55404989f748c746f801000000488916488b5010488b78084c8b00488d461048c740f807000000488970304889482848895020488978184889581048c74008050000004c8900c3909090909000000000000000007801000000000000|@8354,127,@18168|65,0,@2150 8942:S78|54595045434845434b5f50415253455452454528292e706173733228352961737369676e56616c75657328352961737356616c4465636c61726174696f6e283329636865636b5479706573283229 8943:D63,7112|483b65187303ff55484c89c74989d94989c24989d34d8b4210498b5a08498b02ff15ba1b0000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba401b1bc9a37f00004889114c894908488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70213000000f6c20174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f901740c4889cb909090ff15221b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bae81b1bc9a37f00004889114c8959084c8951104c894918488061ffbf498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fd8483b5d107303ff55404989df48c743f80400000048beb01c1bc9a37f0000488933498b7318488973084d8b43104c8943104d8b63204c896318488063ffbf48891a498d57e8483b55107303ff55404989d748c742f80200000048bb50321bc9a37f000048891a4c895a08488062ffbf498d5fe8483b5d107303ff55404989df48c743f80200000049bdc8331bc9a37f00004c892b4c895b08488063ffbf4d8d6fe84c3b6d107303ff55404d89ef49c745f80200000049be40621bc9a37f00004d8975004d8b73084d897508498065ffbf498b3149b87aff1ac9a37f00004d8d44b0fc41ffe09090e9ea030000909090e9c3040000909090e952050000909090e9ae070000909090e91f090000909090e9320a0000909090e91c0b0000909090e92b0b0000909090e9360b0000909090e9470b0000909090e9ce0b0000909090e92a0c0000909090e9e90c0000909090e93a0e0000909090e983000000909090e9410f0000909090e934100000909090e9c2100000909090e985110000909090e9f4110000909090e986120000909090e9ee120000909090e97e130000909090e988130000909090e941140000909090e9ac140000909090e96d150000909090e9d6150000909090e90a160000909090e9cb170000909090e9a6180000909090498b4908488b5110488b12488b5908488b1b6a016a016a01488b33483b35cc180000745040f6c601753d4989f848bf388819c9a37f00004c8b49184c8b114c8b692048c7c12700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174204c89c7eb674c8b69204c8b49184c8b11eb5f4c8b69204c8b49184c8b114989f84d8b6d00415041515052415248c7c0010000004c89ea9090ff125b90ff1552180000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000f6c101741feb0ae95f000000e95a00000048b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d4c242048c70101000000488d4c242048c7410801000000488d4c242048894110eb354989c04989d24c8b6b28488b43209090ff15b61700004889e14889014889e04c8968084889e048c740100100000057415141504152f644242801756d488b442428488b08488b11488b12488b5908488b1b488b7110488b364889d74889f09090ff156e1700004883ff0174114889de4889fb9090ff15621700004889f3498d4fe0483b4d107303ff55404989cf48c741f803000000488941104889590848c70115000000f6c101eb05e938000000741148b8f86f07c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb0748c7c001000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c7011b000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff1348837c24280174144889ce488b5c2428909090ff15a21600004889f14883f8017506488b0424eb144889ce4889c3488b042490ff158a1600004889f14883f8017507488b442418eb174889ce4889c3488b442418909090ff156e1600004889f1498d57e8483b55107303ff55404989d748c742f8020000004889420848890a488b4424104883c408594889084889500848c7c0010000004883c420c3498b51084889c64989c84c8b52084c8b2aff7220488b4210909090ff15161600004989c1589090ff1512160000575653504c89e8909090ff150a1600004883f8017506488b0424eb104889c3488b0424909090ff15f61500004883f80174114889c34c89c89090ff15ea1500004989c1498d47d8483b45107303ff55404989c748c740f8010000004c8900488d481048c741f802000000488941084883c408584889014889cb4c89c89090ff15ae15000048833c2401740d488b1c24909090ff15a2150000488b4c24084883c4084c89114889410848c7c0010000004883c408c3498d57a8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f80200000048895108498b5308488911488d591848c743f80200000048c7430801000000498b71104889334c8d431849c740f80200000049895808498b59084989184989c24889cb4c89c090ff151a1500004983fa01740a4c89d390ff15121500004d8b49184c890f4889470848c7c001000000c3498b5108488b5a0848833b337555f64308017554488b7308f6460801755e4c8b46084983780801755848837a180375564c8b52104d8b124d8d6fe84c3b6d107303ff55404d89ef49c745f8020000004d89550849c745001b00000041f6c5017433eb0ae900010000e9fb0000004989c248b8f86f07c9a37f0000eb0fe9e7000000e9e2000000e9dd000000488b5d08909090ff134d8d57904c3b55107303ff55404d89d749c742f80100000049890a498d4a1048c741f8020000004c8951084d8b53084c89114c8d611849c74424f80200000049c7442408010000004d8b304d8934244d8d4c241849c741f8020000004d8961084c8b224d8921498d591848c743f8020000004c894b084c8b0e4c890b50ff7220534889cb589090ff15e613000048837c240801740c488b5c240890ff15da130000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c8929584883c40848890748894f0848c7c001000000c3488b7210488b364d8d47e84c3b45107303ff55404d89c749c740f8020000004989700849c7001b00000041f6c00174144889c648b8f86f07c9a37f0000488b5d0890ff13498d77a8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048897108498b73084889314c8d511849c742f80200000049c742080100000049891a4d8d6a1849c745f8020000004d8955084c8b124d89550050ff72204889cb4c89e890ff15fa12000048837c240801740c488b5c240890ff15ee120000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c8901584883c40848890748894f0848c7c001000000c3498b5108488b5a10488b1b498d77d0483b75107303ff55404989f748c746f805000000c646ff4049b8806a1bc9a37f00004c89064c895e084c8b024c89461048c746180100000048894e204d8d57c84c3b55107303ff55404d89d749c742f80600000049bc906b1bc9a37f00004d89224c8b62204d8962084989721049894a184c8b72084d8972204d896a28498062ffbf4c895618488066ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004889710848c70109000000f6c10174164889c648b8f86f07c9a37f0000488b5d08909090ff13498d77e8483b75107303ff55404989f748c746f80200000048895e0848c7061b00000040f6c60174134889c348b8f86f07c9a37f0000488b5d08ff13498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488933488d731848c746f80200000048895e0848890e4883f80174164c8b52184889c34889f090ff15621100004889c6eb044c8b52184c89174889770848c7c001000000c3498b5908498d77c8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048897108488911488d511848c742f801000000c642ff4048c70201000000498db770ffffff483b75107303ff55404989f748c746f80200000048895608488b134889164c8d461849c740f8020000004c8b53284d8950084c8b6b104d89284d8d601849c74424f8020000004c8b5b204d895c24084c8b73084d8934244d8d4c241849c741f80200000049c74108010000004d89214d8d611849c74424f8020000004d894c24084d8904244d8d44241849c740f8020000004d8960084989304989c14c8b63184889cb4c89c0ff15561000004983f901740a4c89cb90ff154e1000004c89274889470848c7c001000000c3498d57d8483b55107303ff55404989d748c742f804000000c642ff4048bb786d1bc9a37f000048891a498b590848895a0848c742100100000048894a18498d77d0483b75107303ff55404989f748c746f80500000049b8686e1bc9a37f00004c89064c895e084d8b41104c8946104889561848894e20488066ffbf48897210488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004889710848c70109000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d57e8483b55107303ff55404989d748c742f8020000004889420848890a498b41184889074889570848c7c001000000c34d8b49084d8b49204c890f4889470848c7c001000000c34d8b49184c890f4889470848c7c001000000c348b9b06319c9a37f000048890f4889470848c7c001000000c3498d57e8483b55107303ff55404989d748c742f80200000048bb386f1bc9a37f000048891a4c895a08488062ffbf498d5fd8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f802000000488959084889114989c04889cb498b4108ff15a60e00004983f801740a4c89c390ff159e0e00004d8b49104c890f4889470848c7c001000000c3498d5fd8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f802000000488959084889114989c04889cb498b4108909090ff15520e00004983f801740a4c89c390ff154a0e00004d8b49104c890f4889470848c7c001000000c3498b5108488b12498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c7031b000000f6c30174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57d8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f802000000488951084c89294989c04989da4889cb498b4110ff15ba0d00004983f801740a4c89c390ff15b20d0000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c89114d8b49184c890f48894f0848c7c001000000c3498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fe0483b5d107303ff55404989df48c743f80300000048beb87b1bc9a37f000048893348895308498b731048897310488063ffbf48891a498d57e8483b55107303ff55404989d748c742f802000000c642ff4048bb80b11bc9a37f000048891a48c7420801000000498d5fe0483b5d107303ff55404989df48c743f80300000049b820b21bc9a37f00004c8903488953084c895b10488063ffbf48895a08488062ffbf498d5fe8483b5d107303ff55404989df48c743f80200000049b8a0b81bc9a37f00004c890348895308488063ffbf498d57d8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f802000000488951084889194989c04889cb498b41089090ff15520c00004983f801740a4c89c390ff154a0c00004d8b49204c890f4889470848c7c001000000c3498d57d0483b55107303ff55404989d748c742f805000000c642ff4048bb70c81bc9a37f000048891a4c895a08498b590848895a1048c742180100000048894a20498d77c8483b75107303ff55404989f748c746f80600000049b840c91bc9a37f00004c89064d8b41204c8946084889561048894e184d8b51104c8956204c896e28488066ffbf48897218488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848c70109000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a4883f801740f4889c34889d0ff153e0b00004889c2498b41184889074889570848c7c001000000c3498b5110488b12498d5fe8483b5d107303ff55404989df48c743f80200000048bee8ca1bc9a37f00004889334c895b08488063ffbf498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f802000000488971084889194989c04989d24889cb498b4118ff15ba0a0000498d4fe8483b4d107303ff55404989cf48c741f8020000004c89510848c7011b000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff134983f80174124889ce4c89c3909090ff15720a00004889f1498d57e8483b55107303ff55404989d748c742f8020000004889420848890a4d8b49204c890f4889570848c7c001000000c3498d57a8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f80200000048895108498b5308488911488d591848c743f80200000048c7430801000000498b71104889334c8d431849c740f80200000049895808498b59084989184989c24889cb4c89c0ff15d20900004983fa01740a4c89d390ff15ca0900004d8b49184c890f4889470848c7c001000000c3498b5108488b12498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c7031b000000f6c30174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57d8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f80200000048895108498b53084889114989c04989da4889cb498b4110ff15360900004983f801740a4c89c390ff152e090000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c89114d8b49184c890f48894f0848c7c001000000c3498b4908488b09498d57e8483b55107303ff55404989d748c742f80200000048894a0848c7021b000000f6c20174164889c148b8f86f07c9a37f0000488b5d08909090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488941084889114d8b49184c890f48894f0848c7c001000000c3498b5908498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f8020000004889710848891148833b017506488b5308eb284889c64c8b43184989ca488b4308488b0b4889cb909090ff15320800004889c24c89d14889f0eb044c8b43184989c14889cb4889d09090ff151a0800004983f901740a4c89cb90ff15120800004c89074889470848c7c001000000c3498b5108498d5fd8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f8020000004889590848bbe8d11bc9a37f00004889194989c04c8b52084889cb488b029090ff15ba0700004983f801740a4c89c390ff15b20700004c89174889470848c7c001000000c3498d57a8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f80200000048895108498b5308488911488d591848c743f80200000048c7430801000000498b71104889334c8d431849c740f80200000049895808498b59084989184989c24889cb4c89c09090ff15360700004983fa01740a4c89d390ff152e0700004d8b49184c890f4889470848c7c001000000c34989f8498b59084c89d04c89dae9b1e9ffff498d57d8483b55107303ff55404989d748c742f80400000048bbb0d31bc9a37f000048891a4c895a08498b590848895a1048894a18488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848c70109000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a4883f801740f4889c34889d0ff15660600004889c24d8b49104c890f4889570848c7c001000000c3498d4fe8483b4d107303ff55404989cf48c741f802000000498b51104889510848c7011b000000f6c10174154889c348b8f86f07c9a37f0000488b5d089090ff13498d5fe8483b5d107303ff55404989df48c743f8020000004889430848890b498b412048890748895f0848c7c001000000c3498b5110488b12498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c7031b000000f6c30174134889c248b8f86f07c9a37f0000488b5d08ff13498d57d8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f80200000048895108498b53084889114989c04989da4889cb498b4108ff155e0500004983f801740a4c89c390ff1556050000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c89114d8b49184c890f48894f0848c7c001000000c34889c64989c8498b41089090ff151a050000498d4fd8483b4d107303ff55404989cf48c741f8010000004c8901488d511048c742f80200000048894a0848891a4989f04889d39090ff15e60400004983f801740a4c89c390ff15de0400004d8b49104c890f4889470848c7c001000000c3498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b0d41bc9a37f00004889014d8b49084c890f48894f0848c7c001000000c3498d57e8483b55107303ff55404989d748c742f80200000048bbc8d41bc9a37f000048891a498b5b0848895a08488062ffbf498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f802000000488971084889114989c04889cb498b410890ff152604000041f6410801755b498b4908488b11488b1a48833b1d7555488b73084c8b2e4c3b2d09040000744f41f6c50175444c89ee4989fd48bff8f419c9a37f0000ff710848c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741ceb05e92a0000004c89efeb19e919000000ff7108eb0fff71084989fd48833c24017553eb134989fdeb514989fd6a01eb4f4989fd6a01eb4d498b4908488b31488b3e4c8b67084d8b742418498b5620f6c201750a41f64618017503ff5570493b56187545498b5e10f6c301752041f64608017519eb14e955000000e950000000e94b000000e946000000ff5570493b5e0875164d89e8488b5e084c89d04c89da4883c408e98de5ffff4983f80174094c89c3ff151e0300004d8b49204d894d004989450848c7c0010000004883c408c34983f801740a4c89c390ff15fe0200004d8b49204d894d004989450848c7c0010000004883c408c3498d5fc8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f80200000048895908488911488d511848c742f801000000c642ff4048c70201000000498d5fa0483b5d107303ff55404989df48c743f80200000048895308498b5110488913488d731848c746f8020000004d8b41204c8946084d8b51084c89164c8d6e1849c745f80200000049c745080100000049897500498d751848c746f8020000004c896e0848891e4989c54889cb4889f0909090ff152e0200004983fd01740a4c89eb90ff1526020000498b491848890f4889470848c7c001000000c34d8b49084c890f4889470848c7c001000000c30000000000000000c01b000000000000|@9240,1048575,@18297,@9003,@9241,@8366,@9242,@2055,@9243,@9244,@9245,@9246,@9247,@9248,@9249,@9250,@9251,@9252,@9025,@9253,@9025,@9254,@9025,@9255,@9025,@9256,@9257,@9025,@9258,@9025,@9259,@9025,@9260,@9025,@9261,@9025,@9262,@9263,@9025,@9264,@9025,@9265,@9025,@9266,@9267,@9025,@9268,@9025,@9269,@9025,@9270,@9271,@9025,@9272,@9273,@9025,@9274,@9025,@8566,@9275,@9276,@9025,@9239|64,0,@8944 129,0,@1294 224,0,@8946 313,0,@8948 382,0,@8989 428,0,@8991 474,0,@9067 504,0,$8943+522 817,0,@8366 988,0,@1294 1254,0,@1294 1359,0,@1294 2019,0,@1294 2318,0,@1294 2558,0,@9079 2618,0,@9081 2716,0,@1294 2779,0,@1294 3207,0,@9084 3264,0,@9086 3354,0,@1294 3463,0,@8345 3512,0,@9087 3781,0,@1294 3989,0,@9107 4050,0,@9174 4095,0,@9176 4154,0,@9184 4303,0,@9210 4364,0,@9211 4462,0,@1294 4585,0,@9213 4715,0,@1294 5005,0,@1294 5208,0,@1294 5478,0,@9224 5737,0,@9228 5814,0,@1294 5953,0,@1294 6071,0,@1294 6363,0,@9230 6419,0,@9231 6559,0,@8566 8944:D4,48|483b65187303ff55484889c3488b420848ba682b18c9a37f0000ff252800000000000000000000002800000000000000|@8945,2097151,@18171,@8028|18,0,@8026 8945:S50|4558504f52545f50415253455452454528292e6765744578706f727454726565283229636f6d6d6f6e50726f70732d283129 8946:D3,96|483b65187303ff55486a016a014989e0488b5a18488b4210488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c39090909000000000000000005800000000000000|@8947,1048575,@18172| 8947:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296173506172656e74283129 8948:D3,1832|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017561f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b4b0848890e488b5208488b124889f0909090ff12488338017555f64020017554488b4820f6410801755f488b1148833a07eb05e9a9010000751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b900241bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c3488b3848833f03756a40f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48bac01607c9a37f0000eb6b4989f041f6c00174064983e8027105ff5570ebf54d8d4fe84c3b4d107303ff55404d89cf49c741f8020000004d8941084c8b47084d8901eb05e90f020000488b5210488b12ff7710564c89c8ff1259f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e9dd000000ff55404989d748c742f80200000048894a085948890a48b908c119f1a37f0000488b09505248b8c02e1bc9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b940311bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b400841f6c00174084983f8037d14eb0741f640ff10740b48b8707907c9a37f0000c341f6c00174064983e8027105ff5570ebf54d8d4fe84c3b4d107303ff55404d89cf49c741f8020000004d8941084c8b47084d8901488b5218488b124c89c890ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b8311bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000002007000000000000|@8988,1048575,@18181|34,0,@1326 221,0,@883 290,0,@884 331,0,@835 464,0,@833 505,0,@8949 605,0,@1326 662,0,@821 808,0,@20174 823,0,@8968 876,0,@831 921,0,@833 962,0,@834 1035,0,@835 1146,0,@833 1187,0,@8980 1288,0,@1326 1446,0,@883 1525,0,@884 1566,0,@835 1699,0,@833 1740,0,@8984 8949:O5|0,0,0,@8951,@8950 8950:O2|@8955,0 8951:O2|@8952,0 8952:O2|0,@8953 8953:O5|@8954,66,66,0,0 8954:S50|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4558504f52545f5041525345545245452e736d6c 8955:O2|3,@8956 8956:S5|4461746154 8957:O2|@8958,@20175 8958:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbb0251bc9a37f0000488918488b52084889500848894810488060ffbfc390909090909000000000000000004800000000000000|@115,15,@18176|29,0,@8959 8959:D5,72|483b65187303ff5548488b4a10ff7108ff354a0000004c8b4a084c8b40084889e3488b304889f090ff153a0000004883c410c3909090909000000000000000004000000000000000|@3527,1048575,@18173,@8965,@8960| 8960:D3,1840|483b65187303ff5548488b0841f6c00174084983f8017f14eb0741f640ff10740b48b8f83706c9a37f0000c3488b5578488b5210f6c2017554488b32488b364c3b0e753a4c3b0e74144889c248b878e107c9a37f0000488b5d0890ff13498d57f0483b55107303ff55404989d748c742f801000000488b7610488932eb16488b5208483b65187303ff5548eba748c7c201000000f6c2017505488b12eb0748c7c2010000004889d640f6c601751d483b06750948c7c603000000eb16488b7608483b65187303ff5548ebdd48c7c6010000004883fe01740b48b8f83706c9a37f0000c3524151ff750848be0e2c1bc9a37f00005648896508498d77e8483b75107303ff55404989f748c746f80200000048895608488906488b4578488b40104889c740f6c70175514c8b174d8b124d3b0a75374d8d57d84c3b55107303ff55404d89d749c742f80400000049c74218010000004989721049c742088b0000004d890a488b3f4c8917eb70488b7f08483b65187303ff5548eba9488b7d784d8d57c84c3b55107303ff55404d89d749c742f80400000049c74218010000004989721049c742088b0000004d890a4d8d5a2849c743f80100000041c643ff404d89134d8d57e84c3b55107303ff55404d89d749c742f802000000eb05e90b000000498942084d891a4c89571041f6c00174064983e8027105ff5570ebf54889d84c89c34889c64889c84889f29090ff1248833801754ff6402001754e488b48204883790801745b488b1148833a07755748817a08b7000000745e48817a08f7000000745948837a08517457498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c6010000e92a01000048bec04e06c9a37f000048897308488903eb0ae9a9010000e977000000498d77e8483b75107314eb0fe993010000e98e010000e989010000ff55404989f748c746f80200000048895e0848bb284f06c9a37f000048891e498d47d0483b45107303ff55404989c748c740f8050000004889702048c740180100000048c740100300000048c740080700000048c70001000000eb70498d5fe8483b5d107303ff55404989df48c743f80200000048bec04e06c9a37f000048897308488903498d77e8483b75107303ff55404989f748c746f80200000048895e0848bb284f06c9a37f000048891e498d47d0483b45107303ff55404989c748c740f80500000048897020eb05e9b800000048c740180100000048c740100300000048c740080700000048c70001000000eb6f498d4fe8483b4d107303ff55404989cf48c741f80200000048bac04e06c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9284f06c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f805000000eb05e9230000004889482048c740180100000048c740100300000048c740080700000048c70001000000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9f04e06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8882d1bc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000488b4d78488b49104889caf6c2017558488b1a488b1b488b1b483b5c2410754d498d5fd8483b5d107303ff55404989df48c743f80400000048c7431801000000488b7424184889731048c743088b000000488b7c241048893b488b1248891a48c7c201000000eb71e90f000000488b5208483b65187303ff5548eb8f488b5578498d5fc8483b5d107303ff55404989df48c743f80400000048c7431801000000488b7424184889731048c743088b000000488b7c241048893b4c8d432849c740f80100000041c640ff40498918498d5fe8483b5d10730aeb05e920000000ff55404989df48c743f80200000048894b084c890348895a1048c7c2010000004883c4085948894d084883c410c3488b65084883c4085b48895d08488b4d78488b49104889caf6c201755e488b1a488b1b488b1b483b1c247540498d5fd8483b5d107303ff55404989df48c743f80400000048c7431801000000488b7424084889731048c743088b000000488b3c2448893b488b1248891aeb6b488b5208483b65187303ff5548eb9d488b5578498d5fc8483b5d107303ff55404989df48c743f80400000048c7431801000000488b7424084889731048c743088b000000488b3c2448893b4c8d432849c740f80100000041c640ff40498918498d5fe8483b5d10730aeb05e919000000ff55404989df48c743f80200000048894b084c890348895a10498d4fd8483b4d107303ff55404989cf48c741f80400000048bab82d1bc9a37f000048895118488b501048895110488b580848895908488b304889314889c8488b5d0890ff139090909090909000000000000000002807000000000000|@8967,1048575,@18175|35,0,@77 78,0,@1486 218,0,@77 235,0,$8960+1502 623,0,@150 697,0,@154 795,0,@150 840,0,@154 945,0,@150 990,0,@154 1123,0,@152 1164,0,@8961 1773,0,@8963 8961:O2|3,@8962 8962:S3|726566 8963:O5|@8964,117,0,117,0 8964:S22|2e2f62617369732f45786e5072696e7465722e736d6c 8965:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@8966,1048575,@18174| 8966:S14|7072696e745f7265662833292d45 8967:S12|7072696e745f726566283329 8968:O4|0,@8969,3,1 8969:O1|@8970 8970:D3,64|483b65187303ff554848b998b019f1a37f0000488b095048b8602f1bc9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@1968,1048575,@18180|11,0,@20031 25,0,@8971 8971:O4|0,@8972,2,1 8972:O1|@8973 8973:D3,64|483b65187303ff554848b908c119f1a37f0000488b095048b800301bc9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@8979,1048575,@18179|11,0,@20174 25,0,@8974 8974:O4|0,@8975,1,1 8975:O1|@8976 8976:D3,48|483b65187303ff554848b928c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2375,1048575,@18178|11,0,@20176 8977:O1|@8978 8978:D3,88|48833801750c48b800f20ac9a37f0000eb0a48b8e8f10ac9a37f00004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c3909090909000000000000000005000000000000000|@115,3,@18177|8,0,@3253 20,0,@3252 8979:S9|7072696e742d726566 8980:O5|0,0,0,@8951,@8981 8981:O2|@8982,0 8982:O2|3,@8983 8983:S4|4465636c 8984:O5|0,0,0,@8951,@8985 8985:O2|@8986,0 8986:O2|3,@8987 8987:S5|5479706542 8988:S11|7072696e742d6c54797065 8989:D3,264|483b65187303ff5548488b4808488b5908488b1bf6c30175726a016a01ff334c8d442408488b19488b304889f0488b5208909090ff12498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e925000000488b54240848895108488901488d411848c740f80200000048894808594883c408488908c36a016a014989e0488b19488b304889f0488b5208909090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c300000000000000000001000000000000|@8990,1048575,@18182|99,0,@1294 8990:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745472656557697468427074283129 8991:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9065,1048575,@18223,@8992| 8992:D6,1216|483b65187303ff554848833b03756a488b4b10488b09f6c10175636a016a01ff314c89c14c8d442408488b5b084889caff12498d47e8483b45107303ff55404989c748c740f802000000594889480848c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fd0483b4d10730feb0ae976000000e933000000ff55404989cf48c741f802000000488b54240848895108488901488d411848c740f80200000048894808594883c408488908c36a016a014c89c14989e0488b5b084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c348833b057568488b4b0848837910017562498d57d8483b55107303ff55404989d748c742f80400000048be28391bc9a37f00004889324889420848895a104c894218488062ffbf498d77d8483b75107303ff55404989f748c746f80400000048bff0391bc9a37f000048893eeb0ae9f6010000e9a5000000488b3948897e084c8b41204c89461048895618488066ffbf498d57e8483b55107303ff55404989d748c742f8020000004889720848c70209000000f6c20174154889c648b8f86f07c9a37f0000488b5d089090ff134c8b49184989d24c8b4010488b5808488b104889d09090ff15fa020000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8911488d411848c740f802000000488948084c8908c3488b5110498d77d8483b75107303ff55404989f748c746f80400000048bf28411bc9a37f000048893e4889460848895e104c894618488066ffbf498d7fd8483b7d107303ff55404989ff48c747f804000000c647ff4049b888411bc9a37f00004c89074c8b024c89470848c7471001000000488977184d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049ba105d1bc9a37f00004d89114c8b114d8951084c8b59204d8959104989791849897120498061ffbf4c894f10488067ffbf498d77e8483b75107303ff55404989f748c746f8020000004c894e0848c7060900000040f6c60174134889c748b8f86f07c9a37f0000488b5d08ff13488b79184989f14c8b4010488b5808488b304889f09090ff15b6010000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8909488d411848c740f80200000048894808488938c3488b4b08498d57d8483b55107303ff55404989d748c742f80400000048bec05d1bc9a37f00004889324889420848895a104c894218488062ffbf498d77d0483b75107303ff55404989f748c746f805000000c646ff4048bf205e1bc9a37f000048893e488b791848897e0848c7461001000000488956184c8b41104c8946204d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049ba00611bc9a37f00004d89114c8b114d8951084c8b59204d8959104989711849895120498061ffbf4c894e10488066ffbf498d57e8483b55107303ff55404989d748c742f8020000004c894a0848c70209000000f6c20174134889c648b8f86f07c9a37f0000488b5d08ff134989d14c8b4010488b5808488b104889d09090ff156e000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8909488d411848c740f80200000048894808488938c39090900000000000000000b804000000000000|@9066,1048575,@18224,@9003,@9003,@9003|95,0,@1294 287,0,@8993 341,0,@8996 433,0,@1294 559,0,@9008 617,0,@9009 673,0,@9056 767,0,@1294 891,0,@9057 949,0,@9058 1014,0,@9064 1107,0,@1294 8993:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba88391bc9a37f0000ff229090909090909000000000000000003000000000000000|@8995,1048575,@18183|23,0,@8994 8994:O1|@8992 8995:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296173506172656e74283129 8996:D4,112|483b65187303ff5548498d47d0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f80300000048c74310010000004889430848c7030100000049c7c1010000004c8b42104889d8488b5a08ff25290000009000000000000000006800000000000000|@9000,511,@18185,@8997| 8997:D6,272|483b65187303ff55484c89c74989da4c8b4010488b5808488b084889c8909090ff1502010000498d4fe8483b4d107303ff55404989cf48c741f80200000048bae03b1bc9a37f00004889114c895108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70213000000f6c20174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889114883f901740c4889cb909090ff156a0000004883f80174114889c34c89c89090ff155e0000004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488938c390909000000000000000000801000000000000|@9002,511,@18186,@9003,@9007,@9001|64,0,@8998 129,0,@1294 8998:D3,88|498d47e8483b45107303ff55404989c748c740f802000000488b52084889500848c70007000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390909090909000000000000000005000000000000000|@8999,7,@18184|48,0,@1294 8999:S34|4578706f72745472656528292e676574537472696e67417354726565283429283129 9000:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e672832296765744e616d65283129 9001:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18191| 9002:S31|4578706f72745472656528292e676574537472696e67417354726565283429 9003:D5,408|483b65187303ff5548f6c3017564498d4fe8483b4d107303ff55404989cf48c741f802000000488b1b4889590848c7010f000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890aeb0748c7c20100000041f6c0017563498d4fe8483b4d107303ff55404989cf48c741f8020000004d8b004c89410848c70111000000f6c10174134889c348b8f86f07c9a37f0000488b5d08ff13498d5fe8483b5d107303ff55404989df48c743f80200000048c743080100000048890beb0748c7c301000000a8017561498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c7010b000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb0748c7c0010000004883f80174194889d64889d94889c34889c890ff15420000004889c34889f24883fb0175044889d0c34889d0ff25310000009000000000000000009001000000000000|@9005,95,@18187,@9006,@9004|62,0,@1294 175,0,@1294 282,0,@1294 9004:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18189| 9005:S37|4578706f72745472656528292e6578706f72744e617669676174696f6e50726f7073283329 9006:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18188| 9007:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18190| 9008:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba88391bc9a37f0000ff229090909090909000000000000000003000000000000000|@8995,1048575,@18192|23,0,@8994 9009:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848ba38421bc9a37f0000ff252b00000090909000000000000000007800000000000000|@9055,2097151,@18216,@9012|95,0,@9010 9010:O4|@9012,@1415,@9011,@20081 9011:O2|@9053,@9010 9012:D13,1800|483b65187303ff55485253504889d890ff150a070000488b4c2410498d57e0483b55107303ff55404989d748c742f80300000048bbf8491bc9a37f000048891a488b590848895a0848894210488062ffbf498d77e8483b75107303ff55404989f748c746f8020000004889560848c7061300000040f6c60174134889c248b8f86f07c9a37f0000488b5d08ff13498d57e8483b55107303ff55404989d748c742f8020000004889420848c7021b000000f6c20174144889c748b8f86f07c9a37f0000488b5d0890ff13488b3c244989c14989f24989d34c8b4710488b5f08488b07909090ff153e060000498d4fa8483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f802000000488948084c8910488d481848c741f80400000048bab84a1bc9a37f0000488911488b5424104889510848897910488b5c24084883c40848895918488061ffbf488b3348bfe2431bc9a37f0000488d7cb7fcffe79090e946030000909090e923000000909090e967030000909090e91a040000909090e93d040000909090e9de040000909090488b73086a016a014983390b7569498b79184c8b47104d8b500849833a0375234d8b5a084c3b5a1875194989e44d8b69104d892c244989e449c744240801000000eb414c8b5e204989c44989cd4c8b7618ff7610ff36488b4708ff1536050000488d4c2410498b5110488911488d4c241048894108eb05e9170000004c89e94c89e0eb37ff7610ff364c8b5e204c8b7618eb284889e749b8509adc00000000004c89074889e748c7470801000000ff7610ff364c8b5e204c8b7618f60424017568488b142448837a08017562498d5fc8483b5d107303ff55404989df48c743f806000000c643ff4048be484b1bc9a37f0000488933488b742410488973084c897310488b7c241848897b1848c743200100000048894b284d8d47d04c3b45107303ff55404d89c7eb0ae9aa010000e99d00000049c740f80500000049b9404c1bc9a37f00004d89084c8b4c24284d8948084c8b124d8950104989581849894820498060ffbf4c894320488063ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004c89410848c70109000000f6c10174154889c348b8f86f07c9a37f0000488b5d089090ff13498d5fe8483b5d107303ff55404989df48c743f80200000048c743080100000048890beb74498d5fc8483b5d107303ff55404989df48c743f806000000c643ff4048be284d1bc9a37f0000488933488b742410488973084c897310488b7c241848897b1848c743200100000048894b284c8b4424284d8d4fc84c3b4d107303ff55404d89cf49c741f80600000049bad84d1bc9a37f0000eb05e9940000004d89114c8b5424084d8951084989591049894918498951204d8b60104d896128498061ffbf4c894b20488063ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004c89490848c70109000000f6c10174144889c248b8f86f07c9a37f0000488b5d0890ff13498d5fe8483b5d107303ff55404989df48c743f80200000048c743080100000048890beb05488b5c24184883f80174144889d94889c34889c89090ff15aa0200004889c3498d47e8483b45107303ff55404989c748c740f802000000488958084c89184883c430c34889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b06319c9a37f00004889084883c410c3498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048897108488b5210488911498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488b7318488932488d7a1848c747f80200000048895708488b53084889174989c04c8b4b104889cb4889f890ff15d60100004983f801740a4c89c390ff15ce0100004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89084883c410c34889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b5b104889184883c410c3498d77e8483b75107303ff55404989f748c746f80200000048bf70541bc9a37f000048893e48895608488066ffbf498d57d8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f802000000488951084889314889c74c8b4318488b43084889cb9090ff15120100004883ff01740a4889fb90ff150a0100004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89004883c410c3498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048897108488b52104889114889c74c8b4310488b43084889cb909090ff15a20000004883ff01740a4889fb90ff159a0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89004883c410c390909000000000000000000007000000000000|@9049,2097151,@18210,@8004,@9003,@2055,@9050,@9025,@9051,@9025,@9052,@9025,@9048|53,0,@9013 127,0,@1294 186,0,@1294 298,0,@9015 345,0,$9012+362 562,0,I48 644,0,@9017 727,0,@9019 821,0,@1294 904,0,@9021 980,0,@9022 1086,0,@1294 1238,0,@8345 1510,0,@9037 9013:D4,80|483b65187303ff55484889c64889d748c7c0010000009090ff154a00000049c7c20100000049b9381c08c9a37f00004989c04889f3488b4710488b5708ff229000000000000000004800000000000000|@9014,1048575,@18193,@1323|39,0,@1615 9014:S44|545950455f5452454528292e747970654578706f727454726565283229636f6d6d6f6e50726f70732d283129 9015:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@9016,1048575,@18194| 9016:S40|545950455f5452454528292e747970654578706f7274547265652832296173506172656e74283129 9017:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a28488908488d581048c743f801000000488b7220488933488d7b1048c747f80300000048895f104889470848c707010000004c8b4a184c8b4210488b5a084889f8ff252d000000909090909000000000000000007800000000000000|@9018,511,@18195,@8997| 9018:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d6765744e616d65283129 9019:D3,120|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f488b5a104889f8488b4a084889caff22909000000000000000007000000000000000|@9020,1048575,@18196| 9020:S53|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d676574417267283129 9021:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a28488908488d581048c743f801000000488b7220488933488d7b1048c747f80300000048895f104889470848c707010000004c8b4a184c8b4210488b5a084889f8ff252d000000909090909000000000000000007800000000000000|@9018,511,@18197,@8997| 9022:D6,232|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f801000000488910488d481048c741f80200000048894108488b42284889014889d74889cb488b4720909090ff15b2000000498d4fe0483b4d107303ff55404989cf48c741f801000000488b5718488911488d591048c743f801000000488b77104889334989c149c7c0010000004889d84889cbff15720000004883f80174114889c34c89c89090ff15660000004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b7f08488938c3909090909090900000000000000000e000000000000000|@9024,255,@18198,@9025,@9003,@9023| 9023:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18204| 9024:S54|545950455f5452454528292e747970654578706f7274547265652832296e61764e616d65416e64417267732d67657441726773283129 9025:D3,192|4883f801750848c7c001000000c3498d4fd8483b4d107303ff55404989cf48c741f80400000048bab0501bc9a37f000048891148894108488b0348894110488b530848895118488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7060900000040f6c601741148b8f86f07c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488930c3909090909090900000000000000000b800000000000000|@9036,31,@18203|40,0,@9026 118,0,@1294 9026:D4,56|483b65187303ff55484c8b52184c8b4a1049c7c001000000488b5a08ff252e00000090909090909000000000000000003000000000000000|@9033,1048575,@18201,@9027| 9027:D3,304|483b65187303ff5548f6c301741348b870521bc9a37f0000488b5d08909090ff1348837b0801750948c7c001000000eb6d498d47d0483b45107303ff55404989c748c740f80500000048b900531bc9a37f0000488908488958084c8940104c8948184c895020488060ffbf498d4fc0483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80500000048baa8531bc9a37f0000eb05e93a000000488910488b530848895008488948104c8948184c895020488060ffbf4889c1498d47f0483b45107303ff55404989c748c740f801000000488908498d4fc8483b4d107303ff55404989cf48c741f8030000004c8941104c895108488901488d412048c740f802000000488b1b488958084889084c89caff22909090909000000000000000002801000000000000|@9035,1048575,@18202|16,0,@9028 75,0,@9031 148,0,@9034 9028:O4|@20091,@1627,0,@9029 9029:O5|@9030,88,0,88,0 9030:S34|6d6c736f757263652f4d4c436f6d70696c65722f4578706f7274547265652e736d6c 9031:D3,56|483b65187303ff55484c8b52204c8b4a184c8b4210488b5a0848ba60531bc9a37f0000ff2290909000000000000000003000000000000000|@9033,1048575,@18199|27,0,@9032 9032:O1|@9027 9033:S40|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283129283129 9034:D3,56|483b65187303ff55484c8b52204c8b4a184c8b4210488b5a0848ba60531bc9a37f0000ff2290909000000000000000003000000000000000|@9033,1048575,@18200|27,0,@9032 9035:S37|4578706f72745472656528292e6578706f72744c697374283229676574456e747279283329 9036:S26|4578706f72745472656528292e6578706f72744c697374283229 9037:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9046,2047,@18208,@9038| 9038:D4,368|483b65187303ff5548488b0b498d57d8483b55107303ff55404989d748c742f80400000048be70561bc9a37f00004889324889420848895a104c894218488062ffbf498d77d0483b75107303ff55404989f748c746f805000000c646ff4048bf28571bc9a37f000048893e4c894608488b7b0848897e1048c7461801000000488956204d8d4fc84c3b4d107303ff55404d89cf49c741f80600000049ba10581bc9a37f00004d89114c8b114d8951084c8b59084d895910498979184989712049895128498061ffbf4c894e18488066ffbf498d57e8483b55107303ff55404989d748c742f8020000004c894a0848c70209000000f6c20174144889c648b8f86f07c9a37f0000488b5d0890ff134c8b4b104989d44c8b4010488b5808488b104889d09090ff155e000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f802000000488948084c8908c390909000000000000000006801000000000000|@9047,2047,@18209,@9003|38,0,@9039 96,0,@9042 157,0,@9044 254,0,@1294 9039:D3,56|483b65187303ff55484c8b4218488b5a10488b420848bad0561bc9a37f0000ff229090909090909000000000000000003000000000000000|@9041,1048575,@18205|23,0,@9040 9040:O1|@9038 9041:S54|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 9042:D3,120|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a104889f8488b4a084889caff22909000000000000000007000000000000000|@9043,1048575,@18206| 9043:S53|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c6428322967657454797065283129 9044:D5,240|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a28488908488d581048c743f801000000488b7220488933488d7b1048c747f80300000048c74710010000004889470848891f5257488b4218ff15a6000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7011b000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908488b4c24084989c14c8b4110488b5908584883c408ff253500000090909090900000000000000000e800000000000000|@9045,2097151,@18207,@8004,@8997|140,0,@1294 9045:S52|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c642832296765744c6162283129 9046:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283129 9047:S43|545950455f5452454528292e747970654578706f7274547265652832296578706f72744669656c64283229 9048:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18214| 9049:S29|545950455f5452454528292e747970654578706f727454726565283229 9050:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18211| 9051:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18212| 9052:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18213| 9053:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@9054,1048575,@18215| 9054:S29|545950455f5452454528292e747970654578706f727454726565283129 9055:S65|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e6728322967657454797065283129 9056:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@9000,511,@18217,@8997| 9057:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba88391bc9a37f0000ff229090909090909000000000000000003000000000000000|@8995,1048575,@18218|23,0,@8994 9058:D6,232|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f8020000004889430848b8485f1bc9a37f00004889034889d7488b4720ff15ae000000498d4fe0483b4d107303ff55404989cf48c741f801000000488b5718488911488d591048c743f801000000488b77104889334989c14989d84889cb48c7c001000000ff156e0000004883f80174114889c34c89c89090ff15620000004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b7f08488938c39090900000000000000000e000000000000000|@9063,255,@18220,@9025,@9003,@9062|58,0,@9059 9059:O1|@9060 9060:D4,56|483b65187303ff5548488b480849c7c1010000004c8b01488b5910488b104889d0ff25290000009000000000000000003000000000000000|@9061,511,@18219,@8997| 9061:S84|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e737472732831296578706f7274436f6e73747273283129 9062:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18221| 9063:S68|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229676574436f6e73747273283129 9064:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@9000,511,@18222,@8997| 9065:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283129 9066:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745479706542696e64696e67283229 9067:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9074,4095,@18227,@9068| 9068:D8,696|483b65187303ff5548488b4b10488b09488b5318488b12488b7328488b36498d7fd8483b7d107303ff55404989ff48c747f80400000049b9a8651bc9a37f00004c890f4889470848895f104c894718488067ffbf40f6c60175644d8d4fe84c3b4d107303ff55404d89cf49c741f802000000488b364989710849c7010100000041f6c10174134889c648b8f86f07c9a37f0000488b5d08ff13498d77e8483b75107303ff55404989f748c746f80200000048c74608010000004c890eeb0748c7c6010000004d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049ba68661bc9a37f00004d891149895908498061ffbf4d8d57e84c3b55107303ff55404d89d749c742f8020000004d894a0849c7021300000041f6c20174154989c148b8f86f07c9a37f0000488b5d089090ff134d8d4fc84c3b4d107303ff55404d89cf49c741f803000000498951104989490849c70105000000498d492048c741f8020000004c89490848c7011b000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff13498d9778ffffff483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f802000000488951084c8911488d511848c742f80100000048893a488d7a1048c747f802000000488957084c8907488d571848c742f80200000048c74208010000004c8b034c89024c8d4a1849c741f80200000049895108488b53084989114c8b53204989cb4989f44989c54889fb4c89c8ff15a20000004889c74d8b4510498b5d08498b4500909090ff15920000004983fc01740a4c89e390ff158a0000004883f80174114889c34889f89090ff157e0000004889c74883ff0174124889fb4c89d8909090ff156e0000004989c3498d47e8483b45107303ff55404989c748c740f8020000004c8958084c8910c39090900000000000000000b002000000000000|@9076,4095,@18228,@9025,@9003,@9077,@9078,@9075|56,0,@9069 139,0,@1294 223,0,@9072 289,0,@1294 377,0,@1294 9069:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba08661bc9a37f0000ff229090909090909000000000000000003000000000000000|@9071,1048575,@18225|23,0,@9070 9070:O1|@9068 9071:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d617463682832296173506172656e74283129 9072:D5,392|483b65187303ff5548488b4a084889c3f6c30174064883eb027105ff5570ebf5ff3150488b410848ba682b18c9a37f0000909090ff156601000059f6c10174064883e9027105ff5570ebf5504889cb488b44240848ba682b18c9a37f00009090ff1542010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8908f18c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff13c390909090909000000000000000008001000000000000|@9073,2097151,@18226,@8028,@8028|41,0,@8026 86,0,@8026 155,0,@833 196,0,@8120 237,0,@833 352,0,@1294 9073:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229283129 9074:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283129 9075:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18231| 9076:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744d61746368283229 9077:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18229| 9078:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18230| 9079:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f6a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9080,1048575,@18232| 9080:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657445787072283129 9081:D6,232|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f801000000488910488d481048c741f80200000048894108488b42284889014889d74889cb488b4720909090ff15b2000000498d4fe0483b4d107303ff55404989cf48c741f801000000488b5718488911488d591048c743f801000000488b77104889334989c14989d84889cb48c7c001000000ff15720000004883f80174114889c34c89c89090ff15660000004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b7f08488938c3909090909090900000000000000000e000000000000000|@9083,255,@18233,@9025,@9003,@9082| 9082:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18234| 9083:S48|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296765744d617463686573283129 9084:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848ba38421bc9a37f0000ff252b00000090909000000000000000007800000000000000|@9085,2097151,@18235,@9012|95,0,@9010 9085:S45|4558504f52545f50415253455452454528292e6765744578706f72745472656528322967657454797065283129 9086:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f6a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9080,1048575,@18236| 9087:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9105,1023,@18246,@9088| 9088:D7,1088|483b65187303ff5548f6431001756c488b4b10488b532848833a117563498d77d8483b75107303ff55404989f748c746f80400000048bf20741bc9a37f000048893e4889460848895e104c894618488066ffbf498d7fd8483b7d107303ff55404989ff48c747f804000000c647ff4049b8e0741bc9a37f0000eb0ae93d020000e9ec0000004c89074c8b014c89470848c7471001000000488977184d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049bae0751bc9a37f00004d89114c8b134d8951084c8b5b204d8959104989791849897120498061ffbf4c894f10488067ffbf498d77e8483b75107303ff55404989f748c746f8020000004c894e0848c7060900000040f6c60174134889c748b8f86f07c9a37f0000488b5d08ff13488b7b184989f14c8b4010488b5808488b084889c89090ff151a030000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8909488d411848c740f80200000048894808488938c3498d77d8483b75107303ff55404989f748c746f80400000048bfe0761bc9a37f000048893e4889460848895e104c894618488066ffbf498d7fd0483b7d107303ff55404989ff48c747f805000000c647ff4049b940771bc9a37f00004c890f4c8947084889571048c7471801000000488977204d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049ba68781bc9a37f00004d89114c8b134d8951084c8b5b204d8959104989791849897120498061ffbf4c894f18488067ffbf498d77e8483b75107303ff55404989f748c746f8020000004c894e0848c7060900000040f6c60174164889c748b8f86f07c9a37f0000488b5d08909090ff13488b7b184989f14c8b4010488b5808488b084889c89090ff15d6010000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8909488d411848c740f80200000048894808488938c3488b4b2848833911751a49b918791bc9a37f00004c8b4320488b0b4889cbff2587010000498d57d8483b55107303ff55404989d748c742f80400000048be48791bc9a37f00004889324889420848895a104c894218488062ffbf498d77d0483b75107303ff55404989f748c746f805000000c646ff4048bfa8791bc9a37f000048893e4c89460848894e1048c746180100000048895620498d7fd0483b7d107303ff55404989ff48c747f80500000049b9787a1bc9a37f00004c890f4c8b0b4c894f084c8b53204c8957104889771848895720488067ffbf48897e18488066ffbf498d57e8483b55107303ff55404989d748c742f80200000048897a0848c70209000000f6c20174134889c648b8f86f07c9a37f0000488b5d08ff13488b7b184989d34c8b4010488b5808488b084889c89090ff157a000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f80200000048894808488938c39090909090909000000000000000003804000000000000|@9106,1023,@18247,@9003,@9003,@8997,@9003|55,0,@9089 113,0,@9092 181,0,@9094 275,0,@1294 395,0,@9096 453,0,@9097 510,0,@9099 604,0,@1294 713,0,@9100 763,0,@9102 821,0,@9103 878,0,@9104 971,0,@1294 9089:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba80741bc9a37f0000ff229090909090909000000000000000003000000000000000|@9091,1048575,@18237|23,0,@9090 9090:O1|@9088 9091:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296173506172656e74283129 9092:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848ba38421bc9a37f0000ff252b00000090909000000000000000007800000000000000|@9093,2097151,@18238,@9012|95,0,@9010 9093:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744f6654797065283129 9094:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@9095,511,@18239,@8997| 9095:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727445786465632832296765744e616d65283129 9096:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba80741bc9a37f0000ff229090909090909000000000000000003000000000000000|@9091,1048575,@18240|23,0,@9090 9097:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c707010000006a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9098,1048575,@18241| 9098:S66|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274457864656328322967657450726576696f7573457863283129 9099:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@9095,511,@18242,@8997| 9100:O2|@9101,0 9101:O2|13,@8607 9102:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba80741bc9a37f0000ff229090909090909000000000000000003000000000000000|@9091,1048575,@18243|23,0,@9090 9103:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c707010000006a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9098,1048575,@18244| 9104:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@9095,511,@18245,@8997| 9105:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283129 9106:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744578646563283229 9107:D3,6648|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017562f6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4b0848890a48be38c119f1a37f0000488b364889d04889f29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b930961bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c3488b3848833f03756340f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48bac01607c9a37f0000eb694889f2f6c20174064883ea027105ff5570ebf5f6c20174084883fa017d19eb06f642ff10741148ba282707c9a37f0000eb6ce9c20b00004c8b47084989d141f6c10174064983e9027105ff5570ebf54d8d57e84c3b55107303ff55404d89d749c742f802000000eb05e98b0a00004d894a084d8b48084d890a49bb08c119f1a37f00004d8b1bff771056524150415248b810971bc9a37f00004c89daeb05e9f608000090ff124889c1584889ca909090ff12488b4c2408f6c10174084883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb69488b1424f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb69488b5a104889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708eb05e98a070000488b730848893749b8b8b019f1a37f00004d8b005051534889f84c89c2909090ff12488b4c2408f6c101740feb05e9590500004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442408488b542410f6c20174064883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b0048890348b878b019f1a37f0000488b00514889c24889d8909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e07907c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b818981bc9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b850981bc9a37f0000488902eb04ff771056498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c7010100000058a80174064883e8027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f802000000488942085848890248b898b019f1a37f0000488b0051524889c348b888981bc9a37f00004889daff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b980ae1bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b400841f6c00174084983f8037d14eb0741f640ff10740b48b8707907c9a37f0000c34c8b0849833905756841f6c00174064983e8027105ff5570ebf541f6c00174084983f8017d15eb0741f640ff10740c48bac01607c9a37f0000eb704d89c241f6c20174064983ea027105ff5570ebf54d8d5fe84c3b5d107303ff55404d89df49c743f8020000004d8953084d8b5108eb05e97d0800004d891349bcd8c019f1a37f00004d8b24244d8d6fe84c3b6d107303ff55404d89ef49c745f80200000049be58af1bc9a37f0000eb05e9430700004d897500488b520849895508498065ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004c89680848c7000100000041ff7110415041534c89e2ff124889c1584889ca909090ff1259f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb65488b14244889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bfb8b019f1a37f0000488b3f50514889f04889fa909090ff12488b0c24f6c101740d4883f9037d19eb0be954050000f641ff10740c48b9282707c9a37f0000eb62488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f29090ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542418f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542420f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2428488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048ba481b07c9a37f000048895008488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d57e8483b55107303ff55404989d748c742f80200000048894208584883c408488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c8af1bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b500841f6c20174084983fa037d14eb0741f642ff10740b48b8707907c9a37f0000c341f6c20174064983ea027105ff5570ebf54d8d5fe84c3b5d107303ff55404d89df49c743f8020000004d8953084d8b51084d8913488b5210488b124c89d89090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a8b01bc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090900000000000000000f019000000000000|@9159,1048575,@18258|34,0,@1326 105,0,@20177 229,0,@883 298,0,@884 339,0,@835 472,0,@833 513,0,@9110 613,0,@1326 670,0,@821 720,0,@847 803,0,@20174 825,0,@9117 884,0,@847 935,0,@847 1013,0,@20033 1071,0,@847 1138,0,@20033 1189,0,@847 1256,0,@20029 1309,0,@847 1377,0,@20033 1468,0,@20033 1516,0,@850 1561,0,@833 1602,0,@852 1643,0,@833 1684,0,@834 1757,0,@833 1801,0,@854 1845,0,@833 1886,0,@834 1959,0,@833 2003,0,@856 2047,0,@833 2088,0,@834 2161,0,@833 2205,0,@858 2249,0,@833 2290,0,@834 2367,0,@833 2411,0,@860 2455,0,@862 2587,0,@20029 2636,0,@850 2681,0,@833 2722,0,@1329 2763,0,@833 2804,0,@834 2877,0,@833 2921,0,@9123 2965,0,@833 3006,0,@834 3083,0,@833 3124,0,@9125 3171,0,@862 3291,0,@20031 3309,0,@9127 3360,0,@831 3405,0,@833 3446,0,@834 3519,0,@835 3630,0,@833 3671,0,@9151 3772,0,@1326 3830,0,@821 3904,0,@20171 3942,0,@9158 4088,0,@847 4158,0,@20033 4212,0,@847 4280,0,@20033 4333,0,@847 4400,0,@20029 4453,0,@847 4521,0,@20033 4612,0,@20033 4660,0,@850 4705,0,@833 4746,0,@852 4787,0,@833 4828,0,@834 4901,0,@833 4945,0,@854 4989,0,@833 5030,0,@834 5103,0,@833 5147,0,@856 5191,0,@833 5232,0,@834 5305,0,@833 5349,0,@858 5393,0,@833 5434,0,@834 5511,0,@833 5555,0,@860 5599,0,@862 5683,0,@831 5728,0,@833 5769,0,@834 5846,0,@835 5957,0,@833 5998,0,@9160 6099,0,@1326 6258,0,@883 6337,0,@884 6378,0,@835 6511,0,@833 6552,0,@9167 9108:O1|@9109 9109:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18248|2,0,@388 9110:O5|0,0,0,@9112,@9111 9111:O2|@9115,0 9112:O2|@9113,0 9113:O2|0,@9114 9114:O5|@8954,221,221,0,0 9115:O2|3,@9116 9116:S13|46756e436f6e73747261696e74 9117:O4|0,@9118,3,1 9118:O1|@9119 9119:D3,48|483b65187303ff554848b948c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@9122,1048575,@18250|11,0,@20178 9120:O1|@9121 9121:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18249|2,0,@388 9122:S11|7072696e742d7479706573 9123:O2|3,@9124 9124:S10|6c6f636174696f6e203d 9125:O2|3,@9126 9126:S9|65787054797065203d 9127:O4|0,@9128,2,3 9128:O1|@9129 9129:D3,1040|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb6f488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48be08c119f1a37f0000488b36505348b8f89c1bc9a37f00004889f29090ff124889c1584889ca909090ff12488b0c24488b5108f6c201eb05e9f802000074084883fa037d14eb06f642ff10740c48bb282707c9a37f0000eb70488b19f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b1348891648bf08c119f1a37f0000488b3f505648b8889d1bc9a37f00004889fa909090ff124889c1584889ca909090ff12488b4c2408488b11488b5908eb05e99e010000f6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a1048891e48bf08c119f1a37f0000488b3f505648b8e0a41bc9a37f00004889faff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d8ad1bc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b810ae1bc9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b848ae1bc9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c300000000000000000804000000000000|@168,1048575,@18256|34,0,@847 100,0,@20174 115,0,@9130 178,0,@847 243,0,@20174 258,0,@9133 358,0,@20174 373,0,@9139 424,0,@850 469,0,@833 510,0,@9145 551,0,@833 592,0,@834 665,0,@833 706,0,@9147 750,0,@833 791,0,@834 868,0,@833 909,0,@9149 950,0,@862 9130:O4|0,@9131,1,1 9131:O1|@9132 9132:D3,48|483b65187303ff554848b928c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@2375,1048575,@18251|11,0,@20176 9133:O4|0,@9134,3,1 9134:O1|@9135 9135:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b8289e1bc9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18253|11,0,@20171 25,0,@9136 9136:O4|0,@9137,2,1 9137:O1|@9138 9138:D3,1624|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb63488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48beb8b019f1a37f0000488b36504889d84889f29090ff12488b0c24488b5108f6c201740d4883fa037d19eb0be946050000f642ff10740c48bb282707c9a37f0000eb62488b19f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b531848891648bfb8b019f1a37f0000488b3f504889f04889faff12488b4c2408488b5108f6c201740d4883fa057d19eb0be904040000f642ff10740c48bb282707c9a37f0000eb61488b19f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b1348891648bf78b019f1a37f0000488b3f504889f04889faff12488b4c2410488b5108f6c201740d4883fa077d19eb0be9c5020000f642ff10740c48bb282707c9a37f0000eb68488b19f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b531048891648bfb8b019f1a37f0000488b3f504889f04889fa909090ff12488b4c2418488b11488b5908f6c30174064883eb02710ceb05e97f010000ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a2048891e48bfb8b019f1a37f0000488b3f504889f04889faff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8d82707c9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8102807c9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8402807c9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8782807c9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090909000000000000000005006000000000000|@168,1048575,@18252|34,0,@847 100,0,@20033 156,0,@847 222,0,@20033 277,0,@847 342,0,@20029 397,0,@847 463,0,@20033 558,0,@20033 604,0,@850 649,0,@833 690,0,@852 731,0,@833 772,0,@834 845,0,@833 886,0,@854 930,0,@833 971,0,@834 1044,0,@833 1085,0,@856 1129,0,@833 1170,0,@834 1243,0,@833 1284,0,@858 1328,0,@833 1369,0,@834 1446,0,@833 1487,0,@860 1528,0,@862 9139:O4|0,@9140,3,1 9140:O1|@9141 9141:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b880a51bc9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18255|11,0,@20171 25,0,@9142 9142:O4|0,@9143,2,2 9143:O1|@9144 9144:D3,2040|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bac01607c9a37f0000eb6b488b10f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb68488b1a4889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308eb05e9e106000048893749b8b8b019f1a37f00004d8b005051534889f84c89c2909090ff12488b4c2408f6c101740feb05e9590500004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b0424488b10488b58084883c408f6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf78b019f1a37f0000488b3f514889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090900000000000000000f007000000000000|@168,1048575,@18254|34,0,@821 84,0,@847 161,0,@20033 219,0,@847 286,0,@20033 337,0,@847 404,0,@20029 457,0,@847 525,0,@20033 616,0,@20033 664,0,@850 709,0,@833 750,0,@852 791,0,@833 832,0,@834 905,0,@833 949,0,@854 993,0,@833 1034,0,@834 1107,0,@833 1151,0,@856 1195,0,@833 1236,0,@834 1309,0,@833 1353,0,@858 1397,0,@833 1438,0,@834 1515,0,@833 1559,0,@860 1603,0,@862 1741,0,@20029 1788,0,@831 1833,0,@833 1874,0,@834 1947,0,@835 9145:O2|3,@9146 9146:S14|726563757273697665526566203d 9147:O2|3,@9148 9148:S10|6c6f63616c526566203d 9149:O2|3,@9150 9150:S13|6578706f72746564526566203d 9151:O5|0,0,0,@9153,@9152 9152:O2|@9156,0 9153:O2|@9154,0 9154:O2|0,@9155 9155:O5|@8954,219,219,0,0 9156:O2|3,@9157 9157:S8|46756e4964656e74 9158:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@9159,1048575,@18257| 9159:S14|7072696e742d66756e456e747279 9160:O5|0,0,0,@9162,@9161 9161:O2|@9165,0 9162:O2|@9163,0 9163:O2|0,@9164 9164:O5|@8954,222,222,0,0 9165:O2|3,@9166 9166:S10|46756e496e6669786564 9167:O5|0,0,0,@9169,@9168 9168:O2|@9172,0 9169:O2|@9170,0 9170:O2|0,@9171 9171:O5|@8954,220,220,0,0 9172:O2|3,@9173 9173:S8|46756e5074726565 9174:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@9175,1048575,@18259| 9175:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283129 9176:D11,800|483b65187303ff554848833b05756e498d4fd8483b4d107303ff55404989cf48c741f80400000048bea8b51bc9a37f0000488931488951084889411048895918488061ffbf498d77d8483b75107303ff55404989f748c746f80100000048890e488d4e1048c741f80200000048897108488b5208488911488b7b10eb05e9670000004989c0488b43084889cbff15a60200004989c1498b4010498b4808498b104989c04889cb4889d0909090ff158e0200004883f80174114889c34c89c89090ff15820200004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488938c348833b017514488b5b0848ba38421bc9a37f0000ff254d02000048833b07753b6a016a014989e0488b5b08488b5210ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c3488b4b08488b5108488b12f6431001756d488b7310488b3e4c8b074d8b004c8b4f084d8b094c8b57104d8b124989c34c8b61104989d54c89d0909090ff15d20100004983f801740a4c89c390ff15ca010000498d4fe0483b4d107303ff55404989cf48c741f803000000488941104c89490848c70115000000f6c101eb05e937000000741048b8f86f07c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb144889c648c7c0010000004c8b61104989d54989f3498d4fe8483b4d107303ff55404989cf48c741f8020000004c89690848c7011b000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff13498d57e8483b55107303ff55404989d748c742f8020000004c89620848c70205000000f6c20174144889c348b8f86f07c9a37f0000488b5d0890ff134889c74989c94989d24d8b4310498b5b08498b03909090ff15c2000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8911488d411848c740f802000000488948084c89084883f801740f4889c34889f8ff15860000004889c7498d47e8483b45107303ff55404989c748c740f802000000488978084c8920c390909000000000000000001803000000000000|@9180,2097151,@18261,@9025,@9003,@9181,@9012,@9182,@9183,@9003,@9179|41,0,@9177 245,0,@9010 459,0,@1294 575,0,@1294 634,0,@1294 9177:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@9178,1048575,@18260| 9178:S63|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e7472792832296173506172656e74283129 9179:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18265| 9180:S52|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446756e456e747279283229 9181:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18262| 9182:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18263| 9183:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18264| 9184:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9206,8191,@18278,@9185| 9185:D9,504|483b65187303ff5548f6430801756a488b4b0848837908017564488b5310488b12488b7b184d89c14c8b52284c8b194989dc4989c54d8b4510498b5d08498b4500909090ff15c6010000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba50bb1bc9a37f00004889114c8969084c896110eb0ae95c000000e9570000004c894918488061ffbf57504989c84c89d34c89d890ff157a01000048833c2401740d488b1c24909090ff156e0100004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c40859488908c3488b4b10488b094c89c74989d94989c24c8b59284d8b4210498b5a08498b02909090ff1526010000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba10bc1bc9a37f00004889114c8951084c89491048897918488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bbc0bc1bc9a37f000048891a48897a084c895a10488062ffbf498d5fd8483b5d107303ff55404989df48c743f80100000048890b488d4b1048c741f802000000488959084889114889c74889cb498b41089090ff15860000004883ff01740a4889fb90ff157e0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49184c8908c3909090909090900000000000000000f001000000000000|@9208,8191,@18279,@9003,@9199,@9209,@9003,@9025,@9207|100,0,@9186 284,0,@9189 338,0,@9191 9186:D3,56|483b65187303ff55484c8b4218488b5a10488b420848bab0bb1bc9a37f0000ff229090909090909000000000000000003000000000000000|@9188,1048575,@18266|23,0,@9187 9187:O1|@9185 9188:S57|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f7274464228322961734368696c642d283129 9189:D3,56|483b65187303ff55484c8b4218488b5a10488b420848bab0bb1bc9a37f0000ff229090909090909000000000000000003000000000000000|@9190,1048575,@18267|23,0,@9187 9190:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f727454686973283129 9191:D4,56|483b65187303ff55484c8b4a104c8b4208488b5808488b084889c8ff252f0000009090909090909000000000000000003000000000000000|@9196,8191,@18269,@9192| 9192:D6,208|483b65187303ff5548488b7b104d89c24989db4989c44d8b442410498b5c2408498b0424ff15be000000498d4fd0483b4d107303ff55404989cf48c741f80500000048ba38be1bc9a37f00004889114c8961084c8959104c8951184c894920488061ffbf57504c89ca4d89d14989c84889d34c89d8909090ff157200000048833c2401740d488b1c24909090ff15660000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c40859488908c39090909090900000000000000000c800000000000000|@9198,8191,@18270,@9003,@9199,@9197|68,0,@9193 9193:D3,56|483b65187303ff55484c8b4a204c8b4218488b5a10488b420848ba98be1bc9a37f0000ff2290909000000000000000003000000000000000|@9195,1048575,@18268|27,0,@9194 9194:O1|@9192 9195:S72|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c6175736528322961734368696c642d283129 9196:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283129 9197:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18277| 9198:S61|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727446422832296578706f7274436c61757365283229 9199:D9,864|483b65187303ff5548488b4818488b09488b1048837a10037558f602017558488b32488b3e48833f337560f6470801755f4c8b570841f642080175594d8b5a0849837b080175724d8d67c84c3b65107303ff55404d89e749c74424f8020000004d8b2a4d896c240849c7042407000000eb0ae9f8000000e9f30000004d8d74241849c746f803000000eb0fe9df000000e9da000000e9d500000049895e10488b5a0849895e0849c70603000000498d5f80483b5d10730aeb05e9b1000000ff55404989df48c743f8020000004d8b134c89530848c703070000004c8d6b1849c745f80200000049c745080100000049895d00498d5d1848c743f8020000004c896b084c89334c8d6b1849c745f80200000049895d084d896500498d5d1848c743f803000000488b7f1848897b104c896b0848c70305000000488b78084989cc4c8b6a18488b460890ff152a020000498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488919eb64498d77e0483b75107303ff55404989f748c746f80300000048895e10488b5a0848895e0848c70603000000488b78084989ca4c8b5a18488b02ff15d2010000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084889314d89dd4d89d441f6c5017540498d47d0483b45107303ff55404989c748c740f8020000004d8b6d004c89680848c70001000000488d501848c742f80200000048c7420801000000488902eb0748c7c20100000041f6c4017564498d47e8483b45107303ff55404989c748c740f8020000004d8b24244c89600848c70001000000a80174144889c348b8f86f07c9a37f0000488b5d0890ff13498d5fe8483b5d107303ff55404989df48c743f80200000048c7430801000000488903eb0748c7c301000000498d47a8483b45107303ff55404989c748c740f8010000004c8900488d701048c746f802000000488946084c890e488d461848c740f8020000004889780848c70007000000488d781848c747f80200000048c74708010000004889074883ff01741c4989d84989c94889fb4889d090ff15820000004889c24c89c34c89c94883fa0174174889df4889d34889c89090ff156a0000004889c14889fb4889df4889f34889c8909090ff155a0000004883ff017501c34889fbff2552000000909000000000000000005803000000000000|@9201,8191,@18271,@9202,@9203,@9204,@9205,@9025,@9200|598,0,@1294 9200:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18276| 9201:S51|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727441436c61757365283329 9202:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010700000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18272| 9203:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010700000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18273| 9204:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18274| 9205:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18275| 9206:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283129 9207:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18281| 9208:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744642283229 9209:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18280| 9210:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f6a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9080,1048575,@18282| 9211:D6,232|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f801000000488910488d481048c741f80200000048894108488b42284889014889d74889cb488b4720909090ff15b2000000498d4fe0483b4d107303ff55404989cf48c741f801000000488b5718488911488d591048c743f801000000488b77104889334989c14989d84889cb48c7c001000000ff15720000004883f80174114889c34c89c89090ff15660000004989c1498d47e8483b45107303ff55404989c748c740f8020000004c894808488b7f08488938c3909090909090900000000000000000e000000000000000|@9083,255,@18283,@9025,@9003,@9212| 9212:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18284| 9213:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9222,1048575,@18288,@9214| 9214:D4,688|483b65187303ff5548488b4b08488b096a016a01ff732050ff33ff7310514150ff7318534c8d442440488b5c2408488b54241090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c244848894808488b4c2440488908488b542438488b19483b1a744af6c301755bf60201755b488b3a40f6c701740948c7c603000000eb08488b37488d7436014883c6104989f04889de4c89c148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017561488b4c2440488b5908f6c3017515f6420801750feb0ae965000000e960000000ff5570483b5a087557488b711040f6c6017509f64210017503ff5570483b7210753e488b791840f6c7017509f64218017503ff5570483b7a1875254c8b4120eb05e91a00000041f6c0017509f64220017503ff55704c3b422075054883c450c3498d47d8483b45107303ff55404989c748c740f80400000048b928ce1bc9a37f0000488908488b4c243048894808488b1c2448895810488b5c241048895818488060ffbf498d77d0483b75107303ff55404989f748c746f805000000c646ff4048bfe8ce1bc9a37f000048893e48895e08488b7c240848897e1048c7461801000000488946204d8d47c84c3b45107303ff55404d89c749c740f80600000049b908d01bc9a37f00004d89084c8b4c24284d8948084c8b5424204d8950104c8b5c24184d8958184989702049894028498060ffbf4c894618488066ffbf498d47e8483b45107303ff55404989c748c740f8020000004c89400848c70009000000a80174144889c348b8f86f07c9a37f0000488b5d0890ff134889c74c8b4110488b5908488b0190ff1566000000498d4fd0483b4d107303ff55404989cf48c741f80200000048894108488939488d411848c740f80200000048894808488b4c24384889084883c450c390900000000000000000a802000000000000|@9223,1048575,@18289,@9003|336,0,@9215 408,0,@9218 470,0,@9220 574,0,@1294 9215:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba88ce1bc9a37f0000ff229090909090909000000000000000003000000000000000|@9217,1048575,@18285|23,0,@9216 9216:O1|@9214 9217:S60|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296173506172656e74283129 9218:D3,168|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c707010000006a016a014989e0488b5a104889f8488b4a084889ca90ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c30000000000000000a000000000000000|@9219,1048575,@18286| 9219:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229676574457870283129 9220:D4,208|483b65187303ff5548498d47a8483b45107303ff55404989c748c740f801000000488b4a28488908488d581048c743f801000000488b7220488933488d7b1048c747f80300000048c74710010000004889470848891f488d472048c740f802000000488b5a184889580848c7001b000000a80174144989c048b8f86f07c9a37f0000488b5d0890ff134d8d47e84c3b45107303ff55404d89c749c740f80200000049c74008010000004989004d89c14c8b4210488b5a084889f8ff25280000000000000000000000c800000000000000|@9221,511,@18287,@8997|122,0,@1294 9221:S58|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c642832296765744c6162283129 9222:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283129 9223:S49|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72744669656c64283229 9224:O1|@9225 9225:D6,176|483b65187303ff5548488b4808488b5108488b124883fa01750948c7c201000000eb1c488b12488b79104c8b00488b4218909090ff158e0000004889c2eb07488b79104c8b004989d1498b4010498b4808498b104989c04889cb4889d0909090ff156a0000004983f901740a4c89cb90ff15620000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488938c3909090909090900000000000000000a800000000000000|@9227,255,@18290,@2055,@9003,@9226| 9226:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18291| 9227:S55|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745374727563744964656e74283129 9228:D3,152|483b65187303ff5548498d47d0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f80300000048c74310010000004889430848c703010000006a016a014989e04889d8488b5a10488b4a084889caff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c300000000000000009000000000000000|@9229,1048575,@18292| 9229:S44|4558504f52545f50415253455452454528292e6765744578706f727454726565283229676574457870283129 9230:O2|13,@923 9231:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@9236,4095,@18294,@9232| 9232:D6,280|483b65187303ff5548488b7b104c8b0b4c8b53084d89c34989dc4989c54d8b4510498b5d08498b4500909090ff15fe000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba80d61bc9a37f00004889114c8969084c8961104c895918488061ffbf498d57a8483b55107303ff55404989d748c742f80100000048890a488d4a1048c741f802000000488951084c8919488d511848c742f80200000048c74208010000004c8912488d5a1848c743f802000000488953084c890b4989c04889d84889cb909090ff15660000004983f801740a4c89c390ff155e0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488938c390909000000000000000001001000000000000|@9238,4095,@18295,@9003,@9025,@9237|76,0,@9233 9233:D3,56|483b65187303ff55484c8b4218488b5a10488b420848bae0d61bc9a37f0000ff229090909090909000000000000000003000000000000000|@9235,1048575,@18293|23,0,@9234 9234:O1|@9232 9235:S59|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f727456422832296578706f727454686973283129 9236:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283129 9237:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18296| 9238:S46|4558504f52545f50415253455452454528292e6765744578706f7274547265652832296578706f72745642283229 9239:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18334| 9240:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283229 9241:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18298| 9242:D3,264|483b65187303ff5548a8017559f6c301740948c7c103000000eb08488b0b488d4c0901488b3040f6c601740948c7c203000000eb08488b16488d541201f6c101740af6c2017405483bcaeb05ff5570ebf67f604883f90375234883fa03750c483bde7560eb3de97e000000480fb64e08488d4c0901483bd97429eb644889de488b384883c6084883c70848d1e9483bc9f3a6488d7c3f01488d743601488d4c0901753dff30488b4008e852ffffff4889c1eb05e928000000498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c3488b4008e917ffffff48c7c001000000c39090909090909000000000000000000001000000000000|@260,63,@18299| 9243:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18300| 9244:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18301| 9245:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18302| 9246:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18303| 9247:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18304| 9248:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010100000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18305| 9249:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010500000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18306| 9250:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020300000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@18307| 9251:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18308| 9252:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18309| 9253:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18310| 9254:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18311| 9255:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18312| 9256:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18313| 9257:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18314| 9258:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18315| 9259:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18316| 9260:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18317| 9261:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18318| 9262:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18319| 9263:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18320| 9264:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18321| 9265:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18322| 9266:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18323| 9267:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18324| 9268:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18325| 9269:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18326| 9270:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18327| 9271:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18328| 9272:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18329| 9273:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010500000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18330| 9274:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18331| 9275:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18332| 9276:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18333| 9277:O2|@9278,@8280 9278:D3,96|483b65187303ff55486a016a014989e0488b5808488b084889c8488b52089090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c39090909000000000000000005800000000000000|@9279,1048575,@18335| 9279:S35|4558504f52545f50415253455452454528292e6765744578706f727454726565283129 9280:O1|@9281 9281:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18336|2,0,@388 9282:O1|@9283 9283:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18337|2,0,@388 9284:O1|@9285 9285:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18338|2,0,@388 9286:S45|535452554354555245535f28292e7061737332537472756374283829706173733253696e676c65746f6e283229 9287:D6,1400|488dbc2420ffffff483b7d187303ff55504152534151415050ff750848b996ef1bc9a37f00005148896508498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004889ca48c7c11700000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048be38f41bc9a37f0000488931498d77d8483b75107303ff55404989f748c746f804000000488946184889561048894e0848c706030000004883c4085848894508eb6f909090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15460400004889c348b8489319c9a37f000090ff153a040000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a014889e34889f048ba00dd07c9a37f000090ff15ae030000488b4424704883c408498d4fe0483b4d107303ff55404989cf48c741f80300000048baa0f41bc9a37f0000488911488b503048895108488b5c242848895910488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be10f51bc9a37f0000488933488b704048897308488b7c243848897b10488063ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b880f51bc9a37f00004c89074c8b40604c8947084c8b4c24584c894f10488067ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049baf0f51bc9a37f00004d8911498941084c8b5424404d895110498061ffbf4d8d57904c3b55107303ff55404d89d749c742f80d00000049897a604c8b58584d895a584c8b6424484d8962504d894a4849895a404c8b6c24304d896a3849894a304c8b70284d8972284c8b6424184d8962204c8b6c24104d896a184c8b6424084d8962104c8b2c244d896a0849bc40f71bc9a37f00004d8922574153415153514156ffb424d0000000ffb424d0000000ffb424d0000000ffb424c80000004c8b8c24f80000004c8b842400010000488b9c2408010000488b8424b0000000488b9424c00000009090ff12498d47e0483b45107303ff55404989c748c740f80300000048b990f71bc9a37f0000488908488b8c249800000048894808488b54243848895010488060ffbf498d57e0483b55107303ff55404989d748c742f80300000048bb40f81bc9a37f000048891a48894a08488b5c244048895a10488062ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048bea8f81bc9a37f000048893348894b08488b74247848897310488063ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf10f91bc9a37f000048893e48894e08488b4c243048894e10488066ffbf498d4f90483b4d107303ff55404989cf48c741f80d000000488b7c242848897960488b7c24204889795848895950488b5c241848895948488b5c241048895940488b5c246048895938488b5c2408488959305b4883c440488959285b4883c4504889592048895118488941104889710848b840f71bc9a37f0000488901488b442448488b542440488b5c2438488b742430488b7c24284c8b442420488974244848897c24404c894424384c8b4c24104c894c24304989ca4989d94989d04889c3488b4424085a4883c410594883c41051ff229090909000000000000000007005000000000000|@9303,2097151,@18351,@194,@100,@1484|30,0,$9287+278 210,0,@9288 314,0,@193 335,0,@8394 376,0,@8395 406,0,@557 420,0,@20055 483,0,@1483 533,0,@9290 592,0,@9291 651,0,@9292 710,0,@9293 850,0,@9296 968,0,@9298 1031,0,@9300 1086,0,@9301 1141,0,@9302 1284,0,@9296 9288:O1|@9289 9289:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18340,@375| 9290:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18341| 9291:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18342| 9292:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18343| 9293:D4,88|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252800000000000000000000005000000000000000|@9295,1048575,@18344,@9294| 9294:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18345| 9295:S56|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c6465632832296c6f63616c456e762d283129 9296:O1|@9297 9297:D3,24|48c7c001000000c300000000000000001000000000000000|@9295,1,@18346| 9298:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4810584889caff229090909000000000000000003800000000000000|@9299,1048575,@18347| 9299:S55|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229626f6479456e762d283129 9300:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4818584889caff229090909000000000000000003800000000000000|@9299,1048575,@18348| 9301:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4850584889caff229090909000000000000000003800000000000000|@9299,1048575,@18349| 9302:D3,64|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b40084883c408488b4808584889caff229090909000000000000000003800000000000000|@9299,1048575,@18350| 9303:S44|535452554354555245535f28292e706173733253747275637428382970617373324c6f63616c646563283229 9304:S48|535452554354555245535f28292e70617373325374727563742838297061737332537472756374757265446563283329 9305:D34,7096|488dbc24b8feffff483b7d187303ff5550498d4fe0483b4d107303ff55404989cf48c741f80300000048bed0161cc9a37f00004889314c8949084c895110488061ffbf498d77e0483b75107303ff55404989f748c746f80300000048bfc0171cc9a37f000048893e4c894e084c895610488066ffbf498d7fe8483b7d107303ff55404989ff48c747f8020000004889770848890f48833805756c488b4808498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c7060100000041504151ff712053ff7118ff7110ff712857ff314152ff7108525648c7c0010000004c89c29090ff125048c7c001000000488b54246090ff12498d4fe0483b4d10730aeb05e908070000ff55404989cf48c741f80300000048ba78181cc9a37f0000488911488b54240848895108488b5c245048895910488061ffbf498d77d8483b75107303ff55404989f748c746f80400000048bf80191cc9a37f000048893e4889460848895610488b142448895618488066ffbf6a016a016a016a016a016a0150ffb424d0000000ffb424d0000000ffb424d0000000488d7c242057ffb424d00000004c8b9424800000004989f14c8b8424c80000004889cb488b842488000000488b542470e832feffff498d47c8483b45107303ff55404989c748c740f806000000488b4c243048894828488b4c242848894820488b4c242048894818488b4c241848894810488b4c241048894808488b4c240848890850ffb424880000004c8b9424e00000004c8b4c24684c8b442410488b5c2448488b44246048ba181c1cc9a37f0000909090ff157e19000048c7c101000000488b5010f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017410f6402801740a488d49ff480348287105ff5570ebf1498d57e8483b55107303ff55404989d748c742f80200000048bbe0f81cc9a37f000048891a488b5c246848895a08488062ffbf6a016a015051ff7028ff742430ffb424a0000000488d5c242853ffb424f80000004c8b9424200100004c8b8c24d00000004989d04889c3488b4424489090ff15c6180000488b8424a0000000488b4c24204889084883bc24a8000000017473488b442408a801740cf60424017406482b04247105ff5570ebf54883c001ff3424ff742420ff35881800004889e390ff1586180000488b4c24284883c418504c8b8424c0000000488b9c24b8000000488b4110ff156a1800004889c74889fb58909090ff1562180000488b8c24c0000000eb05e9ae0200004889014883ff01750c48b8909adc0000000000eb6e48c7c0010000004889f9f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05be1700007d08eb1bf640ff1075154889c148b818930ec9a37f0000488b5d089090ff134889c148c7c0010000004889fa488d3c8d04000000eb05e96500000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f85048c7c001000000488b9424d00000009090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048ba90f91cc9a37f0000488911488941085848894110488b042448894118488061ffbf488b442410ff7018ff7008ff3051ff702048c7c001000000488b9424f8000000909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba88fa1cc9a37f00004889115a488951085a48895110488061ffbf488b142448833a03756a488b5a08488b1b488b5218488b12488b324883fe01750c48ba909adc0000000000eb714889cf4889f14989c048c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0eb05e9630000004889d64889f94889cf4889ca4889c148d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c0901488062ffbf4c89c94c89c0498d77e0483b75107303ff55404989f748c746f8030000004889561048895e0848c70601000000eb034889d6488b9424000100004883c4084889325b48895a0848c74210010000005b48895a1848894a204889422848c7c0010000004881c4d8000000c2280048c7c001000000488b9424c80000009090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048bae0fa1cc9a37f000048891148894108488b44241848894110488b44241048894118488061ffbfff7018ff7008ff3051ff702048c7c001000000488b9424f8000000909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba90fb1cc9a37f00004889115a488951085a48895110488061ffbf488b142448833a03756a488b5a08488b1b488b5218488b12488b324883fe01750c48ba909adc0000000000eb714889cf4889f14989c048c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0eb05e9630000004889d64889f94889cf4889ca4889c148d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c0901488062ffbf4c89c94c89c0498d77e0483b75107303ff55404989f748c746f8030000004889561048895e0848c70601000000eb034889d6488b9424000100004883c4084889325b48895a0848c74210010000005b48895a1848894a204889422848c7c0010000004881c4d8000000c2280048833803756d4150415153415252ff7018ff7008ff7010ff750848b826031cc9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d10720ceb05e979030000493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bfe8fb1cc9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184889771048894f0848c707030000004883c4085848894508eb6f909090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff159e1200004889c348b8489319c9a37f000090ff1592120000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a014889e34889f848ba00dd07c9a37f000090ff1506120000488b8424880000004883c408498d4fe0483b4d107303ff55404989cf48c741f80300000048ba50fc1cc9a37f0000488911488b503048895108488b5c242848895910488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048bec0fc1cc9a37f0000488933488b704048897308488b7c243848897b10488063ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b830fd1cc9a37f00004c89074c8b40604c8947084c8b4c24584c894f10488067ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049baa0fd1cc9a37f00004d8911498941084c8b5424404d895110498061ffbf4d8d57904c3b55107303ff55404d89d749c742f80d00000049897a60488b785849897a584c8b5c24484d895a504d894a4849895a40488b5c243049895a3849894a30488b482849894a28488b5c241849895a20488b5c241049895a18488b5c240849895a105b4883c45849895a0848bbe0fe1cc9a37f000049891a488b5c24184152ff742470ff742420ff742470ff7424684c8b4c24584c8b4424604c8b5b08488b5c2450488b4424284c89da90ff12488b442470488b4c2460488b542458488b5c24504889442470488b742418488974246848894c2460488954245848895c2450415a4883c4084c8b4c24284c8b442430488b5c2420584883c4085a4883c420e9fcf3ffff48833807756d4150415153415252ff7010ff7018ff7008ff750848b816071cc9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d10720ceb05e939070000493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bf30ff1cc9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184889771048894f0848c707030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15c60e00004889c348b8489319c9a37f000090ff15ba0e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0157488d5c24084889f848ba00dd07c9a37f00009090ff152a0e0000488b842490000000498d4fe0483b4d107303ff55404989cf48c741f80300000048ba98ff1cc9a37f0000488911488b503048895108488b5c243848895910488061ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be08001dc9a37f0000488933488b704048897308488b7c244848897b10488063ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b878001dc9a37f00004c89074c8b40604c8947084c8b4c24684c894f10488067ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049bae8001dc9a37f00004d8911498941084c8b5424504d895110498061ffbf4d8d57904c3b55107303ff55404d89d749c742f80d00000049897a60488b785849897a584c8b5c24584d895a504d894a4849895a4048bb28021dc9a37f000049895a3849894a30488b482849894a28488b582049895a204c8b4c24204d894a184c8b4c24184d894a1049b908031dc9a37f00004d894a0849b9e8031dc9a37f00004d890a4c8b8c2488000000ffb424d8000000ffb424d8000000ffb424d8000000ffb424d00000004d8b59084c8b8c24c00000004c8b8424c8000000488b9c24b8000000488b8424900000004c89da909090ff12ff750848b8b60a1cc9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bb38041dc9a37f0000488919498d5fd8483b5d107303ff55404989df48c743f804000000488943184889531048894b0848c703030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff153e0b00004889c348b8489319c9a37f000090ff15320b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0153488d5c2408488b042448ba00dd07c9a37f000090ff15a20a0000ff742418ff742460ff742430ff35980a00004989e048bb28cd06c9a37f0000488b842490000000909090ff15820a0000488b8c24080100004883c420488b4008488901498d47e8483b45107303ff55404989c748c740f802000000488b8c24f00000004889480848c70001000000488b8c24480100005048c7c001000000488b918000000090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f80200000048894108584889015148c7c001000000488b942420010000ff125048c7c001000000488b9424200100009090ff12488b4c241048833903756a488b5108488b12488b4918488b09488b194883fb01750c48b9909adc0000000000eb6d4889ce4889d94889c748c7c0010000004989f8488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f8eb05e95a0000004889c74889d948d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000488060ffbf4889c14c89c0498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889530848c70301000000eb034889cb488b8c244001000048891948ba509adc00000000004889510848c7411001000000488b5424084889511848894120584881c4280100004889412848c7c001000000c22800488338017568488b480841504151535741525250ff7118ff7128ff7108ff7110ff7138ff31ff7120ff7130488b442428498b5258909090ff12a8017573488b08488b11498d5ff0483b5d107303ff55404989df48c743f80100000048890b488b74240848891e6a016a016a01eb05e99d0600006a016a016a01ff7118ff7210ffb424e0000000ff742478ffb424e0000000488d5c242853ffb424e00000004c8b9424b80000004c8b8c24d0000000eb05e90e0500004c8b8424d8000000488b9c24c8000000488b442478488b9424b00000009090e872ebffff498d47c8483b45107303ff55404989c748c740f806000000488b4c243848894828488b4c243048894820488b4c242848894818488b4c242048894810488b4c241848894808488b4c2410488908498d4fe8483b4d107303ff55404989cf48c741f80200000048baa0041dc9a37f0000488911488b94248000000048895108488061ffbf515048c7c001000000488b9424b80000009090ff126a016a0150ffb424c0000000488d44241050ffb424f80000004c8b9424200100004c8b8c24b00000004c8b442438488b5c2440488b4424309090ff15f2060000488b442420488b581048c7c0010000009090ff15e20600004883f8017507488b442408eb0f4889c3488b44240890ff15ce060000488b4c2478488901488b44242048c7c101000000488b5010f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017410f6402801740a488d49ff480348287105ff5570ebf1f6c101740cf64028017406482b48287105ff5570ebf54883c101ff7028ff742408ff35590600004889e34889c8909090ff1552060000488b4c24384883c418488b591090ff1546060000488b8c2480000000488901488b4424284c8b8c24c00000004c8b842490000000488b9c2488000000488b48104889c8909090ff1516060000488b8c2498000000488901909090ff150a0600004883f801750c48b8909adc0000000000eb6d48c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0dd60400007d08eb1bf641ff1075154889c248b818930ec9a37f0000488b5d089090ff134889c248c7c001000000488d3c8d04000000eb05e96500000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f8488b4c2420488b542428488b5928f6c301740ef64228017408483b5a287d07eb09ff5570ebf3488b5a28535048c7c001000000488b9424d80000009090ff12498d4fc0483b4d107303ff55404989cf48c741f80700000048ba00051dc9a37f0000488911488941085848894110488b44243048894118488b54240848895120488b542428488951285a4883c42848895130488061ffbfff7018ff7008ff305148c7c001000000488b9424c8000000909090ff12488b4c2420498d57e0483b55107303ff55404989d748c742f80300000048bb38061dc9a37f000048891a488b492048894a085948894a10488062ffbf488b0c2448833903756a488b5908488b1b488b4918488b09488b314883fe01750c48b9909adc0000000000eb714889cf4889f14989c048c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0eb05e9630000004c89ce4889f94889cf4989c94889c148d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c0901498061ffbf4c89c94c89c0498d77e0483b75107303ff55404989f748c746f80300000048894e1048895e0848c70601000000eb034889ce488b8c24d80000004883c4084889315b4889590848c74110010000005b4883c43848895918488951204889412848c7c0010000004883c478c22800488b5c242848b890061dc9a37f000090ff150a03000048bb508e19c9a37f0000ff1502030000ff742440ff3500030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4c24104989e048c7c303000000488b8424b000000090ff1546020000488b8424980000004883c41048b9301c1cc9a37f000048890848b9388819c9a37f00004889480848c740100100000048c740180100000048b978821cc9a37f00004889482048c740280100000048c7c0010000004883c478c22800ff7018ff74243050ff35e5010000ff70104c8d4c24084c8b4008498b5a6048b8688c19c9a37f0000909090ff15ca010000594883c4204889014883f8017550488b44241048b9301c1cc9a37f000048890848b9388819c9a37f00004889480848c740100100000048c740180100000048b978821cc9a37f00004889482048c740280100000048c7c001000000c22800488b00488b4810488b542410488b1948891a488b710848897208488b791048897a104c8b41184c8942184c8b49204c894a204c8b51284c89522848c7c001000000c228000000000000000000a01b000000000000ffffffffffffff01ffffffffffffff01|@9701,2097151,@18514,@9320,@9702,@9849,@1354,@9851,@9856,@194,@100,@1484,@194,@100,@1484,@194,@100,@1484,@9857,@1532,@9702,@9867,@9872,@9873,@1354,@9875,@9876,@9880,@100,@100,@9881,@8232,@9700,@8408|43,0,@9306 93,0,@9308 283,0,@9309 343,0,@9311 577,0,@9318 693,0,@9655 944,0,I49 1025,0,@4361 1216,0,@9657 1312,0,@9659 1373,0,I49 1664,0,@9660 1760,0,@9662 1821,0,I49 2095,0,$9305+2350 2282,0,@9663 2386,0,@193 2407,0,@8394 2448,0,@8395 2478,0,@557 2492,0,@20055 2555,0,@1483 2608,0,@9665 2667,0,@9666 2726,0,@9667 2785,0,@9668 2926,0,@9671 3104,0,$9305+3358 3291,0,@9673 3394,0,@193 3415,0,@8394 3456,0,@8395 3486,0,@557 3500,0,@20055 3566,0,@1483 3616,0,@9675 3675,0,@9676 3734,0,@9677 3793,0,@9678 3877,0,@9681 3929,0,@9686 3943,0,@9691 4039,0,$9305+4286 4219,0,@9693 4322,0,@193 4343,0,@8394 4384,0,@8395 4414,0,@557 4428,0,@20055 4495,0,@1483 4533,0,@440 4798,0,I49 4990,0,I48 5365,0,@9695 5774,0,I49 5857,0,@4361 6088,0,@9696 6209,0,@9698 6273,0,I49 6527,0,@9699 6544,0,@8386 6610,0,@1294 6714,0,@1294 6776,0,@9319 6789,0,@8366 6819,0,@9473 6885,0,@8371 6923,0,@9319 6936,0,@8366 6966,0,@9473 9306:D3,144|483b65187303ff5548488b4a1052488b51409090ff12a801755a488b0c24ff3048c7c001000000488b510890ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808594889084889c1488d401848c740f8010000004889084883c408c348c7c0010000004883c408c300000000000000008800000000000000|@9307,1048575,@18353| 9307:S39|535452554354555245535f28292e73747275637456616c756528382974797065456e762d283129 9308:D3,144|483b65187303ff5548488b4a1052488b51609090ff12a801755a488b0c24ff3048c7c001000000488b510890ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f80200000048894808594889084889c1488d401848c740f8010000004889084883c408c348c7c0010000004883c408c300000000000000008800000000000000|@9307,1048575,@18354| 9309:D3,152|483b65187303ff5548488b4820488b5818488b7010488b78084c8b00498d47d0483b45107303ff55404989c748c740f805000000488948204889581848897010488978084c890052488b4a104889ca90ff12488b0c24488b5108488b12498d5fe8483b5d107303ff55404989df48c743f80200000048895308488903488b49084883c408488919c300000000000000009000000000000000|@9310,1048575,@18355| 9310:S52|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e744d616b65547970654964283129 9311:D3,88|498d47d8483b45107303ff55404989c748c740f80400000048b9001a1cc9a37f0000488908488b4a0848894808488b5a1048895810488b721848897018488060ffbfc3909090909000000000000000005000000000000000|@9317,31,@18357|26,0,@9312 9312:D3,208|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22488b5210488b12f6c2017565488b0a488b590848833b0174164889c648b8f81a1cc9a37f0000488b5d08909090ff13a8017509f64318017503ff5570483b4318751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19488b72084889f2483b65187303ff5548eb9648c7c6010000004883fe01751148b8386208c9a37f0000488b5d0890ff13488b06c3909090909090900000000000000000c800000000000000|@9316,1048575,@18356|68,0,@9313 166,0,@1662 9313:O4|11,@42,0,@9314 9314:O5|@9315,1738,0,1738,0 9315:S34|6d6c736f757263652f4d4c436f6d70696c65722f535452554354555245535f2e4d4c 9316:S54|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129283129 9317:S51|535452554354555245535f28292e73747275637456616c756528382973636f6e73747261696e74547970654964456e76283129 9318:O2|@9320,@9319 9319:O3|0,@9653,@9652 9320:D9,2072|488dbc2400ffffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c7010100000048bec0241cc9a37f0000488931498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff404889194889ce48c7c1170000004889c748b8b00607c9a37f00004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47d8483b45107303ff55404989c748c740f8020000004889780848c70003000000488d481848c741f801000000c641ff40488901498d47e8483b45107303ff55404989c748c740f80200000048bfb00607c9a37f00004889780848890848c7c1170000004889c748c7c0010000004989fc488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47d8483b45107303ff55404989c748c740f8020000004889780848c70003000000488d481848c741f801000000c641ff40488901498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889086a016a016a016a0149833b01756d6a016a016a016a016a016a015341504154564151488d4c24285141534152565341545041504151ff7208ffb424d000000049ba509adc000000000049c7c1010000004d8b4310488b5c2458498b430848ba38321cc9a37f0000909090ff150e060000488d4424584883c408eb05e934000000488b4c2420488908488d442450488b4c242848894808488d442450488b4c243848894810488d442450488b4c244048894818eb6b49833b05756a498b4b086a016a016a016a016a016a0153415041545641514151ff35ac05000041534152565341545041504151ff7208ffb424d80000004c8b114c8b49204c8b4110488b5918488b410848ba50321cc9a37f0000ff157a050000488d4c24584883c408eb0ae9c5000000e92f000000488b10488911488d4c2450488b580848895908488d4c2450488b701848897110488d4c2450488b782048897918eb706a016a016a016a016a016a015341504154566a016a016a016a016a016a014151488d4c240851415141534152ff72085653415450415049ba509adc00000000004d8b4318498b5b10498b43089090ff15ea040000488d8424880000004883c40859488908488d442478594883c408eb05e91c00000048894808488d4424685948894810488d442460594883c4084889481849b840e81cc9a37f000048c7c301000000488b442450909090ff1596040000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b542418488911498d5ff0483b5d107303ff55404989df48c743f801000000c643ff404889036a016a0151534c8b5424284989d14c8b442420488d5c241048c7c001000000ff153604000048837c240801750c48b8909adc0000000000eb6e48c7c001000000488b4c2408f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda801740b483b05a00300007d08eb19f640ff1075134889c148b818930ec9a37f0000488b5d08ff134889c148c7c001000000488d3c8d0400000048f7dfeb05e9670000004903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24084883f9017429488b1148895487fca80174064883c0027105ff5570ebf5488b51084889d1483b65187303ff5548ebd1488067ffbf4889f848833c2401746e48c7c101000000488b1424f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0db60200007d08eb1bf641ff1075154889c248b818930ec9a37f0000488b5d089090ff134889c248c7c001000000488d3c8d04000000eb05e96800000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b0c244883f9017429488b1948895c87fca80174064883c0027105ff5570ebf5488b59084889d9483b65187303ff5548ebd1488067ffbfeb0d48bf909adc00000000004889c2498d47d8483b45107303ff55404989c748c740f80400000048b9f0ea1cc9a37f0000488908488b4c24204889480848895010488b4c242848894818488060ffbf48bbffffffffffffff0048235af8488d5c1b0148baffffffffffffff00482357f8488d541201f6c3017508f6c2017503ff5570483bda740948c7c201000000eb0748c7c2030000004883fa017407488b442478eb3a4889c2498d47e0483b45107303ff55404989c748c740f80300000048bbe0eb1cc9a37f0000488918488b5c24784889580848895010488060ffbf488b54246048833a03756a488b5a08488b1b488b5218488b12488b324883fe01750c48ba909adc0000000000eb6e4889f14889c748c7c0010000004989f8488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f04889d6eb05e95d0000004889f94889cf4889ca4889c148d1e94883c608f348a5488d7c3f01488d743601eb05e90d000000488d4c0901488062ffbf4c89c0498d4fe0483b4d107303ff55404989cf48c741f803000000488951104889590848c70101000000eb034889d14889c2498d47c8483b45107303ff55404989c748c740f806000000488b5c24284889582848895020488b542470488950185a4883c460488950105a4883c41048895008488908c208009090909090909000000000000000000008000000000000ffffffffffffff01ffffffffffffff01|@9649,2097151,@18485,@9364,I48,@9587,@9471,@1532,@9630|54,0,@9321 111,0,@803 256,0,@803 499,0,I48 529,0,@9362 696,0,@9363 834,0,I48 925,0,@9623 1068,0,I49 1151,0,@4361 1377,0,@4361 1524,0,I49 1561,0,@9627 1601,0,36028797018963967 1620,0,36028797018963967 1713,0,@9629 1778,0,I49 9321:O1|@9322 9322:D3,2080|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1048833a017562f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48be78c119f1a37f0000488b364889d84889f29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9702d1cc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5808f6c30174084883fb037d13eb06f643ff10740b48b8707907c9a37f0000c3488b3048833e037560f6c30174064883eb027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895f08488b5e0848891f49b8b8b019f1a37f00004d8b004889f84c89c2ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9802e1cc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b780840f6c70174084883ff037d13eb06f647ff10740b48b8707907c9a37f0000c34c8b0049833805750b48b8602f1cc9a37f0000c340f6c70174084883ff037d13eb06f647ff10740b48b8707907c9a37f0000c340f6c70174064883ef027105ff5570ebf540f6c70174084883ff017d14eb06f647ff10740c48bf282707c9a37f0000eb714989f941f6c10174064983e9027105ff5570ebf54d8d57e84c3b55107303ff55404d89d749c742f8020000004d894a084d8b48084d890a49bb78c119f1a37f00004d8b1b41ff7010574c89d04c89da909090ff1259f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e981010000ff55404989d748c742f80200000048894a085948890a48b9d8c019f1a37f0000488b09505248b838301cc9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8301cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d7fe8483b7d107303ff55404989ff48c747f80200000048894f0848b800311cc9a37f0000488907498d47e8483b45107303ff55404989c748c740f8020000004889780848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b938311cc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090909000000000000000001808000000000000|@9361,1048575,@18360|34,0,@1326 105,0,@20181 229,0,@883 298,0,@884 339,0,@835 472,0,@833 513,0,@9325 612,0,@1326 683,0,@20033 805,0,@883 874,0,@884 915,0,@835 1048,0,@833 1089,0,@9333 1189,0,@1326 1209,0,@9340 1240,0,@1326 1288,0,@847 1355,0,@20181 1440,0,@20171 1455,0,@9347 1508,0,@850 1553,0,@833 1594,0,@9350 1635,0,@833 1676,0,@834 1749,0,@833 1790,0,@9352 1831,0,@862 1942,0,@833 1983,0,@9354 9323:O1|@9324 9324:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18358|2,0,@388 9325:O5|0,0,0,@9327,@9326 9326:O2|@9331,0 9327:O2|@9328,0 9328:O2|0,@9329 9329:O5|@9330,463,463,0,0 9330:S34|6d6c736f757263652f4d4c436f6d70696c65722f5349474e4154555245532e736d6c 9331:O2|3,@9332 9332:S8|46726565536c6f74 9333:O5|0,0,0,@9335,@9334 9334:O2|@9338,0 9335:O2|@9336,0 9336:O2|0,@9337 9337:O5|@9330,461,461,0,0 9338:O2|3,@9339 9339:S10|53686172656457697468 9340:O5|0,0,0,@9342,@9341 9341:O2|@9345,0 9342:O2|@9343,0 9343:O2|0,@9344 9344:O5|@9330,464,464,0,0 9345:O2|3,@9346 9346:S5|556e736574 9347:O4|0,@9348,3,1 9348:O1|@9349 9349:D3,48|483b65187303ff554848b978b019f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@556,1048575,@18359|11,0,@20029 9350:O2|3,@9351 9351:S14|6465736372697074696f6e73203d 9352:O2|3,@9353 9353:S9|626f756e644964203d 9354:O5|0,0,0,@9356,@9355 9355:O2|@9359,0 9356:O2|@9357,0 9357:O2|0,@9358 9358:O5|@9330,462,462,0,0 9359:O2|3,@9360 9360:S12|5661726961626c65536c6f74 9361:S11|7072696e742d7661724964 9362:O2|@9364,@9363 9363:O2|@9587,@9362 9364:D8,1648|488dbc2450feffff483b7d187303ff5550415053415252415150ff750848b97e331cc9a37f00005148896508498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701010000004889ce48c7c11700000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bf28391cc9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184889771048894f0848c707030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff153e0500004889c348b8489319c9a37f000090ff1532050000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a0157488d5c24084889f848ba00dd07c9a37f00009090ff15a2040000498d47c8483b45107303ff55404989c748c740f80600000048b990391cc9a37f0000488908488b4c241848894808488b54243848895010488b9c24f000000048895818488bb4249800000048897020488bbc24e800000048897828488060ffbf4d8d47c84c3b45107303ff55404d89c749c740f80600000049b908411cc9a37f00004d89084c8b4c24204d8948084c8b5424484d895010498958184989702049897828498060ffbf4d8d5fc84c3b5d107303ff55404d89df49c743f80600000049bc68421cc9a37f00004d89234c8b6424584d8963084c8b6c24684d896b1049895b184989732049897b28498063ffbf4d8d77904c3b75107303ff55404d89f749c746f80d0000004d896e60488b742460498976584d895e504c8b6c24504d896e484d89564048bec8431cc9a37f00004989763849895630488b742430498976284c8b6424284d8966204d8946184989461049bdb0441cc9a37f00004d896e0849bd98451cc9a37f00004d892e4c8b6c24704c8b5424784156415341505041f6c501756e488b8424a000000041ff7508ffb42410010000ff742448ff742470ffb424d0000000ffb42490000000ffb424b8000000ffb42480000000ffb42490000000ffb424b8000000ff742460ffb424d8000000ffb42408010000ffb42468010000ffb42468010000ffb42468010000eb05e980000000ffb42468010000ffb42468010000ffb424d0000000ffb424b0000000ffb424a0000000ffb424b000000050ffb42490010000ffb42490010000ffb42490010000ff7008ffb424500100004c89d14c8b9424980100004c8b8c24f00100004d89d04889cb498b4500ff15460200004989c2415d483b65187303ff5548e907ffffff4c89d0498d47e8483b45107303ff55404989c748c740f802000000488b8c24b80000004883c4204889480848c70001000000488b8c24e80000005048c7c001000000488b91800000009090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901488b8424e0000000488b004989c54989ce4c8b9424c00000004c8b8c24c80000004c8b8424d8000000488b9c24e000000048c7c001000000ff1562010000488b0c2448833903756a488b5108488b12488b4918488b09488b194883fb01750c48b9909adc0000000000eb6d4889ce4889d94889c748c7c0010000004989f8488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f8eb05e95a0000004889c74889d948d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000488060ffbf4889c14c89c0498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889530848c70301000000eb034889cb488b8c24f80000004881c4a000000048891948ba509adc00000000004889510848c74110010000004c897118488941204c89692848c7c001000000c2580090909090909000000000000000006806000000000000|@9408,2097151,@18378,@194,@100,@1484,@9409,@9405|31,0,$9364+278 211,0,@9365 314,0,@193 335,0,@8394 376,0,@8395 406,0,@557 420,0,@20055 486,0,@1483 528,0,@9367 624,0,@9382 696,0,@9386 798,0,@9390 842,0,@9395 856,0,@9400 1385,0,I49 1584,0,I48 9365:O1|@9366 9366:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18361,@375| 9367:D6,96|483b65187303ff5548ff7208ff3566000000ff3568000000ff7218ff7220ff722849ba303a1cc9a37f00004c8b4a104c8d442420488b5808488b084889c89090ff15420000004883c410c3909090909000000000000000005800000000000000|@9371,1048575,@18362,@9372,@9374,@9369|35,0,@9368 9368:S5|56616c7565 9369:D8,400|483b65187303ff55485350415041524c89ca9090ff124883f801751b488b5c2418488b442410488b5424084883c420594883c42051ff22ff742438ff3567010000488b442428488b54245090ff124883f8017507488b442440eb21488b08488339017506488b4108eb12488b48084889c8483b65187303ff5548ebd24989c248bbe0ef0ac9a37f0000488b4424109090ff151a010000488b5c242090ff151601000048bb283c1cc9a37f0000ff150e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134c89d04989ca4989c14989e048c7c303000000488b442438909090ff15520000004883c430c2200090909000000000000000008801000000000000|@9378,1048575,@18365,@9379,@100,@100,@100,@9377|129,0,@3232 164,0,@9370 220,0,@1294 326,0,@1294 9370:S39|2920697320616c72656164792070726573656e7420696e2074686973207369676e61747572652e 9371:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283129283129 9372:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18363| 9373:S54|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e7465722836292d45 9374:O1|@9375 9375:D3,24|488b4020c390909000000000000000001000000000000000|@9376,1,@18364| 9376:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529737472756374456e762d283129 9377:D7,424|483b65187303ff5548488b4868f6c101753e488b11488b32483b35a1010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01756948b998c809c9a37f0000f6c101753e488b11488b32483b354f010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751a4889c148b8c0cf09c9a37f0000eb05e930000000488b5d08ff13488b0f488b11483b15f200000074154889c648b878e107c9a37f0000488b5d089090ff13488b7110eb26488b0f488b11483b15d000000074134889c648b878e107c9a37f0000488b5d08ff13488b71105350415141524889f04c89c2909090ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542408488950185a4883c4084889501048894808488b4c2408488908488b14244883f901740b488b4a1848c70103000000488b52604883c410ff2290900000000000000000a001000000000000|@9381,1048575,@18367,@20131,@20131,@20131,@20131|95,0,@2635 188,0,@2690 229,0,@1486 271,0,@1486 9378:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629 9379:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9380,2097151,@18366,@8000|18,0,@7998 9380:S55|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529636865636b416e64456e746572283629283129 9381:S28|5349474e41545552455328292e6572726f724d73674e656172283529 9382:D6,96|483b65187303ff5548ff7208ff3566000000ff3568000000ff7218ff7220ff722849ba903d1ac9a37f00004c8b4a104c8d442420488b5808488b084889c89090ff15420000004883c410c3909090909000000000000000005800000000000000|@9371,1048575,@18368,@9384,@9383,@9369|35,0,@8669 9383:O1|@9385 9384:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18369| 9385:D3,24|488b00488b4008c300000000000000001000000000000000|@7261,1,@18370| 9386:D6,96|483b65187303ff5548ff7208ff3566000000ff3568000000ff7218ff7220ff722849ba688c19c9a37f00004c8b4a104c8d442420488b5808488b084889c89090ff15420000004883c410c3909090909000000000000000005800000000000000|@9371,1048575,@18371,@9388,@9387,@9369|35,0,@8371 9387:O1|@9389 9388:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18372| 9389:D3,24|488b4018c390909000000000000000001000000000000000|@9376,1,@18373| 9390:O1|@9391 9391:D3,40|48b828441cc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9376,1,@18374|2,0,@9392 9392:O4|@20055,@557,@9394,@9393 9393:O5|@9330,991,0,991,0 9394:S29|456e746572696e672066756e63746f7220696e207369676e6174757265 9395:O1|@9396 9396:D3,40|48b810451cc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9376,1,@18375|2,0,@9397 9397:O4|@20055,@557,@9399,@9398 9398:O5|@9330,990,0,990,0 9399:S31|456e746572696e67207369676e617475726520696e207369676e6174757265 9400:O1|@9401 9401:D3,40|48b8f8451cc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9376,1,@18376|2,0,@9402 9402:O4|@20055,@557,@9404,@9403 9403:O5|@9330,989,0,989,0 9404:S28|456e746572696e672066697869747920696e207369676e6174757265 9405:D4,392|483b65187303ff5548488b1bf6c301740b41f6c0017405492bd87105ff5570ebf64883c3014883fb01750c48b8909adc0000000000eb70f6c30174084883fb017e1eeb06f643ff107516f6c301740b483b1d2a0100007c19eb06f643ff10751148b840ff0bc9a37f0000488b5d0890ff134889d948c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff40eb05e98400000057f348ab5f48c7c00100000053a801740ef60424017408483b04247c07eb59ff5570ebf34989c34c89db4c89c8909090ff15be0000004883f80175154889c148b8386208c9a37f0000488b5d089090ff13488b004a89449ffc41f6c30174064983c3027105ff5570ebf54c89d8483b65187303ff5548eb95488067ffbf4889f84883c4084889c1498d47d8483b45107303ff55404989c748c740f80400000048ba38481cc9a37f00004889104c895008488948104c894018488060ffbfc390909090909000000000000000007801000000000000ffffffffffffff01|@9586,2047,@18462,@3852|45,0,I49 98,0,@3572 237,0,@1662 333,0,@9406 9406:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@9407,1048575,@18377|73,0,36028797018963967 100,0,@560 9407:S37|5349474e41545552455328292e73696756616c283629747970654964456e76283129283129 9408:S36|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f283529 9409:D36,4312|488dbc2418ffffff483b7d187303ff5550488b0848ba86491cc9a37f0000488d548afcffe290e910020000909090e91a050000909090e9820a0000909090e9730b0000909090e90b000000909090e9df0b0000909090488b8c24c0000000488b9424b8000000488bb424b0000000488bbc24980000004c8b5c24404c8b6424384c8bac24a80000004c8bb424a000000041524c8b9424d000000041504c8b8424a000000041514c8b8c24a0000000ff7008488b8424a000000053488b5c245853488b9c240801000053488b9c24b000000053488b9c24b000000053488b9c24b000000053488b9c24b000000053488b9c24b000000053488b9c248800000053488b9c248800000053488b9c248800000053488b9c248800000053488b9c24880000004889bc24580100004c899c24500100004c89a424480100004c89ac24400100004c89b424380100004c899424300100004c898424280100004c898c24200100004889842418010000488b4424504889842410010000488b4424684889842408010000488b4424484889842400010000488b44244048898424f8000000488b44243848898424f0000000488b44243048898424e8000000488b44242848898424e0000000488b44242048898424d8000000488b44241848898424d0000000488b44241048898424c8000000488b44240848898424c0000000584883c4504889442460488b4424184889442458488b442420488944245048895c24484989f24989d14989c8488b5c2408584883c420594883c41851ff25b50e0000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488919498d57c0483b55107303ff55404989d748c742f80700000048bb685b1cc9a37f000048891a488b9c24d000000048895a08488bb424c8000000488972104c894a184c895220488bbc24d800000048897a2848894a30488062ffbf6a016a016a014989c84c8b58084989d44889e348c7c0010000009090ff15220e0000488b8424d8000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba505d1cc9a37f0000488911488b504048895108488b9c24d000000048895910488b74241048897118488061ffbf498d77e0483b75107303ff55404989f748c746f80300000048bfe05d1cc9a37f000048893e488b786048897e084c8bac24c80000004c896e10488066ffbf4d8d77904c3b75107303ff55404d89f749c746f80d00000049897660488bb424a000000049897658488b9424a800000049895650488b9c24b000000049895e4849894e4048b9c8431cc9a37f000049894e38488b8c24e000000049894e30488b8424b800000049894628488bbc24c000000049897e204c8b6c24084d896e184d89661049bcb0441cc9a37f00004d89660849bc98451cc9a37f00004d89264d8d67c84c3b65107303ff55404d89e749c74424f80600000049bd505e1cc9a37f00004d892c244c8b6c24784d896c2408488bbc248800000049897c2410488b8424800000004989442418488b8c249000000049894c2420488b9c249800000049895c242849806424ffbf498d57d8483b55107303ff55404989d748c742f80400000048be50611cc9a37f0000488932488b742470488972084889421048897a18488062ffbf4152415141504989d24c8b8c24080100004d89f04c89e34c89d848ba88fb18c9a37f000090ff152e0c0000498d47c0483b45107303ff55404989c748c740f80700000048b9b8671cc9a37f0000488908488b8c248000000048894808488b9424e800000048895010488b5c240848895818488b5c241048895820488b9c240801000048895828488b342448897030488060ffbf488b54241890ff12584883c428488b00c2d800488b4810498d57d8483b55107303ff55404989d748c742f80400000048be686a1cc9a37f000048893248894208488bb424d800000048897210488b780848897a18488062ffbff6401801756e4c8b40184989db498d5fd0483b5d107303ff55404989df48c743f80500000049bc506c1cc9a37f00004c89234c8ba424b80000004c8963084c8bac24b00000004c896b1048895318488b9424c000000048895320488063ffbf41524151415350ff3157ff71084d8b304989f0eb05e9490000004c89f048bab8c019c9a37f0000909090ff15e60a0000498d4fe0483b4d107303ff55404989cf48c741f80300000048baa8131ac9a37f0000488951104889410848c70105000000eb1b488b114c8b410848b9a8131ac9a37f000041524151535052574150498d47e8483b45107303ff55404989c748c740f8020000005a4889500848c70001000000488b942408010000515048c7c001000000488b9a800000004889da90ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901488b442410483b05040a00007439a801753a4889c648bf70cb06c9a37f00004889ca48c7c11900000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901745c4889d1eb054889caeb57483b05c50900007439a801753a4889c648bfc8ef06c9a37f00004889ca48c7c11b00000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174584889d1eb054889caeb53483b0586090000744feb0ae947010000e942010000a80175444889c648bf301b07c9a37f00004889ca48c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174564889d1eb0fe904010000e9ff0000004889caeb5b483b0531090000743ea801753f4889c648bf281c07c9a37f00004889ca48c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174584889d1eb0ae9b30000004889caeb5e483b05ed0800007445a8017546eb05e99a0000004889c648bfe0f419c9a37f00004889ca48c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174554889d1eb0ae9600000004889caeb55483b05a2080000744feb05e94b000000a80175374889c648bff8f419c9a37f00004889ca48c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756eeb0ae90a0000004889caeb674889d1eb034889d14889ca4989d24889c348b8406e1cc9a37f00009090ff153e08000048bb606e1cc9a37f0000ff1536080000ff742418ff3534080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000eb0ae9aa000000e9a5000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff1341524989ca4c8b4c24204c8d44240848c7c303000000488b84242801000090ff156a070000eb056a016a0152498d47a8483b45107303ff55404989c748c740f802000000488b4c24384889480848c70001000000488d501848c742f80700000048c742300100000048c74228010000005b4883c41048895a205b4883c40848895a184889421048c7420801000000488b0424488902ffb424f8000000ff35f5060000ff35f7060000ff742430ff742440ffb4242801000049ba303a1cc9a37f00004c8b8c24200100004c8d4424204889d39090ff15ce0600004883c420584883c410a80174064883c0027105ff5570ebf5c2d800488b400841524151a8017573ff7008ff742458ff742458ffb424d0000000ffb424d0000000ffb42400010000ffb424d8000000ffb424d8000000ffb424d8000000ffb42488000000ff742450ffb42440010000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424c0000000eb05e96b000000ffb424c0000000ffb424c0000000ffb42430010000ffb424c8000000ffb424b8000000ffb42418010000ffb424d8000000ffb424a80100004c8b9424900100004c8b8c24980100004c8b8424a0010000488b00ff15de0500004889c358483b65187303ff5548e919ffffff4889d84883c410c2d800498d4fe0483b4d107303ff55404989cf48c741f803000000488b501848895110488b701048897108488b7808488939415153ffb42488000000ffb42488000000ffb42480000000ffb42480000000ffb424980000004c8b9424100100004d89c8488b9c24800000004889c8909090ff1556050000584883c408c2d800488b4810488b11483b1548050000743ef6c20175334889d648bf70cb06c9a37f00004c8b410848c7c11900000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017459eb0c4c8b4108eb064c8b4108eb5f483b1503050000745bf6c201752d4889d648bfc8ef06c9a37f000048c7c11b00000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901745e483b15d0040000745af6c2017540eb05e9c70000004889d648bf301b07c9a37f0000eb0ae9b3000000e9ae00000048c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901745a483b158a0400007456f6c2017539eb0ae979000000e9740000004889d648bf281c07c9a37f000048c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017447483b154b040000743ef6c20175664889d6eb0ae92f000000e92a00000048bfe0f419c9a37f000048c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756b4d89cb4989dc4989c54989d641504c89f348b8406e1cc9a37f0000ff15f203000048bb606e1cc9a37f0000eb05e9e900000090ff15e20300004155ff35e2030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c1017417eb05e9ab00000048b8f86f07c9a37f0000488b5d08ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134152415341544155415641ff75184989ca4d8b4d084c8d44243048c7c303000000488b8424200100009090ff1512030000eb1a4889c148c7c00100000041506a016a0141524151535152ff7118498d5fc8483b5d107303ff55404989df48c743f80600000048b8806e1cc9a37f0000488903488b84240001000048894308488b8c24f800000048894b10488b54241048895318488b94242001000048895320488bb4240801000048897328488063ffbf4989d05848bab8c019c9a37f000090ff1586020000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424384889510848c70101000000488b942418010000505148c7c001000000488b9a800000004889da909090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f80200000048894108584889015149b800721cc9a37f000048bb98721cc9a37f0000488b4424089090ff15d6010000498d4fa8483b4d107303ff55404989cf48c741f802000000488b5424204889510848c70101000000488d591848c743f80700000048c743300100000048c74328010000005e4883c408488973204889431848894b1048c7430805000000488b0424488903ffb42410010000ff356d010000ff356f010000ff742430ff742440ffb4244001000049ba303a1cc9a37f00004c8b8c24380100004c8d44242090ff154a0100004883c420584883c428a80174064883c0027105ff5570ebf5c2d800909090909090900000000000000000d010000000000000|@9462,2097151,@18406,@9463,@8796,@8281,@8473,@427,@645,@830,@839,@8565,@8566,@100,@100,@9494,@9377,@9495,@9374,@9369,@9496,@9513,@427,@645,@830,@839,@8565,@100,@100,@9585,@9377,@8473,@1390,@9461,@9374,@9369|22,0,$9409+38 628,0,@9410 760,0,@9413 831,0,@9414 937,0,@9390 1000,0,@9395 1014,0,@9400 1052,0,@9415 1158,0,@9417 1219,0,@8279 1260,0,@9438 1387,0,@9442 1466,0,@9446 1553,0,@8472 1596,0,@8607 1630,0,@8607 1815,0,@427 1886,0,@645 1969,0,@830 2050,0,@839 2133,0,@8565 2216,0,@8566 2290,0,@9449 2308,0,@9450 2386,0,@1294 2490,0,@1294 2690,0,@9368 3148,0,@427 3225,0,@645 3291,0,@830 3374,0,@839 3445,0,@8565 3504,0,@9449 3520,0,@9450 3599,0,@1294 3702,0,@1294 3820,0,@9451 3899,0,@8472 4067,0,@9456 4077,0,@9459 4234,0,@9368 9410:D6,232|483b65187303ff5548488b4808488b5a30488b1b488b7230488b3640f6c60174064883c6027105ff5570ebf5488b7a30488937498d77a8483b75107303ff55404989f748c746f80200000048895e0848c70601000000488d5e1848c743f80700000048c743300100000048c74328010000004c8b41204c8943204c8b49184c894b1848897310488b7108488973084c8b114c8913ff7208ff3563000000ff3565000000ff7218ff7220ff722849ba303a1cc9a37f00004c8b4a104c8d4424204c8b184c89d8909090ff15420000004883c410c390909090900000000000000000e000000000000000|@9412,1048575,@18379,@9411,@9374,@9369|174,0,@9368 9411:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18380| 9412:S60|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657256616c283129 9413:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18381| 9414:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18382| 9415:D8,608|483b65187303ff5548498b480848833903756d48c7c601000000498b3840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda4989d24989db4989c44989f54d8b711041ff7108498b19498b42289090ff1512020000498d4fe0483b4d107303ff55404989cf48c741f803000000eb05e9430100004c8971105a48895108488901498b5220488b12498b5a20488b1bf6c30174064883c3027105ff5570ebf5498b722048891e4889c3498d47c8483b45107303ff55404989c748c740f806000000488948284c8958204c8960184889501048b928cd06c9a37f0000488948084c89284989d04989d9ff1582010000498d4fc8483b4d107303ff55404989cf48c741f80200000048c74108010000004c8909488d511848c742f80300000048894a104889420848c702070000004c89c1f6c101740d41f64210017406492b4a107105ff5570ebf54883c10150415241504989d04889cb498b4218909090ff1516010000488b44240859f6c101740cf64010017406482b48107105ff5570ebf54883c101498d57f0483b55107303ff55404989d748c742f801000000488b5c240848891a4989d04883c4084889cb488b4008ff15ca00000058c34989ca4d8b184d8b61104d8b6908498b19488b4228909090ff15b2000000498d4fa0483b4d107303ff55404989cf48c741f8030000004c8961104c896908488901488d412048c740f8030000004c8950104c89580848c700050000004889c2488d402048c740f803000000488948104889500848b908f206c9a37f0000488908c39090909090909000000000000000005802000000000000|@9416,2097151,@18383,@100,@8245,@3834,@3834,@100|227,0,@440 573,0,@661 9416:S58|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f636573735369672833296d616b654964283429 9417:D7,688|483b65187303ff5548a801740ef64218017408483b42187d5ceb05ff5570ebf3488b5208ff12488b480848833905754a49b848641cc9a37f000048bbd0641cc9a37f0000488b411048ba682108c9a37f00009090ff156e0200004883f803740948c7c001000000eb0748c7c0030000004883f002c3e94200000048833905751148b8807107c9a37f0000488b5d0890ff1348833901751a488b511048833a03750b488b5a08488b1b4889d8c3488b4208c3488b5108488b124889d0c3a801740cf64218017406482b42187105ff5570ebf54883c00152488b0c244889c74889fb488b4110ff15e601000048833803753c40f6c701740ef64008017408483b78087e07eb19ff5570ebf3488b480848b820651cc9a37f0000488b5d08ff13488b4008483b65187303ff5548ebaa488338077557488b4808488b510848833a05754e49b8a0651cc9a37f000048bbf0651cc9a37f0000488b421048ba682108c9a37f00009090ff156e0100004883f803740948c7c001000000eb0748c7c0030000004883f0024883c408c3e94e00000048833a05751148b8807107c9a37f0000488b5d0890ff1348833a017522488b5a1048833b03750f488b7308488b364889f04883c408c3488b43084883c408c3488b5a08488b1b4889d84883c408c34883380174134889c148b840661cc9a37f0000488b5d08ff13488b4808488b510848833a05754a49b8c8661cc9a37f000048bb18671cc9a37f0000488b421048ba682108c9a37f0000909090ff15b20000004883f803740948c7c001000000eb0748c7c0030000004883f0024883c408c348833a05751248b8807107c9a37f0000488b5d089090ff1348833a017522488b5a1048833b03750f488b7308488b364889f04883c408c3488b43084883c408c3488b5a08488b1b4889d84883c408c3909090900000000000000000a802000000000000|@9437,2097151,@18390,@1717,@3852,@1717,@1717|50,0,@9418 60,0,@9421 74,0,@1632 130,0,@1305 271,0,@9423 322,0,@9426 332,0,@9428 346,0,@1632 406,0,@1305 487,0,@9430 517,0,@9433 527,0,@9435 541,0,@1632 597,0,@1305 9418:O1|@9419 9419:D3,24|48c7c005000000c300000000000000001000000000000000|@9420,1,@18384| 9420:S37|545950455f5452454528292e747970655065726d697473457175616c697479283129283129 9421:O1|@9422 9422:D3,24|48c7c003000000c300000000000000001000000000000000|@9420,1,@18385| 9423:O4|@20055,@557,@9425,@9424 9424:O5|@9330,493,0,493,0 9425:S20|7265616c49643a2053686172696e67206c6f6f70 9426:O1|@9427 9427:D3,24|48c7c005000000c300000000000000001000000000000000|@9420,1,@18386| 9428:O1|@9429 9429:D3,24|48c7c003000000c300000000000000001000000000000000|@9420,1,@18387| 9430:O4|@20055,@557,@9432,@9431 9431:O5|@9330,1261,0,1261,0 9432:S30|696e7465726e616c4d61703a204e6f7420626f756e64206f722046726565 9433:O1|@9434 9434:D3,24|48c7c005000000c300000000000000001000000000000000|@9420,1,@18388| 9435:O1|@9436 9436:D3,24|48c7c003000000c300000000000000001000000000000000|@9420,1,@18389| 9437:S64|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332966696e64457175616c697479283129 9438:D7,152|483b65187303ff5548488b48084989d34c8b204c8b29498b5b30488b41089090ff158a000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c892941ff7308ff3569000000ff356b00000041ff731841ff732041ff732849ba903d1ac9a37f00004d8b4b104c8d4424204889cb4c89e09090ff15460000004883c410c39000000000000000009000000000000000|@9440,1048575,@18391,@9441,@9439,@9383,@9369|99,0,@8669 9439:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18393| 9440:S66|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329656e74657246696e616c54797065283129 9441:D3,224|483b65187303ff5548a801756e488b08488b13488b3340f6c60174064883c6027105ff5570ebf5488933498d77a8483b75107303ff55404989f748c746f8020000004889560848c70601000000488d561848c742f80700000048c742300100000048c7422801000000488b792048897a204c8b41184c894218eb05e94600000048897210488b7108488972084c8b094c890a524c8b50084c89d0909090e85effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000d800000000000000|@1363,511,@18392| 9442:D5,232|483b65187303ff5548ff7208ff35ee000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4a184989e048c7c303000000488b42109090ff15360000004883c410c3900000000000000000e000000000000000|@9444,1048575,@18394,@9443,@9377|60,0,@1294 166,0,@1294 9443:D4,48|483b65187303ff55484889c3488b420848ba482218c9a37f0000ff252800000000000000000000002800000000000000|@9445,2097151,@18395,@8025|18,0,@8021 9444:S32|5349474e41545552455328292e67697665537065634572726f72283329283129 9445:S35|5349474e41545552455328292e67697665537065634572726f72283329283129283129 9446:D4,224|483b65187303ff5548488b4a20498d5fe0483b5d107303ff55404989df48c743f80300000048be606d1cc9a37f0000488933488b714048897308488b7a0848897b10488063ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049bad06d1cc9a37f00004d89114c8b51604d8951084c8b5a104d895910498061ffbf4d8d67e84c3b65107303ff55404d89e749c74424f8020000004d894c240849891c2441504c8b42184889c34c89e090ff1542000000488b0c24488b0048890148c7c0010000004883c408c3909090900000000000000000d800000000000000|@8388,2097151,@18398,@8370|39,0,@9447 97,0,@9448 9447:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18396| 9448:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18397| 9449:S12|53706563696679696e672022 9450:S13|2220697320696c6c6567616c2e 9451:D5,232|483b65187303ff5548488b4a28498d77e0483b75107303ff55404989f748c746f80300000048bfa06f1cc9a37f000048893e488b794048897e084c8b4a084c894e10488066ffbf4d8d57e04c3b55107303ff55404d89d749c742f80300000049bb10701cc9a37f00004d891a4c8b59604d895a084c8b62104d896210498062ffbf4d8d6fe84c3b6d107303ff55404d89ef49c745f8020000004d8955084989750053ff7220ff7218ff355200000041504c8d4424084889c34c89e890ff1546000000488b0c24488b0048890148c7c0010000004883c428c30000000000000000e000000000000000|@8388,2097151,@18401,@9454,@8370|39,0,@9452 97,0,@9453 9452:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18399| 9453:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18400| 9454:D5,232|483b65187303ff5548ff7208ff35ee000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4a184989e048c7c303000000488b42109090ff15360000004883c410c3900000000000000000e000000000000000|@9444,1048575,@18402,@9455,@9377|60,0,@1294 166,0,@1294 9455:D4,48|483b65187303ff55484889c3488b420848ba482218c9a37f0000ff252800000000000000000000002800000000000000|@9445,2097151,@18403,@8025|18,0,@8021 9456:O1|@9457 9457:D3,24|c39090909090909000000000000000001000000000000000|@9458,1,@18404| 9458:S52|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329283129 9459:O1|@9460 9460:D3,24|c39090909090909000000000000000001000000000000000|@9458,1,@18405| 9461:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18461| 9462:S49|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329 9463:D9,1576|488dbc24c0feffff483b7d187303ff5550f6c3017570488b0b488b5118498d77e0483b75107303ff55404989f748c746f80300000048bf207a1cc9a37f000048893e498b784048897e084c894e10488066ffbf4d8d5fe04c3b5d107303ff55404d89df49c743f80300000049bc907a1cc9a37f00004d89234d8b60604d8963084d895310eb05e983050000498063ffbf4d8d6fe04c3b6d107303ff55404d89ef49c745f80300000049be007b1cc9a37f00004d8975004d8945084c8bb424c00000004d897510498065ffbf498d7f90483b7d107303ff55404989ff48c747f80d0000004c895f604c8b9c24880000004c895f584c8ba424900000004c8967504c896f484889774048bec8431cc9a37f000048897738488bb42498000000488977304c8bac24a00000004c896f284c8bb424a80000004c8977204c8bb424b00000004c8977184c8bb424b80000004c89771049beb0441cc9a37f00004c89770849be98451cc9a37f00004c89374c8b71085041514150ff730857ff324c89f3488b8424b00000009090ff15b204000048c7c35d000000909090ff15aa040000488b0c244883390175746a016a016a016a016a016a0141524156488d54241052ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e80000004989c249c7c1010000004c8b4110488b9c24a0000000eb05e960000000488b4108488b942440010000909090ff12498d47c8483b45107303ff55404989c748c740f806000000488b4c243848894828488b4c243048894820488b4c242848894818488b4c242048894810488b4c241848894808488b4c2410488908eb6a488339057569488b51086a016a016a016a016a016a0141524156ff74244850ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f00000004c8b12eb0ae9f7000000e91f0000004c8b4a204c8b4210488b5a18488b4208488b9424f0000000909090ff12eb706a016a016a016a016a016a01415241566a016a016a016a016a016a014889e252ffb424e0000000ffb42420010000ffb42420010000ffb424f0000000ffb42428010000ffb42428010000ffb42428010000ffb42428010000ffb424280100004989c24c8b8c24c80000004c8b4118eb05e95e000000488b5910488b4108909090ff15b6020000498d47c8483b45107303ff55404989c748c740f806000000488b4c242848894828488b4c242048894820488b4c241848894818488b4c241048894810488b4c240848894808594883c428488908488b4c2468f6c10174064883c1027105ff5570ebf550ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb42438010000ffb424380100004c8b9424d00000004c8b8c24280100004c8b842420010000488b9c24180100004889c890e832fbffff498d4fe8483b4d107303ff55404989cf48c741f802000000488b9424900000004889510848c70101000000488b9c24e0000000505148c7c001000000488b9380000000909090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f802000000488b5424784889500848c70001000000498d57d8483b55107303ff55404989d748c742f80400000048894a18488b4c240848894a1048894208488b442410488902ffb42488000000ff358e000000ff3590000000ffb42408010000ffb424b0000000ffb4241001000049ba688c19c9a37f00004c8b4c24484c8d4424204889d3ff15660000004883c410584883c478c2c000c2c0009090909090909000000000000000002006000000000000|@9470,2097151,@18411,@100,@100,@9471,@9469,@9387,@9369|55,0,@9464 109,0,@9465 170,0,@9466 265,0,@9390 339,0,@9395 353,0,@9400 1511,0,@8371 9464:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18407| 9465:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18408| 9466:D4,88|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252800000000000000000000005000000000000000|@9468,1048575,@18409,@9467| 9467:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18410| 9468:S69|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329705374727563742832296e6577456e762d283129 9469:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18420| 9470:S59|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f6365737353696728332970537472756374283229 9471:D8,1256|483b65187303ff55486a016a016a016a016a016a01488b4c2478415241505350488b5128ff124883f801756b488b1c2448b858821cc9a37f00009090ff15be04000048bb508e19c9a37f0000ff15b6040000ffb42490000000ff35b1040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741a48b8f86f07c9a37f0000488b5d08eb05e9f1000000909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4c24184989e048c7c303000000488b84249800000090ff15ee030000488d4424304883c410488b8c2480000000488908488d44242048ba388819c9a37f000048895008488d44242048c7401001000000488d44242048c7401801000000488d44242048ba78821cc9a37f000048895020488d44242048c7402801000000eb4f488b08488d542420488b1948891a488d542420488b710848897208488d542420488b791048897a10488d5424204c8b41184c894218488d5424204c8b49204c894a20488d5424204c8b51284c8952284883c41058488b4c2420488908488b442460488b0050ff742458ff7424584c8b5424704c8b4c24784c8b44241848bb68831cc9a37f0000488b442430ff15020300004883f801750c48b8909adc0000000000eb6d48c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0d760200007d08eb1bf641ff1075154889c248b818930ec9a37f0000488b5d089090ff134889c248c7c001000000488d3c8d04000000eb05e96500000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f8488b4c2438f6c1017509f60424017503ff5570483b0c247407f6442420017407488b442430eb6f498d57d8483b55107303ff55404989d748c742f80400000048bb00841cc9a37f000048891a488b5c244848895a084889421048894a18488062ffbf498d47e0483b45107303ff55404989c748c740f80300000048b908851cc9a37f0000488908488b4c24304889480848895010eb05e905000000488060ffbf488b4c24684883c410488b09488b142448833a03756a488b5a08488b1b488b5218488b12488b324883fe01750c48ba909adc0000000000eb714889cf4889f14989c048c7c0010000004989f9488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0eb05e9630000004889d64889f94889cf4889ca4889c148d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c0901488062ffbf4c89c94c89c0498d77e0483b75107303ff55404989f748c746f8030000004889561048895e0848c70601000000eb034889d6488b9424800000004883c4084889325b4883c40848895a0848c74210010000005b4883c41048895a184889422048894a2848c7c001000000c250009090900000000000000000d804000000000000ffffffffffffff01|@9490,2097151,@18417,@100,@100,@9491,@9377,@9484|50,0,@9472 68,0,@8386 137,0,@1294 250,0,@1294 325,0,@8366 370,0,@9473 523,0,@9478 550,0,I49 633,0,@4361 840,0,@9481 899,0,@9483 982,0,I49 9472:S11|5369676e61747572652028 9473:O1|@9474 9474:D3,40|48b8d8821cc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9477,1,@18412|2,0,@9475 9475:O4|11,@42,0,@9476 9476:O5|@9330,177,0,177,0 9477:S35|5349474e41545552455328292e756e646566696e65645369676e61747572652d283129 9478:O1|@9479 9479:D3,24|48c7c001000000c300000000000000001000000000000000|@9480,1,@18413| 9480:S49|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529762d283129 9481:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@9482,1048575,@18414|73,0,36028797018963967 100,0,@560 9482:S59|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d61704964732d6d61704964283129 9483:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18415,@1542| 9484:D7,712|483b65187303ff5548a8017559488b08488b510848833a017417488b700848b870881cc9a37f0000488b5d08909090ff1348833a057516488b700848b8807107c9a37f0000488b5d089090ff1348833a01751e488b721048833e03750e488b7e08488b3feb15e93d020000488b7e08eb0a488b7208488b364889f7488b71104d89cb4d89c44c8b68084c8b721853ff722057ff7610ff7608ff7208488b1e4c89e0909090ff1536020000498d4fe0483b4d107303ff55404989cf48c741f803000000488b54241048895110488b54240848895108488901498b13498b1bf6c30174064883c3027105ff5570ebf549891b4889c3498d47c8483b45107303ff55404989c748c740f80600000048894828488b4c242048894820488b4c2418488948184889501048b928cd06c9a37f000048894808594883c4204889084989d04989d9909090ff159e010000498d4fc8483b4d107303ff55404989cf48c741f80200000048c74108010000004c8909488d511848c742f80300000048894a104889420848c702070000004c89c1f6c101740b41f6c2017405492bca7105ff5570ebf64883c101504152415341544155415641504989d04889cb488b442450ff152e01000058a801740ef6442420017407482b4424207105ff5570ebf44883c001498d4ff0483b4d107303ff55404989cf48c741f801000000488b5424284889114989c84889c3488b442440909090ff15e6000000498d47d8483b45107303ff55404989c748c740f80400000048b9f8881cc9a37f0000488908488b4c242848894808488b542430488950105a48895018488060ffbfff742440ff7424404c8b5424284c8b4c24204c8b4424184889c3488b442410909090e886fdffff4889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c420594883c408488908c2100048c7c001000000c210009090909090900000000000000000c002000000000000|@9493,2097151,@18419,@100,@8243,@3834,@3834|32,0,@9485 61,0,@1305 295,0,@440 556,0,@9488 9485:O4|@20055,@557,@9487,@9486 9486:O5|@9330,778,0,778,0 9487:S28|4d617020646f6573206e6f742072657475726e20426f756e64204964 9488:D3,112|483b65187303ff5548488b480848833901753e488b5918f6c3017509f64218017503ff5570483b5a187520498d47f0483b45107303ff55404989c748c740f801000000488b5208488910c3488b5210ff2248c7c001000000c39090909090909000000000000000006800000000000000|@9489,1048575,@18416| 9489:S66|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e65774964732832296e65774d6170283129 9490:S44|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c7565283529 9491:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18418,@8000|18,0,@7998 9492:S31|5349474e41545552455328292e676976654572726f72283329283129283129 9493:S57|5349474e41545552455328292e73696756616c2836297369676e61747572654964656e7456616c75652835296d616b654e6577496473283229 9494:D4,48|483b65187303ff55484889c3488b420848ba482218c9a37f0000ff252800000000000000000000002800000000000000|@9445,2097151,@18421,@8025|18,0,@8021 9495:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18422| 9496:D5,1216|488dbc2420ffffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488919498d57e0483b55107303ff55404989d748c742f80300000048bbd0901cc9a37f000048891a498b584048895a084c894a10488062ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf40911cc9a37f000048893e498b786048897e084c895610488066ffbf4d8d5f904c3b5d107303ff55404d89df49c743f80d00000049897360488bb42490000000498973584c8ba424980000004d8963504c8bac24a00000004d896b484989534048bac8431cc9a37f000049895338488b9424a8000000498953304c8bb424b00000004d897328488b9c24b800000049895b20488bbc24c000000049897b184c8b8424c80000004d89431049b8b0441cc9a37f00004d89430849b898451cc9a37f00004d89036a016a0148833801756f6a016a016a016a016a016a0151415241514c8d4424184150ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e0000000ffb424e00000004c8b9424e000000049c7c101000000eb05e9380000004c8b40104c89db4c8b58084c89d8488b942438010000909090ff12488d442448488b4c2418488908488d442448488b4c243848894808eb6c48833805756b4c8b40086a016a016a016a016a016a0151415241514153ffb42490000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000ffb424e8000000eb0ae9e9000000e93f0000004d8b104d8b4820498b40104d8b581841ff70084989c04c89db58488b9424e000000090ff12488d4c2448488b10488911488d4c2448488b582048895908eb6e6a016a016a016a016a016a0151415241516a016a016a016a016a016a014989e04150ffb424d8000000ffb42418010000ffb42418010000ffb424e8000000ffb42420010000ffb42420010000ffb42420010000ffb42420010000ffb424200100004c8b9424080100004d89d9eb05e9320000004c8b4018488b58104c8b58084c89d89090ff159e010000488d442478594883c418488908488d442458594883c40848894808498d47c0483b45107303ff55404989c748c740f80700000048b9b0911cc9a37f0000488908488b4c2470488948085a48895010488b9424d000000048895018488b5c247048895820488bb424c800000048897028488b7c240848897830488060ffbf4d8d47c04c3b45107303ff55404d89c749c740f80700000049b948951cc9a37f00004d89084c8b4c24604d894808415a4d89501049895018498958204989702849897830498060ffbf4d8d57c04c3b55107303ff55404d89d749c742f80700000049bb40971cc9a37f00004d891a4c8b5c24504d895a084c8ba424f00000004d8962104989521849895a204989722849897a30498062ffbf4d8d6fe04c3b6d107303ff55404d89ef49c745f8030000004d894510498945084d895500ff7424406a0149ba509adc000000000049c7c1030000004c8b4424504c89eb488b44244890ff1542000000584883c440488b00c2c800909090909090900000000000000000b804000000000000|@9512,2097151,@18432,@9471,@8412|74,0,@9497 128,0,@9498 226,0,@9390 300,0,@9395 314,0,@9400 879,0,@9499 977,0,@9506 1050,0,@9509 1147,0,I48 9497:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18423| 9498:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18424| 9499:D7,216|483b65187303ff5548488b48084883790801746e488b19498d77e0483b75107303ff55404989f748c746f803000000488b7b1048897e104c8b43084c8946084c8b0b4c890e4989d44c8b284989f6498b5c2430488b410890ff1592000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c89314c89e2eb034c8b28ff7208ff356a000000ff356c000000ff7218ff7220ff722849ba903d1ac9a37f00004c8b4a104c8d4424204889cb4c89e89090ff154a0000004883c410c390909090900000000000000000d000000000000000|@9501,1048575,@18425,@9502,@9500,@9383,@9369|159,0,@8669 9500:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18427| 9501:S77|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657254797065283129 9502:D3,256|483b65187303ff5548a801756f488b08488b511048833a017417488b700848b8c8941cc9a37f0000488b5d08909090ff13488b334889f740f6c70174064883c7027105ff5570ebf548893b498d7fa8483b7d107303ff55404989ff48c747f8020000004889770848c70701000000488d771848c746f807000000eb05e96500000048c746300100000048c74628010000004c8b41204c8946204c8b49184c894e1848897e10488b790848897e084c8b114c8916564c8b58084c89d89090e83effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000f800000000000000|@1363,1023,@18426|32,0,@9503 9503:O4|@20055,@557,@9505,@9504 9504:O5|@9330,1141,0,1141,0 9505:S21|6e65774163636573733a204e6f7420466f726d616c 9506:D6,232|483b65187303ff5548488b4808488b590848833b017416488b3048b8c8941cc9a37f0000488b5d08909090ff13488b7230488b364889f740f6c70174064883c7027105ff5570ebf54c8b4230498938498d7fc0483b7d107303ff55404989ff48c747f8020000004889770848c70701000000488d771848c746f8040000004c8b49184c894e184c8b51104c89561048897e08488b3948893eff7208ff355f000000ff3561000000ff7218ff7220ff722849ba688c19c9a37f00004c8b4a104c8d4424204889f3488b304889f0ff153e0000004883c410c3900000000000000000e000000000000000|@9508,1048575,@18428,@9507,@9387,@9369|28,0,@9503 178,0,@8371 9507:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18429| 9508:S79|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e746572537472756374283129 9509:D6,256|483b65187303ff5548488b4808488b591048833b017416488b3048b8c8941cc9a37f0000488b5d08909090ff13488b7230488b364889f740f6c70174064883c7027105ff5570ebf54c8b4230498938498d7fa8483b7d107303ff55404989ff48c747f8020000004889770848c70701000000488d771848c746f80700000048c746300100000048c74628010000004c8b49204c894e204c8b51184c89561848897e10488b790848897e084c8b194c891eff7208ff355f000000ff3561000000ff7218ff7220ff722849ba303a1cc9a37f00004c8b4a104c8d4424204889f3488b304889f0ff153e0000004883c410c3900000000000000000f800000000000000|@9511,1048575,@18430,@9510,@9374,@9369|28,0,@9503 202,0,@9368 9510:D3,72|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5208ff229090909090909000000000000000004000000000000000|@9373,1048575,@18431| 9511:S76|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229656e74657256616c283129 9512:S65|5349474e41545552455328292e73696756616c2836296d616b65536967496e746f28352970726f63657373536967283329696e636c756465536967457870283229 9513:D13,608|488dbc2448ffffff483b7d187303ff55504883780801746ef64010017417488b08488b501048b8809c1cc9a37f0000488b5d08ff13488b4810488b11498d77e8483b75107303ff55404989f748c746f802000000488b7b6048897e084c8b5b404c891eff720841524151ff3508020000ff3053415041514152ff71084c8d442430488b1aeb05e9600100004889f09090ff15ea010000488b08488b5110488b5a0848833b03751b488b7308483b35d6010000750e48c7c0010000004883c450c22800488b34245040f6c6017572488b06488b4c2428498d57e8483b55107303ff55404989d748c742f802000000488b596048895a08488b794048893aff7008ff742418ff742428ff3583010000ff76084c8d442408488b184889d090ff15760100004989c54c8b9424900000004c8b8c24980000004c8b8424a0000000eb05e999000000488b9c24a800000048c7c00100000090ff15460100004989c64c8b9424900000004c8b8c24980000004c8b8424a0000000488b9c24a800000048c7c001000000ff151e01000050ff742460ff742458ff742450ffb424c0000000ffb424b000000049ba509adc00000000004c8b4c24584d89f048bb509adc00000000004c89e8ff15e60000005e4883c420483b65187303ff5548e9eafeffff48c7c0010000004883c458c22800ff30415041524c89c94d89d14989c8488b40109090ff15b2000000488b4c2438488b542420488b5c2440488b742430488b7c2428488954244048895c2438488974243048897c24284989ca415941585b415b4883c4084153ff25770000009090909090909000000000000000005802000000000000|@9517,2097151,@18433,@9518,@8370,@20081,@9522,@8370,@9405,@9405,@9524,@9562,@9516|39,0,@9514 423,0,I48 441,0,I48 9514:O4|@20091,@1627,0,@9515 9515:O5|@9330,709,0,709,0 9516:D5,104|483b65187303ff5548415053415241514c8b5424284c8b4c24304c8b442408488b5c2438ff1556000000488b4c2440488b54241848895424404c8b5424104989c94c8b4424085b4883c4185a4883c41852ff25310000009000000000000000006000000000000000|@9576,2097151,@18453,@9577,@9565| 9517:S47|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e74283329 9518:D6,256|483b65187303ff55484989d248bbf89e1cc9a37f00009090ff15fa00000041ff7208ff35f8000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff153e0000004883c410c3900000000000000000f800000000000000|@9521,1048575,@18434,@100,@9520,@9377|14,0,@9519 82,0,@1294 186,0,@1294 9519:S14|20696e207369676e61747572652e 9520:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18435,@8000|18,0,@7998 9521:S66|5349474e41545552455328292e73696756616c2836296170706c7953686172696e67436f6e73747261696e742833296c6f6f6b75704661696c757265283129283129 9522:D6,256|483b65187303ff55484989d248bbf89e1cc9a37f00009090ff15fa00000041ff7208ff35f8000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff153e0000004883c410c3900000000000000000f800000000000000|@9521,1048575,@18436,@100,@9523,@9377|14,0,@9519 82,0,@1294 186,0,@1294 9523:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18437,@8000|18,0,@7998 9524:D24,3096|483b65187303ff5548488b08488b5110488b720848833e03750d488b7e08483b3d0b0c00007420498b394c8b5f104d8b630849833c240375184d8b6c24084c3b2df30b0000750a48c7c001000000c2300048833e0375064c8b6e10eb3d48833e0175064c8b6e08eb3149c7c5010000004c8b760841f6c601752041f6c50174064983c5027105ff5570ebf54d8b7608483b65187303ff5548ebda49833c240375074d8b742410eb3f49833c240175074d8b742408eb3149c7c601000000498b4c2408f6c101752041f6c60174064983c6027105ff5570ebf5488b4908483b65187303ff5548ebdb41f6c501750941f6c6017503ff55704d3bee746eff742420ff353b0b00004d89d54d89ce90ff15360b0000504c89eb4c89f0909090ff152e0b0000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba58ae1cc9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e94701000048b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b838af1cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870af1cc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134989c24c8b4c24384989e048c7c303000000488b442428ff15aa0900004883c410c23000488b084c8b69104d8b750849833e0175164152415153505141ff31498b46184c89c290ff12eb114989c04c89e8415241515341505141ff31488b0c24488b5110488b5a0848833b01751150488b4318488b542468909090ff12eb074889c64889d056488b0c24488b510848833a01755f488b5a18f6c3017410f6442448017409483b5c24487d07eb55ff5570ebf2f6c301740ef6442448017407482b5c24487105ff5570ebf44883c301504889df4889fb488b44244890ff15ee08000048833803754840f6c701741af6400801eb05e95b000000740d483b78087e0ceb1ee949000000ff5570ebee488b480848b820651cc9a37f0000488b5d08ff13488b5808483b65187303ff5548eba0488b084883f901741c4883f907746d48b8b0af1cc9a37f0000488b5d089090ff1350eb0150488b442418488b18488b4424289090ff156e080000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b442408eb05e93c030000488b50104989cc4c8b4210488b5a08488b0290ff1516080000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820b01cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13ff742460ff351d0700004989c3488b5c2438488b442430ff15120700004989c4488b5c2448488b44244090ff1506070000498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004c8919488d511848c742f80200000048894a0848b9781b07c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848baa0ae1cc9a37f0000488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b9902b07c9a37f000048890a498d4fd0483b4d107303ff55404989cf48c741f80200000048895108488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b838af1cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870af1cc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134989c24c8b4c24784989e048c7c303000000488b442468ff151a0500004883c450c23000488b0424488b480848833901755f488b5118f6c2017410f6442450017409483b5424507d07eb53ff5570ebf2f6c201740ef6442450017407482b5424507105ff5570ebf44883c2014889d74889fb488b442448ff15c204000048833803754840f6c701741af64008017414eb05e956000000483b78087e0ceb1ee949000000ff5570ebee488b480848b820651cc9a37f0000488b5d08ff13488b5008483b65187303ff5548eba1488b084883f90174184883f907746f48b8b0af1cc9a37f0000488b5d089090ff13488b442410488b18488b4424389090ff1546040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13488b0424488b50104989cceb05e9360300004c8b4210488b5a08488b029090ff15ee030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820b01cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13ff742460ff35f50200004989c3488b5c2438488b442430ff15ea0200004989c4488b5c2448488b44244090ff15de020000498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004c8919488d511848c742f80200000048894a0848b9781b07c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848baa0ae1cc9a37f0000488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b9902b07c9a37f000048890a498d4fd0483b4d107303ff55404989cf48c741f80200000048895108488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b838af1cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870af1cc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134989c24c8b4c24784989e048c7c303000000488b442468ff15f20000004883c450c23000488b442450488b4c24484989c94989c0488b1c24488b4424084883c4405a4883c43052ff25ca00000090900000000000000000100c000000000000|@9551,2097151,@18438,@20081,@20081,@9552,@9554,@9554,@9377,@3852,@100,@9556,@9558,@9554,@9554,@9377,@3852,@100,@9556,@9559,@9554,@9554,@9377,@9541|316,0,@9525 368,0,@833 409,0,@9532 450,0,@833 523,0,@1317 564,0,@9534 643,0,@1294 931,0,@9423 977,0,@9536 1060,0,@1294 1167,0,@833 1208,0,@9539 1249,0,@833 1347,0,@1294 1463,0,@833 1504,0,@9528 1545,0,@884 1605,0,@833 1646,0,@9532 1687,0,@833 1747,0,@1317 1788,0,@9534 1867,0,@1294 2055,0,@9423 2101,0,@9536 2180,0,@1294 2287,0,@833 2328,0,@9539 2369,0,@833 2467,0,@1294 2583,0,@833 2624,0,@9528 2665,0,@884 2725,0,@833 2766,0,@9532 2807,0,@833 2867,0,@1317 2908,0,@9534 2987,0,@1294 9525:O2|@884,@9526 9526:O2|@9528,@9527 9527:O2|@833,@9529 9528:O2|3,46 9529:O2|@9530,0 9530:O2|3,@9531 9531:S58|546865207479706520636f6e7374727563746f72732074616b6520646966666572656e74206e756d62657273206f6620617267756d656e74732e 9532:O2|3,@9533 9533:S9|776974682074797065 9534:O2|3,@9535 9535:S17|43616e6e6f742073686172652074797065 9536:O4|@20055,@557,@9538,@9537 9537:O5|@9330,504,0,504,0 9538:S5|6973566172 9539:O2|3,@9540 9540:S21|697320616c726561647920646566696e6564206173 9541:D8,952|483b65187303ff5548488b480848833901750a488b530848833a0174144889c148b868b41cc9a37f0000488b5d0890ff13488b711840f6c601740b41f6c0017405492bf07105ff5570ebf64883c601ff72184889f74889fb4c89c890ff156e03000048833803753c40f6c701740ef64008017408483b78087e07eb19ff5570ebf3488b480848b820651cc9a37f0000488b5d08ff13488b7008483b65187303ff5548ebae4889c158a801740b41f6c0017405492bc07105ff5570ebf64883c001514889c74889fb4c89c89090ff150603000048833803753c40f6c701740ef64008017408483b78087e07eb19ff5570ebf3488b480848b820651cc9a37f0000488b5d08ff13488b4008483b65187303ff5548ebad488b0c24488339077522488b5108488b5a0848833b01751448833807750e488b7008488b7e0848833f0174154889c248b8f0b41cc9a37f0000488b5d089090ff134c8b531841f6c2017509f64718017503ff55704c3b5718750c48c7c0010000004883c408c341f6c201740ef647180174084c3b57187c0deb05ff5570ebf34c8b5f18eb034d89d341f6c201740ef647180174084c3b57187e07eb09ff5570ebf34c8b571848837b2001740949c7c403000000eb044c8b67204c8b6b0841f6c5017509f64708017503ff55704c3b6f0874174c8b701048b880b51cc9a37f0000488b5d08909090ff134c8b731049833e03750f498b7608488b364883fe017412eb0749837e0801740948c7c603000000eb1e488b771048833e03750d4c8b6e084d8b6d004c89eeeb07488b7e084889fe498d7f98483b7d107303ff55404989ff48c747f8020000004889770848c70701000000488d771848c746f8050000004c8966204c895e1848897e10488b7b0848897e0848c706010000004c8d663049c74424f803000000488b52104989542410498974240848ba28cd06c9a37f00004989142448837810017506488b4910eb11488b5810488b4110ff150e0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104c89600848c700070000004c89d9f6c101740b41f6c0017405492bc87105ff5570ebf64883c10141514150415341524989c04889cb4c89c8909090ff15b600000058a801740ef6442408017407482b4424087105ff5570ebf44883c00159f6c101740cf60424017406482b0c247105ff5570ebf54883c101498d57e8483b55107303ff55404989d748c742f80200000048894a0848c702030000004989d04883c4084889c3584883c408ff254f000000909090909090900000000000000000b003000000000000|@9561,2097151,@18444,@3852,@3852,@9560,@3834,@3834|34,0,@9542 135,0,@9423 247,0,@9423 325,0,@9545 492,0,@9548 683,0,@440 9542:O4|@20055,@557,@9544,@9543 9543:O5|@9330,552,0,552,0 9544:S30|6c696e6b466c657869626c65547970654964733a206e6f7420626f756e64 9545:O4|@20055,@557,@9547,@9546 9546:O5|@9330,550,0,550,0 9547:S33|6c696e6b466c657869626c65547970654964733a206e6f74207661726961626c65 9548:O4|@20055,@557,@9550,@9549 9549:O5|@9330,540,0,540,0 9550:S38|6c696e6b466c657869626c65547970654964733a20646966666572656e742061726974696573 9551:S35|5349474e41545552455328292e73696756616c28362973686172655479706573283829 9552:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9553,2097151,@18439,@8000|18,0,@7998 9553:S50|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e745368617265283129283129 9554:D4,424|483b65187303ff5548488b08488b5108f6c2017538488b3248833e01751d498d7ff0483b7d107303ff55404989ff48c747f801000000488937eb19488b72084889f2483b65187303ff5548ebc348c7c70100000040f6c7017569488b1748833a017565498d77e8483b75107303ff55404989f748c746f8020000004c8b42084c89460848c7060100000040f6c601741148b8f86f07c9a37f0000488b5d0890ff134d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049c7410801000000eb0ae90a000000e905000000498931eb0749c7c1010000004d89ca4889da488b194889d0909090ff15d2000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c74008010000004889084889c1488d401848c740f805000000488948204c89501848c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c39090909090900000000000000000a001000000000000|@9555,511,@18440,@100|146,0,@1294 280,0,@1294 387,0,@1294 9555:S62|5349474e41545552455328292e73696756616c2836297368617265547970657328382963616e74536861726528312973686f7754797065436f6e73283229 9556:D6,752|483b65187303ff55484c3b05f8020000743341f6c00175644c89c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901756d498d4fe8483b4d107303ff55404989cf48c741f8020000004889590848c70101000000f6c101741c4889c248b8f86f07c9a37f0000eb05e9c9000000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a18eb05e99300000048c741f8020000004889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47b8483b45107303ff55404989c748c740f80200000048c74008010000004889084889c1488d401848c740f805000000488948204889501848c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c3498d4fe8483b4d107303ff55404989cf48c741f8020000004889590848c70101000000f6c10174134889c248b8f86f07c9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989d24989cb4c89c348b868280ac9a37f0000ff152201000048bb38280ac9a37f0000ff151a010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47b8483b45107303ff55404989c748c740f802000000488948084c89184889c1488d401848c740f805000000488948204c89501848c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13c390900000000000000000e802000000000000|@9557,1023,@18441,I48,@100,@100|29,0,I48 114,0,@1294 209,0,@1294 315,0,@1294 375,0,@1294 454,0,@1294 480,0,@3002 496,0,@3000 552,0,@1294 622,0,@833 719,0,@1294 9557:S25|5349474e41545552455328292e7072696e7444657363283329 9558:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9553,2097151,@18442,@8000|18,0,@7998 9559:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9553,2097151,@18443,@8000|18,0,@7998 9560:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18445| 9561:S44|5349474e41545552455328292e73696756616c2836296c696e6b466c657869626c6554797065496473283229 9562:D5,200|483b65187303ff5548a8017558488b08ff710841514150ff35c30000004151415053ff70084c8d4c24204c8b01488b53604889d348b8688c19c9a37f00009090ff15a20000004883f801751e4c8b4c24184c8b442410488b5c2408584883c438e99bffffffe944000000ff304c8b4c24204c8b442418488b5c2410488b44240890e87affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c440c348c7c001000000c390900000000000000000c000000000000000|@3359,1048575,@18446,@9563,@8408|54,0,@8371 9563:D6,256|483b65187303ff55484989d248bbf89e1cc9a37f00009090ff15fa00000041ff7208ff35f8000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff153e0000004883c410c3900000000000000000f800000000000000|@9521,1048575,@18447,@100,@9564,@9377|14,0,@9519 82,0,@1294 186,0,@1294 9564:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18448,@8000|18,0,@7998 9565:D9,440|483b65187303ff55486a016a0148b928cd06c9a37f000053415041514152a801751fff70084889cb488b0090ff159e0100004889c158483b65187303ff5548ebdd488d442420488b11488910488d442420488b59084889580848bba8c21cc9a37f0000488b442420ff156a01000049c7c10100000049c7c00100000048bb509adc00000000009090ff15520100005048bb20c41cc9a37f0000488b4424309090ff154201000049c7c10100000049c7c00100000048bb509adc00000000009090ff152a0100005950f6c1017567f60101741348b8f8c41cc9a37f0000488b5d08909090ff13488b01488b10488b5808ff7108ff7210ff7208ff32f6c301754f488b03ff7308ff7010ff742438ff742478ff742460ff742460ff7424604c8b50084c8b084c8b442448488b5c2440488b442438eb05e928000000909090ff15b60000005b483b65187303ff5548ebac4883c41859483b65187303ff5548e967ffffff58a8017530ff7008ff7424404c8b5424104c8b4c24184c8b442420488b5c2428488b0090e876feffff58483b65187303ff5548ebcc48c7c0010000004883c430c20800909090900000000000000000b001000000000000|@9579,2097151,@18455,@9580,@1459,@9578,@1459,@9578,@9524|15,0,@440 91,0,@9566 126,0,I48 145,0,@9571 182,0,I48 212,0,@9574 9566:O1|@9567 9567:D3,72|488b08498d47e8483b45107303ff55404989c748c740f80200000048ba28c31cc9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@9570,7,@18450|29,0,@9568 9568:D3,48|483b65187303ff5548488b18488b420848ba9095dc0000000000ff229090909000000000000000002800000000000000|@9569,63,@18449|18,0,I29 9569:S62|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283229283129 9570:S59|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129736f72746564456e74726965732d283129 9571:O1|@9572 9572:D3,72|488b08498d47e8483b45107303ff55404989c748c740f80200000048baa0c41cc9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@9570,7,@18452|29,0,@9573 9573:D3,48|483b65187303ff5548488b18488b420848ba9095dc0000000000ff229090909000000000000000002800000000000000|@9569,63,@18451|18,0,I29 9574:O4|@20091,@1627,0,@9575 9575:O5|@9330,676,0,676,0 9576:S41|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329 9577:D5,224|483b65187303ff5548a801756d488b084d89cb4d89c44989dd4c8b70085148c7c35d000000488b01ff15ca000000415241534154504d89d94d89e04c89eb48c7c001000000909090ff15b2000000498d4fe0483b4d107303ff55404989cf48c741f803000000488941105848894108488b44241848890151eb05e9430000004c8b5424184c8b4c24104c8b4424084c89eb4c89f090e866ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c39090909090900000000000000000d800000000000000|@1363,8191,@18454,@100,@9405| 9578:D3,440|483b65187303ff5548a801755b488b08483b197458f6c3017558f601017553488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104889de488b394c8b51084c8b194889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741ceb45e900010000e9090000004c8b51084c8b19eb324c8b51084c8b19498d4fe8483b4d107303ff55404989cf48c741f8020000004c8941084c89114989c8488b4008e953ffffff41f6c001756e49837808017532498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004c89114989c84c89db488b4008e914ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c74108010000004c8911488d511848c742f8020000004c894a08eb05e9150000004c89024989d14989c84c89db488b4008e9c5feffff498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004c89114989c84c89db488b4008e993feffff41f6c001752b498378080175044c89c8c3498d47e8483b45107303ff55404989c748c740f8020000004c8948084c8900c34c89c8c39090909090900000000000000000b001000000000000|@9584,1023,@18459| 9579:S56|5349474e41545552455328292e73696756616c28362973747275637475726553686172696e67283329736861726553747275637473283129 9580:D5,120|483b65187303ff5548488b08488b5110498d77e0483b75107303ff55404989f748c746f80300000048bf80c91cc9a37f000048893e488b7a2048897e084c8b40104c894610488066ffbfff700856ff353c0000004989e0488b029090ff15360000004883c418c39000000000000000007000000000000000|@9583,1048575,@18457,@9582,@1532|42,0,@9581 9581:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18456,@1542| 9582:D9,496|483b65187303ff55485052f6c3017568488b03488b08483b0deb010000755e483b0dea010000741148b878e107c9a37f0000488b5d0890ff13488b14244c8b53084d8b184d8b60084c8b6810488b5c2408488b4210909090ff15ba01000048c7c35d000000909090ff15b2010000488b0c24498d5798eb0ae954010000e963000000483b55107303ff55404989d748c742f803000000488b590848895a10488942084c892a488d422048c740f80200000048895008488b542408488910488d701848c746f8020000004c896608488906488d461848c740f802000000488970084c8918eb69483b0d3c0100007565483b0d3b010000741248b878e107c9a37f0000488b5d089090ff13488b1424498d7798483b75107303ff55404989f748c746f803000000488b7a0848897e104c8b4a104c894e084c8b50104c89164c8d5e2049c743f80200000049897308eb0ae96a000000e93b000000488b7424084989334d8d631849c74424f8020000004d8b284d896c24084d891c24498d44241848c740f802000000498b4808488948084c8920eb26498d47e8483b45107303ff55404989c748c740f802000000498b480848894808498b104889104c8b53084989c04c89d3483b65187303ff5548e93afeffff4c89c04883c410c3909090909090900000000000000000e801000000000000|@1538,8191,@18458,@20058,@20058,@100,@100,@20047,@20047|42,0,@1486 249,0,@1486 9583:S40|5349474e41545552455328292e73696756616c28362973747275637473416e645479706573283229 9584:S54|5349474e41545552455328292e73696756616c2836296765744d617463686564456e7472696573283129676574457175616c73283429 9585:D4,48|483b65187303ff55484889c3488b420848ba482218c9a37f0000ff252800000000000000000000002800000000000000|@9445,2097151,@18460,@8025|18,0,@8021 9586:S34|5349474e41545552455328292e73696756616c283629747970654964456e76283129 9587:D23,3080|488dbc24d8feffff483b7d187303ff55504883380175716a016a016a016a016a016a014150505341524151488d4c242851ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b0000000ffb424b00000004c8b94240801000049c7c101000000eb05e9680000004c8b4010488b9c2410010000488b48084889c8488b5208ff12498d47c8483b45107303ff55404989c748c740f806000000488b4c245048894828488b4c244848894820488b4c244048894818488b4c243848894810488b4c243048894808488b4c2428488908eb6e48833805756d488b48086a016a016a016a016a016a01415050534152415152ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000ffb424c0000000eb0ae90d010000e923000000ffb424c00000004c8b114c8b49204c8b4110488b5918488b41089090e872feffffeb6d6a016a016a016a016a016a0141505053415241516a016a016a016a016a016a014889e151ffb424a8000000ffb424e8000000ffb424e8000000ffb424b8000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f0000000ffb424f00000004c8b942430010000eb05e96f0000004c8b8c24380100004c8b4018488b5810488b48084889c8909090ff15fe090000498d47c8483b45107303ff55404989c748c740f806000000488b4c242848894828488b4c242048894820488b4c241848894818488b4c241048894810488b4c240848894808594883c4284889086a014883c4086a016a016a016a016a016a016a016a016a016a016a016a016a0150ff7020488d5c2410488b084889c848ba00dd07c9a37f0000ff157a090000ffb42480000000ffb42420010000ffb42430010000ff3567090000498d47e8483b45107303ff55404989c748c740f802000000488b8c249000000048894808488b4c24704889084989e0488b9c24b8000000ff1532090000498d5fd8483b5d107303ff55404989df48c743f80400000048b908da1cc9a37f00004883c42048890b488b8c242001000048894b08488b94241801000048895310488bb4243001000048897318488063ffbf504989d0488b84248000000048bab8c019c9a37f00009090ff15ca080000488b0c24488b11488b5a10488b730848833e03750d488b7e08483b3db208000074656a016a0148833e01752750488b4618488b542420ff12488d4c2408488b5008488911488d4c2408488b581048895908eb164889e74c8b43084c89074889e74c8b4b104c894f0850488b44240848833801756a488b4818f6c101741df684242801000001eb05e9e0070000740c483b8c24280100007d07eb5fff5570ebeff6c1017414f684242801000001740a482b8c24280100007105ff5570ebf14883c1014889cf4889fb488b842420010000909090ff150208000048833803eb05e964000000754140f6c7017413f6400801740d483b78087e0ceb1ee949000000ff5570ebee488b480848b820651cc9a37f0000488b5d08ff13488b4808483b65187303ff5548eb9b488b104883fa0174184883fa07746f48b8b0af1cc9a37f0000488b5d089090ff13ffb424b0000000ff358e070000488b9c24c800000048b870dc1cc9a37f0000ff157e07000048bbc07c07c9a37f0000ff1576070000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101eb05e9a1010000741048b8f86f07c9a37f0000488b5d08ff13488b4424204989cc4c8b4010488b5808488b084889c890ff1522070000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888dc1cc9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8dc1cc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff134989c24c8b8c24080100004989e048c7c303000000488b8424480100009090ff15ba050000eb64488b44240848833801741248b810dd1cc9a37f0000488b5d089090ff13488b4018a8017414f684242801000001740a482b8424280100007105ff5570ebf14883c0014889c74889fb488b842420010000ff156a05000048833803754440f6c7017415eb05e9b5040000f64008017408483b78087e07eb1aff5570ebf3488b480848b820651cc9a37f0000488b5d0890ff13488b4008483b65187303ff5548eba248833807750e488b4808488b510848833a0174154889c148b888dd1cc9a37f0000488b5d089090ff13488b5a1048833b03750f488b7308488b364883fe017442eb0748837b08017439ff7218ff72205149b8e0dd1cc9a37f000048bb30de1cc9a37f0000488b44241848ba682108c9a37f000090ff15ae0400004883f8037554eb09ff7218ff722051eb49ff742418ffb42458010000ffb424200100004c8b9424e80000004c8b8c24e00000004c8b84248001000048bb80de1cc9a37f000048b8b0de1cc9a37f0000909090ff155e040000eb51488b4424184883380b7554488b4808488b9424c00000004883f90175184883fa01740948c7c101000000eb5a48c7c103000000eb51f6c2017545488b1948833b0d7533488b32488b7b08483b3e7527eb05e950030000488b72084889f2eb05e969000000488b71084889f1483b65187303ff5548eba148c7c101000000eb0748c7c1010000004883f901750948c7c101000000eb3f488b4818488b5110488b5a0848833b05750948c7c101000000eb24498d4ff0483b4d107303ff55404989cf48c741f801000000488911eb0748c7c1010000004883f901756848837c240801744650ffb42458010000ffb424200100004c8b9424e80000004c8b8c24e00000004c8b84248001000048bbd0de1cc9a37f000048b8f8de1cc9a37f0000909090ff153e030000eb6e498d4fe0483b4d107303ff55404989cf48c741f803000000eb05e9e900000048ba509adc000000000048895110488b9424b800000048895108488b9424d0000000488911498d57e0483b55107303ff55404989d748c742f80300000048894210488b8424c000000048894208eb05e90b02000048c70205000000498d47e0483b45107303ff55404989c748c740f803000000488948104889500848b908f206c9a37f0000488908488b4c2410f6c1017414f684244001000001740a482b8c24400100007105ff5570ebf14883c101498d57e8483b55107303ff55404989d748c742f8020000004889420848c702010000004989d04889cb488b84243801000090ff153e020000eb56488b01488b500848833a01755f488b5a18f6c3017416f684244001000001740c483b9c24400100007d31eb05ff5570ebef498d77e8483b75107303ff55404989f748c746f8020000004889460848c70601000000eb5ee91b010000f6c301741bf6842440010000017411eb05e97b000000482b9c24400100007105ff5570ebf14883c301ff314889df4889fb488b842440010000ff15aa01000048833803754440f6c7017413f6400801740d483b78087e0ceb21e930000000ff5570ebee488b480848b820651cc9a37f0000488b5d08909090ff13488b5808483b65187303ff5548eba24889c6eb2750eb24498d77e8483b75107303ff55404989f748c746f8020000004889460848c706010000005048833e0775224c8b8c24400100004c8b842448010000488b5c2408488b042490ff1516010000eb3a488b442418a8017414f684244801000001740a482b8424480100007105ff5570ebf14883c0014989f04889c3488b842440010000ff15e20000004883c4084883c4084883c4284883c410584881c4c0000000c26000909090909090900000000000000000000c000000000000|@9614,2097151,@18470,@9471,@1484,@9615,@8370,@8473,@20081,@3852,@9618,@100,@100,@9556,@9377,@3852,@1717,@9610,@9610,@3834,@3852,@9541,@3834|672,0,@1483 800,0,@9588 870,0,@8472 1151,0,@9423 1197,0,@9536 1236,0,@9592 1252,0,@1343 1315,0,@1294 1411,0,@833 1452,0,@9593 1493,0,@833 1553,0,@1317 1594,0,@9595 1673,0,@1294 1741,0,@9597 1858,0,@9423 1913,0,@9600 1970,0,@9602 1980,0,@9604 1995,0,@1632 2071,0,@9606 2081,0,@9607 2367,0,@9608 2377,0,@9609 2429,0,I48 2552,0,@661 2856,0,@9423 9588:D5,128|483b65187303ff5548488b4a18498d77e8483b75107303ff55404989f748c746f802000000488b796048897e084c8b49404c890e53ff7210ff7208ff355700000041504c8d4424084889c34889f09090ff154a000000488b0c24488b0048890148c7c0010000004883c428c39090909000000000000000007800000000000000|@8388,2097151,@18463,@9589,@8370| 9589:D5,232|483b65187303ff5548ff7208ff35ee000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4a184989e048c7c303000000488b42109090ff15360000004883c410c3900000000000000000e000000000000000|@9591,1048575,@18464,@9590,@9377|60,0,@1294 166,0,@1294 9590:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18465,@8000|18,0,@7998 9591:S28|5349474e41545552455328292e676976654572726f72283329283129 9592:S2|6060 9593:O2|3,@9594 9594:S24|2068617320616c7265616479206265656e2073657420746f 9595:O2|3,@9596 9596:S30|43616e6e6f74206170706c792074797065207265616c69736174696f6e2e 9597:O4|@20055,@557,@9599,@9598 9598:O5|@9330,937,0,937,0 9599:S12|736574576865726554797065 9600:O4|@20055,@557,@9599,@9601 9601:O5|@9330,935,0,935,0 9602:O1|@9603 9603:D3,24|48c7c005000000c300000000000000001000000000000000|@9420,1,@18466| 9604:O1|@9605 9605:D3,24|48c7c003000000c300000000000000001000000000000000|@9420,1,@18467| 9606:S25|646f6573206e6f74207065726d697420657175616c6974792e 9607:S16|697320616e2065717479706520627574 9608:S21|6973206e6f7420612073696d706c6520747970652e 9609:S17|6973206120646174617479706520627574 9610:D9,888|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0e21cc9a37f00004889114c894108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bee0e31cc9a37f00004889324c894208488062ffbf498d77e8483b75107303ff55404989f748c746f8020000004889560848890e4151ff35040300004989db4989f44989c54c89d348b870dc1cc9a37f00009090ff15ee02000048bbc07c07c9a37f0000ff15e6020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47e8483b45107303ff55404989c748c740f8020000004c89680848c70007000000a80174154889c248b8f86f07c9a37f0000488b5d089090ff134889ce4889c748c7c0010000009090ff15620200005657415349c7c2010000004d89e14989c048c7c3d1070000488b44244048ba40a507c9a37f0000909090ff153a020000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70107000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f8020000004889510848ba902b07c9a37f0000488911498d57d0483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f8020000004889500848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07307c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8dc1cc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff134989c24c8b4c24184989e048c7c303000000488b442420ff155a0000004883c410c2180090909000000000000000007003000000000000|@9621,2097151,@18474,@9620,@100,@100,@1323,@1416,@9377|35,0,@9611 81,0,@9613 154,0,@9592 172,0,@1343 228,0,@1294 289,0,@1294 357,0,@1415 420,0,@1294 490,0,@884 550,0,@833 623,0,@833 696,0,@1317 737,0,@9595 816,0,@1294 9611:D3,120|483b65187303ff5548488b5208488b5240909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@9612,1048575,@18468| 9612:S64|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e7453657428322974797065456e762d283129 9613:D3,120|483b65187303ff5548488b5208488b5260909090ff12a8017542498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b00488901498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c39090909000000000000000007000000000000000|@9612,1048575,@18469| 9614:S43|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729 9615:D6,256|483b65187303ff55484989d248bbf89e1cc9a37f00009090ff15fa00000041ff7208ff35f8000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13498b4218498b52104989ca4989c14989e048c7c3030000004889d0ff153e0000004883c410c3900000000000000000f800000000000000|@9617,1048575,@18471,@100,@9616,@9377|14,0,@9519 82,0,@1294 186,0,@1294 9616:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9492,2097151,@18472,@8000|18,0,@7998 9617:S59|5349474e41545552455328292e73696756616c2836297369676e61747572655768657265547970652837296c6f6f6b75704661696c757265283129 9618:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9619,2097151,@18473,@8000|18,0,@7998 9619:S46|5349474e41545552455328292e73696756616c2836297369676e6174757265576865726554797065283729283129 9620:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9622,2097151,@18475,@8000|18,0,@7998 9621:S53|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229 9622:S56|5349474e41545552455328292e73696756616c2836297369676e617475726557686572655479706528372963616e74536574283229283129 9623:O1|@9624 9624:D4,80|483b65187303ff554850f6c30175244c8b5308488b1b488b04249090ff15460000004989c04c89d3483b65187303ff5548ebd74c89c04883c408c3909090909000000000000000004800000000000000|@1538,1023,@18476,@9625| 9625:D9,392|488b03483b05960100007558483b0595010000741048b878e107c9a37f0000488b5d08ff13488b4b10488b511048833a01753a488b720840f6c60174064883c6027105ff5570ebf540f6c601740b41f6c0017405493bf0eb05ff5570ebf67e094889f0c3e9080000004c89c0c34c89c0c3483b0538010000755a483b0537010000741248b878e107c9a37f0000488b5d089090ff13488b4b10488b510848833a01753a488b720840f6c60174064883c6027105ff5570ebf540f6c601740b41f6c0017405493bf0eb05ff5570ebf67e094889f0c3e9080000004c89c0c34c89c0c3483b05d8000000755b483b05d7000000741248b878e107c9a37f0000488b5d089090ff13488b4b10488b5108f6c201755c488b32488b7e1048833f0175374c8b4f0841f6c10174064983c1027105ff5570ebf541f6c101741041f6c001740a4d3bc8eb0ae928000000ff5570ebf17f084d89c1eb034d89c14d89c84c8b4a084c89ca483b65187303ff5548eb9f4c89c0c34c89c0c3909000000000000000008001000000000000|@9626,255,@18477,@20043,@20043,@20058,@20058,@20047,@20047|23,0,@1486 133,0,@1486 245,0,@1486 9626:S44|434f5049455228292e6765744e65787452756e74696d654f66667365742831296765744f6666736574283329 9627:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@9628,1048575,@18478|73,0,36028797018963967 100,0,@560 9628:S36|5349474e41545552455328292e73696756616c2836296d617046756e6374696f6e283129 9629:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18479,@1542| 9630:D10,1512|483b65187303ff5548498b08f6c101740b41f6c1017405492bc97105ff5570ebf64883c101a8017508f6c1017503ff5570483bc1751948c7030100000048c743080100000048c7c001000000c210004889c153504889cf4889fb4c89d0909090ff159a05000048833803753c40f6c701740ef64008017408483b78087e07eb19ff5570ebf3488b480848b820651cc9a37f0000488b5d08ff13488b4808483b65187303ff5548ebac4889c248833a01756b488b4208488b4808488339057562498d5fe0483b5d107303ff55404989df48c743f80300000048be80f21cc9a37f00004889334c8953084c894b10488063ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf78f41cc9a37f000048893e48895e08eb0ae9b9010000e93c010000488066ffbf415241514150ff7010ff71084989f048bb50f61cc9a37f0000488b4110ff15ba040000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70105000000498d47e0483b45107303ff55404989c748c740f8030000005a488950104889480848b908f206c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000504989c8488b5c2420488b442418909090ff1532040000488b442420a80174064883c0027105ff5570ebf56a016a01ff742450ff7424504c8b5424384c8b4c24304c8b442428488d5c2410909090e8e6fdffff498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c2410488908488b4c24385a4883c4284889114889410848c7c0010000004883c410c21000488b1c24f6c30174064883c3027105ff5570ebf56a016a0150ff742438ff7424384889da488d5c24184889d0909090e86afdffff498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480859488908488b4c24185a4883c4084889114889410848c7c0010000004883c410c2100048833a07741148b8a0f61cc9a37f0000488b5d0890ff13488b4208488b480848833901741248b8a0f61cc9a37f0000488b5d089090ff13488b5810f64210017560488b7210f6460801755b40f6c601755a48837e08017505488b3eeb6a488b79204c8b59084c8b6110488b460890ff15ca0200004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b364889304d89cd4d89c6eb0fe968000000e963000000e92900000057ff7308ff33ff158a0200004889c74d89f04d89e9eb2cff7120ff7308ff334c8b61104c8b5908eb1a48bf509adc0000000000ff7120ff7308ff334c8b61104c8b59084d89cd4d89c64889fb48b810f71cc9a37f0000ff1542020000eb1a488b4310ff7120ff7308ff334c8b61104c8b59084d89c64d89cd488b4c2438488b094889caf6c20174064883c2027105ff5570ebf5488b5c2438488913488b542430488b124889d640f6c60174064883c6027105ff5570ebf5488b7c2430488937498d77e0483b75107303ff55404989f748c746f80300000048894610488b44240848894608584883c408488906498d47e8483b45107303ff55404989c748c740f8020000004889500848c7000100000049833c2403750b4d8b6424084d8b2424eb054d8b642408498d5780483b55107303ff55404989d748c742f8020000004c89620848c702010000004c8d421849c740f80500000041594d89482049894818498950104d89580849c70001000000498d483048c741f803000000488971104c894108488901488d412048c740f8020000004889480848c70001000000415241554156514989c0488b5c24204c89d0ff15f2000000488b442420a80174064883c0027105ff5570ebf56a016a01ff742450ff7424504c8b5424384c8b4c24304c8b442428488d5c2410909090e886faffff498d47d0483b45107303ff55404989c748c740f8020000005948894808488b4c2408488908488d501848c742f8020000005b48895a0848890a488b4c24284883c4204889014889510848c7c0010000004883c410c21000909090909090900000000000000000e005000000000000|@9651,2097151,@18486,@3852,@1390,@3834,@9650,@109,@100,@3834|139,0,@9423 217,0,@9631 267,0,@9636 316,0,@9643 409,0,@661 738,0,@9645 769,0,@9645 949,0,I48 984,0,@9648 9631:D4,272|483b65187303ff5548488b4808488339017565488b5918f6c301740ef64210017408483b5a107d0feb05ff5570ebf348c7c001000000c3f6c301740cf64210017406482b5a107105ff5570ebf54883c30152488b04244889df4889fb488b48084889c890ff15be00000048833803754440f6c7017415eb05e974000000f64008017408483b78087e07eb1aff5570ebf3488b480848b820651cc9a37f0000488b5d0890ff13488b5808483b65187303ff5548eb9e4889c148833901741048b8c0f31cc9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b49084883c408488908c348c7c001000000c39090909090909000000000000000000801000000000000|@9635,127,@18480,@3852|150,0,@9423 191,0,@9632 9632:O4|@20055,@557,@9634,@9633 9633:O5|@9330,1350,0,1350,0 9634:S21|6d61704964733a636f707954797065436f6e737472 9635:S40|5349474e41545552455328292e73696756616c2836296d6170496473283129636f70794964283129 9636:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b928f51cc9a37f000049b8c0f51cc9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@9642,2097151,@18483,@1554|28,0,@9637 38,0,@9640 9637:O1|@9638 9638:D3,24|c39090909090909000000000000000001000000000000000|@9639,1,@18481| 9639:S49|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129283129 9640:O1|@9641 9641:D3,24|c39090909090909000000000000000001000000000000000|@9639,1,@18482| 9642:S46|5349474e41545552455328292e73696756616c2836296d6170496473283129636f7069656445717569762d283129 9643:O1|@9644 9644:D3,24|c39090909090909000000000000000001000000000000000|@9642,1,@18484| 9645:O4|@20055,@557,@9647,@9646 9646:O5|@9330,1376,0,1376,0 9647:S6|6d6170496473 9648:S8|73686172696e6720 9649:S22|5349474e41545552455328292e73696756616c283629 9650:D3,120|483b65187303ff5548a8017551ff30488b40089090e8e6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c70059000000c348c7c001000000c3909000000000000000007000000000000000|@1585,3,@18487| 9651:S31|5349474e41545552455328292e73696756616c2836296d6170496473283129 9652:O10|0,0,0,0,0,0,0,0,0,0 9653:O1|@9654 9654:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18488,@375| 9655:D4,48|483b65187303ff55484889c3488b420848bae89418c9a37f0000ff252800000000000000000000002800000000000000|@9656,2097151,@18489,@8139|18,0,@8137 9656:S57|535452554354555245535f28292e73747275637456616c75652838296d61746368416374696f6e737c6d61746368526573756c74732d283129 9657:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@9658,1048575,@18490|73,0,36028797018963967 100,0,@560 9658:S42|535452554354555245535f28292e73747275637456616c7565283829725369672d6f6c644d6170283129 9659:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18491,@1542| 9660:D3,72|483b65187303ff5548488b4a18a801740ef64128017408483b41287d10eb05ff5570ebf3488b4a084889caff22488b4a104889caff22909000000000000000004000000000000000|@9661,1048575,@18492| 9661:S46|535452554354555245535f28292e73747275637456616c7565283829725369672d6d617463686564496473283129 9662:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18493,@1542| 9663:O1|@9664 9664:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18494,@375| 9665:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18495| 9666:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18496| 9667:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18497| 9668:D4,88|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252800000000000000000000005000000000000000|@9670,1048575,@18498,@9669| 9669:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18499| 9670:S40|535452554354555245535f28292e73747275637456616c75652838296c6f63616c456e762d283129 9671:O1|@9672 9672:D3,24|48c7c001000000c300000000000000001000000000000000|@9670,1,@18500| 9673:O1|@9674 9674:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18501,@375| 9675:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18502| 9676:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18503| 9677:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18504| 9678:D4,88|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c24488b49084883c4085048c7c001000000488b51489090ff124883f801750258c34889c358ff252800000000000000000000005000000000000000|@9680,1048575,@18505,@9679| 9679:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18506| 9680:S38|535452554354555245535f28292e73747275637456616c75652838296e6577456e762d283129 9681:O1|@9682 9682:D3,40|48b888021dc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9680,1,@18507|2,0,@9683 9683:O4|@20055,@557,@9685,@9684 9684:O5|@9315,1569,0,1569,0 9685:S21|46756e63746f7220696e2053747275637420456e64 9686:O1|@9687 9687:D3,40|48b868031dc9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@9680,1,@18508|2,0,@9688 9688:O4|@20055,@557,@9690,@9689 9689:O5|@9315,1568,0,1568,0 9690:S23|5369676e617475726520696e2053747275637420456e64 9691:O1|@9692 9692:D3,24|48c7c001000000c300000000000000001000000000000000|@9680,1,@18509| 9693:O1|@9694 9694:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18510,@375| 9695:D4,48|483b65187303ff55484889c3488b420848bae89418c9a37f0000ff252800000000000000000000002800000000000000|@9656,2097151,@18511,@8139|18,0,@8137 9696:D3,208|483b65187303ff5548a801740ef64230017408483b42307d0deb05ff5570ebf3488b5208ff22488b4a18a801740ef64128017408483b41287c59eb05ff5570ebf3a801740cf64128017406482b41287105ff5570ebf54883c001a801741c488b721048bbffffffffffffff0048235ef8488d5c1b01483bc372134889c348b8b0df06c9a37f0000488b5d08ff13488b4486fcc3488b5a28a801740ef64328017408483b43287c10eb05ff5570ebf3488b4a204889caff22488b5320ff229090900000000000000000c800000000000000|@9697,1048575,@18512|100,0,36028797018963967 127,0,@560 9697:S48|535452554354555245535f28292e73747275637456616c7565283829676574436f6d62696e6564547970654964283129 9698:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18513,@1542| 9699:S9|46756e63746f722028 9700:D5,232|483b65187303ff5548ff7208ff35ee000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff134989ca4c8b4a184989e048c7c303000000488b42109090ff15360000004883c410c3900000000000000000e000000000000000|@9884,1048575,@18579,@9883,@8232|60,0,@1294 166,0,@1294 9701:S28|535452554354555245535f28292e73747275637456616c7565283829 9702:D8,760|483b65187303ff55484883781001741d488b4828488b50204889c648b8480b1dc9a37f0000488b5d089090ff13488b4808483b0dd80200007432f6c10175394889ce48bf388819c9a37f000048c7c12700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b8e00b1dc9a37f0000eb24415141504152534c8b54244049c7c1010000004c8b4028488b582090ff157e020000eb0741514150415253488b0c24498d57d8483b55107303ff55404989d748c742f80400000048bb180c1dc9a37f000048891a488b5c244048895a08488b711048897210488b792848897a18488062ffbf504989d24989f14989f8488b59204889c890ff151e02000048c7c101000000488b5010f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017410f6402801740a488d49ff480348287105ff5570ebf1f6c101740cf64028017406482b48287105ff5570ebf54883c101f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0d6c0100007c1beb06f641ff1075134889c248b820f007c9a37f0000488b5d08ff134889caf6c20174064883c2027105ff5570ebf54889cb4889d14889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891f498d47e0483b45107303ff55404989c748c740f80300000048b9180d1dc9a37f000048890848897808488b4a2848894810488060ffbf498d5fe0483b5d107303ff55404989df48c743f80300000048be200e1dc9a37f000048893348897b0848894b10488063ffbf535052ff74243851574c8b5424484c8b4c244049b8509adc00000000004889d3488b44243090ff159e000000ff742430ff742440ff742468ff7424604c8b5424484c8b4c242849b8509adc0000000000488b5c2420488b442438ff1572000000488b4c24504883c4105a4883c4284889114889410848c7c001000000c220009090900000000000000000e802000000000000fdffffffffffff01|@9714,2097151,@18518,@8366,@9715,@9715,@9726,@9713|29,0,@9703 68,0,@8366 110,0,@9706 193,0,@9707 403,0,@1509 528,0,@9709 582,0,@9711 627,0,I48 678,0,I48 9703:O4|@20055,@557,@9705,@9704 9704:O5|@9315,1030,0,1030,0 9705:S48|43616e646964617465207374727563747572652077697468206e6f6e2d656d70747920626f756e64204944206c697374 9706:O6|@9319,@8366,0,0,@9473,0 9707:D3,152|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001488b5210f6c20174154889c148b8c0e406c9a37f0000488b5d089090ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbe90909000000000000000009000000000000000|@9708,1048575,@18515|77,0,@578 9708:S42|535452554354555245535f28292e6d61746368536967732837297461726765742d6e65774d6170283129 9709:D3,168|a801740ef64210017408483b42107d0feb05ff5570ebf348c7c001000000c3a801740cf64210017406482b42107105ff5570ebf54883c001a80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c134889c148b838e407c9a37f0000488b5d08ff13a80174064883c0027105ff5570ebf5488b5208488b4482fcc39090909090900000000000000000a000000000000000|@9710,7,@18516|107,0,@1493 9710:S39|535452554354555245535f28292e6d61746368536967732837296c6f6f6b757054797065283129 9711:D3,160|a801740cf64210017406482b42107105ff5570ebf54883c001a80174084883f8017d08eb22f640ff10751c488b4a08488b09a801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff13a80174064883c0027105ff5570ebf5488b5208488b4482fc4883f801750b48b8d08c19c9a37f0000c3488b00c390909090909000000000000000009800000000000000|@9712,7,@18517|76,0,@1493 125,0,@8375 9712:S39|535452554354555245535f28292e6d6174636853696773283729726573756c7454797065283129 9713:D9,280|488dbc2420ffffff483b7d187303ff5550488b4808483b0d140100007432f6c10175374889ce48bf388819c9a37f000048c7c12700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750a48c7c001000000c22000ff7424084150ff742420ff742430ff7424404152415150ff35c100000041504152415150534c8d442428488b0b48c7c3010000004889c8909090ff15a6000000ff742418ffb42488000000ff359d000000488b4c2418ff742438ffb424a8000000ffb424b8000000488d54241852ffb424b8000000ff742458ff742458ffb424c8000000ff742460ff35680000004989e04889c3488b01909090ff155e0000004881c4d8000000c220009090909000000000000000001001000000000000|@9780,1048575,@18542,@8366,@9781,@1532,@9821,@9779,@1532|40,0,@8366 9714:S26|535452554354555245535f28292e6d6174636853696773283729 9715:D6,960|483b65187303ff554841504152ff70184151ff700853ff30ff750848b8d2111dc9a37f00005048896508498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048c7c1170000004889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bec0141dc9a37f0000488931498d77d8483b75107303ff55404989f748c746f804000000488946184889561048894e0848c706030000004883c4085848894508eb6c488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff15920200004889c348b8489319c9a37f000090ff1586020000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff13498d47e8483b45107303ff55404989c748c740f80200000048b928151dc9a37f000048890848897008488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38171dc9a37f000048891148897108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bf18191dc9a37f000048893a48897208488062ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000048894f10488947084889175641526a0149ba509adc000000000049c7c1010000004989d84889fb488b44241890ff1556010000488b042448833803756a488b4808488b09488b4018488b00488b104883fa01750c48b8909adc0000000000eb6f4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f84889c7eb05e9540000004889d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9030000004889d9498d57e0483b55107303ff55404989d748c742f8030000004889421048894a0848c70201000000eb034889c2498d47c8483b45107303ff55404989c748c740f806000000488b4c24384883c41848894828488b4c241848894820488b4c241048894818488b4c240848894810594883c42048894808488910c3900000000000000000b803000000000000|@9725,2097151,@18526,@194,@100,@8412|29,0,$9715+274 209,0,@9716 310,0,@193 331,0,@8394 372,0,@8395 402,0,@557 416,0,@20055 471,0,@9718 517,0,@9721 563,0,@9723 625,0,I48 693,0,I49 9716:O1|@9717 9717:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18519,@375| 9718:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048be18b419f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@9720,2097151,@18520,@1490,@9719,@1504|59,0,@20047 9719:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@18521,@20047| 9720:S32|434f5049455228292e7265706c6163654d6170283529747376456e762d283129 9721:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048bec8b419f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@9720,2097151,@18522,@1490,@9722,@1504|59,0,@20058 9722:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@18523,@20058| 9723:D6,200|483b65187303ff5548498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411801000000488b58084889591048c741088b00000048bed8b319f1a37f0000488931ff305251488b5c2410488b420890ff15860000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff1552000000488b4c24084883c4084989c04883c4085b488b4108ff253f000000909090909090900000000000000000c000000000000000|@9720,2097151,@18524,@1490,@9724,@1504|59,0,@20043 9724:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@18525,@20043| 9725:S22|434f5049455228292e7265706c6163654d6170283529 9726:D6,152|483b65187303ff5548488b4808483b0d9c0000007432f6c10175374889ce48bf388819c9a37f000048c7c12700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750a48c7c001000000c21800ff742408ff7424184150ff7424304152504151ff354d0000004989e0488b0348c7c301000000ff15420000004883c440c2180090909000000000000000009000000000000000|@9729,1048575,@18527,@8366,@9727,@1532|32,0,@8366 9727:D4,120|483b65187303ff55485052f6c3017549488b0424ff7308ff7018ff7020ff7028ff7030ff703848b9a01c1dc9a37f0000514c8b50104c8b4808488b1b488b442440909090ff15460000004989c05b483b65187303ff5548ebb24c89c04883c410c39090909090909000000000000000007000000000000000|@1538,1048575,@18534,@9730|40,0,@9728 9728:O1|@9726 9729:S39|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329 9730:D23,1448|483b65187303ff5548488b0b483b0dad0500007560483b0dac05000074134889c248b878e107c9a37f0000488b5d08ff13488b53104151ff3593050000415152ff32ff72084889c3498b0290ff1586050000a8017558488b00a8017556488b08488b11483b1576050000754c483b1575050000eb05e987030000741148b878e107c9a37f0000488b5d0890ff13498d5ff0483b5d107303ff55404989df48c743f801000000488b7110488933eb2ce920000000e912000000488b58084889d8483b65187303ff5548eb8f48c7c301000000eb0748c7c3010000004883fb01752dff7424504c8b5424604c8b4c24684c8b442420488d5c2428488b442418909090ff15ea0400004883c430c23000488b03488b4c2408488b5110488b720848833e03750d488b7e08483b3dca040000746348833e017562488b384c8b461841f6c0017410f64424480174094c3b4424487d07eb5bff5570ebf241f6c001740ef64424480174074c2b4424487105ff5570ebf44983c0014d8d4ff04c3b4d107303ff55404d89cf49c741f8010000004c8b5710eb0ae95b020000e96f0000004d891141f6c001740d4983f8017d0eeb2ce95900000041f640ff1075204c8b5c24404d8b1b41f6c001740b41f6c30174054d3bc3eb05ff5570ebf67c174c8b580848b810f407c9a37f0000488b5d08909090ff1341f6c00174064983c0027105ff5570ebf54c8b5c24404f894c83fc48833e037506488b7e10eb3d48833e017506488b7e08eb3148c7c7010000004c8b460841f6c001752040f6c70174064883c7027105ff5570ebf54d8b4008483b65187303ff5548ebda4c8b004d8b48104d8b510849833a0375064d8b5a10eb3e49833a0175064d8b5a08eb3249c7c3010000004d8b620841f6c401752141f6c30174064983c3027105ff5570ebf54d8b642408483b65187303ff5548ebd940f6c701750941f6c3017503ff5570493bfb7433ff742460ff742460ff7424604c8b5424304c8d4c243849b858231dc9a37f0000488b5c242890ff15160300004883c430c23000f6042401753af64008017434ff742460ff742460ff7424604c8b5424304c8d4c243849b8b0231dc9a37f0000488b5c24289090ff15de0200004883c430c2300048833e05745b48833e05751048b8807107c9a37f0000488b5d08ff1348833e017522488b7e1048833f03750f4c8b5f084d8b1b4983fb01743ceb1648837f0801750feb31488b7e08488b3f4883ff017424504c89c048ba00241dc9a37f0000eb05e91200000090ff15720200004883f8017541eb0650eb3c50eb39ff742468ff742468ff7424684c8b5424384c8d4c244049b8d0271dc9a37f0000488b5c2430488b4424189090ff153a0200004883c438c2300048c7c0010000004883c438c2300048c7c0010000004883c430c23000488b13483b15150200007560483b151402000074134889c648b878e107c9a37f0000488b5d08ff13415150ff73104889c3498b02909090ff15f2010000a8017558488b00a8017556488b08488b11483b15e2010000754c483b15e1010000741848b878e107c9a37f0000eb05e918010000488b5d0890ff13498d5ff0483b5d107303ff55404989df48c743f801000000488b7110488933eb2ce920000000e912000000488b58084889d8483b65187303ff5548eb8f48c7c301000000eb0748c7c3010000004883fb01753d488b442448488b4c2440488b54243848895424484989ca4989c14c8b44241048bb28281dc9a37f0000488b04244883c4185e4883c42856ff253f010000488b1b488b04244c8b50104c8b5b10488b5c2408488b4424389090ff152601000048c7c35d000000909090ff151e010000488b4c2420488b542448488b5c2440488b742430488b7c242848895c2448488974244048897c24384d89d04989d24c8b4c24104d89c44989c04c89e34c89d84889ca4883c418415b4883c4184153ff2248c7c001000000c23000909090900000000000000000a005000000000000|@9765,1048575,@18535,@20047,@20047,@9766,@1490,@20047,@20047,@9750,@20081,@9776,@9776,@9736,@9776,@20058,@20058,@1490,@20058,@20058,@9750,@100,@100|35,0,@1486 126,0,@1486 480,0,@1517 726,0,@9731 789,0,@9733 831,0,@1305 904,0,@9735 964,0,@9745 1051,0,@1486 1123,0,@1486 1261,0,@9747 9731:O2|3,@9732 9732:S47|54797065732074616b6520646966666572656e74206e756d62657273206f66207479706520617267756d656e74732e 9733:O2|3,@9734 9734:S35|5479706520696e20737472756374757265206973206e6f742061206461746174797065 9735:O2|@9736,@1632 9736:D5,352|483b65187303ff5548488b4810488b590848833b05756d48833b037506488b7310eb3d48833b017506488b7308eb3148c7c601000000488b7b0840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda5250ff3048bbb0251dc9a37f00004889f0909090ff15fe0000009090ff15fe000000eb05e980000000498d4fd0483b4d107303ff55404989cf48c741f80500000048c7412001000000488b542408488951185a4883c408488951104889410848c7010b000000488b042449b848261dc9a37f000048bb98261dc9a37f0000488b50084889c8909090ff124883f803740948c7c001000000eb0748c7c0030000004883f0024883c408c348833b05751248b8807107c9a37f0000488b5d089090ff1348833b01751a488b531048833a03750b488b7208488b364889f0c3488b4208c3488b5308488b124889d0c39090909000000000000000005801000000000000|@9744,1048575,@18531,@1354,@9743|102,0,@9737 204,0,@9739 214,0,@9741 273,0,@1305 9737:O1|@9738 9738:D3,96|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f1700200488908c300000000000000005800000000000000|@1312,3,@18528|30,0,@573 9739:O1|@9740 9740:D3,24|48c7c005000000c300000000000000001000000000000000|@9420,1,@18529| 9741:O1|@9742 9742:D3,24|48c7c003000000c300000000000000001000000000000000|@9420,1,@18530| 9743:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@18532| 9744:S30|545950455f5452454528292e7065726d697473457175616c697479283129 9745:O2|3,@9746 9746:S41|5479706520696e20737472756374757265206973206e6f7420616e20657175616c6974792074797065 9747:O1|@9748 9748:D3,272|498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848c70107000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b878ec08c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e0c908c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c3909000000000000000000801000000000000|@9749,3,@18533|45,0,@1294 114,0,@2141 155,0,@2100 237,0,@1294 9749:S61|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c6179537472756374757265283129 9750:D7,680|483b65187303ff5548488b4c2408483b0dab0200007432f6c10175364889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750948c7c15d000000eb334d89cb4d89c44989c54989de488b5c240848b8b02c1dc9a37f0000909090ff15520200004889c14c89e84c89f34d89e04d89d94d89cb4d89c44989c54989de4889cb48b8d82c1dc9a37f00009090ff152a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13415241534154514c89e84c89f29090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102d1dc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048ba482d1dc9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134989c24c8b4c24104c8b44240848c7c303000000584883c410594883c40851ff254200000090900000000000000000a002000000000000|@9778,1048575,@18541,I48,@100,@100,@8232|33,0,I48 101,0,@9751 150,0,@9752 208,0,@1294 295,0,@833 336,0,@9753 415,0,@1294 455,0,@9755 500,0,@833 611,0,@1294 9751:S18|20696e207375622d73747275637475726520 9752:S34|53747275637475726520646f6573206e6f74206d61746368207369676e6174757265 9753:O2|3,@9754 9754:S10|5369676e61747572653a 9755:O2|@833,@9756 9756:O2|@9757,0 9757:O5|0,3,0,0,@9758 9758:O2|@9760,@9759 9759:O2|@833,@9762 9760:O2|3,@9761 9761:S10|5374727563747572653a 9762:O2|@9763,0 9763:O2|3,@9764 9764:S11|4e6f742070726573656e74 9765:S42|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329 9766:D5,80|483b65187303ff55484889c6488b4208ff155200000049c7c10100000049b8282f1dc9a37f00004889c34889f048ba886507c9a37f0000ff253300000090909000000000000000004800000000000000|@9774,2097151,@18538,@9773,@1293|31,0,@9767 47,0,@1291 9767:O2|@9769,@9768 9768:O1|@9772 9769:O1|@9770 9770:D3,24|48c7c001000000c300000000000000001000000000000000|@9771,1,@18536| 9771:S58|535452554354555245535f28292e6d61746368536967732837296d617463684e616d65732833292833297072696e7454797065456e762d283129 9772:D3,24|48c7c001000000c300000000000000001000000000000000|@9771,1,@18537| 9773:D7,296|488b4068a801753e488b08488b11483b152b010000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01756948b898c809c9a37f0000a801753e488b08488b11483b15da000000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01751948b8c0cf09c9a37f0000488b5d08eb05e92c0000009090ff13488b03488b08483b0d7e000000741148b878e107c9a37f0000488b5d0890ff13488b48104889c8c3488b03488b08483b0d5e000000741148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000002001000000000000|@9775,15,@18539,@20131,@20131,@20131,@20131|85,0,@2635 174,0,@2690 214,0,@1486 254,0,@1486 9774:S56|535452554354555245535f28292e6d61746368536967732837296d617463684e616d6573283329283329646973706c617954797065283129 9775:S27|535452554354555245535f28292e6572726f724465707468283129 9776:D7,1208|483b65187303ff5548488b4c2408483b0dbb0400007432f6c10175364889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750948c7c15d000000eb334d89c34989c44d89cd4989de488b5c240848b8b02c1dc9a37f0000909090ff15620400004889c14c89e04c89f34d89d84d89e94d89c34989c44d89cd4989de4889cb48b8d82c1dc9a37f00009090ff153a040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134152514153415441554c89f04c89eaff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102d1dc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff1350488b442410488b542408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82d1dc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080700000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b542418488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b9781b07c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848bad85d19c9a37f0000488911498d57d0483b55107303ff55404989d748c742f80500000048894a2048c742180100000048c742100100000048c742080700000048c70201000000f6c20174164889c148b8f86f07c9a37f0000488b5d08909090ff13498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488911488d511848c742f80200000048894a0848b9781b07c9a37f000048890a498d4fd0483b4d107303ff55404989cf48c741f80200000048895108488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080700000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13488b4c2420488b5424184989c24989d14989c848c7c303000000585e4883c41856ff25400000000000000000000000b004000000000000|@9777,1048575,@18540,I48,@100,@100,@8232|33,0,I48 101,0,@9751 150,0,@9752 208,0,@1294 295,0,@833 336,0,@9753 415,0,@1294 495,0,@833 536,0,@9760 615,0,@1294 699,0,@833 740,0,@8326 820,0,@1294 890,0,@833 950,0,@833 1027,0,@833 1138,0,@1294 9777:S34|535452554354555245535f28292e7369675374727563744d617463684d7367283829 9778:S36|535452554354555245535f28292e7369675374727563744d697373696e674d7367283629 9779:D4,112|483b65187303ff55485052f6c3017541488b0424ff7308ff7018ff7020ff7028ff7030ff7038ff7040ff70484c8b50104c8b4808488b1b488b442448ff15460000004989c05b483b65187303ff5548ebba4c89c04883c410c39090909090909000000000000000006800000000000000|@1538,2097151,@18562,@9824| 9780:S38|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329 9781:D4,120|483b65187303ff55485052f6c3017549488b0424ff7308ff7018ff7020ff7028ff7030ff703848b908391dc9a37f000051ff70404c8b50104c8b4808488b1b488b442448ff15460000004989c05b483b65187303ff5548ebb24c89c04883c410c39090909090909000000000000000007000000000000000|@1538,2097151,@18543,@9783|40,0,@9782 9782:O1|@9713 9783:D16,928|483b65187303ff5548488b0b483b0da50300007560483b0da403000074134889c248b878e107c9a37f0000488b5d08ff134150ff731041524889c3498b019090ff1582030000a8017558488b00a8017556488b08488b11483b1572030000754c483b1571030000741848b878e107c9a37f0000eb05e958010000488b5d0890ff13498d5ff0483b5d107303ff55404989df48c743f801000000488b7110488933eb2ce920000000e912000000488b58084889d8483b65187303ff5548eb8f48c7c301000000eb0748c7c3010000004883fb0175084883c41058c23800ff33ff742448ff742448ff7424484c8b5424684c8b4c24704c8b442420488b5c2428488b44241890ff15d602000058488b4c2408488b4008488b4908488b542410a8017565f6c1017565488b18488b31488b7e1048833f01755a4d8d47a84c3b45107303ff55404d89c749c740f804000000498958184c8b4b184d89481049c740080500000049c700050000004d8d502849c742f8020000004d8942084c8b47084d89024d8d5a18eb0fe93d000000e938000000e91100000049c743f802000000498953084d8913eb034989d34c89da4c8b41084c89c1488b58084889d8483b65187303ff5548e955ffffff4889d04883c418c23800488b13483b150c0200007559483b150b02000074164889c648b878e107c9a37f0000488b5d08909090ff134150415250ff73104889c3498b0190ff15e6010000a8017558488b00a8017556488b08488b11483b15d6010000754c483b15d50100007418eb05e94901000048b878e107c9a37f0000488b5d0890ff13498d5ff0483b5d107303ff55404989df48c743f801000000488b7110488933eb2ce920000000e912000000488b58084889d8483b65187303ff5548eb8f48c7c301000000eb0748c7c3010000004883fb0175084883c41858c23800488b03488b0c244989c24c8b59104c8b6010488b5c2408488b442438ff154601000048c7c35d000000909090ff153e0100004152ff742458ff742458ff742458ff7424484c8b9424800000004c8b4c24384989c04c89db4c89e0488b54245890ff12488b4c2408488b510848833a017564498d5fb0483b5d107303ff55404989df48c743f803000000488b3424488973104889430848c70301000000488d432048c740f80200000048895808488b5a084889184889c6488d401848c740f802000000488b7c2420488978084889304883c428c238004883c42058c238004c89c0c23800909090909000000000000000009803000000000000|@9789,2097151,@18545,@20047,@20047,@1490,@20047,@20047,@9784,@20058,@20058,@1490,@20058,@20058,@100,@100|35,0,@1486 107,0,@1486 492,0,@1486 574,0,@1486 9784:D9,848|483b65187303ff5548488b08488b13488b7210488b7e0848833f0375064c8b5f10eb3e48833f0175064c8b5f08eb3249c7c3010000004c8b670841f6c401752141f6c30174064983c3027105ff5570ebf54d8b642408483b65187303ff5548ebd9ff31ff730841514152ff70085350415052ff325148bbf0401dc9a37f00004c89d89090ff15de020000ff742440ff35dc020000488b4c2410488b5110488b5a0848833b037506488b7310eb3d48833b017506488b7308eb3148c7c601000000488b7b0840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda488b7c24204c8b47104d8b48084983390375064d8b5110eb3d4983390175064d8b5108eb3149c7c2010000004d8b590841f6c301752041f6c20174064983c2027105ff5570ebf54d8b5b08483b65187303ff5548ebda40f6c601750941f6c2017503ff5570493bf2740e48c7c0010000004883c468c21800498d77a0483b75107303ff55404989f748c746f80500000048c746200100000048894e184c8b5424604c8956104889460848c7060b0000004c8d5e3049c743f80500000049c743200100000049897b184c8b6424184d8963104989430849c7030b0000004c8b4c24504c8b4424284c89db4889f09090ff159a010000488338037565f644245801740e48c7c0010000004883c468c2180048c7c001000000488b4c2440f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdd48c7c101000000488b542458f6c2017526f6c10174064883c102710cff5570eb05e97e000000ebee488b5208483b65187303ff5548ebd5a801740af6c1017405483bc1eb05ff5570ebf67f0e48c7c0010000004883c468c21800488b442440a8017533ff7008ffb424880000004c8b5424584c8b4c24604c8b442470488b5c2468488b00ff15ce00000058483b65187303ff5548ebc948c7c0010000004883c468c21800488b700849b9d0411dc9a37f00004c8b4424784c89c3488b44245048bae84e19c9a37f0000909090ff158e0000004889c14889f04889ca90ff12ff742448ffb42488000000ffb424800000004c8b5424684c8d4c24184989c0488b5c2450488b44244890ff155a0000004883c468c2180090909000000000000000004803000000000000|@9795,2097151,@18546,@1354,@9796,@9804,@9790,@8310,@9776|119,0,@9785 722,0,@9788 745,0,@8309 9785:O1|@9786 9786:D3,104|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d000000c300000000000000006000000000000000|@9787,3,@18544|30,0,@573 9787:S42|535452554354555245535f28292e636865636b54797065436f6e7374727328382974766172732d283129 9788:S5|6d61746368 9789:S56|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d6174636853747275637475726573283329 9790:D5,528|483b65187303ff5548f6c301755e488b0b488b11483b10744af6c2017553f60001754e488b3840f6c701740948c7c603000000eb08488b37488d7436014883c6104989f34889d64c89d948d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750e48c7c103000000eb1be90f000000488b5b08483b65187303ff5548eb8948c7c1010000004883f901740a48c7c001000000c20800498d4fe8483b4d107303ff55404989cf48c741f80200000048ba78441dc9a37f000048895108488b00488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d8441dc9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8901488d411848c740f8020000004889480848b9f8441dc9a37f00004889084d89cb90ff15f6000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47b8483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8050000004889412048c741180100000048c741100100000048c741080100000048c70101000000f6c101741148b8f86f07c9a37f0000488b5d0890ff13488b4424084c89d24989ca4989c14989d048c7c3030000004c89d8594883c40851ff25340000009090909000000000000000000802000000000000|@9820,1048575,@18557,@109,@8232|177,0,@9791 225,0,@9793 285,0,@9794 348,0,@1294 454,0,@1294 9791:O2|@9792,0 9792:S55|207761732070726573656e7420696e207468652073747275637475726520627574206e6f7420696e20746865207369676e61747572652e 9793:S14|3a20636f6e7374727563746f7220 9794:S30|4572726f72207768696c65206d61746368696e6720646174617479706520 9795:S33|535452554354555245535f28292e636865636b54797065436f6e73747273283829 9796:D5,80|483b65187303ff55484889c6488b4208ff155200000049c7c10100000049b8e8451dc9a37f00004889c34889f048ba886507c9a37f0000ff253300000090909000000000000000004800000000000000|@9803,2097151,@18549,@9773,@1293|31,0,@9797 47,0,@1291 9797:O2|@9799,@9798 9798:O1|@9802 9799:O1|@9800 9800:D3,24|48c7c001000000c300000000000000001000000000000000|@9801,1,@18547| 9801:S49|535452554354555245535f28292e636865636b54797065436f6e737472732838297072696e7454797065456e762d283129 9802:D3,24|48c7c001000000c300000000000000001000000000000000|@9801,1,@18548| 9803:S52|535452554354555245535f28292e636865636b54797065436f6e737472732838296572726f72496e44617461747970652d283129 9804:D7,312|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bab0481dc9a37f00004889114c894108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048be48491dc9a37f000048893248894a08488062ffbf504989d04889d948bb184b1dc9a37f00004889c8909090ff15ce0000006a016a01504c8d44240848bba84b1dc9a37f0000488b44241890ff15b6000000488b44241090ff15b2000000488b1c24488b44240848bab06507c9a37f0000909090ff159e000000a801752b488b08498d47e8483b45107303ff55404989c748c740f8020000004889480848c700010000004883c420c3498d47e8483b45107303ff55404989c748c740f802000000488b0c244889480848c700030000004883c420c390909000000000000000003001000000000000|@9819,2097151,@18556,@1390,@1382,@8195,@1633|35,0,@9805 81,0,@9807 110,0,@9814 142,0,@9817 185,0,@1292 9805:D3,56|483b65187303ff5548488b480848833901750a488b4118488b5208ff2248c7c001000000c390909000000000000000003000000000000000|@9806,1048575,@18550| 9806:S36|535452554354555245535f28292e6d617463685479706573283429636f70794964283129 9807:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9f8491dc9a37f000049b8884a1dc9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@9813,2097151,@18553,@1554|28,0,@9808 38,0,@9811 9808:O1|@9809 9809:D3,24|c39090909090909000000000000000001000000000000000|@9810,1,@18551| 9810:S48|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129283129 9811:O1|@9812 9812:D3,24|c39090909090909000000000000000001000000000000000|@9810,1,@18552| 9813:S45|535452554354555245535f28292e6d617463685479706573283429636f70794154797065436f6e737472283129 9814:O1|@9815 9815:D3,24|c39090909090909000000000000000001000000000000000|@9816,1,@18554| 9816:S43|535452554354555245535f28292e6d617463685479706573283429636f7079546172676574283129283129 9817:O1|@9818 9818:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@18555| 9819:S27|535452554354555245535f28292e6d617463685479706573283429 9820:S48|535452554354555245535f28292e636865636b54797065436f6e73747273283829636865636b436f6e73747273283129 9821:D13,1808|483b65187303ff5548488b4820f6c1017538488b1948833b01751d498d77f0483b75107303ff55404989f748c746f80100000048891eeb19488b59084889d9483b65187303ff5548ebc348c7c60100000040f6c6017568488b0e488339017564498d5fe8483b5d107303ff55404989df48c743f802000000488b790848897b0848c70301000000f6c30174194c8b40184989c148b8f86f07c9a37f0000488b5d089090ff134d8d47e84c3b45107303ff55404d89c749c740f802000000eb0ae912000000e90d00000049c7400801000000498918eb0749c7c001000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b184889590848c70107000000f6c1017419488b58184889c648b8f86f07c9a37f0000488b5d089090ff13498d77b8483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f805000000488971204c89411848c741100100000048c741080100000048c70101000000f6c1017419488b58184889c648b8f86f07c9a37f0000488b5d089090ff13488378080175665152488b58184889d8909090ff1582050000488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c101000000f6c101756f488b0424488b31488b48104889c890ff15420500004889c748c7c001000000eb05e99b01000090ff1532050000488b0c2449c7c2010000004c8b49084989c04889fb4889f048ba40a507c9a37f0000ff1512050000498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e97c00000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8688e07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998ec08c9a37f0000488908eb0748c7c001000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084883c40858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b840ec08c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c3f640080175744889ce4889d74c8b4018488b47109090ff15920300004989c148c7c001000000ff158a0300005649c7c2010000004c89c94c8b4f084c89c24989c04889cb4889d048ba40a507c9a37f000090ff1566030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000eb05e939010000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f0531dc9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13c34889ce4889d74c8b4018488b4710ff15fa0100004989c148c7c001000000ff15f20100005649c7c2010000004c89c94c8b4f084c89c24989c04889cb4889d048ba40a507c9a37f000090ff15ce010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c8c908c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9902b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c86818c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174144889c148b8f86f07c9a37f0000488b5d0890ff13c390909090909000000000000000000807000000000000|@9823,2097151,@18558,@1401,@9773,@1323,@1416,@9773,@1323,@1416,@9773,@1323,@1416|149,0,@1294 273,0,@1294 381,0,@1294 544,0,@1415 618,0,@2141 659,0,@1378 700,0,@2142 786,0,@2141 827,0,@2139 906,0,@1294 995,0,@1415 1070,0,@833 1111,0,@2099 1152,0,@884 1225,0,@2141 1266,0,@9822 1345,0,@1294 1427,0,@1415 1495,0,@833 1536,0,@2099 1577,0,@884 1650,0,@2141 1691,0,@8073 1770,0,@1294 9822:O2|3,@2138 9823:S53|535452554354555245535f28292e6d61746368536967732837296d6174636856616c73283329646973706c617956616c7565283129 9824:D15,1048|483b65187303ff5548488b0b483b0d1d0400007560483b0d1c04000074134889c248b878e107c9a37f0000488b5d08ff13488b5310415052ff7210ff7218ff720841524889c3498b01909090ff15ee030000a8017558488b00a8017556488b08488b11483b15de030000754c483b15dd030000eb05e984030000741148b878e107c9a37f0000488b5d0890ff13498d5ff0483b5d107303ff55404989df48c743f801000000488b7110488933eb2ce920000000e912000000488b58084889d8483b65187303ff5548eb8f48c7c301000000eb0748c7c301000000f6c301756a488b03498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048bef0581dc9a37f0000488932488b342448897208488062ffbf48891148837c24080175264883780801eb05e984020000740c48b9685f1dc9a37f0000eb5648b9804c07c9a37f0000eb4ff644240801751ef6400801740c48b9c85f1dc9a37f0000eb4548b9804c07c9a37f0000eb394883780801750c48b968d606c9a37f0000eb26f6400801741648b9804c07c9a37f0000eb14e90f000000e90a00000048b928cd06c9a37f000048833901756850ff71084c8b4c24704c8b442478488b5c2420488b48184889c89090ff156a020000488338017570488b700849b9d0411dc9a37f00004c8b4424684c89c3488b44247048bae84e19c9a37f0000909090ff153e0200004889c14889f04889ca90ff12ff742458eb05e96a010000ff742458ff7424584c8b9424880000004c8b4c24784989c0488b5c2448488b44242090ff1506020000eb05e9080000004883c43858c23800488b4c2408f64128017512488b5128488b1a488b730848c70603000000f64130017567488b51306a016a01ff7008ff324c8d44241048bb28601dc9a37f0000488b442408909090ff15b2010000488b44241890ff15ae010000488b0424488b00498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b44241048890158488908eb076a016a01ff7008488b442440488338017568498d4fd8483b4d107303ff55404989cf48c741f804000000488b54242048895118488b142448895110488b5424184889510848c70105000000498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4008488902498d47e8483b4510730aeb05e921000000ff55404989c748c740f802000000488b4c2450488948084889104883c458c238004883c45058c23800ff742448ff742448ff7424484c8b5424784c8b4c24684c8b4108488b5c24389090ff15b60000004883c42858c23800ff7424384c8b5424484c8b4c24504c8b442468488b5c2458488b44242890ff15920000004883c42858c238004c89c0c238009090909000000000000000001004000000000000|@9848,2097151,@18563,@20043,@20043,@1490,@20043,@20043,@9804,@8310,@9776,@1382,@8195,@9776,@9750|35,0,@1486 126,0,@1486 287,0,@9825 338,0,@9840 350,0,@1128 375,0,@9843 387,0,@1128 406,0,@508 424,0,@1128 446,0,@440 506,0,@9788 529,0,@8309 680,0,@9846 9825:D3,1160|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017561f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b4b0848890e488b5208488b124889f0909090ff12488338017555f64020017554488b4820f6410801755f488b1148833a07eb05e9a9010000751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a05d1dc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5008f6c20174084883fa037d13eb06f642ff10740b48b8707907c9a37f0000c3488b30f6c20174064883ea027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895708488b560848891749b888c119f1a37f00004d8b004889f84c89c29090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d05e1dc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000008004000000000000|@9839,1048575,@18560|34,0,@1326 221,0,@883 290,0,@884 331,0,@835 464,0,@833 505,0,@9826 604,0,@1326 669,0,@20182 774,0,@883 853,0,@884 894,0,@835 1027,0,@833 1068,0,@9835 9826:O5|0,0,0,@9828,@9827 9827:O2|@9831,0 9828:O2|@9829,0 9829:O2|0,@9830 9830:O5|@9315,1261,1261,0,0 9831:O2|3,@9832 9832:S4|49734f4b 9833:O1|@9834 9834:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18559|2,0,@388 9835:O5|0,0,0,@9828,@9836 9836:O2|@9837,0 9837:O2|3,@9838 9838:S7|497357726f6e67 9839:S15|7072696e742d6d6174636854797065 9840:O2|1,@9841 9841:O2|3,@9842 9842:S25|56616c7565206973206e6f7420616e20657863657074696f6e 9843:O2|1,@9844 9844:O2|3,@9845 9845:S26|56616c7565206973206e6f74206120636f6e7374727563746f72 9846:O1|@9847 9847:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@18561| 9848:S57|535452554354555245535f28292e6d61746368536967732837296d6174636856616c732833296d617463684c6f63616c56616c756573283329 9849:D3,56|483b65187303ff5548a8017410f6421001740a488d40ff480342107105ff5570ebf1488b5208ff2200000000000000003000000000000000|@9850,1048575,@18564| 9850:S44|535452554354555245535f28292e73747275637456616c7565283829725369672d736f75726365732d283129 9851:D3,344|483b65187303ff5548a801756e488b08488b510848833a017417488b700848b8e8621dc9a37f0000488b5d08909090ff13488b7110498d7fe0483b7d107303ff55404989ff48c747f80300000049b960631dc9a37f00004c894f1048895f084c8b0e4c890f48833a05751e4c8b500848b8807107c9a37f0000eb05e9ba000000488b5d08909090ff1348833a0175194c8b521049833a0375094d8b5a084d8b1beb104d8b5a08eb0a4c8b52084d8b124d89d34c8b5008498d47d0483b45107303ff55404989c748c740f80500000048897820488b7a20488978184c89581048c74008010000004c8b5a084c891841505341524c89c2909090ff12504c8b442418488b5c2410488b442408909090e8eefeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000005001000000000000|@1363,1048575,@18565|32,0,@9852 79,0,@9855 113,0,@1305 9852:O4|@20055,@557,@9854,@9853 9853:O5|@9315,1765,0,1765,0 9854:S9|4e6f7420426f756e64 9855:S29|437265617465642066726f6d206f7061717565207369676e6174757265 9856:D3,184|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b1048895108488b3348893151488b73084889f3488b50084889d0e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000b000000000000000|@3595,31,@18566|23,0,@3592 59,0,@3592 9857:D4,96|483b65187303ff55485052f6c3017531488b0424ff7308ff70184c8b50104c8b4808488b1b488b4424189090ff15460000004989c05b483b65187303ff5548ebca4c89c04883c410c39090909090909000000000000000005800000000000000|@1538,1048575,@18567,@9858| 9858:D10,1664|483b65187303ff5548488b0b483b0d85060000756f483b0d8406000074134889c248b878e107c9a37f0000488b5d08ff13488b5310f642080174624889c6498d47e8483b45107303ff55404989c748c740f8020000004889500848893041ff700841ff304c89ca90ff12498d47e8483b45107303ff55404989c748c740f802000000eb05e985020000488b4c240848894808594883c408488908c20800498d77d0483b75107303ff55404989f748c746f802000000498b780848897e084d8b104c89164c8d5e1849c743f8020000004989730849c703010000006a016a01488b720840f6c601756d488b0e498b5b08498d7fa8483b7d107303ff55404989ff48c747f8020000004c8b034c89470848c707010000004c8d571849c742f8070000004c8b61304d8962304c8b69284d896a284c8b71204d8972204c8b71184d89721849897a10488b790849897a08488b3949893aeb05e9df000000498d7fe8483b7d107303ff55404989ff48c747f8020000004d8b334c8977084c891741f6c00174064983c0027105ff5570ebf54d8d57d84c3b55107303ff55404d89d749c742f8040000004c8b2e4d896a184c8b69184d896a1049c742080500000049c702050000004d8d6fa04c3b6d107303ff55404d89ef49c745f8020000004d8955084c8b134d895500498d4d1848c741f8020000004c8b63084c8961084c89294c8d691849c745f80200000049894d084d894500498d4d1848c741f8020000004c8969084889394989cb488b7608483b65187303ff5548e9a9feffff4889e1498b1b4889194889e1498b730848897108488b0a498d7fe0483b7d107303ff55404989ff48c747f8030000004c8b41104c8947104c8b51084c8957084c8b214c89274c8b2c2449c7c60100000041f6c5017538498d4fe8483b4d107303ff55404989cf48c741f8020000004c897108498b55004889114989ce498b4d084989cd483b65187303ff5548ebc24c89f1498d57d0483b55107303ff55404989d748c742f80200000048894a0848893a4889c1488d421848c740f802000000488950084889084c89ca4883c4089090ff1258c20800488b13483b1590030000756e483b158f03000074164889c648b878e107c9a37f0000488b5d08909090ff13488b731041ff700841ff305056ff7618ff76104152488b44240890ff155e030000498d4fa8483b4d107303ff55404989cf48c741f802000000488b5424284889510848c70101000000488d5918eb05e9e300000048c743f804000000488b74241048897318488b7424084889731048894b08488b4c242048890b4889c6488d432848c740f8020000004889580848890856488b54240890ff12488b442430a80174064883c0027105ff5570ebf5498d4fe0483b4d107303ff55404989cf48c741f803000000488b542420488951105a4883c4284889510848c70101000000498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a498d4fd0483b4d107303ff55404989cf48c741f8020000005b488959084889114889c2488d411848c740f80200000048894808488910c20800483b15490200007569483b154802000074134889c648b878e107c9a37f0000488b5d08ff13488b7310488b7e1048833f0775664989c1498d47e8483b45107303ff55404989c748c740f802000000488970084c890841ff700841ff30488b542418909090ff12498d47e8483b4510730aeb05e95d010000ff55404989c748c740f802000000488b4c240848894808594883c408488908c208004d8d4fa84c3b4d107303ff55404d89cf49c741f8020000004d8b104d89510849c701010000004d8d591849c743f8070000004c8b66304d8963304c8b6e284d896b284c8b76204d8973204c8b56184d8953184d894b104c8b4e084d894b0849890350498d47e8483b45107303ff55404989c748c740f8020000004c895808415b4c891841ff700841ff30564152488b54242890ff12488b442410a80174064883c0027105ff5570ebf5498d4fd8483b4d107303ff55404989cf48c741f804000000488b542408488951185a4883c4084889511048c741080500000048c70105000000498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a498d4fd0483b4d107303ff55404989cf48c741f8020000005b488959084889114889c2488d411848c740f80200000048894808488910c20800498d47e8483b45107303ff55404989c748c740f802000000498b700848897008498b38488938c2080090909000000000000000007806000000000000|@9865,1048575,@18570,@20047,@20047,@20058,@20058,@9859,@20043,@20043|35,0,@1486 808,0,@1486 1159,0,@1486 9859:D4,56|483b65187303ff554849b8486c1dc9a37f000048c7c301000000488b00ff252d000000909090909000000000000000003000000000000000|@9866,1048575,@18571,@1532|11,0,@9860 9860:O1|@9861 9861:D4,88|483b65187303ff554850f6c301752aff730849b9e06c1dc9a37f0000488b1b488b442408ff15460000004989c05b483b65187303ff5548ebd14c89c04883c408c39090909090909000000000000000005000000000000000|@1538,1048575,@18568,@9863|20,0,@9862 9862:O1|@9859 9863:D9,560|483b65187303ff5548488b03483b0535020000756f483b0534020000741348b878e107c9a37f0000488b5d08909090ff13488b4b10488b510848833a01756a4150ff720851488b41104c89caff12498d4fb0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c70101000000488d412048c740f802000000eb05e92400000048894808594889084889c1488d401848c740f8020000005a48895008488908c34c89c0c3483b05a4010000756a483b05a3010000741248b878e107c9a37f0000488b5d089090ff13488b4b10488b511048833a017565498d77a8483b75107303ff55404989f748c746f80400000048894e18488b791848897e1048c746080500000048c706050000004c8d4e2849c741f802000000eb05e92300000049897108488b7208498931498d411848c740f8020000004c8940084c8908c34c89c0c3483b05190100007564483b0518010000741348b878e107c9a37f0000488b5d08909090ff13488b4b10488b5108f6c201756d488b32488b7e1048833f0175654d8d4fa84c3b4d107303ff55404d89cf49c741f804000000498971184c8b56184d89511049c7410805000000eb05e96100000049c701050000004d8d592849c743f8020000004d894b084c8b4f084d890b4d8d631849c74424f802000000eb0ae92b000000e90b0000004d894424084d891c24eb034d89c44d89e04c8b4a084c89ca483b65187303ff5548e95effffff4c89c0c34c89c0c39000000000000000002802000000000000|@9864,1048575,@18569,@20058,@20058,@20043,@20043,@20047,@20047|32,0,@1486 193,0,@1486 348,0,@1486 9864:S45|535452554354555245535f28292e6d616b65436f7079416374696f6e732831296d61746368456e747279283329 9865:S40|535452554354555245535f28292e73747275637456616c7565283829656e7465724974656d283329 9866:S32|535452554354555245535f28292e6d616b65436f7079416374696f6e73283129 9867:D3,280|483b65187303ff5548f6c3017558488b0b488b1148833a0174134889c648b860711dc9a37f0000488b5d08ff13488b710848833e0575164889c748b8807107c9a37f0000488b5d08909090ff1348833e01751e488b7e1048833f03750e4c8b47084d8b00eb15e98f0000004c8b4708eb0a488b7e08488b3f4989f8498d7fc8483b7d107303ff55404989ff48c747f803000000488947104c89470848c707030000004c8d472049c740f80200000049897808488b7a08498938a80174064883c0027105ff5570ebf541504c8b4b084c89cbe82affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000001001000000000000|@9871,255,@18572|31,0,@9868 60,0,@1305 9868:O4|@20055,@557,@9870,@9869 9869:O5|@9315,1403,0,1403,0 9870:S24|6d61746368547970654964733a204e6f7420466f726d616c 9871:S29|535452554354555245535f28292e6d6174636854797065496473283229 9872:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18573| 9873:D3,56|483b65187303ff5548a8017410f6421001740a488d40ff480342107105ff5570ebf1488b5208ff2200000000000000003000000000000000|@9874,1048575,@18574| 9874:S39|535452554354555245535f28292e73747275637456616c7565283829726573756c74732d283129 9875:D3,184|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b1048895108488b3348893151488b73084889f3488b50084889d0e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000b000000000000000|@3595,31,@18575|23,0,@3592 59,0,@3592 9876:D4,408|483b65187303ff5548a801756f488b08488b510848833a017417488b700848b8d0751dc9a37f0000488b5d08909090ff13488b71104d89ca4d89c34989dc4c8b68084989ceff7220ff7208ff364c89e348b828761dc9a37f00009090ff154e010000498d4fe0483b4d107303ff55404989cf48c741f803000000eb05e9fd000000488941104c89590858488901498b460848833805751248b8807107c9a37f0000488b5d089090ff13488338017519488b501048833a037509488b5a08488b1beb10488b5a08eb0a488b5008488b124889d3498d47d0483b45107303ff55404989c748c740f80500000048894820488b4c2408488948184889581048c7400801000000488b0c24488908415241534154415541564c89d290ff12498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901514c8b4c24204c8b442418488b5c2410488b4424089090e8aafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c3909000000000000000009001000000000000|@1363,1048575,@18576,@100|32,0,@9877 82,0,@9879 153,0,@1305 9877:O4|@20055,@557,@9854,@9878 9878:O5|@9315,1508,0,1508,0 9879:S30|437265617465642066726f6d206170706c79696e672066756e63746f7220 9880:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18577| 9881:D4,48|483b65187303ff55484889c3488b420848bae89418c9a37f0000ff252800000000000000000000002800000000000000|@9882,2097151,@18578,@8139|18,0,@8137 9882:S32|535452554354555245535f28292e676976654572726f72283329283129283129 9883:D4,48|483b65187303ff55484889c3488b420848bae89418c9a37f0000ff252800000000000000000000002800000000000000|@9882,2097151,@18580,@8139|18,0,@8137 9884:S29|535452554354555245535f28292e676976654572726f72283329283129 9885:D4,64|483b65187303ff5548488b480849b948c918c9a37f00004c8b4208488b5918488b304889f0ff252d000000909090909000000000000000003800000000000000|@8222,1048575,@18581,@8208|15,0,@8199 9886:D5,64|483b65187303ff55484989d24c8b580848c7c35d000000488b009090ff15360000004d8b4208498b5b10ff253000000000000000000000003800000000000000|@8222,1048575,@18582,@100,@8225| 9887:S29|535452554354555245535f28292e706173733253747275637473283329 9888:D19,5184|488dbc24f8feffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b9424b0000000488911498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000415141504152565351ff7008ff3041504c8b9424e00000004c8b8c24e80000004c8b8424f00000004889d3488b401048ba181c1cc9a37f0000ff15be130000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424304889510848c70101000000488b9c24d8000000505148c7c001000000488b93800000009090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fb8483b5d107303ff55404989df48c743f803000000488953104889430848c70305000000488d432048c740f80400000048894818488b14244889501048895808488b7424084889305051534989c04889f3488b4210ff158a1200004883f801750c48b8909adc0000000000eb6d48c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101740b483b0d161200007d08eb1bf641ff1075154889c248b818930ec9a37f0000488b5d089090ff134889c248c7c001000000488d3c8d04000000eb05e96500000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fa017429488b0a48894c87fca80174064883c0027105ff5570ebf5488b4a084889ca483b65187303ff5548ebd1488067ffbf4889f8488b4c2430488b09488b54241848c7c301000000488b721040f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdbf6c101740ef6c3017409488d49ff4803cb7105ff5570ebf2488b5c243048890b488b0b498d77d8483b75107303ff55404989f748c746f80400000048bf008e1dc9a37f000048893e488bbc240801000048897e08488946104c8b8424100100004c894618488066ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049ba308f1dc9a37f00004d89114c8b52204d89510849897110498061ffbf488b3248833e03756a4c8b5e084d8b1b4c8b66184d8b24244d8b2c244983fd01750c49bc909adc0000000000eb704989ce4c89e95048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89e64889f8eb05e95d0000004889c74c89e948d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9080000004989c44c89f1eb0150498d47e0483b45107303ff55404989c748c740f8030000004c8960104c89580848c70001000000eb084989c34889f04153498d77c8483b75107303ff55404989f748c746f80600000048894e284c894e20488b7a1848897e1848c74610010000004c8b5a084c895e084889065156415150ff750849bcce7e1dc9a37f00004154488965084d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c704240100000048c7c11700000048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c70715000000498d47f0483b45107303ff55404989c748c740f801000000c640ff40488938498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bf888f1dc9a37f0000488939498d7fd8483b7d107303ff55404989ff48c747f804000000488947184c89671048894f0848c707030000004883c4085848894508eb6e9090488b65084883c4085b48895d0848833809755e5048c7c30300000048c7c01500000048baa05f06c9a37f00009090ff157e0e00004889c348b8489319c9a37f000090ff15720e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba689319c9a37f0000eb0ae93a000000e92d000000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d0890ff13488b5d089090ff136a016a016a016a016a016a016a016a016a016a016a016a016a014889e34889f848ba00dd07c9a37f000090ff15e60d0000488b8424b0000000483b05df0d00007468a801752d4889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017470498d4fd8483b4d107303ff55404989cf48c741f804000000488b94249800000048895118488b54247848895110488b942490000000eb05e96000000048895108488901498d57d0483b55107303ff55404989d748c742f80200000048c742080100000048890a488b9c24b0010000eb05e927000000488913488d421848c740f80200000048894808488b8c24b0000000488908488b542450ff12eb6f498d47e0483b45107303ff55404989c748c740f80300000048b9f08f1dc9a37f0000488908488b4c241848894808488b8c24a801000048894810488060ffbf498d57d8483b55107303ff55404989d748c742f80400000048bbe8901dc9a37f000048891a488b5c245048895a08eb05e9b6000000488b9c24b001000048895a10488bb424a000000048897218488062ffbf498d7fd8483b7d107303ff55404989ff48c747f80400000049b8a8911dc9a37f00004c89074c8b4424104c8947084c8b8424c00100004c89471048897718488067ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f8030000004989511049894108498939ff7424706a0149ba509adc00000000004c89c849c7c1030000004c8b8424800000004889c3488b442478909090ff15ee0b0000498d47c8483b45107303ff55404989c748c740f801000000488b8c24a00000004883c430488908488b942488000000488902488d401048c740f80400000048ba68921dc9a37f0000488910488b94244801000048895008488b9c2450010000488958105e4883c40848897018488060ffbf498d77d8483b75107303ff55404989f748c746f80400000048bff8921dc9a37f000048893e488bbc242801000048897e084c8b8424300100004c89461041594c894e18488066ffbf4d8d4fd84c3b4d107303ff55404d89cf49c741f80400000049ba88931dc9a37f00004d89114c8b9424100100004d8951084c8b9c24180100004d8959104c8b6424184d896118498061ffbf4d8d67d84c3b65107303ff55404d89e749c74424f80400000049bd18941dc9a37f00004d892c244c8bac24000100004d896c24084c8bb424080100004d89742410594883c43049894c241849806424ffbf498d4f90483b4d107303ff55404989cf48c741f80d0000004c8949604c8b8c24880000004c894958488b942490000000488951504c89614848897140488bb424980000004889713848894130488b8424a0000000488941284c8ba424a80000004c896120488b9c24b000000048895918488bbc24b8000000488979104c8b8424c00000004c89410849ba08971dc9a37f00004c89114d8d57e04c3b55107303ff55404d89d749c742f80300000049bb58971dc9a37f00004d891a4c8b5c24504d895a084c8b5c24404d895a10498062ffbf4d8d5fc04c3b5d107303ff55404d89df49c743f80700000049bdd0991dc9a37f00004d892b4c8bac24180100004d896b084c8b7424084d8973104c8b7424284d8973184c8b34244d8973204c8bb424200100004d8973284c8b4424504d894330498063ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000048bf809d1dc9a37f0000498938488b7c244049897808498060ffbf6a016a016a016a016a016a01ffb42438010000ffb42498000000ff3518090000488d7c241857ffb424d00000004c89d74989ca4d89d94889fb488b8424a000000048ba70e718c9a37f000090ff15ee080000498d47c8483b45107303ff55404989c748c740f806000000488b4c242848894828488b4c242048894820488b54241848895018488b5c241048895810488b5c240848895808488b3424488930488bbc24380100004c8b47184d8b004983f801740948c7c001000000eb324989c248bb289e1dc9a37f0000488b842498000000909090ff156e0800004c8b8424380100004c89d3909090ff156208000049b8a8ef18c9a37f000048c7c301000000488b042490ff154e08000049b8409e1dc9a37f000048c7c301000000488b042490ff153a080000488b8c2480000000488b0948c7c201000000f6c1017534498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b114889134889da488b4908483b65187303ff5548ebc74889d14883f901750c48b9909adc0000000000eb7148c7c2010000004889cbf6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdcf6c201740b483b15180700007d08eb19f642ff1075134889c348b818930ec9a37f0000488b5d08ff134889cb4889d14889c248c7c001000000488d3c8d04000000eb05e96800000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fb017429488b0b48894c87fca80174064883c0027105ff5570ebf5488b4b084889cb483b65187303ff5548ebd1488067ffbf4889f94889d048baffffffffffffff00482351f8488d5412014883fa01750c48b8909adc0000000000eb6a4889cb4889d14889c648c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000a801740af6c2017405483bc2eb05ff5570ebf67d6b488b4c83fc4c8b410849833801eb05e931010000755a4989c141f6c101740f40f6c60174094d8d49ff4c03ce7105ff5570ebf24d8d57e84c3b55107303ff55404d89d749c742f8020000004d894a0849c702010000004983380575214989c148b8807107c9a37f0000eb0ae9ca000000e9a0000000488b5d089090ff134983380175194d8b48104983390375094d8b59084d8b1beb104d8b5908eb0a4d8b48084d8b094d89cb4d8d4f984c3b4d107303ff55404d89cf49c741f8020000004d89590849c701010000004d8d591849c743f8050000004d8b60204d8963204d8b68184d896b184d894b104d8b48084d894b0849c703010000004d8d733049c746f8030000004c8b49104d894e104d895e084d8916eb034989ce4c897487fca80174064883c0027105ff5570ebf5483b65187303ff5548e9b1feffff488067ffbf4889f84889d948baffffffffffffff00482350f8488d54120148c7c3010000004883fa0174404889d64883ee024883ea02488b5490fc498d7fe8483b7d107303ff55404989ff48c747f80200000048895f084889174889f24889fb483b65187303ff5548ebba48baffffffffffffff00482351f8488d54120148c7c6010000004883fa01746e4889d74883ef024989d04983e8024883ea02488b5491fc41f6c001741849b9ffffffffffffff004c2348f84f8d4c09014d3bc172134989c148b8b0df06c9a37f0000488b5d08ff134e8b4480fc4d8d4fd04c3b4d107303ff55404d89cf49c741f802000000498951084d8901eb05e927000000498d511848c742f802000000488972084c890a4889d64889fa483b65187303ff5548e960ffffff488b8c2488000000488931498d4fc0483b4d107303ff55404989cf48c741f80700000048bad09e1dc9a37f0000488911488b94244801000048895108488b74243848897110488b7424584889711848894120488b44243048894128488bb4245001000048897130488061ffbf498d7fe0483b7d107303ff55404989ff48c747f80300000049b850a01dc9a37f00004c89074c8b4424204c89470848894f10488067ffbf488b0c2448833903756a4c8b41084d8b00488b4918488b094c8b094983f901750c48b9909adc0000000000eb6d4989ca4c89c948c7c0010000004989fb488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89d64889f8eb05e95a0000004889c74c89c948d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90b000000488060ffbf4889c14c89df498d47e0483b45107303ff55404989c748c740f803000000488948104c89400848c70001000000eb034889c8498d4fc8483b4d107303ff55404989cf48c741f806000000488b7424304883c4084889712848897920488b74241048897118488959105e4883c4404889710848890151534889c890ff155e0200004989c25b48c7c001000000909090ff15520200004883f80174114889c34c89d09090ff15460200004989c2488b8424200100004c8910498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424484889510848c70101000000488b9424f00000005148c7c001000000488b9a800000004889da9090ff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c700ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5f98483b5d107303ff55404989df48c743f803000000488953104889430848c70305000000488d432048c740f80500000048894820594889481848895810488b4c2448488948085a4883c4404889104889c2488d403048c740f8020000004889500848890852488b542418909090ff12498d47f0483b45107303ff55404989c748c740f801000000594883c408488908488b8c24e800000048890148c7c001000000c2e8009000000000000000002814000000000000ffffffffffffff01ffffffffffffff01|@9926,2097151,@18607,@9320,@9927,@194,@100,@1484,I48,@8412,I48,@9305,@100,@8225,@1532,@1532,@9859,@9867,@9925|140,0,@9318 365,0,@2150 478,0,I49 561,0,@4361 825,0,@9889 895,0,@9891 959,0,I49 1213,0,$9888+1462 1395,0,@9892 1498,0,@193 1519,0,@8394 1560,0,@8395 1590,0,@557 1604,0,@20055 1667,0,@1483 1708,0,I48 1930,0,@9894 1993,0,@9896 2075,0,@9897 2159,0,I48 2266,0,@9898 2341,0,@9899 2413,0,@9900 2489,0,@9901 2681,0,@9906 2718,0,@9908 2778,0,@9910 2879,0,@9914 2971,0,@8249 3097,0,@9916 3144,0,@8259 3172,0,@9917 3284,0,I49 3367,0,@4361 3518,0,36028797018963967 3543,0,I49 3741,0,@1305 3971,0,36028797018963967 4067,0,36028797018963967 4128,0,36028797018963967 4155,0,@560 4288,0,@9919 4385,0,@9921 4449,0,I49 4973,0,@2150 9889:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@9890,1048575,@18584|73,0,36028797018963967 100,0,@560 9890:S98|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296172675369675769746853656c65637465642d6d6170546f53656c6563746564283129 9891:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18585,@1542| 9892:O1|@9893 9893:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@18586,@375| 9894:D3,120|483b65187303ff5548488b4a10488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b480848890b488b721048891e488b18498d47e8483b45107303ff55404989c748c740f80200000048894808488918488b4a084889caff2290909000000000000000007000000000000000|@9895,1048575,@18587| 9895:S68|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132295f2d283129 9896:D4,144|483b65187303ff55484c8b104989d349c7c001000000498b5b18488b40089090ff1582000000498b4b10488b09498d57e8483b55107303ff55404989d748c742f80200000048894a08488902498b4b104889114889c2498d47e8483b45107303ff55404989c748c740f802000000488950084c8910498b5308ff22909090909000000000000000008800000000000000|@9895,1048575,@18588,@8913| 9897:D4,144|483b65187303ff55484c8b184989d449c7c001000000498b5c2418488b400890ff1582000000498b4c2410488b09498d57e8483b55107303ff55404989d748c742f80200000048894a08488902498b4c24104889114889c2498d47e8483b45107303ff55404989c748c740f802000000488950084c8918498b542408ff22909000000000000000008800000000000000|@9895,1048575,@18589,@8537| 9898:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18590| 9899:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18591| 9900:D3,104|483b65187303ff55485052488b4a184889ca9090ff124883f8017533488b0424488b4810488b4424084889caff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c34883c410c39090909000000000000000006000000000000000|@7987,1048575,@18592| 9901:D5,232|483b65187303ff55485248c7c001000000488b4a184889caff12498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000488b14244889c3498d47e8483b45107303ff55404989c748c740f80200000048be38951dc9a37f000048893048894808488060ffbf5351488b72104889f290ff1258488b00488b4c2408488b49085048c7c001000000488b514890ff124883f8017506488b0424eb104889c3488b0424909090ff154a0000004883f801750a4883c408584883c408c34889c34883c408584883c408ff25300000000000000000000000e000000000000000|@9904,1048575,@18594,@9905,@9903|94,0,@9902 9902:D3,72|488b4a08488b09498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b00488903488b520848891a48c7c001000000c300000000000000004000000000000000|@8180,15,@18593| 9903:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18596| 9904:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229656e7657697468417267732d283129 9905:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18595| 9906:O1|@9907 9907:D3,24|48c7c001000000c300000000000000001000000000000000|@9904,1,@18597| 9908:D5,480|483b65187303ff5548488b4a10488b094889cbf6c30174064883c3027105ff5570ebf5488b721048891e4883780801746e498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c703ffffffff498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4049b810f608c9a37f00004c89074d8d47a84c3b45107303ff55404d89c749c740f8030000004989781049895808eb05e94400000049c70005000000488b5820488b78184c8b48104c8b10498d402048c740f80600000048895828488978204c894818488948104c8940084c89104989d0ff1512010000eb6e498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c703ffffffff498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4049b810f608c9a37f00004c89074d8d47a84c3b45107303ff55404d89c749c740f8030000004989781049895808eb05e94300000049c70005000000488b5820488b78184c8b48104c8b10498d402048c740f80600000048895828488978204c894818488948104c8940084c89104989d090ff1562000000498b4808488b09498d57e8483b55107303ff55404989d748c742f80200000048894a084889024d8b4008498910c3909090900000000000000000d801000000000000|@9909,511,@18598,@8245,@8243|114,0,@2150 297,0,@2150 9909:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296e6577547970654964283129 9910:D3,424|488b4230488b0048c7c101000000a8017534498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0848890b4889d9488b4008483b65187303ff5548ebc84889c84883f801750c48b8909adc0000000000eb6e48c7c1010000004889c3f6c301751ff6c10174064883c1027105ff5570ebf5488b5b08483b65187303ff5548ebdcf6c101740b483b0d0b0100007d08eb1cf641ff1075164889c348b818930ec9a37f0000488b5d08909090ff134889c348c7c001000000488d3c8d04000000eb05e96500000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c0010000004883fb017429488b0b48894c87fca80174064883c0027105ff5570ebf5488b4b084889cb483b65187303ff5548ebd1488067ffbf4889f84889c1498d47c0483b45107303ff55404989c748c740f80700000048bba09b1dc9a37f0000488918488b5a0848895808488b721048897010488b7a184889781848894820488b4a20488948284c8b42284c894030488060ffbfc390909000000000000000009801000000000000ffffffffffffff01|@9913,127,@18600|81,0,I49 164,0,@4361 336,0,@9911 9911:D3,248|483b65187303ff5548a801740ef64230017408483b42307d0deb05ff5570ebf3488b5208ff22a801740ef64228017408483b42287d5deb05ff5570ebf3488b4a18a801740cf64128017406482b41287105ff5570ebf54883c001a801741c488b721048bbffffffffffffff0048235ef8488d5c1b01483bc372134889c348b8b0df06c9a37f0000488b5d08ff13488b4486fcc3a801740cf64228017406482b42287105ff5570ebf54883c001a801741c488b5a2048b9ffffffffffffff0048234bf8488d4c0901483bc172154889c148b8b0df06c9a37f0000488b5d089090ff13488b4483fcc3900000000000000000f000000000000000|@9912,1048575,@18599|100,0,36028797018963967 127,0,@560 182,0,36028797018963967 209,0,@560 9912:S78|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129283129 9913:S75|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229747970654964456e76283129 9914:D3,32|488b5208488b124889d0c3909090909000000000000000001800000000000000|@9915,5,@18601| 9915:S73|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132297265735369672d283129 9916:S3|28292e 9917:O1|@9918 9918:D4,80|483b65187303ff554850f6c30175244c8b5308488b1b488b04249090ff15460000004989c04c89d3483b65187303ff5548ebd74c89c04883c408c3909090909000000000000000004800000000000000|@1538,1023,@18602,@9625| 9919:D3,248|483b65187303ff5548a801740ef64230017408483b42307d0deb05ff5570ebf3488b5208ff22a801740ef64228017408483b42287d5deb05ff5570ebf3488b4a18a801740cf64128017406482b41287105ff5570ebf54883c001a801741c488b721048bbffffffffffffff0048235ef8488d5c1b01483bc372134889c348b8b0df06c9a37f0000488b5d08ff13488b4486fcc3a801740cf64228017406482b42287105ff5570ebf54883c001a801741c488b5a2048b9ffffffffffffff0048234bf8488d4c0901483bc172154889c148b8b0df06c9a37f0000488b5d089090ff13488b4483fcc3900000000000000000f000000000000000|@9920,1048575,@18603|100,0,36028797018963967 127,0,@560 182,0,36028797018963967 209,0,@560 9920:S76|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229726573547970654d6170283129 9921:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18604,@1542| 9922:S43|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229 9923:D4,568|483b65187303ff554853415050504c89d14c8b5424304c8b4c24384c8b442440488b5c24484889c848ba181c1cc9a37f00009090ff1516020000498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70101000000488b542420ff7028ff7020ff7010ff305148c7c001000000488b9a800000004889daff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901488b042448833803756a488b5008488b12488b4018488b00488b184883fb01750c48b8909adc0000000000eb714889ce4889d94889c748c7c0010000004989f8488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f0eb05e9630000004c89c64889f94889cf4989c84889d948d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c0901498060ffbf4889c14c89c0498d5fe0483b5d107303ff55404989df48c743f803000000488943104889530848c70301000000eb034889c3498d47b0483b45107303ff55404989c748c740f806000000488b5424184883c40848895028488b5424084889502048894818594883c41048894810488b4c2408488948084889185a488902488b5424104889c3488d403848c740f802000000488958084889084883c408594883c42851ff229090909090909000000000000000003002000000000000|@9924,2097151,@18606,@9320|42,0,@9318 243,0,I49 9924:S64|535452554354555245535f28292e7061737332537472756374732833297061737332546f7044656328322970617373325369676e617475726542696e64283529 9925:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18610| 9926:S63|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e6428313229 9927:D4,120|483b65187303ff5548a8017551415053ff7008488b009090ff1572000000504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909000000000000000007000000000000000|@1363,8191,@18608,@9928| 9928:D6,384|483b65187303ff5548488b0848833901750a488b500848833a0174154889c148b8d8a61dc9a37f0000488b5d089090ff13488b7010498d7fd0483b7d107303ff55404989ff48c747f8050000004c8b4a204c894f204c8b52184c8957184c8b5a104c895f104c8b62084c89670848c70701000000483b1d1d0100007452f6c301753d4c8b6e104c8b7608ff364889de5748bf509adc0000000000ff710848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017420eb25ff3657ff71084c8b6e104c8b7608eb15ff3657ff71084c8b6e104c8b7608488b4c2410eb2741504889d948c7c35d0000004889c890ff15a6000000488b5c241890ff15a20000004889c1eb024150498d47a0483b45107303ff55404989c748c740f8030000004c8968104c897008488908488d482048c741f8030000005a488951105a4889510848c701090000004889c2488d412048c740f803000000488950105a4883c40848895008488908c390909000000000000000007801000000000000|@9932,8191,@18609,I48,@100,@100|33,0,@9929 146,0,I48 9929:O4|@20055,@557,@9931,@9930 9930:O5|@9315,2184,0,2184,0 9931:S29|6d6b49643a204e6f7420426f756e64206f72206e6f7420466f726d616c 9932:S70|535452554354555245535f28292e7061737332537472756374732833297061737332546f70446563283229706173733246756e63746f7242696e64283132296d6b4964283129 9933:O1|@9934 9934:D3,160|488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833801750b48b890a81dc9a37f0000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833803750b48b878a91dc9a37f0000c3f6c10174084883f9037c13eb06f641ff10750b48b858aa1dc9a37f0000c348b8707907c9a37f0000c3909090909000000000000000009800000000000000|@9956,3,@18611|25,0,@1326 42,0,@9935 72,0,@1326 89,0,@9942 119,0,@9949 130,0,@1326 9935:O5|0,0,0,@9937,@9936 9936:O2|@9940,0 9937:O2|@9938,0 9938:O2|0,@9939 9939:O5|@9315,129,129,0,0 9940:O2|3,@9941 9941:S18|436f6e7374727563746f72546f56616c7565 9942:O5|0,0,0,@9944,@9943 9943:O2|@9947,0 9944:O2|@9945,0 9945:O2|0,@9946 9946:O5|@9315,128,128,0,0 9947:O2|3,@9948 9948:S16|457863657074696f6e546f56616c7565 9949:O5|0,0,0,@9951,@9950 9950:O2|@9954,0 9951:O2|@9952,0 9952:O2|0,@9953 9953:O5|@9315,127,127,0,0 9954:O2|3,@9955 9955:S10|4e6f436f657263696f6e 9956:S20|7072696e742d76616c7565436f657263696f6e73 9957:O3|@9959,@10054,@9958 9958:O3|@10343,@10055,@10054 9959:D5,88|483b65187303ff55484889d74989d94c8b4010488b5808488b084889c8909090ff154a0000004c8b5710498b4908498b114c8b4f084989c04889cb4889d0ff25340000009090909000000000000000005000000000000000|@10051,511,@18656,@9003,@9960| 9960:D4,280|483b65187303ff55484883f8017520498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c3498d4fc8483b4d107303ff55404989cf48c741f80600000048ba78ad1dc9a37f0000488911488941084c8941104c8949184c89512048895928488061ffbf498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000a80174154889c148b8f86f07c9a37f0000488b5d089090ff13498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014883f90174164889de4889cb4c89c090ff154e0000004989c04889f3498d47e8483b45107303ff55404989c748c740f8020000004c894008488918c300000000000000001001000000000000|@10053,479,@18657,@10052|73,0,@9961 153,0,@1294 9961:D4,88|483b65187303ff5548488b4a18488b1c2448890c24ff7220ff7208ff72284c8b521049b900ae1dc9a37f000049c7c0010000004889de488b5a0856ff252f0000009090909090909000000000000000005000000000000000|@9970,1048575,@18615,@9963|36,0,@9962 9962:O1|@9960 9963:D4,448|483b65187303ff5548f6c301741348b800b01dc9a37f0000488b5d08909090ff13498d47c0483b45107303ff55404989c748c740f80700000048b958b01dc9a37f00004889084c894808488b4c241048894810488b542408488950184c895020488b74242048897028488b7c241848897830488060ffbf4d8d5ff04c3b5d107303ff55404d89df49c743f80100000049890348837b0801750948c7c001000000eb6e498d47b0483b45107303ff55404989c748c740f80900000049bc08b11dc9a37f00004c8920488958084c8940104c8948184c89502048897028488978304889483848895040488060ffbf4d8d67a04c3b65107303ff55404d89e749c74424f80100000049890424498d442410eb05e95c00000048c740f80900000049bde0b11dc9a37f00004c89284c8b6b084c8968084c8960104c8948184c89502048897028488978304889483848895040488060ffbf4989c1498d47f0483b45107303ff55404989c748c740f8010000004c89084d8d4fe04c3b4d107303ff55404d89cf49c741f8030000004d8941104d8959084989014c89c84989f94989f0488b1b415a4883c4204152ff252a00000090900000000000000000b801000000000000|@10047,1048575,@18652,@9972|16,0,@9964 59,0,@9966 188,0,@9968 287,0,@9971 9964:O4|@20091,@1627,0,@9965 9965:O5|@9315,828,0,828,0 9966:D3,56|483b65187303ff55484c8b52304c8b4a284c8b4220488b5a18488b4210488b4a084889caff22909000000000000000003000000000000000|@9967,1048575,@18612| 9967:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329283129 9968:D3,80|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff72404c8b52204c8b4a184c8b42104889de488b5a0848ba80b11dc9a37f000056ff22909000000000000000004800000000000000|@9970,1048575,@18613|51,0,@9969 9969:O1|@9963 9970:S61|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283129283129 9971:D3,80|483b65187303ff5548488b4a28488b1c2448890c24ff7230ff7238ff72404c8b52204c8b4a184c8b42104889de488b5a0848ba80b11dc9a37f000056ff22909000000000000000004800000000000000|@9970,1048575,@18614|51,0,@9969 9972:D8,576|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bae8b41dc9a37f000048891148895908488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048894a0848c70213000000f6c20174164889c148b8f86f07c9a37f0000488b5d08909090ff134c89c74989da4989c34989d44d8b4310498b5b08498b03ff15c6010000498d4fb8483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f80500000048ba80b51dc9a37f00004889104c8958084c895010488978184c894820488060ffbf49833a01756f498d57e8483b55107303ff55404989d748c742f80200000048bb30b61dc9a37f000048891a48897a08488062ffbf498d5fd8483b5d107303ff55404989df48c743f801000000488903488d431048c740f802000000488958084889104889cf4889c3498b420890ff150e010000eb05e9380000004883ff01740b4889fb9090ff15fe0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b52104c8910c349833a03756a498d57d8483b55107303ff55404989d748c742f801000000488902488d421048c740f8020000004889500848ba08d61dc9a37f00004889104889cf4889c3498b4208909090ff158e0000004883ff01740a4889fb90ff15860000004889c1498d47e8483b4510730aeb05e91a000000ff55404989c748c740f802000000488948084d8b52104c8910c3498b5a084c89d84c89caff229090909000000000000000003802000000000000|@10049,1048575,@18653,@9003,@9025,@10050,@9025,@10048|35,0,@9973 100,0,@1294 191,0,@9975 255,0,@9978 452,0,@10035 9973:D4,40|483b65187303ff55484889c3488b4208ff252a000000909000000000000000002000000000000000|@9974,2097151,@18616,@7993| 9974:S48|535452554354555245535f28292e746f704465634578706f727454726565283229636f6d6d6f6e50726f70732d283129 9975:D3,56|483b65187303ff55484c8b4a204c8b4218488b5a10488b420848bae0b51dc9a37f0000ff2290909000000000000000003000000000000000|@9977,1048575,@18617|27,0,@9976 9976:O1|@9972 9977:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296173506172656e74283129 9978:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@10033,8191,@18645,@9979| 9979:D4,672|483b65187303ff5548488b0b6a016a0148837b30037560488b530848833a057556488b7208498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b4e184c894f104c8b56104c8957084c8b5e084c891f4c8d672049c74424f80100000049893c244889e74c89274889e74c8b264c896708eb154889e248c702010000004889e2488b730848897208488b7b104c8b4b184c8b53384c8b59104d89c44989dd4989c64d8b4610498b5e08498b06ff1502020000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba60b91dc9a37f00004889114c8971084c8969104c896118488061ffbf498d57c0483b55107303ff55404989d748c742f807000000c642ff4048bb20ba1dc9a37f000048891a4c896208488b5c240848895a1048894a1848c742200100000048c7422801000000488b3424488972304d8d47d04c3b45107303ff55404d89c749c740f80500000041c640ff4049bd10bb1dc9a37f00004d8928498970084989501049c7401801000000498948204d8d6fc04c3b6d107303ff55404d89ef49c745f80700000041c645ff4049be80d31dc9a37f00004d8975004d895d0849c745100100000049894d184d89452049895528498975304d8d77d04c3b75107303ff55404d89f749c746f80500000048bb90d41dc9a37f000049891e4d894e084d8956104d896e1849894e20498066ffbf4d897510498065ffbf4d896818498060ffbf4c8942204c896a28488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004c89710848c70109000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f802000000488950084889384883c410c300000000000000009802000000000000|@10034,8191,@18646,@9003|208,0,@9980 266,0,@9983 349,0,@9985 411,0,@10029 477,0,@10031 585,0,@1294 9980:D3,56|483b65187303ff55484c8b4218488b5a10488b420848bac0b91dc9a37f0000ff229090909090909000000000000000003000000000000000|@9982,1048575,@18618|23,0,@9981 9981:O1|@9979 9982:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296578706f727454686973283129 9983:D3,128|483b65187303ff554848837a30017506488b4228eb04488b4220498d4fc0483b4d107303ff55404989cf48c741f801000000488b5a18488919488d711048c746f801000000488906488d461048c740f803000000488970104889480848c70001000000488b5a10488b4a084889caff2200000000000000007800000000000000|@9984,1048575,@18619| 9984:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574426f6479283129 9985:D4,176|483b65187303ff5548498d47b0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f8010000004c8b42104c89074c8d4f1049c741f803000000498959104989410849893948837a0801751148b8386208c9a37f0000488b5d0890ff13488b4208488b18488b3b4889fb4c89c848baf0bb1dc9a37f0000ff252b0000009090900000000000000000a800000000000000|@10028,1023,@18642,@9988|110,0,@1662 143,0,@9986 9986:O2|@9988,@9987 9987:O2|@9997,@9996 9988:D8,496|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048be60be1dc9a37f000048893148895908488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7061300000040f6c60174154889c148b8f86f07c9a37f0000488b5d089090ff134889d74989d94989c24989f34d8b4210498b5a08498b02ff1576010000498d4fc0483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f80400000048ba00bf1dc9a37f0000488910488978084c8950104c894818488060ffbf49833905752a498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b06319c9a37f0000488908c3498339017572498d57d8483b55107303ff55404989d748c742f801000000488902488d421048c740f80200000048895008488b7f084889384889cf4889c3498b4108909090ff15ba0000004883ff01740a4889fb90ff15b20000004889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c000000488948084d8b49104c8908c3498b4118488b004889cf9090ff157a0000004883ff01740a4889fb90ff15720000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49104c8908c39090900000000000000000e801000000000000|@9994,1023,@18622,@9003,@9025,@9995,@2055,@9993|35,0,@9989 101,0,@1294 191,0,@9991 255,0,@8345 9989:D4,48|483b65187303ff55484889c3488b420848ba100d18c9a37f0000ff252800000000000000000000002800000000000000|@9990,2097151,@18620,@8000|18,0,@7998 9990:S44|5349474e41545552455328292e7369674578706f727454726565283229636f6d6d6f6e50726f70732d283129 9991:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@9992,1048575,@18621| 9992:S40|5349474e41545552455328292e7369674578706f7274547265652832296173506172656e74283129 9993:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18624| 9994:S29|5349474e41545552455328292e7369674578706f727454726565283229 9995:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18623| 9996:O3|@10000,@9999,@9986 9997:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@9998,1048575,@18625| 9998:S30|5349474e41545552455328292e737065634578706f727454726565283129 9999:O2|@10026,@9986 10000:D9,1416|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048be60c71dc9a37f000048893148895908488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7061300000040f6c60174154889c148b8f86f07c9a37f0000488b5d089090ff134889d74989d94989c24989f34d8b4210498b5a08498b02ff150e050000498d4fc0483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f80400000048ba00c81dc9a37f0000488910488978084c8950104c894818488060ffbf498b1148bb72c21dc9a37f0000488d5c93fcffe3909090e9d2000000909090e915010000909090e9cd020000909090e93e030000909090e90b000000909090e958030000909090498d57e8483b55107303ff55404989d748c742f80200000048bb98c81dc9a37f000048891a488b7f1048897a08488062ffbf498d5fd8483b5d107303ff55404989df48c743f801000000488903488d431048c740f802000000488958084889104889cf4889c3498b4108ff15160400004883ff01740a4889fb90ff150e0400004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49104c8908c36a016a014989e0498b59084c89d048baa0fb18c9a37f0000909090ff15ce030000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c3498b511041f6411801756e498b5918498d77d8483b75107303ff55404989f748c746f804000000c646ff4048bfb0cd1dc9a37f000048893e488b3b48897e0848c7461001000000488946184d8d47d04c3b45107303ff55404d89c749c740f80500000049ba98ce1dc9a37f00004d89104c8b124d895008eb05e9920000004c8b5a084d8958104989701849894020498060ffbf4c894610488066ffbf498d47e8483b45107303ff55404989c748c740f8020000004c89400848c70009000000a80174164889c648b8f86f07c9a37f0000488b5d08909090ff13498d77d0483b75107303ff55404989f748c746f80200000048894e08488906488d461848c740f80200000048897008498b4908488908c3498d5fd8483b5d107303ff55404989df48c743f80400000048be80cf1dc9a37f0000488933488b3248897308488b7a0848897b1048894318488063ffbf498d47e8483b45107303ff55404989c748c740f8020000004889580848c70009000000a80174154889c348b8f86f07c9a37f0000488b5d089090ff13498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488903488d431848c740f80200000048895808498b4908488908c3498d57d8483b55107303ff55404989d748c742f801000000488902488d421048c740f80200000048895008488b7f084889384889cf4889c3498b4108ff15aa0100004883ff01740a4889fb90ff15a20100004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49104c8908c3498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b06319c9a37f0000488908c3498b5110498d5fd8483b5d107303ff55404989df48c743f804000000c643ff4048be20d01dc9a37f0000488933498b71184889730848c743100100000048894318498d7fd0483b7d107303ff55404989ff48c747f80500000049b8d0d01dc9a37f00004c89074c8b024c8947084c8b52084c89571048895f1848894720488067ffbf48897b10488063ffbf498d47e8483b45107303ff55404989c748c740f8020000004889780848c70009000000a80174144889c348b8f86f07c9a37f0000488b5d0890ff13498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488903488d431848c740f80200000048895808498b4908488908c39090909000000000000000008005000000000000|@10024,1048575,@18638,@9003,@9025,@10025,@8943,@9025,@10023|35,0,@10001 101,0,@1294 191,0,@10003 224,0,$10000+242 316,0,@10005 473,0,@8280 577,0,@10016 633,0,@10018 732,0,@1294 830,0,@10020 909,0,@1294 1131,0,@8345 1177,0,@10021 1234,0,@10022 1326,0,@1294 10001:D4,48|483b65187303ff55484889c3488b420848ba482218c9a37f0000ff252800000000000000000000002800000000000000|@10002,2097151,@18626,@8025|18,0,@8021 10002:S45|5349474e41545552455328292e737065634578706f727454726565283229636f6d6d6f6e50726f70732d283129 10003:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@10004,1048575,@18627| 10004:S41|5349474e41545552455328292e737065634578706f7274547265652832296173506172656e74283129 10005:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@10014,2047,@18631,@10006| 10006:D4,368|483b65187303ff5548488b4b18498d57d8483b55107303ff55404989d748c742f80400000048be98ca1dc9a37f00004889324889420848895a104c894218488062ffbf498d77d0483b75107303ff55404989f748c746f805000000c646ff4048bf50cb1dc9a37f000048893e4c894608488b3948897e1048c7461801000000488956204d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049ba38cc1dc9a37f00004d89114c8b53084d8951084c8b5b104d8959104989711849895120498061ffbf4c894e18488066ffbf498d57e8483b55107303ff55404989d748c742f8020000004c894a0848c70209000000f6c20174134889c648b8f86f07c9a37f0000488b5d08ff134c8b0b4989d44c8b4010488b5808488b104889d0909090ff1562000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8921488d411848c740f802000000488948084c8908c39090909090909000000000000000006801000000000000|@10015,2047,@18632,@9003|39,0,@10007 97,0,@10010 157,0,@10012 251,0,@1294 10007:D3,56|483b65187303ff55484c8b4218488b5a10488b420848baf8ca1dc9a37f0000ff229090909090909000000000000000003000000000000000|@10009,1048575,@18628|23,0,@10008 10008:O1|@10006 10009:S54|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296578706f727454686973283129 10010:D3,120|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a104889f8488b4a084889caff22909000000000000000007000000000000000|@10011,1048575,@18629| 10011:S56|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229676574536967537472756374283129 10012:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@10013,511,@18630,@8997| 10013:S51|5349474e41545552455328292e737065634578706f7274547265652832296578706f727453422832296765744e616d65283129 10014:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283129 10015:S41|5349474e41545552455328292e737065634578706f7274547265652832296578706f72745342283229 10016:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848ba38421bc9a37f0000ff252b00000090909000000000000000007800000000000000|@10017,2097151,@18633,@9012|95,0,@9010 10017:S40|5349474e41545552455328292e737065634578706f72745472656528322967657454797065283129 10018:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@10019,511,@18634,@8997| 10019:S40|5349474e41545552455328292e737065634578706f7274547265652832296765744e616d65283129 10020:D4,112|483b65187303ff5548498d47d0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f80300000048c74310010000004889430848c7030100000049c7c1010000004c8b42104889d8488b5a08ff25290000009000000000000000006800000000000000|@10019,511,@18635,@8997| 10021:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848ba38421bc9a37f0000ff252b00000090909000000000000000007800000000000000|@10017,2097151,@18636,@9012|95,0,@9010 10022:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@10019,511,@18637,@8997| 10023:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18640| 10024:S30|5349474e41545552455328292e737065634578706f727454726565283229 10025:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18639| 10026:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@10027,1048575,@18641| 10027:S29|5349474e41545552455328292e7369674578706f727454726565283129 10028:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574536967283129 10029:D4,152|483b65187303ff554848837a30017506488b4228eb04488b4220498d4fb0483b4d107303ff55404989cf48c741f801000000488b5a18488919488d711048c746f801000000488b7a1048893e4c8d461049c740f801000000498900498d401048c740f80300000048897010488948084c8900488b5a0848baf0bb1dc9a37f0000ff252a000000909000000000000000009000000000000000|@10030,1023,@18643,@9988|120,0,@9986 10030:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229676574417267283129 10031:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@10032,511,@18644,@8997| 10032:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727446422832296765744e616d65283129 10033:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283129 10034:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72744642283229 10035:O1|@10036 10036:D4,48|483b65187303ff5548488b5808488b084889c8ff252f0000009090909090909000000000000000002800000000000000|@10045,511,@18650,@10037| 10037:D4,360|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048ba10d81dc9a37f00004889114889410848895910488061ffbf498d57d8483b55107303ff55404989d748c742f804000000c642ff4048bec8d81dc9a37f0000488932488b73204889720848c742100100000048894a18498d7fd0483b7d107303ff55404989ff48c747f80500000049b8c0d91dc9a37f00004c89074c8b43084c8947084c8b4b184c894f104889571848894f20488067ffbf48897a10488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004889790848c70109000000f6c10174164889c248b8f86f07c9a37f0000488b5d08909090ff13488b3b4989ca4c8b4010488b5808488b084889c8909090ff1562000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8911488d411848c740f80200000048894808488938c39090909090909000000000000000006001000000000000|@10046,511,@18651,@9003|35,0,@10038 89,0,@10041 146,0,@10043 240,0,@1294 10038:D3,48|483b65187303ff5548488b5a10488b420848ba68d81dc9a37f0000ff2290909000000000000000002800000000000000|@10040,1048575,@18647|19,0,@10039 10039:O1|@10037 10040:S57|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296578706f727454686973283129 10041:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848baf0bb1dc9a37f0000ff252b00000090909000000000000000007800000000000000|@10042,1023,@18648,@9988|95,0,@9986 10042:S53|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229676574536967283129 10043:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f49c7c1010000004c8b4210488b5a084889f8ff252a000000909000000000000000007800000000000000|@10044,511,@18649,@8997| 10044:S54|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f727453422832296765744e616d65283129 10045:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283129 10046:S44|535452554354555245535f28292e746f704465634578706f7274547265652832296578706f72745342283229 10047:S58|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229676574456e747279283329 10048:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18655| 10049:S33|535452554354555245535f28292e746f704465634578706f727454726565283229 10050:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18654| 10051:S34|535452554354555245535f28292e737472756374734578706f727454726565283229 10052:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18658| 10053:S47|535452554354555245535f28292e737472756374734578706f7274547265652832296578706f727454726565283229 10054:O5|@10056,@9958,@20183,@20184,@10055 10055:O2|@10341,@9958 10056:D12,1408|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bef0e31dc9a37f000048893148895908488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7061300000040f6c60174154889c148b8f86f07c9a37f0000488b5d089090ff134889d74989d94989c24989f34d8b4210498b5a08498b02ff1506050000498d4fc0483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f80400000048ba98e41dc9a37f0000488910488978084c8950104c894818488060ffbf49833905756f498b5108498d5fd8483b5d107303ff55404989df48c743f804000000c643ff4048be38e51dc9a37f0000488933488b72084889730848c7431001000000488943184d8d47d04c3b45107303ff55404d89c749c740f80500000049ba30e61dc9a37f00004d8910498978084c8b12eb05e98b0000004d8950104989581849894020498060ffbf4c894310488063ffbf498d47e8483b45107303ff55404989c748c740f8020000004c89400848c70009000000a80174134889c348b8f86f07c9a37f0000488b5d08ff13498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488903488d431848c740f80200000048895808488b4a18488908c349833903756c498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fe0483b5d107303ff55404989df48c743f80300000048be18e71dc9a37f0000488933488b7710488973084c8b47184c894310488063ffbf48891a498d57e0483b5510730aeb05e9fe000000ff55404989d748c742f80300000048bb18ed1dc9a37f000048891a488b5f0848895a0848897a10488062ffbf4d8d57d84c3b55107303ff55404d89d749c742f801000000498902498d421048c740f8020000004c8950084889104989ca4989c3498b411090ff15de020000498d4fd0483b4d107303ff55404989cf48c741f802000000498b51084889510848c701030000004c8d611849c74424f80200000049c74424080100000049890c244983fc0174094c89e3ff15960200004c89db909090ff15920200004983fa01740a4c89d390ff158a0200004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49184c8908c349833901756d498b5108488b5a20488b1b4883fb01750948c7c301000000eb07488b1b488b5b20498d77d0483b75107303ff55404989f748c746f805000000c646ff4049b8d0ed1dc9a37f00004c890648897e084c8b024c89461048c7461801000000488946204d8d57c84c3b5510730aeb05e9b7000000ff55404d89d749c742f80600000049bbb8ee1dc9a37f00004d891a4c8b5a084d895a084c8b62304d89621049895a184989722049894228498062ffbf4c895618488066ffbf498d47e8483b45107303ff55404989c748c740f8020000004c89500848c70009000000a80174144889c348b8f86f07c9a37f0000488b5d0890ff13498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488903488d431848c740f80200000048895808488b4a28488908c3498339077571498d57d8483b55107303ff55404989d748c742f801000000488902488d421048c740f80200000048895008488b7f204889384889cf4889c3498b41089090ff15f20000004883ff01740a4889fb90ff15ea0000004889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c000000488948084d8b49104c8908c3498b4110488b004883f801750948c7c001000000eb07488b00488b40184889cfff159e0000004883ff01740a4889fb90ff15960000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49184c8908c39090909090909000000000000000007805000000000000|@10084,2047,@18667,@9003,@10085,@10086,@9025,@10087,@9025,@10088,@2055,@10083|35,0,@10057 101,0,@1294 191,0,@10059 259,0,@10061 316,0,@10063 411,0,@1294 547,0,@10065 615,0,@10077 922,0,@10079 989,0,@10081 1086,0,@1294 10057:D4,48|483b65187303ff55484889c3488b420848bae89418c9a37f0000ff252800000000000000000000002800000000000000|@10058,2097151,@18659,@8139|18,0,@8137 10058:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229636f6d6d6f6e50726f70732d283129 10059:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@10060,1048575,@18660| 10060:S49|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296173506172656e74283129 10061:D4,128|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a18488908488d581048c743f801000000488b7210488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a084889f848baf0bb1dc9a37f0000ff252b00000090909000000000000000007800000000000000|@10062,1023,@18661,@9988|95,0,@9986 10062:S53|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296765745369676e6174757265283129 10063:D3,120|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048c74710010000004889470848891f488b5a104889f8488b4a084889caff22909000000000000000007000000000000000|@10064,1048575,@18662| 10064:S53|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229676574537472756374757265283129 10065:D3,1152|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017561f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b4b0848890e488b5208488b124889f0909090ff12488338017555f64020017554488b4820f6410801755f488b1148833a07eb05e9a9010000751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9c0eb1dc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c3488b3840f6c60174064883ee027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897008488b7708498930488b5210488b124c89c090ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b998ec1dc9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000007804000000000000|@10076,1048575,@18663|34,0,@1326 221,0,@883 290,0,@884 331,0,@835 464,0,@833 505,0,@10066 605,0,@1326 766,0,@883 845,0,@884 886,0,@835 1019,0,@833 1060,0,@10073 10066:O5|0,0,0,@10068,@10067 10067:O2|@10071,0 10068:O2|@10069,0 10069:O2|0,@10070 10070:O5|@9315,710,710,0,0 10071:O2|3,@10072 10072:S3|446563 10073:O5|0,0,0,@10068,@10074 10074:O2|@10075,0 10075:O2|3,@9368 10076:S16|7072696e742d616c6c456e7472696573 10077:D3,72|483b65187303ff5548488b4808488339017510488b5908488b304889f0488b5208ff22488b5908488b304889f0488b5210ff22909090909000000000000000004000000000000000|@10078,1048575,@18664| 10078:S54|535452554354555245535f28292e73747275637456616c75654578706f7274547265652832296578706f7274456e7472696573283129 10079:D3,120|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a20488908488d581048c743f801000000488b7218488933488d7b1048c747f80300000048895f104889470848c70701000000488b5a104889f8488b4a084889caff22909000000000000000007000000000000000|@10080,1048575,@18665| 10080:S54|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f72417267283129 10081:D5,144|483b65187303ff5548498d47c0483b45107303ff55404989c748c740f801000000488b4a28488908488d581048c743f801000000488b7220488933488d7b1048c747f80300000048c74710010000004889470848891f4989d0498b4018909090ff15420000004989c1498b4010498b48084989c04889cb4889f8ff253000000000000000000000008800000000000000|@10082,511,@18666,@2055,@8997| 10082:S55|535452554354555245535f28292e73747275637456616c75654578706f72745472656528322967657446756e63746f724e616d65283129 10083:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18672| 10084:S38|535452554354555245535f28292e73747275637456616c75654578706f727454726565283229 10085:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f802000000488b104889510848c7010100000051488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@18668| 10086:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18669| 10087:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18670| 10088:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18671| 10089:O4|@10090,@20186,@20183,@20184 10090:D3,8608|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017568f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb6b4889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308488937eb05e9750a000049b858c119f1a37f00004d8b0052ff731051ff73184889f84c89c2ff12488b4c2408f6c101740f4883f903eb05e9430900007d14eb06f641ff10740c48b9282707c9a37f0000eb68f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb69488b14244889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a08eb05e9f407000048891e48bfb8b019f1a37f0000488b3f50514889f04889fa9090ff12488b0c24f6c101740f4883f903eb05e9560500007d14eb06f641ff10740c48b9282707c9a37f0000eb60488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542418f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542420f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2428488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442410a80174064883e8027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894208488b44241848890248b808c119f1a37f0000488b00488b5c2420498d77e8483b75107303ff55404989f748c746f80200000048bf98141ec9a37f000048893e488b5b0848895e08488066ffbf4889c3498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889700848c7000100000051524889daff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d8151ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b818981bc9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b808161ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b938161ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833b037568f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb6f4889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308488937eb05e9d70a000049b8d8c019f1a37f00004d8b004d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049ba10171ec9a37f0000eb05e9a10900004d89114c8b52104d895108498061ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004c89480848c7000100000052ff731851ff7310574c89c2ff124889c1584889ca909090ff12488b4c2408f6c10174084883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb70f6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9d8c019f1a37f0000488b09488b5c2418498d77e8483b75107303ff55404989f748c746f80200000048bf80171ec9a37f000048893e488b5b10eb05e9df07000048895e08488066ffbf4889c3498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889700848c7000100000053524889ca90ff124889c1584889ca909090ff12488b4c2410f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb65488b5424184889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bfb8b019f1a37f0000488b3f50514889f04889fa9090ff12488b0c24f6c101740d4883f9037d19eb0be954050000f641ff10740c48b9282707c9a37f0000eb62488b542428f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f29090ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542430f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542438f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2440488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048ba702707c9a37f000048895008488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d0171ec9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b800181ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b830181ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b960181ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c340f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48ba282707c9a37f0000eb6f4889f740f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808488b7b1049893849b9d8c019f1a37f00004d8b094d8d57e84c3b55107303ff55404d89d749c742f80200000049bb38191ec9a37f00004d891a488b5218eb05e94509000049895208498062ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010050000004c89500848c70001000000ff731856ff730841504c89ca9090ff124889c1584889ca909090ff12488b4c2408f6c10174084883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb68f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb68488b14244889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a08eb05e99307000048891e48bfb8b019f1a37f0000488b3f50514889f04889fa90ff12488b0c24f6c101740f4883f903eb05e9560500007d14eb06f641ff10740c48b9282707c9a37f0000eb60488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542418f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542420f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2428488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442410a80174064883e8027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894208488b44241848890248b808c119f1a37f0000488b0051524889c348b8902f1ec9a37f00004889daff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e0301ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d0171ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b820311ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958311ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909000000000000000009821000000000000|@10106,1048575,@18683|34,0,@1326 89,0,@847 163,0,@20179 223,0,@847 270,0,@847 347,0,@20033 402,0,@847 470,0,@20033 521,0,@847 588,0,@20029 641,0,@847 709,0,@20033 800,0,@20033 848,0,@850 893,0,@833 934,0,@852 975,0,@833 1016,0,@834 1089,0,@833 1133,0,@854 1177,0,@833 1218,0,@834 1291,0,@833 1335,0,@856 1379,0,@833 1420,0,@834 1493,0,@833 1537,0,@858 1581,0,@833 1622,0,@834 1699,0,@833 1743,0,@860 1787,0,@862 1915,0,@20174 1957,0,@10091 2080,0,@850 2125,0,@833 2166,0,@10094 2207,0,@833 2248,0,@834 2321,0,@833 2365,0,@9123 2409,0,@833 2450,0,@834 2527,0,@833 2571,0,@10096 2612,0,@862 2723,0,@833 2764,0,@10098 2859,0,@1326 2911,0,@847 2985,0,@20171 3022,0,@10105 3156,0,@847 3219,0,@20171 3261,0,@10107 3408,0,@847 3479,0,@20033 3532,0,@847 3600,0,@20033 3653,0,@847 3720,0,@20029 3773,0,@847 3841,0,@20033 3932,0,@20033 3980,0,@850 4025,0,@833 4066,0,@852 4107,0,@833 4148,0,@834 4221,0,@833 4265,0,@854 4309,0,@833 4350,0,@834 4423,0,@833 4467,0,@856 4511,0,@833 4552,0,@834 4625,0,@833 4669,0,@858 4713,0,@833 4754,0,@834 4831,0,@833 4875,0,@860 4919,0,@862 5003,0,@850 5048,0,@833 5089,0,@10108 5130,0,@833 5171,0,@834 5244,0,@833 5285,0,@10110 5329,0,@833 5370,0,@834 5447,0,@833 5491,0,@10112 5532,0,@862 5643,0,@833 5684,0,@10114 5784,0,@1326 5832,0,@847 5899,0,@20171 5936,0,@10121 6072,0,@847 6119,0,@847 6196,0,@20033 6250,0,@847 6318,0,@20033 6369,0,@847 6436,0,@20029 6489,0,@847 6557,0,@20033 6648,0,@20033 6696,0,@850 6741,0,@833 6782,0,@852 6823,0,@833 6864,0,@834 6937,0,@833 6981,0,@854 7025,0,@833 7066,0,@834 7139,0,@833 7183,0,@856 7227,0,@833 7268,0,@834 7341,0,@833 7385,0,@858 7429,0,@833 7470,0,@834 7547,0,@833 7591,0,@860 7635,0,@862 7763,0,@20174 7781,0,@10139 7832,0,@850 7877,0,@833 7918,0,@10146 7959,0,@833 8000,0,@834 8073,0,@833 8117,0,@10108 8161,0,@833 8202,0,@834 8279,0,@833 8320,0,@10148 8361,0,@862 8472,0,@833 8513,0,@10150 10091:D3,160|483b65187303ff554848b9d8c019f1a37f0000488b09498d5fe8483b5d107303ff55404989df48c743f80200000048be60151ec9a37f0000488933488b520848895308488063ffbf4889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889580848c70001000000524889ca9090ff124889c1584889caff229000000000000000009800000000000000|@840,1048575,@18674|11,0,@20171 48,0,@10092 10092:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@10093,1048575,@18673| 10093:S21|7072696e742d636f72654465636c61726174696f6e 10094:O2|3,@10095 10095:S6|76617273203d 10096:O2|3,@10097 10097:S5|646563203d 10098:O5|0,0,0,@10100,@10099 10099:O2|@10103,0 10100:O2|@10101,0 10101:O2|0,@10102 10102:O5|@9315,187,187,0,0 10103:O2|3,@10104 10104:S8|436f72654c616e67 10105:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@10106,1048575,@18675| 10106:S15|7072696e742d737472756374446563 10107:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@10106,1048575,@18676| 10108:O2|3,@10109 10109:S6|6c696e65203d 10110:O2|3,@10111 10111:S6|64656373203d 10112:O2|3,@10113 10113:S6|626f6479203d 10114:O5|0,0,0,@10116,@10115 10115:O2|@10119,0 10116:O2|@10117,0 10117:O2|0,@10118 10118:O5|@9315,194,194,0,0 10119:O2|3,@10120 10120:S8|4c6f63616c646563 10121:D3,5048|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb63488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b4b2048890e48bf28c119f1a37f0000488b3f52504889f04889fa90ff12488b0c24488b5108f6c201740d4883fa037d19eb0be9a9120000f642ff10740c48bb282707c9a37f0000eb6b488b19f6c20174064883ea027105ff5570ebf5f6c20174084883fa017d14eb06f642ff10740c48ba282707c9a37f0000eb6a488b334889d740f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808488b7e08eb05e95e11000049893849b9b8b019f1a37f00004d8b095052564c89c04c89ca90ff12488b4c2408f6c101740f4883f903eb05e9520500007d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8782807c9a37f0000488902eb0150498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442408488b5008f6c20174084883fa057d14eb06f642ff10740c48bb282707c9a37f0000eb62488b18f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b530848891648bf78b019f1a37f0000488b3f514889f04889faff12488b4c2410488b5108f6c201740d4883fa077d19eb0be9200a0000f642ff10740c48bb282707c9a37f0000eb68488b19f6c20174064883ea027105ff5570ebf5f6c20174084883fa017d14eb06f642ff10740c48ba282707c9a37f0000eb69488b73284889d740f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808eb05e9da080000488b7e0849893849b9b8b019f1a37f00004d8b095052564c89c04c89ca909090ff12488b4c2408f6c101740feb05e9560500004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8782807c9a37f0000488902eb0150498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442418488b5008f6c20174084883fa097d14eb06f642ff10740c48bb282707c9a37f0000eb6e488b18f6c20174064883ea027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895608488b531848891648bf08c119f1a37f0000488b3f515648b8182d1ec9a37f00004889faff124889c1584889ca909090ff12488b4c2420488b11488b5908eb05e98a010000f6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a1048891e488b7c2428488b7f08488b3f504889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c02e1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8f02e1ec9a37f0000488903eb0151498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8202f1ec9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8e07907c9a37f0000488903eb0151498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848b8d0171ec9a37f0000488903eb0150498d47e8483b45107303ff55404989c748c740f8020000004889580848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8582f1ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090900000000000000000b013000000000000|@168,1048575,@18680|34,0,@847 100,0,@20176 156,0,@847 206,0,@847 283,0,@20033 339,0,@847 406,0,@20033 457,0,@847 524,0,@20029 577,0,@847 645,0,@20033 736,0,@20033 784,0,@850 829,0,@833 870,0,@852 911,0,@833 952,0,@834 1025,0,@833 1069,0,@854 1113,0,@833 1154,0,@834 1227,0,@833 1271,0,@856 1315,0,@833 1356,0,@834 1429,0,@833 1473,0,@858 1517,0,@833 1558,0,@834 1635,0,@833 1676,0,@860 1720,0,@862 1820,0,@847 1886,0,@20029 1941,0,@847 1991,0,@847 2069,0,@20033 2127,0,@847 2194,0,@20033 2245,0,@847 2312,0,@20029 2365,0,@847 2433,0,@20033 2524,0,@20033 2572,0,@850 2617,0,@833 2658,0,@852 2699,0,@833 2740,0,@834 2813,0,@833 2857,0,@854 2901,0,@833 2942,0,@834 3015,0,@833 3059,0,@856 3103,0,@833 3144,0,@834 3217,0,@833 3261,0,@858 3305,0,@833 3346,0,@834 3423,0,@833 3464,0,@860 3508,0,@862 3608,0,@847 3674,0,@20174 3689,0,@10122 3832,0,@850 3877,0,@833 3918,0,@10131 3959,0,@833 4000,0,@834 4073,0,@833 4114,0,@10133 4158,0,@833 4199,0,@834 4272,0,@833 4313,0,@10135 4357,0,@833 4398,0,@834 4471,0,@833 4512,0,@1329 4556,0,@833 4597,0,@834 4670,0,@833 4711,0,@10108 4755,0,@833 4796,0,@834 4873,0,@833 4914,0,@10137 4955,0,@862 10122:O4|0,@10123,3,1 10123:O1|@10124 10124:D3,64|483b65187303ff554848b998b019f1a37f0000488b095048b8b82d1ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@1968,1048575,@18679|11,0,@20031 25,0,@10125 10125:O4|0,@10126,3,1 10126:O1|@10127 10127:D3,48|483b65187303ff554848b9b8c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@10130,1048575,@18678|11,0,@20185 10128:O1|@10129 10129:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18677|2,0,@388 10130:S16|7072696e742d73747275637456616c73 10131:O2|3,@10132 10132:S7|76616c7565203d 10133:O2|3,@10134 10134:S8|76616c526566203d 10135:O2|3,@10136 10136:S9|6e616d654c6f63203d 10137:O2|3,@10138 10138:S9|68617665536967203d 10139:O4|0,@10140,3,1 10140:O1|@10141 10141:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b830301ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18682|11,0,@20171 25,0,@10142 10142:O4|0,@10143,3,1 10143:O1|@10144 10144:D3,48|483b65187303ff554848b978c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@10145,1048575,@18681|11,0,@20181 10145:S12|7072696e742d747970654964 10146:O2|3,@10147 10147:S17|74797065496473466f724465627567203d 10148:O2|3,@10149 10149:S10|62696e64696e6773203d 10150:O5|0,0,0,@10152,@10151 10151:O2|@10155,0 10152:O2|@10153,0 10153:O2|0,@10154 10154:O5|@9315,180,180,0,0 10155:O2|3,@10156 10156:S12|537472756374757265446563 10157:O1|@10158 10158:D3,2408|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1048833a017571f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9c01607c9a37f0000eb684889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf78b019f1a37f0000eb05e9fe010000488b3fff7210514889f04889fa90ff1259f6c10174064883e902710cff5570eb05e9d8000000ebee498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a48b9d8c119f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b01b07c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9303c1ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c348833a037562f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48beb8c119f1a37f0000488b364889d84889f29090ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9083d1ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5808f6c30174084883fb037d13eb06f643ff10740b48b8707907c9a37f0000c3488b3048833e057560f6c30174064883eb027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895f08488b5e0848891f49b8e8c019f1a37f00004d8b004889f84c89c2ff12488338017555f64020017554488b4820f6410801755feb05e9b0010000488b1148833a07751b48837a0851746a48817a08f7000000746548817a08b70000007460498d5fe8483b5d107303ff55404989df48c743f802000000eb0ae9c2000000e9b800000048be782b07c9a37f000048897308eb05e9a3000000488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e83d1ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b780840f6c70174084883ff037d13eb06f647ff10740b48b8707907c9a37f0000c34c8b0040f6c70174064883ef027105ff5570ebf54d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049897908498b780849893949bae8c119f1a37f00004d8b124c89c84c89d2ff12488338017558f64020017557488b4820f64108017552488b1148833a07751b48837a0851746848817a08f7000000746348817a08b7000000745e498d5fe8483b5d107303ff55404989df48c743f80200000048be782b07c9a37f0000eb0fe9b6000000e9ac000000e9a700000048897308488903498d77e8483b75107303ff55404989f748c746f802000000eb0fe981000000e97c000000e97700000048895e0848bb902b07c9a37f000048891e498d5fe8483b5d107303ff55404989df48c743f8020000004889730848beb01b07c9a37f0000488933498d77d0483b75107303ff55404989f748c746f80500000048895e2048c746180100000048c746100300000048c746080700000048c70601000000eb084889c6eb034889c6498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488930488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9183f1ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909000000000000000006009000000000000|@10093,1048575,@18686|34,0,@1326 89,0,@821 155,0,@20029 244,0,@20187 292,0,@831 337,0,@833 378,0,@834 454,0,@835 565,0,@833 606,0,@10161 701,0,@1326 769,0,@20185 893,0,@883 962,0,@884 1003,0,@835 1136,0,@833 1177,0,@10168 1276,0,@1326 1347,0,@20172 1469,0,@883 1538,0,@884 1579,0,@835 1712,0,@833 1753,0,@10175 1853,0,@1326 1919,0,@20188 2022,0,@883 2101,0,@884 2142,0,@835 2275,0,@833 2316,0,@10184 10159:O1|@10160 10160:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18684|2,0,@388 10161:O5|0,0,0,@10163,@10162 10162:O2|@10166,0 10163:O2|@10164,0 10164:O2|0,@10165 10165:O5|@9315,114,114,0,0 10166:O2|3,@10167 10167:S7|436f7265466978 10168:O5|0,0,0,@10170,@10169 10169:O2|@10173,0 10170:O2|@10171,0 10171:O2|0,@10172 10172:O5|@9315,115,115,0,0 10173:O2|3,@10174 10174:S10|436f7265537472756374 10175:O5|0,0,0,@10177,@10176 10176:O2|@10180,0 10177:O2|@10178,0 10178:O2|0,@10179 10179:O5|@9315,113,113,0,0 10180:O2|3,@10181 10181:S8|436f726554797065 10182:O1|@10183 10183:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18685|2,0,@388 10184:O5|0,0,0,@10186,@10185 10185:O2|@10189,0 10186:O2|@10187,0 10187:O2|0,@10188 10188:O5|@9315,112,112,0,0 10189:O2|3,@10190 10190:S9|436f726556616c7565 10191:O4|@10192,@20189,@20184,@20183 10192:D3,18384|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017568f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb65488b73084889cf40f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808488b3eeb05e9ff1600004989384c8b4a104d8b095156524c89c04c89caff12488b4c2410f6c101740d4883f9037d19eb0be9d3150000f641ff10740c48b9282707c9a37f0000eb6d488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48be08c119f1a37f0000488b36505348b818881ec9a37f00004889f290ff124889c1584889ca909090ff12488b4c2418f6c101eb05e98314000074084883f9057d14eb06f641ff10740c48b9282707c9a37f0000eb6a488b542410f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb69488b5a284889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708eb05e92e130000488b730848893749b8b8b019f1a37f00004d8b005051534889f84c89c2909090ff12488b4c2408f6c101740feb05e9590500004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442420a80174084883f8077d14eb06f640ff10740c48b8282707c9a37f0000eb6d488b542418a80174064883e8027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894308488b423848890348be08c119f1a37f0000488b36488b7c24104d8d47e84c3b45107303ff55404d89c749c740f80200000049b9108c1ec9a37f0000eb05e9e10b00004d8908488b7f0849897808498060ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004c89400848c7000100000051534889f29090ff124889c1584889ca909090ff12488b4c2428f6c10174084883f9097d14eb06f641ff10740c48b9282707c9a37f0000eb62488b542420f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a0848890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2430f6c101740d4883f90b7d19eb0be9370a0000f641ff10740c48b9282707c9a37f0000eb6a488b542428f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb6b488b5a304889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708eb05e9ec080000488b730848893749b8b8b019f1a37f00004d8b005051534889f84c89c290ff12488b4c2408f6c101740f4883f903eb05e9550500007d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442438a80174084883f80d7d14eb06f640ff10740c48b8282707c9a37f0000eb6e488b542430a80174064883e8027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894308488b421848890348be08c119f1a37f0000488b36515348b8f88e1ec9a37f00004889f290ff124889c1584889ca909090ff12488b4c2438488b542440eb05e9a0010000f6c20174064883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b908c119f1a37f0000488b09505348b890921ec9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f02e1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b938941ec9a37f0000488908eb0151498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8202f1ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e07907c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b968941ec9a37f0000488908eb0151498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a8941ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e0941ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b810951ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b940951ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c3488b3848833f03756a40f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48ba282707c9a37f0000eb674989f041f6c00174064983e8027105ff5570ebf54d8d4fe84c3b4d107303ff55404d89cf49c741f8020000004d8941084c8b47084d8901eb05e95c0a00004c8b52104d8b1252ff771856ff77104c89c84c89d2ff12488b4c2408f6c101740d4883f9037d19eb0be92e090000f641ff10740c48b9282707c9a37f0000eb70f6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9d8c019f1a37f0000488b09488b5c2418498d77e8483b75107303ff55404989f748c746f80200000048bf20961ec9a37f000048893e488b5b18eb05e9de07000048895e08488066ffbf4889c3498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889700848c7000100000053524889caff124889c1584889ca909090ff12488b4c2410f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb65488b5424184889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bfb8b019f1a37f0000488b3f50514889f04889fa9090ff12488b0c24f6c101740d4883f9037d19eb0be954050000f641ff10740c48b9282707c9a37f0000eb62488b542428f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f29090ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542430f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542438f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2440488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048ba702707c9a37f000048895008488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d0171ec9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b800181ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b830181ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b970961ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b400841f6c00174084983f8037d14eb0741f640ff10740b48b8707907c9a37f0000c348833f05756841f6c00174064983e8027105ff5570ebf541f6c00174084983f8017d15eb0741f640ff10740c48ba282707c9a37f0000eb6b4c8b4f084d89c241f6c20174064983ea027105ff5570ebf54d8d5fe84c3b5d107303ff55404d89df49c743f8020000004d895308eb05e9630e00004d8b51084d891349bc18c219f1a37f00004d8b242452415041514c89d84c89e29090ff12488b4c2408f6c101740feb05e92e0d00004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb6d488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a2848890b48be08c119f1a37f0000488b36488b7c24104d8d47e84c3b45107303ff55404d89c749c740f80200000049b9a0971ec9a37f0000eb05e9d90b00004d89084c8b4f084d894808498060ffbf4989c2498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004c89400848c700010000004152534889f290ff124889c1584889ca909090ff12488b4c2410f6c10174084883f9057d14eb06f641ff10740c48b9282707c9a37f0000eb62488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48be28c119f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9290a0000f641ff10740c48b9282707c9a37f0000eb6d488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a2048890b48be08c119f1a37f0000488b36505348b8889a1ec9a37f00004889f290ff124889c1584889ca909090ff12488b4c2420f6c101eb05e9db08000074084883f9097d14eb06f641ff10740c48b9282707c9a37f0000eb6a488b542418f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb69488b5a184889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708eb05e986070000488b730848893749b8b8b019f1a37f00004d8b005051534889f84c89c2909090ff12488b4c2408f6c101740feb05e9590500004883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442420488b542428f6c20174064883ea027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b00488903488b442430488b4010488b00514889c24889d8ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8209e1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8509e1ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8809e1ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b89e1ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e89e1ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8289f1ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9589f1ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c34c8b480841f6c10174084983f9037d14eb0741f641ff10740b48b8707907c9a37f0000c34c8b1049833a07756a41f6c10174064983e9027105ff5570ebf541f6c10174084983f9017d15eb0741f641ff10740c48ba282707c9a37f0000eb734d89cb41f6c30174064983eb027105ff5570ebf54d8d67e84c3b65107303ff55404d89e749c74424f8020000004d895c24084d8b5a08eb05e9ea0a00004d891c2449bdd8c019f1a37f00004d8b6d004d8d77e84c3b75107303ff55404d89f749c746f80200000048b938a01ec9a37f0000eb05e9af09000049890e488b4a1849894e08498066ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004c89700848c700010000005241ff7218415141ff721041544c89ea90ff124889c1584889ca909090ff12488b4c2408f6c10174084883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb68f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb68488b14244889cbf6c30174064883eb027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a08eb05e9f307000048891e48bfb8b019f1a37f0000488b3f50514889f04889fa90ff12488b0c24f6c101740f4883f903eb05e9560500007d14eb06f641ff10740c48b9282707c9a37f0000eb60488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2408f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542418f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2410f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542420f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2428488b542418f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8782807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442410a80174064883e8027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894208488b44241848890248b808c119f1a37f0000488b00488b5c2420498d77e8483b75107303ff55404989f748c746f80200000048bf88a01ec9a37f000048893e488b5b0848895e08488066ffbf4889c3498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010070000004889700848c7000100000051524889daff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b870a31ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b818981bc9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8a8a31ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d8a31ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b5008f6c20174084883fa037d13eb06f642ff10740b48b8707907c9a37f0000c3f6c20174064883ea027105ff5570ebf5f6c20174084883fa017d14eb06f642ff10740c48ba282707c9a37f0000eb6b4989d341f6c30174064983eb027105ff5570ebf541f6c30174084983fb017d15eb0741f643ff10740c49bb282707c9a37f0000eb6f4d8b62184d89dd41f6c50174064983ed027105ff5570ebf54d8d77e84c3b75107303ff55404d89f749c746f8020000004d896e08eb05e9e40800004d8b6c24084d892e48b9b8b019f1a37f0000488b0941ff72105241ff7208415341544c89f04889caff12488b4c2408f6c101eb05e95805000074084883f9037d14eb06f641ff10740c48b9282707c9a37f0000eb5f488b1424f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1848890b48beb8b019f1a37f0000488b36504889d84889f2ff12488b4c2410f6c101740d4883f9057d19eb0be90d040000f641ff10740c48b9282707c9a37f0000eb61488b542408f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78b019f1a37f0000488b36504889d84889f29090ff12488b4c2418f6c101740d4883f9077d19eb0be9cb020000f641ff10740c48b9282707c9a37f0000eb69488b542410f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b4a1048890b48beb8b019f1a37f0000488b36504889d84889f290ff12488b4c2418488b542420f6c20174064883ea02710cff5570eb05e981010000ebee498d5fe8483b5d107303ff55404989df48c743f80200000048895308488b492048890b48b9b8b019f1a37f0000488b09504889d84889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8a02707c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8d82707c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8102807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8402807c9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014d8d5fe84c3b5d107303ff55404d89df49c743f80200000049894b0848b8782807c9a37f0000498903eb0941ff72105241ff7208498d47e8483b45107303ff55404989c748c740f8020000004c89580848b9b02807c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488b442408a80174084883f8037d14eb06f640ff10740c48b8282707c9a37f0000eb6ea80174064883e8027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894208488b042448890248b878b019f1a37f0000488b00514889c34889d04889da9090ff12488b4c2410f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e987010000ff55404989d748c742f80200000048894a08488b4c241848890a48b908c119f1a37f0000488b09505248b8b8a41ec9a37f00004889ca9090ff124889c1584889ca909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8f02e1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e07907c9a37f0000488908eb0151498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9981b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d57e8483b55107303ff55404989d748c742f8020000004889420848b818981bc9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9e8a51ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090900000000000000000c847000000000000|@10301,1048575,@18707|34,0,@1326 89,0,@847 213,0,@847 281,0,@20174 296,0,@10193 355,0,@847 407,0,@847 485,0,@20033 543,0,@847 610,0,@20033 661,0,@847 728,0,@20029 781,0,@847 849,0,@20033 940,0,@20033 988,0,@850 1033,0,@833 1074,0,@852 1115,0,@833 1156,0,@834 1229,0,@833 1273,0,@854 1317,0,@833 1358,0,@834 1431,0,@833 1475,0,@856 1519,0,@833 1560,0,@834 1633,0,@833 1677,0,@858 1721,0,@833 1762,0,@834 1839,0,@833 1883,0,@860 1927,0,@862 2022,0,@847 2089,0,@20174 2131,0,@10203 2260,0,@847 2328,0,@20029 2381,0,@847 2433,0,@847 2511,0,@20033 2567,0,@847 2634,0,@20033 2685,0,@847 2752,0,@20029 2805,0,@847 2873,0,@20033 2964,0,@20033 3012,0,@850 3057,0,@833 3098,0,@852 3139,0,@833 3180,0,@834 3253,0,@833 3297,0,@854 3341,0,@833 3382,0,@834 3455,0,@833 3499,0,@856 3543,0,@833 3584,0,@834 3657,0,@833 3701,0,@858 3745,0,@833 3786,0,@834 3863,0,@833 3907,0,@860 3951,0,@862 4046,0,@847 4113,0,@20174 4128,0,@10205 4224,0,@20174 4239,0,@10211 4292,0,@850 4337,0,@833 4378,0,@10133 4419,0,@833 4460,0,@834 4533,0,@833 4574,0,@10220 4618,0,@833 4659,0,@834 4732,0,@833 4773,0,@10135 4817,0,@833 4858,0,@834 4931,0,@833 4975,0,@1329 5019,0,@833 5060,0,@834 5133,0,@833 5174,0,@10222 5218,0,@833 5259,0,@834 5332,0,@833 5373,0,@10224 5417,0,@833 5458,0,@834 5531,0,@833 5575,0,@10226 5619,0,@833 5660,0,@834 5737,0,@833 5781,0,@10228 5822,0,@862 5933,0,@833 5974,0,@10230 6074,0,@1326 6131,0,@847 6257,0,@847 6320,0,@20171 6362,0,@10237 6508,0,@847 6579,0,@20033 6632,0,@847 6700,0,@20033 6753,0,@847 6820,0,@20029 6873,0,@847 6941,0,@20033 7032,0,@20033 7080,0,@850 7125,0,@833 7166,0,@852 7207,0,@833 7248,0,@834 7321,0,@833 7365,0,@854 7409,0,@833 7450,0,@834 7523,0,@833 7567,0,@856 7611,0,@833 7652,0,@834 7725,0,@833 7769,0,@858 7813,0,@833 7854,0,@834 7931,0,@833 7975,0,@860 8019,0,@862 8103,0,@850 8148,0,@833 8189,0,@10108 8230,0,@833 8271,0,@834 8344,0,@833 8385,0,@10110 8429,0,@833 8470,0,@834 8547,0,@833 8588,0,@10112 8629,0,@862 8740,0,@833 8781,0,@10238 8882,0,@1326 8937,0,@847 9015,0,@20191 9075,0,@847 9142,0,@20174 9184,0,@10247 9316,0,@847 9384,0,@20176 9437,0,@847 9505,0,@20174 9520,0,@10249 9579,0,@847 9631,0,@847 9709,0,@20033 9767,0,@847 9834,0,@20033 9885,0,@847 9952,0,@20029 10005,0,@847 10073,0,@20033 10164,0,@20033 10212,0,@850 10257,0,@833 10298,0,@852 10339,0,@833 10380,0,@834 10453,0,@833 10497,0,@854 10541,0,@833 10582,0,@834 10655,0,@833 10699,0,@856 10743,0,@833 10784,0,@834 10857,0,@833 10901,0,@858 10945,0,@833 10986,0,@834 11063,0,@833 11107,0,@860 11151,0,@862 11328,0,@850 11373,0,@833 11414,0,@10255 11455,0,@833 11496,0,@834 11569,0,@833 11613,0,@10257 11657,0,@833 11698,0,@834 11771,0,@833 11815,0,@10259 11859,0,@833 11900,0,@834 11973,0,@833 12017,0,@10261 12061,0,@833 12102,0,@834 12175,0,@833 12219,0,@10263 12263,0,@833 12304,0,@834 12381,0,@833 12422,0,@10265 12463,0,@862 12574,0,@833 12615,0,@10267 12716,0,@1326 12774,0,@847 12851,0,@20171 12889,0,@10274 13028,0,@847 13075,0,@847 13152,0,@20033 13206,0,@847 13274,0,@20033 13325,0,@847 13392,0,@20029 13445,0,@847 13513,0,@20033 13604,0,@20033 13652,0,@850 13697,0,@833 13738,0,@852 13779,0,@833 13820,0,@834 13893,0,@833 13937,0,@854 13981,0,@833 14022,0,@834 14095,0,@833 14139,0,@856 14183,0,@833 14224,0,@834 14297,0,@833 14341,0,@858 14385,0,@833 14426,0,@834 14503,0,@833 14547,0,@860 14591,0,@862 14719,0,@20174 14761,0,@10275 14884,0,@850 14929,0,@833 14970,0,@10277 15011,0,@833 15052,0,@834 15125,0,@833 15169,0,@9123 15213,0,@833 15254,0,@834 15331,0,@833 15372,0,@10279 15413,0,@862 15524,0,@833 15565,0,@10281 15664,0,@1326 15710,0,@847 15763,0,@847 15842,0,@20033 15907,0,@847 15974,0,@20033 16025,0,@847 16092,0,@20029 16145,0,@847 16213,0,@20033 16304,0,@20033 16352,0,@850 16397,0,@833 16438,0,@852 16479,0,@833 16520,0,@834 16593,0,@833 16637,0,@854 16681,0,@833 16722,0,@834 16795,0,@833 16839,0,@856 16883,0,@833 16924,0,@834 16997,0,@833 17041,0,@858 17085,0,@833 17126,0,@834 17203,0,@833 17244,0,@860 17296,0,@862 17391,0,@847 17453,0,@20029 17544,0,@20174 17559,0,@10288 17612,0,@850 17657,0,@833 17698,0,@10133 17739,0,@833 17780,0,@834 17853,0,@833 17894,0,@1329 17938,0,@833 17979,0,@834 18056,0,@833 18097,0,@9123 18138,0,@862 18249,0,@833 18290,0,@10294 10193:O4|0,@10194,3,1 10194:O1|@10195 10195:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b8b8881ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18688|11,0,@20171 25,0,@10196 10196:O4|0,@10197,2,2 10197:O1|@10198 10198:D3,664|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb68488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78c119f1a37f0000488b36504889d84889f2909090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9800100007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf78c119f1a37f0000488b3f504889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b08b1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8e08b1ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090909000000000000000009002000000000000|@168,1048575,@18687|34,0,@847 99,0,@20181 197,0,@20181 244,0,@850 289,0,@833 330,0,@10199 371,0,@833 412,0,@834 485,0,@833 526,0,@10201 567,0,@862 10199:O2|3,@10200 10200:S8|736f75726365203d 10201:O2|3,@10202 10202:S6|64657374203d 10203:D3,160|483b65187303ff554848b9d8c019f1a37f0000488b09498d5fe8483b5d107303ff55404989df48c743f80200000048bed88c1ec9a37f0000488933488b520848895308488063ffbf4889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180500000048c74010050000004889580848c70001000000524889ca9090ff124889c1584889caff229000000000000000009800000000000000|@840,1048575,@18690|11,0,@20171 48,0,@10204 10204:D3,504|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bac01607c9a37f0000eb68488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0b48890e48bfb8b019f1a37f0000488b3f52504889f04889fa9090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9e00000007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e488b3c24488b7f084883c408488b3f504889f04889fa909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909090900000000000000000f001000000000000|@168,1048575,@18689|34,0,@821 99,0,@20033 248,0,@831 293,0,@833 334,0,@834 407,0,@835 10205:O4|0,@10206,3,1 10206:O1|@10207 10207:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b8988f1ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18692|11,0,@20171 25,0,@10208 10208:O4|0,@10209,2,2 10209:O1|@10210 10210:D3,664|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb68488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78c119f1a37f0000488b36504889d84889f2909090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9800100007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf78c119f1a37f0000488b3f504889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b08b1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8e08b1ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090909000000000000000009002000000000000|@168,1048575,@18691|34,0,@847 99,0,@20181 197,0,@20181 244,0,@850 289,0,@833 330,0,@10199 371,0,@833 412,0,@834 485,0,@833 526,0,@10201 567,0,@862 10211:O4|0,@10212,3,1 10212:O1|@10213 10213:D3,64|483b65187303ff554848b998b019f1a37f0000488b095048b830931ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@1968,1048575,@18695|11,0,@20031 25,0,@10214 10214:O4|0,@10215,3,1 10215:O1|@10216 10216:D3,48|483b65187303ff554848b908c219f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@10219,1048575,@18694|11,0,@20190 10217:O1|@10218 10218:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18693|2,0,@388 10219:S14|7072696e742d66756e63746f7273 10220:O2|3,@10221 10221:S8|726573496473203d 10222:O2|3,@10223 10223:S17|6d61746368546f417267756d656e74203d 10224:O2|3,@10225 10225:S9|66756c6c4c6f63203d 10226:O2|3,@10227 10227:S8|617267496473203d 10228:O2|3,@10229 10229:S5|617267203d 10230:O5|0,0,0,@10232,@10231 10231:O2|@10235,0 10232:O2|@10233,0 10233:O2|0,@10234 10234:O5|@9315,150,150,0,0 10235:O2|3,@10236 10236:S11|46756e63746f724170706c 10237:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@10106,1048575,@18696| 10238:O5|0,0,0,@10240,@10239 10239:O2|@10243,0 10240:O2|@10241,0 10241:O2|0,@10242 10242:O5|@9315,162,162,0,0 10243:O2|3,@10244 10244:S6|4c6574446563 10245:O1|@10246 10246:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@18697|2,0,@388 10247:D3,160|483b65187303ff554848b9d8c019f1a37f0000488b09498d5fe8483b5d107303ff55404989df48c743f80200000048be68981ec9a37f0000488933488b520848895308488063ffbf4889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180500000048c74010050000004889580848c70001000000524889ca9090ff124889c1584889caff229000000000000000009800000000000000|@840,1048575,@18699|11,0,@20171 48,0,@10248 10248:D3,504|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bac01607c9a37f0000eb68488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0b48890e48bfb8b019f1a37f0000488b3f52504889f04889fa9090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9e00000007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e488b3c24488b7f084883c408488b3f504889f04889fa909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909090900000000000000000f001000000000000|@168,1048575,@18698|34,0,@821 99,0,@20033 248,0,@831 293,0,@833 334,0,@834 407,0,@835 10249:O4|0,@10250,3,1 10250:O1|@10251 10251:D3,64|483b65187303ff554848b9d8c019f1a37f0000488b095048b8289b1ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@840,1048575,@18701|11,0,@20171 25,0,@10252 10252:O4|0,@10253,2,2 10253:O1|@10254 10254:D3,664|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48ba282707c9a37f0000eb68488b10f6c10174064883e9027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b48be78c119f1a37f0000488b36504889d84889f2909090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9800100007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e48bf78c119f1a37f0000488b3f504889f04889fa90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8b08b1ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8e08b1ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c39090909090909000000000000000009002000000000000|@168,1048575,@18700|34,0,@847 99,0,@20181 197,0,@20181 244,0,@850 289,0,@833 330,0,@10199 371,0,@833 412,0,@834 485,0,@833 526,0,@10201 567,0,@862 10255:O2|3,@10256 10256:S5|737472203d 10257:O2|3,@10258 10258:S8|7369674c6f63203d 10259:O2|3,@10260 10260:S11|6f7061717565496473203d 10261:O2|3,@10262 10262:S8|6f7061717565203d 10263:O2|3,@10264 10264:S19|6d61746368546f436f6e73747261696e74203d 10265:O2|3,@10266 10266:S6|63736967203d 10267:O5|0,0,0,@10269,@10268 10268:O2|@10272,0 10269:O2|@10270,0 10270:O2|0,@10271 10271:O5|@9315,169,169,0,0 10272:O2|3,@10273 10273:S13|536967436f6e73747261696e74 10274:D3,40|483b65187303ff5548488b5208488b12ff2290909090909000000000000000002000000000000000|@10106,1048575,@18702| 10275:D3,160|483b65187303ff554848b9d8c019f1a37f0000488b09498d5fe8483b5d107303ff55404989df48c743f80200000048be50a11ec9a37f0000488933488b520848895308488063ffbf4889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180500000048c74010050000004889580848c70001000000524889ca9090ff124889c1584889caff229000000000000000009800000000000000|@840,1048575,@18704|11,0,@20171 48,0,@10276 10276:D3,504|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bac01607c9a37f0000eb68488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0b48890e48bfb8b019f1a37f0000488b3f52504889f04889fa9090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9e00000007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e488b3c24488b7f084883c408488b3f504889f04889fa909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909090900000000000000000f001000000000000|@168,1048575,@18703|34,0,@821 99,0,@20033 248,0,@831 293,0,@833 334,0,@834 407,0,@835 10277:O2|3,@10278 10278:S15|6d61746368546f526573756c74203d 10279:O2|3,@10280 10280:S7|616c697374203d 10281:O5|0,0,0,@10283,@10282 10282:O2|@10286,0 10283:O2|@10284,0 10284:O2|0,@10285 10285:O5|@9315,143,143,0,0 10286:O2|3,@10287 10287:S9|537472756374446563 10288:O4|0,@10289,3,1 10289:O1|@10290 10290:D3,64|483b65187303ff554848b998b019f1a37f0000488b095048b858a51ec9a37f00004889caff124889c1584889caff229000000000000000003800000000000000|@1968,1048575,@18706|11,0,@20031 25,0,@10291 10291:O4|0,@10292,3,1 10292:O1|@10293 10293:D3,48|483b65187303ff554848b9b8c119f1a37f0000488b094889caff22909090909000000000000000002800000000000000|@10130,1048575,@18705|11,0,@20185 10294:O5|0,0,0,@10296,@10295 10295:O2|@10299,0 10296:O2|@10297,0 10297:O2|0,@10298 10298:O5|@9315,136,136,0,0 10299:O2|3,@10300 10300:S14|5374727563747572654964656e74 10301:S17|7072696e742d73747275637456616c7565 10302:O3|@10303,@20189,@20167 10303:D3,2952|483b65187303ff5548488b4808f6c10174084883f9037d13eb06f641ff10740b48b8707907c9a37f0000c3488b1848833b017568f6c10174064883e9027105ff5570ebf5f6c10174084883f9017d14eb06f641ff10740c48b9282707c9a37f0000eb6f4889ce40f6c60174064883ee027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048897708488b7308488937eb05e91b03000049b8d8c019f1a37f00004d8b004d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049bac0b21ec9a37f0000eb05e9e50100004d8911488b520849895108498061ffbf498d47d8483b45107303ff55404989c748c740f80400000048c740180500000048c74010050000004c89480848c70001000000ff731051574c89c29090ff124889c1584889ca909090ff1259f6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a48b9b8c119f1a37f0000488b09504889d04889ca90ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8e0b41ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b820b51ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958b51ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3488b700840f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c348833b03756940f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48ba282707c9a37f0000eb694889f2f6c20174064883ea027105ff5570ebf5498d7fe8483b7d107303ff55404989ff48c747f80200000048895708488b5308488917eb05e9aa02000049b828c119f1a37f00004d8b00ff7310564889f84c89c29090ff1259f6c10174064883e902710cff5570eb05e979010000ebee498d57e8483b55107303ff55404989d748c742f80200000048894a085948890a48b9b8b019f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b838b61ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b870b61ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9a8b61ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c340f6c60174084883fe037d13eb06f646ff10740b48b8707907c9a37f0000c340f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d14eb06f646ff10740c48ba282707c9a37f0000eb5f4889f740f6c70174064883ef027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000049897808488b7b08498938488b5210488b12ff731056ff73184c89c0909090ff12488b4c2408f6c101740d4883f9037d19eb0be9c2020000f641ff10740c48b9282707c9a37f0000eb6cf6c10174064883e9027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0c2448890a48b9e8c119f1a37f0000488b09504889d04889ca9090ff12488b4c2410f6c10174064883e9027105ff5570ebf5498d57e8483b5510730aeb05e976010000ff55404989d748c742f80200000048894a08488b4c241848890a48b948c119f1a37f0000488b09504889d04889ca9090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba702707c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b888b71ec9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f00004889014889c8498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8c0b71ec9a37f0000488901eb0150498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8781b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0848b8f8b71ec9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b02807c9a37f0000488908498d4fa0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080300000048c70101000000488d413048c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b8781b07c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b930b81ec9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c390909090900000000000000000800b000000000000|@10340,1048575,@18709|34,0,@1326 89,0,@847 163,0,@20171 200,0,@10304 357,0,@20185 404,0,@850 449,0,@833 490,0,@10305 531,0,@833 572,0,@834 645,0,@833 689,0,@10307 730,0,@862 841,0,@833 882,0,@10309 982,0,@1326 1036,0,@847 1109,0,@20176 1192,0,@20033 1240,0,@850 1285,0,@833 1326,0,@10316 1367,0,@833 1408,0,@834 1481,0,@833 1522,0,@10318 1563,0,@862 1674,0,@833 1715,0,@10320 1811,0,@1326 1859,0,@847 1977,0,@847 2040,0,@20188 2128,0,@20178 2176,0,@850 2221,0,@833 2262,0,@10327 2303,0,@833 2344,0,@834 2417,0,@833 2461,0,@10329 2505,0,@833 2546,0,@834 2623,0,@833 2664,0,@10331 2705,0,@862 2816,0,@833 2857,0,@10333 10304:D3,504|483b65187303ff5548488b4808f6c10174084883f9017d14eb06f641ff10740c48bac01607c9a37f0000eb68488b18f6c10174064883e9027105ff5570ebf5498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0b48890e48bfb8b019f1a37f0000488b3f52504889f04889fa9090ff12488b0c24488b11488b59084883c408f6c301740d4883eb02eb05e9e00000007105ff5570ebee498d77e8483b75107303ff55404989f748c746f80200000048895e08488b5a0848891e488b3c24488b7f084883c408488b3f504889f04889fa909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048ba481b07c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8981b07c9a37f0000488901498d57e8483b55107303ff55404989d748c742f80200000048894a0858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848b9b01b07c9a37f00004889084889c1498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080300000048c70001000000c3909090909090900000000000000000f001000000000000|@168,1048575,@18708|34,0,@821 99,0,@20033 248,0,@831 293,0,@833 334,0,@834 407,0,@835 10305:O2|3,@10306 10306:S17|736f75726365537472756374757265203d 10307:O2|3,@10308 10308:S15|636f6e74656e74734d61746368203d 10309:O5|0,0,0,@10311,@10310 10310:O2|@10314,0 10311:O2|@10312,0 10312:O2|0,@10313 10313:O5|@9315,121,121,0,0 10314:O2|3,@10315 10315:S14|5374727563747572654d61746368 10316:O2|3,@10317 10317:S12|736f7572636549644e6f203d 10318:O2|3,@10319 10319:S12|6973457175616c697479203d 10320:O5|0,0,0,@10322,@10321 10321:O2|@10325,0 10322:O2|@10323,0 10323:O2|0,@10324 10324:O5|@9315,123,123,0,0 10325:O2|3,@10326 10326:S11|5479706549644d61746368 10327:O2|3,@10328 10328:S12|74617267657454797065203d 10329:O2|3,@10330 10330:S13|736f7572636556616c7565203d 10331:O2|3,@10332 10332:S10|636f657263696f6e203d 10333:O5|0,0,0,@10335,@10334 10334:O2|@10338,0 10335:O2|@10336,0 10336:O2|0,@10337 10337:O5|@9315,119,119,0,0 10338:O2|3,@10339 10339:S10|56616c75654d61746368 10340:S19|7072696e742d76616c75654d61746368696e67 10341:D3,48|483b65187303ff5548488b5808488b084889c8488b5208ff229090909090909000000000000000002800000000000000|@10342,1048575,@18710| 10342:S33|535452554354555245535f28292e7374727563744578706f727454726565283129 10343:D10,664|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bec0bc1ec9a37f000048893148895908488061ffbf498d77e8483b75107303ff55404989f748c746f80200000048894e0848c7061300000040f6c60174154889c148b8f86f07c9a37f0000488b5d089090ff134889d74989d94989c24989f34d8b4210498b5a08498b02ff151e020000498d4fc0483b4d107303ff55404989cf48c741f802000000488941084c8919488d411848c740f80400000048ba60bd1ec9a37f0000488910488978084c8950104c894818488060ffbf49833903756f498d57d8483b55107303ff55404989d748c742f801000000488902488d421048c740f80200000048895008488b7f0848893849837908017506498b5110eb1f4889ce4889c7498b5908498b41109090ff15820100004889c24889f84889f14889cf4889c34889d0ff1572010000eb05e9380000004883ff01740b4889fb9090ff15620100004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49184c8908c34983390175496a016a014989e0498b59084c89d048baa0fb18c9a37f000090ff151e010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c3498d57e8483b55107303ff55404989d748c742f80200000048bbf8bd1ec9a37f000048891a488b7f1048897a08488062ffbf498d5fd8483b5d107303ff55404989df48c743f801000000488903488d431048c740f802000000488958084889104889cf4889c3498b41109090ff158a0000004883ff01740a4889fb90ff15820000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084d8b49084c8908c390909000000000000000009002000000000000|@10362,1048575,@18719,@9003,@10363,@9025,@10364,@8943,@9025,@10361|35,0,@10344 101,0,@1294 191,0,@10346 419,0,@8280 502,0,@10348 10344:D4,48|483b65187303ff55484889c3488b420848ba60a018c9a37f0000ff252800000000000000000000002800000000000000|@10345,2097151,@18711,@8150|18,0,@8147 10345:S48|535452554354555245535f28292e7374727563744578706f727454726565283229636f6d6d6f6e50726f70732d283129 10346:D3,48|483b65187303ff5548488b5a18488b4210488b4a084889caff2290909090909000000000000000002800000000000000|@10347,1048575,@18712| 10347:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296173506172656e74283129 10348:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@10359,2047,@18717,@10349| 10349:D4,592|483b65187303ff55486a016a0148837b2003755e488b4b10488339057554488b5108498d77d0483b75107303ff55404989f748c746f803000000488b7a1848897e104c8b4a104c894e084c8b52084c89164c8d5e2049c743f8010000004989334889e64c891e4889e64c8b1a4c895e08eb154889e148c701010000004889e1488b531048895108498d4fd8483b4d107303ff55404989cf48c741f80400000048bad8c01ec9a37f000048891148894108488959104c894118488061ffbf498d57d0483b55107303ff55404989d748c742f805000000c642ff4048be98c11ec9a37f000048893248c742080100000048894a10488b34244889721848c7422001000000498d7fc0483b7d107303ff55404989ff48c747f807000000c647ff4049b9d8c21ec9a37f00004c890f4c8947084c8b4c24084c894f1048894f184889572048c7472801000000488977304d8d57c04c3b55107303ff55404d89d749c742f80700000049bbc8c31ec9a37f00004d891a4c8b5b084d895a084c8b63284d89621049894a1849897a204989522849897230498062ffbf4c895728488067ffbf4c89520848897a20488062ffbf498d4fe8483b4d107303ff55404989cf48c741f8020000004c89510848c70109000000f6c10174154889c248b8f86f07c9a37f0000488b5d089090ff13488b3b4989c94c8b40104883c410488b5808488b084889c8909090ff155e000000498d4fd0483b4d107303ff55404989cf48c741f802000000488941084c8909488d411848c740f80200000048894808488938c390909000000000000000004802000000000000|@10360,2047,@18718,@9003|161,0,@10350 219,0,@10353 288,0,@10355 358,0,@10357 473,0,@1294 10350:D3,56|483b65187303ff55484c8b4218488b5a10488b420848ba38c11ec9a37f0000ff229090909090909000000000000000003000000000000000|@10352,1048575,@18713|23,0,@10351 10351:O1|@10349 10352:S57|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296578706f727454686973283129 10353:D4,192|483b65187303ff5548498d47f0483b45107303ff55404989c748c740f801000000488b4a2048890848837a180175164889c348b8386208c9a37f0000488b5d08909090ff13488b5a18488b33498d7fc0483b7d107303ff55404989ff48c747f8010000004c8b42104c89074c8d4f1049c741f8010000004c8b52084d89114d8d591049c743f8030000004d894b1049897b08498903488b1e4c89d848baf0bb1dc9a37f0000ff252d00000090909090900000000000000000b800000000000000|@10354,1023,@18714,@9988|52,0,@1662 157,0,@9986 10354:S59|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229676574536967537472756374283129 10355:D3,128|483b65187303ff5548f64230017406488b4228eb04488b4220498d4fc0483b4d107303ff55404989cf48c741f801000000488b5a18488919488d711048c746f801000000488906488d461048c740f803000000488970104889480848c70001000000488b5a10488b4a084889caff229000000000000000007800000000000000|@10356,1048575,@18715| 10356:S55|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f7274534228322967657456616c7565283129 10357:D4,136|483b65187303ff554848837a30017406488b4228eb04488b4220498d4fc0483b4d107303ff55404989cf48c741f801000000488b5a18488919488d711048c746f801000000488906488d461048c740f80300000048c74010010000004889480848893049c7c1010000004c8b4210488b5a08ff252800000000000000000000008000000000000000|@10358,511,@18716,@8997| 10358:S54|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f727453422832296765744e616d65283129 10359:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283129 10360:S44|535452554354555245535f28292e7374727563744578706f7274547265652832296578706f72745342283229 10361:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18722| 10362:S33|535452554354555245535f28292e7374727563744578706f727454726565283229 10363:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18720| 10364:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18721| 10365:D4,64|483b65187303ff55485248c7c001000000488b4a104889caff12488b0c24488b59084883c408ff252c0000009090909000000000000000003800000000000000|@10373,2097151,@18724,@10366| 10366:D10,368|483b65187303ff55486a016a016a016a016a016a01488b1b48b940c91ec9a37f000050f6c3017525ff73084c8b442408488b034889cb9090ff154a0100004889c15b483b65187303ff5548ebd6488b4108488d542408488b1848891a488d542408488b700848897208488d542408488b781048897a10488d5424084c8b40184c894218488d5424084c8b48204c894a20488d5424084c8b50284c89522848c7c3010000004883c40858909090ff15de0000004989c248c7c301000000488b442408909090ff15ce0000004989c348c7c301000000488b442420909090ff15be0000004989c448c7c301000000488b442410909090ff15ae0000004989c548c7c301000000584883c410909090ff159e0000004989c648c7c301000000584883c408909090ff158e0000004889c1498d47c8483b45107303ff55404989c748c740f8060000004c896028488948204c8968184c8958104c8970084c8910c390909000000000000000006801000000000000|@10375,2097151,@18725,@10376,@10374,@10374,@10374,@10374,@10374,@10374|26,0,@10367 10367:O4|0,@7984,0,@10368 10368:O1|@10369 10369:D3,40|48b8c8c91ec9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@10372,1,@18723|2,0,@10370 10370:O4|11,@42,0,@10371 10371:O5|@9315,3255,0,3255,0 10372:S39|535452554354555245535f28292e706173733453747275637473283229726573756c742d283129 10373:S45|434f4d50494c45525f424f445928292e62617365436f6d70696c657228332965786563757465436f6465283129 10374:D4,104|483b65187303ff5548a8017540488b084989d84989c9488b19488b4008909090ff155a000000498d4fe8483b4d107303ff55404989cf48c741f8020000004c8941084c89094889cbe9b3ffffff4889d8c39090909090909000000000000000006000000000000000|@10418,255,@18749,@10417| 10375:S29|535452554354555245535f28292e706173733453747275637473283229 10376:D8,1504|483b65187303ff5548488b4b0848833803756fff7318ff7310ff33ff7128ff7118ff7110ff7108ff31ff7120488b5c2440488b4008909090ff15ba05000048833c2401740d488b1c24909090ff15ae050000498d4fc8483b4d107303ff55404989cf48c741f806000000488b5424284883c4084889512848894120488b442418eb05e95500000048894118488b44241048894110488b44240848894108584883c420488901498d47d8483b45107303ff55404989c748c740f804000000488b54241048895018488b5424084889501048894808594883c410488908c3488338017569498d57e8483b55107303ff55404989d748c742f802000000488b711848897208488b3b48893a6a016a01488b4008ff7318ff7310ff7128ff7110ff7108ff31ff71204150a8017532ff70084c8b4c24404c8b4424084889d3488b00909090ff15c20400004889c2eb05e99f00000058483b65187303ff5548ebca488d442440488b0a488908488d442440488b5a0848895808498d47a0483b45107303ff55404989c748c740f806000000488b7424284883c408488970285e48897020488b74243848897018488b74241048897010488b742408488970085e4883c4184889304889c6488d403848c740f804000000488b7c2408488978185f4883c40848897810488970085e4883c408488930c3488b5010488b12498d77e8483b75107303ff55404989f748c746f80200000048c7460801000000488b3b48893e6a016a01ff7318ff73104150ff7008ff7308f6c2017555488b02488b480848833901741148b890d11ec9a37f0000488b5d0890ff13488b5c241048833b057531ff7208ff7608ff36ff7010ff7108ff711049c7c001000000488b5c2418488b4424409090ff158a030000eb4ae93f010000488b7810498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004c8b064c8940104889580848c7000d000000ff7208ff7608415057ff7108ff7110498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b0424488338037509488b4008488b00eb04488b4008498d57f0483b55107303ff55404989d748c742f801000000c642ff40488902498d47b8483b45107303ff55404989c748c740f80400000048c74018010000004883c4085b488958104889500848c70003000000488d502848c742f8030000005b48895a104889420848890a58a80174064883c0027105ff5570ebf5498d4fd0483b4d107303ff55404989cf48c741f8020000005b48895908488911488d511848c742f80200000048894a084889024889d65a483b65187303ff5548e962feffff488d442428488b0e488908488d442428488b56084889500848837c243001750c48b8909adc0000000000eb6d48c7c001000000488b5c2430f6c301751ea80174064883c0027105ff5570ebf5488b5b08483b65187303ff5548ebdda801740b483b05a60100007d08eb1bf640ff1075154889c348b818930ec9a37f0000488b5d089090ff134889c148c7c001000000488d3c8d04000000eb05e96a00000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48c7c001000000488b4c24304883f9017429488b1948895c87fca80174064883c0027105ff5570ebf5488b59084889d9483b65187303ff5548ebd1488067ffbf4889f8498d4fd8483b4d107303ff55404989cf48c741f80400000048bbe8d11ec9a37f0000488919488b5c24204889590848894110488b5c241848895918488061ffbf498d7fe8483b7d107303ff55404989ff48c747f80200000041584c8947084c8b4424204c89076a016a0151504c8b5424284c8d4c24104989f84889cb488b442420909090ff15ba0000005948b8ffffffffffffff00482341f8488d440001a8017412f644242801740b488d40ff48034424287105ff5570ebf04889c1498d47d8483b45107303ff55404989c748c740f8040000005a4889501848894810488b4c240848894808594883c438488908c390909090900000000000000000d005000000000000ffffffffffffff01|@10382,2097151,@18727,@10383,@10389,@10390,@2178,@10381|578,0,@10377 1006,0,I49 1089,0,@4361 1262,0,@10379 1377,0,36028797018963967 10377:O4|@20055,@557,@9854,@10378 10378:O5|@9315,3162,0,3162,0 10379:D3,144|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001a801741c488b5a1048b9ffffffffffffff0048234bf8488d4c0901483bc172164889c148b8b0df06c9a37f0000488b5d08909090ff13488b4483fcc3909090909000000000000000008800000000000000|@10380,1048575,@18726|73,0,36028797018963967 100,0,@560 10380:S58|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296d617054797065496473283129 10381:D5,528|483b65187303ff5548498b480848833801755d488b4010488b005341514152a801752eff70084c8b4c24184c89c14c8b4424084889cb488b00909090ff15e60100004989c058483b65187303ff5548ebce488b442408498b08488908498b50084889500848c7c0010000004883c418c3488338037565488b40085341514152a801755d6a016a01ff70084c8b5424184c8d4c2408488b5c2428488b0090e85effffff498d47e8483b45107303ff55404989c748c740f802000000488b4c241048894808488b4c24084889084989c0584883c410483b6518730feb0ae929000000e905000000ff5548eb95488b442408498b08488908498b50084889500848c7c0010000004883c418c3498d57e8483b55107303ff55404989d748c742f802000000488b712848897208498b3848893a6a016a01488b40105341514152ff7120ff7118ff7110ff7108ff31a801752bff70084c8b4c24404c8b4424304889d3488b00909090ff15c60000004889c258483b65187303ff5548ebd1488d442440488b0a488908488d442440488b5a0848895808498d47c8483b45107303ff55404989c748c740f806000000488b74244848897028488b74242048897020488b74241848897018488b74241048897010488b742408488970085e4883c428488930488b3424488b7c241048893e4889460848c7c0010000004883c420c390909090909000000000000000000802000000000000|@10399,2097151,@18739,@10400,@10397| 10382:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229 10383:D4,160|483b65187303ff5548a801756e488b08488b5110488b124989dd4c8b7008ff71084c89eb4889d090ff158a000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901514c89eb4c89f0e8a6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb05e90500000059488908c348c7c001000000c390909000000000000000009800000000000000|@1363,8191,@18730,@10384| 10384:D3,432|498d4fd8483b4d107303ff55404989cf48c741f80400000048ba20d81ec9a37f000048891148895908488b501048895110488b582848895918488061ffbf498d77e0483b75107303ff55404989f748c746f80300000048bf38d91ec9a37f000048893e488b782048897e0848894e10488066ffbf488b084883390375684c8b41084d8b004c8b49184d8b094d8b114983fa01750c49b9909adc0000000000eb6e4c89d1488b78184c8b580848c7c0010000004989fc488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348abeb05e96e0000005f4889f04c89ce4889f94889cf4989c94c89d148d1e94883c608f348a5488d7c3f01eb05e914000000488d743601488d4c0901498061ffbf4889c6eb084c8b60184c8b5808498d47e0483b45107303ff55404989c748c740f8030000004c8948104c89400848c70001000000eb11488b78184c8b40084889c84989fc4d89c34889c1498d47c8483b45107303ff55404989c748c740f80600000048895828488970204c896018488950104c895808488908c3909090900000000000000000a801000000000000|@10388,2047,@18731|26,0,@10385 88,0,@10387 150,0,I49 10385:D3,152|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001488b5210f6c20174154889c148b8c0e406c9a37f0000488b5d089090ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbe90909000000000000000009000000000000000|@10386,1048575,@18728|77,0,@578 10386:S70|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e61747572652831296d6170494473283129 10387:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18729,@1542| 10388:S61|535452554354555245535f28292e70617373345374727563747328322965787472616374546f70446563283229636f70795369676e6174757265283129 10389:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18732| 10390:D4,1208|483b65187303ff5548498338057525ff7308ff7018ff334151ff70284c89c049c7c001000000488b5c241090ff159e040000eb42488b4818488b5028498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b33488970104c89400848c7000d000000ff7308515641515259488b094883f90175154889c248b8386208c9a37f0000488b5d089090ff13488b11488b1a488b7310498d7fd8483b7d107303ff55404989ff48c747f80400000049b848df1ec9a37f00004c89074c8b04244c8947084c8b4e104c894f104c8b56284c895718488067ffbf4d8d5fe04c3b5d107303ff55404d89df49c743f80300000049bc68e01ec9a37f00004d89234c8b66204d89630849897b10498063ffbf488b3e48833f0375684c8b6f084d8b6d004c8b77184d8b364d8b064983f801750c49b8909adc0000000000eb6e4c89c15048c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b4618488b4e08eb05e96c0000004c89f64989fc4c89e74989ce4c89c148d1e94883c608f348a5488d7c3f01488d743601eb05e910000000488d4c090149806424ffbf4d89e0eb0950488b46184c8b7608498d4fe0483b4d107303ff55404989cf48c741f8030000004c8941104c89690848c70101000000eb0c4889f950488b46184c8b7608498db760ffffff483b75107303ff55404989f748c746f8060000004c8956284c895e20488946184c894e104c89760848890e488d463848c740f804000000488b4b184889481848897010488b730848897008488b3b4889384c8b42184c8d582849c743f80700000049bcc0e01ec9a37f00004d89234d8b60104d8963084d8b68284d896b1049897b184d894b204d8953284c8b4c24084d894b30498063ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049ba00e31ec9a37f00004d89114d8b50204d8951084d895910498061ffbf4d8b1849833b0375694d8b73084d8b36498b7b18488b3f488b374883fe01750c48be909adc0000000000eb6d4889f14889c348c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4889f05e4889f9eb05e9630000004889cf514889c148d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e913000000488b0424488060ffbf4889c64883c4084889d8498d4fe0483b4d107303ff55404989cf48c741f803000000488971104c89710848c70101000000eb034c89d9498d5fb0483b5d107303ff55404989df48c743f8060000004c896b284c894b20498b7018488973184c896310498b780848897b0848890b488d4b3848c741f80200000041594883c4084c89490848c701030000004d8d4fd04c3b4d107303ff55404d89cf49c741f8050000004c8b72204d8971204989591849894910488b4a084989490849890158a80174064883c0027105ff5570ebf5498d5fe8483b5d107303ff55404989df48c743f8020000004c894b0841594c890b4d8d4fd04c3b4d107303ff55404d89cf49c741f80200000059498949084989194889c1498d411848c740f8020000004c894808488908c390900000000000000000b004000000000000|@10396,1048575,@18737,@2178|133,0,@1662 185,0,@10391 251,0,@10393 314,0,I49 623,0,@10394 702,0,@10395 764,0,I49 10391:D3,152|483b65187303ff5548a801740ef64218017408483b42187d0deb05ff5570ebf3488b5208ff22a801740cf64218017406482b42187105ff5570ebf54883c001488b5210f6c20174154889c148b8c0e406c9a37f0000488b5d089090ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebbe90909000000000000000009000000000000000|@10392,1048575,@18733|77,0,@578 10392:S75|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e642832296e65774d6170283129 10393:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18734,@1542| 10394:D6,512|483b65187303ff5548a801740ef64210017408483b42107c64eb05ff5570ebf3a801740cf64210017406482b42107105ff5570ebf54883c001488b5208f6c20174134889c148b8c0e406c9a37f0000488b5d08ff134883f8017504488b02c3a80174064883e8027105ff5570ebf5488b5208483b65187303ff5548ebc0a801740ef64228017408483b42287c6aeb05ff5570ebf3a801740cf64228017406482b42287105ff5570ebf54883c0016a016a016a01488b4a20f6c10174154889c348b8c0e406c9a37f0000488b5d089090ff134883f801752b488b014889e3488b304889334889e3488b780848897b084889e34c8b4010eb05e9eb0000004c894310eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548eb97488b5c24104c8b4a184c3b0de8000000743341f6c10175324c89ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017505488b0beb2d4c8b53104c8b5b084c8b2348c7c35d0000004c89c890ff159a0000004c89e3909090ff15960000004889c1eb084c8b53104c8b5b08498d47c0483b45107303ff55404989c748c740f8030000004c8950104c8958084889084889c1488d402048c740f80300000048894810488b4c240848894808594883c410488908c3488b5230ff229090900000000000000000f801000000000000|@10392,1048575,@18735,I48,@100,@100|71,0,@578 193,0,@578 317,0,I48 10395:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18736,@1542| 10396:S66|535452554354555245535f28292e70617373345374727563747328322965787472616374546f704465632832296578747261637446756e63746f7242696e64283229 10397:D4,720|483b65187303ff5548498338057529ff7308ff7008ff30ff334151ff70184c89c049c7c001000000488b5c2410909090ff15b2020000eb46488b4808488b10488b7018498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b3b488978104c89400848c7000d000000ff730851525741515659488b094883f90175154889c248b8386208c9a37f0000488b5d089090ff13488b09488b5110498d5fe0483b5d107303ff55404989df48c743f80300000048beb0e61ec9a37f0000488933488b7220488973085f48897b10488063ffbf488b3a48833f03756a4c8b47084d8b004c8b4f184d8b094d8b114983fa01750c49b9909adc0000000000eb6f4c89d14989c348c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89ce4889f84889c7eb05e9570000004c89d148d1e94883c608f348a5488d7c3f01488d743601488d4c0901488060ffbfeb05e9060000004989c14c89d8498d4fe0483b4d107303ff55404989cf48c741f8030000004c8949104c89410848c70101000000eb034889f9498d77c8483b75107303ff55404989f748c746f80600000048c746280100000048895e20488b5a1848895e1848c7461001000000488b7a0848897e0848890e59f6c10174064883c1027105ff5570ebf54d8d47e84c3b45107303ff55404d89c749c740f80200000041594d89480849c700010000004d8d8f60ffffff4c3b4d107303ff55404d89cf49c741f80200000049c74108010000004d89014d8d411849c740f8020000004989400849c70003000000498d401848c740f8040000004c894818488970104c894008488b34244889304c8d402849c740f80200000049894008498930498d401848c740f8020000004883c4085e488970084c89004889c6488d401848c740f80200000048897008488908c30000000000000000c802000000000000|@10416,1048575,@18748,@2178|141,0,@1662 190,0,@10398 253,0,I49 10398:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18738,@1542| 10399:S45|535452554354555245535f28292e70617373345374727563747328322965787472616374537472756374283329 10400:D10,2336|483b65187303ff5548488338057566488b4808488b5308498d77e8483b75107303ff55404989f748c746f80200000048c7460801000000488b3b48893e6a016a014c8b5108ff7228ff7220ff7218ff7210ff32ff7208ff314151415041f6c201756b498b02488b0c2448833905753541ff7208eb05e978020000ff7608ff36ff7020ff7018ff7008ff3049c7c001000000488b5c24204889c8909090ff1596080000eb56488b5020488b5818488b78084c8b00498d47d8483b45107303ff55404989c748c740f804000000eb05e91901000048c74018010000004c8b0e4c8948104889480848c7000d00000041ff7208ff760841515253574150498d4fa8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f80700000048c740300100000048c7402801000000488b54241848895020488b5424104889501848894810488b4c240848894808594883c41848890859f6c10174064883c1027105ff5570ebf5498d57e8483b55107303ff55404989d748c742f80200000048c74208010000004889024883fa017506488b0424eb154889ce4889d3488b04249090ff158e0700004889f1498d57e8483b55107303ff55404989d748c742f8020000004889420848890a4889d64883c408415a483b65187303ff5548e971feffff488d442448488b0e488908488d442448488b560848895008498d47e8483b45107303ff55404989c748c740f802000000488b5c24504883c40848895808488b5c240848891849b8509adc00000000005b90ff1506070000596a016a014989c34889e3488b01ff15fa060000498d47e8483b45107303ff55404989c748c740f8020000004c8958084883c40859488908498d4f98483b4d107303ff55404989cf48c741f8020000005a48895108488901488d411848c740f806000000488b54242048895028488b54241848895020488b54241048895018488b5424084889501048894808594883c4204889084889c1488d403848c740f80200000048894808594883c408488908c348833801756f498d4f80483b4d107303ff55404989cf48c741f802000000488b501048895108488b7008488931488b7b084c8d411849c740f8020000004c8b0f4d894808498908498d481848c741f8060000004c8b57284c8951284c8b5f204c8959204c8b67184c8961184c8b6f104c896910eb05e9220000004c8b77084c8971084c8901488d413848c740f80200000048894808488b0b488908c3488338037566488b4b08488b5008488b7210498d7fe0483b7d107303ff55404989ff48c747f80300000049bac8f01ec9a37f00004c89174c8b56204c8957084c894f10488067ffbf4c8b0e4983390375644d8b59084d8b1b4d8b61184d8b24244d8b2c244983fd017513eb05e9a302000049bc909adc0000000000eb6f4c8b7120ff7118ff7110ff7108ff31ff71284c89e948c7c00100000057488d3c8d0400000048f7df4903ff483b7d107205493bff720aeb05e99b000000ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b4618488b4e084c89e64989f94c89cf4989ca4c89e948d1e9eb05e9200000004883c608f348a5488d7c3f01488d743601488d4c0901498061ffbf4d89cceb1bff7118ff7110ff7108ff31ff712857488b46184c8b56084c8b7120498d4fe0483b4d107303ff55404989cf48c741f8030000004c8961104c89590848c70101000000eb2a4c8b59204c8b61184c8b69104c8b7108415441554156ff31ff71284c89c957488b46184c8b56084d89de498d77c8483b75107303ff55404989f748c746f80600000048c74628010000005f48897e204889461848c74610010000004c89560848890e4983380575214156ff32ff3356524c89c049c7c001000000488b5c24109090ff15ee030000eb39498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b0b488948104c89400848c7000d0000004156ff32515652498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c7010300000058488d511848c742f804000000488b401848894218584889421048894a08488b44240848890259f6c10174064883c1027105ff5570ebf5498d5fd0483b5d107303ff55404989df48c743f80200000048895308488903488d431848c740f802000000488b5424104883c40848895008488918498d57c8483b55107303ff55404989d748c742f80600000048894228584883c40848894220488b44241848894218488b44241048894210488b44240848894208584883c418488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908c3488b4808488b5308488b711048833e07746949833805753a4151ff7228ff7220ff7218ff7208ff32ff7210ff31ff33ff7120ff7108ff71184c89c749c7c001000000488b5c24184889f8ff156e020000eb58498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b3b48897810eb05e94f0000004c89400848c7000d0000004151ff7228ff7220ff7218ff7208ff32ff7210ff3157ff7120ff7108ff7118498d77e8483b75107303ff55404989f748c746f8020000004889460848c70603000000eb204151ff7228ff7220ff7218ff7208ff32ff7210ff31ff33ff7120ff7108ff7118498d47e8483b45107303ff55404989c748c740f80200000048b920f11ec9a37f0000488908488b4c245848894808488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048baf8f11ec9a37f000048891148894108488061ffbf564989c848bb18f41ec9a37f0000488b442408909090ff155a010000498d4fc0483b4d107303ff55404989cf48c741f80700000048c741300100000048c7412801000000488b5424184889512048894118584883c40848894110584883c40848894108488b4424084889015af6c20174064883c2027105ff5570ebf5498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488903488d431848c740f8020000004883c4085948894808488918498d4fc8483b4d107303ff55404989cf48c741f806000000488b5c242048895928488b5c241848895920488b5c24104889591848894110488b44240848894108584883c428488901498d47e8483b45107303ff55404989c748c740f80200000048894808488910c390909000000000000000001809000000000000|@10415,2097151,@18746,@2178,@10414,@8391,@1348,@2178,@2178,@1390|562,0,I48 954,0,@10401 1025,0,I49 1963,0,@10402 2014,0,@10404 2040,0,@10411 10401:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@18740,@1542| 10402:D3,88|483b65187303ff5548488b480848833901752a488b4118488b520890ff124889c1498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c390909000000000000000005000000000000000|@10403,1048575,@18741| 10403:S69|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129636f70794964283129 10404:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9a8f21ec9a37f000049b860f31ec9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@10410,2097151,@18744,@1554|28,0,@10405 38,0,@10408 10405:O1|@10406 10406:D3,24|c39090909090909000000000000000001000000000000000|@10407,1,@18742| 10407:S84|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129283129 10408:O1|@10409 10409:D3,24|c39090909090909000000000000000001000000000000000|@10407,1,@18743| 10410:S81|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c61636554797065732831297265706c61636554797065436f6e73747273283129 10411:O1|@10412 10412:D3,24|c39090909090909000000000000000001000000000000000|@10413,1,@18745| 10413:S63|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833297265706c6163655479706573283129283129 10414:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18747| 10415:S56|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296d616b6544656373283229 10416:S68|535452554354555245535f28292e706173733453747275637473283229657874726163745374727563742833296578747261637453747275637475726542696e64283229 10417:D3,192|483b65187303ff5548a8017566488b08483b197463f6c3017545f601017540488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104889de488b394889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901743bff30488b4008e896ffffff4889c1498d47e8eb0ae92b000000e91d000000483b45107303ff55404989c748c740f8020000004889480859488908c3488b4008e95dffffff48c7c001000000c390909090900000000000000000b800000000000000|@260,63,@18750| 10418:S41|535452554354555245535f28292e70617373345374727563747328322972657646696c746572283229 10419:S30|434f4d50494c45525f424f445928292e636f6d70696c6572283329283129 10420:D9,656|483b65187303ff5548488b08ff3053f6c1017564488b01488338037460488338017537488b5008ff7108f6c2017551488b02ff7208488b48084889c848ba18fa1ec9a37f00009090ff155a0200005a483b65187303ff5548ebd0ff7108488b48084889c848ba30fa1ec9a37f00009090ff153a020000eb08e90f000000ff710859483b65187303ff5548eb8348c7c001000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba982a1fc9a37f000048891148894108488061ffbf6a016a01504989ca4c8b4c24184c8d442408488b5c242048b8382b1fc9a37f0000909090ff15aa010000488b44242048c7c101000000a8017537ff700851488b00909090ff159201000048833c2401740d488b1c24909090ff15860100004889c14883c40858483b65187303ff5548ebc54889c848c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff15ca000000eb034889c848837c240801742f4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b4c24084889480848c70015000000488b0c24488b09488b1424488b125b4883c4204889134889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488910c3909090909000000000000000008802000000000000|@10938,2097151,@19039,@10423,@10427,@10939,@12402,@10937,@2211|62,0,@10421 102,0,@10422 208,0,@10482 253,0,@10484 10421:O2|@10423,@10422 10422:O2|@10427,@10421 10423:D5,128|483b65187303ff554848833805750c488b4008488b00e9e5ffffff48833803752152ff7010488b4008e8d2ffffff488b442408488b5808584883c408ff255600000048833801750c488b4008488b00e9acffffff48833807750e488b5a08488b4008ff253800000048c7c001000000c300000000000000007800000000000000|@10425,1048575,@18752,@10426,@10424| 10424:D3,64|483b65187303ff5548a8017519ff3053488b400890e8e6ffffff488b4424085a4883c408ff2248c7c001000000c3909000000000000000003800000000000000|@1696,1048575,@18754| 10425:S53|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e53747275637456616c7565283129 10426:D3,64|483b65187303ff5548a8017519ff3053488b400890e8e6ffffff488b4424085a4883c408ff2248c7c001000000c3909000000000000000003800000000000000|@1696,1048575,@18753| 10427:D6,144|483b65187303ff554848833803752352ff70104889d3488b40089090ff1586000000488b5c2408584883c408ff257e00000048833801750a488b4008ff2576000000488b401052a8017523488b0c24488b10ff7008488b4210488b5108909090ff1258483b65187303ff5548ebd948c7c0010000004883c408c390909090909000000000000000008800000000000000|@10454,2097151,@18770,@10455,@10456,@10428| 10428:D15,1496|483b65187303ff5548488b0848ba06fd1ec9a37f0000488d548afcffe290e9fb000000909090e90a010000909090e915010000909090e925010000909090e957010000909090e971010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e952010000909090e977010000909090e99b010000909090e9c3020000909090e983000000909090e9e7020000909090e973000000909090e903030000909090e963000000909090e91b030000909090e953000000909090e948030000909090e955030000909090e93b000000909090e933000000909090e946030000909090e923000000909090e91b000000909090e957030000909090e9a7040000909090e90300000090909048c7c001000000c3488b400848bb48031fc9a37f0000488b00ff25bb040000ff7010488b400890e8befeffff58e9b8feffff488b4808ff7108488b01909090e8a6feffff58e9a0feffff488b4808ff7108488b01909090e88efeffff58a801751b488b08ff7008488b0190e87afeffff58483b65187303ff5548ebe148c7c001000000c3488b4808ff7108ff7110488b019090e852feffff589090e84afeffff58e944feffff488b4010e93bfeffff488b4008a801751d488b08ff7008488b01909090e822feffff58483b65187303ff5548ebdf48c7c001000000c3488b4010a801751c488b08ff7008488b019090e8f6fdffff58483b65187303ff5548ebe048c7c001000000c3488b58084889d8909090ff15ca03000048c7c10100000053a801751fff70084889cb488b0090ff15b60300004889c158483b65187303ff5548ebdd4889c8a801756e488b08488b5108488b12488b19498d77e0483b75107303ff55404989f748c746f803000000488b7b0848897e104c8b034c89460848c7060d0000004c8b48084889d09090ff155e03000041515648ba58031fc9a37f000090ff15520300004889c35848bab06507c9a37f0000eb05e92d00000090ff153e0300004883f801741148b8601c1fc9a37f0000488b5d0890ff1358483b65187303ff5548e95cffffff48c7c00100000058a801753a488b08488b5108ff7008f6c201751f488b02ff7208488b48084889c890e8d2fcffff5a483b65187303ff5548ebdc58483b65187303ff5548ebc248c7c001000000c3ff7010488b4008e8a6fcffff58a801751b488b08ff7008488b0190e892fcffff58483b65187303ff5548ebe148c7c001000000c3488b4018a801751c488b08ff7008488b411890e866fcffff58483b65187303ff5548ebe048c7c001000000c3488b4010a8017518ff7008488b0090e83efcffff58483b65187303ff5548ebe448c7c001000000c3488b4808488b11ff7108f6c201751d488b02ff7208488b084889c8e80afcffff5a483b65187303ff5548ebde48bb48031fc9a37f000058ff250d020000ff7010488b4008909090e8defbffff58e9d8fbffff488b4008e9cffbffff488b4008a8017519ff7008488b009090e8bafbffff58483b65187303ff5548ebe348c7c001000000c3488b480848c7c201000000ff7008f6c101753f488b01488b5818488b1b4883fa01741a488b71084889df4889d34889f89090ff15960100004889c3eb04488b71084889da4889f1483b65187303ff5548ebbc4889d048c7c101000000a801751fff70084889cb488b0090ff15660100004889c158483b65187303ff5548ebdd4889c8a801756e488b08488b5108488b12488b19498d77e0483b75107303ff55404989f748c746f803000000488b7b0848897e104c8b034c89460848c7060d0000004c8b48084889d09090ff150e01000041515648ba58031fc9a37f000090ff15020100004889c35848bab06507c9a37f0000eb05e92d00000090ff15ee0000004883f801741148b8601c1fc9a37f0000488b5d0890ff1358483b65187303ff5548e95cffffff48c7c00100000058a801751e488b08ff7008488b4108909090e862faffff58483b65187303ff5548ebde48c7c001000000c3ff7008488b4010e842faffff58e93cfaffff909090900000000000000000d005000000000000|@10458,2097151,@18773,@10459,@10460,@10461,@10457,@10431,@1633,@10480,@10481,@10461,@10457,@10431,@1633|14,0,$10428+30 292,0,@10429 687,0,@10430 708,0,@1292 738,0,@10451 1028,0,@10429 1327,0,@10430 1348,0,@1292 1378,0,@10451 10429:O1|@10428 10430:O2|@10431,@2241 10431:D13,2040|483b65187303ff5548a8017567488b0852ff70084883390b755f488b4118488b5010488b5a0848833b05756e48833b05741348b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b59084889f0ff15b6070000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae961070000e94800000048bae00b1fc9a37f000048891148894108488061ffbf6a016a01eb05e9220000004989e04889cb4889f8ff156a070000594883c408483b65187303ff5548e953ffffff4889c8eb674883390d7566488b4108488b0048833809755e488b44240848c7c301000000488b50084889c8ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048894818488b094889481048c740080100000048c7000b000000eb29e924000000e91c0000004883380375054889c8eb144889c1483b65187303ff5548e9c1feffff4889c8488338077560488b4810488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f9017469488b4c2408ff7010ff70084c8b0424488b5908488b442410ff157e06000048c7c1010000004889c2f6c2017526f6c101740d4883c102eb05e9a00100007105ff5570ebee488b5208483b65187303ff5548ebd548c7c201000000488b5c2410f6c3017526f6c201eb05e91301000074064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebd5f6c1017508f6c2017503ff5570483bca75704889c3488b042490ff15fa0500004889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908488b5c2418909090ff15d20500004889c3488b0424909090ff15ca0500004889c1498d47e0483b45107303ff55404989c748c740f803000000488b542408eb05e914000000488950104889480848c700070000004883c420c3498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c420c3498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c410c3488338057565488b4c2408ff7010ff7008488b5908488b44241090ff15be04000048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc48c7c201000000488b5c2410f6c3017526f6c201740d4883c202eb05e92d0100007105ff5570ebee488b5b08483b65187303ff5548ebd5f6c1017508f6c2017503ff5570483bca756d6a016a014889e3ff1542040000498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2408488908488b54242090e8cafbffff4889c1498d47e8483b45107303ff55404989c748c740f8020000005a48895008488b54240848891051488b542420eb05e9370000009090e88efbffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c700050000004883c420c3498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c420c34883380b7568488b4818488b5110488b1a48833b03755c48c7c601000000488b780840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda488b7c2408ff702051ff7010ff70084c8b4f084989f04889d3488b442420ff15e6020000eb0ae9ab010000e94d01000048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc48c7c201000000488b5c2420f6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdcf6c1017508f6c2017503ff5570483bca75704889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b0c24488908488b5c2428909090ff153e0200004889c1498d47d0483b45107303ff55404989c748c740f805000000488b54241848895020488b54241048895018488b5424084889501048894808eb05e90c00000048c7000b0000004883c430c3498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c430c3498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f000048893e498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889700848c7000d0000004883c410c34883380d755c498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c410c3498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010f17002004889480848c7000d0000004883c410c348b830e306c9a37f0000c39090900000000000000000f007000000000000|@10436,2097151,@18756,@1699,@1382,@10437,@10440,@10433,@10441,@10442,@3589,@10444,@10433|52,0,@1638 128,0,@10432 711,0,@573 803,0,@573 1216,0,@573 1669,0,@573 1761,0,@573 1856,0,@573 1948,0,@573 2012,0,@573 10432:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18755| 10433:D5,152|483b65187303ff5548a80174144889c148b8680d1fc9a37f0000488b5d0890ff1348833801750848c7c001000000c34889c64889f0909090ff157200000053564889da90ff124889c3589090ff156600000053488b5c240890e8a2ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c3909000000000000000009000000000000000|@10449,1048575,@18767,@10450,@10448|18,0,@10434 10434:O4|@20091,@1627,0,@10435 10435:O5|@1338,3041,0,3041,0 10436:S27|545950455f5452454528292e6c6561737447656e6572616c283129 10437:D6,752|483b65187303ff5548a8017567488b08415053ff70084883390b755d488b4118488b5010488b5a0848833b05756f48833b05741148b8c05208c9a37f0000488b5d0890ff13488b7b10488b7308488b59084889f0ff15ae020000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae95d020000e94800000048ba20111fc9a37f000048891148894108488061ffbf6a016a014989e0eb05e91f0000004889cb4889f8ff1562020000594883c408483b65187303ff5548e955ffffff4889c8eb634883390d7562488b4108488b0048833809755a48c7c3010000004889c8488b542408ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048894818488b094889481048c740080100000048c7000b000000eb29e924000000e91c0000004883380375054889c8eb144889c1483b65187303ff5548e9c7feffff4889c8488338077550488b4c2410488b50084883f90175184883fa01740948c7c101000000eb5448c7c103000000eb59f6c2017559488b19488b32488b3b483b3e746440f6c7017563f6060175634c8b0e41f6c1017410eb05e9c700000049c7c003000000eb084d8b014f8d4400014983c0104889fe4c89cfeb05e96e000000488b59084c89c1eb0ae960000000e95400000048d1e9483bc9f3a6488d7c3f01488d743601eb0fe919000000e90e000000e909000000488d4c0901740ceb1f488b5908eb19488b5908488b52084889d9483b65187303ff5548e934ffffff48c7c101000000eb0748c7c1010000004883f9017428488b400890ff15ca000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb1048c7c101000000eb0748c7c1010000004883f90175144c8b442410488b5c2408584883c410e96bfdffffff314c8b442418488b5c2410488b442408909090e852fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c418c348c7c001000000c390900000000000000000e802000000000000|@3359,2097151,@18758,@1699,@1382,@10439|54,0,@1638 128,0,@10438 10438:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18757| 10439:D3,96|483b65187303ff5548a8017539488b08ff7108488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@18759| 10440:D3,96|483b65187303ff5548a8017539488b08ff7108488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@18760| 10441:D3,144|483b65187303ff5548a8017565f6c3017560488b08498d57e8483b55107303ff55404989d748c742f802000000488b3348897208488b3948893a52488b73084889f3488b70084889f0e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@3457,63,@18761| 10442:D5,512|483b65187303ff5548a8017567488b0853ff70084883390b755f488b4118488b5010488b5a0848833b05756e48833b05741348b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b59084889f0ff15be010000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae96d010000e94800000048bad8151fc9a37f000048891148894108488061ffbf6a016a01eb05e9220000004989e04889cb4889f8ff1572010000594883c408483b65187303ff5548e953ffffff4889c8eb634883390d7562488b4108488b0048833809755a48c7c3010000004889c8488b542408ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048894818488b094889481048c740080100000048c7000b000000eb29e924000000e91c0000004883380375054889c8eb144889c1483b65187303ff5548e9c5feffff4889c8488338057538498d4fd8483b4d107303ff55404989cf48c741f802000000488b501048895108488b5808488919488d711848c746f80100000048890eeb0748c7c6010000004883fe01750f488b5c2408584883c408e954feffffff36488b5c2410488b44240890e842feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c410c348c7c001000000c390900000000000000000f801000000000000|@3359,2097151,@18763,@1699,@1382|52,0,@1638 128,0,@10443 10443:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18762| 10444:D6,488|483b65187303ff5548a8017563488b084151415053ff70084883390b7557488b4118488b5010488b5a0848833b05756e48833b05741348b8c05208c9a37f0000488b5d08909090ff13488b7b10488b7308488b59084889f0ff15a2010000498d4fe8483b4d107303ff55404989cfeb0ae955010000e95000000048c741f80200000048bab8181fc9a37f000048891148894108488061ffbf6a016a01eb05e9220000004989e04889cb4889f8ff1556010000594883c408483b65187303ff5548e953ffffff4889c8eb634883390d7562488b4108488b0048833809755a48c7c3010000004889c8488b542418ff124889c1498d47d0483b45107303ff55404989c748c740f80500000048c740200100000048894818488b094889481048c740080100000048c7000b000000eb29e924000000e91c0000004883380375054889c8eb144889c1483b65187303ff5548e9c5feffff4889c84c8b442410488b5c2408ff15aa0000004883f80175194c8b4c24184c8b442410488b5c2408584883c418e97bfeffffff304c8b4c24204c8b442418488b5c2410488b4424089090e85efeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c420c348c7c001000000c39090909090900000000000000000e001000000000000|@3359,2097151,@18765,@1699,@1382,@10446|56,0,@1638 132,0,@10445 10445:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@18764| 10446:D3,264|4883380b755e488b4818488b530848833a03751a488b7110488b7e0848833f03750c4c8b4a084c3b4f087555eb2d48833a017552488b7110488b7e0848833f0175654c8b4a1841f6c1017509f64718017503ff55704c3b4f18756949c7c101000000eb05e9800000004c8b500841f6c201752c41f6c10174064983c1027111eb0ae95b000000e956000000ff5570ebe94d8b5208483b65187303ff5548ebce41f6c1017510eb05e93500000041f6c0017503ff55704d3bc875274c8b4008498d47f0eb05e918000000483b45107303ff55404989c748c740f8010000004c8900c348c7c001000000c348c7c001000000c39090909090909000000000000000000001000000000000|@10447,511,@18766| 10447:S44|545950455f5452454528292e6c6561737447656e6572616c28312967657454797065436f6e73747273283129 10448:D3,128|483b65187303ff5548a8017555f600017417488b4808488b1048b8582008c9a37f0000488b5d08ff13488b08ff7108488b48084889c8909090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@18769|27,0,@1628 10449:S39|545950455f5452454528292e6c6561737447656e6572616c2831296c6561737441726773283129 10450:D3,120|483b65187303ff5548a8017551f600017417488b4808488b1048b8e81f08c9a37f0000488b5d08ff13488b08ff31488b48084889c8e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007000000000000000|@1363,7,@18768|27,0,@1625 10451:O4|@20055,@557,@10453,@10452 10452:O5|@8295,2206,0,2206,0 10453:S36|72656475636554797065733a20556e61626c6520746f2073657420747970652076617273 10454:S51|535452554354555245535f28292e67656e636f6465537472756374732832296c6561737447656e537472756374446563283129 10455:D3,64|483b65187303ff5548a8017519ff3053488b400890e8e6ffffff488b4424085a4883c408ff2248c7c001000000c3909000000000000000003800000000000000|@1696,1048575,@18771| 10456:D3,64|483b65187303ff5548a8017519ff3053488b400890e8e6ffffff488b4424085a4883c408ff2248c7c001000000c3909000000000000000003800000000000000|@1696,1048575,@18772| 10457:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@18790| 10458:S59|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c54797065732832296c6561737447656e457870283129 10459:D3,64|483b65187303ff5548a801751453ff30488b400890e8e6ffffff58488b005aff2248c7c001000000c39090909090909000000000000000003800000000000000|@1696,1048575,@18774| 10460:D3,104|483b65187303ff5548a801753d488b08488b5110488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@18775| 10461:D9,176|483b65187303ff554848837830017519488b4818488b503048b8386208c9a37f0000488b5d0890ff13488b4830488b11488b1253ff7018488b1c244889d09090ff15820000009090ff15820000006a016a01504c8d44240848bbe0201fc9a37f0000488b44241890ff156a000000488b44241090ff15660000004c8b4424205b4883c418ff155e00000048833c240175054883c408c35bff25530000009090900000000000000000a800000000000000|@10466,2097151,@18777,@10467,@10472,@1382,@7328,@10476,@10465|26,0,@1662 90,0,@10462 10462:O1|@10463 10463:D3,24|48c7c001000000c300000000000000001000000000000000|@10464,1,@18776| 10464:S107|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296f726967696e616c566172732d283129 10465:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18787| 10466:S91|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e6365283229 10467:D8,240|483b65187303ff5548a801756b6a016a0153ff7008ff304c8d44241848bbe0231fc9a37f0000488b44241090ff15d6000000488b44242090ff15d200000050488b5c2408488b44242048bab06507c9a37f000090ff15be0000004883f80174346a016a014989e048bb30241fc9a37f0000488b442428eb05e955000000909090ff159a0000004883c4085890ff1596000000eb03586a0150488b5c2420488b442418909090e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c39090909090900000000000000000e800000000000000|@1363,2097151,@18780,@1382,@8195,@1633,@1382,@8195|30,0,@10468 75,0,@1292 105,0,@10470 10468:O1|@10469 10469:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@18778| 10470:O1|@10471 10471:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@18779| 10472:D5,128|483b65187303ff55484883f801750848c7c001000000c348833801750848c7c001000000c34889c34889d890ff15660000004889c64889d8ff1562000000569090e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390909090909000000000000000007800000000000000|@10474,31,@18781,@10475,@10473| 10473:D3,128|483b65187303ff5548a8017555f600017417488b4808488b1048b8582008c9a37f0000488b5d08ff13488b08ff7108488b48084889c8909090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@18783|27,0,@1628 10474:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832297472616e73706f7365283129 10475:D3,120|483b65187303ff5548a8017551f600017417488b4808488b1048b8e81f08c9a37f0000488b5d08ff13488b08ff31488b48084889c8e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007000000000000000|@1363,7,@18782|27,0,@1625 10476:D4,128|483b65187303ff5548a8017555f6c30175504d89c14c8b53084c8b58084d89c8488b1b488b009090ff156a000000504d89c84c89d34c89d890e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@3457,1023,@18784,@10477| 10477:D4,224|483b65187303ff554841f6c001753d498b08488b11488b32483b30751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19498b78084989f8483b65187303ff5548ebbd48c7c70100000040f6c7017535488b07488b4808488b094883f901741a488b70084889da4889cb4889d09090ff157a0000004889c3eb04488b700848891e488b07c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff404889194889c2498d47e8483b45107303ff55404989c748c740f80200000048894808488910c30000000000000000d800000000000000|@10479,127,@18785,@10478| 10478:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18786| 10479:S103|54595045434845434b5f50415253455452454528292e7365744c6561737447656e6572616c547970657328322970726f636573735661726961626c655365742831296765745479706556617273416e64496e7374616e63652832296d6572676556617273283229 10480:D3,64|483b65187303ff5548a801751453ff30488b400890e8e6ffffff58488b005aff2248c7c001000000c39090909090909000000000000000003800000000000000|@1696,1048575,@18788| 10481:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18789| 10482:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@10483,15,@18791| 10483:S40|535452554354555245535f28292e67656e636f6465537472756374732832296d6b41646472283129 10484:O3|@10485,@8345,0 10485:O1|@10486 10486:D3,32|48b880d606c9a37f0000c3909090909000000000000000001800000000000000|@10487,1,@18792|2,0,@509 10487:S37|44454255474745525f28292e696e697469616c44656275676765725374617475732d283129 10488:S31|434f4d50494c45525f424f445928292e62617365436f6d70696c6572283329 10489:D6,1416|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bae0311fc9a37f000048891148895908488061ffbf498d57c8483b55107303ff55404989d748c742f80300000048894a10498b480848894a08498b30488932488d7a2048c747f80200000049b908341fc9a37f00004c890f48894708488067ffbf4c8b4b104d8b094c8b53484d8b124983fa5375034d89ca4d89d149bbca2c1fc9a37f00004f8d5c8bfc41ffe3909090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904983fa7b740949c7c101000000eb4849c7c103000000eb4449c7c103000000eb4949c7c103000000eb4e49c7c103000000eb4a49c7c103000000eb4d49c7c103000000eb4449c7c103000000eb3b49c7c103000000eb32e92d000000e92800000049c7c103000000eb1fe91a00000049c7c103000000eb11e90c000000e90700000049c7c1030000004983f90175184983fa4774124983fa6d740c4983fa6774064983fa2b754f6a016a01574989d24989c14989d8488d5c240848b8603a1fc9a37f00009090ff1502020000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c34c8b4b504d8b094c8b53784d8b126a016a015341524151ff733050534c8d5424304989d149c7c0010000004889f89090ff15aa010000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424284889511848894110488b4424204889410848c70101000000488b442418488b5010488b12488b5848488b1b4883fb5375034889d34883fb617430488b5010488b12488b5848488b1b4883fb5375034889d34883fb017413514889c348c7c077000000ff150a010000eb0848c7c00100000051498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fe0483b4d107303ff55404989cf48c741f80300000048894110584889410848c70105000000498d47a0483b45107303ff55404989c748c740f80200000048c7400801000000488908488b4c2418488b5128488b12488b4970488b09488d581848c743f805000000488b7424104889732048894b18488b4c240848894b1048895308594883c42848890b4889c1488d433048c740f80200000048895808488908c3909000000000000000008005000000000000|@10499,2097151,@18797,@10500,@10694,@10496|35,0,@10490 111,0,@10493 159,0,$10489+178 910,0,@10494 10490:D5,392|483b65187303ff5548488b4208488b4850488b09488b5828488b1b488b7078488b36488b7870488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989481049895808488b483049890852415048bb80ce17c9a37f000048b8a0331fc9a37f000090ff152a0100009090ff152a010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b5108488b5a184883c40848c70303000000488b4a604889ca90ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f5700200488908c390909090909000000000000000008001000000000000|@10492,1048575,@18794,@7855,@8482|93,0,@7849 103,0,@10491 192,0,@1294 320,0,@573 10491:S31|467265652074797065207661726961626c6573206e6f7420616c6c6f776564 10492:S36|50415253455f44454328292e7061727365446563283329676c6f62616c456e762d283129 10493:D3,1584|483b65187303ff55484883f82f74144889c148bb32341fc9a37f0000488d5c8bfcffe3e9e70500009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901753e4883f823743d4883f80d743c4883f831743b4883f841743a4883f84374394883f83f744f4883f84d744e4883f845744d4883f827744c4883f80f744beb1ee930030000e92b030000e926030000e921030000e91c030000e9170300004881f881000000743b4883f833743a4883f8557439eb19e9fb020000e9f6020000e9f1020000e9ec020000e9e70200004889c148bb56371fc9a37f0000488d5c8bfcffe3e9ce020000e9c9020000e9c4020000909090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f87b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f90175124883f867740c4883f82b74064883f86d750848c7c003000000c3488b5208ff2290909000000000000000002806000000000000|@7990,1048575,@18795|20,0,$10493+42 813,0,$10493+846 10494:O1|@10495 10495:D3,784|4889c148ba863a1fc9a37f0000488d548afcffe29090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f87b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f901750c4883f84774064883f86d750848c7c003000000c34883f867750848c7c003000000c34883f82b740848c7c001000000c348c7c003000000c390909000000000000000000803000000000000|@7990,7,@18796|5,0,$10495+22 10496:D11,544|483b65187303ff5548488b4b10488b09488b5348488b124883fa5375034889ca4883fa697532488b4b08488b094989da4989c34889cb48c7c045000000909090ff15f201000048c7c345000000909090ff15ea010000eb5a488b4b10488b09488b5348488b124883fa5375034889ca4883fa5774124883fa3d740c4883fa7574064883fa31750f488b4b08488b094889c24889c8eb37488b4b10488b09488b5348488b124883fa53740d4889c14889d0eb0ee91c0000004889c24889c84889d14889ce90ff157e0100004889f24989d34989da498b4a50488b09498b5228488b12498b5a78488b1b498b7270488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708498b4a3048890f4989fc4989c548bb30401fc9a37f00004c89d8909090ff15160100004c89eb909090ff151201000048bb50401fc9a37f0000ff150a0100004152415448bb80ce17c9a37f0000ff15fe0000009090ff15fe000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b51184883c40848c70203000000488b5160ff22909000000000000000001802000000000000|@10936,1048575,@19038,@100,@100,@10512,@100,@100,@100,@7855,@8482|294,0,@10497 328,0,@10498 348,0,@7849 436,0,@1294 10497:S14|2065787065637465642062757420 10498:S10|2077617320666f756e64 10499:S23|50415253455f44454328292e7061727365446563283329 10500:D9,1840|483b65187303ff5548498b4010488b00498b4848488b094883f95375034889c1498b4050488b00498b5028488b12498b7078488b36498b7870488b3f4d8d5fd04c3b5d107303ff55404d89df49c743f8050000004989732049897b184989431049895308498b50304989134883f96174064883f901751548c703010000004c895b0848c7c001000000c208004889cf49bc3a411fc9a37f00004d8d64bcfc41ffe490e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f97b740948c7c701000000eb4848c7c703000000eb4448c7c703000000eb4948c7c703000000eb4e48c7c703000000eb4a48c7c703000000eb4d48c7c703000000eb4448c7c703000000eb3b48c7c703000000eb32e92d000000e92800000048c7c703000000eb1fe91a00000048c7c703000000eb11e90c000000e90700000048c7c7030000004883ff0175184883f94774124883f96d740c4883f96774064883f92b75646a016a014883f947755f535650524152415141504d89c24c8b4424504c89d3488b44241048ba20481fc9a37f000090ff15aa030000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b5510730feb0ae918030000e93a000000ff55404989d748c742f80300000048894a104889420848c70205000000488d442438488910488d44243848b9283921c9a37f000048894808eb6e4883f96d756d535650524152415141504d89c24c8b4424504c89d3488b44241048ba20481fc9a37f000090ff150e030000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f803000000eb0ae9c2010000e92c00000048894a104889420848c70205000000488d442438488910488d44243848b9283921c9a37f000048894808eb674883f967753c535650524152415141504d89c14c8b4424504c89cb4c89d090ff157e020000488d4c2438488901488d44243848b9683c21c9a37f000048894808eb694883f92b754a535650524152415141504d89ca4d89c14c8b4424504c89cb488b442410eb05e925010000909090ff1536020000488d4c2438488901488d44243848b9f03c21c9a37f000048894808eb6a535650524152415141506a016a01415141504c8d542410eb05e9e10000004c8b4c243049c7c003000000488b5c2420488b44247090ff15e6010000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fd8483b4d10730aeb05e990000000ff55404989cf48c741f804000000488b5424084889511848894110584883c4084889410848c70101000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d57e0483b55107303ff55404989d748c742f8030000004889421048894a0848c70205000000488d442438488910488d44243848b9283921c9a37f0000488948086a016a01ff7424604c8b5424284c8b4c24204c8b442418488d5c2408488b4424589090e892f9ffff498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2440488908488b0c24488d501848c742f805000000488b5c24304883c42048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a488b3c244889074889570848c7c0010000004883c418c208005341534c89c348c7c07700000090ff1572000000488b44240848c70001000000594889480848c7c0010000004883c408c2080090909000000000000000002807000000000000|@10919,2097151,@19024,@10503,@10503,@10920,@10918,@10694,@10496|145,0,$10500+162 911,0,@10501 1027,0,@10910 1075,0,@10501 1191,0,@10910 1257,0,@10912 1337,0,@10915 1594,0,@10910 10501:O3|@10503,@10675,@10502 10502:O2|@10690,@10501 10503:D16,1176|483b65187303ff5548488b4b50488b09488b7378488b36488b7b10488b3f4c8b5b484d8b1b4983fb5375034989fb4983fb6d75705651ff73304151525041525341504889d848ba98bd17c9a37f000090ff155a040000488b442420ff742428ff7008ff742428ff742428ff742428ff742428ff35400400004989e14c8b44244048bb804d1fc9a37f000048c7c005000000909090ff1526040000488b48084883c468eb05e994000000498d57d0483b55107303ff55404989d748c742f805000000488b5c241048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004c8b00498d47d8483b45107303ff55404989c748c740f804000000488978184c8940104889500848c70005000000c3488b4b10488b09488b7348488b364883fe5375034889ce4883fe477522415152504152534150ff304889d848ba98bd17c9a37f00009090ff154e030000eb2a4889d64889c748c7c047000000909090ff153e030000415156574152534150ff37909090ff1532030000488b442410488b4850488b09488b5078488b12488b5c24206a016a016a014989d04989c94c8b50304c8b5b104c8b63084889e348c7c001000000ff15fa020000498d47e0483b45107303ff55404989c748c740f80300000048b9084e1fc9a37f00004883c4084889084c896008488b4c240848894810488060ffbf498d4fc8483b4d107303ff55404989cf48c741f8030000004c89591048894108488b1424488911488d592048c743f80200000048be784e1fc9a37f0000488933488b74241848897308488063ffbf488b7c24384150415141524153504c8b5424504c8b4c24684989d8488b5c24484889c8488b57109090ff12488b4c2448488b5110488b12488b5948488b1b4883fb5375034889d34883fb357518504889c848ba98bd17c9a37f00009090ff1516020000eb1e4889c348c7c0350000009090ff150a02000053488b5c2450ff1506020000498d47e0483b45107303ff55404989c748c740f80300000048b9d84e1fc9a37f0000488908488b4c244048894808488b4c243048894810488060ffbf498d4fc8483b4d107303ff55404989cf48c741f803000000488b54241048895110488b54240848895108488901488d412048c740f80200000048ba704f1fc9a37f0000488910488b54244848895008488060ffbf488b5424684c8b5424584c8b4c24704989c0488b5c24504889c8488b5210ff12488b4c2450488b5128488b12488b5970488b1b488b7110488b36488b7948488b3f4883ff5375034889f74883ff1f751a5053524889c848ba98bd17c9a37f00009090ff1516010000eb264889c64889d748c7c01f000000909090ff1506010000565357488b5c24689090ff15fe000000498d47a8483b45107303ff55404989c748c740f805000000488b4c244048894820488b4c240848894818488b4c243848894810594883c40848894808488b4c24204889084889c1488d403048c740f80400000048894818488b4c240848894810594883c4784889480848c70003000000c3909090909000000000000000009004000000000000|@10521,2097151,@18803,@7831,@10522,@10556,@7831,@10512,@10496,@8796,@7831,@10512,@10496,@7831,@10512,@10496|71,0,@7830 130,0,@10504 362,0,@7830 512,0,@10507 598,0,@10508 706,0,@7830 780,0,@10509 873,0,@10511 986,0,@7830 10504:O1|@10505 10505:D3,40|4883f86b740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@10506,1,@18798| 10506:S19|53796d5365742e73747275637453792d283129 10507:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18799| 10508:D3,56|483b65187303ff55484883f81f74064883f835750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18800| 10509:D3,56|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b48084883c408584889caff2200000000000000003000000000000000|@10510,1048575,@18801| 10510:S35|50415253455f44454328292e6d6b4c6f63616c426f6479466978456e76283429283129 10511:D3,48|483b65187303ff55484883f81f750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18802| 10512:D3,1288|48b9da4f1fc9a37f0000488d4c81fcffe190e91b020000909090e91b020000909090e91e020000909090e921020000909090e924020000909090e927020000909090e92a020000909090e92a020000909090e92d020000909090e930020000909090e930020000909090e933020000909090e933020000909090e936020000909090e939020000909090e93c020000909090e93f020000909090e942020000909090e942020000909090e945020000909090e948020000909090e94b020000909090e94e020000909090e951020000909090e951020000909090e954020000909090e957020000909090e95a020000909090e95d020000909090e960020000909090e963020000909090e966020000909090e966020000909090e966020000909090e966020000909090e969020000909090e96c020000909090e96f020000909090e972020000909090e975020000909090e978020000909090e97b020000909090e97e020000909090e981020000909090e984020000909090e987020000909090e987020000909090e987020000909090e987020000909090e987020000909090e98a020000909090e98d020000909090e990020000909090e993020000909090e996020000909090e999020000909090e99c020000909090e99f020000909090e9a2020000909090e9a5020000909090e9a8020000909090e9a8020000909090e9ab020000909090e9ab020000909090e9ae020000909090e9b1020000909090e9b4020000909090e9b702000090909048c7c00f000000c348b8b8df17c9a37f0000c348b8f80f0dc9a37f0000c348b8b0e417c9a37f0000c348b820ba07c9a37f0000c348b870e217c9a37f0000c348c7c055000000c348b870df17c9a37f0000c348b8f8541fc9a37f0000c348c7c075000000c348b880e117c9a37f0000c348c7c059000000c348b8187407c9a37f0000c348b878e017c9a37f0000c348b8a0f309c9a37f0000c348b890d208c9a37f0000c348b8387207c9a37f0000c348c7c07b000000c348b858ec08c9a37f0000c348b8986109c9a37f0000c348b8d0e217c9a37f0000c348b8989017c9a37f0000c348b808e117c9a37f0000c348c7c047000000c348b818551fc9a37f0000c348b840f309c9a37f0000c348b810290ac9a37f0000c348b8a8e317c9a37f0000c348b808e208c9a37f0000c348b8d8e108c9a37f0000c348b838551fc9a37f0000c348c7c0b7000000c348c7c0f7000000c348c7c051000000c348b840290ac9a37f0000c348b800e317c9a37f0000c348b838e208c9a37f0000c348b8808e07c9a37f0000c348b8f8e117c9a37f0000c348b880e417c9a37f0000c348b860e317c9a37f0000c348b860551fc9a37f0000c348b8c0e017c9a37f0000c348b880551fc9a37f0000c348b818e017c9a37f0000c348c7c0bb000000c348c7c0fb000000c348c7c053000000c348c7c077000000c348b8e0de17c9a37f0000c348b860d108c9a37f0000c348b810de08c9a37f0000c348b8a0551fc9a37f0000c348b820e417c9a37f0000c348b8f8c908c9a37f0000c348b870f309c9a37f0000c348b8b0e117c9a37f0000c348b8a81607c9a37f0000c348b8c8551fc9a37f0000c348b8687107c9a37f0000c348c7c0bf000000c348b808ec08c9a37f0000c348c7c0f9000000c348b8c8e417c9a37f0000c348b8d8e317c9a37f0000c348b8a8600ac9a37f0000c348b8a0e217c9a37f0000c348b8f0551fc9a37f0000c39090909090909000000000000000000005000000000000|@10674,3,@18890|2,0,$10512+18 572,0,@7882 583,0,@3959 594,0,@7935 605,0,@1423 616,0,@7911 635,0,@7879 646,0,@10513 665,0,@7901 684,0,@1319 695,0,@7890 706,0,@2707 717,0,@2122 728,0,@1309 747,0,@2140 758,0,@2335 769,0,@7915 780,0,@7660 791,0,@7896 810,0,@10514 821,0,@2703 832,0,@3009 843,0,@7924 854,0,@2132 865,0,@2130 876,0,@10515 911,0,@3011 922,0,@7917 933,0,@2134 944,0,@1379 955,0,@7906 966,0,@7933 977,0,@7921 988,0,@10516 999,0,@7893 1010,0,@10517 1021,0,@7886 1064,0,@7873 1075,0,@2116 1086,0,@2127 1097,0,@10518 1108,0,@7929 1119,0,@2101 1130,0,@2705 1141,0,@7903 1152,0,@820 1163,0,@10519 1174,0,@1304 1193,0,@2137 1212,0,@7936 1223,0,@7926 1234,0,@3084 1245,0,@7913 1256,0,@10520 10513:S15|3c6368617220636f6e7374616e743e 10514:S12|3c6964656e7469666965723e 10515:S18|3c696e746567657220636f6e7374616e743e 10516:S14|756e6b6e6f776e2073796d626f6c 10517:S15|3c7265616c20636f6e7374616e743e 10518:S17|3c737472696e6720636f6e7374616e743e 10519:S17|3c74797065206964656e7469666965723e 10520:S15|3c776f726420636f6e7374616e743e 10521:S38|50415253455f44454328292e7061727365446563283329737472756374757265446563283329 10522:D4,88|483b65187303ff554853ff7228ff72304c8b52204c8b4a184c8b4210488b5a08ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10595,2097151,@18887,@10523| 10523:D13,1104|483b65187303ff554853ff355804000041515341504152488d5c242048b8985b1fc9a37f00009090ff1542040000504c8b4008488b5c2410488b084889c89090ff1532040000488b0424488b4c2410488b5110488b12488b5948488b1b4883fb5375034889d34883fb15756eff70084889c848ba98bd17c9a37f0000ff15fe030000498d47e8483b45107303ff55404989c748c740f80200000048b9085c1fc9a37f0000488908488b4c242048894808488060ffbf6a016a014c8b5424384989e14989c0488b5c2428488b44242048ba605c1fc9a37f0000eb05e95500000090ff15a2030000498d47e0483b45107303ff55404989c748c740f803000000488b4c24084889481048c7400803000000594883c408488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb6c4883fb13756bff70084889c848ba98bd17c9a37f00009090ff153e030000498d47e8483b45107303ff55404989c748c740f80200000048b918f71fc9a37f0000488908488b4c242048894808488060ffbf6a016a014c8b5424384989e14989c0488b5c2428488b442420eb0ae96d000000e95e00000048ba605c1fc9a37f0000ff15de020000498d47e0483b45107303ff55404989c748c740f803000000488b4c24084889481048c7400801000000594883c408488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb0a48c7c101000000ff7008488b442418488b5010488b12488b5848488b1b4883fb5375034889d34883fb2375145148ba98bd17c9a37f000090ff155a020000eb1e4889cb48c7c0230000009090ff154e02000053488b5c2420ff154a0200006a016a01ff7424404c8b5424684c8d4c24084c8b442440488b5c2438488b442430488b542470ff12488b442418488b4c2408498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8b542420f644241001756f4c8b5c24104d8b234d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c706010000004d8d4fc84c3b4d107303ff55404d89cf49c741f8060000004d897128eb05e94a0000004d8969204d8b6c24104d8969184d8b7424084d897110498b3c2449897908488b0424498901498d47e8483b45107303ff55404989c748c740f8020000004c89480848c70005000000eb04488b042448837c241001740948c7c301000000eb0748c7c3030000004883f302498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4fc84c3b4d107303ff55404d89cf49c741f8060000004d8b5a084883c4584d895928498959204989791849894110498b0249894108498911498d47e8483b45107303ff55404989c748c740f802000000488950084c8908c210009000000000000000004804000000000000|@10673,2097151,@18888,@10672,@10543,@8558,@7831,@10529,@7831,@10529,@7831,@10512,@10496|30,0,@10524 116,0,@7830 156,0,@10526 208,0,@10527 322,0,@7830 364,0,@10671 428,0,@10527 567,0,@7830 10524:O1|@10525 10525:D3,56|4883f80d750848c7c003000000c34883f831740848c7c001000000c348c7c003000000c39090909000000000000000003000000000000000|@7990,1,@18804| 10526:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18805| 10527:O2|@10529,@10528 10528:O2|@10605,@10527 10529:D14,1240|483b65187303ff5548488b4b10488b09488b7348488b364883fe5375034889ce4883fe65745f4883fe0d745e4883fe31745d41514150415253505248b8e8611fc9a37f0000909090ff15a2040000488b442410488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54242890ff124883f801754d48833c24657446eb0fe94c000000e947000000e94200000048833c240d742e48833c24317427488b44241848ba98bd17c9a37f0000909090ff153e0400004883c408483b65187303ff5548eb8548c7c0010000004883c408eb134889c148c7c001000000415141504152535152488b442410488b4850488b09488b5078488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe31756cff742420ff35dd0300004989c04889e348b8985b1fc9a37f000090ff15ce030000504c8b4008488b5c2428488b084889c89090ff15be030000488b0424498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57c0483b5510730aeb05e941000000ff55404989d748c742f80400000048894a18488b48084883c41848894a10488b1848895a0848c70203000000488d722848c746f80200000048894e08488916eb6b4883fe65756a5251ff703048ba98bd17c9a37f0000ff1532030000498d47e8483b45107303ff55404989c748c740f80200000048b910621fc9a37f0000488908488b4c243848894808488060ffbf488b5424184c8b4c24304989c0488b5c2428488b442420488b5208eb0ae9eb010000e9e8000000ff12488b4c2428488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241048897e2048895e18488b5c240848895e10488956085a4883c410488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb1f751856504889c848ba98bd17c9a37f000090ff155e020000eb224889c348c7c01f0000009090ff15520200005653488b5c2420909090ff154a020000498d47c8483b45107303ff55404989c748c740f803000000488b4c2408488948105a4889500848c70001000000488d702048c746f80200000048894e08488906eb6e488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fc0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f488d573048c742f801000000c642ff4048c70201000000498d5fd8483b5d10730aeb05e987000000ff55404989df48c743f8040000004889531848897b1048ba88621fc9a37f00004889530848c70303000000488b5050488b12488b7028488b36488b7878488b3f4c8b40704d8b004d8d4fb84c3b4d107303ff55404d89cf49c741f805000000498979204d8941184989511049897108498909498d713048c746f8020000004c894e0848891e6a014883c408488b4424104883c410488b4810488b09488b5048488b124883fa5375034889ca4883fa7f75595648ba98bd17c9a37f000090ff15da000000488b04244c8b5424184883c4084c8b4c24084c8b0424488b5808488b084889c89090ff15ba000000488b4c2418488b10488911488b58084889590848c7c0010000004883c420c3488b442418488b0e488908488b56084889500848c7c0010000004883c420c3909090900000000000000000d004000000000000|@10541,2097151,@18809,@10496,@7831,@10542,@10543,@8558,@7831,@7831,@10512,@10496,@7831,@10533|61,0,@10530 169,0,@7830 299,0,@10524 472,0,@7830 512,0,@10531 691,0,@7830 947,0,@10532 1103,0,@7830 10530:S18|5374617274206f66207369676e6174757265 10531:D3,80|483b65187303ff55484883f861750848c7c003000000c34883f87f750848c7c003000000c34883f81f750848c7c003000000c3488b5208ff229090909090909000000000000000004800000000000000|@7990,1048575,@18806| 10532:S5|6572726f72 10533:D19,1128|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa77751e41524151415053504c89c048ba98bd17c9a37f000090ff153e040000eb264889c648c7c0770000009090ff153204000041524151415053564c89c3909090ff15260400006a016a016a014889e348c7c0010000009090ff1516040000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b54240848895008488b1c244889184c8b4424304889c348c7c0010000009090ff15d6030000ff742438ff35d4030000504c8b442440488d5c240848b8b0671fc9a37f0000909090ff15be030000488b30488b78084c8b4c24484c8b442428488b5c2420488b442418909090ff15a2030000488b4c2440488b5110488b12488b5948488b1b4883fb5375034889d34883fb2375185657504889c848ba98bd17c9a37f0000ff1572030000eb224889c348c7c0230000009090ff1566030000565753488b5c24589090ff155e030000488b442458488b4810488b09488b5048488b124883fa5375034889ca4883fa41745b4883fa43745a4883fa3174594883fa7574584889c348b8687107c9a37f000090ff151e030000488b442458488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54247090ff124883f801755648833c2441eb14e964000000e95f000000e95a000000e955000000744648833c2443743f48833c2431743848833c24757431488b44246048ba98bd17c9a37f0000909090ff15ae0200004883c408483b6518730aeb05e908000000ff5548e96fffffff48c7c0010000004883c408eb0748c7c001000000498d47e8483b45107303ff55404989c748c740f80200000048b930681fc9a37f0000488908488b4c246848894808488060ffbf6a016a014989e14c8b442410488b5c246890ff153e020000498d47d0483b45107303ff55404989c748c740f8050000005948894820488b4c242048894818488b4c241848894810488b4c245048894808488b4c2410488908498d4fa0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488b442458488b1424488d591848c743f805000000488b70204883c46048897320488b7a1848897b184c8b40104c8943104c8b4a084c894b084c8b104c89134c8d5b3049c743f80200000049895b0849890b4c8b24244d8b6c24104d8b6d004d8b7424484d8b364983fe5375034d89ee4983fe057559535141534c89e048ba98bd17c9a37f0000ff1556010000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa7775254c8b5424284c8b4c24204989c0488b5c24104883c408584883c420e924fcffffe935000000488b4848488b094883f9537417488b484848b898681fc9a37f0000488b5d08909090ff13488b404848c70005000000584883c428c34983fe7f753453514c89e048ba98bd17c9a37f000090ff15c60000004c8b5424204c8b4c24184c8b442410488b5c2408584883c420e9b0fbffff4c89d84883c418c300000000000000006004000000000000|@10551,2097151,@18813,@7831,@10512,@10496,@8796,@10552,@10570,@10543,@10571,@7831,@10512,@10496,@10496,@7831,@10547,@7831,@7831|51,0,@7830 225,0,@10534 320,0,@7830 427,0,@1304 545,0,@7830 633,0,@10537 908,0,@7830 1012,0,@10538 1059,0,@7830 10534:O1|@10535 10535:D3,40|4883f831740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@10536,1,@18807| 10536:S16|53796d5365742e6964656e742d283129 10537:D3,64|483b65187303ff55484883f805750848c7c003000000c34883f87f750848c7c003000000c3488b5208ff22909090909000000000000000003800000000000000|@7990,1048575,@18808| 10538:O4|@20055,@557,@10540,@10539 10539:O5|@7818,612,0,612,0 10540:S31|417474656d707420746f20707573682074776f20706172656e746865736573 10541:S40|50415253455f44454328292e706172736544656328332970617273655369676e6174757265283329 10542:D3,48|483b65187303ff55484883f87f750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18810| 10543:D6,344|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4150534889c14889d04889caff124883f8017470488b442408488b4808488b09488b5050488b12488b5828488b1b488b7078488b36488b7870488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989501049895808488b503049891041505148ba98bd17c9a37f0000ff15d2000000498d47e8eb05e92a000000483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084883c410c3488b5c240848b8486b1fc9a37f00009090ff158e000000488b442408488b4810488b09488b5048488b124883fa5375034889ca4889d0488b1424909090ff124883f8017521488b44240848ba98bd17c9a37f000090ff1552000000483b65187303ff5548ebb148b8686b1fc9a37f00004883c410c300000000000000005001000000000000|@10546,2097151,@18811,@7831,@10496,@7831|144,0,@7830 218,0,@10544 287,0,@7830 315,0,@10545 10544:S10|4964656e746966696572 10545:O2|I48,@8345 10546:S17|534b4950535f28292e6765746964283329 10547:D7,520|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048baf86d1fc9a37f000048891148894108488061ffbf6a016a0141514150535049ba506e1fc9a37f00004d89c14989d8488d5c24204889c8909090ff15be010000488b442408488b4810488b09488b5048488b124883fa5375034889ca4883fa09756e48ba98bd17c9a37f00009090ff15920100006a016a014989e14c8b442420488b5c2418488b44241090e84effffff488b442438488b4c2408498d57a8483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b4108eb05e94c0000004c8942084c8b084c890a4c8d523049c742f804000000415b4883c4084d895a18498952104c8b5c24204d895a0849c702050000004c8b5c24184d89134989530848c7c0010000004883c430c3488b4810488b09488b5048488b124883fa5375034889ca4889d0488b1424909090ff124883f8017565488b5c240848b8606e1fc9a37f000090ff15ae000000488b442408488b4810488b09488b5048488b124883fa5375034889ca4889d0488b1424909090ff124883f8017521488b44240848ba98bd17c9a37f000090ff1572000000483b65187303ff5548ebb1488b442418488b4c2420488908488b4c24284889480848c7c0010000004883c430c3909090909000000000000000000002000000000000|@10577,2097151,@18826,@10576,@7831,@10496,@7831|35,0,@10548 67,0,@10549 134,0,@7830 371,0,@10550 439,0,@7830 10548:D3,48|483b65187303ff55484883f809750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18812| 10549:O1|@10547 10550:S11|456e64206f662074797065 10551:S56|50415253455f44454328292e706172736544656328332970617273655369676e617475726528332967657457686572655479706573283229 10552:D9,408|483b65187303ff5548ff3350ff73084150ff3599010000498b4010488b00498b4848488b094883f95375034889c14883f943756a41504c89c048ba98bd17c9a37f000090ff156e010000488b0424488b4810488b09488b5048488b124883fa5375034889ca4883fa7575614c8d4c24084989c048bbb8701fc9a37f000048c7c017000000ff1536010000488b0c24488b5110488b12488b5948488b1beb05e9890000004883fb5375034889d34883fb5f751fff304889c848ba98bd17c9a37f0000909090ff15fe000000eb22e923000000488b1848c7c05f00000090ff15ee00000053488b5c2408ff15ea000000584883c430c3488b4848488b094883f9537414488b484848b898681fc9a37f0000488b5d08ff13488b404848c7004300000048c7c0010000004883c430c34883f97575456a016a014889e348c7c001000000488d542410909090ff12498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000594883c4084889084883c428c348c7c0010000004883c428c3909090909000000000000000009001000000000000|@10557,2097151,@18815,@10558,@7831,@10556,@7831,@10512,@10496|59,0,@7830 117,0,@10553 185,0,@7830 263,0,@10538 10553:O1|@10554 10554:D3,40|4883f875740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@10555,1,@18814| 10555:S20|53796d5365742e747970654964656e742d283129 10556:D4,144|483b65187303ff5548498b4850488b09498b5028488b12498b7078488b36498b7870488b3f4d8d57d04c3b55107303ff55404d89d749c742f8050000004989722049897a1849894a1049895208498b483049890a488b142448891c244c89d34989c24c89c84d89c14989c048c7c00100000052ff252f0000009090909090909000000000000000008800000000000000|@10566,2097151,@18819,@10565| 10557:S37|50415253455f44454328292e70617273654465632833296765745479706556617273283229 10558:D7,824|483b65187303ff5548488b4208488b4810488b09488b7048488b364883fe5375034889ce4883fe75756d488b4808488b09488b7050488b36488b7828488b3f4c8b40784d8b004c8b48704d8b094d8d57b04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a08488b7030498932498d423048c740f80300000048beb8751fc9a37f0000488930eb05e9a401000048894808488b720848897010488060ffbf5341525251488b72204889f2909090ff12488b44240848837818017462488b1424f6c201740948c7c103000000eb08488b0a488d4c0901f6c10174084883f9037e5beb06f641ff107558f6c201740948c7c103000000eb08488b0a488d4c0901f6c10174084883f9037e08eb1ff641ff10741948b8f07206c9a37f0000eb05e947000000488b5d089090ff13f6c2017516480fb64a09488d4c0901eb0de920000000e91b0000004889d14883f94f740948c7c101000000eb1948c7c103000000eb1048c7c101000000eb0748c7c101000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a4883f901750948c7c101000000eb0748c7c1090000004881c9f17002004883c905498d5fd0483b5d107303ff55404989df48c743f80200000048894b08488913488b4810488d431848c740f802000000488958085a488910534889caff12488b442408488b400848ba98bd17c9a37f0000909090ff152e010000488b442418594883c408488908594889480848c7c0010000004883c408c34889d648c7c0750000009090ff15060100005356488b5e08ff1502010000488b0424488b48084889c848ba98bd17c9a37f000090ff15ee000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fb8483b4d107303ff55404989cf48c741f80200000048c74108fd700200488901488b0424488b5008488b5a504883c408488b1b488b7228488b36488b7a78488b3f4c8b42704d8b004c8d491849c741f805000000498979204d8941184989591049897108488b5a30498919488b342448890e4c894e0848c7c0010000004883c408c300000000000000003003000000000000|@10564,2097151,@18818,@7831,@10512,@10496,@7831|138,0,@10559 290,0,@219 413,0,@573 529,0,@7830 619,0,@7830 664,0,@573 10559:D4,56|483b65187303ff55484c8b4a104c8b4208488b5808488b084889c8ff252f0000009090909090909000000000000000003000000000000000|@10562,1048575,@18816,@10560| 10560:D6,416|483b65187303ff5548493bc07444a801756841f6c001756741f6c001740948c7c103000000eb08498b08488d4c09014883c1104889c64c89c748d1e9483bc9f3a6488d7c3f01488d743601488d4c09017572498b4950488b09498b5128488b12498b5978488b1b498b7170488b36498d7fd0483b7d10730feb0ae903010000e9fe000000ff55404989ff48c747f80500000048895f204889771848894f1048895708498b493048890f4d89ca4989fb48bb00781fc9a37f0000909090ff15f6000000eb05e9b90000004152415348bb80ce17c9a37f000090ff15e20000009090ff15e2000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b51184883c40848c70203000000488b5160ff2248c7c001000000c390909090909000000000000000009801000000000000|@10563,1048575,@18817,@100,@7855,@8482|177,0,@10561 207,0,@7849 296,0,@1294 10561:S23|2068617320616c7265616479206265656e20757365642e 10562:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283129 10563:S55|50415253455f44454328292e70617273654465632833296765745479706556617273283229676574547970655661722831295f2d283229 10564:S50|50415253455f44454328292e7061727365446563283329676574547970655661727328322967657454797065566172283129 10565:D9,480|483b65187303ff55486a016a014152415141505350488d5c242848c7c0010000004c89c2ff12488b442418488b4810488b09488b5048488b124883fa5375034889ca483b542420751348ba98bd17c9a37f000090ff159e010000eb5a488b4810488b09488b5048488b124883fa5375034889ca4889d0488b54244090ff124883f8017466488b442420909090ff156e010000488b5c241890ff156a010000488b44241848ba98bd17c9a37f0000909090ff155a010000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24284889084883f801750b488b0424eb14e9360000004889c3488b04249090ff151a010000488b4c244048894c24404c8b5424204c8b4c24184c8b4424104883c4085b4883c428e9dbfeffff498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24284889084883f8017506488b0424eb0d4889c3488b0424ff15ba000000488b4c2408488b542430498d5fb8483b5d107303ff55404989df48c743f805000000488b712048897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134989c3488d433048c740f802000000488958084c89184883c438c2080090909090900000000000000000d801000000000000|@10568,2097151,@18820,@7831,@10512,@10496,@7831,@10569,@10567|75,0,@7830 165,0,@7830 10566:S19|534b4950535f28292e6765744c697374283429 10567:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18822| 10568:S29|534b4950535f28292e6765744c697374283429666f724c697374283229 10569:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18821| 10570:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18823| 10571:D3,72|498d47e0483b45107303ff55404989c748c740f80300000048b9587d1fc9a37f00004889084c8948084c894010488060ffbfc3909090909000000000000000004000000000000000|@10575,195,@18825|26,0,@10572 10572:D6,448|483b65187303ff55485250488b4a104889ca9090ff124883f8017570488b442408488b4808488b5150488b12488b5928488b1b488b7178488b36488b7970488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989501049895808488b51304989104d89c248bb587f1fc9a37f0000488b0424909090ff154e010000eb05e911010000415248bb80ce17c9a37f0000909090ff153a0100009090ff153a010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2408488b5108488b5a1848c70303000000488b4a604889caff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f57002004889084883c410c3488b004883c410c39090909090900000000000000000b801000000000000|@10574,1048575,@18824,@100,@7855,@8482|117,0,@10573 149,0,@7849 240,0,@1294 364,0,@573 10573:S42|20686173206e6f74206265656e206465636c6172656420696e2074797065206465636c61726174696f6e 10574:S42|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329283129 10575:S39|50415253455f44454328292e706172736544656328332967656e54797065566172456e76283329 10576:D4,184|483b65187303ff55486a016a015341524d89ca4d89c14989c0488d5c241048c7c001000000909090ff15a2000000f644240801752b488b4424084883780801751f488b0c24488b00488901488b4424104889410848c7c0010000004883c418c3498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b5424084889500848c7000b000000488b142448890248894a0848c7c0010000004883c418c30000000000000000b000000000000000|@10580,2097151,@18828,@10578| 10577:S25|50415253455f5459504528292e706172736554797065283329 10578:D5,408|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f80200000048b9f8821fc9a37f00004889084c894008488060ffbf6a016a01534152415141504c8b5424384c8b4c24104c8b442408488d5c24209090ff1552010000488b442408488b4810488b09488b5048488b124883fa5375034889ca4883fa0d756e48ba98bd17c9a37f00009090ff15260100006a016a01ff7424484c8b5424284c8b4c24204c8b442418488d5c240848c7c001000000e846ffffff498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2428488908488b4c2430488b1424488d5818eb05e94c00000048c743f805000000488b71204883c40848897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8b5c241849890349895b0848c7c0010000004883c430c20800498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c2420488908488b4c2418488901488b4424284889410848c7c0010000004883c430c20800909000000000000000009001000000000000|@10589,2097151,@18831,@10581,@7831|35,0,@10579 130,0,@7830 10579:D3,48|483b65187303ff55484883f80d750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18827| 10580:S37|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129 10581:D27,1896|488dbc2460ffffff483b7d187303ff5550498b4810488b09498b5048488b124883fa5375034889ca498b4850488b09498b7028488b36498b7878488b3f4d8b58704d8b1b4d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c24204d895c241849894c24104989742408498b7030498934246a016a014883fa31756e4150534889c348b8b0671fc9a37f000090ff15e6060000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048bab08c19c9a37f0000488911498d5798483b55107303ff55404989d748c742f80600000048894a28488b480848894a2048894a1848894a10eb05e94f000000488b1848895a0848c70201000000488d723848c746f8020000004889560848c70603000000488d561848c742f80200000048c7420801000000488932488d742410488916488d54241048894a08eb674883fa757566498b4008488b0041505341544c89ca9090ff12488b4c2410488b5110488b12488b5948488b1b4883fb5375034889d34883fb757518504889c848ba98bd17c9a37f00009090ff15f2050000eb2a4889c348c7c0750000009090ff15e6050000eb0ae9af040000e96f00000053488b5c2418ff15d6050000498d47e0483b45107303ff55404989c748c740f803000000488b4c2408488948105a4889500848c70007000000498d57e8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d442418488910488d44241848894808eb634883fa41756241505350415157515641524c89c048ba98bd17c9a37f000090ff1556050000488b442438488b4828488b09488b5070488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe5d7570525148ba98bd17c9a37f0000eb0ae9cf030000e94f0200009090ff150e050000498d47d0483b45107303ff55404989c748c740f805000000488b4c242848894820488b4c240848894818488b4c242048894810594883c40848894808488b4c2408488908498d4fc0483b4d10730aeb05e953000000ff55404989cf48c741f8040000004889411848c741100300000048c741080100000048c70109000000488d512848c742f80200000048c742080100000048890a488d4c2440488911488d4c244048894108eb71498d4fe8483b4d107303ff55404989cf48c741f80200000048bad88b1fc9a37f000048891148894108488061ffbf6a016a016a014889e34889c8ff152e040000ff742438ff742420ff742418ff742468ff742460ff351c0400004989e14c8b84248000000048bbd08d1fc9a37f0000eb05e9a002000048c7c01700000090ff15fa030000488b8c24800000004883c448488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241848897e2048895e18488b5c241048895e1048895608488b542408488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb5d751956ff304889c848ba98bd17c9a37f000090ff157a030000eb22488b1848c7c05d0000009090ff156e0300005653488b5c2448909090ff1566030000498d47d8483b45107303ff55404989c748c740f804000000488b4c24084889481848c74010030000005a4889500848c70009000000498d57e8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d442448488910488d442448488948084883c408eb684883fa43756741505350415157515641524c89c048ba98bd17c9a37f000090ff15da0200004c8b54242041594c8b442420488b5c243048c7c0010000009090ff15c2020000488b4c2430488b5128488b12488b5970488b1b488b7110488b36488b7948488b3feb0ae90a010000e9ab0000004883ff5375034889f74883ff5f751a5053524889c848ba98bd17c9a37f00009090ff1576020000eb264889c64889d748c7c05f000000909090ff1566020000565357488b5c24489090ff155e020000498d47d0483b45107303ff55404989c748c740f805000000488b4c242848894820488b4c240848894818488b4c242048894810594883c40848894808488b4c2408488908488d4c24405a4883c428488911488d4c241048894108eb4e48c7c031000000909090ff15fa01000041505341544c89c39090ff15f2010000488b44241048ba98bd17c9a37f0000909090ff15e2010000488d44241848c70001000000488d44241859488948086a016a016a016a016a016a014883c4284883c408488b442408488b4810488b09488b5048488b124883fa5375034889ca4883fa31751b4989c14c8b0424488b5c24184883c410584883c408ff2583010000f644241001756d488b4c24104883790801751f488b0424488b09488908488b4c24184889480848c7c0010000004883c420c3488b1948c7c031000000909090ff154601000053488b5c2410ff1542010000488b44241048ba98bd17c9a37f0000909090ff1532010000488b44240859488908eb05e915000000488b4c24184889480848c7c0010000004883c420c3488b042448b9d09507c9a37f0000488908488b4c24184889480848c7c0010000004883c420c39090909090909000000000000000006007000000000000|@10591,2097151,@18832,@10543,@7831,@10512,@10496,@7831,@7831,@8510,@10592,@10556,@7831,@10512,@10496,@7831,@10601,@7831,@10512,@10496,@10512,@10496,@7831,@10590,@10512,@10496,@7831|139,0,@10534 184,0,@8374 390,0,@7830 571,0,@7830 638,0,@7830 860,0,@10582 937,0,@10586 1087,0,@7830 1271,0,@7830 1386,0,@7830 1573,0,@7830 1781,0,@7830 1841,0,@1394 10582:D7,264|483b65187303ff55484989d24989db4889c348b8288d1fc9a37f0000ff15fe00000048bb408d1fc9a37f0000ff15f60000004152415348bb80ce17c9a37f0000ff15ea0000009090ff15ea000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b5108488b5a184883c40848c70303000000488b4a604889caff229090909090909000000000000000000001000000000000|@10585,1048575,@18829,@100,@100,@7855,@8482|20,0,@10583 36,0,@10584 56,0,@7849 144,0,@1294 10583:S7|4c6162656c2028 10584:S25|292061707065617273206d6f7265207468616e206f6e63652e 10585:S75|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d7265706f7274447570283329 10586:O1|@10587 10587:D3,24|48c7c001000000c300000000000000001000000000000000|@10588,1,@18830| 10588:S16|53796d5365742e656d7074792d283129 10589:S50|50415253455f5459504528292e7061727365547970652833297475706c655479706528312967657450726f64756374283129 10590:D4,416|483b65187303ff5548498b4908488b09498b5150488b12498b7128488b36498b7978488b3f4d8b51704d8b124d8d5f904c3b5d107303ff55404d89df49c743f80500000049897b204d8953184989531049897308498b5130498913498d7b3048c747f8050000004c8b63204c8967204c8957184c8b53104c89571048897708488b334889374c8d6f3049c745f80100000041c645ff4049beb08c19c9a37f00004d8975004d8d77b04c3b75107303ff55404d89f749c746f8060000004d896e2849897e204d895e1849895e1049894e08498906498d463848c740f8020000004c89700848c700030000004151574150504c89c848ba98bd17c9a37f0000909090ff15b2000000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa317540498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b14244889114989c14c8b442408488b5c24104889c84883c420e998feffff488b442408488b0c24488908488b4c24104889480848c7c0010000004883c420c39090909090909000000000000000009801000000000000|@10604,2097151,@18840,@7831|152,0,@8374 245,0,@7830 10591:S49|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129 10592:D4,88|483b65187303ff554853ff72284c8b52204c8b4a184c8b4210488b5a08909090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10595,2097151,@18834,@10593| 10593:D8,352|483b65187303ff554853ff3568010000415041525341514c89c3488d44242090ff155a01000050ff7008488b54241090ff12488b442428488b4810488b09488b5048488b124883fa5375034889ca4883fa13751448ba98bd17c9a37f00009090ff1522010000eb1a48c7c01300000090ff151a010000488b5c242890ff1516010000498d47e8483b45107303ff55404989c748c740f80200000048b9d8921fc9a37f0000488908488b4c241848894808488060ffbf6a016a014989e14c8b442458488b5c2438488b54243090ff12488b442410488b4c2408498d5798483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80300000049895210415b4883c4104d895a08415b4883c4304d891a498d422048c740f802000000488950084c8910c208009000000000000000005801000000000000|@10598,2097151,@18835,@10599,@10596,@7831,@10512,@10496|86,0,@7830 156,0,@10594 10594:D3,56|483b65187303ff55484883f85d74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18833| 10595:S21|534b4950535f28292e6765744c6973742834292d45 10596:D7,616|483b65187303ff5548488b4b10488b09488b5348488b124883fa5375034889ca4883fa3d755f488b4308488b00488b4b50488b09488b5328488b12488b7378488b36488b7b70488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989481049895008488b4b30498908a801740e48c7c203000000eb0de9b2010000488b10488d541201f6c20174084883fa017e08eb1af642ff1074144889c248b8f07206c9a37f0000488b5d0890ff13a801750c480fb65008488d541201eb034889c241505053524889d848ba98bd17c9a37f00009090ff159a01000048813c24fd000000740748833c2461756d488b442408488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f5748bb80ce17c9a37f000048b810961fc9a37f0000ff1526010000eb05e9a5000000909090ff151e010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2408488b511848c70203000000488b5160909090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c24184883c41048894808594883c408488908c34989d84889c348b8985b1fc9a37f0000ff254600000090909090909000000000000000006002000000000000|@10600,2097151,@18837,@7831,@7855,@8482,@10543|170,0,@219 214,0,@7830 330,0,@7849 340,0,@10597 436,0,@1294 580,0,@10524 10597:S25|4c6162656c73206d75737420626520312c322c332c2e2e2e2e 10598:S68|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d6c2d283129 10599:D3,48|483b65187303ff55484883f813750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18836| 10600:S20|534b4950535f28292e6765744c6162656c283229 10601:D10,504|483b65187303ff5548488b4310488b00488b4b48488b094883f95375034889c14883f94174124883f943740c4883f93174064883f9757551498d47e8483b45107303ff55404989c748c740f80200000048b970991fc9a37f00004889084c894008488060ffbf6a016a01415241514150534c8d4c24204d89d0488b5424109090ff12488b442420eb3f48c7c075000000ff157a0100006a016a0141524151415053909090ff156e010000488b042448ba98bd17c9a37f0000ff156201000048b8d09507c9a37f0000488b0c24488b5110488b12488b5948488b1b4883fb5375034889d34883fb177517504889c848ba98bd17c9a37f000090ff152a010000eb66488b5110488b12488b5948488b1b4883fb5375034889d34883fb4174124883fb43740c4883fb3174064883fb7575744889c348c7c017000000909090ff15ee00000053488b5c2408ff15ea000000488b44240848ba98bd17c9a37f0000909090ff15da0000004c8b5424204c8b4c24184c8b442410488b5c240848c7c001000000e87afeffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e91000000048894808488b0c244889084883c438c34889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889084883c430c390909090900000000000000000f001000000000000|@10603,2097151,@18839,@10512,@10496,@7831,@7831,@10512,@10496,@7831|82,0,@10602 176,0,@7830 192,0,@1394 239,0,@7830 341,0,@7830 10602:D3,56|483b65187303ff55484883f85f74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18838| 10603:S77|50415253455f5459504528292e7061727365547970652833297475706c65547970652831296261736963547970652831297365714c6f636e7c74795365712d70726f636573734c697374283129 10604:S64|50415253455f5459504528292e7061727365547970652833297475706c6554797065283129626173696354797065283129636f6e7374727563746f7273283229 10605:D5,128|483b65187303ff55486a016a016a016a014c8b50104989c34989d44d89c54989de4889e348c7c00100000090ff1566000000488b4424204c895c2420488b4c24184c8954241848894c24104d89ca4883c4104d8b4c24084d89e84c89f34889c148c7c00100000051ff2532000000909000000000000000007800000000000000|@10614,2097151,@18846,@10615,@10606| 10606:D36,5376|483b65187303ff5548488b4310488b00488b4b48488b094883f95375034889c14889c848ba6e9b1fc9a37f0000488d5482fcffe29090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9b3010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96d010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9ce000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f919740948c7c001000000eb4848c7c003000000eb4448c7c003000000eb4748c7c003000000eb3e48c7c003000000eb3548c7c003000000eb2c48c7c003000000eb2348c7c003000000eb1a48c7c003000000eb11e90c000000e90700000048c7c0030000004883f801751a415241514150534889c84c89c2909090ff124883f801740beb6341524151415053eb5f488b1c2448b868b11fc9a37f0000909090ff151a120000488b0424488b4810488b09488b5048488b124883fa5375034889ca524889d0488b5424109090ff124883f8017521488b042448b98a9e1fc9a37f0000488d4c81fceb0ae9e3020000e9de020000ffe1e9ca020000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9b4010000909090e993010000909090e9ad010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96e010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9cf000000909090e9d0000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b1000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e992000000909090e93b000000909090e995000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048833c2419740948c7c001000000eb4848c7c003000000eb4448c7c003000000eb4748c7c003000000eb3e48c7c003000000eb3548c7c003000000eb2c48c7c003000000eb2348c7c003000000eb1a48c7c003000000eb11e90c000000e90700000048c7c0030000004883f801753b488b0424488b5424109090ff124883f8017528488b44240848ba98bd17c9a37f000090ff15160f00004883c408483b65187303ff5548e9e2fcffff48c7c0010000004883c408eb0748c7c001000000488b0424488b4810488b09488b5048488b124883fa5375034889ca488b4850488b09488b5878488b1b48bea2a11fc9a37f0000488d7496fcffe6e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9c4010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9f9020000909090e993010000909090e91e040000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e924040000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e97e050000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e94e070000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5070000909090e93b000000909090e9ea080000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048c7c101000000eb6f488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fb8483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f488d573048c742f80200000048bb88b11fc9a37f000048891a488b5c240848895a08eb05e992080000488062ffbf488b7424384d8d47e84c3b45107303ff55404d89c749c740f80200000049b980b41fc9a37f00004d890849894008498060ffbf4d8d4fe04c3b4d107303ff55404d89cf49c741f8030000004d8941104c8b46084d8941084c8b164d89116a016a01ff7424284c8d5424084d89cb4989f949c7c0030000004c89db4889d0909090ff15960b0000498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810594883c4084889480848c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb70498d57e8483b55107303ff55404989d748c742f80200000048be70b61fc9a37f0000488932488b74240848897208488062ffbf5351ff70305248ba98bd17c9a37f000090ff15fe0a00006a016a01ff742448ff742470ff35f40a00004c8b4c24604c8d4424184889e3488b442428eb05e93c070000909090ff15da0a0000498d47e0483b45107303ff55404989c748c740f803000000488b4c24204883c418488948105a4889500848c70035000000498d57d0483b55107303ff55404989d748c742f805000000488b5c24204883c41048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a498d7fc8483b7d107303ff55404989ff48c747f803000000488957104889470848c70701000000488d472048c740f80200000048c7400801000000488938eb6c48ba98bd17c9a37f000090ff151a0a0000ff742430ff742408ff742418ff35100a00004989e14c8b44242048bbd08d1fc9a37f000048c7c005000000909090ff15f6090000488b004883c420eb5b5351ff703048ba98bd17c9a37f00009090ff15de090000488b442418eb05e908060000488b4810488b09488b5048488b124883fa5375034889ca4883fa65745e4883fa0d745d4883fa31745c4889c348b8e8611fc9a37f0000eb05e9cb05000090ff1596090000488b442418488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54242890ff124883f801754d48833c24657446eb0fe94c000000e947000000e94200000048833c240d742e48833c24317427488b44242048ba98bd17c9a37f0000909090ff15320900004883c408483b65187303ff5548eb8548c7c0010000004883c408eb0748c7c001000000498d47e8483b45107303ff55404989c748c740f80200000048b968b91fc9a37f0000488908488b4c242048894808488060ffbf6a016a014c8b5424404989e14989c0488b5c2428488b442460488b5424389090ff126a016a014c8b4c24404c8b4424384889e3488b442418ff15a6080000498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2408488908488b0c24488d501848c742f805000000488b5c24284883c41848895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a498d7fc8483b7d107303ff55404989ff48c747f803000000488957104889470848c70705000000488d472048c740f80200000048c7400801000000488938eb62488b4850488b09488b5078488b125251ff703048ba98bd17c9a37f00009090ff15e6070000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa77752048ba98bd17c9a37f00009090ff15ba07000048c7c003000000eb0ce9ba03000048c7c001000000ff742420ff35a3070000504c8b442430488d5c240848b8985b1fc9a37f00009090ff158e070000498d4fe8483b4d107303ff55404989cf48c741f802000000488b500848895108488b18488919488b742430488b7e10488b3f4c8b46484d8b004983f85375034989f84983f8237516514889f048ba98bd17c9a37f0000ff153a070000eb1e4889cf48c7c0230000009090ff152e070000574889f39090ff152a070000ff742438ff742448ff35240700004989e14c8b44245048bbb0671fc9a37f000048c7c023000000909090ff150a070000488b48084883c418498d57d0483b55107303ff55404989d748c742f805000000488b5c243048895a20488b591848895a18488b74242848897210488b710848897208488b7c242048893a498d7fe8483b7d107303ff55404989ff48c747f8020000004c8b004c89470841594c890f4d8d4fc04c3b4d107303ff55404d89cf49c741f804000000498979185f4883c428498979104989510849c70107000000498d512848c742f80200000048c74208010000004c890aeb6f48ba98bd17c9a37f000090ff154a060000ff742438ff742420ff742420ff742420ff742420ff35380600004989e14c8b44243048bbd08d1fc9a37f000048c7c005000000909090ff151e060000498d4fc8483b4d107303ff55404989cf48c741f803000000488b50084883c430eb05e9b201000048895110488b184889590848c70109000000488d712048c746f80200000048c746080100000048890eeb70498d57e8483b55107303ff55404989d748c742f80200000048be70bc1fc9a37f0000488932488b74240848897208488062ffbf5351ff70305248ba98bd17c9a37f000090ff158a0500006a016a01ff742448ff742470ff35800500004c8b4c24604c8d4424184889e3488b442428eb05e90f010000909090ff1566050000498d47e0483b45107303ff55404989c748c740f803000000488b4c24204883c418488948105a4889500848c70035000000498d57d0483b55107303ff55404989d748c742f805000000488b5c24204883c41048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a498d7fc8483b7d107303ff55404989ff48c747f803000000488957104889470848c70701000000488d472048c740f80200000048c7400801000000488938eb4c48ba98bd17c9a37f000090ff15a6040000ff742428ff742408ff742418ff359c0400004989e14c8b44242048bbd08d1fc9a37f000048c7c005000000909090ff1582040000488b004883c4204889c64889f24889d04889c1488b0424488b5010488b12488b5848488b1b4883fb5375034889d34883fb6175165148ba98bd17c9a37f0000909090ff1542040000eb0848c7c00100000051488b442408488b4810488b09488b5048488b124883fa5375034889ca4889d148bb42ad1fc9a37f0000488d5c8bfcffe39090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9b3010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96d010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e9ce000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fa19740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4748c7c103000000eb3e48c7c103000000eb3548c7c103000000eb2c48c7c103000000eb2348c7c103000000eb1a48c7c103000000eb11e90c000000e90700000048c7c1030000004883f901744fff742440ff742440ff7424404c8b5424384c8b4c24304c8b4424284889c348c7c001000000e83eebffff4883f8017508584883c420c218004889c3488b04244883c428594883c41851ff2531010000584883c420c21800900000000000000000f814000000000000|@10620,2097151,@18849,@10496,@7831,@10621,@7831,@10648,@10625,@7831,@10649,@10556,@7831,@10496,@7831,@10656,@7831,@7831,@10658,@10543,@7831,@10512,@10496,@10659,@10556,@7831,@10661,@10556,@7831,@10665,@10625,@7831,@10666,@10556,@7831,@10619|37,0,$10606+54 749,0,@10607 818,0,$10606+850 1531,0,@7830 1627,0,$10606+1642 2284,0,@10608 2347,0,@10609 2562,0,@10611 2595,0,@7830 2847,0,@7830 2890,0,@10586 2930,0,@7830 3004,0,@10530 3117,0,@7830 3195,0,@10612 3466,0,@7830 3518,0,@7830 3578,0,@10524 3672,0,@7830 3742,0,@10534 3951,0,@7830 4002,0,@10586 4134,0,@10613 4167,0,@7830 4419,0,@7830 4462,0,@10586 4541,0,@7830 4601,0,$10606+4618 10607:S9|5369676e6174757265 10608:D3,720|483b65187303ff55484889c148bba6b11fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bb010000909090e9bc010000909090e993010000909090e9b5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e976010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4748c7c103000000eb3e48c7c103000000eb3548c7c103000000eb2c48c7c103000000eb2348c7c103000000eb1a48c7c103000000eb11e90c000000e90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff229090909090900000000000000000c802000000000000|@7990,1048575,@18841|14,0,$10608+30 10609:D6,336|483b65187303ff5548488b4a08488b5950488b1b488b7128488b36488b7978488b3f4c8b41704d8b004d8d4fd04c3b4d107303ff55404d89cf49c741f805000000498979204d8941184989591049897108488b59304989194989d24d89cb48bb587f1fc9a37f0000ff15fa0000004152415348bb80ce17c9a37f0000ff15ee0000009090ff15ee000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b5108488b5a184883c40848c70303000000488b4a604889ca90ff1248b8d09507c9a37f0000c39090909090909000000000000000004801000000000000|@10610,1048575,@18842,@100,@7855,@8482|96,0,@10573 116,0,@7849 204,0,@1294 304,0,@1394 10610:S75|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d6e6577656e762d283129 10611:D3,720|483b65187303ff55484889c148bb8eb61fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bb010000909090e9bc010000909090e993010000909090e9b5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e976010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4748c7c103000000eb3e48c7c103000000eb3548c7c103000000eb2c48c7c103000000eb2348c7c103000000eb1a48c7c103000000eb11e90c000000e90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff229090909090900000000000000000c802000000000000|@7990,1048575,@18843|14,0,$10611+30 10612:D3,736|483b65187303ff55484883f80d74064883f831750848c7c003000000c34889c148bb9ab91fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bb010000909090e9bc010000909090e993010000909090e9b5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e976010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4748c7c103000000eb3e48c7c103000000eb3548c7c103000000eb2c48c7c103000000eb2348c7c103000000eb1a48c7c103000000eb11e90c000000e90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff2290900000000000000000d802000000000000|@7990,1048575,@18844|34,0,$10612+50 10613:D3,720|483b65187303ff55484889c148bb8ebc1fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9bb010000909090e9bc010000909090e993010000909090e9b5010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e976010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9cf000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b0000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e991000000909090e93b000000909090e994000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4748c7c103000000eb3e48c7c103000000eb3548c7c103000000eb2c48c7c103000000eb2348c7c103000000eb1a48c7c103000000eb11e90c000000e90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff229090909090900000000000000000c802000000000000|@7990,1048575,@18845|14,0,$10613+30 10614:S39|50415253455f44454328292e70617273654465632833297369676e617475726553706563283329 10615:D4,144|483b65187303ff55486a016a016a014989d84889e348c7c001000000ff1586000000498d47e0483b45107303ff55404989c748c740f80300000048b960c01fc9a37f0000488908488b4c240848894808488b54241048895010488060ffbf5b49891849894808498950104989401848c7c0010000004883c410c390909090909000000000000000008800000000000000|@10618,127,@18848,@8796|60,0,@10616 10616:D3,376|483b65187303ff55485052488b4a104889ca9090ff124883f8017561488b4c2408f6c101740948c7c003000000eb08488b01488d440001a80174084883f8037e59eb06f640ff107556f6c101740948c7c003000000eb08488b01488d440001a80174084883f8037e08eb1ef640ff10741848b8f07206c9a37f0000eb05e9da000000488b5d0890ff13f6c1017516480fb64109488d440001eb0de920000000e91b0000004889c84883f84f740948c7c001000000eb1048c7c003000000eb0748c7c001000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a4883f801750948c7c001000000eb0748c7c0090000004881c8f17002004883c8054889c3498d47d0483b45107303ff55404989c748c740f80200000048895808488910488b14244889c3488d401848c740f8020000004889580848890853488b5208909090ff12584883c410c3488b004883c410c39090909000000000000000007001000000000000|@10617,1048575,@18847|115,0,@219 228,0,@573 10617:S43|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129283129 10618:S40|50415253455f44454328292e70617273654465632833296d616b6554797065566172456e76283129 10619:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18885| 10620:S57|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129 10621:D23,1568|488dbc2450ffffff483b7d187303ff55504152415150534150488b44243048ba98bd17c9a37f0000ff150a0600006a016a016a014889e348c7c0010000009090ff15fa050000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908504c8b4424384889c348c7c003000000ff15ba050000ff742418ff35b8050000504c8b442450488d5c240848b8b0671fc9a37f0000909090ff15a2050000504c8b4008488b5c2458488b084889c89090ff1592050000488b0424488b4c2458488b5110488b12488b5948488b1b4883fb5375034889d34883fb23751cff30ff70084889c848ba98bd17c9a37f00009090ff155a050000eb26488b18488b700848c7c0230000009090ff154a0500005356488b5c2468909090ff1542050000488b442468488b4810488b09488b5048488b124883fa5375034889ca4883fa19756a48837c2418017467488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f5748bb80ce17c9a37f000048b830ca1fc9a37f0000eb0ae99b010000e9ac000000ff15ae0400009090ff15ae040000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2468488b511848c70203000000488b5160909090ff12eb0748c7c001000000488b44246848ba98bd17c9a37f00009090ff15fa0300004c8b442468488b5c244848b8b0671fc9a37f00009090ff15e6030000488b4c2450488b5008498d5fa0483b5d107303ff55404989df48c743f805000000488b712048897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8d5b3049c743f80500000049895b204c8b204d8963184c8b6c24084d896b10498953084c8b2c244d892b4d8d6fe84c3b6d107303ff55404d89ef49c745f8020000004d895d0849c745000d0000004c8b5c24584d892b49895b0848c7c0010000004883c460c20800498d4fe8483b4d107303ff55404989cf48c741f80200000048ba78ca1fc9a37f0000488911488b54244848895108488061ffbf6a016a01ff742448488d5c240853504c8b5424284c8b4c24584c8b442440488b5c24304889c890ff15de020000488b442478488b4810488b09488b5048488b124883fa5375034889ca6a016a014883fa05757048ba98bd17c9a37f00009090ff15ae020000498d47e8483b45107303ff55404989c748c740f80200000048b9e0ca1fc9a37f0000488908488b4c246848894808488060ffbfffb42488000000ff742460ff35720200004c8b8c24a00000004c8d4424184889e39090ff1562020000eb1c4889e148c701010000004889e1488b542418488951086a016a016a01488b8424a00000004883c418488b4810488b09488b5048488b124883fa5375034889ca6a016a014881fa85000000754448ba98bd17c9a37f00009090ff150a020000ffb42498000000ff742478ff35010200004c8b8c24b00000004c8d4424184889e3488b84249000000090ff15ea010000eb1c4889e148c701010000004889e1488b542418488951086a016a016a01488b8424980000004883c418488b4c2408498d57b8483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f8020000004c8b5c24104d895a084c8b5c24204d891a4d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67b04c3b65107303ff55404d89e749c74424f8060000004d895c2428415b4883c4284d895c242049c7442418010000004d89542410498954240849c70424010000004d8d54243849c742f8020000004d89620849c702010000004c8b5c24584d89134989530848c7c0010000004883c460c2080090909090909000000000000000001806000000000000|@10626,2097151,@18852,@7831,@8796,@10552,@10627,@10543,@8558,@7831,@10512,@10496,@7855,@8482,@7831,@10543,@10628,@7831,@10635,@10625,@7831,@10640,@10625|32,0,@7830 165,0,@10534 254,0,@7830 430,0,@7849 440,0,@10622 540,0,@1294 646,0,@7830 674,0,@10534 892,0,@10623 1002,0,@7830 1044,0,@10624 1190,0,@7830 10622:S52|4461746174797065207265706c69636174696f6e206d757374206e6f7420636f6e7461696e2074797065207661726961626c6573 10623:D3,64|483b65187303ff55484883f805750848c7c003000000c34881f885000000750848c7c003000000c3488b5208ff22909000000000000000003800000000000000|@7990,1048575,@18850| 10624:D3,48|483b65187303ff55484881f885000000750848c7c003000000c3488b5208ff2200000000000000002800000000000000|@7990,1048575,@18851| 10625:D4,48|483b65187303ff55484c89c14989d84889c34889c8ff252d000000909090909000000000000000002800000000000000|@10646,2097151,@18865,@10644| 10626:S43|50415253455f44454328292e706172736544656328332964617461747970654465634f725265706c283429 10627:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18853| 10628:D7,600|483b65187303ff5548488b4c2408488b5110488b12488b7148488b364883fe5375034889d64883fe4d74514883fe0d74504883fe31744f4883fe41744e4883fe43744d4883fe31746b4883fe75746a41504152535041514889cb48b8687107c9a37f0000ff1506020000488b442430488b4810488b09488b5048eb19e9b5000000e9b0000000e9ab000000e9a6000000e9a1000000488b124883fa5375034889ca524889d0488b5424109090ff124883f801eb0ae97d000000e978000000754c48833c244d744a48833c240d744848833c2431745448833c2441744d48833c2443744648833c2431743f48833c24757438488b44243848ba98bd17c9a37f0000ff15720100004883c408eb0fe918000000e913000000e90e000000483b65187303ff5548e941ffffff48c7c0010000004883c408eb124889c248c7c0010000004150415253524151488b04244c8b4c24304883c4084c8b4010488b5808488b084889c890ff15160100006a016a014989c24c8b4c24484c8b4424384889e3488b44241090ff15fe000000488b442420488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bb988c19c9a37f00004d891a4d8d5fc84c3b5d107303ff55404d89df49c743f8060000004c8b6424284d8963284989432049895318415c4883c4104d8963104d895308415a4883c4104d89134c8b5424104d891a4989520848c7c001000000c21800909000000000000000005002000000000000|@10632,2097151,@18855,@10496,@7831,@10571,@10629|92,0,@1304 248,0,@7830 485,0,@8373 10629:D12,1096|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa4d75714983f9017470498b4850488b09498b5028488b12498b7078488b36498b7870488b3f4d8d5fd04c3b5d107303ff55404d89df49c743f8050000004989732049897b1849894b1049895308498b483049890b5341524151415050415348bb80ce17c9a37f000048b888d31fc9a37f0000eb0ae9c8000000e9a3000000909090ff15b60300009090ff15b6030000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70001000000488b4c2408488b51609090ff12eb085341524151415050488b44240848ba98bd17c9a37f000090ff150e030000eb124889c148c7c0010000005341524151415051ff3424ff35f90200004c8b4424184889e348b8985b1fc9a37f0000909090ff15e6020000504c8b4008488b5c2420488b084889c89090ff15d6020000488b0424488b4c24204883c418488b5110488b12488b5948488b1b4883fb5375034889d36a016a014883fb4b7572ff7008ff304889c848ba98bd17c9a37f00009090ff1596020000498d47e8483b45107303ff55404989c748c740f80200000048b9d8d31fc9a37f0000488908488b4c242048894808488060ffbf6a016a014989e14c8b442448488b5c24389090ff1552020000498d47f0483b4510730aeb05e988000000ff55404989c748c740f80100000059488908498d4fb0483b4d107303ff55404989cf48c741f803000000488b5424084889511048894108488b442410488901488b1424488d592048c743f805000000488b70204883c41848897320488b7a1848897b184c8b40104c8943104c8b4a084c894b084c8b104c89134989e349890b4889e148895908eb3b498d57e0483b55107303ff55404989d748c742f803000000488b1848895a1048c7420801000000488b70084889324889e74889174889e248897208488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa7d756e48ba98bd17c9a37f00009090ff15520100006a016a014c8b5424384c8b4c24304c8b4424284889e3488b442420e892fcffff498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2408488908488b4c2410488b1424488d581848c743f805000000eb05e942000000488b71204883c40848897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8b5c243049890349895b0848c7c0010000004883c438c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908488b4c2430488901488b4424084889410848c7c0010000004883c438c390909000000000000000004004000000000000|@10634,2097151,@18856,@7855,@8217,@7831,@10633,@10543,@8558,@7831,@10547,@7831|131,0,@7849 141,0,@10630 244,0,@1294 339,0,@7830 393,0,@10524 490,0,@7830 532,0,@10631 830,0,@7830 10630:S62|60606f702727206d6179206e6f7420617070656172206265666f7265206120636f6e7374727563746f7220696e20612073706563696669636174696f6e2e 10631:D3,48|483b65187303ff55484883f87d750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18854| 10632:S38|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629 10633:D3,56|483b65187303ff55484883f87d74064883f84b750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18857| 10634:S48|50415253455f44454328292e7061727365446563283329646174617479706542696e64283629636f6e73747273283129 10635:D4,72|483b65187303ff5548534c8b4210488b5a089090ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000004000000000000000|@10637,2097151,@18858,@10636| 10636:D12,392|483b65187303ff55486a016a016a014989d94989c24889e348c7c00100000090ff157a010000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908415041515041524889c348c7c003000000909090ff1536010000ff3424ff3535010000504c8b442430488d5c240848b8b0671fc9a37f0000ff1522010000504c8b4008488b5c2438488b084889c89090ff1512010000488b0424488b4c2438488b5110488b12488b5948488b1b4883fb5375034889d34883fb23751cff7008ff304889c848ba98bd17c9a37f00009090ff15da000000eb26488b5808488b3048c7c0230000009090ff15ca0000005356488b5c2448909090ff15c20000006a016a01ff742450488d44240850ff7424684c8b5424304c8b4c24604c8b442440488b5c2428488b442458909090ff1596000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c458488908c39090909000000000000000008001000000000000|@10639,2097151,@18859,@8796,@10552,@10638,@10543,@8558,@7831,@10512,@10496,@10628|136,0,@10534 222,0,@7830 10637:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292d45 10638:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18860| 10639:S41|50415253455f44454328292e7061727365446563283329646174617479706542696e64696e67283229 10640:D4,88|483b65187303ff5548534c8b52104c8b4a0849c7c00100000048c7c301000000ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10637,2097151,@18861,@10641| 10641:D15,936|483b65187303ff55486a016a016a014989c14989db4889e348c7c00100000090ff159a030000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b54240848895008488b1c2448891841504152415141534d89d04889c348c7c001000000ff1556030000ff742408ff3554030000504c8b442428488d5c240848b8b0671fc9a37f0000909090ff153e030000504c8b4008488b5c2430488b084889c89090ff152e030000488b0424488b7008488b384c8b4c24304883c4084c8b442448488b5c2440488b442438909090ff150a0300006a016a0148837c2428017422488b4c2438488b5110488b12488b5948488b1b4883fb5375034889d34883fb23750848837c24400174134889e048c700010000004889e048897008eb6d488b4c2438488b5110488b12488b5948488b1b4883fb5375034889d34883fb23751b5657504889c848ba98bd17c9a37f0000909090ff158e020000eb224889c348c7c0230000009090ff1582020000565753488b5c24509090ff157a020000488b442450488b4810488b09eb05e935010000488b5048488b124883fa5375034889ca4883fa41745c4883fa43745b4883fa31745a4883fa7574594889c348b8687107c9a37f00009090ff1532020000488b442450488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54245090ff124883f801755648833c2441eb14e964000000e95f000000e95a000000e955000000744648833c2443743f48833c2431743848833c24757431488b44245848ba98bd17c9a37f0000909090ff15c20100004883c408483b6518730aeb05e908000000ff5548e96fffffff48c7c0010000004883c408eb0748c7c0010000006a016a014989e14c8b442410488b5c2460488b442458909090ff157e010000498d47f0483b45107303ff55404989c748c740f80100000059488908488d4c2420488901488d442420594883c40848894808eb025657488b442408488b4c2418498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bb988c19c9a37f00004d891a4d8d5fa84c3b5d107303ff55404d89df49c743f8070000004c8b6424204d8963304c8b6424504d89632849894320498953184c8b6424104d8963104d895308415a4883c4684d8913498d434048c740f802000000488950084c8918c39090909090900000000000000000a003000000000000|@10643,2097151,@18862,@8796,@10552,@10642,@10543,@8558,@10571,@7831,@10512,@10496,@10496,@7831,@10547|137,0,@10534 337,0,@7830 454,0,@1304 573,0,@7830 811,0,@8373 10642:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18863| 10643:S37|50415253455f44454328292e70617273654465632833297479706542696e64696e67283429 10644:D4,376|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba38df1fc9a37f000048891148895908488061ffbf6a016a01504151415053488d5c24204889c84c89c2ff12488b442410488b4810488b09488b5048488b124883fa5375034889ca4883fa05756e48ba98bd17c9a37f00009090ff150e0100006a016a014c8b4c24204c8b442418488b5c24104889e090e862ffffff498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2428488908488b4c2430488b1424488d581848c743f805000000488b7120eb05e93e0000004883c40848897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8b5c241849890349895b0848c7c0010000004883c430c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c2420488908488b4c2418488901488b4424284889410848c7c0010000004883c430c3909000000000000000007001000000000000|@10647,2097151,@18866,@7831|35,0,@10645 114,0,@7830 10645:D3,48|483b65187303ff55484883f805750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18864| 10646:S37|50415253455f44454328292e7061727365446563283329616e6442696e64696e6773283229 10647:S39|50415253455f44454328292e7061727365446563283329616e6442696e64696e67732832292829 10648:D4,88|483b65187303ff5548534c8b52104c8b4a0849c7c00300000048c7c303000000ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10637,2097151,@18867,@10641| 10649:D4,80|483b65187303ff5548534c8b4a184c8b4210488b5a089090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000004800000000000000|@10595,2097151,@18870,@10650| 10650:D8,440|483b65187303ff554853ff35c00100004151415053488d5c241848b810e31fc9a37f0000ff15ae010000504c8b4008488b5c2410488b084889c89090ff159e010000488b0424488b4c2410488b5110488b12488b5948488b1b4883fb5375034889d36a016a014883fb4b756eff70084889c848ba98bd17c9a37f0000ff1566010000498d47e8483b45107303ff55404989c748c740f80200000048b990e31fc9a37f0000488908488b4c242048894808488060ffbf6a016a014989e14c8b442440488b5c24389090ff1522010000498d47c0483b4510730aeb05e960000000ff55404989c748c740f80100000059488908488b4c2408488b1424488d581048c743f805000000488b71204883c41048897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134989e34989034889e048895808eb154889e148c701010000004889e1488b500848895108498d47c0483b45107303ff55404989c748c740f8040000005948894818488b4c240848894810488b0c244889480848c700030000004889c2488d402848c740f802000000488948084889104883c438c3909090900000000000000000b001000000000000|@10655,2097151,@18871,@10654,@10543,@8558,@7831,@10547|28,0,@10651 116,0,@7830 156,0,@10653 10651:O1|@10652 10652:D3,72|4883f823750848c7c003000000c34883f80d750848c7c003000000c34883f831740848c7c001000000c348c7c003000000c390909090909000000000000000004000000000000000|@7990,1,@18868| 10653:D3,728|483b65187303ff55484889c148bbaee31fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e923020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9c4010000909090e9c5010000909090e993010000909090e9be010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e97f010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9d8000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b9000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9a4000000909090e93b000000909090e9a2000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4c48c7c103000000eb4348c7c103000000eb3a48c7c103000000eb3148c7c103000000eb2848c7c103000000eb1fe91a000000e91500000048c7c103000000eb0ce90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff220000000000000000d002000000000000|@7990,1048575,@18869|14,0,$10653+30 10654:D3,48|483b65187303ff55484883f84b750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18872| 10655:S72|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f4578283129 10656:D5,304|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa31757353415141504c89cb48b8985b1fc9a37f0000ff150a010000504c8b4008488b5c2408488b084889c89090ff15fa000000488b04246a016a014c8b4c24204c8b4424184889e3488b48084889c8909090e886ffffff488b442410498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e96e000000c641ff4048c70101000000498d57c0483b55107303ff55404989d748c742f80400000048894a18488b480848894a10488b1848895a0848c70203000000488d722848c746f8020000005f48897e08488916488b5424204889325e4883c4184889720848c7c0010000004883c408c348c703010000004889430848c7c001000000c39000000000000000002801000000000000|@10657,2097151,@18873,@10543,@8558|48,0,@10524 10657:S74|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d736967696473283129 10658:D3,56|483b65187303ff55484883f82374064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18874| 10659:D5,128|483b65187303ff5548ff7208ff3586000000534c8b4210488d5c240848b8985b1fc9a37f00009090ff1572000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b500848895108488b18488919488b342448890e4889560848c7c0010000004883c418c3909090909000000000000000007800000000000000|@10595,2097151,@18875,@10660,@10543|30,0,@10524 10660:D3,56|483b65187303ff55484883f82374064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18876| 10661:D4,88|483b65187303ff554853ff72284c8b52204c8b4a184c8b4210488b5a08909090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10595,2097151,@18878,@10662| 10662:D8,440|483b65187303ff5548415253415141504989d848bbd08d1fc9a37f000048b810e31fc9a37f000090ff15a2010000504c8b4008488b5c2418488b084889c89090ff1592010000488b0424488b4c2418488b5110488b12488b5948488b1b4883fb5375034889d34883fb137518ff70084889c848ba98bd17c9a37f0000ff155e010000eb1e488b580848c7c01300000090ff155201000053488b5c2420ff154e010000498d47e8483b45107303ff55404989c748c740f80200000048b910ed1fc9a37f0000488908488b4c241048894808488060ffbf6a016a014c8b5424384989e14989c0488b5c2430488b442448488b54242890ff12488b442410488b4c2408498d9770ffffff483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80300000049894a1049c7420801000000415b4883c4104d891a4c8b1c244d8d622049c74424f8040000004d895424184d8b53084883c4284d895424104d8b2b4d896c240849891424498d44242848c740f802000000488950084c8920c208000000000000000000b001000000000000|@10664,2097151,@18879,@10543,@8558,@7831,@10512,@10496|21,0,@10586 31,0,@10651 116,0,@7830 188,0,@10663 10663:D3,728|483b65187303ff55484889c148bb2eed1fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e923020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9c4010000909090e9c5010000909090e993010000909090e9be010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e97f010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9d8000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b9000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9a4000000909090e93b000000909090e9a2000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4c48c7c103000000eb4348c7c103000000eb3a48c7c103000000eb3148c7c103000000eb2848c7c103000000eb1fe91a000000e91500000048c7c103000000eb0ce90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff220000000000000000d002000000000000|@7990,1048575,@18877|14,0,$10663+30 10664:S79|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f537472756374757265283129 10665:D4,88|483b65187303ff5548534c8b52104c8b4a0849c7c00100000048c7c303000000ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10637,2097151,@18880,@10641| 10666:D4,80|483b65187303ff5548534c8b4a184c8b4210488b5a089090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000004800000000000000|@10595,2097151,@18882,@10667| 10667:D10,392|483b65187303ff554853ff35900100004151415053488d5c241848b8985b1fc9a37f0000ff157e010000504c8b4008488b5c2410488b084889c89090ff156e010000488b0424488b4c2410488b5110488b12488b5948488b1b4883fb5375034889d34883fb137518ff70084889c848ba98bd17c9a37f0000ff153a010000eb1e488b580848c7c01300000090ff152e01000053488b5c2418ff152a010000498d47e8483b45107303ff55404989c748c740f80200000048b960f31fc9a37f0000488908488b4c241048894808488060ffbf6a016a014989e14c8b442430488b5c24289090ff15e6000000488b442410488b4c2408498d5790483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f804000000415b4883c4104d895a18415b4883c4284d895a104989520849c7020b000000498d422848c740f802000000488950084c8910c39090909090909000000000000000008001000000000000|@10670,2097151,@18883,@10669,@10543,@8558,@7831,@10512,@10496,@10547|28,0,@10524 112,0,@7830 184,0,@10668 10668:D3,728|483b65187303ff55484889c148bb7ef31fc9a37f0000488d5c8bfcffe390e91b020000909090e913020000909090e923020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9c4010000909090e9c5010000909090e993010000909090e9be010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e97f010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9d8000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9b9000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9a4000000909090e93b000000909090e9a2000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f819740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4c48c7c103000000eb4348c7c103000000eb3a48c7c103000000eb3148c7c103000000eb2848c7c103000000eb1fe91a000000e91500000048c7c103000000eb0ce90700000048c7c1030000004883f901740848c7c003000000c3488b5208ff220000000000000000d002000000000000|@7990,1048575,@18881|14,0,$10668+30 10669:D3,48|483b65187303ff55484883f813750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18884| 10670:S73|50415253455f44454328292e70617273654465632833297369676e6174757265537065632833297061727365536967456e7472696573283129746869735369672d646f56616c283129 10671:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18886| 10672:D3,64|483b65187303ff55484883f823740c4883f81574064883f813750848c7c003000000c3488b5208ff229090909090909000000000000000003800000000000000|@7990,1048575,@18889| 10673:S49|50415253455f44454328292e7061727365446563283329737472756374757265446563283329646f537472446563283129 10674:S15|53796d626f6c732e72657072283129 10675:O2|@10676,@10502 10676:D27,3728|483b65187303ff5548488b4b10488b09488b7348488b364883fe5375034889ce4883fe45745c4883fe0d745b4883fe31745a4883fe6b745950534151415252415048b8d00720c9a37f000090ff15560e0000488b442420488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54240890ff124883f8017556eb14e969000000e964000000e95f000000e95a00000048833c2445744648833c240d743f48833c2431743848833c246b7431488b44242848ba98bd17c9a37f0000909090ff15e60d00004883c408483b6518730aeb05e908000000ff5548e96fffffff48c7c0010000004883c408eb134889c148c7c001000000515341514152524150498d47e8483b45107303ff55404989c748c740f80200000048b9000820c9a37f0000488908488b0c2448894808488060ffbf488b542420488b5a50488b1b488b7278488b36488b7a10488b3f4c8b42484d8b004983f85375034989f86a016a014983f8457571505653ff72304889d048ba98bd17c9a37f0000ff15360d0000488b4424586a016a016a014c8b40104c8b48084889e348c7c00100000090ff151a0d0000498d47e0483b45107303ff55404989c748c740f80300000048b9680820c9a37f00004883c4084889084c894808488b4c2408eb05e93b02000048894810488060ffbf498d4fe0483b4d107303ff55404989cf48c741f8030000004c89411048894108584883c408488901498d47e8483b45107303ff55404989c748c740f80200000048bad80820c9a37f0000488910488b54243048895008488060ffbf488b5c2438514c8b5424704c8b4c24484989c0488b4308488b5c24584889c64889c84889f2ff12488b4c2458488b5110488b12488b5948488b1b4883fb5375034889d34883fb357518504889c848ba98bd17c9a37f00009090ff15260c0000eb1e4889c348c7c0350000009090ff151a0c000053488b5c2460ff15160c0000498d47e8483b45107303ff55404989c748c740f80200000048b9500920c9a37f0000488908488b4c244048894808488060ffbf6a016a01ffb424880000004c8b5424684c8d4c24084989c0488b5c2478488b442420488b54246090e8defcffff488b442470488b4828488b09488b5070488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe1f7516525148ba98bd17c9a37f00009090ff157a0b0000eb264889d34889ce48c7c01f000000909090ff156a0b00005356488b9c2480000000ff15620b0000498d47d0483b45107303ff55404989c748c740f805000000488b4c244048894820488b4c240848894818488b4c243848894810594883c40848894808488b4c2420488908498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b542410488951105a4883c4304889510848c70103000000488d54240848890a488d4c240848894108eb684983f86b7567505653ff72304889d048ba98bd17c9a37f000090ff15be0a0000488b4424586a016a016a014c8b40104c8b48084889e348c7c00100000090ff15a20a0000498d47e0483b45107303ff55404989c748c740f80300000048b9c80920c9a37f0000eb0ae9be090000e9a10100004883c4084889084c894808488b4c240848894810488060ffbf498d4fe0483b4d107303ff55404989cf48c741f8030000004c89411048894108584883c408488901498d47e8483b45107303ff55404989c748c740f80200000048ba380a20c9a37f0000488910488b54243048895008488060ffbf488b5424384c8b5424684c8b4c24404989c0488b5c24504889c8488b52089090ff12488b4c2450488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241048897e2048895e18488b5c240848895e10488956085a4883c410488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb1f751856504889c848ba98bd17c9a37f000090ff1566090000eb224889c348c7c01f0000009090ff155a0900005653488b5c2448909090ff1552090000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118488b442408488941105a4889510848c70107000000488d54241048890a488d4c241048894108eb6e5051ff35eb0800004989d04889e348b8985b1fc9a37f0000909090ff15da080000488b4c24484883c410488b5150488b12488b5978488b1b488b7110488b36488b7948488b3f4883ff5375034889f74883ff43756bff7008ff305352ff71304889c848ba98bd17c9a37f0000eb05e9a1070000ff158a0800004c8b442420488b5c2460488b442418909090ff157a080000488b442460488b4810488b09488b5048488b124883fa5375034889ca4883fa5f7573488b4828488b09488b5070eb05e9e7060000488b12498d5fd0483b5d107303ff55404989df48c743f805000000488b7424104889732048895318488b5424084889531048894b08488b0c2448890b498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000eb05e931000000498d57d8483b55107303ff55404989d748c742f80400000048894a1848895a1048c742080100000048c70207000000eb5e498d4fe8483b4d107303ff55404989cf48c741f80200000048bab00a20c9a37f0000488911488b54244048895108488061ffbf488b5010488b12488b5848488b1b4883fb5375034889d34889da48be460020c9a37f0000488d7496fcffe6e93f0400009090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9ed000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9d3000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fb7b740948c7c201000000eb4848c7c203000000eb4448c7c203000000eb4948c7c203000000eb4e48c7c203000000eb4a48c7c203000000eb4f48c7c203000000eb5248c7c203000000eb4948c7c203000000eb40e93b000000e93600000048c7c203000000eb2de92800000048c7c203000000eb1fe91a000000e91500000048c7c203000000eb0ce90700000048c7c2030000004883fa01746e488b5424686a016a016a014989c84c8b4a104c8b52084889e348c7c00100000090ff156e040000498d47e0483b45107303ff55404989c748c740f80300000048b9280b20c9a37f00004883c4084889084c895008488b4c240848894810488060ffbf498d4fe0483b4d10730aeb05e9db000000ff55404989cf48c741f8030000004c89491048894108584883c408488901488b4424484c8b5424784c8b4c2450488b5c2460488b50084889c890ff12488b4c2460488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241048897e2048895e18488b5c240848895e1048895608488b1424488916498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c702010000004889d3498d57d8483b55107303ff55404989d748c742f80400000048895a18488972104889420848c70207000000eb326a016a01ffb424880000004c8b5424684c8d4c24084989c84889c3488b842480000000488b542460e8daf3ffff5a4883c408488b4424604883c418488b4828488b09488b5870488b1b488b7010488b36488b7848488b3f4883ff5375034889f74883ff5f751552535148ba98bd17c9a37f0000ff15d6020000eb264889d64889cf48c7c05f000000909090ff15c6020000565357488b5c24609090ff15be020000488b442420498d4fc0483b4d107303ff55404989cf48c741f805000000488b502048895120488b5c240848895918488b5810488959105e4883c40848897108488b30488931488d793048c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5fb84c3b5d107303ff55404d89df49c743f8080000004d8953384989433049894b2849897b204d894b184d894310488b7c240849897b085f4883c41049893b498d7fe8483b7d107303ff55404989ff48c747f8020000004c895f0848c707010000004c8d442408498938488d7c240848894f08eb66498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fd8483b5d107303ff55404989df48c743f804000000488b70084889731848895310488b104889530848c70309000000488d7c240848891f488d5c2408488973086a014883c408488b442450488b4c244048894c245059488b54244048894c24404989c24c8b4c24304c8b442428488b5c2408584883c43852ff25e30000009090900000000000000000880e000000000000|@10687,2097151,@18899,@10496,@7831,@7831,@8796,@7831,@10512,@10496,@7831,@10512,@10496,@7831,@8796,@7831,@10512,@10496,@10688,@10543,@7831,@8558,@8796,@7831,@10512,@10496,@10686|67,0,@10677 185,0,@7830 285,0,@10678 372,0,@7830 448,0,@10679 554,0,@10680 658,0,@7830 732,0,@10681 854,0,@7830 1067,0,@7830 1144,0,@10682 1255,0,@10683 1427,0,@7830 1597,0,@10524 1681,0,@7830 1955,0,@10684 2008,0,$10676+2030 2796,0,@10685 3172,0,@7830 10677:S29|737472756374206f722066756e63746f72206170706c69636174696f6e 10678:D3,64|483b65187303ff55484883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff22909090909000000000000000003800000000000000|@7990,1048575,@18891| 10679:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18892| 10680:D3,80|483b65187303ff55484883f81f74064883f835750848c7c003000000c34883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff229000000000000000004800000000000000|@7990,1048575,@18893| 10681:D3,80|483b65187303ff55484883f81f750848c7c003000000c34883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff229090909090909000000000000000004800000000000000|@7990,1048575,@18894| 10682:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18895| 10683:D3,80|483b65187303ff55484883f81f750848c7c003000000c34883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff229090909090909000000000000000004800000000000000|@7990,1048575,@18896| 10684:D3,80|483b65187303ff55484883f81774064883f85f750848c7c003000000c34883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff229000000000000000004800000000000000|@7990,1048575,@18897| 10685:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18898| 10686:D7,776|483b65187303ff5548498b4910488b09498b5148488b124883fa5375034889ca4883fa15756d41524151415053504c89c848ba98bd17c9a37f000090ff15de0200006a016a014c8b5424304989e14c8b442440488b5c2428488b44244848ba605c1fc9a37f000090ff15ba020000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000eb05e9eb000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57c8483b55107303ff55404989d748c742f80600000048894a2848894220488b4424084889421848c74210030000005948894a08488b4c240848890a498d4fb8483b4d107303ff55404989cf48c741f8020000004889510848c70105000000488b542410488d591848c743f805000000488b72204883c41848897320488b781848897b184c8b42104c8943104c8b48084c894b084c8b124c89134c8b5c24284c8b6424204c895c24284c896424204c8b5424104c8b4c240841584883c4104889c8e97dfeffff4883fa13756e41524151415053504c89c848ba98bd17c9a37f00009090ff158a0100006a016a014c8b5424304989e14c8b442440488b5c2428488b44244848ba605c1fc9a37f000090ff1566010000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000eb05e9eb000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57c8483b55107303ff55404989d748c742f80600000048894a2848894220488b4424084889421848c74210010000005948894a08488b4c240848890a498d4fb8483b4d107303ff55404989cf48c741f8020000004889510848c70105000000488b542410488d591848c743f805000000488b72204883c41848897320488b781848897b184c8b42104c8943104c8b48084c894b084c8b124c89134c8b5c24284c8b6424204c895c24284c896424204c8b5424104c8b4c240841584883c4104889c8e919fdffff4989004989580848c7c001000000c2100000000000000000000003000000000000|@10689,2097151,@18901,@7831,@10529,@7831,@10529|51,0,@7830 95,0,@10527 406,0,@7830 451,0,@10527 10687:S35|50415253455f44454328292e706172736544656328332973747275637456616c283329 10688:D3,80|483b65187303ff55484883f843750848c7c003000000c34883f815750848c7c003000000c34883f813750848c7c003000000c3488b5208ff229090909090909000000000000000004800000000000000|@7990,1048575,@18900| 10689:S51|50415253455f44454328292e706172736544656328332973747275637456616c283329646f436f6e73747261696e7473283229 10690:D4,64|483b65187303ff5548488b0c244c891424504d89ca4c8b4a084c89c04989d84889c348c7c00100000051ff252800000000000000000000003800000000000000|@10693,2097151,@18903,@10691| 10691:D5,1312|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f80200000048b9a81520c9a37f000048890848895808488060ffbf498b4810488b09498b5048488b124883fa5375034889ca4883fa61754e415241514150534c89c048ba98bd17c9a37f0000ff15ca040000488b442430488b4c2428488944243048894c24284c8b5424184c8b4c24104c8b4424085b4883c41848c7c001000000e95effffff498b4810488b09498b5048488b124883fa5375034889ca4883fa4774064883fa6d756e415241514150534c8b5424304c8b4c24184989c0488b5c2408488b442428488b542410ff1250ff742438ff7424384c8b5424304c8b4c24284c8b442420488b5c241848c7c001000000909090e8eafeffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90f00000048894808594883c420488908c21000498b4810488b09498b5048488b124883fa5375034889ca4889d148bec21120c9a37f0000488d748efcffe6e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fa7b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f901746f6a016a01415241514150534152ff7424484c8d5424304c8b4c244849c7c003000000488b5c2418ff15f2000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b542428eb05e96b0000004889511848894110488b4424204889410848c7010100000051ff742448ff7424484c8b5424304c8b4c24284c8b442420488b5c241848c7c001000000e82afbffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c2100048c7c001000000c2100090909090909000000000000000001805000000000000|@10710,2097151,@18915,@7831,@10694|35,0,@10692 96,0,@7830 355,0,$10691+370 10692:D3,768|483b65187303ff55484883f86d74144889c148bbd21520c9a37f0000488d5c8bfcffe3e9b70200009090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f87b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f90175064883f861750848c7c003000000c3488b5208ff229090900000000000000000f802000000000000|@7990,1048575,@18902|20,0,$10692+42 10693:S32|50415253455f44454328292e7061727365446563283329737472446563283329 10694:D58,5896|488dbc2440ffffff483b7d187303ff55504983f801752b488b4b10488b09488b5348488b124883fa5375034889ca4889d148be4a1920c9a37f0000488d748efcffe6e9b2020000909090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fa7b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f901746e488b4b10488b09488b5348488b124883fa5375034889ca488b4b50488b09488b7328488b36488b7b78488b3f4c8b43704d8b004d8d5fd04c3b5d107303ff55404d89df49c743f80500000049897b204d89431849894b1049897308488b733049893349b8761c20c9a37f0000eb05e92a1100004d8d4490fc41ffe09090e91b020000909090e92e020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9e8040000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9de040000909090e983010000909090e9a7050000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e987070000909090e9a2070000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e995070000909090e9d60a0000909090e9f3000000909090e9eb000000909090e9e10a0000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9240c0000909090e93b000000909090e9eb0c0000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048b8f09e0ac9a37f00004989024d895a0848c7c001000000c210004152575156505341514889d848ba98bd17c9a37f000090ff1552110000498d47e8483b45107303ff55404989c748c740f80200000048b9e83120c9a37f0000488908488b4c241048894808488060ffbf6a016a01ff742450ff35191100004c8b4c24604c8d4424104889e3ff150e110000488b4424284883c410488b4810488b09488b5048488b124883fa5375034889ca4881fa85000000756d48ba98bd17c9a37f0000909090ff15da100000498d47e8483b45107303ff55404989c748c740f80200000048b9503220c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742460ff742428ff359d1000004c8b4c24784c8d4424184889e3ff1592100000eb05e90b0000004883c418584883c408eb0748c7c001000000488b4c2418488b5110488b12488b5948488b1b4883fb5375034889d34881fb830000007518504889c848ba98bd17c9a37f00009090ff1546100000eb1e4889c348c7c0830000009090ff153a10000053488b5c2420ff1536100000498d47e8483b45107303ff55404989c748c740f80200000048b9a83220c9a37f0000488908488b4c242848894808488060ffbfff7424584c8b54246849b9003320c9a37f00004c8b442428488b5c24209090ff15e60f0000488b4c2420488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c244048897e2048895e18488b5c243848895e1048895608488b542430488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb1f751856504889c848ba98bd17c9a37f000090ff156e0f0000eb224889c348c7c01f0000009090ff15620f00005653488b5c2430909090ff155a0f00005890ff155a0f0000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57b0483b55107303ff55404989d748c742f80600000048894a28488b4c240848894a2048c7421803000000488b4c241048894a10488b0c2448894a08488902488d423848c740f8020000004889500848c70001000000488b54245048890248894a0848c7c0010000004883c458c21000488b4c240848894c24104c89ca4d89d949c7c0010000004889d35a4883c40852ff25a70e00004152575156505341514889d848ba98bd17c9a37f000090ff15920e00006a016a01ff742410ff742420ff35880e00004c8b4c24684c8d4424184889e3488b4424389090ff15760e0000488b4424204883c418498d4fd0483b4d107303ff55404989cf48c741f805000000488b54243848895120488b501848895118488b5c243048895910488b580848895908488b742428488931498d77e0483b75107303ff55404989f748c746f80300000048894e105f4883c43848897e0848c70613000000488b3c2448893748894f0848c7c0010000004883c408c210004152575156505341514889d848ba98bd17c9a37f0000ff15d20d00006a016a016a016a014889e348c7c001000000ff15c20d00006a016a016a016a014889e348c7c001000000ff15b20d0000488b442440498d4fe0483b4d107303ff55404989cf48c741f80300000048ba103320c9a37f0000488911488b54243848895108488b54241048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f80300000048894b10488b480848894b08488b30488933488d7b2048c747f803000000488957104c8b4424084c8947084c8b04244c8907534c8b8424880000004889fb48c7c003000000ff15160d00006a016a01ffb42498000000ffb424a8000000ff742420ff742478ff35fe0c00004c8b8c24c00000004c8d4424284889e3488b8424900000009090ff15e60c0000488b4424304883c428498d4fd0483b4d107303ff55404989cf48c741f805000000488b94248000000048895120488b501848895118488b5c247848895910488b580848895908488b742470488931498d77e8483b75107303ff55404989f748c746f802000000488b7c242848897e08488b7c241848893e498d7fe8483b7d107303ff55404989ff48c747f8020000004c8b4424484c8947084c8b4424384c89074d8d47d04c3b45107303ff55404d89c749c740f8050000004989482049897818498970105e4881c4800000004989700849c70019000000488b34244c890648894e0848c7c0010000004883c408c21000488b4424104c89c94989c14d89d04889da4889cb4889d0594883c41051ff25db0b0000488b4424104c89c94989c14d89d04889da4889cb4889d0594883c41051ff25c00b000041525751565053415141ff314889d848ba98bd17c9a37f0000909090ff15a60b0000488b4424086a016a016a014c8b40104c8b48084889e348c7c00100000090ff158a0b0000498d47e0483b45107303ff55404989c748c740f80300000048b9c03320c9a37f00004883c4084889084c894808488b4c240848894810488060ffbf498d4fc8483b4d107303ff55404989cf48c741f8030000004c89411048894108488b1424488911488d592048c743f80200000048be303420c9a37f0000488933488b74242848897308488063ffbf415050ff7424684c8b54247849b9003320c9a37f00004c8b4424384889df4889cb4889f890ff15de0a0000488b4c2430488b5110488b12488b5948488b1b4883fb5375034889d34883fb357518504889c848ba98bd17c9a37f00009090ff15ae0a0000eb1e4889c348c7c0350000009090ff15a20a000053488b5c2438ff159e0a0000498d47e0483b45107303ff55404989c748c740f80300000048b9903420c9a37f0000488908488b4c242848894808488b4c241848894810488060ffbf498d4fc8483b4d107303ff55404989cf48c741f803000000488b54241048895110488b54240848895108488901488d412048c740f80200000048baf03420c9a37f0000488910488b54244048895008488060ffbfff7424704c8b94248000000049b9003320c9a37f00004c8b4424404889cbff15f2090000488b4c2438488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c245848897e2048895e18488b5c245048895e1048895608488b542448488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb1f751856504889c848ba98bd17c9a37f000090ff157a090000eb224889c348c7c01f0000009090ff156e0900005653488b5c2448909090ff1566090000488b44241090ff15620900004889c3589090ff155e090000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57b8483b55107303ff55404989d748c742f80500000048894a20488b0c2448894a1848c742100300000048895a08488902488d423048c740f8020000004889500848c70027000000488b54246848890248894a0848c7c0010000004883c470c21000488b4424104c89c94989c14d89d04889da4889cb4889d0594883c41051ff25bc0800004152415357515650534889d848ba98bd17c9a37f00009090ff15a6080000488b0424488b4810488b09488b5048488b124883fa5375034889ca4883fa23740c4883fa0d74064883fa31756e6a016a014c8b4c24184989c04889e3488b44243890ff1566080000488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54243048895120488b501848895118488b5c242848895910488b580848895908488b742420488931498d77f0483b7510730aeb05e9cd000000ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c700010000004d8d4fd04c3b4d107303ff55404d89cf49c741f8050000004d8941204989791849897110498949085e4883c408498931498d77e8483b75107303ff55404989f748c746f8020000004c894e0848c70629000000488b7c243048893748894f0848c7c0010000004883c438c2100048c7c0310000009090ff153a070000488b1c249090ff1536070000488b042448ba98bd17c9a37f0000ff152a070000488b44243048b9f09e0ac9a37f0000488908488b4c24284889480848c7c0010000004883c438c2100041525751565041514889d848ba98bd17c9a37f0000ff15ee0600006a016a01ff742448ff742418ff35e40600004c8b4c24604c8d4424184889e3488b4424309090ff15d2060000488b4424204883c418498d4fd0483b4d107303ff55404989cf48c741f805000000488b54243048895120488b501848895118488b5c242848895910488b580848895908488b742420488931498d77e0483b75107303ff55404989f748c746f80300000048894e105f4883c43048897e0848c70635000000488b3c2448893748894f0848c7c0010000004883c408c210004152575156505341514889d848ba98bd17c9a37f0000ff152e0600006a016a016a016a014889e348c7c001000000ff151e0600006a016a016a016a014889e348c7c001000000ff150e060000488b442440498d4fe0483b4d107303ff55404989cf48c741f80300000048ba483520c9a37f0000488911488b54243848895108488b54241048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f80300000048894b10488b480848894b08488b30488933488d7b2048c747f803000000488957104c8b4424084c8947084c8b04244c8907534c8b8424880000004889fb48c7c003000000ff1572050000498d47e8483b45107303ff55404989c748c740f80200000048b9c03520c9a37f0000488908488b4c245848894808488060ffbf6a016a0148b9003320c9a37f000051ffb424a8000000ffb424a80000004c8b5424284c8b4c24784c8d44241848c7c301000000ff150e050000488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b94248000000048895120488b501848895118488b5c247848895910488b580848895908488b742470488931498d77e8483b75107303ff55404989f748c746f802000000488b7c242848897e08488b7c241848893e498d7fe8483b7d107303ff55404989ff48c747f8020000004c8b4424484c8947084c8b4424384c89074d8d47d04c3b45107303ff55404d89c749c740f8050000004989482049897818498970105e4881c4800000004989700849c70039000000488b34244c890648894e0848c7c0010000004883c408c210006a016a016a016a014989c34989dc4889e348c7c0010000009090ff150a0400006a016a016a016a014889e348c7c001000000ff15fa030000498d47e0483b45107303ff55404989c748c740f803000000488b4c243848894810498b490848894808498b114889106a016a014152ff742468ff74246849ba003320c9a37f00004d89e14c8d4424184c89dbff15aa030000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb183620c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f8050000004889532048bab06319c9a37f0000488953184889431048894b0848b8f8f419c9a37f0000488903498d47d8483b45107303ff55404989c748c740f8020000004889580848c7001d000000488d481848c741f801000000c641ff4048c70101000000498d57a0483b55107303ff55404989d748c742f80500000048c742200100000048894a18488b4c241048894a10488b5c240848895a08488902488d423048c740f80200000048c7400801000000488910488d501848c742f802000000488b5c242848895a08488b5c241848891a498d5fe8483b5d107303ff55404989df48c743f802000000488b74244848897308488b742438488933498d77d0483b75107303ff55404989f748c746f80500000048894e2048895e18488956104889460848c70639000000488b04244889304889480848c7c0010000004883c458c2100000000000000000000017000000000000|@10715,2097151,@18917,@7831,@10716,@10625,@7831,@10717,@10625,@7831,@10512,@10496,@10718,@7831,@10512,@10496,@10721,@10621,@7831,@10722,@10625,@7831,@10615,@10615,@10552,@10729,@10625,@10825,@10825,@7831,@8796,@10718,@7831,@10512,@10496,@10718,@7831,@10512,@10496,@10846,@10847,@10825,@7831,@10848,@10512,@10496,@7831,@7831,@10850,@10625,@7831,@10615,@10615,@10552,@10851,@10615,@10615,@10711|51,0,$10694+74 861,0,$10694+886 1432,0,@3172 1471,0,@7830 1512,0,@10695 1613,0,@7830 1656,0,@10696 1786,0,@7830 1860,0,@10697 1896,0,@10698 2035,0,@7830 2295,0,@7830 2512,0,@7830 2605,0,@10699 3129,0,@7830 3208,0,@10701 3294,0,@10702 3333,0,@10698 3402,0,@7830 3476,0,@10703 3569,0,@10704 3608,0,@10698 3743,0,@7830 4002,0,@7830 4416,0,@7830 4437,0,@3172 4484,0,@7830 4700,0,@7830 4793,0,@10705 4952,0,@10706 4983,0,@10698 5389,0,@10698 5444,0,@573 5485,0,@8492 5526,0,@10707 5567,0,@8345 5589,0,@8566 10695:D3,64|483b65187303ff55484881f88300000074094881f885000000750848c7c003000000c3488b5208ff229090909090909000000000000000003800000000000000|@7990,1048575,@18904| 10696:D3,48|483b65187303ff55484881f883000000750848c7c003000000c3488b5208ff2200000000000000002800000000000000|@7990,1048575,@18905| 10697:D3,48|483b65187303ff55484883f81f750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18906| 10698:O1|@10694 10699:D3,80|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff22488b004883c410c390909090909000000000000000004800000000000000|@10700,1048575,@18907| 10700:S39|50415253455f44454328292e70617273654465632833296465632834296e6577456e762d283129 10701:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18908| 10702:D3,56|483b65187303ff55484883f81f74064883f835750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18909| 10703:D3,56|483b65187303ff55485052488b4a104889ca9090ff12488b0424488b48084883c408584889caff2200000000000000003000000000000000|@10510,1048575,@18910| 10704:D3,48|483b65187303ff55484883f81f750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18911| 10705:D3,80|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff22488b004883c410c390909090909000000000000000004800000000000000|@10700,1048575,@18912| 10706:D3,48|483b65187303ff55484883f805750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18913| 10707:O1|@10708 10708:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@18914| 10709:S26|50415253455f5452454528292e6d6b4964656e74283229283129 10710:S42|50415253455f44454328292e706172736544656328332973747244656328332967657444656373283129 10711:D8,3136|483b65187303ff5548498b4910488b09498b5148488b124883fa5375034889ca4883fa2f74144889d148be1a3720c9a37f0000488d748efcffe6e9bc060000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883fa31740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901753e4883fa23743d4883fa0d743c4883fa31743b4883fa41743a4883fa4374394883fa3f744f4883fa4d744e4883fa45744d4883fa27744c4883fa0f744beb1ee904040000e9ff030000e9fa030000e9f5030000e9f0030000e9eb0300004881fa8100000074604883fa33745f4883fa55745eeb19e9cf030000e9ca030000e9c5030000e9c0030000e9bb03000041504152504151534c89cb48b8684320c9a37f0000909090ff15fa080000488b442408488b4810488b09488b5048488b124883fa537514eb0fe97d030000e978030000e9730300004889ca524889d0488b542408ff124883f801751c48833c242f741a488b042448b99a3a20c9a37f0000488d4c81fcffe1e94f030000e94a030000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e904020000909090e9e3010000909090e9fd010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e956010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f7000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b8000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e94900000090909048833c2431740948c7c001000000eb3d48c7c003000000eb3448c7c003000000eb2b48c7c003000000eb2248c7c003000000eb1948c7c003000000eb1048c7c003000000eb0748c7c0030000004883f801754148833c2423743f48833c240d744648833c2431744448833c2441744e48833c2443744c48833c243f744a48833c244d744848833c2445745648833c24277454eb0ae991000000e98c00000048833c240f7461eb0ae97e000000e97900000048813c24810000007464eb14e968000000e963000000e95e000000e95900000048833c2433745248833c2455744beb0ae944000000e93f000000488b44241048ba98bd17c9a37f0000ff157e0500004883c408eb05e91f000000483b65187303ff5548e963fcffff41504152eb05e906000000504151536a01488b442410488b4810488b09488b5048488b124883fa5375034889ca4883fa2f74144889d148bb223e20c9a37f0000488d5c8bfcffe3e9e6020000909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883fa31740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901753e4883fa23743d4883fa0d743c4883fa31743b4883fa41743a4883fa4374394883fa3f744d4883fa4d74474883fa4574414883fa27743b4883fa0f7435eb1ee92e000000e929000000e924000000e91f000000e91a000000e9150000004881fa81000000740c4883fa3374064883fa557570498d4fe8483b4d107303ff55404989cf48c741f80200000048ba884320c9a37f0000488911488b54240848895108488061ffbf6a016a01ff742430ff742458ff74245849bae04320c9a37f00004c8b4c24404989c0488d5c24184889c89090ff15d6010000488b442420488b4810eb05e919010000488b09488b5048488b124883fa5375034889ca4883fa2d756f48ba98bd17c9a37f0000909090ff15a20100006a016a01ff742440ff742468ff74246849bae04320c9a37f00004c8b4c24504c8b442448488d5c2418488b442440ff1576010000488b442418488b4c2408498d57a0483b55107303ff55404989d748c742f805000000488b5820eb05e96900000048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80500000049894a2049895218415b4883c4084d895a104c8b1c244d895a0849c7021b0000004c8b5c24384d89134989530848c7c0010000004883c440c21000488b442438488b0c24488908488b4c24084889480848c7c0010000004883c440c21000488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907488b44242848b9f09e0ac9a37f00004889084889780848c7c0010000004883c430c210009090909090900000000000000000380c000000000000|@10859,2097151,@18982,@10496,@7831,@10860,@7831,@10854|43,0,$10711+66 845,0,@10712 937,0,$10711+962 1748,0,@7830 1843,0,$10711+1866 2631,0,@10713 2674,0,@10714 2749,0,@7830 2784,0,@10714 3085,0,@3172 10712:S10|45787072657373696f6e 10713:D3,48|483b65187303ff55484883f82d750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18916| 10714:O1|@10711 10715:S29|50415253455f44454328292e7061727365446563283329646563283429 10716:D4,80|483b65187303ff5548534c8b420848c7c301000000909090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000004800000000000000|@10637,2097151,@18918,@10636| 10717:D4,88|483b65187303ff5548534c8b52104c8b4a0849c7c00100000048c7c301000000ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10637,2097151,@18919,@10641| 10718:D4,1056|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa61754441524151415053504c89c048ba98bd17c9a37f000090ff15f6030000488b44243048894424304c8b5424204c8b4c24184c8b442410488b5c2408584883c420e996ffffff498b4810488b09498b5048488b124883fa5375034889ca4889d148bebe4520c9a37f0000488d748efcffe690e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fa7b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f9017471498d4fe8483b4d107303ff55404989cf48c741f80200000048ba784920c9a37f000048891148894108488061ffbf6a016a0141524151415053504152ff7424484c8d5424384989d949c7c003000000488b5c24204889c8488b542428909090ff12ff7424404c8b5424284c8b4c2420eb05e9450000004c8b442418488b5c2410488b442408909090e82efcffff4889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c428594883c408488908c2080048c7c001000000c2080090909090909000000000000000001804000000000000|@10720,2097151,@18921,@7831|51,0,@7830 134,0,$10718+150 863,0,@10719 10719:D3,760|483b65187303ff55484889c148bb964920c9a37f0000488d5c8bfcffe390e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f87b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f90175064883f861750848c7c003000000c3488b5208ff22909090909090900000000000000000f002000000000000|@7990,1048575,@18920|14,0,$10719+30 10720:S43|50415253455f44454328292e706172736544656328332964656328342964656353657175656e6365283229 10721:D3,168|483b65187303ff5548a8017572498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a52488b48084889c8909090e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,7,@18922| 10722:D4,72|483b65187303ff5548534c8b4210488b5a089090ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000004000000000000000|@10637,2097151,@18925,@10723| 10723:D12,1200|483b65187303ff5548488b4b10488b09488b5348488b124883fa5375034889ca4883fa4d751a535041504889d848ba98bd17c9a37f000090ff158a040000eb0e4889c148c7c00100000053514150ff742408ff35780400004c8b4424204889e348b810e31fc9a37f00009090ff1566040000504c8b4008488b5c2428488b084889c89090ff1556040000488b0424488b4c24284883c418488b5110488b12488b5948488b1b4883fb5375034889d34883fb23756dff7008ff304889c848ba98bd17c9a37f00009090ff151a040000488b442420488b4810488b09488b5048488b124883fa5375034889ca4883fa4d751448ba98bd17c9a37f00009090ff15ee030000eb0748c7c0010000004c8b442420488b5c241848b810e31fc9a37f0000eb05e97e0100009090ff15ca030000488b4c2408488b5008498d5fc0483b5d107303ff55404989df48c743f805000000488b712048897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8d5b3049c743f80100000041c643ff4049bc30e306c9a37f00004d89234d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049bd10cf19c9a37f00004d892c244d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049be405320c9a37f00004d8975004d8d77a84c3b75107303ff55404d89f749c746f8050000004d896e20498956184d895e104d8966084c8b184d891e4d8d663049c74424f8020000004d8974240849c704241d0000004d8d6c241849c745f80100000041c645ff4049be10cf19c9a37f00004d8975004d8d77b04c3b75107303ff55404d89f749c746f8060000004d89662849894e2049895e1849c74610010000004d896e08415c4883c4084d8926498d463848c740f802000000488958084c89304883c418c34883fb4b756fff7008ff304889c848ba98bd17c9a37f0000ff153e020000498d47e8483b45107303ff55404989c748c740f80200000048b9905320c9a37f0000488908488b4c241848894808488060ffbf488b4c24106a016a014989e14c8b4110488b5c24309090ff15f6010000488b442418eb05e9ec000000488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f801000000415b4883c4084d891a4d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049bc10cf19c9a37f00004d89234d8d67c84c3b65107303ff55404d89e749c74424f80600000049bdf09e0ac9a37f00004d896c2428498944242049895424184d895424104d895c2408415a4883c4084d891424498d47e8483b45107303ff55404989c748c740f802000000488950084c89204883c418c3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57c8483b55107303ff55404989d748c742f80600000048bbf09e0ac9a37f000048895a28488b580848895a2048895a1848c742100100000048894a08488b0848890a498d47e8483b45107303ff55404989c748c740f802000000488958084889104883c418c390909090900000000000000000a804000000000000|@10728,2097151,@18926,@7831,@10727,@10543,@8558,@7831,@7831,@10543,@7831,@10547|47,0,@7830 98,0,@10651 190,0,@7830 242,0,@7830 279,0,@10651 392,0,@573 436,0,@8492 479,0,@10724 583,0,@8492 692,0,@7830 732,0,@10726 917,0,@8492 955,0,@3172 1064,0,@8492 1101,0,@3172 10724:O1|@10725 10725:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@18923| 10726:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18924| 10727:D3,56|483b65187303ff55484883f82374064883f84b750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18927| 10728:S48|50415253455f44454328292e7061727365446563283329646563283429657863657074696f6e42696e64696e67283129 10729:D4,88|483b65187303ff554853ff72204c8b521849b9003320c9a37f00004c8b4210488b5a0890ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000005000000000000000|@10637,2097151,@18928,@10730|19,0,@10698 10730:D4,312|483b65187303ff55486a016a0141514152ff7424284d89c24989d94989c0488d5c241848c7c0010000009090ff151e010000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbd09507c9a37f000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048bed09507c9a37f0000488933498d77c8483b75107303ff55404989f748c746f80600000048895e2848894620488b4424084889461848894e105948894e08488916498d47e8483b45107303ff55404989c748c740f8020000005948894808488930c2080000000000000000003001000000000000|@10738,2097151,@18931,@10731|115,0,@8492 156,0,@1394 197,0,@1394 10731:D23,1752|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba185e20c9a37f00004889114c894108488061ffbf6a016a0153415241514150504d89ca4c8d4c24284989c84c89d3488b4424189090ff1592060000488b5c2410488b442428ff158a06000048833c2401750948c7c101000000eb63488b0c24488b11488b1a483b58087458f6c3017547f64008017541488b780840f6c701740948c7c603000000eb08488b37488d7436014883c6104989f04889de4c89c148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901746d488b4c2410eb0ae915030000e961010000488b7150488b36488b7928488b3f4c8b41784d8b004c8b49704d8b094d8d57d04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a08488b71304989324c8b58104c8b60084c8b284c8b7208eb05e900010000534c89e348b8705e20c9a37f00009090ff159e05000048bba05e20c9a37f0000ff15960500005b90ff159605000048bbc07c07c9a37f0000ff158e0500004153415441554156415248bb80ce17c9a37f00009090ff157a0500009090ff157a050000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2430488b511848c70203000000488b5160909090ff12eb0bff7010ff7008ff30ff7208488b0424a801750af6442418017503ff5570483b442418750948c7c101000000eb6a488b4c2430488b5150488b12488b5928488b1b488b7178488b36488b7970488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989501049895808488b5130498910415048c7c303000000488b44242048baa05f06c9a37f0000eb05e90d010000ff15420400004889c348b8d85e20c9a37f000090ff153604000048bbf85e20c9a37f0000ff152e0400005048c7c303000000488b44241048baa05f06c9a37f0000909090ff15160400004889c3589090ff151204000048bb80ce17c9a37f0000ff150a0400009090ff150a040000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2430488b511848c70203000000488b5160909090ff124889c14883c408eb08ff7010ff7008ff30488b442428488b4810488b09488b5048488b124883fa5375034889ca4883fa23751348ba98bd17c9a37f000090ff1532030000eb4f4889c348c7c07b0000009090ff1526030000488b442428488b4810488b09488b5048488b124883fa5375034889ca4883fa71751448ba98bd17c9a37f00009090ff15fa020000eb0748c7c001000000498d47e8483b45107303ff55404989c748c740f80200000048b9305f20c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742470ff7424704c8b9424880000004c8b4c24484c8d4424104889c3488b442450ff159a020000488b442458488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049c702010000004d8d5fd84c3b5d107303ff55404d89df49c743f8040000004d895318498953105a49895308488b542408498913488b5424304c8b52104d8b124c8b62484d8b24244983fc5375034d89d46a016a014983fc7d757341534889d048ba98bd17c9a37f0000909090ff15d6010000498d47e8483b45107303ff55404989c748c740f802000000488b4c243048894808488b4c2428488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901ffb42488000000ffb42488000000ffb42488000000eb05e91e0000004c8b5424684c8b4c24604c8b442458488d5c24204889c8e8d2f9ffffeb134889e248c702010000004889e248894a084153498d47b8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908488b4c2458488b1424488d581848c743f805000000488b71204883c44848897320488b7a1848897b184c8b41104c8943104c8b4a084c894b084c8b114c89134c8b1c2449890349895b0848c7c0010000004883c418c21800909090900000000000000000d006000000000000|@10741,2097151,@18932,@10742,@10739,@100,@100,@100,@100,@7855,@8482,@194,@100,@100,@194,@100,@7855,@8482,@7831,@10496,@7831,@10711,@7831|35,0,@10732 338,0,@10733 356,0,@10734 380,0,@1343 406,0,@7849 496,0,@1294 729,0,@193 755,0,@10735 772,0,@10736 801,0,@193 832,0,@7849 920,0,@1294 1063,0,@7830 1134,0,@7830 1185,0,@10737 1441,0,@7830 10732:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18929| 10733:S31|5468697320636c6175736520646566696e65732066756e6374696f6e206060 10734:S36|2727206275742070726576696f757320636c6175736528732920646566696e6564206060 10735:S16|5468697320636c617573652068617320 10736:S38|20617267756d656e7473206275742070726576696f757320636c617573652873292068616420 10737:D3,48|483b65187303ff55484883f87d750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18930| 10738:S36|50415253455f44454328292e706172736544656328332964656328342966756e42283129 10739:D14,2360|483b65187303ff55484883380575546a016a016a016a014989d84889e3909090ff152a090000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908eb644883382d7563488b480848833905755e6a016a016a016a014989d84889e3909090ff15ce080000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908eb6ee9fd070000e933020000488b5350488b12488b7328488b36488b7b78488b3f4c8b43704d8b004d8d4fd04c3b4d107303ff55404d89cf49c741f805000000498979204d8941184989511049897108488b533049891153415148bb80ce17c9a37f000048b8786920c9a37f0000eb05e98f0700009090ff151e0800009090ff151e080000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b511848c70203000000488b5160ff12488b0424488b48504883c408488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f803000000488979104889410848b8509adc0000000000488901498d4798483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c8917488d472048c740f80400000048c740180100000048c74010010000004889780848c70001000000eb634883380b7562488b48104883392d755d488b510848833a0575586a016a016a016a01ff70084989d8488d5c24084889c8ff1536060000498d47c8483b45107303ff55404989c748c740f801000000594889084889c1488d401048c740f804000000eb14e95d050000e90b050000e95a020000e92000000048894818488b4c241048894810488b4c240848894808594883c418488908eb6d488b7350488b36488b7b28488b3f4c8b43784d8b004c8b4b704d8b094d8d57d04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a08488b733049893253415248bb80ce17c9a37f000048b8786920c9a37f0000909090ff1572050000eb05e9bc040000909090ff156a050000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b511848c70203000000488b5160ff12488b0424488b48504883c408488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f803000000488979104889410848b8509adc0000000000488901498d4798483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c8917488d472048c740f80400000048c740180100000048c74010010000004889780848c70001000000eb6a4883390575696a016a016a016a01ff70084989d8488d5c24084889c8ff1596030000498d47c8483b45107303ff55404989c748c740f801000000594889084889c1488d401048c740f80400000048894818488b4c241048894810488b4c240848894808594883c418eb0ae98a020000e905000000488908eb6b488b5350488b12488b7328488b36488b7b78488b3f4c8b43704d8b004d8d4fd04c3b4d107303ff55404d89cf49c741f805000000498979204d8941184989511049897108488b533049891153415148bb80ce17c9a37f000048b8786920c9a37f000090ff15de020000eb05e910020000909090ff15d6020000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b511848c70203000000488b5160ff12488b0424488b48504883c408488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f803000000488979104889410848b8509adc0000000000488901498d4798483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c8917488d472048c740f80400000048c740180100000048c74010010000004889780848c70001000000eb4d6a016a016a016a014889e090ff1512010000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908488b480848c7c201000000488b18f6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdc4889c3498d47e0483b45107303ff55404989c748c740f80300000048895010488b0948894808488918c390909000000000000000003009000000000000|@10818,1048575,@18963,@10819,@10819,@7855,@8482,@10819,@7855,@8482,@10819,@7855,@8482,@10817|289,0,@7849 299,0,@10740 396,0,@1294 595,0,@573 640,0,I48 1003,0,@7849 1013,0,@10740 1112,0,@1294 1311,0,@573 1356,0,I48 1689,0,@7849 1699,0,@10740 1796,0,@1294 1995,0,@573 2040,0,I48 10740:S79|53796e746178206572726f723a2066756e2062696e64696e67206973206e6f7420616e206964656e746966696572206170706c69656420746f206f6e65206f72206d6f7265207061747465726e732e 10741:S47|50415253455f44454328292e706172736544656328332964656328342966756e4228312962696e64696e6773283129 10742:D11,2032|483b65187303ff5548488b4b10488b09488b5348488b124883fa5375034889ca4883fa4d74264883fa4174254883fa3f74244883fa4374234889d148be7a6a20c9a37f0000488d748efcffe6e9fc050000e9f7050000e9f2050000e9ed0500009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883fa31740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901755a4883fa0d74594883fa3174584883fa797457415153415050415248b8707220c9a37f0000ff150a050000488b442418488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54241890ff124883f8017547eb14e91a030000e915030000e910030000e90b03000048833c244d742f48833c2441742d48833c243f742b48833c24437429488b042448b9a66d20c9a37f0000488d4c81fcffe1e9c8020000e9c3020000e9be020000e9b9020000e9b40200009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e904020000909090e9e3010000909090e9fd010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e956010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f7000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b8000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e94900000090909048833c2431740948c7c001000000eb3d48c7c003000000eb3448c7c003000000eb2b48c7c003000000eb2248c7c003000000eb1948c7c003000000eb1048c7c003000000eb0748c7c0030000004883f801753f48833c240d743848833c2431743148833c2479742a488b44242048ba98bd17c9a37f0000909090ff15e20100004883c408483b65187303ff5548e9befcffff48c7c0010000004883c408eb124889c148c7c0010000004151534150514152498d47e8483b45107303ff55404989c748c740f80200000048b9887220c9a37f0000488908488b4c241048894808488060ffbf488b5424086a016a0152ff742418ff742438ff356e010000ff357001000050488d44243050ff74244849bae87220c9a37f00004c8d4c24204c8b4210488b5a08488b02909090ff154a0100006a016a01ff742448ff74246048b8287620c9a37f0000504c8b5424584c8d4c24184c8b442450488b5c2448488b4424689090ff151a010000488b442458488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424509090ff124883f801756e488b5c245848b8387620c9a37f000090ff15de000000488b442458488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424509090ff124883f8017521488b44245848ba98bd17c9a37f000090ff15a2000000483b65187303ff5548ebb148c7c001000000eb0748c7c001000000488b442460488b0c244889084883c408594883c4504889480848c7c0010000004883c408c390900000000000000000e807000000000000|@10752,2097151,@18936,@10496,@7831,@10753,@10524,@10789,@10749,@10496,@7831|61,0,$10742+98 752,0,@10743 868,0,$10742+910 1565,0,@7830 1657,0,@10744 1725,0,@10745 1772,0,@10747 1867,0,@10748 1935,0,@7830 10743:S7|5061747465726e 10744:D3,56|483b65187303ff55484883f80b74064883f813750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18933| 10745:O1|@10746 10746:D3,776|4883f84d750848c7c003000000c34883f841750848c7c003000000c34883f83f750848c7c003000000c34883f843750848c7c003000000c34889c148ba467320c9a37f0000488d548afcffe29090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901740848c7c003000000c34883f80d74064883f831750848c7c003000000c34883f879740848c7c001000000c348c7c003000000c390909090909000000000000000000003000000000000|@7990,7,@18934|61,0,$10746+78 10747:O1|@10742 10748:S14|456e64206f66207061747465726e 10749:D7,704|483b65187303ff554848833b1d740948c7c101000000eb0748c7c103000000498d57e8483b55107303ff55404989d748c742f80200000048be607920c9a37f000048893248894208488062ffbf6a016a01415141504152505141524c8d5424304d89c14989d84889d3488b4424589090ff1562020000488b442448488b4810488b09488b5048488b124883fa5375034889ca4883fa0b756848ba98bd17c9a37f00009090ff153602000048833c2401756e488b442448488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4830eb05e98101000048890f5748bb80ce17c9a37f000048b8b87920c9a37f0000eb05e9ac000000ff15be0100009090ff15be010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2448488b511848c70203000000488b5160909090ff12eb0748c7c0010000006a016a014c8b5424204989e14c8b442418488b5c2458488b442460488b54245090ff12488b442428488b4c2408498d57a8483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80400000049895218415b4883c4084d895a104c8b5c24284d895a0849c702210000004c8b5c24204d89134989530848c7c0010000004883c438c21800488b4c2420488b542428488911488b5424304889510848c7c0010000004883c438c218009090909090900000000000000000b802000000000000|@10815,2097151,@18961,@10813,@7831,@7855,@8482|57,0,@10750 154,0,@7830 267,0,@7849 277,0,@10751 372,0,@1294 10750:D3,48|483b65187303ff55484883f80b750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18935| 10751:S32|4578706563746564206964206f722069643a7479206265666f72652060617327 10752:S39|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329 10753:D4,88|483b65187303ff5548534c8b521849b9287620c9a37f00004c8b4210488b5a08ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10771,2097151,@18940,@10754|16,0,@10747 10754:D34,4808|483b65187303ff5548488b4b10488b09488b5348488b124883fa5375034889ca488b4b50488b09488b7328488b36488b7b78488b3f4c8b5b704d8b1b4d8d67d04c3b65107303ff55404d89e749c74424f80500000049897c24204d895c241849894c24104989742408488b73304989342449bb2e7b20c9a37f00004d8d5c93fc41ffe3909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e959040000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e9a0040000909090e990050000909090e911070000909090e98d090000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9790c0000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9400e0000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e9f80e0000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9190f0000909090488b5310488b124c8b43484d8b004983f85375034989d04983f84d740c4983f80d74064983f831756e488b5310488b124c8b43484d8b004983f85375034989d04983f84d740948c7c201000000eb0748c7c2030000004883fa01741e57515652505341524889d848ba98bd17c9a37f000090ff15c20f0000eb134989c048c7c001000000575156524150534152488b04246a016a01eb05e950010000ff35a00f0000ff742430488d4c2410514c8b5424384c8b4c24304c8b4010488b5808488b084889c89090ff157e0f0000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb908e20c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f80500000048895320488b542408488953184889431048894b0858488903498d47a0483b45107303ff55404989c748c740f8020000004889580848c7001d000000488d481848c741f805000000488b5c24384883c42848895920488b5a1848895918488b74240848897110488b7208488971085f4883c4104889394889c7488d413048c740f80200000048894808488938c35053415448b8707220c9a37f0000ff15520e0000488b442408488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424109090ff124883f8017521488b44240848ba98bd17c9a37f000090ff15160e0000483b65187303ff5548ebb1498d47e8483b45107303ff55404989c748c740f802000000594883c4104889480848b9f09e0ac9a37f0000488908c3498b4008488b00498b4850488b09498b5028488b12498b7878488b3f4d8b48704d8b094d8d57d04c3b55107303ff55404d89d749c742f80500000049897a204d894a1849894a1049895208498b483049890a41544152504c89c048ba98bd17c9a37f0000ff157a0d0000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048bae08e20c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c3498b4008488b00498b4850488b09498b5028488b12498b7878488b3f4d8b48704d8b094d8d57d04c3b55107303ff55404d89d749c742f80500000049897a204d894a1849894a1049895208498b483049890a41544152504c89c048ba98bd17c9a37f000090ff158a0c0000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba608f20c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c357515650534152415041514889d848ba98bd17c9a37f000090ff15e60b0000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa5b750948c7c101000000eb28504c8b5424184c8b4c24104c8b442408488b5c242848c7c001000000909090ff159e0b00004889c1488b4424184883c418488b5028488b12488b5870488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c242048897e2048895e18488b5c241848895e1048895608488b542410488916488b5010488b12488b5848488b1b4883fb5375034889d34883fb5b7515565148ba98bd17c9a37f000090ff15220b0000eb224889cb48c7c05b0000009090ff15160b00005653488b5c2410909090ff150e0b0000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fc0483b4d107303ff55404989cf48c741f804000000488b542408488951185b488959104889410848c70123000000488d412848c740f802000000488950084889084883c430c357515650534152415041514889d848ba98bd17c9a37f0000ff15860a0000488b442418488b4828488b09488b5070488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe5d7572525148ba98bd17c9a37f00009090ff154a0a0000498d47d0483b45107303ff55404989c748c740f805000000488b4c244848894820488b4c240848894818488b4c244048894810594883c40848894808488b4c2428488908498d4fd0483b4d107303ff55404989cf48c741f802000000eb05e9260000004889410848c701370000004889c2488d411848c740f802000000488950084889084883c440c3498d4fe8483b4d107303ff55404989cf48c741f80200000048bab88f20c9a37f000048891148894108488061ffbf6a016a016a014889e34889c8909090ff15860900006a016a01ff742428ff742438ff7424484c8b5424304c8b4c24604c8b442458488d5c241848c7c001000000909090ff155a090000488b442440488b4828488b09488b5070488b12498d5fd0483b5d107303ff55404989df48c743f805000000488b7424604889732048895318488b5424584889531048894b08488b4c245048890b488b4810488b09488b5048488b124883fa5375034889ca4883fa5d75145348ba98bd17c9a37f000090ff15e6080000eb1a48c7c05d00000090ff15de08000053488b5c2448ff15da080000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f805000000488b142448895120488b5c24104889591848894110488b4424084889410848c7011f000000498d47e8483b45107303ff55404989c748c740f802000000488950084889084883c470c357515650534152415041514889d848ba98bd17c9a37f0000ff153a080000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa5f7561488b4828488b09488b5070488b12498d5fb8483b5d107303ff55404989df48c743f805000000488b7424384889732048895318488b5424304889531048894b08488b4c242848890b488d7b3048c747f80200000048895f0848c70737000000eb6c498d4fe8483b4d107303ff55404989cf48c741f80200000048ba609120c9a37f0000488911488b54242048895108488061ffbf6a016a014c8b5424184989e14989c84889c3488b442420488b542410ff12488b442428488b4810488b09488b5048488b124883fa53750aeb05e9650100004889ca4883fa17757048ba98bd17c9a37f0000909090ff1532070000ff7424284c8b5424284c8b4c24204c8b442418488b5c243848c7c001000000909090ff1512070000498d4fa8483b4d107303ff55404989cf48c741f80200000048894108488b0424488901488b442428488b5028488b12488b5870eb05e97c000000488b1b488d711848c746f805000000488b7c244848897e2048895e18488b5c244048895e1048895608488b5424384889164c8d463049c740f80100000041c640ff4049b930e306c9a37f00004d8908498d7fd8483b7d107303ff55404989ff48c747f804000000488977184c89471048894f0848c70733000000eb67488b4828488b09488b5070488b12498d5fb0483b5d107303ff55404989df48c743f805000000488b7424484889732048895318488b5424404889531048894b08488b4c243848890b488d7b3048c747f80300000048895f10488b1c2448895f0848c7072d0000004883c410488b48284883c418488b09488b5070488b12498d5fd0483b5d107303ff55404989df48c743f805000000488b7424204889732048895318488b5424184889531048894b08488b4c241048890b488b4810488b09488b5048488b124883fa5375034889ca4883fa5f7514535748ba98bd17c9a37f0000ff157e050000eb1e48c7c05f00000090ff15760500005357488b5c2410909090ff156e050000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c430488908c3488b4350488b00488b4b28488b09488b5378488b12488b7b70488b3f4d8d4fd04c3b4d107303ff55404d89cf49c741f80500000049895120498979184989411049894908488b43304989015341544150415148bb80ce17c9a37f000048b8c09120c9a37f00009090ff15de0400009090ff15de040000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2410488b511848c70203000000488b5160909090ff12488b0424488b4808488b09488b5050488b12488b5828488b1b488b7078488b36488b7870488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989501049895808488b503049891041505148ba98bd17c9a37f0000909090ff15de030000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048baf89120c9a37f000048895120488b542408488951185a4883c410488951104889410848c70125000000498d47e8483b45107303ff55404989c748c740f8020000005a4883c40848895008488908c3498b4008488b00498b4850488b09498b5028488b12498b7878488b3f4d8b48704d8b094d8d57d04c3b55107303ff55404d89d749c742f80500000049897a204d894a1849894a1049895208498b483049890a41544152504c89c048ba98bd17c9a37f000090ff15ea020000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba509220c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c341544889d848ba98bd17c9a37f00009090ff154e020000498d47d0483b45107303ff55404989c748c740f802000000488b0c244889480848c7003d0000004889c2488d401848c740f802000000488948084889104883c408c3498b4008488b00498b4850488b09498b5028488b12498b7878488b3f4d8b48704d8b094d8d57d04c3b55107303ff55404d89d749c742f80500000049897a204d894a1849894a1049895208498b483049890a41544152504c89c048ba98bd17c9a37f0000ff15aa010000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba909220c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c390909090900000000000000000c012000000000000|@10774,2097151,@18942,@7831,@10524,@10775,@10496,@7831,@7831,@7831,@7831,@10778,@7831,@10512,@10496,@7831,@7831,@8510,@10781,@7831,@10512,@10496,@7831,@7831,@10772,@7831,@10512,@10496,@7855,@8482,@7831,@7831,@7831,@7831|115,0,$10754+134 783,0,@7830 912,0,@573 953,0,@8492 994,0,@10755 1176,0,@10743 1243,0,@7830 1304,0,@3172 1408,0,@7830 1452,0,@573 1489,0,@10757 1655,0,@7830 1700,0,@573 1737,0,@10760 1827,0,@7830 2039,0,@7830 2120,0,@573 2220,0,@7830 2286,0,@7830 2465,0,@10762 2667,0,@7830 2740,0,@573 2864,0,@7830 3035,0,@10764 3133,0,@7830 3316,0,@573 3588,0,@7830 3760,0,@7849 3770,0,@10765 3860,0,@1294 4041,0,@7830 4088,0,@573 4125,0,@10766 4295,0,@7830 4340,0,@573 4377,0,@10768 4458,0,@7830 4632,0,@7830 4676,0,@573 4713,0,@10769 10755:O1|@10756 10756:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@18937| 10757:O7|@8062,2,@391,@10758,@390,0,0 10758:O3|2,@467,@10759 10759:O3|6,@20193,79992 10760:O7|@10761,2,@391,@10758,@390,0,0 10761:S7|636f6e76496e74 10762:D7,264|483b65187303ff55484989d24989db4889c348b8288d1fc9a37f0000ff15fe00000048bb408d1fc9a37f0000ff15f60000004152415348bb80ce17c9a37f0000ff15ea0000009090ff15ea000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b5108488b5a184883c40848c70303000000488b4a604889caff229090909090909000000000000000000001000000000000|@10763,1048575,@18938,@100,@100,@7855,@8482|20,0,@10583 36,0,@10584 56,0,@7849 144,0,@1294 10763:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831297265706f7274447570283329 10764:D3,56|483b65187303ff55484883f81774064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18939| 10765:S38|5265616c20636f6e7374616e7473206e6f7420616c6c6f77656420696e207061747465726e73 10766:O7|@10767,2,@391,@10758,@390,0,0 10767:S8|636f6e765265616c 10768:O7|@8060,2,@391,@10758,@390,0,0 10769:O7|@10770,2,@391,@10758,@390,0,0 10770:S8|636f6e76576f7264 10771:S44|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837292d45 10772:D4,296|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f80200000048b9809420c9a37f000048890848895808488060ffbf6a016a01415241514150534d89ca4c8d4c24204989c0488b5c2438488b442418488b542408ff12488b442438488b4810488b09488b5048488b124883fa5375034889ca4883fa17756448ba98bd17c9a37f00009090ff15ae000000ff7424384c8b5424204c8b4c24184c8b442410488b5c240848c7c001000000e84affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24204889084883c430c20800498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24204889084883c430c20800909090909000000000000000002001000000000000|@10788,2097151,@18950,@7831|35,0,@10773 130,0,@7830 10773:D3,56|483b65187303ff55484883f81774064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18941| 10774:S55|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129 10775:D8,400|483b65187303ff55484151534d89c84c89d3488b44242890ff158a01000050ff7008ff30488b0424488b542418909090ff12a801752e488b00488b480848833903750948c7c203000000eb1f48833901740948c7c201000000eb1048c7c203000000eb0748c7c2010000004883fa01746f48837c243801756c488b1c2448c7c051000000ff152601000048bb089720c9a37f0000ff151e01000048bb80ce17c9a37f0000ff15160100009090ff1516010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c7411001000000eb0ae96d000000e96800000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f804000000488b542408488950184889481048c740080100000048c70001000000488b4c2420488b51609090ff12488b4424104883c410488b4c2420488b10488911488b58084883c4184889590848c7c001000000c218009090909000000000000000008801000000000000|@10777,2097151,@18943,@10543,@100,@100,@7855,@8217|140,0,@10776 156,0,@7849 256,0,@1294 10776:S46|292068617320696e666978207374617475732062757420776173206e6f74207072656365646564206279206f702e 10777:S41|50415253455f44454328292e70617273654465632833296765744c6f6e674e6f6e496e666978283729 10778:D4,296|483b65187303ff5548498d47e8483b45107303ff55404989c748c740f80200000048b9e09820c9a37f000048890848895808488060ffbf6a016a01415241514150534d89ca4c8d4c24204989c0488b5c2438488b442418488b542408ff12488b442438488b4810488b09488b5048488b124883fa5375034889ca4883fa17756448ba98bd17c9a37f00009090ff15ae000000ff7424384c8b5424204c8b4c24184c8b442410488b5c240848c7c001000000e84affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24204889084883c430c20800498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24204889084883c430c20800909090909000000000000000002001000000000000|@10780,2097151,@18945,@7831|35,0,@10779 130,0,@7830 10779:D3,56|483b65187303ff55484883f85b74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18944| 10780:S68|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d766172734c697374283129 10781:D11,1544|483b65187303ff5548498b4010488b00498b4848488b094883f95375034889c14883f9737535534c89c048ba98bd17c9a37f0000ff15e6050000488b042448c7000100000048c740080100000048c7c0010000004883c408c21800498d47e8483b45107303ff55404989c748c740f80200000048b908a020c9a37f00004889084c894808488060ffbf4151ff359705000053415041524151504c89c3488d442428909090ff1586050000488b4808488b10498d47e8483b45107303ff55404989c748c740f802000000488948084889105152488b54242090ff12488b442428488b4810488b09488b5048488b124883fa5375034889ca6a016a014883fa23753448ba98bd17c9a37f00009090ff15260500004c8b5424684989e14c8b442420488b5c2438488b442460488b5424709090ff12eb59488b542410f6c201740948c7c103000000eb08488b0a488d4c0901f6c10174084883f9017e5ceb06f641ff107559f6c201740948c7c103000000eb08488b0a488d4c0901f6c10174084883f9017e08eb20f641ff10741aeb05e9cc02000048b8f07206c9a37f0000488b5d08909090ff13f6c2017516480fb64a08488d4c0901eb0de9af010000e9aa0100004889d148c7c3630000004889c848ba5095dc000000000090ff124883f801746e488b4c2410f6c101740948c7c003000000eb08488b01488d440001a80174084883f8017e08eb16f640ff10741048b8f07206c9a37f0000488b5d08ff13f6c101750c480fb64108488d440001eb034889c848c7c37300000048ba9095dc00000000009090ff124883f801746eeb05e917010000488b442438488b4850488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b483048890f5748bb80ce17c9a37f000048b868a020c9a37f0000eb05e9ab00000090ff157a0300009090ff157a030000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2438488b511848c70203000000488b5160909090ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bba0a020c9a37f000048891a498d5fb8483b5d107303ff55404989df48c743f80500000048895320488b542418488953184889431048894b08488b442410488903488d4b3048c741f8020000004889590848c7011d000000ff742460ff742440ffb424800000004c8b9424800000004c8d4c24184989d04889cb488b442438ff15f2010000488b442418488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bb30e306c9a37f00004d891a4d8d5fd04c3b5d107303ff55404d89df49c743f805000000498953205a4883c40849895318498943104d8953085a4883c410498913488b5424104c8b52104d8b124c8b62484d8b24244983fc5375034d89d44983fc17756e41534889d048ba98bd17c9a37f000090ff15260100006a016a01ff742460ff742460ff7424604c8b5424384c8b4c24304c8b442440488d5c241848c7c001000000e89efaffff498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c2410eb05e922000000488908488b4c24305a4883c4104889114889410848c7c0010000004883c430c21800498d57e8483b55107303ff55404989d748c742f80200000048c74208010000004c891a4c8b54241849c702030000004989520848c7c0010000004883c430c2180090909090909000000000000000000006000000000000|@10787,2097151,@18948,@7831,@10786,@10596,@7831,@7855,@8482,@10749,@7831|44,0,@7830 117,0,@10782 258,0,@7830 404,0,@219 463,0,I28 527,0,@219 570,0,I29 678,0,@7849 688,0,@10783 784,0,@1294 904,0,@573 945,0,@8492 986,0,@10784 1209,0,@573 1315,0,@7830 10782:D3,56|483b65187303ff55484883f85d74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18946| 10783:S35|203d20706174206578706563746564206166746572206e756d65726963206c6162656c 10784:O1|@10785 10785:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@18947| 10786:D3,72|483b65187303ff55484883f823750848c7c003000000c34883f85d74064883f817750848c7c003000000c3488b5208ff229090909090909000000000000000004000000000000000|@7990,1048575,@18949| 10787:S67|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e2831296765744c6162656c73283129 10788:S66|50415253455f44454328292e70617273654465632833296465632834297061747465726e28332961746f6d69635061747465726e283129702d7475706c6573283129 10789:D5,248|483b65187303ff55486a016a016a016a0153415141524151ff742448534c8b4c24684c8b442470488d5c243048c7c00100000090ff15d6000000488b442430a80174084883f8017d2eeb06f640ff107426488b442420488b4c2448488b10488911488b58084889590848c7c0010000004883c438c22000ff74242850ff742468ff742468ff742420ff742430ff742470ff7424484c8b5424604c8b4c245849b8686b1fc9a37f000048c7c30100000048c7c0ffffffff9090ff155a000000488b4808488b542448488b1948891a488b71084889720848c7c0010000004883c438c2200090909090900000000000000000f000000000000000|@10793,2097151,@18952,@10794,@10790|160,0,@10545 10790:D6,1264|483b65187303ff55486a016a016a016a014150535041524151ff742460ff742460ff7424604c8b9424800000004c8b8c24880000004c8b842490000000488d5c244048c7c001000000909090ff15b6040000498d47b8483b45107303ff55404989c748c740f804000000488b4c244048894818488b54243848895010488b5c243048895808488b742428488930488d782848c747f8030000004c8b8424800000004c8947104c8b8c24880000004c894f084c8b14244c8917504c8b4424604889c34889f8ff1546040000488b442448a8017416f684248800000001740c483b8424880000007e07eb28ff5570ebef48837c240801746ba801750df6842488000000017503ff5570483b8424880000007555ff74244050ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb42490000000ffb424900000004c8b5424784c8b4c24704c8b8424d0000000488b5c2448488b8424c8000000eb0ae90e000000e9090000009090e88efeffffeb04488b0424488b8c24900000004883c410498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048be10cf19c9a37f0000488933498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf70a820c9a37f000048893e498dbf58ffffff483b7d107303ff55404989ff48c747f80500000048897720488b7108488977184889571048895f08488b11488917488d5f3048c743f80200000048897b0848c7031d000000488b3c244c8b40084c8b4f084d8b50084c8d5b1849c743f8050000004d8b61204d8963204d8b6a184d896b184d8b71104d897310498b520849895308498b0949890b5e498d7b3048c747f80200000048c7470801000000498b0848890f4c8d771849c746f80200000049897e08488b36498936498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fc8483b7d107303ff55404989ff48c747f8040000004c895f18488977104c89770848c70733000000488d772848c746f801000000c646ff4049be30e306c9a37f00004c89364d8db758ffffff4c3b75107303ff55404d89f749c746f8050000004d895e2049c74618030000004989761049897e0849891e498d5e3048c743f8020000004c89730848c70305000000488d731848c746f8020000004c895e0848891e488d5e1848c743f804000000488b781848897b184c8b58104c895b10488973084c8b304c89334c8d4b2849c741f8030000004c8b24244d8961104c8b6424104d8961084c8b6424084d892157415356415653504c8b4424784889c34c89c8909090ff1526010000488b0424488b4818f6c1017410f6442430017409483b4c24307e07eb23ff5570ebf2f6c101750af6442430017503ff5570483b4c2430756e48837c243801746b488b942498000000488b9c2490000000488bb42488000000488bbc24800000004c8b4424784c8b4c24704c8b5424204c899424a80000004c8b5424284c899424a0000000488994249800000048899c24900000004889b424880000004889bc2480000000eb0ae931000000e92c0000004c894424784c894c24704c8b5424184c8b4c24104c8b442440488b5c24384883c430584883c430e932fbffff4883c408584883c458c240009090909090900000000000000000e804000000000000|@10811,2097151,@18958,@10794,@10801,@10801|418,0,@573 459,0,@8492 500,0,@10791 732,0,@573 804,0,@573 10791:O1|@10792 10792:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@18951| 10793:S42|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729 10794:D5,640|483b65187303ff5548498d47e0483b45107303ff55404989c748c740f80300000048b9b8ab20c9a37f00004889084c8948084c894010488060ffbf498d4fe0483b4d107303ff55404989cf48c741f80300000048ba30ac20c9a37f00004889114c8949084c895110488061ffbf6a016a015341514150415250488d5c24284889c8488b5424509090ff126a016a01ff742418ff742428ff742460ff7424784c8b5424784c8d4c24204c8b442430488b5c2460488b44245890ff15da010000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4184889086a016a016a01488b4c2450488b5110488b12488b5948488b1b4883fb5375034889d3504889d8488b5424209090ff124883f80174664c8b442458488b5c2428488b44242090ff156e010000ff7008ff30488b0424488b542460ff124883f80175154889c148b8386208c9a37f0000488b5d089090ff13488b00488d4c24185a488911488d4c24105a48895108488d4c2408488b400848894110eb38488d44240848b9509adc0000000000488908488d44240848b9b06319c9a37f000048894808488d44240848b9b00607c9a37f0000488948106a016a01488b4424284883380575174889e048c700ffffffff4889e048c7400801000000eb324883380375174889e1488b40084889014889e048c7400803000000eb154889e1488b40084889014889e048c7400801000000498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2418488908488b4c2440488b542408488911488b5424104889510848894110584883c4384889411848c7c0010000004883c418c218009090909000000000000000007802000000000000|@10799,2097151,@18956,@10797,@10543|35,0,@10795 85,0,@10796 333,0,@1662 393,0,I48 411,0,@8345 430,0,@803 10795:D3,80|483b65187303ff55485052488b4a104889ca9090ff124883f801740c48c7c0030000004883c410c3488b0424488b48084883c408584889caff2290909090909000000000000000004800000000000000|@7990,1048575,@18953| 10796:D3,88|483b65187303ff55485052488b4a104889ca9090ff124883f801750848837c24084d750c48c7c0030000004883c410c3488b0424488b48084883c408584889caff2290909090909000000000000000005000000000000000|@7990,1048575,@18954| 10797:D3,584|483b65187303ff5548498b4a10488b09498b5248488b124883fa5375034889ca41515350415241504889d0488b542448ff124883f8017460488b442408488b4810488b09488b5048488b124883fa5375034889ca4889d0488b542440ff124883f8017458488b442408488b4808488b094889c8488b542438ff12a801753e488b00488b480848833903740648833901752b488b542420eb05e972010000488b5c241048891a488b5c241848895a0848c7c0010000004883c428c22000498d47e0483b45107303ff55404989c748c740f80300000048b920af20c9a37f0000488908488b0c2448894808488b54244848895010488060ffbf6a016a014889e3488b54244090ff12488b442428488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bb30e306c9a37f00004d891a4d8d5fd04c3b5d107303ff55404d89df49c743f8050000004989532049c74318010000004d895310415a4883c4084d8953084c8b5424104d89134d8d57e84c3b55107303ff55404d89d749c742f8020000004d895a0849c702050000004c8b5c24484c8b6424404c8b6c24384c8b7424304c895c24484c896424404c896c24384c8974243041524c8b5424104c8b4c24284c8b4424084889d3584883c428e9f1fdffff488b442420488b4c2410488908488b4c24184889480848c7c0010000004883c428c22000909090909000000000000000004002000000000000|@10800,1048575,@18957|214,0,@10798 353,0,@573 10798:D3,80|483b65187303ff55485052488b4a104889ca9090ff124883f801740c48c7c0030000004883c410c3488b0424488b48084883c408584889caff2290909090909000000000000000004800000000000000|@7990,1048575,@18955| 10799:S56|50415253455f44454328292e70617273654465632833296465632834297061727365496e666978283729726561644e6578744f7073283129 10800:S61|50415253455f44454328292e70617273654465632833296465632834297061727365496e66697828372970617273654170706c69636174696f6e283329 10801:D6,808|483b65187303ff5548488b4810f6c1017509f64318017503ff5570483b4b187563488b10483b137460498b7050488b36498b7828488b3f4d8b48784d8b094d8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d8953184989731049897b08498b7030498933488b78084c8b4b104883fa017518eb0ae985020000e98002000049ba98b320c9a37f0000eb0a49bab0b320c9a37f000048833b01750c49bc98b320c9a37f0000eb0a49bcb0b320c9a37f00004d8d6fe84c3b6d107303ff55404d89ef49c745f80200000049bec8b320c9a37f00004d8975084d8965004d8d67e84c3b65107303ff55404d89e749c74424f8020000004d896c240849bd00b420c9a37f00004d892c244d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d8965084d8b214d8965004d8d751849c746f8020000004d896e0849bd18b420c9a37f00004d892e4d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d8975084d8955004d8d551849c742f8020000004d896a0849bd00b420c9a37f00004d892a4d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d8955084c8b174d8955004d8d751849c746f8020000004d896e0849bd40b420c9a37f00004d892e4d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d8975084d8965004d8d751849c746f8020000004d896e0849bd70b420c9a37f00004d892e4d8d6fd04c3b6d107303ff55404d89ef49c745f8020000004d8975084d895500498d451848c740f8020000004c89680848b988b420c9a37f00004889084d89c5ff15ea0000004155415348bb80ce17c9a37f0000ff15de0000009090ff15de000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b51184883c40848c70203000000488b5160ff2248c7c001000000c3909000000000000000002003000000000000|@10812,1048575,@18959,@109,@7855,@8482|144,0,@10802 156,0,@10803 172,0,@10802 184,0,@10803 218,0,@10804 266,0,@10806 331,0,@10807 392,0,@10806 456,0,@10808 517,0,@10809 578,0,@10810 604,0,@7849 692,0,@1294 10802:S4|6c656674 10803:S5|7269676874 10804:O2|@10805,0 10805:S13|2d6173736f636961746976652e 10806:S5|2220697320 10807:S20|2d6173736f63696174697665207768696c652022 10808:S32|222068617665207468652073616d6520707265636564656e6365206275742022 10809:S7|2220616e642022 10810:S11|4f70657261746f72732022 10811:S54|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729 10812:S75|50415253455f44454328292e70617273654465632833296465632834297061727365496e6669782837296e6578744c6576656c283729636865636b4173736f636961746976697479283229 10813:D5,344|483b65187303ff5548488b4c2408488b5110488b12488b7148488b364883fe5375034889d64883fe13756d4152535041504151ff70104889c848ba98bd17c9a37f000090ff1526010000498d47e8483b45107303ff55404989c748c740f80200000048b9e0b620c9a37f0000488908488b4c242048894808488060ffbf6a016a014989e14c8b442410488b5c24489090ff15e2000000eb05e999000000488b442418488b4c2408498d57a8483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f804000000498952184c8b5c24204d895a10415b4883c4204d895a0849c7020b0000004c8b5c24204c895c24204d89d44c8b5424104989d14d89e0488b5c2408584883c410e9cafeffff4d89024d894a0848c7c001000000c208009000000000000000005001000000000000|@10816,2097151,@18962,@7831,@10547|59,0,@7830 100,0,@10814 10814:D3,48|483b65187303ff55484883f813750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18960| 10815:S61|50415253455f44454328292e70617273654465632833296465632834297061747465726e283329636f6e73747261696e744f724c617965726564283329 10816:S42|50415253455f44454328292e7061727365446563283329646563283429636f6e73747261696e74283429 10817:D5,584|483b65187303ff5548488b4b50488b09488b5328488b12488b7378488b36488b7b70488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989481049895008488b4b304989085053415048bb80ce17c9a37f000048b8786920c9a37f0000ff15ee0100009090ff15ee010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b511848c70203000000488b5160ff12488b0424488b48504883c408488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f803000000488979104889410848b8509adc0000000000488901498d47c0483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c89174c8b1c2449c7030100000049897b0849c743100100000049c743180100000048c7c0010000004883c408c3909000000000000000004002000000000000|@10824,1048575,@18966,@7855,@8482|90,0,@7849 100,0,@10740 188,0,@1294 387,0,@573 432,0,I48 10818:S28|50415253455f5452454528292e6d6b46756e5061747465726e283229 10819:D12,2096|483b65187303ff55484883382d755e488b4808488339057559488b5108488b3248833e1d756a48837a18037568488b7e084d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049b930e306c9a37f00004d89084d8d4fc84c3b4d107303ff55404d89cfeb0ae902020000e96000000049c741f8030000004c8b57184d8951104d8941084c8b07eb0ae942000000e93d0000004d89014d8d592049c743f80200000049c74308010000004c8b62084d89234c891b4c894b0848c743100300000048c743180100000048c7c001000000c353ff7010415048bb80ce17c9a37f000048b818c320c9a37f0000909090ff154e0700009090ff154e070000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f804000000488b542408488950184889481048c740080100000048c70003000000488b0c24488b59184883c40848c70303000000488b5160ff12498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f8030000005a488951104889410848b8509adc0000000000488901498d47c0483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c89174c8b1c2449c7030100000049897b0849c743100100000049c743180100000048c7c0010000004883c408c34883381d7574488b4808498d57f0483b55107303ff55404989d748c742f801000000c642ff4048be30e306c9a37f0000488932498d77e0483b75107303ff55404989f748c746f803000000488b791848897e1048895608488b1148891648c703010000004889730848c743100100000048c7431801000000eb05e90800000048c7c001000000c3488338057558488b480848837918037552488b510848833a33754df6420801754c488b7208f64608017564488b7e0848837f0801755e4c8b0e49833905755a53415052ff31ff721848bb80ce17c9a37f000048b870c320c9a37f0000eb14e98e020000e9c9000000e9c4000000e9bf000000909090ff15e20400009090ff15e2040000498d4fd0483b4d107314eb0fe99d000000e998000000e993000000ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2410488b511848c70203000000488b5160909090ff12eb5448837918037552488b510848833a33754df6420801754c488b7208f64608017561488b7e0848837f0801755b4c8b0f49833905755753415052ff31ff721848bb80ce17c9a37f000048b870c320c9a37f0000eb14e9da000000e9c6000000e9c1000000e9bc000000ff15ce0300009090ff15ce030000498d4fd0483b4d107314eb0fe99d000000e998000000e993000000ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741248b8f86f07c9a37f0000488b5d089090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2410488b511848c70203000000488b5160909090ff12eb0f48c7c001000000534150ff7108ff316a016a016a016a014c8b4424304889e3488b44242090e886faffff498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c24284889084883f8017506488b0424eb104889c3488b0424909090ff15ba020000488b4c24384883c4084889015848894108584883c4204889411048c741180100000048c7c0010000004883c408c3498b4050488b00498b4828488b09498b5078488b12498b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895720488977184889471048894f08498b40304889075341505748bb80ce17c9a37f000048b8786920c9a37f000090ff152a0200009090ff152a020000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b511848c70203000000488b5160ff12488b0424488b48504883c408488b09488b5028488b12488b5878488b1b488b7070488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f1048895708488b4030488907498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f803000000488979104889410848b8509adc0000000000488901498d47c0483b45107303ff55404989c748c740f803000000488b511048895010488b590848895808488b31488930488d782048c747f8030000004c8b40104c8947104c8b48084c894f084c8b104c89174c8b1c2449c7030100000049897b0849c743100100000049c743180100000048c7c0010000004883c408c390909090909000000000000000002808000000000000|@10823,1048575,@18964,@7855,@8482,@7855,@8482,@7855,@8482,@10822,@7855,@8482|80,0,@573 223,0,@7849 233,0,@10820 324,0,@1294 448,0,@573 494,0,I48 668,0,@573 837,0,@7849 847,0,@10821 977,0,@1294 1132,0,@7849 1142,0,@10821 1269,0,@1294 1597,0,@7849 1607,0,@10740 1696,0,@1294 1895,0,@573 1940,0,I48 10820:S70|506172656e74686573657320617265206f6e6c7920616c6c6f77656420666f7220696e6669786564206170706c69636174696f6e7320696e2066756e2062696e64696e67732e 10821:S63|436f6e7374727563746f72206170706c69636174696f6e7320696e2066756e2062696e64696e6773206d75737420626520706172656e74686573697365642e 10822:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@18965| 10823:S37|50415253455f5452454528292e6d6b46756e5061747465726e283229756e7069636b283129 10824:S49|50415253455f5452454528292e6d6b46756e5061747465726e283229617267737c6e616d657c756e7069636b65642d2f35 10825:D9,720|483b65187303ff5548488b4810488b09488b5048488b124883fa5375034889ca488b4850488b09488b7028488b36488b7878488b3f4c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f80500000049897b204d89531849894b1049897308488b703049893341505751565341515041535248ba98bd17c9a37f0000909090ff155e02000048833c243b753a488b5c241048c7c001000000909090ff154a020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb6448833c24397539488b5c241048c7c0010000009090ff1512020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000eb2448833c2449741348b8e8c720c9a37f0000488b5d08909090ff1348b9b00607c9a37f0000488b442410488b5010488b12488b5848488b1b4883fb5375034889d34883fb23745d4883fb0d745c4883fb31745b514889c348b870c820c9a37f000090ff158e010000488b442418488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54242890ff124883f801754d48833c2423744648833c240deb0fe947000000e942000000e93d000000742e48833c24317427488b44242048ba98bd17c9a37f0000909090ff152a0100004883c408483b65187303ff5548eb8548c7c0010000004883c408eb0848c7c001000000516a016a01ff7424104c8b5424404c8b4c24384c8b442430488d5c2408488b44242890ff15e6000000488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54245048895120488b501848895118488b5c244848895910488b580848895908488b742440488931498d77d8483b75107303ff55404989f748c746f80400000048894e185f4883c40848897e105f4883c44048897e0848c7060f000000488b3c2448893748894f0848c7c0010000004883c408c39090900000000000000000c802000000000000|@10831,2097151,@18967,@7831,@10832,@10832,@10496,@7831,@10830|121,0,@7830 276,0,@10826 295,0,@803 355,0,@10829 461,0,@7830 10826:O4|@20055,@557,@1768,@10827 10827:O5|@10828,555,0,555,0 10828:S32|6d6c736f757263652f4d4c436f6d70696c65722f50415253455f4445432e4d4c 10829:S8|5661726961626c65 10830:D5,344|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa23740c4883fa0d74064883fa31756e534152415141504c89cb48b810e31fc9a37f00009090ff1522010000504c8b4008488b5c2408488b084889c89090ff1512010000488b0424488b4c24184883c408498d57d0483b55107303ff55404989d748c742f802000000488b5c242848895a08488b30488932488b7808eb05e989000000488d421848c740f802000000488950084889305657488b11909090ff126a016a01ff7424484c8b5424384c8b4c24304c8b442428488d5c2408488b4424189090e816ffffff498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2410488908488b4c2430488901584883c4284889410848c7c0010000004883c408c2080048c703010000004889430848c7c001000000c20800909090909000000000000000005001000000000000|@10845,2097151,@18973,@10543,@8558|62,0,@10651 10831:S32|50415253455f44454328292e7061727365446563283329666978697479283229 10832:D10,608|483b65187303ff5548488b4310488b00488b4b48488b094883f95375034889c14883f93d7569488b4308488b00a801740948c7c103000000eb08488b08488d4c09015150ff352e0200005349c7c003000000488d5c240848c7c00100000048ba08cd20c9a37f0000ff1512020000a801752a488b00498d4ff0483b4d107303ff55404989cf48c741f801000000eb05e9b0010000488b00488901eb0748c7c1010000004883f901751048b8386208c9a37f0000488b5d08ff13488b01a80174084883f8017d08eb18f640ff107512a80174084883f8137f08eb71f640ff107570488b1424488b5a50488b1b488b7228488b36488b7a78488b3f4c8b42704d8b004d8d4fd04c3b4d107303ff55404d89cf49c741f805000000498979204d8941184989591049897108488b5a30498919488b7208488b364989c24d89cb4889f348b860d620c9a37f0000eb0ae9d8000000e9d3000000909090ff152a01000048bb80d620c9a37f0000ff15220100004152415348bb80ce17c9a37f0000ff15160100009090ff1516010000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b4c2408488b511848c70203000000488b5160909090ff12eb0150488b44240848ba98bd17c9a37f0000ff156a000000584883c420c348c7c001000000c39090909000000000000000005802000000000000|@10843,2097151,@18971,@10842,@10834,@100,@100,@7855,@8482,@7831|96,0,@10833 171,0,@1662 321,0,@10840 352,0,@10841 372,0,@7849 460,0,@1294 560,0,@7830 10833:O9|@10834,1152921504606846976,15,1000000000000000000,18,1152921504606846976,20,2305843009213693952,61 10834:D6,480|483b65187303ff55486a016a016a014983f80575224889e148c701210000004889e1488b7208488971084889e1488b7a1048897910eb634983f80375224889e148c701150000004889e1488b7218488971084889e1488b7a2048897910eb4f4983f80775224889e148c701110000004889e1488b7228488971084889e1488b7a3048897910eb274889e148c701050000004889e1488b7238eb05e90f000000488971084889e1488b7a404889791041505352504889da9090ff12a801756a488b084883391372064883391b760648833941751c4c8b442418488b5c2410488b41084883c4085a4883c428e911ffffff4883395775184c8b442410488b5c2420488b41084883c438ff25eb0000004883395b7409488139fd00000075694c8b442410488b5c2420eb05e992000000488b4108909090ff15c6000000a8017560488b0848c7c201000000f6c201740af601017405482b117105ff5570ebf64883c201498d5fd8483b5d107303ff55404989df48c743f802000000488b710848897308488913eb05e920000000488d431848c740f8010000004889184883c438c348c7c0010000004883c438c34c8b442410488b5c2420584883c430ff254900000048c7c0010000004883c438c390909090900000000000000000d801000000000000|@10836,2097151,@18968,@10835,@10835,@10835| 10835:D6,776|483b65187303ff55484883fb2175604150504c89c2909090ff12a8017556488b084883396174214c8b4c24084c8b042448c7c30100000048c7c0010000004883c410ff25d8020000ff7108488b0424488b542410ff12a8017564488b08488139f10000007415488139b1000000eb0ae9e9000000e9d8000000756b4c8b4c24104c8b410848c7c30100000048c7c0010000009090ff158e0200004883f801754c498d47d8483b45107303ff55404989c748c740f802000000488b0c24eb05e9500000004889480848c700010000004889c1488d401848c740f8010000004889084883c418eb05e906000000c34883c418c34c8b4c24104c8b44240848c7c30100000048c7c0010000004883c418ff251d020000498d47d8483b45107303ff55404989c748c740f802000000488b0c244889480848c700010000004889c1488d401848c740f8010000004889084883c418c348c7c0010000004883c410c348c7c10100000048c7c201000000415053525051488b5424209090ff12a8017562488b08488b11f6c20174084883fa617c56eb06f642ff10756548c7c361000000f6c3017412f644241801740b488d5bff48035c24187105ff5570ebf0f6c201740af6c3017405483bd3eb05ff5570ebf67d6dff710852488b5c2428488b442420eb0ae9bb000000e96600000048ba50a9dc0000000000ff12a8017417eb05e94f000000f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54889c14883c408584889ca48c7c1030000004883c418eb05e90e000000483b65187303ff5548e91effffff48833c2401743d498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f8010000004889184883c428c348c7c0010000004883c428c348833c24017440498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f8010000004889084883c428c348c7c0010000004883c428c3909090909000000000000000000003000000000000|@10838,2097151,@18969,@10837,@10837,@10837|492,0,I108 10836:S11|496e742e7363616e283329 10837:D3,760|483b65187303ff55484151534150504c89c04c89ca909090ff12a8017554488b08488b11f6c20174084883fa617c5deb06f642ff10755af6c20174084883fa737f6aeb06f642ff107467ff71085248c7c321000000488b44242048ba50a9dc0000000000ff12a8017417f60424017411eb05e917020000488d40ff480304247105ff5570ebf1a8017412eb0ae93a000000e9350000004883e8607105ff5570ebf54c8b4c24284883c408eb0ae91a000000e91500000041584889c348c7c0030000004883c420e935fffffff6c201740b4881fa830000007c5ceb06f642ff107559f6c201740b4881fa8d0000007f64eb06f642ff107461ff71085248c7c321000000488b44242048ba50a9dc0000000000909090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a8017415eb0ae94c000000e9470000004881e8820000007105ff5570ebf2a8017412eb0ae92e000000e9290000004883c0147105ff5570ebf54c8b4c24284883c40841584889c348c7c0030000004883c420e97afefffff6c201740b4881fac30000007c59eb06f642ff107556f6c201740b4881facd0000007f65eb06f642ff107462ff71085248c7c321000000488b44242048ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a8017415eb0ae94c000000e9470000004881e8c20000007105ff5570ebf2a80174124883c014eb0ae92a000000e9250000007105ff5570ebe94c8b4c24284883c40841584889c348c7c0030000004883c420e9c2fdffff48833c2401743d498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f8010000004889184883c420c348c7c0010000004883c420c348833c24017440498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f8010000004889084883c420c348c7c0010000004883c420c3909090909090900000000000000000f002000000000000|@10839,2097151,@18970|92,0,I108 265,0,I108 452,0,I108 10838:S25|496e742e7363616e283329726561645f6e756d626572283129 10839:S29|496e742e7363616e283329726561645f6865785f646967697473283329 10840:S11|507265636564656e636520 10841:S37|206e6f7420616c6c6f7765642c206d757374206265206265747765656e203020616e642039 10842:D3,120|483b4210750848c7c001000000c3f6420801751a4889c14883c110488b520848d1e9480fb60c0a488d4c0901eb04488b4a084883c002498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f801000000488910c390909000000000000000007000000000000000|@10844,7,@18972| 10843:S48|50415253455f44454328292e7061727365446563283329666978697479283229676574507265636564656e6365283129 10844:S29|537472696e674376742e7363616e537472696e67283229726472283129 10845:S39|50415253455f44454328292e706172736544656328332966697869747928322976617273283129 10846:D3,168|483b65187303ff5548a8017572498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a52488b48084889c8909090e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,7,@18974| 10847:D3,168|483b65187303ff5548a8017572498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a52488b48084889c8909090e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,7,@18975| 10848:D4,296|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa23740c4883fa0d74064883fa31756b53415141504c89cb48b810e31fc9a37f0000ff15f60000006a016a01ff7008ff304c8b4c24284c8b442420488d5c2410488b4424089090e892ffffff498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d4fe0483b4d10730aeb05e960000000ff55404989cf48c741f803000000488b5424084889511048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908488b4c2418488901584883c4104889410848c7c0010000004883c408c348c703010000004889430848c7c001000000c390909000000000000000002001000000000000|@10849,2097151,@18976,@10543|60,0,@10651 10849:S36|50415253455f44454328292e706172736544656328332964656328342976617273283129 10850:D4,88|483b65187303ff5548534c8b52104c8b4a0849c7c00100000048c7c301000000ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10637,2097151,@18977,@10641| 10851:D10,696|483b65187303ff5548498b4910488b09498b5148488b124883fa5375034889ca4883fa59755a415241514150504c89c848ba98bd17c9a37f00009090ff158e020000488b442438488b4c2430488b542428488944243848894c243048895424284c8b5424184c8b4c24104c8b44240848c7c303000000584883c418e980ffffff498d4fe8483b4d107303ff55404989cf48c741f80200000048bad0de20c9a37f000048891148894108488061ffbf6a016a0141524151415050534d89ca4c8d4c24284989c84c89d3488b442420909090ff1502020000488b442418488b4810488b09488b5048488b124883fa5375034889ca4883fa23751448ba98bd17c9a37f00009090ff15d6010000eb1a48c7c02300000090ff15ce010000488b5c241890ff15ca0100006a016a01ff742458ff7424584c8b5424704c8b4c24384c8d442410488b5c2428488b44244090ff15a6010000488b442428488b4810488b09488b5048488b124883fa5375034889ca6a016a014883fa05754048ba98bd17c9a37f00009090ff1576010000ff742470ff742470ff7424704c8b5424584c8b4c24504c8d442418488b5c2438488b4424409090e84afeffffeb164889e048c700010000004889e0488b4c241848894808488b442450488b4c2418498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049c702010000004d8d5fd04c3b5d107303ff55404d89df49c743f8050000004c8b6424204d8963204d89531849895310488b54241049895308488b542448498913498d57e8483b55107303ff55404989d748c742f802000000415a4c8952084c891a4c8b5424284989125a4883c4204989520848c7c0010000004883c428c218000000000000000000b002000000000000|@10853,2097151,@18979,@7831,@10742,@7831,@10512,@10496,@10711,@7831|50,0,@7830 154,0,@10852 250,0,@7830 378,0,@7830 10852:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18978| 10853:S36|50415253455f44454328292e706172736544656328332964656328342976616c42283229 10854:D12,2704|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca4883fa4d74264883fa4174254883fa3f74244883fa4374234889d148bec2df20c9a37f0000488d748efcffe6e900060000e9fb050000e9f6050000e9f10500009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883fa31740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901755e4883fa0d745d4883fa31745c4883fa79745b53504150415241514c89c348b860ea20c9a37f000090ff15a6070000488b442410488b4810488b09488b5048488b124883fa5375034889ca524889d0488b54242090ff124883f8017547eb14e91a030000e915030000e910030000e90b03000048833c244d742f48833c2441742d48833c243f742b48833c24437429488b042448b9f2e220c9a37f0000488d4c81fcffe1e9c8020000e9c3020000e9be020000e9b9020000e9b40200009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e904020000909090e9e3010000909090e9fd010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e956010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f7000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b8000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e94900000090909048833c2431740948c7c001000000eb3d48c7c003000000eb3448c7c003000000eb2b48c7c003000000eb2248c7c003000000eb1948c7c003000000eb1048c7c003000000eb0748c7c0030000004883f801753f48833c240d743848833c2431743148833c2479742a488b44241848ba98bd17c9a37f0000909090ff157e0400004883c408483b65187303ff5548e9befcffff48c7c0010000004883c408eb124889c148c7c0010000005351415041524151498d47e8483b45107303ff55404989c748c740f80200000048b978ea20c9a37f0000488908488b4c241848894808488060ffbf6a016a014c8b5424204989e14989c04c89d3488b442410909090ff1502040000488b442420488b4810488b09488b5048488b124883fa5375034889ca4883fa71751448ba98bd17c9a37f00009090ff15d6030000eb534889c348b8b0e117c9a37f0000909090ff15c6030000488b442420488b4810488b09488b5048488b124883fa5375034889ca4883fa23751448ba98bd17c9a37f00009090ff159a030000eb0748c7c001000000498d47e8483b45107303ff55404989c748c740f80200000048b9d0ea20c9a37f0000488908488b4c242848894808488060ffbf6a016a01ff742458ff7424584c8b5424704c8b4c24404c8d4424104889c3488b442430488b5424389090ff12488b442418488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bbd09507c9a37f00004d891a4d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049bcd09507c9a37f00004d89234d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6fc84c3b6d107303ff55404d89ef49c745f8060000004d896528498955204d895d184d8955104c8b5424104d895508415a4883c4184d8955004c8b5424104d8b5a104d8b1b4d8b62484d8b24244983fc5375034d89dc4983fc7d756f5357415141554c89d048ba98bd17c9a37f00009090ff150a0200006a016a01ff742470ff742470ff7424704c8b5424504c8b4c24484c8b442458488d5c2418488b4424609090e802f7ffff498d47b8483b45107303ff55404989c748c740f8020000005948894808488b4c2408eb05e962000000488908488b0c24488d501848c742f805000000488b5c24204883c41048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a498d7fe8483b7d107303ff55404989ff48c747f80200000048895708488907eb364d8d5fd04c3b5d107303ff55404d89df49c743f80200000049c74308010000004d892b498d7b1848c747f802000000488957084c891f488b442410488b4810488b09488b5048488b124883fa5375034889ca574889d0488b542420ff124883f8017565488b5c241848b828eb20c9a37f000090ff15de000000488b442418488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424209090ff124883f8017521488b44241848ba98bd17c9a37f000090ff15a2000000483b65187303ff5548ebb1488b0424488b4c2428488b10488911488b58084883c4284889590848c7c0010000004883c408c218009090909090900000000000000000880a000000000000|@10909,2097151,@19020,@10496,@7831,@10742,@7831,@10496,@7831,@7831,@10496,@7831|61,0,$10854+98 755,0,@10855 872,0,$10854+914 1569,0,@7830 1661,0,@10856 1754,0,@7830 1777,0,@7903 1830,0,@7830 1881,0,@10857 2041,0,@1394 2083,0,@1394 2238,0,@7830 2547,0,@10858 2615,0,@7830 10855:S5|4d61746368 10856:D3,48|483b65187303ff55484883f871750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18980| 10857:D3,48|483b65187303ff55484883f87d750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18981| 10858:S12|456e64206f66206d61746368 10859:S42|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e283229 10860:D4,72|483b65187303ff5548488b4c2418488b542410488b74240848894c2418488954241048897424084889df4889c34889f8ff252a000000909000000000000000004000000000000000|@10863,2097151,@18984,@10861| 10861:D5,400|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bac8ed20c9a37f000048891148895908488061ffbf6a016a015041524151415053ff742450ff742450ff742450488d5c24404889c890ff154a010000488b442408488b4810488b09488b5048488b124883fa5375034889ca4883fa51756e48ba98bd17c9a37f00009090ff151e0100006a016a01ff742460ff742460ff7424604c8b5424404c8b4c24384c8b442430488b5c2428488d4424189090e83effffff488b442440488b4c2408498d57a8483b55107303ff55404989d748c742f805000000488b582048895a20eb05e962000000488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80400000049895218415b4883c4084d895a104c8b5c24284d895a0849c7022b0000004c8b5c24204d89134989530848c7c0010000004883c438c21800488b442420488b4c2428488908488b4c24304889480848c7c0010000004883c438c218009090909090909000000000000000008801000000000000|@10865,2097151,@18985,@10864,@7831|35,0,@10862 130,0,@7830 10862:D3,48|483b65187303ff55484883f851750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18983| 10863:S56|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c7365283129 10864:D4,72|483b65187303ff5548488b4c2418488b542410488b74240848894c2418488954241048897424084889df4889c34889f8ff252a000000909000000000000000004000000000000000|@10868,2097151,@18987,@10866| 10865:S58|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322970617273654f72656c73652831292829 10866:D5,400|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048baf8f020c9a37f000048891148895908488061ffbf6a016a015041524151415053ff742450ff742450ff742450488d5c24404889c890ff154a010000488b442408488b4810488b09488b5048488b124883fa5375034889ca4883fa07756e48ba98bd17c9a37f00009090ff151e0100006a016a01ff742460ff742460ff7424604c8b5424404c8b4c24384c8b442430488b5c2428488d4424189090e83effffff488b442440488b4c2408498d57a8483b55107303ff55404989d748c742f805000000488b582048895a20eb05e962000000488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80400000049895218415b4883c4084d895a104c8b5c24284d895a0849c702030000004c8b5c24204d89134989530848c7c0010000004883c438c21800488b442420488b4c2428488908488b4c24304889480848c7c0010000004883c438c218009090909090909000000000000000008801000000000000|@10880,2097151,@18997,@10869,@7831|35,0,@10867 130,0,@7830 10867:D3,48|483b65187303ff55484883f807750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18986| 10868:S57|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f283129 10869:D27,3144|483b65187303ff5548498b4810488b09498b5048488b124883fa5375034889ca498b4850488b09498b7078488b3648bfe2f120c9a37f0000488d7c97fcffe7909090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9c7020000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e97c040000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e989050000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9c2070000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e9eb070000909090e913000000909090e90b000000909090e903000000909090498d4fe8483b4d107303ff55404989cf48c741f80200000048bad0fe20c9a37f000048891148894108488061ffbf6a016a014152ff742420ff742430ff74244041514150ff35b4090000415053415150ff35b009000051488d4c246851415049ba30ff20c9a37f0000498b4910498b5108498b314c8d4c24404989c84889d34889f0ff1586090000498d47e8483b45107303ff55404989c748c740f80200000048b9800221c9a37f00004889085948894808488060ffbf488b4c241048894c24784c8b5424084c8b4c24584c8b4424504889c3584883c458594883c41051ff25320900004150534151504152565141ff70304c89c048ba98bd17c9a37f0000909090ff1516090000498d47e8483b45107303ff55404989c748c740f80200000048b9d80221c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742460ff7424604c8b5424784c8b4c24584c8d4424104889c3488b442448488b542438909090ff12488b442448488b4810488b09488b5048488b124883fa5375034889ca4883fa4b751448ba98bd17c9a37f00009090ff158a080000eb1a48c7c04b00000090ff1582080000488b5c244890ff157e080000498d47e8483b45107303ff55404989c748c740f80200000048b9f80521c9a37f0000488908488b4c243048894808488060ffbf6a016a01ff742478ff742478ff7424784c8b5424504c8b4c24604c8b442470488d5c2418909090ff1526080000488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54243048895120488b501848895118488b5c242848895910488b580848895908488b742420488931498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fd0483b7d107303ff55404989ff48c747f8050000004889472048894f18488977105e4883c408488977085e4883c438488937498d77e8483b75107303ff55404989f748c746f80200000048897e0848c70607000000488b3c2448893748894f0848c7c0010000004883c410c218004150534151504152565141ff70304c89c048ba98bd17c9a37f00009090ff152a070000498d47e8483b45107303ff55404989c748c740f80200000048b9500621c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742468ff742468ff7424684c8b5424404c8b4c24504c8b442460488d5c2418909090ff15d2060000488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54242048895120488b501848895118488b5c241848895910488b580848895908488b742410488931498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fd8483b7d107303ff55404989ff48c747f80400000048894f1841584883c4384c8947104889770848c70717000000488b342448893e48894e0848c7c0010000004883c410c218004150534151504152565141ff70304c89c048ba98bd17c9a37f000090ff15fe050000498d47e8483b45107303ff55404989c748c740f80200000048b9a80621c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742460ff7424604c8b5424784c8b4c24584c8d4424104889c3488b442448488b542438909090ff12488b442448488b4810488b09488b5048488b124883fa5375034889ca4883fa6f751448ba98bd17c9a37f00009090ff1572050000eb1a48c7c06f00000090ff156a050000488b5c244890ff1566050000498d47e8483b45107303ff55404989c748c740f80200000048b9200a21c9a37f0000488908488b4c243048894808488060ffbf6a016a01ff742470ff7424704c8b9424880000004c8b4c24684c8d4424104889c3488b442458488b542448ff12488b442458488b4810488b09488b5048488b124883fa5375034889ca4883fa1d751448ba98bd17c9a37f00009090ff15da040000eb1a48c7c01d00000090ff15d2040000488b5c245890ff15ce0400006a016a01ffb42480000000ffb424800000004c8b9424980000004c8b4c24784c8d442410488b5c2460488b442468488b542458909090ff12488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54244048895120488b501848895118488b5c243848895910488b580848895908488b742430488931498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d47c84c3b45107303ff55404d89c749c740f806000000498970284989782049894818488b742410498970105e4883c418498970085e4883c438498930498d77e8483b75107303ff55404989f748c746f8020000004c89460848c70609000000488b3c2448893748894f0848c7c0010000004883c410c218004150534151504152565141ff70304c89c048ba98bd17c9a37f0000ff15760300006a016a01ff742460ff7424604c8b5424784c8b4c24584c8d442410488b5c2440488b442448488b542438ff12488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54242048895120488b501848895118488b5c241848895910488b580848895908488b742410488931498d77e0483b75107303ff55404989f748c746f80300000048894e105f4883c43848897e0848c7062f000000488b3c2448893748894f0848c7c0010000004883c410c218004150534151504152565141ff70304c89c048ba98bd17c9a37f0000909090ff15a2020000498d47e8483b45107303ff55404989c748c740f80200000048b9980d21c9a37f0000488908488b4c242048894808488060ffbf6a016a01ff742460ff7424604c8b5424784c8b4c24584c8d4424104889c3488b442448488b542438909090ff12488b442448488b4810488b09488b5048488b124883fa5375034889ca4883fa1b756e48ba98bd17c9a37f00009090ff15160200006a016a01ff742470ff7424704c8b9424880000004c8b4c24684c8d442410488b5c2450488b442458488b54244890ff12488b442408498d4fd0483b4d107303ff55404989cf48c741f805000000488b54243048895120488b5018eb05e99300000048895118488b5c242848895910488b580848895908488b742420488931498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd0483b7d107303ff55404989ff48c747f8050000004889772048894f18488b742410488977105e4883c4084889770848c7073b000000488b74244048893e48894e0848c7c0010000004883c450c2180048c7c01b000000909090ff151a010000488b5c244890ff1516010000488b44244848ba98bd17c9a37f0000909090ff1506010000488b442440488b0c24488908488b4c24084889480848c7c0010000004883c450c218009090900000000000000000400c000000000000|@10882,2097151,@18998,@10881,@10651,@10789,@10813,@7831,@7831,@10512,@10496,@10854,@7831,@10854,@7831,@7831,@10512,@10496,@7831,@10512,@10496,@7831,@7831,@7831,@10512,@10496,@7831|48,0,$10869+66 636,0,@10870 707,0,@10871 772,0,@10873 857,0,@7830 900,0,@10874 1006,0,@7830 1076,0,@10875 1247,0,@573 1390,0,@7830 1432,0,@10876 1603,0,@573 1707,0,@7830 1748,0,@10877 1854,0,@7830 1924,0,@10878 2030,0,@7830 2412,0,@7830 2629,0,@7830 2672,0,@10879 2778,0,@7830 3073,0,@7830 10870:D3,56|483b65187303ff55484883f81374064883f807750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@18988| 10871:O1|@10872 10872:D3,792|4883f82f750848c7c003000000c34889c148ba62ff20c9a37f0000488d548afcffe2e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901740848c7c003000000c34883f823740c4883f80d74064883f831750848c7c003000000c34883f841750848c7c003000000c34883f843750848c7c003000000c34883f83f750848c7c003000000c34883f84d750848c7c003000000c34883f845740848c7c001000000c348c7c003000000c39090909000000000000000001003000000000000|@7990,7,@18989|19,0,$10872+34 10873:D3,48|483b65187303ff55484883f807750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18990| 10874:D3,760|483b65187303ff55484883f84d74264883f84174254883f83f74244883f84374234889c148bb220321c9a37f0000488d5c8bfcffe3e99a020000e995020000e990020000e98b02000090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f90175184883f80d74124883f831740c4883f87974064883f84b750848c7c003000000c3488b5208ff229090909090900000000000000000f002000000000000|@7990,1048575,@18991|38,0,$10874+74 10875:D3,48|483b65187303ff55484883f861750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18992| 10876:D3,48|483b65187303ff55484883f861750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18993| 10877:D3,848|483b65187303ff55484883f82f74144889c148bbd20621c9a37f0000488d5c8bfcffe3e9060300009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901753e4883f823743d4883f80d743c4883f831743b4883f841743a4883f84374394883f83f744f4883f84d744e4883f845744d4883f827744c4883f80f744beb1ee94f000000e94a000000e945000000e940000000e93b000000e9360000004881f881000000742d4883f83374274883f8557421eb19e91a000000e915000000e910000000e90b000000e9060000004883f86f750848c7c003000000c3488b5208ff229090909000000000000000004803000000000000|@7990,1048575,@18994|20,0,$10877+42 10878:D3,848|483b65187303ff55484883f82f74144889c148bb4a0a21c9a37f0000488d5c8bfcffe3e9060300009090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e903020000909090e9e3010000909090e9fc010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e955010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9f6000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e9b7000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9480000009090904883f831740948c7c101000000eb3d48c7c103000000eb3448c7c103000000eb2b48c7c103000000eb2248c7c103000000eb1948c7c103000000eb1048c7c103000000eb0748c7c1030000004883f901753e4883f823743d4883f80d743c4883f831743b4883f841743a4883f84374394883f83f744f4883f84d744e4883f845744d4883f827744c4883f80f744beb1ee94f000000e94a000000e945000000e940000000e93b000000e9360000004881f881000000742d4883f83374274883f8557421eb19e91a000000e915000000e910000000e90b000000e9060000004883f81d750848c7c003000000c3488b5208ff229090909000000000000000004803000000000000|@7990,1048575,@18995|20,0,$10878+42 10879:D3,48|483b65187303ff55484883f81b750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@18996| 10880:S59|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832297061727365416e64616c736f2831292829 10881:D4,88|483b65187303ff554853ff7228ff72304c8b52204c8b4a184c8b4210488b5a08ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10771,2097151,@19008,@10883| 10882:S55|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296b6579576f7264457870283129 10883:D58,6504|488dbc2458ffffff483b7d187303ff5550488b4b10488b09488b5348488b124883fa5375034889ca488b4b50488b09488b7378488b364883fa45756e50535651ff73304152415141504889d848ba98bd17c9a37f00009090ff1522190000488b04246a016a016a014c8b40104c8b48084889e348c7c0010000009090ff1506190000498d47e0483b45107303ff55404989c748c740f80300000048b9582a21c9a37f00004883c408eb05e9490300004889084c894808488b4c240848894810488060ffbf498d4fe0483b4d107303ff55404989cf48c741f8030000004c89411048894108584883c410488901498d47e8483b45107303ff55404989c748c740f80200000048bac82a21c9a37f0000488910488b54243048895008488060ffbf51ff7424504c8b5424184c8b4c24104c8b4424384889cb9090ff1552180000488b4c2430488b5110488b12488b5948488b1b4883fb5375034889d34883fb357518504889c848ba98bd17c9a37f00009090ff1522180000eb1e4889c348c7c0350000009090ff151618000053488b5c2438ff1512180000498d47e8483b45107303ff55404989c748c740f80200000048b9202b21c9a37f0000488908488b4c244048894808488060ffbfff742458ff742420ff742420ff74245050ff742430ffb42480000000ff35c51700004989e14c8b44247848bbd08d1fc9a37f000048c7c061000000ff15ae170000488b4c24784883c440488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c243048897e2048895e18488b5c242848895e1048895608488b542420488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb1f751856ff304889c848ba98bd17c9a37f0000ff1532170000eb22488b1848c7c01f0000009090ff15261700005653488b5c2448909090ff151e170000488b442448488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424509090ff124883f801756e488b5c244848b8802b21c9a37f000090ff15e2160000488b442448488b4810488b09488b5048488b124883fa5375034889ca4889d0488b5424509090ff124883f8017521488b44244848ba98bd17c9a37f000090ff15a6160000483b65187303ff5548ebb148c7c001000000eb0748c7c001000000488b4424109090ff15861600004889c3589090ff1582160000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57a0483b55107303ff55404989d748c742f80500000048894a20488b0c2448894a1848c742100100000048895a08488902488d423048c740f8020000004889500848c700270000004889c2488d401848c740f802000000488948084889104883c450c210004883fa41756a50535651ff73304152415141504889d848ba98bd17c9a37f0000ff15da150000488b442430488b4828488b09488b5070488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe5d756b525148ba98bd17c9a37f00009090ff159e150000498d47d0eb05e951020000483b45107303ff55404989c748c740f805000000488b4c243848894820488b4c240848894818488b4c243048894810594883c40848894808488b4c2418488908498d4fd0483b4d10730aeb05e936000000ff55404989cf48c741f8020000004889410848c701370000004889c2488d411848c740f802000000488950084889084883c440c21000498d4fe8483b4d107303ff55404989cf48c741f80200000048baa82b21c9a37f000048891148894108488061ffbf6a016a016a014889e34889c89090ff15d2140000ff742418ff742470ff742438ff742438ffb42480000000ff742430ff742478ffb42488000000ff35ae1400004989e14c8b84249000000048bbd08d1fc9a37f000048c7c0170000009090ff1592140000488b8c24900000004883c460488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c242848897e2048895e18488b5c242048895e1048895608488b542418488916498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f80500000048897320488b00488943184889531048c743080300000048c7031f000000488b4110488b00488b5148488b124883fa5375034889c24883fa5d751a56534889c848ba98bd17c9a37f0000909090ff15b2130000eb1e48c7c05d00000090ff15aa1300005653488b5c2440909090ff15a2130000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4084889084883c440c210004883fa43756850535651ff73304152415141504889d848ba98bd17c9a37f00009090ff1552130000488b442430488b4828488b09488b5070488b12488b5810488b1b488b7048488b364883fe5375034889de4883fe5f756b525148ba98bd17c9a37f00009090ff1516130000eb05e9c1040000498d47d0483b45107303ff55404989c748c740f805000000488b4c243848894820488b4c240848894818488b4c243048894810594883c40848894808488b4c2418488908498d4fd0483b4d10730aeb05e936000000ff55404989cf48c741f8020000004889410848c701370000004889c2488d411848c740f802000000488950084889084883c440c21000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba582d21c9a37f0000488911488b54243848895108488061ffbf6a016a01ff742420ff7424684c8b5424284989c14c8d4424104889cb488b442420488b542468909090ff12488b442440488b4810488b09488b5048488b124883fa5375034889ca6a016a014883fa61757448ba98bd17c9a37f00009090ff15f6110000498d47e8483b45107303ff55404989c748c740f80200000048b9c02d21c9a37f0000488908488b4c245848894808488060ffbfff742470ff742438ff742438ff74246850ff742448ffb42498000000ff35a91100004989e14c8b842490000000eb05e9c700000048bbd08d1fc9a37f000048c7c0610000009090ff1586110000498d4fb8483b4d107303ff55404989cf48c741f802000000488b004883c44048894108488b442410488901488b442450488b5028488b12488b5870488b1b488d711848c746f805000000488b7c244848897e2048895e18488b5c244048895e1048895608488b5424384889164889c8909090ff1516110000498d4fe0483b4d107303ff55404989cf48c741f803000000488971104889410848c701150000004889e04889084889e048897008eb6d4883fa17756c48ba98bd17c9a37f0000ff15d2100000498d47e8483b45107303ff55404989c748c740f80200000048b9202e21c9a37f0000488908488b4c245848894808488060ffbfff742470ff742438ff742438ff74246850ff742448ffb42498000000ff3585100000eb0ae97f010000e9f20000004989e14c8b84249000000048bbd08d1fc9a37f000048c7c01700000090ff155e100000498d4fb8483b4d107303ff55404989cf48c741f802000000488b004883c44048894108488b442410488901488b442450488b5028488b12488b5870488b1b488d711848c746f805000000488b7c244848897e2048895e18488b5c244048895e1048895608488b542438488916498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5fd8483b5d107303ff55404989df48c743f804000000488973184889531048894b0848c703330000004889e14889194889e148897108eb6f488b4828488b09488b5070488b12498d5fd0483b5d107303ff55404989df48c743f805000000488b7424484889732048895318488b5424404889531048894b08488b4c243848890b498d4fe0483b4d107303ff55404989cf48c741f80300000048895910488b54241048895108eb05e91400000048c7012d0000004889e248890a4889e148895908488b442450488b4810488b09488b5048488b124883fa5375034889ca4883fa5f751548ba98bd17c9a37f0000909090ff15da0e0000eb1a48c7c05f00000090ff15d20e0000488b5c245090ff15ce0e0000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c4184889084883c440c210004883fa3f756850535651ff73304152415141504889d848ba98bd17c9a37f00009090ff157e0e0000488b442430488b4810488b09488b5048488b124883fa5375034889ca4883fa5b746f498d4fe8483b4d107303ff55404989cf48c741f80200000048ba802e21c9a37f0000eb05e97d010000488911488b54243848895108488061ffbfff742450ff742418ff7424185051ff742428ff742478ff350e0e00004989e14989c048bbd08d1fc9a37f000048c7c017000000eb05e90f000000ff15f20d0000488b004883c440eb0748c7c001000000488b4c24304883c418488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241048897e2048895e18488b5c240848895e10488956085a4883c410488916488b5110488b12488b5948488b1b4883fb5375034889d34883fb5b751856504889c848ba98bd17c9a37f000090ff15660d0000eb224889c348c7c05b0000009090ff155a0d00005653488b5c2410909090ff15520d0000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fc0483b4d107303ff55404989cf48c741f804000000488b542408488951185b488959104889410848c70123000000488d412848c740f802000000488950084889084883c418c210004883fa4d740948c7c201000000eb0748c7c2030000004883fa01742250535651ff73304150524889d848ba98bd17c9a37f0000909090ff15aa0c0000eb144889c748c7c00100000057535651ff7330415052488b442428488b4810488b09488b5048488b124883fa5375034889ca488b4850488b09488b5828488b1b488b7078488b36488b7870488b3f4d8d47d04c3b45107303ff55404d89c749c740f80500000049897020498978184989481049895808488b48304989084889d649b9c21d21c9a37f00004d8d4cb1fc41ffe19090e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9b4030000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e98b010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e970040000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e93b010000909090e933010000909090e9dc040000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9a8050000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e994060000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9500700009090904883fa23740c4883fa0d74064883fa31756d488b5424086a016a01ff35dd090000ff742418488d5c2410534c8b5424584989c14c8b4210488b5a08488b02ff15c2090000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4ff0483b4d107303ff55404989cfeb05e9ed00000048c741f801000000c641ff4048ba10cf19c9a37f0000488911498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bbe02e21c9a37f000048891a498d5fd0483b5d107303ff55404989df48c743f80500000048895320488b542408488953184889431048894b0858488903498d47a0483b45107303ff55404989c748c740f8020000004889580848c7001d000000488d481848c741f805000000488b5c24284883c40848895920488b5a1848895918488b74241848897110488b720848897108488b7c24104889394889c7488d413048c740f802000000488948084889384883c438c2100048c7c0310000009090ff158e0800004150488b5c2430909090ff1586080000488b44243048ba98bd17c9a37f0000909090ff1576080000498d47e8483b45107303ff55404989c748c740f802000000594889480848b9f09e0ac9a37f00004889084883c438c21000488b5008488b12488b7050488b364c8b40284d8b004c8b48784d8b094c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d895318498973104d894308488b7030498933575341535248ba98bd17c9a37f0000ff15e6070000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048bae08e20c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47b8483b45107303ff55404989c748c740f805000000488b54243048895020488b54240848895018488b542428488950105a4883c40848895008488b5424104889104889c2488d403048c740f802000000488950084889084883c438c2100048ba98bd17c9a37f0000909090ff150e070000488b5c2428488b442430ff1506070000488b4808498d57d0483b55107303ff55404989d748c742f805000000488b5c242048895a20488b591848895a18488b74241848897210488b710848897208488b7c241048893a4989d44c89e3488b104889d0ff15b60600004889c1498d47e8483b45107303ff55404989c748c740f8020000004c8960084889084883c438c21000488b5008488b12488b7050488b364c8b40284d8b004c8b48784d8b094c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d895318498973104d894308488b7030498933575341535248ba98bd17c9a37f0000ff152e060000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba608f20c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47b8483b45107303ff55404989c748c740f805000000488b54243048895020488b54240848895018488b542428488950105a4883c40848895008488b5424104889104889c2488d403048c740f802000000488950084889084883c438c21000488b5008488b12488b7050488b364c8b40284d8b004c8b48784d8b094c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d895318498973104d894308488b7030498933575341535248ba98bd17c9a37f0000ff1502050000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048baf89120c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47b8483b45107303ff55404989c748c740f805000000488b54243048895020488b54240848895018488b542428488950105a4883c40848895008488b5424104889104889c2488d403048c740f802000000488950084889084883c438c21000488b5008488b12488b7050488b364c8b40284d8b004c8b48784d8b094c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d895318498973104d894308488b7030498933575341535248ba98bd17c9a37f0000ff15d6030000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba509220c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47b8483b45107303ff55404989c748c740f805000000488b54243048895020488b54240848895018488b542428488950105a4883c40848895008488b5424104889104889c2488d403048c740f802000000488950084889084883c438c21000488b5008488b12488b7050488b364c8b40284d8b004c8b48784d8b094c8b50704d8b124d8d5fd04c3b5d107303ff55404d89df49c743f8050000004d894b204d895318498973104d894308488b7030498933575341535248ba98bd17c9a37f0000ff15aa020000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f0000488908498d4fd0483b4d107303ff55404989cf48c741f80500000048ba909220c9a37f000048895120488b542408488951185a4883c408488951104889410848c70125000000498d47b8483b45107303ff55404989c748c740f805000000488b54243048895020488b54240848895018488b542428488950105a4883c40848895008488b5424104889104889c2488d403048c740f802000000488950084889084883c438c21000909090909000000000000000006019000000000000|@10897,2097151,@19009,@7831,@8796,@10718,@7831,@10512,@10496,@10898,@10556,@7831,@10512,@10496,@10496,@7831,@10846,@10847,@7831,@7831,@8510,@10899,@10556,@7831,@10512,@10496,@7831,@7831,@7831,@10904,@10556,@10905,@7831,@10906,@10556,@7831,@10512,@10496,@7831,@10907,@10556,@7831,@10512,@10496,@7831,@10651,@10775,@10512,@10496,@7831,@7831,@7831,@10596,@10896,@7831,@7831,@7831,@7831|78,0,@7830 156,0,@10884 262,0,@10885 358,0,@7830 432,0,@10886 501,0,@10586 640,0,@7830 743,0,@10887 811,0,@7830 1040,0,@7830 1106,0,@7830 1294,0,@10888 1391,0,@10586 1528,0,@573 1629,0,@7830 1750,0,@7830 1818,0,@7830 2006,0,@10890 2114,0,@7830 2156,0,@10891 2235,0,@10586 2440,0,@7830 2480,0,@10892 2564,0,@10586 2724,0,@573 2965,0,@7830 3082,0,@7830 3158,0,@10893 3226,0,@10586 3387,0,@7830 3468,0,@573 3597,0,@7830 3744,0,$10883+3762 4404,0,@573 4452,0,@8492 4493,0,@10894 4713,0,@7830 4761,0,@3172 4868,0,@7830 4912,0,@573 4949,0,@10757 5089,0,@7830 5340,0,@7830 5384,0,@573 5421,0,@10760 5648,0,@7830 5692,0,@573 5729,0,@10766 5956,0,@7830 6000,0,@573 6037,0,@10768 6264,0,@7830 6308,0,@573 6345,0,@10769 10884:D3,72|483b65187303ff55485052488b4a104889ca9090ff124883f8017516488b0424488b4808488b4424084889ca4883c410ff224883c410c39000000000000000004000000000000000|@7987,1048575,@18999| 10885:D3,48|483b65187303ff55484883f835750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@19000| 10886:D3,56|483b65187303ff55484883f81f74064883f861750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19001| 10887:S21|456e64206f66206c65742065787072657373696f6e 10888:D7,264|483b65187303ff55484989d24989db4889c348b8288d1fc9a37f0000ff15fe00000048bb408d1fc9a37f0000ff15f60000004152415348bb80ce17c9a37f0000ff15ea0000009090ff15ea000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c70003000000488b0c24488b5108488b5a184883c40848c70303000000488b4a604889caff229090909090909000000000000000000001000000000000|@10889,1048575,@19002,@100,@100,@7855,@8482|20,0,@10583 36,0,@10584 56,0,@7849 144,0,@1294 10889:S73|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e2831297265706f7274447570283329 10890:D3,64|483b65187303ff55484883f817740c4883f86174064883f85f750848c7c003000000c3488b5208ff229090909090909000000000000000003800000000000000|@7990,1048575,@19003| 10891:D3,56|483b65187303ff55484883f86174064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19004| 10892:D3,56|483b65187303ff55484883f81774064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19005| 10893:D3,56|483b65187303ff55484883f85b74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19006| 10894:O1|@10895 10895:D3,24|48c7c001000000c300000000000000001000000000000000|@10709,1,@19007| 10896:D5,680|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f0000488911498d57e0483b55107303ff55404989d748c742f80300000048c74210f170020048894a0848c7020d0000004889c1535052f6c101740948c7c003000000eb08488b01488d440001a80174084883f8037f08eb61f640ff107560f6c101740948c7c003000000eb08488b01488d440001a80174084883f8017e08eb18f640ff10741248b8f07206c9a37f0000488b5d089090ff13f6c101750c480fb64108488d440001eb034889c84883f8617558f6c1017415eb0ae94c000000e94700000048c7c003000000eb08488b01488d440001a80174064883e8027105ff5570ebf54989c048c7c3030000004889c8909090ff159a0100004889c1483b65187303ff5548e92cffffff4889c8498d4fd0483b4d107303ff55404989cf48c741f802000000488b142448895108488901488d411848c740f80200000048c74008010000004889084889c34889d89090ff1546010000498d4fd0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70101000000488d412048c740f801000000c640ff40488908498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f803000000488948104889580848c70007000000488d482048c741f801000000c641ff4048ba30e306c9a37f0000488911498d5790483b55107303ff55404989d748c742f80300000048c74210f170020048894a0848c7020d000000488901488d422048c740f80300000059488948104889500848c700050000004889c1488d402048c740f805000000488b5c2408488958204889501848894810594883c4084889480848c70031000000c390900000000000000000a002000000000000|@10908,1023,@19019,@3795,@8572|39,0,@573 181,0,@219 528,0,@573 10897:S61|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129 10898:D3,72|483b65187303ff5548488b4230488b0c2448890424ff72384c8b52284c8b4a204989d8488b5a18488b4210488b72084889f251ff2290909000000000000000004000000000000000|@10595,1048575,@19010| 10899:D4,96|483b65187303ff554853ff7228ff7230ff7238ff72404c8b52204c8b4a184c8b4210488b5a089090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005800000000000000|@10595,2097151,@19012,@10900| 10900:D8,464|483b65187303ff554853ff35d8010000415041525341514c89c3488d44242090ff15ca010000488b4808488b10498d47e8483b45107303ff55404989c748c740f802000000488948084889105152488b54241090ff12488b442428488b4810488b09488b5048488b124883fa5375034889ca4883fa23751448ba98bd17c9a37f00009090ff156e010000eb1a48c7c02300000090ff1566010000488b5c242890ff1562010000498d47e8483b45107303ff55404989c748c740f80200000048b9803521c9a37f0000488908488b4c241848894808488060ffbf6a016a01ff742468ff7424684c8b9424800000004c8b4c24484c8d4424104889c3488b442468488b542440ff12488b442418488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8d523049c742f80100000041c642ff4049bb30e306c9a37f00004d891a4d8d5fb84c3b5d107303ff55404d89df49c743f80500000049895320415c4883c4084d896318498943104d895308415a4883c4384d8913498d433048c740f802000000488950084c8918c22000909090909090900000000000000000c801000000000000|@10903,2097151,@19013,@10902,@10596,@7831,@10512,@10496|122,0,@7830 192,0,@10901 353,0,@573 10901:D3,56|483b65187303ff55484883f85d74064883f817750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19011| 10902:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@19014| 10903:S72|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e28322961746f6d696345787072657373696f6e283129676574456e747279283129 10904:D3,72|483b65187303ff5548488b4230488b0c2448890424ff72384c8b52284c8b4a204989d8488b5a18488b4210488b72084889f251ff2290909000000000000000004000000000000000|@10595,1048575,@19015| 10905:D3,168|483b65187303ff5548a8017572498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a52488b48084889c8909090e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,7,@19016| 10906:D3,72|483b65187303ff5548488b4230488b0c2448890424ff72384c8b52284c8b4a204989d8488b5a18488b4210488b72084889f251ff2290909000000000000000004000000000000000|@10595,1048575,@19017| 10907:D3,72|483b65187303ff5548488b4230488b0c2448890424ff72384c8b52284c8b4a204989d8488b5a18488b4210488b72084889f251ff2290909000000000000000004000000000000000|@10595,1048575,@19018| 10908:S26|50415253455f5452454528292e6d6b53656c6563746f72283229 10909:S50|50415253455f44454328292e706172736544656328332964656328342965787072657373696f6e2832296d61746368283129 10910:O1|@10911 10911:D3,776|4889c148ba4e3921c9a37f0000488d548afcffe29090e91b020000909090e92b020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9dc010000909090e9b3010000909090e9ab010000909090e9a3010000909090e99b010000909090e993010000909090e9b5010000909090e983010000909090e9ae010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e943010000909090e977010000909090e978010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e951010000909090e95c010000909090e9f3000000909090e9eb000000909090e952010000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e9c5000000909090e93b000000909090e933000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883f87b740948c7c101000000eb4848c7c103000000eb4448c7c103000000eb4948c7c103000000eb4e48c7c103000000eb4a48c7c103000000eb4d48c7c103000000eb4448c7c103000000eb3b48c7c103000000eb32e92d000000e92800000048c7c103000000eb1fe91a00000048c7c103000000eb11e90c000000e90700000048c7c1030000004883f901740848c7c003000000c34883f847750848c7c003000000c34883f86d740848c7c001000000c348c7c003000000c39090909090909000000000000000000003000000000000|@7990,7,@19021|5,0,$10911+22 10912:O1|@10913 10913:D3,40|4883f867740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@10914,1,@19022| 10914:S22|53796d5365742e7369676e617475726553792d283129 10915:O1|@10916 10916:D3,40|4883f82b740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@10917,1,@19023| 10917:S20|53796d5365742e66756e63746f7253792d283129 10918:D6,240|483b65187303ff5548488b4b50488b09488b5378488b125251ff733041525041515341504889d848ba98bd17c9a37f0000909090ff15ce000000ff742420ff742420ff742420ff742420ff742420ff35bc0000004989e14c8b44243848bb804d1fc9a37f000048c7c005000000909090ff15a2000000488b48084883c458498d57b0483b55107303ff55404989d748c742f805000000488b5c241048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a488b38488d423048c740f803000000488950104889780848c70001000000c3900000000000000000e800000000000000|@10927,2097151,@19029,@7831,@10926,@10556|41,0,@7830 94,0,@10504 10919:S38|50415253455f44454328292e70617273654465632833297061727365546f7044656373283129 10920:D6,232|483b65187303ff5548488b4b50488b09488b5378488b125251ff73305041514150534889d848ba98bd17c9a37f000090ff15ca000000ff742418ff742418ff742418ff742418ff35bc0000004989e14c8b44242848bbd08d1fc9a37f000048c7c005000000909090ff15a2000000488b48084883c448498d57b0483b55107303ff55404989d748c742f805000000488b5c241048895a20488b591848895a18488b74240848897210488b7108488972085f4883c41048893a488b38488d423048c740f803000000488950104889780848c70003000000c3900000000000000000e000000000000000|@10922,2097151,@19025,@7831,@10921,@10556|39,0,@7830 86,0,@10586 10921:D4,80|483b65187303ff5548534c8b52204c8b4a184c8b4210488b5a089090ff1546000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000004800000000000000|@10595,2097151,@19027,@10923| 10922:S38|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329 10923:D9,464|483b65187303ff5548415153415241504989d848bbd08d1fc9a37f000048b810e31fc9a37f000090ff15ba010000504c8b4008488b5c2418488b084889c89090ff15aa010000488b0424488b4c2418488b5110488b12488b5948488b1b4883fb5375034889d34883fb237518ff70084889c848ba98bd17c9a37f0000ff1576010000eb1e488b580848c7c02300000090ff156a01000053488b5c2420ff1566010000498d47e8483b45107303ff55404989c748c740f80200000048b9e84221c9a37f0000488908488b4c241048894808488060ffbf6a016a014c8b5424384989e14989c0488b5c2430488b44242848ba605c1fc9a37f0000ff1512010000488b442410488b4c2408498d57c0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890a4c8b5424184c8d5a3049c743f80100000041c643ff4049bce00b1dc9a37f00004d89234d8d67b84c3b65107303ff55404d89e749c74424f805000000415d4883c4384d896c24204d8b6a084d896c24184d895c24104d8b1a4d895c240849891424498d44243048c740f802000000488950084c8920c3909090900000000000000000c801000000000000|@10925,2097151,@19028,@10543,@8558,@7831,@10512,@10496,@10529|21,0,@10586 31,0,@10651 116,0,@7830 188,0,@10924 240,0,@10527 350,0,@9706 10924:D3,56|483b65187303ff55484883f80574064883f81f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19026| 10925:S49|50415253455f44454328292e70617273654465632833297369676e6174757265446563283329646f536967446563283129 10926:D4,88|483b65187303ff554853ff72284c8b52204c8b4a184c8b4210488b5a08909090ff154a000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c39090909000000000000000005000000000000000|@10595,2097151,@19034,@10928| 10927:S36|50415253455f44454328292e706172736544656328332966756e63746f72446563283329 10928:D28,3016|483b65187303ff554853ff35d00b000041515341504152488d5c242048b8985b1fc9a37f00009090ff15ba0b0000504c8b4008488b5c2410488b084889c89090ff15aa0b0000488b0424488b4c2410488b5110488b12488b5948488b1b4883fb5375034889d34883fb43751cff7008ff304889c848ba98bd17c9a37f00009090ff15720b0000eb26488b5808488b3048c7c0430000009090ff15620b00005356488b5c2420909090ff155a0b0000498d47e8483b45107303ff55404989c748c740f80200000048b9085121c9a37f0000488908488b4c242848894808488060ffbf488b542420488b5a10488b1b488b7248488b364883fe5375034889de4883fe5f7570488b4250488b00488b5a28488b1b488b7278488b36488b7a70488b3f4d8d47a04c3b45107303ff55404d89c749c740f80500000049897020498978184989401049895808488b4230498900498d583048c743f8030000004c89431048c743080100000048c70301000000488d7320eb05e94200000048c746f801000000c646ff4048c70601000000498d7fe0483b7d107303ff55404989ff48c747f80300000048895f104889770848bb509adc000000000048891feb2b488b5a10488b1b488b7248488b364883fe5375034889de4889f348bf3a4621c9a37f0000488d7c9ffcffe7e9b4040000e91b020000909090e913020000909090e90b020000909090e903020000909090e9fb010000909090e9f3010000909090e9eb010000909090e9e3010000909090e9db010000909090e9d3010000909090e9cb010000909090e9c3010000909090e9bb010000909090e9b3010000909090e9ab010000909090e9a3010000909090e9b3010000909090e993010000909090e9ac010000909090e983010000909090e97b010000909090e973010000909090e96b010000909090e963010000909090e95b010000909090e953010000909090e94b010000909090e96d010000909090e93b010000909090e933010000909090e92b010000909090e923010000909090e91b010000909090e913010000909090e90b010000909090e903010000909090e9fb000000909090e9f3000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e9c6000000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e9a7000000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e988000000909090e93b000000909090e981000000909090e92b000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904883fe19740948c7c301000000eb4648c7c303000000eb3d48c7c303000000eb3448c7c303000000eb2b48c7c303000000eb2248c7c303000000eb1948c7c303000000eb1048c7c303000000eb0748c7c3030000004883fb01746f488b5a50488b1b488b7278488b365653ff72304c8b4c24484989c04889d3488b44243048ba785c1fc9a37f00009090ff1576070000488b4c2438488b5128488b12488b5970488b1b498d77d0483b75107303ff55404989f748c746f805000000488b7c241048897e2048895e18eb05e982000000488b5c240848895e10488956085a4883c410488916498d57d0483b55107303ff55404989d748c742f803000000488972104889420848c70201000000488d422048c740f801000000c640ff4048c70001000000498d7fe0483b7d107303ff55404989ff48c747f803000000488957104889470848b8509adc0000000000488907eb6f51ff35b60600004989d04889e348b8985b1fc9a37f00009090ff15a6060000504c8b4008488b5c2438488b084889c89090ff1596060000584883c410488b4c2420488b5110488b12488b5948488b1b4883fb5375034889d34883fb13751fff304889c848ba98bd17c9a37f0000eb05e9cf00000090ff155a060000eb1e488b1848c7c0130000009090ff154e06000053488b5c2428ff154a060000498d47e8483b45107303ff55404989c748c740f80200000048b9685121c9a37f0000488908488b4c243048894808488060ffbf6a016a014c8b5424484989e14989c0488b5c2438488b44243048ba605c1fc9a37f0000ff15f6050000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d7fe0483b7d107303ff55404989ff48c747f803000000594883c40848894f104889470858488907488b442420488b4810488b09488b5048488b124883fa5375034889ca4883fa5f75145748ba98bd17c9a37f000090ff157e050000eb1a48c7c05f00000090ff157605000057488b5c2428ff1572050000488b442428488b4810488b09488b5048488b124883fa5375034889ca4883fa15756a48ba98bd17c9a37f00009090ff1546050000498d47e8483b45107303ff55404989c748c740f80200000048b9d85121c9a37f0000488908488b4c243048894808488060ffbf6a016a014c8b5424484989e14989c0488b5c2438488b44243048ba605c1fc9a37f0000eb05e95500000090ff15ea040000498d47e0483b45107303ff55404989c748c740f803000000488b4c24084889481048c7400803000000594883c408488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb6e4883fa13756d48ba98bd17c9a37f0000ff158e040000498d47e8483b45107303ff55404989c748c740f80200000048b9305221c9a37f0000488908488b4c243048894808488060ffbf6a016a014c8b5424484989e14989c0488b5c2438488b44243048ba605c1fc9a37f0000eb0ae960000000e954000000ff152e040000498d47e0483b45107303ff55404989c748c740f803000000488b4c24084889481048c7400801000000594883c408488908498d4ff0483b4d107303ff55404989cf48c741f801000000488901eb0748c7c101000000488b442428488b5010488b12488b5848488b1b4883fb5375034889d34883fb2375135148ba98bd17c9a37f0000ff15ae030000eb1e4889cb48c7c0230000009090ff15a203000053488b5c2430ff159e0300006a016a01ff7424504c8b5424784c8d4c24084c8b442450488b5c2448488b44244048ba40f81fc9a37f0000909090ff1572030000488b442428488b4c2408498d57d0483b55107303ff55404989d748c742f805000000488b582048895a20488b711848897218488b781048897a104c8b41084c8942084c8b084c890af644241001756e4c8b5424104d8b1a4d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77c84c3b75107303ff55404d89f749c746f806000000eb05e94b0000004d896e284d8966204d8b63104d8966184d8b6b084d896e104d8b0b4d894e08488b3c2449893e498d7fe8483b7d107303ff55404989ff48c747f8020000004c89770848c70705000000eb04488b3c2448837c241001740949c7c101000000eb0749c7c1030000004983f1024d8d57f04c3b55107303ff55404d89d749c742f80100000041c642ff4049c702010000004d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703010000004d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77f04c3b75107303ff55404d89f749c746f80100000041c646ff4049c70601000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d5f98483b5d107303ff55404989df48c743f80c000000488943584c8973504c8963484c896b40488b4424284883c418488943384c894b304c8953284c895b20488b442408488943184889531048897b08584883c448488903498d47e8483b45107303ff55404989c748c740f80200000048895008488918c208009090909090900000000000000000c00b000000000000|@10934,2097151,@19035,@10935,@10543,@8558,@7831,@10512,@10496,@10605,@10933,@10543,@8558,@7831,@10512,@10496,@10529,@7831,@10512,@10496,@7831,@10529,@7831,@10529,@7831,@10512,@10496,@10676|30,0,@10524 118,0,@7830 200,0,@10929 429,0,I48 470,0,$10928+490 1162,0,@10528 1358,0,I48 1386,0,@10524 1472,0,@7830 1552,0,@10930 1604,0,@10527 1731,0,@7830 1810,0,@7830 1852,0,@10931 1904,0,@10527 2012,0,@7830 2052,0,@10932 2104,0,@10527 2252,0,@7830 2333,0,@10675 10929:D3,56|483b65187303ff55484883f81774064883f85f750848c7c003000000c3488b5208ff22909090909000000000000000003000000000000000|@7990,1048575,@19030| 10930:D3,72|483b65187303ff55484883f863750848c7c003000000c34883f81774064883f85f750848c7c003000000c3488b5208ff229090909090909000000000000000004000000000000000|@7990,1048575,@19031| 10931:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@19032| 10932:D3,48|483b65187303ff55484883f823750848c7c003000000c3488b5208ff2290909000000000000000002800000000000000|@7990,1048575,@19033| 10933:D3,72|483b65187303ff55484883f813750848c7c003000000c34883f81774064883f85f750848c7c003000000c3488b5208ff229090909090909000000000000000004000000000000000|@7990,1048575,@19037| 10934:S49|50415253455f44454328292e706172736544656328332966756e63746f72446563283329646f46756e6374446563283129 10935:D3,64|483b65187303ff55484883f823740c4883f81574064883f813750848c7c003000000c3488b5208ff229090909090909000000000000000003800000000000000|@7990,1048575,@19036| 10936:S20|534b4950535f28292e6e6f74666f756e64283229 10937:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19662| 10938:S31|535452554354555245535f28292e67656e636f646553747275637473283229 10939:D5,200|483b65187303ff5548f6c301755a6a016a01415041524151ff73084d89ca4c8d4c24204c8b442410488b0b4889c34889c8909090ff15a60000006a016a014c8b5424204c8b4c24184989e0488b5c2410488b442438e8a6ffffff48833c2401750c488b442430eb16e932000000488b1c24488b4424309090ff156a000000488b4c24284883c408488901584883c4184889410848c7c0010000004883c418c349c700010000004989400848c7c001000000c39090909090900000000000000000c000000000000000|@10941,2097151,@19040,@10942,@10940| 10940:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19656| 10941:S43|535452554354555245535f28292e67656e636f6465537472756374732832296d6170506169722833292829 10942:D8,472|483b65187303ff554848833803751349c701010000004989590848c7c001000000c348833801751f4c89d14d89c24c89ca4989c94989d04889d9488b58084889c8ff25a9010000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d8483b55107303ff55404989d748c742f80400000048be28cd06c9a37f0000488972184c89421048be10f608c9a37f00004889720848890a498d77d0483b75107303ff55404989f748c746f80200000048c7460801000000488916488d561848c742f80200000048c7420801000000488b40084889026a016a0141515156566a01ff3504010000488d44243050415249ba10f608c9a37f00004d89c14989d84889d348b8509adc000000000048ba685821c9a37f000090ff15d6000000f6042401741148b808c009c9a37f0000488b5d0890ff134883c40858488b00909090ff15b600000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848837c240801740e488b5c2408909090ff1566000000488b0c24488901488b4424104889410848c7c0010000004883c418c390900000000000000000d001000000000000|@12366,2097151,@19632,@12367,@12399,@10945,@7326,@12365|132,0,@440 150,0,@2150 254,0,@2150 273,0,I48 283,0,@10943 306,0,@2630 10943:O2|@10945,@10944 10944:O2|@12193,@10943 10945:D12,1240|483b65187303ff5548f6c3017568488b0b488339017564498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fc0483b7d107303ff55404989ff48c747f80200000048897708488b71084889374c8d5f1849c743f80200000049c743080100000049893beb0ae9ea030000e911010000498d7b1848c747f801000000c647ff4048c707010000004d8da770ffffff4c3b65107303ff55404d89e749c74424f80800000049897c243849c744243003000000488b7c242849897c24284d8944242049894424184d894c24104d895424084c8b4424084d8904244d8d6c244849c745f80800000049bee05d21c9a37f00004d8975004989550849894510488b4308498945184d894d204d895528488b542418498955304d894538498065ffbf6a016a014989e24d89e94d89e048c7c3010000004c89d848bac05e21c9a37f00009090ff159a03000048833c24017507488b442430eb12488b1c24488b442430909090ff1582030000488b4c24204883c408488901584889410848c7c001000000c22800488339037570498d77d0483b75107303ff55404989f748c746f80500000048bf10f024c9a37f000048893e48895608488b7b0848897e104c8b5c24184c895e184c8b6424084c896620488066ffbf4d8d6fd04c3b6d107303ff55404d89ef49c745f80500000049be00f124c9a37f00004d897500eb05e94a000000498955084c8b71084d897510498975184d896520498065ffbf488b742428488b5c2420488b7c2410488974242848895c24204c896c241848897c24104c89642408488b5910e9aafdffff488b7118488b366a016a0141524151ff73085052415056ff7424504151415241504c8b52084989c14c8d442458488b5910488b442428ff156e0200004c8b5424284c8b4c24504c8b442430488b5c2440584883c40890ff1556020000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d8483b55107303ff55404989d748c742f80400000048bb28cd06c9a37f000048895a18488b5c241848895a10488b7424204889720848890a498d7fe8483b7d107303ff55404989ff48c747f80200000048c74708010000004889176a016a01ff305157576a01ffb42488000000488d54243052ffb424880000004989f24989d94c8b4008488b5c2460488b442458488b5424509090e88efcfffff6042401741148b808c009c9a37f0000488b5d0890ff134883c40858488b00909090ff157601000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848837c240801740e488b5c2408909090ff15260100004883f8017506488b0424eb104889c3488b0424909090ff15120100004883f8017507488b442440eb0f4889c3488b44244090ff15fe0000004883f8017507488b442470eb0f4889c3488b44247090ff15ea000000488b4c24604883c410488901584883c4384889410848c7c001000000c228004889c1498d47c8483b45107303ff55404989c748c740f806000000488b542428488950284c8950204c8948184c89401048894808488b4c2420488908488b5424189090ff12488b4c2410488b10488911488b58084889590848c7c001000000c22800900000000000000000d004000000000000|@12174,2097151,@19528,@10950,@12175,@12176,@12182,@7326,@12190,@12191,@12192,@12173|247,0,@10946 326,0,@10948 433,0,@12169 505,0,@12171 751,0,@440 890,0,@2630 10946:D3,128|483b65187303ff5548488b48086a016a01ff7128ff30ff7230488d5c241853ff72384c8b52284c8b4a204c8b4120488b5a18488b4210488b72084889f2909090ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c39090909000000000000000007800000000000000|@10947,1048575,@19041| 10947:S33|434f444547454e5f50415253455452454528292e67656e636f6465283829283129 10948:O3|@10950,@11545,@10949 10949:O2|@12110,@11717 10950:D53,4472|488dbc2410ffffff483b7d187303ff5550a801751b488b08488b31488b3e49bb2e5f21c9a37f00004d8d5cbbfc41ffe3e9ee10000090e9ff000000909090e9eb000000909090e9e3000000909090e9db000000909090e9d3000000909090e9cb000000909090e9c3000000909090e9bb000000909090e9b3000000909090e936080000909090e9a3000000909090e99b000000909090e935090000909090e98b000000909090e983000000909090e97b000000909090e973000000909090e96b000000909090e963000000909090e9be090000909090e9420a0000909090e94b000000909090e943000000909090e93b000000909090e933000000909090e92b000000909090e9850b0000909090e91b000000909090e94e0c0000909090e90b000000909090e903000000909090488b78084889f8e9c6feffff488b7e084c8b5f284d8b1b4c8b60084989d5488b4710ff153a10000048837f1801751b4d89c65350ff7718ff37ff7720ff7710909090ff1522100000eb2d4889c14c89d85351ff7718ff37ff7720ff7710498b5028498b7020498b78104d8b7008498b1841564d89c6eb1341ff7608498b5628498b7620498b7e10498b1e415241514156415441554153525753564889c3488b442458ff15ca0f00006a016a014889e3909090ff15c20f0000498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480848c700010000006a016a01488b4c2478488b542418f6c1017542f6c201753dff7208ff7108ff7424684c8b9424880000004c8b4c24484989c0488b1a488b019090ff15620f0000488b542408594883c408483b65187303ff5548ebb94889e1488b104889114889e1488b580848895908488b4c2428488b716840f6c601753e488b3e4c8b074c3b05250f0000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb194c8b4e084c89ce483b65187303ff5548ebbc49c7c1010000004983f901756b48be98c809c9a37f000040f6c601753e488b3e4c8b074c3b05d20e0000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb194c8b4e084c89ce483b65187303ff5548ebbc49c7c1010000004983f901751948b8c0cf09c9a37f0000488b5d08eb05e92a0000009090ff13498b31488b3e483b3d760e0000741148b878e107c9a37f0000488b5d0890ff134c8b4610eb26498b31488b3e483b3d580e0000741348b878e107c9a37f0000488b5d08909090ff134c8b46104d89c24c8b4c24384c8b442470488b5c2430488b44241048ba287221c9a37f00009090ff151e0e0000504c8b5424384c8b4c24304c8b442478488b5c2410488b8424a000000090ff15020e0000488b18488b7008488b842488000000909090ff15f20d0000534c8b5424404c8b4c24384c8b8424800000004889f3ff15de0d0000488338017506488b0c24eb19488b7008488b18488b0424909090ff15c60d00004889c1eb04488b70084889cb488b8424a80000004883c4089090ff15ae0d0000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f801000000c640ff4048c70001000000498d57d8483b55107303ff55404989d748c742f80400000048894a18488b4c243848894a10488b4c247848894a08488902498d4fe8483b4d107303ff55404989cf48c741f802000000488b7c2440488979084889114883bc2498000000017467488b9424a0000000488b7c24484883fa0175234883ff0174144889c248b8a03f0bc9a37f0000488b5d0890ff1348c7c201000000eb6a40f6c70174154989c048b8a03f0bc9a37f0000488b5d089090ff134c8b024d8b084d8b51104d8b5a0849833b03751beb05e96600000049837b1803750d4d8b63084c8b2f4d892c24eb3949833b01750b4d8b631049833c2403741c4989c448b828621ac9a37f0000eb05e934000000488b5d089090ff134d8b6c24084c8b374d897500488b7f084c8b62084c89e2483b65187303ff5548e93bffffff48c7c201000000488b542460498d7fb8483b7d107303ff55404989ff48c747f8080000004c8b42384c8947384c8b4a304c894f3048894f2848897720488b7218488977184c8b52104c8957104c8b5a084c895f084c8b224c89276a016a015350514c8d54241849b918f121c9a37f00004989f848c7c301000000488b8424b8000000488b542478e8b6f9ffff4883bc24c0000000017469488b8424c8000000a8017562488b08488b11488b5a10488b730848833e03751448837e1803750d488b7e0848c70701000000eb2f48833e01750a488b7e1048833f037414488b780848b828621ac9a37f0000488b5d08ff134c8b470849c70001000000488b7808eb0ae91c000000e90e0000004889f8483b65187303ff5548eb8748c7c001000000eb0748c7c001000000488b842488000000498d4fb8483b4d107303ff55404989cf48c741f808000000488b503848895138488b583048895930488b342448897128488b7c242048897920488b7818488979184c8b40104c8941104c8b48084c8949084c8b104c89116a016a014989e24c8b8c24a00000004989c848c7c301000000488b842490000000488b942488000000909090e88af8fffff644241001741048b808c009c9a37f0000488b5d08ff13488b442418488b00909090ff156a0a000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848833c24017507488b4c2428eb1a4889c6488b1c24488b4424289090ff150e0a00004889c14889f04883f901740c4889cb909090ff15fe0900004883f8017507488b442420eb0f4889c3488b44242090ff15ea0900004883f8017507488b442438eb0f4889c3488b44243890ff15d60900004883f8017507488b442440eb0f4889c3488b44244090ff15c20900004883f801750a488b8424e0000000eb144889c3488b8424e0000000909090ff15a6090000488b8c24a80000004883c408488901584881c4980000004889410848c7c0010000004883c440c341524151415053ff700852ff76084d8b104d8b4828498b78084d8b58104989f84c89db488b0424ff155a0900004889c3589090ff1556090000488b4c241853ff71284c8b51104c8b094c8b4108488b59209090ff153e090000488338017506488b0c24eb19488b7008488b18488b0424909090ff15260900004889c1eb04488b70084883f9017507488b442418eb0e4889cb488b442418ff150a090000488b4c24204883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b793048897a304c8b41284c89422848897220488b7118488972184c8b49104c894a104c8b51084c8952084c8b194c891a4c8b5424284c8b4c24204989d04889c3488b4424085a4883c428e930f6ffff6a016a0141524151415053ff7008524c8d4c24304889f3488b4608488b7a084889fa9090ff1248837c2430017507488b442410eb11488b5c2430488b44241090ff1552080000488b4c2418498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a284c8b4424384c8942204c8b41184c8942184c8b49104c894a104c8b51084c8952084c8b194c891a4c8b5424284c8b4c24204989d04889c3488b4424085a4883c438e96ff5ffff488b7e084c8b5f204d8b1b4d8d67c84c3b65107303ff55404d89e749c74424f80600000049bde0f121c9a37f00004d892c2449895424084c8b68084d896c24104d894c24184d895c24204d8944242849806424ffbf48833f0175064c8b4f08eb204989d94989d3488b1f488b470890ff156a0700004c89c94989c14889cb4c89da4c89c84d89e1e9e3f4ffff488b7e084c8b5f104d8b1b4c8b67184d8b24244c8b6f204d8b6d0041524151415053ff7008524154415541ff701041ff3041ff700841ff70284c8b5424184c8b4c24104d8b70204c8b4424084c89f34c89d890ff1502070000ff304c8b5424184c8b4c24104c8b442408488b5808488b442420ff15ea060000ff304c8b5424204c8b4c24184c8b442410488b5808488b442430ff15d2060000488338017506488b0c24eb19488b7008488b18488b0424909090ff15ba0600004889c1eb04488b70084883f9017507488b442408eb0e4889cb488b442408ff159e0600004883f8017507488b442448eb0f4889c3488b44244890ff158a060000488b4c24504883c438498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b793048897a304c8b41284c89422848897220488b7118488972184c8b49104c894a104c8b51084c8952084c8b194c891a4c8b5424284c8b4c24204989d04889c3488b4424085a4883c428e970f3ffff488b78084989d3488b460890ff1506060000415241514150535741534d8b50104d8b08498b4808498b50204989c84889d3909090ff15e6050000488338017507488b4c2410eb18488b7008488b18488b44241090ff15ce0500004889c1eb04488b7008488b442418498d57b8483b55107303ff55404989d748c742f808000000488b583848895a38488b783048897a304c8b40284c89422848897220488b7018488972184c8b48104c894a104c8b50084c8952084c8b184c891a4c8b5424284c8b4c24204989d04889cb488b4424085a4883c428e997f2ffff488b7e0841524151415053ff700852ff31ff7608ff7620ff710841ff3040f6c7017568488b07488b4818488b09ff7708ff7010f6c1017558488b01498d57d8483b55107303ff55404989d748c742f80400000048bba07622c9a37f000048891a488b5c241048895a08488b74243048897210488b3c2448897a18488062ffbfff71084889d3488b4818eb0ae930000000e9180000004889c8909090ff15b604000059483b65187303ff5548eb864883c4085f483b65187303ff5548e95dffffff48c7c001000000488b4424404883c4084c8b50104c8b184c8b60084d89d8488b5c2408488b48204889c890ff156e040000ff7008ff304d89d94d89e0488b5c2418488b44241048ba507722c9a37f0000909090ff154e0400004883f8017506488b0424eb104889c3488b0424909090ff153a040000488b4c24484883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a284c8b04244c8942204c8b49184c894a184c8b51104c8952104c8b59084c895a084c8b214c89226a016a014989c54989d64889e3488b44242890ff15ca030000488b44243841555741524154415341564d89f0488b5c2460488b4810488b4424384889ca9090ff1248837c243001750948c7c101000000eb5e488b4c243048c7c20100000050f6c1017520ff71084889d3488b019090ff15760300004889c259483b65187303ff5548ebdb4889d06a016a01488b8c24800000004989e14c8b442418488b5c2478488b5108909090ff12594883c408eb0150488b44246048c7c201000000a8017541488b18488b7318488b364883fa01741c4889cf4c8b40084889d34889f090ff150e0300004889c64889f9eb044c8b40084889f24c89c0483b65187303ff5548ebbb4889d051ff7424304c8b5424304c8b4c24284c8b442420488b5c245890ff15d6020000488338017506488b0c24eb19488b7008488b18488b0424909090ff15be0200004889c1eb04488b70084883f9017507488b442408eb0e4889cb488b442408ff15a20200004883f8017507488b442438eb0f4889c3488b44243890ff158e0200004883f801750a488b842488000000eb144889c3488b842488000000909090ff1572020000488b8c24900000004883c478498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b793048897a304c8b41284c89422848897220488b7118488972184c8b49104c894a104c8b51084c8952084c8b194c891a4c8b5424284c8b4c24204989d04889c3488b4424085a4883c428e9ddeeffff498d47e8483b45107303ff55404989c748c740f8020000004c89400848891841524c89ca90ff12488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000007011000000000000|@11343,2097151,@19174,@11344,@11345,@11346,@3589,@11411,@20139,@20139,@20139,@20139,@10952,@11420,@11428,@11420,@11429,@11430,@7326,@11431,@11432,@11433,@11434,@11435,@11436,@11437,@11499,@11109,@11500,@11501,@11502,@11503,@11109,@11420,@11504,@11512,@11513,@11514,@11515,@11420,@11516,@11517,@11526,@11336,@11528,@11529,@11530,@11541,@11109,@11542,@11543,@11544,@11342|32,0,$10950+54 723,0,@2635 814,0,@2690 854,0,@1486 892,0,@1486 938,0,@10951 1290,0,@3339 1325,0,@3339 1410,0,@8726 1574,0,@11103 1695,0,@8726 1919,0,@2630 2743,0,@11106 3518,0,@11332 3697,0,@11334 10951:O6|@10952,@2530,@2164,@2326,@2432,@2514 10952:D9,296|483b65187303ff55485241514150415250539090ff1526010000488b4c242850ff7120ff71284c8b51184c8b4c24384c8b4424304889c3488b442420ff15060100004883f80175154889c148b8e07321c9a37f0000488b5d089090ff13909090ff15ea000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000514c8b4c24284c8b442410488b5c2408488b4424189090ff15b2000000488b4c243850ff71104c8b5424404c8b4c24384c8b4108488b5c2430488b44242890ff15920000004883f8017506488b0424eb104889c3488b0424909090ff157e0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c408594883c438488908c3909000000000000000002001000000000000|@10957,2097151,@19042,@10958,@10959,@11013,@11017,@11022,@10956|77,0,@10953 10953:O4|@20055,@557,@10955,@10954 10954:O5|@559,474,0,474,0 10955:S36|6d6b4d757475616c446563733a20656d707479206465636c61726174696f6e206c697374 10956:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19099| 10957:S39|545950454944434f444528292e637265617465446174617479706546756e6374696f6e73283529 10958:D3,232|483b65187303ff5548a801756e488b08488b5118488b32488b7e104c8b47084983380375064d8b4810eb3d4983380175064d8b4808eb3149c7c1010000004d8b500841f6c201752041f6c10174064983c1027105ff5570ebf54d8b5208483b65187303ff5548ebda4983f90174124c8b480848c7c005000000eb10e94e0000004c8b480848c7c0030000005341514889da909090ff1250488b5c2410488b442408e85affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390900000000000000000e000000000000000|@1363,1048575,@19043| 10959:D5,136|483b65187303ff55484d89c348bab09b09c9a37f00009090ff15820000004889c148c7c20100000050415341514152f6c1017539ff7108ff742408ff742440ff7424404c8b5424384c8b4c24284c8b4424304889d3488b01ff154a0000004889c259483b65187303ff5548ebc24889d04883c420c210009000000000000000008000000000000000|@10987,2097151,@19055,@2561,@10960|14,0,@2560 10960:D44,3960|488dbc2418ffffff483b7d187303ff5550488b08488b5118488339017460488b32488b7e104c8b5f0849833b0375064d8b6310eb3d49833b0175064d8b6308eb3149c7c4010000004d8b6b0841f6c501752041f6c40174064983c4027105ff5570ebf54d8b6d08483b65187303ff5548ebda49833b03750b4d8b6b10eb42e9000e000049833b0175064d8b6b08eb3149c7c5010000004d8b730841f6c601752041f6c50174064983c5027105ff5570ebf54d8b7608483b65187303ff5548ebda53ff70085641544150ff72084152415148bbe08721c9a37f00004c89e8909090ff15aa0e0000488b4c2418498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fe0483b5d107303ff55404989df48c743f80300000048bed08821c9a37f000048893348895308488b710848897310488063ffbf488b3940f6c70174064883c7027105ff5570ebf54d8d47e04c3b45107303ff55404d89c749c740f80300000049895010498958084989384883f801746957ff35100e0000525041505657488d5c2428488b442458ff15020e00004889c3488b44241848bab09b09c9a37f0000ff15f20d0000ff3424ff742410ff742430ff35e90d000050488d5c2408488b842480000000909090ff15da0d0000498d47f0483b4510730aeb05e9d8000000ff55404989c748c740f801000000c640ff4048c70001000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba588a21c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f8020000005a4883c4204889500848c70003000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fc0483b5d107303ff55404989df48c743f8040000004889431848894b10488b44241048894308488913488d4b2848c741f802000000488b54243848895108488919eb0e488b0c246a016a01525041505657498d47e0483b45107303ff55404989c748c740f80300000048ba308b21c9a37f0000488910488b54244048895008488b54245048895010488060ffbf4889cb4889c648b8f08f21c9a37f0000909090ff15960c0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad0d506c9a37f0000488951104889410848c701070000005351ffb424a0000000ffb424a0000000ffb424a0000000ff74243856534c8b5424584c8b4c24604c8b442448488b5c2440488b842488000000ff15260c0000498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b858cd06c9a37f000048894110584889410848c70103000000f6442420017469488b4424684989ca488b1848b8209021c9a37f0000ff15d60b000048bb389021c9a37f0000ff15ce0b0000488b4c2428488b0948c7c201000000f6c1017541488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2eb05e950010000488b59084889d9483b65187303ff5548ebba4889d14889c34889c8ff15720b0000483b1d730b00007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff152e0b00005053415248bb509021c9a37f000048c7c00500000090ff151a0b0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048894108488b442470488901498d47e8483b45107303ff55404989c748c740f802000000488b542478488950084889084881c480000000c2180048c7c001000000488b542420f6c201751ea80174064883c0027105ff5570ebf5488b5208483b65187303ff5548ebdd488b542458498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000488b3240f6c60174064883c6027105ff5570ebf5498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004989f041f6c00174064983c0027105ff5570ebf5564150ff72085357ff35b309000051505357ff72084150488d5c243090ff15a6090000488b8c24d0000000f6c10174064883c1027105ff5570ebf5488b9424b80000005bf6c301740af602017405482b1a7105ff5570ebf64883c301f6c30174084883fb017c08eb19f643ff1074134889c248b8701e09c9a37f0000488b5d08ff13f6c30174084883fb017e5beb06f643ff107558f6c30174064883eb027105ff5570ebf5f6c30174084883fb017c08eb1cf643ff1074164889c248b8701e09c9a37f0000488b5d08909090ff13f6c30174084883fb017e64eb06f643ff10755cf6c3017412eb0ae9b0000000e9ab0000004883eb027105ff5570ebf54889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848890852488b542408ff12488b5c241890ff1596080000eb50f6c10174084883f9017c08eb1cf641ff1074164889c248b8001f09c9a37f0000488b5d08909090ff134889c2498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000500000052488b5c2410909090ff153e080000eb50f6c10174084883f9017c08eb1cf641ff1074164889c248b8001f09c9a37f0000488b5d08909090ff134889c2498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000500000052498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010900000048833c2401750c48b8f08f21c9a37f0000eb1b4889ce488b1c2448b8f08f21c9a37f000090ff15a60700004889f14889cbff15a2070000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488b8424c80000004883c4104989ca488b1848b8209021c9a37f0000909090ff155607000048bb389021c9a37f0000ff154e07000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15fa060000483b1dfb0600007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15b60600005053415248bba89021c9a37f000048c7c00500000090ff15a2060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b8c24b00000004989c2488b1948b8209021c9a37f000090ff151206000048bb009121c9a37f0000ff150a06000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15b6050000483b1db70500007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15720500005053415248bb189121c9a37f0000488b442418909090ff155e050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c418488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048894108488b8424a8000000488901a80174064883c0027105ff5570ebf5f64424380174154889c248b808c009c9a37f0000488b5d089090ff13488b542438488b12488b12488b124889cb4889c64889d0ff158a04000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f8017506488b0424eb2e4889c1498d47e0483b45107303ff55404989c748c740f803000000488b1424488950104889480848c7001500000048c7c1050000004883c438f6c1017412f644246001740b488d49ff48034c24607105ff5570ebf0488b5424684989da4989f34989c44989cd488b1a48b8209021c9a37f000090ff15ca03000048bbf09f09c9a37f0000ff15c2030000488b4c2428488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff156a030000483b1d6b0300007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff1526030000415241535053415448bb709121c9a37f00004c89e890ff1512030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f802000000488b942480000000488950084889084889c1488d401848c740f80200000048894808594889084881c480000000c21800488b700848c7c0010000009090ff153202000053565048bbc89121c9a37f000048c7c0050000009090ff151e020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120584889411848c741100100000048b8000907c9a37f00004889410848b880d606c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c218000000000000000000700f000000000000|@10989,2097151,@19056,@1354,@10990,@1354,@2561,@10994,@1354,@10996,@10997,@100,@100,@2258,I48,@2259,@1354,@11009,@1354,@2226,@2226,@11011,@2166,@100,@100,@2258,I48,@11012,@1354,@100,@100,@2258,I48,@11012,@1354,@10988,@100,@100,@2258,I48,@2259,@1354,@2259,@1354|210,0,@10961 296,0,@10964 424,0,@2560 546,0,@10965 751,0,@10967 793,0,@10972 844,0,@502 960,0,@442 1004,0,@10974 1020,0,@10975 1153,0,I48 1195,0,@971 1224,0,@10976 1715,0,@2221 1788,0,@2221 1940,0,@2224 2036,0,@2224 2136,0,@10972 2155,0,@10972 2249,0,@10974 2268,0,@10975 2393,0,I48 2435,0,@971 2464,0,@10978 2623,0,@10974 2640,0,@10980 2765,0,I48 2807,0,@971 2836,0,@10981 3033,0,@2630 3263,0,@10974 3280,0,@2577 3409,0,I48 3451,0,@971 3484,0,@10983 3739,0,@10985 3829,0,@816 3843,0,@509 10961:O1|@10962 10962:D3,96|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f1700200488908c300000000000000005800000000000000|@10963,3,@19044|30,0,@573 10963:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322961726754797065732d283129 10964:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19045,@2226|41,0,@2221 195,0,@2224 269,0,@2224 10965:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@10966,15,@19046| 10966:S91|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6d6b41646472283129 10967:D4,56|483b65187303ff55484c8b52104c8b4a084c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@10969,1048575,@19047,@10968| 10968:D5,512|483b65187303ff554841f6c1017556498b09488b11488b5a18488b33488b7e104c8b5f0849833b0375184c8b600849833c2403750d4d8b6b084d3b6c24087554eb3449833b01754c4c8b600849833c240175414d8b6b1841f6c501751241f644241801eb05e93f0000007503ff55704d3b6c2418751e4d8d6ff04c3b6d107303ff55404d89ef49c745f80100000049894d00eb1c4d8b61084d89e1483b65187303ff5548e960ffffff49c7c5010000004983fd01750c4c89c3488b00ff2556010000498b4500488b08498b10f6c201740b41f602017405492b127105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488918ff7110ff7108498b50089090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420858488902498d47e8483b45107303ff55404989c748c740f8020000004889500848ba80d606c9a37f0000488910498d57c8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f80300000048c74010010000004889500848c7001d000000f6c2017406ff2535000000c3909090900000000000000000f801000000000000|@10971,1048575,@19048,@10970,@2211|407,0,@509 10969:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283129 10970:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19049,@2178|263,0,@2173 10971:S73|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f7244617461747970652832296765744571466e466f724944283329 10972:O2|@439,@10973 10973:O2|@507,0 10974:S3|65712d 10975:S3|283229 10976:O1|@10977 10977:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19050|2,0,@441 10978:O1|@10979 10979:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19051|2,0,@441 10980:S6|283229285029 10981:O1|@10982 10982:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19052|2,0,@441 10983:O1|@10984 10984:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19053|2,0,@441 10985:O1|@10986 10986:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19054|2,0,@441 10987:S36|545950454944434f444528292e657175616c697479466f72446174617479706573283429 10988:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@19071| 10989:S58|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229 10990:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bba89321c9a37f0000488918488b52084889500848894810488060ffbfc390909090909000000000000000004800000000000000|@10993,15,@19058|29,0,@10991 10991:D3,168|483b65187303ff5548488b4a10f6c10174064883c1047105ff5570ebf5488b18f6c301740cf64208017406482b5a087105ff5570ebf54883c301488b5008498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048895808488908909090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c3909090909090900000000000000000a000000000000000|@10992,1048575,@19057| 10992:S93|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129283129 10993:S90|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d617267732d283129 10994:D4,336|483b65187303ff5548a80174064883c0047105ff5570ebf5488b4a18f6c101740cf64218017406482b4a187105ff5570ebf54883c101f6c10174084883f9017c08eb1af641ff1074144889c348b8701e09c9a37f0000488b5d0890ff13f6c10174084883f9017e64eb06f641ff10755cf6c10174064883e9027105ff5570ebf54889c3498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848891852488b4a104889ca9090ff12488b0c24488b59084883c4089090ff159e000000eb4ba80174084883f8017c08eb19f640ff1074134889c148b8001f09c9a37f0000488b5d08ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700010000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c3909000000000000000004801000000000000|@10995,1048575,@19059,@2226|78,0,@2221 227,0,@2224 10995:S98|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229617267547970654d61707c6c6f63616c4172674c6973742d6c6f63616c4172674c6973742d283129 10996:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19060| 10997:D28,2448|488dbc2458ffffff483b7d187303ff5550a801755e488b0841524151415053ff7008ff7110ff7118ff7108488b442410ff1572090000f60424017567488b0c244883390375624883380575185049c7c00100000048c7c30300000090ff154e090000eb4a4889c1498d47d8483b4510730aeb05e9f9080000ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000eb0ae959020000e95402000051498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8ff15de080000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba90d706c9a37f0000488951104889410848c70107000000488b04244883380575175149c7c00100000048c7c301000000ff158e080000eb38498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c7401001000000488b14244889500848c7000d000000514889c348b828f506c9a37f0000909090ff1546080000498d4fb0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f8040000004889481848b980d606c9a37f000048894810594889480848c70003000000488b0c2448833905751b5049c7c00100000048c7c3010000004889c890ff15d2070000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d000000524889c348b8089021c9a37f0000ff158e070000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c7010700000051ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb42488000000ffb424880000004c8b9424800000004c8b4c24784c8b442470488b5c2468488b44246090e83afdffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488948185948894810594883c4084889480848c700030000004883c440c230004989c0488b442438909090ff15ce060000488b4c240848833905750a488b511048833a0b74164889c248b878a221c9a37f0000488b5d08909090ff134c8b49084989c2488b4208ff159a0600004c89d3909090ff1596060000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf8a221c9a37f000048891148894108488061ffbf6a016a0141504c8d4424084889cb4c89c8909090ff1556060000ffb42480000000ffb424800000004c8b9424980000004c8b4c24704c8b442478488b9c2480000000488b44241890ff152a060000504c8b4c24504c8b442448488b5c2440488b44243090ff151606000048833805751849c7c00100000048c7c3050000009090ff1502060000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d000000488b4c2440f6c101740ef6442440017407482b4c24407105ff5570ebf44883c101f6c10174084883f9017c08eb19f641ff1074134889c248b8701e09c9a37f0000488b5d08ff13f6c10174084883f9017e5ceb06f641ff107554f6c10174064883e9027105ff5570ebf54889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7000100000052488b542450ff12488b5c245890ff1526050000eb0e4889c148b828cd06c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c7400801000000488908ff15de040000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000514c8b4c24584c8b442450488b5c2448488b44243890ff159a04000048833805751849c7c00100000048c7c3050000009090ff1586040000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d000000488b4c2448f6c101740ef6442448017407482b4c24487105ff5570ebf44883c101f6c10174084883f9017c08eb19f641ff1074134889c248b8701e09c9a37f0000488b5d08ff13f6c10174084883f9017e5ceb06f641ff107554f6c10174064883e9027105ff5570ebf54889c2498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7000300000052488b542458ff12488b5c246090ff15aa030000eb0e4889c148b868d606c9a37f000051498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c7400801000000488908ff1562030000498d4fa8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f80200000048c7400801000000488908488d481848c741f80200000048894108584889014889c8ff1506030000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488b04244883380575185149c7c00100000048c7c30100000090ff15be020000eb38498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c7401001000000488b14244889500848c7000d000000514889c348b828f506c9a37f0000909090ff1576020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488b4424084883380575185149c7c00100000048c7c30100000090ff152e020000eb39498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c7401001000000488b5424084889500848c7000d000000514889c348b8089021c9a37f00009090ff15e6010000498d4fb0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f80400000048ba80d606c9a37f000048895018488b542408488950104889480848c7000300000050ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a0000000ffb424a00000004c8b9424980000004c8b8c24900000004c8b842488000000488b9c2480000000488b4424789090e8caf6ffff4889c1498d47d8483b45107303ff55404989c748c740f804000000488948185948894810594883c4204889480848c700030000004883c440c2300048b880d606c9a37f0000c23000909000000000000000008809000000000000|@11004,2097151,@19062,@11005,@2178,@2166,@2178,@2166,@2178,@2166,@11006,@11007,@1699,@1382,@2219,@11008,@2178,@2226,@2166,@11003,@2178,@2226,@2166,@2166,@2178,@2166,@2178,@2166|252,0,@517 369,0,@685 451,0,@509 572,0,@10973 812,0,@10998 884,0,@11001 1151,0,@2221 1273,0,@440 1563,0,@2221 1685,0,@508 2001,0,@685 2162,0,@10973 2239,0,@509 2419,0,@509 10998:O4|@20055,@557,@11000,@10999 10999:O5|@1338,1515,0,1515,0 11000:S19|4e6f7420612066756e6374696f6e2074797065 11001:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@11002,63,@19061| 11002:S41|545950455f5452454528292e636f6e7374727563746f72526573756c74283229676574417267283129 11003:D5,456|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25aa0100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057557488b4808488b09488b4010488b00f6c301740af600017405482b187105ff5570ebf64883c301f6c30174084883fb017c08eb17f643ff10741148b8701e09c9a37f0000488b5d0890ff13f6c301740d4883fb017e58eb0be9c0000000f643ff10754bf6c30174064883eb027105ff5570ebf5498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848890841514c89c2909090ff125b90ff15c6000000eb48f6c10174084883f9017c08eb18f641ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c34883380374144889c148b8000309c9a37f0000488b5d0890ff13488b4008c39090909090900000000000000000c001000000000000|@2195,1048575,@19067,@2178,@2226|178,0,@2221 313,0,@2224 414,0,@2173 11004:S75|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f72446174617479706528322970726f63657373436f6e73747273283129 11005:D5,456|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25aa0100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057557488b4808488b09488b4010488b00f6c301740af600017405482b187105ff5570ebf64883c301f6c30174084883fb017c08eb17f643ff10741148b8701e09c9a37f0000488b5d0890ff13f6c301740d4883fb017e58eb0be9c0000000f643ff10754bf6c30174064883eb027105ff5570ebf5498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848890841514c89c2909090ff125b90ff15c6000000eb48f6c10174084883f9017c08eb18f641ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c34883380374144889c148b8000309c9a37f0000488b5d0890ff13488b4008c39090909090900000000000000000c001000000000000|@2195,1048575,@19063,@2178,@2226|178,0,@2221 313,0,@2224 414,0,@2173 11006:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@19064| 11007:D3,168|483b65187303ff5548a8017572488b084883390d7417488b500848b8d89107c9a37f0000488b5d08909090ff13498d57e8483b55107303ff55404989d748c742f802000000488b591048895a08488b710848893252488b78084889f890e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,63,@19065|28,0,@1384 11008:D5,456|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25aa0100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057557488b4808488b09488b4010488b00f6c301740af600017405482b187105ff5570ebf64883c301f6c30174084883fb017c08eb17f643ff10741148b8701e09c9a37f0000488b5d0890ff13f6c301740d4883fb017e58eb0be9c0000000f643ff10754bf6c30174064883eb027105ff5570ebf5498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848890841514c89c2909090ff125b90ff15c6000000eb48f6c10174084883f9017c08eb18f641ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c34883380374144889c148b8000309c9a37f0000488b5d0890ff13488b4008c39090909090900000000000000000c001000000000000|@2195,1048575,@19066,@2178,@2226|178,0,@2221 313,0,@2224 414,0,@2173 11009:D5,504|483b65187303ff5548488b4a20f6c101740cf64228017406482b4a287105ff5570ebf54883c101f6c10174084883f9017c08eb19f641ff1074134889c348b8701e09c9a37f0000488b5d08ff13f6c10174084883f9017e5beb06f641ff107558f6c10174064883e9027105ff5570ebf5f6c10174084883f9017c08eb1cf641ff1074164889c348b8701e09c9a37f0000488b5d08909090ff13f6c10174084883f9017e6ceb06f641ff107564f6c1017412eb0ae9b8000000e9b30000004883e9027105ff5570ebf54889c3498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848891852488b4a184889ca9090ff12488b0c24488b59109090ff1502010000eb4ca80174084883f8017c08eb19f640ff1074134889c148b8001f09c9a37f0000488b5d08ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000100000052488b0c24488b59084883c408ff15aa000000eb4ba80174084883f8017c08eb19f640ff1074134889c148b8001f09c9a37f0000488b5d08ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700010000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c39090909090900000000000000000f001000000000000|@11010,1048575,@19068,@2226,@2226|63,0,@2221 136,0,@2221 295,0,@2224 391,0,@2224 11010:S70|545950454944434f444528292e657175616c697479466f72446174617479706573283429657175616c697479466f724461746174797065283229706f6c79417267732d283129 11011:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19069| 11012:D3,128|483b65187303ff5548a8017555488b08488339097417488b500848b8103209c9a37f0000488b5d08909090ff13ff7108488b48084889c89090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@19070|28,0,@2260 11013:D3,184|483b65187303ff5548a8017570488b08488b510848833a0f7417488b580848b868b021c9a37f0000488b5d08909090ff13498d5fe0483b5d107303ff55404989df48c743f803000000488b720848897310488b3948897b0848c70301000000534c8b40084c89c09090e892ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090909090900000000000000000b000000000000000|@1363,127,@19072|32,0,@11014 11014:O4|@20055,@557,@11016,@11015 11015:O5|@559,478,0,478,0 11016:S53|6d6b4d757475616c446563733a20526563757273697665206465636c61726174696f6e206973206e6f7420612066756e6374696f6e 11017:D5,632|483b65187303ff5548a8017564f6c3017564488b08488b5118488b32488b7e104c8b1749833a0574144c8b580848b8b8b321c9a37f0000488b5d08ff1341514150ff7308ff700841ff721041ff7208ff7110ff7108ff3348c7c0030000004c89c2909090ff12488b0c24f6c1017414eb0ae9e4010000e9df0100004883f9017c08eb1af641ff1074144889c248b8f0a115c9a37f0000488b5d0890ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70205000000488d4a1848c741f8020000004889510848c701090000004889c34889ce48b810b421c9a37f00004883c40890ff159e010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420858488902498d47b0483b45107303ff55404989c748c740f80200000048895008488908488d481848c741f80200000048894108488931488d411848c740f80300000048c74010010000004889480848c7001d000000f6c101740b539090ff15ca000000eb0153488b4c2408488b1424488911488b4c2410488b5c2430488919498d4fd8483b4d107303ff55404989cf48c741f804000000488941184889511048c741080100000048c70103000000514989d94c8b442430488b5c2428488b44242090e8cefdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c438488908c348c7c001000000c390909090909000000000000000007002000000000000|@3457,1048575,@19073,@2166,@2211|47,0,@11018 142,0,@6844 223,0,@11020 276,0,@8205 11018:O4|101,@1386,0,@11019 11019:O5|@1308,509,0,509,0 11020:O2|@442,@11021 11021:O2|@8204,@651 11022:D4,176|483b65187303ff5548a8017572488b0841524151415053ff7008415041514152ff7424484989da4c8b49184c8b4110488b5908488b019090ff158a00000050ff7424384c8b5424304c8b4c24284c8b442420488b5c2418488b44241090e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90f00000048894808594883c428488908c2080048c7c001000000c208009090900000000000000000a800000000000000|@1363,2097151,@19075,@11023| 11023:D9,656|483b65187303ff5548498b01488b4810488b510848833a037506488b5a10eb3c48833a017506488b5a08eb3048c7c301000000488b720840f6c601751ff6c30174064883c3027105ff5570ebf5488b7608483b65187303ff5548ebdb4983fa01741e514c89c84c8b4c24284c8b442418488b5c2420909090ff152a020000eb684883fb017507488b442408eb604889ce48c7c00100000090ff151202000056504889d948bb08b821c9a37f00004889c8ff1502020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c7412803000000eb0ae952000000e94c00000048894120584889411848c741100100000048b860b821c9a37f000048894108488b442410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000eb01515950488b5c2420488b01909090ff156e01000048833805751849c7c00100000048c7c3030000009090ff155a010000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b980d606c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f802000000488951084889014889c8909090ff15b2000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c2200090909000000000000000008802000000000000|@11029,2097151,@19076,@11030,@2259,@1354,@11028,@2178,@2166|165,0,@11024 261,0,@11026 488,0,@509 576,0,@11027 11024:O1|@11025 11025:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19074|2,0,@441 11026:S18|7072696e742d7072696e7464656661756c74 11027:O3|2,I255,0 11028:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19098,@2178|263,0,@2173 11029:S52|545950454944434f444528292e637265617465446174617479706546756e6374696f6e732835297365745072696e746572283429 11030:D43,4920|483b65187303ff5548488b08498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77e0483b75107303ff55404989f748c746f80300000048bff0ce21c9a37f000048893e48895608488b7b0848897e10488066ffbf4c8b1341f6c20174064983c2027105ff5570ebf54d8d5fe04c3b5d107303ff55404d89df49c743f80300000049895310498973084d8913488b71104c8b660849833c240375074d8b6c2410eb4049833c240175074d8b6c2408eb3249c7c5010000004d8b74240841f6c601752041f6c50174064983c5027105ff5570ebf54d8b7608483b65187303ff5548ebdaff314155524151ff70084150415341525748bb78d021c9a37f00004c89e8ff153a1200006a016a0148837c24480175194889e1488b5424204889114889e1488b54242848895108eb6e498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d8483b55107303ff55404989d748c742f80400000048bb50d121c9a37f000048891a48894a08488b5c244048895a10488b74241048897218488062ffbf488b74241840f6c601eb05e94c01000074064883c6027105ff5570ebf5498d7fe0483b7d107303ff55404989ff48c747f80300000048894f10488957084889376a016a0150574c8d4c24104c8b4424404889fb909090ff155e110000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70003000000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0d321c9a37f000048891148894108488061ffbf498d47e8483b45107303ff55404989c748c740f802000000488b5424104889500848c70003000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fd8483b5d107303ff55404989df48c743f8040000004889431848894b10488b44244048894308488913498d47e8483b45107303ff55404989c748c740f802000000488b4c244848894808488918488d4c24205a488911488d4c241848894108eb056a016a015048b8c0d421c9a37f0000909090ff154e100000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba90d706c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889089090ff15f20f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba18d706c9a37f0000488951104889410848c701070000004889cb48b8d8d421c9a37f0000ff15ae0f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba90d706c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889089090ff15520f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba18d706c9a37f0000488951104889410848c701070000004889ce48b818d521c9a37f0000ff150e0f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad0d506c9a37f0000488951104889410848c701070000004889cf48b868d521c9a37f0000ff15ca0e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad0d506c9a37f0000488951104889410848c701070000004989c848b880d521c9a37f0000ff15860e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad0d506c9a37f0000488951104889410848c70107000000498d47d8483b45107303ff55404989c748c740f8040000004889481848b958cd06c9a37f0000488948104c89400848c70003000000498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b858cd06c9a37f0000488941104889790848c70103000000498d47e0483b45107303ff55404989c748c740f8030000004889481048b9d0d521c9a37f00004889480848c70015000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba80d606c9a37f0000488951184889411048b860d621c9a37f00004889410848c70103000000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908ff15520d0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba18d706c9a37f0000488951104889410848c70107000000498d47d8483b45107303ff55404989c748c740f80400000048ba80d606c9a37f000048895018488948104889700848c70003000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba80d606c9a37f000048895118488941104889590848c7010300000048b8b0d621c9a37f0000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174145148b8c8d621c9a37f000090ff15660c0000eb0b48b8c8d621c9a37f00005148b9e8d621c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174155048b818d721c9a37f00009090ff150e0c0000eb0e4889c148b818d721c9a37f00005148b9e8d621c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b850d721c9a37f0000909090ff15b20b0000eb0e4889c148b850d721c9a37f00005148b970d721c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b8c0d721c9a37f0000909090ff15560b0000eb0e4889c148b8c0d721c9a37f000051498d4fe8483b4d107303ff55404989cf48c741f80200000048ba98f006c9a37f000048895108488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017406ff15be0a0000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15260a0000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b910cd06c9a37f0000488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a801740e4889c8909090ff15ae090000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff150e090000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff156e080000eb034889c8498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b858cd06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9500107c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740790ff154e070000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba10cd06c9a37f00004889511848894110584889410848c70103000000498d47e0483b45107303ff55404989c748c740f8030000004889481048b9e0d721c9a37f00004889480848c70015000000498d4fd8483b4d107303ff55404989cf48c741f80400000048ba10cd06c9a37f0000488951184889411048b8d89b17c9a37f00004889410848c701030000004889cb48c7c0010000009090ff159e060000505348bb20d821c9a37f000048c7c003000000909090ff158a060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300500000048c741280300000048894120488b4424084889411848c741100100000048b878d821c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000ff742420504c8b5424604c8b4c24104c8b442428488b5c2478488b4424589090ff15ee05000048837c24600175674989c2488b5c246848b8c0a209c9a37f0000ff15d6050000488b4c2418488b4910488b0948c7c201000000f6c1017541488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b6518730aeb05e902010000ff5548ebba4889d14889c34889c8ff1576050000483b1d770500007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15320500005053415248bb98d821c9a37f000048c7c00300000090ff151e050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c470c3f64424200174164889c148b808c009c9a37f0000488b5d08909090ff13488b4c2420488b09488b09488b094889c34889c8909090ff156e04000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84989da4989c3488b5c246848b8c0a209c9a37f0000909090ff1516040000488b4c2418488b4910488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15ba030000483b1dbb0300007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff157603000041524153505348bbf0d821c9a37f000048c7c003000000909090ff155e030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c7411001000000584883c40848894108488b442408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f00000048833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004989c2488b5c24784883c41048b8606107c9a37f00009090ff159a02000048bbf09f09c9a37f0000ff1592020000488b4c2458488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff153a020000483b1d3b0200007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15f60100005053415248bb48d921c9a37f0000488b442478909090ff15e2010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c470c39090909000000000000000003013000000000000|@11077,2097151,@19085,@1354,@11078,@2166,@2166,@2166,@2166,@2166,@2166,@2166,@2166,@2211,@2211,@2211,@2211,@2211,@2211,@2211,@2211,@2211,@2211,@2259,@1354,@11087,@100,@2258,I48,@2259,@1354,@11076,@100,@2258,I48,@2259,@1354,@100,@100,@2258,I48,@2259,@1354|73,0,@11031 261,0,@11032 376,0,@11035 567,0,@11036 769,0,@11038 820,0,@517 920,0,@513 948,0,@11039 996,0,@517 1096,0,@513 1124,0,@11041 1172,0,@502 1200,0,@11044 1248,0,@502 1276,0,@11045 1324,0,@502 1377,0,@442 1430,0,@442 1483,0,@11048 1528,0,@509 1546,0,@11052 1640,0,@513 1689,0,@509 1742,0,@509 1771,0,@11054 1835,0,@11055 1854,0,@11055 1865,0,@11056 1930,0,@11058 1953,0,@11058 1964,0,@11056 2029,0,@11060 2053,0,@11060 2064,0,@11061 2129,0,@11064 2153,0,@11064 2188,0,@651 2524,0,@439 2988,0,@509 3029,0,@442 3070,0,@775 3111,0,@509 3252,0,@439 3310,0,@11065 3355,0,@439 3373,0,@7733 3414,0,@11067 3509,0,@11069 3620,0,@2583 3757,0,I48 3799,0,@971 3828,0,@11070 3988,0,@2630 4113,0,@2583 4249,0,I48 4291,0,@971 4322,0,@11072 4534,0,@1275 4552,0,@2577 4681,0,I48 4723,0,@971 4752,0,@11074 11031:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19077,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11032:O1|@11033 11033:D3,96|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c74008f1700200488908c300000000000000005800000000000000|@11034,3,@19078|30,0,@573 11034:S46|545950454944434f444528292e7072696e746572466f72446174617479706528332961726754797065732d283129 11035:D5,616|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e5feb06f641ff10755cf6c10174064883e9027105ff5570ebf5f6c10174084883f9017c08eb20f641ff10741a488b5810488b3048b8701e09c9a37f0000488b5d08909090ff13f6c10174084883f9017e6ceb06f641ff107564f6c1017412eb0ae90b010000e9060100004883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a184889ca9090ff12488b0c24488b59109090ff1582010000eb624883781001744b488b08f6c10174084883f9017c08eb16f641ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c70001000000eb4e488b08f6c101740d4883f9017c0deb1be93a000000f641ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000500000052488b0c24488b59084883c408ff25d50000004883781001744b488b10f6c20174084883fa017c08eb17f642ff10741148b8001f09c9a37f0000488b5d0890ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000006002000000000000|@2227,1048575,@19079,@2226,@2226|41,0,@2221 120,0,@2221 287,0,@2224 367,0,@2224 466,0,@2224 541,0,@2224 11036:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@11037,15,@19080| 11037:S81|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b41646472283129 11038:O2|@6867,0 11039:O2|@11040,0 11040:O4|6,@6867,1,1 11041:O2|@7755,@11042 11042:O2|@11043,0 11043:O3|2,40,0 11044:O2|@7755,@2550 11045:O2|@7755,@11046 11046:O2|@11047,0 11047:O3|2,91,0 11048:O2|@11049,0 11049:O4|1,0,1,@11050 11050:O4|6,@11051,1,1 11051:O4|6,@6867,0,1 11052:O4|13,3,@11053,4 11053:O4|6,@11051,0,0 11054:O2|@775,@11042 11055:O3|14,@11054,1 11056:O2|@442,@11057 11057:O2|@509,@651 11058:O3|14,@11059,1 11059:O2|@442,@11057 11060:O3|14,@11056,1 11061:O2|@775,@11062 11062:O2|@11063,0 11063:O3|2,41,0 11064:O3|14,@11061,1 11065:O2|@11066,0 11066:O4|1,0,0,@7781 11067:O1|@11068 11068:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19081|2,0,@441 11069:S12|706172656e74686573697365 11070:O1|@11071 11071:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19082|2,0,@441 11072:O1|@11073 11073:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19083|2,0,@441 11074:O1|@11075 11075:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19084|2,0,@441 11076:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@19097| 11077:S34|545950454944434f444528292e7072696e746572466f724461746174797065283329 11078:D7,192|483b65187303ff554848c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc41514150535048bb68db21c9a37f00004889c89090ff15860000004889c6488b5c24104889f0909090ff157a0000004989f14889c35848bab09b09c9a37f000090ff156a000000504c8b442410488b5c24084c89c8ff155e000000488b4c24185a4883c4104889114889410848c7c0010000004883c408c3900000000000000000b800000000000000|@11083,1048575,@19087,@1354,@11084,@2561,@11082|63,0,@11079 111,0,@2560 11079:O1|@11080 11080:D3,24|c39090909090909000000000000000001000000000000000|@11081,1,@19086| 11081:S97|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d617028332961726741646472732d283129 11082:D3,232|483b65187303ff5548a801756f488b0bf6c101740b41f600017405492b087105ff5570ebf64883c101488b5008488b30498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848893041505352488b530890ff12498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e9490000004889410848c70109000000514c8b442418488b5c2410488b44240890e85effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c39090909090900000000000000000e000000000000000|@1363,1048575,@19090| 11083:S85|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329 11084:D3,144|483b65187303ff5548a8017569498d4fe0483b4d107303ff55404989cf48c741f80300000048ba60de21c9a37f0000488911488b104889510848895910488061ffbf51488b50084889d0909090e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008800000000000000|@1363,15,@19089|39,0,@11085 11085:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11086,1048575,@19088| 11086:S96|545950454944434f444528292e7072696e746572466f7244617461747970652833296e6577547970655661724d61707c696e6e65724c6576656c7c6c6f63616c4172674c6973742d6d6b54634172674d6170283329617267732d283129283129 11087:D25,2656|483b65187303ff5548a8017509488b08f6410801746e4d89cb4d89c44989dd4989c64c89eb48b8c8ea21c9a37f000090ff15420a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048bae8ea21c9a37f0000488951184889411048b818df06c9a37f00004889410848b898b419f1a37f00004889014889c8488b5d08eb05e9040000009090ff13488b510841524151415053ff7008ff7118ff32ff31ff71204c89c3488b4110ff15ce0900005948c7c201000000f6c101756c488b1948833b017568498d57e8483b55107303ff55404989d748c742f802000000488b73084889720848c70201000000f6c20174154889c748b8f86f07c9a37f0000488b5d089090ff13498d7fe8483b7d107303ff55404989ff48c747f80200000048c7470801000000eb0ae925000000e905000000488917eb034889d74889fa488b59084889d9483b65187303ff5548e965ffffff4889d1498d57e0483b55107303ff55404989d748c742f80300000048c74210010000005b48895a0848c70205000000498d5fd0483b5d107303ff55404989df48c743f80200000048c7430801000000488913488d531848c742f80200000048895a0848bb500107c9a37f000048891a498d5fe0483b5d107303ff55404989df48c743f80300000048c74310030000004889530848c7031d000000f6c2017524488b3248833e057512488b72084889f2483b65187303ff5548ebe048c7c201000000eb0748c7c2030000004883fa01740f50514889d89090ff1556080000eb084889c24889d85251498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c89090ff1526080000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70105000000498d57b8483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f80200000048895008488908488d481848c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017406ff15f606000048837c24080175724989c0488b4424309090ff15e6060000488b4c241048833905750a488b511048833a0b74164889c248b878a221c9a37f0000488b5d08909090ff134c8b49084989c2488b4208ff15b20600004c89d3909090ff15ae060000498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e93504000048ba18eb21c9a37f000048891148894108488061ffbf6a016a0141504c8d4424084889cb4c89c8ff156a060000488b44241848833805751749c7c00100000048c7c30500000090ff1552060000eb38498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c7401005000000488b4c24184889480848c7000d0000004889c348b8d0eb21c9a37f0000909090ff150a060000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c7010700000048b8d09709c9a37f0000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174145148b8e8eb21c9a37f000090ff1592050000eb0b48b8e8eb21c9a37f000051504c8b442478488b5c2450488b442418488b542460ff124889c348b8f0b709c9a37f000090ff1562050000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba08b809c9a37f0000488951104889410848c70107000000498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f80200000048894108488b442408488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c101740a5390ff15be040000eb0153498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c890ff1596040000498d4fc0483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f80200000048c7400801000000488908909090ff154e040000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b542470488951104889410848c70107000000488d412848c740f80200000048c7400801000000488908488d481848c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908909090ff15c6030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b980d606c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b880d606c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff15aa020000f644241801756d488b0c2448833905751d5049c7c00100000048c7c3010000004889c8909090ff1586020000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d000000524889c348b8d0eb21c9a37f0000eb05e99700000090ff153a020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c7010700000051ff742460ff7424604c8b5424584c8b4c24504c8b442448488b5c2440488b4424389090e8d2f6ffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c240848894810594883c4084889480848c7000300000048b920ec21c9a37f0000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174165048b870ec21c9a37f0000909090ff155e010000eb0e4889c148b870ec21c9a37f0000514889c348b8f0b709c9a37f000090ff1542010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba28b909c9a37f0000488951104889410848c70107000000498d47d8483b45107303ff55404989c748c740f8040000005a4883c44048895018488958104889480848c70003000000c210009090909090900000000000000000580a000000000000|@11099,2097151,@19092,@100,@11100,@2211,@11101,@2211,@11102,@11007,@1699,@1382,@2178,@2166,@2211,@2166,@2211,@2166,@2166,@11098,@2211,@2178,@2166,@2211,@2166|39,0,@11088 80,0,@11089 98,0,@557 112,0,@20055 249,0,@1294 441,0,@775 734,0,@509 775,0,@509 816,0,@509 980,0,@10998 1059,0,@11090 1197,0,@11091 1263,0,@2541 1327,0,@11092 1346,0,@11092 1383,0,@2610 1432,0,@2611 1895,0,@509 1936,0,@509 1977,0,@442 2018,0,@509 2240,0,@11091 2408,0,@11094 2473,0,@11097 2497,0,@11097 2511,0,@2610 2560,0,@2621 11088:S16|4e6f20636f6e7374727563746f72733a 11089:O5|@2176,1063,0,1063,0 11090:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@11002,63,@19091| 11091:O2|@679,0 11092:O3|14,@11093,1 11093:O2|@442,@2542 11094:O2|@775,@11095 11095:O2|@11096,0 11096:O3|2,@820,0 11097:O3|14,@11094,1 11098:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c348b880d606c9a37f0000c30000000000000000d800000000000000|@1696,1048575,@19096,@2211|199,0,@509 11099:S59|545950454944434f444528292e7072696e746572466f7244617461747970652833297072696e746572466f72436f6e7374727563746f7273283129 11100:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19093,@2178|263,0,@2173 11101:D4,224|483b65187303ff5548a8017571ff30488b40089090e8e6ffffff498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e942000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff25370000004889c8c348b880d606c9a37f0000c30000000000000000d800000000000000|@1696,1048575,@19094,@2211|199,0,@509 11102:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@19095| 11103:O1|@11104 11104:D3,64|488b4808488b10498d47e8483b45107303ff55404989c748c740f802000000488b492048894808488910c3909090909000000000000000003800000000000000|@11105,7,@19100| 11105:S57|434f444547454e5f50415253455452454528292e636f646553657175656e63652834296e657744656275677c6c6f63616c446563732d283129 11106:D5,280|483b65187303ff5548488b4a2852ff7008ff30ff71284c8b51104c8b094c8b4108488b5920488b4220909090ff15fe000000488338017506488b0c24eb19488b7008488b18488b0424909090ff15e60000004889c1eb04488b7008488b4424084883c408498d57b8483b55107303ff55404989d748c742f808000000488b58384883c40848895a38488b783048897a304c8b40284c89422848897220488b7018488972184c8b48104c894a104c8b50084c8952084c8b184c891a6a016a014c8b6424104989e24d8b4c24184989d04889cb498b442410498b54240890ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c410488908c300000000000000001001000000000000|@11108,2097151,@19101,@11109,@11107| 11107:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19170| 11108:S49|434f444547454e5f50415253455452454528292e636f646553657175656e636528342970726f636573735461696c283129 11109:D9,568|483b65187303ff5548498b4968f6c101753e488b11488b32483b3531020000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01756948b998c809c9a37f0000f6c101753e488b11488b32483b35df010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751a4889c148b8c0cf09c9a37f0000eb05e933000000488b5d08ff13488b0f488b11483b158201000074154889c648b878e107c9a37f0000488b5d089090ff1348837910017466eb2a488b0f488b11483b155d01000074144889c648b878e107c9a37f0000488b5d0890ff1348837910017466498d77e8483b75107303ff55404989f748c746f80200000048895e0848c706010000006a016a01415241504151a801753fff7008ff742418eb05e9970000004c8b5424104c8b4c24404c8b4424184889f3488b00ff15ee0000004889c658483b6518730aeb05e96b000000ff5548ebbd488d442418488b0e488908488d442418488b5608488950086a016a014989e24c8b4c24204c8b442418488b5c2430488b44242890ff15a6000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c430488908c20800498d47e8483b45107303ff55404989c748c740f8020000004889580848c70001000000c208009090909000000000000000003002000000000000|@11113,2097151,@19102,@20135,@20135,@20135,@20135,@11114,@11110|95,0,@2635 188,0,@2690 229,0,@1486 274,0,@1486 11110:D8,1024|483b65187303ff55484889c648c7c00100000090ff15fe030000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad8fa21c9a37f0000488951104889410848c70107000000415253564150ff33ff73105148c7c0030000004c89ca909090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57c8483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f80300000048c74110010000005b4889590848c70105000000488b5c2408488b3340f6c601740af603017405482b337105ff5570ebf64883c6014889c7498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897008488938525751488b530890ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b840f506c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff155e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000500000050488b442420488b542418909090ff12488b4c2420488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b54240848891053488b51089090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8f8fa21c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff1516010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47b8483b45107303ff55404989c748c740f8020000004889480848c70005000000488d481848c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c4084889084883f8017506488b0424eb0d4889c3488b0424ff157a0000004883f8017507488b442418eb0f4889c3488b44241890ff1566000000488b4c24284883c420488901584889410848c7c0010000004883c408c3900000000000000000f803000000000000|@11330,1048575,@19167,@2166,@2166,@2166,@11331,@11329|60,0,@11111 399,0,@686 484,0,@11027 735,0,@11112 820,0,@11027 11111:O3|2,I72,0 11112:O3|2,7,0 11113:S34|44454255474745525f28292e6d616b6556616c4465627567456e7472696573283629 11114:D7,872|483b65187303ff5548488b4b08ff7108ff7110ff33504150ff31ff35600300004c89ca49c7c1010000004989d0488b5c241048ba00ff21c9a37f0000ff154603000050488b442410488b542408909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff159a020000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba487322c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb725048c7c003000000488b54244890ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048bab87322c9a37f000048891148894108488b54241848895110488061ffbf498d57c0483b55107303ff55404989d748c742f8040000005b48895a184889421048c7420801000000eb05e92b00000048c70203000000488d422848c740f80200000048c74008010000004889104889e24889024889e048894808488b442418f6400801755a488b4808498d57b8483b55107303ff55404989d748c742f805000000488b582048895a20488b710848897218488b3948897a104c8b40184c8942084c8b084c890a4c8d523049c742f8020000004989520849c7020d000000eb69488378080175384d8d57d84c3b55107303ff55404d89d749c742f804000000488b482049894a18488b501849895210488b1849895a0849c70203000000eb3d4d8d57d84c3b55107303ff55404d89d749c742f804000000488b482049894a18488b501849895210eb05e90e000000488b1849895a0849c7020f00000048833c24017507488b442420eb0f488b1c24488b442420ff15b2000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424284883c408488951084c8911498d57c8483b55107303ff55404989d748c742f80300000048894a10488b4c242848894a08594883c42848890a4889c1488d422048c740f80200000048895008488908c208009090909000000000000000006003000000000000|@11328,2097151,@19165,@8345,@11117,@2211,@11327|52,0,@11115 287,0,@11323 368,0,@11325 11115:O2|@11117,@11116 11116:O2|@11265,@11115 11117:D95,8368|483b65187303ff5548488b481048833907756b488b710848bf5aff21c9a37f0000488d7cb7fcffe79090e943000000909090e9f4010000909090e933000000909090e9d90e0000909090e9de0e0000909090e9c4100000909090e913000000909090e96c140000909090e903000000909090498d77f0483b7510730aeb05e9a41c0000ff55404989f748c746f801000000c646ff4048c70601000000498d7fe0483b7d107303ff55404989ff48c747f80300000049bbe82222c9a37f00004c891f488977084c8b5b084c895f10488067ffbf4c8b2341f6c40174064983c4027105ff5570ebf54d8d6fe04c3b6d107303ff55404d89ef49c745f8030000004989751049897d084d896500564152ff7424184d89ca4d89c14d89e848bb10cd06c9a37f0000488b5208ff1259488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15421f00009090ff15421f0000505348bb702422c9a37f000048c7c003000000909090ff152e1f0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080041f6c101756e41f6410801750b498b510848837a0801741248b8c82422c9a37f0000488b5d089090ff13488b32498b394d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049bb30e306c9a37f00004d89184d8d5fe04c3b5d107303ff55404d89df49c743f803000000eb05e9d30b000049c74310f17002004d89430849c7030d0000004152534153ff36ff37488b0424ff15161e0000a8017560488b0850ff710848bb902522c9a37f0000488b411090ff15fe1d0000a801756448837808017562498d4fe8483b4d107303ff55404989cf48c741f80200000048ba682622c9a37f000048895108488b104889115048c7c3030000004889c8eb05e93502000090ff15b61d00004889c34889d8ff15b21d0000498d4fa0483b4d10730feb0ae9db000000e95e000000ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000488d482048c741f803000000488b542428488951104889410848c70105000000eb7350488b5c2428ff153a1d000048c7c303000000909090ff15321d00004889c34889d8ff152e1d0000498d4fc0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c701010000004889c8488d492048c741f803000000488941104889590848c70107000000eb10e90b00000048b9703007c9a37f000050498d47e0483b45107303ff55404989c748c740f803000000488b54242848895010488b5c24184889580848c70005000000498d5f80483b5d107303ff55404989df48c743f80300000048894310488b4424204889430848c70305000000488b442408488d732048c746f802000000488b7c244848897e0848c706010000004c8d461849c740f80200000049c7400801000000498930498d701848c746f8050000004c89462048894618488b0048894610584883c4084889460848c7060b000000498d47c0483b45107303ff55404989c748c740f803000000488950104889700848c70005000000488d502048c742f8030000004889421048894a0848c70205000000ff35d31b00004989fa4c8b4c243049b8802622c9a37f00004889d84889d3909090ff15ba1b0000eb0b4889c148c7c0010000005148833c2401751148b8a02622c9a37f00004883c430c20800488b0424488b084883791001756d488b1948b8002822c9a37f00009090ff157a1b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba804507c9a37f0000488951104889410848c701070000004889ce48b898f006c9a37f0000ff15361b0000498d4fd8483b4d10730aeb05e91b010000ff55404989cf48c741f80400000048c7411803000000488971104889410848c701070000004889ce48b8582822c9a37f0000909090ff15f21a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c701070000004889ce48b8982822c9a37f00009090ff15b61a000053505648bbb02822c9a37f000048c7c0030000009090ff15a21a0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8082922c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000eb5e4883791003745cff31ff711048bb202922c9a37f0000488b0424ff150a1a0000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017530488b1048833a05751e488b5008eb0ae9c7020000e95a0000004889d0483b65187303ff5548ebd548c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff159a190000eb034889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488901eb13488b01488b511048b9482a22c9a37f000050524889cb48b8002822c9a37f0000ff1552190000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba804507c9a37f0000488951104889410848c701070000004889ce4889d8909090ff1512190000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c701070000004889cb48b8582822c9a37f00009090ff15d6180000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c701070000005148bba02a22c9a37f0000488b442408909090ff1596180000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8804507c9a37f00004889014889c89090ff156a1800005048bb482b22c9a37f000048c7c003000000ff155a180000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120584889411848c741100100000048b8a02b22c9a37f00004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c348b8982822c9a37f0000909090ff15d6170000505348bbb82b22c9a37f0000488b44241090ff15c6170000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8082922c9a37f000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b4c2428498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000488b19f6c30174064883c3027105ff5570ebf55e488b3e48833f09756b5250ff77084989d14c8b4108488b4710909090ff15f216000048833805751449c7c001000000488b1c2490ff15e2160000eb594889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d000000eb6448833f0575634c8b47084d8b004c8b4f104d8b09f6c301741241f60101740ceb05e94a010000492b197105ff5570ebf64883c301f6c30174084883fb017c08eb1cf643ff1074164989c148b8701e09c9a37f0000488b5d08909090ff13f6c3017414eb0ae907010000e9db0000004883fb017e5ceb06f643ff107554f6c30174064883eb027105ff5570ebf54989c1498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084c8900524151488b5108909090ff12488b5c240890ff15e2150000eb5141f6c00174084983f8017c09eb1b41f640ff1074144889c148b8001f09c9a37f0000488b5d0890ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004c89400848c7000500000052514889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000eb2548833f0374164889c148b8102c22c9a37f0000488b5d08909090ff134889c1488b470852516a0148833805751649c7c00100000048c7c303000000ff152e150000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004883c4085a488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b980d606c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f802000000488951084889014889c8909090ff1582140000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c7010700000058488b0048c7c201000000a801753a488b18498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b58084889d8483b65187303ff5548ebc24889d04889cb9090ff15fa1300009090ff15fa130000505348bb682c22c9a37f000048c7c003000000909090ff15e6130000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8c02c22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c430c2080048c7c0010000009090ff155a1300005048bbd82c22c9a37f000048c7c003000000ff154a130000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120584889411848c741100100000048b8302d22c9a37f00004889410848b8502d22c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080048b8282e22c9a37f0000c2080041f6c10175364983790801741348b8882f22c9a37f0000488b5d08909090ff134d8b09498b0148baf87a09c9a37f0000594883c40851ff2587120000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77e0483b75107303ff55404989f748c746f80300000048bf203022c9a37f000048893e48895608488b7b0848897e10488066ffbf4c8b0b41f6c10174064983c1027105ff5570ebf54d8d57e04c3b55107303ff55404d89d749c742f80300000049895210498972084d890a524c89d348b8d09507c9a37f000048baf87a09c9a37f0000909090ff15de11000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff158a1100009090ff158a110000505348bba83122c9a37f000048c7c003000000909090ff1576110000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8003222c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080041f6c101756d4983790801741148b8203222c9a37f0000488b5d0890ff134d8b09498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77e0483b75107303ff55404989f748c746f80300000048bfb83222c9a37f000048893e48895608488b7b08eb05e9ec01000048897e10488066ffbf4c8b1341f6c20174064983c2027105ff5570ebf54d8d5fe04c3b5d107303ff55404d89df49c743f80300000049895310498973084d8913524c89db498b0148baf87a09c9a37f0000ff152e1000004889c348b8403422c9a37f000090ff1522100000498d4fc0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f80200000048c7400801000000488908ff15de0f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bac83422c9a37f0000488951104889410848c7010700000058488b0048c7c201000000a801753a488b18498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b58084889d8483b65187303ff5548ebc24889d04889cb9090ff15560f00009090ff15560f0000505348bb703922c9a37f000048c7c003000000909090ff15420f0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8c83922c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080048c7c0010000009090ff15ba0e00005048bbe83922c9a37f000048c7c003000000ff15aa0e0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120584889411848c741100100000048b8c83922c9a37f00004889410848b8403a22c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c348c7c00100000090ff15220e0000505348bb603a22c9a37f000048c7c003000000909090ff150e0e0000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8b83a22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080041f6c101755f4983790801741148b8d83a22c9a37f0000488b5d0890ff134d8b09498b5268f6c2017545488b32488b3e483b3d5e0d0000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb204c8b5a084c89da483b6518730aeb05e92a050000ff5548ebb649c7c3010000004983fb01756a48ba98c809c9a37f0000f6c201753e488b32488b3e483b3d050d0000751d4d8d5ff04c3b5d107303ff55404d89df49c743f801000000498933eb194c8b5a084c89da483b65187303ff5548ebbd49c7c3010000004983fb01751848b8c0cf09c9a37f0000488b5d08eb05e92900000090ff13498b13488b32483b35aa0c0000741148b878e107c9a37f0000488b5d0890ff13488b7a10eb26498b13488b32483b358c0c0000741348b878e107c9a37f0000488b5d08909090ff13488b7a104d8b526841f6c201753f4d8b224d8b2c244c3b2d630c0000751d4d8d77f04c3b75107303ff55404d89f749c746f8010000004d8926eb194d8b72084d89f2483b65187303ff5548ebbb49c7c6010000004983fe01750c49ba683b22c9a37f0000eb294d8b164d8b224c3b25140c0000741348b878e107c9a37f0000488b5d08909090ff134d8b62104d89e24d8d67f04c3b65107303ff55404d89e749c74424f80100000041c64424ff4049c70424010000004d8d6fe04c3b6d107303ff55404d89ef49c745f80300000049beb83b22c9a37f00004d8975004d8965084c8b73084d897510498065ffbf488b03a80174064883c0027105ff5570ebf5498d4fc0483b4d107303ff55404989cf48c741f8030000004c8961104c896908488901488d412048c740f80300000048c74010010000004c89500848c70005000000415450574889cb498b0148baf87a09c9a37f00009090ff15320b0000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c701050000004889c34889ce48b898f006c9a37f00009090ff15f60a0000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411803000000488971104889410848c70107000000488d412848c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b810cd06c9a37f0000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c101740b539090ff15620a0000eb0153498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c890ff153a0a0000498d4fc0483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f80200000048c7400801000000488908909090ff15f2090000498d4fa8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f8020000004889480848c70005000000488d481848c741f80200000048c74108010000004889014883f901750c48b810cd06c9a37f0000eb31498d47e0483b45107303ff55404989c748c740f80300000048ba10cd06c9a37f0000488950104889480848c7001500000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c89090ff15fe0800009090ff15fe080000505348bb403d22c9a37f000048c7c003000000909090ff15ea080000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8983d22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c208004d8b526841f6c201753e498b12488b1a483b1d5a080000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19498b72084989f2483b65187303ff5548ebbc48c7c6010000004883fe01750c48bab03d22c9a37f0000eb28488b16488b1a483b1d0b080000741248b878e107c9a37f0000488b5d089090ff13488b5a104889da498d5fe0483b5d107303ff55404989df48c743f80300000048c74310010000004889530848c7030500000048b8003e22c9a37f0000909090ff15ba070000498d4fa8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f8020000004889480848c70005000000488d481848c741f80200000048c74108010000004889014883f901750c48b810cd06c9a37f0000eb31498d47e0483b45107303ff55404989c748c740f80300000048ba10cd06c9a37f0000488950104889480848c700150000004889c348c7c001000000ff1512070000505348bb183e22c9a37f000048c7c003000000909090ff15fe060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8983d22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c348c7c0010000009090ff1576060000505348bb703e22c9a37f000048c7c003000000909090ff1562060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8c83e22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c208004883390175144889c248b8e03e22c9a37f0000488b5d0890ff13488339097569ff7110ff7108ff35bd0500004883780801755bff7108488b4110909090ff15ae05000048833805751b49c7c001000000488b1c244883c420594883c40851ff25950500004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000eb0ae9e8000000e91a000000488b1424488950104889480848c7000d0000004883c420c208004883780803756dff7108488b41109090ff153e05000048833805751b49c7c001000000488b1c244883c420594883c40851ff25250500004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c420c20800f6400801752b48c7c001000000909090ff15da0400004989e148ba98f808c9a37f000090ff15ce0400004883c418c208004c89c8ff15c60400004989e148ba98f808c9a37f000090ff15ba0400004883c418c20800488339057566488b5108488b12488b7110488b365652ff359f0400004883780801756f488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308eb05e90f0100009090ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9120000004889480848c700090000004883c418c2080048837808037571488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000eb05e9070000004883c418c20800f6400801752948c7c00100000090ff15820300004989e148ba98f808c9a37f000090ff15760300004883c418c208004c89c8ff156e0300004989e148ba98f808c9a37f000090ff15620300004883c418c20800ff7108ff355a0300004883780801750b488b41084883c410c208004883780803750b488b41084883c410c20800f6400801752948c7c00100000090ff152a0300004989e148ba98f808c9a37f000090ff151e0300004883c410c208004c89c8ff15160300004989e148ba98f808c9a37f000090ff150a0300004883c410c208009090900000000000000000a820000000000000|@11240,2097151,@19131,@2258,@2259,@1354,@11241,@1354,@8016,@8522,@11244,@8016,@8522,@11245,@11250,@2166,@2166,@2166,@2259,@1354,@1354,@2211,@2166,@2166,@2166,@1354,@2259,@1354,@2259,@1354,@11257,@2178,@2226,@2178,@2166,@2258,@2259,@1354,@2259,@1354,@2531,@2531,@2258,@2259,@1354,@2531,@2166,@2166,@2258,@2259,@1354,@2259,@1354,@11012,@1354,@20132,@20132,@20132,@20132,@20194,@20194,@2531,@2166,@2211,@2166,@2166,@2258,@2259,@1354,@20194,@20194,@2166,@2259,@1354,@2259,@1354,@11259,@11261,@2178,@11262,@2178,@7332,@2165,@7332,@2165,@11263,@7332,@2165,@7332,@2165,@11239,@7332,@2165,@7332,@2165|25,0,$11117+42 182,0,@11118 284,0,@439 402,0,@11119 497,0,@971 581,0,@11121 634,0,@573 727,0,@11125 783,0,@11128 1076,0,@923 1359,0,@11129 1404,0,@11130 1438,0,@11137 1488,0,@1076 1516,0,@651 1589,0,@11140 1658,0,@11142 1679,0,@11143 1773,0,@11145 1844,0,@11146 2033,0,@11149 2048,0,@11137 2096,0,@1076 2186,0,@11140 2252,0,@11152 2304,0,@1076 2329,0,@11154 2417,0,@11156 2473,0,@11142 2494,0,@11157 2585,0,@11145 2892,0,@2221 3050,0,@2224 3156,0,@11159 3336,0,@509 3424,0,@11027 3546,0,@11161 3641,0,@11163 3721,0,@11164 3809,0,@11166 3823,0,@11167 3874,0,@11172 3900,0,@11179 3925,0,@2530 4006,0,@11182 4095,0,@1394 4105,0,@2530 4226,0,@11183 4321,0,@11185 4394,0,@11186 4473,0,@11189 4572,0,@2530 4591,0,@11190 4716,0,@11195 4838,0,@11210 4933,0,@11212 5009,0,@11213 5097,0,@11212 5111,0,@11215 5178,0,@11216 5273,0,@11218 5346,0,@11219 5457,0,@2635 5547,0,@2690 5586,0,@1486 5624,0,@1486 5733,0,@11222 5760,0,@1486 5849,0,@11224 5974,0,@2530 6042,0,@651 6146,0,@439 6444,0,@439 6480,0,@439 6606,0,@11225 6701,0,@11227 6846,0,@11228 6873,0,@1486 6941,0,@11230 7059,0,@439 7095,0,@439 7138,0,@11231 7233,0,@11227 7310,0,@11233 7405,0,@11235 7474,0,@11236 7779,0,@2163 7815,0,@2163 8163,0,@2163 8199,0,@2163 8291,0,@2163 8327,0,@2163 11118:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19103,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11119:O1|@11120 11120:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19104|2,0,@441 11121:O4|@20055,@557,@11123,@11122 11122:O5|@11124,1043,0,1043,0 11123:S42|4f7665726c6f6164656420416464507265747479202d2077726f6e6720696e7374616e63652074797065 11124:S32|6d6c736f757263652f4d4c436f6d70696c65722f56414c55455f4f50532e4d4c 11125:O1|@11126 11126:D3,104|498d47f0483b45107303ff55404989c748c740f801000000c640ff4048b930e306c9a37f00004889084889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010050000004889480848c7000d000000c300000000000000006000000000000000|@11127,3,@19105|30,0,@573 11127:S36|56414c55455f4f505328292e636f646556616c2836295f2d74797065566172732d283129 11128:O2|@468,0 11129:S14|6164645072657474795072696e74 11130:O3|2,@11131,0 11131:O1|@11132 11132:D3,40|48b8202722c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11136,1,@19106|2,0,@11133 11133:O4|103,@112,@11135,@11134 11134:O5|@11124,1039,0,1039,0 11135:S68|6164645072657474795072696e743a2054686520617267756d656e74207479706520776173206e6f7420612073696d706c65207479706520636f6e737472756374696f6e 11136:S25|56414c55455f4f505328292e636f646556616c283629283129 11137:O2|@11138,0 11138:O4|6,@11139,1,0 11139:O2|4,@440 11140:O2|@11141,0 11141:O4|6,@11139,0,0 11142:O2|@11139,0 11143:O1|@11144 11144:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19107|2,0,@441 11145:S7|61646450502d31 11146:O1|@11147 11147:D3,176|a80174064883c0027105ff5570ebf5a80174084883f8017c08eb1af640ff1074144889c148b8f0a115c9a37f0000488b5d0890ff13498d4fa8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f8020000004889480848c700090000004889c1488d401848c740f80400000048c740180100000048c74010030000004889480848c7000d000000c39090909090900000000000000000a800000000000000|@11148,3,@19108|38,0,@6844 11148:S44|56414c55455f4f505328292e636f646556616c2836297072696e7446756e6374696f6e2d617267732d283129 11149:O2|@11150,0 11150:O4|6,@11151,1,0 11151:O2|4,@8742 11152:O1|@11153 11153:D3,112|a80174084883f8017c08eb19f640ff1074134889c148b8f0a115c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c300000000000000006800000000000000|@7261,3,@19109|23,0,@6844 11154:O1|@11155 11155:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19110|2,0,@441 11156:S7|61646450502d32 11157:O1|@11158 11158:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19111|2,0,@441 11159:O4|@20055,@557,@2175,@11160 11160:O5|@11124,707,0,707,0 11161:O1|@11162 11162:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19112|2,0,@441 11163:S5|6164645050 11164:O1|@11165 11165:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19113|2,0,@441 11166:S12|416464507265747479285029 11167:O3|2,@11168,0 11168:O1|@11169 11169:D3,40|48b8d02d22c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11136,1,@19114|2,0,@11170 11170:O4|103,@112,@11135,@11171 11171:O5|@11124,909,0,909,0 11172:O3|2,@11173,0 11173:O1|@11174 11174:D3,40|48b8a82e22c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11178,1,@19115|2,0,@11175 11175:O4|103,@112,@11177,@11176 11176:O5|@11124,1049,0,1049,0 11177:S68|546865207370656369616c2066756e6374696f6e20506f6c794d4c2e736f757263654c6f636174696f6e2063616e6e6f74206265207573656420617320612076616c7565 11178:S31|56414c55455f4f505328292e636f646556616c2836296765744c6f63283129 11179:O4|@20055,@557,@11181,@11180 11180:O5|@11124,903,0,903,0 11181:S42|4f7665726c6f6164656420476574507265747479202d2077726f6e6720696e7374616e63652074797065 11182:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19116,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11183:O1|@11184 11184:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19117|2,0,@441 11185:S9|676574507265747479 11186:O4|@20055,@557,@11188,@11187 11187:O5|@11124,888,0,888,0 11188:S43|4f7665726c6f61646564204d616b65537472696e67202d2077726f6e6720696e7374616e63652074797065 11189:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19118,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11190:O2|@11191,0 11191:O3|14,@11192,0 11192:O2|@439,@11193 11193:O2|@11194,0 11194:O3|2,10000,0 11195:O3|2,@11196,0 11196:O1|@11197 11197:D7,448|483b65187303ff5548488b08f6c10175144889c248b8b8f309c9a37f0000488b5d0890ff134883f9017570488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90174164889c148b8003722c9a37f0000488b5d08909090ff13498d4fd8483b4d107303ff55404989cf48c741f804000000488b502048895118488b581848895910488b701048897108488b7808eb05e92000000048893948bbe83422c9a37f0000488b4118909090ff151e010000ff2520010000488b08f6c10175154889c248b8b8f309c9a37f0000488b5d089090ff134883f903756d488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90374164889c148b8883722c9a37f0000488b5d08909090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b501048895108488b580848891948bbe03722c9a37f0000eb05e919000000488b01ff158a00000048bae8ea17c9a37f0000ff2582000000488b08f6c10175134889c248b8b8f309c9a37f0000488b5d08ff134883f90774164889c148b8583822c9a37f0000488b5d08909090ff13488b4008c39090909090900000000000000000b801000000000000|@11209,1048575,@19120,@11208,@109,@1354,@7950|22,0,@2708 56,0,@2708 84,0,@11198 165,0,@11196 205,0,@2708 240,0,@2708 268,0,@11201 326,0,@11203 352,0,@7949 379,0,@2708 404,0,@11206 11198:O4|101,@1386,0,@11199 11199:O5|@11200,98,0,98,0 11200:S30|6d6c736f757263652f4d4c436f6d70696c65722f5072657474792e736d6c 11201:O4|101,@1386,0,@11202 11202:O5|@11200,108,0,108,0 11203:O1|@11204 11204:D3,24|48c7c041000000c300000000000000001000000000000000|@11205,1,@19119| 11205:S22|5072657474792e75676c795072696e74283129283129 11206:O4|101,@1386,0,@11207 11207:O5|@11200,118,0,118,0 11208:D3,112|483b65187303ff5548a801754553ff7008488b004889da90ff1250488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@19121| 11209:S19|5072657474792e75676c795072696e74283129 11210:O1|@11211 11211:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19122|2,0,@441 11212:S12|6d616b65737472696e672829 11213:O1|@11214 11214:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19123|2,0,@441 11215:O3|2,63,0 11216:O1|@11217 11217:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19124|2,0,@441 11218:S13|6d616b65737472696e67285029 11219:O4|@20055,@557,@11221,@11220 11220:O5|@11124,861,0,861,0 11221:S38|4f7665726c6f61646564205072696e74202d2077726f6e6720696e7374616e63652074797065 11222:O1|@11223 11223:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@19125| 11224:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19126,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11225:O1|@11226 11226:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19127|2,0,@441 11227:S7|7072696e742829 11228:O1|@11229 11229:D3,24|48c7c001000000c300000000000000001000000000000000|@2696,1,@19128| 11230:O2|@2526,0 11231:O1|@11232 11232:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19129|2,0,@441 11233:O1|@11234 11234:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19130|2,0,@441 11235:S8|7072696e74285029 11236:O4|@20055,@557,@11238,@11237 11237:O5|@11124,797,0,797,0 11238:S16|636f646556616c202d20466f726d616c 11239:D3,24|488b4208c390909000000000000000001000000000000000|@11136,5,@19143| 11240:S22|56414c55455f4f505328292e636f646556616c283629 11241:D5,328|483b65187303ff55484883380d751a488b4008488b0048833803750848c7c001000000c3e9d7ffffff4883380b7568488b4818488b5110488b5a0848833b05745b48c7c601000000488b780840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda498d7fd0483b7d107303ff55404989ff48c747f8030000004889771048894f08488917eb0ae994000000e910000000488d472048c740f801000000488938c348833b057416488b700848b8c05208c9a37f0000488b5d089090ff13488b7b10488b7308488b58084889f0ff157e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba404122c9a37f000048891148894108488061ffbf6a016a014989e04889cb4889f8909090ff1542000000584883c408e9d0feffff48c7c001000000c300000000000000004001000000000000|@11243,2097151,@19133,@1699,@1382|189,0,@1638 252,0,@11242 11242:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@19132| 11243:S36|56414c55455f4f505328292e636f646556616c283629666f6c6c6f775479706573283129 11244:D5,280|483b65187303ff5548a801756f498d4fe8483b4d107303ff55404989cf48c741f80200000048ba682622c9a37f000048895108488b1048891153ff700848c7c3030000004889c890ff15e20000004889c34889d8ff15de000000498d4fa0483b4d107303ff55404989cf48c741f80300000048c7411003000000eb05e97d0000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000488d482048c741f803000000488b542408488951104889410848c70105000000514889d3488b44240890e82affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000001001000000000000|@1363,2097151,@19134,@8016,@8522|39,0,@11128 11245:O1|@11246 11246:D3,32|48b8d84322c9a37f0000c3909090909000000000000000001800000000000000|@11249,1,@19135|2,0,@11247 11247:O2|3,@11248 11248:S133|6164645072657474795072696e7420656c656d656e742066756e6374696f6e73206d75737420686176652074797065202761202a20696e74202d3e207072657474792c202762202a20696e74202d3e207072657474792c202e2e2e2077697468206f6e652066756e6374696f6e20666f722065616368207479706520706172616d65746572 11249:S27|56414c55455f4f505328292e636f646556616c2836295f2d283129 11250:D14,1480|483b65187303ff5548415141525053415048bab06507c9a37f000090ff15be050000a8017568488b4c2420488b5168f6c201753e488b1a488b33483b35a7050000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebbd48c7c7010000004883ff01757048ba98c809c9a37f0000f6c201eb05e913050000753e488b1a488b33483b354e050000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebb648c7c7010000004883ff01751d488b1048b8c0cf09c9a37f0000eb05e933000000488b5d08909090ff13488b17488b1a483b1dee0400007415488b3048b878e107c9a37f0000488b5d089090ff13488b7210eb26488b17488b1a483b1dcc0400007413488b3048b878e107c9a37f0000488b5d08ff13488b72104c8b104989f3488b1c2448b8004b22c9a37f0000909090ff159e040000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff134889ce48c7c00100000090ff155a040000564152415349c7c20100000049b9381c08c9a37f00004989c04c89db488b44242048ba40a507c9a37f0000909090ff152e040000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8204b22c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134889c648c7c00100000090ff156a0300005649c7c20100000049b9381c08c9a37f00004989c0488b5c2408488b44243048ba40a507c9a37f000090ff1542030000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9781b07c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8584b22c9a37f0000488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100100000048c740080100000048c70001000000a80174134889c148b8f86f07c9a37f0000488b5d08ff134889c649b9d04e19c9a37f000049b8381c08c9a37f000048bb381c08c9a37f0000488b44244048bae84e19c9a37f0000909090ff1556020000564889c1488b4424184889ca9090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b978ec08c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47d0483b45107303ff55404989c748c740f8050000004889482048c740180100000048c740100300000048c740080100000048c70001000000a80174164889c148b8f86f07c9a37f0000488b5d08909090ff135048c7c001000000488b5424389090ff12498d4fc8483b4d107303ff55404989cf48c741f801000000488901488d411048c740f804000000488b542420488950185a488950104889480848c70003000000488b4c2420488b511848c70203000000488b51604883c4285b4883c40853ff2248c7c0010000004883c428c20800909090900000000000000000c005000000000000|@11256,2097151,@19136,@1633,@20131,@20131,@20131,@20131,@100,@1323,@1416,@1323,@1416,@8310|19,0,@1292 129,0,@2635 229,0,@2690 273,0,@1486 315,0,@1486 345,0,@11251 404,0,@1294 452,0,@1615 473,0,@1415 543,0,@833 584,0,@11252 663,0,@1294 704,0,@1615 727,0,@1415 795,0,@833 836,0,@11254 915,0,@1294 934,0,@8308 944,0,@1615 954,0,@1615 969,0,@8309 1055,0,@2141 1128,0,@2141 1205,0,@2141 1316,0,@1294 11251:S13|417267756d656e7420666f7220 11252:O2|3,@11253 11253:S14|526571756972656420747970653a 11254:O2|3,@11255 11255:S14|417267756d656e7420747970653a 11256:S26|56414c55455f4f505328292e636865636b505054797065283629 11257:D5,448|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25a20100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057557488b5108488b12488b7110488b36f6c301740af606017405482b1e7105ff5570ebf64883c301f6c30174084883fb017c08eb17f643ff10741148b8701e09c9a37f0000488b5d0890ff13f6c301740d4883fb017e58eb0be9c0000000f643ff10754bf6c30174064883eb027105ff5570ebf5498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889580848891041514c89c2909090ff125b90ff15be000000eb48f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c700050000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c348833903741048b8102c22c9a37f0000488b5d08ff13488b4108c390900000000000000000b801000000000000|@11258,1048575,@19137,@2178,@2226|178,0,@2221 313,0,@2224 411,0,@11159 11258:S27|56414c55455f4f505328292e636f64655374727563742832292829 11259:D5,136|483b65187303ff5548524889c3488b4210909090ff1586000000488338057519488b0c2449c7c001000000488b59084883c408ff256f000000488b0c244889c2498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4908488948104889500848c7000d0000004883c408c300000000000000008000000000000000|@11136,1048575,@19138,@11260,@2178| 11260:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19139,@2178|260,0,@11159 11261:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19140,@2178|260,0,@11159 11262:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19141,@2178|260,0,@11159 11263:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11264,1048575,@19142| 11264:S32|56414c55455f4f505328292e636f646556616c2836296c6f6164566172283129 11265:D19,2048|483b65187303ff5548f6400801756eff742408ff742418415150ff7208ff35f507000048c7c0010000009090ff15ee070000534c89c94c8d4c24084c89c24989c84889d348ba98f808c9a37f00009090ff15d2070000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4883c430eb05e9450000004889114889c34889c890ff159e0700004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c210004883780801756d5350ff7424184c89d14c8b5424284c89ce4989c94c89c14989f04889cb488b520890ff1259498d57e0483b55107303ff55404989d748c742f80300000048c7421001000000488b0948894a0848c70205000000498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e9a800000048bb98f006c9a37f0000488959085b488919498d5fb0483b5d107303ff55404989df48c743f80200000048894b08488913488d4b1848c741f80200000048895908488901488d411848c740f80300000048c74010010000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740c594883c41051ff2553060000c21000488b481048833907756f488b710848bfc25522c9a37f0000488d7cb7fcffe7909090e9d4000000909090e93b000000909090e9af020000909090e94c030000909090e923000000909090e91b000000909090e967030000909090e90b000000909090e95204000090909053ff7424104c89d64c8b542420eb05e9010500004c89cf4989f14c89c64989f84889f3488b5208909090ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4889114889c34889c8ff15920500004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c210006a016a0141f6c201755d41f64208017556498b520848837a0801754b488b32498b3a4c8b074983380d75124d8b40084d8b00483b65187303ff5548ebe84c8b0e4983390d75124d8b49084d8b09483b65187303ff5548ebe84989e34d89034989e04d894808eb214889e248bed09507c9a37f00004889324889e248bed09507c9a37f000048897208498d57e0483b55107303ff55404989d748c742f80300000048be605c22c9a37f0000488932488b342448897208488b7c240848897a10488062ffbf48833b0575214d8d47f04c3b45107303ff55404d89c749c740f8010000004c8b4b084d8908eb0749c7c0010000004983f8017571498d77c8483b75107303ff55404989f748c746f80300000048c74610010000004889560848c70605000000488d562048c742f80200000048c742080100000048891a4889d090ff15220400004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000eb05e916000000488970104889480848c700070000004883c410c21000498d57d8483b55107303ff55404989d748c742f80400000049b8986522c9a37f00004c890248895a084889721048897a18488062ffbf498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889500848c700050000004883c410c2100041f6c201750749837a0801741248b8f86522c9a37f0000488b5d089090ff134d8b12534c89c24d89c84889d3498b0248ba706622c9a37f000090ff1542030000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4889114889c34889c8ff151a0300004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c21000498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b4c24084889480848c70005000000c2100041f6c201750749837a0801741248b8306d22c9a37f0000488b5d089090ff134d8b12534c89c24d89c84889d3498b0248ba706622c9a37f000090ff157a020000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4889114889c34889c8ff1552020000498d4fc0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f80200000048c7400801000000488908ff150e0200004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048ba18d706c9a37f0000488950104889480848c70007000000c2100041f6c201750749837a08017413488b0848b8b06d22c9a37f0000488b5d08ff134d8b1253ff3048c7c301000000498b0248ba982409c9a37f000090ff159601000049b8286e22c9a37f00004889c35848ba486f22c9a37f00009090ff157e010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4889114889c34889c8ff15560100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c2100053ff7424104c89d64c8b5424204c89cf4989f14c89c64989f84889f3488b520890ff12498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4889114889c34889c8ff15d60000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c21000900000000000000000f807000000000000|@11320,2097151,@19160,@11321,@7332,@2165,@2166,@2211,@2166,@2166,@11292,@2166,@11292,@2166,@11319,@2242,@11315,@2166,@2166|70,0,@2163 322,0,@651 504,0,$11265+522 847,0,@1394 863,0,@1394 901,0,@11266 1152,0,@11287 1245,0,@11288 1279,0,@11291 1461,0,@11302 1495,0,@11291 1671,0,@513 1715,0,@11305 1747,0,@2241 1764,0,@11308 1778,0,@11314 11266:D3,112|498d4fb8483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000488d412048c740f80400000048bbf85c22c9a37f000048891848894808488b4a0848894810488b5a1048895818488060ffbfc3909000000000000000006800000000000000|@11286,15,@19150|57,0,@11267 11267:D4,48|483b65187303ff55484c8b4a184c8b4210488b5a08ff252d000000909090909000000000000000002800000000000000|@11275,2097151,@19146,@11268| 11268:D7,312|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9097e5eeb06f641ff10755b4989da4989c34d89c449c7c00900000048c7c3010000004c89d890ff15fe000000483b05ff000000745fa80175444889c648bfd85e22c9a37f000048c7c11900000048d1e9483bc9f3a6488d7c3f01488d743601eb0ae90e000000e909000000488d4c09017450eb094989c34989da4d89c449833907754e41f64108017547498b4108f6400801eb05e93b0000007536488b48084883790801752b488b10488b5a0848833b0d7519488b5b08488b1b483b6518730aeb05e90d000000ff5548ebe14989dceb034d89cc415241534c89e0909090ff15560000004c8b4424084889c3584883c40848baf05e22c9a37f0000ff25410000009000000000000000003001000000000000|@11284,2097151,@19148,@3795,@11269,@11276,@11271|100,0,@11269 281,0,@11270 11269:S4|636f6e76 11270:O2|@11271,@20169 11271:D4,136|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f8030000004c89411048895908488901488b7208488b364989d34989cc4989d84889c34889f09090ff1556000000498d4fe8483b4d107303ff55404989cf48c741f802000000488941084c89214d8b5b0849890b48c7c001000000c300000000000000008000000000000000|@11273,2047,@19144,@11272| 11272:D3,296|483b65187303ff5548a8017554488b08483b197457f60101754cf6c3017547f6c301740948c7c203000000eb08488b13488d5412014883c210488b314889df4c8b49084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c09017411eb55e9a80000004c8b4908eb574c8b4908498b4810488b510848833a03751a498b7110488b7e0848833f03750c4c8b52084c3b57087546eb3b48833a01753e498b7110488b7e0848833f0175304c8b521841f6c201eb05e9210000007510f6471801eb05e9140000007503ff55704c3b57187509488b4008e924ffffffff30488b4008909090e816ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000002001000000000000|@11274,511,@19145| 11273:S28|5052494e545f5441424c4528292e6164644f7665726c6f6164283329 11274:S37|5052494e545f5441424c4528292e6164644f7665726c6f616428332966696c746572283129 11275:S48|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283129283129 11276:D5,232|483b65187303ff55484883380b74164889c148b8d86222c9a37f0000488b5d08909090ff13488b4818488b5110488b5a0848833b017516488b700848b8786322c9a37f0000488b5d089090ff1348833b05756c48833b057414488b700848b8c05208c9a37f0000488b5d08ff13488b7b10488b7308488b58084889f0ff157e000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba186422c9a37f000048891148894108488061ffbf6a016a014989e04889cb4889f8eb05e910000000ff153e000000584883c408e92cffffff4889c8c30000000000000000e000000000000000|@11285,2097151,@19149,@1699,@1382|20,0,@11277 61,0,@11280 95,0,@1638 156,0,@11283 11277:O4|103,@112,@11279,@11278 11278:O5|@11124,1155,0,1155,0 11279:S52|496e76616c6964207479706520286e6f742061207479706520636f6e737472756374696f6e2920286164644f7665726c6f616429 11280:O4|103,@112,@11282,@11281 11281:O5|@11124,1153,0,1153,0 11282:S56|43616e6e6f7420696e7374616c6c20616e206f7665726c6f61642077697468696e206120737472756374757265206f722066756e63746f72 11283:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@19147| 11284:S45|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f6164696e67283229 11285:S42|56414c55455f4f505328292e6170706c7946756e6374696f6e283729666f6c6c6f775479706573283129 11286:S49|56414c55455f4f505328292e6170706c7946756e6374696f6e2837296164644f7665726c6f616447656e6572616c283129 11287:D4,48|483b65187303ff55484c8b4a184c8b4210488b5a08ff252d000000909090909000000000000000002800000000000000|@11275,2097151,@19151,@11268| 11288:O4|@20055,@557,@11290,@11289 11289:O5|@11124,1100,0,1100,0 11290:S14|4f7665726c6f616420457175616c 11291:O4|@11292,@2326,@2432,@2514 11292:D8,528|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d77e0483b75107303ff55404989f748c746f80300000048bff86822c9a37f000048893e48894e08488b7b0848897e10488066ffbf4c8b0b41f6c10174064983c1027105ff5570ebf54d8d57e04c3b55107303ff55404d89d749c742f80300000049894a10498972084d890a51ff7210ff72184c89d64c8b52084d89c149b8806a22c9a37f00004889f390ff156a0100004889c348b8803707c9a37f000090ff155e010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c7010700000058488b0048c7c201000000a801753a488b18498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b58084889d8483b65187303ff5548ebc24889d04889cbff15e20000009090ff15e2000000505348bb906c22c9a37f000048c7c003000000909090ff15ce000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8e86c22c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c39090909090909000000000000000000802000000000000|@11301,2097151,@19156,@2219,@2166,@2258,@11012,@1354|70,0,@11293 172,0,@11294 195,0,@974 354,0,@11298 449,0,@11300 11293:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19152,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11294:O1|@11295 11295:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@11297,1048575,@19153,@11296| 11296:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19154,@2178|263,0,@2173 11297:S45|545950454944434f444528292e657175616c697479466f7254797065283329726573756c74436f64652d283129 11298:O1|@11299 11299:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19155|2,0,@441 11300:S8|657175616c697479 11301:S31|545950454944434f444528292e657175616c697479466f7254797065283329 11302:O4|@20055,@557,@11304,@11303 11303:O5|@11124,1113,0,1113,0 11304:S17|4f7665726c6f6164204e6f74457175616c 11305:O4|@20055,@557,@11307,@11306 11306:O5|@11124,1126,0,1126,0 11307:S16|4f7665726c6f61642054797065446570 11308:O1|@11309 11309:D3,40|48b8886e22c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11313,1,@19157|2,0,@11310 11310:O4|@20055,@557,@11312,@11311 11311:O5|@11124,722,0,722,0 11312:S28|6765744f7665726c6f6164496e7374616e63653a204d697373696e67 11313:S37|56414c55455f4f505328292e6765744f7665726c6f6164496e7374616e6365283329283129 11314:O2|@11315,@20169 11315:D4,56|483b65187303ff5548488b5208488b124d89c14989d84889c34889d0ff252e00000090909090909000000000000000003000000000000000|@11317,1048575,@19158,@11316| 11316:D3,280|483b65187303ff5548a801755c488b08483b197459f6c3017559f601017554488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104889de488b394c8b51104c8b59084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741eeb5ae987000000e90a0000004c8b51104c8b5908eb574c8b51104c8b5908498b4810488b510848833a03751a498b7310488b7e0848833f03750c4c8b62084c3b67087541eb3b48833a017539498b7310488b7e0848833f01752beb05e9240000004c8b621841f6c4017510eb05e913000000f64718017503ff55704c3b671875044c89d0c3488b4008e90bffffff48c7c0010000004c89caff229090909090909000000000000000001001000000000000|@11318,1048575,@19159| 11317:S28|5052494e545f5441424c4528292e6765744f7665726c6f6164283329 11318:S41|5052494e545f5441424c4528292e6765744f7665726c6f61642833297365617263684c697374283129 11319:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19162| 11320:S28|56414c55455f4f505328292e6170706c7946756e6374696f6e283729 11321:D4,144|483b65187303ff5548ff72284c8b522049c7c1010000004c8b42184889c3488b4210488b4a084889ca909090ff1248833805751449c7c00100000048c7c303000000ff25600000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c39000000000000000008800000000000000|@11322,1048575,@19161,@2178| 11322:S40|56414c55455f4f505328292e6170706c7946756e6374696f6e283729676574436f6e737472283129 11323:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19163| 11324:S29|434f44455452454528292e6d756c7469706c6555736573283329283129 11325:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19164| 11326:S35|434f44455452454528292e6d756c7469706c65557365732833296c6f6164466e283129 11327:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19166| 11328:S44|44454255474745525f28292e6d616b6556616c4465627567456e74726965732836296c6f6164566172283229 11329:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19169| 11330:S26|44454255474745525f28292e7570646174655374617465283429 11331:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19168| 11332:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@11333,2097151,@19171,@8347| 11333:S53|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429636865636b56617273283129283129283129 11334:O2|@11336,@11335 11335:O4|3,@11339,@2450,1 11336:D11,1352|483b65187303ff55484d8b496841f6c101753e498b09488b31483b3540050000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19498b79084989f9483b65187303ff5548ebbc48c7c7010000004883ff01756948b998c809c9a37f0000f6c101753e488b31488b3e483b3dee040000751d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498931eb194c8b49084c89c9483b65187303ff5548ebbd49c7c1010000004983f901751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13498b09488b31483b358e04000074154889c748b878e107c9a37f0000488b5d089090ff1348837910017534eb2a488b0f488b31483b356904000074144989c148b878e107c9a37f0000488b5d0890ff134883791001750848c7c001000000c3488b384883ff017543498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d4ff04c3b4d107303ff55404d89cf49c741f8010000004989394c8908eb03488b3f575341505248c7c0030000004c89d29090ff12488b0c24498d57d8483b55107303ff55404989d748c742f804000000488b49084883c40848894a184889421048c742080100000048c70203000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488911488b1424488b1af6c301740af602017405482b1a7105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084889305156488b5a084889da9090ff12498d4fa8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80400000048c74018010000004889481048c740080100000048c7001b000000488d482848c741f80200000048c74108010000004889014889c89090ff15ca020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba18d706c9a37f0000488951104889410848c70107000000488b442410488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b1424488910514889da9090ff12498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80300000048c7401001000000488b5424204889500848c70005000000498d57e0483b55107303ff55404989d748c742f80300000048c7421001000000488b5c242848895a0848c70205000000498d5fb0483b5d107303ff55404989df48c743f80200000048c7430801000000488913488d531848c742f80200000048895a08488902488d421848c740f80300000048c74010010000004889500848c7001d000000f6c2017524488b1a48833b057512488b5a084889da483b65187303ff5548ebe048c7c201000000eb0748c7c2030000004883fa01740c51909090ff1536010000eb0151498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c890ff150e010000498d4fb0483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f80400000048ba80d606c9a37f00004889501848894810594883c4084889480848c70003000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c74008010000004889084883f8017506584883c418c34889c3584883c418ff25640000009090909000000000000000004005000000000000|@11338,1048575,@19172,@20135,@20135,@20135,@20135,@11319,@2211,@2166,@11337|96,0,@2635 189,0,@2690 233,0,@1486 278,0,@1486 728,0,@513 1216,0,@509 11337:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19173| 11338:S29|44454255474745525f28292e627265616b506f696e74436f6465283529 11339:O2|@11340,@2452 11340:O2|@11341,1 11341:O3|2,@20195,0 11342:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19264| 11343:S35|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429 11344:D3,104|483b65187303ff5548a801753d488b08488b5108488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@19175| 11345:D3,184|483b65187303ff5548a8017570488b08488b11488b5a10488b730848833e057514488b780848b8807107c9a37f0000488b5d08ff1348833e017519488b7e1048833f0375094c8b47084d8b00eb104c8b4708eb0a488b7e08488b3f4989f84150488b78084889f89090e892ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909090909090900000000000000000b000000000000000|@1363,127,@19176|39,0,@1305 11346:D6,328|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13488b08488b5108488b124c8b43084c8b48084989d24c8b1b4c8b6128498b4208909090ff15ee0000004989c54c89e0ff15ea0000006a016a016a0141504151415241534c8d4424204889c34c89e890ff15d2000000498d47d8483b45107303ff55404989c748c740f804000000488b4c240848894818488b4c242848894810488b4c242048894808594883c408488908498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424204889510848890151488b5c2410488b44240890e8f2feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c3909000000000000000004001000000000000|@3595,2097151,@19179,@11353,@11354,@11347|23,0,@3592 59,0,@3592 11347:D9,600|483b65187303ff5548415053ff155e0200006a016a0148837c24100175234889e148ba500107c9a37f00004889114889e148ba58cd06c9a37f000048895108eb6948c7c101000000488b542410f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4889c34889ce48c7c0010000009090ff15f2010000535048bba08422c9a37f00004889f0909090ff15e2010000498d4fb8483b4d10730aeb05e966010000ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120584889411848c741100100000048b8f88422c9a37f00004889410848b8500107c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f00000048c7c101000000488b542418f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4889c34889ce48c7c001000000909090ff151e010000535048bb188522c9a37f00004889f0909090ff150e010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120584889411848c741100100000048b8f88422c9a37f00004889410848b858cd06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d4c24105a488911488d4c240848894108eb0150488b5c241858ff1576000000488b4c2418488b5424084889115a4883c410488951084889411048c7c0010000004883c408c300000000000000005002000000000000|@11358,2097151,@19183,@11359,@11012,@1354,@11012,@1354,@11355|35,0,@775 51,0,@442 138,0,@11348 232,0,@11350 246,0,@775 366,0,@11351 453,0,@11350 467,0,@442 11348:O1|@11349 11349:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19177|2,0,@441 11350:S10|626f7865642f73697a65 11351:O1|@11352 11352:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19178|2,0,@441 11353:D3,192|483b65187303ff5548a801756b488b08488b511848833a057528498d5fe8483b5d107303ff55404989df48c743f802000000488b720848897308488b3948893beb2c498d5fe8483b5d107303ff55404989df48c743f80200000048be30e306c9a37f000048897308488b3148893353488b70084889f0eb05e929000000e87effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000b800000000000000|@1363,63,@19180|92,0,@573 11354:D3,144|483b65187303ff5548a8017565488b08498d57e0483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c7020d00000052488b78084889f8909090e8b2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008800000000000000|@1363,63,@19181| 11355:D15,1048|483b65187303ff5548a801755b488b0848833901755748837808017555ff710848bb10cd06c9a37f000048b8a8160dc9a37f0000ff15f6030000488b0c24483b0df30300007443f6c101754a4889ce48bf509adc000000000048c7c11100000048d1e9483bc9eb0fe991010000e98c010000e987010000f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c648c7c0010000004883c40890ff158e03000050535648bbb08b22c9a37f000048c7c0030000009090ff157a030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb80d606c9a37f000048b8a8160dc9a37f0000ff15ee020000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a801740c4889c890ff1586020000eb034889c84889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3a801754b488b084883390575424883780801753b4c8b410848b880da06c9a37f0000ff153a0200004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3a801754c488b084883390375434883780801753c4c8b410848b880da06c9a37f000090ff15f20100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3a801754c488b08f6010175444883780801753d4c8b410848b880da06c9a37f00009090ff15aa0100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c34889c148c7c201000000f6c101752b488b3148833e017410f6c20174064883c2027105ff5570ebf5488b71084889f1483b65187303ff5548ebd04889d14883f90375104989c048c7c001000000ff25380100004883f901756048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017513488b11f641ff10740348f7da488d541201eb034889ca4883ea024989d04889c348c7c001000000ff25da00000048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c1017513488b11f641ff10740348f7da488d541201eb034889ca4883ea024989d14989c048c7c001000000ff2582000000909000000000000000001004000000000000|@11366,1048575,@19188,@11367,I48,@11012,@1354,@11370,@2211,@11382,@11382,@11382,@11401,@11406,@11363|34,0,@439 44,0,@4034 81,0,I48 140,0,@971 183,0,@11356 330,0,@509 340,0,@4034 536,0,@544 615,0,@544 694,0,@544 11356:O1|@11357 11357:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19182|2,0,@441 11358:S34|44415441545950455f52455028292e63686f6f7365436f6e73747252657072283229 11359:D4,208|483b65187303ff5548a8017567488b08488b510848833a037528498d5fe8483b5d107303ff55404989df48c743f802000000488b314889730848c70301000000eb37ff7008ff314889d09090ff1596000000498d5fe8483b5d107303ff55404989df48c743f8020000005948894b08488903eb08e939000000ff700853488b442408909090e876ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c39090909090900000000000000000c800000000000000|@1363,2097151,@19185,@11360| 11360:D5,344|483b65187303ff55484883380b756a488b4818488b5110488b5a0848833b05755d48833b057416488b700848b8c05208c9a37f0000488b5d089090ff13488b7b10488b7308488b58084889f0ff151e010000498d4fe8483b4d107303ff55404989cf48c741f80200000048bad08e22c9a37f0000488911eb0ae936000000e92900000048894108488061ffbf6a016a014989e04889cb4889f8909090ff15d6000000584883c408e954ffffff48c7c005000000c348833805750848c7c003000000c348833807756ef64008017517488b48084883790801750c488b11488b4208e91bffffff48c7c101000000488b4008a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c84889c1498d47f0483b45107303ff55404989c748c740f801000000488908eb05e901000000c348c7c005000000c39090909000000000000000005001000000000000|@11362,2097151,@19186,@1699,@1382|45,0,@1638 108,0,@11361 11361:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@19184| 11362:S30|44415441545950455f52455028292e6765745475706c654b696e64283129 11363:D12,928|483b65187303ff554841f6c0017569498b08f601017566488b11488b3240f6c60174084883fe097f35eb06f646ff10742d498d7fd8483b7d107303ff55404989ff48c747f8040000004c894f18488977104889470848c7070f000000eb33498d7fe0483b7d107303ff55404989ff48c747f803000000eb0ae905030000e9260000004c894f104889470848c7070d000000415141ff700853504c8b41084889f8ff1512030000eb6448833903753e498d57e0483b55107303ff55404989d748c742f8030000004c894a104889420848c7020d000000415141ff700853504c8b41084889d0ff15d6020000eb69488339057546498d57e0483b55107303ff55404989d748c742f803000000eb05e92a0200004c894a104889420848c7020d000000415141ff700853504c8b41084889d090ff1592020000eb70498d57f0483b55107303ff55404989d748c742f801000000488902eb05e9e1010000488062ffbf498d77e0483b75107303ff55404989f748c746f8030000004c894e104889560848c70603000000415141ff7008535056ff710848bb10cd06c9a37f00004889f090ff152a020000eb05e98e010000488b0c24483b0d200200007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c648c7c0010000004883c408909090ff15ca01000050535648bbc89322c9a37f000048c7c0030000009090ff15b6010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb80d606c9a37f0000488b44240890ff152e010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a801740c4889c890ff15c2000000eb034889c8594883c102504c8b4c24184c8b442410488b5c24084889c89090e8a6fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000009803000000000000|@11410,1048575,@19209,@11382,@11382,@11382,@11367,I48,@11012,@1354,@11370,@2211|404,0,@439 452,0,I48 494,0,@971 539,0,@11364 686,0,@509 11364:O1|@11365 11365:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19187|2,0,@441 11366:S47|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f736552657072283129 11367:D11,1320|483b65187303ff5548488b0848ba7e9422c9a37f0000488d548afcffe290e918010000909090e9dc010000909090e9a7020000909090e9d3020000909090e9d6020000909090e9d9020000909090e97c030000909090e90f040000909090e90b000000909090e99b040000909090498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918909090ff15a6040000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba90d706c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889089090ff154a0400004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048ba18d706c9a37f0000488950104889480848c70007000000c3498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889189090ff15ea030000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba90d706c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889089090ff158e0300004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048ba18d706c9a37f0000488950104889480848c70007000000c3f64008017418488b4810488b500848b8f86f07c9a37f0000488b5d08ff13488b4808488b09f6c1017514488b501048b8b8f309c9a37f0000488b5d08ff1348833b05751dff70105149c7c0010000004889d848c7c301000000ff15fa020000eb39488b5010498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889580848c7000d00000052514889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4084889480848c7001b000000c3488b4810488b5008498d47d8483b45107303ff55404989c748c740f80400000048894818488958104889500848c7001b000000c348b858cd06c9a37f0000c348b858cd06c9a37f0000c3498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b40084889410848c70105000000498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d501848c742f8020000004889420848890a4889d0ff15d60100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048bad0d506c9a37f0000488950104889480848c70007000000c348833b05751fff7010ff700849c7c0010000004889d848c7c301000000ff157e010000eb3d488b4810488b5008498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889580848c7000d00000051524889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4084889480848c7001b000000c348833b057520ff7018ff700849c7c0010000004889d848c7c30100000090ff15ea000000eb3d488b4818488b5008498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889580848c7000d00000051524889c1498d47d8483b45107303ff55404989c748c740f804000000488b5424084889501848894810594883c4084889480848c7001b000000c348b858cd06c9a37f0000c39090909090909000000000000000002005000000000000|@11369,1048575,@19189,@2166,@2166,@2166,@2166,@2178,@11368,@2178,@2178|14,0,$11367+30 188,0,@517 291,0,@513 392,0,@517 495,0,@513 535,0,@1294 567,0,@2708 784,0,@442 795,0,@442 951,0,@502 1288,0,@442 11368:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19190| 11369:S29|44415441545950455f52455028292e636f6e7374724d61746368283229 11370:D16,1664|483b65187303ff5548488b0848bae69a22c9a37f0000488d548afcffe290e9e2010000909090e95e020000909090e986020000909090e9ae020000909090e9aa020000909090e950030000909090e978030000909090e931040000909090e90b000000909090e9f6050000909090488378080175044889d8c35348bbd8a122c9a37f0000488b4008ff150a060000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff15a6050000eb034889c84889c348c7c001000000909090ff1596050000505348bba8a222c9a37f000048c7c003000000909090ff1582050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048c74108010000005a4889114889c34889c89090ff15e60400004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c3498d47c8483b45107303ff55404989c748c740f80200000048c7400801000000488918488d481848c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff253b0400004889c8c3488b4808498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c3488b4808498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c34889d8c3498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d481848c741f8020000004889410848b820cc18c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f00004889089090ff156a0300004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048ba40cc18c9a37f0000488950104889480848c70007000000c3488b4808498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c3498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b40084889410848c70105000000498d47b0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d501848c742f8020000004889420848890a488d421848c740f80300000048c74010030000004889500848c7001d000000f6c2017524488b0a488339057512488b4a084889ca483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017406ff2545020000c3498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b50084889510848c70105000000535148bb00a322c9a37f0000488b50104889d09090ff1502020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740790ff15820100004889c348c7c001000000ff157a010000505348bbd0a322c9a37f000048c7c003000000909090ff1566010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048c74108010000005a4889114889c34889c89090ff15ca0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c348b880d606c9a37f0000c39090909000000000000000007806000000000000|@11381,1048575,@19195,@1354,@2211,@11012,@1354,@2166,@2211,@2166,@2211,@1354,@2211,@11012,@1354,@2166|14,0,$11370+30 124,0,@11371 278,0,@11374 373,0,@971 802,0,@8204 843,0,@442 899,0,@8205 1215,0,@11376 1394,0,@11379 1489,0,@971 1635,0,@509 11371:O1|@11372 11372:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b910cd06c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@11373,3,@19191|41,0,@439 11373:S49|44415441545950455f52455028292e636f6e7374724170706c792832297475706c654170706c79436f6465283229283129 11374:O1|@11375 11375:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19192|2,0,@441 11376:O1|@11377 11377:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b910cd06c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@11378,3,@19193|41,0,@439 11378:S52|44415441545950455f52455028292e636f6e7374724170706c792832297461675475706c654170706c79436f6465283329283129 11379:O1|@11380 11380:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19194|2,0,@441 11381:S29|44415441545950455f52455028292e636f6e7374724170706c79283229 11382:D16,976|483b65187303ff554841505048bb10cd06c9a37f00009090ff15ca030000488b4c2408483b0dc60300007439f6c101752d4889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017407488b4c2408eb0a48b9303707c9a37f00004889cb4889c648c7c001000000ff157603000050535648bbb8a822c9a37f000048c7c0030000009090ff1562030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb10cd06c9a37f0000488b44240890ff15da020000488b4c2410483b0dd60200007439f6c101752d4889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017407488b4c2410eb0a48b9303707c9a37f00004889cb4889c648c7c001000000ff158602000050535648bb10a922c9a37f000048c7c0030000009090ff1572020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb10cd06c9a37f0000488b44241090ff15ea010000488b4c2418483b0de60100007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb05488b4c24184889cb4889c648c7c001000000ff159601000050535648bb68a922c9a37f000048c7c0030000009090ff1582010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47b8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c410488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c1017406ff258c000000c39090900000000000000000c803000000000000|@11399,1048575,@19203,@11367,I48,@11012,@1354,@11370,I48,@11012,@1354,@11389,I48,@11012,@1354,@2211|14,0,@439 54,0,I48 103,0,@971 135,0,@11383 282,0,@439 326,0,I48 375,0,@971 407,0,@11385 554,0,@439 598,0,I48 640,0,@971 679,0,@11387 11383:O1|@11384 11384:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19196|2,0,@441 11385:O1|@11386 11386:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19197|2,0,@441 11387:O1|@11388 11388:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19198|2,0,@441 11389:D16,1256|483b65187303ff5548488b0848badea922c9a37f0000488d548afcffe290e9e2010000909090e92b020000909090e92e020000909090e931020000909090e92d020000909090e994020000909090e997020000909090e9e0020000909090e90b000000909090e95e040000909090488378080175044889d8c35348bb38af22c9a37f0000488b4008ff1572040000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff150e040000eb034889c84889c348c7c001000000909090ff15fe030000505348bb08b022c9a37f000048c7c003000000909090ff15ea030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048c74108010000005a4889114889c34889c89090ff154e0300004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c348833b05751749c7c0030000004889d848c7c301000000ff2506030000498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010010000004889580848c7000d000000c348b880d606c9a37f0000c348b880d606c9a37f0000c34889d8c3498d47e8483b45107303ff55404989c748c740f80200000048b998f006c9a37f000048894808488918909090ff158e0200004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048bae07009c9a37f0000488950104889480848c70007000000c348b880d606c9a37f0000c348833b05751749c7c0030000004889d848c7c303000000ff2531020000498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010030000004889580848c7000d000000c35348bb60b022c9a37f0000488b40109090ff15ee010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff158a010000eb034889c84889c348c7c001000000909090ff157a010000505348bbf8b022c9a37f000048c7c003000000909090ff1566010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80200000048c74108010000005a4889114889c34889c89090ff15ca0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c348b880d606c9a37f0000c3909090900000000000000000e004000000000000|@11400,1048575,@19204,@1354,@2211,@11012,@1354,@2166,@2178,@2166,@2178,@1354,@2211,@11012,@1354,@2166|14,0,$11389+30 124,0,@11390 278,0,@11393 373,0,@971 600,0,@509 611,0,@509 650,0,@651 711,0,@2450 737,0,@509 830,0,@11395 986,0,@11397 1081,0,@971 1227,0,@509 11390:O1|@11391 11391:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000004889481048b910cd06c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@11392,3,@19199|41,0,@439 11392:S55|44415441545950455f52455028292e636f6e73747244657374727563742832297475706c654465737472756374436f6465283329283129 11393:O1|@11394 11394:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19200|2,0,@441 11395:O1|@11396 11396:D3,96|a80174064883c0027105ff5570ebf54889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000004889481048b910cd06c9a37f00004889480848c7000d000000c39090909000000000000000005800000000000000|@11392,3,@19201|56,0,@439 11397:O1|@11398 11398:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19202|2,0,@441 11399:S40|44415441545950455f52455028292e637265617465556e617279436f6e7374727563746f72283329 11400:S32|44415441545950455f52455028292e636f6e7374724465737472756374283229 11401:D13,1008|483b65187303ff554841f6c0017564498b08f601017561488b1148833a01755d41ff700853504c8b410848b8d09507c9a37f0000ff15ce030000504c8b442418488b5c2410488b442408909090e8aeffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808eb0fe95e030000e989000000e909000000594883c418488908c3498d77e8483b75107303ff55404989f748c746f802000000488b3a48897e0848c7061100000041ff700853504c8b41084889f09090ff154a030000504c8b442418488b5c2410488b442408909090e822ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348833903755a41ff700853504c8b410848b820b622c9a37f0000ff15f2020000504c8b442418488b5c2410488b442408909090e8c2feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348833905755a41ff700853504c8b410848b8d09507c9a37f0000ff159a020000504c8b442418488b5c2410488b442408909090e862feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c3498d57e8483b55107303ff55404989d748c742f8020000004889420848c7020b00000041ff7008535052ff710848bb10cd06c9a37f00004889d0ff1522020000488b0c24483b0d1f0200007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c648c7c0010000004883c4089090ff15ca01000050535648bb38b622c9a37f000048c7c0030000009090ff15b6010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb80d606c9a37f0000488b44240890ff152e010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a801740c4889c890ff15c2000000eb034889c8594883c102504c8b442410488b5c24084889c8909090e852fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390900000000000000000e803000000000000|@11405,1048575,@19206,@11382,@11382,@11382,@11382,@11367,I48,@11012,@1354,@11370,@2211|44,0,@1394 280,0,@11402 376,0,@1394 501,0,@439 541,0,I48 583,0,@971 627,0,@11403 774,0,@509 11402:O2|8,0 11403:O1|@11404 11404:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19205|2,0,@441 11405:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707231283329 11406:D9,584|483b65187303ff5548f6c3017569488b0b498d57e0483b55107303ff55404989d748c742f8030000004c8942104889420848c702050000004150ff73085052ff710848bb10cd06c9a37f00004889d090ff150a020000488b0c24483b0d070200007439f6c10175404889ce48bf509adc0000000000eb05e9b201000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c648c7c0010000004883c408909090ff15aa01000050535648bb88b922c9a37f000048c7c0030000009090ff1596010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048bb80d606c9a37f0000488b44240890ff150e010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a801740c4889c890ff15a2000000eb034889c8594883c102504c8b442410488b5c24084889c8909090e8fafdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000004002000000000000|@11409,1048575,@19208,@11367,I48,@11012,@1354,@11370,@2211|68,0,@439 109,0,I48 158,0,@971 203,0,@11407 350,0,@509 11407:O1|@11408 11408:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19207|2,0,@441 11409:S60|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963726561746552657072283229 11410:S70|44415441545950455f52455028292e63686f6f7365436f6e7374725265707228322963686f6f73655265707228312963686f6f73654f7074696d697365645265707232283329 11411:D7,208|483b65187303ff5548488b4008488b0041ff3041ff7008ff70084c89c84d89d14989c0488b042490ff15ba000000488b4c242050ff71284c8b51104c8b094c8b4108488b5c2418488b442410ff159e000000488338017507488b4c2418eb18488b7008488b18488b44241890ff15860000004889c1eb04488b70084883f9017506488b0424eb0f4889cb488b04249090ff156a0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488970084889084883c420c20800900000000000000000c800000000000000|@11413,2097151,@19210,@11414,@11109,@11419,@11412| 11412:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19213| 11413:S48|434f444547454e5f50415253455452454528292e636f646553657175656e6365283429646563436f6e73747273283329 11414:D3,256|483b65187303ff5548a8017568f6c3017568488b08488b511048833a057416488b700848b888bd22c9a37f0000488b5d089090ff1341514150ff7308ff7008ff33ff7210ff720848c7c0030000004c89c2909090ff125948890159488b542420488911498d4fd8483b4d107303ff55404989cfeb0ae968000000e96300000048c741f8040000005b488959184889411048c741080100000048c70103000000514989d14c8b442418488b5c2410488b442408909090e846ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c348c7c001000000c39090909090900000000000000000f800000000000000|@3457,1048575,@19211|37,0,@11415 11415:O4|@20055,@557,@11417,@11416 11416:O5|@11418,1035,0,1035,0 11417:S18|646563436f6e733a204e6f74206c6f63616c 11418:S51|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f434f444547454e5f5041525345545245452e736d6c 11419:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19212| 11420:D9,456|483b65187303ff55484d8b496841f6c101753e498b09488b11483b15c0010000751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19498b71084989f1483b65187303ff5548ebbc48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b32483b356e010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13488b0f488b11483b150e01000074154889c648b878e107c9a37f0000488b5d089090ff1348837910017550eb2a488b0e488b11483b15e900000074144889c748b878e107c9a37f0000488b5d0890ff1348837910017524498d47e8483b45107303ff55404989c748c740f8020000004889580848c70001000000c36a016a01415241504d89c14c8d442410ff159a0000006a016a014989e24c8b4c24184c8b442410488b5c2428488b442420909090ff157e000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c428488908c3909090900000000000000000c001000000000000|@11424,1048575,@19216,@20135,@20135,@20135,@20135,@11421,@11110|96,0,@2635 189,0,@2690 233,0,@1486 278,0,@1486 11421:D7,1232|483b65187303ff55484883f801751349c700010000004989580848c7c001000000c3488b08488b116a016a014d89c34d89d44d89cd4c8b7008ff7308ff33ff731051ff7210488d5c2428488b02909090ff1592040000488b442408488b08488b5110488b5a0848833b057570498d77e0483b75107303ff55404989f748c746f80300000048894610488b7c243048897e0848c70609000000498d7fc8483b7d107303ff55404989ff48c747f8020000004c8b4424104c894708488937488d771848c746f80300000048897e10488b7c242048897e08488b7c2418eb05e91b00000048893e4d89e24d89e94d89d84889f34c89f04883c438e904ffffff488b342441534154415541564c89eb488b069090ff15da03000050488b442410488b542440909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff1532030000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba08c622c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb725048c7c003000000488b54242890ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba48c622c9a37f000048891148894108488b54242048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f8040000005e488973184889431048c7430801000000eb05e92b00000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808498d47e0483b45107303ff55404989c748c740f803000000488b4c243848894810488b4c24604889480848c70009000000488b4c2430488b510848833a01756d48833a0575134889c348b8807107c9a37f0000488b5d08ff1348833a017519488b5a1048833b037509488b7308488b36eb10488b7308eb0a488b5a08488b1b4889de498d5ff0483b5d107303ff55404989df48c743f801000000c643ff40488933498d77b8483b7510730aeb05e977000000ff55404989f748c746f80400000048c7461801000000488b7a0848897e1048895e0848c70603000000488d5e2848c743f8030000004c8b41104c8943104889730848be08f206c9a37f0000488933498d77e0483b75107303ff55404989f748c746f80300000048894e1048895e0848c7060b000000eb27498d77e0483b75107303ff55404989f748c746f80300000048894e1048894e0848c7060b000000498d5fb0483b5d107303ff55404989df48c743f802000000488b7c244048897b08488933488d731848c746f80200000048895e08488906488d461848c740f80300000048897010488b5c245048895808488b5c24084889186a016a014c8b5424304c8b4c24284989e04889c3488b442420e882fbffff48833c24017507488b442410eb12488b1c24488b442410909090ff1562000000488b4c24384883c408488901584883c4284889410848c7c0010000004883c440c3900000000000000000c804000000000000|@11426,1048575,@19217,@1348,@11427,@2211,@11425|495,0,@11422 576,0,@11423 771,0,@1305 941,0,@661 11422:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19214| 11423:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19215| 11424:S41|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529 11425:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19219| 11426:S51|44454255474745525f28292e6d616b6554797065436f6e7374724465627567456e7472696573283529666f6c64496473283229 11427:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19218,@2178|263,0,@2173 11428:D3,104|483b65187303ff5548a801753d488b08488b5108488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@19220| 11429:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19221| 11430:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19222| 11431:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19223| 11432:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19224| 11433:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19225| 11434:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19226| 11435:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19227| 11436:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19228| 11437:D5,392|483b65187303ff5548a801756e488b08488b5108488b12488b721048833e057414488b780848b8c8cf22c9a37f0000488b5d08ff1341524151415053ff7008ff7128ff7218ff7608ff761048c7c0030000004889da909090ff12488b4c240848890158488b542428488910488b09488b4424104883381d753feb05e9ee000000488b5808488b7308488b3651ff73184c8b54244849c7c1010000004c8b4424404889d34889f048ba00ff21c9a37f0000ff15ea000000eb3a48833811741348b838d022c9a37f0000488b5d08909090ff13514c8b4424384889d3488b44241048baa8d022c9a37f0000909090ff15b6000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584883c4184889411048c741080100000048c70103000000514c8b5424284c8b4c24204c8b442418488b5c2410488b44240890e8bafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c3909000000000000000008001000000000000|@1363,2097151,@19232,@11117,@11446|39,0,@11438 168,0,@11115 192,0,@11441 225,0,@11444 11438:O4|@20055,@557,@11440,@11439 11439:O5|@11418,963,0,963,0 11440:S6|6c7641646472 11441:O4|@20055,@557,@11443,@11442 11442:O5|@11418,983,0,983,0 11443:S6|636f64654578 11444:O4|@11446,@11454,@11479,@11445 11445:O5|5,@11494,@1887,@1744,@390 11446:D12,608|483b65187303ff5548498d4fc8483b4d107303ff55404989cf48c741f80300000048c741100100000048c7410801000000488b7218488931488d792048c747f80200000048c747080100000048890fff7208ff35200200004989c14989d24889f8909090ff1516020000415053415141524c8d4c242048ba98f808c9a37f0000ff1502020000488b0c24498d57c8483b55107303ff55404989d748c742f80300000048c742100100000048c7420801000000488b591848891a488d722048c746f80200000048c7460801000000488916ff7110ff35b70100004889c74889f090ff15b2010000574c8d4c24084c8b442430488b5c242848ba98f808c9a37f0000ff159a010000488b4c242048833905756f4c8b442430488b5c2428488b410848baf87a09c9a37f0000909090ff1576010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8ff1552010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000eb05e915000000488b1424488951104889410848c70107000000eb034889c1498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848b820cc18c9a37f00004883c448488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f00004889089090ff15a60000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048ba40cc18c9a37f0000488950104889480848c70007000000c39000000000000000005802000000000000|@11450,2097151,@19229,@11451,@7332,@2165,@11447,@7332,@2165,@2531,@2166,@2166|120,0,@2163 248,0,@2163 289,0,@2530 466,0,@8204 511,0,@442 567,0,@8205 11447:D4,144|483b65187303ff5548488b5208488b421048833803741248b890d422c9a37f0000488b5d089090ff13488b480848833905751749c7c00100000048c7c3030000004889c8ff255e000000498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c3909000000000000000008800000000000000|@11453,1048575,@19231,@2178|25,0,@11448 11448:O4|101,@1386,0,@11449 11449:O5|@1308,508,0,508,0 11450:S26|44415441545950455f52455028292e6d6b45784964656e283329 11451:D4,144|483b65187303ff5548488b5208488b421048833803741248b890d422c9a37f0000488b5d089090ff13488b480848833905751749c7c00100000048c7c3030000004889c8ff255e000000498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c3909000000000000000008800000000000000|@11452,1048575,@19230,@2178|25,0,@11448 11452:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b65536f6d652d283129 11453:S38|44415441545950455f52455028292e6d6b45784964656e2833296d616b654e6f6e652d283129 11454:O7|@1967,@1128,@11456,@11455,@390,0,0 11455:O3|2,@11477,@11476 11456:O2|1,@11457 11457:O3|2,@2016,@11458 11458:O2|@11459,0 11459:O4|@20054,69,@11460,0 11460:O3|2,3,@11461 11461:O5|@571,@11462,@1110,@1978,@548 11462:O2|@594,@11463 11463:O2|@11465,@11464 11464:O2|@11469,@11468 11465:O2|@1162,@11466 11466:O3|0,@11467,@576 11467:O8|@512,@1967,0,0,@772,0,0,1 11468:O2|@11473,0 11469:O2|@2346,@11470 11470:O3|0,@11471,@576 11471:O8|@11472,@1967,0,0,@772,0,0,1 11472:O3|14,@685,1 11473:O2|@2352,@11474 11474:O3|0,@11475,@576 11475:O8|@1996,@1967,0,0,@772,0,0,1 11476:O5|5,@11478,@1887,@1744,@390 11477:O3|6,@20196,79992 11478:O2|@11477,0 11479:O7|@1963,@431,@11480,@11476,@390,0,0 11480:O2|1,@11481 11481:O3|2,@2018,@11482 11482:O2|@11483,0 11483:O4|@20054,69,@11484,0 11484:O3|2,2,@11485 11485:O5|@571,@11486,@1110,@1978,@548 11486:O2|@594,@11487 11487:O2|@11489,@11488 11488:O2|@11493,0 11489:O2|@1148,@11490 11490:O3|0,@11491,@576 11491:O8|@11492,@1963,0,0,@772,0,0,1 11492:O4|13,0,@439,0 11493:O2|@3194,@573 11494:O2|@11495,0 11495:O3|2,@11496,@891 11496:O3|3,@11497,@395 11497:O2|@11498,@7426 11498:O2|49,@8607 11499:D3,104|483b65187303ff5548a801753d488b08488b5108488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@19233| 11500:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19234| 11501:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19235| 11502:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19236| 11503:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19237| 11504:D9,560|483b65187303ff55484d8b496841f6c101753e498b09488b11483b1528020000751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19498b71084989f1483b65187303ff5548ebbc48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b32483b35d6010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13488b0f488b11483b157601000074154889c648b878e107c9a37f0000488b5d089090ff1348837910017465eb2a488b0e488b11483b155101000074144889c748b878e107c9a37f0000488b5d0890ff134883791001746e498d77e8483b75107303ff55404989f748c746f80200000048895e0848c706010000006a016a0141524150a8017532ff70084c8b4c2410eb05e98e0000004c8b4424084889f3488b00909090ff15ea0000004889c658483b65187303ff5548ebca488d442410488b0e488908eb05e959000000488d442410488b5608488950086a016a014989e24c8b4c24184c8b442410488b5c2428488b44242090ff15a2000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c428488908c3498d47e8483b45107303ff55404989c748c740f8020000004889580848c70001000000c39090909000000000000000002802000000000000|@11508,1048575,@19240,@20135,@20135,@20135,@20135,@11505,@11110|96,0,@2635 189,0,@2690 233,0,@1486 278,0,@1486 11505:D6,680|483b65187303ff5548488b4b08ff7108ff7110ff33ff7018ff7010ff3041504151ff314c89c39090ff159202000050488b442418488b542408909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15e6010000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba70e422c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb725048c7c003000000488b54241890ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048bab0e422c9a37f000048891148894108488b54242048895110488061ffbf498d57c0483b55107303ff55404989d748c742f8040000005b48895a184889421048c7420801000000eb05e92b00000048c70203000000488d422848c740f80200000048c74008010000004889104889e24889024889e048894808498d47d8483b45107303ff55404989c748c740f804000000488b4c243048894818488b4c242848894810488b4c24204889480848c7000700000048833c24017507488b4c2438eb184889c6488b1c24488b442438ff15a20000004889c14889f0498d57b0483b55107303ff55404989d748c742f802000000488b5c24404883c40848895a08488902488d421848c740f80300000048895010488b542440488950085a4883c4404889104889c2488d402048c740f80200000048895008488908c3909090900000000000000000a002000000000000|@11510,1048575,@19241,@11511,@2211,@11509|267,0,@11506 348,0,@11507 11506:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19238| 11507:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19239| 11508:S37|44454255474745525f28292e6d616b655374727563744465627567456e7472696573283529 11509:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19243| 11510:S50|44454255474745525f28292e6d616b655374727563744465627567456e74726965732835296c6f6164537472756374283229 11511:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19242,@2178|260,0,@11159 11512:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19244| 11513:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19245| 11514:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19246| 11515:D3,104|483b65187303ff5548a801753d488b08488b5108488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@19247| 11516:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19248| 11517:D4,128|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba10eb22c9a37f000048891148895908488061ffbf4889c34889c8909090ff15520000004889c14889d84889ca90ff124889c148c7c0030000004889ca90ff1248c7c001000000c390909090909000000000000000007800000000000000|@11525,1048575,@19252,@1687|35,0,@11518 11518:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048bb88eb22c9a37f000048891848895008488b52084889501048894818488060ffbfc3909000000000000000004800000000000000|@11524,15,@19251|29,0,@11519 11519:D8,360|483b65187303ff5548488b4a184883390b7569488b5918488b7310488b7e0848833f05755c4989c04c8b4908488b4208ff154a01000048833f0574154889c148b8c05208c9a37f0000488b5d089090ff134989c24c89cb488b470890ff1526010000498d4fe8483b4d107303ff55404989cf48c741f802000000eb0ae9d5000000e94500000048ba40ed22c9a37f000048891148894108488061ffbf6a016a01415041524c8d4424104889cb488b4710ff15da000000488b4424105aff124889c1584883c4104889caff224883f8017462488b0648833805755e4c8b40084d8b0041f6c00174084983f8017d51eb0741f640ff1074484c8b52104c8b034c89c348b8f8ed22c9a37f00009090ff158600000048bb38ee22c9a37f0000ff157e0000004c89d2909090ff1248c7c001000000eb0ae916000000e909000000c348c7c003000000c348c7c003000000c348c7c001000000c3c39000000000000000006001000000000000|@11523,2097151,@19250,@1687,@1699,@1382,@100,@100|65,0,@1638 136,0,@11520 258,0,@11521 276,0,@11522 11520:D3,144|488b5208f6c201753d488b0a488b19488b30483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048890feb19488b7a084889fa483b65187303ff5548ebbe48c7c7010000004883ff01750848c7c001000000c3488b3f498d47f0483b45107303ff55404989c748c740f801000000488b7f08488938c3909000000000000000008800000000000000|@1642,63,@19249| 11521:S44|54797065206f662065787072657373696f6e20636f6e7461696e73206c6f63616c2064617461747970652028 11522:S25|29206f7574736964652069747320646566696e6974696f6e2e 11523:S56|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129283129 11524:S53|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229636865636b5479706573283129 11525:S40|545950455f5452454528292e636865636b466f724573636170696e67446174617479706573283229 11526:D9,968|483b65187303ff55484d8b406841f6c001753e498b08488b11483b15c0030000751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19498b70084989f0483b65187303ff5548ebbc48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b32483b356e030000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13488b0f488b11483b150e03000074154889c648b878e107c9a37f0000488b5d089090ff134883791001752ceb53488b0e488b11483b15e902000074144889c748b878e107c9a37f0000488b5d0890ff134883791001745e488b7008488b3e483b3b745040f6c7017560f6030175604c8b0b41f6c101740e49c7c003000000eb0de9af0000004d8b014f8d4400014983c0104889fe4c89cf4c89c148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901755aeb05e97a000000488b4808488b5108f6c2017515eb0ae99b000000e996000000f64308017503ff5570483b53087561488b711040f6c6017509f64310017503ff5570483b73107568488b791840f6c7017510f6431801750aeb05e957000000ff5570483b7b18754e4c8b412041f6c0017509f64320017503ff55704c3b432075354889c1498d47e8483b4510730aeb05e921000000ff55404989c748c740f8020000004889480848c70001000000eb05e901000000c3488b7010488b3848c7c001000000ff15ae010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad8fa21c9a37f0000488951104889410848c70107000000498d47b0483b45107303ff55404989c748c740f80300000048c74010010000004889580848c70005000000488d502048c742f80200000048c7420801000000488902488d421848c740f8020000004889500848baa0d906c9a37f0000488910498d57e8483b55107303ff55404989d748c742f8020000004889420848890a4889d0ff15f6000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d4798483b45107303ff55404989c748c740f8020000004889480848c70005000000488d481848c741f80200000048c7410801000000488901488d411848c740f80300000048897010488958084889384889c2488d402048c740f80200000048895008488908c390909090900000000000000000c003000000000000|@11527,255,@19253,@20135,@20135,@20135,@20135,@2166,@2166|96,0,@2635 189,0,@2690 233,0,@1486 278,0,@1486 628,0,@11111 735,0,@536 820,0,@11027 11527:S34|44454255474745525f28292e75706461746544656275674c6f636174696f6e283329 11528:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19254| 11529:D3,240|483b65187303ff5548a801756b488b086a016a015351ff7120488d5c2418488b4008909090e8d6ffffff48833c2401744d498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b4c2408488908488b4c2410488901488b4424204889410848c7c0010000004883c428eb05e947000000c3498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2408488908488b4c2410488b5424184889114889410848c7c0010000004883c428c348c7030100000048c743080100000048c7c001000000c390909090900000000000000000e800000000000000|@1464,15,@19255| 11530:D6,168|483b65187303ff5548488b4818488b09488b500848833a2d750f488b5208483b65187303ff5548ebeb48833a0b750f488b5210483b65187303ff5548ebd648833a177415488b701048b808f622c9a37f0000488b5d0890ff13488b52104989da4c8b58104989cc4889d09090ff154e00000041524d89d84889c34c89e0909090ff15420000004883f801750258c34889c358ff25380000000000000000000000a000000000000000|@11535,2097151,@19256,@11536,@11537,@11534|74,0,@11531 11531:O4|@20055,@557,@11533,@11532 11532:O5|@11418,1534,0,1534,0 11533:S10|6765744d617463686573 11534:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19259| 11535:S61|434f444547454e5f50415253455452454528292e636f646552656356616c42696e64696e677328332976616c42696e64546f4676616c42696e64283229 11536:D3,296|483b65187303ff5548a8017569488b08498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb30e306c9a37f000048891a498d5fe0483b5d107303ff55404989df48c743f803000000488b7120488973104889530848ba509adc0000000000488913498d5798483b5510730aeb05e993000000ff55404989d748c742f80200000048c7420801000000488b790848893a4c8d421849c740f80400000049c740180100000049c740100100000049895808498910498d502848c742f804000000488b592848895a18488972104c8b094c894a084c8902524c8b40084c89c0e816ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000002001000000000000|@1363,255,@19257|46,0,@573 95,0,I48 11537:D4,536|483b65187303ff5548a8017573488b08498d57f0483b55107303ff55404989d748c742f801000000c642ff4048be30e306c9a37f0000488932498d77d0483b75107303ff55404989f748c746f80300000048c74610f17002004889560848c7060d000000488d562048c742f801000000c642ff4048bf30e306c9a37f0000eb05e97501000048893a498d7fc0483b7d107303ff55404989ff48c747f80300000048c74710f17002004889570848c7070d000000488d572048c742f80300000048897a104889720848c70205000000415053ff70085756514889d3488b411848bab06507c9a37f0000ff15420100004883f801741148b8e8fa22c9a37f0000488b5d0890ff13498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70003000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff405a488911498d57f0483b55107303ff55404989d748c742f801000000c642ff405b48891a498d5ff0483b5d107303ff55404989df48c743f801000000c643ff405e488933498d77c8483b75107303ff55404989f748c746f80600000048895e2848894620488b4424104889461848894e10488b4c240848894e08488916564989c04889cb488b442408e82efeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000001002000000000000|@1363,2097151,@19258,@1633|46,0,@573 118,0,@573 224,0,@1292 246,0,@11538 11538:O4|@20055,@557,@11540,@11539 11539:O5|@11418,1553,0,1553,0 11540:S10|6d6b4656616c42696e64 11541:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19260| 11542:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19261| 11543:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19262| 11544:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19263| 11545:O2|@11547,@11546 11546:O3|@11718,@11717,@8280 11547:D16,1216|488dbc2450ffffff483b7d187303ff55504889c64889d74889f09090ff15b60400004889f1415141ff3050415041ff700856535741ff702841ff701841ff7010f6c1017569488b01488b5010488b12498d5fd8483b5d107303ff55404989df48c743f80400000048bee80223c9a37f0000488933488b74244848897308488b7c242048897b104c8b40184c894318488063ffbfff7108488b42189090ff153e04000059483b65187303ff5548eb9248c7c0010000005b488b44242090ff1526040000488b4c24204889c24883f90175224883fa0174134889c148b8a03f0bc9a37f0000488b5d08ff1348c7c101000000eb6ff6c20174164889c348b8a03f0bc9a37f0000488b5d08909090ff13488b19488b7310488b36488b7e1048833f0574144989c048b8980323c9a37f0000488b5d0890ff134c8b47084c8b0a4d89084c8b57104c8b5c24284d891a4c8b4a084c89ca488b59084889d9483b6518730aeb05e908000000ff5548e95cffffff50488b5c2410488b442428909090ff156e030000488b4c241850ff74243850ff742428ff742458ff742450ff742430ff742478ff7108ff7424684c8b9424980000004c8b4c24584c8b4424504889c3488b4424789090ff152e030000488b4c24304883c4085a4883c4284883f90175244883fa0174154889c148b8a03f0bc9a37f0000488b5d089090ff1348c7c101000000eb6ef6c20174164889c348b8a03f0bc9a37f0000488b5d08909090ff13488b19488b7310488b36488b7e1048833f0574144989c048b8980323c9a37f0000488b5d0890ff134c8b47084c8b0a4d89084c8b57104c8b1c244d891a4c8b4a084c89ca488b59084889d9483b6518730aeb05e908000000ff5548e95bffffff488b4c24084883c40850ff71284c8b51104c8b094c8b4108488b5920488b4424189090ff155a020000488b4c2418488b5168f6c201753e488b1a488b33483b3547020000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebbd48c7c7010000004883ff01756d48ba98c809c9a37f0000f6c201753e488b1a488b33483b35f5010000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebbd48c7c7010000004883ff017520488b5008488b1848b8c0cf09c9a37f0000eb05e939000000488b5d089090ff13488b17488b1a483b1d920100007419488b70084c8b0048b878e107c9a37f0000488b5d089090ff1348837a10017467eb2e488b17488b1a483b1d690100007418488b70084c8b0048b878e107c9a37f0000488b5d0890ff1348837a1001744aff7008ff30488b4424209090ff153e010000488b442420a8017526ff7008488b5c2430488b009090ff152a01000058483b6518730aeb05e90e000000ff5548ebd648c7c001000000eb10488b4808488b3048c7c001000000515648837c241001751348b8e07321c9a37f0000488b5d08909090ff13488b4424109090ff15de000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f8020000005a48895008488908488b4c2428488901584883c4204889410848c7c0010000004883c408c390900000000000000000b804000000000000|@11556,2097151,@19266,@11557,@11517,@11558,@11559,@11565,@11109,@20136,@20136,@20136,@20136,@11708,@11553,@11013|105,0,@11548 219,0,@3339 252,0,@3339 294,0,@11550 489,0,@3339 524,0,@3339 566,0,@11550 769,0,@2635 866,0,@2690 913,0,@1486 962,0,@1486 1084,0,@10953 11548:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@11549,2097151,@19265,@8347| 11549:S53|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329636865636b56617273283129283129 11550:O4|@20055,@557,@11552,@11551 11551:O5|@11418,1150,0,1150,0 11552:S15|73657456616c756541646472657373 11553:D7,352|483b65187303ff5548f64028017554488b4828488b11488b32488b364883fe017570488b7208488b364883fe017568488b70204883fe01750c48beb06319c9a37f0000eb28488b3e48833f017506488b7708eb19488b7e084889fe483b6518730aeb05e9e0000000ff5548ebc64989da4989f3488b1848b8b80523c9a37f0000ff15f200000048bbe00523c9a37f0000eb0ae9b1000000e9ac000000ff15de0000004152415348bb80ce17c9a37f0000ff15d20000009090ff15d2000000498d4fd0483b4d107303ff55404989cf48c741f8050000004889412048c741180100000048c741100100000048c741080700000048c70101000000f6c101741348b8f86f07c9a37f0000488b5d08909090ff13498d47d8483b45107303ff55404989c748c740f8040000005a488950184889481048c740080100000048c7000100000059488b5160ff2248c7c001000000c300000000000000005801000000000000|@11716,1048575,@19349,@100,@100,@7855,@8217|59,0,@8345 120,0,@11554 136,0,@11555 168,0,@7849 256,0,@1294 11554:S18|56616c7565206964656e7469666965722028 11555:S26|2920686173206e6f74206265656e207265666572656e6365642e 11556:S38|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329 11557:D3,104|483b65187303ff5548a801753d488b08488b5110488b1252488b48084889c89090e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000006000000000000000|@1363,7,@19267| 11558:D3,112|483b65187303ff5548a801754953ff700848c7c0050000004889da90ff1250488b5c2410488b442408e8d2ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c3909000000000000000006800000000000000|@1363,1048575,@19268| 11559:D4,112|483b65187303ff5548a801754553ff7008488b00ff156e00000050488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,2097151,@19270,@11560| 11560:D6,120|483b65187303ff5548488b4010488b00498d4fe8483b4d107303ff55404989cf48c741f80200000048bac80823c9a37f000048891148895908488061ffbf6a016a014989e04889cb488b4018ff153e0000004883c4085890ff153a000000ff253c0000009090909000000000000000007000000000000000|@11564,2097151,@19271,@1382,@7328,@11563|42,0,@11561 11561:D3,264|488b5208f6c2017563488b0a488b591848833b03755b488b730840f6c601753d488b3e4c8b074d8b084c3b08751d4d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb194c8b56084c89d6483b65187303ff5548ebbd49c7c2010000004983fa017521eb0ae976000000e95c000000488b72084889f2483b65187303ff5548e979ffffff4d8b12498b32498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c8b0e4c894f0848c7070d0000004989c3488d472048c740f801000000488938c3488b72084889f2483b65187303ff5548e91dffffff4889c148c7c001000000c390909090909000000000000000000001000000000000|@11562,1023,@19269| 11562:S41|545950454944434f444528292e547970655661724d61702e6d61705479706556617273283129283129 11563:D3,120|483b65187303ff5548a801754d488b08488b51084883e2094883fa01743051488b40089090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,7,@19272| 11564:S48|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e6773283329676574506f6c79283129 11565:D40,4784|488dbc24e0fdffff483b7d187303ff5550a8017564f6c301756441f6c0017563488b08488b11488b12488b7110488b36488b7920488b3f4c8b59284d8b1b4d89cc4d8b68084c8b7308ff700841ff30ff3351ff71185257ff7108488b1e4c89e0ff156212000048c7c101000000488b542428f6c2017530eb0fe916120000e911120000e90c120000f6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebcbf604240174144889c248b8181f23c9a37f0000488b5d0890ff13488b1424488b1a488b33415241544155415650514153488b069090ff15ee110000488b4c243848ba40cd06c9a37f000050f6c1017536f6c201751c48837a08017515488b01ff7108488b48084889c8ff15c2110000eb064889d0ff71084889c259483b65187303ff5548ebc54889d0488b4c2438488b5168f6c201753e488b1a488b33483b3595110000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebbd48c7c7010000004883ff01756948ba98c809c9a37f0000f6c201753e488b1a488b33483b3543110000751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b7a084889fa483b65187303ff5548ebbd48c7c7010000004883ff01751a4889c248b8c0cf09c9a37f0000eb05e933000000488b5d08ff13488b17488b1a483b1de610000074154889c648b878e107c9a37f0000488b5d089090ff1348837a10017438eb2a488b17488b1a483b1dc110000074144889c648b878e107c9a37f0000488b5d0890ff1348837a1001740c48b840cd06c9a37f0000eb4e48c7c6010000004989c041f6c001752040f6c60174064883c6027105ff5570ebf54d8b4008483b65187303ff5548ebda40f6c60174084883fe037e12eb06f646ff10750a48b840cd06c9a37f000048c7c6010000004989c041f6c001752040f6c60174064883c6027105ff5570ebf54d8b4008483b65187303ff5548ebda6a016a01a801751d488378080175164989e0488b004989004889e048c7400801000000eb154889e048c700030000004889e048c7400803000000488b442408a8017412f644242001740b488d40ff48034424207105ff5570ebf04989c0488b442410ff15ba0f0000a801752841f6c001740ef6000174094d8d40ff4c03007105ff5570ebf2488b4008483b65187303ff5548ebd44c89c048837c245803754e4883f803754d488b4c241048bad0cc06c9a37f0000483bca750948c7c103000000eb50f6c1017550f6c2017550488b19488b3a483bdf750948c7c303000000eb58f6c301755840f6c7017544eb0ae9b8000000e9aa0000004c8b034c3b077527488b7f084c8b43084c89c3483b65187314eb0fe962000000e956000000e948000000ff5548ebac48c7c301000000eb1548c7c301000000eb0ce90700000048c7c3010000004883fb017416488b5208488b4908483b65187303ff5548e954ffffff48c7c101000000eb1048c7c101000000eb0748c7c1010000004883f901741948833c2403740948c7c101000000eb2248c7c103000000eb1948c7c101000000eb1048c7c101000000eb0748c7c1010000004989f54989ce50488b5c2460488b442458ff15620e000041554156504d89e94c8b442440488b5c243048c7c00100000090ff154a0e000048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc488b9424f8000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77e0483b75107303ff55404989f748c746f80300000048bf981f23c9a37f000048893e48895e08488b7a0848897e10488066ffbf4c8b0241f6c00174064983c0027105ff5570ebf54d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049895910498971084d890148837c247803756b4889ce40f6c601740ef6442418017407482b7424187105ff5570ebf44883c6014c8b54241841f6c201740ef64424280174074c2b5424287105ff5570ebf44983c20141f6c201740ef64424400174074c2b5424407105ff5570ebf44983c2014983fa03756c40f6c601eb05e92e01000074084883fe017c08eb1bf646ff1074154989c248b8f0a115c9a37f0000488b5d089090ff134d8d57d04c3b55107303ff55404d89d749c742f8020000004989720849c70201000000498d721848c746f8020000004c89560848c70609000000eb7241f6c20174084983fa017e09eb1a41f642ff1074134989c348b8202123c9a37f0000488b5d08ff1356ff35840c00005053415151415057488d5c24304c89d0ff15760c0000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e948000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8ff150e0c00004889c6eb5f4889ceeb5f6a016a015053415151415057eb56488b74242840f6c6017412f644244001740b488d76ff48037424407105ff5570ebf06a016a0150534151514150574989c84889f3488b44247090ff15be0b0000498d4fe0483b4d107314eb0fe973000000e96e000000e969000000ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174104889c89090ff154a0b00004889c6eb034889ce498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70003000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba982123c9a37f000048891148894108488061ffbf50515648c7c303000000488b44247048baa05f06c9a37f0000ff15da0a0000498d4fe8483b4d107303ff55404989cf48c741f80200000048baf0f00ac9a37f000048895108488901498d47d0483b45107303ff55404989c748c740f8020000004889480848c700510000004889c1488d401848c740f80200000048894808488b8c24a0000000488908ff15720a000048837c246803740948c7c101000000eb0748c7c1030000004883f102ff742428ffb424a000000051ff742438ff35480a000050488d5c2408488b8424c80000009090ff153a0a00004889c3488b84242001000048bab09b09c9a37f000090ff15260a0000488b8c247801000048c7c20100000050f6c10175284c8b59084c8b04244889d3488b01909090ff15020a00004889c24c89d9483b65187303ff5548ebd34889d04883f8017506488b0424eb104889c3488b0424909090ff15da090000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d511848c742f801000000c642ff4048c70201000000498d5fc0483b5d107303ff55404989df48c743f80400000048894b18488b4c24404883c40848894b10488b74246048897308488913488d7b2848c747f8020000004c8b8424700100004c89470848891f488b9c24680100004883bc249000000001740948c7c001000000eb545257ff33ff7320ff73385056ff742478ffb42490000000ffb42490000000ffb424b80000004c8b9424d801000049c7c1010000004c8b8424d0010000488b9c24b0010000488b8424b8010000ff15ea080000eb0a5257ff33ff7320ff7338ffb42478010000ff742408ff742428ff742440ffb42480000000ffb424b0000000ff742440ffb42490000000ffb424f0000000ffb424b0010000ffb424c0010000ffb424d8000000ffb424d8000000ffb424d8000000ffb42400010000ffb42438010000ff357c08000050ffb424c8010000ffb424a0000000ffb42428010000ffb424b8000000ffb424100100004c8b9424a00100004c8b8c24e80100004c8b842410010000488b9c24b0010000488d44243048ba502223c9a37f000090ff152a08000048c7c101000000488b942428010000f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdcf6c101750df6842458010000017503ff5570483b8c245801000074144889c148b8485a23c9a37f0000488b5d0890ff13f68424a80000000174164889c148b808c009c9a37f0000488b5d08909090ff13488b8c24b0000000488b094889c34889c89090ff159607000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848833c240174124889de488b1c249090ff15460700004889f34883f801742a4889d9498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889430848c70315000000488b8424200100004881c4b8000000488b0048c7c101000000a801753a488b10498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0a48890e4889f1488b50084889d0483b65187303ff5548ebc24889c890ff15ba060000488b4c2440488b09488b542440488b12488b742440488916488b1424483b159f060000743af6c20175444889d648bf509adc00000000004989c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c1eb0f4989c848b9303707c9a37f0000eb094889ce4889d14989f04889ceff154a0600004889c74883c470584883c4189090ff153e060000498d4fa0483b4d107303ff55404989cf48c741f808000000488b542418488951384c89413048c7412803000000488941204889791848c741100100000048897108488919488d414848c740f8020000004889480848c7000f000000f684249000000001756c488b8c24f0000000498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70301000000498d77e0483b75107303ff55404989f748c746f80300000048bfc85a23c9a37f000048893e48895e08488b790848897e10488066ffbf4c8b0141f6c001740deb05e9300000004983c0027105ff5570ebf54d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049895910498971084d8901eb084c8b8c24f0000000488b8c2488000000488b4910488b09488b591048833b0574144889c648b8980323c9a37f0000488b5d0890ff13488b7308488bbc249800000048893e4c8b43104c8b9424f00000004d891048833c24017474498d57e8483b55107303ff55404989d748c742f8020000004889420848893a524152ffb424f8000000ffb424f8000000ffb424f8000000ffb424f8000000ffb424f8000000ffb424f8000000ffb424f8000000ffb424f80000004c8b9424b00000004c8b8c24a80000004c8b8424a0000000eb05e944000000488b9c2498000000488b8424f00000009090e896f0ffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084881c4a8000000c248006a016a015041515741524151ff742470ff742448524c8d5424404c8b4c247849b8505c23c9a37f0000488b9c2490000000488b442430909090ff15ea030000f68424b0000000017407488b442410eb6b48c7c001000000488b8c24b0000000f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdd4989c248bbf05c23c9a37f0000488b44246090ff1596030000488b0c24488b4910488b0948c7c201000000f6c1017541488b19498d77e8eb05e928010000483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebba4889d14889c34889c890ff1536030000483b1d370300007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15f2020000505348bb085d23c9a37f00004c89d0909090ff15e2020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c7411001000000584883c40848894108488b442410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b8c24b80000004883c408f6c10174064883c1027105ff5570ebf5498d57d0483b55107303ff55404989d748c742f8020000005b4883c41048895a0848890a488d4a1848c741f80200000048894108488b8424980000004889015251ffb42400010000ffb42400010000ffb42400010000ffb42400010000ffb42400010000ffb42400010000ffb42400010000ffb42400010000ffb424000100004c8b9424b80000004c8b8c24b00000004c8b8424a8000000488b9c24a0000000488b8424f80000009090e8b6edffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f80200000048894808594889084881c4a8000000c2480048c7c001000000c2480090900000000000000000a812000000000000|@11643,2097151,@19308,@100,@11644,@11645,@20135,@20135,@20135,@20135,@11661,@11662,@11663,@11672,@1354,@2211,@11674,@2211,@194,@109,@11677,@1354,@2561,@11681,@11686,@11687,@11693,@11577,@7326,@11699,@2258,I48,@11700,@11701,@11631,@100,@2258,I48,@11012,@1354|178,0,@11566 233,0,@441 395,0,@2635 488,0,@2690 529,0,@1486 574,0,@1486 598,0,@441 678,0,@441 906,0,@437 1337,0,@11569 1561,0,@6844 1663,0,@11570 2099,0,@11573 2136,0,@193 2176,0,@3243 2347,0,@2560 2895,0,@11575 2994,0,@11621 3024,0,@2630 3349,0,I48 3402,0,@971 3620,0,@11624 3750,0,@11550 4024,0,@11625 4126,0,@11628 4269,0,I48 4311,0,@971 4338,0,@11629 11566:O4|@20055,@557,@11568,@11567 11567:O5|@11418,1205,0,1205,0 11568:S23|6261646c7920666f726d65642070617273652074726565 11569:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19273,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11570:O4|@20055,@557,@11572,@11571 11571:O5|@11418,127,0,127,0 11572:S10|6d6b4172675475706c65 11573:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@11574,15,@19274| 11574:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329666e4d6b41646472283129 11575:O4|@11577,@11610,@11614,@11576 11576:O4|3,@11618,@2450,1 11577:D45,9776|488dbc24f0feffff483b7d187303ff5550488b4c2410488b716840f6c6017540488b3e4c8b1f4c3b1d1b260000751f4d8d67f04c3b65107303ff55404d89e749c74424f80100000049893c24eb194c8b66084c89e6483b65187303ff5548ebba49c7c4010000004983fc01756c48be98c809c9a37f000040f6c6017540488b3e4c8b1f4c3b1dc6250000751f4d8d67f04c3b65107303ff55404d89e749c74424f80100000049893c24eb194c8b66084c89e6483b65187303ff5548ebba49c7c4010000004983fc01751b4889c648b8c0cf09c9a37f0000eb05e934000000488b5d0890ff13498b3424488b3e483b3d6525000074144989c348b878e107c9a37f0000488b5d0890ff1348837e10017542eb2a498b3424488b3e483b3d4025000074134989c348b878e107c9a37f0000488b5d08ff1348837e10017516488b5424204889c34889d04889da5b4883c42853ff224d8d5fb04c3b5d107303ff55404d89df49c743f8020000004c8b6c24284d896b0849891b4d8d731849c746f80300000049c74610010000004d895e0849c706050000004d8d5e2049c743f80200000049c74308010000004d89334989c65248c7c00100000090ff15aa240000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bad8fa21c9a37f0000488951104889410848c7010700000041564153534152415141505148c7c003000000488b54244890ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b4c2450488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084889305652488b5108909090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048ba484a23c9a37f0000488950084889089090ff156e230000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c701070000005148c7c003000000488b542458ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b4c2460488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5c24084889185652488b51089090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048ba604a23c9a37f0000488950084889089090ff153a220000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c701070000005148c7c003000000488b542468ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b4c2470488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5c24184889185652488b51089090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048ba784a23c9a37f0000488950084889089090ff1506210000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c701070000005148c7c003000000488b542478ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b8c2480000000488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5c24284889185652488b5108909090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048ba904a23c9a37f0000488950084889089090ff15ce1f0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048bae07009c9a37f0000488951104889410848c701070000005148c7c003000000488b94248800000090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b8c2490000000488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5c24384889185652488b5108909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424a0000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542438488910514889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424a8000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542430488910514889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424b0000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542428488910514889daff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424b8000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542420488910514889daff12498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c7400801000000488908488d481848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c7001d000000f6c1017406ff15261c0000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9a84a23c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014889c8909090ff15c21b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47d0483b45107303ff55404989c748c740f8020000004889480848c70005000000488d481848c741f80200000048c74108010000004889014883f9017506488b0424eb0d4889cb488b0424ff153e1b00004883f8017507488b442410eb0f4889c3488b44241090ff152a1b00004883f8017507488b442420eb0f4889c3488b44242090ff15161b00004883f8017507488b442430eb0f4889c3488b44243090ff15021b00004883f8017507488b442440eb0f4889c3488b44244090ff15ee1a0000488b8c24a80000004883c40850ff7108ff7110488b8424b0000000488b11ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808488b4c2460488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15321a0000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048bac84a23c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb6d5048c7c003000000488b9424b80000009090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba084b23c9a37f000048891148894108488b9424c800000048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f8040000005e48897318eb05e9370000004889431048c743080100000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808498d47a0483b45107303ff55404989c748c740f804000000488b4c247848894818488b8c24d000000048894810488b9424880000004889500848c70005000000488d582848c743f802000000488b74241048897308488903488d431848c740f80300000048895810488b74241848897008488b742408488930488bbc24c00000004c8b0741f6c001740af6070174054c2b077105ff5570ebf64983c0014989c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004c8940084c8b4424684c8900415153488b57089090ff12498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80300000048c74010010000005a4889500848c70005000000498d57d0483b55107303ff55404989d748c742f80200000048c7420801000000488902488d421848c740f8020000004889500848ba40f506c9a37f0000488910498d57e8483b55107303ff55404989d748c742f8020000004889420848890a4889d090ff15be170000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000488b8424c8000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542470488910514889da9090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010900000051488b8424d8000000488b54242090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480848b9f8fa21c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584889014889c8909090ff1592160000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000488b8424d0000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542478488910514889da9090ff12498d4f98483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80300000048c7401001000000488b9424e80000004889500848c70005000000488d582048c743f80200000048c7430801000000488903488d431848c740f8020000004889580848bba0d906c9a37f0000488918498d5fe8483b5d107303ff55404989df48c743f8020000004889430848890b4889d89090ff155e150000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c701070000005148c7c003000000488b9424d000000090ff12488b8c24c0000000498d57c0483b55107303ff55404989d748c742f804000000488b591848895a184889421048c742080100000048c70203000000488d722848c746f80200000048c7460801000000488916488b9424e0000000488b3a40f6c701740af602017405482b3a7105ff5570ebf64883c7014989c0498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488978084c8900564150488b7a084889faff12498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80400000048c74018010000004889481048c740080100000048c7001b000000488b8c24f0000000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b142448891053488b51089090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000004889cb488b8424c8000000ff1596130000498d4fb0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f8040000004889481848b980d606c9a37f000048894810594883c4084889480848c70003000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424184889510848c70105000000498d57e8483b55107303ff55404989d748c742f802000000488b5c241048895a0848c70205000000498d5fe8483b5d107303ff55404989df48c743f802000000488b7424084889730848c70305000000498d7788483b75107303ff55404989f748c746f80200000048c746080100000048891e488d5e1848c743f80200000048897308488913488d531848c742f80200000048895a0848890a488d4a1848c741f8020000004889410848c70105000000488d411848c740f80200000048c74008010000004889084883f8017506488b0424eb134889d64889c3488b0424ff15361200004889f24883f80174124889c34889d0909090ff15261200004889c24883fa017507488b442428eb104889d3488b4424289090ff150e120000488b8c24e80000004883c420488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b54246048891053488b5108909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424d0000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542478488910514889daff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b840f506c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff15ae100000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000488b8c24d0000000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b54245848891053488b5108909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424d8000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b942480000000488910514889da90ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8f8fa21c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff15f20e0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000488b8c24d8000000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b54245048891053488b5108909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424e0000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b942488000000488910514889da90ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8a0d906c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff15360d0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000488b8c24e0000000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b54244848891053488b5108909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b8424e8000000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b942490000000488910514889da90ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c74008010000005a488910498d57e8483b55107303ff55404989d748c742f8020000004889420848b8a84a23c9a37f0000488902498d47e8483b45107303ff55404989c748c740f80200000048895008488908909090ff157a0b0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba88b821c9a37f0000488951104889410848c70107000000498d47b8483b45107303ff55404989c748c740f8020000004889480848c70005000000488d481848c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f80200000048894808594889085048c7c003000000488b9424c8000000909090ff12498d4fd8483b4d107303ff55404989cf48c741f80400000048baf09e0ac9a37f0000488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a505248c7c003000000488b9424d800000090ff12488b8c24c8000000498d57c0483b55107303ff55404989d748c742f804000000488b591048895a184889421048c742080100000048c70203000000488d722848c746f80200000048c7460801000000488916488b9424e8000000488b3a40f6c701740af602017405482b3a7105ff5570ebf64883c7014989c0498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488978084c8900564150488b7a084889faff12498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80400000048c74018010000004889481048c740080100000048c7001b000000488b8c24f8000000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b142448891053488b51089090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000004889cb488b8424d0000000ff15b2080000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488b842400010000488b10f6c201740af600017405482b107105ff5570ebf64883c201488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b542420488910514889daff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c7400801000000488908ff15f2070000498d4fb0483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488d412848c740f8040000004889481848b980d606c9a37f000048894810594883c4084889480848c70003000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c740080100000048890848837c241801740c488b5c241890ff154e0700004883f8017506488b0424eb104889c3488b0424909090ff153a0700004883f8017507488b442408eb0f4889c3488b44240890ff1526070000488b8c24f00000004883c410488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b142448891053488b5108ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f8020000004889480848c7001700000048833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c7001500000050488b442428488b9424c800000090ff12498d4fe0483b4d107303ff55404989cf48c741f8030000005a4883c410488951104889410848c7010b0000005148c7c003000000488b9424d00000009090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b8c24d8000000488b19f6c301740af601017405482b197105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084889305652488b5108ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000006a016a01ffb424f8000000ffb424f0000000ffb424d0000000ffb424200100004c8d54242049b9c84b23c9a37f00004c8b8424d80000004889cb488b84242001000090ff15fe0400006a016a014989e24c8b8c24f80000004c8b842408010000488b5c2418488b44241090ff15de04000048c7c003000000488b9424f8000000909090ff12488b8c24e8000000498d57d8483b55107303ff55404989d748c742f804000000488b490848894a184889421048c742080100000048c70203000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488911488b942408010000488b1af6c301740af602017405482b1a7105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084889305156488b5a084889da9090ff12498d4fc0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80400000048c74018010000004889481048c740080100000048c7001b000000488b8c2418010000488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b142448891053488b51089090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000004889cb488b8424f0000000ff1542030000498d4fb0483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f8040000004889481848b980d606c9a37f000048894810594883c4084889480848c70003000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c74008010000004889084883f8017506488b0424eb0d4889c3488b0424ff159a0200004883f8017507488b442408eb0f4889c3488b44240890ff158602000048837c243801740c488b5c243890ff157a0200004883f8017507488b442428eb0f4889c3488b44242890ff15660200004883f8017507488b442440eb0f4889c3488b44244090ff15520200004883f8017507488b442470eb0f4889c3488b44247090ff153e020000488b8c24100100004883c430488b11f6c201740af601017405482b117105ff5570ebf64883c2014889c3498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488b142448891053488b5108ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010900000048833c2401750d4889c84881c4d0000000c22800498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004881c4d0000000c2280090909090909000000000000000002826000000000000|@11589,1048575,@19278,@20135,@20135,@20135,@20135,@2166,@2166,@2166,@2166,@2166,@2211,@2166,@11590,@11591,@11592,@11593,@11594,@2211,@2166,@2166,@2166,@2166,@11595,@11596,@11597,@2166,@2166,@2166,@2166,@2166,@2166,@11598,@11599,@11600,@11601,@11110,@2166,@11605,@11606,@11607,@11608,@11609,@11588|111,0,@2635 207,0,@2690 250,0,@1486 295,0,@1486 480,0,@11111 747,0,@11578 804,0,@2450 1063,0,@11579 1120,0,@2450 1379,0,@11580 1436,0,@2450 1699,0,@11581 1756,0,@2450 2719,0,@11582 2808,0,@11027 3263,0,@11583 3348,0,@11584 3806,0,@686 3892,0,@11027 4111,0,@11112 4200,0,@11027 4429,0,@536 4516,0,@11027 5011,0,@509 5671,0,@686 5756,0,@11027 6123,0,@11112 6208,0,@11027 6575,0,@536 6660,0,@11027 7027,0,@11582 7112,0,@11027 7324,0,@3172 8064,0,@509 8752,0,@11585 9311,0,@509 11578:O2|@686,0 11579:O2|@11112,0 11580:O2|@536,0 11581:O2|@11582,0 11582:O3|2,5,0 11583:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19275| 11584:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19276| 11585:O1|@11586 11586:D3,64|4889c1498d47d8483b45107303ff55404989c748c740f8040000004c894018488958104889480848c70001000000c39000000000000000003800000000000000|@11587,75,@19277| 11587:S57|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e7472792834292d45 11588:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19298| 11589:S35|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029 11590:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19279| 11591:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19280| 11592:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19281| 11593:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19282| 11594:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19283| 11595:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19284| 11596:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19285| 11597:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19286| 11598:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19287| 11599:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19288| 11600:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19289| 11601:D4,584|483b65187303ff55484152ff7008ff70104150415153488b08488b4424504889ca909090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff159a010000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba405523c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb725048c7c003000000488b54245890ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba805523c9a37f000048891148894108488b54246048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f8040000005e488973184889431048c7430801000000eb05e92b00000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e0488948084c8b442418488b5c2440488b442448488b542410ff12498d4fc8483b4d107303ff55404989cf48c741f802000000488b54242048895108488901488d411848c740f80300000048894810488b4c242848894808488b4c2408488908488b4c24305a4883c4284889114889410848c7c0010000004883c408c2200090909090909000000000000000004002000000000000|@11604,1048575,@19292,@2211|239,0,@11602 320,0,@11603 11602:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19290| 11603:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19291| 11604:S55|44454255474745525f28292e7772617046756e6374696f6e496e446562756728313029616464537461727445786974456e747279283429 11605:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19293| 11606:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19294| 11607:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19295| 11608:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19296| 11609:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19297| 11610:O4|3,@11611,@2450,1 11611:O2|@11612,@2452 11612:O2|@11613,1 11613:O3|2,@20197,0 11614:O4|3,@11615,@2450,1 11615:O2|@11616,@2452 11616:O2|@11617,1 11617:O3|2,@20198,0 11618:O2|@11619,@2452 11619:O2|@11620,1 11620:O3|2,@20199,0 11621:O4|@20055,@557,@11623,@11622 11622:O5|@11418,1424,0,1424,0 11623:S23|417267756d656e74206c656e6774682070726f626c656d 11624:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19299,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11625:O1|@11626 11626:D3,24|48c7c001000000c300000000000000001000000000000000|@11627,1,@19300| 11627:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296261736546756e2d283129 11628:S3|285029 11629:O1|@11630 11630:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19301|2,0,@441 11631:D14,1312|483b65187303ff554841f6c1017568498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048be006323c9a37f000048893248894a08488b700848897210488062ffbf488b3840f6c701740d4883c702eb05e9210200007105ff5570ebee4d8d5fe04c3b5d107303ff55404d89df49c743f80300000049894b104989530849893b4989cc4d8b69084989fe41ff3141504889d948bb886423c9a37f00004889c8909090ff156a040000498d4fd8483b4d107303ff55404989cf48c741f80400000048baa06423c9a37f00004889115a488951085a488951104c897118488061ffbf6a016a014152504154ff742458ff742458ff742458ff742458ff742458ff7424584c8d5424484d89e94989c84889c34c89d890e8c2feffff58488b0048c7c101000000a801753a488b10498d5fe8483b5d107303ff55404989df48c743f80200000048894b08488b0a48890b4889d9488b50084889d0483b65187303ff5548ebc24889c89090ff15ae030000488b0c24483b0dab0300007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cbff1566030000505348bbe06723c9a37f000048c7c003000000909090ff1552030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424284889513048c741280100000048894120488b4424084889411848c7411001000000584883c41048894108488b442408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b0c2448890148c741080100000048c7c0010000004883c418c23000488b4c2430f6c10174064883c1027105ff5570ebf5488b542428488b18f6c301740af602017405482b1a7105ff5570ebf64883c3014889c6498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488958084889084152415056488b5608909090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000ff3424ff742440ff352602000051488d5c2408488b442450909090ff151a02000050488b442428488b542430909090ff1248837c245003756748833c2401740d488b1c24909090ff15f6010000498d4fd8483b4d107303ff55404989cf48c741f804000000488b54244848895118488b5c2408488959104889410848c70107000000488b44243848890848c740080100000048c7c0010000004883c440c230004889c3488b0424ff159e0100004883f80174154889d94889c34889c8909090ff158e0100004889c3498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488b4c2408488948104889580848c70007000000498d4fb8483b4d107303ff55404989cf48c741f80500000048894120488b4424504889411848c741100100000048c741080100000048c70101000000488d513048c742f80200000048c742080100000048890a5248bb386823c9a37f000090ff15fa000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d00000048833c2401742e4889c8498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b04244889410848c70115000000488b4424404883c40848890848c740080300000048c7c0010000004883c440c2300000000000000000001805000000000000|@11703,1048575,@19338,@100,@2258,I48,@11012,@1354,@11704,@1354,@11706,@11707,@11702,@1354|76,0,@11632 186,0,@11633 232,0,@11634 425,0,I48 467,0,@971 494,0,@11639 1151,0,@11641 11632:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19302,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11633:S3|283129 11634:D7,360|483b65187303ff5548488b08f6c101740cf64218017406482b4a187105ff5570ebf54883c1014889c3498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889480848c700010000005352488b53089090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b0424f64010017546488b501048837a0801753b498d5fd0483b5d107303ff55404989df48c743f802000000488b324889730848890b488d4b1848c741f80200000048c7410801000000488919eb5c48c7c201000000488b5810f6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdc51ff35790000004889e34889d0909090ff1572000000488b4c24104883c410488b591090ff15660000004889c1488b042451488b5008488b44241090ff124883f8017506584883c410c34889c3584883c410ff254000000000000000000000006001000000000000|@11636,1048575,@19303,@11637,@1354,@1699,@11635| 11635:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19305| 11636:S75|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e732834296e6578745061726d73283129 11637:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048894810488b52084889500848c7000d000000c39000000000000000004000000000000000|@11638,7,@19304| 11638:S43|434f444547454e5f50415253455452454528292e6c6f61644172677346726f6d5475706c65283229283129 11639:O1|@11640 11640:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19306|2,0,@441 11641:O1|@11642 11642:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b940bf15c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@6847,3,@19307|41,0,@6867 11643:S52|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329 11644:D4,104|483b65187303ff5548a8017541ff7008488b0090ff156600000050488b44240890e8daffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c3909000000000000000006000000000000000|@1363,2097151,@19310,@11645| 11645:D8,1160|483b65187303ff5548488b0848babe6923c9a37f0000488d548afcffe290e9f3000000909090e9eb000000909090e9ee000000909090e92e010000909090e974010000909090e995010000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e976010000909090e99b000000909090e993000000909090e99d010000909090e99e010000909090e9de010000909090e973000000909090e96b000000909090e9a0020000909090e9da020000909090e953000000909090e94b000000909090e921030000909090e93b000000909090e933000000909090e912030000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e90300000090909048b840cd06c9a37f0000c3488b4008488b4010488b0048ba786e23c9a37f00009090ff15620300004883f0024889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b4008488b400848b940cd06c9a37f0000a8017534f6c101751848837908017511488b08ff7008488b0190e866feffffeb08488b50084889c8524889c158483b65187303ff5548ebc84889c8c3488b4808ff7108488b4110909090e836feffffa801750d4883780801750658e925feffff4883c408c3488b4010e917feffff488b4008a80174144889c148b8d88616c9a37f0000488b5d0890ff1348837808017508488b00488b00eb0f488b4008483b65187303ff5548ebcae9d8fdffff488b4008e9cffdffff488b4008488b4010488b0048ba786e23c9a37f00009090ff155a0200004883f0024889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b4010488b004889c1488339077528488b4910488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f102eb1f4883390d7512488b4908488b09483b65187303ff5548ebba48c7c1010000004883f901740b48b840cd06c9a37f0000c34883380b7531488b4018488b4010488b480848833905741048b8a07223c9a37f0000488b5d08ff13488b4110483b65187303ff5548ebc94883380d7512488b4008488b00483b65187303ff5548ebb14883380774134889c148b8307323c9a37f0000488b5d08ff13488b4008ff255d010000488b4008488b0048ba786e23c9a37f0000ff154e0100004883f0024889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b4008488338017516488b0848b8b87323c9a37f0000488b5d08909090ff13488b00a80174154889c148b8d88616c9a37f0000488b5d089090ff1348837808017508488b00488b00eb0f488b4008483b65187303ff5548ebc9e90cfcffff488b4008e903fcffff488b4010488b004883380b7532488b4018488b4010488b480848833905741148b8a07223c9a37f0000488b5d0890ff13488b4110483b65187303ff5548ebc84883380d7512488b4008488b00483b65187303ff5548ebb04883380774134889c148b8307323c9a37f0000488b5d08ff13488b4008ff25490000009000000000000000008004000000000000|@11659,2097151,@19311,@11647,@11647,@11660,@11647,@11658|14,0,$11645+30 280,0,@441 302,0,@11646 371,0,@441 502,0,@7089 574,0,@11646 728,0,@441 763,0,@11649 827,0,@11652 860,0,@11646 932,0,@11655 961,0,@7089 1054,0,@11649 1119,0,@11652 11646:O11|@11647,@20085,@469,@1587,@1597,@1605,@477,@20056,@20089,@20087,@20051 11647:D4,872|483b65187303ff5548529090ff156e030000488338097563488b48084883f901750948c7c101000000eb3a488b11488b5a10488b730848833e037517488b3c244c8b47504c3b4608750948c7c103000000eb12488b79084889f9483b65187303ff5548ebb74883f901742c488b0424498d4ff0483b4d10730aeb05e96f020000ff55404989cf48c741f801000000488b5010488911eb63488b48084883f901750948c7c101000000eb3a488b11488b5a10488b730848833e037517488b3c244c8b47084c3b4608750948c7c103000000eb12488b79084889f9483b65187303ff5548ebb74883f901742c488b0424498d4ff0483b4d10730aeb05e99b010000ff55404989cf48c741f801000000488b5018488911eb63488b48084883f901750948c7c101000000eb3a488b11488b5a10488b730848833e037517488b3c244c8b47484c3b4608750948c7c103000000eb12488b79084889f9483b65187303ff5548ebb74883f901742c488b0424498d4ff0483b4d10730aeb05e91c010000ff55404989cf48c741f801000000488b5020488911eb63488b48084883f901750948c7c101000000eb3a488b11488b5a10488b730848833e037517488b3c244c8b47404c3b4608750948c7c103000000eb12488b79084889f9483b65187303ff5548ebb74883f901742c488b0424498d4ff0483b4d10730aeb05e99d000000ff55404989cf48c741f801000000488b5028488911eb63488b40084883f801750948c7c001000000eb3a488b08488b5110488b5a0848833b037517488b3424488b7e38483b7b08750948c7c003000000eb12488b70084889f0483b65187303ff5548ebb74883f801742c488b0424498d4ff0483b4d10730aeb05e91e000000ff55404989cf48c741f801000000488b5030488911eb0748c7c1010000004883f901750c48c7c0010000004883c408c3488b09488b4110488b500848833a037526488b1c24488b7208483b7308740c48c7c0010000004883c408c348c7c0030000004883c408c348c7c0010000004883c408c34883380b755748837808017544488b4018488b4810488b510848833a037526488b1c24488b7208483b7308740c48c7c0010000004883c408c348c7c0030000004883c408c348c7c0010000004883c408c348c7c0010000004883c408c348c7c0010000004883c408c300000000000000006003000000000000|@11648,2097151,@19309,@1401| 11648:S27|545950455f5452454528292e6973466c6f6174696e675074283129 11649:O4|@20055,@557,@11651,@11650 11650:O5|@1338,97,0,97,0 11651:S33|74634571756976616c656e743a204e6f74206120747970652066756e6374696f6e 11652:O4|@20055,@557,@11654,@11653 11653:O5|@1338,2978,0,2978,0 11654:S26|656e7472794e756d626572202d206e6f742061207265636f7264 11655:O4|@20055,@557,@11657,@11656 11656:O5|@11418,178,0,178,0 11657:S26|7475706c6557696474683a20656d707479206c6f63616c646563 11658:D4,128|483b65187303ff5548a8017555488b08ff7008488b410848ba786e23c9a37f0000909090ff156e0000004883f00250488b44240890e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,2097151,@19313,@11647|25,0,@11646 11659:S33|434f444547454e5f50415253455452454528292e7475706c655769647468283129 11660:D4,128|483b65187303ff5548a8017555488b08ff7008488b410848ba786e23c9a37f0000909090ff156e0000004883f00250488b44240890e8c6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,2097151,@19312,@11647|25,0,@11646 11661:D3,136|483b65187303ff5548a801755d48c7c101000000488b10f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc51488b400890e8baffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,7,@19314| 11662:D3,384|483b65187303ff5548a8017565488b08488b114883fb037524f602017417488b700848b8e81f08c9a37f0000488b5d08909090ff13488b32488b3eeb62498d77f0483b75107303ff55404989f748c746f801000000c646ff4048bf30e306c9a37f000048893e498d7fd8483b7d10730aeb05e9eb000000ff55404989ff48c747f8040000004c8b41104c89471848897710488b324889770848c707330000004d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049b9d09507c9a37f00004d89084d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049bad09507c9a37f00004d89114d8d57c84c3b55107303ff55404d89d749c742f8060000004c8b59184d895a284c8b61104d8962204d894a184d89421049897a08488b790849893a41524c8b40084c89c09090e8c2feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007801000000000000|@1363,2047,@19315|36,0,@1625 91,0,@573 190,0,@1394 232,0,@1394 11663:D8,168|483b65187303ff5548f6c301752e4883f8017505488b03eb17488b7308488b0b4889c34889c89090ff1592000000eb04488b73084889f3e9c4ffffff41515048bb287923c9a37f00004c89c0ff157600000048837c240803751a4883f8017506584883c408c34889c3584883c408ff255c000000ff155e0000004883f8017506584883c408c34889c3584883c408ff254c000000909090900000000000000000a000000000000000|@11668,1048575,@19317,@11669,@1354,@11670,@11671,@11667|65,0,@11664 11664:O1|@11665 11665:D3,24|48c7c003000000c300000000000000001000000000000000|@11666,1,@19316| 11666:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229706f6c795061726d732d283129 11667:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19321| 11668:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6541726773283229 11669:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19318| 11670:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19319| 11671:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b840cd06c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@19320|64,0,@441 11672:D3,144|a8017410f6420801740a488d40ff480342087105ff5570ebf1a80174084883f8017c08eb1cf640ff1074164889c148b8f0a115c9a37f0000488b5d08909090ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c39090909000000000000000008800000000000000|@11673,7,@19322|48,0,@6844 11673:S36|434f444547454e5f50415253455452454528292e6d6b4172675475706c65283229283129 11674:D6,632|483b65187303ff5548a801756e4c89c1f6c101740af6c3017405482bcb7105ff5570ebf64883c10148c7c201000000488b3040f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdbf6c101740af6c2017405482bca7105ff5570ebf64883c10148c7c201000000488b30eb05e9da01000040f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdb4883fa037566f6c10174084883f9017c08eb1df641ff107417488b5008488b3048b8f0a115c9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70201000000488d4a1848c741f8020000004889510848c70109000000eb6ff6c20174084883fa017e08eb1ff642ff107419488b7008488b3848b8202123c9a37f0000488b5d089090ff1351ff354c0100004150ff700853ff30488d5c24204889d0ff153e010000498d4fe0483b4d107303ff55404989cf48c741f80300000048c741100100000048894108eb05e94a00000048c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801741a4889c8ff15d60000004889c1eb0c6a016a014150ff700853ff3048c7c0010000005af6c201751ea80174064883c0027105ff5570ebf5488b5208483b65187303ff5548ebdda8017410f6042401740a488d40ff480304247105ff5570ebf1514c8b4424184889c3488b442410e8cefdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c428488908c348c7c001000000c390909090909000000000000000007002000000000000|@11676,1048575,@19323,@11675,@1354,@2211|199,0,@6844 301,0,@11570 11675:D3,144|a8017410f6420801740a488d40ff480342087105ff5570ebf1a80174084883f8017c08eb1cf640ff1074164889c148b8f0a115c9a37f0000488b5d08909090ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c39090909000000000000000008800000000000000|@11673,7,@19324|48,0,@6844 11676:S71|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296172674c6973742d6d616b6541726773283229 11677:D3,104|4889c1498d47c8483b45107303ff55404989c748c740f80600000048bb788123c9a37f0000488918488b5a0848895808488b721048897010488b7a184889781848894820488b4a2048894828488060ffbfc390909090909000000000000000006000000000000000|@11680,63,@19326|29,0,@11678 11678:D3,224|483b65187303ff5548488b4a20f6c1017410f6422801740a488d49ff48034a287105ff5570ebf1f6c101740cf64218017406482b4a187105ff5570ebf54883c101f6c101740cf64210017406482b4a107105ff5570ebf54883c101488b18f6c301740cf64208017406482b5a087105ff5570ebf54883c301488b5008498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889580848890890ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c39090900000000000000000d800000000000000|@11679,1048575,@19325| 11679:S67|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129283129 11680:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e4465637328332961726741646472732d283129 11681:D3,304|a80175654c89c1f6c1017540488b11488b32488b384c8b0e4c3b0f751d4d8d57f04c3b55107303ff55404d89d749c742f801000000498912eb194c8b51084c89d1483b65187303ff5548ebbb49c7c2010000004983fa0175684889d9f6c1017547488b11488b32eb05e9ae000000488b384c8b0e4c3b0f751d4d8d57f04c3b55107303ff55404d89d749c742f801000000498912eb194c8b51084c89d1483b65187303ff5548ebb449c7c2010000004983fa017555498d4fe8483b4d10730aeb05e944000000ff55404989cf48c741f80200000048ba808423c9a37f000048895108488b104889114889de498d5fe8483b5d107303ff55404989df48c743f8020000004889730848890b488b4008483b65187303ff5548e9e4feffff4889d8c300000000000000002801000000000000|@11685,511,@19328|214,0,@11682 11682:O1|@11683 11683:D3,32|48b8c87809c9a37f0000c3909090909000000000000000001800000000000000|@11684,1,@19327|2,0,@2514 11684:S87|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229636865636b506f6c796d6f72706869736d283229283129 11685:S64|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329616464457874726173283229 11686:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19329| 11687:D6,896|483b65187303ff5548a801755ff6c301755f41f6c001755e49833801755d488b08488b5110488b12488b721048833e057417488b480848b8980323c9a37f0000488b5d08909090ff13488b7e084c8b1b4c891f4c8b66104d8914244c8b6c24304c8b742428488b4c2420eb14e94d000000e948000000e943000000e93e0000004c8b5c2418488b542410488b7c24084c896c24304c8974242848894c24204c895c2418488954241048897c24084d8b4008488b5b08488b4008e942ffffffa8017564f6c301756441f6c00175634152415141ff7008ff7308ff7008ff30ff33498b004c8b442460488b5c2468ff15a6020000488b4c2458488b09488b542458488b12f6c20174064883c2027105ff5570ebf5488b5c2458488913488b542430488b742450eb0fe93c020000e937020000e93202000040f6c601740af602017405482b327105ff5570ebf64883c60140f6c60174084883fe017c08eb19f646ff1074134889c748b8701e09c9a37f0000488b5d08ff1340f6c60174084883fe017e5feb06f646ff10755740f6c60174064883ee027105ff5570ebf54889c7498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897008488b34244889305157488b54245890ff12488b5c245090ff15c2010000eb55488b342440f6c60174084883fe017c08eb1bf646ff1074154889c748b8001f09c9a37f0000488b5d089090ff134889c7498d47e8483b45107303ff55404989c748c740f8020000004889700848c700050000005157498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488b442418488b4010488b00488b501048833a05741348b8980323c9a37f0000488b5d08909090ff13488b5a08488b742408488933488b7a104c8b4424704c89074989c958909090ff1502010000498d4f98483b4d107303ff55404989cf48c741f80400000048c74118030000004c8949104889410848c70107000000488d412848c740f804000000488948184889701048c740080100000048c70003000000488d482848c741f802000000488b5424304883c41848895108488901488b442458488b542448488b5c2440488b742438488b7c243048894424584c89442450488954244848895c2440488974243848897c24304c8b5424204989c94c8b442410488b5c2408584883c420e999fcffff4c89c8c2300090909000000000000000007803000000000000|@11692,1048575,@19330,@11688,@2226,@2166|56,0,@11550 359,0,@2221 509,0,@2224 624,0,@11550 11688:D3,240|483b65187303ff5548a80175694889d9f6c1017540488b11488b32488b384c8b0e4c3b0f751d4d8d57f04c3b55107303ff55404d89d749c742f801000000498912eb194c8b51084c89d1483b65187303ff5548ebbb49c7c2010000004983fa01751b488b480848b8e88a23c9a37f0000488b5d08eb05e957000000ff134d8b12415053ff70084c89c0498b5208909090ff12504c8b442418488b5c2410488b442408909090e856ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c39090909090900000000000000000e800000000000000|@1363,1048575,@19331|104,0,@11689 11689:O4|@20055,@557,@11691,@11690 11690:O5|@11418,1367,0,1367,0 11691:S31|6372656174654d6174636865733a204d697373696e67207479706520766172 11692:S73|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296372656174654170706c69636174696f6e73283429 11693:D7,672|483b65187303ff554852ff72704c8b52604c8b4a504c8b42584889c3488b828000000090ff158e020000488b0c24498d57b8483b55107303ff55404989d748c742f808000000488b597848895a3848c7423001000000488b717048897228488b780848897a204c8b41684c8942184c8b49604c894a104c8b51584c8952084c8b59504c891aff304989d249c7c1010000004c8b4148488b5940488b4138488b5130909090ff1248833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c70015000000488b4c2408488379080375054883c410c3488b5128f6c20174064883ea027105ff5570ebf5488b5920f6c301740cf64120017406482b59207105ff5570ebf54883c301f6c30174084883fb017c08eb1af643ff1074144889c648b8701e09c9a37f0000488b5d0890ff13f6c30174084883fb017e5ceb06f643ff107554f6c30174064883eb027105ff5570ebf54889c6498d47e0483b45107303ff55404989c748c740f80300000048c74010030000004889580848891056488b511890ff12488b4c2410488b591090ff1516010000eb50f6c20174084883fa017c08eb1cf642ff1074164889c348b8001f09c9a37f0000488b5d08909090ff134889c3498d47e8483b45107303ff55404989c748c740f8020000004889500848c7000100000053498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000006a016a01488b442420514c8d44240848bbb88e23c9a37f0000488b400848bab89c15c9a37f00009090ff157a000000488b442410488060ffbf498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b44240848890141584883c4104889cb584883c410ff254000000000000000000000009802000000000000|@11698,2097151,@19333,@11109,@2226,@6835,@11697|310,0,@2221 452,0,@2224 560,0,@11694 574,0,@6834 11694:O1|@11695 11695:D3,24|48c7c003000000c300000000000000001000000000000000|@11696,1,@19332| 11696:S32|434f44455452454528292e6d6b536574436f6e7461696e65722d283329283129 11697:D3,344|483b65187303ff55484883380b7557415053ff7010488b4008e8e2ffffff504c8b442418488b5c2410488b442408909090e8caffffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594883c4184889480848c7000b000000c3488338177501c348833815753bff7008488b4010909090e87effffff4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810594889480848c70015000000c3488338037563415053ff7008ff7018488b4010e83affffff504c8b442420488b5c2418488b442408909090e822ffffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818594883c40848894810594883c4104889480848c70003000000c34889c1498d47d8483b45107303ff55404989c748c740f8040000004c894018488958104889480848c70019000000c3909000000000000000005001000000000000|@7005,75,@19334| 11698:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e44656373283329636f6465426f6479283129 11699:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19335| 11700:D3,128|483b65187303ff5548a8017555488b08488339097417488b500848b8103209c9a37f0000488b5d08909090ff13ff7108488b48084889c89090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@19336|28,0,@2260 11701:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19337| 11702:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19342| 11703:S63|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429 11704:D3,176|483b65187303ff5548488b4a10488b5a08488b3140f6c601740af603017405482b337105ff5570ebf64883c6014889c7498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048897008488938488b510890ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70109000000488d411848c740f80200000048c7400803000000488908c3909090909090900000000000000000a800000000000000|@11705,1048575,@19339| 11705:S76|434f444547454e5f50415253455452454528292e636f646546756e42696e64696e67732833296c6f616446756e446563732833296d616b6546756e73283429706f6c795061726d732d283129 11706:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19340| 11707:D3,96|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348b8783d16c9a37f0000c39090909090909000000000000000005800000000000000|@1353,3,@19341|64,0,@6994 11708:D5,120|483b65187303ff55486a016a014889e3ff157a000000488b042448c7c101000000a8017524ff70084c8b4424104889cb488b0090ff155e0000004889c158483b65187303ff5548ebd84889c84883f801740a584883c408e9a4ffffff48c7c0010000004883c410c300000000000000007000000000000000|@11710,8191,@19343,@11711,@11709| 11709:D6,160|483b65187303ff5548f64028017570488b4028488b08488b5110488b126a016a014989dc4c8b69104c8b314889e34889d0909090ff157e000000f604240174084c89e04883c410c3488b0424ff156e000000498b0e4883f901740b4889cb9090ff1562000000498906488b4424084989450048c7c0030000004883c410eb05e901000000c34889d8c39090909090909000000000000000009800000000000000|@11713,8191,@19345,@11714,@11715,@11712| 11710:S59|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129 11711:D3,304|483b65187303ff5548a801756a488b08f6412801753b488b5128488b32488b3e488b3f4883ff01751f488b7e08488b3f4883ff01740948c7c701000000eb1948c7c703000000eb1048c7c701000000eb0748c7c7010000006a016a01535157488d5c2418488b400890e892ffffff48833c2401744deb05e98c000000498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b4c2408488908488b4c2410488901488b4424204889410848c7c0010000004883c428c3498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2408488908488b4c2410488b5424184889114889410848c7c0010000004883c428c348c7030100000048c743080100000048c7c001000000c39000000000000000002801000000000000|@1464,63,@19344| 11712:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19348| 11713:S68|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c756573283229636865636b52656673283129757064617465283229 11714:D3,392|483b65187303ff5548a8017559488b084c89c2ff7108f6c201755e488b0a488b31483b3424745740f6c6017556f604240175554c8b0c2441f6c101740948c7c703000000eb08498b39488d7c3f014883c7104989fa4c89cf4c8b194c89d148d1e9483bc9eb05e9f6000000f3a6488d7c3f01488d743601eb14e931000000e911000000e915000000e910000000488d4c0901750948c7c103000000eb19488b5208483b65187303ff5548e967ffffff48c7c1010000006a016a0153ff3051488d5c2418488b40089090e832ffffff48833c24017446498d47e8483b45107303ff55404989c748c740f802000000488b4c241848894808488b4c2408488908488b4c2410488901488b4424204889410848c7c0010000004883c430c3498d47e8483b45107303ff55404989c748c740f802000000488b4c242048894808488b4c2408488908488b4c2410488b5424184889114889410848c7c0010000004883c430c348c7030100000048c743080100000048c7c001000000c300000000000000008001000000000000|@1464,1023,@19346| 11715:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19347| 11716:S46|434f444547454e5f50415253455452454528292e7265706f7274556e7265666572656e63656456616c7565283229 11717:O5|@12004,@11546,@8280,@10948,@12003 11718:D22,2120|488dbc2440ffffff483b7d187303ff555048c7c1010000004889de40f6c601751ff6c10174064883c1027105ff5570ebf5488b7608483b65187303ff5548ebdb498b32488b7e6840f6c701753f4c8b1f4d8b234c3b2506080000751e4d8d6ff04c3b6d107303ff55404d89ef49c745f8010000004d895d00eb194c8b6f084c89ef483b65187303ff5548ebbb49c7c5010000004983fd01756b48bf98c809c9a37f000040f6c701753f4c8b1f4d8b234c3b25b2070000751e4d8d6ff04c3b6d107303ff55404d89ef49c745f8010000004d895d00eb194c8b6f084c89ef483b65187303ff5548ebbb49c7c5010000004983fd01751c4889c748b8c0cf09c9a37f0000eb05e935000000488b5d089090ff13498b7d004c8b1f4c3b1d5107000074144989c448b878e107c9a37f0000488b5d0890ff1348837f10017466eb2a498b7d004c8b1f4c3b1d2c07000074134989c448b878e107c9a37f0000488b5d08ff1348837f1001746a4989dc49c7c6010000005250535141f6c4017530498b04244c89f3488b48084889c89090ff15ee0600004989c64d8b642408483b6518730aeb05e950000000ff5548ebca4c89f0415241ff32415141ff722841ff721041ff72084150a8017526ff7008488b5c2430eb05e920000000488b009090ff15a606000058483b65187303ff5548ebd648c7c001000000eb224989c448c7c0010000005241545351415256415141ff722841ff721041ff72084150f644244001741148b8a8a523c9a37f0000488b5d0890ff13488b442440488b086a016a01488b54241048833a057541498d5fe8483b5d107303ff55404989df48c743f80200000048be00a623c9a37f000048893348895308488063ffbf4889e248c702010000004889e248895a08eb6fff712048c7c003000000488b542428ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba40a623c9a37f000048891148894108488b54242048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b7424184889731848894310eb05e93900000048c743080100000048c70303000000488d432848c740f80200000048c7400801000000488918488d5c2408488903488d44240848894808eb03ff7120488b442420488b54241090ff1250488b442458488b542430909090ff12488b4c2458f6c10174084883f9017d08eb1cf641ff107516f6c101740b483b0dc60400007c1deb06f641ff1075154889c248b820f007c9a37f0000488b5d089090ff13f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f488b442458488907488b442470498d4fc0483b4d107303ff55404989cf48c741f80700000048bb00a723c9a37f0000488919488b580848895908488b742450488971104c8b40104c894118488951204c8b4c24604c89492848897930488061ffbf4d8d57d84c3b55107303ff55404d89d749c742f8040000004c8b5c24384d895a184c8b5c24304d895a104c8b5c24284d895a084c8b5c24484d891a6a016a01575241524c8d54241841524989ca4c8b4c24384c8b442470488b5c2430488b84249000000090ff15e203000048837c241801746348837c2460017460488b442468488b4868f6c101753e488b11488b1a483b1dbf030000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe017568eb0ae9f7000000e9e900000048b998c809c9a37f0000f6c101753e488b11488b1a483b1d61030000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe017518eb05e93a00000048b8c0cf09c9a37f0000488b5d0890ff13488b0e488b11483b1506030000741148b878e107c9a37f0000488b5d0890ff1348837910017450eb26488b0e488b11483b15e5020000741048b878e107c9a37f0000488b5d08ff134883791001742849bac8b023c9a37f00004c8b4c24284c8b84248800000048c7c3010000009090ff15ae020000eb4648c7c001000000eb3d48837c246001740948c7c001000000eb2c49baf8b023c9a37f00004c8b4c24284c8b84248800000048c7c301000000488b442468909090ff156e020000488b442408488b0048c7c10100000050483b0c24720948c7c001000000eb5e4889c8a80174064883c0027105ff5570ebf5488b542410488b4482fc4883f801756a488b8424880000004889cba80174134889c648b8c0e406c9a37f0000488b5d08ff134883fb017509488b00488b4020eb26f6c301740d4883eb02eb05e9af0000007105ff5570ebee488b4008483b65187303ff5548ebb44889cbf6c30174064883c302710cff5570eb05e96a000000ebee51504889de48c7c3030000004889f048baa05f06c9a37f0000909090ff15a20100004889c348b828b123c9a37f000090ff159601000048bb40b123c9a37f0000ff158e0100004989c241594c8b84249800000048c7c301000000488b44247890ff1576010000eb0151584883c0024889c1483b65187303ff5548e9dffeffff488b8424980000004883c408ffb42488000000ff742478ff7010ff70084c8b9424880000004c8b4c242849c7c003000000488b5c2420488b8424a0000000909090ff151e0100004883f8017507488b442430eb0f4889c3488b44243090ff150a0100004883f801750d4883c410584881c480000000c34889c1498d47e0483b45107303ff55404989c748c740f803000000488b542410488950104889480848c700150000004881c498000000c300000000000000003808000000000000fdffffffffffff01|@11738,2097151,@19357,@20136,@20136,@20136,@20136,@11729,@11553,@11739,@20137,@20137,@20137,@20137,@8347,@8347,@194,@100,@100,@8347,@11989,@11737|155,0,@2635 250,0,@2690 294,0,@1486 339,0,@1486 546,0,@11719 610,0,@11721 692,0,@11722 905,0,@1509 1033,0,@11723 1317,0,@2635 1414,0,@2690 1446,0,@1486 1487,0,@1486 1510,0,@11733 1576,0,@11734 1703,0,@578 1813,0,@193 1835,0,@11735 1852,0,@11736 11719:O4|101,@1386,0,@11720 11720:O5|@11418,324,0,324,0 11721:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19350| 11722:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19351| 11723:D12,1032|483b65187303ff5548a80174084883f8017d08eb22f640ff10751c488b4a30488b09a801740af6c1017405483bc1eb05ff5570ebf67c164889c148b838e407c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf5488b5a30488b4c8bfcf6c10174064883c1027105ff5570ebf5a80174084883f8017d08eb1ef640ff107518488b1ba801740af6c3017405483bc3eb05ff5570ebf67c164889c348b810f407c9a37f0000488b5d08909090ff134889c3f6c30174064883c3027105ff5570ebf5488b723048894c9efc6a016a016a01488b5a284889c7f6c30174164989c048b8c0e406c9a37f0000488b5d08909090ff134883ff017524488b3b4989e04c8b0f4d89084989e04c8b57084d8950084989e04c8b5f284d895810eb2040f6c70174064883ef027105ff5570ebf5488b5b08483b65187303ff5548eb9bf6c10174084883f9077f68eb06f641ff1074654989d048c7c301000000488b442408909090ff15ae020000498b48104150ff71284c8b51104c8b094c8b4108488b59209090ff15960200006a016a01488b4c2410ff30ff70084c8d442410488b5c242848b838ad0ac9a37f0000488b5118eb0ae94d010000e948010000ff12488b442420488b48104c8b51104c8b194c8b61084d89d8488b5c24105890ff1546020000ff7008ff304d89d94d89e0488b5c2418488b44244048ba507722c9a37f0000909090ff15260200004883f8017506488b0424eb104889c3488b0424909090ff15120200004883f8017507488b442410eb0f4889c3488b44241090ff15fe010000488b4c24284883c408488b5110498d5fb8483b5d107303ff55404989df48c743f808000000488b723848897338488b7a3048897b304c8b42284c89432841594883c4184c894b204c8b4a184c894b184c8b52104c8953104c8b5a084c895b084c8b224c89236a016a01504c8d442408488b442420488b51089090ff1248833c2401750a4883c408584883c428c3498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810488b0c244889480848c700150000004883c438c34989d04989c448c7c301000000488b4424089090ff152a0100009090ff152a01000041f6c401741241f6402001740b4d8d6424ff4d0360207105ff5570ebf041f6c40174084983fc017c0aeb1c41f64424ff1074144889c148b8f0a115c9a37f0000488b5d0890ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004c89610848c70105000000488d511848c742f80200000048894a0848c702090000004889d39090ff15a60000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c700070000004883c418c39090909090909000000000000000000004000000000000|@11728,2097151,@19352,@11729,@11109,@11526,@11336,@11731,@11732,@11729,@11724,@2166|60,0,@1493 168,0,@1517 236,0,@578 428,0,@3194 513,0,@11334 870,0,@6844 11724:D3,240|483b65187303ff5548a801756e488b08488b511048833a057417488b580848b890ac23c9a37f0000488b5d08909090ff13488b5a08488b1bf6c30174084883fb017c08eb1cf643ff107416488b700848b8f0a115c9a37f0000488b5d089090ff13498d77d0483b75107303ff55404989f748c746f802000000eb05e95600000048895e0848c70605000000488d5e1848c743f8020000004889730848c7030900000053488b70084889f0909090e84effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000e800000000000000|@1363,31,@19356|32,0,@11725 81,0,@6844 11725:O4|@20055,@557,@11727,@11726 11726:O5|@11418,376,0,376,0 11727:S7|6d616b65417267 11728:S56|434f444547454e5f50415253455452454528292e636f64654d61746368283529636f64655061747465726e45787072657373696f6e283129 11729:D3,536|483b65187303ff5548488b0848ba66ad23c9a37f0000488d548afcffe290e9f3000000909090e9eb000000909090e9e7000000909090e9db000000909090e9d3000000909090e9dc000000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e99d000000909090e9d4000000909090e9f6000000909090e904010000909090e963000000909090e95b000000909090e953000000909090e94b000000909090e902010000909090e93b000000909090e933000000909090e9f3000000909090e923000000909090e91b000000909090e913000000909090e90b000000909090e9030000009090904889d8c3488b4008488b4008e9d9feffff488b4010e9d0feffff488b4008488b4008488b0048837808017406f640080175044889d8c34889c1498d47e8483b45107303ff55404989c748c740f80200000048895808488908c3488b4018a801751e488b08ff7008488b4118e87afeffff4889c358483b65187303ff5548ebde4889d8c3ff7010488b400890e85afeffff4889c358e951feffff488b4010a801751aff7008488b00e83efeffff4889c358483b65187303ff5548ebe24889d8c3488b4008e922feffff488b4008a801751bff7008488b0090e80efeffff4889c358483b65187303ff5548ebe14889d8c390909000000000000000001002000000000000|@11730,15,@19353|14,0,$11729+30 11730:S41|434f444547454e5f50415253455452454528292e6765745661726961626c6573496e50617474283229 11731:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19354| 11732:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19355| 11733:S31|48616e646c6572206361746368657320616c6c20657863657074696f6e732e 11734:S27|4d61746368657320617265206e6f7420657868617573746976652e 11735:S8|5061747465726e20 11736:S14|20697320726564756e64616e742e 11737:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19437| 11738:S32|434f444547454e5f50415253455452454528292e636f64654d61746368283529 11739:D13,1088|483b65187303ff5548488b4c241048c7c2010000004889c640f6c601751ff6c20174064883c2027105ff5570ebf5488b7608483b65187303ff5548ebdb48bec8b623c9a37f000048c7c7030000005341524150415152ff31a801756e488b084889faf6c20174064883c2027105ff5570ebf56a016a016a01ff700852488d5c2410534c8b5424704c8b49204989f84889f3488b4108909090ff15ba030000498d47e0483b45107303ff55404989c748c740f803000000488b4c242048894810488b4c241848894808eb05e926000000488b4c24104889084889c1488b4424085f4883c4204889ce483b65187303ff5548e963ffffff4889f04889c74889f89090ff155a0300004883f801740948c7c003000000eb67488b0424488b4068a801753e488b08488b11483b153a030000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebbe48c7c3010000004883fb01756c48b898c809c9a37f0000a8017545eb05e9b3000000488b08488b11483b15e2020000751d498d5ff0483b5d107303ff55404989df48c743f80100000048890beb19488b58084889d8483b65187303ff5548ebb748c7c3010000004883fb01751948b8c0cf09c9a37f0000eb05e931000000488b5d089090ff13488b03488b08483b0d86020000741148b878e107c9a37f0000488b5d0890ff13488b48104889c8eb26488b03488b08483b0d65020000741048b878e107c9a37f0000488b5d08ff13488b48104889c84889c64883c4085b48c7c00300000090ff153e0200006a016a016a016a01564c8d54240849c7c10100000049b8e8b623c9a37f00004889c34889f890ff151a020000498d47d8483b45107303ff55404989c748c740f804000000488b4c242048894818488b4c241848894810488b4c241048894808488b4c240848890848833c2401744d6a016a016a016a014889e390ff15ce010000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908488b48104883c4284883f901750948c7c101000000eb60f6c10174144889c248b8e81f08c9a37f0000488b5d0890ff1348833901750948c7c103000000eb64f6c10174144889c248b8e81f08c9a37f0000488b5d0890ff13488b11f6c20174084883fa017e16eb06f642ff10750e48c7c101000000eb39e934000000f6c10174134889c348b8582008c9a37f0000488b5d08ff13488b51084889d1483b6518730aeb05e908000000ff5548e958ffffff4883f102498d57c8483b55107303ff55404989d748c742f80600000048bbf0b723c9a37f000048891a488b5c241848895a085e488972105e4889721848894a205e48897228488062ffbf514c8b4c24204989d0ff1592000000488b4c2418488901584883c4084889410848c7c001000000c210009090909090909000000000000000003804000000000000|@11754,2097151,@19361,@11755,@11915,@20135,@20135,@20135,@20135,@11917,@11919,@11926,@11753|63,0,@11740 366,0,@2635 462,0,@2690 502,0,@1486 543,0,@1486 609,0,@11741 806,0,@1625 846,0,@1625 907,0,@1628 979,0,@11744 11740:O3|0,@3659,0 11741:O1|@11742 11742:D3,144|48833801750948c7c001000000eb20f600017415488b0848b8e81f08c9a37f0000488b5d089090ff13488b00488b00498d4fc0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80400000048c74018030000004889481048c740080100000048b9b00607c9a37f0000488908c300000000000000008800000000000000|@11743,3,@19358|25,0,@1625 116,0,@803 11743:S47|4d415443485f434f4d50494c455228292e6275696c645061747465726e436f64652833296669726550617474283129 11744:D4,160|483b65187303ff55484883f801756748837a2001741348b8c0b823c9a37f0000488b5d08909090ff1348837a18017428498d47e8483b45107303ff55404989c748c740f802000000488b52084889500848c70017000000c34c8b421048bb90b923c9a37f000048b860ea20c9a37f0000ff2542000000a80174064883e8027105ff5570ebf5488b5228ff22909090909000000000000000009800000000000000|@11751,1048575,@19359,@11750|24,0,@11745 94,0,@11749 104,0,@10855 11745:O4|@20055,@557,@11747,@11746 11746:O5|@11748,1179,0,1179,0 11747:S33|636f646544656661756c742063616c6c6564206275742065786861757374697665 11748:S48|6d6c736f757263652f4d4c436f6d70696c65722f5061727365547265652f4d415443485f434f4d50494c45522e736d6c 11749:O3|2,101,0 11750:D5,520|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c70105000000498b00483b05e20100007439a80175484889c648bf509adc00000000004889ca48c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084889d1eb134889ca4983781001751a49837820017513eb054889caeb0c48b980d606c9a37f0000eb5d498d4fb0483b4d107303ff55404989cf48c741f805000000498b701848897120498b7808488979184d8b48204c8949104d8b50104c8951084889014989cb488d493048c741f80300000048c74110010000004c89590848c70105000000498d77d0483b75107303ff55404989f748c746f80200000048c746080100000048890e488d4e1848c741f8020000004889710848be80d606c9a37f0000488931498d77b0483b75107303ff55404989f748c746f80200000048894e08488916488d4e1848c741f80200000048897108488919488d511848c742f80300000048c742100100000048894a0848c7021d000000f6c1017524488b1948833b057512488b59084889d9483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740b4889d0ff155e000000eb034889d04889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70017000000c3909000000000000000000002000000000000|@11752,1048575,@19360,I48,@2211|73,0,I48 147,0,@509 303,0,@509 11751:S48|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e732836296669726550617474283129 11752:S34|4d415443485f434f4d50494c455228292e7261697365457863657074696f6e283329 11753:D4,64|483b65187303ff5548498b4908488b142448890c2441ff71184d89c249c7c00100000052ff252e00000090909090909000000000000000003800000000000000|@11953,2097151,@19416,@11948| 11754:S37|4d415443485f434f4d50494c455228292e636f64654d617463685061747465726e73283629 11755:D29,2728|483b65187303ff5548488b0848ba2ebd23c9a37f0000488d548afcffe290e9f3000000909090e9eb000000909090e908010000909090e9db000000909090e9d3000000909090e93f020000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9a3000000909090e99b000000909090e993000000909090e98b000000909090e911020000909090e948030000909090e94d050000909090e9d6050000909090e91c070000909090e95b000000909090e953000000909090e94b000000909090e980080000909090e93b000000909090e933000000909090e982080000909090e923000000909090e966090000909090e913000000909090e90b000000909090e968090000909090488b442408488b0b488908488b530848895008488b73104889701048c7c001000000c20800488b4808488b1148833a1d756a488b7208488b7e08488b3f4c8b4e104d8b09534152415057ff7120ff71084d8b42184c89cb4889f8ff154a0900009090ff154a090000ff742420ff742410ff742428ff742418ff353c090000488b4c2438488379080175474c8b4c24404c8b4424504889e34889c8eb05e9ae00000090ff151a090000488b4c2460488b10488911488b580848895908488b70104889711048c7c0010000004883c458c20800f6410801754a488b5108504c8b5424484c8b4c24584c8d442408488b5a084889c8ff15d2080000488b4c2460488b10488911488b580848895908488b70104889711048c7c0010000004883c458c20800488b442450488b4c2460488b10488911488b580848895908488b70104889711048c7c0010000004883c458c20800488b742408488b3b48893e4c8b43084c8946084c8b4b104c894e1048c7c001000000c20800488b4c240848894c24084c8b4818488b50104889d0e95cfdffff488b4808488b5108488b12488b7110488b3653415241504151524d8b42184889f34889d0ff151a0800009090ff151a080000ff742418ff742410ff742420ff3510080000488b4c24204883790801753f4c8b4c24304c8b4424404889e34889c8ff15f6070000488b4c2450488b10488911488b580848895908488b70104889711048c7c0010000004883c448c20800f6410801754a488b5108504c8b5424384c8b4c24484c8d442408488b5a084889c8ff15ae070000488b4c2450488b10488911488b580848895908488b70104889711048c7c0010000004883c448c208006a016a016a014989e0488b5c2458488b4424489090ff1572070000498d47e8483b45107303ff55404989c748c740f8020000005948894808488b4c2430488908488b4c24604889015848894108584889411048c7c0010000004883c448c20800488b4810488b094889ca48833a077528488b521048833a017506488b5210eb12488b5208488b12483b65187303ff5548ebe24883f202eb1f48833a0d7512488b5208488b12483b65187303ff5548ebba48c7c2010000004883fa0174345341524150ff702051ff7018498b1249bab0c823c9a37f00004c8b4c24104989c048c7c3030000004889d090ff15a6060000eb17488b5020488b701848c7c0010000005341524150525156488b4424084883380b7532488b4018488b4010488b480848833905741148b8a07223c9a37f0000488b5d0890ff13488b4110483b65187303ff5548ebc84883380d7512488b4008488b00483b65187303ff5548ebb04883380774134889c148b8e0c823c9a37f0000488b5d08ff1348c7c101000000488b4008a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889ca48bb38c923c9a37f00004889d090ff15e205000059f6c1017538488b114c8b51084c8b5a184989c4488b1c24488b02909090ff15c60500004d89d84c89e3ff15c20500004c89d1483b65187303ff5548ebc3498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff405a488911498d57d8483b55107303ff55404989d748c742f804000000488b1c2448895a1848894a104889420848c70233000000488b44242848894424284c8b5424104989d94883c40841584883c4085b4889d0e910faffff6a016a016a01ff7008488d4c2408514c8b4818488b48104889c8909090e8eef9ffff584883380b750f488b4010483b65187303ff5548ebeb4883381d750d488b4008488b4008488b00eb0a48b810cf19c9a37f0000498d4fe8483b4d107303ff55404989cf48c741f8020000005a48895108488901488b4424184889085948894808594889481048c7c001000000c20800488b4808488b09498d57f0483b55107303ff55404989d748c742f801000000c642ff4048be30e306c9a37f0000488932498d7798483b75107303ff55404989f748c746f80300000048c74610f17002004889560848c7060d000000488d562048c742f80200000048c7420801000000488932488d7a1848c747f80500000049b9e0c606c9a37f00004c894f2049b9083a07c9a37f00004c894f1849b9403a07c9a37f00004c894f104889570848c7070b0000005341524150ff7018ff7010564889cb4889f848bab06507c9a37f0000ff15e2030000498d47e8483b45107303ff55404989c748c740f80200000048c740080100000059488908ff742418504c8b5424184c8b4c242049b8e0c923c9a37f0000488b5c2410488b442430909090ff159a030000488b4c24304883c428488b10488911488b580848895908488b70104889711048c7c001000000c20800488b4808488b095341505041ff3251ff7010ff7020ff701841ff720848c7c3030000004889c848ba982409c9a37f000090ff1542030000498d4fd0483b4d107303ff55404989cf48c741f80500000048c741200100000048894118488b004889411048c741080100000048c7010b000000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c70001000000498d57d8483b55107303ff55404989d748c742f80400000048bb28cd06c9a37f000048895a1848bbf0c923c9a37f000048895a1048bb10f608c9a37f000048895a08488902498d47e8483b45107303ff55404989c748c740f80200000048c74008010000004889104989c05b4889c848ba706622c9a37f0000ff156e020000ff3424ff742430ff742430ff3565020000504c8d4c24084c8b442440488b5c2438488b442430ff15520200004c8b5424484c8b4c24584c8b4424604889c3584883c460909090ff153a020000488b4c2408488b10488911488b580848895908488b70104889711048c7c001000000c20800488b4c240848894c24084c8b4810488b50084889d0e993f6ffff488b4b08488339077566ff7310ff3341524d89ca4d89c149b8e0c923c9a37f0000488b5908488b40089090ff15d2010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488b4424185a48891048894808594889481048c7c001000000c2080048833909741a488b5008488b701848b800cb23c9a37f0000488b5d089090ff13ff7310ff3341524c8b50184d89c149b8e0c923c9a37f0000488b50084889d0ff1556010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488b4424185a48891048894808594889481048c7c001000000c20800488b4424084c89c14989c04889c8594883c40851ff2505010000488b4424084c89c14989c04889c8594883c40851ff25f30000009090900000000000000000a00a000000000000|@11775,2097151,@19364,@11776,@11784,@11785,@11787,@11798,@11776,@11805,@11806,@11787,@11798,@11773,@8347,@1354,@11807,@11813,@1633,@11818,@2242,@11292,@11887,@11889,@11900,@11909,@11910,@11773,@11773|14,0,$11755+30 1105,0,@11756 1194,0,@11649 1259,0,@11757 1324,0,@11759 1597,0,@8492 1702,0,@573 1793,0,@390 1807,0,@993 1821,0,@995 1864,0,@1292 1931,0,@11763 2039,0,@2241 2173,0,@440 2187,0,@11764 2201,0,@2150 2260,0,@11291 2438,0,@11763 2541,0,@11770 2573,0,@11763 11756:S31|43616e27742066696e642061206669786564207265636f726420747970652e 11757:O4|@20055,@557,@11654,@11758 11758:O5|@1338,2973,0,2973,0 11759:O1|@11760 11760:D3,32|48b890c923c9a37f0000c3909090909000000000000000001800000000000000|@11762,1,@19362|2,0,@11761 11761:O2|30,@8345 11762:S37|4d415443485f434f4d50494c455228292e6275696c64416f7428352977696c64732d283129 11763:O1|@11755 11764:O1|@11765 11765:D3,40|48b850ca23c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11769,1,@19363|2,0,@11766 11766:O4|@20055,@557,@11768,@11767 11767:O5|@11748,561,0,561,0 11768:S15|657175616c697479466f7254797065 11769:S40|4d415443485f434f4d50494c455228292e6275696c64416f74283529657175616c6974792d283129 11770:O4|@20055,@557,@11772,@11771 11771:O5|@11748,448,0,448,0 11772:S31|7061747465726e206973206e6f742061207475706c6520696e20612d6f2d74 11773:D7,360|483b65187303ff5548488b4b084883390375444150ff33ff7310504989c048bb38cd23c9a37f0000488b4108ff154e010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000eb554883390175544150ff33ff731050ff71104989c048bb38cd23c9a37f0000488b4108909090ff1506010000498d4fe0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c70101000000eb57e9520000004883390775444150ff33ff7310504989c048bb38cd23c9a37f0000488b4108ff15ba000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000eb084150ff33ff731050498d47e8483b45107303ff55404989c748c740f80200000048c74008010000005a4889104889ce4889c3589090ff1562000000488b4c24085a488911488971084889411048c7c0010000004883c408c3909090909000000000000000006001000000000000|@11912,1048575,@19395,@11913,@11914,@11911,@11794|32,0,@11774 109,0,@11774 196,0,@11774 11774:O1|@11773 11775:S28|4d415443485f434f4d50494c455228292e6275696c64416f74283529 11776:D12,680|483b65187303ff55486a016a01488b48104883390775574883790811755548bab8c019f1a37f0000488b124989da4c8b5818488b184889d0ff15820200009090ff158202000049833b057544498b4b0848833907752af64108017524488b5108488b1a4152415350488b4308eb0ae9a3010000e99e010000ff1552020000eb1b41524153504889c8ff154a020000eb0b4889c14c89d841524153514883380d74144889c148b800eb19c9a37f0000488b5d0890ff13f6042401754a488b0c244883790801753f488b11498d5fd0483b5d107303ff55404989df48c743f80500000048c743200100000048895318488b324889731048c743080100000048c7030b000000eb71498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048ba30e306c9a37f0000488911498d5fc8483b5d107303ff55404989df48c743f80300000048c74310f170020048894b0848c7030d000000488d532048c742f802000000488b34244889720848c70209000000eb05e903000000488911498d4fe0483b4d107303ff55404989cf48c741f80300000048ba90d023c9a37f00004883c40848891148895908488b400848894110488061ffbf6a016a01534c8d4424084889cb488b4424189090ff150e010000498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000594889089090ff15ea000000488d4c24205a4883c410488911488d4c240848894108eb6a498d57e8483b55107303ff55404989d748c742f80200000048be00d123c9a37f00004889324c894208488062ffbf536a016a014989e04889d3488b48184889c89090ff1592000000488b44240890ff158e000000488d4c24185a4883c408488911488d4c2408488941085b5848bab06507c9a37f0000ff156e00000058c3909090900000000000000000a002000000000000|@11780,2097151,@19367,@11781,@11782,@1401,@1401,@1382,@11783,@1382,@11779,@1633|32,0,@20169 166,0,@8546 291,0,@573 408,0,@11777 560,0,@11778 644,0,@1292 11777:D3,72|488b00483b42107520498d47f0483b45107303ff55404989c748c740f801000000488b5208488910c348c7c001000000c39090909090909000000000000000004000000000000000|@8550,5,@19365| 11778:D3,264|488b5208f6c2017563488b0a488b591848833b03755b488b730840f6c601753d488b3e4c8b074d8b084c3b08751d4d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb194c8b56084c89d6483b65187303ff5548ebbd49c7c2010000004983fa017521eb0ae976000000e95c000000488b72084889f2483b65187303ff5548e979ffffff4d8b12498b32498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c8b0e4c894f0848c7070d0000004989c3488d472048c740f801000000488938c3488b72084889f2483b65187303ff5548e91dffffff4889c148c7c001000000c390909090909000000000000000000001000000000000|@11562,1023,@19366| 11779:D3,208|483b65187303ff5548a801756d488b08488b5108488b5a084883e3094883fb01740948c7c301000000eb0748c7c3030000004883f302488b72084883e6034883fe01740948c7c601000000eb0748c7c6030000004883f602498d7fe0483b7d107303ff55404989ff48c747f8030000004889771048895f08eb05e937000000488b1948891f57488b70084889f0e86effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000c800000000000000|@1363,63,@19371| 11780:S30|56414c55455f4f505328292e676574506f6c796d6f72706869736d283329 11781:D3,256|483b65187303ff5548a801755c488b08483b197459f6c3017559f601017554488b3140f6c601740948c7c203000000eb08488b16488d5412014883c2104889de488b394c8b41104c8b49084889d148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741eeb6ae979000000e90a0000004c8b41104c8b4908eb5b4c8b41104c8b4908498d4fe8483b4d107303ff55404989cf48c741f8020000004c8941084c890951488b4008e852ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908eb0ae906000000e901000000c3488b4008e919ffffff48c7c001000000c3900000000000000000f800000000000000|@8556,255,@19368| 11782:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19369| 11783:D3,136|483b65187303ff5548a8017561498d4fe0483b4d107303ff55404989cf48c741f80300000048c741100100000048c7410801000000488b1048891151488b50084889d09090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008000000000000000|@1363,7,@19370| 11784:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19372| 11785:D3,120|483b65187303ff55486a016a016a014889e1514c8b52204c8b4a184c8b42104889c3488b420848bae0c923c9a37f0000ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007000000000000000|@11786,1048575,@19373|40,0,@11763 11786:S36|4d415443485f434f4d50494c455228292e6275696c64416f74283529646f417267283129 11787:D6,464|483b65187303ff5548498b480848833903757441ff701041ff30504150534151ff7108488b50104889d09090ff15b6010000ff7424204c8b5424204c8b4c24184c8b4424104889c3488b442408909090ff159a010000498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f803000000eb05e91a000000488b5424304883c4284889501048894808594883c408488908c34883390974154889c248b828d923c9a37f0000488b5d089090ff13498d57c8483b55107303ff55404989d748c742f80200000048c74208010000004c890a4889c6488d421848c740f803000000498b78104889781049b9e86f0cc9a37f00004c89480848c700010000005641ff3052574889da909090ff12488b4c241850488b4110ff15ca000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b542420488951185a4889511048894108488b442408488901498d47b0483b45107303ff55404989c748c740f80200000048c7400801000000488908488d481848c741f8020000004889410848c70103000000488d411848c740f8030000005a4883c4084889501048894808594883c408488908c3909090900000000000000000c801000000000000|@11792,1048575,@19374,@11791,@11793,@11791|177,0,@11788 253,0,@3659 11788:O4|@20055,@557,@11790,@11789 11789:O5|@11748,403,0,403,0 11790:S37|6164644578636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 11791:D4,272|483b65187303ff5548488338097563488b4810ff7008488b4108909090e8deffffffa801756f498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b004889410848c7010500000049c7c001000000488b1c244889c89090ff15be000000488338057532eb05e943000000488b4808498d47f0483b45107303ff55404989c748c740f801000000eb05e9140000004889084883c408c348c7c0010000004883c408c348c7c0010000004883c408c3488338037532488b4808488339057520498d47f0483b45107303ff55404989c748c740f801000000488b4908488908c348c7c001000000c348c7c001000000c390909090909000000000000000000801000000000000|@11797,1048575,@19377,@2178| 11792:S31|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429 11793:D4,480|483b65187303ff5548a801755f488b08f6c301755cf6410801755b488b5108488b33483b32756b498d7fe8483b7d107303ff55404989ff48c747f80200000048c74708010000004c89074c8b40084c8b51184989d34c8b6110488b194889f890ff159201000041504152eb0fe9ab000000e970000000e96b0000004153504c89e04c89caff12498d4fd8483b4d10730aeb05e94f000000ff55404989cf48c741f804000000488b5424104889511848894110488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c2080051ff742410488b40089090e80affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c20800498d47c8483b45107303ff55404989c748c740f80200000048c74008010000004c89004889c1488d401848c740f8030000004d8b52104c89501048bae86f0cc9a37f00004889500848c7000100000053514c89caff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424184889511848894110488b44240848894108584883c408488901498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c2080090900000000000000000d801000000000000|@11795,1048575,@19375,@11794|344,0,@3659 11794:D3,520|483b65187303ff55484883f80175044889d8c34883fb017501c3a80174134889c148b8e81f08c9a37f0000488b5d08ff13f6c30174134889c148b8e81f08c9a37f0000488b5d08ff13488b08f6c1017508f603017503ff5570483b0b756ba80174134889c148b8e81f08c9a37f0000488b5d08ff13a80174144889c248b8582008c9a37f0000488b5d0890ff13f6c3017417488b500848b8582008c9a37f0000488b5d08909090ff1351488b5b08488b4008909090e846ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c3a80174144889c148b8e81f08c9a37f0000488b5d0890ff13f6c30174134889c248b8e81f08c9a37f0000488b5d08ff13f6c101740cf603017407483b0b7d6aeb05ff5570ebf4a80174164889c148b8e81f08c9a37f0000488b5d08909090ff13a80174144889c248b8582008c9a37f0000488b5d0890ff1351488b4008909090e896feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3f6c30174164889c148b8e81f08c9a37f0000488b5d08909090ff13f6c30174134889c148b8582008c9a37f0000488b5d08ff13ff33488b5b089090e832feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390909090909000000000000000000002000000000000|@11796,15,@19376|35,0,@1625 59,0,@1625 103,0,@1625 126,0,@1628 152,0,@1628 238,0,@1625 263,0,@1625 308,0,@1625 334,0,@1628 408,0,@1625 435,0,@1628 11795:S42|4d415443485f434f4d50494c455228292e6164644578636f6e737472283429616464436c697374283129 11796:S24|4d415443485f434f4d50494c455228292e706c7573283229 11797:S30|4d415443485f434f4d50494c455228292e74657374416363657373283129 11798:D4,440|483b65187303ff5548498b490848833901756f41ff711041ff31ff711041514c89d24c8b5424284d89c14989d04889c3488b4108ff1596010000498d4fc0483b4d107303ff55404989cf48c741f8030000005a488951104889410848c70101000000488d412048c740f803000000488b5424084889501048894808594883c408eb05e906000000488908c208004883390974164889c248b8e8e123c9a37f0000488b5d08909090ff13498d57c8483b55107303ff55404989d748c742f80200000048c74208010000004c89124889c6488d421848c740f803000000498b79104889781049bae86f0cc9a37f00004c89500848c700010000005641ff315352574c89c29090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424204889511848894110488b44243048894108488b542408488911498d57a8483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f803000000488b5c2410488959104889510848c70101000000488d412048c740f8030000005a4883c4104889501048894808594883c408488908c2080090909090900000000000000000b001000000000000|@11803,1048575,@19378,@11802|152,0,@11799 229,0,@3659 11799:O4|@20055,@557,@11801,@11800 11800:O5|@11748,318,0,318,0 11801:S35|616464436f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 11802:D4,584|483b65187303ff5548a8017561488b08488b5118488b32483b33745740f6c6017556f6030175564c8b1b41f6c301740948c7c703000000eb08498b3b488d7c3f014883c7104989fc4c89df4c8b69104c8b314c89e148d1e9483bc9f3a6488d7c3f01488d743601488d4c0901eb14e905010000e917000000e909000000e9040000007412eb644c8b69104c8b31eb604c8b69104c8b31498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004c8901488b70084889df4c89f34889c89090ff159201000056574152504c89e84c89ca909090ff12498d4fd8483b4d10730feb0ae954000000e94f000000ff55404989cf48c741f804000000488b5424104889511848894110488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c20800ff30ff742410488b4008e8aefeffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c20800498d47c8483b45107303ff55404989c748c740f80200000048c74008010000004c8900488b4c24084889c2488d401848c740f803000000488b71104889701048bfe86f0cc9a37f00004889780848c70001000000534152524c89ca90ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b5424104889511848894110488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c2080090909090909000000000000000004002000000000000|@11804,1048575,@19379,@11794|441,0,@3659 11803:S29|4d415443485f434f4d50494c455228292e616464436f6e737472283629 11804:S40|4d415443485f434f4d50494c455228292e616464436f6e737472283629616464436c697374283129 11805:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19380| 11806:D3,128|483b65187303ff55486a016a016a014889e1514c8b52184c8b4a104c8b42084889c348b890c923c9a37f000048bae0c923c9a37f00009090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@11786,1048575,@19381|36,0,@11761 46,0,@11763 11807:D3,296|483b65187303ff554848833b0b752f488b5b18488b5b10488b4b084883390574144889c248b8a07223c9a37f0000488b5d0890ff13488b5910e9c2ffffff48833b0d750c488b5b08488b1be9b0ffffff48833b0774134889c148b8d8e723c9a37f0000488b5d08ff1348c7c101000000488b5b084883fb0175134889c248b830e823c9a37f0000488b5d08ff13488b13483b027452f602017557a8017553a801740948c7c603000000eb08488b30488d7436014883c6104889f7488b324989f84889c74989c94c89c148d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c9eb0a4989c94889c14c89c8c3f6c10174064883c1027105ff5570ebf5488b53084889d3483b65187303ff5548e95effffff909000000000000000002001000000000000|@11812,255,@19382|38,0,@11649 91,0,@11808 127,0,@11810 11808:O4|@20055,@557,@11654,@11809 11809:O5|@1338,2959,0,2959,0 11810:O4|101,@1386,0,@11811 11811:O5|@1338,2947,0,2947,0 11812:S26|545950455f5452454528292e656e7472794e756d626572283229 11813:D3,160|483b65187303ff55484883fb0175164889c148b880e923c9a37f0000488b5d08909090ff134883f8017524498d47e8483b45107303ff55404989c748c740f802000000488b5b08488958084c8900c3a80174064883e8027105ff5570ebf5ff33488b5b0890e896ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3909000000000000000009800000000000000|@11817,75,@19383|20,0,@11814 11814:O4|@20055,@557,@11816,@11815 11815:O5|@11748,474,0,474,0 11816:S6|6d657267656e 11817:S39|4d415443485f434f4d50494c455228292e6275696c64416f742835296d657267656e2833292829 11818:D7,168|483b65187303ff5548f6c3017547ff33ff742410ff742420415241514150ff7308ff3599000000ff7424484d89ca4989c14c8d44240848c7c30500000048b818eb23c9a37f000090ff157a0000004883c440c21000ff742410415241514150ff356b000000ff7424304d89ca4989c14c8d44240848c7c30500000048b8f8f023c9a37f0000909090ff154a0000004883c428c210009090900000000000000000a000000000000000|@11879,1048575,@19384,@11880,@11798,@11878,@11798|63,0,@11819 125,0,@11866 11819:O7|@839,@1128,@11821,@11820,@390,0,0 11820:O3|2,@11859,@11858 11821:O2|1,@11822 11822:O3|2,@1113,@11823 11823:O2|@11824,0 11824:O4|@20054,69,@11825,0 11825:O3|2,3,@11826 11826:O5|@571,@11827,@1110,@1016,@548 11827:O2|@594,@11828 11828:O2|@11830,@11829 11829:O2|@11834,@11833 11830:O2|@1148,@11831 11831:O3|0,@11832,@576 11832:O8|@512,@839,0,0,@772,0,0,1 11833:O2|@11847,0 11834:O2|@1155,@11835 11835:O3|0,@11836,@576 11836:O8|@11838,@839,0,0,@11837,0,2,1 11837:O2|@11844,0 11838:O3|10,@11840,@11839 11839:O3|14,@11842,1 11840:O2|@7743,@11841 11841:O2|@7745,0 11842:O2|@6867,@11843 11843:O2|@7755,0 11844:O2|1,@11845 11845:O2|@765,@11846 11846:O2|@7763,0 11847:O2|@1162,@11848 11848:O3|0,@11849,@576 11849:O8|@11851,@839,0,0,@11850,0,2,1 11850:O2|@11857,0 11851:O3|10,@11853,@11852 11852:O3|14,@11842,0 11853:O2|@11855,@11854 11854:O2|@11856,0 11855:O4|1,@622,0,@1996 11856:O4|1,@622,1,@689 11857:O2|1,@543 11858:O5|5,@11865,@995,@993,@390 11859:O3|3,@11860,@395 11860:O2|@11862,@11861 11861:O2|@11864,0 11862:O2|49,@11863 11863:O3|6,@20200,79992 11864:O2|50,@11858 11865:O2|@11863,0 11866:O7|@830,@431,@11867,@11858,@390,0,0 11867:O2|1,@11868 11868:O3|2,@1111,@11869 11869:O2|@11870,0 11870:O4|@20054,69,@11871,0 11871:O3|2,2,@11872 11872:O5|@571,@11873,@1110,@1016,@548 11873:O2|@594,@11874 11874:O2|@11875,@11488 11875:O2|@2352,@11876 11876:O3|0,@11877,@576 11877:O8|@11492,@830,0,0,@772,0,0,1 11878:D3,128|483b65187303ff55486a016a016a014889e1514c8b52204c8b4a184c8b42104889c348b890c923c9a37f0000488b4a084889ca90ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c39090909090909000000000000000007800000000000000|@11886,1048575,@19386|36,0,@11761 11879:S42|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229 11880:D3,768|483b65187303ff5548488b480848833909756e498d5fe0483b5d107303ff55404989df48c743f803000000488b70104889731048bfe86f0cc9a37f000048897b0848c70301000000498d7fe0483b7d107303ff55404989ff48c747f8030000004889771049b8e86f0cc9a37f00004c89470848c707010000006a016a016a01eb05e904010000ff305257564c8d44242041504c8b52284c8b4a204c8b4218488b4238488b4a104889ca909090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c243048894810488b4c242848894808488b4c2420488908488b4c241050ff7128ff71304c8b51204c8b49184c8b4110488b5908488b44242048bac0f623c9a37f000090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f8030000005a4883c4104889501048894808594883c418488908c34883390774154889c348b8d0f623c9a37f0000488b5d089090ff13f64108017515488b5908f6430801750b488b730848837e080174154889c348b8d0f623c9a37f0000488b5d089090ff136a016a016a0152ff7010ff30ff36488d7c2420574c8b52284c8b4a204c8b4218488b334889f3488b4238488b4a104889ca9090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c243048894810488b4c242848894808488b4c2420488908488b4c241850ff7128ff71304c8b51204c8b49184c8b4110488b5908488b44241848bac0f623c9a37f000090ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70107000000488d411848c740f803000000488b5424084889501048894808594883c428488908c39090909090900000000000000000f802000000000000|@11885,1048575,@19385|53,0,@3659 102,0,@3659 259,0,@11881 405,0,@11882 453,0,@11882 607,0,@11881 11881:O1|@11818 11882:O4|@20055,@557,@11884,@11883 11883:O5|@11748,541,0,541,0 11884:S34|6d6b436f6e735061743a206261646c792d666f726d65642070617273652d74726565 11885:S54|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c6973742832296d6b436f6e73506174283129 11886:S45|4d415443485f434f4d50494c455228292e6275696c64416f7428352970726f636573734c697374283229283129 11887:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@11888,2097151,@19387,@8347| 11888:S40|4d415443485f434f4d50494c455228292e6275696c64416f742835296c697456616c75652d283129 11889:D16,624|483b65187303ff5548534151ff3048c7c3030000004c89c048ba982409c9a37f00009090ff155e0200005049b888fb23c9a37f00004889c3488b44240848ba486f22c9a37f000090ff1542020000594883c408498d57d0483b55107303ff55404989d748c742f802000000488b0948894a08488902488d421848c740f802000000488b4a0848894808488b1a488918ff7008ff30ff750848b8b2f923c9a37f00005048896508488b442410488338057521498d77f0483b75107303ff55404989f748c746f801000000488b4008488906eb0748c7c6010000004883fe01751248b8386208c9a37f0000488b5d089090ff13488b442428488b16909090ff124889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c4085948894d084883c420c3488b65084883c4085b48895d08488138cb000000750c48c7c0010000004883c420c3488338117560488b581048b8e8fb23c9a37f0000ff153201000048bb10fc23c9a37f0000ff152a010000488b5c241890ff152601000048bb40fc23c9a37f0000ff151e010000488b5c240890ff151a010000488b54241090ff1248c7c0010000004883c420c34883380b7546488b5c241848b858fc23c9a37f000090ff15f200000048bb40fc23c9a37f0000ff15ea000000488b5c240890ff15e6000000488b54241090ff1248c7c0010000004883c420c348833803751148b898fc23c9a37f0000488b5d0890ff13488b5c241848b8f0fc23c9a37f0000ff15ae00000048bb40fc23c9a37f0000ff15a6000000488b5c240890ff15a2000000488b54241090ff1248c7c0010000004883c420c390909090909000000000000000006802000000000000|@11899,2097151,@19389,@2242,@11315,@100,@100,@100,@100,@100,@100,@100,@100,@100,@100,@100|26,0,@2241 45,0,@11890 63,0,@11314 153,0,$11889+298 225,0,@1662 344,0,@11892 360,0,@11893 388,0,@11894 447,0,@11895 464,0,@11894 518,0,@11896 540,0,@11898 556,0,@11894 11890:O1|@11891 11891:D3,40|48b8886e22c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@11313,1,@19388|2,0,@11310 11892:S22|436f6e76657273696f6e20657863657074696f6e2028 11893:S26|2920726169736564207768696c6520636f6e76657274696e6720 11894:S4|20746f20 11895:S43|4f766572666c6f7720657863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 11896:O4|1,@169,0,@11897 11897:O5|@11124,1327,0,1327,0 11898:S34|457863657074696f6e20726169736564207768696c6520636f6e76657274696e6720 11899:S30|56414c55455f4f505328292e6765744c69746572616c56616c7565283429 11900:D4,304|483b65187303ff5548498b480848833905756841ff701041ff304c89d24d89ca4989d94989d04889c3488b4108909090ff1512010000498d4fc8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f803000000488b5424084889501048894808594883c408488908c34883390974144889c248b8b8fe23c9a37f0000488b5d0890ff13498d9778ffffff483b55107303ff55404989d748c742f80200000048c74208010000004c890a488d721848c746f80300000048895e1048895608488906488d462048c740f80200000048c7400801000000488930488d501848c742f8020000004889420848c70205000000488d421848c740f803000000498b58104889581048895008498b10488910c39000000000000000002801000000000000|@11905,2097151,@19390,@11904|134,0,@11901 11901:O4|@20055,@557,@11903,@11902 11902:O5|@11748,351,0,351,0 11903:S36|61646453636f6e7374723a206261646c792d666f726d656420616e642d6f722074726565 11904:D5,392|483b65187303ff5548a801756b488b08ff7008415153ff710841525141504d89c14989d8488b5910488b442428909090ff156a0100004883f8017470498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b4c2410488908488b5c2418909090ff1536010000498d4fe0eb05e9a5000000483b4d107303ff55404989cf48c741f803000000488b5424284889511048894108488b442420488901498d47e8eb05e925000000483b45107303ff55404989c748c740f802000000488b542430488950084889084883c438c34c8b5424104c8b4c24284c8b0424488b5c2420488b442430909090e80affffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24084889084883c438c3498d47b0483b45107303ff55404989c748c740f80200000048c74008010000004c8910488d481848c741f8030000004c89491048894108488919488d412048c740f80200000048c7400801000000488908c39090909000000000000000008001000000000000|@11907,2097151,@19391,@11906,@11794| 11905:S30|4d415443485f434f4d50494c455228292e61646453636f6e737472283529 11906:D6,520|483b65187303ff5548a801756ff6c301756f498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b004889410848c70105000000498d4790483b45107303ff55404989c748c740f80300000048c7401001000000488b1b4889580848c70005000000488d502048c742f802000000eb0ae968010000e96301000048c7420801000000488902488d421848c740f80200000048895008488908488d481848c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f8017410415141504889c890ff151a010000eb074889c841514150498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8909090ff15ea000000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c701070000005849c7c001000000488b58684889c848ba88c009c9a37f000090ff15a20000004889c148c7c0010000004889ca90ff12488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c1010000004883f901751348b8386208c9a37f0000488b5d08909090ff13488b01c348c7c001000000c39090909090909000000000000000000002000000000000|@11908,2097151,@19392,@2211,@2166,@2634|383,0,@2633 468,0,@1662 11907:S41|4d415443485f434f4d50494c455228292e61646453636f6e737472283529616464436c697374283129 11908:S46|4d415443485f434f4d50494c455228292e61646453636f6e737472283529657175616c5370656369616c73283229 11909:D3,280|483b65187303ff55484883f80175204883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c20800f6c3017419488b4808488b1048b8700f0cc9a37f0000488b5d089090ff136a016a016a01415241514150ff7308ff7008488d4c2428514c8b5424504c8b4c24284c8b442420488b1b488b00488b54241890ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c243848894810488b4c243048894808488b4c242848890850ff7424504c8b5424304c8b4c24284c8b442420488b5c2418488b442410909090e826ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c440488908c208009090909000000000000000001001000000000000|@3595,1048575,@19393|23,0,@3592 61,0,@3592 11910:D3,280|483b65187303ff5548a801756f498d4fe0483b4d107303ff55404989cf48c741f803000000488b53104889511048bee86f0cc9a37f00004889710848c701010000006a016a016a0141524151415053ff7008488d742428564c8b5424504c8b4c24284c8b4424204889cb488b00488b5424189090ff12498d47e0eb05e97b000000483b45107303ff55404989c748c740f803000000488b4c243848894810488b4c243048894808488b4c242848890850ff7424504c8b5424304c8b4c24284c8b442420488b5c2418488b442410e82effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c440488908c2080048c7c001000000c20800909000000000000000001001000000000000|@1363,1048575,@19394|47,0,@3659 11911:D3,192|483b65187303ff5548a801756e6a016a016a01415053ff70084c8d442418488b18488b442410488b54240890ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c242848894810488b4c242048894808488b4c2418488908504c8b442418488b5c2410488b44240890e88affffff4889c1eb05e925000000498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c39090900000000000000000b800000000000000|@1363,1048575,@19398| 11912:S30|4d415443485f434f4d50494c455228292e61646444656661756c74283229 11913:D3,256|483b65187303ff5548a801756b488b086a016a016a01415053ff7008ff7118ff7108ff314c8d442430488b5910488b442428488b54242090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c244048894810488b4c243848894808488b4c2430488908498d4fd8483b4d10730aeb05e969000000ff55404989cf48c741f804000000488b5424104889511848894110488b44240848894108584883c410488901514c8b442418488b5c2410488b442408e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c390900000000000000000f800000000000000|@1363,1048575,@19396| 11914:D3,256|483b65187303ff5548a801756b488b086a016a016a01415053ff7008ff7118ff7108ff314c8d442430488b5910488b442428488b54242090ff12498d47e0483b45107303ff55404989c748c740f803000000488b4c244048894810488b4c243848894808488b4c2430488908498d4fd8483b4d10730aeb05e969000000ff55404989cf48c741f804000000488b5424104889511848894110488b44240848894108584883c410488901514c8b442418488b5c2410488b442408e842ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c430488908c348c7c001000000c390900000000000000000f800000000000000|@1363,1048575,@19397| 11915:D3,304|483b65187303ff5548488b4808488339037563488b510848c7c301000000f6c201754f488b024883fb01740948c7c103000000eb2b4883780801750948c7c103000000eb16ff7208488b48104889c89090e8aaffffff4889c1eb08ff7208eb03ff72084889cb5a483b65187303ff5548ebac4889d8c348833901754d488b510848c7c301000000f6c2017539488b024883fb01740948c7c103000000eb15ff7208488b48104889c890e852ffffff4889c1eb03ff72084889cb5a483b65187303ff5548ebc24889d8c3488339077543488b510848c7c301000000f6c201752f4883fb01740948c7c003000000eb0eff7208488b0290e806ffffffeb03ff72084889c35a483b65187303ff5548ebcc4889d8c348c7c001000000c390909090909000000000000000002801000000000000|@11916,31,@19399| 11916:S45|4d415443485f434f4d50494c455228292e636f6e7461696e734e6f6e436f6e7374457863657074696f6e283129 11917:D3,120|483b65187303ff5548a801740af6c3017405483bc3eb05ff5570ebf67e0848c7c001000000c34889c1f6c10174064883c1027105ff5570ebf5504889c8e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3909000000000000000007000000000000000|@11918,11,@19400| 11918:S26|4d415443485f434f4d50494c455228292e66726f6d2832292829 11919:D16,2056|488dbc2458ffffff483b7d187303ff5550488b304889df4c8b58084889fb488b40109090ff15f60700006a016a016a016a014883ff01745b4889f94889c2483bca750948c7c103000000eb53f6c1017547f6c2017534488b19f6c3017508f602017503ff5570483b1a7516488b5208488b59084889d9483b65187303ff5548ebbd48c7c101000000eb1548c7c101000000eb0ce90d00000048c7c1010000004883f901745d498d47e8483b45107303ff55404989c748c740f8020000004c8948084889384152564c89c29090ff12488d4c2410488b10488911488d4c2410488b580848895908488d4c2410488b701048897110488d4c2410488b781848897918eb6449833b0975634889c1498d47e8483b45107303ff55404989c748c740f8020000004c8948084889084152564c89c2ff12488d4c2410488b10488911488d4c2410488b580848895908488d4c2410488b701048897110488d4c2410488b781848897918eb64e93906000049833b05755e4d8b5b0848c7c10100000041525641515741505041f6c3017569498b034889ce488b78104c8b00488b5c2410488b48084889c8ff157e0600004883f801746f498d4fe0483b4d107303ff55404989cf48c741f803000000eb0ae9d5050000e900010000488979104c89410848c701050000004889cf488b1c249090ff153e060000eb05e98a0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488b54241848895008eb05e94800000048890841ff73085657488b5424209090ff12498d4fd0483b4d107303ff55404989cf48c741f8020000004889410858488901488d711848c746f802000000584889460848890eeb0441ff73084889f1415b483b65187303ff5548e902ffffff4889c84889c1498d47e8483b45107303ff55404989c748c740f802000000488b542418488950085a48891051488b542408ff124c8d4c243049c7c0010000004889c3584883c4189090ff1566050000eb6049833b03755f4d8b5b0848c7c10100000041525641515741505041f6c3017566498b034889ce488b78184c8b4010488b5c2410488b084889c8909090ff152a0500004883f801746d488b1c24ff15220500006a016a016a016a0141ff7308eb0ae96b040000e93a01000056574c8d5424184c8b4c24504c89c14c8b4424404889c34889c8eb05e9c50000009090e89afcffff498d47d8483b45107303ff55404989c748c740f804000000488b4c243048894818eb05e973000000488b4c242848894810488b4c242048894808488b4c2418488908498d4fe8483b4d107303ff55404989cf48c741f8020000005a4889510848c70103000000498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d721848c746f8020000005848894608488916eb0c6a016a016a016a0141ff73084889f1415b4883c420483b65187303ff5548e9cafeffff4889c84889c1498d47e8483b45107303ff55404989c748c740f802000000488b542418488950085a48891051488b542408909090ff124c8d4c243049c7c0010000004889c3584883c4189090ff15da030000eb6049833b01755f498b4b0848c7c20100000041525641515741505041ff7310f6c1017569488b01488b71084889d74c8b40084c8b48184c8b5010488b5c2418488b084889c8ff15960300004883f801746d488b5c2408909090ff158a030000eb0ae9c7020000e94e0100006a016a016a016a015657415041514c89d14c8d5424204c8b4c24604c8b442450eb05e9d40000004889c34889c89090e8eafaffff498d47d8483b45107303ff55404989c748c740f804000000488b4c2438eb05e98400000048894818488b4c243048894810488b4c242848894808488b4c2420488908498d4fe0483b4d107303ff55404989cf48c741f803000000488b542408488951105a4883c4084889510848c70101000000498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d7a1848c747f8020000005848894708488917eb096a016a016a016a01564889fa594883c420483b65187303ff5548e9b9feffff4889d04889c1498d47e8483b45107303ff55404989c748c740f802000000488b54242048895008488b54240848891051488b5424189090ff124c8d4c24404c8b4424084889c3584883c428ff153a020000eb5e41f64308017525498b43084883780801751a4152564c8d5424104889fb488b084889c89090e8a6f9ffffeb6d4c89c8a80174064883c0027105ff5570ebf548c7c101000000498b5308f6c2017526f6c10174064883c102710cff5570eb05e911010000ebee488b5208483b65187303ff5548ebd54889caf6c20174064883ea027105ff5570ebf54989cc4989c54889d348c7c001000000eb05e9d60000009090ff159a0100004152566a016a016a016a014151415441ff730848b9e81424c9a37f00005141514d89c24c8d4c24284989c04c89eb4889f890ff156a010000498d47d8483b45107303ff55404989c748c740f804000000488b4c242048894818488b54241848895010488b5c241048895808488b5c2408488918498d5fe0483b5d107303ff55404989df48c743f8030000005e4883c410488973104889430848c70301000000488d442420488918488d44242048c7400801000000488d44242048895010488d4424204883c408488948184883c40848837c2418017506488b0424eb10488b5c2418488b042490ff15be000000488b4c24084883c408488b54240848891148894108488b44241848894110488b4424204889411848c7c0010000004883c428c390909000000000000000000008000000000000|@11922,1048575,@19401,@11923,@11923,@11794,@11925,@11923,@11794,@11925,@11923,@11794,@11925,@11936,@11937,@11921|1771,0,@11920 11920:O1|@11919 11921:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19415| 11922:S28|4d415443485f434f4d50494c455228292e70617474436f6465283429 11923:D3,392|483b65187303ff55484883f80174064883fb01750848c7c001000000c3a80174144889c148b8e81f08c9a37f0000488b5d0890ff13f6c30174134889c148b8e81f08c9a37f0000488b5d08ff13488b08f6c1017508f603017503ff5570483b0b756ba80174134889c148b8e81f08c9a37f0000488b5d08ff13a80174144889c248b8582008c9a37f0000488b5d0890ff13f6c3017417488b500848b8582008c9a37f0000488b5d08909090ff1351488b5b08488b4008909090e842ffffff4889c1498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c3a80174144889c148b8e81f08c9a37f0000488b5d0890ff13f6c30174134889c248b8e81f08c9a37f0000488b5d08ff13f6c101740cf603017407483b0b7d2deb05ff5570ebf4a80174164889c148b8582008c9a37f0000488b5d08909090ff13488b48084889c8e9abfefffff6c30174134889c148b8582008c9a37f0000488b5d08ff13488b5b08e98afeffff909000000000000000008001000000000000|@11924,15,@19402|38,0,@1625 63,0,@1625 107,0,@1625 130,0,@1628 156,0,@1628 242,0,@1625 267,0,@1625 312,0,@1628 351,0,@1628 11924:S29|4d415443485f434f4d50494c455228292e696e74657273656374283229 11925:D5,760|483b65187303ff554848c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc6a016a01f6c101750941f6c0017503ff5570493bc875174889e148c701010000004889e148c7410801000000eb154889e1488b53104889114889e1488b7318488971084889c1f6c101755f488b11488b7208488b7e104c8b5310493bfa750948c7c703000000eb5740f6c701754a41f6c201753b4c8b1f41f6c301750941f602017503ff55704d3b1a75164d8b52084c8b5f084c89df483b65187303ff5548ebb948c7c701000000eb15e93400000048c7c701000000eb0748c7c7010000004883ff017415488b79084889f9483b65187303ff5548e96cffffff48c7c101000000eb0748c7c1030000004883f901742a488b03498901488b4b0849894908488b531049895110488b73184989711848c7c0010000004883c410c34889c1488b14245350f6c101752c488b01488b5808488b7108488b7b104889fb4889d0ff15960100004889c24889f1483b65187303ff5548ebcf4889d0488b0c24488b542418f6c1017533488b19488b7308f6c2017410f6461801740a488d52ff480356187105ff5570ebf1488b79084889f9483b65187303ff5548ebc84889d1498d57d8483b55107303ff55404989d748c742f8040000005b48895a184c8942105b48895a0848c70203000000498d5fd8483b5d107303ff55404989df48c743f80400000048894b184889431048c7430801000000488913f6c10174084883f9037e64eb06f641ff10756148c7c6010000004889c740f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda40f6c60174054803f67105ff5570ebf64883ee0140f6c60174064883ee027105ff5570ebf5f6c1017417eb0ae927000000e92200000040f6c6017405483bceeb05ff5570ebf67c104889d84c89cb4883c410ff255300000049891149c7410801000000498941104989491848c7c0010000004883c410c3909090900000000000000000f002000000000000|@11927,8191,@19403,@11794,@11926| 11926:D4,168|483b65187303ff554853ff7010ff70084889c3488b442408ff15a2000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c7010700000048c7c001000000488b542408f6c201751ea80174064883c0027105ff5570ebf5488b5208483b65187303ff5548ebdd488b54241048890a5948894a085948894a104889421848c7c0010000004883c408c39090909090900000000000000000a000000000000000|@11929,8191,@19404,@11928| 11927:S43|4d415443485f434f4d50494c455228292e70617474436f64652834296d616b655061747454657374283329 11928:D6,288|483b65187303ff55484883f801750848c7c001000000c3a80174164889c148b8e81f08c9a37f0000488b5d08909090ff134c8b204989dd4989c64c89eb4c89e0ff15f2000000498d4fd0483b4d107303ff55404989cf48c741f8020000004c896108488901488d411848c740f80200000048c74008010000004c89204889ce4889c34c89f0909090ff15b20000005641544c89eb90e866ffffff48833c24017540498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5424084889114883f90175054883c410c34889cb4883c410ff25670000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488b4c24084889084883c410c390909000000000000000001801000000000000|@11931,8191,@19405,@11932,@11934,@11930|32,0,@1625 11929:S29|4d415443485f434f4d50494c455228292e6d616b654e61697665283129 11930:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19408| 11931:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655061747473283129 11932:D3,1296|483b65187303ff5548488b0b48833907756b488b5108f6c2017545488b32a8017509f64608017503ff5570483b4608751d498d7ff0483b7d107303ff55404989ff48c747f801000000488937eb19488b72084889f2483b65187303ff5548ebb648c7c7010000004883ff01751848b8386208c9a37f0000488b5d08eb05e95900000090ff13488b3f498d47e8483b45107303ff55404989c748c740f802000000488b53084889500848be80da06c9a37f00004889304889c6498d47e8483b45107303ff55404989c748c740f802000000488b3f48897808488930c348833903755f488b5108488b72104883fe01750948c7c601000000eb6040f6c60174134889c748b8e81f08c9a37f0000488b5d08ff13a8017508f606017503ff5570483b06750948c7c603000000eb6040f6c601741c4889c748b8e81f08c9a37f0000eb05e965020000488b5d089090ff13a8017413f60601740eeb05e94a000000483b067d10eb05ff5570ebf448c7c601000000eb3540f6c601741d4889c748b8582008c9a37f0000488b5d08eb05e917000000909090ff13488b7608483b65187303ff5548e942ffffff4883fe01745d498d77e8483b75107303ff55404989f748c746f802000000488b7b0848897e0849b880da06c9a37f00004c8906564889d3909090e81afeffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b711840f6c6017565488b3e4c8b47084d8b48104983f901750949c7c101000000eb6341f6c10174154989c248b8e81f08c9a37f0000488b5d089090ff13a801750941f601017503ff5570493b01750949c7c103000000eb6041f6c101741b4989c248b8e81f08c9a37f0000eb05e999000000488b5d0890ff13a801741441f60101740eeb05e949000000493b017d10eb05ff5570ebf449c7c101000000eb3441f6c101741c4989c248b8582008c9a37f0000488b5d08eb05e9160000009090ff134d8b4908483b65187303ff5548e940ffffff4983f901741d4d8d4ff04c3b4d107303ff55404d89cf49c741f801000000498939eb1c4c8b4e084c89ce483b65187303ff5548e9f7feffff49c7c1010000004983f90175154889c648b8386208c9a37f0000488b5d089090ff13498b31498d7fd0483b7d107303ff55404989ff48c747f8020000004c8b064c89470848c707030000004c8d571849c742f8020000004c8b5b084d895a0849893a4152488b5e089090e87afcffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348833909756f498d57c8483b55107303ff55404989d748c742f803000000488b711848897210488b791048897a0848c702050000004c8d422049c740f8020000004c8b4b084d8948084989104150488b590890e8fefbffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348833901756d498d57d0483b55107303ff55404989d748c742f802000000488b71104889720848c70201000000488d7a1848c747f8020000004c8b43084c89470848891757488b5908909090e882fbffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859eb05e904000000488908c3498d47e8483b45107303ff55404989c748c740f802000000488b53084889500848be80da06c9a37f00004889304889c6498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488930c390909000000000000000000805000000000000|@11933,1023,@19406|111,0,@1662 170,0,@544 259,0,@1625 310,0,@1625 381,0,@1628 463,0,@544 569,0,@1625 623,0,@1625 694,0,@1628 809,0,@1662 1227,0,@544 11933:S43|4d415443485f434f4d50494c455228292e6d616b654e616976652831296372656174655465737473283229 11934:D3,392|483b65187303ff55484883f801750848c7c001000000c34883fb017501c3a80174134889c148b8e81f08c9a37f0000488b5d08ff13f6c30174134889c148b8e81f08c9a37f0000488b5d08ff13488b08f6c1017508f603017503ff5570483b0b7543a80174134889c148b8582008c9a37f0000488b5d08ff13f6c3017417488b480848b8582008c9a37f0000488b5d08909090ff13488b5b08488b48084889c8e95bffffffa80174144889c148b8e81f08c9a37f0000488b5d0890ff13f6c30174134889c248b8e81f08c9a37f0000488b5d08ff13f6c101740cf603017407483b0b7d6aeb05ff5570ebf4a80174164889c148b8e81f08c9a37f0000488b5d08909090ff13a80174144889c248b8582008c9a37f0000488b5d0890ff1351488b4008909090e8d6feffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3f6c30174164889c148b8582008c9a37f0000488b5d08909090ff13488b5b08e98efeffff90909090909000000000000000008001000000000000|@11935,15,@19407|39,0,@1625 63,0,@1625 107,0,@1628 132,0,@1628 174,0,@1625 199,0,@1625 244,0,@1625 270,0,@1628 344,0,@1628 11935:S24|4d415443485f434f4d50494c455228292e64696666283229 11936:D3,120|483b65187303ff5548a801740af6c3017405483bc3eb05ff5570ebf67e0848c7c001000000c34889c1f6c10174064883c1027105ff5570ebf5504889c8e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3909000000000000000007000000000000000|@11918,11,@19409| 11937:D5,560|483b65187303ff55484983f80174064883f80175594889c1498d47e8483b45107303ff55404989c748c740f8020000004889580848890841514c89d2ff12488b0c24488b10488911488b580848895908488b701048897110488b78184889791848c7c0010000004883c408c220004d89cc4989dd4989c6415241504d89f14c8b442428488b5c2430488b0424ff15b6010000488b4c24284889c2f6c10174164889c348b8c0e406c9a37f0000488b5d08909090ff134883fa017505488b09eb1ff6c20174064883ea027105ff5570ebf5488b4908483b65187303ff5548ebbb498d57e8483b55107303ff55404989d748c742f80200000048c74208010000004889024889c64889cf4889d358ff153e010000498d4fc0483b4d107303ff55404989cf48c741f80700000048ba782824c9a37f0000488911488941085848894110488b44242048894118488b54241848895120488b5c2410488959284c8b4424084c894130488061ffbf6a016a016a016a014154564c8d5424104d89e94989c84c89f34889f8488b5424409090ff12498d47d8483b45107303ff55404989c748c740f804000000488b4c242848894818488b54242048895010488b5c241848895808488b5c2410488918498d5fd8483b5d107303ff55404989df48c743f8040000005e48897318488b742430488973104889430848c70309000000488b042448891848c7400801000000488950104889481848c7c0010000004883c428c220009000000000000000002802000000000000|@11942,1048575,@19411,@11941,@11934|164,0,@578 300,0,@11938 11938:D3,144|483b65187303ff55486a016a016a016a01ff7218ff7220ff7228ff72304c8b52104c8d4c24204c8b4208488b5808488b084889c848ba302924c9a37f00009090ff12498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908c3909000000000000000008800000000000000|@11940,1048575,@19410|54,0,@11939 11939:O1|@11937 11940:S51|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283129283129 11941:D4,72|483b65187303ff5548488b0c244c89042441514989c24989d949c7c00100000048c7c30100000048c7c00100000051ff252b00000090909000000000000000004000000000000000|@11944,1023,@19412,@11943| 11942:S48|4d415443485f434f4d50494c455228292e70617474436f6465283429636f6465506174742d6465737061746368283329 11943:D4,496|483b65187303ff5548a801750941f6c1017503ff5570493bc175064889d8c210004c89d14883f901750948c7c101000000eb5ef6c10174154889c248b8e81f08c9a37f0000488b5d089090ff13a8017508f601017503ff5570483b01750948c7c103000000eb68f6c10174154889c248b8e81f08c9a37f0000488b5d089090ff13a8017411f60101740c483b017d15eb0ae939000000ff5570ebef48c7c101000000eb2bf6c10174144889c248b8582008c9a37f0000488b5d0890ff13488b4908483b65187303ff5548e955ffffff4883f901746b488b4c24104889c2f6c10174134889c648b8c0e406c9a37f0000488b5d08ff134883fa017505488b09eb1ff6c20174064883ea027105ff5570ebf5488b4908483b65187303ff5548ebbe4889df4989c3488b5c24084889c8909090ff15d2000000a801741241f6c001eb05e9730000007405493bc0eb05ff5570ebf67e354c89d9f6c10174064883c1027105ff5570ebf5488b542410488b5c2408488954241048895c24084989c04c89db4889c8e978feffff41f6c30174064983c3027105ff5570ebf5488b442410488b4c2408488944241048894c24084889fb4c89d8e948feffffa80174064883c0027105ff5570ebf5488b4c2410488b54240848894c24104889542408e920feffff0000000000000000e801000000000000|@11946,1023,@19413,@11945|61,0,@1625 113,0,@1625 174,0,@1628 231,0,@578 11944:S30|4d415443485f434f4d50494c455228292e62657374436f6c756d6e283429 11945:D4,392|483b65187303ff5548488b4808488339077559488b510848c7c60100000053f6c2017540ff720856488b5c2410488b0290e8caffffffa801740ef60424017408483b04247e07eb09ff5570ebf3488b04244889c64883c4085a483b65187303ff5548ebbb4889f04883c408c34889ce488b401090ff15260100004883f801741da80174154889c148b8e81f08c9a37f0000488b5d089090ff13488b00c348833e05753f48c7c001000000488b760840f6c601751ea80174064883c0027105ff5570ebf5488b7608483b65187303ff5548ebdca80174064883c0027105ff5570ebf5c348833e03753f48c7c001000000488b760840f6c601751ea80174064883c0027105ff5570ebf5488b7608483b65187303ff5548ebdca80174064883c0027105ff5570ebf5c348833e01753f48c7c001000000488b760840f6c601751ea80174064883c0027105ff5570ebf5488b7608483b65187303ff5548ebdca80174064883c0027105ff5570ebf5c348c7c001000000c39090909000000000000000008001000000000000|@11947,31,@19414,@11923|137,0,@1625 11946:S44|4d415443485f434f4d50494c455228292e62657374436f6c756d6e28342966696e6444656570657374283329 11947:S29|4d415443485f434f4d50494c455228292e706174744465707468283229 11948:D6,936|483b65187303ff554841524151415053ff30ff701041ff7108ff700848c7c003000000498b511090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b542420488951184889411048c741080100000048c70103000000a80174084883f8017c08eb1bf640ff1074154889c348b8f0a115c9a37f0000488b5d089090ff13498d5fd0483b5d107303ff55404989df48c743f8020000004889430848c70305000000488d731848c746f80200000048895e0848c706090000005bf6c3017544488b3b4c8b47104983380574134989c148b8a03224c9a37f0000488b5d08ff134d8b48084989014d8b50104c8b1c244d891a4c8b63084c89e3483b65187303ff5548ebb748c7c301000000488b442410488338077521514c8b5424384c8b4c24304c8b4424284889d3488b40089090ff1586020000eb5f48833803753a51ff742450ff742450ff700852ff742448564c8b5424684c8b4c246049b8103324c9a37f0000488b5810488b50184889d090ff154e020000eb5d48833809755c488b542420f6c2017557488b1a488b701040f6c601750feb05e998010000f603017503ff5570483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb2a488b5a084889da483b65187314eb0fe95a010000e9b9000000e905000000ff5548eb9a48c7c7010000004883ff01751b488b5008488b581848b8386208c9a37f0000488b5d08909090ff13488b3f488b570848833a05751a51ff700849c7c001000000488b58184889d0ff1596010000eb39488b5808488b7018498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488970104889500848c7000d0000005153ff742458ff7424584c8b5424504c8b4c24484c8b4424404889c3488b44241090e866fdffffeb68488338017567498d5fd0483b5d107303ff55404989df48c743f80200000048897308488b7010488933488d7b1848c747f8020000004c8b4424204c89470848891f51ff742450ff7424504c8b5424484c8b4c24404989f84889d3488b50084889d0e8fefcffffeb2ee92b000000f644240801741148b8e81f08c9a37f0000488b5d0890ff13488b44240851488b00488b54243890ff126a014883c408498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4883c4384889114883f9017503c210004889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70015000000c2100090900000000000000000a003000000000000|@11958,2097151,@19417,@11959,@11954,@2178|117,0,@6844 215,0,@11949 352,0,@11952 516,0,@1662 786,0,@1625 11949:O4|@20055,@557,@11951,@11950 11950:O5|@11748,611,0,611,0 11951:S7|73657441646472 11952:O1|@11948 11953:S37|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429 11954:D5,456|483b65187303ff55484883f8017537488b442420488b4c2418488b542410488b5c2430488b74242848895c243048897424284c89c74989d04889cb4889fa5f4883c42057ff22488b08488b1148833a0175684883fb037567f6400801751348b8583524c9a37f0000488b5d08909090ff13415241514150ff71084c8b5424484c8b4c24504c8b442428488b5a10488b4208909090ff1546010000488b4c2430488b542450488b5c2448488954245048895c24484c8b542418eb0ae91e000000e9190000004c8b4c24104989c84889c3585a4883c4105e4883c42056ff226a016a01415241514150ff700853ff71084c8d4c24304c8b442420488b5c24484889d0ff15e2000000ff742470ff7424704c8b5424384c8b4c24304c8b442460488b5c2448488b442410488b542428ff124883c40859f6c10174064883e9027105ff5570ebf550ff742468ff742468ff742468ff742468ff742468ff7424684c8b5424504c8b4c24484c8b4424404889cb488b4424389090e886feffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818594883c42048894810594883c4084889480848c70003000000c230009090900000000000000000c001000000000000|@11988,2097151,@19427,@11968,@11966|96,0,@11955 11955:O4|@20055,@557,@11957,@11956 11956:O5|@11748,1060,0,1060,0 11957:S21|646f5061747465726e3a206e6f7420617420656e64 11958:S49|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d61746368283329 11959:D5,296|483b65187303ff5548a80174144889c148b8803724c9a37f0000488b5d0890ff13488b0841524151415053ff7008ff31ff71084d89ca4d89c14989d8488b1c24488b442408909090ff15f200000050488b442408488b542438909090ff1248833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c70015000000f64424180174054883c440c3504c8b4c24384c8b442430488b5c2428488b442418ff158e000000504c8b5424484c8b4c24404c8b442438488b5c2430488b44242890e826ffffff4889c1498d47d8483b45107303ff55404989c748c740f80400000048894818488b4c240848894810594883c4084889480848c700030000004883c440c39000000000000000002001000000000000|@11964,2097151,@19418,@11965,@11963|18,0,@11960 11960:O4|@20055,@557,@11962,@11961 11961:O5|@11748,1083,0,1083,0 11962:S16|6d616b6554657374733a20656d707479 11963:D5,1064|483b65187303ff5548a8017561488b08488b1148833a03755a41514150ff7008ff72085348c7c003000000498b511090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000a80174124883f8017c12eb23e99a030000e92b010000f640ff1074134889c248b8f0a115c9a37f0000488b5d08ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d421848c740f8020000004889500848c700090000006a016a01514c8d4c24084c8b4424304889c3488b4424189090ff1556030000498d47e8483b45107303ff55404989c748c740f80200000048c740080100000059488908504c8b4c24304c8b442428488b5c2410488b4424209090e8d6feffff498d4fd8483b4d107303ff55404989cf48c741f80400000048ba80d606c9a37f00004889511848894110488b4424084889410848c7010300000048833c240175084889c84883c438c3498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c438c348833a05756e4c89c3f6c3017549488b33488b7a0840f6c7017508f606017503ff5570483b3e751d4d8d57f04c3b55107303ff55404d89d749c742f801000000498932eb19488b73084889f3483b65187303ff5548ebb249c7c2010000004983fa01751e488b580848b8386208c9a37f0000eb05e987000000488b5d08909090ff134d8b12498b5a0848833b05751e41514150ff700849c7c001000000488b5a10498b4208ff15fa010000eb3c488b7008498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b7a10488978104889580848c7000d00000041514150564c8b4c24104c8b4424084889c3584883c410e95dfdffff48833a01755941514150ff700853ff720848c7c003000000498b511090ff12498d4fd8483b4d107303ff55404989cf48c741f804000000488b542408488951184889411048c741080100000048c70103000000a801740d4883f8017c0deb1fe9fa000000f640ff1074144889c348b8f0a115c9a37f0000488b5d0890ff13498d5fa0483b5d107303ff55404989df48c743f8020000004889430848c70305000000488d431848c740f8020000004889580848c70009000000488d581848c743f80200000048c743080100000048890b488d4b1848c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f802000000488b74241048897008488908534c8b4c24204989c04889d3488b4424109090e83efcffff48833c240175054883c428c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c428c3488b70084889f0e9f3fbffff48b858cd06c9a37f0000c300000000000000002004000000000000|@11987,2097151,@19426,@11966,@2178|131,0,@6844 324,0,@509 525,0,@1662 786,0,@6844 1039,0,@442 11964:S73|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d6d616b655061747465726e73283129 11965:D5,848|483b65187303ff5548a8017561488b084152415153ff7008ff3141ff7208ff7108415048c7c003000000498b52109090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000a801740d4883f8017c0deb1fe9bf020000f640ff1074144889c248b8f0a115c9a37f0000488b5d0890ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d5a1848c743f8020000004889530848c703090000005af6c2017544488b32488b7e1048833f0574134989c048b8a03224c9a37f0000488b5d08ff134c8b47084989004c8b4f104c8b14244d89114c8b5a084c89da483b65187303ff5548ebb748c7c201000000488b44240848833803753d6a016a01514c8d4c24084c8b442440488b40089090ff152a0200004c8b5424404c8b4c24384c8b442410488b5c2430488b4424289090e8a2feffffeb68488338057567488b542420f6c2017549488b1a488b700840f6c6017508f603017503ff5570483b33751d498d7ff0483b7d107303ff55404989ff48c747f80100000048891feb19488b5a084889da483b65187303ff5548ebb248c7c7010000004883ff017523eb0ae93d010000e99a000000488b501048b8386208c9a37f0000488b5d08909090ff13488b3f488b570848833a05751e6a016a015149c7c001000000488b58104889d0909090ff155e010000eb38488b5810498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488958104889500848c7000d0000006a016a01514c8b5424404c8b4c24384989c0488b5c2430488b4424289090e896fdffffeb69488338017568498d57e8483b55107303ff55404989d748c742f80200000048895a08488b4008488902498d47e8483b45107303ff55404989c748c740f802000000488b742420488970084889106a016a01514c8b5424404989c14989d8488b5c2430488b442428eb0ae930000000e9090000009090e81afdffffeb226a016a01514c8b5424404c8b4c24384989d8488b5c2430488b44242890e8f6fcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c440488908c348c7c001000000c390909090909000000000000000004803000000000000|@11967,2097151,@19419,@11966,@2178|126,0,@6844 223,0,@11949 472,0,@1662 11966:D9,632|483b65187303ff554848833805756e4883781001750c48b980d606c9a37f0000eb32488b4810488b11498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889510848c70105000000498d57b0483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a18eb05e9fd00000048c741f80200000048895108488919488d511848c742f80300000048c742100100000048894a0848c7021d000000f6c1017524488b1948833b057512488b59084889d9483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174124151ff70084889d09090ff159a010000eb0a488b48084889d0415151498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000004889014889c8ff156a010000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c70107000000488b042448890848b980d606c9a37f00004889480848c7c0010000004883c408c348833803756f41515341ff701841ff7008ff70084c8b5424104c8b4c24084989d848c7c301000000488b042490ff15ee000000504c8b5424184c8b4c24104c8b44242048c7c301000000488b4424089090ff15d2000000488b4c24285a4883c4204889114889410848c7c0010000004883c408eb05e901000000c341515341ff701841ff7008ff7010ff70084c8b5424184c8b4c24104989d8488b5c2408488b0424909090ff1586000000504c8b5424204c8b4c24184c8b442428488b5c2410488b442408ff156e000000488b4c24305a4883c4284889114889410848c7c0010000004883c408c39000000000000000007002000000000000|@11972,2097151,@19420,@2211,@2166,@11973,@11968,@11973,@11968|24,0,@509 359,0,@509 11967:S29|4d415443485f434f4d50494c455228292e6d616b654c6f616473283529 11968:D8,328|483b65187303ff5548488378080175514983380575174c89c049c7c00300000048c7c305000000ff2533010000498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048c74010050000004c89400848c7000d000000c3f640080174164889c148b8d84424c9a37f0000488b5d08909090ff13488b480848833903750b48b880d606c9a37f0000c3415250ff35cd00000048c7c0010000009090ff15c600000041504c89c94c8d4c24084d89d04889cb48ba98f808c9a37f0000ff15ae000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4883c4184889114889c34889c8ff15820000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c39090909090909000000000000000004001000000000000|@11985,2097151,@19424,@2178,@11984,@7332,@2165,@2166|108,0,@11969 137,0,@509 188,0,@2163 11969:O4|@20055,@557,@11971,@11970 11970:O5|@11124,1275,0,1275,0 11971:S11|6d616b65496e7665727365 11972:S35|4d415443485f434f4d50494c455228292e636f6e7374727563746f72436f6465283329 11973:D10,616|483b65187303ff55484883780801756f49833805752241524151504c89c149c7c00100000048c7c3010000004889c890ff154a020000eb3b4889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004c89400848c7000d000000415241515148b9b8c219f1a37f0000eb05e913010000488b0948bac8c219f1a37f0000488b1248bbd8c219f1a37f0000488b1b48bee8c219f1a37f0000488b36498d7fd0483b7d107303ff55404989ff48c747f80500000048895f204889771848894f104889570848b9509adc000000000048890f505749ba504824c9a37f000049c7c1010000004c8b442420488b5c2418488b44241048ba00ff21c9a37f000090ff1572010000498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c418488908909090ff15360100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180300000048bad0d506c9a37f0000488950104889480848c70007000000c3f640080174144889c148b8584924c9a37f0000488b5d0890ff13415250ff35de00000048c7c001000000909090ff15d600000041504c89c94c8d4c24084d89d04889cb48ba98f808c9a37f0000ff15be000000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4883c4184889114889c34889c8ff15920000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c39090909090909000000000000000006002000000000000|@11982,2097151,@19422,@2178,@11117,@10996,@11981,@7332,@2165,@2166|117,0,@20201 137,0,@20202 150,0,@20203 163,0,@20204 216,0,I48 231,0,@11974 263,0,@11115 383,0,@502 418,0,@11978 476,0,@2163 11974:O17|@20206,@20207,@20208,@20209,@11975,@20202,I48,@2638,@2643,@20210,@20201,@20205,@7813,0,@20204,@20203,@2649 11975:O1|@11976 11976:D3,24|48c7c001000000c300000000000000001000000000000000|@11977,1,@19421| 11977:S18|4c45585f28292e6e756c6c4c65782d283129 11978:O4|@20055,@557,@11980,@11979 11979:O5|@11124,1248,0,1248,0 11980:S9|6d616b654775617264 11981:D5,264|483b65187303ff554848b9b8c219f1a37f0000488b0948bbc8c219f1a37f0000488b1b48bed8c219f1a37f0000488b3648bfe8c219f1a37f0000488b3f4d8d47d04c3b45107303ff55404d89c749c740f8050000004989702049897818498948104989580848b9509adc0000000000498908415049ba504824c9a37f000049c7c1010000004c8b42104889c3488b420848ba00ff21c9a37f00009090ff157e00000048833805751449c7c00100000048c7c301000000ff256c0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d000000c3909090909000000000000000000001000000000000|@11983,2097151,@19423,@11117,@2178|11,0,@20201 24,0,@20202 37,0,@20203 50,0,@20204 103,0,I48 118,0,@11974 146,0,@11115 11982:S24|56414c55455f4f505328292e6d616b654775617264283529 11983:S33|56414c55455f4f505328292e6d616b654775617264283529746573746572283129 11984:D5,264|483b65187303ff554848b9b8c219f1a37f0000488b0948bbc8c219f1a37f0000488b1b48bed8c219f1a37f0000488b3648bfe8c219f1a37f0000488b3f4d8d47d04c3b45107303ff55404d89c749c740f8050000004989702049897818498948104989580848b9509adc0000000000498908415049ba504824c9a37f000049c7c1010000004c8b42104889c3488b420848ba00ff21c9a37f00009090ff157e00000048833805751449c7c00100000048c7c305000000ff256c0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d000000c3909090909000000000000000000001000000000000|@11986,2097151,@19425,@11117,@2178|11,0,@20201 24,0,@20202 37,0,@20203 50,0,@20204 103,0,I48 118,0,@11974 146,0,@11115 11985:S26|56414c55455f4f505328292e6d616b65496e7665727365283529 11986:S39|56414c55455f4f505328292e6d616b65496e7665727365283529676574496e7665727365283129 11987:S34|4d415443485f434f4d50494c455228292e6d616b654e616976655465737473283429 11988:S70|4d415443485f434f4d50494c455228292e636f646547656e65726174654d61746368283429636f64654d6174636828332970617474436f64652d646f5061747465726e283229 11989:D20,1856|488dbc2438ffffff483b7d187303ff5550a8017568488b08488b5424184c89c640f6c60174064883ee027105ff5570ebf540f6c60174084883fe017d08eb21f646ff10751b498b3940f6c601740b40f6c7017405483bf7eb05ff5570ebf67c15488b780848b838e407c9a37f0000488b5d0890ff1340f6c601740deb05e9a20600004883c6027105ff5570ebf5498b74b1fc40f6c60174084883fe077f48eb06f646ff10744041f6c00174064983c0027105ff5570ebf5488b742420488b7c24104c8b5c24084889742420488954241848897c24104c895c2408488b48084889c8e91affffff488b7208498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d5fe04c3b5d107303ff55404d89df49c743f80300000049bc985524c9a37f00004d892349897b084c8b66084d896310498063ffbf4c8b2e41f6c50174064983c5027105ff5570ebf54d8d77d04c3b75107303ff55404d89f749c746f80300000049897e104d895e084d892e4d8d5e2049c743f80100000041c643ff4049c703030000004d8d6fe84c3b6d107303ff55404d89ef49c745f80200000048be205724c9a37f0000498975004d895d08498065ffbf488b7424184989dcff7008ff7218ff31ff712848c7c301000000488b410890ff157205000048c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc415241514154415051415357ff7638ff762841554156ff36ff76205048bba02a22c9a37f00004889c8909090ff151a0500004889c6488b5c2440488b04249090ff150e0500004889c74889f34889f890ff1506050000488b0c244883f90175224883ff0174134889c148b8a03f0bc9a37f0000488b5d08ff1348c7c101000000eb6d40f6c70174154889c248b8a03f0bc9a37f0000488b5d089090ff13488b11488b5a1048833b0574134889c648b8d05724c9a37f0000488b5d08ff13488b73084c8b074c89064c8b4b104c8b5424184d89114c8b47084c89c74c8b41084c89c1483b65187303ff5548e96bffffff50ff7424304c8b5424304c8b4c24204c8b442428488b5c2418488b442410909090ff154e0400006a016a01ff30ff70084c8d442410488b9c24a000000048b838ad0ac9a37f0000488b9424c80000009090ff124c8b442438488b5c241058909090ff1516040000ff7008ff304c8b5424504c8b4c24404c8b442448488b5c2418488b8424a000000048ba507722c9a37f0000909090ff15ea0300004883f8017506488b0424eb104889c3488b0424909090ff15d60300004883f8017507488b442410eb0f4889c3488b44241090ff15c20300004883f8017507488b442428eb0f4889c3488b44242890ff15ae030000498d4fb8483b4d107303ff55404989cf48c741f808000000488b5424604883c4084889513848c7413001000000488b542450488951285a4883c43048895120488b54247048895118488b5c241048895910488b5c2408488959085b4883c4204889196a016a01504c8d4424084889cb488b442458488b54247890ff1248833c24017507488b442408eb30498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810488b0c244889480848c70015000000488b4c24304883c418f6c10174064883e9027105ff5570ebf5f6c1017412f644242001740b488d49ff48034c24207105ff5570ebf04989ca4989c348c7c35f000000488b44244890ff15ae020000415241535048c7c303000000488b44243048baa05f06c9a37f0000909090ff15920200004889c3589090ff158e020000488b4c2410488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff1536020000488b4c2418488b09488b542418488b12488b742418488916483b1d1f020000743af6c30175444889de48bf509adc00000000004889ca48c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084889d1eb0f4889ca48b9303707c9a37f0000eb064889ca4889d94889d34889ceff15ca01000053505648bb285824c9a37f0000488b442438ff15ba010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424104889513048c741280300000048894120488b4424084889411848c7411001000000584883c4104889410858488901498d47c0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80400000048894118584883c4184889411048c741080100000048c7010300000058a80174064883c0027105ff5570ebf551ff742460ff742460ff742460ff7424604c8b5424384c8b4c24304989c0488b5c2428488b44245890e806f9ffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c438488908c2200048c7c001000000c22000909000000000000000003807000000000000|@11998,2097151,@19431,@11729,@1354,@11999,@12000,@11109,@11526,@11336,@12001,@12002,@11997,@100,@194,@100,@2258,I48,@2259,@1354|102,0,@1493 295,0,@11990 428,0,@11991 562,0,@11152 639,0,@3339 673,0,@3339 707,0,@11993 834,0,@3194 909,0,@11334 1293,0,@193 1461,0,I48 1514,0,@971 1547,0,@11995 11990:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19428,@2226|41,0,@2221 195,0,@2224 269,0,@2224 11991:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@11992,15,@19429| 11992:S53|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729666e4d6b4164647273283129 11993:O4|@20055,@557,@11951,@11994 11994:O5|@11418,451,0,451,0 11995:O1|@11996 11996:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19430|2,0,@441 11997:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19436| 11998:S41|434f444547454e5f50415253455452454528292e636f64654d61746368283529636745787073283729 11999:D3,112|483b65187303ff5548a8017549488b0b488b13f6c20174064883c2027105ff5570ebf548891351488b40089090e8ceffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000006800000000000000|@1363,15,@19432| 12000:D3,200|483b65187303ff55484883f801751e4883fb01741048b8700f0cc9a37f0000488b5d08ff1348c7c001000000c3f6c3017417488b4808488b1048b8700f0cc9a37f0000488b5d08ff13498d4fd8483b4d107303ff55404989cf48c741f804000000488b1348895118488b304889711048c741080100000048c7010300000051488b53084889d3488b50084889d0e86effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c390900000000000000000c000000000000000|@3595,31,@19433|23,0,@3592 59,0,@3592 12001:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19434| 12002:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19435| 12003:O2|@12078,@11546 12004:D62,7544|483b65187303ff5548488b0848befe5b24c9a37f0000488d748efcffe690e9f3000000909090e908010000909090e9ee010000909090e9b4030000909090e914040000909090e919070000909090e9c3000000909090e9bb000000909090e9b3000000909090e9ab000000909090e9fa060000909090e973070000909090e993000000909090e90c080000909090e99c080000909090e9e8090000909090e973000000909090e9b80a0000909090e9040c0000909090e9a50c0000909090e953000000909090e92e0e0000909090e9120f0000909090e9130f0000909090e968130000909090e9fd180000909090e923000000909090e9ad190000909090e913000000909090e9ba190000909090e90300000090909048b880d606c9a37f0000498900488b5b204989580848c7c001000000c36a016a0141505352ff70104c8d442420488b40089090e8b2feffff488b442410498d4fb8483b4d107303ff55404989cf48c741f808000000488b503848895138488b583048895930488b702848897128488b7c2428488979204c8b40184c8941184c8b48104c8949104c8b50084c8951084c8b184c89196a016a014989e04889cb488b442410488b542418909090e83afeffff498d47d8483b45107303ff55404989c748c740f80400000048b980d606c9a37f000048894818594883c42048894810488b4c24084889480848c70003000000488b0c24488901488b4424104889410848c7c0010000004883c418c3488b4808488b3148833e1d7571488b7e084c8b4f084d8b094c8b57104d8b1241505352ff7120ff33ff7328ff73084151ff71084c8b4424184c89d34c89c890ff152a1b00006a016a01504c8d442408488b5c2450488b442418488b5424489090e87afdffffff742438ff7424484c8b5424104c8b4c24404c8b442438eb05e93b000000488b5c2418488b44243048ba18ff21c9a37f0000ff15da1a0000488b4c24584883c410488901584883c4404889410848c7c0010000004883c408c36a016a0141505352ff71084c8d4424204889f0909090e806fdffff488b442410498d4fb8483b4d107303ff55404989cf48c741f808000000488b503848895138488b583048895930488b702848897128488b7c242848897920488b7818488979184c8b40104c8941104c8b48084c8949084c8b104c89116a016a014989e04889cb488b442410488b542418909090e88efcffff498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000594889089090ff15021a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c7411803000000488b542428488951104889410848c70107000000488b442420488908594883c4184889480848c7c0010000004883c418c3488b48086a016a014150535250ff7320ff71084c8d442430488b01909090e8eefbffff488b4424184c8b54242049c7c1010000004c8b4424305b488b4808488b4424084889ca909090ff12488b4c2420488901584883c4184889410848c7c0010000004883c418c3488b48086a016a0141505352ff7108ff7120ff7110ff71284c8d442438488b019090e882fbffff6a016a01488b4424304989e0488b5c2418488b481048b838ad0ac9a37f00004889caff12488b4424384c8b50104c8b184c8b60084d89d8488b1c24488b4424509090ff15e2180000ff7008ff304d89d94d89e0488b5c2410488b44242048ba507722c9a37f0000909090ff15c21800004883f8017506488b0424eb104889c3488b0424909090ff15ae180000488b4c24484883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a2841584883c4184c8942204c8b41184c8942184c8b49104c894a104c8b51084c8952084c8b194c891a6a016a01504c8d4424084889d3488b442418488b542430909090e876faffff6a016a01488b4424404989e0488b5c2438488b481048b838ad0ac9a37f00004889caff12488b4424484c8b50104c8b184c8b60084d89d8488b1c24488b4424609090ff15ee170000ff7008ff304d89d94d89e0488b5c2410488b44244048ba507722c9a37f0000909090ff15ce1700004883f8017506488b0424eb104889c3488b0424909090ff15ba170000488b4c24584883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a2841584883c4104c8942204c8b41184c8942184c8b49104c894a104c8b51084c8952084c8b194c891a6a016a01504c8d4424084889d3488b442440488b542448909090e86af9ffff48837c2418017507488b442420eb31498d47e0483b45107303ff55404989c748c740f803000000488b4c242048894810488b4c24184889480848c7001500000048833c24017507488b4c2408eb30498d4fe0483b4d107303ff55404989cf48c741f803000000488b54240848895110488b14244889510848c70115000000498d57d8483b55107303ff55404989d748c742f80400000048894a1848894210488b4424604883c4584889420848c70203000000488b0424488910488b4c24104889480848c7c0010000004883c418c3488b4010e993f8ffff6a016a016a014150524989da4c8b4a104c8d442410488b5b20488b40089090ff154616000048837c2408017507488b442410eb31498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c24084889480848c70015000000488b0c24488901488b4424184889410848c7c0010000004883c420c3488b4808488b09498d77e8483b75107303ff55404989f748c746f80200000048bf587b24c9a37f000048893e488b7b2848897e08488066ffbf6a016a014150535250ff7320ff70184c8d4424304889f34889c8909090ff1596150000488b44243890ff15921500009090ff1592150000488b4c24184c8b4c24204989c05b488b442408488b5120909090ff12488b4c2420488901584883c4184889410848c7c0010000004883c418c36a016a014150535250ff7320ff70104c8d442430488b48084889c8909090e846f7ffff488b4424184c8b54242049c7c10300000049b8f09e0ac9a37f00005b488b4808488b4424084889ca9090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048894110488b4424284889410848c7010b000000488b442420488908594883c4184889480848c7c0010000004883c418c3488b4808488b5108488b12f6420801756d488b7110488b36ff7118ff33ff732852ff35a21400004150ff7320ff7328ff73084c8b4424084889f34889d0ff158e14000048c7c001000000909090ff15861400004c8d4c24204c8b4424085b4883c40848ba98f808c9a37f000090ff156e140000488b4c240848890158eb05e9100000004889410848c7c0010000004883c430c348837a080175424150ff7320ff71184c8b1349c7c1010000004c8b4328488b73084889f34889d0909090ff1526140000488b4c2408488901584889410848c7c0010000004883c408c3488b7110488b36415052ff7320ff7118ff33ff7328ff73084c8b4424084889f34889d09090ff15ea130000ff7424184c8b5424184989c14c8b442410488b5c2408488b44243048ba00ff21c9a37f000090ff15c6130000488b4c24304883c420488901584883c4084889410848c7c0010000004883c408c3f64018017517488b48184883790801750c488b31488b4618e960f5ffff488b4810488b0948c7c601000000488b781840f6c701752040f6c60174064883c6027105ff5570ebf5488b7f08483b65187303ff5548ebda6a016a014150ff7320ff7310ff730851564989da4989d14c8d442430488b581848b8887c24c9a37f00009090ff152613000048837c2410017507488b442418eb31498d47e0483b45107303ff55404989c748c740f803000000488b4c241848894810488b4c24104889480848c70015000000488b4c2408488901584889410848c7c0010000004883c418c3488b4808488b094883390b7511f6410801750b488b710848837e08017418488b7018488b781048b8a07d24c9a37f0000488b5d08ff13498d7fd0483b7d107303ff55404989ff48c747f80200000048c747080100000048890f4c8d4f1849c741f80200000049897908488b3e49893941505352ff732051ff7018ff33ff7308ff7328ff701048c7c3030000004c89c89090ff153e1200004889c34889d8ff153a120000498d4fa0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c70101000000488d412048c740f803000000488948104889580848c70007000000488d482048c741f803000000488b542428488951104889410848c70105000000ff742410ff742420ff742430524c8b5424284989c94c8b442460488b5c2458488b442420ff15b2110000488b4c24484883c430488901584883c4104889410848c7c0010000004883c408c3488b4808488b09ff701850ff33ff35861100004150ff73204c8d4c24104989c8488b5810488b48204889c89090ff156e1100004883f8017526488b44240848b980d606c9a37f0000488908488b0c244889480848c7c0010000004883c430c3498d4fe0483b4d107303ff55404989cf48c741f80300000048c7411001000000488b004889410848c70105000000488b442408488908488b0c244889480848c7c0010000004883c430c3488b4808498d77d8483b75107303ff55404989f748c746f80400000048bf207e24c9a37f000048893e488b7a1048897e08488956104c8b094c894e18488066ffbf6a016a0141504c8d5424084989f14989d848c7c301000000488b4108488b72184889f2ff126a016a01488b44241848c7c101000000a80174134889c248b8888424c9a37f0000488b5d08ff134883780801756f488b1048833a05741048b8e08424c9a37f0000488b5d08ff1348c7c301000000f6c1017534498d77e8483b75107303ff55404989f748c746f80200000048895e08488b1948891e4889f3488b4908483b65187303ff5548ebc74889d94889e348890b4889e1488b5a0848895908eb37498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548e93cffffff48833c24017507488b4c2408eb30498d4fe0483b4d107303ff55404989cf48c741f803000000488b74240848897110488b34244889710848c70115000000488b7424104883c41048890e488b4c241048894e0848c7c0010000004883c418c36a016a0141505352ff70104c8d442420488b4008e8eef0ffff488b442410498d4fb8483b4d107303ff55404989cf48c741f808000000488b503848895138488b583048895930488b702848897128488b7c2428488979204c8b40184c8941184c8b48104c8949104c8b50084c8951084c8b184c89196a016a014989e04889cb488b442410488b542418909090e876f0ffff498d47d8483b45107303ff55404989c748c740f804000000594883c4204889481848b958cd06c9a37f000048894810488b4c24084889480848c70003000000488b0c24488901488b4424104889410848c7c0010000004883c418c3488b4008e912f0ffff6a016a01415052ff7010ff7308ff73104c8d442428488b40089090e8f2efffff6a016a01488b442438488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba388524c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb6e48c7c003000000488b5424109090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba788524c9a37f000048891148894108488b54241848895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b7424384889731848894310eb05e93300000048c743080100000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808488b442418488b5424089090ff124883380575185049c7c00100000048c7c30100000090ff15320d0000eb374889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010010000004889480848c7000d00000051488b0c2448833905751b5049c7c00100000048c7c3030000004889c890ff15de0c0000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d00000052488b4c240848833905751a5049c7c00100000048c7c3050000004889c8ff158a0c0000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d00000052488b4c2438488b11483b154a0c00007456f6c201753f4889d648bf509adc0000000000488b59184c8b41084c8b49204c8b511048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017424eb3a4c8b4920488b59184c8b51104c8b4108eb284c8b4920488b59184c8b51104c8b41084983fa0175124983f901750c48b980d606c9a37f0000eb4d498d4fb0483b4d107303ff55404989cf48c741f805000000488959204c8941184c8949104c8951084889114889ca488d493048c741f80300000048c74110010000004889510848c70105000000498d57b8483b55107303ff55404989d748c742f80200000048c742080100000048890a488d4a1848c741f80200000048895108488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff15ae0a000048833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c70015000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70117000000488b4424304883c430488908488b4c24104889480848c7c0010000004883c418c3488b4818488339077528488b4910488339017506488b4910eb12488b4908488b09483b65187303ff5548ebe24883f102eb1f4883390d7512488b4908488b09483b65187303ff5548ebba48c7c1010000004883f901743a4150ff7320ff7008ff7318ff7010ff7328ff701849bab0c823c9a37f00004c8b48204989c0488b0b48c7c3030000004889c8ff15ae090000eb21488b4808488b5010488b701848c7c0010000004150ff732051ff731852ff732856488b04244883380b7531488b4018488b4010488b480848833905741048b8a07223c9a37f0000488b5d08ff13488b4110483b65187303ff5548ebc94883380d7512488b4008488b00483b65187303ff5548ebb14883380774134889c148b8e0c823c9a37f0000488b5d08ff1348c7c101000000488b4008a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889ca4883fa03750c48b810cd06c9a37f0000eb4e488b1c24488b442420909090ff15d20800004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b910cd06c9a37f00004889480848c7000d000000498d4fe8483b4d107303ff55404989cf48c741f80200000048ba388624c9a37f00004883c4084889115a48895108488061ffbf6a016a01504c8d4424084889cb488b44241890ff1552080000488b44241090ff154e0800009090ff154e0800004883f801756e48c7c347000000488b442420ff153e080000488b5c242890ff153a080000483b053b0800007431a80175374889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750a48b8303707c9a37f00004889c348c7c001000000eb05e99d00000090ff15ee070000505348bb688724c9a37f000048c7c003000000909090ff15da070000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c7411001000000584883c40848894108488b0424488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000eb724989c248c7c347000000488b44242090ff1552070000488b5c242890ff154e070000483b054f0700007431a80175374889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750a48b8303707c9a37f00004889c348c7c001000000eb05e9e401000090ff15020700004152505348bbc08724c9a37f000048c7c00300000090ff15ee060000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c7411001000000584883c40848894108488b442408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f00000048c7c1010000005af6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4989c24989cb48c7c347000000488b442420909090ff1536060000488b5c242890ff153206000048bbf05c23c9a37f0000ff152a060000483b052b0600007431a80175374889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750a48b8303707c9a37f00004889c348c7c001000000ff15e60500005053415248bb188824c9a37f00004c89d890ff15d6050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488b4c24384883c430488901584889410848c7c0010000004883c408c3f6400801751b488b48084883790801751048b8708824c9a37f0000488b5d08ff134150ff73204989d84889d3488b4008ff1512050000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff15ae040000eb034889c8488b4c2408488901584889410848c7c0010000004883c408c348b880d606c9a37f0000498900488b5b204989580848c7c001000000c36a016a0141505352ff7320ff7008ff70204c8d442430488b40109090e81ae5ffff6a016a01488b4424284989e0488b5c2418488b481048b838ad0ac9a37f00004889caff12488b4424304c8b50104c8b184c8b60084d89d8488b1c24488b4424489090ff1512040000ff7008ff304d89d94d89e0488b5c2410488b44242048ba507722c9a37f0000909090ff15f20300004883f8017506488b0424eb104889c3488b0424909090ff15de030000488b4c24404883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a2841584883c4184c8942204c8b41184c8942184c8b49104c894a104c8b51084c8952084c8b194c891a6a016a01504c8d4424084889d3488b442418488b542428909090e80ee4ffff48833c24017507488b442408eb30498d47e0483b45107303ff55404989c748c740f803000000488b4c240848894810488b0c244889480848c70015000000498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f80200000048c74008010000004889084889c348c7c0010000004883c420ff15da020000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701130000004883fb01742a4889c8498d4fe0483b4d107303ff55404989cf48c741f803000000488941104889590848c70115000000498d47d8483b45107303ff55404989c748c740f80400000048ba80d606c9a37f00004889501848894810488b4c24204889480848c700030000004989c048c7c001000000909090ff1542020000498d4fe0483b4d107303ff55404989cf48c741f803000000488941104c89410848c70101000000488b442418488908594883c4104889480848c7c0010000004883c418c39090909090900000000000000000701d000000000000|@12042,2097151,@19453,@11776,@11265,@2166,@11526,@11336,@12043,@11526,@11336,@12044,@12045,@1382,@7328,@12052,@12053,@11776,@7332,@2165,@12055,@11776,@11117,@12062,@8016,@8522,@12069,@12073,@11889,@2178,@2178,@2178,I48,@2211,@8347,@11807,@1382,@7328,@12074,@100,@100,I48,@11012,@1354,@100,@100,I48,@11012,@1354,@100,@100,@100,I48,@11012,@1354,@12075,@2211,@11526,@11336,@12076,@12077,@12041|14,0,$12004+30 280,0,@509 480,0,@509 688,0,@11116 1173,0,@3194 1245,0,@11334 1441,0,@3194 1513,0,@11334 2063,0,@12005 2253,0,@3172 2451,0,@2163 2643,0,@11115 2810,0,@12006 2955,0,@12012 3319,0,@509 3454,0,@12015 3551,0,@12025 3583,0,@12027 4013,0,@442 4151,0,@12029 4232,0,@12030 4666,0,I48 4772,0,@509 5304,0,@11756 5403,0,@11649 5467,0,@11757 5538,0,@439 5607,0,@439 5652,0,@12031 5776,0,I48 5818,0,@971 5854,0,@12032 6052,0,I48 6094,0,@971 6132,0,@12034 6360,0,@11628 6392,0,I48 6434,0,@971 6464,0,@12036 6651,0,@12038 6826,0,@509 6909,0,@3194 6981,0,@11334 7403,0,@509 12005:D3,264|488b5208f6c2017563488b0a488b591848833b03755b488b730840f6c601753d488b3e4c8b074d8b084c3b08751d4d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb194c8b56084c89d6483b65187303ff5548ebbd49c7c2010000004983fa017521eb0ae976000000e95c000000488b72084889f2483b65187303ff5548e979ffffff4d8b12498b32498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c8b0e4c894f0848c7070d0000004989c3488d472048c740f801000000488938c3488b72084889f2483b65187303ff5548e91dffffff4889c148c7c001000000c390909090909000000000000000000001000000000000|@11562,1023,@19438| 12006:O1|@12007 12007:D3,40|48b8e87c24c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@12011,1,@19439|2,0,@12008 12008:O4|@20055,@557,@12010,@12009 12009:O5|@11418,593,0,593,0 12010:S17|6d697373696e6720696e207265636f7264 12011:S38|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229283129 12012:O4|@20055,@557,@12014,@12013 12013:O5|@11418,632,0,632,0 12014:S22|4c6973743a2062616420656c656d656e742074797065 12015:D4,56|483b65187303ff55484c8b52184c8b4a104c8b4208488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@12017,1048575,@19440,@12016| 12016:D5,136|483b65187303ff55486a016a015041514c89d14989da4d89c14c8d442410488b5b204889c8909090ff157200000048837c2408017506488b0424eb12488b5c2408488b0424909090ff155a0000004889c1498d47e8483b45107303ff55404989c748c740f8020000004883c4105a48895008488908c3909000000000000000008000000000000000|@12019,1048575,@19441,@12020,@12018| 12017:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283129 12018:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19446| 12019:S49|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229 12020:D8,528|483b65187303ff5548a8017572488b086a016a01415041524151ff7008ff31ff7108534c8d442438488b5c241048b838ad0ac9a37f00004c89ca9090ff12488b4424284c8b50104c8b184c8b60084d89d8488b5c24385890ff15ca010000ff7008ff304d89d94d89e0488b5c2440488b44241048ba507722c9a37f0000eb05e965010000ff15a60100004883f8017506488b0424eb104889c3488b0424909090ff1592010000488b4c24304883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a284c8b04244c8942204c8b49184c894a184c8b51104c8952104c8b59084c895a084c8b214c89226a016a01504c8d4424084889d3488b442428488b542468ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c24084889480848c700050000006a016a0150ffb424800000004c8b5424604c8b4c24584c8d442410488b5c2438488b4424509090e88efeffff498d47e8483b45107303ff55404989c748c740f80200000048c74008010000005948890848833c2401740d488b1c24909090ff15960000004883f8017507488b442410eb0f4889c3488b44241090ff1582000000488b4c24584883c408488901584883c4484889410848c7c0010000004883c418c2080049c700010000004989580848c7c001000000c20800909000000000000000000802000000000000|@12022,1048575,@19442,@11526,@11336,@12023,@12024,@12021|47,0,@3194 117,0,@11334 12021:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19445| 12022:S60|434f444547454e5f50415253455452454528292e636f646547656e657261746528322970726f63657373426f6479283229636f64654c697374283229 12023:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19443| 12024:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19444| 12025:O4|@20055,@557,@3407,@12026 12026:O5|@2182,357,0,357,0 12027:O4|@20055,@557,@3410,@12028 12028:O5|@2182,359,0,359,0 12029:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19447| 12030:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19448| 12031:D3,264|488b5208f6c2017563488b0a488b591848833b03755b488b730840f6c601753d488b3e4c8b074d8b084c3b08751d4d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb194c8b56084c89d6483b65187303ff5548ebbd49c7c2010000004983fa017521eb0ae976000000e95c000000488b72084889f2483b65187303ff5548e979ffffff4d8b12498b32498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c8b0e4c894f0848c7070d0000004989c3488d472048c740f801000000488938c3488b72084889f2483b65187303ff5548e91dffffff4889c148c7c001000000c390909090909000000000000000000001000000000000|@11562,1023,@19449| 12032:O1|@12033 12033:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19450|2,0,@441 12034:O1|@12035 12035:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19451|2,0,@441 12036:O1|@12037 12037:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19452|2,0,@441 12038:O4|@20055,@557,@12040,@12039 12039:O5|@11418,557,0,557,0 12040:S20|636f646567656e3a20556e617279207475706c65 12041:D3,168|483b65187303ff5548a8017572488b08498d57c8483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c70201000000488d7a2048c747f80200000048c747080300000048891757488b50084889d0e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,63,@19478| 12042:S35|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229 12043:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19454| 12044:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19455| 12045:D7,552|483b65187303ff5548a80174144889c148b8688d24c9a37f0000488b5d0890ff13488b086a016a01415041524151ff7008ff31ff7108534c8d442438488b5c241048b838ad0ac9a37f00004c89ca9090ff12488b4424284c8b50104c8b184c8b60084d89d8488b5c24385890ff15ce010000ff7008ff304d89d94d89e0488b5c2440488b44241048ba507722c9a37f0000909090ff15ae0100004883f8017506488b0424eb104889c3488b0424909090ff159a010000488b4c24304883c408498d57b8483b55107303ff55404989d748c742f808000000488b593848895a38488b713048897230488b792848897a2841584883c4084c8942204c8b41184c8942184c8b49104c894a104c8b51084c8952084c8b194c891a6a016a01504c8d4424084889d3488b442418488b5424589090ff1248837c242001752c488b442438488b0c24488908488b4c240848894808488b4c24104889481048c7c0010000004883c450c208006a016a016a01ff7424704c8b5424504c8b4c24484c8d442408488b5c2430488b442440e872feffff498d47e8483b45107303ff55404989c748c740f802000000488b4c24204889480848c70005000000498d4fe8483b4d107303ff55404989cf48c741f8020000005a488951084889014883f9017507488b442410eb0f4889cb488b44241090ff1566000000488b4c24484889015848894108584889411048c7c0010000004883c450c2080090909090909000000000000000002002000000000000|@12050,1048575,@19456,@11526,@11336,@12051,@12049|18,0,@12046 67,0,@3194 137,0,@11334 12046:O4|@20055,@557,@12048,@12047 12047:O5|@11418,697,0,697,0 12048:S22|4578705365713a20656d7074792073657175656e6365 12049:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19458| 12050:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f64654c697374283229 12051:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19457| 12052:D3,120|483b65187303ff5548a801754d488b08488b51084883e2094883fa01743051488b40089090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,7,@19459| 12053:D5,152|483b65187303ff5548ff72204c8b521849c7c1010000004c8b42104889c3488b420848ba00ff21c9a37f0000ff157e00000048833805751449c7c00100000048c7c303000000ff256c0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c3909090909000000000000000009000000000000000|@12054,2097151,@19460,@11117,@2178|36,0,@11115 12054:S47|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229676574436f6e737472283129 12055:D11,672|483b65187303ff55484152415050415153488b48184889c8ff159a020000488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c101000000f6c1017568488b0424498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048bbe09324c9a37f000048891a48894a08488b580848895a10488062ffbf488b3040f6c601740deb05e9750100004883c6027105ff5570ebf5498d7fe0483b7d107303ff55404989ff48c747f80300000048894f10488957084889374889ce488b442408ff15c601000056ff742428ff7424404989c24c8b4c24304989f848bb10cd06c9a37f0000488b44242848ba18ff21c9a37f000090ff159a01000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15460100009090ff1546010000505348bb689524c9a37f000048c7c003000000909090ff1532010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c428c20800488b442408ff15aa000000488b4c2430488b5424204889542430488b54242848894c24284989c24c8b4c24184c8b042448bb80d606c9a37f0000488b4424104889d648ba18ff21c9a37f00004883c42856ff256600000090909090909000000000000000009802000000000000|@12060,2097151,@19463,@1401,@12061,@11265,@2258,@2259,@1354,@12059,@11265|146,0,@12056 272,0,@439 287,0,@11116 406,0,@12057 501,0,@971 613,0,@509 631,0,@11116 12056:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19461,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12057:O1|@12058 12058:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19462|2,0,@441 12059:D3,136|483b65187303ff5548a8017561498d4fe0483b4d107303ff55404989cf48c741f80300000048c741100100000048c7410801000000488b1048891151488b50084889d09090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008000000000000000|@1363,7,@19465| 12060:S29|56414c55455f4f505328292e636f6465457846756e6374696f6e283629 12061:D3,136|483b65187303ff5548a8017561498d4fe0483b4d107303ff55404989cf48c741f80300000048c741100100000048c7410801000000488b1048891151488b50084889d09090e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000008000000000000000|@1363,7,@19464| 12062:D7,696|483b65187303ff5548f6c301756d488b0b6a016a01415041524151ff730850ff314c8d4424304c89d3488b41184c89caff126a016a01488b442440488338057548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba509a24c9a37f000048891148894108488061ffbf4889e048c70001000000eb05e9850100004889e048894808eb6f48c7c003000000488b542470909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba909a24c9a37f000048891148894108488b54246848895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b7424404889731848894310eb05e93300000048c743080100000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808488b5c2460488b4424109090ff158e010000498d4fd0483b4d107303ff55404989cf48c741f80500000048ba509b24c9a37f0000488911488b54240848895108488b54246848895110488b5c24184889591848894120488061ffbf6a016a01ffb4248000000052ffb42480000000ffb424800000004c8b5424604c8b4c24584c8d442420488b5c24504889c890e83efeffff48833c24017507488b442410eb12488b1c24488b442410909090ff15f6000000488b4c24484883c408488901584883c4384889410848c7c0010000004883c418c2200041504889c3488b44241090ff15ca000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff1566000000eb034889c8488b0c2448c701010000004889410848c7c0010000004883c408c22000909090900000000000000000b002000000000000|@12068,1048575,@19469,@11807,@12067,@1354,@2211|91,0,@12063 180,0,@12064 348,0,@12065 12063:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19466| 12064:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19467| 12065:D3,64|483b65187303ff5548a8017509f64220017503ff5570483b4220750d488b4210488b4a084889caff22488b5218ff229000000000000000003800000000000000|@12066,1048575,@19468| 12066:S54|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c6973742832296c6f6f6b466e283129 12067:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19470| 12068:S45|434f444547454e5f50415253455452454528292e636f646547656e65726174652832296465636c697374283229 12069:D10,512|483b65187303ff5548a801756c6a016a0141524151415053ff70084c8d442428488b5c2410488b00488b542408909090ff12ff742458ff742458ff742458ff7424584c8b5424404c8b4c24384c8b442430488b5c2428488b4424209090e89effffff504c8b442428488b5c242048b818eb23c9a37f0000eb05e9100100009090ff1592010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c74108010000005a4883c420488911498d57e8483b55107303ff55404989d748c742f80200000048894a08488b4c240848890a498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889510848c7011d000000f6c2017524488b1a48833b057512488b5a084889da483b65187303ff5548ebe048c7c201000000eb0748c7c2030000004883fa01740d504889c890ff15e2000000eb074889c24889c852488b4c2440488b542438488b5c2430488954244048895c2438415a41594883c4104989c84889c348b818eb23c9a37f000048ba18ff21c9a37f00005e4883c41056ff259a00000041524d89d0488b5c241048b8f8f023c9a37f00009090ff1586000000ff742418ff742428ff742410ff357c000000ff157e0000004989e14c8b442420488b5c244848ba98f808c9a37f0000909090ff15660000004883c428c22000909090909090900000000000000000f801000000000000|@12071,2097151,@19471,@11776,@2211,@11265,@11776,@12070,@7332,@2165|111,0,@11819 368,0,@11819 378,0,@11116 410,0,@11866 465,0,@2163 12070:D5,160|483b65187303ff5548ff72184c8b521049c7c1010000004c8b42084889c348b8f8f023c9a37f000048ba00ff21c9a37f00009090ff157e00000048833805751449c7c00100000048c7c303000000ff256c0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c3909090909000000000000000009800000000000000|@12072,2097151,@19472,@11117,@2178|32,0,@11866 42,0,@11115 12071:S46|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129 12072:S58|434f444547454e5f50415253455452454528292e636f646547656e6572617465283229636f6e734c697374283129676574436f6e737472283129 12073:D4,56|483b65187303ff55484989c24c8b4a184c8b421048c7c303000000488b4208ff252b00000090909000000000000000003000000000000000|@12011,2097151,@19473,@8347| 12074:D3,120|483b65187303ff5548a801754d488b08488b51084883e2094883fa01743051488b40089090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,7,@19474| 12075:D3,136|483b65187303ff5548a801755d6a016a01415053ff70084c8d442418488b5c2410488b00488b542408909090ff124c8b442410488b5c2408584883c410e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c390909090909000000000000000008000000000000000|@1363,1048575,@19475| 12076:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19476| 12077:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19477| 12078:D39,3648|488dbc24d8feffff483b7d187303ff55504889c14883392d750f488b4908483b65187303ff5548ebeb488339177506488b4910eb2b4883390b74164889c648b8f0b224c9a37f0000488b5d08909090ff13488b4910483b65187303ff5548ebb46a016a016a0141f6c0017425498b71084889e74c8b164c89174889e74c8b5e084c895f084889e74c8b66104c896710eb68498b7108498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707010000004d8d57e04c3b55107303ff55404d89d749c742f80300000049bb88b324c9a37f00004d891a49897a084c8b5e084d895a10498062ffbf4c8b2641f6c401740deb05e9210000004983c4027105ff5570ebf54989e54d8965004989e44d895424084989e249897a10498d7ff0483b7d107303ff55404989ff48c747f801000000c647ff4048c707030000004d8d57e84c3b55107303ff55404d89d749c742f80200000049bc10b524c9a37f00004d892249897a08498062ffbff6c10174144989c448b8b8b524c9a37f0000488b5d0890ff134c8b214d8b6c24104d8b6d004d8b7424184d8b3641ff71185641ff7110574152534156415551505241514150498b4424089090ff15960c000048c7c101000000a801751ff6c10174064883c1027105ff5570ebf5488b4008483b65187303ff5548ebdd4889c84883f8037465f604240174644989c248c7c351000000488b4424609090ff154e0c000041525048c7c3030000004c89d048baa05f06c9a37f0000909090ff15360c00004889c3589090ff15320c000048c7c353000000909090ff152a0c0000498d4ff0483b4d10730feb0ae999070000e994070000ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048bb50b624c9a37f000048891a48894a08488b5c247848895a10488062ffbf488b5c2470f6c30174064883c3027105ff5570ebf5498d77e0483b75107303ff55404989f748c746f80300000048894e104889560848891e48833c24037470488b1424f6c20174084883fa017e08eb19f642ff1074134889c348b8202123c9a37f0000488b5d08ff1350515648bbd8b724c9a37f00004889d0909090ff154a0b0000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000eb05e945000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15e20a0000eb154889c8eb104889c248b810cd06c9a37f0000525156488b4c2428488b542430ff7138ff7128ff742420ff742478ff742420ff3150ff742478ff742478ff7208ff35a30a0000ffb424b0000000ff7120ff742468ff31ffb424d80000004c8b9424d00000004c8b8c24c80000004989c0488b9c2490000000488d44242848ba502223c9a37f00009090ff15620a00004883c46059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff150a0a0000488b4c2458488b09488b542458488b12488b742458488916488b1424483b15ef090000743af6c20175444889d648bf509adc00000000004989c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c1eb0f4989c848b9303707c9a37f0000eb094889ce4889d14989f04889ceff159a090000415050565348bb80b824c9a37f0000488b4424289090ff1586090000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c420488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000005048c7c003000000488b542460909090ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000498d57d8483b55107303ff55404989d748c742f80200000048c742080100000048890a488b4c2460488d5a1848c743f801000000c643ff4048c70301000000488b3140f6c60174064883c6027105ff5570ebf540f6c601740af601017405482b317105ff5570ebf64883c60140f6c60174084883fe017c08eb19f646ff1074134889c748b8701e09c9a37f0000488b5d08ff1340f6c60174084883fe017e5beb06f646ff10755340f6c60174064883ee027105ff5570ebf54889c7498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488970084889385253488b51089090ff12488b1c249090ff15da070000eb4da80174084883f8017c08eb19f640ff1074134889c148b8001f09c9a37f0000488b5d08ff134889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c700050000005253498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701090000005148bbd8b824c9a37f0000488b442418ff155a070000a801755848837808017551498d4fe8483b4d107303ff55404989cf48c741f802000000488b004889410848b810cd06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908eb4c48c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc5048bb68b924c9a37f00004889c89090ff15c20600005b90ff15c20600009090ff15c20600009090ff15c2060000498d4fd8483b4d107303ff55404989cf48c741f80400000048c74118030000005a488951104889410848c701070000004989ca48bb886423c9a37f0000488b442478ff158206000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff152e060000483b1d2f0600007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15ea0500005053415248bbf0b924c9a37f000048c7c00300000090ff15d6050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f00000048833c240175084881c490000000c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004881c490000000c348bb886423c9a37f0000488b44246090ff150a050000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048bb48ba24c9a37f000048891a48894a08488b5c247048895a10488062ffbf488b5c2468f6c30174064883c3027105ff5570ebf5498d77e0483b75107303ff55404989f748c746f80300000048894e104889560848891e488b542408488b5c2410ff7238ff722850ff74245856ff32ff742450ff742450ff7308ff35570400005051ffb42498000000ff722056ff32ffb424c00000004c8b9424b80000004c8b8c24b000000049b810cd06c9a37f00004889c3488d44243848ba502223c9a37f000090ff151604000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15c2030000488b8c24a0000000488b09488b9424a0000000488b12488bb424a0000000488916488b1424483b159e030000743ff6c20175324889d648bf509adc00000000004989c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017517eb054989c8eb104c89c148ba303707c9a37f00004989c84889d690ff154e030000415050565348bbd0bb24c9a37f000048c7c003000000ff153a030000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000f64424580174084881c4d8000000c348c7c101000000488b542458f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc4989c24989cb48bbf05c23c9a37f0000488b042490ff156e020000488b8c24d0000000488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8ff1516020000483b1d170200007432f6c30175394889de48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034889d94889cb90ff15d20100004152505348bb28bc24c9a37f00004c89d890ff15c2010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c7411001000000584883c4084889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004881c4d8000000c390909090900000000000000000380e000000000000|@12106,2097151,@19490,@11645,@100,@194,@100,@100,@1354,@2211,@12107,@11577,@2258,I48,@2259,@1354,@2226,@1354,@1354,@1699,@12109,@2166,@100,@2258,I48,@11012,@1354,@100,@12105,@11577,@2258,I48,@2259,@1354,@100,@2258,I48,@2259,@1354|64,0,@12079 210,0,@12082 348,0,@12083 378,0,@12085 545,0,@193 663,0,@12088 783,0,@11570 802,0,@12089 946,0,@439 1062,0,@11575 1221,0,I48 1274,0,@971 1309,0,@12091 1651,0,@2221 1791,0,@2224 1883,0,@12093 1946,0,@439 2043,0,@12096 2139,0,@11633 2269,0,I48 2311,0,@971 2340,0,@12098 2554,0,@11633 2635,0,@12100 2801,0,@439 2819,0,@11575 2982,0,I48 3037,0,@971 3065,0,@12101 3279,0,@11628 3413,0,I48 3455,0,@971 3484,0,@12103 12079:O4|@20055,@557,@12081,@12080 12080:O5|@11418,798,0,798,0 12081:S42|676574466e426f64793a206e6f74206120636f6e73747261696e656420666e2d65787072657373696f6e 12082:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19479,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12083:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@12084,15,@19480| 12084:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429666e4d6b41646472283129 12085:O4|@20055,@557,@12087,@12086 12086:O5|@11418,814,0,814,0 12087:S43|636f64654c616d6264613a20626f6479206f6620666e206973206e6f74206120636c61757365206c697374 12088:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19481,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12089:O1|@12090 12090:D3,112|a80174084883f8017c08eb19f640ff1074134889c148b8f0a115c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70101000000488d411848c740f8020000004889480848c70009000000c300000000000000006800000000000000|@11673,3,@19482|23,0,@6844 12091:O1|@12092 12092:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19483|2,0,@441 12093:O1|@12094 12094:D3,24|48c7c003000000c300000000000000001000000000000000|@12095,1,@19484| 12095:S44|434f444547454e5f50415253455452454528292e636f64654c616d62646128342972657350726f632d283129 12096:O1|@12097 12097:D3,80|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048b910cd06c9a37f00004889480848c7000d000000c390909000000000000000004800000000000000|@11638,3,@19485|41,0,@439 12098:O1|@12099 12099:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19486|2,0,@441 12100:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19487,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12101:O1|@12102 12102:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19488|2,0,@441 12103:O1|@12104 12104:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19489|2,0,@441 12105:D3,152|483b65187303ff5548498d4fb8483b4d107303ff55404989cf48c741f808000000488b5a484889593848c7413001000000488b72404889712848894120488b423848894118488b7a30488979104c8b42284c8941084c8b4a204c89094989ca49c7c10100000049b810cd06c9a37f0000488b5a18488b4210488b4a084889caff229090909090909000000000000000009000000000000000|@12108,1048575,@19493|104,0,@439 12106:S33|434f444547454e5f50415253455452454528292e636f64654c616d626461283429 12107:D3,144|483b65187303ff5548498d4fb8483b4d107303ff55404989cf48c741f808000000488b5a504889593848c7413001000000488b72484889712848894120488b424048894118488b7a38488979104c8b42304c8941084c8b4a284c89094989ca49c7c1010000004c8b4220488b5a18488b4210488b4a084889caff22909090909000000000000000008800000000000000|@12108,1048575,@19491| 12108:S44|434f444547454e5f50415253455452454528292e636f64654c616d626461283429636f6465416c7473283129 12109:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19492| 12110:D4,136|483b65187303ff554848c7c10100000041ff703041ff702841ff701841ff3053415052a8017542488b1424ff7008ff7208ff742428ff742448ff7424304c8b5424484c8b4c24304c8b4424504889cb488b009090ff15460000004889c158483b65187303ff5548ebba4889c84883c438c39090909090909000000000000000008000000000000000|@12120,2097151,@19499,@12111| 12111:D33,2968|488dbc24e8feffff483b7d187303ff5550488b4818488b094883f90174644889ce488b384c8b58104c8b60084889f090ff157a0b0000a801756048837808017505488b00eb594c8b28488b4008909090ff15620b00004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084c89284989dd4989f64151eb05e9300000005741509090ff152e0b00004c89f64c89ebeb3de9070000004151574150eb3148b8509adc00000000004151574150eb20488b10488b7010488b780848c7c0bf00000041515241504989f34989fc4889ce535641534154504152488b5c24304889f0ff15da0a00004889c148c7c201000000f6c101753b4883fa017505488b11eb1e4889c6488b79084889d3488b01909090ff15b20a00004889c24889f0eb04488b79084889f9483b65187303ff5548ebc04889d148c7c2010000004889cbf6c301751ff6c20174064883c2027105ff5570ebf5488b5b08483b65187303ff5548ebdc6a016a016a016a016a016a016a014883fa017552488b5c24784889e6488b3b48893e4889e64c8b43084c8946084889e64c8b4b104c894e104889e64c8b53204c8956184889e64c8b5b284c895e204889e64c8b63304c8966284889e64c8b6b384c896e30eb74498d5ff0483b5d107303ff55404989df48c743f801000000c643ff4048c70303000000498d77e8483b75107303ff55404989f748c746f80200000048bf60cc24c9a37f000048893e48895e08488066ffbf488b5c2478488b7b084d8d47f04c3b45107303ff55404d89c749c740f801000000eb05e99201000041c640ff4049c700010000004d8d4fe04c3b4d107303ff55404d89cf49c741f80300000049ba48cd24c9a37f00004d89114d8941084c8b57084d895110498061ffbf4c8b1f41f6c30174064983c3027105ff5570ebf54d8d67e04c3b65107303ff55404d89e749c74424f8030000004d894424104d894c24084d891c244153ff350b090000515052564154488d5c24284889d090ff15fe0800004889c3488b44242048bab09b09c9a37f0000ff15ee080000488b8c24b0000000498d57d8483b55107303ff55404989d748c742f8020000004889420848c70203000000488d421848c740f801000000c640ff4048c70001000000498d5fc0483b5d107303ff55404989df48c743f80400000048895318488b54240848895310488b342448897308488903488d432848c740f802000000488b792848897808488918488d5c24384c8b014c8903488d5c243848897308488d5c24384883c40848895310488d5424304883c408488b592048895a18488d54242848894220488d44242848c7402801000000488d442428488b513848895030eb076a016a01515052488b5c2468488b44246090ff15fe07000048c7c35b000000909090ff15f6070000498d4fb8483b4d107303ff55404989cf48c741f808000000488b54245848895138488b54245048895130488b54244848895128488b5c24404889592048894118488b44243848894110488b5c243048895908488b7424284889316a016a014989e04889cb488b842480000000488b9424d80000009090ff126a016a01488b442410488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048bad0ce24c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb6e48c7c003000000488b5424589090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba10cf24c9a37f000048891148894108488b54245048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b7424104889731848894310eb05e93300000048c743080100000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808498d47d8483b45107303ff55404989c748c740f804000000488b4c246848894818488b54245848895010488b5c245048895808488bb424e0000000488930504889d8488b54241090ff126a016a014989e24c8b4c24104c8b8424b00000004889c3488b8424d0000000909090ff151e06000048837c240801753e4883bc24f000000001753349bad0cf24c9a37f00004c8b8c24b00000004c8b8424e800000048c7c301000000488b8424f80000009090ff15e2050000eb0748c7c001000000488b8424f8000000488b4868f6c101753e488b11488b1a483b1dc3050000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756a48b998c809c9a37f0000f6c101753e488b11488b1a483b1d71050000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751848b8c0cf09c9a37f0000488b5d08eb05e92c00000090ff13488b0e488b11483b1516050000741148b878e107c9a37f0000488b5d0890ff134883791001745feb26488b0e488b11483b15f5040000741048b878e107c9a37f0000488b5d08ff134883791001744a48c7c301000000488b8424d000000090ff15ce040000a8017527ff7008488b9c2400010000488b00ff15be04000058483b6518730aeb05e90e000000ff5548ebd548c7c001000000eb0748c7c00100000048837c243801751f48833c24017507488b442418eb67488b1c24488b442418ff157e040000eb5b488b8424d8000000ff7008ff701048c7c003000000488b1424909090ff12f68424900000000174154889c148b808c009c9a37f0000488b5d089090ff13488b8c2490000000488b09488b09488b094889c34889c8eb0ae931030000e92c030000ff151e04000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848837c2410017507488b4c2428eb204889de4889c7488b5c2410488b44242890ff15be0300004889c14889f84889f34883f90174104889de4889cb90ff15aa0300004889f34889df4989c0488b8424c800000090ff159a030000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e5741504889c8ff1536030000eb064889c857415048833c2401742e4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c70015000000488b8c24880000004883c408488b4910488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff1596020000535048c7c001000000488b94249800000090ff124889c3589090ff157e020000535048bb00d024c9a37f0000488b44246890ff156e020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424084889513048c741280100000048894120584883c4084889411848c741100100000048b8f05c23c9a37f00004889410858488901498d47c0483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d481848c741f80400000048894118488b04244889411048c741080100000048c701030000005150ff7424704c8b5424284c8b4c242049c7c001000000488b5c2470488b8424e8000000ff15aa010000504c8b5424704c8b4c24104c8b4424204c89c348c7c001000000ff1592010000498d4fb8483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f8020000005a488950084889084889c1488d401848c740f80200000048894808594883c4184889084883f801750f4881c4c0000000584883c418c220004889c3488b8424c00000004881c4e0000000594883c42051ff251501000090909090900000000000000000900b000000000000|@12122,2097151,@19500,@12123,@12124,@109,@12125,@12130,@12131,@1354,@2561,@100,@100,@12135,@8347,@20136,@20136,@20136,@20136,@11729,@11553,@12148,@7326,@12149,@12150,@12151,@2211,@2258,@11012,@1354,@12155,@12162,@12121|168,0,I48 524,0,@12112 622,0,@12114 748,0,@2560 1187,0,@12115 1268,0,@12116 1527,0,@12117 1677,0,@2635 1767,0,@2690 1806,0,@1486 1847,0,@1486 2033,0,@2630 2558,0,@12118 2650,0,@11628 12112:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@12113,15,@19494| 12113:S106|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d666e4d6b41646472283129 12114:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19495,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12115:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19496| 12116:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19497| 12117:S26|5061747465726e206973206e6f7420657868617573746976652e 12118:O1|@12119 12119:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19498|2,0,@441 12120:S44|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329 12121:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19525| 12122:S58|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229 12123:D3,96|483b65187303ff5548a8017535488b08ff31488b48084889c8e8e2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000005800000000000000|@1363,3,@19501| 12124:D3,120|483b65187303ff5548a8017551ff30488b40089090e8e6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c700f9000000c348c7c001000000c3909000000000000000007000000000000000|@1585,3,@19502| 12125:D4,112|483b65187303ff5548a801754553ff7008488b00ff156e00000050488b5c2410488b442408e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,2097151,@19504,@12126| 12126:D6,112|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bae0d324c9a37f000048891148895908488061ffbf6a016a014989e04889cb488b4018909090ff153a0000004883c4085890ff1536000000ff253800000000000000000000006800000000000000|@12129,2097151,@19505,@1382,@7328,@12128|35,0,@12127 12127:D3,264|488b5208f6c2017563488b0a488b591848833b03755b488b730840f6c601753d488b3e4c8b074d8b084c3b08751d4d8d57f04c3b55107303ff55404d89d749c742f80100000049893aeb194c8b56084c89d6483b65187303ff5548ebbd49c7c2010000004983fa017521eb0ae976000000e95c000000488b72084889f2483b65187303ff5548e979ffffff4d8b12498b32498d7fd0483b7d107303ff55404989ff48c747f8030000004c8b46084c8947104c8b0e4c894f0848c7070d0000004989c3488d472048c740f801000000488938c3488b72084889f2483b65187303ff5548e91dffffff4889c148c7c001000000c390909090909000000000000000000001000000000000|@11562,1023,@19503| 12128:D3,120|483b65187303ff5548a801754d488b08488b51084883e2094883fa01743051488b40089090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,7,@19506| 12129:S77|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229706f6c7956617273466f7256616c732d283129 12130:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19507| 12131:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb08d724c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@12134,15,@19509|29,0,@12132 12132:D3,152|483b65187303ff5548488b08f6c101740cf64210017406482b4a107105ff5570ebf54883c101488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048894808488b52084889104889daff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c39090909090909000000000000000009000000000000000|@12133,1048575,@19508| 12133:S110|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129283129 12134:S107|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229747970655661724d61707c6d6b416464727c6c6576656c7c6c6f63616c436f6e746578742d61726741646472732d283129 12135:D8,552|483b65187303ff55486a016a016a0141524151415053488d4c2420514d89ca4d89c149c7c00300000048bbc8b623c9a37f000090ff1506020000498d47e0483b45107303ff55404989c748c740f803000000488b4c243048894810488b4c242848894808488b4c24204889084889c348c7c0030000009090ff15ca0100006a016a016a016a014989e249c7c10100000049b840db24c9a37f00004889d94889c34889c890ff15a6010000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c4184889086a016a016a016a014889e3ff1562010000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b542408488950085a4883c4084889104883f901750948c7c101000000eb60f6c10174144889c248b8e81f08c9a37f0000488b5d0890ff1348833901750948c7c103000000eb64f6c10174144889c248b8e81f08c9a37f0000488b5d0890ff13488b11f6c20174084883fa017e16eb06f642ff10750e48c7c101000000eb39e934000000f6c10174134889c348b8582008c9a37f0000488b5d08ff13488b51084889d1483b6518730aeb05e908000000ff5548e958ffffff4883f102514c8b4c24284c8b442420488b5c2418909090ff156a000000488b4c2430488901584883c4284889410848c7c0010000004883c420c3909090909000000000000000002002000000000000|@12144,2097151,@19511,@11755,@12145,@11919,@11926,@12138|43,0,@11740 146,0,@12136 330,0,@1625 370,0,@1625 431,0,@1628 12136:O1|@12137 12137:D3,144|48833801750948c7c001000000eb20f600017415488b0848b8e81f08c9a37f0000488b5d089090ff13488b00488b00498d4fc0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80400000048c74018030000004889481048c740080100000048b9b00607c9a37f0000488908c300000000000000008800000000000000|@11743,3,@19510|25,0,@1625 116,0,@803 12138:D7,808|483b65187303ff5548488b08488339077506f641080174154889c148b878df24c9a37f0000488b5d089090ff13488b5108488b324151ff364150ff701041ff7108ff70085348c7c003000000498b5110ff12498d4fd8483b4d107303ff55404989cf48c741f8040000005a488951184889411048c741080100000048c70103000000a80174084883f8017c08eb1bf640ff1074154889c248b8f0a115c9a37f0000488b5d089090ff13498d57d0483b55107303ff55404989d748c742f8020000004889420848c70205000000488d5a1848c743f8020000004889530848c703090000005af6c2017544488b32488b7e1048833f0574134989c048b8a03224c9a37f0000488b5d08ff134c8b47084989004c8b4f104c8b14244d89114c8b5a084c89da483b65187303ff5548ebb748c7c201000000488b4424084883f801750948c7c001000000eb60a80174154889c248b8e81f08c9a37f0000488b5d089090ff1348833801750948c7c003000000eb64a80174154889c248b8e81f08c9a37f0000488b5d089090ff13488b10f6c20174084883fa017e16eb06f642ff10750e48c7c001000000eb39e934000000a80174144889c248b8582008c9a37f0000488b5d0890ff13488b50084889d0483b6518730aeb05e908000000ff5548e958ffffff4883f801750948c7c001000000eb7251534c8b4c243049c7c001000000488b44242890ff1536010000504c8b44242848bb10e024c9a37f000048b830e024c9a37f0000ff151e010000498d4fd8483b4d107303ff55404989cf48c741f8040000004889411848b880d606c9a37f000048894110584889410848c70103000000eb05e93f000000498d47d0483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1488d401848c740f80200000048c7400801000000488908eb025153504c8b54243849c7c1010000004c8b44240848c7c303000000488b4424309090ff15820000004883f8017506488b0424eb104889c3488b0424909090ff156e0000004889c1498d47e8483b45107303ff55404989c748c740f802000000488948084883c410594883c428488908c3909000000000000000002003000000000000|@12147,2097151,@19513,@11963,@11750,@11965,@12146|29,0,@12139 153,0,@6844 251,0,@11949 337,0,@1625 377,0,@1625 438,0,@1628 530,0,@12142 540,0,@12143 584,0,@509 12139:O4|@20055,@557,@12141,@12140 12140:O5|@11748,1124,0,1124,0 12141:S42|636f646542696e64696e673a2073686f756c64206265206e61697665207061747465726e206d61746368 12142:O3|2,100,0 12143:S4|42696e64 12144:S38|4d415443485f434f4d50494c455228292e636f646542696e64696e675061747465726e283429 12145:D3,120|483b65187303ff5548a80174084883f8037e10eb06f640ff10750848c7c001000000c34889c1f6c10174064883c1027105ff5570ebf5504889c8909090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3909000000000000000007000000000000000|@11918,3,@19512| 12146:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19514| 12147:S31|4d415443485f434f4d50494c455228292e636f646542696e64696e67283429 12148:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19515| 12149:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19516| 12150:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19517| 12151:D3,240|483b65187303ff5548a801756e488b08488b511048833a057417488b580848b868e424c9a37f0000488b5d08909090ff13488b5a08488b1bf6c30174084883fb017c08eb1cf643ff107416488b700848b8f0a115c9a37f0000488b5d089090ff13498d77d0483b75107303ff55404989f748c746f802000000eb05e95600000048895e0848c70605000000488d5e1848c743f8020000004889730848c7030900000053488b70084889f0909090e84effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390900000000000000000e800000000000000|@1363,31,@19518|32,0,@12152 81,0,@6844 12152:O4|@20055,@557,@12154,@12153 12153:O5|@11418,1641,0,1641,0 12154:S7|6c6f616456616c 12155:D10,984|483b65187303ff5548a8017567f6c301756741524151ff7308ff70084150ff33ff3048c7c0030000004c89caff1259488b511048833a0574144889c348b810e924c9a37f0000488b5d0890ff13488b5a08488903488b7210488b7c242848893e48833c2401756a504c8b5424404c8b4c2448eb0ae943030000e93e0300004989f84889fb48c7c00100000090ff155e03000048833805751449c7c001000000488b5c2410ff154e030000eb5f4889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000eb05e916000000488b542410488950104889480848c7000d000000eb6849c7c0010000004c8b0c2441f6c101752741f6c00174064983c002710ceb05e918020000ff5570ebee4d8b4908483b65187303ff5548ebd34d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c701010000004d8d57e04c3b5510730aeb05e9cf010000ff55404d89d749c742f80300000049bb88e924c9a37f00004d891a4d894a084c8b5f084d895a10498062ffbf4c8b2741f6c40174064983c4027105ff5570ebf54d8d6fe04c3b6d107303ff55404d89ef49c745f8030000004d894d104d8955084d89650050415041514c8b5424504c8b4c24584989f84c89eb488b44241890ff152202000048833805751449c7c001000000488b5c2420ff1512020000eb374889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b542420488950104889480848c7000d00000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c89090ff15860100009090ff1586010000505348bb10eb24c9a37f0000488b44241090ff1576010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280100000048894120488b4424084889411848c741100100000048b8f05c23c9a37f000048894108584883c410488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584883c4084889411048c741080100000048c7010300000058a80174064883c0027105ff5570ebf551ff742438ff7424384c8b5424304c8b4c24284989c0488b5c2420488b44241890e86efcffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c420488908c2100048c7c001000000c2100090900000000000000000d003000000000000|@12166,1048575,@19522,@12162,@2178,@12162,@2178,@2258,@11012,@1354|62,0,@12156 361,0,@12159 662,0,@12160 753,0,@11628 12156:O4|@20055,@557,@12158,@12157 12157:O5|@11418,1680,0,1680,0 12158:S13|6c6f616446756e6374696f6e73 12159:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19519,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12160:O1|@12161 12161:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19520|2,0,@441 12162:D7,336|483b65187303ff554848c7c1010000004889c2f6c201751ff6c10174064883c1027105ff5570ebf5488b5208483b65187303ff5548ebdc534152415141505048bb00ed24c9a37f00004889c8ff15160100004889c35848bab09b09c9a37f0000ff150a010000488b4c24185a488b19f6c301740af602017405482b1a7105ff5570ebf64883c3014889c2498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b1c2448891852488b51089090ff12498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70109000000514c8b442420488b5c2408488b442418909090ff157e0000009090ff157e0000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018030000005a4883c420488950104889480848c70007000000c390909090909000000000000000004801000000000000|@12168,1048575,@19523,@1354,@2561,@12167,@2166|65,0,@12163 88,0,@2560 12163:O1|@12164 12164:D3,24|c39090909090909000000000000000001000000000000000|@12165,1,@19521| 12165:S93|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e2832297661724e6f732d283129 12166:S85|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6c6f616446756e6374696f6e73283329 12167:D3,344|483b65187303ff5548a80175614889d9f6c1017540488b11488b32488b384c8b0e4c3b0f751d4d8d57f04c3b55107303ff55404d89d749c742f801000000498912eb194c8b51084c89d1483b65187303ff5548ebbb49c7c2010000004983fa01751148b9c87809c9a37f0000eb6ce9cb0000004d8b12498b08f6c101740b41f600017405492b087105ff5570ebf64883c101488b5008498d47e0483b45107303ff55404989c748c740f80300000048c7401003000000488948084d8b52084c891041505352498b5008909090ff12498d4fe8483b4d10730aeb05e91b000000ff55404989cf48c741f8020000004889410848c70109000000eb06415053ff7008514c8b442418488b5c2410488b44240890e8eafeffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c3909000000000000000005001000000000000|@1363,1048575,@19524|100,0,@2514 12168:S83|434f444547454e5f50415253455452454528292e636f64654e6f6e52656356616c42696e64696e6773283329636f646542696e64696e67283229726573756c74436f64652d6170706c69636174696f6e283229 12169:D3,120|483b65187303ff55486a016a01ff7028ff30ff7218488d4c241851ff72204c8b50204c8b48184c8b4010488b5a10488b48084889c8488b4a084889caff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c300000000000000007000000000000000|@12170,1048575,@19526| 12170:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f636573735461696c283129 12171:D3,120|483b65187303ff55486a016a01ff7028ff30ff7218488d4c241851ff72204c8b50204c8b48184c8b4010488b5a10488b48084889c8488b4a084889caff12498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c300000000000000007000000000000000|@12172,1048575,@19527| 12172:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f64655374726465637328382970726f63657373426f6479283129 12173:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19544| 12174:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829 12175:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19529| 12176:D5,232|483b65187303ff5548f6c301756f6a016a01415041524151ff7308ff742450ff742450ff742450ff7424504c8d442440488b0b4889c34889c8909090ff15be0000006a016a01ff742460ff742460ff742460ff7424604c8b5424404c8b4c24384c8d442420488b5c2430488b4424589090e88affffff48833c2401eb05e93b0000007507488b442430eb0f488b1c24488b442430ff156e000000488b4c24284883c408488901584883c4184889410848c7c0010000004883c418c2200049c700010000004989400848c7c001000000c220009090909090900000000000000000e000000000000000|@10941,1048575,@19530,@12178,@12177| 12177:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19534| 12178:D8,472|483b65187303ff5548488b4818488b094883f901751b488b5010488b700848b8386208c9a37f0000488b5d08909090ff134d89c34c8b214989dd4c8b7010488b58084c89c8909090ff15a201000048c7c35d000000909090ff159a0100006a016a0141534154488d4c241051ff7424484c89d14c8b5424404c8b4c24484d89e84889c34c89f04889ca909090ff1248c7c003000000488b5424389090ff12488b0c24488b510848833a0574154889c348b8b8b321c9a37f0000488b5d089090ff13488b5a08488903488b7210488b7c243048893e4d8d47e84c3b45107303ff55404d89c749c740f80200000049c7400801000000498908504c8b5424404c8b4c24484d89c34989f8488b5c24304c89d8ff15ea000000498d4fd8483b4d107303ff55404989cf48c741f804000000488b542420488951185a4883c4084889511048c741080100000048c70103000000498d57e8483b55107303ff55404989d748c742f80200000048c742080100000048890a488338017417488b7008488b184889d09090ff157e0000004889c2eb04488b70084883fa017507488b442408eb0e4889d3488b442408ff1562000000488b0c244889014889710848c7c0010000004883c418c22000900000000000000000d001000000000000|@12180,1048575,@19531,@100,@100,@11504,@12181,@12179|32,0,@1662 177,0,@11018 12179:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19533| 12180:S65|535452554354555245535f28292e67656e636f646553747275637473283229636f646553747264656373283829636f646553747275637475726542696e64283229 12181:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19532| 12182:D9,456|483b65187303ff55484d8b496841f6c101753e498b09488b11483b15c0010000751d498d77f0483b75107303ff55404989f748c746f80100000048890eeb19498b71084989f1483b65187303ff5548ebbc48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b32483b356e010000751d498d7ff0483b7d107303ff55404989ff48c747f801000000488917eb19488b79084889f9483b65187303ff5548ebbd48c7c7010000004883ff01751d4889c148b8c0cf09c9a37f0000eb05e936000000488b5d08909090ff13488b0f488b11483b150e01000074154889c648b878e107c9a37f0000488b5d089090ff1348837910017550eb2a488b0e488b11483b15e900000074144889c748b878e107c9a37f0000488b5d0890ff1348837910017524498d47e8483b45107303ff55404989c748c740f8020000004889580848c70001000000c36a016a01415241504d89c14c8d442410ff159a0000006a016a014989e24c8b4c24184c8b442410488b5c2428488b442420909090ff157e000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c428488908c3909090900000000000000000c001000000000000|@12186,1048575,@19537,@20135,@20135,@20135,@20135,@12183,@11110|96,0,@2635 189,0,@2690 233,0,@1486 278,0,@1486 12183:D6,1056|483b65187303ff55484883f801751349c700010000004989580848c7c001000000c3488b08488b1148833a01753f498d77d8483b75107303ff55404989f748c746f80400000048c7461801000000488b7a0848897e1049bb10cd06c9a37f00004c895e0848c7060d000000eb26415041524151ff7008ff7308ff731051ff334c89cb4889d0909090ff15aa0300004889c6eb12415041524151ff7008ff7308ff731051ff3356488b442430488b542408ff12498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f80200000048894808594883c408488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110030000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740b4889c8ff15ea020000eb034889c86a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048bad0fe24c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb725048c7c003000000488b54244090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba10ff24c9a37f000048891148894108488b54243848895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f8040000005e488973184889431048c7430801000000eb05e92b00000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808488b442410488b480848833901756e488339057514488b501048b8807107c9a37f0000488b5d08ff13488339017519488b511048833a037509488b5a08488b1beb10488b5a08eb0a488b5108488b124889d3498d57f0483b55107303ff55404989d748c742f801000000c642ff4048891a498d5fb8483b5d10730aeb05e977000000ff55404989df48c743f80400000048c7431801000000488b7108488973104889530848c70303000000488d532848c742f803000000488b781048897a1048895a0848bb08f206c9a37f000048891a498d5fe0483b5d107303ff55404989df48c743f803000000488943104889530848c7030b000000eb27498d5fe0483b5d107303ff55404989df48c743f803000000488943104889430848c7030b000000498d57c8483b55107303ff55404989d748c742f802000000488b7424184889720848891a488d5a1848c743f80300000048895310488b54242048895308488b5424084889136a016a014c8b5424484c8b4c24404989e0488b4424389090e836fcffff48833c24017507488b442410eb12488b1c24488b442410909090ff155e000000488b4c24504883c408488901584883c4404889410848c7c0010000004883c408c3909090909000000000000000001804000000000000|@12188,1048575,@19538,@12189,@2211,@12187|88,0,@439 383,0,@12184 464,0,@12185 611,0,@1305 781,0,@661 12184:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19535| 12185:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19536| 12186:S37|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529 12187:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19540| 12188:S47|44454255474745525f28292e6d616b655479706549644465627567456e7472696573283529666f6c64496473283229 12189:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19539,@2178|263,0,@2173 12190:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19541| 12191:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19542| 12192:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19543| 12193:D26,2720|483b65187303ff5548488338057569488b4808488b7120488b36488b7928488b3f6a016a01415241515756524c8d5c24284153ff742448488b01909090e8beffffff6a016a01488b442440488338057548498d4fe8483b4d107303ff55404989cf48c741f80200000048ba280f25c9a37f0000488911eb05e96001000048894108488061ffbf4889e048c700010000004889e048894808eb6f48c7c003000000488b542428909090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048ba680f25c9a37f000048891148894108488b54243048895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b7424404889731848894310eb05e93300000048c743080100000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e0488948084c8b442430488b5c2428488b44241890ff15620900004883f8017506488b0424eb104889c3488b0424909090ff154e0900004883f8017507488b442438eb0f4889c3488b44243890ff153a09000050488b442438488b542410909090ff12ff7424584c8b5424404c8b4c243849b8281025c9a37f0000488b5c243090ff150e090000488b4c24605a4883c4484889114889410848c7c001000000c2100048833807756d488b4818488b09498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd8483b7d107303ff55404989ff48c747f80400000049bb28cd06c9a37f00004c895f184c894f104c8957084889374d8d5fe84c3b5d107303ff55404d89dfeb05e91002000049c743f80200000049c743080100000049893b6a016a014152415151564153ff700841536a01ff3557080000488d44244850ff7424684889d8488b5c2428488b520890ff125848c7c101000000a801753bff700851488b5c2430488b009090ff152608000048833c2401740d488b1c24909090ff151a0800004889c14883c40858483b65187303ff5548ebc14889c848c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8f604240174154889c148b808c009c9a37f0000488b5d089090ff134883c40859488b094889c34889c890ff159a07000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848837c24180174114889de488b5c2418ff154a0700004889f3498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889590848c7011d000000f6c3017524488b1348833a057512488b53084889d3483b65187303ff5548ebe048c7c201000000eb0748c7c2030000004883fa01740e504889c89090ff15e2060000eb074889c24889c852ff7424384c8b5424204c8b4c241849b8281125c9a37f0000488b5c2410ff15be060000488b4c24405a4883c4284889114889410848c7c001000000c2100048833803756e498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d77d8483b75107303ff55404989f748c746f80400000048bf28cd06c9a37f000048897e184c894e104c89560848890e498d7fe8483b7d107303ff55404989ff48c747f802000000eb05e93301000048c74708010000004889376a016a014152415153525157ff7008576a01ff350f060000488d74245056ff742470488b5810488b442448488b72084889f290ff126a016a014889e050ff7424684c8b5424504c8b4c24484c8b442460488b5c2440488b442420488b54243890e8b2fafffff644241801741048b808c009c9a37f0000488b5d08ff13488b442420488b00909090ff15a205000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848833c24017507488b4c2448eb1a4889c6488b1c24488b4424489090ff15460500004889c14889f04883f901740c4889cb909090ff1536050000488b4c24684883c408488901584883c4484889410848c7c001000000c21000488338097549488b4010488b004883f80175154889c148b8386208c9a37f0000488b5d089090ff134c89d3488b0090ff15ea040000488b4c241048c701010000004889410848c7c001000000c21000488b4808488b7110488b36488b7918488b3f4c8b59204d8b1b4c8b61384d8b24246a016a0141524151524153575641544c8d6c24384155ff742458488b01909090e85af9ffff4d8d47d84c3b45107303ff55404d89c749c740f80400000048b8e01125c9a37f0000498900488b44242849894008488b4c243049894810488b54240849895018498060ffbfff7424504989ca4989c1488b5c2408488b44244890ff15320400005048c7c003000000488b54243090ff12498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c701ffffffff498d57f0483b55107303ff55404989d748c742f801000000c642ff4048bb10f608c9a37f000048891a498d5fb8483b5d107303ff55404989df48c743f8030000004889531048894b0848c70305000000488d732048c746f80400000048c746180100000048bfe00b1dc9a37f000048897e1048895e0848bb509adc000000000048891e488901488b4c243848890a4989c54889f3488b4424189090ff156603000041554c8b442440488b5c24389090ff155a03000048837c24280175134889c148b8403d25c9a37f0000488b5d08ff13488b4c2428488b09488b511048833a09756550ff7208488b5c2450488b4210ff152203000048833805751449c7c001000000488b1c2490ff1512030000eb5f4889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d000000eb6848833a057567488b5a08488b1b488b7210488b36488b7c24404c8b0741f6c0017411f60601eb05e99b00000074054c2b067105ff5570ebf64983c0014889c6498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004c894008488918eb0ae95a000000e93000000056488b570890ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000eb2348833a0374154889c348b8102c22c9a37f0000488b5d089090ff134889c3488b4208536a01498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b5424184883c4084889114889c34889c8909090ff15de010000498d4f98483b4d107303ff55404989cf48c741f80400000048c7411803000000488959104889410848c70107000000488d412848c740f80400000048894818488b4c24084889481048c740080100000048c70003000000488d502848c742f8020000005b48895a084889024883fa017507488b442448eb104889d3488b4424489090ff155e010000488b0c24f6c10174084883f9017c08eb1af641ff1074144889c248b8f0a115c9a37f0000488b5d0890ff13498d57d0483b55107303ff55404989d748c742f80200000048894a0848c70205000000488d4a1848c741f8020000004889510848c70109000000488b5424684883c45848890248894a0848c7c001000000c21000909090909090900000000000000000980a000000000000|@12268,2097151,@19580,@12269,@12272,@12273,@12274,@12336,@12339,@12353,@7326,@12354,@2211,@12274,@12355,@7326,@12357,@12358,@12359,@12274,@12360,@12269,@12364,@2178,@2166,@12267|107,0,@12194 196,0,@12195 430,0,@12196 551,0,@440 817,0,@2630 1079,0,@12201 1192,0,@440 1367,0,@2630 1577,0,@1662 1728,0,@12205 1879,0,@2150 1951,0,@9706 1969,0,I48 2043,0,@12264 2349,0,@11159 2598,0,@6844 12194:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19545| 12195:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19546| 12196:O1|@12197 12197:D3,40|48b8881025c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@12200,1,@19547|2,0,@12198 12198:O4|11,@42,0,@12199 12199:O5|@9315,2783,0,2783,0 12200:S53|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835292d45 12201:O1|@12202 12202:D3,40|48b8881125c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@12200,1,@19548|2,0,@12203 12203:O4|11,@42,0,@12204 12204:O5|@9315,2771,0,2771,0 12205:D4,184|483b65187303ff5548488b4a18f6c10174134889c648b8c0e406c9a37f0000488b5d08ff134883f8017509488b09488b4908eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbb488b41084883380575454c8b4a104c8b42084889c848bac81225c9a37f0000909090ff15560000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c3488b01c39090900000000000000000b000000000000000|@12200,2097151,@19579,@12207|23,0,@578 105,0,@12206 12206:O5|@12207,@2164,@2326,@2432,@2514 12207:D28,3304|488dbc2410ffffff483b7d187303ff5550488b480848833905756748837908017565498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd8483b7d107303ff55404989ff48c747f80400000049ba28cd06c9a37f00004c8957184c8947104c894f084889374d8d47e84c3b4510730feb0ae959070000e914030000ff55404d89c749c740f80200000049c74008010000004989384883fb017435525641504151ff7110ff7218ff72204c8b52104d89c149b8d02025c9a37f0000488b5c2418488b442410909090ff15220c0000eb1348b880d606c9a37f0000525641504151ff7110488b4c242050ff7118ff71204c8b51104c8b4c242849b8e02225c9a37f0000488b5c2420488b442418ff15e60b0000488b4c242850ff7118ff71204c8b51104c8b4c243049b8f02425c9a37f0000488b5c2428488b44242090ff15be0b0000f64424200174144889c148b808c009c9a37f0000488b5d0890ff13488b4c2428488b094889c34889c890ff15960b000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8488b4c2430498d57e8483b55107303ff55404989d748c742f80200000048c7420801000000488b490848890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848ba20cc18c9a37f0000488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b958cd06c9a37f000048890a4889c64889d0ff15d20a0000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d501848c742f8020000004889420858488902498d47d0483b45107303ff55404989c748c740f80200000048895008488908488d481848c741f80200000048894108584883c428488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740a5690ff15ca090000eb015648833c240175054883c408c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c408c3498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd8483b7d107303ff55404989ff48c747f80400000049ba28cd06c9a37f00004c8957184c8947104c894f084889374d8d47e84c3b45107303ff55404d89c749c740f80200000049c740080100000049893848c7c7010000004c8b510841f6c201752040f6c70174064883c7027105ff5570ebf54d8b5208483b65187303ff5548ebdaff7208ff35df080000524151ff711053564150ff71085741504c8b5424104989f94c8b44243848bb002725c9a37f0000488d442448909090ff15b208000048837c2420017446488b4c2438ff7120ff7118ff7110ff742440ff359a08000050ff7424404c8b5424404c8b4c24384c8b44246848bb202725c9a37f0000488d442410909090ff1576080000eb184889c148b880d606c9a37f00006a016a016a016a016a0151488b4c2468ff7120ff7118ff7110ff742470ff354c08000050ff7424704c8b5424704c8b4c24684c8b84249800000048bb402725c9a37f0000488d4424109090ff1526080000488b8c2498000000ff7120ff7118ff7110ffb424a0000000ff351008000050ffb424a00000004c8b9424a00000004c8b8c24980000004c8b8424c800000048bb602725c9a37f0000488d44241090ff15e2070000f68424a00000000174154889c148b808c009c9a37f0000488b5d089090ff13488b8c24a8000000488b094889c34889c89090ff15b207000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488b542460488911498d57e8483b55107303ff55404989d748c742f80200000048894a0848b920cc18c9a37f000048890a498d4fe8483b4d107303ff55404989cf48c741f8020000004889510848ba58cd06c9a37f00004889114889c64889c8ff15f2060000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d501848c742f80200000048894208584883c428488902498d47d0483b45107303ff55404989c748c740f80200000048895008488908488d481848c741f80200000048894108584881c4a8000000488901498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740b569090ff15e2050000eb015648833c240175054883c408c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c408c35241514150504c89cb488b084889c890ff15920500006a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba782725c9a37f000048891148894108488061ffbf4889e048c700010000004889e048894808eb735048c7c003000000488b5424209090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048bab82725c9a37f000048891148894108488b54242848895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f8040000005e488973184889431048c7430801000000eb05e92b00000048c70303000000488d432848c740f80200000048c74008010000004889184889e34889034889e048894808488b442420488b5424089090ff12488b4c2410488b510848833a0575144889c348b8782825c9a37f0000488b5d0890ff1348833a037506488b5a10eb04488b5a084883fb01750b488b5c2428488b5b08eb704889c648c7c001000000ff154a04000056504889d948bbf02825c9a37f00004889c8ff153a040000488b4c2438498d57b8483b55107303ff55404989d748c742f80800000048c742380300000048c742300100000048c742280300000048894220584889421848c7421001000000eb05e93a00000048b8002725c9a37f000048894208488b490848890a498d5fe8483b5d107303ff55404989df48c743f8020000004889530848c7030f000000eb0150498d47d0483b45107303ff55404989c748c740f80200000048c7400801000000488918488d481848c741f8020000004889410848b820cc18c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b958cd06c9a37f000048890890ff154a030000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000488b04244883380575175149c7c00100000048c7c301000000ff15fa020000eb38498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c7401001000000488b14244889500848c7000d00000051488b4c240848833905751d5049c7c00100000048c7c3050000004889c8909090ff15a2020000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010050000004889480848c7000d00000052488b4c241048833905751a5049c7c00100000048c7c3070000004889c8ff154e020000eb374889c2498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010070000004889480848c7000d00000052498d4fd0483b4d107303ff55404989cf48c741f80200000048c7410801000000488901488d411848c740f8020000004889480859488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b442408488901498d47e8483b45107303ff55404989c748c740f80200000048894808594883c410488908498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f801740e4889c8909090ff1532010000eb034889c848833c240175054883c430c34889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b0c244889480848c700150000004883c430c39090909090900000000000000000e00c000000000000|@12232,2097151,@19558,@2219,@2295,@2285,@12233,@2166,@2211,@12234,@12236,@12248,@12236,@12253,@12236,@12258,@12236,@12263,@2166,@2211,@12231,@2259,@1354,@2166,@2178,@2178,@2178,@2211|95,0,@440 195,0,@12208 226,0,@509 266,0,@12212 313,0,@12216 350,0,@2630 526,0,@8204 567,0,@442 624,0,@8205 989,0,@440 1136,0,@12220 1212,0,@12221 1241,0,@509 1309,0,@12222 1394,0,@12223 1429,0,@2630 1606,0,@8204 1647,0,@442 1704,0,@8205 2074,0,@12224 2156,0,@12225 2310,0,@12226 2381,0,@12229 2477,0,@12220 2587,0,@8204 2628,0,@442 2680,0,@8205 12208:O1|@12209 12209:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12211,1048575,@19549,@12210| 12210:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19550,@2178|263,0,@2173 12211:S42|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283129 12212:O1|@12213 12213:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12215,1048575,@19551,@12214| 12214:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19552,@2178|263,0,@2173 12215:S45|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283129 12216:O1|@12217 12217:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12219,1048575,@19553,@12218| 12218:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19554,@2178|263,0,@2173 12219:S44|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283129 12220:S14|7072696e742d68656c7065722829 12221:S10|657175616c6974792829 12222:S11|626f7865646e6573732829 12223:S6|73697a652829 12224:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19555| 12225:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19556| 12226:O4|@20055,@557,@12228,@12227 12227:O5|@2176,1172,0,1172,0 12228:S15|416c726561647920636865636b6564 12229:O1|@12230 12230:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19557|2,0,@441 12231:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19578,@2178|263,0,@2173 12232:S32|545950454944434f444528292e636f646547656e657261746976654964283429 12233:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@19559| 12234:D3,24|488b4208c390909000000000000000001000000000000000|@12235,5,@19560| 12235:S47|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832292d45 12236:D11,952|483b65187303ff5548498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e0483b55107303ff55404989d748c742f80300000048be003025c9a37f000048893248894a08498b700848897210488062ffbf498b3840f6c70174064883c7027105ff5570ebf54d8d5fd04c3b5d107303ff55404d89df49c743f80300000049894b104989530849893b498d532048c742f801000000c642ff4048c702010000004d8d67e84c3b65107303ff55404d89e749c74424f80200000049bd883125c9a37f00004d892c24498954240849806424ffbf57ff35e7020000415153525141535041544152488d5c24404c89c8909090ff15d20200004889c35848bab09b09c9a37f0000ff15c6020000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f801000000c640ff4048c70001000000498d57c0483b55107303ff55404989d748c742f80400000048894a185948894a10488b4c240848894a08488902488d5a2848c743f802000000488b7424484889730848891350534889c8488b54241090ff12f604240174154889c148b808c009c9a37f0000488b5d089090ff134883c408594883c410488b094889c34889c890ff150e02000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f801742a4889d9498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889430848c7031500000058488b0048c7c101000000a801753a488b10498d77e8483b75107303ff55404989f748c746f80200000048894e08488b0a48890e4889f1488b50084889d0483b65187303ff5548ebc24889c8ff155201000059488b09488b1424483b154b010000743af6c20175444889d648bf509adc00000000004989c848c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084c89c1eb0f4989c848b9303707c9a37f0000eb094889ce4889d14989f04889ceff15f6000000415050565348bb383225c9a37f0000488b4424289090ff15e2000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c438488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c2080090909090900000000000000000b003000000000000|@12243,1048575,@19564,@12244,@1354,@2561,@12242,@2258,I48,@2259,@1354|70,0,@12237 203,0,@12238 268,0,@2560 433,0,@2630 697,0,I48 750,0,@971 785,0,@12240 12237:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19561,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12238:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@12239,15,@19562| 12239:S54|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f64652832296d6b41646472283129 12240:O1|@12241 12241:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19563|2,0,@441 12242:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@19567| 12243:S45|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229 12244:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bbd03325c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@12247,15,@19566|29,0,@12245 12245:D3,152|483b65187303ff5548488b08f6c101740cf64210017406482b4a107105ff5570ebf54883c101488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048894808488b52084889104889daff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c39090909090909000000000000000009000000000000000|@12246,1048575,@19565| 12246:S56|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129283129 12247:S53|545950454944434f444528292e636f646547656e657261746976654964283429637265617465436f6465283229617267732d283129 12248:D4,72|483b65187303ff5548488b4a18488b342448890c24ff72204c8b52104989d949b8983525c9a37f00004889c3488b420856ff25290000009000000000000000004000000000000000|@12235,2097151,@19570,@2219|33,0,@12249 12249:O1|@12250 12250:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12252,1048575,@19568,@12251| 12251:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19569,@2178|263,0,@2173 12252:S45|545950454944434f444528292e636f646547656e6572617469766549642834296571436f64652d283229283129 12253:D4,72|483b65187303ff5548488b4a18488b342448890c24ff72204c8b52104989d949b8203825c9a37f00004889c3488b420856ff25290000009000000000000000004000000000000000|@12235,2097151,@19573,@2295|33,0,@12254 12254:O1|@12255 12255:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12257,1048575,@19571,@12256| 12256:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19572,@2178|263,0,@2173 12257:S48|545950454944434f444528292e636f646547656e657261746976654964283429626f786564436f64652d283229283129 12258:D4,72|483b65187303ff5548488b4a18488b342448890c24ff72204c8b52104989d949b8a83a25c9a37f00004889c3488b420856ff25290000009000000000000000004000000000000000|@12235,2097151,@19576,@2285|33,0,@12259 12259:O1|@12260 12260:D4,48|483b65187303ff5548488b08488b5810488b01ff252f0000009090909090909000000000000000002800000000000000|@12262,1048575,@19574,@12261| 12261:D4,304|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057574488b4808488b09488b4010488b00488b13f6c201740af600017405482b107105ff5570ebf64883c201498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895008488908488b530890ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c34883380374134889c148b8000309c9a37f0000488b5d08ff13488b4008c390909090909000000000000000002801000000000000|@2195,1048575,@19575,@2178|263,0,@2173 12262:S47|545950454944434f444528292e636f646547656e65726174697665496428342973697a65436f64652d283229283129 12263:D3,96|483b65187303ff5548a8017539488b08ff7110488b48084889c8909090e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000005800000000000000|@1363,3,@19577| 12264:O4|@20055,@557,@12266,@12265 12265:O5|@9315,2726,0,2726,0 12266:S22|46756e63746f724170706c3a20756e646566696e6564 12267:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19631| 12268:S47|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f6465283529 12269:D4,32|483b65187303ff5548ff25290000009000000000000000001800000000000000|@12271,2097151,@19581,@12270| 12270:D4,352|483b65187303ff5548a8017568488b08488b11488b3248833e057415488b780848b8b8b321c9a37f0000488b5d0890ff13415053ff7008ff710852ff7610ff760848c7c0030000004889da90ff125948890159488b54242048891159488b590848833b05751b4889c648b8807107c9a37f0000eb05e9c8000000488b5d0890ff1348833b017519488b731048833e037509488b7e08488b3feb10488b7e08eb0a488b7308488b364889f7504989d14c8b4424184889fb488b44240848bac81225c9a37f0000909090ff15aa000000498d4fd8483b4d107303ff55404989cf48c741f80400000048894118584883c4084889411048c741080100000048c70103000000514c8b442418488b5c2410488b442408909090e8e6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000005801000000000000|@1363,2097151,@19582,@12207|34,0,@11018 107,0,@1305 189,0,@12206 12271:S47|535452554354555245535f28292e67656e636f6465537472756374732832296c6f61644f7061717565496473283329 12272:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19583| 12273:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19584| 12274:D4,56|483b65187303ff55486a016a014150ff7424204c8d442410ff1532000000584883c408c20800909000000000000000003000000000000000|@12279,2097151,@19587,@12275| 12275:D5,1112|483b65187303ff55486a016a01488338057541498d4fe8483b4d107303ff55404989cf48c741f80200000048ba984625c9a37f000048891148894108488061ffbf4889e248c702010000004889e248894a08eb70415050415141525348c7c0030000004c89ca9090ff12498d4fe0483b4d107303ff55404989cf48c741f80300000048bad84625c9a37f000048891148894108488b54240848895110488061ffbf498d5fc0483b5d107303ff55404989df48c743f804000000488b74241848897318eb05e93d0000004889431048c743080100000048c70303000000488d432848c740f80200000048c7400801000000488918488d5c2428488903488d44242848894808eb08415050415141525348c7c001000000488b0c24f6c101751ea80174064883c0027105ff5570ebf5488b4908483b65187303ff5548ebdda80174084883f8017d08eb1bf640ff107515a801740b483b05f70200007c1eeb06f640ff1075164889c148b820f007c9a37f0000488b5d08909090ff134889c1f6c10174064883c1027105ff5570ebf54889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f48891758a8017568488b08498d57f0483b55107303ff55404989d748c742f801000000488b590848891a488b3140f6c60174084883fe017d08eb21f646ff10751b4c8b0740f6c601740b41f6c0017405493bf0eb05ff5570ebf67c1c4c8b400848b810f407c9a37f0000488b5d08eb05e92e00000090ff1340f6c60174064883c6027105ff5570ebf5488954b7fc488b50084889d0483b65187303ff5548e961ffffff48c7c001000000488b0748c7c1010000004883f80174704889c24883ea024889c34883eb024883e802a80174064883c0027105ff5570ebf5488b4487fc4883f80175164889c648b8386208c9a37f0000488b5d08909090ff13498d77e8483b75107303ff55404989f748c746f802000000488b004889460848891e498d47e8483b4510730aeb05e929000000ff55404989c748c740f802000000488948084889304889c14889d0483b65187303ff5548e95cffffff6a016a01ff742438ff74245048b8984725c9a37f0000504c8b5424304c8b4c24284c8b442468488d5c24184889c890ff151e01000048837c2408017423488b442428488b4c242048890848c740080300000048c7c0010000004883c440c21000498d47e0483b45107303ff55404989c748c740f80300000048c7401001000000488b0c244889480848c7001d000000f6c1017524488b1148833a057512488b51084889d1483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f90174089090ff158e00000048837c243001742f4889c1498d47e0483b45107303ff55404989c748c740f80300000048894810488b4c24304889480848c70015000000488b4c242848890148c741080100000048c7c0010000004883c440c210009000000000000000004804000000000000fdffffffffffff01|@12281,2097151,@19588,@12280,@2211|45,0,@12276 132,0,@12277 360,0,@1509 551,0,@1517 688,0,@1662 811,0,@12278 12276:D3,24|488b4208c390909000000000000000001000000000000000|@11324,5,@19585| 12277:D3,152|483b65187303ff5548488b4a10488b18f6c301740af601017405482b197105ff5570ebf64883c301488b7008498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488b5a084889184889f29090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c390909000000000000000009000000000000000|@11326,1048575,@19586| 12278:O1|@12275 12279:S51|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e73283529 12280:D4,224|483b65187303ff5548a801756d6a016a0141524151415053ff30ff742450ff742450ff742450488d5c2440488b40089090e8caffffff498d47e8483b45107303ff55404989c748c740f802000000488b4c243048894808488b4c2428488908488b4c2450488b542448488b5c2440488b7424204889742450eb05e93200000048894c24484889542440488b74243848895c24384c8b5424184c8b4c24104c8b4424084889c3584883c43056ff254700000048c7030100000048c743080300000048c7c001000000c218009090909090900000000000000000d800000000000000|@1696,2097151,@19604,@12282| 12281:S71|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d61746368537562537472756374757265283229 12282:D35,3088|488dbc24e8feffff483b7d187303ff5550488b480848833903756a4150ff334152488b5908488b41104c89caff12488338097556ff7008488b5c2408488b4010ff15e20b000048833805751449c7c001000000488b1c2490ff15d20b0000eb644889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000eb0ae91a010000e915000000488b1424488950104889480848c7000d000000eb67488338057566488b4808488b09488b4010488b00488b1424488b1af6c301eb05e99a000000740af600017405482b187105ff5570ebf64883c301498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048895808488908488b5208eb0ae953000000e92d000000909090ff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000eb1f4883380374154889c148b8102c22c9a37f0000488b5d089090ff13488b40086a01498d4fe8483b4d107303ff55404989cf48c741f8020000004883c4105a48895108488901488b042448890848c740080100000048c7c0010000004883c408c22000488339057569488b5118498d77f0483b75107303ff55404989f748c746f801000000c646ff4048c70601000000498d7fd8483b7d107303ff55404989ff48c747f80400000049b928cd06c9a37f00004c894f184c8b4c24204c894f104c8957084889374d8d5fe84c3b5d10730aeb05e951080000ff55404d89df49c743f80200000049c743080100000049893bff742410415352ff7108ff72184152ff32ff742450ff35ec0900006a016a0141504152ff7108ff7308ff33564153ff3052ff32ff71104c8d44245848bb905625c9a37f0000488b42189090ff15be090000488b44246090ff15ba0900009090ff15ba09000050488b5c2408488b44246048bab06507c9a37f000090ff15a6090000a801756b4c8b1048bb20a70cc9a37f0000488b442410ff159209000048b948f020f9a37f0000488b0941524889c34889c890ff157e09000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000909090ff156209000048c7c00100000048bae05625c9a37f0000eb05e9670000009090ff154a090000498d4fe8483b4d107303ff55404989cf48c741f80200000048894108488b042448890148b868c319f1a37f0000488b004889c24889c8ff1248bac85725c9a37f00004883c408ff150609000048b8c06525c9a37f0000488b5d08909090ff136a016a014989e048bb486625c9a37f0000488b44241890ff15de0800004883c4085890ff15da0800009090ff15da0800006a016a01488b4c24104889c2504883f90175184883fa01740948c7c001000000eb5f48c7c003000000eb5bf6c201755b488b01ff7208ff7108ff32488b084889c890ff159a0800004883380d7526488b0c24488b4008483b017519488b5424104883c408594883c408483b65187303ff5548eb9948c7c0010000004883c418eb11e90c000000e90700000048c7c0010000004883f8017464488b442468488d94248800000090ff12488b4c2430488b511048833a01752b488b5c2438f6c3017509f64208017503ff5570483b5a08740948c7c301000000eb1048c7c303000000eb0748c7c301000000488d742408488906488d44240848895808eb63f60424017449488b442418909090ff15da0700004c8d8c24880000004c8b442440488b5c246848ba98f808c9a37f00009090ff15be070000488d4c2408488901488d44240848c7400801000000eb6948c7c001000000488b0c24f6c1017525a801eb05e91f04000074064883c0027105ff5570ebf5488b4908483b65187303ff5548ebd6488b4c2468498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d5fe0483b5d10730aeb05e9ca030000ff55404989df48c743f80300000048be106725c9a37f000048893348895308488b710848897310488063ffbf488b3940f6c70174064883c7027105ff5570ebf54d8d47e04c3b45107303ff55404d89c749c740f803000000498950104989580849893857ff35d706000050524150488d5c24189090ff15ce0600004889c3488b44242848bab09b09c9a37f0000ff15be060000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57e8483b55107303ff55404989d748c742f80200000048bb986825c9a37f000048891a48894a08488062ffbf498d5fd8483b5d107303ff55404989df48c743f8020000004889430848c70303000000488d431848c740f801000000c640ff4048c70001000000498d77c0483b75107303ff55404989f748c746f80400000048895e1848895610488b142448895608488906488d5e2848c743f802000000488b7c246848897b084889334889ce4989c0488b44244090ff15e6050000564150534c8d8c24c80000004989d8488b5c241848ba98f808c9a37f0000ff15ca050000f604240174154889c148b808c009c9a37f0000488b5d089090ff134883c40859488b094889c34889c890ff15a205000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f801742a4889d9498d5fe0483b5d107303ff55404989df48c743f80300000048894b104889430848c703150000004989da48bbf05c23c9a37f0000488b4424589090ff151e050000488b4c2410488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15c6040000594883c410488b09483b1dbf040000743af6c30175444889de48bf509adc00000000004889ca48c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090174084889d1eb0f4889ca48b9303707c9a37f0000eb064889ca4889d94889d34889ceff156a040000535056415248bb886925c9a37f0000488b4424209090ff1556040000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c430488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000488d4c2408488901488d44240848c7400801000000f644244001741148b808c009c9a37f0000488b5d0890ff13488b4424484883c408488b00909090ff15a203000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f8017506488b0424eb2e4889c1498d47e0483b45107303ff55404989c748c740f803000000488b1424488950104889480848c70015000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b5424484883c4084889510848890148837c244801742a48833c2401741a48837c245005740948c7c001000000eb1948c7c003000000eb1048c7c001000000eb0748c7c001000000488b5424604883c46048890a4889420848c7c0010000004883c460c22000488b51106a016a01488b720848833e01756a415041524151ff7308ff33ff7108ff30ff76084c89d0488b5424689090ff1248833805751449c7c001000000488b1c2490ff1566020000eb3d4889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b14244889501048894808eb05e94800000048c7000d000000488b0c24f6c101750af6442408017503ff5570483b4c2408740948c7c101000000eb0748c7c103000000488d5424404883c410488902488d44243048894808eb31415041524151ff7308ff33ff71084c89d34889d09090ff15d2010000488d4c2430488901488d44243048c74008010000006a016a01ff742428ff7424684c8b5424404c8b8c24800000004c8d442410488b5c2420488b442450488b542468ff12498d47e8483b45107303ff55404989c748c740f802000000488b4c2418488948085948890848837c241801741748837c244001750948c7c101000000eb0d488b0c24eb0748c7c101000000488b5424304883c43048890248894a0848c7c0010000004883c418c2200090909090900000000000000000080c000000000000|@12322,2097151,@19605,@12323,@2178,@12324,@1382,@8195,@12330,@1633,@100,@218,@179,@12286,@12292,@1382,@7328,@12331,@1401,@7332,@2165,@12332,@1354,@2561,@7332,@2165,@7326,@100,@2258,I48,@2259,@1354,@7326,@2178,@12321|333,0,@11159 491,0,@440 622,0,@12283 675,0,@1292 699,0,@3873 720,0,@20288 748,0,@20288 765,0,@60 791,0,@12285 851,0,@20212 872,0,@12290 892,0,@12310 918,0,@12313 1250,0,@2163 1415,0,@12316 1532,0,@2560 1607,0,@12317 1792,0,@2163 1817,0,@2630 1973,0,@11628 2117,0,I48 2170,0,@971 2205,0,@12319 2378,0,@2630 12283:O1|@12284 12284:D3,24|48c7c001000000c300000000000000001000000000000000|@1368,1,@19589| 12285:O2|@12286,@20211 12286:D3,32|488b5208488b124889d0c3909090909000000000000000001800000000000000|@12287,5,@19590| 12287:S29|706f6c79436f6d70696c65722832297072696e7444657074682d283129 12288:O1|@12289 12289:D3,32|48b8a8c606c9a37f0000c3909090909000000000000000001800000000000000|@389,1,@19591|2,0,@388 12290:O3|@12292,@12291,77 12291:O2|@12308,@20288 12292:D4,64|483b65187303ff554849ba705825c9a37f000049b9e85825c9a37f00004c8b4210488b5a08ff252d000000909090909000000000000000003800000000000000|@12299,1048575,@19594,@12298|11,0,@12293 21,0,@12296 12293:O1|@12294 12294:D3,24|48c7c001000000c300000000000000001000000000000000|@12295,1,@19592| 12295:S22|506f6c794d4c2e7072657474795072696e742d283129 12296:O1|@12297 12297:D3,24|48c7c001000000c300000000000000001000000000000000|@12295,1,@19593| 12298:D4,104|483b65187303ff5548534150415141524d89c24989d948c7c301000000909090ff155a000000a8017509f60424017503ff5570483b0424740e48c7c0150000004883c4085aff2248c7c0010000004883c410c3909090909000000000000000006000000000000000|@12302,1048575,@19595,@12300| 12299:S28|506f6c794d4c2e7072657474794d61726b7570283129283129283129 12300:D5,672|483b65187303ff55484883380575064c89c0c210004883380975544150ff7010488b40084c89ca90ff12488b442408a801740cf60424017406482b04247105ff5570ebf54883c001a80174084883f8017f16eb06f640ff10740e48c7c0010000004883c410c210004883c410c2100048833807755d4150ff7008488b04244c89ca909090ff1259f6c101740948c7c003000000eb08488b01488d44000159f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174084883f9017f17eb06f641ff10740f48c7c001000000c21000e9060000004889c8c2100048833803756d488b480841504151ff7008f6c10174084883f9017e37eb06f641ff10752f5148c7c041000000488b5424109090ff1258a80174064883e8027105ff5570ebf54889c1483b65187303ff5548ebbe488b442410a801740cf60424017406482b04247105ff5570ebf54883c001eb05e927000000a80174084883f8017f16eb06f640ff10740e48c7c0010000004883c418c210004883c418c21000f6c3017410f6400801740a488d5bff480358087105ff5570ebf1488b7018488b78104989db4c8b60204c89c3ff150a0100004883f801756a4150415156574152415341544889f0488b542448ff12ff74241048b8d85c25c9a37f000050ff742458ff742458ff7424384c8b5424304c8b4c24504c8b44245848c7c301000000488b442428ff15ba00000050488b442428488b542448909090ff12584883c438c210004150415156415241534154ff304889f0488b54244890ff12488b442408488b4c2430a8017535ff7008ff742450ff7424504c8b5424304c8b4c24404989c8488b5c2428488b0090e896fdffff4889c158483b65187303ff5548ebc7488b442420488b54244090ff12584883c430c21000909000000000000000009802000000000000|@12304,1048575,@19596,@12305,@12303|464,0,@12301 12301:O1|@12300 12302:S22|506f6c794d4c2e7072657474794d61726b7570283529 12303:D4,1368|483b65187303ff5548a801755d488b0848833905755941524151ff700848c7c0150000004c89ca90ff12488b442410a80174084883f8017e40eb06f640ff1075385048c7c041000000488b5424109090ff1258a80174064883e8027105ff5570ebf5483b6518730feb0ae9cf040000e975000000ff5548ebb6488b442440a801740ef6442410017407482b4424107105ff5570ebf44883c001488b4c2440488b542438488b5c2430488b742428488b7c242048894c2440488954243848895c2430488974242848897c24204c8b5424104c8b4c24084989c048c7c301000000584883c410e917ffffff488339017570f6c301740f41f6c2017409488d5bff4903da7105ff5570ebf241524151ff7008ff742430ff7424304c8b5424504889c8488b542448ff12488b4c2440488b542438488b5c2430488b742428488b7c242048894c2440488954243848895c2430488974242848897c24204c8b542410eb05e9190000004c8b4c24084989c048c7c301000000584883c410e983feffff48833909756d41524151ff70084150ff7110488b41084c89ca9090ff12488b442408a801740cf60424017406482b04247105ff5570ebf54883c001488b4c24504883c410488b542438488b5c2430488b742428488b7c242048894c2440488954243848895c2430488974242848897c2420eb05e91e0000004c8b5424104c8b4c24084989c048c7c301000000584883c410e9edfdffff48833907756e41524151ff70084150ff7108488b04244c89caff1259f6c101740948c7c003000000eb08488b01488d44000159f6c1017409a8017405482bc87105ff5570ebf64883c101488b442440488b542438488b5c2430488b742428488b7c24204889442440488954243848895c2430eb05e928000000488974242848897c24204c8b5424104c8b4c24084989c848c7c301000000584883c410e94cfdffff488378080175064c89c0c228004c89d2f6c2017410f6411001740a488d52ff480351107105ff5570ebf148837c240801755f41f6c001740ef641080174084c3b41087f07eb63ff5570ebf34c89c3f6c301740cf64108017406482b59087105ff5570ebf54883c301488b7008ff7008ff711052ff710840f6c6017559488b06488338037529498d4ff0483b4d10730aeb05e96e000000ff55404989cf48c741f801000000488919eb47e94a0000009090ff1506020000a8017512488b18488b7608483b65187303ff5548ebaa48c7c101000000eb1b498d4ff0483b4d107303ff55404989cf48c741f8010000004889194883f9017560eb16ff7008ff711052ff7108eb0aff7008ff711052ff71084152415148c7c0150000004c89caff12488b442418a80174084883f8017e3beb06f640ff1075335048c7c041000000488b5424089090ff1258a80174064883e802710cff5570eb05e97c000000ebee483b65187303ff5548ebbb488b442458a801740ef6442418017407482b4424187105ff5570ebf44883c001488b4c2458488b542450488b5c2448488b742440488b7c243848894c2458488954245048895c2448488974244048897c24384c8b54240841594883c4084989c0488b5c24104883c41858e975fbffff488b0424415241514150a80174084883f8017e32eb06f640ff10752a5048c7c041000000488b542410ff1258a80174064883e8027105ff5570ebf5483b65187303ff5548ebc458a801740ef6442410017407482b4424107105ff5570ebf44883c001488b4c2458488b542450488b5c2448488b742440488b7c243848894c2458488954245048895c2448488974244048897c24384c8b54240841594883c4084989c048c7c3010000004883c41858e9c2faffff4c89c0c228009090909000000000000000005005000000000000|@12307,1048575,@19598,@12305| 12304:S31|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329 12305:D3,432|483b65187303ff554848833805750848c7c001000000c3488338097556f6c301740ef64010017408483b58107c3deb05ff5570ebf3f6c301740cf64010017406482b58107105ff5570ebf54883c301498d47f0483b45107303ff55404989c748c740f801000000488918c348c7c001000000c3488338077563488b4008a801740948c7c103000000eb08488b08488d4c0901f6c101740af6c3017405483bcbeb05ff5570ebf67f39f6c301740af6c1017405482bd97105ff5570ebf64883c301498d47f0483b45107303ff55404989c748c740f801000000488918c3e90800000048c7c001000000c3488338037556f6c301740ef64008017408483b58087c3deb05ff5570ebf3f6c301740cf64008017406482b58087105ff5570ebf54883c301498d47f0483b45107303ff55404989c748c740f801000000488918c348c7c001000000c3498d4ff0483b4d107303ff55404989cf48c741f801000000488919488b4020a80175324883f901750948c7c101000000eb14ff7008488b19488b0090e87afeffff4889c1eb03ff700858483b65187303ff5548ebca4889c8c390900000000000000000a801000000000000|@12306,11,@19597| 12306:S32|506f6c794d4c2e7072657474794d61726b757028352967657453697a65283229 12307:S41|506f6c794d4c2e7072657474794d61726b75702835296c61794f7574283329646f5072696e74283329 12308:D5,88|483b65187303ff5548488b4a08488b09524889c34889c890ff1552000000488b0424488b40084883c408488b004c8b402048bb881606c9a37f0000ff25370000009090909090909000000000000000005000000000000000|@12309,2097151,@19599,@218,@179|51,0,@60 12309:S15|54657874494f2e7072696e74283129 12310:O4|@20055,@557,@12312,@12311 12311:O5|@9315,2601,0,2601,0 12312:S27|756e6966795479706573206661696c656420696e20706173732033 12313:O1|@12314 12314:D3,24|48c7c001000000c300000000000000001000000000000000|@12315,1,@19600| 12315:S97|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e28322964657374566172732d283129 12316:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19601,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12317:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@12318,15,@19602| 12318:S113|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d6d6b4164647273283129 12319:O1|@12320 12320:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19603|2,0,@441 12321:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19614,@2178|260,0,@11159 12322:S85|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e283229 12323:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19606,@2178|260,0,@11159 12324:D18,2016|483b65187303ff5548488b4a30488b591048833b01756948837a28017567ff7308488b72084889f2ff1248833805751449c7c001000000488b1c2490ff15b6070000eb364889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d00000048833805eb0ae924050000e955000000751849c7c00100000048c7c3030000004883c408ff255c0700004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d0000004883c408c348837a28037569ff73085052488b422090ff1512070000488338057521498d4ff0483b4d107303ff55404989cf48c741f801000000488b4008488901eb0748c7c101000000f6c101756d488b0424488b4818498d57f0483b55107303ff55404989d748c742f801000000c642ff40eb05e9fa03000048c70201000000498d5fe0483b5d107303ff55404989df48c743f80300000048be887525c9a37f000048893348895308488b710848897310488063ffbf488b39eb05e96e02000040f6c70174064883c7027105ff5570ebf54d8d47e04c3b45107303ff55404d89c749c740f803000000498950104989580849893852488b58084c89c04889da9090ff1248833805751449c7c001000000488b5c2418ff151a060000eb374889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b542418488950104889480848c7000d000000488b4c2408498d57e0483b55107303ff55404989d748c742f80300000048c7421001000000488b491048894a0848c70205000000498d4fe8483b4d107303ff55404989cf48c741f80200000048bb107725c9a37f000048895908488911498d57c8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f80300000048c74010010000004889500848c7001d000000f6c2017524488b0a488339057512488b4a084889ca483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f9017406ff151205000059488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c8909090ff15be0400009090ff15be040000505348bb287725c9a37f000048c7c003000000909090ff15aa040000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c741280300000048894120488b4424084889411848c741100100000048b8303707c9a37f000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004883c418c3488b0424488b4808488b4424084889ca909090ff1248833805751449c7c001000000488b5c2410ff1502040000eb374889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b542410488950104889480848c7000d000000488b0c24498d57e0483b55107303ff55404989d748c742f80300000048c7421001000000488b491048894a0848c70205000000498d4fe8483b4d107303ff55404989cf48c741f80200000048bb00d721c9a37f000048895908488911498d57c8483b55107303ff55404989d748c742f80200000048894a08488902488d421848c740f80300000048c74010010000004889500848c7001d000000f6c2017524488b0a488339057512488b4a084889ca483b65187303ff5548ebe048c7c101000000eb0748c7c1030000004883f901740a4883c418ff25f70200004883c418c3ff7308488b72084889f2ff1248833805750e49c7c0010000005bff25da0200004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c348837a2801756d48beb8c219f1a37f0000488b3648bfc8c219f1a37f0000488b3f49b8d8c219f1a37f00004d8b0049b9e8c219f1a37f00004d8b094d8d57d04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a0848be509adc00000000004989324152eb05e9790000004c8b524049c7c1010000004c8b42384889c3488b423048ba00ff21c9a37f00009090ff150602000048833805751449c7c00100000048c7c303000000ff25f40100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c740180100000048c74010030000004889480848c7000d000000c348837a2803756f48beb8c219f1a37f0000488b3648bfc8c219f1a37f0000488b3f49b8d8c219f1a37f00004d8b0049b9e8c219f1a37f00004d8b094d8d57d04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a0848be509adc0000000000498932488b3424eb05e9210000004c8914244c8b524049c7c1010000004c8b42384889c3488b423056ff252901000048beb8c219f1a37f0000488b3648bfc8c219f1a37f0000488b3f49b8d8c219f1a37f00004d8b0049b9e8c219f1a37f00004d8b094d8d57d04c3b55107303ff55404d89d749c742f8050000004d8942204d894a184989721049897a0848be509adc0000000000498932488b34244c8914244c8b524049c7c1010000004c8b42384889c3488b423048ba00ff21c9a37f000056ff2599000000900000000000000000d807000000000000|@12329,2097151,@19609,@2178,@2178,@1401,@2178,@2211,@2258,@2259,@1354,@2178,@2211,@2178,@11117,@2178,@12055,@11117|373,0,@12325 637,0,@12326 878,0,@12327 973,0,@971 1212,0,@11057 1458,0,@20201 1471,0,@20202 1484,0,@20203 1497,0,@20204 1550,0,I48 1594,0,@11115 1700,0,@20201 1713,0,@20202 1726,0,@20203 1739,0,@20204 1792,0,I48 1849,0,@20201 1862,0,@20202 1875,0,@20203 1888,0,@20204 1941,0,I48 1984,0,@11115 12325:D4,344|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b5810488b3048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e60eb06f641ff107558f6c10174064883e9027105ff5570ebf5488b5810488b30498d47e0483b45107303ff55404989c748c740f803000000488958104889480848893052488b4a104889ca9090ff12488b0c24488b59084883c408ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000005001000000000000|@2227,1048575,@19607,@2226|41,0,@2221 195,0,@2224 269,0,@2224 12326:O2|@439,@651 12327:O1|@12328 12328:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19608|2,0,@441 12329:S96|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296c6f6164436f6465283129 12330:D3,112|483b65187303ff5548a8017545488b084883790801742f51488b400890e8deffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9aeffffff48c7c001000000c390909090909000000000000000006800000000000000|@260,3,@19610| 12331:D3,120|483b65187303ff5548a801754d488b08488b51084883e2094883fa01743051488b40089090e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3488b48084889c8e9a6ffffff48c7c001000000c390909090909000000000000000007000000000000000|@260,7,@19611| 12332:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bba07925c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@12335,15,@19613|29,0,@12333 12333:D3,152|483b65187303ff5548488b08f6c101740cf64210017406482b4a107105ff5570ebf54883c101488b5808498d47e0483b45107303ff55404989c748c740f80300000048c740100300000048894808488b52084889104889daff124889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70009000000c39090909090909000000000000000009000000000000000|@12334,1048575,@19612| 12334:S118|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129283129 12335:S115|535452554354555245535f28292e67656e636f6465537472756374732832296170706c794d61746368416374696f6e732835296d617463685375625374727563747572652832296170706c79416374696f6e2832296a757374436f70797c706f6c79436f64652d61726741646472732d283129 12336:O1|@12337 12337:D3,56|488b4810488b10498d47e8483b45107303ff55404989c748c740f80200000048894808488910c39000000000000000003000000000000000|@12338,7,@19615| 12338:S61|535452554354555245535f28292e67656e636f646553747275637473283229737472756374757265436f646528352970726f63657373426f6479283129 12339:D5,576|483b65187303ff5548488338017571488b4010488b00498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d8483b55107303ff55404989d748c742f80400000048be28cd06c9a37f00004889721848bea87e25c9a37f00004889721048895a0848890a498d4fe8483b4d10730aeb05e958000000ff55404989cf48c741f80200000048c741080100000048891148c7c2010000005153a801752aff70084c8b4c24104c8b4424084889d3488b009090ff15920100004889c258483b65187303ff5548ebd24889d04883c410c3488338037552488b400848c7c10100000053a801753aff700851488b5c2410488b009090e8fafeffff48833c2401740d488b1c24909090ff15460100004889c14883c40858483b65187303ff5548ebc24889c84883c408c3488b401048c7c101000000a801755e488b10488b5a18488b1b4883fb017515488b500848b8386208c9a37f0000488b5d0890ff13488b1b488b730848833e057417488b500848b8b8b321c9a37f0000488b5d08909090ff13488b7e08488b3f40f6c701740d4883ff017c0deb1fe97f000000f647ff107414488b500848b8f0a115c9a37f0000488b5d08ff134d8d47b84c3b45107303ff55404d89c749c740f8020000004989780849c70005000000498d781848c747f8020000004c89470848c707090000004c8d471849c740f802000000498948084989384c89c1488b50084889d0483b65187303ff5548e91affffff4889c8c390909090909000000000000000003802000000000000|@12347,2097151,@19617,@12348,@12346|83,0,@440 97,0,@12340 346,0,@1662 380,0,@11018 435,0,@6844 12340:O1|@12341 12341:D3,40|48b8087f25c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@12345,1,@19616|2,0,@12342 12342:O4|@20055,@557,@12344,@12343 12343:O5|@9315,2889,0,2889,0 12344:S10|747970655661724d6170 12345:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229747970655661724d61702d283129 12346:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19622| 12347:S49|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f616453747264656373283229 12348:D7,424|483b65187303ff554848833805756a488b4008534c89c14d89c84889cb488b4008909090ff159601000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c848833c2401750c4883c408eb05e908000000c35bff2542010000488338037532534c89c3488b4008ff15360100004889c1498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c348833807756e48b9b8c219f1a37f0000488b0948bac8c219f1a37f0000488b1248bed8c219f1a37f0000488b3648bfe8c219f1a37f0000488b3f4d8d57d04c3b55107303ff55404d89d749c742f8050000004989722049897a1849894a104989520848b9509adc000000000049890a534152eb05e95700000049ba504824c9a37f00004c89c949c7c1010000004c89c24989c84889d3488b400848ba00ff21c9a37f00009090ff156e0000004889c1498d47e8483b45107303ff55404989c748c740f8020000005a48895008488908c34889d8c39090909090900000000000000000a001000000000000|@12350,2097151,@19618,@12351,@12352,@12349,@11117|198,0,@20201 211,0,@20202 224,0,@20203 237,0,@20204 290,0,I48 313,0,@11974 346,0,@11115 12349:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19621,@2178|260,0,@11159 12350:S60|535452554354555245535f28292e67656e636f646553747275637473283229636f64654c6f6164537472646563732832296c6f616456616c73283229 12351:D4,264|483b65187303ff5548a801756d48b9b8c219f1a37f0000488b0948bac8c219f1a37f0000488b1248bed8c219f1a37f0000488b3648bfe8c219f1a37f0000488b3f4d8d4fd04c3b4d107303ff55404d89cf49c741f8050000004989712049897918498949104989510848b9509adc00000000004989094150eb05e96b00000053ff7008415149ba504824c9a37f000049c7c101000000488b0048ba00ff21c9a37f000090ff1576000000504c8b442418488b5c2410488b442408909090e83effffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c348c7c001000000c390909090909000000000000000000001000000000000|@1363,2097151,@19619,@11117|15,0,@20201 28,0,@20202 41,0,@20203 54,0,@20204 107,0,I48 135,0,@11974 155,0,@11115 12352:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19620| 12353:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19623| 12354:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19624| 12355:O1|@12356 12356:D3,56|488b4810488b10498d47e8483b45107303ff55404989c748c740f80200000048894808488910c39000000000000000003000000000000000|@12338,7,@19625| 12357:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19626| 12358:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19627| 12359:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19628,@2178|260,0,@11159 12360:D3,232|483b65187303ff5548a801756d488b08488b5108488b3248833e017414488b780848b8d08a25c9a37f0000488b5d08ff13498d7fa8483b7d107303ff55404989ff48c747f80300000048895f104c8b46084c89470848c707090000004c8d4f2049c741f8030000004c8b52104d8951104c8b5a084d895908eb05e94b000000498939498d792048c747f8020000004c894f084c8b094c890f574c8b60084c89e090e85affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090909090900000000000000000e000000000000000|@1363,2047,@19629|35,0,@12361 12361:O4|@20055,@557,@12363,@12362 12362:O5|@9315,2717,0,2717,0 12363:S37|6d616b6553656c65637465643a204e6f7420426f756e64206f72206e6f7420466f726d616c 12364:D4,304|483b65187303ff5548488b480848833909755eff7108488b4110909090e8deffffff48833805750e49c7c0010000005bff25120100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488339057574488b5108488b12488b7110488b36488b3b40f6c701740af606017405482b3e7105ff5570ebf64883c701498d47e0483b45107303ff55404989c748c740f80300000048c740100100000048897808488910488b5308ff124889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e90c0000004889480848c70009000000c348833903741348b8102c22c9a37f0000488b5d08909090ff13488b4108c390909090909000000000000000002801000000000000|@11258,1048575,@19630,@2178|260,0,@11159 12365:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19655| 12366:S45|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329 12367:D5,192|483b65187303ff5548f6c301756f6a016a01415041524151ff73084c8d442420488b0b4889c34889c8909090ff15a60000006a016a014c8b5424204c8b4c24184989e0488b5c2410488b442438e8aeffffff48833c24017507488b442430eb12488b1c24488b442430909090ff156e000000488b4c24284883c408eb05e918000000488901584883c4184889410848c7c0010000004883c418c349c700010000004989400848c7c001000000c39090900000000000000000b800000000000000|@10941,2097151,@19633,@12369,@12368| 12368:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19653| 12369:D23,2264|488dbc2440ffffff483b7d187303ff5550488b4820488b09488b5048488b12488b30488b7e08488b3f4883ff01752a488b70184c8b58084c8b60584c8b68404c8b7050ff702848b8386208c9a37f0000488b5d08909090ff134d8d5ff04c3b5d107303ff55404d89df49c743f80100000041c643ff4049c703030000004d8d67e84c3b65107303ff55404d89e749c74424f80200000049bd989825c9a37f00004d892c244d895c240849806424ffbf4d8d6ff04c3b6d107303ff55404d89ef49c745f80100000041c645ff4049c74500010000004d8d77e84c3b75107303ff55404d89f749c746f80200000048be589925c9a37f00004989364d896e08498066ffbf498d77e0483b75107303ff55404989f748c746f8030000004c896e104c89760848c706030000004c8b37ff702841504d8b4608498338057422ff7018ff7008ff7058ff7040ff705048b8b8b321c9a37f0000488b5d08909090ff134d8b33ff7018ff7008ff7058ff7040ff705053498b03a80174064883c0027105ff5570ebf5498903498b40084c8930498b5810488933488b442438488b004883f80175145048b8386208c9a37f0000488b5d08909090ff13488b3f488b7f10ff304152415341554156415156415451524d89e24989f0488b5c2450488b4710ff150e070000488b4c2458488b09ff304c8b5424184c8b4c24284c8b442420488b58084889c89090ff15ee060000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70101000000498d57d8483b55107303ff55404989d748c742f80400000048bb28cd06c9a37f000048895a18488b5c241848895a10488b7424204889720848890a498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488911488b542468488b12ff30514989da4c8b4c24384989f0488b58084889d0ff1552060000488b4c2478488b09ff304c8b5424284c8b4c24384c8b442430488b58084889c89090ff1532060000488338017506488b0c24eb19488b7008488b18488b0424909090ff151a0600004889c1eb04488b70084883f9017507488b442408eb0e4889cb488b442408ff15fe0500004883f8017507488b442410eb0f4889c3488b44241090ff15ea0500004989c24989f348bb289e1dc9a37f00004883c418488b44247890ff15d20500006a016a014152488d4c240851ff7424404c8b5424404c8b4c24384d89d84889c3488b84249800000048ba805821c9a37f0000ff15a20500004d8d47d84c3b45107303ff55404d89c749c740f80400000048b8209b25c9a37f0000498900488b44242849894008488b4c243049894810488b54242049895018498060ffbfff7424384989ca4989c1488b5c2420488b44241890ff154a050000488b4c2438488b4968f6c101753e488b11488b1a483b1d37050000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01756948b998c809c9a37f0000f6c101753e488b11488b1a483b1de5040000751d498d77f0483b75107303ff55404989f748c746f801000000488916eb19488b71084889f1483b65187303ff5548ebbd48c7c6010000004883fe01751c4889c148b8c0cf09c9a37f0000eb05e935000000488b5d089090ff13488b0e488b11483b158604000074154889c348b878e107c9a37f0000488b5d089090ff134883791001746ceb2a488b0e488b11483b156104000074144889c348b878e107c9a37f0000488b5d0890ff134883791001746c498d5fd8483b5d107303ff55404989df48c743f80400000048bf10cd06c9a37f000048897b18488b7c244048897b1048c743080100000048c70303000000eb05e93f01000048837c2408017506488b3c24eb2a4889c74989d8488b5c2408488b04249090ff15e2030000eb05e9130100004889f94889c74c89c34889c8498d4fe8483b4d107303ff55404989cf48c741f802000000488979084889194883f901742a4889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70015000000488b4c2448488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c890ff152a030000488b4c2450488b09488b542450488b12488b7424504889164889c2498d47d0483b45107303ff55404989c748c740f8050000004889482048895018488b8c24900000004889481048c7400803000000488918ff15da020000eb6a498d5fd8483b5d107303ff55404989df48c743f80400000048bf10cd06c9a37f000048897b18488b7c244048897b1048c743080100000048c7030300000048837c2408017506488b3c24eb294889c74989d8488b5c2408488b042490ff157e0200004889f94889c7eb05e90b0100004c89c34889c8498d4fe8483b4d107303ff55404989cf48c741f802000000488979084889194883f901742a4889c2498d47e0483b45107303ff55404989c748c740f803000000488950104889480848c70015000000488b4c2448488b0948c7c201000000f6c101753a488b19498d77e8483b75107303ff55404989f748c746f80200000048895608488b134889164889f2488b59084889d9483b65187303ff5548ebc14889d14889c34889c890ff15c6010000488b4c2450488b09488b542450488b12488b7424504889164889c2498d47d0483b45107303ff55404989c748c740f8050000004889482048895018488b8c24900000004889481048c7400803000000488918ff15760100005048c7c003000000488b54246090ff12488b4c2468488b511048833a0574144889c348b8b8b321c9a37f0000488b5d0890ff13488b5a08488903488b721048bf10f608c9a37f000048893e498d7fc0483b7d107303ff55404989ff48c747f80400000041584883c4684c8947184889471048c747080100000048c70703000000488d472848c740f80200000048c7400801000000488938488b7c2430488907584883c4284889470848c7c0010000004883c410c390900000000000000000d008000000000000|@12377,2097151,@19638,@12182,@11504,@11109,@11420,@12378,@12379,@12380,@100,@12193,@12274,@20122,@20122,@20122,@20122,@12381,@2258,@12382,@12398,@2258,@12374|72,0,@1662 152,0,@12370 238,0,@12372 332,0,@11018 420,0,@1662 583,0,@440 830,0,@9916 896,0,@10944 936,0,@12373 1097,0,@2635 1190,0,@2690 1233,0,@1486 1278,0,@1486 1326,0,@439 1714,0,@439 2102,0,@11018 2130,0,@2150 12370:D3,64|488b4a08488b09488b5a08488b1ba801740ef6c3017409488d40ff4803c37105ff5570ebf2488b52084889024889c8c300000000000000003800000000000000|@12371,15,@19634| 12371:S72|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e642832296d6b41646472283129 12372:D4,408|483b65187303ff5548488b4808f6c10174084883f9017c08eb1ff641ff107419488b18488b701048b8701e09c9a37f0000488b5d089090ff13f6c10174084883f9017e5feb06f641ff10755cf6c10174064883e9027105ff5570ebf54883f901750748837810017414488b0848b8e8f608c9a37f0000488b5d0890ff13488b08f6c10174084883f9017c08eb24f641ff10741e48b860f708c9a37f0000488b5d08eb0ae93c000000e9370000009090ff13498d5fe8483b5d107303ff55404989df48c743f80200000048894b0848c703050000004889de488b5a084889f0ff25cc0000004883781001744a488b10f6c20174084883fa017c08eb16f642ff10741048b8001f09c9a37f0000488b5d08ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70001000000c3488b10f6c20174084883fa017c08eb18f642ff10741248b8001f09c9a37f0000488b5d089090ff13498d47e8483b45107303ff55404989c748c740f8020000004889500848c70005000000c39090909090909000000000000000009001000000000000|@2227,63,@19635,@2226|41,0,@2221 110,0,@2153 149,0,@2156 259,0,@2224 333,0,@2224 12373:D4,184|483b65187303ff5548488b4a18f6c10174134889c648b8c0e406c9a37f0000488b5d08ff134883f8017509488b09488b4908eb1ea80174064883e8027105ff5570ebf5488b4908483b65187303ff5548ebbb488b41084883380575454c8b4a104c8b42084889c848bac81225c9a37f0000909090ff15560000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70003000000c3488b01c39090900000000000000000b000000000000000|@12200,2097151,@19636,@12207|23,0,@578 105,0,@12206 12374:D6,280|483b65187303ff5548488b4810483b0d1c0100007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b4810488b58204889ce488b384c8b4008488b40189090ff15c60000005350565748bb609d25c9a37f00004c89c090ff15b6000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280300000048894120488b4424104889411848c7411001000000488b44240848894108584883c418488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c390909000000000000000001001000000000000|@7261,1048575,@19652,I48,@2259,@1354|32,0,I48 74,0,@971 120,0,@12375 12375:O1|@12376 12376:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19637|2,0,@441 12377:S63|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f7064656373283329636f646546756e63746f7242696e64283229 12378:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19639| 12379:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19640| 12380:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19641| 12381:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19642| 12382:D4,56|483b65187303ff55484c8b50204c8b48184c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@12394,1048575,@19646,@12383| 12383:D10,608|483b65187303ff55484983f901756f4c3b0562020000743341f6c00175394c89c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034c89c14889ce4889c74c89c890ff151602000041525056574889d948bb30a325c9a37f0000eb05e9d20000004889c89090ff15fa010000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280100000048894120488b4424104889411848c7411001000000488b44240848894108584883c418488901498d47e0483b45107303ff55404989c748c740f80300000048ba88a325c9a37f0000488950104889480848c700010000004889c348c7c001000000ff156a0100004889c1498d47e0483b45107303ff55404989c748c740f8030000004889481048c740080100000048c70005000000c34c3b053c010000743341f6c00175394c89c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb034c89c14889c64889cf4c89c8909090ff15ee00000041525650574889d948bb98a425c9a37f00004889c890ff15da000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424184889513048c741280100000048894120488b4424084889411848c7411001000000584883c40848894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c39090909090909000000000000000005802000000000000|@12394,1048575,@19647,I48,@12396,@1354,@12397,I48,@12395,@1354|35,0,I48 77,0,@971 116,0,@12384 255,0,@12386 361,0,I48 403,0,@971 444,0,@12392 12384:O1|@12385 12385:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19643|2,0,@441 12386:O1|@12387 12387:D3,40|48b8e8a325c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@12391,1,@19644|2,0,@12388 12388:O4|@20055,@557,@12390,@12389 12389:O5|@559,362,0,362,0 12390:S20|6d6b4d6163726f50726f633a20636c6f73757265 12391:S28|434f44455452454528292e6d6b4d6163726f50726f63283129283129 12392:O1|@12393 12393:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19645|2,0,@441 12394:S25|434f44455452454528292e6d6b4d6163726f50726f63283129 12395:D3,128|483b65187303ff5548a8017555488b08488339097417488b500848b8103209c9a37f0000488b5d08909090ff13ff7108488b48084889c89090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@19650|28,0,@2260 12396:D3,128|483b65187303ff5548a8017555488b08488339097417488b500848b8103209c9a37f0000488b5d08909090ff13ff7108488b48084889c89090e8c2ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c390909090909000000000000000007800000000000000|@1363,7,@19648|28,0,@2260 12397:D4,208|483b65187303ff55484883f8017560498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889581048c740088b00000048b988b419f1a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3488b08488b11483b156c000000750c488b70084889f0e976ffffff51488b40089090e86affffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c39090909090900000000000000000c800000000000000|@2198,31,@19649,@20054|61,0,@20054 12398:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19651| 12399:O1|@12400 12400:D3,56|488b4810488b10498d47e8483b45107303ff55404989c748c740f80200000048894808488910c39000000000000000003000000000000000|@12401,7,@19654| 12401:S59|535452554354555245535f28292e67656e636f646553747275637473283229636f6465546f706465637328332964656275677c636f64652d283129 12402:D7,264|483b65187303ff554848833803750848c7c001000000c3488338017550488b4008909090ff15f600000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c8c3488b4810488b095148bb10f608c9a37f0000488b400890ff159e00000050488b442408ff159a00000048c7c101000000a8017534498d57e8483b55107303ff55404989d748c742f80200000048894a08488b0848890a4889d1488b4008483b65187303ff5548ebc84889c84883f8017506584883c408c34889c3584883c408ff254600000090909090909000000000000000000001000000000000|@12404,2097151,@19657,@12405,@12339,@12406,@12403|119,0,@2150 12403:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19661| 12404:S45|535452554354555245535f28292e67656e636f6465537472756374732832296c6f6164546f7064656373283129 12405:D3,272|483b65187303ff5548a801755d488b08488b5128488b124883fa017514488b480848b8386208c9a37f0000488b5d08ff13488b12488b5a1048833b057417488b480848b8b8b321c9a37f0000488b5d08909090ff13488b7308488b3640f6c601740d4883fe017c0deb1fe987000000f646ff107414488b480848b8f0a115c9a37f0000488b5d08ff13498d7fd0483b7d107303ff55404989ff48c747f8020000004889770848c70705000000488d771848c746f80200000048897e0848c7060900000056488b48084889c89090e82effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000000801000000000000|@1363,63,@19658|35,0,@1662 68,0,@11018 123,0,@6844 12406:D4,112|483b65187303ff5548a8017545488b08ff7008488b019090ff156a00000050488b44240890e8d6ffffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c408488908c348c7c001000000c390909090909000000000000000006800000000000000|@1363,1048575,@19659,@12407| 12407:D4,344|483b65187303ff5548488338097562488b4810ff7008488b4108909090e8deffffff48833805750e49c7c0010000005bff253a0100004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b1424488950104889480848c7000d0000004883c408c3488338057565488b4808488b09488b4010488b0048c7c201000000f6c201740af600017405482b107105ff5570ebf64883c2014883fa01741348b8e8f608c9a37f0000488b5d08909090ff13f6c10174084883f9017c08eb1ff641ff10741948b860f708c9a37f0000eb05e946000000488b5d089090ff13498d47d0483b45107303ff55404989c748c740f8020000004889480848c700050000004889c1488d401848c740f8020000004889480848c70009000000c34883380374144889c148b8000309c9a37f0000488b5d0890ff13488b4008c3909000000000000000005001000000000000|@2195,1048575,@19660,@2178|172,0,@2153 210,0,@2156 306,0,@2173 12408:O2|3,@12409 12409:S24|436f6d70696c6174696f6e20696e7465727275707465640a 12410:O4|1,@169,0,@12411 12411:O5|@12412,220,0,220,0 12412:S36|6d6c736f757263652f4d4c436f6d70696c65722f434f4d50494c45525f424f44592e4d4c 12413:S26|457863657074696f6e2d20496e7465726e616c4572726f723a20 12414:S23|20726169736564207768696c6520636f6d70696c696e67 12415:O5|@12412,229,0,229,0 12416:S11|457863657074696f6e2d20 12417:S36|20756e65787065637465646c7920726169736564207768696c6520636f6d70696c696e67 12418:O5|@12412,238,0,238,0 12419:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283129 12420:D16,1136|483b65187303ff554848b948f020f9a37f0000488b09535048bb30b525c9a37f00004889c8909090ff155a040000488b442408488b400848b948f020f9a37f0000488b094889c34889c89090ff153e040000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048b9d85706c9a37f0000488908488b4c240848b8ffffffffffffff00482341f8488d4400014883f8097257488b4118a8017554498d57c0483b55107303ff55404989d748c742f805000000488b581048895a20488b702048897218488b780848897a104c8b40184c8942084c8b084c890a4c8d523049c742f801000000498912eb15e90900000049c7c201000000eb0749c7c2010000004983fa017461498b02488b10483b15790300007457f6c201752d4889d648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901744948b948f020f9a37f0000488b09ff70105248bb60b525c9a37f00004889c8eb0ae98a000000e91f000000909090ff151a03000048b848f020f9a37f0000488b005bff150e030000eb03ff701048833c2401745848b848f020f9a37f0000488b0048bb80b525c9a37f0000909090ff15ea02000048c7c303000000488b042448baa05f06c9a37f000090ff15d602000048b948f020f9a37f0000488b094889c34889c8909090ff15c20200004883c40848b848f020f9a37f0000488b0048bb98b525c9a37f0000909090ff15a602000058a801754748b948f020f9a37f0000488b09ff7008488b184889c8909090ff158a02000048b848f020f9a37f0000488b0048c7c3150000009090ff157602000058483b65187303ff5548ebb548b848f020f9a37f0000488b0048bbb0b525c9a37f0000909090ff155202000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000909090ff1536020000498d47f0483b45107303ff55404989c748c740f801000000c640ff4048c7000100000048b9d85706c9a37f0000488908488b0c2448b8ffffffffffffff00482341f8488d4400014883f8097257488b4118a8017554498d57c0483b55107303ff55404989d748c742f805000000488b581048895a20488b702048897218488b780848897a104c8b40184c8942084c8b084c890a4c8d523049c742f801000000498912eb15e90900000049c7c201000000eb0749c7c20100000041f6c2017444498d47d8483b45107303ff55404989c748c740f80400000048ba406806c9a37f000048895018488b511048895010488b590848895808488b31488930488b5d089090ff13498b02498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c7020100000048bb706806c9a37f000048891a488b11488b5908488b4910498d77a8483b75107303ff55404989f748c746f805000000488b78184883c40848897e204c8b40084c8946184c8b48204c894e104c8b58104c895e084c8b204c89264c8d6e3049c745f8040000004989751849894d1049895d08498955004c89e848bad091dc0000000000ff2200000000000000006804000000000000|@12427,2097151,@19665,@218,@218,I48,@218,@218,@218,@194,@218,@218,@218,@218,@218,@179|11,0,@20288 26,0,@12421 57,0,@20288 119,0,@180 137,0,36028797018963967 299,0,I48 341,0,@20288 358,0,@12422 392,0,@20288 424,0,@20288 437,0,@12423 467,0,@193 484,0,@20288 516,0,@20288 529,0,@12424 553,0,@20288 584,0,@20288 624,0,@20288 637,0,@12425 656,0,@20288 673,0,@60 727,0,@180 744,0,36028797018963967 907,0,@206 989,0,@207 1110,0,I14 12421:S32|457863657074696f6e20747261636520666f7220657863657074696f6e202d20 12422:S11|2072616973656420696e20 12423:S6|206c696e6520 12424:S2|0a0a 12425:S14|456e64206f662074726163650a0a 12426:S27|434f4d50494c45525f424f445928292e636f6d70696c6572283329 12427:S30|506f6c794d4c2e457863657074696f6e2e7072696e745472616365283229 12428:O3|3,@12451,@395 12429:O3|3,@12430,@1726 12430:O2|@12432,@12431 12431:O2|@12434,@12433 12432:O2|49,@1746 12433:O2|@12439,0 12434:O2|50,@12435 12435:O3|2,@923,@12436 12436:O5|5,@12437,@1887,@1744,@390 12437:O2|@12438,0 12438:O5|5,0,@1607,@1605,0 12439:O2|51,@12440 12440:O5|5,@12441,@995,@993,@390 12441:O2|@12442,0 12442:O5|5,0,@12444,@12443,@390 12443:O3|@12444,@390,@12445 12444:S9|756e6976657273616c 12445:O3|@12447,@12450,@12446 12446:O3|@12444,@417,@416 12447:O2|1,@12448 12448:O3|2,@12449,0 12449:O4|0,@20213,3,1 12450:O4|1,@20214,0,0 12451:O2|@12453,@12452 12452:O2|@12456,0 12453:O2|49,@12454 12454:O5|5,@12455,@1887,@1744,@390 12455:O2|@1217,0 12456:O2|50,@12457 12457:O5|5,@12458,@1887,@1744,@390 12458:O2|@12459,0 12459:O3|2,@923,@12460 12460:O3|3,@12462,@12461 12461:O3|0,@12480,1 12462:O2|@12464,@12463 12463:O2|@12467,@12466 12464:O2|@12465,@1759 12465:S5|6669786573 12466:O2|@12470,@12469 12467:O2|@12468,@1820 12468:S5|7479706573 12469:O2|@12473,@12472 12470:O2|@12471,@1800 12471:S6|76616c756573 12472:O2|@12476,@12475 12473:O2|@12474,@1830 12474:S8|66756e63746f7273 12475:O2|@12478,0 12476:O2|@12477,@1780 12477:S10|7369676e617475726573 12478:O2|@12479,@1862 12479:S10|73747275637475726573 12480:O2|@12465,@12481 12481:O2|@12468,@12482 12482:O2|@12471,@12483 12483:O2|@12474,@12484 12484:O2|@12477,@12485 12485:O2|@12479,0 12486:O2|@12488,@12487 12487:O2|@12489,0 12488:S13|50546e6578745369626c696e67 12489:O4|@20043,69,@12490,0 12490:O7|@12488,@671,@12491,@1200,@390,0,0 12491:O2|1,@12492 12492:O3|14,@12493,0 12493:O2|@12495,@12494 12494:O2|@12499,@12498 12495:O2|7,@12496 12496:O8|@12497,@12488,0,0,@437,0,0,1 12497:O4|13,5,@679,13 12498:O2|@12503,0 12499:O2|7,@12500 12500:O8|@12501,@12488,0,0,@437,0,0,1 12501:O3|14,@12502,1 12502:O2|@11582,@685 12503:O2|7,@12504 12504:O8|@689,@12488,0,0,@437,0,0,1 12505:O2|@12507,@12506 12506:O2|@12508,0 12507:S17|4465627567676572496e74657266616365 12508:O4|@20058,69,@12509,0 12509:O4|@12507,@661,@12510,@390 12510:O6|@12512,I48,0,@390,@12511,0 12511:O1|@13163 12512:O4|1,@20216,@20217,@20215 12513:O2|@374,40 12514:O2|@13101,@13100 12515:O2|@12517,@12516 12516:O2|@12518,0 12517:S9|456e76547970656964 12518:O4|@20043,69,@12519,0 12519:O7|@12517,@12521,@12522,@12520,@390,0,0 12520:O3|2,@12540,@12539 12521:O2|0,8 12522:O2|1,@12523 12523:O3|14,@12524,0 12524:O2|@12526,@12525 12525:O2|@12530,@12529 12526:O2|7,@12527 12527:O8|@12528,@12517,0,0,@437,0,0,1 12528:O4|13,5,@679,7 12529:O2|@12537,0 12530:O2|7,@12531 12531:O8|@12532,@12517,0,0,@437,0,0,1 12532:O4|3,@518,@12533,1 12533:O2|7,@12534 12534:O8|@12535,@971,0,0,@437,0,0,1 12535:O3|14,@12536,1 12536:O2|@11582,@974 12537:O2|7,@12538 12538:O8|@980,@12517,0,0,@437,0,0,1 12539:O5|5,0,@12556,@12555,@390 12540:O3|3,@12541,@395 12541:O2|@12543,@12542 12542:O2|@12554,0 12543:O2|49,@12544 12544:O5|5,0,@12546,@12545,@390 12545:O3|@12546,@390,@12547 12546:S6|747970654964 12547:O3|@12549,@12552,@12548 12548:O3|@12553,@417,@416 12549:O2|1,@12550 12550:O3|2,@12551,0 12551:O4|0,@20219,3,1 12552:O4|1,@20220,0,0 12553:S31|506f6c794d4c2e4465627567676572496e746572666163652e747970654964 12554:O2|50,@12544 12555:O3|@12556,@390,@12557 12556:S12|656e7669726f6e456e747279 12557:O3|@12559,@12562,@12558 12558:O3|@12563,@417,@416 12559:O2|1,@12560 12560:O3|2,@12561,0 12561:O4|0,@20221,3,1 12562:O4|1,@20222,0,0 12563:S37|506f6c794d4c2e4465627567676572496e746572666163652e656e7669726f6e456e747279 12564:O2|@12566,@12565 12565:O2|@12567,0 12566:S14|456e76456e6446756e6374696f6e 12567:O4|@20043,69,@12568,0 12568:O7|@12566,@12521,@12570,@12569,@390,0,0 12569:O3|2,@12597,@12539 12570:O2|1,@12571 12571:O3|14,@12572,0 12572:O2|@12574,@12573 12573:O2|@12578,@12577 12574:O2|7,@12575 12575:O8|@12576,@12566,0,0,@437,0,0,1 12576:O4|13,0,@679,7 12577:O2|@12588,0 12578:O2|7,@12579 12579:O8|@12580,@12566,0,0,@437,0,0,1 12580:O4|3,@518,@12581,1 12581:O2|7,@12582 12582:O8|@12583,@971,0,0,@437,0,0,1 12583:O3|14,@12584,1 12584:O2|@509,@12585 12585:O2|@679,@12586 12586:O2|@977,@12587 12587:O2|@7748,0 12588:O2|7,@12589 12589:O8|@12590,@12566,0,0,@437,0,0,1 12590:O4|3,@518,@12591,1 12591:O2|7,@12592 12592:O8|@12593,@971,0,0,@437,0,0,1 12593:O3|14,@12594,0 12594:O2|@689,@12595 12595:O2|@986,@12596 12596:O2|@7779,0 12597:O3|3,@12598,@1726 12598:O2|@1764,@12599 12599:O2|@12601,@12600 12600:O2|@12602,0 12601:O2|50,@691 12602:O2|51,@12603 12603:O5|5,0,@12605,@12604,@390 12604:O3|@12605,@390,@12606 12605:S9|6c6f63616c54797065 12606:O3|@12608,@12611,@12607 12607:O3|@12612,@417,@416 12608:O2|1,@12609 12609:O3|2,@12610,0 12610:O4|0,@20223,3,1 12611:O4|1,@20224,0,0 12612:S34|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065 12613:O2|@12615,@12614 12614:O2|@12616,0 12615:S10|64656275675374617465 12616:O4|@20047,69,@12617,0 12617:O2|@12618,0 12618:O3|@12615,@390,@12619 12619:O3|@661,@12621,@12620 12620:O3|@12643,@417,@416 12621:O3|2,0,@12622 12622:O3|3,@12623,@1726 12623:O2|@12625,@12624 12624:O2|@12629,@12628 12625:O2|49,@12626 12626:O5|5,@12627,@995,@993,@390 12627:O2|@12539,0 12628:O2|@12642,0 12629:O2|50,@12630 12630:O5|5,@12631,@995,@993,@390 12631:O2|@12632,0 12632:O5|5,0,@12634,@12633,@390 12633:O3|@12634,@390,@12635 12634:S11|6d616368696e65576f7264 12635:O3|@12637,@12640,@12636 12636:O3|@12641,@417,@416 12637:O2|1,@12638 12638:O3|2,@12639,0 12639:O4|0,@20225,3,1 12640:O4|1,@20226,0,0 12641:S36|506f6c794d4c2e4465627567676572496e746572666163652e6d616368696e65576f7264 12642:O2|51,@691 12643:S35|506f6c794d4c2e4465627567676572496e746572666163652e64656275675374617465 12644:O2|@12646,@12645 12645:O2|@12647,0 12646:S9|6d616b6556616c7565 12647:O4|@20043,69,@12648,0 12648:O7|@12646,2,@12650,@12649,@390,0,0 12649:O3|2,@12688,@12687 12650:O2|1,@12651 12651:O3|2,@12652,0 12652:O1|@12653 12653:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa8d325c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@12686,7,@19678|29,0,@12654 12654:D4,304|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bb08d525c9a37f0000488919488b520848895108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bbc0e125c9a37f000048891a48894a08488062ffbfff7010ff30ff70184989d048bb70e325c9a37f0000488b40089090ff15be000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70105000000498d57a8483b55107303ff55404989d748c742f80200000048894a0848c702030000004889c1488d421848c740f80700000048c740300100000048c7402801000000488b5c240848895820488948184889501048c7400805000000594883c408488908c390909090909000000000000000002801000000000000|@12685,2097151,@19677,@1390|35,0,@12655 85,0,@12676 118,0,@12683 12655:D4,112|483b65187303ff5548488b08488339037512488b580848833b03750848c7c001000000c3488b5a084c8b4b104c8b4308488b134889d39090ff154a0000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000006800000000000000|@12664,1048575,@19668,@12656| 12656:D13,1376|483b65187303ff554850ff3568050000504c89c14c8d4424084889da4889cb4889d09090ff15560500004883f801756c488b0424488b4808488339037563488b5810488b711048c7c001000000909090ff153205000053565048bb80db25c9a37f000048c7c0050000009090ff151e050000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c7413001000000eb0ae9a6040000e9f001000048c741280300000048894120584889411848c741100100000048b8f8cb18c9a37f00004889410848b858cd06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c348b8d8db25c9a37f00009090ff1586040000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048ba60cc18c9a37f000048895008488908498d4fc8483b4d107303ff55404989cf48c741f80200000048894108488919488d411848c740f80300000048c74010010000004889480848c7001d000000f6c101740790ff15e2030000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b442410488b500848833a05751148b8807107c9a37f0000488b5d0890ff1348833a017519488b5a1048833b037509488b7308488b36eb10488b7308eb0a488b5a08488b1b4889de498d5ff0483b5d107303ff55404989df48c743f801000000c643ff40488933498d77b8483b75107303ff55404989f748c746f80400000048c74618010000005f48897e1048895e0848c70603000000488d462848c740f8030000005a48895010488970084889084883c418c348833901756d488b5810488b710848c7c00100000090ff15f602000053565048bb20dc25c9a37f000048c7c0050000009090ff15e2020000498d4fb8483b4d107303ff55404989cf48c741f80800000048c741380300000048c741300100000048c7412803000000488941205848894118eb05e9e001000048c741100100000048b8f8cb18c9a37f00004889410848b858cd06c9a37f0000488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f0000004889c348b8d8db25c9a37f0000909090ff154e020000498d4fd8483b4d107303ff55404989cf48c741f80400000048c741180300000048ba40cc18c9a37f0000488951104889410848c70107000000498d47e8483b45107303ff55404989c748c740f80200000048ba60cc18c9a37f000048895008488908498d4fc8483b4d107303ff55404989cf48c741f80200000048894108488919488d411848c740f80300000048c74010010000004889480848c7001d000000f6c101740790ff15aa010000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488b442410488b500848833a05751148b8807107c9a37f0000488b5d0890ff1348833a017519488b5a1048833b037509488b7308488b36eb10488b7308eb0a488b5a08488b1b4889de498d5ff0483b5d107303ff55404989df48c743f801000000c643ff40488933498d77b8483b75107303ff55404989f748c746f80400000048c74618010000005f48897e1048895e0848c70603000000488d462848c740f8030000005a48895010488970084889084883c418c3498d57c0483b55107303ff55404989d748c742f803000000488b591048895a10488b71084889720848c70205000000488b7810488d422048c740f803000000488978104889500848ba08f206c9a37f00004889104883c418c3488b004883c418c39000000000000000005805000000000000|@12666,1048575,@19669,@12667,@12665,@2259,@1354,@2166,@2211,@2259,@1354,@2166,@2211|91,0,@12657 193,0,@8203 207,0,@442 258,0,@12659 308,0,@8205 357,0,@8206 498,0,@1305 695,0,@12662 792,0,@8203 806,0,@442 857,0,@12659 908,0,@8205 957,0,@8206 1098,0,@1305 1335,0,@661 12657:O1|@12658 12658:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19666|2,0,@441 12659:O2|@442,@12660 12660:O2|@8204,@12661 12661:O2|@2164,0 12662:O1|@12663 12663:D3,32|48b840cd06c9a37f0000c3909090909000000000000000001800000000000000|@2232,1,@19667|2,0,@441 12664:S35|44454255474745525f28292e72756e54696d6554797065283229636f70794964283129 12665:D3,440|483b65187303ff5548a801755bf6c301755b488b4808488b10498d47e8483b45107303ff55404989c748c740f802000000488b33488970084889104150ff73085153524c89c29090ff124883f8017522488b0424488b0048b92add25c9a37f0000488d4c81fcffe1e930010000e92b010000e903010000909090e953000000909090e963000000909090e973000000909090e983000000909090e993000000909090e913000000909090e99b000000909090e9ab0000009090904c8b442420488b5c24184883c410584883c410e92effffff4c8b442420488b5c24184883c410584883c410e916ffffff4c8b442420488b5c24184883c410584883c410e9fefeffff4c8b442420488b5c24184883c410584883c410e9e6feffff4c8b442420488b5c24184883c410584883c410e9cefeffff4c8b442420488b5c24084883c410584883c410e9b6feffff4c8b442420488b5c24184883c410584883c410e99efeffff4c8b442420488b5c24184883c410584883c410e986feffff488b08498d47f0483b45107303ff55404989c748c740f8010000004889084883c428c348c7c001000000c39090900000000000000000b001000000000000|@12675,1048575,@19672|89,0,$12665+122 12666:S25|44454255474745525f28292e73656172636854797065283429 12667:D4,48|483b65187303ff55484c8b4208488b5808488b084889c8ff252b00000090909000000000000000002800000000000000|@12673,1023,@19670,@12668| 12668:D3,288|4883380b755b488b4810488b510848833a037516498b700848833e03750c488b7a08483b7e08755deb2948833a01755a498b700848833e017555488b7a1840f6c7017509f64618017503ff5570483b7e187570488b78084c8b4f0849833903eb05e9a0000000741148b868e025c9a37f0000488b5d0890ff134d8d57984c3b55107314eb0fe974000000e96f000000e96a000000ff55404d89d749c742f80300000049c742100100000049895a0849c70205000000498d5a2048c743f802000000eb05e9360000004c89530848c703030000004c8d531849c742f8030000004c8b5f104d895a104d894a0849891a498d422048c740f8010000004c8910c348c7c001000000c348c7c001000000c3909000000000000000001801000000000000|@12674,1023,@19671|106,0,@12669 12669:O4|@20055,@557,@12671,@12670 12670:O5|@12672,160,0,160,0 12671:S24|736561726368547970653a205479706546756e6374696f6e 12672:S33|6d6c736f757263652f4d4c436f6d70696c65722f44454255474745525f2e736d6c 12673:S33|44454255474745525f28292e736561726368547970652834296d61746368283129 12674:S33|44454255474745525f28292e736561726368547970652834296d61746368283229 12675:S25|44454255474745525f28292e736561726368456e7673283329 12676:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b970e225c9a37f000049b8f0e225c9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@12682,2097151,@19675,@1554|28,0,@12677 38,0,@12680 12677:O1|@12678 12678:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19673| 12679:S32|44454255474745525f28292e72756e54696d6554797065283229283129283129 12680:O1|@12681 12681:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19674| 12682:S29|44454255474745525f28292e72756e54696d6554797065283229283129 12683:O1|@12684 12684:D3,24|c39090909090909000000000000000001000000000000000|@12682,1,@19676| 12685:S27|44454255474745525f28292e6d616b6556616c7565283129283129 12686:S24|44454255474745525f28292e6d616b6556616c7565283129 12687:O3|2,@12689,@1806 12688:O5|5,0,@12615,@12618,@390 12689:O3|3,@12690,@7783 12690:O2|@1764,@12691 12691:O2|@12693,@12692 12692:O2|@12695,@12694 12693:O2|50,@12603 12694:O2|@12706,0 12695:O2|51,@12696 12696:O5|5,0,@12698,@12697,@390 12697:O3|@12698,@390,@12699 12698:S16|6c6f636174696f6e50726f704c697374 12699:O3|@12701,@12704,@12700 12700:O3|@12705,@417,@416 12701:O2|1,@12702 12702:O3|2,@12703,0 12703:O4|0,@20227,3,1 12704:O4|1,@20228,0,0 12705:S41|506f6c794d4c2e4465627567676572496e746572666163652e6c6f636174696f6e50726f704c697374 12706:O2|52,@12632 12707:O2|@12709,@12708 12708:O2|@12710,0 12709:S12|456e76457863657074696f6e 12710:O4|@20043,69,@12711,0 12711:O7|@12709,@12521,@12713,@12712,@390,0,0 12712:O3|2,@12730,@12539 12713:O2|1,@12714 12714:O3|14,@12715,0 12715:O2|@12717,@12716 12716:O2|@12721,@12720 12717:O2|7,@12718 12718:O8|@12719,@12709,0,0,@437,0,0,1 12719:O4|13,1,@679,7 12720:O2|@12728,0 12721:O2|7,@12722 12722:O8|@12723,@12709,0,0,@437,0,0,1 12723:O4|3,@518,@12724,1 12724:O2|7,@12725 12725:O8|@12726,@971,0,0,@437,0,0,1 12726:O3|14,@12727,1 12727:O2|@442,@12585 12728:O2|7,@12729 12729:O8|@12590,@12709,0,0,@437,0,0,1 12730:O3|3,@12731,@1726 12731:O2|@1764,@12732 12732:O2|@12693,@12733 12733:O2|@12695,0 12734:O2|@12736,@12735 12735:O2|@12737,0 12736:S9|7365744f6e45786974 12737:O4|@20043,69,@12738,0 12738:O7|@12736,2,@12740,@12739,@390,0,0 12739:O3|2,@12749,@923 12740:O2|1,@12741 12741:O3|2,@12742,0 12742:O2|@12743,@20197 12743:D3,104|a8017540498d4fe8483b4d107303ff55404989cf48c741f80200000048bb28ec25c9a37f0000488919488b0048894108488061ffbf488b520848890a48c7c001000000c3488b520848c7020100000048c7c001000000c39000000000000000006000000000000000|@12748,15,@19681|30,0,@12744 12744:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@12746,2097151,@19679,@12745| 12745:D3,624|483b65187303ff5548488b4d78488b5128488b7130488b79384c8b4140415051575652ff750849b9caec25c9a37f00004151488965084889da909090ff124883c4085848894508eb7390488b65084883c4085b48895d08488b4c2418488b142448895128488b5c240848895930488b74241048897138488b7c2420488979404d8d47f04c3b45107303ff55404d89c749c740f80100000041c640ff4049c7000100000049b9d85706c9a37f00004d890849b8ffffffffffffff00eb05e9750100004c2340f84f8d4400014983f80972594c8b401841f6c00175544d8d4fc04c3b4d107303ff55404d89cf49c741f8050000004d8b50104d8951204d8b58204d8959184d8b60084d8961104d8b68184d8969084d8b304d8931498d493048c741f8010000004c8909eb15e90900000048c7c101000000eb0748c7c101000000f6c101744a4d8d47d84c3b45107303ff55404d89c749c740f80400000049b9406806c9a37f00004d8948184c8b48104d8948104c8b50084d8950084c8b184d89184989c14c89c0488b5d089090ff134c8b014d8d4ff04c3b4d107303ff55404d89cf49c741f80100000041c641ff4049c7010100000049ba706806c9a37f00004d89114c8b084c8b5008488b40104d8d5fa84c3b5d107303ff55404d89df49c743f8050000004d8b60184d8963204d8b68084d896b184d8b70204d897310498b501049895308498b1849891b498d733048c746f8040000004c895e18488946104c8956084c890e4889f048bad091dc00000000009090ff12488b442418594889482859488948305948894838488b4c24084889484048c7c0010000004883c410c39000000000000000006802000000000000|@12747,2097151,@19680|40,0,$12745+74 165,0,@180 178,0,36028797018963967 349,0,@206 438,0,@207 554,0,I14 12746:S22|44454255474745525f28292e77726170283129283129 12747:S19|44454255474745525f28292e77726170283229 12748:S24|44454255474745525f28292e7365744f6e45786974283129 12749:O5|5,@12750,@1887,@1744,@390 12750:O2|@12751,0 12751:O3|2,@12752,@923 12752:O3|3,@12753,@395 12753:O2|@1764,@12754 12754:O2|@12601,0 12755:O2|@12757,@12756 12756:O2|@12758,0 12757:S14|6d616b6554797065436f6e737472 12758:O4|@20043,69,@12759,0 12759:O7|@12757,2,@12761,@12760,@390,0,0 12760:O3|2,@12688,@12768 12761:O2|1,@12762 12762:O3|2,@12763,0 12763:O1|@12764 12764:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048bad8f125c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@12767,7,@19683|29,0,@12765 12765:D4,144|483b65187303ff5548488b08488b5a08514c8b4b104c8b4308488b034889c3488b411090ff157e000000488b0c24498d57e0483b55107303ff55404989d748c742f80300000048894210488b41084883c40848894208488b1948891a498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488910c300000000000000008800000000000000|@12766,1048575,@19682,@12656| 12766:S32|44454255474745525f28292e6d616b6554797065436f6e737472283129283129 12767:S29|44454255474745525f28292e6d616b6554797065436f6e737472283129 12768:O3|2,@12769,@1730 12769:O5|5,0,@12771,@12770,@390 12770:O3|@12771,@390,@12772 12771:S15|6c6f63616c54797065436f6e737472 12772:O3|@12774,@12777,@12773 12773:O3|@12778,@417,@416 12774:O2|1,@12775 12775:O3|2,@12776,0 12776:O4|0,@20229,3,1 12777:O4|1,@20230,0,0 12778:S40|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c54797065436f6e737472 12779:O2|@12781,@12780 12780:O2|@12782,0 12781:S13|6d616b65457863657074696f6e 12782:O4|@20043,69,@12783,0 12783:O7|@12781,2,@12784,@12649,@390,0,0 12784:O2|1,@12785 12785:O3|2,@12786,0 12786:O1|@12787 12787:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baf8f525c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@12798,7,@19690|29,0,@12788 12788:D4,304|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bb58f725c9a37f0000488919488b520848895108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bbf8f725c9a37f000048891a48894a08488062ffbfff7010ff30ff70184989d048bb48f925c9a37f0000488b40089090ff15be000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70105000000498d57a8483b55107303ff55404989d748c742f80200000048894a0848c702030000004889c1488d421848c740f80700000048c740300100000048c7402801000000488b5c240848895820488948184889501048c7400801000000594883c408488908c390909090909000000000000000002801000000000000|@12797,2097151,@19689,@1390|35,0,@12789 85,0,@12790 118,0,@12795 12789:D4,112|483b65187303ff5548488b08488339037512488b580848833b03750848c7c001000000c3488b5a084c8b4b104c8b4308488b134889d39090ff154a0000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000006800000000000000|@12664,1048575,@19684,@12656| 12790:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9a8f825c9a37f000049b8f8f825c9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@12682,2097151,@19687,@1554|28,0,@12791 38,0,@12793 12791:O1|@12792 12792:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19685| 12793:O1|@12794 12794:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19686| 12795:O1|@12796 12796:D3,24|c39090909090909000000000000000001000000000000000|@12682,1,@19688| 12797:S31|44454255474745525f28292e6d616b65457863657074696f6e283129283129 12798:S28|44454255474745525f28292e6d616b65457863657074696f6e283129 12799:O2|@12801,@12800 12800:O2|@12802,0 12801:S8|6c6f63616c536967 12802:O4|@20047,69,@12803,0 12803:O2|@12804,0 12804:O3|@12801,@390,@12805 12805:O3|@12807,@12810,@12806 12806:O3|@12811,@417,@416 12807:O2|1,@12808 12808:O3|2,@12809,0 12809:O4|0,@20231,3,1 12810:O4|1,@20232,0,0 12811:S33|506f6c794d4c2e4465627567676572496e746572666163652e6c6f63616c536967 12812:O2|@12814,@12813 12813:O2|@12815,0 12814:S13|6d616b65537472756374757265 12815:O4|@20043,69,@12816,0 12816:O7|@12814,2,@12818,@12817,@390,0,0 12817:O3|2,@12688,@12831 12818:O2|1,@12819 12819:O3|2,@12820,0 12820:O1|@12821 12821:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba30fd25c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@12830,7,@19695|29,0,@12822 12822:D4,56|483b65187303ff55484c8b52084c8b48184c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@12828,4095,@19693,@12823| 12823:D3,480|498d4fe8483b4d107303ff55404989cf48c741f80200000048baa0ff25c9a37f00004889114c895108488061ffbf498d57e0483b55107303ff55404989d748c742f80300000048bed00026c9a37f0000488932488b73204889720848894a10488062ffbf488b0b48833903756a488b7908488b3f4c8b51184d8b124d8b1a4983fb01750c49ba909adc0000000000eb6d4c89d94989c448c7c0010000004989fd488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff4057f348ab5f4c89d64889f8eb05e95b0000004889c74c89d948d1e94883c608f348a5488d7c3f01488d743601488d4c0901eb05e90e000000488060ffbf4989c24c89ef4c89e0498d4fe0483b4d107303ff55404989cf48c741f8030000004c8951104889790848c70101000000498db768ffffff483b75107303ff55404989f748c746f806000000488b7b2848897e2848895620488b53184889561848c74610010000004c8b53084c89560848890e488d4e3848c741f80300000048c74110010000004c89490848c701050000004c8d492049c741f8020000004989490849c701030000004889c1498d411848c740f8040000004c894018488970104c894808488908c390900000000000000000d801000000000000|@12829,4095,@19694|26,0,@12824 72,0,@12827 134,0,I49 12824:D4,168|483b65187303ff5548498d4fd0483b4d107303ff55404989cf48c741f80500000048c74120010000004889411848b828cd06c9a37f00004889411048c741080100000048c70101000000498d47e0483b45107303ff55404989c748c740f80300000048bb780026c9a37f0000488958104889480848b908f206c9a37f0000488908488b4a084c8b49104c8b4108488b19ff252a00000090900000000000000000a000000000000000|@12826,1048575,@19691,@12656|47,0,@440 100,0,@12825 118,0,@661 12825:O3|I48,@417,@416 12826:S40|44454255474745525f28292e6d616b65537472756374757265283529676574467265654964283129 12827:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@1543,2097151,@19692,@1542| 12828:S31|44454255474745525f28292e6d616b65537472756374757265283129283129 12829:S28|44454255474745525f28292e6d616b65537472756374757265283529 12830:S28|44454255474745525f28292e6d616b65537472756374757265283129 12831:O3|2,@12832,@1868 12832:O3|3,@12833,@7783 12833:O2|@1764,@12834 12834:O2|@12835,@12692 12835:O2|50,@12836 12836:O5|5,0,@12801,@12804,@390 12837:O2|@12839,@12838 12838:O2|@12840,0 12839:S10|7365744f6e456e747279 12840:O4|@20043,69,@12841,0 12841:O7|@12839,2,@12842,@12739,@390,0,0 12842:O2|1,@12843 12843:O3|2,@12844,0 12844:O2|@12845,@20199 12845:D3,104|a8017540498d4fe8483b4d107303ff55404989cf48c741f80200000048bb080426c9a37f0000488919488b0048894108488061ffbf488b520848890a48c7c001000000c3488b520848c7020100000048c7c001000000c39000000000000000006000000000000000|@12847,15,@19697|30,0,@12846 12846:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@12746,2097151,@19696,@12745| 12847:S25|44454255474745525f28292e7365744f6e456e747279283129 12848:O2|@12850,@12849 12849:O2|@12851,0 12850:S12|456e76537472756374757265 12851:O4|@20043,69,@12852,0 12852:O7|@12850,@12521,@12854,@12853,@390,0,0 12853:O3|2,@12871,@12539 12854:O2|1,@12855 12855:O3|14,@12856,0 12856:O2|@12858,@12857 12857:O2|@12862,@12861 12858:O2|7,@12859 12859:O8|@12860,@12850,0,0,@437,0,0,1 12860:O4|13,3,@679,7 12861:O2|@12869,0 12862:O2|7,@12863 12863:O8|@12864,@12850,0,0,@437,0,0,1 12864:O4|3,@518,@12865,1 12865:O2|7,@12866 12866:O8|@12867,@971,0,0,@437,0,0,1 12867:O3|14,@12868,1 12868:O2|@775,@12585 12869:O2|7,@12870 12870:O8|@12590,@12850,0,0,@437,0,0,1 12871:O3|3,@12872,@1726 12872:O2|@1764,@12873 12873:O2|@12835,@12733 12874:O2|@12771,@12875 12875:O2|@12876,0 12876:O4|@20047,69,@12877,0 12877:O2|@12770,0 12878:O2|@12880,@12879 12879:O2|@12881,0 12880:S9|756e697456616c7565 12881:O4|@20043,69,@12882,0 12882:O7|@12880,2,@12883,@1806,@390,0,0 12883:O2|1,@12884 12884:O3|2,@12885,0 12885:O7|I48,2,@661,@923,0,0,0 12886:O2|@12556,@12887 12887:O2|@12888,0 12888:O4|@20047,69,@12889,0 12889:O2|@12555,@12890 12890:O2|@12568,@12891 12891:O2|@12711,@12892 12892:O2|@12894,@12893 12893:O2|@12852,@12913 12894:O7|@12896,@12521,@12895,@12569,@390,0,0 12895:O2|1,@12897 12896:S16|456e76537461727446756e6374696f6e 12897:O3|14,@12898,0 12898:O2|@12900,@12899 12899:O2|@12904,@12903 12900:O2|7,@12901 12901:O8|@12902,@12896,0,0,@437,0,0,1 12902:O4|13,2,@679,7 12903:O2|@12911,0 12904:O2|7,@12905 12905:O8|@12906,@12896,0,0,@437,0,0,1 12906:O4|3,@518,@12907,1 12907:O2|7,@12908 12908:O8|@12909,@971,0,0,@437,0,0,1 12909:O3|14,@12910,1 12910:O2|@2296,@12585 12911:O2|7,@12912 12912:O8|@12590,@12896,0,0,@437,0,0,1 12913:O2|@12915,@12914 12914:O2|@12519,@12939 12915:O7|@12917,@12521,@12918,@12916,@390,0,0 12916:O3|2,@12935,@12539 12917:S10|456e7654436f6e737472 12918:O2|1,@12919 12919:O3|14,@12920,0 12920:O2|@12922,@12921 12921:O2|@12926,@12925 12922:O2|7,@12923 12923:O8|@12924,@12917,0,0,@437,0,0,1 12924:O4|13,4,@679,7 12925:O2|@12933,0 12926:O2|7,@12927 12927:O8|@12928,@12917,0,0,@437,0,0,1 12928:O4|3,@518,@12929,1 12929:O2|7,@12930 12930:O8|@12931,@971,0,0,@437,0,0,1 12931:O3|14,@12932,1 12932:O2|@1213,@974 12933:O2|7,@12934 12934:O8|@980,@12917,0,0,@437,0,0,1 12935:O3|3,@12936,@395 12936:O2|@1764,@12937 12937:O2|@12938,0 12938:O2|50,@12769 12939:O2|@12941,@12940 12940:O2|@12971,0 12941:O7|@12943,@12521,@12944,@12942,@390,0,0 12942:O3|2,@12956,@12539 12943:S10|456e7656436f6e737472 12944:O2|1,@12945 12945:O3|14,@12946,0 12946:O2|@12948,@12947 12947:O2|@12952,@12951 12948:O2|7,@12949 12949:O8|@12950,@12943,0,0,@437,0,0,1 12950:O4|13,6,@679,7 12951:O2|@12954,0 12952:O2|7,@12953 12953:O8|@683,@12943,0,0,@437,0,0,1 12954:O2|7,@12955 12955:O8|@689,@12943,0,0,@437,0,0,1 12956:O3|3,@12958,@12957 12957:O3|0,@12966,1 12958:O2|@1764,@12959 12959:O2|@12693,@12960 12960:O2|@12962,@12961 12961:O2|@12964,@12963 12962:O2|51,@393 12963:O2|@12965,0 12964:O2|52,@468 12965:O2|53,@12696 12966:O2|49,@12967 12967:O2|50,@12968 12968:O2|51,@12969 12969:O2|52,@12970 12970:O2|53,0 12971:O7|@12973,@12521,@12972,@12712,@390,0,0 12972:O2|1,@12974 12973:S8|456e7656616c7565 12974:O3|14,@12975,0 12975:O2|@12977,@12976 12976:O2|@12981,@12980 12977:O2|7,@12978 12978:O8|@12979,@12973,0,0,@437,0,0,1 12979:O4|13,7,@679,7 12980:O2|@12988,0 12981:O2|7,@12982 12982:O8|@12983,@12973,0,0,@437,0,0,1 12983:O4|3,@518,@12984,1 12984:O2|7,@12985 12985:O8|@12986,@971,0,0,@437,0,0,1 12986:O3|14,@12987,1 12987:O2|@11112,@12585 12988:O2|7,@12989 12989:O8|@12590,@12973,0,0,@437,0,0,1 12990:O2|@12634,@12991 12991:O2|@12992,0 12992:O4|@20047,69,@12993,0 12993:O2|@12633,0 12994:O2|@12917,@12995 12995:O2|@12996,0 12996:O4|@20043,69,@12915,0 12997:O2|@12546,@12998 12998:O2|@12999,0 12999:O4|@20047,69,@13000,0 13000:O2|@12545,0 13001:O2|@12973,@13002 13002:O2|@13003,0 13003:O4|@20043,69,@12971,0 13004:O2|@12605,@13005 13005:O2|@13006,0 13006:O4|@20047,69,@13007,0 13007:O2|@12604,0 13008:O2|@13010,@13009 13009:O2|@13011,0 13010:S18|6d616b65416e6f6e796d6f757356616c7565 13011:O4|@20043,69,@13012,0 13012:O7|@13010,2,@13014,@13013,@390,0,0 13013:O3|2,@12688,@13029 13014:O2|1,@13015 13015:O3|2,@13016,0 13016:O1|@13017 13017:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048baa01b26c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@13028,7,@19704|29,0,@13018 13018:D4,296|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bbf81c26c9a37f0000488919488b520848895108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bb981d26c9a37f000048891a48894a08488062ffbfff70084989d048bbe81e26c9a37f0000488b00ff15be000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70105000000498d57a8483b55107303ff55404989d748c742f80200000048894a0848c702030000004889c1488d421848c740f80700000048c740300100000048c740280100000048c7402001000000488948184889501048c740080500000048b9509adc0000000000488908c3909000000000000000002001000000000000|@13027,2097151,@19703,@1390|35,0,@13019 85,0,@13020 113,0,@13025 266,0,I48 13019:D4,112|483b65187303ff5548488b08488339037512488b580848833b03750848c7c001000000c3488b5a084c8b4b104c8b4308488b134889d39090ff154a0000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000006800000000000000|@12664,1048575,@19698,@12656| 13020:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9481e26c9a37f000049b8981e26c9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@12682,2097151,@19701,@1554|28,0,@13021 38,0,@13023 13021:O1|@13022 13022:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19699| 13023:O1|@13024 13024:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19700| 13025:O1|@13026 13026:D3,24|c39090909090909000000000000000001000000000000000|@12682,1,@19702| 13027:S36|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129283129 13028:S33|44454255474745525f28292e6d616b65416e6f6e796d6f757356616c7565283129 13029:O3|2,@13030,@1806 13030:O3|3,@13031,@395 13031:O2|@13033,@13032 13032:O2|@13034,0 13033:O2|49,@12603 13034:O2|50,@12632 13035:O2|@13037,@13036 13036:O2|@13038,0 13037:S18|7365744f6e45786974457863657074696f6e 13038:O4|@20043,69,@13039,0 13039:O7|@13037,2,@13041,@13040,@390,0,0 13040:O3|2,@13049,@923 13041:O2|1,@13042 13042:O3|2,@13043,0 13043:O2|@13044,@20198 13044:D3,104|a8017540498d4fe8483b4d107303ff55404989cf48c741f80200000048bb082226c9a37f0000488919488b0048894108488061ffbf488b520848890a48c7c001000000c3488b520848c7020100000048c7c001000000c39000000000000000006000000000000000|@13048,15,@19707|30,0,@13045 13045:D3,88|483b65187303ff5548488b5208909090ff124889c1498d47e8483b45107303ff55404989c748c740f80200000048ba882226c9a37f000048891048894808488060ffbfc39090909000000000000000005000000000000000|@13047,1048575,@19706|47,0,@13046 13046:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@12746,2097151,@19705,@12745| 13047:S36|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129283129 13048:S33|44454255474745525f28292e7365744f6e45786974457863657074696f6e283129 13049:O5|5,@13050,@1887,@1744,@390 13050:O2|@13051,0 13051:O3|2,@12752,@13052 13052:O3|2,@8607,@923 13053:O2|@12943,@13054 13054:O2|@13055,0 13055:O4|@20043,69,@12941,0 13056:O2|@12698,@13057 13057:O2|@13058,0 13058:O4|@20047,69,@13059,0 13059:O2|@12697,0 13060:O2|@12896,@13061 13061:O2|@13062,0 13062:O4|@20043,69,@12894,0 13063:O2|@13065,@13064 13064:O2|@13066,0 13065:S15|6d616b65436f6e7374727563746f72 13066:O4|@20043,69,@13067,0 13067:O7|@13065,2,@13069,@13068,@390,0,0 13068:O3|2,@12688,@13084 13069:O2|1,@13070 13070:O3|2,@13071,0 13071:O1|@13072 13072:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba882626c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@13083,7,@19714|29,0,@13073 13073:D4,328|483b65187303ff5548498d4fe8483b4d107303ff55404989cf48c741f80200000048bb002826c9a37f0000488919488b520848895108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bba02826c9a37f000048891a48894a08488062ffbfff7020ff30ff7018ff7010ff70284989d048bbf02926c9a37f0000488b4008ff15d2000000498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000005a4889510848c70105000000498d5790483b55107303ff55404989d748c742f80200000048894a0848c70203000000488d4a1848c741f802000000488b5c2408488959085b4883c4084889194889c3488d411848c740f80700000048c740300100000048c7402801000000488b74240848897020488958184889501048894808594883c408488908c39000000000000000004001000000000000|@13082,2097151,@19713,@1390|35,0,@13074 85,0,@13075 124,0,@13080 13074:D4,112|483b65187303ff5548488b08488339037512488b580848833b03750848c7c001000000c3488b5a084c8b4b104c8b4308488b134889d39090ff154a0000004889c1498d47f0483b45107303ff55404989c748c740f801000000488908c390909000000000000000006800000000000000|@12664,1048575,@19708,@12656| 13075:D4,128|483b65187303ff55486a016a016a014889e15149c7c20100000049b9502926c9a37f000049b8a02926c9a37f0000488b5a089090ff155e000000498d47e0483b45107303ff55404989c748c740f803000000488b4c241048894810488b4c240848894808594883c410488908c390909000000000000000007800000000000000|@12682,2097151,@19711,@1554|28,0,@13076 38,0,@13078 13076:O1|@13077 13077:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19709| 13078:O1|@13079 13079:D3,24|c39090909090909000000000000000001000000000000000|@12679,1,@19710| 13080:O1|@13081 13081:D3,24|c39090909090909000000000000000001000000000000000|@12682,1,@19712| 13082:S33|44454255474745525f28292e6d616b65436f6e7374727563746f72283129283129 13083:S30|44454255474745525f28292e6d616b65436f6e7374727563746f72283129 13084:O3|2,@13085,@1806 13085:O3|3,@13087,@13086 13086:O3|0,@13094,1 13087:O2|@1764,@13088 13088:O2|@12693,@13089 13089:O2|@12962,@13090 13090:O2|@12964,@13091 13091:O2|@12965,@13092 13092:O2|@13093,0 13093:O2|54,@12632 13094:O2|49,@13095 13095:O2|50,@13096 13096:O2|51,@13097 13097:O2|52,@13098 13098:O2|53,@13099 13099:O2|54,0 13100:O2|@13102,0 13101:S15|7365744f6e427265616b506f696e74 13102:O4|@20043,69,@13103,0 13103:O7|@13101,2,@13105,@13104,@390,0,0 13104:O3|2,@13111,@923 13105:O2|1,@13106 13106:O3|2,@13107,0 13107:O2|@13108,@20195 13108:D3,104|a8017540498d4fe8483b4d107303ff55404989cf48c741f80200000048bbe02d26c9a37f0000488919488b0048894108488061ffbf488b520848890a48c7c001000000c3488b520848c7020100000048c7c001000000c39000000000000000006000000000000000|@13110,15,@19716|30,0,@13109 13109:D4,40|483b65187303ff5548488b5a08ff252d000000909090909000000000000000002000000000000000|@12746,2097151,@19715,@12745| 13110:S30|44454255474745525f28292e7365744f6e427265616b506f696e74283129 13111:O5|5,@13112,@1887,@1744,@390 13112:O2|@13113,0 13113:O3|2,@13114,@923 13114:O3|3,@13115,@395 13115:O2|@1226,@13116 13116:O2|@13117,0 13117:O2|50,@13118 13118:O5|5,@8306,@8565,@13119,@390 13119:O3|@8565,@390,@13120 13120:O3|@13122,@13162,@13121 13121:O3|@8565,@417,@416 13122:O2|1,@13123 13123:O3|2,@13125,@13124 13124:O2|@13141,0 13125:O4|@13127,@20233,@13136,@13126 13126:O1|@13139 13127:O1|@13128 13128:D3,32|48b810cddc0000000000c3909090909000000000000000001800000000000000|@13129,1,@19717|2,0,I251 13129:S11|65712d68656c7065722829 13130:O1|@13131 13131:D3,32|48b8203126c9a37f0000c3909090909000000000000000001800000000000000|@13135,1,@19719|2,0,@13132 13132:O1|@13133 13133:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@13134,1,@19718|2,0,@413 13134:S40|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129283129 13135:S37|545950455f5452454528292e64656661756c74506f6c79547970655072696e746572283129 13136:O1|@13137 13137:D3,24|48c7c005000000c300000000000000001000000000000000|@13138,1,@19720| 13138:S14|626f7865642d68656c7065722829 13139:D3,24|48c7c003000000c300000000000000001000000000000000|@13140,1,@19721| 13140:S13|73697a652d68656c7065722829 13141:O4|@20054,69,@13142,0 13142:O3|2,4,@13143 13143:O5|@590,@13145,@13161,@13144,@548 13144:O4|@13125,@13127,@13136,@13126 13145:O2|@594,@13146 13146:O2|@13148,@13147 13147:O2|@13152,@13151 13148:O2|@1148,@13149 13149:O3|0,@13150,@576 13150:O8|@502,@13129,0,0,@437,0,0,1 13151:O2|@13155,@13154 13152:O2|@13153,@573 13153:O3|0,@20233,0 13154:O2|@13158,0 13155:O2|@1155,@13156 13156:O3|0,@13157,@576 13157:O8|@2296,@13138,0,0,@437,0,0,1 13158:O2|@1162,@13159 13159:O3|0,@13160,@576 13160:O8|@442,@13140,0,0,@437,0,0,1 13161:O3|2,2,2 13162:O4|1,@20093,1,0 13163:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@19722|2,0,@2058 13164:O2|@13166,@13165 13165:O2|@13167,0 13166:S10|6d616b65737472696e67 13167:O4|@20043,69,@13168,0 13168:O7|@13166,2,@13170,@13169,@390,0,0 13169:O3|2,@13171,@467 13170:O2|3,5 13171:O3|6,@20234,79993 13172:O2|@13174,@13173 13173:O2|@13175,0 13174:S6|505474797065 13175:O4|@20043,69,@13176,0 13176:O7|@13174,@671,@13178,@13177,@390,0,0 13177:O3|2,@7502,@690 13178:O2|1,@13179 13179:O3|14,@13180,0 13180:O2|@13182,@13181 13181:O2|@13186,@13185 13182:O2|7,@13183 13183:O8|@13184,@13174,0,0,@437,0,0,1 13184:O4|13,13,@679,13 13185:O2|@13191,0 13186:O2|7,@13187 13187:O8|@13188,@13174,0,0,@437,0,0,1 13188:O3|14,@13189,1 13189:O2|@13190,@685 13190:O3|2,13,0 13191:O2|7,@13192 13192:O8|@689,@13174,0,0,@437,0,0,1 13193:O2|@1179,@13194 13194:O2|@13195,0 13195:O4|@20047,69,@13196,0 13196:O2|@1178,@13197 13197:O2|@1126,@13198 13198:O2|@13199,0 13199:O7|@870,@1128,@13201,@13200,@390,0,0 13200:O3|2,@13228,@1177 13201:O2|1,@13202 13202:O3|2,@1168,@13203 13203:O2|@13204,0 13204:O4|@20054,69,@13205,0 13205:O3|2,3,@13206 13206:O5|@571,@13207,@1165,@1142,@548 13207:O2|@594,@13208 13208:O2|@13210,@13209 13209:O2|@13215,@13214 13210:O2|@2352,@13211 13211:O3|0,@13212,@576 13212:O8|@13213,@870,0,0,@761,0,0,1 13213:O4|13,1,@679,1 13214:O2|@13222,0 13215:O2|@13217,@13216 13216:O3|0,@13218,@576 13217:O2|1,@1041 13218:O8|@13219,@870,0,0,@11837,0,2,1 13219:O3|10,@11840,@13220 13220:O3|14,@13221,1 13221:O2|@442,@11842 13222:O2|@1022,@13223 13223:O3|0,@13224,@576 13224:O8|@13225,@870,0,0,@11850,0,2,1 13225:O3|10,@13226,@11852 13226:O2|@7774,@13227 13227:O2|@7776,0 13228:O3|3,@13229,@395 13229:O2|@1764,@13230 13230:O2|@13231,0 13231:O2|50,@467 13232:O2|@1219,@13233 13233:O2|@13234,0 13234:O4|@20047,69,@13235,0 13235:O2|@1218,0 13236:O2|@13238,@13237 13237:O2|@13239,0 13238:S7|50546465664964 13239:O4|@20043,69,@13240,0 13240:O7|@13238,@671,@13241,@936,@390,0,0 13241:O2|1,@13242 13242:O3|14,@13243,0 13243:O2|@13245,@13244 13244:O2|@13249,@13248 13245:O2|7,@13246 13246:O8|@13247,@13238,0,0,@437,0,0,1 13247:O4|13,3,@679,13 13248:O2|@13251,0 13249:O2|7,@13250 13250:O8|@773,@13238,0,0,@437,0,0,1 13251:O2|7,@13252 13252:O8|@689,@13238,0,0,@437,0,0,1 13253:O2|@870,@13254 13254:O2|@13255,0 13255:O4|@20043,69,@13199,0 13256:O2|@13258,@13257 13257:O2|@13259,0 13258:S16|6164645072657474795072696e746572 13259:O4|@20043,69,@13260,0 13260:O7|@13258,2,@13262,@13261,@390,0,0 13261:O3|2,@13263,@923 13262:O2|3,1 13263:O3|2,@468,@13264 13264:O3|2,@13266,@13265 13265:O3|2,@13267,@891 13266:O3|6,@20235,79992 13267:O3|6,@20236,79992 13268:O2|@893,@13269 13269:O2|@13270,0 13270:O4|@20047,69,@13271,0 13271:O2|@892,@13272 13272:O2|@7719,@13273 13273:O2|@13275,@13274 13274:O2|@13300,@13299 13275:O7|@798,@738,@13277,@13276,@390,0,0 13276:O3|2,@13297,@891 13277:O2|1,@13278 13278:O3|2,@794,@13279 13279:O2|@13280,0 13280:O4|@20054,69,@13281,0 13281:O3|2,3,@13282 13282:O5|@571,@13283,@782,@752,@548 13283:O2|@594,@13284 13284:O2|@13286,@13285 13285:O2|@13291,@13290 13286:O2|@2352,@13287 13287:O3|0,@13288,@576 13288:O8|@13289,@798,0,0,@761,0,0,1 13289:O4|13,1,@679,4 13290:O2|@13294,0 13291:O2|@13217,@13292 13292:O3|0,@13293,@576 13293:O8|@13219,@798,0,0,@11837,0,2,1 13294:O2|@1022,@13295 13295:O3|0,@13296,@576 13296:O8|@13225,@798,0,0,@11850,0,2,1 13297:O3|3,@13298,@395 13298:O2|@7786,@7426 13299:O2|@736,@13317 13300:O7|@806,@13302,@13301,@891,@390,0,0 13301:O2|1,@13303 13302:O2|1,5 13303:O3|2,@802,@13304 13304:O2|@13305,0 13305:O4|@20054,69,@13306,0 13306:O3|2,2,@13307 13307:O5|@571,@13308,@782,@752,@548 13308:O2|@594,@13309 13309:O2|@13311,@13310 13310:O2|@13315,0 13311:O2|@1104,@13312 13312:O3|0,@13313,@576 13313:O8|@13314,@806,0,0,@761,0,0,1 13314:O4|13,2,@679,4 13315:O2|@13316,@573 13316:O3|0,@803,0 13317:O2|@13318,0 13318:O7|@810,@738,@13320,@13319,@390,0,0 13319:O3|2,@13349,@891 13320:O2|1,@13321 13321:O3|2,@785,@13322 13322:O2|@13323,0 13323:O4|@20054,69,@13324,0 13324:O3|2,3,@13325 13325:O5|@571,@13326,@782,@752,@548 13326:O2|@594,@13327 13327:O2|@13329,@13328 13328:O2|@13336,@13335 13329:O2|@13331,@13330 13330:O3|0,@13333,@576 13331:O2|1,@13332 13332:O2|2,14 13333:O8|@13334,@810,0,0,@761,0,0,1 13334:O4|13,4,@679,4 13335:O2|@13344,0 13336:O2|@13338,@13337 13337:O3|0,@13340,@576 13338:O2|1,@13339 13339:O2|2,15 13340:O8|@13341,@810,0,0,@11837,0,2,1 13341:O3|10,@11840,@13342 13342:O3|14,@13343,1 13343:O2|@1213,@11842 13344:O2|@13346,@13345 13345:O3|0,@13348,@576 13346:O2|1,@13347 13347:O2|2,16 13348:O8|@13225,@810,0,0,@11850,0,2,1 13349:O3|3,@13350,@395 13350:O2|@1764,@7426 13351:O2|@806,@13352 13352:O2|@13353,0 13353:O4|@20043,69,@13300,0 13354:O2|@721,@13355 13355:O2|@13356,0 13356:O4|@20047,69,@13357,0 13357:O2|@720,@13358 13358:O2|@13360,@13359 13359:O2|@13376,@13375 13360:O7|@13362,@671,@13363,@13361,@390,0,0 13361:O3|2,@13118,@690 13362:S12|5054627265616b506f696e74 13363:O2|1,@13364 13364:O3|14,@13365,0 13365:O2|@13367,@13366 13366:O2|@13371,@13370 13367:O2|7,@13368 13368:O8|@13369,@13362,0,0,@437,0,0,1 13369:O4|13,0,@679,13 13370:O2|@13373,0 13371:O2|7,@13372 13372:O8|@1158,@13362,0,0,@437,0,0,1 13373:O2|7,@13374 13374:O8|@689,@13362,0,0,@437,0,0,1 13375:O2|@13396,@13395 13376:O7|@13378,@671,@13379,@13377,@390,0,0 13377:O3|2,@13393,@690 13378:S13|5054636f6d706c6574696f6e73 13379:O2|1,@13380 13380:O3|14,@13381,0 13381:O2|@13383,@13382 13382:O2|@13387,@13386 13383:O2|7,@13384 13384:O8|@13385,@13378,0,0,@437,0,0,1 13385:O4|13,1,@679,13 13386:O2|@13391,0 13387:O2|7,@13388 13388:O8|@13389,@13378,0,0,@437,0,0,1 13389:O3|14,@13390,1 13390:O2|@442,@685 13391:O2|7,@13392 13392:O8|@689,@13378,0,0,@437,0,0,1 13393:O5|5,@13394,@995,@993,@390 13394:O2|@467,0 13395:O2|@13240,@13412 13396:O7|@13398,@671,@13397,@670,@390,0,0 13397:O2|1,@13399 13398:S12|50546465636c617265644174 13399:O3|14,@13400,0 13400:O2|@13402,@13401 13401:O2|@13406,@13405 13402:O2|7,@13403 13403:O8|@13404,@13398,0,0,@437,0,0,1 13404:O4|13,2,@679,13 13405:O2|@13410,0 13406:O2|7,@13407 13407:O8|@13408,@13398,0,0,@437,0,0,1 13408:O3|14,@13409,1 13409:O2|@2296,@685 13410:O2|7,@13411 13411:O8|@689,@13398,0,0,@437,0,0,1 13412:O2|@1199,@13413 13413:O2|@12490,@13414 13414:O2|@669,@13415 13415:O2|@13417,@13416 13416:O2|@13434,@13433 13417:O7|@13419,@671,@13418,@1200,@390,0,0 13418:O2|1,@13420 13419:S8|5054706172656e74 13420:O3|14,@13421,0 13421:O2|@13423,@13422 13422:O2|@13427,@13426 13423:O2|7,@13424 13424:O8|@13425,@13419,0,0,@437,0,0,1 13425:O4|13,7,@679,13 13426:O2|@13431,0 13427:O2|7,@13428 13428:O8|@13429,@13419,0,0,@437,0,0,1 13429:O3|14,@13430,1 13430:O2|@11112,@685 13431:O2|7,@13432 13432:O8|@689,@13419,0,0,@437,0,0,1 13433:O2|@13451,@13450 13434:O7|@13436,@671,@13435,@1200,@390,0,0 13435:O2|1,@13437 13436:S17|505470726576696f75735369626c696e67 13437:O3|14,@13438,0 13438:O2|@13440,@13439 13439:O2|@13444,@13443 13440:O2|7,@13441 13441:O8|@13442,@13436,0,0,@437,0,0,1 13442:O4|13,8,@679,13 13443:O2|@13448,0 13444:O2|7,@13445 13445:O8|@13446,@13436,0,0,@437,0,0,1 13446:O3|14,@13447,1 13447:O2|@536,@685 13448:O2|7,@13449 13449:O8|@689,@13436,0,0,@437,0,0,1 13450:O2|@956,@13470 13451:O7|@13453,@671,@13454,@13452,@390,0,0 13452:O3|2,@13469,@690 13453:S7|50547072696e74 13454:O2|1,@13455 13455:O3|14,@13456,0 13456:O2|@13458,@13457 13457:O2|@13462,@13461 13458:O2|7,@13459 13459:O8|@13460,@13453,0,0,@437,0,0,1 13460:O4|13,9,@679,13 13461:O2|@13467,0 13462:O2|7,@13463 13463:O8|@13464,@13453,0,0,@437,0,0,1 13464:O3|14,@13465,1 13465:O2|@13466,@685 13466:O3|2,9,0 13467:O2|7,@13468 13468:O8|@689,@13453,0,0,@437,0,0,1 13469:O3|2,@468,@891 13470:O2|@935,@13471 13471:O2|@1235,@13472 13472:O2|@13176,0 13473:O2|@13398,@13474 13474:O2|@13475,0 13475:O4|@20043,69,@13396,0 13476:O2|@13453,@13477 13477:O2|@13478,0 13478:O4|@20043,69,@13451,0 13479:O2|@798,@13480 13480:O2|@13481,0 13481:O4|@20043,69,@13275,0 13482:O2|@13362,@13483 13483:O2|@13484,0 13484:O4|@20043,69,@13360,0 13485:O2|@13487,@13486 13486:O2|@13488,0 13487:S8|436f646554726565 13488:O4|@20058,69,@13489,0 13489:O4|@13487,@661,@13490,@390 13490:O6|@13492,I48,0,@390,@13491,0 13491:O1|@13825 13492:O4|1,@20238,@20239,@20237 13493:O2|@13818,@13817 13494:O2|@13496,@13495 13495:O2|@13497,0 13496:S12|6d6b4d757475616c44656373 13497:O4|@20043,69,@13498,0 13498:O7|@13496,2,@13500,@13499,@390,0,0 13499:O3|2,@13506,@13505 13500:O2|1,@13501 13501:O3|2,@13502,0 13502:O1|@13503 13503:D4,104|483b65187303ff55484883f80175164889c148b8e07321c9a37f0000488b5d08909090ff13909090ff15520000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70007000000c390909000000000000000006000000000000000|@13504,127,@19723,@11013|20,0,@10953 13504:S26|434f44455452454528292e6d6b4d757475616c44656373283129 13505:O5|5,0,@13513,@13512,@390 13506:O5|5,@13507,@995,@993,@390 13507:O2|@13508,0 13508:O3|3,@13509,@395 13509:O2|@7786,@13510 13510:O2|@13511,0 13511:O2|50,@7372 13512:O3|@13513,@390,@13514 13513:S11|636f646542696e64696e67 13514:O3|@13516,@13519,@13515 13515:O3|@13520,@417,@416 13516:O2|1,@13517 13517:O3|2,@13518,0 13518:O4|0,@20241,3,1 13519:O4|1,@20242,0,0 13520:S27|506f6c794d4c2e436f6465547265652e636f646542696e64696e67 13521:O2|@13523,@13522 13522:O2|@13524,0 13523:S5|6d6b456e76 13524:O4|@20043,69,@13525,0 13525:O7|@13523,2,@13527,@13526,@390,0,0 13526:O3|2,@13532,@7372 13527:O2|1,@13528 13528:O3|2,@13529,0 13529:O1|@13530 13530:D3,80|488338017505488b4008c3488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c70015000000c390909090909000000000000000004800000000000000|@13531,7,@19724| 13531:S29|434f4445545245455f46554e4354494f4e5328292e6d6b456e76283129 13532:O3|3,@13533,@395 13533:O2|@13534,@13510 13534:O2|49,@13535 13535:O5|5,@13536,@995,@993,@390 13536:O2|@13505,0 13537:O2|@13539,@13538 13538:O2|@13540,0 13539:S10|6d6b46756e6374696f6e 13540:O4|@20043,69,@13541,0 13541:O7|@13539,2,@13543,@13542,@390,0,0 13542:O3|2,@13551,@7372 13543:O2|1,@13544 13544:O3|2,@13545,0 13545:O1|@13546 13546:D7,280|483b65187303ff5548ff7020ff30ff7018ff701048bb286b26c9a37f0000488b40089090ff1506010000488b0c24483b0d030100007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c64883c40858ff15b60000004889c74889f0ff15b2000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424084889513048c7412803000000488941204889791848c741100100000048895908584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c39000000000000000001001000000000000|@13550,1048575,@19726,@1354,I48,@11700,@11701|22,0,@13547 65,0,I48 107,0,@971 13547:O1|@13548 13548:D3,24|48c7c003000000c300000000000000001000000000000000|@13549,1,@19725| 13549:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283529283129 13550:S41|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65466e283129 13551:O3|3,@13552,@12957 13552:O2|@13554,@13553 13553:O2|@1741,@13555 13554:O2|49,@7372 13555:O2|@13557,@13556 13556:O2|@13559,@13558 13557:O2|51,@467 13558:O2|@13562,0 13559:O2|52,@13560 13560:O5|5,@13561,@995,@993,@390 13561:O2|@7372,0 13562:O2|53,@468 13563:O2|@13565,@13564 13564:O2|@13566,0 13565:S7|6d6b5768696c65 13566:O4|@20043,69,@13567,0 13567:O7|@13565,2,@13569,@13568,@390,0,0 13568:O3|2,@13574,@7372 13569:O2|1,@13570 13570:O3|2,@13571,0 13571:O1|@13572 13572:D5,304|483b65187303ff5548498d4fd0483b4d107303ff55404989cf48c741f802000000488b50084889510848c70105000000488d591848c743f80200000048c743080100000048890b488b3048c7c001000000909090ff15ee000000498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848c701130000004883fb01742a4889c8498d4fe0483b4d107303ff55404989cf48c741f803000000488941104889590848c70115000000498d47d8483b45107303ff55404989c748c740f80400000048ba80d606c9a37f000048895018488948104889700848c700030000004989c048c7c001000000ff155e0000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104c89400848c70001000000c390909000000000000000002801000000000000|@13573,127,@19727,@12077,@12041|199,0,@509 13573:S21|434f44455452454528292e6d6b5768696c65283129 13574:O3|3,@13575,@395 13575:O2|@13554,@13510 13576:O2|@13578,@13577 13577:O2|@13579,0 13578:S11|6d6b426567696e4c6f6f70 13579:O4|@20043,69,@13580,0 13580:O7|@13578,2,@13582,@13581,@390,0,0 13581:O3|2,@13588,@7372 13582:O2|1,@13583 13583:O3|2,@13584,0 13584:O1|@13585 13585:D4,88|483b65187303ff55484c8b00488b4008ff155a0000004889c1498d47e0483b45107303ff55404989c748c740f803000000488948104c89400848c70001000000c39090909090909000000000000000005000000000000000|@13587,127,@19728,@13586| 13586:D3,168|483b65187303ff5548a8017572488b08498d57c8483b55107303ff55404989d748c742f803000000488b590848895a10488b314889720848c70201000000488d7a2048c747f80200000048c747080300000048891757488b50084889d0e89effffff4889c1498d47e8483b45107303ff55404989c748c740f802000000eb05e9090000004889480859488908c348c7c001000000c39090900000000000000000a000000000000000|@1363,63,@19729| 13587:S25|434f44455452454528292e6d6b426567696e4c6f6f70283129 13588:O3|3,@13589,@395 13589:O2|@13554,@13590 13590:O2|@13591,0 13591:O2|50,@13506 13592:O2|@7374,@13593 13593:O2|@13594,0 13594:O4|@20047,69,@13595,0 13595:O2|@7373,0 13596:O2|@13598,@13597 13597:O2|@13599,0 13598:S10|6d6b436f6e7374616e74 13599:O4|@20043,69,@13600,0 13600:O7|@13598,2,@13602,@13601,@390,0,0 13601:O3|2,@13607,@7372 13602:O2|1,@13603 13603:O3|2,@13604,0 13604:O1|@13605 13605:D3,64|4889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c39000000000000000003800000000000000|@13606,3,@19730| 13606:S21|434f44455452454528292e6d6b436f6e7374283129 13607:O5|5,0,@12634,@13608,@390 13608:O3|@12634,@390,@13609 13609:O3|@13611,@13614,@13610 13610:O3|@13615,@417,@416 13611:O2|1,@13612 13612:O3|2,@13613,0 13613:O4|0,@20243,3,1 13614:O4|1,@20244,0,0 13615:S27|506f6c794d4c2e436f6465547265652e6d616368696e65576f7264 13616:O2|@13618,@13617 13617:O2|@13619,0 13618:S14|6d6b4c6f6164417267756d656e74 13619:O4|@20043,69,@13620,0 13620:O7|@13618,2,@13622,@13621,@390,0,0 13621:O3|2,@468,@7372 13622:O2|1,@13623 13623:O3|2,@11152,0 13624:O2|@13626,@13625 13625:O2|@13627,0 13626:S11|72747346756e6374696f6e 13627:O4|@20043,69,@13628,0 13628:O7|@13626,2,@13629,@13621,@390,0,0 13629:O2|1,@13630 13630:O3|2,@13631,0 13631:O1|@13632 13632:D3,88|483b65187303ff554848ba90bddc000000000090ff124889c1498d47e0483b45107303ff55404989c748c740f80300000048c74010010000004889480848c70005000000c390909000000000000000005000000000000000|@13633,2097151,@19731|11,0,I189 13633:S25|434f44455452454528292e72747346756e6374696f6e283129 13634:O2|@893,@13635 13635:O2|@13636,0 13636:O4|@20043,69,@13637,0 13637:O7|@893,2,@13639,@13638,@390,0,0 13638:O3|2,@7372,@891 13639:O2|1,@13640 13640:O3|2,@2697,0 13641:O2|@13643,@13642 13642:O2|@13644,0 13643:S5|6d6b446563 13644:O4|@20043,69,@13645,0 13645:O7|@13643,2,@13647,@13646,@390,0,0 13646:O3|2,@13508,@13505 13647:O2|1,@13648 13648:O3|2,@13649,0 13649:O1|@13650 13650:D3,72|488b4808488b10498d47d8483b45107303ff55404989c748c740f804000000488948184889501048c740080100000048c70003000000c39000000000000000004000000000000000|@13651,7,@19732| 13651:S19|434f44455452454528292e6d6b446563283129 13652:O2|@13654,@13653 13653:O2|@13655,0 13654:S16|6d6b496e6c696e6546756e6374696f6e 13655:O4|@20043,69,@13656,0 13656:O7|@13654,2,@13657,@13542,@390,0,0 13657:O2|1,@13658 13658:O3|2,@13659,0 13659:O1|@13660 13660:D7,280|483b65187303ff5548ff7020ff30ff7018ff701048bb507e26c9a37f0000488b40089090ff1506010000488b0c24483b0d030100007432f6c10175394889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750c48b9303707c9a37f0000eb04488b0c244889cb4889c64883c40858ff15b60000004889c74889f0ff15b2000000498d4fb8483b4d107303ff55404989cf48c741f80800000048c7413803000000488b5424084889513048c7412801000000488941204889791848c741100100000048895908584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848c7000f000000c39000000000000000001001000000000000|@13664,1048575,@19734,@1354,I48,@11700,@11701|22,0,@13661 65,0,I48 107,0,@971 13661:O1|@13662 13662:D3,24|48c7c003000000c300000000000000001000000000000000|@13663,1,@19733| 13663:S50|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283529283129 13664:S47|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c65496e6c696e65466e283129 13665:O2|@13667,@13666 13666:O2|@13668,0 13667:S4|6d6b4966 13668:O4|@20043,69,@13669,0 13669:O7|@13667,2,@13671,@13670,@390,0,0 13670:O3|2,@13676,@7372 13671:O2|1,@13672 13672:O3|2,@13673,0 13673:O1|@13674 13674:D3,72|488b4810488b5008488b18498d47d8483b45107303ff55404989c748c740f80400000048894818488950104889580848c70003000000c39000000000000000004000000000000000|@13675,15,@19735| 13675:S4|436f6e64 13676:O3|3,@13677,@1726 13677:O2|@13554,@13678 13678:O2|@13511,@13679 13679:O2|@13680,0 13680:O2|51,@7372 13681:O2|@13683,@13682 13682:O2|@13684,0 13683:S7|67656e436f6465 13684:O4|@20043,69,@13685,0 13685:O7|@13683,2,@13687,@13686,@390,0,0 13686:O3|2,@13693,@13692 13687:O2|1,@13688 13688:O3|2,@13689,0 13689:O2|@13690,@2633 13690:D3,48|483b65187303ff55484c8b4010488b5808488b084889c8488b5208ff2290909000000000000000002800000000000000|@13691,1048575,@19736| 13691:S21|434f44455452454528292e67656e436f6465283129 13692:O3|2,@923,@7372 13693:O3|3,@13694,@1726 13694:O2|@13554,@13695 13695:O2|@13697,@13696 13696:O2|@13698,0 13697:O2|50,@12440 13698:O2|51,@468 13699:O2|@13701,@13700 13700:O2|@13702,0 13701:S5|4c64657863 13702:O4|@20043,69,@13703,0 13703:O7|@13701,2,@13704,@7372,@390,0,0 13704:O2|1,@13705 13705:O3|2,@3172,0 13706:O2|@13708,@13707 13707:O2|@13709,0 13708:S5|6d6b496e64 13709:O4|@20043,69,@13710,0 13710:O7|@13708,2,@13712,@13711,@390,0,0 13711:O3|2,@13508,@7372 13712:O2|1,@13713 13713:O3|2,@13714,0 13714:O1|@13715 13715:D4,112|483b65187303ff5548488b480848833905751349c7c001000000488b184889c8ff2562000000488b10498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488950104889480848c7000d000000c39090909090909000000000000000006800000000000000|@13716,1048575,@19737,@2178| 13716:S37|434f4445545245455f46554e4354494f4e5328292e6d6b496e646972656374283129283129 13717:O2|@12634,@13718 13718:O2|@13719,0 13719:O4|@20047,69,@13720,0 13720:O2|@13608,0 13721:O2|@13723,@13722 13722:O2|@13724,0 13723:S6|6576616c7565 13724:O4|@20043,69,@13725,0 13725:O7|@13723,2,@13727,@13726,@390,0,0 13726:O3|2,@7372,@13732 13727:O2|1,@13728 13728:O3|2,@13729,0 13729:O1|@13730 13730:D3,64|488338057520488b4808498d47f0483b45107303ff55404989c748c740f801000000488908c348c7c001000000c3909000000000000000003800000000000000|@13731,3,@19738| 13731:S30|434f4445545245455f46554e4354494f4e5328292e6576616c7565283129 13732:O5|5,@13733,@1887,@1744,@390 13733:O2|@13607,0 13734:O2|@13736,@13735 13735:O2|@13737,0 13736:S9|6d6b4e756c6c446563 13737:O4|@20043,69,@13738,0 13738:O7|@13736,2,@13740,@13739,@390,0,0 13739:O3|2,@7372,@13505 13740:O2|1,@13741 13741:O3|2,@13742,0 13742:O1|@13743 13743:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70005000000c39000000000000000003000000000000000|@13744,3,@19739| 13744:S11|4e756c6c42696e64696e67 13745:O2|@13747,@13746 13746:O2|@13748,0 13747:S6|6d6b4c6f6f70 13748:O4|@20043,69,@13749,0 13749:O7|@13747,2,@13751,@13750,@390,0,0 13750:O3|2,@13560,@7372 13751:O2|1,@13752 13752:O3|2,@13753,0 13753:O1|@13754 13754:D4,80|483b65187303ff5548909090ff15560000004889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70013000000c39090909090909000000000000000004800000000000000|@13756,7,@19740,@13755| 13755:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19741| 13756:S20|434f44455452454528292e6d6b4c6f6f70283129 13757:O2|@13759,@13758 13758:O2|@13760,0 13759:S13|6d6b4c6f6164436c6f73757265 13760:O4|@20043,69,@13761,0 13761:O7|@13759,2,@13762,@13621,@390,0,0 13762:O2|1,@13763 13763:O3|2,@13764,0 13764:O1|@13765 13765:D3,112|a80174084883f8017c08eb19f640ff1074134889c148b8f0a115c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f8020000004889480848c70009000000c300000000000000006800000000000000|@7261,3,@19742|23,0,@6844 13766:O2|@13513,@13767 13767:O2|@13768,0 13768:O4|@20047,69,@13769,0 13769:O2|@13512,0 13770:O2|@13772,@13771 13771:O2|@13773,0 13772:S8|6d6b48616e646c65 13773:O4|@20043,69,@13774,0 13774:O7|@13772,2,@13775,@13568,@390,0,0 13775:O2|1,@13776 13776:O3|2,@13777,0 13777:O1|@13778 13778:D3,64|488b4808488b10498d47e0483b45107303ff55404989c748c740f803000000488948104889500848c7000b000000c39000000000000000003800000000000000|@13779,7,@19743| 13779:S22|434f44455452454528292e6d6b48616e646c65283129 13780:O2|@13782,@13781 13781:O2|@13783,0 13782:S6|6d6b43616c6c 13783:O4|@20043,69,@13784,0 13784:O7|@13782,2,@13786,@13785,@390,0,0 13785:O3|2,@13792,@7372 13786:O2|1,@13787 13787:O3|2,@13788,0 13788:O1|@13789 13789:D4,96|483b65187303ff5548488b18488b4008ff15620000004889c1498d47d8483b45107303ff55404989c748c740f80400000048c7401803000000488958104889480848c70007000000c39090909090909000000000000000005800000000000000|@13791,15,@19744,@13790| 13790:D3,128|483b65187303ff5548a8017559498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410803000000488b1048891151488b50084889d09090e8beffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c348c7c001000000c3909000000000000000007800000000000000|@1363,7,@19745| 13791:S43|494e495449414c4953455f28292e696e6974476c6f62616c456e7628312973696d706c6543616c6c283129 13792:O3|3,@13793,@395 13793:O2|@13554,@13794 13794:O2|@13795,0 13795:O2|50,@13560 13796:O2|@13798,@13797 13797:O2|@13799,0 13798:S7|6d6b5261697365 13799:O4|@20043,69,@13800,0 13800:O7|@13798,2,@13802,@13801,@390,0,0 13801:O3|2,@7372,@7372 13802:O2|1,@13803 13803:O3|2,@13804,0 13804:O1|@13805 13805:D3,56|4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480848c70017000000c39000000000000000003000000000000000|@13806,3,@19746| 13806:S5|5261697365 13807:O2|@13809,@13808 13808:O2|@13810,0 13809:S7|6d6b5475706c65 13810:O4|@20043,69,@13811,0 13811:O7|@13809,2,@13812,@13750,@390,0,0 13812:O2|1,@13813 13813:O3|2,@13814,0 13814:O1|@13815 13815:D4,136|483b65187303ff5548498d4fe0483b4d107303ff55404989cf48c741f80300000048c74110010000004889410848c7011d000000a8017524488b1048833a057512488b50084889d0483b65187303ff5548ebe148c7c001000000eb0748c7c0030000004883f80174094889c8ff252e0000004889c8c3909000000000000000008000000000000000|@13816,1048575,@19747,@2211| 13816:S35|434f4445545245455f46554e4354494f4e5328292e6d6b5265636f7264283129283129 13817:O2|@13819,0 13818:S11|6d6b4c6f61644c6f63616c 13819:O4|@20043,69,@13820,0 13820:O7|@13818,2,@13821,@13621,@390,0,0 13821:O2|1,@13822 13822:O3|2,@13823,0 13823:O1|@13824 13824:D3,112|a80174084883f8017c08eb19f640ff1074134889c148b8f0a115c9a37f0000488b5d08ff13498d4fd0483b4d107303ff55404989cf48c741f8020000004889410848c70105000000488d411848c740f8020000004889480848c70009000000c300000000000000006800000000000000|@7261,3,@19748|23,0,@6844 13825:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@19749|2,0,@2058 13826:O2|@1275,@13827 13827:O2|@13828,0 13828:O4|@20043,69,@13829,0 13829:O7|@1275,2,@13831,@13830,@390,0,0 13830:O3|2,@13832,@13832 13831:O2|3,7 13832:O3|6,@20245,79993 13833:O2|@810,@13834 13834:O2|@13835,0 13835:O4|@20043,69,@13318,0 13836:O2|@13419,@13837 13837:O2|@13838,0 13838:O4|@20043,69,@13417,0 13839:O2|@693,@13840 13840:O2|@13841,0 13841:O4|@20047,69,@13842,0 13842:O2|@692,0 13843:O2|@13378,@13844 13844:O2|@13845,0 13845:O4|@20043,69,@13376,0 13846:O2|@13847,0 13847:O4|@20043,69,@13434,0 13848:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@19750|2,0,@2058 13849:O2|@13851,@13850 13850:O2|@13852,0 13851:S3|6d6f64 13852:O4|@20043,69,@13853,0 13853:O7|@13851,2,@391,@13854,@390,0,0 13854:O3|2,@394,@399 13855:O2|@995,@13856 13856:O2|@13857,0 13857:O4|@20047,69,@13858,0 13858:O2|@993,@13859 13859:O2|@11819,@13860 13860:O2|@11866,0 13861:O2|@13863,@13862 13862:O2|@13864,0 13863:S5|6172726179 13864:O4|@20047,69,@13865,0 13865:O2|@13866,0 13866:O3|@13863,@390,@13867 13867:O3|@13869,@13888,@13868 13868:O3|@13889,@417,@416 13869:O2|1,@13870 13870:O3|2,@13872,@13871 13871:O2|@13879,0 13872:O4|@13874,@20246,@13876,@13873 13873:O1|@13878 13874:O1|@13875 13875:D3,32|48b810cddc0000000000c3909090909000000000000000001800000000000000|@13129,1,@19751|2,0,I251 13876:O1|@13877 13877:D3,24|48c7c005000000c300000000000000001000000000000000|@13138,1,@19752| 13878:D3,24|48c7c003000000c300000000000000001000000000000000|@13140,1,@19753| 13879:O4|@20054,69,@13880,0 13880:O3|2,4,@13881 13881:O5|@590,@13883,@13161,@13882,@548 13882:O4|@13872,@13874,@13876,@13873 13883:O2|@594,@13884 13884:O2|@13148,@13885 13885:O2|@13886,@13151 13886:O2|@13887,@573 13887:O3|0,@20246,0 13888:O4|1,@20096,1,0 13889:S11|41727261792e6172726179 13890:O2|@1887,@13891 13891:O2|@13892,0 13892:O4|@20047,69,@13893,0 13893:O2|@1744,@13894 13894:O2|@11479,@13895 13895:O2|@11454,0 13896:O2|@1963,@13897 13897:O2|@13898,0 13898:O4|@20043,69,@11479,0 13899:O2|42,@13900 13900:O2|@13901,0 13901:O4|@20043,69,@13902,0 13902:O7|42,2,@391,@13854,@390,0,0 13903:O2|@1607,@13904 13904:O2|@13905,0 13905:O4|@20047,69,@13906,0 13906:O2|@1605,0 13907:O2|43,@13908 13908:O2|@13909,0 13909:O4|@20043,69,@13910,0 13910:O7|43,2,@391,@13854,@390,0,0 13911:O2|126,@13912 13912:O2|@13913,0 13913:O4|@20043,69,@13914,0 13914:O7|126,2,@391,@642,@390,0,0 13915:O2|45,@13916 13916:O2|@13917,0 13917:O4|@20043,69,@13918,0 13918:O7|45,2,@391,@13854,@390,0,0 13919:O2|@13921,@13920 13920:O2|@13922,0 13921:S9|426f6f747374726170 13922:O4|@20058,69,@13923,0 13923:O4|@13921,@661,@13924,@390 13924:O6|@13926,I48,0,@390,@13925,0 13925:O1|@14963 13926:O4|1,@20248,@20249,@20247 13927:O2|@14951,@14950 13928:O2|@13930,@13929 13929:O2|@13931,0 13930:S24|7265706f7274556e7265666572656e636564496473546167 13931:O4|@20043,69,@13932,0 13932:O7|@13930,2,@13934,@13933,@390,0,0 13933:O5|5,@8306,@13945,@13944,@390 13934:O2|1,@13935 13935:O3|2,@13936,0 13936:O3|@13938,@13941,@13937 13937:O2|@13943,@20136 13938:O2|@13939,@20136 13939:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19754| 13940:S19|556e6976657273616c2e746167283129283129 13941:O2|@13942,@20136 13942:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19755| 13943:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19756|14,0,@1486 13944:O3|@13945,@390,@13946 13945:S3|746167 13946:O3|@13948,@13981,@13947 13947:O3|@13945,@417,@416 13948:O2|1,@13949 13949:O3|2,@13951,@13950 13950:O2|@13964,0 13951:O4|0,@20251,@13959,@13952 13952:O1|@13962 13953:O1|@13954 13954:D3,32|48b808aa26c9a37f0000c3909090909000000000000000001800000000000000|@13958,1,@19758|2,0,@13955 13955:O1|@13956 13956:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@13957,1,@19757|2,0,@413 13957:S51|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129283129 13958:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129706f6c79547970655072696e746572283129 13959:O1|@13960 13960:D3,24|48c7c007000000c300000000000000001000000000000000|@13961,1,@19759| 13961:S9|626f7865642d746167 13962:D3,24|48c7c003000000c300000000000000001000000000000000|@13963,1,@19760| 13963:S8|73697a652d746167 13964:O4|@20054,69,@13965,0 13965:O3|2,4,@13966 13966:O5|@590,@13968,@1163,@13967,@548 13967:O3|@13951,@13959,@13952 13968:O2|@594,@13969 13969:O2|@11493,@13970 13970:O2|@13972,@13971 13971:O2|@13975,@13974 13972:O2|@13973,@573 13973:O3|0,@20251,0 13974:O2|@13978,0 13975:O2|@1148,@13976 13976:O3|0,@13977,@576 13977:O8|@775,@13961,0,0,@437,0,0,1 13978:O2|@1155,@13979 13979:O3|0,@13980,@576 13980:O8|@442,@13963,0,0,@437,0,0,1 13981:O4|1,@20252,1,0 13982:O2|@13984,@13983 13983:O2|@13985,0 13984:S11|726f6f7454726565546167 13985:O4|@20043,69,@13986,0 13986:O7|@13984,2,@13988,@13987,@390,0,0 13987:O5|5,@13997,@13945,@13944,@390 13988:O2|1,@13989 13989:O3|2,@13990,0 13990:O3|@13992,@13994,@13991 13991:O2|@13996,@20192 13992:O2|@13993,@20192 13993:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19761| 13994:O2|@13995,@20192 13995:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19762| 13996:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19763|14,0,@1486 13997:O2|@13998,0 13998:O3|3,@14000,@13999 13999:O3|0,@14011,1 14000:O2|@14002,@14001 14001:O2|@14007,@14006 14002:O2|@14004,@14003 14003:O5|5,@14005,@1887,@1744,@390 14004:S4|6e657874 14005:O2|@1216,0 14006:O2|@14009,0 14007:O2|@14008,@14003 14008:S6|706172656e74 14009:O2|@14010,@14003 14010:S8|70726576696f7573 14011:O2|@14004,@14012 14012:O2|@14008,@14013 14013:O2|@14010,0 14014:O2|@14016,@14015 14015:O2|@14017,0 14016:S17|636f6d70696c65724f7574707574546167 14017:O4|@20043,69,@14018,0 14018:O7|@14016,2,@14020,@14019,@390,0,0 14019:O5|5,@14029,@13945,@13944,@390 14020:O2|1,@14021 14021:O3|2,@14022,0 14022:O3|@14024,@14026,@14023 14023:O2|@14028,@20141 14024:O2|@14025,@20141 14025:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19764| 14026:O2|@14027,@20141 14027:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19765| 14028:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19766|14,0,@1486 14029:O2|@14030,0 14030:O3|2,@891,@923 14031:O2|@14033,@14032 14032:O2|@14034,0 14033:S17|62696e64696e67436f756e746572546167 14034:O4|@20043,69,@14035,0 14035:O7|@14033,2,@14037,@14036,@390,0,0 14036:O5|5,@14046,@13945,@13944,@390 14037:O2|1,@14038 14038:O3|2,@14039,0 14039:O3|@14041,@14043,@14040 14040:O2|@14045,@20121 14041:O2|@14042,@20121 14042:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19767| 14043:O2|@14044,@20121 14044:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19768| 14045:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19769|14,0,@1486 14046:O2|@14047,0 14047:O3|2,@923,@468 14048:O2|@14050,@14049 14049:O2|@14051,0 14050:S15|617373656d626c79436f6465546167 14051:O4|@20043,69,@14052,0 14052:O7|@14050,2,@14053,@13933,@390,0,0 14053:O2|1,@14054 14054:O3|2,@14055,0 14055:O3|@14057,@14059,@14056 14056:O2|@14061,@20129 14057:O2|@14058,@20129 14058:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19770| 14059:O2|@14060,@20129 14060:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19771| 14061:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19772|14,0,@1486 14062:O2|@14064,@14063 14063:O2|@14065,0 14064:S17|696e6c696e6546756e63746f7273546167 14065:O4|@20043,69,@14066,0 14066:O7|@14064,2,@14067,@13933,@390,0,0 14067:O2|1,@14068 14068:O3|2,@14069,0 14069:O3|@14071,@14073,@14070 14070:O2|@14075,@20122 14071:O2|@14072,@20122 14072:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19773| 14073:O2|@14074,@20122 14074:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19774| 14075:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19775|14,0,@1486 14076:O2|@14078,@14077 14077:O2|@14079,0 14078:S27|6e6172726f774f7665726c6f6164466c65785265636f7264546167 14079:O4|@20043,69,@14080,0 14080:O7|@14078,2,@14081,@13933,@390,0,0 14081:O2|1,@14082 14082:O3|2,@14083,0 14083:O3|@14085,@14087,@14084 14084:O2|@14089,@20138 14085:O2|@14086,@20138 14086:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19776| 14087:O2|@14088,@20138 14088:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19777| 14089:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19778|14,0,@1486 14090:O2|@14092,@14091 14091:O2|@14093,0 14092:S19|6572726f724d65737361676550726f63546167 14093:O4|@20043,69,@14094,0 14094:O7|@14092,2,@14096,@14095,@390,0,0 14095:O5|5,@14105,@13945,@13944,@390 14096:O2|1,@14097 14097:O3|2,@14098,0 14098:O3|@14100,@14102,@14099 14099:O2|@14104,@20165 14100:O2|@14101,@20165 14101:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19779| 14102:O2|@14103,@20165 14103:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19780| 14104:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19781|14,0,@1486 14105:O2|@14106,0 14106:O3|2,@14107,@923 14107:O3|3,@14109,@14108 14108:O3|0,@14120,1 14109:O2|@14111,@14110 14110:O2|@14114,@14113 14111:O2|@14112,@393 14112:S4|68617264 14113:O2|@14117,@14116 14114:O2|@1179,@14115 14115:O5|5,@7795,@1887,@1744,@390 14116:O2|@14119,0 14117:O2|@14118,@891 14118:S7|6d657373616765 14119:O2|@693,@691 14120:O2|@14112,@14121 14121:O2|@1179,@14122 14122:O2|@14118,@14123 14123:O2|@693,0 14124:O2|@14126,@14125 14125:O2|@14127,0 14126:S10|62797465566563746f72 14127:O4|@20047,69,@14128,0 14128:O2|@14129,0 14129:O3|@14126,@390,@14130 14130:O3|@14132,@14181,@14131 14131:O3|@14126,@417,@416 14132:O2|1,@14133 14133:O3|2,@14135,@14134 14134:O2|@14142,0 14135:O4|@14136,@20253,2,1 14136:O1|@14137 14137:D3,128|48b9ffffffffffffff00482348f8488d4c090148baffffffffffffff00482353f8488d541201483bca7537488d0ccdf9ffffff4889c64889df48d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740848c7c001000000c348c7c003000000c348c7c001000000c390909090909000000000000000007800000000000000|@14138,63,@19782|2,0,36028797018963967 21,0,36028797018963967 14138:S13|62797465566563746f722d6571 14139:O1|@14140 14140:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@14141,1,@19783|2,0,@413 14141:S48|494e495449414c4953455f28292e696e6974476c6f62616c456e762831296d6f6e6f547970655072696e746572283129 14142:O4|@20054,69,@14143,0 14143:O3|2,4,@14144 14144:O5|@590,@14146,@803,@14145,@548 14145:O2|@14135,@14136 14146:O2|@594,@14147 14147:O2|@14149,@14148 14148:O2|@14179,@2349 14149:O2|@1148,@14150 14150:O3|0,@14151,@576 14151:O8|@14153,@14138,0,0,@14152,0,3,1 14152:O2|@11857,@11850 14153:O3|10,@14155,@14154 14154:O4|1,@14163,@14162,@509 14155:O2|@14157,@14156 14156:O2|@14160,0 14157:O4|1,@543,0,@14158 14158:O4|3,@518,@14159,1 14159:O3|2,I15,0 14160:O4|1,@545,1,@14161 14161:O4|3,@504,@14159,1 14162:O3|10,@14168,@14167 14163:O4|3,@14164,@502,1 14164:O2|@6995,@14165 14165:O2|@14166,0 14166:O2|@7755,1 14167:O4|3,@14173,@523,1 14168:O2|@14169,0 14169:O4|1,@545,2,@14170 14170:O4|3,@14172,@14171,1 14171:O3|2,I238,0 14172:O2|@535,@6994 14173:O2|@505,@14174 14174:O2|@527,@14175 14175:O2|@506,@14176 14176:O2|@527,@14177 14177:O2|@14178,0 14178:O2|@7757,1 14179:O2|@14180,@573 14180:O3|0,@20253,0 14181:O4|1,@20254,0,0 14182:O2|@14184,@14183 14183:O2|@14185,0 14184:S19|6c6f776c6576656c4f7074696d697365546167 14185:O4|@20043,69,@14186,0 14186:O7|@14184,2,@14187,@13933,@390,0,0 14187:O2|1,@14188 14188:O3|2,@14189,0 14189:O3|@14191,@14193,@14190 14190:O2|@14195,@20128 14191:O2|@14192,@20128 14192:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19784| 14193:O2|@14194,@20128 14194:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19785| 14195:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19786|14,0,@1486 14196:O2|@14198,@14197 14197:O2|@14199,0 14198:S11|636f646574726565546167 14199:O4|@20043,69,@14200,0 14200:O7|@14198,2,@14201,@13933,@390,0,0 14201:O2|1,@14202 14202:O3|2,@14203,0 14203:O3|@14205,@14207,@14204 14204:O2|@14209,@20126 14205:O2|@14206,@20126 14206:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19787| 14207:O2|@14208,@20126 14208:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19788| 14209:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19789|14,0,@1486 14210:O2|@14212,@14211 14211:O2|@14213,0 14212:S23|6372656174655072696e7446756e6374696f6e73546167 14213:O4|@20043,69,@14214,0 14214:O7|@14212,2,@14215,@13933,@390,0,0 14215:O2|1,@14216 14216:O3|2,@14217,0 14217:O3|@14219,@14221,@14218 14218:O2|@14223,@20139 14219:O2|@14220,@20139 14220:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19790| 14221:O2|@14222,@20139 14222:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19791| 14223:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19792|14,0,@1486 14224:O2|@14226,@14225 14225:O2|@14227,0 14226:S19|636f64657472656541667465724f7074546167 14227:O4|@20043,69,@14228,0 14228:O7|@14226,2,@14229,@13933,@390,0,0 14229:O2|1,@14230 14230:O3|2,@14231,0 14231:O3|@14233,@14235,@14232 14232:O2|@14237,@20130 14233:O2|@14234,@20130 14234:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19793| 14235:O2|@14236,@20130 14236:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19794| 14237:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19795|14,0,@1486 14238:O2|@14240,@14239 14239:O2|@14241,0 14240:S16|7472616365436f6d70696c6572546167 14241:O4|@20043,69,@14242,0 14242:O7|@14240,2,@14243,@13933,@390,0,0 14243:O2|1,@14244 14244:O3|2,@14245,0 14245:O3|@14247,@14249,@14246 14246:O2|@14251,@20134 14247:O2|@14248,@20134 14248:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19796| 14249:O2|@14250,@20134 14250:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19797| 14251:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19798|14,0,@1486 14252:O2|@14254,@14253 14253:O2|@14255,0 14254:S14|70737461636b5472616365546167 14255:O4|@20043,69,@14256,0 14256:O7|@14254,2,@14257,@13933,@390,0,0 14257:O2|1,@14258 14258:O3|2,@14259,0 14259:O3|@14261,@14263,@14260 14260:O2|@14265,@20127 14261:O2|@14262,@20127 14262:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19799| 14263:O2|@14264,@20127 14264:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19800| 14265:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19801|14,0,@1486 14266:O2|@14268,@14267 14267:O2|@14269,0 14268:S11|676c6f62616c5370616365 14269:O4|@20043,69,@14270,0 14270:O7|@14268,2,@14271,@1746,@390,0,0 14271:O2|1,@14272 14272:O3|2,@14273,0 14273:O18|@14275,@14290,@14295,@14300,@14305,@14310,@14316,@14320,@14324,@14329,@14333,@14338,@14341,@14344,@14348,@14351,@14355,@14274 14274:O2|@14358,@371 14275:O2|@14276,@371 14276:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19802,@14285,@14277| 14277:D6,1912|483b65187303ff5548488b4d7848baffffffffffffff00482351f8488d5412014883fa097606488b5120eb0748c7c2010000004883fa01750948c7c201000000eb1e4889d6498d57f0483b55107303ff55404989d748c742f801000000488932498d77e8483b75107303ff55404989f748c746f8020000004889560848c70605000000488b49084889cf4883e7034883ff03740948c7c701000000eb0748c7c7030000004d8d47e84c3b45107303ff55404d89c749c740f8020000004989780849c700010000004883e10d4883f901750948c7c105000000eb294883f905750948c7c107000000eb1a4883f909740948c7c101000000eb0748c7c1030000004883f102498d7fa0483b7d107303ff55404989ff48c747f80200000048894f0848c70703000000488d4f1848c741f80200000048c7410801000000488939488d791848c747f80200000048894f084c8907488d4f1848c741f80200000048897908488931488b7578488b7e084989d14989ca4989db4989c44989f54989fe49c7c00100000048c7c30100000048b878e526c9a37f0000909090ff15f205000048b9ffffffffffffff0049234df8488d4c09014883f9097606498b4d20eb0748c7c10100000048ba78e526c9a37f0000f6c201755a488b1a48833b057542f64308017533488b7308488b3e40f6c70174084883ff017e08eb43f647ff10743d4c8b00ff700848b890e526c9a37f0000488b5d089090ff1348c7c701000000eb1c488b5a084889da483b6518730aeb05e905000000ff5548eb974889cf488b4d7848c7c2ffffffff483350084883c2014923d6480b104889510848b9ffffffffffffff0049234df8488d4c09014883f909770948c7c101000000eb074d8b6d204c89e940f6c7017508f6c1017503ff5570483bf974254151415241534154ff304889fb48c7c01f00000048ba90a0dc0000000000909090ff12eb0a4151415241534154ff30488b04244883e0094883f8097535488b4578488b40184883f801741e48c7c30100000048c7c01700000048ba90a0dc00000000009090ff12eb1048c7c001000000eb0748c7c00100000048c7c001000000488b4c2410488b094883f903750948c7c001000000eb2c4881f8419c0000750948c7c001000000eb1aa80174064883c0027105ff5570ebf5483b65187303ff5548ebbd488b4c24104833c04883c0fef0480fc1014883c0fe4883f80174274889cb48c7c00300000048ba90a0dc0000000000909090ff12483b65187303ff5548e974ffffff48c7c001000000ff750848b88ee126c9a37f0000504889650848c7c001000000488b542418909090ff124883c4085948894d08eb5b90488b65084883c4085b48895d08488b5424104833c94883c102f0480fc10a4883c1024883f90374374889c14889d048ba909fdc00000000009090ff1251488b5c241848c7c00500000048ba90a0dc0000000000909090ff12eb06e99801000050488b4578488b48084989c14989ca49c7c00100000048c7c301000000488b44242090ff154203000048b9ffffffffffffff00492349f8488d4c09014883f9097606498b4920eb0748c7c101000000f6442420017543f6442428017533488b4c2428488b11f6c20174084883fa017e08eb2af642ff107424488b18488b700848b890e526c9a37f0000488b5d0890ff1348c7c201000000eb034889ca488b4d7848c7c3ffffffff483358084883c3014923da480b184889590848b9ffffffffffffff00492349f8488d4c09014883f909770948c7c101000000eb074d8b49204c89c9f6c2017508f6c1017503ff5570483bd1741bff304889d348c7c01f00000048ba90a0dc000000000090ff12eb02ff30488b04244883e0094883f809752a488b4578488b40184883f801741c48c7c30100000048c7c01700000048ba90a0dc00000000009090ff12488b442408498d4fd8483b4d107303ff55404989cf48c741f80400000048ba20e626c9a37f000048895118488b501048895110488b580848895908488b304889314889c84883c410488b5d0890ff13488b5424104883c4104833c94883c102f0480fc10a4883c1024883f90374304889c14889d048ba909fdc0000000000ff1251488b5c240848c7c00500000048ba90a0dc0000000000909090ff12eb0150488b4578488b48084989c14989ca49c7c00100000048c7c301000000488b4424109090ff156201000048b9ffffffffffffff00492349f8488d4c09014883f9097606498b4920eb0748c7c101000000f6442410017543f6442418017533488b4c2418488b11f6c20174084883fa017e08eb2af642ff107424488b18488b700848b890e526c9a37f0000488b5d0890ff1348c7c201000000eb034889ca488b4d7848c7c3ffffffff483358084883c3014923da480b184889590848b9ffffffffffffff00492349f8488d4c09014883f909770948c7c101000000eb074d8b49204c89c9f6c2017508f6c1017503ff5570483bd1741bff304889d348c7c01f00000048ba90a0dc000000000090ff12eb02ff30488b04244883e0094883f809752a488b4578488b40184883f801741c48c7c30100000048c7c01700000048ba90a0dc00000000009090ff124883c408584883c418c300000000000000007007000000000000|@14289,2097151,@19805,@17,@17,@17|15,0,36028797018963967 397,0,@14278 416,0,36028797018963967 454,0,@14278 517,0,@14279 601,0,36028797018963967 681,0,I73 750,0,I73 893,0,I73 932,0,$14277+974 1022,0,I69 1049,0,I73 1112,0,36028797018963967 1198,0,@14279 1256,0,36028797018963967 1327,0,I73 1386,0,I73 1429,0,@14282 1516,0,I69 1541,0,I73 1600,0,36028797018963967 1686,0,@14279 1744,0,36028797018963967 1815,0,I73 1874,0,I73 14278:O2|@431,0 14279:O4|12,@20,@14281,@14280 14280:O5|@22,346,0,346,0 14281:S40|54686520737461636b2073697a65206d7573742062652067726561746572207468616e207a65726f 14282:O5|@14283,155,0,155,0 14283:S28|6d6c736f757263652f4d4c436f6d70696c65722f4d414b455f2e4d4c 14284:S25|4d414b455f28292e6462456e76416c6c283129283129283129 14285:D4,56|483b65187303ff554849b818e726c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19804,@1532|11,0,@14286 14286:O1|@14287 14287:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19803,@20083,@20083|34,0,@1486 14288:S22|4d414b455f28292e6462456e76416c6c283329283129 14289:S18|4d414b455f28292e70726f74656374283229 14290:O2|@14291,@371 14291:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19807,@14292,@14277| 14292:D4,56|483b65187303ff554849b840e926c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19808,@1532|11,0,@14293 14293:O1|@14294 14294:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19806,@20084,@20084|34,0,@1486 14295:O2|@14296,@371 14296:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19810,@14297,@14277| 14297:D4,56|483b65187303ff554849b818eb26c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19811,@1532|11,0,@14298 14298:O1|@14299 14299:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19809,@20043,@20043|34,0,@1486 14300:O2|@14301,@371 14301:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19813,@14302,@14277| 14302:D4,56|483b65187303ff554849b8f0ec26c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19814,@1532|11,0,@14303 14303:O1|@14304 14304:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19812,@20047,@20047|34,0,@1486 14305:O2|@14306,@371 14306:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19816,@14307,@14277| 14307:D4,56|483b65187303ff554849b8c8ee26c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19817,@1532|11,0,@14308 14308:O1|@14309 14309:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19815,@20082,@20082|34,0,@1486 14310:O2|@14311,@371 14311:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19818,@14312,@14277| 14312:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb78b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19819,@1490,@14314,@1504|59,0,@20083 14313:S27|4d414b455f28292e6462456e76456e746572283129283129283129 14314:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19820,@20083| 14315:S24|4d414b455f28292e6462456e76456e746572283429283129 14316:O2|@14317,@371 14317:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19821,@14318,@14277| 14318:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb88b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19822,@1490,@14319,@1504|59,0,@20084 14319:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19823,@20084| 14320:O2|@14321,@371 14321:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19824,@14322,@14277| 14322:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbd8b319f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19825,@1490,@14323,@1504|59,0,@20043 14323:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19826,@20043| 14324:O2|@14325,@371 14325:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19828,@14326,@14277| 14326:D4,56|483b65187303ff554849b830f826c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19829,@1532|11,0,@14327 14327:O1|@14328 14328:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19827,@20058,@20058|34,0,@1486 14329:O2|@14330,@371 14330:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19830,@14331,@14277| 14331:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb18b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19831,@1490,@14332,@1504|59,0,@20047 14332:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19832,@20047| 14333:O2|@14334,@371 14334:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19833,@14335,@14277| 14335:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19834,@1490,@20083,@20083|63,0,@1486 14336:S28|4d414b455f28292e6462456e764c6f6f6b7570283129283129283129 14337:S25|4d414b455f28292e6462456e764c6f6f6b7570283329283129 14338:O2|@14339,@371 14339:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19835,@14340,@14277| 14340:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19836,@1490,@20084,@20084|63,0,@1486 14341:O2|@14342,@371 14342:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19837,@14343,@14277| 14343:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19838,@1490,@20043,@20043|63,0,@1486 14344:O2|@14345,@371 14345:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19839,@14346,@14277| 14346:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb68b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19840,@1490,@14347,@1504|59,0,@20082 14347:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19841,@20082| 14348:O2|@14349,@371 14349:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19842,@14350,@14277| 14350:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19843,@1490,@20047,@20047|63,0,@1486 14351:O2|@14352,@371 14352:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19844,@14353,@14277| 14353:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbc8b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19845,@1490,@14354,@1504|59,0,@20058 14354:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19846,@20058| 14355:O2|@14356,@371 14356:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19847,@14357,@14277| 14357:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19848,@1490,@20082,@20082|63,0,@1486 14358:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19849,@14359,@14277| 14359:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19850,@1490,@20058,@20058|63,0,@1486 14360:O2|@14362,@14361 14361:O2|@14363,0 14362:S3|757365 14363:O4|@20043,69,@14364,0 14364:O7|@14362,2,@14366,@14365,@390,0,0 14365:O3|2,@467,@923 14366:O2|1,@14367 14367:O3|2,@14368,0 14368:O2|@14369,@371 14369:D4,48|483b65187303ff55484c8b420848c7c301000000ff252e00000090909090909000000000000000002800000000000000|@14425,2097151,@19866,@14370| 14370:D22,1864|483b65187303ff55484989da4d89c34989c44c89e348b8c01227c9a37f000090ff153a07000048c7c315000000909090ff153207000048b948f020f9a37f0000488b094152415341544889c34889c890ff151a07000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000909090ff15fe06000048c7c30100000048c7c00300000048bad0b3dc00000000009090ff12a801755c488b08483b0ddc0600007432f6c101753c4889ce48bfd81227c9a37f000048c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901750ff64008017509488b4008488b00eb16488b4008483b65187303ff5548eba048c7c05d0000005b48baf01227c9a37f0000ff157a0600006a016a0150488d5c240848baf82527c9a37f00009090ff156606000048c7c35d000000488b4424109090ff155a06000048bb682a27c9a37f0000ff1552060000f6442408017561488b4c2408488b11483b15440600007450f6c201752d4889d648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901741e4989d248c7c35d0000009090ff15060600004c89d3909090ff1502060000ff750848b9f60e27c9a37f0000514889650850ff750848b9be0c27c9a37f000051488965084989c048c7c30100000048c7c00700000048ba909ddc00000000009090ff124883c4085948894d08eb6490488b65084883c4085b48895d086a016a016a01488b08483b0d9d050000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a084889e2eb05e9b700000048c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bb802a27c9a37f000048895a1048894208488b5c241848891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bba02a27c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff1349c7c003000000488b1c2448bab89106c9a37f00009090ff1586040000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f801000000c640ff4048890848c7c203000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff48488911498d57d0483b55107303ff55404989d748c742f80300000048894a104889420848c70203000000488d422048c740f801000000c640ff4848891048c7c203000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff48488911498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f80200000059488948084889104883c4085948894d08eb5d9090488b65084883c4085b48895d08488b08483b0d7b0300007406488b5d08ff13ff750848ba560f27c9a37f000052488965084c8b44241048c7c30100000048c7c00700000048ba909ddc0000000000ff124883c4085948894d08eb65e92e020000488b65084883c4085b48895d086a016a016a01488b08483b0d1d030000751e4889e248890a4889e2488b580848895a084889e2488b701048897210eb694883f903752f4889e248c702030000004889e248bbb05006c9a37f000048895a08eb05e9ba0000004889e248c7421001000000eb61498d57e0483b55107303ff55404989d748c742f80300000048bb802a27c9a37f000048895a1048894208488b5c241848891aeb05e9280000004889e648bf58b019f1a37f000048893e4889e648bf881a06c9a37f000048897e084889e648895610498d57d8483b55107303ff55404989d748c742f80400000048bba02a27c9a37f000048895a18488b5c241048895a10488b5c240848895a085b4883c41048891a4889d0488b5d08909090ff1349c7c003000000488b1c2448bab89106c9a37f00009090ff1506020000498d4fd8483b4d107303ff55404989cf48c741f8020000004889410848c70103000000488d411848c740f801000000c640ff4048890848c7c203000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff48488911498d57d0483b55107303ff55404989d748c742f80300000048894a104889420848c70203000000488d422048c740f801000000c640ff4848891048c7c203000000498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff48488911498d57d0483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f802000000488b0c2448894808488910ff30ff7008488b4424289090ff150a0100004889c1498d47e0483b45107303ff55404989c748c740f803000000488b54243048895010488b542408488950085b4889184889ca9090ff12488b04244c8b004883c43048bbf82a27c9a37f0000488b48084889c8ff25b800000000000000000000004007000000000000|@14571,2097151,@19948,@100,@100,@218,@179,@14372,@14375,@14410,@100,@100,I48,@100,@100,@20027,@268,@20027,@20027,@268,@14426,@179|23,0,@14371 56,0,@20288 88,0,@20288 105,0,@60 138,0,I150 176,0,@14372 256,0,@14373 282,0,@14409 320,0,@14414 368,0,I48 443,0,$14370+1086 462,0,$14370+518 494,0,I61 600,0,@169 658,0,@14415 694,0,@20027 710,0,@67 755,0,@14416 818,0,@266 1122,0,$14370+1182 1156,0,I61 1264,0,@169 1322,0,@14415 1358,0,@20027 1374,0,@67 1419,0,@14416 1482,0,@266 1827,0,@14418 14371:S5|5573653a20 14372:S2|2d49 14373:O6|@14375,@14387,@14397,@20255,@14404,@14374 14374:O1|@14407 14375:D12,1240|483b65187303ff55486a016a016a01483b05da0400007431a80175554889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175284889e048b9509adc00000000004889084889e048c74008010000004889e048c7401001000000eb6e525350488b4a104889ca90ff12488b1424f6c201740948c7c103000000eb08488b0a488d4c0901f6c101740cf64018017406482b48187105ff5570ebf54883c1014c8b084c8b50084c8b58104989c8488b58184889d04883c40890ff1526040000488b4c2408415141524153eb05e969000000488b5928ff151204000048833c2401743348837c241001752b498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8509adc0000000000488901eb034889c1488d4424284883c4085a488910488d44241848894808488d4424185948894810eb0252536a016a016a01488b442418483b05a70300007431a80175554889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175284889e148ba509adc00000000004889114889e148c74108010000004889e148c7411001000000eb6f488b4c2420488b5110909090ff12488b542418f6c201740948c7c103000000eb08488b0a488d4c0901f6c101740cf64018017406482b48187105ff5570ebf54883c1014c8b084c8b50084c8b58104989c8488b58184889d0ff15f6020000488b4c2420415141524153488b5928eb05e963000000ff15e202000048833c2401743348837c241001752b498d4fe8483b4d107303ff55404989cf48c741f8020000004889410848b8509adc0000000000488901eb034889c1488d4424184883c4085a488910488d44240848894808488d442408594889481048837c2410017452488b442420498d4fd8483b4d107303ff55404989cf48c741f80400000048ba801827c9a37f00004889511848c741100100000048bad01827c9a37f000048895108488b50184889114889c8488b5d0890ff13488b0424483b05280200007464a801752d4889c648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017460488b4c2420488b442428488b5120909090ff12488b4c242050488b442408488b5120909090ff12483b04247451f6042401eb05e9a2000000754aa8017546a801740948c7c103000000eb08488b08488d4c09014883c110488b34244889c7eb05e97500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175064883c408eb56488b4424284883c408498d4fd8483b4d107303ff55404989cf48c741f80400000048bae81827c9a37f00004889511848c741100100000048bad01827c9a37f000048895108488b50184889114889c8488b5d0890ff13488b442420488b4810488b4424184889ca9090ff124883781001746df6442408017549488b442408488b08483b0df10000007432f6c10175334889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c09017506488b4008eb05488b442408488b4c24204c8b4424384889c3488b442428488b5108eb05e9060000004883c440ff22488b5c2408488b44243090ff1586000000488b4c24204c8b4424384889c3488b442428488b51084883c440ff2290900000000000000000d004000000000000|@14381,1048575,@19851,I48,@3795,@14382,I48,@3795,@14382,I48,I48,@14380|33,0,I48 78,0,I48 283,0,I48 364,0,I48 409,0,I48 611,0,I48 698,0,@14376 720,0,@14378 771,0,I48 978,0,@14379 1000,0,@14378 1091,0,I48 14376:O5|@14377,582,0,582,0 14377:S14|2e2f62617369732f4f532e736d6c 14378:S4|50617468 14379:O5|@14377,584,0,584,0 14380:D4,208|483b65187303ff5548a801756a48837808017568488b08483b0dca0000007432f6c10175314889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c090175044889d8c3488b08498d47e8483b45107303ff55404989c748c740f80200000048895808eb0ae93a000000e904000000488908c3ff30488b40089090e86effffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c39090909090900000000000000000c800000000000000|@14386,59,@19854,I48|42,0,I48 14381:S17|4f532e506174682e636f6e636174283229 14382:D4,80|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c09014989da4989c14989c848c7c30100000048c7c001000000ff252d000000909090909000000000000000004800000000000000|@14384,1048575,@19852,@14383| 14383:D5,408|483b65187303ff5548f6c301750941f6c0017503ff5570493bd8754df6c3017409a8017405482bd87105ff5570ebf64883c3014989d84889c34c89c8ff156e0100004889c1498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c341f6c101751c4889d94883c11048d1e9490fb60c09488d4c09014889c24889c8eb094889c14c89c84889ca52415153415241504c89d290ff124883f801746d488b442410a801740ef6442420017407482b4424207105ff5570ebf44883c0014989c0488b5c2420488b442418909090ff15da000000488b4c2410f6c10174064883c1027105ff5570ebf5488b542410f6c20174064883c2027105ff5570ebf5504c8b5424104c8b4c2420eb05e9380000004c8b4424084889cb4889d0e8d6feffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594889084883c428c3488b442410a80174064883c0027105ff5570ebf54c8b5424084c8b4c24184c8b04244889c34883c42058e97ffeffff9090909090909000000000000000009001000000000000|@14385,1048575,@19853,@3795,@3795| 14384:S16|537472696e672e6669656c6473283229 14385:S25|537472696e672e6669656c64732832296669656c6427283229 14386:S32|4f532e506174682e636f6e636174283229636f6e636174417263732832292829 14387:O7|@14389,@20255,@14397,47,@20256,@14400,@14388 14388:O1|@14402 14389:D6,536|483b65187303ff55484889c1498d47e8483b45107303ff55404989c748c740f8020000004c8940084889085241505351488b72304889f290ff124883f8017551488b442418498d4fd8483b4d107303ff55404989cf48c741f80400000048bab81f27c9a37f00004889511848c741100100000048bad01827c9a37f000048895108488b50084889114889c8488b5d08ff13488b442408a8017533488b4c2418ff7008488b00488b5128909090ff124883f801750d48c7c0030000004883c408eb1358483b65187303ff5548ebc948c7c0010000004883f8017453488b442418498d4fd8483b4d107303ff55404989cf48c741f80400000048bae81f27c9a37f00004889511848c741100100000048ba182027c9a37f000048895108488b50204889114889c8488b5d089090ff1348837c2410037517488b442418488b5818488b04249090ff15e6000000eb04488b0424488b4c24184889c6488b5918488b442408909090ff15ce0000004889c1498d47e8483b45107303ff55404989c748c740f80200000048894808488930ff15ae000000488b4c24184883c41050488b5110ff12488b00483b4424087451488b442410498d4fd8483b4d107303ff55404989cf48c741f80400000048ba382027c9a37f00004889511848c741100100000048bad01827c9a37f000048895108488b40084889014889c8488b5d08ff13584883c410c3909090909000000000000000001002000000000000|@14395,1048575,@19855,@100,@14394,@109|95,0,@14390 117,0,@14378 249,0,@14391 271,0,@14392 459,0,@14393 481,0,@14378 14390:O5|@14377,384,0,384,0 14391:O5|@14377,387,0,387,0 14392:S10|496e76616c6964417263 14393:O5|@14377,402,0,402,0 14394:D3,176|483b65187303ff5548a801756948837808017527488b08498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908c3ff3053488b4008909090e8b6ffffff498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b4510730aeb05e917000000ff55404989c748c740f8020000004889480859488908c348c7c001000000c39090909090900000000000000000a800000000000000|@14396,11,@19856| 14395:S19|4f532e506174682e746f537472696e67283329 14396:S33|4f532e506174682e746f537472696e6728332961726373546f4c696e6b73283129 14397:O1|@14398 14398:D3,320|6a016a016a016a01a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9017e65eb06f641ff107562a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9017e08eb1bf641ff1074154889c148b8f07206c9a37f0000488b5d089090ff13a801750a480fb64008488d4400014883f85f753f4889e048c70003000000eb0ae92e000000e9290000004889e048b9509adc0000000000488948084889e048c74010030000004889e048c7401803000000eb314889e048c700010000004889e048b9509adc0000000000488948084889e048c74010010000004889e048c7401801000000498d47d8483b45107303ff55404989c748c740f804000000488b4c241848894818488b4c241048894810488b4c240848894808594883c418488908c390909000000000000000003801000000000000|@14399,3,@19857|93,0,@219 156,0,I48 207,0,I48 14399:S33|4f532e506174682e6d61746368566f6c756d65507265666978506f736978283129 14400:O1|@14401 14401:D3,176|a801740948c7c103000000eb08488b08488d4c090148c7c201000000483bd1720948c7c201000000eb55a80175164889d34883c31048d1eb480fb61c18488d5c1b01eb034889c34883fb5f74064883fb01751d498d57f0483b55107303ff55404989d748c742f80100000048891aeb0f4883c202483b65187303ff5548eb9d4883fa01740948c7c001000000eb0748c7c0030000004883f0024883f002c390900000000000000000a800000000000000|@7261,15,@19858| 14402:D4,112|488b08483b0d7e000000750848c7c003000000c3f6c101753d4889ce48bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901740848c7c001000000c348c7c003000000c348c7c001000000c3909000000000000000006800000000000000|@14403,51,@19859,I48|30,0,I48 14403:S23|4f532e506174682e76616c6964566f6c756d652d283129 14404:O1|@14405 14405:D3,24|c39090909090909000000000000000001000000000000000|@14406,1,@19860| 14406:S27|4f532e506174682e746f43616e6f6e6963616c436173652d283129 14407:D3,40|4883f85f740848c7c001000000c348c7c003000000c3909000000000000000002000000000000000|@14408,1,@19861| 14408:S23|4f532e506174682e6973536570617261746f722d283129 14409:O2|@14410,@14374 14410:D6,296|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c09014889ce40f6c60174064883ee027105ff5570ebf55350514989c94989c0488b5a084889f09090ff15f6000000a801756e4c8b084d89c848c7c301000000488b442408ff15e20000004c89c9f6c10174064883c1027105ff5570ebf5488b1424f6c201740b41f6c1017405492bd17105ff5570ebf64883c201f6c20174064883ea027105ff5570ebf54989c14989d04889cb488b442408ff1596000000eb05e933000000498d4ff0483b4d107303ff55404989cf48c741f801000000488901488b4424104889084c89480848c7c0010000004883c418c3488b44241048c70001000000488b4c24084889480848c7c0010000004883c418c390909000000000000000002001000000000000|@14412,1048575,@19862,@14411,@3795,@3795| 14411:D3,624|483b65187303ff5548a80174084883f8017f10eb06f640ff10740848c7c001000000c3a80174084883f8017d08eb32f640ff10752c41f6c001740948c7c103000000eb08498b08488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67c144889c148b8f07206c9a37f0000488b5d0890ff1341f6c001751c4889c14883c11048d1e9490fb60c08488d4c09014889c24889c8eb094889c14c89c04889ca5241505341514889da909090ff124883f801740c48c7c0010000004883c420c3488b442418a80174084883f8017d08eb36f640ff107530488b542410f6c201740948c7c103000000eb08488b0a488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67c1248b8f07206c9a37f0000488b5d089090ff13f6c20175134883c01048d1e8480fb60402488d440001eb034889d04883f85d7561488b0424a80174064883e8027105ff5570ebf5a801750af6442418017503ff5570483b442418750c48c7c0010000004883c420c3488b442418a80174064883e8027105ff5570ebf5a80174084883f8017d08eb38f640ff107532f6c2017410eb05e99500000048c7c103000000eb08488b0a488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67c134889c148b8f07206c9a37f0000488b5d08ff13f6c20174054889d0eb114883c01048d1e8480fb60402488d440001488b542408909090ff124883f801740c48c7c0010000004883c420c3498d47f0483b45107303ff55404989c748c740f801000000488b4c24184889084883c420c3488b442418a80174064883e8027105ff5570ebf54c8b0c244989d04883c4085b4883c410e9a2fdffff909000000000000000006802000000000000|@14413,1048575,@19863|102,0,@219 265,0,@219 459,0,@219 14412:S23|4f532e506174682e73706c697442617365457874283129 14413:S32|4f532e506174682e73706c697442617365457874283129676574457874283129 14414:S3|353630 14415:S13|54657874494f2e6f70656e496e 14416:O5|@14417,293,0,293,0 14417:S18|2e2f62617369732f54657874494f2e736d6c 14418:O1|@14419 14419:D4,80|483b65187303ff5548488b0048833801750f488b4010483b65187303ff5548ebeb4c8b401048bb882b27c9a37f0000488b48084889c8ff252c0000009090909000000000000000004800000000000000|@14424,2097151,@19865,@179|39,0,@14420 14420:O1|@14421 14421:D3,96|483b65187303ff5548488b0848833903751e488b490848ba202c27c9a37f000048891048c7c001000000488b5118ff2248833905750848c7c001000000c3488b4110483b65187303ff5548ebbc90909000000000000000005800000000000000|@14423,1048575,@19864|24,0,@14422 14422:O1|2 14423:S26|426173696353747265616d494f28292e646f436c6f7365283129 14424:S33|4261736963496d7065726174697665494f28292e636c6f7365496e283129283129 14425:S27|4d414b455f28292e757365496e746f456e76283129283129283129 14426:D3,1096|498d4fe8483b4d107303ff55404989cf48c741f80200000048ba383127c9a37f000048891148894108488061ffbf498d57e8483b55107303ff55404989d748c742f80200000048bb903227c9a37f000048891a48894208488062ffbf498d5fe8483b5d107303ff55404989df48c743f80200000048bee83327c9a37f000048893348894308488063ffbf498d77e8483b75107303ff55404989f748c746f80200000048bf403527c9a37f000048893e48894608488066ffbf498d7fe8483b7d107303ff55404989ff48c747f80200000049b8983627c9a37f00004c890748894708488067ffbf4d8d47e84c3b45107303ff55404d89c749c740f80200000049b9f03727c9a37f00004d890849894008498060ffbf4d8d4fe84c3b4d107303ff55404d89cf49c741f80200000049ba483927c9a37f00004d891149894108498061ffbf4d8d57e84c3b55107303ff55404d89d749c742f80200000049bb983b27c9a37f00004d891a49894208498062ffbf4d8d5fe84c3b5d107303ff55404d89df49c743f80200000049bce83d27c9a37f00004d892349894308498063ffbf4d8d67e84c3b65107303ff55404d89e749c74424f80200000049bd384027c9a37f00004d892c24498944240849806424ffbf4d8d6fe84c3b6d107303ff55404d89ef49c745f80200000049be884227c9a37f00004d89750049894508498065ffbf4d8d77e84c3b75107303ff55404d89f749c746f8020000005048b8d84427c9a37f0000498906488b042449894608498066ffbf498d47e8483b45107303ff55404989c748c740f8020000005748bf284727c9a37f0000488938488b7c240848897808488060ffbf498d7fe8483b7d107303ff55404989ff48c747f802000000415049b8e84827c9a37f00004c89074c8b4424104c894708488067ffbf4d8d47e84c3b45107303ff55404d89c749c740f802000000415449bca84a27c9a37f00004d89204c8b6424184d896008498060ffbf4d8d67e84c3b65107303ff55404d89e749c74424f8020000005348bb684c27c9a37f000049891c24488b5c242049895c240849806424ffbf498d5fe8483b5d107303ff55404989df48c743f802000000415649be284e27c9a37f00004c89334c8b7424284c897308488063ffbf4d8d77e84c3b75107303ff55404d89f749c746f8020000005248bae84f27c9a37f0000498916488b54243049895608498066ffbf498d9768ffffff483b55107303ff55404989d748c742f81200000056488b7424304889b288000000488b7424284889b280000000488b74242048897278488b74241848897270488b74241048897268488b742408488972605e4883c4304889725848894a504c895a4848895a404c8952384c896a304c894a284c8972204c89421848897a104c896208488902498d47e0483b45107303ff55404989c748c740f80300000048b9a85127c9a37f0000488908488950085948894810488060ffbfc39090909090909000000000000000004004000000000000|@14572,8191,@19949|26,0,@14427 72,0,@14429 118,0,@14431 164,0,@14433 210,0,@14435 256,0,@14437 302,0,@14439 348,0,@14442 394,0,@14445 441,0,@14448 490,0,@14451 538,0,@14454 589,0,@14457 642,0,@14461 695,0,@14465 748,0,@14469 804,0,@14473 856,0,@14477 1047,0,@14481 14427:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19867,@14428,@14277| 14428:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19868,@1490,@20083,@20083|63,0,@1486 14429:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19869,@14430,@14277| 14430:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19870,@1490,@20043,@20043|63,0,@1486 14431:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19871,@14432,@14277| 14432:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19872,@1490,@20047,@20047|63,0,@1486 14433:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19873,@14434,@14277| 14434:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19874,@1490,@20084,@20084|63,0,@1486 14435:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19875,@14436,@14277| 14436:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19876,@1490,@20058,@20058|63,0,@1486 14437:D5,64|483b65187303ff5548488b4a0850ff7108ff3541000000488b194889e0909090ff153a0000004883c418c3909090909000000000000000003800000000000000|@14336,2097151,@19877,@14438,@14277| 14438:D6,160|483b65187303ff5548488b5a10488b4208909090ff159e000000a8017569488b00a801755a488b08488b11483b158e0000007539483b158d000000741048b878e107c9a37f0000488b5d08ff13498d47f0483b45107303ff55404989c748c740f801000000488b5910488918c3488b58084889d8483b65187303ff5548eba248c7c001000000c348c7c001000000c39000000000000000009800000000000000|@14337,1048575,@19878,@1490,@20082,@20082|63,0,@1486 14439:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19879,@14440,@14277| 14440:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb78b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19880,@1490,@14441,@1504|59,0,@20083 14441:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19881,@20083| 14442:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19882,@14443,@14277| 14443:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbd8b319f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19883,@1490,@14444,@1504|59,0,@20043 14444:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19884,@20043| 14445:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19885,@14446,@14277| 14446:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb18b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19886,@1490,@14447,@1504|59,0,@20047 14447:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19887,@20047| 14448:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19888,@14449,@14277| 14449:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbc8b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19889,@1490,@14450,@1504|59,0,@20058 14450:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19890,@20058| 14451:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19891,@14452,@14277| 14452:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb88b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19892,@1490,@14453,@1504|59,0,@20084 14453:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19893,@20084| 14454:D5,64|483b65187303ff5548488b4a08ff7008ff30ff7108ff353d000000488b194889e0909090ff15360000004883c420c39000000000000000003800000000000000|@14313,2097151,@19894,@14455,@14277| 14455:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb68b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19895,@1490,@14456,@1504|59,0,@20082 14456:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19896,@20082| 14457:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19898,@14458,@14277| 14458:D4,56|483b65187303ff554849b8004827c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19899,@1532|11,0,@14459 14459:O1|@14460 14460:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19897,@20083,@20083|34,0,@1486 14461:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19901,@14462,@14277| 14462:D4,56|483b65187303ff554849b8c04927c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19902,@1532|11,0,@14463 14463:O1|@14464 14464:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19900,@20043,@20043|34,0,@1486 14465:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19904,@14466,@14277| 14466:D4,56|483b65187303ff554849b8804b27c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19905,@1532|11,0,@14467 14467:O1|@14468 14468:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19903,@20047,@20047|34,0,@1486 14469:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19907,@14470,@14277| 14470:D4,56|483b65187303ff554849b8404d27c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19908,@1532|11,0,@14471 14471:O1|@14472 14472:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19906,@20084,@20084|34,0,@1486 14473:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19910,@14474,@14277| 14474:D4,56|483b65187303ff554849b8004f27c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19911,@1532|11,0,@14475 14475:O1|@14476 14476:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19909,@20058,@20058|34,0,@1486 14477:D5,56|483b65187303ff5548488b4208ff7008ff353a000000488b184889e0ff15360000004883c410c39000000000000000003000000000000000|@14284,2097151,@19913,@14478,@14277| 14478:D4,56|483b65187303ff554849b8c05027c9a37f000048c7c301000000488b4208ff252c0000009090909000000000000000003000000000000000|@14288,1048575,@19914,@1532|11,0,@14479 14479:O1|@14480 14480:D5,160|f6c3017564488b0b488b11483b15a6000000755a483b15a500000074144889c648b878e107c9a37f0000488b5d0890ff13498d77d0483b75107303ff55404989f748c746f802000000488b791048897e084889064c8d4e1849c741f8020000004d894108498931eb08e91b0000004d89c14d89c8488b73084889f3483b65187303ff5548e977ffffff4889c14c89c0c300000000000000009800000000000000|@1538,255,@19912,@20082,@20082|34,0,@1486 14481:D4,56|483b65187303ff55484c8b52104c8b4a084c8b4010488b5808488b084889c8ff252b00000090909000000000000000003000000000000000|@14556,2097151,@19933,@14482| 14482:D24,1456|488dbc2458ffffff483b7d187303ff5550498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff4048c70103000000498d57f0483b55107303ff55404989d748c742f801000000c642ff4048c70201000000498d77d8483b75107303ff55404989f748c746f80400000048bf905827c9a37f000048893e4889560848894e1048895e18488066ffbf5356525150415041514152ff750848bf525627c9a37f00005748896508488b442438488b004883f801756e498d47e8483b45107303ff55404989c748c740f80200000048b9a06727c9a37f0000488908488b4c243048894808488060ffbf498d57d8483b55107303ff55404989d748c742f80400000048c74218010000004889421048c742088b00000048b8f8bb19f1a37f0000488902eb05e901030000498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b5c24284889581048c740088b00000048be18bc19f1a37f0000488930498d77e8483b75107303ff55404989f748c746f80200000048bf206827c9a37f000048897e08488906498d47d0483b45107303ff55404989c748c740f80200000048897008488910488d501848c742f8020000004889420848b8387927c9a37f0000488902498d47e8483b45107303ff55404989c748c740f8020000004889500848bad07927c9a37f00004889104883f8017507488b442420eb0e4889c3488b442420ff15b60300004989c0488b5c2440488b44241890ff15aa030000f64008017415488b480848b8f87927c9a37f0000488b5d0890ff13488b4008ff750848b9825427c9a37f00005148896508488b0048ba5096dc0000000000ff124883c4085948894d08eb3190488b65084883c4085b48895d084883381b740c4889c14889c8488b5d08ff13488b4810488b5908488b01ff1536030000488b08ff7008ff7018ff7020ff7028ff7010f6c1017539488b01488b542438ff7008ff30ff7208ff3511030000ff7108488b1a488d4424089090ff1506030000594883c420483b65187303ff5548ebc258a8017537488b08488b542430ff7108ff31ff7208ff35e3020000ff7008488b1a488d442408ff15da020000584883c420483b65187303ff5548ebc558a8017537488b08488b542428ff7108ff31ff7208ff35b7020000ff7008488b1a488d442408ff15ae020000584883c420483b65187303ff5548ebc558a8017537488b08488b542420ff7108ff31ff7208ff358b020000ff7008488b1a488d442408ff1582020000584883c420483b65187303ff5548ebc558a8017537488b08488b542418ff7108ff31ff7208ff355f020000ff7008488b1a488d442408ff1556020000584883c420483b65187303ff5548ebc558a8017537488b08488b542410ff7108ff31ff7208ff3533020000ff7008488b1a488d442408ff152a020000584883c420483b65187303ff5548ebc5483b65187303ff5548e97efcffff48c7c0010000004883c4085948894d084883c440c390488b65084883c4085b48895d08488138cf0000007569488b4c243850ff70104c8b0148bb707a27c9a37f0000488b41089090ff15c6010000498d47d8483b45107303ff55404989c748c740f80400000048b9007b27c9a37f000048894818594889481048b9704406c9a37f00004889480848c700cf000000488b5d0890ff13488b48084989c24889cb48b878af25c9a37f0000909090ff156a01000048bb307b27c9a37f0000ff156201000048b948f020f9a37f0000488b0941524889c34889c890ff154e01000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000909090ff1532010000488b4424404c8b0048bb487b27c9a37f0000488b48084889c890ff151a010000488b0424498d4fd8483b4d107303ff55404989cf48c741f80400000048bad87b27c9a37f000048895118488b501048895110488b580848895908488b304889314889c84883c408488b5d089090ff139090900000000000000000a805000000000000|@14558,2097151,@19934,@14559,@7810,@12420,@14560,@14277,@14562,@14277,@14564,@14277,@14566,@14277,@14568,@14277,@14557,@14277,@179,@100,@100,@218,@179,@179|113,0,@14483 157,0,$14482+1090 210,0,@14502 281,0,@20118 350,0,@20120 387,0,@14504 451,0,@14542 492,0,@14545 562,0,@14546 586,0,$14482+626 604,0,I32 1126,0,@14549 1172,0,@14551 1191,0,@112 1229,0,@12416 1248,0,@14552 1264,0,@20288 1292,0,@20288 1309,0,@60 1336,0,@14553 1388,0,@14555 14483:D4,144|483b65187303ff5548488b4218524c8b0048bb505927c9a37f0000488b48084889c89090ff157e0000004883f801751b488b0424488b400848c7000300000048c7c0010000004883c408c3488338157527488b0c24488b5110488b12f6c20174064883c2027105ff5570ebf5488b49104889114883c408c34883c408c390909000000000000000008800000000000000|@14501,2097151,@19921,@179|19,0,@14484 14484:O1|@14485 14485:D5,232|483b65187303ff5548488b086a016a01504c8d44240848c7c3030000004889c848ba805a27c9a37f00009090ff15ce000000488b44240890ff15ca000000594883c4085a488911a801740948c7c103000000eb08488b08488d4c09014883f901750848c7c001000000c3a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9017e08eb19f641ff1074134889c148b8f07206c9a37f0000488b5d08ff13a801750a480fb64008488d4400014889c1498d47f0483b45107303ff55404989c748c740f801000000488908c39090909090900000000000000000e000000000000000|@14500,2097151,@19920,@14488,@109|34,0,@14486 151,0,@219 14486:O2|@14488,@14487 14487:O2|@14492,I48 14488:D10,824|483b65187303ff5548488338017557488b700840f6c601740948c7c103000000eb08488b0e488d4c09014883f901753b498d4fe8483b4d107303ff55404989cf48c741f80200000048c7410801000000488931498908488b48104989480848c7c001000000c3e95f0200004889cf40f6c701740cf64018017406482b78187105ff5570ebf54883c701f6c301740b40f6c7017405483bdfeb05ff5570ebf67d74498d4ff0483b4d107303ff55404989cf48c741f8010000004889194c89c74c8b48104989f24c8b58204989dc4c8b68184989c84c89eb4c89d0909090ff156e0200004989fe4c8b4010488b5808488b084889c890ff155e020000498d4fe8483b4d107303ff55404989cf48c741f802000000eb05e96400000048c741080100000048890141f6c401741041f6c501740a4d8d6424ff4d03e57105ff5570ebf1498d47d0483b45107303ff55404989c748c740f8050000004c8958204c8960184c8948104c89500848c7000100000049890e4989460848c7c001000000c34889cf40f6c701740cf64018017406482b78187105ff5570ebf54883c701f6c301750940f6c7017503ff5570483bdf75664c89c74c8b481049c7c001000000488b58184889f090ff15960100004989fa4c8b4010488b5808488b084889c890ff1586010000498d4fe8483b4d107303ff55404989cf48c741f80200000048c741080100000048890149890a4d894a0848c7c001000000c3f6c101740cf64018017406482b48187105ff5570ebf54883c101f6c301740af6c1017405482bd97105ff5570ebf64883c3016a016a01415056ff7018524c8d442420488b4010909090e89efdffff49c7c0010000004883c4085b5890ff15fa0000004c8b4010488b5808488b084889c8ff15ee000000498d4fe8483b4d107303ff55404989cf48c741f802000000488b54240848895108488901488b0424488908488b4c24104889480848c7c0010000004883c418c3498d4fe0483b4d107303ff55404989cf48c741f80300000048895910488b581048895908488b700848893141504989d8488b5a084889c8909090ff1576000000488b0c24488b10488911488b58084889590848c7c0010000004883c408c300000000000000003003000000000000|@14490,2097151,@19915,@240,@14489,@240,@14489,@240,@14489,@179| 14489:D3,288|41f6c001740948c7c103000000eb08498b08488d4c09014883f8017509483bd975044c89c0c34883fb01750b48b8509adc0000000000c34883fb0375124883c01048d1e8490fb60400488d440001c34889d94883c11e48c1e9034883c901483b0db300000072164889c248b8583e06c9a37f0000488b5d08909090ff134889c248c7c001000000488d3c8d0400000048f7df4903ff483b7d107205493bff7203ff55404989ff48d1e948894ff8c647ff415748c1e10348d1e8f3aa488d4400015f48d1eb48891f488d5c1b014883c2104c89c64889f84889c74889d948d1e948d1ea4803f2488d5412014883c708f3a4488d7c3f01488d743601488d4c0901488060ffbfc390909000000000000000001001000000000000ffffffffffffff01|@14491,127,@19916|46,0,I48 108,0,@101 14490:S29|426173696353747265616d494f28292e696e7075744e4c697374283229 14491:S19|537562737472696e672e766563746f72283129 14492:D4,104|483b65187303ff55486a016a014c8b52084989e14c8b4010488b5808488b084889c89090ff1556000000498d47e8483b45107303ff55404989c748c740f802000000488b4c240848894808594883c408488908c39090909000000000000000006000000000000000|@14494,1048575,@19917,@14493| 14493:D6,832|483b65187303ff5548488b0848833905754d498d4fc8483b4d107303ff55404989cf48c741f80200000048c74108010000004c8911488d511848c742f80300000048895a104889420848c702030000004989094989510848c7c001000000c348833901756b488b5108f6c201740948c7c003000000eb08488b02488d4400014883f8017558498d47c8483b45107303ff55404989c748c740f80200000048c7400801000000488910488d701848c746f80300000048895e10488b591048895e0848c7060300000049890149897108eb05e9be01000048c7c001000000c341f6c0017409a80174054c3bc0eb05ff5570ebf67d71498d47f0483b45107303ff55404989c748c740f8010000004c89004889df4c8b51104989d34c8b61184d89c54989c048c7c3010000004c89d8ff15260200004989fe4c8b4010488b5808488b084889c890ff1516020000498d4f98483b4d107303ff55404989cf48c741f802000000eb05e95800000048c7410801000000488901488d411848c740f8030000004c8970104c89500848c70003000000488d502048c742f8050000004c8962204c896a18488942104c895a0848c702010000004989094989510848c7c001000000c341f6c0017507a8017503ff55704c3bc07551498d47c8483b45107303ff55404989c748c740f80200000048c7400801000000488910488d701848c746f80300000048895e10488b591048895e0848c706030000004989014989710848c7c001000000c341f6c0017409a80174054c2bc07105ff5570ebf64983c0016a016a014151524c8d4c2410488b411090e8aefdffff498d47e8483b45107303ff55404989c748c740f802000000488b4c24104889480859488908488b0c24488901488b4424104889410848c7c0010000004883c418c36a016a0141515350415241504d89d14c8d44242890ff15ba000000488b4c2428f6c101740948c7c003000000eb08488b01488d4400014883f8017540498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488908488b4c2420488901488b4424304889410848c7c0010000004883c438c34c8b5424084c8b4c24204c8b0424488b5c24184883c410584883c420e9d0fcffff00000000000000003803000000000000|@14498,1048575,@19918,@240,@14489,@14495| 14494:S30|426173696353747265616d494f28292e696e7075744e4c69737427283129 14495:D3,560|483b65187303ff5548488b08488339037568488b5108f64248017463498d77e0483b75107303ff55404989f748c746f80300000048bf886627c9a37f000048897e1048bfd81906c9a37f000048897e08488b3a48893e4d8d4fd84c3b4d107303ff55404d89cf49c741f80400000049baa06627c9a37f0000eb0ae926010000e9310000004d8951184989711048be881a06c9a37f00004989710848be58b019f1a37f00004989314889c64c89c8488b5d089090ff13488b724848837a2801750948c7c701000000eb3a488b7a284150535051ff7258ff3648c7c001000000488b17909090ff12498d7ff0483b7d107303ff55404989ff48c747f801000000488907eb0a4150535051ff7258ff3657488b442410488b542408ff12498d4ff0483b4d107303ff55404989cf48c741f801000000c641ff40488b542418488911498d57b8483b55107303ff55404989d748c742f8040000005b4883c41848895a1848894a104889420848c702010000005b488913488d522848c742f8030000005b48895a1048894a0848c70203000000488b0c244889014889510848c7c0010000004883c408c3488339057536498d4fe0483b4d107303ff55404989cf48c741f803000000488959104889410848c701030000004d89084989480848c7c001000000c3498d47e0483b45107303ff55404989c748c740f80300000048895810488b51104889500848c70003000000488b59084989184989400848c7c001000000c39000000000000000002802000000000000|@14499,1048575,@19919|54,0,@14496 68,0,@63 112,0,@14497 142,0,@67 156,0,@20027 14496:S5|696e707574 14497:O5|@66,140,0,140,0 14498:S30|426173696353747265616d494f28292e696e7075744e4c69737427283329 14499:S25|426173696353747265616d494f28292e696e70757427283229 14500:S32|4261736963496d7065726174697665494f28292e696e70757431283129283129 14501:S41|4d414b455f28292e636f6d70696c65496e746f456e7628312975736528332967657443686172283129 14502:D3,32|488b5208488b124889d0c3909090909000000000000000001800000000000000|@14503,5,@19922| 14503:S39|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329636f64652d283129 14504:O2|@14506,@14505 14505:O2|@2654,@14516 14506:O4|@20165,69,@14507,0 14507:O1|@14508 14508:D8,440|483b65187303ff5548488b481848833801750c48ba906a27c9a37f0000eb0a48baa86a27c9a37f000052ff31ff701048c7c303000000488b411048baa05f06c9a37f0000ff158601000050488b442408ff1582010000498d4fe8483b4d107303ff55404989cf48c741f80200000048bac06a27c9a37f000048895108488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9d86a27c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f80200000048894108584883c408488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9f06a27c9a37f0000488908498d4fe8483b4d107303ff55404989cf48c741f8020000004889410858488901498d47e8483b45107303ff55404989c748c740f8020000004889480848b9086b27c9a37f00004889084889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908909090ff157600000048b948f020f9a37f0000488b094889c34889c8909090ff156200000048b848f020f9a37f0000488b004c8b402048bb881606c9a37f0000ff2549000000900000000000000000b001000000000000|@14515,2097151,@19923,@194,@11197,@109,@218,@179|21,0,@14509 33,0,@14510 60,0,@193 112,0,@14511 157,0,@14512 234,0,@14513 307,0,@14514 364,0,@20288 392,0,@20288 409,0,@60 14509:S8|5761726e696e672d 14510:S6|4572726f722d 14511:O2|10,0 14512:S2|2e0a 14513:S8|272c206c696e6520 14514:S5|20696e2027 14515:S43|4d414b455f28292e636f6d70696c65496e746f456e762831297573652833296572726f7250726f63283129 14516:O2|@14518,@14517 14517:O2|@2684,@14519 14518:O4|@20136,69,1,0 14519:O2|@14521,@14520 14520:O2|@14535,@14534 14521:O4|@20194,69,@14522,0 14522:O1|@14523 14523:D4,48|483b65187303ff554849c7c08d00000048bbe85725c9a37f0000ff252800000000000000000000002800000000000000|@14525,1048575,@19924,@14524|18,0,@12291 14524:D4,96|483b65187303ff55485341504d89c24989d948c7c301000000909090ff1556000000a8017509f60424017503ff5570483b0424740e48c7c0150000004883c4085aff2248c7c0010000004883c410c39000000000000000005800000000000000|@14528,1048575,@19925,@14526| 14525:S24|5072657474792e7072657474795072696e74283129283129 14526:D5,696|483b65187303ff5548488b08f6c10175144889c248b8b8f309c9a37f0000488b5d0890ff134883f9017571488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90174164889c148b8003722c9a37f0000488b5d08909090ff13f6c3017410f6400801740a488d5bff480358087105ff5570ebf14989db4d89cc4c8b68104d89c6ff70204c89f39090ff1536020000eb05e97e0000004883f8017535488b4424084c8954240848b9287027c9a37f0000488b142448890c244d89da4d89e14d89e84c89f34889c14889d051ff25fc010000488b0c24415241534154ff30f6c101752cff71084c8b5424204c8b4c24104d89f0488b5c2418488b01e8f6feffff4989c659483b65187303ff5548ebcf584883c420c3488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f9037567488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90374164889c148b8883722c9a37f0000488b5d08909090ff13488b480841514150ff7008f6c10174084883f9017e3deb06f641ff1075355148c7c041000000488b542418eb05e96200000090ff1258a80174064883e8027105ff5570ebf54889c1483b65187303ff5548ebb8488b442408a801740cf60424017406482b04247105ff5570ebf54883c001a80174084883f8017f14eb06f640ff10740c48c7c0010000004883c418c34883c418c3488b08f6c10175144889c248b8b8f309c9a37f0000488b5d0890ff134883f90774164889c148b8583822c9a37f0000488b5d08909090ff134150ff7008488b04244c89ca909090ff1259f6c101740948c7c003000000eb08488b01488d44000159f6c1017409a8017405482bc87105ff5570ebf64883c101f6c10174084883f9017f10eb06f641ff10740848c7c001000000c34889c8c30000000000000000b002000000000000|@14530,1048575,@19926,@14531,@14529|22,0,@2708 56,0,@2708 84,0,@11198 179,0,@14527 300,0,@2708 336,0,@2708 364,0,@11201 542,0,@2708 568,0,@11206 14527:O1|@14526 14528:S21|5072657474792e7072657474795072696e74283329 14529:D4,1144|483b65187303ff5548a8017564488b08488b09f6c1017519488b5008488b3048b8b8f309c9a37f0000488b5d089090ff134883f9037566f640080174064889d8c21000488b08488b09f6c1017517488b5008488b3048b8b8f309c9a37f0000488b5d08ff134883f903741e488b4808eb05e9ec030000488b1048b8883722c9a37f0000488b5d08ff13488b084983f8017560f6c3017415f6410801eb05e9840200007408483b59087f07eb69ff5570ebf34889daf6c201740cf64108017406482b51087105ff5570ebf54883c201488b70085341514150ff7008ff7110ff710840f6c6017568488b06488b00a801751deb05e9ae0000004889c148b8b8f309c9a37f0000488b5d08909090ff134883f8037524eb05e97b000000498d47f0483b45107303ff55404989c748c740f801000000488910eb564c8b5e084889d3488b06909090ff1546030000a801eb05e91f0000007514488b104c89de483b65187303ff5548e977ffffff48c7c001000000eb1b498d47f0483b45107303ff55404989c748c740f8010000004889104883f801755eeb1e5341514150ff7008ff7110ff7108eb0e5341514150ff7008ff7110ff7108415248c7c015000000488b542428909090ff12488b0424a8017412f644241001740b488d40ff48034424107105ff5570ebf0a801740d4883f8017e3aeb0be99d000000f640ff10752d5048c7c041000000488b542430909090ff1258a80174064883e8027105ff5570ebf5483b65187303ff5548ebbc488b442448a801740cf60424017406482b04247105ff5570ebf54883c001a801740ef6442410017407482b4424107105ff5570ebf44883c001488b4c2448488b54244048894c24484889542440415a4c8b4c24204c8b4424184889c34883c410584883c418e96dfdffff488b04244152a80174084883f8017e32eb06f640ff10752a5048c7c041000000488b542430ff1258a80174064883e8027105ff5570ebf5483b65187303ff5548ebc4488b442430a801740ef6442408017407482b4424087105ff5570ebf44883c001488b4c2448488b54244048894c24484889542440415a4c8b4c24204c8b4424184889c34883c410584883c418e9dafcffff488b08488b09f6c1017518488b5008488b3048b8b8f309c9a37f0000488b5d0890ff134883f907756a488b08488b09f6c1017517488b5008488b3048b8b8f309c9a37f0000488b5d08ff134883f907741a488b4808488b1048b8583822c9a37f0000488b5d08909090ff13488b0853415241514150ff7008ff7108488b04244c89caff1259f6c101740e48c7c003000000eb0de954000000488b01488d440001488b4c2420f6c1017409a8017405482bc87105ff5570ebf64883c101488b442438488b542430488944243848895424304c8b5424184c8b4c24104c8b4424084889cb584883c420e9eefbffff415241514150ff70084c8b5424304989d8488b5c2418488b00488b542428ff12488b4c2430488b54242848894c243048895424284c8b5424184c8b4c24104c8b4424084889c3584883c418e99efbffff4889d8c2100000000000000000007004000000000000|@14533,1048575,@19928,@14531|33,0,@2708 87,0,@2708 123,0,@11201 252,0,@2708 826,0,@2708 867,0,@2708 896,0,@11206 14530:S30|5072657474792e7072657474795072696e742833296c61794f7574283329 14531:D3,640|483b65187303ff5548488b08f6c10175144889c248b8b8f309c9a37f0000488b5d0890ff134883f9017570488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90174164889c148b8003722c9a37f0000488b5d08909090ff13498d4fc8483b4d107303ff55404989cf48c741f804000000488b502048895118488b701848897110488b7810488979084c8b4008eb05e9520000004c89014c8d492849c741f801000000498919488b4918f6c10175334983f901750948c7c001000000eb12ff7108498b19488b019090e826ffffffeb03ff71084989c159483b65187303ff5548ebc84c89c8c3488b08f6c10175134889c248b8b8f309c9a37f0000488b5d08ff134883f9037568488b08f6c10175164889c248b8b8f309c9a37f0000488b5d08909090ff134883f90374164889c148b8883722c9a37f0000488b5d08909090ff13498d4fe8483b4d107303ff55404989cf48c741f802000000488b501048895108488b7008488931f6c3017413eb05e94d000000f601017407483b197c3beb05ff5570ebf4f6c301740af601017405482b197105ff5570ebf64883c301498d47f0483b45107303ff55404989c748c740f801000000488918c348c7c001000000c3488b08f6c10175144889c248b8b8f309c9a37f0000488b5d0890ff134883f90774164889c148b8583822c9a37f0000488b5d08909090ff13488b4008a801740948c7c103000000eb08488b08488d4c0901f6c101740af6c3017405483bcbeb05ff5570ebf67f34f6c301740af6c1017405482bd97105ff5570ebf64883c301498d47f0483b45107303ff55404989c748c740f801000000488918c348c7c001000000c300000000000000007802000000000000|@14532,255,@19927|22,0,@2708 56,0,@2708 84,0,@11198 255,0,@2708 288,0,@2708 316,0,@11201 474,0,@2708 500,0,@11206 14532:S31|5072657474792e7072657474795072696e7428332967657453697a65283229 14533:S40|5072657474792e7072657474795072696e742833296c61794f7574283329646f5072696e74283229 14534:O2|@2658,@14538 14535:O4|@20132,69,@14536,0 14536:O1|@14537 14537:D3,24|48c7c029000000c300000000000000001000000000000000|@14503,1,@19929| 14538:O2|@2660,@14539 14539:O2|@2668,@14540 14540:O2|@2662,@14541 14541:O2|@2666,0 14542:O4|@20141,69,@14543,0 14543:O1|@14544 14544:D4,48|483b65187303ff554849c7c08d00000048bbe85725c9a37f0000ff252800000000000000000000002800000000000000|@14525,1048575,@19930,@14524|18,0,@12291 14545:O4|@20134,69,1,0 14546:O4|103,@112,@14548,@14547 14547:O5|@14283,303,0,303,0 14548:S13|537461746963204572726f7273 14549:O1|@14550 14550:D4,80|483b65187303ff5548488b0048833801750f488b4010483b65187303ff5548ebeb4c8b401048bb882b27c9a37f0000488b48084889c8ff252c0000009090909000000000000000004800000000000000|@14424,2097151,@19931,@179|39,0,@14420 14551:O5|@14283,320,0,320,0 14552:S8|207261697365640a 14553:O1|@14554 14554:D4,80|483b65187303ff5548488b0048833801750f488b4010483b65187303ff5548ebeb4c8b401048bb882b27c9a37f0000488b48084889c8ff252c0000009090909000000000000000004800000000000000|@14424,2097151,@19932,@179|39,0,@14420 14555:O5|@14283,326,0,326,0 14556:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283129 14557:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb18b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19946,@1490,@14570,@1504|59,0,@20047 14558:S31|4d414b455f28292e636f6d70696c65496e746f456e76283129757365283329 14559:D3,88|483b65187303ff5548a8017531ff30488b40089090e8e6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c34889d8c390909090909000000000000000005000000000000000|@1353,11,@19935| 14560:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb78b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19936,@1490,@14561,@1504|59,0,@20083 14561:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19937,@20083| 14562:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbd8b319f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19938,@1490,@14563,@1504|59,0,@20043 14563:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19939,@20043| 14564:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bbc8b419f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19940,@1490,@14565,@1504|59,0,@20058 14565:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19941,@20058| 14566:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb88b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19942,@1490,@14567,@1504|59,0,@20084 14567:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19943,@20084| 14568:D6,192|483b65187303ff5548498d47d8483b45107303ff55404989c748c740f80400000048c7401801000000488b4a184889481048c740088b00000048bb68b919f1a37f00004889185250488b5a10488b4208ff15820000004883f8017529498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488b0c24488908eb0d488b1c24488b00ff154e000000488b4c24084883c4084989c04883c408488b5910488b4108ff25380000000000000000000000b800000000000000|@14315,2097151,@19944,@1490,@14569,@1504|59,0,@20082 14569:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19945,@20082| 14570:D4,168|483b65187303ff5548a8017561488b08488b11483b15a60000007524488b7008498d47e8483b45107303ff55404989c748c740f80200000048897008488918c351488b4008e8b6ffffff4889c1498d47e8483b45107303ff55404989c748c740f8020000004889480859488908c3498d47e8483b45107303ff55404989c748c740f80200000048c7400801000000488918c39090909090900000000000000000a000000000000000|@1513,31,@19947,@20047| 14571:S21|4d414b455f28292e757365496e746f456e76283329 14572:S25|4d414b455f28292e636f6d70696c65496e746f456e76283129 14573:O2|@14575,@14574 14574:O2|@14576,0 14575:S8|6465627567546167 14576:O4|@20043,69,@14577,0 14577:O7|@14575,2,@14578,@13933,@390,0,0 14578:O2|1,@14579 14579:O3|2,@14580,0 14580:O3|@14582,@14584,@14581 14581:O2|@14586,@20135 14582:O2|@14583,@20135 14583:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19950| 14584:O2|@14585,@20135 14585:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19951| 14586:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19952|14,0,@1486 14587:O2|@13863,@14588 14588:O2|@14589,0 14589:O4|@20047,69,@14590,0 14590:O2|@14591,0 14591:O3|@13863,@390,@14592 14592:O3|@14594,@14613,@14593 14593:O3|@14614,@417,@416 14594:O2|1,@14595 14595:O3|2,@14597,@14596 14596:O2|@14604,0 14597:O4|@14599,@20257,@14601,@14598 14598:O1|@14603 14599:O1|@14600 14600:D3,32|48b810cddc0000000000c3909090909000000000000000001800000000000000|@13129,1,@19953|2,0,I251 14601:O1|@14602 14602:D3,24|48c7c005000000c300000000000000001000000000000000|@13138,1,@19954| 14603:D3,24|48c7c003000000c300000000000000001000000000000000|@13140,1,@19955| 14604:O4|@20054,69,@14605,0 14605:O3|2,4,@14606 14606:O5|@590,@14608,@13161,@14607,@548 14607:O4|@14597,@14599,@14601,@14598 14608:O2|@594,@14609 14609:O2|@13148,@14610 14610:O2|@14611,@13151 14611:O2|@14612,@573 14612:O3|0,@20257,0 14613:O4|1,@20095,1,0 14614:S12|4172726179322e6172726179 14615:O2|@14617,@14616 14616:O2|@14618,0 14617:S24|7265706f727444697363617264656456616c756573546167 14618:O4|@20043,69,@14619,0 14619:O7|@14617,2,@14621,@14620,@390,0,0 14620:O5|5,@11128,@13945,@13944,@390 14621:O2|1,@14622 14622:O3|2,@14623,0 14623:O3|@14625,@14627,@14624 14624:O2|@14629,@20140 14625:O2|@14626,@20140 14626:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19956| 14627:O2|@14628,@20140 14628:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19957| 14629:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19958|14,0,@1486 14630:O2|@14632,@14631 14631:O2|@14633,0 14632:S15|636f6d70696c657256657273696f6e 14633:O4|@20043,69,@14634,0 14634:O7|@14632,2,@14635,@467,@390,0,0 14635:O2|1,@14636 14636:O3|2,@14637,0 14637:S11|352e362052656c65617365 14638:O2|@14640,@14639 14639:O2|@14641,0 14640:S27|7265706f72744578686175737469766548616e646c657273546167 14641:O4|@20043,69,@14642,0 14642:O7|@14640,2,@14643,@13933,@390,0,0 14643:O2|1,@14644 14644:O3|2,@14645,0 14645:O3|@14647,@14649,@14646 14646:O2|@14651,@20137 14647:O2|@14648,@20137 14648:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19959| 14649:O2|@14650,@20137 14650:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19960| 14651:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19961|14,0,@1486 14652:O2|@14654,@14653 14653:O2|@14655,0 14654:S11|66696c654e616d65546167 14655:O4|@20043,69,@14656,0 14656:O7|@14654,2,@14658,@14657,@390,0,0 14657:O5|5,@13394,@13945,@13944,@390 14658:O2|1,@14659 14659:O3|2,@14660,0 14660:O3|@14662,@14664,@14661 14661:O2|@14666,@20120 14662:O2|@14663,@20120 14663:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19962| 14664:O2|@14665,@20120 14665:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19963| 14666:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19964|14,0,@1486 14667:O2|@14669,@14668 14668:O2|@14670,0 14669:S20|70726f66696c65416c6c6f636174696f6e546167 14670:O4|@20043,69,@14671,0 14671:O7|@14669,2,@14672,@14620,@390,0,0 14672:O2|1,@14673 14673:O3|2,@14674,0 14674:O3|@14676,@14678,@14675 14675:O2|@14680,@20124 14676:O2|@14677,@20124 14677:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19965| 14678:O2|@14679,@20124 14679:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19966| 14680:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19967|14,0,@1486 14681:O2|@14683,@14682 14682:O2|@14684,0 14683:S13|6572726f724465707468546167 14684:O4|@20043,69,@14685,0 14685:O7|@14683,2,@14686,@14620,@390,0,0 14686:O2|1,@14687 14687:O3|2,@14688,0 14688:O3|@14690,@14692,@14689 14689:O2|@14694,@20131 14690:O2|@14691,@20131 14691:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19968| 14692:O2|@14693,@20131 14693:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19969| 14694:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19970|14,0,@1486 14695:O2|@14697,@14696 14696:O2|@14698,0 14697:S12|757365576974685061726d73 14698:O4|@20043,69,@14699,0 14699:O7|@14697,2,@14701,@14700,@390,0,0 14700:O3|2,@12440,@14365 14701:O2|1,@14702 14702:O3|2,@14703,0 14703:O2|@14704,@371 14704:D3,80|4889c1498d47e0483b45107303ff55404989c748c740f80300000048bb209e27c9a37f000048891848894808488b520848895010488060ffbfc390909090909000000000000000004800000000000000|@14706,15,@19972|29,0,@14705 14705:D4,40|483b65187303ff55484c8b4210488b5a08ff25290000009000000000000000002000000000000000|@14425,2097151,@19971,@14370| 14706:S24|4d414b455f28292e757365496e746f456e76283129283129 14707:O2|@14709,@14708 14708:O2|@14710,0 14709:S16|7072696e74446570746846756e546167 14710:O4|@20043,69,@14711,0 14711:O7|@14709,2,@14712,@14036,@390,0,0 14712:O2|1,@14713 14713:O3|2,@14714,0 14714:O3|@14716,@14718,@14715 14715:O2|@14720,@20132 14716:O2|@14717,@20132 14717:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19973| 14718:O2|@14719,@20132 14719:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19974| 14720:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19975|14,0,@1486 14721:O2|@10770,@14722 14722:O2|@14723,0 14723:O4|@20043,69,@14724,0 14724:O7|@10770,2,@14726,@14725,@390,0,0 14725:O3|2,@467,@14744 14726:O2|1,@14727 14727:O3|2,@14728,0 14728:O1|@14729 14729:D5,464|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9057e60eb06f641ff107558a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9057e08eb1af641ff1074144889c148b8f07206c9a37f0000488b5d0890ff13a801750c480fb6480a488d4c0901eb034889c14881f9f1000000740948c7c103000000eb0748c7c105000000a801740948c7c203000000eb08488b10488d5412015250ff35320100004989c84889e348c7c00100000090ff1526010000a8017558488b08ff7108ff3148bb081f0bc9a37f0000488b042448ba90c8dc00000000009090ff124883f801741148b828a427c9a37f0000488b5d0890ff13f6042401751c488b0c24488b01f641ff10740348f7d8488d440001eb09e939000000488b0424498d4fd8483b4d107303ff55404989cf48c741f8020000004883c4085a48895108488901488d411848c740f801000000488908eb0748c7c001000000a8017523488b00498d4ff0483b4d107303ff55404989cf48c741f801000000488b00488901eb0748c7c101000000f6c101741348b8c0a427c9a37f0000488b5d08909090ff13488b014883c418c3909090909090900000000000000000c801000000000000|@14739,2097151,@19976,@14740,@14738|94,0,@219 216,0,@3307 230,0,I233 250,0,@14730 416,0,@14734 14730:O4|5,@14732,0,@14731 14731:O5|@14733,297,0,297,0 14732:S8|4f766572666c6f77 14733:S21|2e2f62617369732f4c61726765576f72642e736d6c 14734:O4|8,@14736,@14737,@14735 14735:O5|@7370,548,0,548,0 14736:S10|436f6e76657273696f6e 14737:S21|496e76616c696420776f726420636f6e7374616e74 14738:D9,3136|483b65187303ff55484983f80574274983f80374184983f807740948c7c105000000eb1948c7c111000000eb1048c7c115000000eb0748c7c12100000053514150504889da909090ff12a8017552488b0848833961754eff7108488b0424488b54242090ff12a8017558488b08488139ef000000755e48837c241005755bff7108488b0424488b5424289090ff12a801755e488b08488139f10000007415eb0ae97b0b0000e98c090000488139b1000000756948837c241805753a4c8b4c2428eb05e91c0900004c8b410848c7c301000000eb0ae956050000e98003000048c7c001000000909090ff156a0b0000eb5de96003000048c7c20100000048c7c301000000488b71085356524889f0488b5424409090ff12a8017559eb05e970010000488b08488b11f6c20174084883fa617c67eb06f642ff10756448c7c361000000f6c3017419f644243801eb05e99a080000740b488d5bff48035c24387105ff5570ebf0f6c201740ff6c301740a483bd3eb0ae9c8000000ff5570ebf17d6aff710852488b5c2448488b44242048ba50a9dc0000000000eb0ae958000000e95300000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e911ffffff48833c2401743a498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f801000000488918eb5448c7c001000000eb4b48833c2401743d498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f801000000488908eb0748c7c0010000004883c418eb5e48837c241805751f4c8b4c24284c8b042448c7c30100000048c7c001000000ff15aa090000eb5948c7c20100000048c7c301000000488b34245356524889f0488b542440909090ff12a8017559488b08488b11f6c201740f4883fa61eb05e9f80600007c67eb06f642ff10756448c7c361000000f6c3017419f644243801eb05e9d6060000740b488d5bff48035c24387105ff5570ebf0f6c201740ff6c301740a483bd3eb0ae9c8000000ff5570ebf17d6aff710852488b5c2448488b44242048ba50a9dc0000000000eb0ae958000000e95300000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e910ffffff48833c2401743a498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f801000000488918eb5448c7c001000000eb4b48833c2401743d498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f801000000488908eb0748c7c0010000004883c418eb5e48c7c001000000eb5a48837c24100575224c8b4c24204c8b410848c7c30100000048c7c001000000909090ff15e2070000eb5948c7c20100000048c7c301000000488b71085356524889f0488b542438909090ff12a801755b488b08eb0ae934050000e92f050000488b11f6c20174084883fa617c69eb06f642ff10756648c7c361000000f6c3017419eb05e945010000f644243001740b488d5bff48035c24307105ff5570ebf0f6c2017411f6c301740ceb05e9ce000000483bd3eb05ff5570ebf67d6bff710852488b5c2440488b44242048ba50a9dc0000000000eb0ae959000000e9540000009090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e908ffffff48833c2401743a498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f801000000488918eb5448c7c001000000eb4b48833c2401743d498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f801000000488908eb0748c7c0010000004883c4186a01eb60488139f10000007409488139b1000000755348837c241005756448837c241005751f4c8b4c24204c8b410848c7c30100000048c7c001000000ff1502060000eb5e48c7c20100000048c7c301000000488b71085356524889f0488b542438eb0ae958030000e980010000909090ff12a8017559488b08488b11f6c201eb05e96701000074084883fa617c67eb06f642ff10756448c7c361000000f6c301eb05e90c0300007412f644243001740b488d5bff48035c24307105ff5570ebf0f6c201740ff6c301740a483bd3eb0ae9c8000000ff5570ebf17d6aff710852488b5c2440488b44242048ba50a9dc0000000000eb0ae958000000e95300000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e904ffffff48833c2401743a498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f801000000488918eb5448c7c001000000eb4b48833c2401743d498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f801000000488908eb0748c7c0010000004883c418eb5e48837c24100575234c8b4c24204c8b44240848c7c30100000048c7c001000000909090ff1536040000eb5948c7c20100000048c7c301000000488b7424085356524889f0488b5424389090ff12a8017559488b08488b11f6c201740feb05e9630100004883fa617c67eb06f642ff10756448c7c361000000f6c3017419f644243001eb05e93d010000740b488d5bff48035c24307105ff5570ebf0f6c201740ff6c301740a483bd3eb0ae9c8000000ff5570ebf17d6aff710852488b5c2440488b44242048ba50a9dc0000000000eb0ae958000000e95300000090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e911ffffff48833c2401743a498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f801000000488918eb5448c7c001000000eb4b48833c2401743d498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f801000000488908eb0748c7c0010000004883c4186a01eb0948c7c0010000006a014883f801753f498d47d8483b45107303ff55404989c748c740f802000000488b4c24084889480848c700010000004889c1488d401848c740f8010000004889084883c430c34883c430c34883391372064883391b76064883394175174c8b442408488b5c2418488b41084883c420e9a1f5ffff48837c24080575214c8b4c24184c8b042448c7c30100000048c7c0010000004883c420ff25f801000048c7c20100000048c7c301000000488b34245356524889f0488b542430909090ff12a8017562488b08488b11f6c20174084883fa617c56eb06f642ff10756548c7c361000000f6c3017412f644242801740b488d5bff48035c24287105ff5570ebf0f6c201740af6c3017405483bd3eb05ff5570ebf67d70ff710852488b5c2438488b442420eb0ae9b8000000e96300000048ba50a9dc0000000000ff12a8017417eb05e94c000000f6042401740a488d40ff480304247105ff5570ebf1a80174064883e8607105ff5570ebf54883c4085e4889c348c7c2030000004883c418483b6518730aeb05e908000000ff5548e91dffffff48833c2401743d498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f8010000004889184883c438c348c7c0010000004883c438c348833c24017440498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f8010000004889084883c438c348c7c0010000004883c438c348c7c0010000004883c420c3909090900000000000000000380c000000000000|@14742,2097151,@19978,@14741,@14741,@14741,@14741,@14741,@14741|399,0,I108 851,0,I108 1322,0,I108 1815,0,I108 2271,0,I108 2844,0,I108 14739:S45|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129776f72644f66537472696e67283129 14740:D3,120|483b4210750848c7c001000000c3f6420801751a4889c14883c110488b520848d1e9480fb60c0a488d4c0901eb04488b4a084883c002498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f801000000488910c390909000000000000000007000000000000000|@10844,7,@19977| 14741:D3,760|483b65187303ff55484151534150504c89c04c89ca909090ff12a8017554488b08488b11f6c20174084883fa617c5deb06f642ff10755af6c20174084883fa737f6aeb06f642ff107467ff71085248c7c321000000488b44242048ba50a9dc0000000000ff12a8017417f60424017411eb05e917020000488d40ff480304247105ff5570ebf1a8017412eb0ae93a000000e9350000004883e8607105ff5570ebf54c8b4c24284883c408eb0ae91a000000e91500000041584889c348c7c0030000004883c420e935fffffff6c201740b4881fa830000007c5ceb06f642ff107559f6c201740b4881fa8d0000007f64eb06f642ff107461ff71085248c7c321000000488b44242048ba50a9dc0000000000909090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a8017415eb0ae94c000000e9470000004881e8820000007105ff5570ebf2a8017412eb0ae92e000000e9290000004883c0147105ff5570ebf54c8b4c24284883c40841584889c348c7c0030000004883c420e97afefffff6c201740b4881fac30000007c59eb06f642ff107556f6c201740b4881facd0000007f65eb06f642ff107462ff71085248c7c321000000488b44242048ba50a9dc0000000000ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a8017415eb0ae94c000000e9470000004881e8c20000007105ff5570ebf2a80174124883c014eb0ae92a000000e9250000007105ff5570ebe94c8b4c24284883c40841584889c348c7c0030000004883c420e9c2fdffff48833c2401743d498d5fd8483b5d107303ff55404989df48c743f802000000488b74240848897308488b742410488933488d431848c740f8010000004889184883c420c348c7c0010000004883c420c348833c24017440498d47d8483b45107303ff55404989c748c740f802000000488b4c240848894808488b4c24104889084889c1488d401848c740f8010000004889084883c420c348c7c0010000004883c420c3909090909090900000000000000000f002000000000000|@14743,2097151,@19979|92,0,I108 265,0,I108 452,0,I108 14742:S11|7363616e576f7264283329 14743:S29|7363616e576f7264283329726561645f6865785f646967697473283329 14744:O5|5,0,@1599,@1597,0 14745:O2|@14747,@14746 14746:O2|@14748,0 14747:S16|6d6178496e6c696e6553697a65546167 14748:O4|@20043,69,@14749,0 14749:O7|@14747,2,@14750,@14620,@390,0,0 14750:O2|1,@14751 14751:O3|2,@14752,0 14752:O3|@14754,@14756,@14753 14753:O2|@14758,@20123 14754:O2|@14755,@20123 14755:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19980| 14756:O2|@14757,@20123 14757:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19981| 14758:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19982|14,0,@1486 14759:O2|@14761,@14760 14760:O2|@14762,0 14761:S12|706172736574726565546167 14762:O4|@20043,69,@14763,0 14763:O7|@14761,2,@14764,@13933,@390,0,0 14764:O2|1,@14765 14765:O3|2,@14766,0 14766:O3|@14768,@14770,@14767 14767:O2|@14772,@20125 14768:O2|@14769,@20125 14769:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19983| 14770:O2|@14771,@20125 14771:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19984| 14772:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19985|14,0,@1486 14773:O2|@14775,@14774 14774:O2|@14776,0 14775:S14|636f6e76537472696e674e616d65 14776:O4|@20043,69,@14777,0 14777:O7|@14775,2,@14778,@467,@390,0,0 14778:O2|1,@14779 14779:O3|2,@8060,0 14780:O2|@14782,@14781 14781:O2|@14783,0 14782:S14|7072696e744f7574707574546167 14783:O4|@20043,69,@14784,0 14784:O7|@14782,2,@14785,@14019,@390,0,0 14785:O2|1,@14786 14786:O3|2,@14787,0 14787:O3|@14789,@14791,@14788 14788:O2|@14793,@20194 14789:O2|@14790,@20194 14790:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@19986| 14791:O2|@14792,@20194 14792:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@19987| 14793:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@19988|14,0,@1486 14794:O2|@1599,@14795 14795:O2|@14796,0 14796:O4|@20047,69,@14797,0 14797:O2|@14798,0 14798:O3|@1599,@390,@14799 14799:O3|@14801,@14800,@1600 14800:O4|1,@20259,0,0 14801:O2|1,@14802 14802:O3|2,@14803,0 14803:O4|I53,@20258,1,1 14804:O1|@14805 14805:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@14141,1,@19989|2,0,@413 14806:O2|@14808,@14807 14807:O2|@14809,0 14808:S21|636f6d70696c657256657273696f6e4e756d626572 14809:O4|@20043,69,@14810,0 14810:O7|@14808,2,@14811,@468,@390,0,0 14811:O2|1,@14812 14812:O3|2,560,0 14813:O2|@14815,@14814 14814:O2|@14816,0 14815:S9|556e6976657273616c 14816:O4|@20058,69,@14817,0 14817:O4|@14815,@661,@14818,@390 14818:O6|@14820,I48,0,@390,@14819,0 14819:O1|@14870 14820:O4|1,@20261,@20262,@20260 14821:O1|@14822 14822:D4,40|483b65187303ff554848c7c315000000ff252a000000909000000000000000002000000000000000|@377,2097151,@19990,@375| 14823:O2|@12444,@14867 14824:O2|@14826,@14825 14825:O2|@14827,0 14826:S10|74616750726f6a656374 14827:O4|@20043,69,@14828,0 14828:O7|@14826,2,@14830,@14829,@390,0,0 14829:O3|2,@14836,@14835 14830:O2|1,@14831 14831:O3|2,@14832,0 14832:O1|@14833 14833:D3,24|488b4010c390909000000000000000001000000000000000|@14834,1,@19991| 14834:S29|556e6976657273616c2e74616750726f6a6563742d2370726f6a656374 14835:O3|2,@12442,@14838 14836:O5|5,@14837,@13945,@13944,@390 14837:O2|@14838,0 14838:O3|6,@20264,79992 14839:O2|@13945,@14840 14840:O2|@14841,0 14841:O4|@20047,69,@14842,0 14842:O2|@13944,0 14843:O2|@14845,@14844 14844:O2|@14846,0 14845:S9|746167496e6a656374 14846:O4|@20043,69,@14847,0 14847:O7|@14845,2,@14849,@14848,@390,0,0 14848:O3|2,@14836,@14854 14849:O2|1,@14850 14850:O3|2,@14851,0 14851:O1|@14852 14852:D3,24|488b4008c390909000000000000000001000000000000000|@14853,1,@19992| 14853:S27|556e6976657273616c2e746167496e6a6563742d23696e6a656374 14854:O3|2,@14838,@12442 14855:O2|@14857,@14856 14856:O2|@14858,0 14857:S5|7461674973 14858:O4|@20043,69,@14859,0 14859:O7|@14857,2,@14861,@14860,@390,0,0 14860:O3|2,@14836,@14866 14861:O2|1,@14862 14862:O3|2,@14863,0 14863:O1|@14864 14864:D3,24|488b00c39090909000000000000000001000000000000000|@14865,1,@19993| 14865:S19|556e6976657273616c2e74616749732d236973 14866:O3|2,@12442,@393 14867:O2|@14868,0 14868:O4|@20047,69,@14869,0 14869:O2|@12443,0 14870:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@19994|2,0,@2058 14871:O2|@8060,@14872 14872:O2|@14873,0 14873:O4|@20043,69,@14874,0 14874:O7|@8060,2,@14876,@14875,@390,0,0 14875:O3|2,@467,@467 14876:O2|1,@14877 14877:O3|2,@14878,0 14878:O1|@14879 14879:D6,104|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c09015150ff355a0000004989c14989e04889cb48c7c0010000009090ff154a00000048bae8ea17c9a37f00004883c418ff253e00000090909090909000000000000000006000000000000000|@14885,2097151,@19995,@14886,@14880,@7950|64,0,@7949 14880:D5,584|483b65187303ff5548a8017508f6c3017503ff5570483bc3750848c7c001000000c34151415053488b5c2408ff152e020000a801755e488b08488b11483b15250200007432f6c201755c4889d648bf509adc000000000048c7c11100000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901755c488b00488b4808f6c1017509f60424017503ff5570483b0c247467eb05e937010000f6c101740d4883f9017d0deb43e9dd000000f641ff107538488b5c2410f6c301740948c7c203000000eb08488b13488d541201f6c1017411eb05e9b0000000f6c2017405483bcaeb05ff5570ebf67c1848b8f07206c9a37f0000488b5d08eb05e96200000090ff13f6c30175134883c11048d1e9480fb60c0b488d4c0901eb034889d9488b5008f6c20174064883c2027105ff5570ebf5498d77d8483b75107303ff55404989f748c746f8020000004889560848890e488d4e1848c741f801000000488931eb0748c7c1010000004883f901750948c7c001000000eb55488b4008483b65187303ff5548e99ffeffff488b00498d4fe8483b4d107303ff55404989cf48c741f802000000488b400848894108488911498d47f0483b45107303ff55404989c748c740f801000000488908eb0ce90700000048c7c001000000a80174164889c148b8a8cd27c9a37f0000488b5d08909090ff13488b08ff314c8b4c24184c8b442410488b5c2408488b4108e8f2fdffff4889c1498d47e8483b45107303ff55404989c748c740f80200000048894808594883c418488908c3909000000000000000004002000000000000|@14889,2097151,@19997,@14888,I48|79,0,I48 235,0,@219 480,0,@14881 14881:O4|8,@14736,@14883,@14882 14882:O5|@14884,91,0,91,0 14883:S23|496e76616c696420737472696e6720636f6e7374616e74 14884:S32|6d6c736f757263652f4d4c436f6d70696c65722f426f6f742f4d6973632e4d4c 14885:S22|4d6973632e756e657363617065537472696e67283129 14886:D3,224|a8017509f64210017503ff5570483b4210750848c7c001000000c3a80174084883f8017d08eb35f640ff10752f488b5a08f6c301740948c7c103000000eb08488b0b488d4c0901a801740af6c1017405483bc1eb05ff5570ebf67c154889c148b8f07206c9a37f0000488b5d089090ff13f6c30175164889c14883c11048d1e9480fb60c0b488d4c0901eb034889d9a80174064883c0027105ff5570ebf5498d77d8483b75107303ff55404989f748c746f8020000004889460848890e488d461848c740f801000000488930c39090900000000000000000d800000000000000|@14887,31,@19996|97,0,@219 14887:S28|4d6973632e756e657363617065537472696e67283129726472283129 14888:D5,1648|483b65187303ff554853504889da9090ff12a8017561488b08488339417209488139fd000000760c48c7c0010000004883c410c3488139b9000000755eff7108488b0424488b542410909090ff12a8017563488b08488139eb000000755c4c8b4c24104c8b410848c7c30900000048c7c001000000eb05e991050000ff1506060000a8017550488b08498d57d8483b55107303ff55404989d7eb05e93305000048c742f802000000488b590848895a08488b31eb0ae90d050000e923000000488932488d421848c740f8010000004889104883c418c348c7c0010000004883c418c3488139bd000000754f488b4108488b542410ff12a8017557488b08488b11f6c201740b4881fa810000007c54eb06f642ff107558f6c201740b4881fabf0000007f5aeb06f642ff107457f6c20174104881ea80000000eb05e9b10000007105ff5570ebebf6c201740f4883fa01eb05e98e0000007d08eb34f642ff10752eeb05e971000000f6c201741ceb05e9650000004881faff0100007e25eb10e955000000e950000000f642ff10751348b8f83b06c9a37f0000488b5d08909090ff13498d5fd8483b5d107303ff55404989df48c743f802000000488b710848897308488913488d431848c740f8010000004889184883c418c348c7c0010000004883c418c348c7c0010000004883c418c348833945753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70245000000488d421848c740f8010000004889104883c418c3488139b9000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c702b9000000488d421848c740f8010000004889104883c418c3488139e5000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c7021b000000488d421848c740f8010000004889104883c418c3488139cd000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70219000000488d421848c740f8010000004889104883c418c3488139ed000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70217000000488d421848c740f8010000004889104883c418c3488139dd000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70215000000488d421848c740f8010000004889104883c418c3488139e9000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70213000000488d421848c740f8010000004889104883c418c3488139c5000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c70211000000488d421848c740f8010000004889104883c418c3488139c3000000753b498d57d8483b55107303ff55404989d748c742f802000000488b590848895a0848c7020f000000488d421848c740f8010000004889104883c418c34883391372064883391b7606488339417565488b5108524889d0488b542418ff12a801752e488b084883391372064883391b7606488339417513488b51084883c408483b65187303ff5548ebc9488b0424eb04488b0424488b5424184883c408909090ff12a801756d488b08488139b90000007413eb05e96c00000048c7c0010000004883c418c3498d57e8483b55107303ff55404989d748c742f802000000488b590848895a0848be509adc0000000000488932498d47f0483b45107303ff55404989c748c740f8010000004889104883c418eb05e901000000c348c7c0010000004883c418c34883396172654883396577644c8b4c24104c8b042448c7c30700000048c7c001000000ff152e010000a8017549488b08498d57d8483b55107303ff55404989d748c742f802000000488b590848895a08488b31488932488d421848c740f8010000004889104883c418eb0ae912000000e90d000000c348c7c0010000004883c418c348c7c0010000004883c418c348c7c0010000004883c418c3498d57d8483b55107303ff55404989d748c742f802000000488b590848895a08488b31488932488d421848c740f8010000004889104883c410c3498d47e8483b45107303ff55404989c748c740f802000000488b0c244889480848b9509adc00000000004889084889c1498d47f0483b45107303ff55404989c748c740f8010000004889084883c410c390909000000000000000006806000000000000|@14891,2097151,@19998,@14892,@14890|400,0,@95 1275,0,I48 1583,0,I48 14889:S34|4d6973632e756e657363617065537472696e67283129636f6e764368617273283129 14890:D3,552|483b65187303ff55484883fb017574a801740b4881f8ff0100007e10eb06f640ff10750848c7c001000000c3a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1eeb06f640ff1075164889c148b8f83b06c9a37f0000488b5d08909090ff13498d4fd8483b4d107303ff55404989cf48c741f802000000eb05e9170000004c894108488901488d411848c740f801000000488908c34150504151534c89c04c89ca90ff12a801755a488b08488339617256488b11f6c20174084883fa737f64eb06f642ff107461488b1c24f6c30174064883eb027105ff5570ebf5ff7108535248c7c315000000488b44242848ba50a9dc0000000000ff12a801741cf6042401eb0ae955000000e944000000740a488d40ff480304247105ff5570ebf1a8017412eb0ae928000000e9230000004883e8607105ff5570ebf54c8b4c24204883c4084c8b4424085b4883c428e9a6feffff48c7c0010000004883c420c3488b442410a801740b4881f8ff0100007e08eb1df640ff107417488b0c24f6c10174084883f9017f08eb12f641ff10750c48c7c0010000004883c420c3a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1beb06f640ff10751348b8f83b06c9a37f0000488b5d08909090ff13498d4fd8483b4d107303ff55404989cf48c741f802000000488b54241848895108488901488d411848c740f8010000004889084883c420c390909000000000000000002002000000000000|@14894,2097151,@20000|88,0,@95 248,0,I108 460,0,@95 14891:S16|436861722e7363616e42617365283229 14892:D3,1016|483b65187303ff55484883fb017574a801740b4881f8ff0100007e10eb06f640ff10750848c7c001000000c3a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e1eeb06f640ff1075164889c148b8f83b06c9a37f0000488b5d08909090ff13498d4fd8483b4d107303ff55404989cf48c741f802000000eb05e9170000004c894108488901488d411848c740f801000000488908c34150504151534c89c04c89ca90ff12a8017563488b0848833961725f48833973775e488b1424f6c20174064883ea027105ff5570ebf5ff710852ff3148c7c321000000488b44242848ba50a9dc0000000000909090ff12a8017410f6042401740a488d40ff480304247105ff5570ebf1a8017417eb0fe91f020000e928000000e9230000004883e8607105ff5570ebf54c8b4c24204883c4084c8b4424085b4883c428e9b9feffff488139c30000007266488139cd0000007762488b1424f6c20174064883ea027105ff5570ebf5ff7108ff315248c7c321000000488b44242848ba50a9dc0000000000909090ff12a8017412f644240801740b488d40ff48034424087105ff5570ebf0a80174154881e8c2000000eb0ae92f000000e92a0000007105ff5570ebe6a80174064883c0147105ff5570ebf54c8b4c24204c8b4424105b4883c430e916feffff4881398300000072634881398d000000775f488b1424f6c20174064883ea027105ff5570ebf5ff7108ff315248c7c321000000488b44242848ba50a9dc0000000000ff12a8017412f644240801740b488d40ff48034424087105ff5570ebf0a80174154881e882000000eb0ae92f000000e92a0000007105ff5570ebe6a80174064883c0147105ff5570ebf54c8b4c24204c8b4424105b4883c430e976fdffff488b1424f6c20174084883faff7c08eb21f642ff10741b488b542410f6c201740b4881faff0100007f08eb12f642ff10750c48c7c0010000004883c420c3f6c20174084883fa017d08eb1cf642ff107516f6c201740b4881faff0100007e18eb06f642ff10751048b8f83b06c9a37f0000488b5d08ff13498d5fd8483b5d107303ff55404989df48c743f802000000488b74241848897308488913488d431848c740f8010000004889184883c420c3488b0424a80174084883f8ff7c08eb20f640ff10741a488b442410a801740b4881f8ff0100007f08eb12f640ff10750c48c7c0010000004883c420c3a80174084883f8017d08eb1bf640ff107515a801740b4881f8ff0100007e19eb06f640ff10751148b8f83b06c9a37f0000488b5d0890ff13498d4fd8483b4d107303ff55404989cf48c741f802000000488b54241848895108488901488d411848c740f8010000004889084883c420c39090900000000000000000f003000000000000|@14893,2097151,@19999|88,0,@95 233,0,I108 385,0,I108 548,0,I108 755,0,@95 926,0,@95 14893:S16|436861722e7265616448657827283429 14894:S15|436861722e72656164446563283429 14895:O2|@10761,@14896 14896:O2|@14897,0 14897:O4|@20043,69,@14898,0 14898:O7|@10761,2,@14900,@14899,@390,0,0 14899:O3|2,@467,@468 14900:O2|1,@14901 14901:O3|2,@14902,0 14902:O1|@14903 14903:D9,480|483b65187303ff5548a801740948c7c103000000eb08488b08488d4c0901f6c10174084883f9077c5feb06f641ff10755c4989c149c7c00500000048c7c3010000004c89c8909090ff15aa010000483b05ab0100007463a801753e4889c648bf40ff17c9a37f000048c7c11500000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901eb0ae909000000e904000000745deb034989c141f6c101740948c7c003000000eb08498b01488d440001a801740f4883f809eb05e9790000007c62eb06f640ff10755f49c7c00700000048c7c3010000004c89c89090ff1526010000483b0527010000744da8017540eb05e9420000004889c648bfa0e027c9a37f000048c7c11700000048d1e9483bc9f3a6488d7c3f01488d743601488d4c0901eb0ae907000000e902000000740948c7c003000000eb0748c7c00500000041f6c101740948c7c103000000eb08498b09488d4c0901514151ff35b90000004989c04889e348c7c00100000048ba08cd20c9a37f00009090ff15a2000000a8017523488b00498d4ff0483b4d107303ff55404989cf48c741f801000000488b00488901eb0748c7c101000000f6c101741048b8b8e027c9a37f0000488b5d08ff13488b014883c418c3909090909090900000000000000000d801000000000000|@14909,2097151,@20001,@3795,@7972,@3795,@14904,@14908,@10834|96,0,@7972 251,0,@14904 366,0,@10833 435,0,@14905 14904:S3|7e3078 14905:O4|8,@14736,@14907,@14906 14906:O5|@7370,537,0,537,0 14907:S24|496e76616c696420696e746567657220636f6e7374616e74 14908:D3,120|483b4210750848c7c001000000c3f6420801751a4889c14883c110488b520848d1e9480fb60c0a488d4c0901eb04488b4a084883c002498d57d8483b55107303ff55404989d748c742f8020000004889420848890a488d421848c740f801000000488910c390909000000000000000007000000000000000|@10844,7,@20002| 14909:S44|494e495449414c4953455f28292e696e6974476c6f62616c456e76283129696e744f66537472696e67283129 14910:O2|@14912,@14911 14911:O2|@14913,0 14912:S9|6f6666736574546167 14913:O4|@20043,69,@14914,0 14914:O7|@14912,2,@14915,@14036,@390,0,0 14915:O2|1,@14916 14916:O3|2,@14917,0 14917:O3|@14919,@14921,@14918 14918:O2|@14923,@20119 14919:O2|@14920,@20119 14920:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@20003| 14921:O2|@14922,@20119 14922:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@20004| 14923:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@20005|14,0,@1486 14924:O2|@14926,@14925 14925:O2|@14927,0 14926:S13|6c696e654c656e677468546167 14927:O4|@20043,69,@14928,0 14928:O7|@14926,2,@14929,@14620,@390,0,0 14929:O2|1,@14930 14930:O3|2,@14931,0 14931:O3|@14933,@14935,@14932 14932:O2|@14937,@20133 14933:O2|@14934,@20133 14934:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@20006| 14935:O2|@14936,@20133 14936:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@20007| 14937:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@20008|14,0,@1486 14938:O2|@14940,@14939 14939:O2|@14941,0 14940:S9|627974654172726179 14941:O4|@20047,69,@14942,0 14942:O2|@14943,0 14943:O3|@14940,@390,@14944 14944:O3|@14946,@14949,@14945 14945:O3|@14940,@417,@416 14946:O2|1,@14947 14947:O3|2,@14948,0 14948:O4|I251,@20265,2,1 14949:O4|1,@20094,0,0 14950:O2|@14952,0 14951:S13|6c696e654e756d626572546167 14952:O4|@20043,69,@14953,0 14953:O7|@14951,2,@14954,@14036,@390,0,0 14954:O2|1,@14955 14955:O3|2,@14956,0 14956:O3|@14958,@14960,@14957 14957:O2|@14962,@20118 14958:O2|@14959,@20118 14959:D3,48|488b00483b4208740848c7c001000000c348c7c003000000c39090909090909000000000000000002800000000000000|@13940,5,@20009| 14960:O2|@14961,@20118 14961:D3,72|4889c1498d47d8483b45107303ff55404989c748c740f80400000048c74018010000004889481048c740088b000000488b5208488910c39000000000000000004000000000000000|@13940,7,@20010| 14962:D3,56|488b08483b4a0874144889c148b878e107c9a37f0000488b5d0890ff13488b48104889c8c390909000000000000000003000000000000000|@13940,7,@20011|14,0,@1486 14963:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@20012|2,0,@2058 14964:O2|47,@14965 14965:O2|@14966,0 14966:O4|@20043,69,@14967,0 14967:O7|47,2,@391,@13854,@390,0,0 14968:O2|@14970,@14969 14969:O2|@14971,0 14970:S3|646976 14971:O4|@20043,69,@14972,0 14972:O7|@14970,2,@391,@13854,@390,0,0 14973:O2|@14975,@14974 14974:O2|@14976,0 14975:S6|766563746f72 14976:O4|@20047,69,@14977,0 14977:O2|@14978,0 14978:O3|@14975,@390,@14979 14979:O3|@14981,@15062,@14980 14980:O3|@14975,@417,@416 14981:O2|1,@14982 14982:O3|2,@14984,@14983 14983:O2|@15000,0 14984:O4|@14986,@20266,@14995,@14985 14985:O1|@14998 14986:O1|@14987 14987:D3,72|4889c1498d47e8483b45107303ff55404989c748c740f80200000048ba80ee27c9a37f000048891048894808488060ffbfc390909090909000000000000000004000000000000000|@14990,7,@20014|29,0,@14988 14988:D3,184|483b65187303ff554848b9ffffffffffffff00482348f8488d4c090148beffffffffffffff00482373f8488d743601483bce756b48c7c60100000051505352483b742418750c48c7c0030000004883c420c3488b0424488b4808488b542410488b54b2fc488b5c2408488b5cb3fc564889d0488b11909090ff124883f8017413584883c0024889c6483b65187303ff5548ebac48c7c0010000004883c428c348c7c001000000c3900000000000000000b000000000000000|@14989,1048575,@20013|11,0,36028797018963967 30,0,36028797018963967 14989:S9|766563746f722d6571 14990:S11|766563746f722d65712829 14991:O1|@14992 14992:D3,32|48b8f8ef27c9a37f0000c3909090909000000000000000001800000000000000|@13958,1,@20016|2,0,@14993 14993:O1|@14994 14994:D3,32|48b898c906c9a37f0000c3909090909000000000000000001800000000000000|@13957,1,@20015|2,0,@413 14995:O1|@14996 14996:D3,24|48c7c005000000c300000000000000001000000000000000|@14997,1,@20017| 14997:S12|626f7865642d766563746f72 14998:D3,24|48c7c003000000c300000000000000001000000000000000|@14999,1,@20018| 14999:S11|73697a652d766563746f72 15000:O4|@20054,69,@15001,0 15001:O3|2,4,@15002 15002:O5|@590,@15004,@13161,@15003,@548 15003:O4|@14984,@14986,@14995,@14985 15004:O2|@594,@15005 15005:O2|@15007,@15006 15006:O2|@15053,@15052 15007:O2|@1148,@15008 15008:O3|0,@15009,@576 15009:O8|@15011,@14990,0,0,@15010,0,0,1 15010:O2|@15039,0 15011:O2|7,@15012 15012:O8|@15013,@14989,0,@1090,@14152,0,3,1 15013:O3|10,@14155,@15014 15014:O4|1,@14163,@15015,@509 15015:O3|0,@15017,@15016 15016:O2|@15037,0 15017:O4|1,@15019,@442,@15018 15018:O4|1,@15022,@15021,@509 15019:O4|3,@15020,@502,1 15020:O2|@6995,@14177 15021:O2|9,@15031 15022:O4|3,@15023,@1068,1 15023:O2|@15025,@15024 15024:O2|@15028,0 15025:O2|@15026,1 15026:O4|3,@15027,@2450,1 15027:O2|@505,@14177 15028:O2|@15029,1 15029:O4|3,@15030,@2450,1 15030:O2|@506,@14177 15031:O2|@15032,0 15032:O2|@15033,1 15033:O4|3,@15034,@532,1 15034:O2|@14178,@15035 15035:O2|@15036,0 15036:O2|@442,1 15037:O2|@15038,1 15038:O3|@547,2,@509 15039:O2|1,@15040 15040:O2|@15041,0 15041:O3|2,0,@15042 15042:O2|@15043,0 15043:O3|0,@545,@15044 15044:O2|@15046,@15045 15045:O2|@15050,0 15046:O4|3,@15047,@2450,1 15047:O2|@505,@15048 15048:O2|@15049,0 15049:O2|@7758,1 15050:O4|3,@15051,@2450,1 15051:O2|@506,@15048 15052:O2|@15056,@15055 15053:O2|@15054,@573 15054:O3|0,@20266,0 15055:O2|@15059,0 15056:O2|@1155,@15057 15057:O3|0,@15058,@576 15058:O8|@2296,@14997,0,0,@437,0,0,1 15059:O2|@1162,@15060 15060:O3|0,@15061,@576 15061:O8|@442,@14999,0,0,@437,0,0,1 15062:O4|1,@20267,1,0 15063:O2|60,@15064 15064:O2|@15065,0 15065:O4|@20043,69,@15066,0 15066:O7|60,2,@391,@392,@390,0,0 15067:O2|62,@15068 15068:O2|@15069,0 15069:O4|@20043,69,@15070,0 15070:O7|62,2,@391,@392,@390,0,0 15071:O2|@15073,@15072 15072:O2|@15074,0 15073:S7|52756e43616c6c 15074:O4|@20058,69,@15075,0 15075:O4|@15073,@661,@15076,@390 15076:O6|@15078,I48,0,@390,@15077,0 15077:O1|@15365 15078:O4|1,@20269,@20270,@20268 15079:O2|@15361,@15360 15080:O2|@15082,@15081 15081:O2|@15083,0 15082:S9|537562736372697074 15083:O4|@20043,69,@15084,0 15084:O7|@15082,0,@15085,@8607,@390,0,0 15085:O2|1,@949 15086:O2|@15088,@15087 15087:O2|@15089,0 15088:S10|756e7361666543617374 15089:O4|@20043,69,@15090,0 15090:O7|@15088,2,@15092,@15091,@390,0,0 15091:O3|2,@15097,@15096 15092:O2|1,@15093 15093:O2|7,@15094 15094:O8|@439,@15095,0,0,@437,0,0,1 15095:S13|756e7361666543617374283129 15096:O3|6,@20273,79992 15097:O3|6,@20272,79992 15098:O2|@15100,@15099 15099:O2|@15101,0 15100:S8|5857696e646f7773 15101:O4|@20043,69,@15102,0 15102:O7|@15100,0,@15104,@15103,@390,0,0 15103:O3|2,@467,@8607 15104:O2|1,@975 15105:O2|@12143,@15106 15106:O2|@15107,0 15107:O4|@20043,69,@15108,0 15108:O7|@12143,0,@15109,@8607,@390,0,0 15109:O2|1,@12142 15110:O2|@15112,@15111 15111:O2|@15113,0 15112:S7|466f726569676e 15113:O4|@20043,69,@15114,0 15114:O7|@15112,0,@15115,@15103,@390,0,0 15115:O2|1,@15116 15116:O3|2,23,0 15117:O2|@14736,@15118 15118:O2|@15119,0 15119:O4|@20043,69,@15120,0 15120:O7|@14736,0,@15121,@15103,@390,0,0 15121:O2|1,@536 15122:O2|@15124,@15123 15123:O2|@15125,0 15124:S4|4661696c 15125:O4|@20043,69,@15126,0 15126:O7|@15124,0,@15127,@15103,@390,0,0 15127:O2|1,@15128 15128:O3|2,103,0 15129:O2|@15131,@15130 15130:O2|@15132,0 15131:S11|6164644f7665726c6f6164 15132:O4|@20043,69,@15133,0 15133:O7|@15131,2,@4403,@15134,@390,0,0 15134:O3|2,@15135,@14365 15135:O3|2,@15137,@15136 15136:O3|6,@20275,79992 15137:O3|6,@20274,79992 15138:O2|@10855,@15139 15139:O2|@15140,0 15140:O4|@20043,69,@15141,0 15141:O7|@10855,0,@15142,@8607,@390,0,0 15142:O2|1,@11749 15143:O2|@15145,@15144 15144:O2|@15146,0 15145:S6|537973457272 15146:O4|@20043,69,@15147,0 15147:O7|@15145,0,@15149,@15148,@390,0,0 15148:O3|2,@15150,@8607 15149:O2|1,@2296 15150:O3|3,@15151,@395 15151:O2|@1764,@15152 15152:O2|@15153,0 15153:O2|50,@15154 15154:O5|5,@11128,@1887,@1744,@390 15155:O2|@15157,@15156 15156:O2|@15158,0 15157:S3|446976 15158:O4|@20043,69,@15159,0 15159:O7|@15157,0,@15160,@8607,@390,0,0 15160:O2|1,@11112 15161:O2|@15163,@15162 15162:O2|@15164,0 15163:S7|45785472616365 15164:O4|@20043,69,@15165,0 15165:O7|@15163,0,@15167,@15166,@390,0,0 15166:O3|2,@15168,@8607 15167:O2|1,@13190 15168:O3|3,@15169,@395 15169:O2|@15171,@15170 15170:O2|@15172,0 15171:O2|49,@13393 15172:O2|50,@8607 15173:O2|@3166,@15174 15174:O2|@15175,0 15175:O4|@20043,69,@15176,0 15176:O7|@3166,0,@15177,@8607,@390,0,0 15177:O2|1,@442 15178:O2|@15180,@15179 15179:O2|@15181,0 15180:S8|4f766572666c6f77 15181:O4|@20043,69,@15182,0 15182:O7|@15180,0,@15183,@8607,@390,0,0 15183:O2|1,@11582 15184:O2|@15186,@15185 15185:O2|@15187,0 15186:S9|72756e5f63616c6c30 15187:O4|@20043,69,@15188,0 15188:O7|@15186,2,@15190,@15189,@390,0,0 15189:O3|2,@468,@15203 15190:O2|1,@15191 15191:O2|7,@15192 15192:O8|@15193,@15186,0,0,@437,0,1,1 15193:O3|10,@15195,@15194 15194:O2|7,@15199 15195:O2|@15196,0 15196:O4|1,0,0,@15197 15197:O4|3,@518,@15198,1 15198:O3|2,I189,0 15199:O8|@15201,@15202,0,@15200,@437,0,0,1 15200:O2|@1149,0 15201:O4|3,0,@1076,1 15202:S12|72756e5f63616c6c30283129 15203:O3|2,@923,@15204 15204:O3|6,@20276,79992 15205:O2|@15207,@15206 15206:O2|@15208,0 15207:S9|72756e5f63616c6c31 15208:O4|@20043,69,@15209,0 15209:O7|@15207,2,@15211,@15210,@390,0,0 15210:O3|2,@468,@15215 15211:O2|1,@15212 15212:O2|7,@15213 15213:O8|@15197,@15214,0,0,@437,0,0,1 15214:S12|72756e5f63616c6c31283129 15215:O3|2,@15204,@15216 15216:O3|6,@20277,79992 15217:O2|@15219,@15218 15218:O2|@15220,0 15219:S11|72756e5f63616c6c324332 15220:O4|@20043,69,@15221,0 15221:O7|@15219,2,@15223,@15222,@390,0,0 15222:O3|2,@468,@15243 15223:O2|1,@15224 15224:O2|7,@15225 15225:O8|@15226,@15219,0,0,@437,0,1,1 15226:O3|10,@15195,@15227 15227:O2|7,@15228 15228:O8|@15230,@15229,0,@15200,@437,0,1,1 15229:S14|72756e5f63616c6c324332283129 15230:O3|10,@15232,@15231 15231:O3|14,@15239,0 15232:O2|@15233,0 15233:O5|0,0,0,2,@15234 15234:O4|3,@15235,@1076,1 15235:O2|@15237,@15236 15236:O2|@15238,@6994 15237:O2|@679,1 15238:O2|@977,1 15239:O2|@15241,@15240 15240:O2|@15242,0 15241:O4|6,@6867,0,0 15242:O4|6,@6867,1,0 15243:O3|2,@15245,@15244 15244:O3|3,@15250,@395 15245:O3|3,@15246,@395 15246:O2|@15248,@15247 15247:O2|@15249,0 15248:O2|49,@15204 15249:O2|50,@15216 15250:O2|@15252,@15251 15251:O2|@15254,0 15252:O2|49,@15253 15253:O3|6,@20278,79992 15254:O2|50,@15255 15255:O3|6,@20279,79992 15256:O2|@15258,@15257 15257:O2|@15259,0 15258:S9|72756e5f63616c6c32 15259:O4|@20043,69,@15260,0 15260:O7|@15258,2,@15262,@15261,@390,0,0 15261:O3|2,@468,@15272 15262:O2|1,@15263 15263:O2|7,@15264 15264:O8|@15265,@15258,0,0,@437,0,1,1 15265:O3|10,@15195,@15266 15266:O2|7,@15267 15267:O8|@15269,@15268,0,@15200,@437,0,0,1 15268:S12|72756e5f63616c6c32283129 15269:O4|3,@15270,@1076,1 15270:O2|@15237,@15271 15271:O2|@15238,0 15272:O3|2,@15245,@15253 15273:O2|@15275,@15274 15274:O2|@15276,0 15275:S9|72756e5f63616c6c33 15276:O4|@20043,69,@15277,0 15277:O7|@15275,2,@15279,@15278,@390,0,0 15278:O3|2,@468,@15291 15279:O2|1,@15280 15280:O2|7,@15281 15281:O8|@15282,@15275,0,0,@437,0,1,1 15282:O3|10,@15195,@15283 15283:O2|7,@15284 15284:O8|@15286,@15285,0,@15200,@437,0,0,1 15285:S12|72756e5f63616c6c33283129 15286:O4|3,@15287,@1076,1 15287:O2|@15237,@15288 15288:O2|@15238,@15289 15289:O2|@15290,0 15290:O2|@7748,1 15291:O3|2,@15292,@15255 15292:O3|3,@15293,@1726 15293:O2|@15248,@15294 15294:O2|@15249,@15295 15295:O2|@15296,0 15296:O2|51,@15253 15297:O2|@15299,@15298 15298:O2|@15300,0 15299:S9|72756e5f63616c6c34 15300:O4|@20043,69,@15301,0 15301:O7|@15299,2,@15303,@15302,@390,0,0 15302:O3|2,@468,@15316 15303:O2|1,@15304 15304:O2|7,@15305 15305:O8|@15306,@15299,0,0,@437,0,1,1 15306:O3|10,@15195,@15307 15307:O2|7,@15308 15308:O8|@15310,@15309,0,@15200,@437,0,0,1 15309:S12|72756e5f63616c6c34283129 15310:O4|3,@15311,@1076,1 15311:O2|@15237,@15312 15312:O2|@15238,@15313 15313:O2|@15290,@15314 15314:O2|@15315,0 15315:O2|@7750,1 15316:O3|2,@15318,@15317 15317:O3|6,@20280,79992 15318:O3|3,@15319,@7783 15319:O2|@15248,@15320 15320:O2|@15249,@15321 15321:O2|@15296,@15322 15322:O2|@15323,0 15323:O2|52,@15255 15324:O2|@15326,@15325 15325:O2|@15327,0 15326:S9|72756e5f63616c6c35 15327:O4|@20043,69,@15328,0 15328:O7|@15326,2,@15330,@15329,@390,0,0 15329:O3|2,@468,@15345 15330:O2|1,@15331 15331:O2|7,@15332 15332:O8|@15333,@15326,0,0,@437,0,1,1 15333:O3|10,@15195,@15334 15334:O2|7,@15335 15335:O8|@15337,@15336,0,@15200,@437,0,0,1 15336:S12|72756e5f63616c6c35283129 15337:O4|3,@15338,@1076,1 15338:O2|@15237,@15339 15339:O2|@15238,@15340 15340:O2|@15290,@15341 15341:O2|@15315,@15342 15342:O2|@15343,0 15343:O2|@15344,1 15344:O4|6,@439,4,0 15345:O3|2,@15347,@15346 15346:O3|6,@20281,79992 15347:O3|3,@15348,@12957 15348:O2|@15248,@15349 15349:O2|@15249,@15350 15350:O2|@15296,@15351 15351:O2|@15323,@15352 15352:O2|@15353,0 15353:O2|53,@15317 15354:O2|@15356,@15355 15355:O2|@15357,0 15356:S6|546872656164 15357:O4|@20043,69,@15358,0 15358:O7|@15356,0,@15359,@15103,@390,0,0 15359:O2|1,@1248 15360:O2|@15362,0 15361:S4|53697a65 15362:O4|@20043,69,@15363,0 15363:O7|@15361,0,@15364,@8607,@390,0,0 15364:O2|1,@1213 15365:D3,40|48b870be08c9a37f0000488b5d0890ff139090909090909000000000000000002000000000000000|@2060,1,@20019|2,0,@2058 15366:O2|@830,@15367 15367:O2|@15368,0 15368:O4|@20043,69,@11866,0 15369:O2|@1589,@15370 15370:O2|@15371,0 15371:O4|@20047,69,@15372,0 15372:O2|@1587,0 15373:O2|@8565,@15374 15374:O2|@15376,@15375 15375:O2|@15401,0 15376:O4|@20047,69,@15377,0 15377:O2|@13119,@15378 15378:O2|@15379,0 15379:O7|@8565,@508,@15381,@15380,@390,0,0 15380:O3|2,@15399,@15398 15381:O2|1,@15382 15382:O3|14,@15383,0 15383:O2|@15385,@15384 15384:O2|@15388,@15387 15385:O2|7,@15386 15386:O8|@442,@8565,0,0,@437,0,0,1 15387:O2|@15394,0 15388:O2|7,@15389 15389:O8|@15390,@8565,0,0,@437,0,0,1 15390:O4|3,@15391,@8205,1 15391:O2|@15036,@15392 15392:O2|@15393,@518 15393:O2|@8204,1 15394:O2|7,@15395 15395:O8|@15396,@8565,0,0,@437,0,0,1 15396:O4|3,@15397,@2450,1 15397:O2|@505,@2452 15398:O5|5,@15400,@8565,@13119,@390 15399:O3|6,@20282,79992 15400:O2|@15399,0 15401:O4|@20043,69,@15379,0 15402:O2|@925,@15403 15403:O2|@15404,0 15404:O4|@20047,69,@15405,0 15405:O2|@924,0 15406:O2|61,@15407 15407:O2|@15408,0 15408:O4|@20043,69,@15409,0 15409:O7|61,2,@15411,@15410,@390,0,0 15410:O3|2,@15412,@393 15411:O2|3,2 15412:O3|3,@15413,@395 15413:O2|@15415,@15414 15414:O2|@15417,0 15415:O2|49,@15416 15416:O3|6,@20283,79996 15417:O2|50,@15416 15418:O2|@1599,@15419 15419:O2|@15420,0 15420:O4|@20047,69,@15421,0 15421:O2|@1597,0 15422:O2|@839,@15423 15423:O2|@15424,0 15424:O4|@20043,69,@11819,0 15425:O2|@1967,@15426 15426:O2|@15427,0 15427:O4|@20043,69,@11454,0 15428:O2|@478,@15429 15429:O2|@15430,0 15430:O4|@20047,69,@15431,0 15431:O2|@477,0 15432:O2|@405,@15433 15433:O2|@15434,0 15434:O4|@20047,69,@15435,0 15435:O2|@404,@15436 15436:O2|@429,@15437 15437:O2|@647,0 15438:O2|@15439,0 15439:O4|@20047,69,@15440,0 15440:O2|@469,0 15441:O3|@15443,@15442,0 15442:O2|@20292,@20293 15443:S7|3c737464696e3e 15444:D3,128|483b65187303ff5548a8017556ff30488b40089090e8e6ffffffff750848b89a2a28c9a37f0000504889650848c7c001000000488b542410ff124883c4085948894d084883c408c39090488b65084883c4085b48895d0848c7c0010000004883c408c348c7c001000000c3909090909000000000000000007800000000000000|@15446,1048575,@20021|31,0,$15444+74 15445:S24|506f6c794d4c2e72756e46756e6374696f6e283129283129 15446:S20|506f6c794d4c2e72756e4f6e456e747279283129 20022:MO1|@2 20023:MO1|1 20024:MO1|0 20025:MO1|0 20026:MO1|0 20027:MO1|@68 20028:MO1|@74 20029:MO1|@82 20030:MO1|0 20031:MO1|@119 20032:MO1|@147 20033:MO1|@191 20034:MO1|0 20035:MO1|@326 20036:MO1|2 20037:MO1|0 20038:MO1|0 20039:MO1|@20042 20040:MO1|@373 20041:MO1|38 20042:MO81|80,0,0,0,0,0,0,0,@380,0,@420,@425,@443,0,@458,@624,0,0,0,@637,@643,0,@655,0,0,0,@13849,@13855,0,0,0,0,0,0,@13861,0,@13890,0,0,0,0,@13896,@13899,@13903,@13907,@13911,@13915,@13919,@14964,0,0,0,0,@14968,@14973,@15063,@15067,@15071,@15366,@15369,@15373,@15402,@15406,@15418,0,@15422,0,0,0,0,0,0,0,0,0,0,0,@15425,@15428,@15432,@379 20043:MO1|@385 20044:MO1|@400 20045:MO1|@411 20046:MO1|1 20047:MO1|@385 20048:MO1|@454 20049:MO1|0 20050:MO1|@411 20051:MO1|1 20052:MO1|@411 20053:MO1|@385 20054:MO1|@385 20055:MO1|@553 20056:MO1|1 20057:MO1|@573 20058:MO1|@385 20059:MO1|@20062 20060:MO1|@373 20061:MO1|35 20062:MO81|80,@665,@732,0,0,0,0,0,0,@916,0,@931,@952,@1123,0,0,0,@1195,0,@1231,@1251,0,@7705,0,@7716,0,@7800,0,@12486,0,0,0,0,@12505,@13164,@13172,0,0,0,0,@13193,0,@13232,0,@13236,@13253,@13256,0,0,0,0,@13268,0,0,@13351,@13354,@13473,@13476,@13479,0,@13482,@13485,@13826,0,0,0,@13833,@13836,@13839,0,0,0,0,0,0,0,@13843,0,0,0,@664 20063:MO1|@727 20064:MO1|0 20065:MO1|@817 20066:MO1|@824 20067:MO1|@845 20068:MO1|0 20069:MO1|1 20070:MO1|0 20071:MO1|@20074 20072:MO1|@1259 20073:MO1|7 20074:MO11|10,@1262,@2061,0,@2065,@7383,@7531,0,0,@7588,@1261 20075:MO1|@20078 20076:MO1|@1270 20077:MO1|4 20078:MO11|10,0,@1273,0,@2031,0,0,0,@2042,0,@1272 20079:MO1|@1296 20080:MO1|@1327 20081:MO1|0 20082:MO1|@385 20083:MO1|@385 20084:MO1|@385 20085:MO1|0 20086:MO1|@1594 20087:MO1|1 20088:MO1|@411 20089:MO1|1 20090:MO1|@411 20091:MO1|0 20092:MO1|0 20093:MO1|1 20094:MO1|1 20095:MO1|1 20096:MO1|1 20097:MO1|@727 20098:MO1|0 20099:MO1|@727 20100:MO1|0 20101:MO1|@727 20102:MO1|0 20103:MO1|@727 20104:MO1|0 20105:MO1|@727 20106:MO1|0 20107:MO1|@727 20108:MO1|0 20109:MO1|@1957 20110:MO1|1 20111:MO1|@20114 20112:MO1|@2073 20113:MO1|5 20114:MO11|10,@2076,@2080,0,@7338,0,0,0,0,@7348,@2075 20115:MO1|0 20116:MO1|0 20117:MO1|@385 20118:MO1|@385 20119:MO1|@385 20120:MO1|@385 20121:MO1|@385 20122:MO1|@385 20123:MO1|@385 20124:MO1|@385 20125:MO1|@385 20126:MO1|@385 20127:MO1|@385 20128:MO1|@385 20129:MO1|@385 20130:MO1|@385 20131:MO1|@385 20132:MO1|@385 20133:MO1|@385 20134:MO1|@385 20135:MO1|@385 20136:MO1|@385 20137:MO1|@385 20138:MO1|@385 20139:MO1|@385 20140:MO1|@385 20141:MO1|@385 20142:MO1|@3516 20143:MO1|@7295 20144:MO1|@727 20145:MO1|0 20146:MO1|@20149 20147:MO1|@7391 20148:MO1|11 20149:MO21|20,@7393,@7414,0,0,0,@7427,0,0,@7438,@7448,@7458,0,0,@7471,0,@7481,0,@7503,@7507,@7392 20150:MO1|@727 20151:MO1|0 20152:MO1|@20155 20153:MO1|@7539 20154:MO1|4 20155:MO11|10,@7542,@7564,0,@7568,0,0,0,0,0,@7541 20156:MO1|@20159 20157:MO1|@7596 20158:MO1|3 20159:MO11|10,0,@7599,0,@7608,0,@7598,0,0,0,0 20160:MO1|@20163 20161:MO1|@7629 20162:MO1|5 20163:MO11|10,0,@7632,0,@7667,0,0,0,@7677,@7687,@7631 20164:MO1|@573 20165:MO1|@385 20166:MO1|0 20167:MO1|@9933 20168:MO1|@8381 20169:MO1|0 20170:MO1|@8752 20171:MO1|@8693 20172:MO1|@8705 20173:MO1|@9284 20174:MO1|@8957 20175:MO1|@385 20176:MO1|@8977 20177:MO1|@9108 20178:MO1|@9120 20179:MO1|@9280 20180:MO1|@9282 20181:MO1|@9323 20182:MO1|@9833 20183:MO1|@10089 20184:MO1|@10191 20185:MO1|@10128 20186:MO1|@10157 20187:MO1|@10159 20188:MO1|@10182 20189:MO1|@10302 20190:MO1|@10217 20191:MO1|@10245 20192:MO1|@385 20193:MO1|@400 20194:MO1|@385 20195:MO1|0 20196:MO1|@573 20197:MO1|0 20198:MO1|0 20199:MO1|0 20200:MO1|@573 20201:MO1|0 20202:MO1|0 20203:MO1|0 20204:MO1|0 20205:MO1|0 20206:MO1|32 20207:MO1|I48 20208:MO1|48 20209:MO1|0 20210:MO1|41 20211:MO1|0 20212:MO1|@12288 20213:MO1|@727 20214:MO1|0 20215:MO1|@20218 20216:MO1|@12513 20217:MO1|27 20218:MO41|40,@12515,@12564,@12613,@12644,0,0,@12707,@12734,@12755,@12779,@12799,0,0,@12812,0,@12837,0,0,@12848,0,@12874,0,0,@12878,@12886,@12990,@12994,@12997,@13001,@13004,@13008,@13035,@13053,0,@13056,@13060,@13063,0,0,@12514 20219:MO1|@727 20220:MO1|0 20221:MO1|@727 20222:MO1|0 20223:MO1|@727 20224:MO1|0 20225:MO1|@727 20226:MO1|0 20227:MO1|@727 20228:MO1|0 20229:MO1|@727 20230:MO1|0 20231:MO1|@727 20232:MO1|0 20233:MO1|@13130 20234:MO1|@573 20235:MO1|@573 20236:MO1|@573 20237:MO1|@20240 20238:MO1|@12513 20239:MO1|27 20240:MO41|40,@13494,@13521,@13537,@13563,@13576,@13592,@13596,@13616,0,@13624,@13634,0,@13641,0,0,0,0,@13652,0,0,@13665,@13681,0,@13699,@13706,@13717,0,0,@13721,@13734,@13745,@13757,@13766,0,0,@13770,@13780,@13796,@13807,@13493 20241:MO1|@727 20242:MO1|0 20243:MO1|@727 20244:MO1|0 20245:MO1|@573 20246:MO1|@13130 20247:MO1|@20250 20248:MO1|@373 20249:MO1|41 20250:MO81|80,@13928,@13982,@14014,@14031,0,0,0,@14048,0,@14062,0,@14076,@14090,@14124,@14182,@14196,0,0,0,0,0,0,0,@14210,@14224,@14238,@14252,@14266,0,0,0,@14360,@14573,@14587,0,0,0,0,0,0,@14615,@14630,@14638,@14652,@14667,@14681,@14695,@14707,0,0,@14721,0,@14745,0,0,@14759,@14773,0,0,0,@14780,0,@14794,0,@14806,@14813,@14871,@14895,0,0,0,@14910,@14924,@14938,0,0,0,@13927,0,0 20251:MO1|@13953 20252:MO1|0 20253:MO1|@14139 20254:MO1|1 20255:MO1|0 20256:MO1|0 20257:MO1|@13130 20258:MO1|@14804 20259:MO1|1 20260:MO1|@20263 20261:MO1|@14821 20262:MO1|5 20263:MO11|10,0,@14824,@14839,0,0,@14843,@14855,0,0,@14823 20264:MO1|@573 20265:MO1|@411 20266:MO1|@14991 20267:MO1|1 20268:MO1|@20271 20269:MO1|@12513 20270:MO1|23 20271:MO41|40,0,0,@15080,@15086,0,@15098,0,0,0,0,0,@15105,@15110,0,0,0,0,@15117,@15122,@15129,0,@15138,0,0,@15143,@15155,@15161,@15173,@15178,@15184,@15205,@15217,@15256,@15273,@15297,@15324,0,0,@15354,@15079 20272:MO1|@573 20273:MO1|@573 20274:MO1|@573 20275:MO1|@573 20276:MO1|@573 20277:MO1|@573 20278:MO1|@573 20279:MO1|@573 20280:MO1|@573 20281:MO1|@573 20282:MO1|@573 20283:MO1|@573 20284:MVO1|0 20285:MVO1|1 20286:MVO1|1 20287:MVO1|0 20288:MVO1|@25 20289:MVO1|1 20290:MVO1|0 20291:MVO1|1 20292:MVO1|1 20293:MVO1|@323 20294:MVO1|1 20295:MVO1|@351 20296:MVO1|1 20297:MVO1|1 20298:MVO1|1 15447:MB8|0000000000000000 15448:MB8|0000000000000000 15449:MB8|0000000000000000 15450:MB8|0000000000000000 15451:MB8|0000000000000000 15452:MB4096|4372656174656420737472756374757265204d4c436f6d70696c65720a73696f6e0a0a69670a670a540a46554e4354494f4e530a202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 15453:MB8|0000000000000000 15454:MB8|0000000000000000 15455:MB8|0000000000000000 15456:MB8|0000000000000000 15457:MB8|0000000000000000 15458:MB8|0000000000000000 15459:MB8|0000000000000000 15460:MB8|0000000000000000 15461:MB8|0000000000000000 15462:MB8|0000000000000000 15463:MB8|0000000000000000 15464:MB8|0000000000000000 15465:MB8|0000000000000000 15466:MB8|0000000000000000 15467:MB8|0000000000000000 15468:MB8|0000000000000000 15469:MB8|0000000000000000 15470:MB8|0000000000000000 15471:MB8|0000000000000000 15472:MB8|0000000000000000 15473:MB8|0000000000000000 15474:MB8|0000000000000000 15475:MB8|0000000000000000 15476:MB8|0000000000000000 15477:MB8|0000000000000000 15478:MB8|0000000000000000 15479:MB8|0000000000000000 15480:MB8|0000000000000000 15481:MB8|0000000000000000 15482:MB8|0000000000000000 15483:MB8|0000000000000000 15484:MB8|0000000000000000 15485:MB8|0000000000000000 15486:MB8|0000000000000000 15487:MB8|0000000000000000 15488:MB8|0000000000000000 15489:MB8|0000000000000000 15490:MB8|0000000000000000 15491:MB8|0000000000000000 15492:MB8|0000000000000000 15493:MB8|0000000000000000 15494:MB8|0000000000000000 15495:MB8|0000000000000000 15496:MB8|0000000000000000 15497:MB8|0000000000000000 15498:MB8|0000000000000000 15499:MB8|0000000000000000 15500:MB8|0000000000000000 15501:MB8|0000000000000000 15502:MB8|0000000000000000 15503:MB8|0000000000000000 15504:MB8|0000000000000000 15505:MB8|0000000000000000 15506:MB8|0000000000000000 15507:MB8|0000000000000000 15508:MB8|0000000000000000 15509:MB8|0000000000000000 15510:MB8|0000000000000000 15511:MB8|0000000000000000 15512:MB8|0000000000000000 15513:MB8|0000000000000000 15514:MB8|0000000000000000 15515:MB8|0000000000000000 15516:MB8|0000000000000000 15517:MB8|0000000000000000 15518:MB8|0000000000000000 15519:MB8|0000000000000000 15520:MB8|0000000000000000 15521:MB8|0000000000000000 15522:MB8|0000000000000000 15523:MB8|0000000000000000 15524:MB8|0000000000000000 15525:MB8|0000000000000000 15526:MB8|0000000000000000 15527:MB8|0000000000000000 15528:MB4096|20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 15529:MB8|0000000000000000 15530:MB8|0000000000000000 15531:MB8|0000000000000000 15532:MB8|0000000000000000 15533:MB8|0000000000000000 15534:MB8|0000000000000000 15535:MB8|0000000000000000 15536:MB8|0000000000000000 15537:MB8|0000000000000000 15538:MB8|0000000000000000 15539:MB8|0000000000000000 15540:MB8|0000000000000000 15541:MB8|0000000000000000 15542:MB8|0000000000000000 15543:MB8|0000000000000000 15544:MB8|0000000000000000 15545:MB8|0000000000000000 15546:MB8|0000000000000000 15547:MB8|0000000000000000 15548:MB8|0000000000000000 15549:MB8|0000000000000000 15550:MB8|0000000000000000 15551:MB8|0000000000000000 15552:MB8|0000000000000000 15553:MB8|0000000000000000 15554:MB8|0000000000000000 15555:MB8|0000000000000000 15556:MB8|0000000000000000 15557:MB8|0000000000000000 15558:MB8|0000000000000000 15559:MB8|0000000000000000 15560:MB8|0000000000000000 15561:MB8|0000000000000000 15562:MB8|0000000000000000 15563:MB8|0000000000000000 15564:MB8|0000000000000000 15565:MB8|0000000000000000 15566:MB8|0000000000000000 15567:MB8|0000000000000000 15568:MB8|0000000000000000 15569:MB8|0000000000000000 15570:MB8|0000000000000000 15571:MB8|0000000000000000 15572:MB8|0000000000000000 15573:MB8|0000000000000000 15574:MB8|0000000000000000 15575:MB8|0000000000000000 15576:MB8|0000000000000000 15577:MB8|0000000000000000 15578:MB8|0000000000000000 15579:MB8|0000000000000000 15580:MB8|0000000000000000 15581:MB8|0000000000000000 15582:MB8|0000000000000000 15583:MB8|0000000000000000 15584:MB8|0000000000000000 15585:MB8|0000000000000000 15586:MB8|0000000000000000 15587:MB8|0000000000000000 15588:MB8|0000000000000000 15589:MB8|0000000000000000 15590:MB8|0000000000000000 15591:MB8|0000000000000000 15592:MB8|0000000000000000 15593:MB8|0000000000000000 15594:MB8|0000000000000000 15595:MB8|0000000000000000 15596:MB8|0000000000000000 15597:MB8|0000000000000000 15598:MB8|0000000000000000 15599:MB8|0000000000000000 15600:MB8|0000000000000000 15601:MB8|0000000000000000 15602:MB8|0000000000000000 15603:MB8|0000000000000000 15604:MB8|0000000000000000 15605:MB8|0000000000000000 15606:MB8|0000000000000000 15607:MB8|0000000000000000 15608:MB8|0000000000000000 15609:MB8|0000000000000000 15610:MB8|0000000000000000 15611:MB8|0000000000000000 15612:MB8|0000000000000000 15613:MB8|0000000000000000 15614:MB8|0000000000000000 15615:MB8|0000000000000000 15616:MB8|0000000000000000 15617:MB8|0000000000000000 15618:MB8|0000000000000000 15619:MB8|0000000000000000 15620:MB8|0000000000000000 15621:MB8|0000000000000000 15622:MB8|0000000000000000 15623:MB8|0000000000000000 15624:MB8|0000000000000000 15625:MB8|0000000000000000 15626:MB8|0000000000000000 15627:MB8|0000000000000000 15628:MB8|0000000000000000 15629:MB8|0000000000000000 15630:MB8|0000000000000000 15631:MB8|0000000000000000 15632:MB8|0000000000000000 15633:MB8|0000000000000000 15634:MB8|0000000000000000 15635:MB8|0000000000000000 15636:MB8|0000000000000000 15637:MB8|0000000000000000 15638:MB8|0000000000000000 15639:MB8|0000000000000000 15640:MB8|0000000000000000 15641:MB8|0000000000000000 15642:MB8|0000000000000000 15643:MB8|0000000000000000 15644:MB8|0000000000000000 15645:MB8|0000000000000000 15646:MB8|0000000000000000 15647:MB8|0000000000000000 15648:MB8|0000000000000000 15649:MB8|0000000000000000 15650:MB8|0000000000000000 15651:MB8|0000000000000000 15652:MB8|0000000000000000 15653:MB8|0000000000000000 15654:MB8|0000000000000000 15655:MB8|0000000000000000 15656:MB8|0000000000000000 15657:MB8|0000000000000000 15658:MB8|0000000000000000 15659:MB8|0000000000000000 15660:MB8|0000000000000000 15661:MB8|0000000000000000 15662:MB8|0000000000000000 15663:MB8|0000000000000000 15664:MB8|0000000000000000 15665:MB8|0000000000000000 15666:MB8|0000000000000000 15667:MB8|0000000000000000 15668:MB8|0000000000000000 15669:MB8|0000000000000000 15670:MB8|0000000000000000 15671:MB8|0000000000000000 15672:MB8|0000000000000000 15673:MB8|0000000000000000 15674:MB8|0000000000000000 15675:MB8|0000000000000000 15676:MB8|0000000000000000 15677:MB8|0000000000000000 15678:MB8|0000000000000000 15679:MB8|0000000000000000 15680:MB8|0000000000000000 15681:MB8|0000000000000000 15682:MB8|0000000000000000 15683:MB8|0000000000000000 15684:MB8|0000000000000000 15685:MB8|0000000000000000 15686:MB8|0000000000000000 15687:MB8|0000000000000000 15688:MB8|0000000000000000 15689:MB8|0000000000000000 15690:MB8|0000000000000000 15691:MB8|0000000000000000 15692:MB8|0000000000000000 15693:MB8|0000000000000000 15694:MB8|0000000000000000 15695:MB8|0000000000000000 15696:MB8|0000000000000000 15697:MB8|0000000000000000 15698:MB8|0000000000000000 15699:MB8|0000000000000000 15700:MB8|0000000000000000 15701:MB8|0000000000000000 15702:MB8|0000000000000000 15703:MB8|0000000000000000 15704:MB8|0000000000000000 15705:MB8|0000000000000000 15706:MB8|0000000000000000 15707:MB8|0000000000000000 15708:MB8|0000000000000000 15709:MB8|0000000000000000 15710:MB8|0000000000000000 15711:MB8|0000000000000000 15712:MB8|0000000000000000 15713:MB8|0000000000000000 15714:MB8|0000000000000000 15715:MB8|0000000000000000 15716:MB8|0000000000000000 15717:MB8|0000000000000000 15718:MB8|0000000000000000 15719:MB8|0000000000000000 15720:MB8|0000000000000000 15721:MB8|0000000000000000 15722:MB8|0000000000000000 15723:MB8|0000000000000000 15724:MB8|0000000000000000 15725:MB8|0000000000000000 15726:MB8|0000000000000000 15727:MB8|0000000000000000 15728:MB8|0000000000000000 15729:MB8|0000000000000000 15730:MB8|0000000000000000 15731:MB8|0000000000000000 15732:MB8|0000000000000000 15733:MB8|0000000000000000 15734:MB8|0000000000000000 15735:MB8|0000000000000000 15736:MB8|0000000000000000 15737:MB8|0000000000000000 15738:MB8|0000000000000000 15739:MB8|0000000000000000 15740:MB8|0000000000000000 15741:MB8|0000000000000000 15742:MB8|0000000000000000 15743:MB8|0000000000000000 15744:MB8|0000000000000000 15745:MB8|0000000000000000 15746:MB8|0000000000000000 15747:MB8|0000000000000000 15748:MB8|0000000000000000 15749:MB8|0000000000000000 15750:MB8|0000000000000000 15751:MB8|0000000000000000 15752:MB8|0000000000000000 15753:MB8|0000000000000000 15754:MB8|0000000000000000 15755:MB8|0000000000000000 15756:MB8|0000000000000000 15757:MB8|0000000000000000 15758:MB8|0000000000000000 15759:MB8|0000000000000000 15760:MB8|0000000000000000 15761:MB8|0000000000000000 15762:MB8|0000000000000000 15763:MB8|0000000000000000 15764:MB8|0000000000000000 15765:MB8|0000000000000000 15766:MB8|0000000000000000 15767:MB8|0000000000000000 15768:MB8|0000000000000000 15769:MB8|0000000000000000 15770:MB8|0000000000000000 15771:MB8|0000000000000000 15772:MB8|0000000000000000 15773:MB8|0000000000000000 15774:MB8|0000000000000000 15775:MB8|0000000000000000 15776:MB8|0000000000000000 15777:MB8|0000000000000000 15778:MB8|0000000000000000 15779:MB8|0000000000000000 15780:MB8|0000000000000000 15781:MB8|0000000000000000 15782:MB8|0000000000000000 15783:MB8|0000000000000000 15784:MB8|0000000000000000 15785:MB8|0000000000000000 15786:MB8|0000000000000000 15787:MB8|0000000000000000 15788:MB8|0000000000000000 15789:MB8|0000000000000000 15790:MB8|0000000000000000 15791:MB8|0000000000000000 15792:MB8|0000000000000000 15793:MB8|0000000000000000 15794:MB8|0000000000000000 15795:MB8|0000000000000000 15796:MB8|0000000000000000 15797:MB8|0000000000000000 15798:MB8|0000000000000000 15799:MB8|0000000000000000 15800:MB8|0000000000000000 15801:MB8|0000000000000000 15802:MB8|0000000000000000 15803:MB8|0000000000000000 15804:MB8|0000000000000000 15805:MB8|0000000000000000 15806:MB8|0000000000000000 15807:MB8|0000000000000000 15808:MB8|0000000000000000 15809:MB8|0000000000000000 15810:MB8|0000000000000000 15811:MB8|0000000000000000 15812:MB8|0000000000000000 15813:MB8|0000000000000000 15814:MB8|0000000000000000 15815:MB8|0000000000000000 15816:MB8|0000000000000000 15817:MB8|0000000000000000 15818:MB8|0000000000000000 15819:MB8|0000000000000000 15820:MB8|0000000000000000 15821:MB8|0000000000000000 15822:MB8|0000000000000000 15823:MB8|0000000000000000 15824:MB8|0000000000000000 15825:MB8|0000000000000000 15826:MB8|0000000000000000 15827:MB8|0000000000000000 15828:MB8|0000000000000000 15829:MB8|0000000000000000 15830:MB8|0000000000000000 15831:MB8|0000000000000000 15832:MB8|0000000000000000 15833:MB8|0000000000000000 15834:MB8|0000000000000000 15835:MB8|0000000000000000 15836:MB8|0000000000000000 15837:MB8|0000000000000000 15838:MB8|0000000000000000 15839:MB8|0000000000000000 15840:MB8|0000000000000000 15841:MB8|0000000000000000 15842:MB8|0000000000000000 15843:MB8|0000000000000000 15844:MB8|0000000000000000 15845:MB8|0000000000000000 15846:MB8|0000000000000000 15847:MB8|0000000000000000 15848:MB8|0000000000000000 15849:MB8|0000000000000000 15850:MB8|0000000000000000 15851:MB8|0000000000000000 15852:MB8|0000000000000000 15853:MB8|0000000000000000 15854:MB8|0000000000000000 15855:MB8|0000000000000000 15856:MB8|0000000000000000 15857:MB8|0000000000000000 15858:MB8|0000000000000000 15859:MB8|0000000000000000 15860:MB8|0000000000000000 15861:MB8|0000000000000000 15862:MB8|0000000000000000 15863:MB8|0000000000000000 15864:MB8|0000000000000000 15865:MB8|0000000000000000 15866:MB8|0000000000000000 15867:MB8|0000000000000000 15868:MB8|0000000000000000 15869:MB8|0000000000000000 15870:MB8|0000000000000000 15871:MB8|0000000000000000 15872:MB8|0000000000000000 15873:MB8|0000000000000000 15874:MB8|0000000000000000 15875:MB8|0000000000000000 15876:MB8|0000000000000000 15877:MB8|0000000000000000 15878:MB8|0000000000000000 15879:MB8|0000000000000000 15880:MB8|0000000000000000 15881:MB8|0000000000000000 15882:MB8|0000000000000000 15883:MB8|0000000000000000 15884:MB8|0000000000000000 15885:MB8|0000000000000000 15886:MB8|0000000000000000 15887:MB8|0000000000000000 15888:MB8|0000000000000000 15889:MB8|0000000000000000 15890:MB8|0000000000000000 15891:MB8|0000000000000000 15892:MB8|0000000000000000 15893:MB8|0000000000000000 15894:MB8|0000000000000000 15895:MB8|0000000000000000 15896:MB8|0000000000000000 15897:MB8|0000000000000000 15898:MB8|0000000000000000 15899:MB8|0000000000000000 15900:MB8|0000000000000000 15901:MB8|0000000000000000 15902:MB8|0000000000000000 15903:MB8|0000000000000000 15904:MB8|0000000000000000 15905:MB8|0000000000000000 15906:MB8|0000000000000000 15907:MB8|0000000000000000 15908:MB8|0000000000000000 15909:MB8|0000000000000000 15910:MB8|0000000000000000 15911:MB8|0000000000000000 15912:MB8|0000000000000000 15913:MB8|0000000000000000 15914:MB8|0000000000000000 15915:MB8|0000000000000000 15916:MB8|0000000000000000 15917:MB8|0000000000000000 15918:MB8|0000000000000000 15919:MB8|0000000000000000 15920:MB8|0000000000000000 15921:MB8|0000000000000000 15922:MB8|0000000000000000 15923:MB8|0000000000000000 15924:MB8|0000000000000000 15925:MB8|0000000000000000 15926:MB8|0000000000000000 15927:MB8|0000000000000000 15928:MB8|0000000000000000 15929:MB8|0000000000000000 15930:MB8|0000000000000000 15931:MB8|0000000000000000 15932:MB8|0000000000000000 15933:MB8|0000000000000000 15934:MB8|0000000000000000 15935:MB8|0000000000000000 15936:MB8|0000000000000000 15937:MB8|0000000000000000 15938:MB8|0000000000000000 15939:MB8|0000000000000000 15940:MB8|0000000000000000 15941:MB8|0000000000000000 15942:MB8|0000000000000000 15943:MB8|0000000000000000 15944:MB8|0000000000000000 15945:MB8|0000000000000000 15946:MB8|0000000000000000 15947:MB8|0000000000000000 15948:MB8|0000000000000000 15949:MB8|0000000000000000 15950:MB8|0000000000000000 15951:MB8|0000000000000000 15952:MB8|0000000000000000 15953:MB8|0000000000000000 15954:MB8|0000000000000000 15955:MB8|0000000000000000 15956:MB8|0000000000000000 15957:MB8|0000000000000000 15958:MB8|0000000000000000 15959:MB8|0000000000000000 15960:MB8|0000000000000000 15961:MB8|0000000000000000 15962:MB8|0000000000000000 15963:MB8|0000000000000000 15964:MB8|0000000000000000 15965:MB8|0000000000000000 15966:MB8|0000000000000000 15967:MB8|0000000000000000 15968:MB8|0000000000000000 15969:MB8|0000000000000000 15970:MB8|0000000000000000 15971:MB8|0000000000000000 15972:MB8|0000000000000000 15973:MB8|0000000000000000 15974:MB8|0000000000000000 15975:MB8|0000000000000000 15976:MB8|0000000000000000 15977:MB8|0000000000000000 15978:MB8|0000000000000000 15979:MB8|0000000000000000 15980:MB8|0000000000000000 15981:MB8|0000000000000000 15982:MB8|0000000000000000 15983:MB8|0000000000000000 15984:MB8|0000000000000000 15985:MB8|0000000000000000 15986:MB8|0000000000000000 15987:MB8|0000000000000000 15988:MB8|0000000000000000 15989:MB8|0000000000000000 15990:MB8|0000000000000000 15991:MB8|0000000000000000 15992:MB8|0000000000000000 15993:MB8|0000000000000000 15994:MB8|0000000000000000 15995:MB8|0000000000000000 15996:MB8|0000000000000000 15997:MB8|0000000000000000 15998:MB8|0000000000000000 15999:MB8|0000000000000000 16000:MB8|0000000000000000 16001:MB8|0000000000000000 16002:MB8|0000000000000000 16003:MB8|0000000000000000 16004:MB8|0000000000000000 16005:MB8|0000000000000000 16006:MB8|0000000000000000 16007:MB8|0000000000000000 16008:MB8|0000000000000000 16009:MB8|0000000000000000 16010:MB8|0000000000000000 16011:MB8|0000000000000000 16012:MB8|0000000000000000 16013:MB8|0000000000000000 16014:MB8|0000000000000000 16015:MB8|0000000000000000 16016:MB8|0000000000000000 16017:MB8|0000000000000000 16018:MB8|0000000000000000 16019:MB8|0000000000000000 16020:MB8|0000000000000000 16021:MB8|0000000000000000 16022:MB8|0000000000000000 16023:MB8|0000000000000000 16024:MB8|0000000000000000 16025:MB8|0000000000000000 16026:MB8|0000000000000000 16027:MB8|0000000000000000 16028:MB8|0000000000000000 16029:MB8|0000000000000000 16030:MB8|0000000000000000 16031:MB8|0000000000000000 16032:MB8|0000000000000000 16033:MB8|0000000000000000 16034:MB8|0000000000000000 16035:MB8|0000000000000000 16036:MB8|0000000000000000 16037:MB8|0000000000000000 16038:MB8|0000000000000000 16039:MB8|0000000000000000 16040:MB8|0000000000000000 16041:MB8|0000000000000000 16042:MB8|0000000000000000 16043:MB8|0000000000000000 16044:MB8|0000000000000000 16045:MB8|0000000000000000 16046:MB8|0000000000000000 16047:MB8|0000000000000000 16048:MB8|0000000000000000 16049:MB8|0000000000000000 16050:MB8|0000000000000000 16051:MB8|0000000000000000 16052:MB8|0000000000000000 16053:MB8|0000000000000000 16054:MB8|0000000000000000 16055:MB8|0000000000000000 16056:MB8|0000000000000000 16057:MB8|0000000000000000 16058:MB8|0000000000000000 16059:MB8|0000000000000000 16060:MB8|0000000000000000 16061:MB8|0000000000000000 16062:MB8|0000000000000000 16063:MB8|0000000000000000 16064:MB8|0000000000000000 16065:MB8|0000000000000000 16066:MB8|0000000000000000 16067:MB8|0000000000000000 16068:MB8|0000000000000000 16069:MB8|0000000000000000 16070:MB8|0000000000000000 16071:MB8|0000000000000000 16072:MB8|0000000000000000 16073:MB8|0000000000000000 16074:MB8|0000000000000000 16075:MB8|0000000000000000 16076:MB8|0000000000000000 16077:MB8|0000000000000000 16078:MB8|0000000000000000 16079:MB8|0000000000000000 16080:MB8|0000000000000000 16081:MB8|0000000000000000 16082:MB8|0000000000000000 16083:MB8|0000000000000000 16084:MB8|0000000000000000 16085:MB8|0000000000000000 16086:MB8|0000000000000000 16087:MB8|0000000000000000 16088:MB8|0000000000000000 16089:MB8|0000000000000000 16090:MB8|0000000000000000 16091:MB8|0000000000000000 16092:MB8|0000000000000000 16093:MB8|0000000000000000 16094:MB8|0000000000000000 16095:MB8|0000000000000000 16096:MB8|0000000000000000 16097:MB8|0000000000000000 16098:MB8|0000000000000000 16099:MB8|0000000000000000 16100:MB8|0000000000000000 16101:MB8|0000000000000000 16102:MB8|0000000000000000 16103:MB8|0000000000000000 16104:MB8|0000000000000000 16105:MB8|0000000000000000 16106:MB8|0000000000000000 16107:MB8|0000000000000000 16108:MB8|0000000000000000 16109:MB8|0000000000000000 16110:MB8|0000000000000000 16111:MB8|0000000000000000 16112:MB8|0000000000000000 16113:MB8|0000000000000000 16114:MB8|0000000000000000 16115:MB8|0000000000000000 16116:MB8|0000000000000000 16117:MB8|0000000000000000 16118:MB8|0000000000000000 16119:MB8|0000000000000000 16120:MB8|0000000000000000 16121:MB8|0000000000000000 16122:MB8|0000000000000000 16123:MB8|0000000000000000 16124:MB8|0000000000000000 16125:MB8|0000000000000000 16126:MB8|0000000000000000 16127:MB8|0000000000000000 16128:MB8|0000000000000000 16129:MB8|0000000000000000 16130:MB8|0000000000000000 16131:MB8|0000000000000000 16132:MB8|0000000000000000 16133:MB8|0000000000000000 16134:MB8|0000000000000000 16135:MB8|0000000000000000 16136:MB8|0000000000000000 16137:MB8|0000000000000000 16138:MB8|0000000000000000 16139:MB8|0000000000000000 16140:MB8|0000000000000000 16141:MB8|0000000000000000 16142:MB8|0000000000000000 16143:MB8|0000000000000000 16144:MB8|0000000000000000 16145:MB8|0000000000000000 16146:MB8|0000000000000000 16147:MB8|0000000000000000 16148:MB8|0000000000000000 16149:MB8|0000000000000000 16150:MB8|0000000000000000 16151:MB8|0000000000000000 16152:MB8|0000000000000000 16153:MB8|0000000000000000 16154:MB8|0000000000000000 16155:MB8|0000000000000000 16156:MB8|0000000000000000 16157:MB8|0000000000000000 16158:MB8|0000000000000000 16159:MB8|0000000000000000 16160:MB8|0000000000000000 16161:MB8|0000000000000000 16162:MB8|0000000000000000 16163:MB8|0000000000000000 16164:MB8|0000000000000000 16165:MB8|0000000000000000 16166:MB8|0000000000000000 16167:MB8|0000000000000000 16168:MB8|0000000000000000 16169:MB8|0000000000000000 16170:MB8|0000000000000000 16171:MB8|0000000000000000 16172:MB8|0000000000000000 16173:MB8|0000000000000000 16174:MB8|0000000000000000 16175:MB8|0000000000000000 16176:MB8|0000000000000000 16177:MB8|0000000000000000 16178:MB8|0000000000000000 16179:MB8|0000000000000000 16180:MB8|0000000000000000 16181:MB8|0000000000000000 16182:MB8|0000000000000000 16183:MB8|0000000000000000 16184:MB8|0000000000000000 16185:MB8|0000000000000000 16186:MB8|0000000000000000 16187:MB8|0000000000000000 16188:MB8|0000000000000000 16189:MB8|0000000000000000 16190:MB8|0000000000000000 16191:MB8|0000000000000000 16192:MB8|0000000000000000 16193:MB8|0000000000000000 16194:MB8|0000000000000000 16195:MB8|0000000000000000 16196:MB8|0000000000000000 16197:MB8|0000000000000000 16198:MB8|0000000000000000 16199:MB8|0000000000000000 16200:MB8|0000000000000000 16201:MB8|0000000000000000 16202:MB8|0000000000000000 16203:MB8|0000000000000000 16204:MB8|0000000000000000 16205:MB8|0000000000000000 16206:MB8|0000000000000000 16207:MB8|0000000000000000 16208:MB8|0000000000000000 16209:MB8|0000000000000000 16210:MB8|0000000000000000 16211:MB8|0000000000000000 16212:MB8|0000000000000000 16213:MB8|0000000000000000 16214:MB8|0000000000000000 16215:MB8|0000000000000000 16216:MB8|0000000000000000 16217:MB8|0000000000000000 16218:MB8|0000000000000000 16219:MB8|0000000000000000 16220:MB8|0000000000000000 16221:MB8|0000000000000000 16222:MB8|0000000000000000 16223:MB8|0000000000000000 16224:MB8|0000000000000000 16225:MB8|0000000000000000 16226:MB8|0000000000000000 16227:MB8|0000000000000000 16228:MB8|0000000000000000 16229:MB8|0000000000000000 16230:MB8|0000000000000000 16231:MB8|0000000000000000 16232:MB8|0000000000000000 16233:MB8|0000000000000000 16234:MB8|0000000000000000 16235:MB8|0000000000000000 16236:MB8|0000000000000000 16237:MB8|0000000000000000 16238:MB8|0000000000000000 16239:MB8|0000000000000000 16240:MB8|0000000000000000 16241:MB8|0000000000000000 16242:MB8|0000000000000000 16243:MB8|0000000000000000 16244:MB8|0000000000000000 16245:MB8|0000000000000000 16246:MB8|0000000000000000 16247:MB8|0000000000000000 16248:MB8|0000000000000000 16249:MB8|0000000000000000 16250:MB8|0000000000000000 16251:MB8|0000000000000000 16252:MB8|0000000000000000 16253:MB8|0000000000000000 16254:MB8|0000000000000000 16255:MB8|0000000000000000 16256:MB8|0000000000000000 16257:MB8|0000000000000000 16258:MB8|0000000000000000 16259:MB8|0000000000000000 16260:MB8|0000000000000000 16261:MB8|0000000000000000 16262:MB8|0000000000000000 16263:MB8|0000000000000000 16264:MB8|0000000000000000 16265:MB8|0000000000000000 16266:MB8|0000000000000000 16267:MB8|0000000000000000 16268:MB8|0000000000000000 16269:MB8|0000000000000000 16270:MB8|0000000000000000 16271:MB8|0000000000000000 16272:MB8|0000000000000000 16273:MB8|0000000000000000 16274:MB8|0000000000000000 16275:MB8|0000000000000000 16276:MB8|0000000000000000 16277:MB8|0000000000000000 16278:MB8|0000000000000000 16279:MB8|0000000000000000 16280:MB8|0000000000000000 16281:MB8|0000000000000000 16282:MB8|0000000000000000 16283:MB8|0000000000000000 16284:MB8|0000000000000000 16285:MB8|0000000000000000 16286:MB8|0000000000000000 16287:MB8|0000000000000000 16288:MB8|0000000000000000 16289:MB8|0000000000000000 16290:MB8|0000000000000000 16291:MB8|0000000000000000 16292:MB8|0000000000000000 16293:MB8|0000000000000000 16294:MB8|0000000000000000 16295:MB8|0000000000000000 16296:MB8|0000000000000000 16297:MB8|0000000000000000 16298:MB8|0000000000000000 16299:MB8|0000000000000000 16300:MB8|0000000000000000 16301:MB8|0000000000000000 16302:MB8|0000000000000000 16303:MB8|0000000000000000 16304:MB8|0000000000000000 16305:MB8|0000000000000000 16306:MB8|0000000000000000 16307:MB8|0000000000000000 16308:MB8|0000000000000000 16309:MB8|0000000000000000 16310:MB8|0000000000000000 16311:MB8|0000000000000000 16312:MB8|0000000000000000 16313:MB8|0000000000000000 16314:MB8|0000000000000000 16315:MB8|0000000000000000 16316:MB8|0000000000000000 16317:MB8|0000000000000000 16318:MB8|0000000000000000 16319:MB8|0000000000000000 16320:MB8|0000000000000000 16321:MB8|0000000000000000 16322:MB8|0000000000000000 16323:MB8|0000000000000000 16324:MB8|0000000000000000 16325:MB8|0000000000000000 16326:MB8|0000000000000000 16327:MB8|0000000000000000 16328:MB8|0000000000000000 16329:MB8|0000000000000000 16330:MB8|0000000000000000 16331:MB8|0000000000000000 16332:MB8|0000000000000000 16333:MB8|0000000000000000 16334:MB8|0000000000000000 16335:MB8|0000000000000000 16336:MB8|0000000000000000 16337:MB8|0000000000000000 16338:MB8|0000000000000000 16339:MB8|0000000000000000 16340:MB8|0000000000000000 16341:MB8|0000000000000000 16342:MB8|0000000000000000 16343:MB8|0000000000000000 16344:MB8|0000000000000000 16345:MB8|0000000000000000 16346:MB8|0000000000000000 16347:MB8|0000000000000000 16348:MB8|0000000000000000 16349:MB8|0000000000000000 16350:MB8|0000000000000000 16351:MB8|0000000000000000 16352:MB8|0000000000000000 16353:MB8|0000000000000000 16354:MB8|0000000000000000 16355:MB8|0000000000000000 16356:MB8|0000000000000000 16357:MB8|0000000000000000 16358:MB8|0000000000000000 16359:MB8|0000000000000000 16360:MB8|0000000000000000 16361:MB8|0000000000000000 16362:MB8|0000000000000000 16363:MB8|0000000000000000 16364:MB8|0000000000000000 16365:MB8|0000000000000000 16366:MB8|0000000000000000 16367:MB8|0000000000000000 16368:MB8|0000000000000000 16369:MB8|0000000000000000 16370:MB8|0000000000000000 16371:MB8|0000000000000000 16372:MB8|0000000000000000 16373:MB8|0000000000000000 16374:MB8|0000000000000000 16375:MB8|0000000000000000 16376:MB8|0000000000000000 16377:MB8|0000000000000000 16378:MB8|0000000000000000 16379:MB8|0000000000000000 16380:MB8|0000000000000000 16381:MB8|0000000000000000 16382:MB8|0000000000000000 16383:MB8|0000000000000000 16384:MB8|0000000000000000 16385:MB8|0000000000000000 16386:MB8|0000000000000000 16387:MB8|0000000000000000 16388:MB8|0000000000000000 16389:MB8|0000000000000000 16390:MB8|0000000000000000 16391:MB8|0000000000000000 16392:MB8|0000000000000000 16393:MB8|0000000000000000 16394:MB8|0000000000000000 16395:MB8|0000000000000000 16396:MB8|0000000000000000 16397:MB8|0000000000000000 16398:MB8|0000000000000000 16399:MB8|0000000000000000 16400:MB8|0000000000000000 16401:MB8|0000000000000000 16402:MB8|0000000000000000 16403:MB8|0000000000000000 16404:MB8|0000000000000000 16405:MB8|0000000000000000 16406:MB8|0000000000000000 16407:MB8|0000000000000000 16408:MB8|0000000000000000 16409:MB8|0000000000000000 16410:MB8|0000000000000000 16411:MB8|0000000000000000 16412:MB8|0000000000000000 16413:MB8|0000000000000000 16414:MB8|0000000000000000 16415:MB8|0000000000000000 16416:MB8|0000000000000000 16417:MB8|0000000000000000 16418:MB8|0000000000000000 16419:MB8|0000000000000000 16420:MB8|0000000000000000 16421:MB8|0000000000000000 16422:MB8|0000000000000000 16423:MB8|0000000000000000 16424:MB8|0000000000000000 16425:MB8|0000000000000000 16426:MB8|0000000000000000 16427:MB8|0000000000000000 16428:MB8|0000000000000000 16429:MB8|0000000000000000 16430:MB8|0000000000000000 16431:MB8|0000000000000000 16432:MB8|0000000000000000 16433:MB8|0000000000000000 16434:MB8|0000000000000000 16435:MB8|0000000000000000 16436:MB8|0000000000000000 16437:MB8|0000000000000000 16438:MB8|0000000000000000 16439:MB8|0000000000000000 16440:MB8|0000000000000000 16441:MB8|0000000000000000 16442:MB8|0000000000000000 16443:MB8|0000000000000000 16444:MB8|0000000000000000 16445:MB8|0000000000000000 16446:MB8|0000000000000000 16447:MB8|0000000000000000 16448:MB8|0000000000000000 16449:MB8|0000000000000000 16450:MB8|0000000000000000 16451:MB8|0000000000000000 16452:MB8|0000000000000000 16453:MB8|0000000000000000 16454:MB8|0000000000000000 16455:MB8|0000000000000000 16456:MB8|0000000000000000 16457:MB8|0000000000000000 16458:MB8|0000000000000000 16459:MB8|0000000000000000 16460:MB8|0000000000000000 16461:MB8|0000000000000000 16462:MB8|0000000000000000 16463:MB8|0000000000000000 16464:MB8|0000000000000000 16465:MB8|0000000000000000 16466:MB8|0000000000000000 16467:MB8|0000000000000000 16468:MB8|0000000000000000 16469:MB8|0000000000000000 16470:MB8|0000000000000000 16471:MB8|0000000000000000 16472:MB8|0000000000000000 16473:MB8|0000000000000000 16474:MB8|0000000000000000 16475:MB8|0000000000000000 16476:MB8|0000000000000000 16477:MB8|0000000000000000 16478:MB8|0000000000000000 16479:MB8|0000000000000000 16480:MB8|0000000000000000 16481:MB8|0000000000000000 16482:MB8|0000000000000000 16483:MB8|0000000000000000 16484:MB8|0000000000000000 16485:MB8|0000000000000000 16486:MB8|0000000000000000 16487:MB8|0000000000000000 16488:MB8|0000000000000000 16489:MB8|0000000000000000 16490:MB8|0000000000000000 16491:MB8|0000000000000000 16492:MB8|0000000000000000 16493:MB8|0000000000000000 16494:MB8|0000000000000000 16495:MB8|0000000000000000 16496:MB8|0000000000000000 16497:MB8|0000000000000000 16498:MB8|0000000000000000 16499:MB8|0000000000000000 16500:MB8|0000000000000000 16501:MB8|0000000000000000 16502:MB8|0000000000000000 16503:MB8|0000000000000000 16504:MB8|0000000000000000 16505:MB8|0000000000000000 16506:MB8|0000000000000000 16507:MB8|0000000000000000 16508:MB8|0000000000000000 16509:MB8|0000000000000000 16510:MB8|0000000000000000 16511:MB8|0000000000000000 16512:MB8|0000000000000000 16513:MB8|0000000000000000 16514:MB8|0000000000000000 16515:MB8|0000000000000000 16516:MB8|0000000000000000 16517:MB8|0000000000000000 16518:MB8|0000000000000000 16519:MB8|0000000000000000 16520:MB8|0000000000000000 16521:MB8|0000000000000000 16522:MB8|0000000000000000 16523:MB8|0000000000000000 16524:MB8|0000000000000000 16525:MB8|0000000000000000 16526:MB8|0000000000000000 16527:MB8|0000000000000000 16528:MB8|0000000000000000 16529:MB8|0000000000000000 16530:MB8|0000000000000000 16531:MB8|0000000000000000 16532:MB8|0000000000000000 16533:MB8|0000000000000000 16534:MB8|0000000000000000 16535:MB8|0000000000000000 16536:MB8|0000000000000000 16537:MB8|0000000000000000 16538:MB8|0000000000000000 16539:MB8|0000000000000000 16540:MB8|0000000000000000 16541:MB8|0000000000000000 16542:MB8|0000000000000000 16543:MB8|0000000000000000 16544:MB8|0000000000000000 16545:MB8|0000000000000000 16546:MB8|0000000000000000 16547:MB8|0000000000000000 16548:MB8|0000000000000000 16549:MB8|0000000000000000 16550:MB8|0000000000000000 16551:MB8|0000000000000000 16552:MB8|0000000000000000 16553:MB8|0000000000000000 16554:MB8|0000000000000000 16555:MB8|0000000000000000 16556:MB8|0000000000000000 16557:MB8|0000000000000000 16558:MB8|0000000000000000 16559:MB8|0000000000000000 16560:MB8|0000000000000000 16561:MB8|0000000000000000 16562:MB8|0000000000000000 16563:MB8|0000000000000000 16564:MB8|0000000000000000 16565:MB8|0000000000000000 16566:MB8|0000000000000000 16567:MB8|0000000000000000 16568:MB8|0000000000000000 16569:MB8|0000000000000000 16570:MB8|0000000000000000 16571:MB8|0000000000000000 16572:MB8|0000000000000000 16573:MB8|0000000000000000 16574:MB8|0000000000000000 16575:MB8|0000000000000000 16576:MB8|0000000000000000 16577:MB8|0000000000000000 16578:MB8|0000000000000000 16579:MB8|0000000000000000 16580:MB8|0000000000000000 16581:MB8|0000000000000000 16582:MB8|0000000000000000 16583:MB8|0000000000000000 16584:MB8|0000000000000000 16585:MB8|0000000000000000 16586:MB8|0000000000000000 16587:MB8|0000000000000000 16588:MB8|0000000000000000 16589:MB8|0000000000000000 16590:MB8|0000000000000000 16591:MB8|0000000000000000 16592:MB8|0000000000000000 16593:MB8|0000000000000000 16594:MB8|0000000000000000 16595:MB8|0000000000000000 16596:MB8|0000000000000000 16597:MB8|0000000000000000 16598:MB8|0000000000000000 16599:MB8|0000000000000000 16600:MB8|0000000000000000 16601:MB8|0000000000000000 16602:MB8|0000000000000000 16603:MB8|0000000000000000 16604:MB8|0000000000000000 16605:MB8|0000000000000000 16606:MB8|0000000000000000 16607:MB8|0000000000000000 16608:MB8|0000000000000000 16609:MB8|0000000000000000 16610:MB8|0000000000000000 16611:MB8|0000000000000000 16612:MB8|0000000000000000 16613:MB8|0000000000000000 16614:MB8|0000000000000000 16615:MB8|0000000000000000 16616:MB8|0000000000000000 16617:MB8|0000000000000000 16618:MB8|0000000000000000 16619:MB8|0000000000000000 16620:MB8|0000000000000000 16621:MB8|0000000000000000 16622:MB8|0000000000000000 16623:MB8|0000000000000000 16624:MB8|0000000000000000 16625:MB8|0000000000000000 16626:MB8|0000000000000000 16627:MB8|0000000000000000 16628:MB8|0000000000000000 16629:MB8|0000000000000000 16630:MB8|0000000000000000 16631:MB8|0000000000000000 16632:MB8|0000000000000000 16633:MB8|0000000000000000 16634:MB8|0000000000000000 16635:MB8|0000000000000000 16636:MB8|0000000000000000 16637:MB8|0000000000000000 16638:MB8|0000000000000000 16639:MB8|0000000000000000 16640:MB8|0000000000000000 16641:MB8|0000000000000000 16642:MB8|0000000000000000 16643:MB8|0000000000000000 16644:MB8|0000000000000000 16645:MB8|0000000000000000 16646:MB8|0000000000000000 16647:MB8|0000000000000000 16648:MB8|0000000000000000 16649:MB8|0000000000000000 16650:MB8|0000000000000000 16651:MB8|0000000000000000 16652:MB8|0000000000000000 16653:MB8|0000000000000000 16654:MB8|0000000000000000 16655:MB8|0000000000000000 16656:MB8|0000000000000000 16657:MB8|0000000000000000 16658:MB8|0000000000000000 16659:MB8|0000000000000000 16660:MB8|0000000000000000 16661:MB8|0000000000000000 16662:MB8|0000000000000000 16663:MB8|0000000000000000 16664:MB8|0000000000000000 16665:MB8|0000000000000000 16666:MB8|0000000000000000 16667:MB8|0000000000000000 16668:MB8|0000000000000000 16669:MB8|0000000000000000 16670:MB8|0000000000000000 16671:MB8|0000000000000000 16672:MB8|0000000000000000 16673:MB8|0000000000000000 16674:MB8|0000000000000000 16675:MB8|0000000000000000 16676:MB8|0000000000000000 16677:MB8|0000000000000000 16678:MB8|0000000000000000 16679:MB8|0000000000000000 16680:MB8|0000000000000000 16681:MB8|0000000000000000 16682:MB8|0000000000000000 16683:MB8|0000000000000000 16684:MB8|0000000000000000 16685:MB8|0000000000000000 16686:MB8|0000000000000000 16687:MB8|0000000000000000 16688:MB8|0000000000000000 16689:MB8|0000000000000000 16690:MB8|0000000000000000 16691:MB8|0000000000000000 16692:MB8|0000000000000000 16693:MB8|0000000000000000 16694:MB8|0000000000000000 16695:MB8|0000000000000000 16696:MB8|0000000000000000 16697:MB8|0000000000000000 16698:MB8|0000000000000000 16699:MB8|0000000000000000 16700:MB8|0000000000000000 16701:MB8|0000000000000000 16702:MB8|0000000000000000 16703:MB8|0000000000000000 16704:MB8|0000000000000000 16705:MB8|0000000000000000 16706:MB8|0000000000000000 16707:MB8|0000000000000000 16708:MB8|0000000000000000 16709:MB8|0000000000000000 16710:MB8|0000000000000000 16711:MB8|0000000000000000 16712:MB8|0000000000000000 16713:MB8|0000000000000000 16714:MB8|0000000000000000 16715:MB8|0000000000000000 16716:MB8|0000000000000000 16717:MB8|0000000000000000 16718:MB8|0000000000000000 16719:MB8|0000000000000000 16720:MB8|0000000000000000 16721:MB8|0000000000000000 16722:MB8|0000000000000000 16723:MB8|0000000000000000 16724:MB8|0000000000000000 16725:MB8|0000000000000000 16726:MB8|0000000000000000 16727:MB8|0000000000000000 16728:MB8|0000000000000000 16729:MB8|0000000000000000 16730:MB8|0000000000000000 16731:MB8|0000000000000000 16732:MB8|0000000000000000 16733:MB8|0000000000000000 16734:MB8|0000000000000000 16735:MB8|0000000000000000 16736:MB8|0000000000000000 16737:MB8|0000000000000000 16738:MB8|0000000000000000 16739:MB8|0000000000000000 16740:MB8|0000000000000000 16741:MB8|0000000000000000 16742:MB8|0000000000000000 16743:MB8|0000000000000000 16744:MB8|0000000000000000 16745:MB8|0000000000000000 16746:MB8|0000000000000000 16747:MB8|0000000000000000 16748:MB8|0000000000000000 16749:MB8|0000000000000000 16750:MB8|0000000000000000 16751:MB8|0000000000000000 16752:MB8|0000000000000000 16753:MB8|0000000000000000 16754:MB8|0000000000000000 16755:MB8|0000000000000000 16756:MB8|0000000000000000 16757:MB8|0000000000000000 16758:MB8|0000000000000000 16759:MB8|0000000000000000 16760:MB8|0000000000000000 16761:MB8|0000000000000000 16762:MB8|0000000000000000 16763:MB8|0000000000000000 16764:MB8|0000000000000000 16765:MB8|0000000000000000 16766:MB8|0000000000000000 16767:MB8|0000000000000000 16768:MB8|0000000000000000 16769:MB8|0000000000000000 16770:MB8|0000000000000000 16771:MB8|0000000000000000 16772:MB8|0000000000000000 16773:MB8|0000000000000000 16774:MB8|0000000000000000 16775:MB8|0000000000000000 16776:MB8|0000000000000000 16777:MB8|0000000000000000 16778:MB8|0000000000000000 16779:MB8|0000000000000000 16780:MB8|0000000000000000 16781:MB8|0000000000000000 16782:MB8|0000000000000000 16783:MB8|0000000000000000 16784:MB8|0000000000000000 16785:MB8|0000000000000000 16786:MB8|0000000000000000 16787:MB8|0000000000000000 16788:MB8|0000000000000000 16789:MB8|0000000000000000 16790:MB8|0000000000000000 16791:MB8|0000000000000000 16792:MB8|0000000000000000 16793:MB8|0000000000000000 16794:MB8|0000000000000000 16795:MB8|0000000000000000 16796:MB8|0000000000000000 16797:MB8|0000000000000000 16798:MB8|0000000000000000 16799:MB8|0000000000000000 16800:MB8|0000000000000000 16801:MB8|0000000000000000 16802:MB8|0000000000000000 16803:MB8|0000000000000000 16804:MB8|0000000000000000 16805:MB8|0000000000000000 16806:MB8|0000000000000000 16807:MB8|0000000000000000 16808:MB8|0000000000000000 16809:MB8|0000000000000000 16810:MB8|0000000000000000 16811:MB8|0000000000000000 16812:MB8|0000000000000000 16813:MB8|0000000000000000 16814:MB8|0000000000000000 16815:MB8|0000000000000000 16816:MB8|0000000000000000 16817:MB8|0000000000000000 16818:MB8|0000000000000000 16819:MB8|0000000000000000 16820:MB8|0000000000000000 16821:MB8|0000000000000000 16822:MB8|0000000000000000 16823:MB8|0000000000000000 16824:MB8|0000000000000000 16825:MB8|0000000000000000 16826:MB8|0000000000000000 16827:MB8|0000000000000000 16828:MB8|0000000000000000 16829:MB8|0000000000000000 16830:MB8|0000000000000000 16831:MB8|0000000000000000 16832:MB8|0000000000000000 16833:MB8|0000000000000000 16834:MB8|0000000000000000 16835:MB8|0000000000000000 16836:MB8|0000000000000000 16837:MB8|0000000000000000 16838:MB8|0000000000000000 16839:MB8|0000000000000000 16840:MB8|0000000000000000 16841:MB8|0000000000000000 16842:MB8|0000000000000000 16843:MB8|0000000000000000 16844:MB8|0000000000000000 16845:MB8|0000000000000000 16846:MB8|0000000000000000 16847:MB8|0000000000000000 16848:MB8|0000000000000000 16849:MB8|0000000000000000 16850:MB8|0000000000000000 16851:MB8|0000000000000000 16852:MB8|0000000000000000 16853:MB8|0000000000000000 16854:MB8|0000000000000000 16855:MB8|0000000000000000 16856:MB8|0000000000000000 16857:MB8|0000000000000000 16858:MB8|0000000000000000 16859:MB8|0000000000000000 16860:MB8|0000000000000000 16861:MB8|0000000000000000 16862:MB8|0000000000000000 16863:MB8|0000000000000000 16864:MB8|0000000000000000 16865:MB8|0000000000000000 16866:MB8|0000000000000000 16867:MB8|0000000000000000 16868:MB8|0000000000000000 16869:MB8|0000000000000000 16870:MB8|0000000000000000 16871:MB8|0000000000000000 16872:MB8|0000000000000000 16873:MB8|0000000000000000 16874:MB8|0000000000000000 16875:MB8|0000000000000000 16876:MB8|0000000000000000 16877:MB8|0000000000000000 16878:MB8|0000000000000000 16879:MB8|0000000000000000 16880:MB8|0000000000000000 16881:MB8|0000000000000000 16882:MB8|0000000000000000 16883:MB8|0000000000000000 16884:MB8|0000000000000000 16885:MB8|0000000000000000 16886:MB8|0000000000000000 16887:MB8|0000000000000000 16888:MB8|0000000000000000 16889:MB8|0000000000000000 16890:MB8|0000000000000000 16891:MB8|0000000000000000 16892:MB8|0000000000000000 16893:MB8|0000000000000000 16894:MB8|0000000000000000 16895:MB8|0000000000000000 16896:MB8|0000000000000000 16897:MB8|0000000000000000 16898:MB8|0000000000000000 16899:MB8|0000000000000000 16900:MB8|0000000000000000 16901:MB8|0000000000000000 16902:MB8|0000000000000000 16903:MB8|0000000000000000 16904:MB8|0000000000000000 16905:MB8|0000000000000000 16906:MB8|0000000000000000 16907:MB8|0000000000000000 16908:MB8|0000000000000000 16909:MB8|0000000000000000 16910:MB8|0000000000000000 16911:MB8|0000000000000000 16912:MB8|0000000000000000 16913:MB8|0000000000000000 16914:MB8|0000000000000000 16915:MB8|0000000000000000 16916:MB8|0000000000000000 16917:MB8|0000000000000000 16918:MB8|0000000000000000 16919:MB8|0000000000000000 16920:MB8|0000000000000000 16921:MB8|0000000000000000 16922:MB8|0000000000000000 16923:MB8|0000000000000000 16924:MB8|0000000000000000 16925:MB8|0000000000000000 16926:MB8|0000000000000000 16927:MB8|0000000000000000 16928:MB8|0000000000000000 16929:MB8|0000000000000000 16930:MB8|0000000000000000 16931:MB8|0000000000000000 16932:MB8|0000000000000000 16933:MB8|0000000000000000 16934:MB8|0000000000000000 16935:MB8|0000000000000000 16936:MB8|0000000000000000 16937:MB8|0000000000000000 16938:MB8|0000000000000000 16939:MB8|0000000000000000 16940:MB8|0000000000000000 16941:MB8|0000000000000000 16942:MB8|0000000000000000 16943:MB8|0000000000000000 16944:MB8|0000000000000000 16945:MB8|0000000000000000 16946:MB8|0000000000000000 16947:MB8|0000000000000000 16948:MB8|0000000000000000 16949:MB8|0000000000000000 16950:MB8|0000000000000000 16951:MB8|0000000000000000 16952:MB8|0000000000000000 16953:MB8|0000000000000000 16954:MB8|0000000000000000 16955:MB8|0000000000000000 16956:MB8|0000000000000000 16957:MB8|0000000000000000 16958:MB8|0000000000000000 16959:MB8|0000000000000000 16960:MB8|0000000000000000 16961:MB8|0000000000000000 16962:MB8|0000000000000000 16963:MB8|0000000000000000 16964:MB8|0000000000000000 16965:MB8|0000000000000000 16966:MB8|0000000000000000 16967:MB8|0000000000000000 16968:MB8|0000000000000000 16969:MB8|0000000000000000 16970:MB8|0000000000000000 16971:MB8|0000000000000000 16972:MB8|0000000000000000 16973:MB8|0000000000000000 16974:MB8|0000000000000000 16975:MB8|0000000000000000 16976:MB8|0000000000000000 16977:MB8|0000000000000000 16978:MB8|0000000000000000 16979:MB8|0000000000000000 16980:MB8|0000000000000000 16981:MB8|0000000000000000 16982:MB8|0000000000000000 16983:MB8|0000000000000000 16984:MB8|0000000000000000 16985:MB8|0000000000000000 16986:MB8|0000000000000000 16987:MB8|0000000000000000 16988:MB8|0000000000000000 16989:MB8|0000000000000000 16990:MB8|0000000000000000 16991:MB8|0000000000000000 16992:MB8|0000000000000000 16993:MB8|0000000000000000 16994:MB8|0000000000000000 16995:MB8|0000000000000000 16996:MB8|0000000000000000 16997:MB8|0000000000000000 16998:MB8|0000000000000000 16999:MB8|0000000000000000 17000:MB8|0000000000000000 17001:MB8|0000000000000000 17002:MB8|0000000000000000 17003:MB8|0000000000000000 17004:MB8|0000000000000000 17005:MB8|0000000000000000 17006:MB8|0000000000000000 17007:MB8|0000000000000000 17008:MB8|0000000000000000 17009:MB8|0000000000000000 17010:MB8|0000000000000000 17011:MB8|0000000000000000 17012:MB8|0000000000000000 17013:MB8|0000000000000000 17014:MB8|0000000000000000 17015:MB8|0000000000000000 17016:MB8|0000000000000000 17017:MB8|0000000000000000 17018:MB8|0000000000000000 17019:MB8|0000000000000000 17020:MB8|0000000000000000 17021:MB8|0000000000000000 17022:MB8|0000000000000000 17023:MB8|0000000000000000 17024:MB8|0000000000000000 17025:MB8|0000000000000000 17026:MB8|0000000000000000 17027:MB8|0000000000000000 17028:MB8|0000000000000000 17029:MB8|0000000000000000 17030:MB8|0000000000000000 17031:MB8|0000000000000000 17032:MB8|0000000000000000 17033:MB8|0000000000000000 17034:MB8|0000000000000000 17035:MB8|0000000000000000 17036:MB8|0000000000000000 17037:MB8|0000000000000000 17038:MB8|0000000000000000 17039:MB8|0000000000000000 17040:MB8|0000000000000000 17041:MB8|0000000000000000 17042:MB8|0000000000000000 17043:MB8|0000000000000000 17044:MB8|0000000000000000 17045:MB8|0000000000000000 17046:MB8|0000000000000000 17047:MB8|0000000000000000 17048:MB8|0000000000000000 17049:MB8|0000000000000000 17050:MB8|0000000000000000 17051:MB8|0000000000000000 17052:MB8|0000000000000000 17053:MB8|0000000000000000 17054:MB8|0000000000000000 17055:MB8|0000000000000000 17056:MB8|0000000000000000 17057:MB8|0000000000000000 17058:MB8|0000000000000000 17059:MB8|0000000000000000 17060:MB8|0000000000000000 17061:MB8|0000000000000000 17062:MB8|0000000000000000 17063:MB8|0000000000000000 17064:MB8|0000000000000000 17065:MB8|0000000000000000 17066:MB8|0000000000000000 17067:MB8|0000000000000000 17068:MB8|0000000000000000 17069:MB8|0000000000000000 17070:MB8|0000000000000000 17071:MB8|0000000000000000 17072:MB8|0000000000000000 17073:MB8|0000000000000000 17074:MB8|0000000000000000 17075:MB8|0000000000000000 17076:MB8|0000000000000000 17077:MB8|0000000000000000 17078:MB8|0000000000000000 17079:MB8|0000000000000000 17080:MB8|0000000000000000 17081:MB8|0000000000000000 17082:MB8|0000000000000000 17083:MB8|0000000000000000 17084:MB8|0000000000000000 17085:MB8|0000000000000000 17086:MB8|0000000000000000 17087:MB8|0000000000000000 17088:MB8|0000000000000000 17089:MB8|0000000000000000 17090:MB8|0000000000000000 17091:MB8|0000000000000000 17092:MB8|0000000000000000 17093:MB8|0000000000000000 17094:MB8|0000000000000000 17095:MB8|0000000000000000 17096:MB8|0000000000000000 17097:MB8|0000000000000000 17098:MB8|0000000000000000 17099:MB8|0000000000000000 17100:MB8|0000000000000000 17101:MB8|0000000000000000 17102:MB8|0000000000000000 17103:MB8|0000000000000000 17104:MB8|0000000000000000 17105:MB8|0000000000000000 17106:MB8|0000000000000000 17107:MB8|0000000000000000 17108:MB8|0000000000000000 17109:MB8|0000000000000000 17110:MB8|0000000000000000 17111:MB8|0000000000000000 17112:MB8|0000000000000000 17113:MB8|0000000000000000 17114:MB8|0000000000000000 17115:MB8|0000000000000000 17116:MB8|0000000000000000 17117:MB8|0000000000000000 17118:MB8|0000000000000000 17119:MB8|0000000000000000 17120:MB8|0000000000000000 17121:MB8|0000000000000000 17122:MB8|0000000000000000 17123:MB8|0000000000000000 17124:MB8|0000000000000000 17125:MB8|0000000000000000 17126:MB8|0000000000000000 17127:MB8|0000000000000000 17128:MB8|0000000000000000 17129:MB8|0000000000000000 17130:MB8|0000000000000000 17131:MB8|0000000000000000 17132:MB8|0000000000000000 17133:MB8|0000000000000000 17134:MB8|0000000000000000 17135:MB8|0000000000000000 17136:MB8|0000000000000000 17137:MB8|0000000000000000 17138:MB8|0000000000000000 17139:MB8|0000000000000000 17140:MB8|0000000000000000 17141:MB8|0000000000000000 17142:MB8|0000000000000000 17143:MB8|0000000000000000 17144:MB8|0000000000000000 17145:MB8|0000000000000000 17146:MB8|0000000000000000 17147:MB8|0000000000000000 17148:MB8|0000000000000000 17149:MB8|0000000000000000 17150:MB8|0000000000000000 17151:MB8|0000000000000000 17152:MB8|0000000000000000 17153:MB8|0000000000000000 17154:MB8|0000000000000000 17155:MB8|0000000000000000 17156:MB8|0000000000000000 17157:MB8|0000000000000000 17158:MB8|0000000000000000 17159:MB8|0000000000000000 17160:MB8|0000000000000000 17161:MB8|0000000000000000 17162:MB8|0000000000000000 17163:MB8|0000000000000000 17164:MB8|0000000000000000 17165:MB8|0000000000000000 17166:MB8|0000000000000000 17167:MB8|0000000000000000 17168:MB8|0000000000000000 17169:MB8|0000000000000000 17170:MB8|0000000000000000 17171:MB8|0000000000000000 17172:MB8|0000000000000000 17173:MB8|0000000000000000 17174:MB8|0000000000000000 17175:MB8|0000000000000000 17176:MB8|0000000000000000 17177:MB8|0000000000000000 17178:MB8|0000000000000000 17179:MB8|0000000000000000 17180:MB8|0000000000000000 17181:MB8|0000000000000000 17182:MB8|0000000000000000 17183:MB8|0000000000000000 17184:MB8|0000000000000000 17185:MB8|0000000000000000 17186:MB8|0000000000000000 17187:MB8|0000000000000000 17188:MB8|0000000000000000 17189:MB8|0000000000000000 17190:MB8|0000000000000000 17191:MB8|0000000000000000 17192:MB8|0000000000000000 17193:MB8|0000000000000000 17194:MB8|0000000000000000 17195:MB8|0000000000000000 17196:MB8|0000000000000000 17197:MB8|0000000000000000 17198:MB8|0000000000000000 17199:MB8|0000000000000000 17200:MB8|0000000000000000 17201:MB8|0000000000000000 17202:MB8|0000000000000000 17203:MB8|0000000000000000 17204:MB8|0000000000000000 17205:MB8|0000000000000000 17206:MB8|0000000000000000 17207:MB8|0000000000000000 17208:MB8|0000000000000000 17209:MB8|0000000000000000 17210:MB8|0000000000000000 17211:MB8|0000000000000000 17212:MB8|0000000000000000 17213:MB8|0000000000000000 17214:MB8|0000000000000000 17215:MB8|0000000000000000 17216:MB8|0000000000000000 17217:MB8|0000000000000000 17218:MB8|0000000000000000 17219:MB8|0000000000000000 17220:MB8|0000000000000000 17221:MB8|0000000000000000 17222:MB8|0000000000000000 17223:MB8|0000000000000000 17224:MB8|0000000000000000 17225:MB8|0000000000000000 17226:MB8|0000000000000000 17227:MB8|0000000000000000 17228:MB8|0000000000000000 17229:MB8|0000000000000000 17230:MB8|0000000000000000 17231:MB8|0000000000000000 17232:MB8|0000000000000000 17233:MB8|0000000000000000 17234:MB8|0000000000000000 17235:MB8|0000000000000000 17236:MB8|0000000000000000 17237:MB8|0000000000000000 17238:MB8|0000000000000000 17239:MB8|0000000000000000 17240:MB8|0000000000000000 17241:MB8|0000000000000000 17242:MB8|0000000000000000 17243:MB8|0000000000000000 17244:MB8|0000000000000000 17245:MB8|0000000000000000 17246:MB8|0000000000000000 17247:MB8|0000000000000000 17248:MB8|0000000000000000 17249:MB8|0000000000000000 17250:MB8|0000000000000000 17251:MB8|0000000000000000 17252:MB8|0000000000000000 17253:MB8|0000000000000000 17254:MB8|0000000000000000 17255:MB8|0000000000000000 17256:MB8|0000000000000000 17257:MB8|0000000000000000 17258:MB8|0000000000000000 17259:MB8|0000000000000000 17260:MB8|0000000000000000 17261:MB8|0000000000000000 17262:MB8|0000000000000000 17263:MB8|0000000000000000 17264:MB8|0000000000000000 17265:MB8|0000000000000000 17266:MB8|0000000000000000 17267:MB8|0000000000000000 17268:MB8|0000000000000000 17269:MB8|0000000000000000 17270:MB8|0000000000000000 17271:MB8|0000000000000000 17272:MB8|0000000000000000 17273:MB8|0000000000000000 17274:MB8|0000000000000000 17275:MB8|0000000000000000 17276:MB8|0000000000000000 17277:MB8|0000000000000000 17278:MB8|0000000000000000 17279:MB8|0000000000000000 17280:MB8|0000000000000000 17281:MB8|0000000000000000 17282:MB8|0000000000000000 17283:MB8|0000000000000000 17284:MB8|0000000000000000 17285:MB8|0000000000000000 17286:MB8|0000000000000000 17287:MB8|0000000000000000 17288:MB8|0000000000000000 17289:MB8|0000000000000000 17290:MB8|0000000000000000 17291:MB8|0000000000000000 17292:MB8|0000000000000000 17293:MB8|0000000000000000 17294:MB8|0000000000000000 17295:MB8|0000000000000000 17296:MB8|0000000000000000 17297:MB8|0000000000000000 17298:MB8|0000000000000000 17299:MB8|0000000000000000 17300:MB8|0000000000000000 17301:MB8|0000000000000000 17302:MB8|0000000000000000 17303:MB8|0000000000000000 17304:MB8|0000000000000000 17305:MB8|0000000000000000 17306:MB8|0000000000000000 17307:MB8|0000000000000000 17308:MB8|0000000000000000 17309:MB8|0000000000000000 17310:MB8|0000000000000000 17311:MB8|0000000000000000 17312:MB8|0000000000000000 17313:MB8|0000000000000000 17314:MB8|0000000000000000 17315:MB8|0000000000000000 17316:MB8|0000000000000000 17317:MB8|0000000000000000 17318:MB8|0000000000000000 17319:MB8|0000000000000000 17320:MB8|0000000000000000 17321:MB8|0000000000000000 17322:MB8|0000000000000000 17323:MB8|0000000000000000 17324:MB8|0000000000000000 17325:MB8|0000000000000000 17326:MB8|0000000000000000 17327:MB8|0000000000000000 17328:MB8|0000000000000000 17329:MB8|0000000000000000 17330:MB8|0000000000000000 17331:MB8|0000000000000000 17332:MB8|0000000000000000 17333:MB8|0000000000000000 17334:MB8|0000000000000000 17335:MB8|0000000000000000 17336:MB8|0000000000000000 17337:MB8|0000000000000000 17338:MB8|0000000000000000 17339:MB8|0000000000000000 17340:MB8|0000000000000000 17341:MB8|0000000000000000 17342:MB8|0000000000000000 17343:MB8|0000000000000000 17344:MB8|0000000000000000 17345:MB8|0000000000000000 17346:MB8|0000000000000000 17347:MB8|0000000000000000 17348:MB8|0000000000000000 17349:MB8|0000000000000000 17350:MB8|0000000000000000 17351:MB8|0000000000000000 17352:MB8|0000000000000000 17353:MB8|0000000000000000 17354:MB8|0000000000000000 17355:MB8|0000000000000000 17356:MB8|0000000000000000 17357:MB8|0000000000000000 17358:MB8|0000000000000000 17359:MB8|0000000000000000 17360:MB8|0000000000000000 17361:MB8|0000000000000000 17362:MB8|0000000000000000 17363:MB8|0000000000000000 17364:MB8|0000000000000000 17365:MB8|0000000000000000 17366:MB8|0000000000000000 17367:MB8|0000000000000000 17368:MB8|0000000000000000 17369:MB8|0000000000000000 17370:MB8|0000000000000000 17371:MB8|0000000000000000 17372:MB8|0000000000000000 17373:MB8|0000000000000000 17374:MB8|0000000000000000 17375:MB8|0000000000000000 17376:MB8|0000000000000000 17377:MB8|0000000000000000 17378:MB8|0000000000000000 17379:MB8|0000000000000000 17380:MB8|0000000000000000 17381:MB8|0000000000000000 17382:MB8|0000000000000000 17383:MB8|0000000000000000 17384:MB8|0000000000000000 17385:MB8|0000000000000000 17386:MB8|0000000000000000 17387:MB8|0000000000000000 17388:MB8|0000000000000000 17389:MB8|0000000000000000 17390:MB8|0000000000000000 17391:MB8|0000000000000000 17392:MB8|0000000000000000 17393:MB8|0000000000000000 17394:MB8|0000000000000000 17395:MB8|0000000000000000 17396:MB8|0000000000000000 17397:MB8|0000000000000000 17398:MB8|0000000000000000 17399:MB8|0000000000000000 17400:MB8|0000000000000000 17401:MB8|0000000000000000 17402:MB8|0000000000000000 17403:MB8|0000000000000000 17404:MB8|0000000000000000 17405:MB8|0000000000000000 17406:MB8|0000000000000000 17407:MB8|0000000000000000 17408:MB8|0000000000000000 17409:MB8|0000000000000000 17410:MB8|0000000000000000 17411:MB8|0000000000000000 17412:MB8|0000000000000000 17413:MB8|0000000000000000 17414:MB8|0000000000000000 17415:MB8|0000000000000000 17416:MB8|0000000000000000 17417:MB8|0000000000000000 17418:MB8|0000000000000000 17419:MB8|0000000000000000 17420:MB8|0000000000000000 17421:MB8|0000000000000000 17422:MB8|0000000000000000 17423:MB8|0000000000000000 17424:MB8|0000000000000000 17425:MB8|0000000000000000 17426:MB8|0000000000000000 17427:MB8|0000000000000000 17428:MB8|0000000000000000 17429:MB8|0000000000000000 17430:MB8|0000000000000000 17431:MB8|0000000000000000 17432:MB8|0000000000000000 17433:MB8|0000000000000000 17434:MB8|0000000000000000 17435:MB8|0000000000000000 17436:MB8|0000000000000000 17437:MB8|0000000000000000 17438:MB8|0000000000000000 17439:MB8|0000000000000000 17440:MB8|0000000000000000 17441:MB8|0000000000000000 17442:MB8|0000000000000000 17443:MB8|0000000000000000 17444:MB8|0000000000000000 17445:MB8|0000000000000000 17446:MB8|0000000000000000 17447:MB8|0000000000000000 17448:MB8|0000000000000000 17449:MB8|0000000000000000 17450:MB8|0000000000000000 17451:MB8|0000000000000000 17452:MB8|0000000000000000 17453:MB8|0000000000000000 17454:MB8|0000000000000000 17455:MB8|0000000000000000 17456:MB8|0000000000000000 17457:MB8|0000000000000000 17458:MB8|0000000000000000 17459:MB8|0000000000000000 17460:MB8|0000000000000000 17461:MB8|0000000000000000 17462:MB8|0000000000000000 17463:MB8|0000000000000000 17464:MB8|0000000000000000 17465:MB8|0000000000000000 17466:MB8|0000000000000000 17467:MB8|0000000000000000 17468:MB8|0000000000000000 17469:MB8|0000000000000000 17470:MB8|0000000000000000 17471:MB8|0000000000000000 17472:MB8|0000000000000000 17473:MB8|0000000000000000 17474:MB8|0000000000000000 17475:MB8|0000000000000000 17476:MB8|0000000000000000 17477:MB8|0000000000000000 17478:MB8|0000000000000000 17479:MB8|0000000000000000 17480:MB8|0000000000000000 17481:MB8|0000000000000000 17482:MB8|0000000000000000 17483:MB8|0000000000000000 17484:MB8|0000000000000000 17485:MB8|0000000000000000 17486:MB8|0000000000000000 17487:MB8|0000000000000000 17488:MB8|0000000000000000 17489:MB8|0000000000000000 17490:MB8|0000000000000000 17491:MB8|0000000000000000 17492:MB8|0000000000000000 17493:MB8|0000000000000000 17494:MB8|0000000000000000 17495:MB8|0000000000000000 17496:MB8|0000000000000000 17497:MB8|0000000000000000 17498:MB8|0000000000000000 17499:MB8|0000000000000000 17500:MB8|0000000000000000 17501:MB8|0000000000000000 17502:MB8|0000000000000000 17503:MB8|0000000000000000 17504:MB8|0000000000000000 17505:MB8|0000000000000000 17506:MB8|0000000000000000 17507:MB8|0000000000000000 17508:MB8|0000000000000000 17509:MB8|0000000000000000 17510:MB8|0000000000000000 17511:MB8|0000000000000000 17512:MB8|0000000000000000 17513:MB8|0000000000000000 17514:MB8|0000000000000000 17515:MB8|0000000000000000 17516:MB8|0000000000000000 17517:MB8|0000000000000000 17518:MB8|0000000000000000 17519:MB8|0000000000000000 17520:MB8|0000000000000000 17521:MB8|0000000000000000 17522:MB8|0000000000000000 17523:MB8|0000000000000000 17524:MB8|0000000000000000 17525:MB8|0000000000000000 17526:MB8|0000000000000000 17527:MB8|0000000000000000 17528:MB8|0000000000000000 17529:MB8|0000000000000000 17530:MB8|0000000000000000 17531:MB8|0000000000000000 17532:MB8|0000000000000000 17533:MB8|0000000000000000 17534:MB8|0000000000000000 17535:MB8|0000000000000000 17536:MB8|0000000000000000 17537:MB8|0000000000000000 17538:MB8|0000000000000000 17539:MB8|0000000000000000 17540:MB8|0000000000000000 17541:MB8|0000000000000000 17542:MB8|0000000000000000 17543:MB8|0000000000000000 17544:MB8|0000000000000000 17545:MB8|0000000000000000 17546:MB8|0000000000000000 17547:MB8|0000000000000000 17548:MB8|0000000000000000 17549:MB8|0000000000000000 17550:MB8|0000000000000000 17551:MB8|0000000000000000 17552:MB8|0000000000000000 17553:MB8|0000000000000000 17554:MB8|0000000000000000 17555:MB8|0000000000000000 17556:MB8|0000000000000000 17557:MB8|0000000000000000 17558:MB8|0000000000000000 17559:MB8|0000000000000000 17560:MB8|0000000000000000 17561:MB8|0000000000000000 17562:MB8|0000000000000000 17563:MB8|0000000000000000 17564:MB8|0000000000000000 17565:MB8|0000000000000000 17566:MB8|0000000000000000 17567:MB8|0000000000000000 17568:MB8|0000000000000000 17569:MB8|0000000000000000 17570:MB8|0000000000000000 17571:MB8|0000000000000000 17572:MB8|0000000000000000 17573:MB8|0000000000000000 17574:MB8|0000000000000000 17575:MB8|0000000000000000 17576:MB8|0000000000000000 17577:MB8|0000000000000000 17578:MB8|0000000000000000 17579:MB8|0000000000000000 17580:MB8|0000000000000000 17581:MB8|0000000000000000 17582:MB8|0000000000000000 17583:MB8|0000000000000000 17584:MB8|0000000000000000 17585:MB8|0000000000000000 17586:MB8|0000000000000000 17587:MB8|0000000000000000 17588:MB8|0000000000000000 17589:MB8|0000000000000000 17590:MB8|0000000000000000 17591:MB8|0000000000000000 17592:MB8|0000000000000000 17593:MB8|0000000000000000 17594:MB8|0000000000000000 17595:MB8|0000000000000000 17596:MB8|0000000000000000 17597:MB8|0000000000000000 17598:MB8|0000000000000000 17599:MB8|0000000000000000 17600:MB8|0000000000000000 17601:MB8|0000000000000000 17602:MB8|0000000000000000 17603:MB8|0000000000000000 17604:MB8|0000000000000000 17605:MB8|0000000000000000 17606:MB8|0000000000000000 17607:MB8|0000000000000000 17608:MB8|0000000000000000 17609:MB8|0000000000000000 17610:MB8|0000000000000000 17611:MB8|0000000000000000 17612:MB8|0000000000000000 17613:MB8|0000000000000000 17614:MB8|0000000000000000 17615:MB8|0000000000000000 17616:MB8|0000000000000000 17617:MB8|0000000000000000 17618:MB8|0000000000000000 17619:MB8|0000000000000000 17620:MB8|0000000000000000 17621:MB8|0000000000000000 17622:MB8|0000000000000000 17623:MB8|0000000000000000 17624:MB8|0000000000000000 17625:MB8|0000000000000000 17626:MB8|0000000000000000 17627:MB8|0000000000000000 17628:MB8|0000000000000000 17629:MB8|0000000000000000 17630:MB8|0000000000000000 17631:MB8|0000000000000000 17632:MB8|0000000000000000 17633:MB8|0000000000000000 17634:MB8|0000000000000000 17635:MB8|0000000000000000 17636:MB8|0000000000000000 17637:MB8|0000000000000000 17638:MB8|0000000000000000 17639:MB8|0000000000000000 17640:MB8|0000000000000000 17641:MB8|0000000000000000 17642:MB8|0000000000000000 17643:MB8|0000000000000000 17644:MB8|0000000000000000 17645:MB8|0000000000000000 17646:MB8|0000000000000000 17647:MB8|0000000000000000 17648:MB8|0000000000000000 17649:MB8|0000000000000000 17650:MB8|0000000000000000 17651:MB8|0000000000000000 17652:MB8|0000000000000000 17653:MB8|0000000000000000 17654:MB8|0000000000000000 17655:MB8|0000000000000000 17656:MB8|0000000000000000 17657:MB8|0000000000000000 17658:MB8|0000000000000000 17659:MB8|0000000000000000 17660:MB8|0000000000000000 17661:MB8|0000000000000000 17662:MB8|0000000000000000 17663:MB8|0000000000000000 17664:MB8|0000000000000000 17665:MB8|0000000000000000 17666:MB8|0000000000000000 17667:MB8|0000000000000000 17668:MB8|0000000000000000 17669:MB8|0000000000000000 17670:MB8|0000000000000000 17671:MB8|0000000000000000 17672:MB8|0000000000000000 17673:MB8|0000000000000000 17674:MB8|0000000000000000 17675:MB8|0000000000000000 17676:MB8|0000000000000000 17677:MB8|0000000000000000 17678:MB8|0000000000000000 17679:MB8|0000000000000000 17680:MB8|0000000000000000 17681:MB8|0000000000000000 17682:MB8|0000000000000000 17683:MB8|0000000000000000 17684:MB8|0000000000000000 17685:MB8|0000000000000000 17686:MB8|0000000000000000 17687:MB8|0000000000000000 17688:MB8|0000000000000000 17689:MB8|0000000000000000 17690:MB8|0000000000000000 17691:MB8|0000000000000000 17692:MB8|0000000000000000 17693:MB8|0000000000000000 17694:MB8|0000000000000000 17695:MB8|0000000000000000 17696:MB8|0000000000000000 17697:MB8|0000000000000000 17698:MB8|0000000000000000 17699:MB8|0000000000000000 17700:MB8|0000000000000000 17701:MB8|0000000000000000 17702:MB8|0000000000000000 17703:MB8|0000000000000000 17704:MB8|0000000000000000 17705:MB8|0000000000000000 17706:MB8|0000000000000000 17707:MB8|0000000000000000 17708:MB8|0000000000000000 17709:MB8|0000000000000000 17710:MB8|0000000000000000 17711:MB8|0000000000000000 17712:MB8|0000000000000000 17713:MB8|0000000000000000 17714:MB8|0000000000000000 17715:MB8|0000000000000000 17716:MB8|0000000000000000 17717:MB8|0000000000000000 17718:MB8|0000000000000000 17719:MB8|0000000000000000 17720:MB8|0000000000000000 17721:MB8|0000000000000000 17722:MB8|0000000000000000 17723:MB8|0000000000000000 17724:MB8|0000000000000000 17725:MB8|0000000000000000 17726:MB8|0000000000000000 17727:MB8|0000000000000000 17728:MB8|0000000000000000 17729:MB8|0000000000000000 17730:MB8|0000000000000000 17731:MB8|0000000000000000 17732:MB8|0000000000000000 17733:MB8|0000000000000000 17734:MB8|0000000000000000 17735:MB8|0000000000000000 17736:MB8|0000000000000000 17737:MB8|0000000000000000 17738:MB8|0000000000000000 17739:MB8|0000000000000000 17740:MB8|0000000000000000 17741:MB8|0000000000000000 17742:MB8|0000000000000000 17743:MB8|0000000000000000 17744:MB8|0000000000000000 17745:MB8|0000000000000000 17746:MB8|0000000000000000 17747:MB8|0000000000000000 17748:MB8|0000000000000000 17749:MB8|0000000000000000 17750:MB8|0000000000000000 17751:MB8|0000000000000000 17752:MB8|0000000000000000 17753:MB8|0000000000000000 17754:MB8|0000000000000000 17755:MB8|0000000000000000 17756:MB8|0000000000000000 17757:MB8|0000000000000000 17758:MB8|0000000000000000 17759:MB8|0000000000000000 17760:MB8|0000000000000000 17761:MB8|0000000000000000 17762:MB8|0000000000000000 17763:MB8|0000000000000000 17764:MB8|0000000000000000 17765:MB8|0000000000000000 17766:MB8|0000000000000000 17767:MB8|0000000000000000 17768:MB8|0000000000000000 17769:MB8|0000000000000000 17770:MB8|0000000000000000 17771:MB8|0000000000000000 17772:MB8|0000000000000000 17773:MB8|0000000000000000 17774:MB8|0000000000000000 17775:MB8|0000000000000000 17776:MB8|0000000000000000 17777:MB8|0000000000000000 17778:MB8|0000000000000000 17779:MB8|0000000000000000 17780:MB8|0000000000000000 17781:MB8|0000000000000000 17782:MB8|0000000000000000 17783:MB8|0000000000000000 17784:MB8|0000000000000000 17785:MB8|0000000000000000 17786:MB8|0000000000000000 17787:MB8|0000000000000000 17788:MB8|0000000000000000 17789:MB8|0000000000000000 17790:MB8|0000000000000000 17791:MB8|0000000000000000 17792:MB8|0000000000000000 17793:MB8|0000000000000000 17794:MB8|0000000000000000 17795:MB8|0000000000000000 17796:MB8|0000000000000000 17797:MB8|0000000000000000 17798:MB8|0000000000000000 17799:MB8|0000000000000000 17800:MB8|0000000000000000 17801:MB8|0000000000000000 17802:MB8|0000000000000000 17803:MB8|0000000000000000 17804:MB8|0000000000000000 17805:MB8|0000000000000000 17806:MB8|0000000000000000 17807:MB8|0000000000000000 17808:MB8|0000000000000000 17809:MB8|0000000000000000 17810:MB8|0000000000000000 17811:MB8|0000000000000000 17812:MB8|0000000000000000 17813:MB8|0000000000000000 17814:MB8|0000000000000000 17815:MB8|0000000000000000 17816:MB8|0000000000000000 17817:MB8|0000000000000000 17818:MB8|0000000000000000 17819:MB8|0000000000000000 17820:MB8|0000000000000000 17821:MB8|0000000000000000 17822:MB8|0000000000000000 17823:MB8|0000000000000000 17824:MB8|0000000000000000 17825:MB8|0000000000000000 17826:MB8|0000000000000000 17827:MB8|0000000000000000 17828:MB8|0000000000000000 17829:MB8|0000000000000000 17830:MB8|0000000000000000 17831:MB8|0000000000000000 17832:MB8|0000000000000000 17833:MB8|0000000000000000 17834:MB8|0000000000000000 17835:MB8|0000000000000000 17836:MB8|0000000000000000 17837:MB8|0000000000000000 17838:MB8|0000000000000000 17839:MB8|0000000000000000 17840:MB8|0000000000000000 17841:MB8|0000000000000000 17842:MB8|0000000000000000 17843:MB8|0000000000000000 17844:MB8|0000000000000000 17845:MB8|0000000000000000 17846:MB8|0000000000000000 17847:MB8|0000000000000000 17848:MB8|0000000000000000 17849:MB8|0000000000000000 17850:MB8|0000000000000000 17851:MB8|0000000000000000 17852:MB8|0000000000000000 17853:MB8|0000000000000000 17854:MB8|0000000000000000 17855:MB8|0000000000000000 17856:MB8|0000000000000000 17857:MB8|0000000000000000 17858:MB8|0000000000000000 17859:MB8|0000000000000000 17860:MB8|0000000000000000 17861:MB8|0000000000000000 17862:MB8|0000000000000000 17863:MB8|0000000000000000 17864:MB8|0000000000000000 17865:MB8|0000000000000000 17866:MB8|0000000000000000 17867:MB8|0000000000000000 17868:MB8|0000000000000000 17869:MB8|0000000000000000 17870:MB8|0000000000000000 17871:MB8|0000000000000000 17872:MB8|0000000000000000 17873:MB8|0000000000000000 17874:MB8|0000000000000000 17875:MB8|0000000000000000 17876:MB8|0000000000000000 17877:MB8|0000000000000000 17878:MB8|0000000000000000 17879:MB8|0000000000000000 17880:MB8|0000000000000000 17881:MB8|0000000000000000 17882:MB8|0000000000000000 17883:MB8|0000000000000000 17884:MB8|0000000000000000 17885:MB8|0000000000000000 17886:MB8|0000000000000000 17887:MB8|0000000000000000 17888:MB8|0000000000000000 17889:MB8|0000000000000000 17890:MB8|0000000000000000 17891:MB8|0000000000000000 17892:MB8|0000000000000000 17893:MB8|0000000000000000 17894:MB8|0000000000000000 17895:MB8|0000000000000000 17896:MB8|0000000000000000 17897:MB8|0000000000000000 17898:MB8|0000000000000000 17899:MB8|0000000000000000 17900:MB8|0000000000000000 17901:MB8|0000000000000000 17902:MB8|0000000000000000 17903:MB8|0000000000000000 17904:MB8|0000000000000000 17905:MB8|0000000000000000 17906:MB8|0000000000000000 17907:MB8|0000000000000000 17908:MB8|0000000000000000 17909:MB8|0000000000000000 17910:MB8|0000000000000000 17911:MB8|0000000000000000 17912:MB8|0000000000000000 17913:MB8|0000000000000000 17914:MB8|0000000000000000 17915:MB8|0000000000000000 17916:MB8|0000000000000000 17917:MB8|0000000000000000 17918:MB8|0000000000000000 17919:MB8|0000000000000000 17920:MB8|0000000000000000 17921:MB8|0000000000000000 17922:MB8|0000000000000000 17923:MB8|0000000000000000 17924:MB8|0000000000000000 17925:MB8|0000000000000000 17926:MB8|0000000000000000 17927:MB8|0000000000000000 17928:MB8|0000000000000000 17929:MB8|0000000000000000 17930:MB8|0000000000000000 17931:MB8|0000000000000000 17932:MB8|0000000000000000 17933:MB8|0000000000000000 17934:MB8|0000000000000000 17935:MB8|0000000000000000 17936:MB8|0000000000000000 17937:MB8|0000000000000000 17938:MB8|0000000000000000 17939:MB8|0000000000000000 17940:MB8|0000000000000000 17941:MB8|0000000000000000 17942:MB8|0000000000000000 17943:MB8|0000000000000000 17944:MB8|0000000000000000 17945:MB8|0000000000000000 17946:MB8|0000000000000000 17947:MB8|0000000000000000 17948:MB8|0000000000000000 17949:MB8|0000000000000000 17950:MB8|0000000000000000 17951:MB8|0000000000000000 17952:MB8|0000000000000000 17953:MB8|0000000000000000 17954:MB8|0000000000000000 17955:MB8|0000000000000000 17956:MB8|0000000000000000 17957:MB8|0000000000000000 17958:MB8|0000000000000000 17959:MB8|0000000000000000 17960:MB8|0000000000000000 17961:MB8|0000000000000000 17962:MB8|0000000000000000 17963:MB8|0000000000000000 17964:MB8|0000000000000000 17965:MB8|0000000000000000 17966:MB8|0000000000000000 17967:MB8|0000000000000000 17968:MB8|0000000000000000 17969:MB8|0000000000000000 17970:MB8|0000000000000000 17971:MB8|0000000000000000 17972:MB8|0000000000000000 17973:MB8|0000000000000000 17974:MB8|0000000000000000 17975:MB8|0000000000000000 17976:MB8|0000000000000000 17977:MB8|0000000000000000 17978:MB8|0000000000000000 17979:MB8|0000000000000000 17980:MB8|0000000000000000 17981:MB8|0000000000000000 17982:MB8|0000000000000000 17983:MB8|0000000000000000 17984:MB8|0000000000000000 17985:MB8|0000000000000000 17986:MB8|0000000000000000 17987:MB8|0000000000000000 17988:MB8|0000000000000000 17989:MB8|0000000000000000 17990:MB8|0000000000000000 17991:MB8|0000000000000000 17992:MB8|0000000000000000 17993:MB8|0000000000000000 17994:MB8|0000000000000000 17995:MB8|0000000000000000 17996:MB8|0000000000000000 17997:MB8|0000000000000000 17998:MB8|0000000000000000 17999:MB8|0000000000000000 18000:MB8|0000000000000000 18001:MB8|0000000000000000 18002:MB8|0000000000000000 18003:MB8|0000000000000000 18004:MB8|0000000000000000 18005:MB8|0000000000000000 18006:MB8|0000000000000000 18007:MB8|0000000000000000 18008:MB8|0000000000000000 18009:MB8|0000000000000000 18010:MB8|0000000000000000 18011:MB8|0000000000000000 18012:MB8|0000000000000000 18013:MB8|0000000000000000 18014:MB8|0000000000000000 18015:MB8|0000000000000000 18016:MB8|0000000000000000 18017:MB8|0000000000000000 18018:MB8|0000000000000000 18019:MB8|0000000000000000 18020:MB8|0000000000000000 18021:MB8|0000000000000000 18022:MB8|0000000000000000 18023:MB8|0000000000000000 18024:MB8|0000000000000000 18025:MB8|0000000000000000 18026:MB8|0000000000000000 18027:MB8|0000000000000000 18028:MB8|0000000000000000 18029:MB8|0000000000000000 18030:MB8|0000000000000000 18031:MB8|0000000000000000 18032:MB8|0000000000000000 18033:MB8|0000000000000000 18034:MB8|0000000000000000 18035:MB8|0000000000000000 18036:MB8|0000000000000000 18037:MB8|0000000000000000 18038:MB8|0000000000000000 18039:MB8|0000000000000000 18040:MB8|0000000000000000 18041:MB8|0000000000000000 18042:MB8|0000000000000000 18043:MB8|0000000000000000 18044:MB8|0000000000000000 18045:MB8|0000000000000000 18046:MB8|0000000000000000 18047:MB8|0000000000000000 18048:MB8|0000000000000000 18049:MB8|0000000000000000 18050:MB8|0000000000000000 18051:MB8|0000000000000000 18052:MB8|0000000000000000 18053:MB8|0000000000000000 18054:MB8|0000000000000000 18055:MB8|0000000000000000 18056:MB8|0000000000000000 18057:MB8|0000000000000000 18058:MB8|0000000000000000 18059:MB8|0000000000000000 18060:MB8|0000000000000000 18061:MB8|0000000000000000 18062:MB8|0000000000000000 18063:MB8|0000000000000000 18064:MB8|0000000000000000 18065:MB8|0000000000000000 18066:MB8|0000000000000000 18067:MB8|0000000000000000 18068:MB8|0000000000000000 18069:MB8|0000000000000000 18070:MB8|0000000000000000 18071:MB8|0000000000000000 18072:MB8|0000000000000000 18073:MB8|0000000000000000 18074:MB8|0000000000000000 18075:MB8|0000000000000000 18076:MB8|0000000000000000 18077:MB8|0000000000000000 18078:MB8|0000000000000000 18079:MB8|0000000000000000 18080:MB8|0000000000000000 18081:MB8|0000000000000000 18082:MB8|0000000000000000 18083:MB8|0000000000000000 18084:MB8|0000000000000000 18085:MB8|0000000000000000 18086:MB8|0000000000000000 18087:MB8|0000000000000000 18088:MB8|0000000000000000 18089:MB8|0000000000000000 18090:MB8|0000000000000000 18091:MB8|0000000000000000 18092:MB8|0000000000000000 18093:MB8|0000000000000000 18094:MB8|0000000000000000 18095:MB8|0000000000000000 18096:MB8|0000000000000000 18097:MB8|0000000000000000 18098:MB8|0000000000000000 18099:MB8|0000000000000000 18100:MB8|0000000000000000 18101:MB8|0000000000000000 18102:MB8|0000000000000000 18103:MB8|0000000000000000 18104:MB8|0000000000000000 18105:MB8|0000000000000000 18106:MB8|0000000000000000 18107:MB8|0000000000000000 18108:MB8|0000000000000000 18109:MB8|0000000000000000 18110:MB8|0000000000000000 18111:MB8|0000000000000000 18112:MB8|0000000000000000 18113:MB8|0000000000000000 18114:MB8|0000000000000000 18115:MB8|0000000000000000 18116:MB8|0000000000000000 18117:MB8|0000000000000000 18118:MB8|0000000000000000 18119:MB8|0000000000000000 18120:MB8|0000000000000000 18121:MB8|0000000000000000 18122:MB8|0000000000000000 18123:MB8|0000000000000000 18124:MB8|0000000000000000 18125:MB8|0000000000000000 18126:MB8|0000000000000000 18127:MB8|0000000000000000 18128:MB8|0000000000000000 18129:MB8|0000000000000000 18130:MB8|0000000000000000 18131:MB8|0000000000000000 18132:MB8|0000000000000000 18133:MB8|0000000000000000 18134:MB8|0000000000000000 18135:MB8|0000000000000000 18136:MB8|0000000000000000 18137:MB8|0000000000000000 18138:MB8|0000000000000000 18139:MB8|0000000000000000 18140:MB8|0000000000000000 18141:MB8|0000000000000000 18142:MB8|0000000000000000 18143:MB8|0000000000000000 18144:MB8|0000000000000000 18145:MB8|0000000000000000 18146:MB8|0000000000000000 18147:MB8|0000000000000000 18148:MB8|0000000000000000 18149:MB8|0000000000000000 18150:MB8|0000000000000000 18151:MB8|0000000000000000 18152:MB8|0000000000000000 18153:MB8|0000000000000000 18154:MB8|0000000000000000 18155:MB8|0000000000000000 18156:MB8|0000000000000000 18157:MB8|0000000000000000 18158:MB8|0000000000000000 18159:MB8|0000000000000000 18160:MB8|0000000000000000 18161:MB8|0000000000000000 18162:MB8|0000000000000000 18163:MB8|0000000000000000 18164:MB8|0000000000000000 18165:MB8|0000000000000000 18166:MB8|0000000000000000 18167:MB8|0000000000000000 18168:MB8|0000000000000000 18169:MB8|0000000000000000 18170:MB8|0000000000000000 18171:MB8|0000000000000000 18172:MB8|0000000000000000 18173:MB8|0000000000000000 18174:MB8|0000000000000000 18175:MB8|0000000000000000 18176:MB8|0000000000000000 18177:MB8|0000000000000000 18178:MB8|0000000000000000 18179:MB8|0000000000000000 18180:MB8|0000000000000000 18181:MB8|0000000000000000 18182:MB8|0000000000000000 18183:MB8|0000000000000000 18184:MB8|0000000000000000 18185:MB8|0000000000000000 18186:MB8|0000000000000000 18187:MB8|0000000000000000 18188:MB8|0000000000000000 18189:MB8|0000000000000000 18190:MB8|0000000000000000 18191:MB8|0000000000000000 18192:MB8|0000000000000000 18193:MB8|0000000000000000 18194:MB8|0000000000000000 18195:MB8|0000000000000000 18196:MB8|0000000000000000 18197:MB8|0000000000000000 18198:MB8|0000000000000000 18199:MB8|0000000000000000 18200:MB8|0000000000000000 18201:MB8|0000000000000000 18202:MB8|0000000000000000 18203:MB8|0000000000000000 18204:MB8|0000000000000000 18205:MB8|0000000000000000 18206:MB8|0000000000000000 18207:MB8|0000000000000000 18208:MB8|0000000000000000 18209:MB8|0000000000000000 18210:MB8|0000000000000000 18211:MB8|0000000000000000 18212:MB8|0000000000000000 18213:MB8|0000000000000000 18214:MB8|0000000000000000 18215:MB8|0000000000000000 18216:MB8|0000000000000000 18217:MB8|0000000000000000 18218:MB8|0000000000000000 18219:MB8|0000000000000000 18220:MB8|0000000000000000 18221:MB8|0000000000000000 18222:MB8|0000000000000000 18223:MB8|0000000000000000 18224:MB8|0000000000000000 18225:MB8|0000000000000000 18226:MB8|0000000000000000 18227:MB8|0000000000000000 18228:MB8|0000000000000000 18229:MB8|0000000000000000 18230:MB8|0000000000000000 18231:MB8|0000000000000000 18232:MB8|0000000000000000 18233:MB8|0000000000000000 18234:MB8|0000000000000000 18235:MB8|0000000000000000 18236:MB8|0000000000000000 18237:MB8|0000000000000000 18238:MB8|0000000000000000 18239:MB8|0000000000000000 18240:MB8|0000000000000000 18241:MB8|0000000000000000 18242:MB8|0000000000000000 18243:MB8|0000000000000000 18244:MB8|0000000000000000 18245:MB8|0000000000000000 18246:MB8|0000000000000000 18247:MB8|0000000000000000 18248:MB8|0000000000000000 18249:MB8|0000000000000000 18250:MB8|0000000000000000 18251:MB8|0000000000000000 18252:MB8|0000000000000000 18253:MB8|0000000000000000 18254:MB8|0000000000000000 18255:MB8|0000000000000000 18256:MB8|0000000000000000 18257:MB8|0000000000000000 18258:MB8|0000000000000000 18259:MB8|0000000000000000 18260:MB8|0000000000000000 18261:MB8|0000000000000000 18262:MB8|0000000000000000 18263:MB8|0000000000000000 18264:MB8|0000000000000000 18265:MB8|0000000000000000 18266:MB8|0000000000000000 18267:MB8|0000000000000000 18268:MB8|0000000000000000 18269:MB8|0000000000000000 18270:MB8|0000000000000000 18271:MB8|0000000000000000 18272:MB8|0000000000000000 18273:MB8|0000000000000000 18274:MB8|0000000000000000 18275:MB8|0000000000000000 18276:MB8|0000000000000000 18277:MB8|0000000000000000 18278:MB8|0000000000000000 18279:MB8|0000000000000000 18280:MB8|0000000000000000 18281:MB8|0000000000000000 18282:MB8|0000000000000000 18283:MB8|0000000000000000 18284:MB8|0000000000000000 18285:MB8|0000000000000000 18286:MB8|0000000000000000 18287:MB8|0000000000000000 18288:MB8|0000000000000000 18289:MB8|0000000000000000 18290:MB8|0000000000000000 18291:MB8|0000000000000000 18292:MB8|0000000000000000 18293:MB8|0000000000000000 18294:MB8|0000000000000000 18295:MB8|0000000000000000 18296:MB8|0000000000000000 18297:MB8|0000000000000000 18298:MB8|0000000000000000 18299:MB8|0000000000000000 18300:MB8|0000000000000000 18301:MB8|0000000000000000 18302:MB8|0000000000000000 18303:MB8|0000000000000000 18304:MB8|0000000000000000 18305:MB8|0000000000000000 18306:MB8|0000000000000000 18307:MB8|0000000000000000 18308:MB8|0000000000000000 18309:MB8|0000000000000000 18310:MB8|0000000000000000 18311:MB8|0000000000000000 18312:MB8|0000000000000000 18313:MB8|0000000000000000 18314:MB8|0000000000000000 18315:MB8|0000000000000000 18316:MB8|0000000000000000 18317:MB8|0000000000000000 18318:MB8|0000000000000000 18319:MB8|0000000000000000 18320:MB8|0000000000000000 18321:MB8|0000000000000000 18322:MB8|0000000000000000 18323:MB8|0000000000000000 18324:MB8|0000000000000000 18325:MB8|0000000000000000 18326:MB8|0000000000000000 18327:MB8|0000000000000000 18328:MB8|0000000000000000 18329:MB8|0000000000000000 18330:MB8|0000000000000000 18331:MB8|0000000000000000 18332:MB8|0000000000000000 18333:MB8|0000000000000000 18334:MB8|0000000000000000 18335:MB8|0000000000000000 18336:MB8|0000000000000000 18337:MB8|0000000000000000 18338:MB8|0000000000000000 18339:MB8|0000000000000000 18340:MB8|0000000000000000 18341:MB8|0000000000000000 18342:MB8|0000000000000000 18343:MB8|0000000000000000 18344:MB8|0000000000000000 18345:MB8|0000000000000000 18346:MB8|0000000000000000 18347:MB8|0000000000000000 18348:MB8|0000000000000000 18349:MB8|0000000000000000 18350:MB8|0000000000000000 18351:MB8|0000000000000000 18352:MB8|0000000000000000 18353:MB8|0000000000000000 18354:MB8|0000000000000000 18355:MB8|0000000000000000 18356:MB8|0000000000000000 18357:MB8|0000000000000000 18358:MB8|0000000000000000 18359:MB8|0000000000000000 18360:MB8|0000000000000000 18361:MB8|0000000000000000 18362:MB8|0000000000000000 18363:MB8|0000000000000000 18364:MB8|0000000000000000 18365:MB8|0000000000000000 18366:MB8|0000000000000000 18367:MB8|0000000000000000 18368:MB8|0000000000000000 18369:MB8|0000000000000000 18370:MB8|0000000000000000 18371:MB8|0000000000000000 18372:MB8|0000000000000000 18373:MB8|0000000000000000 18374:MB8|0000000000000000 18375:MB8|0000000000000000 18376:MB8|0000000000000000 18377:MB8|0000000000000000 18378:MB8|0000000000000000 18379:MB8|0000000000000000 18380:MB8|0000000000000000 18381:MB8|0000000000000000 18382:MB8|0000000000000000 18383:MB8|0000000000000000 18384:MB8|0000000000000000 18385:MB8|0000000000000000 18386:MB8|0000000000000000 18387:MB8|0000000000000000 18388:MB8|0000000000000000 18389:MB8|0000000000000000 18390:MB8|0000000000000000 18391:MB8|0000000000000000 18392:MB8|0000000000000000 18393:MB8|0000000000000000 18394:MB8|0000000000000000 18395:MB8|0000000000000000 18396:MB8|0000000000000000 18397:MB8|0000000000000000 18398:MB8|0000000000000000 18399:MB8|0000000000000000 18400:MB8|0000000000000000 18401:MB8|0000000000000000 18402:MB8|0000000000000000 18403:MB8|0000000000000000 18404:MB8|0000000000000000 18405:MB8|0000000000000000 18406:MB8|0000000000000000 18407:MB8|0000000000000000 18408:MB8|0000000000000000 18409:MB8|0000000000000000 18410:MB8|0000000000000000 18411:MB8|0000000000000000 18412:MB8|0000000000000000 18413:MB8|0000000000000000 18414:MB8|0000000000000000 18415:MB8|0000000000000000 18416:MB8|0000000000000000 18417:MB8|0000000000000000 18418:MB8|0000000000000000 18419:MB8|0000000000000000 18420:MB8|0000000000000000 18421:MB8|0000000000000000 18422:MB8|0000000000000000 18423:MB8|0000000000000000 18424:MB8|0000000000000000 18425:MB8|0000000000000000 18426:MB8|0000000000000000 18427:MB8|0000000000000000 18428:MB8|0000000000000000 18429:MB8|0000000000000000 18430:MB8|0000000000000000 18431:MB8|0000000000000000 18432:MB8|0000000000000000 18433:MB8|0000000000000000 18434:MB8|0000000000000000 18435:MB8|0000000000000000 18436:MB8|0000000000000000 18437:MB8|0000000000000000 18438:MB8|0000000000000000 18439:MB8|0000000000000000 18440:MB8|0000000000000000 18441:MB8|0000000000000000 18442:MB8|0000000000000000 18443:MB8|0000000000000000 18444:MB8|0000000000000000 18445:MB8|0000000000000000 18446:MB8|0000000000000000 18447:MB8|0000000000000000 18448:MB8|0000000000000000 18449:MB8|0000000000000000 18450:MB8|0000000000000000 18451:MB8|0000000000000000 18452:MB8|0000000000000000 18453:MB8|0000000000000000 18454:MB8|0000000000000000 18455:MB8|0000000000000000 18456:MB8|0000000000000000 18457:MB8|0000000000000000 18458:MB8|0000000000000000 18459:MB8|0000000000000000 18460:MB8|0000000000000000 18461:MB8|0000000000000000 18462:MB8|0000000000000000 18463:MB8|0000000000000000 18464:MB8|0000000000000000 18465:MB8|0000000000000000 18466:MB8|0000000000000000 18467:MB8|0000000000000000 18468:MB8|0000000000000000 18469:MB8|0000000000000000 18470:MB8|0000000000000000 18471:MB8|0000000000000000 18472:MB8|0000000000000000 18473:MB8|0000000000000000 18474:MB8|0000000000000000 18475:MB8|0000000000000000 18476:MB8|0000000000000000 18477:MB8|0000000000000000 18478:MB8|0000000000000000 18479:MB8|0000000000000000 18480:MB8|0000000000000000 18481:MB8|0000000000000000 18482:MB8|0000000000000000 18483:MB8|0000000000000000 18484:MB8|0000000000000000 18485:MB8|0000000000000000 18486:MB8|0000000000000000 18487:MB8|0000000000000000 18488:MB8|0000000000000000 18489:MB8|0000000000000000 18490:MB8|0000000000000000 18491:MB8|0000000000000000 18492:MB8|0000000000000000 18493:MB8|0000000000000000 18494:MB8|0000000000000000 18495:MB8|0000000000000000 18496:MB8|0000000000000000 18497:MB8|0000000000000000 18498:MB8|0000000000000000 18499:MB8|0000000000000000 18500:MB8|0000000000000000 18501:MB8|0000000000000000 18502:MB8|0000000000000000 18503:MB8|0000000000000000 18504:MB8|0000000000000000 18505:MB8|0000000000000000 18506:MB8|0000000000000000 18507:MB8|0000000000000000 18508:MB8|0000000000000000 18509:MB8|0000000000000000 18510:MB8|0000000000000000 18511:MB8|0000000000000000 18512:MB8|0000000000000000 18513:MB8|0000000000000000 18514:MB8|0000000000000000 18515:MB8|0000000000000000 18516:MB8|0000000000000000 18517:MB8|0000000000000000 18518:MB8|0000000000000000 18519:MB8|0000000000000000 18520:MB8|0000000000000000 18521:MB8|0000000000000000 18522:MB8|0000000000000000 18523:MB8|0000000000000000 18524:MB8|0000000000000000 18525:MB8|0000000000000000 18526:MB8|0000000000000000 18527:MB8|0000000000000000 18528:MB8|0000000000000000 18529:MB8|0000000000000000 18530:MB8|0000000000000000 18531:MB8|0000000000000000 18532:MB8|0000000000000000 18533:MB8|0000000000000000 18534:MB8|0000000000000000 18535:MB8|0000000000000000 18536:MB8|0000000000000000 18537:MB8|0000000000000000 18538:MB8|0000000000000000 18539:MB8|0000000000000000 18540:MB8|0000000000000000 18541:MB8|0000000000000000 18542:MB8|0000000000000000 18543:MB8|0000000000000000 18544:MB8|0000000000000000 18545:MB8|0000000000000000 18546:MB8|0000000000000000 18547:MB8|0000000000000000 18548:MB8|0000000000000000 18549:MB8|0000000000000000 18550:MB8|0000000000000000 18551:MB8|0000000000000000 18552:MB8|0000000000000000 18553:MB8|0000000000000000 18554:MB8|0000000000000000 18555:MB8|0000000000000000 18556:MB8|0000000000000000 18557:MB8|0000000000000000 18558:MB8|0000000000000000 18559:MB8|0000000000000000 18560:MB8|0000000000000000 18561:MB8|0000000000000000 18562:MB8|0000000000000000 18563:MB8|0000000000000000 18564:MB8|0000000000000000 18565:MB8|0000000000000000 18566:MB8|0000000000000000 18567:MB8|0000000000000000 18568:MB8|0000000000000000 18569:MB8|0000000000000000 18570:MB8|0000000000000000 18571:MB8|0000000000000000 18572:MB8|0000000000000000 18573:MB8|0000000000000000 18574:MB8|0000000000000000 18575:MB8|0000000000000000 18576:MB8|0000000000000000 18577:MB8|0000000000000000 18578:MB8|0000000000000000 18579:MB8|0000000000000000 18580:MB8|0000000000000000 18581:MB8|0000000000000000 18582:MB8|0000000000000000 18583:MB8|0000000000000000 18584:MB8|0000000000000000 18585:MB8|0000000000000000 18586:MB8|0000000000000000 18587:MB8|0000000000000000 18588:MB8|0000000000000000 18589:MB8|0000000000000000 18590:MB8|0000000000000000 18591:MB8|0000000000000000 18592:MB8|0000000000000000 18593:MB8|0000000000000000 18594:MB8|0000000000000000 18595:MB8|0000000000000000 18596:MB8|0000000000000000 18597:MB8|0000000000000000 18598:MB8|0000000000000000 18599:MB8|0000000000000000 18600:MB8|0000000000000000 18601:MB8|0000000000000000 18602:MB8|0000000000000000 18603:MB8|0000000000000000 18604:MB8|0000000000000000 18605:MB8|0000000000000000 18606:MB8|0000000000000000 18607:MB8|0000000000000000 18608:MB8|0000000000000000 18609:MB8|0000000000000000 18610:MB8|0000000000000000 18611:MB8|0000000000000000 18612:MB8|0000000000000000 18613:MB8|0000000000000000 18614:MB8|0000000000000000 18615:MB8|0000000000000000 18616:MB8|0000000000000000 18617:MB8|0000000000000000 18618:MB8|0000000000000000 18619:MB8|0000000000000000 18620:MB8|0000000000000000 18621:MB8|0000000000000000 18622:MB8|0000000000000000 18623:MB8|0000000000000000 18624:MB8|0000000000000000 18625:MB8|0000000000000000 18626:MB8|0000000000000000 18627:MB8|0000000000000000 18628:MB8|0000000000000000 18629:MB8|0000000000000000 18630:MB8|0000000000000000 18631:MB8|0000000000000000 18632:MB8|0000000000000000 18633:MB8|0000000000000000 18634:MB8|0000000000000000 18635:MB8|0000000000000000 18636:MB8|0000000000000000 18637:MB8|0000000000000000 18638:MB8|0000000000000000 18639:MB8|0000000000000000 18640:MB8|0000000000000000 18641:MB8|0000000000000000 18642:MB8|0000000000000000 18643:MB8|0000000000000000 18644:MB8|0000000000000000 18645:MB8|0000000000000000 18646:MB8|0000000000000000 18647:MB8|0000000000000000 18648:MB8|0000000000000000 18649:MB8|0000000000000000 18650:MB8|0000000000000000 18651:MB8|0000000000000000 18652:MB8|0000000000000000 18653:MB8|0000000000000000 18654:MB8|0000000000000000 18655:MB8|0000000000000000 18656:MB8|0000000000000000 18657:MB8|0000000000000000 18658:MB8|0000000000000000 18659:MB8|0000000000000000 18660:MB8|0000000000000000 18661:MB8|0000000000000000 18662:MB8|0000000000000000 18663:MB8|0000000000000000 18664:MB8|0000000000000000 18665:MB8|0000000000000000 18666:MB8|0000000000000000 18667:MB8|0000000000000000 18668:MB8|0000000000000000 18669:MB8|0000000000000000 18670:MB8|0000000000000000 18671:MB8|0000000000000000 18672:MB8|0000000000000000 18673:MB8|0000000000000000 18674:MB8|0000000000000000 18675:MB8|0000000000000000 18676:MB8|0000000000000000 18677:MB8|0000000000000000 18678:MB8|0000000000000000 18679:MB8|0000000000000000 18680:MB8|0000000000000000 18681:MB8|0000000000000000 18682:MB8|0000000000000000 18683:MB8|0000000000000000 18684:MB8|0000000000000000 18685:MB8|0000000000000000 18686:MB8|0000000000000000 18687:MB8|0000000000000000 18688:MB8|0000000000000000 18689:MB8|0000000000000000 18690:MB8|0000000000000000 18691:MB8|0000000000000000 18692:MB8|0000000000000000 18693:MB8|0000000000000000 18694:MB8|0000000000000000 18695:MB8|0000000000000000 18696:MB8|0000000000000000 18697:MB8|0000000000000000 18698:MB8|0000000000000000 18699:MB8|0000000000000000 18700:MB8|0000000000000000 18701:MB8|0000000000000000 18702:MB8|0000000000000000 18703:MB8|0000000000000000 18704:MB8|0000000000000000 18705:MB8|0000000000000000 18706:MB8|0000000000000000 18707:MB8|0000000000000000 18708:MB8|0000000000000000 18709:MB8|0000000000000000 18710:MB8|0000000000000000 18711:MB8|0000000000000000 18712:MB8|0000000000000000 18713:MB8|0000000000000000 18714:MB8|0000000000000000 18715:MB8|0000000000000000 18716:MB8|0000000000000000 18717:MB8|0000000000000000 18718:MB8|0000000000000000 18719:MB8|0000000000000000 18720:MB8|0000000000000000 18721:MB8|0000000000000000 18722:MB8|0000000000000000 18723:MB8|0000000000000000 18724:MB8|0000000000000000 18725:MB8|0000000000000000 18726:MB8|0000000000000000 18727:MB8|0000000000000000 18728:MB8|0000000000000000 18729:MB8|0000000000000000 18730:MB8|0000000000000000 18731:MB8|0000000000000000 18732:MB8|0000000000000000 18733:MB8|0000000000000000 18734:MB8|0000000000000000 18735:MB8|0000000000000000 18736:MB8|0000000000000000 18737:MB8|0000000000000000 18738:MB8|0000000000000000 18739:MB8|0000000000000000 18740:MB8|0000000000000000 18741:MB8|0000000000000000 18742:MB8|0000000000000000 18743:MB8|0000000000000000 18744:MB8|0000000000000000 18745:MB8|0000000000000000 18746:MB8|0000000000000000 18747:MB8|0000000000000000 18748:MB8|0000000000000000 18749:MB8|0000000000000000 18750:MB8|0000000000000000 18751:MB8|0000000000000000 18752:MB8|0000000000000000 18753:MB8|0000000000000000 18754:MB8|0000000000000000 18755:MB8|0000000000000000 18756:MB8|0000000000000000 18757:MB8|0000000000000000 18758:MB8|0000000000000000 18759:MB8|0000000000000000 18760:MB8|0000000000000000 18761:MB8|0000000000000000 18762:MB8|0000000000000000 18763:MB8|0000000000000000 18764:MB8|0000000000000000 18765:MB8|0000000000000000 18766:MB8|0000000000000000 18767:MB8|0000000000000000 18768:MB8|0000000000000000 18769:MB8|0000000000000000 18770:MB8|0000000000000000 18771:MB8|0000000000000000 18772:MB8|0000000000000000 18773:MB8|0000000000000000 18774:MB8|0000000000000000 18775:MB8|0000000000000000 18776:MB8|0000000000000000 18777:MB8|0000000000000000 18778:MB8|0000000000000000 18779:MB8|0000000000000000 18780:MB8|0000000000000000 18781:MB8|0000000000000000 18782:MB8|0000000000000000 18783:MB8|0000000000000000 18784:MB8|0000000000000000 18785:MB8|0000000000000000 18786:MB8|0000000000000000 18787:MB8|0000000000000000 18788:MB8|0000000000000000 18789:MB8|0000000000000000 18790:MB8|0000000000000000 18791:MB8|0000000000000000 18792:MB8|0000000000000000 18793:MB8|0000000000000000 18794:MB8|0000000000000000 18795:MB8|0000000000000000 18796:MB8|0000000000000000 18797:MB8|0000000000000000 18798:MB8|0000000000000000 18799:MB8|0000000000000000 18800:MB8|0000000000000000 18801:MB8|0000000000000000 18802:MB8|0000000000000000 18803:MB8|0000000000000000 18804:MB8|0000000000000000 18805:MB8|0000000000000000 18806:MB8|0000000000000000 18807:MB8|0000000000000000 18808:MB8|0000000000000000 18809:MB8|0000000000000000 18810:MB8|0000000000000000 18811:MB8|0000000000000000 18812:MB8|0000000000000000 18813:MB8|0000000000000000 18814:MB8|0000000000000000 18815:MB8|0000000000000000 18816:MB8|0000000000000000 18817:MB8|0000000000000000 18818:MB8|0000000000000000 18819:MB8|0000000000000000 18820:MB8|0000000000000000 18821:MB8|0000000000000000 18822:MB8|0000000000000000 18823:MB8|0000000000000000 18824:MB8|0000000000000000 18825:MB8|0000000000000000 18826:MB8|0000000000000000 18827:MB8|0000000000000000 18828:MB8|0000000000000000 18829:MB8|0000000000000000 18830:MB8|0000000000000000 18831:MB8|0000000000000000 18832:MB8|0000000000000000 18833:MB8|0000000000000000 18834:MB8|0000000000000000 18835:MB8|0000000000000000 18836:MB8|0000000000000000 18837:MB8|0000000000000000 18838:MB8|0000000000000000 18839:MB8|0000000000000000 18840:MB8|0000000000000000 18841:MB8|0000000000000000 18842:MB8|0000000000000000 18843:MB8|0000000000000000 18844:MB8|0000000000000000 18845:MB8|0000000000000000 18846:MB8|0000000000000000 18847:MB8|0000000000000000 18848:MB8|0000000000000000 18849:MB8|0000000000000000 18850:MB8|0000000000000000 18851:MB8|0000000000000000 18852:MB8|0000000000000000 18853:MB8|0000000000000000 18854:MB8|0000000000000000 18855:MB8|0000000000000000 18856:MB8|0000000000000000 18857:MB8|0000000000000000 18858:MB8|0000000000000000 18859:MB8|0000000000000000 18860:MB8|0000000000000000 18861:MB8|0000000000000000 18862:MB8|0000000000000000 18863:MB8|0000000000000000 18864:MB8|0000000000000000 18865:MB8|0000000000000000 18866:MB8|0000000000000000 18867:MB8|0000000000000000 18868:MB8|0000000000000000 18869:MB8|0000000000000000 18870:MB8|0000000000000000 18871:MB8|0000000000000000 18872:MB8|0000000000000000 18873:MB8|0000000000000000 18874:MB8|0000000000000000 18875:MB8|0000000000000000 18876:MB8|0000000000000000 18877:MB8|0000000000000000 18878:MB8|0000000000000000 18879:MB8|0000000000000000 18880:MB8|0000000000000000 18881:MB8|0000000000000000 18882:MB8|0000000000000000 18883:MB8|0000000000000000 18884:MB8|0000000000000000 18885:MB8|0000000000000000 18886:MB8|0000000000000000 18887:MB8|0000000000000000 18888:MB8|0000000000000000 18889:MB8|0000000000000000 18890:MB8|0000000000000000 18891:MB8|0000000000000000 18892:MB8|0000000000000000 18893:MB8|0000000000000000 18894:MB8|0000000000000000 18895:MB8|0000000000000000 18896:MB8|0000000000000000 18897:MB8|0000000000000000 18898:MB8|0000000000000000 18899:MB8|0000000000000000 18900:MB8|0000000000000000 18901:MB8|0000000000000000 18902:MB8|0000000000000000 18903:MB8|0000000000000000 18904:MB8|0000000000000000 18905:MB8|0000000000000000 18906:MB8|0000000000000000 18907:MB8|0000000000000000 18908:MB8|0000000000000000 18909:MB8|0000000000000000 18910:MB8|0000000000000000 18911:MB8|0000000000000000 18912:MB8|0000000000000000 18913:MB8|0000000000000000 18914:MB8|0000000000000000 18915:MB8|0000000000000000 18916:MB8|0000000000000000 18917:MB8|0000000000000000 18918:MB8|0000000000000000 18919:MB8|0000000000000000 18920:MB8|0000000000000000 18921:MB8|0000000000000000 18922:MB8|0000000000000000 18923:MB8|0000000000000000 18924:MB8|0000000000000000 18925:MB8|0000000000000000 18926:MB8|0000000000000000 18927:MB8|0000000000000000 18928:MB8|0000000000000000 18929:MB8|0000000000000000 18930:MB8|0000000000000000 18931:MB8|0000000000000000 18932:MB8|0000000000000000 18933:MB8|0000000000000000 18934:MB8|0000000000000000 18935:MB8|0000000000000000 18936:MB8|0000000000000000 18937:MB8|0000000000000000 18938:MB8|0000000000000000 18939:MB8|0000000000000000 18940:MB8|0000000000000000 18941:MB8|0000000000000000 18942:MB8|0000000000000000 18943:MB8|0000000000000000 18944:MB8|0000000000000000 18945:MB8|0000000000000000 18946:MB8|0000000000000000 18947:MB8|0000000000000000 18948:MB8|0000000000000000 18949:MB8|0000000000000000 18950:MB8|0000000000000000 18951:MB8|0000000000000000 18952:MB8|0000000000000000 18953:MB8|0000000000000000 18954:MB8|0000000000000000 18955:MB8|0000000000000000 18956:MB8|0000000000000000 18957:MB8|0000000000000000 18958:MB8|0000000000000000 18959:MB8|0000000000000000 18960:MB8|0000000000000000 18961:MB8|0000000000000000 18962:MB8|0000000000000000 18963:MB8|0000000000000000 18964:MB8|0000000000000000 18965:MB8|0000000000000000 18966:MB8|0000000000000000 18967:MB8|0000000000000000 18968:MB8|0000000000000000 18969:MB8|0000000000000000 18970:MB8|0000000000000000 18971:MB8|0000000000000000 18972:MB8|0000000000000000 18973:MB8|0000000000000000 18974:MB8|0000000000000000 18975:MB8|0000000000000000 18976:MB8|0000000000000000 18977:MB8|0000000000000000 18978:MB8|0000000000000000 18979:MB8|0000000000000000 18980:MB8|0000000000000000 18981:MB8|0000000000000000 18982:MB8|0000000000000000 18983:MB8|0000000000000000 18984:MB8|0000000000000000 18985:MB8|0000000000000000 18986:MB8|0000000000000000 18987:MB8|0000000000000000 18988:MB8|0000000000000000 18989:MB8|0000000000000000 18990:MB8|0000000000000000 18991:MB8|0000000000000000 18992:MB8|0000000000000000 18993:MB8|0000000000000000 18994:MB8|0000000000000000 18995:MB8|0000000000000000 18996:MB8|0000000000000000 18997:MB8|0000000000000000 18998:MB8|0000000000000000 18999:MB8|0000000000000000 19000:MB8|0000000000000000 19001:MB8|0000000000000000 19002:MB8|0000000000000000 19003:MB8|0000000000000000 19004:MB8|0000000000000000 19005:MB8|0000000000000000 19006:MB8|0000000000000000 19007:MB8|0000000000000000 19008:MB8|0000000000000000 19009:MB8|0000000000000000 19010:MB8|0000000000000000 19011:MB8|0000000000000000 19012:MB8|0000000000000000 19013:MB8|0000000000000000 19014:MB8|0000000000000000 19015:MB8|0000000000000000 19016:MB8|0000000000000000 19017:MB8|0000000000000000 19018:MB8|0000000000000000 19019:MB8|0000000000000000 19020:MB8|0000000000000000 19021:MB8|0000000000000000 19022:MB8|0000000000000000 19023:MB8|0000000000000000 19024:MB8|0000000000000000 19025:MB8|0000000000000000 19026:MB8|0000000000000000 19027:MB8|0000000000000000 19028:MB8|0000000000000000 19029:MB8|0000000000000000 19030:MB8|0000000000000000 19031:MB8|0000000000000000 19032:MB8|0000000000000000 19033:MB8|0000000000000000 19034:MB8|0000000000000000 19035:MB8|0000000000000000 19036:MB8|0000000000000000 19037:MB8|0000000000000000 19038:MB8|0000000000000000 19039:MB8|0000000000000000 19040:MB8|0000000000000000 19041:MB8|0000000000000000 19042:MB8|0000000000000000 19043:MB8|0000000000000000 19044:MB8|0000000000000000 19045:MB8|0000000000000000 19046:MB8|0000000000000000 19047:MB8|0000000000000000 19048:MB8|0000000000000000 19049:MB8|0000000000000000 19050:MB8|0000000000000000 19051:MB8|0000000000000000 19052:MB8|0000000000000000 19053:MB8|0000000000000000 19054:MB8|0000000000000000 19055:MB8|0000000000000000 19056:MB8|0000000000000000 19057:MB8|0000000000000000 19058:MB8|0000000000000000 19059:MB8|0000000000000000 19060:MB8|0000000000000000 19061:MB8|0000000000000000 19062:MB8|0000000000000000 19063:MB8|0000000000000000 19064:MB8|0000000000000000 19065:MB8|0000000000000000 19066:MB8|0000000000000000 19067:MB8|0000000000000000 19068:MB8|0000000000000000 19069:MB8|0000000000000000 19070:MB8|0000000000000000 19071:MB8|0000000000000000 19072:MB8|0000000000000000 19073:MB8|0000000000000000 19074:MB8|0000000000000000 19075:MB8|0000000000000000 19076:MB8|0000000000000000 19077:MB8|0000000000000000 19078:MB8|0000000000000000 19079:MB8|0000000000000000 19080:MB8|0000000000000000 19081:MB8|0000000000000000 19082:MB8|0000000000000000 19083:MB8|0000000000000000 19084:MB8|0000000000000000 19085:MB8|0000000000000000 19086:MB8|0000000000000000 19087:MB8|0000000000000000 19088:MB8|0000000000000000 19089:MB8|0000000000000000 19090:MB8|0000000000000000 19091:MB8|0000000000000000 19092:MB8|0000000000000000 19093:MB8|0000000000000000 19094:MB8|0000000000000000 19095:MB8|0000000000000000 19096:MB8|0000000000000000 19097:MB8|0000000000000000 19098:MB8|0000000000000000 19099:MB8|0000000000000000 19100:MB8|0000000000000000 19101:MB8|0000000000000000 19102:MB8|0000000000000000 19103:MB8|0000000000000000 19104:MB8|0000000000000000 19105:MB8|0000000000000000 19106:MB8|0000000000000000 19107:MB8|0000000000000000 19108:MB8|0000000000000000 19109:MB8|0000000000000000 19110:MB8|0000000000000000 19111:MB8|0000000000000000 19112:MB8|0000000000000000 19113:MB8|0000000000000000 19114:MB8|0000000000000000 19115:MB8|0000000000000000 19116:MB8|0000000000000000 19117:MB8|0000000000000000 19118:MB8|0000000000000000 19119:MB8|0000000000000000 19120:MB8|0000000000000000 19121:MB8|0000000000000000 19122:MB8|0000000000000000 19123:MB8|0000000000000000 19124:MB8|0000000000000000 19125:MB8|0000000000000000 19126:MB8|0000000000000000 19127:MB8|0000000000000000 19128:MB8|0000000000000000 19129:MB8|0000000000000000 19130:MB8|0000000000000000 19131:MB8|0000000000000000 19132:MB8|0000000000000000 19133:MB8|0000000000000000 19134:MB8|0000000000000000 19135:MB8|0000000000000000 19136:MB8|0000000000000000 19137:MB8|0000000000000000 19138:MB8|0000000000000000 19139:MB8|0000000000000000 19140:MB8|0000000000000000 19141:MB8|0000000000000000 19142:MB8|0000000000000000 19143:MB8|0000000000000000 19144:MB8|0000000000000000 19145:MB8|0000000000000000 19146:MB8|0000000000000000 19147:MB8|0000000000000000 19148:MB8|0000000000000000 19149:MB8|0000000000000000 19150:MB8|0000000000000000 19151:MB8|0000000000000000 19152:MB8|0000000000000000 19153:MB8|0000000000000000 19154:MB8|0000000000000000 19155:MB8|0000000000000000 19156:MB8|0000000000000000 19157:MB8|0000000000000000 19158:MB8|0000000000000000 19159:MB8|0000000000000000 19160:MB8|0000000000000000 19161:MB8|0000000000000000 19162:MB8|0000000000000000 19163:MB8|0000000000000000 19164:MB8|0000000000000000 19165:MB8|0000000000000000 19166:MB8|0000000000000000 19167:MB8|0000000000000000 19168:MB8|0000000000000000 19169:MB8|0000000000000000 19170:MB8|0000000000000000 19171:MB8|0000000000000000 19172:MB8|0000000000000000 19173:MB8|0000000000000000 19174:MB8|0000000000000000 19175:MB8|0000000000000000 19176:MB8|0000000000000000 19177:MB8|0000000000000000 19178:MB8|0000000000000000 19179:MB8|0000000000000000 19180:MB8|0000000000000000 19181:MB8|0000000000000000 19182:MB8|0000000000000000 19183:MB8|0000000000000000 19184:MB8|0000000000000000 19185:MB8|0000000000000000 19186:MB8|0000000000000000 19187:MB8|0000000000000000 19188:MB8|0000000000000000 19189:MB8|0000000000000000 19190:MB8|0000000000000000 19191:MB8|0000000000000000 19192:MB8|0000000000000000 19193:MB8|0000000000000000 19194:MB8|0000000000000000 19195:MB8|0000000000000000 19196:MB8|0000000000000000 19197:MB8|0000000000000000 19198:MB8|0000000000000000 19199:MB8|0000000000000000 19200:MB8|0000000000000000 19201:MB8|0000000000000000 19202:MB8|0000000000000000 19203:MB8|0000000000000000 19204:MB8|0000000000000000 19205:MB8|0000000000000000 19206:MB8|0000000000000000 19207:MB8|0000000000000000 19208:MB8|0000000000000000 19209:MB8|0000000000000000 19210:MB8|0000000000000000 19211:MB8|0000000000000000 19212:MB8|0000000000000000 19213:MB8|0000000000000000 19214:MB8|0000000000000000 19215:MB8|0000000000000000 19216:MB8|0000000000000000 19217:MB8|0000000000000000 19218:MB8|0000000000000000 19219:MB8|0000000000000000 19220:MB8|0000000000000000 19221:MB8|0000000000000000 19222:MB8|0000000000000000 19223:MB8|0000000000000000 19224:MB8|0000000000000000 19225:MB8|0000000000000000 19226:MB8|0000000000000000 19227:MB8|0000000000000000 19228:MB8|0000000000000000 19229:MB8|0000000000000000 19230:MB8|0000000000000000 19231:MB8|0000000000000000 19232:MB8|0000000000000000 19233:MB8|0000000000000000 19234:MB8|0000000000000000 19235:MB8|0000000000000000 19236:MB8|0000000000000000 19237:MB8|0000000000000000 19238:MB8|0000000000000000 19239:MB8|0000000000000000 19240:MB8|0000000000000000 19241:MB8|0000000000000000 19242:MB8|0000000000000000 19243:MB8|0000000000000000 19244:MB8|0000000000000000 19245:MB8|0000000000000000 19246:MB8|0000000000000000 19247:MB8|0000000000000000 19248:MB8|0000000000000000 19249:MB8|0000000000000000 19250:MB8|0000000000000000 19251:MB8|0000000000000000 19252:MB8|0000000000000000 19253:MB8|0000000000000000 19254:MB8|0000000000000000 19255:MB8|0000000000000000 19256:MB8|0000000000000000 19257:MB8|0000000000000000 19258:MB8|0000000000000000 19259:MB8|0000000000000000 19260:MB8|0000000000000000 19261:MB8|0000000000000000 19262:MB8|0000000000000000 19263:MB8|0000000000000000 19264:MB8|0000000000000000 19265:MB8|0000000000000000 19266:MB8|0000000000000000 19267:MB8|0000000000000000 19268:MB8|0000000000000000 19269:MB8|0000000000000000 19270:MB8|0000000000000000 19271:MB8|0000000000000000 19272:MB8|0000000000000000 19273:MB8|0000000000000000 19274:MB8|0000000000000000 19275:MB8|0000000000000000 19276:MB8|0000000000000000 19277:MB8|0000000000000000 19278:MB8|0000000000000000 19279:MB8|0000000000000000 19280:MB8|0000000000000000 19281:MB8|0000000000000000 19282:MB8|0000000000000000 19283:MB8|0000000000000000 19284:MB8|0000000000000000 19285:MB8|0000000000000000 19286:MB8|0000000000000000 19287:MB8|0000000000000000 19288:MB8|0000000000000000 19289:MB8|0000000000000000 19290:MB8|0000000000000000 19291:MB8|0000000000000000 19292:MB8|0000000000000000 19293:MB8|0000000000000000 19294:MB8|0000000000000000 19295:MB8|0000000000000000 19296:MB8|0000000000000000 19297:MB8|0000000000000000 19298:MB8|0000000000000000 19299:MB8|0000000000000000 19300:MB8|0000000000000000 19301:MB8|0000000000000000 19302:MB8|0000000000000000 19303:MB8|0000000000000000 19304:MB8|0000000000000000 19305:MB8|0000000000000000 19306:MB8|0000000000000000 19307:MB8|0000000000000000 19308:MB8|0000000000000000 19309:MB8|0000000000000000 19310:MB8|0000000000000000 19311:MB8|0000000000000000 19312:MB8|0000000000000000 19313:MB8|0000000000000000 19314:MB8|0000000000000000 19315:MB8|0000000000000000 19316:MB8|0000000000000000 19317:MB8|0000000000000000 19318:MB8|0000000000000000 19319:MB8|0000000000000000 19320:MB8|0000000000000000 19321:MB8|0000000000000000 19322:MB8|0000000000000000 19323:MB8|0000000000000000 19324:MB8|0000000000000000 19325:MB8|0000000000000000 19326:MB8|0000000000000000 19327:MB8|0000000000000000 19328:MB8|0000000000000000 19329:MB8|0000000000000000 19330:MB8|0000000000000000 19331:MB8|0000000000000000 19332:MB8|0000000000000000 19333:MB8|0000000000000000 19334:MB8|0000000000000000 19335:MB8|0000000000000000 19336:MB8|0000000000000000 19337:MB8|0000000000000000 19338:MB8|0000000000000000 19339:MB8|0000000000000000 19340:MB8|0000000000000000 19341:MB8|0000000000000000 19342:MB8|0000000000000000 19343:MB8|0000000000000000 19344:MB8|0000000000000000 19345:MB8|0000000000000000 19346:MB8|0000000000000000 19347:MB8|0000000000000000 19348:MB8|0000000000000000 19349:MB8|0000000000000000 19350:MB8|0000000000000000 19351:MB8|0000000000000000 19352:MB8|0000000000000000 19353:MB8|0000000000000000 19354:MB8|0000000000000000 19355:MB8|0000000000000000 19356:MB8|0000000000000000 19357:MB8|0000000000000000 19358:MB8|0000000000000000 19359:MB8|0000000000000000 19360:MB8|0000000000000000 19361:MB8|0000000000000000 19362:MB8|0000000000000000 19363:MB8|0000000000000000 19364:MB8|0000000000000000 19365:MB8|0000000000000000 19366:MB8|0000000000000000 19367:MB8|0000000000000000 19368:MB8|0000000000000000 19369:MB8|0000000000000000 19370:MB8|0000000000000000 19371:MB8|0000000000000000 19372:MB8|0000000000000000 19373:MB8|0000000000000000 19374:MB8|0000000000000000 19375:MB8|0000000000000000 19376:MB8|0000000000000000 19377:MB8|0000000000000000 19378:MB8|0000000000000000 19379:MB8|0000000000000000 19380:MB8|0000000000000000 19381:MB8|0000000000000000 19382:MB8|0000000000000000 19383:MB8|0000000000000000 19384:MB8|0000000000000000 19385:MB8|0000000000000000 19386:MB8|0000000000000000 19387:MB8|0000000000000000 19388:MB8|0000000000000000 19389:MB8|0000000000000000 19390:MB8|0000000000000000 19391:MB8|0000000000000000 19392:MB8|0000000000000000 19393:MB8|0000000000000000 19394:MB8|0000000000000000 19395:MB8|0000000000000000 19396:MB8|0000000000000000 19397:MB8|0000000000000000 19398:MB8|0000000000000000 19399:MB8|0000000000000000 19400:MB8|0000000000000000 19401:MB8|0000000000000000 19402:MB8|0000000000000000 19403:MB8|0000000000000000 19404:MB8|0000000000000000 19405:MB8|0000000000000000 19406:MB8|0000000000000000 19407:MB8|0000000000000000 19408:MB8|0000000000000000 19409:MB8|0000000000000000 19410:MB8|0000000000000000 19411:MB8|0000000000000000 19412:MB8|0000000000000000 19413:MB8|0000000000000000 19414:MB8|0000000000000000 19415:MB8|0000000000000000 19416:MB8|0000000000000000 19417:MB8|0000000000000000 19418:MB8|0000000000000000 19419:MB8|0000000000000000 19420:MB8|0000000000000000 19421:MB8|0000000000000000 19422:MB8|0000000000000000 19423:MB8|0000000000000000 19424:MB8|0000000000000000 19425:MB8|0000000000000000 19426:MB8|0000000000000000 19427:MB8|0000000000000000 19428:MB8|0000000000000000 19429:MB8|0000000000000000 19430:MB8|0000000000000000 19431:MB8|0000000000000000 19432:MB8|0000000000000000 19433:MB8|0000000000000000 19434:MB8|0000000000000000 19435:MB8|0000000000000000 19436:MB8|0000000000000000 19437:MB8|0000000000000000 19438:MB8|0000000000000000 19439:MB8|0000000000000000 19440:MB8|0000000000000000 19441:MB8|0000000000000000 19442:MB8|0000000000000000 19443:MB8|0000000000000000 19444:MB8|0000000000000000 19445:MB8|0000000000000000 19446:MB8|0000000000000000 19447:MB8|0000000000000000 19448:MB8|0000000000000000 19449:MB8|0000000000000000 19450:MB8|0000000000000000 19451:MB8|0000000000000000 19452:MB8|0000000000000000 19453:MB8|0000000000000000 19454:MB8|0000000000000000 19455:MB8|0000000000000000 19456:MB8|0000000000000000 19457:MB8|0000000000000000 19458:MB8|0000000000000000 19459:MB8|0000000000000000 19460:MB8|0000000000000000 19461:MB8|0000000000000000 19462:MB8|0000000000000000 19463:MB8|0000000000000000 19464:MB8|0000000000000000 19465:MB8|0000000000000000 19466:MB8|0000000000000000 19467:MB8|0000000000000000 19468:MB8|0000000000000000 19469:MB8|0000000000000000 19470:MB8|0000000000000000 19471:MB8|0000000000000000 19472:MB8|0000000000000000 19473:MB8|0000000000000000 19474:MB8|0000000000000000 19475:MB8|0000000000000000 19476:MB8|0000000000000000 19477:MB8|0000000000000000 19478:MB8|0000000000000000 19479:MB8|0000000000000000 19480:MB8|0000000000000000 19481:MB8|0000000000000000 19482:MB8|0000000000000000 19483:MB8|0000000000000000 19484:MB8|0000000000000000 19485:MB8|0000000000000000 19486:MB8|0000000000000000 19487:MB8|0000000000000000 19488:MB8|0000000000000000 19489:MB8|0000000000000000 19490:MB8|0000000000000000 19491:MB8|0000000000000000 19492:MB8|0000000000000000 19493:MB8|0000000000000000 19494:MB8|0000000000000000 19495:MB8|0000000000000000 19496:MB8|0000000000000000 19497:MB8|0000000000000000 19498:MB8|0000000000000000 19499:MB8|0000000000000000 19500:MB8|0000000000000000 19501:MB8|0000000000000000 19502:MB8|0000000000000000 19503:MB8|0000000000000000 19504:MB8|0000000000000000 19505:MB8|0000000000000000 19506:MB8|0000000000000000 19507:MB8|0000000000000000 19508:MB8|0000000000000000 19509:MB8|0000000000000000 19510:MB8|0000000000000000 19511:MB8|0000000000000000 19512:MB8|0000000000000000 19513:MB8|0000000000000000 19514:MB8|0000000000000000 19515:MB8|0000000000000000 19516:MB8|0000000000000000 19517:MB8|0000000000000000 19518:MB8|0000000000000000 19519:MB8|0000000000000000 19520:MB8|0000000000000000 19521:MB8|0000000000000000 19522:MB8|0000000000000000 19523:MB8|0000000000000000 19524:MB8|0000000000000000 19525:MB8|0000000000000000 19526:MB8|0000000000000000 19527:MB8|0000000000000000 19528:MB8|0000000000000000 19529:MB8|0000000000000000 19530:MB8|0000000000000000 19531:MB8|0000000000000000 19532:MB8|0000000000000000 19533:MB8|0000000000000000 19534:MB8|0000000000000000 19535:MB8|0000000000000000 19536:MB8|0000000000000000 19537:MB8|0000000000000000 19538:MB8|0000000000000000 19539:MB8|0000000000000000 19540:MB8|0000000000000000 19541:MB8|0000000000000000 19542:MB8|0000000000000000 19543:MB8|0000000000000000 19544:MB8|0000000000000000 19545:MB8|0000000000000000 19546:MB8|0000000000000000 19547:MB8|0000000000000000 19548:MB8|0000000000000000 19549:MB8|0000000000000000 19550:MB8|0000000000000000 19551:MB8|0000000000000000 19552:MB8|0000000000000000 19553:MB8|0000000000000000 19554:MB8|0000000000000000 19555:MB8|0000000000000000 19556:MB8|0000000000000000 19557:MB8|0000000000000000 19558:MB8|0000000000000000 19559:MB8|0000000000000000 19560:MB8|0000000000000000 19561:MB8|0000000000000000 19562:MB8|0000000000000000 19563:MB8|0000000000000000 19564:MB8|0000000000000000 19565:MB8|0000000000000000 19566:MB8|0000000000000000 19567:MB8|0000000000000000 19568:MB8|0000000000000000 19569:MB8|0000000000000000 19570:MB8|0000000000000000 19571:MB8|0000000000000000 19572:MB8|0000000000000000 19573:MB8|0000000000000000 19574:MB8|0000000000000000 19575:MB8|0000000000000000 19576:MB8|0000000000000000 19577:MB8|0000000000000000 19578:MB8|0000000000000000 19579:MB8|0000000000000000 19580:MB8|0000000000000000 19581:MB8|0000000000000000 19582:MB8|0000000000000000 19583:MB8|0000000000000000 19584:MB8|0000000000000000 19585:MB8|0000000000000000 19586:MB8|0000000000000000 19587:MB8|0000000000000000 19588:MB8|0000000000000000 19589:MB8|0000000000000000 19590:MB8|0000000000000000 19591:MB8|0000000000000000 19592:MB8|0000000000000000 19593:MB8|0000000000000000 19594:MB8|0000000000000000 19595:MB8|0000000000000000 19596:MB8|0000000000000000 19597:MB8|0000000000000000 19598:MB8|0000000000000000 19599:MB8|0000000000000000 19600:MB8|0000000000000000 19601:MB8|0000000000000000 19602:MB8|0000000000000000 19603:MB8|0000000000000000 19604:MB8|0000000000000000 19605:MB8|0000000000000000 19606:MB8|0000000000000000 19607:MB8|0000000000000000 19608:MB8|0000000000000000 19609:MB8|0000000000000000 19610:MB8|0000000000000000 19611:MB8|0000000000000000 19612:MB8|0000000000000000 19613:MB8|0000000000000000 19614:MB8|0000000000000000 19615:MB8|0000000000000000 19616:MB8|0000000000000000 19617:MB8|0000000000000000 19618:MB8|0000000000000000 19619:MB8|0000000000000000 19620:MB8|0000000000000000 19621:MB8|0000000000000000 19622:MB8|0000000000000000 19623:MB8|0000000000000000 19624:MB8|0000000000000000 19625:MB8|0000000000000000 19626:MB8|0000000000000000 19627:MB8|0000000000000000 19628:MB8|0000000000000000 19629:MB8|0000000000000000 19630:MB8|0000000000000000 19631:MB8|0000000000000000 19632:MB8|0000000000000000 19633:MB8|0000000000000000 19634:MB8|0000000000000000 19635:MB8|0000000000000000 19636:MB8|0000000000000000 19637:MB8|0000000000000000 19638:MB8|0000000000000000 19639:MB8|0000000000000000 19640:MB8|0000000000000000 19641:MB8|0000000000000000 19642:MB8|0000000000000000 19643:MB8|0000000000000000 19644:MB8|0000000000000000 19645:MB8|0000000000000000 19646:MB8|0000000000000000 19647:MB8|0000000000000000 19648:MB8|0000000000000000 19649:MB8|0000000000000000 19650:MB8|0000000000000000 19651:MB8|0000000000000000 19652:MB8|0000000000000000 19653:MB8|0000000000000000 19654:MB8|0000000000000000 19655:MB8|0000000000000000 19656:MB8|0000000000000000 19657:MB8|0000000000000000 19658:MB8|0000000000000000 19659:MB8|0000000000000000 19660:MB8|0000000000000000 19661:MB8|0000000000000000 19662:MB8|0000000000000000 19663:MB8|0000000000000000 19664:MB8|0000000000000000 19665:MB8|0000000000000000 19666:MB8|0000000000000000 19667:MB8|0000000000000000 19668:MB8|0000000000000000 19669:MB8|0000000000000000 19670:MB8|0000000000000000 19671:MB8|0000000000000000 19672:MB8|0000000000000000 19673:MB8|0000000000000000 19674:MB8|0000000000000000 19675:MB8|0000000000000000 19676:MB8|0000000000000000 19677:MB8|0000000000000000 19678:MB8|0000000000000000 19679:MB8|0000000000000000 19680:MB8|0000000000000000 19681:MB8|0000000000000000 19682:MB8|0000000000000000 19683:MB8|0000000000000000 19684:MB8|0000000000000000 19685:MB8|0000000000000000 19686:MB8|0000000000000000 19687:MB8|0000000000000000 19688:MB8|0000000000000000 19689:MB8|0000000000000000 19690:MB8|0000000000000000 19691:MB8|0000000000000000 19692:MB8|0000000000000000 19693:MB8|0000000000000000 19694:MB8|0000000000000000 19695:MB8|0000000000000000 19696:MB8|0000000000000000 19697:MB8|0000000000000000 19698:MB8|0000000000000000 19699:MB8|0000000000000000 19700:MB8|0000000000000000 19701:MB8|0000000000000000 19702:MB8|0000000000000000 19703:MB8|0000000000000000 19704:MB8|0000000000000000 19705:MB8|0000000000000000 19706:MB8|0000000000000000 19707:MB8|0000000000000000 19708:MB8|0000000000000000 19709:MB8|0000000000000000 19710:MB8|0000000000000000 19711:MB8|0000000000000000 19712:MB8|0000000000000000 19713:MB8|0000000000000000 19714:MB8|0000000000000000 19715:MB8|0000000000000000 19716:MB8|0000000000000000 19717:MB8|0000000000000000 19718:MB8|0000000000000000 19719:MB8|0000000000000000 19720:MB8|0000000000000000 19721:MB8|0000000000000000 19722:MB8|0000000000000000 19723:MB8|0000000000000000 19724:MB8|0000000000000000 19725:MB8|0000000000000000 19726:MB8|0000000000000000 19727:MB8|0000000000000000 19728:MB8|0000000000000000 19729:MB8|0000000000000000 19730:MB8|0000000000000000 19731:MB8|0000000000000000 19732:MB8|0000000000000000 19733:MB8|0000000000000000 19734:MB8|0000000000000000 19735:MB8|0000000000000000 19736:MB8|0000000000000000 19737:MB8|0000000000000000 19738:MB8|0000000000000000 19739:MB8|0000000000000000 19740:MB8|0000000000000000 19741:MB8|0000000000000000 19742:MB8|0000000000000000 19743:MB8|0000000000000000 19744:MB8|0000000000000000 19745:MB8|0000000000000000 19746:MB8|0000000000000000 19747:MB8|0000000000000000 19748:MB8|0000000000000000 19749:MB8|0000000000000000 19750:MB8|0000000000000000 19751:MB8|0000000000000000 19752:MB8|0000000000000000 19753:MB8|0000000000000000 19754:MB8|0000000000000000 19755:MB8|0000000000000000 19756:MB8|0000000000000000 19757:MB8|0000000000000000 19758:MB8|0000000000000000 19759:MB8|0000000000000000 19760:MB8|0000000000000000 19761:MB8|0000000000000000 19762:MB8|0000000000000000 19763:MB8|0000000000000000 19764:MB8|0000000000000000 19765:MB8|0000000000000000 19766:MB8|0000000000000000 19767:MB8|0000000000000000 19768:MB8|0000000000000000 19769:MB8|0000000000000000 19770:MB8|0000000000000000 19771:MB8|0000000000000000 19772:MB8|0000000000000000 19773:MB8|0000000000000000 19774:MB8|0000000000000000 19775:MB8|0000000000000000 19776:MB8|0000000000000000 19777:MB8|0000000000000000 19778:MB8|0000000000000000 19779:MB8|0000000000000000 19780:MB8|0000000000000000 19781:MB8|0000000000000000 19782:MB8|0000000000000000 19783:MB8|0000000000000000 19784:MB8|0000000000000000 19785:MB8|0000000000000000 19786:MB8|0000000000000000 19787:MB8|0000000000000000 19788:MB8|0000000000000000 19789:MB8|0000000000000000 19790:MB8|0000000000000000 19791:MB8|0000000000000000 19792:MB8|0000000000000000 19793:MB8|0000000000000000 19794:MB8|0000000000000000 19795:MB8|0000000000000000 19796:MB8|0000000000000000 19797:MB8|0000000000000000 19798:MB8|0000000000000000 19799:MB8|0000000000000000 19800:MB8|0000000000000000 19801:MB8|0000000000000000 19802:MB8|0000000000000000 19803:MB8|0000000000000000 19804:MB8|0000000000000000 19805:MB8|0000000000000000 19806:MB8|0000000000000000 19807:MB8|0000000000000000 19808:MB8|0000000000000000 19809:MB8|0000000000000000 19810:MB8|0000000000000000 19811:MB8|0000000000000000 19812:MB8|0000000000000000 19813:MB8|0000000000000000 19814:MB8|0000000000000000 19815:MB8|0000000000000000 19816:MB8|0000000000000000 19817:MB8|0000000000000000 19818:MB8|0000000000000000 19819:MB8|0000000000000000 19820:MB8|0000000000000000 19821:MB8|0000000000000000 19822:MB8|0000000000000000 19823:MB8|0000000000000000 19824:MB8|0000000000000000 19825:MB8|0000000000000000 19826:MB8|0000000000000000 19827:MB8|0000000000000000 19828:MB8|0000000000000000 19829:MB8|0000000000000000 19830:MB8|0000000000000000 19831:MB8|0000000000000000 19832:MB8|0000000000000000 19833:MB8|0000000000000000 19834:MB8|0000000000000000 19835:MB8|0000000000000000 19836:MB8|0000000000000000 19837:MB8|0000000000000000 19838:MB8|0000000000000000 19839:MB8|0000000000000000 19840:MB8|0000000000000000 19841:MB8|0000000000000000 19842:MB8|0000000000000000 19843:MB8|0000000000000000 19844:MB8|0000000000000000 19845:MB8|0000000000000000 19846:MB8|0000000000000000 19847:MB8|0000000000000000 19848:MB8|0000000000000000 19849:MB8|0000000000000000 19850:MB8|0000000000000000 19851:MB8|0000000000000000 19852:MB8|0000000000000000 19853:MB8|0000000000000000 19854:MB8|0000000000000000 19855:MB8|0000000000000000 19856:MB8|0000000000000000 19857:MB8|0000000000000000 19858:MB8|0000000000000000 19859:MB8|0000000000000000 19860:MB8|0000000000000000 19861:MB8|0000000000000000 19862:MB8|0000000000000000 19863:MB8|0000000000000000 19864:MB8|0000000000000000 19865:MB8|0000000000000000 19866:MB8|0000000000000000 19867:MB8|0000000000000000 19868:MB8|0000000000000000 19869:MB8|0000000000000000 19870:MB8|0000000000000000 19871:MB8|0000000000000000 19872:MB8|0000000000000000 19873:MB8|0000000000000000 19874:MB8|0000000000000000 19875:MB8|0000000000000000 19876:MB8|0000000000000000 19877:MB8|0000000000000000 19878:MB8|0000000000000000 19879:MB8|0000000000000000 19880:MB8|0000000000000000 19881:MB8|0000000000000000 19882:MB8|0000000000000000 19883:MB8|0000000000000000 19884:MB8|0000000000000000 19885:MB8|0000000000000000 19886:MB8|0000000000000000 19887:MB8|0000000000000000 19888:MB8|0000000000000000 19889:MB8|0000000000000000 19890:MB8|0000000000000000 19891:MB8|0000000000000000 19892:MB8|0000000000000000 19893:MB8|0000000000000000 19894:MB8|0000000000000000 19895:MB8|0000000000000000 19896:MB8|0000000000000000 19897:MB8|0000000000000000 19898:MB8|0000000000000000 19899:MB8|0000000000000000 19900:MB8|0000000000000000 19901:MB8|0000000000000000 19902:MB8|0000000000000000 19903:MB8|0000000000000000 19904:MB8|0000000000000000 19905:MB8|0000000000000000 19906:MB8|0000000000000000 19907:MB8|0000000000000000 19908:MB8|0000000000000000 19909:MB8|0000000000000000 19910:MB8|0000000000000000 19911:MB8|0000000000000000 19912:MB8|0000000000000000 19913:MB8|0000000000000000 19914:MB8|0000000000000000 19915:MB8|0000000000000000 19916:MB8|0000000000000000 19917:MB8|0000000000000000 19918:MB8|0000000000000000 19919:MB8|0000000000000000 19920:MB8|0000000000000000 19921:MB8|0000000000000000 19922:MB8|0000000000000000 19923:MB8|0000000000000000 19924:MB8|0000000000000000 19925:MB8|0000000000000000 19926:MB8|0000000000000000 19927:MB8|0000000000000000 19928:MB8|0000000000000000 19929:MB8|0000000000000000 19930:MB8|0000000000000000 19931:MB8|0000000000000000 19932:MB8|0000000000000000 19933:MB8|0000000000000000 19934:MB8|0000000000000000 19935:MB8|0000000000000000 19936:MB8|0000000000000000 19937:MB8|0000000000000000 19938:MB8|0000000000000000 19939:MB8|0000000000000000 19940:MB8|0000000000000000 19941:MB8|0000000000000000 19942:MB8|0000000000000000 19943:MB8|0000000000000000 19944:MB8|0000000000000000 19945:MB8|0000000000000000 19946:MB8|0000000000000000 19947:MB8|0000000000000000 19948:MB8|0000000000000000 19949:MB8|0000000000000000 19950:MB8|0000000000000000 19951:MB8|0000000000000000 19952:MB8|0000000000000000 19953:MB8|0000000000000000 19954:MB8|0000000000000000 19955:MB8|0000000000000000 19956:MB8|0000000000000000 19957:MB8|0000000000000000 19958:MB8|0000000000000000 19959:MB8|0000000000000000 19960:MB8|0000000000000000 19961:MB8|0000000000000000 19962:MB8|0000000000000000 19963:MB8|0000000000000000 19964:MB8|0000000000000000 19965:MB8|0000000000000000 19966:MB8|0000000000000000 19967:MB8|0000000000000000 19968:MB8|0000000000000000 19969:MB8|0000000000000000 19970:MB8|0000000000000000 19971:MB8|0000000000000000 19972:MB8|0000000000000000 19973:MB8|0000000000000000 19974:MB8|0000000000000000 19975:MB8|0000000000000000 19976:MB8|0000000000000000 19977:MB8|0000000000000000 19978:MB8|0000000000000000 19979:MB8|0000000000000000 19980:MB8|0000000000000000 19981:MB8|0000000000000000 19982:MB8|0000000000000000 19983:MB8|0000000000000000 19984:MB8|0000000000000000 19985:MB8|0000000000000000 19986:MB8|0000000000000000 19987:MB8|0000000000000000 19988:MB8|0000000000000000 19989:MB8|0000000000000000 19990:MB8|0000000000000000 19991:MB8|0000000000000000 19992:MB8|0000000000000000 19993:MB8|0000000000000000 19994:MB8|0000000000000000 19995:MB8|0000000000000000 19996:MB8|0000000000000000 19997:MB8|0000000000000000 19998:MB8|0000000000000000 19999:MB8|0000000000000000 20000:MB8|0000000000000000 20001:MB8|0000000000000000 20002:MB8|0000000000000000 20003:MB8|0000000000000000 20004:MB8|0000000000000000 20005:MB8|0000000000000000 20006:MB8|0000000000000000 20007:MB8|0000000000000000 20008:MB8|0000000000000000 20009:MB8|0000000000000000 20010:MB8|0000000000000000 20011:MB8|0000000000000000 20012:MB8|0000000000000000 20013:MB8|0000000000000000 20014:MB8|0000000000000000 20015:MB8|0000000000000000 20016:MB8|0000000000000000 20017:MB8|0000000000000000 20018:MB8|0000000000000000 20019:MB8|0000000000000000 20020:MB8|0000000000000000 20021:MB8|0000000000000000 polyml-5.6/install-sh000077500000000000000000000332551265146633400147260ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/interruptpoly/000077500000000000000000000000001265146633400156525ustar00rootroot00000000000000polyml-5.6/interruptpoly/interruptpoly.c000066400000000000000000000053221265146633400207600ustar00rootroot00000000000000/* Title: Windows application to send an interrupt to Poly Copyright (c) 2003 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This program generates an interrupt Windows Poly/ML program in a similar way to sending a SIGINT (Control-C) interrupt in Unix. */ #include #include // DDE Commands. #define INTERRUPT_POLY "[Interrupt]" #define TERMINATE_POLY "[Terminate]" // Default DDE service name. #define POLYMLSERVICE "PolyML" DWORD dwDDEInstance; // DDE Callback function. HDDEDATA CALLBACK DdeCallBack(UINT uType, UINT uFmt, HCONV hconv, HSZ hsz1, HSZ hsz2, HDDEDATA hdata, DWORD dwData1, DWORD dwData2) { return (HDDEDATA) NULL; } void SendDDEMessage(LPCTSTR lpszMessage) { HCONV hcDDEConv; HDDEDATA res; // Send a DDE message to the process. DWORD dwInst = dwDDEInstance; HSZ hszServiceName = DdeCreateStringHandle(dwInst, POLYMLSERVICE, CP_WINANSI); hcDDEConv = DdeConnect(dwInst, hszServiceName, hszServiceName, NULL); DdeFreeStringHandle(dwInst, hszServiceName); res = DdeClientTransaction((LPBYTE)lpszMessage, sizeof(INTERRUPT_POLY), hcDDEConv, 0L, 0, XTYP_EXECUTE, TIMEOUT_ASYNC, NULL); if (res) DdeFreeDataHandle(res); } // Interrupt the ML process as though control-C had been pressed. void RunInterrupt() { SendDDEMessage(INTERRUPT_POLY); } int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { // Initialise DDE. We only want to be a client. DdeInitialize(&dwDDEInstance, DdeCallBack, APPCMD_CLIENTONLY | CBF_SKIP_CONNECT_CONFIRMS | CBF_SKIP_DISCONNECTS, 0); RunInterrupt(); DdeNameService(dwDDEInstance, 0L, 0L, DNS_UNREGISTER); // Unitialise DDE. DdeUninitialize(dwDDEInstance); return 0; } polyml-5.6/libffi/000077500000000000000000000000001265146633400141455ustar00rootroot00000000000000polyml-5.6/libffi/ChangeLog000066400000000000000000005676461265146633400157470ustar00rootroot000000000000002013-03-17 Anthony Green * README: Update for 3.0.13. * configure.ac: Ditto. * configure: Rebuilt. * doc/*: Update version. 2013-03-17 Dave Korn * src/closures.c (is_emutramp_enabled [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside enclosing #if scope. 2013-03-17 Anthony Green * configure.ac: Only modify toolexecdir in certain cases. * configure: Rebuilt. 2013-03-16 Gilles Talis * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use fparg_count,etc on __NO_FPRS__ targets. 2013-03-16 Alan Hourihane * src/m68k/sysv.S (epilogue): Don't use extb instruction on m680000 machines. 2013-03-16 Alex Gaynor * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. 2013-03-13 Markos Chandras * configure.ac: Add support for Imagination Technologies Meta. * Makefile.am: Likewise. * README: Add Imagination Technologies Meta details. * src/metag/ffi.c: New. * src/metag/ffitarget.h: Likewise. * src/metag/sysv.S: Likewise. 2013-02-24 Andreas Schwab * doc/libffi.texi (Structures): Fix missing category argument of @deftp. 2013-02-11 Anthony Green * configure.ac: Update release number to 3.0.12. * configure: Rebuilt. * README: Update release info. 2013-02-10 Anthony Green * README: Add Moxie. * src/moxie/ffi.c: Created. * src/moxie/eabi.S: Created. * src/moxie/ffitarget.h: Created. * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. * Makefile.in: Rebuilt. * configure.ac: Add Moxie. * configure: Rebuilt. * testsuite/libffi.call/huge_struct.c: Disable format string warnings for moxie*-*-elf tests. 2013-02-10 Anthony Green * Makefile.am (LTLDFLAGS): Fix reference. * Makefile.in: Rebuilt. 2013-02-10 Anthony Green * README: Update supported platforms. Update test results link. 2013-02-09 Anthony Green * testsuite/libffi.call/negint.c: Remove forced -O2. * testsuite/libffi.call/many2.c (foo): Remove GCCism. * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong closure return type fix developed by Martin v. Löwis for cpython fork. 2013-02-08 Andreas Tobler * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct support. * src/powerpc/sysv.S: Ditto. 2013-02-08 Anthony Green * testsuite/libffi.call/cls_longdouble.c: Remove xfail for arm*-*-*. 2013-02-08 Anthony Green * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. 2013-02-08 Matthias Klose * man/ffi_prep_cif.3: Clean up for debian linter. 2013-02-08 Peter Bergner * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed on the stack. 2013-02-08 Anthony Green * Makefile.am (EXTRA_DIST): Add missing files. * testsuite/Makefile.am (EXTRA_DIST): Ditto. * Makefile.in: Rebuilt. 2013-02-08 Anthony Green * configure.ac: Move sparc asm config checks to within functions for compatibility with sun tools. * configure: Rebuilt. * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 systems. * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache flusher. 2013-02-08 Nathan Rossi * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of small big-endian structures. (ffi_prep_args): Ditto. 2013-02-07 Anthony Green * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch (effectively hiding ffi_call_v8). 2013-02-07 Anthony Green * configure.ac: Update bug reporting address. * configure.in: Rebuild. * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for Sun compiler. * src/sparc/ffi.c (ffi_call): Remove warning. Call ffi_flush_icache for non-GCC builds. (ffi_prep_closure_loc): Use ffi_flush_icache. * Makefile.am (EXTRA_DIST): Add libtool-ldflags. * Makefile.in: Rebuilt. * libtool-ldflags: New file. 2013-02-07 Daniel Schepler * configure.ac: Correctly identify x32 systems as 64-bit. * m4/libtool.m4: Remove libtool expr error. * aclocal.m4, configure: Rebuilt. 2013-02-07 Anthony Green * configure.ac: Fix GCC usage test. * configure: Rebuilt. * README: Mention LLVM/GCC x86_64 issue. * testsuite/Makefile.in: Rebuilt. 2013-02-07 Anthony Green * testsuite/libffi.call/cls_double_va.c (main): Replace // style comments with /* */ for xlc compiler. * testsuite/libffi.call/stret_large.c (main): Ditto. * testsuite/libffi.call/stret_large2.c (main): Ditto. * testsuite/libffi.call/nested_struct1.c (main): Ditto. * testsuite/libffi.call/huge_struct.c (main): Ditto. * testsuite/libffi.call/float_va.c (main): Ditto. * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. * testsuite/libffi.call/cls_pointer.c (main): Ditto. * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. 2013-02-06 Anthony Green * man/ffi_prep_cif.3: Clean up for debian lintian checker. 2013-02-06 Anthony Green * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. * Makefile.in: Rebuild. 2013-02-02 Mark H Weaver * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed via general purpose registers. 2013-01-21 Nathan Rossi * README: Add MicroBlaze details. * Makefile.am: Add MicroBlaze support. * configure.ac: Likewise. * src/microblaze/ffi.c: New. * src/microblaze/ffitarget.h: Likewise. * src/microblaze/sysv.S: Likewise. 2013-01-21 Nathan Rossi * testsuite/libffi.call/return_uc.c: Fixed issue. 2013-01-21 Chris Zankel * README: Add Xtensa support. * Makefile.am: Likewise. * configure.ac: Likewise. * Makefile.in Regenerate. * configure: Likewise. * src/prep_cif.c: Handle Xtensa. * src/xtensa: New directory. * src/xtensa/ffi.c: New file. * src/xtensa/ffitarget.h: Ditto. * src/xtensa/sysv.S: Ditto. 2013-01-11 Anthony Green * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style comments with /* */ for xlc compiler. * src/powerpc/aix.S (ffi_call_AIX): Ditto. * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete deprecated inline function. * testsuite/libffi.special/ffitestcxx.h: Ditto. * README: Add update for AIX support. 2013-01-11 Anthony Green * configure.ac: Robustify pc relative reloc check. * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI changing option for 32-bit x86. * aclocal.m4, configure: Rebuilt. * README: Update supported target list. 2013-01-10 Anthony Green * README (tested): Add Compiler column to table. 2013-01-10 Anthony Green * src/x86/ffi64.c (struct register_args): Make sse array and array of unions for sunpro compiler compatibility. 2013-01-10 Anthony Green * configure.ac: Test target platform size_t size. Handle both 32 and 64-bit builds for x86_64-* and i?86-* targets (allowing for CFLAG option to change default settings). * configure, aclocal.m4: Rebuilt. 2013-01-10 Anthony Green * testsuite/libffi.special/special.exp: Only run exception handling tests when using GNU compiler. * m4/ax_compiler_vendor.m4: New file. * configure.ac: Test for compiler vendor and don't use AX_CFLAGS_WARN_ALL with the sun compiler. * aclocal.m4, configure: Rebuilt. 2013-01-10 Anthony Green * include/ffi_common.h: Don't use GCCisms to define types when building with the SUNPRO compiler. 2013-01-10 Anthony Green * configure.ac: Put local.exp in the right place. * configure: Rebuilt. * src/x86/ffi.c: Update comment about regparm function attributes. * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires that all function arguments be passed on the stack (no regparm support). 2013-01-08 Anthony Green * configure.ac: Generate local.exp. This sets CC_FOR_TARGET when we are using the vendor compiler. * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to ../local.exp. * configure, testsuite/Makefile.in: Rebuilt. * testsuite/libffi.call/call.exp: Run tests with different options, depending on whether or not we are using gcc or the vendor compiler. * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on whether or not we are building/testing with gcc. 2013-01-08 Anthony Green * configure.ac: Switch x86 solaris target to X86 by default. * configure: Rebuilt. 2013-01-08 Anthony Green * configure.ac: Fix test for read-only eh_frame. * configure: Rebuilt. 2013-01-08 Anthony Green * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info when building with the GNU toolchain. * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor compiler. 2013-01-07 Thorsten Glaser * testsuite/libffi.call/cls_uchar_va.c, testsuite/libffi.call/cls_ushort_va.c, testsuite/libffi.call/va_1.c: Testsuite fixes. 2013-01-07 Thorsten Glaser * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. 2013-01-04 Anthony Green * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions and -Wall. This is set in the configure script after testing for GCC. * Makefile.in: Rebuilt. 2013-01-02 rofl0r * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc when long double == double. 2013-01-02 Reini Urban * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS (required for shared libs on cygwin/mingw). * Makefile.in: Rebuilt. 2012-10-31 Alan Modra * src/powerpc/linux64_closure.S: Add new ABI support. * src/powerpc/linux64.S: Likewise. 2012-10-30 Magnus Granberg Pavel Labushev * configure.ac: New options pax_emutramp * configure, fficonfig.h.in: Regenerated * src/closures.c: New function emutramp_enabled_check() and checks. 2012-10-30 Frederick Cheung * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain lion) and future version. * configure: Rebuild. 2012-10-30 James Greenhalgh Marcus Shawcroft * README: Add details of aarch64 port. * src/aarch64/ffi.c: New. * src/aarch64/ffitarget.h: Likewise. * src/aarch64/sysv.S: Likewise. * Makefile.am: Support aarch64. * configure.ac: Support aarch64. * Makefile.in, configure: Rebuilt. 2012-10-30 James Greenhalgh Marcus Shawcroft * testsuite/lib/libffi.exp: Add support for aarch64. * testsuite/libffi.call/cls_struct_va1.c: New. * testsuite/libffi.call/cls_uchar_va.c: Likewise. * testsuite/libffi.call/cls_uint_va.c: Likewise. * testsuite/libffi.call/cls_ulong_va.c: Likewise. * testsuite/libffi.call/cls_ushort_va.c: Likewise. * testsuite/libffi.call/nested_struct11.c: Likewise. * testsuite/libffi.call/uninitialized.c: Likewise. * testsuite/libffi.call/va_1.c: Likewise. * testsuite/libffi.call/va_struct1.c: Likewise. * testsuite/libffi.call/va_struct2.c: Likewise. * testsuite/libffi.call/va_struct3.c: Likewise. 2012-10-12 Walter Lee * Makefile.am: Add TILE-Gx/TILEPro support. * configure.ac: Likewise. * Makefile.in: Regenerate. * configure: Likewise. * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. * src/tile: New directory. * src/tile/ffi.c: New file. * src/tile/ffitarget.h: Ditto. * src/tile/tile.S: Ditto. 2012-10-12 Matthias Klose * generate-osx-source-and-headers.py: Normalize whitespace. 2012-09-14 David Edelsohn * configure: Regenerated. 2012-08-26 Andrew Pinski PR libffi/53014 * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with soft-float. 2012-08-08 Uros Bizjak * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, just return FFI_BAD_ABI when things are wrong. 2012-07-18 H.J. Lu PR libffi/53982 PR libffi/53973 * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. 2012-05-16 H.J. Lu * configure: Regenerated. 2012-05-05 Nicolas Lelong * libffi.xcodeproj/project.pbxproj: Fixes. * README: Update for iOS builds. 2012-04-23 Alexandre Keunecke I. de Mendonca * configure.ac: Add Blackfin/sysv support * Makefile.am: Add Blackfin/sysv support * src/bfin/ffi.c: Add Blackfin/sysv support * src/bfin/ffitarget.h: Add Blackfin/sysv support 2012-04-11 Anthony Green * Makefile.am (EXTRA_DIST): Add new script. * Makefile.in: Rebuilt. 2012-04-11 Zachary Waldowski * generate-ios-source-and-headers.py, libffi.xcodeproj/project.pbxproj: Support a Mac static library via Xcode. Set iOS compatibility to 4.0. Move iOS trampoline generation into an Xcode "run script" phase. Include both as Xcode build scripts. Don't always regenerate config files. 2012-04-10 Anthony Green * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. 2012-04-06 Anthony Green * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. * Makefile.in: Rebuilt. 2012-04-06 Mike Lewis * generate-ios-source-and-headers.py: New file. * libffi.xcodeproj/project.pbxproj: New file. * README: Update instructions on building iOS binary. * build-ios.sh: Delete. 2012-04-06 Anthony Green * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU compilers, then use it. 2012-04-06 H.J. Lu * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. 2012-04-06 Anthony Green * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. * testsuite/Makefile.in: Rebuilt. 2012-04-05 Zachary Waldowski * include/ffi.h.in: Add missing trampoline table fields. * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references in CNAME. * src/x86/ffi.c: Wrap Windows specific code in ifdefs. 2012-04-02 Peter Bergner * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. Silence casting pointer to integer of different size warning. Delete goto to previously deleted label. (ffi_call): Silence possibly undefined warning. (ffi_closure_helper_SYSV): Declare variable type. 2012-04-02 Peter Rosin * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return value in the Intel version as is already done for the AT&T version. (ffi_closure_SYSV): Likewise. (ffi_closure_raw_SYSV): Likewise. (ffi_closure_STDCALL): Likewise. 2012-03-29 Peter Rosin * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame generation, fix the ENDP label and remove the surplus third arg from the 'lea' insn. 2012-03-29 Peter Rosin * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label visible outside the PROC, so that ffi_closure_raw_THISCALL can see it. Also instruct the assembler to add a frame to the function. 2012-03-23 Peter Rosin * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. * Makefile.in: Rebuilt. * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations to all data exports, when compiling libffi clients using MSVC. 2012-03-29 Peter Rosin * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and make it the default for MSVC. (FFI_TYPE_MS_STRUCT): New structure return convention. * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT instead of an ordinary FFI_TYPE_STRUCT. (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. (ffi_call): Likewise. (ffi_prep_incoming_args_SYSV): Likewise. (ffi_raw_call): Likewise. (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, return a pointer to the result structure in eax and don't pop that pointer from the stack, the caller takes care of it. (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. (ffi_closure_raw_SYSV): Likewise. 2012-03-22 Peter Rosin * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline assembly version with Intel syntax. * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. 2012-03-23 Peter Rosin * testsuite/libffi.call/ffitest.h: Provide abstration of __attribute__((fastcall)) in the form of a __FASTCALL__ define. Define it to __fastcall for MSVC. * testsuite/libffi.call/fastthis1_win32.c: Use the above. * testsuite/libffi.call/fastthis2_win32.c: Likewise. * testsuite/libffi.call/fastthis3_win32.c: Likewise. * testsuite/libffi.call/strlen2_win32.c: Likewise. * testsuite/libffi.call/struct1_win32.c: Likewise. * testsuite/libffi.call/struct2_win32.c: Likewise. 2012-03-22 Peter Rosin * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual frame on function entry, MASM adds one automatically. 2012-03-22 Peter Rosin * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing bits in the MSVC headers. 2012-03-22 Peter Rosin * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style with no declarations after statements. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_18byte.c: Likewise. * testsuite/libffi.call/cls_19byte.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_20byte1.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_5_1_byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. * testsuite/libffi.call/cls_64byte.c: Likewise. * testsuite/libffi.call/cls_6_1_byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7_1_byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_9byte1.c: Likewise. * testsuite/libffi.call/cls_9byte2.c: Likewise. * testsuite/libffi.call/cls_align_double.c: Likewise. * testsuite/libffi.call/cls_align_float.c: Likewise. * testsuite/libffi.call/cls_align_longdouble.c: Likewise. * testsuite/libffi.call/cls_align_longdouble_split.c: Likewise. * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. * testsuite/libffi.call/cls_align_pointer.c: Likewise. * testsuite/libffi.call/cls_align_sint16.c: Likewise. * testsuite/libffi.call/cls_align_sint32.c: Likewise. * testsuite/libffi.call/cls_align_sint64.c: Likewise. * testsuite/libffi.call/cls_align_uint16.c: Likewise. * testsuite/libffi.call/cls_align_uint32.c: Likewise. * testsuite/libffi.call/cls_align_uint64.c: Likewise. * testsuite/libffi.call/cls_dbls_struct.c: Likewise. * testsuite/libffi.call/cls_pointer_stack.c: Likewise. * testsuite/libffi.call/err_bad_typedef.c: Likewise. * testsuite/libffi.call/huge_struct.c: Likewise. * testsuite/libffi.call/nested_struct.c: Likewise. * testsuite/libffi.call/nested_struct1.c: Likewise. * testsuite/libffi.call/nested_struct10.c: Likewise. * testsuite/libffi.call/nested_struct2.c: Likewise. * testsuite/libffi.call/nested_struct3.c: Likewise. * testsuite/libffi.call/nested_struct4.c: Likewise. * testsuite/libffi.call/nested_struct5.c: Likewise. * testsuite/libffi.call/nested_struct6.c: Likewise. * testsuite/libffi.call/nested_struct7.c: Likewise. * testsuite/libffi.call/nested_struct8.c: Likewise. * testsuite/libffi.call/nested_struct9.c: Likewise. * testsuite/libffi.call/stret_large.c: Likewise. * testsuite/libffi.call/stret_large2.c: Likewise. * testsuite/libffi.call/stret_medium.c: Likewise. * testsuite/libffi.call/stret_medium2.c: Likewise. * testsuite/libffi.call/struct1.c: Likewise. * testsuite/libffi.call/struct1_win32.c: Likewise. * testsuite/libffi.call/struct2.c: Likewise. * testsuite/libffi.call/struct2_win32.c: Likewise. * testsuite/libffi.call/struct3.c: Likewise. * testsuite/libffi.call/struct4.c: Likewise. * testsuite/libffi.call/struct5.c: Likewise. * testsuite/libffi.call/struct6.c: Likewise. * testsuite/libffi.call/struct7.c: Likewise. * testsuite/libffi.call/struct8.c: Likewise. * testsuite/libffi.call/struct9.c: Likewise. * testsuite/libffi.call/testclosure.c: Likewise. 2012-03-21 Peter Rosin * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when printing doubles (%lf is for long doubles). (main): Likewise. 2012-03-21 Peter Rosin * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] (set_ld_library_path_env_vars): Add the library search dir to PATH (and save PATH for later). (restore_ld_library_path_env_vars): Restore PATH. 2012-03-21 Peter Rosin * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] (set_ld_library_path_env_vars): Add the library search dir to PATH (and save PATH for later). (restore_ld_library_path_env_vars): Restore PATH. 2012-03-20 Peter Rosin * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label visible outside the PROC, so that ffi_closure_THISCALL can see it. 2012-03-20 Peter Rosin * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label visible outside the PROC, so that ffi_closure_THISCALL can see it. 2012-03-19 Alan Hourihane * src/m68k/ffi.c: Add MINT support. * src/m68k/sysv.S: Ditto. 2012-03-06 Chung-Lin Tang * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to ffi_call_VFP(). (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of ffi_closure_VFP. * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. 2012-03-19 chennam * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure support. 2012-03-13 Kaz Kojima * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, just return FFI_BAD_ABI when things are wrong. * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. 2012-03-09 David Edelsohn * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 change to return value of ffi_closure_helper_DARWIN and load type from return type. 2012-03-03 H.J. Lu * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned long. (ffi_prep_closure_loc): Cast to 64bit address in trampoline. (ffi_closure_unix64_inner): Cast return pointer to unsigned long first. * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. (ffi_arg): Set to unsigned long long for x32. (ffi_sarg): Set to long long for x32. 2012-03-03 H.J. Lu * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. 2012-03-03 Andoni Morales Alastruey * configure.ac: Add -no-undefined for both 32- and 64-bit x86 windows-like hosts. * configure: Rebuilt. 2012-02-27 Mikael Pettersson PR libffi/52223 * Makefile.am (FLAGS_TO_PASS): Define. * Makefile.in: Regenerate. 2012-02-23 Anthony Green * src/*/ffitarget.h: Ensure that users never include ffitarget.h directly. 2012-02-23 Kai Tietz PR libffi/52221 * src/x86/ffi.c (ffi_closure_raw_THISCALL): New prototype. (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for thiscall-convention. (ffi_raw_call): Use ffi_prep_args_raw. * src/x86/win32.S (ffi_closure_raw_THISCALL): Add implementation for stub. 2012-02-10 Kai Tietz * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 windows target. * configure: Regenerated. 2012-02-08 Kai Tietz * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 also FFI_THISCALL. * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. (ffi_prep_closure_loc): Add FFI_THISCALL support. * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. * src/x86/win32.S (ffi_closure_THISCALL): New closure code for thiscall-calling convention. * testsuite/libffi.call/closure_thiscall.c: New test. 2012-01-28 Kai Tietz * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new argument to prototype for specify calling-convention. (ffi_call): Add support for stdcall/thiscall convention. (ffi_prep_args): Likewise. (ffi_raw_call): Likewise. * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and FFI_FASTCALL. * src/x86/win32.S (_ffi_call_win32): Add support for fastcall/thiscall calling-convention calls. * testsuite/libffi.call/fastthis1_win32.c: New test. * testsuite/libffi.call/fastthis2_win32.c: New test. * testsuite/libffi.call/fastthis3_win32.c: New test. * testsuite/libffi.call/strlen2_win32.c: New test. * testsuite/libffi.call/many2_win32.c: New test. * testsuite/libffi.call/struct1_win32.c: New test. * testsuite/libffi.call/struct2_win32.c: New test. 2012-01-23 Uros Bizjak * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. 2012-01-23 Anthony Green Chris Young * configure.ac: Add Amiga support. * configure: Rebuilt. 2012-01-23 Dmitry Nadezhin * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. 2012-01-23 Andreas Schwab * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain mc68000. Test for __HAVE_68881__ in addition to __MC68881__. 2012-01-19 Jakub Jelinek PR rtl-optimization/48496 * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. 2012-01-09 Rainer Orth * configure.ac (i?86-*-*): Set TARGET to X86_64. * configure: Regenerate. 2011-12-07 Andrew Pinski PR libffi/50051 * src/mips/n32.S: Add ".set mips4". 2011-11-21 Andreas Tobler * configure: Regenerate. 2011-11-12 David Gilbert * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, src/cris/ffi.c, src/prep_cif.c, testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/float_va.c: Many changes to support variadic function calls. 2011-11-12 Kyle Moffett * src/powerpc/ffi.c, src/powerpc/ffitarget.h, src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for softfloat powerpc variants. 2011-11-12 Petr Salinger * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. * configure: Rebuilt. 2011-11-12 Timothy Wall * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max alignment of 4 for wince on ARM. 2011-11-12 Kyle Moffett Anthony Green * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string instructions (not available on some cores, like the PPC440). 2011-11-12 Kimura Wataru * m4/ax_enable_builddir: Change from string comparison to numeric comparison for wc output. * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS X 10.7. * configure: Rebuilt. 2011-11-12 Anthony Green * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly files with debug info. * Makefile.in: Rebuilt. 2011-11-12 Jasper Lievisse Adriaanse * README: Update list of supported OpenBSD systems. 2011-11-12 Anthony Green * libtool-version: Update. * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if FFI_DEBUG. (libffi_la_SOURCES): Remove src/debug.c (EXTRA_DIST): Add src/debug.c * Makefile.in: Rebuilt. * README: Update for 3.0.11. 2011-11-10 Richard Henderson * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. * configure, aclocal.m4: Rebuild. 2011-09-04 Iain Sandoe PR libffi/49594 * src/powerpc/darwin_closure.S (stubs): Make the stub binding helper reference track the architecture pointer size. 2011-08-25 Andrew Haley * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly instructions. * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. 2011-07-11 Andrew Haley * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache. 2011-06-29 Rainer Orth * testsuite/libffi.call/cls_double_va.c: Move PR number to comment. * testsuite/libffi.call/cls_longdouble_va.c: Likewise. 2011-06-29 Rainer Orth PR libffi/46660 * testsuite/libffi.call/cls_double_va.c: xfail dg-output on mips-sgi-irix6*. * testsuite/libffi.call/cls_longdouble_va.c: Likewise. 2011-06-14 Rainer Orth * testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8, PRId8 instead of %hhu, %hhd. * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8, PRIu8): Define. [__sgi__] (PRId8, PRIu8): Define. 2011-04-29 Rainer Orth * src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE): Define. Use them to handle ELF vs. ECOFF differences. [__osf__] (_GLOBAL__F_ffi_call_osf): Define. 2011-03-30 Timothy Wall * src/powerpc/darwin.S: Fix unknown FDE encoding. * src/powerpc/darwin_closure.S: ditto. 2011-02-25 Anthony Green * src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more 32-bit ABIs. 2011-02-15 Anthony Green * m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math. * configure: Rebuilt. 2011-02-13 Ralf Wildenhues * configure: Regenerate. 2011-02-13 Anthony Green * include/ffi_common.h (UNLIKELY, LIKELY): Define. * src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition. * src/prep_cif.c (UNLIKELY, LIKELY): Remove definition. * src/prep_cif.c (initialize_aggregate): Convert assertion into FFI_BAD_TYPEDEF return. Initialize arg size and alignment to 0. * src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, just return FFI_BAD_ABI when things are wrong. * src/arm/ffi.c (ffi_prep_closure_loc): Ditto. * src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto. * src/mips/ffi.c (ffi_prep_closure_loc): Ditto. * src/ia64/ffi.c (ffi_prep_closure_loc): Ditto. * src/avr32/ffi.c (ffi_prep_closure_loc): Ditto. 2011-02-11 Anthony Green * src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, just return FFI_BAD_ABI when things are wrong. 2012-02-11 Eric Botcazou * src/sparc/v9.S (STACKFRAME): Bump to 176. 2011-02-09 Stuart Shelton http://bugs.gentoo.org/show_bug.cgi?id=286911 * src/mips/ffitarget.h: Clean up error messages. * src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to ffi_raw*. * include/ffi.h.in: Add pragma for SGI compiler. 2011-02-09 Anthony Green * configure.ac: Add powerpc64-*-darwin* support. 2011-02-09 Anthony Green * README: Mention Interix. 2011-02-09 Jonathan Callen * configure.ac: Add Interix to win32/cygwin/mingw case. * configure: Ditto. * src/closures.c: Treat Interix like Cygwin, instead of as a generic win32. 2011-02-09 Anthony Green * testsuite/libffi.call/err_bad_typedef.c: Remove xfail. * testsuite/libffi.call/err_bad_abi.c: Remove xfail. * src/x86/ffi64.c (UNLIKELY, LIKELY): Define. (ffi_prep_closure_loc): Check for bad ABI. * src/prep_cif.c (UNLIKELY, LIKELY): Define. (initialize_aggregate): Check for bad types. 2011-02-09 Landon Fuller * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh, src/arm/trampoline.S. (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S. * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define. * src/arm/ffi.c (ffi_trampoline_table) (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry) (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables) (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free): Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS). (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case separately. * src/arm/sysv.S: Handle Apple iOS host. * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case. * build-ios.sh: New file. * fficonfig.h.in, configure, Makefile.in: Rebuilt. * README: Mention ARM iOS. 2011-02-08 Oren Held * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid redefinition of mallinfo on HP-UX. 2011-02-08 Ginn Chen * src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio aggregate return ABI. Flush cache. (ffi_prep_closure_loc): Flush cache. 2011-02-11 Anthony Green From Tom Honermann : * src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on AIX. Declare .ffi_prep_args. Insert nops after branch instructions so that the AIX linker can insert TOC reload instructions. * src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN. 2011-02-08 Ed * src/powerpc/asm.h: Fix grammar nit in comment. 2011-02-08 Uli Link * include/ffi.h.in (FFI_64_BIT_MAX): Define and use. 2011-02-09 Rainer Orth PR libffi/46661 * testsuite/libffi.call/cls_pointer.c (main): Cast void * to uintptr_t first. * testsuite/libffi.call/cls_pointer_stack.c (main): Likewise. 2011-02-08 Rafael Avila de Espindola * configure.ac: Fix x86 test for pc related relocs. * configure: Rebuilt. 2011-02-07 Joel Sherrill * libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing. Handle case when CPU variant does not have long double support. * libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire, and cores with soft floating point. 2011-02-07 Joel Sherrill * configure.ac: Add mips*-*-rtems* support. * configure: Regenerate. * src/mips/ffitarget.h: Ensure needed constants are available for targets which do not have sgidefs.h. 2011-01-26 Dave Korn PR target/40125 * configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs. * configure: Regenerate. 2010-12-18 Iain Sandoe PR libffi/29152 PR libffi/42378 * src/powerpc/darwin_closure.S: Provide Darwin64 implementation, update comments. * src/powerpc/ffitarget.h (POWERPC_DARWIN64): New, (FFI_TRAMPOLINE_SIZE): Update for Darwin64. * src/powerpc/darwin.S: Provide Darwin64 implementation, update comments. * src/powerpc/ffi_darwin.c: Likewise. 2010-12-06 Rainer Orth * configure.ac (libffi_cv_as_ascii_pseudo_op): Use double backslashes. (libffi_cv_as_string_pseudo_op): Likewise. * configure: Regenerate. 2010-12-03 Chung-Lin Tang * src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive. (ffi_closure_VFP): Same. (ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp' directive. 2010-12-01 Rainer Orth * testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define. (PRIuPTR): Define. 2010-11-29 Richard Henderson Rainer Orth * src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define. (.eh_frame): Use FDE_ENCODING. (.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE. 2010-11-22 Jacek Caban * configure.ac: Check for symbol underscores on mingw-w64. * configure: Rebuilt. * src/x86/win64.S: Correctly access extern symbols in respect to underscores. 2010-11-15 Rainer Orth * testsuite/lib/libffi-dg.exp: Rename ... * testsuite/lib/libffi.exp: ... to this. * libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp. * libffi/testsuite/libffi.special/special.exp: Likewise. 2010-10-28 Chung-Lin Tang * src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling code, new parameter, and return value. Update comments. (ffi_prep_cif_machdep): Add case for VFP struct return values. Add call to layout_vfp_args(). (ffi_call_SYSV): Update declaration. (ffi_call_VFP): New declaration. (ffi_call): Add VFP struct return conditions. Call ffi_call_VFP() when ABI is FFI_VFP. (ffi_closure_VFP): New declaration. (ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to ffi_prep_incoming_args_SYSV(). (ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument case handling. (ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline construction under VFP hard-float. (rec_vfp_type_p): New function. (vfp_type_p): Same. (place_vfp_arg): Same. (layout_vfp_args): Same. * src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI based on __ARM_PCS_VFP. (FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific fields. (FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code. (FFI_TYPE_STRUCT_VFP_DOUBLE): Same. * src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to direct call. Move function pointer load upwards. (ffi_call_VFP): New function. (ffi_closure_VFP): Same. * testsuite/lib/libffi-dg.exp (check-flags): New function. (dg-skip-if): New function. * testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-* and compiler options include -mfloat-abi=hard. * testsuite/libffi.call/cls_longdouble_va.c: Same. 2010-10-01 Jakub Jelinek PR libffi/45677 * src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is a multiple of 8. * testsuite/libffi.call/many2.c: New test. 2010-08-20 Mark Wielaard * src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r returns NULL. 2010-08-09 Andreas Tobler * configure.ac: Add target powerpc64-*-freebsd*. * configure: Regenerate. * testsuite/libffi.call/cls_align_longdouble_split.c: Pass -mlong-double-128 only to linux targets. * testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise. * testsuite/libffi.call/cls_longdouble.c: Likewise. * testsuite/libffi.call/huge_struct.c: Likewise. 2010-08-05 Dan Witte * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the debug CRT when --enable-debug is given. * configure.ac: Define it. * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately. 2010-08-04 Dan Witte * src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64 platforms. * src/x86/ffi.c: Remove redundant ifdef checks. * src/prep_cif.c: Push stack space computation into src/x86/ffi.c for X86_ANY so return value space doesn't get added twice. 2010-08-03 Neil Rashbrooke * msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy. 2010-07-22 Dan Witte * src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI. * src/prep_cif.c: Fix ABI assertion. * src/cris/ffi.c: Ditto. 2010-07-10 Evan Phoenix * src/closures.c (selinux_enabled_check): Fix strncmp usage bug. 2010-07-07 Dan Horák * include/ffi.h.in: Protect #define with #ifndef. * src/powerpc/ffitarget.h: Ditto. * src/s390/ffitarget.h: Ditto. * src/sparc/ffitarget.h: Ditto. 2010-07-07 Neil Roberts * src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to 16-bytes. 2010-07-02 Jakub Jelinek * Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes. * Makefile.in: Regenerated. 2010-05-19 Rainer Orth * configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as output, too. (libffi_cv_as_ascii_pseudo_op): Check for .ascii. (libffi_cv_as_string_pseudo_op): Check for .string. * configure: Regenerate. * fficonfig.h.in: Regenerate. * src/x86/sysv.S (.eh_frame): Use .ascii, .string or error. 2010-05-11 Dan Witte * doc/libffi.tex: Document previous change. 2010-05-11 Makoto Kato * src/x86/ffi.c (ffi_call): Don't copy structs passed by value. 2010-05-05 Michael Kohler * src/dlmalloc.c (dlfree): Fix spelling. * src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto. * configure.ac: Ditto. * configure: Rebuilt. 2010-04-13 Dan Witte * msvcc.sh: Build with -W3 instead of -Wall. * src/powerpc/ffi_darwin.c: Remove build warnings. * src/x86/ffi.c: Ditto. * src/x86/ffitarget.h: Ditto. 2010-04-12 Dan Witte Walter Meinl * configure.ac: Add OS/2 support. * configure: Rebuilt. * src/closures.c: Ditto. * src/dlmalloc.c: Ditto. * src/x86/win32.S: Ditto. 2010-04-07 Jakub Jelinek * testsuite/libffi.call/err_bad_abi.c: Remove unused args variable. 2010-04-02 Ralf Wildenhues * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * include/Makefile.in: Regenerate. * man/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2010-03-30 Dan Witte * msvcc.sh: Disable build warnings. * README (tested): Clarify windows build procedure. 2010-03-15 Rainer Orth * configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test. * configure: Regenerate. * fficonfig.h.in: Regenerate. * libffi/src/x86/unix64.S (.eh_frame) [HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type. 2010-03-14 Matthias Klose * src/x86/ffi64.c: Fix typo in comment. * src/x86/ffi.c: Use /* ... */ comment style. 2010-02-24 Rainer Orth * doc/libffi.texi (The Closure API): Fix typo. * doc/libffi.info: Remove. 2010-02-15 Matthias Klose * src/arm/sysv.S (__ARM_ARCH__): Define for processor __ARM_ARCH_7EM__. 2010-01-15 Anthony Green * README: Add notes on building with Microsoft Visual C++. 2010-01-15 Daniel Witte * msvcc.sh: New file. * src/x86/win32.S: Port assembly routines to MSVC and #ifdef. * src/x86/ffi.c: Tweak function declaration and remove excess parens. * include/ffi.h.in: Add __declspec(align(8)) to typedef struct ffi_closure. * src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new function ffi_call_win32 on X86_WIN32. * src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32. (ffi_call_STDCALL): Remove. * src/prep_cif.c (ffi_prep_cif): Move stack space allocation code to ffi_prep_cif_machdep for x86. * src/x86/ffi.c (ffi_prep_cif_machdep): To here. 2010-01-15 Oliver Kiddle * src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for Sun Studio compiler compatibility. 2010-01-12 Conrad Irwin * doc/libffi.texi: Add closure example. 2010-01-07 Rainer Orth PR libffi/40701 * testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL, PRIuLL, PRId64, PRIu64, PRIuPTR): Define. * testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on alpha*-dec-osf*. * testsuite/libffi.call/cls_align_uint64.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/return_ll1.c: Likewise. * testsuite/libffi.call/stret_medium2.c: Likewise. * testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast MAP_FAILED to char *. 2010-01-06 Rainer Orth * src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__. 2009-12-31 Anthony Green * README: Update for libffi 3.0.9. 2009-12-27 Matthias Klose * configure.ac (HAVE_LONG_DOUBLE): Define for mips when appropriate. * configure: Rebuilt. 2009-12-26 Anthony Green * testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for avr32*-*-*. * testsuite/libffi.call/cls_double_va.c: Ditto. 2009-12-26 Andreas Tobler * testsuite/libffi.call/ffitest.h: Conditionally include stdint.h and inttypes.h. * testsuite/libffi.special/unwindtest.cc: Ditto. 2009-12-26 Andreas Tobler * configure.ac: Add amd64-*-openbsd*. * configure: Rebuilt. * testsuite/lib/libffi-dg.exp (libffi_target_compile): Link openbsd programs with -lpthread. 2009-12-26 Anthony Green * testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for mips*-*-* and arm*-*-*. * testsuite/libffi.call/cls_align_longdouble_split.c, testsuite/libffi.call/cls_align_longdouble_split2.c, testsuite/libffi.call/stret_medium2.c, testsuite/libffi.call/stret_medium.c, testsuite/libffi.call/stret_large.c, testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*. 2009-12-31 Kay Tietz * testsuite/libffi.call/ffitest.h, testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix definitions. 2009-12-31 Carlo Bramini * configure.ac (AM_LTLDFLAGS): Define for windows hosts. * Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS. * configure: Rebuilt. * Makefile.in: Rebuilt. 2009-12-31 Anthony Green Blake Chaffin. * testsuite/libffi.call/huge_struct.c: New test case from Blake Chaffin @ Apple. 2009-12-28 David Edelsohn * src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to local variables. (aix_adjust_aggregate_sizes): New function. (ffi_prep_cif_machdep): Call it. 2009-12-26 Andreas Tobler * configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets. * configure: Regenerate. * fficonfig.h.in: Likewise. * src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for Solaris/x86. 2009-12-26 Andreas Schwab * src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count when a float arguments is passed in memory. (ffi_closure_helper_SYSV): Mark general registers as used up when a 64bit or soft-float long double argument is passed in memory. 2009-12-25 Matthias Klose * man/ffi_call.3: Fix #include in examples. * doc/libffi.texi: Add dircategory. 2009-12-25 Frank Everdij * include/ffi.h.in: Placed '__GNUC__' ifdef around '__attribute__((aligned(8)))' in ffi_closure, fixes compile for IRIX MIPSPro c99. * include/ffi_common.h: Added '__sgi' define to non '__attribute__((__mode__()))' integer typedefs. * src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check. (ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added FFI_LONGDOUBLE support and alignment(N32 only). * src/mips/ffitarget.h: Corrected '#include ' for IRIX and fixed non '__attribute__((__mode__()))' integer typedefs. * src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame' since they are Linux/GNU Assembler specific. 2009-12-25 Bradley Smith * configure.ac, Makefile.am, src/avr32/ffi.c, src/avr32/ffitarget.h, src/avr32/sysv.S: Add AVR32 port. * configure, Makefile.in: Rebuilt. 2009-12-21 Andreas Tobler * configure.ac: Make i?86 build on FreeBSD and OpenBSD. * configure: Regenerate. 2009-12-15 John David Anglin * testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX. 2009-12-13 John David Anglin * src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE type on HP-UX. 2012-02-13 Kai Tietz PR libffi/52221 * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall support for X86_WIN32. (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. 2009-12-11 Eric Botcazou * src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long double' arguments. 2009-12-11 Eric Botcazou * testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10. 2009-12-10 Rainer Orth PR libffi/40700 * src/closures.c [X86_64 && __sun__ && __svr4__] (FFI_MMAP_EXEC_WRIT): Define. 2009-12-08 David Daney * testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-* * testsuite/libffi.call/cls_align_longdouble_split2.c: Same. * testsuite/libffi.call/stret_large.c: Same. * testsuite/libffi.call/cls_align_longdouble_split.c: Same. * testsuite/libffi.call/stret_large2.c: Same. * testsuite/libffi.call/stret_medium2.c: Same. 2009-12-07 David Edelsohn * src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump typo. 2009-12-05 David Edelsohn * src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64 code. * src/powerpc/aix_closure.S: Same. 2009-12-05 Ralf Wildenhues * Makefile.in: Regenerate. * configure: Regenerate. * include/Makefile.in: Regenerate. * man/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2009-12-04 David Edelsohn * src/powerpc/aix_closure.S: Reorganize 64-bit code to match linux64_closure.S. 2009-12-04 Uros Bizjak PR libffi/41908 * src/x86/ffi64.c (classify_argument): Update from gcc/config/i386/i386.c. (ffi_closure_unix64_inner): Do not use the address of two consecutive SSE registers directly. * testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail for x86_64 linux targets. 2009-12-04 David Edelsohn * src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment pfr for long double split between fpr13 and stack. 2009-12-03 David Edelsohn * src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and fparg_count twice for long double. 2009-12-03 David Edelsohn PR libffi/42243 * src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses. 2009-12-03 Uros Bizjak * testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string. Remove xfails for x86 linux targets. 2009-12-02 David Edelsohn * src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64 case. 2009-12-01 David Edelsohn * src/powerpc/aix.S (ffi_call_AIX): Convert to more standard register usage. Call ffi_prep_args directly. Add long double return value support. * src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment applies to FFI_TYPE_DOUBLE. Correct fpr_base increment typo. Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases. (ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit mode. (ffi_closure_helper_DARWIN): Remove nf and ng counters. Move temp into case. * src/powerpc/aix_closure.S: Maintain 16 byte stack alignment. Allocate result area between params and FPRs. 2009-11-30 David Edelsohn PR target/35484 * src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and AIX64. * src/powerpc/aix.S: Implement AIX64 version. * src/powerpc/aix_closure.S: Implement AIX64 version. (ffi_closure_ASM): Use extsb, lha and displament addresses. * src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64 support. (ffi_prep_cif_machdep): Same. (ffi_call): Same. (ffi_closure_helper_DARWIN): Same. 2009-11-02 Andreas Tobler PR libffi/41908 * testsuite/libffi.call/testclosure.c: New test. 2009-09-28 Kai Tietz * src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu assembly version use of ___chkstk. 2009-09-23 Matthias Klose PR libffi/40242, PR libffi/41443 * src/arm/sysv.S (__ARM_ARCH__): Define for processors __ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__, __ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__. Change the conditionals to __SOFTFP__ || __ARM_EABI__ for -mfloat-abi=softfp to work. 2009-09-17 Loren J. Rittle PR testsuite/32843 (strikes again) * src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to enable proper extension on char and short. 2009-09-15 David Daney * src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special handling for FFI_TYPE_POINTER. * src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT, FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT, FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT, FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines. (FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations. (enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float. * src/mips/n32.S (ffi_call_N32): Add handling for soft-float structure and pointer returns. (ffi_closure_N32): Add handling for pointer returns. * src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags, calc_n32_return_struct_flags): Handle soft-float. (ffi_prep_cif_machdep): Handle soft-float, fix pointer handling. (ffi_call_N32): Declare proper argument types. (ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle soft-float. 2009-08-24 Ralf Wildenhues * configure.ac (AC_PREREQ): Bump to 2.64. 2009-08-22 Ralf Wildenhues * Makefile.am (install-html, install-pdf): Remove. * Makefile.in: Regenerate. * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * configure: Regenerate. * fficonfig.h.in: Regenerate. * include/Makefile.in: Regenerate. * man/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2011-08-22 Jasper Lievisse Adriaanse * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. * configure: Rebuilt. 2009-07-30 Ralf Wildenhues * configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force. 2009-07-24 Dave Korn PR libffi/40807 * src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending return types for X86_WIN32. * src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types. (_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV, _ffi_closure_STDCALL): Likewise. * src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin. (dlmmap, dlmunmap): Also use these functions on Cygwin. 2009-07-11 Richard Sandiford PR testsuite/40699 PR testsuite/40707 PR testsuite/40709 * testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and 2009-06-30 commits. 2009-07-01 Richard Sandiford * testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path to "" before adding paths. (This reinstates an assignment that was removed by my 2009-06-30 commit, but changes the initial value from "." to "".) 2009-07-01 H.J. Lu PR testsuite/40601 * testsuite/lib/libffi-dg.exp (libffi-init): Properly set gccdir. Adjust ld_library_path for gcc only if gccdir isn't empty. 2009-06-30 Richard Sandiford * testsuite/lib/libffi-dg.exp (libffi-init): Don't add "." to ld_library_path. Use add_path. Add just find_libgcc_s to ld_library_path, not every libgcc multilib directory. 2009-06-16 Wim Lewis * src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are supposed to be callee-saved. * src/powerpc/sysv.S (small_struct_return_value): Fix overrun of return buffer for odd-size structs. 2009-06-16 Andreas Tobler PR libffi/40444 * testsuite/lib/libffi-dg.exp (libffi_target_compile): Add allow_stack_execute for Darwin. 2009-06-16 Andrew Haley * configure.ac (TARGETDIR): Add missing blank lines. * configure: Regenerate. 2009-06-16 Andrew Haley * testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_medium2.c: Fix printf format specifiers. * testsuite/libffi.call/ffitest.h, testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. 2009-06-15 Andrew Haley * testsuite/libffi.call/err_bad_typedef.c: xfail everywhere. * testsuite/libffi.call/err_bad_abi.c: Likewise. 2009-06-12 Andrew Haley * Makefile.am: Remove info_TEXINFOS. 2009-06-12 Andrew Haley * ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_medium2.c: Fix printf format specifiers. testsuite/libffi.special/unwindtest.cc: include stdint.h. 2009-06-11 Timothy Wall * Makefile.am, configure.ac, include/ffi.h.in, include/ffi_common.h, src/closures.c, src/dlmalloc.c, src/x86/ffi.c, src/x86/ffitarget.h, src/x86/win64.S (new), README: Added win64 support (mingw or MSVC) * Makefile.in, include/Makefile.in, man/Makefile.in, testsuite/Makefile.in, configure, aclocal.m4: Regenerated * ltcf-c.sh: properly escape cygwin/w32 path * man/ffi_call.3: Clarify size requirements for return value. * src/x86/ffi64.c: Fix filename in comment. * src/x86/win32.S: Remove unused extern. * testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/closure_stdcall.c, testsuite/libffi.call/cls_12byte.c, testsuite/libffi.call/cls_16byte.c, testsuite/libffi.call/cls_18byte.c, testsuite/libffi.call/cls_19byte.c, testsuite/libffi.call/cls_1_1byte.c, testsuite/libffi.call/cls_20byte.c, testsuite/libffi.call/cls_20byte1.c, testsuite/libffi.call/cls_24byte.c, testsuite/libffi.call/cls_2byte.c, testsuite/libffi.call/cls_3_1byte.c, testsuite/libffi.call/cls_3byte1.c, testsuite/libffi.call/cls_3byte2.c, testsuite/libffi.call/cls_4_1byte.c, testsuite/libffi.call/cls_4byte.c, testsuite/libffi.call/cls_5_1_byte.c, testsuite/libffi.call/cls_5byte.c, testsuite/libffi.call/cls_64byte.c, testsuite/libffi.call/cls_6_1_byte.c, testsuite/libffi.call/cls_6byte.c, testsuite/libffi.call/cls_7_1_byte.c, testsuite/libffi.call/cls_7byte.c, testsuite/libffi.call/cls_8byte.c, testsuite/libffi.call/cls_9byte1.c, testsuite/libffi.call/cls_9byte2.c, testsuite/libffi.call/cls_align_double.c, testsuite/libffi.call/cls_align_float.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_align_longdouble_split.c, testsuite/libffi.call/cls_align_longdouble_split2.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_align_sint16.c, testsuite/libffi.call/cls_align_sint32.c, testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint16.c, testsuite/libffi.call/cls_align_uint32.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_dbls_struct.c, testsuite/libffi.call/cls_double.c, testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_float.c, testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_multi_schar.c, testsuite/libffi.call/cls_multi_sshort.c, testsuite/libffi.call/cls_multi_sshortchar.c, testsuite/libffi.call/cls_multi_uchar.c, testsuite/libffi.call/cls_multi_ushort.c, testsuite/libffi.call/cls_multi_ushortchar.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c, testsuite/libffi.call/cls_schar.c, testsuite/libffi.call/cls_sint.c, testsuite/libffi.call/cls_sshort.c, testsuite/libffi.call/cls_uchar.c, testsuite/libffi.call/cls_uint.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/cls_ushort.c, testsuite/libffi.call/err_bad_abi.c, testsuite/libffi.call/err_bad_typedef.c, testsuite/libffi.call/float2.c, testsuite/libffi.call/huge_struct.c, testsuite/libffi.call/nested_struct.c, testsuite/libffi.call/nested_struct1.c, testsuite/libffi.call/nested_struct10.c, testsuite/libffi.call/nested_struct2.c, testsuite/libffi.call/nested_struct3.c, testsuite/libffi.call/nested_struct4.c, testsuite/libffi.call/nested_struct5.c, testsuite/libffi.call/nested_struct6.c, testsuite/libffi.call/nested_struct7.c, testsuite/libffi.call/nested_struct8.c, testsuite/libffi.call/nested_struct9.c, testsuite/libffi.call/problem1.c, testsuite/libffi.call/return_ldl.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_large.c, testsuite/libffi.call/stret_large2.c, testsuite/libffi.call/stret_medium.c, testsuite/libffi.call/stret_medium2.c, testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead of checking for MMAP. Use intptr_t instead of long casts. 2009-06-11 Kaz Kojima * testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*. * testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*. * testsuite/libffi.call/err_bad_typedef.c: Likewise. 2009-06-09 Andrew Haley * src/x86/freebsd.S: Add missing file. 2009-06-08 Andrew Haley Import from libffi 3.0.8: * doc/libffi.texi: New file. * doc/libffi.info: Likewise. * doc/stamp-vti: Likewise. * man/Makefile.am: New file. * man/ffi_call.3: New file. * Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S, src/dlmalloc.c. (nodist_libffi_la_SOURCES): Add X86_FREEBSD. * configure.ac: Bump version to 3.0.8. parisc*-*-linux*: Add. i386-*-freebsd* | i386-*-openbsd*: Add. powerpc-*-beos*: Add. AM_CONDITIONAL X86_FREEBSD: Add. AC_CONFIG_FILES: Add man/Makefile. * include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void). 2009-06-08 Andrew Haley * README: Import from libffi 3.0.8. 2009-06-08 Andrew Haley * testsuite/libffi.call/err_bad_abi.c: Add xfails. * testsuite/libffi.call/cls_longdouble_va.c: Add xfails. * testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*. * testsuite/libffi.call/err_bad_typedef.c: Add xfails. * testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args. * testsuite/libffi.call/stret_medium.c: Likewise. * testsuite/libffi.call/stret_large2.c: Likewise. * testsuite/libffi.call/stret_large.c: Likewise. 2008-12-26 Timothy Wall * testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_align_longdouble_split.c, testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected failures on x86_64 cygwin/mingw. 2008-12-22 Timothy Wall * testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/closure_loc_fn0.c, testsuite/libffi.call/closure_stdcall.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c: use portable cast from pointer to integer (intptr_t). * testsuite/libffi.call/cls_longdouble.c: disable for win64. 2008-07-24 Anthony Green * testsuite/libffi.call/cls_dbls_struct.c, testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c, testsuite/libffi.call/err_bad_abi.c: Clean up failures from compiler warnings. 2008-03-04 Anthony Green Blake Chaffin hos@tamanegi.org * testsuite/libffi.call/cls_align_longdouble_split2.c testsuite/libffi.call/cls_align_longdouble_split.c testsuite/libffi.call/cls_dbls_struct.c testsuite/libffi.call/cls_double_va.c testsuite/libffi.call/cls_longdouble.c testsuite/libffi.call/cls_longdouble_va.c testsuite/libffi.call/cls_pointer.c testsuite/libffi.call/cls_pointer_stack.c testsuite/libffi.call/err_bad_abi.c testsuite/libffi.call/err_bad_typedef.c testsuite/libffi.call/stret_large2.c testsuite/libffi.call/stret_large.c testsuite/libffi.call/stret_medium2.c testsuite/libffi.call/stret_medium.c: New tests from Apple. 2009-06-05 Andrew Haley * src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from libffi. 2009-06-04 Andrew Haley * src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out stdcall changes. 2008-02-26 Anthony Green Thomas Heller * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C comment. 2008-02-03 Timothy Wall * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return offset based on code pointer, not data pointer. 2008-01-31 Timothy Wall * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall closures. * src/x86/ffitarget.h: Increase size of trampoline for stdcall closures. * src/x86/win32.S: Add assembly for stdcall closure. * src/x86/ffi.c: Initialize stdcall closure trampoline. 2009-06-04 Andrew Haley * include/ffi.h.in: Change void (*)() to void (*)(void). * src/x86/ffi.c: Likewise. 2009-06-04 Andrew Haley * src/powerpc/ppc_closure.S: Insert licence header. * src/powerpc/linux64_closure.S: Likewise. * src/m68k/sysv.S: Likewise. * src/sh64/ffi.c: Change void (*)() to void (*)(void). * src/powerpc/ffi.c: Likewise. * src/powerpc/ffi_darwin.c: Likewise. * src/m32r/ffi.c: Likewise. * src/sh64/ffi.c: Likewise. * src/x86/ffi64.c: Likewise. * src/alpha/ffi.c: Likewise. * src/alpha/osf.S: Likewise. * src/frv/ffi.c: Likewise. * src/s390/ffi.c: Likewise. * src/pa/ffi.c: Likewise. * src/pa/hpux32.S: Likewise. * src/ia64/unix.S: Likewise. * src/ia64/ffi.c: Likewise. * src/sparc/ffi.c: Likewise. * src/mips/ffi.c: Likewise. * src/sh/ffi.c: Likewise. 2008-02-15 David Daney * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): Define (conditionally), and use it to include cachectl.h. (ffi_prep_closure_loc): Fix cache flushing. * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. 2009-06-04 Andrew Haley include/ffi.h.in, src/arm/ffitarget.h, src/arm/ffi.c, src/arm/sysv.S, src/powerpc/ffitarget.h, src/closures.c, src/sh64/ffitarget.h, src/sh64/ffi.c, src/sh64/sysv.S, src/types.c, src/x86/ffi64.c, src/x86/ffitarget.h, src/x86/win32.S, src/x86/darwin.S, src/x86/ffi.c, src/x86/sysv.S, src/x86/unix64.S, src/alpha/ffitarget.h, src/alpha/ffi.c, src/alpha/osf.S, src/m68k/ffitarget.h, src/frv/ffitarget.h, src/frv/ffi.c, src/s390/ffitarget.h, src/s390/sysv.S, src/cris/ffitarget.h, src/pa/linux.S, src/pa/ffitarget.h, src/pa/ffi.c, src/raw_api.c, src/ia64/ffitarget.h, src/ia64/unix.S, src/ia64/ffi.c, src/ia64/ia64_flags.h, src/java_raw_api.c, src/debug.c, src/sparc/v9.S, src/sparc/ffitarget.h, src/sparc/ffi.c, src/sparc/v8.S, src/mips/ffitarget.h, src/mips/n32.S, src/mips/o32.S, src/mips/ffi.c, src/prep_cif.c, src/sh/ffitarget.h, src/sh/ffi.c, src/sh/sysv.S: Update license text. 2009-05-22 Dave Korn * src/x86/win32.S (_ffi_closure_STDCALL): New function. (.eh_frame): Add FDE for it. 2009-05-22 Dave Korn * configure.ac: Also check if assembler supports pc-relative relocs on X86_WIN32 targets. * configure: Regenerate. * src/x86/win32.S (ffi_prep_args): Declare extern, not global. (_ffi_call_SYSV): Add missing function type symbol .def and add EH markup labels. (_ffi_call_STDCALL): Likewise. (_ffi_closure_SYSV): Likewise. (_ffi_closure_raw_SYSV): Likewise. (.eh_frame): Add hand-crafted EH data. 2009-04-09 Jakub Jelinek * testsuite/lib/libffi-dg.exp: Change copyright header to refer to version 3 of the GNU General Public License and to point readers at the COPYING3 file and the FSF's license web page. * testsuite/libffi.call/call.exp: Likewise. * testsuite/libffi.special/special.exp: Likewise. 2009-03-01 Ralf Wildenhues * configure: Regenerate. 2008-12-18 Rainer Orth PR libffi/26048 * configure.ac (HAVE_AS_X86_PCREL): New test. * configure: Regenerate. * fficonfig.h.in: Regenerate. * src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET, RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler. (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. * src/x86/unix64.S (.Lstore_table): Move to .text section. (.Lload_table): Likewise. (.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL. 2008-12-18 Ralf Wildenhues * configure: Regenerate. 2008-11-21 Eric Botcazou * src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for signed/unsigned int8/16 return values. * src/sparc/v8.S (ffi_call_v8): Likewise. (ffi_closure_v8): Likewise. 2008-09-26 Peter O'Gorman Steve Ellcey * configure: Regenerate for new libtool. * Makefile.in: Ditto. * include/Makefile.in: Ditto. * aclocal.m4: Ditto. 2008-08-25 Andreas Tobler * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. Adjust copyright notice. * src/powerpc/ffi.c: Add two new flags to indicate if we have one register or two register to use for FFI_SYSV structs. (ffi_prep_cif_machdep): Pass the right register flag introduced above. (ffi_closure_helper_SYSV): Fix the return type for FFI_SYSV_TYPE_SMALL_STRUCT. Comment. Adjust copyright notice. 2008-07-16 Kaz Kojima * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned int. 2008-06-17 Ralf Wildenhues * configure: Regenerate. * include/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2008-06-07 Joseph Myers * configure.ac (parisc*-*-linux*, powerpc-*-sysv*, powerpc-*-beos*): Remove. * configure: Regenerate. 2008-05-09 Julian Brown * Makefile.am (LTLDFLAGS): New. (libffi_la_LDFLAGS): Use above. * Makefile.in: Regenerate. 2008-04-18 Paolo Bonzini PR bootstrap/35457 * aclocal.m4: Regenerate. * configure: Regenerate. 2008-03-26 Kaz Kojima * src/sh/sysv.S: Add .note.GNU-stack on Linux. * src/sh64/sysv.S: Likewise. 2008-03-26 Daniel Jacobowitz * src/arm/sysv.S: Fix ARM comment marker. 2008-03-26 Jakub Jelinek * src/alpha/osf.S: Add .note.GNU-stack on Linux. * src/s390/sysv.S: Likewise. * src/powerpc/ppc_closure.S: Likewise. * src/powerpc/sysv.S: Likewise. * src/x86/unix64.S: Likewise. * src/x86/sysv.S: Likewise. * src/sparc/v8.S: Likewise. * src/sparc/v9.S: Likewise. * src/m68k/sysv.S: Likewise. * src/arm/sysv.S: Likewise. 2008-03-16 Ralf Wildenhues * aclocal.m4: Regenerate. * configure: Likewise. * Makefile.in: Likewise. * include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. 2008-02-12 Bjoern Koenig Andreas Tobler * configure.ac: Add amd64-*-freebsd* target. * configure: Regenerate. 2008-01-30 H.J. Lu PR libffi/34612 * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when returning struct. * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" tests. 2008-01-24 David Edelsohn * configure: Regenerate. 2008-01-06 Andreas Tobler * src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko. 2008-01-05 Andreas Tobler PR testsuite/32843 * src/x86/ffi.c (ffi_prep_cif_machdep): Add code for signed/unsigned int8/16 for X86_DARWIN. Updated copyright info. Handle one and two byte structs with special cif->flags. * src/x86/ffitarget.h: Add special types for one and two byte structs. Updated copyright info. * src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like sysv.S Remove code to pop args from the stack after call. Special-case signed/unsigned for int8/16, one and two byte structs. (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. Updated copyright info. 2007-12-08 David Daney * src/mips/n32.S (ffi_call_N32): Replace dadd with ADDU, dsub with SUBU, add with ADDU and use smaller code sequences. 2007-12-07 David Daney * src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return type. 2007-12-06 David Daney * include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not already defined. (ffi_java_raw): New typedef. (ffi_java_raw_call, ffi_java_ptrarray_to_raw, ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to ffi_java_raw. (ffi_java_raw_closure) : Same. (ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change parameter types. * src/java_raw_api.c (ffi_java_raw_size): Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. (ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw. Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use sizeof(ffi_java_raw) for alignment calculations. (ffi_java_ptrarray_to_raw): Same. (ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER if FFI_SIZEOF_JAVA_RAW == 4. (ffi_java_raw_to_rvalue): Same. (ffi_java_raw_call): Change type of raw to ffi_java_raw. (ffi_java_translate_args): Same. (ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change parameter types. * src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI. 2007-12-06 David Daney * src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on pointer values. 2007-12-01 Andreas Tobler PR libffi/31937 * src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT. Add local FFI_TYPE_UINT128 to handle soft-float long-double-128. * src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and set the NUM_FPR_ARG_REGISTERS according to. Add support for potential soft-float support under hard-float architecture. (ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according to the FFI_LINUX_SOFT_FLOAT ABI. (ffi_prep_cif_machdep): Likewise. (ffi_closure_helper_SYSV): Likewise. * src/powerpc/ppc_closure.S: Make sure not to store float/double on archs where __NO_FPRS__ is true. Add FFI_TYPE_UINT128 support. * src/powerpc/sysv.S: Add support for soft-float long-double-128. Adjust copyright notice. 2007-11-25 Andreas Tobler * src/closures.c: Move defintion of MAYBE_UNUSED from here to ... * include/ffi_common.h: ... here. Update copyright. 2007-11-17 Andreas Tobler * src/powerpc/sysv.S: Load correct cr to compare if we have long double. * src/powerpc/linux64.S: Likewise. * src/powerpc/ffi.c: Add a comment to show which part goes into cr6. * testsuite/libffi.call/return_ldl.c: New test. 2007-09-04 * src/arm/sysv.S (UNWIND): New. (Whole file): Conditionally compile unwinder directives. * src/arm/sysv.S: Add unwinder directives. * src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes. Only treat r0 as a struct address if we're actually returning a struct by address. Only copy the bytes that are actually within a struct. (ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes is returned in r0, not passed by address. (ffi_call): Allocate a word-sized temporary for the case where a composite is returned in r0. (ffi_prep_incoming_args_SYSV): Align as necessary. 2007-08-05 Steven Newbury * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of directly using the sys_cacheflush syscall. 2007-07-27 Andrew Haley * src/arm/sysv.S (ffi_closure_SYSV): Add soft-float. 2007-09-03 Maciej W. Rozycki * Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS. * configure.ac: Likewise. * Makefile.in: Regenerate. * include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. * configure: Likewise. 2007-08-24 David Daney * testsuite/libffi.call/return_sl.c: New test. 2007-08-10 David Daney * testsuite/libffi.call/cls_multi_ushort.c, testsuite/libffi.call/cls_align_uint16.c, testsuite/libffi.call/nested_struct1.c, testsuite/libffi.call/nested_struct3.c, testsuite/libffi.call/cls_7_1_byte.c, testsuite/libffi.call/nested_struct5.c, testsuite/libffi.call/cls_double.c, testsuite/libffi.call/nested_struct7.c, testsuite/libffi.call/cls_sint.c, testsuite/libffi.call/nested_struct9.c, testsuite/libffi.call/cls_20byte1.c, testsuite/libffi.call/cls_multi_sshortchar.c, testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_3byte2.c, testsuite/libffi.call/cls_multi_schar.c, testsuite/libffi.call/cls_multi_uchar.c, testsuite/libffi.call/cls_19byte.c, testsuite/libffi.call/cls_9byte1.c, testsuite/libffi.call/cls_align_float.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/problem1.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/cls_sshort.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/cls_align_double.c, testsuite/libffi.call/nested_struct.c, testsuite/libffi.call/cls_2byte.c, testsuite/libffi.call/nested_struct10.c, testsuite/libffi.call/cls_4byte.c, testsuite/libffi.call/cls_6byte.c, testsuite/libffi.call/cls_8byte.c, testsuite/libffi.call/cls_multi_sshort.c, testsuite/libffi.call/cls_align_sint16.c, testsuite/libffi.call/cls_align_uint32.c, testsuite/libffi.call/cls_20byte.c, testsuite/libffi.call/cls_float.c, testsuite/libffi.call/nested_struct2.c, testsuite/libffi.call/cls_5_1_byte.c, testsuite/libffi.call/nested_struct4.c, testsuite/libffi.call/cls_24byte.c, testsuite/libffi.call/nested_struct6.c, testsuite/libffi.call/cls_64byte.c, testsuite/libffi.call/nested_struct8.c, testsuite/libffi.call/cls_uint.c, testsuite/libffi.call/cls_multi_ushortchar.c, testsuite/libffi.call/cls_schar.c, testsuite/libffi.call/cls_uchar.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_1_1byte.c, testsuite/libffi.call/cls_12byte.c, testsuite/libffi.call/cls_3_1byte.c, testsuite/libffi.call/cls_3byte1.c, testsuite/libffi.call/cls_4_1byte.c, testsuite/libffi.call/cls_6_1_byte.c, testsuite/libffi.call/cls_16byte.c, testsuite/libffi.call/cls_18byte.c, testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/cls_9byte2.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/cls_ushort.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/cls_5byte.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_7byte.c, testsuite/libffi.call/cls_align_sint32.c, testsuite/libffi.special/unwindtest_ffi_call.cc, testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*. 2007-08-10 David Daney PR libffi/28313 * configure.ac: Don't treat mips64 as a special case. * Makefile.am (nodist_libffi_la_SOURCES): Add n32.S. * configure: Regenerate * Makefile.in: Ditto. * fficonfig.h.in: Ditto. * src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent. (LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros. (FFI_DEFAULT_ABI): Set for n64 case. (FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases. * src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE. (ffi_closure_N32): New function. (.eh_frame): New section * src/mips/o32.S: Clean up comments. (ffi_closure_O32): Pass ffi_closure parameter in $12. * src/mips/ffi.c: Use FFI_MIPS_N32 instead of _MIPS_SIM == _ABIN32 throughout. (FFI_MIPS_STOP_HERE): New, use in place of ffi_stop_here. (ffi_prep_args): Use unsigned long to hold pointer values. Rewrite to support n32/n64 ABIs. (calc_n32_struct_flags): Rewrite. (calc_n32_return_struct_flags): Remove unused variable. Reverse position of flag bits. (ffi_prep_cif_machdep): Rewrite n32 portion. (ffi_call): Enable for n64. Add special handling for small structure return values. (ffi_prep_closure_loc): Add n32 and n64 support. (ffi_closure_mips_inner_O32): Add cast to silence warning. (copy_struct_N32, ffi_closure_mips_inner_N32): New functions. 2007-08-08 David Daney * testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition. * testsuite/libffi.call/cls_align_uint16.c (main): Use correct type specifiers. * testsuite/libffi.call/nested_struct1.c (main): Ditto. * testsuite/libffi.call/cls_sint.c (main): Ditto. * testsuite/libffi.call/nested_struct9.c (main): Ditto. * testsuite/libffi.call/cls_20byte1.c (main): Ditto. * testsuite/libffi.call/cls_9byte1.c (main): Ditto. * testsuite/libffi.call/closure_fn1.c (main): Ditto. * testsuite/libffi.call/closure_fn3.c (main): Ditto. * testsuite/libffi.call/return_dbl2.c (main): Ditto. * testsuite/libffi.call/cls_sshort.c (main): Ditto. * testsuite/libffi.call/return_fl3.c (main): Ditto. * testsuite/libffi.call/closure_fn5.c (main): Ditto. * testsuite/libffi.call/nested_struct.c (main): Ditto. * testsuite/libffi.call/nested_struct10.c (main): Ditto. * testsuite/libffi.call/return_ll1.c (main): Ditto. * testsuite/libffi.call/cls_8byte.c (main): Ditto. * testsuite/libffi.call/cls_align_uint32.c (main): Ditto. * testsuite/libffi.call/cls_align_sint16.c (main): Ditto. * testsuite/libffi.call/cls_20byte.c (main): Ditto. * testsuite/libffi.call/nested_struct2.c (main): Ditto. * testsuite/libffi.call/cls_24byte.c (main): Ditto. * testsuite/libffi.call/nested_struct6.c (main): Ditto. * testsuite/libffi.call/cls_uint.c (main): Ditto. * testsuite/libffi.call/cls_12byte.c (main): Ditto. * testsuite/libffi.call/cls_16byte.c (main): Ditto. * testsuite/libffi.call/closure_fn0.c (main): Ditto. * testsuite/libffi.call/cls_9byte2.c (main): Ditto. * testsuite/libffi.call/closure_fn2.c (main): Ditto. * testsuite/libffi.call/return_dbl1.c (main): Ditto. * testsuite/libffi.call/closure_fn4.c (main): Ditto. * testsuite/libffi.call/closure_fn6.c (main): Ditto. * testsuite/libffi.call/cls_align_sint32.c (main): Ditto. 2007-08-07 Andrew Haley * src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous checkin. 2007-08-06 Andrew Haley PR testsuite/32843 * src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. 2007-08-02 David Daney * testsuite/libffi.call/return_ul.c (main): Define return type as ffi_arg. Use proper printf conversion specifier. 2007-07-30 Andrew Haley PR testsuite/32843 * src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for signed/unsigned int8/16. * src/x86/sysv.S (ffi_call_SYSV): Rewrite to: Use a jump table. Remove code to pop args from the stack after call. Special-case signed/unsigned int8/16. * testsuite/libffi.call/return_sc.c (main): Revert. 2007-07-26 Richard Guenther PR testsuite/32843 * testsuite/libffi.call/return_sc.c (main): Verify call result as signed char, not ffi_arg. 2007-07-16 Rainer Orth * configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64. * configure: Regenerate. 2007-07-11 David Daney * src/mips/ffi.c: Don't include sys/cachectl.h. (ffi_prep_closure_loc): Use __builtin___clear_cache() instead of cacheflush(). 2007-05-18 Aurelien Jarno * src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted from (ffi_prep_closure): ... this. (FFI_INIT_TRAMPOLINE): Adjust. 2005-12-31 Phil Blundell * src/arm/ffi.c (ffi_prep_incoming_args_SYSV, ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support. * src/arm/sysv.S(ffi_closure_SYSV): Likewise. * src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. (FFI_CLOSURES): Enable closure support. 2007-07-03 Andrew Haley * testsuite/libffi.call/cls_multi_ushort.c, testsuite/libffi.call/cls_align_uint16.c, testsuite/libffi.call/nested_struct1.c, testsuite/libffi.call/nested_struct3.c, testsuite/libffi.call/cls_7_1_byte.c, testsuite/libffi.call/cls_double.c, testsuite/libffi.call/nested_struct5.c, testsuite/libffi.call/nested_struct7.c, testsuite/libffi.call/cls_sint.c, testsuite/libffi.call/nested_struct9.c, testsuite/libffi.call/cls_20byte1.c, testsuite/libffi.call/cls_multi_sshortchar.c, testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_3byte2.c, testsuite/libffi.call/cls_multi_schar.c, testsuite/libffi.call/cls_multi_uchar.c, testsuite/libffi.call/cls_19byte.c, testsuite/libffi.call/cls_9byte1.c, testsuite/libffi.call/cls_align_float.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/problem1.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/cls_sshort.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/cls_align_double.c, testsuite/libffi.call/cls_2byte.c, testsuite/libffi.call/nested_struct.c, testsuite/libffi.call/nested_struct10.c, testsuite/libffi.call/cls_4byte.c, testsuite/libffi.call/cls_6byte.c, testsuite/libffi.call/cls_8byte.c, testsuite/libffi.call/cls_multi_sshort.c, testsuite/libffi.call/cls_align_uint32.c, testsuite/libffi.call/cls_align_sint16.c, testsuite/libffi.call/cls_float.c, testsuite/libffi.call/cls_20byte.c, testsuite/libffi.call/cls_5_1_byte.c, testsuite/libffi.call/nested_struct2.c, testsuite/libffi.call/cls_24byte.c, testsuite/libffi.call/nested_struct4.c, testsuite/libffi.call/nested_struct6.c, testsuite/libffi.call/cls_64byte.c, testsuite/libffi.call/nested_struct8.c, testsuite/libffi.call/cls_uint.c, testsuite/libffi.call/cls_multi_ushortchar.c, testsuite/libffi.call/cls_schar.c, testsuite/libffi.call/cls_uchar.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_1_1byte.c, testsuite/libffi.call/cls_12byte.c, testsuite/libffi.call/cls_3_1byte.c, testsuite/libffi.call/cls_3byte1.c, testsuite/libffi.call/cls_4_1byte.c, testsuite/libffi.call/cls_6_1_byte.c, testsuite/libffi.call/cls_16byte.c, testsuite/libffi.call/cls_18byte.c, testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/cls_9byte2.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/cls_ushort.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/cls_5byte.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_7byte.c, testsuite/libffi.call/cls_align_sint32.c, testsuite/libffi.special/unwindtest_ffi_call.cc, testsuite/libffi.special/unwindtest.cc: Enable for ARM. 2007-07-05 H.J. Lu * aclocal.m4: Regenerated. 2007-06-02 Paolo Bonzini * configure: Regenerate. 2007-05-23 Steve Ellcey * Makefile.in: Regenerate. * configure: Regenerate. * aclocal.m4: Regenerate. * include/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2007-05-10 Roman Zippel * src/m68k/ffi.c (ffi_prep_incoming_args_SYSV, ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support. * src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise. * src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise. (FFI_CLOSURES): Enable closure support. 2007-05-10 Roman Zippel * configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test. * configure: Regenerate. * fficonfig.h.in: Regenerate. * src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC, CFI_OFFSET,CFI_DEF_CFA): New macros. (ffi_call_SYSV): Add callframe annotation. 2007-05-10 Roman Zippel * src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix numerous test suite failures. * src/m68k/sysv.S (ffi_call_SYSV): Likewise. 2007-04-11 Paolo Bonzini * Makefile.am (EXTRA_DIST): Bring up to date. * Makefile.in: Regenerate. * src/frv/eabi.S: Remove RCS keyword. 2007-04-06 Richard Henderson * configure.ac: Tidy target case. (HAVE_LONG_DOUBLE): Allow the target to override. * configure: Regenerate. * include/ffi.h.in: Don't define ffi_type_foo if LIBFFI_HIDE_BASIC_TYPES is defined. (ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define to ffi_type_double. * types.c (LIBFFI_HIDE_BASIC_TYPES): Define. (FFI_TYPEDEF, ffi_type_void): Mark the data const. (ffi_type_longdouble): Special case for Alpha. Don't define if long double == double. * src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value. (ffi_prep_cif_machdep): Handle it as the 128-bit type. (ffi_call, ffi_closure_osf_inner): Likewise. (ffi_closure_osf_inner): Likewise. Mark hidden. (ffi_call_osf, ffi_closure_osf): Mark hidden. * src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition. * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden. (load_table): Handle 128-bit long double. * testsuite/libffi.call/float4.c: Add -mieee for alpha. 2007-04-06 Tom Tromey PR libffi/31491: * README: Fixed bug in example. 2007-04-03 Jakub Jelinek * src/closures.c: Include sys/statfs.h. (_GNU_SOURCE): Define on Linux. (FFI_MMAP_EXEC_SELINUX): Define. (selinux_enabled): New variable. (selinux_enabled_check): New function. (is_selinux_enabled): Define. (dlmmap): Use it. 2007-03-24 Uros Bizjak * testsuite/libffi.call/return_fl2.c (return_fl): Mark as static. Use 'volatile float sum' to create sum of floats to avoid false negative due to excess precision on ix86 targets. (main): Ditto. 2007-03-08 Alexandre Oliva * src/powerpc/ffi.c (flush_icache): Fix left-over from previous patch. (ffi_prep_closure_loc): Remove unneeded casts. Add needed ones. 2007-03-07 Alexandre Oliva * include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New. (ffi_prep_closure_loc): New. (ffi_prep_raw_closure_loc): New. (ffi_prep_java_raw_closure_loc): New. * src/closures.c: New file. * src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment): Replace sflags with exec_offset. [FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset, sub_segment_exec_offset): New macros. (get_segment_flags, set_segment_flags, check_segment_merge): New macros. (is_mmapped_segment, is_extern_segment): Use get_segment_flags. (add_segment, sys_alloc, create_mspace, create_mspace_with_base, destroy_mspace): Use new macros. (sys_alloc): Silence warning. * Makefile.am (libffi_la_SOURCES): Add src/closures.c. * Makefile.in: Rebuilt. * src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in terms of ffi_prep_closure_loc. * src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted from... (ffi_prep_raw_closure): ... this. Re-implement in terms of the renamed version. * src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and adjusted from... (ffi_prep_java_raw_closure): ... this. Re-implement in terms of the renamed version. * src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from (ffi_prep_closure): ... this. * src/pa/ffi.c: Likewise. * src/cris/ffi.c: Likewise. Adjust. * src/frv/ffi.c: Likewise. * src/ia64/ffi.c: Likewise. * src/mips/ffi.c: Likewise. * src/powerpc/ffi_darwin.c: Likewise. * src/s390/ffi.c: Likewise. * src/sh/ffi.c: Likewise. * src/sh64/ffi.c: Likewise. * src/sparc/ffi.c: Likewise. * src/x86/ffi64.c: Likewise. * src/x86/ffi.c: Likewise. (FFI_INIT_TRAMPOLINE): Adjust. (ffi_prep_raw_closure_loc): Renamed and adjusted from... (ffi_prep_raw_closure): ... this. * src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from (ffi_prep_closure): ... this. (flush_icache): Adjust. 2007-03-07 Alexandre Oliva * src/dlmalloc.c: New file, imported version 2.8.3 of Doug Lea's malloc. 2007-03-01 Brooks Moses * Makefile.am: Add dummy install-pdf target. * Makefile.in: Regenerate 2007-02-13 Andreas Krebbel * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep, ffi_closure_helper_SYSV): Add long double handling. 2007-02-02 Jakub Jelinek * src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2 immediately after bctrl instruction. 2007-01-18 Alexandre Oliva * Makefile.am (all-recursive, install-recursive, mostlyclean-recursive, clean-recursive, distclean-recursive, maintainer-clean-recursive): Add missing targets. * Makefile.in: Rebuilt. 2006-12-14 Andreas Tobler * configure.ac: Add TARGET for x86_64-*-darwin*. * Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources for X86_DARWIN. * src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*. * src/x86/darwin64.S: New file for x86_64-*-darwin* support. * configure: Regenerate. * Makefile.in: Regenerate. * include/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. * testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for ffi_call only. 2006-12-13 Andreas Tobler * aclocal.m4: Regenerate with aclocal -I .. as written in the Makefile.am. 2006-10-31 Geoffrey Keating * src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New. (ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for Darwin. * testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL. * testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL. 2006-10-10 Paolo Bonzini Sandro Tolaini * configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and conditional. * configure: Regenerated. * Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case. (EXTRA_DIST): Add src/x86/darwin.S. * Makefile.in: Regenerated. * include/Makefile.in: Regenerated. * testsuite/Makefile.in: Regenerated. * src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like X86_WIN32, and additionally align stack to 16 bytes. * src/x86/darwin.S: New, based on sysv.S. * src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs. 2006-09-12 David Daney PR libffi/23935 * include/Makefile.am: Install both ffi.h and ffitarget.h in $(libdir)/gcc/$(target_alias)/$(gcc_version)/include. * aclocal.m4: Regenerated for automake 1.9.6. * Makefile.in: Regenerated. * include/Makefile.in: Regenerated. * testsuite/Makefile.in: Regenerated. 2006-08-17 Andreas Tobler * include/ffi_common.h (struct): Revert accidental commit. 2006-08-15 Andreas Tobler * include/ffi_common.h: Remove lint directives. * include/ffi.h.in: Likewise. 2006-07-25 Torsten Schoenfeld * include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly for 32-bit architectures. * testsuite/libffi.call/return_ul.c: New test case. 2006-07-19 David Daney * testsuite/libffi.call/closure_fn6.c: Remove xfail for mips, xfail remains for mips64. 2006-05-23 Carlos O'Donell * Makefile.am: Add install-html target. Add install-html to .PHONY * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * include/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2006-05-18 John David Anglin * pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from stack slot. 2006-04-22 Andreas Tobler * README: Remove notice about 'Crazy Comments'. * src/debug.c: Remove lint directives. Cleanup white spaces. * src/java_raw_api.c: Likewise. * src/prep_cif.c: Likewise. * src/raw_api.c: Likewise. * src/ffitest.c: Delete. No longer needed, all test cases migrated to the testsuite. * src/arm/ffi.c: Remove lint directives. * src/m32r/ffi.c: Likewise. * src/pa/ffi.c: Likewise. * src/powerpc/ffi.c: Likewise. * src/powerpc/ffi_darwin.c: Likewise. * src/sh/ffi.c: Likewise. * src/sh64/ffi.c: Likewise. * src/x86/ffi.c: Likewise. * testsuite/libffi.call/float2.c: Likewise. * testsuite/libffi.call/promotion.c: Likewise. * testsuite/libffi.call/struct1.c: Likewise. 2006-04-13 Andreas Tobler * src/pa/hpux32.S: Correct unwind offset calculation for ffi_closure_pa32. * src/pa/linux.S: Likewise. 2006-04-12 James E Wilson PR libgcj/26483 * src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros. (hfa_type_load): Call stf_spill. (hfa_type_store): Call ldf_fill. (ffi_call): Adjust calls to above routines. Add local temps for macro result. 2006-04-10 Matthias Klose * testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib directory names containing underscores. 2006-04-07 James E Wilson * testsuite/libffi.call/float4.c: New testcase. 2006-04-05 John David Anglin Andreas Tobler * Makefile.am: Add PA_HPUX port. * Makefile.in: Regenerate. * include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. * configure.ac: Add PA_HPUX rules. * configure: Regenerate. * src/pa/ffitarget.h: Rename linux target to PA_LINUX. Add PA_HPUX and PA64_HPUX. Rename FFI_LINUX ABI to FFI_PA32 ABI. (FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets. (FFI_TYPE_SMALL_STRUCT2): Define. (FFI_TYPE_SMALL_STRUCT4): Likewise. (FFI_TYPE_SMALL_STRUCT8): Likewise. (FFI_TYPE_SMALL_STRUCT3): Redefine. (FFI_TYPE_SMALL_STRUCT5): Likewise. (FFI_TYPE_SMALL_STRUCT6): Likewise. (FFI_TYPE_SMALL_STRUCT7): Likewise. * src/pa/ffi.c (ROUND_DOWN): Delete. (fldw, fstw, fldd, fstd): Use '__asm__'. (ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. (ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment. Simplify incrementing of stack slot variable. Change type of local 'n' to unsigned int. (ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long double on PA_HPUX. (ffi_prep_cif_machdep): Likewise. (ffi_call): Likewise. (ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change return type to ffi_status. Simplify incrementing of stack slot variable. Only copy floating point argument registers when PA_LINUX is true. Reformat debug statement. Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8. (ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to declaration. (ffi_prep_closure): Make linux trampoline conditional on PA_LINUX. Add nops to cache flush. Add trampoline for PA_HPUX. * src/pa/hpux32.S: New file. * src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename ffi_prep_args_LINUX to ffi_prep_args_pa32. Localize labels. Add support for 2, 4 and 8-byte small structs. Handle unaligned destinations in 3, 5, 6 and 7-byte small structs. Order argument type checks so that common argument types appear first. (ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename ffi_closure_inner_LINUX to ffi_closure_inner_pa32. 2006-03-24 Alan Modra * src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX. Default for 32-bit using IBM extended double format. Fix FFI_LAST_ABI. * src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of FFI_TYPE_LONGDOUBLE. (ffi_prep_args64): Assert using IBM extended double. (ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type. Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. (ffi_call): Handle FFI_LINUX. (ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs gpr3 return pointer as for struct return. Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args. Don't increment "nf" unnecessarily. * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2 for FFI_TYPE_LONGDOUBLE. Move epilogue insns into case table. Don't use r6 as pointer to results, instead use sp offset. Don't make a special call to load lr with case table address, instead use offset from previous call. * src/powerpc/sysv.S (ffi_call_SYSV): Save long double return. * src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double return. 2006-03-15 Kaz Kojima * src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments passed with FP registers correctly. (ffi_closure_helper_SYSV): Likewise. * src/sh64/sysv.S: Likewise. 2006-03-01 Andreas Tobler * testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif, args and userdata unused. (closure_test_fn1): Mark cif and userdata unused. (main): Remove unused res. 2006-02-28 Andreas Tobler * testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for -O2, -O3, -Os and the warning flags -W -Wall. * testsuite/libffi.special/special.exp: Likewise. * testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark unused parameter unused for gcc or else do nothing. * testsuite/libffi.special/ffitestcxx.h: Likewise. * testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif and userdata unused. * testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise. * testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise. * testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise. * testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise. * testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise. * testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise. * testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise. * testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise. * testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise. * testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise. * testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise. * testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise. * testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise. * testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise. * testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise. * testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise. * testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise. * testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise. * testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise. * testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise. * testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise. * testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise. * testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise. * testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast void* to avoid compiler warning. (main): Likewise. (cls_struct_align_gn): Mark cif and userdata unused. * testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn): Likewise. * testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise. * testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise. * testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif and data unused. (main): Cast res_call to silence gcc. * testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and userdata unused. (cls_ret_schar_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and userdata unused. (cls_ret_sint_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and userdata unused. (cls_ret_sshort_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn): Mark cif and userdata unused. (cls_ret_uchar_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and userdata unused. (cls_ret_uint_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif and userdata unused. * testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and userdata unused. (cls_ret_ushort_fn): Cast printf parameter to silence gcc. * testsuite/libffi.call/float.c (floating): Remove unused parameter e. * testsuite/libffi.call/float1.c (main): Remove unused variable i. Cleanup white spaces. * testsuite/libffi.call/negint.c (checking): Remove unused variable i. * testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn): Likewise. * testsuite/libffi.call/nested_struct10.c (B_gn): Likewise. * testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf formatters to silence gcc. (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct4.c: Mention related PR. (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct6.c: Mention related PR. (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata unused. * testsuite/libffi.call/nested_struct8.c (B_gn): Likewise. * testsuite/libffi.call/nested_struct9.c (B_gn): Likewise. * testsuite/libffi.call/problem1.c (stub): Likewise. * testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence gcc. * testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned in the last commit for this test case in the test case itself. * testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as unused. * testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise. * testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise. * testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise. * testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise. * testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise. * testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise. 2006-02-22 Kaz Kojima * src/sh/sysv.S: Fix register numbers in the FDE for ffi_closure_SYSV. 2006-02-20 Andreas Tobler * testsuite/libffi.call/return_fl2.c (return_fl): Remove static declaration to avoid a false negative on ix86. See PR323. 2006-02-18 Kaz Kojima * src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable and cast integer to void * if needed. Update the pointer to the FP register saved area correctly. 2006-02-17 Andreas Tobler * testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630 is fixed. * testsuite/libffi.call/nested_struct4.c: Likewise. 2006-02-16 Andreas Tobler * testsuite/libffi.call/return_dbl.c: New test case. * testsuite/libffi.call/return_dbl1.c: Likewise. * testsuite/libffi.call/return_dbl2.c: Likewise. * testsuite/libffi.call/return_fl.c: Likewise. * testsuite/libffi.call/return_fl1.c: Likewise. * testsuite/libffi.call/return_fl2.c: Likewise. * testsuite/libffi.call/return_fl3.c: Likewise. * testsuite/libffi.call/closure_fn6.c: Likewise. * testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong definition. * testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition here to be used by other test cases too. * testsuite/libffi.call/nested_struct10.c: New test case. * testsuite/libffi.call/nested_struct9.c: Likewise. * testsuite/libffi.call/nested_struct8.c: Likewise. * testsuite/libffi.call/nested_struct7.c: Likewise. * testsuite/libffi.call/nested_struct6.c: Likewise. * testsuite/libffi.call/nested_struct5.c: Likewise. * testsuite/libffi.call/nested_struct4.c: Likewise. 2006-01-21 Andreas Tobler * configure.ac: Enable libffi for sparc64-*-freebsd*. * configure: Rebuilt. 2006-01-18 Jakub Jelinek * src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3, instead do the shifting inline. * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5 shift count unconditionally. Simplify load sequences for 1, 2, 3, 4 and 8 byte structs, for the remaining struct sizes don't call __lshrdi3, instead do the shifting inline. 2005-12-07 Thiemo Seufer * src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add missing parentheses. * src/mips/o32.S (ffi_call_O32): Code formatting. Define and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations. (ffi_closure_O32): Likewise, but with newly defined A3_OFF2, A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2, V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2, FA_0_0_OFF2. * src/mips/ffi.c (ffi_prep_args): Code formatting. Fix endianness bugs. (ffi_prep_closure): Improve trampoline instruction scheduling. (ffi_closure_mips_inner_O32): Fix endianness bugs. 2005-12-03 Alan Modra * src/powerpc/ffi.c: Formatting. (ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions. (ffi_prep_args64): Likewise. 2005-09-30 Geoffrey Keating * testsuite/lib/libffi-dg.exp (libffi_target_compile): For darwin, use -shared-libgcc not -lgcc_s, and explain why. 2005-09-26 Tom Tromey * testsuite/libffi.call/float1.c (value_type): New typedef. (CANARY): New define. (main): Check for result buffer overflow. * src/powerpc/linux64.S: Handle linux64 long double returns. * src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant. (ffi_prep_cif_machdep): Handle linux64 long double returns. 2005-08-25 Alan Modra PR target/23404 * src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack homed fp args. (ffi_status ffi_prep_cif_machdep): Correct stack sizing for same. 2005-08-11 Jakub Jelinek * configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test. (AH_BOTTOM): Add FFI_HIDDEN definition. * configure: Rebuilt. * fficonfig.h.in: Rebuilt. * src/powerpc/ffi.c (hidden): Remove. (ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64, ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64, .ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden. * src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove, add FFI_HIDDEN to its prototype. (ffi_closure_SYSV_inner): New. * src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. * src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New. 2005-08-10 Alfred M. Szmidt PR libffi/21819: * configure: Rebuilt. * configure.ac: Handle i*86-*-gnu*. 2005-08-09 Jakub Jelinek * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use DW_CFA_offset_extended_sf rather than DW_CFA_GNU_negative_offset_extended. * src/powerpc/sysv.S (ffi_call_SYSV): Likewise. 2005-07-22 SUGIOKA Toshinobu * src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly on sh3. (ffi_closure_SYSV): Change the stack layout for sh3 struct argument. * src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is partially on register. (ffi_closure_helper_SYSV): Likewise. (ffi_prep_cif_machdep): Don't set too many cif->flags. 2005-07-20 Kaz Kojima * src/sh/ffi.c (ffi_call): Handle small structures correctly. Remove empty line. * src/sh64/ffi.c (simple_type): Remove. (return_type): Handle small structures correctly. (ffi_prep_args): Likewise. (ffi_call): Likewise. (ffi_closure_helper_SYSV): Likewise. * src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return. Emit position independent code if PIC and remove wrong datalabel prefixes from EH data. 2005-07-19 Andreas Tobler * Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD. * Makefile.in: Regenerate. * include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. * configure.ac: Add POWERPC_FREEBSD rules. * configure: Regenerate. * src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules. (FFI_SYSV_TYPE_SMALL_STRUCT): Define. * src/powerpc/ffi.c: Add flags to handle small structure returns in ffi_call_SYSV. (ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI. Aka FFI_SYSV. (ffi_closure_helper_SYSV): Likewise. * src/powerpc/ppc_closure.S: Add return types for small structures. * src/powerpc/sysv.S: Add bits to handle small structures for final SYSV 4 ABI. 2005-07-10 Andreas Tobler * testsuite/libffi.call/cls_5_1_byte.c: New test file. * testsuite/libffi.call/cls_6_1_byte.c: Likewise. * testsuite/libffi.call/cls_7_1_byte.c: Likewise. 2005-07-05 Randolph Chung * src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. Break out handling for 5-7 byte structures. Kill compilation warnings. (ffi_closure_inner_LINUX): Print return values as hex in debug message. Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3. Properly handle 5-7 byte structure returns. * src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1) (FFI_TYPE_SMALL_STRUCT2): Remove. (FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5) (FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define. * src/pa/linux.S: Mark source file as using PA1.1 assembly. (checksmst1, checksmst2): Remove. (checksmst3): Optimize handling of 3-byte struct returns. (checksmst567): Properly handle 5-7 byte struct returns. 2005-06-15 Rainer Orth PR libgcj/21943 * src/mips/n32.S: Enforce PIC code. * src/mips/o32.S: Likewise. 2005-06-15 Rainer Orth * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64. * configure: Regenerate. 2005-06-01 Alan Modra * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET to call ffi_closure_helper_SYSV. Append @local instead. * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV. 2005-05-17 Kelley Cook * configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS. Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF. * Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config. * aclocal.m4, configure, fficonfig.h.in, Makefile.in, include/Makefile.in, testsuite/Makefile.in: Regenerate. 2005-05-09 Mike Stump * configure: Regenerate. 2005-05-08 Richard Henderson PR libffi/21285 * src/alpha/osf.S: Update unwind into to match code. 2005-05-04 Andreas Degert Richard Henderson * src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in bit 11 of flags. (ffi_call): Mask return type field. Pass ssecount to ffi_call_unix64. (ffi_prep_closure): Set carry bit if sse-used flag set. * src/x86/unix64.S (ffi_call_unix64): Add ssecount argument. Only load sse registers if ssecount non-zero. (ffi_closure_unix64): Only save sse registers if carry set on entry. 2005-04-29 Ralf Corsepius * configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*, powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*. * configure: Regenerate. 2005-04-20 Hans-Peter Nilsson * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use, have Tcl8.3-compatible intermediate variable. 2005-04-18 Simon Posnjak Hans-Peter Nilsson * Makefile.am: Add CRIS support. * configure.ac: Likewise. * Makefile.in, configure, testsuite/Makefile.in, include/Makefile.in: Regenerate. * src/cris: New directory. * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files. * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__. * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with \r?\n in output tests. 2005-04-12 Mike Stump * configure: Regenerate. 2005-03-30 Hans Boehm * src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI. 2005-03-30 Steve Ellcey * src/ia64/ffitarget.h (ffi_arg) ADD DI attribute. (ffi_sarg) Ditto. * src/ia64/unix.S (ffi_closure_unix): Extend gp to 64 bits in ILP32 mode. Load 64 bits even for short data. 2005-03-23 Mike Stump * src/powerpc/darwin.S: Update for -m64 multilib. * src/powerpc/darwin_closure.S: Likewise. 2005-03-21 Zack Weinberg * configure.ac: Do not invoke TL_AC_GCC_VERSION. Do not set tool_include_dir. * aclocal.m4, configure, Makefile.in, testsuite/Makefile.in: Regenerate. * include/Makefile.am: Set gcc_version and toollibffidir. * include/Makefile.in: Regenerate. 2005-02-22 Andrew Haley * src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to odd-numbered register pairs for 64-bit integer types. 2005-02-23 Andreas Tobler PR libffi/20104 * testsuite/libffi.call/return_ll1.c: New test case. 2005-02-11 Janis Johnson * testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options. * testsuite/libffi.call/float.c: Ditto. * testsuite/libffi.call/float2.c: Ditto. * testsuite/libffi.call/float3.c: Ditto. 2005-02-08 Andreas Tobler * src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv. 2005-01-12 Eric Botcazou * testsuite/libffi.special/special.exp (cxx_options): Add -shared-libgcc. 2004-12-31 Richard Henderson * src/types.c (FFI_AGGREGATE_TYPEDEF): Remove. (FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF. Replace size and offset parameters with a type parameter; deduce size and structure alignment. Update all users. 2004-12-31 Richard Henderson * src/types.c (FFI_TYPE_POINTER): Define with sizeof. (FFI_TYPE_LONGDOUBLE): Fix for ia64. * src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move into ffi_prep_closure. * src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite from scratch. 2004-12-27 Richard Henderson * src/x86/unix64.S: Fix typo in unwind info. 2004-12-25 Richard Henderson * src/x86/ffi64.c (struct register_args): Rename from stackLayout. (enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS. (merge_classes): Check for it. (SSE_CLASS_P): New. (classify_argument): Pass byte_offset by value; perform all updates inside struct case. (examine_argument): Add classes argument; handle X86_64_COMPLEX_X87_CLASS. (ffi_prep_args): Merge into ... (ffi_call): ... here. Share stack frame with ffi_call_unix64. (ffi_prep_cif_machdep): Setup cif->flags for proper structure return. (ffi_fill_return_value): Remove. (ffi_prep_closure): Remove dead assert. (ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner. Rewrite to use struct register_args instead of va_list. Create flags for handling structure returns. * src/x86/unix64.S: Remove dead strings. (ffi_call_unix64): Rename from ffi_call_UNIX64. Rewrite to share stack frame with ffi_call. Handle structure returns properly. (float2sse, floatfloat2sse, double2sse): Remove. (sse2float, sse2double, sse2floatfloat): Remove. (ffi_closure_unix64): Rename from ffi_closure_UNIX64. Rewrite to handle structure returns properly. 2004-12-08 David Edelsohn * Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and PICFLAG. * Makefile.in: Regenerated. 2004-12-02 Richard Sandiford * configure.ac: Use TL_AC_GCC_VERSION to set gcc_version. * configure, aclocal.m4, Makefile.in: Regenerate. * include/Makefile.in, testsuite/Makefile.in: Regenerate. 2004-11-29 Kelley Cook * configure: Regenerate for libtool change. 2004-11-25 Kelley Cook * configure: Regenerate for libtool reversion. 2004-11-24 Kelley Cook * configure: Regenerate for libtool change. 2004-11-23 John David Anglin * testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp. 2004-11-23 Richard Sandiford * src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead of jal. Use an absolute encoding for the frame information. 2004-11-23 Kelley Cook * Makefile.am: Remove no-dependencies. Add ACLOCAL_AMFLAGS. * acinclude.m4: Delete logic for sincludes. * aclocal.m4, Makefile.in, configure: Regenerate. * include/Makefile: Likewise. * testsuite/Makefile: Likewise. 2004-11-22 Eric Botcazou * src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers on a 8-byte boundary. * src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments. 2004-10-27 Richard Earnshaw * src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return long long values. Round stack allocation to a multiple of 8 bytes for ATPCS compatibility. * src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register names. Handle returning long long types. Add Thumb and interworking support. Improve soft-float code. 2004-10-27 Richard Earnshaw * testsuite/lib/libffi-db.exp (load_gcc_lib): New function. (libffi_exit): New function. (libffi_init): Build the testglue wrapper if needed. 2004-10-25 Eric Botcazou PR other/18138 * testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc. 2004-10-25 Kazuhiro Inaoka * src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0. 2004-10-20 Kaz Kojima * src/sh/sysv.S (ffi_call_SYSV): Don't align for double data. * testsuite/libffi.call/float3.c: New test case. 2004-10-18 Kaz Kojima * src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for the function returning a structure pointed with R2. * src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to the structure return value if T bit set. Emit position independent code and EH data if PIC. 2004-10-13 Kazuhiro Inaoka * Makefile.am: Add m32r support. * configure.ac: Likewise. * Makefile.in: Regenerate. * confiugre: Regenerate. * src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF (uint64, sint64, double, longdouble) * src/m32r: New directory. * src/m32r/ffi.c: New file. * src/m32r/sysv.S: Likewise. * src/m32r/ffitarget.h: Likewise. 2004-10-02 Kaz Kojima * testsuite/libffi.call/negint.c: New test case. 2004-09-14 H.J. Lu PR libgcj/17465 * testsuite/lib/libffi-dg.exp: Don't use global ld_library_path. Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH, LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and DYLD_LIBRARY_PATH. 2004-09-05 Andreas Tobler * testsuite/libffi.call/many_win32.c: Remove whitespaces. * testsuite/libffi.call/promotion.c: Likewise. * testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup whitespaces. * testsuite/libffi.call/return_sc.c: Likewise. * testsuite/libffi.call/return_uc.c: Likewise. 2004-09-05 Andreas Tobler * src/powerpc/darwin.S: Fix comments and identation. * src/powerpc/darwin_closure.S: Likewise. 2004-09-02 Andreas Tobler * src/powerpc/ffi_darwin.c: Add flag for longdouble return values. (ffi_prep_args): Handle longdouble arguments. (ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for longdouble. (ffi_closure_helper_DARWIN): Add closure handling for longdouble. * src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble values. * src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise. * src/types.c: Defined longdouble size and alignment for darwin. 2004-09-02 Andreas Tobler * src/powerpc/aix.S: Remove whitespaces. * src/powerpc/aix_closure.S: Likewise. * src/powerpc/asm.h: Likewise. * src/powerpc/ffi.c: Likewise. * src/powerpc/ffitarget.h: Likewise. * src/powerpc/linux64.S: Likewise. * src/powerpc/linux64_closure.S: Likewise. * src/powerpc/ppc_closure.S: Likewise. * src/powerpc/sysv.S: Likewise. 2004-08-30 Anthony Green * Makefile.am: Add frv support. * Makefile.in, testsuite/Makefile.in: Rebuilt. * configure.ac: Read configure.host. * configure.in: Read configure.host. * configure.host: New file. frv-elf needs libgloss. * include/ffi.h.in: Force ffi_closure to have a nice big (8) alignment. This is needed to frv and shouldn't harm the others. * include/ffi_common.h (ALIGN_DOWN): New macro. * src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files. 2004-08-24 David Daney * testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*. * testsuite/libffi.call/closure_fn1.c: Likewise. * testsuite/libffi.call/closure_fn2.c Likewise. * testsuite/libffi.call/closure_fn3.c: Likewise. * testsuite/libffi.call/closure_fn4.c: Likewise. * testsuite/libffi.call/closure_fn5.c: Likewise. * testsuite/libffi.call/cls_18byte.c: Likewise. * testsuite/libffi.call/cls_19byte.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_20byte1.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_64byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_9byte1.c: Likewise. * testsuite/libffi.call/cls_9byte2.c: Likewise. * testsuite/libffi.call/cls_align_double.c: Likewise. * testsuite/libffi.call/cls_align_float.c: Likewise. * testsuite/libffi.call/cls_align_longdouble.c: Likewise. * testsuite/libffi.call/cls_align_pointer.c: Likewise. * testsuite/libffi.call/cls_align_sint16.c: Likewise. * testsuite/libffi.call/cls_align_sint32.c: Likewise. * testsuite/libffi.call/cls_align_sint64.c: Likewise. * testsuite/libffi.call/cls_align_uint16.c: Likewise. * testsuite/libffi.call/cls_align_uint32.c: Likewise. * testsuite/libffi.call/cls_align_uint64.c: Likewise. * testsuite/libffi.call/cls_double.c: Likewise. * testsuite/libffi.call/cls_float.c: Likewise. * testsuite/libffi.call/cls_multi_schar.c: Likewise. * testsuite/libffi.call/cls_multi_sshort.c: Likewise. * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. * testsuite/libffi.call/cls_multi_uchar.c: Likewise. * testsuite/libffi.call/cls_multi_ushort.c: Likewise. * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. * testsuite/libffi.call/cls_schar.c: Likewise. * testsuite/libffi.call/cls_sint.c: Likewise. * testsuite/libffi.call/cls_sshort.c: Likewise. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/nested_struct.c: Likewise. * testsuite/libffi.call/nested_struct1.c: Likewise. * testsuite/libffi.call/nested_struct2.c: Likewise. * testsuite/libffi.call/nested_struct3.c: Likewise. * testsuite/libffi.call/problem1.c: Likewise. * testsuite/libffi.special/unwindtest.cc: Likewise. * testsuite/libffi.call/cls_12byte.c: Likewise and set return value to zero. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. 2004-08-23 David Daney PR libgcj/13141 * src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI. * src/mips/ffi.c (ffi_prep_args): Fix alignment calculation. (ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point parameters and return types. (ffi_call): Handle FFI_O32_SOFT_FLOAT ABI. (ffi_prep_closure): Ditto. (ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix alignment calculations. * src/mips/o32.S (ffi_closure_O32): Don't use floating point instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant. 2004-08-14 Casey Marshall * src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to contain `FFI_TYPE_UINT64' as return type for any 64-bit integer (O32 ABI only). (ffi_prep_closure): new function. (ffi_closure_mips_inner_O32): new function. * src/mips/ffitarget.h: Define `FFI_CLOSURES' and `FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32. * src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return 64 bit integers correctly. (ffi_closure_O32): new function. Added DWARF-2 unwind info for both functions. 2004-08-10 Andrew Haley * src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments. 2004-08-01 Robert Millan * configure.ac: Detect knetbsd-gnu and kfreebsd-gnu. * configure: Regenerate. 2004-07-30 Maciej W. Rozycki * acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for and mmap() explicitly instead of relying on preset autoconf cache variables. * aclocal.m4: Regenerate. * configure: Regenerate. 2004-07-11 Ulrich Weigand * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. (ffi_check_float_struct): Remove unused prototype. 2004-06-30 Geoffrey Keating * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment character on Darwin, use '\n\t' instead. 2004-06-26 Matthias Klose * libtool-version: Fix typo in revision/age. 2004-06-17 Matthias Klose * libtool-version: New. * Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname. * Makefile.in: Regenerate. 2004-06-15 Paolo Bonzini * Makefile.am: Remove useless multilib rules. * Makefile.in: Regenerate. * aclocal.m4: Regenerate with automake 1.8.5. * configure.ac: Remove useless multilib configury. * configure: Regenerate. 2004-06-15 Paolo Bonzini * .cvsignore: New file. 2004-06-10 Jakub Jelinek * src/ia64/unix.S (ffi_call_unix): Insert group barrier break fp_done. (ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever changed from 8. 2004-06-06 Sean McNeil * configure.ac: Add x86_64-*-freebsd* support. * configure: Regenerate. 2004-04-26 Joe Buck Bug 15093 * configure.ac: Test for existence of mmap and sys/mman.h before checking blacklist. Fix suggested by Jim Wilson. * configure: Regenerate. 2004-04-26 Matt Austern * src/powerpc/darwin.S: Go through a non-lazy pointer for initial FDE location. * src/powerpc/darwin_closure.S: Likewise. 2004-04-24 Andreas Tobler * testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization error. Reported by Thomas Heller . * testsuite/libffi.call/cls_multi_sshort.c (main): Likewise. * testsuite/libffi.call/cls_multi_ushort.c (main): Likewise. 2004-03-20 Matthias Klose * src/pa/linux.S: Fix typo. 2004-03-19 Matthias Klose * Makefile.am: Update. * Makefile.in: Regenerate. * src/pa/ffi.h.in: Remove. * src/pa/ffitarget.h: New file. 2004-02-10 Randolph Chung * Makefile.am: Add PA support. * Makefile.in: Regenerate. * include/Makefile.in: Regenerate. * configure.ac: Add PA target. * configure: Regenerate. * src/pa/ffi.c: New file. * src/pa/ffi.h.in: Add PA support. * src/pa/linux.S: New file. * prep_cif.c: Add PA support. 2004-03-16 Hosaka Yuji * src/types.c: Fix alignment size of X86_WIN32 case int64 and double. * src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type with ecif->cif->flags. (ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type with cif->flags. (ffi_prep_cif_machdep): Add X86_WIN32 struct case. (ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32. * src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b, sc_retstruct2b): Add for 1 or 2-bytes struct case. 2004-03-15 Kelley Cook * configure.in: Rename file to ... * configure.ac: ... this. * fficonfig.h.in: Regenerate. * Makefile.in: Regenerate. * include/Makefile.in: Regenerate. * testsuite/Makefile.in: Regenerate. 2004-03-12 Matt Austern * src/powerpc/darwin.S: Fix EH information so it corresponds to changes in EH format resulting from addition of linkonce support. * src/powerpc/darwin_closure.S: Likewise. 2004-03-11 Andreas Tobler Paolo Bonzini * Makefile.am (AUTOMAKE_OPTIONS): Set them. Remove VPATH. Remove rules for object files. Remove multilib support. (AM_CCASFLAGS): Add. * configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER. (AC_PREREQ): Bump version to 2.59. (AC_INIT): Fill with version info and bug address. (ORIGINAL_LD_FOR_MULTILIBS): Remove. (AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE. De-precious CC so that the right flags are passed down to multilibs. (AC_MSG_ERROR): Replace obsolete macro AC_ERROR. (AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES. (AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS. * configure: Rebuilt. * aclocal.m4: Likewise. * Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise. * fficonfig.h.in: Likewise. 2004-03-11 Andreas Schwab * src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point arguments from fp registers only for the first 8 parameter slots. Don't convert a float parameter when passed in memory. 2004-03-09 Hans-Peter Nilsson * configure: Regenerate for config/accross.m4 correction. 2004-02-25 Matt Kraai * src/powerpc/ffi.c (ffi_prep_args_SYSV): Change ecif->cif->bytes to bytes. (ffi_prep_cif_machdep): Add braces around nested if statement. 2004-02-09 Alan Modra * src/types.c (pointer): POWERPC64 has 8 byte pointers. * src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling. (ffi_closure_helper_LINUX64): Fix typo. * testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128 for powerpc64-*-*. * testsuite/libffi.call/float.c: Likewise. * testsuite/libffi.call/float2.c: Likewise. 2004-02-08 Alan Modra * src/powerpc/ffi.c (ffi_prep_cif_machdep ): Correct long double function return and long double arg handling. (ffi_closure_helper_LINUX64): Formatting. Delete unused "ng" var. Use "end_pfr" instead of "nf". Correct long double handling. Localise "temp". * src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double return value. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate space for long double return value. Adjust stack frame and offsets. Load f2 long double return. 2004-02-07 Alan Modra * src/types.c: Use 16 byte long double for POWERPC64. 2004-01-25 Eric Botcazou * src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array when the structure return address is passed in %o0. (ffi_V9_return_struct): Rename into ffi_v9_layout_struct. (ffi_v9_layout_struct): Align the field following a nested structure on a word boundary. Use memmove instead of memcpy. (ffi_call): Update call to ffi_V9_return_struct. (ffi_prep_closure): Define 'ctx' only for V8. (ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8 and ffi_closure_sparc_inner_v9. (ffi_closure_sparc_inner_v8): Return long doubles by reference. Always skip the structure return address. For structures and long doubles, copy the argument directly. (ffi_closure_sparc_inner_v9): Skip the structure return address only if required. Shift the maximum floating-point slot accordingly. For big structures, copy the argument directly; otherwise, left-justify the argument and call ffi_v9_layout_struct to lay out the structure on the stack. * src/sparc/v8.S: Undef STACKFRAME before defining it. (ffi_closure_v8): Pass the structure return address. Update call to ffi_closure_sparc_inner_v8. Short-circuit FFI_TYPE_INT handling. Skip the 'unimp' insn when returning long doubles and structures. * src/sparc/v9.S: Undef STACKFRAME before defining it. (ffi_closure_v9): Increase the frame size by 2 words. Short-circuit FFI_TYPE_INT handling. Load structures both in integers and floating-point registers on return. * README: Update status of the SPARC port. 2004-01-24 Andreas Tobler * testsuite/libffi.call/pyobjc-tc.c (main): Treat result value as of type ffi_arg. * testsuite/libffi.call/struct3.c (main): Fix CHECK. 2004-01-22 Ulrich Weigand * testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result value as of type ffi_arg, not unsigned int. 2004-01-21 Michael Ritzert * ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead of the LHS. 2004-01-12 Andreas Tobler * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for Solaris. 2004-01-08 Rainer Orth * testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED to void *. 2003-12-10 Richard Henderson * testsuite/libffi.call/cls_align_pointer.c: Cast pointers to size_t instead of int. 2003-12-04 Hosaka Yuji * testsuite/libffi.call/many_win32.c: Include . * testsuite/libffi.call/many_win32.c (main): Replace variable int i with unsigned long ul. * testsuite/libffi.call/cls_align_uint64.c: New test case. * testsuite/libffi.call/cls_align_sint64.c: Likewise. * testsuite/libffi.call/cls_align_uint32.c: Likewise. * testsuite/libffi.call/cls_align_sint32.c: Likewise. * testsuite/libffi.call/cls_align_uint16.c: Likewise. * testsuite/libffi.call/cls_align_sint16.c: Likewise. * testsuite/libffi.call/cls_align_float.c: Likewise. * testsuite/libffi.call/cls_align_double.c: Likewise. * testsuite/libffi.call/cls_align_longdouble.c: Likewise. * testsuite/libffi.call/cls_align_pointer.c: Likewise. 2003-12-02 Hosaka Yuji PR other/13221 * src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Align arguments to 32 bits. 2003-12-01 Andreas Tobler PR other/13221 * testsuite/libffi.call/cls_multi_sshort.c: New test case. * testsuite/libffi.call/cls_multi_sshortchar.c: Likewise. * testsuite/libffi.call/cls_multi_uchar.c: Likewise. * testsuite/libffi.call/cls_multi_schar.c: Likewise. * testsuite/libffi.call/cls_multi_ushortchar.c: Likewise. * testsuite/libffi.call/cls_multi_ushort.c: Likewise. * testsuite/libffi.special/unwindtest.cc: Cosmetics. 2003-11-26 Kaveh R. Ghazi * testsuite/libffi.call/ffitest.h: Include . * testsuite/libffi.special/ffitestcxx.h: Likewise. 2003-11-22 Andreas Tobler * Makefile.in: Rebuilt. * configure: Likewise. * testsuite/libffi.special/unwindtest.cc: Convert the mmap to the right type. 2003-11-21 Andreas Jaeger Andreas Tobler * acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST. * configure.in: Call AC_FUNC_MMAP_BLACKLIST. * Makefile.in: Rebuilt. * aclocal.m4: Likewise. * configure: Likewise. * fficonfig.h.in: Likewise. * testsuite/lib/libffi-dg.exp: Add include dir. * testsuite/libffi.call/ffitest.h: Add MMAP definitions. * testsuite/libffi.special/ffitestcxx.h: Likewise. * testsuite/libffi.call/closure_fn0.c: Use MMAP functionality for ffi_closure if available. * testsuite/libffi.call/closure_fn1.c: Likewise. * testsuite/libffi.call/closure_fn2.c: Likewise. * testsuite/libffi.call/closure_fn3.c: Likewise. * testsuite/libffi.call/closure_fn4.c: Likewise. * testsuite/libffi.call/closure_fn5.c: Likewise. * testsuite/libffi.call/cls_12byte.c: Likewise. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_18byte.c: Likewise. * testsuite/libffi.call/cls_19byte.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_20byte1.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. * testsuite/libffi.call/cls_64byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_9byte1.c: Likewise. * testsuite/libffi.call/cls_9byte2.c: Likewise. * testsuite/libffi.call/cls_double.c: Likewise. * testsuite/libffi.call/cls_float.c: Likewise. * testsuite/libffi.call/cls_schar.c: Likewise. * testsuite/libffi.call/cls_sint.c: Likewise. * testsuite/libffi.call/cls_sshort.c: Likewise. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/nested_struct.c: Likewise. * testsuite/libffi.call/nested_struct1.c: Likewise. * testsuite/libffi.call/nested_struct2.c: Likewise. * testsuite/libffi.call/nested_struct3.c: Likewise. * testsuite/libffi.call/problem1.c: Likewise. * testsuite/libffi.special/unwindtest.cc: Likewise. 2003-11-20 Andreas Tobler * testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional. 2003-11-19 Andreas Tobler * testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin. Add -lgcc_s to additional flags. 2003-11-12 Andreas Tobler * configure.in, include/Makefile.am: PR libgcj/11147, install the ffitarget.h header file in a gcc versioned and target dependent place. * configure: Regenerated. * Makefile.in, include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. 2003-11-09 Andreas Tobler * testsuite/libffi.call/closure_fn0.c: Print result and check with dg-output to make debugging easier. * testsuite/libffi.call/closure_fn1.c: Likewise. * testsuite/libffi.call/closure_fn2.c: Likewise. * testsuite/libffi.call/closure_fn3.c: Likewise. * testsuite/libffi.call/closure_fn4.c: Likewise. * testsuite/libffi.call/closure_fn5.c: Likewise. * testsuite/libffi.call/cls_12byte.c: Likewise. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_18byte.c: Likewise. * testsuite/libffi.call/cls_19byte.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_20byte1.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. * testsuite/libffi.call/cls_64byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_9byte1.c: Likewise. * testsuite/libffi.call/cls_9byte2.c: Likewise. * testsuite/libffi.call/cls_double.c: Likewise. * testsuite/libffi.call/cls_float.c: Likewise. * testsuite/libffi.call/cls_schar.c: Likewise. * testsuite/libffi.call/cls_sint.c: Likewise. * testsuite/libffi.call/cls_sshort.c: Likewise. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/problem1.c: Likewise. * testsuite/libffi.special/unwindtest.cc: Make ffi_closure static. 2003-11-08 Andreas Tobler * testsuite/libffi.call/cls_9byte2.c: New test case. * testsuite/libffi.call/cls_9byte1.c: Likewise. * testsuite/libffi.call/cls_64byte.c: Likewise. * testsuite/libffi.call/cls_20byte1.c: Likewise. * testsuite/libffi.call/cls_19byte.c: Likewise. * testsuite/libffi.call/cls_18byte.c: Likewise. * testsuite/libffi.call/closure_fn4.c: Likewise. * testsuite/libffi.call/closure_fn5.c: Likewise. * testsuite/libffi.call/cls_schar.c: Likewise. * testsuite/libffi.call/cls_sint.c: Likewise. * testsuite/libffi.call/cls_sshort.c: Likewise. * testsuite/libffi.call/nested_struct2.c: Likewise. * testsuite/libffi.call/nested_struct3.c: Likewise. 2003-11-08 Andreas Tobler * testsuite/libffi.call/cls_double.c: Do a check on the result. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/return_sc.c: Cleanup whitespaces. 2003-11-06 Andreas Tobler * src/prep_cif.c (ffi_prep_cif): Move the validity check after the initialization. 2003-10-23 Andreas Tobler * src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace FFI_ASSERT(FALSE) with FFI_ASSERT(0). 2003-10-22 David Daney * src/mips/ffitarget.h: Replace undefined UINT32 and friends with __attribute__((__mode__(__SI__))) and friends. 2003-10-22 Andreas Schwab * src/ia64/ffi.c: Replace FALSE/TRUE with false/true. 2003-10-21 Andreas Tobler * configure.in: AC_LINK_FILES(ffitarget.h). * configure: Regenerate. * Makefile.in: Likewise. * include/Makefile.in: Likewise. * testsuite/Makefile.in: Likewise. * fficonfig.h.in: Likewise. 2003-10-21 Paolo Bonzini Richard Henderson Avoid that ffi.h includes fficonfig.h. * Makefile.am (EXTRA_DIST): Include ffitarget.h files (TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. (TARGET_SRC_MIPS_SGI): Removed. (MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX. (MIPS_SGI): Removed. (CLEANFILES): Removed. (mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New targets. * acconfig.h: Removed. * configure.in: Compute sizeofs only for double and long double. Use them to define and subst HAVE_LONG_DOUBLE. Include comments into AC_DEFINE instead of using acconfig.h. Create include/ffitarget.h instead of include/fficonfig.h. Rename MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree. AC_DEFINE EH_FRAME_FLAGS. * include/Makefile.am (DISTCLEANFILES): New automake macro. (hack_DATA): Add ffitarget.h. * include/ffi.h.in: Remove all system specific definitions. Declare raw API even if it is not installed, why bother? Use limits.h instead of SIZEOF_* to define ffi_type_*. Do not define EH_FRAME_FLAGS, it is in fficonfig.h now. Include ffitarget.h instead of fficonfig.h. Remove ALIGN macro. (UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead. * include/ffi_common.h (bool): Do not define. (ffi_assert): Accept failed assertion. (ffi_type_test): Return void and accept file/line. (FFI_ASSERT): Pass stringized failed assertion. (FFI_ASSERT_AT): New macro. (FFI_ASSERT_VALID_TYPE): New macro. (UINT8, SINT8, UINT16, SINT16, UINT32, SINT32, UINT64, SINT64): Define here with gcc's __attribute__ macro instead of in ffi.h (FLOAT32, ALIGN): Define here instead of in ffi.h * include/ffi-mips.h: Removed. Its content moved to src/mips/ffitarget.h after separating assembly and C sections. * src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c, src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S, src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c: SIZEOF_ARG -> FFI_SIZEOF_ARG. * src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+). * src/debug.c (ffi_assert): Accept stringized failed assertion. (ffi_type_test): Rewritten. * src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call FFI_ASSERT_VALID_TYPE. * src/alpha/ffitarget.h, src/arm/ffitarget.h, src/ia64/ffitarget.h, src/m68k/ffitarget.h, src/mips/ffitarget.h, src/powerpc/ffitarget.h, src/s390/ffitarget.h, src/sh/ffitarget.h, src/sh64/ffitarget.h, src/sparc/ffitarget.h, src/x86/ffitarget.h: New files. * src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S, src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S, src/powerpc/aix.S, src/powerpc/darwin.S, src/powerpc/ffi_darwin.c, src/powerpc/linux64.S, src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S, src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S, src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S, src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S: include fficonfig.h 2003-10-20 Rainer Orth * src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external _MIPS_SIM_NABI32, _MIPS_SIM_ABI32. 2003-10-19 Andreas Tobler * src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again. Used when FFI_DEBUG = 1. 2003-10-14 Alan Modra * src/types.c (double, longdouble): Default POWERPC64 to 8 byte size and align. 2003-10-06 Rainer Orth * include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs, FFI_MIPS_O32 for O32 ABI. 2003-10-01 Andreas Tobler * testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for SPARC64. Cleanup whitespaces. 2003-09-19 Andreas Tobler * testsuite/libffi.call/closure_fn0.c: Xfail mips, arm, strongarm, xscale. Cleanup whitespaces. * testsuite/libffi.call/closure_fn1.c: Likewise. * testsuite/libffi.call/closure_fn2.c: Likewise. * testsuite/libffi.call/closure_fn3.c: Likewise. * testsuite/libffi.call/cls_12byte.c: Likewise. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_double.c: Likewise. * testsuite/libffi.call/cls_float.c: Likewise. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/nested_struct.c: Likewise. * testsuite/libffi.call/nested_struct1.c: Likewise. * testsuite/libffi.call/problem1.c: Likewise. * testsuite/libffi.special/unwindtest.cc: Likewise. * testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces. 2003-09-18 David Edelsohn * src/powerpc/aix.S: Cleanup whitespaces. * src/powerpc/aix_closure.S: Likewise. 2003-09-18 Andreas Tobler * src/powerpc/darwin.S: Cleanup whitespaces, comment formatting. * src/powerpc/darwin_closure.S: Likewise. * src/powerpc/ffi_darwin.c: Likewise. 2003-09-18 Andreas Tobler David Edelsohn * src/types.c (double): Add AIX and Darwin to the right TYPEDEF. * src/powerpc/aix_closure.S: Remove the pointer to the outgoing parameter stack. * src/powerpc/darwin_closure.S: Likewise. * src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures according to the Darwin/AIX ABI. (ffi_prep_cif_machdep): Likewise. (ffi_closure_helper_DARWIN): Likewise. Remove the outgoing parameter stack logic. Simplify the evaluation of the different CASE types. (ffi_prep_clousure): Avoid the casts on lvalues. Change the branch statement in the trampoline code. 2003-09-18 Kaz Kojima * src/sh/ffi.c (ffi_prep_args): Take account into the alignement for the register size. (ffi_closure_helper_SYSV): Handle the structure return value address correctly. (ffi_closure_helper_SYSV): Return the appropriate type when the registers are used for the structure return value. * src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for the 64-bit return value. Update copyright years. 2003-09-17 Rainer Orth * testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in srcdir for ffi_mips.h. 2003-09-12 Alan Modra * src/prep_cif.c (initialize_aggregate): Include tail padding in structure size. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct placement of float result. * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct cast of "resp" for big-endian 64 bit machines. 2003-09-11 Alan Modra * src/types.c (double, longdouble): Merge identical SH and ARM typedefs, and add POWERPC64. * src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for struct split over gpr and rest. (ffi_prep_cif_machdep): Correct intarg_count for structures. * src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets. 2003-09-09 Andreas Tobler * src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct passing correctly. 2003-09-09 Alan Modra * configure: Regenerate. 2003-09-04 Andreas Tobler * Makefile.am: Remove build rules for ffitest. * Makefile.in: Rebuilt. 2003-09-04 Andreas Tobler * src/java_raw_api.c: Include to fix compiler warning about implicit declaration of abort(). 2003-09-04 Andreas Tobler * Makefile.am: Add dejagnu test framework. Fixes PR other/11411. * Makefile.in: Rebuilt. * configure.in: Add dejagnu test framework. * configure: Rebuilt. * testsuite/Makefile.am: New file. * testsuite/Makefile.in: Built * testsuite/lib/libffi-dg.exp: New file. * testsuite/config/default.exp: Likewise. * testsuite/libffi.call/call.exp: Likewise. * testsuite/libffi.call/ffitest.h: Likewise. * testsuite/libffi.call/closure_fn0.c: Likewise. * testsuite/libffi.call/closure_fn1.c: Likewise. * testsuite/libffi.call/closure_fn2.c: Likewise. * testsuite/libffi.call/closure_fn3.c: Likewise. * testsuite/libffi.call/cls_1_1byte.c: Likewise. * testsuite/libffi.call/cls_3_1byte.c: Likewise. * testsuite/libffi.call/cls_4_1byte.c: Likewise. * testsuite/libffi.call/cls_2byte.c: Likewise. * testsuite/libffi.call/cls_3byte1.c: Likewise. * testsuite/libffi.call/cls_3byte2.c: Likewise. * testsuite/libffi.call/cls_4byte.c: Likewise. * testsuite/libffi.call/cls_5byte.c: Likewise. * testsuite/libffi.call/cls_6byte.c: Likewise. * testsuite/libffi.call/cls_7byte.c: Likewise. * testsuite/libffi.call/cls_8byte.c: Likewise. * testsuite/libffi.call/cls_12byte.c: Likewise. * testsuite/libffi.call/cls_16byte.c: Likewise. * testsuite/libffi.call/cls_20byte.c: Likewise. * testsuite/libffi.call/cls_24byte.c: Likewise. * testsuite/libffi.call/cls_double.c: Likewise. * testsuite/libffi.call/cls_float.c: Likewise. * testsuite/libffi.call/cls_uchar.c: Likewise. * testsuite/libffi.call/cls_uint.c: Likewise. * testsuite/libffi.call/cls_ulonglong.c: Likewise. * testsuite/libffi.call/cls_ushort.c: Likewise. * testsuite/libffi.call/float.c: Likewise. * testsuite/libffi.call/float1.c: Likewise. * testsuite/libffi.call/float2.c: Likewise. * testsuite/libffi.call/many.c: Likewise. * testsuite/libffi.call/many_win32.c: Likewise. * testsuite/libffi.call/nested_struct.c: Likewise. * testsuite/libffi.call/nested_struct1.c: Likewise. * testsuite/libffi.call/pyobjc-tc.c: Likewise. * testsuite/libffi.call/problem1.c: Likewise. * testsuite/libffi.call/promotion.c: Likewise. * testsuite/libffi.call/return_ll.c: Likewise. * testsuite/libffi.call/return_sc.c: Likewise. * testsuite/libffi.call/return_uc.c: Likewise. * testsuite/libffi.call/strlen.c: Likewise. * testsuite/libffi.call/strlen_win32.c: Likewise. * testsuite/libffi.call/struct1.c: Likewise. * testsuite/libffi.call/struct2.c: Likewise. * testsuite/libffi.call/struct3.c: Likewise. * testsuite/libffi.call/struct4.c: Likewise. * testsuite/libffi.call/struct5.c: Likewise. * testsuite/libffi.call/struct6.c: Likewise. * testsuite/libffi.call/struct7.c: Likewise. * testsuite/libffi.call/struct8.c: Likewise. * testsuite/libffi.call/struct9.c: Likewise. * testsuite/libffi.special/special.exp: New file. * testsuite/libffi.special/ffitestcxx.h: Likewise. * testsuite/libffi.special/unwindtest.cc: Likewise. 2003-08-13 Kaz Kojima * src/sh/ffi.c (OFS_INT16): Set 0 for little endian case. Update copyright years. 2003-08-02 Alan Modra * src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc structure passing. (ffi_closure_helper_LINUX64): Likewise. * src/powerpc/linux64.S: Remove code writing to parm save area. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return address in lr from ffi_closure_helper_LINUX64 call to calculate table address. Optimize function tail. 2003-07-28 Andreas Tobler * src/sparc/ffi.c: Handle all floating point registers. * src/sparc/v9.S: Likewise. Fixes second part of PR target/11410. 2003-07-11 Gerald Pfeifer * README: Note that libffi is not part of GCC. Update the project URL and status. 2003-06-19 Franz Sirl * src/powerpc/ppc_closure.S: Include ffi.h. 2003-06-13 Rainer Orth * src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives. Use C style comments. 2003-06-13 Kaz Kojima * Makefile.am: Add SHmedia support. Fix a typo of SH support. * Makefile.in: Regenerate. * configure.in (sh64-*-linux*, sh5*-*-linux*): Add target. * configure: Regenerate. * include/ffi.h.in: Add SHmedia support. * src/sh64/ffi.c: New file. * src/sh64/sysv.S: New file. 2003-05-16 Jakub Jelinek * configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section should be read-only. * configure: Rebuilt. * fficonfig.h.in: Rebuilt. * include/ffi.h.in (EH_FRAME_FLAGS): Define. * src/alpha/osf.S: Use EH_FRAME_FLAGS. * src/powerpc/linux64.S: Likewise. * src/powerpc/linux64_closure.S: Likewise. Include ffi.h. * src/powerpc/sysv.S: Use EH_FRAME_FLAGS. Use pcrel encoding if -fpic/-fPIC/-mrelocatable. * src/powerpc/powerpc_closure.S: Likewise. * src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include #write in .eh_frame flags. * src/sparc/v9.S: Likewise. * src/x86/unix64.S: Use EH_FRAME_FLAGS. * src/x86/sysv.S: Likewise. Use pcrel encoding if -fpic/-fPIC. * src/s390/sysv.S: Use EH_FRAME_FLAGS. Include ffi.h. 2003-05-07 Jeff Sturm Fixes PR bootstrap/10656 * configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler support for .register pseudo-op. * src/sparc/v8.S: Use it. * fficonfig.h.in: Rebuilt. * configure: Rebuilt. 2003-04-18 Jakub Jelinek * include/ffi.h.in (POWERPC64): Define if 64-bit. (enum ffi_abi): Add FFI_LINUX64 on POWERPC. Make it the default on POWERPC64. (FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64. * configure.in: Change powerpc-*-linux* into powerpc*-*-linux*. * configure: Rebuilt. * src/powerpc/ffi.c (hidden): Define. (ffi_prep_args_SYSV): Renamed from ffi_prep_args. Cast pointers to unsigned long to shut up warnings. (NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64, ASM_NEEDS_REGISTERS64): New. (ffi_prep_args64): New function. (ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI. (ffi_call): Likewise. (ffi_prep_closure): Likewise. (flush_icache): Surround by #ifndef POWERPC64. (ffi_dblfl): New union type. (ffi_closure_helper_SYSV): Use it to avoid aliasing problems. (ffi_closure_helper_LINUX64): New function. * src/powerpc/ppc_closure.S: Surround whole file by #ifndef __powerpc64__. * src/powerpc/sysv.S: Likewise. (ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV. * src/powerpc/linux64.S: New file. * src/powerpc/linux64_closure.S: New file. * Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and src/powerpc/linux64_closure.S. (TARGET_SRC_POWERPC): Likewise. * src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2, closure_test_fn3): Fix result printing on big-endian 64-bit machines. (main): Print tst2_arg instead of uninitialized tst2_result. * src/ffitest.c (main): Hide what closure pointer really points to from the compiler. 2003-04-16 Richard Earnshaw * configure.in (arm-*-netbsdelf*): Add configuration. (configure): Regenerated. 2003-04-04 Loren J. Rittle * include/Makefile.in: Regenerate. 2003-03-21 Zdenek Dvorak * libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32 bit mode. * libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Receive closure pointer through parameter, read args using __builtin_dwarf_cfa. (FFI_INIT_TRAMPOLINE): Send closure reference through eax. 2003-03-12 Andreas Schwab * configure.in: Avoid trailing /. in toolexeclibdir. * configure: Rebuilt. 2003-03-03 Andreas Tobler * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. 2003-02-06 Andreas Tobler * libffi/src/powerpc/darwin_closure.S: Fix alignement bug, allocate 8 bytes for the result. * libffi/src/powerpc/aix_closure.S: Likewise. * libffi/src/powerpc/ffi_darwin.c: Update stackframe description for aix/darwin_closure.S. 2003-02-06 Jakub Jelinek * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility attribute. 2003-01-31 Christian Cornelssen , Andreas Schwab * configure.in: Adjust command to source config-ml.in to account for changes to the libffi_basedir definition. (libffi_basedir): Remove ${srcdir} from value and include trailing slash if nonempty. * configure: Regenerate. 2003-01-29 Franz Sirl * src/powerpc/ppc_closure.S: Recode to fit shared libs. 2003-01-28 Andrew Haley * include/ffi.h.in: Enable FFI_CLOSURES for x86_64. * src/x86/ffi64.c (ffi_prep_closure): New. (ffi_closure_UNIX64_inner): New. * src/x86/unix64.S (ffi_closure_UNIX64): New. 2003-01-27 Alexandre Oliva * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. Remove USE_LIBDIR conditional. * Makefile.am (toolexecdir, toolexeclibdir): Don't override. * Makefile.in, configure: Rebuilt. 2003-01027 David Edelsohn * Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo. * Makefile.in: Regenerate. 2003-01-22 Andrew Haley * src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to unwind info. 2003-01-21 Andreas Tobler * src/powerpc/darwin.S: Add unwind info. * src/powerpc/darwin_closure.S: Likewise. 2003-01-14 Andrew Haley * src/x86/ffi64.c (ffi_prep_args): Check for void retval. (ffi_prep_cif_machdep): Likewise. * src/x86/unix64.S: Add unwind info. 2003-01-14 Andreas Jaeger * src/ffitest.c (main): Only use ffi_closures if those are supported. 2003-01-13 Andreas Tobler * libffi/src/ffitest.c add closure testcases 2003-01-13 Kevin B. Hendricks * libffi/src/powerpc/ffi.c fix alignment bug for float (4 byte aligned iso 8 byte) 2003-01-09 Geoffrey Keating * src/powerpc/ffi_darwin.c: Remove RCS version string. * src/powerpc/darwin.S: Remove RCS version string. 2003-01-03 Jeff Sturm * include/ffi.h.in: Add closure defines for SPARC, SPARC64. * src/ffitest.c (main): Use static storage for closure. * src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New. * src/sparc/v8.S (ffi_closure_v8): New. * src/sparc/v9.S (ffi_closure_v9): New. 2002-11-10 Ranjit Mathew * include/ffi.h.in: Added FFI_STDCALL ffi_type enumeration for X86_WIN32. * src/x86/win32.S: Added ffi_call_STDCALL function definition. * src/x86/ffi.c (ffi_call/ffi_raw_call): Added switch cases for recognising FFI_STDCALL and calling ffi_call_STDCALL if target is X86_WIN32. * src/ffitest.c (my_stdcall_strlen/stdcall_many): stdcall versions of the "my_strlen" and "many" test functions (for X86_WIN32). Added test cases to test stdcall invocation using these functions. 2002-12-02 Kaz Kojima * src/sh/sysv.S: Add DWARF2 unwind info. 2002-11-27 Ulrich Weigand * src/s390/sysv.S (.eh_frame section): Make section read-only. 2002-11-26 Jim Wilson * src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64. 2002-11-23 H.J. Lu * acinclude.m4: Add dummy AM_PROG_LIBTOOL. Include ../config/accross.m4. * aclocal.m4; Rebuild. * configure: Likewise. 2002-11-15 Ulrich Weigand * src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding. 2002-11-11 DJ Delorie * configure.in: Look for common files in the right place. 2002-10-08 Ulrich Weigand * src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret raw data as _Jv_word values, not ffi_raw. (ffi_java_ptrarray_to_raw): Likewise. (ffi_java_rvalue_to_raw): New function. (ffi_java_raw_call): Call it. (ffi_java_raw_to_rvalue): New function. (ffi_java_translate_args): Call it. * src/ffitest.c (closure_test_fn): Interpret return value as ffi_arg, not int. * src/s390/ffi.c (ffi_prep_cif_machdep): Add missing FFI_TYPE_POINTER case. (ffi_closure_helper_SYSV): Likewise. Also, assume return values extended to word size. 2002-10-02 Andreas Jaeger * src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output. 2002-10-01 Bo Thorsen * include/ffi.h.in: Fix i386 win32 compilation. 2002-09-30 Ulrich Weigand * configure.in: Add s390x-*-linux-* target. * configure: Regenerate. * include/ffi.h.in: Define S390X for s390x targets. (FFI_CLOSURES): Define for s390/s390x. (FFI_TRAMPOLINE_SIZE): Likewise. (FFI_NATIVE_RAW_API): Likewise. * src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390. * src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x. * src/s390/ffi.c: Major rework of existing code. Add support for s390x targets. Add closure support. * src/s390/sysv.S: Likewise. 2002-09-29 Richard Earnshaw * src/arm/sysv.S: Fix typo. 2002-09-28 Richard Earnshaw * src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor has defined __USER_LABEL_PREFIX__, then use it in CNAME. (ffi_call_SYSV): Handle soft-float. 2002-09-27 Bo Thorsen * include/ffi.h.in: Fix multilib x86-64 support. 2002-09-22 Kaveh R. Ghazi * Makefile.am (all-multi): Fix multilib parallel build. 2002-07-19 Kaz Kojima * configure.in (sh[34]*-*-linux*): Add brackets. * configure: Regenerate. 2002-07-18 Kaz Kojima * Makefile.am: Add SH support. * Makefile.in: Regenerate. * configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target. * configure: Regenerate. * include/ffi.h.in: Add SH support. * src/sh/ffi.c: New file. * src/sh/sysv.S: New file. * src/types.c: Add SH support. 2002-07-16 Bo Thorsen * src/x86/ffi64.c: New file that adds x86-64 support. * src/x86/unix64.S: New file that handles argument setup for x86-64. * src/x86/sysv.S: Don't use this on x86-64. * src/x86/ffi.c: Don't use this on x86-64. Remove unused vars. * src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation for x86-64. * src/ffitest.c (struct6): New test that tests a special case in the x86-64 ABI. (struct7): Likewise. (struct8): Likewise. (struct9): Likewise. (closure_test_fn): Silence warning about this when it's not used. (main): Add the new tests. (main): Fix a couple of wrong casts and silence some compiler warnings. * include/ffi.h.in: Add x86-64 ABI definition. * fficonfig.h.in: Regenerate. * Makefile.am: Add x86-64 support. * configure.in: Likewise. * Makefile.in: Regenerate. * configure: Likewise. 2002-06-24 Bo Thorsen * src/types.c: Merge settings for similar architectures. Add x86-64 sizes and alignments. 2002-06-23 Bo Thorsen * src/arm/ffi.c (ffi_prep_args): Remove unused vars. * src/sparc/ffi.c (ffi_prep_args_v8): Likewise. * src/mips/ffi.c (ffi_prep_args): Likewise. * src/m68k/ffi.c (ffi_prep_args): Likewise. 2002-07-18 H.J. Lu (hjl@gnu.org) * Makefile.am (TARGET_SRC_MIPS_LINUX): New. (libffi_la_SOURCES): Support MIPS_LINUX. (libffi_convenience_la_SOURCES): Likewise. * Makefile.in: Regenerated. * configure.in (mips64*-*): Skip. (mips*-*-linux*): New. * configure: Regenerated. * src/mips/ffi.c: Include . 2002-06-06 Ulrich Weigand * src/s390/sysv.S: Save/restore %r6. Add DWARF-2 unwind info. 2002-05-27 Roger Sayle * src/x86/ffi.c (ffi_prep_args): Remove reference to avn. 2002-05-27 Bo Thorsen * src/x86/ffi.c (ffi_prep_args): Remove unused variable and fix formatting. 2002-05-13 Andreas Tobler * src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at beginning of function (for older apple cc). 2002-05-08 Alexandre Oliva * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at script entry, and set LD to it when configuring multilibs. * configure: Rebuilt. 2002-05-05 Jason Thorpe * configure.in (sparc64-*-netbsd*): Add target. (sparc-*-netbsdelf*): Likewise. * configure: Regenerate. 2002-04-28 David S. Miller * configure.in, configure: Fix SPARC test in previous change. 2002-04-29 Gerhard Tonn * Makefile.am: Add Linux for S/390 support. * Makefile.in: Regenerate. * configure.in: Add Linux for S/390 support. * configure: Regenerate. * include/ffi.h.in: Add Linux for S/390 support. * src/s390/ffi.c: New file from libffi CVS tree. * src/s390/sysv.S: New file from libffi CVS tree. 2002-04-28 Jakub Jelinek * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working %r_disp32(). * src/sparc/v8.S: Use it. * src/sparc/v9.S: Likewise. * fficonfig.h.in: Rebuilt. * configure: Rebuilt. 2002-04-08 Hans Boehm * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE correctly. * src/ia64/unix.S: Add unwind information. Fix comments. Save sp in a way that's compatible with unwind info. (ffi_call_unix): Correctly restore sp in all cases. * src/ia64/ffi.c: Add, fix comments. 2002-04-08 Jakub Jelinek * src/sparc/v8.S: Make .eh_frame dependent on target word size. 2002-04-06 Jason Thorpe * configure.in (alpha*-*-netbsd*): Add target. * configure: Regenerate. 2002-04-04 Jeff Sturm * src/sparc/v8.S: Add unwind info. * src/sparc/v9.S: Likewise. 2002-03-30 Krister Walfridsson * configure.in: Enable i*86-*-netbsdelf*. * configure: Rebuilt. 2002-03-29 David Billinghurst PR other/2620 * src/mips/n32.s: Delete * src/mips/o32.s: Delete 2002-03-21 Loren J. Rittle * configure.in: Enable alpha*-*-freebsd*. * configure: Rebuilt. 2002-03-17 Bryce McKinlay * Makefile.am: libfficonvenience -> libffi_convenience. * Makefile.in: Rebuilt. * Makefile.am: Define ffitest_OBJECTS. * Makefile.in: Rebuilt. 2002-03-07 Andreas Tobler David Edelsohn * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. * Makefile.in: Regenerate. * include/ffi.h.in: Add AIX and Darwin closure definitions. * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. (flush_icache, flush_range): New functions. (ffi_closure_helper_DARWIN): New function. * src/powerpc/aix_closure.S: New file. * src/powerpc/darwin_closure.S: New file. 2002-02-24 Jeff Sturm * include/ffi.h.in: Add typedef for ffi_arg. * src/ffitest.c (main): Declare rint with ffi_arg. 2002-02-21 Andreas Tobler * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate number of GPRs for floating-point arguments. 2002-01-31 Anthony Green * configure: Rebuilt. * configure.in: Replace CHECK_SIZEOF and endian tests with cross-compiler friendly macros. * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New macros. 2002-01-18 David Edelsohn * src/powerpc/darwin.S (_ffi_call_AIX): New. * src/powerpc/aix.S (ffi_call_DARWIN): New. 2002-01-17 David Edelsohn * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. (TARGET_SRC_POWERPC_AIX): New. (POWERPC_AIX): New stanza. * Makefile.in: Regenerate. * configure.in: Add AIX case. * configure: Regenerate. * include/ffi.h.in (ffi_abi): Add FFI_AIX. * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame size. Fix "long double" support. (ffi_call): Add FFI_AIX case. * src/powerpc/aix.S: New. 2001-10-09 John Hornkvist Implement Darwin PowerPC ABI. * configure.in: Handle powerpc-*-darwin*. * Makefile.am: Set source files for POWERPC_DARWIN. * configure: Rebuilt. * Makefile.in: Rebuilt. * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for POWERPC_DARWIN. * src/powerpc/darwin.S: New file. * src/powerpc/ffi_darwin.c: New file. 2001-10-07 Joseph S. Myers * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". 2001-07-16 Rainer Orth * src/x86/sysv.S: Avoid gas-only .balign directive. Use C style comments. 2001-07-16 Rainer Orth * src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic. Fixes PR bootstrap/3563. 2001-06-26 Rainer Orth * src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF. 2001-06-25 Rainer Orth * configure.in: Recognize sparc*-sun-* host. * configure: Regenerate. 2001-06-06 Andrew Haley * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. 2001-06-03 Andrew Haley * src/alpha/osf.S: Add unwind info. * src/powerpc/sysv.S: Add unwind info. * src/powerpc/ppc_closure.S: Likewise. 2000-05-31 Jeff Sturm * configure.in: Fix AC_ARG_ENABLE usage. * configure: Rebuilt. 2001-05-06 Bryce McKinlay * configure.in: Remove warning about beta code. * configure: Rebuilt. 2001-04-25 Hans Boehm * src/ia64/unix.S: Restore stack pointer when returning from ffi_closure_UNIX. * src/ia64/ffi.c: Fix typo in comment. 2001-04-18 Jim Wilson * src/ia64/unix.S: Delete unnecessary increment and decrement of loc2 to eliminate RAW DV. 2001-04-12 Bryce McKinlay * Makefile.am: Make a libtool convenience library. * Makefile.in: Rebuilt. 2001-03-29 Bryce McKinlay * configure.in: Use different syntax for subdirectory creation. * configure: Rebuilt. 2001-03-27 Jon Beniston * configure.in: Added X86_WIN32 target (Win32, CygWin, MingW). * configure: Rebuilt. * Makefile.am: Added X86_WIN32 target support. * Makefile.in: Rebuilt. * include/ffi.h.in: Added X86_WIN32 target support. * src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets. * src/types.c: Added X86_WIN32 target support. * src/x86/win32.S: New file. Based on sysv.S, but with EH stuff removed and made to work with CygWin's gas. 2001-03-26 Bryce McKinlay * configure.in: Make target subdirectory in build dir. * Makefile.am: Override suffix based rules to specify correct output subdirectory. * Makefile.in: Rebuilt. * configure: Rebuilt. 2001-03-23 Kevin B Hendricks * src/powerpc/ppc_closure.S: New file. * src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug involving long long and register pairs. (ffi_prep_closure): New function. (flush_icache): Likewise. (ffi_closure_helper_SYSV): Likewise. * include/ffi.h.in (FFI_CLOSURES): Define on PPC. (FFI_TRAMPOLINE_SIZE): Likewise. (FFI_NATIVE_RAW_API): Likewise. * Makefile.in: Rebuilt. * Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S. (TARGET_SRC_POWERPC): Likewise. 2001-03-19 Tom Tromey * Makefile.in: Rebuilt. * Makefile.am (ffitest_LDFLAGS): New macro. 2001-03-02 Nick Clifton * include/ffi.h.in: Remove RCS ident string. * include/ffi_mips.h: Remove RCS ident string. * src/debug.c: Remove RCS ident string. * src/ffitest.c: Remove RCS ident string. * src/prep_cif.c: Remove RCS ident string. * src/types.c: Remove RCS ident string. * src/alpha/ffi.c: Remove RCS ident string. * src/alpha/osf.S: Remove RCS ident string. * src/arm/ffi.c: Remove RCS ident string. * src/arm/sysv.S: Remove RCS ident string. * src/mips/ffi.c: Remove RCS ident string. * src/mips/n32.S: Remove RCS ident string. * src/mips/o32.S: Remove RCS ident string. * src/sparc/ffi.c: Remove RCS ident string. * src/sparc/v8.S: Remove RCS ident string. * src/sparc/v9.S: Remove RCS ident string. * src/x86/ffi.c: Remove RCS ident string. * src/x86/sysv.S: Remove RCS ident string. 2001-02-08 Joseph S. Myers * include/ffi.h.in: Change sourceware.cygnus.com references to gcc.gnu.org. 2000-12-09 Richard Henderson * src/alpha/ffi.c (ffi_call): Simplify struct return test. (ffi_closure_osf_inner): Index rather than increment avalue and arg_types. Give ffi_closure_osf the raw return value type. * src/alpha/osf.S (ffi_closure_osf): Handle return value type promotion. 2000-12-07 Richard Henderson * src/raw_api.c (ffi_translate_args): Fix typo. (ffi_prep_closure): Likewise. * include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and FFI_TRAMPOLINE_SIZE. * src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal cif->bytes for new ffi_call_osf implementation. (ffi_prep_args): Absorb into ... (ffi_call): ... here. Do all stack allocation here and avoid a callback function. (ffi_prep_closure, ffi_closure_osf_inner): New. * src/alpha/osf.S (ffi_call_osf): Reimplement with no callback. (ffi_closure_osf): New. 2000-09-10 Alexandre Oliva * config.guess, config.sub, install-sh: Removed. * ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise. * Makefile.in: Rebuilt. * acinclude.m4: Include libtool macros from the top level. * aclocal.m4, configure: Rebuilt. 2000-08-22 Alexandre Oliva * configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set. * configure: Rebuilt. 2000-05-11 Scott Bambrough * libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to memory correctly. Use conditional instructions, not branches where possible. 2000-05-04 Tom Tromey * configure: Rebuilt. * configure.in: Match `arm*-*-linux-*'. From Chris Dornan . 2000-04-28 Jakub Jelinek * Makefile.am (SUBDIRS): Define. (AM_MAKEFLAGS): Likewise. (Multilib support.): Add section. * Makefile.in: Rebuilt. * ltconfig (extra_compiler_flags, extra_compiler_flags_value): New variables. Set for gcc using -print-multi-lib. Export them to libtool. (sparc64-*-linux-gnu*): Use libsuff 64 for search paths. * ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options for -shared links. (extra_compiler_flags_value, extra_compiler_flags): Check these for extra compiler options which need to be passed down in compiler_flags. 2000-04-16 Anthony Green * configure: Rebuilt. * configure.in: Change i*86-pc-linux* to i*86-*-linux*. 2000-04-14 Jakub Jelinek * include/ffi.h.in (SPARC64): Define for 64bit SPARC builds. Set SPARC FFI_DEFAULT_ABI based on SPARC64 define. * src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args. Replace all void * sizeofs with sizeof(int). Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is different than DOUBLE. Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere). (ffi_prep_args_v9): New function. (ffi_prep_cif_machdep): Handle V9 ABI and long long on V8. (ffi_V9_return_struct): New function. (ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from 32bit code (not yet cross-arch calls). * src/sparc/v8.S: Add struct return delay nop. Handle long long. * src/sparc/v9.S: New file. * src/prep_cif.c (ffi_prep_cif): Return structure pointer is used on sparc64 only for structures larger than 32 bytes. Pass by reference for structures is done for structure arguments larger than 16 bytes. * src/ffitest.c (main): Use 64bit rint on sparc64. Run long long tests on sparc. * src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and sparc64. (FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits on sparc64. * configure.in (sparc-*-linux*): New supported target. (sparc64-*-linux*): Likewise. * configure: Rebuilt. * Makefile.am: Add v9.S to SPARC files. * Makefile.in: Likewise. (LINK): Surround $(CCLD) into double quotes, so that multilib compiles work correctly. 2000-04-04 Alexandre Petit-Bianco * configure: Rebuilt. * configure.in: (i*86-*-solaris*): New libffi target. Patch proposed by Bryce McKinlay. 2000-03-20 Tom Tromey * Makefile.in: Hand edit for java_raw_api.lo. 2000-03-08 Bryce McKinlay * config.guess, config.sub: Update from the gcc tree. Fix for PR libgcj/168. 2000-03-03 Tom Tromey * Makefile.in: Fixed ia64 by hand. * configure: Rebuilt. * configure.in (--enable-multilib): New option. (libffi_basedir): New subst. (AC_OUTPUT): Added multilib code. 2000-03-02 Tom Tromey * Makefile.in: Rebuilt. * Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as directory name. 2000-02-25 Hans Boehm * src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New files. * src/raw_api.c (ffi_translate_args): Fixed typo in argument list. (ffi_prep_raw_closure): Use ffi_translate_args, not ffi_closure_translate. * src/java_raw_api.c: New file. * src/ffitest.c (closure_test_fn): New function. (main): Define `rint' as long long on IA64. Added new test when FFI_CLOSURES is defined. * include/ffi.h.in (ALIGN): Use size_t, not unsigned. (ffi_abi): Recognize IA64. (ffi_raw): Added `flt' field. Added "Java raw API" code. * configure.in: Recognize ia64. * Makefile.am (TARGET_SRC_IA64): New macro. (libffi_la_common_SOURCES): Added java_raw_api.c. (libffi_la_SOURCES): Define in IA64 case. 2000-01-04 Tom Tromey * Makefile.in: Rebuilt with newer automake. 1999-12-31 Tom Tromey * Makefile.am (INCLUDES): Added -I$(top_srcdir)/src. 1999-09-01 Tom Tromey * include/ffi.h.in: Removed PACKAGE and VERSION defines and undefs. * fficonfig.h.in: Rebuilt. * configure: Rebuilt. * configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE. Use AM_PROG_LIBTOOL (automake 1.4 compatibility). * acconfig.h: Don't #undef PACKAGE or VERSION. 1999-08-09 Anthony Green * include/ffi.h.in: Try to work around messy header problem with PACKAGE and VERSION. * configure: Rebuilt. * configure.in: Change version to 2.00-beta. * fficonfig.h.in: Rebuilt. * acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define. * src/x86/ffi.c (ffi_raw_call): Rename. 1999-08-02 Kresten Krab Thorup * src/x86/ffi.c (ffi_closure_SYSV): New function. (ffi_prep_incoming_args_SYSV): Ditto. (ffi_prep_closure): Ditto. (ffi_closure_raw_SYSV): Ditto. (ffi_prep_raw_closure): More ditto. (ffi_call_raw): Final ditto. * include/ffi.h.in: Add definitions for closure and raw API. * src/x86/ffi.c (ffi_prep_cif_machdep): Added case for FFI_TYPE_UINT64. * Makefile.am (libffi_la_common_SOURCES): Added raw_api.c * src/raw_api.c: New file. * include/ffi.h.in (ffi_raw): New type. (UINT_ARG, SINT_ARG): New defines. (ffi_closure, ffi_raw_closure): New types. (ffi_prep_closure, ffi_prep_raw_closure): New declarations. * configure.in: Add check for endianness and sizeof void*. * src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument, instead of directly. * configure: Rebuilt. Thu Jul 8 14:28:42 1999 Anthony Green * configure.in: Add x86 and powerpc BeOS configurations. From Makoto Kato . 1999-05-09 Anthony Green * configure.in: Add warning about this being beta code. Remove src/Makefile.am from the picture. * configure: Rebuilt. * Makefile.am: Move logic from src/Makefile.am. Add changes to support libffi as a target library. * Makefile.in: Rebuilt. * aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh: Upgraded to new autoconf, automake, libtool. * README: Tweaks. * LICENSE: Update copyright date. * src/Makefile.am, src/Makefile.in: Removed. 1998-11-29 Anthony Green * include/ChangeLog: Removed. * src/ChangeLog: Removed. * src/mips/ChangeLog: Removed. * src/sparc/ChangeLog: Remboved. * src/x86/ChangeLog: Removed. * ChangeLog.v1: Created. polyml-5.6/libffi/ChangeLog.libffi000066400000000000000000000473261265146633400171650ustar00rootroot000000000000002011-02-08 Andreas Tobler * testsuite/lib/libffi.exp: Tweak for stand-alone mode. 2009-12-25 Samuli Suominen * configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64. * configure: Rebuilt. * fficonfig.h.in: Rebuilt. 2009-06-16 Andrew Haley * testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_medium2.c: Fix printf format specifiers. * testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs. * testsuite/libffi.call/float2.c: Fix dg-excess-errors. * testsuite/libffi.call/ffitest.h, testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define. 2009-06-12 Andrew Haley * testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_medium2.c: Fix printf format specifiers. testsuite/libffi.special/unwindtest.cc: include stdint.h. 2009-06-11 Timothy Wall * Makefile.am, configure.ac, include/ffi.h.in, include/ffi_common.h, src/closures.c, src/dlmalloc.c, src/x86/ffi.c, src/x86/ffitarget.h, src/x86/win64.S (new), README: Added win64 support (mingw or MSVC) * Makefile.in, include/Makefile.in, man/Makefile.in, testsuite/Makefile.in, configure, aclocal.m4: Regenerated * ltcf-c.sh: properly escape cygwin/w32 path * man/ffi_call.3: Clarify size requirements for return value. * src/x86/ffi64.c: Fix filename in comment. * src/x86/win32.S: Remove unused extern. * testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/closure_stdcall.c, testsuite/libffi.call/cls_12byte.c, testsuite/libffi.call/cls_16byte.c, testsuite/libffi.call/cls_18byte.c, testsuite/libffi.call/cls_19byte.c, testsuite/libffi.call/cls_1_1byte.c, testsuite/libffi.call/cls_20byte.c, testsuite/libffi.call/cls_20byte1.c, testsuite/libffi.call/cls_24byte.c, testsuite/libffi.call/cls_2byte.c, testsuite/libffi.call/cls_3_1byte.c, testsuite/libffi.call/cls_3byte1.c, testsuite/libffi.call/cls_3byte2.c, testsuite/libffi.call/cls_4_1byte.c, testsuite/libffi.call/cls_4byte.c, testsuite/libffi.call/cls_5_1_byte.c, testsuite/libffi.call/cls_5byte.c, testsuite/libffi.call/cls_64byte.c, testsuite/libffi.call/cls_6_1_byte.c, testsuite/libffi.call/cls_6byte.c, testsuite/libffi.call/cls_7_1_byte.c, testsuite/libffi.call/cls_7byte.c, testsuite/libffi.call/cls_8byte.c, testsuite/libffi.call/cls_9byte1.c, testsuite/libffi.call/cls_9byte2.c, testsuite/libffi.call/cls_align_double.c, testsuite/libffi.call/cls_align_float.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_align_longdouble_split.c, testsuite/libffi.call/cls_align_longdouble_split2.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_align_sint16.c, testsuite/libffi.call/cls_align_sint32.c, testsuite/libffi.call/cls_align_sint64.c, testsuite/libffi.call/cls_align_uint16.c, testsuite/libffi.call/cls_align_uint32.c, testsuite/libffi.call/cls_align_uint64.c, testsuite/libffi.call/cls_dbls_struct.c, testsuite/libffi.call/cls_double.c, testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_float.c, testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_multi_schar.c, testsuite/libffi.call/cls_multi_sshort.c, testsuite/libffi.call/cls_multi_sshortchar.c, testsuite/libffi.call/cls_multi_uchar.c, testsuite/libffi.call/cls_multi_ushort.c, testsuite/libffi.call/cls_multi_ushortchar.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c, testsuite/libffi.call/cls_schar.c, testsuite/libffi.call/cls_sint.c, testsuite/libffi.call/cls_sshort.c, testsuite/libffi.call/cls_uchar.c, testsuite/libffi.call/cls_uint.c, testsuite/libffi.call/cls_ulonglong.c, testsuite/libffi.call/cls_ushort.c, testsuite/libffi.call/err_bad_abi.c, testsuite/libffi.call/err_bad_typedef.c, testsuite/libffi.call/float2.c, testsuite/libffi.call/huge_struct.c, testsuite/libffi.call/nested_struct.c, testsuite/libffi.call/nested_struct1.c, testsuite/libffi.call/nested_struct10.c, testsuite/libffi.call/nested_struct2.c, testsuite/libffi.call/nested_struct3.c, testsuite/libffi.call/nested_struct4.c, testsuite/libffi.call/nested_struct5.c, testsuite/libffi.call/nested_struct6.c, testsuite/libffi.call/nested_struct7.c, testsuite/libffi.call/nested_struct8.c, testsuite/libffi.call/nested_struct9.c, testsuite/libffi.call/problem1.c, testsuite/libffi.call/return_ldl.c, testsuite/libffi.call/return_ll1.c, testsuite/libffi.call/stret_large.c, testsuite/libffi.call/stret_large2.c, testsuite/libffi.call/stret_medium.c, testsuite/libffi.call/stret_medium2.c, testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead of checking for MMAP. Use intptr_t instead of long casts. 2009-06-04 Andrew Haley * src/powerpc/ffitarget.h: Fix misapplied merge from gcc. 2009-06-04 Andrew Haley * src/mips/o32.S, src/mips/n32.S: Fix licence formatting. 2009-06-04 Andrew Haley * src/x86/darwin.S: Fix licence formatting. src/x86/win32.S: Likewise. src/sh64/sysv.S: Likewise. src/sh/sysv.S: Likewise. 2009-06-04 Andrew Haley * src/sh64/ffi.c: Remove lint directives. Was missing from merge of Andreas Tobler's patch from 2006-04-22. 2009-06-04 Andrew Haley * src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of 2007-03-07. 2008-12-26 Timothy Wall * testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_align_longdouble.c, testsuite/libffi.call/cls_align_longdouble_split.c, testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected failures on x86_64 cygwin/mingw. 2008-12-22 Timothy Wall * testsuite/libffi.call/closure_fn0.c, testsuite/libffi.call/closure_fn1.c, testsuite/libffi.call/closure_fn2.c, testsuite/libffi.call/closure_fn3.c, testsuite/libffi.call/closure_fn4.c, testsuite/libffi.call/closure_fn5.c, testsuite/libffi.call/closure_fn6.c, testsuite/libffi.call/closure_loc_fn0.c, testsuite/libffi.call/closure_stdcall.c, testsuite/libffi.call/cls_align_pointer.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c: use portable cast from pointer to integer (intptr_t). * testsuite/libffi.call/cls_longdouble.c: disable for win64. 2008-12-19 Anthony Green * configure.ac: Bump version to 3.0.8. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-11-11 Anthony Green * configure.ac: Bump version to 3.0.7. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-08-25 Andreas Tobler * src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum. Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT. Adjust copyright notice. * src/powerpc/ffi.c: Add two new flags to indicate if we have one register or two register to use for FFI_SYSV structs. (ffi_prep_cif_machdep): Pass the right register flag introduced above. (ffi_closure_helper_SYSV): Fix the return type for FFI_SYSV_TYPE_SMALL_STRUCT. Comment. Adjust copyright notice. 2008-07-24 Anthony Green * testsuite/libffi.call/cls_dbls_struct.c, testsuite/libffi.call/cls_double_va.c, testsuite/libffi.call/cls_longdouble.c, testsuite/libffi.call/cls_longdouble_va.c, testsuite/libffi.call/cls_pointer.c, testsuite/libffi.call/cls_pointer_stack.c, testsuite/libffi.call/err_bad_abi.c: Clean up failures from compiler warnings. 2008-07-17 Anthony Green * configure.ac: Bump version to 3.0.6. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. Add documentation. * README: Update for new release. 2008-07-16 Kaz Kojima * src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned int. 2008-07-16 Kaz Kojima * src/sh/sysv.S: Add .note.GNU-stack on Linux. * src/sh64/sysv.S: Likewise. 2008-04-03 Anthony Green * libffi.pc.in (Libs): Add -L${libdir}. * configure.ac: Bump version to 3.0.5. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-04-03 Anthony Green Xerces Ranby * include/ffi.h.in: Wrap definition of target architecture to protect from double definitions. 2008-03-22 Moriyoshi Koizumi * src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in closure_loc_fn0.c. * testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0): New test. 2008-03-04 Anthony Green Blake Chaffin hos@tamanegi.org * testsuite/libffi.call/cls_align_longdouble_split2.c testsuite/libffi.call/cls_align_longdouble_split.c testsuite/libffi.call/cls_dbls_struct.c testsuite/libffi.call/cls_double_va.c testsuite/libffi.call/cls_longdouble.c testsuite/libffi.call/cls_longdouble_va.c testsuite/libffi.call/cls_pointer.c testsuite/libffi.call/cls_pointer_stack.c testsuite/libffi.call/err_bad_abi.c testsuite/libffi.call/err_bad_typedef.c testsuite/libffi.call/huge_struct.c testsuite/libffi.call/stret_large2.c testsuite/libffi.call/stret_large.c testsuite/libffi.call/stret_medium2.c testsuite/libffi.call/stret_medium.c: New tests from Apple. 2008-02-26 Jakub Jelinek Anthony Green * src/alpha/osf.S: Add .note.GNU-stack on Linux. * src/s390/sysv.S: Likewise. * src/powerpc/linux64.S: Likewise. * src/powerpc/linux64_closure.S: Likewise. * src/powerpc/ppc_closure.S: Likewise. * src/powerpc/sysv.S: Likewise. * src/x86/unix64.S: Likewise. * src/x86/sysv.S: Likewise. * src/sparc/v8.S: Likewise. * src/sparc/v9.S: Likewise. * src/m68k/sysv.S: Likewise. * src/ia64/unix.S: Likewise. * src/arm/sysv.S: Likewise. 2008-02-26 Anthony Green Thomas Heller * src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C comment. 2008-02-26 Anthony Green Thomas Heller * include/ffi.h.in: Change void (*)() to void (*)(void). 2008-02-26 Anthony Green Thomas Heller * src/alpha/ffi.c: Change void (*)() to void (*)(void). src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c, src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c, src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S, src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c, src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c, src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S, src/x86/ffi64.c: Ditto. 2008-02-24 Anthony Green * configure.ac: Accept openbsd*, not just openbsd. Bump version to 3.0.4. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-02-22 Anthony Green * README: Clean up list of tested platforms. 2008-02-22 Anthony Green * configure.ac: Bump version to 3.0.3. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. Clean up test docs. 2008-02-22 Bjoern Koenig Andreas Tobler * configure.ac: Add amd64-*-freebsd* target. * configure: Regenerate. 2008-02-22 Thomas Heller * configure.ac: Add x86 OpenBSD support. * configure: Rebuilt. 2008-02-21 Thomas Heller * README: Change "make test" to "make check". 2008-02-21 Anthony Green * configure.ac: Bump version to 3.0.2. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-02-21 Björn König * src/x86/freebsd.S: New file. * configure.ac: Add x86 FreeBSD support. * Makefile.am: Ditto. 2008-02-15 Anthony Green * configure.ac: Bump version to 3.0.1. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * libtool-version: Increment revision. * README: Update for new release. 2008-02-15 David Daney * src/mips/ffi.c: Remove extra '>' from include directive. (ffi_prep_closure_loc): Use clear_location instead of tramp. 2008-02-15 Anthony Green * configure.ac: Bump version to 3.0.0. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. 2008-02-15 David Daney * src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE): Define (conditionally), and use it to include cachectl.h. (ffi_prep_closure_loc): Fix cache flushing. * src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define. 2008-02-15 Anthony Green * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3: Update dates and remove all references to ffi_prep_closure. * configure.ac: Bump version to 2.99.9. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. 2008-02-15 Anthony Green * man/ffi_prep_closure.3: Delete. * man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3. (man_MANS): Ditto. * man/Makefile.in: Rebuilt. * configure.ac: Bump version to 2.99.8. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. 2008-02-14 Anthony Green * configure.ac: Bump version to 2.99.7. * configure, doc/stamp-vti, doc/version.texi: Rebuilt. * include/ffi.h.in LICENSE src/debug.c src/closures.c src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h src/prep_cif.c: Update license text. 2008-02-14 Anthony Green * README: Update tested platforms. * configure.ac: Bump version to 2.99.6. * configure: Rebuilt. 2008-02-14 Anthony Green * configure.ac: Bump version to 2.99.5. * configure: Rebuilt. * Makefile.am (EXTRA_DIST): Add darwin64.S * Makefile.in: Rebuilt. * testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree. * LICENSE: Update WARRANTY. 2008-02-14 Anthony Green * libffi.pc.in (libdir): Fix libdir definition. * configure.ac: Bump version to 2.99.4. * configure: Rebuilt. 2008-02-14 Anthony Green * README: Update. * libffi.info: New file. * doc/stamp-vti: New file. * configure.ac: Bump version to 2.99.3. * configure: Rebuilt. 2008-02-14 Anthony Green * Makefile.am (SUBDIRS): Add man dir. * Makefile.in: Rebuilt. * configure.ac: Create Makefile. * configure: Rebuilt. * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3 man/Makefile.am man/Makefile.in: New files. 2008-02-14 Tom Tromey * aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt. * mdate-sh, texinfo.tex: New files. * Makefile.am (info_TEXINFOS): New variable. * doc/libffi.texi: New file. * doc/version.texi: Likewise. 2008-02-14 Anthony Green * Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET). (lib_LTLIBRARIES): Define. (toolexeclib_LIBRARIES): Undefine. * Makefile.in: Rebuilt. * configure.ac: Reset version to 2.99.1. * configure.in: Rebuilt. 2008-02-14 Anthony Green * libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@. * configure.ac: Reset version to 2.99.1. * configure.in: Rebuilt. * Makefile.am (EXTRA_DIST): Add ChangeLog.libffi. * Makefile.in: Rebuilt. * LICENSE: Update copyright notice. 2008-02-14 Anthony Green * include/Makefile.am (nodist_includes_HEADERS): Define. Don't distribute ffitarget.h or ffi.h from the build include dir. * Makefile.in: Rebuilt. 2008-02-14 Anthony Green * include/Makefile.am (includesdir): Install headers under libdir. (pkgconfigdir): Define. Install libffi.pc. * include/Makefile.in: Rebuilt. * libffi.pc.in: Create. * libtool-version: Increment CURRENT * configure.ac: Add libffi.pc.in * configure: Rebuilt. 2008-02-03 Anthony Green * include/Makefile.am (includesdir): Fix header install with DESTDIR. * include/Makefile.in: Rebuilt. 2008-02-03 Timothy Wall * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return offset based on code pointer, not data pointer. 2008-02-01 Anthony Green * include/Makefile.am: Fix header installs. * Makefile.am: Ditto. * include/Makefile.in: Rebuilt. * Makefile.in: Ditto. 2008-02-01 Anthony Green * src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL, FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last patch. 2008-01-31 Anthony Green * Makefile.am (EXTRA_DIST): Add missing files. * testsuite/Makefile.am: Ditto. * Makefile.in, testsuite/Makefile.in: Rebuilt. 2008-01-31 Timothy Wall * testsuite/libffi.call/closure_stdcall.c: Add test for stdcall closures. * src/x86/ffitarget.h: Increase size of trampoline for stdcall closures. * src/x86/win32.S: Add assembly for stdcall closure. * src/x86/ffi.c: Initialize stdcall closure trampoline. 2008-01-30 H.J. Lu PR libffi/34612 * src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when returning struct. * testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer" tests. 2008-01-30 Anthony Green * Makefile.am, include/Makefile.am: Move headers to libffi_la_SOURCES for new automake. * Makefile.in, include/Makefile.in: Rebuilt. * testsuite/lib/wrapper.exp: Copied from gcc tree to allow for execution outside of gcc tree. * testsuite/lib/target-libpath.exp: Ditto. * testsuite/lib/libffi-dg.exp: Many changes to allow for execution outside of gcc tree. polyml-5.6/libffi/ChangeLog.libgcj000066400000000000000000000021171265146633400171510ustar00rootroot000000000000002004-01-14 Kelley Cook * configure.in: Add in AC_PREREQ(2.13) 2003-02-20 Alexandre Oliva * configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to config.status. * configure: Rebuilt. 2002-01-27 Alexandre Oliva * configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST. Remove USE_LIBDIR conditional. * Makefile.am (toolexecdir, toolexeclibdir): Don't override. * Makefile.in, configure: Rebuilt. Mon Aug 9 18:33:38 1999 Rainer Orth * include/Makefile.in: Rebuilt. * Makefile.in: Rebuilt * Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native builds. Use USE_LIBDIR. * configure: Rebuilt. * configure.in (USE_LIBDIR): Define for native builds. Use lowercase in configure --help explanations. 1999-08-08 Anthony Green * include/ffi.h.in (FFI_FN): Remove `...'. 1999-08-08 Anthony Green * Makefile.in: Rebuilt. * Makefile.am (AM_CFLAGS): Compile with -fexceptions. * src/x86/sysv.S: Add exception handling metadata. polyml-5.6/libffi/ChangeLog.v1000066400000000000000000000547401265146633400162560ustar00rootroot00000000000000The libffi version 1 ChangeLog archive. Version 1 of libffi had per-directory ChangeLogs. Current and future versions have a single ChangeLog file in the root directory. The version 1 ChangeLogs have all been concatonated into this file for future reference only. --- libffi ---------------------------------------------------------------- Mon Oct 5 02:17:50 1998 Anthony Green * configure.in: Boosted rev. * configure, Makefile.in, aclocal.m4: Rebuilt. * README: Boosted rev and updated release notes. Mon Oct 5 01:03:03 1998 Anthony Green * configure.in: Boosted rev. * configure, Makefile.in, aclocal.m4: Rebuilt. * README: Boosted rev and updated release notes. 1998-07-25 Andreas Schwab * m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags. Correctly handle small structures. (ffi_prep_args): Also handle small structures. (ffi_call): Pass size of return type to ffi_call_SYSV. * m68k/sysv.S: Adjust for above changes. Correctly align small structures in the return value. * types.c (uint64, sint64) [M68K]: Change alignment to 4. Fri Apr 17 17:26:58 1998 Anthony Green * configure.in: Boosted rev. * configure,Makefile.in,aclocal.m4: Rebuilt. * README: Boosted rev and added release notes. Sun Feb 22 00:50:41 1998 Geoff Keating * configure.in: Add PowerPC config bits. 1998-02-14 Andreas Schwab * configure.in: Add m68k config bits. Change AC_CANONICAL_SYSTEM to AC_CANONICAL_HOST, this is not a compiler. Use $host instead of $target. Remove AC_CHECK_SIZEOF(char), we already know the result. Fix argument of AC_ARG_ENABLE. * configure, fficonfig.h.in: Rebuilt. Tue Feb 10 20:53:40 1998 Richard Henderson * configure.in: Add Alpha config bits. Tue May 13 13:39:20 1997 Anthony Green * README: Updated dates and reworded Irix comments. * configure.in: Removed AC_PROG_RANLIB. * Makefile.in, aclocal.m4, config.guess, config.sub, configure, ltmain.sh, */Makefile.in: libtoolized again and rebuilt with automake and autoconf. Sat May 10 18:44:50 1997 Tom Tromey * configure, aclocal.m4: Rebuilt. * configure.in: Don't compute EXTRADIST; now handled in src/Makefile.in. Removed macros implied by AM_INIT_AUTOMAKE. Don't run AM_MAINTAINER_MODE. Thu May 8 14:34:05 1997 Anthony Green * missing, ltmain.sh, ltconfig.sh: Created. These are new files required by automake and libtool. * README: Boosted rev to 1.14. Added notes. * acconfig.h: Moved PACKAGE and VERSION for new automake. * configure.in: Changes for libtool. * Makefile.am (check): make test now make check. Uses libtool now. * Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt. Thu May 1 16:27:07 1997 Anthony Green * missing: Added file required by new automake. Tue Nov 26 14:10:42 1996 Anthony Green * acconfig.h: Added USING_PURIFY flag. This is defined when --enable-purify-safety was used at configure time. * configure.in (allsources): Added --enable-purify-safety switch. (VERSION): Boosted rev to 1.13. * configure: Rebuilt. Fri Nov 22 06:46:12 1996 Anthony Green * configure.in (VERSION): Boosted rev to 1.12. Removed special CFLAGS hack for gcc. * configure: Rebuilt. * README: Boosted rev to 1.12. Added notes. * Many files: Cygnus Support changed to Cygnus Solutions. Wed Oct 30 11:15:25 1996 Anthony Green * configure.in (VERSION): Boosted rev to 1.11. * configure: Rebuilt. * README: Boosted rev to 1.11. Added notes about GNU make. Tue Oct 29 12:25:12 1996 Anthony Green * configure.in: Fixed -Wall trick. (VERSION): Boosted rev. * configure: Rebuilt * acconfig.h: Needed for --enable-debug configure switch. * README: Boosted rev to 1.09. Added more notes on building libffi, and LCLint. * configure.in: Added --enable-debug switch. Boosted rev to 1.09. * configure: Rebuilt Tue Oct 15 13:11:28 1996 Anthony Green * configure.in (VERSION): Boosted rev to 1.08 * configure: Rebuilt. * README: Added n32 bug fix notes. * Makefile.am: Added "make lint" production. * Makefile.in: Rebuilt. Mon Oct 14 10:54:46 1996 Anthony Green * README: Added web page reference. * configure.in, README: Boosted rev to 1.05 * configure: Rebuilt. * README: Fixed n32 sample code. Fri Oct 11 17:09:28 1996 Anthony Green * README: Added sparc notes. * configure.in, README: Boosted rev to 1.04. * configure: Rebuilt. Thu Oct 10 10:31:03 1996 Anthony Green * configure.in, README: Boosted rev to 1.03. * configure: Rebuilt. * README: Added struct notes. * Makefile.am (EXTRA_DIST): Added LICENSE to distribution. * Makefile.in: Rebuilt. * README: Removed Linux section. No special notes now because aggregates arg/return types work. Wed Oct 9 16:16:42 1996 Anthony Green * README, configure.in (VERSION): Boosted rev to 1.02 * configure: Rebuilt. Tue Oct 8 11:56:33 1996 Anthony Green * README (NOTE): Added n32 notes. * Makefile.am: Added test production. * Makefile: Rebuilt * README: spell checked! * configure.in (VERSION): Boosted rev to 1.01 * configure: Rebuilt. Mon Oct 7 15:50:22 1996 Anthony Green * configure.in: Added nasty bit to support SGI tools. * configure: Rebuilt. * README: Added SGI notes. Added note about automake bug. Mon Oct 7 11:00:28 1996 Anthony Green * README: Rewrote intro, and fixed examples. Fri Oct 4 10:19:55 1996 Anthony Green * configure.in: -D$TARGET is no longer used as a compiler switch. It is now inserted into ffi.h at configure time. * configure: Rebuilt. * FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status. Thu Oct 3 13:47:34 1996 Anthony Green * README, LICENSE: Created. Wrote some docs. * configure.in: Don't barf on i586-unknown-linuxaout. Added EXTRADIST code for "make dist". * configure: Rebuilt. * */Makefile.in: Rebuilt with patched automake. Tue Oct 1 17:12:25 1996 Anthony Green * Makefile.am, aclocal.m4, config.guess, config.sub, configure.in, fficonfig.h.in, install-sh, mkinstalldirs, stamp-h.in: Created * Makefile.in, configure: Generated --- libffi/include -------------------------------------------------------- Tue Feb 24 13:09:36 1998 Anthony Green * ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on ffi.h.in changes. This is a work-around for SGI's "simple" assembler. Sun Feb 22 00:51:55 1998 Geoff Keating * ffi.h.in: PowerPC support. 1998-02-14 Andreas Schwab * ffi.h.in: Add m68k support. (FFI_TYPE_LONGDOUBLE): Make it a separate value. Tue Feb 10 20:55:16 1998 Richard Henderson * ffi.h.in (SIZEOF_ARG): Use a pointer type by default. * ffi.h.in: Alpha support. Fri Nov 22 06:48:45 1996 Anthony Green * ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions. Wed Nov 20 22:31:01 1996 Anthony Green * ffi.h.in: Added ffi_type_void definition. Tue Oct 29 12:22:40 1996 Anthony Green * Makefile.am (hack_DATA): Always install ffi_mips.h. * ffi.h.in: Removed FFI_DEBUG. It's now in the correct place (acconfig.h). Added #include for size_t definition. Tue Oct 15 17:23:35 1996 Anthony Green * ffi.h.in, ffi_common.h, ffi_mips.h: More clean up. Commented out #define of FFI_DEBUG. Tue Oct 15 13:01:06 1996 Anthony Green * ffi_common.h: Added bool definition. * ffi.h.in, ffi_common.h: Clean up based on LCLint output. Added funny /*@...@*/ comments to annotate source. Mon Oct 14 12:29:23 1996 Anthony Green * ffi.h.in: Interface changes based on feedback from Jim Blandy. Fri Oct 11 16:49:35 1996 Anthony Green * ffi.h.in: Small change for sparc support. Thu Oct 10 14:53:37 1996 Anthony Green * ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for special structure return types. Wed Oct 9 13:55:57 1996 Anthony Green * ffi.h.in: Added SIZEOF_ARG definition for X86 Tue Oct 8 11:40:36 1996 Anthony Green * ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings. Use it to case your function pointers to the proper type. * ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug. * Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST. * Makefile: Rebuilt. * ffi_mips.h: Created. Moved all common mips definitions here. Mon Oct 7 10:58:12 1996 Anthony Green * ffi.h.in: The SGI assember is very picky about parens. Redefined some macros to avoid problems. * ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added externs for pointer, and 64bit integral ffi_types. Fri Oct 4 09:51:37 1996 Anthony Green * ffi.h.in: Added FFI_ABI member to ffi_cif and changed function prototypes accordingly. Added #define @TARGET@. Now programs including ffi.h don't have to specify this themselves. Thu Oct 3 15:36:44 1996 Anthony Green * ffi.h.in: Changed ffi_prep_cif's values from void* to void** * Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist" to work. * Makefile.in: Regenerated. Wed Oct 2 10:16:59 1996 Anthony Green * Makefile.am: Created * Makefile.in: Generated * ffi_common.h: Added rcsid comment Tue Oct 1 17:13:51 1996 Anthony Green * ffi.h.in, ffi_common.h: Created --- libffi/src ------------------------------------------------------------ Mon Oct 5 02:17:50 1998 Anthony Green * arm/ffi.c, arm/sysv.S: Created. * Makefile.am: Added arm files. * Makefile.in: Rebuilt. Mon Oct 5 01:41:38 1998 Anthony Green * Makefile.am (libffi_la_LDFLAGS): Incremented revision. Sun Oct 4 16:27:17 1998 Anthony Green * alpha/osf.S (ffi_call_osf): Patch for DU assembler. * ffitest.c (main): long long and long double return values work for x86. Fri Apr 17 11:50:58 1998 Anthony Green * Makefile.in: Rebuilt. * ffitest.c (main): Floating point tests not executed for systems with broken lond double (SunOS 4 w/ GCC). * types.c: Fixed x86 alignment info for long long types. Thu Apr 16 07:15:28 1998 Anthony Green * ffitest.c: Added more notes about GCC bugs under Irix 6. Wed Apr 15 08:42:22 1998 Anthony Green * ffitest.c (struct5): New test function. (main): New test with struct5. Thu Mar 5 10:48:11 1998 Anthony Green * prep_cif.c (initialize_aggregate): Fix assertion for nested structures. Tue Feb 24 16:33:41 1998 Anthony Green * prep_cif.c (ffi_prep_cif): Added long double support for sparc. Sun Feb 22 00:52:18 1998 Geoff Keating * powerpc/asm.h: New file. * powerpc/ffi.c: New file. * powerpc/sysv.S: New file. * Makefile.am: PowerPC port. * ffitest.c (main): Allow all tests to run even in presence of gcc bug on PowerPC. 1998-02-17 Anthony Green * mips/ffi.c: Fixed comment typo. * x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): Fixed x86 long double return handling. * types.c: Fixed x86 long double alignment info. 1998-02-14 Andreas Schwab * types.c: Add m68k support. * ffitest.c (floating): Add long double parameter. (return_ll, ldblit): New functions to test long long and long double return value. (main): Fix type error in assignment of ts[1-4]_type.elements. Add tests for long long and long double arguments and return values. * prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for struct value pointer. * m68k/ffi.c, m68k/sysv.S: New files. * Makefile.am: Add bits for m68k port. Add kludge to work around automake deficiency. (test): Don't require "." in $PATH. * Makefile.in: Rebuilt. Wed Feb 11 07:36:50 1998 Anthony Green * Makefile.in: Rebuilt. Tue Feb 10 20:56:00 1998 Richard Henderson * alpha/ffi.c, alpha/osf.S: New files. * Makefile.am: Alpha port. Tue Nov 18 14:12:07 1997 Anthony Green * mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag for n32. Tue Jun 3 17:18:20 1997 Anthony Green * ffitest.c (main): Added hack to get structure tests working correctly. Sat May 10 19:06:42 1997 Tom Tromey * Makefile.in: Rebuilt. * Makefile.am (EXTRA_DIST): Explicitly list all distributable files in subdirs. (VERSION, CC): Removed. Thu May 8 17:19:01 1997 Anthony Green * Makefile.am: Many changes for new automake and libtool. * Makefile.in: Rebuilt. Fri Nov 22 06:57:56 1996 Anthony Green * ffitest.c (main): Fixed test case for non mips machines. Wed Nov 20 22:31:59 1996 Anthony Green * types.c: Added ffi_type_void declaration. Tue Oct 29 13:07:19 1996 Anthony Green * ffitest.c (main): Fixed character constants. (main): Emit warning for structure test 3 failure on Sun. * Makefile.am (VPATH): Fixed VPATH def'n so automake won't strip it out. Moved distdir hack from libffi to automake. (ffitest): Added missing -c for $(COMPILE) (change in automake). * Makefile.in: Rebuilt. Tue Oct 15 13:08:20 1996 Anthony Green * Makefile.am: Added "make lint" production. * Makefile.in: Rebuilt. * prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro. Clean up based on LCLint output. Added funny /*@...@*/ comments to annotate source. * ffitest.c, debug.c: Cleaned up code. Mon Oct 14 12:26:56 1996 Anthony Green * ffitest.c: Changes based on interface changes. * prep_cif.c (ffi_prep_cif): Cleaned up interface based on feedback from Jim Blandy. Fri Oct 11 15:53:18 1996 Anthony Green * ffitest.c: Reordered tests while porting to sparc. Made changes to handle lame structure passing for sparc. Removed calls to fflush(). * prep_cif.c (ffi_prep_cif): Added special case for sparc aggregate type arguments. Thu Oct 10 09:56:51 1996 Anthony Green * ffitest.c (main): Added structure passing/returning tests. * prep_cif.c (ffi_prep_cif): Perform proper initialization of structure return types if needed. (initialize_aggregate): Bug fix Wed Oct 9 16:04:20 1996 Anthony Green * types.c: Added special definitions for x86 (double doesn't need double word alignment). * ffitest.c: Added many tests Tue Oct 8 09:19:22 1996 Anthony Green * prep_cif.c (ffi_prep_cif): Fixed assertion. * debug.c (ffi_assert): Must return a non void now. * Makefile.am: Added test production. * Makefile: Rebuilt. * ffitest.c (main): Created. * types.c: Created. Stripped common code out of */ffi.c. * prep_cif.c: Added missing stdlib.h include. * debug.c (ffi_type_test): Used "a" to eliminate compiler warnings in non-debug builds. Included ffi_common.h. Mon Oct 7 15:36:42 1996 Anthony Green * Makefile.am: Added a rule for .s -> .o This is required by the SGI compiler. * Makefile: Rebuilt. Fri Oct 4 09:51:08 1996 Anthony Green * prep_cif.c (initialize_aggregate): Moved abi specification to ffi_prep_cif(). Thu Oct 3 15:37:37 1996 Anthony Green * prep_cif.c (ffi_prep_cif): Changed values from void* to void**. (initialize_aggregate): Fixed aggregate type initialization. * Makefile.am (EXTRA_DIST): Added support code for "make dist". * Makefile.in: Regenerated. Wed Oct 2 11:41:57 1996 Anthony Green * debug.c, prep_cif: Created. * Makefile.am: Added debug.o and prep_cif.o to OBJ. * Makefile.in: Regenerated. * Makefile.am (INCLUDES): Added missing -I../include * Makefile.in: Regenerated. Tue Oct 1 17:11:51 1996 Anthony Green * error.c, Makefile.am: Created. * Makefile.in: Generated. --- libffi/src/x86 -------------------------------------------------------- Sun Oct 4 16:27:17 1998 Anthony Green * sysv.S (retlongdouble): Fixed long long return value support. * ffi.c (ffi_prep_cif_machdep): Ditto. Wed May 13 04:30:33 1998 Anthony Green * ffi.c (ffi_prep_cif_machdep): Fixed long double return value support. Wed Apr 15 08:43:20 1998 Anthony Green * ffi.c (ffi_prep_args): small struct support was missing. Thu May 8 16:53:58 1997 Anthony Green * objects.mak: Removed. Mon Dec 2 15:12:58 1996 Tom Tromey * sysv.S: Use .balign, for a.out Linux boxes. Tue Oct 15 13:06:50 1996 Anthony Green * ffi.c: Clean up based on LCLint output. Added funny /*@...@*/ comments to annotate source. Fri Oct 11 16:43:38 1996 Anthony Green * ffi.c (ffi_call): Added assertion for bad ABIs. Wed Oct 9 13:57:27 1996 Anthony Green * sysv.S (retdouble): Fixed double return problems. * ffi.c (ffi_call): Corrected fn arg definition. (ffi_prep_cif_machdep): Fixed double return problems Tue Oct 8 12:12:49 1996 Anthony Green * ffi.c: Moved ffi_type definitions to types.c. (ffi_prep_args): Fixed type promotion bug. Mon Oct 7 15:53:06 1996 Anthony Green * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' Fri Oct 4 09:54:53 1996 Anthony Green * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped remaining args. Wed Oct 2 10:07:05 1996 Anthony Green * ffi.c, sysv.S, objects.mak: Created. (ffi_prep_cif): cif->rvalue no longer initialized to NULL. (ffi_prep_cif_machdep): Moved machine independent cif processing to src/prep_cif.c. Introduced ffi_prep_cif_machdep(). --- libffi/src/mips ------------------------------------------------------- Tue Feb 17 17:18:07 1998 Anthony Green * o32.S: Fixed typo in comment. * ffi.c (ffi_prep_cif_machdep): Fixed argument processing. Thu May 8 16:53:58 1997 Anthony Green * o32.s, n32.s: Wrappers for SGI tool support. * objects.mak: Removed. Tue Oct 29 14:37:45 1996 Anthony Green * ffi.c (ffi_prep_args): Changed int z to size_t z. Tue Oct 15 13:17:25 1996 Anthony Green * n32.S: Fixed bad stack munging. * ffi.c: Moved prototypes for ffi_call_?32() to here from ffi_mips.h because extended_cif is not defined in ffi_mips.h. Mon Oct 14 12:42:02 1996 Anthony Green * ffi.c: Interface changes based on feedback from Jim Blandy. Thu Oct 10 11:22:16 1996 Anthony Green * n32.S, ffi.c: Lots of changes to support passing and returning structures with the n32 calling convention. * n32.S: Fixed fn pointer bug. * ffi.c (ffi_prep_cif_machdep): Fix for o32 structure return values. (ffi_prep_args): Fixed n32 structure passing when structures partially fit in registers. Wed Oct 9 13:49:25 1996 Anthony Green * objects.mak: Added n32.o. * n32.S: Created. * ffi.c (ffi_prep_args): Added magic to support proper n32 processing. Tue Oct 8 10:37:35 1996 Anthony Green * ffi.c: Moved ffi_type definitions to types.c. (ffi_prep_args): Fixed type promotion bug. * o32.S: This code is only built for o32 compiles. A lot of the #define cruft has moved to ffi_mips.h. * ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg is only processed if the first is either a float or double. Mon Oct 7 15:33:59 1996 Anthony Green * o32.S: Modified to compile under each of o32, n32 and n64. * ffi.c (FFI_*_TYPEDEF): Removed redundant ';' Fri Oct 4 09:53:25 1996 Anthony Green * ffi.c (ffi_call): Removed FFI_ABI arg, and swapped remaining args. Wed Oct 2 17:41:22 1996 Anthony Green * o32.S: Removed crufty definitions. Wed Oct 2 12:53:42 1996 Anthony Green * ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL. (ffi_prep_cif_machdep): Moved all machine independent cif processing to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT. Tue Oct 1 17:11:02 1996 Anthony Green * ffi.c, o32.S, object.mak: Created --- libffi/src/sparc ------------------------------------------------------ Tue Feb 24 16:33:18 1998 Anthony Green * ffi.c (ffi_prep_args): Added long double support. Thu May 8 16:53:58 1997 Anthony Green * objects.mak: Removed. Thu May 1 16:07:56 1997 Anthony Green * v8.S: Fixed minor portability problem reported by Russ McManus . Tue Nov 26 14:12:43 1996 Anthony Green * v8.S: Used STACKFRAME define elsewhere. * ffi.c (ffi_prep_args): Zero out space when USING_PURIFY is set. (ffi_prep_cif_machdep): Allocate the correct stack frame space for functions with < 6 args. Tue Oct 29 15:08:55 1996 Anthony Green * ffi.c (ffi_prep_args): int z is now size_t z. Mon Oct 14 13:31:24 1996 Anthony Green * v8.S (ffi_call_V8): Gordon rewrites this again. It looks great now. * ffi.c (ffi_call): The comment about hijacked registers is no longer valid after gordoni hacked v8.S. * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler. * v8.S, ffi.c: ffi_call() had changed to accept more than two args, so v8.S had to change (because it hijacks incoming arg registers). * ffi.c: Interface changes based on feedback from Jim Blandy. Thu Oct 10 17:48:16 1996 Anthony Green * ffi.c, v8.S, objects.mak: Created. polyml-5.6/libffi/LICENSE000066400000000000000000000021541265146633400151540ustar00rootroot00000000000000libffi - Copyright (c) 1996-2012 Anthony Green, Red Hat, Inc and others. See source files for details. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. polyml-5.6/libffi/Makefile.am000066400000000000000000000164461265146633400162140ustar00rootroot00000000000000## Process this with automake to create Makefile.in # Poly: don't install anything from this directory install:; @: install-exec:; @: install-data:; @: uninstall:; @: # Poly AUTOMAKE_OPTIONS = foreign subdir-objects ACLOCAL_AMFLAGS = -I m4 SUBDIRS = include testsuite man EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ build-ios.sh src/alpha/ffi.c src/alpha/osf.S \ src/alpha/ffitarget.h src/arm/ffi.c src/arm/sysv.S \ src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ src/microblaze/ffi.c src/microblaze/sysv.S \ src/microblaze/ffitarget.h src/powerpc/ffi.c \ src/powerpc/sysv.S src/powerpc/linux64.S \ src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ src/tile/ffitarget.h src/tile/tile.S libtool-version \ src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ generate-ios-source-and-headers.py \ generate-osx-source-and-headers.py \ libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ libtool-ldflags # Poly - don't try to create the tex info. #info_TEXINFOS = doc/libffi.texi ## ################################################################ ## ## This section is for make and multilib madness. ## # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and # friends when we are called from the top level Makefile. AM_MAKEFLAGS = \ "AR_FLAGS=$(AR_FLAGS)" \ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ "CFLAGS=$(CFLAGS)" \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ "JC1FLAGS=$(JC1FLAGS)" \ "LDFLAGS=$(LDFLAGS)" \ "LIBCFLAGS=$(LIBCFLAGS)" \ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ "MAKE=$(MAKE)" \ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ "PICFLAG=$(PICFLAG)" \ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ "SHELL=$(SHELL)" \ "exec_prefix=$(exec_prefix)" \ "infodir=$(infodir)" \ "libdir=$(libdir)" \ "mandir=$(mandir)" \ "prefix=$(prefix)" \ "AR=$(AR)" \ "AS=$(AS)" \ "CC=$(CC)" \ "CXX=$(CXX)" \ "LD=$(LD)" \ "NM=$(NM)" \ "RANLIB=$(RANLIB)" \ "DESTDIR=$(DESTDIR)" # Subdir rules rely on $(FLAGS_TO_PASS) FLAGS_TO_PASS = $(AM_MAKEFLAGS) MAKEOVERRIDES= toolexeclib_LTLIBRARIES = libffi.la noinst_LTLIBRARIES = libffi_convenience.la libffi_la_SOURCES = src/prep_cif.c src/types.c \ src/raw_api.c src/java_raw_api.c src/closures.c pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libffi.pc nodist_libffi_la_SOURCES = if FFI_DEBUG nodist_libffi_la_SOURCES += src/debug.c endif if MIPS nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S endif if BFIN nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S endif if X86 nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S endif if X86_FREEBSD nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S endif if X86_WIN32 nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S endif if X86_WIN64 nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S endif if X86_DARWIN nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S endif if SPARC nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S endif if ALPHA nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S endif if IA64 nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S endif if M32R nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c endif if M68K nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S endif if MOXIE nodist_libffi_la_SOURCES += src/moxie/ffi.c src/moxie/eabi.S endif if MICROBLAZE nodist_libffi_la_SOURCES += src/microblaze/ffi.c src/microblaze/sysv.S endif if POWERPC nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S endif if POWERPC_AIX nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S endif if POWERPC_DARWIN nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S endif if POWERPC_FREEBSD nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S endif if AARCH64 nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c endif if ARM nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c if FFI_EXEC_TRAMPOLINE_TABLE nodist_libffi_la_SOURCES += src/arm/trampoline.S endif endif if AVR32 nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c endif if LIBFFI_CRIS nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c endif if FRV nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c endif if S390 nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c endif if X86_64 nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S endif if SH nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c endif if SH64 nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c endif if PA_LINUX nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c endif if PA_HPUX nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c endif if TILE nodist_libffi_la_SOURCES += src/tile/tile.S src/tile/ffi.c endif if XTENSA nodist_libffi_la_SOURCES += src/xtensa/sysv.S src/xtensa/ffi.c endif if METAG nodist_libffi_la_SOURCES += src/metag/sysv.S src/metag/ffi.c endif libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src AM_CCASFLAGS = $(AM_CPPFLAGS) polyml-5.6/libffi/Makefile.in000066400000000000000000002065051265146633400162220ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @FFI_DEBUG_TRUE@am__append_1 = src/debug.c @MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S @BFIN_TRUE@am__append_3 = src/bfin/ffi.c src/bfin/sysv.S @X86_TRUE@am__append_4 = src/x86/ffi.c src/x86/sysv.S @X86_FREEBSD_TRUE@am__append_5 = src/x86/ffi.c src/x86/freebsd.S @X86_WIN32_TRUE@am__append_6 = src/x86/ffi.c src/x86/win32.S @X86_WIN64_TRUE@am__append_7 = src/x86/ffi.c src/x86/win64.S @X86_DARWIN_TRUE@am__append_8 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S @SPARC_TRUE@am__append_9 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S @ALPHA_TRUE@am__append_10 = src/alpha/ffi.c src/alpha/osf.S @IA64_TRUE@am__append_11 = src/ia64/ffi.c src/ia64/unix.S @M32R_TRUE@am__append_12 = src/m32r/sysv.S src/m32r/ffi.c @M68K_TRUE@am__append_13 = src/m68k/ffi.c src/m68k/sysv.S @MOXIE_TRUE@am__append_14 = src/moxie/ffi.c src/moxie/eabi.S @MICROBLAZE_TRUE@am__append_15 = src/microblaze/ffi.c src/microblaze/sysv.S @POWERPC_TRUE@am__append_16 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S @POWERPC_AIX_TRUE@am__append_17 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S @POWERPC_DARWIN_TRUE@am__append_18 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S @POWERPC_FREEBSD_TRUE@am__append_19 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S @AARCH64_TRUE@am__append_20 = src/aarch64/sysv.S src/aarch64/ffi.c @ARM_TRUE@am__append_21 = src/arm/sysv.S src/arm/ffi.c @ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_22 = src/arm/trampoline.S @AVR32_TRUE@am__append_23 = src/avr32/sysv.S src/avr32/ffi.c @LIBFFI_CRIS_TRUE@am__append_24 = src/cris/sysv.S src/cris/ffi.c @FRV_TRUE@am__append_25 = src/frv/eabi.S src/frv/ffi.c @S390_TRUE@am__append_26 = src/s390/sysv.S src/s390/ffi.c @X86_64_TRUE@am__append_27 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S @SH_TRUE@am__append_28 = src/sh/sysv.S src/sh/ffi.c @SH64_TRUE@am__append_29 = src/sh64/sysv.S src/sh64/ffi.c @PA_LINUX_TRUE@am__append_30 = src/pa/linux.S src/pa/ffi.c @PA_HPUX_TRUE@am__append_31 = src/pa/hpux32.S src/pa/ffi.c @TILE_TRUE@am__append_32 = src/tile/tile.S src/tile/ffi.c @XTENSA_TRUE@am__append_33 = src/xtensa/sysv.S src/xtensa/ffi.c @METAG_TRUE@am__append_34 = src/metag/sysv.S src/metag/ffi.c subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/fficonfig.h.in $(srcdir)/libffi.pc.in depcomp \ ChangeLog README compile config.guess config.sub install-sh \ mdate-sh missing texinfo.tex ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_configure_args.m4 \ $(top_srcdir)/m4/ax_enable_builddir.m4 \ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = fficonfig.h CONFIG_CLEAN_FILES = libffi.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \ "$(DESTDIR)$(pkgconfigdir)" LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) libffi_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ src/java_raw_api.lo src/closures.lo @FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo @MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \ @MIPS_TRUE@ src/mips/n32.lo @BFIN_TRUE@am__objects_3 = src/bfin/ffi.lo src/bfin/sysv.lo @X86_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/sysv.lo @X86_FREEBSD_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/freebsd.lo @X86_WIN32_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win32.lo @X86_WIN64_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/win64.lo @X86_DARWIN_TRUE@am__objects_8 = src/x86/ffi.lo src/x86/darwin.lo \ @X86_DARWIN_TRUE@ src/x86/ffi64.lo src/x86/darwin64.lo @SPARC_TRUE@am__objects_9 = src/sparc/ffi.lo src/sparc/v8.lo \ @SPARC_TRUE@ src/sparc/v9.lo @ALPHA_TRUE@am__objects_10 = src/alpha/ffi.lo src/alpha/osf.lo @IA64_TRUE@am__objects_11 = src/ia64/ffi.lo src/ia64/unix.lo @M32R_TRUE@am__objects_12 = src/m32r/sysv.lo src/m32r/ffi.lo @M68K_TRUE@am__objects_13 = src/m68k/ffi.lo src/m68k/sysv.lo @MOXIE_TRUE@am__objects_14 = src/moxie/ffi.lo src/moxie/eabi.lo @MICROBLAZE_TRUE@am__objects_15 = src/microblaze/ffi.lo \ @MICROBLAZE_TRUE@ src/microblaze/sysv.lo @POWERPC_TRUE@am__objects_16 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ @POWERPC_TRUE@ src/powerpc/ppc_closure.lo \ @POWERPC_TRUE@ src/powerpc/linux64.lo \ @POWERPC_TRUE@ src/powerpc/linux64_closure.lo @POWERPC_AIX_TRUE@am__objects_17 = src/powerpc/ffi_darwin.lo \ @POWERPC_AIX_TRUE@ src/powerpc/aix.lo \ @POWERPC_AIX_TRUE@ src/powerpc/aix_closure.lo @POWERPC_DARWIN_TRUE@am__objects_18 = src/powerpc/ffi_darwin.lo \ @POWERPC_DARWIN_TRUE@ src/powerpc/darwin.lo \ @POWERPC_DARWIN_TRUE@ src/powerpc/darwin_closure.lo @POWERPC_FREEBSD_TRUE@am__objects_19 = src/powerpc/ffi.lo \ @POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \ @POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo @AARCH64_TRUE@am__objects_20 = src/aarch64/sysv.lo src/aarch64/ffi.lo @ARM_TRUE@am__objects_21 = src/arm/sysv.lo src/arm/ffi.lo @ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_22 = src/arm/trampoline.lo @AVR32_TRUE@am__objects_23 = src/avr32/sysv.lo src/avr32/ffi.lo @LIBFFI_CRIS_TRUE@am__objects_24 = src/cris/sysv.lo src/cris/ffi.lo @FRV_TRUE@am__objects_25 = src/frv/eabi.lo src/frv/ffi.lo @S390_TRUE@am__objects_26 = src/s390/sysv.lo src/s390/ffi.lo @X86_64_TRUE@am__objects_27 = src/x86/ffi64.lo src/x86/unix64.lo \ @X86_64_TRUE@ src/x86/ffi.lo src/x86/sysv.lo @SH_TRUE@am__objects_28 = src/sh/sysv.lo src/sh/ffi.lo @SH64_TRUE@am__objects_29 = src/sh64/sysv.lo src/sh64/ffi.lo @PA_LINUX_TRUE@am__objects_30 = src/pa/linux.lo src/pa/ffi.lo @PA_HPUX_TRUE@am__objects_31 = src/pa/hpux32.lo src/pa/ffi.lo @TILE_TRUE@am__objects_32 = src/tile/tile.lo src/tile/ffi.lo @XTENSA_TRUE@am__objects_33 = src/xtensa/sysv.lo src/xtensa/ffi.lo @METAG_TRUE@am__objects_34 = src/metag/sysv.lo src/metag/ffi.lo nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ $(am__objects_9) $(am__objects_10) $(am__objects_11) \ $(am__objects_12) $(am__objects_13) $(am__objects_14) \ $(am__objects_15) $(am__objects_16) $(am__objects_17) \ $(am__objects_18) $(am__objects_19) $(am__objects_20) \ $(am__objects_21) $(am__objects_22) $(am__objects_23) \ $(am__objects_24) $(am__objects_25) $(am__objects_26) \ $(am__objects_27) $(am__objects_28) $(am__objects_29) \ $(am__objects_30) $(am__objects_31) $(am__objects_32) \ $(am__objects_33) $(am__objects_34) libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ $(nodist_libffi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ libffi_convenience_la_LIBADD = am__objects_35 = src/prep_cif.lo src/types.lo src/raw_api.lo \ src/java_raw_api.lo src/closures.lo am_libffi_convenience_la_OBJECTS = $(am__objects_35) am__objects_36 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ $(am__objects_4) $(am__objects_5) $(am__objects_6) \ $(am__objects_7) $(am__objects_8) $(am__objects_9) \ $(am__objects_10) $(am__objects_11) $(am__objects_12) \ $(am__objects_13) $(am__objects_14) $(am__objects_15) \ $(am__objects_16) $(am__objects_17) $(am__objects_18) \ $(am__objects_19) $(am__objects_20) $(am__objects_21) \ $(am__objects_22) $(am__objects_23) $(am__objects_24) \ $(am__objects_25) $(am__objects_26) $(am__objects_27) \ $(am__objects_28) $(am__objects_29) $(am__objects_30) \ $(am__objects_31) $(am__objects_32) $(am__objects_33) \ $(am__objects_34) nodist_libffi_convenience_la_OBJECTS = $(am__objects_36) libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ $(nodist_libffi_convenience_la_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CCASFLAGS) $(CCASFLAGS) AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) am__v_CPPAS_0 = @echo " CPPAS " $@; am__v_CPPAS_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \ $(libffi_convenience_la_SOURCES) \ $(nodist_libffi_convenience_la_SOURCES) DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)fficonfig.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LTLDFLAGS = @AM_LTLDFLAGS@ AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PRTDIAG = @PRTDIAG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_enable_builddir_sed = @ax_enable_builddir_sed@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ toolexecdir = @toolexecdir@ toolexeclibdir = @toolexeclibdir@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Poly AUTOMAKE_OPTIONS = foreign subdir-objects ACLOCAL_AMFLAGS = -I m4 SUBDIRS = include testsuite man EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ src/aarch64/ffi.c src/aarch64/ffitarget.h src/aarch64/sysv.S \ build-ios.sh src/alpha/ffi.c src/alpha/osf.S \ src/alpha/ffitarget.h src/arm/ffi.c src/arm/sysv.S \ src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S \ src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S \ src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h \ src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c \ src/mips/n32.S src/mips/o32.S src/metag/ffi.c \ src/metag/ffitarget.h src/metag/sysv.S src/moxie/ffi.c \ src/moxie/ffitarget.h src/moxie/eabi.S src/mips/ffitarget.h \ src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \ src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \ src/microblaze/ffi.c src/microblaze/sysv.S \ src/microblaze/ffitarget.h src/powerpc/ffi.c \ src/powerpc/sysv.S src/powerpc/linux64.S \ src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S \ src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \ src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \ src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \ src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c \ src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S \ src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c \ src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S \ src/x86/win32.S src/x86/darwin.S src/x86/win64.S \ src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S \ src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c \ src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/bfin/ffi.c \ src/bfin/ffitarget.h src/bfin/sysv.S src/frv/eabi.S \ src/frv/ffitarget.h src/dlmalloc.c src/tile/ffi.c \ src/tile/ffitarget.h src/tile/tile.S libtool-version \ src/xtensa/ffitarget.h src/xtensa/ffi.c src/xtensa/sysv.S \ ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ m4/ltversion.m4 src/arm/gentramp.sh src/debug.c msvcc.sh \ generate-ios-source-and-headers.py \ generate-osx-source-and-headers.py \ libffi.xcodeproj/project.pbxproj src/arm/trampoline.S \ libtool-ldflags # Poly - don't try to create the tex info. #info_TEXINFOS = doc/libffi.texi # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and # friends when we are called from the top level Makefile. AM_MAKEFLAGS = \ "AR_FLAGS=$(AR_FLAGS)" \ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ "CFLAGS=$(CFLAGS)" \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ "INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \ "JC1FLAGS=$(JC1FLAGS)" \ "LDFLAGS=$(LDFLAGS)" \ "LIBCFLAGS=$(LIBCFLAGS)" \ "LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \ "MAKE=$(MAKE)" \ "MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \ "PICFLAG=$(PICFLAG)" \ "PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \ "RUNTESTFLAGS=$(RUNTESTFLAGS)" \ "SHELL=$(SHELL)" \ "exec_prefix=$(exec_prefix)" \ "infodir=$(infodir)" \ "libdir=$(libdir)" \ "mandir=$(mandir)" \ "prefix=$(prefix)" \ "AR=$(AR)" \ "AS=$(AS)" \ "CC=$(CC)" \ "CXX=$(CXX)" \ "LD=$(LD)" \ "NM=$(NM)" \ "RANLIB=$(RANLIB)" \ "DESTDIR=$(DESTDIR)" # Subdir rules rely on $(FLAGS_TO_PASS) FLAGS_TO_PASS = $(AM_MAKEFLAGS) MAKEOVERRIDES = toolexeclib_LTLIBRARIES = libffi.la noinst_LTLIBRARIES = libffi_convenience.la libffi_la_SOURCES = src/prep_cif.c src/types.c \ src/raw_api.c src/java_raw_api.c src/closures.c pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libffi.pc nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) $(am__append_7) $(am__append_8) \ $(am__append_9) $(am__append_10) $(am__append_11) \ $(am__append_12) $(am__append_13) $(am__append_14) \ $(am__append_15) $(am__append_16) $(am__append_17) \ $(am__append_18) $(am__append_19) $(am__append_20) \ $(am__append_21) $(am__append_22) $(am__append_23) \ $(am__append_24) $(am__append_25) $(am__append_26) \ $(am__append_27) $(am__append_28) $(am__append_29) \ $(am__append_30) $(am__append_31) $(am__append_32) \ $(am__append_33) $(am__append_34) libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) libffi_la_LDFLAGS = -no-undefined -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src AM_CCASFLAGS = $(AM_CPPFLAGS) all: fficonfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .S .c .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): fficonfig.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h $(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f fficonfig.h stamp-h1 libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ } uninstall-toolexeclibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ done clean-toolexeclibLTLIBRARIES: -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) @list='$(toolexeclib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/mips/$(am__dirstamp): @$(MKDIR_P) src/mips @: > src/mips/$(am__dirstamp) src/mips/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/mips/$(DEPDIR) @: > src/mips/$(DEPDIR)/$(am__dirstamp) src/mips/ffi.lo: src/mips/$(am__dirstamp) \ src/mips/$(DEPDIR)/$(am__dirstamp) src/mips/o32.lo: src/mips/$(am__dirstamp) \ src/mips/$(DEPDIR)/$(am__dirstamp) src/mips/n32.lo: src/mips/$(am__dirstamp) \ src/mips/$(DEPDIR)/$(am__dirstamp) src/bfin/$(am__dirstamp): @$(MKDIR_P) src/bfin @: > src/bfin/$(am__dirstamp) src/bfin/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/bfin/$(DEPDIR) @: > src/bfin/$(DEPDIR)/$(am__dirstamp) src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ src/bfin/$(DEPDIR)/$(am__dirstamp) src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ src/bfin/$(DEPDIR)/$(am__dirstamp) src/x86/$(am__dirstamp): @$(MKDIR_P) src/x86 @: > src/x86/$(am__dirstamp) src/x86/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/x86/$(DEPDIR) @: > src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/ffi.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/sysv.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/freebsd.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/win32.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/win64.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/darwin.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/ffi64.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/x86/darwin64.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/sparc/$(am__dirstamp): @$(MKDIR_P) src/sparc @: > src/sparc/$(am__dirstamp) src/sparc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/sparc/$(DEPDIR) @: > src/sparc/$(DEPDIR)/$(am__dirstamp) src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \ src/sparc/$(DEPDIR)/$(am__dirstamp) src/sparc/v8.lo: src/sparc/$(am__dirstamp) \ src/sparc/$(DEPDIR)/$(am__dirstamp) src/sparc/v9.lo: src/sparc/$(am__dirstamp) \ src/sparc/$(DEPDIR)/$(am__dirstamp) src/alpha/$(am__dirstamp): @$(MKDIR_P) src/alpha @: > src/alpha/$(am__dirstamp) src/alpha/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/alpha/$(DEPDIR) @: > src/alpha/$(DEPDIR)/$(am__dirstamp) src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \ src/alpha/$(DEPDIR)/$(am__dirstamp) src/alpha/osf.lo: src/alpha/$(am__dirstamp) \ src/alpha/$(DEPDIR)/$(am__dirstamp) src/ia64/$(am__dirstamp): @$(MKDIR_P) src/ia64 @: > src/ia64/$(am__dirstamp) src/ia64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/ia64/$(DEPDIR) @: > src/ia64/$(DEPDIR)/$(am__dirstamp) src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \ src/ia64/$(DEPDIR)/$(am__dirstamp) src/ia64/unix.lo: src/ia64/$(am__dirstamp) \ src/ia64/$(DEPDIR)/$(am__dirstamp) src/m32r/$(am__dirstamp): @$(MKDIR_P) src/m32r @: > src/m32r/$(am__dirstamp) src/m32r/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/m32r/$(DEPDIR) @: > src/m32r/$(DEPDIR)/$(am__dirstamp) src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \ src/m32r/$(DEPDIR)/$(am__dirstamp) src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \ src/m32r/$(DEPDIR)/$(am__dirstamp) src/m68k/$(am__dirstamp): @$(MKDIR_P) src/m68k @: > src/m68k/$(am__dirstamp) src/m68k/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/m68k/$(DEPDIR) @: > src/m68k/$(DEPDIR)/$(am__dirstamp) src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \ src/m68k/$(DEPDIR)/$(am__dirstamp) src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \ src/m68k/$(DEPDIR)/$(am__dirstamp) src/moxie/$(am__dirstamp): @$(MKDIR_P) src/moxie @: > src/moxie/$(am__dirstamp) src/moxie/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/moxie/$(DEPDIR) @: > src/moxie/$(DEPDIR)/$(am__dirstamp) src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ src/moxie/$(DEPDIR)/$(am__dirstamp) src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ src/moxie/$(DEPDIR)/$(am__dirstamp) src/microblaze/$(am__dirstamp): @$(MKDIR_P) src/microblaze @: > src/microblaze/$(am__dirstamp) src/microblaze/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/microblaze/$(DEPDIR) @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ src/microblaze/$(DEPDIR)/$(am__dirstamp) src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ src/microblaze/$(DEPDIR)/$(am__dirstamp) src/powerpc/$(am__dirstamp): @$(MKDIR_P) src/powerpc @: > src/powerpc/$(am__dirstamp) src/powerpc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/powerpc/$(DEPDIR) @: > src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \ src/powerpc/$(DEPDIR)/$(am__dirstamp) src/aarch64/$(am__dirstamp): @$(MKDIR_P) src/aarch64 @: > src/aarch64/$(am__dirstamp) src/aarch64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/aarch64/$(DEPDIR) @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ src/aarch64/$(DEPDIR)/$(am__dirstamp) src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ src/aarch64/$(DEPDIR)/$(am__dirstamp) src/arm/$(am__dirstamp): @$(MKDIR_P) src/arm @: > src/arm/$(am__dirstamp) src/arm/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/arm/$(DEPDIR) @: > src/arm/$(DEPDIR)/$(am__dirstamp) src/arm/sysv.lo: src/arm/$(am__dirstamp) \ src/arm/$(DEPDIR)/$(am__dirstamp) src/arm/ffi.lo: src/arm/$(am__dirstamp) \ src/arm/$(DEPDIR)/$(am__dirstamp) src/arm/trampoline.lo: src/arm/$(am__dirstamp) \ src/arm/$(DEPDIR)/$(am__dirstamp) src/avr32/$(am__dirstamp): @$(MKDIR_P) src/avr32 @: > src/avr32/$(am__dirstamp) src/avr32/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/avr32/$(DEPDIR) @: > src/avr32/$(DEPDIR)/$(am__dirstamp) src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ src/avr32/$(DEPDIR)/$(am__dirstamp) src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \ src/avr32/$(DEPDIR)/$(am__dirstamp) src/cris/$(am__dirstamp): @$(MKDIR_P) src/cris @: > src/cris/$(am__dirstamp) src/cris/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/cris/$(DEPDIR) @: > src/cris/$(DEPDIR)/$(am__dirstamp) src/cris/sysv.lo: src/cris/$(am__dirstamp) \ src/cris/$(DEPDIR)/$(am__dirstamp) src/cris/ffi.lo: src/cris/$(am__dirstamp) \ src/cris/$(DEPDIR)/$(am__dirstamp) src/frv/$(am__dirstamp): @$(MKDIR_P) src/frv @: > src/frv/$(am__dirstamp) src/frv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/frv/$(DEPDIR) @: > src/frv/$(DEPDIR)/$(am__dirstamp) src/frv/eabi.lo: src/frv/$(am__dirstamp) \ src/frv/$(DEPDIR)/$(am__dirstamp) src/frv/ffi.lo: src/frv/$(am__dirstamp) \ src/frv/$(DEPDIR)/$(am__dirstamp) src/s390/$(am__dirstamp): @$(MKDIR_P) src/s390 @: > src/s390/$(am__dirstamp) src/s390/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/s390/$(DEPDIR) @: > src/s390/$(DEPDIR)/$(am__dirstamp) src/s390/sysv.lo: src/s390/$(am__dirstamp) \ src/s390/$(DEPDIR)/$(am__dirstamp) src/s390/ffi.lo: src/s390/$(am__dirstamp) \ src/s390/$(DEPDIR)/$(am__dirstamp) src/x86/unix64.lo: src/x86/$(am__dirstamp) \ src/x86/$(DEPDIR)/$(am__dirstamp) src/sh/$(am__dirstamp): @$(MKDIR_P) src/sh @: > src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/sh/$(DEPDIR) @: > src/sh/$(DEPDIR)/$(am__dirstamp) src/sh/sysv.lo: src/sh/$(am__dirstamp) \ src/sh/$(DEPDIR)/$(am__dirstamp) src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) src/sh64/$(am__dirstamp): @$(MKDIR_P) src/sh64 @: > src/sh64/$(am__dirstamp) src/sh64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/sh64/$(DEPDIR) @: > src/sh64/$(DEPDIR)/$(am__dirstamp) src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ src/sh64/$(DEPDIR)/$(am__dirstamp) src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \ src/sh64/$(DEPDIR)/$(am__dirstamp) src/pa/$(am__dirstamp): @$(MKDIR_P) src/pa @: > src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/pa/$(DEPDIR) @: > src/pa/$(DEPDIR)/$(am__dirstamp) src/pa/linux.lo: src/pa/$(am__dirstamp) \ src/pa/$(DEPDIR)/$(am__dirstamp) src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ src/pa/$(DEPDIR)/$(am__dirstamp) src/tile/$(am__dirstamp): @$(MKDIR_P) src/tile @: > src/tile/$(am__dirstamp) src/tile/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/tile/$(DEPDIR) @: > src/tile/$(DEPDIR)/$(am__dirstamp) src/tile/tile.lo: src/tile/$(am__dirstamp) \ src/tile/$(DEPDIR)/$(am__dirstamp) src/tile/ffi.lo: src/tile/$(am__dirstamp) \ src/tile/$(DEPDIR)/$(am__dirstamp) src/xtensa/$(am__dirstamp): @$(MKDIR_P) src/xtensa @: > src/xtensa/$(am__dirstamp) src/xtensa/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/xtensa/$(DEPDIR) @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ src/xtensa/$(DEPDIR)/$(am__dirstamp) src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ src/xtensa/$(DEPDIR)/$(am__dirstamp) src/metag/$(am__dirstamp): @$(MKDIR_P) src/metag @: > src/metag/$(am__dirstamp) src/metag/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/metag/$(DEPDIR) @: > src/metag/$(DEPDIR)/$(am__dirstamp) src/metag/sysv.lo: src/metag/$(am__dirstamp) \ src/metag/$(DEPDIR)/$(am__dirstamp) src/metag/ffi.lo: src/metag/$(am__dirstamp) \ src/metag/$(DEPDIR)/$(am__dirstamp) libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/*.$(OBJEXT) -rm -f src/*.lo -rm -f src/aarch64/*.$(OBJEXT) -rm -f src/aarch64/*.lo -rm -f src/alpha/*.$(OBJEXT) -rm -f src/alpha/*.lo -rm -f src/arm/*.$(OBJEXT) -rm -f src/arm/*.lo -rm -f src/avr32/*.$(OBJEXT) -rm -f src/avr32/*.lo -rm -f src/bfin/*.$(OBJEXT) -rm -f src/bfin/*.lo -rm -f src/cris/*.$(OBJEXT) -rm -f src/cris/*.lo -rm -f src/frv/*.$(OBJEXT) -rm -f src/frv/*.lo -rm -f src/ia64/*.$(OBJEXT) -rm -f src/ia64/*.lo -rm -f src/m32r/*.$(OBJEXT) -rm -f src/m32r/*.lo -rm -f src/m68k/*.$(OBJEXT) -rm -f src/m68k/*.lo -rm -f src/metag/*.$(OBJEXT) -rm -f src/metag/*.lo -rm -f src/microblaze/*.$(OBJEXT) -rm -f src/microblaze/*.lo -rm -f src/mips/*.$(OBJEXT) -rm -f src/mips/*.lo -rm -f src/moxie/*.$(OBJEXT) -rm -f src/moxie/*.lo -rm -f src/pa/*.$(OBJEXT) -rm -f src/pa/*.lo -rm -f src/powerpc/*.$(OBJEXT) -rm -f src/powerpc/*.lo -rm -f src/s390/*.$(OBJEXT) -rm -f src/s390/*.lo -rm -f src/sh/*.$(OBJEXT) -rm -f src/sh/*.lo -rm -f src/sh64/*.$(OBJEXT) -rm -f src/sh64/*.lo -rm -f src/sparc/*.$(OBJEXT) -rm -f src/sparc/*.lo -rm -f src/tile/*.$(OBJEXT) -rm -f src/tile/*.lo -rm -f src/x86/*.$(OBJEXT) -rm -f src/x86/*.lo -rm -f src/xtensa/*.$(OBJEXT) -rm -f src/xtensa/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/metag/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/microblaze/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/tile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/ffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xtensa/$(DEPDIR)/sysv.Plo@am__quote@ .S.o: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< .S.obj: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .S.lo: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCCAS_TRUE@ $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $< .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs -rm -rf src/aarch64/.libs src/aarch64/_libs -rm -rf src/alpha/.libs src/alpha/_libs -rm -rf src/arm/.libs src/arm/_libs -rm -rf src/avr32/.libs src/avr32/_libs -rm -rf src/bfin/.libs src/bfin/_libs -rm -rf src/cris/.libs src/cris/_libs -rm -rf src/frv/.libs src/frv/_libs -rm -rf src/ia64/.libs src/ia64/_libs -rm -rf src/m32r/.libs src/m32r/_libs -rm -rf src/m68k/.libs src/m68k/_libs -rm -rf src/metag/.libs src/metag/_libs -rm -rf src/microblaze/.libs src/microblaze/_libs -rm -rf src/mips/.libs src/mips/_libs -rm -rf src/moxie/.libs src/moxie/_libs -rm -rf src/pa/.libs src/pa/_libs -rm -rf src/powerpc/.libs src/powerpc/_libs -rm -rf src/s390/.libs src/s390/_libs -rm -rf src/sh/.libs src/sh/_libs -rm -rf src/sh64/.libs src/sh64/_libs -rm -rf src/sparc/.libs src/sparc/_libs -rm -rf src/tile/.libs src/tile/_libs -rm -rf src/x86/.libs src/x86/_libs -rm -rf src/xtensa/.libs src/xtensa/_libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) fficonfig.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) -rm -f src/aarch64/$(am__dirstamp) -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) -rm -f src/alpha/$(am__dirstamp) -rm -f src/arm/$(DEPDIR)/$(am__dirstamp) -rm -f src/arm/$(am__dirstamp) -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) -rm -f src/avr32/$(am__dirstamp) -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) -rm -f src/bfin/$(am__dirstamp) -rm -f src/cris/$(DEPDIR)/$(am__dirstamp) -rm -f src/cris/$(am__dirstamp) -rm -f src/frv/$(DEPDIR)/$(am__dirstamp) -rm -f src/frv/$(am__dirstamp) -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp) -rm -f src/ia64/$(am__dirstamp) -rm -f src/m32r/$(DEPDIR)/$(am__dirstamp) -rm -f src/m32r/$(am__dirstamp) -rm -f src/m68k/$(DEPDIR)/$(am__dirstamp) -rm -f src/m68k/$(am__dirstamp) -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) -rm -f src/metag/$(am__dirstamp) -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) -rm -f src/microblaze/$(am__dirstamp) -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) -rm -f src/mips/$(am__dirstamp) -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) -rm -f src/moxie/$(am__dirstamp) -rm -f src/pa/$(DEPDIR)/$(am__dirstamp) -rm -f src/pa/$(am__dirstamp) -rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp) -rm -f src/powerpc/$(am__dirstamp) -rm -f src/s390/$(DEPDIR)/$(am__dirstamp) -rm -f src/s390/$(am__dirstamp) -rm -f src/sh/$(DEPDIR)/$(am__dirstamp) -rm -f src/sh/$(am__dirstamp) -rm -f src/sh64/$(DEPDIR)/$(am__dirstamp) -rm -f src/sh64/$(am__dirstamp) -rm -f src/sparc/$(DEPDIR)/$(am__dirstamp) -rm -f src/sparc/$(am__dirstamp) -rm -f src/tile/$(DEPDIR)/$(am__dirstamp) -rm -f src/tile/$(am__dirstamp) -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) -rm -f src/x86/$(am__dirstamp) -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) -rm -f src/xtensa/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-toolexeclibLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-toolexeclibLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool clean-noinstLTLIBRARIES \ clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \ ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip install-toolexeclibLTLIBRARIES \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES # Poly: don't install anything from this directory install:; @: install-exec:; @: install-data:; @: uninstall:; @: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libffi/README000066400000000000000000000337721265146633400150410ustar00rootroot00000000000000Status ====== libffi-3.0.13 was released on March 17, 2013. Check the libffi web page for updates: . What is libffi? =============== Compilers for high level languages generate code that follow certain conventions. These conventions are necessary, in part, for separate compilation to work. One such convention is the "calling convention". The "calling convention" is essentially a set of assumptions made by the compiler about where function arguments will be found on entry to a function. A "calling convention" also specifies where the return value for a function is found. Some programs may not know at the time of compilation what arguments are to be passed to a function. For instance, an interpreter may be told at run-time about the number and types of arguments used to call a given function. Libffi can be used in such programs to provide a bridge from the interpreter program to compiled code. The libffi library provides a portable, high level programming interface to various calling conventions. This allows a programmer to call any function specified by a call interface description at run time. FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the interface that allows code written in one language to call code written in another language. The libffi library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. A layer must exist above libffi that handles type conversions for values passed between the two languages. Supported Platforms =================== Libffi has been ported to many different platforms. For specific configuration details and testing status, please refer to the wiki page here: http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.13 At the time of release, the following basic configurations have been tested: |-----------------+------------------+-------------------------| | Architecture | Operating System | Compiler | |-----------------+------------------+-------------------------| | AArch64 | Linux | GCC | | Alpha | Linux | GCC | | Alpha | Tru64 | GCC | | ARM | Linux | GCC | | ARM | iOS | GCC | | AVR32 | Linux | GCC | | Blackfin | uClinux | GCC | | HPPA | HPUX | GCC | | IA-64 | Linux | GCC | | M68K | FreeMiNT | GCC | | M68K | Linux | GCC | | M68K | RTEMS | GCC | | Meta | Linux | GCC | | MicroBlaze | Linux | GCC | | MIPS | IRIX | GCC | | MIPS | Linux | GCC | | MIPS | RTEMS | GCC | | MIPS64 | Linux | GCC | | Moxie | Bare metal | GCC | PowerPC 32-bit | AIX | IBM XL C | | PowerPC 64-bit | AIX | IBM XL C | | PowerPC | AMIGA | GCC | | PowerPC | Linux | GCC | | PowerPC | Mac OSX | GCC | | PowerPC | FreeBSD | GCC | | PowerPC 64-bit | FreeBSD | GCC | | PowerPC 64-bit | Linux | GCC | | S390 | Linux | GCC | | S390X | Linux | GCC | | SPARC | Linux | GCC | | SPARC | Solaris | GCC | | SPARC | Solaris | Oracle Solaris Studio C | | SPARC64 | Linux | GCC | | SPARC64 | FreeBSD | GCC | | SPARC64 | Solaris | Oracle Solaris Studio C | | TILE-Gx/TILEPro | Linux | GCC | | X86 | FreeBSD | GCC | | X86 | GNU HURD | GCC | | X86 | Interix | GCC | | X86 | kFreeBSD | GCC | | X86 | Linux | GCC | | X86 | Mac OSX | GCC | | X86 | OpenBSD | GCC | | X86 | OS/2 | GCC | | X86 | Solaris | GCC | | X86 | Solaris | Oracle Solaris Studio C | | X86 | Windows/Cygwin | GCC | | X86 | Windows/MingW | GCC | | X86-64 | FreeBSD | GCC | | X86-64 | Linux | GCC | | X86-64 | Linux/x32 | GCC | | X86-64 | OpenBSD | GCC | | X86-64 | Solaris | Oracle Solaris Studio C | | X86-64 | Windows/MingW | GCC | | Xtensa | Linux | GCC | |-----------------+------------------+-------------------------| Please send additional platform test results to libffi-discuss@sourceware.org and feel free to update the wiki page above. Installing libffi ================= First you must configure the distribution for your particular system. Go to the directory you wish to build libffi in and run the "configure" program found in the root directory of the libffi source distribution. You may want to tell configure where to install the libffi library and header files. To do that, use the --prefix configure switch. Libffi will install under /usr/local by default. If you want to enable extra run-time debugging checks use the the --enable-debug configure switch. This is useful when your program dies mysteriously while using libffi. Another useful configure switch is --enable-purify-safety. Using this will add some extra code which will suppress certain warnings when you are using Purify with libffi. Only use this switch when using Purify, as it will slow down the library. It's also possible to build libffi on Windows platforms with Microsoft's Visual C++ compiler. In this case, use the msvcc.sh wrapper script during configuration like so: path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\" For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64". You may also need to specify --build appropriately. When building with MSVC under a MingW environment, you may need to remove the line in configure that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not present in MingW, and is not required when using MingW-style paths.) For iOS builds, the 'libffi.xcodeproj' Xcode project is available. Configure has many other options. Use "configure --help" to see them all. Once configure has finished, type "make". Note that you must be using GNU make. You can ftp GNU make from ftp.gnu.org:/pub/gnu/make . To ensure that libffi is working as advertised, type "make check". This will require that you have DejaGNU installed. To install the library and header files, type "make install". History ======= See the ChangeLog files for details. 3.0.13 Mar-17-13 Add Meta support. Add missing Moxie bits. Fix stack alignment bug on 32-bit x86. Build fix for m68000 targets. Build fix for soft-float Power targets. Fix the install dir location for some platforms when building with GCC (OS X, Solaris). Fix Cygwin regression. 3.0.12 Feb-11-13 Add Moxie support. Add AArch64 support. Add Blackfin support. Add TILE-Gx/TILEPro support. Add MicroBlaze support. Add Xtensa support. Add support for PaX enabled kernels with MPROTECT. Add support for native vendor compilers on Solaris and AIX. Work around LLVM/GCC interoperability issue on x86_64. 3.0.11 Apr-11-12 Lots of build fixes. Add Amiga newer MacOS support. Add support for variadic functions (ffi_prep_cif_var). Add Linux/x32 support. Add thiscall, fastcall and MSVC cdecl support on Windows. Add Amiga and newer MacOS support. Add m68k FreeMiNT support. Integration with iOS' xcode build tools. Fix Octeon and MC68881 support. Fix code pessimizations. 3.0.10 Aug-23-11 Add support for Apple's iOS. Add support for ARM VFP ABI. Add RTEMS support for MIPS and M68K. Fix instruction cache clearing problems on ARM and SPARC. Fix the N64 build on mips-sgi-irix6.5. Enable builds with Microsoft's compiler. Enable x86 builds with Oracle's Solaris compiler. Fix support for calling code compiled with Oracle's Sparc Solaris compiler. Testsuite fixes for Tru64 Unix. Additional platform support. 3.0.9 Dec-31-09 Add AVR32 and win64 ports. Add ARM softfp support. Many fixes for AIX, Solaris, HP-UX, *BSD. Several PowerPC and x86-64 bug fixes. Build DLL for windows. 3.0.8 Dec-19-08 Add *BSD, BeOS, and PA-Linux support. 3.0.7 Nov-11-08 Fix for ppc FreeBSD. (thanks to Andreas Tobler) 3.0.6 Jul-17-08 Fix for closures on sh. Mark the sh/sh64 stack as non-executable. (both thanks to Kaz Kojima) 3.0.5 Apr-3-08 Fix libffi.pc file. Fix #define ARM for IcedTea users. Fix x86 closure bug. 3.0.4 Feb-24-08 Fix x86 OpenBSD configury. 3.0.3 Feb-22-08 Enable x86 OpenBSD thanks to Thomas Heller, and x86-64 FreeBSD thanks to Björn König and Andreas Tobler. Clean up test instruction in README. 3.0.2 Feb-21-08 Improved x86 FreeBSD support. Thanks to Björn König. 3.0.1 Feb-15-08 Fix instruction cache flushing bug on MIPS. Thanks to David Daney. 3.0.0 Feb-15-08 Many changes, mostly thanks to the GCC project. Cygnus Solutions is now Red Hat. [10 years go by...] 1.20 Oct-5-98 Raffaele Sena produces ARM port. 1.19 Oct-5-98 Fixed x86 long double and long long return support. m68k bug fixes from Andreas Schwab. Patch for DU assembler compatibility for the Alpha from Richard Henderson. 1.18 Apr-17-98 Bug fixes and MIPS configuration changes. 1.17 Feb-24-98 Bug fixes and m68k port from Andreas Schwab. PowerPC port from Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. 1.16 Feb-11-98 Richard Henderson produces Alpha port. 1.15 Dec-4-97 Fixed an n32 ABI bug. New libtool, auto* support. 1.14 May-13-97 libtool is now used to generate shared and static libraries. Fixed a minor portability problem reported by Russ McManus . 1.13 Dec-2-96 Added --enable-purify-safety to keep Purify from complaining about certain low level code. Sparc fix for calling functions with < 6 args. Linux x86 a.out fix. 1.12 Nov-22-96 Added missing ffi_type_void, needed for supporting void return types. Fixed test case for non MIPS machines. Cygnus Support is now Cygnus Solutions. 1.11 Oct-30-96 Added notes about GNU make. 1.10 Oct-29-96 Added configuration fix for non GNU compilers. 1.09 Oct-29-96 Added --enable-debug configure switch. Clean-ups based on LCLint feedback. ffi_mips.h is always installed. Many configuration fixes. Fixed ffitest.c for sparc builds. 1.08 Oct-15-96 Fixed n32 problem. Many clean-ups. 1.07 Oct-14-96 Gordon Irlam rewrites v8.S again. Bug fixes. 1.06 Oct-14-96 Gordon Irlam improved the sparc port. 1.05 Oct-14-96 Interface changes based on feedback. 1.04 Oct-11-96 Sparc port complete (modulo struct passing bug). 1.03 Oct-10-96 Passing struct args, and returning struct values works for all architectures/calling conventions. Expanded tests. 1.02 Oct-9-96 Added SGI n32 support. Fixed bugs in both o32 and Linux support. Added "make test". 1.01 Oct-8-96 Fixed float passing bug in mips version. Restructured some of the code. Builds cleanly with SGI tools. 1.00 Oct-7-96 First release. No public announcement. Authors & Credits ================= libffi was originally written by Anthony Green . The developers of the GNU Compiler Collection project have made innumerable valuable contributions. See the ChangeLog file for details. Some of the ideas behind libffi were inspired by Gianni Mariani's free gencall library for Silicon Graphics machines. The closure mechanism was designed and implemented by Kresten Krab Thorup. Major processor architecture ports were contributed by the following developers: aarch64 Marcus Shawcroft, James Greenhalgh alpha Richard Henderson arm Raffaele Sena blackfin Alexandre Keunecke I. de Mendonca cris Simon Posnjak, Hans-Peter Nilsson frv Anthony Green ia64 Hans Boehm m32r Kazuhiro Inaoka m68k Andreas Schwab microblaze Nathan Rossi mips Anthony Green, Casey Marshall mips64 David Daney moxie Anthony Green pa Randolph Chung, Dave Anglin, Andreas Tobler powerpc Geoffrey Keating, Andreas Tobler, David Edelsohn, John Hornkvist powerpc64 Jakub Jelinek s390 Gerhard Tonn, Ulrich Weigand sh Kaz Kojima sh64 Kaz Kojima sparc Anthony Green, Gordon Irlam tile-gx/tilepro Walter Lee x86 Anthony Green, Jon Beniston x86-64 Bo Thorsen xtensa Chris Zankel Jesper Skov and Andrew Haley both did more than their fair share of stepping through the code and tracking down bugs. Thanks also to Tom Tromey for bug fixes, documentation and configuration help. Thanks to Jim Blandy, who provided some useful feedback on the libffi interface. Andreas Tobler has done a tremendous amount of work on the testsuite. Alex Oliva solved the executable page problem for SElinux. The list above is almost certainly incomplete and inaccurate. I'm happy to make corrections or additions upon request. If you have a problem, or have found a bug, please send a note to the author at green@moxielogic.com, or the project mailing list at libffi-discuss@sourceware.org. polyml-5.6/libffi/acinclude.m4000066400000000000000000000063111265146633400163370ustar00rootroot00000000000000# mmap(2) blacklisting. Some platforms provide the mmap library routine # but don't support all of the features we need from it. AC_DEFUN([AC_FUNC_MMAP_BLACKLIST], [ AC_CHECK_HEADER([sys/mman.h], [libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no]) AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no]) if test "$libffi_header_sys_mman_h" != yes \ || test "$libffi_func_mmap" != yes; then ac_cv_func_mmap_file=no ac_cv_func_mmap_dev_zero=no ac_cv_func_mmap_anon=no else AC_CACHE_CHECK([whether read-only mmap of a plain file works], ac_cv_func_mmap_file, [# Add a system to this blacklist if # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a # memory area containing the same data that you'd get if you applied # read() to the same fd. The only system known to have a problem here # is VMS, where text files have record structure. case "$host_os" in vms* | ultrix*) ac_cv_func_mmap_file=no ;; *) ac_cv_func_mmap_file=yes;; esac]) AC_CACHE_CHECK([whether mmap from /dev/zero works], ac_cv_func_mmap_dev_zero, [# Add a system to this blacklist if it has mmap() but /dev/zero # does not exist, or if mmapping /dev/zero does not give anonymous # zeroed pages with both the following properties: # 1. If you map N consecutive pages in with one call, and then # unmap any subset of those pages, the pages that were not # explicitly unmapped remain accessible. # 2. If you map two adjacent blocks of memory and then unmap them # both at once, they must both go away. # Systems known to be in this category are Windows (all variants), # VMS, and Darwin. case "$host_os" in vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) ac_cv_func_mmap_dev_zero=no ;; *) ac_cv_func_mmap_dev_zero=yes;; esac]) # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon, [AC_TRY_COMPILE( [#include #include #include #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif ], [int n = MAP_ANONYMOUS;], ac_cv_decl_map_anon=yes, ac_cv_decl_map_anon=no)]) if test $ac_cv_decl_map_anon = no; then ac_cv_func_mmap_anon=no else AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], ac_cv_func_mmap_anon, [# Add a system to this blacklist if it has mmap() and MAP_ANON or # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) # doesn't give anonymous zeroed pages with the same properties listed # above for use of /dev/zero. # Systems known to be in this category are Windows, VMS, and SCO Unix. case "$host_os" in vms* | cygwin* | pe | mingw* | sco* | udk* ) ac_cv_func_mmap_anon=no ;; *) ac_cv_func_mmap_anon=yes;; esac]) fi fi if test $ac_cv_func_mmap_file = yes; then AC_DEFINE(HAVE_MMAP_FILE, 1, [Define if read-only mmap of a plain file works.]) fi if test $ac_cv_func_mmap_dev_zero = yes; then AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, [Define if mmap of /dev/zero works.]) fi if test $ac_cv_func_mmap_anon = yes; then AC_DEFINE(HAVE_MMAP_ANON, 1, [Define if mmap with MAP_ANON(YMOUS) works.]) fi ]) polyml-5.6/libffi/aclocal.m4000066400000000000000000002144131265146633400160120ustar00rootroot00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- # # Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. # Written by Thomas Tanner, 1999 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 18 LTDL_INIT # LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) # ------------------------------------------ # DIRECTORY contains the libltdl sources. It is okay to call this # function multiple times, as long as the same DIRECTORY is always given. AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) _$0($*) ])# LT_CONFIG_LTDL_DIR # We break this out into a separate macro, so that we can call it safely # internally without being caught accidentally by the sed scan in libtoolize. m4_defun([_LT_CONFIG_LTDL_DIR], [dnl remove trailing slashes m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) m4_case(_LTDL_DIR, [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.' m4_if(_ARG_DIR, [.], [], [m4_define([_LTDL_DIR], _ARG_DIR) _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], [m4_if(_ARG_DIR, _LTDL_DIR, [], [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])]) m4_popdef([_ARG_DIR]) ])# _LT_CONFIG_LTDL_DIR # Initialise: m4_define([_LTDL_DIR], []) # _LT_BUILD_PREFIX # ---------------- # If Autoconf is new enough, expand to `${top_build_prefix}', otherwise # to `${top_builddir}/'. m4_define([_LT_BUILD_PREFIX], [m4_ifdef([AC_AUTOCONF_VERSION], [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], [${top_build_prefix}], [${top_builddir}/])], [${top_build_prefix}])], [${top_builddir}/])[]dnl ]) # LTDL_CONVENIENCE # ---------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with # '${top_build_prefix}' if available, otherwise with '${top_builddir}/', # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_build_prefix, top_builddir, and top_srcdir appropriately # in your Makefiles. AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl dnl Although the argument is deprecated and no longer documented, dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one dnl here make sure it is the same as any other declaration of libltdl's dnl location! This also ensures lt_ltdl_dir is set when configure.ac is dnl not yet using an explicit LT_CONFIG_LTDL_DIR. m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl _$0() ])# LTDL_CONVENIENCE # AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, # now we have LT_CONFIG_LTDL_DIR: AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) _LTDL_CONVENIENCE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) # _LTDL_CONVENIENCE # ----------------- # Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). m4_defun([_LTDL_CONVENIENCE], [case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" LTDLDEPS=$LIBLTDL LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" AC_SUBST([LIBLTDL]) AC_SUBST([LTDLDEPS]) AC_SUBST([LTDLINCL]) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" AC_SUBST([INCLTDL]) ])# _LTDL_CONVENIENCE # LTDL_INSTALLABLE # ---------------- # sets LIBLTDL to the link flags for the libltdl installable library # and LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl # is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if # available, otherwise with '${top_builddir}/', and LTDLINCL will be # prefixed with '${top_srcdir}/' (note the single quotes!). If your # package is not flat and you're not using automake, define top_build_prefix, # top_builddir, and top_srcdir appropriately in your Makefiles. # In the future, this macro may have to be called after LT_INIT. AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl dnl Although the argument is deprecated and no longer documented, dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one dnl here make sure it is the same as any other declaration of libltdl's dnl location! This also ensures lt_ltdl_dir is set when configure.ac is dnl not yet using an explicit LT_CONFIG_LTDL_DIR. m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl _$0() ])# LTDL_INSTALLABLE # AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, # now we have LT_CONFIG_LTDL_DIR: AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) _LTDL_INSTALLABLE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) # _LTDL_INSTALLABLE # ----------------- # Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). m4_defun([_LTDL_INSTALLABLE], [if test -f $prefix/lib/libltdl.la; then lt_save_LDFLAGS="$LDFLAGS" LDFLAGS="-L$prefix/lib $LDFLAGS" AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) LDFLAGS="$lt_save_LDFLAGS" if test x"${lt_lib_ltdl-no}" = xyes; then if test x"$enable_ltdl_install" != xyes; then # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install']) enable_ltdl_install=no fi elif test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) fi fi # If configure.ac declared an installable ltdl, and the user didn't override # with --disable-ltdl-install, we will install the shipped libltdl. case $enable_ltdl_install in no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLDEPS= LTDLINCL= ;; *) enable_ltdl_install=yes ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" LTDLDEPS=$LIBLTDL LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" ;; esac AC_SUBST([LIBLTDL]) AC_SUBST([LTDLDEPS]) AC_SUBST([LTDLINCL]) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" AC_SUBST([INCLTDL]) ])# LTDL_INSTALLABLE # _LTDL_MODE_DISPATCH # ------------------- m4_define([_LTDL_MODE_DISPATCH], [dnl If _LTDL_DIR is `.', then we are configuring libltdl itself: m4_if(_LTDL_DIR, [], [], dnl if _LTDL_MODE was not set already, the default value is `subproject': [m4_case(m4_default(_LTDL_MODE, [subproject]), [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], [recursive], [], [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl dnl Be careful not to expand twice: m4_define([$0], []) ])# _LTDL_MODE_DISPATCH # _LT_LIBOBJ(MODULE_NAME) # ----------------------- # Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead # of into LIBOBJS. AC_DEFUN([_LT_LIBOBJ], [ m4_pattern_allow([^_LT_LIBOBJS$]) _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" ])# _LT_LIBOBJS # LTDL_INIT([OPTIONS]) # -------------------- # Clients of libltdl can use this macro to allow the installer to # choose between a shipped copy of the ltdl sources or a preinstalled # version of the library. If the shipped ltdl sources are not in a # subdirectory named libltdl, the directory name must be given by # LT_CONFIG_LTDL_DIR. AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) dnl We need to keep our own list of libobjs separate from our parent project, dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while dnl we look for our own LIBOBJs. m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) m4_pushdef([AC_LIBSOURCES]) dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: m4_if(_LTDL_MODE, [], [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) AC_ARG_WITH([included_ltdl], [AS_HELP_STRING([--with-included-ltdl], [use the GNU ltdl sources included here])]) if test "x$with_included_ltdl" != xyes; then # We are not being forced to use the included libltdl sources, so # decide whether there is a useful installed version we can use. AC_CHECK_HEADER([ltdl.h], [AC_CHECK_DECL([lt_dlinterface_register], [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], [with_included_ltdl=no], [with_included_ltdl=yes])], [with_included_ltdl=yes], [AC_INCLUDES_DEFAULT #include ])], [with_included_ltdl=yes], [AC_INCLUDES_DEFAULT] ) fi dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE dnl was called yet, then for old times' sake, we assume libltdl is in an dnl eponymous directory: AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) AC_ARG_WITH([ltdl_include], [AS_HELP_STRING([--with-ltdl-include=DIR], [use the ltdl headers installed in DIR])]) if test -n "$with_ltdl_include"; then if test -f "$with_ltdl_include/ltdl.h"; then : else AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) fi else with_ltdl_include=no fi AC_ARG_WITH([ltdl_lib], [AS_HELP_STRING([--with-ltdl-lib=DIR], [use the libltdl.la installed in DIR])]) if test -n "$with_ltdl_lib"; then if test -f "$with_ltdl_lib/libltdl.la"; then : else AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) fi else with_ltdl_lib=no fi case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in ,yes,no,no,) m4_case(m4_default(_LTDL_TYPE, [convenience]), [convenience], [_LTDL_CONVENIENCE], [installable], [_LTDL_INSTALLABLE], [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) ;; ,no,no,no,) # If the included ltdl is not to be used, then use the # preinstalled libltdl we found. AC_DEFINE([HAVE_LTDL], [1], [Define this if a modern libltdl is already installed]) LIBLTDL=-lltdl LTDLDEPS= LTDLINCL= ;; ,no*,no,*) AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) ;; *) with_included_ltdl=no LIBLTDL="-L$with_ltdl_lib -lltdl" LTDLDEPS= LTDLINCL="-I$with_ltdl_include" ;; esac INCLTDL="$LTDLINCL" # Report our decision... AC_MSG_CHECKING([where to find libltdl headers]) AC_MSG_RESULT([$LTDLINCL]) AC_MSG_CHECKING([where to find libltdl library]) AC_MSG_RESULT([$LIBLTDL]) _LTDL_SETUP dnl restore autoconf definition. m4_popdef([AC_LIBOBJ]) m4_popdef([AC_LIBSOURCES]) AC_CONFIG_COMMANDS_PRE([ _ltdl_libobjs= _ltdl_ltlibobjs= if test -n "$_LT_LIBOBJS"; then # Remove the extension. _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" done fi AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) ]) # Only expand once: m4_define([LTDL_INIT]) ])# LTDL_INIT # Old names: AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIB_LTDL], []) dnl AC_DEFUN([AC_WITH_LTDL], []) dnl AC_DEFUN([LT_WITH_LTDL], []) # _LTDL_SETUP # ----------- # Perform all the checks necessary for compilation of the ltdl objects # -- including compiler checks and header checks. This is a public # interface mainly for the benefit of libltdl's own configure.ac, most # other users should call LTDL_INIT instead. AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_SYS_MODULE_EXT])dnl AC_REQUIRE([LT_SYS_MODULE_PATH])dnl AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl AC_REQUIRE([LT_LIB_DLLOAD])dnl AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl AC_REQUIRE([gl_FUNC_ARGZ])dnl m4_require([_LT_CHECK_OBJDIR])dnl m4_require([_LT_HEADER_DLFCN])dnl m4_require([_LT_CHECK_DLPREOPEN])dnl m4_require([_LT_DECL_SED])dnl dnl Don't require this, or it will be expanded earlier than the code dnl that sets the variables it relies on: _LT_ENABLE_INSTALL dnl _LTDL_MODE specific code must be called at least once: _LTDL_MODE_DISPATCH # In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS # the user used. This is so that ltdl.h can pick up the parent projects # config.h file, The first file in AC_CONFIG_HEADERS must contain the # definitions required by ltdl.c. # FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). AC_CONFIG_COMMANDS_PRE([dnl m4_pattern_allow([^LT_CONFIG_H$])dnl m4_ifset([AH_HEADER], [LT_CONFIG_H=AH_HEADER], [m4_ifset([AC_LIST_HEADERS], [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], [])])]) AC_SUBST([LT_CONFIG_H]) AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], [], [], [AC_INCLUDES_DEFAULT]) AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) m4_pattern_allow([LT_LIBEXT])dnl AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) name= eval "lt_libprefix=\"$libname_spec\"" m4_pattern_allow([LT_LIBPREFIX])dnl AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) name=ltdl eval "LTDLOPEN=\"$libname_spec\"" AC_SUBST([LTDLOPEN]) ])# _LTDL_SETUP # _LT_ENABLE_INSTALL # ------------------ m4_define([_LT_ENABLE_INSTALL], [AC_ARG_ENABLE([ltdl-install], [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) case ,${enable_ltdl_install},${enable_ltdl_convenience} in *yes*) ;; *) enable_ltdl_convenience=yes ;; esac m4_ifdef([AM_CONDITIONAL], [AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)]) ])# _LT_ENABLE_INSTALL # LT_SYS_DLOPEN_DEPLIBS # --------------------- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether deplibs are loaded by dlopen], [lt_cv_sys_dlopen_deplibs], [# PORTME does your system automatically load deplibs for dlopen? # or its logical equivalent (e.g. shl_load for HP-UX < 11) # For now, we just catch OSes we know something about -- in the # future, we'll try test this programmatically. lt_cv_sys_dlopen_deplibs=unknown case $host_os in aix3*|aix4.1.*|aix4.2.*) # Unknown whether this is true for these versions of AIX, but # we want this `case' here to explicitly catch those versions. lt_cv_sys_dlopen_deplibs=unknown ;; aix[[4-9]]*) lt_cv_sys_dlopen_deplibs=yes ;; amigaos*) case $host_cpu in powerpc) lt_cv_sys_dlopen_deplibs=no ;; esac ;; darwin*) # Assuming the user has installed a libdl from somewhere, this is true # If you are looking for one http://www.opendarwin.org/projects/dlcompat lt_cv_sys_dlopen_deplibs=yes ;; freebsd* | dragonfly*) lt_cv_sys_dlopen_deplibs=yes ;; gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) # GNU and its variants, using gnu ld.so (Glibc) lt_cv_sys_dlopen_deplibs=yes ;; hpux10*|hpux11*) lt_cv_sys_dlopen_deplibs=yes ;; interix*) lt_cv_sys_dlopen_deplibs=yes ;; irix[[12345]]*|irix6.[[01]]*) # Catch all versions of IRIX before 6.2, and indicate that we don't # know how it worked for any of those versions. lt_cv_sys_dlopen_deplibs=unknown ;; irix*) # The case above catches anything before 6.2, and it's known that # at 6.2 and later dlopen does load deplibs. lt_cv_sys_dlopen_deplibs=yes ;; netbsd* | netbsdelf*-gnu) lt_cv_sys_dlopen_deplibs=yes ;; openbsd*) lt_cv_sys_dlopen_deplibs=yes ;; osf[[1234]]*) # dlopen did load deplibs (at least at 4.x), but until the 5.x series, # it did *not* use an RPATH in a shared library to find objects the # library depends on, so we explicitly say `no'. lt_cv_sys_dlopen_deplibs=no ;; osf5.0|osf5.0a|osf5.1) # dlopen *does* load deplibs and with the right loader patch applied # it even uses RPATH in a shared library to search for shared objects # that the library depends on, but there's no easy way to know if that # patch is installed. Since this is the case, all we can really # say is unknown -- it depends on the patch being installed. If # it is, this changes to `yes'. Without it, it would be `no'. lt_cv_sys_dlopen_deplibs=unknown ;; osf*) # the two cases above should catch all versions of osf <= 5.1. Read # the comments above for what we know about them. # At > 5.1, deplibs are loaded *and* any RPATH in a shared library # is used to find them so we can finally say `yes'. lt_cv_sys_dlopen_deplibs=yes ;; qnx*) lt_cv_sys_dlopen_deplibs=yes ;; solaris*) lt_cv_sys_dlopen_deplibs=yes ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) libltdl_cv_sys_dlopen_deplibs=yes ;; esac ]) if test "$lt_cv_sys_dlopen_deplibs" != yes; then AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], [Define if the OS needs help to load dependent libraries for dlopen().]) fi ])# LT_SYS_DLOPEN_DEPLIBS # Old name: AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) # LT_SYS_MODULE_EXT # ----------------- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([which extension is used for runtime loadable modules], [libltdl_cv_shlibext], [ module=yes eval libltdl_cv_shlibext=$shrext_cmds module=no eval libltdl_cv_shrext=$shrext_cmds ]) if test -n "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_MODULE_EXT])dnl AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], [Define to the extension used for runtime loadable modules, say, ".so".]) fi if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_SHARED_EXT])dnl AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], [Define to the shared library suffix, say, ".dylib".]) fi ])# LT_SYS_MODULE_EXT # Old name: AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) # LT_SYS_MODULE_PATH # ------------------ AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([which variable specifies run-time module search path], [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) if test -n "$lt_cv_module_path_var"; then m4_pattern_allow([LT_MODULE_PATH_VAR])dnl AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], [Define to the name of the environment variable that determines the run-time module search path.]) fi ])# LT_SYS_MODULE_PATH # Old name: AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) # LT_SYS_DLSEARCH_PATH # -------------------- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([for the default library search path], [lt_cv_sys_dlsearch_path], [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) if test -n "$lt_cv_sys_dlsearch_path"; then sys_dlsearch_path= for dir in $lt_cv_sys_dlsearch_path; do if test -z "$sys_dlsearch_path"; then sys_dlsearch_path="$dir" else sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" fi done m4_pattern_allow([LT_DLSEARCH_PATH])dnl AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], [Define to the system default library search path.]) fi ])# LT_SYS_DLSEARCH_PATH # Old name: AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) # _LT_CHECK_DLPREOPEN # ------------------- m4_defun([_LT_CHECK_DLPREOPEN], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], [libltdl_cv_preloaded_symbols], [if test -n "$lt_cv_sys_global_symbol_pipe"; then libltdl_cv_preloaded_symbols=yes else libltdl_cv_preloaded_symbols=no fi ]) if test x"$libltdl_cv_preloaded_symbols" = xyes; then AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], [Define if libtool can extract symbol lists from object files.]) fi ])# _LT_CHECK_DLPREOPEN # LT_LIB_DLLOAD # ------------- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) LT_DLLOADERS= AC_SUBST([LT_DLLOADERS]) AC_LANG_PUSH([C]) LIBADD_DLOPEN= AC_SEARCH_LIBS([dlopen], [dl], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) if test "$ac_cv_search_dlopen" != "none required" ; then LIBADD_DLOPEN="-ldl" fi libltdl_cv_lib_dl_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H # include #endif ]], [[dlopen(0, 0);]])], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) libltdl_cv_func_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], [AC_CHECK_LIB([svld], [dlopen], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes then lt_save_LIBS="$LIBS" LIBS="$LIBS $LIBADD_DLOPEN" AC_CHECK_FUNCS([dlerror]) LIBS="$lt_save_LIBS" fi AC_SUBST([LIBADD_DLOPEN]) LIBADD_SHL_LOAD= AC_CHECK_FUNC([shl_load], [AC_DEFINE([HAVE_SHL_LOAD], [1], [Define if you have the shl_load function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], [AC_CHECK_LIB([dld], [shl_load], [AC_DEFINE([HAVE_SHL_LOAD], [1], [Define if you have the shl_load function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" LIBADD_SHL_LOAD="-ldld"])]) AC_SUBST([LIBADD_SHL_LOAD]) case $host_os in darwin[[1567]].*) # We only want this for pre-Mac OS X 10.4. AC_CHECK_FUNC([_dyld_func_lookup], [AC_DEFINE([HAVE_DYLD], [1], [Define if you have the _dyld_func_lookup function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) ;; beos*) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" ;; cygwin* | mingw* | os2* | pw32*) AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" ;; esac AC_CHECK_LIB([dld], [dld_link], [AC_DEFINE([HAVE_DLD], [1], [Define if you have the GNU dld library.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) AC_SUBST([LIBADD_DLD_LINK]) m4_pattern_allow([^LT_DLPREOPEN$]) LT_DLPREOPEN= if test -n "$LT_DLLOADERS" then for lt_loader in $LT_DLLOADERS; do LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " done AC_DEFINE([HAVE_LIBDLLOADER], [1], [Define if libdlloader will be built on this platform]) fi AC_SUBST([LT_DLPREOPEN]) dnl This isn't used anymore, but set it for backwards compatibility LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" AC_SUBST([LIBADD_DL]) AC_LANG_POP ])# LT_LIB_DLLOAD # Old name: AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_DLLIB], []) # LT_SYS_SYMBOL_USCORE # -------------------- # does the compiler prefix global symbols with an underscore? AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl AC_CACHE_CHECK([for _ prefix in compiled symbols], [lt_cv_sys_symbol_underscore], [lt_cv_sys_symbol_underscore=no cat > conftest.$ac_ext <<_LT_EOF void nm_test_func(){} int main(){nm_test_func;return 0;} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. ac_nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then # See whether the symbols have a leading underscore. if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then lt_cv_sys_symbol_underscore=yes else if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then : else echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD fi fi else echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.c >&AS_MESSAGE_LOG_FD fi rm -rf conftest* ]) sys_symbol_underscore=$lt_cv_sys_symbol_underscore AC_SUBST([sys_symbol_underscore]) ])# LT_SYS_SYMBOL_USCORE # Old name: AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) # LT_FUNC_DLSYM_USCORE # -------------------- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl if test x"$lt_cv_sys_symbol_underscore" = xyes; then if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then AC_CACHE_CHECK([whether we have to add an underscore for dlsym], [libltdl_cv_need_uscore], [libltdl_cv_need_uscore=unknown save_LIBS="$LIBS" LIBS="$LIBS $LIBADD_DLOPEN" _LT_TRY_DLOPEN_SELF( [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], [], [libltdl_cv_need_uscore=cross]) LIBS="$save_LIBS" ]) fi fi if test x"$libltdl_cv_need_uscore" = xyes; then AC_DEFINE([NEED_USCORE], [1], [Define if dlsym() requires a leading underscore in symbol names.]) fi ])# LT_FUNC_DLSYM_USCORE # Old name: AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Figure out how to run the assembler. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AS # ---------- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code. AC_REQUIRE([AC_PROG_CC]) test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/asmcfi.m4]) m4_include([m4/ax_append_flag.m4]) m4_include([m4/ax_cc_maxopt.m4]) m4_include([m4/ax_cflags_warn_all.m4]) m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_compiler_vendor.m4]) m4_include([m4/ax_configure_args.m4]) m4_include([m4/ax_enable_builddir.m4]) m4_include([m4/ax_gcc_archflag.m4]) m4_include([m4/ax_gcc_x86_cpuid.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([acinclude.m4]) polyml-5.6/libffi/build-ios.sh000077500000000000000000000040301265146633400163700ustar00rootroot00000000000000#!/bin/sh PLATFORM_IOS=/Developer/Platforms/iPhoneOS.platform/ PLATFORM_IOS_SIM=/Developer/Platforms/iPhoneSimulator.platform/ SDK_IOS_VERSION="4.2" MIN_IOS_VERSION="3.0" OUTPUT_DIR="universal-ios" build_target () { local platform=$1 local sdk=$2 local arch=$3 local triple=$4 local builddir=$5 mkdir -p "${builddir}" pushd "${builddir}" export CC="${platform}"/Developer/usr/bin/gcc-4.2 export CFLAGS="-arch ${arch} -isysroot ${sdk} -miphoneos-version-min=${MIN_IOS_VERSION}" ../configure --host=${triple} && make popd } # Build all targets build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv6 arm-apple-darwin10 armv6-ios build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv7 arm-apple-darwin10 armv7-ios build_target "${PLATFORM_IOS_SIM}" "${PLATFORM_IOS_SIM}/Developer/SDKs/iPhoneSimulator${SDK_IOS_VERSION}.sdk/" i386 i386-apple-darwin10 i386-ios-sim # Create universal output directories mkdir -p "${OUTPUT_DIR}" mkdir -p "${OUTPUT_DIR}/include" mkdir -p "${OUTPUT_DIR}/include/armv6" mkdir -p "${OUTPUT_DIR}/include/armv7" mkdir -p "${OUTPUT_DIR}/include/i386" # Create the universal binary lipo -create armv6-ios/.libs/libffi.a armv7-ios/.libs/libffi.a i386-ios-sim/.libs/libffi.a -output "${OUTPUT_DIR}/libffi.a" # Copy in the headers copy_headers () { local src=$1 local dest=$2 # Fix non-relative header reference sed 's//"ffitarget.h"/' < "${src}/include/ffi.h" > "${dest}/ffi.h" cp "${src}/include/ffitarget.h" "${dest}" } copy_headers armv6-ios "${OUTPUT_DIR}/include/armv6" copy_headers armv7-ios "${OUTPUT_DIR}/include/armv7" copy_headers i386-ios-sim "${OUTPUT_DIR}/include/i386" # Create top-level header ( cat << EOF #ifdef __arm__ #include #ifdef _ARM_ARCH_6 #include "include/armv6/ffi.h" #elif _ARM_ARCH_7 #include "include/armv7/ffi.h" #endif #elif defined(__i386__) #include "include/i386/ffi.h" #endif EOF ) > "${OUTPUT_DIR}/ffi.h" polyml-5.6/libffi/compile000077500000000000000000000162451265146633400155330ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/libffi/config.guess000077500000000000000000001235501265146633400164730ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-03-23' # This file 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: polyml-5.6/libffi/config.sub000077500000000000000000001057751265146633400161470ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-09-11' # This file 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: polyml-5.6/libffi/configure000077500000000000000000017742411265146633400160740ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for libffi 3.0.13. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://github.com/atgreen/libffi/issues about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libffi' PACKAGE_TARNAME='libffi' PACKAGE_VERSION='3.0.13' PACKAGE_STRING='libffi 3.0.13' PACKAGE_BUGREPORT='http://github.com/atgreen/libffi/issues' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS toolexeclibdir toolexecdir FFI_DEBUG_FALSE FFI_DEBUG_TRUE TARGETDIR TARGET FFI_EXEC_TRAMPOLINE_TABLE FFI_EXEC_TRAMPOLINE_TABLE_FALSE FFI_EXEC_TRAMPOLINE_TABLE_TRUE sys_symbol_underscore HAVE_LONG_DOUBLE ALLOCA XTENSA_FALSE XTENSA_TRUE TILE_FALSE TILE_TRUE PA64_HPUX_FALSE PA64_HPUX_TRUE PA_HPUX_FALSE PA_HPUX_TRUE PA_LINUX_FALSE PA_LINUX_TRUE SH64_FALSE SH64_TRUE SH_FALSE SH_TRUE X86_64_FALSE X86_64_TRUE S390_FALSE S390_TRUE FRV_FALSE FRV_TRUE LIBFFI_CRIS_FALSE LIBFFI_CRIS_TRUE AVR32_FALSE AVR32_TRUE ARM_FALSE ARM_TRUE AARCH64_FALSE AARCH64_TRUE POWERPC_FREEBSD_FALSE POWERPC_FREEBSD_TRUE POWERPC_DARWIN_FALSE POWERPC_DARWIN_TRUE POWERPC_AIX_FALSE POWERPC_AIX_TRUE POWERPC_FALSE POWERPC_TRUE MOXIE_FALSE MOXIE_TRUE METAG_FALSE METAG_TRUE MICROBLAZE_FALSE MICROBLAZE_TRUE M68K_FALSE M68K_TRUE M32R_FALSE M32R_TRUE IA64_FALSE IA64_TRUE ALPHA_FALSE ALPHA_TRUE X86_DARWIN_FALSE X86_DARWIN_TRUE X86_WIN64_FALSE X86_WIN64_TRUE X86_WIN32_FALSE X86_WIN32_TRUE X86_FREEBSD_FALSE X86_FREEBSD_TRUE X86_FALSE X86_TRUE SPARC_FALSE SPARC_TRUE BFIN_FALSE BFIN_TRUE MIPS_FALSE MIPS_TRUE AM_LTLDFLAGS AM_RUNTESTFLAGS TESTSUBDIR_FALSE TESTSUBDIR_TRUE MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE PRTDIAG CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCASFLAGS CCAS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM ax_enable_builddir_sed target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_builddir enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_portable_binary with_gcc_arch enable_maintainer_mode enable_pax_emutramp enable_debug enable_structs enable_raw_api enable_purify_safety ' ac_precious_vars='build_alias host_alias target_alias CCAS CCASFLAGS CPP CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures libffi 3.0.13 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libffi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libffi 3.0.13:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-builddir disable automatic build in subdir of sources --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-portable-binary disable compiler optimizations that would produce unportable binaries --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC --enable-debug debugging mode --disable-structs omit code for struct support --disable-raw-api make the raw api unavailable --enable-purify-safety purify-safe mode Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gcc-arch= use architecture for gcc -march/-mtune, instead of guessing Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libffi configure 3.0.13 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------------ ## ## Report this to http://github.com/atgreen/libffi/issues ## ## ------------------------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libffi $as_me 3.0.13, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers fficonfig.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- target_alias=${target_alias-$host_alias} . ${srcdir}/configure.host # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args if test "${ac_configure_args+set}" != "set" ; then ac_configure_args= for ac_arg in ${1+"$@"}; do ac_configure_args="$ac_configure_args '$ac_arg'" done fi # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ax_enable_builddir="." # Check whether --enable-builddir was given. if test "${enable_builddir+set}" = set; then : enableval=$enable_builddir; ax_enable_builddir="$enableval" else ax_enable_builddir="auto" fi if test ".$ac_srcdir_defaulted" != ".no" ; then if test ".$srcdir" = ".." ; then if test -f config.status ; then { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5 $as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;} else test ".$ax_enable_builddir" = "." && ax_enable_builddir="." test ".$ax_enable_builddir" = ".no" && ax_enable_builddir="." test ".$TARGET" = "." && TARGET="$target" test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET" if test ".$ax_enable_builddir" != ".." ; then # we know where to go and as_dir=$ax_enable_builddir; as_fn_mkdir_p echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp cd $ax_enable_builddir if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then rm conftest.tmp { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5 $as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; } else as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5 fi srcdir=`echo "$ax_enable_builddir" | sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'` # going to restart from subdirectory location test -f $srcdir/config.log && mv $srcdir/config.log . test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . test -f $srcdir/conftest.log && mv $srcdir/conftest.log . test -f $srcdir/$cache_file && mv $srcdir/$cache_file . { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5 $as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; } case "$0" in # restart /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;; esac ; exit $? fi fi fi fi test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="." # Extract the first word of "gsed sed", so it can be a program name with args. set dummy gsed sed; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ax_enable_builddir_sed+:} false; then : $as_echo_n "(cached) " >&6 else case $ax_enable_builddir_sed in [\\/]* | ?:[\\/]*) ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed" ;; esac fi ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed if test -n "$ax_enable_builddir_sed"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5 $as_echo "$ax_enable_builddir_sed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ax_enable_builddir_auxdir="$am_aux_dir" ac_config_commands="$ac_config_commands buildir" am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libffi' VERSION='3.0.13' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # The same as in boehm-gc and libstdc++. Have to borrow it from there. # We must force CC to /not/ be precious variables; otherwise # the wrong, non-multilib-adjusted value will be used in multilibs. # As a side effect, we have to subst CFLAGS ourselves. # Also save and restore CFLAGS, since AC_PROG_CC will come up with # defaults of its own if none are provided. save_CFLAGS=$CFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi CFLAGS=$save_CFLAGS # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 $as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: # Test for 64-bit build. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } if ${ac_cv_sizeof_size_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : else if test "$ac_cv_type_size_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_size_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 $as_echo "$ac_cv_sizeof_size_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIZE_T $ac_cv_sizeof_size_t _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 $as_echo_n "checking for C compiler vendor... " >&6; } if ${ax_cv_c_compiler_vendor+:} false; then : $as_echo_n "(cached) " >&6 else # note: don't check for gcc first since some other compilers define __GNUC__ vendors="intel: __ICC,__ECC,__INTEL_COMPILER ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale: __PATHCC__,__PATHSCALE__ clang: __clang__ gnu: __GNUC__ sun: __SUNPRO_C,__SUNPRO_CC hp: __HP_cc,__HP_aCC dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland: __BORLANDC__,__TURBOC__ comeau: __COMO__ cray: _CRAYC kai: __KCC lcc: __LCC__ sgi: __sgi,sgi microsoft: _MSC_VER metrowerks: __MWERKS__ watcom: __WATCOMC__ portland: __PGI unknown: UNKNOWN" for ventest in $vendors; do case $ventest in *:) vendor=$ventest; continue ;; *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if !($vencpp) thisisanerror; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 $as_echo "$ax_cv_c_compiler_vendor" >&6; } # Check whether --enable-portable-binary was given. if test "${enable_portable_binary+set}" = set; then : enableval=$enable_portable_binary; acx_maxopt_portable=$enableval else acx_maxopt_portable=no fi # Try to determine "good" native compiler flags if none specified via CFLAGS if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; sun) CFLAGS="-native -fast -xO5 -dalign" if test "x$acx_maxopt_portable" = xyes; then CFLAGS="$CFLAGS -xarch=generic" fi;; hp) CFLAGS="+Oall +Optrs_ansi +DSnative" if test "x$acx_maxopt_portable" = xyes; then CFLAGS="$CFLAGS +DAportable" fi;; ibm) if test "x$acx_maxopt_portable" = xno; then xlc_opt="-qarch=auto -qtune=auto" else xlc_opt="-qtune=auto" fi as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$xlc_opt" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5 $as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; } if eval \${$as_CACHEVAR+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS $xlc_opt" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_CACHEVAR=yes" else eval "$as_CACHEVAR=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi eval ac_res=\$$as_CACHEVAR { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : CFLAGS="-O3 -qansialias -w $xlc_opt" else CFLAGS="-O3 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" echo "* and re-run configure.) For more info, man cc. *" echo "******************************************************" fi ;; intel) CFLAGS="-O3 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" case $host_cpu in i686*|x86_64*) # icc accepts gcc assembly syntax, so these should work: ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 $as_echo_n "checking for x86 cpuid 0 output... " >&6; } if ${ax_cv_gcc_x86_cpuid_0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_gcc_x86_cpuid_0=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int op = 0, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid else ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 $as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 $as_echo_n "checking for x86 cpuid 1 output... " >&6; } if ${ax_cv_gcc_x86_cpuid_1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_gcc_x86_cpuid_1=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int op = 1, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid else ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 $as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG *:756e6547:*:*) # Intel case $ax_cv_gcc_x86_cpuid_1 in *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";; *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";; *f??:*:*:*) icc_flags="-xN -xW -xK";; esac ;; esac ;; esac if test "x$icc_flags" != x; then for flag in $icc_flags; do as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 $as_echo_n "checking whether C compiler accepts $flag... " >&6; } if eval \${$as_CACHEVAR+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS $flag" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_CACHEVAR=yes" else eval "$as_CACHEVAR=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi eval ac_res=\$$as_CACHEVAR { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : icc_archflag=$flag; break else : fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5 $as_echo_n "checking for icc architecture flag... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5 $as_echo "$icc_archflag" >&6; } if test "x$icc_archflag" != xunknown; then CFLAGS="$CFLAGS $icc_archflag" fi fi ;; gnu) # default optimization flags for gcc on all systems CFLAGS="-O3 -fomit-frame-pointer" # -malign-double for x86 systems # LIBFFI -- DON'T DO THIS - CHANGES ABI # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") # -fstrict-aliasing for gcc-2.95+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 $as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } if ${ax_cv_check_cflags___fstrict_aliasing+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -fstrict-aliasing" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_check_cflags___fstrict_aliasing=yes else ax_cv_check_cflags___fstrict_aliasing=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fstrict_aliasing" >&5 $as_echo "$ax_cv_check_cflags___fstrict_aliasing" >&6; } if test x"$ax_cv_check_cflags___fstrict_aliasing" = xyes; then : CFLAGS="$CFLAGS -fstrict-aliasing" else : fi # note that we enable "unsafe" fp optimization with other compilers, too { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5 $as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; } if ${ax_cv_check_cflags___ffast_math+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -ffast-math" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_check_cflags___ffast_math=yes else ax_cv_check_cflags___ffast_math=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___ffast_math" >&5 $as_echo "$ax_cv_check_cflags___ffast_math" >&6; } if test x"$ax_cv_check_cflags___ffast_math" = xyes; then : CFLAGS="$CFLAGS -ffast-math" else : fi # Check whether --with-gcc-arch was given. if test "${with_gcc_arch+set}" = set; then : withval=$with_gcc_arch; ax_gcc_arch=$withval else ax_gcc_arch=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 $as_echo_n "checking for gcc architecture flag... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if ${ax_cv_gcc_archflag+:} false; then : $as_echo_n "(cached) " >&6 else ax_cv_gcc_archflag="unknown" if test "$GCC" = yes; then if test "x$ax_gcc_arch" = xyes; then ax_gcc_arch="" if test "$cross_compiling" = no; then case $host_cpu in i[3456]86*|x86_64*) # use cpuid codes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5 $as_echo_n "checking for x86 cpuid 0 output... " >&6; } if ${ax_cv_gcc_x86_cpuid_0+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_gcc_x86_cpuid_0=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int op = 0, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid else ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5 $as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5 $as_echo_n "checking for x86 cpuid 1 output... " >&6; } if ${ax_cv_gcc_x86_cpuid_1+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_gcc_x86_cpuid_1=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int op = 1, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid else ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5 $as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ax_cv_gcc_x86_cpuid_0 in *:756e6547:*:*) # Intel case $ax_cv_gcc_x86_cpuid_1 in *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; *5??:*:*:*) ax_gcc_arch=pentium ;; *0?6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; *0?6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; *0?6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; *0?6[9de]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; *0?6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; *1?6[aef]?:*:*:*|*2?6[5cef]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; *1?6c?:*:*:*|*[23]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; *2?6[ad]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; ?000?f3[347]:*:*:*|?000?f41347:*:*:*|?000?f6?:*:*:*) case $host_cpu in x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; esac ;; ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; esac ;; *:68747541:*:*) # AMD case $ax_cv_gcc_x86_cpuid_1 in *5[67]?:*:*:*) ax_gcc_arch=k6 ;; *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; *60?:*:*:*) ax_gcc_arch=k7 ;; *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;; *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; *6[68a]?:*:*:*) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5 $as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; } if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ax_cv_gcc_x86_cpuid_0x80000006=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int op = 0x80000006, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid else ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5 $as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # L2 cache size case $ax_cv_gcc_x86_cpuid_0x80000006 in *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256 ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; *) ax_gcc_arch="athlon-4 athlon k7" ;; esac ;; ?00??f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; ?00??f??:*:*:*) ax_gcc_arch="k8" ;; ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; esac ;; *:746e6543:*:*) # IDT case $ax_cv_gcc_x86_cpuid_1 in *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; *58?:*:*:*) ax_gcc_arch=winchip2 ;; *6[78]?:*:*:*) ax_gcc_arch=c3 ;; *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; esac ;; esac if test x"$ax_gcc_arch" = x; then # fallback case $host_cpu in i586*) ax_gcc_arch=pentium ;; i686*) ax_gcc_arch=pentiumpro ;; esac fi ;; sparc*) # Extract the first word of "prtdiag", so it can be a program name with args. set dummy prtdiag; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PRTDIAG+:} false; then : $as_echo_n "(cached) " >&6 else case $PRTDIAG in [\\/]* | ?:[\\/]*) ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag" ;; esac fi PRTDIAG=$ac_cv_path_PRTDIAG if test -n "$PRTDIAG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5 $as_echo "$PRTDIAG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters` case $cputype in *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;; *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;; *cypress*) ax_gcc_arch=cypress ;; esac ;; alphaev5) ax_gcc_arch=ev5 ;; alphaev56) ax_gcc_arch=ev56 ;; alphapca56) ax_gcc_arch="pca56 ev56" ;; alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; alphaev6) ax_gcc_arch=ev6 ;; alphaev67) ax_gcc_arch=ev67 ;; alphaev68) ax_gcc_arch="ev68 ev67" ;; alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; powerpc*) cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` case $cputype in *750*) ax_gcc_arch="750 G3" ;; *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;; *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;; *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;; *970*) ax_gcc_arch="970 G5 power4";; *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; 603ev|8240) ax_gcc_arch="$cputype 603e 603";; *) ax_gcc_arch=$cputype ;; esac ax_gcc_arch="$ax_gcc_arch powerpc" ;; esac fi # not cross-compiling fi # guess arch if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then for arch in $ax_gcc_arch; do if test "x$acx_maxopt_portable" = xyes; then # if we require portable code flags="-mtune=$arch" # -mcpu=$arch and m$arch generate nonportable code on every arch except # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac else flags="-march=$arch -mcpu=$arch -m$arch" fi for flag in $flags; do as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 $as_echo_n "checking whether C compiler accepts $flag... " >&6; } if eval \${$as_CACHEVAR+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS $flag" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_CACHEVAR=yes" else eval "$as_CACHEVAR=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi eval ac_res=\$$as_CACHEVAR { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : ax_cv_gcc_archflag=$flag; break else : fi done test "x$ax_cv_gcc_archflag" = xunknown || break done fi fi # $GCC=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5 $as_echo_n "checking for gcc architecture flag... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5 $as_echo "$ax_cv_gcc_archflag" >&6; } if test "x$ax_cv_gcc_archflag" = xunknown; then : else CFLAGS="$CFLAGS $ax_cv_gcc_archflag" fi ;; esac if test -z "$CFLAGS"; then echo "" echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" echo "********************************************************" echo "" CFLAGS="-O3" fi as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$CFLAGS" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5 $as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; } if eval \${$as_CACHEVAR+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_CACHEVAR=yes" else eval "$as_CACHEVAR=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi eval ac_res=\$$as_CACHEVAR { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then : : else echo "" echo "********************************************************" echo "* WARNING: The guessed CFLAGS don't seem to work with *" echo "* your compiler. *" echo "* Use ./configure CFLAGS=... to specify your own flags *" echo "********************************************************" echo "" CFLAGS="" fi fi # The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro # compiler. if test "$ax_cv_c_compiler_vendor" != "sun"; then if ${CFLAGS+:} false; then : case " $CFLAGS " in *" "*) { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains "; } >&5 (: CFLAGS already contains ) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; *) { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \""; } >&5 (: CFLAGS="$CFLAGS ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } CFLAGS="$CFLAGS " ;; esac else CFLAGS="" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5 $as_echo_n "checking CFLAGS for maximum warnings... " >&6; } if ${ac_cv_cflags_warn_all+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_cflags_warn_all="no, unknown" ac_save_CFLAGS="$CFLAGS" for ac_arg in "-warn all % -warn all" "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CFLAGS="$ac_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5 $as_echo "$ac_cv_cflags_warn_all" >&6; } case ".$ac_cv_cflags_warn_all" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if ${CFLAGS+:} false; then : case " $CFLAGS " in *" $ac_cv_cflags_warn_all "*) { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_warn_all"; } >&5 (: CFLAGS already contains $ac_cv_cflags_warn_all) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; *) { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5 (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" ;; esac else CFLAGS="$ac_cv_cflags_warn_all" fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -fexceptions" touch local.exp else cat > local.exp <&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE for ac_header in sys/mman.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mman_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MMAN_H 1 _ACEOF fi done for ac_func in mmap do : ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MMAP 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mman_h" = xyes; then : libffi_header_sys_mman_h=yes else libffi_header_sys_mman_h=no fi ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : libffi_func_mmap=yes else libffi_func_mmap=no fi if test "$libffi_header_sys_mman_h" != yes \ || test "$libffi_func_mmap" != yes; then ac_cv_func_mmap_file=no ac_cv_func_mmap_dev_zero=no ac_cv_func_mmap_anon=no else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5 $as_echo_n "checking whether read-only mmap of a plain file works... " >&6; } if ${ac_cv_func_mmap_file+:} false; then : $as_echo_n "(cached) " >&6 else # Add a system to this blacklist if # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a # memory area containing the same data that you'd get if you applied # read() to the same fd. The only system known to have a problem here # is VMS, where text files have record structure. case "$host_os" in vms* | ultrix*) ac_cv_func_mmap_file=no ;; *) ac_cv_func_mmap_file=yes;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5 $as_echo "$ac_cv_func_mmap_file" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5 $as_echo_n "checking whether mmap from /dev/zero works... " >&6; } if ${ac_cv_func_mmap_dev_zero+:} false; then : $as_echo_n "(cached) " >&6 else # Add a system to this blacklist if it has mmap() but /dev/zero # does not exist, or if mmapping /dev/zero does not give anonymous # zeroed pages with both the following properties: # 1. If you map N consecutive pages in with one call, and then # unmap any subset of those pages, the pages that were not # explicitly unmapped remain accessible. # 2. If you map two adjacent blocks of memory and then unmap them # both at once, they must both go away. # Systems known to be in this category are Windows (all variants), # VMS, and Darwin. case "$host_os" in vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00) ac_cv_func_mmap_dev_zero=no ;; *) ac_cv_func_mmap_dev_zero=yes;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5 $as_echo "$ac_cv_func_mmap_dev_zero" >&6; } # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5 $as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; } if ${ac_cv_decl_map_anon+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif int main () { int n = MAP_ANONYMOUS; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_decl_map_anon=yes else ac_cv_decl_map_anon=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5 $as_echo "$ac_cv_decl_map_anon" >&6; } if test $ac_cv_decl_map_anon = no; then ac_cv_func_mmap_anon=no else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5 $as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; } if ${ac_cv_func_mmap_anon+:} false; then : $as_echo_n "(cached) " >&6 else # Add a system to this blacklist if it has mmap() and MAP_ANON or # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) # doesn't give anonymous zeroed pages with the same properties listed # above for use of /dev/zero. # Systems known to be in this category are Windows, VMS, and SCO Unix. case "$host_os" in vms* | cygwin* | pe | mingw* | sco* | udk* ) ac_cv_func_mmap_anon=no ;; *) ac_cv_func_mmap_anon=yes;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5 $as_echo "$ac_cv_func_mmap_anon" >&6; } fi fi if test $ac_cv_func_mmap_file = yes; then $as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h fi if test $ac_cv_func_mmap_dev_zero = yes; then $as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h fi if test $ac_cv_func_mmap_anon = yes; then $as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h fi if test -d $srcdir/testsuite; then TESTSUBDIR_TRUE= TESTSUBDIR_FALSE='#' else TESTSUBDIR_TRUE='#' TESTSUBDIR_FALSE= fi TARGETDIR="unknown" case "$host" in aarch64*-*-*) TARGET=AARCH64; TARGETDIR=aarch64 ;; alpha*-*-*) TARGET=ALPHA; TARGETDIR=alpha; # Support 128-bit long double, changeable via command-line switch. HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' ;; arm*-*-*) TARGET=ARM; TARGETDIR=arm ;; amd64-*-freebsd* | amd64-*-openbsd*) TARGET=X86_64; TARGETDIR=x86 ;; amd64-*-freebsd*) TARGET=X86_64; TARGETDIR=x86 ;; amd64-*-freebsd*) TARGET=X86_64; TARGETDIR=x86 ;; avr32*-*-*) TARGET=AVR32; TARGETDIR=avr32 ;; bfin*) TARGET=BFIN; TARGETDIR=bfin ;; cris-*-*) TARGET=LIBFFI_CRIS; TARGETDIR=cris ;; frv-*-*) TARGET=FRV; TARGETDIR=frv ;; hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) TARGET=PA_LINUX; TARGETDIR=pa ;; hppa*64-*-hpux*) TARGET=PA64_HPUX; TARGETDIR=pa ;; hppa*-*-hpux*) TARGET=PA_HPUX; TARGETDIR=pa ;; i?86-*-freebsd* | i?86-*-openbsd*) TARGET=X86_FREEBSD; TARGETDIR=x86 ;; i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*) TARGET=X86_WIN32; TARGETDIR=x86 # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. # We must also check with_cross_host to decide if this is a native # or cross-build and select where to install dlls appropriately. if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; else AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; fi ;; i?86-*-darwin*) TARGET=X86_DARWIN; TARGETDIR=x86 ;; i?86-*-solaris2.1[0-9]*) TARGETDIR=x86 if test $ac_cv_sizeof_size_t = 4; then TARGET=X86; else TARGET=X86_64; fi ;; x86_64-*-darwin*) TARGET=X86_DARWIN; TARGETDIR=x86 ;; x86_64-*-cygwin* | x86_64-*-mingw*) TARGET=X86_WIN64; TARGETDIR=x86 # All mingw/cygwin/win32 builds require -no-undefined for sharedlib. # We must also check with_cross_host to decide if this is a native # or cross-build and select where to install dlls appropriately. if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"'; else AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"'; fi ;; i?86-*-* | x86_64-*-*) TARGETDIR=x86 if test $ac_cv_sizeof_size_t = 4; then case "$host" in *-gnux32) TARGET=X86_64 ;; *) TARGET=X86 ;; esac else TARGET=X86_64; fi ;; ia64*-*-*) TARGET=IA64; TARGETDIR=ia64 ;; m32r*-*-*) TARGET=M32R; TARGETDIR=m32r ;; m68k-*-*) TARGET=M68K; TARGETDIR=m68k ;; microblaze*-*-*) TARGET=MICROBLAZE; TARGETDIR=microblaze ;; moxie-*-*) TARGET=MOXIE; TARGETDIR=moxie ;; metag-*-*) TARGET=METAG; TARGETDIR=metag ;; mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*) TARGET=MIPS; TARGETDIR=mips ;; mips*-*-linux* | mips*-*-openbsd*) # Support 128-bit long double for NewABI. HAVE_LONG_DOUBLE='defined(__mips64)' TARGET=MIPS; TARGETDIR=mips ;; powerpc*-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc ;; powerpc-*-amigaos*) TARGET=POWERPC; TARGETDIR=powerpc ;; powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc ;; powerpc-*-darwin* | powerpc64-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc ;; powerpc-*-aix* | rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc ;; powerpc-*-freebsd* | powerpc-*-openbsd*) TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc ;; powerpc64-*-freebsd*) TARGET=POWERPC; TARGETDIR=powerpc ;; powerpc*-*-rtems*) TARGET=POWERPC; TARGETDIR=powerpc ;; s390-*-* | s390x-*-*) TARGET=S390; TARGETDIR=s390 ;; sh-*-* | sh[34]*-*-*) TARGET=SH; TARGETDIR=sh ;; sh64-*-* | sh5*-*-*) TARGET=SH64; TARGETDIR=sh64 ;; sparc*-*-*) TARGET=SPARC; TARGETDIR=sparc ;; tile*-*) TARGET=TILE; TARGETDIR=tile ;; xtensa*-*) TARGET=XTENSA; TARGETDIR=xtensa ;; esac if test $TARGETDIR = unknown; then as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5 fi if test x$TARGET = xMIPS; then MIPS_TRUE= MIPS_FALSE='#' else MIPS_TRUE='#' MIPS_FALSE= fi if test x$TARGET = xBFIN; then BFIN_TRUE= BFIN_FALSE='#' else BFIN_TRUE='#' BFIN_FALSE= fi if test x$TARGET = xSPARC; then SPARC_TRUE= SPARC_FALSE='#' else SPARC_TRUE='#' SPARC_FALSE= fi if test x$TARGET = xX86; then X86_TRUE= X86_FALSE='#' else X86_TRUE='#' X86_FALSE= fi if test x$TARGET = xX86_FREEBSD; then X86_FREEBSD_TRUE= X86_FREEBSD_FALSE='#' else X86_FREEBSD_TRUE='#' X86_FREEBSD_FALSE= fi if test x$TARGET = xX86_WIN32; then X86_WIN32_TRUE= X86_WIN32_FALSE='#' else X86_WIN32_TRUE='#' X86_WIN32_FALSE= fi if test x$TARGET = xX86_WIN64; then X86_WIN64_TRUE= X86_WIN64_FALSE='#' else X86_WIN64_TRUE='#' X86_WIN64_FALSE= fi if test x$TARGET = xX86_DARWIN; then X86_DARWIN_TRUE= X86_DARWIN_FALSE='#' else X86_DARWIN_TRUE='#' X86_DARWIN_FALSE= fi if test x$TARGET = xALPHA; then ALPHA_TRUE= ALPHA_FALSE='#' else ALPHA_TRUE='#' ALPHA_FALSE= fi if test x$TARGET = xIA64; then IA64_TRUE= IA64_FALSE='#' else IA64_TRUE='#' IA64_FALSE= fi if test x$TARGET = xM32R; then M32R_TRUE= M32R_FALSE='#' else M32R_TRUE='#' M32R_FALSE= fi if test x$TARGET = xM68K; then M68K_TRUE= M68K_FALSE='#' else M68K_TRUE='#' M68K_FALSE= fi if test x$TARGET = xMICROBLAZE; then MICROBLAZE_TRUE= MICROBLAZE_FALSE='#' else MICROBLAZE_TRUE='#' MICROBLAZE_FALSE= fi if test x$TARGET = xMETAG; then METAG_TRUE= METAG_FALSE='#' else METAG_TRUE='#' METAG_FALSE= fi if test x$TARGET = xMOXIE; then MOXIE_TRUE= MOXIE_FALSE='#' else MOXIE_TRUE='#' MOXIE_FALSE= fi if test x$TARGET = xPOWERPC; then POWERPC_TRUE= POWERPC_FALSE='#' else POWERPC_TRUE='#' POWERPC_FALSE= fi if test x$TARGET = xPOWERPC_AIX; then POWERPC_AIX_TRUE= POWERPC_AIX_FALSE='#' else POWERPC_AIX_TRUE='#' POWERPC_AIX_FALSE= fi if test x$TARGET = xPOWERPC_DARWIN; then POWERPC_DARWIN_TRUE= POWERPC_DARWIN_FALSE='#' else POWERPC_DARWIN_TRUE='#' POWERPC_DARWIN_FALSE= fi if test x$TARGET = xPOWERPC_FREEBSD; then POWERPC_FREEBSD_TRUE= POWERPC_FREEBSD_FALSE='#' else POWERPC_FREEBSD_TRUE='#' POWERPC_FREEBSD_FALSE= fi if test x$TARGET = xAARCH64; then AARCH64_TRUE= AARCH64_FALSE='#' else AARCH64_TRUE='#' AARCH64_FALSE= fi if test x$TARGET = xARM; then ARM_TRUE= ARM_FALSE='#' else ARM_TRUE='#' ARM_FALSE= fi if test x$TARGET = xAVR32; then AVR32_TRUE= AVR32_FALSE='#' else AVR32_TRUE='#' AVR32_FALSE= fi if test x$TARGET = xLIBFFI_CRIS; then LIBFFI_CRIS_TRUE= LIBFFI_CRIS_FALSE='#' else LIBFFI_CRIS_TRUE='#' LIBFFI_CRIS_FALSE= fi if test x$TARGET = xFRV; then FRV_TRUE= FRV_FALSE='#' else FRV_TRUE='#' FRV_FALSE= fi if test x$TARGET = xS390; then S390_TRUE= S390_FALSE='#' else S390_TRUE='#' S390_FALSE= fi if test x$TARGET = xX86_64; then X86_64_TRUE= X86_64_FALSE='#' else X86_64_TRUE='#' X86_64_FALSE= fi if test x$TARGET = xSH; then SH_TRUE= SH_FALSE='#' else SH_TRUE='#' SH_FALSE= fi if test x$TARGET = xSH64; then SH64_TRUE= SH64_FALSE='#' else SH64_TRUE='#' SH64_FALSE= fi if test x$TARGET = xPA_LINUX; then PA_LINUX_TRUE= PA_LINUX_FALSE='#' else PA_LINUX_TRUE='#' PA_LINUX_FALSE= fi if test x$TARGET = xPA_HPUX; then PA_HPUX_TRUE= PA_HPUX_FALSE='#' else PA_HPUX_TRUE='#' PA_HPUX_FALSE= fi if test x$TARGET = xPA64_HPUX; then PA64_HPUX_TRUE= PA64_HPUX_FALSE='#' else PA64_HPUX_TRUE='#' PA64_HPUX_FALSE= fi if test x$TARGET = xTILE; then TILE_TRUE= TILE_FALSE='#' else TILE_TRUE='#' TILE_FALSE= fi if test x$TARGET = xXTENSA; then XTENSA_TRUE= XTENSA_FALSE='#' else XTENSA_TRUE='#' XTENSA_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_func in memcpy do : ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy" if test "x$ac_cv_func_memcpy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMCPY 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } if ${ac_cv_sizeof_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : else if test "$ac_cv_type_long_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 $as_echo "$ac_cv_sizeof_long_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF # Also AC_SUBST this variable for ffi.h. if test -z "$HAVE_LONG_DOUBLE"; then HAVE_LONG_DOUBLE=0 if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then if test $ac_cv_sizeof_long_double != 0; then HAVE_LONG_DOUBLE=1 $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5 $as_echo_n "checking assembler .cfi pseudo-op support... " >&6; } if ${gcc_cv_as_cfi_pseudo_op+:} false; then : $as_echo_n "(cached) " >&6 else gcc_cv_as_cfi_pseudo_op=unknown cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".cfi_startproc\n\t.cfi_endproc"); int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gcc_cv_as_cfi_pseudo_op=yes else gcc_cv_as_cfi_pseudo_op=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5 $as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; } if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then $as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h fi if test x$TARGET = xSPARC; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5 $as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; } if ${libffi_cv_as_sparc_ua_pcrel+:} false; then : $as_echo_n "(cached) " >&6 else save_CFLAGS="$CFLAGS" save_LDFLAGS="$LDFLAGS" CFLAGS="$CFLAGS -fpic" LDFLAGS="$LDFLAGS -shared" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text"); int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : libffi_cv_as_sparc_ua_pcrel=yes else libffi_cv_as_sparc_ua_pcrel=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_sparc_ua_pcrel" >&5 $as_echo "$libffi_cv_as_sparc_ua_pcrel" >&6; } if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then $as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5 $as_echo_n "checking assembler .register pseudo-op support... " >&6; } if ${libffi_cv_as_register_pseudo_op+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_as_register_pseudo_op=unknown # Check if we have .register cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { asm (".register %g2, #scratch"); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : libffi_cv_as_register_pseudo_op=yes else libffi_cv_as_register_pseudo_op=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_register_pseudo_op" >&5 $as_echo "$libffi_cv_as_register_pseudo_op" >&6; } if test "x$libffi_cv_as_register_pseudo_op" = xyes; then $as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h fi fi if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5 $as_echo_n "checking assembler supports pc related relocs... " >&6; } if ${libffi_cv_as_x86_pcrel+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_as_x86_pcrel=no echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then libffi_cv_as_x86_pcrel=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5 $as_echo "$libffi_cv_as_x86_pcrel" >&6; } if test "x$libffi_cv_as_x86_pcrel" = xyes; then $as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5 $as_echo_n "checking assembler .ascii pseudo-op support... " >&6; } if ${libffi_cv_as_ascii_pseudo_op+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_as_ascii_pseudo_op=unknown # Check if we have .ascii cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { asm (".ascii \\"string\\""); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : libffi_cv_as_ascii_pseudo_op=yes else libffi_cv_as_ascii_pseudo_op=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5 $as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; } if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then $as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5 $as_echo_n "checking assembler .string pseudo-op support... " >&6; } if ${libffi_cv_as_string_pseudo_op+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_as_string_pseudo_op=unknown # Check if we have .string cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { asm (".string \\"string\\""); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : libffi_cv_as_string_pseudo_op=yes else libffi_cv_as_string_pseudo_op=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5 $as_echo "$libffi_cv_as_string_pseudo_op" >&6; } if test "x$libffi_cv_as_string_pseudo_op" = xyes; then $as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h fi fi # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. # Check whether --enable-pax_emutramp was given. if test "${enable_pax_emutramp+set}" = set; then : enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then $as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h fi fi if test x$TARGET = xX86_WIN64; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5 $as_echo_n "checking for _ prefix in compiled symbols... " >&6; } if ${lt_cv_sys_symbol_underscore+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sys_symbol_underscore=no cat > conftest.$ac_ext <<_LT_EOF void nm_test_func(){} int main(){nm_test_func;return 0;} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. ac_nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$ac_nlist"; then # See whether the symbols have a leading underscore. if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then lt_cv_sys_symbol_underscore=yes else if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then : else echo "configure: cannot find nm_test_func in $ac_nlist" >&5 fi fi else echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "configure: failed program was:" >&5 cat conftest.c >&5 fi rm -rf conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5 $as_echo "$lt_cv_sys_symbol_underscore" >&6; } sys_symbol_underscore=$lt_cv_sys_symbol_underscore if test "x$sys_symbol_underscore" = xyes; then $as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h fi fi FFI_EXEC_TRAMPOLINE_TABLE=0 case "$target" in *arm*-apple-darwin*) FFI_EXEC_TRAMPOLINE_TABLE=1 $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h ;; *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h ;; esac if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then FFI_EXEC_TRAMPOLINE_TABLE_TRUE= FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#' else FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#' FFI_EXEC_TRAMPOLINE_TABLE_FALSE= fi if test x$TARGET = xX86_64; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5 $as_echo_n "checking assembler supports unwind section type... " >&6; } if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_as_x86_64_unwind_section_type=yes echo '.section .eh_frame,"a",@unwind' > conftest.s if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then libffi_cv_as_x86_64_unwind_section_type=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5 $as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; } if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then $as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h fi fi if test "x$GCC" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5 $as_echo_n "checking whether .eh_frame section should be read-only... " >&6; } if ${libffi_cv_ro_eh_frame+:} false; then : $as_echo_n "(cached) " >&6 else libffi_cv_ro_eh_frame=no echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then objdump -h conftest.o > conftest.dump 2>&1 libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` libffi_test_line=`expr $libffi_eh_frame_line + 1`p sed -n $libffi_test_line conftest.dump > conftest.line if grep READONLY conftest.line > /dev/null; then libffi_cv_ro_eh_frame=yes fi fi rm -f conftest.* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5 $as_echo "$libffi_cv_ro_eh_frame" >&6; } if test "x$libffi_cv_ro_eh_frame" = xyes; then $as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h $as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h else $as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 $as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; } if ${libffi_cv_hidden_visibility_attribute+:} false; then : $as_echo_n "(cached) " >&6 else echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c libffi_cv_hidden_visibility_attribute=no if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then if grep '\.hidden.*foo' conftest.s >/dev/null; then libffi_cv_hidden_visibility_attribute=yes fi fi rm -f conftest.* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5 $as_echo "$libffi_cv_hidden_visibility_attribute" >&6; } if test $libffi_cv_hidden_visibility_attribute = yes; then $as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h fi fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; if test "$enable_debug" = "yes"; then $as_echo "#define FFI_DEBUG 1" >>confdefs.h fi fi if test "$enable_debug" = "yes"; then FFI_DEBUG_TRUE= FFI_DEBUG_FALSE='#' else FFI_DEBUG_TRUE='#' FFI_DEBUG_FALSE= fi # Check whether --enable-structs was given. if test "${enable_structs+set}" = set; then : enableval=$enable_structs; if test "$enable_structs" = "no"; then $as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h fi fi if test "$enable_debug" = "yes"; then FFI_DEBUG_TRUE= FFI_DEBUG_FALSE='#' else FFI_DEBUG_TRUE='#' FFI_DEBUG_FALSE= fi # Check whether --enable-raw-api was given. if test "${enable_raw_api+set}" = set; then : enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then $as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h fi fi # Check whether --enable-purify-safety was given. if test "${enable_purify_safety+set}" = set; then : enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then $as_echo "#define USING_PURIFY 1" >>confdefs.h fi fi # These variables are only ever used when we cross-build to X86_WIN32. # And we only support this with GCC, so... if test "x$GCC" = "xyes"; then if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then toolexecdir='$(exec_prefix)/$(target_alias)' toolexeclibdir='$(toolexecdir)/lib' else toolexecdir='$(libdir)/gcc-lib/$(target_alias)' toolexeclibdir='$(libdir)' fi multi_os_directory=`$CC -print-multi-os-directory` case $multi_os_directory in .) ;; # Avoid trailing /. ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; esac else toolexeclibdir='$(libdir)' fi ac_config_commands="$ac_config_commands include" ac_config_commands="$ac_config_commands src" ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then as_fn_error $? "conditional \"TESTSUBDIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then as_fn_error $? "conditional \"MIPS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BFIN_TRUE}" && test -z "${BFIN_FALSE}"; then as_fn_error $? "conditional \"BFIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then as_fn_error $? "conditional \"SPARC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then as_fn_error $? "conditional \"X86\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then as_fn_error $? "conditional \"X86_FREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then as_fn_error $? "conditional \"X86_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then as_fn_error $? "conditional \"X86_WIN64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then as_fn_error $? "conditional \"X86_DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then as_fn_error $? "conditional \"ALPHA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then as_fn_error $? "conditional \"IA64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then as_fn_error $? "conditional \"M32R\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then as_fn_error $? "conditional \"M68K\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MICROBLAZE_TRUE}" && test -z "${MICROBLAZE_FALSE}"; then as_fn_error $? "conditional \"MICROBLAZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${METAG_TRUE}" && test -z "${METAG_FALSE}"; then as_fn_error $? "conditional \"METAG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then as_fn_error $? "conditional \"MOXIE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then as_fn_error $? "conditional \"POWERPC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then as_fn_error $? "conditional \"POWERPC_AIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AARCH64_TRUE}" && test -z "${AARCH64_FALSE}"; then as_fn_error $? "conditional \"AARCH64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then as_fn_error $? "conditional \"ARM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then as_fn_error $? "conditional \"AVR32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then as_fn_error $? "conditional \"FRV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then as_fn_error $? "conditional \"S390\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then as_fn_error $? "conditional \"X86_64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then as_fn_error $? "conditional \"SH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then as_fn_error $? "conditional \"SH64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then as_fn_error $? "conditional \"PA_LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then as_fn_error $? "conditional \"PA_HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then as_fn_error $? "conditional \"PA64_HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TILE_TRUE}" && test -z "${TILE_FALSE}"; then as_fn_error $? "conditional \"TILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${XTENSA_TRUE}" && test -z "${XTENSA_FALSE}"; then as_fn_error $? "conditional \"XTENSA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then as_fn_error $? "conditional \"FFI_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libffi $as_me 3.0.13, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ libffi config.status 3.0.13 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # ax_enable_builddir_srcdir="$srcdir" # $srcdir ax_enable_builddir_host="$HOST" # $HOST / $host ax_enable_builddir_version="$VERSION" # $VERSION ax_enable_builddir_package="$PACKAGE" # $PACKAGE ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED ax_enable_builddir="$ax_enable_builddir" # $SUB AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' TARGETDIR="$TARGETDIR" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;; "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;; "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;; "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "buildir":C) ac_top_srcdir="$ax_enable_builddir_srcdir" if test ".$ax_enable_builddir" = ".." ; then if test -f "$top_srcdir/Makefile" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5 $as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5 $as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;} fi else if test -f "$ac_top_srcdir/Makefile" ; then a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile` test "$a" != "$b" && rm "$ac_top_srcdir/Makefile" fi if test -f "$ac_top_srcdir/Makefile" ; then echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk echo " @ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null then rm $ac_top_srcdir/Makefile ; fi cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~ ## DEBUGGING fi if test ! -f "$ac_top_srcdir/Makefile" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5 $as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;} x='`' ; cat >$tmp/conftemp.sed <<_EOF /^\$/n x /^\$/bS x /\\\\\$/{H;d;} {H;s/.*//;x;} bM :S x /\\\\\$/{h;d;} {h;s/.*//;x;} :M s/\\(\\n\\) /\\1 /g /^ /d /^[ ]*[\\#]/d /^VPATH *=/d s/^srcdir *=.*/srcdir = ./ s/^top_srcdir *=.*/top_srcdir = ./ /[:=]/!d /^\\./d / = /b / .= /b /:/!b s/:.*/:/ s/ / /g s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/ s/ / /g /^all all-all[ :]/i\\ all-configured : all-all s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g /-all-all/d a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done /dist-all *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done /dist-[a-zA-Z0-9]*-all *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done /distclean-all *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ ; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile _EOF cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~" ## DEBUGGING $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile if test -f "$ac_top_srcdir/Makefile.mk" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5 $as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;} cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile fi ; xxxx="####" echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile # sanity check if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5 $as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;} $ax_enable_builddir_sed -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $ac_top_srcdir/Makefile \ >$ac_top_srcdir/Makefile~ (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null fi else xxxx="\\#\\#\\#\\#" # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~" ## DEBUGGING cp "$tmp/mkfile.tmp" "$ac_top_srcdir/makefiles.out~" ## DEBUGGING if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5 $as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;} rm "$tmp/mkfile.tmp" else { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5 $as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;} mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5 $as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;} xxxx="####" echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile fi ;; "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; "include":C) test -d include || mkdir include ;; "src":C) test -d src || mkdir src test -d src/$TARGETDIR || mkdir src/$TARGETDIR ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi polyml-5.6/libffi/configure.ac000066400000000000000000000377401265146633400164460ustar00rootroot00000000000000dnl Process this with autoconf to create configure AC_PREREQ(2.68) AC_INIT([libffi], [3.0.13], [http://github.com/atgreen/libffi/issues]) AC_CONFIG_HEADERS([fficonfig.h]) AC_CANONICAL_SYSTEM target_alias=${target_alias-$host_alias} . ${srcdir}/configure.host AX_ENABLE_BUILDDIR AM_INIT_AUTOMAKE # The same as in boehm-gc and libstdc++. Have to borrow it from there. # We must force CC to /not/ be precious variables; otherwise # the wrong, non-multilib-adjusted value will be used in multilibs. # As a side effect, we have to subst CFLAGS ourselves. # Also save and restore CFLAGS, since AC_PROG_CC will come up with # defaults of its own if none are provided. m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS]) m4_define([_AC_ARG_VAR_PRECIOUS],[]) save_CFLAGS=$CFLAGS AC_PROG_CC CFLAGS=$save_CFLAGS m4_undefine([_AC_ARG_VAR_PRECIOUS]) m4_rename_force([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS]) AC_SUBST(CFLAGS) AM_PROG_AS AM_PROG_CC_C_O AC_PROG_LIBTOOL AC_CONFIG_MACRO_DIR([m4]) # Test for 64-bit build. AC_CHECK_SIZEOF([size_t]) AX_COMPILER_VENDOR AX_CC_MAXOPT # The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro # compiler. if test "$ax_cv_c_compiler_vendor" != "sun"; then AX_CFLAGS_WARN_ALL fi if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -fexceptions" touch local.exp else cat > local.exp < conftest.s if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then libffi_cv_as_x86_pcrel=yes fi ]) if test "x$libffi_cv_as_x86_pcrel" = xyes; then AC_DEFINE(HAVE_AS_X86_PCREL, 1, [Define if your assembler supports PC relative relocs.]) fi AC_CACHE_CHECK([assembler .ascii pseudo-op support], libffi_cv_as_ascii_pseudo_op, [ libffi_cv_as_ascii_pseudo_op=unknown # Check if we have .ascii AC_TRY_COMPILE(,[asm (".ascii \\"string\\"");], [libffi_cv_as_ascii_pseudo_op=yes], [libffi_cv_as_ascii_pseudo_op=no]) ]) if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1, [Define if your assembler supports .ascii.]) fi AC_CACHE_CHECK([assembler .string pseudo-op support], libffi_cv_as_string_pseudo_op, [ libffi_cv_as_string_pseudo_op=unknown # Check if we have .string AC_TRY_COMPILE(,[asm (".string \\"string\\"");], [libffi_cv_as_string_pseudo_op=yes], [libffi_cv_as_string_pseudo_op=no]) ]) if test "x$libffi_cv_as_string_pseudo_op" = xyes; then AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1, [Define if your assembler supports .string.]) fi fi # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. AC_ARG_ENABLE(pax_emutramp, [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], if test "$enable_pax_emutramp" = "yes"; then AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, [Define this if you want to enable pax emulated trampolines]) fi) if test x$TARGET = xX86_WIN64; then LT_SYS_SYMBOL_USCORE if test "x$sys_symbol_underscore" = xyes; then AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) fi fi FFI_EXEC_TRAMPOLINE_TABLE=0 case "$target" in *arm*-apple-darwin*) FFI_EXEC_TRAMPOLINE_TABLE=1 AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1, [Cannot use PROT_EXEC on this target, so, we revert to alternative means]) ;; *-apple-darwin1* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris*) AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1, [Cannot use malloc on this target, so, we revert to alternative means]) ;; esac AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1) AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE) if test x$TARGET = xX86_64; then AC_CACHE_CHECK([assembler supports unwind section type], libffi_cv_as_x86_64_unwind_section_type, [ libffi_cv_as_x86_64_unwind_section_type=yes echo '.section .eh_frame,"a",@unwind' > conftest.s if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then libffi_cv_as_x86_64_unwind_section_type=no fi ]) if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1, [Define if your assembler supports unwind section type.]) fi fi if test "x$GCC" = "xyes"; then AC_CACHE_CHECK([whether .eh_frame section should be read-only], libffi_cv_ro_eh_frame, [ libffi_cv_ro_eh_frame=no echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c if $CC $CFLAGS -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then objdump -h conftest.o > conftest.dump 2>&1 libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` libffi_test_line=`expr $libffi_eh_frame_line + 1`p sed -n $libffi_test_line conftest.dump > conftest.line if grep READONLY conftest.line > /dev/null; then libffi_cv_ro_eh_frame=yes fi fi rm -f conftest.* ]) if test "x$libffi_cv_ro_eh_frame" = xyes; then AC_DEFINE(HAVE_RO_EH_FRAME, 1, [Define if .eh_frame sections should be read-only.]) AC_DEFINE(EH_FRAME_FLAGS, "a", [Define to the flags needed for the .section .eh_frame directive. ]) else AC_DEFINE(EH_FRAME_FLAGS, "aw", [Define to the flags needed for the .section .eh_frame directive. ]) fi AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], libffi_cv_hidden_visibility_attribute, [ echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1 ; }' > conftest.c libffi_cv_hidden_visibility_attribute=no if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then if grep '\.hidden.*foo' conftest.s >/dev/null; then libffi_cv_hidden_visibility_attribute=yes fi fi rm -f conftest.* ]) if test $libffi_cv_hidden_visibility_attribute = yes; then AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1, [Define if __attribute__((visibility("hidden"))) is supported.]) fi fi AH_BOTTOM([ #ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE #ifdef LIBFFI_ASM #define FFI_HIDDEN(name) .hidden name #else #define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) #endif #else #ifdef LIBFFI_ASM #define FFI_HIDDEN(name) #else #define FFI_HIDDEN #endif #endif ]) AC_SUBST(TARGET) AC_SUBST(TARGETDIR) AC_SUBST(SHELL) AC_ARG_ENABLE(debug, [ --enable-debug debugging mode], if test "$enable_debug" = "yes"; then AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.]) fi) AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") AC_ARG_ENABLE(structs, [ --disable-structs omit code for struct support], if test "$enable_structs" = "no"; then AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this is you do not want support for aggregate types.]) fi) AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") AC_ARG_ENABLE(raw-api, [ --disable-raw-api make the raw api unavailable], if test "$enable_raw_api" = "no"; then AC_DEFINE(FFI_NO_RAW_API, 1, [Define this is you do not want support for the raw API.]) fi) AC_ARG_ENABLE(purify-safety, [ --enable-purify-safety purify-safe mode], if test "$enable_purify_safety" = "yes"; then AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.]) fi) # These variables are only ever used when we cross-build to X86_WIN32. # And we only support this with GCC, so... if test "x$GCC" = "xyes"; then if test -n "$with_cross_host" && test x"$with_cross_host" != x"no"; then toolexecdir='$(exec_prefix)/$(target_alias)' toolexeclibdir='$(toolexecdir)/lib' else toolexecdir='$(libdir)/gcc-lib/$(target_alias)' toolexeclibdir='$(libdir)' fi multi_os_directory=`$CC -print-multi-os-directory` case $multi_os_directory in .) ;; # Avoid trailing /. ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; esac AC_SUBST(toolexecdir) else toolexeclibdir='$(libdir)' fi AC_SUBST(toolexeclibdir) AC_CONFIG_COMMANDS(include, [test -d include || mkdir include]) AC_CONFIG_COMMANDS(src, [ test -d src || mkdir src test -d src/$TARGETDIR || mkdir src/$TARGETDIR ], [TARGETDIR="$TARGETDIR"]) AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h) AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc) AC_OUTPUT polyml-5.6/libffi/configure.host000066400000000000000000000004131265146633400170230ustar00rootroot00000000000000# configure.host # # This shell script handles all host based configuration for libffi. # # THIS TABLE IS SORTED. KEEP IT THAT WAY. case "${host}" in frv*-elf) LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ ;; esac polyml-5.6/libffi/depcomp000077500000000000000000000560161265146633400155320ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 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 2, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/libffi/doc/000077500000000000000000000000001265146633400147125ustar00rootroot00000000000000polyml-5.6/libffi/doc/libffi.info000066400000000000000000000514501265146633400170270ustar00rootroot00000000000000This is doc/libffi.info, produced by makeinfo version 4.13 from ./doc/libffi.texi. This manual is for Libffi, a portable foreign-function interface library. Copyright (C) 2008, 2010, 2011 Red Hat, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. A copy of the license is included in the section entitled "GNU General Public License". INFO-DIR-SECTION Development START-INFO-DIR-ENTRY * libffi: (libffi). Portable foreign-function interface library. END-INFO-DIR-ENTRY  File: libffi.info, Node: Top, Next: Introduction, Up: (dir) libffi ****** This manual is for Libffi, a portable foreign-function interface library. Copyright (C) 2008, 2010, 2011 Red Hat, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. A copy of the license is included in the section entitled "GNU General Public License". * Menu: * Introduction:: What is libffi? * Using libffi:: How to use libffi. * Missing Features:: Things libffi can't do. * Index:: Index.  File: libffi.info, Node: Introduction, Next: Using libffi, Prev: Top, Up: Top 1 What is libffi? ***************** Compilers for high level languages generate code that follow certain conventions. These conventions are necessary, in part, for separate compilation to work. One such convention is the "calling convention". The calling convention is a set of assumptions made by the compiler about where function arguments will be found on entry to a function. A calling convention also specifies where the return value for a function is found. The calling convention is also sometimes called the "ABI" or "Application Binary Interface". Some programs may not know at the time of compilation what arguments are to be passed to a function. For instance, an interpreter may be told at run-time about the number and types of arguments used to call a given function. `Libffi' can be used in such programs to provide a bridge from the interpreter program to compiled code. The `libffi' library provides a portable, high level programming interface to various calling conventions. This allows a programmer to call any function specified by a call interface description at run time. FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the interface that allows code written in one language to call code written in another language. The `libffi' library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. A layer must exist above `libffi' that handles type conversions for values passed between the two languages.  File: libffi.info, Node: Using libffi, Next: Missing Features, Prev: Introduction, Up: Top 2 Using libffi ************** * Menu: * The Basics:: The basic libffi API. * Simple Example:: A simple example. * Types:: libffi type descriptions. * Multiple ABIs:: Different passing styles on one platform. * The Closure API:: Writing a generic function. * Closure Example:: A closure example.  File: libffi.info, Node: The Basics, Next: Simple Example, Up: Using libffi 2.1 The Basics ============== `Libffi' assumes that you have a pointer to the function you wish to call and that you know the number and types of arguments to pass it, as well as the return type of the function. The first thing you must do is create an `ffi_cif' object that matches the signature of the function you wish to call. This is a separate step because it is common to make multiple calls using a single `ffi_cif'. The "cif" in `ffi_cif' stands for Call InterFace. To prepare a call interface object, use the function `ffi_prep_cif'. -- Function: ffi_status ffi_prep_cif (ffi_cif *CIF, ffi_abi ABI, unsigned int NARGS, ffi_type *RTYPE, ffi_type **ARGTYPES) This initializes CIF according to the given parameters. ABI is the ABI to use; normally `FFI_DEFAULT_ABI' is what you want. *note Multiple ABIs:: for more information. NARGS is the number of arguments that this function accepts. RTYPE is a pointer to an `ffi_type' structure that describes the return type of the function. *Note Types::. ARGTYPES is a vector of `ffi_type' pointers. ARGTYPES must have NARGS elements. If NARGS is 0, this argument is ignored. `ffi_prep_cif' returns a `libffi' status code, of type `ffi_status'. This will be either `FFI_OK' if everything worked properly; `FFI_BAD_TYPEDEF' if one of the `ffi_type' objects is incorrect; or `FFI_BAD_ABI' if the ABI parameter is invalid. If the function being called is variadic (varargs) then `ffi_prep_cif_var' must be used instead of `ffi_prep_cif'. -- Function: ffi_status ffi_prep_cif_var (ffi_cif *CIF, ffi_abi varabi, unsigned int NFIXEDARGS, unsigned int varntotalargs, ffi_type *RTYPE, ffi_type **ARGTYPES) This initializes CIF according to the given parameters for a call to a variadic function. In general it's operation is the same as for `ffi_prep_cif' except that: NFIXEDARGS is the number of fixed arguments, prior to any variadic arguments. It must be greater than zero. NTOTALARGS the total number of arguments, including variadic and fixed arguments. Note that, different cif's must be prepped for calls to the same function when different numbers of arguments are passed. Also note that a call to `ffi_prep_cif_var' with NFIXEDARGS=NOTOTALARGS is NOT equivalent to a call to `ffi_prep_cif'. To call a function using an initialized `ffi_cif', use the `ffi_call' function: -- Function: void ffi_call (ffi_cif *CIF, void *FN, void *RVALUE, void **AVALUES) This calls the function FN according to the description given in CIF. CIF must have already been prepared using `ffi_prep_cif'. RVALUE is a pointer to a chunk of memory that will hold the result of the function call. This must be large enough to hold the result and must be suitably aligned; it is the caller's responsibility to ensure this. If CIF declares that the function returns `void' (using `ffi_type_void'), then RVALUE is ignored. If RVALUE is `NULL', then the return value is discarded. AVALUES is a vector of `void *' pointers that point to the memory locations holding the argument values for a call. If CIF declares that the function has no arguments (i.e., NARGS was 0), then AVALUES is ignored. Note that argument values may be modified by the callee (for instance, structs passed by value); the burden of copying pass-by-value arguments is placed on the caller.  File: libffi.info, Node: Simple Example, Next: Types, Prev: The Basics, Up: Using libffi 2.2 Simple Example ================== Here is a trivial example that calls `puts' a few times. #include #include int main() { ffi_cif cif; ffi_type *args[1]; void *values[1]; char *s; int rc; /* Initialize the argument info vectors */ args[0] = &ffi_type_pointer; values[0] = &s; /* Initialize the cif */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint, args) == FFI_OK) { s = "Hello World!"; ffi_call(&cif, puts, &rc, values); /* rc now holds the result of the call to puts */ /* values holds a pointer to the function's arg, so to call puts() again all we need to do is change the value of s */ s = "This is cool!"; ffi_call(&cif, puts, &rc, values); } return 0; }  File: libffi.info, Node: Types, Next: Multiple ABIs, Prev: Simple Example, Up: Using libffi 2.3 Types ========= * Menu: * Primitive Types:: Built-in types. * Structures:: Structure types. * Type Example:: Structure type example.  File: libffi.info, Node: Primitive Types, Next: Structures, Up: Types 2.3.1 Primitive Types --------------------- `Libffi' provides a number of built-in type descriptors that can be used to describe argument and return types: `ffi_type_void' The type `void'. This cannot be used for argument types, only for return values. `ffi_type_uint8' An unsigned, 8-bit integer type. `ffi_type_sint8' A signed, 8-bit integer type. `ffi_type_uint16' An unsigned, 16-bit integer type. `ffi_type_sint16' A signed, 16-bit integer type. `ffi_type_uint32' An unsigned, 32-bit integer type. `ffi_type_sint32' A signed, 32-bit integer type. `ffi_type_uint64' An unsigned, 64-bit integer type. `ffi_type_sint64' A signed, 64-bit integer type. `ffi_type_float' The C `float' type. `ffi_type_double' The C `double' type. `ffi_type_uchar' The C `unsigned char' type. `ffi_type_schar' The C `signed char' type. (Note that there is not an exact equivalent to the C `char' type in `libffi'; ordinarily you should either use `ffi_type_schar' or `ffi_type_uchar' depending on whether `char' is signed.) `ffi_type_ushort' The C `unsigned short' type. `ffi_type_sshort' The C `short' type. `ffi_type_uint' The C `unsigned int' type. `ffi_type_sint' The C `int' type. `ffi_type_ulong' The C `unsigned long' type. `ffi_type_slong' The C `long' type. `ffi_type_longdouble' On platforms that have a C `long double' type, this is defined. On other platforms, it is not. `ffi_type_pointer' A generic `void *' pointer. You should use this for all pointers, regardless of their real type. Each of these is of type `ffi_type', so you must take the address when passing to `ffi_prep_cif'.  File: libffi.info, Node: Structures, Next: Type Example, Prev: Primitive Types, Up: Types 2.3.2 Structures ---------------- Although `libffi' has no special support for unions or bit-fields, it is perfectly happy passing structures back and forth. You must first describe the structure to `libffi' by creating a new `ffi_type' object for it. -- Data type: ffi_type The `ffi_type' has the following members: `size_t size' This is set by `libffi'; you should initialize it to zero. `unsigned short alignment' This is set by `libffi'; you should initialize it to zero. `unsigned short type' For a structure, this should be set to `FFI_TYPE_STRUCT'. `ffi_type **elements' This is a `NULL'-terminated array of pointers to `ffi_type' objects. There is one element per field of the struct.  File: libffi.info, Node: Type Example, Prev: Structures, Up: Types 2.3.3 Type Example ------------------ The following example initializes a `ffi_type' object representing the `tm' struct from Linux's `time.h'. Here is how the struct is defined: struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; /* Those are for future use. */ long int __tm_gmtoff__; __const char *__tm_zone__; }; Here is the corresponding code to describe this struct to `libffi': { ffi_type tm_type; ffi_type *tm_type_elements[12]; int i; tm_type.size = tm_type.alignment = 0; tm_type.elements = &tm_type_elements; for (i = 0; i < 9; i++) tm_type_elements[i] = &ffi_type_sint; tm_type_elements[9] = &ffi_type_slong; tm_type_elements[10] = &ffi_type_pointer; tm_type_elements[11] = NULL; /* tm_type can now be used to represent tm argument types and return types for ffi_prep_cif() */ }  File: libffi.info, Node: Multiple ABIs, Next: The Closure API, Prev: Types, Up: Using libffi 2.4 Multiple ABIs ================= A given platform may provide multiple different ABIs at once. For instance, the x86 platform has both `stdcall' and `fastcall' functions. `libffi' provides some support for this. However, this is necessarily platform-specific.  File: libffi.info, Node: The Closure API, Next: Closure Example, Prev: Multiple ABIs, Up: Using libffi 2.5 The Closure API =================== `libffi' also provides a way to write a generic function - a function that can accept and decode any combination of arguments. This can be useful when writing an interpreter, or to provide wrappers for arbitrary functions. This facility is called the "closure API". Closures are not supported on all platforms; you can check the `FFI_CLOSURES' define to determine whether they are supported on the current platform. Because closures work by assembling a tiny function at runtime, they require special allocation on platforms that have a non-executable heap. Memory management for closures is handled by a pair of functions: -- Function: void *ffi_closure_alloc (size_t SIZE, void **CODE) Allocate a chunk of memory holding SIZE bytes. This returns a pointer to the writable address, and sets *CODE to the corresponding executable address. SIZE should be sufficient to hold a `ffi_closure' object. -- Function: void ffi_closure_free (void *WRITABLE) Free memory allocated using `ffi_closure_alloc'. The argument is the writable address that was returned. Once you have allocated the memory for a closure, you must construct a `ffi_cif' describing the function call. Finally you can prepare the closure function: -- Function: ffi_status ffi_prep_closure_loc (ffi_closure *CLOSURE, ffi_cif *CIF, void (*FUN) (ffi_cif *CIF, void *RET, void **ARGS, void *USER_DATA), void *USER_DATA, void *CODELOC) Prepare a closure function. CLOSURE is the address of a `ffi_closure' object; this is the writable address returned by `ffi_closure_alloc'. CIF is the `ffi_cif' describing the function parameters. USER_DATA is an arbitrary datum that is passed, uninterpreted, to your closure function. CODELOC is the executable address returned by `ffi_closure_alloc'. FUN is the function which will be called when the closure is invoked. It is called with the arguments: CIF The `ffi_cif' passed to `ffi_prep_closure_loc'. RET A pointer to the memory used for the function's return value. FUN must fill this, unless the function is declared as returning `void'. ARGS A vector of pointers to memory holding the arguments to the function. USER_DATA The same USER_DATA that was passed to `ffi_prep_closure_loc'. `ffi_prep_closure_loc' will return `FFI_OK' if everything went ok, and something else on error. After calling `ffi_prep_closure_loc', you can cast CODELOC to the appropriate pointer-to-function type. You may see old code referring to `ffi_prep_closure'. This function is deprecated, as it cannot handle the need for separate writable and executable addresses.  File: libffi.info, Node: Closure Example, Prev: The Closure API, Up: Using libffi 2.6 Closure Example =================== A trivial example that creates a new `puts' by binding `fputs' with `stdin'. #include #include /* Acts like puts with the file given at time of enclosure. */ void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[], FILE *stream) { *ret = fputs(*(char **)args[0], stream); } int main() { ffi_cif cif; ffi_type *args[1]; ffi_closure *closure; int (*bound_puts)(char *); int rc; /* Allocate closure and bound_puts */ closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); if (closure) { /* Initialize the argument info vectors */ args[0] = &ffi_type_pointer; /* Initialize the cif */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint, args) == FFI_OK) { /* Initialize the closure, setting stream to stdout */ if (ffi_prep_closure_loc(closure, &cif, puts_binding, stdout, bound_puts) == FFI_OK) { rc = bound_puts("Hello World!"); /* rc now holds the result of the call to fputs */ } } } /* Deallocate both closure, and bound_puts */ ffi_closure_free(closure); return 0; }  File: libffi.info, Node: Missing Features, Next: Index, Prev: Using libffi, Up: Top 3 Missing Features ****************** `libffi' is missing a few features. We welcome patches to add support for these. * Variadic closures. * There is no support for bit fields in structures. * The closure API is * The "raw" API is undocumented. Note that variadic support is very new and tested on a relatively small number of platforms.  File: libffi.info, Node: Index, Prev: Missing Features, Up: Top Index ***** [index] * Menu: * ABI: Introduction. (line 13) * Application Binary Interface: Introduction. (line 13) * calling convention: Introduction. (line 13) * cif: The Basics. (line 14) * closure API: The Closure API. (line 13) * closures: The Closure API. (line 13) * FFI: Introduction. (line 31) * ffi_call: The Basics. (line 63) * ffi_closure_alloc: The Closure API. (line 19) * ffi_closure_free: The Closure API. (line 26) * FFI_CLOSURES: The Closure API. (line 13) * ffi_prep_cif: The Basics. (line 16) * ffi_prep_cif_var: The Basics. (line 39) * ffi_prep_closure_loc: The Closure API. (line 34) * ffi_status <1>: The Closure API. (line 37) * ffi_status: The Basics. (line 18) * ffi_type: Structures. (line 12) * ffi_type_double: Primitive Types. (line 41) * ffi_type_float: Primitive Types. (line 38) * ffi_type_longdouble: Primitive Types. (line 71) * ffi_type_pointer: Primitive Types. (line 75) * ffi_type_schar: Primitive Types. (line 47) * ffi_type_sint: Primitive Types. (line 62) * ffi_type_sint16: Primitive Types. (line 23) * ffi_type_sint32: Primitive Types. (line 29) * ffi_type_sint64: Primitive Types. (line 35) * ffi_type_sint8: Primitive Types. (line 17) * ffi_type_slong: Primitive Types. (line 68) * ffi_type_sshort: Primitive Types. (line 56) * ffi_type_uchar: Primitive Types. (line 44) * ffi_type_uint: Primitive Types. (line 59) * ffi_type_uint16: Primitive Types. (line 20) * ffi_type_uint32: Primitive Types. (line 26) * ffi_type_uint64: Primitive Types. (line 32) * ffi_type_uint8: Primitive Types. (line 14) * ffi_type_ulong: Primitive Types. (line 65) * ffi_type_ushort: Primitive Types. (line 53) * ffi_type_void: Primitive Types. (line 10) * Foreign Function Interface: Introduction. (line 31) * void <1>: The Closure API. (line 27) * void <2>: The Basics. (line 65) * void: The Closure API. (line 20)  Tag Table: Node: Top694 Node: Introduction1442 Node: Using libffi3078 Node: The Basics3564 Node: Simple Example7206 Node: Types8233 Node: Primitive Types8516 Node: Structures10336 Node: Type Example11206 Node: Multiple ABIs12429 Node: The Closure API12800 Node: Closure Example15744 Node: Missing Features17303 Node: Index17756  End Tag Table polyml-5.6/libffi/doc/libffi.texi000066400000000000000000000426101265146633400170430ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename libffi.info @settitle libffi @setchapternewpage off @c %**end of header @c Merge the standard indexes into a single one. @syncodeindex fn cp @syncodeindex vr cp @syncodeindex ky cp @syncodeindex pg cp @syncodeindex tp cp @include version.texi @copying This manual is for Libffi, a portable foreign-function interface library. Copyright @copyright{} 2008, 2010, 2011 Red Hat, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. A copy of the license is included in the section entitled ``GNU General Public License''. @end quotation @end copying @dircategory Development @direntry * libffi: (libffi). Portable foreign-function interface library. @end direntry @titlepage @title Libffi @page @vskip 0pt plus 1filll @insertcopying @end titlepage @ifnottex @node Top @top libffi @insertcopying @menu * Introduction:: What is libffi? * Using libffi:: How to use libffi. * Missing Features:: Things libffi can't do. * Index:: Index. @end menu @end ifnottex @node Introduction @chapter What is libffi? Compilers for high level languages generate code that follow certain conventions. These conventions are necessary, in part, for separate compilation to work. One such convention is the @dfn{calling convention}. The calling convention is a set of assumptions made by the compiler about where function arguments will be found on entry to a function. A calling convention also specifies where the return value for a function is found. The calling convention is also sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}. @cindex calling convention @cindex ABI @cindex Application Binary Interface Some programs may not know at the time of compilation what arguments are to be passed to a function. For instance, an interpreter may be told at run-time about the number and types of arguments used to call a given function. @samp{Libffi} can be used in such programs to provide a bridge from the interpreter program to compiled code. The @samp{libffi} library provides a portable, high level programming interface to various calling conventions. This allows a programmer to call any function specified by a call interface description at run time. @acronym{FFI} stands for Foreign Function Interface. A foreign function interface is the popular name for the interface that allows code written in one language to call code written in another language. The @samp{libffi} library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. A layer must exist above @samp{libffi} that handles type conversions for values passed between the two languages. @cindex FFI @cindex Foreign Function Interface @node Using libffi @chapter Using libffi @menu * The Basics:: The basic libffi API. * Simple Example:: A simple example. * Types:: libffi type descriptions. * Multiple ABIs:: Different passing styles on one platform. * The Closure API:: Writing a generic function. * Closure Example:: A closure example. @end menu @node The Basics @section The Basics @samp{Libffi} assumes that you have a pointer to the function you wish to call and that you know the number and types of arguments to pass it, as well as the return type of the function. The first thing you must do is create an @code{ffi_cif} object that matches the signature of the function you wish to call. This is a separate step because it is common to make multiple calls using a single @code{ffi_cif}. The @dfn{cif} in @code{ffi_cif} stands for Call InterFace. To prepare a call interface object, use the function @code{ffi_prep_cif}. @cindex cif @findex ffi_prep_cif @defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) This initializes @var{cif} according to the given parameters. @var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what you want. @ref{Multiple ABIs} for more information. @var{nargs} is the number of arguments that this function accepts. @var{rtype} is a pointer to an @code{ffi_type} structure that describes the return type of the function. @xref{Types}. @var{argtypes} is a vector of @code{ffi_type} pointers. @var{argtypes} must have @var{nargs} elements. If @var{nargs} is 0, this argument is ignored. @code{ffi_prep_cif} returns a @code{libffi} status code, of type @code{ffi_status}. This will be either @code{FFI_OK} if everything worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type} objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter is invalid. @end defun If the function being called is variadic (varargs) then @code{ffi_prep_cif_var} must be used instead of @code{ffi_prep_cif}. @findex ffi_prep_cif_var @defun ffi_status ffi_prep_cif_var (ffi_cif *@var{cif}, ffi_abi var{abi}, unsigned int @var{nfixedargs}, unsigned int var{ntotalargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes}) This initializes @var{cif} according to the given parameters for a call to a variadic function. In general it's operation is the same as for @code{ffi_prep_cif} except that: @var{nfixedargs} is the number of fixed arguments, prior to any variadic arguments. It must be greater than zero. @var{ntotalargs} the total number of arguments, including variadic and fixed arguments. Note that, different cif's must be prepped for calls to the same function when different numbers of arguments are passed. Also note that a call to @code{ffi_prep_cif_var} with @var{nfixedargs}=@var{nototalargs} is NOT equivalent to a call to @code{ffi_prep_cif}. @end defun To call a function using an initialized @code{ffi_cif}, use the @code{ffi_call} function: @findex ffi_call @defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues}) This calls the function @var{fn} according to the description given in @var{cif}. @var{cif} must have already been prepared using @code{ffi_prep_cif}. @var{rvalue} is a pointer to a chunk of memory that will hold the result of the function call. This must be large enough to hold the result and must be suitably aligned; it is the caller's responsibility to ensure this. If @var{cif} declares that the function returns @code{void} (using @code{ffi_type_void}), then @var{rvalue} is ignored. If @var{rvalue} is @samp{NULL}, then the return value is discarded. @var{avalues} is a vector of @code{void *} pointers that point to the memory locations holding the argument values for a call. If @var{cif} declares that the function has no arguments (i.e., @var{nargs} was 0), then @var{avalues} is ignored. Note that argument values may be modified by the callee (for instance, structs passed by value); the burden of copying pass-by-value arguments is placed on the caller. @end defun @node Simple Example @section Simple Example Here is a trivial example that calls @code{puts} a few times. @example #include #include int main() @{ ffi_cif cif; ffi_type *args[1]; void *values[1]; char *s; int rc; /* Initialize the argument info vectors */ args[0] = &ffi_type_pointer; values[0] = &s; /* Initialize the cif */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint, args) == FFI_OK) @{ s = "Hello World!"; ffi_call(&cif, puts, &rc, values); /* rc now holds the result of the call to puts */ /* values holds a pointer to the function's arg, so to call puts() again all we need to do is change the value of s */ s = "This is cool!"; ffi_call(&cif, puts, &rc, values); @} return 0; @} @end example @node Types @section Types @menu * Primitive Types:: Built-in types. * Structures:: Structure types. * Type Example:: Structure type example. @end menu @node Primitive Types @subsection Primitive Types @code{Libffi} provides a number of built-in type descriptors that can be used to describe argument and return types: @table @code @item ffi_type_void @tindex ffi_type_void The type @code{void}. This cannot be used for argument types, only for return values. @item ffi_type_uint8 @tindex ffi_type_uint8 An unsigned, 8-bit integer type. @item ffi_type_sint8 @tindex ffi_type_sint8 A signed, 8-bit integer type. @item ffi_type_uint16 @tindex ffi_type_uint16 An unsigned, 16-bit integer type. @item ffi_type_sint16 @tindex ffi_type_sint16 A signed, 16-bit integer type. @item ffi_type_uint32 @tindex ffi_type_uint32 An unsigned, 32-bit integer type. @item ffi_type_sint32 @tindex ffi_type_sint32 A signed, 32-bit integer type. @item ffi_type_uint64 @tindex ffi_type_uint64 An unsigned, 64-bit integer type. @item ffi_type_sint64 @tindex ffi_type_sint64 A signed, 64-bit integer type. @item ffi_type_float @tindex ffi_type_float The C @code{float} type. @item ffi_type_double @tindex ffi_type_double The C @code{double} type. @item ffi_type_uchar @tindex ffi_type_uchar The C @code{unsigned char} type. @item ffi_type_schar @tindex ffi_type_schar The C @code{signed char} type. (Note that there is not an exact equivalent to the C @code{char} type in @code{libffi}; ordinarily you should either use @code{ffi_type_schar} or @code{ffi_type_uchar} depending on whether @code{char} is signed.) @item ffi_type_ushort @tindex ffi_type_ushort The C @code{unsigned short} type. @item ffi_type_sshort @tindex ffi_type_sshort The C @code{short} type. @item ffi_type_uint @tindex ffi_type_uint The C @code{unsigned int} type. @item ffi_type_sint @tindex ffi_type_sint The C @code{int} type. @item ffi_type_ulong @tindex ffi_type_ulong The C @code{unsigned long} type. @item ffi_type_slong @tindex ffi_type_slong The C @code{long} type. @item ffi_type_longdouble @tindex ffi_type_longdouble On platforms that have a C @code{long double} type, this is defined. On other platforms, it is not. @item ffi_type_pointer @tindex ffi_type_pointer A generic @code{void *} pointer. You should use this for all pointers, regardless of their real type. @end table Each of these is of type @code{ffi_type}, so you must take the address when passing to @code{ffi_prep_cif}. @node Structures @subsection Structures Although @samp{libffi} has no special support for unions or bit-fields, it is perfectly happy passing structures back and forth. You must first describe the structure to @samp{libffi} by creating a new @code{ffi_type} object for it. @tindex ffi_type @deftp {Data type} ffi_type The @code{ffi_type} has the following members: @table @code @item size_t size This is set by @code{libffi}; you should initialize it to zero. @item unsigned short alignment This is set by @code{libffi}; you should initialize it to zero. @item unsigned short type For a structure, this should be set to @code{FFI_TYPE_STRUCT}. @item ffi_type **elements This is a @samp{NULL}-terminated array of pointers to @code{ffi_type} objects. There is one element per field of the struct. @end table @end deftp @node Type Example @subsection Type Example The following example initializes a @code{ffi_type} object representing the @code{tm} struct from Linux's @file{time.h}. Here is how the struct is defined: @example struct tm @{ int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; /* Those are for future use. */ long int __tm_gmtoff__; __const char *__tm_zone__; @}; @end example Here is the corresponding code to describe this struct to @code{libffi}: @example @{ ffi_type tm_type; ffi_type *tm_type_elements[12]; int i; tm_type.size = tm_type.alignment = 0; tm_type.elements = &tm_type_elements; for (i = 0; i < 9; i++) tm_type_elements[i] = &ffi_type_sint; tm_type_elements[9] = &ffi_type_slong; tm_type_elements[10] = &ffi_type_pointer; tm_type_elements[11] = NULL; /* tm_type can now be used to represent tm argument types and return types for ffi_prep_cif() */ @} @end example @node Multiple ABIs @section Multiple ABIs A given platform may provide multiple different ABIs at once. For instance, the x86 platform has both @samp{stdcall} and @samp{fastcall} functions. @code{libffi} provides some support for this. However, this is necessarily platform-specific. @c FIXME: document the platforms @node The Closure API @section The Closure API @code{libffi} also provides a way to write a generic function -- a function that can accept and decode any combination of arguments. This can be useful when writing an interpreter, or to provide wrappers for arbitrary functions. This facility is called the @dfn{closure API}. Closures are not supported on all platforms; you can check the @code{FFI_CLOSURES} define to determine whether they are supported on the current platform. @cindex closures @cindex closure API @findex FFI_CLOSURES Because closures work by assembling a tiny function at runtime, they require special allocation on platforms that have a non-executable heap. Memory management for closures is handled by a pair of functions: @findex ffi_closure_alloc @defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code}) Allocate a chunk of memory holding @var{size} bytes. This returns a pointer to the writable address, and sets *@var{code} to the corresponding executable address. @var{size} should be sufficient to hold a @code{ffi_closure} object. @end defun @findex ffi_closure_free @defun void ffi_closure_free (void *@var{writable}) Free memory allocated using @code{ffi_closure_alloc}. The argument is the writable address that was returned. @end defun Once you have allocated the memory for a closure, you must construct a @code{ffi_cif} describing the function call. Finally you can prepare the closure function: @findex ffi_prep_closure_loc @defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc}) Prepare a closure function. @var{closure} is the address of a @code{ffi_closure} object; this is the writable address returned by @code{ffi_closure_alloc}. @var{cif} is the @code{ffi_cif} describing the function parameters. @var{user_data} is an arbitrary datum that is passed, uninterpreted, to your closure function. @var{codeloc} is the executable address returned by @code{ffi_closure_alloc}. @var{fun} is the function which will be called when the closure is invoked. It is called with the arguments: @table @var @item cif The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}. @item ret A pointer to the memory used for the function's return value. @var{fun} must fill this, unless the function is declared as returning @code{void}. @c FIXME: is this NULL for void-returning functions? @item args A vector of pointers to memory holding the arguments to the function. @item user_data The same @var{user_data} that was passed to @code{ffi_prep_closure_loc}. @end table @code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything went ok, and something else on error. @c FIXME: what? After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc} to the appropriate pointer-to-function type. @end defun You may see old code referring to @code{ffi_prep_closure}. This function is deprecated, as it cannot handle the need for separate writable and executable addresses. @node Closure Example @section Closure Example A trivial example that creates a new @code{puts} by binding @code{fputs} with @code{stdin}. @example #include #include /* Acts like puts with the file given at time of enclosure. */ void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[], FILE *stream) @{ *ret = fputs(*(char **)args[0], stream); @} int main() @{ ffi_cif cif; ffi_type *args[1]; ffi_closure *closure; int (*bound_puts)(char *); int rc; /* Allocate closure and bound_puts */ closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts); if (closure) @{ /* Initialize the argument info vectors */ args[0] = &ffi_type_pointer; /* Initialize the cif */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint, args) == FFI_OK) @{ /* Initialize the closure, setting stream to stdout */ if (ffi_prep_closure_loc(closure, &cif, puts_binding, stdout, bound_puts) == FFI_OK) @{ rc = bound_puts("Hello World!"); /* rc now holds the result of the call to fputs */ @} @} @} /* Deallocate both closure, and bound_puts */ ffi_closure_free(closure); return 0; @} @end example @node Missing Features @chapter Missing Features @code{libffi} is missing a few features. We welcome patches to add support for these. @itemize @bullet @item Variadic closures. @item There is no support for bit fields in structures. @item The closure API is @c FIXME: ... @item The ``raw'' API is undocumented. @c argument promotion? @c unions? @c anything else? @end itemize Note that variadic support is very new and tested on a relatively small number of platforms. @node Index @unnumbered Index @printindex cp @bye polyml-5.6/libffi/doc/stamp-vti000066400000000000000000000001411265146633400165550ustar00rootroot00000000000000@set UPDATED 16 March 2013 @set UPDATED-MONTH March 2013 @set EDITION 3.0.13 @set VERSION 3.0.13 polyml-5.6/libffi/doc/version.texi000066400000000000000000000001411265146633400172660ustar00rootroot00000000000000@set UPDATED 16 March 2013 @set UPDATED-MONTH March 2013 @set EDITION 3.0.13 @set VERSION 3.0.13 polyml-5.6/libffi/fficonfig.h.in000066400000000000000000000127161265146633400166640ustar00rootroot00000000000000/* fficonfig.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to the flags needed for the .section .eh_frame directive. */ #undef EH_FRAME_FLAGS /* Define this if you want extra debugging. */ #undef FFI_DEBUG /* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ #undef FFI_EXEC_TRAMPOLINE_TABLE /* Define this if you want to enable pax emulated trampolines */ #undef FFI_MMAP_EXEC_EMUTRAMP_PAX /* Cannot use malloc on this target, so, we revert to alternative means */ #undef FFI_MMAP_EXEC_WRIT /* Define this is you do not want support for the raw API. */ #undef FFI_NO_RAW_API /* Define this is you do not want support for aggregate types. */ #undef FFI_NO_STRUCTS /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define if your assembler supports .ascii. */ #undef HAVE_AS_ASCII_PSEUDO_OP /* Define if your assembler supports .cfi_* directives. */ #undef HAVE_AS_CFI_PSEUDO_OP /* Define if your assembler supports .register. */ #undef HAVE_AS_REGISTER_PSEUDO_OP /* Define if your assembler and linker support unaligned PC relative relocs. */ #undef HAVE_AS_SPARC_UA_PCREL /* Define if your assembler supports .string. */ #undef HAVE_AS_STRING_PSEUDO_OP /* Define if your assembler supports unwind section type. */ #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE /* Define if your assembler supports PC relative relocs. */ #undef HAVE_AS_X86_PCREL /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if __attribute__((visibility("hidden"))) is supported. */ #undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if you have the long double type and it is bigger than a double */ #undef HAVE_LONG_DOUBLE /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define if mmap with MAP_ANON(YMOUS) works. */ #undef HAVE_MMAP_ANON /* Define if mmap of /dev/zero works. */ #undef HAVE_MMAP_DEV_ZERO /* Define if read-only mmap of a plain file works. */ #undef HAVE_MMAP_FILE /* Define if .eh_frame sections should be read-only. */ #undef HAVE_RO_EH_FRAME /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `long double', as computed by sizeof. */ #undef SIZEOF_LONG_DOUBLE /* The size of `size_t', as computed by sizeof. */ #undef SIZEOF_SIZE_T /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if symbols are underscored. */ #undef SYMBOL_UNDERSCORE /* Define this if you are using Purify and want to suppress spurious messages. */ #undef USING_PURIFY /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to `unsigned int' if does not define. */ #undef size_t #ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE #ifdef LIBFFI_ASM #define FFI_HIDDEN(name) .hidden name #else #define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) #endif #else #ifdef LIBFFI_ASM #define FFI_HIDDEN(name) #else #define FFI_HIDDEN #endif #endif polyml-5.6/libffi/generate-ios-source-and-headers.py000066400000000000000000000122671265146633400225600ustar00rootroot00000000000000#!/usr/bin/env python import subprocess import re import os import errno import collections import sys class Platform(object): pass sdk_re = re.compile(r'.*-sdk ([a-zA-Z0-9.]*)') def sdkinfo(sdkname): ret = {} for line in subprocess.Popen(['xcodebuild', '-sdk', sdkname, '-version'], stdout=subprocess.PIPE).stdout: kv = line.strip().split(': ', 1) if len(kv) == 2: k,v = kv ret[k] = v return ret sim_sdk_info = sdkinfo('iphonesimulator') device_sdk_info = sdkinfo('iphoneos') def latest_sdks(): latest_sim = None latest_device = None for line in subprocess.Popen(['xcodebuild', '-showsdks'], stdout=subprocess.PIPE).stdout: match = sdk_re.match(line) if match: if 'Simulator' in line: latest_sim = match.group(1) elif 'iOS' in line: latest_device = match.group(1) return latest_sim, latest_device sim_sdk, device_sdk = latest_sdks() class simulator_platform(Platform): sdk='iphonesimulator' arch = 'i386' name = 'simulator' triple = 'i386-apple-darwin10' sdkroot = sim_sdk_info['Path'] prefix = "#if !defined(__arm__) && defined(__i386__)\n\n" suffix = "\n\n#endif" class device_platform(Platform): sdk='iphoneos' name = 'ios' arch = 'armv7' triple = 'arm-apple-darwin10' sdkroot = device_sdk_info['Path'] prefix = "#ifdef __arm__\n\n" suffix = "\n\n#endif" def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): if not os.path.exists(dst_dir): os.makedirs(dst_dir) out_filename = filename if file_suffix: split_name = os.path.splitext(filename) out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) with open(os.path.join(src_dir, filename)) as in_file: with open(os.path.join(dst_dir, out_filename), 'w') as out_file: if prefix: out_file.write(prefix) out_file.write(in_file.read()) if suffix: out_file.write(suffix) headers_seen = collections.defaultdict(set) def move_source_tree(src_dir, dest_dir, dest_include_dir, arch=None, prefix=None, suffix=None): for root, dirs, files in os.walk(src_dir, followlinks=True): relroot = os.path.relpath(root,src_dir) def move_dir(arch, prefix='', suffix='', files=[]): for file in files: file_suffix = None if file.endswith('.h'): if dest_include_dir: file_suffix = arch if arch: headers_seen[file].add(arch) move_file(root, dest_include_dir, file, arch, prefix=prefix, suffix=suffix) elif dest_dir: outroot = os.path.join(dest_dir, relroot) move_file(root, outroot, file, prefix=prefix, suffix=suffix) if relroot == '.': move_dir(arch=arch, files=files, prefix=prefix, suffix=suffix) elif relroot == 'arm': move_dir(arch='arm', prefix="#ifdef __arm__\n\n", suffix="\n\n#endif", files=files) elif relroot == 'x86': move_dir(arch='i386', prefix="#if !defined(__arm__) && defined(__i386__)\n\n", suffix="\n\n#endif", files=files) def build_target(platform): def xcrun_cmd(cmd): return subprocess.check_output(['xcrun', '-sdk', platform.sdkroot, '-find', cmd]).strip() build_dir = 'build_' + platform.name if not os.path.exists(build_dir): os.makedirs(build_dir) env = dict(CC=xcrun_cmd('clang'), LD=xcrun_cmd('ld'), CFLAGS='-arch %s -isysroot %s -miphoneos-version-min=4.0' % (platform.arch, platform.sdkroot)) working_dir=os.getcwd() try: os.chdir(build_dir) subprocess.check_call(['../configure', '-host', platform.triple], env=env) move_source_tree('.', None, '../ios/include', arch=platform.arch, prefix=platform.prefix, suffix=platform.suffix) move_source_tree('./include', None, '../ios/include', arch=platform.arch, prefix=platform.prefix, suffix=platform.suffix) finally: os.chdir(working_dir) for header_name, archs in headers_seen.iteritems(): basename, suffix = os.path.splitext(header_name) def main(): move_source_tree('src', 'ios/src', 'ios/include') move_source_tree('include', None, 'ios/include') build_target(simulator_platform) build_target(device_platform) for header_name, archs in headers_seen.iteritems(): basename, suffix = os.path.splitext(header_name) with open(os.path.join('ios/include', header_name), 'w') as header: for arch in archs: header.write('#include <%s_%s%s>\n' % (basename, arch, suffix)) if __name__ == '__main__': main() polyml-5.6/libffi/generate-osx-source-and-headers.py000066400000000000000000000121001265146633400225610ustar00rootroot00000000000000#!/usr/bin/env python import subprocess import re import os import errno import collections import sys class Platform(object): pass sdk_re = re.compile(r'.*-sdk ([a-zA-Z0-9.]*)') def sdkinfo(sdkname): ret = {} for line in subprocess.Popen(['xcodebuild', '-sdk', sdkname, '-version'], stdout=subprocess.PIPE).stdout: kv = line.strip().split(': ', 1) if len(kv) == 2: k,v = kv ret[k] = v return ret desktop_sdk_info = sdkinfo('macosx') def latest_sdks(): latest_desktop = None for line in subprocess.Popen(['xcodebuild', '-showsdks'], stdout=subprocess.PIPE).stdout: match = sdk_re.match(line) if match: if 'OS X' in line: latest_desktop = match.group(1) return latest_desktop desktop_sdk = latest_sdks() class desktop_platform_32(Platform): sdk='macosx' arch = 'i386' name = 'mac32' triple = 'i386-apple-darwin10' sdkroot = desktop_sdk_info['Path'] prefix = "#if defined(__i386__) && !defined(__x86_64__)\n\n" suffix = "\n\n#endif" class desktop_platform_64(Platform): sdk='macosx' arch = 'x86_64' name = 'mac' triple = 'x86_64-apple-darwin10' sdkroot = desktop_sdk_info['Path'] prefix = "#if !defined(__i386__) && defined(__x86_64__)\n\n" suffix = "\n\n#endif" def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): if not os.path.exists(dst_dir): os.makedirs(dst_dir) out_filename = filename if file_suffix: split_name = os.path.splitext(filename) out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) with open(os.path.join(src_dir, filename)) as in_file: with open(os.path.join(dst_dir, out_filename), 'w') as out_file: if prefix: out_file.write(prefix) out_file.write(in_file.read()) if suffix: out_file.write(suffix) headers_seen = collections.defaultdict(set) def move_source_tree(src_dir, dest_dir, dest_include_dir, arch=None, prefix=None, suffix=None): for root, dirs, files in os.walk(src_dir, followlinks=True): relroot = os.path.relpath(root,src_dir) def move_dir(arch, prefix='', suffix='', files=[]): for file in files: file_suffix = None if file.endswith('.h'): if dest_include_dir: file_suffix = arch if arch: headers_seen[file].add(arch) move_file(root, dest_include_dir, file, arch, prefix=prefix, suffix=suffix) elif dest_dir: outroot = os.path.join(dest_dir, relroot) move_file(root, outroot, file, prefix=prefix, suffix=suffix) if relroot == '.': move_dir(arch=arch, files=files, prefix=prefix, suffix=suffix) elif relroot == 'x86': move_dir(arch='i386', prefix="#if defined(__i386__) && !defined(__x86_64__)\n\n", suffix="\n\n#endif", files=files) move_dir(arch='x86_64', prefix="#if !defined(__i386__) && defined(__x86_64__)\n\n", suffix="\n\n#endif", files=files) def build_target(platform): def xcrun_cmd(cmd): return subprocess.check_output(['xcrun', '-sdk', platform.sdkroot, '-find', cmd]).strip() build_dir = 'build_' + platform.name if not os.path.exists(build_dir): os.makedirs(build_dir) env = dict(CC=xcrun_cmd('clang'), LD=xcrun_cmd('ld'), CFLAGS='-arch %s -isysroot %s -mmacosx-version-min=10.6' % (platform.arch, platform.sdkroot)) working_dir=os.getcwd() try: os.chdir(build_dir) subprocess.check_call(['../configure', '-host', platform.triple], env=env) move_source_tree('.', None, '../osx/include', arch=platform.arch, prefix=platform.prefix, suffix=platform.suffix) move_source_tree('./include', None, '../osx/include', arch=platform.arch, prefix=platform.prefix, suffix=platform.suffix) finally: os.chdir(working_dir) for header_name, archs in headers_seen.iteritems(): basename, suffix = os.path.splitext(header_name) def main(): move_source_tree('src', 'osx/src', 'osx/include') move_source_tree('include', None, 'osx/include') build_target(desktop_platform_32) build_target(desktop_platform_64) for header_name, archs in headers_seen.iteritems(): basename, suffix = os.path.splitext(header_name) with open(os.path.join('osx/include', header_name), 'w') as header: for arch in archs: header.write('#include <%s_%s%s>\n' % (basename, arch, suffix)) if __name__ == '__main__': main() polyml-5.6/libffi/include/000077500000000000000000000000001265146633400155705ustar00rootroot00000000000000polyml-5.6/libffi/include/Makefile.am000066400000000000000000000003711265146633400176250ustar00rootroot00000000000000## Process this with automake to create Makefile.in AUTOMAKE_OPTIONS=foreign DISTCLEANFILES=ffitarget.h EXTRA_DIST=ffi.h.in ffi_common.h includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include nodist_includes_HEADERS = ffi.h ffitarget.h polyml-5.6/libffi/include/Makefile.in000066400000000000000000000422711265146633400176430ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = include DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/ffi.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_configure_args.m4 \ $(top_srcdir)/m4/ax_enable_builddir.m4 \ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/fficonfig.h CONFIG_CLEAN_FILES = ffi.h ffitarget.h CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(includesdir)" HEADERS = $(nodist_includes_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LTLDFLAGS = @AM_LTLDFLAGS@ AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PRTDIAG = @PRTDIAG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_enable_builddir_sed = @ax_enable_builddir_sed@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ toolexecdir = @toolexecdir@ toolexeclibdir = @toolexeclibdir@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign DISTCLEANFILES = ffitarget.h EXTRA_DIST = ffi.h.in ffi_common.h includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include nodist_includes_HEADERS = ffi.h ffitarget.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nodist_includesHEADERS: $(nodist_includes_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \ done uninstall-nodist_includesHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includesdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-nodist_includesHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-nodist_includesHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man \ install-nodist_includesHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-nodist_includesHEADERS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libffi/include/ffi.h.in000066400000000000000000000313501265146633400171140ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- libffi @VERSION@ - Copyright (c) 2011 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* ------------------------------------------------------------------- The basic API is described in the README file. The raw API is designed to bypass some of the argument packing and unpacking on architectures for which it can be avoided. The closure API allows interpreted functions to be packaged up inside a C function pointer, so that they can be called as C functions, with no understanding on the client side that they are interpreted. It can also be used in other cases in which it is necessary to package up a user specified parameter and a function pointer as a single function pointer. The closure API must be implemented in order to get its functionality, e.g. for use by gij. Routines are provided to emulate the raw API if the underlying platform doesn't allow faster implementation. More details on the raw and cloure API can be found in: http://gcc.gnu.org/ml/java/1999-q3/msg00138.html and http://gcc.gnu.org/ml/java/1999-q3/msg00174.html -------------------------------------------------------------------- */ #ifndef LIBFFI_H #define LIBFFI_H #ifdef __cplusplus extern "C" { #endif /* Specify which architecture libffi is configured for. */ #ifndef @TARGET@ #define @TARGET@ #endif /* ---- System configuration information --------------------------------- */ #include #ifndef LIBFFI_ASM #ifdef _MSC_VER #define __attribute__(X) #endif #include #include /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). But we can find it either under the correct ANSI name, or under GNU C's internal name. */ #define FFI_64_BIT_MAX 9223372036854775807 #ifdef LONG_LONG_MAX # define FFI_LONG_LONG_MAX LONG_LONG_MAX #else # ifdef LLONG_MAX # define FFI_LONG_LONG_MAX LLONG_MAX # ifdef _AIX52 /* or newer has C99 LLONG_MAX */ # undef FFI_64_BIT_MAX # define FFI_64_BIT_MAX 9223372036854775807LL # endif /* _AIX52 or newer */ # else # ifdef __GNUC__ # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ # endif # ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ # ifndef __PPC64__ # if defined (__IBMC__) || defined (__IBMCPP__) # define FFI_LONG_LONG_MAX LONGLONG_MAX # endif # endif /* __PPC64__ */ # undef FFI_64_BIT_MAX # define FFI_64_BIT_MAX 9223372036854775807LL # endif # endif #endif /* The closure code assumes that this works on pointers, i.e. a size_t */ /* can hold a pointer. */ typedef struct _ffi_type { size_t size; unsigned short alignment; unsigned short type; struct _ffi_type **elements; } ffi_type; #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 # define ffi_type_schar ffi_type_sint8 #else #error "char size not supported" #endif #if SHRT_MAX == 32767 # define ffi_type_ushort ffi_type_uint16 # define ffi_type_sshort ffi_type_sint16 #elif SHRT_MAX == 2147483647 # define ffi_type_ushort ffi_type_uint32 # define ffi_type_sshort ffi_type_sint32 #else #error "short size not supported" #endif #if INT_MAX == 32767 # define ffi_type_uint ffi_type_uint16 # define ffi_type_sint ffi_type_sint16 #elif INT_MAX == 2147483647 # define ffi_type_uint ffi_type_uint32 # define ffi_type_sint ffi_type_sint32 #elif INT_MAX == 9223372036854775807 # define ffi_type_uint ffi_type_uint64 # define ffi_type_sint ffi_type_sint64 #else #error "int size not supported" #endif #if LONG_MAX == 2147483647 # if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX #error "no 64-bit data type supported" # endif #elif LONG_MAX != FFI_64_BIT_MAX #error "long size not supported" #endif #if LONG_MAX == 2147483647 # define ffi_type_ulong ffi_type_uint32 # define ffi_type_slong ffi_type_sint32 #elif LONG_MAX == FFI_64_BIT_MAX # define ffi_type_ulong ffi_type_uint64 # define ffi_type_slong ffi_type_sint64 #else #error "long size not supported" #endif /* Need minimal decorations for DLLs to works on Windows. */ /* GCC has autoimport and autoexport. Rely on Libtool to */ /* help MSVC export from a DLL, but always declare data */ /* to be imported for MSVC clients. This costs an extra */ /* indirection for MSVC clients using the static version */ /* of the library, but don't worry about that. Besides, */ /* as a workaround, they can define FFI_BUILDING if they */ /* *know* they are going to link with the static library. */ #if defined _MSC_VER && !defined FFI_BUILDING #define FFI_EXTERN extern __declspec(dllimport) #else #define FFI_EXTERN extern #endif /* These are defined in types.c */ FFI_EXTERN ffi_type ffi_type_void; FFI_EXTERN ffi_type ffi_type_uint8; FFI_EXTERN ffi_type ffi_type_sint8; FFI_EXTERN ffi_type ffi_type_uint16; FFI_EXTERN ffi_type ffi_type_sint16; FFI_EXTERN ffi_type ffi_type_uint32; FFI_EXTERN ffi_type ffi_type_sint32; FFI_EXTERN ffi_type ffi_type_uint64; FFI_EXTERN ffi_type ffi_type_sint64; FFI_EXTERN ffi_type ffi_type_float; FFI_EXTERN ffi_type ffi_type_double; FFI_EXTERN ffi_type ffi_type_pointer; #if @HAVE_LONG_DOUBLE@ FFI_EXTERN ffi_type ffi_type_longdouble; #else #define ffi_type_longdouble ffi_type_double #endif #endif /* LIBFFI_HIDE_BASIC_TYPES */ typedef enum { FFI_OK = 0, FFI_BAD_TYPEDEF, FFI_BAD_ABI } ffi_status; typedef unsigned FFI_TYPE; typedef struct { ffi_abi abi; unsigned nargs; ffi_type **arg_types; ffi_type *rtype; unsigned bytes; unsigned flags; #ifdef FFI_EXTRA_CIF_FIELDS FFI_EXTRA_CIF_FIELDS; #endif } ffi_cif; /* Used internally, but overridden by some architectures */ ffi_status ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, unsigned int isvariadic, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes); /* ---- Definitions for the raw API -------------------------------------- */ #ifndef FFI_SIZEOF_ARG # if LONG_MAX == 2147483647 # define FFI_SIZEOF_ARG 4 # elif LONG_MAX == FFI_64_BIT_MAX # define FFI_SIZEOF_ARG 8 # endif #endif #ifndef FFI_SIZEOF_JAVA_RAW # define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG #endif typedef union { ffi_sarg sint; ffi_arg uint; float flt; char data[FFI_SIZEOF_ARG]; void* ptr; } ffi_raw; #if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 /* This is a special case for mips64/n32 ABI (and perhaps others) where sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ typedef union { signed int sint; unsigned int uint; float flt; char data[FFI_SIZEOF_JAVA_RAW]; void* ptr; } ffi_java_raw; #else typedef ffi_raw ffi_java_raw; #endif void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); size_t ffi_raw_size (ffi_cif *cif); /* This is analogous to the raw API, except it uses Java parameter */ /* packing, even on 64-bit machines. I.e. on 64-bit machines */ /* longs and doubles are followed by an empty 64-bit word. */ void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_java_raw *avalue); void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); size_t ffi_java_raw_size (ffi_cif *cif); /* ---- Definitions for closures ----------------------------------------- */ #if FFI_CLOSURES #ifdef _MSC_VER __declspec(align(8)) #endif typedef struct { #if @FFI_EXEC_TRAMPOLINE_TABLE@ void *trampoline_table; void *trampoline_table_entry; #else char tramp[FFI_TRAMPOLINE_SIZE]; #endif ffi_cif *cif; void (*fun)(ffi_cif*,void*,void**,void*); void *user_data; #ifdef __GNUC__ } ffi_closure __attribute__((aligned (8))); #else } ffi_closure; # ifdef __sgi # pragma pack 0 # endif #endif void *ffi_closure_alloc (size_t size, void **code); void ffi_closure_free (void *); ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data); ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void*codeloc); #ifdef __sgi # pragma pack 8 #endif typedef struct { #if @FFI_EXEC_TRAMPOLINE_TABLE@ void *trampoline_table; void *trampoline_table_entry; #else char tramp[FFI_TRAMPOLINE_SIZE]; #endif ffi_cif *cif; #if !FFI_NATIVE_RAW_API /* if this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate handler to do the transaltion, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; #endif void (*fun)(ffi_cif*,void*,ffi_raw*,void*); void *user_data; } ffi_raw_closure; typedef struct { #if @FFI_EXEC_TRAMPOLINE_TABLE@ void *trampoline_table; void *trampoline_table_entry; #else char tramp[FFI_TRAMPOLINE_SIZE]; #endif ffi_cif *cif; #if !FFI_NATIVE_RAW_API /* if this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate handler to do the transaltion, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; #endif void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); void *user_data; } ffi_java_raw_closure; ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data); ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, void *codeloc); #endif /* FFI_CLOSURES */ /* ---- Public interface definition -------------------------------------- */ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); /* Useful for eliminating compiler warnings */ #define FFI_FN(f) ((void (*)(void))f) /* ---- Definitions shared with assembly code ---------------------------- */ #endif /* If these change, update src/mips/ffitarget.h. */ #define FFI_TYPE_VOID 0 #define FFI_TYPE_INT 1 #define FFI_TYPE_FLOAT 2 #define FFI_TYPE_DOUBLE 3 #if @HAVE_LONG_DOUBLE@ #define FFI_TYPE_LONGDOUBLE 4 #else #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE #endif #define FFI_TYPE_UINT8 5 #define FFI_TYPE_SINT8 6 #define FFI_TYPE_UINT16 7 #define FFI_TYPE_SINT16 8 #define FFI_TYPE_UINT32 9 #define FFI_TYPE_SINT32 10 #define FFI_TYPE_UINT64 11 #define FFI_TYPE_SINT64 12 #define FFI_TYPE_STRUCT 13 #define FFI_TYPE_POINTER 14 /* This should always refer to the last type code (for sanity checks) */ #define FFI_TYPE_LAST FFI_TYPE_POINTER #ifdef __cplusplus } #endif #endif polyml-5.6/libffi/include/ffi_common.h000066400000000000000000000065301265146633400200610ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi_common.h - Copyright (C) 2011, 2012 Anthony Green Copyright (C) 2007 Free Software Foundation, Inc Copyright (c) 1996 Red Hat, Inc. Common internal definitions and macros. Only necessary for building libffi. ----------------------------------------------------------------------- */ #ifndef FFI_COMMON_H #define FFI_COMMON_H #ifdef __cplusplus extern "C" { #endif #include /* Do not move this. Some versions of AIX are very picky about where this is positioned. */ #ifdef __GNUC__ /* mingw64 defines this already in malloc.h. */ #ifndef alloca # define alloca __builtin_alloca #endif # define MAYBE_UNUSED __attribute__((__unused__)) #else # define MAYBE_UNUSED # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ # ifdef _MSC_VER # define alloca _alloca # else char *alloca (); # endif # endif # endif # endif #endif /* Check for the existence of memcpy. */ #if STDC_HEADERS # include #else # ifndef HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # endif #endif #if defined(FFI_DEBUG) #include #endif #ifdef FFI_DEBUG void ffi_assert(char *expr, char *file, int line); void ffi_stop_here(void); void ffi_type_test(ffi_type *a, char *file, int line); #define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) #define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) #define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) #else #define FFI_ASSERT(x) #define FFI_ASSERT_AT(x, f, l) #define FFI_ASSERT_VALID_TYPE(x) #endif #define ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) #define ALIGN_DOWN(v, a) (((size_t) (v)) & -a) /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif); ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs); /* Extended cif, used in callback from assembly routine */ typedef struct { ffi_cif *cif; void *rvalue; void **avalue; } extended_cif; /* Terse sized type definitions. */ #if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) typedef unsigned char UINT8; typedef signed char SINT8; typedef unsigned short UINT16; typedef signed short SINT16; typedef unsigned int UINT32; typedef signed int SINT32; # ifdef _MSC_VER typedef unsigned __int64 UINT64; typedef signed __int64 SINT64; # else # include typedef uint64_t UINT64; typedef int64_t SINT64; # endif #else typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); typedef signed int SINT8 __attribute__((__mode__(__QI__))); typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); typedef signed int SINT16 __attribute__((__mode__(__HI__))); typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); typedef signed int SINT32 __attribute__((__mode__(__SI__))); typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); typedef signed int SINT64 __attribute__((__mode__(__DI__))); #endif typedef float FLOAT32; #ifndef __GNUC__ #define __builtin_expect(x, expected_value) (x) #endif #define LIKELY(x) __builtin_expect(!!(x),1) #define UNLIKELY(x) __builtin_expect((x)!=0,0) #ifdef __cplusplus } #endif #endif polyml-5.6/libffi/install-sh000077500000000000000000000332551265146633400161610ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/libffi/libffi.pc.in000066400000000000000000000004251265146633400163320ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include Name: @PACKAGE_NAME@ Description: Library supporting Foreign Function Interfaces Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lffi Cflags: -I${includedir} polyml-5.6/libffi/libffi.vcxproj000066400000000000000000000546331265146633400170300ustar00rootroot00000000000000 Debug Win32 IntDebug Win32 IntDebug x64 IntRelease Win32 IntRelease x64 Release Win32 Debug x64 Release x64 {6D86BC6F-E74E-40C5-9881-F8BB606BCA78} Win32Proj libffi StaticLibrary true v140_xp Unicode StaticLibrary true v140_xp Unicode StaticLibrary false v140_xp true Unicode StaticLibrary false v140_xp true Unicode StaticLibrary true v140_xp Unicode StaticLibrary true v140_xp Unicode StaticLibrary false v140_xp true Unicode StaticLibrary false v140_xp true Unicode true true true true false false false false Level3 Disabled _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreadedDebug Windows true Level3 Disabled _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreadedDebug Windows true Level3 Disabled _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreadedDebug Windows true Level3 Disabled _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreadedDebug Windows true Level3 MaxSpeed true true _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreaded Windows true true true Level3 MaxSpeed true true _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreaded Windows true true true Level3 MaxSpeed true true _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreaded Windows true true true Level3 MaxSpeed true true _LIB;LONG_LONG_MAX=_I64_MAX msvc32include;src\x86;include MultiThreaded Windows true true true true true true true Document cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml /nologo /Fo $(IntDir)%(Filename).obj /c /coff $(IntDir)%(Filename).asm $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) true true true true Document cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm cl /nologo /EP /Imsvc32include /Isrc\x86 /I. /Iinclude /D_MSC_VER "%(FullPath)" > $(IntDir)%(Filename).asm ml64 /nologo /Fo $(IntDir)%(Filename).obj /c $(IntDir)%(Filename).asm $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) $(IntDir)%(Filename).obj;$(IntDir)%(Filename).asm;%(Outputs) polyml-5.6/libffi/libffi.xcodeproj/000077500000000000000000000000001265146633400173745ustar00rootroot00000000000000polyml-5.6/libffi/libffi.xcodeproj/project.pbxproj000066400000000000000000000673011265146633400224570ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 6C43CBDC1534F76F00162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBBD1534F76F00162364 /* ffi.c */; }; 6C43CBDD1534F76F00162364 /* sysv.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBBF1534F76F00162364 /* sysv.S */; }; 6C43CBDE1534F76F00162364 /* trampoline.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBC01534F76F00162364 /* trampoline.S */; }; 6C43CBE61534F76F00162364 /* darwin.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBC91534F76F00162364 /* darwin.S */; }; 6C43CBE81534F76F00162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CBCB1534F76F00162364 /* ffi.c */; }; 6C43CC1F1534F77800162364 /* darwin.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC051534F77800162364 /* darwin.S */; }; 6C43CC201534F77800162364 /* darwin64.S in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC061534F77800162364 /* darwin64.S */; }; 6C43CC211534F77800162364 /* ffi.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC071534F77800162364 /* ffi.c */; }; 6C43CC221534F77800162364 /* ffi64.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC081534F77800162364 /* ffi64.c */; }; 6C43CC2F1534F7BE00162364 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC281534F7BE00162364 /* closures.c */; }; 6C43CC301534F7BE00162364 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC281534F7BE00162364 /* closures.c */; }; 6C43CC351534F7BE00162364 /* java_raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2B1534F7BE00162364 /* java_raw_api.c */; }; 6C43CC361534F7BE00162364 /* java_raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2B1534F7BE00162364 /* java_raw_api.c */; }; 6C43CC371534F7BE00162364 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2C1534F7BE00162364 /* prep_cif.c */; }; 6C43CC381534F7BE00162364 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2C1534F7BE00162364 /* prep_cif.c */; }; 6C43CC391534F7BE00162364 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2D1534F7BE00162364 /* raw_api.c */; }; 6C43CC3A1534F7BE00162364 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2D1534F7BE00162364 /* raw_api.c */; }; 6C43CC3B1534F7BE00162364 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2E1534F7BE00162364 /* types.c */; }; 6C43CC3C1534F7BE00162364 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = 6C43CC2E1534F7BE00162364 /* types.c */; }; 6C43CC971535032600162364 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8D1535032600162364 /* ffi.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CC981535032600162364 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8E1535032600162364 /* ffi_common.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CC991535032600162364 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC8F1535032600162364 /* ffi_i386.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CC9A1535032600162364 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC901535032600162364 /* ffi_x86_64.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CC9B1535032600162364 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC911535032600162364 /* fficonfig.h */; }; 6C43CC9C1535032600162364 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC921535032600162364 /* fficonfig_i386.h */; }; 6C43CC9D1535032600162364 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC931535032600162364 /* fficonfig_x86_64.h */; }; 6C43CC9E1535032600162364 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC941535032600162364 /* ffitarget.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CC9F1535032600162364 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC951535032600162364 /* ffitarget_i386.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCA01535032600162364 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CC961535032600162364 /* ffitarget_x86_64.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCAD1535039600162364 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA21535039600162364 /* ffi.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCAE1535039600162364 /* ffi_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA31535039600162364 /* ffi_armv7.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCAF1535039600162364 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA41535039600162364 /* ffi_common.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCB01535039600162364 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA51535039600162364 /* ffi_i386.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCB11535039600162364 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA61535039600162364 /* fficonfig.h */; }; 6C43CCB21535039600162364 /* fficonfig_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA71535039600162364 /* fficonfig_armv7.h */; }; 6C43CCB31535039600162364 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA81535039600162364 /* fficonfig_i386.h */; }; 6C43CCB41535039600162364 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCA91535039600162364 /* ffitarget.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCB51535039600162364 /* ffitarget_arm.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAA1535039600162364 /* ffitarget_arm.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCB61535039600162364 /* ffitarget_armv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAB1535039600162364 /* ffitarget_armv7.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C43CCB71535039600162364 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C43CCAC1535039600162364 /* ffitarget_i386.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 6C43CB3D1534E9D100162364 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; 6C43CBBD1534F76F00162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = ""; }; 6C43CBBF1534F76F00162364 /* sysv.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv.S; sourceTree = ""; }; 6C43CBC01534F76F00162364 /* trampoline.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = trampoline.S; sourceTree = ""; }; 6C43CBC91534F76F00162364 /* darwin.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin.S; sourceTree = ""; }; 6C43CBCB1534F76F00162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = ""; }; 6C43CC051534F77800162364 /* darwin.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin.S; sourceTree = ""; }; 6C43CC061534F77800162364 /* darwin64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = darwin64.S; sourceTree = ""; }; 6C43CC071534F77800162364 /* ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi.c; sourceTree = ""; }; 6C43CC081534F77800162364 /* ffi64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64.c; sourceTree = ""; }; 6C43CC281534F7BE00162364 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = closures.c; path = src/closures.c; sourceTree = SOURCE_ROOT; }; 6C43CC2B1534F7BE00162364 /* java_raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = java_raw_api.c; path = src/java_raw_api.c; sourceTree = SOURCE_ROOT; }; 6C43CC2C1534F7BE00162364 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = prep_cif.c; path = src/prep_cif.c; sourceTree = SOURCE_ROOT; }; 6C43CC2D1534F7BE00162364 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raw_api.c; path = src/raw_api.c; sourceTree = SOURCE_ROOT; }; 6C43CC2E1534F7BE00162364 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = types.c; path = src/types.c; sourceTree = SOURCE_ROOT; }; 6C43CC8D1535032600162364 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; 6C43CC8E1535032600162364 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; 6C43CC8F1535032600162364 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; 6C43CC901535032600162364 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; 6C43CC911535032600162364 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; 6C43CC921535032600162364 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; 6C43CC931535032600162364 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; 6C43CC941535032600162364 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; 6C43CC951535032600162364 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; 6C43CC961535032600162364 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; 6C43CCA21535039600162364 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; 6C43CCA31535039600162364 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = ""; }; 6C43CCA41535039600162364 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; 6C43CCA51535039600162364 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; 6C43CCA61535039600162364 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; 6C43CCA71535039600162364 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = ""; }; 6C43CCA81535039600162364 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; 6C43CCA91535039600162364 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; 6C43CCAA1535039600162364 /* ffitarget_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm.h; sourceTree = ""; }; 6C43CCAB1535039600162364 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = ""; }; 6C43CCAC1535039600162364 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; F6F980BA147386130008F121 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 6C43CB3A1534E9D100162364 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; F6F980B7147386130008F121 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 6C43CBAF1534F76F00162364 /* iOS */ = { isa = PBXGroup; children = ( 6C43CCA11535039600162364 /* include */, 6C43CBBB1534F76F00162364 /* src */, ); name = iOS; path = ios; sourceTree = ""; }; 6C43CBBB1534F76F00162364 /* src */ = { isa = PBXGroup; children = ( 6C43CBC81534F76F00162364 /* x86 */, 6C43CBBC1534F76F00162364 /* arm */, ); path = src; sourceTree = ""; }; 6C43CBBC1534F76F00162364 /* arm */ = { isa = PBXGroup; children = ( 6C43CBBD1534F76F00162364 /* ffi.c */, 6C43CBBF1534F76F00162364 /* sysv.S */, 6C43CBC01534F76F00162364 /* trampoline.S */, ); path = arm; sourceTree = ""; }; 6C43CBC81534F76F00162364 /* x86 */ = { isa = PBXGroup; children = ( 6C43CBC91534F76F00162364 /* darwin.S */, 6C43CBCB1534F76F00162364 /* ffi.c */, ); path = x86; sourceTree = ""; }; 6C43CBF01534F77800162364 /* OS X */ = { isa = PBXGroup; children = ( 6C43CC8C1535032600162364 /* include */, 6C43CBFC1534F77800162364 /* src */, ); name = "OS X"; path = osx; sourceTree = ""; }; 6C43CBFC1534F77800162364 /* src */ = { isa = PBXGroup; children = ( 6C43CC041534F77800162364 /* x86 */, ); path = src; sourceTree = ""; }; 6C43CC041534F77800162364 /* x86 */ = { isa = PBXGroup; children = ( 6C43CC051534F77800162364 /* darwin.S */, 6C43CC061534F77800162364 /* darwin64.S */, 6C43CC071534F77800162364 /* ffi.c */, 6C43CC081534F77800162364 /* ffi64.c */, ); path = x86; sourceTree = ""; }; 6C43CC3D1534F7C400162364 /* src */ = { isa = PBXGroup; children = ( 6C43CC281534F7BE00162364 /* closures.c */, 6C43CC2B1534F7BE00162364 /* java_raw_api.c */, 6C43CC2C1534F7BE00162364 /* prep_cif.c */, 6C43CC2D1534F7BE00162364 /* raw_api.c */, 6C43CC2E1534F7BE00162364 /* types.c */, ); name = src; path = ios; sourceTree = ""; }; 6C43CC8C1535032600162364 /* include */ = { isa = PBXGroup; children = ( 6C43CC8D1535032600162364 /* ffi.h */, 6C43CC8E1535032600162364 /* ffi_common.h */, 6C43CC8F1535032600162364 /* ffi_i386.h */, 6C43CC901535032600162364 /* ffi_x86_64.h */, 6C43CC911535032600162364 /* fficonfig.h */, 6C43CC921535032600162364 /* fficonfig_i386.h */, 6C43CC931535032600162364 /* fficonfig_x86_64.h */, 6C43CC941535032600162364 /* ffitarget.h */, 6C43CC951535032600162364 /* ffitarget_i386.h */, 6C43CC961535032600162364 /* ffitarget_x86_64.h */, ); path = include; sourceTree = ""; }; 6C43CCA11535039600162364 /* include */ = { isa = PBXGroup; children = ( 6C43CCA21535039600162364 /* ffi.h */, 6C43CCA31535039600162364 /* ffi_armv7.h */, 6C43CCA41535039600162364 /* ffi_common.h */, 6C43CCA51535039600162364 /* ffi_i386.h */, 6C43CCA61535039600162364 /* fficonfig.h */, 6C43CCA71535039600162364 /* fficonfig_armv7.h */, 6C43CCA81535039600162364 /* fficonfig_i386.h */, 6C43CCA91535039600162364 /* ffitarget.h */, 6C43CCAA1535039600162364 /* ffitarget_arm.h */, 6C43CCAB1535039600162364 /* ffitarget_armv7.h */, 6C43CCAC1535039600162364 /* ffitarget_i386.h */, ); path = include; sourceTree = ""; }; F6B0839514721EE50031D8A1 = { isa = PBXGroup; children = ( 6C43CC3D1534F7C400162364 /* src */, 6C43CBAF1534F76F00162364 /* iOS */, 6C43CBF01534F77800162364 /* OS X */, F6F980C6147386260008F121 /* Products */, ); sourceTree = ""; }; F6F980C6147386260008F121 /* Products */ = { isa = PBXGroup; children = ( F6F980BA147386130008F121 /* libffi.a */, 6C43CB3D1534E9D100162364 /* libffi.a */, ); name = Products; path = ../..; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 6C43CB3B1534E9D100162364 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 6C43CC971535032600162364 /* ffi.h in Headers */, 6C43CC981535032600162364 /* ffi_common.h in Headers */, 6C43CC991535032600162364 /* ffi_i386.h in Headers */, 6C43CC9A1535032600162364 /* ffi_x86_64.h in Headers */, 6C43CC9E1535032600162364 /* ffitarget.h in Headers */, 6C43CC9F1535032600162364 /* ffitarget_i386.h in Headers */, 6C43CCA01535032600162364 /* ffitarget_x86_64.h in Headers */, 6C43CC9B1535032600162364 /* fficonfig.h in Headers */, 6C43CC9C1535032600162364 /* fficonfig_i386.h in Headers */, 6C43CC9D1535032600162364 /* fficonfig_x86_64.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; F6F980B8147386130008F121 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 6C43CCAD1535039600162364 /* ffi.h in Headers */, 6C43CCAE1535039600162364 /* ffi_armv7.h in Headers */, 6C43CCAF1535039600162364 /* ffi_common.h in Headers */, 6C43CCB01535039600162364 /* ffi_i386.h in Headers */, 6C43CCB41535039600162364 /* ffitarget.h in Headers */, 6C43CCB51535039600162364 /* ffitarget_arm.h in Headers */, 6C43CCB61535039600162364 /* ffitarget_armv7.h in Headers */, 6C43CCB71535039600162364 /* ffitarget_i386.h in Headers */, 6C43CCB11535039600162364 /* fficonfig.h in Headers */, 6C43CCB21535039600162364 /* fficonfig_armv7.h in Headers */, 6C43CCB31535039600162364 /* fficonfig_i386.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 6C43CB3C1534E9D100162364 /* libffi OS X */ = { isa = PBXNativeTarget; buildConfigurationList = 6C43CB4A1534E9D100162364 /* Build configuration list for PBXNativeTarget "libffi OS X" */; buildPhases = ( 6C43CC401534FF3B00162364 /* Generate Source and Headers */, 6C43CB391534E9D100162364 /* Sources */, 6C43CB3A1534E9D100162364 /* Frameworks */, 6C43CB3B1534E9D100162364 /* Headers */, ); buildRules = ( ); dependencies = ( ); name = "libffi OS X"; productName = "ffi OS X"; productReference = 6C43CB3D1534E9D100162364 /* libffi.a */; productType = "com.apple.product-type.library.static"; }; F6F980B9147386130008F121 /* libffi iOS */ = { isa = PBXNativeTarget; buildConfigurationList = F6F980C4147386130008F121 /* Build configuration list for PBXNativeTarget "libffi iOS" */; buildPhases = ( 6C43CC3E1534F8E200162364 /* Generate Trampoline */, 6C43CC3F1534FF1B00162364 /* Generate Source and Headers */, F6F980B6147386130008F121 /* Sources */, F6F980B7147386130008F121 /* Frameworks */, F6F980B8147386130008F121 /* Headers */, ); buildRules = ( ); dependencies = ( ); name = "libffi iOS"; productName = ffi; productReference = F6F980BA147386130008F121 /* libffi.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ F6B0839714721EE50031D8A1 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0430; }; buildConfigurationList = F6B0839A14721EE50031D8A1 /* Build configuration list for PBXProject "libffi" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = F6B0839514721EE50031D8A1; productRefGroup = F6B0839514721EE50031D8A1; projectDirPath = ""; projectRoot = ""; targets = ( F6F980B9147386130008F121 /* libffi iOS */, 6C43CB3C1534E9D100162364 /* libffi OS X */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ 6C43CC3E1534F8E200162364 /* Generate Trampoline */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Generate Trampoline"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /usr/bin/python; shellScript = "import subprocess\nimport re\nimport os\nimport errno\nimport sys\n\ndef main():\n with open('src/arm/trampoline.S', 'w') as tramp_out:\n p = subprocess.Popen(['bash', 'src/arm/gentramp.sh'], stdout=tramp_out)\n p.wait()\n\nif __name__ == '__main__':\n main()"; }; 6C43CC3F1534FF1B00162364 /* Generate Source and Headers */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Generate Source and Headers"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/python generate-ios-source-and-headers.py"; }; 6C43CC401534FF3B00162364 /* Generate Source and Headers */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Generate Source and Headers"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/python generate-osx-source-and-headers.py"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 6C43CB391534E9D100162364 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 6C43CC1F1534F77800162364 /* darwin.S in Sources */, 6C43CC201534F77800162364 /* darwin64.S in Sources */, 6C43CC211534F77800162364 /* ffi.c in Sources */, 6C43CC221534F77800162364 /* ffi64.c in Sources */, 6C43CC301534F7BE00162364 /* closures.c in Sources */, 6C43CC361534F7BE00162364 /* java_raw_api.c in Sources */, 6C43CC381534F7BE00162364 /* prep_cif.c in Sources */, 6C43CC3A1534F7BE00162364 /* raw_api.c in Sources */, 6C43CC3C1534F7BE00162364 /* types.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; F6F980B6147386130008F121 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 6C43CBDC1534F76F00162364 /* ffi.c in Sources */, 6C43CBDD1534F76F00162364 /* sysv.S in Sources */, 6C43CBDE1534F76F00162364 /* trampoline.S in Sources */, 6C43CBE61534F76F00162364 /* darwin.S in Sources */, 6C43CBE81534F76F00162364 /* ffi.c in Sources */, 6C43CC2F1534F7BE00162364 /* closures.c in Sources */, 6C43CC351534F7BE00162364 /* java_raw_api.c in Sources */, 6C43CC371534F7BE00162364 /* prep_cif.c in Sources */, 6C43CC391534F7BE00162364 /* raw_api.c in Sources */, 6C43CC3B1534F7BE00162364 /* types.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 6C43CB4B1534E9D100162364 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; DSTROOT = /tmp/ffi.dst; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = ffi; SDKROOT = macosx; }; name = Debug; }; 6C43CB4C1534E9D100162364 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DSTROOT = /tmp/ffi.dst; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"", ); GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; PRODUCT_NAME = ffi; SDKROOT = macosx; }; name = Release; }; F6B083AB14721EE50031D8A1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VALUE = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ios/include; SDKROOT = iphoneos; }; name = Debug; }; F6B083AC14721EE50031D8A1 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VALUE = NO; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ios/include; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; F6F980C2147386130008F121 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( armv6, armv7, ); DSTROOT = /tmp/ffi.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_THUMB_SUPPORT = NO; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = ffi; SKIP_INSTALL = YES; }; name = Debug; }; F6F980C3147386130008F121 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( armv6, armv7, ); DSTROOT = /tmp/ffi.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_THUMB_SUPPORT = NO; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = ffi; SKIP_INSTALL = YES; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 6C43CB4A1534E9D100162364 /* Build configuration list for PBXNativeTarget "libffi OS X" */ = { isa = XCConfigurationList; buildConfigurations = ( 6C43CB4B1534E9D100162364 /* Debug */, 6C43CB4C1534E9D100162364 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; F6B0839A14721EE50031D8A1 /* Build configuration list for PBXProject "libffi" */ = { isa = XCConfigurationList; buildConfigurations = ( F6B083AB14721EE50031D8A1 /* Debug */, F6B083AC14721EE50031D8A1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; F6F980C4147386130008F121 /* Build configuration list for PBXNativeTarget "libffi iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( F6F980C2147386130008F121 /* Debug */, F6F980C3147386130008F121 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = F6B0839714721EE50031D8A1 /* Project object */; } polyml-5.6/libffi/libtool-ldflags000066400000000000000000000064521265146633400171550ustar00rootroot00000000000000#! /bin/sh # Script to translate LDFLAGS into a form suitable for use with libtool. # Copyright (C) 2005 Free Software Foundation, Inc. # # This file 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. # Contributed by CodeSourcery, LLC. # This script is designed to be used from a Makefile that uses libtool # to build libraries as follows: # # LTLDFLAGS = $(shell libtool-ldflags $(LDFLAGS)) # # Then, use (LTLDFLAGS) in place of $(LDFLAGS) in your link line. # The output of the script. This string is built up as we process the # arguments. result= prev_arg= for arg do case $arg in -f*|--*) # Libtool does not ascribe any special meaning options # that begin with -f or with a double-dash. So, it will # think these options are linker options, and prefix them # with "-Wl,". Then, the compiler driver will ignore the # options. So, we prefix these options with -Xcompiler to # make clear to libtool that they are in fact compiler # options. case $prev_arg in -Xpreprocessor|-Xcompiler|-Xlinker) # This option is already prefixed; don't prefix it again. ;; *) result="$result -Xcompiler" ;; esac ;; *) # We do not want to add -Xcompiler to other options because # that would prevent libtool itself from recognizing them. ;; esac prev_arg=$arg # If $(LDFLAGS) is (say): # a "b'c d" e # then the user expects that: # $(LD) $(LDFLAGS) # will pass three arguments to $(LD): # 1) a # 2) b'c d # 3) e # We must ensure, therefore, that the arguments are appropriately # quoted so that using: # libtool --mode=link ... $(LTLDFLAGS) # will result in the same number of arguments being passed to # libtool. In other words, when this script was invoked, the shell # removed one level of quoting, present in $(LDFLAGS); we have to put # it back. # Quote any embedded single quotes. case $arg in *"'"*) # The following command creates the script: # 1s,^X,,;s|'|'"'"'|g # which removes a leading X, and then quotes and embedded single # quotes. sed_script="1s,^X,,;s|'|'\"'\"'|g" # Add a leading "X" so that if $arg starts with a dash, # the echo command will not try to interpret the argument # as a command-line option. arg="X$arg" # Generate the quoted string. quoted_arg=`echo "$arg" | sed -e "$sed_script"` ;; *) quoted_arg=$arg ;; esac # Surround the entire argument with single quotes. quoted_arg="'"$quoted_arg"'" # Add it to the string. result="$result $quoted_arg" done # Output the string we have built up. echo "$result" polyml-5.6/libffi/libtool-version000066400000000000000000000021071265146633400172170ustar00rootroot00000000000000# This file is used to maintain libtool version info for libffi. See # the libtool manual to understand the meaning of the fields. This is # a separate file so that version updates don't involve re-running # automake. # # Here are a set of rules to help you update your library version # information: # # 1. Start with version information of `0:0:0' for each libtool library. # # 2. Update the version information only immediately before a public # release of your software. More frequent updates are unnecessary, # and only guarantee that the current interface number gets larger # faster. # # 3. If the library source code has changed at all since the last # update, then increment revision (`c:r:a' becomes `c:r+1:a'). # # 4. If any interfaces have been added, removed, or changed since the # last update, increment current, and set revision to 0. # # 5. If any interfaces have been added since the last public release, # then increment age. # # 6. If any interfaces have been removed since the last public # release, then set age to 0. # # CURRENT:REVISION:AGE 6:1:0 polyml-5.6/libffi/ltmain.sh000066400000000000000000010520301265146633400157660ustar00rootroot00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.11" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 polyml-5.6/libffi/m4/000077500000000000000000000000001265146633400144655ustar00rootroot00000000000000polyml-5.6/libffi/m4/asmcfi.m4000066400000000000000000000007021265146633400161700ustar00rootroot00000000000000AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], [AC_CACHE_CHECK([assembler .cfi pseudo-op support], gcc_cv_as_cfi_pseudo_op, [ gcc_cv_as_cfi_pseudo_op=unknown AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],, [gcc_cv_as_cfi_pseudo_op=yes], [gcc_cv_as_cfi_pseudo_op=no]) ]) if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, [Define if your assembler supports .cfi_* directives.]) fi ]) polyml-5.6/libffi/m4/ax_append_flag.m4000066400000000000000000000053041265146633400176610ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS # # AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) # # DESCRIPTION # # FLAG is appended to the FLAGS-VARIABLE shell variable, with a space # added in between. # # If FLAGS-VARIABLE is not specified, the current language's flags (e.g. # CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains # FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly # FLAG. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 2 AC_DEFUN([AX_APPEND_FLAG], [AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl AS_VAR_SET_IF(FLAGS, [case " AS_VAR_GET(FLAGS) " in *" $1 "*) AC_RUN_LOG([: FLAGS already contains $1]) ;; *) AC_RUN_LOG([: FLAGS="$FLAGS $1"]) AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) ;; esac], [AS_VAR_SET(FLAGS,["$1"])]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG polyml-5.6/libffi/m4/ax_cc_maxopt.m4000066400000000000000000000161201265146633400173740ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html # =========================================================================== # # SYNOPSIS # # AX_CC_MAXOPT # # DESCRIPTION # # Try to turn on "good" C optimization flags for various compilers and # architectures, for some definition of "good". (In our case, good for # FFTW and hopefully for other scientific codes. Modify as needed.) # # The user can override the flags by setting the CFLAGS environment # variable. The user can also specify --enable-portable-binary in order to # disable any optimization flags that might result in a binary that only # runs on the host architecture. # # Note also that the flags assume that ANSI C aliasing rules are followed # by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point # computations can be re-ordered as needed. # # Requires macros: AX_CHECK_COMPILE_FLAG, AX_COMPILER_VENDOR, # AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 13 AC_DEFUN([AX_CC_MAXOPT], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AX_COMPILER_VENDOR]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])], acx_maxopt_portable=$enableval, acx_maxopt_portable=no) # Try to determine "good" native compiler flags if none specified via CFLAGS if test "$ac_test_CFLAGS" != "set"; then CFLAGS="" case $ax_cv_c_compiler_vendor in dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" if test "x$acx_maxopt_portable" = xno; then CFLAGS="$CFLAGS -arch host" fi;; sun) CFLAGS="-native -fast -xO5 -dalign" if test "x$acx_maxopt_portable" = xyes; then CFLAGS="$CFLAGS -xarch=generic" fi;; hp) CFLAGS="+Oall +Optrs_ansi +DSnative" if test "x$acx_maxopt_portable" = xyes; then CFLAGS="$CFLAGS +DAportable" fi;; ibm) if test "x$acx_maxopt_portable" = xno; then xlc_opt="-qarch=auto -qtune=auto" else xlc_opt="-qtune=auto" fi AX_CHECK_COMPILE_FLAG($xlc_opt, CFLAGS="-O3 -qansialias -w $xlc_opt", [CFLAGS="-O3 -qansialias -w" echo "******************************************************" echo "* You seem to have the IBM C compiler. It is *" echo "* recommended for best performance that you use: *" echo "* *" echo "* CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *" echo "* ^^^ ^^^ *" echo "* where xxx is pwr2, pwr3, 604, or whatever kind of *" echo "* CPU you have. (Set the CFLAGS environment var. *" echo "* and re-run configure.) For more info, man cc. *" echo "******************************************************"]) ;; intel) CFLAGS="-O3 -ansi_alias" if test "x$acx_maxopt_portable" = xno; then icc_archflag=unknown icc_flags="" case $host_cpu in i686*|x86_64*) # icc accepts gcc assembly syntax, so these should work: AX_GCC_X86_CPUID(0) AX_GCC_X86_CPUID(1) case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG *:756e6547:*:*) # Intel case $ax_cv_gcc_x86_cpuid_1 in *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";; *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";; *f??:*:*:*) icc_flags="-xN -xW -xK";; esac ;; esac ;; esac if test "x$icc_flags" != x; then for flag in $icc_flags; do AX_CHECK_COMPILE_FLAG($flag, [icc_archflag=$flag; break]) done fi AC_MSG_CHECKING([for icc architecture flag]) AC_MSG_RESULT($icc_archflag) if test "x$icc_archflag" != xunknown; then CFLAGS="$CFLAGS $icc_archflag" fi fi ;; gnu) # default optimization flags for gcc on all systems CFLAGS="-O3 -fomit-frame-pointer" # -malign-double for x86 systems # LIBFFI -- DON'T DO THIS - CHANGES ABI # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") # -fstrict-aliasing for gcc-2.95+ AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, CFLAGS="$CFLAGS -fstrict-aliasing") # note that we enable "unsafe" fp optimization with other compilers, too AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") AX_GCC_ARCHFLAG($acx_maxopt_portable) ;; esac if test -z "$CFLAGS"; then echo "" echo "********************************************************" echo "* WARNING: Don't know the best CFLAGS for this system *" echo "* Use ./configure CFLAGS=... to specify your own flags *" echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" echo "********************************************************" echo "" CFLAGS="-O3" fi AX_CHECK_COMPILE_FLAG($CFLAGS, [], [ echo "" echo "********************************************************" echo "* WARNING: The guessed CFLAGS don't seem to work with *" echo "* your compiler. *" echo "* Use ./configure CFLAGS=... to specify your own flags *" echo "********************************************************" echo "" CFLAGS="" ]) fi ]) polyml-5.6/libffi/m4/ax_cflags_warn_all.m4000066400000000000000000000116711265146633400205430ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html # =========================================================================== # # SYNOPSIS # # AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # # DESCRIPTION # # Try to find a compiler option that enables most reasonable warnings. # # For the GNU compiler it will be -Wall (and -ansi -pedantic) The result # is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. # # Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, # HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and # Intel compilers. For a given compiler, the Fortran flags are much more # experimental than their C equivalents. # # - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS # - $2 add-value-if-not-found : nothing # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # NOTE: These macros depend on AX_APPEND_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2010 Rhys Ulerich # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 14 AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], VAR,[VAR="no, unknown" ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-warn all % -warn all" dnl Intel "-pedantic % -Wall" dnl GCC "-xstrconst % -v" dnl Solaris C "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX "-ansi -ansiE % -fullwarn" dnl IRIX "+ESlit % +w1" dnl HP-UX C "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) "-h conform % -h msglevel 2" dnl Cray C (Unicos) # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" ]) AS_VAR_POPDEF([FLAGS])dnl AC_REQUIRE([AX_APPEND_FLAG]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; esac AS_VAR_POPDEF([VAR])dnl ])dnl AX_FLAGS_WARN_ALL dnl implementation tactics: dnl the for-argument contains a list of options. The first part of dnl these does only exist to detect the compiler - usually it is dnl a global option to enable -ansi or -extrawarnings. All other dnl compilers will fail about it. That was needed since a lot of dnl compilers will give false positives for some option-syntax dnl like -Woption or -Xoption as they think of it is a pass-through dnl to later compile stages or something. The "%" is used as a dnl delimiter. A non-option comment can be given after "%%" marks dnl which will be shown but not added to the respective C/CXXFLAGS. AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([C]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([C]) ]) AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([C++]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([C++]) ]) AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl AC_LANG_PUSH([Fortran]) AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) AC_LANG_POP([Fortran]) ]) polyml-5.6/libffi/m4/ax_check_compile_flag.m4000066400000000000000000000062511265146633400212010ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) # # DESCRIPTION # # Check whether the given FLAG works with the current language's compiler # or gives an error. (Warnings, however, are ignored) # # ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on # success/failure. # # If EXTRA-FLAGS is defined, it is added to the current language's default # flags (e.g. CFLAGS) when the check is done. The check is thus made with # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 2 AC_DEFUN([AX_CHECK_COMPILE_FLAG], [AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS polyml-5.6/libffi/m4/ax_compiler_vendor.m4000066400000000000000000000066161265146633400206170ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html # =========================================================================== # # SYNOPSIS # # AX_COMPILER_VENDOR # # DESCRIPTION # # Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun, # hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft, # watcom, etc. The vendor is returned in the cache variable # $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 11 AC_DEFUN([AX_COMPILER_VENDOR], [AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [# note: don't check for gcc first since some other compilers define __GNUC__ vendors="intel: __ICC,__ECC,__INTEL_COMPILER ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale: __PATHCC__,__PATHSCALE__ clang: __clang__ gnu: __GNUC__ sun: __SUNPRO_C,__SUNPRO_CC hp: __HP_cc,__HP_aCC dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland: __BORLANDC__,__TURBOC__ comeau: __COMO__ cray: _CRAYC kai: __KCC lcc: __LCC__ sgi: __sgi,sgi microsoft: _MSC_VER metrowerks: __MWERKS__ watcom: __WATCOMC__ portland: __PGI unknown: UNKNOWN" for ventest in $vendors; do case $ventest in *:) vendor=$ventest; continue ;; *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; esac AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ #if !($vencpp) thisisanerror; #endif ])], [break]) done ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` ]) ]) polyml-5.6/libffi/m4/ax_configure_args.m4000066400000000000000000000055021265146633400204160ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_configure_args.html # =========================================================================== # # SYNOPSIS # # AX_CONFIGURE_ARGS # # DESCRIPTION # # Helper macro for AX_ENABLE_BUILDDIR. # # The traditional way of starting a subdir-configure is running the script # with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have # to rely on eval'ing $ac_configure_args however some old autoconf # versions do not provide that. To ensure maximum portability of autoconf # extension macros this helper can be AC_REQUIRE'd so that # $ac_configure_args will alsways be present. # # Sadly, the traditional "exec $SHELL" of the enable_builddir macros is # spoiled now and must be replaced by "eval + exit $?". # # Example: # # AC_DEFUN([AX_ENABLE_SUBDIR],[dnl # AC_REQUIRE([AX_CONFIGURE_ARGS])dnl # eval $SHELL $ac_configure_args || exit $? # ...]) # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 9 AC_DEFUN([AX_CONFIGURE_ARGS],[ # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args if test "${ac_configure_args+set}" != "set" ; then ac_configure_args= for ac_arg in ${1+"[$]@"}; do ac_configure_args="$ac_configure_args '$ac_arg'" done fi ]) polyml-5.6/libffi/m4/ax_enable_builddir.m4000066400000000000000000000315141265146633400205270ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html # =========================================================================== # # SYNOPSIS # # AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])] # # DESCRIPTION # # If the current configure was run within the srcdir then we move all # configure-files into a subdir and let the configure steps continue # there. We provide an option --disable-builddir to suppress the move into # a separate builddir. # # Defaults: # # $1 = $host (overridden with $HOST) # $2 = Makefile.mk # $3 = -all # # This macro must be called before AM_INIT_AUTOMAKE. It creates a default # toplevel srcdir Makefile from the information found in the created # toplevel builddir Makefile. It just copies the variables and # rule-targets, each extended with a default rule-execution that recurses # into the build directory of the current "HOST". You can override the # auto-dection through `config.guess` and build-time of course, as in # # make HOST=i386-mingw-cross # # which can of course set at configure time as well using # # configure --host=i386-mingw-cross # # After the default has been created, additional rules can be appended # that will not just recurse into the subdirectories and only ever exist # in the srcdir toplevel makefile - these parts are read from the $2 = # Makefile.mk file # # The automatic rules are usually scanning the toplevel Makefile for lines # like '#### $host |$builddir' to recognize the place where to recurse # into. Usually, the last one is the only one used. However, almost all # targets have an additional "*-all" rule which makes the script to # recurse into _all_ variants of the current HOST (!!) setting. The "-all" # suffix can be overriden for the macro as well. # # a special rule is only given for things like "dist" that will copy the # tarball from the builddir to the sourcedir (or $(PUB)) for reason of # convenience. # # LICENSE # # Copyright (c) 2009 Guido U. Draheim # Copyright (c) 2009 Alan Jenkins # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 23 AC_DEFUN([AX_ENABLE_BUILDDIR],[ AC_REQUIRE([AC_CANONICAL_HOST])[]dnl AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl SUB="." AC_ARG_ENABLE([builddir], AS_HELP_STRING( [--disable-builddir],[disable automatic build in subdir of sources]) ,[SUB="$enableval"], [SUB="auto"]) if test ".$ac_srcdir_defaulted" != ".no" ; then if test ".$srcdir" = ".." ; then if test -f config.status ; then AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build) else test ".$SUB" = "." && SUB="." test ".$SUB" = ".no" && SUB="." test ".$TARGET" = "." && TARGET="$target" test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])" if test ".$SUB" != ".." ; then # we know where to go and AS_MKDIR_P([$SUB]) echo __.$SUB.__ > $SUB/conftest.tmp cd $SUB if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then rm conftest.tmp AC_MSG_RESULT([continue configure in default builddir "./$SUB"]) else AC_MSG_ERROR([could not change to default builddir "./$SUB"]) fi srcdir=`echo "$SUB" | sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'` # going to restart from subdirectory location test -f $srcdir/config.log && mv $srcdir/config.log . test -f $srcdir/confdefs.h && mv $srcdir/confdefs.h . test -f $srcdir/conftest.log && mv $srcdir/conftest.log . test -f $srcdir/$cache_file && mv $srcdir/$cache_file . AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"}) case "[$]0" in # restart [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;; esac ; exit $? fi fi fi fi test ".$SUB" = ".auto" && SUB="." dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec" AC_PATH_PROG(SED,gsed sed, sed) AUX="$am_aux_dir" AS_VAR_POPDEF([SED])dnl AS_VAR_POPDEF([AUX])dnl AS_VAR_POPDEF([SUB])dnl AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status .............. AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl pushdef([END],[Makefile.mk])dnl pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl SRC="$ax_enable_builddir_srcdir" if test ".$SUB" = ".." ; then if test -f "$TOP/Makefile" ; then AC_MSG_NOTICE([skipping TOP/Makefile - left untouched]) else AC_MSG_NOTICE([skipping TOP/Makefile - not created]) fi else if test -f "$SRC/Makefile" ; then a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile` test "$a" != "$b" && rm "$SRC/Makefile" fi if test -f "$SRC/Makefile" ; then echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk echo " []@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null" if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null then rm $SRC/Makefile ; fi cp $tmp/conftemp.mk $SRC/makefiles.mk~ ## DEBUGGING fi if test ! -f "$SRC/Makefile" ; then AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile]) x='`' ; cat >$tmp/conftemp.sed <<_EOF /^\$/n x /^\$/bS x /\\\\\$/{H;d;} {H;s/.*//;x;} bM :S x /\\\\\$/{h;d;} {h;s/.*//;x;} :M s/\\(\\n\\) /\\1 /g /^ /d /^[[ ]]*[[\\#]]/d /^VPATH *=/d s/^srcdir *=.*/srcdir = ./ s/^top_srcdir *=.*/top_srcdir = ./ /[[:=]]/!d /^\\./d dnl Now handle rules (i.e. lines containing ":" but not " = "). / = /b / .= /b /:/!b s/:.*/:/ s/ / /g s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/ s/ / /g /^all all[]_ALL[[ :]]/i\\ all-configured : all[]_ALL dnl dist-all exists... and would make for dist-all-all s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g /[]_ALL[]_ALL/d a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree) /dist[]_ALL *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree) /dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\ ; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\ ; found=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\ ; if test "\$\$found" -eq "0" ; then : \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\ ; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\ ; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done dnl special rule add-on: "distclean" removes all local builddirs completely /distclean[]_ALL *:/a\\ @ HOST="\$(HOST)\" \\\\\\ ; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\ ; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\ ; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\ ; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\ ; test ".\$\$BUILD" = "." && BUILD="." \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\ ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\ ; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\ ; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\ ; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile _EOF cp "$tmp/conftemp.sed" "$SRC/makefile.sed~" ## DEBUGGING $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])]) cat $SRC/END >>$SRC/Makefile fi ; xxxx="####" echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile # sanity check if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts]) $SED -e '/^@ HOST=/s/^/ /' -e '/^; /s/^/ /' $SRC/Makefile \ >$SRC/Makefile~ (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null fi else xxxx="\\#\\#\\#\\#" # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~" ## DEBUGGING cp "$tmp/mkfile.tmp" "$SRC/makefiles.out~" ## DEBUGGING if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure]) rm "$tmp/mkfile.tmp" else AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure]) mv "$tmp/mkfile.tmp" "$SRC/Makefile" fi fi AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)]) xxxx="####" echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile fi popdef([END])dnl AS_VAR_POPDEF([SED])dnl AS_VAR_POPDEF([AUX])dnl AS_VAR_POPDEF([SRC])dnl AS_VAR_POPDEF([TOP])dnl AS_VAR_POPDEF([SUB])dnl ],[dnl ax_enable_builddir_srcdir="$srcdir" # $srcdir ax_enable_builddir_host="$HOST" # $HOST / $host ax_enable_builddir_version="$VERSION" # $VERSION ax_enable_builddir_package="$PACKAGE" # $PACKAGE ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX ax_enable_builddir_sed="$ax_enable_builddir_sed" # $SED ax_enable_builddir="$ax_enable_builddir" # $SUB ])dnl ]) polyml-5.6/libffi/m4/ax_gcc_archflag.m4000066400000000000000000000227101265146633400200040ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html # =========================================================================== # # SYNOPSIS # # AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE]) # # DESCRIPTION # # This macro tries to guess the "native" arch corresponding to the target # architecture for use with gcc's -march=arch or -mtune=arch flags. If # found, the cache variable $ax_cv_gcc_archflag is set to this flag and # ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is set to # "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is # to add $ax_cv_gcc_archflag to the end of $CFLAGS. # # PORTABLE? should be either [yes] (default) or [no]. In the former case, # the flag is set to -mtune (or equivalent) so that the architecture is # only used for tuning, but the instruction set used is still portable. In # the latter case, the flag is set to -march (or equivalent) so that # architecture-specific instructions are enabled. # # The user can specify --with-gcc-arch= in order to override the # macro's choice of architecture, or --without-gcc-arch to disable this. # # When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is # called unless the user specified --with-gcc-arch manually. # # Requires macros: AX_CHECK_COMPILE_FLAG, AX_GCC_X86_CPUID # # (The main emphasis here is on recent CPUs, on the principle that doing # high-performance computing on old hardware is uncommon.) # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # Copyright (c) 2012 Tsukasa Oi # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 11 AC_DEFUN([AX_GCC_ARCHFLAG], [AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=], [use architecture for gcc -march/-mtune, instead of guessing])], ax_gcc_arch=$withval, ax_gcc_arch=yes) AC_MSG_CHECKING([for gcc architecture flag]) AC_MSG_RESULT([]) AC_CACHE_VAL(ax_cv_gcc_archflag, [ ax_cv_gcc_archflag="unknown" if test "$GCC" = yes; then if test "x$ax_gcc_arch" = xyes; then ax_gcc_arch="" if test "$cross_compiling" = no; then case $host_cpu in i[[3456]]86*|x86_64*) # use cpuid codes AX_GCC_X86_CPUID(0) AX_GCC_X86_CPUID(1) case $ax_cv_gcc_x86_cpuid_0 in *:756e6547:*:*) # Intel case $ax_cv_gcc_x86_cpuid_1 in *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; *5??:*:*:*) ax_gcc_arch=pentium ;; *0?6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; *0?6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; *0?6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; *0?6[[9de]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; *0?6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; *1?6c?:*:*:*|*[[23]]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; *2?6[[ad]]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; ?000?f3[[347]]:*:*:*|?000?f4[1347]:*:*:*|?000?f6?:*:*:*) case $host_cpu in x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; esac ;; ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; esac ;; *:68747541:*:*) # AMD case $ax_cv_gcc_x86_cpuid_1 in *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; *60?:*:*:*) ax_gcc_arch=k7 ;; *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;; *6[[68a]]?:*:*:*) AX_GCC_X86_CPUID(0x80000006) # L2 cache size case $ax_cv_gcc_x86_cpuid_0x80000006 in *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256 ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; *) ax_gcc_arch="athlon-4 athlon k7" ;; esac ;; ?00??f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; ?00??f??:*:*:*) ax_gcc_arch="k8" ;; ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; esac ;; *:746e6543:*:*) # IDT case $ax_cv_gcc_x86_cpuid_1 in *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; *58?:*:*:*) ax_gcc_arch=winchip2 ;; *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;; esac ;; esac if test x"$ax_gcc_arch" = x; then # fallback case $host_cpu in i586*) ax_gcc_arch=pentium ;; i686*) ax_gcc_arch=pentiumpro ;; esac fi ;; sparc*) AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/]) cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null` cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters` case $cputype in *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;; *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;; *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;; *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;; *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;; *cypress*) ax_gcc_arch=cypress ;; esac ;; alphaev5) ax_gcc_arch=ev5 ;; alphaev56) ax_gcc_arch=ev56 ;; alphapca56) ax_gcc_arch="pca56 ev56" ;; alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;; alphaev6) ax_gcc_arch=ev6 ;; alphaev67) ax_gcc_arch=ev67 ;; alphaev68) ax_gcc_arch="ev68 ev67" ;; alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;; alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;; alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;; powerpc*) cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null` cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'` case $cputype in *750*) ax_gcc_arch="750 G3" ;; *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;; *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;; *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;; *970*) ax_gcc_arch="970 G5 power4";; *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";; *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";; 603ev|8240) ax_gcc_arch="$cputype 603e 603";; *) ax_gcc_arch=$cputype ;; esac ax_gcc_arch="$ax_gcc_arch powerpc" ;; esac fi # not cross-compiling fi # guess arch if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then for arch in $ax_gcc_arch; do if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code flags="-mtune=$arch" # -mcpu=$arch and m$arch generate nonportable code on every arch except # x86. And some other arches (e.g. Alpha) don't accept -mtune. Grrr. case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac else flags="-march=$arch -mcpu=$arch -m$arch" fi for flag in $flags; do AX_CHECK_COMPILE_FLAG($flag, [ax_cv_gcc_archflag=$flag; break]) done test "x$ax_cv_gcc_archflag" = xunknown || break done fi fi # $GCC=yes ]) AC_MSG_CHECKING([for gcc architecture flag]) AC_MSG_RESULT($ax_cv_gcc_archflag) if test "x$ax_cv_gcc_archflag" = xunknown; then m4_default([$3],:) else m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"]) fi ]) polyml-5.6/libffi/m4/ax_gcc_x86_cpuid.m4000066400000000000000000000063611265146633400200520ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html # =========================================================================== # # SYNOPSIS # # AX_GCC_X86_CPUID(OP) # # DESCRIPTION # # On Pentium and later x86 processors, with gcc or a compiler that has a # compatible syntax for inline assembly instructions, run a small program # that executes the cpuid instruction with input OP. This can be used to # detect the CPU type. # # On output, the values of the eax, ebx, ecx, and edx registers are stored # as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable # ax_cv_gcc_x86_cpuid_OP. # # If the cpuid instruction fails (because you are running a # cross-compiler, or because you are not using gcc, or because you are on # a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP # is set to the string "unknown". # # This macro mainly exists to be used in AX_GCC_ARCHFLAG. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2008 Matteo Frigo # # 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 7 AC_DEFUN([AX_GCC_X86_CPUID], [AC_REQUIRE([AC_PROG_CC]) AC_LANG_PUSH([C]) AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1, [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [ int op = $1, eax, ebx, ecx, edx; FILE *f; __asm__("cpuid" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (op)); f = fopen("conftest_cpuid", "w"); if (!f) return 1; fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx); fclose(f); return 0; ])], [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid], [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid], [ax_cv_gcc_x86_cpuid_$1=unknown])]) AC_LANG_POP([C]) ]) polyml-5.6/libffi/m4/libtool.m4000066400000000000000000010601111265146633400163730ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS polyml-5.6/libffi/m4/ltoptions.m4000066400000000000000000000300731265146633400167650ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) polyml-5.6/libffi/m4/ltsugar.m4000066400000000000000000000104241265146633400164110ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) polyml-5.6/libffi/m4/ltversion.m4000066400000000000000000000012621265146633400167550ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) polyml-5.6/libffi/m4/lt~obsolete.m4000066400000000000000000000137561265146633400173150ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) polyml-5.6/libffi/man/000077500000000000000000000000001265146633400147205ustar00rootroot00000000000000polyml-5.6/libffi/man/Makefile.am000066400000000000000000000003171265146633400167550ustar00rootroot00000000000000## Process this with automake to create Makefile.in AUTOMAKE_OPTIONS=foreign EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 polyml-5.6/libffi/man/Makefile.in000066400000000000000000000372111265146633400167710ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = man DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_configure_args.m4 \ $(top_srcdir)/m4/ax_enable_builddir.m4 \ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/fficonfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LTLDFLAGS = @AM_LTLDFLAGS@ AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PRTDIAG = @PRTDIAG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_enable_builddir_sed = @ax_enable_builddir_sed@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ toolexecdir = @toolexecdir@ toolexeclibdir = @toolexeclibdir@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man3 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-man \ uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libffi/man/ffi.3000066400000000000000000000015221265146633400155500ustar00rootroot00000000000000.Dd February 15, 2008 .Dt FFI 3 .Sh NAME .Nm FFI .Nd Foreign Function Interface .Sh LIBRARY libffi, -lffi .Sh SYNOPSIS .In ffi.h .Ft ffi_status .Fo ffi_prep_cif .Fa "ffi_cif *cif" .Fa "ffi_abi abi" .Fa "unsigned int nargs" .Fa "ffi_type *rtype" .Fa "ffi_type **atypes" .Fc .Ft void .Fo ffi_prep_cif_var .Fa "ffi_cif *cif" .Fa "ffi_abi abi" .Fa "unsigned int nfixedargs" .Fa "unsigned int ntotalargs" .Fa "ffi_type *rtype" .Fa "ffi_type **atypes" .Fc .Ft void .Fo ffi_call .Fa "ffi_cif *cif" .Fa "void (*fn)(void)" .Fa "void *rvalue" .Fa "void **avalue" .Fc .Sh DESCRIPTION The foreign function interface provides a mechanism by which a function can generate a call to another function at runtime without requiring knowledge of the called function's interface at compile time. .Sh SEE ALSO .Xr ffi_prep_cif 3 , .Xr ffi_prep_cif_var 3 , .Xr ffi_call 3 polyml-5.6/libffi/man/ffi_call.3000066400000000000000000000044351265146633400165510ustar00rootroot00000000000000.Dd February 15, 2008 .Dt ffi_call 3 .Sh NAME .Nm ffi_call .Nd Invoke a foreign function. .Sh SYNOPSIS .In ffi.h .Ft void .Fo ffi_call .Fa "ffi_cif *cif" .Fa "void (*fn)(void)" .Fa "void *rvalue" .Fa "void **avalue" .Fc .Sh DESCRIPTION The .Nm ffi_call function provides a simple mechanism for invoking a function without requiring knowledge of the function's interface at compile time. .Fa fn is called with the values retrieved from the pointers in the .Fa avalue array. The return value from .Fa fn is placed in storage pointed to by .Fa rvalue . .Fa cif contains information describing the data types, sizes and alignments of the arguments to and return value from .Fa fn , and must be initialized with .Nm ffi_prep_cif before it is used with .Nm ffi_call . .Pp .Fa rvalue must point to storage that is sizeof(ffi_arg) or larger for non-floating point types. For smaller-sized return value types, the .Nm ffi_arg or .Nm ffi_sarg integral type must be used to hold the return value. .Sh EXAMPLES .Bd -literal #include #include unsigned char foo(unsigned int, float); int main(int argc, const char **argv) { ffi_cif cif; ffi_type *arg_types[2]; void *arg_values[2]; ffi_status status; // Because the return value from foo() is smaller than sizeof(long), it // must be passed as ffi_arg or ffi_sarg. ffi_arg result; // Specify the data type of each argument. Available types are defined // in . arg_types[0] = &ffi_type_uint; arg_types[1] = &ffi_type_float; // Prepare the ffi_cif structure. if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_uint8, arg_types)) != FFI_OK) { // Handle the ffi_status error. } // Specify the values of each argument. unsigned int arg1 = 42; float arg2 = 5.1; arg_values[0] = &arg1; arg_values[1] = &arg2; // Invoke the function. ffi_call(&cif, FFI_FN(foo), &result, arg_values); // The ffi_arg 'result' now contains the unsigned char returned from foo(), // which can be accessed by a typecast. printf("result is %hhu", (unsigned char)result); return 0; } // The target function. unsigned char foo(unsigned int x, float y) { unsigned char result = x - y; return result; } .Ed .Sh SEE ALSO .Xr ffi 3 , .Xr ffi_prep_cif 3 polyml-5.6/libffi/man/ffi_prep_cif.3000066400000000000000000000022061265146633400174170ustar00rootroot00000000000000.Dd February 15, 2008 .Dt ffi_prep_cif 3 .Sh NAME .Nm ffi_prep_cif .Nd Prepare a .Nm ffi_cif structure for use with .Nm ffi_call . .Sh SYNOPSIS .In ffi.h .Ft ffi_status .Fo ffi_prep_cif .Fa "ffi_cif *cif" .Fa "ffi_abi abi" .Fa "unsigned int nargs" .Fa "ffi_type *rtype" .Fa "ffi_type **atypes" .Fc .Sh DESCRIPTION The .Nm ffi_prep_cif function prepares a .Nm ffi_cif structure for use with .Nm ffi_call . .Fa abi specifies a set of calling conventions to use. .Fa atypes is an array of .Fa nargs pointers to .Nm ffi_type structs that describe the data type, size and alignment of each argument. .Fa rtype points to an .Nm ffi_type that describes the data type, size and alignment of the return value. Note that to call a variadic function .Nm ffi_prep_cif_var must be used instead. .Sh RETURN VALUES Upon successful completion, .Nm ffi_prep_cif returns .Nm FFI_OK . It will return .Nm FFI_BAD_TYPEDEF if .Fa cif is .Nm NULL or .Fa atypes or .Fa rtype is malformed. If .Fa abi does not refer to a valid ABI, .Nm FFI_BAD_ABI will be returned. Available ABIs are defined in .Nm . .Sh SEE ALSO .Xr ffi 3 , .Xr ffi_call 3 , .Xr ffi_prep_cif_var 3 polyml-5.6/libffi/man/ffi_prep_cif_var.3000066400000000000000000000024511265146633400202710ustar00rootroot00000000000000.Dd January 25, 2011 .Dt ffi_prep_cif_var 3 .Sh NAME .Nm ffi_prep_cif_var .Nd Prepare a .Nm ffi_cif structure for use with .Nm ffi_call for variadic functions. .Sh SYNOPSIS .In ffi.h .Ft ffi_status .Fo ffi_prep_cif_var .Fa "ffi_cif *cif" .Fa "ffi_abi abi" .Fa "unsigned int nfixedargs" .Fa "unsigned int ntotalargs" .Fa "ffi_type *rtype" .Fa "ffi_type **atypes" .Fc .Sh DESCRIPTION The .Nm ffi_prep_cif_var function prepares a .Nm ffi_cif structure for use with .Nm ffi_call for variadic functions. .Fa abi specifies a set of calling conventions to use. .Fa atypes is an array of .Fa ntotalargs pointers to .Nm ffi_type structs that describe the data type, size and alignment of each argument. .Fa rtype points to an .Nm ffi_type that describes the data type, size and alignment of the return value. .Fa nfixedargs must contain the number of fixed (non-variadic) arguments. Note that to call a non-variadic function .Nm ffi_prep_cif must be used. .Sh RETURN VALUES Upon successful completion, .Nm ffi_prep_cif_var returns .Nm FFI_OK . It will return .Nm FFI_BAD_TYPEDEF if .Fa cif is .Nm NULL or .Fa atypes or .Fa rtype is malformed. If .Fa abi does not refer to a valid ABI, .Nm FFI_BAD_ABI will be returned. Available ABIs are defined in .Nm . .Sh SEE ALSO .Xr ffi 3 , .Xr ffi_call 3 , .Xr ffi_prep_cif 3 polyml-5.6/libffi/mdate-sh000066400000000000000000000125531265146633400156000ustar00rootroot00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2005-06-29.22 # Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software # Foundation, Inc. # written by Ulrich Drepper , June 1995 # # 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, 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. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No file. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification time of FILE. Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume `unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # A `ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named `Jan', or `Feb', etc. However, it's unlikely that `/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`ls -l -d /` # Find which argument is the month. month= command= until test $month do shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: polyml-5.6/libffi/missing000077500000000000000000000153301265146633400155460ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/libffi/msvc32include/000077500000000000000000000000001265146633400166265ustar00rootroot00000000000000polyml-5.6/libffi/msvc32include/ffi.h000066400000000000000000000274731265146633400175600ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- libffi 3.0.10 - Copyright (c) 2011 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* ------------------------------------------------------------------- The basic API is described in the README file. The raw API is designed to bypass some of the argument packing and unpacking on architectures for which it can be avoided. The closure API allows interpreted functions to be packaged up inside a C function pointer, so that they can be called as C functions, with no understanding on the client side that they are interpreted. It can also be used in other cases in which it is necessary to package up a user specified parameter and a function pointer as a single function pointer. The closure API must be implemented in order to get its functionality, e.g. for use by gij. Routines are provided to emulate the raw API if the underlying platform doesn't allow faster implementation. More details on the raw and cloure API can be found in: http://gcc.gnu.org/ml/java/1999-q3/msg00138.html and http://gcc.gnu.org/ml/java/1999-q3/msg00174.html -------------------------------------------------------------------- */ #ifndef LIBFFI_H #define LIBFFI_H #ifdef __cplusplus extern "C" { #endif /* Specify which architecture libffi is configured for. */ #if (!defined(X86_WIN32) && ! defined(X86_WIN64)) # ifdef _WIN64 # define X86_WIN64 # else # define X86_WIN32 # endif #endif /* ---- System configuration information --------------------------------- */ #include #ifndef LIBFFI_ASM #ifdef _MSC_VER #define __attribute__(X) #endif #include #include /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). But we can find it either under the correct ANSI name, or under GNU C's internal name. */ #define FFI_64_BIT_MAX 9223372036854775807 #ifdef LONG_LONG_MAX # define FFI_LONG_LONG_MAX LONG_LONG_MAX #else # ifdef LLONG_MAX # define FFI_LONG_LONG_MAX LLONG_MAX # ifdef _AIX52 /* or newer has C99 LLONG_MAX */ # undef FFI_64_BIT_MAX # define FFI_64_BIT_MAX 9223372036854775807LL # endif /* _AIX52 or newer */ # else # ifdef __GNUC__ # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ # endif # ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ # ifndef __PPC64__ # if defined (__IBMC__) || defined (__IBMCPP__) # define FFI_LONG_LONG_MAX LONGLONG_MAX # endif # endif /* __PPC64__ */ # undef FFI_64_BIT_MAX # define FFI_64_BIT_MAX 9223372036854775807LL # endif # endif #endif /* The closure code assumes that this works on pointers, i.e. a size_t */ /* can hold a pointer. */ typedef struct _ffi_type { size_t size; unsigned short alignment; unsigned short type; struct _ffi_type **elements; } ffi_type; #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 # define ffi_type_schar ffi_type_sint8 #else #error "char size not supported" #endif #if SHRT_MAX == 32767 # define ffi_type_ushort ffi_type_uint16 # define ffi_type_sshort ffi_type_sint16 #elif SHRT_MAX == 2147483647 # define ffi_type_ushort ffi_type_uint32 # define ffi_type_sshort ffi_type_sint32 #else #error "short size not supported" #endif #if INT_MAX == 32767 # define ffi_type_uint ffi_type_uint16 # define ffi_type_sint ffi_type_sint16 #elif INT_MAX == 2147483647 # define ffi_type_uint ffi_type_uint32 # define ffi_type_sint ffi_type_sint32 #elif INT_MAX == 9223372036854775807 # define ffi_type_uint ffi_type_uint64 # define ffi_type_sint ffi_type_sint64 #else #error "int size not supported" #endif #if LONG_MAX == 2147483647 # if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX #error "no 64-bit data type supported" # endif #elif LONG_MAX != FFI_64_BIT_MAX #error "long size not supported" #endif #if LONG_MAX == 2147483647 # define ffi_type_ulong ffi_type_uint32 # define ffi_type_slong ffi_type_sint32 #elif LONG_MAX == FFI_64_BIT_MAX # define ffi_type_ulong ffi_type_uint64 # define ffi_type_slong ffi_type_sint64 #else #error "long size not supported" #endif /* These are defined in types.c */ extern ffi_type ffi_type_void; extern ffi_type ffi_type_uint8; extern ffi_type ffi_type_sint8; extern ffi_type ffi_type_uint16; extern ffi_type ffi_type_sint16; extern ffi_type ffi_type_uint32; extern ffi_type ffi_type_sint32; extern ffi_type ffi_type_uint64; extern ffi_type ffi_type_sint64; extern ffi_type ffi_type_float; extern ffi_type ffi_type_double; extern ffi_type ffi_type_pointer; #if 1 extern ffi_type ffi_type_longdouble; #else #define ffi_type_longdouble ffi_type_double #endif #endif /* LIBFFI_HIDE_BASIC_TYPES */ typedef enum { FFI_OK = 0, FFI_BAD_TYPEDEF, FFI_BAD_ABI } ffi_status; typedef unsigned FFI_TYPE; typedef struct { ffi_abi abi; unsigned nargs; ffi_type **arg_types; ffi_type *rtype; unsigned bytes; unsigned flags; #ifdef FFI_EXTRA_CIF_FIELDS FFI_EXTRA_CIF_FIELDS; #endif } ffi_cif; /* ---- Definitions for the raw API -------------------------------------- */ #ifndef FFI_SIZEOF_ARG # if LONG_MAX == 2147483647 # define FFI_SIZEOF_ARG 4 # elif LONG_MAX == FFI_64_BIT_MAX # define FFI_SIZEOF_ARG 8 # endif #endif #ifndef FFI_SIZEOF_JAVA_RAW # define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG #endif typedef union { ffi_sarg sint; ffi_arg uint; float flt; char data[FFI_SIZEOF_ARG]; void* ptr; } ffi_raw; #if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 /* This is a special case for mips64/n32 ABI (and perhaps others) where sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ typedef union { signed int sint; unsigned int uint; float flt; char data[FFI_SIZEOF_JAVA_RAW]; void* ptr; } ffi_java_raw; #else typedef ffi_raw ffi_java_raw; #endif void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); size_t ffi_raw_size (ffi_cif *cif); /* This is analogous to the raw API, except it uses Java parameter */ /* packing, even on 64-bit machines. I.e. on 64-bit machines */ /* longs and doubles are followed by an empty 64-bit word. */ void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_java_raw *avalue); void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); size_t ffi_java_raw_size (ffi_cif *cif); /* ---- Definitions for closures ----------------------------------------- */ #if FFI_CLOSURES #ifdef _MSC_VER __declspec(align(8)) #endif typedef struct { char tramp[FFI_TRAMPOLINE_SIZE]; ffi_cif *cif; void (*fun)(ffi_cif*,void*,void**,void*); void *user_data; #ifdef __GNUC__ } ffi_closure __attribute__((aligned (8))); #else } ffi_closure; # ifdef __sgi # pragma pack 0 # endif #endif void *ffi_closure_alloc (size_t size, void **code); void ffi_closure_free (void *); ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data); ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void*codeloc); #ifdef __sgi # pragma pack 8 #endif typedef struct { char tramp[FFI_TRAMPOLINE_SIZE]; ffi_cif *cif; #if !FFI_NATIVE_RAW_API /* if this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate handler to do the transaltion, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; #endif void (*fun)(ffi_cif*,void*,ffi_raw*,void*); void *user_data; } ffi_raw_closure; typedef struct { char tramp[FFI_TRAMPOLINE_SIZE]; ffi_cif *cif; #if !FFI_NATIVE_RAW_API /* if this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate handler to do the transaltion, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; #endif void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); void *user_data; } ffi_java_raw_closure; ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data); ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, void *codeloc); #endif /* FFI_CLOSURES */ /* ---- Public interface definition -------------------------------------- */ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); /* Useful for eliminating compiler warnings */ #define FFI_FN(f) ((void (*)(void))f) /* ---- Definitions shared with assembly code ---------------------------- */ #endif /* If these change, update src/mips/ffitarget.h. */ #define FFI_TYPE_VOID 0 #define FFI_TYPE_INT 1 #define FFI_TYPE_FLOAT 2 #define FFI_TYPE_DOUBLE 3 #if 1 #define FFI_TYPE_LONGDOUBLE 4 #else #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE #endif #define FFI_TYPE_UINT8 5 #define FFI_TYPE_SINT8 6 #define FFI_TYPE_UINT16 7 #define FFI_TYPE_SINT16 8 #define FFI_TYPE_UINT32 9 #define FFI_TYPE_SINT32 10 #define FFI_TYPE_UINT64 11 #define FFI_TYPE_SINT64 12 #define FFI_TYPE_STRUCT 13 #define FFI_TYPE_POINTER 14 /* This should always refer to the last type code (for sanity checks) */ #define FFI_TYPE_LAST FFI_TYPE_POINTER #ifdef __cplusplus } #endif #endif polyml-5.6/libffi/msvc32include/fficonfig.h000066400000000000000000000040031265146633400207260ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- libffi - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* ------------------------------------------------------------------- -------------------------------------------------------------------- */ #ifndef LIBFFICONFIG_H #define LIBFFICONFIG_H #define HAVE_ALLOCA 1 #define HAVE_MEMCPY 1 #define HAVE_MEMORY_H 1 #define HAVE_STDLIB_H 1 #define HAVE_STRING_H 1 #define HAVE_SYS_STAT_H 1 #define HAVE_SYS_TYPES_H 1 #define STDC_HEADERS 1 #if defined(X86_WIN64) #define SIZEOF_DOUBLE 8 #define SIZEOF_LONG_DOUBLE 0 #else #define SIZEOF_DOUBLE 8 #define SIZEOF_LONG_DOUBLE 0 #endif #ifdef LIBFFI_ASM #define FFI_HIDDEN(name) #else #define FFI_HIDDEN #endif #endif /* LIBFFICONFIG_H */ polyml-5.6/libffi/msvcc.sh000077500000000000000000000115141265146633400156210ustar00rootroot00000000000000#!/bin/sh # ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the MSVC wrappificator. # # The Initial Developer of the Original Code is # Timothy Wall . # Portions created by the Initial Developer are Copyright (C) 2009 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Daniel Witte # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** # # GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC # format and translated into something sensible for cl or ml. # args="-nologo -W3" md=-MD cl="cl" ml="ml" safeseh="-safeseh" output= while [ $# -gt 0 ] do case $1 in -fexceptions) # Don't enable exceptions for now. #args="$args -EHac" shift 1 ;; -m32) shift 1 ;; -m64) cl="cl" # "$MSVC/x86_amd64/cl" ml="ml64" # "$MSVC/x86_amd64/ml64" safeseh= shift 1 ;; -O0) args="$args -Od" shift 1 ;; -O*) # If we're optimizing, make sure we explicitly turn on some optimizations # that are implicitly disabled by debug symbols (-Zi). args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO" shift 1 ;; -g) # Enable debug symbol generation. args="$args -Zi -DEBUG" shift 1 ;; -DFFI_DEBUG) # Link against debug CRT and enable runtime error checks. args="$args -RTC1" defines="$defines $1" md=-MDd shift 1 ;; -c) args="$args -c" args="$(echo $args | sed 's%/Fe%/Fo%g')" single="-c" shift 1 ;; -D*=*) name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')" value="$(echo $1|sed 's/-D[^=][^=]*=//g')" args="$args -D${name}='$value'" defines="$defines -D${name}='$value'" shift 1 ;; -D*) args="$args $1" defines="$defines $1" shift 1 ;; -I) args="$args -I$2" includes="$includes -I$2" shift 2 ;; -I*) args="$args $1" includes="$includes $1" shift 1 ;; -W|-Wextra) # TODO map extra warnings shift 1 ;; -Wall) # -Wall on MSVC is overzealous, and we already build with -W3. Nothing # to do here. shift 1 ;; -Werror) args="$args -WX" shift 1 ;; -W*) # TODO map specific warnings shift 1 ;; -S) args="$args -FAs" shift 1 ;; -o) outdir="$(dirname $2)" base="$(basename $2|sed 's/\.[^.]*//g')" if [ -n "$single" ]; then output="-Fo$2" else output="-Fe$2" fi if [ -n "$assembly" ]; then args="$args $output" else args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base" fi shift 2 ;; *.S) src=$1 assembly="true" shift 1 ;; *.c) args="$args $1" shift 1 ;; *) # Assume it's an MSVC argument, and pass it through. args="$args $1" shift 1 ;; esac done if [ -n "$assembly" ]; then if [ -z "$outdir" ]; then outdir="." fi ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" echo "$cl -nologo -EP $includes $defines $src > $ppsrc" "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $? output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" args="-nologo $safeseh $single $output $ppsrc" echo "$ml $args" eval "\"$ml\" $args" result=$? # required to fix ml64 broken output? #mv *.obj $outdir else args="$md $args" echo "$cl $args" eval "\"$cl\" $args" result=$? fi exit $result polyml-5.6/libffi/src/000077500000000000000000000000001265146633400147345ustar00rootroot00000000000000polyml-5.6/libffi/src/aarch64/000077500000000000000000000000001265146633400161645ustar00rootroot00000000000000polyml-5.6/libffi/src/aarch64/ffi.c000066400000000000000000000676021265146633400171070ustar00rootroot00000000000000/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include /* Stack alignment requirement in bytes */ #define AARCH64_STACK_ALIGN 16 #define N_X_ARG_REG 8 #define N_V_ARG_REG 8 #define AARCH64_FFI_WITH_V (1 << AARCH64_FFI_WITH_V_BIT) union _d { UINT64 d; UINT32 s[2]; }; struct call_context { UINT64 x [AARCH64_N_XREG]; struct { union _d d[2]; } v [AARCH64_N_VREG]; }; static void * get_x_addr (struct call_context *context, unsigned n) { return &context->x[n]; } static void * get_s_addr (struct call_context *context, unsigned n) { #if defined __AARCH64EB__ return &context->v[n].d[1].s[1]; #else return &context->v[n].d[0].s[0]; #endif } static void * get_d_addr (struct call_context *context, unsigned n) { #if defined __AARCH64EB__ return &context->v[n].d[1]; #else return &context->v[n].d[0]; #endif } static void * get_v_addr (struct call_context *context, unsigned n) { return &context->v[n]; } /* Return the memory location at which a basic type would reside were it to have been stored in register n. */ static void * get_basic_type_addr (unsigned short type, struct call_context *context, unsigned n) { switch (type) { case FFI_TYPE_FLOAT: return get_s_addr (context, n); case FFI_TYPE_DOUBLE: return get_d_addr (context, n); case FFI_TYPE_LONGDOUBLE: return get_v_addr (context, n); case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_INT: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: return get_x_addr (context, n); default: FFI_ASSERT (0); return NULL; } } /* Return the alignment width for each of the basic types. */ static size_t get_basic_type_alignment (unsigned short type) { switch (type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: return sizeof (UINT64); case FFI_TYPE_LONGDOUBLE: return sizeof (long double); case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_INT: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: return sizeof (UINT64); default: FFI_ASSERT (0); return 0; } } /* Return the size in bytes for each of the basic types. */ static size_t get_basic_type_size (unsigned short type) { switch (type) { case FFI_TYPE_FLOAT: return sizeof (UINT32); case FFI_TYPE_DOUBLE: return sizeof (UINT64); case FFI_TYPE_LONGDOUBLE: return sizeof (long double); case FFI_TYPE_UINT8: return sizeof (UINT8); case FFI_TYPE_SINT8: return sizeof (SINT8); case FFI_TYPE_UINT16: return sizeof (UINT16); case FFI_TYPE_SINT16: return sizeof (SINT16); case FFI_TYPE_UINT32: return sizeof (UINT32); case FFI_TYPE_INT: case FFI_TYPE_SINT32: return sizeof (SINT32); case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: return sizeof (UINT64); case FFI_TYPE_SINT64: return sizeof (SINT64); default: FFI_ASSERT (0); return 0; } } extern void ffi_call_SYSV (unsigned (*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, unsigned, void (*fn)(void)); extern void ffi_closure_SYSV (ffi_closure *); /* Test for an FFI floating point representation. */ static unsigned is_floating_type (unsigned short type) { return (type == FFI_TYPE_FLOAT || type == FFI_TYPE_DOUBLE || type == FFI_TYPE_LONGDOUBLE); } /* Test for a homogeneous structure. */ static unsigned short get_homogeneous_type (ffi_type *ty) { if (ty->type == FFI_TYPE_STRUCT && ty->elements) { unsigned i; unsigned short candidate_type = get_homogeneous_type (ty->elements[0]); for (i =1; ty->elements[i]; i++) { unsigned short iteration_type = 0; /* If we have a nested struct, we must find its homogeneous type. If that fits with our candidate type, we are still homogeneous. */ if (ty->elements[i]->type == FFI_TYPE_STRUCT && ty->elements[i]->elements) { iteration_type = get_homogeneous_type (ty->elements[i]); } else { iteration_type = ty->elements[i]->type; } /* If we are not homogeneous, return FFI_TYPE_STRUCT. */ if (candidate_type != iteration_type) return FFI_TYPE_STRUCT; } return candidate_type; } /* Base case, we have no more levels of nesting, so we are a basic type, and so, trivially homogeneous in that type. */ return ty->type; } /* Determine the number of elements within a STRUCT. Note, we must handle nested structs. If ty is not a STRUCT this function will return 0. */ static unsigned element_count (ffi_type *ty) { if (ty->type == FFI_TYPE_STRUCT && ty->elements) { unsigned n; unsigned elems = 0; for (n = 0; ty->elements[n]; n++) { if (ty->elements[n]->type == FFI_TYPE_STRUCT && ty->elements[n]->elements) elems += element_count (ty->elements[n]); else elems++; } return elems; } return 0; } /* Test for a homogeneous floating point aggregate. A homogeneous floating point aggregate is a homogeneous aggregate of a half- single- or double- precision floating point type with one to four elements. Note that this includes nested structs of the basic type. */ static int is_hfa (ffi_type *ty) { if (ty->type == FFI_TYPE_STRUCT && ty->elements[0] && is_floating_type (get_homogeneous_type (ty))) { unsigned n = element_count (ty); return n >= 1 && n <= 4; } return 0; } /* Test if an ffi_type is a candidate for passing in a register. This test does not check that sufficient registers of the appropriate class are actually available, merely that IFF sufficient registers are available then the argument will be passed in register(s). Note that an ffi_type that is deemed to be a register candidate will always be returned in registers. Returns 1 if a register candidate else 0. */ static int is_register_candidate (ffi_type *ty) { switch (ty->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_UINT8: case FFI_TYPE_UINT16: case FFI_TYPE_UINT32: case FFI_TYPE_UINT64: case FFI_TYPE_POINTER: case FFI_TYPE_SINT8: case FFI_TYPE_SINT16: case FFI_TYPE_SINT32: case FFI_TYPE_INT: case FFI_TYPE_SINT64: return 1; case FFI_TYPE_STRUCT: if (is_hfa (ty)) { return 1; } else if (ty->size > 16) { /* Too large. Will be replaced with a pointer to memory. The pointer MAY be passed in a register, but the value will not. This test specifically fails since the argument will never be passed by value in registers. */ return 0; } else { /* Might be passed in registers depending on the number of registers required. */ return (ty->size + 7) / 8 < N_X_ARG_REG; } break; default: FFI_ASSERT (0); break; } return 0; } /* Test if an ffi_type argument or result is a candidate for a vector register. */ static int is_v_register_candidate (ffi_type *ty) { return is_floating_type (ty->type) || (ty->type == FFI_TYPE_STRUCT && is_hfa (ty)); } /* Representation of the procedure call argument marshalling state. The terse state variable names match the names used in the AARCH64 PCS. */ struct arg_state { unsigned ngrn; /* Next general-purpose register number. */ unsigned nsrn; /* Next vector register number. */ unsigned nsaa; /* Next stack offset. */ }; /* Initialize a procedure call argument marshalling state. */ static void arg_init (struct arg_state *state, unsigned call_frame_size) { state->ngrn = 0; state->nsrn = 0; state->nsaa = 0; } /* Return the number of available consecutive core argument registers. */ static unsigned available_x (struct arg_state *state) { return N_X_ARG_REG - state->ngrn; } /* Return the number of available consecutive vector argument registers. */ static unsigned available_v (struct arg_state *state) { return N_V_ARG_REG - state->nsrn; } static void * allocate_to_x (struct call_context *context, struct arg_state *state) { FFI_ASSERT (state->ngrn < N_X_ARG_REG) return get_x_addr (context, (state->ngrn)++); } static void * allocate_to_s (struct call_context *context, struct arg_state *state) { FFI_ASSERT (state->nsrn < N_V_ARG_REG) return get_s_addr (context, (state->nsrn)++); } static void * allocate_to_d (struct call_context *context, struct arg_state *state) { FFI_ASSERT (state->nsrn < N_V_ARG_REG) return get_d_addr (context, (state->nsrn)++); } static void * allocate_to_v (struct call_context *context, struct arg_state *state) { FFI_ASSERT (state->nsrn < N_V_ARG_REG) return get_v_addr (context, (state->nsrn)++); } /* Allocate an aligned slot on the stack and return a pointer to it. */ static void * allocate_to_stack (struct arg_state *state, void *stack, unsigned alignment, unsigned size) { void *allocation; /* Round up the NSAA to the larger of 8 or the natural alignment of the argument's type. */ state->nsaa = ALIGN (state->nsaa, alignment); state->nsaa = ALIGN (state->nsaa, alignment); state->nsaa = ALIGN (state->nsaa, 8); allocation = stack + state->nsaa; state->nsaa += size; return allocation; } static void copy_basic_type (void *dest, void *source, unsigned short type) { /* This is neccessary to ensure that basic types are copied sign extended to 64-bits as libffi expects. */ switch (type) { case FFI_TYPE_FLOAT: *(float *) dest = *(float *) source; break; case FFI_TYPE_DOUBLE: *(double *) dest = *(double *) source; break; case FFI_TYPE_LONGDOUBLE: *(long double *) dest = *(long double *) source; break; case FFI_TYPE_UINT8: *(ffi_arg *) dest = *(UINT8 *) source; break; case FFI_TYPE_SINT8: *(ffi_sarg *) dest = *(SINT8 *) source; break; case FFI_TYPE_UINT16: *(ffi_arg *) dest = *(UINT16 *) source; break; case FFI_TYPE_SINT16: *(ffi_sarg *) dest = *(SINT16 *) source; break; case FFI_TYPE_UINT32: *(ffi_arg *) dest = *(UINT32 *) source; break; case FFI_TYPE_INT: case FFI_TYPE_SINT32: *(ffi_sarg *) dest = *(SINT32 *) source; break; case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: *(ffi_arg *) dest = *(UINT64 *) source; break; case FFI_TYPE_SINT64: *(ffi_sarg *) dest = *(SINT64 *) source; break; default: FFI_ASSERT (0); } } static void copy_hfa_to_reg_or_stack (void *memory, ffi_type *ty, struct call_context *context, unsigned char *stack, struct arg_state *state) { unsigned elems = element_count (ty); if (available_v (state) < elems) { /* There are insufficient V registers. Further V register allocations are prevented, the NSAA is adjusted (by allocate_to_stack ()) and the argument is copied to memory at the adjusted NSAA. */ state->nsrn = N_V_ARG_REG; memcpy (allocate_to_stack (state, stack, ty->alignment, ty->size), memory, ty->size); } else { int i; unsigned short type = get_homogeneous_type (ty); unsigned elems = element_count (ty); for (i = 0; i < elems; i++) { void *reg = allocate_to_v (context, state); copy_basic_type (reg, memory, type); memory += get_basic_type_size (type); } } } /* Either allocate an appropriate register for the argument type, or if none are available, allocate a stack slot and return a pointer to the allocated space. */ static void * allocate_to_register_or_stack (struct call_context *context, unsigned char *stack, struct arg_state *state, unsigned short type) { size_t alignment = get_basic_type_alignment (type); size_t size = alignment; switch (type) { case FFI_TYPE_FLOAT: /* This is the only case for which the allocated stack size should not match the alignment of the type. */ size = sizeof (UINT32); /* Fall through. */ case FFI_TYPE_DOUBLE: if (state->nsrn < N_V_ARG_REG) return allocate_to_d (context, state); state->nsrn = N_V_ARG_REG; break; case FFI_TYPE_LONGDOUBLE: if (state->nsrn < N_V_ARG_REG) return allocate_to_v (context, state); state->nsrn = N_V_ARG_REG; break; case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_INT: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: if (state->ngrn < N_X_ARG_REG) return allocate_to_x (context, state); state->ngrn = N_X_ARG_REG; break; default: FFI_ASSERT (0); } return allocate_to_stack (state, stack, alignment, size); } /* Copy a value to an appropriate register, or if none are available, to the stack. */ static void copy_to_register_or_stack (struct call_context *context, unsigned char *stack, struct arg_state *state, void *value, unsigned short type) { copy_basic_type ( allocate_to_register_or_stack (context, stack, state, type), value, type); } /* Marshall the arguments from FFI representation to procedure call context and stack. */ static unsigned aarch64_prep_args (struct call_context *context, unsigned char *stack, extended_cif *ecif) { int i; struct arg_state state; arg_init (&state, ALIGN(ecif->cif->bytes, 16)); for (i = 0; i < ecif->cif->nargs; i++) { ffi_type *ty = ecif->cif->arg_types[i]; switch (ty->type) { case FFI_TYPE_VOID: FFI_ASSERT (0); break; /* If the argument is a basic type the argument is allocated to an appropriate register, or if none are available, to the stack. */ case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_INT: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: copy_to_register_or_stack (context, stack, &state, ecif->avalue[i], ty->type); break; case FFI_TYPE_STRUCT: if (is_hfa (ty)) { copy_hfa_to_reg_or_stack (ecif->avalue[i], ty, context, stack, &state); } else if (ty->size > 16) { /* If the argument is a composite type that is larger than 16 bytes, then the argument has been copied to memory, and the argument is replaced by a pointer to the copy. */ copy_to_register_or_stack (context, stack, &state, &(ecif->avalue[i]), FFI_TYPE_POINTER); } else if (available_x (&state) >= (ty->size + 7) / 8) { /* If the argument is a composite type and the size in double-words is not more than the number of available X registers, then the argument is copied into consecutive X registers. */ int j; for (j = 0; j < (ty->size + 7) / 8; j++) { memcpy (allocate_to_x (context, &state), &(((UINT64 *) ecif->avalue[i])[j]), sizeof (UINT64)); } } else { /* Otherwise, there are insufficient X registers. Further X register allocations are prevented, the NSAA is adjusted (by allocate_to_stack ()) and the argument is copied to memory at the adjusted NSAA. */ state.ngrn = N_X_ARG_REG; memcpy (allocate_to_stack (&state, stack, ty->alignment, ty->size), ecif->avalue + i, ty->size); } break; default: FFI_ASSERT (0); break; } } return ecif->cif->aarch64_flags; } ffi_status ffi_prep_cif_machdep (ffi_cif *cif) { /* Round the stack up to a multiple of the stack alignment requirement. */ cif->bytes = (cif->bytes + (AARCH64_STACK_ALIGN - 1)) & ~ (AARCH64_STACK_ALIGN - 1); /* Initialize our flags. We are interested if this CIF will touch a vector register, if so we will enable context save and load to those registers, otherwise not. This is intended to be friendly to lazy float context switching in the kernel. */ cif->aarch64_flags = 0; if (is_v_register_candidate (cif->rtype)) { cif->aarch64_flags |= AARCH64_FFI_WITH_V; } else { int i; for (i = 0; i < cif->nargs; i++) if (is_v_register_candidate (cif->arg_types[i])) { cif->aarch64_flags |= AARCH64_FFI_WITH_V; break; } } return FFI_OK; } /* Call a function with the provided arguments and capture the return value. */ void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: { struct call_context context; unsigned stack_bytes; /* Figure out the total amount of stack space we need, the above call frame space needs to be 16 bytes aligned to ensure correct alignment of the first object inserted in that space hence the ALIGN applied to cif->bytes.*/ stack_bytes = ALIGN(cif->bytes, 16); memset (&context, 0, sizeof (context)); if (is_register_candidate (cif->rtype)) { ffi_call_SYSV (aarch64_prep_args, &context, &ecif, stack_bytes, fn); switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_LONGDOUBLE: case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_INT: case FFI_TYPE_SINT64: { void *addr = get_basic_type_addr (cif->rtype->type, &context, 0); copy_basic_type (rvalue, addr, cif->rtype->type); break; } case FFI_TYPE_STRUCT: if (is_hfa (cif->rtype)) { int j; unsigned short type = get_homogeneous_type (cif->rtype); unsigned elems = element_count (cif->rtype); for (j = 0; j < elems; j++) { void *reg = get_basic_type_addr (type, &context, j); copy_basic_type (rvalue, reg, type); rvalue += get_basic_type_size (type); } } else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) { unsigned size = ALIGN (cif->rtype->size, sizeof (UINT64)); memcpy (rvalue, get_x_addr (&context, 0), size); } else { FFI_ASSERT (0); } break; default: FFI_ASSERT (0); break; } } else { memcpy (get_x_addr (&context, 8), &rvalue, sizeof (UINT64)); ffi_call_SYSV (aarch64_prep_args, &context, &ecif, stack_bytes, fn); } break; } default: FFI_ASSERT (0); break; } } static unsigned char trampoline [] = { 0x70, 0x00, 0x00, 0x58, /* ldr x16, 1f */ 0x91, 0x00, 0x00, 0x10, /* adr x17, 2f */ 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ }; /* Build a trampoline. */ #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,FLAGS) \ ({unsigned char *__tramp = (unsigned char*)(TRAMP); \ UINT64 __fun = (UINT64)(FUN); \ UINT64 __ctx = (UINT64)(CTX); \ UINT64 __flags = (UINT64)(FLAGS); \ memcpy (__tramp, trampoline, sizeof (trampoline)); \ memcpy (__tramp + 12, &__fun, sizeof (__fun)); \ memcpy (__tramp + 20, &__ctx, sizeof (__ctx)); \ memcpy (__tramp + 28, &__flags, sizeof (__flags)); \ __clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE); \ }) ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, codeloc, cif->aarch64_flags); closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } /* Primary handler to setup and invoke a function within a closure. A closure when invoked enters via the assembler wrapper ffi_closure_SYSV(). The wrapper allocates a call context on the stack, saves the interesting registers (from the perspective of the calling convention) into the context then passes control to ffi_closure_SYSV_inner() passing the saved context and a pointer to the stack at the point ffi_closure_SYSV() was invoked. On the return path the assembler wrapper will reload call context regsiters. ffi_closure_SYSV_inner() marshalls the call context into ffi value desriptors, invokes the wrapped function, then marshalls the return value back into the call context. */ void ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context, void *stack) { ffi_cif *cif = closure->cif; void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); void *rvalue = NULL; int i; struct arg_state state; arg_init (&state, ALIGN(cif->bytes, 16)); for (i = 0; i < cif->nargs; i++) { ffi_type *ty = cif->arg_types[i]; switch (ty->type) { case FFI_TYPE_VOID: FFI_ASSERT (0); break; case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_INT: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_LONGDOUBLE: avalue[i] = allocate_to_register_or_stack (context, stack, &state, ty->type); break; case FFI_TYPE_STRUCT: if (is_hfa (ty)) { unsigned n = element_count (ty); if (available_v (&state) < n) { state.nsrn = N_V_ARG_REG; avalue[i] = allocate_to_stack (&state, stack, ty->alignment, ty->size); } else { switch (get_homogeneous_type (ty)) { case FFI_TYPE_FLOAT: { /* Eeek! We need a pointer to the structure, however the homogeneous float elements are being passed in individual S registers, therefore the structure is not represented as a contiguous sequence of bytes in our saved register context. We need to fake up a copy of the structure layed out in memory correctly. The fake can be tossed once the closure function has returned hence alloca() is sufficient. */ int j; UINT32 *p = avalue[i] = alloca (ty->size); for (j = 0; j < element_count (ty); j++) memcpy (&p[j], allocate_to_s (context, &state), sizeof (*p)); break; } case FFI_TYPE_DOUBLE: { /* Eeek! We need a pointer to the structure, however the homogeneous float elements are being passed in individual S registers, therefore the structure is not represented as a contiguous sequence of bytes in our saved register context. We need to fake up a copy of the structure layed out in memory correctly. The fake can be tossed once the closure function has returned hence alloca() is sufficient. */ int j; UINT64 *p = avalue[i] = alloca (ty->size); for (j = 0; j < element_count (ty); j++) memcpy (&p[j], allocate_to_d (context, &state), sizeof (*p)); break; } case FFI_TYPE_LONGDOUBLE: memcpy (&avalue[i], allocate_to_v (context, &state), sizeof (*avalue)); break; default: FFI_ASSERT (0); break; } } } else if (ty->size > 16) { /* Replace Composite type of size greater than 16 with a pointer. */ memcpy (&avalue[i], allocate_to_register_or_stack (context, stack, &state, FFI_TYPE_POINTER), sizeof (avalue[i])); } else if (available_x (&state) >= (ty->size + 7) / 8) { avalue[i] = get_x_addr (context, state.ngrn); state.ngrn += (ty->size + 7) / 8; } else { state.ngrn = N_X_ARG_REG; avalue[i] = allocate_to_stack (&state, stack, ty->alignment, ty->size); } break; default: FFI_ASSERT (0); break; } } /* Figure out where the return value will be passed, either in registers or in a memory block allocated by the caller and passed in x8. */ if (is_register_candidate (cif->rtype)) { /* Register candidates are *always* returned in registers. */ /* Allocate a scratchpad for the return value, we will let the callee scrible the result into the scratch pad then move the contents into the appropriate return value location for the call convention. */ rvalue = alloca (cif->rtype->size); (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Copy the return value into the call context so that it is returned as expected to our caller. */ switch (cif->rtype->type) { case FFI_TYPE_VOID: break; case FFI_TYPE_UINT8: case FFI_TYPE_UINT16: case FFI_TYPE_UINT32: case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT8: case FFI_TYPE_SINT16: case FFI_TYPE_INT: case FFI_TYPE_SINT32: case FFI_TYPE_SINT64: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_LONGDOUBLE: { void *addr = get_basic_type_addr (cif->rtype->type, context, 0); copy_basic_type (addr, rvalue, cif->rtype->type); break; } case FFI_TYPE_STRUCT: if (is_hfa (cif->rtype)) { int i; unsigned short type = get_homogeneous_type (cif->rtype); unsigned elems = element_count (cif->rtype); for (i = 0; i < elems; i++) { void *reg = get_basic_type_addr (type, context, i); copy_basic_type (reg, rvalue, type); rvalue += get_basic_type_size (type); } } else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) { unsigned size = ALIGN (cif->rtype->size, sizeof (UINT64)) ; memcpy (get_x_addr (context, 0), rvalue, size); } else { FFI_ASSERT (0); } break; default: FFI_ASSERT (0); break; } } else { memcpy (&rvalue, get_x_addr (context, 8), sizeof (UINT64)); (closure->fun) (cif, rvalue, avalue, closure->user_data); } } polyml-5.6/libffi/src/aarch64/ffitarget.h000066400000000000000000000035211265146633400203110ustar00rootroot00000000000000/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 36 #define FFI_NATIVE_RAW_API 0 /* ---- Internal ---- */ #define FFI_EXTRA_CIF_FIELDS unsigned aarch64_flags #define AARCH64_FFI_WITH_V_BIT 0 #define AARCH64_N_XREG 32 #define AARCH64_N_VREG 32 #define AARCH64_CALL_CONTEXT_SIZE (AARCH64_N_XREG * 8 + AARCH64_N_VREG * 16) #endif polyml-5.6/libffi/src/aarch64/sysv.S000066400000000000000000000221451265146633400173200ustar00rootroot00000000000000/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define LIBFFI_ASM #include #include #define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off #define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off #define cfi_restore(reg) .cfi_restore reg #define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg .text .globl ffi_call_SYSV .type ffi_call_SYSV, #function /* ffi_call_SYSV() Create a stack frame, setup an argument context, call the callee and extract the result. The maximum required argument stack size is provided, ffi_call_SYSV() allocates that stack space then calls the prepare_fn to populate register context and stack. The argument passing registers are loaded from the register context and the callee called, on return the register passing register are saved back to the context. Our caller will extract the return value from the final state of the saved register context. Prototype: extern unsigned ffi_call_SYSV (void (*)(struct call_context *context, unsigned char *, extended_cif *), struct call_context *context, extended_cif *, unsigned required_stack_size, void (*fn)(void)); Therefore on entry we have: x0 prepare_fn x1 &context x2 &ecif x3 bytes x4 fn This function uses the following stack frame layout: == saved x30(lr) x29(fp)-> saved x29(fp) saved x24 saved x23 saved x22 sp' -> saved x21 ... sp -> (constructed callee stack arguments) == Voila! */ #define ffi_call_SYSV_FS (8 * 4) .cfi_startproc ffi_call_SYSV: stp x29, x30, [sp, #-16]! cfi_adjust_cfa_offset (16) cfi_rel_offset (x29, 0) cfi_rel_offset (x30, 8) mov x29, sp cfi_def_cfa_register (x29) sub sp, sp, #ffi_call_SYSV_FS stp x21, x22, [sp, 0] cfi_rel_offset (x21, 0 - ffi_call_SYSV_FS) cfi_rel_offset (x22, 8 - ffi_call_SYSV_FS) stp x23, x24, [sp, 16] cfi_rel_offset (x23, 16 - ffi_call_SYSV_FS) cfi_rel_offset (x24, 24 - ffi_call_SYSV_FS) mov x21, x1 mov x22, x2 mov x24, x4 /* Allocate the stack space for the actual arguments, many arguments will be passed in registers, but we assume worst case and allocate sufficient stack for ALL of the arguments. */ sub sp, sp, x3 /* unsigned (*prepare_fn) (struct call_context *context, unsigned char *stack, extended_cif *ecif); */ mov x23, x0 mov x0, x1 mov x1, sp /* x2 already in place */ blr x23 /* Preserve the flags returned. */ mov x23, x0 /* Figure out if we should touch the vector registers. */ tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f /* Load the vector argument passing registers. */ ldp q0, q1, [x21, #8*32 + 0] ldp q2, q3, [x21, #8*32 + 32] ldp q4, q5, [x21, #8*32 + 64] ldp q6, q7, [x21, #8*32 + 96] 1: /* Load the core argument passing registers. */ ldp x0, x1, [x21, #0] ldp x2, x3, [x21, #16] ldp x4, x5, [x21, #32] ldp x6, x7, [x21, #48] /* Don't forget x8 which may be holding the address of a return buffer. */ ldr x8, [x21, #8*8] blr x24 /* Save the core argument passing registers. */ stp x0, x1, [x21, #0] stp x2, x3, [x21, #16] stp x4, x5, [x21, #32] stp x6, x7, [x21, #48] /* Note nothing useful ever comes back in x8! */ /* Figure out if we should touch the vector registers. */ tbz x23, #AARCH64_FFI_WITH_V_BIT, 1f /* Save the vector argument passing registers. */ stp q0, q1, [x21, #8*32 + 0] stp q2, q3, [x21, #8*32 + 32] stp q4, q5, [x21, #8*32 + 64] stp q6, q7, [x21, #8*32 + 96] 1: /* All done, unwind our stack frame. */ ldp x21, x22, [x29, # - ffi_call_SYSV_FS] cfi_restore (x21) cfi_restore (x22) ldp x23, x24, [x29, # - ffi_call_SYSV_FS + 16] cfi_restore (x23) cfi_restore (x24) mov sp, x29 cfi_def_cfa_register (sp) ldp x29, x30, [sp], #16 cfi_adjust_cfa_offset (-16) cfi_restore (x29) cfi_restore (x30) ret .cfi_endproc .size ffi_call_SYSV, .-ffi_call_SYSV #define ffi_closure_SYSV_FS (8 * 2 + AARCH64_CALL_CONTEXT_SIZE) /* ffi_closure_SYSV Closure invocation glue. This is the low level code invoked directly by the closure trampoline to setup and call a closure. On entry x17 points to a struct trampoline_data, x16 has been clobbered all other registers are preserved. We allocate a call context and save the argument passing registers, then invoked the generic C ffi_closure_SYSV_inner() function to do all the real work, on return we load the result passing registers back from the call context. On entry extern void ffi_closure_SYSV (struct trampoline_data *); struct trampoline_data { UINT64 *ffi_closure; UINT64 flags; }; This function uses the following stack frame layout: == saved x30(lr) x29(fp)-> saved x29(fp) saved x22 saved x21 ... sp -> call_context == Voila! */ .text .globl ffi_closure_SYSV .cfi_startproc ffi_closure_SYSV: stp x29, x30, [sp, #-16]! cfi_adjust_cfa_offset (16) cfi_rel_offset (x29, 0) cfi_rel_offset (x30, 8) mov x29, sp sub sp, sp, #ffi_closure_SYSV_FS cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) stp x21, x22, [x29, #-16] cfi_rel_offset (x21, 0) cfi_rel_offset (x22, 8) /* Load x21 with &call_context. */ mov x21, sp /* Preserve our struct trampoline_data * */ mov x22, x17 /* Save the rest of the argument passing registers. */ stp x0, x1, [x21, #0] stp x2, x3, [x21, #16] stp x4, x5, [x21, #32] stp x6, x7, [x21, #48] /* Don't forget we may have been given a result scratch pad address. */ str x8, [x21, #64] /* Figure out if we should touch the vector registers. */ ldr x0, [x22, #8] tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f /* Save the argument passing vector registers. */ stp q0, q1, [x21, #8*32 + 0] stp q2, q3, [x21, #8*32 + 32] stp q4, q5, [x21, #8*32 + 64] stp q6, q7, [x21, #8*32 + 96] 1: /* Load &ffi_closure.. */ ldr x0, [x22, #0] mov x1, x21 /* Compute the location of the stack at the point that the trampoline was called. */ add x2, x29, #16 bl ffi_closure_SYSV_inner /* Figure out if we should touch the vector registers. */ ldr x0, [x22, #8] tbz x0, #AARCH64_FFI_WITH_V_BIT, 1f /* Load the result passing vector registers. */ ldp q0, q1, [x21, #8*32 + 0] ldp q2, q3, [x21, #8*32 + 32] ldp q4, q5, [x21, #8*32 + 64] ldp q6, q7, [x21, #8*32 + 96] 1: /* Load the result passing core registers. */ ldp x0, x1, [x21, #0] ldp x2, x3, [x21, #16] ldp x4, x5, [x21, #32] ldp x6, x7, [x21, #48] /* Note nothing usefull is returned in x8. */ /* We are done, unwind our frame. */ ldp x21, x22, [x29, #-16] cfi_restore (x21) cfi_restore (x22) mov sp, x29 cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) ldp x29, x30, [sp], #16 cfi_adjust_cfa_offset (-16) cfi_restore (x29) cfi_restore (x30) ret .cfi_endproc .size ffi_closure_SYSV, .-ffi_closure_SYSV polyml-5.6/libffi/src/alpha/000077500000000000000000000000001265146633400160215ustar00rootroot00000000000000polyml-5.6/libffi/src/alpha/ffi.c000066400000000000000000000164641265146633400167440ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2012 Anthony Green Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. Alpha Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; all further uses in this file will refer to the 128-bit type. */ #if defined(__LONG_DOUBLE_128__) # if FFI_TYPE_LONGDOUBLE != 4 # error FFI_TYPE_LONGDOUBLE out of date # endif #else # undef FFI_TYPE_LONGDOUBLE # define FFI_TYPE_LONGDOUBLE 4 #endif extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void)) FFI_HIDDEN; extern void ffi_closure_osf(void) FFI_HIDDEN; ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* Adjust cif->bytes to represent a minimum 6 words for the temporary register argument loading area. */ if (cif->bytes < 6*FFI_SIZEOF_ARG) cif->bytes = 6*FFI_SIZEOF_ARG; /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_STRUCT: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags = cif->rtype->type; break; case FFI_TYPE_LONGDOUBLE: /* 128-bit long double is returned in memory, like a struct. */ cif->flags = FFI_TYPE_STRUCT; break; default: cif->flags = FFI_TYPE_INT; break; } return FFI_OK; } void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { unsigned long *stack, *argp; long i, avn; ffi_type **arg_types; /* If the return value is a struct and we don't have a return value address then we need to make one. */ if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT) rvalue = alloca(cif->rtype->size); /* Allocate the space for the arguments, plus 4 words of temp space for ffi_call_osf. */ argp = stack = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); if (cif->flags == FFI_TYPE_STRUCT) *(void **) argp++ = rvalue; i = 0; avn = cif->nargs; arg_types = cif->arg_types; while (i < avn) { size_t size = (*arg_types)->size; switch ((*arg_types)->type) { case FFI_TYPE_SINT8: *(SINT64 *) argp = *(SINT8 *)(* avalue); break; case FFI_TYPE_UINT8: *(SINT64 *) argp = *(UINT8 *)(* avalue); break; case FFI_TYPE_SINT16: *(SINT64 *) argp = *(SINT16 *)(* avalue); break; case FFI_TYPE_UINT16: *(SINT64 *) argp = *(UINT16 *)(* avalue); break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: /* Note that unsigned 32-bit quantities are sign extended. */ *(SINT64 *) argp = *(SINT32 *)(* avalue); break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_POINTER: *(UINT64 *) argp = *(UINT64 *)(* avalue); break; case FFI_TYPE_FLOAT: if (argp - stack < 6) { /* Note the conversion -- all the fp regs are loaded as doubles. The in-register format is the same. */ *(double *) argp = *(float *)(* avalue); } else *(float *) argp = *(float *)(* avalue); break; case FFI_TYPE_DOUBLE: *(double *) argp = *(double *)(* avalue); break; case FFI_TYPE_LONGDOUBLE: /* 128-bit long double is passed by reference. */ *(long double **) argp = (long double *)(* avalue); size = sizeof (long double *); break; case FFI_TYPE_STRUCT: memcpy(argp, *avalue, (*arg_types)->size); break; default: FFI_ASSERT(0); } argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; i++, arg_types++, avalue++; } ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn); } ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp; if (cif->abi != FFI_OSF) return FFI_BAD_ABI; tramp = (unsigned int *) &closure->tramp[0]; tramp[0] = 0x47fb0401; /* mov $27,$1 */ tramp[1] = 0xa77b0010; /* ldq $27,16($27) */ tramp[2] = 0x6bfb0000; /* jmp $31,($27),0 */ tramp[3] = 0x47ff041f; /* nop */ *(void **) &tramp[4] = ffi_closure_osf; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; /* Flush the Icache. Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal instead, since both Compaq as and gas can handle it. 0x86 is PAL_imb in Tru64 UNIX . */ asm volatile ("call_pal 0x86" : : : "memory"); return FFI_OK; } long FFI_HIDDEN ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp) { ffi_cif *cif; void **avalue; ffi_type **arg_types; long i, avn, argn; cif = closure->cif; avalue = alloca(cif->nargs * sizeof(void *)); argn = 0; /* Copy the caller's structure return address to that the closure returns the data directly to the caller. */ if (cif->flags == FFI_TYPE_STRUCT) { rvalue = (void *) argp[0]; argn = 1; } i = 0; avn = cif->nargs; arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ while (i < avn) { size_t size = arg_types[i]->size; switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_POINTER: case FFI_TYPE_STRUCT: avalue[i] = &argp[argn]; break; case FFI_TYPE_FLOAT: if (argn < 6) { /* Floats coming from registers need conversion from double back to float format. */ *(float *)&argp[argn - 6] = *(double *)&argp[argn - 6]; avalue[i] = &argp[argn - 6]; } else avalue[i] = &argp[argn]; break; case FFI_TYPE_DOUBLE: avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)]; break; case FFI_TYPE_LONGDOUBLE: /* 128-bit long double is passed by reference. */ avalue[i] = (long double *) argp[argn]; size = sizeof (long double *); break; default: abort (); } argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; i++; } /* Invoke the closure. */ closure->fun (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_osf how to perform return type promotions. */ return cif->rtype->type; } polyml-5.6/libffi/src/alpha/ffitarget.h000066400000000000000000000036211265146633400201470ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for Alpha. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_OSF, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_OSF } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 24 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/alpha/osf.S000066400000000000000000000202101265146633400167270ustar00rootroot00000000000000/* ----------------------------------------------------------------------- osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat Alpha/OSF Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .arch ev6 .text /* ffi_call_osf (void *args, unsigned long bytes, unsigned flags, void *raddr, void (*fnaddr)(void)); Bit o trickiness here -- ARGS+BYTES is the base of the stack frame for this function. This has been allocated by ffi_call. We also deallocate some of the stack that has been alloca'd. */ .align 3 .globl ffi_call_osf .ent ffi_call_osf FFI_HIDDEN(ffi_call_osf) ffi_call_osf: .frame $15, 32, $26, 0 .mask 0x4008000, -32 $LFB1: addq $16,$17,$1 mov $16, $30 stq $26, 0($1) stq $15, 8($1) stq $18, 16($1) mov $1, $15 $LCFI1: .prologue 0 stq $19, 24($1) mov $20, $27 # Load up all of the (potential) argument registers. ldq $16, 0($30) ldt $f16, 0($30) ldt $f17, 8($30) ldq $17, 8($30) ldt $f18, 16($30) ldq $18, 16($30) ldt $f19, 24($30) ldq $19, 24($30) ldt $f20, 32($30) ldq $20, 32($30) ldt $f21, 40($30) ldq $21, 40($30) # Deallocate the register argument area. lda $30, 48($30) jsr $26, ($27), 0 ldgp $29, 0($26) # If the return value pointer is NULL, assume no return value. ldq $19, 24($15) ldq $18, 16($15) ldq $26, 0($15) $LCFI2: beq $19, $noretval # Store the return value out in the proper type. cmpeq $18, FFI_TYPE_INT, $1 bne $1, $retint cmpeq $18, FFI_TYPE_FLOAT, $2 bne $2, $retfloat cmpeq $18, FFI_TYPE_DOUBLE, $3 bne $3, $retdouble .align 3 $noretval: ldq $15, 8($15) ret .align 4 $retint: stq $0, 0($19) nop ldq $15, 8($15) ret .align 4 $retfloat: sts $f0, 0($19) nop ldq $15, 8($15) ret .align 4 $retdouble: stt $f0, 0($19) nop ldq $15, 8($15) ret $LFE1: .end ffi_call_osf /* ffi_closure_osf(...) Receives the closure argument in $1. */ .align 3 .globl ffi_closure_osf .ent ffi_closure_osf FFI_HIDDEN(ffi_closure_osf) ffi_closure_osf: .frame $30, 16*8, $26, 0 .mask 0x4000000, -16*8 $LFB2: ldgp $29, 0($27) subq $30, 16*8, $30 $LCFI5: stq $26, 0($30) $LCFI6: .prologue 1 # Store all of the potential argument registers in va_list format. stt $f16, 4*8($30) stt $f17, 5*8($30) stt $f18, 6*8($30) stt $f19, 7*8($30) stt $f20, 8*8($30) stt $f21, 9*8($30) stq $16, 10*8($30) stq $17, 11*8($30) stq $18, 12*8($30) stq $19, 13*8($30) stq $20, 14*8($30) stq $21, 15*8($30) # Call ffi_closure_osf_inner to do the bulk of the work. mov $1, $16 lda $17, 2*8($30) lda $18, 10*8($30) jsr $26, ffi_closure_osf_inner ldgp $29, 0($26) ldq $26, 0($30) # Load up the return value in the proper type. lda $1, $load_table s4addq $0, $1, $1 ldl $1, 0($1) addq $1, $29, $1 jmp $31, ($1), $load_32 .align 4 $load_none: addq $30, 16*8, $30 ret .align 4 $load_float: lds $f0, 16($30) nop addq $30, 16*8, $30 ret .align 4 $load_double: ldt $f0, 16($30) nop addq $30, 16*8, $30 ret .align 4 $load_u8: #ifdef __alpha_bwx__ ldbu $0, 16($30) nop #else ldq $0, 16($30) and $0, 255, $0 #endif addq $30, 16*8, $30 ret .align 4 $load_s8: #ifdef __alpha_bwx__ ldbu $0, 16($30) sextb $0, $0 #else ldq $0, 16($30) sll $0, 56, $0 sra $0, 56, $0 #endif addq $30, 16*8, $30 ret .align 4 $load_u16: #ifdef __alpha_bwx__ ldwu $0, 16($30) nop #else ldq $0, 16($30) zapnot $0, 3, $0 #endif addq $30, 16*8, $30 ret .align 4 $load_s16: #ifdef __alpha_bwx__ ldwu $0, 16($30) sextw $0, $0 #else ldq $0, 16($30) sll $0, 48, $0 sra $0, 48, $0 #endif addq $30, 16*8, $30 ret .align 4 $load_32: ldl $0, 16($30) nop addq $30, 16*8, $30 ret .align 4 $load_64: ldq $0, 16($30) nop addq $30, 16*8, $30 ret $LFE2: .end ffi_closure_osf #ifdef __ELF__ .section .rodata #else .rdata #endif $load_table: .gprel32 $load_none # FFI_TYPE_VOID .gprel32 $load_32 # FFI_TYPE_INT .gprel32 $load_float # FFI_TYPE_FLOAT .gprel32 $load_double # FFI_TYPE_DOUBLE .gprel32 $load_none # FFI_TYPE_LONGDOUBLE .gprel32 $load_u8 # FFI_TYPE_UINT8 .gprel32 $load_s8 # FFI_TYPE_SINT8 .gprel32 $load_u16 # FFI_TYPE_UINT16 .gprel32 $load_s16 # FFI_TYPE_SINT16 .gprel32 $load_32 # FFI_TYPE_UINT32 .gprel32 $load_32 # FFI_TYPE_SINT32 .gprel32 $load_64 # FFI_TYPE_UINT64 .gprel32 $load_64 # FFI_TYPE_SINT64 .gprel32 $load_none # FFI_TYPE_STRUCT .gprel32 $load_64 # FFI_TYPE_POINTER /* Assert that the table above is in sync with ffi.h. */ #if FFI_TYPE_FLOAT != 2 \ || FFI_TYPE_DOUBLE != 3 \ || FFI_TYPE_UINT8 != 5 \ || FFI_TYPE_SINT8 != 6 \ || FFI_TYPE_UINT16 != 7 \ || FFI_TYPE_SINT16 != 8 \ || FFI_TYPE_UINT32 != 9 \ || FFI_TYPE_SINT32 != 10 \ || FFI_TYPE_UINT64 != 11 \ || FFI_TYPE_SINT64 != 12 \ || FFI_TYPE_STRUCT != 13 \ || FFI_TYPE_POINTER != 14 \ || FFI_TYPE_LAST != 14 #error "osf.S out of sync with ffi.h" #endif #ifdef __ELF__ # define UA_SI .4byte # define FDE_ENCODING 0x1b /* pcrel sdata4 */ # define FDE_ENCODE(X) .4byte X-. # define FDE_ARANGE(X) .4byte X #elif defined __osf__ # define UA_SI .align 0; .long # define FDE_ENCODING 0x50 /* aligned absolute */ # define FDE_ENCODE(X) .align 3; .quad X # define FDE_ARANGE(X) .align 0; .quad X #endif #ifdef __ELF__ .section .eh_frame,EH_FRAME_FLAGS,@progbits #elif defined __osf__ .data .align 3 .globl _GLOBAL__F_ffi_call_osf _GLOBAL__F_ffi_call_osf: #endif __FRAME_BEGIN__: UA_SI $LECIE1-$LSCIE1 # Length of Common Information Entry $LSCIE1: UA_SI 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .byte 0x1 # uleb128 0x1; CIE Code Alignment Factor .byte 0x78 # sleb128 -8; CIE Data Alignment Factor .byte 26 # CIE RA Column .byte 0x1 # uleb128 0x1; Augmentation size .byte FDE_ENCODING # FDE Encoding .byte 0xc # DW_CFA_def_cfa .byte 30 # uleb128 column 30 .byte 0 # uleb128 offset 0 .align 3 $LECIE1: $LSFDE1: UA_SI $LEFDE1-$LASFDE1 # FDE Length $LASFDE1: UA_SI $LASFDE1-__FRAME_BEGIN__ # FDE CIE offset FDE_ENCODE($LFB1) # FDE initial location FDE_ARANGE($LFE1-$LFB1) # FDE address range .byte 0x0 # uleb128 0x0; Augmentation size .byte 0x4 # DW_CFA_advance_loc4 UA_SI $LCFI1-$LFB1 .byte 0x9a # DW_CFA_offset, column 26 .byte 4 # uleb128 4*-8 .byte 0x8f # DW_CFA_offset, column 15 .byte 0x3 # uleb128 3*-8 .byte 0xc # DW_CFA_def_cfa .byte 15 # uleb128 column 15 .byte 32 # uleb128 offset 32 .byte 0x4 # DW_CFA_advance_loc4 UA_SI $LCFI2-$LCFI1 .byte 0xda # DW_CFA_restore, column 26 .align 3 $LEFDE1: $LSFDE3: UA_SI $LEFDE3-$LASFDE3 # FDE Length $LASFDE3: UA_SI $LASFDE3-__FRAME_BEGIN__ # FDE CIE offset FDE_ENCODE($LFB2) # FDE initial location FDE_ARANGE($LFE2-$LFB2) # FDE address range .byte 0x0 # uleb128 0x0; Augmentation size .byte 0x4 # DW_CFA_advance_loc4 UA_SI $LCFI5-$LFB2 .byte 0xe # DW_CFA_def_cfa_offset .byte 0x80,0x1 # uleb128 128 .byte 0x4 # DW_CFA_advance_loc4 UA_SI $LCFI6-$LCFI5 .byte 0x9a # DW_CFA_offset, column 26 .byte 16 # uleb128 offset 16*-8 .align 3 $LEFDE3: #if defined __osf__ .align 0 .long 0 # End of Table #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/arm/000077500000000000000000000000001265146633400155135ustar00rootroot00000000000000polyml-5.6/libffi/src/arm/ffi.c000066400000000000000000000504131265146633400164260ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2011 Timothy Wall Copyright (c) 2011 Plausible Labs Cooperative, Inc. Copyright (c) 2011 Anthony Green Copyright (c) 2011 Free Software Foundation Copyright (c) 1998, 2008, 2011 Red Hat, Inc. ARM Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* Forward declares. */ static int vfp_type_p (ffi_type *); static void layout_vfp_args (ffi_cif *); /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments The vfp_space parameter is the load area for VFP regs, the return value is cif->vfp_used (word bitset of VFP regs used for passing arguments). These are only used for the VFP hard-float ABI. */ int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space) { register unsigned int i, vi = 0; register void **p_argv; register char *argp; register ffi_type **p_arg; argp = stack; if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { *(void **) argp = ecif->rvalue; argp += 4; } p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++) { size_t z; size_t alignment; /* Allocated in VFP registers. */ if (ecif->cif->abi == FFI_VFP && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg)) { float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++]; if ((*p_arg)->type == FFI_TYPE_FLOAT) *((float*)vfp_slot) = *((float*)*p_argv); else if ((*p_arg)->type == FFI_TYPE_DOUBLE) *((double*)vfp_slot) = *((double*)*p_argv); else memcpy(vfp_slot, *p_argv, (*p_arg)->size); p_argv++; continue; } /* Align if necessary */ alignment = (*p_arg)->alignment; #ifdef _WIN32_WCE if (alignment > 4) alignment = 4; #endif if ((alignment - 1) & (unsigned) argp) { argp = (char *) ALIGN(argp, alignment); } if ((*p_arg)->type == FFI_TYPE_STRUCT) argp = (char *) ALIGN(argp, 4); z = (*p_arg)->size; if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; case FFI_TYPE_STRUCT: memcpy(argp, *p_argv, (*p_arg)->size); break; default: FFI_ASSERT(0); } } else if (z == sizeof(int)) { *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); } else { memcpy(argp, *p_argv, z); } p_argv++; argp += z; } /* Indicate the VFP registers used. */ return ecif->cif->vfp_used; } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { int type_code; /* Round the stack up to a multiple of 8 bytes. This isn't needed everywhere, but it is on some platforms, and it doesn't harm anything when it isn't needed. */ cif->bytes = (cif->bytes + 7) & ~7; /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags = (unsigned) cif->rtype->type; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = (unsigned) FFI_TYPE_SINT64; break; case FFI_TYPE_STRUCT: if (cif->abi == FFI_VFP && (type_code = vfp_type_p (cif->rtype)) != 0) { /* A Composite Type passed in VFP registers, either FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */ cif->flags = (unsigned) type_code; } else if (cif->rtype->size <= 4) /* A Composite Type not larger than 4 bytes is returned in r0. */ cif->flags = (unsigned)FFI_TYPE_INT; else /* A Composite Type larger than 4 bytes, or whose size cannot be determined statically ... is stored in memory at an address passed [in r0]. */ cif->flags = (unsigned)FFI_TYPE_STRUCT; break; default: cif->flags = FFI_TYPE_INT; break; } /* Map out the register placements of VFP register args. The VFP hard-float calling conventions are slightly more sophisticated than the base calling conventions, so we do it here instead of in ffi_prep_args(). */ if (cif->abi == FFI_VFP) layout_vfp_args (cif); return FFI_OK; } /* Perform machine dependent cif processing for variadic calls */ ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) { /* VFP variadic calls actually use the SYSV ABI */ if (cif->abi == FFI_VFP) cif->abi = FFI_SYSV; return ffi_prep_cif_machdep(cif); } /* Prototypes for assembly functions, in sysv.S */ extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; int small_struct = (cif->flags == FFI_TYPE_INT && cif->rtype->type == FFI_TYPE_STRUCT); int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE); ecif.cif = cif; ecif.avalue = avalue; unsigned int temp; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if ((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else if (small_struct) ecif.rvalue = &temp; else if (vfp_struct) { /* Largest case is double x 4. */ ecif.rvalue = alloca(32); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); break; case FFI_VFP: #ifdef __ARM_EABI__ ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); break; #endif default: FFI_ASSERT(0); break; } if (small_struct) memcpy (rvalue, &temp, cif->rtype->size); else if (vfp_struct) memcpy (rvalue, ecif.rvalue, cif->rtype->size); } /** private members **/ static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, void** args, ffi_cif* cif, float *vfp_stack); void ffi_closure_SYSV (ffi_closure *); void ffi_closure_VFP (ffi_closure *); /* This function is jumped to by the trampoline */ unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) ffi_closure *closure; void **respp; void *args; void *vfp_args; { // our various things... ffi_cif *cif; void **arg_area; cif = closure->cif; arg_area = (void**) alloca (cif->nargs * sizeof (void*)); /* this call will initialize ARG_AREA, such that each * element in that array points to the corresponding * value on the stack; and if the function returns * a structure, it will re-set RESP to point to the * structure return address. */ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); (closure->fun) (cif, *respp, arg_area, closure->user_data); return cif->flags; } /*@-exportheader@*/ static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ffi_cif *cif, /* Used only under VFP hard-float ABI. */ float *vfp_stack) /*@=exportheader@*/ { register unsigned int i, vi = 0; register void **p_argv; register char *argp; register ffi_type **p_arg; argp = stack; if ( cif->flags == FFI_TYPE_STRUCT ) { *rvalue = *(void **) argp; argp += 4; } p_argv = avalue; for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { size_t z; size_t alignment; if (cif->abi == FFI_VFP && vi < cif->vfp_nargs && vfp_type_p (*p_arg)) { *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]); continue; } alignment = (*p_arg)->alignment; if (alignment < 4) alignment = 4; #ifdef _WIN32_WCE else if (alignment > 4) alignment = 4; #endif /* Align if necessary */ if ((alignment - 1) & (unsigned) argp) { argp = (char *) ALIGN(argp, alignment); } z = (*p_arg)->size; /* because we're little endian, this is what it turns into. */ *p_argv = (void*) argp; p_argv++; argp += z; } return; } /* How to make a trampoline. */ extern unsigned int ffi_arm_trampoline[3]; #if FFI_EXEC_TRAMPOLINE_TABLE #include #include #include #include extern void *ffi_closure_trampoline_table_page; typedef struct ffi_trampoline_table ffi_trampoline_table; typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; struct ffi_trampoline_table { /* contigious writable and executable pages */ vm_address_t config_page; vm_address_t trampoline_page; /* free list tracking */ uint16_t free_count; ffi_trampoline_table_entry *free_list; ffi_trampoline_table_entry *free_list_pool; ffi_trampoline_table *prev; ffi_trampoline_table *next; }; struct ffi_trampoline_table_entry { void *(*trampoline)(); ffi_trampoline_table_entry *next; }; /* Override the standard architecture trampoline size */ // XXX TODO - Fix #undef FFI_TRAMPOLINE_SIZE #define FFI_TRAMPOLINE_SIZE 12 /* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */ #define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080)); /* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */ #define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16 /* Total number of trampolines that fit in one trampoline table */ #define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE) static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; static ffi_trampoline_table *ffi_trampoline_tables = NULL; static ffi_trampoline_table * ffi_trampoline_table_alloc () { ffi_trampoline_table *table = NULL; /* Loop until we can allocate two contigious pages */ while (table == NULL) { vm_address_t config_page = 0x0; kern_return_t kt; /* Try to allocate two pages */ kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE); if (kt != KERN_SUCCESS) { fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); break; } /* Now drop the second half of the allocation to make room for the trampoline table */ vm_address_t trampoline_page = config_page+PAGE_SIZE; kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE); if (kt != KERN_SUCCESS) { fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); break; } /* Remap the trampoline table to directly follow the config page */ vm_prot_t cur_prot; vm_prot_t max_prot; kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */ if (kt != KERN_SUCCESS) { /* Log unexpected failures */ if (kt != KERN_NO_SPACE) { fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); } vm_deallocate (mach_task_self (), config_page, PAGE_SIZE); continue; } /* We have valid trampoline and config pages */ table = calloc (1, sizeof(ffi_trampoline_table)); table->free_count = FFI_TRAMPOLINE_COUNT; table->config_page = config_page; table->trampoline_page = trampoline_page; /* Create and initialize the free list */ table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry)); uint16_t i; for (i = 0; i < table->free_count; i++) { ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); if (i < table->free_count - 1) entry->next = &table->free_list_pool[i+1]; } table->free_list = table->free_list_pool; } return table; } void * ffi_closure_alloc (size_t size, void **code) { /* Create the closure */ ffi_closure *closure = malloc(size); if (closure == NULL) return NULL; pthread_mutex_lock(&ffi_trampoline_lock); /* Check for an active trampoline table with available entries. */ ffi_trampoline_table *table = ffi_trampoline_tables; if (table == NULL || table->free_list == NULL) { table = ffi_trampoline_table_alloc (); if (table == NULL) { free(closure); return NULL; } /* Insert the new table at the top of the list */ table->next = ffi_trampoline_tables; if (table->next != NULL) table->next->prev = table; ffi_trampoline_tables = table; } /* Claim the free entry */ ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; ffi_trampoline_tables->free_list = entry->next; ffi_trampoline_tables->free_count--; entry->next = NULL; pthread_mutex_unlock(&ffi_trampoline_lock); /* Initialize the return values */ *code = entry->trampoline; closure->trampoline_table = table; closure->trampoline_table_entry = entry; return closure; } void ffi_closure_free (void *ptr) { ffi_closure *closure = ptr; pthread_mutex_lock(&ffi_trampoline_lock); /* Fetch the table and entry references */ ffi_trampoline_table *table = closure->trampoline_table; ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; /* Return the entry to the free list */ entry->next = table->free_list; table->free_list = entry; table->free_count++; /* If all trampolines within this table are free, and at least one other table exists, deallocate * the table */ if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { /* Remove from the list */ if (table->prev != NULL) table->prev->next = table->next; if (table->next != NULL) table->next->prev = table->prev; /* Deallocate pages */ kern_return_t kt; kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE); if (kt != KERN_SUCCESS) fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE); if (kt != KERN_SUCCESS) fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__); /* Deallocate free list */ free (table->free_list_pool); free (table); } else if (ffi_trampoline_tables != table) { /* Otherwise, bump this table to the top of the list */ table->prev = NULL; table->next = ffi_trampoline_tables; if (ffi_trampoline_tables != NULL) ffi_trampoline_tables->prev = table; ffi_trampoline_tables = table; } pthread_mutex_unlock (&ffi_trampoline_lock); /* Free the closure */ free (closure); } #else #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ unsigned int __ctx = (unsigned int)(CTX); \ unsigned char *insns = (unsigned char *)(CTX); \ memcpy (__tramp, ffi_arm_trampoline, sizeof ffi_arm_trampoline); \ *(unsigned int*) &__tramp[12] = __ctx; \ *(unsigned int*) &__tramp[16] = __fun; \ __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping. */ \ __clear_cache(insns, insns + 3 * sizeof (unsigned int)); \ /* Clear instruction \ mapping. */ \ }) #endif /* the cif must already be prep'ed */ ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { void (*closure_func)(ffi_closure*) = NULL; if (cif->abi == FFI_SYSV) closure_func = &ffi_closure_SYSV; #ifdef __ARM_EABI__ else if (cif->abi == FFI_VFP) closure_func = &ffi_closure_VFP; #endif else return FFI_BAD_ABI; #if FFI_EXEC_TRAMPOLINE_TABLE void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc); config[0] = closure; config[1] = closure_func; #else FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ closure_func, \ codeloc); #endif closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } /* Below are routines for VFP hard-float support. */ static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum) { switch (t->type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: *elt = (int) t->type; *elnum = 1; return 1; case FFI_TYPE_STRUCT_VFP_FLOAT: *elt = FFI_TYPE_FLOAT; *elnum = t->size / sizeof (float); return 1; case FFI_TYPE_STRUCT_VFP_DOUBLE: *elt = FFI_TYPE_DOUBLE; *elnum = t->size / sizeof (double); return 1; case FFI_TYPE_STRUCT:; { int base_elt = 0, total_elnum = 0; ffi_type **el = t->elements; while (*el) { int el_elt = 0, el_elnum = 0; if (! rec_vfp_type_p (*el, &el_elt, &el_elnum) || (base_elt && base_elt != el_elt) || total_elnum + el_elnum > 4) return 0; base_elt = el_elt; total_elnum += el_elnum; el++; } *elnum = total_elnum; *elt = base_elt; return 1; } default: ; } return 0; } static int vfp_type_p (ffi_type *t) { int elt, elnum; if (rec_vfp_type_p (t, &elt, &elnum)) { if (t->type == FFI_TYPE_STRUCT) { if (elnum == 1) t->type = elt; else t->type = (elt == FFI_TYPE_FLOAT ? FFI_TYPE_STRUCT_VFP_FLOAT : FFI_TYPE_STRUCT_VFP_DOUBLE); } return (int) t->type; } return 0; } static void place_vfp_arg (ffi_cif *cif, ffi_type *t) { int reg = cif->vfp_reg_free; int nregs = t->size / sizeof (float); int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT || t->type == FFI_TYPE_FLOAT) ? 1 : 2); /* Align register number. */ if ((reg & 1) && align == 2) reg++; while (reg + nregs <= 16) { int s, new_used = 0; for (s = reg; s < reg + nregs; s++) { new_used |= (1 << s); if (cif->vfp_used & (1 << s)) { reg += align; goto next_reg; } } /* Found regs to allocate. */ cif->vfp_used |= new_used; cif->vfp_args[cif->vfp_nargs++] = reg; /* Update vfp_reg_free. */ if (cif->vfp_used & (1 << cif->vfp_reg_free)) { reg += nregs; while (cif->vfp_used & (1 << reg)) reg += 1; cif->vfp_reg_free = reg; } return; next_reg: ; } } static void layout_vfp_args (ffi_cif *cif) { int i; /* Init VFP fields */ cif->vfp_used = 0; cif->vfp_nargs = 0; cif->vfp_reg_free = 0; memset (cif->vfp_args, -1, 16); /* Init to -1. */ for (i = 0; i < cif->nargs; i++) { ffi_type *t = cif->arg_types[i]; if (vfp_type_p (t)) place_vfp_arg (cif, t); } } polyml-5.6/libffi/src/arm/ffitarget.h000066400000000000000000000044661265146633400176510ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 2010 CodeSourcery Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for ARM. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_VFP, FFI_LAST_ABI, #ifdef __ARM_PCS_VFP FFI_DEFAULT_ABI = FFI_VFP, #else FFI_DEFAULT_ABI = FFI_SYSV, #endif } ffi_abi; #endif #define FFI_EXTRA_CIF_FIELDS \ int vfp_used; \ short vfp_reg_free, vfp_nargs; \ signed char vfp_args[16] \ /* Internally used. */ #define FFI_TYPE_STRUCT_VFP_FLOAT (FFI_TYPE_LAST + 1) #define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2) #define FFI_TARGET_SPECIFIC_VARIADIC /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 20 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/arm/gentramp.sh000077500000000000000000000102561265146633400176730ustar00rootroot00000000000000#!/bin/sh # ----------------------------------------------------------------------- # gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc. # # ARM Trampoline Page Generator # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # ``Software''), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # ----------------------------------------------------------------------- PROGNAME=$0 # Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change, # the entire arm trampoline implementation must be updated to match, too. # Size of an individual trampoline, in bytes TRAMPOLINE_SIZE=12 # Page size, in bytes PAGE_SIZE=4096 # Compute the size of the reachable config page; The first 16 bytes of the config page # are unreachable due to our maximum pc-relative ldr offset. PAGE_AVAIL=`expr $PAGE_SIZE - 16` # Compute the number of of available trampolines. TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE` header () { echo "# GENERATED CODE - DO NOT EDIT" echo "# This file was generated by $PROGNAME" echo "" # Write out the license header cat << EOF # Copyright (c) 2010, Plausible Labs Cooperative, Inc. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # ``Software''), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # ----------------------------------------------------------------------- EOF # Write out the trampoline table, aligned to the page boundary echo ".text" echo ".align 12" echo ".globl _ffi_closure_trampoline_table_page" echo "_ffi_closure_trampoline_table_page:" } # WARNING - Don't modify the trampoline code size without also updating the relevent libffi code trampoline () { cat << END // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] END } main () { # Write out the header header # Write out the trampolines local i=0 while [ $i -lt ${TRAMPOLINE_COUNT} ]; do trampoline local i=`expr $i + 1` done } main polyml-5.6/libffi/src/arm/sysv.S000066400000000000000000000250521265146633400166470ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. Copyright (c) 2011 Plausible Labs Cooperative, Inc. ARM Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_MACHINE_ASM_H #include #else #ifdef __USER_LABEL_PREFIX__ #define CONCAT1(a, b) CONCAT2(a, b) #define CONCAT2(a, b) a ## b /* Use the right prefix for global labels. */ #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) #else #define CNAME(x) x #endif #ifdef __APPLE__ #define ENTRY(x) .globl _##x; _##x: #else #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): #endif /* __APPLE__ */ #endif #ifdef __ELF__ #define LSYM(x) .x #else #define LSYM(x) x #endif /* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI Function Call Guide */ #ifdef __APPLE__ #define __SOFTFP__ #endif /* We need a better way of testing for this, but for now, this is all we can do. */ @ This selects the minimum architecture level required. #define __ARM_ARCH__ 3 #if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) # undef __ARM_ARCH__ # define __ARM_ARCH__ 4 #endif #if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ || defined(__ARM_ARCH_5TEJ__) # undef __ARM_ARCH__ # define __ARM_ARCH__ 5 #endif #if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ || defined(__ARM_ARCH_6M__) # undef __ARM_ARCH__ # define __ARM_ARCH__ 6 #endif #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ || defined(__ARM_ARCH_7EM__) # undef __ARM_ARCH__ # define __ARM_ARCH__ 7 #endif #if __ARM_ARCH__ >= 5 # define call_reg(x) blx x #elif defined (__ARM_ARCH_4T__) # define call_reg(x) mov lr, pc ; bx x # if defined(__thumb__) || defined(__THUMB_INTERWORK__) # define __INTERWORKING__ # endif #else # define call_reg(x) mov lr, pc ; mov pc, x #endif /* Conditionally compile unwinder directives. */ #ifdef __ARM_EABI__ #define UNWIND #else #define UNWIND @ #endif #if defined(__thumb__) && !defined(__THUMB_INTERWORK__) .macro ARM_FUNC_START name .text .align 0 .thumb .thumb_func #ifdef __APPLE__ ENTRY($0) #else ENTRY(\name) #endif bx pc nop .arm UNWIND .fnstart /* A hook to tell gdb that we've switched to ARM mode. Also used to call directly from other local arm routines. */ #ifdef __APPLE__ _L__$0: #else _L__\name: #endif .endm #else .macro ARM_FUNC_START name .text .align 0 .arm #ifdef __APPLE__ ENTRY($0) #else ENTRY(\name) #endif UNWIND .fnstart .endm #endif .macro RETLDM regs=, cond=, dirn=ia #if defined (__INTERWORKING__) .ifc "\regs","" ldr\cond lr, [sp], #4 .else ldm\cond\dirn sp!, {\regs, lr} .endif bx\cond lr #else .ifc "\regs","" ldr\cond pc, [sp], #4 .else ldm\cond\dirn sp!, {\regs, pc} .endif #endif .endm @ r0: ffi_prep_args @ r1: &ecif @ r2: cif->bytes @ r3: fig->flags @ sp+0: ecif.rvalue @ This assumes we are using gas. ARM_FUNC_START ffi_call_SYSV @ Save registers stmfd sp!, {r0-r3, fp, lr} UNWIND .save {r0-r3, fp, lr} mov fp, sp UNWIND .setfp fp, sp @ Make room for all of the new args. sub sp, fp, r2 @ Place all of the ffi_prep_args in position mov r0, sp @ r1 already set @ Call ffi_prep_args(stack, &ecif) bl CNAME(ffi_prep_args) @ move first 4 parameters in registers ldmia sp, {r0-r3} @ and adjust stack sub lr, fp, sp @ cif->bytes == fp - sp ldr ip, [fp] @ load fn() in advance cmp lr, #16 movhs lr, #16 add sp, sp, lr @ call (fn) (...) call_reg(ip) @ Remove the space we pushed for the args mov sp, fp @ Load r2 with the pointer to storage for the return value ldr r2, [sp, #24] @ Load r3 with the return type code ldr r3, [sp, #12] @ If the return value pointer is NULL, assume no return value. cmp r2, #0 beq LSYM(Lepilogue) @ return INT cmp r3, #FFI_TYPE_INT #if defined(__SOFTFP__) || defined(__ARM_EABI__) cmpne r3, #FFI_TYPE_FLOAT #endif streq r0, [r2] beq LSYM(Lepilogue) @ return INT64 cmp r3, #FFI_TYPE_SINT64 #if defined(__SOFTFP__) || defined(__ARM_EABI__) cmpne r3, #FFI_TYPE_DOUBLE #endif stmeqia r2, {r0, r1} #if !defined(__SOFTFP__) && !defined(__ARM_EABI__) beq LSYM(Lepilogue) @ return FLOAT cmp r3, #FFI_TYPE_FLOAT stfeqs f0, [r2] beq LSYM(Lepilogue) @ return DOUBLE or LONGDOUBLE cmp r3, #FFI_TYPE_DOUBLE stfeqd f0, [r2] #endif LSYM(Lepilogue): #if defined (__INTERWORKING__) ldmia sp!, {r0-r3,fp, lr} bx lr #else ldmia sp!, {r0-r3,fp, pc} #endif .ffi_call_SYSV_end: UNWIND .fnend #ifdef __ELF__ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) #endif /* unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (closure, respp, args) ffi_closure *closure; void **respp; void *args; */ ARM_FUNC_START ffi_closure_SYSV UNWIND .pad #16 add ip, sp, #16 stmfd sp!, {ip, lr} UNWIND .save {r0, lr} add r2, sp, #8 UNWIND .pad #16 sub sp, sp, #16 str sp, [sp, #8] add r1, sp, #8 bl CNAME(ffi_closure_SYSV_inner) cmp r0, #FFI_TYPE_INT beq .Lretint cmp r0, #FFI_TYPE_FLOAT #if defined(__SOFTFP__) || defined(__ARM_EABI__) beq .Lretint #else beq .Lretfloat #endif cmp r0, #FFI_TYPE_DOUBLE #if defined(__SOFTFP__) || defined(__ARM_EABI__) beq .Lretlonglong #else beq .Lretdouble #endif cmp r0, #FFI_TYPE_LONGDOUBLE #if defined(__SOFTFP__) || defined(__ARM_EABI__) beq .Lretlonglong #else beq .Lretlongdouble #endif cmp r0, #FFI_TYPE_SINT64 beq .Lretlonglong .Lclosure_epilogue: add sp, sp, #16 ldmfd sp, {sp, pc} .Lretint: ldr r0, [sp] b .Lclosure_epilogue .Lretlonglong: ldr r0, [sp] ldr r1, [sp, #4] b .Lclosure_epilogue #if !defined(__SOFTFP__) && !defined(__ARM_EABI__) .Lretfloat: ldfs f0, [sp] b .Lclosure_epilogue .Lretdouble: ldfd f0, [sp] b .Lclosure_epilogue .Lretlongdouble: ldfd f0, [sp] b .Lclosure_epilogue #endif .ffi_closure_SYSV_end: UNWIND .fnend #ifdef __ELF__ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) #endif /* Below are VFP hard-float ABI call and closure implementations. Add VFP FPU directive here. This is only compiled into the library under EABI. */ #ifdef __ARM_EABI__ .fpu vfp @ r0: fn @ r1: &ecif @ r2: cif->bytes @ r3: fig->flags @ sp+0: ecif.rvalue ARM_FUNC_START ffi_call_VFP @ Save registers stmfd sp!, {r0-r3, fp, lr} UNWIND .save {r0-r3, fp, lr} mov fp, sp UNWIND .setfp fp, sp @ Make room for all of the new args. sub sp, sp, r2 @ Make room for loading VFP args sub sp, sp, #64 @ Place all of the ffi_prep_args in position mov r0, sp @ r1 already set sub r2, fp, #64 @ VFP scratch space @ Call ffi_prep_args(stack, &ecif, vfp_space) bl CNAME(ffi_prep_args) @ Load VFP register args if needed cmp r0, #0 beq LSYM(Lbase_args) @ Load only d0 if possible cmp r0, #3 sub ip, fp, #64 flddle d0, [ip] fldmiadgt ip, {d0-d7} LSYM(Lbase_args): @ move first 4 parameters in registers ldmia sp, {r0-r3} @ and adjust stack sub lr, ip, sp @ cif->bytes == (fp - 64) - sp ldr ip, [fp] @ load fn() in advance cmp lr, #16 movhs lr, #16 add sp, sp, lr @ call (fn) (...) call_reg(ip) @ Remove the space we pushed for the args mov sp, fp @ Load r2 with the pointer to storage for @ the return value ldr r2, [sp, #24] @ Load r3 with the return type code ldr r3, [sp, #12] @ If the return value pointer is NULL, @ assume no return value. cmp r2, #0 beq LSYM(Lepilogue_vfp) cmp r3, #FFI_TYPE_INT streq r0, [r2] beq LSYM(Lepilogue_vfp) cmp r3, #FFI_TYPE_SINT64 stmeqia r2, {r0, r1} beq LSYM(Lepilogue_vfp) cmp r3, #FFI_TYPE_FLOAT fstseq s0, [r2] beq LSYM(Lepilogue_vfp) cmp r3, #FFI_TYPE_DOUBLE fstdeq d0, [r2] beq LSYM(Lepilogue_vfp) cmp r3, #FFI_TYPE_STRUCT_VFP_FLOAT cmpne r3, #FFI_TYPE_STRUCT_VFP_DOUBLE fstmiadeq r2, {d0-d3} LSYM(Lepilogue_vfp): RETLDM "r0-r3,fp" .ffi_call_VFP_end: UNWIND .fnend .size CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP) ARM_FUNC_START ffi_closure_VFP fstmfdd sp!, {d0-d7} @ r0-r3, then d0-d7 UNWIND .pad #80 add ip, sp, #80 stmfd sp!, {ip, lr} UNWIND .save {r0, lr} add r2, sp, #72 add r3, sp, #8 UNWIND .pad #72 sub sp, sp, #72 str sp, [sp, #64] add r1, sp, #64 bl CNAME(ffi_closure_SYSV_inner) cmp r0, #FFI_TYPE_INT beq .Lretint_vfp cmp r0, #FFI_TYPE_FLOAT beq .Lretfloat_vfp cmp r0, #FFI_TYPE_DOUBLE cmpne r0, #FFI_TYPE_LONGDOUBLE beq .Lretdouble_vfp cmp r0, #FFI_TYPE_SINT64 beq .Lretlonglong_vfp cmp r0, #FFI_TYPE_STRUCT_VFP_FLOAT beq .Lretfloat_struct_vfp cmp r0, #FFI_TYPE_STRUCT_VFP_DOUBLE beq .Lretdouble_struct_vfp .Lclosure_epilogue_vfp: add sp, sp, #72 ldmfd sp, {sp, pc} .Lretfloat_vfp: flds s0, [sp] b .Lclosure_epilogue_vfp .Lretdouble_vfp: fldd d0, [sp] b .Lclosure_epilogue_vfp .Lretint_vfp: ldr r0, [sp] b .Lclosure_epilogue_vfp .Lretlonglong_vfp: ldmia sp, {r0, r1} b .Lclosure_epilogue_vfp .Lretfloat_struct_vfp: fldmiad sp, {d0-d1} b .Lclosure_epilogue_vfp .Lretdouble_struct_vfp: fldmiad sp, {d0-d3} b .Lclosure_epilogue_vfp .ffi_closure_VFP_end: UNWIND .fnend .size CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP) #endif ENTRY(ffi_arm_trampoline) stmfd sp!, {r0-r3} ldr r0, [pc] ldr pc, [pc] #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",%progbits #endif polyml-5.6/libffi/src/arm/trampoline.S000066400000000000000000004255041265146633400200230ustar00rootroot00000000000000# GENERATED CODE - DO NOT EDIT # This file was generated by src/arm/gentramp.sh # Copyright (c) 2010, Plausible Labs Cooperative, Inc. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # Software''), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED AS IS'', WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # ----------------------------------------------------------------------- .text .align 12 .globl _ffi_closure_trampoline_table_page _ffi_closure_trampoline_table_page: // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] // trampoline // Save to stack stmfd sp!, {r0-r3} // Load the context argument from the config page. // This places the first usable config value at _ffi_closure_trampoline_table-4080 // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc. ldr r0, [pc, #-4092] // Load the jump address from the config page. ldr pc, [pc, #-4092] polyml-5.6/libffi/src/avr32/000077500000000000000000000000001265146633400156715ustar00rootroot00000000000000polyml-5.6/libffi/src/avr32/ffi.c000066400000000000000000000301511265146633400166010ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2011 Anthony Green Copyright (c) 2009 Bradley Smith AVR32 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include #include #include /* #define DEBUG */ extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned int, unsigned int, unsigned int*, unsigned int, void (*fn)(void)); extern void ffi_closure_SYSV (ffi_closure *); unsigned int pass_struct_on_stack(ffi_type *type) { if(type->type != FFI_TYPE_STRUCT) return 0; if(type->alignment < type->size && !(type->size == 4 || type->size == 8) && !(type->size == 8 && type->alignment >= 4)) return 1; if(type->size == 3 || type->size == 5 || type->size == 6 || type->size == 7) return 1; return 0; } /* ffi_prep_args is called by the assembly routine once stack space * has been allocated for the function's arguments * * This is annoyingly complex since we need to keep track of used * registers. */ void ffi_prep_args(char *stack, extended_cif *ecif) { unsigned int i; void **p_argv; ffi_type **p_arg; char *reg_base = stack; char *stack_base = stack + 20; unsigned int stack_offset = 0; unsigned int reg_mask = 0; p_argv = ecif->avalue; /* If cif->flags is struct then we know it's not passed in registers */ if(ecif->cif->flags == FFI_TYPE_STRUCT) { *(void**)reg_base = ecif->rvalue; reg_mask |= 1; } for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) { size_t z = (*p_arg)->size; int alignment = (*p_arg)->alignment; int type = (*p_arg)->type; char *addr = 0; if(z % 4 != 0) z += (4 - z % 4); if(reg_mask != 0x1f) { if(pass_struct_on_stack(*p_arg)) { addr = stack_base + stack_offset; stack_offset += z; } else if(z == sizeof(int)) { char index = 0; while((reg_mask >> index) & 1) index++; addr = reg_base + (index * 4); reg_mask |= (1 << index); } else if(z == 2 * sizeof(int)) { if(!((reg_mask >> 1) & 1)) { addr = reg_base + 4; reg_mask |= (3 << 1); } else if(!((reg_mask >> 3) & 1)) { addr = reg_base + 12; reg_mask |= (3 << 3); } } } if(!addr) { addr = stack_base + stack_offset; stack_offset += z; } if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL) type = (*p_arg)->elements[0]->type; switch(type) { case FFI_TYPE_UINT8: *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv); break; case FFI_TYPE_SINT8: *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv); break; case FFI_TYPE_SINT16: *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv); break; default: memcpy(addr, *p_argv, z); } p_argv++; } #ifdef DEBUG /* Debugging */ for(i = 0; i < 5; i++) { if((reg_mask & (1 << i)) == 0) printf("r%d: (unused)\n", 12 - i); else printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]); } for(i = 0; i < stack_offset / 4; i++) { printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]); } #endif } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* Round the stack up to a multiple of 8 bytes. This isn't needed * everywhere, but it is on some platforms, and it doesn't harm * anything when it isn't needed. */ cif->bytes = (cif->bytes + 7) & ~7; /* Flag to indicate that he return value is in fact a struct */ cif->rstruct_flag = 0; /* Set the return type flag */ switch(cif->rtype->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: cif->flags = (unsigned)FFI_TYPE_UINT8; break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: cif->flags = (unsigned)FFI_TYPE_UINT16; break; case FFI_TYPE_FLOAT: case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_POINTER: cif->flags = (unsigned)FFI_TYPE_UINT32; break; case FFI_TYPE_DOUBLE: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = (unsigned)FFI_TYPE_UINT64; break; case FFI_TYPE_STRUCT: cif->rstruct_flag = 1; if(!pass_struct_on_stack(cif->rtype)) { if(cif->rtype->size <= 1) cif->flags = (unsigned)FFI_TYPE_UINT8; else if(cif->rtype->size <= 2) cif->flags = (unsigned)FFI_TYPE_UINT16; else if(cif->rtype->size <= 4) cif->flags = (unsigned)FFI_TYPE_UINT32; else if(cif->rtype->size <= 8) cif->flags = (unsigned)FFI_TYPE_UINT64; else cif->flags = (unsigned)cif->rtype->type; } else cif->flags = (unsigned)cif->rtype->type; break; default: cif->flags = (unsigned)cif->rtype->type; break; } return FFI_OK; } void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; unsigned int size = 0, i = 0; ffi_type **p_arg; ecif.cif = cif; ecif.avalue = avalue; for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) size += (*p_arg)->size + (4 - (*p_arg)->size % 4); /* If the return value is a struct and we don't have a return value * address then we need to make one */ /* If cif->flags is struct then it's not suitable for registers */ if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT)) ecif.rvalue = alloca(cif->rtype->size); else ecif.rvalue = rvalue; switch(cif->abi) { case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags, ecif.rvalue, cif->rstruct_flag, fn); break; default: FFI_ASSERT(0); break; } } static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ffi_cif *cif) { register unsigned int i, reg_mask = 0; register void **p_argv; register ffi_type **p_arg; register char *reg_base = stack; register char *stack_base = stack + 20; register unsigned int stack_offset = 0; #ifdef DEBUG /* Debugging */ for(i = 0; i < cif->nargs + 7; i++) { printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]); } #endif /* If cif->flags is struct then we know it's not passed in registers */ if(cif->flags == FFI_TYPE_STRUCT) { *rvalue = *(void **)reg_base; reg_mask |= 1; } p_argv = avalue; for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) { size_t z = (*p_arg)->size; int alignment = (*p_arg)->alignment; *p_argv = 0; if(z % 4 != 0) z += (4 - z % 4); if(reg_mask != 0x1f) { if(pass_struct_on_stack(*p_arg)) { *p_argv = (void*)stack_base + stack_offset; stack_offset += z; } else if(z <= sizeof(int)) { char index = 0; while((reg_mask >> index) & 1) index++; *p_argv = (void*)reg_base + (index * 4); reg_mask |= (1 << index); } else if(z == 2 * sizeof(int)) { if(!((reg_mask >> 1) & 1)) { *p_argv = (void*)reg_base + 4; reg_mask |= (3 << 1); } else if(!((reg_mask >> 3) & 1)) { *p_argv = (void*)reg_base + 12; reg_mask |= (3 << 3); } } } if(!*p_argv) { *p_argv = (void*)stack_base + stack_offset; stack_offset += z; } if((*p_arg)->type != FFI_TYPE_STRUCT || (*p_arg)->elements[1] == NULL) { if(alignment == 1) **(unsigned int**)p_argv <<= 24; else if(alignment == 2) **(unsigned int**)p_argv <<= 16; } p_argv++; } #ifdef DEBUG /* Debugging */ for(i = 0; i < cif->nargs; i++) { printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i])); } #endif } /* This function is jumped to by the trampoline */ unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp, void *args) { ffi_cif *cif; void **arg_area; unsigned int i, size = 0; ffi_type **p_arg; cif = closure->cif; for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++) size += (*p_arg)->size + (4 - (*p_arg)->size % 4); arg_area = (void **)alloca(size); /* this call will initialize ARG_AREA, such that each element in that * array points to the corresponding value on the stack; and if the * function returns a structure, it will re-set RESP to point to the * structure return address. */ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); (closure->fun)(cif, *respp, arg_area, closure->user_data); return cif->flags; } ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]); unsigned int __fun = (unsigned int)(&ffi_closure_SYSV); unsigned int __ctx = (unsigned int)(codeloc); unsigned int __rstruct_flag = (unsigned int)(cif->rstruct_flag); unsigned int __inner = (unsigned int)(&ffi_closure_SYSV_inner); *(unsigned int*) &__tramp[0] = 0xebcd1f00; /* pushm r8-r12 */ *(unsigned int*) &__tramp[4] = 0xfefc0010; /* ld.w r12, pc[16] */ *(unsigned int*) &__tramp[8] = 0xfefb0010; /* ld.w r11, pc[16] */ *(unsigned int*) &__tramp[12] = 0xfefa0010; /* ld.w r10, pc[16] */ *(unsigned int*) &__tramp[16] = 0xfeff0010; /* ld.w pc, pc[16] */ *(unsigned int*) &__tramp[20] = __ctx; *(unsigned int*) &__tramp[24] = __rstruct_flag; *(unsigned int*) &__tramp[28] = __inner; *(unsigned int*) &__tramp[32] = __fun; syscall(__NR_cacheflush, 0, (&__tramp[0]), 36); closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } polyml-5.6/libffi/src/avr32/ffitarget.h000066400000000000000000000036571265146633400200300ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 2009 Bradley Smith Target configuration macros for AVR32. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif #define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag /* Definitions for closures */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 36 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/avr32/sysv.S000066400000000000000000000113501265146633400170210ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2009 Bradley Smith AVR32 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include /* r12: ffi_prep_args * r11: &ecif * r10: size * r9: cif->flags * r8: ecif.rvalue * sp+0: cif->rstruct_flag * sp+4: fn */ .text .align 1 .globl ffi_call_SYSV .type ffi_call_SYSV, @function ffi_call_SYSV: stm --sp, r0,r1,lr stm --sp, r8-r12 mov r0, sp /* Make room for all of the new args. */ sub sp, r10 /* Pad to make way for potential skipped registers */ sub sp, 20 /* Call ffi_prep_args(stack, &ecif). */ /* r11 already set */ mov r1, r12 mov r12, sp icall r1 /* Save new argument size */ mov r1, r12 /* Move first 5 parameters in registers. */ ldm sp++, r8-r12 /* call (fn) (...). */ ld.w r1, r0[36] icall r1 /* Remove the space we pushed for the args. */ mov sp, r0 /* Load r1 with the rstruct flag. */ ld.w r1, sp[32] /* Load r9 with the return type code. */ ld.w r9, sp[12] /* Load r8 with the return value pointer. */ ld.w r8, sp[16] /* If the return value pointer is NULL, assume no return value. */ cp.w r8, 0 breq .Lend /* Check if return type is actually a struct */ cp.w r1, 0 breq 1f /* Return 8bit */ cp.w r9, FFI_TYPE_UINT8 breq .Lstore8 /* Return 16bit */ cp.w r9, FFI_TYPE_UINT16 breq .Lstore16 1: /* Return 32bit */ cp.w r9, FFI_TYPE_UINT32 breq .Lstore32 cp.w r9, FFI_TYPE_UINT16 breq .Lstore32 cp.w r9, FFI_TYPE_UINT8 breq .Lstore32 /* Return 64bit */ cp.w r9, FFI_TYPE_UINT64 breq .Lstore64 /* Didn't match anything */ bral .Lend .Lstore64: st.w r8[0], r11 st.w r8[4], r10 bral .Lend .Lstore32: st.w r8[0], r12 bral .Lend .Lstore16: st.h r8[0], r12 bral .Lend .Lstore8: st.b r8[0], r12 bral .Lend .Lend: sub sp, -20 ldm sp++, r0,r1,pc .size ffi_call_SYSV, . - ffi_call_SYSV /* r12: __ctx * r11: __rstruct_flag * r10: __inner */ .align 1 .globl ffi_closure_SYSV .type ffi_closure_SYSV, @function ffi_closure_SYSV: stm --sp, r0,lr mov r0, r11 mov r8, r10 sub r10, sp, -8 sub sp, 12 st.w sp[8], sp sub r11, sp, -8 icall r8 /* Check if return type is actually a struct */ cp.w r0, 0 breq 1f /* Return 8bit */ cp.w r12, FFI_TYPE_UINT8 breq .Lget8 /* Return 16bit */ cp.w r12, FFI_TYPE_UINT16 breq .Lget16 1: /* Return 32bit */ cp.w r12, FFI_TYPE_UINT32 breq .Lget32 cp.w r12, FFI_TYPE_UINT16 breq .Lget32 cp.w r12, FFI_TYPE_UINT8 breq .Lget32 /* Return 64bit */ cp.w r12, FFI_TYPE_UINT64 breq .Lget64 /* Didn't match anything */ bral .Lclend .Lget64: ld.w r11, sp[0] ld.w r10, sp[4] bral .Lclend .Lget32: ld.w r12, sp[0] bral .Lclend .Lget16: ld.uh r12, sp[0] bral .Lclend .Lget8: ld.ub r12, sp[0] bral .Lclend .Lclend: sub sp, -12 ldm sp++, r0,lr sub sp, -20 mov pc, lr .size ffi_closure_SYSV, . - ffi_closure_SYSV #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/bfin/000077500000000000000000000000001265146633400156525ustar00rootroot00000000000000polyml-5.6/libffi/src/bfin/ffi.c000066400000000000000000000143141265146633400165650ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca Blackfin Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include /* Maximum number of GPRs available for argument passing. */ #define MAX_GPRARGS 3 /* * Return types */ #define FFIBFIN_RET_VOID 0 #define FFIBFIN_RET_BYTE 1 #define FFIBFIN_RET_HALFWORD 2 #define FFIBFIN_RET_INT64 3 #define FFIBFIN_RET_INT32 4 /*====================================================================*/ /* PROTOTYPE * /*====================================================================*/ void ffi_prep_args(unsigned char *, extended_cif *); /*====================================================================*/ /* Externals */ /* (Assembly) */ /*====================================================================*/ extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); /*====================================================================*/ /* Implementation */ /* */ /*====================================================================*/ /* * This function calculates the return type (size) based on type. */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* --------------------------------------* * Return handling * * --------------------------------------*/ switch (cif->rtype->type) { case FFI_TYPE_VOID: cif->flags = FFIBFIN_RET_VOID; break; case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: cif->flags = FFIBFIN_RET_HALFWORD; break; case FFI_TYPE_UINT8: cif->flags = FFIBFIN_RET_BYTE; break; case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_FLOAT: case FFI_TYPE_POINTER: case FFI_TYPE_SINT8: cif->flags = FFIBFIN_RET_INT32; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_DOUBLE: cif->flags = FFIBFIN_RET_INT64; break; case FFI_TYPE_STRUCT: if (cif->rtype->size <= 4){ cif->flags = FFIBFIN_RET_INT32; }else if (cif->rtype->size == 8){ cif->flags = FFIBFIN_RET_INT64; }else{ //it will return via a hidden pointer in P0 cif->flags = FFIBFIN_RET_VOID; } break; default: FFI_ASSERT(0); break; } return FFI_OK; } /* * This will prepare the arguments and will call the assembly routine * cif = the call interface * fn = the function to be called * rvalue = the return value * avalue = the arguments */ void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) { int ret_type = cif->flags; extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } } /* * This function prepares the parameters (copies them from the ecif to the stack) * to call the function (ffi_prep_args is called by the assembly routine in file * sysv.S, which also calls the actual function) */ void ffi_prep_args(unsigned char *stack, extended_cif *ecif) { register unsigned int i = 0; void **p_argv; unsigned char *argp; ffi_type **p_arg; argp = stack; p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++) { size_t z; z = (*p_arg)->size; if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: { signed char v = *(SINT8 *)(* p_argv); signed int t = v; *(signed int *) argp = t; } break; case FFI_TYPE_UINT8: { unsigned char v = *(UINT8 *)(* p_argv); unsigned int t = v; *(unsigned int *) argp = t; } break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); break; case FFI_TYPE_STRUCT: memcpy(argp, *p_argv, (*p_arg)->size); break; default: FFI_ASSERT(0); break; } } else if (z == sizeof(int)) { *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); } else { memcpy(argp, *p_argv, z); } p_argv++; argp += z; } } polyml-5.6/libffi/src/bfin/ffitarget.h000066400000000000000000000031601265146633400177760ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca Blackfin Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif #endif polyml-5.6/libffi/src/bfin/sysv.S000066400000000000000000000101421265146633400170000ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca Blackfin Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .text .align 4 /* There is a "feature" in the bfin toolchain that it puts a _ before funcion names that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV */ .global _ffi_call_SYSV; .type _ffi_call_SYSV, STT_FUNC; .func ffi_call_SYSV /* cif->bytes = R0 (fp+8) &ecif = R1 (fp+12) ffi_prep_args = R2 (fp+16) ret_type = stack (fp+20) ecif.rvalue = stack (fp+24) fn = stack (fp+28) got (fp+32) There is room for improvement here (we can use temporary registers instead of saving the values in the memory) REGS: P5 => Stack pointer (function arguments) R5 => cif->bytes R4 => ret->type FP-20 = P3 FP-16 = SP (parameters area) FP-12 = SP (temp) FP-08 = function return part 1 [R0] FP-04 = function return part 2 [R1] */ _ffi_call_SYSV: .prologue: LINK 20; [FP-20] = P3; [FP+8] = R0; [FP+12] = R1; [FP+16] = R2; .allocate_stack: //alocate cif->bytes into the stack R1 = [FP+8]; R0 = SP; R0 = R0 - R1; R1 = 4; R0 = R0 - R1; [FP-12] = SP; SP = R0; [FP-16] = SP; .call_prep_args: //get the addr of prep_args P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; P1 = [P0]; P3 = [P0+4]; R0 = [FP-16];//SP (parameter area) R1 = [FP+12];//ecif call (P1); .call_user_function: //ajust SP so as to allow the user function access the parameters on the stack SP = [FP-16]; //point to function parameters R0 = [SP]; R1 = [SP+4]; R2 = [SP+8]; //load user function address P0 = FP; P0 +=28; P1 = [P0]; P1 = [P1]; P3 = [P0+4]; /* For functions returning aggregate values (struct) occupying more than 8 bytes, the caller allocates the return value object on the stack and the address of this object is passed to the callee as a hidden argument in register P0. */ P0 = [FP+24]; call (P1); SP = [FP-12]; .compute_return: P2 = [FP-20]; [FP-8] = R0; [FP-4] = R1; R0 = [FP+20]; R1 = R0 << 2; R0 = [P2+.rettable@GOT17M4]; R0 = R1 + R0; P2 = R0; R1 = [P2]; P2 = [FP+-20]; R0 = [P2+.rettable@GOT17M4]; R0 = R1 + R0; P2 = R0; R0 = [FP-8]; R1 = [FP-4]; jump (P2); /* #define FFIBFIN_RET_VOID 0 #define FFIBFIN_RET_BYTE 1 #define FFIBFIN_RET_HALFWORD 2 #define FFIBFIN_RET_INT64 3 #define FFIBFIN_RET_INT32 4 */ .align 4 .align 4 .rettable: .dd .epilogue - .rettable .dd .rbyte - .rettable; .dd .rhalfword - .rettable; .dd .rint64 - .rettable; .dd .rint32 - .rettable; .rbyte: P0 = [FP+24]; R0 = R0.B (Z); [P0] = R0; JUMP .epilogue .rhalfword: P0 = [FP+24]; R0 = R0.L; [P0] = R0; JUMP .epilogue .rint64: P0 = [FP+24];// &rvalue [P0] = R0; [P0+4] = R1; JUMP .epilogue .rint32: P0 = [FP+24]; [P0] = R0; .epilogue: R0 = [FP+8]; R1 = [FP+12]; R2 = [FP+16]; P3 = [FP-20]; UNLINK; RTS; .size _ffi_call_SYSV,.-_ffi_call_SYSV; .endfunc polyml-5.6/libffi/src/closures.c000066400000000000000000000423411265146633400167430ustar00rootroot00000000000000/* ----------------------------------------------------------------------- closures.c - Copyright (c) 2007, 2009, 2010 Red Hat, Inc. Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc Copyright (c) 2011 Plausible Labs Cooperative, Inc. Code to allocate and deallocate memory for closures. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #if defined __linux__ && !defined _GNU_SOURCE #define _GNU_SOURCE 1 #endif #include #include #if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE # if __gnu_linux__ /* This macro indicates it may be forbidden to map anonymous memory with both write and execute permission. Code compiled when this option is defined will attempt to map such pages once, but if it fails, it falls back to creating a temporary file in a writable and executable filesystem and mapping pages from it into separate locations in the virtual memory space, one location writable and another executable. */ # define FFI_MMAP_EXEC_WRIT 1 # define HAVE_MNTENT 1 # endif # if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__) /* Windows systems may have Data Execution Protection (DEP) enabled, which requires the use of VirtualMalloc/VirtualFree to alloc/free executable memory. */ # define FFI_MMAP_EXEC_WRIT 1 # endif #endif #if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX # ifdef __linux__ /* When defined to 1 check for SELinux and if SELinux is active, don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that might cause audit messages. */ # define FFI_MMAP_EXEC_SELINUX 1 # endif #endif #if FFI_CLOSURES # if FFI_EXEC_TRAMPOLINE_TABLE // Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. # elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ #define USE_LOCKS 1 #define USE_DL_PREFIX 1 #ifdef __GNUC__ #ifndef USE_BUILTIN_FFS #define USE_BUILTIN_FFS 1 #endif #endif /* We need to use mmap, not sbrk. */ #define HAVE_MORECORE 0 /* We could, in theory, support mremap, but it wouldn't buy us anything. */ #define HAVE_MREMAP 0 /* We have no use for this, so save some code and data. */ #define NO_MALLINFO 1 /* We need all allocations to be in regular segments, otherwise we lose track of the corresponding code address. */ #define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T /* Don't allocate more than a page unless needed. */ #define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) #if FFI_CLOSURE_TEST /* Don't release single pages, to avoid a worst-case scenario of continuously allocating and releasing single pages, but release pairs of pages, which should do just as well given that allocations are likely to be small. */ #define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize) #endif #include #include #include #include #ifndef _MSC_VER #include #endif #include #include #if !defined(X86_WIN32) && !defined(X86_WIN64) #ifdef HAVE_MNTENT #include #endif /* HAVE_MNTENT */ #include #include /* We don't want sys/mman.h to be included after we redefine mmap and dlmunmap. */ #include #define LACKS_SYS_MMAN_H 1 #if FFI_MMAP_EXEC_SELINUX #include #include static int selinux_enabled = -1; static int selinux_enabled_check (void) { struct statfs sfs; FILE *f; char *buf = NULL; size_t len = 0; if (statfs ("/selinux", &sfs) >= 0 && (unsigned int) sfs.f_type == 0xf97cff8cU) return 1; f = fopen ("/proc/mounts", "r"); if (f == NULL) return 0; while (getline (&buf, &len, f) >= 0) { char *p = strchr (buf, ' '); if (p == NULL) break; p = strchr (p + 1, ' '); if (p == NULL) break; if (strncmp (p + 1, "selinuxfs ", 10) == 0) { free (buf); fclose (f); return 1; } } free (buf); fclose (f); return 0; } #define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ : (selinux_enabled = selinux_enabled_check ())) #else #define is_selinux_enabled() 0 #endif /* !FFI_MMAP_EXEC_SELINUX */ /* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX #include static int emutramp_enabled = -1; static int emutramp_enabled_check (void) { if (getenv ("FFI_DISABLE_EMUTRAMP") == NULL) return 1; else return 0; } #define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ : (emutramp_enabled = emutramp_enabled_check ())) #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ #elif defined (__CYGWIN__) || defined(__INTERIX) #include /* Cygwin is Linux-like, but not quite that Linux-like. */ #define is_selinux_enabled() 0 #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ #ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX #define is_emutramp_enabled() 0 #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ /* Declare all functions defined in dlmalloc.c as static. */ static void *dlmalloc(size_t); static void dlfree(void*); static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; static void *dlrealloc(void *, size_t) MAYBE_UNUSED; static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; static void *dlvalloc(size_t) MAYBE_UNUSED; static int dlmallopt(int, int) MAYBE_UNUSED; static size_t dlmalloc_footprint(void) MAYBE_UNUSED; static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; static void *dlpvalloc(size_t) MAYBE_UNUSED; static int dlmalloc_trim(size_t) MAYBE_UNUSED; static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; static void dlmalloc_stats(void) MAYBE_UNUSED; #if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) /* Use these for mmap and munmap within dlmalloc.c. */ static void *dlmmap(void *, size_t, int, int, int, off_t); static int dlmunmap(void *, size_t); #endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ #define mmap dlmmap #define munmap dlmunmap #include "dlmalloc.c" #undef mmap #undef munmap #if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) /* A mutex used to synchronize access to *exec* variables in this file. */ static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; /* A file descriptor of a temporary file from which we'll map executable pages. */ static int execfd = -1; /* The amount of space already allocated from the temporary file. */ static size_t execsize = 0; /* Open a temporary file name, and immediately unlink it. */ static int open_temp_exec_file_name (char *name) { int fd = mkstemp (name); if (fd != -1) unlink (name); return fd; } /* Open a temporary file in the named directory. */ static int open_temp_exec_file_dir (const char *dir) { static const char suffix[] = "/ffiXXXXXX"; int lendir = strlen (dir); char *tempname = __builtin_alloca (lendir + sizeof (suffix)); if (!tempname) return -1; memcpy (tempname, dir, lendir); memcpy (tempname + lendir, suffix, sizeof (suffix)); return open_temp_exec_file_name (tempname); } /* Open a temporary file in the directory in the named environment variable. */ static int open_temp_exec_file_env (const char *envvar) { const char *value = getenv (envvar); if (!value) return -1; return open_temp_exec_file_dir (value); } #ifdef HAVE_MNTENT /* Open a temporary file in an executable and writable mount point listed in the mounts file. Subsequent calls with the same mounts keep searching for mount points in the same file. Providing NULL as the mounts file closes the file. */ static int open_temp_exec_file_mnt (const char *mounts) { static const char *last_mounts; static FILE *last_mntent; if (mounts != last_mounts) { if (last_mntent) endmntent (last_mntent); last_mounts = mounts; if (mounts) last_mntent = setmntent (mounts, "r"); else last_mntent = NULL; } if (!last_mntent) return -1; for (;;) { int fd; struct mntent mnt; char buf[MAXPATHLEN * 3]; if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) return -1; if (hasmntopt (&mnt, "ro") || hasmntopt (&mnt, "noexec") || access (mnt.mnt_dir, W_OK)) continue; fd = open_temp_exec_file_dir (mnt.mnt_dir); if (fd != -1) return fd; } } #endif /* HAVE_MNTENT */ /* Instructions to look for a location to hold a temporary file that can be mapped in for execution. */ static struct { int (*func)(const char *); const char *arg; int repeat; } open_temp_exec_file_opts[] = { { open_temp_exec_file_env, "TMPDIR", 0 }, { open_temp_exec_file_dir, "/tmp", 0 }, { open_temp_exec_file_dir, "/var/tmp", 0 }, { open_temp_exec_file_dir, "/dev/shm", 0 }, { open_temp_exec_file_env, "HOME", 0 }, #ifdef HAVE_MNTENT { open_temp_exec_file_mnt, "/etc/mtab", 1 }, { open_temp_exec_file_mnt, "/proc/mounts", 1 }, #endif /* HAVE_MNTENT */ }; /* Current index into open_temp_exec_file_opts. */ static int open_temp_exec_file_opts_idx = 0; /* Reset a current multi-call func, then advances to the next entry. If we're at the last, go back to the first and return nonzero, otherwise return zero. */ static int open_temp_exec_file_opts_next (void) { if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); open_temp_exec_file_opts_idx++; if (open_temp_exec_file_opts_idx == (sizeof (open_temp_exec_file_opts) / sizeof (*open_temp_exec_file_opts))) { open_temp_exec_file_opts_idx = 0; return 1; } return 0; } /* Return a file descriptor of a temporary zero-sized file in a writable and exexutable filesystem. */ static int open_temp_exec_file (void) { int fd; do { fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat || fd == -1) { if (open_temp_exec_file_opts_next ()) break; } } while (fd == -1); return fd; } /* Map in a chunk of memory from the temporary exec file into separate locations in the virtual memory address space, one writable and one executable. Returns the address of the writable portion, after storing an offset to the corresponding executable portion at the last word of the requested chunk. */ static void * dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) { void *ptr; if (execfd == -1) { open_temp_exec_file_opts_idx = 0; retry_open: execfd = open_temp_exec_file (); if (execfd == -1) return MFAIL; } offset = execsize; if (ftruncate (execfd, offset + length)) return MFAIL; flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); flags |= MAP_SHARED; ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, flags, execfd, offset); if (ptr == MFAIL) { if (!offset) { close (execfd); goto retry_open; } ftruncate (execfd, offset); return MFAIL; } else if (!offset && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) open_temp_exec_file_opts_next (); start = mmap (start, length, prot, flags, execfd, offset); if (start == MFAIL) { munmap (ptr, length); ftruncate (execfd, offset); return start; } mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; execsize += length; return start; } /* Map in a writable and executable chunk of memory if possible. Failing that, fall back to dlmmap_locked. */ static void * dlmmap (void *start, size_t length, int prot, int flags, int fd, off_t offset) { void *ptr; assert (start == NULL && length % malloc_getpagesize == 0 && prot == (PROT_READ | PROT_WRITE) && flags == (MAP_PRIVATE | MAP_ANONYMOUS) && fd == -1 && offset == 0); #if FFI_CLOSURE_TEST printf ("mapping in %zi\n", length); #endif if (execfd == -1 && is_emutramp_enabled ()) { ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); return ptr; } if (execfd == -1 && !is_selinux_enabled ()) { ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) /* Cool, no need to mess with separate segments. */ return ptr; /* If MREMAP_DUP is ever introduced and implemented, try mmap with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with MREMAP_DUP and prot at this point. */ } if (execsize == 0 || execfd == -1) { pthread_mutex_lock (&open_temp_exec_file_mutex); ptr = dlmmap_locked (start, length, prot, flags, offset); pthread_mutex_unlock (&open_temp_exec_file_mutex); return ptr; } return dlmmap_locked (start, length, prot, flags, offset); } /* Release memory at the given address, as well as the corresponding executable page if it's separate. */ static int dlmunmap (void *start, size_t length) { /* We don't bother decreasing execsize or truncating the file, since we can't quite tell whether we're unmapping the end of the file. We don't expect frequent deallocation anyway. If we did, we could locate pages in the file by writing to the pages being deallocated and checking that the file contents change. Yuck. */ msegmentptr seg = segment_holding (gm, start); void *code; #if FFI_CLOSURE_TEST printf ("unmapping %zi\n", length); #endif if (seg && (code = add_segment_exec_offset (start, seg)) != start) { int ret = munmap (code, length); if (ret) return ret; } return munmap (start, length); } #if FFI_CLOSURE_FREE_CODE /* Return segment holding given code address. */ static msegmentptr segment_holding_code (mstate m, char* addr) { msegmentptr sp = &m->seg; for (;;) { if (addr >= add_segment_exec_offset (sp->base, sp) && addr < add_segment_exec_offset (sp->base, sp) + sp->size) return sp; if ((sp = sp->next) == 0) return 0; } } #endif #endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ /* Allocate a chunk of memory with the given size. Returns a pointer to the writable address, and sets *CODE to the executable corresponding virtual address. */ void * ffi_closure_alloc (size_t size, void **code) { void *ptr; if (!code) return NULL; ptr = dlmalloc (size); if (ptr) { msegmentptr seg = segment_holding (gm, ptr); *code = add_segment_exec_offset (ptr, seg); } return ptr; } /* Release a chunk of memory allocated with ffi_closure_alloc. If FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the writable or the executable address given. Otherwise, only the writable address can be provided here. */ void ffi_closure_free (void *ptr) { #if FFI_CLOSURE_FREE_CODE msegmentptr seg = segment_holding_code (gm, ptr); if (seg) ptr = sub_segment_exec_offset (ptr, seg); #endif dlfree (ptr); } #if FFI_CLOSURE_TEST /* Do some internal sanity testing to make sure allocation and deallocation of pages are working as intended. */ int main () { void *p[3]; #define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0) #define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0) GET (0, malloc_getpagesize / 2); GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*)); PUT (1); GET (1, 2 * malloc_getpagesize); GET (2, malloc_getpagesize / 2); PUT (1); PUT (0); PUT (2); return 0; } #endif /* FFI_CLOSURE_TEST */ # else /* ! FFI_MMAP_EXEC_WRIT */ /* On many systems, memory returned by malloc is writable and executable, so just use it. */ #include void * ffi_closure_alloc (size_t size, void **code) { if (!code) return NULL; return *code = malloc (size); } void ffi_closure_free (void *ptr) { free (ptr); } # endif /* ! FFI_MMAP_EXEC_WRIT */ #endif /* FFI_CLOSURES */ polyml-5.6/libffi/src/cris/000077500000000000000000000000001265146633400156745ustar00rootroot00000000000000polyml-5.6/libffi/src/cris/ffi.c000066400000000000000000000231471265146633400166130ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 1998 Cygnus Solutions Copyright (c) 2004 Simon Posnjak Copyright (c) 2005 Axis Communications AB Copyright (C) 2007 Free Software Foundation, Inc. CRIS Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) static ffi_status initialize_aggregate_packed_struct (ffi_type * arg) { ffi_type **ptr; FFI_ASSERT (arg != NULL); FFI_ASSERT (arg->elements != NULL); FFI_ASSERT (arg->size == 0); FFI_ASSERT (arg->alignment == 0); ptr = &(arg->elements[0]); while ((*ptr) != NULL) { if (((*ptr)->size == 0) && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) return FFI_BAD_TYPEDEF; FFI_ASSERT (ffi_type_test ((*ptr))); arg->size += (*ptr)->size; arg->alignment = (arg->alignment > (*ptr)->alignment) ? arg->alignment : (*ptr)->alignment; ptr++; } if (arg->size == 0) return FFI_BAD_TYPEDEF; else return FFI_OK; } int ffi_prep_args (char *stack, extended_cif * ecif) { unsigned int i; unsigned int struct_count = 0; void **p_argv; char *argp; ffi_type **p_arg; argp = stack; p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++) { size_t z; switch ((*p_arg)->type) { case FFI_TYPE_STRUCT: { z = (*p_arg)->size; if (z <= 4) { memcpy (argp, *p_argv, z); z = 4; } else if (z <= 8) { memcpy (argp, *p_argv, z); z = 8; } else { unsigned int uiLocOnStack; z = sizeof (void *); uiLocOnStack = 4 * ecif->cif->nargs + struct_count; struct_count = struct_count + (*p_arg)->size; *(unsigned int *) argp = (unsigned int) (UINT32 *) (stack + uiLocOnStack); memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size); } break; } default: z = (*p_arg)->size; if (z < sizeof (int)) { switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv); break; default: FFI_ASSERT (0); } z = sizeof (int); } else if (z == sizeof (int)) *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv); else memcpy (argp, *p_argv, z); break; } p_argv++; argp += z; } return (struct_count); } ffi_status FFI_HIDDEN ffi_prep_cif_core (ffi_cif * cif, ffi_abi abi, unsigned int isvariadic, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type * rtype, ffi_type ** atypes) { unsigned bytes = 0; unsigned int i; ffi_type **ptr; FFI_ASSERT (cif != NULL); FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); FFI_ASSERT(nfixedargs <= ntotalargs); FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); cif->abi = abi; cif->arg_types = atypes; cif->nargs = ntotalargs; cif->rtype = rtype; cif->flags = 0; if ((cif->rtype->size == 0) && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK)) return FFI_BAD_TYPEDEF; FFI_ASSERT_VALID_TYPE (cif->rtype); for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { if (((*ptr)->size == 0) && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK)) return FFI_BAD_TYPEDEF; FFI_ASSERT_VALID_TYPE (*ptr); if (((*ptr)->alignment - 1) & bytes) bytes = ALIGN (bytes, (*ptr)->alignment); if ((*ptr)->type == FFI_TYPE_STRUCT) { if ((*ptr)->size > 8) { bytes += (*ptr)->size; bytes += sizeof (void *); } else { if ((*ptr)->size > 4) bytes += 8; else bytes += 4; } } else bytes += STACK_ARG_SIZE ((*ptr)->size); } cif->bytes = bytes; return ffi_prep_cif_machdep (cif); } ffi_status ffi_prep_cif_machdep (ffi_cif * cif) { switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_STRUCT: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = (unsigned) cif->rtype->type; break; default: cif->flags = FFI_TYPE_INT; break; } return FFI_OK; } extern void ffi_call_SYSV (int (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn) ()) __attribute__ ((__visibility__ ("hidden"))); void ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca (cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT (0); break; } } /* Because the following variables are not exported outside libffi, we mark them hidden. */ /* Assembly code for the jump stub. */ extern const char ffi_cris_trampoline_template[] __attribute__ ((__visibility__ ("hidden"))); /* Offset into ffi_cris_trampoline_template of where to put the ffi_prep_closure_inner function. */ extern const int ffi_cris_trampoline_fn_offset __attribute__ ((__visibility__ ("hidden"))); /* Offset into ffi_cris_trampoline_template of where to put the closure data. */ extern const int ffi_cris_trampoline_closure_offset __attribute__ ((__visibility__ ("hidden"))); /* This function is sibling-called (jumped to) by the closure trampoline. We get R10..R13 at PARAMS[0..3] and a copy of [SP] at PARAMS[4] to simplify handling of a straddling parameter. A copy of R9 is at PARAMS[5] and SP at PARAMS[6]. These parameters are put at the appropriate place in CLOSURE which is then executed and the return value is passed back to the caller. */ static unsigned long long ffi_prep_closure_inner (void **params, ffi_closure* closure) { char *register_args = (char *) params; void *struct_ret = params[5]; char *stack_args = params[6]; char *ptr = register_args; ffi_cif *cif = closure->cif; ffi_type **arg_types = cif->arg_types; /* Max room needed is number of arguments as 64-bit values. */ void **avalue = alloca (closure->cif->nargs * sizeof(void *)); int i; int doing_regs; long long llret = 0; /* Find the address of each argument. */ for (i = 0, doing_regs = 1; i < cif->nargs; i++) { /* Types up to and including 8 bytes go by-value. */ if (arg_types[i]->size <= 4) { avalue[i] = ptr; ptr += 4; } else if (arg_types[i]->size <= 8) { avalue[i] = ptr; ptr += 8; } else { FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT); /* Passed by-reference, so copy the pointer. */ avalue[i] = *(void **) ptr; ptr += 4; } /* If we've handled more arguments than fit in registers, start looking at the those passed on the stack. Step over the first one if we had a straddling parameter. */ if (doing_regs && ptr >= register_args + 4*4) { ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0); doing_regs = 0; } } /* Invoke the closure. */ (closure->fun) (cif, cif->rtype->type == FFI_TYPE_STRUCT /* The caller allocated space for the return structure, and passed a pointer to this space in R9. */ ? struct_ret /* We take advantage of being able to ignore that the high part isn't set if the return value is not in R10:R11, but in R10 only. */ : (void *) &llret, avalue, closure->user_data); return llret; } /* API function: Prepare the trampoline. */ ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif *, void *, void **, void*), void *user_data, void *codeloc) { void *innerfn = ffi_prep_closure_inner; FFI_ASSERT (cif->abi == FFI_SYSV); closure->cif = cif; closure->user_data = user_data; closure->fun = fun; memcpy (closure->tramp, ffi_cris_trampoline_template, FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE); memcpy (closure->tramp + ffi_cris_trampoline_fn_offset, &innerfn, sizeof (void *)); memcpy (closure->tramp + ffi_cris_trampoline_closure_offset, &codeloc, sizeof (void *)); return FFI_OK; } polyml-5.6/libffi/src/cris/ffitarget.h000066400000000000000000000040731265146633400200240ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for CRIS. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36 #define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4) #define FFI_TRAMPOLINE_SIZE \ (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE) #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/cris/sysv.S000066400000000000000000000125471265146633400170350ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2004 Simon Posnjak Copyright (c) 2005 Axis Communications AB CRIS Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #define CONCAT(x,y) x ## y #define XCONCAT(x,y) CONCAT (x, y) #define L(x) XCONCAT (__USER_LABEL_PREFIX__, x) .text ;; OK, when we get called we should have this (according to ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3). ;; ;; R10: ffi_prep_args (func. pointer) ;; R11: &ecif ;; R12: cif->bytes ;; R13: fig->flags ;; sp+0: ecif.rvalue ;; sp+4: fn (function pointer to the function that we need to call) .globl L(ffi_call_SYSV) .type L(ffi_call_SYSV),@function .hidden L(ffi_call_SYSV) L(ffi_call_SYSV): ;; Save the regs to the stack. push $srp ;; Used for stack pointer saving. push $r6 ;; Used for function address pointer. push $r7 ;; Used for stack pointer saving. push $r8 ;; We save fig->flags to stack we will need them after we ;; call The Function. push $r13 ;; Saving current stack pointer. move.d $sp,$r8 move.d $sp,$r6 ;; Move address of ffi_prep_args to r13. move.d $r10,$r13 ;; Make room on the stack for the args of fn. sub.d $r12,$sp ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are: ;; r10 <-- stack pointer ;; r11 <-- &ecif (already there) move.d $sp,$r10 ;; Call the function. jsr $r13 ;; Save the size of the structures which are passed on stack. move.d $r10,$r7 ;; Move first four args in to r10..r13. move.d [$sp+0],$r10 move.d [$sp+4],$r11 move.d [$sp+8],$r12 move.d [$sp+12],$r13 ;; Adjust the stack and check if any parameters are given on stack. addq 16,$sp sub.d $r7,$r6 cmp.d $sp,$r6 bpl go_on nop go_on_no_params_on_stack: move.d $r6,$sp go_on: ;; Discover if we need to put rval address in to r9. move.d [$r8+0],$r7 cmpq FFI_TYPE_STRUCT,$r7 bne call_now nop ;; Move rval address to $r9. move.d [$r8+20],$r9 call_now: ;; Move address of The Function in to r7. move.d [$r8+24],$r7 ;; Call The Function. jsr $r7 ;; Reset stack. move.d $r8,$sp ;; Load rval type (fig->flags) in to r13. pop $r13 ;; Detect rval type. cmpq FFI_TYPE_VOID,$r13 beq epilogue cmpq FFI_TYPE_STRUCT,$r13 beq epilogue cmpq FFI_TYPE_DOUBLE,$r13 beq return_double_or_longlong cmpq FFI_TYPE_UINT64,$r13 beq return_double_or_longlong cmpq FFI_TYPE_SINT64,$r13 beq return_double_or_longlong nop ;; Just return the 32 bit value. ba return nop return_double_or_longlong: ;; Load half of the rval to r10 and the other half to r11. move.d [$sp+16],$r13 move.d $r10,[$r13] addq 4,$r13 move.d $r11,[$r13] ba epilogue nop return: ;; Load the rval to r10. move.d [$sp+16],$r13 move.d $r10,[$r13] epilogue: pop $r8 pop $r7 pop $r6 Jump [$sp+] .size ffi_call_SYSV,.-ffi_call_SYSV /* Save R10..R13 into an array, somewhat like varargs. Copy the next argument too, to simplify handling of any straddling parameter. Save R9 and SP after those. Jump to function handling the rest. Since this is a template, copied and the main function filled in by the user. */ .globl L(ffi_cris_trampoline_template) .type L(ffi_cris_trampoline_template),@function .hidden L(ffi_cris_trampoline_template) L(ffi_cris_trampoline_template): 0: /* The value we get for "PC" is right after the prefix instruction, two bytes from the beginning, i.e. 0b+2. */ move.d $r10,[$pc+2f-(0b+2)] move.d $pc,$r10 1: addq 2f-1b+4,$r10 move.d $r11,[$r10+] move.d $r12,[$r10+] move.d $r13,[$r10+] move.d [$sp],$r11 move.d $r11,[$r10+] move.d $r9,[$r10+] move.d $sp,[$r10+] subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10 move.d 0,$r11 3: jump 0 2: .size ffi_cris_trampoline_template,.-0b /* This macro create a constant usable as "extern const int \name" in C from within libffi, when \name has no prefix decoration. */ .macro const name,value .globl \name .type \name,@object .hidden \name \name: .dword \value .size \name,4 .endm /* Constants for offsets within the trampoline. We could do this with just symbols, avoiding memory contents and memory accesses, but the C usage code would look a bit stranger. */ const L(ffi_cris_trampoline_fn_offset),2b-4-0b const L(ffi_cris_trampoline_closure_offset),3b-4-0b polyml-5.6/libffi/src/debug.c000066400000000000000000000042711265146633400161720ustar00rootroot00000000000000/* ----------------------------------------------------------------------- debug.c - Copyright (c) 1996 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include /* General debugging routines */ void ffi_stop_here(void) { /* This function is only useful for debugging purposes. Place a breakpoint on ffi_stop_here to be notified of significant events. */ } /* This function should only be called via the FFI_ASSERT() macro */ void ffi_assert(char *expr, char *file, int line) { fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); ffi_stop_here(); abort(); } /* Perform a sanity check on an ffi_type structure */ void ffi_type_test(ffi_type *a, char *file, int line) { FFI_ASSERT_AT(a != NULL, file, line); FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT || a->elements != NULL, file, line); } polyml-5.6/libffi/src/dlmalloc.c000066400000000000000000005461651265146633400167100ustar00rootroot00000000000000/* This is a version (aka dlmalloc) of malloc/free/realloc written by Doug Lea and released to the public domain, as explained at http://creativecommons.org/licenses/publicdomain. Send questions, comments, complaints, performance data, etc to dl@cs.oswego.edu * Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) Note: There may be an updated version of this malloc obtainable at ftp://gee.cs.oswego.edu/pub/misc/malloc.c Check before installing! * Quickstart This library is all in one file to simplify the most common usage: ftp it, compile it (-O3), and link it into another program. All of the compile-time options default to reasonable values for use on most platforms. You might later want to step through various compile-time and dynamic tuning options. For convenience, an include file for code using this malloc is at: ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h You don't really need this .h file unless you call functions not defined in your system include files. The .h file contains only the excerpts from this file needed for using this malloc on ANSI C/C++ systems, so long as you haven't changed compile-time options about naming and tuning parameters. If you do, then you can create your own malloc.h that does include all settings by cutting at the point indicated below. Note that you may already by default be using a C library containing a malloc that is based on some version of this malloc (for example in linux). You might still want to use the one in this file to customize settings or to avoid overheads associated with library versions. * Vital statistics: Supported pointer/size_t representation: 4 or 8 bytes size_t MUST be an unsigned type of the same width as pointers. (If you are using an ancient system that declares size_t as a signed type, or need it to be a different width than pointers, you can use a previous release of this malloc (e.g. 2.7.2) supporting these.) Alignment: 8 bytes (default) This suffices for nearly all current machines and C compilers. However, you can define MALLOC_ALIGNMENT to be wider than this if necessary (up to 128bytes), at the expense of using more space. Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) 8 or 16 bytes (if 8byte sizes) Each malloced chunk has a hidden word of overhead holding size and status information, and additional cross-check word if FOOTERS is defined. Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) 8-byte ptrs: 32 bytes (including overhead) Even a request for zero bytes (i.e., malloc(0)) returns a pointer to something of the minimum allocatable size. The maximum overhead wastage (i.e., number of extra bytes allocated than were requested in malloc) is less than or equal to the minimum size, except for requests >= mmap_threshold that are serviced via mmap(), where the worst case wastage is about 32 bytes plus the remainder from a system page (the minimal mmap unit); typically 4096 or 8192 bytes. Security: static-safe; optionally more or less The "security" of malloc refers to the ability of malicious code to accentuate the effects of errors (for example, freeing space that is not currently malloc'ed or overwriting past the ends of chunks) in code that calls malloc. This malloc guarantees not to modify any memory locations below the base of heap, i.e., static variables, even in the presence of usage errors. The routines additionally detect most improper frees and reallocs. All this holds as long as the static bookkeeping for malloc itself is not corrupted by some other means. This is only one aspect of security -- these checks do not, and cannot, detect all possible programming errors. If FOOTERS is defined nonzero, then each allocated chunk carries an additional check word to verify that it was malloced from its space. These check words are the same within each execution of a program using malloc, but differ across executions, so externally crafted fake chunks cannot be freed. This improves security by rejecting frees/reallocs that could corrupt heap memory, in addition to the checks preventing writes to statics that are always on. This may further improve security at the expense of time and space overhead. (Note that FOOTERS may also be worth using with MSPACES.) By default detected errors cause the program to abort (calling "abort()"). You can override this to instead proceed past errors by defining PROCEED_ON_ERROR. In this case, a bad free has no effect, and a malloc that encounters a bad address caused by user overwrites will ignore the bad address by dropping pointers and indices to all known memory. This may be appropriate for programs that should continue if at all possible in the face of programming errors, although they may run out of memory because dropped memory is never reclaimed. If you don't like either of these options, you can define CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything else. And if if you are sure that your program using malloc has no errors or vulnerabilities, you can define INSECURE to 1, which might (or might not) provide a small performance improvement. Thread-safety: NOT thread-safe unless USE_LOCKS defined When USE_LOCKS is defined, each public call to malloc, free, etc is surrounded with either a pthread mutex or a win32 spinlock (depending on WIN32). This is not especially fast, and can be a major bottleneck. It is designed only to provide minimal protection in concurrent environments, and to provide a basis for extensions. If you are using malloc in a concurrent program, consider instead using ptmalloc, which is derived from a version of this malloc. (See http://www.malloc.de). System requirements: Any combination of MORECORE and/or MMAP/MUNMAP This malloc can use unix sbrk or any emulation (invoked using the CALL_MORECORE macro) and/or mmap/munmap or any emulation (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system memory. On most unix systems, it tends to work best if both MORECORE and MMAP are enabled. On Win32, it uses emulations based on VirtualAlloc. It also uses common C library functions like memset. Compliance: I believe it is compliant with the Single Unix Specification (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably others as well. * Overview of algorithms This is not the fastest, most space-conserving, most portable, or most tunable malloc ever written. However it is among the fastest while also being among the most space-conserving, portable and tunable. Consistent balance across these factors results in a good general-purpose allocator for malloc-intensive programs. In most ways, this malloc is a best-fit allocator. Generally, it chooses the best-fitting existing chunk for a request, with ties broken in approximately least-recently-used order. (This strategy normally maintains low fragmentation.) However, for requests less than 256bytes, it deviates from best-fit when there is not an exactly fitting available chunk by preferring to use space adjacent to that used for the previous small request, as well as by breaking ties in approximately most-recently-used order. (These enhance locality of series of small allocations.) And for very large requests (>= 256Kb by default), it relies on system memory mapping facilities, if supported. (This helps avoid carrying around and possibly fragmenting memory used only for large chunks.) All operations (except malloc_stats and mallinfo) have execution times that are bounded by a constant factor of the number of bits in a size_t, not counting any clearing in calloc or copying in realloc, or actions surrounding MORECORE and MMAP that have times proportional to the number of non-contiguous regions returned by system allocation routines, which is often just 1. The implementation is not very modular and seriously overuses macros. Perhaps someday all C compilers will do as good a job inlining modular code as can now be done by brute-force expansion, but now, enough of them seem not to. Some compilers issue a lot of warnings about code that is dead/unreachable only on some platforms, and also about intentional uses of negation on unsigned types. All known cases of each can be ignored. For a longer but out of date high-level description, see http://gee.cs.oswego.edu/dl/html/malloc.html * MSPACES If MSPACES is defined, then in addition to malloc, free, etc., this file also defines mspace_malloc, mspace_free, etc. These are versions of malloc routines that take an "mspace" argument obtained using create_mspace, to control all internal bookkeeping. If ONLY_MSPACES is defined, only these versions are compiled. So if you would like to use this allocator for only some allocations, and your system malloc for others, you can compile with ONLY_MSPACES and then do something like... static mspace mymspace = create_mspace(0,0); // for example #define mymalloc(bytes) mspace_malloc(mymspace, bytes) (Note: If you only need one instance of an mspace, you can instead use "USE_DL_PREFIX" to relabel the global malloc.) You can similarly create thread-local allocators by storing mspaces as thread-locals. For example: static __thread mspace tlms = 0; void* tlmalloc(size_t bytes) { if (tlms == 0) tlms = create_mspace(0, 0); return mspace_malloc(tlms, bytes); } void tlfree(void* mem) { mspace_free(tlms, mem); } Unless FOOTERS is defined, each mspace is completely independent. You cannot allocate from one and free to another (although conformance is only weakly checked, so usage errors are not always caught). If FOOTERS is defined, then each chunk carries around a tag indicating its originating mspace, and frees are directed to their originating spaces. ------------------------- Compile-time options --------------------------- Be careful in setting #define values for numerical constants of type size_t. On some systems, literal values are not automatically extended to size_t precision unless they are explicitly casted. WIN32 default: defined if _WIN32 defined Defining WIN32 sets up defaults for MS environment and compilers. Otherwise defaults are for unix. MALLOC_ALIGNMENT default: (size_t)8 Controls the minimum alignment for malloc'ed chunks. It must be a power of two and at least 8, even on machines for which smaller alignments would suffice. It may be defined as larger than this though. Note however that code and data structures are optimized for the case of 8-byte alignment. MSPACES default: 0 (false) If true, compile in support for independent allocation spaces. This is only supported if HAVE_MMAP is true. ONLY_MSPACES default: 0 (false) If true, only compile in mspace versions, not regular versions. USE_LOCKS default: 0 (false) Causes each call to each public routine to be surrounded with pthread or WIN32 mutex lock/unlock. (If set true, this can be overridden on a per-mspace basis for mspace versions.) FOOTERS default: 0 If true, provide extra checking and dispatching by placing information in the footers of allocated chunks. This adds space and time overhead. INSECURE default: 0 If true, omit checks for usage errors and heap space overwrites. USE_DL_PREFIX default: NOT defined Causes compiler to prefix all public routines with the string 'dl'. This can be useful when you only want to use this malloc in one part of a program, using your regular system malloc elsewhere. ABORT default: defined as abort() Defines how to abort on failed checks. On most systems, a failed check cannot die with an "assert" or even print an informative message, because the underlying print routines in turn call malloc, which will fail again. Generally, the best policy is to simply call abort(). It's not very useful to do more than this because many errors due to overwriting will show up as address faults (null, odd addresses etc) rather than malloc-triggered checks, so will also abort. Also, most compilers know that abort() does not return, so can better optimize code conditionally calling it. PROCEED_ON_ERROR default: defined as 0 (false) Controls whether detected bad addresses cause them to bypassed rather than aborting. If set, detected bad arguments to free and realloc are ignored. And all bookkeeping information is zeroed out upon a detected overwrite of freed heap space, thus losing the ability to ever return it from malloc again, but enabling the application to proceed. If PROCEED_ON_ERROR is defined, the static variable malloc_corruption_error_count is compiled in and can be examined to see if errors have occurred. This option generates slower code than the default abort policy. DEBUG default: NOT defined The DEBUG setting is mainly intended for people trying to modify this code or diagnose problems when porting to new platforms. However, it may also be able to better isolate user errors than just using runtime checks. The assertions in the check routines spell out in more detail the assumptions and invariants underlying the algorithms. The checking is fairly extensive, and will slow down execution noticeably. Calling malloc_stats or mallinfo with DEBUG set will attempt to check every non-mmapped allocated and free chunk in the course of computing the summaries. ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) Debugging assertion failures can be nearly impossible if your version of the assert macro causes malloc to be called, which will lead to a cascade of further failures, blowing the runtime stack. ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), which will usually make debugging easier. MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 The action to take before "return 0" when malloc fails to be able to return memory because there is none available. HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES True if this system supports sbrk or an emulation of it. MORECORE default: sbrk The name of the sbrk-style system routine to call to obtain more memory. See below for guidance on writing custom MORECORE functions. The type of the argument to sbrk/MORECORE varies across systems. It cannot be size_t, because it supports negative arguments, so it is normally the signed type of the same width as size_t (sometimes declared as "intptr_t"). It doesn't much matter though. Internally, we only call it with arguments less than half the max value of a size_t, which should work across all reasonable possibilities, although sometimes generating compiler warnings. See near the end of this file for guidelines for creating a custom version of MORECORE. MORECORE_CONTIGUOUS default: 1 (true) If true, take advantage of fact that consecutive calls to MORECORE with positive arguments always return contiguous increasing addresses. This is true of unix sbrk. It does not hurt too much to set it true anyway, since malloc copes with non-contiguities. Setting it false when definitely non-contiguous saves time and possibly wasted space it would take to discover this though. MORECORE_CANNOT_TRIM default: NOT defined True if MORECORE cannot release space back to the system when given negative arguments. This is generally necessary only if you are using a hand-crafted MORECORE function that cannot handle negative arguments. HAVE_MMAP default: 1 (true) True if this system supports mmap or an emulation of it. If so, and HAVE_MORECORE is not true, MMAP is used for all system allocation. If set and HAVE_MORECORE is true as well, MMAP is primarily used to directly allocate very large blocks. It is also used as a backup strategy in cases where MORECORE fails to provide space from system. Note: A single call to MUNMAP is assumed to be able to unmap memory that may have be allocated using multiple calls to MMAP, so long as they are adjacent. HAVE_MREMAP default: 1 on linux, else 0 If true realloc() uses mremap() to re-allocate large blocks and extend or shrink allocation spaces. MMAP_CLEARS default: 1 on unix True if mmap clears memory so calloc doesn't need to. This is true for standard unix mmap using /dev/zero. USE_BUILTIN_FFS default: 0 (i.e., not used) Causes malloc to use the builtin ffs() function to compute indices. Some compilers may recognize and intrinsify ffs to be faster than the supplied C version. Also, the case of x86 using gcc is special-cased to an asm instruction, so is already as fast as it can be, and so this setting has no effect. (On most x86s, the asm version is only slightly faster than the C version.) malloc_getpagesize default: derive from system includes, or 4096. The system page size. To the extent possible, this malloc manages memory from the system in page-size units. This may be (and usually is) a function rather than a constant. This is ignored if WIN32, where page size is determined using getSystemInfo during initialization. USE_DEV_RANDOM default: 0 (i.e., not used) Causes malloc to use /dev/random to initialize secure magic seed for stamping footers. Otherwise, the current time is used. NO_MALLINFO default: 0 If defined, don't compile "mallinfo". This can be a simple way of dealing with mismatches between system declarations and those in this file. MALLINFO_FIELD_TYPE default: size_t The type of the fields in the mallinfo struct. This was originally defined as "int" in SVID etc, but is more usefully defined as size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set REALLOC_ZERO_BYTES_FREES default: not defined This should be set if a call to realloc with zero bytes should be the same as a call to free. Some people think it should. Otherwise, since this malloc returns a unique pointer for malloc(0), so does realloc(p, 0). LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H LACKS_STDLIB_H default: NOT defined unless on WIN32 Define these if your system does not have these header files. You might need to manually insert some of the declarations they provide. DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, system_info.dwAllocationGranularity in WIN32, otherwise 64K. Also settable using mallopt(M_GRANULARITY, x) The unit for allocating and deallocating memory from the system. On most systems with contiguous MORECORE, there is no reason to make this more than a page. However, systems with MMAP tend to either require or encourage larger granularities. You can increase this value to prevent system allocation functions to be called so often, especially if they are slow. The value must be at least one page and must be a power of two. Setting to 0 causes initialization to either page size or win32 region size. (Note: In previous versions of malloc, the equivalent of this option was called "TOP_PAD") DEFAULT_TRIM_THRESHOLD default: 2MB Also settable using mallopt(M_TRIM_THRESHOLD, x) The maximum amount of unused top-most memory to keep before releasing via malloc_trim in free(). Automatic trimming is mainly useful in long-lived programs using contiguous MORECORE. Because trimming via sbrk can be slow on some systems, and can sometimes be wasteful (in cases where programs immediately afterward allocate more large chunks) the value should be high enough so that your overall system performance would improve by releasing this much memory. As a rough guide, you might set to a value close to the average size of a process (program) running on your system. Releasing this much memory would allow such a process to run in memory. Generally, it is worth tuning trim thresholds when a program undergoes phases where several large chunks are allocated and released in ways that can reuse each other's storage, perhaps mixed with phases where there are no such chunks at all. The trim value must be greater than page size to have any useful effect. To disable trimming completely, you can set to MAX_SIZE_T. Note that the trick some people use of mallocing a huge space and then freeing it at program startup, in an attempt to reserve system memory, doesn't have the intended effect under automatic trimming, since that memory will immediately be returned to the system. DEFAULT_MMAP_THRESHOLD default: 256K Also settable using mallopt(M_MMAP_THRESHOLD, x) The request size threshold for using MMAP to directly service a request. Requests of at least this size that cannot be allocated using already-existing space will be serviced via mmap. (If enough normal freed space already exists it is used instead.) Using mmap segregates relatively large chunks of memory so that they can be individually obtained and released from the host system. A request serviced through mmap is never reused by any other request (at least not directly; the system may just so happen to remap successive requests to the same locations). Segregating space in this way has the benefits that: Mmapped space can always be individually released back to the system, which helps keep the system level memory demands of a long-lived program low. Also, mapped memory doesn't become `locked' between other chunks, as can happen with normally allocated chunks, which means that even trimming via malloc_trim would not release them. However, it has the disadvantage that the space cannot be reclaimed, consolidated, and then used to service later requests, as happens with normal chunks. The advantages of mmap nearly always outweigh disadvantages for "large" chunks, but the value of "large" may vary across systems. The default is an empirically derived value that works well in most systems. You can disable mmap by setting to MAX_SIZE_T. */ #ifndef WIN32 #ifdef _WIN32 #define WIN32 1 #endif /* _WIN32 */ #endif /* WIN32 */ #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include #define HAVE_MMAP 1 #define HAVE_MORECORE 0 #define LACKS_UNISTD_H #define LACKS_SYS_PARAM_H #define LACKS_SYS_MMAN_H #define LACKS_STRING_H #define LACKS_STRINGS_H #define LACKS_SYS_TYPES_H #define LACKS_ERRNO_H #define MALLOC_FAILURE_ACTION #define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ #endif /* WIN32 */ #ifdef __OS2__ #define INCL_DOS #include #define HAVE_MMAP 1 #define HAVE_MORECORE 0 #define LACKS_SYS_MMAN_H #endif /* __OS2__ */ #if defined(DARWIN) || defined(_DARWIN) /* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ #ifndef HAVE_MORECORE #define HAVE_MORECORE 0 #define HAVE_MMAP 1 #endif /* HAVE_MORECORE */ #endif /* DARWIN */ #ifndef LACKS_SYS_TYPES_H #include /* For size_t */ #endif /* LACKS_SYS_TYPES_H */ /* The maximum possible size_t value has all bits set */ #define MAX_SIZE_T (~(size_t)0) #ifndef ONLY_MSPACES #define ONLY_MSPACES 0 #endif /* ONLY_MSPACES */ #ifndef MSPACES #if ONLY_MSPACES #define MSPACES 1 #else /* ONLY_MSPACES */ #define MSPACES 0 #endif /* ONLY_MSPACES */ #endif /* MSPACES */ #ifndef MALLOC_ALIGNMENT #define MALLOC_ALIGNMENT ((size_t)8U) #endif /* MALLOC_ALIGNMENT */ #ifndef FOOTERS #define FOOTERS 0 #endif /* FOOTERS */ #ifndef ABORT #define ABORT abort() #endif /* ABORT */ #ifndef ABORT_ON_ASSERT_FAILURE #define ABORT_ON_ASSERT_FAILURE 1 #endif /* ABORT_ON_ASSERT_FAILURE */ #ifndef PROCEED_ON_ERROR #define PROCEED_ON_ERROR 0 #endif /* PROCEED_ON_ERROR */ #ifndef USE_LOCKS #define USE_LOCKS 0 #endif /* USE_LOCKS */ #ifndef INSECURE #define INSECURE 0 #endif /* INSECURE */ #ifndef HAVE_MMAP #define HAVE_MMAP 1 #endif /* HAVE_MMAP */ #ifndef MMAP_CLEARS #define MMAP_CLEARS 1 #endif /* MMAP_CLEARS */ #ifndef HAVE_MREMAP #ifdef linux #define HAVE_MREMAP 1 #else /* linux */ #define HAVE_MREMAP 0 #endif /* linux */ #endif /* HAVE_MREMAP */ #ifndef MALLOC_FAILURE_ACTION #define MALLOC_FAILURE_ACTION errno = ENOMEM; #endif /* MALLOC_FAILURE_ACTION */ #ifndef HAVE_MORECORE #if ONLY_MSPACES #define HAVE_MORECORE 0 #else /* ONLY_MSPACES */ #define HAVE_MORECORE 1 #endif /* ONLY_MSPACES */ #endif /* HAVE_MORECORE */ #if !HAVE_MORECORE #define MORECORE_CONTIGUOUS 0 #else /* !HAVE_MORECORE */ #ifndef MORECORE #define MORECORE sbrk #endif /* MORECORE */ #ifndef MORECORE_CONTIGUOUS #define MORECORE_CONTIGUOUS 1 #endif /* MORECORE_CONTIGUOUS */ #endif /* HAVE_MORECORE */ #ifndef DEFAULT_GRANULARITY #if MORECORE_CONTIGUOUS #define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ #else /* MORECORE_CONTIGUOUS */ #define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) #endif /* MORECORE_CONTIGUOUS */ #endif /* DEFAULT_GRANULARITY */ #ifndef DEFAULT_TRIM_THRESHOLD #ifndef MORECORE_CANNOT_TRIM #define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) #else /* MORECORE_CANNOT_TRIM */ #define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T #endif /* MORECORE_CANNOT_TRIM */ #endif /* DEFAULT_TRIM_THRESHOLD */ #ifndef DEFAULT_MMAP_THRESHOLD #if HAVE_MMAP #define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) #else /* HAVE_MMAP */ #define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T #endif /* HAVE_MMAP */ #endif /* DEFAULT_MMAP_THRESHOLD */ #ifndef USE_BUILTIN_FFS #define USE_BUILTIN_FFS 0 #endif /* USE_BUILTIN_FFS */ #ifndef USE_DEV_RANDOM #define USE_DEV_RANDOM 0 #endif /* USE_DEV_RANDOM */ #ifndef NO_MALLINFO #define NO_MALLINFO 0 #endif /* NO_MALLINFO */ #ifndef MALLINFO_FIELD_TYPE #define MALLINFO_FIELD_TYPE size_t #endif /* MALLINFO_FIELD_TYPE */ /* mallopt tuning options. SVID/XPG defines four standard parameter numbers for mallopt, normally defined in malloc.h. None of these are used in this malloc, so setting them has no effect. But this malloc does support the following options. */ #define M_TRIM_THRESHOLD (-1) #define M_GRANULARITY (-2) #define M_MMAP_THRESHOLD (-3) /* ------------------------ Mallinfo declarations ------------------------ */ #if !NO_MALLINFO /* This version of malloc supports the standard SVID/XPG mallinfo routine that returns a struct containing usage properties and statistics. It should work on any system that has a /usr/include/malloc.h defining struct mallinfo. The main declaration needed is the mallinfo struct that is returned (by-copy) by mallinfo(). The malloinfo struct contains a bunch of fields that are not even meaningful in this version of malloc. These fields are are instead filled by mallinfo() with other numbers that might be of interest. HAVE_USR_INCLUDE_MALLOC_H should be set if you have a /usr/include/malloc.h file that includes a declaration of struct mallinfo. If so, it is included; else a compliant version is declared below. These must be precisely the same for mallinfo() to work. The original SVID version of this struct, defined on most systems with mallinfo, declares all fields as ints. But some others define as unsigned long. If your system defines the fields using a type of different width than listed here, you MUST #include your system version and #define HAVE_USR_INCLUDE_MALLOC_H. */ /* #define HAVE_USR_INCLUDE_MALLOC_H */ #ifdef HAVE_USR_INCLUDE_MALLOC_H #include "/usr/include/malloc.h" #else /* HAVE_USR_INCLUDE_MALLOC_H */ /* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ #define _STRUCT_MALLINFO struct mallinfo { MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ MALLINFO_FIELD_TYPE smblks; /* always 0 */ MALLINFO_FIELD_TYPE hblks; /* always 0 */ MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ MALLINFO_FIELD_TYPE fordblks; /* total free space */ MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ }; #endif /* HAVE_USR_INCLUDE_MALLOC_H */ #endif /* NO_MALLINFO */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if !ONLY_MSPACES /* ------------------- Declarations of public routines ------------------- */ #ifndef USE_DL_PREFIX #define dlcalloc calloc #define dlfree free #define dlmalloc malloc #define dlmemalign memalign #define dlrealloc realloc #define dlvalloc valloc #define dlpvalloc pvalloc #define dlmallinfo mallinfo #define dlmallopt mallopt #define dlmalloc_trim malloc_trim #define dlmalloc_stats malloc_stats #define dlmalloc_usable_size malloc_usable_size #define dlmalloc_footprint malloc_footprint #define dlmalloc_max_footprint malloc_max_footprint #define dlindependent_calloc independent_calloc #define dlindependent_comalloc independent_comalloc #endif /* USE_DL_PREFIX */ /* malloc(size_t n) Returns a pointer to a newly allocated chunk of at least n bytes, or null if no space is available, in which case errno is set to ENOMEM on ANSI C systems. If n is zero, malloc returns a minimum-sized chunk. (The minimum size is 16 bytes on most 32bit systems, and 32 bytes on 64bit systems.) Note that size_t is an unsigned type, so calls with arguments that would be negative if signed are interpreted as requests for huge amounts of space, which will often fail. The maximum supported value of n differs across systems, but is in all cases less than the maximum representable value of a size_t. */ void* dlmalloc(size_t); /* free(void* p) Releases the chunk of memory pointed to by p, that had been previously allocated using malloc or a related routine such as realloc. It has no effect if p is null. If p was not malloced or already freed, free(p) will by default cause the current program to abort. */ void dlfree(void*); /* calloc(size_t n_elements, size_t element_size); Returns a pointer to n_elements * element_size bytes, with all locations set to zero. */ void* dlcalloc(size_t, size_t); /* realloc(void* p, size_t n) Returns a pointer to a chunk of size n that contains the same data as does chunk p up to the minimum of (n, p's size) bytes, or null if no space is available. The returned pointer may or may not be the same as p. The algorithm prefers extending p in most cases when possible, otherwise it employs the equivalent of a malloc-copy-free sequence. If p is null, realloc is equivalent to malloc. If space is not available, realloc returns null, errno is set (if on ANSI) and p is NOT freed. if n is for fewer bytes than already held by p, the newly unused space is lopped off and freed if possible. realloc with a size argument of zero (re)allocates a minimum-sized chunk. The old unix realloc convention of allowing the last-free'd chunk to be used as an argument to realloc is not supported. */ void* dlrealloc(void*, size_t); /* memalign(size_t alignment, size_t n); Returns a pointer to a newly allocated chunk of n bytes, aligned in accord with the alignment argument. The alignment argument should be a power of two. If the argument is not a power of two, the nearest greater power is used. 8-byte alignment is guaranteed by normal malloc calls, so don't bother calling memalign with an argument of 8 or less. Overreliance on memalign is a sure way to fragment space. */ void* dlmemalign(size_t, size_t); /* valloc(size_t n); Equivalent to memalign(pagesize, n), where pagesize is the page size of the system. If the pagesize is unknown, 4096 is used. */ void* dlvalloc(size_t); /* mallopt(int parameter_number, int parameter_value) Sets tunable parameters The format is to provide a (parameter-number, parameter-value) pair. mallopt then sets the corresponding parameter to the argument value if it can (i.e., so long as the value is meaningful), and returns 1 if successful else 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, normally defined in malloc.h. None of these are use in this malloc, so setting them has no effect. But this malloc also supports other options in mallopt. See below for details. Briefly, supported parameters are as follows (listed defaults are for "typical" configurations). Symbol param # default allowed param values M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) M_GRANULARITY -2 page size any power of 2 >= page size M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) */ int dlmallopt(int, int); /* malloc_footprint(); Returns the number of bytes obtained from the system. The total number of bytes allocated by malloc, realloc etc., is less than this value. Unlike mallinfo, this function returns only a precomputed result, so can be called frequently to monitor memory consumption. Even if locks are otherwise defined, this function does not use them, so results might not be up to date. */ size_t dlmalloc_footprint(void); /* malloc_max_footprint(); Returns the maximum number of bytes obtained from the system. This value will be greater than current footprint if deallocated space has been reclaimed by the system. The peak number of bytes allocated by malloc, realloc etc., is less than this value. Unlike mallinfo, this function returns only a precomputed result, so can be called frequently to monitor memory consumption. Even if locks are otherwise defined, this function does not use them, so results might not be up to date. */ size_t dlmalloc_max_footprint(void); #if !NO_MALLINFO /* mallinfo() Returns (by copy) a struct containing various summary statistics: arena: current total non-mmapped bytes allocated from system ordblks: the number of free chunks smblks: always zero. hblks: current number of mmapped regions hblkhd: total bytes held in mmapped regions usmblks: the maximum total allocated space. This will be greater than current total if trimming has occurred. fsmblks: always zero uordblks: current total allocated space (normal or mmapped) fordblks: total free space keepcost: the maximum number of bytes that could ideally be released back to system via malloc_trim. ("ideally" means that it ignores page restrictions etc.) Because these fields are ints, but internal bookkeeping may be kept as longs, the reported values may wrap around zero and thus be inaccurate. */ struct mallinfo dlmallinfo(void); #endif /* NO_MALLINFO */ /* independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); independent_calloc is similar to calloc, but instead of returning a single cleared space, it returns an array of pointers to n_elements independent elements that can hold contents of size elem_size, each of which starts out cleared, and can be independently freed, realloc'ed etc. The elements are guaranteed to be adjacently allocated (this is not guaranteed to occur with multiple callocs or mallocs), which may also improve cache locality in some applications. The "chunks" argument is optional (i.e., may be null, which is probably the most typical usage). If it is null, the returned array is itself dynamically allocated and should also be freed when it is no longer needed. Otherwise, the chunks array must be of at least n_elements in length. It is filled in with the pointers to the chunks. In either case, independent_calloc returns this pointer array, or null if the allocation failed. If n_elements is zero and "chunks" is null, it returns a chunk representing an array with zero elements (which should be freed if not wanted). Each element must be individually freed when it is no longer needed. If you'd like to instead be able to free all at once, you should instead use regular calloc and assign pointers into this space to represent elements. (In this case though, you cannot independently free elements.) independent_calloc simplifies and speeds up implementations of many kinds of pools. It may also be useful when constructing large data structures that initially have a fixed number of fixed-sized nodes, but the number is not known at compile time, and some of the nodes may later need to be freed. For example: struct Node { int item; struct Node* next; }; struct Node* build_list() { struct Node** pool; int n = read_number_of_nodes_needed(); if (n <= 0) return 0; pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); if (pool == 0) die(); // organize into a linked list... struct Node* first = pool[0]; for (i = 0; i < n-1; ++i) pool[i]->next = pool[i+1]; free(pool); // Can now free the array (or not, if it is needed later) return first; } */ void** dlindependent_calloc(size_t, size_t, void**); /* independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); independent_comalloc allocates, all at once, a set of n_elements chunks with sizes indicated in the "sizes" array. It returns an array of pointers to these elements, each of which can be independently freed, realloc'ed etc. The elements are guaranteed to be adjacently allocated (this is not guaranteed to occur with multiple callocs or mallocs), which may also improve cache locality in some applications. The "chunks" argument is optional (i.e., may be null). If it is null the returned array is itself dynamically allocated and should also be freed when it is no longer needed. Otherwise, the chunks array must be of at least n_elements in length. It is filled in with the pointers to the chunks. In either case, independent_comalloc returns this pointer array, or null if the allocation failed. If n_elements is zero and chunks is null, it returns a chunk representing an array with zero elements (which should be freed if not wanted). Each element must be individually freed when it is no longer needed. If you'd like to instead be able to free all at once, you should instead use a single regular malloc, and assign pointers at particular offsets in the aggregate space. (In this case though, you cannot independently free elements.) independent_comallac differs from independent_calloc in that each element may have a different size, and also that it does not automatically clear elements. independent_comalloc can be used to speed up allocation in cases where several structs or objects must always be allocated at the same time. For example: struct Head { ... } struct Foot { ... } void send_message(char* msg) { int msglen = strlen(msg); size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; void* chunks[3]; if (independent_comalloc(3, sizes, chunks) == 0) die(); struct Head* head = (struct Head*)(chunks[0]); char* body = (char*)(chunks[1]); struct Foot* foot = (struct Foot*)(chunks[2]); // ... } In general though, independent_comalloc is worth using only for larger values of n_elements. For small values, you probably won't detect enough difference from series of malloc calls to bother. Overuse of independent_comalloc can increase overall memory usage, since it cannot reuse existing noncontiguous small chunks that might be available for some of the elements. */ void** dlindependent_comalloc(size_t, size_t*, void**); /* pvalloc(size_t n); Equivalent to valloc(minimum-page-that-holds(n)), that is, round up n to nearest pagesize. */ void* dlpvalloc(size_t); /* malloc_trim(size_t pad); If possible, gives memory back to the system (via negative arguments to sbrk) if there is unused memory at the `high' end of the malloc pool or in unused MMAP segments. You can call this after freeing large blocks of memory to potentially reduce the system-level memory requirements of a program. However, it cannot guarantee to reduce memory. Under some allocation patterns, some large free blocks of memory will be locked between two used chunks, so they cannot be given back to the system. The `pad' argument to malloc_trim represents the amount of free trailing space to leave untrimmed. If this argument is zero, only the minimum amount of memory to maintain internal data structures will be left. Non-zero arguments can be supplied to maintain enough trailing space to service future expected allocations without having to re-obtain memory from the system. Malloc_trim returns 1 if it actually released any memory, else 0. */ int dlmalloc_trim(size_t); /* malloc_usable_size(void* p); Returns the number of bytes you can actually use in an allocated chunk, which may be more than you requested (although often not) due to alignment and minimum size constraints. You can use this many bytes without worrying about overwriting other allocated objects. This is not a particularly great programming practice. malloc_usable_size can be more useful in debugging and assertions, for example: p = malloc(n); assert(malloc_usable_size(p) >= 256); */ size_t dlmalloc_usable_size(void*); /* malloc_stats(); Prints on stderr the amount of space obtained from the system (both via sbrk and mmap), the maximum amount (which may be more than current if malloc_trim and/or munmap got called), and the current number of bytes allocated via malloc (or realloc, etc) but not yet freed. Note that this is the number of bytes allocated, not the number requested. It will be larger than the number requested because of alignment and bookkeeping overhead. Because it includes alignment wastage as being in use, this figure may be greater than zero even when no user-level chunks are allocated. The reported current and maximum system memory can be inaccurate if a program makes other calls to system memory allocation functions (normally sbrk) outside of malloc. malloc_stats prints only the most commonly interesting statistics. More information can be obtained by calling mallinfo. */ void dlmalloc_stats(void); #endif /* ONLY_MSPACES */ #if MSPACES /* mspace is an opaque type representing an independent region of space that supports mspace_malloc, etc. */ typedef void* mspace; /* create_mspace creates and returns a new independent space with the given initial capacity, or, if 0, the default granularity size. It returns null if there is no system memory available to create the space. If argument locked is non-zero, the space uses a separate lock to control access. The capacity of the space will grow dynamically as needed to service mspace_malloc requests. You can control the sizes of incremental increases of this space by compiling with a different DEFAULT_GRANULARITY or dynamically setting with mallopt(M_GRANULARITY, value). */ mspace create_mspace(size_t capacity, int locked); /* destroy_mspace destroys the given space, and attempts to return all of its memory back to the system, returning the total number of bytes freed. After destruction, the results of access to all memory used by the space become undefined. */ size_t destroy_mspace(mspace msp); /* create_mspace_with_base uses the memory supplied as the initial base of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this space is used for bookkeeping, so the capacity must be at least this large. (Otherwise 0 is returned.) When this initial space is exhausted, additional memory will be obtained from the system. Destroying this space will deallocate all additionally allocated space (if possible) but not the initial base. */ mspace create_mspace_with_base(void* base, size_t capacity, int locked); /* mspace_malloc behaves as malloc, but operates within the given space. */ void* mspace_malloc(mspace msp, size_t bytes); /* mspace_free behaves as free, but operates within the given space. If compiled with FOOTERS==1, mspace_free is not actually needed. free may be called instead of mspace_free because freed chunks from any space are handled by their originating spaces. */ void mspace_free(mspace msp, void* mem); /* mspace_realloc behaves as realloc, but operates within the given space. If compiled with FOOTERS==1, mspace_realloc is not actually needed. realloc may be called instead of mspace_realloc because realloced chunks from any space are handled by their originating spaces. */ void* mspace_realloc(mspace msp, void* mem, size_t newsize); /* mspace_calloc behaves as calloc, but operates within the given space. */ void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); /* mspace_memalign behaves as memalign, but operates within the given space. */ void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); /* mspace_independent_calloc behaves as independent_calloc, but operates within the given space. */ void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]); /* mspace_independent_comalloc behaves as independent_comalloc, but operates within the given space. */ void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]); /* mspace_footprint() returns the number of bytes obtained from the system for this space. */ size_t mspace_footprint(mspace msp); /* mspace_max_footprint() returns the peak number of bytes obtained from the system for this space. */ size_t mspace_max_footprint(mspace msp); #if !NO_MALLINFO /* mspace_mallinfo behaves as mallinfo, but reports properties of the given space. */ struct mallinfo mspace_mallinfo(mspace msp); #endif /* NO_MALLINFO */ /* mspace_malloc_stats behaves as malloc_stats, but reports properties of the given space. */ void mspace_malloc_stats(mspace msp); /* mspace_trim behaves as malloc_trim, but operates within the given space. */ int mspace_trim(mspace msp, size_t pad); /* An alias for mallopt. */ int mspace_mallopt(int, int); #endif /* MSPACES */ #ifdef __cplusplus }; /* end of extern "C" */ #endif /* __cplusplus */ /* ======================================================================== To make a fully customizable malloc.h header file, cut everything above this line, put into file malloc.h, edit to suit, and #include it on the next line, as well as in programs that use this malloc. ======================================================================== */ /* #include "malloc.h" */ /*------------------------------ internal #includes ---------------------- */ #ifdef _MSC_VER #pragma warning( disable : 4146 ) /* no "unsigned" warnings */ #endif /* _MSC_VER */ #include /* for printing in malloc_stats */ #ifndef LACKS_ERRNO_H #include /* for MALLOC_FAILURE_ACTION */ #endif /* LACKS_ERRNO_H */ #if FOOTERS #include /* for magic initialization */ #endif /* FOOTERS */ #ifndef LACKS_STDLIB_H #include /* for abort() */ #endif /* LACKS_STDLIB_H */ #ifdef DEBUG #if ABORT_ON_ASSERT_FAILURE #define assert(x) if(!(x)) ABORT #else /* ABORT_ON_ASSERT_FAILURE */ #include #endif /* ABORT_ON_ASSERT_FAILURE */ #else /* DEBUG */ #define assert(x) #endif /* DEBUG */ #ifndef LACKS_STRING_H #include /* for memset etc */ #endif /* LACKS_STRING_H */ #if USE_BUILTIN_FFS #ifndef LACKS_STRINGS_H #include /* for ffs */ #endif /* LACKS_STRINGS_H */ #endif /* USE_BUILTIN_FFS */ #if HAVE_MMAP #ifndef LACKS_SYS_MMAN_H #include /* for mmap */ #endif /* LACKS_SYS_MMAN_H */ #ifndef LACKS_FCNTL_H #include #endif /* LACKS_FCNTL_H */ #endif /* HAVE_MMAP */ #if HAVE_MORECORE #ifndef LACKS_UNISTD_H #include /* for sbrk */ #else /* LACKS_UNISTD_H */ #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) extern void* sbrk(ptrdiff_t); #endif /* FreeBSD etc */ #endif /* LACKS_UNISTD_H */ #endif /* HAVE_MMAP */ #ifndef WIN32 #ifndef malloc_getpagesize # ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ # ifndef _SC_PAGE_SIZE # define _SC_PAGE_SIZE _SC_PAGESIZE # endif # endif # ifdef _SC_PAGE_SIZE # define malloc_getpagesize sysconf(_SC_PAGE_SIZE) # else # if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) extern size_t getpagesize(); # define malloc_getpagesize getpagesize() # else # ifdef WIN32 /* use supplied emulation of getpagesize */ # define malloc_getpagesize getpagesize() # else # ifndef LACKS_SYS_PARAM_H # include # endif # ifdef EXEC_PAGESIZE # define malloc_getpagesize EXEC_PAGESIZE # else # ifdef NBPG # ifndef CLSIZE # define malloc_getpagesize NBPG # else # define malloc_getpagesize (NBPG * CLSIZE) # endif # else # ifdef NBPC # define malloc_getpagesize NBPC # else # ifdef PAGESIZE # define malloc_getpagesize PAGESIZE # else /* just guess */ # define malloc_getpagesize ((size_t)4096U) # endif # endif # endif # endif # endif # endif # endif #endif #endif /* ------------------- size_t and alignment properties -------------------- */ /* The byte and bit size of a size_t */ #define SIZE_T_SIZE (sizeof(size_t)) #define SIZE_T_BITSIZE (sizeof(size_t) << 3) /* Some constants coerced to size_t */ /* Annoying but necessary to avoid errors on some plaftorms */ #define SIZE_T_ZERO ((size_t)0) #define SIZE_T_ONE ((size_t)1) #define SIZE_T_TWO ((size_t)2) #define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) #define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) #define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) #define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) /* The bit mask value corresponding to MALLOC_ALIGNMENT */ #define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) /* True if address a has acceptable alignment */ #define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) /* the number of bytes to offset an address to align it */ #define align_offset(A)\ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) /* -------------------------- MMAP preliminaries ------------------------- */ /* If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and checks to fail so compiler optimizer can delete code rather than using so many "#if"s. */ /* MORECORE and MMAP must return MFAIL on failure */ #define MFAIL ((void*)(MAX_SIZE_T)) #define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ #if !HAVE_MMAP #define IS_MMAPPED_BIT (SIZE_T_ZERO) #define USE_MMAP_BIT (SIZE_T_ZERO) #define CALL_MMAP(s) MFAIL #define CALL_MUNMAP(a, s) (-1) #define DIRECT_MMAP(s) MFAIL #else /* HAVE_MMAP */ #define IS_MMAPPED_BIT (SIZE_T_ONE) #define USE_MMAP_BIT (SIZE_T_ONE) #if !defined(WIN32) && !defined (__OS2__) #define CALL_MUNMAP(a, s) munmap((a), (s)) #define MMAP_PROT (PROT_READ|PROT_WRITE) #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) #define MAP_ANONYMOUS MAP_ANON #endif /* MAP_ANON */ #ifdef MAP_ANONYMOUS #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) #define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) #else /* MAP_ANONYMOUS */ /* Nearly all versions of mmap support MAP_ANONYMOUS, so the following is unlikely to be needed, but is supplied just in case. */ #define MMAP_FLAGS (MAP_PRIVATE) static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ #define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ (dev_zero_fd = open("/dev/zero", O_RDWR), \ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) #endif /* MAP_ANONYMOUS */ #define DIRECT_MMAP(s) CALL_MMAP(s) #elif defined(__OS2__) /* OS/2 MMAP via DosAllocMem */ static void* os2mmap(size_t size) { void* ptr; if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) return MFAIL; return ptr; } #define os2direct_mmap(n) os2mmap(n) /* This function supports releasing coalesed segments */ static int os2munmap(void* ptr, size_t size) { while (size) { ULONG ulSize = size; ULONG ulFlags = 0; if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) return -1; if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || ulSize > size) return -1; if (DosFreeMem(ptr) != 0) return -1; ptr = ( void * ) ( ( char * ) ptr + ulSize ); size -= ulSize; } return 0; } #define CALL_MMAP(s) os2mmap(s) #define CALL_MUNMAP(a, s) os2munmap((a), (s)) #define DIRECT_MMAP(s) os2direct_mmap(s) #else /* WIN32 */ /* Win32 MMAP via VirtualAlloc */ static void* win32mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ static void* win32direct_mmap(size_t size) { void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE); return (ptr != 0)? ptr: MFAIL; } /* This function supports releasing coalesed segments */ static int win32munmap(void* ptr, size_t size) { MEMORY_BASIC_INFORMATION minfo; char* cptr = ptr; while (size) { if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) return -1; if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || minfo.State != MEM_COMMIT || minfo.RegionSize > size) return -1; if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) return -1; cptr += minfo.RegionSize; size -= minfo.RegionSize; } return 0; } #define CALL_MMAP(s) win32mmap(s) #define CALL_MUNMAP(a, s) win32munmap((a), (s)) #define DIRECT_MMAP(s) win32direct_mmap(s) #endif /* WIN32 */ #endif /* HAVE_MMAP */ #if HAVE_MMAP && HAVE_MREMAP #define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) #else /* HAVE_MMAP && HAVE_MREMAP */ #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL #endif /* HAVE_MMAP && HAVE_MREMAP */ #if HAVE_MORECORE #define CALL_MORECORE(S) MORECORE(S) #else /* HAVE_MORECORE */ #define CALL_MORECORE(S) MFAIL #endif /* HAVE_MORECORE */ /* mstate bit set if continguous morecore disabled or failed */ #define USE_NONCONTIGUOUS_BIT (4U) /* segment bit set in create_mspace_with_base */ #define EXTERN_BIT (8U) /* --------------------------- Lock preliminaries ------------------------ */ #if USE_LOCKS /* When locks are defined, there are up to two global locks: * If HAVE_MORECORE, morecore_mutex protects sequences of calls to MORECORE. In many cases sys_alloc requires two calls, that should not be interleaved with calls by other threads. This does not protect against direct calls to MORECORE by other threads not using this lock, so there is still code to cope the best we can on interference. * magic_init_mutex ensures that mparams.magic and other unique mparams values are initialized only once. */ #if !defined(WIN32) && !defined(__OS2__) /* By default use posix locks */ #include #define MLOCK_T pthread_mutex_t #define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) #define ACQUIRE_LOCK(l) pthread_mutex_lock(l) #define RELEASE_LOCK(l) pthread_mutex_unlock(l) #if HAVE_MORECORE static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; #endif /* HAVE_MORECORE */ static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; #elif defined(__OS2__) #define MLOCK_T HMTX #define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) #define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) #define RELEASE_LOCK(l) DosReleaseMutexSem(*l) #if HAVE_MORECORE static MLOCK_T morecore_mutex; #endif /* HAVE_MORECORE */ static MLOCK_T magic_init_mutex; #else /* WIN32 */ /* Because lock-protected regions have bounded times, and there are no recursive lock calls, we can use simple spinlocks. */ #define MLOCK_T long static int win32_acquire_lock (MLOCK_T *sl) { for (;;) { #ifdef InterlockedCompareExchangePointer if (!InterlockedCompareExchange(sl, 1, 0)) return 0; #else /* Use older void* version */ if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) return 0; #endif /* InterlockedCompareExchangePointer */ Sleep (0); } } static void win32_release_lock (MLOCK_T *sl) { InterlockedExchange (sl, 0); } #define INITIAL_LOCK(l) *(l)=0 #define ACQUIRE_LOCK(l) win32_acquire_lock(l) #define RELEASE_LOCK(l) win32_release_lock(l) #if HAVE_MORECORE static MLOCK_T morecore_mutex; #endif /* HAVE_MORECORE */ static MLOCK_T magic_init_mutex; #endif /* WIN32 */ #define USE_LOCK_BIT (2U) #else /* USE_LOCKS */ #define USE_LOCK_BIT (0U) #define INITIAL_LOCK(l) #endif /* USE_LOCKS */ #if USE_LOCKS && HAVE_MORECORE #define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); #define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); #else /* USE_LOCKS && HAVE_MORECORE */ #define ACQUIRE_MORECORE_LOCK() #define RELEASE_MORECORE_LOCK() #endif /* USE_LOCKS && HAVE_MORECORE */ #if USE_LOCKS #define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); #define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); #else /* USE_LOCKS */ #define ACQUIRE_MAGIC_INIT_LOCK() #define RELEASE_MAGIC_INIT_LOCK() #endif /* USE_LOCKS */ /* ----------------------- Chunk representations ------------------------ */ /* (The following includes lightly edited explanations by Colin Plumb.) The malloc_chunk declaration below is misleading (but accurate and necessary). It declares a "view" into memory allowing access to necessary fields at known offsets from a given base. Chunks of memory are maintained using a `boundary tag' method as originally described by Knuth. (See the paper by Paul Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such techniques.) Sizes of free chunks are stored both in the front of each chunk and at the end. This makes consolidating fragmented chunks into bigger chunks fast. The head fields also hold bits representing whether chunks are free or in use. Here are some pictures to make it clearer. They are "exploded" to show that the state of a chunk can be thought of as extending from the high 31 bits of the head field of its header through the prev_foot and PINUSE_BIT bit of the following chunk header. A chunk that's in use looks like: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk (if P = 1) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| | Size of this chunk 1| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | +- -+ | | +- -+ | : +- size - sizeof(size_t) available payload bytes -+ : | chunk-> +- -+ | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| | Size of next chunk (may or may not be in use) | +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ And if it's free, it looks like this: chunk-> +- -+ | User payload (must be in use, or we would have merged!) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| | Size of this chunk 0| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Prev pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : +- size - sizeof(struct chunk) unused bytes -+ : | chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of this chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| | Size of next chunk (must be in use, or we would have merged)| +-+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : +- User payload -+ : | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| +-+ Note that since we always merge adjacent free chunks, the chunks adjacent to a free chunk must be in use. Given a pointer to a chunk (which can be derived trivially from the payload pointer) we can, in O(1) time, find out whether the adjacent chunks are free, and if so, unlink them from the lists that they are on and merge them with the current chunk. Chunks always begin on even word boundaries, so the mem portion (which is returned to the user) is also on an even word boundary, and thus at least double-word aligned. The P (PINUSE_BIT) bit, stored in the unused low-order bit of the chunk size (which is always a multiple of two words), is an in-use bit for the *previous* chunk. If that bit is *clear*, then the word before the current chunk size contains the previous chunk size, and can be used to find the front of the previous chunk. The very first chunk allocated always has this bit set, preventing access to non-existent (or non-owned) memory. If pinuse is set for any given chunk, then you CANNOT determine the size of the previous chunk, and might even get a memory addressing fault when trying to do so. The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of the chunk size redundantly records whether the current chunk is inuse. This redundancy enables usage checks within free and realloc, and reduces indirection when freeing and consolidating chunks. Each freshly allocated chunk must have both cinuse and pinuse set. That is, each allocated chunk borders either a previously allocated and still in-use chunk, or the base of its memory arena. This is ensured by making all allocations from the the `lowest' part of any found chunk. Further, no free chunk physically borders another one, so each free chunk is known to be preceded and followed by either inuse chunks or the ends of memory. Note that the `foot' of the current chunk is actually represented as the prev_foot of the NEXT chunk. This makes it easier to deal with alignments etc but can be very confusing when trying to extend or adapt this code. The exceptions to all this are 1. The special chunk `top' is the top-most available chunk (i.e., the one bordering the end of available memory). It is treated specially. Top is never included in any bin, is used only if no other chunk is available, and is released back to the system if it is very large (see M_TRIM_THRESHOLD). In effect, the top chunk is treated as larger (and thus less well fitting) than any other available chunk. The top chunk doesn't update its trailing size field since there is no next contiguous chunk that would have to index off it. However, space is still allocated for it (TOP_FOOT_SIZE) to enable separation or merging when space is extended. 3. Chunks allocated via mmap, which have the lowest-order bit (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set PINUSE_BIT in their head fields. Because they are allocated one-by-one, each must carry its own prev_foot field, which is also used to hold the offset this chunk has within its mmapped region, which is needed to preserve alignment. Each mmapped chunk is trailed by the first two fields of a fake next-chunk for sake of usage checks. */ struct malloc_chunk { size_t prev_foot; /* Size of previous chunk (if free). */ size_t head; /* Size and inuse bits. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; }; typedef struct malloc_chunk mchunk; typedef struct malloc_chunk* mchunkptr; typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ typedef unsigned int bindex_t; /* Described below */ typedef unsigned int binmap_t; /* Described below */ typedef unsigned int flag_t; /* The type of various bit flag sets */ /* ------------------- Chunks sizes and alignments ----------------------- */ #define MCHUNK_SIZE (sizeof(mchunk)) #if FOOTERS #define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) #else /* FOOTERS */ #define CHUNK_OVERHEAD (SIZE_T_SIZE) #endif /* FOOTERS */ /* MMapped chunks need a second word of overhead ... */ #define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) /* ... and additional padding for fake next-chunk at foot */ #define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) /* The smallest size we can malloc is an aligned minimal chunk */ #define MIN_CHUNK_SIZE\ ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) /* conversion from malloc headers to user pointers, and back */ #define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) /* chunk associated with aligned address A */ #define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) /* Bounds on request (not chunk) sizes. */ #define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) #define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) /* pad request bytes into a usable size */ #define pad_request(req) \ (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) /* pad request, checking for minimum (but not maximum) */ #define request2size(req) \ (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) /* ------------------ Operations on head and foot fields ----------------- */ /* The head field of a chunk is or'ed with PINUSE_BIT when previous adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in use. If the chunk was obtained with mmap, the prev_foot field has IS_MMAPPED_BIT set, otherwise holding the offset of the base of the mmapped region to the base of the chunk. */ #define PINUSE_BIT (SIZE_T_ONE) #define CINUSE_BIT (SIZE_T_TWO) #define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) /* Head value for fenceposts */ #define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) /* extraction of fields from head words */ #define cinuse(p) ((p)->head & CINUSE_BIT) #define pinuse(p) ((p)->head & PINUSE_BIT) #define chunksize(p) ((p)->head & ~(INUSE_BITS)) #define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) #define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) /* Treat space at ptr +/- offset as a chunk */ #define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) #define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) /* Ptr to next or previous physical malloc_chunk. */ #define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) /* extract next chunk's pinuse bit */ #define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) /* Get/set size at footer */ #define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) #define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) /* Set size, pinuse bit, and foot */ #define set_size_and_pinuse_of_free_chunk(p, s)\ ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) /* Set size, pinuse bit, foot, and clear next pinuse */ #define set_free_with_pinuse(p, s, n)\ (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) #define is_mmapped(p)\ (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) /* Get the internal overhead associated with chunk p */ #define overhead_for(p)\ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) /* Return true if malloced space is not necessarily cleared */ #if MMAP_CLEARS #define calloc_must_clear(p) (!is_mmapped(p)) #else /* MMAP_CLEARS */ #define calloc_must_clear(p) (1) #endif /* MMAP_CLEARS */ /* ---------------------- Overlaid data structures ----------------------- */ /* When chunks are not in use, they are treated as nodes of either lists or trees. "Small" chunks are stored in circular doubly-linked lists, and look like this: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space (may be 0 bytes long) . . . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `foot:' | Size of chunk, in bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Larger chunks are kept in a form of bitwise digital trees (aka tries) keyed on chunksizes. Because malloc_tree_chunks are only for free chunks greater than 256 bytes, their size doesn't impose any constraints on user chunk sizes. Each node looks like: chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk of same size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk of same size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to left child (child[0]) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to right child (child[1]) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Pointer to parent | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | bin index of this chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space . . | nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `foot:' | Size of chunk, in bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Each tree holding treenodes is a tree of unique chunk sizes. Chunks of the same size are arranged in a circularly-linked list, with only the oldest chunk (the next to be used, in our FIFO ordering) actually in the tree. (Tree members are distinguished by a non-null parent pointer.) If a chunk with the same size an an existing node is inserted, it is linked off the existing node using pointers that work in the same way as fd/bk pointers of small chunks. Each tree contains a power of 2 sized range of chunk sizes (the smallest is 0x100 <= x < 0x180), which is is divided in half at each tree level, with the chunks in the smaller half of the range (0x100 <= x < 0x140 for the top nose) in the left subtree and the larger half (0x140 <= x < 0x180) in the right subtree. This is, of course, done by inspecting individual bits. Using these rules, each node's left subtree contains all smaller sizes than its right subtree. However, the node at the root of each subtree has no particular ordering relationship to either. (The dividing line between the subtree sizes is based on trie relation.) If we remove the last chunk of a given size from the interior of the tree, we need to replace it with a leaf node. The tree ordering rules permit a node to be replaced by any leaf below it. The smallest chunk in a tree (a common operation in a best-fit allocator) can be found by walking a path to the leftmost leaf in the tree. Unlike a usual binary tree, where we follow left child pointers until we reach a null, here we follow the right child pointer any time the left one is null, until we reach a leaf with both child pointers null. The smallest chunk in the tree will be somewhere along that path. The worst case number of steps to add, find, or remove a node is bounded by the number of bits differentiating chunks within bins. Under current bin calculations, this ranges from 6 up to 21 (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case is of course much better. */ struct malloc_tree_chunk { /* The first four fields must be compatible with malloc_chunk */ size_t prev_foot; size_t head; struct malloc_tree_chunk* fd; struct malloc_tree_chunk* bk; struct malloc_tree_chunk* child[2]; struct malloc_tree_chunk* parent; bindex_t index; }; typedef struct malloc_tree_chunk tchunk; typedef struct malloc_tree_chunk* tchunkptr; typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ /* A little helper macro for trees */ #define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) /* ----------------------------- Segments -------------------------------- */ /* Each malloc space may include non-contiguous segments, held in a list headed by an embedded malloc_segment record representing the top-most space. Segments also include flags holding properties of the space. Large chunks that are directly allocated by mmap are not included in this list. They are instead independently created and destroyed without otherwise keeping track of them. Segment management mainly comes into play for spaces allocated by MMAP. Any call to MMAP might or might not return memory that is adjacent to an existing segment. MORECORE normally contiguously extends the current space, so this space is almost always adjacent, which is simpler and faster to deal with. (This is why MORECORE is used preferentially to MMAP when both are available -- see sys_alloc.) When allocating using MMAP, we don't use any of the hinting mechanisms (inconsistently) supported in various implementations of unix mmap, or distinguish reserving from committing memory. Instead, we just ask for space, and exploit contiguity when we get it. It is probably possible to do better than this on some systems, but no general scheme seems to be significantly better. Management entails a simpler variant of the consolidation scheme used for chunks to reduce fragmentation -- new adjacent memory is normally prepended or appended to an existing segment. However, there are limitations compared to chunk consolidation that mostly reflect the fact that segment processing is relatively infrequent (occurring only when getting memory from system) and that we don't expect to have huge numbers of segments: * Segments are not indexed, so traversal requires linear scans. (It would be possible to index these, but is not worth the extra overhead and complexity for most programs on most platforms.) * New segments are only appended to old ones when holding top-most memory; if they cannot be prepended to others, they are held in different segments. Except for the top-most segment of an mstate, each segment record is kept at the tail of its segment. Segments are added by pushing segment records onto the list headed by &mstate.seg for the containing mstate. Segment flags control allocation/merge/deallocation policies: * If EXTERN_BIT set, then we did not allocate this segment, and so should not try to deallocate or merge with others. (This currently holds only for the initial segment passed into create_mspace_with_base.) * If IS_MMAPPED_BIT set, the segment may be merged with other surrounding mmapped segments and trimmed/de-allocated using munmap. * If neither bit is set, then the segment was obtained using MORECORE so can be merged with surrounding MORECORE'd segments and deallocated/trimmed using MORECORE with negative arguments. */ struct malloc_segment { char* base; /* base address */ size_t size; /* allocated size */ struct malloc_segment* next; /* ptr to next segment */ #if FFI_MMAP_EXEC_WRIT /* The mmap magic is supposed to store the address of the executable segment at the very end of the requested block. */ # define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) /* We can only merge segments if their corresponding executable segments are at identical offsets. */ # define check_segment_merge(S,b,s) \ (mmap_exec_offset((b),(s)) == (S)->exec_offset) # define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) # define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) /* The removal of sflags only works with HAVE_MORECORE == 0. */ # define get_segment_flags(S) (IS_MMAPPED_BIT) # define set_segment_flags(S,v) \ (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ (((S)->exec_offset = \ mmap_exec_offset((S)->base, (S)->size)), \ (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ (S)->exec_offset) ? (ABORT, (v)) : \ (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) /* We use an offset here, instead of a pointer, because then, when base changes, we don't have to modify this. On architectures with segmented addresses, this might not work. */ ptrdiff_t exec_offset; #else # define get_segment_flags(S) ((S)->sflags) # define set_segment_flags(S,v) ((S)->sflags = (v)) # define check_segment_merge(S,b,s) (1) flag_t sflags; /* mmap and extern flag */ #endif }; #define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) #define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) typedef struct malloc_segment msegment; typedef struct malloc_segment* msegmentptr; /* ---------------------------- malloc_state ----------------------------- */ /* A malloc_state holds all of the bookkeeping for a space. The main fields are: Top The topmost chunk of the currently active segment. Its size is cached in topsize. The actual size of topmost space is topsize+TOP_FOOT_SIZE, which includes space reserved for adding fenceposts and segment records if necessary when getting more space from the system. The size at which to autotrim top is cached from mparams in trim_check, except that it is disabled if an autotrim fails. Designated victim (dv) This is the preferred chunk for servicing small requests that don't have exact fits. It is normally the chunk split off most recently to service another small request. Its size is cached in dvsize. The link fields of this chunk are not maintained since it is not kept in a bin. SmallBins An array of bin headers for free chunks. These bins hold chunks with sizes less than MIN_LARGE_SIZE bytes. Each bin contains chunks of all the same size, spaced 8 bytes apart. To simplify use in double-linked lists, each bin header acts as a malloc_chunk pointing to the real first node, if it exists (else pointing to itself). This avoids special-casing for headers. But to avoid waste, we allocate only the fd/bk pointers of bins, and then use repositioning tricks to treat these as the fields of a chunk. TreeBins Treebins are pointers to the roots of trees holding a range of sizes. There are 2 equally spaced treebins for each power of two from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything larger. Bin maps There is one bit map for small bins ("smallmap") and one for treebins ("treemap). Each bin sets its bit when non-empty, and clears the bit when empty. Bit operations are then used to avoid bin-by-bin searching -- nearly all "search" is done without ever looking at bins that won't be selected. The bit maps conservatively use 32 bits per map word, even if on 64bit system. For a good description of some of the bit-based techniques used here, see Henry S. Warren Jr's book "Hacker's Delight" (and supplement at http://hackersdelight.org/). Many of these are intended to reduce the branchiness of paths through malloc etc, as well as to reduce the number of memory locations read or written. Segments A list of segments headed by an embedded malloc_segment record representing the initial space. Address check support The least_addr field is the least address ever obtained from MORECORE or MMAP. Attempted frees and reallocs of any address less than this are trapped (unless INSECURE is defined). Magic tag A cross-check field that should always hold same value as mparams.magic. Flags Bits recording whether to use MMAP, locks, or contiguous MORECORE Statistics Each space keeps track of current and maximum system memory obtained via MORECORE or MMAP. Locking If USE_LOCKS is defined, the "mutex" lock is acquired and released around every public call using this mspace. */ /* Bin types, widths and sizes */ #define NSMALLBINS (32U) #define NTREEBINS (32U) #define SMALLBIN_SHIFT (3U) #define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) #define TREEBIN_SHIFT (8U) #define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) #define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) #define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) struct malloc_state { binmap_t smallmap; binmap_t treemap; size_t dvsize; size_t topsize; char* least_addr; mchunkptr dv; mchunkptr top; size_t trim_check; size_t magic; mchunkptr smallbins[(NSMALLBINS+1)*2]; tbinptr treebins[NTREEBINS]; size_t footprint; size_t max_footprint; flag_t mflags; #if USE_LOCKS MLOCK_T mutex; /* locate lock among fields that rarely change */ #endif /* USE_LOCKS */ msegment seg; }; typedef struct malloc_state* mstate; /* ------------- Global malloc_state and malloc_params ------------------- */ /* malloc_params holds global properties, including those that can be dynamically set using mallopt. There is a single instance, mparams, initialized in init_mparams. */ struct malloc_params { size_t magic; size_t page_size; size_t granularity; size_t mmap_threshold; size_t trim_threshold; flag_t default_mflags; }; static struct malloc_params mparams; /* The global malloc_state used for all non-"mspace" calls */ static struct malloc_state _gm_; #define gm (&_gm_) #define is_global(M) ((M) == &_gm_) #define is_initialized(M) ((M)->top != 0) /* -------------------------- system alloc setup ------------------------- */ /* Operations on mflags */ #define use_lock(M) ((M)->mflags & USE_LOCK_BIT) #define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) #define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) #define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) #define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) #define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) #define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) #define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) #define set_lock(M,L)\ ((M)->mflags = (L)?\ ((M)->mflags | USE_LOCK_BIT) :\ ((M)->mflags & ~USE_LOCK_BIT)) /* page-align a size */ #define page_align(S)\ (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) /* granularity-align a size */ #define granularity_align(S)\ (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) #define is_page_aligned(S)\ (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) #define is_granularity_aligned(S)\ (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) /* True if segment S holds address A */ #define segment_holds(S, A)\ ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) /* Return segment holding given address */ static msegmentptr segment_holding(mstate m, char* addr) { msegmentptr sp = &m->seg; for (;;) { if (addr >= sp->base && addr < sp->base + sp->size) return sp; if ((sp = sp->next) == 0) return 0; } } /* Return true if segment contains a segment link */ static int has_segment_link(mstate m, msegmentptr ss) { msegmentptr sp = &m->seg; for (;;) { if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) return 1; if ((sp = sp->next) == 0) return 0; } } #ifndef MORECORE_CANNOT_TRIM #define should_trim(M,s) ((s) > (M)->trim_check) #else /* MORECORE_CANNOT_TRIM */ #define should_trim(M,s) (0) #endif /* MORECORE_CANNOT_TRIM */ /* TOP_FOOT_SIZE is padding at the end of a segment, including space that may be needed to place segment records and fenceposts when new noncontiguous segments are added. */ #define TOP_FOOT_SIZE\ (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) /* ------------------------------- Hooks -------------------------------- */ /* PREACTION should be defined to return 0 on success, and nonzero on failure. If you are not using locking, you can redefine these to do anything you like. */ #if USE_LOCKS /* Ensure locks are initialized */ #define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) #define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) #define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } #else /* USE_LOCKS */ #ifndef PREACTION #define PREACTION(M) (0) #endif /* PREACTION */ #ifndef POSTACTION #define POSTACTION(M) #endif /* POSTACTION */ #endif /* USE_LOCKS */ /* CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. USAGE_ERROR_ACTION is triggered on detected bad frees and reallocs. The argument p is an address that might have triggered the fault. It is ignored by the two predefined actions, but might be useful in custom actions that try to help diagnose errors. */ #if PROCEED_ON_ERROR /* A count of the number of corruption errors causing resets */ int malloc_corruption_error_count; /* default corruption action */ static void reset_on_error(mstate m); #define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) #define USAGE_ERROR_ACTION(m, p) #else /* PROCEED_ON_ERROR */ #ifndef CORRUPTION_ERROR_ACTION #define CORRUPTION_ERROR_ACTION(m) ABORT #endif /* CORRUPTION_ERROR_ACTION */ #ifndef USAGE_ERROR_ACTION #define USAGE_ERROR_ACTION(m,p) ABORT #endif /* USAGE_ERROR_ACTION */ #endif /* PROCEED_ON_ERROR */ /* -------------------------- Debugging setup ---------------------------- */ #if ! DEBUG #define check_free_chunk(M,P) #define check_inuse_chunk(M,P) #define check_malloced_chunk(M,P,N) #define check_mmapped_chunk(M,P) #define check_malloc_state(M) #define check_top_chunk(M,P) #else /* DEBUG */ #define check_free_chunk(M,P) do_check_free_chunk(M,P) #define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) #define check_top_chunk(M,P) do_check_top_chunk(M,P) #define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) #define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) #define check_malloc_state(M) do_check_malloc_state(M) static void do_check_any_chunk(mstate m, mchunkptr p); static void do_check_top_chunk(mstate m, mchunkptr p); static void do_check_mmapped_chunk(mstate m, mchunkptr p); static void do_check_inuse_chunk(mstate m, mchunkptr p); static void do_check_free_chunk(mstate m, mchunkptr p); static void do_check_malloced_chunk(mstate m, void* mem, size_t s); static void do_check_tree(mstate m, tchunkptr t); static void do_check_treebin(mstate m, bindex_t i); static void do_check_smallbin(mstate m, bindex_t i); static void do_check_malloc_state(mstate m); static int bin_find(mstate m, mchunkptr x); static size_t traverse_and_check(mstate m); #endif /* DEBUG */ /* ---------------------------- Indexing Bins ---------------------------- */ #define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) #define small_index(s) ((s) >> SMALLBIN_SHIFT) #define small_index2size(i) ((i) << SMALLBIN_SHIFT) #define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) /* addressing by index. See above about smallbin repositioning */ #define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) #define treebin_at(M,i) (&((M)->treebins[i])) /* assign tree index for size S to variable I */ #if defined(__GNUC__) && defined(i386) #define compute_tree_index(S, I)\ {\ size_t X = S >> TREEBIN_SHIFT;\ if (X == 0)\ I = 0;\ else if (X > 0xFFFF)\ I = NTREEBINS-1;\ else {\ unsigned int K;\ __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ }\ } #else /* GNUC */ #define compute_tree_index(S, I)\ {\ size_t X = S >> TREEBIN_SHIFT;\ if (X == 0)\ I = 0;\ else if (X > 0xFFFF)\ I = NTREEBINS-1;\ else {\ unsigned int Y = (unsigned int)X;\ unsigned int N = ((Y - 0x100) >> 16) & 8;\ unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ N += K;\ N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ K = 14 - N + ((Y <<= K) >> 15);\ I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ }\ } #endif /* GNUC */ /* Bit representing maximum resolved size in a treebin at i */ #define bit_for_tree_index(i) \ (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) /* Shift placing maximum resolved bit in a treebin at i as sign bit */ #define leftshift_for_tree_index(i) \ ((i == NTREEBINS-1)? 0 : \ ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) /* The size of the smallest chunk held in bin with index i */ #define minsize_for_tree_index(i) \ ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) /* ------------------------ Operations on bin maps ----------------------- */ /* bit corresponding to given index */ #define idx2bit(i) ((binmap_t)(1) << (i)) /* Mark/Clear bits with given index */ #define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) #define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) #define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) #define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) #define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) #define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) /* index corresponding to given bit */ #if defined(__GNUC__) && defined(i386) #define compute_bit2idx(X, I)\ {\ unsigned int J;\ __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ I = (bindex_t)J;\ } #else /* GNUC */ #if USE_BUILTIN_FFS #define compute_bit2idx(X, I) I = ffs(X)-1 #else /* USE_BUILTIN_FFS */ #define compute_bit2idx(X, I)\ {\ unsigned int Y = X - 1;\ unsigned int K = Y >> (16-4) & 16;\ unsigned int N = K; Y >>= K;\ N += K = Y >> (8-3) & 8; Y >>= K;\ N += K = Y >> (4-2) & 4; Y >>= K;\ N += K = Y >> (2-1) & 2; Y >>= K;\ N += K = Y >> (1-0) & 1; Y >>= K;\ I = (bindex_t)(N + Y);\ } #endif /* USE_BUILTIN_FFS */ #endif /* GNUC */ /* isolate the least set bit of a bitmap */ #define least_bit(x) ((x) & -(x)) /* mask with all bits to left of least bit of x on */ #define left_bits(x) ((x<<1) | -(x<<1)) /* mask with all bits to left of or equal to least bit of x on */ #define same_or_left_bits(x) ((x) | -(x)) /* ----------------------- Runtime Check Support ------------------------- */ /* For security, the main invariant is that malloc/free/etc never writes to a static address other than malloc_state, unless static malloc_state itself has been corrupted, which cannot occur via malloc (because of these checks). In essence this means that we believe all pointers, sizes, maps etc held in malloc_state, but check all of those linked or offsetted from other embedded data structures. These checks are interspersed with main code in a way that tends to minimize their run-time cost. When FOOTERS is defined, in addition to range checking, we also verify footer fields of inuse chunks, which can be used guarantee that the mstate controlling malloc/free is intact. This is a streamlined version of the approach described by William Robertson et al in "Run-time Detection of Heap-based Overflows" LISA'03 http://www.usenix.org/events/lisa03/tech/robertson.html The footer of an inuse chunk holds the xor of its mstate and a random seed, that is checked upon calls to free() and realloc(). This is (probablistically) unguessable from outside the program, but can be computed by any code successfully malloc'ing any chunk, so does not itself provide protection against code that has already broken security through some other means. Unlike Robertson et al, we always dynamically check addresses of all offset chunks (previous, next, etc). This turns out to be cheaper than relying on hashes. */ #if !INSECURE /* Check if address a is at least as high as any from MORECORE or MMAP */ #define ok_address(M, a) ((char*)(a) >= (M)->least_addr) /* Check if address of next chunk n is higher than base chunk p */ #define ok_next(p, n) ((char*)(p) < (char*)(n)) /* Check if p has its cinuse bit on */ #define ok_cinuse(p) cinuse(p) /* Check if p has its pinuse bit on */ #define ok_pinuse(p) pinuse(p) #else /* !INSECURE */ #define ok_address(M, a) (1) #define ok_next(b, n) (1) #define ok_cinuse(p) (1) #define ok_pinuse(p) (1) #endif /* !INSECURE */ #if (FOOTERS && !INSECURE) /* Check if (alleged) mstate m has expected magic field */ #define ok_magic(M) ((M)->magic == mparams.magic) #else /* (FOOTERS && !INSECURE) */ #define ok_magic(M) (1) #endif /* (FOOTERS && !INSECURE) */ /* In gcc, use __builtin_expect to minimize impact of checks */ #if !INSECURE #if defined(__GNUC__) && __GNUC__ >= 3 #define RTCHECK(e) __builtin_expect(e, 1) #else /* GNUC */ #define RTCHECK(e) (e) #endif /* GNUC */ #else /* !INSECURE */ #define RTCHECK(e) (1) #endif /* !INSECURE */ /* macros to set up inuse chunks with or without footers */ #if !FOOTERS #define mark_inuse_foot(M,p,s) /* Set cinuse bit and pinuse bit of next chunk */ #define set_inuse(M,p,s)\ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) /* Set cinuse and pinuse of this chunk and pinuse of next chunk */ #define set_inuse_and_pinuse(M,p,s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) /* Set size, cinuse and pinuse bit of this chunk */ #define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) #else /* FOOTERS */ /* Set foot of inuse chunk to be xor of mstate and seed */ #define mark_inuse_foot(M,p,s)\ (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) #define get_mstate_for(p)\ ((mstate)(((mchunkptr)((char*)(p) +\ (chunksize(p))))->prev_foot ^ mparams.magic)) #define set_inuse(M,p,s)\ ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ mark_inuse_foot(M,p,s)) #define set_inuse_and_pinuse(M,p,s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ mark_inuse_foot(M,p,s)) #define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ mark_inuse_foot(M, p, s)) #endif /* !FOOTERS */ /* ---------------------------- setting mparams -------------------------- */ /* Initialize mparams */ static int init_mparams(void) { if (mparams.page_size == 0) { size_t s; mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; #if MORECORE_CONTIGUOUS mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; #else /* MORECORE_CONTIGUOUS */ mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; #endif /* MORECORE_CONTIGUOUS */ #if (FOOTERS && !INSECURE) { #if USE_DEV_RANDOM int fd; unsigned char buf[sizeof(size_t)]; /* Try to use /dev/urandom, else fall back on using time */ if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && read(fd, buf, sizeof(buf)) == sizeof(buf)) { s = *((size_t *) buf); close(fd); } else #endif /* USE_DEV_RANDOM */ s = (size_t)(time(0) ^ (size_t)0x55555555U); s |= (size_t)8U; /* ensure nonzero */ s &= ~(size_t)7U; /* improve chances of fault for bad values */ } #else /* (FOOTERS && !INSECURE) */ s = (size_t)0x58585858U; #endif /* (FOOTERS && !INSECURE) */ ACQUIRE_MAGIC_INIT_LOCK(); if (mparams.magic == 0) { mparams.magic = s; /* Set up lock for main malloc area */ INITIAL_LOCK(&gm->mutex); gm->mflags = mparams.default_mflags; } RELEASE_MAGIC_INIT_LOCK(); #if !defined(WIN32) && !defined(__OS2__) mparams.page_size = malloc_getpagesize; mparams.granularity = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : mparams.page_size); #elif defined (__OS2__) /* if low-memory is used, os2munmap() would break if it were anything other than 64k */ mparams.page_size = 4096u; mparams.granularity = 65536u; #else /* WIN32 */ { SYSTEM_INFO system_info; GetSystemInfo(&system_info); mparams.page_size = system_info.dwPageSize; mparams.granularity = system_info.dwAllocationGranularity; } #endif /* WIN32 */ /* Sanity-check configuration: size_t must be unsigned and as wide as pointer type. ints must be at least 4 bytes. alignment must be at least 8. Alignment, min chunk size, and page size must all be powers of 2. */ if ((sizeof(size_t) != sizeof(char*)) || (MAX_SIZE_T < MIN_CHUNK_SIZE) || (sizeof(int) < 4) || (MALLOC_ALIGNMENT < (size_t)8U) || ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) ABORT; } return 0; } /* support for mallopt */ static int change_mparam(int param_number, int value) { size_t val = (size_t)value; init_mparams(); switch(param_number) { case M_TRIM_THRESHOLD: mparams.trim_threshold = val; return 1; case M_GRANULARITY: if (val >= mparams.page_size && ((val & (val-1)) == 0)) { mparams.granularity = val; return 1; } else return 0; case M_MMAP_THRESHOLD: mparams.mmap_threshold = val; return 1; default: return 0; } } #if DEBUG /* ------------------------- Debugging Support --------------------------- */ /* Check properties of any chunk, whether free, inuse, mmapped etc */ static void do_check_any_chunk(mstate m, mchunkptr p) { assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); } /* Check properties of top chunk */ static void do_check_top_chunk(mstate m, mchunkptr p) { msegmentptr sp = segment_holding(m, (char*)p); size_t sz = chunksize(p); assert(sp != 0); assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); assert(sz == m->topsize); assert(sz > 0); assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); assert(pinuse(p)); assert(!next_pinuse(p)); } /* Check properties of (inuse) mmapped chunks */ static void do_check_mmapped_chunk(mstate m, mchunkptr p) { size_t sz = chunksize(p); size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); assert(is_mmapped(p)); assert(use_mmap(m)); assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); assert(ok_address(m, p)); assert(!is_small(sz)); assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); } /* Check properties of inuse chunks */ static void do_check_inuse_chunk(mstate m, mchunkptr p) { do_check_any_chunk(m, p); assert(cinuse(p)); assert(next_pinuse(p)); /* If not pinuse and not mmapped, previous chunk has OK offset */ assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); if (is_mmapped(p)) do_check_mmapped_chunk(m, p); } /* Check properties of free chunks */ static void do_check_free_chunk(mstate m, mchunkptr p) { size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); mchunkptr next = chunk_plus_offset(p, sz); do_check_any_chunk(m, p); assert(!cinuse(p)); assert(!next_pinuse(p)); assert (!is_mmapped(p)); if (p != m->dv && p != m->top) { if (sz >= MIN_CHUNK_SIZE) { assert((sz & CHUNK_ALIGN_MASK) == 0); assert(is_aligned(chunk2mem(p))); assert(next->prev_foot == sz); assert(pinuse(p)); assert (next == m->top || cinuse(next)); assert(p->fd->bk == p); assert(p->bk->fd == p); } else /* markers are always of size SIZE_T_SIZE */ assert(sz == SIZE_T_SIZE); } } /* Check properties of malloced chunks at the point they are malloced */ static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { if (mem != 0) { mchunkptr p = mem2chunk(mem); size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); do_check_inuse_chunk(m, p); assert((sz & CHUNK_ALIGN_MASK) == 0); assert(sz >= MIN_CHUNK_SIZE); assert(sz >= s); /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); } } /* Check a tree and its subtrees. */ static void do_check_tree(mstate m, tchunkptr t) { tchunkptr head = 0; tchunkptr u = t; bindex_t tindex = t->index; size_t tsize = chunksize(t); bindex_t idx; compute_tree_index(tsize, idx); assert(tindex == idx); assert(tsize >= MIN_LARGE_SIZE); assert(tsize >= minsize_for_tree_index(idx)); assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); do { /* traverse through chain of same-sized nodes */ do_check_any_chunk(m, ((mchunkptr)u)); assert(u->index == tindex); assert(chunksize(u) == tsize); assert(!cinuse(u)); assert(!next_pinuse(u)); assert(u->fd->bk == u); assert(u->bk->fd == u); if (u->parent == 0) { assert(u->child[0] == 0); assert(u->child[1] == 0); } else { assert(head == 0); /* only one node on chain has parent */ head = u; assert(u->parent != u); assert (u->parent->child[0] == u || u->parent->child[1] == u || *((tbinptr*)(u->parent)) == u); if (u->child[0] != 0) { assert(u->child[0]->parent == u); assert(u->child[0] != u); do_check_tree(m, u->child[0]); } if (u->child[1] != 0) { assert(u->child[1]->parent == u); assert(u->child[1] != u); do_check_tree(m, u->child[1]); } if (u->child[0] != 0 && u->child[1] != 0) { assert(chunksize(u->child[0]) < chunksize(u->child[1])); } } u = u->fd; } while (u != t); assert(head != 0); } /* Check all the chunks in a treebin. */ static void do_check_treebin(mstate m, bindex_t i) { tbinptr* tb = treebin_at(m, i); tchunkptr t = *tb; int empty = (m->treemap & (1U << i)) == 0; if (t == 0) assert(empty); if (!empty) do_check_tree(m, t); } /* Check all the chunks in a smallbin. */ static void do_check_smallbin(mstate m, bindex_t i) { sbinptr b = smallbin_at(m, i); mchunkptr p = b->bk; unsigned int empty = (m->smallmap & (1U << i)) == 0; if (p == b) assert(empty); if (!empty) { for (; p != b; p = p->bk) { size_t size = chunksize(p); mchunkptr q; /* each chunk claims to be free */ do_check_free_chunk(m, p); /* chunk belongs in bin */ assert(small_index(size) == i); assert(p->bk == b || chunksize(p->bk) == chunksize(p)); /* chunk is followed by an inuse chunk */ q = next_chunk(p); if (q->head != FENCEPOST_HEAD) do_check_inuse_chunk(m, q); } } } /* Find x in a bin. Used in other check functions. */ static int bin_find(mstate m, mchunkptr x) { size_t size = chunksize(x); if (is_small(size)) { bindex_t sidx = small_index(size); sbinptr b = smallbin_at(m, sidx); if (smallmap_is_marked(m, sidx)) { mchunkptr p = b; do { if (p == x) return 1; } while ((p = p->fd) != b); } } else { bindex_t tidx; compute_tree_index(size, tidx); if (treemap_is_marked(m, tidx)) { tchunkptr t = *treebin_at(m, tidx); size_t sizebits = size << leftshift_for_tree_index(tidx); while (t != 0 && chunksize(t) != size) { t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; sizebits <<= 1; } if (t != 0) { tchunkptr u = t; do { if (u == (tchunkptr)x) return 1; } while ((u = u->fd) != t); } } } return 0; } /* Traverse each chunk and check it; return total */ static size_t traverse_and_check(mstate m) { size_t sum = 0; if (is_initialized(m)) { msegmentptr s = &m->seg; sum += m->topsize + TOP_FOOT_SIZE; while (s != 0) { mchunkptr q = align_as_chunk(s->base); mchunkptr lastq = 0; assert(pinuse(q)); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { sum += chunksize(q); if (cinuse(q)) { assert(!bin_find(m, q)); do_check_inuse_chunk(m, q); } else { assert(q == m->dv || bin_find(m, q)); assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ do_check_free_chunk(m, q); } lastq = q; q = next_chunk(q); } s = s->next; } } return sum; } /* Check all properties of malloc_state. */ static void do_check_malloc_state(mstate m) { bindex_t i; size_t total; /* check bins */ for (i = 0; i < NSMALLBINS; ++i) do_check_smallbin(m, i); for (i = 0; i < NTREEBINS; ++i) do_check_treebin(m, i); if (m->dvsize != 0) { /* check dv chunk */ do_check_any_chunk(m, m->dv); assert(m->dvsize == chunksize(m->dv)); assert(m->dvsize >= MIN_CHUNK_SIZE); assert(bin_find(m, m->dv) == 0); } if (m->top != 0) { /* check top chunk */ do_check_top_chunk(m, m->top); assert(m->topsize == chunksize(m->top)); assert(m->topsize > 0); assert(bin_find(m, m->top) == 0); } total = traverse_and_check(m); assert(total <= m->footprint); assert(m->footprint <= m->max_footprint); } #endif /* DEBUG */ /* ----------------------------- statistics ------------------------------ */ #if !NO_MALLINFO static struct mallinfo internal_mallinfo(mstate m) { struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (!PREACTION(m)) { check_malloc_state(m); if (is_initialized(m)) { size_t nfree = SIZE_T_ONE; /* top always free */ size_t mfree = m->topsize + TOP_FOOT_SIZE; size_t sum = mfree; msegmentptr s = &m->seg; while (s != 0) { mchunkptr q = align_as_chunk(s->base); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { size_t sz = chunksize(q); sum += sz; if (!cinuse(q)) { mfree += sz; ++nfree; } q = next_chunk(q); } s = s->next; } nm.arena = sum; nm.ordblks = nfree; nm.hblkhd = m->footprint - sum; nm.usmblks = m->max_footprint; nm.uordblks = m->footprint - mfree; nm.fordblks = mfree; nm.keepcost = m->topsize; } POSTACTION(m); } return nm; } #endif /* !NO_MALLINFO */ static void internal_malloc_stats(mstate m) { if (!PREACTION(m)) { size_t maxfp = 0; size_t fp = 0; size_t used = 0; check_malloc_state(m); if (is_initialized(m)) { msegmentptr s = &m->seg; maxfp = m->max_footprint; fp = m->footprint; used = fp - (m->topsize + TOP_FOOT_SIZE); while (s != 0) { mchunkptr q = align_as_chunk(s->base); while (segment_holds(s, q) && q != m->top && q->head != FENCEPOST_HEAD) { if (!cinuse(q)) used -= chunksize(q); q = next_chunk(q); } s = s->next; } } fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); POSTACTION(m); } } /* ----------------------- Operations on smallbins ----------------------- */ /* Various forms of linking and unlinking are defined as macros. Even the ones for trees, which are very long but have very short typical paths. This is ugly but reduces reliance on inlining support of compilers. */ /* Link a free chunk into a smallbin */ #define insert_small_chunk(M, P, S) {\ bindex_t I = small_index(S);\ mchunkptr B = smallbin_at(M, I);\ mchunkptr F = B;\ assert(S >= MIN_CHUNK_SIZE);\ if (!smallmap_is_marked(M, I))\ mark_smallmap(M, I);\ else if (RTCHECK(ok_address(M, B->fd)))\ F = B->fd;\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ B->fd = P;\ F->bk = P;\ P->fd = F;\ P->bk = B;\ } /* Unlink a chunk from a smallbin */ #define unlink_small_chunk(M, P, S) {\ mchunkptr F = P->fd;\ mchunkptr B = P->bk;\ bindex_t I = small_index(S);\ assert(P != B);\ assert(P != F);\ assert(chunksize(P) == small_index2size(I));\ if (F == B)\ clear_smallmap(M, I);\ else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ (B == smallbin_at(M,I) || ok_address(M, B)))) {\ F->bk = B;\ B->fd = F;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ } /* Unlink the first chunk from a smallbin */ #define unlink_first_small_chunk(M, B, P, I) {\ mchunkptr F = P->fd;\ assert(P != B);\ assert(P != F);\ assert(chunksize(P) == small_index2size(I));\ if (B == F)\ clear_smallmap(M, I);\ else if (RTCHECK(ok_address(M, F))) {\ B->fd = F;\ F->bk = B;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ } /* Replace dv node, binning the old one */ /* Used only when dvsize known to be small */ #define replace_dv(M, P, S) {\ size_t DVS = M->dvsize;\ if (DVS != 0) {\ mchunkptr DV = M->dv;\ assert(is_small(DVS));\ insert_small_chunk(M, DV, DVS);\ }\ M->dvsize = S;\ M->dv = P;\ } /* ------------------------- Operations on trees ------------------------- */ /* Insert chunk into tree */ #define insert_large_chunk(M, X, S) {\ tbinptr* H;\ bindex_t I;\ compute_tree_index(S, I);\ H = treebin_at(M, I);\ X->index = I;\ X->child[0] = X->child[1] = 0;\ if (!treemap_is_marked(M, I)) {\ mark_treemap(M, I);\ *H = X;\ X->parent = (tchunkptr)H;\ X->fd = X->bk = X;\ }\ else {\ tchunkptr T = *H;\ size_t K = S << leftshift_for_tree_index(I);\ for (;;) {\ if (chunksize(T) != S) {\ tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ K <<= 1;\ if (*C != 0)\ T = *C;\ else if (RTCHECK(ok_address(M, C))) {\ *C = X;\ X->parent = T;\ X->fd = X->bk = X;\ break;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ break;\ }\ }\ else {\ tchunkptr F = T->fd;\ if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ T->fd = F->bk = X;\ X->fd = F;\ X->bk = T;\ X->parent = 0;\ break;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ break;\ }\ }\ }\ }\ } /* Unlink steps: 1. If x is a chained node, unlink it from its same-sized fd/bk links and choose its bk node as its replacement. 2. If x was the last node of its size, but not a leaf node, it must be replaced with a leaf node (not merely one with an open left or right), to make sure that lefts and rights of descendents correspond properly to bit masks. We use the rightmost descendent of x. We could use any other leaf, but this is easy to locate and tends to counteract removal of leftmosts elsewhere, and so keeps paths shorter than minimally guaranteed. This doesn't loop much because on average a node in a tree is near the bottom. 3. If x is the base of a chain (i.e., has parent links) relink x's parent and children to x's replacement (or null if none). */ #define unlink_large_chunk(M, X) {\ tchunkptr XP = X->parent;\ tchunkptr R;\ if (X->bk != X) {\ tchunkptr F = X->fd;\ R = X->bk;\ if (RTCHECK(ok_address(M, F))) {\ F->bk = R;\ R->fd = F;\ }\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ else {\ tchunkptr* RP;\ if (((R = *(RP = &(X->child[1]))) != 0) ||\ ((R = *(RP = &(X->child[0]))) != 0)) {\ tchunkptr* CP;\ while ((*(CP = &(R->child[1])) != 0) ||\ (*(CP = &(R->child[0])) != 0)) {\ R = *(RP = CP);\ }\ if (RTCHECK(ok_address(M, RP)))\ *RP = 0;\ else {\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ }\ if (XP != 0) {\ tbinptr* H = treebin_at(M, X->index);\ if (X == *H) {\ if ((*H = R) == 0) \ clear_treemap(M, X->index);\ }\ else if (RTCHECK(ok_address(M, XP))) {\ if (XP->child[0] == X) \ XP->child[0] = R;\ else \ XP->child[1] = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ if (R != 0) {\ if (RTCHECK(ok_address(M, R))) {\ tchunkptr C0, C1;\ R->parent = XP;\ if ((C0 = X->child[0]) != 0) {\ if (RTCHECK(ok_address(M, C0))) {\ R->child[0] = C0;\ C0->parent = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ if ((C1 = X->child[1]) != 0) {\ if (RTCHECK(ok_address(M, C1))) {\ R->child[1] = C1;\ C1->parent = R;\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ else\ CORRUPTION_ERROR_ACTION(M);\ }\ }\ } /* Relays to large vs small bin operations */ #define insert_chunk(M, P, S)\ if (is_small(S)) insert_small_chunk(M, P, S)\ else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } #define unlink_chunk(M, P, S)\ if (is_small(S)) unlink_small_chunk(M, P, S)\ else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } /* Relays to internal calls to malloc/free from realloc, memalign etc */ #if ONLY_MSPACES #define internal_malloc(m, b) mspace_malloc(m, b) #define internal_free(m, mem) mspace_free(m,mem); #else /* ONLY_MSPACES */ #if MSPACES #define internal_malloc(m, b)\ (m == gm)? dlmalloc(b) : mspace_malloc(m, b) #define internal_free(m, mem)\ if (m == gm) dlfree(mem); else mspace_free(m,mem); #else /* MSPACES */ #define internal_malloc(m, b) dlmalloc(b) #define internal_free(m, mem) dlfree(mem) #endif /* MSPACES */ #endif /* ONLY_MSPACES */ /* ----------------------- Direct-mmapping chunks ----------------------- */ /* Directly mmapped chunks are set up with an offset to the start of the mmapped region stored in the prev_foot field of the chunk. This allows reconstruction of the required argument to MUNMAP when freed, and also allows adjustment of the returned chunk to meet alignment requirements (especially in memalign). There is also enough space allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain the PINUSE bit so frees can be checked. */ /* Malloc using mmap */ static void* mmap_alloc(mstate m, size_t nb) { size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); if (mmsize > nb) { /* Check for wrap around 0 */ char* mm = (char*)(DIRECT_MMAP(mmsize)); if (mm != CMFAIL) { size_t offset = align_offset(chunk2mem(mm)); size_t psize = mmsize - offset - MMAP_FOOT_PAD; mchunkptr p = (mchunkptr)(mm + offset); p->prev_foot = offset | IS_MMAPPED_BIT; (p)->head = (psize|CINUSE_BIT); mark_inuse_foot(m, p, psize); chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; if (mm < m->least_addr) m->least_addr = mm; if ((m->footprint += mmsize) > m->max_footprint) m->max_footprint = m->footprint; assert(is_aligned(chunk2mem(p))); check_mmapped_chunk(m, p); return chunk2mem(p); } } return 0; } /* Realloc using mmap */ static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { size_t oldsize = chunksize(oldp); if (is_small(nb)) /* Can't shrink mmap regions below small size */ return 0; /* Keep old chunk if big enough but not too big */ if (oldsize >= nb + SIZE_T_SIZE && (oldsize - nb) <= (mparams.granularity << 1)) return oldp; else { size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); char* cp = (char*)CALL_MREMAP((char*)oldp - offset, oldmmsize, newmmsize, 1); if (cp != CMFAIL) { mchunkptr newp = (mchunkptr)(cp + offset); size_t psize = newmmsize - offset - MMAP_FOOT_PAD; newp->head = (psize|CINUSE_BIT); mark_inuse_foot(m, newp, psize); chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; if (cp < m->least_addr) m->least_addr = cp; if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) m->max_footprint = m->footprint; check_mmapped_chunk(m, newp); return newp; } } return 0; } /* -------------------------- mspace management -------------------------- */ /* Initialize top chunk and its size */ static void init_top(mstate m, mchunkptr p, size_t psize) { /* Ensure alignment */ size_t offset = align_offset(chunk2mem(p)); p = (mchunkptr)((char*)p + offset); psize -= offset; m->top = p; m->topsize = psize; p->head = psize | PINUSE_BIT; /* set size of fake trailing chunk holding overhead space only once */ chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; m->trim_check = mparams.trim_threshold; /* reset on each update */ } /* Initialize bins for a new mstate that is otherwise zeroed out */ static void init_bins(mstate m) { /* Establish circular links for smallbins */ bindex_t i; for (i = 0; i < NSMALLBINS; ++i) { sbinptr bin = smallbin_at(m,i); bin->fd = bin->bk = bin; } } #if PROCEED_ON_ERROR /* default corruption action */ static void reset_on_error(mstate m) { int i; ++malloc_corruption_error_count; /* Reinitialize fields to forget about all memory */ m->smallbins = m->treebins = 0; m->dvsize = m->topsize = 0; m->seg.base = 0; m->seg.size = 0; m->seg.next = 0; m->top = m->dv = 0; for (i = 0; i < NTREEBINS; ++i) *treebin_at(m, i) = 0; init_bins(m); } #endif /* PROCEED_ON_ERROR */ /* Allocate chunk and prepend remainder with chunk in successor base. */ static void* prepend_alloc(mstate m, char* newbase, char* oldbase, size_t nb) { mchunkptr p = align_as_chunk(newbase); mchunkptr oldfirst = align_as_chunk(oldbase); size_t psize = (char*)oldfirst - (char*)p; mchunkptr q = chunk_plus_offset(p, nb); size_t qsize = psize - nb; set_size_and_pinuse_of_inuse_chunk(m, p, nb); assert((char*)oldfirst > (char*)q); assert(pinuse(oldfirst)); assert(qsize >= MIN_CHUNK_SIZE); /* consolidate remainder with first chunk of old base */ if (oldfirst == m->top) { size_t tsize = m->topsize += qsize; m->top = q; q->head = tsize | PINUSE_BIT; check_top_chunk(m, q); } else if (oldfirst == m->dv) { size_t dsize = m->dvsize += qsize; m->dv = q; set_size_and_pinuse_of_free_chunk(q, dsize); } else { if (!cinuse(oldfirst)) { size_t nsize = chunksize(oldfirst); unlink_chunk(m, oldfirst, nsize); oldfirst = chunk_plus_offset(oldfirst, nsize); qsize += nsize; } set_free_with_pinuse(q, qsize, oldfirst); insert_chunk(m, q, qsize); check_free_chunk(m, q); } check_malloced_chunk(m, chunk2mem(p), nb); return chunk2mem(p); } /* Add a segment to hold a new noncontiguous region */ static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { /* Determine locations and sizes of segment, fenceposts, old top */ char* old_top = (char*)m->top; msegmentptr oldsp = segment_holding(m, old_top); char* old_end = oldsp->base + oldsp->size; size_t ssize = pad_request(sizeof(struct malloc_segment)); char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); size_t offset = align_offset(chunk2mem(rawsp)); char* asp = rawsp + offset; char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; mchunkptr sp = (mchunkptr)csp; msegmentptr ss = (msegmentptr)(chunk2mem(sp)); mchunkptr tnext = chunk_plus_offset(sp, ssize); mchunkptr p = tnext; int nfences = 0; /* reset top to new space */ init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); /* Set up segment record */ assert(is_aligned(ss)); set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); *ss = m->seg; /* Push current record */ m->seg.base = tbase; m->seg.size = tsize; set_segment_flags(&m->seg, mmapped); m->seg.next = ss; /* Insert trailing fenceposts */ for (;;) { mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); p->head = FENCEPOST_HEAD; ++nfences; if ((char*)(&(nextp->head)) < old_end) p = nextp; else break; } assert(nfences >= 2); /* Insert the rest of old top into a bin as an ordinary free chunk */ if (csp != old_top) { mchunkptr q = (mchunkptr)old_top; size_t psize = csp - old_top; mchunkptr tn = chunk_plus_offset(q, psize); set_free_with_pinuse(q, psize, tn); insert_chunk(m, q, psize); } check_top_chunk(m, m->top); } /* -------------------------- System allocation -------------------------- */ /* Get memory from system using MORECORE or MMAP */ static void* sys_alloc(mstate m, size_t nb) { char* tbase = CMFAIL; size_t tsize = 0; flag_t mmap_flag = 0; init_mparams(); /* Directly map large chunks */ if (use_mmap(m) && nb >= mparams.mmap_threshold) { void* mem = mmap_alloc(m, nb); if (mem != 0) return mem; } /* Try getting memory in any of three ways (in most-preferred to least-preferred order): 1. A call to MORECORE that can normally contiguously extend memory. (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or or main space is mmapped or a previous contiguous call failed) 2. A call to MMAP new space (disabled if not HAVE_MMAP). Note that under the default settings, if MORECORE is unable to fulfill a request, and HAVE_MMAP is true, then mmap is used as a noncontiguous system allocator. This is a useful backup strategy for systems with holes in address spaces -- in this case sbrk cannot contiguously expand the heap, but mmap may be able to find space. 3. A call to MORECORE that cannot usually contiguously extend memory. (disabled if not HAVE_MORECORE) */ if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { char* br = CMFAIL; msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); size_t asize = 0; ACQUIRE_MORECORE_LOCK(); if (ss == 0) { /* First time through or recovery */ char* base = (char*)CALL_MORECORE(0); if (base != CMFAIL) { asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); /* Adjust to end on a page boundary */ if (!is_page_aligned(base)) asize += (page_align((size_t)base) - (size_t)base); /* Can't call MORECORE if size is negative when treated as signed */ if (asize < HALF_MAX_SIZE_T && (br = (char*)(CALL_MORECORE(asize))) == base) { tbase = base; tsize = asize; } } } else { /* Subtract out existing available top space from MORECORE request. */ asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); /* Use mem here only if it did continuously extend old space */ if (asize < HALF_MAX_SIZE_T && (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { tbase = br; tsize = asize; } } if (tbase == CMFAIL) { /* Cope with partial failure */ if (br != CMFAIL) { /* Try to use/extend the space we did get */ if (asize < HALF_MAX_SIZE_T && asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); if (esize < HALF_MAX_SIZE_T) { char* end = (char*)CALL_MORECORE(esize); if (end != CMFAIL) asize += esize; else { /* Can't use; try to release */ (void)CALL_MORECORE(-asize); br = CMFAIL; } } } } if (br != CMFAIL) { /* Use the space we did get */ tbase = br; tsize = asize; } else disable_contiguous(m); /* Don't try contiguous path in the future */ } RELEASE_MORECORE_LOCK(); } if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; size_t rsize = granularity_align(req); if (rsize > nb) { /* Fail if wraps around zero */ char* mp = (char*)(CALL_MMAP(rsize)); if (mp != CMFAIL) { tbase = mp; tsize = rsize; mmap_flag = IS_MMAPPED_BIT; } } } if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); if (asize < HALF_MAX_SIZE_T) { char* br = CMFAIL; char* end = CMFAIL; ACQUIRE_MORECORE_LOCK(); br = (char*)(CALL_MORECORE(asize)); end = (char*)(CALL_MORECORE(0)); RELEASE_MORECORE_LOCK(); if (br != CMFAIL && end != CMFAIL && br < end) { size_t ssize = end - br; if (ssize > nb + TOP_FOOT_SIZE) { tbase = br; tsize = ssize; } } } } if (tbase != CMFAIL) { if ((m->footprint += tsize) > m->max_footprint) m->max_footprint = m->footprint; if (!is_initialized(m)) { /* first-time initialization */ m->seg.base = m->least_addr = tbase; m->seg.size = tsize; set_segment_flags(&m->seg, mmap_flag); m->magic = mparams.magic; init_bins(m); if (is_global(m)) init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); else { /* Offset top by embedded malloc_state */ mchunkptr mn = next_chunk(mem2chunk(m)); init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); } } else { /* Try to merge with an existing segment */ msegmentptr sp = &m->seg; while (sp != 0 && tbase != sp->base + sp->size) sp = sp->next; if (sp != 0 && !is_extern_segment(sp) && check_segment_merge(sp, tbase, tsize) && (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && segment_holds(sp, m->top)) { /* append */ sp->size += tsize; init_top(m, m->top, m->topsize + tsize); } else { if (tbase < m->least_addr) m->least_addr = tbase; sp = &m->seg; while (sp != 0 && sp->base != tbase + tsize) sp = sp->next; if (sp != 0 && !is_extern_segment(sp) && check_segment_merge(sp, tbase, tsize) && (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { char* oldbase = sp->base; sp->base = tbase; sp->size += tsize; return prepend_alloc(m, tbase, oldbase, nb); } else add_segment(m, tbase, tsize, mmap_flag); } } if (nb < m->topsize) { /* Allocate from new or extended top space */ size_t rsize = m->topsize -= nb; mchunkptr p = m->top; mchunkptr r = m->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(m, p, nb); check_top_chunk(m, m->top); check_malloced_chunk(m, chunk2mem(p), nb); return chunk2mem(p); } } MALLOC_FAILURE_ACTION; return 0; } /* ----------------------- system deallocation -------------------------- */ /* Unmap and unlink any mmapped segments that don't contain used chunks */ static size_t release_unused_segments(mstate m) { size_t released = 0; msegmentptr pred = &m->seg; msegmentptr sp = pred->next; while (sp != 0) { char* base = sp->base; size_t size = sp->size; msegmentptr next = sp->next; if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { mchunkptr p = align_as_chunk(base); size_t psize = chunksize(p); /* Can unmap if first chunk holds entire segment and not pinned */ if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { tchunkptr tp = (tchunkptr)p; assert(segment_holds(sp, (char*)sp)); if (p == m->dv) { m->dv = 0; m->dvsize = 0; } else { unlink_large_chunk(m, tp); } if (CALL_MUNMAP(base, size) == 0) { released += size; m->footprint -= size; /* unlink obsoleted record */ sp = pred; sp->next = next; } else { /* back out if cannot unmap */ insert_large_chunk(m, tp, psize); } } } pred = sp; sp = next; } return released; } static int sys_trim(mstate m, size_t pad) { size_t released = 0; if (pad < MAX_REQUEST && is_initialized(m)) { pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ if (m->topsize > pad) { /* Shrink top space in granularity-size units, keeping at least one */ size_t unit = mparams.granularity; size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - SIZE_T_ONE) * unit; msegmentptr sp = segment_holding(m, (char*)m->top); if (!is_extern_segment(sp)) { if (is_mmapped_segment(sp)) { if (HAVE_MMAP && sp->size >= extra && !has_segment_link(m, sp)) { /* can't shrink if pinned */ size_t newsize = sp->size - extra; /* Prefer mremap, fall back to munmap */ if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { released = extra; } } } else if (HAVE_MORECORE) { if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; ACQUIRE_MORECORE_LOCK(); { /* Make sure end of memory is where we last set it. */ char* old_br = (char*)(CALL_MORECORE(0)); if (old_br == sp->base + sp->size) { char* rel_br = (char*)(CALL_MORECORE(-extra)); char* new_br = (char*)(CALL_MORECORE(0)); if (rel_br != CMFAIL && new_br < old_br) released = old_br - new_br; } } RELEASE_MORECORE_LOCK(); } } if (released != 0) { sp->size -= released; m->footprint -= released; init_top(m, m->top, m->topsize - released); check_top_chunk(m, m->top); } } /* Unmap any unused mmapped segments */ if (HAVE_MMAP) released += release_unused_segments(m); /* On failure, disable autotrim to avoid repeated failed future calls */ if (released == 0) m->trim_check = MAX_SIZE_T; } return (released != 0)? 1 : 0; } /* ---------------------------- malloc support --------------------------- */ /* allocate a large request from the best fitting chunk in a treebin */ static void* tmalloc_large(mstate m, size_t nb) { tchunkptr v = 0; size_t rsize = -nb; /* Unsigned negation */ tchunkptr t; bindex_t idx; compute_tree_index(nb, idx); if ((t = *treebin_at(m, idx)) != 0) { /* Traverse tree for this bin looking for node with size == nb */ size_t sizebits = nb << leftshift_for_tree_index(idx); tchunkptr rst = 0; /* The deepest untaken right subtree */ for (;;) { tchunkptr rt; size_t trem = chunksize(t) - nb; if (trem < rsize) { v = t; if ((rsize = trem) == 0) break; } rt = t->child[1]; t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; if (rt != 0 && rt != t) rst = rt; if (t == 0) { t = rst; /* set t to least subtree holding sizes > nb */ break; } sizebits <<= 1; } } if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; if (leftbits != 0) { bindex_t i; binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); t = *treebin_at(m, i); } } while (t != 0) { /* find smallest of tree or subtree */ size_t trem = chunksize(t) - nb; if (trem < rsize) { rsize = trem; v = t; } t = leftmost_child(t); } /* If dv is a better fit, return 0 so malloc will use it */ if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { if (RTCHECK(ok_address(m, v))) { /* split */ mchunkptr r = chunk_plus_offset(v, nb); assert(chunksize(v) == rsize + nb); if (RTCHECK(ok_next(v, r))) { unlink_large_chunk(m, v); if (rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(m, v, (rsize + nb)); else { set_size_and_pinuse_of_inuse_chunk(m, v, nb); set_size_and_pinuse_of_free_chunk(r, rsize); insert_chunk(m, r, rsize); } return chunk2mem(v); } } CORRUPTION_ERROR_ACTION(m); } return 0; } /* allocate a small request from the best fitting chunk in a treebin */ static void* tmalloc_small(mstate m, size_t nb) { tchunkptr t, v; size_t rsize; bindex_t i; binmap_t leastbit = least_bit(m->treemap); compute_bit2idx(leastbit, i); v = t = *treebin_at(m, i); rsize = chunksize(t) - nb; while ((t = leftmost_child(t)) != 0) { size_t trem = chunksize(t) - nb; if (trem < rsize) { rsize = trem; v = t; } } if (RTCHECK(ok_address(m, v))) { mchunkptr r = chunk_plus_offset(v, nb); assert(chunksize(v) == rsize + nb); if (RTCHECK(ok_next(v, r))) { unlink_large_chunk(m, v); if (rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(m, v, (rsize + nb)); else { set_size_and_pinuse_of_inuse_chunk(m, v, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(m, r, rsize); } return chunk2mem(v); } } CORRUPTION_ERROR_ACTION(m); return 0; } /* --------------------------- realloc support --------------------------- */ static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { if (bytes >= MAX_REQUEST) { MALLOC_FAILURE_ACTION; return 0; } if (!PREACTION(m)) { mchunkptr oldp = mem2chunk(oldmem); size_t oldsize = chunksize(oldp); mchunkptr next = chunk_plus_offset(oldp, oldsize); mchunkptr newp = 0; void* extra = 0; /* Try to either shrink or extend into top. Else malloc-copy-free */ if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && ok_next(oldp, next) && ok_pinuse(next))) { size_t nb = request2size(bytes); if (is_mmapped(oldp)) newp = mmap_resize(m, oldp, nb); else if (oldsize >= nb) { /* already big enough */ size_t rsize = oldsize - nb; newp = oldp; if (rsize >= MIN_CHUNK_SIZE) { mchunkptr remainder = chunk_plus_offset(newp, nb); set_inuse(m, newp, nb); set_inuse(m, remainder, rsize); extra = chunk2mem(remainder); } } else if (next == m->top && oldsize + m->topsize > nb) { /* Expand into top */ size_t newsize = oldsize + m->topsize; size_t newtopsize = newsize - nb; mchunkptr newtop = chunk_plus_offset(oldp, nb); set_inuse(m, oldp, nb); newtop->head = newtopsize |PINUSE_BIT; m->top = newtop; m->topsize = newtopsize; newp = oldp; } } else { USAGE_ERROR_ACTION(m, oldmem); POSTACTION(m); return 0; } POSTACTION(m); if (newp != 0) { if (extra != 0) { internal_free(m, extra); } check_inuse_chunk(m, newp); return chunk2mem(newp); } else { void* newmem = internal_malloc(m, bytes); if (newmem != 0) { size_t oc = oldsize - overhead_for(oldp); memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); internal_free(m, oldmem); } return newmem; } } return 0; } /* --------------------------- memalign support -------------------------- */ static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ return internal_malloc(m, bytes); if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ alignment = MIN_CHUNK_SIZE; if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ size_t a = MALLOC_ALIGNMENT << 1; while (a < alignment) a <<= 1; alignment = a; } if (bytes >= MAX_REQUEST - alignment) { if (m != 0) { /* Test isn't needed but avoids compiler warning */ MALLOC_FAILURE_ACTION; } } else { size_t nb = request2size(bytes); size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; char* mem = (char*)internal_malloc(m, req); if (mem != 0) { void* leader = 0; void* trailer = 0; mchunkptr p = mem2chunk(mem); if (PREACTION(m)) return 0; if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ /* Find an aligned spot inside chunk. Since we need to give back leading space in a chunk of at least MIN_CHUNK_SIZE, if the first calculation places us at a spot with less than MIN_CHUNK_SIZE leader, we can move to the next aligned spot. We've allocated enough total room so that this is always possible. */ char* br = (char*)mem2chunk((size_t)(((size_t)(mem + alignment - SIZE_T_ONE)) & -alignment)); char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? br : br+alignment; mchunkptr newp = (mchunkptr)pos; size_t leadsize = pos - (char*)(p); size_t newsize = chunksize(p) - leadsize; if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ newp->prev_foot = p->prev_foot + leadsize; newp->head = (newsize|CINUSE_BIT); } else { /* Otherwise, give back leader, use the rest */ set_inuse(m, newp, newsize); set_inuse(m, p, leadsize); leader = chunk2mem(p); } p = newp; } /* Give back spare room at the end */ if (!is_mmapped(p)) { size_t size = chunksize(p); if (size > nb + MIN_CHUNK_SIZE) { size_t remainder_size = size - nb; mchunkptr remainder = chunk_plus_offset(p, nb); set_inuse(m, p, nb); set_inuse(m, remainder, remainder_size); trailer = chunk2mem(remainder); } } assert (chunksize(p) >= nb); assert((((size_t)(chunk2mem(p))) % alignment) == 0); check_inuse_chunk(m, p); POSTACTION(m); if (leader != 0) { internal_free(m, leader); } if (trailer != 0) { internal_free(m, trailer); } return chunk2mem(p); } } return 0; } /* ------------------------ comalloc/coalloc support --------------------- */ static void** ialloc(mstate m, size_t n_elements, size_t* sizes, int opts, void* chunks[]) { /* This provides common support for independent_X routines, handling all of the combinations that can result. The opts arg has: bit 0 set if all elements are same size (using sizes[0]) bit 1 set if elements should be zeroed */ size_t element_size; /* chunksize of each element, if all same */ size_t contents_size; /* total size of elements */ size_t array_size; /* request size of pointer array */ void* mem; /* malloced aggregate space */ mchunkptr p; /* corresponding chunk */ size_t remainder_size; /* remaining bytes while splitting */ void** marray; /* either "chunks" or malloced ptr array */ mchunkptr array_chunk; /* chunk for malloced ptr array */ flag_t was_enabled; /* to disable mmap */ size_t size; size_t i; /* compute array length, if needed */ if (chunks != 0) { if (n_elements == 0) return chunks; /* nothing to do */ marray = chunks; array_size = 0; } else { /* if empty req, must still return chunk representing empty array */ if (n_elements == 0) return (void**)internal_malloc(m, 0); marray = 0; array_size = request2size(n_elements * (sizeof(void*))); } /* compute total element size */ if (opts & 0x1) { /* all-same-size */ element_size = request2size(*sizes); contents_size = n_elements * element_size; } else { /* add up all the sizes */ element_size = 0; contents_size = 0; for (i = 0; i != n_elements; ++i) contents_size += request2size(sizes[i]); } size = contents_size + array_size; /* Allocate the aggregate chunk. First disable direct-mmapping so malloc won't use it, since we would not be able to later free/realloc space internal to a segregated mmap region. */ was_enabled = use_mmap(m); disable_mmap(m); mem = internal_malloc(m, size - CHUNK_OVERHEAD); if (was_enabled) enable_mmap(m); if (mem == 0) return 0; if (PREACTION(m)) return 0; p = mem2chunk(mem); remainder_size = chunksize(p); assert(!is_mmapped(p)); if (opts & 0x2) { /* optionally clear the elements */ memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); } /* If not provided, allocate the pointer array as final part of chunk */ if (marray == 0) { size_t array_chunk_size; array_chunk = chunk_plus_offset(p, contents_size); array_chunk_size = remainder_size - contents_size; marray = (void**) (chunk2mem(array_chunk)); set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); remainder_size = contents_size; } /* split out elements */ for (i = 0; ; ++i) { marray[i] = chunk2mem(p); if (i != n_elements-1) { if (element_size != 0) size = element_size; else size = request2size(sizes[i]); remainder_size -= size; set_size_and_pinuse_of_inuse_chunk(m, p, size); p = chunk_plus_offset(p, size); } else { /* the final element absorbs any overallocation slop */ set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); break; } } #if DEBUG if (marray != chunks) { /* final element must have exactly exhausted chunk */ if (element_size != 0) { assert(remainder_size == element_size); } else { assert(remainder_size == request2size(sizes[i])); } check_inuse_chunk(m, mem2chunk(marray)); } for (i = 0; i != n_elements; ++i) check_inuse_chunk(m, mem2chunk(marray[i])); #endif /* DEBUG */ POSTACTION(m); return marray; } /* -------------------------- public routines ---------------------------- */ #if !ONLY_MSPACES void* dlmalloc(size_t bytes) { /* Basic algorithm: If a small request (< 256 bytes minus per-chunk overhead): 1. If one exists, use a remainderless chunk in associated smallbin. (Remainderless means that there are too few excess bytes to represent as a chunk.) 2. If it is big enough, use the dv chunk, which is normally the chunk adjacent to the one used for the most recent small request. 3. If one exists, split the smallest available chunk in a bin, saving remainder in dv. 4. If it is big enough, use the top chunk. 5. If available, get memory from system and use it Otherwise, for a large request: 1. Find the smallest available binned chunk that fits, and use it if it is better fitting than dv chunk, splitting if necessary. 2. If better fitting than any binned chunk, use the dv chunk. 3. If it is big enough, use the top chunk. 4. If request size >= mmap threshold, try to directly mmap this chunk. 5. If available, get memory from system and use it The ugly goto's here ensure that postaction occurs along all paths. */ if (!PREACTION(gm)) { void* mem; size_t nb; if (bytes <= MAX_SMALL_REQUEST) { bindex_t idx; binmap_t smallbits; nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); idx = small_index(nb); smallbits = gm->smallmap >> idx; if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ mchunkptr b, p; idx += ~smallbits & 1; /* Uses next bin if idx empty */ b = smallbin_at(gm, idx); p = b->fd; assert(chunksize(p) == small_index2size(idx)); unlink_first_small_chunk(gm, b, p, idx); set_inuse_and_pinuse(gm, p, small_index2size(idx)); mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (nb > gm->dvsize) { if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ mchunkptr b, p, r; size_t rsize; bindex_t i; binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); b = smallbin_at(gm, i); p = b->fd; assert(chunksize(p) == small_index2size(i)); unlink_first_small_chunk(gm, b, p, i); rsize = small_index2size(i) - nb; /* Fit here cannot be remainderless if 4byte sizes */ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(gm, p, small_index2size(i)); else { set_size_and_pinuse_of_inuse_chunk(gm, p, nb); r = chunk_plus_offset(p, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(gm, r, rsize); } mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { check_malloced_chunk(gm, mem, nb); goto postaction; } } } else if (bytes >= MAX_REQUEST) nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ else { nb = pad_request(bytes); if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { check_malloced_chunk(gm, mem, nb); goto postaction; } } if (nb <= gm->dvsize) { size_t rsize = gm->dvsize - nb; mchunkptr p = gm->dv; if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ mchunkptr r = gm->dv = chunk_plus_offset(p, nb); gm->dvsize = rsize; set_size_and_pinuse_of_free_chunk(r, rsize); set_size_and_pinuse_of_inuse_chunk(gm, p, nb); } else { /* exhaust dv */ size_t dvs = gm->dvsize; gm->dvsize = 0; gm->dv = 0; set_inuse_and_pinuse(gm, p, dvs); } mem = chunk2mem(p); check_malloced_chunk(gm, mem, nb); goto postaction; } else if (nb < gm->topsize) { /* Split top */ size_t rsize = gm->topsize -= nb; mchunkptr p = gm->top; mchunkptr r = gm->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(gm, p, nb); mem = chunk2mem(p); check_top_chunk(gm, gm->top); check_malloced_chunk(gm, mem, nb); goto postaction; } mem = sys_alloc(gm, nb); postaction: POSTACTION(gm); return mem; } return 0; } void dlfree(void* mem) { /* Consolidate freed chunks with preceding or succeeding bordering free chunks, if they exist, and then place in a bin. Intermixed with special cases for top, dv, mmapped chunks, and usage errors. */ if (mem != 0) { mchunkptr p = mem2chunk(mem); #if FOOTERS mstate fm = get_mstate_for(p); if (!ok_magic(fm)) { USAGE_ERROR_ACTION(fm, p); return; } #else /* FOOTERS */ #define fm gm #endif /* FOOTERS */ if (!PREACTION(fm)) { check_inuse_chunk(fm, p); if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { size_t psize = chunksize(p); mchunkptr next = chunk_plus_offset(p, psize); if (!pinuse(p)) { size_t prevsize = p->prev_foot; if ((prevsize & IS_MMAPPED_BIT) != 0) { prevsize &= ~IS_MMAPPED_BIT; psize += prevsize + MMAP_FOOT_PAD; if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) fm->footprint -= psize; goto postaction; } else { mchunkptr prev = chunk_minus_offset(p, prevsize); psize += prevsize; p = prev; if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ if (p != fm->dv) { unlink_chunk(fm, p, prevsize); } else if ((next->head & INUSE_BITS) == INUSE_BITS) { fm->dvsize = psize; set_free_with_pinuse(p, psize, next); goto postaction; } } else goto erroraction; } } if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { if (!cinuse(next)) { /* consolidate forward */ if (next == fm->top) { size_t tsize = fm->topsize += psize; fm->top = p; p->head = tsize | PINUSE_BIT; if (p == fm->dv) { fm->dv = 0; fm->dvsize = 0; } if (should_trim(fm, tsize)) sys_trim(fm, 0); goto postaction; } else if (next == fm->dv) { size_t dsize = fm->dvsize += psize; fm->dv = p; set_size_and_pinuse_of_free_chunk(p, dsize); goto postaction; } else { size_t nsize = chunksize(next); psize += nsize; unlink_chunk(fm, next, nsize); set_size_and_pinuse_of_free_chunk(p, psize); if (p == fm->dv) { fm->dvsize = psize; goto postaction; } } } else set_free_with_pinuse(p, psize, next); insert_chunk(fm, p, psize); check_free_chunk(fm, p); goto postaction; } } erroraction: USAGE_ERROR_ACTION(fm, p); postaction: POSTACTION(fm); } } #if !FOOTERS #undef fm #endif /* FOOTERS */ } void* dlcalloc(size_t n_elements, size_t elem_size) { void* mem; size_t req = 0; if (n_elements != 0) { req = n_elements * elem_size; if (((n_elements | elem_size) & ~(size_t)0xffff) && (req / n_elements != elem_size)) req = MAX_SIZE_T; /* force downstream failure on overflow */ } mem = dlmalloc(req); if (mem != 0 && calloc_must_clear(mem2chunk(mem))) memset(mem, 0, req); return mem; } void* dlrealloc(void* oldmem, size_t bytes) { if (oldmem == 0) return dlmalloc(bytes); #ifdef REALLOC_ZERO_BYTES_FREES if (bytes == 0) { dlfree(oldmem); return 0; } #endif /* REALLOC_ZERO_BYTES_FREES */ else { #if ! FOOTERS mstate m = gm; #else /* FOOTERS */ mstate m = get_mstate_for(mem2chunk(oldmem)); if (!ok_magic(m)) { USAGE_ERROR_ACTION(m, oldmem); return 0; } #endif /* FOOTERS */ return internal_realloc(m, oldmem, bytes); } } void* dlmemalign(size_t alignment, size_t bytes) { return internal_memalign(gm, alignment, bytes); } void** dlindependent_calloc(size_t n_elements, size_t elem_size, void* chunks[]) { size_t sz = elem_size; /* serves as 1-element array */ return ialloc(gm, n_elements, &sz, 3, chunks); } void** dlindependent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]) { return ialloc(gm, n_elements, sizes, 0, chunks); } void* dlvalloc(size_t bytes) { size_t pagesz; init_mparams(); pagesz = mparams.page_size; return dlmemalign(pagesz, bytes); } void* dlpvalloc(size_t bytes) { size_t pagesz; init_mparams(); pagesz = mparams.page_size; return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); } int dlmalloc_trim(size_t pad) { int result = 0; if (!PREACTION(gm)) { result = sys_trim(gm, pad); POSTACTION(gm); } return result; } size_t dlmalloc_footprint(void) { return gm->footprint; } size_t dlmalloc_max_footprint(void) { return gm->max_footprint; } #if !NO_MALLINFO struct mallinfo dlmallinfo(void) { return internal_mallinfo(gm); } #endif /* NO_MALLINFO */ void dlmalloc_stats() { internal_malloc_stats(gm); } size_t dlmalloc_usable_size(void* mem) { if (mem != 0) { mchunkptr p = mem2chunk(mem); if (cinuse(p)) return chunksize(p) - overhead_for(p); } return 0; } int dlmallopt(int param_number, int value) { return change_mparam(param_number, value); } #endif /* !ONLY_MSPACES */ /* ----------------------------- user mspaces ---------------------------- */ #if MSPACES static mstate init_user_mstate(char* tbase, size_t tsize) { size_t msize = pad_request(sizeof(struct malloc_state)); mchunkptr mn; mchunkptr msp = align_as_chunk(tbase); mstate m = (mstate)(chunk2mem(msp)); memset(m, 0, msize); INITIAL_LOCK(&m->mutex); msp->head = (msize|PINUSE_BIT|CINUSE_BIT); m->seg.base = m->least_addr = tbase; m->seg.size = m->footprint = m->max_footprint = tsize; m->magic = mparams.magic; m->mflags = mparams.default_mflags; disable_contiguous(m); init_bins(m); mn = next_chunk(mem2chunk(m)); init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); check_top_chunk(m, m->top); return m; } mspace create_mspace(size_t capacity, int locked) { mstate m = 0; size_t msize = pad_request(sizeof(struct malloc_state)); init_mparams(); /* Ensure pagesize etc initialized */ if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { size_t rs = ((capacity == 0)? mparams.granularity : (capacity + TOP_FOOT_SIZE + msize)); size_t tsize = granularity_align(rs); char* tbase = (char*)(CALL_MMAP(tsize)); if (tbase != CMFAIL) { m = init_user_mstate(tbase, tsize); set_segment_flags(&m->seg, IS_MMAPPED_BIT); set_lock(m, locked); } } return (mspace)m; } mspace create_mspace_with_base(void* base, size_t capacity, int locked) { mstate m = 0; size_t msize = pad_request(sizeof(struct malloc_state)); init_mparams(); /* Ensure pagesize etc initialized */ if (capacity > msize + TOP_FOOT_SIZE && capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { m = init_user_mstate((char*)base, capacity); set_segment_flags(&m->seg, EXTERN_BIT); set_lock(m, locked); } return (mspace)m; } size_t destroy_mspace(mspace msp) { size_t freed = 0; mstate ms = (mstate)msp; if (ok_magic(ms)) { msegmentptr sp = &ms->seg; while (sp != 0) { char* base = sp->base; size_t size = sp->size; flag_t flag = get_segment_flags(sp); sp = sp->next; if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && CALL_MUNMAP(base, size) == 0) freed += size; } } else { USAGE_ERROR_ACTION(ms,ms); } return freed; } /* mspace versions of routines are near-clones of the global versions. This is not so nice but better than the alternatives. */ void* mspace_malloc(mspace msp, size_t bytes) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } if (!PREACTION(ms)) { void* mem; size_t nb; if (bytes <= MAX_SMALL_REQUEST) { bindex_t idx; binmap_t smallbits; nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); idx = small_index(nb); smallbits = ms->smallmap >> idx; if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ mchunkptr b, p; idx += ~smallbits & 1; /* Uses next bin if idx empty */ b = smallbin_at(ms, idx); p = b->fd; assert(chunksize(p) == small_index2size(idx)); unlink_first_small_chunk(ms, b, p, idx); set_inuse_and_pinuse(ms, p, small_index2size(idx)); mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (nb > ms->dvsize) { if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ mchunkptr b, p, r; size_t rsize; bindex_t i; binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); binmap_t leastbit = least_bit(leftbits); compute_bit2idx(leastbit, i); b = smallbin_at(ms, i); p = b->fd; assert(chunksize(p) == small_index2size(i)); unlink_first_small_chunk(ms, b, p, i); rsize = small_index2size(i) - nb; /* Fit here cannot be remainderless if 4byte sizes */ if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) set_inuse_and_pinuse(ms, p, small_index2size(i)); else { set_size_and_pinuse_of_inuse_chunk(ms, p, nb); r = chunk_plus_offset(p, nb); set_size_and_pinuse_of_free_chunk(r, rsize); replace_dv(ms, r, rsize); } mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { check_malloced_chunk(ms, mem, nb); goto postaction; } } } else if (bytes >= MAX_REQUEST) nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ else { nb = pad_request(bytes); if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { check_malloced_chunk(ms, mem, nb); goto postaction; } } if (nb <= ms->dvsize) { size_t rsize = ms->dvsize - nb; mchunkptr p = ms->dv; if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ mchunkptr r = ms->dv = chunk_plus_offset(p, nb); ms->dvsize = rsize; set_size_and_pinuse_of_free_chunk(r, rsize); set_size_and_pinuse_of_inuse_chunk(ms, p, nb); } else { /* exhaust dv */ size_t dvs = ms->dvsize; ms->dvsize = 0; ms->dv = 0; set_inuse_and_pinuse(ms, p, dvs); } mem = chunk2mem(p); check_malloced_chunk(ms, mem, nb); goto postaction; } else if (nb < ms->topsize) { /* Split top */ size_t rsize = ms->topsize -= nb; mchunkptr p = ms->top; mchunkptr r = ms->top = chunk_plus_offset(p, nb); r->head = rsize | PINUSE_BIT; set_size_and_pinuse_of_inuse_chunk(ms, p, nb); mem = chunk2mem(p); check_top_chunk(ms, ms->top); check_malloced_chunk(ms, mem, nb); goto postaction; } mem = sys_alloc(ms, nb); postaction: POSTACTION(ms); return mem; } return 0; } void mspace_free(mspace msp, void* mem) { if (mem != 0) { mchunkptr p = mem2chunk(mem); #if FOOTERS mstate fm = get_mstate_for(p); #else /* FOOTERS */ mstate fm = (mstate)msp; #endif /* FOOTERS */ if (!ok_magic(fm)) { USAGE_ERROR_ACTION(fm, p); return; } if (!PREACTION(fm)) { check_inuse_chunk(fm, p); if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { size_t psize = chunksize(p); mchunkptr next = chunk_plus_offset(p, psize); if (!pinuse(p)) { size_t prevsize = p->prev_foot; if ((prevsize & IS_MMAPPED_BIT) != 0) { prevsize &= ~IS_MMAPPED_BIT; psize += prevsize + MMAP_FOOT_PAD; if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) fm->footprint -= psize; goto postaction; } else { mchunkptr prev = chunk_minus_offset(p, prevsize); psize += prevsize; p = prev; if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ if (p != fm->dv) { unlink_chunk(fm, p, prevsize); } else if ((next->head & INUSE_BITS) == INUSE_BITS) { fm->dvsize = psize; set_free_with_pinuse(p, psize, next); goto postaction; } } else goto erroraction; } } if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { if (!cinuse(next)) { /* consolidate forward */ if (next == fm->top) { size_t tsize = fm->topsize += psize; fm->top = p; p->head = tsize | PINUSE_BIT; if (p == fm->dv) { fm->dv = 0; fm->dvsize = 0; } if (should_trim(fm, tsize)) sys_trim(fm, 0); goto postaction; } else if (next == fm->dv) { size_t dsize = fm->dvsize += psize; fm->dv = p; set_size_and_pinuse_of_free_chunk(p, dsize); goto postaction; } else { size_t nsize = chunksize(next); psize += nsize; unlink_chunk(fm, next, nsize); set_size_and_pinuse_of_free_chunk(p, psize); if (p == fm->dv) { fm->dvsize = psize; goto postaction; } } } else set_free_with_pinuse(p, psize, next); insert_chunk(fm, p, psize); check_free_chunk(fm, p); goto postaction; } } erroraction: USAGE_ERROR_ACTION(fm, p); postaction: POSTACTION(fm); } } } void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { void* mem; size_t req = 0; mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } if (n_elements != 0) { req = n_elements * elem_size; if (((n_elements | elem_size) & ~(size_t)0xffff) && (req / n_elements != elem_size)) req = MAX_SIZE_T; /* force downstream failure on overflow */ } mem = internal_malloc(ms, req); if (mem != 0 && calloc_must_clear(mem2chunk(mem))) memset(mem, 0, req); return mem; } void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { if (oldmem == 0) return mspace_malloc(msp, bytes); #ifdef REALLOC_ZERO_BYTES_FREES if (bytes == 0) { mspace_free(msp, oldmem); return 0; } #endif /* REALLOC_ZERO_BYTES_FREES */ else { #if FOOTERS mchunkptr p = mem2chunk(oldmem); mstate ms = get_mstate_for(p); #else /* FOOTERS */ mstate ms = (mstate)msp; #endif /* FOOTERS */ if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return internal_realloc(ms, oldmem, bytes); } } void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return internal_memalign(ms, alignment, bytes); } void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]) { size_t sz = elem_size; /* serves as 1-element array */ mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return ialloc(ms, n_elements, &sz, 3, chunks); } void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); return 0; } return ialloc(ms, n_elements, sizes, 0, chunks); } int mspace_trim(mspace msp, size_t pad) { int result = 0; mstate ms = (mstate)msp; if (ok_magic(ms)) { if (!PREACTION(ms)) { result = sys_trim(ms, pad); POSTACTION(ms); } } else { USAGE_ERROR_ACTION(ms,ms); } return result; } void mspace_malloc_stats(mspace msp) { mstate ms = (mstate)msp; if (ok_magic(ms)) { internal_malloc_stats(ms); } else { USAGE_ERROR_ACTION(ms,ms); } } size_t mspace_footprint(mspace msp) { size_t result; mstate ms = (mstate)msp; if (ok_magic(ms)) { result = ms->footprint; } USAGE_ERROR_ACTION(ms,ms); return result; } size_t mspace_max_footprint(mspace msp) { size_t result; mstate ms = (mstate)msp; if (ok_magic(ms)) { result = ms->max_footprint; } USAGE_ERROR_ACTION(ms,ms); return result; } #if !NO_MALLINFO struct mallinfo mspace_mallinfo(mspace msp) { mstate ms = (mstate)msp; if (!ok_magic(ms)) { USAGE_ERROR_ACTION(ms,ms); } return internal_mallinfo(ms); } #endif /* NO_MALLINFO */ int mspace_mallopt(int param_number, int value) { return change_mparam(param_number, value); } #endif /* MSPACES */ /* -------------------- Alternative MORECORE functions ------------------- */ /* Guidelines for creating a custom version of MORECORE: * For best performance, MORECORE should allocate in multiples of pagesize. * MORECORE may allocate more memory than requested. (Or even less, but this will usually result in a malloc failure.) * MORECORE must not allocate memory when given argument zero, but instead return one past the end address of memory from previous nonzero call. * For best performance, consecutive calls to MORECORE with positive arguments should return increasing addresses, indicating that space has been contiguously extended. * Even though consecutive calls to MORECORE need not return contiguous addresses, it must be OK for malloc'ed chunks to span multiple regions in those cases where they do happen to be contiguous. * MORECORE need not handle negative arguments -- it may instead just return MFAIL when given negative arguments. Negative arguments are always multiples of pagesize. MORECORE must not misinterpret negative args as large positive unsigned args. You can suppress all such calls from even occurring by defining MORECORE_CANNOT_TRIM, As an example alternative MORECORE, here is a custom allocator kindly contributed for pre-OSX macOS. It uses virtually but not necessarily physically contiguous non-paged memory (locked in, present and won't get swapped out). You can use it by uncommenting this section, adding some #includes, and setting up the appropriate defines above: #define MORECORE osMoreCore There is also a shutdown routine that should somehow be called for cleanup upon program exit. #define MAX_POOL_ENTRIES 100 #define MINIMUM_MORECORE_SIZE (64 * 1024U) static int next_os_pool; void *our_os_pools[MAX_POOL_ENTRIES]; void *osMoreCore(int size) { void *ptr = 0; static void *sbrk_top = 0; if (size > 0) { if (size < MINIMUM_MORECORE_SIZE) size = MINIMUM_MORECORE_SIZE; if (CurrentExecutionLevel() == kTaskLevel) ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); if (ptr == 0) { return (void *) MFAIL; } // save ptrs so they can be freed during cleanup our_os_pools[next_os_pool] = ptr; next_os_pool++; ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); sbrk_top = (char *) ptr + size; return ptr; } else if (size < 0) { // we don't currently support shrink behavior return (void *) MFAIL; } else { return sbrk_top; } } // cleanup any allocated memory pools // called as last thing before shutting down driver void osCleanupMem(void) { void **ptr; for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) if (*ptr) { PoolDeallocate(*ptr); *ptr = 0; } } */ /* ----------------------------------------------------------------------- History: V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) * Add max_footprint functions * Ensure all appropriate literals are size_t * Fix conditional compilation problem for some #define settings * Avoid concatenating segments with the one provided in create_mspace_with_base * Rename some variables to avoid compiler shadowing warnings * Use explicit lock initialization. * Better handling of sbrk interference. * Simplify and fix segment insertion, trimming and mspace_destroy * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x * Thanks especially to Dennis Flanagan for help on these. V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) * Fix memalign brace error. V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) * Fix improper #endif nesting in C++ * Add explicit casts needed for C++ V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) * Use trees for large bins * Support mspaces * Use segments to unify sbrk-based and mmap-based system allocation, removing need for emulation on most platforms without sbrk. * Default safety checks * Optional footer checks. Thanks to William Robertson for the idea. * Internal code refactoring * Incorporate suggestions and platform-specific changes. Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, Aaron Bachmann, Emery Berger, and others. * Speed up non-fastbin processing enough to remove fastbins. * Remove useless cfree() to avoid conflicts with other apps. * Remove internal memcpy, memset. Compilers handle builtins better. * Remove some options that no one ever used and rename others. V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) * Fix malloc_state bitmap array misdeclaration V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) * Allow tuning of FIRST_SORTED_BIN_SIZE * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. * Better detection and support for non-contiguousness of MORECORE. Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger * Bypass most of malloc if no frees. Thanks To Emery Berger. * Fix freeing of old top non-contiguous chunk im sysmalloc. * Raised default trim and map thresholds to 256K. * Fix mmap-related #defines. Thanks to Lubos Lunak. * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. * Branch-free bin calculation * Default trim and mmap thresholds now 256K. V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) * Introduce independent_comalloc and independent_calloc. Thanks to Michael Pachos for motivation and help. * Make optional .h file available * Allow > 2GB requests on 32bit systems. * new WIN32 sbrk, mmap, munmap, lock code from . Thanks also to Andreas Mueller , and Anonymous. * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for helping test this.) * memalign: check alignment arg * realloc: don't try to shift chunks backwards, since this leads to more fragmentation in some programs and doesn't seem to help in any others. * Collect all cases in malloc requiring system memory into sysmalloc * Use mmap as backup to sbrk * Place all internal state in malloc_state * Introduce fastbins (although similar to 2.5.1) * Many minor tunings and cosmetic improvements * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS Thanks to Tony E. Bennett and others. * Include errno.h to support default failure action. V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) * return null for negative arguments * Added Several WIN32 cleanups from Martin C. Fong * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' (e.g. WIN32 platforms) * Cleanup header file inclusion for WIN32 platforms * Cleanup code to avoid Microsoft Visual C++ compiler complaints * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing memory allocation routines * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to usage of 'assert' in non-WIN32 code * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to avoid infinite loop * Always call 'fREe()' rather than 'free()' V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) * Fixed ordering problem with boundary-stamping V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) * Added pvalloc, as recommended by H.J. Liu * Added 64bit pointer support mainly from Wolfram Gloger * Added anonymously donated WIN32 sbrk emulation * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen * malloc_extend_top: fix mask error that caused wastage after foreign sbrks * Add linux mremap support code from HJ Liu V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) * Integrated most documentation with the code. * Add support for mmap, with help from Wolfram Gloger (Gloger@lrz.uni-muenchen.de). * Use last_remainder in more cases. * Pack bins using idea from colin@nyx10.cs.du.edu * Use ordered bins instead of best-fit threshhold * Eliminate block-local decls to simplify tracing and debugging. * Support another case of realloc via move into top * Fix error occuring when initial sbrk_base not word-aligned. * Rely on page size for units instead of SBRK_UNIT to avoid surprises about sbrk alignment conventions. * Add mallinfo, mallopt. Thanks to Raymond Nijssen (raymond@es.ele.tue.nl) for the suggestion. * Add `pad' argument to malloc_trim and top_pad mallopt parameter. * More precautions for cases where other routines call sbrk, courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). * Added macros etc., allowing use in linux libc from H.J. Lu (hjl@gnu.ai.mit.edu) * Inverted this history list V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) * Re-tuned and fixed to behave more nicely with V2.6.0 changes. * Removed all preallocation code since under current scheme the work required to undo bad preallocations exceeds the work saved in good cases for most test programs. * No longer use return list or unconsolidated bins since no scheme using them consistently outperforms those that don't given above changes. * Use best fit for very large chunks to prevent some worst-cases. * Added some support for debugging V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) * Removed footers when chunks are in use. Thanks to Paul Wilson (wilson@cs.texas.edu) for the suggestion. V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) * Added malloc_trim, with help from Wolfram Gloger (wmglo@Dent.MED.Uni-Muenchen.DE). V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) * realloc: try to expand in both directions * malloc: swap order of clean-bin strategy; * realloc: only conditionally expand backwards * Try not to scavenge used bins * Use bin counts as a guide to preallocation * Occasionally bin return list chunks in first scan * Add a few optimizations from colin@nyx10.cs.du.edu V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) * faster bin computation & slightly different binning * merged all consolidations to one part of malloc proper (eliminating old malloc_find_space & malloc_clean_bin) * Scan 2 returns chunks (not just 1) * Propagate failure in realloc if malloc returns 0 * Add stuff to allow compilation on non-ANSI compilers from kpv@research.att.com V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) * removed potential for odd address access in prev_chunk * removed dependency on getpagesize.h * misc cosmetics and a bit more internal documentation * anticosmetics: mangled names in macros to evade debugger strangeness * tested on sparc, hp-700, dec-mips, rs6000 with gcc & native cc (hp, dec only) allowing Detlefs & Zorn comparison study (in SIGPLAN Notices.) Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) * Based loosely on libg++-1.2X malloc. (It retains some of the overall structure of old version, but most details differ.) */ polyml-5.6/libffi/src/frv/000077500000000000000000000000001265146633400155315ustar00rootroot00000000000000polyml-5.6/libffi/src/frv/eabi.S000066400000000000000000000065261265146633400165660ustar00rootroot00000000000000/* ----------------------------------------------------------------------- eabi.S - Copyright (c) 2004 Anthony Green FR-V Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .globl ffi_prep_args_EABI .text .p2align 4 .globl ffi_call_EABI .type ffi_call_EABI, @function # gr8 : ffi_prep_args # gr9 : &ecif # gr10: cif->bytes # gr11: fig->flags # gr12: ecif.rvalue # gr13: fn ffi_call_EABI: addi sp, #-80, sp sti fp, @(sp, #24) addi sp, #24, fp movsg lr, gr5 /* Make room for the new arguments. */ /* subi sp, fp, gr10 */ /* Store return address and incoming args on stack. */ sti gr5, @(fp, #8) sti gr8, @(fp, #-4) sti gr9, @(fp, #-8) sti gr10, @(fp, #-12) sti gr11, @(fp, #-16) sti gr12, @(fp, #-20) sti gr13, @(fp, #-24) sub sp, gr10, sp /* Call ffi_prep_args. */ ldi @(fp, #-4), gr4 addi sp, #0, gr8 ldi @(fp, #-8), gr9 #ifdef __FRV_FDPIC__ ldd @(gr4, gr0), gr14 calll @(gr14, gr0) #else calll @(gr4, gr0) #endif /* ffi_prep_args returns the new stack pointer. */ mov gr8, gr4 ldi @(sp, #0), gr8 ldi @(sp, #4), gr9 ldi @(sp, #8), gr10 ldi @(sp, #12), gr11 ldi @(sp, #16), gr12 ldi @(sp, #20), gr13 /* Always copy the return value pointer into the hidden parameter register. This is only strictly necessary when we're returning an aggregate type, but it doesn't hurt to do this all the time, and it saves a branch. */ ldi @(fp, #-20), gr3 /* Use the ffi_prep_args return value for the new sp. */ mov gr4, sp /* Call the target function. */ ldi @(fp, -24), gr4 #ifdef __FRV_FDPIC__ ldd @(gr4, gr0), gr14 calll @(gr14, gr0) #else calll @(gr4, gr0) #endif /* Store the result. */ ldi @(fp, #-16), gr10 /* fig->flags */ ldi @(fp, #-20), gr4 /* ecif.rvalue */ /* Is the return value stored in two registers? */ cmpi gr10, #8, icc0 bne icc0, 0, .L2 /* Yes, save them. */ sti gr8, @(gr4, #0) sti gr9, @(gr4, #4) bra .L3 .L2: /* Is the return value a structure? */ cmpi gr10, #-1, icc0 beq icc0, 0, .L3 /* No, save a 4 byte return value. */ sti gr8, @(gr4, #0) .L3: /* Restore the stack, and return. */ ldi @(fp, 8), gr5 ld @(fp, gr0), fp addi sp,#80,sp jmpl @(gr5,gr0) .size ffi_call_EABI, .-ffi_call_EABI polyml-5.6/libffi/src/frv/ffi.c000066400000000000000000000204001265146633400164350ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (C) 2004 Anthony Green Copyright (C) 2007 Free Software Foundation, Inc. Copyright (C) 2008 Red Hat, Inc. FR-V Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void *ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; register int count = 0; p_argv = ecif->avalue; argp = stack; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++) { size_t z; z = (*p_arg)->size; if ((*p_arg)->type == FFI_TYPE_STRUCT) { z = sizeof(void*); *(void **) argp = *p_argv; } /* if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (count > 24) { // This is going on the stack. Turn it into a double. *(double *) argp = (double) *(float*)(* p_argv); z = sizeof(double); } else *(void **) argp = *(void **)(* p_argv); } */ else if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; default: FFI_ASSERT(0); } } else if (z == sizeof(int)) { *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); } else { memcpy(argp, *p_argv, z); } p_argv++; argp += z; count += z; } return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { if (cif->rtype->type == FFI_TYPE_STRUCT) cif->flags = -1; else cif->flags = cif->rtype->size; cif->bytes = ALIGN (cif->bytes, 8); return FFI_OK; } extern void ffi_call_EABI(void *(*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_EABI: ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } } void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, unsigned arg4, unsigned arg5, unsigned arg6) { /* This function is called by a trampoline. The trampoline stows a pointer to the ffi_closure object in gr7. We must save this pointer in a place that will persist while we do our work. */ register ffi_closure *creg __asm__ ("gr7"); ffi_closure *closure = creg; /* Arguments that don't fit in registers are found on the stack at a fixed offset above the current frame pointer. */ register char *frame_pointer __asm__ ("fp"); char *stack_args = frame_pointer + 16; /* Lay the register arguments down in a continuous chunk of memory. */ unsigned register_args[6] = { arg1, arg2, arg3, arg4, arg5, arg6 }; ffi_cif *cif = closure->cif; ffi_type **arg_types = cif->arg_types; void **avalue = alloca (cif->nargs * sizeof(void *)); char *ptr = (char *) register_args; int i; /* Find the address of each argument. */ for (i = 0; i < cif->nargs; i++) { switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = ptr + 3; break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = ptr + 2; break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_FLOAT: avalue[i] = ptr; break; case FFI_TYPE_STRUCT: avalue[i] = *(void**)ptr; break; default: /* This is an 8-byte value. */ avalue[i] = ptr; ptr += 4; break; } ptr += 4; /* If we've handled more arguments than fit in registers, start looking at the those passed on the stack. */ if (ptr == ((char *)register_args + (6*4))) ptr = stack_args; } /* Invoke the closure. */ if (cif->rtype->type == FFI_TYPE_STRUCT) { /* The caller allocates space for the return structure, and passes a pointer to this space in gr3. Use this value directly as the return value. */ register void *return_struct_ptr __asm__("gr3"); (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data); } else { /* Allocate space for the return value and call the function. */ long long rvalue; (closure->fun) (cif, &rvalue, avalue, closure->user_data); /* Functions return 4-byte or smaller results in gr8. 8-byte values also use gr9. We fill the both, even for small return values, just to avoid a branch. */ asm ("ldi @(%0, #0), gr8" : : "r" (&rvalue)); asm ("ldi @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1])); } } ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp = (unsigned int *) &closure->tramp[0]; unsigned long fn = (long) ffi_closure_eabi; unsigned long cls = (long) codeloc; #ifdef __FRV_FDPIC__ register void *got __asm__("gr15"); #endif int i; fn = (unsigned long) ffi_closure_eabi; #ifdef __FRV_FDPIC__ tramp[0] = &((unsigned int *)codeloc)[2]; tramp[1] = got; tramp[2] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ tramp[4] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ tramp[5] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ tramp[6] = 0x9cc86000; /* ldi @(gr6, #0), gr14 */ tramp[7] = 0x8030e000; /* jmpl @(gr14, gr0) */ #else tramp[0] = 0x8cfc0000 + (fn & 0xffff); /* setlos lo(fn), gr6 */ tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7 */ tramp[2] = 0x8cf80000 + (fn >> 16); /* sethi hi(fn), gr6 */ tramp[3] = 0x8ef80000 + (cls >> 16); /* sethi hi(cls), gr7 */ tramp[4] = 0x80300006; /* jmpl @(gr0, gr6) */ #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; /* Cache flushing. */ for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++) __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i), "r" (codeloc)); return FFI_OK; } polyml-5.6/libffi/src/frv/ffitarget.h000066400000000000000000000042161265146633400176600ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2004 Red Hat, Inc. Target configuration macros for FR-V Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- System specific configurations ----------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_EABI, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_EABI } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 #ifdef __FRV_FDPIC__ /* Trampolines are 8 4-byte instructions long. */ #define FFI_TRAMPOLINE_SIZE (8*4) #else /* Trampolines are 5 4-byte instructions long. */ #define FFI_TRAMPOLINE_SIZE (5*4) #endif #endif polyml-5.6/libffi/src/ia64/000077500000000000000000000000001265146633400154775ustar00rootroot00000000000000polyml-5.6/libffi/src/ia64/ffi.c000066400000000000000000000361421265146633400164150ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. Copyright (c) 2000 Hewlett Packard Company Copyright (c) 2011 Anthony Green IA64 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include #include #include "ia64_flags.h" /* A 64-bit pointer value. In LP64 mode, this is effectively a plain pointer. In ILP32 mode, it's a pointer that's been extended to 64 bits by "addp4". */ typedef void *PTR64 __attribute__((mode(DI))); /* Memory image of fp register contents. This is the implementation specific format used by ldf.fill/stf.spill. All we care about is that it wants a 16 byte aligned slot. */ typedef struct { UINT64 x[2] __attribute__((aligned(16))); } fpreg; /* The stack layout given to ffi_call_unix and ffi_closure_unix_inner. */ struct ia64_args { fpreg fp_regs[8]; /* Contents of 8 fp arg registers. */ UINT64 gp_regs[8]; /* Contents of 8 gp arg registers. */ UINT64 other_args[]; /* Arguments passed on stack, variable size. */ }; /* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes. */ static inline void * endian_adjust (void *addr, size_t len) { #ifdef __BIG_ENDIAN__ return addr + (8 - len); #else return addr; #endif } /* Store VALUE to ADDR in the current cpu implementation's fp spill format. This is a macro instead of a function, so that it works for all 3 floating point types without type conversions. Type conversion to long double breaks the denorm support. */ #define stf_spill(addr, value) \ asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value)); /* Load a value from ADDR, which is in the current cpu implementation's fp spill format. As above, this must also be a macro. */ #define ldf_fill(result, addr) \ asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr)); /* Return the size of the C type associated with with TYPE. Which will be one of the FFI_IA64_TYPE_HFA_* values. */ static size_t hfa_type_size (int type) { switch (type) { case FFI_IA64_TYPE_HFA_FLOAT: return sizeof(float); case FFI_IA64_TYPE_HFA_DOUBLE: return sizeof(double); case FFI_IA64_TYPE_HFA_LDOUBLE: return sizeof(__float80); default: abort (); } } /* Load from ADDR a value indicated by TYPE. Which will be one of the FFI_IA64_TYPE_HFA_* values. */ static void hfa_type_load (fpreg *fpaddr, int type, void *addr) { switch (type) { case FFI_IA64_TYPE_HFA_FLOAT: stf_spill (fpaddr, *(float *) addr); return; case FFI_IA64_TYPE_HFA_DOUBLE: stf_spill (fpaddr, *(double *) addr); return; case FFI_IA64_TYPE_HFA_LDOUBLE: stf_spill (fpaddr, *(__float80 *) addr); return; default: abort (); } } /* Load VALUE into ADDR as indicated by TYPE. Which will be one of the FFI_IA64_TYPE_HFA_* values. */ static void hfa_type_store (int type, void *addr, fpreg *fpaddr) { switch (type) { case FFI_IA64_TYPE_HFA_FLOAT: { float result; ldf_fill (result, fpaddr); *(float *) addr = result; break; } case FFI_IA64_TYPE_HFA_DOUBLE: { double result; ldf_fill (result, fpaddr); *(double *) addr = result; break; } case FFI_IA64_TYPE_HFA_LDOUBLE: { __float80 result; ldf_fill (result, fpaddr); *(__float80 *) addr = result; break; } default: abort (); } } /* Is TYPE a struct containing floats, doubles, or extended doubles, all of the same fp type? If so, return the element type. Return FFI_TYPE_VOID if not. */ static int hfa_element_type (ffi_type *type, int nested) { int element = FFI_TYPE_VOID; switch (type->type) { case FFI_TYPE_FLOAT: /* We want to return VOID for raw floating-point types, but the synthetic HFA type if we're nested within an aggregate. */ if (nested) element = FFI_IA64_TYPE_HFA_FLOAT; break; case FFI_TYPE_DOUBLE: /* Similarly. */ if (nested) element = FFI_IA64_TYPE_HFA_DOUBLE; break; case FFI_TYPE_LONGDOUBLE: /* Similarly, except that that HFA is true for double extended, but not quad precision. Both have sizeof == 16, so tell the difference based on the precision. */ if (LDBL_MANT_DIG == 64 && nested) element = FFI_IA64_TYPE_HFA_LDOUBLE; break; case FFI_TYPE_STRUCT: { ffi_type **ptr = &type->elements[0]; for (ptr = &type->elements[0]; *ptr ; ptr++) { int sub_element = hfa_element_type (*ptr, 1); if (sub_element == FFI_TYPE_VOID) return FFI_TYPE_VOID; if (element == FFI_TYPE_VOID) element = sub_element; else if (element != sub_element) return FFI_TYPE_VOID; } } break; default: return FFI_TYPE_VOID; } return element; } /* Perform machine dependent cif processing. */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { int flags; /* Adjust cif->bytes to include space for the bits of the ia64_args frame that precedes the integer register portion. The estimate that the generic bits did for the argument space required is good enough for the integer component. */ cif->bytes += offsetof(struct ia64_args, gp_regs[0]); if (cif->bytes < sizeof(struct ia64_args)) cif->bytes = sizeof(struct ia64_args); /* Set the return type flag. */ flags = cif->rtype->type; switch (cif->rtype->type) { case FFI_TYPE_LONGDOUBLE: /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision, and encode quad precision as a two-word integer structure. */ if (LDBL_MANT_DIG != 64) flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8); break; case FFI_TYPE_STRUCT: { size_t size = cif->rtype->size; int hfa_type = hfa_element_type (cif->rtype, 0); if (hfa_type != FFI_TYPE_VOID) { size_t nelts = size / hfa_type_size (hfa_type); if (nelts <= 8) flags = hfa_type | (size << 8); } else { if (size <= 32) flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8); } } break; default: break; } cif->flags = flags; return FFI_OK; } extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { struct ia64_args *stack; long i, avn, gpcount, fpcount; ffi_type **p_arg; FFI_ASSERT (cif->abi == FFI_UNIX); /* If we have no spot for a return value, make one. */ if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID) rvalue = alloca (cif->rtype->size); /* Allocate the stack frame. */ stack = alloca (cif->bytes); gpcount = fpcount = 0; avn = cif->nargs; for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) { switch ((*p_arg)->type) { case FFI_TYPE_SINT8: stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i]; break; case FFI_TYPE_UINT8: stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i]; break; case FFI_TYPE_SINT16: stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i]; break; case FFI_TYPE_UINT16: stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i]; break; case FFI_TYPE_SINT32: stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i]; break; case FFI_TYPE_UINT32: stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i]; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i]; break; case FFI_TYPE_POINTER: stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i]; break; case FFI_TYPE_FLOAT: if (gpcount < 8 && fpcount < 8) stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]); { UINT32 tmp; memcpy (&tmp, avalue[i], sizeof (UINT32)); stack->gp_regs[gpcount++] = tmp; } break; case FFI_TYPE_DOUBLE: if (gpcount < 8 && fpcount < 8) stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); break; case FFI_TYPE_LONGDOUBLE: if (gpcount & 1) gpcount++; if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]); memcpy (&stack->gp_regs[gpcount], avalue[i], 16); gpcount += 2; break; case FFI_TYPE_STRUCT: { size_t size = (*p_arg)->size; size_t align = (*p_arg)->alignment; int hfa_type = hfa_element_type (*p_arg, 0); FFI_ASSERT (align <= 16); if (align == 16 && (gpcount & 1)) gpcount++; if (hfa_type != FFI_TYPE_VOID) { size_t hfa_size = hfa_type_size (hfa_type); size_t offset = 0; size_t gp_offset = gpcount * 8; while (fpcount < 8 && offset < size && gp_offset < 8 * 8) { hfa_type_load (&stack->fp_regs[fpcount], hfa_type, avalue[i] + offset); offset += hfa_size; gp_offset += hfa_size; fpcount += 1; } } memcpy (&stack->gp_regs[gpcount], avalue[i], size); gpcount += (size + 7) / 8; } break; default: abort (); } } ffi_call_unix (stack, rvalue, fn, cif->flags); } /* Closures represent a pair consisting of a function pointer, and some user data. A closure is invoked by reinterpreting the closure as a function pointer, and branching to it. Thus we can make an interpreted function callable as a C function: We turn the interpreter itself, together with a pointer specifying the interpreted procedure, into a closure. For IA64, function pointer are already pairs consisting of a code pointer, and a gp pointer. The latter is needed to access global variables. Here we set up such a pair as the first two words of the closure (in the "trampoline" area), but we replace the gp pointer with a pointer to the closure itself. We also add the real gp pointer to the closure. This allows the function entry code to both retrieve the user data, and to restire the correct gp pointer. */ extern void ffi_closure_unix (); ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { /* The layout of a function descriptor. A C function pointer really points to one of these. */ struct ia64_fd { UINT64 code_pointer; UINT64 gp; }; struct ffi_ia64_trampoline_struct { UINT64 code_pointer; /* Pointer to ffi_closure_unix. */ UINT64 fake_gp; /* Pointer to closure, installed as gp. */ UINT64 real_gp; /* Real gp value. */ }; struct ffi_ia64_trampoline_struct *tramp; struct ia64_fd *fd; if (cif->abi != FFI_UNIX) return FFI_BAD_ABI; tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp; fd = (struct ia64_fd *)(void *)ffi_closure_unix; tramp->code_pointer = fd->code_pointer; tramp->real_gp = fd->gp; tramp->fake_gp = (UINT64)(PTR64)codeloc; closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } UINT64 ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack, void *rvalue, void *r8) { ffi_cif *cif; void **avalue; ffi_type **p_arg; long i, avn, gpcount, fpcount; cif = closure->cif; avn = cif->nargs; avalue = alloca (avn * sizeof (void *)); /* If the structure return value is passed in memory get that location from r8 so as to pass the value directly back to the caller. */ if (cif->flags == FFI_TYPE_STRUCT) rvalue = r8; gpcount = fpcount = 0; for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) { switch ((*p_arg)->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1); break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2); break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4); break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: avalue[i] = &stack->gp_regs[gpcount++]; break; case FFI_TYPE_POINTER: avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*)); break; case FFI_TYPE_FLOAT: if (gpcount < 8 && fpcount < 8) { fpreg *addr = &stack->fp_regs[fpcount++]; float result; avalue[i] = addr; ldf_fill (result, addr); *(float *)addr = result; } else avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4); gpcount++; break; case FFI_TYPE_DOUBLE: if (gpcount < 8 && fpcount < 8) { fpreg *addr = &stack->fp_regs[fpcount++]; double result; avalue[i] = addr; ldf_fill (result, addr); *(double *)addr = result; } else avalue[i] = &stack->gp_regs[gpcount]; gpcount++; break; case FFI_TYPE_LONGDOUBLE: if (gpcount & 1) gpcount++; if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8) { fpreg *addr = &stack->fp_regs[fpcount++]; __float80 result; avalue[i] = addr; ldf_fill (result, addr); *(__float80 *)addr = result; } else avalue[i] = &stack->gp_regs[gpcount]; gpcount += 2; break; case FFI_TYPE_STRUCT: { size_t size = (*p_arg)->size; size_t align = (*p_arg)->alignment; int hfa_type = hfa_element_type (*p_arg, 0); FFI_ASSERT (align <= 16); if (align == 16 && (gpcount & 1)) gpcount++; if (hfa_type != FFI_TYPE_VOID) { size_t hfa_size = hfa_type_size (hfa_type); size_t offset = 0; size_t gp_offset = gpcount * 8; void *addr = alloca (size); avalue[i] = addr; while (fpcount < 8 && offset < size && gp_offset < 8 * 8) { hfa_type_store (hfa_type, addr + offset, &stack->fp_regs[fpcount]); offset += hfa_size; gp_offset += hfa_size; fpcount += 1; } if (offset < size) memcpy (addr + offset, (char *)stack->gp_regs + gp_offset, size - offset); } else avalue[i] = &stack->gp_regs[gpcount]; gpcount += (size + 7) / 8; } break; default: abort (); } } closure->fun (cif, rvalue, avalue, closure->user_data); return cif->flags; } polyml-5.6/libffi/src/ia64/ffitarget.h000066400000000000000000000040601265146633400176230ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for IA-64. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long long ffi_arg; typedef signed long long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_UNIX, /* Linux and all Unix variants use the same conventions */ FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_UNIX } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 24 /* Really the following struct, which */ /* can be interpreted as a C function */ /* descriptor: */ #endif polyml-5.6/libffi/src/ia64/ia64_flags.h000066400000000000000000000036351265146633400175760ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company IA64/unix Foreign Function Interface Original author: Hans Boehm, HP Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* "Type" codes used between assembly and C. When used as a part of a cfi->flags value, the low byte will be these extra type codes, and bits 8-31 will be the actual size of the type. */ /* Small structures containing N words in integer registers. */ #define FFI_IA64_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 1) /* Homogeneous Floating Point Aggregates (HFAs) which are returned in FP registers. */ #define FFI_IA64_TYPE_HFA_FLOAT (FFI_TYPE_LAST + 2) #define FFI_IA64_TYPE_HFA_DOUBLE (FFI_TYPE_LAST + 3) #define FFI_IA64_TYPE_HFA_LDOUBLE (FFI_TYPE_LAST + 4) polyml-5.6/libffi/src/ia64/unix.S000066400000000000000000000266011265146633400166130ustar00rootroot00000000000000/* ----------------------------------------------------------------------- unix.S - Copyright (c) 1998, 2008 Red Hat, Inc. Copyright (c) 2000 Hewlett Packard Company IA64/unix Foreign Function Interface Primary author: Hans Boehm, HP Labs Loosely modeled on Cygnus code for other platforms. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #include "ia64_flags.h" .pred.safe_across_calls p1-p5,p16-p63 .text /* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue, void (*fn)(void), int flags); */ .align 16 .global ffi_call_unix .proc ffi_call_unix ffi_call_unix: .prologue /* Bit o trickiness. We actually share a stack frame with ffi_call. Rely on the fact that ffi_call uses a vframe and don't bother tracking one here at all. */ .fframe 0 .save ar.pfs, r36 // loc0 alloc loc0 = ar.pfs, 4, 3, 8, 0 .save rp, loc1 mov loc1 = b0 .body add r16 = 16, in0 mov loc2 = gp mov r8 = in1 ;; /* Load up all of the argument registers. */ ldf.fill f8 = [in0], 32 ldf.fill f9 = [r16], 32 ;; ldf.fill f10 = [in0], 32 ldf.fill f11 = [r16], 32 ;; ldf.fill f12 = [in0], 32 ldf.fill f13 = [r16], 32 ;; ldf.fill f14 = [in0], 32 ldf.fill f15 = [r16], 24 ;; ld8 out0 = [in0], 16 ld8 out1 = [r16], 16 ;; ld8 out2 = [in0], 16 ld8 out3 = [r16], 16 ;; ld8 out4 = [in0], 16 ld8 out5 = [r16], 16 ;; ld8 out6 = [in0] ld8 out7 = [r16] ;; /* Deallocate the register save area from the stack frame. */ mov sp = in0 /* Call the target function. */ ld8 r16 = [in2], 8 ;; ld8 gp = [in2] mov b6 = r16 br.call.sptk.many b0 = b6 ;; /* Dispatch to handle return value. */ mov gp = loc2 zxt1 r16 = in3 ;; mov ar.pfs = loc0 addl r18 = @ltoffx(.Lst_table), gp ;; ld8.mov r18 = [r18], .Lst_table mov b0 = loc1 ;; shladd r18 = r16, 3, r18 ;; ld8 r17 = [r18] shr in3 = in3, 8 ;; add r17 = r17, r18 ;; mov b6 = r17 br b6 ;; .Lst_void: br.ret.sptk.many b0 ;; .Lst_uint8: zxt1 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_sint8: sxt1 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_uint16: zxt2 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_sint16: sxt2 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_uint32: zxt4 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_sint32: sxt4 r8 = r8 ;; st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_int64: st8 [in1] = r8 br.ret.sptk.many b0 ;; .Lst_float: stfs [in1] = f8 br.ret.sptk.many b0 ;; .Lst_double: stfd [in1] = f8 br.ret.sptk.many b0 ;; .Lst_ldouble: stfe [in1] = f8 br.ret.sptk.many b0 ;; .Lst_small_struct: add sp = -16, sp cmp.lt p6, p0 = 8, in3 cmp.lt p7, p0 = 16, in3 cmp.lt p8, p0 = 24, in3 ;; add r16 = 8, sp add r17 = 16, sp add r18 = 24, sp ;; st8 [sp] = r8 (p6) st8 [r16] = r9 mov out0 = in1 (p7) st8 [r17] = r10 (p8) st8 [r18] = r11 mov out1 = sp mov out2 = in3 br.call.sptk.many b0 = memcpy# ;; mov ar.pfs = loc0 mov b0 = loc1 mov gp = loc2 br.ret.sptk.many b0 .Lst_hfa_float: add r16 = 4, in1 cmp.lt p6, p0 = 4, in3 ;; stfs [in1] = f8, 8 (p6) stfs [r16] = f9, 8 cmp.lt p7, p0 = 8, in3 cmp.lt p8, p0 = 12, in3 ;; (p7) stfs [in1] = f10, 8 (p8) stfs [r16] = f11, 8 cmp.lt p9, p0 = 16, in3 cmp.lt p10, p0 = 20, in3 ;; (p9) stfs [in1] = f12, 8 (p10) stfs [r16] = f13, 8 cmp.lt p6, p0 = 24, in3 cmp.lt p7, p0 = 28, in3 ;; (p6) stfs [in1] = f14 (p7) stfs [r16] = f15 br.ret.sptk.many b0 ;; .Lst_hfa_double: add r16 = 8, in1 cmp.lt p6, p0 = 8, in3 ;; stfd [in1] = f8, 16 (p6) stfd [r16] = f9, 16 cmp.lt p7, p0 = 16, in3 cmp.lt p8, p0 = 24, in3 ;; (p7) stfd [in1] = f10, 16 (p8) stfd [r16] = f11, 16 cmp.lt p9, p0 = 32, in3 cmp.lt p10, p0 = 40, in3 ;; (p9) stfd [in1] = f12, 16 (p10) stfd [r16] = f13, 16 cmp.lt p6, p0 = 48, in3 cmp.lt p7, p0 = 56, in3 ;; (p6) stfd [in1] = f14 (p7) stfd [r16] = f15 br.ret.sptk.many b0 ;; .Lst_hfa_ldouble: add r16 = 16, in1 cmp.lt p6, p0 = 16, in3 ;; stfe [in1] = f8, 32 (p6) stfe [r16] = f9, 32 cmp.lt p7, p0 = 32, in3 cmp.lt p8, p0 = 48, in3 ;; (p7) stfe [in1] = f10, 32 (p8) stfe [r16] = f11, 32 cmp.lt p9, p0 = 64, in3 cmp.lt p10, p0 = 80, in3 ;; (p9) stfe [in1] = f12, 32 (p10) stfe [r16] = f13, 32 cmp.lt p6, p0 = 96, in3 cmp.lt p7, p0 = 112, in3 ;; (p6) stfe [in1] = f14 (p7) stfe [r16] = f15 br.ret.sptk.many b0 ;; .endp ffi_call_unix .align 16 .global ffi_closure_unix .proc ffi_closure_unix #define FRAME_SIZE (8*16 + 8*8 + 8*16) ffi_closure_unix: .prologue .save ar.pfs, r40 // loc0 alloc loc0 = ar.pfs, 8, 4, 4, 0 .fframe FRAME_SIZE add r12 = -FRAME_SIZE, r12 .save rp, loc1 mov loc1 = b0 .save ar.unat, loc2 mov loc2 = ar.unat .body /* Retrieve closure pointer and real gp. */ #ifdef _ILP32 addp4 out0 = 0, gp addp4 gp = 16, gp #else mov out0 = gp add gp = 16, gp #endif ;; ld8 gp = [gp] /* Spill all of the possible argument registers. */ add r16 = 16 + 8*16, sp add r17 = 16 + 8*16 + 16, sp ;; stf.spill [r16] = f8, 32 stf.spill [r17] = f9, 32 mov loc3 = gp ;; stf.spill [r16] = f10, 32 stf.spill [r17] = f11, 32 ;; stf.spill [r16] = f12, 32 stf.spill [r17] = f13, 32 ;; stf.spill [r16] = f14, 32 stf.spill [r17] = f15, 24 ;; .mem.offset 0, 0 st8.spill [r16] = in0, 16 .mem.offset 8, 0 st8.spill [r17] = in1, 16 add out1 = 16 + 8*16, sp ;; .mem.offset 0, 0 st8.spill [r16] = in2, 16 .mem.offset 8, 0 st8.spill [r17] = in3, 16 add out2 = 16, sp ;; .mem.offset 0, 0 st8.spill [r16] = in4, 16 .mem.offset 8, 0 st8.spill [r17] = in5, 16 mov out3 = r8 ;; .mem.offset 0, 0 st8.spill [r16] = in6 .mem.offset 8, 0 st8.spill [r17] = in7 /* Invoke ffi_closure_unix_inner for the hard work. */ br.call.sptk.many b0 = ffi_closure_unix_inner ;; /* Dispatch to handle return value. */ mov gp = loc3 zxt1 r16 = r8 ;; addl r18 = @ltoffx(.Lld_table), gp mov ar.pfs = loc0 ;; ld8.mov r18 = [r18], .Lld_table mov b0 = loc1 ;; shladd r18 = r16, 3, r18 mov ar.unat = loc2 ;; ld8 r17 = [r18] shr r8 = r8, 8 ;; add r17 = r17, r18 add r16 = 16, sp ;; mov b6 = r17 br b6 ;; .label_state 1 .Lld_void: .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_int: .body .copy_state 1 ld8 r8 = [r16] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_float: .body .copy_state 1 ldfs f8 = [r16] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_double: .body .copy_state 1 ldfd f8 = [r16] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_ldouble: .body .copy_state 1 ldfe f8 = [r16] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_small_struct: .body .copy_state 1 add r17 = 8, r16 cmp.lt p6, p0 = 8, r8 cmp.lt p7, p0 = 16, r8 cmp.lt p8, p0 = 24, r8 ;; ld8 r8 = [r16], 16 (p6) ld8 r9 = [r17], 16 ;; (p7) ld8 r10 = [r16] (p8) ld8 r11 = [r17] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_hfa_float: .body .copy_state 1 add r17 = 4, r16 cmp.lt p6, p0 = 4, r8 ;; ldfs f8 = [r16], 8 (p6) ldfs f9 = [r17], 8 cmp.lt p7, p0 = 8, r8 cmp.lt p8, p0 = 12, r8 ;; (p7) ldfs f10 = [r16], 8 (p8) ldfs f11 = [r17], 8 cmp.lt p9, p0 = 16, r8 cmp.lt p10, p0 = 20, r8 ;; (p9) ldfs f12 = [r16], 8 (p10) ldfs f13 = [r17], 8 cmp.lt p6, p0 = 24, r8 cmp.lt p7, p0 = 28, r8 ;; (p6) ldfs f14 = [r16] (p7) ldfs f15 = [r17] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_hfa_double: .body .copy_state 1 add r17 = 8, r16 cmp.lt p6, p0 = 8, r8 ;; ldfd f8 = [r16], 16 (p6) ldfd f9 = [r17], 16 cmp.lt p7, p0 = 16, r8 cmp.lt p8, p0 = 24, r8 ;; (p7) ldfd f10 = [r16], 16 (p8) ldfd f11 = [r17], 16 cmp.lt p9, p0 = 32, r8 cmp.lt p10, p0 = 40, r8 ;; (p9) ldfd f12 = [r16], 16 (p10) ldfd f13 = [r17], 16 cmp.lt p6, p0 = 48, r8 cmp.lt p7, p0 = 56, r8 ;; (p6) ldfd f14 = [r16] (p7) ldfd f15 = [r17] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .Lld_hfa_ldouble: .body .copy_state 1 add r17 = 16, r16 cmp.lt p6, p0 = 16, r8 ;; ldfe f8 = [r16], 32 (p6) ldfe f9 = [r17], 32 cmp.lt p7, p0 = 32, r8 cmp.lt p8, p0 = 48, r8 ;; (p7) ldfe f10 = [r16], 32 (p8) ldfe f11 = [r17], 32 cmp.lt p9, p0 = 64, r8 cmp.lt p10, p0 = 80, r8 ;; (p9) ldfe f12 = [r16], 32 (p10) ldfe f13 = [r17], 32 cmp.lt p6, p0 = 96, r8 cmp.lt p7, p0 = 112, r8 ;; (p6) ldfe f14 = [r16] (p7) ldfe f15 = [r17] .restore sp add sp = FRAME_SIZE, sp br.ret.sptk.many b0 ;; .endp ffi_closure_unix .section .rodata .align 8 .Lst_table: data8 @pcrel(.Lst_void) // FFI_TYPE_VOID data8 @pcrel(.Lst_sint32) // FFI_TYPE_INT data8 @pcrel(.Lst_float) // FFI_TYPE_FLOAT data8 @pcrel(.Lst_double) // FFI_TYPE_DOUBLE data8 @pcrel(.Lst_ldouble) // FFI_TYPE_LONGDOUBLE data8 @pcrel(.Lst_uint8) // FFI_TYPE_UINT8 data8 @pcrel(.Lst_sint8) // FFI_TYPE_SINT8 data8 @pcrel(.Lst_uint16) // FFI_TYPE_UINT16 data8 @pcrel(.Lst_sint16) // FFI_TYPE_SINT16 data8 @pcrel(.Lst_uint32) // FFI_TYPE_UINT32 data8 @pcrel(.Lst_sint32) // FFI_TYPE_SINT32 data8 @pcrel(.Lst_int64) // FFI_TYPE_UINT64 data8 @pcrel(.Lst_int64) // FFI_TYPE_SINT64 data8 @pcrel(.Lst_void) // FFI_TYPE_STRUCT data8 @pcrel(.Lst_int64) // FFI_TYPE_POINTER data8 @pcrel(.Lst_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT data8 @pcrel(.Lst_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT data8 @pcrel(.Lst_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE data8 @pcrel(.Lst_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE .Lld_table: data8 @pcrel(.Lld_void) // FFI_TYPE_VOID data8 @pcrel(.Lld_int) // FFI_TYPE_INT data8 @pcrel(.Lld_float) // FFI_TYPE_FLOAT data8 @pcrel(.Lld_double) // FFI_TYPE_DOUBLE data8 @pcrel(.Lld_ldouble) // FFI_TYPE_LONGDOUBLE data8 @pcrel(.Lld_int) // FFI_TYPE_UINT8 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT8 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT16 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT16 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT32 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT32 data8 @pcrel(.Lld_int) // FFI_TYPE_UINT64 data8 @pcrel(.Lld_int) // FFI_TYPE_SINT64 data8 @pcrel(.Lld_void) // FFI_TYPE_STRUCT data8 @pcrel(.Lld_int) // FFI_TYPE_POINTER data8 @pcrel(.Lld_small_struct) // FFI_IA64_TYPE_SMALL_STRUCT data8 @pcrel(.Lld_hfa_float) // FFI_IA64_TYPE_HFA_FLOAT data8 @pcrel(.Lld_hfa_double) // FFI_IA64_TYPE_HFA_DOUBLE data8 @pcrel(.Lld_hfa_ldouble) // FFI_IA64_TYPE_HFA_LDOUBLE #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/java_raw_api.c000066400000000000000000000204431265146633400175260ustar00rootroot00000000000000/* ----------------------------------------------------------------------- java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. Cloned from raw_api.c Raw_api.c author: Kresten Krab Thorup Java_raw_api.c author: Hans-J. Boehm $Id $ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* This defines a Java- and 64-bit specific variant of the raw API. */ /* It assumes that "raw" argument blocks look like Java stacks on a */ /* 64-bit machine. Arguments that can be stored in a single stack */ /* stack slots (longs, doubles) occupy 128 bits, but only the first */ /* 64 bits are actually used. */ #include #include #include #if !defined(NO_JAVA_RAW_API) && !defined(FFI_NO_RAW_API) size_t ffi_java_raw_size (ffi_cif *cif) { size_t result = 0; int i; ffi_type **at = cif->arg_types; for (i = cif->nargs-1; i >= 0; i--, at++) { switch((*at) -> type) { case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_DOUBLE: result += 2 * FFI_SIZEOF_JAVA_RAW; break; case FFI_TYPE_STRUCT: /* No structure parameters in Java. */ abort(); default: result += FFI_SIZEOF_JAVA_RAW; } } return result; } void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) { unsigned i; ffi_type **tp = cif->arg_types; #if WORDS_BIGENDIAN for (i = 0; i < cif->nargs; i++, tp++, args++) { switch ((*tp)->type) { case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: *args = (void*) ((char*)(raw++) + 3); break; case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: *args = (void*) ((char*)(raw++) + 2); break; #if FFI_SIZEOF_JAVA_RAW == 8 case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_DOUBLE: *args = (void *)raw; raw += 2; break; #endif case FFI_TYPE_POINTER: *args = (void*) &(raw++)->ptr; break; default: *args = raw; raw += ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); } } #else /* WORDS_BIGENDIAN */ #if !PDP /* then assume little endian */ for (i = 0; i < cif->nargs; i++, tp++, args++) { #if FFI_SIZEOF_JAVA_RAW == 8 switch((*tp)->type) { case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_DOUBLE: *args = (void*) raw; raw += 2; break; default: *args = (void*) raw++; } #else /* FFI_SIZEOF_JAVA_RAW != 8 */ *args = (void*) raw; raw += ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); #endif /* FFI_SIZEOF_JAVA_RAW == 8 */ } #else #error "pdp endian not supported" #endif /* ! PDP */ #endif /* WORDS_BIGENDIAN */ } void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) { unsigned i; ffi_type **tp = cif->arg_types; for (i = 0; i < cif->nargs; i++, tp++, args++) { switch ((*tp)->type) { case FFI_TYPE_UINT8: #if WORDS_BIGENDIAN *(UINT32*)(raw++) = *(UINT8*) (*args); #else (raw++)->uint = *(UINT8*) (*args); #endif break; case FFI_TYPE_SINT8: #if WORDS_BIGENDIAN *(SINT32*)(raw++) = *(SINT8*) (*args); #else (raw++)->sint = *(SINT8*) (*args); #endif break; case FFI_TYPE_UINT16: #if WORDS_BIGENDIAN *(UINT32*)(raw++) = *(UINT16*) (*args); #else (raw++)->uint = *(UINT16*) (*args); #endif break; case FFI_TYPE_SINT16: #if WORDS_BIGENDIAN *(SINT32*)(raw++) = *(SINT16*) (*args); #else (raw++)->sint = *(SINT16*) (*args); #endif break; case FFI_TYPE_UINT32: #if WORDS_BIGENDIAN *(UINT32*)(raw++) = *(UINT32*) (*args); #else (raw++)->uint = *(UINT32*) (*args); #endif break; case FFI_TYPE_SINT32: #if WORDS_BIGENDIAN *(SINT32*)(raw++) = *(SINT32*) (*args); #else (raw++)->sint = *(SINT32*) (*args); #endif break; case FFI_TYPE_FLOAT: (raw++)->flt = *(FLOAT32*) (*args); break; #if FFI_SIZEOF_JAVA_RAW == 8 case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_DOUBLE: raw->uint = *(UINT64*) (*args); raw += 2; break; #endif case FFI_TYPE_POINTER: (raw++)->ptr = **(void***) args; break; default: #if FFI_SIZEOF_JAVA_RAW == 8 FFI_ASSERT(0); /* Should have covered all cases */ #else memcpy ((void*) raw->data, (void*)*args, (*tp)->size); raw += ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); #endif } } } #if !FFI_NATIVE_RAW_API static void ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) { #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 switch (cif->rtype->type) { case FFI_TYPE_UINT8: case FFI_TYPE_UINT16: case FFI_TYPE_UINT32: *(UINT64 *)rvalue <<= 32; break; case FFI_TYPE_SINT8: case FFI_TYPE_SINT16: case FFI_TYPE_SINT32: case FFI_TYPE_INT: #if FFI_SIZEOF_JAVA_RAW == 4 case FFI_TYPE_POINTER: #endif *(SINT64 *)rvalue <<= 32; break; default: break; } #endif } static void ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) { #if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 switch (cif->rtype->type) { case FFI_TYPE_UINT8: case FFI_TYPE_UINT16: case FFI_TYPE_UINT32: *(UINT64 *)rvalue >>= 32; break; case FFI_TYPE_SINT8: case FFI_TYPE_SINT16: case FFI_TYPE_SINT32: case FFI_TYPE_INT: *(SINT64 *)rvalue >>= 32; break; default: break; } #endif } /* This is a generic definition of ffi_raw_call, to be used if the * native system does not provide a machine-specific implementation. * Having this, allows code to be written for the raw API, without * the need for system-specific code to handle input in that format; * these following couple of functions will handle the translation forth * and back automatically. */ void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_java_raw *raw) { void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); ffi_java_raw_to_ptrarray (cif, raw, avalue); ffi_call (cif, fn, rvalue, avalue); ffi_java_rvalue_to_raw (cif, rvalue); } #if FFI_CLOSURES /* base system provides closures */ static void ffi_java_translate_args (ffi_cif *cif, void *rvalue, void **avalue, void *user_data) { ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); ffi_raw_closure *cl = (ffi_raw_closure*)user_data; ffi_java_ptrarray_to_raw (cif, avalue, raw); (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); ffi_java_raw_to_rvalue (cif, rvalue); } ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, void *codeloc) { ffi_status status; status = ffi_prep_closure_loc ((ffi_closure*) cl, cif, &ffi_java_translate_args, codeloc, codeloc); if (status == FFI_OK) { cl->fun = fun; cl->user_data = user_data; } return status; } /* Again, here is the generic version of ffi_prep_raw_closure, which * will install an intermediate "hub" for translation of arguments from * the pointer-array format, to the raw format */ ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data) { return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); } #endif /* FFI_CLOSURES */ #endif /* !FFI_NATIVE_RAW_API */ #endif /* !FFI_NO_RAW_API */ polyml-5.6/libffi/src/m32r/000077500000000000000000000000001265146633400155175ustar00rootroot00000000000000polyml-5.6/libffi/src/m32r/ffi.c000066400000000000000000000127151265146633400164350ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2004 Renesas Technology Copyright (c) 2008 Red Hat, Inc. M32R Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments. */ void ffi_prep_args(char *stack, extended_cif *ecif) { unsigned int i; int tmp; unsigned int avn; void **p_argv; char *argp; ffi_type **p_arg; tmp = 0; argp = stack; if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8) { *(void **) argp = ecif->rvalue; argp += 4; } avn = ecif->cif->nargs; p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0) && (avn != 0); i--, p_arg++) { size_t z; /* Align if necessary. */ if (((*p_arg)->alignment - 1) & (unsigned) argp) argp = (char *) ALIGN (argp, (*p_arg)->alignment); if (avn != 0) { avn--; z = (*p_arg)->size; if (z < sizeof (int)) { z = sizeof (int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; case FFI_TYPE_STRUCT: z = (*p_arg)->size; if ((*p_arg)->alignment != 1) memcpy (argp, *p_argv, z); else memcpy (argp + 4 - z, *p_argv, z); z = sizeof (int); break; default: FFI_ASSERT(0); } } else if (z == sizeof (int)) { *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); } else { if ((*p_arg)->type == FFI_TYPE_STRUCT) { if (z > 8) { *(unsigned int *) argp = (unsigned int)(void *)(* p_argv); z = sizeof(void *); } else { memcpy(argp, *p_argv, z); z = 8; } } else { /* Double or long long 64bit. */ memcpy (argp, *p_argv, z); } } p_argv++; argp += z; } } return; } /* Perform machine dependent cif processing. */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* Set the return type flag. */ switch (cif->rtype->type) { case FFI_TYPE_VOID: cif->flags = (unsigned) cif->rtype->type; break; case FFI_TYPE_STRUCT: if (cif->rtype->size <= 4) cif->flags = FFI_TYPE_INT; else if (cif->rtype->size <= 8) cif->flags = FFI_TYPE_DOUBLE; else cif->flags = (unsigned) cif->rtype->type; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_DOUBLE: cif->flags = FFI_TYPE_DOUBLE; break; case FFI_TYPE_FLOAT: default: cif->flags = FFI_TYPE_INT; break; } return FFI_OK; } extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return value address then we need to make one. */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca (cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); if (cif->rtype->type == FFI_TYPE_STRUCT) { int size = cif->rtype->size; int align = cif->rtype->alignment; if (size < 4) { if (align == 1) *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8; } else if (4 < size && size < 8) { if (align == 1) { memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); } else if (align == 2) { if (size & 1) size += 1; if (size != 8) memcpy (ecif.rvalue, ecif.rvalue + 8-size, size); } } } break; default: FFI_ASSERT(0); break; } } polyml-5.6/libffi/src/m32r/ffitarget.h000066400000000000000000000036201265146633400176440ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 2004 Renesas Technology. Target configuration macros for M32R. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- Generic type definitions ----------------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif #define FFI_CLOSURES 0 #define FFI_TRAMPOLINE_SIZE 24 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/m32r/sysv.S000066400000000000000000000057521265146633400166600ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2004 Renesas Technology M32R Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_MACHINE_ASM_H #include #else /* XXX these lose for some platforms, I'm sure. */ #define CNAME(x) x #define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): #endif .text /* R0: ffi_prep_args */ /* R1: &ecif */ /* R2: cif->bytes */ /* R3: fig->flags */ /* sp+0: ecif.rvalue */ /* sp+4: fn */ /* This assumes we are using gas. */ ENTRY(ffi_call_SYSV) /* Save registers. */ push fp push lr push r3 push r2 push r1 push r0 mv fp, sp /* Make room for all of the new args. */ sub sp, r2 /* Place all of the ffi_prep_args in position. */ mv lr, r0 mv r0, sp /* R1 already set. */ /* And call. */ jl lr /* Move first 4 parameters in registers... */ ld r0, @(0,sp) ld r1, @(4,sp) ld r2, @(8,sp) ld r3, @(12,sp) /* ...and adjust the stack. */ ld lr, @(8,fp) cmpi lr, #16 bc adjust_stack ldi lr, #16 adjust_stack: add sp, lr /* Call the function. */ ld lr, @(28,fp) jl lr /* Remove the space we pushed for the args. */ mv sp, fp /* Load R2 with the pointer to storage for the return value. */ ld r2, @(24,sp) /* Load R3 with the return type code. */ ld r3, @(12,sp) /* If the return value pointer is NULL, assume no return value. */ beqz r2, epilogue /* Return INT. */ ldi r4, #FFI_TYPE_INT bne r3, r4, return_double st r0, @r2 bra epilogue return_double: /* Return DOUBLE or LONGDOUBLE. */ ldi r4, #FFI_TYPE_DOUBLE bne r3, r4, epilogue st r0, @r2 st r1, @(4,r2) epilogue: pop r0 pop r1 pop r2 pop r3 pop lr pop fp jmp lr .ffi_call_SYSV_end: .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) polyml-5.6/libffi/src/m68k/000077500000000000000000000000001265146633400155215ustar00rootroot00000000000000polyml-5.6/libffi/src/m68k/ffi.c000066400000000000000000000162731265146633400164420ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c m68k Foreign Function Interface ----------------------------------------------------------------------- */ #include #include #include #include #ifdef __rtems__ void rtems_cache_flush_multiple_data_lines( const void *, size_t ); #else #include #ifdef __MINT__ #include #include #else #include #endif #endif void ffi_call_SYSV (extended_cif *, unsigned, unsigned, void *, void (*fn) ()); void *ffi_prep_args (void *stack, extended_cif *ecif); void ffi_closure_SYSV (ffi_closure *); void ffi_closure_struct_SYSV (ffi_closure *); unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args); /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments. */ void * ffi_prep_args (void *stack, extended_cif *ecif) { unsigned int i; void **p_argv; char *argp; ffi_type **p_arg; void *struct_value_ptr; argp = stack; if ( #ifdef __MINT__ (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || #endif (((ecif->cif->rtype->type == FFI_TYPE_STRUCT) && !ecif->cif->flags))) struct_value_ptr = ecif->rvalue; else struct_value_ptr = NULL; p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) { size_t z = (*p_arg)->size; int type = (*p_arg)->type; if (z < sizeof (int)) { switch (type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int) *(SINT8 *) *p_argv; break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv; break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int) *(SINT16 *) *p_argv; break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv; break; case FFI_TYPE_STRUCT: #ifdef __MINT__ if (z == 1 || z == 2) memcpy (argp + 2, *p_argv, z); else memcpy (argp, *p_argv, z); #else memcpy (argp + sizeof (int) - z, *p_argv, z); #endif break; default: FFI_ASSERT (0); } z = sizeof (int); } else { memcpy (argp, *p_argv, z); /* Align if necessary. */ if ((sizeof(int) - 1) & z) z = ALIGN(z, sizeof(int)); } p_argv++; argp += z; } return struct_value_ptr; } #define CIF_FLAGS_INT 1 #define CIF_FLAGS_DINT 2 #define CIF_FLAGS_FLOAT 4 #define CIF_FLAGS_DOUBLE 8 #define CIF_FLAGS_LDOUBLE 16 #define CIF_FLAGS_POINTER 32 #define CIF_FLAGS_STRUCT1 64 #define CIF_FLAGS_STRUCT2 128 #define CIF_FLAGS_SINT8 256 #define CIF_FLAGS_SINT16 512 /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep (ffi_cif *cif) { /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: cif->flags = 0; break; case FFI_TYPE_STRUCT: if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && cif->rtype->elements[1]) { cif->flags = 0; break; } switch (cif->rtype->size) { case 1: #ifdef __MINT__ cif->flags = CIF_FLAGS_STRUCT2; #else cif->flags = CIF_FLAGS_STRUCT1; #endif break; case 2: cif->flags = CIF_FLAGS_STRUCT2; break; #ifdef __MINT__ case 3: #endif case 4: cif->flags = CIF_FLAGS_INT; break; #ifdef __MINT__ case 7: #endif case 8: cif->flags = CIF_FLAGS_DINT; break; default: cif->flags = 0; break; } break; case FFI_TYPE_FLOAT: cif->flags = CIF_FLAGS_FLOAT; break; case FFI_TYPE_DOUBLE: cif->flags = CIF_FLAGS_DOUBLE; break; #if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE) case FFI_TYPE_LONGDOUBLE: #ifdef __MINT__ cif->flags = 0; #else cif->flags = CIF_FLAGS_LDOUBLE; #endif break; #endif case FFI_TYPE_POINTER: cif->flags = CIF_FLAGS_POINTER; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = CIF_FLAGS_DINT; break; case FFI_TYPE_SINT16: cif->flags = CIF_FLAGS_SINT16; break; case FFI_TYPE_SINT8: cif->flags = CIF_FLAGS_SINT8; break; default: cif->flags = CIF_FLAGS_INT; break; } return FFI_OK; } void ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return value address then we need to make one. */ if (rvalue == NULL && cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size > 8) ecif.rvalue = alloca (cif->rtype->size); else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT (0); break; } } static void ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif) { unsigned int i; void **p_argv; char *argp; ffi_type **p_arg; argp = stack; p_argv = avalue; for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { size_t z; z = (*p_arg)->size; #ifdef __MINT__ if (cif->flags && cif->rtype->type == FFI_TYPE_STRUCT && (z == 1 || z == 2)) { *p_argv = (void *) (argp + 2); z = 4; } else if (cif->flags && cif->rtype->type == FFI_TYPE_STRUCT && (z == 3 || z == 4)) { *p_argv = (void *) (argp); z = 4; } else #endif if (z <= 4) { *p_argv = (void *) (argp + 4 - z); z = 4; } else { *p_argv = (void *) argp; /* Align if necessary */ if ((sizeof(int) - 1) & z) z = ALIGN(z, sizeof(int)); } p_argv++; argp += z; } } unsigned int ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args) { ffi_cif *cif; void **arg_area; cif = closure->cif; arg_area = (void**) alloca (cif->nargs * sizeof (void *)); ffi_prep_incoming_args_SYSV(args, arg_area, cif); (closure->fun) (cif, resp, arg_area, closure->user_data); return cif->flags; } ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; *(unsigned short *)closure->tramp = 0x207c; *(void **)(closure->tramp + 2) = codeloc; *(unsigned short *)(closure->tramp + 6) = 0x4ef9; if ( #ifdef __MINT__ (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || #endif (((cif->rtype->type == FFI_TYPE_STRUCT) && !cif->flags))) *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV; else *(void **)(closure->tramp + 8) = ffi_closure_SYSV; #ifdef __rtems__ rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE ); #elif defined(__MINT__) Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE); #else syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE, FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE); #endif closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } polyml-5.6/libffi/src/m68k/ffitarget.h000066400000000000000000000036331265146633400176520ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for Motorola 68K. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 16 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/m68k/sysv.S000066400000000000000000000155621265146633400166620ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2012 Alan Hourihane Copyright (c) 1998, 2012 Andreas Schwab Copyright (c) 2008 Red Hat, Inc. Copyright (c) 2012 Thorsten Glaser m68k Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_AS_CFI_PSEUDO_OP #define CFI_STARTPROC() .cfi_startproc #define CFI_OFFSET(reg,off) .cfi_offset reg,off #define CFI_DEF_CFA(reg,off) .cfi_def_cfa reg,off #define CFI_ENDPROC() .cfi_endproc #else #define CFI_STARTPROC() #define CFI_OFFSET(reg,off) #define CFI_DEF_CFA(reg,off) #define CFI_ENDPROC() #endif #ifdef __MINT__ #define CALLFUNC(funcname) _ ## funcname #else #define CALLFUNC(funcname) funcname #endif .text .globl CALLFUNC(ffi_call_SYSV) .type CALLFUNC(ffi_call_SYSV),@function .align 4 CALLFUNC(ffi_call_SYSV): CFI_STARTPROC() link %fp,#0 CFI_OFFSET(14,-8) CFI_DEF_CFA(14,8) move.l %d2,-(%sp) CFI_OFFSET(2,-12) | Make room for all of the new args. sub.l 12(%fp),%sp | Call ffi_prep_args move.l 8(%fp),-(%sp) pea 4(%sp) #if !defined __PIC__ jsr CALLFUNC(ffi_prep_args) #else bsr.l CALLFUNC(ffi_prep_args@PLTPC) #endif addq.l #8,%sp | Pass pointer to struct value, if any #ifdef __MINT__ move.l %d0,%a1 #else move.l %a0,%a1 #endif | Call the function move.l 24(%fp),%a0 jsr (%a0) | Remove the space we pushed for the args add.l 12(%fp),%sp | Load the pointer to storage for the return value move.l 20(%fp),%a1 | Load the return type code move.l 16(%fp),%d2 | If the return value pointer is NULL, assume no return value. | NOTE: On the mc68000, tst on an address register is not supported. #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) cmp.w #0, %a1 #else tst.l %a1 #endif jbeq noretval btst #0,%d2 jbeq retlongint move.l %d0,(%a1) jbra epilogue retlongint: btst #1,%d2 jbeq retfloat move.l %d0,(%a1) move.l %d1,4(%a1) jbra epilogue retfloat: btst #2,%d2 jbeq retdouble #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.s %fp0,(%a1) #else move.l %d0,(%a1) #endif jbra epilogue retdouble: btst #3,%d2 jbeq retlongdouble #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.d %fp0,(%a1) #else move.l %d0,(%a1)+ move.l %d1,(%a1) #endif jbra epilogue retlongdouble: btst #4,%d2 jbeq retpointer #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.x %fp0,(%a1) #else move.l %d0,(%a1)+ move.l %d1,(%a1)+ move.l %d2,(%a1) #endif jbra epilogue retpointer: btst #5,%d2 jbeq retstruct1 #ifdef __MINT__ move.l %d0,(%a1) #else move.l %a0,(%a1) #endif jbra epilogue retstruct1: btst #6,%d2 jbeq retstruct2 move.b %d0,(%a1) jbra epilogue retstruct2: btst #7,%d2 jbeq retsint8 move.w %d0,(%a1) jbra epilogue retsint8: btst #8,%d2 jbeq retsint16 | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ext.w %d0 ext.l %d0 #else extb.l %d0 #endif move.l %d0,(%a1) jbra epilogue retsint16: btst #9,%d2 jbeq noretval ext.l %d0 move.l %d0,(%a1) noretval: epilogue: move.l (%sp)+,%d2 unlk %fp rts CFI_ENDPROC() .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) .globl CALLFUNC(ffi_closure_SYSV) .type CALLFUNC(ffi_closure_SYSV), @function .align 4 CALLFUNC(ffi_closure_SYSV): CFI_STARTPROC() link %fp,#-12 CFI_OFFSET(14,-8) CFI_DEF_CFA(14,8) move.l %sp,-12(%fp) pea 8(%fp) pea -12(%fp) move.l %a0,-(%sp) #if !defined __PIC__ jsr CALLFUNC(ffi_closure_SYSV_inner) #else bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) #endif lsr.l #1,%d0 jne 1f jcc .Lcls_epilogue | CIF_FLAGS_INT move.l -12(%fp),%d0 .Lcls_epilogue: | no CIF_FLAGS_* unlk %fp rts 1: lea -12(%fp),%a0 lsr.l #2,%d0 jne 1f jcs .Lcls_ret_float | CIF_FLAGS_DINT move.l (%a0)+,%d0 move.l (%a0),%d1 jra .Lcls_epilogue .Lcls_ret_float: #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.s (%a0),%fp0 #else move.l (%a0),%d0 #endif jra .Lcls_epilogue 1: lsr.l #2,%d0 jne 1f jcs .Lcls_ret_ldouble | CIF_FLAGS_DOUBLE #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.d (%a0),%fp0 #else move.l (%a0)+,%d0 move.l (%a0),%d1 #endif jra .Lcls_epilogue .Lcls_ret_ldouble: #if defined(__MC68881__) || defined(__HAVE_68881__) fmove.x (%a0),%fp0 #else move.l (%a0)+,%d0 move.l (%a0)+,%d1 move.l (%a0),%d2 #endif jra .Lcls_epilogue 1: lsr.l #2,%d0 jne 1f jcs .Lcls_ret_struct1 | CIF_FLAGS_POINTER move.l (%a0),%a0 move.l %a0,%d0 jra .Lcls_epilogue .Lcls_ret_struct1: move.b (%a0),%d0 jra .Lcls_epilogue 1: lsr.l #2,%d0 jne 1f jcs .Lcls_ret_sint8 | CIF_FLAGS_STRUCT2 move.w (%a0),%d0 jra .Lcls_epilogue .Lcls_ret_sint8: move.l (%a0),%d0 | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. #if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) ext.w %d0 ext.l %d0 #else extb.l %d0 #endif jra .Lcls_epilogue 1: | CIF_FLAGS_SINT16 move.l (%a0),%d0 ext.l %d0 jra .Lcls_epilogue CFI_ENDPROC() .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) .globl CALLFUNC(ffi_closure_struct_SYSV) .type CALLFUNC(ffi_closure_struct_SYSV), @function .align 4 CALLFUNC(ffi_closure_struct_SYSV): CFI_STARTPROC() link %fp,#0 CFI_OFFSET(14,-8) CFI_DEF_CFA(14,8) move.l %sp,-12(%fp) pea 8(%fp) move.l %a1,-(%sp) move.l %a0,-(%sp) #if !defined __PIC__ jsr CALLFUNC(ffi_closure_SYSV_inner) #else bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) #endif unlk %fp rts CFI_ENDPROC() .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV) #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/metag/000077500000000000000000000000001265146633400160315ustar00rootroot00000000000000polyml-5.6/libffi/src/metag/ffi.c000066400000000000000000000207411265146633400167450ustar00rootroot00000000000000/* ---------------------------------------------------------------------- ffi.c - Copyright (c) 2013 Imagination Technologies Meta Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the `Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED `AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SIMON POSNJAK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #define MIN(a,b) (((a) < (b)) ? (a) : (b)) /* * ffi_prep_args is called by the assembly routine once stack space has been * allocated for the function's arguments */ unsigned int ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; argp = stack; /* Store return value */ if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { argp -= 4; *(void **) argp = ecif->rvalue; } p_argv = ecif->avalue; /* point to next location */ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) { size_t z; /* Move argp to address of argument */ z = (*p_arg)->size; argp -= z; /* Align if necessary */ argp = (char *) ALIGN_DOWN(ALIGN_DOWN(argp, (*p_arg)->alignment), 4); if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); case FFI_TYPE_STRUCT: memcpy(argp, *p_argv, (*p_arg)->size); break; default: FFI_ASSERT(0); } } else if ( z == sizeof(int)) { *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); } else { memcpy(argp, *p_argv, z); } } /* return the size of the arguments to be passed in registers, padded to an 8 byte boundary to preserve stack alignment */ return ALIGN(MIN(stack - argp, 6*4), 8); } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { ffi_type **ptr; unsigned i, bytes = 0; for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { if ((*ptr)->size == 0) return FFI_BAD_TYPEDEF; /* Perform a sanity check on the argument type, do this check after the initialization. */ FFI_ASSERT_VALID_TYPE(*ptr); /* Add any padding if necessary */ if (((*ptr)->alignment - 1) & bytes) bytes = ALIGN(bytes, (*ptr)->alignment); bytes += ALIGN((*ptr)->size, 4); } /* Ensure arg space is aligned to an 8-byte boundary */ bytes = ALIGN(bytes, 8); /* Make space for the return structure pointer */ if (cif->rtype->type == FFI_TYPE_STRUCT) { bytes += sizeof(void*); /* Ensure stack is aligned to an 8-byte boundary */ bytes = ALIGN(bytes, 8); } cif->bytes = bytes; /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags = (unsigned) cif->rtype->type; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = (unsigned) FFI_TYPE_SINT64; break; case FFI_TYPE_STRUCT: /* Meta can store return values which are <= 64 bits */ if (cif->rtype->size <= 4) /* Returned to D0Re0 as 32-bit value */ cif->flags = (unsigned)FFI_TYPE_INT; else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) /* Returned valued is stored to D1Re0|R0Re0 */ cif->flags = (unsigned)FFI_TYPE_DOUBLE; else /* value stored in memory */ cif->flags = (unsigned)FFI_TYPE_STRUCT; break; default: cif->flags = (unsigned)FFI_TYPE_INT; break; } return FFI_OK; } extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); /* * Exported in API. Entry point * cif -> ffi_cif object * fn -> function pointer * rvalue -> pointer to return value * avalue -> vector of void * pointers pointing to memory locations holding the * arguments */ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; int small_struct = (((cif->flags == FFI_TYPE_INT) || (cif->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); ecif.cif = cif; ecif.avalue = avalue; double temp; /* * If the return value is a struct and we don't have a return value address * then we need to make one */ if ((rvalue == NULL ) && (cif->flags == FFI_TYPE_STRUCT)) ecif.rvalue = alloca(cif->rtype->size); else if (small_struct) ecif.rvalue = &temp; else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); break; default: FFI_ASSERT(0); break; } if (small_struct) memcpy (rvalue, &temp, cif->rtype->size); } /* private members */ static void ffi_prep_incoming_args_SYSV (char *, void **, void **, ffi_cif*, float *); void ffi_closure_SYSV (ffi_closure *); /* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ /* end of private members */ /* * __tramp: trampoline memory location * __fun: assembly routine * __ctx: memory location for wrapper * * At this point, tramp[0] == __ctx ! */ void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); *(unsigned int*) &__tramp[40] = __ctx; *(unsigned int*) &__tramp[44] = __fun; /* This will flush the instruction cache */ __builtin_meta2_cachewd(&__tramp[0], 1); __builtin_meta2_cachewd(&__tramp[47], 1); } /* the cif must already be prepared */ ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { void (*closure_func)(ffi_closure*) = NULL; if (cif->abi == FFI_SYSV) closure_func = &ffi_closure_SYSV; else return FFI_BAD_ABI; ffi_init_trampoline( (unsigned char*)&closure->tramp[0], (unsigned int)closure_func, (unsigned int)codeloc); closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } /* This function is jumped to by the trampoline */ unsigned int ffi_closure_SYSV_inner (closure, respp, args, vfp_args) ffi_closure *closure; void **respp; void *args; void *vfp_args; { ffi_cif *cif; void **arg_area; cif = closure->cif; arg_area = (void**) alloca (cif->nargs * sizeof (void*)); /* * This call will initialize ARG_AREA, such that each * element in that array points to the corresponding * value on the stack; and if the function returns * a structure, it will re-set RESP to point to the * structure return address. */ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args); (closure->fun) ( cif, *respp, arg_area, closure->user_data); return cif->flags; } static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ffi_cif *cif, float *vfp_stack) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; /* stack points to original arguments */ argp = stack; /* Store return value */ if ( cif->flags == FFI_TYPE_STRUCT ) { argp -= 4; *rvalue = *(void **) argp; } p_argv = avalue; for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { size_t z; size_t alignment; alignment = (*p_arg)->alignment; if (alignment < 4) alignment = 4; if ((alignment - 1) & (unsigned)argp) argp = (char *) ALIGN(argp, alignment); z = (*p_arg)->size; *p_argv = (void*) argp; p_argv++; argp -= z; } return; } polyml-5.6/libffi/src/metag/ffitarget.h000066400000000000000000000036001265146633400201540ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. Target configuration macros for Meta Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_DEFAULT_ABI = FFI_SYSV, FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 48 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/metag/sysv.S000066400000000000000000000165351265146633400171730ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. Meta Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_MACHINE_ASM_H #include #else #ifdef __USER_LABEL_PREFIX__ #define CONCAT1(a, b) CONCAT2(a, b) #define CONCAT2(a, b) a ## b /* Use the right prefix for global labels. */ #define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) #else #define CNAME(x) x #endif #define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): #endif #ifdef __ELF__ #define LSYM(x) .x #else #define LSYM(x) x #endif .macro call_reg x= .text .balign 4 mov D1RtP, \x swap D1RtP, PC .endm ! Save register arguments .macro SAVE_ARGS .text .balign 4 setl [A0StP++], D0Ar6, D1Ar5 setl [A0StP++], D0Ar4, D1Ar3 setl [A0StP++], D0Ar2, D1Ar1 .endm ! Save retrun, frame pointer and other regs .macro SAVE_REGS regs= .text .balign 4 setl [A0StP++], D0FrT, D1RtP ! Needs to be a pair of regs .ifnc "\regs","" setl [A0StP++], \regs .endif .endm ! Declare a global function .macro METAG_FUNC_START name .text .balign 4 ENTRY(\name) .endm ! Return registers from the stack. Reverse SAVE_REGS operation .macro RET_REGS regs=, cond= .ifnc "\regs", "" getl \regs, [--A0StP] .endif getl D0FrT, D1RtP, [--A0StP] .endm ! Return arguments .macro RET_ARGS getl D0Ar2, D1Ar1, [--A0StP] getl D0Ar4, D1Ar3, [--A0StP] getl D0Ar6, D1Ar5, [--A0StP] .endm ! D1Ar1: fn ! D0Ar2: &ecif ! D1Ar3: cif->bytes ! D0Ar4: fig->flags ! D1Ar5: ecif.rvalue ! This assumes we are using GNU as METAG_FUNC_START ffi_call_SYSV ! Save argument registers SAVE_ARGS ! new frame mov D0FrT, A0FrP add A0FrP, A0StP, #0 ! Preserve the old frame pointer SAVE_REGS "D1.5, D0.5" ! Make room for new args. cifs->bytes is the total space for input ! and return arguments add A0StP, A0StP, D1Ar3 ! Preserve cifs->bytes & fn mov D0.5, D1Ar3 mov D1.5, D1Ar1 ! Place all of the ffi_prep_args in position mov D1Ar1, A0StP ! Call ffi_prep_args(stack, &ecif) #ifdef __PIC__ callr D1RtP, CNAME(ffi_prep_args@PLT) #else callr D1RtP, CNAME(ffi_prep_args) #endif ! Restore fn pointer ! The foreign stack should look like this ! XXXXX XXXXXX <--- stack pointer ! FnArgN rvalue ! FnArgN+2 FnArgN+1 ! FnArgN+4 FnArgN+3 ! .... ! ! A0StP now points to the first (or return) argument + 4 ! Preserve cif->bytes getl D0Ar2, D1Ar1, [--A0StP] getl D0Ar4, D1Ar3, [--A0StP] getl D0Ar6, D1Ar5, [--A0StP] ! Place A0StP to the first argument again add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each ! A0FrP points to the initial stack without the reserved space for the ! cifs->bytes, whilst A0StP points to the stack after the space allocation ! fn was the first argument of ffi_call_SYSV. ! The stack at this point looks like this: ! ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low ! Arg4 Arg3 | ! Arg2 Arg1 | ! A0FrP ----> D0FrtP D1RtP | ! D1.5 D0.5 | ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | ! FnArgn-2FnArgn-3 | ! ................ | <= cifs->bytes ! FnArg4 FnArg3 | ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high ! ! fn was in Arg1 so it's located in in A0FrP+#-0xC ! ! D0Re0 contains the size of arguments stored in registers sub A0StP, A0StP, D0Re0 ! Arg1 is the function pointer for the foreign call. This has been ! preserved in D1.5 ! Time to call (fn). Arguments should be like this: ! Arg1-Arg6 are loaded to regs ! The rest of the arguments are stored in stack pointed by A0StP call_reg D1.5 ! Reset stack. mov A0StP, A0FrP ! Load Arg1 with the pointer to storage for the return type ! This was stored in Arg5 getd D1Ar1, [A0FrP+#-20] ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) getd D0Ar2, [A0FrP+#-16] ! We are ready to start processing the return value ! D0Re0 (and D1Re0) hold the return value ! If the return value is NULL, assume no return value cmp D1Ar1, #0 beq LSYM(Lepilogue) ! return INT cmp D0Ar2, #FFI_TYPE_INT ! Sadly, there is no setd{cc} instruction so we need to workaround that bne .INT64 setd [D1Ar1], D0Re0 b LSYM(Lepilogue) ! return INT64 .INT64: cmp D0Ar2, #FFI_TYPE_SINT64 setleq [D1Ar1], D0Re0, D1Re0 ! return DOUBLE cmp D0Ar2, #FFI_TYPE_DOUBLE setl [D1AR1++], D0Re0, D1Re0 LSYM(Lepilogue): ! At this point, the stack pointer points right after the argument ! saved area. We need to restore 4 regs, therefore we need to move ! 16 bytes ahead. add A0StP, A0StP, #16 RET_REGS "D1.5, D0.5" RET_ARGS getd D0Re0, [A0StP] mov A0FrP, D0FrT swap D1RtP, PC .ffi_call_SYSV_end: .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) /* (called by ffi_metag_trampoline) void ffi_closure_SYSV (ffi_closure*) (called by ffi_closure_SYSV) unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (closure,respp, args) ffi_closure *closure; void **respp; void *args; */ METAG_FUNC_START ffi_closure_SYSV ! We assume that D1Ar1 holds the address of the ! ffi_closure struct. We will use that to fetch the ! arguments. The stack pointer points to an empty space ! and it is ready to store more data. ! D1Ar1 is ready ! Allocate stack space for return value add A0StP, A0StP, #8 ! Store it to D0Ar2 sub D0Ar2, A0StP, #8 sub D1Ar3, A0FrP, #4 ! D1Ar3 contains the address of the original D1Ar1 argument ! We need to subtract #4 later on ! Preverve D0Ar2 mov D0.5, D0Ar2 #ifdef __PIC__ callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) #else callr D1RtP, CNAME(ffi_closure_SYSV_inner) #endif ! Check the return value and store it to D0.5 cmp D0Re0, #FFI_TYPE_INT beq .Lretint cmp D0Re0, #FFI_TYPE_DOUBLE beq .Lretdouble .Lclosure_epilogue: sub A0StP, A0StP, #8 RET_REGS "D1.5, D0.5" RET_ARGS swap D1RtP, PC .Lretint: setd [D0.5], D0Re0 b .Lclosure_epilogue .Lretdouble: setl [D0.5++], D0Re0, D1Re0 b .Lclosure_epilogue .ffi_closure_SYSV_end: .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) ENTRY(ffi_metag_trampoline) SAVE_ARGS ! New frame mov A0FrP, A0StP SAVE_REGS "D1.5, D0.5" mov D0.5, PC ! Load D1Ar1 the value of ffi_metag_trampoline getd D1Ar1, [D0.5 + #8] ! Jump to ffi_closure_SYSV getd PC, [D0.5 + #12] polyml-5.6/libffi/src/microblaze/000077500000000000000000000000001265146633400170635ustar00rootroot00000000000000polyml-5.6/libffi/src/microblaze/ffi.c000066400000000000000000000214751265146633400200040ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc MicroBlaze Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, unsigned int, unsigned int, unsigned int*, void (*fn)(void), unsigned int, unsigned int); extern void ffi_closure_SYSV(void); #define WORD_SIZE sizeof(unsigned int) #define ARGS_REGISTER_SIZE (WORD_SIZE * 6) #define WORD_ALIGN(x) ALIGN(x, WORD_SIZE) /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void ffi_prep_args(void* stack, extended_cif* ecif) { unsigned int i; ffi_type** p_arg; void** p_argv; void* stack_args_p = stack; p_argv = ecif->avalue; if (ecif == NULL || ecif->cif == NULL) { return; /* no description to prepare */ } if ((ecif->cif->rtype != NULL) && (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) { /* if return type is a struct which is referenced on the stack/reg5, * by a pointer. Stored the return value pointer in r5. */ char* addr = stack_args_p; memcpy(addr, &(ecif->rvalue), WORD_SIZE); stack_args_p += WORD_SIZE; } if (ecif->avalue == NULL) { return; /* no arguments to prepare */ } for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) { size_t size = (*p_arg)->size; int type = (*p_arg)->type; void* value = p_argv[i]; char* addr = stack_args_p; int aligned_size = WORD_ALIGN(size); /* force word alignment on the stack */ stack_args_p += aligned_size; switch (type) { case FFI_TYPE_UINT8: *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); break; case FFI_TYPE_SINT8: *(signed int *)addr = (signed int)*(SINT8*)(value); break; case FFI_TYPE_UINT16: *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); break; case FFI_TYPE_SINT16: *(signed int *)addr = (signed int)*(SINT16*)(value); break; case FFI_TYPE_STRUCT: #if __BIG_ENDIAN__ /* * MicroBlaze toolchain appears to emit: * bsrli r5, r5, 8 (caller) * ... * * ... * bslli r5, r5, 8 (callee) * * For structs like "struct a { uint8_t a[3]; };", when passed * by value. * * Structs like "struct b { uint16_t a; };" are also expected * to be packed strangely in registers. * * This appears to be because the microblaze toolchain expects * "struct b == uint16_t", which is only any issue for big * endian. * * The following is a work around for big-endian only, for the * above mentioned case, it will re-align the contents of a * <= 3-byte struct value. */ if (size < WORD_SIZE) { memcpy (addr + (WORD_SIZE - size), value, size); break; } #endif case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_FLOAT: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_DOUBLE: default: memcpy(addr, value, aligned_size); } } } ffi_status ffi_prep_cif_machdep(ffi_cif* cif) { /* check ABI */ switch (cif->abi) { case FFI_SYSV: break; default: return FFI_BAD_ABI; } return FFI_OK; } void ffi_call(ffi_cif* cif, void (*fn)(void), void* rvalue, void** avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else { ecif.rvalue = rvalue; } switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn, cif->rtype->type, cif->rtype->size); break; default: FFI_ASSERT(0); break; } } void ffi_closure_call_SYSV(void* register_args, void* stack_args, ffi_closure* closure, void* rvalue, unsigned int* rtype, unsigned int* rsize) { /* prepare arguments for closure call */ ffi_cif* cif = closure->cif; ffi_type** arg_types = cif->arg_types; /* re-allocate data for the args. This needs to be done in order to keep * multi-word objects (e.g. structs) in contigious memory. Callers are not * required to store the value of args in the lower 6 words in the stack * (although they are allocated in the stack). */ char* stackclone = alloca(cif->bytes); void** avalue = alloca(cif->nargs * sizeof(void*)); void* struct_rvalue = NULL; char* ptr = stackclone; int i; /* copy registers into stack clone */ int registers_used = cif->bytes; if (registers_used > ARGS_REGISTER_SIZE) { registers_used = ARGS_REGISTER_SIZE; } memcpy(stackclone, register_args, registers_used); /* copy stack allocated args into stack clone */ if (cif->bytes > ARGS_REGISTER_SIZE) { int stack_used = cif->bytes - ARGS_REGISTER_SIZE; memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); } /* preserve struct type return pointer passing */ if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { struct_rvalue = *((void**)ptr); ptr += WORD_SIZE; } /* populate arg pointer list */ for (i = 0; i < cif->nargs; i++) { switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: #ifdef __BIG_ENDIAN__ avalue[i] = ptr + 3; #else avalue[i] = ptr; #endif break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: #ifdef __BIG_ENDIAN__ avalue[i] = ptr + 2; #else avalue[i] = ptr; #endif break; case FFI_TYPE_STRUCT: #if __BIG_ENDIAN__ /* * Work around strange ABI behaviour. * (see info in ffi_prep_args) */ if (arg_types[i]->size < WORD_SIZE) { memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); } #endif avalue[i] = (void*)ptr; break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_DOUBLE: avalue[i] = ptr; break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_FLOAT: default: /* default 4-byte argument */ avalue[i] = ptr; break; } ptr += WORD_ALIGN(arg_types[i]->size); } /* set the return type info passed back to the wrapper */ *rsize = cif->rtype->size; *rtype = cif->rtype->type; if (struct_rvalue != NULL) { closure->fun(cif, struct_rvalue, avalue, closure->user_data); /* copy struct return pointer value into function return value */ *((void**)rvalue) = struct_rvalue; } else { closure->fun(cif, rvalue, avalue, closure->user_data); } } ffi_status ffi_prep_closure_loc( ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void* user_data, void* codeloc) { unsigned long* tramp = (unsigned long*)&(closure->tramp[0]); unsigned long cls = (unsigned long)codeloc; unsigned long fn = 0; unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; switch (cif->abi) { case FFI_SYSV: fn = (unsigned long)ffi_closure_SYSV; /* load r11 (temp) with fn */ /* imm fn(upper) */ tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); /* addik r11, r0, fn(lower) */ tramp[1] = 0x31600000 | (fn & 0xffff); /* load r12 (temp) with cls */ /* imm cls(upper) */ tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); /* addik r12, r0, cls(lower) */ tramp[3] = 0x31800000 | (cls & 0xffff); /* load r3 (temp) with ffi_closure_call_SYSV */ /* imm fn_closure_call_sysv(upper) */ tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); /* addik r3, r0, fn_closure_call_sysv(lower) */ tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); /* branch/jump to address stored in r11 (fn) */ tramp[6] = 0x98085800; /* bra r11 */ break; default: return FFI_BAD_ABI; } return FFI_OK; } polyml-5.6/libffi/src/microblaze/ffitarget.h000066400000000000000000000034441265146633400212140ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc Target configuration macros for MicroBlaze. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif /* Definitions for closures */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 #define FFI_TRAMPOLINE_SIZE (4*8) #endif polyml-5.6/libffi/src/microblaze/sysv.S000066400000000000000000000211021265146633400202070ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc MicroBlaze Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include /* * arg[0] (r5) = ffi_prep_args, * arg[1] (r6) = &ecif, * arg[2] (r7) = cif->bytes, * arg[3] (r8) = cif->flags, * arg[4] (r9) = ecif.rvalue, * arg[5] (r10) = fn * arg[6] (sp[0]) = cif->rtype->type * arg[7] (sp[4]) = cif->rtype->size */ .text .globl ffi_call_SYSV .type ffi_call_SYSV, @function ffi_call_SYSV: /* push callee saves */ addik r1, r1, -20 swi r19, r1, 0 /* Frame Pointer */ swi r20, r1, 4 /* PIC register */ swi r21, r1, 8 /* PIC register */ swi r22, r1, 12 /* save for locals */ swi r23, r1, 16 /* save for locals */ /* save the r5-r10 registers in the stack */ addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ swi r5, r1, 0 swi r6, r1, 4 swi r7, r1, 8 swi r8, r1, 12 swi r9, r1, 16 swi r10, r1, 20 /* save function pointer */ addik r3, r5, 0 /* copy ffi_prep_args into r3 */ addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ addik r23, r10, 0 /* save function address into r23 (callee-saved) */ /* prepare stack with allocation for n (bytes = r7) args */ rsub r1, r7, r1 /* subtract bytes from sp */ /* prep args for ffi_prep_args call */ addik r5, r1, 0 /* store stack pointer into arg[0] */ /* r6 still holds ecif for arg[1] */ /* Call ffi_prep_args(stack, &ecif). */ addik r1, r1, -4 swi r15, r1, 0 /* store the link register in the frame */ brald r15, r3 nop /* branch has delay slot */ lwi r15, r1, 0 addik r1, r1, 4 /* restore the link register from the frame */ /* returns calling stack pointer location */ /* prepare args for fn call, prep_args populates them onto the stack */ lwi r5, r1, 0 /* arg[0] */ lwi r6, r1, 4 /* arg[1] */ lwi r7, r1, 8 /* arg[2] */ lwi r8, r1, 12 /* arg[3] */ lwi r9, r1, 16 /* arg[4] */ lwi r10, r1, 20 /* arg[5] */ /* call (fn) (...). */ addik r1, r1, -4 swi r15, r1, 0 /* store the link register in the frame */ brald r15, r23 nop /* branch has delay slot */ lwi r15, r1, 0 addik r1, r1, 4 /* restore the link register from the frame */ /* Remove the space we pushed for the args. */ addik r1, r22, 0 /* restore old SP */ /* restore this functions parameters */ lwi r5, r1, 0 /* arg[0] */ lwi r6, r1, 4 /* arg[1] */ lwi r7, r1, 8 /* arg[2] */ lwi r8, r1, 12 /* arg[3] */ lwi r9, r1, 16 /* arg[4] */ lwi r10, r1, 20 /* arg[5] */ addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ /* If the return value pointer is NULL, assume no return value. */ beqi r9, ffi_call_SYSV_end lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ /* Check if return type is actually a struct, do nothing */ rsubi r11, r22, FFI_TYPE_STRUCT beqi r11, ffi_call_SYSV_end /* Return 8bit */ rsubi r11, r23, 1 beqi r11, ffi_call_SYSV_store8 /* Return 16bit */ rsubi r11, r23, 2 beqi r11, ffi_call_SYSV_store16 /* Return 32bit */ rsubi r11, r23, 4 beqi r11, ffi_call_SYSV_store32 /* Return 64bit */ rsubi r11, r23, 8 beqi r11, ffi_call_SYSV_store64 /* Didnt match anything */ bri ffi_call_SYSV_end ffi_call_SYSV_store64: swi r3, r9, 0 /* store word r3 into return value */ swi r4, r9, 4 /* store word r4 into return value */ bri ffi_call_SYSV_end ffi_call_SYSV_store32: swi r3, r9, 0 /* store word r3 into return value */ bri ffi_call_SYSV_end ffi_call_SYSV_store16: #ifdef __BIG_ENDIAN__ shi r3, r9, 2 /* store half-word r3 into return value */ #else shi r3, r9, 0 /* store half-word r3 into return value */ #endif bri ffi_call_SYSV_end ffi_call_SYSV_store8: #ifdef __BIG_ENDIAN__ sbi r3, r9, 3 /* store byte r3 into return value */ #else sbi r3, r9, 0 /* store byte r3 into return value */ #endif bri ffi_call_SYSV_end ffi_call_SYSV_end: /* callee restores */ lwi r19, r1, 0 /* frame pointer */ lwi r20, r1, 4 /* PIC register */ lwi r21, r1, 8 /* PIC register */ lwi r22, r1, 12 lwi r23, r1, 16 addik r1, r1, 20 /* return from sub-routine (with delay slot) */ rtsd r15, 8 nop .size ffi_call_SYSV, . - ffi_call_SYSV /* ------------------------------------------------------------------------- */ /* * args passed into this function, are passed down to the callee. * this function is the target of the closure trampoline, as such r12 is * a pointer to the closure object. */ .text .globl ffi_closure_SYSV .type ffi_closure_SYSV, @function ffi_closure_SYSV: /* push callee saves */ addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ addik r1, r1, -12 swi r19, r1, 0 /* Frame Pointer */ swi r20, r1, 4 /* PIC register */ swi r21, r1, 8 /* PIC register */ /* store register args on stack */ addik r1, r1, -24 swi r5, r1, 0 swi r6, r1, 4 swi r7, r1, 8 swi r8, r1, 12 swi r9, r1, 16 swi r10, r1, 20 /* setup args */ addik r5, r1, 0 /* register_args */ addik r6, r11, 0 /* stack_args */ addik r7, r12, 0 /* closure object */ addik r1, r1, -8 /* allocate return value */ addik r8, r1, 0 /* void* rvalue */ addik r1, r1, -8 /* allocate for reutrn type/size values */ addik r9, r1, 0 /* void* rtype */ addik r10, r1, 4 /* void* rsize */ /* call the wrap_call function */ addik r1, r1, -28 /* allocate args + link reg */ swi r15, r1, 0 /* store the link register in the frame */ brald r15, r3 nop /* branch has delay slot */ lwi r15, r1, 0 addik r1, r1, 28 /* restore the link register from the frame */ ffi_closure_SYSV_prepare_return: lwi r9, r1, 0 /* rtype */ lwi r10, r1, 4 /* rsize */ addik r1, r1, 8 /* de-allocate return info values */ /* Check if return type is actually a struct, store 4 bytes */ rsubi r11, r9, FFI_TYPE_STRUCT beqi r11, ffi_closure_SYSV_store32 /* Return 8bit */ rsubi r11, r10, 1 beqi r11, ffi_closure_SYSV_store8 /* Return 16bit */ rsubi r11, r10, 2 beqi r11, ffi_closure_SYSV_store16 /* Return 32bit */ rsubi r11, r10, 4 beqi r11, ffi_closure_SYSV_store32 /* Return 64bit */ rsubi r11, r10, 8 beqi r11, ffi_closure_SYSV_store64 /* Didnt match anything */ bri ffi_closure_SYSV_end ffi_closure_SYSV_store64: lwi r3, r1, 0 /* store word r3 into return value */ lwi r4, r1, 4 /* store word r4 into return value */ /* 64 bits == 2 words, no sign extend occurs */ bri ffi_closure_SYSV_end ffi_closure_SYSV_store32: lwi r3, r1, 0 /* store word r3 into return value */ /* 32 bits == 1 word, no sign extend occurs */ bri ffi_closure_SYSV_end ffi_closure_SYSV_store16: #ifdef __BIG_ENDIAN__ lhui r3, r1, 2 /* store half-word r3 into return value */ #else lhui r3, r1, 0 /* store half-word r3 into return value */ #endif rsubi r11, r9, FFI_TYPE_SINT16 bnei r11, ffi_closure_SYSV_end sext16 r3, r3 /* fix sign extend of sint8 */ bri ffi_closure_SYSV_end ffi_closure_SYSV_store8: #ifdef __BIG_ENDIAN__ lbui r3, r1, 3 /* store byte r3 into return value */ #else lbui r3, r1, 0 /* store byte r3 into return value */ #endif rsubi r11, r9, FFI_TYPE_SINT8 bnei r11, ffi_closure_SYSV_end sext8 r3, r3 /* fix sign extend of sint8 */ bri ffi_closure_SYSV_end ffi_closure_SYSV_end: addik r1, r1, 8 /* de-allocate return value */ /* de-allocate stored args */ addik r1, r1, 24 /* callee restores */ lwi r19, r1, 0 /* frame pointer */ lwi r20, r1, 4 /* PIC register */ lwi r21, r1, 8 /* PIC register */ addik r1, r1, 12 /* return from sub-routine (with delay slot) */ rtsd r15, 8 nop .size ffi_closure_SYSV, . - ffi_closure_SYSV polyml-5.6/libffi/src/mips/000077500000000000000000000000001265146633400157045ustar00rootroot00000000000000polyml-5.6/libffi/src/mips/ffi.c000066400000000000000000000634771265146633400166350ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2011 Anthony Green Copyright (c) 2008 David Daney Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. MIPS Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #ifdef __GNUC__ # if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) # define USE__BUILTIN___CLEAR_CACHE 1 # endif #endif #ifndef USE__BUILTIN___CLEAR_CACHE # if defined(__OpenBSD__) # include # else # include # endif #endif #ifdef FFI_DEBUG # define FFI_MIPS_STOP_HERE() ffi_stop_here() #else # define FFI_MIPS_STOP_HERE() do {} while(0) #endif #ifdef FFI_MIPS_N32 #define FIX_ARGP \ FFI_ASSERT(argp <= &stack[bytes]); \ if (argp == &stack[bytes]) \ { \ argp = stack; \ FFI_MIPS_STOP_HERE(); \ } #else #define FIX_ARGP #endif /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ static void ffi_prep_args(char *stack, extended_cif *ecif, int bytes, int flags) { int i; void **p_argv; char *argp; ffi_type **p_arg; #ifdef FFI_MIPS_N32 /* If more than 8 double words are used, the remainder go on the stack. We reorder stuff on the stack here to support this easily. */ if (bytes > 8 * sizeof(ffi_arg)) argp = &stack[bytes - (8 * sizeof(ffi_arg))]; else argp = stack; #else argp = stack; #endif memset(stack, 0, bytes); #ifdef FFI_MIPS_N32 if ( ecif->cif->rstruct_flag != 0 ) #else if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) #endif { *(ffi_arg *) argp = (ffi_arg) ecif->rvalue; argp += sizeof(ffi_arg); FIX_ARGP; } p_argv = ecif->avalue; for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) { size_t z; unsigned int a; /* Align if necessary. */ a = (*p_arg)->alignment; if (a < sizeof(ffi_arg)) a = sizeof(ffi_arg); if ((a - 1) & (unsigned long) argp) { argp = (char *) ALIGN(argp, a); FIX_ARGP; } z = (*p_arg)->size; if (z <= sizeof(ffi_arg)) { int type = (*p_arg)->type; z = sizeof(ffi_arg); /* The size of a pointer depends on the ABI */ if (type == FFI_TYPE_POINTER) type = (ecif->cif->abi == FFI_N64 || ecif->cif->abi == FFI_N64_SOFT_FLOAT) ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT || ecif->cif->abi == FFI_N64_SOFT_FLOAT)) { switch (type) { case FFI_TYPE_FLOAT: type = FFI_TYPE_UINT32; break; case FFI_TYPE_DOUBLE: type = FFI_TYPE_UINT64; break; default: break; } } switch (type) { case FFI_TYPE_SINT8: *(ffi_arg *)argp = *(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(ffi_arg *)argp = *(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(ffi_arg *)argp = *(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(ffi_arg *)argp = *(UINT16 *)(* p_argv); break; case FFI_TYPE_SINT32: *(ffi_arg *)argp = *(SINT32 *)(* p_argv); break; case FFI_TYPE_UINT32: *(ffi_arg *)argp = *(UINT32 *)(* p_argv); break; /* This can only happen with 64bit slots. */ case FFI_TYPE_FLOAT: *(float *) argp = *(float *)(* p_argv); break; /* Handle structures. */ default: memcpy(argp, *p_argv, (*p_arg)->size); break; } } else { #ifdef FFI_MIPS_O32 memcpy(argp, *p_argv, z); #else { unsigned long end = (unsigned long) argp + z; unsigned long cap = (unsigned long) stack + bytes; /* Check if the data will fit within the register space. Handle it if it doesn't. */ if (end <= cap) memcpy(argp, *p_argv, z); else { unsigned long portion = cap - (unsigned long)argp; memcpy(argp, *p_argv, portion); argp = stack; z -= portion; memcpy(argp, (void*)((unsigned long)(*p_argv) + portion), z); } } #endif } p_argv++; argp += z; FIX_ARGP; } } #ifdef FFI_MIPS_N32 /* The n32 spec says that if "a chunk consists solely of a double float field (but not a double, which is part of a union), it is passed in a floating point register. Any other chunk is passed in an integer register". This code traverses structure definitions and generates the appropriate flags. */ static unsigned calc_n32_struct_flags(int soft_float, ffi_type *arg, unsigned *loc, unsigned *arg_reg) { unsigned flags = 0; unsigned index = 0; ffi_type *e; if (soft_float) return 0; while ((e = arg->elements[index])) { /* Align this object. */ *loc = ALIGN(*loc, e->alignment); if (e->type == FFI_TYPE_DOUBLE) { /* Already aligned to FFI_SIZEOF_ARG. */ *arg_reg = *loc / FFI_SIZEOF_ARG; if (*arg_reg > 7) break; flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS)); *loc += e->size; } else *loc += e->size; index++; } /* Next Argument register at alignment of FFI_SIZEOF_ARG. */ *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; return flags; } static unsigned calc_n32_return_struct_flags(int soft_float, ffi_type *arg) { unsigned flags = 0; unsigned small = FFI_TYPE_SMALLSTRUCT; ffi_type *e; /* Returning structures under n32 is a tricky thing. A struct with only one or two floating point fields is returned in $f0 (and $f2 if necessary). Any other struct results at most 128 bits are returned in $2 (the first 64 bits) and $3 (remainder, if necessary). Larger structs are handled normally. */ if (arg->size > 16) return 0; if (arg->size > 8) small = FFI_TYPE_SMALLSTRUCT2; e = arg->elements[0]; if (e->type == FFI_TYPE_DOUBLE) flags = FFI_TYPE_DOUBLE; else if (e->type == FFI_TYPE_FLOAT) flags = FFI_TYPE_FLOAT; if (flags && (e = arg->elements[1])) { if (e->type == FFI_TYPE_DOUBLE) flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS; else if (e->type == FFI_TYPE_FLOAT) flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS; else return small; if (flags && (arg->elements[2])) { /* There are three arguments and the first two are floats! This must be passed the old way. */ return small; } if (soft_float) flags += FFI_TYPE_STRUCT_SOFT; } else if (!flags) return small; return flags; } #endif /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { cif->flags = 0; #ifdef FFI_MIPS_O32 /* Set the flags necessary for O32 processing. FFI_O32_SOFT_FLOAT * does not have special handling for floating point args. */ if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32) { if (cif->nargs > 0) { switch ((cif->arg_types)[0]->type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags += (cif->arg_types)[0]->type; break; default: break; } if (cif->nargs > 1) { /* Only handle the second argument if the first is a float or double. */ if (cif->flags) { switch ((cif->arg_types)[1]->type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS; break; default: break; } } } } } /* Set the return type flag */ if (cif->abi == FFI_O32_SOFT_FLOAT) { switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_STRUCT: cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_DOUBLE: cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); break; case FFI_TYPE_FLOAT: default: cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); break; } } else { /* FFI_O32 */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_STRUCT: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2); break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2); break; default: cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2); break; } } #endif #ifdef FFI_MIPS_N32 /* Set the flags necessary for N32 processing */ { int type; unsigned arg_reg = 0; unsigned loc = 0; unsigned count = (cif->nargs < 8) ? cif->nargs : 8; unsigned index = 0; unsigned struct_flags = 0; int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N64_SOFT_FLOAT); if (cif->rtype->type == FFI_TYPE_STRUCT) { struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype); if (struct_flags == 0) { /* This means that the structure is being passed as a hidden argument */ arg_reg = 1; count = (cif->nargs < 7) ? cif->nargs : 7; cif->rstruct_flag = !0; } else cif->rstruct_flag = 0; } else cif->rstruct_flag = 0; while (count-- > 0 && arg_reg < 8) { type = (cif->arg_types)[index]->type; if (soft_float) { switch (type) { case FFI_TYPE_FLOAT: type = FFI_TYPE_UINT32; break; case FFI_TYPE_DOUBLE: type = FFI_TYPE_UINT64; break; default: break; } } switch (type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags += ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS)); arg_reg++; break; case FFI_TYPE_LONGDOUBLE: /* Align it. */ arg_reg = ALIGN(arg_reg, 2); /* Treat it as two adjacent doubles. */ if (soft_float) { arg_reg += 2; } else { cif->flags += (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); arg_reg++; cif->flags += (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS)); arg_reg++; } break; case FFI_TYPE_STRUCT: loc = arg_reg * FFI_SIZEOF_ARG; cif->flags += calc_n32_struct_flags(soft_float, (cif->arg_types)[index], &loc, &arg_reg); break; default: arg_reg++; break; } index++; } /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_STRUCT: { if (struct_flags == 0) { /* The structure is returned through a hidden first argument. Do nothing, 'cause FFI_TYPE_VOID is 0 */ } else { /* The structure is returned via some tricky mechanism */ cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8)); } break; } case FFI_TYPE_VOID: /* Do nothing, 'cause FFI_TYPE_VOID is 0 */ break; case FFI_TYPE_POINTER: if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32) cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); else cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); break; case FFI_TYPE_FLOAT: if (soft_float) { cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8); break; } /* else fall through */ case FFI_TYPE_DOUBLE: if (soft_float) cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); else cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8); break; case FFI_TYPE_LONGDOUBLE: /* Long double is returned as if it were a struct containing two doubles. */ if (soft_float) { cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8)); } else { cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8); cif->flags += (FFI_TYPE_DOUBLE + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS)) << (4 + (FFI_FLAG_BITS * 8)); } break; default: cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8); break; } } #endif return FFI_OK; } /* Low level routine for calling O32 functions */ extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), extended_cif *, unsigned, unsigned, unsigned *, void (*)(void)); /* Low level routine for calling N32 functions */ extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), extended_cif *, unsigned, unsigned, void *, void (*)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) ecif.rvalue = alloca(cif->rtype->size); else ecif.rvalue = rvalue; switch (cif->abi) { #ifdef FFI_MIPS_O32 case FFI_O32: case FFI_O32_SOFT_FLOAT: ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; #endif #ifdef FFI_MIPS_N32 case FFI_N32: case FFI_N32_SOFT_FLOAT: case FFI_N64: case FFI_N64_SOFT_FLOAT: { int copy_rvalue = 0; int copy_offset = 0; char *rvalue_copy = ecif.rvalue; if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16) { /* For structures smaller than 16 bytes we clobber memory in 8 byte increments. Make a copy so we don't clobber the callers memory outside of the struct bounds. */ rvalue_copy = alloca(16); copy_rvalue = 1; } else if (cif->rtype->type == FFI_TYPE_FLOAT && (cif->abi == FFI_N64_SOFT_FLOAT || cif->abi == FFI_N32_SOFT_FLOAT)) { rvalue_copy = alloca (8); copy_rvalue = 1; #if defined(__MIPSEB__) || defined(_MIPSEB) copy_offset = 4; #endif } ffi_call_N32(ffi_prep_args, &ecif, cif->bytes, cif->flags, rvalue_copy, fn); if (copy_rvalue) memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); } break; #endif default: FFI_ASSERT(0); break; } } #if FFI_CLOSURES #if defined(FFI_MIPS_O32) extern void ffi_closure_O32(void); #else extern void ffi_closure_N32(void); #endif /* FFI_MIPS_O32 */ ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { unsigned int *tramp = (unsigned int *) &closure->tramp[0]; void * fn; char *clear_location = (char *) codeloc; #if defined(FFI_MIPS_O32) if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) return FFI_BAD_ABI; fn = ffi_closure_O32; #else #if _MIPS_SIM ==_ABIN32 if (cif->abi != FFI_N32 && cif->abi != FFI_N32_SOFT_FLOAT) return FFI_BAD_ABI; #else if (cif->abi != FFI_N64 && cif->abi != FFI_N64_SOFT_FLOAT) return FFI_BAD_ABI; #endif fn = ffi_closure_N32; #endif /* FFI_MIPS_O32 */ #if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) /* lui $25,high(fn) */ tramp[0] = 0x3c190000 | ((unsigned)fn >> 16); /* ori $25,low(fn) */ tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff); /* lui $12,high(codeloc) */ tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); /* jr $25 */ tramp[3] = 0x03200008; /* ori $12,low(codeloc) */ tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); #else /* N64 has a somewhat larger trampoline. */ /* lui $25,high(fn) */ tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48); /* lui $12,high(codeloc) */ tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48); /* ori $25,mid-high(fn) */ tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff); /* ori $12,mid-high(codeloc) */ tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff); /* dsll $25,$25,16 */ tramp[4] = 0x0019cc38; /* dsll $12,$12,16 */ tramp[5] = 0x000c6438; /* ori $25,mid-low(fn) */ tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff); /* ori $12,mid-low(codeloc) */ tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff); /* dsll $25,$25,16 */ tramp[8] = 0x0019cc38; /* dsll $12,$12,16 */ tramp[9] = 0x000c6438; /* ori $25,low(fn) */ tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); /* jr $25 */ tramp[11] = 0x03200008; /* ori $12,low(codeloc) */ tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; #ifdef USE__BUILTIN___CLEAR_CACHE __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE); #else cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE); #endif return FFI_OK; } /* * Decodes the arguments to a function, which will be stored on the * stack. AR is the pointer to the beginning of the integer arguments * (and, depending upon the arguments, some floating-point arguments * as well). FPR is a pointer to the area where floating point * registers have been saved, if any. * * RVALUE is the location where the function return value will be * stored. CLOSURE is the prepared closure to invoke. * * This function should only be called from assembly, which is in * turn called from a trampoline. * * Returns the function return type. * * Based on the similar routine for sparc. */ int ffi_closure_mips_inner_O32 (ffi_closure *closure, void *rvalue, ffi_arg *ar, double *fpr) { ffi_cif *cif; void **avaluep; ffi_arg *avalue; ffi_type **arg_types; int i, avn, argn, seen_int; cif = closure->cif; avalue = alloca (cif->nargs * sizeof (ffi_arg)); avaluep = alloca (cif->nargs * sizeof (ffi_arg)); seen_int = (cif->abi == FFI_O32_SOFT_FLOAT); argn = 0; if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) { rvalue = (void *)(UINT32)ar[0]; argn = 1; } i = 0; avn = cif->nargs; arg_types = cif->arg_types; while (i < avn) { if (i < 2 && !seen_int && (arg_types[i]->type == FFI_TYPE_FLOAT || arg_types[i]->type == FFI_TYPE_DOUBLE || arg_types[i]->type == FFI_TYPE_LONGDOUBLE)) { #if defined(__MIPSEB__) || defined(_MIPSEB) if (arg_types[i]->type == FFI_TYPE_FLOAT) avaluep[i] = ((char *) &fpr[i]) + sizeof (float); else #endif avaluep[i] = (char *) &fpr[i]; } else { if (arg_types[i]->alignment == 8 && (argn & 0x1)) argn++; switch (arg_types[i]->type) { case FFI_TYPE_SINT8: avaluep[i] = &avalue[i]; *(SINT8 *) &avalue[i] = (SINT8) ar[argn]; break; case FFI_TYPE_UINT8: avaluep[i] = &avalue[i]; *(UINT8 *) &avalue[i] = (UINT8) ar[argn]; break; case FFI_TYPE_SINT16: avaluep[i] = &avalue[i]; *(SINT16 *) &avalue[i] = (SINT16) ar[argn]; break; case FFI_TYPE_UINT16: avaluep[i] = &avalue[i]; *(UINT16 *) &avalue[i] = (UINT16) ar[argn]; break; default: avaluep[i] = (char *) &ar[argn]; break; } seen_int = 1; } argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; i++; } /* Invoke the closure. */ (closure->fun) (cif, rvalue, avaluep, closure->user_data); if (cif->abi == FFI_O32_SOFT_FLOAT) { switch (cif->rtype->type) { case FFI_TYPE_FLOAT: return FFI_TYPE_INT; case FFI_TYPE_DOUBLE: return FFI_TYPE_UINT64; default: return cif->rtype->type; } } else { return cif->rtype->type; } } #if defined(FFI_MIPS_N32) static void copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type, int argn, unsigned arg_offset, ffi_arg *ar, ffi_arg *fpr, int soft_float) { ffi_type **elt_typep = type->elements; while(*elt_typep) { ffi_type *elt_type = *elt_typep; unsigned o; char *tp; char *argp; char *fpp; o = ALIGN(offset, elt_type->alignment); arg_offset += o - offset; offset = o; argn += arg_offset / sizeof(ffi_arg); arg_offset = arg_offset % sizeof(ffi_arg); argp = (char *)(ar + argn); fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn); tp = target + offset; if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float) *(double *)tp = *(double *)fpp; else memcpy(tp, argp + arg_offset, elt_type->size); offset += elt_type->size; arg_offset += elt_type->size; elt_typep++; argn += arg_offset / sizeof(ffi_arg); arg_offset = arg_offset % sizeof(ffi_arg); } } /* * Decodes the arguments to a function, which will be stored on the * stack. AR is the pointer to the beginning of the integer * arguments. FPR is a pointer to the area where floating point * registers have been saved. * * RVALUE is the location where the function return value will be * stored. CLOSURE is the prepared closure to invoke. * * This function should only be called from assembly, which is in * turn called from a trampoline. * * Returns the function return flags. * */ int ffi_closure_mips_inner_N32 (ffi_closure *closure, void *rvalue, ffi_arg *ar, ffi_arg *fpr) { ffi_cif *cif; void **avaluep; ffi_arg *avalue; ffi_type **arg_types; int i, avn, argn; int soft_float; ffi_arg *argp; cif = closure->cif; soft_float = cif->abi == FFI_N64_SOFT_FLOAT || cif->abi == FFI_N32_SOFT_FLOAT; avalue = alloca (cif->nargs * sizeof (ffi_arg)); avaluep = alloca (cif->nargs * sizeof (ffi_arg)); argn = 0; if (cif->rstruct_flag) { #if _MIPS_SIM==_ABIN32 rvalue = (void *)(UINT32)ar[0]; #else /* N64 */ rvalue = (void *)ar[0]; #endif argn = 1; } i = 0; avn = cif->nargs; arg_types = cif->arg_types; while (i < avn) { if (arg_types[i]->type == FFI_TYPE_FLOAT || arg_types[i]->type == FFI_TYPE_DOUBLE || arg_types[i]->type == FFI_TYPE_LONGDOUBLE) { argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn; if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1))) { argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment); argn++; } #if defined(__MIPSEB__) || defined(_MIPSEB) if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8) avaluep[i] = ((char *) argp) + sizeof (float); else #endif avaluep[i] = (char *) argp; } else { unsigned type = arg_types[i]->type; if (arg_types[i]->alignment > sizeof(ffi_arg)) argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg)); argp = ar + argn; /* The size of a pointer depends on the ABI */ if (type == FFI_TYPE_POINTER) type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT) ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32; if (soft_float && type == FFI_TYPE_FLOAT) type = FFI_TYPE_UINT32; switch (type) { case FFI_TYPE_SINT8: avaluep[i] = &avalue[i]; *(SINT8 *) &avalue[i] = (SINT8) *argp; break; case FFI_TYPE_UINT8: avaluep[i] = &avalue[i]; *(UINT8 *) &avalue[i] = (UINT8) *argp; break; case FFI_TYPE_SINT16: avaluep[i] = &avalue[i]; *(SINT16 *) &avalue[i] = (SINT16) *argp; break; case FFI_TYPE_UINT16: avaluep[i] = &avalue[i]; *(UINT16 *) &avalue[i] = (UINT16) *argp; break; case FFI_TYPE_SINT32: avaluep[i] = &avalue[i]; *(SINT32 *) &avalue[i] = (SINT32) *argp; break; case FFI_TYPE_UINT32: avaluep[i] = &avalue[i]; *(UINT32 *) &avalue[i] = (UINT32) *argp; break; case FFI_TYPE_STRUCT: if (argn < 8) { /* Allocate space for the struct as at least part of it was passed in registers. */ avaluep[i] = alloca(arg_types[i]->size); copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i], argn, 0, ar, fpr, soft_float); break; } /* Else fall through. */ default: avaluep[i] = (char *) argp; break; } } argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); i++; } /* Invoke the closure. */ (closure->fun) (cif, rvalue, avaluep, closure->user_data); return cif->flags >> (FFI_FLAG_BITS * 8); } #endif /* FFI_MIPS_N32 */ #endif /* FFI_CLOSURES */ polyml-5.6/libffi/src/mips/ffitarget.h000066400000000000000000000146341265146633400200400ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for MIPS. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifdef linux # include #elif defined(__rtems__) /* * Subprogram calling convention - copied from sgidefs.h */ #define _MIPS_SIM_ABI32 1 #define _MIPS_SIM_NABI32 2 #define _MIPS_SIM_ABI64 3 #elif !defined(__OpenBSD__) # include #endif # ifndef _ABIN32 # define _ABIN32 _MIPS_SIM_NABI32 # endif # ifndef _ABI64 # define _ABI64 _MIPS_SIM_ABI64 # endif # ifndef _ABIO32 # define _ABIO32 _MIPS_SIM_ABI32 # endif #if !defined(_MIPS_SIM) # error -- something is very wrong -- #else # if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64)) # define FFI_MIPS_N32 # else # if (_MIPS_SIM==_ABIO32 && defined(_ABIO32)) # define FFI_MIPS_O32 # else # error -- this is an unsupported platform -- # endif # endif #endif #ifdef FFI_MIPS_O32 /* O32 stack frames have 32bit integer args */ # define FFI_SIZEOF_ARG 4 #else /* N32 and N64 frames have 64bit integer args */ # define FFI_SIZEOF_ARG 8 # if _MIPS_SIM == _ABIN32 # define FFI_SIZEOF_JAVA_RAW 4 # endif #endif #define FFI_FLAG_BITS 2 /* SGI's strange assembler requires that we multiply by 4 rather than shift left by FFI_FLAG_BITS */ #define FFI_ARGS_D FFI_TYPE_DOUBLE #define FFI_ARGS_F FFI_TYPE_FLOAT #define FFI_ARGS_DD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE #define FFI_ARGS_FF FFI_TYPE_FLOAT * 4 + FFI_TYPE_FLOAT #define FFI_ARGS_FD FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT #define FFI_ARGS_DF FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE /* Needed for N32 structure returns */ #define FFI_TYPE_SMALLSTRUCT FFI_TYPE_UINT8 #define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8 #if 0 /* The SGI assembler can't handle this.. */ #define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT /* (and so on) */ #else /* ...so we calculate these by hand! */ #define FFI_TYPE_STRUCT_D 61 #define FFI_TYPE_STRUCT_F 45 #define FFI_TYPE_STRUCT_DD 253 #define FFI_TYPE_STRUCT_FF 173 #define FFI_TYPE_STRUCT_FD 237 #define FFI_TYPE_STRUCT_DF 189 #define FFI_TYPE_STRUCT_SMALL 93 #define FFI_TYPE_STRUCT_SMALL2 109 /* and for n32 soft float, add 16 * 2^4 */ #define FFI_TYPE_STRUCT_D_SOFT 317 #define FFI_TYPE_STRUCT_F_SOFT 301 #define FFI_TYPE_STRUCT_DD_SOFT 509 #define FFI_TYPE_STRUCT_FF_SOFT 429 #define FFI_TYPE_STRUCT_FD_SOFT 493 #define FFI_TYPE_STRUCT_DF_SOFT 445 #define FFI_TYPE_STRUCT_SOFT 16 #endif #ifdef LIBFFI_ASM #define v0 $2 #define v1 $3 #define a0 $4 #define a1 $5 #define a2 $6 #define a3 $7 #define a4 $8 #define a5 $9 #define a6 $10 #define a7 $11 #define t0 $8 #define t1 $9 #define t2 $10 #define t3 $11 #define t4 $12 #define t5 $13 #define t6 $14 #define t7 $15 #define t8 $24 #define t9 $25 #define ra $31 #ifdef FFI_MIPS_O32 # define REG_L lw # define REG_S sw # define SUBU subu # define ADDU addu # define SRL srl # define LI li #else /* !FFI_MIPS_O32 */ # define REG_L ld # define REG_S sd # define SUBU dsubu # define ADDU daddu # define SRL dsrl # define LI dli # if (_MIPS_SIM==_ABI64) # define LA dla # define EH_FRAME_ALIGN 3 # define FDE_ADDR_BYTES .8byte # else # define LA la # define EH_FRAME_ALIGN 2 # define FDE_ADDR_BYTES .4byte # endif /* _MIPS_SIM==_ABI64 */ #endif /* !FFI_MIPS_O32 */ #else /* !LIBFFI_ASM */ # ifdef __GNUC__ # ifdef FFI_MIPS_O32 /* O32 stack frames have 32bit integer args */ typedef unsigned int ffi_arg __attribute__((__mode__(__SI__))); typedef signed int ffi_sarg __attribute__((__mode__(__SI__))); #else /* N32 and N64 frames have 64bit integer args */ typedef unsigned int ffi_arg __attribute__((__mode__(__DI__))); typedef signed int ffi_sarg __attribute__((__mode__(__DI__))); # endif # else # ifdef FFI_MIPS_O32 /* O32 stack frames have 32bit integer args */ typedef __uint32_t ffi_arg; typedef __int32_t ffi_sarg; # else /* N32 and N64 frames have 64bit integer args */ typedef __uint64_t ffi_arg; typedef __int64_t ffi_sarg; # endif # endif /* __GNUC__ */ typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_O32, FFI_N32, FFI_N64, FFI_O32_SOFT_FLOAT, FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT, FFI_LAST_ABI, #ifdef FFI_MIPS_O32 #ifdef __mips_soft_float FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT #else FFI_DEFAULT_ABI = FFI_O32 #endif #else # if _MIPS_SIM==_ABI64 # ifdef __mips_soft_float FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT # else FFI_DEFAULT_ABI = FFI_N64 # endif # else # ifdef __mips_soft_float FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT # else FFI_DEFAULT_ABI = FFI_N32 # endif # endif #endif } ffi_abi; #define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag #endif /* !LIBFFI_ASM */ /* ---- Definitions for closures ----------------------------------------- */ #if defined(FFI_MIPS_O32) #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 20 #else /* N32/N64. */ # define FFI_CLOSURES 1 #if _MIPS_SIM==_ABI64 #define FFI_TRAMPOLINE_SIZE 52 #else #define FFI_TRAMPOLINE_SIZE 20 #endif #endif /* FFI_MIPS_O32 */ #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/mips/n32.S000066400000000000000000000343011265146633400164330ustar00rootroot00000000000000/* ----------------------------------------------------------------------- n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. MIPS Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include /* Only build this code if we are compiling for n32 */ #if defined(FFI_MIPS_N32) #define callback a0 #define bytes a2 #define flags a3 #define raddr a4 #define fn a5 #define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) #ifdef __GNUC__ .abicalls #endif .set mips4 .text .align 2 .globl ffi_call_N32 .ent ffi_call_N32 ffi_call_N32: .LFB3: .frame $fp, SIZEOF_FRAME, ra .mask 0xc0000000,-FFI_SIZEOF_ARG .fmask 0x00000000,0 # Prologue SUBU $sp, SIZEOF_FRAME # Frame size .LCFI0: REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address .LCFI1: move $fp, $sp .LCFI3: move t9, callback # callback function pointer REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn # Allocate at least 4 words in the argstack move v0, bytes bge bytes, 4 * FFI_SIZEOF_ARG, bigger LI v0, 4 * FFI_SIZEOF_ARG b sixteen bigger: ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. sixteen: SUBU $sp, $sp, v0 # move the stack pointer to reflect the # arg space move a0, $sp # 4 * FFI_SIZEOF_ARG ADDU a3, $fp, 3 * FFI_SIZEOF_ARG # Call ffi_prep_args jal t9 # Copy the stack pointer to t9 move t9, $sp # Fix the stack if there are more than 8 64bit slots worth # of arguments. # Load the number of bytes REG_L t6, 2*FFI_SIZEOF_ARG($fp) # Is it bigger than 8 * FFI_SIZEOF_ARG? daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) bltz t8, loadregs ADDU t9, t9, t8 loadregs: REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. and t4, t6, ((1< #include /* Only build this code if we are compiling for o32 */ #if defined(FFI_MIPS_O32) #define callback a0 #define bytes a2 #define flags a3 #define SIZEOF_FRAME (4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG) #define A3_OFF (SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG) #define FP_OFF (SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG) #define RA_OFF (SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG) .abicalls .text .align 2 .globl ffi_call_O32 .ent ffi_call_O32 ffi_call_O32: $LFB0: # Prologue SUBU $sp, SIZEOF_FRAME # Frame size $LCFI0: REG_S $fp, FP_OFF($sp) # Save frame pointer $LCFI1: REG_S ra, RA_OFF($sp) # Save return address $LCFI2: move $fp, $sp $LCFI3: move t9, callback # callback function pointer REG_S flags, A3_OFF($fp) # flags # Allocate at least 4 words in the argstack LI v0, 4 * FFI_SIZEOF_ARG blt bytes, v0, sixteen ADDU v0, bytes, 7 # make sure it is aligned and v0, -8 # to an 8 byte boundry sixteen: SUBU $sp, v0 # move the stack pointer to reflect the # arg space ADDU a0, $sp, 4 * FFI_SIZEOF_ARG jalr t9 REG_L t0, A3_OFF($fp) # load the flags word SRL t2, t0, 4 # shift our arg info and t0, ((1<<4)-1) # mask out the return type ADDU $sp, 4 * FFI_SIZEOF_ARG # adjust $sp to new args bnez t0, pass_d # make it quick for int REG_L a0, 0*FFI_SIZEOF_ARG($sp) # just go ahead and load the REG_L a1, 1*FFI_SIZEOF_ARG($sp) # four regs. REG_L a2, 2*FFI_SIZEOF_ARG($sp) REG_L a3, 3*FFI_SIZEOF_ARG($sp) b call_it pass_d: bne t0, FFI_ARGS_D, pass_f l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args REG_L a2, 2*FFI_SIZEOF_ARG($sp) # passing a double REG_L a3, 3*FFI_SIZEOF_ARG($sp) b call_it pass_f: bne t0, FFI_ARGS_F, pass_d_d l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args REG_L a1, 1*FFI_SIZEOF_ARG($sp) # passing a float REG_L a2, 2*FFI_SIZEOF_ARG($sp) REG_L a3, 3*FFI_SIZEOF_ARG($sp) b call_it pass_d_d: bne t0, FFI_ARGS_DD, pass_f_f l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing two doubles b call_it pass_f_f: bne t0, FFI_ARGS_FF, pass_d_f l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args l.s $f14, 1*FFI_SIZEOF_ARG($sp) # passing two floats REG_L a2, 2*FFI_SIZEOF_ARG($sp) REG_L a3, 3*FFI_SIZEOF_ARG($sp) b call_it pass_d_f: bne t0, FFI_ARGS_DF, pass_f_d l.d $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args l.s $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float REG_L a3, 3*FFI_SIZEOF_ARG($sp) b call_it pass_f_d: # assume that the only other combination must be float then double # bne t0, FFI_ARGS_F_D, call_it l.s $f12, 0*FFI_SIZEOF_ARG($sp) # load $fp regs from args l.d $f14, 2*FFI_SIZEOF_ARG($sp) # passing double and float call_it: # Load the function pointer REG_L t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp) # If the return value pointer is NULL, assume no return value. REG_L t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) beqz t1, noretval bne t2, FFI_TYPE_INT, retlonglong jalr t9 REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) REG_S v0, 0(t0) b epilogue retlonglong: # Really any 64-bit int, signed or not. bne t2, FFI_TYPE_UINT64, retfloat jalr t9 REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) REG_S v1, 4(t0) REG_S v0, 0(t0) b epilogue retfloat: bne t2, FFI_TYPE_FLOAT, retdouble jalr t9 REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) s.s $f0, 0(t0) b epilogue retdouble: bne t2, FFI_TYPE_DOUBLE, noretval jalr t9 REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) s.d $f0, 0(t0) b epilogue noretval: jalr t9 # Epilogue epilogue: move $sp, $fp REG_L $fp, FP_OFF($sp) # Restore frame pointer REG_L ra, RA_OFF($sp) # Restore return address ADDU $sp, SIZEOF_FRAME # Fix stack pointer j ra $LFE0: .end ffi_call_O32 /* ffi_closure_O32. Expects address of the passed-in ffi_closure in t4 ($12). Stores any arguments passed in registers onto the stack, then calls ffi_closure_mips_inner_O32, which then decodes them. Stack layout: 3 - a3 save 2 - a2 save 1 - a1 save 0 - a0 save, original sp -1 - ra save -2 - fp save -3 - $16 (s0) save -4 - cprestore -5 - return value high (v1) -6 - return value low (v0) -7 - f14 (le high, be low) -8 - f14 (le low, be high) -9 - f12 (le high, be low) -10 - f12 (le low, be high) -11 - Called function a3 save -12 - Called function a2 save -13 - Called function a1 save -14 - Called function a0 save, our sp and fp point here */ #define SIZEOF_FRAME2 (14 * FFI_SIZEOF_ARG) #define A3_OFF2 (SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG) #define A2_OFF2 (SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG) #define A1_OFF2 (SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG) #define A0_OFF2 (SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG) #define RA_OFF2 (SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG) #define FP_OFF2 (SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG) #define S0_OFF2 (SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG) #define GP_OFF2 (SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG) #define V1_OFF2 (SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG) #define V0_OFF2 (SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG) #define FA_1_1_OFF2 (SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG) #define FA_1_0_OFF2 (SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG) #define FA_0_1_OFF2 (SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG) #define FA_0_0_OFF2 (SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG) .text .align 2 .globl ffi_closure_O32 .ent ffi_closure_O32 ffi_closure_O32: $LFB1: # Prologue .frame $fp, SIZEOF_FRAME2, ra .set noreorder .cpload t9 .set reorder SUBU $sp, SIZEOF_FRAME2 .cprestore GP_OFF2 $LCFI4: REG_S $16, S0_OFF2($sp) # Save s0 REG_S $fp, FP_OFF2($sp) # Save frame pointer REG_S ra, RA_OFF2($sp) # Save return address $LCFI6: move $fp, $sp $LCFI7: # Store all possible argument registers. If there are more than # four arguments, then they are stored above where we put a3. REG_S a0, A0_OFF2($fp) REG_S a1, A1_OFF2($fp) REG_S a2, A2_OFF2($fp) REG_S a3, A3_OFF2($fp) # Load ABI enum to s0 REG_L $16, 20($12) # cif pointer follows tramp. REG_L $16, 0($16) # abi is first member. li $13, 1 # FFI_O32 bne $16, $13, 1f # Skip fp save if FFI_O32_SOFT_FLOAT # Store all possible float/double registers. s.d $f12, FA_0_0_OFF2($fp) s.d $f14, FA_1_0_OFF2($fp) 1: # Call ffi_closure_mips_inner_O32 to do the work. la t9, ffi_closure_mips_inner_O32 move a0, $12 # Pointer to the ffi_closure addu a1, $fp, V0_OFF2 addu a2, $fp, A0_OFF2 addu a3, $fp, FA_0_0_OFF2 jalr t9 # Load the return value into the appropriate register. move $8, $2 li $9, FFI_TYPE_VOID beq $8, $9, closure_done li $13, 1 # FFI_O32 bne $16, $13, 1f # Skip fp restore if FFI_O32_SOFT_FLOAT li $9, FFI_TYPE_FLOAT l.s $f0, V0_OFF2($fp) beq $8, $9, closure_done li $9, FFI_TYPE_DOUBLE l.d $f0, V0_OFF2($fp) beq $8, $9, closure_done 1: REG_L $3, V1_OFF2($fp) REG_L $2, V0_OFF2($fp) closure_done: # Epilogue move $sp, $fp REG_L $16, S0_OFF2($sp) # Restore s0 REG_L $fp, FP_OFF2($sp) # Restore frame pointer REG_L ra, RA_OFF2($sp) # Restore return address ADDU $sp, SIZEOF_FRAME2 j ra $LFE1: .end ffi_closure_O32 /* DWARF-2 unwind info. */ .section .eh_frame,"a",@progbits $Lframe0: .4byte $LECIE0-$LSCIE0 # Length of Common Information Entry $LSCIE0: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .uleb128 0x1 # CIE Code Alignment Factor .sleb128 4 # CIE Data Alignment Factor .byte 0x1f # CIE RA Column .uleb128 0x1 # Augmentation size .byte 0x00 # FDE Encoding (absptr) .byte 0xc # DW_CFA_def_cfa .uleb128 0x1d .uleb128 0x0 .align 2 $LECIE0: $LSFDE0: .4byte $LEFDE0-$LASFDE0 # FDE Length $LASFDE0: .4byte $LASFDE0-$Lframe0 # FDE CIE offset .4byte $LFB0 # FDE initial location .4byte $LFE0-$LFB0 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI0-$LFB0 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0x18 .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI2-$LCFI0 .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x1e # $fp .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x1f # $ra .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI3-$LCFI2 .byte 0xc # DW_CFA_def_cfa .uleb128 0x1e .uleb128 0x18 .align 2 $LEFDE0: $LSFDE1: .4byte $LEFDE1-$LASFDE1 # FDE Length $LASFDE1: .4byte $LASFDE1-$Lframe0 # FDE CIE offset .4byte $LFB1 # FDE initial location .4byte $LFE1-$LFB1 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI4-$LFB1 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0x38 .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI6-$LCFI4 .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x10 # $16 .sleb128 -3 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp) .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x1e # $fp .sleb128 -2 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp) .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x1f # $ra .sleb128 -1 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp) .byte 0x4 # DW_CFA_advance_loc4 .4byte $LCFI7-$LCFI6 .byte 0xc # DW_CFA_def_cfa .uleb128 0x1e .uleb128 0x38 .align 2 $LEFDE1: #endif polyml-5.6/libffi/src/moxie/000077500000000000000000000000001265146633400160555ustar00rootroot00000000000000polyml-5.6/libffi/src/moxie/eabi.S000066400000000000000000000051641265146633400171070ustar00rootroot00000000000000/* ----------------------------------------------------------------------- eabi.S - Copyright (c) 2012, 2013 Anthony Green Moxie Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .globl ffi_prep_args_EABI .text .p2align 4 .globl ffi_call_EABI .type ffi_call_EABI, @function # $r0 : ffi_prep_args # $r1 : &ecif # $r2 : cif->bytes # $r3 : fig->flags # $r4 : ecif.rvalue # $r5 : fn ffi_call_EABI: push $sp, $r6 push $sp, $r7 push $sp, $r8 dec $sp, 24 /* Store incoming args on stack. */ sto.l 0($sp), $r0 /* ffi_prep_args */ sto.l 4($sp), $r1 /* ecif */ sto.l 8($sp), $r2 /* bytes */ sto.l 12($sp), $r3 /* flags */ sto.l 16($sp), $r4 /* &rvalue */ sto.l 20($sp), $r5 /* fn */ /* Call ffi_prep_args. */ mov $r6, $r4 /* Save result buffer */ mov $r7, $r5 /* Save the target fn */ mov $r8, $r3 /* Save the flags */ sub.l $sp, $r2 /* Allocate stack space */ mov $r0, $sp /* We can stomp over $r0 */ /* $r1 is already set up */ jsra ffi_prep_args /* Load register arguments. */ ldo.l $r0, 0($sp) ldo.l $r1, 4($sp) ldo.l $r2, 8($sp) ldo.l $r3, 12($sp) ldo.l $r4, 16($sp) ldo.l $r5, 20($sp) /* Call the target function. */ jsr $r7 ldi.l $r7, 0xffffffff cmp $r8, $r7 beq retstruct ldi.l $r7, 4 cmp $r8, $r7 bgt ret2reg st.l ($r6), $r0 jmpa retdone ret2reg: st.l ($r6), $r0 sto.l 4($r6), $r1 retstruct: retdone: /* Return. */ ldo.l $r6, -4($fp) ldo.l $r7, -8($fp) ldo.l $r8, -12($fp) ret .size ffi_call_EABI, .-ffi_call_EABI polyml-5.6/libffi/src/moxie/ffi.c000066400000000000000000000161731265146633400167750ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (C) 2012, 2013 Anthony Green Moxie Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void *ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; register int count = 0; p_argv = ecif->avalue; argp = stack; if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) { *(void **) argp = ecif->rvalue; argp += 4; } for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++) { size_t z; z = (*p_arg)->size; if ((*p_arg)->type == FFI_TYPE_STRUCT) { z = sizeof(void*); *(void **) argp = *p_argv; } else if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; default: FFI_ASSERT(0); } } else if (z == sizeof(int)) { *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); } else { memcpy(argp, *p_argv, z); } p_argv++; argp += z; count += z; } return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8))); } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { if (cif->rtype->type == FFI_TYPE_STRUCT) cif->flags = -1; else cif->flags = cif->rtype->size; cif->bytes = ALIGN (cif->bytes, 8); return FFI_OK; } extern void ffi_call_EABI(void *(*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_EABI: ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } } void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3, unsigned arg4, unsigned arg5, unsigned arg6) { /* This function is called by a trampoline. The trampoline stows a pointer to the ffi_closure object in $r7. We must save this pointer in a place that will persist while we do our work. */ register ffi_closure *creg __asm__ ("$r12"); ffi_closure *closure = creg; /* Arguments that don't fit in registers are found on the stack at a fixed offset above the current frame pointer. */ register char *frame_pointer __asm__ ("$fp"); /* Pointer to a struct return value. */ void *struct_rvalue = (void *) arg1; /* 6 words reserved for register args + 3 words from jsr */ char *stack_args = frame_pointer + 9*4; /* Lay the register arguments down in a continuous chunk of memory. */ unsigned register_args[6] = { arg1, arg2, arg3, arg4, arg5, arg6 }; char *register_args_ptr = (char *) register_args; ffi_cif *cif = closure->cif; ffi_type **arg_types = cif->arg_types; void **avalue = alloca (cif->nargs * sizeof(void *)); char *ptr = (char *) register_args; int i; /* preserve struct type return pointer passing */ if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ptr += 4; register_args_ptr = (char *)®ister_args[1]; } /* Find the address of each argument. */ for (i = 0; i < cif->nargs; i++) { switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = ptr + 3; break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = ptr + 2; break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_FLOAT: case FFI_TYPE_POINTER: avalue[i] = ptr; break; case FFI_TYPE_STRUCT: avalue[i] = *(void**)ptr; break; default: /* This is an 8-byte value. */ avalue[i] = ptr; ptr += 4; break; } ptr += 4; /* If we've handled more arguments than fit in registers, start looking at the those passed on the stack. */ if (ptr == ®ister_args[6]) ptr = stack_args; } /* Invoke the closure. */ if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) { (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); } else { /* Allocate space for the return value and call the function. */ long long rvalue; (closure->fun) (cif, &rvalue, avalue, closure->user_data); asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); } } ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned short *tramp = (unsigned short *) &closure->tramp[0]; unsigned long fn = (long) ffi_closure_eabi; unsigned long cls = (long) codeloc; if (cif->abi != FFI_EABI) return FFI_BAD_ABI; fn = (unsigned long) ffi_closure_eabi; tramp[0] = 0x01e0; /* ldi.l $r7, .... */ tramp[1] = cls >> 16; tramp[2] = cls & 0xffff; tramp[3] = 0x1a00; /* jmpa .... */ tramp[4] = fn >> 16; tramp[5] = fn & 0xffff; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; return FFI_OK; } polyml-5.6/libffi/src/moxie/ffitarget.h000066400000000000000000000036261265146633400202100ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012, 2013 Anthony Green Target configuration macros for Moxie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H /* ---- System specific configurations ----------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_EABI, FFI_DEFAULT_ABI = FFI_EABI, FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 /* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ #define FFI_TRAMPOLINE_SIZE (12) #endif polyml-5.6/libffi/src/pa/000077500000000000000000000000001265146633400153345ustar00rootroot00000000000000polyml-5.6/libffi/src/pa/ffi.c000066400000000000000000000471131265146633400162520ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - (c) 2011 Anthony Green (c) 2008 Red Hat, Inc. (c) 2006 Free Software Foundation, Inc. (c) 2003-2004 Randolph Chung HPPA Foreign Function Interface HP-UX PA ABI support Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include #define ROUND_UP(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) #define MIN_STACK_SIZE 64 #define FIRST_ARG_SLOT 9 #define DEBUG_LEVEL 0 #define fldw(addr, fpreg) \ __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg) #define fstw(fpreg, addr) \ __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr)) #define fldd(addr, fpreg) \ __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg) #define fstd(fpreg, addr) \ __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr)) #define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0) static inline int ffi_struct_type(ffi_type *t) { size_t sz = t->size; /* Small structure results are passed in registers, larger ones are passed by pointer. Note that small structures of size 2, 4 and 8 differ from the corresponding integer types in that they have different alignment requirements. */ if (sz <= 1) return FFI_TYPE_UINT8; else if (sz == 2) return FFI_TYPE_SMALL_STRUCT2; else if (sz == 3) return FFI_TYPE_SMALL_STRUCT3; else if (sz == 4) return FFI_TYPE_SMALL_STRUCT4; else if (sz == 5) return FFI_TYPE_SMALL_STRUCT5; else if (sz == 6) return FFI_TYPE_SMALL_STRUCT6; else if (sz == 7) return FFI_TYPE_SMALL_STRUCT7; else if (sz <= 8) return FFI_TYPE_SMALL_STRUCT8; else return FFI_TYPE_STRUCT; /* else, we pass it by pointer. */ } /* PA has a downward growing stack, which looks like this: Offset [ Variable args ] SP = (4*(n+9)) arg word N ... SP-52 arg word 4 [ Fixed args ] SP-48 arg word 3 SP-44 arg word 2 SP-40 arg word 1 SP-36 arg word 0 [ Frame marker ] ... SP-20 RP SP-4 previous SP The first four argument words on the stack are reserved for use by the callee. Instead, the general and floating registers replace the first four argument slots. Non FP arguments are passed solely in the general registers. FP arguments are passed in both general and floating registers when using libffi. Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23. Non-FP 64-bit args are passed in register pairs, starting on an odd numbered register (i.e. r25+r26 and r23+r24). FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L. FP 64-bit arguments are passed in fr5 and fr7. The registers are allocated in the same manner as stack slots. This allows the callee to save its arguments on the stack if necessary: arg word 3 -> gr23 or fr7L arg word 2 -> gr24 or fr6L or fr7R arg word 1 -> gr25 or fr5L arg word 0 -> gr26 or fr4L or fr5R Note that fr4R and fr6R are never used for arguments (i.e., doubles are not passed in fr4 or fr6). The rest of the arguments are passed on the stack starting at SP-52, but 64-bit arguments need to be aligned to an 8-byte boundary This means we can have holes either in the register allocation, or in the stack. */ /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments The following code will put everything into the stack frame (which was allocated by the asm routine), and on return the asm routine will load the arguments that should be passed by register into the appropriate registers NOTE: We load floating point args in this function... that means we assume gcc will not mess with fp regs in here. */ void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes) { register unsigned int i; register ffi_type **p_arg; register void **p_argv; unsigned int slot = FIRST_ARG_SLOT; char *dest_cpy; size_t len; debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack, ecif, bytes); p_arg = ecif->cif->arg_types; p_argv = ecif->avalue; for (i = 0; i < ecif->cif->nargs; i++) { int type = (*p_arg)->type; switch (type) { case FFI_TYPE_SINT8: *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv); break; case FFI_TYPE_UINT8: *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv); break; case FFI_TYPE_SINT16: *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv); break; case FFI_TYPE_UINT16: *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv); break; case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv), slot); *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: /* Align slot for 64-bit type. */ slot += (slot & 1) ? 1 : 2; *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); break; case FFI_TYPE_FLOAT: /* First 4 args go in fr4L - fr7L. */ debug(3, "Storing UINT32(float) in slot %u\n", slot); *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv); switch (slot - FIRST_ARG_SLOT) { /* First 4 args go in fr4L - fr7L. */ case 0: fldw(stack - slot, fr4); break; case 1: fldw(stack - slot, fr5); break; case 2: fldw(stack - slot, fr6); break; case 3: fldw(stack - slot, fr7); break; } break; case FFI_TYPE_DOUBLE: /* Align slot for 64-bit type. */ slot += (slot & 1) ? 1 : 2; debug(3, "Storing UINT64(double) at slot %u\n", slot); *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv); switch (slot - FIRST_ARG_SLOT) { /* First 2 args go in fr5, fr7. */ case 1: fldd(stack - slot, fr5); break; case 3: fldd(stack - slot, fr7); break; } break; #ifdef PA_HPUX case FFI_TYPE_LONGDOUBLE: /* Long doubles are passed in the same manner as structures larger than 8 bytes. */ *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); break; #endif case FFI_TYPE_STRUCT: /* Structs smaller or equal than 4 bytes are passed in one register. Structs smaller or equal 8 bytes are passed in two registers. Larger structures are passed by pointer. */ len = (*p_arg)->size; if (len <= 4) { dest_cpy = (char *)(stack - slot) + 4 - len; memcpy(dest_cpy, (char *)*p_argv, len); } else if (len <= 8) { slot += (slot & 1) ? 1 : 2; dest_cpy = (char *)(stack - slot) + 8 - len; memcpy(dest_cpy, (char *)*p_argv, len); } else *(UINT32 *)(stack - slot) = (UINT32)(*p_argv); break; default: FFI_ASSERT(0); } slot++; p_arg++; p_argv++; } /* Make sure we didn't mess up and scribble on the stack. */ { unsigned int n; debug(5, "Stack setup:\n"); for (n = 0; n < (bytes + 3) / 4; n++) { if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); } debug(5, "%08x ", *(stack - n)); } debug(5, "\n"); } FFI_ASSERT(slot * 4 <= bytes); return; } static void ffi_size_stack_pa32(ffi_cif *cif) { ffi_type **ptr; int i; int z = 0; /* # stack slots */ for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++) { int type = (*ptr)->type; switch (type) { case FFI_TYPE_DOUBLE: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: z += 2 + (z & 1); /* must start on even regs, so we may waste one */ break; #ifdef PA_HPUX case FFI_TYPE_LONGDOUBLE: #endif case FFI_TYPE_STRUCT: z += 1; /* pass by ptr, callee will copy */ break; default: /* <= 32-bit values */ z++; } } /* We can fit up to 6 args in the default 64-byte stack frame, if we need more, we need more stack. */ if (z <= 6) cif->bytes = MIN_STACK_SIZE; /* min stack size */ else cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE); debug(3, "Calculated stack size is %u bytes\n", cif->bytes); } /* Perform machine dependent cif processing. */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: cif->flags = (unsigned) cif->rtype->type; break; #ifdef PA_HPUX case FFI_TYPE_LONGDOUBLE: /* Long doubles are treated like a structure. */ cif->flags = FFI_TYPE_STRUCT; break; #endif case FFI_TYPE_STRUCT: /* For the return type we have to check the size of the structures. If the size is smaller or equal 4 bytes, the result is given back in one register. If the size is smaller or equal 8 bytes than we return the result in two registers. But if the size is bigger than 8 bytes, we work with pointers. */ cif->flags = ffi_struct_type(cif->rtype); break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: cif->flags = FFI_TYPE_UINT64; break; default: cif->flags = FFI_TYPE_INT; break; } /* Lucky us, because of the unique PA ABI we get to do our own stack sizing. */ switch (cif->abi) { case FFI_PA32: ffi_size_stack_pa32(cif); break; default: FFI_ASSERT(0); break; } return FFI_OK; } extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return value address then we need to make one. */ if (rvalue == NULL #ifdef PA_HPUX && (cif->rtype->type == FFI_TYPE_STRUCT || cif->rtype->type == FFI_TYPE_LONGDOUBLE)) #else && cif->rtype->type == FFI_TYPE_STRUCT) #endif { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_PA32: debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn); ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } } #if FFI_CLOSURES /* This is more-or-less an inverse of ffi_call -- we have arguments on the stack, and we need to fill them into a cif structure and invoke the user function. This really ought to be in asm to make sure the compiler doesn't do things we don't expect. */ ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack) { ffi_cif *cif; void **avalue; void *rvalue; UINT32 ret[2]; /* function can return up to 64-bits in registers */ ffi_type **p_arg; char *tmp; int i, avn; unsigned int slot = FIRST_ARG_SLOT; register UINT32 r28 asm("r28"); cif = closure->cif; /* If returning via structure, callee will write to our pointer. */ if (cif->flags == FFI_TYPE_STRUCT) rvalue = (void *)r28; else rvalue = &ret[0]; avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG); avn = cif->nargs; p_arg = cif->arg_types; for (i = 0; i < avn; i++) { int type = (*p_arg)->type; switch (type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_POINTER: avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: slot += (slot & 1) ? 1 : 2; avalue[i] = (void *)(stack - slot); break; case FFI_TYPE_FLOAT: #ifdef PA_LINUX /* The closure call is indirect. In Linux, floating point arguments in indirect calls with a prototype are passed in the floating point registers instead of the general registers. So, we need to replace what was previously stored in the current slot with the value in the corresponding floating point register. */ switch (slot - FIRST_ARG_SLOT) { case 0: fstw(fr4, (void *)(stack - slot)); break; case 1: fstw(fr5, (void *)(stack - slot)); break; case 2: fstw(fr6, (void *)(stack - slot)); break; case 3: fstw(fr7, (void *)(stack - slot)); break; } #endif avalue[i] = (void *)(stack - slot); break; case FFI_TYPE_DOUBLE: slot += (slot & 1) ? 1 : 2; #ifdef PA_LINUX /* See previous comment for FFI_TYPE_FLOAT. */ switch (slot - FIRST_ARG_SLOT) { case 1: fstd(fr5, (void *)(stack - slot)); break; case 3: fstd(fr7, (void *)(stack - slot)); break; } #endif avalue[i] = (void *)(stack - slot); break; #ifdef PA_HPUX case FFI_TYPE_LONGDOUBLE: /* Long doubles are treated like a big structure. */ avalue[i] = (void *) *(stack - slot); break; #endif case FFI_TYPE_STRUCT: /* Structs smaller or equal than 4 bytes are passed in one register. Structs smaller or equal 8 bytes are passed in two registers. Larger structures are passed by pointer. */ if((*p_arg)->size <= 4) { avalue[i] = (void *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size; } else if ((*p_arg)->size <= 8) { slot += (slot & 1) ? 1 : 2; avalue[i] = (void *)(stack - slot) + sizeof(UINT64) - (*p_arg)->size; } else avalue[i] = (void *) *(stack - slot); break; default: FFI_ASSERT(0); } slot++; p_arg++; } /* Invoke the closure. */ (closure->fun) (cif, rvalue, avalue, closure->user_data); debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", ret[0], ret[1]); /* Store the result using the lower 2 bytes of the flags. */ switch (cif->flags) { case FFI_TYPE_UINT8: *(stack - FIRST_ARG_SLOT) = (UINT8)(ret[0] >> 24); break; case FFI_TYPE_SINT8: *(stack - FIRST_ARG_SLOT) = (SINT8)(ret[0] >> 24); break; case FFI_TYPE_UINT16: *(stack - FIRST_ARG_SLOT) = (UINT16)(ret[0] >> 16); break; case FFI_TYPE_SINT16: *(stack - FIRST_ARG_SLOT) = (SINT16)(ret[0] >> 16); break; case FFI_TYPE_INT: case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: *(stack - FIRST_ARG_SLOT) = ret[0]; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: *(stack - FIRST_ARG_SLOT) = ret[0]; *(stack - FIRST_ARG_SLOT - 1) = ret[1]; break; case FFI_TYPE_DOUBLE: fldd(rvalue, fr4); break; case FFI_TYPE_FLOAT: fldw(rvalue, fr4); break; case FFI_TYPE_STRUCT: /* Don't need a return value, done by caller. */ break; case FFI_TYPE_SMALL_STRUCT2: case FFI_TYPE_SMALL_STRUCT3: case FFI_TYPE_SMALL_STRUCT4: tmp = (void*)(stack - FIRST_ARG_SLOT); tmp += 4 - cif->rtype->size; memcpy((void*)tmp, &ret[0], cif->rtype->size); break; case FFI_TYPE_SMALL_STRUCT5: case FFI_TYPE_SMALL_STRUCT6: case FFI_TYPE_SMALL_STRUCT7: case FFI_TYPE_SMALL_STRUCT8: { unsigned int ret2[2]; int off; /* Right justify ret[0] and ret[1] */ switch (cif->flags) { case FFI_TYPE_SMALL_STRUCT5: off = 3; break; case FFI_TYPE_SMALL_STRUCT6: off = 2; break; case FFI_TYPE_SMALL_STRUCT7: off = 1; break; default: off = 0; break; } memset (ret2, 0, sizeof (ret2)); memcpy ((char *)ret2 + off, ret, 8 - off); *(stack - FIRST_ARG_SLOT) = ret2[0]; *(stack - FIRST_ARG_SLOT - 1) = ret2[1]; } break; case FFI_TYPE_POINTER: case FFI_TYPE_VOID: break; default: debug(0, "assert with cif->flags: %d\n",cif->flags); FFI_ASSERT(0); break; } return FFI_OK; } /* Fill in a closure to refer to the specified fun and user_data. cif specifies the argument and result types for fun. The cif must already be prep'ed. */ extern void ffi_closure_pa32(void); ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { UINT32 *tramp = (UINT32 *)(closure->tramp); #ifdef PA_HPUX UINT32 *tmp; #endif if (cif->abi != FFI_PA32) return FFI_BAD_ABI; /* Make a small trampoline that will branch to our handler function. Use PC-relative addressing. */ #ifdef PA_LINUX tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1 ; load plabel */ tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ tramp[5] = 0xeac0c000; /* bv%r0(%r22) ; branch to handler */ tramp[6] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ tramp[7] = ((UINT32)(ffi_closure_pa32) & ~2); /* Flush d/icache -- have to flush up 2 two lines because of alignment. */ __asm__ volatile( "fdc 0(%0)\n\t" "fdc %1(%0)\n\t" "fic 0(%%sr4, %0)\n\t" "fic %1(%%sr4, %0)\n\t" "sync\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n" : : "r"((unsigned long)tramp & ~31), "r"(32 /* stride */) : "memory"); #endif #ifdef PA_HPUX tramp[0] = 0xeaa00000; /* b,l .+8,%r21 ; %r21 <- pc+8 */ tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21 ; mask priv bits */ tramp[2] = 0x4aa10038; /* ldw 28(%r21),%r1 ; load plabel */ tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21 ; get closure addr */ tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22 ; address of handler */ tramp[5] = 0x02c010b4; /* ldsid (%r22),%r20 ; load space id */ tramp[6] = 0x00141820; /* mtsp %r20,%sr0 ; into %sr0 */ tramp[7] = 0xe2c00000; /* be 0(%sr0,%r22) ; branch to handler */ tramp[8] = 0x0c281093; /* ldw 4(%r1),%r19 ; GP of handler */ tramp[9] = ((UINT32)(ffi_closure_pa32) & ~2); /* Flush d/icache -- have to flush three lines because of alignment. */ __asm__ volatile( "copy %1,%0\n\t" "fdc,m %2(%0)\n\t" "fdc,m %2(%0)\n\t" "fdc,m %2(%0)\n\t" "ldsid (%1),%0\n\t" "mtsp %0,%%sr0\n\t" "copy %1,%0\n\t" "fic,m %2(%%sr0,%0)\n\t" "fic,m %2(%%sr0,%0)\n\t" "fic,m %2(%%sr0,%0)\n\t" "sync\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n" : "=&r" ((unsigned long)tmp) : "r" ((unsigned long)tramp & ~31), "r" (32/* stride */) : "memory"); #endif closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } #endif polyml-5.6/libffi/src/pa/ffitarget.h000066400000000000000000000047641265146633400174730ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for hppa. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- System specific configurations ----------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, #ifdef PA_LINUX FFI_PA32, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_PA32 #endif #ifdef PA_HPUX FFI_PA32, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_PA32 #endif #ifdef PA64_HPUX #error "PA64_HPUX FFI is not yet implemented" FFI_PA64, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_PA64 #endif } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 #ifdef PA_LINUX #define FFI_TRAMPOLINE_SIZE 32 #else #define FFI_TRAMPOLINE_SIZE 40 #endif #define FFI_TYPE_SMALL_STRUCT2 -1 #define FFI_TYPE_SMALL_STRUCT3 -2 #define FFI_TYPE_SMALL_STRUCT4 -3 #define FFI_TYPE_SMALL_STRUCT5 -4 #define FFI_TYPE_SMALL_STRUCT6 -5 #define FFI_TYPE_SMALL_STRUCT7 -6 #define FFI_TYPE_SMALL_STRUCT8 -7 #endif polyml-5.6/libffi/src/pa/hpux32.S000066400000000000000000000220121265146633400166060ustar00rootroot00000000000000/* ----------------------------------------------------------------------- hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. (c) 2008 Red Hat, Inc. based on src/pa/linux.S HP-UX PA Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .LEVEL 1.1 .SPACE $PRIVATE$ .IMPORT $global$,DATA .IMPORT $$dyncall,MILLICODE .SUBSPA $DATA$ .align 4 /* void ffi_call_pa32(void (*)(char *, extended_cif *), extended_cif *ecif, unsigned bytes, unsigned flags, unsigned *rvalue, void (*fn)(void)); */ .export ffi_call_pa32,ENTRY,PRIV_LEV=3 .import ffi_prep_args_pa32,CODE .SPACE $TEXT$ .SUBSPA $CODE$ .align 4 L$FB1 ffi_call_pa32 .proc .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 .entry stw %rp, -20(%sp) copy %r3, %r1 L$CFI11 copy %sp, %r3 L$CFI12 /* Setup the stack for calling prep_args... We want the stack to look like this: [ Previous stack ] <- %r3 [ 64-bytes register save area ] <- %r4 [ Stack space for actual call, passed as ] <- %arg0 [ arg0 to ffi_prep_args_pa32 ] [ Stack for calling prep_args ] <- %sp */ stwm %r1, 64(%sp) stw %r4, 12(%r3) L$CFI13 copy %sp, %r4 addl %arg2, %r4, %arg0 ; arg stack stw %arg3, -48(%r3) ; save flags we need it later /* Call prep_args: %arg0(stack) -- set up above %arg1(ecif) -- same as incoming param %arg2(bytes) -- same as incoming param */ bl ffi_prep_args_pa32,%r2 ldo 64(%arg0), %sp ldo -64(%sp), %sp /* now %sp should point where %arg0 was pointing. */ /* Load the arguments that should be passed in registers The fp args are loaded by the prep_args function. */ ldw -36(%sp), %arg0 ldw -40(%sp), %arg1 ldw -44(%sp), %arg2 ldw -48(%sp), %arg3 /* in case the function is going to return a structure we need to give it a place to put the result. */ ldw -52(%r3), %ret0 ; %ret0 <- rvalue ldw -56(%r3), %r22 ; %r22 <- function to call bl $$dyncall, %r31 ; Call the user function copy %r31, %rp /* Prepare to store the result; we need to recover flags and rvalue. */ ldw -48(%r3), %r21 ; r21 <- flags ldw -52(%r3), %r20 ; r20 <- rvalue /* Store the result according to the return type. The most likely types should come first. */ L$checkint comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 b L$done stw %ret0, 0(%r20) L$checkint8 comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 b L$done stb %ret0, 0(%r20) L$checkint16 comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl b L$done sth %ret0, 0(%r20) L$checkdbl comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat b L$done fstd %fr4,0(%r20) L$checkfloat comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll b L$done fstw %fr4L,0(%r20) L$checkll comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 stw %ret0, 0(%r20) b L$done stw %ret1, 4(%r20) L$checksmst2 comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 /* 2-byte structs are returned in ret0 as ????xxyy. */ extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret0, 0(%r20) L$checksmst3 comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 /* 3-byte structs are returned in ret0 as ??xxyyzz. */ extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret0, 0(%r20) L$checksmst4 comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 /* 4-byte structs are returned in ret0 as wwxxyyzz. */ extru %ret0, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret0, 0(%r20) L$checksmst5 comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 /* 5 byte values are returned right justified: ret0 ret1 5: ??????aa bbccddee */ stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret1, 0(%r20) L$checksmst6 comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 /* 6 byte values are returned right justified: ret0 ret1 6: ????aabb ccddeeff */ extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret1, 0(%r20) L$checksmst7 comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 /* 7 byte values are returned right justified: ret0 ret1 7: ??aabbcc ddeeffgg */ extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b L$done stb %ret1, 0(%r20) L$checksmst8 comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done /* 8 byte values are returned right justified: ret0 ret1 8: aabbccdd eeffgghh */ extru %ret0, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) stb %ret1, 0(%r20) L$done /* all done, return */ copy %r4, %sp ; pop arg stack ldw 12(%r3), %r4 ldwm -64(%sp), %r3 ; .. and pop stack ldw -20(%sp), %rp bv %r0(%rp) nop .exit .procend L$FE1 /* void ffi_closure_pa32(void); Called with closure argument in %r21 */ .SPACE $TEXT$ .SUBSPA $CODE$ .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR .import ffi_closure_inner_pa32,CODE .align 4 L$FB2 ffi_closure_pa32 .proc .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 .entry stw %rp, -20(%sp) copy %r3, %r1 L$CFI21 copy %sp, %r3 L$CFI22 stwm %r1, 64(%sp) /* Put arguments onto the stack and call ffi_closure_inner. */ stw %arg0, -36(%r3) stw %arg1, -40(%r3) stw %arg2, -44(%r3) stw %arg3, -48(%r3) copy %r21, %arg0 bl ffi_closure_inner_pa32, %r2 copy %r3, %arg1 ldwm -64(%sp), %r3 ldw -20(%sp), %rp ldw -36(%sp), %ret0 bv %r0(%rp) ldw -40(%sp), %ret1 .exit .procend L$FE2: .SPACE $PRIVATE$ .SUBSPA $DATA$ .align 4 .EXPORT _GLOBAL__F_ffi_call_pa32,DATA _GLOBAL__F_ffi_call_pa32 L$frame1: .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry L$SCIE1: .word 0x0 ;# CIE Identifier Tag .byte 0x1 ;# CIE Version .ascii "\0" ;# CIE Augmentation .uleb128 0x1 ;# CIE Code Alignment Factor .sleb128 4 ;# CIE Data Alignment Factor .byte 0x2 ;# CIE RA Column .byte 0xc ;# DW_CFA_def_cfa .uleb128 0x1e .uleb128 0x0 .align 4 L$ECIE1: L$SFDE1: .word L$EFDE1-L$ASFDE1 ;# FDE Length L$ASFDE1: .word L$ASFDE1-L$frame1 ;# FDE CIE offset .word L$FB1 ;# FDE initial location .word L$FE1-L$FB1 ;# FDE address range .byte 0x4 ;# DW_CFA_advance_loc4 .word L$CFI11-L$FB1 .byte 0x83 ;# DW_CFA_offset, column 0x3 .uleb128 0x0 .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] .uleb128 0x2 .sleb128 -5 .byte 0x4 ;# DW_CFA_advance_loc4 .word L$CFI12-L$CFI11 .byte 0xd ;# DW_CFA_def_cfa_register = r3 .uleb128 0x3 .byte 0x4 ;# DW_CFA_advance_loc4 .word L$CFI13-L$CFI12 .byte 0x84 ;# DW_CFA_offset, column 0x4 .uleb128 0x3 .align 4 L$EFDE1: L$SFDE2: .word L$EFDE2-L$ASFDE2 ;# FDE Length L$ASFDE2: .word L$ASFDE2-L$frame1 ;# FDE CIE offset .word L$FB2 ;# FDE initial location .word L$FE2-L$FB2 ;# FDE address range .byte 0x4 ;# DW_CFA_advance_loc4 .word L$CFI21-L$FB2 .byte 0x83 ;# DW_CFA_offset, column 0x3 .uleb128 0x0 .byte 0x11 ;# DW_CFA_offset_extended_sf .uleb128 0x2 .sleb128 -5 .byte 0x4 ;# DW_CFA_advance_loc4 .word L$CFI22-L$CFI21 .byte 0xd ;# DW_CFA_def_cfa_register = r3 .uleb128 0x3 .align 4 L$EFDE2: polyml-5.6/libffi/src/pa/linux.S000066400000000000000000000217431265146633400166260ustar00rootroot00000000000000/* ----------------------------------------------------------------------- linux.S - (c) 2003-2004 Randolph Chung (c) 2008 Red Hat, Inc. HPPA Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .text .level 1.1 .align 4 /* void ffi_call_pa32(void (*)(char *, extended_cif *), extended_cif *ecif, unsigned bytes, unsigned flags, unsigned *rvalue, void (*fn)(void)); */ .export ffi_call_pa32,code .import ffi_prep_args_pa32,code .type ffi_call_pa32, @function .LFB1: ffi_call_pa32: .proc .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 .entry stw %rp, -20(%sp) copy %r3, %r1 .LCFI11: copy %sp, %r3 .LCFI12: /* Setup the stack for calling prep_args... We want the stack to look like this: [ Previous stack ] <- %r3 [ 64-bytes register save area ] <- %r4 [ Stack space for actual call, passed as ] <- %arg0 [ arg0 to ffi_prep_args_pa32 ] [ Stack for calling prep_args ] <- %sp */ stwm %r1, 64(%sp) stw %r4, 12(%r3) .LCFI13: copy %sp, %r4 addl %arg2, %r4, %arg0 /* arg stack */ stw %arg3, -48(%r3) /* save flags; we need it later */ /* Call prep_args: %arg0(stack) -- set up above %arg1(ecif) -- same as incoming param %arg2(bytes) -- same as incoming param */ bl ffi_prep_args_pa32,%r2 ldo 64(%arg0), %sp ldo -64(%sp), %sp /* now %sp should point where %arg0 was pointing. */ /* Load the arguments that should be passed in registers The fp args were loaded by the prep_args function. */ ldw -36(%sp), %arg0 ldw -40(%sp), %arg1 ldw -44(%sp), %arg2 ldw -48(%sp), %arg3 /* in case the function is going to return a structure we need to give it a place to put the result. */ ldw -52(%r3), %ret0 /* %ret0 <- rvalue */ ldw -56(%r3), %r22 /* %r22 <- function to call */ bl $$dyncall, %r31 /* Call the user function */ copy %r31, %rp /* Prepare to store the result; we need to recover flags and rvalue. */ ldw -48(%r3), %r21 /* r21 <- flags */ ldw -52(%r3), %r20 /* r20 <- rvalue */ /* Store the result according to the return type. */ .Lcheckint: comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8 b .Ldone stw %ret0, 0(%r20) .Lcheckint8: comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16 b .Ldone stb %ret0, 0(%r20) .Lcheckint16: comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl b .Ldone sth %ret0, 0(%r20) .Lcheckdbl: comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat b .Ldone fstd %fr4,0(%r20) .Lcheckfloat: comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll b .Ldone fstw %fr4L,0(%r20) .Lcheckll: comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2 stw %ret0, 0(%r20) b .Ldone stw %ret1, 4(%r20) .Lchecksmst2: comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3 /* 2-byte structs are returned in ret0 as ????xxyy. */ extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret0, 0(%r20) .Lchecksmst3: comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4 /* 3-byte structs are returned in ret0 as ??xxyyzz. */ extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret0, 0(%r20) .Lchecksmst4: comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5 /* 4-byte structs are returned in ret0 as wwxxyyzz. */ extru %ret0, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret0, 0(%r20) .Lchecksmst5: comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6 /* 5 byte values are returned right justified: ret0 ret1 5: ??????aa bbccddee */ stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret1, 0(%r20) .Lchecksmst6: comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7 /* 6 byte values are returned right justified: ret0 ret1 6: ????aabb ccddeeff */ extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret1, 0(%r20) .Lchecksmst7: comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8 /* 7 byte values are returned right justified: ret0 ret1 7: ??aabbcc ddeeffgg */ extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) b .Ldone stb %ret1, 0(%r20) .Lchecksmst8: comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone /* 8 byte values are returned right justified: ret0 ret1 8: aabbccdd eeffgghh */ extru %ret0, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret0, 23, 8, %r22 stbs,ma %r22, 1(%r20) stbs,ma %ret0, 1(%r20) extru %ret1, 7, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 15, 8, %r22 stbs,ma %r22, 1(%r20) extru %ret1, 23, 8, %r22 stbs,ma %r22, 1(%r20) stb %ret1, 0(%r20) .Ldone: /* all done, return */ copy %r4, %sp /* pop arg stack */ ldw 12(%r3), %r4 ldwm -64(%sp), %r3 /* .. and pop stack */ ldw -20(%sp), %rp bv %r0(%rp) nop .exit .procend .LFE1: /* void ffi_closure_pa32(void); Called with closure argument in %r21 */ .export ffi_closure_pa32,code .import ffi_closure_inner_pa32,code .type ffi_closure_pa32, @function .LFB2: ffi_closure_pa32: .proc .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 .entry stw %rp, -20(%sp) .LCFI20: copy %r3, %r1 .LCFI21: copy %sp, %r3 .LCFI22: stwm %r1, 64(%sp) /* Put arguments onto the stack and call ffi_closure_inner. */ stw %arg0, -36(%r3) stw %arg1, -40(%r3) stw %arg2, -44(%r3) stw %arg3, -48(%r3) copy %r21, %arg0 bl ffi_closure_inner_pa32, %r2 copy %r3, %arg1 ldwm -64(%sp), %r3 ldw -20(%sp), %rp ldw -36(%sp), %ret0 bv %r0(%r2) ldw -40(%sp), %ret1 .exit .procend .LFE2: .section ".eh_frame",EH_FRAME_FLAGS,@progbits .Lframe1: .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry .LSCIE1: .word 0x0 ;# CIE Identifier Tag .byte 0x1 ;# CIE Version .ascii "\0" ;# CIE Augmentation .uleb128 0x1 ;# CIE Code Alignment Factor .sleb128 4 ;# CIE Data Alignment Factor .byte 0x2 ;# CIE RA Column .byte 0xc ;# DW_CFA_def_cfa .uleb128 0x1e .uleb128 0x0 .align 4 .LECIE1: .LSFDE1: .word .LEFDE1-.LASFDE1 ;# FDE Length .LASFDE1: .word .LASFDE1-.Lframe1 ;# FDE CIE offset .word .LFB1 ;# FDE initial location .word .LFE1-.LFB1 ;# FDE address range .byte 0x4 ;# DW_CFA_advance_loc4 .word .LCFI11-.LFB1 .byte 0x83 ;# DW_CFA_offset, column 0x3 .uleb128 0x0 .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] .uleb128 0x2 .sleb128 -5 .byte 0x4 ;# DW_CFA_advance_loc4 .word .LCFI12-.LCFI11 .byte 0xd ;# DW_CFA_def_cfa_register = r3 .uleb128 0x3 .byte 0x4 ;# DW_CFA_advance_loc4 .word .LCFI13-.LCFI12 .byte 0x84 ;# DW_CFA_offset, column 0x4 .uleb128 0x3 .align 4 .LEFDE1: .LSFDE2: .word .LEFDE2-.LASFDE2 ;# FDE Length .LASFDE2: .word .LASFDE2-.Lframe1 ;# FDE CIE offset .word .LFB2 ;# FDE initial location .word .LFE2-.LFB2 ;# FDE address range .byte 0x4 ;# DW_CFA_advance_loc4 .word .LCFI21-.LFB2 .byte 0x83 ;# DW_CFA_offset, column 0x3 .uleb128 0x0 .byte 0x11 ;# DW_CFA_offset_extended_sf .uleb128 0x2 .sleb128 -5 .byte 0x4 ;# DW_CFA_advance_loc4 .word .LCFI22-.LCFI21 .byte 0xd ;# DW_CFA_def_cfa_register = r3 .uleb128 0x3 .align 4 .LEFDE2: polyml-5.6/libffi/src/powerpc/000077500000000000000000000000001265146633400164135ustar00rootroot00000000000000polyml-5.6/libffi/src/powerpc/aix.S000066400000000000000000000150431265146633400173230ustar00rootroot00000000000000/* ----------------------------------------------------------------------- aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc. based on darwin.S by John Hornkvist PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ .set r0,0 .set r1,1 .set r2,2 .set r3,3 .set r4,4 .set r5,5 .set r6,6 .set r7,7 .set r8,8 .set r9,9 .set r10,10 .set r11,11 .set r12,12 .set r13,13 .set r14,14 .set r15,15 .set r16,16 .set r17,17 .set r18,18 .set r19,19 .set r20,20 .set r21,21 .set r22,22 .set r23,23 .set r24,24 .set r25,25 .set r26,26 .set r27,27 .set r28,28 .set r29,29 .set r30,30 .set r31,31 .set f0,0 .set f1,1 .set f2,2 .set f3,3 .set f4,4 .set f5,5 .set f6,6 .set f7,7 .set f8,8 .set f9,9 .set f10,10 .set f11,11 .set f12,12 .set f13,13 .set f14,14 .set f15,15 .set f16,16 .set f17,17 .set f18,18 .set f19,19 .set f20,20 .set f21,21 .extern .ffi_prep_args #define LIBFFI_ASM #include #include #define JUMPTARGET(name) name #define L(x) x .file "aix.S" .toc /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes, * unsigned int flags, unsigned int *rvalue, * void (*fn)(), * void (*prep_args)(extended_cif*, unsigned *const)); * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args */ .csect .text[PR] .align 2 .globl ffi_call_AIX .globl .ffi_call_AIX .csect ffi_call_AIX[DS] ffi_call_AIX: #ifdef __64BIT__ .llong .ffi_call_AIX, TOC[tc0], 0 .csect .text[PR] .ffi_call_AIX: /* Save registers we use. */ mflr r0 std r28,-32(r1) std r29,-24(r1) std r30,-16(r1) std r31, -8(r1) std r0, 16(r1) mr r28, r1 /* our AP. */ stdux r1, r1, r4 /* Save arguments over call... */ mr r31, r5 /* flags, */ mr r30, r6 /* rvalue, */ mr r29, r7 /* function address. */ std r2, 40(r1) /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args nop /* Now do the call. */ ld r0, 0(r29) ld r2, 8(r29) ld r11, 16(r29) /* Set up cr1 with bits 4-7 of the flags. */ mtcrf 0x40, r31 mtctr r0 /* Load all those argument registers. */ /* We have set up a nice stack frame, just load it into registers. */ ld r3, 40+(1*8)(r1) ld r4, 40+(2*8)(r1) ld r5, 40+(3*8)(r1) ld r6, 40+(4*8)(r1) nop ld r7, 40+(5*8)(r1) ld r8, 40+(6*8)(r1) ld r9, 40+(7*8)(r1) ld r10,40+(8*8)(r1) L1: /* Load all the FP registers. */ bf 6,L2 /* 2f + 0x18 */ lfd f1,-32-(13*8)(r28) lfd f2,-32-(12*8)(r28) lfd f3,-32-(11*8)(r28) lfd f4,-32-(10*8)(r28) nop lfd f5,-32-(9*8)(r28) lfd f6,-32-(8*8)(r28) lfd f7,-32-(7*8)(r28) lfd f8,-32-(6*8)(r28) nop lfd f9,-32-(5*8)(r28) lfd f10,-32-(4*8)(r28) lfd f11,-32-(3*8)(r28) lfd f12,-32-(2*8)(r28) nop lfd f13,-32-(1*8)(r28) L2: /* Make the call. */ bctrl ld r2, 40(r1) /* Now, deal with the return value. */ mtcrf 0x01, r31 bt 30, L(done_return_value) bt 29, L(fp_return_value) std r3, 0(r30) /* Fall through... */ L(done_return_value): /* Restore the registers we used and return. */ mr r1, r28 ld r0, 16(r28) ld r28, -32(r1) mtlr r0 ld r29, -24(r1) ld r30, -16(r1) ld r31, -8(r1) blr L(fp_return_value): bf 28, L(float_return_value) stfd f1, 0(r30) bf 31, L(done_return_value) stfd f2, 8(r30) b L(done_return_value) L(float_return_value): stfs f1, 0(r30) b L(done_return_value) #else /* ! __64BIT__ */ .long .ffi_call_AIX, TOC[tc0], 0 .csect .text[PR] .ffi_call_AIX: /* Save registers we use. */ mflr r0 stw r28,-16(r1) stw r29,-12(r1) stw r30, -8(r1) stw r31, -4(r1) stw r0, 8(r1) mr r28, r1 /* out AP. */ stwux r1, r1, r4 /* Save arguments over call... */ mr r31, r5 /* flags, */ mr r30, r6 /* rvalue, */ mr r29, r7 /* function address, */ stw r2, 20(r1) /* Call ffi_prep_args. */ mr r4, r1 bl .ffi_prep_args nop /* Now do the call. */ lwz r0, 0(r29) lwz r2, 4(r29) lwz r11, 8(r29) /* Set up cr1 with bits 4-7 of the flags. */ mtcrf 0x40, r31 mtctr r0 /* Load all those argument registers. */ /* We have set up a nice stack frame, just load it into registers. */ lwz r3, 20+(1*4)(r1) lwz r4, 20+(2*4)(r1) lwz r5, 20+(3*4)(r1) lwz r6, 20+(4*4)(r1) nop lwz r7, 20+(5*4)(r1) lwz r8, 20+(6*4)(r1) lwz r9, 20+(7*4)(r1) lwz r10,20+(8*4)(r1) L1: /* Load all the FP registers. */ bf 6,L2 /* 2f + 0x18 */ lfd f1,-16-(13*8)(r28) lfd f2,-16-(12*8)(r28) lfd f3,-16-(11*8)(r28) lfd f4,-16-(10*8)(r28) nop lfd f5,-16-(9*8)(r28) lfd f6,-16-(8*8)(r28) lfd f7,-16-(7*8)(r28) lfd f8,-16-(6*8)(r28) nop lfd f9,-16-(5*8)(r28) lfd f10,-16-(4*8)(r28) lfd f11,-16-(3*8)(r28) lfd f12,-16-(2*8)(r28) nop lfd f13,-16-(1*8)(r28) L2: /* Make the call. */ bctrl lwz r2, 20(r1) /* Now, deal with the return value. */ mtcrf 0x01, r31 bt 30, L(done_return_value) bt 29, L(fp_return_value) stw r3, 0(r30) bf 28, L(done_return_value) stw r4, 4(r30) /* Fall through... */ L(done_return_value): /* Restore the registers we used and return. */ mr r1, r28 lwz r0, 8(r28) lwz r28,-16(r1) mtlr r0 lwz r29,-12(r1) lwz r30, -8(r1) lwz r31, -4(r1) blr L(fp_return_value): bf 28, L(float_return_value) stfd f1, 0(r30) b L(done_return_value) L(float_return_value): stfs f1, 0(r30) b L(done_return_value) #endif .long 0 .byte 0,0,0,1,128,4,0,0 /* END(ffi_call_AIX) */ .csect .text[PR] .align 2 .globl ffi_call_DARWIN .globl .ffi_call_DARWIN .csect ffi_call_DARWIN[DS] ffi_call_DARWIN: #ifdef __64BIT__ .llong .ffi_call_DARWIN, TOC[tc0], 0 #else .long .ffi_call_DARWIN, TOC[tc0], 0 #endif .csect .text[PR] .ffi_call_DARWIN: blr .long 0 .byte 0,0,0,0,0,0,0,0 /* END(ffi_call_DARWIN) */ polyml-5.6/libffi/src/powerpc/aix_closure.S000066400000000000000000000216401265146633400210570ustar00rootroot00000000000000/* ----------------------------------------------------------------------- aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. based on darwin_closure.S PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ .set r0,0 .set r1,1 .set r2,2 .set r3,3 .set r4,4 .set r5,5 .set r6,6 .set r7,7 .set r8,8 .set r9,9 .set r10,10 .set r11,11 .set r12,12 .set r13,13 .set r14,14 .set r15,15 .set r16,16 .set r17,17 .set r18,18 .set r19,19 .set r20,20 .set r21,21 .set r22,22 .set r23,23 .set r24,24 .set r25,25 .set r26,26 .set r27,27 .set r28,28 .set r29,29 .set r30,30 .set r31,31 .set f0,0 .set f1,1 .set f2,2 .set f3,3 .set f4,4 .set f5,5 .set f6,6 .set f7,7 .set f8,8 .set f9,9 .set f10,10 .set f11,11 .set f12,12 .set f13,13 .set f14,14 .set f15,15 .set f16,16 .set f17,17 .set f18,18 .set f19,19 .set f20,20 .set f21,21 .extern .ffi_closure_helper_DARWIN #define LIBFFI_ASM #define JUMPTARGET(name) name #define L(x) x .file "aix_closure.S" .toc LC..60: .tc L..60[TC],L..60 .csect .text[PR] .align 2 .csect .text[PR] .align 2 .globl ffi_closure_ASM .globl .ffi_closure_ASM .csect ffi_closure_ASM[DS] ffi_closure_ASM: #ifdef __64BIT__ .llong .ffi_closure_ASM, TOC[tc0], 0 .csect .text[PR] .ffi_closure_ASM: /* we want to build up an area for the parameters passed */ /* in registers (both floating point and integer) */ /* we store gpr 3 to gpr 10 (aligned to 4) in the parents outgoing area */ std r3, 48+(0*8)(r1) std r4, 48+(1*8)(r1) std r5, 48+(2*8)(r1) std r6, 48+(3*8)(r1) mflr r0 std r7, 48+(4*8)(r1) std r8, 48+(5*8)(r1) std r9, 48+(6*8)(r1) std r10, 48+(7*8)(r1) std r0, 16(r1) /* save the return address */ /* 48 Bytes (Linkage Area) */ /* 64 Bytes (params) */ /* 16 Bytes (result) */ /* 104 Bytes (13*8 from FPR) */ /* 8 Bytes (alignment) */ /* 240 Bytes */ stdu r1, -240(r1) /* skip over caller save area keep stack aligned to 16 */ /* next save fpr 1 to fpr 13 (aligned to 8) */ stfd f1, 128+(0*8)(r1) stfd f2, 128+(1*8)(r1) stfd f3, 128+(2*8)(r1) stfd f4, 128+(3*8)(r1) stfd f5, 128+(4*8)(r1) stfd f6, 128+(5*8)(r1) stfd f7, 128+(6*8)(r1) stfd f8, 128+(7*8)(r1) stfd f9, 128+(8*8)(r1) stfd f10, 128+(9*8)(r1) stfd f11, 128+(10*8)(r1) stfd f12, 128+(11*8)(r1) stfd f13, 128+(12*8)(r1) /* set up registers for the routine that actually does the work */ /* get the context pointer from the trampoline */ mr r3, r11 /* now load up the pointer to the result storage */ addi r4, r1, 112 /* now load up the pointer to the saved gpr registers */ addi r5, r1, 288 /* now load up the pointer to the saved fpr registers */ addi r6, r1, 128 /* make the call */ bl .ffi_closure_helper_DARWIN nop /* now r3 contains the return type */ /* so use it to look up in a table */ /* so we know how to deal with each type */ /* look up the proper starting point in table */ /* by using return type as offset */ lhz r3, 10(r3) /* load type from return type */ ld r4, LC..60(2) /* get address of jump table */ sldi r3, r3, 4 /* now multiply return type by 16 */ ld r0, 240+16(r1) /* load return address */ add r3, r3, r4 /* add contents of table to table address */ mtctr r3 bctr /* jump to it */ /* Each fragment must be exactly 16 bytes long (4 instructions). Align to 16 byte boundary for cache and dispatch efficiency. */ .align 4 L..60: /* case FFI_TYPE_VOID */ mtlr r0 addi r1, r1, 240 blr nop /* case FFI_TYPE_INT */ lwa r3, 112+4(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_FLOAT */ lfs f1, 112+0(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_DOUBLE */ lfd f1, 112+0(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_LONGDOUBLE */ lfd f1, 112+0(r1) mtlr r0 lfd f2, 112+8(r1) b L..finish /* case FFI_TYPE_UINT8 */ lbz r3, 112+7(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_SINT8 */ lbz r3, 112+7(r1) mtlr r0 extsb r3, r3 b L..finish /* case FFI_TYPE_UINT16 */ lhz r3, 112+6(r1) mtlr r0 L..finish: addi r1, r1, 240 blr /* case FFI_TYPE_SINT16 */ lha r3, 112+6(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_UINT32 */ lwz r3, 112+4(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_SINT32 */ lwa r3, 112+4(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_UINT64 */ ld r3, 112+0(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_SINT64 */ ld r3, 112+0(r1) mtlr r0 addi r1, r1, 240 blr /* case FFI_TYPE_STRUCT */ mtlr r0 addi r1, r1, 240 blr nop /* case FFI_TYPE_POINTER */ ld r3, 112+0(r1) mtlr r0 addi r1, r1, 240 blr #else /* ! __64BIT__ */ .long .ffi_closure_ASM, TOC[tc0], 0 .csect .text[PR] .ffi_closure_ASM: /* we want to build up an area for the parameters passed */ /* in registers (both floating point and integer) */ /* we store gpr 3 to gpr 10 (aligned to 4) in the parents outgoing area */ stw r3, 24+(0*4)(r1) stw r4, 24+(1*4)(r1) stw r5, 24+(2*4)(r1) stw r6, 24+(3*4)(r1) mflr r0 stw r7, 24+(4*4)(r1) stw r8, 24+(5*4)(r1) stw r9, 24+(6*4)(r1) stw r10, 24+(7*4)(r1) stw r0, 8(r1) /* 24 Bytes (Linkage Area) */ /* 32 Bytes (params) */ /* 16 Bytes (result) */ /* 104 Bytes (13*8 from FPR) */ /* 176 Bytes */ stwu r1, -176(r1) /* skip over caller save area keep stack aligned to 16 */ /* next save fpr 1 to fpr 13 (aligned to 8) */ stfd f1, 72+(0*8)(r1) stfd f2, 72+(1*8)(r1) stfd f3, 72+(2*8)(r1) stfd f4, 72+(3*8)(r1) stfd f5, 72+(4*8)(r1) stfd f6, 72+(5*8)(r1) stfd f7, 72+(6*8)(r1) stfd f8, 72+(7*8)(r1) stfd f9, 72+(8*8)(r1) stfd f10, 72+(9*8)(r1) stfd f11, 72+(10*8)(r1) stfd f12, 72+(11*8)(r1) stfd f13, 72+(12*8)(r1) /* set up registers for the routine that actually does the work */ /* get the context pointer from the trampoline */ mr r3, r11 /* now load up the pointer to the result storage */ addi r4, r1, 56 /* now load up the pointer to the saved gpr registers */ addi r5, r1, 200 /* now load up the pointer to the saved fpr registers */ addi r6, r1, 72 /* make the call */ bl .ffi_closure_helper_DARWIN nop /* now r3 contains the return type */ /* so use it to look up in a table */ /* so we know how to deal with each type */ /* look up the proper starting point in table */ /* by using return type as offset */ lhz r3, 6(r3) /* load type from return type */ lwz r4, LC..60(2) /* get address of jump table */ slwi r3, r3, 4 /* now multiply return type by 16 */ lwz r0, 176+8(r1) /* load return address */ add r3, r3, r4 /* add contents of table to table address */ mtctr r3 bctr /* jump to it */ /* Each fragment must be exactly 16 bytes long (4 instructions). Align to 16 byte boundary for cache and dispatch efficiency. */ .align 4 L..60: /* case FFI_TYPE_VOID */ mtlr r0 addi r1, r1, 176 blr nop /* case FFI_TYPE_INT */ lwz r3, 56+0(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_FLOAT */ lfs f1, 56+0(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_DOUBLE */ lfd f1, 56+0(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_LONGDOUBLE */ lfd f1, 56+0(r1) mtlr r0 lfd f2, 56+8(r1) b L..finish /* case FFI_TYPE_UINT8 */ lbz r3, 56+3(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_SINT8 */ lbz r3, 56+3(r1) mtlr r0 extsb r3, r3 b L..finish /* case FFI_TYPE_UINT16 */ lhz r3, 56+2(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_SINT16 */ lha r3, 56+2(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_UINT32 */ lwz r3, 56+0(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_SINT32 */ lwz r3, 56+0(r1) mtlr r0 addi r1, r1, 176 blr /* case FFI_TYPE_UINT64 */ lwz r3, 56+0(r1) mtlr r0 lwz r4, 56+4(r1) b L..finish /* case FFI_TYPE_SINT64 */ lwz r3, 56+0(r1) mtlr r0 lwz r4, 56+4(r1) b L..finish /* case FFI_TYPE_STRUCT */ mtlr r0 addi r1, r1, 176 blr nop /* case FFI_TYPE_POINTER */ lwz r3, 56+0(r1) mtlr r0 L..finish: addi r1, r1, 176 blr #endif /* END(ffi_closure_ASM) */ polyml-5.6/libffi/src/powerpc/asm.h000066400000000000000000000103241265146633400173440ustar00rootroot00000000000000/* ----------------------------------------------------------------------- asm.h - Copyright (c) 1998 Geoffrey Keating PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define ASM_GLOBAL_DIRECTIVE .globl #define C_SYMBOL_NAME(name) name /* Macro for a label. */ #ifdef __STDC__ #define C_LABEL(name) name##: #else #define C_LABEL(name) name/**/: #endif /* This seems to always be the case on PPC. */ #define ALIGNARG(log2) log2 /* For ELF we need the `.type' directive to make shared libs work right. */ #define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; #define ASM_SIZE_DIRECTIVE(name) .size name,.-name /* If compiled for profiling, call `_mcount' at the start of each function. */ #ifdef PROF /* The mcount code relies on the return address being on the stack to locate our caller and so it can restore it; so store one just for its benefit. */ #ifdef PIC #define CALL_MCOUNT \ .pushsection; \ .section ".data"; \ .align ALIGNARG(2); \ 0:.long 0; \ .previous; \ mflr %r0; \ stw %r0,4(%r1); \ bl _GLOBAL_OFFSET_TABLE_@local-4; \ mflr %r11; \ lwz %r0,0b@got(%r11); \ bl JUMPTARGET(_mcount); #else /* PIC */ #define CALL_MCOUNT \ .section ".data"; \ .align ALIGNARG(2); \ 0:.long 0; \ .previous; \ mflr %r0; \ lis %r11,0b@ha; \ stw %r0,4(%r1); \ addi %r0,%r11,0b@l; \ bl JUMPTARGET(_mcount); #endif /* PIC */ #else /* PROF */ #define CALL_MCOUNT /* Do nothing. */ #endif /* PROF */ #define ENTRY(name) \ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ .align ALIGNARG(2); \ C_LABEL(name) \ CALL_MCOUNT #define EALIGN_W_0 /* No words to insert. */ #define EALIGN_W_1 nop #define EALIGN_W_2 nop;nop #define EALIGN_W_3 nop;nop;nop #define EALIGN_W_4 EALIGN_W_3;nop #define EALIGN_W_5 EALIGN_W_4;nop #define EALIGN_W_6 EALIGN_W_5;nop #define EALIGN_W_7 EALIGN_W_6;nop /* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes past a 2^align boundary. */ #ifdef PROF #define EALIGN(name, alignt, words) \ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ .align ALIGNARG(2); \ C_LABEL(name) \ CALL_MCOUNT \ b 0f; \ .align ALIGNARG(alignt); \ EALIGN_W_##words; \ 0: #else /* PROF */ #define EALIGN(name, alignt, words) \ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ .align ALIGNARG(alignt); \ EALIGN_W_##words; \ C_LABEL(name) #endif #define END(name) \ ASM_SIZE_DIRECTIVE(name) #ifdef PIC #define JUMPTARGET(name) name##@plt #else #define JUMPTARGET(name) name #endif /* Local labels stripped out by the linker. */ #define L(x) .L##x polyml-5.6/libffi/src/powerpc/darwin.S000066400000000000000000000257761265146633400200440ustar00rootroot00000000000000/* ----------------------------------------------------------------------- darwin.S - Copyright (c) 2000 John Hornkvist Copyright (c) 2004, 2010 Free Software Foundation, Inc. PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #if defined(__ppc64__) #define MODE_CHOICE(x, y) y #else #define MODE_CHOICE(x, y) x #endif #define machine_choice MODE_CHOICE(ppc7400,ppc64) ; Define some pseudo-opcodes for size-independent load & store of GPRs ... #define lgu MODE_CHOICE(lwzu, ldu) #define lg MODE_CHOICE(lwz,ld) #define sg MODE_CHOICE(stw,std) #define sgu MODE_CHOICE(stwu,stdu) #define sgux MODE_CHOICE(stwux,stdux) ; ... and the size of GPRs and their storage indicator. #define GPR_BYTES MODE_CHOICE(4,8) #define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ #define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. #define LINKAGE_SIZE MODE_CHOICE(24,48) #define PARAM_AREA MODE_CHOICE(32,64) #define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ /* If there is any FP stuff we make space for all of the regs. */ #define SAVED_FPR_COUNT 13 #define FPR_SIZE 8 #define RESULT_BYTES 16 /* This should be kept in step with the same value in ffi_darwin.c. */ #define ASM_NEEDS_REGISTERS 4 #define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES) #include #include #define JUMPTARGET(name) name #define L(x) x .text .align 2 .globl _ffi_prep_args .align 2 .globl _ffi_call_DARWIN /* We arrive here with: r3 = ptr to extended cif. r4 = -bytes. r5 = cif flags. r6 = ptr to return value. r7 = fn pointer (user func). r8 = fn pointer (ffi_prep_args). r9 = ffi_type* for the ret val. */ _ffi_call_DARWIN: Lstartcode: mr r12,r8 /* We only need r12 until the call, so it does not have to be saved. */ LFB1: /* Save the old stack pointer as AP. */ mr r8,r1 LCFI0: /* Save the retval type in parents frame. */ sg r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8) /* Allocate the stack space we need. */ sgux r1,r1,r4 /* Save registers we use. */ mflr r9 sg r9,SAVED_LR_OFFSET(r8) sg r28,-(4 * GPR_BYTES)(r8) sg r29,-(3 * GPR_BYTES)(r8) sg r30,-(2 * GPR_BYTES)(r8) sg r31,-( GPR_BYTES)(r8) #if !defined(POWERPC_DARWIN) /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ sg r2,(5 * GPR_BYTES)(r1) #endif LCFI1: /* Save arguments over call. */ mr r31,r5 /* flags, */ mr r30,r6 /* rvalue, */ mr r29,r7 /* function address, */ mr r28,r8 /* our AP. */ LCFI2: /* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy. */ mr r4,r1 li r9,0 mtctr r12 /* r12 holds address of _ffi_prep_args. */ bctrl #if !defined(POWERPC_DARWIN) /* The TOC slot is reserved in the Darwin ABI and r2 is volatile. */ lg r2,(5 * GPR_BYTES)(r1) #endif /* Now do the call. Set up cr1 with bits 4-7 of the flags. */ mtcrf 0x40,r31 /* Get the address to call into CTR. */ mtctr r29 /* Load all those argument registers. We have set up a nice stack frame, just load it into registers. */ lg r3, (LINKAGE_SIZE )(r1) lg r4, (LINKAGE_SIZE + GPR_BYTES)(r1) lg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1) lg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1) nop lg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1) lg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1) lg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1) lg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1) L1: /* ... Load all the FP registers. */ bf 6,L2 /* No floats to load. */ lfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) lfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) lfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) lfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) nop lfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) lfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) lfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) lfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) nop lfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) lfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) lfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) lfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) nop lfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) L2: mr r12,r29 /* Put the target address in r12 as specified. */ mtctr r12 nop nop /* Make the call. */ bctrl /* Now, deal with the return value. */ /* m64 structure returns can occupy the same set of registers as would be used to pass such a structure as arg0 - so take care not to step on any possibly hot regs. */ /* Get the flags.. */ mtcrf 0x03,r31 ; we need c6 & cr7 now. ; FLAG_RETURNS_NOTHING also covers struct ret-by-ref. bt 30,L(done_return_value) ; FLAG_RETURNS_NOTHING bf 27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT /* OK, so we have a struct. */ #if defined(__ppc64__) bt 31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case /* OK, we have to map the return back to a mem struct. We are about to trample the parents param area, so recover the return type. r29 is free, since the call is done. */ lg r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28) sg r3, (LINKAGE_SIZE )(r28) sg r4, (LINKAGE_SIZE + GPR_BYTES)(r28) sg r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28) sg r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28) nop sg r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28) sg r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28) sg r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28) sg r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) /* OK, so do the block move - we trust that memcpy will not trample the fprs... */ mr r3,r30 ; dest addi r4,r28,LINKAGE_SIZE ; source /* The size is a size_t, should be long. */ lg r5,0(r29) /* Figure out small structs */ cmpi 0,r5,4 bgt L3 ; 1, 2 and 4 bytes have special rules. cmpi 0,r5,3 beq L3 ; not 3 addi r4,r4,8 subf r4,r5,r4 L3: bl _memcpy /* ... do we need the FP registers? - recover the flags.. */ mtcrf 0x03,r31 ; we need c6 & cr7 now. bf 29,L(done_return_value) /* No floats in the struct. */ stfd f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28) stfd f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28) stfd f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28) stfd f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28) nop stfd f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28) stfd f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28) stfd f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28) stfd f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28) nop stfd f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28) stfd f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28) stfd f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28) stfd f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28) nop stfd f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28) mr r3,r29 ; ffi_type * mr r4,r30 ; dest addi r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs xor r6,r6,r6 sg r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28) addi r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter. bl _darwin64_struct_floats_to_mem b L(done_return_value) #else stw r3,0(r30) ; m32 the only struct return in reg is 4 bytes. #endif b L(done_return_value) L(fp_return_value): /* Do we have long double to store? */ bf 31,L(fd_return_value) ; FLAG_RETURNS_128BITS stfd f1,0(r30) stfd f2,FPR_SIZE(r30) b L(done_return_value) L(fd_return_value): /* Do we have double to store? */ bf 28,L(float_return_value) stfd f1,0(r30) b L(done_return_value) L(float_return_value): /* We only have a float to store. */ stfs f1,0(r30) b L(done_return_value) L(scalar_return_value): bt 29,L(fp_return_value) ; FLAG_RETURNS_FP ; ffi_arg is defined as unsigned long. sg r3,0(r30) ; Save the reg. bf 28,L(done_return_value) ; not FLAG_RETURNS_64BITS #if defined(__ppc64__) L(maybe_return_128): std r3,0(r30) bf 31,L(done_return_value) ; not FLAG_RETURNS_128BITS std r4,8(r30) #else stw r4,4(r30) #endif /* Fall through. */ /* We want this at the end to simplify eh epilog computation. */ L(done_return_value): /* Restore the registers we used and return. */ lg r29,SAVED_LR_OFFSET(r28) ; epilog lg r31,-(1 * GPR_BYTES)(r28) mtlr r29 lg r30,-(2 * GPR_BYTES)(r28) lg r29,-(3 * GPR_BYTES)(r28) lg r28,-(4 * GPR_BYTES)(r28) lg r1,0(r1) blr LFE1: .align 1 /* END(_ffi_call_DARWIN) */ /* Provide a null definition of _ffi_call_AIX. */ .text .globl _ffi_call_AIX .align 2 _ffi_call_AIX: blr /* END(_ffi_call_AIX) */ /* EH stuff. */ #define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) .static_data .align LOG2_GPR_BYTES LLFB0$non_lazy_ptr: .g_long Lstartcode .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$0,LECIE1-LSCIE1 .long L$set$0 ; Length of Common Information Entry LSCIE1: .long 0x0 ; CIE Identifier Tag .byte 0x1 ; CIE Version .ascii "zR\0" ; CIE Augmentation .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor .byte 0x41 ; CIE RA Column .byte 0x1 ; uleb128 0x1; Augmentation size .byte 0x10 ; FDE Encoding (indirect pcrel) .byte 0xc ; DW_CFA_def_cfa .byte 0x1 ; uleb128 0x1 .byte 0x0 ; uleb128 0x0 .align LOG2_GPR_BYTES LECIE1: .globl _ffi_call_DARWIN.eh _ffi_call_DARWIN.eh: LSFDE1: .set L$set$1,LEFDE1-LASFDE1 .long L$set$1 ; FDE Length LASFDE1: .long LASFDE1-EH_frame1 ; FDE CIE offset .g_long LLFB0$non_lazy_ptr-. ; FDE initial location .set L$set$3,LFE1-Lstartcode .g_long L$set$3 ; FDE address range .byte 0x0 ; uleb128 0x0; Augmentation size .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$4,LCFI0-Lstartcode .long L$set$4 .byte 0xd ; DW_CFA_def_cfa_register .byte 0x08 ; uleb128 0x08 .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$5,LCFI1-LCFI0 .long L$set$5 .byte 0x11 ; DW_CFA_offset_extended_sf .byte 0x41 ; uleb128 0x41 .byte 0x7e ; sleb128 -2 .byte 0x9f ; DW_CFA_offset, column 0x1f .byte 0x1 ; uleb128 0x1 .byte 0x9e ; DW_CFA_offset, column 0x1e .byte 0x2 ; uleb128 0x2 .byte 0x9d ; DW_CFA_offset, column 0x1d .byte 0x3 ; uleb128 0x3 .byte 0x9c ; DW_CFA_offset, column 0x1c .byte 0x4 ; uleb128 0x4 .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$6,LCFI2-LCFI1 .long L$set$6 .byte 0xd ; DW_CFA_def_cfa_register .byte 0x1c ; uleb128 0x1c .align LOG2_GPR_BYTES LEFDE1: .align 1 polyml-5.6/libffi/src/powerpc/darwin_closure.S000066400000000000000000000377121265146633400215710ustar00rootroot00000000000000/* ----------------------------------------------------------------------- darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, Free Software Foundation, Inc. based on ppc_closure.S PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #define L(x) x #if defined(__ppc64__) #define MODE_CHOICE(x, y) y #else #define MODE_CHOICE(x, y) x #endif #define machine_choice MODE_CHOICE(ppc7400,ppc64) ; Define some pseudo-opcodes for size-independent load & store of GPRs ... #define lgu MODE_CHOICE(lwzu, ldu) #define lg MODE_CHOICE(lwz,ld) #define sg MODE_CHOICE(stw,std) #define sgu MODE_CHOICE(stwu,stdu) ; ... and the size of GPRs and their storage indicator. #define GPR_BYTES MODE_CHOICE(4,8) #define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */ #define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */ ; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04. #define LINKAGE_SIZE MODE_CHOICE(24,48) #define PARAM_AREA MODE_CHOICE(32,64) #define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */ #define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */ /* WARNING: if ffi_type is changed... here be monsters. Offsets of items within the result type. */ #define FFI_TYPE_TYPE MODE_CHOICE(6,10) #define FFI_TYPE_ELEM MODE_CHOICE(8,16) #define SAVED_FPR_COUNT 13 #define FPR_SIZE 8 /* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */ #define RESULT_BYTES MODE_CHOICE(16,176) ; The whole stack frame **MUST** be 16byte-aligned. #define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL) #define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)) #define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE) #define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA) #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 ; We no longer need the pic symbol stub for Darwin >= 9. #define BLCLS_HELP _ffi_closure_helper_DARWIN #define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p #define PASS_STR_FLOATS _darwin64_pass_struct_floats #undef WANT_STUB #else #define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub #define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub #define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub #define WANT_STUB #endif /* m32/m64 The stack layout looks like this: | Additional params... | | Higher address ~ ~ ~ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS |--------------------------------------------| | | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | |--------------------------------------------| | | Reserved 2*4/8 | | |--------------------------------------------| | | Space for callee`s LR 4/8 | | |--------------------------------------------| | | Saved CR [low word for m64] 4/8 | | |--------------------------------------------| | | Current backchain pointer 4/8 |-/ Parent`s frame. |--------------------------------------------| <+ <<< on entry to | Result Bytes 16/176 | | |--------------------------------------------| | ~ padding to 16-byte alignment ~ ~ |--------------------------------------------| | | NUM_FPR_ARG_REGISTERS slots | | | here fp13 .. fp1 13*8 | | |--------------------------------------------| | | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS |--------------------------------------------| | | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | |--------------------------------------------| | stack | | Reserved [compiler,binder] 2*4/8 | | grows | |--------------------------------------------| | down V | Space for callees LR 4/8 | | |--------------------------------------------| | lower addresses | Saved CR [low word for m64] 4/8 | | |--------------------------------------------| | stack pointer here | Current backchain pointer 4/8 |-/ during |--------------------------------------------| <<< call. */ .file "darwin_closure.S" .machine machine_choice .text .globl _ffi_closure_ASM .align LOG2_GPR_BYTES _ffi_closure_ASM: LFB1: Lstartcode: mflr r0 /* extract return address */ sg r0,SAVED_LR_OFFSET(r1) /* save the return address */ LCFI0: sgu r1,-SAVE_SIZE(r1) /* skip over caller save area keep stack aligned to 16. */ LCFI1: /* We want to build up an area for the parameters passed in registers. (both floating point and integer) */ /* Put gpr 3 to gpr 10 in the parents outgoing area... ... the remainder of any params that overflowed the regs will follow here. */ sg r3, (PARENT_PARM_BASE )(r1) sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1) sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1) sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1) sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1) sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1) sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1) sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1) /* We save fpr 1 to fpr 14 in our own save frame. */ stfd f1, (FP_SAVE_BASE )(r1) stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) /* Set up registers for the routine that actually does the work get the context pointer from the trampoline. */ mr r3,r11 /* Now load up the pointer to the result storage. */ addi r4,r1,(SAVE_SIZE-RESULT_BYTES) /* Now load up the pointer to the saved gpr registers. */ addi r5,r1,PARENT_PARM_BASE /* Now load up the pointer to the saved fpr registers. */ addi r6,r1,FP_SAVE_BASE /* Make the call. */ bl BLCLS_HELP /* r3 contains the rtype pointer... save it since we will need it later. */ sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type lg r0,0(r3) ; size => r0 lhz r3,FFI_TYPE_TYPE(r3) ; type => r3 /* The helper will have intercepted struture returns and inserted the caller`s destination address for structs returned by ref. */ /* r3 contains the return type so use it to look up in a table so we know how to deal with each type. */ addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */ bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */ mflr r4 /* Move to r4. */ slwi r3,r3,4 /* Now multiply return type by 16. */ add r3,r3,r4 /* Add contents of table to table address. */ mtctr r3 bctr /* Jump to it. */ LFE1: /* Each of the ret_typeX code fragments has to be exactly 16 bytes long (4 instructions). For cache effectiveness we align to a 16 byte boundary first. */ .align 4 nop nop nop Lget_ret_type0_addr: blrl /* case FFI_TYPE_VOID */ Lret_type0: b Lfinish nop nop nop /* case FFI_TYPE_INT */ Lret_type1: lg r3,0(r5) b Lfinish nop nop /* case FFI_TYPE_FLOAT */ Lret_type2: lfs f1,0(r5) b Lfinish nop nop /* case FFI_TYPE_DOUBLE */ Lret_type3: lfd f1,0(r5) b Lfinish nop nop /* case FFI_TYPE_LONGDOUBLE */ Lret_type4: lfd f1,0(r5) lfd f2,8(r5) b Lfinish nop /* case FFI_TYPE_UINT8 */ Lret_type5: #if defined(__ppc64__) lbz r3,7(r5) #else lbz r3,3(r5) #endif b Lfinish nop nop /* case FFI_TYPE_SINT8 */ Lret_type6: #if defined(__ppc64__) lbz r3,7(r5) #else lbz r3,3(r5) #endif extsb r3,r3 b Lfinish nop /* case FFI_TYPE_UINT16 */ Lret_type7: #if defined(__ppc64__) lhz r3,6(r5) #else lhz r3,2(r5) #endif b Lfinish nop nop /* case FFI_TYPE_SINT16 */ Lret_type8: #if defined(__ppc64__) lha r3,6(r5) #else lha r3,2(r5) #endif b Lfinish nop nop /* case FFI_TYPE_UINT32 */ Lret_type9: #if defined(__ppc64__) lwz r3,4(r5) #else lwz r3,0(r5) #endif b Lfinish nop nop /* case FFI_TYPE_SINT32 */ Lret_type10: #if defined(__ppc64__) lwz r3,4(r5) #else lwz r3,0(r5) #endif b Lfinish nop nop /* case FFI_TYPE_UINT64 */ Lret_type11: #if defined(__ppc64__) lg r3,0(r5) b Lfinish nop #else lwz r3,0(r5) lwz r4,4(r5) b Lfinish #endif nop /* case FFI_TYPE_SINT64 */ Lret_type12: #if defined(__ppc64__) lg r3,0(r5) b Lfinish nop #else lwz r3,0(r5) lwz r4,4(r5) b Lfinish #endif nop /* case FFI_TYPE_STRUCT */ Lret_type13: #if defined(__ppc64__) lg r3,0(r5) ; we need at least this... cmpi 0,r0,4 bgt Lstructend ; not a special small case b Lsmallstruct ; see if we need more. #else cmpi 0,r0,4 bgt Lfinish ; not by value lg r3,0(r5) b Lfinish #endif /* case FFI_TYPE_POINTER */ Lret_type14: lg r3,0(r5) b Lfinish nop nop #if defined(__ppc64__) Lsmallstruct: beq Lfour ; continuation of Lret13. cmpi 0,r0,3 beq Lfinish ; don`t adjust this - can`t be any floats here... srdi r3,r3,48 cmpi 0,r0,2 beq Lfinish ; .. or here .. srdi r3,r3,8 b Lfinish ; .. or here. Lfour: lg r6,LINKAGE_SIZE(r1) ; get the result type lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer lg r6,0(r6) ; first element lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type cmpi 0,r0,2 ; FFI_TYPE_FLOAT bne Lfourint lfs f1,0(r5) ; just one float in the struct. b Lfinish Lfourint: srdi r3,r3,32 ; four bytes. b Lfinish Lstructend: lg r3,LINKAGE_SIZE(r1) ; get the result type bl STRUCT_RETVALUE_P cmpi 0,r3,0 beq Lfinish ; nope. /* Recover a pointer to the results. */ addi r11,r1,(SAVE_SIZE-RESULT_BYTES) lg r3,0(r11) ; we need at least this... lg r4,8(r11) cmpi 0,r0,16 beq Lfinish ; special case 16 bytes we don't consider floats. /* OK, frustratingly, the process of saving the struct to mem might have messed with the FPRs, so we have to re-load them :(. We`ll use our FPRs space again - calling: void darwin64_pass_struct_floats (ffi_type *s, char *src, unsigned *nfpr, double **fprs) We`ll temporarily pinch the first two slots of the param area for local vars used by the routine. */ xor r6,r6,r6 addi r5,r1,PARENT_PARM_BASE ; some space sg r6,0(r5) ; *nfpr zeroed. addi r6,r5,8 ; **fprs addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space sg r3,0(r6) mr r4,r11 ; the struct is here... lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type. bl PASS_STR_FLOATS ; get struct floats into FPR save space. /* See if we used any floats */ lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1) cmpi 0,r0,0 beq Lstructints ; nope. /* OK load `em up... */ lfd f1, (FP_SAVE_BASE )(r1) lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1) lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1) lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1) lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1) lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1) lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1) lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1) lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1) lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1) lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1) lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1) lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1) /* point back at our saved struct. */ Lstructints: addi r11,r1,(SAVE_SIZE-RESULT_BYTES) lg r3,0(r11) ; we end up picking the lg r4,8(r11) ; first two again. lg r5,16(r11) lg r6,24(r11) lg r7,32(r11) lg r8,40(r11) lg r9,48(r11) lg r10,56(r11) #endif /* case done */ Lfinish: addi r1,r1,SAVE_SIZE /* Restore stack pointer. */ lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */ mtlr r0 /* Reset link register. */ blr Lendcode: .align 1 /* END(ffi_closure_ASM) */ /* EH frame stuff. */ #define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78) /* 176, 400 */ #define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90) #define EH_FRAME_OFFSETB MODE_CHOICE(1,3) .static_data .align LOG2_GPR_BYTES LLFB1$non_lazy_ptr: .g_long Lstartcode .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$0,LECIE1-LSCIE1 .long L$set$0 ; Length of Common Information Entry LSCIE1: .long 0x0 ; CIE Identifier Tag .byte 0x1 ; CIE Version .ascii "zR\0" ; CIE Augmentation .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor .byte 0x41 ; CIE RA Column .byte 0x1 ; uleb128 0x1; Augmentation size .byte 0x10 ; FDE Encoding (indirect pcrel) .byte 0xc ; DW_CFA_def_cfa .byte 0x1 ; uleb128 0x1 .byte 0x0 ; uleb128 0x0 .align LOG2_GPR_BYTES LECIE1: .globl _ffi_closure_ASM.eh _ffi_closure_ASM.eh: LSFDE1: .set L$set$1,LEFDE1-LASFDE1 .long L$set$1 ; FDE Length LASFDE1: .long LASFDE1-EH_frame1 ; FDE CIE offset .g_long LLFB1$non_lazy_ptr-. ; FDE initial location .set L$set$3,LFE1-Lstartcode .g_long L$set$3 ; FDE address range .byte 0x0 ; uleb128 0x0; Augmentation size .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$3,LCFI1-LCFI0 .long L$set$3 .byte 0xe ; DW_CFA_def_cfa_offset .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3 .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$4,LCFI0-Lstartcode .long L$set$4 .byte 0x11 ; DW_CFA_offset_extended_sf .byte 0x41 ; uleb128 0x41 .byte 0x7e ; sleb128 -2 .align LOG2_GPR_BYTES LEFDE1: .align 1 #ifdef WANT_STUB .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 .align 5 L_ffi_closure_helper_DARWIN$stub: .indirect_symbol _ffi_closure_helper_DARWIN mflr r0 bcl 20,31,"L00000000001$spb" "L00000000001$spb": mflr r11 addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb") mtlr r0 lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")(r11) mtctr r12 bctr .lazy_symbol_pointer L_ffi_closure_helper_DARWIN$lazy_ptr: .indirect_symbol _ffi_closure_helper_DARWIN .g_long dyld_stub_binding_helper #if defined(__ppc64__) .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 .align 5 L_darwin64_struct_ret_by_value_p$stub: .indirect_symbol _darwin64_struct_ret_by_value_p mflr r0 bcl 20,31,"L00000000002$spb" "L00000000002$spb": mflr r11 addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb") mtlr r0 lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")(r11) mtctr r12 bctr .lazy_symbol_pointer L_darwin64_struct_ret_by_value_p$lazy_ptr: .indirect_symbol _darwin64_struct_ret_by_value_p .g_long dyld_stub_binding_helper .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 .align 5 L_darwin64_pass_struct_floats$stub: .indirect_symbol _darwin64_pass_struct_floats mflr r0 bcl 20,31,"L00000000003$spb" "L00000000003$spb": mflr r11 addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb") mtlr r0 lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")(r11) mtctr r12 bctr .lazy_symbol_pointer L_darwin64_pass_struct_floats$lazy_ptr: .indirect_symbol _darwin64_pass_struct_floats .g_long dyld_stub_binding_helper # endif #endif polyml-5.6/libffi/src/powerpc/ffi.c000066400000000000000000001176031265146633400173330ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (C) 2011 Anthony Green Copyright (C) 2011 Kyle Moffett Copyright (C) 2008 Red Hat, Inc Copyright (C) 2007, 2008 Free Software Foundation, Inc Copyright (c) 1998 Geoffrey Keating PowerPC Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include extern void ffi_closure_SYSV (void); extern void FFI_HIDDEN ffi_closure_LINUX64 (void); enum { /* The assembly depends on these exact flags. */ FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ #ifndef __NO_FPRS__ FLAG_RETURNS_FP = 1 << (31-29), #endif FLAG_RETURNS_64BITS = 1 << (31-28), FLAG_RETURNS_128BITS = 1 << (31-27), /* cr6 */ FLAG_SYSV_SMST_R4 = 1 << (31-26), /* use r4 for FFI_SYSV 8 byte structs. */ FLAG_SYSV_SMST_R3 = 1 << (31-25), /* use r3 for FFI_SYSV 4 byte structs. */ FLAG_ARG_NEEDS_COPY = 1 << (31- 7), #ifndef __NO_FPRS__ FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ #endif FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), FLAG_RETVAL_REFERENCE = 1 << (31- 4) }; /* About the SYSV ABI. */ #define ASM_NEEDS_REGISTERS 4 #define NUM_GPR_ARG_REGISTERS 8 #ifndef __NO_FPRS__ # define NUM_FPR_ARG_REGISTERS 8 #endif /* ffi_prep_args_SYSV is called by the assembly routine once stack space has been allocated for the function's arguments. The stack layout we want looks like this: | Return address from ffi_call_SYSV 4bytes | higher addresses |--------------------------------------------| | Previous backchain pointer 4 | stack pointer here |--------------------------------------------|<+ <<< on entry to | Saved r28-r31 4*4 | | ffi_call_SYSV |--------------------------------------------| | | GPR registers r3-r10 8*4 | | ffi_call_SYSV |--------------------------------------------| | | FPR registers f1-f8 (optional) 8*8 | | |--------------------------------------------| | stack | | Space for copied structures | | grows | |--------------------------------------------| | down V | Parameters that didn't fit in registers | | |--------------------------------------------| | lower addresses | Space for callee's LR 4 | | |--------------------------------------------| | stack pointer here | Current backchain pointer 4 |-/ during |--------------------------------------------| <<< ffi_call_SYSV */ void ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack) { const unsigned bytes = ecif->cif->bytes; const unsigned flags = ecif->cif->flags; typedef union { char *c; unsigned *u; long long *ll; float *f; double *d; } valp; /* 'stacktop' points at the previous backchain pointer. */ valp stacktop; /* 'gpr_base' points at the space for gpr3, and grows upwards as we use GPR registers. */ valp gpr_base; int intarg_count; #ifndef __NO_FPRS__ /* 'fpr_base' points at the space for fpr1, and grows upwards as we use FPR registers. */ valp fpr_base; int fparg_count; #endif /* 'copy_space' grows down as we put structures in it. It should stay 16-byte aligned. */ valp copy_space; /* 'next_arg' grows up as we put parameters in it. */ valp next_arg; int i; ffi_type **ptr; union { void **v; char **c; signed char **sc; unsigned char **uc; signed short **ss; unsigned short **us; unsigned int **ui; long long **ll; float **f; double **d; } p_argv; size_t struct_copy_size; unsigned gprvalue; stacktop.c = (char *) stack + bytes; gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS; intarg_count = 0; #ifndef __NO_FPRS__ double double_tmp; fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS; fparg_count = 0; copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); #else copy_space.c = gpr_base.c; #endif next_arg.u = stack + 2; /* Check that everything starts aligned properly. */ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); FFI_ASSERT ((bytes & 0xF) == 0); FFI_ASSERT (copy_space.c >= next_arg.c); /* Deal with return values that are actually pass-by-reference. */ if (flags & FLAG_RETVAL_REFERENCE) { *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue; intarg_count++; } /* Now for the arguments. */ p_argv.v = ecif->avalue; for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv.v++) { unsigned short typenum = (*ptr)->type; /* We may need to handle some values depending on ABI */ if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT) { if (typenum == FFI_TYPE_FLOAT) typenum = FFI_TYPE_UINT32; if (typenum == FFI_TYPE_DOUBLE) typenum = FFI_TYPE_UINT64; if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_UINT128; } else if (ecif->cif->abi != FFI_LINUX) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_STRUCT; #endif } /* Now test the translated value */ switch (typenum) { #ifndef __NO_FPRS__ case FFI_TYPE_FLOAT: /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32. */ double_tmp = **p_argv.f; if (fparg_count >= NUM_FPR_ARG_REGISTERS) { *next_arg.f = (float) double_tmp; next_arg.u += 1; intarg_count++; } else *fpr_base.d++ = double_tmp; fparg_count++; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; case FFI_TYPE_DOUBLE: /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64. */ double_tmp = **p_argv.d; if (fparg_count >= NUM_FPR_ARG_REGISTERS) { if (intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count % 2 != 0) { intarg_count++; next_arg.u++; } *next_arg.d = double_tmp; next_arg.u += 2; } else *fpr_base.d++ = double_tmp; fparg_count++; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: double_tmp = (*p_argv.d)[0]; if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1) { if (intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count % 2 != 0) { intarg_count++; next_arg.u++; } *next_arg.d = double_tmp; next_arg.u += 2; double_tmp = (*p_argv.d)[1]; *next_arg.d = double_tmp; next_arg.u += 2; } else { *fpr_base.d++ = double_tmp; double_tmp = (*p_argv.d)[1]; *fpr_base.d++ = double_tmp; } fparg_count += 2; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; #endif #endif /* have FPRs */ /* * The soft float ABI for long doubles works like this, a long double * is passed in four consecutive GPRs if available. A maximum of 2 * long doubles can be passed in gprs. If we do not have 4 GPRs * left, the long double is passed on the stack, 4-byte aligned. */ case FFI_TYPE_UINT128: { unsigned int int_tmp = (*p_argv.ui)[0]; unsigned int ii; if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3) { if (intarg_count < NUM_GPR_ARG_REGISTERS) intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count; *(next_arg.u++) = int_tmp; for (ii = 1; ii < 4; ii++) { int_tmp = (*p_argv.ui)[ii]; *(next_arg.u++) = int_tmp; } } else { *(gpr_base.u++) = int_tmp; for (ii = 1; ii < 4; ii++) { int_tmp = (*p_argv.ui)[ii]; *(gpr_base.u++) = int_tmp; } } intarg_count += 4; break; } case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: if (intarg_count == NUM_GPR_ARG_REGISTERS-1) intarg_count++; if (intarg_count >= NUM_GPR_ARG_REGISTERS) { if (intarg_count % 2 != 0) { intarg_count++; next_arg.u++; } *next_arg.ll = **p_argv.ll; next_arg.u += 2; } else { /* whoops: abi states only certain register pairs * can be used for passing long long int * specifically (r3,r4), (r5,r6), (r7,r8), * (r9,r10) and if next arg is long long but * not correct starting register of pair then skip * until the proper starting register */ if (intarg_count % 2 != 0) { intarg_count ++; gpr_base.u++; } *gpr_base.ll++ = **p_argv.ll; } intarg_count += 2; break; case FFI_TYPE_STRUCT: struct_copy_size = ((*ptr)->size + 15) & ~0xF; copy_space.c -= struct_copy_size; memcpy (copy_space.c, *p_argv.c, (*ptr)->size); gprvalue = (unsigned long) copy_space.c; FFI_ASSERT (copy_space.c > next_arg.c); FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY); goto putgpr; case FFI_TYPE_UINT8: gprvalue = **p_argv.uc; goto putgpr; case FFI_TYPE_SINT8: gprvalue = **p_argv.sc; goto putgpr; case FFI_TYPE_UINT16: gprvalue = **p_argv.us; goto putgpr; case FFI_TYPE_SINT16: gprvalue = **p_argv.ss; goto putgpr; case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: gprvalue = **p_argv.ui; putgpr: if (intarg_count >= NUM_GPR_ARG_REGISTERS) *next_arg.u++ = gprvalue; else *gpr_base.u++ = gprvalue; intarg_count++; break; } } /* Check that we didn't overrun the stack... */ FFI_ASSERT (copy_space.c >= next_arg.c); FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS); /* The assert below is testing that the number of integer arguments agrees with the number found in ffi_prep_cif_machdep(). However, intarg_count is incremeneted whenever we place an FP arg on the stack, so account for that before our assert test. */ #ifndef __NO_FPRS__ if (fparg_count > NUM_FPR_ARG_REGISTERS) intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS; FFI_ASSERT (fpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); #endif FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); } /* About the LINUX64 ABI. */ enum { NUM_GPR_ARG_REGISTERS64 = 8, NUM_FPR_ARG_REGISTERS64 = 13 }; enum { ASM_NEEDS_REGISTERS64 = 4 }; /* ffi_prep_args64 is called by the assembly routine once stack space has been allocated for the function's arguments. The stack layout we want looks like this: | Ret addr from ffi_call_LINUX64 8bytes | higher addresses |--------------------------------------------| | CR save area 8bytes | |--------------------------------------------| | Previous backchain pointer 8 | stack pointer here |--------------------------------------------|<+ <<< on entry to | Saved r28-r31 4*8 | | ffi_call_LINUX64 |--------------------------------------------| | | GPR registers r3-r10 8*8 | | |--------------------------------------------| | | FPR registers f1-f13 (optional) 13*8 | | |--------------------------------------------| | | Parameter save area | | |--------------------------------------------| | | TOC save area 8 | | |--------------------------------------------| | stack | | Linker doubleword 8 | | grows | |--------------------------------------------| | down V | Compiler doubleword 8 | | |--------------------------------------------| | lower addresses | Space for callee's LR 8 | | |--------------------------------------------| | | CR save area 8 | | |--------------------------------------------| | stack pointer here | Current backchain pointer 8 |-/ during |--------------------------------------------| <<< ffi_call_LINUX64 */ void FFI_HIDDEN ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack) { const unsigned long bytes = ecif->cif->bytes; const unsigned long flags = ecif->cif->flags; typedef union { char *c; unsigned long *ul; float *f; double *d; } valp; /* 'stacktop' points at the previous backchain pointer. */ valp stacktop; /* 'next_arg' points at the space for gpr3, and grows upwards as we use GPR registers, then continues at rest. */ valp gpr_base; valp gpr_end; valp rest; valp next_arg; /* 'fpr_base' points at the space for fpr3, and grows upwards as we use FPR registers. */ valp fpr_base; int fparg_count; int i, words; ffi_type **ptr; double double_tmp; union { void **v; char **c; signed char **sc; unsigned char **uc; signed short **ss; unsigned short **us; signed int **si; unsigned int **ui; unsigned long **ul; float **f; double **d; } p_argv; unsigned long gprvalue; stacktop.c = (char *) stack + bytes; gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64; gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64; rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64; fparg_count = 0; next_arg.ul = gpr_base.ul; /* Check that everything starts aligned properly. */ FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0); FFI_ASSERT ((bytes & 0xF) == 0); /* Deal with return values that are actually pass-by-reference. */ if (flags & FLAG_RETVAL_REFERENCE) *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue; /* Now for the arguments. */ p_argv.v = ecif->avalue; for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv.v++) { switch ((*ptr)->type) { case FFI_TYPE_FLOAT: double_tmp = **p_argv.f; *next_arg.f = (float) double_tmp; if (++next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; if (fparg_count < NUM_FPR_ARG_REGISTERS64) *fpr_base.d++ = double_tmp; fparg_count++; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; case FFI_TYPE_DOUBLE: double_tmp = **p_argv.d; *next_arg.d = double_tmp; if (++next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; if (fparg_count < NUM_FPR_ARG_REGISTERS64) *fpr_base.d++ = double_tmp; fparg_count++; FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: double_tmp = (*p_argv.d)[0]; *next_arg.d = double_tmp; if (++next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; if (fparg_count < NUM_FPR_ARG_REGISTERS64) *fpr_base.d++ = double_tmp; fparg_count++; double_tmp = (*p_argv.d)[1]; *next_arg.d = double_tmp; if (++next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; if (fparg_count < NUM_FPR_ARG_REGISTERS64) *fpr_base.d++ = double_tmp; fparg_count++; FFI_ASSERT (__LDBL_MANT_DIG__ == 106); FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); break; #endif case FFI_TYPE_STRUCT: words = ((*ptr)->size + 7) / 8; if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul) { size_t first = gpr_end.c - next_arg.c; memcpy (next_arg.c, *p_argv.c, first); memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first); next_arg.c = rest.c + words * 8 - first; } else { char *where = next_arg.c; /* Structures with size less than eight bytes are passed left-padded. */ if ((*ptr)->size < 8) where += 8 - (*ptr)->size; memcpy (where, *p_argv.c, (*ptr)->size); next_arg.ul += words; if (next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; } break; case FFI_TYPE_UINT8: gprvalue = **p_argv.uc; goto putgpr; case FFI_TYPE_SINT8: gprvalue = **p_argv.sc; goto putgpr; case FFI_TYPE_UINT16: gprvalue = **p_argv.us; goto putgpr; case FFI_TYPE_SINT16: gprvalue = **p_argv.ss; goto putgpr; case FFI_TYPE_UINT32: gprvalue = **p_argv.ui; goto putgpr; case FFI_TYPE_INT: case FFI_TYPE_SINT32: gprvalue = **p_argv.si; goto putgpr; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_POINTER: gprvalue = **p_argv.ul; putgpr: *next_arg.ul++ = gprvalue; if (next_arg.ul == gpr_end.ul) next_arg.ul = rest.ul; break; } } FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || (next_arg.ul >= gpr_base.ul && next_arg.ul <= gpr_base.ul + 4)); } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep (ffi_cif *cif) { /* All this is for the SYSV and LINUX64 ABI. */ int i; ffi_type **ptr; unsigned bytes; int fparg_count = 0, intarg_count = 0; unsigned flags = 0; unsigned struct_copy_size = 0; unsigned type = cif->rtype->type; unsigned size = cif->rtype->size; if (cif->abi != FFI_LINUX64) { /* All the machine-independent calculation of cif->bytes will be wrong. Redo the calculation for SYSV. */ /* Space for the frame pointer, callee's LR, and the asm's temp regs. */ bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int); /* Space for the GPR registers. */ bytes += NUM_GPR_ARG_REGISTERS * sizeof (int); } else { /* 64-bit ABI. */ /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp regs. */ bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long); /* Space for the mandatory parm save area and general registers. */ bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long); } /* Return value handling. The rules for SYSV are as follows: - 32-bit (or less) integer values are returned in gpr3; - Structures of size <= 4 bytes also returned in gpr3; - 64-bit integer values and structures between 5 and 8 bytes are returned in gpr3 and gpr4; - Single/double FP values are returned in fpr1; - Larger structures are allocated space and a pointer is passed as the first argument. - long doubles (if not equivalent to double) are returned in fpr1,fpr2 for Linux and as for large structs for SysV. For LINUX64: - integer values in gpr3; - Structures/Unions by reference; - Single/double FP values in fpr1, long double in fpr1,fpr2. - soft-float float/doubles are treated as UINT32/UINT64 respectivley. - soft-float long doubles are returned in gpr3-gpr6. */ /* First translate for softfloat/nonlinux */ if (cif->abi == FFI_LINUX_SOFT_FLOAT) { if (type == FFI_TYPE_FLOAT) type = FFI_TYPE_UINT32; if (type == FFI_TYPE_DOUBLE) type = FFI_TYPE_UINT64; if (type == FFI_TYPE_LONGDOUBLE) type = FFI_TYPE_UINT128; } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (type == FFI_TYPE_LONGDOUBLE) type = FFI_TYPE_STRUCT; #endif } switch (type) { #ifndef __NO_FPRS__ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: flags |= FLAG_RETURNS_128BITS; /* Fall through. */ #endif case FFI_TYPE_DOUBLE: flags |= FLAG_RETURNS_64BITS; /* Fall through. */ case FFI_TYPE_FLOAT: flags |= FLAG_RETURNS_FP; break; #endif case FFI_TYPE_UINT128: flags |= FLAG_RETURNS_128BITS; /* Fall through. */ case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: flags |= FLAG_RETURNS_64BITS; break; case FFI_TYPE_STRUCT: if (cif->abi == FFI_SYSV) { /* The final SYSV ABI says that structures smaller or equal 8 bytes are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them in memory. */ /* Treat structs with size <= 8 bytes. */ if (size <= 8) { flags |= FLAG_RETURNS_SMST; /* These structs are returned in r3. We pack the type and the precalculated shift value (needed in the sysv.S) into flags. The same applies for the structs returned in r3/r4. */ if (size <= 4) { flags |= FLAG_SYSV_SMST_R3; flags |= 8 * (4 - size) << 8; break; } /* These structs are returned in r3 and r4. See above. */ if (size <= 8) { flags |= FLAG_SYSV_SMST_R3 | FLAG_SYSV_SMST_R4; flags |= 8 * (8 - size) << 8; break; } } } intarg_count++; flags |= FLAG_RETVAL_REFERENCE; /* Fall through. */ case FFI_TYPE_VOID: flags |= FLAG_RETURNS_NOTHING; break; default: /* Returns 32-bit integer, or similar. Nothing to do here. */ break; } if (cif->abi != FFI_LINUX64) /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest goes on the stack. Structures and long doubles (if not equivalent to double) are passed as a pointer to a copy of the structure. Stuff on the stack needs to keep proper alignment. */ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { unsigned short typenum = (*ptr)->type; /* We may need to handle some values depending on ABI */ if (cif->abi == FFI_LINUX_SOFT_FLOAT) { if (typenum == FFI_TYPE_FLOAT) typenum = FFI_TYPE_UINT32; if (typenum == FFI_TYPE_DOUBLE) typenum = FFI_TYPE_UINT64; if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_UINT128; } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_STRUCT; #endif } switch (typenum) { #ifndef __NO_FPRS__ case FFI_TYPE_FLOAT: fparg_count++; /* floating singles are not 8-aligned on stack */ break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: fparg_count++; /* Fall thru */ #endif case FFI_TYPE_DOUBLE: fparg_count++; /* If this FP arg is going on the stack, it must be 8-byte-aligned. */ if (fparg_count > NUM_FPR_ARG_REGISTERS && intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count % 2 != 0) intarg_count++; break; #endif case FFI_TYPE_UINT128: /* * A long double in FFI_LINUX_SOFT_FLOAT can use only a set * of four consecutive gprs. If we do not have enough, we * have to adjust the intarg_count value. */ if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3 && intarg_count < NUM_GPR_ARG_REGISTERS) intarg_count = NUM_GPR_ARG_REGISTERS; intarg_count += 4; break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: /* 'long long' arguments are passed as two words, but either both words must fit in registers or both go on the stack. If they go on the stack, they must be 8-byte-aligned. Also, only certain register pairs can be used for passing long long int -- specifically (r3,r4), (r5,r6), (r7,r8), (r9,r10). */ if (intarg_count == NUM_GPR_ARG_REGISTERS-1 || intarg_count % 2 != 0) intarg_count++; intarg_count += 2; break; case FFI_TYPE_STRUCT: /* We must allocate space for a copy of these to enforce pass-by-value. Pad the space up to a multiple of 16 bytes (the maximum alignment required for anything under the SYSV ABI). */ struct_copy_size += ((*ptr)->size + 15) & ~0xF; /* Fall through (allocate space for the pointer). */ case FFI_TYPE_POINTER: case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: /* Everything else is passed as a 4-byte word in a GPR, either the object itself or a pointer to it. */ intarg_count++; break; default: FFI_ASSERT (0); } } else for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { switch ((*ptr)->type) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: if (cif->abi == FFI_LINUX_SOFT_FLOAT) intarg_count += 4; else { fparg_count += 2; intarg_count += 2; } break; #endif case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: fparg_count++; intarg_count++; break; case FFI_TYPE_STRUCT: intarg_count += ((*ptr)->size + 7) / 8; break; case FFI_TYPE_POINTER: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: /* Everything else is passed as a 8-byte word in a GPR, either the object itself or a pointer to it. */ intarg_count++; break; default: FFI_ASSERT (0); } } #ifndef __NO_FPRS__ if (fparg_count != 0) flags |= FLAG_FP_ARGUMENTS; #endif if (intarg_count > 4) flags |= FLAG_4_GPR_ARGUMENTS; if (struct_copy_size != 0) flags |= FLAG_ARG_NEEDS_COPY; if (cif->abi != FFI_LINUX64) { #ifndef __NO_FPRS__ /* Space for the FPR registers, if needed. */ if (fparg_count != 0) bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); #endif /* Stack space. */ if (intarg_count > NUM_GPR_ARG_REGISTERS) bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int); #ifndef __NO_FPRS__ if (fparg_count > NUM_FPR_ARG_REGISTERS) bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double); #endif } else { #ifndef __NO_FPRS__ /* Space for the FPR registers, if needed. */ if (fparg_count != 0) bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); #endif /* Stack space. */ if (intarg_count > NUM_GPR_ARG_REGISTERS64) bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); } /* The stack space allocated needs to be a multiple of 16 bytes. */ bytes = (bytes + 15) & ~0xF; /* Add in the space for the copied structures. */ bytes += struct_copy_size; cif->flags = flags; cif->bytes = bytes; return FFI_OK; } extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long, unsigned long, unsigned long *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { /* * The final SYSV ABI says that structures smaller or equal 8 bytes * are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them * in memory. * * Just to keep things simple for the assembly code, we will always * bounce-buffer struct return values less than or equal to 8 bytes. * This allows the ASM to handle SYSV small structures by directly * writing r3 and r4 to memory without worrying about struct size. */ unsigned int smst_buffer[2]; extended_cif ecif; unsigned int rsize = 0; ecif.cif = cif; ecif.avalue = avalue; /* Ensure that we have a valid struct return value */ ecif.rvalue = rvalue; if (cif->rtype->type == FFI_TYPE_STRUCT) { rsize = cif->rtype->size; if (rsize <= 8) ecif.rvalue = smst_buffer; else if (!rvalue) ecif.rvalue = alloca(rsize); } switch (cif->abi) { #ifndef POWERPC64 # ifndef __NO_FPRS__ case FFI_SYSV: case FFI_GCC_SYSV: case FFI_LINUX: # endif case FFI_LINUX_SOFT_FLOAT: ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn); break; #else case FFI_LINUX64: ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn); break; #endif default: FFI_ASSERT (0); break; } /* Check for a bounce-buffered return value */ if (rvalue && ecif.rvalue == smst_buffer) memcpy(rvalue, smst_buffer, rsize); } #ifndef POWERPC64 #define MIN_CACHE_LINE_SIZE 8 static void flush_icache (char *wraddr, char *xaddr, int size) { int i; for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE) __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" : : "r" (xaddr + i), "r" (wraddr + i) : "memory"); __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;" : : "r"(xaddr + size - 1), "r"(wraddr + size - 1) : "memory"); } #endif ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, void (*fun) (ffi_cif *, void *, void **, void *), void *user_data, void *codeloc) { #ifdef POWERPC64 void **tramp = (void **) &closure->tramp[0]; if (cif->abi != FFI_LINUX64) return FFI_BAD_ABI; /* Copy function address and TOC from ffi_closure_LINUX64. */ memcpy (tramp, (char *) ffi_closure_LINUX64, 16); tramp[2] = codeloc; #else unsigned int *tramp; if (! (cif->abi == FFI_GCC_SYSV || cif->abi == FFI_SYSV || cif->abi == FFI_LINUX || cif->abi == FFI_LINUX_SOFT_FLOAT)) return FFI_BAD_ABI; tramp = (unsigned int *) &closure->tramp[0]; tramp[0] = 0x7c0802a6; /* mflr r0 */ tramp[1] = 0x4800000d; /* bl 10 */ tramp[4] = 0x7d6802a6; /* mflr r11 */ tramp[5] = 0x7c0803a6; /* mtlr r0 */ tramp[6] = 0x800b0000; /* lwz r0,0(r11) */ tramp[7] = 0x816b0004; /* lwz r11,4(r11) */ tramp[8] = 0x7c0903a6; /* mtctr r0 */ tramp[9] = 0x4e800420; /* bctr */ *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */ *(void **) &tramp[3] = codeloc; /* context */ /* Flush the icache. */ flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE); #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; return FFI_OK; } typedef union { float f; double d; } ffi_dblfl; int ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *, ffi_dblfl *, unsigned long *); /* Basically the trampoline invokes ffi_closure_SYSV, and on * entry, r11 holds the address of the closure. * After storing the registers that could possibly contain * parameters to be passed into the stack frame and setting * up space for a return value, ffi_closure_SYSV invokes the * following helper function to do most of the work */ int ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, unsigned long *pgr, ffi_dblfl *pfr, unsigned long *pst) { /* rvalue is the pointer to space for return value in closure assembly */ /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */ /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */ /* pst is the pointer to outgoing parameter stack in original caller */ void ** avalue; ffi_type ** arg_types; long i, avn; #ifndef __NO_FPRS__ long nf = 0; /* number of floating registers already used */ #endif long ng = 0; /* number of general registers already used */ ffi_cif *cif = closure->cif; unsigned size = cif->rtype->size; unsigned short rtypenum = cif->rtype->type; avalue = alloca (cif->nargs * sizeof (void *)); /* First translate for softfloat/nonlinux */ if (cif->abi == FFI_LINUX_SOFT_FLOAT) { if (rtypenum == FFI_TYPE_FLOAT) rtypenum = FFI_TYPE_UINT32; if (rtypenum == FFI_TYPE_DOUBLE) rtypenum = FFI_TYPE_UINT64; if (rtypenum == FFI_TYPE_LONGDOUBLE) rtypenum = FFI_TYPE_UINT128; } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (rtypenum == FFI_TYPE_LONGDOUBLE) rtypenum = FFI_TYPE_STRUCT; #endif } /* Copy the caller's structure return value address so that the closure returns the data directly to the caller. For FFI_SYSV the result is passed in r3/r4 if the struct size is less or equal 8 bytes. */ if (rtypenum == FFI_TYPE_STRUCT && ((cif->abi != FFI_SYSV) || (size > 8))) { rvalue = (void *) *pgr; ng++; pgr++; } i = 0; avn = cif->nargs; arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ while (i < avn) { unsigned short typenum = arg_types[i]->type; /* We may need to handle some values depending on ABI */ if (cif->abi == FFI_LINUX_SOFT_FLOAT) { if (typenum == FFI_TYPE_FLOAT) typenum = FFI_TYPE_UINT32; if (typenum == FFI_TYPE_DOUBLE) typenum = FFI_TYPE_UINT64; if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_UINT128; } else if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (typenum == FFI_TYPE_LONGDOUBLE) typenum = FFI_TYPE_STRUCT; #endif } switch (typenum) { #ifndef __NO_FPRS__ case FFI_TYPE_FLOAT: /* unfortunately float values are stored as doubles * in the ffi_closure_SYSV code (since we don't check * the type in that routine). */ /* there are 8 64bit floating point registers */ if (nf < 8) { double temp = pfr->d; pfr->f = (float) temp; avalue[i] = pfr; nf++; pfr++; } else { /* FIXME? here we are really changing the values * stored in the original calling routines outgoing * parameter stack. This is probably a really * naughty thing to do but... */ avalue[i] = pst; pst += 1; } break; case FFI_TYPE_DOUBLE: /* On the outgoing stack all values are aligned to 8 */ /* there are 8 64bit floating point registers */ if (nf < 8) { avalue[i] = pfr; nf++; pfr++; } else { if (((long) pst) & 4) pst++; avalue[i] = pst; pst += 2; } break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: if (nf < 7) { avalue[i] = pfr; pfr += 2; nf += 2; } else { if (((long) pst) & 4) pst++; avalue[i] = pst; pst += 4; nf = 8; } break; #endif #endif /* have FPRS */ case FFI_TYPE_UINT128: /* * Test if for the whole long double, 4 gprs are available. * otherwise the stuff ends up on the stack. */ if (ng < 5) { avalue[i] = pgr; pgr += 4; ng += 4; } else { avalue[i] = pst; pst += 4; ng = 8+4; } break; case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: /* there are 8 gpr registers used to pass values */ if (ng < 8) { avalue[i] = (char *) pgr + 3; ng++; pgr++; } else { avalue[i] = (char *) pst + 3; pst++; } break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: /* there are 8 gpr registers used to pass values */ if (ng < 8) { avalue[i] = (char *) pgr + 2; ng++; pgr++; } else { avalue[i] = (char *) pst + 2; pst++; } break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_POINTER: /* there are 8 gpr registers used to pass values */ if (ng < 8) { avalue[i] = pgr; ng++; pgr++; } else { avalue[i] = pst; pst++; } break; case FFI_TYPE_STRUCT: /* Structs are passed by reference. The address will appear in a gpr if it is one of the first 8 arguments. */ if (ng < 8) { avalue[i] = (void *) *pgr; ng++; pgr++; } else { avalue[i] = (void *) *pst; pst++; } break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: /* passing long long ints are complex, they must * be passed in suitable register pairs such as * (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10) * and if the entire pair aren't available then the outgoing * parameter stack is used for both but an alignment of 8 * must will be kept. So we must either look in pgr * or pst to find the correct address for this type * of parameter. */ if (ng < 7) { if (ng & 0x01) { /* skip r4, r6, r8 as starting points */ ng++; pgr++; } avalue[i] = pgr; ng += 2; pgr += 2; } else { if (((long) pst) & 4) pst++; avalue[i] = pst; pst += 2; ng = 8; } break; default: FFI_ASSERT (0); } i++; } (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_SYSV how to perform return type promotions. Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4 we have to tell ffi_closure_SYSV how to treat them. We combine the base type FFI_SYSV_TYPE_SMALL_STRUCT - 1 with the size of the struct. So a one byte struct gets the return type 16. Return type 1 to 15 are already used and we never have a struct with size zero. That is the reason for the subtraction of 1. See the comment in ffitarget.h about ordering. */ if (cif->abi == FFI_SYSV && rtypenum == FFI_TYPE_STRUCT && size <= 8) return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size; return rtypenum; } int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *, unsigned long *, ffi_dblfl *); int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue, unsigned long *pst, ffi_dblfl *pfr) { /* rvalue is the pointer to space for return value in closure assembly */ /* pst is the pointer to parameter save area (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */ /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */ void **avalue; ffi_type **arg_types; long i, avn; ffi_cif *cif; ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; cif = closure->cif; avalue = alloca (cif->nargs * sizeof (void *)); /* Copy the caller's structure return value address so that the closure returns the data directly to the caller. */ if (cif->rtype->type == FFI_TYPE_STRUCT) { rvalue = (void *) *pst; pst++; } i = 0; avn = cif->nargs; arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ while (i < avn) { switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = (char *) pst + 7; pst++; break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = (char *) pst + 6; pst++; break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: avalue[i] = (char *) pst + 4; pst++; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_POINTER: avalue[i] = pst; pst++; break; case FFI_TYPE_STRUCT: /* Structures with size less than eight bytes are passed left-padded. */ if (arg_types[i]->size < 8) avalue[i] = (char *) pst + 8 - arg_types[i]->size; else avalue[i] = pst; pst += (arg_types[i]->size + 7) / 8; break; case FFI_TYPE_FLOAT: /* unfortunately float values are stored as doubles * in the ffi_closure_LINUX64 code (since we don't check * the type in that routine). */ /* there are 13 64bit floating point registers */ if (pfr < end_pfr) { double temp = pfr->d; pfr->f = (float) temp; avalue[i] = pfr; pfr++; } else avalue[i] = pst; pst++; break; case FFI_TYPE_DOUBLE: /* On the outgoing stack all values are aligned to 8 */ /* there are 13 64bit floating point registers */ if (pfr < end_pfr) { avalue[i] = pfr; pfr++; } else avalue[i] = pst; pst++; break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: if (pfr + 1 < end_pfr) { avalue[i] = pfr; pfr += 2; } else { if (pfr < end_pfr) { /* Passed partly in f13 and partly on the stack. Move it all to the stack. */ *pst = *(unsigned long *) pfr; pfr++; } avalue[i] = pst; } pst += 2; break; #endif default: FFI_ASSERT (0); } i++; } (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ return cif->rtype->type; } polyml-5.6/libffi/src/powerpc/ffi_darwin.c000066400000000000000000001110161265146633400206670ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi_darwin.c Copyright (C) 1998 Geoffrey Keating Copyright (C) 2001 John Hornkvist Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. FFI support for Darwin and AIX. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include extern void ffi_closure_ASM (void); enum { /* The assembly depends on these exact flags. For Darwin64 (when FLAG_RETURNS_STRUCT is set): FLAG_RETURNS_FP indicates that the structure embeds FP data. FLAG_RETURNS_128BITS signals a special struct size that is not expanded for float content. */ FLAG_RETURNS_128BITS = 1 << (31-31), /* These go in cr7 */ FLAG_RETURNS_NOTHING = 1 << (31-30), FLAG_RETURNS_FP = 1 << (31-29), FLAG_RETURNS_64BITS = 1 << (31-28), FLAG_RETURNS_STRUCT = 1 << (31-27), /* This goes in cr6 */ FLAG_ARG_NEEDS_COPY = 1 << (31- 7), FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), FLAG_RETVAL_REFERENCE = 1 << (31- 4) }; /* About the DARWIN ABI. */ enum { NUM_GPR_ARG_REGISTERS = 8, NUM_FPR_ARG_REGISTERS = 13, LINKAGE_AREA_GPRS = 6 }; enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */ /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments. m32/m64 The stack layout we want looks like this: | Return address from ffi_call_DARWIN | higher addresses |--------------------------------------------| | Previous backchain pointer 4/8 | stack pointer here |--------------------------------------------|<+ <<< on entry to | ASM_NEEDS_REGISTERS=r28-r31 4*(4/8) | | ffi_call_DARWIN |--------------------------------------------| | | When we have any FP activity... the | | | FPRs occupy NUM_FPR_ARG_REGISTERS slots | | | here fp13 .. fp1 from high to low addr. | | ~ ~ ~ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS |--------------------------------------------| | | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | |--------------------------------------------| | stack | | Reserved 2*4/8 | | grows | |--------------------------------------------| | down V | Space for callee's LR 4/8 | | |--------------------------------------------| | lower addresses | Saved CR [low word for m64] 4/8 | | |--------------------------------------------| | stack pointer here | Current backchain pointer 4/8 |-/ during |--------------------------------------------| <<< ffi_call_DARWIN */ #if defined(POWERPC_DARWIN64) static void darwin64_pass_struct_by_value (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **); #endif /* This depends on GPR_SIZE = sizeof (unsigned long) */ void ffi_prep_args (extended_cif *ecif, unsigned long *const stack) { const unsigned bytes = ecif->cif->bytes; const unsigned flags = ecif->cif->flags; const unsigned nargs = ecif->cif->nargs; #if !defined(POWERPC_DARWIN64) const ffi_abi abi = ecif->cif->abi; #endif /* 'stacktop' points at the previous backchain pointer. */ unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long)); /* 'fpr_base' points at the space for fpr1, and grows upwards as we use FPR registers. */ double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; int gp_count = 0, fparg_count = 0; /* 'next_arg' grows up as we put parameters in it. */ unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions. */ int i; double double_tmp; void **p_argv = ecif->avalue; unsigned long gprvalue; ffi_type** ptr = ecif->cif->arg_types; #if !defined(POWERPC_DARWIN64) char *dest_cpy; #endif unsigned size_al = 0; /* Check that everything starts aligned properly. */ FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0); FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0); FFI_ASSERT((bytes & 0xF) == 0); /* Deal with return values that are actually pass-by-reference. Rule: Return values are referenced by r3, so r4 is the first parameter. */ if (flags & FLAG_RETVAL_REFERENCE) *next_arg++ = (unsigned long) (char *) ecif->rvalue; /* Now for the arguments. */ for (i = nargs; i > 0; i--, ptr++, p_argv++) { switch ((*ptr)->type) { /* If a floating-point parameter appears before all of the general- purpose registers are filled, the corresponding GPRs that match the size of the floating-point parameter are skipped. */ case FFI_TYPE_FLOAT: double_tmp = *(float *) *p_argv; if (fparg_count < NUM_FPR_ARG_REGISTERS) *fpr_base++ = double_tmp; #if defined(POWERPC_DARWIN) *(float *)next_arg = *(float *) *p_argv; #else *(double *)next_arg = double_tmp; #endif next_arg++; gp_count++; fparg_count++; FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); break; case FFI_TYPE_DOUBLE: double_tmp = *(double *) *p_argv; if (fparg_count < NUM_FPR_ARG_REGISTERS) *fpr_base++ = double_tmp; *(double *)next_arg = double_tmp; #ifdef POWERPC64 next_arg++; gp_count++; #else next_arg += 2; gp_count += 2; #endif fparg_count++; FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: # if defined(POWERPC64) && !defined(POWERPC_DARWIN64) /* ??? This will exceed the regs count when the value starts at fp13 and it will not put the extra bit on the stack. */ if (fparg_count < NUM_FPR_ARG_REGISTERS) *(long double *) fpr_base++ = *(long double *) *p_argv; else *(long double *) next_arg = *(long double *) *p_argv; next_arg += 2; fparg_count += 2; # else double_tmp = ((double *) *p_argv)[0]; if (fparg_count < NUM_FPR_ARG_REGISTERS) *fpr_base++ = double_tmp; *(double *) next_arg = double_tmp; # if defined(POWERPC_DARWIN64) next_arg++; gp_count++; # else next_arg += 2; gp_count += 2; # endif fparg_count++; double_tmp = ((double *) *p_argv)[1]; if (fparg_count < NUM_FPR_ARG_REGISTERS) *fpr_base++ = double_tmp; *(double *) next_arg = double_tmp; # if defined(POWERPC_DARWIN64) next_arg++; gp_count++; # else next_arg += 2; gp_count += 2; # endif fparg_count++; # endif FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); break; #endif case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #ifdef POWERPC64 gprvalue = *(long long *) *p_argv; goto putgpr; #else *(long long *) next_arg = *(long long *) *p_argv; next_arg += 2; gp_count += 2; #endif break; case FFI_TYPE_POINTER: gprvalue = *(unsigned long *) *p_argv; goto putgpr; case FFI_TYPE_UINT8: gprvalue = *(unsigned char *) *p_argv; goto putgpr; case FFI_TYPE_SINT8: gprvalue = *(signed char *) *p_argv; goto putgpr; case FFI_TYPE_UINT16: gprvalue = *(unsigned short *) *p_argv; goto putgpr; case FFI_TYPE_SINT16: gprvalue = *(signed short *) *p_argv; goto putgpr; case FFI_TYPE_STRUCT: size_al = (*ptr)->size; #if defined(POWERPC_DARWIN64) next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment); darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, (unsigned) size_al, (unsigned int *) &fparg_count, &fpr_base, &next_arg); #else dest_cpy = (char *) next_arg; /* If the first member of the struct is a double, then include enough padding in the struct size to align it to double-word. */ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) size_al = ALIGN((*ptr)->size, 8); # if defined(POWERPC64) FFI_ASSERT (abi != FFI_DARWIN); memcpy ((char *) dest_cpy, (char *) *p_argv, size_al); next_arg += (size_al + 7) / 8; # else /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, SI 4 bytes) are aligned as if they were those modes. Structures with 3 byte in size are padded upwards. */ if (size_al < 3 && abi == FFI_DARWIN) dest_cpy += 4 - size_al; memcpy((char *) dest_cpy, (char *) *p_argv, size_al); next_arg += (size_al + 3) / 4; # endif #endif break; case FFI_TYPE_INT: case FFI_TYPE_SINT32: gprvalue = *(signed int *) *p_argv; goto putgpr; case FFI_TYPE_UINT32: gprvalue = *(unsigned int *) *p_argv; putgpr: *next_arg++ = gprvalue; gp_count++; break; default: break; } } /* Check that we didn't overrun the stack... */ /* FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); FFI_ASSERT((unsigned *)fpr_base <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); */ } #if defined(POWERPC_DARWIN64) /* See if we can put some of the struct into fprs. This should not be called for structures of size 16 bytes, since these are not broken out this way. */ static void darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr) { int i; FFI_ASSERT (s->type == FFI_TYPE_STRUCT) for (i = 0; s->elements[i] != NULL; i++) { ffi_type *p = s->elements[i]; switch (p->type) { case FFI_TYPE_STRUCT: darwin64_scan_struct_for_floats (p, nfpr); break; case FFI_TYPE_LONGDOUBLE: (*nfpr) += 2; break; case FFI_TYPE_DOUBLE: case FFI_TYPE_FLOAT: (*nfpr) += 1; break; default: break; } } } static int darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr) { unsigned struct_offset=0, i; for (i = 0; s->elements[i] != NULL; i++) { char *item_base; ffi_type *p = s->elements[i]; /* Find the start of this item (0 for the first one). */ if (i > 0) struct_offset = ALIGN(struct_offset, p->alignment); item_base = src + struct_offset; switch (p->type) { case FFI_TYPE_STRUCT: if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr)) return 1; break; case FFI_TYPE_LONGDOUBLE: if (*nfpr >= NUM_FPR_ARG_REGISTERS) return 1; (*nfpr) += 1; item_base += 8; /* FALL THROUGH */ case FFI_TYPE_DOUBLE: if (*nfpr >= NUM_FPR_ARG_REGISTERS) return 1; (*nfpr) += 1; break; case FFI_TYPE_FLOAT: if (*nfpr >= NUM_FPR_ARG_REGISTERS) return 1; (*nfpr) += 1; break; default: /* If we try and place any item, that is non-float, once we've exceeded the 8 GPR mark, then we can't fit the struct. */ if ((unsigned long)item_base >= 8*8) return 1; break; } /* now count the size of what we just used. */ struct_offset += p->size; } return 0; } /* Can this struct be returned by value? */ int darwin64_struct_ret_by_value_p (ffi_type *s) { unsigned nfp = 0; FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT); /* The largest structure we can return is 8long + 13 doubles. */ if (s->size > 168) return 0; /* We can't pass more than 13 floats. */ darwin64_scan_struct_for_floats (s, &nfp); if (nfp > 13) return 0; /* If there are not too many floats, and the struct is small enough to accommodate in the GPRs, then it must be OK. */ if (s->size <= 64) return 1; /* Well, we have to look harder. */ nfp = 0; if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp)) return 0; return 1; } void darwin64_pass_struct_floats (ffi_type *s, char *src, unsigned *nfpr, double **fprs) { int i; double *fpr_base = *fprs; unsigned struct_offset = 0; /* We don't assume anything about the alignment of the source. */ for (i = 0; s->elements[i] != NULL; i++) { char *item_base; ffi_type *p = s->elements[i]; /* Find the start of this item (0 for the first one). */ if (i > 0) struct_offset = ALIGN(struct_offset, p->alignment); item_base = src + struct_offset; switch (p->type) { case FFI_TYPE_STRUCT: darwin64_pass_struct_floats (p, item_base, nfpr, &fpr_base); break; case FFI_TYPE_LONGDOUBLE: if (*nfpr < NUM_FPR_ARG_REGISTERS) *fpr_base++ = *(double *)item_base; (*nfpr) += 1; item_base += 8; /* FALL THROUGH */ case FFI_TYPE_DOUBLE: if (*nfpr < NUM_FPR_ARG_REGISTERS) *fpr_base++ = *(double *)item_base; (*nfpr) += 1; break; case FFI_TYPE_FLOAT: if (*nfpr < NUM_FPR_ARG_REGISTERS) *fpr_base++ = (double) *(float *)item_base; (*nfpr) += 1; break; default: break; } /* now count the size of what we just used. */ struct_offset += p->size; } /* Update the scores. */ *fprs = fpr_base; } /* Darwin64 special rules. Break out a struct into params and float registers. */ static void darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size, unsigned *nfpr, double **fprs, unsigned long **arg) { unsigned long *next_arg = *arg; char *dest_cpy = (char *)next_arg; FFI_ASSERT (s->type == FFI_TYPE_STRUCT) if (!size) return; /* First... special cases. */ if (size < 3 || (size == 4 && s->elements[0] && s->elements[0]->type != FFI_TYPE_FLOAT)) { /* Must be at least one GPR, padding is unspecified in value, let's make it zero. */ *next_arg = 0UL; dest_cpy += 8 - size; memcpy ((char *) dest_cpy, src, size); next_arg++; } else if (size == 16) { memcpy ((char *) dest_cpy, src, size); next_arg += 2; } else { /* now the general case, we consider embedded floats. */ memcpy ((char *) dest_cpy, src, size); darwin64_pass_struct_floats (s, src, nfpr, fprs); next_arg += (size+7)/8; } *arg = next_arg; } double * darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf) { int i; unsigned struct_offset = 0; /* We don't assume anything about the alignment of the source. */ for (i = 0; s->elements[i] != NULL; i++) { char *item_base; ffi_type *p = s->elements[i]; /* Find the start of this item (0 for the first one). */ if (i > 0) struct_offset = ALIGN(struct_offset, p->alignment); item_base = dest + struct_offset; switch (p->type) { case FFI_TYPE_STRUCT: fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf); break; case FFI_TYPE_LONGDOUBLE: if (*nf < NUM_FPR_ARG_REGISTERS) { *(double *)item_base = *fprs++ ; (*nf) += 1; } item_base += 8; /* FALL THROUGH */ case FFI_TYPE_DOUBLE: if (*nf < NUM_FPR_ARG_REGISTERS) { *(double *)item_base = *fprs++ ; (*nf) += 1; } break; case FFI_TYPE_FLOAT: if (*nf < NUM_FPR_ARG_REGISTERS) { *(float *)item_base = (float) *fprs++ ; (*nf) += 1; } break; default: break; } /* now count the size of what we just used. */ struct_offset += p->size; } return fprs; } #endif /* Adjust the size of S to be correct for Darwin. On Darwin m32, the first field of a structure has natural alignment. On Darwin m64, all fields have natural alignment. */ static void darwin_adjust_aggregate_sizes (ffi_type *s) { int i; if (s->type != FFI_TYPE_STRUCT) return; s->size = 0; for (i = 0; s->elements[i] != NULL; i++) { ffi_type *p; int align; p = s->elements[i]; if (p->type == FFI_TYPE_STRUCT) darwin_adjust_aggregate_sizes (p); #if defined(POWERPC_DARWIN64) /* Natural alignment for all items. */ align = p->alignment; #else /* Natrual alignment for the first item... */ if (i == 0) align = p->alignment; else if (p->alignment == 16 || p->alignment < 4) /* .. subsequent items with vector or align < 4 have natural align. */ align = p->alignment; else /* .. or align is 4. */ align = 4; #endif /* Pad, if necessary, before adding the current item. */ s->size = ALIGN(s->size, align) + p->size; } s->size = ALIGN(s->size, s->alignment); /* This should not be necessary on m64, but harmless. */ if (s->elements[0]->type == FFI_TYPE_UINT64 || s->elements[0]->type == FFI_TYPE_SINT64 || s->elements[0]->type == FFI_TYPE_DOUBLE || s->elements[0]->alignment == 8) s->alignment = s->alignment > 8 ? s->alignment : 8; /* Do not add additional tail padding. */ } /* Adjust the size of S to be correct for AIX. Word-align double unless it is the first member of a structure. */ static void aix_adjust_aggregate_sizes (ffi_type *s) { int i; if (s->type != FFI_TYPE_STRUCT) return; s->size = 0; for (i = 0; s->elements[i] != NULL; i++) { ffi_type *p; int align; p = s->elements[i]; aix_adjust_aggregate_sizes (p); align = p->alignment; if (i != 0 && p->type == FFI_TYPE_DOUBLE) align = 4; s->size = ALIGN(s->size, align) + p->size; } s->size = ALIGN(s->size, s->alignment); if (s->elements[0]->type == FFI_TYPE_UINT64 || s->elements[0]->type == FFI_TYPE_SINT64 || s->elements[0]->type == FFI_TYPE_DOUBLE || s->elements[0]->alignment == 8) s->alignment = s->alignment > 8 ? s->alignment : 8; /* Do not add additional tail padding. */ } /* Perform machine dependent cif processing. */ ffi_status ffi_prep_cif_machdep (ffi_cif *cif) { /* All this is for the DARWIN ABI. */ unsigned i; ffi_type **ptr; unsigned bytes; unsigned fparg_count = 0, intarg_count = 0; unsigned flags = 0; unsigned size_al = 0; /* All the machine-independent calculation of cif->bytes will be wrong. All the calculation of structure sizes will also be wrong. Redo the calculation for DARWIN. */ if (cif->abi == FFI_DARWIN) { darwin_adjust_aggregate_sizes (cif->rtype); for (i = 0; i < cif->nargs; i++) darwin_adjust_aggregate_sizes (cif->arg_types[i]); } if (cif->abi == FFI_AIX) { aix_adjust_aggregate_sizes (cif->rtype); for (i = 0; i < cif->nargs; i++) aix_adjust_aggregate_sizes (cif->arg_types[i]); } /* Space for the frame pointer, callee's LR, CR, etc, and for the asm's temp regs. */ bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long); /* Return value handling. The rules m32 are as follows: - 32-bit (or less) integer values are returned in gpr3; - structures of size <= 4 bytes also returned in gpr3; - 64-bit integer values [??? and structures between 5 and 8 bytes] are returned in gpr3 and gpr4; - Single/double FP values are returned in fpr1; - Long double FP (if not equivalent to double) values are returned in fpr1 and fpr2; m64: - 64-bit or smaller integral values are returned in GPR3 - Single/double FP values are returned in fpr1; - Long double FP values are returned in fpr1 and fpr2; m64 Structures: - If the structure could be accommodated in registers were it to be the first argument to a routine, then it is returned in those registers. m32/m64 structures otherwise: - Larger structures values are allocated space and a pointer is passed as the first argument. */ switch (cif->rtype->type) { #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: flags |= FLAG_RETURNS_128BITS; flags |= FLAG_RETURNS_FP; break; #endif case FFI_TYPE_DOUBLE: flags |= FLAG_RETURNS_64BITS; /* Fall through. */ case FFI_TYPE_FLOAT: flags |= FLAG_RETURNS_FP; break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #ifdef POWERPC64 case FFI_TYPE_POINTER: #endif flags |= FLAG_RETURNS_64BITS; break; case FFI_TYPE_STRUCT: #if defined(POWERPC_DARWIN64) { /* Can we fit the struct into regs? */ if (darwin64_struct_ret_by_value_p (cif->rtype)) { unsigned nfpr = 0; flags |= FLAG_RETURNS_STRUCT; if (cif->rtype->size != 16) darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ; else flags |= FLAG_RETURNS_128BITS; /* Will be 0 for 16byte struct. */ if (nfpr) flags |= FLAG_RETURNS_FP; } else /* By ref. */ { flags |= FLAG_RETVAL_REFERENCE; flags |= FLAG_RETURNS_NOTHING; intarg_count++; } } #elif defined(DARWIN_PPC) if (cif->rtype->size <= 4) flags |= FLAG_RETURNS_STRUCT; else /* else by reference. */ { flags |= FLAG_RETVAL_REFERENCE; flags |= FLAG_RETURNS_NOTHING; intarg_count++; } #else /* assume we pass by ref. */ flags |= FLAG_RETVAL_REFERENCE; flags |= FLAG_RETURNS_NOTHING; intarg_count++; #endif break; case FFI_TYPE_VOID: flags |= FLAG_RETURNS_NOTHING; break; default: /* Returns 32-bit integer, or similar. Nothing to do here. */ break; } /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest goes on the stack. ??? Structures are passed as a pointer to a copy of the structure. Stuff on the stack needs to keep proper alignment. For m64 the count is effectively of half-GPRs. */ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { unsigned align_words; switch ((*ptr)->type) { case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: fparg_count++; #if !defined(POWERPC_DARWIN64) /* If this FP arg is going on the stack, it must be 8-byte-aligned. */ if (fparg_count > NUM_FPR_ARG_REGISTERS && (intarg_count & 0x01) != 0) intarg_count++; #endif break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: fparg_count += 2; /* If this FP arg is going on the stack, it must be 16-byte-aligned. */ if (fparg_count >= NUM_FPR_ARG_REGISTERS) #if defined (POWERPC64) intarg_count = ALIGN(intarg_count, 2); #else intarg_count = ALIGN(intarg_count, 4); #endif break; #endif case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #if defined(POWERPC64) intarg_count++; #else /* 'long long' arguments are passed as two words, but either both words must fit in registers or both go on the stack. If they go on the stack, they must be 8-byte-aligned. */ if (intarg_count == NUM_GPR_ARG_REGISTERS-1 || (intarg_count >= NUM_GPR_ARG_REGISTERS && (intarg_count & 0x01) != 0)) intarg_count++; intarg_count += 2; #endif break; case FFI_TYPE_STRUCT: size_al = (*ptr)->size; #if defined(POWERPC_DARWIN64) align_words = (*ptr)->alignment >> 3; if (align_words) intarg_count = ALIGN(intarg_count, align_words); /* Base size of the struct. */ intarg_count += (size_al + 7) / 8; /* If 16 bytes then don't worry about floats. */ if (size_al != 16) /* Scan through for floats to be placed in regs. */ darwin64_scan_struct_for_floats (*ptr, &fparg_count) ; #else align_words = (*ptr)->alignment >> 2; if (align_words) intarg_count = ALIGN(intarg_count, align_words); /* If the first member of the struct is a double, then align the struct to double-word. if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) size_al = ALIGN((*ptr)->size, 8); */ # ifdef POWERPC64 intarg_count += (size_al + 7) / 8; # else intarg_count += (size_al + 3) / 4; # endif #endif break; default: /* Everything else is passed as a 4-byte word in a GPR, either the object itself or a pointer to it. */ intarg_count++; break; } } if (fparg_count != 0) flags |= FLAG_FP_ARGUMENTS; #if defined(POWERPC_DARWIN64) /* Space to image the FPR registers, if needed - which includes when they might be used in a struct return. */ if (fparg_count != 0 || ((flags & FLAG_RETURNS_STRUCT) && (flags & FLAG_RETURNS_FP))) bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); #else /* Space for the FPR registers, if needed. */ if (fparg_count != 0) bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); #endif /* Stack space. */ #ifdef POWERPC64 if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) bytes += (intarg_count + fparg_count) * sizeof(long); #else if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) bytes += (intarg_count + 2 * fparg_count) * sizeof(long); #endif else bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); /* The stack space allocated needs to be a multiple of 16 bytes. */ bytes = ALIGN(bytes, 16) ; cif->flags = flags; cif->bytes = bytes; return FFI_OK; } extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *, void (*fn)(void), void (*fn2)(void)); extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *, void (*fn)(void), void (*fn2)(void), ffi_type*); void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return value address then we need to make one. */ if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca (cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_AIX: ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, FFI_FN(ffi_prep_args)); break; case FFI_DARWIN: ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, FFI_FN(ffi_prep_args), cif->rtype); break; default: FFI_ASSERT(0); break; } } static void flush_icache(char *); static void flush_range(char *, int); /* The layout of a function descriptor. A C function pointer really points to one of these. */ typedef struct aix_fd_struct { void *code_pointer; void *toc; } aix_fd; /* here I'd like to add the stack frame layout we use in darwin_closure.S and aix_closure.S m32/m64 The stack layout looks like this: | Additional params... | | Higher address ~ ~ ~ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS |--------------------------------------------| | | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | |--------------------------------------------| | | Reserved 2*4/8 | | |--------------------------------------------| | | Space for callee's LR 4/8 | | |--------------------------------------------| | | Saved CR [low word for m64] 4/8 | | |--------------------------------------------| | | Current backchain pointer 4/8 |-/ Parent's frame. |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM | Result Bytes 16 | | |--------------------------------------------| | ~ padding to 16-byte alignment ~ ~ |--------------------------------------------| | | NUM_FPR_ARG_REGISTERS slots | | | here fp13 .. fp1 13*8 | | |--------------------------------------------| | | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS |--------------------------------------------| | | TOC=R2 (AIX) Reserved (Darwin) 4/8 | | |--------------------------------------------| | stack | | Reserved [compiler,binder] 2*4/8 | | grows | |--------------------------------------------| | down V | Space for callee's LR 4/8 | | |--------------------------------------------| | lower addresses | Saved CR [low word for m64] 4/8 | | |--------------------------------------------| | stack pointer here | Current backchain pointer 4/8 |-/ during |--------------------------------------------| <<< ffi_closure_ASM. */ ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp; struct ffi_aix_trampoline_struct *tramp_aix; aix_fd *fd; switch (cif->abi) { case FFI_DARWIN: FFI_ASSERT (cif->abi == FFI_DARWIN); tramp = (unsigned int *) &closure->tramp[0]; #if defined(POWERPC_DARWIN64) tramp[0] = 0x7c0802a6; /* mflr r0 */ tramp[1] = 0x429f0015; /* bcl- 20,4*cr7+so, +0x18 (L1) */ /* We put the addresses here. */ tramp[6] = 0x7d6802a6; /*L1: mflr r11 */ tramp[7] = 0xe98b0000; /* ld r12,0(r11) function address */ tramp[8] = 0x7c0803a6; /* mtlr r0 */ tramp[9] = 0x7d8903a6; /* mtctr r12 */ tramp[10] = 0xe96b0008; /* lwz r11,8(r11) static chain */ tramp[11] = 0x4e800420; /* bctr */ *((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function */ *((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context */ #else tramp[0] = 0x7c0802a6; /* mflr r0 */ tramp[1] = 0x429f000d; /* bcl- 20,4*cr7+so,0x10 */ tramp[4] = 0x7d6802a6; /* mflr r11 */ tramp[5] = 0x818b0000; /* lwz r12,0(r11) function address */ tramp[6] = 0x7c0803a6; /* mtlr r0 */ tramp[7] = 0x7d8903a6; /* mtctr r12 */ tramp[8] = 0x816b0004; /* lwz r11,4(r11) static chain */ tramp[9] = 0x4e800420; /* bctr */ tramp[2] = (unsigned long) ffi_closure_ASM; /* function */ tramp[3] = (unsigned long) codeloc; /* context */ #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; /* Flush the icache. Only necessary on Darwin. */ flush_range(codeloc, FFI_TRAMPOLINE_SIZE); break; case FFI_AIX: tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); fd = (aix_fd *)(void *)ffi_closure_ASM; FFI_ASSERT (cif->abi == FFI_AIX); tramp_aix->code_pointer = fd->code_pointer; tramp_aix->toc = fd->toc; tramp_aix->static_chain = codeloc; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; break; default: return FFI_BAD_ABI; break; } return FFI_OK; } static void flush_icache(char *addr) { #ifndef _AIX __asm__ volatile ( "dcbf 0,%0\n" "\tsync\n" "\ticbi 0,%0\n" "\tsync\n" "\tisync" : : "r"(addr) : "memory"); #endif } static void flush_range(char * addr1, int size) { #define MIN_LINE_SIZE 32 int i; for (i = 0; i < size; i += MIN_LINE_SIZE) flush_icache(addr1+i); flush_icache(addr1+size-1); } typedef union { float f; double d; } ffi_dblfl; ffi_type * ffi_closure_helper_DARWIN (ffi_closure *, void *, unsigned long *, ffi_dblfl *); /* Basically the trampoline invokes ffi_closure_ASM, and on entry, r11 holds the address of the closure. After storing the registers that could possibly contain parameters to be passed into the stack frame and setting up space for a return value, ffi_closure_ASM invokes the following helper function to do most of the work. */ ffi_type * ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, unsigned long *pgr, ffi_dblfl *pfr) { /* rvalue is the pointer to space for return value in closure assembly pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ typedef double ldbits[2]; union ldu { ldbits lb; long double ld; }; void ** avalue; ffi_type ** arg_types; long i, avn; ffi_cif * cif; ffi_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; unsigned size_al; #if defined(POWERPC_DARWIN64) unsigned fpsused = 0; #endif cif = closure->cif; avalue = alloca (cif->nargs * sizeof(void *)); if (cif->rtype->type == FFI_TYPE_STRUCT) { #if defined(POWERPC_DARWIN64) if (!darwin64_struct_ret_by_value_p (cif->rtype)) { /* Won't fit into the regs - return by ref. */ rvalue = (void *) *pgr; pgr++; } #elif defined(DARWIN_PPC) if (cif->rtype->size > 4) { rvalue = (void *) *pgr; pgr++; } #else /* assume we return by ref. */ rvalue = (void *) *pgr; pgr++; #endif } i = 0; avn = cif->nargs; arg_types = cif->arg_types; /* Grab the addresses of the arguments from the stack frame. */ while (i < avn) { switch (arg_types[i]->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: #if defined(POWERPC64) avalue[i] = (char *) pgr + 7; #else avalue[i] = (char *) pgr + 3; #endif pgr++; break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: #if defined(POWERPC64) avalue[i] = (char *) pgr + 6; #else avalue[i] = (char *) pgr + 2; #endif pgr++; break; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: #if defined(POWERPC64) avalue[i] = (char *) pgr + 4; #else case FFI_TYPE_POINTER: avalue[i] = pgr; #endif pgr++; break; case FFI_TYPE_STRUCT: size_al = arg_types[i]->size; #if defined(POWERPC_DARWIN64) pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment); if (size_al < 3 || size_al == 4) { avalue[i] = ((char *)pgr)+8-size_al; if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT && fpsused < NUM_FPR_ARG_REGISTERS) { *(float *)pgr = (float) *(double *)pfr; pfr++; fpsused++; } } else { if (size_al != 16) pfr = (ffi_dblfl *) darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr, (double *)pfr, &fpsused); avalue[i] = pgr; } pgr += (size_al + 7) / 8; #else /* If the first member of the struct is a double, then align the struct to double-word. */ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) size_al = ALIGN(arg_types[i]->size, 8); # if defined(POWERPC64) FFI_ASSERT (cif->abi != FFI_DARWIN); avalue[i] = pgr; pgr += (size_al + 7) / 8; # else /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, SI 4 bytes) are aligned as if they were those modes. */ if (size_al < 3 && cif->abi == FFI_DARWIN) avalue[i] = (char*) pgr + 4 - size_al; else avalue[i] = pgr; pgr += (size_al + 3) / 4; # endif #endif break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: #if defined(POWERPC64) case FFI_TYPE_POINTER: avalue[i] = pgr; pgr++; break; #else /* Long long ints are passed in two gpr's. */ avalue[i] = pgr; pgr += 2; break; #endif case FFI_TYPE_FLOAT: /* A float value consumes a GPR. There are 13 64bit floating point registers. */ if (pfr < end_pfr) { double temp = pfr->d; pfr->f = (float) temp; avalue[i] = pfr; pfr++; } else { avalue[i] = pgr; } pgr++; break; case FFI_TYPE_DOUBLE: /* A double value consumes two GPRs. There are 13 64bit floating point registers. */ if (pfr < end_pfr) { avalue[i] = pfr; pfr++; } else { avalue[i] = pgr; } #ifdef POWERPC64 pgr++; #else pgr += 2; #endif break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: #ifdef POWERPC64 if (pfr + 1 < end_pfr) { avalue[i] = pfr; pfr += 2; } else { if (pfr < end_pfr) { *pgr = *(unsigned long *) pfr; pfr++; } avalue[i] = pgr; } pgr += 2; #else /* POWERPC64 */ /* A long double value consumes four GPRs and two FPRs. There are 13 64bit floating point registers. */ if (pfr + 1 < end_pfr) { avalue[i] = pfr; pfr += 2; } /* Here we have the situation where one part of the long double is stored in fpr13 and the other part is already on the stack. We use a union to pass the long double to avalue[i]. */ else if (pfr + 1 == end_pfr) { union ldu temp_ld; memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits)); memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits)); avalue[i] = &temp_ld.ld; pfr++; } else { avalue[i] = pgr; } pgr += 4; #endif /* POWERPC64 */ break; #endif default: FFI_ASSERT(0); } i++; } (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_ASM to perform return type promotions. */ return cif->rtype; } polyml-5.6/libffi/src/powerpc/ffitarget.h000066400000000000000000000077321265146633400205500ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for PowerPC. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- System specific configurations ----------------------------------- */ #if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ #ifndef POWERPC64 #define POWERPC64 #endif #elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ #ifndef POWERPC64 #define POWERPC64 #endif #ifndef POWERPC_DARWIN64 #define POWERPC_DARWIN64 #endif #elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ #ifndef POWERPC64 #define POWERPC64 #endif #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, #ifdef POWERPC FFI_SYSV, FFI_GCC_SYSV, FFI_LINUX64, FFI_LINUX, FFI_LINUX_SOFT_FLOAT, # if defined(POWERPC64) FFI_DEFAULT_ABI = FFI_LINUX64, # elif defined(__NO_FPRS__) FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT, # elif (__LDBL_MANT_DIG__ == 106) FFI_DEFAULT_ABI = FFI_LINUX, # else FFI_DEFAULT_ABI = FFI_GCC_SYSV, # endif #endif #ifdef POWERPC_AIX FFI_AIX, FFI_DARWIN, FFI_DEFAULT_ABI = FFI_AIX, #endif #ifdef POWERPC_DARWIN FFI_AIX, FFI_DARWIN, FFI_DEFAULT_ABI = FFI_DARWIN, #endif #ifdef POWERPC_FREEBSD FFI_SYSV, FFI_GCC_SYSV, FFI_LINUX64, FFI_LINUX, FFI_LINUX_SOFT_FLOAT, FFI_DEFAULT_ABI = FFI_SYSV, #endif FFI_LAST_ABI } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 /* For additional types like the below, take care about the order in ppc_closures.S. They must follow after the FFI_TYPE_LAST. */ /* Needed for soft-float long-double-128 support. */ #define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1) /* Needed for FFI_SYSV small structure returns. We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are defined in ffi.c, to determine the exact return type and its size. */ #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2) #if defined(POWERPC64) || defined(POWERPC_AIX) # if defined(POWERPC_DARWIN64) # define FFI_TRAMPOLINE_SIZE 48 # else # define FFI_TRAMPOLINE_SIZE 24 # endif #else /* POWERPC || POWERPC_AIX */ # define FFI_TRAMPOLINE_SIZE 40 #endif #ifndef LIBFFI_ASM #if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) struct ffi_aix_trampoline_struct { void * code_pointer; /* Pointer to ffi_closure_ASM */ void * toc; /* TOC */ void * static_chain; /* Pointer to closure */ }; #endif #endif #endif polyml-5.6/libffi/src/powerpc/linux64.S000066400000000000000000000122171265146633400200530ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.h - Copyright (c) 2003 Jakub Jelinek Copyright (c) 2008 Red Hat, Inc. PowerPC64 Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef __powerpc64__ .hidden ffi_call_LINUX64 .globl ffi_call_LINUX64 .section ".opd","aw" .align 3 ffi_call_LINUX64: #ifdef _CALL_LINUX .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 .type ffi_call_LINUX64,@function .text .L.ffi_call_LINUX64: #else .hidden .ffi_call_LINUX64 .globl .ffi_call_LINUX64 .quad .ffi_call_LINUX64,.TOC.@tocbase,0 .size ffi_call_LINUX64,24 .type .ffi_call_LINUX64,@function .text .ffi_call_LINUX64: #endif .LFB1: mflr %r0 std %r28, -32(%r1) std %r29, -24(%r1) std %r30, -16(%r1) std %r31, -8(%r1) std %r0, 16(%r1) mr %r28, %r1 /* our AP. */ .LCFI0: stdux %r1, %r1, %r4 mr %r31, %r5 /* flags, */ mr %r30, %r6 /* rvalue, */ mr %r29, %r7 /* function address. */ std %r2, 40(%r1) /* Call ffi_prep_args64. */ mr %r4, %r1 #ifdef _CALL_LINUX bl ffi_prep_args64 #else bl .ffi_prep_args64 #endif ld %r0, 0(%r29) ld %r2, 8(%r29) ld %r11, 16(%r29) /* Now do the call. */ /* Set up cr1 with bits 4-7 of the flags. */ mtcrf 0x40, %r31 /* Get the address to call into CTR. */ mtctr %r0 /* Load all those argument registers. */ ld %r3, -32-(8*8)(%r28) ld %r4, -32-(7*8)(%r28) ld %r5, -32-(6*8)(%r28) ld %r6, -32-(5*8)(%r28) bf- 5, 1f ld %r7, -32-(4*8)(%r28) ld %r8, -32-(3*8)(%r28) ld %r9, -32-(2*8)(%r28) ld %r10, -32-(1*8)(%r28) 1: /* Load all the FP registers. */ bf- 6, 2f lfd %f1, -32-(21*8)(%r28) lfd %f2, -32-(20*8)(%r28) lfd %f3, -32-(19*8)(%r28) lfd %f4, -32-(18*8)(%r28) lfd %f5, -32-(17*8)(%r28) lfd %f6, -32-(16*8)(%r28) lfd %f7, -32-(15*8)(%r28) lfd %f8, -32-(14*8)(%r28) lfd %f9, -32-(13*8)(%r28) lfd %f10, -32-(12*8)(%r28) lfd %f11, -32-(11*8)(%r28) lfd %f12, -32-(10*8)(%r28) lfd %f13, -32-(9*8)(%r28) 2: /* Make the call. */ bctrl /* This must follow the call immediately, the unwinder uses this to find out if r2 has been saved or not. */ ld %r2, 40(%r1) /* Now, deal with the return value. */ mtcrf 0x01, %r31 bt- 30, .Ldone_return_value bt- 29, .Lfp_return_value std %r3, 0(%r30) /* Fall through... */ .Ldone_return_value: /* Restore the registers we used and return. */ mr %r1, %r28 ld %r0, 16(%r28) ld %r28, -32(%r1) mtlr %r0 ld %r29, -24(%r1) ld %r30, -16(%r1) ld %r31, -8(%r1) blr .Lfp_return_value: bf 28, .Lfloat_return_value stfd %f1, 0(%r30) mtcrf 0x02, %r31 /* cr6 */ bf 27, .Ldone_return_value stfd %f2, 8(%r30) b .Ldone_return_value .Lfloat_return_value: stfs %f1, 0(%r30) b .Ldone_return_value .LFE1: .long 0 .byte 0,12,0,1,128,4,0,0 #ifdef _CALL_LINUX .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 #else .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 #endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .uleb128 0x1 # CIE Code Alignment Factor .sleb128 -8 # CIE Data Alignment Factor .byte 0x41 # CIE RA Column .uleb128 0x1 # Augmentation size .byte 0x14 # FDE Encoding (pcrel udata8) .byte 0xc # DW_CFA_def_cfa .uleb128 0x1 .uleb128 0x0 .align 3 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: .4byte .LASFDE1-.Lframe1 # FDE CIE offset .8byte .LFB1-. # FDE initial location .8byte .LFE1-.LFB1 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x2 # DW_CFA_advance_loc1 .byte .LCFI0-.LFB1 .byte 0xd # DW_CFA_def_cfa_register .uleb128 0x1c .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x41 .sleb128 -2 .byte 0x9f # DW_CFA_offset, column 0x1f .uleb128 0x1 .byte 0x9e # DW_CFA_offset, column 0x1e .uleb128 0x2 .byte 0x9d # DW_CFA_offset, column 0x1d .uleb128 0x3 .byte 0x9c # DW_CFA_offset, column 0x1c .uleb128 0x4 .align 3 .LEFDE1: #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/powerpc/linux64_closure.S000066400000000000000000000140641265146633400216110ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.h - Copyright (c) 2003 Jakub Jelinek Copyright (c) 2008 Red Hat, Inc. PowerPC64 Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include .file "linux64_closure.S" #ifdef __powerpc64__ FFI_HIDDEN (ffi_closure_LINUX64) .globl ffi_closure_LINUX64 .section ".opd","aw" .align 3 ffi_closure_LINUX64: #ifdef _CALL_LINUX .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 .type ffi_closure_LINUX64,@function .text .L.ffi_closure_LINUX64: #else FFI_HIDDEN (.ffi_closure_LINUX64) .globl .ffi_closure_LINUX64 .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 .size ffi_closure_LINUX64,24 .type .ffi_closure_LINUX64,@function .text .ffi_closure_LINUX64: #endif .LFB1: # save general regs into parm save area std %r3, 48(%r1) std %r4, 56(%r1) std %r5, 64(%r1) std %r6, 72(%r1) mflr %r0 std %r7, 80(%r1) std %r8, 88(%r1) std %r9, 96(%r1) std %r10, 104(%r1) std %r0, 16(%r1) # mandatory 48 bytes special reg save area + 64 bytes parm save area # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 stdu %r1, -240(%r1) .LCFI0: # next save fpr 1 to fpr 13 stfd %f1, 128+(0*8)(%r1) stfd %f2, 128+(1*8)(%r1) stfd %f3, 128+(2*8)(%r1) stfd %f4, 128+(3*8)(%r1) stfd %f5, 128+(4*8)(%r1) stfd %f6, 128+(5*8)(%r1) stfd %f7, 128+(6*8)(%r1) stfd %f8, 128+(7*8)(%r1) stfd %f9, 128+(8*8)(%r1) stfd %f10, 128+(9*8)(%r1) stfd %f11, 128+(10*8)(%r1) stfd %f12, 128+(11*8)(%r1) stfd %f13, 128+(12*8)(%r1) # set up registers for the routine that actually does the work # get the context pointer from the trampoline mr %r3, %r11 # now load up the pointer to the result storage addi %r4, %r1, 112 # now load up the pointer to the parameter save area # in the previous frame addi %r5, %r1, 240 + 48 # now load up the pointer to the saved fpr registers */ addi %r6, %r1, 128 # make the call #ifdef _CALL_LINUX bl ffi_closure_helper_LINUX64 #else bl .ffi_closure_helper_LINUX64 #endif .Lret: # now r3 contains the return type # so use it to look up in a table # so we know how to deal with each type # look up the proper starting point in table # by using return type as offset mflr %r4 # move address of .Lret to r4 sldi %r3, %r3, 4 # now multiply return type by 16 addi %r4, %r4, .Lret_type0 - .Lret ld %r0, 240+16(%r1) add %r3, %r3, %r4 # add contents of table to table address mtctr %r3 bctr # jump to it # Each of the ret_typeX code fragments has to be exactly 16 bytes long # (4 instructions). For cache effectiveness we align to a 16 byte boundary # first. .align 4 .Lret_type0: # case FFI_TYPE_VOID mtlr %r0 addi %r1, %r1, 240 blr nop # case FFI_TYPE_INT lwa %r3, 112+4(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_FLOAT lfs %f1, 112+0(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_DOUBLE lfd %f1, 112+0(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_LONGDOUBLE lfd %f1, 112+0(%r1) mtlr %r0 lfd %f2, 112+8(%r1) b .Lfinish # case FFI_TYPE_UINT8 lbz %r3, 112+7(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_SINT8 lbz %r3, 112+7(%r1) extsb %r3,%r3 mtlr %r0 b .Lfinish # case FFI_TYPE_UINT16 lhz %r3, 112+6(%r1) mtlr %r0 .Lfinish: addi %r1, %r1, 240 blr # case FFI_TYPE_SINT16 lha %r3, 112+6(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_UINT32 lwz %r3, 112+4(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_SINT32 lwa %r3, 112+4(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_UINT64 ld %r3, 112+0(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_SINT64 ld %r3, 112+0(%r1) mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_STRUCT mtlr %r0 addi %r1, %r1, 240 blr nop # case FFI_TYPE_POINTER ld %r3, 112+0(%r1) mtlr %r0 addi %r1, %r1, 240 blr # esac .LFE1: .long 0 .byte 0,12,0,1,128,0,0,0 #ifdef _CALL_LINUX .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 #else .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 #endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .uleb128 0x1 # CIE Code Alignment Factor .sleb128 -8 # CIE Data Alignment Factor .byte 0x41 # CIE RA Column .uleb128 0x1 # Augmentation size .byte 0x14 # FDE Encoding (pcrel udata8) .byte 0xc # DW_CFA_def_cfa .uleb128 0x1 .uleb128 0x0 .align 3 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: .4byte .LASFDE1-.Lframe1 # FDE CIE offset .8byte .LFB1-. # FDE initial location .8byte .LFE1-.LFB1 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x2 # DW_CFA_advance_loc1 .byte .LCFI0-.LFB1 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 240 .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x41 .sleb128 -2 .align 3 .LEFDE1: #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/powerpc/ppc_closure.S000066400000000000000000000161571265146633400210670ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.h - Copyright (c) 2003 Jakub Jelinek Copyright (c) 2008 Red Hat, Inc. PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #include .file "ppc_closure.S" #ifndef __powerpc64__ ENTRY(ffi_closure_SYSV) .LFB1: stwu %r1,-144(%r1) .LCFI0: mflr %r0 .LCFI1: stw %r0,148(%r1) # we want to build up an areas for the parameters passed # in registers (both floating point and integer) # so first save gpr 3 to gpr 10 (aligned to 4) stw %r3, 16(%r1) stw %r4, 20(%r1) stw %r5, 24(%r1) stw %r6, 28(%r1) stw %r7, 32(%r1) stw %r8, 36(%r1) stw %r9, 40(%r1) stw %r10,44(%r1) #ifndef __NO_FPRS__ # next save fpr 1 to fpr 8 (aligned to 8) stfd %f1, 48(%r1) stfd %f2, 56(%r1) stfd %f3, 64(%r1) stfd %f4, 72(%r1) stfd %f5, 80(%r1) stfd %f6, 88(%r1) stfd %f7, 96(%r1) stfd %f8, 104(%r1) #endif # set up registers for the routine that actually does the work # get the context pointer from the trampoline mr %r3,%r11 # now load up the pointer to the result storage addi %r4,%r1,112 # now load up the pointer to the saved gpr registers addi %r5,%r1,16 # now load up the pointer to the saved fpr registers */ addi %r6,%r1,48 # now load up the pointer to the outgoing parameter # stack in the previous frame # i.e. the previous frame pointer + 8 addi %r7,%r1,152 # make the call bl ffi_closure_helper_SYSV@local .Lret: # now r3 contains the return type # so use it to look up in a table # so we know how to deal with each type # look up the proper starting point in table # by using return type as offset mflr %r4 # move address of .Lret to r4 slwi %r3,%r3,4 # now multiply return type by 16 addi %r4, %r4, .Lret_type0 - .Lret lwz %r0,148(%r1) add %r3,%r3,%r4 # add contents of table to table address mtctr %r3 bctr # jump to it .LFE1: # Each of the ret_typeX code fragments has to be exactly 16 bytes long # (4 instructions). For cache effectiveness we align to a 16 byte boundary # first. .align 4 # case FFI_TYPE_VOID .Lret_type0: mtlr %r0 addi %r1,%r1,144 blr nop # case FFI_TYPE_INT lwz %r3,112+0(%r1) mtlr %r0 .Lfinish: addi %r1,%r1,144 blr # case FFI_TYPE_FLOAT #ifndef __NO_FPRS__ lfs %f1,112+0(%r1) mtlr %r0 addi %r1,%r1,144 #else nop nop nop #endif blr # case FFI_TYPE_DOUBLE #ifndef __NO_FPRS__ lfd %f1,112+0(%r1) mtlr %r0 addi %r1,%r1,144 #else nop nop nop #endif blr # case FFI_TYPE_LONGDOUBLE #ifndef __NO_FPRS__ lfd %f1,112+0(%r1) lfd %f2,112+8(%r1) mtlr %r0 b .Lfinish #else nop nop nop blr #endif # case FFI_TYPE_UINT8 lbz %r3,112+3(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_SINT8 lbz %r3,112+3(%r1) extsb %r3,%r3 mtlr %r0 b .Lfinish # case FFI_TYPE_UINT16 lhz %r3,112+2(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_SINT16 lha %r3,112+2(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_UINT32 lwz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_SINT32 lwz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_UINT64 lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) mtlr %r0 b .Lfinish # case FFI_TYPE_SINT64 lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) mtlr %r0 b .Lfinish # case FFI_TYPE_STRUCT mtlr %r0 addi %r1,%r1,144 blr nop # case FFI_TYPE_POINTER lwz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_UINT128 lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) lwz %r5,112+8(%r1) bl .Luint128 # The return types below are only used when the ABI type is FFI_SYSV. # case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct. lbz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. lhz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. lwz %r3,112+0(%r1) srwi %r3,%r3,8 mtlr %r0 b .Lfinish # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. lwz %r3,112+0(%r1) mtlr %r0 addi %r1,%r1,144 blr # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) li %r5,24 b .Lstruct567 # case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) li %r5,16 b .Lstruct567 # case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) li %r5,8 b .Lstruct567 # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) mtlr %r0 b .Lfinish .Lstruct567: subfic %r6,%r5,32 srw %r4,%r4,%r5 slw %r6,%r3,%r6 srw %r3,%r3,%r5 or %r4,%r6,%r4 mtlr %r0 addi %r1,%r1,144 blr .Luint128: lwz %r6,112+12(%r1) mtlr %r0 addi %r1,%r1,144 blr END(ffi_closure_SYSV) .section ".eh_frame",EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version #if defined _RELOCATABLE || defined __PIC__ .ascii "zR\0" # CIE Augmentation #else .ascii "\0" # CIE Augmentation #endif .uleb128 0x1 # CIE Code Alignment Factor .sleb128 -4 # CIE Data Alignment Factor .byte 0x41 # CIE RA Column #if defined _RELOCATABLE || defined __PIC__ .uleb128 0x1 # Augmentation size .byte 0x1b # FDE Encoding (pcrel sdata4) #endif .byte 0xc # DW_CFA_def_cfa .uleb128 0x1 .uleb128 0x0 .align 2 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: .4byte .LASFDE1-.Lframe1 # FDE CIE offset #if defined _RELOCATABLE || defined __PIC__ .4byte .LFB1-. # FDE initial location #else .4byte .LFB1 # FDE initial location #endif .4byte .LFE1-.LFB1 # FDE address range #if defined _RELOCATABLE || defined __PIC__ .uleb128 0x0 # Augmentation size #endif .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI0-.LFB1 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 144 .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI1-.LCFI0 .byte 0x11 # DW_CFA_offset_extended_sf .uleb128 0x41 .sleb128 -1 .align 2 .LEFDE1: #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/powerpc/sysv.S000066400000000000000000000147751265146633400175610ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 1998 Geoffrey Keating Copyright (C) 2007 Free Software Foundation, Inc PowerPC Assembly glue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #include #ifndef __powerpc64__ .globl ffi_prep_args_SYSV ENTRY(ffi_call_SYSV) .LFB1: /* Save the old stack pointer as AP. */ mr %r8,%r1 .LCFI0: /* Allocate the stack space we need. */ stwux %r1,%r1,%r4 /* Save registers we use. */ mflr %r9 stw %r28,-16(%r8) .LCFI1: stw %r29,-12(%r8) .LCFI2: stw %r30, -8(%r8) .LCFI3: stw %r31, -4(%r8) .LCFI4: stw %r9, 4(%r8) .LCFI5: /* Save arguments over call... */ mr %r31,%r5 /* flags, */ mr %r30,%r6 /* rvalue, */ mr %r29,%r7 /* function address, */ mr %r28,%r8 /* our AP. */ .LCFI6: /* Call ffi_prep_args_SYSV. */ mr %r4,%r1 bl ffi_prep_args_SYSV@local /* Now do the call. */ /* Set up cr1 with bits 4-7 of the flags. */ mtcrf 0x40,%r31 /* Get the address to call into CTR. */ mtctr %r29 /* Load all those argument registers. */ lwz %r3,-16-(8*4)(%r28) lwz %r4,-16-(7*4)(%r28) lwz %r5,-16-(6*4)(%r28) lwz %r6,-16-(5*4)(%r28) bf- 5,1f nop lwz %r7,-16-(4*4)(%r28) lwz %r8,-16-(3*4)(%r28) lwz %r9,-16-(2*4)(%r28) lwz %r10,-16-(1*4)(%r28) nop 1: #ifndef __NO_FPRS__ /* Load all the FP registers. */ bf- 6,2f lfd %f1,-16-(8*4)-(8*8)(%r28) lfd %f2,-16-(8*4)-(7*8)(%r28) lfd %f3,-16-(8*4)-(6*8)(%r28) lfd %f4,-16-(8*4)-(5*8)(%r28) nop lfd %f5,-16-(8*4)-(4*8)(%r28) lfd %f6,-16-(8*4)-(3*8)(%r28) lfd %f7,-16-(8*4)-(2*8)(%r28) lfd %f8,-16-(8*4)-(1*8)(%r28) #endif 2: /* Make the call. */ bctrl /* Now, deal with the return value. */ mtcrf 0x01,%r31 /* cr7 */ bt- 31,L(small_struct_return_value) bt- 30,L(done_return_value) #ifndef __NO_FPRS__ bt- 29,L(fp_return_value) #endif stw %r3,0(%r30) bf+ 28,L(done_return_value) stw %r4,4(%r30) mtcrf 0x02,%r31 /* cr6 */ bf 27,L(done_return_value) stw %r5,8(%r30) stw %r6,12(%r30) /* Fall through... */ L(done_return_value): /* Restore the registers we used and return. */ lwz %r9, 4(%r28) lwz %r31, -4(%r28) mtlr %r9 lwz %r30, -8(%r28) lwz %r29,-12(%r28) lwz %r28,-16(%r28) lwz %r1,0(%r1) blr #ifndef __NO_FPRS__ L(fp_return_value): bf 28,L(float_return_value) stfd %f1,0(%r30) mtcrf 0x02,%r31 /* cr6 */ bf 27,L(done_return_value) stfd %f2,8(%r30) b L(done_return_value) L(float_return_value): stfs %f1,0(%r30) b L(done_return_value) #endif L(small_struct_return_value): extrwi %r6,%r31,2,19 /* number of bytes padding = shift/8 */ mtcrf 0x02,%r31 /* copy flags to cr[24:27] (cr6) */ extrwi %r5,%r31,5,19 /* r5 <- number of bits of padding */ subfic %r6,%r6,4 /* r6 <- number of useful bytes in r3 */ bf- 25,L(done_return_value) /* struct in r3 ? if not, done. */ /* smst_one_register: */ slw %r3,%r3,%r5 /* Left-justify value in r3 */ mtxer %r6 /* move byte count to XER ... */ stswx %r3,0,%r30 /* ... and store that many bytes */ bf+ 26,L(done_return_value) /* struct in r3:r4 ? */ add %r6,%r6,%r30 /* adjust pointer */ stswi %r4,%r6,4 /* store last four bytes */ b L(done_return_value) .LFE1: END(ffi_call_SYSV) .section ".eh_frame",EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .4byte 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #if defined _RELOCATABLE || defined __PIC__ .ascii "zR\0" /* CIE Augmentation */ #else .ascii "\0" /* CIE Augmentation */ #endif .uleb128 0x1 /* CIE Code Alignment Factor */ .sleb128 -4 /* CIE Data Alignment Factor */ .byte 0x41 /* CIE RA Column */ #if defined _RELOCATABLE || defined __PIC__ .uleb128 0x1 /* Augmentation size */ .byte 0x1b /* FDE Encoding (pcrel sdata4) */ #endif .byte 0xc /* DW_CFA_def_cfa */ .uleb128 0x1 .uleb128 0x0 .align 2 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .4byte .LASFDE1-.Lframe1 /* FDE CIE offset */ #if defined _RELOCATABLE || defined __PIC__ .4byte .LFB1-. /* FDE initial location */ #else .4byte .LFB1 /* FDE initial location */ #endif .4byte .LFE1-.LFB1 /* FDE address range */ #if defined _RELOCATABLE || defined __PIC__ .uleb128 0x0 /* Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI0-.LFB1 .byte 0xd /* DW_CFA_def_cfa_register */ .uleb128 0x08 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI5-.LCFI0 .byte 0x11 /* DW_CFA_offset_extended_sf */ .uleb128 0x41 .sleb128 -1 .byte 0x9f /* DW_CFA_offset, column 0x1f */ .uleb128 0x1 .byte 0x9e /* DW_CFA_offset, column 0x1e */ .uleb128 0x2 .byte 0x9d /* DW_CFA_offset, column 0x1d */ .uleb128 0x3 .byte 0x9c /* DW_CFA_offset, column 0x1c */ .uleb128 0x4 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI6-.LCFI5 .byte 0xd /* DW_CFA_def_cfa_register */ .uleb128 0x1c .align 2 .LEFDE1: #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/prep_cif.c000066400000000000000000000157661265146633400167060ustar00rootroot00000000000000/* ----------------------------------------------------------------------- prep_cif.c - Copyright (c) 2011, 2012 Anthony Green Copyright (c) 1996, 1998, 2007 Red Hat, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* Round up to FFI_SIZEOF_ARG. */ #define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) /* Perform machine independent initialization of aggregate type specifications. */ static ffi_status initialize_aggregate(ffi_type *arg) { ffi_type **ptr; if (UNLIKELY(arg == NULL || arg->elements == NULL)) return FFI_BAD_TYPEDEF; arg->size = 0; arg->alignment = 0; ptr = &(arg->elements[0]); if (UNLIKELY(ptr == 0)) return FFI_BAD_TYPEDEF; while ((*ptr) != NULL) { if (UNLIKELY(((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))) return FFI_BAD_TYPEDEF; /* Perform a sanity check on the argument type */ FFI_ASSERT_VALID_TYPE(*ptr); arg->size = ALIGN(arg->size, (*ptr)->alignment); arg->size += (*ptr)->size; arg->alignment = (arg->alignment > (*ptr)->alignment) ? arg->alignment : (*ptr)->alignment; ptr++; } /* Structure size includes tail padding. This is important for structures that fit in one register on ABIs like the PowerPC64 Linux ABI that right justify small structs in a register. It's also needed for nested structure layout, for example struct A { long a; char b; }; struct B { struct A x; char y; }; should find y at an offset of 2*sizeof(long) and result in a total size of 3*sizeof(long). */ arg->size = ALIGN (arg->size, arg->alignment); if (arg->size == 0) return FFI_BAD_TYPEDEF; else return FFI_OK; } #ifndef __CRIS__ /* The CRIS ABI specifies structure elements to have byte alignment only, so it completely overrides this functions, which assumes "natural" alignment and padding. */ /* Perform machine independent ffi_cif preparation, then call machine dependent routine. */ /* For non variadic functions isvariadic should be 0 and nfixedargs==ntotalargs. For variadic calls, isvariadic should be 1 and nfixedargs and ntotalargs set as appropriate. nfixedargs must always be >=1 */ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, unsigned int isvariadic, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes) { unsigned bytes = 0; unsigned int i; ffi_type **ptr; FFI_ASSERT(cif != NULL); FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); FFI_ASSERT(nfixedargs <= ntotalargs); #ifndef X86_WIN32 if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) return FFI_BAD_ABI; #else if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI || abi == FFI_THISCALL)) return FFI_BAD_ABI; #endif cif->abi = abi; cif->arg_types = atypes; cif->nargs = ntotalargs; cif->rtype = rtype; cif->flags = 0; /* Initialize the return type if necessary */ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) return FFI_BAD_TYPEDEF; /* Perform a sanity check on the return type */ FFI_ASSERT_VALID_TYPE(cif->rtype); /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ #if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA /* Make space for the return structure pointer */ if (cif->rtype->type == FFI_TYPE_STRUCT #ifdef SPARC && (cif->abi != FFI_V9 || cif->rtype->size > 32) #endif #ifdef TILE && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) #endif #ifdef XTENSA && (cif->rtype->size > 16) #endif ) bytes = STACK_ARG_SIZE(sizeof(void*)); #endif for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { /* Initialize any uninitialized aggregate type definitions */ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) return FFI_BAD_TYPEDEF; /* Perform a sanity check on the argument type, do this check after the initialization. */ FFI_ASSERT_VALID_TYPE(*ptr); #if !defined X86_ANY && !defined S390 && !defined PA #ifdef SPARC if (((*ptr)->type == FFI_TYPE_STRUCT && ((*ptr)->size > 16 || cif->abi != FFI_V9)) || ((*ptr)->type == FFI_TYPE_LONGDOUBLE && cif->abi != FFI_V9)) bytes += sizeof(void*); else #endif { /* Add any padding if necessary */ if (((*ptr)->alignment - 1) & bytes) bytes = ALIGN(bytes, (*ptr)->alignment); #ifdef TILE if (bytes < 10 * FFI_SIZEOF_ARG && bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) { /* An argument is never split between the 10 parameter registers and the stack. */ bytes = 10 * FFI_SIZEOF_ARG; } #endif #ifdef XTENSA if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) bytes = 6*4; #endif bytes += STACK_ARG_SIZE((*ptr)->size); } #endif } cif->bytes = bytes; /* Perform machine dependent cif processing */ #ifdef FFI_TARGET_SPECIFIC_VARIADIC if (isvariadic) return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); #endif return ffi_prep_cif_machdep(cif); } #endif /* not __CRIS__ */ ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes) { return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); } ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, unsigned int ntotalargs, ffi_type *rtype, ffi_type **atypes) { return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); } #if FFI_CLOSURES ffi_status ffi_prep_closure (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data) { return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); } #endif polyml-5.6/libffi/src/raw_api.c000066400000000000000000000136631265146633400165330ustar00rootroot00000000000000/* ----------------------------------------------------------------------- raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. Author: Kresten Krab Thorup Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* This file defines generic functions for use with the raw api. */ #include #include #if !FFI_NO_RAW_API size_t ffi_raw_size (ffi_cif *cif) { size_t result = 0; int i; ffi_type **at = cif->arg_types; for (i = cif->nargs-1; i >= 0; i--, at++) { #if !FFI_NO_STRUCTS if ((*at)->type == FFI_TYPE_STRUCT) result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG); else #endif result += ALIGN ((*at)->size, FFI_SIZEOF_ARG); } return result; } void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) { unsigned i; ffi_type **tp = cif->arg_types; #if WORDS_BIGENDIAN for (i = 0; i < cif->nargs; i++, tp++, args++) { switch ((*tp)->type) { case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); break; case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); break; #if FFI_SIZEOF_ARG >= 4 case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); break; #endif #if !FFI_NO_STRUCTS case FFI_TYPE_STRUCT: *args = (raw++)->ptr; break; #endif case FFI_TYPE_POINTER: *args = (void*) &(raw++)->ptr; break; default: *args = raw; raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; } } #else /* WORDS_BIGENDIAN */ #if !PDP /* then assume little endian */ for (i = 0; i < cif->nargs; i++, tp++, args++) { #if !FFI_NO_STRUCTS if ((*tp)->type == FFI_TYPE_STRUCT) { *args = (raw++)->ptr; } else #endif { *args = (void*) raw; raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); } } #else #error "pdp endian not supported" #endif /* ! PDP */ #endif /* WORDS_BIGENDIAN */ } void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) { unsigned i; ffi_type **tp = cif->arg_types; for (i = 0; i < cif->nargs; i++, tp++, args++) { switch ((*tp)->type) { case FFI_TYPE_UINT8: (raw++)->uint = *(UINT8*) (*args); break; case FFI_TYPE_SINT8: (raw++)->sint = *(SINT8*) (*args); break; case FFI_TYPE_UINT16: (raw++)->uint = *(UINT16*) (*args); break; case FFI_TYPE_SINT16: (raw++)->sint = *(SINT16*) (*args); break; #if FFI_SIZEOF_ARG >= 4 case FFI_TYPE_UINT32: (raw++)->uint = *(UINT32*) (*args); break; case FFI_TYPE_SINT32: (raw++)->sint = *(SINT32*) (*args); break; #endif #if !FFI_NO_STRUCTS case FFI_TYPE_STRUCT: (raw++)->ptr = *args; break; #endif case FFI_TYPE_POINTER: (raw++)->ptr = **(void***) args; break; default: memcpy ((void*) raw->data, (void*)*args, (*tp)->size); raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; } } } #if !FFI_NATIVE_RAW_API /* This is a generic definition of ffi_raw_call, to be used if the * native system does not provide a machine-specific implementation. * Having this, allows code to be written for the raw API, without * the need for system-specific code to handle input in that format; * these following couple of functions will handle the translation forth * and back automatically. */ void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) { void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); ffi_raw_to_ptrarray (cif, raw, avalue); ffi_call (cif, fn, rvalue, avalue); } #if FFI_CLOSURES /* base system provides closures */ static void ffi_translate_args (ffi_cif *cif, void *rvalue, void **avalue, void *user_data) { ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); ffi_raw_closure *cl = (ffi_raw_closure*)user_data; ffi_ptrarray_to_raw (cif, avalue, raw); (*cl->fun) (cif, rvalue, raw, cl->user_data); } ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure* cl, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc) { ffi_status status; status = ffi_prep_closure_loc ((ffi_closure*) cl, cif, &ffi_translate_args, codeloc, codeloc); if (status == FFI_OK) { cl->fun = fun; cl->user_data = user_data; } return status; } #endif /* FFI_CLOSURES */ #endif /* !FFI_NATIVE_RAW_API */ #if FFI_CLOSURES /* Again, here is the generic version of ffi_prep_raw_closure, which * will install an intermediate "hub" for translation of arguments from * the pointer-array format, to the raw format */ ffi_status ffi_prep_raw_closure (ffi_raw_closure* cl, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data) { return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); } #endif /* FFI_CLOSURES */ #endif /* !FFI_NO_RAW_API */ polyml-5.6/libffi/src/s390/000077500000000000000000000000001265146633400154325ustar00rootroot00000000000000polyml-5.6/libffi/src/s390/ffi.c000066400000000000000000000546001265146633400163470ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2000, 2007 Software AG Copyright (c) 2008 Red Hat, Inc S390 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /*====================================================================*/ /* Includes */ /* -------- */ /*====================================================================*/ #include #include #include #include /*====================== End of Includes =============================*/ /*====================================================================*/ /* Defines */ /* ------- */ /*====================================================================*/ /* Maximum number of GPRs available for argument passing. */ #define MAX_GPRARGS 5 /* Maximum number of FPRs available for argument passing. */ #ifdef __s390x__ #define MAX_FPRARGS 4 #else #define MAX_FPRARGS 2 #endif /* Round to multiple of 16. */ #define ROUND_SIZE(size) (((size) + 15) & ~15) /* If these values change, sysv.S must be adapted! */ #define FFI390_RET_VOID 0 #define FFI390_RET_STRUCT 1 #define FFI390_RET_FLOAT 2 #define FFI390_RET_DOUBLE 3 #define FFI390_RET_INT32 4 #define FFI390_RET_INT64 5 /*===================== End of Defines ===============================*/ /*====================================================================*/ /* Prototypes */ /* ---------- */ /*====================================================================*/ static void ffi_prep_args (unsigned char *, extended_cif *); void #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) __attribute__ ((visibility ("hidden"))) #endif ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, unsigned long long *, unsigned long *); /*====================== End of Prototypes ===========================*/ /*====================================================================*/ /* Externals */ /* --------- */ /*====================================================================*/ extern void ffi_call_SYSV(unsigned, extended_cif *, void (*)(unsigned char *, extended_cif *), unsigned, void *, void (*fn)(void)); extern void ffi_closure_SYSV(void); /*====================== End of Externals ============================*/ /*====================================================================*/ /* */ /* Name - ffi_check_struct_type. */ /* */ /* Function - Determine if a structure can be passed within a */ /* general purpose or floating point register. */ /* */ /*====================================================================*/ static int ffi_check_struct_type (ffi_type *arg) { size_t size = arg->size; /* If the struct has just one element, look at that element to find out whether to consider the struct as floating point. */ while (arg->type == FFI_TYPE_STRUCT && arg->elements[0] && !arg->elements[1]) arg = arg->elements[0]; /* Structs of size 1, 2, 4, and 8 are passed in registers, just like the corresponding int/float types. */ switch (size) { case 1: return FFI_TYPE_UINT8; case 2: return FFI_TYPE_UINT16; case 4: if (arg->type == FFI_TYPE_FLOAT) return FFI_TYPE_FLOAT; else return FFI_TYPE_UINT32; case 8: if (arg->type == FFI_TYPE_DOUBLE) return FFI_TYPE_DOUBLE; else return FFI_TYPE_UINT64; default: break; } /* Other structs are passed via a pointer to the data. */ return FFI_TYPE_POINTER; } /*======================== End of Routine ============================*/ /*====================================================================*/ /* */ /* Name - ffi_prep_args. */ /* */ /* Function - Prepare parameters for call to function. */ /* */ /* ffi_prep_args is called by the assembly routine once stack space */ /* has been allocated for the function's arguments. */ /* */ /*====================================================================*/ static void ffi_prep_args (unsigned char *stack, extended_cif *ecif) { /* The stack space will be filled with those areas: FPR argument register save area (highest addresses) GPR argument register save area temporary struct copies overflow argument area (lowest addresses) We set up the following pointers: p_fpr: bottom of the FPR area (growing upwards) p_gpr: bottom of the GPR area (growing upwards) p_ov: bottom of the overflow area (growing upwards) p_struct: top of the struct copy area (growing downwards) All areas are kept aligned to twice the word size. */ int gpr_off = ecif->cif->bytes; int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); unsigned char *p_struct = (unsigned char *)p_gpr; unsigned long *p_ov = (unsigned long *)stack; int n_fpr = 0; int n_gpr = 0; int n_ov = 0; ffi_type **ptr; void **p_argv = ecif->avalue; int i; /* If we returning a structure then we set the first parameter register to the address of where we are returning this structure. */ if (ecif->cif->flags == FFI390_RET_STRUCT) p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; /* Now for the arguments. */ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) { void *arg = *p_argv; int type = (*ptr)->type; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE /* 16-byte long double is passed like a struct. */ if (type == FFI_TYPE_LONGDOUBLE) type = FFI_TYPE_STRUCT; #endif /* Check how a structure type is passed. */ if (type == FFI_TYPE_STRUCT) { type = ffi_check_struct_type (*ptr); /* If we pass the struct via pointer, copy the data. */ if (type == FFI_TYPE_POINTER) { p_struct -= ROUND_SIZE ((*ptr)->size); memcpy (p_struct, (char *)arg, (*ptr)->size); arg = &p_struct; } } /* Now handle all primitive int/pointer/float data types. */ switch (type) { case FFI_TYPE_DOUBLE: if (n_fpr < MAX_FPRARGS) p_fpr[n_fpr++] = *(unsigned long long *) arg; else #ifdef __s390x__ p_ov[n_ov++] = *(unsigned long *) arg; #else p_ov[n_ov++] = ((unsigned long *) arg)[0], p_ov[n_ov++] = ((unsigned long *) arg)[1]; #endif break; case FFI_TYPE_FLOAT: if (n_fpr < MAX_FPRARGS) p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; else p_ov[n_ov++] = *(unsigned int *) arg; break; case FFI_TYPE_POINTER: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = (unsigned long)*(unsigned char **) arg; else p_ov[n_ov++] = (unsigned long)*(unsigned char **) arg; break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #ifdef __s390x__ if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(unsigned long *) arg; else p_ov[n_ov++] = *(unsigned long *) arg; #else if (n_gpr == MAX_GPRARGS-1) n_gpr = MAX_GPRARGS; if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = ((unsigned long *) arg)[0], p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; else p_ov[n_ov++] = ((unsigned long *) arg)[0], p_ov[n_ov++] = ((unsigned long *) arg)[1]; #endif break; case FFI_TYPE_UINT32: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(unsigned int *) arg; else p_ov[n_ov++] = *(unsigned int *) arg; break; case FFI_TYPE_INT: case FFI_TYPE_SINT32: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(signed int *) arg; else p_ov[n_ov++] = *(signed int *) arg; break; case FFI_TYPE_UINT16: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(unsigned short *) arg; else p_ov[n_ov++] = *(unsigned short *) arg; break; case FFI_TYPE_SINT16: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(signed short *) arg; else p_ov[n_ov++] = *(signed short *) arg; break; case FFI_TYPE_UINT8: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(unsigned char *) arg; else p_ov[n_ov++] = *(unsigned char *) arg; break; case FFI_TYPE_SINT8: if (n_gpr < MAX_GPRARGS) p_gpr[n_gpr++] = *(signed char *) arg; else p_ov[n_ov++] = *(signed char *) arg; break; default: FFI_ASSERT (0); break; } } } /*======================== End of Routine ============================*/ /*====================================================================*/ /* */ /* Name - ffi_prep_cif_machdep. */ /* */ /* Function - Perform machine dependent CIF processing. */ /* */ /*====================================================================*/ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { size_t struct_size = 0; int n_gpr = 0; int n_fpr = 0; int n_ov = 0; ffi_type **ptr; int i; /* Determine return value handling. */ switch (cif->rtype->type) { /* Void is easy. */ case FFI_TYPE_VOID: cif->flags = FFI390_RET_VOID; break; /* Structures are returned via a hidden pointer. */ case FFI_TYPE_STRUCT: cif->flags = FFI390_RET_STRUCT; n_gpr++; /* We need one GPR to pass the pointer. */ break; /* Floating point values are returned in fpr 0. */ case FFI_TYPE_FLOAT: cif->flags = FFI390_RET_FLOAT; break; case FFI_TYPE_DOUBLE: cif->flags = FFI390_RET_DOUBLE; break; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: cif->flags = FFI390_RET_STRUCT; n_gpr++; break; #endif /* Integer values are returned in gpr 2 (and gpr 3 for 64-bit values on 31-bit machines). */ case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: cif->flags = FFI390_RET_INT64; break; case FFI_TYPE_POINTER: case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: /* These are to be extended to word size. */ #ifdef __s390x__ cif->flags = FFI390_RET_INT64; #else cif->flags = FFI390_RET_INT32; #endif break; default: FFI_ASSERT (0); break; } /* Now for the arguments. */ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { int type = (*ptr)->type; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE /* 16-byte long double is passed like a struct. */ if (type == FFI_TYPE_LONGDOUBLE) type = FFI_TYPE_STRUCT; #endif /* Check how a structure type is passed. */ if (type == FFI_TYPE_STRUCT) { type = ffi_check_struct_type (*ptr); /* If we pass the struct via pointer, we must reserve space to copy its data for proper call-by-value semantics. */ if (type == FFI_TYPE_POINTER) struct_size += ROUND_SIZE ((*ptr)->size); } /* Now handle all primitive int/float data types. */ switch (type) { /* The first MAX_FPRARGS floating point arguments go in FPRs, the rest overflow to the stack. */ case FFI_TYPE_DOUBLE: if (n_fpr < MAX_FPRARGS) n_fpr++; else n_ov += sizeof (double) / sizeof (long); break; case FFI_TYPE_FLOAT: if (n_fpr < MAX_FPRARGS) n_fpr++; else n_ov++; break; /* On 31-bit machines, 64-bit integers are passed in GPR pairs, if one is still available, or else on the stack. If only one register is free, skip the register (it won't be used for any subsequent argument either). */ #ifndef __s390x__ case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: if (n_gpr == MAX_GPRARGS-1) n_gpr = MAX_GPRARGS; if (n_gpr < MAX_GPRARGS) n_gpr += 2; else n_ov += 2; break; #endif /* Everything else is passed in GPRs (until MAX_GPRARGS have been used) or overflows to the stack. */ default: if (n_gpr < MAX_GPRARGS) n_gpr++; else n_ov++; break; } } /* Total stack space as required for overflow arguments and temporary structure copies. */ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; return FFI_OK; } /*======================== End of Routine ============================*/ /*====================================================================*/ /* */ /* Name - ffi_call. */ /* */ /* Function - Call the FFI routine. */ /* */ /*====================================================================*/ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { int ret_type = cif->flags; extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; ecif.rvalue = rvalue; /* If we don't have a return value, we need to fake one. */ if (rvalue == NULL) { if (ret_type == FFI390_RET_STRUCT) ecif.rvalue = alloca (cif->rtype->size); else ret_type = FFI390_RET_VOID; } switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); break; default: FFI_ASSERT (0); break; } } /*======================== End of Routine ============================*/ /*====================================================================*/ /* */ /* Name - ffi_closure_helper_SYSV. */ /* */ /* Function - Call a FFI closure target function. */ /* */ /*====================================================================*/ void ffi_closure_helper_SYSV (ffi_closure *closure, unsigned long *p_gpr, unsigned long long *p_fpr, unsigned long *p_ov) { unsigned long long ret_buffer; void *rvalue = &ret_buffer; void **avalue; void **p_arg; int n_gpr = 0; int n_fpr = 0; int n_ov = 0; ffi_type **ptr; int i; /* Allocate buffer for argument list pointers. */ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); /* If we returning a structure, pass the structure address directly to the target function. Otherwise, have the target function store the return value to the GPR save area. */ if (closure->cif->flags == FFI390_RET_STRUCT) rvalue = (void *) p_gpr[n_gpr++]; /* Now for the arguments. */ for (ptr = closure->cif->arg_types, i = closure->cif->nargs; i > 0; i--, p_arg++, ptr++) { int deref_struct_pointer = 0; int type = (*ptr)->type; #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE /* 16-byte long double is passed like a struct. */ if (type == FFI_TYPE_LONGDOUBLE) type = FFI_TYPE_STRUCT; #endif /* Check how a structure type is passed. */ if (type == FFI_TYPE_STRUCT) { type = ffi_check_struct_type (*ptr); /* If we pass the struct via pointer, remember to retrieve the pointer later. */ if (type == FFI_TYPE_POINTER) deref_struct_pointer = 1; } /* Pointers are passed like UINTs of the same size. */ if (type == FFI_TYPE_POINTER) #ifdef __s390x__ type = FFI_TYPE_UINT64; #else type = FFI_TYPE_UINT32; #endif /* Now handle all primitive int/float data types. */ switch (type) { case FFI_TYPE_DOUBLE: if (n_fpr < MAX_FPRARGS) *p_arg = &p_fpr[n_fpr++]; else *p_arg = &p_ov[n_ov], n_ov += sizeof (double) / sizeof (long); break; case FFI_TYPE_FLOAT: if (n_fpr < MAX_FPRARGS) *p_arg = &p_fpr[n_fpr++]; else *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #ifdef __s390x__ if (n_gpr < MAX_GPRARGS) *p_arg = &p_gpr[n_gpr++]; else *p_arg = &p_ov[n_ov++]; #else if (n_gpr == MAX_GPRARGS-1) n_gpr = MAX_GPRARGS; if (n_gpr < MAX_GPRARGS) *p_arg = &p_gpr[n_gpr], n_gpr += 2; else *p_arg = &p_ov[n_ov], n_ov += 2; #endif break; case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: if (n_gpr < MAX_GPRARGS) *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; else *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; break; case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: if (n_gpr < MAX_GPRARGS) *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; else *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; break; case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: if (n_gpr < MAX_GPRARGS) *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; else *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; break; default: FFI_ASSERT (0); break; } /* If this is a struct passed via pointer, we need to actually retrieve that pointer. */ if (deref_struct_pointer) *p_arg = *(void **)*p_arg; } /* Call the target function. */ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); /* Convert the return value. */ switch (closure->cif->rtype->type) { /* Void is easy, and so is struct. */ case FFI_TYPE_VOID: case FFI_TYPE_STRUCT: #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: #endif break; /* Floating point values are returned in fpr 0. */ case FFI_TYPE_FLOAT: p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; break; case FFI_TYPE_DOUBLE: p_fpr[0] = *(unsigned long long *) rvalue; break; /* Integer values are returned in gpr 2 (and gpr 3 for 64-bit values on 31-bit machines). */ case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: #ifdef __s390x__ p_gpr[0] = *(unsigned long *) rvalue; #else p_gpr[0] = ((unsigned long *) rvalue)[0], p_gpr[1] = ((unsigned long *) rvalue)[1]; #endif break; case FFI_TYPE_POINTER: case FFI_TYPE_UINT32: case FFI_TYPE_UINT16: case FFI_TYPE_UINT8: p_gpr[0] = *(unsigned long *) rvalue; break; case FFI_TYPE_INT: case FFI_TYPE_SINT32: case FFI_TYPE_SINT16: case FFI_TYPE_SINT8: p_gpr[0] = *(signed long *) rvalue; break; default: FFI_ASSERT (0); break; } } /*======================== End of Routine ============================*/ /*====================================================================*/ /* */ /* Name - ffi_prep_closure_loc. */ /* */ /* Function - Prepare a FFI closure. */ /* */ /*====================================================================*/ ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, void (*fun) (ffi_cif *, void *, void **, void *), void *user_data, void *codeloc) { if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; #ifndef __s390x__ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ *(short *)&closure->tramp [4] = 0x1006; *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ *(long *)&closure->tramp [8] = (long)codeloc; *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; #else *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ *(short *)&closure->tramp [4] = 0x100e; *(short *)&closure->tramp [6] = 0x0004; *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ *(long *)&closure->tramp[16] = (long)codeloc; *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; #endif closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } /*======================== End of Routine ============================*/ polyml-5.6/libffi/src/s390/ffitarget.h000066400000000000000000000041371265146633400175630ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for S390. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #if defined (__s390x__) #ifndef S390X #define S390X #endif #endif /* ---- System specific configurations ----------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #ifdef S390X #define FFI_TRAMPOLINE_SIZE 32 #else #define FFI_TRAMPOLINE_SIZE 16 #endif #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/s390/sysv.S000066400000000000000000000250411265146633400165640ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2000 Software AG Copyright (c) 2008 Red Hat, Inc. S390 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifndef __s390x__ .text # r2: cif->bytes # r3: &ecif # r4: ffi_prep_args # r5: ret_type # r6: ecif.rvalue # ov: fn # This assumes we are using gas. .globl ffi_call_SYSV .type ffi_call_SYSV,%function ffi_call_SYSV: .LFB1: stm %r6,%r15,24(%r15) # Save registers .LCFI0: basr %r13,0 # Set up base register .Lbase: lr %r11,%r15 # Set up frame pointer .LCFI1: sr %r15,%r2 ahi %r15,-96-48 # Allocate stack lr %r8,%r6 # Save ecif.rvalue sr %r9,%r9 ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address l %r7,96(%r11) # Load function address st %r11,0(%r15) # Set up back chain ahi %r11,-48 # Register save area .LCFI2: la %r2,96(%r15) # Save area # r3 already holds &ecif basr %r14,%r4 # Call ffi_prep_args lm %r2,%r6,0(%r11) # Load arguments ld %f0,32(%r11) ld %f2,40(%r11) la %r14,0(%r13,%r9) # Set return address br %r7 # ... and call function .LretNone: # Return void l %r4,48+56(%r11) lm %r6,%r15,48+24(%r11) br %r4 .LretFloat: l %r4,48+56(%r11) ste %f0,0(%r8) # Return float lm %r6,%r15,48+24(%r11) br %r4 .LretDouble: l %r4,48+56(%r11) std %f0,0(%r8) # Return double lm %r6,%r15,48+24(%r11) br %r4 .LretInt32: l %r4,48+56(%r11) st %r2,0(%r8) # Return int lm %r6,%r15,48+24(%r11) br %r4 .LretInt64: l %r4,48+56(%r11) stm %r2,%r3,0(%r8) # Return long long lm %r6,%r15,48+24(%r11) br %r4 .Ltable: .byte .LretNone-.Lbase # FFI390_RET_VOID .byte .LretNone-.Lbase # FFI390_RET_STRUCT .byte .LretFloat-.Lbase # FFI390_RET_FLOAT .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE .byte .LretInt32-.Lbase # FFI390_RET_INT32 .byte .LretInt64-.Lbase # FFI390_RET_INT64 .LFE1: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV .globl ffi_closure_SYSV .type ffi_closure_SYSV,%function ffi_closure_SYSV: .LFB2: stm %r12,%r15,48(%r15) # Save registers .LCFI10: basr %r13,0 # Set up base register .Lcbase: stm %r2,%r6,8(%r15) # Save arguments std %f0,64(%r15) std %f2,72(%r15) lr %r1,%r15 # Set up stack frame ahi %r15,-96 .LCFI11: l %r12,.Lchelper-.Lcbase(%r13) # Get helper function lr %r2,%r0 # Closure la %r3,8(%r1) # GPRs la %r4,64(%r1) # FPRs la %r5,96(%r1) # Overflow st %r1,0(%r15) # Set up back chain bas %r14,0(%r12,%r13) # Call helper l %r4,96+56(%r15) ld %f0,96+64(%r15) # Load return registers lm %r2,%r3,96+8(%r15) lm %r12,%r15,96+48(%r15) br %r4 .align 4 .Lchelper: .long ffi_closure_helper_SYSV-.Lcbase .LFE2: .ffi_closure_SYSV_end: .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .uleb128 0x1 # CIE Code Alignment Factor .sleb128 -4 # CIE Data Alignment Factor .byte 0xe # CIE RA Column .uleb128 0x1 # Augmentation size .byte 0x1b # FDE Encoding (pcrel sdata4) .byte 0xc # DW_CFA_def_cfa .uleb128 0xf .uleb128 0x60 .align 4 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: .4byte .LASFDE1-.Lframe1 # FDE CIE offset .4byte .LFB1-. # FDE initial location .4byte .LFE1-.LFB1 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI0-.LFB1 .byte 0x8f # DW_CFA_offset, column 0xf .uleb128 0x9 .byte 0x8e # DW_CFA_offset, column 0xe .uleb128 0xa .byte 0x8d # DW_CFA_offset, column 0xd .uleb128 0xb .byte 0x8c # DW_CFA_offset, column 0xc .uleb128 0xc .byte 0x8b # DW_CFA_offset, column 0xb .uleb128 0xd .byte 0x8a # DW_CFA_offset, column 0xa .uleb128 0xe .byte 0x89 # DW_CFA_offset, column 0x9 .uleb128 0xf .byte 0x88 # DW_CFA_offset, column 0x8 .uleb128 0x10 .byte 0x87 # DW_CFA_offset, column 0x7 .uleb128 0x11 .byte 0x86 # DW_CFA_offset, column 0x6 .uleb128 0x12 .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI1-.LCFI0 .byte 0xd # DW_CFA_def_cfa_register .uleb128 0xb .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI2-.LCFI1 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0x90 .align 4 .LEFDE1: .LSFDE2: .4byte .LEFDE2-.LASFDE2 # FDE Length .LASFDE2: .4byte .LASFDE2-.Lframe1 # FDE CIE offset .4byte .LFB2-. # FDE initial location .4byte .LFE2-.LFB2 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI10-.LFB2 .byte 0x8f # DW_CFA_offset, column 0xf .uleb128 0x9 .byte 0x8e # DW_CFA_offset, column 0xe .uleb128 0xa .byte 0x8d # DW_CFA_offset, column 0xd .uleb128 0xb .byte 0x8c # DW_CFA_offset, column 0xc .uleb128 0xc .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI11-.LCFI10 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0xc0 .align 4 .LEFDE2: #else .text # r2: cif->bytes # r3: &ecif # r4: ffi_prep_args # r5: ret_type # r6: ecif.rvalue # ov: fn # This assumes we are using gas. .globl ffi_call_SYSV .type ffi_call_SYSV,%function ffi_call_SYSV: .LFB1: stmg %r6,%r15,48(%r15) # Save registers .LCFI0: larl %r13,.Lbase # Set up base register lgr %r11,%r15 # Set up frame pointer .LCFI1: sgr %r15,%r2 aghi %r15,-160-80 # Allocate stack lgr %r8,%r6 # Save ecif.rvalue llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address lg %r7,160(%r11) # Load function address stg %r11,0(%r15) # Set up back chain aghi %r11,-80 # Register save area .LCFI2: la %r2,160(%r15) # Save area # r3 already holds &ecif basr %r14,%r4 # Call ffi_prep_args lmg %r2,%r6,0(%r11) # Load arguments ld %f0,48(%r11) ld %f2,56(%r11) ld %f4,64(%r11) ld %f6,72(%r11) la %r14,0(%r13,%r9) # Set return address br %r7 # ... and call function .Lbase: .LretNone: # Return void lg %r4,80+112(%r11) lmg %r6,%r15,80+48(%r11) br %r4 .LretFloat: lg %r4,80+112(%r11) ste %f0,0(%r8) # Return float lmg %r6,%r15,80+48(%r11) br %r4 .LretDouble: lg %r4,80+112(%r11) std %f0,0(%r8) # Return double lmg %r6,%r15,80+48(%r11) br %r4 .LretInt32: lg %r4,80+112(%r11) st %r2,0(%r8) # Return int lmg %r6,%r15,80+48(%r11) br %r4 .LretInt64: lg %r4,80+112(%r11) stg %r2,0(%r8) # Return long lmg %r6,%r15,80+48(%r11) br %r4 .Ltable: .byte .LretNone-.Lbase # FFI390_RET_VOID .byte .LretNone-.Lbase # FFI390_RET_STRUCT .byte .LretFloat-.Lbase # FFI390_RET_FLOAT .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE .byte .LretInt32-.Lbase # FFI390_RET_INT32 .byte .LretInt64-.Lbase # FFI390_RET_INT64 .LFE1: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV .globl ffi_closure_SYSV .type ffi_closure_SYSV,%function ffi_closure_SYSV: .LFB2: stmg %r14,%r15,112(%r15) # Save registers .LCFI10: stmg %r2,%r6,16(%r15) # Save arguments std %f0,128(%r15) std %f2,136(%r15) std %f4,144(%r15) std %f6,152(%r15) lgr %r1,%r15 # Set up stack frame aghi %r15,-160 .LCFI11: lgr %r2,%r0 # Closure la %r3,16(%r1) # GPRs la %r4,128(%r1) # FPRs la %r5,160(%r1) # Overflow stg %r1,0(%r15) # Set up back chain brasl %r14,ffi_closure_helper_SYSV # Call helper lg %r14,160+112(%r15) ld %f0,160+128(%r15) # Load return registers lg %r2,160+16(%r15) la %r15,160(%r15) br %r14 .LFE2: .ffi_closure_SYSV_end: .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry .LSCIE1: .4byte 0x0 # CIE Identifier Tag .byte 0x1 # CIE Version .ascii "zR\0" # CIE Augmentation .uleb128 0x1 # CIE Code Alignment Factor .sleb128 -8 # CIE Data Alignment Factor .byte 0xe # CIE RA Column .uleb128 0x1 # Augmentation size .byte 0x1b # FDE Encoding (pcrel sdata4) .byte 0xc # DW_CFA_def_cfa .uleb128 0xf .uleb128 0xa0 .align 8 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 # FDE Length .LASFDE1: .4byte .LASFDE1-.Lframe1 # FDE CIE offset .4byte .LFB1-. # FDE initial location .4byte .LFE1-.LFB1 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI0-.LFB1 .byte 0x8f # DW_CFA_offset, column 0xf .uleb128 0x5 .byte 0x8e # DW_CFA_offset, column 0xe .uleb128 0x6 .byte 0x8d # DW_CFA_offset, column 0xd .uleb128 0x7 .byte 0x8c # DW_CFA_offset, column 0xc .uleb128 0x8 .byte 0x8b # DW_CFA_offset, column 0xb .uleb128 0x9 .byte 0x8a # DW_CFA_offset, column 0xa .uleb128 0xa .byte 0x89 # DW_CFA_offset, column 0x9 .uleb128 0xb .byte 0x88 # DW_CFA_offset, column 0x8 .uleb128 0xc .byte 0x87 # DW_CFA_offset, column 0x7 .uleb128 0xd .byte 0x86 # DW_CFA_offset, column 0x6 .uleb128 0xe .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI1-.LCFI0 .byte 0xd # DW_CFA_def_cfa_register .uleb128 0xb .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI2-.LCFI1 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0xf0 .align 8 .LEFDE1: .LSFDE2: .4byte .LEFDE2-.LASFDE2 # FDE Length .LASFDE2: .4byte .LASFDE2-.Lframe1 # FDE CIE offset .4byte .LFB2-. # FDE initial location .4byte .LFE2-.LFB2 # FDE address range .uleb128 0x0 # Augmentation size .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI10-.LFB2 .byte 0x8f # DW_CFA_offset, column 0xf .uleb128 0x5 .byte 0x8e # DW_CFA_offset, column 0xe .uleb128 0x6 .byte 0x4 # DW_CFA_advance_loc4 .4byte .LCFI11-.LCFI10 .byte 0xe # DW_CFA_def_cfa_offset .uleb128 0x140 .align 8 .LEFDE2: #endif #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/sh/000077500000000000000000000000001265146633400153465ustar00rootroot00000000000000polyml-5.6/libffi/src/sh/ffi.c000066400000000000000000000356071265146633400162710ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2002-2008, 2012 Kaz Kojima Copyright (c) 2008 Red Hat, Inc. SuperH Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #define NGREGARG 4 #if defined(__SH4__) #define NFREGARG 8 #endif #if defined(__HITACHI__) #define STRUCT_VALUE_ADDRESS_WITH_ARG 1 #else #define STRUCT_VALUE_ADDRESS_WITH_ARG 0 #endif /* If the structure has essentialy an unique element, return its type. */ static int simple_type (ffi_type *arg) { if (arg->type != FFI_TYPE_STRUCT) return arg->type; else if (arg->elements[1]) return FFI_TYPE_STRUCT; return simple_type (arg->elements[0]); } static int return_type (ffi_type *arg) { unsigned short type; if (arg->type != FFI_TYPE_STRUCT) return arg->type; type = simple_type (arg->elements[0]); if (! arg->elements[1]) { switch (type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: return FFI_TYPE_INT; default: return type; } } /* gcc uses r0/r1 pair for some kind of structures. */ if (arg->size <= 2 * sizeof (int)) { int i = 0; ffi_type *e; while ((e = arg->elements[i++])) { type = simple_type (e); switch (type) { case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: case FFI_TYPE_INT: case FFI_TYPE_FLOAT: return FFI_TYPE_UINT64; default: break; } } } return FFI_TYPE_STRUCT; } /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register int tmp; register unsigned int avn; register void **p_argv; register char *argp; register ffi_type **p_arg; int greg, ireg; #if defined(__SH4__) int freg = 0; #endif tmp = 0; argp = stack; if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) { *(void **) argp = ecif->rvalue; argp += 4; ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; } else ireg = 0; /* Set arguments for registers. */ greg = ireg; avn = ecif->cif->nargs; p_argv = ecif->avalue; for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) { size_t z; z = (*p_arg)->size; if (z < sizeof(int)) { if (greg++ >= NGREGARG) continue; z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; case FFI_TYPE_STRUCT: *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); break; default: FFI_ASSERT(0); } argp += z; } else if (z == sizeof(int)) { #if defined(__SH4__) if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (freg++ >= NFREGARG) continue; } else #endif { if (greg++ >= NGREGARG) continue; } *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); argp += z; } #if defined(__SH4__) else if ((*p_arg)->type == FFI_TYPE_DOUBLE) { if (freg + 1 >= NFREGARG) continue; freg = (freg + 1) & ~1; freg += 2; memcpy (argp, *p_argv, z); argp += z; } #endif else { int n = (z + sizeof (int) - 1) / sizeof (int); #if defined(__SH4__) if (greg + n - 1 >= NGREGARG) continue; #else if (greg >= NGREGARG) continue; #endif greg += n; memcpy (argp, *p_argv, z); argp += n * sizeof (int); } } /* Set arguments on stack. */ greg = ireg; #if defined(__SH4__) freg = 0; #endif p_argv = ecif->avalue; for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) { size_t z; z = (*p_arg)->size; if (z < sizeof(int)) { if (greg++ < NGREGARG) continue; z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); break; case FFI_TYPE_STRUCT: *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); break; default: FFI_ASSERT(0); } argp += z; } else if (z == sizeof(int)) { #if defined(__SH4__) if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (freg++ < NFREGARG) continue; } else #endif { if (greg++ < NGREGARG) continue; } *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); argp += z; } #if defined(__SH4__) else if ((*p_arg)->type == FFI_TYPE_DOUBLE) { if (freg + 1 < NFREGARG) { freg = (freg + 1) & ~1; freg += 2; continue; } memcpy (argp, *p_argv, z); argp += z; } #endif else { int n = (z + sizeof (int) - 1) / sizeof (int); if (greg + n - 1 < NGREGARG) { greg += n; continue; } #if (! defined(__SH4__)) else if (greg < NGREGARG) { greg = NGREGARG; continue; } #endif memcpy (argp, *p_argv, z); argp += n * sizeof (int); } } return; } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { int i, j; int size, type; int n, m; int greg; #if defined(__SH4__) int freg = 0; #endif cif->flags = 0; greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; #if defined(__SH4__) for (i = j = 0; i < cif->nargs && j < 12; i++) { type = (cif->arg_types)[i]->type; switch (type) { case FFI_TYPE_FLOAT: if (freg >= NFREGARG) continue; freg++; cif->flags += ((cif->arg_types)[i]->type) << (2 * j); j++; break; case FFI_TYPE_DOUBLE: if ((freg + 1) >= NFREGARG) continue; freg = (freg + 1) & ~1; freg += 2; cif->flags += ((cif->arg_types)[i]->type) << (2 * j); j++; break; default: size = (cif->arg_types)[i]->size; n = (size + sizeof (int) - 1) / sizeof (int); if (greg + n - 1 >= NGREGARG) continue; greg += n; for (m = 0; m < n; m++) cif->flags += FFI_TYPE_INT << (2 * j++); break; } } #else for (i = j = 0; i < cif->nargs && j < 4; i++) { size = (cif->arg_types)[i]->size; n = (size + sizeof (int) - 1) / sizeof (int); if (greg >= NGREGARG) continue; else if (greg + n - 1 >= NGREGARG) n = NGREGARG - greg; greg += n; for (m = 0; m < n; m++) cif->flags += FFI_TYPE_INT << (2 * j++); } #endif /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_STRUCT: cif->flags += (unsigned) (return_type (cif->rtype)) << 24; break; case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags += (unsigned) cif->rtype->type << 24; break; default: cif->flags += FFI_TYPE_INT << 24; break; } return FFI_OK; } extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; UINT64 trvalue; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if (cif->rtype->type == FFI_TYPE_STRUCT && return_type (cif->rtype) != FFI_TYPE_STRUCT) ecif.rvalue = &trvalue; else if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } if (rvalue && cif->rtype->type == FFI_TYPE_STRUCT && return_type (cif->rtype) != FFI_TYPE_STRUCT) memcpy (rvalue, &trvalue, cif->rtype->size); } extern void ffi_closure_SYSV (void); #if defined(__SH4__) extern void __ic_invalidate (void *line); #endif ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp; unsigned int insn; if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; tramp = (unsigned int *) &closure->tramp[0]; /* Set T bit if the function returns a struct pointed with R2. */ insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 0x0018 /* sett */ : 0x0008 /* clrt */); #ifdef __LITTLE_ENDIAN__ tramp[0] = 0xd301d102; tramp[1] = 0x0000412b | (insn << 16); #else tramp[0] = 0xd102d301; tramp[1] = 0x412b0000 | insn; #endif *(void **) &tramp[2] = (void *)codeloc; /* ctx */ *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ closure->cif = cif; closure->fun = fun; closure->user_data = user_data; #if defined(__SH4__) /* Flush the icache. */ __ic_invalidate(codeloc); #endif return FFI_OK; } /* Basically the trampoline invokes ffi_closure_SYSV, and on * entry, r3 holds the address of the closure. * After storing the registers that could possibly contain * parameters to be passed into the stack frame and setting * up space for a return value, ffi_closure_SYSV invokes the * following helper function to do most of the work. */ #ifdef __LITTLE_ENDIAN__ #define OFS_INT8 0 #define OFS_INT16 0 #else #define OFS_INT8 3 #define OFS_INT16 2 #endif int ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, unsigned long *pgr, unsigned long *pfr, unsigned long *pst) { void **avalue; ffi_type **p_arg; int i, avn; int ireg, greg = 0; #if defined(__SH4__) int freg = 0; #endif ffi_cif *cif; cif = closure->cif; avalue = alloca(cif->nargs * sizeof(void *)); /* Copy the caller's structure return value address so that the closure returns the data directly to the caller. */ if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG) { rvalue = (void *) *pgr++; ireg = 1; } else ireg = 0; cif = closure->cif; greg = ireg; avn = cif->nargs; /* Grab the addresses of the arguments from the stack frame. */ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) { size_t z; z = (*p_arg)->size; if (z < sizeof(int)) { if (greg++ >= NGREGARG) continue; z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = (((char *)pgr) + OFS_INT8); break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = (((char *)pgr) + OFS_INT16); break; case FFI_TYPE_STRUCT: avalue[i] = pgr; break; default: FFI_ASSERT(0); } pgr++; } else if (z == sizeof(int)) { #if defined(__SH4__) if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (freg++ >= NFREGARG) continue; avalue[i] = pfr; pfr++; } else #endif { if (greg++ >= NGREGARG) continue; avalue[i] = pgr; pgr++; } } #if defined(__SH4__) else if ((*p_arg)->type == FFI_TYPE_DOUBLE) { if (freg + 1 >= NFREGARG) continue; if (freg & 1) pfr++; freg = (freg + 1) & ~1; freg += 2; avalue[i] = pfr; pfr += 2; } #endif else { int n = (z + sizeof (int) - 1) / sizeof (int); #if defined(__SH4__) if (greg + n - 1 >= NGREGARG) continue; #else if (greg >= NGREGARG) continue; #endif greg += n; avalue[i] = pgr; pgr += n; } } greg = ireg; #if defined(__SH4__) freg = 0; #endif for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) { size_t z; z = (*p_arg)->size; if (z < sizeof(int)) { if (greg++ < NGREGARG) continue; z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: avalue[i] = (((char *)pst) + OFS_INT8); break; case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: avalue[i] = (((char *)pst) + OFS_INT16); break; case FFI_TYPE_STRUCT: avalue[i] = pst; break; default: FFI_ASSERT(0); } pst++; } else if (z == sizeof(int)) { #if defined(__SH4__) if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (freg++ < NFREGARG) continue; } else #endif { if (greg++ < NGREGARG) continue; } avalue[i] = pst; pst++; } #if defined(__SH4__) else if ((*p_arg)->type == FFI_TYPE_DOUBLE) { if (freg + 1 < NFREGARG) { freg = (freg + 1) & ~1; freg += 2; continue; } avalue[i] = pst; pst += 2; } #endif else { int n = (z + sizeof (int) - 1) / sizeof (int); if (greg + n - 1 < NGREGARG) { greg += n; continue; } #if (! defined(__SH4__)) else if (greg < NGREGARG) { greg += n; pst += greg - NGREGARG; continue; } #endif avalue[i] = pst; pst += n; } } (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_SYSV how to perform return type promotions. */ return return_type (cif->rtype); } polyml-5.6/libffi/src/sh/ffitarget.h000066400000000000000000000036241265146633400174770ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for SuperH. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- Generic type definitions ----------------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 16 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/sh/sysv.S000066400000000000000000000345371265146633400165120ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima SuperH Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_MACHINE_ASM_H #include #else /* XXX these lose for some platforms, I'm sure. */ #define CNAME(x) x #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): #endif #if defined(__HITACHI__) #define STRUCT_VALUE_ADDRESS_WITH_ARG 1 #else #define STRUCT_VALUE_ADDRESS_WITH_ARG 0 #endif .text # r4: ffi_prep_args # r5: &ecif # r6: bytes # r7: flags # sp+0: rvalue # sp+4: fn # This assumes we are using gas. ENTRY(ffi_call_SYSV) # Save registers .LFB1: mov.l r8,@-r15 .LCFI0: mov.l r9,@-r15 .LCFI1: mov.l r10,@-r15 .LCFI2: mov.l r12,@-r15 .LCFI3: mov.l r14,@-r15 .LCFI4: sts.l pr,@-r15 .LCFI5: mov r15,r14 .LCFI6: #if defined(__SH4__) mov r6,r8 mov r7,r9 sub r6,r15 add #-16,r15 mov #~7,r0 and r0,r15 mov r4,r0 jsr @r0 mov r15,r4 mov r9,r1 shlr8 r9 shlr8 r9 shlr8 r9 mov #FFI_TYPE_STRUCT,r2 cmp/eq r2,r9 bf 1f #if STRUCT_VALUE_ADDRESS_WITH_ARG mov.l @r15+,r4 bra 2f mov #5,r2 #else mov.l @r15+,r10 #endif 1: mov #4,r2 2: mov #4,r3 L_pass: cmp/pl r8 bf L_call_it mov r1,r0 and #3,r0 L_pass_d: cmp/eq #FFI_TYPE_DOUBLE,r0 bf L_pass_f mov r3,r0 and #1,r0 tst r0,r0 bt 1f add #1,r3 1: mov #12,r0 cmp/hs r0,r3 bt/s 3f shlr2 r1 bsr L_pop_d nop 3: add #2,r3 bra L_pass add #-8,r8 L_pop_d: mov r3,r0 add r0,r0 add r3,r0 add #-12,r0 braf r0 nop #ifdef __LITTLE_ENDIAN__ fmov.s @r15+,fr5 rts fmov.s @r15+,fr4 fmov.s @r15+,fr7 rts fmov.s @r15+,fr6 fmov.s @r15+,fr9 rts fmov.s @r15+,fr8 fmov.s @r15+,fr11 rts fmov.s @r15+,fr10 #else fmov.s @r15+,fr4 rts fmov.s @r15+,fr5 fmov.s @r15+,fr6 rts fmov.s @r15+,fr7 fmov.s @r15+,fr8 rts fmov.s @r15+,fr9 fmov.s @r15+,fr10 rts fmov.s @r15+,fr11 #endif L_pass_f: cmp/eq #FFI_TYPE_FLOAT,r0 bf L_pass_i mov #12,r0 cmp/hs r0,r3 bt/s 2f shlr2 r1 bsr L_pop_f nop 2: add #1,r3 bra L_pass add #-4,r8 L_pop_f: mov r3,r0 shll2 r0 add #-16,r0 braf r0 nop #ifdef __LITTLE_ENDIAN__ rts fmov.s @r15+,fr5 rts fmov.s @r15+,fr4 rts fmov.s @r15+,fr7 rts fmov.s @r15+,fr6 rts fmov.s @r15+,fr9 rts fmov.s @r15+,fr8 rts fmov.s @r15+,fr11 rts fmov.s @r15+,fr10 #else rts fmov.s @r15+,fr4 rts fmov.s @r15+,fr5 rts fmov.s @r15+,fr6 rts fmov.s @r15+,fr7 rts fmov.s @r15+,fr8 rts fmov.s @r15+,fr9 rts fmov.s @r15+,fr10 rts fmov.s @r15+,fr11 #endif L_pass_i: cmp/eq #FFI_TYPE_INT,r0 bf L_call_it mov #8,r0 cmp/hs r0,r2 bt/s 2f shlr2 r1 bsr L_pop_i nop 2: add #1,r2 bra L_pass add #-4,r8 L_pop_i: mov r2,r0 shll2 r0 add #-16,r0 braf r0 nop rts mov.l @r15+,r4 rts mov.l @r15+,r5 rts mov.l @r15+,r6 rts mov.l @r15+,r7 L_call_it: # call function #if (! STRUCT_VALUE_ADDRESS_WITH_ARG) mov r10, r2 #endif mov.l @(28,r14),r1 jsr @r1 nop L_ret_d: mov #FFI_TYPE_DOUBLE,r2 cmp/eq r2,r9 bf L_ret_ll mov.l @(24,r14),r1 #ifdef __LITTLE_ENDIAN__ fmov.s fr1,@r1 add #4,r1 bra L_epilogue fmov.s fr0,@r1 #else fmov.s fr0,@r1 add #4,r1 bra L_epilogue fmov.s fr1,@r1 #endif L_ret_ll: mov #FFI_TYPE_SINT64,r2 cmp/eq r2,r9 bt/s 1f mov #FFI_TYPE_UINT64,r2 cmp/eq r2,r9 bf L_ret_f 1: mov.l @(24,r14),r2 mov.l r0,@r2 bra L_epilogue mov.l r1,@(4,r2) L_ret_f: mov #FFI_TYPE_FLOAT,r2 cmp/eq r2,r9 bf L_ret_i mov.l @(24,r14),r1 bra L_epilogue fmov.s fr0,@r1 L_ret_i: mov #FFI_TYPE_INT,r2 cmp/eq r2,r9 bf L_epilogue mov.l @(24,r14),r1 bra L_epilogue mov.l r0,@r1 L_epilogue: # Remove the space we pushed for the args mov r14,r15 lds.l @r15+,pr mov.l @r15+,r14 mov.l @r15+,r12 mov.l @r15+,r10 mov.l @r15+,r9 rts mov.l @r15+,r8 #else mov r6,r8 mov r7,r9 sub r6,r15 add #-16,r15 mov #~7,r0 and r0,r15 mov r4,r0 jsr @r0 mov r15,r4 mov r9,r3 shlr8 r9 shlr8 r9 shlr8 r9 mov #FFI_TYPE_STRUCT,r2 cmp/eq r2,r9 bf 1f #if STRUCT_VALUE_ADDRESS_WITH_ARG mov.l @r15+,r4 bra 2f mov #5,r2 #else mov.l @r15+,r10 #endif 1: mov #4,r2 2: L_pass: cmp/pl r8 bf L_call_it mov r3,r0 and #3,r0 L_pass_d: cmp/eq #FFI_TYPE_DOUBLE,r0 bf L_pass_i mov r15,r0 and #7,r0 tst r0,r0 bt 1f add #4,r15 1: mov #8,r0 cmp/hs r0,r2 bt/s 2f shlr2 r3 bsr L_pop_d nop 2: add #2,r2 bra L_pass add #-8,r8 L_pop_d: mov r2,r0 add r0,r0 add r2,r0 add #-12,r0 add r0,r0 braf r0 nop mov.l @r15+,r4 rts mov.l @r15+,r5 mov.l @r15+,r5 rts mov.l @r15+,r6 mov.l @r15+,r6 rts mov.l @r15+,r7 rts mov.l @r15+,r7 L_pass_i: cmp/eq #FFI_TYPE_INT,r0 bf L_call_it mov #8,r0 cmp/hs r0,r2 bt/s 2f shlr2 r3 bsr L_pop_i nop 2: add #1,r2 bra L_pass add #-4,r8 L_pop_i: mov r2,r0 shll2 r0 add #-16,r0 braf r0 nop rts mov.l @r15+,r4 rts mov.l @r15+,r5 rts mov.l @r15+,r6 rts mov.l @r15+,r7 L_call_it: # call function #if (! STRUCT_VALUE_ADDRESS_WITH_ARG) mov r10, r2 #endif mov.l @(28,r14),r1 jsr @r1 nop L_ret_d: mov #FFI_TYPE_DOUBLE,r2 cmp/eq r2,r9 bf L_ret_ll mov.l @(24,r14),r2 mov.l r0,@r2 bra L_epilogue mov.l r1,@(4,r2) L_ret_ll: mov #FFI_TYPE_SINT64,r2 cmp/eq r2,r9 bt/s 1f mov #FFI_TYPE_UINT64,r2 cmp/eq r2,r9 bf L_ret_i 1: mov.l @(24,r14),r2 mov.l r0,@r2 bra L_epilogue mov.l r1,@(4,r2) L_ret_i: mov #FFI_TYPE_FLOAT,r2 cmp/eq r2,r9 bt 1f mov #FFI_TYPE_INT,r2 cmp/eq r2,r9 bf L_epilogue 1: mov.l @(24,r14),r1 bra L_epilogue mov.l r0,@r1 L_epilogue: # Remove the space we pushed for the args mov r14,r15 lds.l @r15+,pr mov.l @r15+,r14 mov.l @r15+,r12 mov.l @r15+,r10 mov.l @r15+,r9 rts mov.l @r15+,r8 #endif .LFE1: .ffi_call_SYSV_end: .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) .globl ffi_closure_helper_SYSV ENTRY(ffi_closure_SYSV) .LFB2: mov.l r7,@-r15 .LCFI7: mov.l r6,@-r15 .LCFI8: mov.l r5,@-r15 .LCFI9: mov.l r4,@-r15 .LCFIA: mov.l r14,@-r15 .LCFIB: sts.l pr,@-r15 /* Stack layout: xx bytes (on stack parameters) 16 bytes (register parameters) 4 bytes (saved frame pointer) 4 bytes (saved return address) 32 bytes (floating register parameters, SH-4 only) 8 bytes (result) 4 bytes (pad) 4 bytes (5th arg) <- new stack pointer */ .LCFIC: #if defined(__SH4__) add #-48,r15 #else add #-16,r15 #endif .LCFID: mov r15,r14 .LCFIE: #if defined(__SH4__) mov r14,r1 add #48,r1 #ifdef __LITTLE_ENDIAN__ fmov.s fr10,@-r1 fmov.s fr11,@-r1 fmov.s fr8,@-r1 fmov.s fr9,@-r1 fmov.s fr6,@-r1 fmov.s fr7,@-r1 fmov.s fr4,@-r1 fmov.s fr5,@-r1 #else fmov.s fr11,@-r1 fmov.s fr10,@-r1 fmov.s fr9,@-r1 fmov.s fr8,@-r1 fmov.s fr7,@-r1 fmov.s fr6,@-r1 fmov.s fr5,@-r1 fmov.s fr4,@-r1 #endif mov r1,r7 mov r14,r6 add #56,r6 #else mov r14,r6 add #24,r6 #endif bt/s 10f mov r2, r5 mov r14,r1 add #8,r1 mov r1,r5 10: mov r14,r1 #if defined(__SH4__) add #72,r1 #else add #40,r1 #endif mov.l r1,@r14 #ifdef PIC mov.l L_got,r1 mova L_got,r0 add r0,r1 mov.l L_helper,r0 add r1,r0 #else mov.l L_helper,r0 #endif jsr @r0 mov r3,r4 shll r0 mov r0,r1 mova L_table,r0 add r1,r0 mov.w @r0,r0 mov r14,r2 braf r0 add #8,r2 0: .align 2 #ifdef PIC L_got: .long _GLOBAL_OFFSET_TABLE_ L_helper: .long ffi_closure_helper_SYSV@GOTOFF #else L_helper: .long ffi_closure_helper_SYSV #endif L_table: .short L_case_v - 0b /* FFI_TYPE_VOID */ .short L_case_i - 0b /* FFI_TYPE_INT */ #if defined(__SH4__) .short L_case_f - 0b /* FFI_TYPE_FLOAT */ .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ #else .short L_case_i - 0b /* FFI_TYPE_FLOAT */ .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ #endif .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ .short L_case_q - 0b /* FFI_TYPE_SINT8 */ .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ .short L_case_h - 0b /* FFI_TYPE_SINT16 */ .short L_case_i - 0b /* FFI_TYPE_UINT32 */ .short L_case_i - 0b /* FFI_TYPE_SINT32 */ .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ .short L_case_v - 0b /* FFI_TYPE_STRUCT */ .short L_case_i - 0b /* FFI_TYPE_POINTER */ #if defined(__SH4__) L_case_d: #ifdef __LITTLE_ENDIAN__ fmov.s @r2+,fr1 bra L_case_v fmov.s @r2,fr0 #else fmov.s @r2+,fr0 bra L_case_v fmov.s @r2,fr1 #endif L_case_f: bra L_case_v fmov.s @r2,fr0 #endif L_case_ll: mov.l @r2+,r0 bra L_case_v mov.l @r2,r1 L_case_i: bra L_case_v mov.l @r2,r0 L_case_q: #ifdef __LITTLE_ENDIAN__ #else add #3,r2 #endif bra L_case_v mov.b @r2,r0 L_case_uq: #ifdef __LITTLE_ENDIAN__ #else add #3,r2 #endif mov.b @r2,r0 bra L_case_v extu.b r0,r0 L_case_h: #ifdef __LITTLE_ENDIAN__ #else add #2,r2 #endif bra L_case_v mov.w @r2,r0 L_case_uh: #ifdef __LITTLE_ENDIAN__ #else add #2,r2 #endif mov.w @r2,r0 extu.w r0,r0 /* fall through */ L_case_v: #if defined(__SH4__) add #48,r15 #else add #16,r15 #endif lds.l @r15+,pr mov.l @r15+,r14 rts add #16,r15 .LFE2: .ffi_closure_SYSV_end: .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif .section ".eh_frame","aw",@progbits __FRAME_BEGIN__: .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .4byte 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #ifdef PIC .ascii "zR\0" /* CIE Augmentation */ #else .byte 0x0 /* CIE Augmentation */ #endif .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ .byte 0x11 /* CIE RA Column */ #ifdef PIC .uleb128 0x1 /* Augmentation size */ .byte 0x10 /* FDE Encoding (pcrel) */ #endif .byte 0xc /* DW_CFA_def_cfa */ .byte 0xf /* uleb128 0xf */ .byte 0x0 /* uleb128 0x0 */ .align 2 .LECIE1: .LSFDE1: .4byte .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ #ifdef PIC .4byte .LFB1-. /* FDE initial location */ #else .4byte .LFB1 /* FDE initial location */ #endif .4byte .LFE1-.LFB1 /* FDE address range */ #ifdef PIC .uleb128 0x0 /* Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI0-.LFB1 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x4 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI1-.LCFI0 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI2-.LCFI1 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0xc /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI3-.LCFI2 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x10 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI4-.LCFI3 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x14 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI5-.LCFI4 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x18 /* uleb128 0x4 */ .byte 0x91 /* DW_CFA_offset, column 0x11 */ .byte 0x6 /* uleb128 0x6 */ .byte 0x8e /* DW_CFA_offset, column 0xe */ .byte 0x5 /* uleb128 0x5 */ .byte 0x8c /* DW_CFA_offset, column 0xc */ .byte 0x4 /* uleb128 0x4 */ .byte 0x8a /* DW_CFA_offset, column 0xa */ .byte 0x3 /* uleb128 0x3 */ .byte 0x89 /* DW_CFA_offset, column 0x9 */ .byte 0x2 /* uleb128 0x2 */ .byte 0x88 /* DW_CFA_offset, column 0x8 */ .byte 0x1 /* uleb128 0x1 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI6-.LCFI5 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0xe /* uleb128 0xe */ .align 2 .LEFDE1: .LSFDE3: .4byte .LEFDE3-.LASFDE3 /* FDE Length */ .LASFDE3: .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ #ifdef PIC .4byte .LFB2-. /* FDE initial location */ #else .4byte .LFB2 /* FDE initial location */ #endif .4byte .LFE2-.LFB2 /* FDE address range */ #ifdef PIC .uleb128 0x0 /* Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI7-.LFB2 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x4 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI8-.LCFI7 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFI9-.LCFI8 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0xc /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFIA-.LCFI9 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x10 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFIB-.LCFIA .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x14 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFIC-.LCFIB .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x18 /* uleb128 0x4 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFID-.LCFIC .byte 0xe /* DW_CFA_def_cfa_offset */ #if defined(__SH4__) .byte 24+48 /* uleb128 24+48 */ #else .byte 24+16 /* uleb128 24+16 */ #endif .byte 0x91 /* DW_CFA_offset, column 0x11 */ .byte 0x6 /* uleb128 0x6 */ .byte 0x8e /* DW_CFA_offset, column 0xe */ .byte 0x5 /* uleb128 0x5 */ .byte 0x84 /* DW_CFA_offset, column 0x4 */ .byte 0x4 /* uleb128 0x4 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x3 /* uleb128 0x3 */ .byte 0x86 /* DW_CFA_offset, column 0x6 */ .byte 0x2 /* uleb128 0x2 */ .byte 0x87 /* DW_CFA_offset, column 0x7 */ .byte 0x1 /* uleb128 0x1 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte .LCFIE-.LCFID .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0xe /* uleb128 0xe */ .align 2 .LEFDE3: polyml-5.6/libffi/src/sh64/000077500000000000000000000000001265146633400155205ustar00rootroot00000000000000polyml-5.6/libffi/src/sh64/ffi.c000066400000000000000000000260501265146633400164330ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima Copyright (c) 2008 Anthony Green SuperH SHmedia Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #define NGREGARG 8 #define NFREGARG 12 static int return_type (ffi_type *arg) { if (arg->type != FFI_TYPE_STRUCT) return arg->type; /* gcc uses r2 if the result can be packed in on register. */ if (arg->size <= sizeof (UINT8)) return FFI_TYPE_UINT8; else if (arg->size <= sizeof (UINT16)) return FFI_TYPE_UINT16; else if (arg->size <= sizeof (UINT32)) return FFI_TYPE_UINT32; else if (arg->size <= sizeof (UINT64)) return FFI_TYPE_UINT64; return FFI_TYPE_STRUCT; } /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register unsigned int avn; register void **p_argv; register char *argp; register ffi_type **p_arg; argp = stack; if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) { *(void **) argp = ecif->rvalue; argp += sizeof (UINT64); } avn = ecif->cif->nargs; p_argv = ecif->avalue; for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) { size_t z; int align; z = (*p_arg)->size; align = (*p_arg)->alignment; if (z < sizeof (UINT32)) { switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv); break; case FFI_TYPE_UINT8: *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv); break; case FFI_TYPE_SINT16: *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv); break; case FFI_TYPE_UINT16: *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv); break; case FFI_TYPE_STRUCT: memcpy (argp, *p_argv, z); break; default: FFI_ASSERT(0); } argp += sizeof (UINT64); } else if (z == sizeof (UINT32) && align == sizeof (UINT32)) { switch ((*p_arg)->type) { case FFI_TYPE_INT: case FFI_TYPE_SINT32: *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv); break; case FFI_TYPE_FLOAT: case FFI_TYPE_POINTER: case FFI_TYPE_UINT32: case FFI_TYPE_STRUCT: *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv); break; default: FFI_ASSERT(0); break; } argp += sizeof (UINT64); } else if (z == sizeof (UINT64) && align == sizeof (UINT64) && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0) { *(UINT64 *) argp = *(UINT64 *) (*p_argv); argp += sizeof (UINT64); } else { int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); memcpy (argp, *p_argv, z); argp += n * sizeof (UINT64); } } return; } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { int i, j; int size, type; int n, m; int greg; int freg; int fpair = -1; greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0); freg = 0; cif->flags2 = 0; for (i = j = 0; i < cif->nargs; i++) { type = (cif->arg_types)[i]->type; switch (type) { case FFI_TYPE_FLOAT: greg++; cif->bytes += sizeof (UINT64) - sizeof (float); if (freg >= NFREGARG - 1) continue; if (fpair < 0) { fpair = freg; freg += 2; } else fpair = -1; cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); break; case FFI_TYPE_DOUBLE: if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG) continue; if ((freg + 1) < NFREGARG) { freg += 2; cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++); } else cif->flags2 += FFI_TYPE_INT << (2 * j++); break; default: size = (cif->arg_types)[i]->size; if (size < sizeof (UINT64)) cif->bytes += sizeof (UINT64) - size; n = (size + sizeof (UINT64) - 1) / sizeof (UINT64); if (greg >= NGREGARG) continue; else if (greg + n - 1 >= NGREGARG) greg = NGREGARG; else greg += n; for (m = 0; m < n; m++) cif->flags2 += FFI_TYPE_INT << (2 * j++); break; } } /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_STRUCT: cif->flags = return_type (cif->rtype); break; case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: cif->flags = cif->rtype->type; break; default: cif->flags = FFI_TYPE_INT; break; } return FFI_OK; } /*@-declundef@*/ /*@-exportheader@*/ extern void ffi_call_SYSV(void (*)(char *, extended_cif *), /*@out@*/ extended_cif *, unsigned, unsigned, long long, /*@out@*/ unsigned *, void (*fn)(void)); /*@=declundef@*/ /*@=exportheader@*/ void ffi_call(/*@dependent@*/ ffi_cif *cif, void (*fn)(void), /*@out@*/ void *rvalue, /*@dependent@*/ void **avalue) { extended_cif ecif; UINT64 trvalue; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if (cif->rtype->type == FFI_TYPE_STRUCT && return_type (cif->rtype) != FFI_TYPE_STRUCT) ecif.rvalue = &trvalue; else if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2, ecif.rvalue, fn); break; default: FFI_ASSERT(0); break; } if (rvalue && cif->rtype->type == FFI_TYPE_STRUCT && return_type (cif->rtype) != FFI_TYPE_STRUCT) memcpy (rvalue, &trvalue, cif->rtype->size); } extern void ffi_closure_SYSV (void); extern void __ic_invalidate (void *line); ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp; if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; tramp = (unsigned int *) &closure->tramp[0]; /* Since ffi_closure is an aligned object, the ffi trampoline is called as an SHcompact code. Sigh. SHcompact part: mova @(1,pc),r0; add #1,r0; jmp @r0; nop; SHmedia part: movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0 movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */ #ifdef __LITTLE_ENDIAN__ tramp[0] = 0x7001c701; tramp[1] = 0x0009402b; #else tramp[0] = 0xc7017001; tramp[1] = 0x402b0009; #endif tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10; tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10; tramp[4] = 0x6bf10600; tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10; tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10; tramp[7] = 0x4401fff0; closure->cif = cif; closure->fun = fun; closure->user_data = user_data; /* Flush the icache. */ asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp), "r"(codeloc)); return FFI_OK; } /* Basically the trampoline invokes ffi_closure_SYSV, and on * entry, r3 holds the address of the closure. * After storing the registers that could possibly contain * parameters to be passed into the stack frame and setting * up space for a return value, ffi_closure_SYSV invokes the * following helper function to do most of the work. */ int ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, UINT64 *pgr, UINT64 *pfr, UINT64 *pst) { void **avalue; ffi_type **p_arg; int i, avn; int greg, freg; ffi_cif *cif; int fpair = -1; cif = closure->cif; avalue = alloca (cif->nargs * sizeof (void *)); /* Copy the caller's structure return value address so that the closure returns the data directly to the caller. */ if (return_type (cif->rtype) == FFI_TYPE_STRUCT) { rvalue = (UINT64 *) *pgr; greg = 1; } else greg = 0; freg = 0; cif = closure->cif; avn = cif->nargs; /* Grab the addresses of the arguments from the stack frame. */ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) { size_t z; void *p; z = (*p_arg)->size; if (z < sizeof (UINT32)) { p = pgr + greg++; switch ((*p_arg)->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: case FFI_TYPE_STRUCT: #ifdef __LITTLE_ENDIAN__ avalue[i] = p; #else avalue[i] = ((char *) p) + sizeof (UINT32) - z; #endif break; default: FFI_ASSERT(0); } } else if (z == sizeof (UINT32)) { if ((*p_arg)->type == FFI_TYPE_FLOAT) { if (freg < NFREGARG - 1) { if (fpair >= 0) { avalue[i] = (UINT32 *) pfr + fpair; fpair = -1; } else { #ifdef __LITTLE_ENDIAN__ fpair = freg; avalue[i] = (UINT32 *) pfr + (1 ^ freg); #else fpair = 1 ^ freg; avalue[i] = (UINT32 *) pfr + freg; #endif freg += 2; } } else #ifdef __LITTLE_ENDIAN__ avalue[i] = pgr + greg; #else avalue[i] = (UINT32 *) (pgr + greg) + 1; #endif } else #ifdef __LITTLE_ENDIAN__ avalue[i] = pgr + greg; #else avalue[i] = (UINT32 *) (pgr + greg) + 1; #endif greg++; } else if ((*p_arg)->type == FFI_TYPE_DOUBLE) { if (freg + 1 >= NFREGARG) avalue[i] = pgr + greg; else { avalue[i] = pfr + (freg >> 1); freg += 2; } greg++; } else { int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64); avalue[i] = pgr + greg; greg += n; } } (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_SYSV how to perform return type promotions. */ return return_type (cif->rtype); } polyml-5.6/libffi/src/sh64/ffitarget.h000066400000000000000000000040351265146633400176460ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for SuperH - SHmedia. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- Generic type definitions ----------------------------------------- */ #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #define FFI_EXTRA_CIF_FIELDS long long flags2 #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TRAMPOLINE_SIZE 32 #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/sh64/sysv.S000066400000000000000000000266551265146633400166660ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima SuperH SHmedia Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef HAVE_MACHINE_ASM_H #include #else /* XXX these lose for some platforms, I'm sure. */ #define CNAME(x) x #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): #endif #ifdef __LITTLE_ENDIAN__ #define OFS_FLT 0 #else #define OFS_FLT 4 #endif .section .text..SHmedia32,"ax" # r2: ffi_prep_args # r3: &ecif # r4: bytes # r5: flags # r6: flags2 # r7: rvalue # r8: fn # This assumes we are using gas. .align 5 ENTRY(ffi_call_SYSV) # Save registers .LFB1: addi.l r15, -48, r15 .LCFI0: st.q r15, 40, r32 st.q r15, 32, r31 st.q r15, 24, r30 st.q r15, 16, r29 st.q r15, 8, r28 st.l r15, 4, r18 st.l r15, 0, r14 .LCFI1: add.l r15, r63, r14 .LCFI2: # add r4, r63, r28 add r5, r63, r29 add r6, r63, r30 add r7, r63, r31 add r8, r63, r32 addi r4, (64 + 7), r4 andi r4, ~7, r4 sub.l r15, r4, r15 ptabs/l r2, tr0 add r15, r63, r2 blink tr0, r18 addi r15, 64, r22 movi 0, r0 movi 0, r1 movi -1, r23 pt/l 1f, tr1 bnei/l r29, FFI_TYPE_STRUCT, tr1 ld.l r15, 0, r19 addi r15, 8, r15 addi r0, 1, r0 1: .L_pass: andi r30, 3, r20 shlri r30, 2, r30 pt/l .L_call_it, tr0 pt/l .L_pass_i, tr1 pt/l .L_pass_f, tr2 beqi/l r20, FFI_TYPE_VOID, tr0 beqi/l r20, FFI_TYPE_INT, tr1 beqi/l r20, FFI_TYPE_FLOAT, tr2 .L_pass_d: addi r0, 1, r0 pt/l 3f, tr0 movi 12, r20 bge/l r1, r20, tr0 pt/l .L_pop_d, tr1 pt/l 2f, tr0 blink tr1, r63 2: addi.l r15, 8, r15 3: pt/l .L_pass, tr0 addi r1, 2, r1 blink tr0, r63 .L_pop_d: pt/l .L_pop_d_tbl, tr1 gettr tr1, r20 shlli r1, 2, r21 add r20, r21, r20 ptabs/l r20, tr1 blink tr1, r63 .L_pop_d_tbl: fld.d r15, 0, dr0 blink tr0, r63 fld.d r15, 0, dr2 blink tr0, r63 fld.d r15, 0, dr4 blink tr0, r63 fld.d r15, 0, dr6 blink tr0, r63 fld.d r15, 0, dr8 blink tr0, r63 fld.d r15, 0, dr10 blink tr0, r63 .L_pass_f: addi r0, 1, r0 pt/l 3f, tr0 movi 12, r20 bge/l r1, r20, tr0 pt/l .L_pop_f, tr1 pt/l 2f, tr0 blink tr1, r63 2: addi.l r15, 8, r15 3: pt/l .L_pass, tr0 blink tr0, r63 .L_pop_f: pt/l .L_pop_f_tbl, tr1 pt/l 5f, tr2 gettr tr1, r20 bge/l r23, r63, tr2 add r1, r63, r23 shlli r1, 3, r21 addi r1, 2, r1 add r20, r21, r20 ptabs/l r20, tr1 blink tr1, r63 5: addi r23, 1, r21 movi -1, r23 shlli r21, 3, r21 add r20, r21, r20 ptabs/l r20, tr1 blink tr1, r63 .L_pop_f_tbl: fld.s r15, OFS_FLT, fr0 blink tr0, r63 fld.s r15, OFS_FLT, fr1 blink tr0, r63 fld.s r15, OFS_FLT, fr2 blink tr0, r63 fld.s r15, OFS_FLT, fr3 blink tr0, r63 fld.s r15, OFS_FLT, fr4 blink tr0, r63 fld.s r15, OFS_FLT, fr5 blink tr0, r63 fld.s r15, OFS_FLT, fr6 blink tr0, r63 fld.s r15, OFS_FLT, fr7 blink tr0, r63 fld.s r15, OFS_FLT, fr8 blink tr0, r63 fld.s r15, OFS_FLT, fr9 blink tr0, r63 fld.s r15, OFS_FLT, fr10 blink tr0, r63 fld.s r15, OFS_FLT, fr11 blink tr0, r63 .L_pass_i: pt/l 3f, tr0 movi 8, r20 bge/l r0, r20, tr0 pt/l .L_pop_i, tr1 pt/l 2f, tr0 blink tr1, r63 2: addi.l r15, 8, r15 3: pt/l .L_pass, tr0 addi r0, 1, r0 blink tr0, r63 .L_pop_i: pt/l .L_pop_i_tbl, tr1 gettr tr1, r20 shlli r0, 3, r21 add r20, r21, r20 ptabs/l r20, tr1 blink tr1, r63 .L_pop_i_tbl: ld.q r15, 0, r2 blink tr0, r63 ld.q r15, 0, r3 blink tr0, r63 ld.q r15, 0, r4 blink tr0, r63 ld.q r15, 0, r5 blink tr0, r63 ld.q r15, 0, r6 blink tr0, r63 ld.q r15, 0, r7 blink tr0, r63 ld.q r15, 0, r8 blink tr0, r63 ld.q r15, 0, r9 blink tr0, r63 .L_call_it: # call function pt/l 1f, tr1 bnei/l r29, FFI_TYPE_STRUCT, tr1 add r19, r63, r2 1: add r22, r63, r15 ptabs/l r32, tr0 blink tr0, r18 pt/l .L_ret_i, tr0 pt/l .L_ret_ll, tr1 pt/l .L_ret_d, tr2 pt/l .L_ret_f, tr3 pt/l .L_epilogue, tr4 beqi/l r29, FFI_TYPE_INT, tr0 beqi/l r29, FFI_TYPE_UINT32, tr0 beqi/l r29, FFI_TYPE_SINT64, tr1 beqi/l r29, FFI_TYPE_UINT64, tr1 beqi/l r29, FFI_TYPE_DOUBLE, tr2 beqi/l r29, FFI_TYPE_FLOAT, tr3 pt/l .L_ret_q, tr0 pt/l .L_ret_h, tr1 beqi/l r29, FFI_TYPE_UINT8, tr0 beqi/l r29, FFI_TYPE_UINT16, tr1 blink tr4, r63 .L_ret_d: fst.d r31, 0, dr0 blink tr4, r63 .L_ret_ll: st.q r31, 0, r2 blink tr4, r63 .L_ret_f: fst.s r31, OFS_FLT, fr0 blink tr4, r63 .L_ret_q: st.b r31, 0, r2 blink tr4, r63 .L_ret_h: st.w r31, 0, r2 blink tr4, r63 .L_ret_i: st.l r31, 0, r2 # Fall .L_epilogue: # Remove the space we pushed for the args add r14, r63, r15 ld.l r15, 0, r14 ld.l r15, 4, r18 ld.q r15, 8, r28 ld.q r15, 16, r29 ld.q r15, 24, r30 ld.q r15, 32, r31 ld.q r15, 40, r32 addi.l r15, 48, r15 ptabs r18, tr0 blink tr0, r63 .LFE1: .ffi_call_SYSV_end: .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) .align 5 ENTRY(ffi_closure_SYSV) .LFB2: addi.l r15, -136, r15 .LCFI3: st.l r15, 12, r18 st.l r15, 8, r14 st.l r15, 4, r12 .LCFI4: add r15, r63, r14 .LCFI5: /* Stack layout: ... 64 bytes (register parameters) 48 bytes (floating register parameters) 8 bytes (result) 4 bytes (r18) 4 bytes (r14) 4 bytes (r12) 4 bytes (for align) <- new stack pointer */ fst.d r14, 24, dr0 fst.d r14, 32, dr2 fst.d r14, 40, dr4 fst.d r14, 48, dr6 fst.d r14, 56, dr8 fst.d r14, 64, dr10 st.q r14, 72, r2 st.q r14, 80, r3 st.q r14, 88, r4 st.q r14, 96, r5 st.q r14, 104, r6 st.q r14, 112, r7 st.q r14, 120, r8 st.q r14, 128, r9 add r1, r63, r2 addi r14, 16, r3 addi r14, 72, r4 addi r14, 24, r5 addi r14, 136, r6 #ifdef PIC movi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12 shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12 .LPCS0: ptrel/u r12, tr0 movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1 gettr tr0, r12 ldx.l r1, r12, r1 ptabs r1, tr0 #else pt/l ffi_closure_helper_SYSV, tr0 #endif blink tr0, r18 shlli r2, 1, r1 movi (((datalabel .L_table) >> 16) & 65535), r2 shori ((datalabel .L_table) & 65535), r2 ldx.w r2, r1, r1 add r1, r2, r1 pt/l .L_case_v, tr1 ptabs r1, tr0 blink tr0, r63 .align 2 .L_table: .word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */ .word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */ .word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */ .word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */ .word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */ .word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */ .word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */ .word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */ .word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */ .word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */ .word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */ .word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */ .word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */ .word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */ .word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */ .align 2 .L_case_d: fld.d r14, 16, dr0 blink tr1, r63 .L_case_f: fld.s r14, 16, fr0 blink tr1, r63 .L_case_ll: ld.q r14, 16, r2 blink tr1, r63 .L_case_i: ld.l r14, 16, r2 blink tr1, r63 .L_case_q: ld.b r14, 16, r2 blink tr1, r63 .L_case_uq: ld.ub r14, 16, r2 blink tr1, r63 .L_case_h: ld.w r14, 16, r2 blink tr1, r63 .L_case_uh: ld.uw r14, 16, r2 blink tr1, r63 .L_case_v: add.l r14, r63, r15 ld.l r15, 4, r12 ld.l r15, 8, r14 ld.l r15, 12, r18 addi.l r15, 136, r15 ptabs r18, tr0 blink tr0, r63 .LFE2: .ffi_closure_SYSV_end: .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif .section ".eh_frame","aw",@progbits __FRAME_BEGIN__: .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .4byte 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #ifdef PIC .ascii "zR\0" /* CIE Augmentation */ #else .byte 0x0 /* CIE Augmentation */ #endif .uleb128 0x1 /* CIE Code Alignment Factor */ .sleb128 -4 /* CIE Data Alignment Factor */ .byte 0x12 /* CIE RA Column */ #ifdef PIC .uleb128 0x1 /* Augmentation size */ .byte 0x10 /* FDE Encoding (pcrel) */ #endif .byte 0xc /* DW_CFA_def_cfa */ .uleb128 0xf .uleb128 0x0 .align 2 .LECIE1: .LSFDE1: .4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */ .LASFDE1: .4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__ #ifdef PIC .4byte .LFB1-. /* FDE initial location */ #else .4byte .LFB1 /* FDE initial location */ #endif .4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */ #ifdef PIC .uleb128 0x0 /* Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI0-datalabel .LFB1 .byte 0xe /* DW_CFA_def_cfa_offset */ .uleb128 0x30 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI1-datalabel .LCFI0 .byte 0x8e /* DW_CFA_offset, column 0xe */ .uleb128 0xc .byte 0x92 /* DW_CFA_offset, column 0x12 */ .uleb128 0xb .byte 0x9c /* DW_CFA_offset, column 0x1c */ .uleb128 0xa .byte 0x9d /* DW_CFA_offset, column 0x1d */ .uleb128 0x8 .byte 0x9e /* DW_CFA_offset, column 0x1e */ .uleb128 0x6 .byte 0x9f /* DW_CFA_offset, column 0x1f */ .uleb128 0x4 .byte 0xa0 /* DW_CFA_offset, column 0x20 */ .uleb128 0x2 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI2-datalabel .LCFI1 .byte 0xd /* DW_CFA_def_cfa_register */ .uleb128 0xe .align 2 .LEFDE1: .LSFDE3: .4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */ .LASFDE3: .4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__ #ifdef PIC .4byte .LFB2-. /* FDE initial location */ #else .4byte .LFB2 /* FDE initial location */ #endif .4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */ #ifdef PIC .uleb128 0x0 /* Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI3-datalabel .LFB2 .byte 0xe /* DW_CFA_def_cfa_offset */ .uleb128 0x88 .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI4-datalabel .LCFI3 .byte 0x8c /* DW_CFA_offset, column 0xc */ .uleb128 0x21 .byte 0x8e /* DW_CFA_offset, column 0xe */ .uleb128 0x20 .byte 0x92 /* DW_CFA_offset, column 0x12 */ .uleb128 0x1f .byte 0x4 /* DW_CFA_advance_loc4 */ .4byte datalabel .LCFI5-datalabel .LCFI4 .byte 0xd /* DW_CFA_def_cfa_register */ .uleb128 0xe .align 2 .LEFDE3: polyml-5.6/libffi/src/sparc/000077500000000000000000000000001265146633400160445ustar00rootroot00000000000000polyml-5.6/libffi/src/sparc/ffi.c000066400000000000000000000422471265146633400167650ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2011, 2013 Anthony Green Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. SPARC Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void ffi_prep_args_v8(char *stack, extended_cif *ecif) { int i; void **p_argv; char *argp; ffi_type **p_arg; /* Skip 16 words for the window save area */ argp = stack + 16*sizeof(int); /* This should only really be done when we are returning a structure, however, it's faster just to do it all the time... if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) */ *(int *) argp = (long)ecif->rvalue; /* And 1 word for the structure return value. */ argp += sizeof(int); #ifdef USING_PURIFY /* Purify will probably complain in our assembly routine, unless we zero out this memory. */ ((int*)argp)[0] = 0; ((int*)argp)[1] = 0; ((int*)argp)[2] = 0; ((int*)argp)[3] = 0; ((int*)argp)[4] = 0; ((int*)argp)[5] = 0; #endif p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) { size_t z; if ((*p_arg)->type == FFI_TYPE_STRUCT #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE || (*p_arg)->type == FFI_TYPE_LONGDOUBLE #endif ) { *(unsigned int *) argp = (unsigned long)(* p_argv); z = sizeof(int); } else { z = (*p_arg)->size; if (z < sizeof(int)) { z = sizeof(int); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed int *) argp = *(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned int *) argp = *(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed int *) argp = *(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned int *) argp = *(UINT16 *)(* p_argv); break; default: FFI_ASSERT(0); } } else { memcpy(argp, *p_argv, z); } } p_argv++; argp += z; } return; } int ffi_prep_args_v9(char *stack, extended_cif *ecif) { int i, ret = 0; int tmp; void **p_argv; char *argp; ffi_type **p_arg; tmp = 0; /* Skip 16 words for the window save area */ argp = stack + 16*sizeof(long long); #ifdef USING_PURIFY /* Purify will probably complain in our assembly routine, unless we zero out this memory. */ ((long long*)argp)[0] = 0; ((long long*)argp)[1] = 0; ((long long*)argp)[2] = 0; ((long long*)argp)[3] = 0; ((long long*)argp)[4] = 0; ((long long*)argp)[5] = 0; #endif p_argv = ecif->avalue; if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 32) { *(unsigned long long *) argp = (unsigned long)ecif->rvalue; argp += sizeof(long long); tmp = 1; } for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++) { size_t z; z = (*p_arg)->size; switch ((*p_arg)->type) { case FFI_TYPE_STRUCT: if (z > 16) { /* For structures larger than 16 bytes we pass reference. */ *(unsigned long long *) argp = (unsigned long)* p_argv; argp += sizeof(long long); tmp++; p_argv++; continue; } /* FALLTHROUGH */ case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: #endif ret = 1; /* We should promote into FP regs as well as integer. */ break; } if (z < sizeof(long long)) { switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(signed long long *) argp = *(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(unsigned long long *) argp = *(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(signed long long *) argp = *(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(unsigned long long *) argp = *(UINT16 *)(* p_argv); break; case FFI_TYPE_SINT32: *(signed long long *) argp = *(SINT32 *)(* p_argv); break; case FFI_TYPE_UINT32: *(unsigned long long *) argp = *(UINT32 *)(* p_argv); break; case FFI_TYPE_FLOAT: *(float *) (argp + 4) = *(FLOAT32 *)(* p_argv); /* Right justify */ break; case FFI_TYPE_STRUCT: memcpy(argp, *p_argv, z); break; default: FFI_ASSERT(0); } z = sizeof(long long); tmp++; } else if (z == sizeof(long long)) { memcpy(argp, *p_argv, z); z = sizeof(long long); tmp++; } else { if ((tmp & 1) && (*p_arg)->alignment > 8) { tmp++; argp += sizeof(long long); } memcpy(argp, *p_argv, z); z = 2 * sizeof(long long); tmp += 2; } p_argv++; argp += z; } return ret; } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { int wordsize; if (cif->abi != FFI_V9) { wordsize = 4; /* If we are returning a struct, this will already have been added. Otherwise we need to add it because it's always got to be there! */ if (cif->rtype->type != FFI_TYPE_STRUCT) cif->bytes += wordsize; /* sparc call frames require that space is allocated for 6 args, even if they aren't used. Make that space if necessary. */ if (cif->bytes < 4*6+4) cif->bytes = 4*6+4; } else { wordsize = 8; /* sparc call frames require that space is allocated for 6 args, even if they aren't used. Make that space if necessary. */ if (cif->bytes < 8*6) cif->bytes = 8*6; } /* Adjust cif->bytes. to include 16 words for the window save area, and maybe the struct/union return pointer area, */ cif->bytes += 16 * wordsize; /* The stack must be 2 word aligned, so round bytes up appropriately. */ cif->bytes = ALIGN(cif->bytes, 2 * wordsize); /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: #endif cif->flags = cif->rtype->type; break; case FFI_TYPE_STRUCT: if (cif->abi == FFI_V9 && cif->rtype->size > 32) cif->flags = FFI_TYPE_VOID; else cif->flags = FFI_TYPE_STRUCT; break; case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: if (cif->abi == FFI_V9) cif->flags = FFI_TYPE_INT; else cif->flags = cif->rtype->type; break; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: if (cif->abi == FFI_V9) cif->flags = FFI_TYPE_INT; else cif->flags = FFI_TYPE_SINT64; break; default: cif->flags = FFI_TYPE_INT; break; } return FFI_OK; } int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt) { ffi_type **ptr = &arg->elements[0]; while (*ptr != NULL) { if (off & ((*ptr)->alignment - 1)) off = ALIGN(off, (*ptr)->alignment); switch ((*ptr)->type) { case FFI_TYPE_STRUCT: off = ffi_v9_layout_struct(*ptr, off, ret, intg, flt); off = ALIGN(off, FFI_SIZEOF_ARG); break; case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE case FFI_TYPE_LONGDOUBLE: #endif memmove(ret + off, flt + off, (*ptr)->size); off += (*ptr)->size; break; default: memmove(ret + off, intg + off, (*ptr)->size); off += (*ptr)->size; break; } ptr++; } return off; } #ifdef SPARC64 extern int ffi_call_v9(void *, extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); #else extern int ffi_call_v8(void *, extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); #endif #ifndef __GNUC__ void ffi_flush_icache (void *, size_t); #endif void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; void *rval = rvalue; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ ecif.rvalue = rvalue; if (cif->rtype->type == FFI_TYPE_STRUCT) { if (cif->rtype->size <= 32) rval = alloca(64); else { rval = NULL; if (rvalue == NULL) ecif.rvalue = alloca(cif->rtype->size); } } switch (cif->abi) { case FFI_V8: #ifdef SPARC64 /* We don't yet support calling 32bit code from 64bit */ FFI_ASSERT(0); #else if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE || cif->flags == FFI_TYPE_LONGDOUBLE #endif )) { /* For v8, we need an "unimp" with size of returning struct */ /* behind "call", so we alloc some executable space for it. */ /* l7 is used, we need to make sure v8.S doesn't use %l7. */ unsigned int *call_struct = NULL; ffi_closure_alloc(32, (void **)&call_struct); if (call_struct) { unsigned long f = (unsigned long)fn; call_struct[0] = 0xae10001f; /* mov %i7, %l7 */ call_struct[1] = 0xbe10000f; /* mov %o7, %i7 */ call_struct[2] = 0x03000000 | f >> 10; /* sethi %hi(fn), %g1 */ call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */ call_struct[4] = 0x01000000; /* nop */ if (cif->rtype->size < 0x7f) call_struct[5] = cif->rtype->size; /* unimp */ else call_struct[5] = 0x01000000; /* nop */ call_struct[6] = 0x81c7e008; /* ret */ call_struct[7] = 0xbe100017; /* mov %l7, %i7 */ #ifdef __GNUC__ asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : : "r" (call_struct) : "memory"); /* SPARC v8 requires 5 instructions for flush to be visible */ asm volatile ("nop; nop; nop; nop; nop"); #else ffi_flush_icache (call_struct, 32); #endif ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, cif->flags, rvalue, call_struct); ffi_closure_free(call_struct); } else { ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, cif->flags, rvalue, fn); } } else { ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes, cif->flags, rvalue, fn); } #endif break; case FFI_V9: #ifdef SPARC64 ffi_call_v9(ffi_prep_args_v9, &ecif, cif->bytes, cif->flags, rval, fn); if (rvalue && rval && cif->rtype->type == FFI_TYPE_STRUCT) ffi_v9_layout_struct(cif->rtype, 0, (char *)rvalue, (char *)rval, ((char *)rval)+32); #else /* And vice versa */ FFI_ASSERT(0); #endif break; default: FFI_ASSERT(0); break; } } #ifdef SPARC64 extern void ffi_closure_v9(void); #else extern void ffi_closure_v8(void); #endif ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { unsigned int *tramp = (unsigned int *) &closure->tramp[0]; unsigned long fn; #ifdef SPARC64 /* Trampoline address is equal to the closure address. We take advantage of that to reduce the trampoline size by 8 bytes. */ if (cif->abi != FFI_V9) return FFI_BAD_ABI; fn = (unsigned long) ffi_closure_v9; tramp[0] = 0x83414000; /* rd %pc, %g1 */ tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ tramp[2] = 0x81c14000; /* jmp %g5 */ tramp[3] = 0x01000000; /* nop */ *((unsigned long *) &tramp[4]) = fn; #else unsigned long ctx = (unsigned long) codeloc; if (cif->abi != FFI_V8) return FFI_BAD_ABI; fn = (unsigned long) ffi_closure_v8; tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; /* Flush the Icache. closure is 8 bytes aligned. */ #ifdef __GNUC__ #ifdef SPARC64 asm volatile ("flush %0; flush %0+8" : : "r" (closure) : "memory"); #else asm volatile ("iflush %0; iflush %0+8" : : "r" (closure) : "memory"); /* SPARC v8 requires 5 instructions for flush to be visible */ asm volatile ("nop; nop; nop; nop; nop"); #endif #else ffi_flush_icache (closure, 16); #endif return FFI_OK; } int ffi_closure_sparc_inner_v8(ffi_closure *closure, void *rvalue, unsigned long *gpr, unsigned long *scratch) { ffi_cif *cif; ffi_type **arg_types; void **avalue; int i, argn; cif = closure->cif; arg_types = cif->arg_types; avalue = alloca(cif->nargs * sizeof(void *)); /* Copy the caller's structure return address so that the closure returns the data directly to the caller. */ if (cif->flags == FFI_TYPE_STRUCT #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE || cif->flags == FFI_TYPE_LONGDOUBLE #endif ) rvalue = (void *) gpr[0]; /* Always skip the structure return address. */ argn = 1; /* Grab the addresses of the arguments from the stack frame. */ for (i = 0; i < cif->nargs; i++) { if (arg_types[i]->type == FFI_TYPE_STRUCT #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE || arg_types[i]->type == FFI_TYPE_LONGDOUBLE #endif ) { /* Straight copy of invisible reference. */ avalue[i] = (void *)gpr[argn++]; } else if ((arg_types[i]->type == FFI_TYPE_DOUBLE || arg_types[i]->type == FFI_TYPE_SINT64 || arg_types[i]->type == FFI_TYPE_UINT64) /* gpr is 8-byte aligned. */ && (argn % 2) != 0) { /* Align on a 8-byte boundary. */ scratch[0] = gpr[argn]; scratch[1] = gpr[argn+1]; avalue[i] = scratch; scratch -= 2; argn += 2; } else { /* Always right-justify. */ argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; } } /* Invoke the closure. */ (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_sparc how to perform return type promotions. */ return cif->rtype->type; } int ffi_closure_sparc_inner_v9(ffi_closure *closure, void *rvalue, unsigned long *gpr, double *fpr) { ffi_cif *cif; ffi_type **arg_types; void **avalue; int i, argn, fp_slot_max; cif = closure->cif; arg_types = cif->arg_types; avalue = alloca(cif->nargs * sizeof(void *)); /* Copy the caller's structure return address so that the closure returns the data directly to the caller. */ if (cif->flags == FFI_TYPE_VOID && cif->rtype->type == FFI_TYPE_STRUCT) { rvalue = (void *) gpr[0]; /* Skip the structure return address. */ argn = 1; } else argn = 0; fp_slot_max = 16 - argn; /* Grab the addresses of the arguments from the stack frame. */ for (i = 0; i < cif->nargs; i++) { if (arg_types[i]->type == FFI_TYPE_STRUCT) { if (arg_types[i]->size > 16) { /* Straight copy of invisible reference. */ avalue[i] = (void *)gpr[argn++]; } else { /* Left-justify. */ ffi_v9_layout_struct(arg_types[i], 0, (char *) &gpr[argn], (char *) &gpr[argn], (char *) &fpr[argn]); avalue[i] = &gpr[argn]; argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; } } else { /* Right-justify. */ argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; /* Align on a 16-byte boundary. */ #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE if (arg_types[i]->type == FFI_TYPE_LONGDOUBLE && (argn % 2) != 0) argn++; #endif if (i < fp_slot_max && (arg_types[i]->type == FFI_TYPE_FLOAT || arg_types[i]->type == FFI_TYPE_DOUBLE #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE || arg_types[i]->type == FFI_TYPE_LONGDOUBLE #endif )) avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size; else avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; } } /* Invoke the closure. */ (closure->fun) (cif, rvalue, avalue, closure->user_data); /* Tell ffi_closure_sparc how to perform return type promotions. */ return cif->rtype->type; } polyml-5.6/libffi/src/sparc/ffitarget.h000066400000000000000000000043071265146633400201740ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003 Red Hat, Inc. Target configuration macros for SPARC. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- System specific configurations ----------------------------------- */ #if defined(__arch64__) || defined(__sparcv9) #ifndef SPARC64 #define SPARC64 #endif #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_V8, FFI_V8PLUS, FFI_V9, FFI_LAST_ABI, #ifdef SPARC64 FFI_DEFAULT_ABI = FFI_V9 #else FFI_DEFAULT_ABI = FFI_V8 #endif } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 #ifdef SPARC64 #define FFI_TRAMPOLINE_SIZE 24 #else #define FFI_TRAMPOLINE_SIZE 16 #endif #endif polyml-5.6/libffi/src/sparc/v8.S000066400000000000000000000163561265146633400165400ustar00rootroot00000000000000/* ----------------------------------------------------------------------- v8.S - Copyright (c) 2013 The Written Word, Inc. Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. SPARC Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #define STACKFRAME 96 /* Minimum stack framesize for SPARC */ #define ARGS (64+4) /* Offset of register area in frame */ #ifndef __GNUC__ .text .align 8 .globl ffi_flush_icache .globl _ffi_flush_icache ffi_flush_icache: _ffi_flush_icache: add %o0, %o1, %o2 #ifdef SPARC64 1: flush %o0 #else 1: iflush %o0 #endif add %o0, 8, %o0 cmp %o0, %o2 blt 1b nop nop nop nop nop retl nop .ffi_flush_icache_end: .size ffi_flush_icache,.ffi_flush_icache_end-ffi_flush_icache #endif .text .align 8 .globl ffi_call_v8 .globl _ffi_call_v8 ffi_call_v8: _ffi_call_v8: .LLFB1: save %sp, -STACKFRAME, %sp .LLCFI0: sub %sp, %i2, %sp ! alloca() space in stack for frame to set up add %sp, STACKFRAME, %l0 ! %l0 has start of ! frame to set up mov %l0, %o0 ! call routine to set up frame call %i0 mov %i1, %o1 ! (delay) ld [%l0+ARGS], %o0 ! call foreign function ld [%l0+ARGS+4], %o1 ld [%l0+ARGS+8], %o2 ld [%l0+ARGS+12], %o3 ld [%l0+ARGS+16], %o4 ld [%l0+ARGS+20], %o5 call %i5 mov %l0, %sp ! (delay) switch to frame nop ! STRUCT returning functions skip 12 instead of 8 bytes ! If the return value pointer is NULL, assume no return value. tst %i4 bz done nop cmp %i3, FFI_TYPE_INT be,a done st %o0, [%i4] ! (delay) cmp %i3, FFI_TYPE_FLOAT be,a done st %f0, [%i4+0] ! (delay) cmp %i3, FFI_TYPE_DOUBLE be,a double st %f0, [%i4+0] ! (delay) cmp %i3, FFI_TYPE_SINT8 be,a sint8 sll %o0, 24, %o0 ! (delay) cmp %i3, FFI_TYPE_UINT8 be,a uint8 sll %o0, 24, %o0 ! (delay) cmp %i3, FFI_TYPE_SINT16 be,a sint16 sll %o0, 16, %o0 ! (delay) cmp %i3, FFI_TYPE_UINT16 be,a uint16 sll %o0, 16, %o0 ! (delay) cmp %i3, FFI_TYPE_SINT64 be,a longlong st %o0, [%i4+0] ! (delay) done: ret restore double: st %f1, [%i4+4] ret restore sint8: sra %o0, 24, %o0 st %o0, [%i4+0] ret restore uint8: srl %o0, 24, %o0 st %o0, [%i4+0] ret restore sint16: sra %o0, 16, %o0 st %o0, [%i4+0] ret restore uint16: srl %o0, 16, %o0 st %o0, [%i4+0] ret restore longlong: st %o1, [%i4+4] ret restore .LLFE1: .ffi_call_v8_end: .size ffi_call_v8,.ffi_call_v8_end-ffi_call_v8 #undef STACKFRAME #define STACKFRAME 104 /* 16*4 register window + 1*4 struct return + 6*4 args backing store + 3*4 locals */ /* ffi_closure_v8(...) Receives the closure argument in %g2. */ .text .align 8 .globl ffi_closure_v8 ffi_closure_v8: #ifdef HAVE_AS_REGISTER_PSEUDO_OP .register %g2, #scratch #endif .LLFB2: ! Reserve frame space for all arguments in case ! we need to align them on a 8-byte boundary. ld [%g2+FFI_TRAMPOLINE_SIZE], %g1 ld [%g1+4], %g1 sll %g1, 3, %g1 add %g1, STACKFRAME, %g1 ! %g1 == STACKFRAME + 8*nargs neg %g1 save %sp, %g1, %sp .LLCFI1: ! Store all of the potential argument registers in va_list format. st %i0, [%fp+68+0] st %i1, [%fp+68+4] st %i2, [%fp+68+8] st %i3, [%fp+68+12] st %i4, [%fp+68+16] st %i5, [%fp+68+20] ! Call ffi_closure_sparc_inner to do the bulk of the work. mov %g2, %o0 add %fp, -8, %o1 add %fp, 64, %o2 call ffi_closure_sparc_inner_v8 add %fp, -16, %o3 ! Load up the return value in the proper type. ! See ffi_prep_cif_machdep for the list of cases. cmp %o0, FFI_TYPE_VOID be done1 cmp %o0, FFI_TYPE_INT be done1 ld [%fp-8], %i0 cmp %o0, FFI_TYPE_FLOAT be,a done1 ld [%fp-8], %f0 cmp %o0, FFI_TYPE_DOUBLE be,a done1 ldd [%fp-8], %f0 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE cmp %o0, FFI_TYPE_LONGDOUBLE be done2 #endif cmp %o0, FFI_TYPE_STRUCT be done2 cmp %o0, FFI_TYPE_SINT64 be,a done1 ldd [%fp-8], %i0 cmp %o0, FFI_TYPE_UINT64 be,a done1 ldd [%fp-8], %i0 ld [%fp-8], %i0 done1: jmp %i7+8 restore done2: ! Skip 'unimp'. jmp %i7+12 restore .LLFE2: .ffi_closure_v8_end: .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8 #ifdef SPARC64 #define WS 8 #define nword xword #define uanword uaxword #else #define WS 4 #define nword long #define uanword uaword #endif #ifdef HAVE_RO_EH_FRAME .section ".eh_frame",#alloc #else .section ".eh_frame",#alloc,#write #endif .LLframe1: .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry .LLSCIE1: .uaword 0x0 ! CIE Identifier Tag .byte 0x1 ! CIE Version .ascii "zR\0" ! CIE Augmentation .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor .byte 0x80-WS ! sleb128 -WS; CIE Data Alignment Factor .byte 0xf ! CIE RA Column .byte 0x1 ! uleb128 0x1; Augmentation size #ifdef HAVE_AS_SPARC_UA_PCREL .byte 0x1b ! FDE Encoding (pcrel sdata4) #else .byte 0x50 ! FDE Encoding (aligned absolute) #endif .byte 0xc ! DW_CFA_def_cfa .byte 0xe ! uleb128 0xe .byte 0x0 ! uleb128 0x0 .align WS .LLECIE1: .LLSFDE1: .uaword .LLEFDE1-.LLASFDE1 ! FDE Length .LLASFDE1: .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset #ifdef HAVE_AS_SPARC_UA_PCREL .uaword %r_disp32(.LLFB1) .uaword .LLFE1-.LLFB1 ! FDE address range #else .align WS .nword .LLFB1 .uanword .LLFE1-.LLFB1 ! FDE address range #endif .byte 0x0 ! uleb128 0x0; Augmentation size .byte 0x4 ! DW_CFA_advance_loc4 .uaword .LLCFI0-.LLFB1 .byte 0xd ! DW_CFA_def_cfa_register .byte 0x1e ! uleb128 0x1e .byte 0x2d ! DW_CFA_GNU_window_save .byte 0x9 ! DW_CFA_register .byte 0xf ! uleb128 0xf .byte 0x1f ! uleb128 0x1f .align WS .LLEFDE1: .LLSFDE2: .uaword .LLEFDE2-.LLASFDE2 ! FDE Length .LLASFDE2: .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset #ifdef HAVE_AS_SPARC_UA_PCREL .uaword %r_disp32(.LLFB2) .uaword .LLFE2-.LLFB2 ! FDE address range #else .align WS .nword .LLFB2 .uanword .LLFE2-.LLFB2 ! FDE address range #endif .byte 0x0 ! uleb128 0x0; Augmentation size .byte 0x4 ! DW_CFA_advance_loc4 .uaword .LLCFI1-.LLFB2 .byte 0xd ! DW_CFA_def_cfa_register .byte 0x1e ! uleb128 0x1e .byte 0x2d ! DW_CFA_GNU_window_save .byte 0x9 ! DW_CFA_register .byte 0xf ! uleb128 0xf .byte 0x1f ! uleb128 0x1f .align WS .LLEFDE2: #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/sparc/v9.S000066400000000000000000000163661265146633400165420ustar00rootroot00000000000000/* ----------------------------------------------------------------------- v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. SPARC 64-bit Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef SPARC64 /* Only compile this in for 64bit builds, because otherwise the object file will have inproper architecture due to used instructions. */ #define STACKFRAME 176 /* Minimum stack framesize for SPARC 64-bit */ #define STACK_BIAS 2047 #define ARGS (128) /* Offset of register area in frame */ .text .align 8 .globl ffi_call_v9 .globl _ffi_call_v9 ffi_call_v9: _ffi_call_v9: .LLFB1: save %sp, -STACKFRAME, %sp .LLCFI0: sub %sp, %i2, %sp ! alloca() space in stack for frame to set up add %sp, STACKFRAME+STACK_BIAS, %l0 ! %l0 has start of ! frame to set up mov %l0, %o0 ! call routine to set up frame call %i0 mov %i1, %o1 ! (delay) brz,pt %o0, 1f ldx [%l0+ARGS], %o0 ! call foreign function ldd [%l0+ARGS], %f0 ldd [%l0+ARGS+8], %f2 ldd [%l0+ARGS+16], %f4 ldd [%l0+ARGS+24], %f6 ldd [%l0+ARGS+32], %f8 ldd [%l0+ARGS+40], %f10 ldd [%l0+ARGS+48], %f12 ldd [%l0+ARGS+56], %f14 ldd [%l0+ARGS+64], %f16 ldd [%l0+ARGS+72], %f18 ldd [%l0+ARGS+80], %f20 ldd [%l0+ARGS+88], %f22 ldd [%l0+ARGS+96], %f24 ldd [%l0+ARGS+104], %f26 ldd [%l0+ARGS+112], %f28 ldd [%l0+ARGS+120], %f30 1: ldx [%l0+ARGS+8], %o1 ldx [%l0+ARGS+16], %o2 ldx [%l0+ARGS+24], %o3 ldx [%l0+ARGS+32], %o4 ldx [%l0+ARGS+40], %o5 call %i5 sub %l0, STACK_BIAS, %sp ! (delay) switch to frame ! If the return value pointer is NULL, assume no return value. brz,pn %i4, done nop cmp %i3, FFI_TYPE_INT be,a,pt %icc, done stx %o0, [%i4+0] ! (delay) cmp %i3, FFI_TYPE_FLOAT be,a,pn %icc, done st %f0, [%i4+0] ! (delay) cmp %i3, FFI_TYPE_DOUBLE be,a,pn %icc, done std %f0, [%i4+0] ! (delay) cmp %i3, FFI_TYPE_STRUCT be,pn %icc, dostruct cmp %i3, FFI_TYPE_LONGDOUBLE bne,pt %icc, done nop std %f0, [%i4+0] std %f2, [%i4+8] done: ret restore dostruct: /* This will not work correctly for unions. */ stx %o0, [%i4+0] stx %o1, [%i4+8] stx %o2, [%i4+16] stx %o3, [%i4+24] std %f0, [%i4+32] std %f2, [%i4+40] std %f4, [%i4+48] std %f6, [%i4+56] ret restore .LLFE1: .ffi_call_v9_end: .size ffi_call_v9,.ffi_call_v9_end-ffi_call_v9 #undef STACKFRAME #define STACKFRAME 336 /* 16*8 register window + 6*8 args backing store + 20*8 locals */ #define FP %fp+STACK_BIAS /* ffi_closure_v9(...) Receives the closure argument in %g1. */ .text .align 8 .globl ffi_closure_v9 ffi_closure_v9: .LLFB2: save %sp, -STACKFRAME, %sp .LLCFI1: ! Store all of the potential argument registers in va_list format. stx %i0, [FP+128+0] stx %i1, [FP+128+8] stx %i2, [FP+128+16] stx %i3, [FP+128+24] stx %i4, [FP+128+32] stx %i5, [FP+128+40] ! Store possible floating point argument registers too. std %f0, [FP-128] std %f2, [FP-120] std %f4, [FP-112] std %f6, [FP-104] std %f8, [FP-96] std %f10, [FP-88] std %f12, [FP-80] std %f14, [FP-72] std %f16, [FP-64] std %f18, [FP-56] std %f20, [FP-48] std %f22, [FP-40] std %f24, [FP-32] std %f26, [FP-24] std %f28, [FP-16] std %f30, [FP-8] ! Call ffi_closure_sparc_inner to do the bulk of the work. mov %g1, %o0 add %fp, STACK_BIAS-160, %o1 add %fp, STACK_BIAS+128, %o2 call ffi_closure_sparc_inner_v9 add %fp, STACK_BIAS-128, %o3 ! Load up the return value in the proper type. ! See ffi_prep_cif_machdep for the list of cases. cmp %o0, FFI_TYPE_VOID be,pn %icc, done1 cmp %o0, FFI_TYPE_INT be,pn %icc, integer cmp %o0, FFI_TYPE_FLOAT be,a,pn %icc, done1 ld [FP-160], %f0 cmp %o0, FFI_TYPE_DOUBLE be,a,pn %icc, done1 ldd [FP-160], %f0 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE cmp %o0, FFI_TYPE_LONGDOUBLE be,a,pn %icc, longdouble1 ldd [FP-160], %f0 #endif ! FFI_TYPE_STRUCT ldx [FP-152], %i1 ldx [FP-144], %i2 ldx [FP-136], %i3 ldd [FP-160], %f0 ldd [FP-152], %f2 ldd [FP-144], %f4 ldd [FP-136], %f6 integer: ldx [FP-160], %i0 done1: ret restore #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE longdouble1: ldd [FP-152], %f2 ret restore #endif .LLFE2: .ffi_closure_v9_end: .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 #ifdef HAVE_RO_EH_FRAME .section ".eh_frame",#alloc #else .section ".eh_frame",#alloc,#write #endif .LLframe1: .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry .LLSCIE1: .uaword 0x0 ! CIE Identifier Tag .byte 0x1 ! CIE Version .ascii "zR\0" ! CIE Augmentation .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor .byte 0x78 ! sleb128 -8; CIE Data Alignment Factor .byte 0xf ! CIE RA Column .byte 0x1 ! uleb128 0x1; Augmentation size #ifdef HAVE_AS_SPARC_UA_PCREL .byte 0x1b ! FDE Encoding (pcrel sdata4) #else .byte 0x50 ! FDE Encoding (aligned absolute) #endif .byte 0xc ! DW_CFA_def_cfa .byte 0xe ! uleb128 0xe .byte 0xff,0xf ! uleb128 0x7ff .align 8 .LLECIE1: .LLSFDE1: .uaword .LLEFDE1-.LLASFDE1 ! FDE Length .LLASFDE1: .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset #ifdef HAVE_AS_SPARC_UA_PCREL .uaword %r_disp32(.LLFB1) .uaword .LLFE1-.LLFB1 ! FDE address range #else .align 8 .xword .LLFB1 .uaxword .LLFE1-.LLFB1 ! FDE address range #endif .byte 0x0 ! uleb128 0x0; Augmentation size .byte 0x4 ! DW_CFA_advance_loc4 .uaword .LLCFI0-.LLFB1 .byte 0xd ! DW_CFA_def_cfa_register .byte 0x1e ! uleb128 0x1e .byte 0x2d ! DW_CFA_GNU_window_save .byte 0x9 ! DW_CFA_register .byte 0xf ! uleb128 0xf .byte 0x1f ! uleb128 0x1f .align 8 .LLEFDE1: .LLSFDE2: .uaword .LLEFDE2-.LLASFDE2 ! FDE Length .LLASFDE2: .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset #ifdef HAVE_AS_SPARC_UA_PCREL .uaword %r_disp32(.LLFB2) .uaword .LLFE2-.LLFB2 ! FDE address range #else .align 8 .xword .LLFB2 .uaxword .LLFE2-.LLFB2 ! FDE address range #endif .byte 0x0 ! uleb128 0x0; Augmentation size .byte 0x4 ! DW_CFA_advance_loc4 .uaword .LLCFI1-.LLFB2 .byte 0xd ! DW_CFA_def_cfa_register .byte 0x1e ! uleb128 0x1e .byte 0x2d ! DW_CFA_GNU_window_save .byte 0x9 ! DW_CFA_register .byte 0xf ! uleb128 0xf .byte 0x1f ! uleb128 0x1f .align 8 .LLEFDE2: #endif #ifdef __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/tile/000077500000000000000000000000001265146633400156715ustar00rootroot00000000000000polyml-5.6/libffi/src/tile/ffi.c000066400000000000000000000241051265146633400166030ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2012 Tilera Corp. TILE Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include /* The first 10 registers are used to pass arguments and return values. */ #define NUM_ARG_REGS 10 /* Performs a raw function call with the given NUM_ARG_REGS register arguments and the specified additional stack arguments (if any). */ extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], const ffi_sarg *stack_args, size_t stack_args_bytes, void (*fnaddr)(void)) FFI_HIDDEN; /* This handles the raw call from the closure stub, cleaning up the parameters and delegating to ffi_closure_tile_inner. */ extern void ffi_closure_tile(void) FFI_HIDDEN; ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { /* We always allocate room for all registers. Even if we don't use them as parameters, they get returned in the same array as struct return values so we need to make room. */ if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) cif->flags = FFI_TYPE_STRUCT; else cif->flags = FFI_TYPE_INT; /* Nothing to do. */ return FFI_OK; } static long assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, int write_to_reg) { switch (type->type) { case FFI_TYPE_SINT8: *out = *(SINT8 *)in; return 1; case FFI_TYPE_UINT8: *out = *(UINT8 *)in; return 1; case FFI_TYPE_SINT16: *out = *(SINT16 *)in; return 1; case FFI_TYPE_UINT16: *out = *(UINT16 *)in; return 1; case FFI_TYPE_SINT32: case FFI_TYPE_UINT32: #ifndef __LP64__ case FFI_TYPE_POINTER: #endif /* Note that even unsigned 32-bit quantities are sign extended on tilegx when stored in a register. */ *out = *(SINT32 *)in; return 1; case FFI_TYPE_FLOAT: #ifdef __tilegx__ if (write_to_reg) { /* Properly sign extend the value. */ union { float f; SINT32 s32; } val; val.f = *(float *)in; *out = val.s32; } else #endif { *(float *)out = *(float *)in; } return 1; case FFI_TYPE_SINT64: case FFI_TYPE_UINT64: case FFI_TYPE_DOUBLE: #ifdef __LP64__ case FFI_TYPE_POINTER: #endif *(UINT64 *)out = *(UINT64 *)in; return sizeof(UINT64) / FFI_SIZEOF_ARG; case FFI_TYPE_STRUCT: memcpy(out, in, type->size); return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; case FFI_TYPE_VOID: /* Must be a return type. Nothing to do. */ return 0; default: FFI_ASSERT(0); return -1; } } void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { ffi_sarg * const arg_mem = alloca(cif->bytes); ffi_sarg * const reg_args = arg_mem; ffi_sarg * const stack_args = ®_args[NUM_ARG_REGS]; ffi_sarg *argp = arg_mem; ffi_type ** const arg_types = cif->arg_types; const long num_args = cif->nargs; long i; if (cif->flags == FFI_TYPE_STRUCT) { /* Pass a hidden pointer to the return value. We make sure there is scratch space for the callee to store the return value even if our caller doesn't care about it. */ *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); /* No more work needed to return anything. */ rvalue = NULL; } for (i = 0; i < num_args; i++) { ffi_type *type = arg_types[i]; void * const arg_in = avalue[i]; ptrdiff_t arg_word = argp - arg_mem; #ifndef __tilegx__ /* Doubleword-aligned values are always in an even-number register pair, or doubleword-aligned stack slot if out of registers. */ long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); argp += align; arg_word += align; #endif if (type->type == FFI_TYPE_STRUCT) { const size_t arg_size_in_words = (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; if (arg_word < NUM_ARG_REGS && arg_word + arg_size_in_words > NUM_ARG_REGS) { /* Args are not allowed to span registers and the stack. */ argp = stack_args; } memcpy(argp, arg_in, type->size); argp += arg_size_in_words; } else { argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); } } /* Actually do the call. */ ffi_call_tile(reg_args, stack_args, cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); if (rvalue != NULL) assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); } /* Template code for closure. */ extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; ffi_status ffi_prep_closure_loc (ffi_closure *closure, ffi_cif *cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { #ifdef __tilegx__ /* TILE-Gx */ SINT64 c; SINT64 h; int s; UINT64 *out; if (cif->abi != FFI_UNIX) return FFI_BAD_ABI; out = (UINT64 *)closure->tramp; c = (intptr_t)closure; h = (intptr_t)ffi_closure_tile; s = 0; /* Find the smallest shift count that doesn't lose information (i.e. no need to explicitly insert high bits of the address that are just the sign extension of the low bits). */ while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) s += 16; #define OPS(a, b, shift) \ (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) /* Emit the moveli. */ *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); for (s -= 16; s >= 0; s -= 16) *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); #undef OPS *out++ = ffi_template_tramp_tile[2]; #else /* TILEPro */ UINT64 *out; intptr_t delta; if (cif->abi != FFI_UNIX) return FFI_BAD_ABI; out = (UINT64 *)closure->tramp; delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); #endif closure->cif = cif; closure->fun = fun; closure->user_data = user_data; invalidate_icache(closure->tramp, (char *)out - closure->tramp, getpagesize()); return FFI_OK; } /* This is called by the assembly wrapper for closures. This does all of the work. On entry reg_args[0] holds the values the registers had when the closure was invoked. On return reg_args[1] holds the register values to be returned to the caller (many of which may be garbage). */ void FFI_HIDDEN ffi_closure_tile_inner(ffi_closure *closure, ffi_sarg reg_args[2][NUM_ARG_REGS], ffi_sarg *stack_args) { ffi_cif * const cif = closure->cif; void ** const avalue = alloca(cif->nargs * sizeof(void *)); void *rvalue; ffi_type ** const arg_types = cif->arg_types; ffi_sarg * const reg_args_in = reg_args[0]; ffi_sarg * const reg_args_out = reg_args[1]; ffi_sarg * argp; long i, arg_word, nargs = cif->nargs; /* Use a union to guarantee proper alignment for double. */ union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; /* Start out reading register arguments. */ argp = reg_args_in; /* Copy the caller's structure return address to that the closure returns the data directly to the caller. */ if (cif->flags == FFI_TYPE_STRUCT) { /* Return by reference via hidden pointer. */ rvalue = (void *)(intptr_t)*argp++; arg_word = 1; } else { /* Return the value in registers. */ rvalue = &closure_ret; arg_word = 0; } /* Grab the addresses of the arguments. */ for (i = 0; i < nargs; i++) { ffi_type * const type = arg_types[i]; const size_t arg_size_in_words = (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; #ifndef __tilegx__ /* Doubleword-aligned values are always in an even-number register pair, or doubleword-aligned stack slot if out of registers. */ long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); argp += align; arg_word += align; #endif if (arg_word == NUM_ARG_REGS || (arg_word < NUM_ARG_REGS && arg_word + arg_size_in_words > NUM_ARG_REGS)) { /* Switch to reading arguments from the stack. */ argp = stack_args; arg_word = NUM_ARG_REGS; } avalue[i] = argp; argp += arg_size_in_words; arg_word += arg_size_in_words; } /* Invoke the closure. */ closure->fun(cif, rvalue, avalue, closure->user_data); if (cif->flags != FFI_TYPE_STRUCT) { /* Canonicalize for register representation. */ assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); } } polyml-5.6/libffi/src/tile/ffitarget.h000066400000000000000000000041761265146633400200250ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Tilera Corp. Target configuration macros for TILE. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM #include typedef uint_reg_t ffi_arg; typedef int_reg_t ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_UNIX, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_UNIX } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #ifdef __tilegx__ /* We always pass 8-byte values, even in -m32 mode. */ # define FFI_SIZEOF_ARG 8 # ifdef __LP64__ # define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ # else # define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ # endif #else # define FFI_SIZEOF_ARG 4 # define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ #endif #define FFI_NATIVE_RAW_API 0 #endif polyml-5.6/libffi/src/tile/tile.S000066400000000000000000000272431265146633400167620ustar00rootroot00000000000000/* ----------------------------------------------------------------------- tile.S - Copyright (c) 2011 Tilera Corp. Tilera TILEPro and TILE-Gx Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include /* Number of bytes in a register. */ #define REG_SIZE FFI_SIZEOF_ARG /* Number of bytes in stack linkage area for backtracing. A note about the ABI: on entry to a procedure, sp points to a stack slot where it must spill the return address if it's not a leaf. REG_SIZE bytes beyond that is a slot owned by the caller which contains the sp value that the caller had when it was originally entered (i.e. the caller's frame pointer). */ #define LINKAGE_SIZE (2 * REG_SIZE) /* The first 10 registers are used to pass arguments and return values. */ #define NUM_ARG_REGS 10 #ifdef __tilegx__ #define SW st #define LW ld #define BGZT bgtzt #else #define SW sw #define LW lw #define BGZT bgzt #endif /* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], const int_reg_t *stack_args, unsigned long stack_args_bytes, void (*fnaddr)(void)); On entry, REG_ARGS contain the outgoing register values, and STACK_ARGS containts STACK_ARG_BYTES of additional values to be passed on the stack. If STACK_ARG_BYTES is zero, then STACK_ARGS is ignored. When the invoked function returns, the values of r0-r9 are blindly stored back into REG_ARGS for the caller to examine. */ .section .text.ffi_call_tile, "ax", @progbits .align 8 .globl ffi_call_tile FFI_HIDDEN(ffi_call_tile) ffi_call_tile: /* Incoming arguments. */ #define REG_ARGS r0 #define INCOMING_STACK_ARGS r1 #define STACK_ARG_BYTES r2 #define ORIG_FNADDR r3 /* Temporary values. */ #define FRAME_SIZE r10 #define TMP r11 #define TMP2 r12 #define OUTGOING_STACK_ARGS r13 #define REG_ADDR_PTR r14 #define RETURN_REG_ADDR r15 #define FNADDR r16 .cfi_startproc { /* Save return address. */ SW sp, lr .cfi_offset lr, 0 /* Prepare to spill incoming r52. */ addi TMP, sp, -REG_SIZE /* Increase frame size to have room to spill r52 and REG_ARGS. The +7 is to round up mod 8. */ addi FRAME_SIZE, STACK_ARG_BYTES, \ REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 } { /* Round stack frame size to a multiple of 8 to satisfy ABI. */ andi FRAME_SIZE, FRAME_SIZE, -8 /* Compute where to spill REG_ARGS value. */ addi TMP2, sp, -(REG_SIZE * 2) } { /* Spill incoming r52. */ SW TMP, r52 .cfi_offset r52, -REG_SIZE /* Set up our frame pointer. */ move r52, sp .cfi_def_cfa_register r52 /* Push stack frame. */ sub sp, sp, FRAME_SIZE } { /* Prepare to set up stack linkage. */ addi TMP, sp, REG_SIZE /* Prepare to memcpy stack args. */ addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE /* Save REG_ARGS which we will need after we call the subroutine. */ SW TMP2, REG_ARGS } { /* Set up linkage info to hold incoming stack pointer. */ SW TMP, r52 } { /* Skip stack args memcpy if we don't have any stack args (common). */ blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy } .Lmemcpy_stack_args: { /* Load incoming argument from stack_args. */ LW TMP, INCOMING_STACK_ARGS addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE } { /* Store stack argument into outgoing stack argument area. */ SW OUTGOING_STACK_ARGS, TMP addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE } { BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args } .Ldone_stack_args_memcpy: { /* Copy aside ORIG_FNADDR so we can overwrite its register. */ move FNADDR, ORIG_FNADDR /* Prepare to load argument registers. */ addi REG_ADDR_PTR, r0, REG_SIZE /* Load outgoing r0. */ LW r0, r0 } /* Load up argument registers from the REG_ARGS array. */ #define LOAD_REG(REG, PTR) \ { \ LW REG, PTR ; \ addi PTR, PTR, REG_SIZE \ } LOAD_REG(r1, REG_ADDR_PTR) LOAD_REG(r2, REG_ADDR_PTR) LOAD_REG(r3, REG_ADDR_PTR) LOAD_REG(r4, REG_ADDR_PTR) LOAD_REG(r5, REG_ADDR_PTR) LOAD_REG(r6, REG_ADDR_PTR) LOAD_REG(r7, REG_ADDR_PTR) LOAD_REG(r8, REG_ADDR_PTR) LOAD_REG(r9, REG_ADDR_PTR) { /* Call the subroutine. */ jalr FNADDR } { /* Restore original lr. */ LW lr, r52 /* Prepare to recover ARGS, which we spilled earlier. */ addi TMP, r52, -(2 * REG_SIZE) } { /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ LW RETURN_REG_ADDR, TMP /* Prepare to restore original r52. */ addi TMP, r52, -REG_SIZE } { /* Pop stack frame. */ move sp, r52 /* Restore original r52. */ LW r52, TMP } #define STORE_REG(REG, PTR) \ { \ SW PTR, REG ; \ addi PTR, PTR, REG_SIZE \ } /* Return all register values by reference. */ STORE_REG(r0, RETURN_REG_ADDR) STORE_REG(r1, RETURN_REG_ADDR) STORE_REG(r2, RETURN_REG_ADDR) STORE_REG(r3, RETURN_REG_ADDR) STORE_REG(r4, RETURN_REG_ADDR) STORE_REG(r5, RETURN_REG_ADDR) STORE_REG(r6, RETURN_REG_ADDR) STORE_REG(r7, RETURN_REG_ADDR) STORE_REG(r8, RETURN_REG_ADDR) STORE_REG(r9, RETURN_REG_ADDR) { jrp lr } .cfi_endproc .size ffi_call_tile, .-ffi_call_tile /* ffi_closure_tile(...) On entry, lr points to the closure plus 8 bytes, and r10 contains the actual return address. This function simply dumps all register parameters into a stack array and passes the closure, the registers array, and the stack arguments to C code that does all of the actual closure processing. */ .section .text.ffi_closure_tile, "ax", @progbits .align 8 .globl ffi_closure_tile FFI_HIDDEN(ffi_closure_tile) .cfi_startproc /* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ #define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) ffi_closure_tile: { #ifdef __tilegx__ st sp, lr .cfi_offset lr, 0 #else /* Save return address (in r10 due to closure stub wrapper). */ SW sp, r10 .cfi_return_column r10 .cfi_offset r10, 0 #endif /* Compute address for stack frame linkage. */ addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) } { /* Save incoming stack pointer in linkage area. */ SW r10, sp .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) /* Push a new stack frame. */ addli sp, sp, -CLOSURE_FRAME_SIZE .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE } { /* Create pointer to where to start spilling registers. */ addi r10, sp, LINKAGE_SIZE } /* Spill all the incoming registers. */ STORE_REG(r0, r10) STORE_REG(r1, r10) STORE_REG(r2, r10) STORE_REG(r3, r10) STORE_REG(r4, r10) STORE_REG(r5, r10) STORE_REG(r6, r10) STORE_REG(r7, r10) STORE_REG(r8, r10) { /* Save r9. */ SW r10, r9 #ifdef __tilegx__ /* Pointer to closure is passed in r11. */ move r0, r11 #else /* Compute pointer to the closure object. Because the closure starts with a "jal ffi_closure_tile", we can just take the value of lr (a phony return address pointing into the closure) and subtract 8. */ addi r0, lr, -8 #endif /* Compute a pointer to the register arguments we just spilled. */ addi r1, sp, LINKAGE_SIZE } { /* Compute a pointer to the extra stack arguments (if any). */ addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE /* Call C code to deal with all of the grotty details. */ jal ffi_closure_tile_inner } { addli r10, sp, CLOSURE_FRAME_SIZE } { /* Restore the return address. */ LW lr, r10 /* Compute pointer to registers array. */ addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) } /* Return all the register values, which C code may have set. */ LOAD_REG(r0, r10) LOAD_REG(r1, r10) LOAD_REG(r2, r10) LOAD_REG(r3, r10) LOAD_REG(r4, r10) LOAD_REG(r5, r10) LOAD_REG(r6, r10) LOAD_REG(r7, r10) LOAD_REG(r8, r10) LOAD_REG(r9, r10) { /* Pop the frame. */ addli sp, sp, CLOSURE_FRAME_SIZE jrp lr } .cfi_endproc .size ffi_closure_tile, . - ffi_closure_tile /* What follows are code template instructions that get copied to the closure trampoline by ffi_prep_closure_loc. The zeroed operands get replaced by their proper values at runtime. */ .section .text.ffi_template_tramp_tile, "ax", @progbits .align 8 .globl ffi_template_tramp_tile FFI_HIDDEN(ffi_template_tramp_tile) ffi_template_tramp_tile: #ifdef __tilegx__ { moveli r11, 0 /* backpatched to address of containing closure. */ moveli r10, 0 /* backpatched to ffi_closure_tile. */ } /* Note: the following bundle gets generated multiple times depending on the pointer value (esp. useful for -m32 mode). */ { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } #else /* 'jal .' yields a PC-relative offset of zero so we can OR in the right offset at runtime. */ { move r10, lr ; jal . /* ffi_closure_tile */ } #endif .size ffi_template_tramp_tile, . - ffi_template_tramp_tile polyml-5.6/libffi/src/types.c000066400000000000000000000055301265146633400162470ustar00rootroot00000000000000/* ----------------------------------------------------------------------- types.c - Copyright (c) 1996, 1998 Red Hat, Inc. Predefined ffi_types needed by libffi. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ /* Hide the basic type definitions from the header file, so that we can redefine them here as "const". */ #define LIBFFI_HIDE_BASIC_TYPES #include #include /* Type definitions */ #define FFI_TYPEDEF(name, type, id) \ struct struct_align_##name { \ char c; \ type x; \ }; \ const ffi_type ffi_type_##name = { \ sizeof(type), \ offsetof(struct struct_align_##name, x), \ id, NULL \ } /* Size and alignment are fake here. They must not be 0. */ const ffi_type ffi_type_void = { 1, 1, FFI_TYPE_VOID, NULL }; FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8); FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8); FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16); FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16); FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32); FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32); FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64); FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64); FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER); FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT); FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE); #ifdef __alpha__ /* Even if we're not configured to default to 128-bit long double, maintain binary compatibility, as -mlong-double-128 can be used at any time. */ /* Validate the hard-coded number below. */ # if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 # error FFI_TYPE_LONGDOUBLE out of date # endif const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; #elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE); #endif polyml-5.6/libffi/src/x86/000077500000000000000000000000001265146633400153615ustar00rootroot00000000000000polyml-5.6/libffi/src/x86/darwin.S000066400000000000000000000231431265146633400167740ustar00rootroot00000000000000/* ----------------------------------------------------------------------- darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. Copyright (C) 2008 Free Software Foundation, Inc. X86 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef __x86_64__ #define LIBFFI_ASM #include #include .text .globl _ffi_prep_args .align 4 .globl _ffi_call_SYSV _ffi_call_SYSV: .LFB1: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: subl $8,%esp /* Make room for all of the new args. */ movl 16(%ebp),%ecx subl %ecx,%esp movl %esp,%eax /* Place all of the ffi_prep_args in position */ subl $8,%esp pushl 12(%ebp) pushl %eax call *8(%ebp) /* Return stack to previous state and call the function */ addl $16,%esp call *28(%ebp) /* Load %ecx with the return type code */ movl 20(%ebp),%ecx /* Protect %esi. We're going to pop it in the epilogue. */ pushl %esi /* If the return value pointer is NULL, assume no return value. */ cmpl $0,24(%ebp) jne 0f /* Even if there is no space for the return value, we are obliged to handle floating-point values. */ cmpl $FFI_TYPE_FLOAT,%ecx jne noretval fstp %st(0) jmp epilogue 0: .align 4 call 1f .Lstore_table: .long noretval-.Lstore_table /* FFI_TYPE_VOID */ .long retint-.Lstore_table /* FFI_TYPE_INT */ .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ .long retint-.Lstore_table /* FFI_TYPE_POINTER */ .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ 1: pop %esi add (%esi, %ecx, 4), %esi jmp *%esi /* Sign/zero extend as appropriate. */ retsint8: movsbl %al, %eax jmp retint retsint16: movswl %ax, %eax jmp retint retuint8: movzbl %al, %eax jmp retint retuint16: movzwl %ax, %eax jmp retint retfloat: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstps (%ecx) jmp epilogue retdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpl (%ecx) jmp epilogue retlongdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpt (%ecx) jmp epilogue retint64: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) movl %edx,4(%ecx) jmp epilogue retstruct1b: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movb %al,0(%ecx) jmp epilogue retstruct2b: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movw %ax,0(%ecx) jmp epilogue retint: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) retstruct: /* Nothing to do! */ noretval: epilogue: popl %esi movl %ebp,%esp popl %ebp ret .LFE1: .ffi_call_SYSV_end: .align 4 FFI_HIDDEN (ffi_closure_SYSV) .globl _ffi_closure_SYSV _ffi_closure_SYSV: .LFB2: pushl %ebp .LCFI2: movl %esp, %ebp .LCFI3: subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 8(%ebp), %edx movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ movl %ebx, 8(%esp) .LCFI7: call L_ffi_closure_SYSV_inner$stub movl 8(%esp), %ebx movl -12(%ebp), %ecx cmpl $FFI_TYPE_INT, %eax je .Lcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lcls_retllong cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax je .Lcls_retstruct1b cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax je .Lcls_retstruct2b cmpl $FFI_TYPE_STRUCT, %eax je .Lcls_retstruct .Lcls_epilogue: movl %ebp, %esp popl %ebp ret .Lcls_retint: movl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retfloat: flds (%ecx) jmp .Lcls_epilogue .Lcls_retdouble: fldl (%ecx) jmp .Lcls_epilogue .Lcls_retldouble: fldt (%ecx) jmp .Lcls_epilogue .Lcls_retllong: movl (%ecx), %eax movl 4(%ecx), %edx jmp .Lcls_epilogue .Lcls_retstruct1b: movsbl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct2b: movswl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct: lea -8(%ebp),%esp movl %ebp, %esp popl %ebp ret $4 .LFE2: #if !FFI_NO_RAW_API #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) #define CIF_FLAGS_OFFSET 20 .align 4 FFI_HIDDEN (ffi_closure_raw_SYSV) .globl _ffi_closure_raw_SYSV _ffi_closure_raw_SYSV: .LFB3: pushl %ebp .LCFI4: movl %esp, %ebp .LCFI5: pushl %esi .LCFI6: subl $36, %esp movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ movl %edx, 12(%esp) /* user_data */ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ movl %edx, 8(%esp) /* raw_args */ leal -24(%ebp), %edx movl %edx, 4(%esp) /* &res */ movl %esi, (%esp) /* cif */ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ cmpl $FFI_TYPE_INT, %eax je .Lrcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lrcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lrcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lrcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lrcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lrcls_retllong .Lrcls_epilogue: addl $36, %esp popl %esi popl %ebp ret .Lrcls_retint: movl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retfloat: flds -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retdouble: fldl -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retldouble: fldt -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retllong: movl -24(%ebp), %eax movl -20(%ebp), %edx jmp .Lrcls_epilogue .LFE3: #endif .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 L_ffi_closure_SYSV_inner$stub: .indirect_symbol _ffi_closure_SYSV_inner hlt ; hlt ; hlt ; hlt ; hlt .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$0,LECIE1-LSCIE1 .long L$set$0 LSCIE1: .long 0x0 .byte 0x1 .ascii "zR\0" .byte 0x1 .byte 0x7c .byte 0x8 .byte 0x1 .byte 0x10 .byte 0xc .byte 0x5 .byte 0x4 .byte 0x88 .byte 0x1 .align 2 LECIE1: .globl _ffi_call_SYSV.eh _ffi_call_SYSV.eh: LSFDE1: .set L$set$1,LEFDE1-LASFDE1 .long L$set$1 LASFDE1: .long LASFDE1-EH_frame1 .long .LFB1-. .set L$set$2,.LFE1-.LFB1 .long L$set$2 .byte 0x0 .byte 0x4 .set L$set$3,.LCFI0-.LFB1 .long L$set$3 .byte 0xe .byte 0x8 .byte 0x84 .byte 0x2 .byte 0x4 .set L$set$4,.LCFI1-.LCFI0 .long L$set$4 .byte 0xd .byte 0x4 .align 2 LEFDE1: .globl _ffi_closure_SYSV.eh _ffi_closure_SYSV.eh: LSFDE2: .set L$set$5,LEFDE2-LASFDE2 .long L$set$5 LASFDE2: .long LASFDE2-EH_frame1 .long .LFB2-. .set L$set$6,.LFE2-.LFB2 .long L$set$6 .byte 0x0 .byte 0x4 .set L$set$7,.LCFI2-.LFB2 .long L$set$7 .byte 0xe .byte 0x8 .byte 0x84 .byte 0x2 .byte 0x4 .set L$set$8,.LCFI3-.LCFI2 .long L$set$8 .byte 0xd .byte 0x4 .align 2 LEFDE2: #if !FFI_NO_RAW_API .globl _ffi_closure_raw_SYSV.eh _ffi_closure_raw_SYSV.eh: LSFDE3: .set L$set$10,LEFDE3-LASFDE3 .long L$set$10 LASFDE3: .long LASFDE3-EH_frame1 .long .LFB3-. .set L$set$11,.LFE3-.LFB3 .long L$set$11 .byte 0x0 .byte 0x4 .set L$set$12,.LCFI4-.LFB3 .long L$set$12 .byte 0xe .byte 0x8 .byte 0x84 .byte 0x2 .byte 0x4 .set L$set$13,.LCFI5-.LCFI4 .long L$set$13 .byte 0xd .byte 0x4 .byte 0x4 .set L$set$14,.LCFI6-.LCFI5 .long L$set$14 .byte 0x85 .byte 0x3 .align 2 LEFDE3: #endif #endif /* ifndef __x86_64__ */ polyml-5.6/libffi/src/x86/darwin64.S000066400000000000000000000261431265146633400171510ustar00rootroot00000000000000/* ----------------------------------------------------------------------- darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. Copyright (c) 2008 Red Hat, Inc. derived from unix64.S x86-64 Foreign Function Interface for Darwin. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifdef __x86_64__ #define LIBFFI_ASM #include #include .file "darwin64.S" .text /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, void *raddr, void (*fnaddr)(void)); Bit o trickiness here -- ARGS+BYTES is the base of the stack frame for this function. This has been allocated by ffi_call. We also deallocate some of the stack that has been alloca'd. */ .align 3 .globl _ffi_call_unix64 _ffi_call_unix64: LUW0: movq (%rsp), %r10 /* Load return address. */ leaq (%rdi, %rsi), %rax /* Find local stack base. */ movq %rdx, (%rax) /* Save flags. */ movq %rcx, 8(%rax) /* Save raddr. */ movq %rbp, 16(%rax) /* Save old frame pointer. */ movq %r10, 24(%rax) /* Relocate return address. */ movq %rax, %rbp /* Finalize local stack frame. */ LUW1: movq %rdi, %r10 /* Save a copy of the register area. */ movq %r8, %r11 /* Save a copy of the target fn. */ movl %r9d, %eax /* Set number of SSE registers. */ /* Load up all argument registers. */ movq (%r10), %rdi movq 8(%r10), %rsi movq 16(%r10), %rdx movq 24(%r10), %rcx movq 32(%r10), %r8 movq 40(%r10), %r9 testl %eax, %eax jnz Lload_sse Lret_from_load_sse: /* Deallocate the reg arg area. */ leaq 176(%r10), %rsp /* Call the user function. */ call *%r11 /* Deallocate stack arg area; local stack frame in redzone. */ leaq 24(%rbp), %rsp movq 0(%rbp), %rcx /* Reload flags. */ movq 8(%rbp), %rdi /* Reload raddr. */ movq 16(%rbp), %rbp /* Reload old frame pointer. */ LUW2: /* The first byte of the flags contains the FFI_TYPE. */ movzbl %cl, %r10d leaq Lstore_table(%rip), %r11 movslq (%r11, %r10, 4), %r10 addq %r11, %r10 jmp *%r10 Lstore_table: .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ .text .align 3 Lst_void: ret .align 3 Lst_uint8: movzbq %al, %rax movq %rax, (%rdi) ret .align 3 Lst_sint8: movsbq %al, %rax movq %rax, (%rdi) ret .align 3 Lst_uint16: movzwq %ax, %rax movq %rax, (%rdi) .align 3 Lst_sint16: movswq %ax, %rax movq %rax, (%rdi) ret .align 3 Lst_uint32: movl %eax, %eax movq %rax, (%rdi) .align 3 Lst_sint32: cltq movq %rax, (%rdi) ret .align 3 Lst_int64: movq %rax, (%rdi) ret .align 3 Lst_float: movss %xmm0, (%rdi) ret .align 3 Lst_double: movsd %xmm0, (%rdi) ret Lst_ldouble: fstpt (%rdi) ret .align 3 Lst_struct: leaq -20(%rsp), %rsi /* Scratch area in redzone. */ /* We have to locate the values now, and since we don't want to write too much data into the user's return value, we spill the value to a 16 byte scratch area first. Bits 8, 9, and 10 control where the values are located. Only one of the three bits will be set; see ffi_prep_cif_machdep for the pattern. */ movd %xmm0, %r10 movd %xmm1, %r11 testl $0x100, %ecx cmovnz %rax, %rdx cmovnz %r10, %rax testl $0x200, %ecx cmovnz %r10, %rdx testl $0x400, %ecx cmovnz %r10, %rax cmovnz %r11, %rdx movq %rax, (%rsi) movq %rdx, 8(%rsi) /* Bits 12-31 contain the true size of the structure. Copy from the scratch area to the true destination. */ shrl $12, %ecx rep movsb ret /* Many times we can avoid loading any SSE registers at all. It's not worth an indirect jump to load the exact set of SSE registers needed; zero or all is a good compromise. */ .align 3 LUW3: Lload_sse: movdqa 48(%r10), %xmm0 movdqa 64(%r10), %xmm1 movdqa 80(%r10), %xmm2 movdqa 96(%r10), %xmm3 movdqa 112(%r10), %xmm4 movdqa 128(%r10), %xmm5 movdqa 144(%r10), %xmm6 movdqa 160(%r10), %xmm7 jmp Lret_from_load_sse LUW4: .align 3 .globl _ffi_closure_unix64 _ffi_closure_unix64: LUW5: /* The carry flag is set by the trampoline iff SSE registers are used. Don't clobber it before the branch instruction. */ leaq -200(%rsp), %rsp LUW6: movq %rdi, (%rsp) movq %rsi, 8(%rsp) movq %rdx, 16(%rsp) movq %rcx, 24(%rsp) movq %r8, 32(%rsp) movq %r9, 40(%rsp) jc Lsave_sse Lret_from_save_sse: movq %r10, %rdi leaq 176(%rsp), %rsi movq %rsp, %rdx leaq 208(%rsp), %rcx call _ffi_closure_unix64_inner /* Deallocate stack frame early; return value is now in redzone. */ addq $200, %rsp LUW7: /* The first byte of the return value contains the FFI_TYPE. */ movzbl %al, %r10d leaq Lload_table(%rip), %r11 movslq (%r11, %r10, 4), %r10 addq %r11, %r10 jmp *%r10 Lload_table: .long Lld_void-Lload_table /* FFI_TYPE_VOID */ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ .text .align 3 Lld_void: ret .align 3 Lld_int8: movzbl -24(%rsp), %eax ret .align 3 Lld_int16: movzwl -24(%rsp), %eax ret .align 3 Lld_int32: movl -24(%rsp), %eax ret .align 3 Lld_int64: movq -24(%rsp), %rax ret .align 3 Lld_float: movss -24(%rsp), %xmm0 ret .align 3 Lld_double: movsd -24(%rsp), %xmm0 ret .align 3 Lld_ldouble: fldt -24(%rsp) ret .align 3 Lld_struct: /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading both rdx and xmm1 with the second word. For the remaining, bit 8 set means xmm0 gets the second word, and bit 9 means that rax gets the second word. */ movq -24(%rsp), %rcx movq -16(%rsp), %rdx movq -16(%rsp), %xmm1 testl $0x100, %eax cmovnz %rdx, %rcx movd %rcx, %xmm0 testl $0x200, %eax movq -24(%rsp), %rax cmovnz %rdx, %rax ret /* See the comment above Lload_sse; the same logic applies here. */ .align 3 LUW8: Lsave_sse: movdqa %xmm0, 48(%rsp) movdqa %xmm1, 64(%rsp) movdqa %xmm2, 80(%rsp) movdqa %xmm3, 96(%rsp) movdqa %xmm4, 112(%rsp) movdqa %xmm5, 128(%rsp) movdqa %xmm6, 144(%rsp) movdqa %xmm7, 160(%rsp) jmp Lret_from_save_sse LUW9: .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EH_frame1: .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ .long L$set$0 LSCIE1: .long 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ .ascii "zR\0" /* CIE Augmentation */ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ .byte 0x10 /* CIE RA Column */ .byte 0x1 /* uleb128 0x1; Augmentation size */ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ .byte 0x7 /* uleb128 0x7 */ .byte 0x8 /* uleb128 0x8 */ .byte 0x90 /* DW_CFA_offset, column 0x10 */ .byte 0x1 .align 3 LECIE1: .globl _ffi_call_unix64.eh _ffi_call_unix64.eh: LSFDE1: .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ .long L$set$1 LASFDE1: .long LASFDE1-EH_frame1 /* FDE CIE offset */ .quad LUW0-. /* FDE initial location */ .set L$set$2,LUW4-LUW0 /* FDE address range */ .quad L$set$2 .byte 0x0 /* Augmentation size */ .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$3,LUW1-LUW0 .long L$set$3 /* New stack frame based off rbp. This is a itty bit of unwind trickery in that the CFA *has* changed. There is no easy way to describe it correctly on entry to the function. Fortunately, it doesn't matter too much since at all points we can correctly unwind back to ffi_call. Note that the location to which we moved the return address is (the new) CFA-8, so from the perspective of the unwind info, it hasn't moved. */ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ .byte 0x6 .byte 0x20 .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ .byte 0x2 .byte 0xa /* DW_CFA_remember_state */ .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$4,LUW2-LUW1 .long L$set$4 .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ .byte 0x7 .byte 0x8 .byte 0xc0+6 /* DW_CFA_restore, %rbp */ .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$5,LUW3-LUW2 .long L$set$5 .byte 0xb /* DW_CFA_restore_state */ .align 3 LEFDE1: .globl _ffi_closure_unix64.eh _ffi_closure_unix64.eh: LSFDE3: .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ .long L$set$6 LASFDE3: .long LASFDE3-EH_frame1 /* FDE CIE offset */ .quad LUW5-. /* FDE initial location */ .set L$set$7,LUW9-LUW5 /* FDE address range */ .quad L$set$7 .byte 0x0 /* Augmentation size */ .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$8,LUW6-LUW5 .long L$set$8 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 208,1 /* uleb128 208 */ .byte 0xa /* DW_CFA_remember_state */ .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$9,LUW7-LUW6 .long L$set$9 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 .byte 0x4 /* DW_CFA_advance_loc4 */ .set L$set$10,LUW8-LUW7 .long L$set$10 .byte 0xb /* DW_CFA_restore_state */ .align 3 LEFDE3: .subsections_via_symbols #endif /* __x86_64__ */ polyml-5.6/libffi/src/x86/ffi.c000066400000000000000000000576751265146633400163150ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. Copyright (c) 2002 Ranjit Mathew Copyright (c) 2002 Bo Thorsen Copyright (c) 2002 Roger Sayle Copyright (C) 2008, 2010 Free Software Foundation, Inc. x86 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #if !defined(__x86_64__) || defined(_WIN64) #ifdef _WIN64 #include #endif #include #include #include /* ffi_prep_args is called by the assembly routine once stack space has been allocated for the function's arguments */ void ffi_prep_args(char *stack, extended_cif *ecif) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; #ifdef X86_WIN32 size_t p_stack_args[2]; void *p_stack_data[2]; char *argp2 = stack; int stack_args_count = 0; int cabi = ecif->cif->abi; #endif argp = stack; if ((ecif->cif->flags == FFI_TYPE_STRUCT || ecif->cif->flags == FFI_TYPE_MS_STRUCT) #ifdef X86_WIN64 && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2 && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8) #endif ) { *(void **) argp = ecif->rvalue; #ifdef X86_WIN32 /* For fastcall/thiscall this is first register-passed argument. */ if (cabi == FFI_THISCALL || cabi == FFI_FASTCALL) { p_stack_args[stack_args_count] = sizeof (void*); p_stack_data[stack_args_count] = argp; ++stack_args_count; } #endif argp += sizeof(void*); } p_argv = ecif->avalue; for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i != 0; i--, p_arg++) { size_t z; /* Align if necessary */ if ((sizeof(void*) - 1) & (size_t) argp) argp = (char *) ALIGN(argp, sizeof(void*)); z = (*p_arg)->size; #ifdef X86_WIN64 if (z > sizeof(ffi_arg) || ((*p_arg)->type == FFI_TYPE_STRUCT && (z != 1 && z != 2 && z != 4 && z != 8)) #if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE) #endif ) { z = sizeof(ffi_arg); *(void **)argp = *p_argv; } else if ((*p_arg)->type == FFI_TYPE_FLOAT) { memcpy(argp, *p_argv, z); } else #endif if (z < sizeof(ffi_arg)) { z = sizeof(ffi_arg); switch ((*p_arg)->type) { case FFI_TYPE_SINT8: *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv); break; case FFI_TYPE_UINT8: *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv); break; case FFI_TYPE_SINT16: *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv); break; case FFI_TYPE_UINT16: *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv); break; case FFI_TYPE_SINT32: *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv); break; case FFI_TYPE_UINT32: *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv); break; case FFI_TYPE_STRUCT: *(ffi_arg *) argp = *(ffi_arg *)(* p_argv); break; default: FFI_ASSERT(0); } } else { memcpy(argp, *p_argv, z); } #ifdef X86_WIN32 /* For thiscall/fastcall convention register-passed arguments are the first two none-floating-point arguments with a size smaller or equal to sizeof (void*). */ if ((cabi == FFI_THISCALL && stack_args_count < 1) || (cabi == FFI_FASTCALL && stack_args_count < 2)) { if (z <= 4 && ((*p_arg)->type != FFI_TYPE_FLOAT && (*p_arg)->type != FFI_TYPE_STRUCT)) { p_stack_args[stack_args_count] = z; p_stack_data[stack_args_count] = argp; ++stack_args_count; } } #endif p_argv++; #ifdef X86_WIN64 argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); #else argp += z; #endif } #ifdef X86_WIN32 /* We need to move the register-passed arguments for thiscall/fastcall on top of stack, so that those can be moved to registers ecx/edx by call-handler. */ if (stack_args_count > 0) { size_t zz = (p_stack_args[0] + 3) & ~3; char *h; /* Move first argument to top-stack position. */ if (p_stack_data[0] != argp2) { h = alloca (zz + 1); memcpy (h, p_stack_data[0], zz); memmove (argp2 + zz, argp2, (size_t) ((char *) p_stack_data[0] - (char*)argp2)); memcpy (argp2, h, zz); } argp2 += zz; --stack_args_count; if (zz > 4) stack_args_count = 0; /* If we have a second argument, then move it on top after the first one. */ if (stack_args_count > 0 && p_stack_data[1] != argp2) { zz = p_stack_args[1]; zz = (zz + 3) & ~3; h = alloca (zz + 1); h = alloca (zz + 1); memcpy (h, p_stack_data[1], zz); memmove (argp2 + zz, argp2, (size_t) ((char*) p_stack_data[1] - (char*)argp2)); memcpy (argp2, h, zz); } } #endif return; } /* Perform machine dependent cif processing */ ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { unsigned int i; ffi_type **ptr; /* Set the return type flag */ switch (cif->rtype->type) { case FFI_TYPE_VOID: case FFI_TYPE_UINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT8: case FFI_TYPE_SINT16: #ifdef X86_WIN64 case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: #endif case FFI_TYPE_SINT64: case FFI_TYPE_FLOAT: case FFI_TYPE_DOUBLE: #ifndef X86_WIN64 #if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE case FFI_TYPE_LONGDOUBLE: #endif #endif cif->flags = (unsigned) cif->rtype->type; break; case FFI_TYPE_UINT64: #ifdef X86_WIN64 case FFI_TYPE_POINTER: #endif cif->flags = FFI_TYPE_SINT64; break; case FFI_TYPE_STRUCT: #ifndef X86 if (cif->rtype->size == 1) { cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */ } else if (cif->rtype->size == 2) { cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */ } else if (cif->rtype->size == 4) { #ifdef X86_WIN64 cif->flags = FFI_TYPE_SMALL_STRUCT_4B; #else cif->flags = FFI_TYPE_INT; /* same as int type */ #endif } else if (cif->rtype->size == 8) { cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ } else #endif { #ifdef X86_WIN32 if (cif->abi == FFI_MS_CDECL) cif->flags = FFI_TYPE_MS_STRUCT; else #endif cif->flags = FFI_TYPE_STRUCT; /* allocate space for return value pointer */ cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG); } break; default: #ifdef X86_WIN64 cif->flags = FFI_TYPE_SINT64; break; case FFI_TYPE_INT: cif->flags = FFI_TYPE_SINT32; #else cif->flags = FFI_TYPE_INT; #endif break; } for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { if (((*ptr)->alignment - 1) & cif->bytes) cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment); cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG); } #ifdef X86_WIN64 /* ensure space for storing four registers */ cif->bytes += 4 * sizeof(ffi_arg); #endif cif->bytes = (cif->bytes + 15) & ~0xF; return FFI_OK; } #ifdef X86_WIN64 extern int ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); #elif defined(X86_WIN32) extern void ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned, unsigned *, void (*fn)(void)); #else extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, unsigned, unsigned *, void (*fn)(void)); #endif void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ #ifdef X86_WIN64 if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT && cif->rtype->size != 1 && cif->rtype->size != 2 && cif->rtype->size != 4 && cif->rtype->size != 8) { ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF); } #else if (rvalue == NULL && (cif->flags == FFI_TYPE_STRUCT || cif->flags == FFI_TYPE_MS_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } #endif else ecif.rvalue = rvalue; switch (cif->abi) { #ifdef X86_WIN64 case FFI_WIN64: ffi_call_win64(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; #elif defined(X86_WIN32) case FFI_SYSV: case FFI_STDCALL: case FFI_MS_CDECL: ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags, ecif.rvalue, fn); break; case FFI_THISCALL: case FFI_FASTCALL: { unsigned int abi = cif->abi; unsigned int i, passed_regs = 0; if (cif->flags == FFI_TYPE_STRUCT) ++passed_regs; for (i=0; i < cif->nargs && passed_regs < 2;i++) { size_t sz; if (cif->arg_types[i]->type == FFI_TYPE_FLOAT || cif->arg_types[i]->type == FFI_TYPE_STRUCT) continue; sz = (cif->arg_types[i]->size + 3) & ~3; if (sz == 0 || sz > 4) continue; ++passed_regs; } if (passed_regs < 2 && abi == FFI_FASTCALL) abi = FFI_THISCALL; if (passed_regs < 1 && abi == FFI_THISCALL) abi = FFI_STDCALL; ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags, ecif.rvalue, fn); } break; #else case FFI_SYSV: ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; #endif default: FFI_ASSERT(0); break; } } /** private members **/ /* The following __attribute__((regparm(1))) decorations will have no effect on MSVC or SUNPRO_C -- standard conventions apply. */ static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, void** args, ffi_cif* cif); void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) __attribute__ ((regparm(1))); unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) __attribute__ ((regparm(1))); void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) __attribute__ ((regparm(1))); #ifdef X86_WIN32 void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *) __attribute__ ((regparm(1))); void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *) __attribute__ ((regparm(1))); void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *) __attribute__ ((regparm(1))); #endif #ifdef X86_WIN64 void FFI_HIDDEN ffi_closure_win64 (ffi_closure *); #endif /* This function is jumped to by the trampoline */ #ifdef X86_WIN64 void * FFI_HIDDEN ffi_closure_win64_inner (ffi_closure *closure, void *args) { ffi_cif *cif; void **arg_area; void *result; void *resp = &result; cif = closure->cif; arg_area = (void**) alloca (cif->nargs * sizeof (void*)); /* this call will initialize ARG_AREA, such that each * element in that array points to the corresponding * value on the stack; and if the function returns * a structure, it will change RESP to point to the * structure return address. */ ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif); (closure->fun) (cif, resp, arg_area, closure->user_data); /* The result is returned in rax. This does the right thing for result types except for floats; we have to 'mov xmm0, rax' in the caller to correct this. TODO: structure sizes of 3 5 6 7 are returned by reference, too!!! */ return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp; } #else unsigned int FFI_HIDDEN __attribute__ ((regparm(1))) ffi_closure_SYSV_inner (ffi_closure *closure, void **respp, void *args) { /* our various things... */ ffi_cif *cif; void **arg_area; cif = closure->cif; arg_area = (void**) alloca (cif->nargs * sizeof (void*)); /* this call will initialize ARG_AREA, such that each * element in that array points to the corresponding * value on the stack; and if the function returns * a structure, it will change RESP to point to the * structure return address. */ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); (closure->fun) (cif, *respp, arg_area, closure->user_data); return cif->flags; } #endif /* !X86_WIN64 */ static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ffi_cif *cif) { register unsigned int i; register void **p_argv; register char *argp; register ffi_type **p_arg; argp = stack; #ifdef X86_WIN64 if (cif->rtype->size > sizeof(ffi_arg) || (cif->flags == FFI_TYPE_STRUCT && (cif->rtype->size != 1 && cif->rtype->size != 2 && cif->rtype->size != 4 && cif->rtype->size != 8))) { *rvalue = *(void **) argp; argp += sizeof(void *); } #else if ( cif->flags == FFI_TYPE_STRUCT || cif->flags == FFI_TYPE_MS_STRUCT ) { *rvalue = *(void **) argp; argp += sizeof(void *); } #endif p_argv = avalue; for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { size_t z; /* Align if necessary */ if ((sizeof(void*) - 1) & (size_t) argp) { argp = (char *) ALIGN(argp, sizeof(void*)); } #ifdef X86_WIN64 if ((*p_arg)->size > sizeof(ffi_arg) || ((*p_arg)->type == FFI_TYPE_STRUCT && ((*p_arg)->size != 1 && (*p_arg)->size != 2 && (*p_arg)->size != 4 && (*p_arg)->size != 8))) { z = sizeof(void *); *p_argv = *(void **)argp; } else #endif { z = (*p_arg)->size; /* because we're little endian, this is what it turns into. */ *p_argv = (void*) argp; } p_argv++; #ifdef X86_WIN64 argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1); #else argp += z; #endif } return; } #define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \ void* __fun = (void*)(FUN); \ void* __ctx = (void*)(CTX); \ *(unsigned char*) &__tramp[0] = 0x41; \ *(unsigned char*) &__tramp[1] = 0xbb; \ *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \ *(unsigned char*) &__tramp[6] = 0x48; \ *(unsigned char*) &__tramp[7] = 0xb8; \ *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \ *(unsigned char *) &__tramp[16] = 0x49; \ *(unsigned char *) &__tramp[17] = 0xba; \ *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \ *(unsigned char *) &__tramp[26] = 0x41; \ *(unsigned char *) &__tramp[27] = 0xff; \ *(unsigned char *) &__tramp[28] = 0xe2; /* jmp %r10 */ \ } /* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ unsigned int __ctx = (unsigned int)(CTX); \ unsigned int __dis = __fun - (__ctx + 10); \ *(unsigned char*) &__tramp[0] = 0xb8; \ *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ *(unsigned char *) &__tramp[5] = 0xe9; \ *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ } #define FFI_INIT_TRAMPOLINE_THISCALL(TRAMP,FUN,CTX,SIZE) \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ unsigned int __ctx = (unsigned int)(CTX); \ unsigned int __dis = __fun - (__ctx + 49); \ unsigned short __size = (unsigned short)(SIZE); \ *(unsigned int *) &__tramp[0] = 0x8324048b; /* mov (%esp), %eax */ \ *(unsigned int *) &__tramp[4] = 0x4c890cec; /* sub $12, %esp */ \ *(unsigned int *) &__tramp[8] = 0x04890424; /* mov %ecx, 4(%esp) */ \ *(unsigned char*) &__tramp[12] = 0x24; /* mov %eax, (%esp) */ \ *(unsigned char*) &__tramp[13] = 0xb8; \ *(unsigned int *) &__tramp[14] = __size; /* mov __size, %eax */ \ *(unsigned int *) &__tramp[18] = 0x08244c8d; /* lea 8(%esp), %ecx */ \ *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \ *(unsigned short*) &__tramp[26] = 0x0b74; /* jz 1f */ \ *(unsigned int *) &__tramp[28] = 0x8908518b; /* 2b: mov 8(%ecx), %edx */ \ *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %ecx */ \ *(unsigned char*) &__tramp[36] = 0x48; /* dec %eax */ \ *(unsigned short*) &__tramp[37] = 0xf575; /* jnz 2b ; 1f: */ \ *(unsigned char*) &__tramp[39] = 0xb8; \ *(unsigned int*) &__tramp[40] = __ctx; /* movl __ctx, %eax */ \ *(unsigned char *) &__tramp[44] = 0xe8; \ *(unsigned int*) &__tramp[45] = __dis; /* call __fun */ \ *(unsigned char*) &__tramp[49] = 0xc2; /* ret */ \ *(unsigned short*) &__tramp[50] = (__size + 8); /* ret (__size + 8) */ \ } #define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ unsigned int __ctx = (unsigned int)(CTX); \ unsigned int __dis = __fun - (__ctx + 10); \ unsigned short __size = (unsigned short)(SIZE); \ *(unsigned char*) &__tramp[0] = 0xb8; \ *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ *(unsigned char *) &__tramp[5] = 0xe8; \ *(unsigned int*) &__tramp[6] = __dis; /* call __fun */ \ *(unsigned char *) &__tramp[10] = 0xc2; \ *(unsigned short*) &__tramp[11] = __size; /* ret __size */ \ } /* the cif must already be prep'ed */ ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data, void *codeloc) { #ifdef X86_WIN64 #define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE) #define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0) if (cif->abi == FFI_WIN64) { int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3); FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0], &ffi_closure_win64, codeloc, mask); /* make sure we can execute here */ } #else if (cif->abi == FFI_SYSV) { FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, (void*)codeloc); } #ifdef X86_WIN32 else if (cif->abi == FFI_THISCALL) { FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_THISCALL, (void*)codeloc, cif->bytes); } else if (cif->abi == FFI_STDCALL) { FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], &ffi_closure_STDCALL, (void*)codeloc, cif->bytes); } else if (cif->abi == FFI_MS_CDECL) { FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, (void*)codeloc); } #endif /* X86_WIN32 */ #endif /* !X86_WIN64 */ else { return FFI_BAD_ABI; } closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } /* ------- Native raw API support -------------------------------- */ #if !FFI_NO_RAW_API ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc) { int i; if (cif->abi != FFI_SYSV) { #ifdef X86_WIN32 if (cif->abi != FFI_THISCALL) #endif return FFI_BAD_ABI; } /* we currently don't support certain kinds of arguments for raw closures. This should be implemented by a separate assembly language routine, since it would require argument processing, something we don't do now for performance. */ for (i = cif->nargs-1; i >= 0; i--) { FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); } #ifdef X86_WIN32 if (cif->abi == FFI_SYSV) { #endif FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, codeloc); #ifdef X86_WIN32 } else if (cif->abi == FFI_THISCALL) { FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_THISCALL, codeloc, cif->bytes); } #endif closure->cif = cif; closure->user_data = user_data; closure->fun = fun; return FFI_OK; } static void ffi_prep_args_raw(char *stack, extended_cif *ecif) { memcpy (stack, ecif->avalue, ecif->cif->bytes); } /* we borrow this routine from libffi (it must be changed, though, to * actually call the function passed in the first argument. as of * libffi-1.20, this is not the case.) */ void ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue) { extended_cif ecif; void **avalue = (void **)fake_avalue; ecif.cif = cif; ecif.avalue = avalue; /* If the return value is a struct and we don't have a return */ /* value address then we need to make one */ if (rvalue == NULL && (cif->flags == FFI_TYPE_STRUCT || cif->flags == FFI_TYPE_MS_STRUCT)) { ecif.rvalue = alloca(cif->rtype->size); } else ecif.rvalue = rvalue; switch (cif->abi) { #ifdef X86_WIN32 case FFI_SYSV: case FFI_STDCALL: case FFI_MS_CDECL: ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes, cif->flags, ecif.rvalue, fn); break; case FFI_THISCALL: case FFI_FASTCALL: { unsigned int abi = cif->abi; unsigned int i, passed_regs = 0; if (cif->flags == FFI_TYPE_STRUCT) ++passed_regs; for (i=0; i < cif->nargs && passed_regs < 2;i++) { size_t sz; if (cif->arg_types[i]->type == FFI_TYPE_FLOAT || cif->arg_types[i]->type == FFI_TYPE_STRUCT) continue; sz = (cif->arg_types[i]->size + 3) & ~3; if (sz == 0 || sz > 4) continue; ++passed_regs; } if (passed_regs < 2 && abi == FFI_FASTCALL) cif->abi = abi = FFI_THISCALL; if (passed_regs < 1 && abi == FFI_THISCALL) cif->abi = abi = FFI_STDCALL; ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags, ecif.rvalue, fn); } break; #else case FFI_SYSV: ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); break; #endif default: FFI_ASSERT(0); break; } } #endif #endif /* !__x86_64__ || X86_WIN64 */ polyml-5.6/libffi/src/x86/ffi64.c000066400000000000000000000443101265146633400164450ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi64.c - Copyright (c) 2013 The Written Word, Inc. Copyright (c) 2011 Anthony Green Copyright (c) 2008, 2010 Red Hat, Inc. Copyright (c) 2002, 2007 Bo Thorsen x86-64 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include #include #include #ifdef __x86_64__ #define MAX_GPR_REGS 6 #define MAX_SSE_REGS 8 #if defined(__INTEL_COMPILER) #define UINT128 __m128 #else #if defined(__SUNPRO_C) #include #define UINT128 __m128i #else #define UINT128 __int128_t #endif #endif union big_int_union { UINT32 i32; UINT64 i64; UINT128 i128; }; struct register_args { /* Registers for argument passing. */ UINT64 gpr[MAX_GPR_REGS]; union big_int_union sse[MAX_SSE_REGS]; }; extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, void *raddr, void (*fnaddr)(void), unsigned ssecount); /* All reference to register classes here is identical to the code in gcc/config/i386/i386.c. Do *not* change one without the other. */ /* Register class used for passing given 64bit part of the argument. These represent classes as documented by the PS ABI, with the exception of SSESF, SSEDF classes, that are basically SSE class, just gcc will use SF or DFmode move instead of DImode to avoid reformatting penalties. Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves whenever possible (upper half does contain padding). */ enum x86_64_reg_class { X86_64_NO_CLASS, X86_64_INTEGER_CLASS, X86_64_INTEGERSI_CLASS, X86_64_SSE_CLASS, X86_64_SSESF_CLASS, X86_64_SSEDF_CLASS, X86_64_SSEUP_CLASS, X86_64_X87_CLASS, X86_64_X87UP_CLASS, X86_64_COMPLEX_X87_CLASS, X86_64_MEMORY_CLASS }; #define MAX_CLASSES 4 #define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) /* x86-64 register passing implementation. See x86-64 ABI for details. Goal of this code is to classify each 8bytes of incoming argument by the register class and assign registers accordingly. */ /* Return the union class of CLASS1 and CLASS2. See the x86-64 PS ABI for details. */ static enum x86_64_reg_class merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) { /* Rule #1: If both classes are equal, this is the resulting class. */ if (class1 == class2) return class1; /* Rule #2: If one of the classes is NO_CLASS, the resulting class is the other class. */ if (class1 == X86_64_NO_CLASS) return class2; if (class2 == X86_64_NO_CLASS) return class1; /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) return X86_64_MEMORY_CLASS; /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) return X86_64_INTEGERSI_CLASS; if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) return X86_64_INTEGER_CLASS; /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, MEMORY is used. */ if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS || class1 == X86_64_COMPLEX_X87_CLASS || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS || class2 == X86_64_COMPLEX_X87_CLASS) return X86_64_MEMORY_CLASS; /* Rule #6: Otherwise class SSE is used. */ return X86_64_SSE_CLASS; } /* Classify the argument of type TYPE and mode MODE. CLASSES will be filled by the register class used to pass each word of the operand. The number of words is returned. In case the parameter should be passed in memory, 0 is returned. As a special case for zero sized containers, classes[0] will be NO_CLASS and 1 is returned. See the x86-64 PS ABI for details. */ static int classify_argument (ffi_type *type, enum x86_64_reg_class classes[], size_t byte_offset) { switch (type->type) { case FFI_TYPE_UINT8: case FFI_TYPE_SINT8: case FFI_TYPE_UINT16: case FFI_TYPE_SINT16: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: case FFI_TYPE_POINTER: { int size = byte_offset + type->size; if (size <= 4) { classes[0] = X86_64_INTEGERSI_CLASS; return 1; } else if (size <= 8) { classes[0] = X86_64_INTEGER_CLASS; return 1; } else if (size <= 12) { classes[0] = X86_64_INTEGER_CLASS; classes[1] = X86_64_INTEGERSI_CLASS; return 2; } else if (size <= 16) { classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; return 2; } else FFI_ASSERT (0); } case FFI_TYPE_FLOAT: if (!(byte_offset % 8)) classes[0] = X86_64_SSESF_CLASS; else classes[0] = X86_64_SSE_CLASS; return 1; case FFI_TYPE_DOUBLE: classes[0] = X86_64_SSEDF_CLASS; return 1; case FFI_TYPE_LONGDOUBLE: classes[0] = X86_64_X87_CLASS; classes[1] = X86_64_X87UP_CLASS; return 2; case FFI_TYPE_STRUCT: { const int UNITS_PER_WORD = 8; int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ffi_type **ptr; int i; enum x86_64_reg_class subclasses[MAX_CLASSES]; /* If the struct is larger than 32 bytes, pass it on the stack. */ if (type->size > 32) return 0; for (i = 0; i < words; i++) classes[i] = X86_64_NO_CLASS; /* Zero sized arrays or structures are NO_CLASS. We return 0 to signalize memory class, so handle it as special case. */ if (!words) { classes[0] = X86_64_NO_CLASS; return 1; } /* Merge the fields of structure. */ for (ptr = type->elements; *ptr != NULL; ptr++) { int num; byte_offset = ALIGN (byte_offset, (*ptr)->alignment); num = classify_argument (*ptr, subclasses, byte_offset % 8); if (num == 0) return 0; for (i = 0; i < num; i++) { int pos = byte_offset / 8; classes[i + pos] = merge_classes (subclasses[i], classes[i + pos]); } byte_offset += (*ptr)->size; } if (words > 2) { /* When size > 16 bytes, if the first one isn't X86_64_SSE_CLASS or any other ones aren't X86_64_SSEUP_CLASS, everything should be passed in memory. */ if (classes[0] != X86_64_SSE_CLASS) return 0; for (i = 1; i < words; i++) if (classes[i] != X86_64_SSEUP_CLASS) return 0; } /* Final merger cleanup. */ for (i = 0; i < words; i++) { /* If one class is MEMORY, everything should be passed in memory. */ if (classes[i] == X86_64_MEMORY_CLASS) return 0; /* The X86_64_SSEUP_CLASS should be always preceded by X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ if (classes[i] == X86_64_SSEUP_CLASS && classes[i - 1] != X86_64_SSE_CLASS && classes[i - 1] != X86_64_SSEUP_CLASS) { /* The first one should never be X86_64_SSEUP_CLASS. */ FFI_ASSERT (i != 0); classes[i] = X86_64_SSE_CLASS; } /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, everything should be passed in memory. */ if (classes[i] == X86_64_X87UP_CLASS && (classes[i - 1] != X86_64_X87_CLASS)) { /* The first one should never be X86_64_X87UP_CLASS. */ FFI_ASSERT (i != 0); return 0; } } return words; } default: FFI_ASSERT(0); } return 0; /* Never reached. */ } /* Examine the argument and return set number of register required in each class. Return zero iff parameter should be passed in memory, otherwise the number of registers. */ static int examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], _Bool in_return, int *pngpr, int *pnsse) { int i, n, ngpr, nsse; n = classify_argument (type, classes, 0); if (n == 0) return 0; ngpr = nsse = 0; for (i = 0; i < n; ++i) switch (classes[i]) { case X86_64_INTEGER_CLASS: case X86_64_INTEGERSI_CLASS: ngpr++; break; case X86_64_SSE_CLASS: case X86_64_SSESF_CLASS: case X86_64_SSEDF_CLASS: nsse++; break; case X86_64_NO_CLASS: case X86_64_SSEUP_CLASS: break; case X86_64_X87_CLASS: case X86_64_X87UP_CLASS: case X86_64_COMPLEX_X87_CLASS: return in_return != 0; default: abort (); } *pngpr = ngpr; *pnsse = nsse; return n; } /* Perform machine dependent cif processing. */ ffi_status ffi_prep_cif_machdep (ffi_cif *cif) { int gprcount, ssecount, i, avn, n, ngpr, nsse, flags; enum x86_64_reg_class classes[MAX_CLASSES]; size_t bytes; gprcount = ssecount = 0; flags = cif->rtype->type; if (flags != FFI_TYPE_VOID) { n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); if (n == 0) { /* The return value is passed in memory. A pointer to that memory is the first argument. Allocate a register for it. */ gprcount++; /* We don't have to do anything in asm for the return. */ flags = FFI_TYPE_VOID; } else if (flags == FFI_TYPE_STRUCT) { /* Mark which registers the result appears in. */ _Bool sse0 = SSE_CLASS_P (classes[0]); _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); if (sse0 && !sse1) flags |= 1 << 8; else if (!sse0 && sse1) flags |= 1 << 9; else if (sse0 && sse1) flags |= 1 << 10; /* Mark the true size of the structure. */ flags |= cif->rtype->size << 12; } } /* Go over all arguments and determine the way they should be passed. If it's in a register and there is space for it, let that be so. If not, add it's size to the stack byte count. */ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) { if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 || gprcount + ngpr > MAX_GPR_REGS || ssecount + nsse > MAX_SSE_REGS) { long align = cif->arg_types[i]->alignment; if (align < 8) align = 8; bytes = ALIGN (bytes, align); bytes += cif->arg_types[i]->size; } else { gprcount += ngpr; ssecount += nsse; } } if (ssecount) flags |= 1 << 11; cif->flags = flags; cif->bytes = ALIGN (bytes, 8); return FFI_OK; } void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { enum x86_64_reg_class classes[MAX_CLASSES]; char *stack, *argp; ffi_type **arg_types; int gprcount, ssecount, ngpr, nsse, i, avn; _Bool ret_in_memory; struct register_args *reg_args; /* Can't call 32-bit mode from 64-bit mode. */ FFI_ASSERT (cif->abi == FFI_UNIX64); /* If the return value is a struct and we don't have a return value address then we need to make one. Note the setting of flags to VOID above in ffi_prep_cif_machdep. */ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT && (cif->flags & 0xff) == FFI_TYPE_VOID); if (rvalue == NULL && ret_in_memory) rvalue = alloca (cif->rtype->size); /* Allocate the space for the arguments, plus 4 words of temp space. */ stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); reg_args = (struct register_args *) stack; argp = stack + sizeof (struct register_args); gprcount = ssecount = 0; /* If the return value is passed in memory, add the pointer as the first integer argument. */ if (ret_in_memory) reg_args->gpr[gprcount++] = (unsigned long) rvalue; avn = cif->nargs; arg_types = cif->arg_types; for (i = 0; i < avn; ++i) { size_t size = arg_types[i]->size; int n; n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); if (n == 0 || gprcount + ngpr > MAX_GPR_REGS || ssecount + nsse > MAX_SSE_REGS) { long align = arg_types[i]->alignment; /* Stack arguments are *always* at least 8 byte aligned. */ if (align < 8) align = 8; /* Pass this argument in memory. */ argp = (void *) ALIGN (argp, align); memcpy (argp, avalue[i], size); argp += size; } else { /* The argument is passed entirely in registers. */ char *a = (char *) avalue[i]; int j; for (j = 0; j < n; j++, a += 8, size -= 8) { switch (classes[j]) { case X86_64_INTEGER_CLASS: case X86_64_INTEGERSI_CLASS: /* Sign-extend integer arguments passed in general purpose registers, to cope with the fact that LLVM incorrectly assumes that this will be done (the x86-64 PS ABI does not specify this). */ switch (arg_types[i]->type) { case FFI_TYPE_SINT8: *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); break; case FFI_TYPE_SINT16: *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); break; case FFI_TYPE_SINT32: *(SINT64 *)®_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); break; default: reg_args->gpr[gprcount] = 0; memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); } gprcount++; break; case X86_64_SSE_CLASS: case X86_64_SSEDF_CLASS: reg_args->sse[ssecount++].i64 = *(UINT64 *) a; break; case X86_64_SSESF_CLASS: reg_args->sse[ssecount++].i32 = *(UINT32 *) a; break; default: abort(); } } } } ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), cif->flags, rvalue, fn, ssecount); } extern void ffi_closure_unix64(void); ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { volatile unsigned short *tramp; /* Sanity check on the cif ABI. */ { int abi = cif->abi; if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))) return FFI_BAD_ABI; } tramp = (volatile unsigned short *) &closure->tramp[0]; tramp[0] = 0xbb49; /* mov , %r11 */ *((unsigned long long * volatile) &tramp[1]) = (unsigned long) ffi_closure_unix64; tramp[5] = 0xba49; /* mov , %r10 */ *((unsigned long long * volatile) &tramp[6]) = (unsigned long) codeloc; /* Set the carry bit iff the function uses any sse registers. This is clc or stc, together with the first byte of the jmp. */ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; tramp[11] = 0xe3ff; /* jmp *%r11 */ closure->cif = cif; closure->fun = fun; closure->user_data = user_data; return FFI_OK; } int ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue, struct register_args *reg_args, char *argp) { ffi_cif *cif; void **avalue; ffi_type **arg_types; long i, avn; int gprcount, ssecount, ngpr, nsse; int ret; cif = closure->cif; avalue = alloca(cif->nargs * sizeof(void *)); gprcount = ssecount = 0; ret = cif->rtype->type; if (ret != FFI_TYPE_VOID) { enum x86_64_reg_class classes[MAX_CLASSES]; int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); if (n == 0) { /* The return value goes in memory. Arrange for the closure return value to go directly back to the original caller. */ rvalue = (void *) (unsigned long) reg_args->gpr[gprcount++]; /* We don't have to do anything in asm for the return. */ ret = FFI_TYPE_VOID; } else if (ret == FFI_TYPE_STRUCT && n == 2) { /* Mark which register the second word of the structure goes in. */ _Bool sse0 = SSE_CLASS_P (classes[0]); _Bool sse1 = SSE_CLASS_P (classes[1]); if (!sse0 && sse1) ret |= 1 << 8; else if (sse0 && !sse1) ret |= 1 << 9; } } avn = cif->nargs; arg_types = cif->arg_types; for (i = 0; i < avn; ++i) { enum x86_64_reg_class classes[MAX_CLASSES]; int n; n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); if (n == 0 || gprcount + ngpr > MAX_GPR_REGS || ssecount + nsse > MAX_SSE_REGS) { long align = arg_types[i]->alignment; /* Stack arguments are *always* at least 8 byte aligned. */ if (align < 8) align = 8; /* Pass this argument in memory. */ argp = (void *) ALIGN (argp, align); avalue[i] = argp; argp += arg_types[i]->size; } /* If the argument is in a single register, or two consecutive integer registers, then we can use that address directly. */ else if (n == 1 || (n == 2 && !(SSE_CLASS_P (classes[0]) || SSE_CLASS_P (classes[1])))) { /* The argument is in a single register. */ if (SSE_CLASS_P (classes[0])) { avalue[i] = ®_args->sse[ssecount]; ssecount += n; } else { avalue[i] = ®_args->gpr[gprcount]; gprcount += n; } } /* Otherwise, allocate space to make them consecutive. */ else { char *a = alloca (16); int j; avalue[i] = a; for (j = 0; j < n; j++, a += 8) { if (SSE_CLASS_P (classes[j])) memcpy (a, ®_args->sse[ssecount++], 8); else memcpy (a, ®_args->gpr[gprcount++], 8); } } } /* Invoke the closure. */ closure->fun (cif, rvalue, avalue, closure->user_data); /* Tell assembly how to perform return type promotions. */ return ret; } #endif /* __x86_64__ */ polyml-5.6/libffi/src/x86/ffitarget.h000066400000000000000000000076271265146633400175210ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 1996-2003, 2010 Red Hat, Inc. Copyright (C) 2008 Free Software Foundation, Inc. Target configuration macros for x86 and x86-64. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif /* ---- System specific configurations ----------------------------------- */ /* For code common to all platforms on x86 and x86_64. */ #define X86_ANY #if defined (X86_64) && defined (__i386__) #undef X86_64 #define X86 #endif #ifdef X86_WIN64 #define FFI_SIZEOF_ARG 8 #define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ #endif /* ---- Generic type definitions ----------------------------------------- */ #ifndef LIBFFI_ASM #ifdef X86_WIN64 #ifdef _MSC_VER typedef unsigned __int64 ffi_arg; typedef __int64 ffi_sarg; #else typedef unsigned long long ffi_arg; typedef long long ffi_sarg; #endif #else #if defined __x86_64__ && defined __ILP32__ #define FFI_SIZEOF_ARG 8 #define FFI_SIZEOF_JAVA_RAW 4 typedef unsigned long long ffi_arg; typedef long long ffi_sarg; #else typedef unsigned long ffi_arg; typedef signed long ffi_sarg; #endif #endif typedef enum ffi_abi { FFI_FIRST_ABI = 0, /* ---- Intel x86 Win32 ---------- */ #ifdef X86_WIN32 FFI_SYSV, FFI_STDCALL, FFI_THISCALL, FFI_FASTCALL, FFI_MS_CDECL, FFI_LAST_ABI, #ifdef _MSC_VER FFI_DEFAULT_ABI = FFI_MS_CDECL #else FFI_DEFAULT_ABI = FFI_SYSV #endif #elif defined(X86_WIN64) FFI_WIN64, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_WIN64 #else /* ---- Intel x86 and AMD x86-64 - */ FFI_SYSV, FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ FFI_LAST_ABI, #if defined(__i386__) || defined(__i386) FFI_DEFAULT_ABI = FFI_SYSV #else FFI_DEFAULT_ABI = FFI_UNIX64 #endif #endif } ffi_abi; #endif /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) #define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) #if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) #define FFI_TRAMPOLINE_SIZE 24 #define FFI_NATIVE_RAW_API 0 #else #ifdef X86_WIN32 #define FFI_TRAMPOLINE_SIZE 52 #else #ifdef X86_WIN64 #define FFI_TRAMPOLINE_SIZE 29 #define FFI_NATIVE_RAW_API 0 #define FFI_NO_RAW_API 1 #else #define FFI_TRAMPOLINE_SIZE 10 #endif #endif #ifndef X86_WIN64 #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ #endif #endif #endif polyml-5.6/libffi/src/x86/freebsd.S000066400000000000000000000263351265146633400171300ustar00rootroot00000000000000/* ----------------------------------------------------------------------- freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. Copyright (c) 2008 Björn König X86 Foreign Function Interface for FreeBSD Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef __x86_64__ #define LIBFFI_ASM #include #include .text .globl ffi_prep_args .align 4 .globl ffi_call_SYSV .type ffi_call_SYSV,@function ffi_call_SYSV: .LFB1: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: /* Make room for all of the new args. */ movl 16(%ebp),%ecx subl %ecx,%esp movl %esp,%eax /* Place all of the ffi_prep_args in position */ pushl 12(%ebp) pushl %eax call *8(%ebp) /* Return stack to previous state and call the function */ addl $8,%esp call *28(%ebp) /* Load %ecx with the return type code */ movl 20(%ebp),%ecx /* Protect %esi. We're going to pop it in the epilogue. */ pushl %esi /* If the return value pointer is NULL, assume no return value. */ cmpl $0,24(%ebp) jne 0f /* Even if there is no space for the return value, we are obliged to handle floating-point values. */ cmpl $FFI_TYPE_FLOAT,%ecx jne noretval fstp %st(0) jmp epilogue 0: call 1f .Lstore_table: .long noretval-.Lstore_table /* FFI_TYPE_VOID */ .long retint-.Lstore_table /* FFI_TYPE_INT */ .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ .long retint-.Lstore_table /* FFI_TYPE_POINTER */ .long retstruct1b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_1B */ .long retstruct2b-.Lstore_table /* FFI_TYPE_SMALL_STRUCT_2B */ 1: pop %esi add (%esi, %ecx, 4), %esi jmp *%esi /* Sign/zero extend as appropriate. */ retsint8: movsbl %al, %eax jmp retint retsint16: movswl %ax, %eax jmp retint retuint8: movzbl %al, %eax jmp retint retuint16: movzwl %ax, %eax jmp retint retfloat: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstps (%ecx) jmp epilogue retdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpl (%ecx) jmp epilogue retlongdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpt (%ecx) jmp epilogue retint64: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) movl %edx,4(%ecx) jmp epilogue retstruct1b: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movb %al,0(%ecx) jmp epilogue retstruct2b: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movw %ax,0(%ecx) jmp epilogue retint: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) retstruct: /* Nothing to do! */ noretval: epilogue: popl %esi movl %ebp,%esp popl %ebp ret .LFE1: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV .align 4 FFI_HIDDEN (ffi_closure_SYSV) .globl ffi_closure_SYSV .type ffi_closure_SYSV, @function ffi_closure_SYSV: .LFB2: pushl %ebp .LCFI2: movl %esp, %ebp .LCFI3: subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 8(%ebp), %edx movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ #if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ call ffi_closure_SYSV_inner #else movl %ebx, 8(%esp) .LCFI7: call 1f 1: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx call ffi_closure_SYSV_inner@PLT movl 8(%esp), %ebx #endif movl -12(%ebp), %ecx cmpl $FFI_TYPE_INT, %eax je .Lcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lcls_retllong cmpl $FFI_TYPE_SMALL_STRUCT_1B, %eax je .Lcls_retstruct1b cmpl $FFI_TYPE_SMALL_STRUCT_2B, %eax je .Lcls_retstruct2b cmpl $FFI_TYPE_STRUCT, %eax je .Lcls_retstruct .Lcls_epilogue: movl %ebp, %esp popl %ebp ret .Lcls_retint: movl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retfloat: flds (%ecx) jmp .Lcls_epilogue .Lcls_retdouble: fldl (%ecx) jmp .Lcls_epilogue .Lcls_retldouble: fldt (%ecx) jmp .Lcls_epilogue .Lcls_retllong: movl (%ecx), %eax movl 4(%ecx), %edx jmp .Lcls_epilogue .Lcls_retstruct1b: movsbl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct2b: movswl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct: movl %ebp, %esp popl %ebp ret $4 .LFE2: .size ffi_closure_SYSV, .-ffi_closure_SYSV #if !FFI_NO_RAW_API #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) #define CIF_FLAGS_OFFSET 20 .align 4 FFI_HIDDEN (ffi_closure_raw_SYSV) .globl ffi_closure_raw_SYSV .type ffi_closure_raw_SYSV, @function ffi_closure_raw_SYSV: .LFB3: pushl %ebp .LCFI4: movl %esp, %ebp .LCFI5: pushl %esi .LCFI6: subl $36, %esp movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ movl %edx, 12(%esp) /* user_data */ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ movl %edx, 8(%esp) /* raw_args */ leal -24(%ebp), %edx movl %edx, 4(%esp) /* &res */ movl %esi, (%esp) /* cif */ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ cmpl $FFI_TYPE_INT, %eax je .Lrcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lrcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lrcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lrcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lrcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lrcls_retllong .Lrcls_epilogue: addl $36, %esp popl %esi popl %ebp ret .Lrcls_retint: movl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retfloat: flds -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retdouble: fldl -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retldouble: fldt -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retllong: movl -24(%ebp), %eax movl -20(%ebp), %edx jmp .Lrcls_epilogue .LFE3: .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV #endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .long 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #ifdef __PIC__ .ascii "zR\0" /* CIE Augmentation */ #else .ascii "\0" /* CIE Augmentation */ #endif .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ .byte 0x8 /* CIE RA Column */ #ifdef __PIC__ .byte 0x1 /* .uleb128 0x1; Augmentation size */ .byte 0x1b /* FDE Encoding (pcrel sdata4) */ #endif .byte 0xc /* DW_CFA_def_cfa */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x88 /* DW_CFA_offset, column 0x8 */ .byte 0x1 /* .uleb128 0x1 */ .align 4 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .long .LASFDE1-.Lframe1 /* FDE CIE offset */ #ifdef __PIC__ .long .LFB1-. /* FDE initial location */ #else .long .LFB1 /* FDE initial location */ #endif .long .LFE1-.LFB1 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI0-.LFB1 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI1-.LCFI0 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ .align 4 .LEFDE1: .LSFDE2: .long .LEFDE2-.LASFDE2 /* FDE Length */ .LASFDE2: .long .LASFDE2-.Lframe1 /* FDE CIE offset */ #ifdef __PIC__ .long .LFB2-. /* FDE initial location */ #else .long .LFB2 #endif .long .LFE2-.LFB2 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI2-.LFB2 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI3-.LCFI2 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ #if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI7-.LCFI3 .byte 0x83 /* DW_CFA_offset, column 0x3 */ .byte 0xa /* .uleb128 0xa */ #endif .align 4 .LEFDE2: #if !FFI_NO_RAW_API .LSFDE3: .long .LEFDE3-.LASFDE3 /* FDE Length */ .LASFDE3: .long .LASFDE3-.Lframe1 /* FDE CIE offset */ #ifdef __PIC__ .long .LFB3-. /* FDE initial location */ #else .long .LFB3 #endif .long .LFE3-.LFB3 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI4-.LFB3 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI5-.LCFI4 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI6-.LCFI5 .byte 0x86 /* DW_CFA_offset, column 0x6 */ .byte 0x3 /* .uleb128 0x3 */ .align 4 .LEFDE3: #endif #endif /* ifndef __x86_64__ */ polyml-5.6/libffi/src/x86/sysv.S000066400000000000000000000302021265146633400165060ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. X86 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef __x86_64__ #define LIBFFI_ASM #include #include .text .globl ffi_prep_args .align 4 .globl ffi_call_SYSV .type ffi_call_SYSV,@function ffi_call_SYSV: .LFB1: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: /* Make room for all of the new args. */ movl 16(%ebp),%ecx subl %ecx,%esp /* Align the stack pointer to 16-bytes */ andl $0xfffffff0, %esp movl %esp,%eax /* Place all of the ffi_prep_args in position */ pushl 12(%ebp) pushl %eax call *8(%ebp) /* Return stack to previous state and call the function */ addl $8,%esp call *28(%ebp) /* Load %ecx with the return type code */ movl 20(%ebp),%ecx /* Protect %esi. We're going to pop it in the epilogue. */ pushl %esi /* If the return value pointer is NULL, assume no return value. */ cmpl $0,24(%ebp) jne 0f /* Even if there is no space for the return value, we are obliged to handle floating-point values. */ cmpl $FFI_TYPE_FLOAT,%ecx jne noretval fstp %st(0) jmp epilogue 0: call 1f .Lstore_table: .long noretval-.Lstore_table /* FFI_TYPE_VOID */ .long retint-.Lstore_table /* FFI_TYPE_INT */ .long retfloat-.Lstore_table /* FFI_TYPE_FLOAT */ .long retdouble-.Lstore_table /* FFI_TYPE_DOUBLE */ .long retlongdouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ .long retuint8-.Lstore_table /* FFI_TYPE_UINT8 */ .long retsint8-.Lstore_table /* FFI_TYPE_SINT8 */ .long retuint16-.Lstore_table /* FFI_TYPE_UINT16 */ .long retsint16-.Lstore_table /* FFI_TYPE_SINT16 */ .long retint-.Lstore_table /* FFI_TYPE_UINT32 */ .long retint-.Lstore_table /* FFI_TYPE_SINT32 */ .long retint64-.Lstore_table /* FFI_TYPE_UINT64 */ .long retint64-.Lstore_table /* FFI_TYPE_SINT64 */ .long retstruct-.Lstore_table /* FFI_TYPE_STRUCT */ .long retint-.Lstore_table /* FFI_TYPE_POINTER */ 1: pop %esi add (%esi, %ecx, 4), %esi jmp *%esi /* Sign/zero extend as appropriate. */ retsint8: movsbl %al, %eax jmp retint retsint16: movswl %ax, %eax jmp retint retuint8: movzbl %al, %eax jmp retint retuint16: movzwl %ax, %eax jmp retint retfloat: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstps (%ecx) jmp epilogue retdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpl (%ecx) jmp epilogue retlongdouble: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx fstpt (%ecx) jmp epilogue retint64: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) movl %edx,4(%ecx) jmp epilogue retint: /* Load %ecx with the pointer to storage for the return value */ movl 24(%ebp),%ecx movl %eax,0(%ecx) retstruct: /* Nothing to do! */ noretval: epilogue: popl %esi movl %ebp,%esp popl %ebp ret .LFE1: .ffi_call_SYSV_end: .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV .align 4 FFI_HIDDEN (ffi_closure_SYSV) .globl ffi_closure_SYSV .type ffi_closure_SYSV, @function ffi_closure_SYSV: .LFB2: pushl %ebp .LCFI2: movl %esp, %ebp .LCFI3: subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 8(%ebp), %edx #ifdef __SUNPRO_C /* The SUNPRO compiler doesn't support GCC's regparm function attribute, so we have to pass all three arguments to ffi_closure_SYSV_inner on the stack. */ movl %edx, 8(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, 4(%esp) /* &resp */ movl %eax, (%esp) /* closure */ #else movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ #endif #if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__ call ffi_closure_SYSV_inner #else movl %ebx, 8(%esp) .LCFI7: call 1f 1: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx call ffi_closure_SYSV_inner@PLT movl 8(%esp), %ebx #endif movl -12(%ebp), %ecx cmpl $FFI_TYPE_INT, %eax je .Lcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lcls_retllong cmpl $FFI_TYPE_STRUCT, %eax je .Lcls_retstruct .Lcls_epilogue: movl %ebp, %esp popl %ebp ret .Lcls_retint: movl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retfloat: flds (%ecx) jmp .Lcls_epilogue .Lcls_retdouble: fldl (%ecx) jmp .Lcls_epilogue .Lcls_retldouble: fldt (%ecx) jmp .Lcls_epilogue .Lcls_retllong: movl (%ecx), %eax movl 4(%ecx), %edx jmp .Lcls_epilogue .Lcls_retstruct: movl %ebp, %esp popl %ebp ret $4 .LFE2: .size ffi_closure_SYSV, .-ffi_closure_SYSV #if !FFI_NO_RAW_API /* Precalculate for e.g. the Solaris 10/x86 assembler. */ #if FFI_TRAMPOLINE_SIZE == 10 #define RAW_CLOSURE_CIF_OFFSET 12 #define RAW_CLOSURE_FUN_OFFSET 16 #define RAW_CLOSURE_USER_DATA_OFFSET 20 #elif FFI_TRAMPOLINE_SIZE == 24 #define RAW_CLOSURE_CIF_OFFSET 24 #define RAW_CLOSURE_FUN_OFFSET 28 #define RAW_CLOSURE_USER_DATA_OFFSET 32 #else #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) #endif #define CIF_FLAGS_OFFSET 20 .align 4 FFI_HIDDEN (ffi_closure_raw_SYSV) .globl ffi_closure_raw_SYSV .type ffi_closure_raw_SYSV, @function ffi_closure_raw_SYSV: .LFB3: pushl %ebp .LCFI4: movl %esp, %ebp .LCFI5: pushl %esi .LCFI6: subl $36, %esp movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ movl %edx, 12(%esp) /* user_data */ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ movl %edx, 8(%esp) /* raw_args */ leal -24(%ebp), %edx movl %edx, 4(%esp) /* &res */ movl %esi, (%esp) /* cif */ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ cmpl $FFI_TYPE_INT, %eax je .Lrcls_retint /* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32. */ cmpl $FFI_TYPE_UINT64, %eax jge 0f cmpl $FFI_TYPE_UINT8, %eax jge .Lrcls_retint 0: cmpl $FFI_TYPE_FLOAT, %eax je .Lrcls_retfloat cmpl $FFI_TYPE_DOUBLE, %eax je .Lrcls_retdouble cmpl $FFI_TYPE_LONGDOUBLE, %eax je .Lrcls_retldouble cmpl $FFI_TYPE_SINT64, %eax je .Lrcls_retllong .Lrcls_epilogue: addl $36, %esp popl %esi popl %ebp ret .Lrcls_retint: movl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retfloat: flds -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retdouble: fldl -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retldouble: fldt -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retllong: movl -24(%ebp), %eax movl -20(%ebp), %edx jmp .Lrcls_epilogue .LFE3: .size ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV #endif #if defined __GNUC__ /* Only emit dwarf unwind info when building with GNU toolchain. */ #if defined __PIC__ # if defined __sun__ && defined __svr4__ /* 32-bit Solaris 2/x86 uses datarel encoding for PIC. GNU ld before 2.22 doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this. */ # define FDE_ENCODING 0x30 /* datarel */ # define FDE_ENCODE(X) X@GOTOFF # else # define FDE_ENCODING 0x1b /* pcrel sdata4 */ # if defined HAVE_AS_X86_PCREL # define FDE_ENCODE(X) X-. # else # define FDE_ENCODE(X) X@rel # endif # endif #else # define FDE_ENCODING 0 /* absolute */ # define FDE_ENCODE(X) X #endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: .long .LECIE1-.LSCIE1 /* Length of Common Information Entry */ .LSCIE1: .long 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #ifdef HAVE_AS_ASCII_PSEUDO_OP #ifdef __PIC__ .ascii "zR\0" /* CIE Augmentation */ #else .ascii "\0" /* CIE Augmentation */ #endif #elif defined HAVE_AS_STRING_PSEUDO_OP #ifdef __PIC__ .string "zR" /* CIE Augmentation */ #else .string "" /* CIE Augmentation */ #endif #else #error missing .ascii/.string #endif .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ .byte 0x8 /* CIE RA Column */ #ifdef __PIC__ .byte 0x1 /* .uleb128 0x1; Augmentation size */ .byte FDE_ENCODING #endif .byte 0xc /* DW_CFA_def_cfa */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x88 /* DW_CFA_offset, column 0x8 */ .byte 0x1 /* .uleb128 0x1 */ .align 4 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .long .LASFDE1-.Lframe1 /* FDE CIE offset */ .long FDE_ENCODE(.LFB1) /* FDE initial location */ .long .LFE1-.LFB1 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI0-.LFB1 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI1-.LCFI0 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ .align 4 .LEFDE1: .LSFDE2: .long .LEFDE2-.LASFDE2 /* FDE Length */ .LASFDE2: .long .LASFDE2-.Lframe1 /* FDE CIE offset */ .long FDE_ENCODE(.LFB2) /* FDE initial location */ .long .LFE2-.LFB2 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI2-.LFB2 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI3-.LCFI2 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ #if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI7-.LCFI3 .byte 0x83 /* DW_CFA_offset, column 0x3 */ .byte 0xa /* .uleb128 0xa */ #endif .align 4 .LEFDE2: #if !FFI_NO_RAW_API .LSFDE3: .long .LEFDE3-.LASFDE3 /* FDE Length */ .LASFDE3: .long .LASFDE3-.Lframe1 /* FDE CIE offset */ .long FDE_ENCODE(.LFB3) /* FDE initial location */ .long .LFE3-.LFB3 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI4-.LFB3 .byte 0xe /* DW_CFA_def_cfa_offset */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI5-.LCFI4 .byte 0xd /* DW_CFA_def_cfa_register */ .byte 0x5 /* .uleb128 0x5 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI6-.LCFI5 .byte 0x86 /* DW_CFA_offset, column 0x6 */ .byte 0x3 /* .uleb128 0x3 */ .align 4 .LEFDE3: #endif #endif #endif /* ifndef __x86_64__ */ #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/x86/unix64.S000066400000000000000000000264631265146633400166550ustar00rootroot00000000000000/* ----------------------------------------------------------------------- unix64.S - Copyright (c) 2013 The Written Word, Inc. - Copyright (c) 2008 Red Hat, Inc - Copyright (c) 2002 Bo Thorsen x86-64 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifdef __x86_64__ #define LIBFFI_ASM #include #include .text /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, void *raddr, void (*fnaddr)(void)); Bit o trickiness here -- ARGS+BYTES is the base of the stack frame for this function. This has been allocated by ffi_call. We also deallocate some of the stack that has been alloca'd. */ .align 2 .globl ffi_call_unix64 .type ffi_call_unix64,@function ffi_call_unix64: .LUW0: movq (%rsp), %r10 /* Load return address. */ leaq (%rdi, %rsi), %rax /* Find local stack base. */ movq %rdx, (%rax) /* Save flags. */ movq %rcx, 8(%rax) /* Save raddr. */ movq %rbp, 16(%rax) /* Save old frame pointer. */ movq %r10, 24(%rax) /* Relocate return address. */ movq %rax, %rbp /* Finalize local stack frame. */ .LUW1: movq %rdi, %r10 /* Save a copy of the register area. */ movq %r8, %r11 /* Save a copy of the target fn. */ movl %r9d, %eax /* Set number of SSE registers. */ /* Load up all argument registers. */ movq (%r10), %rdi movq 8(%r10), %rsi movq 16(%r10), %rdx movq 24(%r10), %rcx movq 32(%r10), %r8 movq 40(%r10), %r9 testl %eax, %eax jnz .Lload_sse .Lret_from_load_sse: /* Deallocate the reg arg area. */ leaq 176(%r10), %rsp /* Call the user function. */ call *%r11 /* Deallocate stack arg area; local stack frame in redzone. */ leaq 24(%rbp), %rsp movq 0(%rbp), %rcx /* Reload flags. */ movq 8(%rbp), %rdi /* Reload raddr. */ movq 16(%rbp), %rbp /* Reload old frame pointer. */ .LUW2: /* The first byte of the flags contains the FFI_TYPE. */ movzbl %cl, %r10d leaq .Lstore_table(%rip), %r11 movslq (%r11, %r10, 4), %r10 addq %r11, %r10 jmp *%r10 .Lstore_table: .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */ .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */ .long .Lst_float-.Lstore_table /* FFI_TYPE_FLOAT */ .long .Lst_double-.Lstore_table /* FFI_TYPE_DOUBLE */ .long .Lst_ldouble-.Lstore_table /* FFI_TYPE_LONGDOUBLE */ .long .Lst_uint8-.Lstore_table /* FFI_TYPE_UINT8 */ .long .Lst_sint8-.Lstore_table /* FFI_TYPE_SINT8 */ .long .Lst_uint16-.Lstore_table /* FFI_TYPE_UINT16 */ .long .Lst_sint16-.Lstore_table /* FFI_TYPE_SINT16 */ .long .Lst_uint32-.Lstore_table /* FFI_TYPE_UINT32 */ .long .Lst_sint32-.Lstore_table /* FFI_TYPE_SINT32 */ .long .Lst_int64-.Lstore_table /* FFI_TYPE_UINT64 */ .long .Lst_int64-.Lstore_table /* FFI_TYPE_SINT64 */ .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */ .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */ .align 2 .Lst_void: ret .align 2 .Lst_uint8: movzbq %al, %rax movq %rax, (%rdi) ret .align 2 .Lst_sint8: movsbq %al, %rax movq %rax, (%rdi) ret .align 2 .Lst_uint16: movzwq %ax, %rax movq %rax, (%rdi) .align 2 .Lst_sint16: movswq %ax, %rax movq %rax, (%rdi) ret .align 2 .Lst_uint32: movl %eax, %eax movq %rax, (%rdi) .align 2 .Lst_sint32: cltq movq %rax, (%rdi) ret .align 2 .Lst_int64: movq %rax, (%rdi) ret .align 2 .Lst_float: movss %xmm0, (%rdi) ret .align 2 .Lst_double: movsd %xmm0, (%rdi) ret .Lst_ldouble: fstpt (%rdi) ret .align 2 .Lst_struct: leaq -20(%rsp), %rsi /* Scratch area in redzone. */ /* We have to locate the values now, and since we don't want to write too much data into the user's return value, we spill the value to a 16 byte scratch area first. Bits 8, 9, and 10 control where the values are located. Only one of the three bits will be set; see ffi_prep_cif_machdep for the pattern. */ movd %xmm0, %r10 movd %xmm1, %r11 testl $0x100, %ecx cmovnz %rax, %rdx cmovnz %r10, %rax testl $0x200, %ecx cmovnz %r10, %rdx testl $0x400, %ecx cmovnz %r10, %rax cmovnz %r11, %rdx movq %rax, (%rsi) movq %rdx, 8(%rsi) /* Bits 12-31 contain the true size of the structure. Copy from the scratch area to the true destination. */ shrl $12, %ecx rep movsb ret /* Many times we can avoid loading any SSE registers at all. It's not worth an indirect jump to load the exact set of SSE registers needed; zero or all is a good compromise. */ .align 2 .LUW3: .Lload_sse: movdqa 48(%r10), %xmm0 movdqa 64(%r10), %xmm1 movdqa 80(%r10), %xmm2 movdqa 96(%r10), %xmm3 movdqa 112(%r10), %xmm4 movdqa 128(%r10), %xmm5 movdqa 144(%r10), %xmm6 movdqa 160(%r10), %xmm7 jmp .Lret_from_load_sse .LUW4: .size ffi_call_unix64,.-ffi_call_unix64 .align 2 .globl ffi_closure_unix64 .type ffi_closure_unix64,@function ffi_closure_unix64: .LUW5: /* The carry flag is set by the trampoline iff SSE registers are used. Don't clobber it before the branch instruction. */ leaq -200(%rsp), %rsp .LUW6: movq %rdi, (%rsp) movq %rsi, 8(%rsp) movq %rdx, 16(%rsp) movq %rcx, 24(%rsp) movq %r8, 32(%rsp) movq %r9, 40(%rsp) jc .Lsave_sse .Lret_from_save_sse: movq %r10, %rdi leaq 176(%rsp), %rsi movq %rsp, %rdx leaq 208(%rsp), %rcx call ffi_closure_unix64_inner@PLT /* Deallocate stack frame early; return value is now in redzone. */ addq $200, %rsp .LUW7: /* The first byte of the return value contains the FFI_TYPE. */ movzbl %al, %r10d leaq .Lload_table(%rip), %r11 movslq (%r11, %r10, 4), %r10 addq %r11, %r10 jmp *%r10 .Lload_table: .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */ .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */ .long .Lld_float-.Lload_table /* FFI_TYPE_FLOAT */ .long .Lld_double-.Lload_table /* FFI_TYPE_DOUBLE */ .long .Lld_ldouble-.Lload_table /* FFI_TYPE_LONGDOUBLE */ .long .Lld_int8-.Lload_table /* FFI_TYPE_UINT8 */ .long .Lld_int8-.Lload_table /* FFI_TYPE_SINT8 */ .long .Lld_int16-.Lload_table /* FFI_TYPE_UINT16 */ .long .Lld_int16-.Lload_table /* FFI_TYPE_SINT16 */ .long .Lld_int32-.Lload_table /* FFI_TYPE_UINT32 */ .long .Lld_int32-.Lload_table /* FFI_TYPE_SINT32 */ .long .Lld_int64-.Lload_table /* FFI_TYPE_UINT64 */ .long .Lld_int64-.Lload_table /* FFI_TYPE_SINT64 */ .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */ .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */ .align 2 .Lld_void: ret .align 2 .Lld_int8: movzbl -24(%rsp), %eax ret .align 2 .Lld_int16: movzwl -24(%rsp), %eax ret .align 2 .Lld_int32: movl -24(%rsp), %eax ret .align 2 .Lld_int64: movq -24(%rsp), %rax ret .align 2 .Lld_float: movss -24(%rsp), %xmm0 ret .align 2 .Lld_double: movsd -24(%rsp), %xmm0 ret .align 2 .Lld_ldouble: fldt -24(%rsp) ret .align 2 .Lld_struct: /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading both rdx and xmm1 with the second word. For the remaining, bit 8 set means xmm0 gets the second word, and bit 9 means that rax gets the second word. */ movq -24(%rsp), %rcx movq -16(%rsp), %rdx movq -16(%rsp), %xmm1 testl $0x100, %eax cmovnz %rdx, %rcx movd %rcx, %xmm0 testl $0x200, %eax movq -24(%rsp), %rax cmovnz %rdx, %rax ret /* See the comment above .Lload_sse; the same logic applies here. */ .align 2 .LUW8: .Lsave_sse: movdqa %xmm0, 48(%rsp) movdqa %xmm1, 64(%rsp) movdqa %xmm2, 80(%rsp) movdqa %xmm3, 96(%rsp) movdqa %xmm4, 112(%rsp) movdqa %xmm5, 128(%rsp) movdqa %xmm6, 144(%rsp) movdqa %xmm7, 160(%rsp) jmp .Lret_from_save_sse .LUW9: .size ffi_closure_unix64,.-ffi_closure_unix64 #ifdef __GNUC__ /* Only emit DWARF unwind info when building with the GNU toolchain. */ #ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE .section .eh_frame,"a",@unwind #else .section .eh_frame,"a",@progbits #endif .Lframe1: .long .LECIE1-.LSCIE1 /* CIE Length */ .LSCIE1: .long 0 /* CIE Identifier Tag */ .byte 1 /* CIE Version */ .ascii "zR\0" /* CIE Augmentation */ .uleb128 1 /* CIE Code Alignment Factor */ .sleb128 -8 /* CIE Data Alignment Factor */ .byte 0x10 /* CIE RA Column */ .uleb128 1 /* Augmentation size */ .byte 0x1b /* FDE Encoding (pcrel sdata4) */ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ .uleb128 7 .uleb128 8 .byte 0x80+16 /* DW_CFA_offset, %rip offset 1*-8 */ .uleb128 1 .align 8 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .long .LASFDE1-.Lframe1 /* FDE CIE offset */ #if HAVE_AS_X86_PCREL .long .LUW0-. /* FDE initial location */ #else .long .LUW0@rel #endif .long .LUW4-.LUW0 /* FDE address range */ .uleb128 0x0 /* Augmentation size */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW1-.LUW0 /* New stack frame based off rbp. This is a itty bit of unwind trickery in that the CFA *has* changed. There is no easy way to describe it correctly on entry to the function. Fortunately, it doesn't matter too much since at all points we can correctly unwind back to ffi_call. Note that the location to which we moved the return address is (the new) CFA-8, so from the perspective of the unwind info, it hasn't moved. */ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ .uleb128 6 .uleb128 32 .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ .uleb128 2 .byte 0xa /* DW_CFA_remember_state */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW2-.LUW1 .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ .uleb128 7 .uleb128 8 .byte 0xc0+6 /* DW_CFA_restore, %rbp */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW3-.LUW2 .byte 0xb /* DW_CFA_restore_state */ .align 8 .LEFDE1: .LSFDE3: .long .LEFDE3-.LASFDE3 /* FDE Length */ .LASFDE3: .long .LASFDE3-.Lframe1 /* FDE CIE offset */ #if HAVE_AS_X86_PCREL .long .LUW5-. /* FDE initial location */ #else .long .LUW5@rel #endif .long .LUW9-.LUW5 /* FDE address range */ .uleb128 0x0 /* Augmentation size */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW6-.LUW5 .byte 0xe /* DW_CFA_def_cfa_offset */ .uleb128 208 .byte 0xa /* DW_CFA_remember_state */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW7-.LUW6 .byte 0xe /* DW_CFA_def_cfa_offset */ .uleb128 8 .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LUW8-.LUW7 .byte 0xb /* DW_CFA_restore_state */ .align 8 .LEFDE3: #endif /* __GNUC__ */ #endif /* __x86_64__ */ #if defined __ELF__ && defined __linux__ .section .note.GNU-stack,"",@progbits #endif polyml-5.6/libffi/src/x86/win32.S000066400000000000000000000767441265146633400164710ustar00rootroot00000000000000/* ----------------------------------------------------------------------- win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc. Copyright (c) 2001 John Beniton Copyright (c) 2002 Ranjit Mathew Copyright (c) 2009 Daniel Witte X86 Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #ifdef _MSC_VER .386 .MODEL FLAT, C EXTRN ffi_closure_SYSV_inner:NEAR _TEXT SEGMENT ffi_call_win32 PROC NEAR, ffi_prep_args : NEAR PTR DWORD, ecif : NEAR PTR DWORD, cif_abi : DWORD, cif_bytes : DWORD, cif_flags : DWORD, rvalue : NEAR PTR DWORD, fn : NEAR PTR DWORD ;; Make room for all of the new args. mov ecx, cif_bytes sub esp, ecx mov eax, esp ;; Place all of the ffi_prep_args in position push ecif push eax call ffi_prep_args ;; Return stack to previous state and call the function add esp, 8 ;; Handle thiscall and fastcall cmp cif_abi, 3 ;; FFI_THISCALL jz do_thiscall cmp cif_abi, 4 ;; FFI_FASTCALL jnz do_stdcall mov ecx, DWORD PTR [esp] mov edx, DWORD PTR [esp+4] add esp, 8 jmp do_stdcall do_thiscall: mov ecx, DWORD PTR [esp] add esp, 4 do_stdcall: call fn ;; cdecl: we restore esp in the epilogue, so there's no need to ;; remove the space we pushed for the args. ;; stdcall: the callee has already cleaned the stack. ;; Load ecx with the return type code mov ecx, cif_flags ;; If the return value pointer is NULL, assume no return value. cmp rvalue, 0 jne ca_jumptable ;; Even if there is no space for the return value, we are ;; obliged to handle floating-point values. cmp ecx, FFI_TYPE_FLOAT jne ca_epilogue fstp st(0) jmp ca_epilogue ca_jumptable: jmp [ca_jumpdata + 4 * ecx] ca_jumpdata: ;; Do not insert anything here between label and jump table. dd offset ca_epilogue ;; FFI_TYPE_VOID dd offset ca_retint ;; FFI_TYPE_INT dd offset ca_retfloat ;; FFI_TYPE_FLOAT dd offset ca_retdouble ;; FFI_TYPE_DOUBLE dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE dd offset ca_retuint8 ;; FFI_TYPE_UINT8 dd offset ca_retsint8 ;; FFI_TYPE_SINT8 dd offset ca_retuint16 ;; FFI_TYPE_UINT16 dd offset ca_retsint16 ;; FFI_TYPE_SINT16 dd offset ca_retint ;; FFI_TYPE_UINT32 dd offset ca_retint ;; FFI_TYPE_SINT32 dd offset ca_retint64 ;; FFI_TYPE_UINT64 dd offset ca_retint64 ;; FFI_TYPE_SINT64 dd offset ca_epilogue ;; FFI_TYPE_STRUCT dd offset ca_retint ;; FFI_TYPE_POINTER dd offset ca_retstruct1b ;; FFI_TYPE_SMALL_STRUCT_1B dd offset ca_retstruct2b ;; FFI_TYPE_SMALL_STRUCT_2B dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B dd offset ca_epilogue ;; FFI_TYPE_MS_STRUCT /* Sign/zero extend as appropriate. */ ca_retuint8: movzx eax, al jmp ca_retint ca_retsint8: movsx eax, al jmp ca_retint ca_retuint16: movzx eax, ax jmp ca_retint ca_retsint16: movsx eax, ax jmp ca_retint ca_retint: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue mov [ecx + 0], eax jmp ca_epilogue ca_retint64: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue mov [ecx + 0], eax mov [ecx + 4], edx jmp ca_epilogue ca_retfloat: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue fstp DWORD PTR [ecx] jmp ca_epilogue ca_retdouble: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue fstp QWORD PTR [ecx] jmp ca_epilogue ca_retlongdouble: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue fstp TBYTE PTR [ecx] jmp ca_epilogue ca_retstruct1b: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue mov [ecx + 0], al jmp ca_epilogue ca_retstruct2b: ;; Load %ecx with the pointer to storage for the return value mov ecx, rvalue mov [ecx + 0], ax jmp ca_epilogue ca_epilogue: ;; Epilogue code is autogenerated. ret ffi_call_win32 ENDP ffi_closure_THISCALL PROC NEAR FORCEFRAME sub esp, 40 lea edx, [ebp -24] mov [ebp - 12], edx /* resp */ lea edx, [ebp + 12] /* account for stub return address on stack */ jmp stub ffi_closure_THISCALL ENDP ffi_closure_SYSV PROC NEAR FORCEFRAME ;; the ffi_closure ctx is passed in eax by the trampoline. sub esp, 40 lea edx, [ebp - 24] mov [ebp - 12], edx ;; resp lea edx, [ebp + 8] stub:: mov [esp + 8], edx ;; args lea edx, [ebp - 12] mov [esp + 4], edx ;; &resp mov [esp], eax ;; closure call ffi_closure_SYSV_inner mov ecx, [ebp - 12] cs_jumptable: jmp [cs_jumpdata + 4 * eax] cs_jumpdata: ;; Do not insert anything here between the label and jump table. dd offset cs_epilogue ;; FFI_TYPE_VOID dd offset cs_retint ;; FFI_TYPE_INT dd offset cs_retfloat ;; FFI_TYPE_FLOAT dd offset cs_retdouble ;; FFI_TYPE_DOUBLE dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE dd offset cs_retuint8 ;; FFI_TYPE_UINT8 dd offset cs_retsint8 ;; FFI_TYPE_SINT8 dd offset cs_retuint16 ;; FFI_TYPE_UINT16 dd offset cs_retsint16 ;; FFI_TYPE_SINT16 dd offset cs_retint ;; FFI_TYPE_UINT32 dd offset cs_retint ;; FFI_TYPE_SINT32 dd offset cs_retint64 ;; FFI_TYPE_UINT64 dd offset cs_retint64 ;; FFI_TYPE_SINT64 dd offset cs_retstruct ;; FFI_TYPE_STRUCT dd offset cs_retint ;; FFI_TYPE_POINTER dd offset cs_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B dd offset cs_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B dd offset cs_retmsstruct ;; FFI_TYPE_MS_STRUCT cs_retuint8: movzx eax, BYTE PTR [ecx] jmp cs_epilogue cs_retsint8: movsx eax, BYTE PTR [ecx] jmp cs_epilogue cs_retuint16: movzx eax, WORD PTR [ecx] jmp cs_epilogue cs_retsint16: movsx eax, WORD PTR [ecx] jmp cs_epilogue cs_retint: mov eax, [ecx] jmp cs_epilogue cs_retint64: mov eax, [ecx + 0] mov edx, [ecx + 4] jmp cs_epilogue cs_retfloat: fld DWORD PTR [ecx] jmp cs_epilogue cs_retdouble: fld QWORD PTR [ecx] jmp cs_epilogue cs_retlongdouble: fld TBYTE PTR [ecx] jmp cs_epilogue cs_retstruct: ;; Caller expects us to pop struct return value pointer hidden arg. ;; Epilogue code is autogenerated. ret 4 cs_retmsstruct: ;; Caller expects us to return a pointer to the real return value. mov eax, ecx ;; Caller doesn't expects us to pop struct return value pointer hidden arg. jmp cs_epilogue cs_epilogue: ;; Epilogue code is autogenerated. ret ffi_closure_SYSV ENDP #if !FFI_NO_RAW_API #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3) #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) #define CIF_FLAGS_OFFSET 20 ffi_closure_raw_THISCALL PROC NEAR USES esi FORCEFRAME sub esp, 36 mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data mov [esp + 12], edx lea edx, [ebp + 12] jmp stubraw ffi_closure_raw_THISCALL ENDP ffi_closure_raw_SYSV PROC NEAR USES esi FORCEFRAME ;; the ffi_closure ctx is passed in eax by the trampoline. sub esp, 40 mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data mov [esp + 12], edx ;; user_data lea edx, [ebp + 8] stubraw:: mov [esp + 8], edx ;; raw_args lea edx, [ebp - 24] mov [esp + 4], edx ;; &res mov [esp], esi ;; cif call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags lea ecx, [ebp - 24] cr_jumptable: jmp [cr_jumpdata + 4 * eax] cr_jumpdata: ;; Do not insert anything here between the label and jump table. dd offset cr_epilogue ;; FFI_TYPE_VOID dd offset cr_retint ;; FFI_TYPE_INT dd offset cr_retfloat ;; FFI_TYPE_FLOAT dd offset cr_retdouble ;; FFI_TYPE_DOUBLE dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE dd offset cr_retuint8 ;; FFI_TYPE_UINT8 dd offset cr_retsint8 ;; FFI_TYPE_SINT8 dd offset cr_retuint16 ;; FFI_TYPE_UINT16 dd offset cr_retsint16 ;; FFI_TYPE_SINT16 dd offset cr_retint ;; FFI_TYPE_UINT32 dd offset cr_retint ;; FFI_TYPE_SINT32 dd offset cr_retint64 ;; FFI_TYPE_UINT64 dd offset cr_retint64 ;; FFI_TYPE_SINT64 dd offset cr_epilogue ;; FFI_TYPE_STRUCT dd offset cr_retint ;; FFI_TYPE_POINTER dd offset cr_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B dd offset cr_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B dd offset cr_epilogue ;; FFI_TYPE_MS_STRUCT cr_retuint8: movzx eax, BYTE PTR [ecx] jmp cr_epilogue cr_retsint8: movsx eax, BYTE PTR [ecx] jmp cr_epilogue cr_retuint16: movzx eax, WORD PTR [ecx] jmp cr_epilogue cr_retsint16: movsx eax, WORD PTR [ecx] jmp cr_epilogue cr_retint: mov eax, [ecx] jmp cr_epilogue cr_retint64: mov eax, [ecx + 0] mov edx, [ecx + 4] jmp cr_epilogue cr_retfloat: fld DWORD PTR [ecx] jmp cr_epilogue cr_retdouble: fld QWORD PTR [ecx] jmp cr_epilogue cr_retlongdouble: fld TBYTE PTR [ecx] jmp cr_epilogue cr_epilogue: ;; Epilogue code is autogenerated. ret ffi_closure_raw_SYSV ENDP #endif /* !FFI_NO_RAW_API */ ffi_closure_STDCALL PROC NEAR FORCEFRAME ;; the ffi_closure ctx is passed in eax by the trampoline. sub esp, 40 lea edx, [ebp - 24] mov [ebp - 12], edx ;; resp lea edx, [ebp + 12] ;; account for stub return address on stack mov [esp + 8], edx ;; args lea edx, [ebp - 12] mov [esp + 4], edx ;; &resp mov [esp], eax ;; closure call ffi_closure_SYSV_inner mov ecx, [ebp - 12] cd_jumptable: jmp [cd_jumpdata + 4 * eax] cd_jumpdata: ;; Do not insert anything here between the label and jump table. dd offset cd_epilogue ;; FFI_TYPE_VOID dd offset cd_retint ;; FFI_TYPE_INT dd offset cd_retfloat ;; FFI_TYPE_FLOAT dd offset cd_retdouble ;; FFI_TYPE_DOUBLE dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE dd offset cd_retuint8 ;; FFI_TYPE_UINT8 dd offset cd_retsint8 ;; FFI_TYPE_SINT8 dd offset cd_retuint16 ;; FFI_TYPE_UINT16 dd offset cd_retsint16 ;; FFI_TYPE_SINT16 dd offset cd_retint ;; FFI_TYPE_UINT32 dd offset cd_retint ;; FFI_TYPE_SINT32 dd offset cd_retint64 ;; FFI_TYPE_UINT64 dd offset cd_retint64 ;; FFI_TYPE_SINT64 dd offset cd_epilogue ;; FFI_TYPE_STRUCT dd offset cd_retint ;; FFI_TYPE_POINTER dd offset cd_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B dd offset cd_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B cd_retuint8: movzx eax, BYTE PTR [ecx] jmp cd_epilogue cd_retsint8: movsx eax, BYTE PTR [ecx] jmp cd_epilogue cd_retuint16: movzx eax, WORD PTR [ecx] jmp cd_epilogue cd_retsint16: movsx eax, WORD PTR [ecx] jmp cd_epilogue cd_retint: mov eax, [ecx] jmp cd_epilogue cd_retint64: mov eax, [ecx + 0] mov edx, [ecx + 4] jmp cd_epilogue cd_retfloat: fld DWORD PTR [ecx] jmp cd_epilogue cd_retdouble: fld QWORD PTR [ecx] jmp cd_epilogue cd_retlongdouble: fld TBYTE PTR [ecx] jmp cd_epilogue cd_epilogue: ;; Epilogue code is autogenerated. ret ffi_closure_STDCALL ENDP _TEXT ENDS END #else .text # This assumes we are using gas. .balign 16 .globl _ffi_call_win32 #ifndef __OS2__ .def _ffi_call_win32; .scl 2; .type 32; .endef #endif _ffi_call_win32: .LFB1: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: # Make room for all of the new args. movl 20(%ebp),%ecx subl %ecx,%esp movl %esp,%eax # Place all of the ffi_prep_args in position pushl 12(%ebp) pushl %eax call *8(%ebp) # Return stack to previous state and call the function addl $8,%esp # Handle fastcall and thiscall cmpl $3, 16(%ebp) # FFI_THISCALL jz .do_thiscall cmpl $4, 16(%ebp) # FFI_FASTCALL jnz .do_fncall movl (%esp), %ecx movl 4(%esp), %edx addl $8, %esp jmp .do_fncall .do_thiscall: movl (%esp), %ecx addl $4, %esp .do_fncall: # FIXME: Align the stack to a 128-bit boundary to avoid # potential performance hits. call *32(%ebp) # stdcall functions pop arguments off the stack themselves # Load %ecx with the return type code movl 24(%ebp),%ecx # If the return value pointer is NULL, assume no return value. cmpl $0,28(%ebp) jne 0f # Even if there is no space for the return value, we are # obliged to handle floating-point values. cmpl $FFI_TYPE_FLOAT,%ecx jne .Lnoretval fstp %st(0) jmp .Lepilogue 0: call 1f # Do not insert anything here between the call and the jump table. .Lstore_table: .long .Lnoretval /* FFI_TYPE_VOID */ .long .Lretint /* FFI_TYPE_INT */ .long .Lretfloat /* FFI_TYPE_FLOAT */ .long .Lretdouble /* FFI_TYPE_DOUBLE */ .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */ .long .Lretuint8 /* FFI_TYPE_UINT8 */ .long .Lretsint8 /* FFI_TYPE_SINT8 */ .long .Lretuint16 /* FFI_TYPE_UINT16 */ .long .Lretsint16 /* FFI_TYPE_SINT16 */ .long .Lretint /* FFI_TYPE_UINT32 */ .long .Lretint /* FFI_TYPE_SINT32 */ .long .Lretint64 /* FFI_TYPE_UINT64 */ .long .Lretint64 /* FFI_TYPE_SINT64 */ .long .Lretstruct /* FFI_TYPE_STRUCT */ .long .Lretint /* FFI_TYPE_POINTER */ .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */ .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */ .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */ .long .Lretstruct /* FFI_TYPE_MS_STRUCT */ 1: add %ecx, %ecx add %ecx, %ecx add (%esp),%ecx add $4, %esp jmp *(%ecx) /* Sign/zero extend as appropriate. */ .Lretsint8: movsbl %al, %eax jmp .Lretint .Lretsint16: movswl %ax, %eax jmp .Lretint .Lretuint8: movzbl %al, %eax jmp .Lretint .Lretuint16: movzwl %ax, %eax jmp .Lretint .Lretint: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx movl %eax,0(%ecx) jmp .Lepilogue .Lretfloat: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx fstps (%ecx) jmp .Lepilogue .Lretdouble: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx fstpl (%ecx) jmp .Lepilogue .Lretlongdouble: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx fstpt (%ecx) jmp .Lepilogue .Lretint64: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx movl %eax,0(%ecx) movl %edx,4(%ecx) jmp .Lepilogue .Lretstruct1b: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx movb %al,0(%ecx) jmp .Lepilogue .Lretstruct2b: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx movw %ax,0(%ecx) jmp .Lepilogue .Lretstruct4b: # Load %ecx with the pointer to storage for the return value movl 28(%ebp),%ecx movl %eax,0(%ecx) jmp .Lepilogue .Lretstruct: # Nothing to do! .Lnoretval: .Lepilogue: movl %ebp,%esp popl %ebp ret .ffi_call_win32_end: .balign 16 .globl _ffi_closure_THISCALL #ifndef __OS2__ .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef #endif _ffi_closure_THISCALL: pushl %ebp movl %esp, %ebp subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 12(%ebp), %edx /* account for stub return address on stack */ jmp .stub .LFE1: # This assumes we are using gas. .balign 16 .globl _ffi_closure_SYSV #ifndef __OS2__ .def _ffi_closure_SYSV; .scl 2; .type 32; .endef #endif _ffi_closure_SYSV: .LFB3: pushl %ebp .LCFI4: movl %esp, %ebp .LCFI5: subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 8(%ebp), %edx .stub: movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ call _ffi_closure_SYSV_inner movl -12(%ebp), %ecx 0: call 1f # Do not insert anything here between the call and the jump table. .Lcls_store_table: .long .Lcls_noretval /* FFI_TYPE_VOID */ .long .Lcls_retint /* FFI_TYPE_INT */ .long .Lcls_retfloat /* FFI_TYPE_FLOAT */ .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */ .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */ .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */ .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */ .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */ .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */ .long .Lcls_retint /* FFI_TYPE_UINT32 */ .long .Lcls_retint /* FFI_TYPE_SINT32 */ .long .Lcls_retllong /* FFI_TYPE_UINT64 */ .long .Lcls_retllong /* FFI_TYPE_SINT64 */ .long .Lcls_retstruct /* FFI_TYPE_STRUCT */ .long .Lcls_retint /* FFI_TYPE_POINTER */ .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ .long .Lcls_retmsstruct /* FFI_TYPE_MS_STRUCT */ 1: add %eax, %eax add %eax, %eax add (%esp),%eax add $4, %esp jmp *(%eax) /* Sign/zero extend as appropriate. */ .Lcls_retsint8: movsbl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retsint16: movswl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retuint8: movzbl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retuint16: movzwl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retint: movl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retfloat: flds (%ecx) jmp .Lcls_epilogue .Lcls_retdouble: fldl (%ecx) jmp .Lcls_epilogue .Lcls_retldouble: fldt (%ecx) jmp .Lcls_epilogue .Lcls_retllong: movl (%ecx), %eax movl 4(%ecx), %edx jmp .Lcls_epilogue .Lcls_retstruct1: movsbl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct2: movswl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct4: movl (%ecx), %eax jmp .Lcls_epilogue .Lcls_retstruct: # Caller expects us to pop struct return value pointer hidden arg. movl %ebp, %esp popl %ebp ret $0x4 .Lcls_retmsstruct: # Caller expects us to return a pointer to the real return value. mov %ecx, %eax # Caller doesn't expects us to pop struct return value pointer hidden arg. jmp .Lcls_epilogue .Lcls_noretval: .Lcls_epilogue: movl %ebp, %esp popl %ebp ret .ffi_closure_SYSV_end: .LFE3: #if !FFI_NO_RAW_API #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) #define CIF_FLAGS_OFFSET 20 .balign 16 .globl _ffi_closure_raw_THISCALL #ifndef __OS2__ .def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef #endif _ffi_closure_raw_THISCALL: pushl %ebp movl %esp, %ebp pushl %esi subl $36, %esp movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ movl %edx, 12(%esp) /* user_data */ leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */ jmp .stubraw # This assumes we are using gas. .balign 16 .globl _ffi_closure_raw_SYSV #ifndef __OS2__ .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef #endif _ffi_closure_raw_SYSV: .LFB4: pushl %ebp .LCFI6: movl %esp, %ebp .LCFI7: pushl %esi .LCFI8: subl $36, %esp movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ movl %edx, 12(%esp) /* user_data */ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ .stubraw: movl %edx, 8(%esp) /* raw_args */ leal -24(%ebp), %edx movl %edx, 4(%esp) /* &res */ movl %esi, (%esp) /* cif */ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ 0: call 1f # Do not insert anything here between the call and the jump table. .Lrcls_store_table: .long .Lrcls_noretval /* FFI_TYPE_VOID */ .long .Lrcls_retint /* FFI_TYPE_INT */ .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */ .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */ .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */ .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */ .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */ .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */ .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */ .long .Lrcls_retint /* FFI_TYPE_UINT32 */ .long .Lrcls_retint /* FFI_TYPE_SINT32 */ .long .Lrcls_retllong /* FFI_TYPE_UINT64 */ .long .Lrcls_retllong /* FFI_TYPE_SINT64 */ .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */ .long .Lrcls_retint /* FFI_TYPE_POINTER */ .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ .long .Lrcls_retstruct /* FFI_TYPE_MS_STRUCT */ 1: add %eax, %eax add %eax, %eax add (%esp),%eax add $4, %esp jmp *(%eax) /* Sign/zero extend as appropriate. */ .Lrcls_retsint8: movsbl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retsint16: movswl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retuint8: movzbl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retuint16: movzwl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retint: movl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retfloat: flds -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retdouble: fldl -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retldouble: fldt -24(%ebp) jmp .Lrcls_epilogue .Lrcls_retllong: movl -24(%ebp), %eax movl -20(%ebp), %edx jmp .Lrcls_epilogue .Lrcls_retstruct1: movsbl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retstruct2: movswl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retstruct4: movl -24(%ebp), %eax jmp .Lrcls_epilogue .Lrcls_retstruct: # Nothing to do! .Lrcls_noretval: .Lrcls_epilogue: addl $36, %esp popl %esi popl %ebp ret .ffi_closure_raw_SYSV_end: .LFE4: #endif /* !FFI_NO_RAW_API */ # This assumes we are using gas. .balign 16 .globl _ffi_closure_STDCALL #ifndef __OS2__ .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef #endif _ffi_closure_STDCALL: .LFB5: pushl %ebp .LCFI9: movl %esp, %ebp .LCFI10: subl $40, %esp leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 12(%ebp), %edx /* account for stub return address on stack */ movl %edx, 4(%esp) /* args */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ call _ffi_closure_SYSV_inner movl -12(%ebp), %ecx 0: call 1f # Do not insert anything here between the call and the jump table. .Lscls_store_table: .long .Lscls_noretval /* FFI_TYPE_VOID */ .long .Lscls_retint /* FFI_TYPE_INT */ .long .Lscls_retfloat /* FFI_TYPE_FLOAT */ .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */ .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */ .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */ .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */ .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */ .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */ .long .Lscls_retint /* FFI_TYPE_UINT32 */ .long .Lscls_retint /* FFI_TYPE_SINT32 */ .long .Lscls_retllong /* FFI_TYPE_UINT64 */ .long .Lscls_retllong /* FFI_TYPE_SINT64 */ .long .Lscls_retstruct /* FFI_TYPE_STRUCT */ .long .Lscls_retint /* FFI_TYPE_POINTER */ .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */ .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */ .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */ 1: add %eax, %eax add %eax, %eax add (%esp),%eax add $4, %esp jmp *(%eax) /* Sign/zero extend as appropriate. */ .Lscls_retsint8: movsbl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retsint16: movswl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retuint8: movzbl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retuint16: movzwl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retint: movl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retfloat: flds (%ecx) jmp .Lscls_epilogue .Lscls_retdouble: fldl (%ecx) jmp .Lscls_epilogue .Lscls_retldouble: fldt (%ecx) jmp .Lscls_epilogue .Lscls_retllong: movl (%ecx), %eax movl 4(%ecx), %edx jmp .Lscls_epilogue .Lscls_retstruct1: movsbl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retstruct2: movswl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retstruct4: movl (%ecx), %eax jmp .Lscls_epilogue .Lscls_retstruct: # Nothing to do! .Lscls_noretval: .Lscls_epilogue: movl %ebp, %esp popl %ebp ret .ffi_closure_STDCALL_end: .LFE5: #ifndef __OS2__ .section .eh_frame,"w" #endif .Lframe1: .LSCIE1: .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */ .LASCIE1: .long 0x0 /* CIE Identifier Tag */ .byte 0x1 /* CIE Version */ #ifdef __PIC__ .ascii "zR\0" /* CIE Augmentation */ #else .ascii "\0" /* CIE Augmentation */ #endif .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */ .byte 0x8 /* CIE RA Column */ #ifdef __PIC__ .byte 0x1 /* .uleb128 0x1; Augmentation size */ .byte 0x1b /* FDE Encoding (pcrel sdata4) */ #endif .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x4 /* .uleb128 0x4 */ .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */ .byte 0x1 /* .uleb128 0x1 */ .align 4 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 /* FDE Length */ .LASFDE1: .long .LASFDE1-.Lframe1 /* FDE CIE offset */ #if defined __PIC__ && defined HAVE_AS_X86_PCREL .long .LFB1-. /* FDE initial location */ #else .long .LFB1 #endif .long .LFE1-.LFB1 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif /* DW_CFA_xxx CFI instructions go here. */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI0-.LFB1 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI1-.LCFI0 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ .byte 0x5 /* .uleb128 0x5 */ /* End of DW_CFA_xxx CFI instructions. */ .align 4 .LEFDE1: .LSFDE3: .long .LEFDE3-.LASFDE3 /* FDE Length */ .LASFDE3: .long .LASFDE3-.Lframe1 /* FDE CIE offset */ #if defined __PIC__ && defined HAVE_AS_X86_PCREL .long .LFB3-. /* FDE initial location */ #else .long .LFB3 #endif .long .LFE3-.LFB3 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif /* DW_CFA_xxx CFI instructions go here. */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI4-.LFB3 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI5-.LCFI4 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ .byte 0x5 /* .uleb128 0x5 */ /* End of DW_CFA_xxx CFI instructions. */ .align 4 .LEFDE3: #if !FFI_NO_RAW_API .LSFDE4: .long .LEFDE4-.LASFDE4 /* FDE Length */ .LASFDE4: .long .LASFDE4-.Lframe1 /* FDE CIE offset */ #if defined __PIC__ && defined HAVE_AS_X86_PCREL .long .LFB4-. /* FDE initial location */ #else .long .LFB4 #endif .long .LFE4-.LFB4 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif /* DW_CFA_xxx CFI instructions go here. */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI6-.LFB4 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI7-.LCFI6 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ .byte 0x5 /* .uleb128 0x5 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI8-.LCFI7 .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */ .byte 0x3 /* .uleb128 0x3 */ /* End of DW_CFA_xxx CFI instructions. */ .align 4 .LEFDE4: #endif /* !FFI_NO_RAW_API */ .LSFDE5: .long .LEFDE5-.LASFDE5 /* FDE Length */ .LASFDE5: .long .LASFDE5-.Lframe1 /* FDE CIE offset */ #if defined __PIC__ && defined HAVE_AS_X86_PCREL .long .LFB5-. /* FDE initial location */ #else .long .LFB5 #endif .long .LFE5-.LFB5 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif /* DW_CFA_xxx CFI instructions go here. */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI9-.LFB5 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */ .byte 0x8 /* .uleb128 0x8 */ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */ .byte 0x2 /* .uleb128 0x2 */ .byte 0x4 /* DW_CFA_advance_loc4 */ .long .LCFI10-.LCFI9 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */ .byte 0x5 /* .uleb128 0x5 */ /* End of DW_CFA_xxx CFI instructions. */ .align 4 .LEFDE5: #endif /* !_MSC_VER */ polyml-5.6/libffi/src/x86/win64.S000066400000000000000000000221671265146633400164640ustar00rootroot00000000000000#define LIBFFI_ASM #include #include /* Constants for ffi_call_win64 */ #define STACK 0 #define PREP_ARGS_FN 32 #define ECIF 40 #define CIF_BYTES 48 #define CIF_FLAGS 56 #define RVALUE 64 #define FN 72 /* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *), extended_cif *ecif, unsigned bytes, unsigned flags, unsigned *rvalue, void (*fn)()); */ #ifdef _MSC_VER PUBLIC ffi_call_win64 EXTRN __chkstk:NEAR EXTRN ffi_closure_win64_inner:NEAR _TEXT SEGMENT ;;; ffi_closure_win64 will be called with these registers set: ;;; rax points to 'closure' ;;; r11 contains a bit mask that specifies which of the ;;; first four parameters are float or double ;;; ;;; It must move the parameters passed in registers to their stack location, ;;; call ffi_closure_win64_inner for the actual work, then return the result. ;;; ffi_closure_win64 PROC FRAME ;; copy register arguments onto stack test r11, 1 jne first_is_float mov QWORD PTR [rsp+8], rcx jmp second first_is_float: movlpd QWORD PTR [rsp+8], xmm0 second: test r11, 2 jne second_is_float mov QWORD PTR [rsp+16], rdx jmp third second_is_float: movlpd QWORD PTR [rsp+16], xmm1 third: test r11, 4 jne third_is_float mov QWORD PTR [rsp+24], r8 jmp fourth third_is_float: movlpd QWORD PTR [rsp+24], xmm2 fourth: test r11, 8 jne fourth_is_float mov QWORD PTR [rsp+32], r9 jmp done fourth_is_float: movlpd QWORD PTR [rsp+32], xmm3 done: .ALLOCSTACK 40 sub rsp, 40 .ENDPROLOG mov rcx, rax ; context is first parameter mov rdx, rsp ; stack is second parameter add rdx, 48 ; point to start of arguments mov rax, ffi_closure_win64_inner call rax ; call the real closure function add rsp, 40 movd xmm0, rax ; If the closure returned a float, ; ffi_closure_win64_inner wrote it to rax ret 0 ffi_closure_win64 ENDP ffi_call_win64 PROC FRAME ;; copy registers onto stack mov QWORD PTR [rsp+32], r9 mov QWORD PTR [rsp+24], r8 mov QWORD PTR [rsp+16], rdx mov QWORD PTR [rsp+8], rcx .PUSHREG rbp push rbp .ALLOCSTACK 48 sub rsp, 48 ; 00000030H .SETFRAME rbp, 32 lea rbp, QWORD PTR [rsp+32] .ENDPROLOG mov eax, DWORD PTR CIF_BYTES[rbp] add rax, 15 and rax, -16 call __chkstk sub rsp, rax lea rax, QWORD PTR [rsp+32] mov QWORD PTR STACK[rbp], rax mov rdx, QWORD PTR ECIF[rbp] mov rcx, QWORD PTR STACK[rbp] call QWORD PTR PREP_ARGS_FN[rbp] mov rsp, QWORD PTR STACK[rbp] movlpd xmm3, QWORD PTR [rsp+24] movd r9, xmm3 movlpd xmm2, QWORD PTR [rsp+16] movd r8, xmm2 movlpd xmm1, QWORD PTR [rsp+8] movd rdx, xmm1 movlpd xmm0, QWORD PTR [rsp] movd rcx, xmm0 call QWORD PTR FN[rbp] ret_struct4b$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B jne ret_struct2b$ mov rcx, QWORD PTR RVALUE[rbp] mov DWORD PTR [rcx], eax jmp ret_void$ ret_struct2b$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B jne ret_struct1b$ mov rcx, QWORD PTR RVALUE[rbp] mov WORD PTR [rcx], ax jmp ret_void$ ret_struct1b$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B jne ret_uint8$ mov rcx, QWORD PTR RVALUE[rbp] mov BYTE PTR [rcx], al jmp ret_void$ ret_uint8$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8 jne ret_sint8$ mov rcx, QWORD PTR RVALUE[rbp] movzx rax, al mov QWORD PTR [rcx], rax jmp ret_void$ ret_sint8$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8 jne ret_uint16$ mov rcx, QWORD PTR RVALUE[rbp] movsx rax, al mov QWORD PTR [rcx], rax jmp ret_void$ ret_uint16$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16 jne ret_sint16$ mov rcx, QWORD PTR RVALUE[rbp] movzx rax, ax mov QWORD PTR [rcx], rax jmp SHORT ret_void$ ret_sint16$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16 jne ret_uint32$ mov rcx, QWORD PTR RVALUE[rbp] movsx rax, ax mov QWORD PTR [rcx], rax jmp SHORT ret_void$ ret_uint32$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32 jne ret_sint32$ mov rcx, QWORD PTR RVALUE[rbp] mov eax, eax mov QWORD PTR [rcx], rax jmp SHORT ret_void$ ret_sint32$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32 jne ret_float$ mov rcx, QWORD PTR RVALUE[rbp] cdqe mov QWORD PTR [rcx], rax jmp SHORT ret_void$ ret_float$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT jne SHORT ret_double$ mov rax, QWORD PTR RVALUE[rbp] movss DWORD PTR [rax], xmm0 jmp SHORT ret_void$ ret_double$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE jne SHORT ret_sint64$ mov rax, QWORD PTR RVALUE[rbp] movlpd QWORD PTR [rax], xmm0 jmp SHORT ret_void$ ret_sint64$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64 jne ret_void$ mov rcx, QWORD PTR RVALUE[rbp] mov QWORD PTR [rcx], rax jmp SHORT ret_void$ ret_void$: xor rax, rax lea rsp, QWORD PTR [rbp+16] pop rbp ret 0 ffi_call_win64 ENDP _TEXT ENDS END #else #ifdef SYMBOL_UNDERSCORE #define SYMBOL_NAME(name) _##name #else #define SYMBOL_NAME(name) name #endif .text .extern SYMBOL_NAME(ffi_closure_win64_inner) # ffi_closure_win64 will be called with these registers set: # rax points to 'closure' # r11 contains a bit mask that specifies which of the # first four parameters are float or double # # It must move the parameters passed in registers to their stack location, # call ffi_closure_win64_inner for the actual work, then return the result. # .balign 16 .globl SYMBOL_NAME(ffi_closure_win64) SYMBOL_NAME(ffi_closure_win64): # copy register arguments onto stack test $1,%r11 jne .Lfirst_is_float mov %rcx, 8(%rsp) jmp .Lsecond .Lfirst_is_float: movlpd %xmm0, 8(%rsp) .Lsecond: test $2, %r11 jne .Lsecond_is_float mov %rdx, 16(%rsp) jmp .Lthird .Lsecond_is_float: movlpd %xmm1, 16(%rsp) .Lthird: test $4, %r11 jne .Lthird_is_float mov %r8,24(%rsp) jmp .Lfourth .Lthird_is_float: movlpd %xmm2, 24(%rsp) .Lfourth: test $8, %r11 jne .Lfourth_is_float mov %r9, 32(%rsp) jmp .Ldone .Lfourth_is_float: movlpd %xmm3, 32(%rsp) .Ldone: #.ALLOCSTACK 40 sub $40, %rsp #.ENDPROLOG mov %rax, %rcx # context is first parameter mov %rsp, %rdx # stack is second parameter add $48, %rdx # point to start of arguments mov $SYMBOL_NAME(ffi_closure_win64_inner), %rax callq *%rax # call the real closure function add $40, %rsp movq %rax, %xmm0 # If the closure returned a float, # ffi_closure_win64_inner wrote it to rax retq .ffi_closure_win64_end: .balign 16 .globl SYMBOL_NAME(ffi_call_win64) SYMBOL_NAME(ffi_call_win64): # copy registers onto stack mov %r9,32(%rsp) mov %r8,24(%rsp) mov %rdx,16(%rsp) mov %rcx,8(%rsp) #.PUSHREG rbp push %rbp #.ALLOCSTACK 48 sub $48,%rsp #.SETFRAME rbp, 32 lea 32(%rsp),%rbp #.ENDPROLOG mov CIF_BYTES(%rbp),%eax add $15, %rax and $-16, %rax cmpq $0x1000, %rax jb Lch_done Lch_probe: subq $0x1000,%rsp orl $0x0, (%rsp) subq $0x1000,%rax cmpq $0x1000,%rax ja Lch_probe Lch_done: subq %rax, %rsp orl $0x0, (%rsp) lea 32(%rsp), %rax mov %rax, STACK(%rbp) mov ECIF(%rbp), %rdx mov STACK(%rbp), %rcx callq *PREP_ARGS_FN(%rbp) mov STACK(%rbp), %rsp movlpd 24(%rsp), %xmm3 movd %xmm3, %r9 movlpd 16(%rsp), %xmm2 movd %xmm2, %r8 movlpd 8(%rsp), %xmm1 movd %xmm1, %rdx movlpd (%rsp), %xmm0 movd %xmm0, %rcx callq *FN(%rbp) .Lret_struct4b: cmpl $FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp) jne .Lret_struct2b mov RVALUE(%rbp), %rcx mov %eax, (%rcx) jmp .Lret_void .Lret_struct2b: cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp) jne .Lret_struct1b mov RVALUE(%rbp), %rcx mov %ax, (%rcx) jmp .Lret_void .Lret_struct1b: cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp) jne .Lret_uint8 mov RVALUE(%rbp), %rcx mov %al, (%rcx) jmp .Lret_void .Lret_uint8: cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp) jne .Lret_sint8 mov RVALUE(%rbp), %rcx movzbq %al, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_sint8: cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp) jne .Lret_uint16 mov RVALUE(%rbp), %rcx movsbq %al, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_uint16: cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp) jne .Lret_sint16 mov RVALUE(%rbp), %rcx movzwq %ax, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_sint16: cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp) jne .Lret_uint32 mov RVALUE(%rbp), %rcx movswq %ax, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_uint32: cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp) jne .Lret_sint32 mov RVALUE(%rbp), %rcx movl %eax, %eax movq %rax, (%rcx) jmp .Lret_void .Lret_sint32: cmpl $FFI_TYPE_SINT32, CIF_FLAGS(%rbp) jne .Lret_float mov RVALUE(%rbp), %rcx cltq movq %rax, (%rcx) jmp .Lret_void .Lret_float: cmpl $FFI_TYPE_FLOAT, CIF_FLAGS(%rbp) jne .Lret_double mov RVALUE(%rbp), %rax movss %xmm0, (%rax) jmp .Lret_void .Lret_double: cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp) jne .Lret_sint64 mov RVALUE(%rbp), %rax movlpd %xmm0, (%rax) jmp .Lret_void .Lret_sint64: cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp) jne .Lret_void mov RVALUE(%rbp), %rcx mov %rax, (%rcx) jmp .Lret_void .Lret_void: xor %rax, %rax lea 16(%rbp), %rsp pop %rbp retq .ffi_call_win64_end: #endif /* !_MSC_VER */ polyml-5.6/libffi/src/xtensa/000077500000000000000000000000001265146633400162365ustar00rootroot00000000000000polyml-5.6/libffi/src/xtensa/ffi.c000066400000000000000000000211311265146633400171440ustar00rootroot00000000000000/* ----------------------------------------------------------------------- ffi.c - Copyright (c) 2013 Tensilica, Inc. XTENSA Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #include #include /* |----------------------------------------| | | on entry to ffi_call ----> |----------------------------------------| | caller stack frame for registers a0-a3 | |----------------------------------------| | | | additional arguments | entry of the function ---> |----------------------------------------| | copy of function arguments a2-a7 | | - - - - - - - - - - - - - | | | The area below the entry line becomes the new stack frame for the function. */ #define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, void(*fn)(void), unsigned nbytes, extended_cif*); extern void ffi_closure_SYSV(void) FFI_HIDDEN; ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { switch(cif->rtype->type) { case FFI_TYPE_SINT8: case FFI_TYPE_UINT8: case FFI_TYPE_SINT16: case FFI_TYPE_UINT16: cif->flags = cif->rtype->type; break; case FFI_TYPE_VOID: case FFI_TYPE_FLOAT: cif->flags = FFI_TYPE_UINT32; break; case FFI_TYPE_DOUBLE: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; break; case FFI_TYPE_STRUCT: cif->flags = FFI_TYPE_STRUCT; //_REGS; /* Up to 16 bytes are returned in registers */ if (cif->rtype->size > 4 * 4) { /* returned structure is referenced by a register; use 8 bytes (including 4 bytes for potential additional alignment) */ cif->flags = FFI_TYPE_STRUCT; cif->bytes += 8; } break; default: cif->flags = FFI_TYPE_UINT32; break; } /* Round the stack up to a full 4 register frame, just in case (we use this size in movsp). This way, it's also a multiple of 8 bytes for 64-bit arguments. */ cif->bytes = ALIGN(cif->bytes, 16); return FFI_OK; } void ffi_prep_args(extended_cif *ecif, unsigned char* stack) { unsigned int i; unsigned long *addr; ffi_type **ptr; union { void **v; char **c; signed char **sc; unsigned char **uc; signed short **ss; unsigned short **us; unsigned int **i; long long **ll; float **f; double **d; } p_argv; /* Verify that everything is aligned up properly */ FFI_ASSERT (((unsigned long) stack & 0x7) == 0); p_argv.v = ecif->avalue; addr = (unsigned long*)stack; /* structures with a size greater than 16 bytes are passed in memory */ if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) { *addr++ = (unsigned long)ecif->rvalue; } for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; i > 0; i--, ptr++, p_argv.v++) { switch ((*ptr)->type) { case FFI_TYPE_SINT8: *addr++ = **p_argv.sc; break; case FFI_TYPE_UINT8: *addr++ = **p_argv.uc; break; case FFI_TYPE_SINT16: *addr++ = **p_argv.ss; break; case FFI_TYPE_UINT16: *addr++ = **p_argv.us; break; case FFI_TYPE_FLOAT: case FFI_TYPE_INT: case FFI_TYPE_UINT32: case FFI_TYPE_SINT32: case FFI_TYPE_POINTER: *addr++ = **p_argv.i; break; case FFI_TYPE_DOUBLE: case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: if (((unsigned long)addr & 4) != 0) addr++; *(unsigned long long*)addr = **p_argv.ll; addr += sizeof(unsigned long long) / sizeof (addr); break; case FFI_TYPE_STRUCT: { unsigned long offs; unsigned long size; if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) addr++; offs = (unsigned long) addr - (unsigned long) stack; size = (*ptr)->size; /* Entire structure must fit the argument registers or referenced */ if (offs < FFI_REGISTER_NARGS * 4 && offs + size > FFI_REGISTER_NARGS * 4) addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); memcpy((char*) addr, *p_argv.c, size); addr += (size + 3) / 4; break; } default: FFI_ASSERT(0); } } } void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; unsigned long rsize = cif->rtype->size; int flags = cif->flags; void *alloc = NULL; ecif.cif = cif; ecif.avalue = avalue; /* Note that for structures that are returned in registers (size <= 16 bytes) we allocate a temporary buffer and use memcpy to copy it to the final destination. The reason is that the target address might be misaligned or the length not a multiple of 4 bytes. Handling all those cases would be very complex. */ if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) { alloc = alloca(ALIGN(rsize, 4)); ecif.rvalue = alloc; } else { ecif.rvalue = rvalue; } if (cif->abi != FFI_SYSV) FFI_ASSERT(0); ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); if (alloc != NULL && rvalue != NULL) memcpy(rvalue, alloc, rsize); } extern void ffi_trampoline(); extern void ffi_cacheflush(void* start, void* end); ffi_status ffi_prep_closure_loc (ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc) { /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; // Do we have this function? // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); closure->cif = cif; closure->fun = fun; closure->user_data = user_data; return FFI_OK; } long FFI_HIDDEN ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) { ffi_cif *cif; ffi_type **arg_types; void **avalue; int i, areg; cif = closure->cif; if (cif->abi != FFI_SYSV) return FFI_BAD_ABI; areg = 0; int rtype = cif->rtype->type; if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) { rvalue = *values; areg++; } cif = closure->cif; arg_types = cif->arg_types; avalue = alloca(cif->nargs * sizeof(void *)); for (i = 0; i < cif->nargs; i++) { if (arg_types[i]->alignment == 8 && (areg & 1) != 0) areg++; // skip the entry 16,a1 framework, add 16 bytes (4 registers) if (areg == FFI_REGISTER_NARGS) areg += 4; if (arg_types[i]->type == FFI_TYPE_STRUCT) { int numregs = ((arg_types[i]->size + 3) & ~3) / 4; if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) areg = FFI_REGISTER_NARGS + 4; } avalue[i] = &values[areg]; areg += (arg_types[i]->size + 3) / 4; } (closure->fun)(cif, rvalue, avalue, closure->user_data); return rtype; } polyml-5.6/libffi/src/xtensa/ffitarget.h000066400000000000000000000035461265146633400203720ustar00rootroot00000000000000/* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2013 Tensilica, Inc. Target configuration macros for XTENSA. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #ifndef LIBFFI_TARGET_H #define LIBFFI_TARGET_H #ifndef LIBFFI_H #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." #endif #ifndef LIBFFI_ASM typedef unsigned long ffi_arg; typedef signed long ffi_sarg; typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_SYSV } ffi_abi; #endif #define FFI_REGISTER_NARGS 6 /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 #define FFI_NATIVE_RAW_API 0 #define FFI_TRAMPOLINE_SIZE 24 #endif polyml-5.6/libffi/src/xtensa/sysv.S000066400000000000000000000127521265146633400173750ustar00rootroot00000000000000/* ----------------------------------------------------------------------- sysv.S - Copyright (c) 2013 Tensilica, Inc. XTENSA Foreign Function Interface Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ #define LIBFFI_ASM #include #include #define ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: #define END(name) .size name , . - name /* Assert that the table below is in sync with ffi.h. */ #if FFI_TYPE_UINT8 != 5 \ || FFI_TYPE_SINT8 != 6 \ || FFI_TYPE_UINT16 != 7 \ || FFI_TYPE_SINT16 != 8 \ || FFI_TYPE_UINT32 != 9 \ || FFI_TYPE_SINT32 != 10 \ || FFI_TYPE_UINT64 != 11 #error "xtensa/sysv.S out of sync with ffi.h" #endif /* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) void *rvalue; a2 unsigned long rbytes; a3 unsigned flags; a4 void (*fnaddr)(); a5 unsigned long bytes; a6 extended_cif* ecif) a7 */ ENTRY(ffi_call_SYSV) entry a1, 32 # 32 byte frame for using call8 below mov a10, a7 # a10(->arg0): ecif sub a11, a1, a6 # a11(->arg1): stack pointer mov a7, a1 # fp movsp a1, a11 # set new sp = old_sp - bytes movi a8, ffi_prep_args callx8 a8 # ffi_prep_args(ecif, stack) # prepare to move stack pointer back up to 6 arguments # note that 'bytes' is already aligned movi a10, 6*4 sub a11, a6, a10 movgez a6, a10, a11 add a6, a1, a6 # we can pass up to 6 arguments in registers # for simplicity, just load 6 arguments # (the stack size is at least 32 bytes, so no risk to cross boundaries) l32i a10, a1, 0 l32i a11, a1, 4 l32i a12, a1, 8 l32i a13, a1, 12 l32i a14, a1, 16 l32i a15, a1, 20 # move stack pointer movsp a1, a6 callx8 a5 # (*fn)(args...) # Handle return value(s) beqz a2, .Lexit movi a5, FFI_TYPE_STRUCT bne a4, a5, .Lstore movi a5, 16 blt a5, a3, .Lexit s32i a10, a2, 0 blti a3, 5, .Lexit addi a3, a3, -1 s32i a11, a2, 4 blti a3, 8, .Lexit s32i a12, a2, 8 blti a3, 12, .Lexit s32i a13, a2, 12 .Lexit: retw .Lstore: addi a4, a4, -FFI_TYPE_UINT8 bgei a4, 7, .Lexit # should never happen movi a6, store_calls add a4, a4, a4 addx4 a6, a4, a6 # store_table + idx * 8 jx a6 .align 8 store_calls: # UINT8 s8i a10, a2, 0 retw # SINT8 .align 8 s8i a10, a2, 0 retw # UINT16 .align 8 s16i a10, a2, 0 retw # SINT16 .align 8 s16i a10, a2, 0 retw # UINT32 .align 8 s32i a10, a2, 0 retw # SINT32 .align 8 s32i a10, a2, 0 retw # UINT64 .align 8 s32i a10, a2, 0 s32i a11, a2, 4 retw END(ffi_call_SYSV) /* * void ffi_cacheflush (unsigned long start, unsigned long end) */ #define EXTRA_ARGS_SIZE 24 ENTRY(ffi_cacheflush) entry a1, 16 1: dhwbi a2, 0 ihi a2, 0 addi a2, a2, 4 blt a2, a3, 1b retw END(ffi_cacheflush) /* ffi_trampoline is copied to the stack */ ENTRY(ffi_trampoline) entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] j 2f # [ 3] .align 4 # [ 6] 1: .long 0 # [ 8] 2: l32r a15, 1b # [12] _mov a14, a0 # [15] callx0 a15 # [18] # [21] END(ffi_trampoline) /* * ffi_closure() * * a0: closure + 21 * a14: return address (a0) */ ENTRY(ffi_closure_SYSV) /* intentionally omitting entry here */ # restore return address (a0) and move pointer to closure to a10 addi a10, a0, -21 mov a0, a14 # allow up to 4 arguments as return values addi a11, a1, 4 * 4 # save up to 6 arguments to stack (allocated by entry below) s32i a2, a11, 0 s32i a3, a11, 4 s32i a4, a11, 8 s32i a5, a11, 12 s32i a6, a11, 16 s32i a7, a11, 20 movi a8, ffi_closure_SYSV_inner mov a12, a1 callx8 a8 # .._inner(*closure, **avalue, *rvalue) # load up to four return arguments l32i a2, a1, 0 l32i a3, a1, 4 l32i a4, a1, 8 l32i a5, a1, 12 # (sign-)extend return value movi a11, FFI_TYPE_UINT8 bne a10, a11, 1f extui a2, a2, 0, 8 retw 1: movi a11, FFI_TYPE_SINT8 bne a10, a11, 1f sext a2, a2, 7 retw 1: movi a11, FFI_TYPE_UINT16 bne a10, a11, 1f extui a2, a2, 0, 16 retw 1: movi a11, FFI_TYPE_SINT16 bne a10, a11, 1f sext a2, a2, 15 1: retw END(ffi_closure_SYSV) polyml-5.6/libffi/testsuite/000077500000000000000000000000001265146633400161765ustar00rootroot00000000000000polyml-5.6/libffi/testsuite/Makefile.am000066400000000000000000000113221265146633400202310ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in. AUTOMAKE_OPTIONS = foreign dejagnu # Setup the testing framework, if you have one EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ echo $(top_builddir)/../expect/expect ; \ else echo expect ; fi` RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ echo $(top_srcdir)/../dejagnu/runtest ; \ else echo runtest; fi` AM_RUNTESTFLAGS = EXTRA_DEJAGNU_SITE_CONFIG=../local.exp CLEANFILES = *.exe core* *.log *.sum EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ libffi.call/cls_align_longdouble_split.c \ libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ libffi.call/closure_fn1.c libffi.call/many2_win32.c \ libffi.call/return_ul.c libffi.call/cls_align_double.c \ libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ libffi.call/ffitest.h libffi.call/nested_struct4.c \ libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ libffi.call/struct8.c libffi.call/nested_struct8.c \ libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ libffi.call/fastthis2_win32.c libffi.call/cls_pointer.c \ libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ libffi.call/call.exp libffi.call/cls_double.c \ libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ libffi.call/return_ll1.c libffi.call/nested_struct3.c \ libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ libffi.call/return_fl.c libffi.call/struct5.c \ libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ libffi.call/return_fl3.c libffi.call/stret_medium.c \ libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ libffi.call/float3.c libffi.call/many2.c \ libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \ libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ libffi.call/cls_sshort.c libffi.call/many_win32.c \ libffi.call/nested_struct.c libffi.call/cls_20byte.c \ libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ libffi.call/return_uc.c libffi.call/closure_thiscall.c \ libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ libffi.call/promotion.c libffi.call/struct1_win32.c \ libffi.call/return_dbl.c libffi.call/cls_24byte.c \ libffi.call/struct4.c libffi.call/cls_6byte.c \ libffi.call/cls_align_uint32.c libffi.call/float.c \ libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ libffi.call/cls_align_float.c libffi.call/return_fl1.c \ libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ libffi.call/fastthis1_win32.c libffi.call/cls_align_sint64.c \ libffi.call/stret_large2.c libffi.call/return_sl.c \ libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ libffi.call/cls_2byte.c libffi.call/float2.c \ libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ libffi.call/struct1.c libffi.call/nested_struct9.c \ libffi.call/huge_struct.c libffi.call/problem1.c \ libffi.call/float4.c libffi.call/fastthis3_win32.c \ libffi.call/return_ldl.c libffi.call/strlen2_win32.c \ libffi.call/closure_fn5.c libffi.call/struct2_win32.c \ libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ libffi.call/return_sc.c libffi.call/struct7.c \ libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ libffi.call/strlen_win32.c libffi.call/cls_6_1_byte.c \ libffi.call/cls_7_1_byte.c libffi.special/unwindtest.cc \ libffi.special/special.exp libffi.special/unwindtest_ffi_call.cc \ libffi.special/ffitestcxx.h lib/wrapper.exp lib/target-libpath.exp \ lib/libffi.exp libffi.call/cls_struct_va1.c \ libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ libffi.call/nested_struct11.c libffi.call/uninitialized.c \ libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ libffi.call/va_struct3.c polyml-5.6/libffi/testsuite/Makefile.in000066400000000000000000000461071265146633400202530ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = testsuite DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ $(top_srcdir)/m4/ax_append_flag.m4 \ $(top_srcdir)/m4/ax_cc_maxopt.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_configure_args.m4 \ $(top_srcdir)/m4/ax_enable_builddir.m4 \ $(top_srcdir)/m4/ax_gcc_archflag.m4 \ $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/fficonfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DEJATOOL = $(PACKAGE) RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LTLDFLAGS = @AM_LTLDFLAGS@ AM_RUNTESTFLAGS = AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PRTDIAG = @PRTDIAG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_enable_builddir_sed = @ax_enable_builddir_sed@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ toolexecdir = @toolexecdir@ toolexeclibdir = @toolexeclibdir@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign dejagnu # Setup the testing framework, if you have one EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \ echo $(top_builddir)/../expect/expect ; \ else echo expect ; fi` RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \ echo $(top_srcdir)/../dejagnu/runtest ; \ else echo runtest; fi` EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp CLEANFILES = *.exe core* *.log *.sum EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ libffi.call/cls_align_longdouble_split.c \ libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ libffi.call/closure_fn1.c libffi.call/many2_win32.c \ libffi.call/return_ul.c libffi.call/cls_align_double.c \ libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ libffi.call/ffitest.h libffi.call/nested_struct4.c \ libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ libffi.call/struct8.c libffi.call/nested_struct8.c \ libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ libffi.call/fastthis2_win32.c libffi.call/cls_pointer.c \ libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ libffi.call/call.exp libffi.call/cls_double.c \ libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ libffi.call/return_ll1.c libffi.call/nested_struct3.c \ libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ libffi.call/return_fl.c libffi.call/struct5.c \ libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ libffi.call/return_fl3.c libffi.call/stret_medium.c \ libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ libffi.call/float3.c libffi.call/many2.c \ libffi.call/closure_stdcall.c libffi.call/cls_align_uint16.c \ libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ libffi.call/cls_sshort.c libffi.call/many_win32.c \ libffi.call/nested_struct.c libffi.call/cls_20byte.c \ libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ libffi.call/return_uc.c libffi.call/closure_thiscall.c \ libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ libffi.call/promotion.c libffi.call/struct1_win32.c \ libffi.call/return_dbl.c libffi.call/cls_24byte.c \ libffi.call/struct4.c libffi.call/cls_6byte.c \ libffi.call/cls_align_uint32.c libffi.call/float.c \ libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ libffi.call/cls_align_float.c libffi.call/return_fl1.c \ libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ libffi.call/fastthis1_win32.c libffi.call/cls_align_sint64.c \ libffi.call/stret_large2.c libffi.call/return_sl.c \ libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ libffi.call/cls_2byte.c libffi.call/float2.c \ libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ libffi.call/struct1.c libffi.call/nested_struct9.c \ libffi.call/huge_struct.c libffi.call/problem1.c \ libffi.call/float4.c libffi.call/fastthis3_win32.c \ libffi.call/return_ldl.c libffi.call/strlen2_win32.c \ libffi.call/closure_fn5.c libffi.call/struct2_win32.c \ libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ libffi.call/return_sc.c libffi.call/struct7.c \ libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ libffi.call/strlen_win32.c libffi.call/cls_6_1_byte.c \ libffi.call/cls_7_1_byte.c libffi.special/unwindtest.cc \ libffi.special/special.exp libffi.special/unwindtest_ffi_call.cc \ libffi.special/ffitestcxx.h lib/wrapper.exp lib/target-libpath.exp \ lib/libffi.exp libffi.call/cls_struct_va1.c \ libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ libffi.call/nested_struct11.c libffi.call/uninitialized.c \ libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ libffi.call/va_struct3.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign testsuite/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: check-DEJAGNU: site.exp srcdir='$(srcdir)'; export srcdir; \ EXPECT=$(EXPECT); export EXPECT; \ if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \ exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \ if $(RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \ then :; else exit_status=1; fi; \ done; \ else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\ fi; \ exit $$exit_status site.exp: Makefile $(EXTRA_DEJAGNU_SITE_CONFIG) @echo 'Making a new site.exp file ...' @echo '## these variables are automatically generated by make ##' >site.tmp @echo '# Do not edit here. If you wish to override these values' >>site.tmp @echo '# edit the last section' >>site.tmp @echo 'set srcdir "$(srcdir)"' >>site.tmp @echo "set objdir `pwd`" >>site.tmp @echo 'set build_alias "$(build_alias)"' >>site.tmp @echo 'set build_triplet $(build_triplet)' >>site.tmp @echo 'set host_alias "$(host_alias)"' >>site.tmp @echo 'set host_triplet $(host_triplet)' >>site.tmp @echo 'set target_alias "$(target_alias)"' >>site.tmp @echo 'set target_triplet $(target_triplet)' >>site.tmp @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \ echo "## Begin content included from file $$f. Do not modify. ##" \ && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \ && echo "## End content included from file $$f. ##" \ || exit 1; \ done >> site.tmp @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp @if test -f site.exp; then \ sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \ fi @-rm -f site.bak @test ! -f site.exp || mv site.exp site.bak @mv site.tmp site.exp distclean-DEJAGNU: -rm -f site.exp site.bak -l='$(DEJATOOL)'; for tool in $$l; do \ rm -f $$tool.sum $$tool.log; \ done distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-DEJAGNU distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-DEJAGNU distclean-generic distclean-libtool distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libffi/testsuite/config/000077500000000000000000000000001265146633400174435ustar00rootroot00000000000000polyml-5.6/libffi/testsuite/config/default.exp000066400000000000000000000000301265146633400215760ustar00rootroot00000000000000load_lib "standard.exp" polyml-5.6/libffi/testsuite/lib/000077500000000000000000000000001265146633400167445ustar00rootroot00000000000000polyml-5.6/libffi/testsuite/lib/libffi.exp000066400000000000000000000247431265146633400207270ustar00rootroot00000000000000# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 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; see the file COPYING3. If not see # . proc load_gcc_lib { filename } { global srcdir load_file $srcdir/lib/$filename } load_lib dg.exp load_lib libgloss.exp load_gcc_lib target-libpath.exp load_gcc_lib wrapper.exp # Define libffi callbacks for dg.exp. proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { # To get all \n in dg-output test strings to match printf output # in a system that outputs it as \015\012 (i.e. not just \012), we # need to change all \n into \r?\n. As there is no dejagnu flag # or hook to do that, we simply change the text being tested. # Unfortunately, we have to know that the variable is called # dg-output-text and lives in the caller of libffi-dg-test, which # is two calls up. Overriding proc dg-output would be longer and # would necessarily have the same assumption. upvar 2 dg-output-text output_match if { [llength $output_match] > 1 } { regsub -all "\n" [lindex $output_match 1] "\r?\n" x set output_match [lreplace $output_match 1 1 $x] } # Set up the compiler flags, based on what we're going to do. set options [list] switch $do_what { "compile" { set compile_type "assembly" set output_file "[file rootname [file tail $prog]].s" } "link" { set compile_type "executable" set output_file "[file rootname [file tail $prog]].exe" # The following line is needed for targets like the i960 where # the default output file is b.out. Sigh. } "run" { set compile_type "executable" # FIXME: "./" is to cope with "." not being in $PATH. # Should this be handled elsewhere? # YES. set output_file "./[file rootname [file tail $prog]].exe" # This is the only place where we care if an executable was # created or not. If it was, dg.exp will try to run it. remote_file build delete $output_file; } default { perror "$do_what: not a valid dg-do keyword" return "" } } if { $extra_tool_flags != "" } { lappend options "additional_flags=$extra_tool_flags" } set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; return [list $comp_output $output_file] } proc libffi-dg-test { prog do_what extra_tool_flags } { return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] } proc libffi-init { args } { global gluefile wrap_flags; global srcdir global blddirffi global objdir global TOOL_OPTIONS global tool global libffi_include global libffi_link_flags global tool_root_dir global ld_library_path global using_gcc set blddirffi [pwd]/.. verbose "libffi $blddirffi" # Are we building with GCC? set tmp [grep ../config.status "GCC='yes'"] if { [string match $tmp "GCC='yes'"] } { set using_gcc "yes" set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] if {$gccdir != ""} { set gccdir [file dirname $gccdir] } verbose "gccdir $gccdir" set ld_library_path "." append ld_library_path ":${gccdir}" set compiler "${gccdir}/xgcc" if { [is_remote host] == 0 && [which $compiler] != 0 } { foreach i "[exec $compiler --print-multi-lib]" { set mldir "" regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir set mldir [string trimright $mldir "\;@"] if { "$mldir" == "." } { continue } if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { append ld_library_path ":${gccdir}/${mldir}" } } } } else { set using_gcc "no" } # add the library path for libffi. append ld_library_path ":${blddirffi}/.libs" verbose "ld_library_path: $ld_library_path" # Point to the Libffi headers in libffi. set libffi_include "${blddirffi}/include" verbose "libffi_include $libffi_include" set libffi_dir "${blddirffi}/.libs" verbose "libffi_dir $libffi_dir" if { $libffi_dir != "" } { set libffi_dir [file dirname ${libffi_dir}] set libffi_link_flags "-L${libffi_dir}/.libs" } set_ld_library_path_env_vars libffi_maybe_build_wrapper "${objdir}/testglue.o" } proc libffi_exit { } { global gluefile; if [info exists gluefile] { file_on_build delete $gluefile; unset gluefile; } } proc libffi_target_compile { source dest type options } { global gluefile wrap_flags; global srcdir global blddirffi global TOOL_OPTIONS global libffi_link_flags global libffi_include global target_triplet if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { lappend options "libs=${gluefile}" lappend options "ldflags=$wrap_flags" } # TOOL_OPTIONS must come first, so that it doesn't override testcase # specific options. if [info exists TOOL_OPTIONS] { lappend options [concat "additional_flags=$TOOL_OPTIONS" $options]; } # search for ffi_mips.h in srcdir, too lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." lappend options "additional_flags=${libffi_link_flags}" # Darwin needs a stack execution allowed flag. if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] || [istarget "*-*-darwin2*"] } { lappend options "additional_flags=-Wl,-allow_stack_execute" } # If you're building the compiler with --prefix set to a place # where it's not yet installed, then the linker won't be able to # find the libgcc used by libffi.dylib. We could pass the # -dylib_file option, but that's complicated, and it's much easier # to just make the linker find libgcc using -L options. if { [string match "*-*-darwin*" $target_triplet] } { lappend options "libs= -shared-libgcc" } if { [string match "*-*-openbsd*" $target_triplet] } { lappend options "libs= -lpthread" } lappend options "libs= -lffi" if { [string match "aarch64*-*-linux*" $target_triplet] } { lappend options "libs= -lpthread" } verbose "options: $options" return [target_compile $source $dest $type $options] } # Utility routines. # # search_for -- looks for a string match in a file # proc search_for { file pattern } { set fd [open $file r] while { [gets $fd cur_line]>=0 } { if [string match "*$pattern*" $cur_line] then { close $fd return 1 } } close $fd return 0 } # Modified dg-runtest that can cycle through a list of optimization options # as c-torture does. proc libffi-dg-runtest { testcases default-extra-flags } { global runtests foreach test $testcases { # If we're only testing specific files and this isn't one of # them, skip it. if ![runtest_file_p $runtests $test] { continue } # Look for a loop within the source code - if we don't find one, # don't pass -funroll[-all]-loops. global torture_with_loops torture_without_loops if [expr [search_for $test "for*("]+[search_for $test "while*("]] { set option_list $torture_with_loops } else { set option_list $torture_without_loops } set nshort [file tail [file dirname $test]]/[file tail $test] foreach flags $option_list { verbose "Testing $nshort, $flags" 1 dg-test $test $flags ${default-extra-flags} } } } # Like check_conditional_xfail, but callable from a dg test. proc dg-xfail-if { args } { set args [lreplace $args 0 0] set selector "target [join [lindex $args 1]]" if { [dg-process-target $selector] == "S" } { global compiler_conditional_xfail_data set compiler_conditional_xfail_data $args } } proc check-flags { args } { # The args are within another list; pull them out. set args [lindex $args 0] # The next two arguments are optional. If they were not specified, # use the defaults. if { [llength $args] == 2 } { lappend $args [list "*"] } if { [llength $args] == 3 } { lappend $args [list ""] } # If the option strings are the defaults, or the same as the # defaults, there is no need to call check_conditional_xfail to # compare them to the actual options. if { [string compare [lindex $args 2] "*"] == 0 && [string compare [lindex $args 3] "" ] == 0 } { set result 1 } else { # The target list might be an effective-target keyword, so replace # the original list with "*-*-*", since we already know it matches. set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] } return $result } proc dg-skip-if { args } { # Verify the number of arguments. The last two are optional. set args [lreplace $args 0 0] if { [llength $args] < 2 || [llength $args] > 4 } { error "dg-skip-if 2: need 2, 3, or 4 arguments" } # Don't bother if we're already skipping the test. upvar dg-do-what dg-do-what if { [lindex ${dg-do-what} 1] == "N" } { return } set selector [list target [lindex $args 1]] if { [dg-process-target $selector] == "S" } { if [check-flags $args] { upvar dg-do-what dg-do-what set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] } } } # We need to make sure that additional_files and additional_sources # are both cleared out after every test. It is not enough to clear # them out *before* the next test run because gcc-target-compile gets # run directly from some .exp files (outside of any test). (Those # uses should eventually be eliminated.) # Because the DG framework doesn't provide a hook that is run at the # end of a test, we must replace dg-test with a wrapper. if { [info procs saved-dg-test] == [list] } { rename dg-test saved-dg-test proc dg-test { args } { global additional_files global additional_sources global errorInfo if { [ catch { eval saved-dg-test $args } errmsg ] } { set saved_info $errorInfo set additional_files "" set additional_sources "" error $errmsg $saved_info } set additional_files "" set additional_sources "" } } # Local Variables: # tcl-indent-level:4 # End: polyml-5.6/libffi/testsuite/lib/target-libpath.exp000066400000000000000000000227761265146633400224070ustar00rootroot00000000000000# Copyright (C) 2004, 2005, 2007 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 GCC; see the file COPYING3. If not see # . # This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca) set orig_environment_saved 0 set orig_ld_library_path_saved 0 set orig_ld_run_path_saved 0 set orig_shlib_path_saved 0 set orig_ld_libraryn32_path_saved 0 set orig_ld_library64_path_saved 0 set orig_ld_library_path_32_saved 0 set orig_ld_library_path_64_saved 0 set orig_dyld_library_path_saved 0 set orig_path_saved 0 ####################################### # proc set_ld_library_path_env_vars { } ####################################### proc set_ld_library_path_env_vars { } { global ld_library_path global orig_environment_saved global orig_ld_library_path_saved global orig_ld_run_path_saved global orig_shlib_path_saved global orig_ld_libraryn32_path_saved global orig_ld_library64_path_saved global orig_ld_library_path_32_saved global orig_ld_library_path_64_saved global orig_dyld_library_path_saved global orig_path_saved global orig_ld_library_path global orig_ld_run_path global orig_shlib_path global orig_ld_libraryn32_path global orig_ld_library64_path global orig_ld_library_path_32 global orig_ld_library_path_64 global orig_dyld_library_path global orig_path global GCC_EXEC_PREFIX # Set the relocated compiler prefix, but only if the user hasn't specified one. if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } { setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX" } # Setting the ld library path causes trouble when testing cross-compilers. if { [is_remote target] } { return } if { $orig_environment_saved == 0 } { global env set orig_environment_saved 1 # Save the original environment. if [info exists env(LD_LIBRARY_PATH)] { set orig_ld_library_path "$env(LD_LIBRARY_PATH)" set orig_ld_library_path_saved 1 } if [info exists env(LD_RUN_PATH)] { set orig_ld_run_path "$env(LD_RUN_PATH)" set orig_ld_run_path_saved 1 } if [info exists env(SHLIB_PATH)] { set orig_shlib_path "$env(SHLIB_PATH)" set orig_shlib_path_saved 1 } if [info exists env(LD_LIBRARYN32_PATH)] { set orig_ld_libraryn32_path "$env(LD_LIBRARYN32_PATH)" set orig_ld_libraryn32_path_saved 1 } if [info exists env(LD_LIBRARY64_PATH)] { set orig_ld_library64_path "$env(LD_LIBRARY64_PATH)" set orig_ld_library64_path_saved 1 } if [info exists env(LD_LIBRARY_PATH_32)] { set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)" set orig_ld_library_path_32_saved 1 } if [info exists env(LD_LIBRARY_PATH_64)] { set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)" set orig_ld_library_path_64_saved 1 } if [info exists env(DYLD_LIBRARY_PATH)] { set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)" set orig_dyld_library_path_saved 1 } if [info exists env(PATH)] { set orig_path "$env(PATH)" set orig_path_saved 1 } } # We need to set ld library path in the environment. Currently, # unix.exp doesn't set the environment correctly for all systems. # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a # program. We also need the environment set for compilations, etc. # # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH # (for the 64-bit ABI). The same applies to Darwin (DYLD_LIBRARY_PATH), # Solaris 32 bit (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), # and HP-UX (SHLIB_PATH). In some cases, the variables are independent # of LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the # variable is not defined. # # Doing this is somewhat of a hack as ld_library_path gets repeated in # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables. if { $orig_ld_library_path_saved } { setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path" } else { setenv LD_LIBRARY_PATH "$ld_library_path" } if { $orig_ld_run_path_saved } { setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path" } else { setenv LD_RUN_PATH "$ld_library_path" } # The default shared library dynamic path search for 64-bit # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH. # LD_LIBRARY_PATH isn't used for 32-bit executables. Thus, we # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent. if { $orig_shlib_path_saved } { setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path" } else { setenv SHLIB_PATH "$ld_library_path" } if { $orig_ld_libraryn32_path_saved } { setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_libraryn32_path" } elseif { $orig_ld_library_path_saved } { setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_library_path" } else { setenv LD_LIBRARYN32_PATH "$ld_library_path" } if { $orig_ld_library64_path_saved } { setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library64_path" } elseif { $orig_ld_library_path_saved } { setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library_path" } else { setenv LD_LIBRARY64_PATH "$ld_library_path" } if { $orig_ld_library_path_32_saved } { setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32" } elseif { $orig_ld_library_path_saved } { setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path" } else { setenv LD_LIBRARY_PATH_32 "$ld_library_path" } if { $orig_ld_library_path_64_saved } { setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64" } elseif { $orig_ld_library_path_saved } { setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path" } else { setenv LD_LIBRARY_PATH_64 "$ld_library_path" } if { $orig_dyld_library_path_saved } { setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path" } else { setenv DYLD_LIBRARY_PATH "$ld_library_path" } if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { if { $orig_path_saved } { setenv PATH "$ld_library_path:$orig_path" } else { setenv PATH "$ld_library_path" } } verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path" } ####################################### # proc restore_ld_library_path_env_vars { } ####################################### proc restore_ld_library_path_env_vars { } { global orig_environment_saved global orig_ld_library_path_saved global orig_ld_run_path_saved global orig_shlib_path_saved global orig_ld_libraryn32_path_saved global orig_ld_library64_path_saved global orig_ld_library_path_32_saved global orig_ld_library_path_64_saved global orig_dyld_library_path_saved global orig_path_saved global orig_ld_library_path global orig_ld_run_path global orig_shlib_path global orig_ld_libraryn32_path global orig_ld_library64_path global orig_ld_library_path_32 global orig_ld_library_path_64 global orig_dyld_library_path global orig_path if { $orig_environment_saved == 0 } { return } if { $orig_ld_library_path_saved } { setenv LD_LIBRARY_PATH "$orig_ld_library_path" } elseif [info exists env(LD_LIBRARY_PATH)] { unsetenv LD_LIBRARY_PATH } if { $orig_ld_run_path_saved } { setenv LD_RUN_PATH "$orig_ld_run_path" } elseif [info exists env(LD_RUN_PATH)] { unsetenv LD_RUN_PATH } if { $orig_shlib_path_saved } { setenv SHLIB_PATH "$orig_shlib_path" } elseif [info exists env(SHLIB_PATH)] { unsetenv SHLIB_PATH } if { $orig_ld_libraryn32_path_saved } { setenv LD_LIBRARYN32_PATH "$orig_ld_libraryn32_path" } elseif [info exists env(LD_LIBRARYN32_PATH)] { unsetenv LD_LIBRARYN32_PATH } if { $orig_ld_library64_path_saved } { setenv LD_LIBRARY64_PATH "$orig_ld_library64_path" } elseif [info exists env(LD_LIBRARY64_PATH)] { unsetenv LD_LIBRARY64_PATH } if { $orig_ld_library_path_32_saved } { setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32" } elseif [info exists env(LD_LIBRARY_PATH_32)] { unsetenv LD_LIBRARY_PATH_32 } if { $orig_ld_library_path_64_saved } { setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64" } elseif [info exists env(LD_LIBRARY_PATH_64)] { unsetenv LD_LIBRARY_PATH_64 } if { $orig_dyld_library_path_saved } { setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path" } elseif [info exists env(DYLD_LIBRARY_PATH)] { unsetenv DYLD_LIBRARY_PATH } if { $orig_path_saved } { setenv PATH "$orig_path" } elseif [info exists env(PATH)] { unsetenv PATH } } ####################################### # proc get_shlib_extension { } ####################################### proc get_shlib_extension { } { global shlib_ext if { [ istarget *-*-darwin* ] } { set shlib_ext "dylib" } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } { set shlib_ext "dll" } elseif { [ istarget hppa*-*-hpux* ] } { set shlib_ext "sl" } else { set shlib_ext "so" } return $shlib_ext } polyml-5.6/libffi/testsuite/lib/wrapper.exp000066400000000000000000000035251265146633400211470ustar00rootroot00000000000000# Copyright (C) 2004, 2007 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 GCC; see the file COPYING3. If not see # . # This file contains GCC-specifics for status wrappers for test programs. # ${tool}_maybe_build_wrapper -- Build wrapper object if the target # needs it. FILENAME is the path to the wrapper file. If there are # additional arguments, they are command-line options to provide to # the compiler when compiling FILENAME. proc ${tool}_maybe_build_wrapper { filename args } { global gluefile wrap_flags if { [target_info needs_status_wrapper] != "" \ && [target_info needs_status_wrapper] != "0" \ && ![info exists gluefile] } { set saved_wrap_compile_flags [target_info wrap_compile_flags] set flags [join $args " "] # The wrapper code may contain code that gcc objects on. This # became true for dejagnu-1.4.4. The set of warnings and code # that gcc objects on may change, so just make sure -w is always # passed to turn off all warnings. set_currtarget_info wrap_compile_flags \ "$saved_wrap_compile_flags -w $flags" set result [build_wrapper $filename] set_currtarget_info wrap_compile_flags "$saved_wrap_compile_flags" if { $result != "" } { set gluefile [lindex $result 0] set wrap_flags [lindex $result 1] } } } polyml-5.6/libffi/testsuite/libffi.call/000077500000000000000000000000001265146633400203435ustar00rootroot00000000000000polyml-5.6/libffi/testsuite/libffi.call/call.exp000066400000000000000000000025761265146633400220060ustar00rootroot00000000000000# Copyright (C) 2003, 2006, 2009, 2010 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; see the file COPYING3. If not see # . dg-init libffi-init global srcdir subdir if { [string match $using_gcc "yes"] } { dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O0 -W -Wall" "" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2" "" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O3" "" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-Os" "" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2 -fomit-frame-pointer" "" } else { # Assume we are using the vendor compiler. dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "" "" } dg-finish # Local Variables: # tcl-indent-level:4 # End: polyml-5.6/libffi/testsuite/libffi.call/closure_fn0.c000066400000000000000000000056511265146633400227350ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + (int)(*(signed short *)args[4]) + (int)(*(unsigned long long *)args[5]) + (int)*(int *)args[6] + (int)(*(int *)args[7]) + (int)(*(double *)args[8]) + (int)*(int *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(int *)args[13]) + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), (int)(*(unsigned long long *)args[2]), (int)*(int *)args[3], (int)(*(signed short *)args[4]), (int)(*(unsigned long long *)args[5]), (int)*(int *)args[6], (int)(*(int *)args[7]), (int)(*(double *)args[8]), (int)*(int *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(int *)args[14]),*(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long, int, signed short, unsigned long long, int, int, double, int, int, float, int, int, int, int); int main (void) { ffi_cif cif; void * code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; cl_arg_types[0] = &ffi_type_uint64; cl_arg_types[1] = &ffi_type_sint; cl_arg_types[2] = &ffi_type_uint64; cl_arg_types[3] = &ffi_type_sint; cl_arg_types[4] = &ffi_type_sshort; cl_arg_types[5] = &ffi_type_uint64; cl_arg_types[6] = &ffi_type_sint; cl_arg_types[7] = &ffi_type_sint; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_sint; cl_arg_types[10] = &ffi_type_sint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_sint; cl_arg_types[14] = &ffi_type_sint; cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type0)code)) (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, 19, 21, 1); /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ printf("res: %d\n",res); /* { dg-output "\nres: 680" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn1.c000066400000000000000000000054711265146633400227360ustar00rootroot00000000000000/* Area: closure_call. Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(float *)args[0] +(int)(*(float *)args[1]) + (int)(*(float *)args[2]) + (int)*(float *)args[3] + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + (int)*(float *)args[6] + (int)(*(int *)args[7]) + (int)(*(double*)args[8]) + (int)*(int *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(int *)args[13]) + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(float *)args[0], (int)(*(float *)args[1]), (int)(*(float *)args[2]), (int)*(float *)args[3], (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), (int)*(float *)args[6], (int)(*(int *)args[7]), (int)(*(double *)args[8]), (int)*(int *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type1)(float, float, float, float, signed short, float, float, int, double, int, int, float, int, int, int, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; cl_arg_types[0] = &ffi_type_float; cl_arg_types[1] = &ffi_type_float; cl_arg_types[2] = &ffi_type_float; cl_arg_types[3] = &ffi_type_float; cl_arg_types[4] = &ffi_type_sshort; cl_arg_types[5] = &ffi_type_float; cl_arg_types[6] = &ffi_type_float; cl_arg_types[7] = &ffi_type_sint; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_sint; cl_arg_types[10] = &ffi_type_sint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_sint; cl_arg_types[14] = &ffi_type_sint; cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type1)code)) (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, 19, 21, 1); /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ printf("res: %d\n",res); /* { dg-output "\nres: 255" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn2.c000066400000000000000000000055141265146633400227350ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(double *)args[0] +(int)(*(double *)args[1]) + (int)(*(double *)args[2]) + (int)*(double *)args[3] + (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) + (int)*(double *)args[6] + (int)(*(int *)args[7]) + (int)(*(double *)args[8]) + (int)*(int *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(float *)args[13]) + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(double *)args[0], (int)(*(double *)args[1]), (int)(*(double *)args[2]), (int)*(double *)args[3], (int)(*(signed short *)args[4]), (int)(*(double *)args[5]), (int)*(double *)args[6], (int)(*(int *)args[7]), (int)(*(double*)args[8]), (int)*(int *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(float *)args[13]), (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type2)(double, double, double, double, signed short, double, double, int, double, int, int, float, int, float, int, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; cl_arg_types[0] = &ffi_type_double; cl_arg_types[1] = &ffi_type_double; cl_arg_types[2] = &ffi_type_double; cl_arg_types[3] = &ffi_type_double; cl_arg_types[4] = &ffi_type_sshort; cl_arg_types[5] = &ffi_type_double; cl_arg_types[6] = &ffi_type_double; cl_arg_types[7] = &ffi_type_sint; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_sint; cl_arg_types[10] = &ffi_type_sint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_float; cl_arg_types[14] = &ffi_type_sint; cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type2)code)) (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13, 19.0, 21, 1); /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ printf("res: %d\n",res); /* { dg-output "\nres: 255" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn3.c000066400000000000000000000055371265146633400227430ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(float *)args[0] +(int)(*(float *)args[1]) + (int)(*(float *)args[2]) + (int)*(float *)args[3] + (int)(*(float *)args[4]) + (int)(*(float *)args[5]) + (int)*(float *)args[6] + (int)(*(float *)args[7]) + (int)(*(double *)args[8]) + (int)*(int *)args[9] + (int)(*(float *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(float *)args[13]) + (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(float *)args[0], (int)(*(float *)args[1]), (int)(*(float *)args[2]), (int)*(float *)args[3], (int)(*(float *)args[4]), (int)(*(float *)args[5]), (int)*(float *)args[6], (int)(*(float *)args[7]), (int)(*(double *)args[8]), (int)*(int *)args[9], (int)(*(float *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(float *)args[13]), (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type3)(float, float, float, float, float, float, float, float, double, int, float, float, int, float, float, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; cl_arg_types[0] = &ffi_type_float; cl_arg_types[1] = &ffi_type_float; cl_arg_types[2] = &ffi_type_float; cl_arg_types[3] = &ffi_type_float; cl_arg_types[4] = &ffi_type_float; cl_arg_types[5] = &ffi_type_float; cl_arg_types[6] = &ffi_type_float; cl_arg_types[7] = &ffi_type_float; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_sint; cl_arg_types[10] = &ffi_type_float; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_float; cl_arg_types[14] = &ffi_type_float; cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type3)code)) (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13, 19.19, 21.21, 1); /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */ printf("res: %d\n",res); /* { dg-output "\nres: 135" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn4.c000066400000000000000000000057101265146633400227350ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple long long values passing. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20031026 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + (int)*(unsigned long long *)args[10] + (int)*(unsigned long long *)args[11] + (int)*(unsigned long long *)args[12] + (int)*(unsigned long long *)args[13] + (int)*(unsigned long long *)args[14] + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(unsigned long long *)args[0], (int)*(unsigned long long *)args[1], (int)*(unsigned long long *)args[2], (int)*(unsigned long long *)args[3], (int)*(unsigned long long *)args[4], (int)*(unsigned long long *)args[5], (int)*(unsigned long long *)args[6], (int)*(unsigned long long *)args[7], (int)*(unsigned long long *)args[8], (int)*(unsigned long long *)args[9], (int)*(unsigned long long *)args[10], (int)*(unsigned long long *)args[11], (int)*(unsigned long long *)args[12], (int)*(unsigned long long *)args[13], (int)*(unsigned long long *)args[14], *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type0)(unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int i, res; for (i = 0; i < 15; i++) { cl_arg_types[i] = &ffi_type_uint64; } cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type0)code)) (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL, 13LL, 19LL, 21LL, 1); /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ printf("res: %d\n",res); /* { dg-output "\nres: 680" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn5.c000066400000000000000000000057711265146633400227450ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple long long values passing. Exceed the limit of gpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20031026 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] + (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] + (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] + (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] + (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] + (int)*(int *)args[10] + (int)*(unsigned long long *)args[11] + (int)*(unsigned long long *)args[12] + (int)*(unsigned long long *)args[13] + (int)*(unsigned long long *)args[14] + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(unsigned long long *)args[0], (int)*(unsigned long long *)args[1], (int)*(unsigned long long *)args[2], (int)*(unsigned long long *)args[3], (int)*(unsigned long long *)args[4], (int)*(unsigned long long *)args[5], (int)*(unsigned long long *)args[6], (int)*(unsigned long long *)args[7], (int)*(unsigned long long *)args[8], (int)*(unsigned long long *)args[9], (int)*(int *)args[10], (int)*(unsigned long long *)args[11], (int)*(unsigned long long *)args[12], (int)*(unsigned long long *)args[13], (int)*(unsigned long long *)args[14], *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type0)(unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long, int, unsigned long long, unsigned long long, unsigned long long, unsigned long long, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int i, res; for (i = 0; i < 10; i++) { cl_arg_types[i] = &ffi_type_uint64; } cl_arg_types[10] = &ffi_type_sint; for (i = 11; i < 15; i++) { cl_arg_types[i] = &ffi_type_uint64; } cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type0)code)) (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL, 13LL, 19LL, 21LL, 1); /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ printf("res: %d\n",res); /* { dg-output "\nres: 680" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_fn6.c000066400000000000000000000060231265146633400227350ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC. Limitations: none. PR: PR23404 Originator: 20050830 */ /* { dg-do run } */ #include "ffitest.h" static void closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(unsigned long long *)args[0] + (int)(*(unsigned long long *)args[1]) + (int)(*(unsigned long long *)args[2]) + (int)*(unsigned long long *)args[3] + (int)(*(int *)args[4]) + (int)(*(double *)args[5]) + (int)*(double *)args[6] + (int)(*(float *)args[7]) + (int)(*(double *)args[8]) + (int)*(double *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(int *)args[13]) + (int)(*(double *)args[14]) + (int)*(double *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(unsigned long long *)args[0], (int)(*(unsigned long long *)args[1]), (int)(*(unsigned long long *)args[2]), (int)*(unsigned long long *)args[3], (int)(*(int *)args[4]), (int)(*(double *)args[5]), (int)*(double *)args[6], (int)(*(float *)args[7]), (int)(*(double *)args[8]), (int)*(double *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(double *)args[14]), (int)(*(double *)args[15]), (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_test_type0)(unsigned long long, unsigned long long, unsigned long long, unsigned long long, int, double, double, float, double, double, int, float, int, int, double, double); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; cl_arg_types[0] = &ffi_type_uint64; cl_arg_types[1] = &ffi_type_uint64; cl_arg_types[2] = &ffi_type_uint64; cl_arg_types[3] = &ffi_type_uint64; cl_arg_types[4] = &ffi_type_sint; cl_arg_types[5] = &ffi_type_double; cl_arg_types[6] = &ffi_type_double; cl_arg_types[7] = &ffi_type_float; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_double; cl_arg_types[10] = &ffi_type_sint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_sint; cl_arg_types[14] = &ffi_type_double; cl_arg_types[15] = &ffi_type_double; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0, (void *) 3 /* userdata */, code) == FFI_OK); res = (*((closure_test_type0)code)) (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13, 19, 21., 1.); /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ printf("res: %d\n",res); /* { dg-output "\nres: 680" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_loc_fn0.c000066400000000000000000000060301265146633400235620ustar00rootroot00000000000000/* Area: closure_call Purpose: Check multiple values passing from different type. Also, exceed the limit of gpr and fpr registers on PowerPC Darwin. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) + (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] + (int)(*(signed short *)args[4]) + (int)(*(unsigned long long *)args[5]) + (int)*(int *)args[6] + (int)(*(int *)args[7]) + (int)(*(double *)args[8]) + (int)*(int *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(int *)args[13]) + (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]), (int)(*(unsigned long long *)args[2]), (int)*(int *)args[3], (int)(*(signed short *)args[4]), (int)(*(unsigned long long *)args[5]), (int)*(int *)args[6], (int)(*(int *)args[7]), (int)(*(double *)args[8]), (int)*(int *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(int *)args[14]),*(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg *)resp); } typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long, int, signed short, unsigned long long, int, int, double, int, int, float, int, int, int, int); int main (void) { ffi_cif cif; ffi_closure *pcl; ffi_type * cl_arg_types[17]; int res; void *codeloc; cl_arg_types[0] = &ffi_type_uint64; cl_arg_types[1] = &ffi_type_sint; cl_arg_types[2] = &ffi_type_uint64; cl_arg_types[3] = &ffi_type_sint; cl_arg_types[4] = &ffi_type_sshort; cl_arg_types[5] = &ffi_type_uint64; cl_arg_types[6] = &ffi_type_sint; cl_arg_types[7] = &ffi_type_sint; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_sint; cl_arg_types[10] = &ffi_type_sint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_sint; cl_arg_types[13] = &ffi_type_sint; cl_arg_types[14] = &ffi_type_sint; cl_arg_types[15] = &ffi_type_sint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc); CHECK(pcl != NULL); CHECK(codeloc != NULL); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0, (void *) 3 /* userdata */, codeloc) == FFI_OK); CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0); res = (*((closure_loc_test_type0)codeloc)) (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13, 19, 21, 1); /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */ printf("res: %d\n",res); /* { dg-output "\nres: 680" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_stdcall.c000066400000000000000000000036401265146633400236740ustar00rootroot00000000000000/* Area: closure_call (stdcall convention) Purpose: Check handling when caller expects stdcall callee Limitations: none. PR: none. Originator: */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static void closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(int *)args[0] + (int)(*(int *)args[1]) + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + (int)(intptr_t)userdata; printf("%d %d %d %d: %d\n", (int)*(int *)args[0], (int)(*(int *)args[1]), (int)(*(int *)args[2]), (int)(*(int *)args[3]), (int)*(ffi_arg *)resp); } typedef int (__stdcall *closure_test_type0)(int, int, int, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; void* sp_pre; void* sp_post; char buf[1024]; cl_arg_types[0] = &ffi_type_uint; cl_arg_types[1] = &ffi_type_uint; cl_arg_types[2] = &ffi_type_uint; cl_arg_types[3] = &ffi_type_uint; cl_arg_types[4] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall, (void *) 3 /* userdata */, code) == FFI_OK); #ifdef _MSC_VER __asm { mov sp_pre, esp } #else asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); #endif res = (*(closure_test_type0)code)(0, 1, 2, 3); #ifdef _MSC_VER __asm { mov sp_post, esp } #else asm volatile (" movl %%esp,%0" : "=g" (sp_post)); #endif /* { dg-output "0 1 2 3: 9" } */ printf("res: %d\n",res); /* { dg-output "\nres: 9" } */ sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post); printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf)); /* { dg-output "\nstack pointer match" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/closure_thiscall.c000066400000000000000000000036461265146633400240570ustar00rootroot00000000000000/* Area: closure_call (thiscall convention) Purpose: Check handling when caller expects thiscall callee Limitations: none. PR: none. Originator: */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static void closure_test_thiscall(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) { *(ffi_arg*)resp = (int)*(int *)args[0] + (int)(*(int *)args[1]) + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + (int)(intptr_t)userdata; printf("%d %d %d %d: %d\n", (int)*(int *)args[0], (int)(*(int *)args[1]), (int)(*(int *)args[2]), (int)(*(int *)args[3]), (int)*(ffi_arg *)resp); } typedef int (__thiscall *closure_test_type0)(int, int, int, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; int res; void* sp_pre; void* sp_post; char buf[1024]; cl_arg_types[0] = &ffi_type_uint; cl_arg_types[1] = &ffi_type_uint; cl_arg_types[2] = &ffi_type_uint; cl_arg_types[3] = &ffi_type_uint; cl_arg_types[4] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_THISCALL, 4, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_thiscall, (void *) 3 /* userdata */, code) == FFI_OK); #ifdef _MSC_VER __asm { mov sp_pre, esp } #else asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); #endif res = (*(closure_test_type0)code)(0, 1, 2, 3); #ifdef _MSC_VER __asm { mov sp_post, esp } #else asm volatile (" movl %%esp,%0" : "=g" (sp_post)); #endif /* { dg-output "0 1 2 3: 9" } */ printf("res: %d\n",res); /* { dg-output "\nres: 9" } */ sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post); printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf)); /* { dg-output "\nstack pointer match" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_12byte.c000066400000000000000000000047421265146633400224650ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_12byte { int a; int b; int c; } cls_struct_12byte; cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1, struct cls_struct_12byte b2) { struct cls_struct_12byte result; result.a = b1.a + b2.a; result.b = b1.b + b2.b; result.c = b1.c + b2.c; printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, result.a, result.b, result.c); return result; } static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args , void* userdata __UNUSED__) { struct cls_struct_12byte b1, b2; b1 = *(struct cls_struct_12byte*)(args[0]); b2 = *(struct cls_struct_12byte*)(args[1]); *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_12byte h_dbl = { 7, 4, 9 }; struct cls_struct_12byte j_dbl = { 1, 5, 3 }; struct cls_struct_12byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_sint; cls_struct_fields[1] = &ffi_type_sint; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &h_dbl; args_dbl[1] = &j_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl); /* { dg-output "7 4 9 1 5 3: 8 9 12" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 8 9 12" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK); res_dbl.a = 0; res_dbl.b = 0; res_dbl.c = 0; res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl); /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 8 9 12" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_16byte.c000066400000000000000000000050331265146633400224630ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_16byte { int a; double b; int c; } cls_struct_16byte; cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1, struct cls_struct_16byte b2) { struct cls_struct_16byte result; result.a = b1.a + b2.a; result.b = b1.b + b2.b; result.c = b1.c + b2.c; printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c, result.a, result.b, result.c); return result; } static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_16byte b1, b2; b1 = *(struct cls_struct_16byte*)(args[0]); b2 = *(struct cls_struct_16byte*)(args[1]); *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_16byte h_dbl = { 7, 8.0, 9 }; struct cls_struct_16byte j_dbl = { 1, 9.0, 3 }; struct cls_struct_16byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_sint; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &h_dbl; args_dbl[1] = &j_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl); /* { dg-output "7 8 9 1 9 3: 8 17 12" } */ printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 8 17 12" } */ res_dbl.a = 0; res_dbl.b = 0.0; res_dbl.c = 0; CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl); /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */ printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 8 17 12" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_18byte.c000066400000000000000000000053241265146633400224700ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Double alignment check on darwin. Limitations: none. PR: none. Originator: 20030915 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_18byte { double a; unsigned char b; unsigned char c; double d; } cls_struct_18byte; cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1, struct cls_struct_18byte a2) { struct cls_struct_18byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d, a2.a, a2.b, a2.c, a2.d, result.a, result.b, result.c, result.d); return result; } static void cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_18byte a1, a2; a1 = *(struct cls_struct_18byte*)(args[0]); a2 = *(struct cls_struct_18byte*)(args[1]); *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[5]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 }; struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 }; struct cls_struct_18byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl); /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */ printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 5 252 250 8" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl); /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */ printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 5 252 250 8" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_19byte.c000066400000000000000000000056261265146633400224760ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Double alignment check on darwin. Limitations: none. PR: none. Originator: 20030915 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_19byte { double a; unsigned char b; unsigned char c; double d; unsigned char e; } cls_struct_19byte; cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1, struct cls_struct_19byte a2) { struct cls_struct_19byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; result.e = a1.e + a2.e; printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n", a1.a, a1.b, a1.c, a1.d, a1.e, a2.a, a2.b, a2.c, a2.d, a2.e, result.a, result.b, result.c, result.d, result.e); return result; } static void cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_19byte a1, a2; a1 = *(struct cls_struct_19byte*)(args[0]); a2 = *(struct cls_struct_19byte*)(args[1]); *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[6]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 }; struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 }; struct cls_struct_19byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_uchar; cls_struct_fields[5] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl); /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e); /* { dg-output "\nres: 5 252 250 8 239" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl); /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */ printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e); /* { dg-output "\nres: 5 252 250 8 239" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_1_1byte.c000066400000000000000000000043771265146633400226270ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Limitations: none. PR: none. Originator: 20030902 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_1_1byte { unsigned char a; } cls_struct_1_1byte; cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1, struct cls_struct_1_1byte a2) { struct cls_struct_1_1byte result; result.a = a1.a + a2.a; printf("%d %d: %d\n", a1.a, a2.a, result.a); return result; } static void cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_1_1byte a1, a2; a1 = *(struct cls_struct_1_1byte*)(args[0]); a2 = *(struct cls_struct_1_1byte*)(args[1]); *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[2]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_1_1byte g_dbl = { 12 }; struct cls_struct_1_1byte f_dbl = { 178 }; struct cls_struct_1_1byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl); /* { dg-output "12 178: 190" } */ printf("res: %d\n", res_dbl.a); /* { dg-output "\nres: 190" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl); /* { dg-output "\n12 178: 190" } */ printf("res: %d\n", res_dbl.a); /* { dg-output "\nres: 190" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_20byte.c000066400000000000000000000047531265146633400224660ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_20byte { double a; double b; int c; } cls_struct_20byte; cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, struct cls_struct_20byte a2) { struct cls_struct_20byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_20byte a1, a2; a1 = *(struct cls_struct_20byte*)(args[0]); a2 = *(struct cls_struct_20byte*)(args[1]); *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 }; struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 }; struct cls_struct_20byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 5 7 10" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 5 7 10" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_20byte1.c000066400000000000000000000047551265146633400225510ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_20byte { int a; double b; double c; } cls_struct_20byte; cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1, struct cls_struct_20byte a2) { struct cls_struct_20byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_20byte a1, a2; a1 = *(struct cls_struct_20byte*)(args[0]); a2 = *(struct cls_struct_20byte*)(args[1]); *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 }; struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 }; struct cls_struct_20byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_sint; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl); /* { dg-output "1 2 3 4 5 7: 5 7 10" } */ printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 5 7 10" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl); /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */ printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 5 7 10" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_24byte.c000066400000000000000000000064701265146633400224700ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_24byte { double a; double b; int c; float d; } cls_struct_24byte; cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0, struct cls_struct_24byte b1, struct cls_struct_24byte b2, struct cls_struct_24byte b3) { struct cls_struct_24byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n", b0.a, b0.b, b0.c, b0.d, b1.a, b1.b, b1.c, b1.d, b2.a, b2.b, b2.c, b2.d, b3.a, b3.b, b3.c, b2.d, result.a, result.b, result.c, result.d); return result; } static void cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_24byte b0, b1, b2, b3; b0 = *(struct cls_struct_24byte*)(args[0]); b1 = *(struct cls_struct_24byte*)(args[1]); b2 = *(struct cls_struct_24byte*)(args[2]); b3 = *(struct cls_struct_24byte*)(args[3]); *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 }; struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 }; struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 }; struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 }; struct cls_struct_24byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = &ffi_type_float; cls_struct_fields[4] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl); /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 22 15 17 25" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte, cls_struct_24byte, cls_struct_24byte, cls_struct_24byte)) (code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */ printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 22 15 17 25" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_2byte.c000066400000000000000000000046001265146633400223750ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_2byte { unsigned char a; unsigned char b; } cls_struct_2byte; cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1, struct cls_struct_2byte a2) { struct cls_struct_2byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); return result; } static void cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_2byte a1, a2; a1 = *(struct cls_struct_2byte*)(args[0]); a2 = *(struct cls_struct_2byte*)(args[1]); *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_2byte g_dbl = { 12, 127 }; struct cls_struct_2byte f_dbl = { 1, 13 }; struct cls_struct_2byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl); /* { dg-output "12 127 1 13: 13 140" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 13 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl); /* { dg-output "\n12 127 1 13: 13 140" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 13 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_3_1byte.c000066400000000000000000000051631265146633400226230ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Limitations: none. PR: none. Originator: 20030902 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_3_1byte { unsigned char a; unsigned char b; unsigned char c; } cls_struct_3_1byte; cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1, struct cls_struct_3_1byte a2) { struct cls_struct_3_1byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_3_1byte a1, a2; a1 = *(struct cls_struct_3_1byte*)(args[0]); a2 = *(struct cls_struct_3_1byte*)(args[1]); *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_3_1byte g_dbl = { 12, 13, 14 }; struct cls_struct_3_1byte f_dbl = { 178, 179, 180 }; struct cls_struct_3_1byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl); /* { dg-output "12 13 14 178 179 180: 190 192 194" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 190 192 194" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl); /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 190 192 194" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_3byte1.c000066400000000000000000000046251265146633400224660ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_3byte { unsigned short a; unsigned char b; } cls_struct_3byte; cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1, struct cls_struct_3byte a2) { struct cls_struct_3byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); return result; } static void cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_3byte a1, a2; a1 = *(struct cls_struct_3byte*)(args[0]); a2 = *(struct cls_struct_3byte*)(args[1]); *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_3byte g_dbl = { 12, 119 }; struct cls_struct_3byte f_dbl = { 1, 15 }; struct cls_struct_3byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_ushort; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl); /* { dg-output "12 119 1 15: 13 134" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 13 134" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl); /* { dg-output "\n12 119 1 15: 13 134" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 13 134" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_3byte2.c000066400000000000000000000046731265146633400224720ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_3byte_1 { unsigned char a; unsigned short b; } cls_struct_3byte_1; cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1, struct cls_struct_3byte_1 a2) { struct cls_struct_3byte_1 result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); return result; } static void cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_3byte_1 a1, a2; a1 = *(struct cls_struct_3byte_1*)(args[0]); a2 = *(struct cls_struct_3byte_1*)(args[1]); *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_3byte_1 g_dbl = { 15, 125 }; struct cls_struct_3byte_1 f_dbl = { 9, 19 }; struct cls_struct_3byte_1 res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl); /* { dg-output "15 125 9 19: 24 144" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 24 144" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK); res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl); /* { dg-output "\n15 125 9 19: 24 144" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 24 144" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_4_1byte.c000066400000000000000000000054541265146633400226270ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Especially with small structures which may fit in one register. Depending on the ABI. Limitations: none. PR: none. Originator: 20030902 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_4_1byte { unsigned char a; unsigned char b; unsigned char c; unsigned char d; } cls_struct_4_1byte; cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1, struct cls_struct_4_1byte a2) { struct cls_struct_4_1byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a2.a, a2.b, a2.c, a2.d, result.a, result.b, result.c, result.d); return result; } static void cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_4_1byte a1, a2; a1 = *(struct cls_struct_4_1byte*)(args[0]); a2 = *(struct cls_struct_4_1byte*)(args[1]); *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 }; struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 }; struct cls_struct_4_1byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_uchar; cls_struct_fields[4] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl); /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 190 192 194 196" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl); /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 190 192 194 196" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_4byte.c000066400000000000000000000045431265146633400224050ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_4byte { unsigned short a; unsigned short b; } cls_struct_4byte; cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1, struct cls_struct_4byte a2) { struct cls_struct_4byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); return result; } static void cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_4byte a1, a2; a1 = *(struct cls_struct_4byte*)(args[0]); a2 = *(struct cls_struct_4byte*)(args[1]); *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_4byte g_dbl = { 127, 120 }; struct cls_struct_4byte f_dbl = { 12, 128 }; struct cls_struct_4byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_ushort; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 12 128: 139 248" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 139 248" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 12 128: 139 248" } */ printf("res: %d %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 139 248" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_5_1_byte.c000066400000000000000000000057161265146633400227700ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20050708 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_5byte { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; } cls_struct_5byte; cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, struct cls_struct_5byte a2) { struct cls_struct_5byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; result.e = a1.e + a2.e; printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a1.e, a2.a, a2.b, a2.c, a2.d, a2.e, result.a, result.b, result.c, result.d, result.e); return result; } static void cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_5byte a1, a2; a1 = *(struct cls_struct_5byte*)(args[0]); a2 = *(struct cls_struct_5byte*)(args[1]); *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[6]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 }; struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 }; struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 }; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_uchar; cls_struct_fields[4] = &ffi_type_uchar; cls_struct_fields[5] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e); /* { dg-output "\nres: 139 248 10 6 8" } */ res_dbl.a = 0; res_dbl.b = 0; res_dbl.c = 0; res_dbl.d = 0; res_dbl.e = 0; CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */ printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e); /* { dg-output "\nres: 139 248 10 6 8" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_5byte.c000066400000000000000000000051241265146633400224020ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_5byte { unsigned short a; unsigned short b; unsigned char c; } cls_struct_5byte; cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1, struct cls_struct_5byte a2) { struct cls_struct_5byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_5byte a1, a2; a1 = *(struct cls_struct_5byte*)(args[0]); a2 = *(struct cls_struct_5byte*)(args[1]); *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_5byte g_dbl = { 127, 120, 1 }; struct cls_struct_5byte f_dbl = { 12, 128, 9 }; struct cls_struct_5byte res_dbl = { 0, 0, 0 }; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_ushort; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 12 128 9: 139 248 10" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 139 248 10" } */ res_dbl.a = 0; res_dbl.b = 0; res_dbl.c = 0; CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 139 248 10" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_64byte.c000066400000000000000000000075201265146633400224710ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check bigger struct which overlaps the gp and fp register count on Darwin/AIX/ppc64. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_64byte { double a; double b; double c; double d; double e; double f; double g; double h; } cls_struct_64byte; cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0, struct cls_struct_64byte b1, struct cls_struct_64byte b2, struct cls_struct_64byte b3) { struct cls_struct_64byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; result.e = b0.e + b1.e + b2.e + b3.e; result.f = b0.f + b1.f + b2.f + b3.f; result.g = b0.g + b1.g + b2.g + b3.g; result.h = b0.h + b1.h + b2.h + b3.h; printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, result.d, result.e, result.f, result.g, result.h); return result; } static void cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_64byte b0, b1, b2, b3; b0 = *(struct cls_struct_64byte*)(args[0]); b1 = *(struct cls_struct_64byte*)(args[1]); b2 = *(struct cls_struct_64byte*)(args[2]); b3 = *(struct cls_struct_64byte*)(args[3]); *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[9]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 }; struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 }; struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 }; struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 }; struct cls_struct_64byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_double; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_double; cls_struct_fields[7] = &ffi_type_double; cls_struct_fields[8] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl); /* { dg-output "22 15 17 25 6 13 19 18" } */ printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte, cls_struct_64byte, cls_struct_64byte, cls_struct_64byte)) (code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n22 15 17 25 6 13 19 18" } */ printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h); /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_6_1_byte.c000066400000000000000000000062161265146633400227650ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20050708 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_6byte { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; unsigned char f; } cls_struct_6byte; cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, struct cls_struct_6byte a2) { struct cls_struct_6byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; result.e = a1.e + a2.e; result.f = a1.f + a2.f; printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, result.a, result.b, result.c, result.d, result.e, result.f); return result; } static void cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_6byte a1, a2; a1 = *(struct cls_struct_6byte*)(args[0]); a2 = *(struct cls_struct_6byte*)(args[1]); *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[7]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 }; struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 }; struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 }; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_uchar; cls_struct_fields[4] = &ffi_type_uchar; cls_struct_fields[5] = &ffi_type_uchar; cls_struct_fields[6] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f); /* { dg-output "\nres: 139 248 10 6 8 10" } */ res_dbl.a = 0; res_dbl.b = 0; res_dbl.c = 0; res_dbl.d = 0; res_dbl.e = 0; res_dbl.f = 0; CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */ printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f); /* { dg-output "\nres: 139 248 10 6 8 10" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_6byte.c000066400000000000000000000053201265146633400224010ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_6byte { unsigned short a; unsigned short b; unsigned char c; unsigned char d; } cls_struct_6byte; cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1, struct cls_struct_6byte a2) { struct cls_struct_6byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a2.a, a2.b, a2.c, a2.d, result.a, result.b, result.c, result.d); return result; } static void cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_6byte a1, a2; a1 = *(struct cls_struct_6byte*)(args[0]); a2 = *(struct cls_struct_6byte*)(args[1]); *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 }; struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 }; struct cls_struct_6byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_ushort; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_uchar; cls_struct_fields[4] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 139 248 10 255" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 139 248 10 255" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_7_1_byte.c000066400000000000000000000065161265146633400227710ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20050708 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_7byte { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; unsigned char f; unsigned char g; } cls_struct_7byte; cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, struct cls_struct_7byte a2) { struct cls_struct_7byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; result.e = a1.e + a2.e; result.f = a1.f + a2.f; result.g = a1.g + a2.g; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, result.a, result.b, result.c, result.d, result.e, result.f, result.g); return result; } static void cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_7byte a1, a2; a1 = *(struct cls_struct_7byte*)(args[0]); a2 = *(struct cls_struct_7byte*)(args[1]); *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[8]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 }; struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 }; struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 }; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_uchar; cls_struct_fields[4] = &ffi_type_uchar; cls_struct_fields[5] = &ffi_type_uchar; cls_struct_fields[6] = &ffi_type_uchar; cls_struct_fields[7] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ res_dbl.a = 0; res_dbl.b = 0; res_dbl.c = 0; res_dbl.d = 0; res_dbl.e = 0; res_dbl.f = 0; res_dbl.g = 0; CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */ printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 139 248 10 6 8 10 12" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_7byte.c000066400000000000000000000053201265146633400224020ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_7byte { unsigned short a; unsigned short b; unsigned char c; unsigned short d; } cls_struct_7byte; cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1, struct cls_struct_7byte a2) { struct cls_struct_7byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; result.d = a1.d + a2.d; printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d, a2.a, a2.b, a2.c, a2.d, result.a, result.b, result.c, result.d); return result; } static void cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_7byte a1, a2; a1 = *(struct cls_struct_7byte*)(args[0]); a2 = *(struct cls_struct_7byte*)(args[1]); *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 }; struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 }; struct cls_struct_7byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_ushort; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = &ffi_type_ushort; cls_struct_fields[4] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl); /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 139 248 10 509" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl); /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */ printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d); /* { dg-output "\nres: 139 248 10 509" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_8byte.c000066400000000000000000000044511265146633400224070ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Check overlapping. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_8byte { int a; float b; } cls_struct_8byte; cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1, struct cls_struct_8byte a2) { struct cls_struct_8byte result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b); return result; } static void cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_8byte a1, a2; a1 = *(struct cls_struct_8byte*)(args[0]); a2 = *(struct cls_struct_8byte*)(args[1]); *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_8byte g_dbl = { 1, 2.0 }; struct cls_struct_8byte f_dbl = { 4, 5.0 }; struct cls_struct_8byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_sint; cls_struct_fields[1] = &ffi_type_float; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl); /* { dg-output "1 2 4 5: 5 7" } */ printf("res: %d %g\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 5 7" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl); /* { dg-output "\n1 2 4 5: 5 7" } */ printf("res: %d %g\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 5 7" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_9byte1.c000066400000000000000000000046171265146633400224750ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Darwin/AIX do double-word alignment of the struct if the first element is a double. Check that it does not here. Limitations: none. PR: none. Originator: 20030914 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_9byte { int a; double b; } cls_struct_9byte; cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, struct cls_struct_9byte b2) { struct cls_struct_9byte result; result.a = b1.a + b2.a; result.b = b1.b + b2.b; printf("%d %g %d %g: %d %g\n", b1.a, b1.b, b2.a, b2.b, result.a, result.b); return result; } static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_9byte b1, b2; b1 = *(struct cls_struct_9byte*)(args[0]); b2 = *(struct cls_struct_9byte*)(args[1]); *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_9byte h_dbl = { 7, 8.0}; struct cls_struct_9byte j_dbl = { 1, 9.0}; struct cls_struct_9byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_sint; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &h_dbl; args_dbl[1] = &j_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); /* { dg-output "7 8 1 9: 8 17" } */ printf("res: %d %g\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 8 17" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); /* { dg-output "\n7 8 1 9: 8 17" } */ printf("res: %d %g\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 8 17" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_9byte2.c000066400000000000000000000046141265146633400224730ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Depending on the ABI. Darwin/AIX do double-word alignment of the struct if the first element is a double. Check that it does here. Limitations: none. PR: none. Originator: 20030914 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_9byte { double a; int b; } cls_struct_9byte; cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1, struct cls_struct_9byte b2) { struct cls_struct_9byte result; result.a = b1.a + b2.a; result.b = b1.b + b2.b; printf("%g %d %g %d: %g %d\n", b1.a, b1.b, b2.a, b2.b, result.a, result.b); return result; } static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_9byte b1, b2; b1 = *(struct cls_struct_9byte*)(args[0]); b2 = *(struct cls_struct_9byte*)(args[1]); *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_9byte h_dbl = { 7.0, 8}; struct cls_struct_9byte j_dbl = { 1.0, 9}; struct cls_struct_9byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_sint; cls_struct_fields[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &h_dbl; args_dbl[1] = &j_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl); /* { dg-output "7 8 1 9: 8 17" } */ printf("res: %g %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 8 17" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl); /* { dg-output "\n7 8 1 9: 8 17" } */ printf("res: %g %d\n", res_dbl.a, res_dbl.b); /* { dg-output "\nres: 8 17" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_double.c000066400000000000000000000047261265146633400240050ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of double. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; double b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_float.c000066400000000000000000000047711265146633400236400ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of float. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; float b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_float; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_longdouble.c000066400000000000000000000050131265146633400246530ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of long double. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; long double b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_longdouble; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_longdouble_split.c000066400000000000000000000072521265146633400260750ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of long double. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ #include "ffitest.h" typedef struct cls_struct_align { long double a; long double b; long double c; long double d; long double e; long double f; long double g; } cls_struct_align; cls_struct_align cls_struct_align_fn( cls_struct_align a1, cls_struct_align a2) { struct cls_struct_align r; r.a = a1.a + a2.a; r.b = a1.b + a2.b; r.c = a1.c + a2.c; r.d = a1.d + a2.d; r.e = a1.e + a2.e; r.f = a1.f + a2.f; r.g = a1.g + a2.g; printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, r.a, r.b, r.c, r.d, r.e, r.f, r.g); return r; } cls_struct_align cls_struct_align_fn2( cls_struct_align a1) { struct cls_struct_align r; r.a = a1.a + 1; r.b = a1.b + 1; r.c = a1.c + 1; r.d = a1.d + 1; r.e = a1.e + 1; r.f = a1.f + 1; r.g = a1.g + 1; printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: " "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, r.a, r.b, r.c, r.d, r.e, r.f, r.g); return r; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[8]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_longdouble; cls_struct_fields[1] = &ffi_type_longdouble; cls_struct_fields[2] = &ffi_type_longdouble; cls_struct_fields[3] = &ffi_type_longdouble; cls_struct_fields[4] = &ffi_type_longdouble; cls_struct_fields[5] = &ffi_type_longdouble; cls_struct_fields[6] = &ffi_type_longdouble; cls_struct_fields[7] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c000066400000000000000000000064141265146633400261560ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of long double. Limitations: none. PR: none. Originator: Blake Chaffin 6/18/2007 */ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ /* { dg-do run { xfail strongarm*-*-* } } */ /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ #include "ffitest.h" typedef struct cls_struct_align { long double a; long double b; long double c; long double d; long double e; double f; long double g; } cls_struct_align; cls_struct_align cls_struct_align_fn( cls_struct_align a1, cls_struct_align a2) { struct cls_struct_align r; r.a = a1.a + a2.a; r.b = a1.b + a2.b; r.c = a1.c + a2.c; r.d = a1.d + a2.d; r.e = a1.e + a2.e; r.f = a1.f + a2.f; r.g = a1.g + a2.g; printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: " "%Lg %Lg %Lg %Lg %Lg %g %Lg\n", a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g, a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g, r.a, r.b, r.c, r.d, r.e, r.f, r.g); return r; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[8]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[3]; struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 }; struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_longdouble; cls_struct_fields[1] = &ffi_type_longdouble; cls_struct_fields[2] = &ffi_type_longdouble; cls_struct_fields[3] = &ffi_type_longdouble; cls_struct_fields[4] = &ffi_type_longdouble; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_longdouble; cls_struct_fields[7] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */ printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g); /* { dg-output "\nres: 9 11 13 15 17 19 21" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_pointer.c000066400000000000000000000052041265146633400242030ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of pointer. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; void *b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b); result.c = a1.c + a2.c; printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", a1.a, (uintptr_t)a1.b, a1.c, a2.a, (uintptr_t)a2.b, a2.c, result.a, (uintptr_t)result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, (void *)4951, 127 }; struct cls_struct_align f_dbl = { 1, (void *)9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_pointer; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_sint16.c000066400000000000000000000047321265146633400236540ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of sint16. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; signed short b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_sshort; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_sint32.c000066400000000000000000000047261265146633400236550ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of sint32. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; signed int b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_sint; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_sint64.c000066400000000000000000000051111265146633400236470ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of sint64. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; signed long long b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_sint64; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_uint16.c000066400000000000000000000047341265146633400236600ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of uint16. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; unsigned short b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_ushort; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_uint32.c000066400000000000000000000047301265146633400236520ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of uint32. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; unsigned int b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uint; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_align_uint64.c000066400000000000000000000051141265146633400236540ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure alignment of uint64. Limitations: none. PR: none. Originator: 20031203 */ /* { dg-do run } */ /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ #include "ffitest.h" typedef struct cls_struct_align { unsigned char a; unsigned long long b; unsigned char c; } cls_struct_align; cls_struct_align cls_struct_align_fn(struct cls_struct_align a1, struct cls_struct_align a2) { struct cls_struct_align result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } static void cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_align a1, a2; a1 = *(struct cls_struct_align*)(args[0]); a2 = *(struct cls_struct_align*)(args[1]); *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[4]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct cls_struct_align g_dbl = { 12, 4951, 127 }; struct cls_struct_align f_dbl = { 1, 9320, 13 }; struct cls_struct_align res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uint64; cls_struct_fields[2] = &ffi_type_uchar; cls_struct_fields[3] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &g_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl); /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl); /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c); /* { dg-output "\nres: 13 14271 140" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_dbls_struct.c000066400000000000000000000025041265146633400237010ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check double arguments in structs. Limitations: none. PR: none. Originator: Blake Chaffin 6/23/2007 */ /* { dg-do run } */ #include "ffitest.h" typedef struct Dbls { double x; double y; } Dbls; void closure_test_fn(Dbls p) { printf("%.1f %.1f\n", p.x, p.y); } void closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, void** args, void* userdata __UNUSED__) { closure_test_fn(*(Dbls*)args[0]); } int main(int argc __UNUSED__, char** argv __UNUSED__) { ffi_cif cif; void *code; ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type* cl_arg_types[1]; ffi_type ts1_type; ffi_type* ts1_type_elements[4]; Dbls arg = { 1.0, 2.0 }; ts1_type.size = 0; ts1_type.alignment = 0; ts1_type.type = FFI_TYPE_STRUCT; ts1_type.elements = ts1_type_elements; ts1_type_elements[0] = &ffi_type_double; ts1_type_elements[1] = &ffi_type_double; ts1_type_elements[2] = NULL; cl_arg_types[0] = &ts1_type; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); ((void*(*)(Dbls))(code))(arg); /* { dg-output "1.0 2.0\n" } */ closure_test_fn(arg); /* { dg-output "1.0 2.0\n" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.call/cls_double.c000066400000000000000000000020711265146633400226220ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value double. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(double *)resp = *(double *)args[0]; printf("%f: %f\n",*(double *)args[0], *(double *)resp); } typedef double (*cls_ret_double)(double); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; double res; cl_arg_types[0] = &ffi_type_double; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_double, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK); res = (*((cls_ret_double)code))(21474.789); /* { dg-output "21474.789000: 21474.789000" } */ printf("res: %.6f\n", res); /* { dg-output "\nres: 21474.789000" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_double_va.c000066400000000000000000000032071265146633400233120ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Test doubles passed in variable argument lists. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ /* { dg-output "" { xfail avr32*-*-* } } */ /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ #include "ffitest.h" static void cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { char* format = *(char**)args[0]; double doubleValue = *(double*)args[1]; *(ffi_arg*)resp = printf(format, doubleValue); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[3]; ffi_type* arg_types[3]; char* format = "%.1f\n"; double doubleArg = 7; ffi_arg res = 0; arg_types[0] = &ffi_type_pointer; arg_types[1] = &ffi_type_double; arg_types[2] = NULL; /* This printf call is variadic */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, arg_types) == FFI_OK); args[0] = &format; args[1] = &doubleArg; args[2] = NULL; ffi_call(&cif, FFI_FN(printf), &res, args); /* { dg-output "7.0" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 4" } */ /* The call to cls_double_va_fn is static, so have to use a normal prep_cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK); res = ((int(*)(char*, double))(code))(format, doubleArg); /* { dg-output "\n7.0" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 4" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_float.c000066400000000000000000000020461265146633400224570ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value float. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(float *)resp = *(float *)args[0]; printf("%g: %g\n",*(float *)args[0], *(float *)resp); } typedef float (*cls_ret_float)(float); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; float res; cl_arg_types[0] = &ffi_type_float; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_float, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK); res = ((((cls_ret_float)code)(-2122.12))); /* { dg-output "\\-2122.12: \\-2122.12" } */ printf("res: %.6f\n", res); /* { dg-output "\nres: \-2122.120117" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_longdouble.c000066400000000000000000000056061265146633400235110ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check long double arguments. Limitations: none. PR: none. Originator: Blake Chaffin */ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ /* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have remove the xfail for arm*-*-* below, until we know more. */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ #include "ffitest.h" long double cls_ldouble_fn( long double a1, long double a2, long double a3, long double a4, long double a5, long double a6, long double a7, long double a8) { long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", a1, a2, a3, a4, a5, a6, a7, a8, r); return r; } static void cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { long double a1 = *(long double*)args[0]; long double a2 = *(long double*)args[1]; long double a3 = *(long double*)args[2]; long double a4 = *(long double*)args[3]; long double a5 = *(long double*)args[4]; long double a6 = *(long double*)args[5]; long double a7 = *(long double*)args[6]; long double a8 = *(long double*)args[7]; *(long double*)resp = cls_ldouble_fn( a1, a2, a3, a4, a5, a6, a7, a8); } int main(void) { ffi_cif cif; void* code; ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[9]; ffi_type* arg_types[9]; long double res = 0; long double arg1 = 1; long double arg2 = 2; long double arg3 = 3; long double arg4 = 4; long double arg5 = 5; long double arg6 = 6; long double arg7 = 7; long double arg8 = 8; arg_types[0] = &ffi_type_longdouble; arg_types[1] = &ffi_type_longdouble; arg_types[2] = &ffi_type_longdouble; arg_types[3] = &ffi_type_longdouble; arg_types[4] = &ffi_type_longdouble; arg_types[5] = &ffi_type_longdouble; arg_types[6] = &ffi_type_longdouble; arg_types[7] = &ffi_type_longdouble; arg_types[8] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, arg_types) == FFI_OK); args[0] = &arg1; args[1] = &arg2; args[2] = &arg3; args[3] = &arg4; args[4] = &arg5; args[5] = &arg6; args[6] = &arg7; args[7] = &arg8; args[8] = NULL; ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ printf("res: %Lg\n", res); /* { dg-output "\nres: 36" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK); res = ((long double(*)(long double, long double, long double, long double, long double, long double, long double, long double))(code))(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ printf("res: %Lg\n", res); /* { dg-output "\nres: 36" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.call/cls_longdouble_va.c000066400000000000000000000032631265146633400241740ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Test long doubles passed in variable argument lists. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ /* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */ #include "ffitest.h" static void cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { char* format = *(char**)args[0]; long double ldValue = *(long double*)args[1]; *(ffi_arg*)resp = printf(format, ldValue); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[3]; ffi_type* arg_types[3]; char* format = "%.1Lf\n"; long double ldArg = 7; ffi_arg res = 0; arg_types[0] = &ffi_type_pointer; arg_types[1] = &ffi_type_longdouble; arg_types[2] = NULL; /* This printf call is variadic */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint, arg_types) == FFI_OK); args[0] = &format; args[1] = &ldArg; args[2] = NULL; ffi_call(&cif, FFI_FN(printf), &res, args); /* { dg-output "7.0" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 4" } */ /* The call to cls_longdouble_va_fn is static, so have to use a normal prep_cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK); res = ((int(*)(char*, long double))(code))(format, ldArg); /* { dg-output "\n7.0" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 4" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_schar.c000066400000000000000000000031551265146633400236660ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple signed char values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" signed char test_func_fn(signed char a1, signed char a2) { signed char result; result = a1 + a2; printf("%d %d: %d\n", a1, a2, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { signed char a1, a2; a1 = *(signed char *)avals[0]; a2 = *(signed char *)avals[1]; *(ffi_arg *)rval = test_func_fn(a1, a2); } typedef signed char (*test_type)(signed char, signed char); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[3]; ffi_type * cl_arg_types[3]; ffi_arg res_call; signed char a, b, res_closure; a = 2; b = 125; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = NULL; cl_arg_types[0] = &ffi_type_schar; cl_arg_types[1] = &ffi_type_schar; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_schar, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "2 125: 127" } */ printf("res: %d\n", (signed char)res_call); /* { dg-output "\nres: 127" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(2, 125); /* { dg-output "\n2 125: 127" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 127" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_sshort.c000066400000000000000000000032251265146633400241060ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple signed short values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" signed short test_func_fn(signed short a1, signed short a2) { signed short result; result = a1 + a2; printf("%d %d: %d\n", a1, a2, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { signed short a1, a2; a1 = *(signed short *)avals[0]; a2 = *(signed short *)avals[1]; *(ffi_arg *)rval = test_func_fn(a1, a2); } typedef signed short (*test_type)(signed short, signed short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[3]; ffi_type * cl_arg_types[3]; ffi_arg res_call; unsigned short a, b, res_closure; a = 2; b = 32765; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = NULL; cl_arg_types[0] = &ffi_type_sshort; cl_arg_types[1] = &ffi_type_sshort; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sshort, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "2 32765: 32767" } */ printf("res: %d\n", (unsigned short)res_call); /* { dg-output "\nres: 32767" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(2, 32765); /* { dg-output "\n2 32765: 32767" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 32767" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_sshortchar.c000066400000000000000000000040151265146633400247420ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple signed short/char values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" signed short test_func_fn(signed char a1, signed short a2, signed char a3, signed short a4) { signed short result; result = a1 + a2 + a3 + a4; printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { signed char a1, a3; signed short a2, a4; a1 = *(signed char *)avals[0]; a2 = *(signed short *)avals[1]; a3 = *(signed char *)avals[2]; a4 = *(signed short *)avals[3]; *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); } typedef signed short (*test_type)(signed char, signed short, signed char, signed short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[5]; ffi_type * cl_arg_types[5]; ffi_arg res_call; signed char a, c; signed short b, d, res_closure; a = 1; b = 32765; c = 127; d = -128; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = &c; args_dbl[3] = &d; args_dbl[4] = NULL; cl_arg_types[0] = &ffi_type_schar; cl_arg_types[1] = &ffi_type_sshort; cl_arg_types[2] = &ffi_type_schar; cl_arg_types[3] = &ffi_type_sshort; cl_arg_types[4] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_sshort, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "1 32765 127 -128: 32765" } */ printf("res: %d\n", (signed short)res_call); /* { dg-output "\nres: 32765" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(1, 32765, 127, -128); /* { dg-output "\n1 32765 127 -128: 32765" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 32765" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_uchar.c000066400000000000000000000043471265146633400236740ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple unsigned char values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" unsigned char test_func_fn(unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4) { unsigned char result; result = a1 + a2 + a3 + a4; printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { unsigned char a1, a2, a3, a4; a1 = *(unsigned char *)avals[0]; a2 = *(unsigned char *)avals[1]; a3 = *(unsigned char *)avals[2]; a4 = *(unsigned char *)avals[3]; *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); } typedef unsigned char (*test_type)(unsigned char, unsigned char, unsigned char, unsigned char); void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals, void *data __UNUSED__) { printf("%d %d %d %d\n", *(unsigned char *)avals[0], *(unsigned char *)avals[1], *(unsigned char *)avals[2], *(unsigned char *)avals[3]); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[5]; ffi_type * cl_arg_types[5]; ffi_arg res_call; unsigned char a, b, c, d, res_closure; a = 1; b = 2; c = 127; d = 125; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = &c; args_dbl[3] = &d; args_dbl[4] = NULL; cl_arg_types[0] = &ffi_type_uchar; cl_arg_types[1] = &ffi_type_uchar; cl_arg_types[2] = &ffi_type_uchar; cl_arg_types[3] = &ffi_type_uchar; cl_arg_types[4] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_uchar, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "1 2 127 125: 255" } */ printf("res: %d\n", (unsigned char)res_call); /* { dg-output "\nres: 255" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(1, 2, 127, 125); /* { dg-output "\n1 2 127 125: 255" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 255" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_ushort.c000066400000000000000000000032531265146633400241110ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple unsigned short values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" unsigned short test_func_fn(unsigned short a1, unsigned short a2) { unsigned short result; result = a1 + a2; printf("%d %d: %d\n", a1, a2, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { unsigned short a1, a2; a1 = *(unsigned short *)avals[0]; a2 = *(unsigned short *)avals[1]; *(ffi_arg *)rval = test_func_fn(a1, a2); } typedef unsigned short (*test_type)(unsigned short, unsigned short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[3]; ffi_type * cl_arg_types[3]; ffi_arg res_call; unsigned short a, b, res_closure; a = 2; b = 32765; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = NULL; cl_arg_types[0] = &ffi_type_ushort; cl_arg_types[1] = &ffi_type_ushort; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_ushort, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "2 32765: 32767" } */ printf("res: %d\n", (unsigned short)res_call); /* { dg-output "\nres: 32767" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(2, 32765); /* { dg-output "\n2 32765: 32767" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 32767" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_multi_ushortchar.c000066400000000000000000000040361265146633400247470ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check passing of multiple unsigned short/char values. Limitations: none. PR: PR13221. Originator: 20031129 */ /* { dg-do run } */ #include "ffitest.h" unsigned short test_func_fn(unsigned char a1, unsigned short a2, unsigned char a3, unsigned short a4) { unsigned short result; result = a1 + a2 + a3 + a4; printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result); return result; } static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals, void *data __UNUSED__) { unsigned char a1, a3; unsigned short a2, a4; a1 = *(unsigned char *)avals[0]; a2 = *(unsigned short *)avals[1]; a3 = *(unsigned char *)avals[2]; a4 = *(unsigned short *)avals[3]; *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4); } typedef unsigned short (*test_type)(unsigned char, unsigned short, unsigned char, unsigned short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void * args_dbl[5]; ffi_type * cl_arg_types[5]; ffi_arg res_call; unsigned char a, c; unsigned short b, d, res_closure; a = 1; b = 2; c = 127; d = 128; args_dbl[0] = &a; args_dbl[1] = &b; args_dbl[2] = &c; args_dbl[3] = &d; args_dbl[4] = NULL; cl_arg_types[0] = &ffi_type_uchar; cl_arg_types[1] = &ffi_type_ushort; cl_arg_types[2] = &ffi_type_uchar; cl_arg_types[3] = &ffi_type_ushort; cl_arg_types[4] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_ushort, cl_arg_types) == FFI_OK); ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl); /* { dg-output "1 2 127 128: 258" } */ printf("res: %d\n", (unsigned short)res_call); /* { dg-output "\nres: 258" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code) == FFI_OK); res_closure = (*((test_type)code))(1, 2, 127, 128); /* { dg-output "\n1 2 127 128: 258" } */ printf("res: %d\n", res_closure); /* { dg-output "\nres: 258" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_pointer.c000066400000000000000000000036111265146633400230310ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check pointer arguments. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ #include "ffitest.h" void* cls_pointer_fn(void* a1, void* a2) { void* result = (void*)((intptr_t)a1 + (intptr_t)a2); printf("0x%08x 0x%08x: 0x%08x\n", (unsigned int)(uintptr_t) a1, (unsigned int)(uintptr_t) a2, (unsigned int)(uintptr_t) result); return result; } static void cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { void* a1 = *(void**)(args[0]); void* a2 = *(void**)(args[1]); *(void**)resp = cls_pointer_fn(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[3]; /* ffi_type cls_pointer_type; */ ffi_type* arg_types[3]; /* cls_pointer_type.size = sizeof(void*); cls_pointer_type.alignment = 0; cls_pointer_type.type = FFI_TYPE_POINTER; cls_pointer_type.elements = NULL;*/ void* arg1 = (void*)0x12345678; void* arg2 = (void*)0x89abcdef; ffi_arg res = 0; arg_types[0] = &ffi_type_pointer; arg_types[1] = &ffi_type_pointer; arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, arg_types) == FFI_OK); args[0] = &arg1; args[1] = &arg2; args[2] = NULL; ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args); /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */ printf("res: 0x%08x\n", (unsigned int) res); /* { dg-output "\nres: 0x9be02467" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */ printf("res: 0x%08x\n", (unsigned int) res); /* { dg-output "\nres: 0x9be02467" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_pointer_stack.c000066400000000000000000000102151265146633400242140ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check pointer arguments across multiple hideous stack frames. Limitations: none. PR: none. Originator: Blake Chaffin 6/7/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ #include "ffitest.h" static long dummyVar; long dummy_func( long double a1, char b1, long double a2, char b2, long double a3, char b3, long double a4, char b4) { return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4; } void* cls_pointer_fn2(void* a1, void* a2) { long double trample1 = (intptr_t)a1 + (intptr_t)a2; char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; long double trample3 = (intptr_t)trample1 + (intptr_t)a1; char trample4 = trample2 + ((char*)&a1)[1]; long double trample5 = (intptr_t)trample3 + (intptr_t)a2; char trample6 = trample4 + ((char*)&a2)[1]; long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; char trample8 = trample6 + trample2; void* result; dummyVar = dummy_func(trample1, trample2, trample3, trample4, trample5, trample6, trample7, trample8); result = (void*)((intptr_t)a1 + (intptr_t)a2); printf("0x%08x 0x%08x: 0x%08x\n", (unsigned int)(uintptr_t) a1, (unsigned int)(uintptr_t) a2, (unsigned int)(uintptr_t) result); return result; } void* cls_pointer_fn1(void* a1, void* a2) { long double trample1 = (intptr_t)a1 + (intptr_t)a2; char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; long double trample3 = (intptr_t)trample1 + (intptr_t)a1; char trample4 = trample2 + ((char*)&a1)[1]; long double trample5 = (intptr_t)trample3 + (intptr_t)a2; char trample6 = trample4 + ((char*)&a2)[1]; long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; char trample8 = trample6 + trample2; void* result; dummyVar = dummy_func(trample1, trample2, trample3, trample4, trample5, trample6, trample7, trample8); result = (void*)((intptr_t)a1 + (intptr_t)a2); printf("0x%08x 0x%08x: 0x%08x\n", (unsigned int)(intptr_t) a1, (unsigned int)(intptr_t) a2, (unsigned int)(intptr_t) result); result = cls_pointer_fn2(result, a1); return result; } static void cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { void* a1 = *(void**)(args[0]); void* a2 = *(void**)(args[1]); long double trample1 = (intptr_t)a1 + (intptr_t)a2; char trample2 = ((char*)&a1)[0] + ((char*)&a2)[0]; long double trample3 = (intptr_t)trample1 + (intptr_t)a1; char trample4 = trample2 + ((char*)&a1)[1]; long double trample5 = (intptr_t)trample3 + (intptr_t)a2; char trample6 = trample4 + ((char*)&a2)[1]; long double trample7 = (intptr_t)trample5 + (intptr_t)trample1; char trample8 = trample6 + trample2; dummyVar = dummy_func(trample1, trample2, trample3, trample4, trample5, trample6, trample7, trample8); *(void**)resp = cls_pointer_fn1(a1, a2); } int main (void) { ffi_cif cif; void *code; ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[3]; /* ffi_type cls_pointer_type; */ ffi_type* arg_types[3]; /* cls_pointer_type.size = sizeof(void*); cls_pointer_type.alignment = 0; cls_pointer_type.type = FFI_TYPE_POINTER; cls_pointer_type.elements = NULL;*/ void* arg1 = (void*)0x01234567; void* arg2 = (void*)0x89abcdef; ffi_arg res = 0; arg_types[0] = &ffi_type_pointer; arg_types[1] = &ffi_type_pointer; arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer, arg_types) == FFI_OK); args[0] = &arg1; args[1] = &arg2; args[2] = NULL; printf("\n"); ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args); printf("res: 0x%08x\n", (unsigned int) res); /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ /* { dg-output "\nres: 0x8bf258bd" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK); res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2); printf("res: 0x%08x\n", (unsigned int) res); /* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */ /* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */ /* { dg-output "\nres: 0x8bf258bd" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_schar.c000066400000000000000000000020531265146633400224500ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value schar. Limitations: none. PR: none. Originator: 20031108 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = *(signed char *)args[0]; printf("%d: %d\n",*(signed char *)args[0], (int)*(ffi_arg *)(resp)); } typedef signed char (*cls_ret_schar)(signed char); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; signed char res; cl_arg_types[0] = &ffi_type_schar; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_schar, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK); res = (*((cls_ret_schar)code))(127); /* { dg-output "127: 127" } */ printf("res: %d\n", res); /* { dg-output "\nres: 127" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_sint.c000066400000000000000000000020451265146633400223260ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value sint32. Limitations: none. PR: none. Originator: 20031108 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = *(signed int *)args[0]; printf("%d: %d\n",*(signed int *)args[0], (int)*(ffi_arg *)(resp)); } typedef signed int (*cls_ret_sint)(signed int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; signed int res; cl_arg_types[0] = &ffi_type_sint; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK); res = (*((cls_ret_sint)code))(65534); /* { dg-output "65534: 65534" } */ printf("res: %d\n",res); /* { dg-output "\nres: 65534" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_sshort.c000066400000000000000000000020651265146633400226750ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value sshort. Limitations: none. PR: none. Originator: 20031108 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = *(signed short *)args[0]; printf("%d: %d\n",*(signed short *)args[0], (int)*(ffi_arg *)(resp)); } typedef signed short (*cls_ret_sshort)(signed short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; signed short res; cl_arg_types[0] = &ffi_type_sshort; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sshort, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK); res = (*((cls_ret_sshort)code))(255); /* { dg-output "255: 255" } */ printf("res: %d\n",res); /* { dg-output "\nres: 255" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_struct_va1.c000066400000000000000000000045121265146633400234450ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Test doubles passed in variable argument lists. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run } */ /* { dg-output "" { xfail avr32*-*-* } } */ #include "ffitest.h" struct small_tag { unsigned char a; unsigned char b; }; struct large_tag { unsigned a; unsigned b; unsigned c; unsigned d; unsigned e; }; static void test_fn (ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { int n = *(int*)args[0]; struct small_tag s1 = * (struct small_tag *) args[1]; struct large_tag l1 = * (struct large_tag *) args[2]; struct small_tag s2 = * (struct small_tag *) args[3]; printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, l1.a, l1.b, l1.c, l1.d, l1.e, s2.a, s2.b); * (int*) resp = 42; } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); ffi_type* arg_types[5]; ffi_arg res = 0; ffi_type s_type; ffi_type *s_type_elements[3]; ffi_type l_type; ffi_type *l_type_elements[6]; struct small_tag s1; struct small_tag s2; struct large_tag l1; int si; s_type.size = 0; s_type.alignment = 0; s_type.type = FFI_TYPE_STRUCT; s_type.elements = s_type_elements; s_type_elements[0] = &ffi_type_uchar; s_type_elements[1] = &ffi_type_uchar; s_type_elements[2] = NULL; l_type.size = 0; l_type.alignment = 0; l_type.type = FFI_TYPE_STRUCT; l_type.elements = l_type_elements; l_type_elements[0] = &ffi_type_uint; l_type_elements[1] = &ffi_type_uint; l_type_elements[2] = &ffi_type_uint; l_type_elements[3] = &ffi_type_uint; l_type_elements[4] = &ffi_type_uint; l_type_elements[5] = NULL; arg_types[0] = &ffi_type_sint; arg_types[1] = &s_type; arg_types[2] = &l_type; arg_types[3] = &s_type; arg_types[4] = NULL; CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); si = 4; s1.a = 5; s1.b = 6; s2.a = 20; s2.b = 21; l1.a = 10; l1.b = 11; l1.c = 12; l1.d = 13; l1.e = 14; CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); res = ((int (*)(int, ...))(code))(si, s1, l1, s2); /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 42" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_uchar.c000066400000000000000000000020621265146633400224520ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value uchar. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = *(unsigned char *)args[0]; printf("%d: %d\n",*(unsigned char *)args[0], (int)*(ffi_arg *)(resp)); } typedef unsigned char (*cls_ret_uchar)(unsigned char); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; unsigned char res; cl_arg_types[0] = &ffi_type_uchar; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uchar, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK); res = (*((cls_ret_uchar)code))(127); /* { dg-output "127: 127" } */ printf("res: %d\n",res); /* { dg-output "\nres: 127" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_uchar_va.c000066400000000000000000000020701265146633400231370ustar00rootroot00000000000000/* Area: closure_call Purpose: Test anonymous unsigned char argument. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ #include "ffitest.h" typedef unsigned char T; static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg *)resp = *(T *)args[0]; printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); } typedef T (*cls_ret_T)(T, ...); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[3]; T res; cl_arg_types[0] = &ffi_type_uchar; cl_arg_types[1] = &ffi_type_uchar; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_uchar, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); res = ((((cls_ret_T)code)(67, 4))); /* { dg-output "67: 67 4" } */ printf("res: %d\n", res); /* { dg-output "\nres: 67" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_uint.c000066400000000000000000000021031265146633400223230ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value uint. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg *)resp = *(unsigned int *)args[0]; printf("%d: %d\n",*(unsigned int *)args[0], (int)*(ffi_arg *)(resp)); } typedef unsigned int (*cls_ret_uint)(unsigned int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; unsigned int res; cl_arg_types[0] = &ffi_type_uint; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK); res = (*((cls_ret_uint)code))(2147483647); /* { dg-output "2147483647: 2147483647" } */ printf("res: %d\n",res); /* { dg-output "\nres: 2147483647" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_uint_va.c000066400000000000000000000020411265146633400230120ustar00rootroot00000000000000/* Area: closure_call Purpose: Test anonymous unsigned int argument. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ #include "ffitest.h" typedef unsigned int T; static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(T *)resp = *(T *)args[0]; printf("%d: %d %d\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); } typedef T (*cls_ret_T)(T, ...); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[3]; T res; cl_arg_types[0] = &ffi_type_uint; cl_arg_types[1] = &ffi_type_uint; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_uint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); res = ((((cls_ret_T)code)(67, 4))); /* { dg-output "67: 67 4" } */ printf("res: %d\n", res); /* { dg-output "\nres: 67" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_ulong_va.c000066400000000000000000000020521265146633400231610ustar00rootroot00000000000000/* Area: closure_call Purpose: Test anonymous unsigned long argument. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ #include "ffitest.h" typedef unsigned long T; static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(T *)resp = *(T *)args[0]; printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); } typedef T (*cls_ret_T)(T, ...); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[3]; T res; cl_arg_types[0] = &ffi_type_ulong; cl_arg_types[1] = &ffi_type_ulong; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_ulong, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); res = ((((cls_ret_T)code)(67, 4))); /* { dg-output "67: 67 4" } */ printf("res: %ld\n", res); /* { dg-output "\nres: 67" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_ulonglong.c000066400000000000000000000027311265146633400233570ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value long long. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ #include "ffitest.h" static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(unsigned long long *)resp= 0xfffffffffffffffLL ^ *(unsigned long long *)args[0]; printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0], *(unsigned long long *)(resp)); } typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; unsigned long long res; cl_arg_types[0] = &ffi_type_uint64; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uint64, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK); res = (*((cls_ret_ulonglong)code))(214LL); /* { dg-output "214: 1152921504606846761" } */ printf("res: %" PRIdLL "\n", res); /* { dg-output "\nres: 1152921504606846761" } */ res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ printf("res: %" PRIdLL "\n", res); /* { dg-output "\nres: 8070450533247928831" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_ushort.c000066400000000000000000000021101265146633400226660ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value ushort. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = *(unsigned short *)args[0]; printf("%d: %d\n",*(unsigned short *)args[0], (int)*(ffi_arg *)(resp)); } typedef unsigned short (*cls_ret_ushort)(unsigned short); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[2]; unsigned short res; cl_arg_types[0] = &ffi_type_ushort; cl_arg_types[1] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_ushort, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK); res = (*((cls_ret_ushort)code))(65535); /* { dg-output "65535: 65535" } */ printf("res: %d\n",res); /* { dg-output "\nres: 65535" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/cls_ushort_va.c000066400000000000000000000020751265146633400233660ustar00rootroot00000000000000/* Area: closure_call Purpose: Test anonymous unsigned short argument. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ #include "ffitest.h" typedef unsigned short T; static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg *)resp = *(T *)args[0]; printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); } typedef T (*cls_ret_T)(T, ...); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[3]; T res; cl_arg_types[0] = &ffi_type_ushort; cl_arg_types[1] = &ffi_type_ushort; cl_arg_types[2] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_ushort, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); res = ((((cls_ret_T)code)(67, 4))); /* { dg-output "67: 67 4" } */ printf("res: %d\n", res); /* { dg-output "\nres: 67" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/err_bad_abi.c000066400000000000000000000014141265146633400227200ustar00rootroot00000000000000/* Area: ffi_prep_cif, ffi_prep_closure Purpose: Test error return for bad ABIs. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run } */ #include "ffitest.h" static void dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, void** args __UNUSED__, void* userdata __UNUSED__) {} int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type* arg_types[1]; arg_types[0] = NULL; CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void, arg_types) == FFI_BAD_ABI); CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, arg_types) == FFI_OK); cif.abi= 255; CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/err_bad_typedef.c000066400000000000000000000006631265146633400236320ustar00rootroot00000000000000/* Area: ffi_prep_cif Purpose: Test error return for bad typedefs. Limitations: none. PR: none. Originator: Blake Chaffin 6/6/2007 */ /* { dg-do run } */ #include "ffitest.h" int main (void) { ffi_cif cif; ffi_type* arg_types[1]; ffi_type badType = ffi_type_void; arg_types[0] = NULL; badType.size = 0; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType, arg_types) == FFI_BAD_TYPEDEF); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/fastthis1_win32.c000066400000000000000000000021221265146633400234340ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check fastcall fct call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static size_t __FASTCALL__ my_fastcall_f(char *s, float a) { return (size_t) ((int) strlen(s) + (int) a); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; float v2; args[0] = &ffi_type_pointer; args[1] = &ffi_type_float; values[0] = (void*) &s; values[1] = (void*) &v2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2, &ffi_type_sint, args) == FFI_OK); s = "a"; v2 = 0.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 1); s = "1234567"; v2 = -1.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 6); s = "1234567890123456789012345"; v2 = 1.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 26); printf("fastcall fct1 tests passed\n"); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/fastthis2_win32.c000066400000000000000000000021221265146633400234350ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check fastcall fct call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static size_t __FASTCALL__ my_fastcall_f(float a, char *s) { return (size_t) ((int) strlen(s) + (int) a); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; float v2; args[1] = &ffi_type_pointer; args[0] = &ffi_type_float; values[1] = (void*) &s; values[0] = (void*) &v2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2, &ffi_type_sint, args) == FFI_OK); s = "a"; v2 = 0.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 1); s = "1234567"; v2 = -1.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 6); s = "1234567890123456789012345"; v2 = 1.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 26); printf("fastcall fct2 tests passed\n"); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/fastthis3_win32.c000066400000000000000000000022731265146633400234450ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check fastcall f call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static size_t __FASTCALL__ my_fastcall_f(float a, char *s, int i) { return (size_t) ((int) strlen(s) + (int) a + i); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; int v1; float v2; args[2] = &ffi_type_sint; args[1] = &ffi_type_pointer; args[0] = &ffi_type_float; values[2] = (void*) &v1; values[1] = (void*) &s; values[0] = (void*) &v2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 3, &ffi_type_sint, args) == FFI_OK); s = "a"; v1 = 1; v2 = 0.0; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 2); s = "1234567"; v2 = -1.0; v1 = -2; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 4); s = "1234567890123456789012345"; v2 = 1.0; v1 = 2; ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); CHECK(rint == 28); printf("fastcall fct3 tests passed\n"); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/ffitest.h000066400000000000000000000053301265146633400221610ustar00rootroot00000000000000#include #include #include #include #include #include "fficonfig.h" #if defined HAVE_STDINT_H #include #endif #if defined HAVE_INTTYPES_H #include #endif #define MAX_ARGS 256 #define CHECK(x) !(x) ? (abort(), 1) : 0 /* Define __UNUSED__ that also other compilers than gcc can run the tests. */ #undef __UNUSED__ #if defined(__GNUC__) #define __UNUSED__ __attribute__((__unused__)) #else #define __UNUSED__ #endif /* Define __FASTCALL__ so that other compilers than gcc can run the tests. */ #undef __FASTCALL__ #if defined _MSC_VER #define __FASTCALL__ __fastcall #else #define __FASTCALL__ __attribute__((fastcall)) #endif /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a file open. */ #ifdef HAVE_MMAP_ANON # undef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) # define MAP_ANONYMOUS MAP_ANON # endif # define USING_MMAP #endif #ifdef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # define USING_MMAP #endif /* MinGW kludge. */ #ifdef _WIN64 #define PRIdLL "I64d" #define PRIuLL "I64u" #else #define PRIdLL "lld" #define PRIuLL "llu" #endif /* Tru64 UNIX kludge. */ #if defined(__alpha__) && defined(__osf__) /* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ #undef PRIdLL #define PRIdLL "ld" #undef PRIuLL #define PRIuLL "lu" #define PRId8 "hd" #define PRIu8 "hu" #define PRId64 "ld" #define PRIu64 "lu" #define PRIuPTR "lu" #endif /* PA HP-UX kludge. */ #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) #define PRIuPTR "lu" #endif /* IRIX kludge. */ #if defined(__sgi) /* IRIX 6.5 provides all definitions, but only for C99 compilations. */ #define PRId8 "hhd" #define PRIu8 "hhu" #if (_MIPS_SZLONG == 32) #define PRId64 "lld" #define PRIu64 "llu" #endif /* This doesn't match , which always has "lld" here, but the arguments are uint64_t, int64_t, which are unsigned long, long for 64-bit in . */ #if (_MIPS_SZLONG == 64) #define PRId64 "ld" #define PRIu64 "lu" #endif /* This doesn't match , which has "u" here, but the arguments are uintptr_t, which is always unsigned long. */ #define PRIuPTR "lu" #endif /* Solaris < 10 kludge. */ #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) #if defined(__arch64__) || defined (__x86_64__) #define PRIuPTR "lu" #else #define PRIuPTR "u" #endif #endif /* MSVC kludge. */ #if defined _MSC_VER #define PRIuPTR "lu" #define PRIu8 "u" #define PRId8 "d" #define PRIu64 "I64u" #define PRId64 "I64d" #endif #ifndef PRIuPTR #define PRIuPTR "u" #endif polyml-5.6/libffi/testsuite/libffi.call/float.c000066400000000000000000000020741265146633400216170ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value float. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static int floating(int a, float b, double c, long double d) { int i; i = (int) ((float)a/b + ((float)c/(float)d)); return i; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; float f; signed int si1; double d; long double ld; args[0] = &ffi_type_sint; values[0] = &si1; args[1] = &ffi_type_float; values[1] = &f; args[2] = &ffi_type_double; values[2] = &d; args[3] = &ffi_type_longdouble; values[3] = &ld; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_sint, args) == FFI_OK); si1 = 6; f = 3.14159; d = (double)1.0/(double)3.0; ld = 2.71828182846L; floating (si1, f, d, ld); ffi_call(&cif, FFI_FN(floating), &rint, values); printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld)); CHECK((int)rint == floating(si1, f, d, ld)); exit (0); } polyml-5.6/libffi/testsuite/libffi.call/float1.c000066400000000000000000000021321265146633400216730ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value double. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" #include "float.h" typedef union { double d; unsigned char c[sizeof (double)]; } value_type; #define CANARY 0xba static double dblit(float f) { return f/3.0; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float f; value_type result[2]; unsigned int i; args[0] = &ffi_type_float; values[0] = &f; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_double, args) == FFI_OK); f = 3.14159; /* Put a canary in the return array. This is a regression test for a buffer overrun. */ memset(result[1].c, CANARY, sizeof (double)); ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); /* These are not always the same!! Check for a reasonable delta */ CHECK(result[0].d - dblit(f) < DBL_EPSILON); /* Check the canary. */ for (i = 0; i < sizeof (double); ++i) CHECK(result[1].c[i] == CANARY); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/float2.c000066400000000000000000000027071265146633400217040ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value long double. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */ /* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ #include "ffitest.h" #include "float.h" static long double ldblit(float f) { return (long double) (((long double) f)/ (long double) 3.0); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float f; long double ld; args[0] = &ffi_type_float; values[0] = &f; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_longdouble, args) == FFI_OK); f = 3.14159; #if 1 /* This is ifdef'd out for now. long double support under SunOS/gcc is pretty much non-existent. You'll get the odd bus error in library routines like printf(). */ printf ("%Lf\n", ldblit(f)); #endif ld = 666; ffi_call(&cif, FFI_FN(ldblit), &ld, values); #if 1 /* This is ifdef'd out for now. long double support under SunOS/gcc is pretty much non-existent. You'll get the odd bus error in library routines like printf(). */ printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); #endif /* These are not always the same!! Check for a reasonable delta */ if (ld - ldblit(f) < LDBL_EPSILON) puts("long double return value tests ok!"); else CHECK(0); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/float3.c000066400000000000000000000026441265146633400217050ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check float arguments with different orders. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" #include "float.h" static double floating_1(float a, double b, long double c) { return (double) a + b + (double) c; } static double floating_2(long double a, double b, float c) { return (double) a + b + (double) c; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; double rd; float f; double d; long double ld; args[0] = &ffi_type_float; values[0] = &f; args[1] = &ffi_type_double; values[1] = &d; args[2] = &ffi_type_longdouble; values[2] = &ld; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_double, args) == FFI_OK); f = 3.14159; d = (double)1.0/(double)3.0; ld = 2.71828182846L; floating_1 (f, d, ld); ffi_call(&cif, FFI_FN(floating_1), &rd, values); CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON); args[0] = &ffi_type_longdouble; values[0] = &ld; args[1] = &ffi_type_double; values[1] = &d; args[2] = &ffi_type_float; values[2] = &f; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_double, args) == FFI_OK); floating_2 (ld, d, f); ffi_call(&cif, FFI_FN(floating_2), &rd, values); CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON); exit (0); } polyml-5.6/libffi/testsuite/libffi.call/float4.c000066400000000000000000000024121265146633400216770ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check denorm double value. Limitations: none. PR: PR26483. Originator: From the original ffitest.c */ /* { dg-do run } */ /* { dg-options "-mieee" { target alpha*-*-* } } */ #include "ffitest.h" #include "float.h" typedef union { double d; unsigned char c[sizeof (double)]; } value_type; #define CANARY 0xba static double dblit(double d) { return d; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; double d; value_type result[2]; unsigned int i; args[0] = &ffi_type_double; values[0] = &d; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_double, args) == FFI_OK); d = DBL_MIN / 2; /* Put a canary in the return array. This is a regression test for a buffer overrun. */ memset(result[1].c, CANARY, sizeof (double)); ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); /* The standard delta check doesn't work for denorms. Since we didn't do any arithmetic, we should get the original result back, and hence an exact check should be OK here. */ CHECK(result[0].d == dblit(d)); /* Check the canary. */ for (i = 0; i < sizeof (double); ++i) CHECK(result[1].c[i] == CANARY); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/float_va.c000066400000000000000000000053221265146633400223040ustar00rootroot00000000000000/* Area: fp and variadics Purpose: check fp inputs and returns work on variadics, even the fixed params Limitations: None PR: none Originator: 2011-01-25 Intended to stress the difference in ABI on ARM vfp */ /* { dg-do run } */ #include #include "ffitest.h" /* prints out all the parameters, and returns the sum of them all. * 'x' is the number of variadic parameters all of which are double in this test */ double float_va_fn(unsigned int x, double y,...) { double total=0.0; va_list ap; unsigned int i; total+=(double)x; total+=y; printf("%u: %.1f :", x, y); va_start(ap, y); for(i=0;i static float many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) { #if 0 printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n", (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, (double) f6, (double) f7, (double) f8, (double) f9, (double) f10, (double) f11, (double) f12, (double) f13); #endif return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); } int main (void) { ffi_cif cif; ffi_type *args[13]; void *values[13]; float fa[13]; float f, ff; int i; for (i = 0; i < 13; i++) { args[i] = &ffi_type_float; values[i] = &fa[i]; fa[i] = (float) i; } /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &ffi_type_float, args) == FFI_OK); ffi_call(&cif, FFI_FN(many), &f, values); ff = many(fa[0], fa[1], fa[2], fa[3], fa[4], fa[5], fa[6], fa[7], fa[8], fa[9], fa[10],fa[11],fa[12]); if (f - ff < FLT_EPSILON) exit(0); else abort(); } polyml-5.6/libffi/testsuite/libffi.call/many2.c000066400000000000000000000020551265146633400215370ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check uint8_t arguments. Limitations: none. PR: PR45677. Originator: Dan Witte 20100916 */ /* { dg-do run } */ #include "ffitest.h" #define NARGS 7 typedef unsigned char u8; #ifdef __GNUC__ __attribute__((noinline)) #endif uint8_t foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g) { return a + b + c + d + e + f + g; } uint8_t bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g) { return foo (a, b, c, d, e, f, g); } int main (void) { ffi_type *ffitypes[NARGS]; int i; ffi_cif cif; ffi_arg result = 0; uint8_t args[NARGS]; void *argptrs[NARGS]; for (i = 0; i < NARGS; ++i) ffitypes[i] = &ffi_type_uint8; CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, NARGS, &ffi_type_uint8, ffitypes) == FFI_OK); for (i = 0; i < NARGS; ++i) { args[i] = i; argptrs[i] = &args[i]; } ffi_call (&cif, FFI_FN (bar), &result, argptrs); CHECK (result == 21); return 0; } polyml-5.6/libffi/testsuite/libffi.call/many2_win32.c000066400000000000000000000024301265146633400225560ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check stdcall many call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" #include static float __attribute__((fastcall)) fastcall_many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) { return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); } int main (void) { ffi_cif cif; ffi_type *args[13]; void *values[13]; float fa[13]; float f, ff; unsigned long ul; for (ul = 0; ul < 13; ul++) { args[ul] = &ffi_type_float; values[ul] = &fa[ul]; fa[ul] = (float) ul; } /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 13, &ffi_type_float, args) == FFI_OK); ff = fastcall_many(fa[0], fa[1], fa[2], fa[3], fa[4], fa[5], fa[6], fa[7], fa[8], fa[9], fa[10], fa[11], fa[12]); ffi_call(&cif, FFI_FN(fastcall_many), &f, values); if (f - ff < FLT_EPSILON) printf("fastcall many arg tests ok!\n"); else CHECK(0); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/many_win32.c000066400000000000000000000024221265146633400224750ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check stdcall many call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" #include static float __attribute__((stdcall)) stdcall_many(float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8, float f9, float f10, float f11, float f12, float f13) { return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); } int main (void) { ffi_cif cif; ffi_type *args[13]; void *values[13]; float fa[13]; float f, ff; unsigned long ul; for (ul = 0; ul < 13; ul++) { args[ul] = &ffi_type_float; values[ul] = &fa[ul]; fa[ul] = (float) ul; } /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13, &ffi_type_float, args) == FFI_OK); ff = stdcall_many(fa[0], fa[1], fa[2], fa[3], fa[4], fa[5], fa[6], fa[7], fa[8], fa[9], fa[10], fa[11], fa[12]); ffi_call(&cif, FFI_FN(stdcall_many), &f, values); if (f - ff < FLT_EPSILON) printf("stdcall many arg tests ok!\n"); else CHECK(0); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/negint.c000066400000000000000000000016411265146633400217750ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check that negative integers are passed correctly. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static int checking(int a, short b, signed char c) { return (a < 0 && b < 0 && c < 0); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; signed int si; signed short ss; signed char sc; args[0] = &ffi_type_sint; values[0] = &si; args[1] = &ffi_type_sshort; values[1] = &ss; args[2] = &ffi_type_schar; values[2] = ≻ /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_sint, args) == FFI_OK); si = -6; ss = -12; sc = -1; checking (si, ss, sc); ffi_call(&cif, FFI_FN(checking), &rint, values); printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); CHECK(rint != 0); exit (0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct.c000066400000000000000000000111271265146633400233770ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, struct cls_struct_16byte2 b1, struct cls_struct_combined b2) { struct cls_struct_combined result; result.d.a = b0.a + b1.dd + b2.d.a; result.d.b = b0.b + b1.ff + b2.d.b; result.d.c = b0.c + b1.ii + b2.d.c; result.e.ii = b0.c + b1.ii + b2.e.ii; result.e.dd = b0.a + b1.dd + b2.e.dd; result.e.ff = b0.b + b1.ff + b2.e.ff; printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n", b0.a, b0.b, b0.c, b1.ii, b1.dd, b1.ff, b2.d.a, b2.d.b, b2.d.c, b2.e.ii, b2.e.dd, b2.e.ff, result.d.a, result.d.b, result.d.c, result.e.ii, result.e.dd, result.e.ff); return result; } static void cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_16byte1 b0; struct cls_struct_16byte2 b1; struct cls_struct_combined b2; b0 = *(struct cls_struct_16byte1*)(args[0]); b1 = *(struct cls_struct_16byte2*)(args[1]); b2 = *(struct cls_struct_combined*)(args[2]); *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type* cls_struct_fields1[5]; ffi_type* cls_struct_fields2[5]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[5]; struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, {3, 1.0, 8.0}}; struct cls_struct_combined res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_float; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = NULL; cls_struct_fields1[0] = &ffi_type_sint; cls_struct_fields1[1] = &ffi_type_double; cls_struct_fields1[2] = &ffi_type_float; cls_struct_fields1[3] = NULL; cls_struct_fields2[0] = &cls_struct_type; cls_struct_fields2[1] = &cls_struct_type1; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = NULL; ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, cls_struct_16byte2, cls_struct_combined)) (code))(e_dbl, f_dbl, g_dbl); /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct1.c000066400000000000000000000116531265146633400234640ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0, struct cls_struct_16byte2 b1, struct cls_struct_combined b2, struct cls_struct_16byte1 b3) { struct cls_struct_combined result; result.d.a = b0.a + b1.dd + b2.d.a; result.d.b = b0.b + b1.ff + b2.d.b; result.d.c = b0.c + b1.ii + b2.d.c; result.e.ii = b0.c + b1.ii + b2.e.ii; result.e.dd = b0.a + b1.dd + b2.e.dd; result.e.ff = b0.b + b1.ff + b2.e.ff; printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n", b0.a, b0.b, b0.c, b1.ii, b1.dd, b1.ff, b2.d.a, b2.d.b, b2.d.c, b2.e.ii, b2.e.dd, b2.e.ff, b3.a, b3.b, b3.c, result.d.a, result.d.b, result.d.c, result.e.ii, result.e.dd, result.e.ff); return result; } static void cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct cls_struct_16byte1 b0; struct cls_struct_16byte2 b1; struct cls_struct_combined b2; struct cls_struct_16byte1 b3; b0 = *(struct cls_struct_16byte1*)(args[0]); b1 = *(struct cls_struct_16byte2*)(args[1]); b2 = *(struct cls_struct_combined*)(args[2]); b3 = *(struct cls_struct_16byte1*)(args[3]); *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[5]; ffi_type* cls_struct_fields1[5]; ffi_type* cls_struct_fields2[5]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[5]; struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, {3, 1.0, 8.0}}; struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4}; struct cls_struct_combined res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_float; cls_struct_fields[2] = &ffi_type_sint; cls_struct_fields[3] = NULL; cls_struct_fields1[0] = &ffi_type_sint; cls_struct_fields1[1] = &ffi_type_double; cls_struct_fields1[2] = &ffi_type_float; cls_struct_fields1[3] = NULL; cls_struct_fields2[0] = &cls_struct_type; cls_struct_fields2[1] = &cls_struct_type1; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl); /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1, cls_struct_16byte2, cls_struct_combined, cls_struct_16byte1)) (code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a)); CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b)); CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c)); CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii)); CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd)); CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff)); /* CHECK( 1 == 0); */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct10.c000066400000000000000000000067671265146633400235560ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned long long a; unsigned char b; } A; typedef struct B { unsigned char y; struct A x; unsigned int z; } B; typedef struct C { unsigned long long d; unsigned char e; } C; static B B_fn(struct A b2, struct B b3, struct C b4) { struct B result; result.x.a = b2.a + b3.x.a + b3.z + b4.d; result.x.b = b2.b + b3.x.b + b3.y + b4.e; result.y = b2.b + b3.x.b + b4.e; printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; struct C b2; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); b2 = *(struct C*)(args[2]); *(B*)resp = B_fn(b0, b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[4]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[4]; ffi_type* cls_struct_fields2[3]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[4]; struct A e_dbl = { 1LL, 7}; struct B f_dbl = { 99, {12LL , 127}, 255}; struct C g_dbl = { 2LL, 9}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_uint64; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &ffi_type_uchar; cls_struct_fields1[1] = &cls_struct_type; cls_struct_fields1[2] = &ffi_type_uint; cls_struct_fields1[3] = NULL; cls_struct_fields2[0] = &ffi_type_uint64; cls_struct_fields2[1] = &ffi_type_uchar; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct11.c000066400000000000000000000056571265146633400235540ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check parameter passing with nested structs of a single type. This tests the special cases for homogenous floating-point aggregates in the AArch64 PCS. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { float a_x; float a_y; } A; typedef struct B { float b_x; float b_y; } B; typedef struct C { A a; B b; } C; static C C_fn (int x, int y, int z, C source, int i, int j, int k) { C result; result.a.a_x = source.a.a_x; result.a.a_y = source.a.a_y; result.b.b_x = source.b.b_x; result.b.b_y = source.b.b_y; printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); printf ("%.1f, %.1f, %.1f, %.1f, " "%.1f, %.1f, %.1f, %.1f\n", source.a.a_x, source.a.a_y, source.b.b_x, source.b.b_y, result.a.a_x, result.a.a_y, result.b.b_x, result.b.b_y); return result; } int main (void) { ffi_cif cif; ffi_type* struct_fields_source_a[3]; ffi_type* struct_fields_source_b[3]; ffi_type* struct_fields_source_c[3]; ffi_type* arg_types[8]; ffi_type struct_type_a, struct_type_b, struct_type_c; struct A source_fld_a = {1.0, 2.0}; struct B source_fld_b = {4.0, 8.0}; int k = 1; struct C result; struct C source = {source_fld_a, source_fld_b}; struct_type_a.size = 0; struct_type_a.alignment = 0; struct_type_a.type = FFI_TYPE_STRUCT; struct_type_a.elements = struct_fields_source_a; struct_type_b.size = 0; struct_type_b.alignment = 0; struct_type_b.type = FFI_TYPE_STRUCT; struct_type_b.elements = struct_fields_source_b; struct_type_c.size = 0; struct_type_c.alignment = 0; struct_type_c.type = FFI_TYPE_STRUCT; struct_type_c.elements = struct_fields_source_c; struct_fields_source_a[0] = &ffi_type_float; struct_fields_source_a[1] = &ffi_type_float; struct_fields_source_a[2] = NULL; struct_fields_source_b[0] = &ffi_type_float; struct_fields_source_b[1] = &ffi_type_float; struct_fields_source_b[2] = NULL; struct_fields_source_c[0] = &struct_type_a; struct_fields_source_c[1] = &struct_type_b; struct_fields_source_c[2] = NULL; arg_types[0] = &ffi_type_sint32; arg_types[1] = &ffi_type_sint32; arg_types[2] = &ffi_type_sint32; arg_types[3] = &struct_type_c; arg_types[4] = &ffi_type_sint32; arg_types[5] = &ffi_type_sint32; arg_types[6] = &ffi_type_sint32; arg_types[7] = NULL; void *args[7]; args[0] = &k; args[1] = &k; args[2] = &k; args[3] = &source; args[4] = &k; args[5] = &k; args[6] = &k; CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, arg_types) == FFI_OK); ffi_call (&cif, FFI_FN (C_fn), &result, args); /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ CHECK (result.a.a_x == source.a.a_x); CHECK (result.a.a_y == source.a.a_y); CHECK (result.b.b_x == source.b.b_x); CHECK (result.b.b_y == source.b.b_y); exit (0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct2.c000066400000000000000000000053041265146633400234610ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20030911 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned long a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; B B_fn(struct A b0, struct B b1) { struct B result; result.x.a = b0.a + b1.x.a; result.x.b = b0.b + b1.x.b + b1.y; result.y = b0.b + b1.x.b; printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y, result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); *(B*)resp = B_fn(b0, b1); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type cls_struct_type, cls_struct_type1; ffi_type* dbl_arg_types[3]; struct A e_dbl = { 1, 7}; struct B f_dbl = {{12 , 127}, 99}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_fields[0] = &ffi_type_ulong; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct3.c000066400000000000000000000053341265146633400234650ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20030911 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned long long a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; B B_fn(struct A b0, struct B b1) { struct B result; result.x.a = b0.a + b1.x.a; result.x.b = b0.b + b1.x.b + b1.y; result.y = b0.b + b1.x.b; printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b, (int)b1.x.a, b1.x.b, b1.y, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); *(B*)resp = B_fn(b0, b1); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type cls_struct_type, cls_struct_type1; ffi_type* dbl_arg_types[3]; struct A e_dbl = { 1LL, 7}; struct B f_dbl = {{12LL , 127}, 99}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_fields[0] = &ffi_type_uint64; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct4.c000066400000000000000000000053331265146633400234650ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: PR 25630. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { double a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; static B B_fn(struct A b2, struct B b3) { struct B result; result.x.a = b2.a + b3.x.a; result.x.b = b2.b + b3.x.b + b3.y; result.y = b2.b + b3.x.b; printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); *(B*)resp = B_fn(b0, b1); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type cls_struct_type, cls_struct_type1; ffi_type* dbl_arg_types[3]; struct A e_dbl = { 1.0, 7}; struct B f_dbl = {{12.0 , 127}, 99}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct5.c000066400000000000000000000053411265146633400234650ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { long double a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; static B B_fn(struct A b2, struct B b3) { struct B result; result.x.a = b2.a + b3.x.a; result.x.b = b2.b + b3.x.b + b3.y; result.y = b2.b + b3.x.b; printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); *(B*)resp = B_fn(b0, b1); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type cls_struct_type, cls_struct_type1; ffi_type* dbl_arg_types[3]; struct A e_dbl = { 1.0, 7}; struct B f_dbl = {{12.0 , 127}, 99}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_fields[0] = &ffi_type_longdouble; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct6.c000066400000000000000000000065561265146633400234770ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: PR 25630. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { double a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; typedef struct C { long d; unsigned char e; } C; static B B_fn(struct A b2, struct B b3, struct C b4) { struct B result; result.x.a = b2.a + b3.x.a + b4.d; result.x.b = b2.b + b3.x.b + b3.y + b4.e; result.y = b2.b + b3.x.b + b4.e; printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; struct C b2; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); b2 = *(struct C*)(args[2]); *(B*)resp = B_fn(b0, b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[4]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type* cls_struct_fields2[3]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[4]; struct A e_dbl = { 1.0, 7}; struct B f_dbl = {{12.0 , 127}, 99}; struct C g_dbl = { 2, 9}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; cls_struct_fields2[0] = &ffi_type_slong; cls_struct_fields2[1] = &ffi_type_uchar; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct7.c000066400000000000000000000053431265146633400234710ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned long long a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; static B B_fn(struct A b2, struct B b3) { struct B result; result.x.a = b2.a + b3.x.a; result.x.b = b2.b + b3.x.b + b3.y; result.y = b2.b + b3.x.b; printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); *(B*)resp = B_fn(b0, b1); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[3]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type cls_struct_type, cls_struct_type1; ffi_type* dbl_arg_types[3]; struct A e_dbl = { 1LL, 7}; struct B f_dbl = {{12.0 , 127}, 99}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_fields[0] = &ffi_type_uint64; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl); /* { dg-output "\n1 7 12 127 99: 13 233 134" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct8.c000066400000000000000000000066071265146633400234760ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned long long a; unsigned char b; } A; typedef struct B { struct A x; unsigned char y; } B; typedef struct C { unsigned long long d; unsigned char e; } C; static B B_fn(struct A b2, struct B b3, struct C b4) { struct B result; result.x.a = b2.a + b3.x.a + b4.d; result.x.b = b2.b + b3.x.b + b3.y + b4.e; result.y = b2.b + b3.x.b + b4.e; printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b, (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e, (int)result.x.a, result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; struct C b2; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); b2 = *(struct C*)(args[2]); *(B*)resp = B_fn(b0, b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[4]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type* cls_struct_fields2[3]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[4]; struct A e_dbl = { 1LL, 7}; struct B f_dbl = {{12LL , 127}, 99}; struct C g_dbl = { 2LL, 9}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_uint64; cls_struct_fields[1] = &ffi_type_uchar; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; cls_struct_fields2[0] = &ffi_type_uint64; cls_struct_fields2[1] = &ffi_type_uchar; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/nested_struct9.c000066400000000000000000000065771265146633400235050ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Contains structs as parameter of the struct itself. Sample taken from Alan Modras patch to src/prep_cif.c. Limitations: none. PR: none. Originator: 20051010 */ /* { dg-do run } */ #include "ffitest.h" typedef struct A { unsigned char a; unsigned long long b; } A; typedef struct B { struct A x; unsigned char y; } B; typedef struct C { unsigned long d; unsigned char e; } C; static B B_fn(struct A b2, struct B b3, struct C b4) { struct B result; result.x.a = b2.a + b3.x.a + b4.d; result.x.b = b2.b + b3.x.b + b3.y + b4.e; result.y = b2.b + b3.x.b + b4.e; printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b, b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e, result.x.a, (int)result.x.b, result.y); return result; } static void B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct A b0; struct B b1; struct C b2; b0 = *(struct A*)(args[0]); b1 = *(struct B*)(args[1]); b2 = *(struct C*)(args[2]); *(B*)resp = B_fn(b0, b1, b2); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[4]; ffi_type* cls_struct_fields[3]; ffi_type* cls_struct_fields1[3]; ffi_type* cls_struct_fields2[3]; ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2; ffi_type* dbl_arg_types[4]; struct A e_dbl = { 1, 7LL}; struct B f_dbl = {{12.0 , 127}, 99}; struct C g_dbl = { 2, 9}; struct B res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_type1.size = 0; cls_struct_type1.alignment = 0; cls_struct_type1.type = FFI_TYPE_STRUCT; cls_struct_type1.elements = cls_struct_fields1; cls_struct_type2.size = 0; cls_struct_type2.alignment = 0; cls_struct_type2.type = FFI_TYPE_STRUCT; cls_struct_type2.elements = cls_struct_fields2; cls_struct_fields[0] = &ffi_type_uchar; cls_struct_fields[1] = &ffi_type_uint64; cls_struct_fields[2] = NULL; cls_struct_fields1[0] = &cls_struct_type; cls_struct_fields1[1] = &ffi_type_uchar; cls_struct_fields1[2] = NULL; cls_struct_fields2[0] = &ffi_type_ulong; cls_struct_fields2[1] = &ffi_type_uchar; cls_struct_fields2[2] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type1; dbl_arg_types[2] = &cls_struct_type2; dbl_arg_types[3] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = NULL; ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl); /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK); res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl); /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */ CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d)); CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e)); CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e)); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/problem1.c000066400000000000000000000044261265146633400222360ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure passing with different structure size. Limitations: none. PR: none. Originator: 20030828 */ /* { dg-do run } */ #include "ffitest.h" typedef struct my_ffi_struct { double a; double b; double c; } my_ffi_struct; my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2) { struct my_ffi_struct result; result.a = a1.a + a2.a; result.b = a1.b + a2.b; result.c = a1.c + a2.c; printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c); return result; } void stub(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct my_ffi_struct a1; struct my_ffi_struct a2; a1 = *(struct my_ffi_struct*)(args[0]); a2 = *(struct my_ffi_struct*)(args[1]); *(my_ffi_struct *)resp = callee(a1, a2); } int main(void) { ffi_type* my_ffi_struct_fields[4]; ffi_type my_ffi_struct_type; ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args[4]; ffi_type* arg_types[3]; struct my_ffi_struct g = { 1.0, 2.0, 3.0 }; struct my_ffi_struct f = { 1.0, 2.0, 3.0 }; struct my_ffi_struct res; my_ffi_struct_type.size = 0; my_ffi_struct_type.alignment = 0; my_ffi_struct_type.type = FFI_TYPE_STRUCT; my_ffi_struct_type.elements = my_ffi_struct_fields; my_ffi_struct_fields[0] = &ffi_type_double; my_ffi_struct_fields[1] = &ffi_type_double; my_ffi_struct_fields[2] = &ffi_type_double; my_ffi_struct_fields[3] = NULL; arg_types[0] = &my_ffi_struct_type; arg_types[1] = &my_ffi_struct_type; arg_types[2] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type, arg_types) == FFI_OK); args[0] = &g; args[1] = &f; args[2] = NULL; ffi_call(&cif, FFI_FN(callee), &res, args); /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ printf("res: %g %g %g\n", res.a, res.b, res.c); /* { dg-output "\nres: 2 4 6" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK); res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f); /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ printf("res: %g %g %g\n", res.a, res.b, res.c); /* { dg-output "\nres: 2 4 6" } */ exit(0);; } polyml-5.6/libffi/testsuite/libffi.call/promotion.c000066400000000000000000000025111265146633400225340ustar00rootroot00000000000000/* Area: ffi_call Purpose: Promotion test. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static int promotion(signed char sc, signed short ss, unsigned char uc, unsigned short us) { int r = (int) sc + (int) ss + (int) uc + (int) us; return r; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; signed char sc; unsigned char uc; signed short ss; unsigned short us; unsigned long ul; args[0] = &ffi_type_schar; args[1] = &ffi_type_sshort; args[2] = &ffi_type_uchar; args[3] = &ffi_type_ushort; values[0] = ≻ values[1] = &ss; values[2] = &uc; values[3] = &us; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_sint, args) == FFI_OK); us = 0; ul = 0; for (sc = (signed char) -127; sc <= (signed char) 120; sc += 1) for (ss = -30000; ss <= 30000; ss += 10000) for (uc = (unsigned char) 0; uc <= (unsigned char) 200; uc += 20) for (us = 0; us <= 60000; us += 10000) { ul++; ffi_call(&cif, FFI_FN(promotion), &rint, values); CHECK((int)rint == (signed char) sc + (signed short) ss + (unsigned char) uc + (unsigned short) us); } printf("%lu promotion tests run\n", ul); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/pyobjc-tc.c000066400000000000000000000046061265146633400224070ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check different structures. Limitations: none. PR: none. Originator: Ronald Oussoren 20030824 */ /* { dg-do run } */ #include "ffitest.h" typedef struct Point { float x; float y; } Point; typedef struct Size { float h; float w; } Size; typedef struct Rect { Point o; Size s; } Rect; int doit(int o, char* s, Point p, Rect r, int last) { printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); return 42; } int main(void) { ffi_type point_type; ffi_type size_type; ffi_type rect_type; ffi_cif cif; ffi_type* arglist[6]; void* values[6]; int r; /* * First set up FFI types for the 3 struct types */ point_type.size = 0; /*sizeof(Point);*/ point_type.alignment = 0; /*__alignof__(Point);*/ point_type.type = FFI_TYPE_STRUCT; point_type.elements = malloc(3 * sizeof(ffi_type*)); point_type.elements[0] = &ffi_type_float; point_type.elements[1] = &ffi_type_float; point_type.elements[2] = NULL; size_type.size = 0;/* sizeof(Size);*/ size_type.alignment = 0;/* __alignof__(Size);*/ size_type.type = FFI_TYPE_STRUCT; size_type.elements = malloc(3 * sizeof(ffi_type*)); size_type.elements[0] = &ffi_type_float; size_type.elements[1] = &ffi_type_float; size_type.elements[2] = NULL; rect_type.size = 0;/*sizeof(Rect);*/ rect_type.alignment =0;/* __alignof__(Rect);*/ rect_type.type = FFI_TYPE_STRUCT; rect_type.elements = malloc(3 * sizeof(ffi_type*)); rect_type.elements[0] = &point_type; rect_type.elements[1] = &size_type; rect_type.elements[2] = NULL; /* * Create a CIF */ arglist[0] = &ffi_type_sint; arglist[1] = &ffi_type_pointer; arglist[2] = &point_type; arglist[3] = &rect_type; arglist[4] = &ffi_type_sint; arglist[5] = NULL; r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 5, &ffi_type_sint, arglist); if (r != FFI_OK) { abort(); } /* And call the function through the CIF */ { Point p = { 1.0, 2.0 }; Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; int o = 0; int l = 42; char* m = "myMethod"; ffi_arg result; values[0] = &o; values[1] = &m; values[2] = &p; values[3] = &r; values[4] = &l; values[5] = NULL; printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); ffi_call(&cif, FFI_FN(doit), &result, values); printf ("The result is %d\n", (int)result); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_dbl.c000066400000000000000000000013571265146633400226550ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value double. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static double return_dbl(double dbl) { printf ("%f\n", dbl); return 2 * dbl; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; double dbl, rdbl; args[0] = &ffi_type_double; values[0] = &dbl; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_double, args) == FFI_OK); for (dbl = -127.3; dbl < 127; dbl++) { ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); printf ("%f vs %f\n", rdbl, return_dbl(dbl)); CHECK(rdbl == 2 * dbl); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_dbl1.c000066400000000000000000000017541265146633400227370ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value double. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4) { return dbl1 + fl2 + in3 + dbl4; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; double dbl1, dbl4, rdbl; float fl2; unsigned int in3; args[0] = &ffi_type_double; args[1] = &ffi_type_float; args[2] = &ffi_type_uint; args[3] = &ffi_type_double; values[0] = &dbl1; values[1] = &fl2; values[2] = &in3; values[3] = &dbl4; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_double, args) == FFI_OK); dbl1 = 127.0; fl2 = 128.0; in3 = 255; dbl4 = 512.7; ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4)); CHECK(rdbl == dbl1 + fl2 + in3 + dbl4); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_dbl2.c000066400000000000000000000017551265146633400227410ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value double. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4) { return dbl1 + dbl2 + in3 + dbl4; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; double dbl1, dbl2, dbl4, rdbl; unsigned int in3; args[0] = &ffi_type_double; args[1] = &ffi_type_double; args[2] = &ffi_type_uint; args[3] = &ffi_type_double; values[0] = &dbl1; values[1] = &dbl2; values[2] = &in3; values[3] = &dbl4; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_double, args) == FFI_OK); dbl1 = 127.0; dbl2 = 128.0; in3 = 255; dbl4 = 512.7; ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values); printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4)); CHECK(rdbl == dbl1 + dbl2 + in3 + dbl4); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_fl.c000066400000000000000000000013021265146633400225030ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value float. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static float return_fl(float fl) { return 2 * fl; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float fl, rfl; args[0] = &ffi_type_float; values[0] = &fl; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_float, args) == FFI_OK); for (fl = -127.0; fl < 127; fl++) { ffi_call(&cif, FFI_FN(return_fl), &rfl, values); printf ("%f vs %f\n", rfl, return_fl(fl)); CHECK(rfl == 2 * fl); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_fl1.c000066400000000000000000000013631265146633400225730ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value float. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static float return_fl(float fl1, float fl2) { return fl1 + fl2; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float fl1, fl2, rfl; args[0] = &ffi_type_float; args[1] = &ffi_type_float; values[0] = &fl1; values[1] = &fl2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_float, args) == FFI_OK); fl1 = 127.0; fl2 = 128.0; ffi_call(&cif, FFI_FN(return_fl), &rfl, values); printf ("%f vs %f\n", rfl, return_fl(fl1, fl2)); CHECK(rfl == fl1 + fl2); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_fl2.c000066400000000000000000000021131265146633400225660ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value float. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" /* Use volatile float to avoid false negative on ix86. See PR target/323. */ static float return_fl(float fl1, float fl2, float fl3, float fl4) { volatile float sum; sum = fl1 + fl2 + fl3 + fl4; return sum; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float fl1, fl2, fl3, fl4, rfl; volatile float sum; args[0] = &ffi_type_float; args[1] = &ffi_type_float; args[2] = &ffi_type_float; args[3] = &ffi_type_float; values[0] = &fl1; values[1] = &fl2; values[2] = &fl3; values[3] = &fl4; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_float, args) == FFI_OK); fl1 = 127.0; fl2 = 128.0; fl3 = 255.1; fl4 = 512.7; ffi_call(&cif, FFI_FN(return_fl), &rfl, values); printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4)); sum = fl1 + fl2 + fl3 + fl4; CHECK(rfl == sum); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_fl3.c000066400000000000000000000017071265146633400225770ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value float. Limitations: none. PR: none. Originator: 20050212 */ /* { dg-do run } */ #include "ffitest.h" static float return_fl(float fl1, float fl2, unsigned int in3, float fl4) { return fl1 + fl2 + in3 + fl4; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; float fl1, fl2, fl4, rfl; unsigned int in3; args[0] = &ffi_type_float; args[1] = &ffi_type_float; args[2] = &ffi_type_uint; args[3] = &ffi_type_float; values[0] = &fl1; values[1] = &fl2; values[2] = &in3; values[3] = &fl4; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_float, args) == FFI_OK); fl1 = 127.0; fl2 = 128.0; in3 = 255; fl4 = 512.7; ffi_call(&cif, FFI_FN(return_fl), &rfl, values); printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4)); CHECK(rfl == fl1 + fl2 + in3 + fl4); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_ldl.c000066400000000000000000000013531265146633400226630ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value long double. Limitations: none. PR: none. Originator: 20071113 */ /* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ #include "ffitest.h" static long double return_ldl(long double ldl) { return 2*ldl; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; long double ldl, rldl; args[0] = &ffi_type_longdouble; values[0] = &ldl; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_longdouble, args) == FFI_OK); for (ldl = -127.0; ldl < 127.0; ldl++) { ffi_call(&cif, FFI_FN(return_ldl), &rldl, values); CHECK(rldl == 2 * ldl); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_ll.c000066400000000000000000000015251265146633400225200ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value long long. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static long long return_ll(long long ll) { return ll; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; long long rlonglong; long long ll; args[0] = &ffi_type_sint64; values[0] = ≪ /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sint64, args) == FFI_OK); for (ll = 0LL; ll < 100LL; ll++) { ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); CHECK(rlonglong == ll); } for (ll = 55555555555000LL; ll < 55555555555100LL; ll++) { ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); CHECK(rlonglong == ll); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_ll1.c000066400000000000000000000020411265146633400225730ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check if long long are passed in the corresponding regs on ppc. Limitations: none. PR: 20104. Originator: 20050222 */ /* { dg-do run } */ /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ #include "ffitest.h" static long long return_ll(int ll0, long long ll1, int ll2) { return ll0 + ll1 + ll2; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; long long rlonglong; long long ll1; unsigned ll0, ll2; args[0] = &ffi_type_sint; args[1] = &ffi_type_sint64; args[2] = &ffi_type_sint; values[0] = &ll0; values[1] = &ll1; values[2] = &ll2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_sint64, args) == FFI_OK); ll0 = 11111111; ll1 = 11111111111000LL; ll2 = 11111111; ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values); printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2); /* { dg-output "res: 11111133333222, 11111133333222" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_sc.c000066400000000000000000000013261265146633400225150ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value signed char. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static signed char return_sc(signed char sc) { return sc; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; signed char sc; args[0] = &ffi_type_schar; values[0] = ≻ /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_schar, args) == FFI_OK); for (sc = (signed char) -127; sc < (signed char) 127; sc++) { ffi_call(&cif, FFI_FN(return_sc), &rint, values); CHECK((signed char)rint == sc); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_sl.c000066400000000000000000000013331265146633400225240ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check if long as return type is handled correctly. Limitations: none. PR: none. */ /* { dg-do run } */ #include "ffitest.h" static long return_sl(long l1, long l2) { return l1 - l2; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg res; unsigned long l1, l2; args[0] = &ffi_type_slong; args[1] = &ffi_type_slong; values[0] = &l1; values[1] = &l2; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_slong, args) == FFI_OK); l1 = 1073741823L; l2 = 1073741824L; ffi_call(&cif, FFI_FN(return_sl), &res, values); printf("res: %ld, %ld\n", (long)res, l1 - l2); /* { dg-output "res: -1, -1" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_uc.c000066400000000000000000000013531265146633400225170ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check return value unsigned char. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static unsigned char return_uc(unsigned char uc) { return uc; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; unsigned char uc; args[0] = &ffi_type_uchar; values[0] = &uc; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_uchar, args) == FFI_OK); for (uc = (unsigned char) '\x00'; uc < (unsigned char) '\xff'; uc++) { ffi_call(&cif, FFI_FN(return_uc), &rint, values); CHECK((unsigned char)rint == uc); } exit(0); } polyml-5.6/libffi/testsuite/libffi.call/return_ul.c000066400000000000000000000015301265146633400225250ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check if unsigned long as return type is handled correctly. Limitations: none. PR: none. Originator: 20060724 */ /* { dg-do run } */ #include "ffitest.h" static unsigned long return_ul(unsigned long ul1, unsigned long ul2) { return ul1 + ul2; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg res; unsigned long ul1, ul2; args[0] = &ffi_type_ulong; args[1] = &ffi_type_ulong; values[0] = &ul1; values[1] = &ul2; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_ulong, args) == FFI_OK); ul1 = 1073741823L; ul2 = 1073741824L; ffi_call(&cif, FFI_FN(return_ul), &res, values); printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2); /* { dg-output "res: 2147483647, 2147483647" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/stret_large.c000066400000000000000000000111421265146633400230210ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure returning with different structure size. Depending on the ABI. Check bigger struct which overlaps the gp and fp register count on Darwin/AIX/ppc64. Limitations: none. PR: none. Originator: Blake Chaffin 6/21/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ #include "ffitest.h" /* 13 FPRs: 104 bytes */ /* 14 FPRs: 112 bytes */ typedef struct struct_108byte { double a; double b; double c; double d; double e; double f; double g; double h; double i; double j; double k; double l; double m; int n; } struct_108byte; struct_108byte cls_struct_108byte_fn( struct_108byte b0, struct_108byte b1, struct_108byte b2, struct_108byte b3) { struct_108byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; result.e = b0.e + b1.e + b2.e + b3.e; result.f = b0.f + b1.f + b2.f + b3.f; result.g = b0.g + b1.g + b2.g + b3.g; result.h = b0.h + b1.h + b2.h + b3.h; result.i = b0.i + b1.i + b2.i + b3.i; result.j = b0.j + b1.j + b2.j + b3.j; result.k = b0.k + b1.k + b2.k + b3.k; result.l = b0.l + b1.l + b2.l + b3.l; result.m = b0.m + b1.m + b2.m + b3.m; result.n = b0.n + b1.n + b2.n + b3.n; printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, result.d, result.e, result.f, result.g, result.h, result.i, result.j, result.k, result.l, result.m, result.n); return result; } static void cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct_108byte b0, b1, b2, b3; b0 = *(struct_108byte*)(args[0]); b1 = *(struct_108byte*)(args[1]); b2 = *(struct_108byte*)(args[2]); b3 = *(struct_108byte*)(args[3]); *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[15]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 }; struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 }; struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 }; struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 }; struct_108byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_double; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_double; cls_struct_fields[7] = &ffi_type_double; cls_struct_fields[8] = &ffi_type_double; cls_struct_fields[9] = &ffi_type_double; cls_struct_fields[10] = &ffi_type_double; cls_struct_fields[11] = &ffi_type_double; cls_struct_fields[12] = &ffi_type_double; cls_struct_fields[13] = &ffi_type_sint32; cls_struct_fields[14] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl); /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK); res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte, struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/stret_large2.c000066400000000000000000000114101265146633400231010ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure returning with different structure size. Depending on the ABI. Check bigger struct which overlaps the gp and fp register count on Darwin/AIX/ppc64. Limitations: none. PR: none. Originator: Blake Chaffin 6/21/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ #include "ffitest.h" /* 13 FPRs: 104 bytes */ /* 14 FPRs: 112 bytes */ typedef struct struct_116byte { double a; double b; double c; double d; double e; double f; double g; double h; double i; double j; double k; double l; double m; double n; int o; } struct_116byte; struct_116byte cls_struct_116byte_fn( struct_116byte b0, struct_116byte b1, struct_116byte b2, struct_116byte b3) { struct_116byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; result.e = b0.e + b1.e + b2.e + b3.e; result.f = b0.f + b1.f + b2.f + b3.f; result.g = b0.g + b1.g + b2.g + b3.g; result.h = b0.h + b1.h + b2.h + b3.h; result.i = b0.i + b1.i + b2.i + b3.i; result.j = b0.j + b1.j + b2.j + b3.j; result.k = b0.k + b1.k + b2.k + b3.k; result.l = b0.l + b1.l + b2.l + b3.l; result.m = b0.m + b1.m + b2.m + b3.m; result.n = b0.n + b1.n + b2.n + b3.n; result.o = b0.o + b1.o + b2.o + b3.o; printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c, result.d, result.e, result.f, result.g, result.h, result.i, result.j, result.k, result.l, result.m, result.n, result.o); return result; } static void cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct_116byte b0, b1, b2, b3; b0 = *(struct_116byte*)(args[0]); b1 = *(struct_116byte*)(args[1]); b2 = *(struct_116byte*)(args[2]); b3 = *(struct_116byte*)(args[3]); *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[16]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 }; struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 }; struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 }; struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 }; struct_116byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_double; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_double; cls_struct_fields[7] = &ffi_type_double; cls_struct_fields[8] = &ffi_type_double; cls_struct_fields[9] = &ffi_type_double; cls_struct_fields[10] = &ffi_type_double; cls_struct_fields[11] = &ffi_type_double; cls_struct_fields[12] = &ffi_type_double; cls_struct_fields[13] = &ffi_type_double; cls_struct_fields[14] = &ffi_type_sint32; cls_struct_fields[15] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl); /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK); res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte, struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i, res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/stret_medium.c000066400000000000000000000073351265146633400232200ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure returning with different structure size. Depending on the ABI. Check bigger struct which overlaps the gp and fp register count on Darwin/AIX/ppc64. Limitations: none. PR: none. Originator: Blake Chaffin 6/21/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ #include "ffitest.h" typedef struct struct_72byte { double a; double b; double c; double d; double e; double f; double g; double h; double i; } struct_72byte; struct_72byte cls_struct_72byte_fn( struct_72byte b0, struct_72byte b1, struct_72byte b2, struct_72byte b3) { struct_72byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; result.e = b0.e + b1.e + b2.e + b3.e; result.f = b0.f + b1.f + b2.f + b3.f; result.g = b0.g + b1.g + b2.g + b3.g; result.h = b0.h + b1.h + b2.h + b3.h; result.i = b0.i + b1.i + b2.i + b3.i; printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c, result.d, result.e, result.f, result.g, result.h, result.i); return result; } static void cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct_72byte b0, b1, b2, b3; b0 = *(struct_72byte*)(args[0]); b1 = *(struct_72byte*)(args[1]); b2 = *(struct_72byte*)(args[2]); b3 = *(struct_72byte*)(args[3]); *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[10]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 }; struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 }; struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 }; struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 }; struct_72byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_double; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_double; cls_struct_fields[7] = &ffi_type_double; cls_struct_fields[8] = &ffi_type_double; cls_struct_fields[9] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); /* { dg-output "22 15 17 25 6 13 19 18 16" } */ printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/stret_medium2.c000066400000000000000000000074611265146633400233020ustar00rootroot00000000000000/* Area: ffi_call, closure_call Purpose: Check structure returning with different structure size. Depending on the ABI. Check bigger struct which overlaps the gp and fp register count on Darwin/AIX/ppc64. Limitations: none. PR: none. Originator: Blake Chaffin 6/21/2007 */ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ /* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */ #include "ffitest.h" typedef struct struct_72byte { double a; double b; double c; double d; double e; double f; double g; double h; long long i; } struct_72byte; struct_72byte cls_struct_72byte_fn( struct_72byte b0, struct_72byte b1, struct_72byte b2, struct_72byte b3) { struct_72byte result; result.a = b0.a + b1.a + b2.a + b3.a; result.b = b0.b + b1.b + b2.b + b3.b; result.c = b0.c + b1.c + b2.c + b3.c; result.d = b0.d + b1.d + b2.d + b3.d; result.e = b0.e + b1.e + b2.e + b3.e; result.f = b0.f + b1.f + b2.f + b3.f; result.g = b0.g + b1.g + b2.g + b3.g; result.h = b0.h + b1.h + b2.h + b3.h; result.i = b0.i + b1.i + b2.i + b3.i; printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c, result.d, result.e, result.f, result.g, result.h, result.i); return result; } static void cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { struct_72byte b0, b1, b2, b3; b0 = *(struct_72byte*)(args[0]); b1 = *(struct_72byte*)(args[1]); b2 = *(struct_72byte*)(args[2]); b3 = *(struct_72byte*)(args[3]); *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); void* args_dbl[5]; ffi_type* cls_struct_fields[10]; ffi_type cls_struct_type; ffi_type* dbl_arg_types[5]; struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 }; struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 }; struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 }; struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 }; struct_72byte res_dbl; cls_struct_type.size = 0; cls_struct_type.alignment = 0; cls_struct_type.type = FFI_TYPE_STRUCT; cls_struct_type.elements = cls_struct_fields; cls_struct_fields[0] = &ffi_type_double; cls_struct_fields[1] = &ffi_type_double; cls_struct_fields[2] = &ffi_type_double; cls_struct_fields[3] = &ffi_type_double; cls_struct_fields[4] = &ffi_type_double; cls_struct_fields[5] = &ffi_type_double; cls_struct_fields[6] = &ffi_type_double; cls_struct_fields[7] = &ffi_type_double; cls_struct_fields[8] = &ffi_type_sint64; cls_struct_fields[9] = NULL; dbl_arg_types[0] = &cls_struct_type; dbl_arg_types[1] = &cls_struct_type; dbl_arg_types[2] = &cls_struct_type; dbl_arg_types[3] = &cls_struct_type; dbl_arg_types[4] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type, dbl_arg_types) == FFI_OK); args_dbl[0] = &e_dbl; args_dbl[1] = &f_dbl; args_dbl[2] = &g_dbl; args_dbl[3] = &h_dbl; args_dbl[4] = NULL; ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl); /* { dg-output "22 15 17 25 6 13 19 18 16" } */ printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK); res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte, struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl); /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */ printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i); /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/strlen.c000066400000000000000000000015141265146633400220170ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check strlen function call. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" static size_t my_strlen(char *s) { return (strlen(s)); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; args[0] = &ffi_type_pointer; values[0] = (void*) &s; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sint, args) == FFI_OK); s = "a"; ffi_call(&cif, FFI_FN(my_strlen), &rint, values); CHECK(rint == 1); s = "1234567"; ffi_call(&cif, FFI_FN(my_strlen), &rint, values); CHECK(rint == 7); s = "1234567890123456789012345"; ffi_call(&cif, FFI_FN(my_strlen), &rint, values); CHECK(rint == 25); exit (0); } polyml-5.6/libffi/testsuite/libffi.call/strlen2_win32.c000066400000000000000000000017401265146633400231240ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check fastcall strlen call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static size_t __FASTCALL__ my_fastcall_strlen(char *s) { return (strlen(s)); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; args[0] = &ffi_type_pointer; values[0] = (void*) &s; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, &ffi_type_sint, args) == FFI_OK); s = "a"; ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values); CHECK(rint == 1); s = "1234567"; ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values); CHECK(rint == 7); s = "1234567890123456789012345"; ffi_call(&cif, FFI_FN(my_fastcall_strlen), &rint, values); CHECK(rint == 25); printf("fastcall strlen tests passed\n"); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/strlen_win32.c000066400000000000000000000017451265146633400230470ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check stdcall strlen call on X86_WIN32 systems. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" static size_t __attribute__((stdcall)) my_stdcall_strlen(char *s) { return (strlen(s)); } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; char *s; args[0] = &ffi_type_pointer; values[0] = (void*) &s; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 1, &ffi_type_sint, args) == FFI_OK); s = "a"; ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); CHECK(rint == 1); s = "1234567"; ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); CHECK(rint == 7); s = "1234567890123456789012345"; ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values); CHECK(rint == 25); printf("stdcall strlen tests passed\n"); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct1.c000066400000000000000000000025371265146633400221230ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { unsigned char uc; double d; unsigned int ui; } test_structure_1; static test_structure_1 struct1(test_structure_1 ts) { ts.uc++; ts.d--; ts.ui++; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts1_type; ffi_type *ts1_type_elements[4]; test_structure_1 ts1_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_1 *ts1_result = (test_structure_1 *) malloc (sizeof(test_structure_1)); ts1_type.size = 0; ts1_type.alignment = 0; ts1_type.type = FFI_TYPE_STRUCT; ts1_type.elements = ts1_type_elements; ts1_type_elements[0] = &ffi_type_uchar; ts1_type_elements[1] = &ffi_type_double; ts1_type_elements[2] = &ffi_type_uint; ts1_type_elements[3] = NULL; args[0] = &ts1_type; values[0] = &ts1_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts1_type, args) == FFI_OK); ts1_arg.uc = '\x01'; ts1_arg.d = 3.14159; ts1_arg.ui = 555; ffi_call(&cif, FFI_FN(struct1), ts1_result, values); CHECK(ts1_result->ui == 556); CHECK(ts1_result->d == 3.14159 - 1); free (ts1_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct1_win32.c000066400000000000000000000026631265146633400231450ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures with fastcall/thiscall convention. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" typedef struct { unsigned char uc; double d; unsigned int ui; } test_structure_1; static test_structure_1 __FASTCALL__ struct1(test_structure_1 ts) { ts.uc++; ts.d--; ts.ui++; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts1_type; ffi_type *ts1_type_elements[4]; test_structure_1 ts1_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_1 *ts1_result = (test_structure_1 *) malloc (sizeof(test_structure_1)); ts1_type.size = 0; ts1_type.alignment = 0; ts1_type.type = FFI_TYPE_STRUCT; ts1_type.elements = ts1_type_elements; ts1_type_elements[0] = &ffi_type_uchar; ts1_type_elements[1] = &ffi_type_double; ts1_type_elements[2] = &ffi_type_uint; ts1_type_elements[3] = NULL; args[0] = &ts1_type; values[0] = &ts1_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, &ts1_type, args) == FFI_OK); ts1_arg.uc = '\x01'; ts1_arg.d = 3.14159; ts1_arg.ui = 555; ffi_call(&cif, FFI_FN(struct1), ts1_result, values); CHECK(ts1_result->ui == 556); CHECK(ts1_result->d == 3.14159 - 1); free (ts1_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct2.c000066400000000000000000000026011265146633400221140ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { double d1; double d2; } test_structure_2; static test_structure_2 struct2(test_structure_2 ts) { ts.d1--; ts.d2--; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; test_structure_2 ts2_arg; ffi_type ts2_type; ffi_type *ts2_type_elements[3]; /* This is a hack to get a properly aligned result buffer */ test_structure_2 *ts2_result = (test_structure_2 *) malloc (sizeof(test_structure_2)); ts2_type.size = 0; ts2_type.alignment = 0; ts2_type.type = FFI_TYPE_STRUCT; ts2_type.elements = ts2_type_elements; ts2_type_elements[0] = &ffi_type_double; ts2_type_elements[1] = &ffi_type_double; ts2_type_elements[2] = NULL; args[0] = &ts2_type; values[0] = &ts2_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts2_type, args) == FFI_OK); ts2_arg.d1 = 5.55; ts2_arg.d2 = 6.66; printf ("%g\n", ts2_arg.d1); printf ("%g\n", ts2_arg.d2); ffi_call(&cif, FFI_FN(struct2), ts2_result, values); printf ("%g\n", ts2_result->d1); printf ("%g\n", ts2_result->d2); CHECK(ts2_result->d1 == 5.55 - 1); CHECK(ts2_result->d2 == 6.66 - 1); free (ts2_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct2_win32.c000066400000000000000000000027171265146633400231460ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures in fastcall/stdcall function Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ #include "ffitest.h" typedef struct { double d1; double d2; } test_structure_2; static test_structure_2 __FASTCALL__ struct2(test_structure_2 ts) { ts.d1--; ts.d2--; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; test_structure_2 ts2_arg; ffi_type ts2_type; ffi_type *ts2_type_elements[3]; /* This is a hack to get a properly aligned result buffer */ test_structure_2 *ts2_result = (test_structure_2 *) malloc (sizeof(test_structure_2)); ts2_type.size = 0; ts2_type.alignment = 0; ts2_type.type = FFI_TYPE_STRUCT; ts2_type.elements = ts2_type_elements; ts2_type_elements[0] = &ffi_type_double; ts2_type_elements[1] = &ffi_type_double; ts2_type_elements[2] = NULL; args[0] = &ts2_type; values[0] = &ts2_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 1, &ts2_type, args) == FFI_OK); ts2_arg.d1 = 5.55; ts2_arg.d2 = 6.66; printf ("%g\n", ts2_arg.d1); printf ("%g\n", ts2_arg.d2); ffi_call(&cif, FFI_FN(struct2), ts2_result, values); printf ("%g\n", ts2_result->d1); printf ("%g\n", ts2_result->d2); CHECK(ts2_result->d1 == 5.55 - 1); CHECK(ts2_result->d2 == 6.66 - 1); free (ts2_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct3.c000066400000000000000000000023021265146633400221130ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { int si; } test_structure_3; static test_structure_3 struct3(test_structure_3 ts) { ts.si = -(ts.si*2); return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; int compare_value; ffi_type ts3_type; ffi_type *ts3_type_elements[2]; test_structure_3 ts3_arg; test_structure_3 *ts3_result = (test_structure_3 *) malloc (sizeof(test_structure_3)); ts3_type.size = 0; ts3_type.alignment = 0; ts3_type.type = FFI_TYPE_STRUCT; ts3_type.elements = ts3_type_elements; ts3_type_elements[0] = &ffi_type_sint; ts3_type_elements[1] = NULL; args[0] = &ts3_type; values[0] = &ts3_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts3_type, args) == FFI_OK); ts3_arg.si = -123; compare_value = ts3_arg.si; ffi_call(&cif, FFI_FN(struct3), ts3_result, values); printf ("%d %d\n", ts3_result->si, -(compare_value*2)); CHECK(ts3_result->si == -(compare_value*2)); free (ts3_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct4.c000066400000000000000000000024661265146633400221270ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { unsigned ui1; unsigned ui2; unsigned ui3; } test_structure_4; static test_structure_4 struct4(test_structure_4 ts) { ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts4_type; ffi_type *ts4_type_elements[4]; test_structure_4 ts4_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_4 *ts4_result = (test_structure_4 *) malloc (sizeof(test_structure_4)); ts4_type.size = 0; ts4_type.alignment = 0; ts4_type.type = FFI_TYPE_STRUCT; ts4_type.elements = ts4_type_elements; ts4_type_elements[0] = &ffi_type_uint; ts4_type_elements[1] = &ffi_type_uint; ts4_type_elements[2] = &ffi_type_uint; ts4_type_elements[3] = NULL; args[0] = &ts4_type; values[0] = &ts4_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts4_type, args) == FFI_OK); ts4_arg.ui1 = 2; ts4_arg.ui2 = 3; ts4_arg.ui3 = 4; ffi_call (&cif, FFI_FN(struct4), ts4_result, values); CHECK(ts4_result->ui3 == 2U * 3U * 4U); free (ts4_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct5.c000066400000000000000000000025621265146633400221250ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { char c1; char c2; } test_structure_5; static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2) { ts1.c1 += ts2.c1; ts1.c2 -= ts2.c2; return ts1; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts5_type; ffi_type *ts5_type_elements[3]; test_structure_5 ts5_arg1, ts5_arg2; /* This is a hack to get a properly aligned result buffer */ test_structure_5 *ts5_result = (test_structure_5 *) malloc (sizeof(test_structure_5)); ts5_type.size = 0; ts5_type.alignment = 0; ts5_type.type = FFI_TYPE_STRUCT; ts5_type.elements = ts5_type_elements; ts5_type_elements[0] = &ffi_type_schar; ts5_type_elements[1] = &ffi_type_schar; ts5_type_elements[2] = NULL; args[0] = &ts5_type; args[1] = &ts5_type; values[0] = &ts5_arg1; values[1] = &ts5_arg2; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ts5_type, args) == FFI_OK); ts5_arg1.c1 = 2; ts5_arg1.c2 = 6; ts5_arg2.c1 = 5; ts5_arg2.c2 = 3; ffi_call (&cif, FFI_FN(struct5), ts5_result, values); CHECK(ts5_result->c1 == 7); CHECK(ts5_result->c2 == 3); free (ts5_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct6.c000066400000000000000000000024671265146633400221320ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { float f; double d; } test_structure_6; static test_structure_6 struct6 (test_structure_6 ts) { ts.f += 1; ts.d += 1; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts6_type; ffi_type *ts6_type_elements[3]; test_structure_6 ts6_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_6 *ts6_result = (test_structure_6 *) malloc (sizeof(test_structure_6)); ts6_type.size = 0; ts6_type.alignment = 0; ts6_type.type = FFI_TYPE_STRUCT; ts6_type.elements = ts6_type_elements; ts6_type_elements[0] = &ffi_type_float; ts6_type_elements[1] = &ffi_type_double; ts6_type_elements[2] = NULL; args[0] = &ts6_type; values[0] = &ts6_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK); ts6_arg.f = 5.55f; ts6_arg.d = 6.66; printf ("%g\n", ts6_arg.f); printf ("%g\n", ts6_arg.d); ffi_call(&cif, FFI_FN(struct6), ts6_result, values); CHECK(ts6_result->f == 5.55f + 1); CHECK(ts6_result->d == 6.66 + 1); free (ts6_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct7.c000066400000000000000000000031001265146633400221140ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { float f1; float f2; double d; } test_structure_7; static test_structure_7 struct7 (test_structure_7 ts) { ts.f1 += 1; ts.f2 += 1; ts.d += 1; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts7_type; ffi_type *ts7_type_elements[4]; test_structure_7 ts7_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_7 *ts7_result = (test_structure_7 *) malloc (sizeof(test_structure_7)); ts7_type.size = 0; ts7_type.alignment = 0; ts7_type.type = FFI_TYPE_STRUCT; ts7_type.elements = ts7_type_elements; ts7_type_elements[0] = &ffi_type_float; ts7_type_elements[1] = &ffi_type_float; ts7_type_elements[2] = &ffi_type_double; ts7_type_elements[3] = NULL; args[0] = &ts7_type; values[0] = &ts7_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK); ts7_arg.f1 = 5.55f; ts7_arg.f2 = 55.5f; ts7_arg.d = 6.66; printf ("%g\n", ts7_arg.f1); printf ("%g\n", ts7_arg.f2); printf ("%g\n", ts7_arg.d); ffi_call(&cif, FFI_FN(struct7), ts7_result, values); printf ("%g\n", ts7_result->f1); printf ("%g\n", ts7_result->f2); printf ("%g\n", ts7_result->d); CHECK(ts7_result->f1 == 5.55f + 1); CHECK(ts7_result->f2 == 55.5f + 1); CHECK(ts7_result->d == 6.66 + 1); free (ts7_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct8.c000066400000000000000000000034141265146633400221250ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { float f1; float f2; float f3; float f4; } test_structure_8; static test_structure_8 struct8 (test_structure_8 ts) { ts.f1 += 1; ts.f2 += 1; ts.f3 += 1; ts.f4 += 1; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts8_type; ffi_type *ts8_type_elements[5]; test_structure_8 ts8_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_8 *ts8_result = (test_structure_8 *) malloc (sizeof(test_structure_8)); ts8_type.size = 0; ts8_type.alignment = 0; ts8_type.type = FFI_TYPE_STRUCT; ts8_type.elements = ts8_type_elements; ts8_type_elements[0] = &ffi_type_float; ts8_type_elements[1] = &ffi_type_float; ts8_type_elements[2] = &ffi_type_float; ts8_type_elements[3] = &ffi_type_float; ts8_type_elements[4] = NULL; args[0] = &ts8_type; values[0] = &ts8_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK); ts8_arg.f1 = 5.55f; ts8_arg.f2 = 55.5f; ts8_arg.f3 = -5.55f; ts8_arg.f4 = -55.5f; printf ("%g\n", ts8_arg.f1); printf ("%g\n", ts8_arg.f2); printf ("%g\n", ts8_arg.f3); printf ("%g\n", ts8_arg.f4); ffi_call(&cif, FFI_FN(struct8), ts8_result, values); printf ("%g\n", ts8_result->f1); printf ("%g\n", ts8_result->f2); printf ("%g\n", ts8_result->f3); printf ("%g\n", ts8_result->f4); CHECK(ts8_result->f1 == 5.55f + 1); CHECK(ts8_result->f2 == 55.5f + 1); CHECK(ts8_result->f3 == -5.55f + 1); CHECK(ts8_result->f4 == -55.5f + 1); free (ts8_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/struct9.c000066400000000000000000000025561265146633400221340ustar00rootroot00000000000000/* Area: ffi_call Purpose: Check structures. Limitations: none. PR: none. Originator: From the original ffitest.c */ /* { dg-do run } */ #include "ffitest.h" typedef struct { float f; int i; } test_structure_9; static test_structure_9 struct9 (test_structure_9 ts) { ts.f += 1; ts.i += 1; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts9_type; ffi_type *ts9_type_elements[3]; test_structure_9 ts9_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_9 *ts9_result = (test_structure_9 *) malloc (sizeof(test_structure_9)); ts9_type.size = 0; ts9_type.alignment = 0; ts9_type.type = FFI_TYPE_STRUCT; ts9_type.elements = ts9_type_elements; ts9_type_elements[0] = &ffi_type_float; ts9_type_elements[1] = &ffi_type_sint; ts9_type_elements[2] = NULL; args[0] = &ts9_type; values[0] = &ts9_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK); ts9_arg.f = 5.55f; ts9_arg.i = 5; printf ("%g\n", ts9_arg.f); printf ("%d\n", ts9_arg.i); ffi_call(&cif, FFI_FN(struct9), ts9_result, values); printf ("%g\n", ts9_result->f); printf ("%d\n", ts9_result->i); CHECK(ts9_result->f == 5.55f + 1); CHECK(ts9_result->i == 5 + 1); free (ts9_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/testclosure.c000066400000000000000000000031751265146633400230710ustar00rootroot00000000000000/* Area: closure_call Purpose: Check return value float. Limitations: none. PR: 41908. Originator: 20091102 */ /* { dg-do run } */ #include "ffitest.h" typedef struct cls_struct_combined { float a; float b; float c; float d; } cls_struct_combined; void cls_struct_combined_fn(struct cls_struct_combined arg) { printf("%g %g %g %g\n", arg.a, arg.b, arg.c, arg.d); fflush(stdout); } static void cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, void** args, void* userdata __UNUSED__) { struct cls_struct_combined a0; a0 = *(struct cls_struct_combined*)(args[0]); cls_struct_combined_fn(a0); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type* cls_struct_fields0[5]; ffi_type cls_struct_type0; ffi_type* dbl_arg_types[5]; struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; cls_struct_type0.size = 0; cls_struct_type0.alignment = 0; cls_struct_type0.type = FFI_TYPE_STRUCT; cls_struct_type0.elements = cls_struct_fields0; cls_struct_fields0[0] = &ffi_type_float; cls_struct_fields0[1] = &ffi_type_float; cls_struct_fields0[2] = &ffi_type_float; cls_struct_fields0[3] = &ffi_type_float; cls_struct_fields0[4] = NULL; dbl_arg_types[0] = &cls_struct_type0; dbl_arg_types[1] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, dbl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK); ((void(*)(cls_struct_combined)) (code))(g_dbl); /* { dg-output "4 5 1 8" } */ exit(0); } polyml-5.6/libffi/testsuite/libffi.call/uninitialized.c000066400000000000000000000023601265146633400233600ustar00rootroot00000000000000/* { dg-do run } */ #include "ffitest.h" typedef struct { unsigned char uc; double d; unsigned int ui; } test_structure_1; static test_structure_1 struct1(test_structure_1 ts) { ts.uc++; ts.d--; ts.ui++; return ts; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_type ts1_type; ffi_type *ts1_type_elements[4]; memset(&cif, 1, sizeof(cif)); ts1_type.size = 0; ts1_type.alignment = 0; ts1_type.type = FFI_TYPE_STRUCT; ts1_type.elements = ts1_type_elements; ts1_type_elements[0] = &ffi_type_uchar; ts1_type_elements[1] = &ffi_type_double; ts1_type_elements[2] = &ffi_type_uint; ts1_type_elements[3] = NULL; test_structure_1 ts1_arg; /* This is a hack to get a properly aligned result buffer */ test_structure_1 *ts1_result = (test_structure_1 *) malloc (sizeof(test_structure_1)); args[0] = &ts1_type; values[0] = &ts1_arg; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts1_type, args) == FFI_OK); ts1_arg.uc = '\x01'; ts1_arg.d = 3.14159; ts1_arg.ui = 555; ffi_call(&cif, FFI_FN(struct1), ts1_result, values); CHECK(ts1_result->ui == 556); CHECK(ts1_result->d == 3.14159 - 1); free (ts1_result); exit(0); } polyml-5.6/libffi/testsuite/libffi.call/va_1.c000066400000000000000000000072511265146633400213420ustar00rootroot00000000000000/* Area: ffi_call Purpose: Test passing struct in variable argument lists. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ /* { dg-output "" { xfail avr32*-*-* } } */ #include "ffitest.h" #include struct small_tag { unsigned char a; unsigned char b; }; struct large_tag { unsigned a; unsigned b; unsigned c; unsigned d; unsigned e; }; static int test_fn (int n, ...) { va_list ap; struct small_tag s1; struct small_tag s2; struct large_tag l; unsigned char uc; signed char sc; unsigned short us; signed short ss; unsigned int ui; signed int si; unsigned long ul; signed long sl; float f; double d; va_start (ap, n); s1 = va_arg (ap, struct small_tag); l = va_arg (ap, struct large_tag); s2 = va_arg (ap, struct small_tag); uc = va_arg (ap, unsigned); sc = va_arg (ap, signed); us = va_arg (ap, unsigned); ss = va_arg (ap, signed); ui = va_arg (ap, unsigned int); si = va_arg (ap, signed int); ul = va_arg (ap, unsigned long); sl = va_arg (ap, signed long); f = va_arg (ap, double); /* C standard promotes float->double when anonymous */ d = va_arg (ap, double); printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, s2.a, s2.b, uc, sc, us, ss, ui, si, ul, sl, f, d); va_end (ap); return n + 1; } int main (void) { ffi_cif cif; void* args[15]; ffi_type* arg_types[15]; ffi_type s_type; ffi_type *s_type_elements[3]; ffi_type l_type; ffi_type *l_type_elements[6]; struct small_tag s1; struct small_tag s2; struct large_tag l1; int n; int res; unsigned char uc; signed char sc; unsigned short us; signed short ss; unsigned int ui; signed int si; unsigned long ul; signed long sl; double d1; double f1; s_type.size = 0; s_type.alignment = 0; s_type.type = FFI_TYPE_STRUCT; s_type.elements = s_type_elements; s_type_elements[0] = &ffi_type_uchar; s_type_elements[1] = &ffi_type_uchar; s_type_elements[2] = NULL; l_type.size = 0; l_type.alignment = 0; l_type.type = FFI_TYPE_STRUCT; l_type.elements = l_type_elements; l_type_elements[0] = &ffi_type_uint; l_type_elements[1] = &ffi_type_uint; l_type_elements[2] = &ffi_type_uint; l_type_elements[3] = &ffi_type_uint; l_type_elements[4] = &ffi_type_uint; l_type_elements[5] = NULL; arg_types[0] = &ffi_type_sint; arg_types[1] = &s_type; arg_types[2] = &l_type; arg_types[3] = &s_type; arg_types[4] = &ffi_type_uchar; arg_types[5] = &ffi_type_schar; arg_types[6] = &ffi_type_ushort; arg_types[7] = &ffi_type_sshort; arg_types[8] = &ffi_type_uint; arg_types[9] = &ffi_type_sint; arg_types[10] = &ffi_type_ulong; arg_types[11] = &ffi_type_slong; arg_types[12] = &ffi_type_double; arg_types[13] = &ffi_type_double; arg_types[14] = NULL; CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); s1.a = 5; s1.b = 6; l1.a = 10; l1.b = 11; l1.c = 12; l1.d = 13; l1.e = 14; s2.a = 7; s2.b = 8; n = 41; uc = 9; sc = 10; us = 11; ss = 12; ui = 13; si = 14; ul = 15; sl = 16; f1 = 2.12; d1 = 3.13; args[0] = &n; args[1] = &s1; args[2] = &l1; args[3] = &s2; args[4] = &uc; args[5] = ≻ args[6] = &us; args[7] = &ss; args[8] = &ui; args[9] = &si; args[10] = &ul; args[11] = &sl; args[12] = &f1; args[13] = &d1; args[14] = NULL; ffi_call(&cif, FFI_FN(test_fn), &res, args); /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 42" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.call/va_struct1.c000066400000000000000000000042771265146633400226140ustar00rootroot00000000000000/* Area: ffi_call Purpose: Test passing struct in variable argument lists. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ /* { dg-output "" { xfail avr32*-*-* } } */ #include "ffitest.h" #include struct small_tag { unsigned char a; unsigned char b; }; struct large_tag { unsigned a; unsigned b; unsigned c; unsigned d; unsigned e; }; static int test_fn (int n, ...) { va_list ap; struct small_tag s1; struct small_tag s2; struct large_tag l; va_start (ap, n); s1 = va_arg (ap, struct small_tag); l = va_arg (ap, struct large_tag); s2 = va_arg (ap, struct small_tag); printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, s2.a, s2.b); va_end (ap); return n + 1; } int main (void) { ffi_cif cif; void* args[5]; ffi_type* arg_types[5]; ffi_type s_type; ffi_type *s_type_elements[3]; ffi_type l_type; ffi_type *l_type_elements[6]; struct small_tag s1; struct small_tag s2; struct large_tag l1; int n; int res; s_type.size = 0; s_type.alignment = 0; s_type.type = FFI_TYPE_STRUCT; s_type.elements = s_type_elements; s_type_elements[0] = &ffi_type_uchar; s_type_elements[1] = &ffi_type_uchar; s_type_elements[2] = NULL; l_type.size = 0; l_type.alignment = 0; l_type.type = FFI_TYPE_STRUCT; l_type.elements = l_type_elements; l_type_elements[0] = &ffi_type_uint; l_type_elements[1] = &ffi_type_uint; l_type_elements[2] = &ffi_type_uint; l_type_elements[3] = &ffi_type_uint; l_type_elements[4] = &ffi_type_uint; l_type_elements[5] = NULL; arg_types[0] = &ffi_type_sint; arg_types[1] = &s_type; arg_types[2] = &l_type; arg_types[3] = &s_type; arg_types[4] = NULL; CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); s1.a = 5; s1.b = 6; l1.a = 10; l1.b = 11; l1.c = 12; l1.d = 13; l1.e = 14; s2.a = 7; s2.b = 8; n = 41; args[0] = &n; args[1] = &s1; args[2] = &l1; args[3] = &s2; args[4] = NULL; ffi_call(&cif, FFI_FN(test_fn), &res, args); /* { dg-output "5 6 10 11 12 13 14 7 8" } */ printf("res: %d\n", (int) res); /* { dg-output "\nres: 42" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.call/va_struct2.c000066400000000000000000000043701265146633400226070ustar00rootroot00000000000000/* Area: ffi_call Purpose: Test passing struct in variable argument lists. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ /* { dg-output "" { xfail avr32*-*-* } } */ #include "ffitest.h" #include struct small_tag { unsigned char a; unsigned char b; }; struct large_tag { unsigned a; unsigned b; unsigned c; unsigned d; unsigned e; }; static struct small_tag test_fn (int n, ...) { va_list ap; struct small_tag s1; struct small_tag s2; struct large_tag l; va_start (ap, n); s1 = va_arg (ap, struct small_tag); l = va_arg (ap, struct large_tag); s2 = va_arg (ap, struct small_tag); printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, s2.a, s2.b); va_end (ap); s1.a += s2.a; s1.b += s2.b; return s1; } int main (void) { ffi_cif cif; void* args[5]; ffi_type* arg_types[5]; ffi_type s_type; ffi_type *s_type_elements[3]; ffi_type l_type; ffi_type *l_type_elements[6]; struct small_tag s1; struct small_tag s2; struct large_tag l1; int n; struct small_tag res; s_type.size = 0; s_type.alignment = 0; s_type.type = FFI_TYPE_STRUCT; s_type.elements = s_type_elements; s_type_elements[0] = &ffi_type_uchar; s_type_elements[1] = &ffi_type_uchar; s_type_elements[2] = NULL; l_type.size = 0; l_type.alignment = 0; l_type.type = FFI_TYPE_STRUCT; l_type.elements = l_type_elements; l_type_elements[0] = &ffi_type_uint; l_type_elements[1] = &ffi_type_uint; l_type_elements[2] = &ffi_type_uint; l_type_elements[3] = &ffi_type_uint; l_type_elements[4] = &ffi_type_uint; l_type_elements[5] = NULL; arg_types[0] = &ffi_type_sint; arg_types[1] = &s_type; arg_types[2] = &l_type; arg_types[3] = &s_type; arg_types[4] = NULL; CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); s1.a = 5; s1.b = 6; l1.a = 10; l1.b = 11; l1.c = 12; l1.d = 13; l1.e = 14; s2.a = 7; s2.b = 8; n = 41; args[0] = &n; args[1] = &s1; args[2] = &l1; args[3] = &s2; args[4] = NULL; ffi_call(&cif, FFI_FN(test_fn), &res, args); /* { dg-output "5 6 10 11 12 13 14 7 8" } */ printf("res: %d %d\n", res.a, res.b); /* { dg-output "\nres: 12 14" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.call/va_struct3.c000066400000000000000000000044721265146633400226130ustar00rootroot00000000000000/* Area: ffi_call Purpose: Test passing struct in variable argument lists. Limitations: none. PR: none. Originator: ARM Ltd. */ /* { dg-do run } */ /* { dg-output "" { xfail avr32*-*-* } } */ #include "ffitest.h" #include struct small_tag { unsigned char a; unsigned char b; }; struct large_tag { unsigned a; unsigned b; unsigned c; unsigned d; unsigned e; }; static struct large_tag test_fn (int n, ...) { va_list ap; struct small_tag s1; struct small_tag s2; struct large_tag l; va_start (ap, n); s1 = va_arg (ap, struct small_tag); l = va_arg (ap, struct large_tag); s2 = va_arg (ap, struct small_tag); printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, s2.a, s2.b); va_end (ap); l.a += s1.a; l.b += s1.b; l.c += s2.a; l.d += s2.b; return l; } int main (void) { ffi_cif cif; void* args[5]; ffi_type* arg_types[5]; ffi_type s_type; ffi_type *s_type_elements[3]; ffi_type l_type; ffi_type *l_type_elements[6]; struct small_tag s1; struct small_tag s2; struct large_tag l1; int n; struct large_tag res; s_type.size = 0; s_type.alignment = 0; s_type.type = FFI_TYPE_STRUCT; s_type.elements = s_type_elements; s_type_elements[0] = &ffi_type_uchar; s_type_elements[1] = &ffi_type_uchar; s_type_elements[2] = NULL; l_type.size = 0; l_type.alignment = 0; l_type.type = FFI_TYPE_STRUCT; l_type.elements = l_type_elements; l_type_elements[0] = &ffi_type_uint; l_type_elements[1] = &ffi_type_uint; l_type_elements[2] = &ffi_type_uint; l_type_elements[3] = &ffi_type_uint; l_type_elements[4] = &ffi_type_uint; l_type_elements[5] = NULL; arg_types[0] = &ffi_type_sint; arg_types[1] = &s_type; arg_types[2] = &l_type; arg_types[3] = &s_type; arg_types[4] = NULL; CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); s1.a = 5; s1.b = 6; l1.a = 10; l1.b = 11; l1.c = 12; l1.d = 13; l1.e = 14; s2.a = 7; s2.b = 8; n = 41; args[0] = &n; args[1] = &s1; args[2] = &l1; args[3] = &s2; args[4] = NULL; ffi_call(&cif, FFI_FN(test_fn), &res, args); /* { dg-output "5 6 10 11 12 13 14 7 8" } */ printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); /* { dg-output "\nres: 15 17 19 21 14" } */ return 0; } polyml-5.6/libffi/testsuite/libffi.special/000077500000000000000000000000001265146633400210505ustar00rootroot00000000000000polyml-5.6/libffi/testsuite/libffi.special/ffitestcxx.h000066400000000000000000000017101265146633400234070ustar00rootroot00000000000000#include #include #include #include #include "fficonfig.h" #define MAX_ARGS 256 /* Define __UNUSED__ that also other compilers than gcc can run the tests. */ #undef __UNUSED__ #if defined(__GNUC__) #define __UNUSED__ __attribute__((__unused__)) #else #define __UNUSED__ #endif #define CHECK(x) (!(x) ? abort() : (void)0) /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a file open. */ #ifdef HAVE_MMAP_ANON # undef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) # define MAP_ANONYMOUS MAP_ANON # endif # define USING_MMAP #endif #ifdef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # define USING_MMAP #endif /* MinGW kludge. */ #ifdef _WIN64 #define PRIdLL "I64d" #define PRIuLL "I64u" #else #define PRIdLL "lld" #define PRIuLL "llu" #endif polyml-5.6/libffi/testsuite/libffi.special/special.exp000066400000000000000000000023661265146633400232150ustar00rootroot00000000000000# Copyright (C) 2003, 2006, 2009, 2010 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; see the file COPYING3. If not see # . dg-init libffi-init global srcdir subdir global cxx_options set cxx_options " -shared-libgcc -lstdc++" if { [string match $using_gcc "yes"] } { dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3" dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os" } dg-finish # Local Variables: # tcl-indent-level:4 # End: polyml-5.6/libffi/testsuite/libffi.special/unwindtest.cc000066400000000000000000000073341265146633400235720ustar00rootroot00000000000000/* Area: ffi_closure, unwind info Purpose: Check if the unwind information is passed correctly. Limitations: none. PR: none. Originator: Jeff Sturm */ /* { dg-do run } */ #include "ffitestcxx.h" #if defined HAVE_STDINT_H #include #endif #if defined HAVE_INTTYPES_H #include #endif void closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, void** args __UNUSED__, void* userdata __UNUSED__) { throw 9; } typedef void (*closure_test_type)(); void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__) { *(ffi_arg*)resp = (int)*(float *)args[0] +(int)(*(float *)args[1]) + (int)(*(float *)args[2]) + (int)*(float *)args[3] + (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + (int)*(float *)args[6] + (int)(*(int *)args[7]) + (int)(*(double*)args[8]) + (int)*(int *)args[9] + (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + (int)*(int *)args[12] + (int)(*(int *)args[13]) + (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata; printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", (int)*(float *)args[0], (int)(*(float *)args[1]), (int)(*(float *)args[2]), (int)*(float *)args[3], (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), (int)*(float *)args[6], (int)(*(int *)args[7]), (int)(*(double *)args[8]), (int)*(int *)args[9], (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata, (int)*(ffi_arg*)resp); throw (int)*(ffi_arg*)resp; } typedef int (*closure_test_type1)(float, float, float, float, signed short, float, float, int, double, int, int, float, int, int, int, int); int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type * cl_arg_types[17]; { cl_arg_types[1] = NULL; CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK); try { (*((closure_test_type)(code)))(); } catch (int exception_code) { CHECK(exception_code == 9); } printf("part one OK\n"); /* { dg-output "part one OK" } */ } { cl_arg_types[0] = &ffi_type_float; cl_arg_types[1] = &ffi_type_float; cl_arg_types[2] = &ffi_type_float; cl_arg_types[3] = &ffi_type_float; cl_arg_types[4] = &ffi_type_sshort; cl_arg_types[5] = &ffi_type_float; cl_arg_types[6] = &ffi_type_float; cl_arg_types[7] = &ffi_type_uint; cl_arg_types[8] = &ffi_type_double; cl_arg_types[9] = &ffi_type_uint; cl_arg_types[10] = &ffi_type_uint; cl_arg_types[11] = &ffi_type_float; cl_arg_types[12] = &ffi_type_uint; cl_arg_types[13] = &ffi_type_uint; cl_arg_types[14] = &ffi_type_uint; cl_arg_types[15] = &ffi_type_uint; cl_arg_types[16] = NULL; /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, &ffi_type_sint, cl_arg_types) == FFI_OK); CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1, (void *) 3 /* userdata */, code) == FFI_OK); try { (*((closure_test_type1)code)) (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, 19, 21, 1); /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ } catch (int exception_code) { CHECK(exception_code == 255); } printf("part two OK\n"); /* { dg-output "\npart two OK" } */ } exit(0); } polyml-5.6/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc000066400000000000000000000020171265146633400254020ustar00rootroot00000000000000/* Area: ffi_call, unwind info Purpose: Check if the unwind information is passed correctly. Limitations: none. PR: none. Originator: Andreas Tobler 20061213 */ /* { dg-do run } */ #include "ffitestcxx.h" static int checking(int a __UNUSED__, short b __UNUSED__, signed char c __UNUSED__) { throw 9; } int main (void) { ffi_cif cif; ffi_type *args[MAX_ARGS]; void *values[MAX_ARGS]; ffi_arg rint; signed int si; signed short ss; signed char sc; args[0] = &ffi_type_sint; values[0] = &si; args[1] = &ffi_type_sshort; values[1] = &ss; args[2] = &ffi_type_schar; values[2] = ≻ /* Initialize the cif */ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_sint, args) == FFI_OK); si = -6; ss = -12; sc = -1; { try { ffi_call(&cif, FFI_FN(checking), &rint, values); } catch (int exception_code) { CHECK(exception_code == 9); } printf("part one OK\n"); /* { dg-output "part one OK" } */ } exit(0); } polyml-5.6/libffi/texinfo.tex000066400000000000000000011633561265146633400163620ustar00rootroot00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2012-06-05.14} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. % % This texinfo.tex file 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 texinfo.tex file 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, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % like \smartslanted except unconditionally uses \ttsl, and no ic. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore polyml-5.6/libpolymain/000077500000000000000000000000001265146633400152315ustar00rootroot00000000000000polyml-5.6/libpolymain/Makefile.am000066400000000000000000000003741265146633400172710ustar00rootroot00000000000000AUTOMAKE_OPTIONS=foreign AM_CPPFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall AM_CFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall -fno-strict-aliasing lib_LTLIBRARIES = libpolymain.la libpolymain_la_LDFLAGS = -static -version-info 0:0 libpolymain_la_SOURCES = polystub.c polyml-5.6/libpolymain/Makefile.in000066400000000000000000000503311265146633400173000ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = libpolymain DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libpolymain_la_LIBADD = am_libpolymain_la_OBJECTS = polystub.lo libpolymain_la_OBJECTS = $(am_libpolymain_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpolymain_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libpolymain_la_LDFLAGS) $(LDFLAGS) -o \ $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpolymain_la_SOURCES) DIST_SOURCES = $(libpolymain_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_CFLAGS = @FFI_CFLAGS@ FFI_LIBS = @FFI_LIBS@ FGREP = @FGREP@ GIT_VERSION = @GIT_VERSION@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSFLAG = @OSFLAG@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gitinstalled = @gitinstalled@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign AM_CPPFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall AM_CFLAGS = $(ARCHFLAG) $(OSFLAG) -Wall -fno-strict-aliasing lib_LTLIBRARIES = libpolymain.la libpolymain_la_LDFLAGS = -static -version-info 0:0 libpolymain_la_SOURCES = polystub.c all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libpolymain/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libpolymain/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpolymain.la: $(libpolymain_la_OBJECTS) $(libpolymain_la_DEPENDENCIES) $(EXTRA_libpolymain_la_DEPENDENCIES) $(AM_V_CCLD)$(libpolymain_la_LINK) -rpath $(libdir) $(libpolymain_la_OBJECTS) $(libpolymain_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polystub.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libpolymain/PolyMainLib.vcxproj000066400000000000000000000301121265146633400210220ustar00rootroot00000000000000 Debug Win32 IntDebug Win32 IntDebug x64 IntRelease Win32 IntRelease x64 Release Win32 Debug x64 Release x64 {0326C47A-00AF-42CB-B87D-0369A241B570} PolyMainLib StaticLibrary true v140_xp Unicode StaticLibrary true v140_xp Unicode StaticLibrary false v140_xp true Unicode StaticLibrary false v140_xp true Unicode StaticLibrary true v140_xp Unicode StaticLibrary true v140_xp Unicode StaticLibrary false v140_xp true Unicode StaticLibrary false v140_xp true Unicode Level3 Disabled true ..;%(AdditionalIncludeDirectories) MultiThreadedDebug true Level3 Disabled true ..;%(AdditionalIncludeDirectories) MultiThreadedDebug true Level3 Disabled true ..;%(AdditionalIncludeDirectories) MultiThreadedDebug true Level3 Disabled true ..;%(AdditionalIncludeDirectories) MultiThreadedDebug true Level3 MaxSpeed true true true ..;%(AdditionalIncludeDirectories) MultiThreaded true true true Level3 MaxSpeed true true true ..;%(AdditionalIncludeDirectories) MultiThreaded true true true Level3 MaxSpeed true true true ..;%(AdditionalIncludeDirectories) MultiThreaded true true true Level3 MaxSpeed true true true ..;%(AdditionalIncludeDirectories) MultiThreaded true true true polyml-5.6/libpolymain/polystub.c000066400000000000000000000025601265146633400172610ustar00rootroot00000000000000/* Title: polystub.c Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // This is the start-up function for Poly/ML. It simply picks up the // pointer to the exported data and calls the main program. #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include "../polyexports.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return PolyWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow, &poly_exports); } #else int main(int argc, char *argv[]) { return polymain(argc, argv, &poly_exports); } #endif polyml-5.6/libpolyml/000077500000000000000000000000001265146633400147155ustar00rootroot00000000000000polyml-5.6/libpolyml/Console.cpp000066400000000000000000001223441265146633400170310ustar00rootroot00000000000000/* Title: Poly/ML Console Window. Copyright (c) 2000, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_TCHAR_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "../resource.h" #include "mpoly.h" #include "PolyControl.h" #include "diagnostics.h" #include "mpoly.h" #include "run_time.h" #include "sighandler.h" #include "console.h" #include "../polyexports.h" #include "processes.h" #include "polystring.h" /* This module takes the place of the Windows console which has a number of problems, apart from not being a pleasant user interface. It creates a main window containing an edit control, which it has to sub-class so that we can receive all the characters as they are typed. I've written this in C using the direct Windows calls to make it fairly independent of the compiler. It would definitely be simpler and cleaner written in C++ using MFC. DCJM 30/5/2000. */ #ifdef _MSC_VER // Don't tell me about ISO C++ changes. #pragma warning(disable:4996) #endif HWND hMainWindow = NULL; // Main window - exported. HINSTANCE hApplicationInstance; // Application instance (exported) static HANDLE hReadFromML; // Handles to pipe from ML thread static WNDPROC wpOrigEditProc; // Saved window proc. static BOOL fAtEnd; // True if we are at the end of the window static HWND hEditWnd; // Edit sub-window static CHAR *pchInputBuffer; // Buffer to text read. static int nBuffLen; // Length of input buffer. static int nNextPosn; // Position to add input. (<= nBuffLen) static int nAvailable; // Position of "committed" input (<= nNextPosn) static int nReadPosn; // Position of last read (<= nAvailable) static CRITICAL_SECTION csIOInterlock; HANDLE hInputEvent; // Signalled when input is available. static HWND hDDEWindow; // Window to handle DDE requests from ML thread. HANDLE hOldStdin = INVALID_HANDLE_VALUE; static LPTSTR* lpArgs = 0; // Argument list. static int nArgs = 0; static int initDDEControl(const TCHAR *lpszName); static void uninitDDEControl(void); static DWORD dwDDEInstance; static int nInitialShow; // Value of nCmdShow passed in. static bool isActive = false; // Default DDE service name. #define POLYMLSERVICE _T("PolyML") #ifdef UNICODE #define DDECODEPAGE CP_WINUNICODE #else #define DDECODEPAGE CP_WINANSI #endif /* Messages interpreted by the main window thread. */ #define WM_ADDTEXT WM_APP #define WM_DDESTART (WM_APP+1) #define WM_DDESTOP (WM_APP+2) #define WM_DDEEXEC (WM_APP+3) #define WM_DDESERVINIT (WM_APP+4) /* These functions are called by the I/O routines to test for input and to read from the keyboard. */ bool isConsoleInput(void) { if (! isActive) { ShowWindow(hMainWindow, nInitialShow); isActive = true; } EnterCriticalSection(&csIOInterlock); bool nRes = nAvailable != nReadPosn; LeaveCriticalSection(&csIOInterlock); return nRes; } /* Read characters from the input. Only returns zero on EOF. */ unsigned getConsoleInput(char *buff, int nChars) { unsigned nRes = 0; if (! isActive) { ShowWindow(hMainWindow, nInitialShow); isActive = true; } EnterCriticalSection(&csIOInterlock); while (nAvailable == nReadPosn) { ResetEvent(hInputEvent); /* Must block until there is input. This will only actually happen when called from HandleINT since normally we check that input is available first. We check for messages while blocking since we may have a DDE hidden window around. */ LeaveCriticalSection(&csIOInterlock); while (MsgWaitForMultipleObjects(1, &hInputEvent, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+1) { MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } EnterCriticalSection(&csIOInterlock); } // Copy the available characters into the buffer. while (nReadPosn != nAvailable && nChars-- > 0) { char ch; ch = pchInputBuffer[nReadPosn]; if (ch == 4 || ch == 26) { // EOF character. We have to return this as // a separate buffer of size zero so if we've // already returned some characters we leave it till // next time. if (nRes == 0) if (++nReadPosn == nBuffLen) nReadPosn = 0; break; } buff[nRes++] = ch; if (++nReadPosn == nBuffLen) nReadPosn = 0; } if (nAvailable == nReadPosn) ResetEvent(hInputEvent); LeaveCriticalSection(&csIOInterlock); return nRes; } /* All addition is made at the end of the text so this function is called to find out if we're there. */ static void MoveToEnd(void) { if (! fAtEnd) { // Make sure any text we add goes at the end. LRESULT dwEnd = SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0); SendMessage(hEditWnd, EM_SETSEL, dwEnd, dwEnd); fAtEnd = TRUE; } } // Remove lines at the beginning until we have enough space. // If nChars is bigger than the limit we'll delete everything and // return. Returns the space removed. static DWORD CheckForScreenSpace(LRESULT nChars) { DWORD dwRemoved = 0; // TODO: We could avoid these calls by remembering this information. LRESULT limit = SendMessage(hEditWnd, EM_GETLIMITTEXT, 0, 0); LRESULT size = SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0); while (nChars+size >= limit) { int i; if (size == 0) return dwRemoved; for (i = 0; i < size; i++) { if (SendMessage(hEditWnd, EM_LINEFROMCHAR, i, 0) != 0) break; } SendMessage(hEditWnd, EM_SETSEL, 0, i); SendMessage(hEditWnd, WM_CLEAR, 0, 0); fAtEnd = FALSE; MoveToEnd(); size -= i; dwRemoved += i; } return dwRemoved; } // Expand the buffer if necessary to allow room for // additional characters. static void CheckForBufferSpace(int nChars) { BOOL fOverflow; if (nNextPosn >= nReadPosn) fOverflow = nNextPosn+nChars >= nReadPosn+nBuffLen; else fOverflow = nNextPosn+nChars >= nReadPosn; if (fOverflow) { int nOldLen = nBuffLen; // Need more space. nBuffLen = nBuffLen + nChars + nBuffLen/2; pchInputBuffer = (char*)realloc(pchInputBuffer, nBuffLen); // Have to copy any data that has wrapped round to the // new area. if (nNextPosn < nReadPosn) { int nExtra = nBuffLen-nOldLen; if (nExtra >= nNextPosn) { // All the space before will fit in the new area. memcpy(pchInputBuffer+nOldLen, pchInputBuffer, nNextPosn); } else { // Some of the space before will fit but not all. memcpy(pchInputBuffer+nOldLen, pchInputBuffer, nExtra); memmove(pchInputBuffer, pchInputBuffer+nExtra, nNextPosn-nExtra); } // Adjust these pointers modulo the old and new lengths. if (nAvailable < nNextPosn) nAvailable += nOldLen; if (nAvailable >= nBuffLen) nAvailable -= nBuffLen; nNextPosn += nOldLen; if (nNextPosn >= nBuffLen) nNextPosn -= nBuffLen; } } ASSERT(nBuffLen >= 0 && nAvailable >= 0 && nNextPosn >= 0 && nReadPosn >= 0 && nAvailable < nBuffLen && nReadPosn < nBuffLen && nReadPosn < nBuffLen); if (nNextPosn > nReadPosn) ASSERT(nAvailable >= nReadPosn && nAvailable <= nNextPosn); else ASSERT((nNextPosn != nReadPosn && nAvailable <= nNextPosn) || nAvailable >= nReadPosn); } /* DDE requests. DDE uses an internal window for communication and so all DDE operations on a particular instance handle have to be performed by the same thread. That thread also has to check and process the message queue. The previous version did this by having the ML thread make the DDE calls and processed the message list in an "interrupt" routine. That complicates the Windows interface so now the ML thread sends messages to the main window thread to do the work. */ HCONV StartDDEConversation(TCHAR *serviceName, TCHAR *topicName) { return (HCONV)SendMessage(hDDEWindow, WM_DDESTART, (WPARAM)serviceName, (LPARAM)topicName); } void CloseDDEConversation(HCONV hConv) { SendMessage(hDDEWindow, WM_DDESTOP, 0, (LPARAM)hConv); } LRESULT ExecuteDDE(char *command, HCONV hConv) { return SendMessage(hDDEWindow, WM_DDEEXEC, (WPARAM)hConv, (LPARAM)command); } // This is called by the main Poly/ML thread after the arguments have been processed. void SetupDDEHandler(const TCHAR *lpszServiceName) { SendMessage(hDDEWindow, WM_DDESERVINIT, 0, (LPARAM)lpszServiceName); } LRESULT CALLBACK DDEWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DDESERVINIT: return initDDEControl((const TCHAR*)lParam); case WM_DDESTART: { HCONV hcDDEConv; HSZ hszServiceName, hszTopicName; TCHAR *serviceName = (TCHAR*)wParam; TCHAR *topicName = (TCHAR*)lParam; hszServiceName = DdeCreateStringHandle(dwDDEInstance, serviceName, DDECODEPAGE); hszTopicName = DdeCreateStringHandle(dwDDEInstance, topicName, DDECODEPAGE); hcDDEConv = DdeConnect(dwDDEInstance, hszServiceName, hszTopicName, NULL); DdeFreeStringHandle(dwDDEInstance, hszServiceName); DdeFreeStringHandle(dwDDEInstance, hszTopicName); if (hcDDEConv == 0) { // UINT nErr = DdeGetLastError(dwDDEInstance); return 0; } return (LRESULT)hcDDEConv; } case WM_DDESTOP: DdeDisconnect((HCONV)lParam); return 0; case WM_DDEEXEC: { HDDEDATA res; LPSTR command = (LPSTR)lParam; res = DdeClientTransaction((LPBYTE)command, (DWORD)(strlen(command)+1), (HCONV)wParam, 0L, 0, XTYP_EXECUTE, TIMEOUT_ASYNC, NULL); if (res != 0) { DdeFreeDataHandle(res); // Succeeded - return true; return 1; } else if (DdeGetLastError(dwDDEInstance) == DMLERR_BUSY) // If it's busy return false. return 0; else return -1; // An error } default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } } /* In order to be able to handle all the keys we need to sub-class the edit control. */ static LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_GETDLGCODE: return DLGC_WANTALLKEYS | DLGC_WANTCHARS; case WM_KEYDOWN: switch(wParam) { case VK_DELETE: // Ignore the delete key. Beep perhaps? return 0; case VK_LEFT: // If we move the cursor we are probably not case VK_RIGHT: // at the end. case VK_UP: case VK_DOWN: fAtEnd = FALSE; default: return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); } case WM_CHAR: { LPARAM nRpt = lParam & 0xffff; EnterCriticalSection(&csIOInterlock); if (wParam == '\b') { // Delete the previous character(s). if (nNextPosn != nAvailable) { int nCanRemove = 0; while (nRpt-- > 0 && nNextPosn != nAvailable) { nCanRemove++; if (nNextPosn == 0) nNextPosn = nBuffLen; nNextPosn--; } lParam = (lParam & 0xffff0000) | nCanRemove; LeaveCriticalSection(&csIOInterlock); return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); } } else if (wParam == 22) // Control-V { // Generate a Paste command. SendMessage(hMainWindow, WM_COMMAND, ID_EDIT_PASTE, 0); } else if (wParam == 3) // Control-C { // In Windows this has the effect of Copy but we also // want it to generate an interrupt. I've chosen to // make it copy if there is any selection, otherwise to // generate an interrupt. We'll have to see how this works. DWORD dwStart, dwEnd; SendMessage(hwnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); if (dwStart != dwEnd) { SendMessage(hwnd, WM_COPY, 0, 0); } else { // Discard any type-ahead. nNextPosn = nAvailable = nReadPosn = 0; RequestConsoleInterrupt(); } } else if (wParam >= ' ' || wParam == '\r' || wParam == '\t' || wParam == 4 /* ctrl-D */ || wParam == 26 /* ctrl-Z */) { CheckForBufferSpace((int)nRpt); CheckForScreenSpace(nRpt); // Make sure we have space on the screen. // Add the character(s) to the buffer. while (nRpt-- > 0) { if (wParam == '\r') { pchInputBuffer[nNextPosn++] = '\n'; nAvailable = nNextPosn; SetEvent(hInputEvent); } else if (wParam == 4 || wParam == 26) { // Treat either of these as EOF chars. pchInputBuffer[nNextPosn++] = (CHAR)wParam; nAvailable = nNextPosn; SetEvent(hInputEvent); wParam = 4; } else pchInputBuffer[nNextPosn++] = (CHAR)wParam; if (nNextPosn == nBuffLen) nNextPosn = 0; if (nAvailable == nBuffLen) nAvailable = 0; } MoveToEnd(); LeaveCriticalSection(&csIOInterlock); // Add this to the window except if it's ctrl-Z or ctrl-D. if (wParam == 4 || wParam == 26) return 0; return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); } LeaveCriticalSection(&csIOInterlock); return 0; } case WM_DESTROY: { HFONT hFount; // Switch back to the old window proc just in case. #ifdef _M_AMD64 SetWindowLongPtr(hwnd, GWLP_WNDPROC, (INT_PTR)wpOrigEditProc); SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); #else SetWindowLong(hwnd, GWL_WNDPROC, (LONG)wpOrigEditProc); SetWindowLong(hwnd, GWL_USERDATA, 0); #endif // Get the fount and delete it if it's not the default. hFount = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); if (hFount != NULL) { SendMessage(hwnd, WM_SETFONT, (WPARAM)NULL, FALSE); DeleteObject(hFount); } // Call the original to finish off. return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); } case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONUP: case EM_SETSEL: // Need to record that we may no longer be at the end of the text. fAtEnd = FALSE; // Drop through to default. default: return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam); } } /* This function is only used when the "About Poly/ML" dialogue box is being displayed. */ static BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: return 1; case WM_COMMAND: if (wParam == IDOK) { EndDialog(hwndDlg, IDOK); return 1; } case WM_CLOSE: EndDialog(hwndDlg, IDOK); return 1; default: return 0; } } #ifdef UNICODE #define CF_TEXTFORMAT CF_UNICODETEXT #else #define CF_TEXTFORMAT CF_TEXT #endif /* This is the main window procedure. */ LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: { hEditWnd = CreateWindow(_T("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 0, 0, hwnd, 0, hApplicationInstance, NULL); if (hEditWnd == NULL) return -1; /* Failed */ // Sub-class this so that we get the keys that are pressed. // Save the old window proc. #ifdef _M_AMD64 wpOrigEditProc = (WNDPROC)GetWindowLongPtr(hEditWnd, GWLP_WNDPROC); // Set our new window proc. SetWindowLongPtr(hEditWnd, GWLP_WNDPROC, (INT_PTR)EditSubclassProc); #else wpOrigEditProc = (WNDPROC)GetWindowLong(hEditWnd, GWL_WNDPROC); // Set our new window proc. SetWindowLong(hEditWnd, GWL_WNDPROC, (LONG)EditSubclassProc); #endif fAtEnd = TRUE; // Get a 10 point Courier fount. HDC hDC = GetDC(hEditWnd); int nHeight = -MulDiv(10, GetDeviceCaps(hDC, LOGPIXELSY), 72); ReleaseDC(hEditWnd, hDC); HFONT hFont = CreateFont(nHeight, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, _T("Courier")); if (hFont) SendMessage(hEditWnd, WM_SETFONT, (WPARAM)hFont, 0); SetWindowText(hEditWnd, _T("")); return 0; /* Succeeded */ } case WM_SETFOCUS: /* When the focus arrives at the parent set the focus on the edit window. */ SetFocus(hEditWnd); return 0; case WM_SIZE: { LONG offset = 0; // Make the edit control the size of the window's client area. MoveWindow(hEditWnd, 0, offset, LOWORD(lParam), HIWORD(lParam)-offset, TRUE); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(wParam) { case ID_EDIT_COPY: SendMessage(hEditWnd, WM_COPY, 0, 0); return 0; case ID_EDIT_PASTE: if (IsClipboardFormatAvailable(CF_TEXTFORMAT)) { // We need to check that we have enough space // BEFORE we try pasting. HANDLE hClip; LPCTSTR lpszText; OpenClipboard(hEditWnd); hClip = GetClipboardData(CF_TEXTFORMAT); lpszText = (LPCTSTR)GlobalLock(hClip); CheckForScreenSpace(lstrlen(lpszText)); MoveToEnd(); // Add it to the screen. SendMessage(hEditWnd, EM_REPLACESEL, FALSE, (LPARAM)lpszText); // Add to the type-ahead. EnterCriticalSection(&csIOInterlock); // Check there's enough space. This may be an // over-estimate since we replace CRNL by NL. CheckForBufferSpace(lstrlen(lpszText)); while (*lpszText) { // The data we're pasting contains CRNL as // line separators. if (lpszText[0] == '\r' && lpszText[1] == '\n') { pchInputBuffer[nNextPosn++] = '\n'; if (nNextPosn == nBuffLen) nNextPosn = 0; nAvailable = nNextPosn; lpszText += 2; } else { pchInputBuffer[nNextPosn++] = (char)*lpszText++; if (nNextPosn == nBuffLen) nNextPosn = 0; if (lpszText[0] == 4 || lpszText[0] == 26) nAvailable = nNextPosn; // EOF characters. } } if (nAvailable != nReadPosn) SetEvent(hInputEvent); LeaveCriticalSection(&csIOInterlock); GlobalUnlock(hClip); CloseClipboard(); } return 0; case ID_HELP_ABOUT: DialogBox(hApplicationInstance, MAKEINTRESOURCE(IDD_ABOUT_POLYML), hwnd, (DLGPROC)AboutProc); return 0; case ID_FILE_QUIT: if (MessageBox(hwnd, _T("Are you sure you want to quit?"), _T("Confirm Quit"), MB_OKCANCEL) == IDOK) processes->Exit(0); return 0; case ID_RUN_INTERRUPT: // Discard any type-ahead. nNextPosn = nAvailable = nReadPosn = 0; RequestConsoleInterrupt(); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } case WM_CLOSE: if (MessageBox(hwnd, _T("Are you sure you want to quit?"), _T("Confirm Quit"), MB_OKCANCEL) == IDOK) processes->Exit(0); return 0; case WM_ADDTEXT: // Request from the input thread to add some text. { // Remember the old selection and the original length. LRESULT lrStart, lrEnd; SendMessage(hEditWnd, EM_GETSEL, (WPARAM)&lrStart, (LPARAM)&lrEnd); LRESULT lrLength = SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0); LRESULT lrRemoved = CheckForScreenSpace(lrLength); MoveToEnd(); SendMessage(hEditWnd, EM_REPLACESEL, 0, lParam); // If the old selection was at the end (i.e. the pointer // was at the end) we don't reinstate the old selection. if (lrStart != lrLength && lrEnd > lrRemoved) { if (lrStart > lrRemoved) lrStart -= lrRemoved; else lrStart = 0; fAtEnd = FALSE; SendMessage(hEditWnd, EM_SETSEL, lrStart, lrEnd-lrRemoved); } return 0; } default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } } static DWORD WINAPI InThrdProc(LPVOID lpParameter) // This thread deals with input from the ML process. { while (1) { CHAR buff[4096]; DWORD dwRead; if (! ReadFile(hReadFromML, buff, sizeof(buff)-1, &dwRead, NULL)) return 0; buff[dwRead] = 0; if (! isActive) { ShowWindow(hMainWindow, nInitialShow); isActive = true; } #ifdef UNICODE // We need to write Unicode here. Convert it using the current code-page. int wlen = MultiByteToWideChar(codePage, 0, buff, -1, NULL, 0); if (wlen == 0) continue; WCHAR *wBuff = new WCHAR[wlen]; wlen = MultiByteToWideChar(codePage, 0, buff, -1, wBuff, wlen); SendMessage(hMainWindow, WM_ADDTEXT, 0, (LPARAM)wBuff); delete[] wBuff; #else SendMessage(hMainWindow, WM_ADDTEXT, 0, (LPARAM)buff); #endif } } static DWORD WINAPI MainThrdProc(LPVOID lpParameter) // This thread simply continues with the rest of the ML // initialistion. { exportDescription *exports = (exportDescription *)lpParameter; return polymain(nArgs, lpArgs, exports); } // Called with various control events if the input stream is a console. static BOOL WINAPI CtrlHandler(DWORD dwCtrlType) { if (dwCtrlType == CTRL_C_EVENT) { RequestConsoleInterrupt(); return TRUE; } return FALSE; } // Main entry point. Called from WinMain with a pointer to the ML code. int PolyWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLineUnused, int nCmdShow, exportDescription *exports ) { HANDLE hWriteToScreen = INVALID_HANDLE_VALUE; DWORD dwInId, dwRes; SetErrorMode(0); // Force a proper error report InitializeCriticalSection(&csIOInterlock); hInputEvent = CreateEvent(NULL, TRUE, FALSE, NULL); hApplicationInstance = hInstance; // If we already have standard input and standard output we // don't replace them, otherwise we create a window and pipes // to connect it. We use _get_osfhandle here because that // checks for handles passed in in the STARTUPINFO as well as // those inherited as standard handles. HANDLE hStdInHandle = (HANDLE)_get_osfhandle(fileno(stdin)); HANDLE hStdOutHandle = (HANDLE)_get_osfhandle(fileno(stdout)); HANDLE hStdErrHandle = (HANDLE)_get_osfhandle(fileno(stderr)); // Do we have stdin? If we do we need to create a pipe to buffer // the input. if (hStdInHandle != INVALID_HANDLE_VALUE) { // We're using the stdin passed in by the caller. This may well // be a pipe and in order to get reasonable performance we need // to interpose a thread. This is the only way to be able to have // something we can pass to MsgWaitForMultipleObjects, in this case // hInputEvent, which will indicate the input is available. // Duplicate the handle because we're going to close this. if (! DuplicateHandle(GetCurrentProcess(), hStdInHandle, GetCurrentProcess(), &hOldStdin, 0, TRUE, // inheritable DUPLICATE_SAME_ACCESS )) return 1; HANDLE hNewStdin = CreateCopyPipe(hOldStdin, hInputEvent); if (hNewStdin == NULL) return 1; SetConsoleCtrlHandler(CtrlHandler, TRUE); // May fail if there's no console. // Replace the current stdin with the output from the pipe. fclose(stdin); int newstdin = _open_osfhandle ((INT_PTR)hNewStdin, _O_RDONLY | _O_TEXT); if (newstdin != 0) _dup2(newstdin, 0); fdopen(0, "rt"); } else { // No stdin. Open it on NUL. If we actually create our own console // we won't actually use this and instead we'll read from the console. // In that case we won't use stdin but something else might. fclose(stdin); int newstdin = open("NUL", _O_RDONLY); _dup2(newstdin, 0); // Open it for stdio as well. Because the entries in the FILE table // are opened in order we need to do this to ensure that stdout and // stderr point to the correct entries. _fdopen(0, "rt"); hStdInHandle = (HANDLE)_get_osfhandle(newstdin); SetStdHandle(STD_INPUT_HANDLE, hStdInHandle); // If we're not going to create a console because we have a stdout // we need to set this as the original stdin. if (hStdOutHandle != INVALID_HANDLE_VALUE) hOldStdin = hStdInHandle; } // If we don't have a standard output we use our own console. if (hStdOutHandle == INVALID_HANDLE_VALUE) { WNDCLASSEX wndClass; ATOM atClass; // Allocate initial buffer space to maintain the invariants. nBuffLen = 80; pchInputBuffer = (char*)malloc(nBuffLen); if (!CreatePipe(&hReadFromML, &hWriteToScreen, NULL, 0)) { return 1; } HANDLE hTemp; // The pipe handles we have are not inheritable. We have to // make hWriteToScreen an inheritable handle so that // processes we fork using "system" can write to the screen. if (! DuplicateHandle(GetCurrentProcess(), hWriteToScreen, GetCurrentProcess(), &hTemp, 0, TRUE, // inheritable DUPLICATE_SAME_ACCESS )) { return 1; } CloseHandle(hWriteToScreen); hWriteToScreen = hTemp; // Replace the standard Windows handles. SetStdHandle(STD_OUTPUT_HANDLE, hWriteToScreen); // Close the stdio streams. They may have been opened // on dummy handles. fclose(stdout); // Set up the new handles. int newstdout = _open_osfhandle ((INT_PTR)hWriteToScreen, _O_TEXT); // We need this to be stream 1. basicio.cpp uses this for TextIO.stdOut if (newstdout != 1) _dup2(newstdout, 1); // A few RTS modules use stdio for output, primarily objsize and diagnostics. // Previously this next line was sufficient to reopen stdout but that no longer // works in VS 2015. We have to use polyStdout now. extern FILE *polyStdout; polyStdout = _fdopen(1, "wt"); // == stdout if (hStdErrHandle == INVALID_HANDLE_VALUE) { // If we didn't have stderr write any stderr output to our console. SetStdHandle(STD_ERROR_HANDLE, hWriteToScreen); fclose(stderr); _dup2(newstdout, 2); // Stderr extern FILE *polyStderr; polyStderr = _fdopen(2, "wt"); // == stderr // Set stderr to unbuffered so that messages get written correctly. // (stdout is explicitly flushed). setvbuf(stderr, NULL, _IONBF, 0); } // Create a thread to manage the output from ML. HANDLE hInThread = CreateThread(NULL, 0, InThrdProc, 0, 0, &dwInId); if (hInThread == NULL) return 1; CloseHandle(hInThread); wndClass.cbSize = sizeof(wndClass); wndClass.style = 0; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); wndClass.hCursor = NULL; // For the moment wndClass.hbrBackground = NULL; // For the moment wndClass.lpszClassName = _T("PolyMLWindowClass"); wndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wndClass.hIconSm = NULL; // For the moment DWORD dwStyle = WS_OVERLAPPEDWINDOW; if ((atClass = RegisterClassEx(&wndClass)) == 0) { return 1; } // Initially created invisible. hMainWindow = CreateWindow( (LPTSTR)(intptr_t)atClass, _T("Poly/ML"), dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, // handle to menu or child-window identifier hInstance, NULL // pointer to window-creation data ); if (hMainWindow == NULL) { return 1; } // Save this setting and only apply it when we actually // read from or write to the main window. That way if we are // actually using another window this will never get displayed. nInitialShow = nCmdShow; } // We had a stdout but maybe not stderr. We could choose to direct stderr output // to the provided stdout but maybe that's not what the user wants. Instead // we open one on NUL. else if (hStdErrHandle == INVALID_HANDLE_VALUE) { fclose(stderr); int newstderr = open("NUL", _O_WRONLY); _dup2(newstderr, 2); // Stderr _fdopen(2, "wt"); // == stderr SetStdHandle(STD_ERROR_HANDLE, (HANDLE)_get_osfhandle(newstderr)); // Set stderr to unbuffered so that messages get written correctly. // (stdout is explicitly flushed). setvbuf(stderr, NULL, _IONBF, 0); } // Set nArgs and lpArgs to the command line arguments. // Convert the command line into Unix-style arguments. There isn't a // CommandLineToArgvA function so we have to use the Unicode version and // convert the results. { // Get the unicode args LPWSTR *uniArgs = CommandLineToArgvW(GetCommandLineW(), &nArgs); #ifdef UNICODE lpArgs = uniArgs; #else if (uniArgs != NULL) { lpArgs = (LPSTR*)calloc(nArgs, sizeof(LPSTR)); if (lpArgs != 0) { for (int i = 0; i < nArgs; i++) { // See how much space will be needed int space = WideCharToMultiByte(CP_ACP, 0, uniArgs[i], -1, NULL, 0, NULL, NULL); if (space == 0) break; // Failed for some reason // Allocate the space then do the conversion LPSTR buff = (LPSTR)malloc(space); if (buff == 0) break; int result = WideCharToMultiByte(CP_ACP, 0, uniArgs[i], -1, buff, space, NULL, NULL); if (result == 0) { free(buff); break; } lpArgs[i] = buff; } } LocalFree(uniArgs); } #endif } // Create an internal hidden window to handle DDE requests from the ML thread. { WNDCLASSEX wndClass; ATOM atClass; memset(&wndClass, 0, sizeof(wndClass)); wndClass.cbSize = sizeof(wndClass); wndClass.lpfnWndProc = DDEWndProc; wndClass.hInstance = hInstance; wndClass.lpszClassName = _T("PolyMLDDEWindowClass"); if ((atClass = RegisterClassEx(&wndClass)) == 0) return 1; hDDEWindow = CreateWindow( (LPTSTR)(intptr_t)atClass, _T("Poly/ML-DDE"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, // handle to menu or child-window identifier hInstance, NULL // pointer to window-creation data ); } // Call the main program to do the rest of the initialisation. HANDLE hMainThread = CreateThread(NULL, 0, MainThrdProc, exports, 0, &dwInId); // Enter the main message loop. while (MsgWaitForMultipleObjects(1, &hMainThread, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+1) { MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } // Closing this end of the pipe will cause the thread to go away. if (hWriteToScreen != INVALID_HANDLE_VALUE) CloseHandle(hWriteToScreen); if (! GetExitCodeThread(hMainThread, &dwRes)) dwRes = 0; uninitDDEControl(); DestroyWindow(hDDEWindow); DeleteCriticalSection(&csIOInterlock); if (hInputEvent) CloseHandle(hInputEvent); return dwRes; } HDDEDATA CALLBACK DdeCallback(UINT uType, UINT uFmt, HCONV hconv, HSZ hsz1, HSZ hsz2, HDDEDATA hdata, ULONG_PTR dwData1, ULONG_PTR dwData2) { switch (uType) { case XTYP_CONNECT: // Client connecting. For the moment we ignore // the topic. return (HDDEDATA) TRUE; case XTYP_EXECUTE: { // See what the message is. The only ones we // handle are interrupt and terminate. TCHAR buff[256]; buff[0] = 0; DdeGetData(hdata, (LPBYTE)buff, sizeof(buff), 0); if (lstrcmpi(buff, _T(POLYINTERRUPT)) == 0) { RequestConsoleInterrupt(); return (HDDEDATA) DDE_FACK; } if (lstrcmpi(buff, _T(POLYTERMINATE)) == 0) { processes->Exit(0); return (HDDEDATA) DDE_FACK; } return (HDDEDATA) DDE_FNOTPROCESSED; } default: return (HDDEDATA) NULL; } } static int initDDEControl(const TCHAR *lpszName) { // Start the DDE service. This receives remote requests. if (DdeInitialize(&dwDDEInstance, DdeCallback, APPCLASS_STANDARD | CBF_FAIL_ADVISES | CBF_FAIL_POKES | CBF_FAIL_REQUESTS | CBF_SKIP_ALLNOTIFICATIONS, 0) != DMLERR_NO_ERROR) return 0; // If we were given a service name we register that, // otherwise we use the default name. if (lpszName == 0) lpszName = POLYMLSERVICE; HSZ hszServiceName = DdeCreateStringHandle(dwDDEInstance, lpszName, DDECODEPAGE); if (hszServiceName == 0) return 0; DdeNameService(dwDDEInstance, hszServiceName, 0L, DNS_REGISTER); DdeFreeStringHandle(dwDDEInstance, hszServiceName); return 1; } static void uninitDDEControl(void) { // Unregister our name(s). DdeNameService(dwDDEInstance, 0L, 0L, DNS_UNREGISTER); // DdeAbandonTransaction(dwDDEInstance, 0L, 0L); // Unitialise DDE. DdeUninitialize(dwDDEInstance); } // We want copyThread to be static but also a friend of CopyPipe // GCC requires it to be declared static first otherwise it creates it // extern when it sees it as a friend then complains when it's static. static DWORD WINAPI copyThread(LPVOID lpParameter); class CopyPipe { public: CopyPipe(): hOriginal(NULL), hOutput(NULL), hEvent(NULL) {} HANDLE RunPipe(HANDLE hIn, HANDLE hEv); private: ~CopyPipe(); void threadFunction(void); HANDLE hOriginal; HANDLE hOutput; HANDLE hEvent; friend DWORD WINAPI copyThread(LPVOID lpParameter); }; CopyPipe::~CopyPipe() { if (hOutput) CloseHandle(hOutput); if (hOriginal) CloseHandle(hOriginal); if (hEvent) CloseHandle(hEvent); } static DWORD WINAPI copyThread(LPVOID lpParameter) { CopyPipe *cp = (CopyPipe *)lpParameter; cp->threadFunction(); delete cp; return 0; } // This thread is used when the caller has provided a standard input // stream and we're using that and not our console. It copies the // standard input to a pipe and the ML code uses that as its input. // This way we can set hInputEvent whenever input is available. void CopyPipe::threadFunction() { // Duplicate the event handle so that we can close it when we've finished char buffer[4096]; while (true) { DWORD dwRead; if (! ReadFile(hOriginal, buffer, sizeof(buffer), &dwRead, NULL)) { SetEvent(hEvent); return; } if (dwRead == 0) // End-of-stream { // If we are reading from the (Windows) console and the user presses ctrl-C we // may get a ERROR_OPERATION_ABORTED error. if (GetLastError() == ERROR_OPERATION_ABORTED) { SetLastError(0); // Reset this. We may have a normal EOF next. continue; } // Normal exit. Indicate EOF SetEvent(hEvent); return; } SetEvent(hEvent); // Signal input has arrived char *b = buffer; do { DWORD dwWritten; if (! WriteFile(hOutput, b, dwRead, &dwWritten, NULL)) { SetEvent(hEvent); return; } b += dwWritten; dwRead -= dwWritten; } while (dwRead != 0); } } HANDLE CopyPipe::RunPipe(HANDLE hIn, HANDLE hEv) { HANDLE hNewInput = NULL; hOriginal = hIn; if (!CreatePipe(&hNewInput, &hOutput, NULL, 0)) return NULL; if (! DuplicateHandle(GetCurrentProcess(), hEv, GetCurrentProcess(), &hEvent, 0, FALSE, DUPLICATE_SAME_ACCESS)) return NULL; DWORD dwInId; HANDLE hInThread = CreateThread(NULL, 0, copyThread, this, 0, &dwInId); if (hInThread == NULL) return NULL; CloseHandle(hInThread); return hNewInput; } // Create a pipe and a thread to read the input thread and signal the // event when input is available. Returns a handle to a pipe that // supplies a copy of the original input. HANDLE CreateCopyPipe(HANDLE hInput, HANDLE hEvent) { CopyPipe *cp = new CopyPipe(); return cp->RunPipe(hInput, hEvent); } polyml-5.6/libpolyml/Console.h000066400000000000000000000035001265146633400164660ustar00rootroot00000000000000/* Title: Poly/ML Console Window. Copyright (c) 2000, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _CONSOLE_H #define _CONSOLE_H #include /* Test whether input is available. */ extern bool isConsoleInput(void); /* Read characters from the input. Only returns zero on EOF. */ extern unsigned getConsoleInput(char *buff, int nChars); // Create a copying thread that can also signal an event. // This is used both in stdin and also in Windows.execute. extern HANDLE CreateCopyPipe(HANDLE hInput, HANDLE hEvent); extern HWND hMainWindow; /* Handle to main window - NULL if none. */ extern HINSTANCE hApplicationInstance; /* Application instance */ /* DDE requests. */ extern HCONV StartDDEConversation(TCHAR *serviceName, TCHAR *topicName); extern void CloseDDEConversation(HCONV hConv); extern LRESULT ExecuteDDE(char *command, HCONV hConv); extern HANDLE hInputEvent; // Handle to console input event extern HANDLE hOldStdin; // If stdin has been provided // If the original stdin handle was missing we're using our console. #define useConsole (hOldStdin == INVALID_HANDLE_VALUE) extern void SetupDDEHandler(const TCHAR *lpszName); #endif polyml-5.6/libpolyml/Makefile.am000066400000000000000000000061411265146633400167530ustar00rootroot00000000000000AUTOMAKE_OPTIONS=foreign moduledir = @moduledir@ AM_CPPFLAGS = $(CFLAGS) $(OSFLAG) $(GIT_VERSION) -Wall -DMODULEDIR=$(moduledir) AM_CFLAGS = $(CFLAGS) $(OSFLAG) $(GIT_VERSION) -Wall -fno-strict-aliasing AM_ASFLAGS = $(OSFLAG) AM_CCASFLAGS = $(OSFLAG) lib_LTLIBRARIES = libpolyml.la libpolyml_la_LDFLAGS = -version-info 7:0:0 if INTERNAL_LIBFFI libpolyml_la_LIBADD = ../libffi/libffi_convenience.la endif if NO_UNDEFINED # Force all references to be defined to build the DLL. libpolyml_la_LDFLAGS += -no-undefined endif # Select the architecture-specific modules if ARCHI386 ARCHSOURCE = x86_dep.cpp x86asmtemp.S else if ARCHINTERPRET ARCHSOURCE = interpret.cpp else if ARCHINTERPRET64 ARCHSOURCE = interpret.cpp else if ARCHX86_64 ARCHSOURCE = x86_dep.cpp x86asmtemp.S else endif endif endif endif # Select the object-format-specific modules if EXPPECOFF EXPORTSOURCE = pecoffexport.cpp else if EXPELF EXPORTSOURCE = elfexport.cpp else if EXPMACHO EXPORTSOURCE = machoexport.cpp endif endif endif if NATIVE_WINDOWS OSSOURCE = Console.cpp windows_specific.cpp else OSSOURCE = unix_specific.cpp endif noinst_HEADERS = \ arb.h \ basicio.h \ bitmap.h \ check_objects.h \ Console.h \ diagnostics.h \ elfexport.h \ errors.h \ exporter.h \ foreign.h \ gc.h \ gctaskfarm.h \ globals.h \ heapsizing.h \ int_opcodes.h \ io_internal.h \ locking.h \ machine_dep.h \ machoexport.h \ memmgr.h \ mpoly.h \ network.h \ noreturn.h \ objsize.h \ osmem.h \ os_specific.h \ pecoffexport.h \ pexport.h \ PolyControl.h \ poly_specific.h \ polyffi.h \ polystring.h \ process_env.h \ processes.h \ profiling.h \ realconv.h \ reals.h \ rts_module.h \ run_time.h \ savestate.h \ save_vec.h \ scanaddrs.h \ sharedata.h \ sighandler.h \ statistics.h \ sys.h \ timing.h \ version.h \ xcall_numbers.h \ xwindows.h libpolyml_la_SOURCES = \ arb.cpp \ basicio.cpp \ bitmap.cpp \ check_objects.cpp \ diagnostics.cpp \ errors.cpp \ exporter.cpp \ foreign.cpp \ gc.cpp \ gc_check_weak_ref.cpp \ gc_copy_phase.cpp \ gc_mark_phase.cpp \ gc_share_phase.cpp \ gc_update_phase.cpp \ gctaskfarm.cpp \ heapsizing.cpp \ locking.cpp \ memmgr.cpp \ mpoly.cpp \ network.cpp \ objsize.cpp \ osmem.cpp \ pexport.cpp \ poly_specific.cpp \ polyffi.cpp \ polystring.cpp \ process_env.cpp \ processes.cpp \ profiling.cpp \ quick_gc.cpp \ realconv.cpp \ reals.cpp \ rts_module.cpp \ run_time.cpp \ save_vec.cpp \ savestate.cpp \ scanaddrs.cpp \ sharedata.cpp \ sighandler.cpp \ statistics.cpp \ timing.cpp \ xwindows.cpp \ $(ARCHSOURCE) $(EXPORTSOURCE) $(OSSOURCE) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = polyml.pc # Convert the portable format to a native binary polyexport.o: polyimport exportPoly.sml (cd ..; driver/polyimport driver/$(POLYIMPORT) < driver/exportPoly.sml > /dev/null) # Special rule for x86 assembly code. x86asmtemp.S: x86asm.asm sed -f $(srcdir)/masm2gas < x86asm.asm > $@ || { rm -f $@; false; } clean-local: rm -f x86asmtemp.S ppcasmtemp.s polyml-5.6/libpolyml/Makefile.in000066400000000000000000001014231265146633400167630ustar00rootroot00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Force all references to be defined to build the DLL. @NO_UNDEFINED_TRUE@am__append_1 = -no-undefined subdir = libpolyml DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/polyml.pc.in $(top_srcdir)/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = polyml.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" LTLIBRARIES = $(lib_LTLIBRARIES) @INTERNAL_LIBFFI_TRUE@libpolyml_la_DEPENDENCIES = \ @INTERNAL_LIBFFI_TRUE@ ../libffi/libffi_convenience.la am__libpolyml_la_SOURCES_DIST = arb.cpp basicio.cpp bitmap.cpp \ check_objects.cpp diagnostics.cpp errors.cpp exporter.cpp \ foreign.cpp gc.cpp gc_check_weak_ref.cpp gc_copy_phase.cpp \ gc_mark_phase.cpp gc_share_phase.cpp gc_update_phase.cpp \ gctaskfarm.cpp heapsizing.cpp locking.cpp memmgr.cpp mpoly.cpp \ network.cpp objsize.cpp osmem.cpp pexport.cpp \ poly_specific.cpp polyffi.cpp polystring.cpp process_env.cpp \ processes.cpp profiling.cpp quick_gc.cpp realconv.cpp \ reals.cpp rts_module.cpp run_time.cpp save_vec.cpp \ savestate.cpp scanaddrs.cpp sharedata.cpp sighandler.cpp \ statistics.cpp timing.cpp xwindows.cpp x86_dep.cpp \ x86asmtemp.S interpret.cpp machoexport.cpp elfexport.cpp \ pecoffexport.cpp unix_specific.cpp Console.cpp \ windows_specific.cpp @ARCHI386_FALSE@@ARCHINTERPRET64_FALSE@@ARCHINTERPRET_FALSE@@ARCHX86_64_TRUE@am__objects_1 = x86_dep.lo \ @ARCHI386_FALSE@@ARCHINTERPRET64_FALSE@@ARCHINTERPRET_FALSE@@ARCHX86_64_TRUE@ x86asmtemp.lo @ARCHI386_FALSE@@ARCHINTERPRET64_TRUE@@ARCHINTERPRET_FALSE@am__objects_1 = interpret.lo @ARCHI386_FALSE@@ARCHINTERPRET_TRUE@am__objects_1 = interpret.lo @ARCHI386_TRUE@am__objects_1 = x86_dep.lo x86asmtemp.lo @EXPELF_FALSE@@EXPMACHO_TRUE@@EXPPECOFF_FALSE@am__objects_2 = \ @EXPELF_FALSE@@EXPMACHO_TRUE@@EXPPECOFF_FALSE@ machoexport.lo @EXPELF_TRUE@@EXPPECOFF_FALSE@am__objects_2 = elfexport.lo @EXPPECOFF_TRUE@am__objects_2 = pecoffexport.lo @NATIVE_WINDOWS_FALSE@am__objects_3 = unix_specific.lo @NATIVE_WINDOWS_TRUE@am__objects_3 = Console.lo windows_specific.lo am_libpolyml_la_OBJECTS = arb.lo basicio.lo bitmap.lo check_objects.lo \ diagnostics.lo errors.lo exporter.lo foreign.lo gc.lo \ gc_check_weak_ref.lo gc_copy_phase.lo gc_mark_phase.lo \ gc_share_phase.lo gc_update_phase.lo gctaskfarm.lo \ heapsizing.lo locking.lo memmgr.lo mpoly.lo network.lo \ objsize.lo osmem.lo pexport.lo poly_specific.lo polyffi.lo \ polystring.lo process_env.lo processes.lo profiling.lo \ quick_gc.lo realconv.lo reals.lo rts_module.lo run_time.lo \ save_vec.lo savestate.lo scanaddrs.lo sharedata.lo \ sighandler.lo statistics.lo timing.lo xwindows.lo \ $(am__objects_1) $(am__objects_2) $(am__objects_3) libpolyml_la_OBJECTS = $(am_libpolyml_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libpolyml_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libpolyml_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) LTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CCASFLAGS) $(CCASFLAGS) AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) am__v_CPPAS_0 = @echo " CPPAS " $@; am__v_CPPAS_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpolyml_la_SOURCES) DIST_SOURCES = $(am__libpolyml_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFI_CFLAGS = @FFI_CFLAGS@ FFI_LIBS = @FFI_LIBS@ FGREP = @FGREP@ GIT_VERSION = @GIT_VERSION@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OSFLAG = @OSFLAG@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ gitinstalled = @gitinstalled@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ moduledir = @moduledir@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sys_symbol_underscore = @sys_symbol_underscore@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign AM_CPPFLAGS = $(CFLAGS) $(OSFLAG) $(GIT_VERSION) -Wall -DMODULEDIR=$(moduledir) AM_CFLAGS = $(CFLAGS) $(OSFLAG) $(GIT_VERSION) -Wall -fno-strict-aliasing AM_ASFLAGS = $(OSFLAG) AM_CCASFLAGS = $(OSFLAG) lib_LTLIBRARIES = libpolyml.la libpolyml_la_LDFLAGS = -version-info 7:0:0 $(am__append_1) @INTERNAL_LIBFFI_TRUE@libpolyml_la_LIBADD = ../libffi/libffi_convenience.la @ARCHI386_FALSE@@ARCHINTERPRET64_FALSE@@ARCHINTERPRET_FALSE@@ARCHX86_64_TRUE@ARCHSOURCE = x86_dep.cpp x86asmtemp.S @ARCHI386_FALSE@@ARCHINTERPRET64_TRUE@@ARCHINTERPRET_FALSE@ARCHSOURCE = interpret.cpp @ARCHI386_FALSE@@ARCHINTERPRET_TRUE@ARCHSOURCE = interpret.cpp # Select the architecture-specific modules @ARCHI386_TRUE@ARCHSOURCE = x86_dep.cpp x86asmtemp.S @EXPELF_FALSE@@EXPMACHO_TRUE@@EXPPECOFF_FALSE@EXPORTSOURCE = machoexport.cpp @EXPELF_TRUE@@EXPPECOFF_FALSE@EXPORTSOURCE = elfexport.cpp # Select the object-format-specific modules @EXPPECOFF_TRUE@EXPORTSOURCE = pecoffexport.cpp @NATIVE_WINDOWS_FALSE@OSSOURCE = unix_specific.cpp @NATIVE_WINDOWS_TRUE@OSSOURCE = Console.cpp windows_specific.cpp noinst_HEADERS = \ arb.h \ basicio.h \ bitmap.h \ check_objects.h \ Console.h \ diagnostics.h \ elfexport.h \ errors.h \ exporter.h \ foreign.h \ gc.h \ gctaskfarm.h \ globals.h \ heapsizing.h \ int_opcodes.h \ io_internal.h \ locking.h \ machine_dep.h \ machoexport.h \ memmgr.h \ mpoly.h \ network.h \ noreturn.h \ objsize.h \ osmem.h \ os_specific.h \ pecoffexport.h \ pexport.h \ PolyControl.h \ poly_specific.h \ polyffi.h \ polystring.h \ process_env.h \ processes.h \ profiling.h \ realconv.h \ reals.h \ rts_module.h \ run_time.h \ savestate.h \ save_vec.h \ scanaddrs.h \ sharedata.h \ sighandler.h \ statistics.h \ sys.h \ timing.h \ version.h \ xcall_numbers.h \ xwindows.h libpolyml_la_SOURCES = \ arb.cpp \ basicio.cpp \ bitmap.cpp \ check_objects.cpp \ diagnostics.cpp \ errors.cpp \ exporter.cpp \ foreign.cpp \ gc.cpp \ gc_check_weak_ref.cpp \ gc_copy_phase.cpp \ gc_mark_phase.cpp \ gc_share_phase.cpp \ gc_update_phase.cpp \ gctaskfarm.cpp \ heapsizing.cpp \ locking.cpp \ memmgr.cpp \ mpoly.cpp \ network.cpp \ objsize.cpp \ osmem.cpp \ pexport.cpp \ poly_specific.cpp \ polyffi.cpp \ polystring.cpp \ process_env.cpp \ processes.cpp \ profiling.cpp \ quick_gc.cpp \ realconv.cpp \ reals.cpp \ rts_module.cpp \ run_time.cpp \ save_vec.cpp \ savestate.cpp \ scanaddrs.cpp \ sharedata.cpp \ sighandler.cpp \ statistics.cpp \ timing.cpp \ xwindows.cpp \ $(ARCHSOURCE) $(EXPORTSOURCE) $(OSSOURCE) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = polyml.pc all: all-am .SUFFIXES: .SUFFIXES: .S .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libpolyml/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libpolyml/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): polyml.pc: $(top_builddir)/config.status $(srcdir)/polyml.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libpolyml.la: $(libpolyml_la_OBJECTS) $(libpolyml_la_DEPENDENCIES) $(EXTRA_libpolyml_la_DEPENDENCIES) $(AM_V_CXXLD)$(libpolyml_la_LINK) -rpath $(libdir) $(libpolyml_la_OBJECTS) $(libpolyml_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Console.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basicio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_objects.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diagnostics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfexport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exporter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/foreign.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_check_weak_ref.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_copy_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_mark_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_share_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gc_update_phase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gctaskfarm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heapsizing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interpret.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/locking.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machoexport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memmgr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpoly.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objsize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pecoffexport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pexport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poly_specific.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polyffi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/polystring.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process_env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/processes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profiling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quick_gc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realconv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rts_module.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_time.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/save_vec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/savestate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scanaddrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sharedata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sighandler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statistics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unix_specific.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows_specific.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_dep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86asmtemp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xwindows.Plo@am__quote@ .S.o: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< .S.obj: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .S.lo: @am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-local cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-libLTLIBRARIES uninstall-pkgconfigDATA # Convert the portable format to a native binary polyexport.o: polyimport exportPoly.sml (cd ..; driver/polyimport driver/$(POLYIMPORT) < driver/exportPoly.sml > /dev/null) # Special rule for x86 assembly code. x86asmtemp.S: x86asm.asm sed -f $(srcdir)/masm2gas < x86asm.asm > $@ || { rm -f $@; false; } clean-local: rm -f x86asmtemp.S ppcasmtemp.s # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: polyml-5.6/libpolyml/PolyControl.h000066400000000000000000000017711265146633400173600ustar00rootroot00000000000000/* Title: DDE Control Messages Copyright (c) 2000 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _POLYCONTROL_H_ #define _POLYCONTROL_H_ #define POLYTOPIC "PolyML" #define POLYINTERRUPT "[Interrupt]" #define POLYTERMINATE "[Terminate]" #endif polyml-5.6/libpolyml/PolyLib.vcxproj000066400000000000000000000625721265146633400177200ustar00rootroot00000000000000 Debug Win32 IntDebug Win32 IntDebug x64 IntRelease Win32 IntRelease x64 Release Win32 Debug x64 Release x64 {0BA5D5B5-F85B-4C49-8A27-67186FA68922} PolyLib 8.1 DynamicLibrary true v140_xp Unicode DynamicLibrary true v140_xp Unicode DynamicLibrary false v140_xp true Unicode DynamicLibrary false v140_xp true Unicode DynamicLibrary true v140_xp Unicode DynamicLibrary true v140_xp Unicode DynamicLibrary false v140_xp true Unicode DynamicLibrary false v140_xp true Unicode .dll .dll .dll .dll .dll .dll .dll .dll Level3 Disabled true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreadedDebug true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 Disabled true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreadedDebug true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 Disabled true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86_64;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreadedDebug true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 Disabled true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86_64;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreadedDebug true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 MaxSpeed true true true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreaded true true true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 MaxSpeed true true true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreaded true true true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 MaxSpeed true true true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86_64;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreaded true true true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false Level3 MaxSpeed true true true ..;..\libffi\include;..\libffi\msvc32include;..\libffi\src\x86;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;POLYLIB_EXPORTS;HOSTARCHITECTURE_X86_64;LONG_LONG_MAX=_I64_MAX;%(PreprocessorDefinitions) MultiThreaded true true true ws2_32.lib;%(AdditionalDependencies) Windows 6.0 false true false true false true false true false true true true true Document ml64 /nologo /DWINDOWS /DHOSTARCHITECTURE_X86_64 /Fo $(IntDir)%(Filename).obj /c "%(FullPath)" ml64 /nologo /DWINDOWS /DHOSTARCHITECTURE_X86_64 /Fo $(IntDir)%(Filename).obj /c "%(FullPath)" ml64 /nologo /DWINDOWS /DHOSTARCHITECTURE_X86_64 /Fo $(IntDir)%(Filename).obj /c "%(FullPath)" ml64 /nologo /DWINDOWS /DHOSTARCHITECTURE_X86_64 /Fo $(IntDir)%(Filename).obj /c "%(FullPath)" $(IntDir)%(Filename).obj;%(Outputs) $(IntDir)%(Filename).obj;%(Outputs) $(IntDir)%(Filename).obj;%(Outputs) $(IntDir)%(Filename).obj;%(Outputs) ml /nologo /DWINDOWS /Fo $(IntDir)%(Filename).obj /c /coff "%(FullPath)" ml /nologo /DWINDOWS /Fo $(IntDir)%(Filename).obj /c /coff "%(FullPath)" $(IntDir)%(Filename).obj;%(Outputs) $(IntDir)%(Filename).obj;%(Outputs) ml /nologo /DWINDOWS /Fo $(IntDir)%(Filename).obj /c /coff "%(FullPath)" ml /nologo /DWINDOWS /Fo $(IntDir)%(Filename).obj /c /coff "%(FullPath)" $(IntDir)%(Filename).obj;%(Outputs) $(IntDir)%(Filename).obj;%(Outputs) true true true true {6d86bc6f-e74e-40c5-9881-f8bb606bca78} polyml-5.6/libpolyml/arb.cpp000066400000000000000000001550421265146633400161740ustar00rootroot00000000000000/* Title: Arbitrary Precision Package. Author: Dave Matthews, Cambridge University Computer Laboratory Further modification Copyright 2010, 2012, 2015 David C. J. Matthews Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Arbitrary precision package in C. Integers are held in two formats in this system, long-form and short-form. The two are distinquished by the integer tag bit, short-form having the tag bit set and pointers to long-form being untagged. The long-form integers use the standard Poly format for multi-word objects, with the length count and flags in the word just before the object pointed to. The sign of long-form integers is coded in one of the flag bits. Short integers are signed quantities, and can be directly manipulated by the relevant instructions, but if overflow occurs then the full long versions of the operations will need to be called. Long-form integers are held as vectors of bytes (i.e. unsigned char) low-order byte first. It is assumed that a ``byte'' will hold an 8-bit quantity and a ``long'' at least two ``bytes''. It is essential that unsigned values are used. Integers are always stored in the least possible number of words, and will be shortened to the short-form when possible. Thanks are due to D. Knuth for the long division algorithm. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ALLOCA_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_GMP_H #include #define USE_GMP 1 #endif #include "globals.h" #include "sys.h" #include "run_time.h" #include "arb.h" #include "save_vec.h" #include "processes.h" #include "memmgr.h" // Number of bits in a Poly word. N.B. This is not necessarily the same as SIZEOF_VOIDP. #define BITS_PER_POLYWORD (SIZEOF_VOIDP*8) #ifdef USE_GMP #if (BITS_PER_POLYWORD > GMP_LIMB_BITS) // We're assuming that every GMP limb occupies at least one word #error "Size of GMP limb is less than a Poly word" #endif #endif #ifdef USE_GMP #define DEREFLIMBHANDLE(_x) ((mp_limb_t *)DEREFHANDLE(_x)) // Returns the length of the argument with trailing zeros removed. static mp_size_t numLimbs(PolyWord x) { mp_size_t lu = OBJECT_LENGTH(x)*sizeof(PolyWord)/sizeof(mp_limb_t); mp_limb_t *u = (mp_limb_t *)x.AsObjPtr(); while (lu > 0 && u[lu-1] == 0) lu--; return lu; } #else // Returns the length of the argument with trailing zeros removed. static POLYUNSIGNED get_length(PolyWord x) { byte *u = (byte *)x.AsObjPtr(); POLYUNSIGNED lu = OBJECT_LENGTH(x)*sizeof(PolyWord); for( ; (lu > 0) && (u[lu-1] == 0); lu--) { /* do nothing */ } return lu; } #endif // Return a uintptr_t value i.e. unsigned 32-bits on 32-bit architecture and 64-bits on 64-bit architecture. POLYUNSIGNED getPolyUnsigned(TaskData *taskData, PolyWord number) { if ( IS_INT(number) ) { POLYSIGNED i = UNTAGGED(number); if ( i < 0 ) raise_exception0(taskData, EXC_size ); return i; } else { if (OBJ_IS_NEGATIVE(GetLengthWord(number))) raise_exception0(taskData, EXC_size ); #ifdef USE_GMP unsigned length = numLimbs(number); if (length > 1) raise_exception0(taskData, EXC_size); mp_limb_t first = *(mp_limb_t*)number.AsCodePtr(); #if (BITS_PER_POLYWORD < GMP_NUMB_BITS) if (first > (mp_limb_t)1 << BITS_PER_POLYWORD) raise_exception0(taskData, EXC_size); #endif return first; #else byte *ptr = number.AsCodePtr(); POLYUNSIGNED length = get_length(number); if (length > sizeof(PolyWord) ) raise_exception0(taskData, EXC_size); POLYSIGNED c = 0; while ( length-- ) c = (c << 8) | ((byte *) ptr)[length]; return c; #endif } } #define MAX_INT_PLUS1 ((POLYUNSIGNED)0x80 << ( (sizeof(PolyWord)-1) *8)) // Return an intptr_t value i.e. signed 32-bits on 32-bit architecture and 64-bits on 64-bit architecture. POLYSIGNED getPolySigned(TaskData *taskData, PolyWord number) { if ( IS_INT(number) ) { return UNTAGGED(number); } else { int sign = OBJ_IS_NEGATIVE(GetLengthWord(number)) ? -1 : 0; #ifdef USE_GMP unsigned length = numLimbs(number); if (length > 1) raise_exception0(taskData, EXC_size); mp_limb_t c = *(mp_limb_t*)number.AsCodePtr(); #else POLYUNSIGNED length = get_length(number); POLYUNSIGNED c = 0; byte *ptr = number.AsCodePtr(); if ( length > sizeof(PolyWord) ) raise_exception0(taskData, EXC_size ); while ( length-- ) { c = (c << 8) | ptr[length]; } #endif if ( sign == 0 && c < MAX_INT_PLUS1) return (POLYSIGNED)c; if ( sign != 0 && c <= MAX_INT_PLUS1) return -((POLYSIGNED)c); raise_exception0(taskData, EXC_size ); /*NOTREACHED*/ return 0; } } short get_C_short(TaskData *taskData, PolyWord number) { int i = (int)get_C_long(taskData, number); if ( i <= 32767 && i >= -32768 ) return i; raise_exception0(taskData, EXC_size ); /*NOTREACHED*/ return 0; } unsigned short get_C_ushort(TaskData *taskData, PolyWord number) { POLYUNSIGNED u = get_C_ulong(taskData, number ); if ( u <= 65535 ) return (short)u; raise_exception0(taskData, EXC_size ); /*NOTREACHED*/ return 0; } #if (SIZEOF_LONG == SIZEOF_VOIDP) unsigned get_C_unsigned(TaskData *taskData, PolyWord number) { return get_C_ulong(taskData, number); } int get_C_int(TaskData *taskData, PolyWord number) { return get_C_long(taskData, number); } #else // Poly words are the same size as a pointer but that may // not be the same as int or long. unsigned get_C_unsigned(TaskData *taskData, PolyWord number) { POLYUNSIGNED res = get_C_ulong(taskData, number); unsigned result = (unsigned)res; if ((POLYUNSIGNED)result != res) raise_exception0(taskData, EXC_size); return result; } int get_C_int(TaskData *taskData, PolyWord number) { POLYSIGNED res = get_C_long(taskData, number); int result = (int)res; if ((POLYSIGNED)result != res) raise_exception0(taskData, EXC_size); return result; } #endif static Handle get_long(Handle x, Handle extend, int *sign) { if (IS_INT(DEREFWORD(x))) { // Short form - put it in the temporary. POLYSIGNED x_v = UNTAGGED(DEREFWORD(x)); if (x_v >= 0) *sign = 0; else /* Negative */ { *sign = -1; x_v = -x_v; } #ifdef USE_GMP mp_limb_t *u = DEREFLIMBHANDLE(extend); *u = x_v; #else byte *u = DEREFBYTEHANDLE(extend); /* Put into extend buffer, low order byte first. */ for (unsigned i = 0; i < sizeof(PolyWord); i++) { u[i] = x_v & 0xff; x_v = x_v >> 8; } #endif return extend; } else { /* Long-form - x is an address. */ *sign = OBJ_IS_NEGATIVE(GetLengthWord(DEREFWORD(x))) ? -1 : 0; return x; } } #ifndef USE_GMP static Handle copy_long(TaskData *taskData, Handle x, POLYUNSIGNED lx) { Handle y = alloc_and_save(taskData, WORDS(lx), F_BYTE_OBJ|F_MUTABLE_BIT); // copy the bytes byte *v = DEREFBYTEHANDLE(y); memcpy(v, DEREFBYTEHANDLE(x), lx); return y; } #endif /* make_canonical is used to force a result into its shortest form, in the style of get_length, but also may convert its argument from long to short integer */ static Handle make_canonical(TaskData *taskData, Handle x, int sign) { #ifdef USE_GMP unsigned size = numLimbs(DEREFWORD(x)); if (size <= 1) // May be zero if the result is zero. { mp_limb_t r = *DEREFLIMBHANDLE(x); if (r <= MAXTAGGED || (r == MAXTAGGED+1 && sign < 0)) { if (sign < 0) return taskData->saveVec.push(TAGGED(-(POLYSIGNED)r)); else return taskData->saveVec.push(TAGGED(r)); } } // Throw away any unused words. DEREFWORDHANDLE(x)->SetLengthWord(WORDS(size*sizeof(mp_limb_t)), F_BYTE_OBJ | (sign < 0 ? F_NEGATIVE_BIT: 0)); return x; #else /* get length in BYTES */ POLYUNSIGNED size = get_length(DEREFWORD(x)); // We can use the short representation if it will fit in a word. if (size <= sizeof(PolyWord)) { /* Convert the digits. */ byte *u = DEREFBYTEHANDLE(x); POLYUNSIGNED r = 0; for (unsigned i=0; i < sizeof(PolyWord); i++) { r |= ((POLYUNSIGNED)u[i]) << (8*i); } /* Check for MAXTAGGED+1 before subtraction in case MAXTAGGED is 0x7fffffff */ if (r <= MAXTAGGED || (r == MAXTAGGED+1 && sign < 0)) { if (sign < 0) return taskData->saveVec.push(TAGGED(-(POLYSIGNED)r)); else return taskData->saveVec.push(TAGGED(r)); } } /* The length word of the object is changed to reflect the new length. This is safe because any words thrown away must be zero. */ DEREFWORDHANDLE(x)->SetLengthWord(WORDS(size), F_BYTE_OBJ | (sign < 0 ? F_NEGATIVE_BIT: 0)); return x; #endif } Handle ArbitraryPrecionFromSigned(TaskData *taskData, POLYSIGNED val) /* Called from routines in the run-time system to generate an arbitrary precision integer from a word value. */ { if (val <= MAXTAGGED && val >= -MAXTAGGED-1) /* No overflow */ return taskData->saveVec.push(TAGGED(val)); POLYUNSIGNED uval = val < 0 ? -val : val; #ifdef USE_GMP Handle y = alloc_and_save(taskData, WORDS(sizeof(mp_limb_t)), ((val < 0) ? F_NEGATIVE_BIT : 0)| F_BYTE_OBJ); mp_limb_t *v = DEREFLIMBHANDLE(y); *v = uval; #else Handle y = alloc_and_save(taskData, 1, ((val < 0) ? F_NEGATIVE_BIT : 0)| F_BYTE_OBJ); byte *v = DEREFBYTEHANDLE(y); for (POLYUNSIGNED i = 0; uval != 0; i++) { v[i] = (byte)(uval & 0xff); uval >>= 8; } #endif return y; } Handle ArbitraryPrecionFromUnsigned(TaskData *taskData, POLYUNSIGNED uval) /* Called from routines in the run-time system to generate an arbitrary precision integer from an unsigned value. */ { if (uval <= MAXTAGGED) return taskData->saveVec.push(TAGGED(uval)); #ifdef USE_GMP Handle y = alloc_and_save(taskData, WORDS(sizeof(mp_limb_t)), F_BYTE_OBJ); mp_limb_t *v = DEREFLIMBHANDLE(y); *v = uval; #else Handle y = alloc_and_save(taskData, 1, F_BYTE_OBJ); byte *v = DEREFBYTEHANDLE(y); for (POLYUNSIGNED i = 0; uval != 0; i++) { v[i] = (byte)(uval & 0xff); uval >>= 8; } #endif return y; } Handle Make_arbitrary_precision(TaskData *taskData, int val) { return ArbitraryPrecionFromSigned(taskData, val); } Handle Make_arbitrary_precision(TaskData *taskData, unsigned uval) { return ArbitraryPrecionFromUnsigned(taskData, uval); } Handle Make_arbitrary_precision(TaskData *taskData, long val) { return ArbitraryPrecionFromSigned(taskData, val); } Handle Make_arbitrary_precision(TaskData *taskData, unsigned long uval) { return ArbitraryPrecionFromUnsigned(taskData, uval); } #if SIZEOF_LONG_LONG != 0 #if SIZEOF_LONG_LONG <= SIZEOF_VOIDP Handle Make_arbitrary_precision(TaskData *taskData, long long val) { return ArbitraryPrecionFromSigned(taskData, val); } Handle Make_arbitrary_precision(TaskData *taskData, unsigned long long uval) { return ArbitraryPrecionFromUnsigned(taskData, uval); } #else // 32-bit implementation. Handle Make_arbitrary_precision(TaskData *taskData, long long val) { if (val <= (long long)(MAXTAGGED) && val >= -((long long)(MAXTAGGED))-1) /* No overflow */ return taskData->saveVec.push(TAGGED((POLYSIGNED)val)); // Recursive call to handle the high-order part Handle hi = Make_arbitrary_precision(taskData, val >> (sizeof(int32_t) * 8)); // The low-order part is treated as UNsigned. Handle lo = Make_arbitrary_precision(taskData, (uint32_t)val); Handle twoTo16 = taskData->saveVec.push(TAGGED(65536)); Handle twoTo32 = mult_longc(taskData, twoTo16, twoTo16); return add_longc(taskData, mult_longc(taskData, hi, twoTo32), lo); } Handle Make_arbitrary_precision(TaskData *taskData, unsigned long long uval) { if (uval <= (unsigned long long)(MAXTAGGED)) return taskData->saveVec.push(TAGGED((POLYUNSIGNED)uval)); // Recursive call to handle the high-order part Handle hi = Make_arbitrary_precision(taskData, uval >> (sizeof(uint32_t) * 8)); Handle lo = Make_arbitrary_precision(taskData, (uint32_t)uval); Handle twoTo16 = taskData->saveVec.push(TAGGED(65536)); Handle twoTo32 = mult_longc(taskData, twoTo16, twoTo16); return add_longc(taskData, mult_longc(taskData, hi, twoTo32), lo); } #endif #endif #if defined(_WIN32) // Creates an arbitrary precision number from two words. // Used only in Windows for FILETIME and file-size. Handle Make_arb_from_32bit_pair(TaskData *taskData, uint32_t hi, uint32_t lo) { Handle hHi = Make_arbitrary_precision(taskData, hi); Handle hLo = Make_arbitrary_precision(taskData, lo); Handle twoTo16 = taskData->saveVec.push(TAGGED(65536)); Handle twoTo32 = mult_longc(taskData, twoTo16, twoTo16); return add_longc(taskData, mult_longc(taskData, hHi, twoTo32), hLo); } // Convert a Windows FILETIME into an arbitrary precision integer Handle Make_arb_from_Filetime(TaskData *taskData, const FILETIME &ft) { return Make_arb_from_32bit_pair(taskData, ft.dwHighDateTime, ft.dwLowDateTime); } #endif /* Returns hi*scale+lo as an arbitrary precision number. Currently used for Unix time values where the time is returned as two words, a number of seconds and a number of microseconds and we wish to return the result as a number of microseconds. */ Handle Make_arb_from_pair_scaled(TaskData *taskData, unsigned hi, unsigned lo, unsigned scale) { /* We might be able to compute the number as a 64 bit quantity and then convert it but this is probably more portable. It does risk overflowing the save vector. */ Handle hHi = Make_arbitrary_precision(taskData, hi); Handle hLo = Make_arbitrary_precision(taskData, lo); Handle hScale = Make_arbitrary_precision(taskData, scale); return add_longc(taskData, mult_longc(taskData, hHi, hScale), hLo); } Handle neg_longc(TaskData *taskData, Handle x) { if (IS_INT(DEREFWORD(x))) { POLYSIGNED s = UNTAGGED(DEREFWORD(x)); if (s != -MAXTAGGED-1) // If it won't overflow return taskData->saveVec.push(TAGGED(-s)); } // Either overflow or long argument - convert to long form. #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; int sign_x; Handle long_x = get_long(x, x_ehandle, &sign_x); #ifdef USE_GMP POLYUNSIGNED lx = numLimbs(DEREFWORD(long_x))*sizeof(mp_limb_t); #else /* Get length of arg. */ POLYUNSIGNED lx = get_length(DEREFWORD(long_x)); #endif Handle long_y = alloc_and_save(taskData, WORDS(lx), F_MUTABLE_BIT|F_BYTE_OBJ); byte *v = DEREFBYTEHANDLE(long_y); memcpy(v, DEREFBYTEHANDLE(long_x), lx); #ifndef USE_GMP // Make sure the last word is zero. We may have unused bytes there. memset(v+lx, 0, WORDS(lx)*sizeof(PolyWord)-lx); #endif /* Return the value with the sign changed. */ return make_canonical(taskData, long_y, sign_x ^ -1); } /* neg_longc */ #ifdef USE_GMP static Handle add_unsigned_long(TaskData *taskData, Handle x, Handle y, int sign) { /* find the longer number */ mp_size_t lx = numLimbs(DEREFWORD(x)); mp_size_t ly = numLimbs(DEREFWORD(y)); mp_limb_t *u; /* limb-pointer for longer number */ mp_limb_t *v; /* limb-pointer for shorter number */ Handle z; mp_size_t lu; /* length of u in limbs */ mp_size_t lv; /* length of v in limbs */ if (lx < ly) { // Get result vector. It must be 1 limb longer than u // to have space for any carry. z = alloc_and_save(taskData, WORDS((ly+1)*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFLIMBHANDLE(y); lu = ly; v = DEREFLIMBHANDLE(x); lv = lx; } else { // Get result vector. It must be 1 limb longer than u // to have space for any carry. z = alloc_and_save(taskData, WORDS((lx+1)*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFLIMBHANDLE(x); lu = lx; v = DEREFLIMBHANDLE(y); lv = ly; } mp_limb_t *w = DEREFLIMBHANDLE(z); // Do the addition. mp_limb_t carry = 0; if (lv != 0) carry = mpn_add_n(w, u, v, lv); // Add the carry to the rest of the longer number. if (lu != lv) carry = mpn_add_1(w+lv, u+lv, lu-lv, carry); // Put the remaining carry in the final limb. w[lu] = carry; return make_canonical(taskData, z, sign); } #else static Handle add_unsigned_long(TaskData *taskData, Handle x, Handle y, int sign) { byte *u; /* byte-pointer for longer number */ byte *v; /* byte-pointer for shorter number */ Handle z; POLYUNSIGNED lu; /* length of u in bytes */ POLYUNSIGNED lv; /* length of v in bytes */ /* find the longer number */ POLYUNSIGNED lx = get_length(DEREFWORD(x)); POLYUNSIGNED ly = get_length(DEREFWORD(y)); /* Make ``u'' the longer. */ if (lx < ly) { // Get result vector. It must be 1 byte longer than u // to have space for any carry. z = alloc_and_save(taskData, WORDS(ly+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(y); lu = ly; v = DEREFBYTEHANDLE(x); lv = lx; } else { // Get result vector. It must be 1 byte longer than u // to have space for any carry, plus one byte for the sign. z = alloc_and_save(taskData, WORDS(lx+2), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(x); lu = lx; v = DEREFBYTEHANDLE(y); lv = ly; } /* do the actual addition */ byte *w = DEREFBYTEHANDLE(z); unsigned carry = 0; POLYUNSIGNED i = 0; /* Do the additions */ for( ; i < lv; i++) { carry += u[i] + v[i]; w[i] = carry & 0xff; carry >>= 8; } /* Add the carry to the rest of ``u''. */ for( ; i < lu; i++) { carry += u[i]; w[i] = carry & 0xff; carry >>= 8; } /* Finally put the carry into the last byte */ w[i] = (byte)carry; return make_canonical(taskData, z, sign); } /* add_unsigned_long */ #endif #ifdef USE_GMP static Handle sub_unsigned_long(TaskData *taskData, Handle x, Handle y, int sign) { mp_limb_t *u; /* limb-pointer alias for larger number */ mp_limb_t *v; /* limb-pointer alias for smaller number */ mp_size_t lu; /* length of u in limbs */ mp_size_t lv; /* length of v in limbs */ Handle z; /* get the larger argument into ``u'' */ /* This is necessary so that we can discard */ /* the borrow at the end of the subtraction */ mp_size_t lx = numLimbs(DEREFWORD(x)); mp_size_t ly = numLimbs(DEREFWORD(y)); // Find the larger number. Check the lengths first and if they're equal the values. int res; if (lx < ly) res = -1; else if (lx > ly) res = 1; else res = mpn_cmp(DEREFLIMBHANDLE(x), DEREFLIMBHANDLE(y), lx); // If they're equal the result is zero. if (res == 0) return taskData->saveVec.push(TAGGED(0)); /* They are equal */ if (res < 0) { sign ^= -1; /* swap sign of result */ z = alloc_and_save(taskData, WORDS(ly*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFLIMBHANDLE(y); lu = ly; v = DEREFLIMBHANDLE(x); lv = lx; } else { z = alloc_and_save(taskData, WORDS(lx*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFLIMBHANDLE(x); lu = lx; v = DEREFLIMBHANDLE(y); lv = ly; } mp_limb_t *w = DEREFLIMBHANDLE(z); // Do the subtraction. mp_limb_t borrow = 0; if (lv != 0) borrow = mpn_sub_n(w, u, v, lv); // Subtract the borrow from the rest of the longer number. if (lu != lv) borrow = mpn_sub_1(w+lv, u+lv, lu-lv, borrow); return make_canonical(taskData, z, sign); } #else static Handle sub_unsigned_long(TaskData *taskData, Handle x, Handle y, int sign) { byte *u; /* byte-pointer alias for larger number */ byte *v; /* byte-pointer alias for smaller number */ POLYUNSIGNED lu; /* length of u in bytes */ POLYUNSIGNED lv; /* length of v in bytes */ Handle z; /* get the larger argument into ``u'' */ /* This is necessary so that we can discard */ /* the borrow at the end of the subtraction */ POLYUNSIGNED lx = get_length(DEREFWORD(x)); POLYUNSIGNED ly = get_length(DEREFWORD(y)); if (lx < ly) { sign ^= -1; /* swap sign of result SPF 21/1/94 */ z = alloc_and_save(taskData, WORDS(ly+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(y); lu = ly; v = DEREFBYTEHANDLE(x); lv = lx; } else if (ly < lx) { z = alloc_and_save(taskData, WORDS(lx+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(x); lu = lx; v = DEREFBYTEHANDLE(y); lv = ly; } else /* lx == ly */ { /* Must look at the numbers to decide which is bigger. */ POLYUNSIGNED i = lx; while (i > 0 && DEREFBYTEHANDLE(x)[i-1] == DEREFBYTEHANDLE(y)[i-1]) i--; if (i == 0) return taskData->saveVec.push(TAGGED(0)); /* They are equal */ if (DEREFBYTEHANDLE(x)[i-1] < DEREFBYTEHANDLE(y)[i-1]) { sign ^= -1; /* swap sign of result SPF 21/1/94 */ z = alloc_and_save(taskData, WORDS(ly+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(y); lu = ly; v = DEREFBYTEHANDLE(x); lv = lx; } else { z = alloc_and_save(taskData, WORDS(lx+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(x); lu = lx; v = DEREFBYTEHANDLE(y); lv = ly; } } byte *w = DEREFBYTEHANDLE(z); unsigned borrow = 1; /* Becomes 0 if there is a borrow */ POLYUNSIGNED i = 0; /* Do the subtractions */ for( ; i < lv; i++) { borrow += 255 + u[i] - v[i]; w[i] = borrow & 0xff; borrow >>= 8; } /* Add the borrow into the rest of ``u''. */ for( ; i < lu; i++) { borrow += 255 + u[i]; w[i] = borrow & 0xff; borrow >>= 8; } return make_canonical(taskData, z, sign); } /* sub_unsigned_long */ #endif Handle add_longc(TaskData *taskData, Handle y, Handle x) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) { /* Both short */ /* The easiest way to do the addition is simply *x-1+*y, but that makes it more difficult to check for overflow. */ POLYSIGNED t = UNTAGGED(DEREFWORD(x)) + UNTAGGED(DEREFWORD(y)); if (t <= MAXTAGGED && t >= -MAXTAGGED-1) /* No overflow */ { return taskData->saveVec.push(TAGGED(t)); } } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; /* Either overflow or long arguments - convert to long form */ int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); /* Work out whether to add or subtract */ if ((sign_y ^ sign_x) >= 0) /* signs the same? */ /* sign(x) * (abs(x) + abs(y)) */ return add_unsigned_long(taskData, long_x, long_y, sign_x); else /* sign(x) * (abs(x) - abs(y)) */ return sub_unsigned_long(taskData, long_x, long_y, sign_x); } /* add_longc */ Handle sub_longc(TaskData *taskData, Handle y, Handle x) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) /* Both short */ { /* The easiest way to do the subtraction is simply *x-*y+1, but that makes it more difficult to check for overflow. */ POLYSIGNED t = UNTAGGED(DEREFWORD(x)) - UNTAGGED(DEREFWORD(y)); if (t <= MAXTAGGED && t >= -MAXTAGGED-1) /* No overflow */ return taskData->saveVec.push(TAGGED(t)); } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; /* Either overflow or long arguments. */ int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); /* Convert to long form */ Handle long_y = get_long(y, y_ehandle, &sign_y); /* If the signs are different add the two values. */ if ((sign_y ^ sign_x) < 0) /* signs differ */ { /* sign(x) * (abs(x) + abs(y)) */ return add_unsigned_long(taskData, long_x, long_y, sign_x); } else { /* sign(x) * (abs(x) - abs(y)) */ return sub_unsigned_long(taskData, long_x, long_y, sign_x); } } /* sub_longc */ Handle mult_longc(TaskData *taskData, Handle y, Handle x) { #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; /* Either overflow or long arguments. */ int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); /* Convert to long form */ Handle long_y = get_long(y, y_ehandle, &sign_y); #if USE_GMP mp_size_t lx = numLimbs(DEREFWORD(long_x)); mp_size_t ly = numLimbs(DEREFWORD(long_y)); // Check for zero args. if (lx == 0 || ly == 0) return taskData->saveVec.push(TAGGED(0)); Handle z = alloc_and_save(taskData, WORDS((lx+ly)*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); mp_limb_t *w = DEREFLIMBHANDLE(z); mp_limb_t *u = DEREFLIMBHANDLE(long_x), *v = DEREFLIMBHANDLE(long_y); // The first argument must be the longer. if (lx < ly) mpn_mul(w, v, ly, u, lx); else mpn_mul(w, u, lx, v, ly); return make_canonical(taskData, z, sign_x ^ sign_y); #else /* Get lengths of args. */ POLYUNSIGNED lx = get_length(DEREFWORD(long_x)); POLYUNSIGNED ly = get_length(DEREFWORD(long_y)); // Check for zero args. if (lx == 0 || ly == 0) return taskData->saveVec.push(TAGGED(0)); /* Get space for result */ Handle long_z = alloc_and_save(taskData, WORDS(lx+ly+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* Can now load the actual addresses because they will not change now. */ byte *u = DEREFBYTEHANDLE(long_x); byte *v = DEREFBYTEHANDLE(long_y); byte *w = DEREFBYTEHANDLE(long_z); for(POLYUNSIGNED i = 0; i < lx; i++) { POLYUNSIGNED j; long r = 0; /* Set the carry to zero */ for(j = 0; j < ly; j++) { /* Compute the product. */ r += u[i] * v[j]; /* Now add in to the result. */ r += w[i+j]; w[i+j] = r & 0xff; r >>= 8; } /* Put in any carry. */ w[i+j] = (byte)r; } return make_canonical(taskData, long_z, sign_x ^ sign_y); #endif } /* mult_long */ #ifndef USE_GMP static void div_unsigned_long(byte *u, byte *v, byte *remres, byte *divres, POLYUNSIGNED lu, POLYUNSIGNED lv) // Unsigned division. This is the main divide and remainder routine. // remres must be at least lu+1 bytes long // divres must be at least lu-lv+1 bytes long but can be zero if not required { POLYUNSIGNED i,j; long r; /* Find out how far to shift v to get a 1 in the top bit. */ int bits = 0; for(r = v[lv-1]; r < 128; r <<= 1) bits++; /* 128 ??? */ /* Shift u that amount into res. We have allowed enough room for overflow. */ r = 0; for (i = 0; i < lu; i++) { r |= u[i] << bits; /*``Or in'' the new bits after shifting*/ remres[i] = r & 0xff; /* Put into the destination. */ r >>= 8; /* and shift down the carry. */ } remres[i] = (byte)r; /* Put in the carry */ /* And v that amount. It has already been copied. */ if ( bits ) { r = 0; for (i = 0; i < lv; i++) { r |= v[i] << bits; v[i] = r & 0xff; r >>= 8; } /* No carry */ } for(j = lu; j >= lv; j--) { /* j iterates over the higher digits of the dividend until we are left with a number which is less than the divisor. This is the remainder. */ long quotient, dividend, r; dividend = remres[j]*256 + remres[j-1]; quotient = (remres[j] == v[lv-1]) ? 255 : dividend/(long)v[lv-1]; if (lv != 1) { while ((long)v[lv-2]*quotient > (dividend - quotient*(long)v[lv-1])*256 + (long)remres[j-2]) { quotient--; } } /* The quotient is at most 1 too large */ /* Subtract the product of this with ``v'' from ``res''. */ r = 1; /* Initial borrow */ for(i = 0; i < lv; i++) { r += 255 + remres[j-lv+i] - quotient * v[i]; remres[j-lv+i] = r & 0xff; r >>= 8; } r += remres[j]; /* Borrow from leading digit. */ /* If we are left with a borrow when the subtraction is complete the quotient must have been too big. We add ``v'' to the dividend and subtract 1 from the quotient. */ if (r == 0 /* would be 1 if there were no borrow */) { quotient --; r = 0; for (i = 0; i < lv; i++) { r += v[i] + remres[j-lv+i]; remres[j-lv+i] = r & 0xff; r >>= 8; } } /* Place the next digit of quotient in result */ if (divres) divres[j-lv] = (byte)quotient; } /* Likewise the remainder. */ if (bits) { r = 0; j = lv; while (j > 0) { j--; r |= remres[j]; remres[j] = (r >> bits) & 0xff; r = (r & 0xff) << 8; } } } /* div_unsigned_long */ #endif // Common code for div and mod. Returns handles to the results. static void quotRem(TaskData *taskData, Handle y, Handle x, Handle &remHandle, Handle &divHandle) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) /* Both short */ { POLYSIGNED xs = UNTAGGED(DEREFWORD(x)); POLYSIGNED ys = UNTAGGED(DEREFWORD(y)); /* Raise exceptions if dividing by zero. */ if (ys == 0) raise_exception0(taskData, EXC_divide); /* Only possible overflow is minint div -1 */ if (xs != -MAXTAGGED-1 || ys != -1) { divHandle = taskData->saveVec.push(TAGGED(xs / ys)); remHandle = taskData->saveVec.push(TAGGED(xs % ys)); return; } } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); #ifdef USE_GMP /* Get lengths of args. */ mp_size_t lx = numLimbs(DEREFWORD(long_x)); mp_size_t ly = numLimbs(DEREFWORD(long_y)); // If length of v is zero raise divideerror. if (ly == 0) raise_exception0(taskData, EXC_divide); if (lx < ly) { divHandle = taskData->saveVec.push(TAGGED(0)); remHandle = x; /* When x < y remainder is x. */ return; } Handle remRes = alloc_and_save(taskData, WORDS(ly*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); Handle divRes = alloc_and_save(taskData, WORDS((lx-ly+1)*sizeof(mp_limb_t)), F_MUTABLE_BIT|F_BYTE_OBJ); mp_limb_t *u = DEREFLIMBHANDLE(long_x), *v = DEREFLIMBHANDLE(long_y); mp_limb_t *quotient = DEREFLIMBHANDLE(divRes); mp_limb_t *remainder = DEREFLIMBHANDLE(remRes); // Do the division. mpn_tdiv_qr(quotient, remainder, 0, u, lx, v, ly); // Return the results. remHandle = make_canonical(taskData, remRes, sign_x /* Same sign as dividend */); divHandle = make_canonical(taskData, divRes, sign_x ^ sign_y); #else /* Get lengths of args. */ POLYUNSIGNED lx = get_length(DEREFWORD(long_x)); POLYUNSIGNED ly = get_length(DEREFWORD(long_y)); /* If length of y is zero raise divideerror */ if (ly == 0) raise_exception0(taskData, EXC_divide); // If the length of divisor is less than the dividend the quotient is zero. if (lx < ly) { divHandle = taskData->saveVec.push(TAGGED(0)); remHandle = x; /* When x < y remainder is x. */ return; } /* copy in case it needs shifting */ long_y = copy_long(taskData, long_y, ly); Handle divRes = alloc_and_save(taskData, WORDS(lx-ly+1), F_MUTABLE_BIT|F_BYTE_OBJ); Handle remRes = alloc_and_save(taskData, WORDS(lx+1), F_MUTABLE_BIT|F_BYTE_OBJ); div_unsigned_long (DEREFBYTEHANDLE(long_x), DEREFBYTEHANDLE(long_y), DEREFBYTEHANDLE(remRes), DEREFBYTEHANDLE(divRes), lx, ly); /* Clear the rest */ for(POLYUNSIGNED i=ly; i < lx+1; i++) { DEREFBYTEHANDLE(remRes)[i] = 0; } remHandle = make_canonical(taskData, remRes, sign_x /* Same sign as dividend */ ); divHandle = make_canonical(taskData, divRes, sign_x ^ sign_y); #endif } // This returns x divided by y. This always rounds towards zero so // corresponds to Int.quot in ML not Int.div. Handle div_longc(TaskData *taskData, Handle y, Handle x) { Handle remHandle, divHandle; quotRem(taskData, y, x, remHandle, divHandle); return divHandle; } Handle rem_longc(TaskData *taskData, Handle y, Handle x) { Handle remHandle, divHandle; quotRem(taskData, y, x, remHandle, divHandle); return remHandle; } // Return quot and rem as a pair. Handle quot_rem_c(TaskData *taskData, Handle result, Handle y, Handle x) { // The result handle will almost certainly point into the stack. // This should now be safe within the GC. Handle remHandle, divHandle; quotRem(taskData, y, x, remHandle, divHandle); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(divHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(remHandle)); return taskData->saveVec.push(TAGGED(0)); } #if defined(_WIN32) // Return a FILETIME from an arbitrary precision number. On both 32-bit and 64-bit Windows // this is a pair of 32-bit values. void getFileTimeFromArb(TaskData *taskData, Handle numHandle, PFILETIME ft) { Handle twoTo16 = taskData->saveVec.push(TAGGED(65536)); Handle twoTo32 = mult_longc(taskData, twoTo16, twoTo16); Handle highPart, lowPart; quotRem(taskData, twoTo32, numHandle, lowPart, highPart); ft->dwLowDateTime = get_C_unsigned(taskData, lowPart->Word()); ft->dwHighDateTime = get_C_unsigned(taskData, highPart->Word()); } #endif /* compare_unsigned is passed LONG integers only */ static int compare_unsigned(Handle x, Handle y) { #ifdef USE_GMP mp_size_t lx = numLimbs(DEREFWORD(x)); mp_size_t ly = numLimbs(DEREFWORD(y)); if (lx != ly) /* u > v if u longer than v */ { return (lx > ly ? 1 : -1); } return mpn_cmp(DEREFLIMBHANDLE(x), DEREFLIMBHANDLE(y), lx); #else /* First look at the lengths */ POLYUNSIGNED lx = get_length(DEREFWORD(x)); POLYUNSIGNED ly = get_length(DEREFWORD(y)); if (lx != ly) /* u > v if u longer than v */ { return (lx > ly ? 1 : -1); } // Same length - look at the values. */ byte *u = DEREFBYTEHANDLE(x); byte *v = DEREFBYTEHANDLE(y); POLYUNSIGNED i = lx; while (i > 0) { i--; if (u[i] != v[i]) { return u[i] > v[i] ? 1 : -1; } } /* Must be equal */ return 0; #endif } int compareLong(TaskData *taskData, Handle y, Handle x) { // Test if the values are bitwise equal. If either is short // this is the only case where the values could be equal. if (DEREFWORD(x) == DEREFWORD(y)) // Equal return 0; if (IS_INT(DEREFWORD(x))) { // x is short. if (IS_INT(DEREFWORD(y))) { // Both short. We've already tested for equality. if (UNTAGGED(DEREFWORD(x)) < UNTAGGED(DEREFWORD(y))) return -1; // Less else return 1; // Greater } // y is not short. Just test the sign. If it's negative // it must be less than any short value and if it's positive // it must be greater. if (OBJ_IS_NEGATIVE(GetLengthWord(DEREFWORD(y)))) return 1; // x is greater else return -1; // x is less } // x is not short if (IS_INT(DEREFWORD(y))) { // y is short. Just test the sign of x if (OBJ_IS_NEGATIVE(GetLengthWord(DEREFWORD(x)))) return -1; // x is less else return 1; // x is greater } /* Convert to long form */ #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); /* Convert to long form */ Handle long_y = get_long(y, y_ehandle, &sign_y); if (sign_x >= 0) /* x is positive */ { if (sign_y >= 0) /* y also positive */ { return compare_unsigned(long_x, long_y); } else /* y negative so x > y */ { return 1; } } else { /* x is negative */ if (sign_y < 0) /* y also negative */ { return compare_unsigned(long_y, long_x); } else /* y positive so x < y */ { return -1; } } } /* compareLong */ /* logical_long. General purpose function for binary logical operations. */ static Handle logical_long(TaskData *taskData, Handle x, Handle y, int signX, int signY, unsigned(*op)(unsigned, unsigned)) { byte *u; /* byte-pointer for longer number */ byte *v; /* byte-pointer for shorter number */ Handle z; int sign, signU, signV; POLYUNSIGNED lu; /* length of u in bytes */ POLYUNSIGNED lv; /* length of v in bytes */ { /* find the longer number */ #ifdef USE_GMP POLYUNSIGNED lx = numLimbs(DEREFWORD(x)) * sizeof(mp_limb_t); POLYUNSIGNED ly = numLimbs(DEREFWORD(y)) * sizeof(mp_limb_t); #else POLYUNSIGNED lx = get_length(DEREFWORD(x)); POLYUNSIGNED ly = get_length(DEREFWORD(y)); #endif /* Make ``u'' the longer. */ if (lx < ly) { // Get result vector. There can't be any carry at the end so // we just need to make this as large as the larger number. z = alloc_and_save(taskData, WORDS(ly), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(y); lu = ly; v = DEREFBYTEHANDLE(x); lv = lx; signU = signY; signV = signX; } else { /* Get result vector. */ z = alloc_and_save(taskData, WORDS(lx+1), F_MUTABLE_BIT|F_BYTE_OBJ); /* now safe to dereference pointers */ u = DEREFBYTEHANDLE(x); lu = lx; v = DEREFBYTEHANDLE(y); lv = ly; signU = signX; signV = signY; } } sign = (*op)(signU, signV); /* -1 if negative, 0 if positive. */ { /* do the actual operations */ byte *w = DEREFBYTEHANDLE(z); int borrowU = 1, borrowV = 1, borrowW = 1; POLYUNSIGNED i = 0; /* Do the operations. */ for( ; i < lv; i++) { int wI; /* Have to convert negative values to twos complement. */ if (signU) borrowU += 255 - u[i]; else borrowU = u[i]; if (signV) borrowV += 255 - v[i]; else borrowV = v[i]; wI = (*op)(borrowU, borrowV) & 255; if (sign) { /* Have to convert the result back to twos complement. */ borrowW += 255 - wI; w[i] = borrowW & 255; borrowW >>= 8; } else w[i] = wI; borrowU >>= 8; borrowV >>= 8; } /* At this point the borrow of V should be zero. */ ASSERT(signV == 0 || borrowV == 0); /* Continue with ``u''. */ for( ; i < lu; i++) { int wI; if (signU) borrowU += 255 - u[i]; else borrowU = u[i]; if (signV) borrowV = 255; else borrowV = 0; wI = (*op)(borrowU, borrowV) & 255; if (sign) { /* Have to convert the result back to twos complement. */ borrowW += 255 - wI; w[i] = borrowW & 255; borrowW >>= 8; } else w[i] = wI; borrowU >>= 8; borrowV >>= 8; } /* We should now no longer have any borrows. */ ASSERT(signU == 0 || borrowU == 0); ASSERT(sign == 0 || borrowW == 0); } return make_canonical(taskData, z, sign); } /* logical_long */ static unsigned doAnd(unsigned i, unsigned j) { return i & j; } static unsigned doOr(unsigned i, unsigned j) { return i | j; } static unsigned doXor(unsigned i, unsigned j) { return i ^ j; } Handle and_longc(TaskData *taskData, Handle y, Handle x) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) /* Both short */ { /* There's no problem with overflow so we can just AND together the values. */ POLYSIGNED t = UNTAGGED(DEREFWORD(x)) & UNTAGGED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(t)); } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; // Convert to long form. int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); return logical_long(taskData, long_x, long_y, sign_x, sign_y, doAnd); } Handle or_longc(TaskData *taskData, Handle y, Handle x) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) /* Both short */ { /* There's no problem with overflow so we can just OR together the values. */ POLYSIGNED t = UNTAGGED(DEREFWORD(x)) | UNTAGGED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(t)); } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; // Convert to long form. int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); return logical_long(taskData, long_x, long_y, sign_x, sign_y, doOr); } Handle xor_longc(TaskData *taskData, Handle y, Handle x) { if (IS_INT(DEREFWORD(x)) && IS_INT(DEREFWORD(y))) /* Both short */ { /* There's no problem with overflow so we can just XOR together the values. */ POLYSIGNED t = UNTAGGED(DEREFWORD(x)) ^ UNTAGGED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(t)); } #if USE_GMP PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; #else PolyWord x_extend[2], y_extend[2]; #endif SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; // Convert to long form. int sign_x, sign_y; Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); return logical_long(taskData, long_x, long_y, sign_x, sign_y, doXor); } // Convert a long precision value to floating point double get_C_real(TaskData *, PolyWord x) { if (IS_INT(x)) { POLYSIGNED t = UNTAGGED(x); return (double)t; } byte *u = (byte *)(x.AsObjPtr()); POLYUNSIGNED lx = OBJECT_LENGTH(x)*sizeof(PolyWord); double acc = 0; for( ; lx > 0; lx--) { acc = acc * 256 + (double)u[lx-1]; } if (OBJ_IS_NEGATIVE(GetLengthWord(x))) return -acc; else return acc; } /* These functions are used primarily during porting. They handle both short and long forms of integers and are generally superseded by hand coded assembly code versions and the code generator. Some of them are retained in some code-generators to handle the long forms of integers. */ Handle equal_longc(TaskData *taskData, Handle y, Handle x) /* Returns 1 if the arguments are equal, otherwise 0. */ { bool c = compareLong(taskData, y, x) == 0; return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } Handle not_equal_longc(TaskData *taskData, Handle y, Handle x) { bool c = compareLong(taskData, y, x) != 0; return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } Handle gt_longc(TaskData *taskData, Handle y, Handle x) { bool c = (compareLong(taskData, y, x) == 1); return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } Handle ls_longc(TaskData *taskData, Handle y, Handle x) { bool c = (compareLong(taskData, y, x) == -1); return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } Handle ge_longc(TaskData *taskData, Handle y, Handle x) { bool c = compareLong(taskData, y, x) != -1; return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } Handle le_longc(TaskData *taskData, Handle y, Handle x) { bool c = compareLong(taskData, y, x) != 1; return taskData->saveVec.push(c ? TAGGED(1) : TAGGED(0)); } /* Return the low-order bits of an integer whether it is long or short form. */ Handle int_to_word_c(TaskData *taskData, Handle x) { /* If it's already short it's easy. */ if (IS_INT(DEREFWORD(x))) return x; #ifdef USE_GMP // It may be big- or little-endian. POLYUNSIGNED r = (POLYUNSIGNED)*DEREFLIMBHANDLE(x); #else // Little-endian. byte *u = DEREFBYTEHANDLE(x); POLYUNSIGNED r = 0; for (unsigned i=0; i < sizeof(PolyWord); i++) { r |= (POLYUNSIGNED)u[i] << (8*i); } #endif if (OBJ_IS_NEGATIVE(x->Word().AsObjPtr()->LengthWord())) r = 0-r; // Use 0-r rather than -r since it's an unsigned value. return taskData->saveVec.push(TAGGED(r)); } /* Arbitrary precision GCD function. This is really included to make use of GMP's GCD function that selects an algorithm based on the length of the arguments. */ #ifdef USE_GMP Handle gcd_arbitrary(TaskData *taskData, Handle x, Handle y) { /* mpn_gcd requires that each argument is odd and its first argument must be no longer than its second. This requires shifting before the call and after the result has been returned. This code is modelled roughly on the high level mpz_gcd call in GMP. */ PolyWord x_extend[1+WORDS(sizeof(mp_limb_t))]; PolyWord y_extend[1+WORDS(sizeof(mp_limb_t))]; SaveVecEntry x_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(x_extend[1]))); Handle x_ehandle = &x_extend_addr; SaveVecEntry y_extend_addr = SaveVecEntry(PolyWord::FromStackAddr(&(y_extend[1]))); Handle y_ehandle = &y_extend_addr; int sign_x, sign_y; // Signs are ignored - the result is always positive. Handle long_x = get_long(x, x_ehandle, &sign_x); Handle long_y = get_long(y, y_ehandle, &sign_y); mp_size_t lx = numLimbs(DEREFWORD(long_x)); mp_size_t ly = numLimbs(DEREFWORD(long_y)); // Test for zero length and therefore zero argument if (lx == 0) { // GCD(0,y) = abs(y) if (sign_y) return neg_longc(taskData, y); else return y; } if (ly == 0) { // GCD(x,0 = abs(x) if (sign_x) return neg_longc(taskData, x); else return x; } // If one of the arguments is a single limb we can use the special case. // This doesn't require shifting. It also doesn't say that it could // overwrite the arguments. if (lx == 1 || ly == 1) { mp_limb_t g = (lx == 1) ? mpn_gcd_1(DEREFLIMBHANDLE(long_y), ly, *DEREFLIMBHANDLE(long_x)) : mpn_gcd_1(DEREFLIMBHANDLE(long_x), lx, *DEREFLIMBHANDLE(long_y)); if (g <= MAXTAGGED) return taskData->saveVec.push(TAGGED(g)); // Need to allocate space. Handle r = alloc_and_save(taskData, WORDS(sizeof(mp_limb_t)), F_BYTE_OBJ); *(DEREFLIMBHANDLE(r)) = g; return r; } // Memory for result. This can be up to the shorter of the two. // We rely on this zero the memory because we may not set every word here. Handle r = alloc_and_save(taskData, WORDS((lx < ly ? lx : ly)*sizeof(mp_limb_t)), F_BYTE_OBJ|F_MUTABLE_BIT); // Can now dereference the handles. mp_limb_t *xl = DEREFLIMBHANDLE(long_x); mp_limb_t *yl = DEREFLIMBHANDLE(long_y); mp_limb_t *rl = DEREFLIMBHANDLE(r); unsigned xZeroLimbs = 0, xZeroBits = 0; // Remove whole limbs of zeros. There must be a word which is non-zero. while (*xl == 0) { xl++; xZeroLimbs++; lx--; } // Count the low-order bits and shift by that amount. mp_limb_t t = *xl; while ((t & 1) == 0) { t = t >> 1; xZeroBits++; } // Copy the non-zero limbs into a temporary, shifting if necessary. mp_limb_t *xC = (mp_limb_t*)alloca(lx * sizeof(mp_limb_t)); if (xZeroBits != 0) { mpn_rshift(xC, xl, lx, xZeroBits); if (xC[lx-1] == 0) lx--; } else memcpy(xC, xl, lx * sizeof(mp_limb_t)); unsigned yZeroLimbs = 0, yZeroBits = 0; while (*yl == 0) { yl++; yZeroLimbs++; ly--; } t = *yl; while ((t & 1) == 0) { t = t >> 1; yZeroBits++; } mp_limb_t *yC = (mp_limb_t*)alloca(ly * sizeof(mp_limb_t)); if (yZeroBits != 0) { mpn_rshift(yC, yl, ly, yZeroBits); if (yC[ly-1] == 0) ly--; } else memcpy(yC, yl, ly * sizeof(mp_limb_t)); // The result length and shift is the smaller of these unsigned rZeroLimbs, rZeroBits; if (xZeroLimbs < yZeroLimbs || (xZeroLimbs == yZeroLimbs && xZeroBits < yZeroBits)) { rZeroLimbs = xZeroLimbs; rZeroBits = xZeroBits; } else { rZeroLimbs = yZeroLimbs; rZeroBits = yZeroBits; } // Now actually compute the GCD if (lx < ly || (lx == ly && xC[lx-1] < yC[ly-1])) lx = mpn_gcd(xC, yC, ly, xC, lx); else lx = mpn_gcd(xC, xC, lx, yC, ly); // Shift the temporary result into the final area. if (rZeroBits != 0) { t = mpn_lshift(rl+rZeroLimbs, xC, lx, rZeroBits); if (t != 0) rl[rZeroLimbs+lx] = t; } else memcpy(rl+rZeroLimbs, xC, lx * sizeof(mp_limb_t)); return make_canonical(taskData, r, false); } #else // Fallback version for when GMP is not defined. static Handle gxd(TaskData *taskData, Handle x, Handle y) { Handle marker = taskData->saveVec.mark(); while (1) { if (DEREFWORD(y) == TAGGED(0)) return x; Handle res = rem_longc(taskData, y, x); PolyWord newY = res->Word(); PolyWord newX = y->Word(); taskData->saveVec.reset(marker); y = taskData->saveVec.push(newY); x = taskData->saveVec.push(newX); } } static Handle absValue(TaskData *taskData, Handle x) { if (IS_INT(DEREFWORD(x))) { if (UNTAGGED(DEREFWORD(x)) < 0) return neg_longc(taskData, x); } else if (OBJ_IS_NEGATIVE(GetLengthWord(DEREFWORD(x)))) return neg_longc(taskData, x); return x; } Handle gcd_arbitrary(TaskData *taskData, Handle x, Handle y) { x = absValue(taskData, x); y = absValue(taskData, y); if (compareLong(taskData, y, x) < 0) return gxd(taskData, y, x); else return gxd(taskData, x, y); } #endif // This is provided as an adjunct to GCD. Using this saves the RTS // calls necessary for the division and multiplication. Handle lcm_arbitrary(TaskData *taskData, Handle x, Handle y) { Handle g = gcd_arbitrary(taskData, x, y); return mult_longc(taskData, x, div_longc(taskData, g, y)); } polyml-5.6/libpolyml/arb.h000066400000000000000000000073341265146633400156410ustar00rootroot00000000000000/* Title: arb.h - exports signature for arb.c Copyright (c) 2000 Cambridge University Technical Services Limited Further modification Copyright 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ARB_H_INCLUDED #define ARB_H_INCLUDED class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; // These functions create values of type int from signed or unsigned values. extern Handle Make_arbitrary_precision(TaskData *taskData, long); extern Handle Make_arbitrary_precision(TaskData *taskData, unsigned long); extern Handle Make_arbitrary_precision(TaskData *taskData, int); extern Handle Make_arbitrary_precision(TaskData *taskData, unsigned); #if SIZEOF_LONG_LONG != 0 extern Handle Make_arbitrary_precision(TaskData *taskData, long long); extern Handle Make_arbitrary_precision(TaskData *taskData, unsigned long long); #endif extern Handle Make_arb_from_32bit_pair(TaskData *taskData, uint32_t hi, uint32_t lo); extern Handle Make_arb_from_pair_scaled(TaskData *taskData, unsigned hi, unsigned lo, unsigned scale); #if defined(_WIN32) extern Handle Make_arb_from_Filetime(TaskData *taskData, const FILETIME &ft); #endif extern Handle add_longc(TaskData *taskData, Handle,Handle); extern Handle sub_longc(TaskData *taskData, Handle,Handle); extern Handle mult_longc(TaskData *taskData, Handle,Handle); extern Handle div_longc(TaskData *taskData, Handle,Handle); extern Handle rem_longc(TaskData *taskData, Handle,Handle); extern Handle quot_rem_c(TaskData *taskData, Handle,Handle,Handle); extern Handle or_longc(TaskData *taskData, Handle,Handle); extern Handle and_longc(TaskData *taskData, Handle,Handle); extern Handle xor_longc(TaskData *taskData, Handle,Handle); extern Handle neg_longc(TaskData *taskData, Handle); extern Handle equal_longc(TaskData *taskData, Handle y, Handle x); extern Handle not_equal_longc(TaskData *taskData, Handle y, Handle x); extern Handle gt_longc(TaskData *taskData, Handle y, Handle x); extern Handle ls_longc(TaskData *taskData, Handle y, Handle x); extern Handle ge_longc(TaskData *taskData, Handle y, Handle x); extern Handle le_longc(TaskData *taskData, Handle y, Handle x); extern Handle int_to_word_c(TaskData *taskData, Handle x); extern Handle gcd_arbitrary(TaskData *taskData, Handle,Handle); extern Handle lcm_arbitrary(TaskData *taskData, Handle,Handle); extern int compareLong(TaskData *taskData, Handle,Handle); // Return a uintptr_t/intptr_t value. extern POLYUNSIGNED getPolyUnsigned(TaskData *taskData, PolyWord); extern POLYSIGNED getPolySigned(TaskData *taskData, PolyWord); #define get_C_ulong getPolyUnsigned extern unsigned short get_C_ushort(TaskData *taskData, PolyWord); extern unsigned get_C_unsigned(TaskData *taskData, PolyWord); #define get_C_long getPolySigned extern short get_C_short(TaskData *taskData, PolyWord); extern int get_C_int(TaskData *taskData, PolyWord); extern double get_C_real(TaskData *taskData, PolyWord x); #if defined(_WIN32) void getFileTimeFromArb(TaskData *taskData, Handle numHandle, PFILETIME ft); #endif #endif polyml-5.6/libpolyml/basicio.cpp000066400000000000000000002217671265146633400170510ustar00rootroot00000000000000/* Title: Basic IO. Copyright (c) 2000, 2015 David C. J. Matthews Portions of this code are derived from the original stream io package copyright CUTS 1983-2000. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This module replaces the old stream IO based on stdio. It works at a lower level with the buffering being done in ML. Sockets are generally dealt with in network.c but it is convenient to use the same table for them particularly since it simplifies the implementation of "poll". Directory operations are also included in here. DCJM May 2000. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_ALLOCA_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_POLL_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_DIRECT_H #include #endif #ifdef HAVE_STDIO_H #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #include #else typedef char TCHAR; #define _T(x) x #define lstrcat strcat #define _topen open #define _tmktemp mktemp #define _tcsdup strdup #endif #if(!defined(MAXPATHLEN) && defined(MAX_PATH)) #define MAXPATHLEN MAX_PATH #endif #ifndef O_BINARY #define O_BINARY 0 /* Not relevant. */ #endif #ifndef INFTIM #define INFTIM (-1) #endif #include "globals.h" #include "basicio.h" #include "sys.h" #include "gc.h" #include "run_time.h" #include "machine_dep.h" #include "arb.h" #include "processes.h" #include "diagnostics.h" #include "io_internal.h" #include "scanaddrs.h" #include "polystring.h" #include "mpoly.h" #include "save_vec.h" #include "rts_module.h" #include "locking.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include "Console.h" #endif #ifndef O_ACCMODE #define O_ACCMODE (O_RDONLY|O_RDWR|O_WRONLY) #endif #define STREAMID(x) (DEREFSTREAMHANDLE(x)->streamNo) #define SAVE(x) taskData->saveVec.push(x) #ifdef _MSC_VER // Don't tell me about ISO C++ changes. #pragma warning(disable:4996) #endif /* Points to tokens which represent the streams and the stream itself. For each stream a single word token is made containing the file number, and its address is put in here. When the stream is closed the entry is overwritten. Any further activity will be trapped because the address in the vector will not be the same as the address of the token. This also prevents streams other than stdin and stdout from being made persistent. stdin, stdout and stderr are treated specially. The tokens for them are entries in the interface vector and so can be made persistent. */ /* I've tried various ways of getting asynchronous IO to work in a consistent manner across different kinds of IO devices in Windows. It is possible to pass some kinds of handles to WaitForMultipleObjects but not all. Anonymous pipes, for example, cannot be used in Windows 95 and don't seem to do what is expected in Windows NT (they return signalled even when there is no input). The console is even more of a mess. The handle is signalled when there are any events (such as mouse movements) available but these are ignored by ReadFile, which may then block. Conversely using ReadFile to read less than a line causes the handle to be unsignalled, supposedly meaning that no input is available, yet ReadFile will return subsequent characters without blocking. The eventual solution was to replace the console completely. DCJM May 2000 */ PIOSTRUCT basic_io_vector; PLock ioLock; // Currently this just protects against two threads using the same entry #if (defined(_WIN32) && ! defined(__CYGWIN__)) class WaitStream: public WaitHandle { public: WaitStream(PIOSTRUCT strm): WaitHandle(strm == NULL ? NULL : strm->hAvailable) {} }; #else class WaitStream: public WaitInputFD { public: WaitStream(PIOSTRUCT strm): WaitInputFD(strm == NULL ? -1 : strm->device.ioDesc) {} }; #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Deal with the various cases to see if input is available. */ static bool isAvailable(TaskData *taskData, PIOSTRUCT strm) { HANDLE hFile = (HANDLE)_get_osfhandle(strm->device.ioDesc); if (isPipe(strm)) { DWORD dwAvail; int err; if (PeekNamedPipe(hFile, NULL, 0, NULL, &dwAvail, NULL)) return dwAvail != 0; err = GetLastError(); /* Windows returns ERROR_BROKEN_PIPE on input whereas Unix only returns it on output and treats it as EOF. We follow Unix here. */ if (err == ERROR_BROKEN_PIPE) return true; /* At EOF - will not block. */ else raiseSyscallError(taskData, -err); /*NOTREACHED*/ } else if (isConsole(strm)) return isConsoleInput(); else if (isDevice(strm)) return WaitForSingleObject(hFile, 0) == WAIT_OBJECT_0; else /* File - We may be at end-of-file but we won't block. */ return true; } #else static bool isAvailable(TaskData *taskData, PIOSTRUCT strm) { #ifdef __CYGWIN__ static struct timeval poll = {0,1}; #else static struct timeval poll = {0,0}; #endif fd_set read_fds; int selRes; FD_ZERO(&read_fds); FD_SET((int)strm->device.ioDesc, &read_fds); /* If there is something there we can return. */ selRes = select(FD_SETSIZE, &read_fds, NULL, NULL, &poll); if (selRes > 0) return true; /* Something waiting. */ else if (selRes < 0 && errno != EINTR) // Maybe another thread closed descr raiseSyscallError(taskData, errno); else return false; } #endif static unsigned max_streams; /* If we try opening a stream and it fails with EMFILE (too many files open) we may be able to recover by garbage-collecting and closing some unreferenced streams. This flag is set to indicate that we have had an EMFILE error and is cleared whenever a file is closed or opened successfully. It prevents infinite looping if we really have too many files. */ bool emfileFlag = false; /* Close a stream, either explicitly or as a result of detecting an unreferenced stream in the g.c. Doesn't report any errors. */ void close_stream(PIOSTRUCT str) { if (!isOpen(str)) return; if (isDirectory(str)) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FindClose(str->device.directory.hFind); #else closedir(str->device.ioDir); #endif } #if (defined(_WIN32) && ! defined(__CYGWIN__)) else if (isSocket(str)) { closesocket(str->device.sock); } else if (isConsole(str)) return; #endif else close(str->device.ioDesc); str->ioBits = 0; str->token = 0; emfileFlag = false; #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (str->hAvailable) CloseHandle(str->hAvailable); str->hAvailable = NULL; #endif } /******************************************************************************/ /* */ /* get_stream - utility function - doesn't allocate */ /* */ /******************************************************************************/ PIOSTRUCT get_stream(PolyObject *stream_token) /* Checks that the stream number is valid and returns the actual stream. Returns NULL if the stream is closed. */ { POLYUNSIGNED stream_no = ((StreamToken*)stream_token)->streamNo; if (stream_no >= max_streams || basic_io_vector[stream_no].token != stream_token || ! isOpen(&basic_io_vector[stream_no])) return 0; /* Closed. */ return &basic_io_vector[stream_no]; } /******************************************************************************/ /* */ /* make_stream_entry - utility function - allocates in Poly heap */ /* */ /******************************************************************************/ Handle make_stream_entry(TaskData *taskData) /* Find a free entry in the stream vector and return a token for it. The address of the token is preserved on the save vector so it will not be deleted if there is a garbage collection (Entries in the stream vector itself are "weak". */ { unsigned stream_no; ioLock.Lock(); // Find an unused entry. for(stream_no = 0; stream_no < max_streams && basic_io_vector[stream_no].token != 0; stream_no++); /* Check we have enough space. */ if (stream_no >= max_streams) { /* No space. */ int oldMax = max_streams; max_streams += max_streams/2; basic_io_vector = (PIOSTRUCT)realloc(basic_io_vector, max_streams*sizeof(IOSTRUCT)); /* Clear the new space. */ memset(basic_io_vector+oldMax, 0, (max_streams-oldMax)*sizeof(IOSTRUCT)); } // Create the token. This must be mutable not because it will be updated but // because we will use pointer-equality on it and the GC does not guarantee to // preserve pointer-equality for immutables. Handle str_token = alloc_and_save(taskData, (sizeof(StreamToken) + sizeof(PolyWord) - 1)/sizeof(PolyWord), F_BYTE_OBJ|F_MUTABLE_BIT); STREAMID(str_token) = stream_no; ASSERT(!isOpen(&basic_io_vector[stream_no])); /* Clear the entry then set the token. */ memset(&basic_io_vector[stream_no], 0, sizeof(IOSTRUCT)); basic_io_vector[stream_no].token = DEREFWORDHANDLE(str_token); ioLock.Unlock(); return str_token; } /******************************************************************************/ /* */ /* free_stream_entry - utility function */ /* */ /******************************************************************************/ /* Free an entry in the stream vector - used when openstreamc grabs a stream vector entry, but then fails to open the associated file. (This happens frequently when we are using the Poly make system.) If we don't recycle the stream vector entries immediately we quickly run out and must perform a full garbage collection to recover the unused ones. SPF 12/9/95 */ void free_stream_entry(unsigned stream_no) { ASSERT(0 <= stream_no && stream_no < max_streams); ioLock.Lock(); basic_io_vector[stream_no].token = 0; basic_io_vector[stream_no].ioBits = 0; ioLock.Unlock(); } #if (defined(_WIN32) && ! defined(__CYGWIN__)) // When testing for available input we need to do it differently depending on // the kind of handle we have. static int getFileType(int stream) { if (stream == 0 && hOldStdin == INVALID_HANDLE_VALUE) /* If this is stdio and we're using our own console.*/ return IO_BIT_GUI_CONSOLE; switch (GetFileType((HANDLE)_get_osfhandle(stream))) { case FILE_TYPE_PIPE: return IO_BIT_PIPE; case FILE_TYPE_CHAR: return IO_BIT_DEV; default: return 0; } } #endif /* Open a file in the required mode. */ static Handle open_file(TaskData *taskData, Handle filename, int mode, int access, int isPosix) { while (true) // Repeat only with certain kinds of errors { TempString cFileName(filename->Word()); // Get file name if (cFileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); Handle str_token = make_stream_entry(taskData); unsigned stream_no = STREAMID(str_token); int stream = _topen(cFileName, mode, access); if (stream >= 0) { PIOSTRUCT strm = &basic_io_vector[stream_no]; strm->device.ioDesc = stream; strm->ioBits = IO_BIT_OPEN; if ((mode & O_ACCMODE) != O_WRONLY) strm->ioBits |= IO_BIT_READ; if ((mode & O_ACCMODE) != O_RDONLY) strm->ioBits |= IO_BIT_WRITE; #if (defined(_WIN32) && ! defined(__CYGWIN__)) strm->ioBits |= getFileType(stream); #else if (! isPosix) { /* Set the close-on-exec flag. We don't set this if we are being called from one of the low level functions in the Posix structure. I assume that if someone is using those functions they know what they're doing and would expect the behaviour to be close to that of the underlying function. */ fcntl(stream, F_SETFD, 1); } #endif emfileFlag = false; /* Successful open. */ return str_token; } free_stream_entry(stream_no); switch (errno) { case EINTR: // Just try the call. Is it possible to block here indefinitely? continue; case EMFILE: /* too many open files */ { if (emfileFlag) /* Previously had an EMFILE error. */ raise_syscall(taskData, "Cannot open", EMFILE); emfileFlag = true; FullGC(taskData); /* May clear emfileFlag if we close a file. */ continue; } default: raise_syscall(taskData, "Cannot open", errno); /*NOTREACHED*/ return 0; } } } /* Close the stream unless it is stdin or stdout or already closed. */ static Handle close_file(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(DEREFHANDLE(stream)); unsigned stream_no = STREAMID(stream); if (strm != NULL && stream_no > 2) /* Ignore closed streams, stdin, stdout or stderr. */ { close_stream(strm); } return Make_arbitrary_precision(taskData, 0); } /* close_file */ /* Read into an array. */ // We can't combine readArray and readString because we mustn't compute the // destination of the data in readArray until after any GC. static Handle readArray(TaskData *taskData, Handle stream, Handle args, bool/*isText*/) { /* The isText argument is ignored in both Unix and Windows but is provided for future use. Windows remembers the mode used when the file was opened to determine whether to translate CRLF into LF. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); while (1) // Loop if interrupted. { // First test to see if we have input available. // These tests may result in a GC if another thread is running. // First test to see if we have input available. // These tests may result in a GC if another thread is running. PIOSTRUCT strm; while (true) { strm = get_stream(DEREFHANDLE(stream)); /* Raise an exception if the stream has been closed. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (isAvailable(taskData, strm)) break; WaitStream waiter(strm); processes->ThreadPauseForIO(taskData, &waiter); } #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (strm->hAvailable != NULL) ResetEvent(strm->hAvailable); #endif // We can now try to read without blocking. // Actually there's a race here in the unlikely situation that there // are multiple threads sharing the same low-level reader. They could // both detect that input is available but only one may succeed in // reading without blocking. This doesn't apply where the threads use // the higher-level IO interfaces in ML which have their own mutexes. int fd = strm->device.ioDesc; byte *base = DEREFHANDLE(args)->Get(0).AsObjPtr()->AsBytePtr(); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(args)->Get(1)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) unsigned length = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); int haveRead; #else size_t length = getPolyUnsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); ssize_t haveRead; #endif int err; #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (isConsole(strm)) { haveRead = getConsoleInput((char*)base+offset, length); err = errno; } else #endif { // Unix and Windows other than console. haveRead = read(fd, base+offset, length); err = errno; } if (haveRead >= 0) return Make_arbitrary_precision(taskData, haveRead); // Success. // If it failed because it was interrupted keep trying otherwise it's an error. if (err != EINTR) raise_syscall(taskData, "Error while reading", err); } } /* Return input as a string. We don't actually need both readArray and readString but it's useful to have both to reduce unnecessary garbage. The IO library will construct one from the other but the higher levels choose the appropriate function depending on need. */ static Handle readString(TaskData *taskData, Handle stream, Handle args, bool/*isText*/) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) int length = get_C_int(taskData, DEREFWORD(args)); int haveRead; #else size_t length = getPolyUnsigned(taskData, DEREFWORD(args)); ssize_t haveRead; #endif // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); while (1) // Loop if interrupted. { // First test to see if we have input available. // These tests may result in a GC if another thread is running. PIOSTRUCT strm; while (true) { strm = get_stream(DEREFHANDLE(stream)); /* Raise an exception if the stream has been closed. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (isAvailable(taskData, strm)) break; WaitStream waiter(strm); processes->ThreadPauseForIO(taskData, &waiter); } #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (strm->hAvailable != NULL) ResetEvent(strm->hAvailable); #endif // We can now try to read without blocking. int fd = strm->device.ioDesc; // We previously allocated the buffer on the stack but that caused // problems with multi-threading at least on Mac OS X because of // stack exhaustion. We limit the space to 100k. */ if (length > 102400) length = 102400; byte *buff = (byte*)malloc(length); if (buff == 0) raise_syscall(taskData, "Unable to allocate buffer", ENOMEM); int err; #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (isConsole(strm)) { haveRead = getConsoleInput((char*)buff, length); err = errno; } else #endif { // Unix and Windows other than console. haveRead = read(fd, buff, length); err = errno; } if (haveRead >= 0) { Handle result = SAVE(C_string_to_Poly(taskData, (char*)buff, haveRead)); free(buff); return result; } free(buff); // If it failed because it was interrupted keep trying otherwise it's an error. if (err != EINTR) raise_syscall(taskData, "Error while reading", err); } } static Handle writeArray(TaskData *taskData, Handle stream, Handle args, bool/*isText*/) { /* The isText argument is ignored in both Unix and Windows but is provided for future use. Windows remembers the mode used when the file was opened to determine whether to translate LF into CRLF. */ PolyWord base = DEREFWORDHANDLE(args)->Get(0); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(args)->Get(1)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) unsigned length = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); int haveWritten; #else size_t length = getPolyUnsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); ssize_t haveWritten; #endif PIOSTRUCT strm = get_stream(stream->WordP()); byte ch; /* Raise an exception if the stream has been closed. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); /* We don't actually handle cases of blocking on output. */ byte *toWrite; if (IS_INT(base)) { /* To allow this function to work on strings as well as vectors we have to be able to handle the special case of a single character string. */ ch = (byte)(UNTAGGED(base)); toWrite = &ch; offset = 0; length = 1; } else toWrite = base.AsObjPtr()->AsBytePtr(); haveWritten = write(strm->device.ioDesc, toWrite+offset, length); if (haveWritten < 0) raise_syscall(taskData, "Error while writing", errno); return Make_arbitrary_precision(taskData, haveWritten); } // Test whether we can write without blocking. Returns false if it will block, // true if it will not. static bool canOutput(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(stream->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* There's no way I can see of doing this in Windows. */ return true; #else /* Unix - use "select" to find out if output is possible. */ #ifdef __CYGWIN__ static struct timeval poll = {0,1}; #else static struct timeval poll = {0,0}; #endif fd_set read_fds, write_fds, except_fds; int sel; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&except_fds); FD_SET(strm->device.ioDesc, &write_fds); sel = select(FD_SETSIZE,&read_fds,&write_fds,&except_fds,&poll); if (sel < 0 && errno != EINTR) raise_syscall(taskData, "select failed", errno); return sel > 0; #endif } static long seekStream(TaskData *taskData, PIOSTRUCT strm, long pos, int origin) { long lpos; lpos = lseek(strm->device.ioDesc, pos, origin); if (lpos < 0) raise_syscall(taskData, "Position error", errno); return lpos; } /* Return the number of bytes available on the device. Works only for files since it is meaningless for other devices. */ static Handle bytesAvailable(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(stream->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); /* Remember our original position, seek to the end, then seek back. */ long original = seekStream(taskData, strm, 0L, SEEK_CUR); long endOfStream = seekStream(taskData, strm, 0L, SEEK_END); if (seekStream(taskData, strm, original, SEEK_SET) != original) raise_syscall(taskData, "Position error", errno); return Make_arbitrary_precision(taskData, endOfStream-original); } #define FILEKIND_FILE 0 #define FILEKIND_DIR 1 #define FILEKIND_LINK 2 #define FILEKIND_TTY 3 #define FILEKIND_PIPE 4 #define FILEKIND_SKT 5 #define FILEKIND_DEV 6 #define FILEKIND_ERROR (-1) static Handle fileKind(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(stream->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { HANDLE hTest; if (strm->device.ioDesc == 0) { // Stdin is special. The actual handle is to a pipe whether we are using our // own console or we were provided with a stdin. if (hOldStdin == INVALID_HANDLE_VALUE) return Make_arbitrary_precision(taskData, FILEKIND_TTY); // We've made our own console hTest = hOldStdin; } else hTest = (HANDLE)_get_osfhandle(strm->device.ioDesc); switch (GetFileType(hTest)) { case FILE_TYPE_PIPE: return Make_arbitrary_precision(taskData, FILEKIND_PIPE); case FILE_TYPE_CHAR: return Make_arbitrary_precision(taskData, FILEKIND_TTY); // Or a device? default: return Make_arbitrary_precision(taskData, FILEKIND_FILE); } } #else { struct stat statBuff; if (fstat(strm->device.ioDesc, &statBuff) < 0) raise_syscall(taskData, "Stat failed", errno); switch (statBuff.st_mode & S_IFMT) { case S_IFIFO: return Make_arbitrary_precision(taskData, FILEKIND_PIPE); case S_IFCHR: case S_IFBLK: if (isatty(strm->device.ioDesc)) return Make_arbitrary_precision(taskData, FILEKIND_TTY); else return Make_arbitrary_precision(taskData, FILEKIND_DEV); case S_IFDIR: return Make_arbitrary_precision(taskData, FILEKIND_DIR); case S_IFREG: return Make_arbitrary_precision(taskData, FILEKIND_FILE); case S_IFLNK: return Make_arbitrary_precision(taskData, FILEKIND_LINK); case S_IFSOCK: return Make_arbitrary_precision(taskData, FILEKIND_SKT); default: return Make_arbitrary_precision(taskData, -1); } } #endif } /* Polling. For the moment this applies only to objects which can be opened in the file system. It may need to be extended to sockets later. */ #define POLL_BIT_IN 1 #define POLL_BIT_OUT 2 #define POLL_BIT_PRI 4 /* Find out what polling options, if any, are allowed on this file descriptor. We assume that polling is allowed on all descriptors, either for reading or writing depending on how the stream was opened. */ Handle pollTest(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(stream->WordP()); int nRes = 0; if (strm == NULL) return Make_arbitrary_precision(taskData, 0); /* Allow for the possibility of both being set in the future. */ if (isRead(strm)) nRes |= POLL_BIT_IN; if (isWrite(strm)) nRes |= POLL_BIT_OUT; /* For the moment we don't allow POLL_BIT_PRI. */ return Make_arbitrary_precision(taskData, nRes); } /* Do the polling. Takes a vector of io descriptors, a vector of bits to test and a time to wait and returns a vector of results. */ static Handle pollDescriptors(TaskData *taskData, Handle args, int blockType) { TryAgain: PolyObject *strmVec = DEREFHANDLE(args)->Get(0).AsObjPtr(); PolyObject *bitVec = DEREFHANDLE(args)->Get(1).AsObjPtr(); POLYUNSIGNED nDesc = strmVec->Length(); ASSERT(nDesc == bitVec->Length()); // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); /* Simply do a non-blocking poll. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) { /* Record the results in this vector. */ char *results = 0; int haveResult = 0; Handle resVec; if (nDesc > 0) { results = (char*)alloca(nDesc); memset(results, 0, nDesc); } for (POLYUNSIGNED i = 0; i < nDesc; i++) { Handle marker = taskData->saveVec.mark(); PIOSTRUCT strm = get_stream(strmVec->Get(i).AsObjPtr()); taskData->saveVec.reset(marker); int bits = get_C_int(taskData, bitVec->Get(i)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (isSocket(strm)) { SOCKET sock = strm->device.sock; if (bits & POLL_BIT_PRI) { u_long atMark = 0; ioctlsocket(sock, SIOCATMARK, &atMark); if (atMark) { haveResult = 1; results[i] |= POLL_BIT_PRI; } } if (bits & (POLL_BIT_IN|POLL_BIT_OUT)) { FD_SET readFds, writeFds; TIMEVAL poll = {0, 0}; FD_ZERO(&readFds); FD_ZERO(&writeFds); if (bits & POLL_BIT_IN) FD_SET(sock, &readFds); if (bits & POLL_BIT_OUT) FD_SET(sock, &writeFds); if (select(FD_SETSIZE, &readFds, &writeFds, NULL, &poll) > 0) { haveResult = 1; /* N.B. select only tells us about out-of-band data if SO_OOBINLINE is FALSE. */ if (FD_ISSET(sock, &readFds)) results[i] |= POLL_BIT_IN; if (FD_ISSET(sock, &writeFds)) results[i] |= POLL_BIT_OUT; } } } else { if ((bits & POLL_BIT_IN) && isRead(strm) && isAvailable(taskData, strm)) { haveResult = 1; results[i] |= POLL_BIT_IN; } if ((bits & POLL_BIT_OUT) && isWrite(strm)) { /* I don't know if there's any way to do this. */ if (WaitForSingleObject( (HANDLE)_get_osfhandle(strm->device.ioDesc), 0) == WAIT_OBJECT_0) { haveResult = 1; results[i] |= POLL_BIT_OUT; } } /* PRIORITY doesn't make sense for anything but a socket. */ } } if (haveResult == 0) { /* Poll failed - treat as time out. */ switch (blockType) { case 0: /* Check the time out. */ { Handle hSave = taskData->saveVec.mark(); /* The time argument is an absolute time. */ FILETIME ftTime, ftNow; /* Get the file time. */ getFileTimeFromArb(taskData, taskData->saveVec.push(DEREFHANDLE(args)->Get(2)), &ftTime); GetSystemTimeAsFileTime(&ftNow); taskData->saveVec.reset(hSave); /* If the timeout time is earlier than the current time we must return, otherwise we block. */ if (CompareFileTime(&ftTime, &ftNow) <= 0) break; /* Return the empty set. */ /* else drop through and block. */ } case 1: /* Block until one of the descriptors is ready. */ processes->ThreadPause(taskData); goto TryAgain; /*NOTREACHED*/ case 2: /* Just a simple poll - drop through. */ break; } } /* Copy the results to a result vector. */ if (nDesc == 0) return taskData->saveVec.push(EmptyString()); /* Empty vector. */ resVec = alloc_and_save(taskData, nDesc); for (POLYUNSIGNED j = 0; j < nDesc; j++) (DEREFWORDHANDLE(resVec))->Set(j, TAGGED(results[j])); return resVec; } #elif (! defined(HAVE_POLL_H)) /* Unix but poll isn't provided, e.g. Mac OS X. Implement in terms of "select" as far as we can. */ { fd_set readFds, writeFds, exceptFds; struct timeval poll = {0, 0}; int selectRes = 0; FD_ZERO(&readFds); FD_ZERO(&writeFds); FD_ZERO(&exceptFds); for (POLYUNSIGNED i = 0; i < nDesc; i++) { PIOSTRUCT strm = get_stream(strmVec->Get(i).AsObjPtr()); int bits = UNTAGGED(bitVec->Get(i)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (bits & POLL_BIT_IN) FD_SET(strm->device.ioDesc, &readFds); if (bits & POLL_BIT_OUT) FD_SET(strm->device.ioDesc, &writeFds); } /* Simply check the status without blocking. */ if (nDesc > 0) selectRes = select(FD_SETSIZE, &readFds, &writeFds, &exceptFds, &poll); if (selectRes < 0) raise_syscall(taskData, "select failed", errno); /* What if nothing was ready? */ if (selectRes == 0) { switch (blockType) { case 0: /* Check the timeout. */ { struct timeval tv; /* We have a value in microseconds. We need to split it into seconds and microseconds. */ Handle hSave = taskData->saveVec.mark(); Handle hTime = SAVE(DEREFWORDHANDLE(args)->Get(2)); Handle hMillion = Make_arbitrary_precision(taskData, 1000000); unsigned long secs = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); unsigned long usecs = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); /* If the timeout time is earlier than the current time we must return, otherwise we block. */ taskData->saveVec.reset(hSave); if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); if ((unsigned long)tv.tv_sec > secs || ((unsigned long)tv.tv_sec == secs && (unsigned long)tv.tv_usec >= usecs)) break; /* else block. */ } case 1: /* Block until one of the descriptors is ready. */ processes->ThreadPause(taskData); goto TryAgain; case 2: /* Just a simple poll - drop through. */ break; } } /* Copy the results. */ if (nDesc == 0) return taskData->saveVec.push(EmptyString()); /* Construct a result vector. */ Handle resVec = alloc_and_save(taskData, nDesc); for (POLYUNSIGNED i = 0; i < nDesc; i++) { POLYUNSIGNED res = 0; POLYUNSIGNED bits = UNTAGGED(bitVec->Get(i)); PIOSTRUCT strm = get_stream(strmVec->Get(i).AsObjPtr()); if ((bits & POLL_BIT_IN) && FD_ISSET(strm->device.ioDesc, &readFds)) res |= POLL_BIT_IN; if ((bits & POLL_BIT_OUT) && FD_ISSET(strm->device.ioDesc, &writeFds)) res |= POLL_BIT_OUT; DEREFWORDHANDLE(resVec)->Set(i, TAGGED(res)); } return resVec; } #else /* Unix */ { int pollRes = 0; struct pollfd * fds = 0; if (nDesc > 0) fds = (struct pollfd *)alloca(nDesc * sizeof(struct pollfd)); /* Set up the request vector. */ for (unsigned i = 0; i < nDesc; i++) { PIOSTRUCT strm = get_stream(strmVec->Get(i).AsObjPtr()); POLYUNSIGNED bits = UNTAGGED(bitVec->Get(i)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); fds[i].fd = strm->device.ioDesc; fds[i].events = 0; if (bits & POLL_BIT_IN) fds[i].events |= POLLIN; /* | POLLRDNORM??*/ if (bits & POLL_BIT_OUT) fds[i].events |= POLLOUT; if (bits & POLL_BIT_PRI) fds[i].events |= POLLPRI; fds[i].revents = 0; } /* Poll the descriptors. */ if (nDesc > 0) pollRes = poll(fds, nDesc, 0); if (pollRes < 0) raise_syscall(taskData, "poll failed", errno); /* What if nothing was ready? */ if (pollRes == 0) { switch (blockType) { case 0: /* Check the timeout. */ { struct timeval tv; /* We have a value in microseconds. We need to split it into seconds and microseconds. */ // We need to reset the savevec because we can come here repeatedly Handle hSave = taskData->saveVec.mark(); Handle hTime = SAVE(DEREFWORDHANDLE(args)->Get(2)); Handle hMillion = Make_arbitrary_precision(taskData, 1000000); unsigned long secs = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); unsigned long usecs = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); taskData->saveVec.reset(hSave); /* If the timeout time is earlier than the current time we must return, otherwise we block. */ if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); if ((unsigned long)tv.tv_sec > secs || ((unsigned long)tv.tv_sec == secs && (unsigned long)tv.tv_usec >= usecs)) break; /* else block. */ } case 1: /* Block until one of the descriptors is ready. */ processes->ThreadPause(taskData); goto TryAgain; case 2: /* Just a simple poll - drop through. */ break; } } /* Copy the results. */ if (nDesc == 0) return taskData->saveVec.push(EmptyString()); /* Construct a result vector. */ Handle resVec = alloc_and_save(taskData, nDesc); for (unsigned i = 0; i < nDesc; i++) { int res = 0; if (fds[i].revents & POLLIN) res = POLL_BIT_IN; if (fds[i].revents & POLLOUT) res = POLL_BIT_OUT; if (fds[i].revents & POLLPRI) res = POLL_BIT_PRI; DEREFWORDHANDLE(resVec)->Set(i, TAGGED(res)); } return resVec; } #endif } /* Directory functions. */ /* Open a directory. */ static Handle openDirectory(TaskData *taskData, Handle dirname) { while (1) // Only certain errors { Handle str_token = make_stream_entry(taskData); unsigned stream_no = STREAMID(str_token); PIOSTRUCT strm = &basic_io_vector[stream_no]; #if (defined(_WIN32) && ! defined(__CYGWIN__)) { // Get the directory name but add on two characters for the \* plus one for the NULL. POLYUNSIGNED length = PolyStringLength(dirname->Word()); TempString dirName((TCHAR*)malloc((length + 3)*sizeof(TCHAR))); if (dirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); Poly_string_to_C(dirname->Word(), dirName, length+2); // Tack on \* to the end so that we find all files in the directory. lstrcat(dirName, _T("\\*")); HANDLE hFind = FindFirstFile(dirName, &strm->device.directory.lastFind); if (hFind == INVALID_HANDLE_VALUE) raise_syscall(taskData, "FindFirstFile failed", -(int)GetLastError()); strm->device.directory.hFind = hFind; /* There must be at least one file which matched. */ strm->device.directory.fFindSucceeded = 1; } #else TempString dirName(dirname->Word()); if (dirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); DIR *dirp = opendir(dirName); if (dirp == NULL) { free_stream_entry(stream_no); switch (errno) { case EINTR: continue; // Just retry the call. case EMFILE: { if (emfileFlag) /* Previously had an EMFILE error. */ raise_syscall(taskData, "Cannot open", EMFILE); emfileFlag = true; FullGC(taskData); /* May clear emfileFlag if we close a file. */ continue; } default: raise_syscall(taskData, "opendir failed", errno); } } strm->device.ioDir = dirp; #endif strm->ioBits = IO_BIT_OPEN | IO_BIT_DIR; return(str_token); } } /* Return the next entry from the directory, ignoring current and parent arcs ("." and ".." in Windows and Unix) */ Handle readDirectory(TaskData *taskData, Handle stream) { PIOSTRUCT strm = get_stream(stream->WordP()); #if (defined(_WIN32) && ! defined(__CYGWIN__)) Handle result = NULL; #endif /* Raise an exception if the stream has been closed. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* The next entry to read is already in the buffer. FindFirstFile both opens the directory and returns the first entry. If fFindSucceeded is false we have already reached the end. */ if (! strm->device.directory.fFindSucceeded) return SAVE(EmptyString()); while (result == NULL) { WIN32_FIND_DATA *pFind = &strm->device.directory.lastFind; if (!((pFind->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (lstrcmp(pFind->cFileName, _T(".")) == 0 || lstrcmp(pFind->cFileName, _T("..")) == 0))) { result = SAVE(C_string_to_Poly(taskData, pFind->cFileName)); } /* Get the next entry. */ if (! FindNextFile(strm->device.directory.hFind, pFind)) { DWORD dwErr = GetLastError(); if (dwErr == ERROR_NO_MORE_FILES) { strm->device.directory.fFindSucceeded = 0; if (result == NULL) return SAVE(EmptyString()); } } } return result; #else while (1) { struct dirent *dp = readdir(strm->device.ioDir); int len; if (dp == NULL) return taskData->saveVec.push(EmptyString()); len = NAMLEN(dp); if (!((len == 1 && strncmp(dp->d_name, ".", 1) == 0) || (len == 2 && strncmp(dp->d_name, "..", 2) == 0))) return SAVE(C_string_to_Poly(taskData, dp->d_name, len)); } #endif } Handle rewindDirectory(TaskData *taskData, Handle stream, Handle dirname) { PIOSTRUCT strm = get_stream(stream->WordP()); /* Raise an exception if the stream has been closed. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { /* There's no rewind - close and reopen. */ FindClose(strm->device.directory.hFind); strm->ioBits = 0; POLYUNSIGNED length = PolyStringLength(dirname->Word()); TempString dirName((TCHAR*)malloc((length + 3)*sizeof(TCHAR))); if (dirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); Poly_string_to_C(dirname->Word(), dirName, length+2); // Tack on \* to the end so that we find all files in the directory. lstrcat(dirName, _T("\\*")); HANDLE hFind = FindFirstFile(dirName, &strm->device.directory.lastFind); if (hFind == INVALID_HANDLE_VALUE) raise_syscall(taskData, "FindFirstFile failed", -(int)GetLastError()); strm->device.directory.hFind = hFind; /* There must be at least one file which matched. */ strm->device.directory.fFindSucceeded = 1; strm->ioBits = IO_BIT_OPEN | IO_BIT_DIR; } #else rewinddir(strm->device.ioDir); #endif return Make_arbitrary_precision(taskData, 0); } /* change_dirc - this is called directly and not via the dispatch function. */ Handle change_dirc(TaskData *taskData, Handle name) /* Change working directory. */ { TempString cDirName(name->Word()); if (cDirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (SetCurrentDirectory(cDirName) == FALSE) raise_syscall(taskData, "SetCurrentDirectory failed", -(int)GetLastError()); #else if (chdir(cDirName) != 0) raise_syscall(taskData, "chdir failed", errno); #endif return SAVE(TAGGED(0)); } /* Test for a directory. */ Handle isDir(TaskData *taskData, Handle name) { TempString cDirName(name->Word()); if (cDirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { DWORD dwRes = GetFileAttributes(cDirName); if (dwRes == 0xFFFFFFFF) raise_syscall(taskData, "GetFileAttributes failed", -(int)GetLastError()); if (dwRes & FILE_ATTRIBUTE_DIRECTORY) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } #else { struct stat fbuff; if (stat(cDirName, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); if ((fbuff.st_mode & S_IFMT) == S_IFDIR) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } #endif } /* Get absolute canonical path name. */ Handle fullPath(TaskData *taskData, Handle filename) { TempString cFileName; /* Special case of an empty string. */ if (PolyStringLength(filename->Word()) == 0) cFileName = _tcsdup(_T(".")); else cFileName = Poly_string_to_T_alloc(filename->Word()); if (cFileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { // Get the length DWORD dwRes = GetFullPathName(cFileName, 0, NULL, NULL); if (dwRes == 0) raise_syscall(taskData, "GetFullPathName failed", -(int)GetLastError()); TempString resBuf((TCHAR*)malloc(dwRes * sizeof(TCHAR))); if (resBuf == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); // When the length is enough the result is the length excluding the null DWORD dwRes1 = GetFullPathName(cFileName, dwRes, resBuf, NULL); if (dwRes1 == 0 || dwRes1 >= dwRes) raise_syscall(taskData, "GetFullPathName failed", -(int)GetLastError()); /* Check that the file exists. GetFullPathName doesn't do that. */ dwRes = GetFileAttributes(resBuf); if (dwRes == 0xffffffff) raise_syscall(taskData, "File does not exist", ENOENT); return(SAVE(C_string_to_Poly(taskData, resBuf))); } #else { TempCString resBuf(realpath(cFileName, NULL)); if (resBuf == NULL) raise_syscall(taskData, "realpath failed", errno); /* Some versions of Unix don't check the final component of a file. To be consistent try doing a "stat" of the resulting string to check it exists. */ struct stat fbuff; if (stat(resBuf, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); return(SAVE(C_string_to_Poly(taskData, resBuf))); } #endif } /* Get file modification time. This returns the value in the time units and from the base date used by timing.c. c.f. filedatec */ Handle modTime(TaskData *taskData, Handle filename) { TempString cFileName(filename->Word()); if (cFileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { /* There are two ways to get this information. We can either use GetFileTime if we are able to open the file for reading but if it is locked we won't be able to. FindFirstFile is the other alternative. We have to check that the file name does not contain '*' or '?' otherwise it will try to "glob" this, which isn't what we want here. */ WIN32_FIND_DATA wFind; HANDLE hFind; const TCHAR *p; for(p = cFileName; *p; p++) if (*p == '*' || *p == '?') raise_syscall(taskData, "Invalid filename", EBADF); hFind = FindFirstFile(cFileName, &wFind); if (hFind == INVALID_HANDLE_VALUE) raise_syscall(taskData, "FindFirstFile failed", -(int)GetLastError()); FindClose(hFind); return Make_arb_from_Filetime(taskData, wFind.ftLastWriteTime); } #else { struct stat fbuff; if (stat(cFileName, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); /* Convert to microseconds. */ return Make_arb_from_pair_scaled(taskData, STAT_SECS(&fbuff,m), STAT_USECS(&fbuff,m), 1000000); } #endif } /* Get file size. */ Handle fileSize(TaskData *taskData, Handle filename) { TempString cFileName(filename->Word()); if (cFileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { /* Similar to modTime*/ WIN32_FIND_DATA wFind; HANDLE hFind; const TCHAR *p; for(p = cFileName; *p; p++) if (*p == '*' || *p == '?') raise_syscall(taskData, "Invalid filename", EBADF); hFind = FindFirstFile(cFileName, &wFind); if (hFind == INVALID_HANDLE_VALUE) raise_syscall(taskData, "FindFirstFile failed", -(int)GetLastError()); FindClose(hFind); return Make_arb_from_32bit_pair(taskData, wFind.nFileSizeHigh, wFind.nFileSizeLow); } #else { struct stat fbuff; if (stat(cFileName, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); return Make_arbitrary_precision(taskData, fbuff.st_size); } #endif } /* Set file modification and access times. */ Handle setTime(TaskData *taskData, Handle fileName, Handle fileTime) { TempString cFileName(fileName->Word()); if (cFileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* The only way to set the time is to open the file and use SetFileTime. */ { FILETIME ft; /* Get the file time. */ getFileTimeFromArb(taskData, fileTime, &ft); /* Open an existing file with write access. We need that for SetFileTime. */ HANDLE hFile = CreateFile(cFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) raise_syscall(taskData, "CreateFile failed", -(int)GetLastError()); /* Set the file time. */ if (!SetFileTime(hFile, NULL, &ft, &ft)) { int nErr = GetLastError(); CloseHandle(hFile); raise_syscall(taskData, "SetFileTime failed", -nErr); } CloseHandle(hFile); } #else { struct timeval times[2]; /* We have a value in microseconds. We need to split it into seconds and microseconds. */ Handle hTime = fileTime; Handle hMillion = Make_arbitrary_precision(taskData, 1000000); /* N.B. Arguments to div_longc and rem_longc are in reverse order. */ unsigned secs = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); unsigned usecs = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); times[0].tv_sec = times[1].tv_sec = secs; times[0].tv_usec = times[1].tv_usec = usecs; if (utimes(cFileName, times) != 0) raise_syscall(taskData, "utimes failed", errno); } #endif return Make_arbitrary_precision(taskData, 0); } /* Rename a file. */ Handle renameFile(TaskData *taskData, Handle oldFileName, Handle newFileName) { TempString oldName(oldFileName->Word()), newName(newFileName->Word()); if (oldName == 0 || newName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (! MoveFileEx(oldName, newName, MOVEFILE_REPLACE_EXISTING)) raise_syscall(taskData, "MoveFileEx failed", -(int)GetLastError()); #else if (rename(oldName, newName) != 0) raise_syscall(taskData, "rename failed", errno); #endif return Make_arbitrary_precision(taskData, 0); } /* Access right requests passed in from ML. */ #define FILE_ACCESS_READ 1 #define FILE_ACCESS_WRITE 2 #define FILE_ACCESS_EXECUTE 4 /* Get access rights to a file. */ Handle fileAccess(TaskData *taskData, Handle name, Handle rights) { TempString fileName(name->Word()); if (fileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); int rts = get_C_int(taskData, DEREFWORD(rights)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { /* Test whether the file is read-only. This is, of course, not what was asked but getting anything more is really quite complicated. I don't see how we can find out if a file is executable (maybe check if the extension is .exe, .com or .bat?). It would be possible, in NT, to examine the access structures but that seems far too complicated. Leave it for the moment. */ DWORD dwRes = GetFileAttributes(fileName); if (dwRes == 0xffffffff) return Make_arbitrary_precision(taskData, 0); /* If we asked for write access but it is read-only we return false. */ if ((dwRes & FILE_ATTRIBUTE_READONLY) && (rts & FILE_ACCESS_WRITE)) return Make_arbitrary_precision(taskData, 0); else return Make_arbitrary_precision(taskData, 1); } #else { int mode = 0; if (rts & FILE_ACCESS_READ) mode |= R_OK; if (rts & FILE_ACCESS_WRITE) mode |= W_OK; if (rts & FILE_ACCESS_EXECUTE) mode |= X_OK; if (mode == 0) mode = F_OK; /* Return true if access is allowed, otherwise false for any other error. */ if (access(fileName, mode) == 0) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } #endif } /* IO_dispatchc. Called from assembly code module. */ Handle IO_dispatch_c(TaskData *taskData, Handle args, Handle strm, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORD(code)); switch (c) { case 0: /* Return standard input */ return SAVE((PolyObject*)IoEntry(POLY_SYS_stdin)); case 1: /* Return standard output */ return SAVE((PolyObject*)IoEntry(POLY_SYS_stdout)); case 2: /* Return standard error */ return SAVE((PolyObject*)IoEntry(POLY_SYS_stderr)); case 3: /* Open file for text input. */ return open_file(taskData, args, O_RDONLY, 0666, 0); case 4: /* Open file for binary input. */ return open_file(taskData, args, O_RDONLY | O_BINARY, 0666, 0); case 5: /* Open file for text output. */ return open_file(taskData, args, O_WRONLY | O_CREAT | O_TRUNC, 0666, 0); case 6: /* Open file for binary output. */ return open_file(taskData, args, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666, 0); case 7: /* Close file */ return close_file(taskData, strm); case 8: /* Read text into an array. */ return readArray(taskData, strm, args, true); case 9: /* Read binary into an array. */ return readArray(taskData, strm, args, false); case 10: /* Get text as a string. */ return readString(taskData, strm, args, true); case 11: /* Write from memory into a text file. */ return writeArray(taskData, strm, args, true); case 12: /* Write from memory into a binary file. */ return writeArray(taskData, strm, args, false); case 13: /* Open text file for appending. */ /* The IO library definition leaves it open whether this should use "append mode" or not. */ return open_file(taskData, args, O_WRONLY | O_CREAT | O_APPEND, 0666, 0); case 14: /* Open binary file for appending. */ return open_file(taskData, args, O_WRONLY | O_CREAT | O_APPEND | O_BINARY, 0666, 0); case 15: /* Return recommended buffer size. */ /* TODO: This should try to find a sensible number based on the stream handle passed in. Leave it at 1k for the moment. */ /* Try increasing to 4k. */ return Make_arbitrary_precision(taskData, /*1024*/4096); case 16: /* See if we can get some input. */ { PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); return Make_arbitrary_precision(taskData, isAvailable(taskData, str) ? 1 : 0); } case 17: /* Return the number of bytes available. */ return bytesAvailable(taskData, strm); case 18: /* Get position on stream. */ { /* Get the current position in the stream. This is used to test for the availability of random access so it should raise an exception if setFilePos or endFilePos would fail. */ PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); long pos = seekStream(taskData, str, 0L, SEEK_CUR); return Make_arbitrary_precision(taskData, pos); } case 19: /* Seek to position on stream. */ { long position = (long)get_C_long(taskData, DEREFWORD(args)); PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); (void)seekStream(taskData, str, position, SEEK_SET); return Make_arbitrary_precision(taskData, 0); } case 20: /* Return position at end of stream. */ { PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); /* Remember our original position, seek to the end, then seek back. */ long original = seekStream(taskData, str, 0L, SEEK_CUR); long endOfStream = seekStream(taskData, str, 0L, SEEK_END); if (seekStream(taskData, str, original, SEEK_SET) != original) raise_syscall(taskData, "Position error", errno); return Make_arbitrary_precision(taskData, endOfStream); } case 21: /* Get the kind of device underlying the stream. */ return fileKind(taskData, strm); case 22: /* Return the polling options allowed on this descriptor. */ return pollTest(taskData, strm); case 23: /* Poll the descriptor, waiting forever. */ return pollDescriptors(taskData, args, 1); case 24: /* Poll the descriptor, waiting for the time requested. */ return pollDescriptors(taskData, args, 0); case 25: /* Poll the descriptor, returning immediately.*/ return pollDescriptors(taskData, args, 2); case 26: /* Get binary as a vector. */ return readString(taskData, strm, args, false); case 27: /* Block until input is available. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); while (true) { PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (isAvailable(taskData, str)) return Make_arbitrary_precision(taskData, 0); WaitStream waiter(str); processes->ThreadPauseForIO(taskData, &waiter); } case 28: /* Test whether output is possible. */ return Make_arbitrary_precision(taskData, canOutput(taskData, strm) ? 1:0); case 29: /* Block until output is possible. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); while (true) { if (canOutput(taskData, strm)) return Make_arbitrary_precision(taskData, 0); // Use the default waiter for the moment since we don't have // one to test for output. processes->ThreadPauseForIO(taskData, Waiter::defaultWaiter); } /* Functions added for Posix structure. */ case 30: /* Return underlying file descriptor. */ /* This is now also used internally to test for stdIn, stdOut and stdErr. */ { PIOSTRUCT str = get_stream(strm->WordP()); if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); return Make_arbitrary_precision(taskData, str->device.ioDesc); } case 31: /* Make an entry for a given descriptor. */ { int ioDesc = get_C_int(taskData, DEREFWORD(args)); PIOSTRUCT str; /* First see if it's already in the table. */ for (unsigned i = 0; i < max_streams; i++) { str = &(basic_io_vector[i]); if (str->token != 0 && str->device.ioDesc == ioDesc) return taskData->saveVec.push(str->token); } /* Have to make a new entry. */ Handle str_token = make_stream_entry(taskData); unsigned stream_no = STREAMID(str_token); str = &basic_io_vector[stream_no]; str->device.ioDesc = get_C_int(taskData, DEREFWORD(args)); /* We don't know whether it's open for read, write or even if it's open at all. */ str->ioBits = IO_BIT_OPEN | IO_BIT_READ | IO_BIT_WRITE ; #if (defined(_WIN32) && ! defined(__CYGWIN__)) str->ioBits |= getFileType(ioDesc); #endif return str_token; } /* Directory functions. */ case 50: /* Open a directory. */ return openDirectory(taskData, args); case 51: /* Read a directory entry. */ return readDirectory(taskData, strm); case 52: /* Close the directory */ return close_file(taskData, strm); case 53: /* Rewind the directory. */ return rewindDirectory(taskData, strm, args); case 54: /* Get current working directory. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) DWORD space = GetCurrentDirectory(0, NULL); if (space == 0) raise_syscall(taskData, "GetCurrentDirectory failed", -(int)GetLastError()); TempString buff((TCHAR*)malloc(space * sizeof(TCHAR))); if (buff == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); if (GetCurrentDirectory(space, buff) == 0) raise_syscall(taskData, "GetCurrentDirectory failed", -(int)GetLastError()); return SAVE(C_string_to_Poly(taskData, buff)); #else // This is a bit messy in Unix. getcwd will return an error result if there's // not enough space be we have to iterate to find the size. // Use the fixed size for the moment. TCHAR string_buffer[MAXPATHLEN+1]; if (getcwd(string_buffer, MAXPATHLEN+1) == NULL) raise_syscall(taskData, "getcwd failed", errno); return SAVE(C_string_to_Poly(taskData, string_buffer)); #endif } case 55: /* Create a new directory. */ { TempString dirName(args->Word()); if (dirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (! CreateDirectory(dirName, NULL)) raise_syscall(taskData, "CreateDirectory failed", -(int)GetLastError()); #else if (mkdir(dirName, 0777) != 0) raise_syscall(taskData, "mkdir failed", errno); #endif return Make_arbitrary_precision(taskData, 0); } case 56: /* Delete a directory. */ { TempString dirName(args->Word()); if (dirName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (! RemoveDirectory(dirName)) raise_syscall(taskData, "RemoveDirectory failed", -(int)GetLastError()); #else if (rmdir(dirName) != 0) raise_syscall(taskData, "rmdir failed", errno); #endif return Make_arbitrary_precision(taskData, 0); } case 57: /* Test for directory. */ return isDir(taskData, args); case 58: /* Test for symbolic link. */ { TempString fileName(args->Word()); if (fileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) { DWORD dwRes = GetFileAttributes(fileName); if (dwRes == 0xFFFFFFFF) raise_syscall(taskData, "GetFileAttributes failed", -(int)GetLastError()); return Make_arbitrary_precision(taskData, dwRes & FILE_ATTRIBUTE_REPARSE_POINT); } #else { struct stat fbuff; if (lstat(fileName, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); if ((fbuff.st_mode & S_IFMT) == S_IFLNK) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } #endif } case 59: /* Read a symbolic link. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Windows has added symbolic links but reading the target is far from // straightforward. It's probably not worth trying to implement this. raiseSyscallMessage(taskData, "Not implemented"); return taskData->saveVec.push(TAGGED(0)); /* To keep compiler happy. */ #else int nLen; TempString linkName(args->Word()); if (linkName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); char resBuf[MAXPATHLEN]; nLen = readlink(linkName, resBuf, sizeof(resBuf)); if (nLen < 0) raise_syscall(taskData, "readlink failed", errno); return(SAVE(C_string_to_Poly(taskData, resBuf, nLen))); #endif } case 60: /* Return the full absolute path name. */ return fullPath(taskData, args); case 61: /* Modification time. */ return modTime(taskData, args); case 62: /* File size. */ return fileSize(taskData, args); case 63: /* Set file time. */ return setTime(taskData, strm, args); case 64: /* Delete a file. */ { TempString fileName(args->Word()); if (fileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (! DeleteFile(fileName)) raise_syscall(taskData, "DeleteFile failed", 0-GetLastError()); #else if (unlink(fileName) != 0) raise_syscall(taskData, "unlink failed", errno); #endif return Make_arbitrary_precision(taskData, 0); } case 65: /* rename a file. */ return renameFile(taskData, strm, args); case 66: /* Get access rights. */ return fileAccess(taskData, strm, args); case 67: /* Return a temporary file name. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) DWORD dwSpace = GetTempPath(0, NULL); if (dwSpace == 0) raise_syscall(taskData, "GetTempPath failed", -(int)(GetLastError())); TempString buff((TCHAR*)malloc((dwSpace + 12)*sizeof(TCHAR))); if (buff == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); if (GetTempPath(dwSpace, buff) == 0) raise_syscall(taskData, "GetTempPath failed", -(int)(GetLastError())); lstrcat(buff, _T("MLTEMPXXXXXX")); #else TCHAR buff[MAXPATHLEN]; #ifdef P_tmpdir strcpy(buff, P_tmpdir); #else strcpy(buff, "/tmp"); #endif strcat(buff, "/MLTEMPXXXXXX"); #endif #if (defined(HAVE_MKSTEMP) && ! defined(UNICODE)) // mkstemp is present in the Mingw64 headers but only as ANSI not Unicode. // Set the umask to mask out access by anyone else. // mkstemp generally does this anyway. mode_t oldMask = umask(0077); int fd = mkstemp(buff); int wasError = errno; (void)umask(oldMask); if (fd != -1) close(fd); else raise_syscall(taskData, "mkstemp failed", wasError); #else if (_tmktemp(buff) == 0) raise_syscall(taskData, "mktemp failed", errno); int fd = _topen(buff, O_RDWR | O_CREAT | O_EXCL, 00600); if (fd != -1) close(fd); else raise_syscall(taskData, "Temporary file creation failed", errno); #endif Handle res = SAVE(C_string_to_Poly(taskData, buff)); return res; } case 68: /* Get the file id. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* This concept does not exist in Windows. */ /* Return a negative number. This is interpreted as "not implemented". */ return Make_arbitrary_precision(taskData, -1); #else struct stat fbuff; TempString fileName(args->Word()); if (fileName == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); if (stat(fileName, &fbuff) != 0) raise_syscall(taskData, "stat failed", errno); /* Assume that inodes are always non-negative. */ return Make_arbitrary_precision(taskData, fbuff.st_ino); #endif } case 69: /* Return an index for a token. */ return Make_arbitrary_precision(taskData, STREAMID(strm)); case 70: /* Posix.FileSys.openf - open a file with given mode. */ { Handle name = taskData->saveVec.push(DEREFWORDHANDLE(args)->Get(0)); int mode = get_C_int(taskData, DEREFWORDHANDLE(args)->Get(1)); return open_file(taskData, name, mode, 0666, 1); } case 71: /* Posix.FileSys.createf - create a file with given mode and access. */ { Handle name = taskData->saveVec.push(DEREFWORDHANDLE(args)->Get(0)); int mode = get_C_int(taskData, DEREFWORDHANDLE(args)->Get(1)); int access = get_C_int(taskData, DEREFWORDHANDLE(args)->Get(2)); return open_file(taskData, name, mode|O_CREAT, access, 1); } default: { char msg[100]; sprintf(msg, "Unknown io function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } class BasicIO: public RtsModule { public: virtual void Init(void); virtual void Start(void); virtual void Stop(void); void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static BasicIO basicIOModule; void BasicIO::Init(void) { max_streams = 20; // Initialise to the old Unix maximum. Will grow if necessary. /* A vector for the streams (initialised by calloc) */ basic_io_vector = (PIOSTRUCT)calloc(max_streams, sizeof(IOSTRUCT)); } void BasicIO::Start(void) { basic_io_vector[0].token = (PolyObject*)IoEntry(POLY_SYS_stdin); basic_io_vector[0].device.ioDesc = 0; basic_io_vector[0].ioBits = IO_BIT_OPEN | IO_BIT_READ; #if (defined(_WIN32) && ! defined(__CYGWIN__)) basic_io_vector[0].ioBits |= getFileType(0); // Set this to a duplicate of the handle so it can be closed when we // close the stream. HANDLE hDup; if (DuplicateHandle(GetCurrentProcess(), hInputEvent, GetCurrentProcess(), &hDup, 0, FALSE, DUPLICATE_SAME_ACCESS)) basic_io_vector[0].hAvailable = hDup; #endif basic_io_vector[1].token = (PolyObject*)IoEntry(POLY_SYS_stdout); basic_io_vector[1].device.ioDesc = 1; basic_io_vector[1].ioBits = IO_BIT_OPEN | IO_BIT_WRITE; #if (defined(_WIN32) && ! defined(__CYGWIN__)) basic_io_vector[1].ioBits |= getFileType(1); #endif basic_io_vector[2].token = (PolyObject*)IoEntry(POLY_SYS_stderr); basic_io_vector[2].device.ioDesc = 2; basic_io_vector[2].ioBits = IO_BIT_OPEN | IO_BIT_WRITE; #if (defined(_WIN32) && ! defined(__CYGWIN__)) basic_io_vector[2].ioBits |= getFileType(2); #endif return; } /* Release all resources. Not strictly necessary since the OS should do this but probably a good idea. */ void BasicIO::Stop(void) { if (basic_io_vector) { // Don't close the standard streams since we may need // stdout at least to produce final debugging output. for (unsigned i = 3; i < max_streams; i++) { if (isOpen(&basic_io_vector[i])) close_stream(&basic_io_vector[i]); } free(basic_io_vector); } basic_io_vector = NULL; } void BasicIO::GarbageCollect(ScanAddress *process) /* Ensures that all the objects are retained and their addresses updated. */ { /* Entries in the file table. These are marked as weak references so may return 0 for unreferenced streams. */ for(unsigned i = 0; i < max_streams; i++) { PIOSTRUCT str = &(basic_io_vector[i]); if (str->token != 0) { process->ScanRuntimeAddress(&str->token, ScanAddress::STRENGTH_WEAK); /* Unreferenced streams may return zero. */ if (str->token == 0 && isOpen(str)) close_stream(str); } } } polyml-5.6/libpolyml/basicio.h000066400000000000000000000021301265146633400164730ustar00rootroot00000000000000/* Title: Basic IO. Copyright (c) 2000 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef BASICIO_H #define BASICIO_H class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle IO_dispatch_c(TaskData *mdTaskData, Handle args, Handle strm, Handle code); extern Handle change_dirc(TaskData *mdTaskData, Handle name); #endif /* BASICIO_H */ polyml-5.6/libpolyml/bitmap.cpp000066400000000000000000000145221265146633400167010ustar00rootroot00000000000000/* Title: Bitmap. Generally used by the garbage collector to indicate allocated words Copyright (c) 2006, 2012 David C.J. Matthews Based on original code in garbage_collect.c. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Bitmaps are used particularly in the garbage collector to indicate allocated words. The efficiency of this code is crucial for the speed of the garbage collector. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(h) assert(h) #else #define ASSERT(h) #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "bitmap.h" #include "globals.h" bool Bitmap::Create(POLYUNSIGNED bits) { free(m_bits); // Any previous data size_t bytes = (bits+7) >> 3; m_bits = (unsigned char*)malloc(bytes); if (m_bits != 0) memset(m_bits, 0, bytes); return m_bits != 0; } void Bitmap::Destroy() { free(m_bits); m_bits = 0; } Bitmap::~Bitmap() { Destroy(); } // Set a range of bits in a bitmap. This checks that the bits are not already set. void Bitmap::SetBits(POLYUNSIGNED bitno, POLYUNSIGNED length) { POLYUNSIGNED byte_index = bitno >> 3; ASSERT (0 < length); // Strictly positive /* Set the first part byte */ POLYUNSIGNED start_bit_index = bitno & 7; POLYUNSIGNED stop_bit_index = start_bit_index + length; /* Do we need to change more than one byte? */ if (stop_bit_index < 8) { const unsigned mask1 = 0xff << start_bit_index; const unsigned mask2 = 0xff << stop_bit_index; const unsigned mask = mask1 & ~mask2; // ASSERT((m_bits[byte_index] & mask) == 0); m_bits[byte_index] |= mask; return; } else /* Set all the bits we can in the first byte */ { const unsigned mask = 0xff << start_bit_index; // ASSERT((m_bits[byte_index] & mask) == 0); m_bits[byte_index] |= mask; /* length = length - (8 - start_bit_index); */ length = stop_bit_index - 8; } /* Invariant: 0 <= length */ ASSERT(length >= 0); /* Set as many full bytes as possible */ while (8 <= length) { /* Invariant: 8 <= length */ byte_index ++; // ASSERT(m_bits[byte_index] == 0); m_bits[byte_index] = 0xff; length -= 8; /* Invariant: 0 <= length */ } /* Invariant: 0 <= length < 8 */ ASSERT(length >= 0 && length < 8); if (length == 0) return; /* Invariant: 0 < length < 8 */ /* Set the final part byte */ byte_index ++; const unsigned mask = 0xff & ~(0xff << length); // ASSERT((m_bits[byte_index] & mask) == 0); m_bits[byte_index] |= mask; } // Clear a range of bits. This is only used to clear the bitmap so // it does not need to be exact so long as at least the range specified // is zero. void Bitmap::ClearBits(POLYUNSIGNED bitno, POLYUNSIGNED length) { POLYUNSIGNED byte_index = bitno >> 3; length += bitno & 7; size_t bytes = length >> 3; if (length & 7) bytes++; memset(m_bits+byte_index, 0, bytes); } // How many zero bits (maximum n) are there in the bitmap, starting at location start? */ POLYUNSIGNED Bitmap::CountZeroBits(POLYUNSIGNED bitno, POLYUNSIGNED n) const { POLYUNSIGNED byte_index = bitno >> 3; unsigned bit_index = bitno & 7; unsigned mask = 1 << bit_index; POLYUNSIGNED zero_bits = 0; ASSERT (0 < n); // Strictly positive /* Check the first part byte */ while (mask != 0) { /* zero_bits < n */ if ((m_bits[byte_index] & mask) != 0) return zero_bits; zero_bits ++; if (zero_bits == n) return zero_bits; mask = (mask << 1) & 0xff; /* zero_bits < n */ } /* zero_bits < n */ /* Check as many bytes as possible */ byte_index ++; while (zero_bits < n && m_bits[byte_index] == 0) { zero_bits += 8; byte_index ++; } /* Check the final part byte */ mask = 1; while (zero_bits < n && (m_bits[byte_index] & mask) == 0) { zero_bits ++; mask = (mask << 1) & 0xff; } return zero_bits; } // Search the bitmap from the high end down looking for n contiguous zeros // Returns the value of "bitno" on failure. . POLYUNSIGNED Bitmap::FindFree ( POLYUNSIGNED limit, /* The highest numbered bit that's too small to use */ POLYUNSIGNED start, /* The lowest numbered bit that's too large to use */ POLYUNSIGNED n /* The number of consecutive zero bits required */ ) const { if (limit + n >= start) return start; // Failure POLYUNSIGNED candidate = start - n; ASSERT (start > limit); while (1) { POLYUNSIGNED bits_free = CountZeroBits(candidate, n); if (n <= bits_free) return candidate; if (candidate < n - bits_free + limit) return start; // Failure candidate -= (n - bits_free); } } // Count the number of set bits in the bitmap. POLYUNSIGNED Bitmap::CountSetBits(POLYUNSIGNED size) const { size_t bytes = (size+7) >> 3; POLYUNSIGNED count = 0; for (size_t i = 0; i < bytes; i++) { unsigned char byte = m_bits[i]; if (byte == 0xff) // Common case count += 8; else { while (byte != 0) { unsigned char b = byte & (-byte); count++; byte -= b; } } } return count; } polyml-5.6/libpolyml/bitmap.h000066400000000000000000000053011265146633400163410ustar00rootroot00000000000000/* Title: Bitmap. Generally used by the garbage collector to indicate allocated words Copyright (c) 2006, 2012 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef BITMAP_H_DEFINED #define BITMAP_H_DEFINED #include "globals.h" // For POLYUNSIGNED class Bitmap { public: Bitmap(): m_bits(0) {} ~Bitmap(); // Allocate the bitmap bits bool Create(POLYUNSIGNED bits); // Free the bitmap bits. void Destroy(); private: static unsigned char BitN(POLYUNSIGNED n) { return 1 << (n & 7); } public: // Set a single bit void SetBit(POLYUNSIGNED n) { m_bits[n >> 3] |= BitN(n); } // Set a range of bits void SetBits(POLYUNSIGNED bitno, POLYUNSIGNED length); // Clear a range of bits. May already be partly clear void ClearBits(POLYUNSIGNED bitno, POLYUNSIGNED length); // Test a bit bool TestBit(POLYUNSIGNED n) const { return (m_bits[n >> 3] & BitN(n)) != 0; } // How many zero bits (maximum n) are there in the bitmap, starting at location start? POLYUNSIGNED CountZeroBits(POLYUNSIGNED bitno, POLYUNSIGNED n) const; //* search the bitmap from the high end down looking for n contiguous zeros POLYUNSIGNED FindFree(POLYUNSIGNED limit, POLYUNSIGNED bitno, POLYUNSIGNED n) const; // How many set bits are there in the bitmap? POLYUNSIGNED CountSetBits(POLYUNSIGNED size) const; private: unsigned char *m_bits; }; // A wrapper class that adds the address range. It is used when scanning // memory to see if an address has already been visited. class VisitBitmap: public Bitmap { public: VisitBitmap(PolyWord *bottom, PolyWord *top): m_bottom(bottom), m_top(top) { (void)Create(top - bottom); } bool AlreadyVisited(PolyObject *p) { return TestBit((PolyWord*)p - m_bottom); } void SetVisited(PolyObject *p) { SetBit((PolyWord*)p - m_bottom); } bool InRange(PolyWord *p) { return p >= m_bottom && p < m_top; } protected: PolyWord *m_bottom; PolyWord *m_top; }; #endif polyml-5.6/libpolyml/check_objects.cpp000066400000000000000000000121301265146633400202040ustar00rootroot00000000000000/* Title: Validate addresses in objects. Copyright (c) 2006, 2012 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "diagnostics.h" #include "machine_dep.h" #include "scanaddrs.h" #include "memmgr.h" #define INRANGE(val,start,end)\ (start <= val && val < end) static void CheckAddress(PolyWord *pt) { MemSpace *space = gMem.SpaceForAddress(pt); if (space == 0) { Log("Check: Bad pointer %p (no space found)\n", pt); ASSERT(space != 0); } if (space->spaceType == ST_IO || space->spaceType == ST_STACK) // These may not have valid length words. return; PolyObject *obj = (PolyObject*)pt; POLYUNSIGNED length = obj->Length(); if (pt+length > space->top) { Log("Check: Bad pointer %p (space %p) length %" POLYUFMT "\n", pt, space, length); ASSERT(pt+length <= space->top); } if (space->spaceType == ST_LOCAL) { LocalMemSpace *lSpace = (LocalMemSpace*)space; if (!((pt > lSpace->bottom && pt+length <= lSpace->lowerAllocPtr) || (pt > lSpace->upperAllocPtr && pt+length <= space->top))) { Log("Check: Bad pointer %p (space %p) length %" POLYUFMT " outside allocated area\n", pt, space, length); ASSERT((pt > lSpace->bottom && pt+length <= lSpace->lowerAllocPtr) || (pt > lSpace->upperAllocPtr && pt+length <= space->top)); } } } void DoCheck (const PolyWord pt) { if (pt == PolyWord::FromUnsigned(0)) return; if (pt.IsTagged()) return; // It's possible that this could be a code address. // That can happen, at least when pushing a value onto the save vec // in a call to set_code_constant on X86/64 if (pt.IsCodePtr()) CheckAddress((PolyWord*)ObjCodePtrToPtr(pt.AsCodePtr())); else CheckAddress(pt.AsStackAddr()); } class ScanCheckAddress: public ScanAddress { public: virtual PolyObject *ScanObjectAddress(PolyObject *pt) { DoCheck(pt); return pt; } }; void DoCheckObject (const PolyObject *base, POLYUNSIGNED L) { PolyWord *pt = (PolyWord*)base; CheckAddress(pt); MemSpace *space = gMem.SpaceForAddress(pt); if (space == 0) Crash ("Bad pointer 0x%08x found", pt); ASSERT (OBJ_IS_LENGTH(L)); POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); if (n == 0) return; ASSERT (n > 0); ASSERT(pt-1 >= space->bottom && pt+n <= space->top); byte flags = GetTypeBits(L); /* discards GC flag and mutable bit */ if (flags == F_BYTE_OBJ) /* possibly signed byte object */ return; /* Nothing more to do */ if (flags == F_CODE_OBJ) /* code object */ { ScanCheckAddress checkAddr; /* We flush the instruction cache here in case we change any of the instructions when we update addresses. */ machineDependent->FlushInstructionCache(pt, (n + 1) * sizeof(PolyWord)); machineDependent->ScanConstantsWithinCode((PolyObject *)base, (PolyObject *)base, n, &checkAddr); /* Skip to the constants. */ base->GetConstSegmentForCode(n, pt, n); } else ASSERT (flags == 0); /* ordinary word object */ while (n--) DoCheck (*pt++); } void DoCheckPointer (const PolyWord pt) { if (pt == PolyWord::FromUnsigned(0)) return; if (OBJ_IS_AN_INTEGER(pt)) return; if (gMem.IsIOPointer(pt.AsAddress())) return; DoCheck (pt); if (pt.IsDataPtr()) { PolyObject *obj = pt.AsObjPtr(); DoCheckObject (obj, obj->LengthWord()); } } // Check all the objects in the memory. Used to check the garbage collector // void DoCheckMemory() { ScanCheckAddress memCheck; // Scan the local areas. for (unsigned i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *space = gMem.lSpaces[i]; memCheck.ScanAddressesInRegion(space->bottom, space->lowerAllocPtr); memCheck.ScanAddressesInRegion(space->upperAllocPtr, space->top); } // Scan the permanent mutable areas. for (unsigned j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (space->isMutable && ! space->byteOnly) memCheck.ScanAddressesInRegion(space->bottom, space->top); } } polyml-5.6/libpolyml/check_objects.h000066400000000000000000000032101265146633400176500ustar00rootroot00000000000000/* Title: check_objects.h - Validate addresses in objects. Copyright (c) 2006, 2012 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CHECK_OBJECTS_INCLUDED #define CHECK_OBJECTS_INCLUDED #include "globals.h" #include "diagnostics.h" // For userOptions extern void DoCheck (const PolyWord pt); extern void DoCheckPointer (const PolyWord pt); extern void DoCheckObject (const PolyObject *base, POLYUNSIGNED lengthWord); extern void DoCheckMemory(void); #define Check(pt) {if (debugOptions & DEBUG_CHECK_OBJECTS) DoCheck(pt); } #define CheckObject(pt) {if (debugOptions & DEBUG_CHECK_OBJECTS) DoCheckObject(pt, (pt)->LengthWord()); } #define CheckObjectL(pt, l) {if (debugOptions & DEBUG_CHECK_OBJECTS) DoCheckObject(pt, l); } #define CheckPointer(pt) {if (debugOptions & DEBUG_CHECK_OBJECTS) DoCheckPointer(pt); } #define CheckMemory() { if (debugOptions & DEBUG_CHECK_OBJECTS) DoCheckMemory(); } #endif polyml-5.6/libpolyml/diagnostics.cpp000066400000000000000000000113271265146633400177340ustar00rootroot00000000000000/* Title: Diagnostics Copyright (c) 2011, 2015 David C.J. Matthews Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STDARG_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include "Console.h" #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #endif #include "errors.h" #include "noreturn.h" #include "globals.h" #include "diagnostics.h" #include "mpoly.h" extern FILE *polyStdout; unsigned debugOptions = 0; // Debugging options requested on command line. /*********************************************************************** * * FAILURE FUNCTIONS (moved here from mmap.c) * ***********************************************************************/ void Exit(const char *msg, ...) { va_list vl; fprintf(polyStdout, "\n"); va_start(vl, msg); vfprintf(polyStdout, msg, vl); va_end(vl); fprintf(polyStdout, "\n"); fflush(polyStdout); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (useConsole) { MessageBox(hMainWindow, _T("Poly/ML has exited"), _T("Poly/ML"), MB_OK); } #endif exit(1); } // Error condition. This should really be replaced either with ASSERTs // or exceptions. void Crash(const char *msg, ...) { va_list vl; fprintf(polyStdout, "\n"); va_start(vl, msg); vfprintf(polyStdout, msg, vl); va_end(vl); fprintf(polyStdout, "\n"); fflush(polyStdout); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (useConsole) { MessageBox(hMainWindow, _T("Poly/ML has exited"), _T("Poly/ML"), MB_OK); } #else { sigset_t set; sigemptyset(&set); sigprocmask(SIG_SETMASK,&set,NULL); } #endif abort(); exit(1); } void ExitWithError(const char *msg, int err) { fputs("\n", polyStdout); fputs(msg, polyStdout); const char *errorMsg = stringFromErrorCode(err); if (errorMsg != NULL) puts(errorMsg); fputs("\n", polyStdout); fflush(polyStdout); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (useConsole) { MessageBox(hMainWindow, _T("Poly/ML has exited"), _T("Poly/ML"), MB_OK); } #endif exit(1); } #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Default is to log with OutputDebugString static FILE *logStream = NULL; #else // Default is to log to stdout static FILE *logStream = stdout; #endif void SetLogFile(const TCHAR *fileName) { #if (defined(_WIN32) && defined(UNICODE)) FILE *stream = _wfopen(fileName, L"w"); if (stream == NULL) fprintf(polyStdout, "Unable to open debug file %S\n", fileName); else logStream = stream; #else FILE *stream = fopen(fileName, "w"); if (stream == NULL) fprintf(polyStdout, "Unable to open debug file %s\n", fileName); else logStream = stream; #endif } // For the moment log to stdout void Log(const char *msg, ...) { va_list vl; va_start(vl, msg); if (logStream) vfprintf(logStream, msg, vl); #if (defined(_WIN32) && ! defined(__CYGWIN__)) char buff[1024]; if (_vsnprintf(buff, sizeof(buff), msg, vl) > 0) ::OutputDebugStringA(buff); #endif va_end(vl); if (logStream) fflush(logStream); } // Log the size of a space as a comprehensible number void LogSize(POLYUNSIGNED wordSize) { POLYUNSIGNED size = wordSize * sizeof(PolyWord); if (size < 10*1024) Log("%" POLYUFMT, size); else { double s = (double)size; if (s < 1024000.0) Log("%1.2fK", s / 1024.0); else if (s < 1000.0 * 1024.0 * 1024.0) Log("%1.2fM", s / (1024.0 * 1024.0)); else Log("%1.2fG", s / (1024.0 * 1024.0 * 1024.0)); } } polyml-5.6/libpolyml/diagnostics.h000066400000000000000000000042001265146633400173710ustar00rootroot00000000000000/* Title: Header for diagnostics.c Copyright (c) 2011-12, 2015 David C.J. Matthews Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _DIAGNOSTICS_H_USED #define _DIAGNOSTICS_H_USED #include "noreturn.h" #include "globals.h" #ifdef HAVE_TCHAR_H #include #else typedef char TCHAR; #endif NORETURNFN(extern void Exit(const char *, ...)); NORETURNFN(extern void Crash(const char *, ...)); NORETURNFN(extern void ExitWithError(const char *, int err)); extern void SetLogFile(const TCHAR *fileName); extern void Log(const char *, ...); extern void LogSize(POLYUNSIGNED wordSize); extern unsigned debugOptions; // debugging flags // Values for debugging flags #define DEBUG_CHECK_OBJECTS 0x001 // Check that addresses are valid. #define DEBUG_GC 0x002 // Summary GC debugging output #define DEBUG_MEMMGR 0x004 // Memory manager output #define DEBUG_GC_DETAIL 0x008 // Detailed GC debugging output #define DEBUG_THREADS 0x010 // Thread-related output #define DEBUG_GCTASKS 0x020 // GC task farm #define DEBUG_HEAPSIZE 0x040 // Heap resizing #define DEBUG_X 0x080 // X-Windows debugging #define DEBUG_SHARING 0x100 // Diagnostics for share-common-data #define DEBUG_CONTENTION 0x200 // Information about contended locks #define DEBUG_RTSCALLS 0x400 // Information about run-time calls. #endif polyml-5.6/libpolyml/elfexport.cpp000066400000000000000000000567571265146633400174550ustar00rootroot00000000000000/* Title: Write out a database as an ELF object file Author: David Matthews. Copyright (c) 2006-7, 2011 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDDEF_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_ELF_H #include #elif defined(HAVE_ELF_ABI_H) #include #include #ifndef EM_X86_64 #define EM_X86_64 EM_AMD64 #endif #if defined(HOSTARCHITECTURE_X86_64) #ifndef R_386_PC32 #define R_386_PC32 R_X86_64_PC32 #endif #ifndef R_386_32 #define R_386_32 R_X86_64_32 #endif #ifndef R_X86_64_64 #define R_X86_64_64 R_X86_64_64 #endif #endif /* HOSTARCHITECTURE_X86_64 */ #endif // Solaris seems to put processor-specific constants in separate files #ifdef HAVE_SYS_ELF_SPARC_H #include #endif #ifdef HAVE_SYS_ELF_386_H #include #endif #ifdef HAVE_SYS_ELF_AMD64_H #include #endif // Android has the ARM relocation symbol here #ifdef HAVE_ASM_ELF_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #include "globals.h" #include "diagnostics.h" #include "sys.h" #include "machine_dep.h" #include "gc.h" #include "mpoly.h" #include "scanaddrs.h" #include "elfexport.h" #include "run_time.h" #include "version.h" #include "polystring.h" #define sym_last_local_sym sym_data_section // The first two symbols are special: // Zero is always special in ELF // 1 is used for the data section #define EXTRA_SYMBOLS 2 static unsigned AreaToSym(unsigned area) { return area+EXTRA_SYMBOLS; } // Section table entries enum { sect_initial = 0, sect_sectionnametable, sect_stringtable, // Data and relocation entries come in here. sect_data // Finally the symbol table }; // Generate the address relative to the start of the segment. void ELFExport::setRelocationAddress(void *p, ElfXX_Addr *reloc) { unsigned area = findArea(p); POLYUNSIGNED offset = (char*)p - (char*)memTable[area].mtAddr; *reloc = offset; } /* Get the index corresponding to an address. */ PolyWord ELFExport::createRelocation(PolyWord p, void *relocAddr) { void *addr = p.AsAddress(); unsigned addrArea = findArea(addr); POLYUNSIGNED offset = (char*)addr - (char*)memTable[addrArea].mtAddr; if (useRela) { ElfXX_Rela reloc; // Set the offset within the section we're scanning. setRelocationAddress(relocAddr, &reloc.r_offset); reloc.r_info = ELFXX_R_INFO(AreaToSym(addrArea), directReloc); reloc.r_addend = offset; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; return PolyWord::FromUnsigned(0); } else { ElfXX_Rel reloc; setRelocationAddress(relocAddr, &reloc.r_offset); reloc.r_info = ELFXX_R_INFO(AreaToSym(addrArea), directReloc); fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; return PolyWord::FromUnsigned(offset); } } /* This is called for each constant within the code. Print a relocation entry for the word and return a value that means that the offset is saved in original word. */ void ELFExport::ScanConstant(byte *addr, ScanRelocationKind code) { PolyWord p = GetConstantValue(addr, code); if (IS_INT(p) || p == PolyWord::FromUnsigned(0)) return; void *a = p.AsAddress(); unsigned aArea = findArea(a); // We don't need a relocation if this is relative to the current segment // since the relative address will already be right. if (code == PROCESS_RELOC_I386RELATIVE && aArea == findArea(addr)) return; // Set the value at the address to the offset relative to the symbol. POLYUNSIGNED offset = (char*)a - (char*)memTable[aArea].mtAddr; switch (code) { case PROCESS_RELOC_DIRECT: // 32 or 64 bit address of target { PolyWord r = createRelocation(p, addr); POLYUNSIGNED w = r.AsUnsigned(); for (unsigned i = 0; i < sizeof(PolyWord); i++) { addr[i] = (byte)(w & 0xff); w >>= 8; } } break; #if(defined(HOSTARCHITECTURE_X86) || defined(HOSTARCHITECTURE_X86_64)) #ifdef HOSTARCHITECTURE_X86 #define R_PC_RELATIVE R_386_PC32 #else #define R_PC_RELATIVE R_X86_64_PC32 #endif case PROCESS_RELOC_I386RELATIVE: // 32 bit relative address { if (useRela) { ElfXX_Rela reloc; setRelocationAddress(addr, &reloc.r_offset); // We seem to need to subtract 4 bytes to get the correct offset in ELF offset -= 4; reloc.r_info = ELFXX_R_INFO(AreaToSym(aArea), R_PC_RELATIVE); reloc.r_addend = offset; // Clear the field. Even though it's not supposed to be used with Rela the // Linux linker at least seems to add the value in here sometimes. memset(addr, 0, 4); fwrite(&reloc, sizeof(reloc), 1, exportFile); } else { ElfXX_Rel reloc; setRelocationAddress(addr, &reloc.r_offset); // We seem to need to subtract 4 bytes to get the correct offset in ELF offset -= 4; reloc.r_info = ELFXX_R_INFO(AreaToSym(aArea), R_PC_RELATIVE); for (unsigned i = 0; i < 4; i++) { addr[i] = (byte)(offset & 0xff); offset >>= 8; } fwrite(&reloc, sizeof(reloc), 1, exportFile); } relocationCount++; } break; #endif default: ASSERT(0); // Wrong type of relocation for this architecture. } } unsigned long ELFExport::makeStringTableEntry(const char *str, ExportStringTable *stab) { if (str == NULL || str[0] == 0) return 0; // First entry is the null string. else return stab->makeEntry(str); } void ELFExport::writeSymbol(const char *symbolName, long value, long size, int binding, int sttype, int section) { ElfXX_Sym symbol; memset(&symbol, 0, sizeof(symbol)); // Zero unused fields symbol.st_name = makeStringTableEntry(symbolName, &symStrings); symbol.st_value = value; symbol.st_size = size; symbol.st_info = ELFXX_ST_INFO(binding, sttype); symbol.st_other = 0; symbol.st_shndx = section; fwrite(&symbol, sizeof(symbol), 1, exportFile); symbolCount++; } // Set the file alignment. void ELFExport::alignFile(int align) { char pad[32]; // Maximum alignment int offset = ftell(exportFile); memset(pad, 0, sizeof(pad)); if ((offset % align) == 0) return; fwrite(&pad, align - (offset % align), 1, exportFile); } void ELFExport::createStructsRelocation(unsigned sym, POLYUNSIGNED offset, POLYSIGNED addend) { if (useRela) { ElfXX_Rela reloc; reloc.r_info = ELFXX_R_INFO(sym, directReloc); reloc.r_offset = offset; reloc.r_addend = addend; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } else { ElfXX_Rel reloc; reloc.r_info = ELFXX_R_INFO(sym, directReloc); reloc.r_offset = offset; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } } void ELFExport::exportStore(void) { PolyWord *p; ElfXX_Ehdr fhdr; ElfXX_Shdr *sections = 0; unsigned numSections = 6 + 2*memTableEntries; // The symbol table comes at the end. unsigned sect_symtab = sect_data + 2*memTableEntries + 2; unsigned i; // Both the string tables have an initial null entry. symStrings.makeEntry(""); sectionStrings.makeEntry(""); // Write out initial values for the headers. These are overwritten at the end. // File header memset(&fhdr, 0, sizeof(fhdr)); fhdr.e_ident[EI_MAG0] = 0x7f; fhdr.e_ident[EI_MAG1] = 'E'; fhdr.e_ident[EI_MAG2] = 'L'; fhdr.e_ident[EI_MAG3] = 'F'; fhdr.e_ident[EI_CLASS] = ELFCLASSXX; // ELFCLASS32 or ELFCLASS64 fhdr.e_ident[EI_VERSION] = EV_CURRENT; { union { unsigned long wrd; char chrs[sizeof(unsigned long)]; } endian; endian.wrd = 1; if (endian.chrs[0] == 0) fhdr.e_ident[EI_DATA] = ELFDATA2MSB; // Big endian else fhdr.e_ident[EI_DATA] = ELFDATA2LSB; // Little endian } fhdr.e_type = ET_REL; // The machine needs to match the machine we're compiling for // even if this is actually portable code. #if defined(HOSTARCHITECTURE_X86) fhdr.e_machine = EM_386; directReloc = R_386_32; useRela = false; #elif defined(HOSTARCHITECTURE_PPC) fhdr.e_machine = EM_PPC; directReloc = R_PPC_ADDR32; useRela = true; #elif defined(HOSTARCHITECTURE_PPC64) fhdr.e_machine = EM_PPC64; directReloc = R_PPC64_ADDR64; useRela = true; #elif defined(HOSTARCHITECTURE_SPARC) fhdr.e_machine = EM_SPARC; directReloc = R_SPARC_32; useRela = true; /* Sparc/Solaris, at least 2.8, requires ELF32_Rela relocations. For some reason, though, it adds the value in the location being relocated (as with ELF32_Rel relocations) as well as the addend. To be safe, whenever we use an ELF32_Rela relocation we always zero the location to be relocated. */ #elif defined(HOSTARCHITECTURE_X86_64) /* It seems Solaris/X86-64 only supports ELF64_Rela relocations. It appears that Linux will support either so we now use Rela on X86-64. */ fhdr.e_machine = EM_X86_64; directReloc = R_X86_64_64; useRela = true; #elif defined(HOSTARCHITECTURE_ARM) #ifndef EF_ARM_EABI_VER4 #define EF_ARM_EABI_VER4 0x04000000 #endif // When linking ARM binaries the linker checks the ABI version. We // need to set the version to the same as the libraries. // GCC currently uses version 4. fhdr.e_machine = EM_ARM; directReloc = R_ARM_ABS32; useRela = false; fhdr.e_flags = EF_ARM_EABI_VER4; #elif defined(HOSTARCHITECTURE_IA64) fhdr.e_machine = EM_IA_64; directReloc = R_IA64_DIR64LSB; fhdr.e_flags = EF_IA_64_ABI64; useRela = true; #elif defined(HOSTARCHITECTURE_AARCH64) fhdr.e_machine = EM_AARCH64; directReloc = R_AARCH64_ABS64; useRela = true; #elif defined(HOSTARCHITECTURE_MIPS) fhdr.e_machine = EM_MIPS; directReloc = R_MIPS_32; useRela = true; #else #error "No support for exporting on this architecture" #endif fhdr.e_version = EV_CURRENT; fhdr.e_shoff = sizeof(fhdr); // Offset to section header - immediately follows fhdr.e_ehsize = sizeof(fhdr); fhdr.e_shentsize = sizeof(ElfXX_Shdr); fhdr.e_shnum = numSections; fhdr.e_shstrndx = sect_sectionnametable; // Section name table section index; fwrite(&fhdr, sizeof(fhdr), 1, exportFile); // Write it for the moment. sections = new ElfXX_Shdr[numSections]; memset(sections, 0, sizeof(ElfXX_Shdr) * numSections); // Necessary? // Set up the section header but don't write it yet. // Section 0 - all zeros sections[sect_initial].sh_type = SHT_NULL; sections[sect_initial].sh_link = SHN_UNDEF; // Section name table. sections[sect_sectionnametable].sh_name = makeStringTableEntry(".shstrtab", §ionStrings); sections[sect_sectionnametable].sh_type = SHT_STRTAB; sections[sect_sectionnametable].sh_addralign = sizeof(char); // sections[sect_sectionnametable].sh_offset is set later // sections[sect_sectionnametable].sh_size is set later // Symbol name table. sections[sect_stringtable].sh_name = makeStringTableEntry(".strtab", §ionStrings); sections[sect_stringtable].sh_type = SHT_STRTAB; sections[sect_stringtable].sh_addralign = sizeof(char); // sections[sect_stringtable].sh_offset is set later // sections[sect_stringtable].sh_size is set later unsigned long dataName = makeStringTableEntry(".data", §ionStrings); unsigned long dataRelName = makeStringTableEntry(useRela ? ".rela.data" : ".rel.data", §ionStrings); unsigned long textName = makeStringTableEntry(".text", §ionStrings); unsigned long textRelName = makeStringTableEntry(useRela ? ".rela.text" : ".rel.text", §ionStrings); // Main data sections. Each one has a relocation section. for (i=0; i < memTableEntries; i++) { unsigned s = sect_data + i*2; sections[s].sh_type = SHT_PROGBITS; sections[s].sh_addralign = 8; // 8-byte alignment if (memTable[i].mtFlags & MTF_WRITEABLE) { // Mutable areas ASSERT(!(memTable[i].mtFlags & MTF_EXECUTABLE)); // Executable areas can't be writable. sections[s].sh_name = dataName; sections[s].sh_flags = SHF_WRITE | SHF_ALLOC; sections[s+1].sh_name = dataRelName; // Name of relocation section } else { // Immutable areas are marked as executable. sections[s].sh_name = textName; sections[s].sh_flags = SHF_ALLOC | SHF_EXECINSTR; sections[s+1].sh_name = textRelName; // Name of relocation section } // sections[s].sh_size is set later // sections[s].sh_offset is set later. // sections[s].sh_size is set later. // Relocation section sections[s+1].sh_type = useRela ? SHT_RELA : SHT_REL; // Contains relocation with/out explicit addends (ElfXX_Rel) sections[s+1].sh_link = sect_symtab; // Index to symbol table sections[s+1].sh_info = s; // Applies to the data section sections[s+1].sh_addralign = sizeof(long); // Align to a word sections[s+1].sh_entsize = useRela ? sizeof(ElfXX_Rela) : sizeof(ElfXX_Rel); // sections[s+1].sh_offset is set later. // sections[s+1].sh_size is set later. } // Table data - Poly tables that describe the memory layout. unsigned sect_table_data = sect_data+2*memTableEntries; sections[sect_table_data].sh_name = dataName; sections[sect_table_data].sh_type = SHT_PROGBITS; sections[sect_table_data].sh_flags = SHF_WRITE | SHF_ALLOC; sections[sect_table_data].sh_addralign = 8; // 8-byte alignment // Table relocation sections[sect_table_data+1].sh_name = dataRelName; sections[sect_table_data+1].sh_type = useRela ? SHT_RELA : SHT_REL; // Contains relocation with/out explicit addends (ElfXX_Rel) sections[sect_table_data+1].sh_link = sect_symtab; // Index to symbol table sections[sect_table_data+1].sh_info = sect_table_data; // Applies to table section sections[sect_table_data+1].sh_addralign = sizeof(long); // Align to a word sections[sect_table_data+1].sh_entsize = useRela ? sizeof(ElfXX_Rela) : sizeof(ElfXX_Rel); // Symbol table. sections[sect_symtab].sh_name = makeStringTableEntry(".symtab", §ionStrings); sections[sect_symtab].sh_type = SHT_SYMTAB; sections[sect_symtab].sh_link = sect_stringtable; // String table to use sections[sect_symtab].sh_addralign = sizeof(long); // Align to a word sections[sect_symtab].sh_entsize = sizeof(ElfXX_Sym); // sections[sect_symtab].sh_info is set later // sections[sect_symtab].sh_size is set later // sections[sect_symtab].sh_offset is set later // First the symbol table. alignFile(sections[sect_symtab].sh_addralign); sections[sect_symtab].sh_offset = ftell(exportFile); writeSymbol("", 0, 0, 0, 0, 0); // Initial symbol // Write the local symbols first. writeSymbol("", 0, 0, STB_LOCAL, STT_SECTION, sect_data); // .data section // Create symbols for the address areas. AreaToSym assumes these come first. for (i = 0; i < memTableEntries; i++) { if (i == ioMemEntry) writeSymbol("ioarea", 0, 0, STB_LOCAL, STT_OBJECT, sect_data+i*2); else { char buff[50]; sprintf(buff, "area%1u", i); writeSymbol(buff, 0, 0, STB_LOCAL, STT_OBJECT, sect_data+i*2); } } // Extra symbols to help debugging. for (i = 0; i < memTableEntries; i++) { if (i != ioMemEntry) { char buff[50]; // Write the names of the functions as local symbols. This isn't necessary // but it makes debugging easier since the function names appear in gdb. char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); if (length != 0 && obj->IsCodeObject()) { PolyWord *name = obj->ConstPtrForCode(); // Copy as much of the name as will fit and ignore any extra. // Do we need to worry about duplicates? (void)Poly_string_to_C(*name, buff, sizeof(buff)); writeSymbol(buff, ((char*)p - start), 0, STB_LOCAL, STT_OBJECT, sect_data+i*2); } p += length; } } } // Global symbols - Just one: poly_exports writeSymbol("poly_exports", 0, sizeof(exportDescription)+sizeof(memoryTableEntry)*memTableEntries, STB_GLOBAL, STT_OBJECT, sect_table_data); sections[sect_symtab].sh_info = symbolCount-1; // One more than last local sym sections[sect_symtab].sh_size = sizeof(ElfXX_Sym) * symbolCount; // Write the relocations. for (i = 0; i < memTableEntries; i++) { unsigned relocSection = sect_data+i*2+1; alignFile(sections[relocSection].sh_addralign); sections[relocSection].sh_offset = ftell(exportFile); relocationCount = 0; if (i != ioMemEntry) // Don't relocate the IO area { // Create the relocation table and turn all addresses into offsets. char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); // Update any constants before processing the object // We need that for relative jumps/calls in X86/64. if (length != 0 && obj->IsCodeObject()) machineDependent->ScanConstantsWithinCode(obj, this); relocateObject(obj); p += length; } } sections[relocSection].sh_size = relocationCount * (useRela ? sizeof(ElfXX_Rela) : sizeof(ElfXX_Rel)); } // Relocations for "exports" and "memTable"; alignFile(sections[sect_table_data+1].sh_addralign); sections[sect_table_data+1].sh_offset = ftell(exportFile); relocationCount = 0; // TODO: This won't be needed if we put these in a separate section. POLYUNSIGNED areaSpace = 0; for (i = 0; i < memTableEntries; i++) areaSpace += memTable[i].mtLength; // Address of "memTable" within "exports". We can't use createRelocation because // the position of the relocation is not in either the mutable or the immutable area. POLYSIGNED memTableOffset = (POLYSIGNED)sizeof(exportDescription); // It follows immediately after this. createStructsRelocation(symbolCount-1 /* Last symbol */, offsetof(exportDescription, memTable), memTableOffset); // Address of "rootFunction" within "exports" unsigned rootAddrArea = findArea(rootFunction); POLYSIGNED rootOffset = (char*)rootFunction - (char*)memTable[rootAddrArea].mtAddr; createStructsRelocation(AreaToSym(rootAddrArea), offsetof(exportDescription, rootFunction), rootOffset); // Addresses of the areas within memtable. for (i = 0; i < memTableEntries; i++) { createStructsRelocation(AreaToSym(i), sizeof(exportDescription) + i * sizeof(memoryTableEntry) + offsetof(memoryTableEntry, mtAddr), 0 /* No offset relative to base symbol*/); } sections[sect_table_data+1].sh_size = relocationCount * (useRela ? sizeof(ElfXX_Rela) : sizeof(ElfXX_Rel)); // Now the binary data. // Now the binary data. for (i = 0; i < memTableEntries; i++) { unsigned dataSection = sect_data+i*2; alignFile(sections[dataSection].sh_addralign); sections[dataSection].sh_offset = ftell(exportFile); sections[dataSection].sh_size = memTable[i].mtLength; fwrite(memTable[i].mtAddr, 1, memTable[i].mtLength, exportFile); } exportDescription exports; memset(&exports, 0, sizeof(exports)); exports.structLength = sizeof(exportDescription); exports.memTableSize = sizeof(memoryTableEntry); exports.memTableEntries = memTableEntries; exports.ioIndex = 0; // The io entry is the first in the memory table exports.memTable = useRela ? 0 : (memoryTableEntry *)memTableOffset; // Set the value to be the offset relative to the base of the area. We have set a relocation // already which will add the base of the area. exports.rootFunction = useRela ? 0 : (void*)rootOffset; exports.timeStamp = time(NULL); exports.ioSpacing = ioSpacing; exports.architecture = machineDependent->MachineArchitecture(); exports.rtsVersion = POLY_version_number; // Set the address values to zero before we write. They will always // be relative to their base symbol. for (i = 0; i < memTableEntries; i++) memTable[i].mtAddr = 0; // Now the binary data. alignFile(sections[sect_table_data].sh_addralign); sections[sect_table_data].sh_offset = ftell(exportFile); sections[sect_table_data].sh_size = sizeof(exportDescription) + memTableEntries*sizeof(memoryTableEntry); fwrite(&exports, sizeof(exports), 1, exportFile); fwrite(memTable, sizeof(memoryTableEntry), memTableEntries, exportFile); // The section name table sections[sect_sectionnametable].sh_offset = ftell(exportFile); fwrite(sectionStrings.strings, sectionStrings.stringSize, 1, exportFile); sections[sect_sectionnametable].sh_size = sectionStrings.stringSize; // The symbol name table sections[sect_stringtable].sh_offset = ftell(exportFile); fwrite(symStrings.strings, symStrings.stringSize, 1, exportFile); sections[sect_stringtable].sh_size = symStrings.stringSize; // Finally the section headers. alignFile(4); fhdr.e_shoff = ftell(exportFile); fwrite(sections, sizeof(ElfXX_Shdr) * numSections, 1, exportFile); // Rewind to rewrite the file header with the offset of the section headers. rewind(exportFile); fwrite(&fhdr, sizeof(fhdr), 1, exportFile); fclose(exportFile); exportFile = NULL; delete[]sections; } polyml-5.6/libpolyml/elfexport.h000066400000000000000000000062501265146633400171010ustar00rootroot00000000000000/* Title: Export memory as an ELF object file Author: David C. J. Matthews. Copyright (c) 2006 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ELFExport_H_INCLUDED #define ELFExport_H_INCLUDED #include "config.h" #include "scanaddrs.h" // For base class #include "exporter.h" #ifdef HAVE_ELF_H #include #endif #ifdef HAVE_ELF_ABI_H #include #endif // Select 32 or 64 bit version depending on the word length #if (SIZEOF_VOIDP == 8) #define ElfXX_Addr Elf64_Addr #define ElfXX_Rel Elf64_Rel #define ElfXX_Rela Elf64_Rela #define ElfXX_Sym Elf64_Sym #define ElfXX_Ehdr Elf64_Ehdr #define ElfXX_Shdr Elf64_Shdr // Include a cast on the next line. Linux includes this anyway but it's needed for FreeBSD. #define ELFXX_R_INFO(_y, _z) ELF64_R_INFO((Elf64_Xword)(_y), _z) #define ELFXX_ST_INFO(_y, _z) ELF64_ST_INFO(_y, _z) #define ELFCLASSXX ELFCLASS64 #else #define ElfXX_Addr Elf32_Addr #define ElfXX_Rel Elf32_Rel #define ElfXX_Rela Elf32_Rela #define ElfXX_Sym Elf32_Sym #define ElfXX_Ehdr Elf32_Ehdr #define ElfXX_Shdr Elf32_Shdr #define ELFXX_R_INFO(_y, _z) ELF32_R_INFO(_y, _z) #define ELFXX_ST_INFO(_y, _z) ELF32_ST_INFO(_y, _z) #define ELFCLASSXX ELFCLASS32 #endif class TaskData; class ELFExport: public Exporter, public ScanAddress { public: ELFExport(): relocationCount(0), symbolCount(0), directReloc(0) {} public: virtual void exportStore(void); private: // ScanAddress overrides virtual void ScanConstant(byte *addrOfConst, ScanRelocationKind code); // At the moment we should only get calls to ScanConstant. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } private: void setRelocationAddress(void *p, ElfXX_Addr *reloc); PolyWord createRelocation(PolyWord p, void *relocAddr); void writeSymbol(const char *symbolName, long value, long size, int binding, int sttype, int section); unsigned long makeStringTableEntry(const char *str, ExportStringTable *stab); void alignFile(int align); void createStructsRelocation(unsigned area, POLYUNSIGNED offset, POLYSIGNED addend); unsigned relocationCount; unsigned symbolCount; // There are two tables - one is used for section names, the other for symbol names. ExportStringTable symStrings, sectionStrings; unsigned directReloc; bool useRela; // True if we should ElfXX_Rela rather than ElfXX_Rel TaskData *taskData; // Needed for exceptions. }; #endif polyml-5.6/libpolyml/errors.cpp000066400000000000000000001543461265146633400167520ustar00rootroot00000000000000/* Title: Error Messages. Copyright (c) 2012 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "errors.h" static struct { int errorNum; const char* errorString; } errortable[] = { #ifdef EPERM { EPERM, "EPERM" }, #endif #ifdef ENOENT { ENOENT, "ENOENT" }, #endif #ifdef ESRCH { ESRCH, "ESRCH" }, #endif #ifdef EINTR { EINTR, "EINTR"}, #endif #ifdef EIO { EIO, "EIO"}, #endif #ifdef ENXIO { ENXIO, "ENXIO"}, #endif #ifdef E2BIG { E2BIG, "E2BIG"}, #endif #ifdef ENOEXEC { ENOEXEC, "ENOEXEC"}, #endif #ifdef EBADF { EBADF, "EBADF"}, #endif #ifdef ECHILD { ECHILD, "ECHILD"}, #endif #ifdef EAGAIN { EAGAIN, "EAGAIN"}, #endif #ifdef EDEADLK { EDEADLK, "EDEADLK"}, #endif #ifdef ENOMEM { ENOMEM, "ENOMEM"}, #endif #ifdef EACCES { EACCES, "EACCES"}, #endif #ifdef EFAULT { EFAULT, "EFAULT"}, #endif #ifdef ENOTBLK { ENOTBLK, "ENOTBLK"}, #endif #ifdef EBUSY { EBUSY, "EBUSY"}, #endif #ifdef EEXIST { EEXIST, "EEXIST"}, #endif #ifdef EXDEV { EXDEV, "EXDEV"}, #endif #ifdef ENODEV { ENODEV, "ENODEV"}, #endif #ifdef ENOTDIR { ENOTDIR, "ENOTDIR"}, #endif #ifdef EISDIR { EISDIR, "EISDIR"}, #endif #ifdef EINVAL { EINVAL, "EINVAL"}, #endif #ifdef ENFILE { ENFILE, "ENFILE"}, #endif #ifdef EMFILE { EMFILE, "EMFILE"}, #endif #ifdef ENOTTY { ENOTTY, "ENOTTY"}, #endif #ifdef ETXTBSY { ETXTBSY, "ETXTBSY"}, #endif #ifdef EFBIG { EFBIG, "EFBIG"}, #endif #ifdef ENOSPC { ENOSPC, "ENOSPC"}, #endif #ifdef ESPIPE { ESPIPE, "ESPIPE"}, #endif #ifdef EROFS { EROFS, "EROFS"}, #endif #ifdef EMLINK { EMLINK, "EMLINK"}, #endif #ifdef EPIPE { EPIPE, "EPIPE"}, #endif #ifdef EDOM { EDOM, "EDOM"}, #endif #ifdef ERANGE { ERANGE, "ERANGE"}, #endif #ifdef ENOMSG { ENOMSG, "ENOMSG"}, #endif #ifdef EUCLEAN { EUCLEAN, "EUCLEAN"}, #endif #ifdef EWOULDBLOCK { EWOULDBLOCK, "EWOULDBLOCK"}, #endif #ifdef EIDRM { EIDRM, "EIDRM"}, #endif #ifdef EINPROGRESS { EINPROGRESS, "EINPROGRESS"}, #endif #ifdef ECHRNG { ECHRNG, "ECHRNG"}, #endif #ifdef EALREADY { EALREADY, "EALREADY"}, #endif #ifdef EL2NSYNC { EL2NSYNC, "EL2NSYNC"}, #endif #ifdef ENAMETOOLONG { ENAMETOOLONG, "ENAMETOOLONG"}, #endif #ifdef ENOTSOCK { ENOTSOCK, "ENOTSOCK"}, #endif #ifdef EL3HLT { EL3HLT, "EL3HLT"}, #endif #ifdef ENOLCK { ENOLCK, "ENOLCK"}, #endif #ifdef EDESTADDRREQ { EDESTADDRREQ, "EDESTADDRREQ"}, #endif #ifdef EL3RST { EL3RST, "EL3RST"}, #endif #ifdef ENOSYS { ENOSYS, "ENOSYS"}, #endif #ifdef EMSGSIZE { EMSGSIZE, "EMSGSIZE"}, #endif #ifdef ELNRNG { ELNRNG, "ELNRNG"}, #endif #ifdef ENOTEMPTY { ENOTEMPTY, "ENOTEMPTY"}, #endif #ifdef EPROTOTYPE { EPROTOTYPE, "EPROTOTYPE"}, #endif #ifdef EUNATCH { EUNATCH, "EUNATCH"}, #endif #ifdef EILSEQ { EILSEQ, "EILSEQ"}, #endif #ifdef ENOPROTOOPT { ENOPROTOOPT, "ENOPROTOOPT"}, #endif #ifdef ENOCSI { ENOCSI, "ENOCSI"}, #endif #ifdef EPROTONOSUPPORT { EPROTONOSUPPORT, "EPROTONOSUPPORT"}, #endif #ifdef EL2HLT { EL2HLT, "EL2HLT"}, #endif #ifdef ESOCKTNOSUPPORT { ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT"}, #endif #ifdef EOPNOTSUPP { EOPNOTSUPP, "EOPNOTSUPP"}, #endif #ifdef ENOTREADY { ENOTREADY, "ENOTREADY"}, #endif #ifdef EPFNOSUPPORT { EPFNOSUPPORT, "EPFNOSUPPORT"}, #endif #ifdef EWRPROTECT { EWRPROTECT, "EWRPROTECT"}, #endif #ifdef EAFNOSUPPORT { EAFNOSUPPORT, "EAFNOSUPPORT"}, #endif #ifdef EFORMAT { EFORMAT, "EFORMAT"}, #endif #ifdef EADDRINUSE { EADDRINUSE, "EADDRINUSE"}, #endif #ifdef EADDRNOTAVAIL { EADDRNOTAVAIL, "EADDRNOTAVAIL"}, #endif #ifdef ENOCONNECT { ENOCONNECT, "ENOCONNECT"}, #endif #ifdef ENETDOWN { ENETDOWN, "ENETDOWN"}, #endif #ifdef ESTALE { ESTALE, "ESTALE"}, #endif #ifdef ENETUNREACH { ENETUNREACH, "ENETUNREACH"}, #endif #ifdef EDIST { EDIST, "EDIST"}, #endif #ifdef ENETRESET { ENETRESET, "ENETRESET"}, #endif #ifdef ECONNABORTED { ECONNABORTED, "ECONNABORTED"}, #endif #ifdef ECONNRESET { ECONNRESET, "ECONNRESET"}, #endif #ifdef ENOBUFS { ENOBUFS, "ENOBUFS"}, #endif #ifdef EISCONN { EISCONN, "EISCONN"}, #endif #ifdef ENOTCONN { ENOTCONN, "ENOTCONN"}, #endif #ifdef ESHUTDOWN { ESHUTDOWN, "ESHUTDOWN"}, #endif #ifdef ETOOMANYREFS { ETOOMANYREFS, "ETOOMANYREFS"}, #endif #ifdef ETIMEDOUT { ETIMEDOUT, "ETIMEDOUT"}, #endif #ifdef ECONNREFUSED { ECONNREFUSED, "ECONNREFUSED"}, #endif #ifdef ELOOP { ELOOP, "ELOOP"}, #endif #ifdef EHOSTDOWN { EHOSTDOWN, "EHOSTDOWN"}, #endif #ifdef EHOSTUNREACH { EHOSTUNREACH, "EHOSTUNREACH"}, #endif #ifdef EPROCLIM { EPROCLIM, "EPROCLIM"}, #endif #ifdef EUSERS { EUSERS, "EUSERS"}, #endif #ifdef EDQUOT { EDQUOT, "EDQUOT"}, #endif #ifdef EREMOTE { EREMOTE, "EREMOTE"}, #endif #ifdef ENOSTR { ENOSTR, "ENOSTR"}, #endif #ifdef EBADRPC { EBADRPC, "EBADRPC"}, #endif #ifdef ETIME { ETIME, "ETIME"}, #endif #ifdef ERPCMISMATCH { ERPCMISMATCH, "ERPCMISMATCH"}, #endif #ifdef ENOSR { ENOSR, "ENOSR"}, #endif #ifdef EPROGUNAVAIL { EPROGUNAVAIL, "EPROGUNAVAIL"}, #endif #ifdef EPROGMISMATCH { EPROGMISMATCH, "EPROGMISMATCH"}, #endif #ifdef EBADMSG { EBADMSG, "EBADMSG"}, #endif #ifdef EPROCUNAVAIL { EPROCUNAVAIL, "EPROCUNAVAIL"}, #endif #ifdef EFTYPE { EFTYPE, "EFTYPE"}, #endif #ifdef ENONET { ENONET, "ENONET"}, #endif #ifdef EAUTH { EAUTH, "EAUTH"}, #endif #ifdef ERESTART { ERESTART, "ERESTART"}, #endif #ifdef ERREMOTE { ERREMOTE, "ERREMOTE"}, #endif #ifdef ENEEDAUTH { ENEEDAUTH, "ENEEDAUTH"}, #endif #ifdef ENOLINK { ENOLINK, "ENOLINK"}, #endif #ifdef EADV { EADV, "EADV"}, #endif #ifdef ESRMNT { ESRMNT, "ESRMNT"}, #endif #ifdef ECOMM { ECOMM, "ECOMM"}, #endif #ifdef EPROTO { EPROTO, "EPROTO"}, #endif #ifdef EMULTIHOP { EMULTIHOP, "EMULTIHOP"}, #endif #ifdef EDOTDOT { EDOTDOT, "EDOTDOT"}, #endif #ifdef EREMCHG { EREMCHG, "EREMCHG"}, #endif #ifdef EMEDIA { EMEDIA, "EMEDIA"}, #endif #ifdef ESOFT { ESOFT, "ESOFT"}, #endif #ifdef ENOATTR { ENOATTR, "ENOATTR"}, #endif #ifdef ESAD { ESAD, "ESAD"}, #endif #ifdef ENOTRUST { ENOTRUST, "ENOTRUST"}, #endif #ifdef ECANCELED { ECANCELED, "ECANCELED"}, #endif #ifdef ENODATA { ENODATA, "ENODATA"}, #endif #ifdef EBADE { EBADE, "EBADE"}, #endif #ifdef EBADR { EBADR, "EBADR"}, #endif #ifdef EXFULL { EXFULL, "EXFULL"}, #endif #ifdef ENOANO { ENOANO, "ENOANO"}, #endif #ifdef EBADRQC { EBADRQC, "EBADRQC"}, #endif #ifdef EBADSLT { EBADSLT, "EBADSLT"}, #endif #ifdef EDEADLOCK { EDEADLOCK, "EDEADLOCK"}, #endif #ifdef EBFONT { EBFONT, "EBFONT"}, #endif #ifdef EBFONT { EBFONT, "EBFONT"}, #endif #ifdef ENOPKG { ENOPKG, "ENOPKG"}, #endif #ifdef ELBIN { ELBIN, "ELBIN"}, #endif #ifdef ENOTUNIQ { ENOTUNIQ, "ENOTUNIQ"}, #endif #ifdef EBADFD { EBADFD, "EBADFD"}, #endif #ifdef ELIBACC { ELIBACC, "ELIBACC"}, #endif #ifdef ELIBBAD { ELIBBAD, "ELIBBAD"}, #endif #ifdef ELIBSCN { ELIBSCN, "ELIBSCN"}, #endif #ifdef ELIBMAX { ELIBMAX, "ELIBMAX"}, #endif #ifdef ESTRPIPE { ESTRPIPE, "ESTRPIPE"}, #endif #ifdef ELIBEXEC { ELIBEXEC, "ELIBEXEC"}, #endif #ifdef ENMFILE { ENMFILE, "ENMFILE"}, #endif #ifdef ENOTNAM { ENOTNAM, "ENOTNAM"}, #endif #ifdef ENAVAIL { ENAVAIL, "ENAVAIL"}, #endif #ifdef EISNAM { EISNAM, "EISNAM"}, #endif #ifdef EREMOTEIO { EREMOTEIO, "EREMOTEIO"}, #endif #ifdef ENOMEDIUM { ENOMEDIUM, "ENOMEDIUM"}, #endif #ifdef EMEDIUMTYPE { EMEDIUMTYPE, "EMEDIUMTYPE"}, #endif #ifdef ENOKEY { ENOKEY, "ENOKEY"}, #endif #ifdef EKEYEXPIRED { EKEYEXPIRED, "EKEYEXPIRED"}, #endif #ifdef EKEYREVOKED { EKEYREVOKED, "EKEYREVOKED"}, #endif #ifdef EKEYREJECTED { EKEYREJECTED, "EKEYREJECTED"}, #endif #ifdef EOWNERDEAD { EOWNERDEAD, "EOWNERDEAD"}, #endif #ifdef ENOTRECOVERABLE { ENOTRECOVERABLE, "ENOTRECOVERABLE"}, #endif #ifdef ENOTSUP { ENOTSUP, "ENOTSUP"}, #endif #ifdef ENOMEDIUM { ENOMEDIUM, "ENOMEDIUM"}, #endif #ifdef ENOSHARE { ENOSHARE, "ENOSHARE"}, #endif #ifdef ECASECLASH { ECASECLASH, "ECASECLASH"}, #endif #ifdef EOVERFLOW { EOVERFLOW, "EOVERFLOW"}, #endif #ifdef _WIN32 /* We generate all Windows messages as negative numbers to distinguish them from Unix errno values. */ { -ERROR_INVALID_FUNCTION, "ERROR_INVALID_FUNCTION" }, { -ERROR_FILE_NOT_FOUND, "ERROR_FILE_NOT_FOUND" }, { -ERROR_PATH_NOT_FOUND, "ERROR_PATH_NOT_FOUND" }, { -ERROR_TOO_MANY_OPEN_FILES, "ERROR_TOO_MANY_OPEN_FILES" }, { -ERROR_ACCESS_DENIED, "ERROR_ACCESS_DENIED" }, { -ERROR_INVALID_HANDLE, "ERROR_INVALID_HANDLE" }, { -ERROR_ARENA_TRASHED, "ERROR_ARENA_TRASHED" }, { -ERROR_NOT_ENOUGH_MEMORY, "ERROR_NOT_ENOUGH_MEMORY" }, { -ERROR_INVALID_BLOCK, "ERROR_INVALID_BLOCK" }, { -ERROR_BAD_ENVIRONMENT, "ERROR_BAD_ENVIRONMENT" }, { -ERROR_BAD_FORMAT, "ERROR_BAD_FORMAT" }, { -ERROR_INVALID_ACCESS, "ERROR_INVALID_ACCESS" }, { -ERROR_INVALID_DATA, "ERROR_INVALID_DATA" }, { -ERROR_OUTOFMEMORY, "ERROR_OUTOFMEMORY" }, { -ERROR_INVALID_DRIVE, "ERROR_INVALID_DRIVE" }, { -ERROR_CURRENT_DIRECTORY, "ERROR_CURRENT_DIRECTORY" }, { -ERROR_NOT_SAME_DEVICE, "ERROR_NOT_SAME_DEVICE" }, { -ERROR_NO_MORE_FILES, "ERROR_NO_MORE_FILES" }, { -ERROR_WRITE_PROTECT, "ERROR_WRITE_PROTECT" }, { -ERROR_BAD_UNIT, "ERROR_BAD_UNIT" }, { -ERROR_NOT_READY, "ERROR_NOT_READY" }, { -ERROR_BAD_COMMAND, "ERROR_BAD_COMMAND" }, { -ERROR_CRC, "ERROR_CRC" }, { -ERROR_BAD_LENGTH, "ERROR_BAD_LENGTH" }, { -ERROR_SEEK, "ERROR_SEEK" }, { -ERROR_NOT_DOS_DISK, "ERROR_NOT_DOS_DISK" }, { -ERROR_SECTOR_NOT_FOUND, "ERROR_SECTOR_NOT_FOUND" }, { -ERROR_OUT_OF_PAPER, "ERROR_OUT_OF_PAPER" }, { -ERROR_WRITE_FAULT, "ERROR_WRITE_FAULT" }, { -ERROR_READ_FAULT, "ERROR_READ_FAULT" }, { -ERROR_GEN_FAILURE, "ERROR_GEN_FAILURE" }, { -ERROR_SHARING_VIOLATION, "ERROR_SHARING_VIOLATION" }, { -ERROR_LOCK_VIOLATION, "ERROR_LOCK_VIOLATION" }, { -ERROR_WRONG_DISK, "ERROR_WRONG_DISK" }, { -ERROR_SHARING_BUFFER_EXCEEDED, "ERROR_SHARING_BUFFER_EXCEEDED" }, { -ERROR_HANDLE_EOF, "ERROR_HANDLE_EOF" }, { -ERROR_HANDLE_DISK_FULL, "ERROR_HANDLE_DISK_FULL" }, { -ERROR_NOT_SUPPORTED, "ERROR_NOT_SUPPORTED" }, { -ERROR_REM_NOT_LIST, "ERROR_REM_NOT_LIST" }, { -ERROR_DUP_NAME, "ERROR_DUP_NAME" }, { -ERROR_BAD_NETPATH, "ERROR_BAD_NETPATH" }, { -ERROR_NETWORK_BUSY, "ERROR_NETWORK_BUSY" }, { -ERROR_DEV_NOT_EXIST, "ERROR_DEV_NOT_EXIST" }, { -ERROR_TOO_MANY_CMDS, "ERROR_TOO_MANY_CMDS" }, { -ERROR_ADAP_HDW_ERR, "ERROR_ADAP_HDW_ERR" }, { -ERROR_BAD_NET_RESP, "ERROR_BAD_NET_RESP" }, { -ERROR_UNEXP_NET_ERR, "ERROR_UNEXP_NET_ERR" }, { -ERROR_BAD_REM_ADAP, "ERROR_BAD_REM_ADAP" }, { -ERROR_PRINTQ_FULL, "ERROR_PRINTQ_FULL" }, { -ERROR_NO_SPOOL_SPACE, "ERROR_NO_SPOOL_SPACE" }, { -ERROR_PRINT_CANCELLED, "ERROR_PRINT_CANCELLED" }, { -ERROR_NETNAME_DELETED, "ERROR_NETNAME_DELETED" }, { -ERROR_NETWORK_ACCESS_DENIED, "ERROR_NETWORK_ACCESS_DENIED" }, { -ERROR_BAD_DEV_TYPE, "ERROR_BAD_DEV_TYPE" }, { -ERROR_BAD_NET_NAME, "ERROR_BAD_NET_NAME" }, { -ERROR_TOO_MANY_NAMES, "ERROR_TOO_MANY_NAMES" }, { -ERROR_TOO_MANY_SESS, "ERROR_TOO_MANY_SESS" }, { -ERROR_SHARING_PAUSED, "ERROR_SHARING_PAUSED" }, { -ERROR_REQ_NOT_ACCEP, "ERROR_REQ_NOT_ACCEP" }, { -ERROR_REDIR_PAUSED, "ERROR_REDIR_PAUSED" }, { -ERROR_FILE_EXISTS, "ERROR_FILE_EXISTS" }, { -ERROR_CANNOT_MAKE, "ERROR_CANNOT_MAKE" }, { -ERROR_FAIL_I24, "ERROR_FAIL_I24" }, { -ERROR_OUT_OF_STRUCTURES, "ERROR_OUT_OF_STRUCTURES" }, { -ERROR_ALREADY_ASSIGNED, "ERROR_ALREADY_ASSIGNED" }, { -ERROR_INVALID_PASSWORD, "ERROR_INVALID_PASSWORD" }, { -ERROR_INVALID_PARAMETER, "ERROR_INVALID_PARAMETER" }, { -ERROR_NET_WRITE_FAULT, "ERROR_NET_WRITE_FAULT" }, { -ERROR_NO_PROC_SLOTS, "ERROR_NO_PROC_SLOTS" }, { -ERROR_TOO_MANY_SEMAPHORES, "ERROR_TOO_MANY_SEMAPHORES" }, { -ERROR_EXCL_SEM_ALREADY_OWNED, "ERROR_EXCL_SEM_ALREADY_OWNED" }, { -ERROR_SEM_IS_SET, "ERROR_SEM_IS_SET" }, { -ERROR_TOO_MANY_SEM_REQUESTS, "ERROR_TOO_MANY_SEM_REQUESTS" }, { -ERROR_INVALID_AT_INTERRUPT_TIME, "ERROR_INVALID_AT_INTERRUPT_TIME" }, { -ERROR_SEM_OWNER_DIED, "ERROR_SEM_OWNER_DIED" }, { -ERROR_SEM_USER_LIMIT, "ERROR_SEM_USER_LIMIT" }, { -ERROR_DISK_CHANGE, "ERROR_DISK_CHANGE" }, { -ERROR_DRIVE_LOCKED, "ERROR_DRIVE_LOCKED" }, { -ERROR_BROKEN_PIPE, "ERROR_BROKEN_PIPE" }, { -ERROR_OPEN_FAILED, "ERROR_OPEN_FAILED" }, { -ERROR_BUFFER_OVERFLOW, "ERROR_BUFFER_OVERFLOW" }, { -ERROR_DISK_FULL, "ERROR_DISK_FULL" }, { -ERROR_NO_MORE_SEARCH_HANDLES, "ERROR_NO_MORE_SEARCH_HANDLES" }, { -ERROR_INVALID_TARGET_HANDLE, "ERROR_INVALID_TARGET_HANDLE" }, { -ERROR_INVALID_CATEGORY, "ERROR_INVALID_CATEGORY" }, { -ERROR_INVALID_VERIFY_SWITCH, "ERROR_INVALID_VERIFY_SWITCH" }, { -ERROR_BAD_DRIVER_LEVEL, "ERROR_BAD_DRIVER_LEVEL" }, { -ERROR_CALL_NOT_IMPLEMENTED, "ERROR_CALL_NOT_IMPLEMENTED" }, { -ERROR_SEM_TIMEOUT, "ERROR_SEM_TIMEOUT" }, { -ERROR_INSUFFICIENT_BUFFER, "ERROR_INSUFFICIENT_BUFFER" }, { -ERROR_INVALID_NAME, "ERROR_INVALID_NAME" }, { -ERROR_INVALID_LEVEL, "ERROR_INVALID_LEVEL" }, { -ERROR_NO_VOLUME_LABEL, "ERROR_NO_VOLUME_LABEL" }, { -ERROR_MOD_NOT_FOUND, "ERROR_MOD_NOT_FOUND" }, { -ERROR_PROC_NOT_FOUND, "ERROR_PROC_NOT_FOUND" }, { -ERROR_WAIT_NO_CHILDREN, "ERROR_WAIT_NO_CHILDREN" }, { -ERROR_CHILD_NOT_COMPLETE, "ERROR_CHILD_NOT_COMPLETE" }, { -ERROR_DIRECT_ACCESS_HANDLE, "ERROR_DIRECT_ACCESS_HANDLE" }, { -ERROR_NEGATIVE_SEEK, "ERROR_NEGATIVE_SEEK" }, { -ERROR_SEEK_ON_DEVICE, "ERROR_SEEK_ON_DEVICE" }, { -ERROR_IS_JOIN_TARGET, "ERROR_IS_JOIN_TARGET" }, { -ERROR_IS_JOINED, "ERROR_IS_JOINED" }, { -ERROR_IS_SUBSTED, "ERROR_IS_SUBSTED" }, { -ERROR_NOT_JOINED, "ERROR_NOT_JOINED" }, { -ERROR_NOT_SUBSTED, "ERROR_NOT_SUBSTED" }, { -ERROR_JOIN_TO_JOIN, "ERROR_JOIN_TO_JOIN" }, { -ERROR_SUBST_TO_SUBST, "ERROR_SUBST_TO_SUBST" }, { -ERROR_JOIN_TO_SUBST, "ERROR_JOIN_TO_SUBST" }, { -ERROR_SUBST_TO_JOIN, "ERROR_SUBST_TO_JOIN" }, { -ERROR_BUSY_DRIVE, "ERROR_BUSY_DRIVE" }, { -ERROR_SAME_DRIVE, "ERROR_SAME_DRIVE" }, { -ERROR_DIR_NOT_ROOT, "ERROR_DIR_NOT_ROOT" }, { -ERROR_DIR_NOT_EMPTY, "ERROR_DIR_NOT_EMPTY" }, { -ERROR_IS_SUBST_PATH, "ERROR_IS_SUBST_PATH" }, { -ERROR_IS_JOIN_PATH, "ERROR_IS_JOIN_PATH" }, { -ERROR_PATH_BUSY, "ERROR_PATH_BUSY" }, { -ERROR_IS_SUBST_TARGET, "ERROR_IS_SUBST_TARGET" }, { -ERROR_SYSTEM_TRACE, "ERROR_SYSTEM_TRACE" }, { -ERROR_INVALID_EVENT_COUNT, "ERROR_INVALID_EVENT_COUNT" }, { -ERROR_TOO_MANY_MUXWAITERS, "ERROR_TOO_MANY_MUXWAITERS" }, { -ERROR_INVALID_LIST_FORMAT, "ERROR_INVALID_LIST_FORMAT" }, { -ERROR_LABEL_TOO_LONG, "ERROR_LABEL_TOO_LONG" }, { -ERROR_TOO_MANY_TCBS, "ERROR_TOO_MANY_TCBS" }, { -ERROR_SIGNAL_REFUSED, "ERROR_SIGNAL_REFUSED" }, { -ERROR_DISCARDED, "ERROR_DISCARDED" }, { -ERROR_NOT_LOCKED, "ERROR_NOT_LOCKED" }, { -ERROR_BAD_THREADID_ADDR, "ERROR_BAD_THREADID_ADDR" }, { -ERROR_BAD_ARGUMENTS, "ERROR_BAD_ARGUMENTS" }, { -ERROR_BAD_PATHNAME, "ERROR_BAD_PATHNAME" }, { -ERROR_SIGNAL_PENDING, "ERROR_SIGNAL_PENDING" }, { -ERROR_MAX_THRDS_REACHED, "ERROR_MAX_THRDS_REACHED" }, { -ERROR_LOCK_FAILED, "ERROR_LOCK_FAILED" }, { -ERROR_BUSY, "ERROR_BUSY" }, { -ERROR_CANCEL_VIOLATION, "ERROR_CANCEL_VIOLATION" }, { -ERROR_ATOMIC_LOCKS_NOT_SUPPORTED, "ERROR_ATOMIC_LOCKS_NOT_SUPPORTED" }, { -ERROR_INVALID_SEGMENT_NUMBER, "ERROR_INVALID_SEGMENT_NUMBER" }, { -ERROR_INVALID_ORDINAL, "ERROR_INVALID_ORDINAL" }, { -ERROR_ALREADY_EXISTS, "ERROR_ALREADY_EXISTS" }, { -ERROR_INVALID_FLAG_NUMBER, "ERROR_INVALID_FLAG_NUMBER" }, { -ERROR_SEM_NOT_FOUND, "ERROR_SEM_NOT_FOUND" }, { -ERROR_INVALID_STARTING_CODESEG, "ERROR_INVALID_STARTING_CODESEG" }, { -ERROR_INVALID_STACKSEG, "ERROR_INVALID_STACKSEG" }, { -ERROR_INVALID_MODULETYPE, "ERROR_INVALID_MODULETYPE" }, { -ERROR_INVALID_EXE_SIGNATURE, "ERROR_INVALID_EXE_SIGNATURE" }, { -ERROR_EXE_MARKED_INVALID, "ERROR_EXE_MARKED_INVALID" }, { -ERROR_BAD_EXE_FORMAT, "ERROR_BAD_EXE_FORMAT" }, { -ERROR_ITERATED_DATA_EXCEEDS_64k, "ERROR_ITERATED_DATA_EXCEEDS_64k" }, { -ERROR_INVALID_MINALLOCSIZE, "ERROR_INVALID_MINALLOCSIZE" }, { -ERROR_DYNLINK_FROM_INVALID_RING, "ERROR_DYNLINK_FROM_INVALID_RING" }, { -ERROR_IOPL_NOT_ENABLED, "ERROR_IOPL_NOT_ENABLED" }, { -ERROR_INVALID_SEGDPL, "ERROR_INVALID_SEGDPL" }, { -ERROR_AUTODATASEG_EXCEEDS_64k, "ERROR_AUTODATASEG_EXCEEDS_64k" }, { -ERROR_RING2SEG_MUST_BE_MOVABLE, "ERROR_RING2SEG_MUST_BE_MOVABLE" }, { -ERROR_RELOC_CHAIN_XEEDS_SEGLIM, "ERROR_RELOC_CHAIN_XEEDS_SEGLIM" }, { -ERROR_INFLOOP_IN_RELOC_CHAIN, "ERROR_INFLOOP_IN_RELOC_CHAIN" }, { -ERROR_ENVVAR_NOT_FOUND, "ERROR_ENVVAR_NOT_FOUND" }, { -ERROR_NO_SIGNAL_SENT, "ERROR_NO_SIGNAL_SENT" }, { -ERROR_FILENAME_EXCED_RANGE, "ERROR_FILENAME_EXCED_RANGE" }, { -ERROR_RING2_STACK_IN_USE, "ERROR_RING2_STACK_IN_USE" }, { -ERROR_META_EXPANSION_TOO_LONG, "ERROR_META_EXPANSION_TOO_LONG" }, { -ERROR_INVALID_SIGNAL_NUMBER, "ERROR_INVALID_SIGNAL_NUMBER" }, { -ERROR_THREAD_1_INACTIVE, "ERROR_THREAD_1_INACTIVE" }, { -ERROR_LOCKED, "ERROR_LOCKED" }, { -ERROR_TOO_MANY_MODULES, "ERROR_TOO_MANY_MODULES" }, { -ERROR_NESTING_NOT_ALLOWED, "ERROR_NESTING_NOT_ALLOWED" }, #ifdef ERROR_EXE_MACHINE_TYPE_MISMATCH { -ERROR_EXE_MACHINE_TYPE_MISMATCH, "ERROR_EXE_MACHINE_TYPE_MISMATCH" }, #endif { -ERROR_BAD_PIPE, "ERROR_BAD_PIPE" }, { -ERROR_PIPE_BUSY, "ERROR_PIPE_BUSY" }, { -ERROR_NO_DATA, "ERROR_NO_DATA" }, { -ERROR_PIPE_NOT_CONNECTED, "ERROR_PIPE_NOT_CONNECTED" }, { -ERROR_MORE_DATA, "ERROR_MORE_DATA" }, { -ERROR_VC_DISCONNECTED, "ERROR_VC_DISCONNECTED" }, { -ERROR_INVALID_EA_NAME, "ERROR_INVALID_EA_NAME" }, { -ERROR_EA_LIST_INCONSISTENT, "ERROR_EA_LIST_INCONSISTENT" }, { -ERROR_NO_MORE_ITEMS, "ERROR_NO_MORE_ITEMS" }, { -ERROR_CANNOT_COPY, "ERROR_CANNOT_COPY" }, { -ERROR_DIRECTORY, "ERROR_DIRECTORY" }, { -ERROR_EAS_DIDNT_FIT, "ERROR_EAS_DIDNT_FIT" }, { -ERROR_EA_FILE_CORRUPT, "ERROR_EA_FILE_CORRUPT" }, { -ERROR_EA_TABLE_FULL, "ERROR_EA_TABLE_FULL" }, { -ERROR_INVALID_EA_HANDLE, "ERROR_INVALID_EA_HANDLE" }, { -ERROR_EAS_NOT_SUPPORTED, "ERROR_EAS_NOT_SUPPORTED" }, { -ERROR_NOT_OWNER, "ERROR_NOT_OWNER" }, { -ERROR_TOO_MANY_POSTS, "ERROR_TOO_MANY_POSTS" }, { -ERROR_PARTIAL_COPY, "ERROR_PARTIAL_COPY" }, { -ERROR_MR_MID_NOT_FOUND, "ERROR_MR_MID_NOT_FOUND" }, { -ERROR_INVALID_ADDRESS, "ERROR_INVALID_ADDRESS" }, { -ERROR_ARITHMETIC_OVERFLOW, "ERROR_ARITHMETIC_OVERFLOW" }, { -ERROR_PIPE_CONNECTED, "ERROR_PIPE_CONNECTED" }, { -ERROR_PIPE_LISTENING, "ERROR_PIPE_LISTENING" }, { -ERROR_EA_ACCESS_DENIED, "ERROR_EA_ACCESS_DENIED" }, { -ERROR_OPERATION_ABORTED, "ERROR_OPERATION_ABORTED" }, { -ERROR_IO_INCOMPLETE, "ERROR_IO_INCOMPLETE" }, { -ERROR_IO_PENDING, "ERROR_IO_PENDING" }, { -ERROR_NOACCESS, "ERROR_NOACCESS" }, { -ERROR_SWAPERROR, "ERROR_SWAPERROR" }, { -ERROR_STACK_OVERFLOW, "ERROR_STACK_OVERFLOW" }, { -ERROR_INVALID_MESSAGE, "ERROR_INVALID_MESSAGE" }, { -ERROR_CAN_NOT_COMPLETE, "ERROR_CAN_NOT_COMPLETE" }, { -ERROR_INVALID_FLAGS, "ERROR_INVALID_FLAGS" }, { -ERROR_UNRECOGNIZED_VOLUME, "ERROR_UNRECOGNIZED_VOLUME" }, { -ERROR_FILE_INVALID, "ERROR_FILE_INVALID" }, { -ERROR_FULLSCREEN_MODE, "ERROR_FULLSCREEN_MODE" }, { -ERROR_NO_TOKEN, "ERROR_NO_TOKEN" }, { -ERROR_BADDB, "ERROR_BADDB" }, { -ERROR_BADKEY, "ERROR_BADKEY" }, { -ERROR_CANTOPEN, "ERROR_CANTOPEN" }, { -ERROR_CANTREAD, "ERROR_CANTREAD" }, { -ERROR_CANTWRITE, "ERROR_CANTWRITE" }, { -ERROR_REGISTRY_RECOVERED, "ERROR_REGISTRY_RECOVERED" }, { -ERROR_REGISTRY_CORRUPT, "ERROR_REGISTRY_CORRUPT" }, { -ERROR_REGISTRY_IO_FAILED, "ERROR_REGISTRY_IO_FAILED" }, { -ERROR_NOT_REGISTRY_FILE, "ERROR_NOT_REGISTRY_FILE" }, { -ERROR_KEY_DELETED, "ERROR_KEY_DELETED" }, { -ERROR_NO_LOG_SPACE, "ERROR_NO_LOG_SPACE" }, { -ERROR_KEY_HAS_CHILDREN, "ERROR_KEY_HAS_CHILDREN" }, { -ERROR_CHILD_MUST_BE_VOLATILE, "ERROR_CHILD_MUST_BE_VOLATILE" }, { -ERROR_NOTIFY_ENUM_DIR, "ERROR_NOTIFY_ENUM_DIR" }, { -ERROR_DEPENDENT_SERVICES_RUNNING, "ERROR_DEPENDENT_SERVICES_RUNNING" }, { -ERROR_INVALID_SERVICE_CONTROL, "ERROR_INVALID_SERVICE_CONTROL" }, { -ERROR_SERVICE_REQUEST_TIMEOUT, "ERROR_SERVICE_REQUEST_TIMEOUT" }, { -ERROR_SERVICE_NO_THREAD, "ERROR_SERVICE_NO_THREAD" }, { -ERROR_SERVICE_DATABASE_LOCKED, "ERROR_SERVICE_DATABASE_LOCKED" }, { -ERROR_SERVICE_ALREADY_RUNNING, "ERROR_SERVICE_ALREADY_RUNNING" }, { -ERROR_INVALID_SERVICE_ACCOUNT, "ERROR_INVALID_SERVICE_ACCOUNT" }, { -ERROR_SERVICE_DISABLED, "ERROR_SERVICE_DISABLED" }, { -ERROR_CIRCULAR_DEPENDENCY, "ERROR_CIRCULAR_DEPENDENCY" }, { -ERROR_SERVICE_DOES_NOT_EXIST, "ERROR_SERVICE_DOES_NOT_EXIST" }, { -ERROR_SERVICE_CANNOT_ACCEPT_CTRL, "ERROR_SERVICE_CANNOT_ACCEPT_CTRL" }, { -ERROR_SERVICE_NOT_ACTIVE, "ERROR_SERVICE_NOT_ACTIVE" }, { -ERROR_FAILED_SERVICE_CONTROLLER_CONNECT, "ERROR_FAILED_SERVICE_CONTROLLER_CONNECT" }, { -ERROR_EXCEPTION_IN_SERVICE, "ERROR_EXCEPTION_IN_SERVICE" }, { -ERROR_DATABASE_DOES_NOT_EXIST, "ERROR_DATABASE_DOES_NOT_EXIST" }, { -ERROR_SERVICE_SPECIFIC_ERROR, "ERROR_SERVICE_SPECIFIC_ERROR" }, { -ERROR_PROCESS_ABORTED, "ERROR_PROCESS_ABORTED" }, { -ERROR_SERVICE_DEPENDENCY_FAIL, "ERROR_SERVICE_DEPENDENCY_FAIL" }, { -ERROR_SERVICE_LOGON_FAILED, "ERROR_SERVICE_LOGON_FAILED" }, { -ERROR_SERVICE_START_HANG, "ERROR_SERVICE_START_HANG" }, { -ERROR_INVALID_SERVICE_LOCK, "ERROR_INVALID_SERVICE_LOCK" }, { -ERROR_SERVICE_MARKED_FOR_DELETE, "ERROR_SERVICE_MARKED_FOR_DELETE" }, { -ERROR_SERVICE_EXISTS, "ERROR_SERVICE_EXISTS" }, { -ERROR_ALREADY_RUNNING_LKG, "ERROR_ALREADY_RUNNING_LKG" }, { -ERROR_SERVICE_DEPENDENCY_DELETED, "ERROR_SERVICE_DEPENDENCY_DELETED" }, { -ERROR_BOOT_ALREADY_ACCEPTED, "ERROR_BOOT_ALREADY_ACCEPTED" }, { -ERROR_SERVICE_NEVER_STARTED, "ERROR_SERVICE_NEVER_STARTED" }, { -ERROR_DUPLICATE_SERVICE_NAME, "ERROR_DUPLICATE_SERVICE_NAME" }, #ifdef ERROR_DIFFERENT_SERVICE_ACCOUNT { -ERROR_DIFFERENT_SERVICE_ACCOUNT, "ERROR_DIFFERENT_SERVICE_ACCOUNT" }, #endif { -ERROR_END_OF_MEDIA, "ERROR_END_OF_MEDIA" }, { -ERROR_FILEMARK_DETECTED, "ERROR_FILEMARK_DETECTED" }, { -ERROR_BEGINNING_OF_MEDIA, "ERROR_BEGINNING_OF_MEDIA" }, { -ERROR_SETMARK_DETECTED, "ERROR_SETMARK_DETECTED" }, { -ERROR_NO_DATA_DETECTED, "ERROR_NO_DATA_DETECTED" }, { -ERROR_PARTITION_FAILURE, "ERROR_PARTITION_FAILURE" }, { -ERROR_INVALID_BLOCK_LENGTH, "ERROR_INVALID_BLOCK_LENGTH" }, { -ERROR_DEVICE_NOT_PARTITIONED, "ERROR_DEVICE_NOT_PARTITIONED" }, { -ERROR_UNABLE_TO_LOCK_MEDIA, "ERROR_UNABLE_TO_LOCK_MEDIA" }, { -ERROR_UNABLE_TO_UNLOAD_MEDIA, "ERROR_UNABLE_TO_UNLOAD_MEDIA" }, { -ERROR_MEDIA_CHANGED, "ERROR_MEDIA_CHANGED" }, { -ERROR_BUS_RESET, "ERROR_BUS_RESET" }, { -ERROR_NO_MEDIA_IN_DRIVE, "ERROR_NO_MEDIA_IN_DRIVE" }, { -ERROR_NO_UNICODE_TRANSLATION, "ERROR_NO_UNICODE_TRANSLATION" }, { -ERROR_DLL_INIT_FAILED, "ERROR_DLL_INIT_FAILED" }, { -ERROR_SHUTDOWN_IN_PROGRESS, "ERROR_SHUTDOWN_IN_PROGRESS" }, { -ERROR_NO_SHUTDOWN_IN_PROGRESS, "ERROR_NO_SHUTDOWN_IN_PROGRESS" }, { -ERROR_IO_DEVICE, "ERROR_IO_DEVICE" }, { -ERROR_SERIAL_NO_DEVICE, "ERROR_SERIAL_NO_DEVICE" }, { -ERROR_IRQ_BUSY, "ERROR_IRQ_BUSY" }, { -ERROR_MORE_WRITES, "ERROR_MORE_WRITES" }, { -ERROR_COUNTER_TIMEOUT, "ERROR_COUNTER_TIMEOUT" }, { -ERROR_FLOPPY_ID_MARK_NOT_FOUND, "ERROR_FLOPPY_ID_MARK_NOT_FOUND" }, { -ERROR_FLOPPY_WRONG_CYLINDER, "ERROR_FLOPPY_WRONG_CYLINDER" }, { -ERROR_FLOPPY_UNKNOWN_ERROR, "ERROR_FLOPPY_UNKNOWN_ERROR" }, { -ERROR_FLOPPY_BAD_REGISTERS, "ERROR_FLOPPY_BAD_REGISTERS" }, { -ERROR_DISK_RECALIBRATE_FAILED, "ERROR_DISK_RECALIBRATE_FAILED" }, { -ERROR_DISK_OPERATION_FAILED, "ERROR_DISK_OPERATION_FAILED" }, { -ERROR_DISK_RESET_FAILED, "ERROR_DISK_RESET_FAILED" }, { -ERROR_EOM_OVERFLOW, "ERROR_EOM_OVERFLOW" }, { -ERROR_NOT_ENOUGH_SERVER_MEMORY, "ERROR_NOT_ENOUGH_SERVER_MEMORY" }, { -ERROR_POSSIBLE_DEADLOCK, "ERROR_POSSIBLE_DEADLOCK" }, { -ERROR_MAPPED_ALIGNMENT, "ERROR_MAPPED_ALIGNMENT" }, { -ERROR_SET_POWER_STATE_VETOED, "ERROR_SET_POWER_STATE_VETOED" }, { -ERROR_SET_POWER_STATE_FAILED, "ERROR_SET_POWER_STATE_FAILED" }, #ifdef ERROR_TOO_MANY_LINKS { -ERROR_TOO_MANY_LINKS, "ERROR_TOO_MANY_LINKS" }, #endif { -ERROR_OLD_WIN_VERSION, "ERROR_OLD_WIN_VERSION" }, { -ERROR_APP_WRONG_OS, "ERROR_APP_WRONG_OS" }, { -ERROR_SINGLE_INSTANCE_APP, "ERROR_SINGLE_INSTANCE_APP" }, { -ERROR_RMODE_APP, "ERROR_RMODE_APP" }, { -ERROR_INVALID_DLL, "ERROR_INVALID_DLL" }, { -ERROR_NO_ASSOCIATION, "ERROR_NO_ASSOCIATION" }, { -ERROR_DDE_FAIL, "ERROR_DDE_FAIL" }, { -ERROR_DLL_NOT_FOUND, "ERROR_DLL_NOT_FOUND" }, { -ERROR_BAD_USERNAME, "ERROR_BAD_USERNAME" }, { -ERROR_NOT_CONNECTED, "ERROR_NOT_CONNECTED" }, { -ERROR_OPEN_FILES, "ERROR_OPEN_FILES" }, { -ERROR_ACTIVE_CONNECTIONS, "ERROR_ACTIVE_CONNECTIONS" }, { -ERROR_DEVICE_IN_USE, "ERROR_DEVICE_IN_USE" }, { -ERROR_BAD_DEVICE, "ERROR_BAD_DEVICE" }, { -ERROR_CONNECTION_UNAVAIL, "ERROR_CONNECTION_UNAVAIL" }, { -ERROR_DEVICE_ALREADY_REMEMBERED, "ERROR_DEVICE_ALREADY_REMEMBERED" }, { -ERROR_NO_NET_OR_BAD_PATH, "ERROR_NO_NET_OR_BAD_PATH" }, { -ERROR_BAD_PROVIDER, "ERROR_BAD_PROVIDER" }, { -ERROR_CANNOT_OPEN_PROFILE, "ERROR_CANNOT_OPEN_PROFILE" }, { -ERROR_BAD_PROFILE, "ERROR_BAD_PROFILE" }, { -ERROR_NOT_CONTAINER, "ERROR_NOT_CONTAINER" }, { -ERROR_EXTENDED_ERROR, "ERROR_EXTENDED_ERROR" }, { -ERROR_INVALID_GROUPNAME, "ERROR_INVALID_GROUPNAME" }, { -ERROR_INVALID_COMPUTERNAME, "ERROR_INVALID_COMPUTERNAME" }, { -ERROR_INVALID_EVENTNAME, "ERROR_INVALID_EVENTNAME" }, { -ERROR_INVALID_DOMAINNAME, "ERROR_INVALID_DOMAINNAME" }, { -ERROR_INVALID_SERVICENAME, "ERROR_INVALID_SERVICENAME" }, { -ERROR_INVALID_NETNAME, "ERROR_INVALID_NETNAME" }, { -ERROR_INVALID_SHARENAME, "ERROR_INVALID_SHARENAME" }, { -ERROR_INVALID_PASSWORDNAME, "ERROR_INVALID_PASSWORDNAME" }, { -ERROR_INVALID_MESSAGENAME, "ERROR_INVALID_MESSAGENAME" }, { -ERROR_INVALID_MESSAGEDEST, "ERROR_INVALID_MESSAGEDEST" }, { -ERROR_SESSION_CREDENTIAL_CONFLICT, "ERROR_SESSION_CREDENTIAL_CONFLICT" }, { -ERROR_REMOTE_SESSION_LIMIT_EXCEEDED, "ERROR_REMOTE_SESSION_LIMIT_EXCEEDED" }, { -ERROR_DUP_DOMAINNAME, "ERROR_DUP_DOMAINNAME" }, { -ERROR_NO_NETWORK, "ERROR_NO_NETWORK" }, { -ERROR_CANCELLED, "ERROR_CANCELLED" }, { -ERROR_USER_MAPPED_FILE, "ERROR_USER_MAPPED_FILE" }, { -ERROR_CONNECTION_REFUSED, "ERROR_CONNECTION_REFUSED" }, { -ERROR_GRACEFUL_DISCONNECT, "ERROR_GRACEFUL_DISCONNECT" }, { -ERROR_ADDRESS_ALREADY_ASSOCIATED, "ERROR_ADDRESS_ALREADY_ASSOCIATED" }, { -ERROR_ADDRESS_NOT_ASSOCIATED, "ERROR_ADDRESS_NOT_ASSOCIATED" }, { -ERROR_CONNECTION_INVALID, "ERROR_CONNECTION_INVALID" }, { -ERROR_CONNECTION_ACTIVE, "ERROR_CONNECTION_ACTIVE" }, { -ERROR_NETWORK_UNREACHABLE, "ERROR_NETWORK_UNREACHABLE" }, { -ERROR_HOST_UNREACHABLE, "ERROR_HOST_UNREACHABLE" }, { -ERROR_PROTOCOL_UNREACHABLE, "ERROR_PROTOCOL_UNREACHABLE" }, { -ERROR_PORT_UNREACHABLE, "ERROR_PORT_UNREACHABLE" }, { -ERROR_REQUEST_ABORTED, "ERROR_REQUEST_ABORTED" }, { -ERROR_CONNECTION_ABORTED, "ERROR_CONNECTION_ABORTED" }, { -ERROR_RETRY, "ERROR_RETRY" }, { -ERROR_CONNECTION_COUNT_LIMIT, "ERROR_CONNECTION_COUNT_LIMIT" }, { -ERROR_LOGIN_TIME_RESTRICTION, "ERROR_LOGIN_TIME_RESTRICTION" }, { -ERROR_LOGIN_WKSTA_RESTRICTION, "ERROR_LOGIN_WKSTA_RESTRICTION" }, { -ERROR_INCORRECT_ADDRESS, "ERROR_INCORRECT_ADDRESS" }, { -ERROR_ALREADY_REGISTERED, "ERROR_ALREADY_REGISTERED" }, { -ERROR_SERVICE_NOT_FOUND, "ERROR_SERVICE_NOT_FOUND" }, { -ERROR_NOT_AUTHENTICATED, "ERROR_NOT_AUTHENTICATED" }, { -ERROR_NOT_LOGGED_ON, "ERROR_NOT_LOGGED_ON" }, { -ERROR_CONTINUE, "ERROR_CONTINUE" }, { -ERROR_ALREADY_INITIALIZED, "ERROR_ALREADY_INITIALIZED" }, { -ERROR_NO_MORE_DEVICES, "ERROR_NO_MORE_DEVICES" }, { -ERROR_NOT_ALL_ASSIGNED, "ERROR_NOT_ALL_ASSIGNED" }, { -ERROR_SOME_NOT_MAPPED, "ERROR_SOME_NOT_MAPPED" }, { -ERROR_NO_QUOTAS_FOR_ACCOUNT, "ERROR_NO_QUOTAS_FOR_ACCOUNT" }, { -ERROR_LOCAL_USER_SESSION_KEY, "ERROR_LOCAL_USER_SESSION_KEY" }, { -ERROR_NULL_LM_PASSWORD, "ERROR_NULL_LM_PASSWORD" }, { -ERROR_UNKNOWN_REVISION, "ERROR_UNKNOWN_REVISION" }, { -ERROR_REVISION_MISMATCH, "ERROR_REVISION_MISMATCH" }, { -ERROR_INVALID_OWNER, "ERROR_INVALID_OWNER" }, { -ERROR_INVALID_PRIMARY_GROUP, "ERROR_INVALID_PRIMARY_GROUP" }, { -ERROR_NO_IMPERSONATION_TOKEN, "ERROR_NO_IMPERSONATION_TOKEN" }, { -ERROR_CANT_DISABLE_MANDATORY, "ERROR_CANT_DISABLE_MANDATORY" }, { -ERROR_NO_LOGON_SERVERS, "ERROR_NO_LOGON_SERVERS" }, { -ERROR_NO_SUCH_LOGON_SESSION, "ERROR_NO_SUCH_LOGON_SESSION" }, { -ERROR_NO_SUCH_PRIVILEGE, "ERROR_NO_SUCH_PRIVILEGE" }, { -ERROR_PRIVILEGE_NOT_HELD, "ERROR_PRIVILEGE_NOT_HELD" }, { -ERROR_INVALID_ACCOUNT_NAME, "ERROR_INVALID_ACCOUNT_NAME" }, { -ERROR_USER_EXISTS, "ERROR_USER_EXISTS" }, { -ERROR_NO_SUCH_USER, "ERROR_NO_SUCH_USER" }, { -ERROR_GROUP_EXISTS, "ERROR_GROUP_EXISTS" }, { -ERROR_NO_SUCH_GROUP, "ERROR_NO_SUCH_GROUP" }, { -ERROR_MEMBER_IN_GROUP, "ERROR_MEMBER_IN_GROUP" }, { -ERROR_MEMBER_NOT_IN_GROUP, "ERROR_MEMBER_NOT_IN_GROUP" }, { -ERROR_LAST_ADMIN, "ERROR_LAST_ADMIN" }, { -ERROR_WRONG_PASSWORD, "ERROR_WRONG_PASSWORD" }, { -ERROR_ILL_FORMED_PASSWORD, "ERROR_ILL_FORMED_PASSWORD" }, { -ERROR_PASSWORD_RESTRICTION, "ERROR_PASSWORD_RESTRICTION" }, { -ERROR_LOGON_FAILURE, "ERROR_LOGON_FAILURE" }, { -ERROR_ACCOUNT_RESTRICTION, "ERROR_ACCOUNT_RESTRICTION" }, { -ERROR_INVALID_LOGON_HOURS, "ERROR_INVALID_LOGON_HOURS" }, { -ERROR_INVALID_WORKSTATION, "ERROR_INVALID_WORKSTATION" }, { -ERROR_PASSWORD_EXPIRED, "ERROR_PASSWORD_EXPIRED" }, { -ERROR_ACCOUNT_DISABLED, "ERROR_ACCOUNT_DISABLED" }, { -ERROR_NONE_MAPPED, "ERROR_NONE_MAPPED" }, { -ERROR_TOO_MANY_LUIDS_REQUESTED, "ERROR_TOO_MANY_LUIDS_REQUESTED" }, { -ERROR_LUIDS_EXHAUSTED, "ERROR_LUIDS_EXHAUSTED" }, { -ERROR_INVALID_SUB_AUTHORITY, "ERROR_INVALID_SUB_AUTHORITY" }, { -ERROR_INVALID_ACL, "ERROR_INVALID_ACL" }, { -ERROR_INVALID_SID, "ERROR_INVALID_SID" }, { -ERROR_INVALID_SECURITY_DESCR, "ERROR_INVALID_SECURITY_DESCR" }, { -ERROR_BAD_INHERITANCE_ACL, "ERROR_BAD_INHERITANCE_ACL" }, { -ERROR_SERVER_DISABLED, "ERROR_SERVER_DISABLED" }, { -ERROR_SERVER_NOT_DISABLED, "ERROR_SERVER_NOT_DISABLED" }, { -ERROR_INVALID_ID_AUTHORITY, "ERROR_INVALID_ID_AUTHORITY" }, { -ERROR_ALLOTTED_SPACE_EXCEEDED, "ERROR_ALLOTTED_SPACE_EXCEEDED" }, { -ERROR_INVALID_GROUP_ATTRIBUTES, "ERROR_INVALID_GROUP_ATTRIBUTES" }, { -ERROR_BAD_IMPERSONATION_LEVEL, "ERROR_BAD_IMPERSONATION_LEVEL" }, { -ERROR_CANT_OPEN_ANONYMOUS, "ERROR_CANT_OPEN_ANONYMOUS" }, { -ERROR_BAD_VALIDATION_CLASS, "ERROR_BAD_VALIDATION_CLASS" }, { -ERROR_BAD_TOKEN_TYPE, "ERROR_BAD_TOKEN_TYPE" }, { -ERROR_NO_SECURITY_ON_OBJECT, "ERROR_NO_SECURITY_ON_OBJECT" }, { -ERROR_CANT_ACCESS_DOMAIN_INFO, "ERROR_CANT_ACCESS_DOMAIN_INFO" }, { -ERROR_INVALID_SERVER_STATE, "ERROR_INVALID_SERVER_STATE" }, { -ERROR_INVALID_DOMAIN_STATE, "ERROR_INVALID_DOMAIN_STATE" }, { -ERROR_INVALID_DOMAIN_ROLE, "ERROR_INVALID_DOMAIN_ROLE" }, { -ERROR_NO_SUCH_DOMAIN, "ERROR_NO_SUCH_DOMAIN" }, { -ERROR_DOMAIN_EXISTS, "ERROR_DOMAIN_EXISTS" }, { -ERROR_DOMAIN_LIMIT_EXCEEDED, "ERROR_DOMAIN_LIMIT_EXCEEDED" }, { -ERROR_INTERNAL_DB_CORRUPTION, "ERROR_INTERNAL_DB_CORRUPTION" }, { -ERROR_INTERNAL_ERROR, "ERROR_INTERNAL_ERROR" }, { -ERROR_GENERIC_NOT_MAPPED, "ERROR_GENERIC_NOT_MAPPED" }, { -ERROR_BAD_DESCRIPTOR_FORMAT, "ERROR_BAD_DESCRIPTOR_FORMAT" }, { -ERROR_NOT_LOGON_PROCESS, "ERROR_NOT_LOGON_PROCESS" }, { -ERROR_LOGON_SESSION_EXISTS, "ERROR_LOGON_SESSION_EXISTS" }, { -ERROR_NO_SUCH_PACKAGE, "ERROR_NO_SUCH_PACKAGE" }, { -ERROR_BAD_LOGON_SESSION_STATE, "ERROR_BAD_LOGON_SESSION_STATE" }, { -ERROR_LOGON_SESSION_COLLISION, "ERROR_LOGON_SESSION_COLLISION" }, { -ERROR_INVALID_LOGON_TYPE, "ERROR_INVALID_LOGON_TYPE" }, { -ERROR_CANNOT_IMPERSONATE, "ERROR_CANNOT_IMPERSONATE" }, { -ERROR_RXACT_INVALID_STATE, "ERROR_RXACT_INVALID_STATE" }, { -ERROR_RXACT_COMMIT_FAILURE, "ERROR_RXACT_COMMIT_FAILURE" }, { -ERROR_SPECIAL_ACCOUNT, "ERROR_SPECIAL_ACCOUNT" }, { -ERROR_SPECIAL_GROUP, "ERROR_SPECIAL_GROUP" }, { -ERROR_SPECIAL_USER, "ERROR_SPECIAL_USER" }, { -ERROR_MEMBERS_PRIMARY_GROUP, "ERROR_MEMBERS_PRIMARY_GROUP" }, { -ERROR_TOKEN_ALREADY_IN_USE, "ERROR_TOKEN_ALREADY_IN_USE" }, { -ERROR_NO_SUCH_ALIAS, "ERROR_NO_SUCH_ALIAS" }, { -ERROR_MEMBER_NOT_IN_ALIAS, "ERROR_MEMBER_NOT_IN_ALIAS" }, { -ERROR_MEMBER_IN_ALIAS, "ERROR_MEMBER_IN_ALIAS" }, { -ERROR_ALIAS_EXISTS, "ERROR_ALIAS_EXISTS" }, { -ERROR_LOGON_NOT_GRANTED, "ERROR_LOGON_NOT_GRANTED" }, { -ERROR_TOO_MANY_SECRETS, "ERROR_TOO_MANY_SECRETS" }, { -ERROR_SECRET_TOO_LONG, "ERROR_SECRET_TOO_LONG" }, { -ERROR_INTERNAL_DB_ERROR, "ERROR_INTERNAL_DB_ERROR" }, { -ERROR_TOO_MANY_CONTEXT_IDS, "ERROR_TOO_MANY_CONTEXT_IDS" }, { -ERROR_LOGON_TYPE_NOT_GRANTED, "ERROR_LOGON_TYPE_NOT_GRANTED" }, { -ERROR_NT_CROSS_ENCRYPTION_REQUIRED, "ERROR_NT_CROSS_ENCRYPTION_REQUIRED" }, { -ERROR_NO_SUCH_MEMBER, "ERROR_NO_SUCH_MEMBER" }, { -ERROR_INVALID_MEMBER, "ERROR_INVALID_MEMBER" }, { -ERROR_TOO_MANY_SIDS, "ERROR_TOO_MANY_SIDS" }, { -ERROR_LM_CROSS_ENCRYPTION_REQUIRED, "ERROR_LM_CROSS_ENCRYPTION_REQUIRED" }, { -ERROR_NO_INHERITANCE, "ERROR_NO_INHERITANCE" }, { -ERROR_FILE_CORRUPT, "ERROR_FILE_CORRUPT" }, { -ERROR_DISK_CORRUPT, "ERROR_DISK_CORRUPT" }, { -ERROR_NO_USER_SESSION_KEY, "ERROR_NO_USER_SESSION_KEY" }, #ifdef ERROR_LICENSE_QUOTA_EXCEEDED { -ERROR_LICENSE_QUOTA_EXCEEDED, "ERROR_LICENSE_QUOTA_EXCEEDED" }, #endif { -ERROR_INVALID_WINDOW_HANDLE, "ERROR_INVALID_WINDOW_HANDLE" }, { -ERROR_INVALID_MENU_HANDLE, "ERROR_INVALID_MENU_HANDLE" }, { -ERROR_INVALID_CURSOR_HANDLE, "ERROR_INVALID_CURSOR_HANDLE" }, { -ERROR_INVALID_ACCEL_HANDLE, "ERROR_INVALID_ACCEL_HANDLE" }, { -ERROR_INVALID_HOOK_HANDLE, "ERROR_INVALID_HOOK_HANDLE" }, { -ERROR_INVALID_DWP_HANDLE, "ERROR_INVALID_DWP_HANDLE" }, { -ERROR_TLW_WITH_WSCHILD, "ERROR_TLW_WITH_WSCHILD" }, { -ERROR_CANNOT_FIND_WND_CLASS, "ERROR_CANNOT_FIND_WND_CLASS" }, { -ERROR_WINDOW_OF_OTHER_THREAD, "ERROR_WINDOW_OF_OTHER_THREAD" }, { -ERROR_HOTKEY_ALREADY_REGISTERED, "ERROR_HOTKEY_ALREADY_REGISTERED" }, { -ERROR_CLASS_ALREADY_EXISTS, "ERROR_CLASS_ALREADY_EXISTS" }, { -ERROR_CLASS_DOES_NOT_EXIST, "ERROR_CLASS_DOES_NOT_EXIST" }, { -ERROR_CLASS_HAS_WINDOWS, "ERROR_CLASS_HAS_WINDOWS" }, { -ERROR_INVALID_INDEX, "ERROR_INVALID_INDEX" }, { -ERROR_INVALID_ICON_HANDLE, "ERROR_INVALID_ICON_HANDLE" }, { -ERROR_PRIVATE_DIALOG_INDEX, "ERROR_PRIVATE_DIALOG_INDEX" }, { -ERROR_LISTBOX_ID_NOT_FOUND, "ERROR_LISTBOX_ID_NOT_FOUND" }, { -ERROR_NO_WILDCARD_CHARACTERS, "ERROR_NO_WILDCARD_CHARACTERS" }, { -ERROR_CLIPBOARD_NOT_OPEN, "ERROR_CLIPBOARD_NOT_OPEN" }, { -ERROR_HOTKEY_NOT_REGISTERED, "ERROR_HOTKEY_NOT_REGISTERED" }, { -ERROR_WINDOW_NOT_DIALOG, "ERROR_WINDOW_NOT_DIALOG" }, { -ERROR_CONTROL_ID_NOT_FOUND, "ERROR_CONTROL_ID_NOT_FOUND" }, { -ERROR_INVALID_COMBOBOX_MESSAGE, "ERROR_INVALID_COMBOBOX_MESSAGE" }, { -ERROR_WINDOW_NOT_COMBOBOX, "ERROR_WINDOW_NOT_COMBOBOX" }, { -ERROR_INVALID_EDIT_HEIGHT, "ERROR_INVALID_EDIT_HEIGHT" }, { -ERROR_DC_NOT_FOUND, "ERROR_DC_NOT_FOUND" }, { -ERROR_INVALID_HOOK_FILTER, "ERROR_INVALID_HOOK_FILTER" }, { -ERROR_INVALID_FILTER_PROC, "ERROR_INVALID_FILTER_PROC" }, { -ERROR_HOOK_NEEDS_HMOD, "ERROR_HOOK_NEEDS_HMOD" }, { -ERROR_GLOBAL_ONLY_HOOK, "ERROR_GLOBAL_ONLY_HOOK" }, { -ERROR_JOURNAL_HOOK_SET, "ERROR_JOURNAL_HOOK_SET" }, { -ERROR_HOOK_NOT_INSTALLED, "ERROR_HOOK_NOT_INSTALLED" }, { -ERROR_INVALID_LB_MESSAGE, "ERROR_INVALID_LB_MESSAGE" }, { -ERROR_SETCOUNT_ON_BAD_LB, "ERROR_SETCOUNT_ON_BAD_LB" }, { -ERROR_LB_WITHOUT_TABSTOPS, "ERROR_LB_WITHOUT_TABSTOPS" }, { -ERROR_DESTROY_OBJECT_OF_OTHER_THREAD, "ERROR_DESTROY_OBJECT_OF_OTHER_THREAD" }, { -ERROR_CHILD_WINDOW_MENU, "ERROR_CHILD_WINDOW_MENU" }, { -ERROR_NO_SYSTEM_MENU, "ERROR_NO_SYSTEM_MENU" }, { -ERROR_INVALID_MSGBOX_STYLE, "ERROR_INVALID_MSGBOX_STYLE" }, { -ERROR_INVALID_SPI_VALUE, "ERROR_INVALID_SPI_VALUE" }, { -ERROR_SCREEN_ALREADY_LOCKED, "ERROR_SCREEN_ALREADY_LOCKED" }, { -ERROR_HWNDS_HAVE_DIFF_PARENT, "ERROR_HWNDS_HAVE_DIFF_PARENT" }, { -ERROR_NOT_CHILD_WINDOW, "ERROR_NOT_CHILD_WINDOW" }, { -ERROR_INVALID_GW_COMMAND, "ERROR_INVALID_GW_COMMAND" }, { -ERROR_INVALID_THREAD_ID, "ERROR_INVALID_THREAD_ID" }, { -ERROR_NON_MDICHILD_WINDOW, "ERROR_NON_MDICHILD_WINDOW" }, { -ERROR_POPUP_ALREADY_ACTIVE, "ERROR_POPUP_ALREADY_ACTIVE" }, { -ERROR_NO_SCROLLBARS, "ERROR_NO_SCROLLBARS" }, { -ERROR_INVALID_SCROLLBAR_RANGE, "ERROR_INVALID_SCROLLBAR_RANGE" }, { -ERROR_INVALID_SHOWWIN_COMMAND, "ERROR_INVALID_SHOWWIN_COMMAND" }, #ifdef ERROR_NO_SYSTEM_RESOURCES { -ERROR_NO_SYSTEM_RESOURCES, "ERROR_NO_SYSTEM_RESOURCES" }, #endif #ifdef ERROR_NONPAGED_SYSTEM_RESOURCES { -ERROR_NONPAGED_SYSTEM_RESOURCES, "ERROR_NONPAGED_SYSTEM_RESOURCES" }, #endif #ifdef ERROR_PAGED_SYSTEM_RESOURCES { -ERROR_PAGED_SYSTEM_RESOURCES, "ERROR_PAGED_SYSTEM_RESOURCES" }, #endif #ifdef ERROR_WORKING_SET_QUOTA { -ERROR_WORKING_SET_QUOTA, "ERROR_WORKING_SET_QUOTA" }, #endif #ifdef ERROR_PAGEFILE_QUOTA { -ERROR_PAGEFILE_QUOTA, "ERROR_PAGEFILE_QUOTA" }, #endif #ifdef ERROR_COMMITMENT_LIMIT { -ERROR_COMMITMENT_LIMIT, "ERROR_COMMITMENT_LIMIT" }, #endif #ifdef ERROR_MENU_ITEM_NOT_FOUND { -ERROR_MENU_ITEM_NOT_FOUND, "ERROR_MENU_ITEM_NOT_FOUND" }, #endif #ifdef ERROR_INVALID_KEYBOARD_HANDLE { -ERROR_INVALID_KEYBOARD_HANDLE, "ERROR_INVALID_KEYBOARD_HANDLE" }, #endif #ifdef ERROR_HOOK_TYPE_NOT_ALLOWED { -ERROR_HOOK_TYPE_NOT_ALLOWED, "ERROR_HOOK_TYPE_NOT_ALLOWED" }, #endif #ifdef ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION { -ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION, "ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION" }, #endif #ifdef ERROR_TIMEOUT { -ERROR_TIMEOUT, "ERROR_TIMEOUT" }, #endif { -ERROR_EVENTLOG_FILE_CORRUPT, "ERROR_EVENTLOG_FILE_CORRUPT" }, { -ERROR_EVENTLOG_CANT_START, "ERROR_EVENTLOG_CANT_START" }, { -ERROR_LOG_FILE_FULL, "ERROR_LOG_FILE_FULL" }, { -ERROR_EVENTLOG_FILE_CHANGED, "ERROR_EVENTLOG_FILE_CHANGED" }, { -RPC_S_INVALID_STRING_BINDING, "RPC_S_INVALID_STRING_BINDING" }, { -RPC_S_WRONG_KIND_OF_BINDING, "RPC_S_WRONG_KIND_OF_BINDING" }, { -RPC_S_INVALID_BINDING, "RPC_S_INVALID_BINDING" }, { -RPC_S_PROTSEQ_NOT_SUPPORTED, "RPC_S_PROTSEQ_NOT_SUPPORTED" }, { -RPC_S_INVALID_RPC_PROTSEQ, "RPC_S_INVALID_RPC_PROTSEQ" }, { -RPC_S_INVALID_STRING_UUID, "RPC_S_INVALID_STRING_UUID" }, { -RPC_S_INVALID_ENDPOINT_FORMAT, "RPC_S_INVALID_ENDPOINT_FORMAT" }, { -RPC_S_INVALID_NET_ADDR, "RPC_S_INVALID_NET_ADDR" }, { -RPC_S_NO_ENDPOINT_FOUND, "RPC_S_NO_ENDPOINT_FOUND" }, { -RPC_S_INVALID_TIMEOUT, "RPC_S_INVALID_TIMEOUT" }, { -RPC_S_OBJECT_NOT_FOUND, "RPC_S_OBJECT_NOT_FOUND" }, { -RPC_S_ALREADY_REGISTERED, "RPC_S_ALREADY_REGISTERED" }, { -RPC_S_TYPE_ALREADY_REGISTERED, "RPC_S_TYPE_ALREADY_REGISTERED" }, { -RPC_S_ALREADY_LISTENING, "RPC_S_ALREADY_LISTENING" }, { -RPC_S_NO_PROTSEQS_REGISTERED, "RPC_S_NO_PROTSEQS_REGISTERED" }, { -RPC_S_NOT_LISTENING, "RPC_S_NOT_LISTENING" }, { -RPC_S_UNKNOWN_MGR_TYPE, "RPC_S_UNKNOWN_MGR_TYPE" }, { -RPC_S_UNKNOWN_IF, "RPC_S_UNKNOWN_IF" }, { -RPC_S_NO_BINDINGS, "RPC_S_NO_BINDINGS" }, { -RPC_S_NO_PROTSEQS, "RPC_S_NO_PROTSEQS" }, { -RPC_S_CANT_CREATE_ENDPOINT, "RPC_S_CANT_CREATE_ENDPOINT" }, { -RPC_S_OUT_OF_RESOURCES, "RPC_S_OUT_OF_RESOURCES" }, { -RPC_S_SERVER_UNAVAILABLE, "RPC_S_SERVER_UNAVAILABLE" }, { -RPC_S_SERVER_TOO_BUSY, "RPC_S_SERVER_TOO_BUSY" }, { -RPC_S_INVALID_NETWORK_OPTIONS, "RPC_S_INVALID_NETWORK_OPTIONS" }, { -RPC_S_NO_CALL_ACTIVE, "RPC_S_NO_CALL_ACTIVE" }, { -RPC_S_CALL_FAILED, "RPC_S_CALL_FAILED" }, { -RPC_S_CALL_FAILED_DNE, "RPC_S_CALL_FAILED_DNE" }, { -RPC_S_PROTOCOL_ERROR, "RPC_S_PROTOCOL_ERROR" }, { -RPC_S_UNSUPPORTED_TRANS_SYN, "RPC_S_UNSUPPORTED_TRANS_SYN" }, { -RPC_S_UNSUPPORTED_TYPE, "RPC_S_UNSUPPORTED_TYPE" }, { -RPC_S_INVALID_TAG, "RPC_S_INVALID_TAG" }, { -RPC_S_INVALID_BOUND, "RPC_S_INVALID_BOUND" }, { -RPC_S_NO_ENTRY_NAME, "RPC_S_NO_ENTRY_NAME" }, { -RPC_S_INVALID_NAME_SYNTAX, "RPC_S_INVALID_NAME_SYNTAX" }, { -RPC_S_UNSUPPORTED_NAME_SYNTAX, "RPC_S_UNSUPPORTED_NAME_SYNTAX" }, { -RPC_S_UUID_NO_ADDRESS, "RPC_S_UUID_NO_ADDRESS" }, { -RPC_S_DUPLICATE_ENDPOINT, "RPC_S_DUPLICATE_ENDPOINT" }, { -RPC_S_UNKNOWN_AUTHN_TYPE, "RPC_S_UNKNOWN_AUTHN_TYPE" }, { -RPC_S_MAX_CALLS_TOO_SMALL, "RPC_S_MAX_CALLS_TOO_SMALL" }, { -RPC_S_STRING_TOO_LONG, "RPC_S_STRING_TOO_LONG" }, { -RPC_S_PROTSEQ_NOT_FOUND, "RPC_S_PROTSEQ_NOT_FOUND" }, { -RPC_S_PROCNUM_OUT_OF_RANGE, "RPC_S_PROCNUM_OUT_OF_RANGE" }, { -RPC_S_BINDING_HAS_NO_AUTH, "RPC_S_BINDING_HAS_NO_AUTH" }, { -RPC_S_UNKNOWN_AUTHN_SERVICE, "RPC_S_UNKNOWN_AUTHN_SERVICE" }, { -RPC_S_UNKNOWN_AUTHN_LEVEL, "RPC_S_UNKNOWN_AUTHN_LEVEL" }, { -RPC_S_INVALID_AUTH_IDENTITY, "RPC_S_INVALID_AUTH_IDENTITY" }, { -RPC_S_UNKNOWN_AUTHZ_SERVICE, "RPC_S_UNKNOWN_AUTHZ_SERVICE" }, { -EPT_S_INVALID_ENTRY, "EPT_S_INVALID_ENTRY" }, { -EPT_S_CANT_PERFORM_OP, "EPT_S_CANT_PERFORM_OP" }, { -EPT_S_NOT_REGISTERED, "EPT_S_NOT_REGISTERED" }, { -RPC_S_NOTHING_TO_EXPORT, "RPC_S_NOTHING_TO_EXPORT" }, { -RPC_S_INCOMPLETE_NAME, "RPC_S_INCOMPLETE_NAME" }, { -RPC_S_INVALID_VERS_OPTION, "RPC_S_INVALID_VERS_OPTION" }, { -RPC_S_NO_MORE_MEMBERS, "RPC_S_NO_MORE_MEMBERS" }, { -RPC_S_NOT_ALL_OBJS_UNEXPORTED, "RPC_S_NOT_ALL_OBJS_UNEXPORTED" }, { -RPC_S_INTERFACE_NOT_FOUND, "RPC_S_INTERFACE_NOT_FOUND" }, { -RPC_S_ENTRY_ALREADY_EXISTS, "RPC_S_ENTRY_ALREADY_EXISTS" }, { -RPC_S_ENTRY_NOT_FOUND, "RPC_S_ENTRY_NOT_FOUND" }, { -RPC_S_NAME_SERVICE_UNAVAILABLE, "RPC_S_NAME_SERVICE_UNAVAILABLE" }, { -RPC_S_INVALID_NAF_ID, "RPC_S_INVALID_NAF_ID" }, { -RPC_S_CANNOT_SUPPORT, "RPC_S_CANNOT_SUPPORT" }, { -RPC_S_NO_CONTEXT_AVAILABLE, "RPC_S_NO_CONTEXT_AVAILABLE" }, { -RPC_S_INTERNAL_ERROR, "RPC_S_INTERNAL_ERROR" }, { -RPC_S_ZERO_DIVIDE, "RPC_S_ZERO_DIVIDE" }, { -RPC_S_ADDRESS_ERROR, "RPC_S_ADDRESS_ERROR" }, { -RPC_S_FP_DIV_ZERO, "RPC_S_FP_DIV_ZERO" }, { -RPC_S_FP_UNDERFLOW, "RPC_S_FP_UNDERFLOW" }, { -RPC_S_FP_OVERFLOW, "RPC_S_FP_OVERFLOW" }, { -RPC_X_NO_MORE_ENTRIES, "RPC_X_NO_MORE_ENTRIES" }, { -RPC_X_SS_CHAR_TRANS_OPEN_FAIL, "RPC_X_SS_CHAR_TRANS_OPEN_FAIL" }, { -RPC_X_SS_CHAR_TRANS_SHORT_FILE, "RPC_X_SS_CHAR_TRANS_SHORT_FILE" }, { -RPC_X_SS_IN_NULL_CONTEXT, "RPC_X_SS_IN_NULL_CONTEXT" }, { -RPC_X_SS_CONTEXT_DAMAGED, "RPC_X_SS_CONTEXT_DAMAGED" }, { -RPC_X_SS_HANDLES_MISMATCH, "RPC_X_SS_HANDLES_MISMATCH" }, { -RPC_X_SS_CANNOT_GET_CALL_HANDLE, "RPC_X_SS_CANNOT_GET_CALL_HANDLE" }, { -RPC_X_NULL_REF_POINTER, "RPC_X_NULL_REF_POINTER" }, { -RPC_X_ENUM_VALUE_OUT_OF_RANGE, "RPC_X_ENUM_VALUE_OUT_OF_RANGE" }, { -RPC_X_BYTE_COUNT_TOO_SMALL, "RPC_X_BYTE_COUNT_TOO_SMALL" }, { -RPC_X_BAD_STUB_DATA, "RPC_X_BAD_STUB_DATA" }, { -ERROR_INVALID_USER_BUFFER, "ERROR_INVALID_USER_BUFFER" }, { -ERROR_UNRECOGNIZED_MEDIA, "ERROR_UNRECOGNIZED_MEDIA" }, { -ERROR_NO_TRUST_LSA_SECRET, "ERROR_NO_TRUST_LSA_SECRET" }, { -ERROR_NO_TRUST_SAM_ACCOUNT, "ERROR_NO_TRUST_SAM_ACCOUNT" }, { -ERROR_TRUSTED_DOMAIN_FAILURE, "ERROR_TRUSTED_DOMAIN_FAILURE" }, { -ERROR_TRUSTED_RELATIONSHIP_FAILURE, "ERROR_TRUSTED_RELATIONSHIP_FAILURE" }, { -ERROR_TRUST_FAILURE, "ERROR_TRUST_FAILURE" }, { -RPC_S_CALL_IN_PROGRESS, "RPC_S_CALL_IN_PROGRESS" }, { -ERROR_NETLOGON_NOT_STARTED, "ERROR_NETLOGON_NOT_STARTED" }, { -ERROR_ACCOUNT_EXPIRED, "ERROR_ACCOUNT_EXPIRED" }, { -ERROR_REDIRECTOR_HAS_OPEN_HANDLES, "ERROR_REDIRECTOR_HAS_OPEN_HANDLES" }, { -ERROR_PRINTER_DRIVER_ALREADY_INSTALLED, "ERROR_PRINTER_DRIVER_ALREADY_INSTALLED" }, { -ERROR_UNKNOWN_PORT, "ERROR_UNKNOWN_PORT" }, { -ERROR_UNKNOWN_PRINTER_DRIVER, "ERROR_UNKNOWN_PRINTER_DRIVER" }, { -ERROR_UNKNOWN_PRINTPROCESSOR, "ERROR_UNKNOWN_PRINTPROCESSOR" }, { -ERROR_INVALID_SEPARATOR_FILE, "ERROR_INVALID_SEPARATOR_FILE" }, { -ERROR_INVALID_PRIORITY, "ERROR_INVALID_PRIORITY" }, { -ERROR_INVALID_PRINTER_NAME, "ERROR_INVALID_PRINTER_NAME" }, { -ERROR_PRINTER_ALREADY_EXISTS, "ERROR_PRINTER_ALREADY_EXISTS" }, { -ERROR_INVALID_PRINTER_COMMAND, "ERROR_INVALID_PRINTER_COMMAND" }, { -ERROR_INVALID_DATATYPE, "ERROR_INVALID_DATATYPE" }, { -ERROR_INVALID_ENVIRONMENT, "ERROR_INVALID_ENVIRONMENT" }, { -RPC_S_NO_MORE_BINDINGS, "RPC_S_NO_MORE_BINDINGS" }, { -ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT, "ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT" }, { -ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT, "ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT" }, { -ERROR_NOLOGON_SERVER_TRUST_ACCOUNT, "ERROR_NOLOGON_SERVER_TRUST_ACCOUNT" }, { -ERROR_DOMAIN_TRUST_INCONSISTENT, "ERROR_DOMAIN_TRUST_INCONSISTENT" }, { -ERROR_SERVER_HAS_OPEN_HANDLES, "ERROR_SERVER_HAS_OPEN_HANDLES" }, { -ERROR_RESOURCE_DATA_NOT_FOUND, "ERROR_RESOURCE_DATA_NOT_FOUND" }, { -ERROR_RESOURCE_TYPE_NOT_FOUND, "ERROR_RESOURCE_TYPE_NOT_FOUND" }, { -ERROR_RESOURCE_NAME_NOT_FOUND, "ERROR_RESOURCE_NAME_NOT_FOUND" }, { -ERROR_RESOURCE_LANG_NOT_FOUND, "ERROR_RESOURCE_LANG_NOT_FOUND" }, { -ERROR_NOT_ENOUGH_QUOTA, "ERROR_NOT_ENOUGH_QUOTA" }, { -RPC_S_NO_INTERFACES, "RPC_S_NO_INTERFACES" }, { -RPC_S_CALL_CANCELLED, "RPC_S_CALL_CANCELLED" }, { -RPC_S_BINDING_INCOMPLETE, "RPC_S_BINDING_INCOMPLETE" }, { -RPC_S_COMM_FAILURE, "RPC_S_COMM_FAILURE" }, { -RPC_S_UNSUPPORTED_AUTHN_LEVEL, "RPC_S_UNSUPPORTED_AUTHN_LEVEL" }, { -RPC_S_NO_PRINC_NAME, "RPC_S_NO_PRINC_NAME" }, { -RPC_S_NOT_RPC_ERROR, "RPC_S_NOT_RPC_ERROR" }, { -RPC_S_UUID_LOCAL_ONLY, "RPC_S_UUID_LOCAL_ONLY" }, { -RPC_S_SEC_PKG_ERROR, "RPC_S_SEC_PKG_ERROR" }, { -RPC_S_NOT_CANCELLED, "RPC_S_NOT_CANCELLED" }, { -RPC_X_INVALID_ES_ACTION, "RPC_X_INVALID_ES_ACTION" }, { -RPC_X_WRONG_ES_VERSION, "RPC_X_WRONG_ES_VERSION" }, { -RPC_X_WRONG_STUB_VERSION, "RPC_X_WRONG_STUB_VERSION" }, #ifdef RPC_X_INVALID_PIPE_OBJECT { -RPC_X_INVALID_PIPE_OBJECT, "RPC_X_INVALID_PIPE_OBJECT" }, #endif #ifdef RPC_X_INVALID_PIPE_OPERATION { -RPC_X_INVALID_PIPE_OPERATION, "RPC_X_INVALID_PIPE_OPERATION" }, #endif #ifdef RPC_X_WRONG_PIPE_VERSION { -RPC_X_WRONG_PIPE_VERSION, "RPC_X_WRONG_PIPE_VERSION" }, #endif { -RPC_S_GROUP_MEMBER_NOT_FOUND, "RPC_S_GROUP_MEMBER_NOT_FOUND" }, { -EPT_S_CANT_CREATE, "EPT_S_CANT_CREATE" }, { -RPC_S_INVALID_OBJECT, "RPC_S_INVALID_OBJECT" }, { -ERROR_INVALID_TIME, "ERROR_INVALID_TIME" }, { -ERROR_INVALID_FORM_NAME, "ERROR_INVALID_FORM_NAME" }, { -ERROR_INVALID_FORM_SIZE, "ERROR_INVALID_FORM_SIZE" }, { -ERROR_ALREADY_WAITING, "ERROR_ALREADY_WAITING" }, { -ERROR_PRINTER_DELETED, "ERROR_PRINTER_DELETED" }, { -ERROR_INVALID_PRINTER_STATE, "ERROR_INVALID_PRINTER_STATE" }, { -ERROR_PASSWORD_MUST_CHANGE, "ERROR_PASSWORD_MUST_CHANGE" }, { -ERROR_DOMAIN_CONTROLLER_NOT_FOUND, "ERROR_DOMAIN_CONTROLLER_NOT_FOUND" }, { -ERROR_ACCOUNT_LOCKED_OUT, "ERROR_ACCOUNT_LOCKED_OUT" }, #ifdef OR_INVALID_OXID { -OR_INVALID_OXID, "OR_INVALID_OXID" }, #endif #ifdef OR_INVALID_OID { -OR_INVALID_OID, "OR_INVALID_OID" }, #endif #ifdef OR_INVALID_SET { -OR_INVALID_SET, "OR_INVALID_SET" }, #endif #ifdef RPC_S_SEND_INCOMPLETE { -RPC_S_SEND_INCOMPLETE, "RPC_S_SEND_INCOMPLETE" }, #endif { -ERROR_NO_BROWSER_SERVERS_FOUND, "ERROR_NO_BROWSER_SERVERS_FOUND" }, { -ERROR_INVALID_PIXEL_FORMAT, "ERROR_INVALID_PIXEL_FORMAT" }, { -ERROR_BAD_DRIVER, "ERROR_BAD_DRIVER" }, { -ERROR_INVALID_WINDOW_STYLE, "ERROR_INVALID_WINDOW_STYLE" }, { -ERROR_METAFILE_NOT_SUPPORTED, "ERROR_METAFILE_NOT_SUPPORTED" }, { -ERROR_TRANSFORM_NOT_SUPPORTED, "ERROR_TRANSFORM_NOT_SUPPORTED" }, { -ERROR_CLIPPING_NOT_SUPPORTED, "ERROR_CLIPPING_NOT_SUPPORTED" }, { -ERROR_UNKNOWN_PRINT_MONITOR, "ERROR_UNKNOWN_PRINT_MONITOR" }, { -ERROR_PRINTER_DRIVER_IN_USE, "ERROR_PRINTER_DRIVER_IN_USE" }, { -ERROR_SPOOL_FILE_NOT_FOUND, "ERROR_SPOOL_FILE_NOT_FOUND" }, { -ERROR_SPL_NO_STARTDOC, "ERROR_SPL_NO_STARTDOC" }, { -ERROR_SPL_NO_ADDJOB, "ERROR_SPL_NO_ADDJOB" }, { -ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED, "ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED" }, { -ERROR_PRINT_MONITOR_ALREADY_INSTALLED, "ERROR_PRINT_MONITOR_ALREADY_INSTALLED" }, #ifdef ERROR_INVALID_PRINT_MONITOR { -ERROR_INVALID_PRINT_MONITOR, "ERROR_INVALID_PRINT_MONITOR" }, #endif #ifdef ERROR_PRINT_MONITOR_IN_USE { -ERROR_PRINT_MONITOR_IN_USE, "ERROR_PRINT_MONITOR_IN_USE" }, #endif #ifdef ERROR_PRINTER_HAS_JOBS_QUEUED { -ERROR_PRINTER_HAS_JOBS_QUEUED, "ERROR_PRINTER_HAS_JOBS_QUEUED" }, #endif #ifdef ERROR_SUCCESS_REBOOT_REQUIRED { -ERROR_SUCCESS_REBOOT_REQUIRED, "ERROR_SUCCESS_REBOOT_REQUIRED" }, #endif #ifdef ERROR_SUCCESS_RESTART_REQUIRED { -ERROR_SUCCESS_RESTART_REQUIRED, "ERROR_SUCCESS_RESTART_REQUIRED" }, #endif { -ERROR_WINS_INTERNAL, "ERROR_WINS_INTERNAL" }, { -ERROR_CAN_NOT_DEL_LOCAL_WINS, "ERROR_CAN_NOT_DEL_LOCAL_WINS" }, { -ERROR_STATIC_INIT, "ERROR_STATIC_INIT" }, { -ERROR_INC_BACKUP, "ERROR_INC_BACKUP" }, { -ERROR_FULL_BACKUP, "ERROR_FULL_BACKUP" }, { -ERROR_REC_NON_EXISTENT, "ERROR_REC_NON_EXISTENT" }, { -ERROR_RPL_NOT_ALLOWED, "ERROR_RPL_NOT_ALLOWED" }, /* Socket error messages. Where a Unix-style error name is defined in errno.h we map the WSAEnnn to that in network.c otherwise we map them here. The idea is to allow portable code to, for example, call val eWouldBlock = OS.syserror "EWOULDBLOCK" to get an error code for that and then handle the case of functions raising SysErr(_, SOME n) where n = eWouldBlock. */ // { -WSAEINTR, "WSAEINTR" }, // { -WSAEBADF, "WSAEBADF" }, // { -WSAEACCES, "WSAEACCES" }, // { -WSAEFAULT, "WSAEFAULT" }, // { -WSAEINVAL, "WSAEINVAL" }, // { -WSAEMFILE, "WSAEMFILE" }, { -WSAEWOULDBLOCK, "EWOULDBLOCK" }, { -WSAEINPROGRESS, "EINPROGRESS" }, { -WSAEALREADY, "EALREADY" }, { -WSAENOTSOCK, "ENOTSOCK" }, { -WSAEDESTADDRREQ, "EDESTADDRREQ" }, { -WSAEMSGSIZE, "EMSGSIZE" }, { -WSAEPROTOTYPE, "EPROTOTYPE" }, { -WSAENOPROTOOPT, "ENOPROTOOPT" }, { -WSAEPROTONOSUPPORT, "EPROTONOSUPPORT" }, { -WSAESOCKTNOSUPPORT, "ESOCKTNOSUPPORT" }, { -WSAEOPNOTSUPP, "EOPNOTSUPP" }, { -WSAEPFNOSUPPORT, "EPFNOSUPPORT" }, { -WSAEAFNOSUPPORT, "EAFNOSUPPORT" }, { -WSAEADDRINUSE, "EADDRINUSE" }, { -WSAEADDRNOTAVAIL, "EADDRNOTAVAIL" }, { -WSAENETDOWN, "ENETDOWN" }, { -WSAENETUNREACH, "ENETUNREACH" }, { -WSAENETRESET, "ENETRESET" }, { -WSAECONNABORTED, "ECONNABORTED" }, { -WSAECONNRESET, "ECONNRESET" }, { -WSAENOBUFS, "ENOBUFS" }, { -WSAEISCONN, "EISCONN" }, { -WSAENOTCONN, "ENOTCONN" }, { -WSAESHUTDOWN, "ESHUTDOWN" }, { -WSAETOOMANYREFS, "ETOOMANYREFS" }, { -WSAETIMEDOUT, "ETIMEDOUT" }, { -WSAECONNREFUSED, "ECONNREFUSED" }, { -WSAELOOP, "ELOOP" }, // { -WSAENAMETOOLONG, "WSAENAMETOOLONG" }, { -WSAEHOSTDOWN, "EHOSTDOWN" }, { -WSAEHOSTUNREACH, "EHOSTUNREACH" }, // { -WSAENOTEMPTY, "WSAENOTEMPTY" }, { -WSAEPROCLIM, "EPROCLIM" }, { -WSAEUSERS, "EUSERS" }, { -WSAEDQUOT, "EDQUOT" }, { -WSAESTALE, "ESTALE" }, { -WSAEREMOTE, "EREMOTE" }, { -WSAEDISCON, "EDISCON" }, { -WSASYSNOTREADY, "SYSNOTREADY" }, { -WSAVERNOTSUPPORTED, "VERNOTSUPPORTED" }, { -WSANOTINITIALISED, "NOTINITIALISED" }, { -WSAHOST_NOT_FOUND, "HOST_NOT_FOUND" }, { -WSATRY_AGAIN, "TRY_AGAIN" }, { -WSANO_RECOVERY, "NO_RECOVERY" }, { -WSANO_DATA, "NO_DATA" }, #endif }; const char *stringFromErrorCode(int err) { for (unsigned i = 0; i < sizeof(errortable)/sizeof(errortable[0]); i++) { if (errortable[i].errorNum == err) { return errortable[i].errorString; } } return 0; } bool errorCodeFromString(const char *text, int *err) { for (unsigned i = 0; i < sizeof(errortable)/sizeof(errortable[0]); i++) { if (strcmp(text, errortable[i].errorString) == 0) { *err = errortable[i].errorNum; return true; } } return false; } polyml-5.6/libpolyml/errors.h000066400000000000000000000020361265146633400164030ustar00rootroot00000000000000/* Title: Error number names Copyright (c) 2000-9 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef POLY_ERRORS_H_DEFINED #define POLY_ERRORS_H_DEFINED extern const char *stringFromErrorCode(int err); extern bool errorCodeFromString(const char *text, int *err); #endif polyml-5.6/libpolyml/exporter.cpp000066400000000000000000000530671265146633400173040ustar00rootroot00000000000000/* Title: exporter.cpp - Export a function as an object or C file Copyright (c) 2006-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #else #define _T(x) x #define _tcslen strlen #define _tcscmp strcmp #define _tcscat strcat #endif #include "exporter.h" #include "save_vec.h" #include "polystring.h" #include "run_time.h" #include "osmem.h" #include "scanaddrs.h" #include "gc.h" #include "machine_dep.h" #include "diagnostics.h" #include "memmgr.h" #include "processes.h" // For IO_SPACING #include "sys.h" // For EXC_Fail #include "pexport.h" #ifdef HAVE_PECOFF #include "pecoffexport.h" #elif defined(HAVE_ELF_H) || defined(HAVE_ELF_ABI_H) #include "elfexport.h" #elif defined(HAVE_MACH_O_RELOC_H) #include "machoexport.h" #endif #if(!defined(MAXPATHLEN) && defined(MAX_PATH)) #define MAXPATHLEN MAX_PATH #endif /* To export the function and everything reachable from it we need to copy all the objects into a new area. We leave tombstones in the original objects by overwriting the length word. That prevents us from copying an object twice and breaks loops. Once we've copied the objects we then have to go back over the memory and turn the tombstones back into length words. */ GraveYard::~GraveYard() { free(graves); } CopyScan::CopyScan(unsigned h/*=0*/): hierarchy(h) { defaultImmSize = defaultMutSize = 0; defaultNoOverSize = 4096; // This can be small. tombs = 0; graveYard = 0; } void CopyScan::initialise(bool isExport/*=true*/) { ASSERT(gMem.neSpaces == 0); // Set the space sizes to a proportion of the space currently in use. // Computing these sizes is not obvious because CopyScan is used both // for export and for saved states. For saved states in particular we // want to use a smaller size because they are retained after we save // the state and if we have many child saved states it's important not // to waste memory. if (hierarchy == 0) { graveYard = new GraveYard[gMem.npSpaces]; if (graveYard == 0) throw MemoryException(); } unsigned i; for (i = 0; i < gMem.npSpaces; i++) { PermanentMemSpace *space = gMem.pSpaces[i]; if (space->hierarchy >= hierarchy) { // Include this if we're exporting (hierarchy=0) or if we're saving a state // and will include this in the new state. POLYUNSIGNED size = (space->top-space->bottom)/4; if (space->isMutable) defaultMutSize += size; else defaultImmSize += size; if (space->hierarchy == 0 && ! space->isMutable) { // We need a separate area for the tombstones because this is read-only graveYard[tombs].graves = (PolyWord*)calloc(space->spaceSize(), sizeof(PolyWord)); if (graveYard[tombs].graves == 0) throw MemoryException(); graveYard[tombs].startAddr = space->bottom; graveYard[tombs].endAddr = space->top; tombs++; } } } for (i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *space = gMem.lSpaces[i]; POLYUNSIGNED size = space->allocatedSpace(); // It looks as though the mutable size generally gets // overestimated while the immutable size is correct. if (space->isMutable) defaultMutSize += size/4; else defaultImmSize += size/2; } if (isExport) { // Minimum 1M words. if (defaultMutSize < 1024*1024) defaultMutSize = 1024*1024; if (defaultImmSize < 1024*1024) defaultImmSize = 1024*1024; } else { // Much smaller minimum sizes for saved states. if (defaultMutSize < 1024) defaultMutSize = 1024; if (defaultImmSize < 4096) defaultImmSize = 4096; } } CopyScan::~CopyScan() { gMem.DeleteExportSpaces(); if (graveYard) delete[](graveYard); } // This function is called for each address in an object // once it has been copied to its new location. We copy first // then scan to update the addresses. POLYUNSIGNED CopyScan::ScanAddressAt(PolyWord *pt) { PolyWord val = *pt; // Ignore integers. if (IS_INT(val) || val == PolyWord::FromUnsigned(0)) return 0; // Ignore pointers to the IO area. They will be relocated // when we write out the memory MemSpace *space = gMem.SpaceForAddress(val.AsAddress()); ASSERT(space != 0); if (space->spaceType == ST_IO) return 0; // We may sometimes get addresses that have already been updated // to point to the new area. e.g. (only?) in the case of constants // that have been updated in ScanConstantsWithinCode. if (space->spaceType == ST_EXPORT) return 0; // If this is at a lower level than the hierarchy we are saving // then leave it untouched. if (space->spaceType == ST_PERMANENT) { PermanentMemSpace *pmSpace = (PermanentMemSpace*)space; if (pmSpace->hierarchy < hierarchy) return 0; } if (val.IsCodePtr()) { // Find the start of the code segment PolyObject *oldObject = ObjCodePtrToPtr(val.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = val.AsCodePtr() - (byte*)oldObject; PolyObject *newObject = ScanObjectAddress(oldObject); *pt = PolyWord::FromCodePtr((byte*)newObject + offset); return 0; } ASSERT(OBJ_IS_DATAPTR(val)); // Have we already scanned this? PolyObject *obj = val.AsObjPtr(); if (obj->ContainsForwardingPtr()) { // Update the address to the new value. PolyObject *newAddr = obj->GetForwardingPtr(); *pt = newAddr; return 0; // No need to scan it again. } else if (space->spaceType == ST_PERMANENT) { // See if we have this in the grave-yard. for (unsigned i = 0; i < tombs; i++) { GraveYard *g = &graveYard[i]; if (val.AsStackAddr() >= g->startAddr && val.AsStackAddr() < g->endAddr) { PolyWord *tombAddr = g->graves + (val.AsStackAddr() - g->startAddr); PolyObject *tombObject = (PolyObject*)tombAddr; if (tombObject->ContainsForwardingPtr()) { *pt = tombObject->GetForwardingPtr();; return 0; } break; // No need to look further } } } // No, we need to copy it. ASSERT(space->spaceType == ST_LOCAL || space->spaceType == ST_PERMANENT); POLYUNSIGNED lengthWord = obj->LengthWord(); POLYUNSIGNED words = OBJ_OBJECT_LENGTH(lengthWord); PolyObject *newObj = 0; bool isMutableObj = obj->IsMutable(); bool isNoOverwrite = false; bool isByteObj = false; if (isMutableObj) { isNoOverwrite = obj->IsNoOverwriteObject(); isByteObj = obj->IsByteObject(); } // Allocate a new address for the object. for (unsigned i = 0; i < gMem.neSpaces; i++) { PermanentMemSpace *space = gMem.eSpaces[i]; if (isMutableObj == space->isMutable && isNoOverwrite == space->noOverwrite && isByteObj == space->byteOnly) { ASSERT(space->topPointer <= space->top && space->topPointer >= space->bottom); POLYUNSIGNED spaceLeft = space->top - space->topPointer; if (spaceLeft > words) { newObj = (PolyObject*)(space->topPointer+1); space->topPointer += words+1; break; } } } if (newObj == 0) { // Didn't find room in the existing spaces. Create a new space. POLYUNSIGNED spaceWords; if (!isMutableObj) spaceWords = defaultImmSize; else if (isNoOverwrite) spaceWords = defaultNoOverSize; else spaceWords = defaultMutSize; if (spaceWords <= words) spaceWords = words+1; // Make sure there's space for this object. PermanentMemSpace *space = gMem.NewExportSpace(spaceWords, isMutableObj, isNoOverwrite); if (isByteObj) space->byteOnly = true; if (space == 0) { // Unable to allocate this. throw MemoryException(); } newObj = (PolyObject*)(space->topPointer+1); space->topPointer += words+1; ASSERT(space->topPointer <= space->top && space->topPointer >= space->bottom); } newObj->SetLengthWord(lengthWord); // copy length word memcpy(newObj, obj, words*sizeof(PolyWord)); if (space->spaceType == ST_PERMANENT && !space->isMutable && ((PermanentMemSpace*)space)->hierarchy == 0) { // The immutable permanent areas are read-only. unsigned m; for (m = 0; m < tombs; m++) { GraveYard *g = &graveYard[m]; if (val.AsStackAddr() >= g->startAddr && val.AsStackAddr() < g->endAddr) { PolyWord *tombAddr = g->graves + (val.AsStackAddr() - g->startAddr); PolyObject *tombObject = (PolyObject*)tombAddr; tombObject->SetForwardingPtr(newObj); break; // No need to look further } } ASSERT(m < tombs); // Should be there. } else obj->SetForwardingPtr(newObj); // Put forwarding pointer in old object. if (OBJ_IS_CODE_OBJECT(lengthWord)) { // We don't need to worry about flushing the instruction cache // since we're not going to execute this code here. // We do have to update any relative addresses within the code // to take account of its new position. We have to do that now // even though ScanAddressesInObject will do it again because this // is the only point where we have both the old and the new addresses. machineDependent->ScanConstantsWithinCode(newObj, obj, words, this); } *pt = newObj; // Update it to the newly copied object. return lengthWord; // This new object needs to be scanned. } PolyObject *CopyScan::ScanObjectAddress(PolyObject *base) { PolyWord val = base; // Scan this as an address. POLYUNSIGNED lengthWord = CopyScan::ScanAddressAt(&val); if (lengthWord) ScanAddressesInObject(val.AsObjPtr(), lengthWord); return val.AsObjPtr(); } // We clear the data in weak byte ref cells when they are exported // to an object file and also when they are read from a saved state. void ClearWeakByteRef::ScanAddressesInObject(PolyObject *base, POLYUNSIGNED lengthWord) { if (OBJ_IS_MUTABLE_OBJECT(lengthWord) && OBJ_IS_BYTE_OBJECT(lengthWord) && OBJ_IS_WEAKREF_OBJECT(lengthWord)) memset(base, 0, base->Length() * sizeof(PolyWord)); } #define MAX_EXTENSION 4 // The longest extension we may need to add is ".obj" // Convert the forwarding pointers in a region back into length words. // Generally if this object has a forwarding pointer that's // because we've moved it into the export region. We can, // though, get multiple levels of forwarding if there is an object // that has been shifted up by a garbage collection, leaving a forwarding // pointer and then that object has been moved to the export region. // We mustn't turn locally forwarded values back into ordinary objects // because they could contain addresses that are no longer valid. static POLYUNSIGNED GetObjLength(PolyObject *obj) { if (obj->ContainsForwardingPtr()) { PolyObject *forwardedTo = obj->GetForwardingPtr(); POLYUNSIGNED length = GetObjLength(forwardedTo); MemSpace *space = gMem.SpaceForAddress(forwardedTo); if (space->spaceType == ST_EXPORT) obj->SetLengthWord(length); return length; } else { ASSERT(obj->ContainsNormalLengthWord()); return obj->LengthWord(); } } static void FixForwarding(PolyWord *pt, POLYUNSIGNED space) { while (space) { pt++; PolyObject *obj = (PolyObject*)pt; POLYUNSIGNED length = OBJ_OBJECT_LENGTH(GetObjLength(obj)); pt += length; ASSERT(space > length); space -= length+1; } } class ExportRequest: public MainThreadRequest { public: ExportRequest(Handle root, Exporter *exp): MainThreadRequest(MTP_EXPORTING), exportRoot(root), exporter(exp) {} virtual void Perform() { exporter->RunExport(exportRoot->WordP()); } Handle exportRoot; Exporter *exporter; }; static void exporter(TaskData *taskData, Handle args, const TCHAR *extension, Exporter *exports) { TCHAR fileNameBuff[MAXPATHLEN+MAX_EXTENSION]; POLYUNSIGNED length = Poly_string_to_C(DEREFHANDLE(args)->Get(0), fileNameBuff, MAXPATHLEN); if (length > MAXPATHLEN) raise_syscall(taskData, "File name too long", ENAMETOOLONG); // Does it already have the extension? If not add it on. if (length < _tcslen(extension) || _tcscmp(fileNameBuff + length - _tcslen(extension), extension) != 0) _tcscat(fileNameBuff, extension); #if (defined(_WIN32) && defined(UNICODE)) exports->exportFile = _wfopen(fileNameBuff, L"wb"); #else exports->exportFile = fopen(fileNameBuff, "wb"); #endif if (exports->exportFile == NULL) raise_syscall(taskData, "Cannot open export file", errno); Handle root = taskData->saveVec.push(args->WordP()->Get(1)); // Request a full GC to reduce the size of fix-ups. FullGC(taskData); // Request the main thread to do the export. ExportRequest request(root, exports); processes->MakeRootRequest(taskData, &request); if (exports->errorMessage) raise_fail(taskData, exports->errorMessage); } // This is called by the initial thread to actually do the export. void Exporter::RunExport(PolyObject *rootFunction) { Exporter *exports = this; PolyObject *copiedRoot = 0; CopyScan copyScan(hierarchy); try { copyScan.initialise(); // Copy the root and everything reachable from it into the temporary area. copiedRoot = copyScan.ScanObjectAddress(rootFunction); } catch (MemoryException &) { // If we ran out of memory. copiedRoot = 0; } // Fix the forwarding pointers. unsigned j; for (j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; // Local areas only have objects from the allocation pointer to the top. FixForwarding(space->bottom, space->lowerAllocPtr - space->bottom); FixForwarding(space->upperAllocPtr, space->top - space->upperAllocPtr); } for (j = 0; j < gMem.npSpaces; j++) { MemSpace *space = gMem.pSpaces[j]; // Permanent areas are filled with objects from the bottom. FixForwarding(space->bottom, space->top - space->bottom); } // Reraise the exception after cleaning up the forwarding pointers. if (copiedRoot == 0) { exports->errorMessage = "Insufficient Memory"; return; } // Copy the areas into the export object. unsigned tableEntries = gMem.neSpaces, memEntry = 0; if (hierarchy != 0) tableEntries += gMem.npSpaces; tableEntries++; // One extra for the IO area exports->memTable = new memoryTableEntry[tableEntries]; exports->ioMemEntry = 0; // The IO vector. Should we actually create a blank area? This needs to be // writable by the RTS but not normally by ML. MemSpace *ioSpace = gMem.IoSpace(); exports->memTable[0].mtAddr = ioSpace->bottom; exports->memTable[0].mtLength = (char*)ioSpace->top - (char*)ioSpace->bottom; exports->memTable[0].mtFlags = MTF_WRITEABLE; // Needs to be written during initialisation. exports->memTable[0].mtIndex = 0; memEntry = 1; // If we're constructing a module we need to include the global spaces. if (hierarchy != 0) { // Permanent spaces from the executable. for (unsigned i = 0; i < gMem.npSpaces; i++) { PermanentMemSpace *space = gMem.pSpaces[i]; if (space->hierarchy < hierarchy) { memoryTableEntry *entry = &exports->memTable[memEntry++]; entry->mtAddr = space->bottom; entry->mtLength = (space->topPointer-space->bottom)*sizeof(PolyWord); entry->mtIndex = space->index; entry->mtFlags = space->isMutable ? MTF_WRITEABLE : 0; } } newAreas = memEntry; } for (unsigned i = 0; i < gMem.neSpaces; i++) { memoryTableEntry *entry = &exports->memTable[memEntry++]; PermanentMemSpace *space = gMem.eSpaces[i]; entry->mtAddr = space->bottom; entry->mtLength = (space->topPointer-space->bottom)*sizeof(PolyWord); entry->mtIndex = hierarchy == 0 ? memEntry-1 : space->index; if (space->isMutable) { entry->mtFlags = MTF_WRITEABLE; if (space->noOverwrite) entry->mtFlags |= MTF_NO_OVERWRITE; } else entry->mtFlags = MTF_EXECUTABLE; if (space->byteOnly) entry->mtFlags |= MTF_BYTES; if (space->isMutable && space->byteOnly) { ClearWeakByteRef cwbr; cwbr.ScanAddressesInRegion(space->bottom, space->topPointer); } } ASSERT(memEntry == tableEntries); exports->memTableEntries = memEntry; exports->ioSpacing = IO_SPACING; exports->rootFunction = copiedRoot; exports->exportStore(); return; } // Functions called via the RTS call. Handle exportNative(TaskData *taskData, Handle args) { #ifdef HAVE_PECOFF // Windows including Cygwin #if (defined(_WIN32) && ! defined(__CYGWIN__)) const TCHAR *extension = _T(".obj"); // Windows #else const char *extension = ".o"; // Cygwin #endif PECOFFExport exports; exporter(taskData, args, extension, &exports); #elif defined(HAVE_ELF_H) || defined(HAVE_ELF_ABI_H) // Most Unix including Linux, FreeBSD and Solaris. const char *extension = ".o"; ELFExport exports; exporter(taskData, args, extension, &exports); #elif defined(HAVE_MACH_O_RELOC_H) // Mac OS-X const char *extension = ".o"; MachoExport exports; exporter(taskData, args, extension, &exports); #else raise_exception_string (taskData, EXC_Fail, "Native export not available for this platform"); #endif return taskData->saveVec.push(TAGGED(0)); } Handle exportPortable(TaskData *taskData, Handle args) { PExport exports; exporter(taskData, args, _T(".txt"), &exports); return taskData->saveVec.push(TAGGED(0)); } // Helper functions for exporting. We need to produce relocation information // and this code is common to every method. Exporter::Exporter(unsigned int h): exportFile(NULL), errorMessage(0), hierarchy(h), memTable(0), newAreas(0) { } Exporter::~Exporter() { delete[](memTable); if (exportFile) fclose(exportFile); } void Exporter::relocateValue(PolyWord *pt) { PolyWord q = *pt; if (IS_INT(q) || q == PolyWord::FromUnsigned(0)) {} else createRelocation(pt); } // Check through the areas to see where the address is. It must be // in one of them. unsigned Exporter::findArea(void *p) { for (unsigned i = 0; i < memTableEntries; i++) { if (p > memTable[i].mtAddr && p <= (char*)memTable[i].mtAddr + memTable[i].mtLength) return i; } { ASSERT(0); } return 0; } void Exporter::relocateObject(PolyObject *p) { if (p->IsByteObject()) { } else if (p->IsCodeObject()) { POLYUNSIGNED constCount; PolyWord *cp; ASSERT(! p->IsMutable() ); p->GetConstSegmentForCode(cp, constCount); /* Now the constants. */ for (POLYUNSIGNED i = 0; i < constCount; i++) relocateValue(&(cp[i])); } else /* Ordinary objects, essentially tuples. */ { POLYUNSIGNED length = p->Length(); for (POLYUNSIGNED i = 0; i < length; i++) relocateValue(p->Offset(i)); } } ExportStringTable::ExportStringTable(): strings(0), stringSize(0), stringAvailable(0) { } ExportStringTable::~ExportStringTable() { free(strings); } // Add a string to the string table, growing it if necessary. unsigned long ExportStringTable::makeEntry(const char *str) { unsigned len = (unsigned)strlen(str); unsigned long entry = stringSize; if (stringSize + len + 1 > stringAvailable) { stringAvailable = stringAvailable+stringAvailable/2; if (stringAvailable < stringSize + len + 1) stringAvailable = stringSize + len + 1 + 500; strings = (char*)realloc(strings, stringAvailable); if (strings == 0) throw MemoryException(); } strcpy(strings + stringSize, str); stringSize += len + 1; return entry; } polyml-5.6/libpolyml/exporter.h000066400000000000000000000066111265146633400167420ustar00rootroot00000000000000/* Title: exporter.h - Export a function as an object or C file Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef EXPORTER_H_INCLUDED #define EXPORTER_H_INCLUDED #include "globals.h" // For PolyWord #include "../polyexports.h" // For struct _memTableEntry #ifdef HAVE_STDIO_H #include // For FILE #endif class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle exportNative(TaskData *mdTaskData, Handle args); extern Handle exportPortable(TaskData *mdTaskData, Handle args); // This is the base class for the exporters for the various object-code formats. class Exporter { public: Exporter(unsigned int h=0); virtual ~Exporter(); virtual void exportStore(void) = 0; // Called by the root thread to do the work. void RunExport(PolyObject *rootFunction); protected: virtual PolyWord createRelocation(PolyWord p, void *relocAddr) = 0; void relocateValue(PolyWord *pt); void relocateObject(PolyObject *p); void createRelocation(PolyWord *pt) { *pt = createRelocation(*pt, pt); } unsigned findArea(void *p); // Find index of area that address is in. public: FILE *exportFile; const char *errorMessage; protected: unsigned int hierarchy; struct _memTableEntry *memTable; unsigned memTableEntries; unsigned ioMemEntry; // The index corresponding to the IO area. unsigned ioSpacing; PolyObject *rootFunction; // Address of the root function. unsigned newAreas; }; // The object-code exporters all use a similar string table format // consisting of null-terminated C-strings. class ExportStringTable { public: ExportStringTable(); ~ExportStringTable(); unsigned long makeEntry(const char *str); char *strings; unsigned long stringSize, stringAvailable; }; #include "scanaddrs.h" // Because permanent immutable areas are read-only we need to // have somewhere else to hold the tomb-stones. class GraveYard { public: GraveYard() { graves = 0; } ~GraveYard(); PolyWord *graves; PolyWord *startAddr, *endAddr; }; class CopyScan: public ScanAddress { public: CopyScan(unsigned h=0); void initialise(bool isExport=true); ~CopyScan(); protected: virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); public: virtual PolyObject *ScanObjectAddress(PolyObject *base); // Default sizes of the segments. POLYUNSIGNED defaultImmSize, defaultMutSize, defaultNoOverSize; unsigned hierarchy; GraveYard *graveYard; unsigned tombs; }; class ClearWeakByteRef: public ScanAddress { public: ClearWeakByteRef() {} virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } virtual void ScanAddressesInObject(PolyObject *base, POLYUNSIGNED lengthWord); }; #endif polyml-5.6/libpolyml/foreign.cpp000066400000000000000000001571071265146633400170650ustar00rootroot00000000000000/* Title: Foreign function interface Author: Nick Chapman Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2008-2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #if (defined(_WIN32) || (defined(HAVE_DLOPEN))) // Then we can use the foreign function interface. #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #if HAVE_ALLOCA_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_UNISTD_H #include /* sleep */ #endif #ifdef HAVE_DLFCN_H #include #else // Earlier versions of Mac OS X had dlopen but no /usr/include/dlfcn.h extern "C" { void *dlopen(const char *, int); int dlclose(void *); void *dlsym(void *, const char *); const char *dlerror(void); } #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #include "Console.h" /* For hApplicationInstance. */ #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_STDARG_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #else typedef char TCHAR; #define _T(x) x #endif #include "globals.h" // We need to include globals.h before in mingw64 otherwise // it messes up POLYUFMT/POLYSFMT. #include #include #include "arb.h" #include "reals.h" #include "foreign.h" #include "diagnostics.h" #include "run_time.h" #include "sys.h" #include "machine_dep.h" #include "mpoly.h" #include "processes.h" #include "scanaddrs.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "locking.h" /********************************************************************** * * Stuff... * **********************************************************************/ #define DLOPENFLAGS 1 #define Head(p) (((ML_Cons_Cell*)(p).AsObjPtr())->h) #define Tail(p) (((ML_Cons_Cell*)(p).AsObjPtr())->t) #define UNHANDLE(h) DEREFWORDHANDLE(h) #define SAVE(x) taskData->saveVec.push(x) /********************************************************************** * * Foreign Debug * **********************************************************************/ static int foreign_debug = 0; /* Debug levels: 0 - (no-debug) 1 - (debug) Bug specific tracing. 2 - (info) Important info, e.g. the actual calls to foreign functions 3 - (trace) Trace every c-function 4 - (mes) Any old rubbish */ /* Level 1 can be used to track different bugs when they appear. For example, used it to watch Volatile GC when tracking `Invalid volatile' bug. */ /*** In each of the following macros, ARGS must be a bracketed arg list suitable for printf. This means usage will look like the following: (Note the double open/close brackets.) info(("example message with a parameter <%d>\n",parameter)); ***/ /* Give macro `__FUNCTION__' a defintion if we are not using GCC */ #if ! defined(__GNUC__) && !defined(__FUNCTION__) #define __FUNCTION__ __FILE__ #endif #define mesN(N,ARGS) \ { \ if (foreign_debug>=(N)) \ { printf("%s:%4i (%s) ", __FILE__, __LINE__, __FUNCTION__); \ printf ARGS; \ } \ } #define show(ARGS) mesN(0,ARGS) #define mes1(ARGS) mesN(1,ARGS) #define mes2(ARGS) mesN(2,ARGS) #define mes3(ARGS) mesN(3,ARGS) #define mes4(ARGS) mesN(4,ARGS) #define debug mes1 #define info mes2 #define trace mes3 #define TRACE mes3(("\n")) #define mes mes4 static Handle get_foreign_debug (TaskData *taskData, Handle ignored) { TRACE; return Make_arbitrary_precision(taskData, foreign_debug); } static Handle set_foreign_debug (TaskData *taskData, Handle h) { TRACE; foreign_debug = get_C_int(taskData, DEREFWORD(h)); return h; } #define RAISE_EXN(string) raise_exception_string(taskData, EXC_foreign,(string)) typedef enum { Cchar = 1, Cdouble = 2, Cfloat = 3, Cint = 4, Clong = 5, Cpointer = 6, Cshort = 7, Cuint = 8 } Ctype; static const char *stringOfCtype(Ctype c) { switch (c) { case Cchar : return "Cchar"; case Cdouble : return "Cdouble"; case Cfloat : return "Cfloat"; case Cint : return "Cint"; case Clong : return "Clong"; case Cpointer : return "Cpointer"; case Cshort : return "Cshort"; case Cuint : return "Cuint"; default : { static char buf[100]; sprintf(buf,"Bad Ctype <%d>", c); return buf; } } } /********************************************************************** * * Volatiles ... * **********************************************************************/ #define INITIAL_NUM_VOLS 200 class PolyVolData; typedef struct { PolyVolData* ML_pointer; // Pointer to ML token object. void* C_pointer; // Pointer to C storage. bool Own_C_space; // True if this is the owner of storage. void (*C_finaliser)(void*); // Pointer to finalisation function. } Volatile; static Volatile *vols; static PLock volLock; // Mutex to protect vols. // TODO: There is a theoretical risk of deadlock if any ML allocation is made while this // lock is held. An allocation can result in a GC which requires all threads to release // ML memory but another thread could block waiting for the mutex. // N.B. raising an exception involves an allocation. #define FIRST_VOL 0 static POLYUNSIGNED num_vols = 0; static POLYUNSIGNED next_vol = FIRST_VOL; /* This table contains all the callback functions that have been created. Once a callback has been set up it remains in existence for the rest of the session. */ static struct _cbStructEntry { PolyWord mlFunction; /* The corresponding ML function. */ PolyWord argType; /* The argument type information. */ unsigned char *cFunction; /* The C function "stub" code. */ } *callbackTable; static unsigned callBackEntries = 0; static PLock callbackTableLock; // Mutex to protect table. /********************************************************************** * * Volatile Allocation * **********************************************************************/ /* With magic numbers */ // This is the ML object that represents a "vol" class PolyVolData: public PolyObject { public: POLYUNSIGNED volmagic; POLYUNSIGNED volindex; }; #define VOL_BOX_SIZE (sizeof(PolyVolData)/sizeof(PolyWord)) #define V_INDEX(v) ((v))->volindex #define V_MAGIC(v) ((v))->volmagic #define VOL_MAGIC_NUMBER 65169 #define MakeVolMagic(v) V_MAGIC((v)) = VOL_MAGIC_NUMBER #define IsVolMagic(v) (V_MAGIC((v)) == VOL_MAGIC_NUMBER) // Access to the vols table. volLock must be held before any of these are // called because another thread could realloc it. #define ML_POINTER(v) (vols[V_INDEX(v)].ML_pointer) #define C_POINTER(v) (vols[V_INDEX(v)].C_pointer) #define OWN_C_SPACE(v) (vols[V_INDEX(v)].Own_C_space) #define FINALISER(v) (vols[V_INDEX(v)].C_finaliser) #define UNVOLHANDLE(_x) ((PolyVolData*)DEREFHANDLE(_x)) /* Allocate a new "vol" in the table and in ML space and returns a pointer to the ML "vol". */ static Handle vol_alloc (TaskData *taskData) { PolyVolData* v = (PolyVolData*)alloc(taskData, VOL_BOX_SIZE, F_MUTABLE_BIT|F_BYTE_OBJ); Handle result = SAVE(v); trace(("index=<%" POLYUFMT ">\n",next_vol)); if (next_vol >= num_vols) { POLYUNSIGNED new_num_vols = (num_vols==0) ? INITIAL_NUM_VOLS : num_vols*2; info(("<%" POLYUFMT "> ---> <%" POLYUFMT ">\n", num_vols, new_num_vols)); Volatile *new_vols = (Volatile*)realloc(vols, sizeof(Volatile)*new_num_vols); if (new_vols == NULL) RAISE_EXN("Can't Enlarge Volatile Array"); vols = new_vols; num_vols = new_num_vols; } V_INDEX(v) = next_vol++; MakeVolMagic(v); ML_POINTER(v) = v; C_POINTER(v) = NULL; OWN_C_SPACE(v) = false; /* Does not own it. */ FINALISER(v) = 0; /* None installed yet. */ return result; } /* Allocate a new "vol" in the table which points to a C object of size "size". */ static Handle vol_alloc_with_c_space (TaskData *taskData, POLYUNSIGNED size) { PLocker plocker(&volLock); Handle res = vol_alloc(taskData); trace(("size= %" POLYUFMT "\n",size)); void *p = malloc(size); if (p == 0) RAISE_EXN("Insufficient memory"); C_POINTER(UNVOLHANDLE(res)) = p; OWN_C_SPACE(UNVOLHANDLE(res)) = true; return res; } /********************************************************************** * * Volatile Dereferencing --- A safe version of C_POINTER * **********************************************************************/ /* Returns the C-pointer component corresponding to the "vol" argument. */ static void* DEREFVOL (TaskData *taskData, PolyWord v) { TRACE; { PLocker plocker(&volLock); PolyVolData *vol = (PolyVolData*)v.AsObjPtr(); POLYUNSIGNED index = V_INDEX(vol); trace(("<%" POLYUFMT ">\n",index)); if (!(IsVolMagic(vol))) { info (("Invalid volatile -- bad magic number, index=<%" POLYUFMT ">\n", index)); RAISE_EXN("Bad volatile magic number"); } if (index < num_vols) { if (vols[index].ML_pointer == v.AsObjPtr()) { /* everything is okay */ return vols[index].C_pointer; } else { info(("Invalid volatile -- backpointer is wrong <%" POLYUFMT ">: <%p> != <%p>\n", index, vol, (void *)vols[index].ML_pointer)); } } else { info(("Invalid volatile -- no such vol index <%" POLYUFMT ">\n", index)); } RAISE_EXN("Invalid volatile"); /*NOTREACHED*/ return 0; }} /********************************************************************** * * Volatile Sanity Checking (debug only) * **********************************************************************/ #if 0 static void sanity_check_vols(void) { TRACE; { POLYUNSIGNED v, v2; for (v=FIRST_VOL; v < next_vol; v++) { if (vols[v].ML_pointer == NULL) { trace(("vol <%lu> has nulled ML_pointer\n",v)); } else { v2 = V_INDEX(vols[v].ML_pointer); if ( v2 != v ) { info(("vol <%d> has been corrupted to <%d>\n",v,v2)); } } } }} #endif /********************************************************************** * * C Programming Primitives * **********************************************************************/ /* This is roughly equivalent to calling malloc via the FFI, except that the vol it returns refers to the newly allocated store. Typically we need a pointer to the store so we need to call address(alloc s). */ static Handle allocate (TaskData *taskData, Handle h) { TRACE; { POLYUNSIGNED size = getPolyUnsigned(taskData, DEREFWORD(h)); /* bytes */ Handle space = vol_alloc_with_c_space(taskData, size); return space; }} /* Constructs a one-word C object whose value is the C-pointer of the argument. */ static Handle address (TaskData *taskData, Handle h) { TRACE; { Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); void *addr = DEREFVOL(taskData, UNVOLHANDLE(h)); PLocker plocker(&volLock); *(void**)C_POINTER(UNVOLHANDLE(res)) = addr; return res; }} /* Returns a vol containing the value at the address given in its argument. */ static Handle deref (TaskData *taskData, Handle h) { TRACE; { void *addr = DEREFVOL(taskData, UNVOLHANDLE(h)); PLocker plocker(&volLock); Handle res = vol_alloc(taskData); C_POINTER(UNVOLHANDLE(res))= *(void**)addr; return res; }} /****** * offset is intended for accessing structure components. * pointer_add can be written in terms offset,address & deref: * pointer_add p n == address (offset (deref p) n) ******/ /* This seems odd to me (DCJM) but it makes sense when you realise that a pointer is a vol whose C-pointer value contains the address of the vol containing the storage. There's always one more level of indirection than you think. DCJM 12/4/04. */ static Handle offset (TaskData *taskData, Handle h) { TRACE; { PolyWord structure = UNHANDLE(h)->Get(0); char *addr = (char*)DEREFVOL(taskData, structure); PLocker plocker(&volLock); Handle res = vol_alloc(taskData); POLYSIGNED num_bytes = get_C_long(taskData, DEREFWORDHANDLE(h)->Get(1)); C_POINTER(UNVOLHANDLE(res)) = addr + num_bytes; return res; }} static Handle assign (TaskData *taskData, Handle h) { TRACE; { PolyVolData *left = (PolyVolData *)(UNHANDLE(h)->Get(0).AsObjPtr()); PolyVolData *right = (PolyVolData *)(UNHANDLE(h)->Get(1).AsObjPtr()); POLYSIGNED size = get_C_long(taskData, DEREFWORDHANDLE(h)->Get(2)); /* bytes */ void *source = DEREFVOL(taskData, right); PLocker plocker(&volLock); void *dest = C_POINTER(left); memcpy(dest, source, size); return SAVE(TAGGED(0)); }} static Handle c_sizeof (TaskData *taskData, Handle h) { TRACE; PolyWord v = UNHANDLE(h); if (!(IS_INT(v))) // This should be handled within ML RAISE_EXN("sizeof for struct"); Ctype ctype = (Ctype)UNTAGGED(v); trace(("<%s>\n", stringOfCtype(ctype))); switch (ctype) { case Cchar : return Make_arbitrary_precision(taskData, sizeof(char)); case Cdouble : return Make_arbitrary_precision(taskData, sizeof(double)); case Cfloat : return Make_arbitrary_precision(taskData, sizeof(float)); case Cint : return Make_arbitrary_precision(taskData, sizeof(int)); case Clong : return Make_arbitrary_precision(taskData, sizeof(long)); case Cpointer : return Make_arbitrary_precision(taskData, sizeof(void*)); case Cshort : return Make_arbitrary_precision(taskData, sizeof(short)); case Cuint : return Make_arbitrary_precision(taskData, sizeof(unsigned)); default: { char buf[100]; sprintf(buf, "Unknown ctype <%s>", stringOfCtype(ctype)); RAISE_EXN(buf); /*NOTREACHED*/ /* Keep -Wall happy */ return (Handle)0; } } } static Handle alignment (TaskData *taskData, Handle h) { TRACE; PolyWord v = UNHANDLE(h); if (!(IS_INT(v))) RAISE_EXN("alignment of structure"); Ctype ctype = (Ctype)UNTAGGED(v); trace(("<%s>\n", stringOfCtype(ctype))); switch (ctype) { #ifdef __GNUC__ case Cchar : return Make_arbitrary_precision(taskData, __alignof__(char)); case Cdouble : return Make_arbitrary_precision(taskData, __alignof__(double)); case Cfloat : return Make_arbitrary_precision(taskData, __alignof__(float)); case Cint : return Make_arbitrary_precision(taskData, __alignof__(int)); case Clong : return Make_arbitrary_precision(taskData, __alignof__(long)); case Cpointer : return Make_arbitrary_precision(taskData, __alignof__(void*)); case Cshort : return Make_arbitrary_precision(taskData, __alignof__(short)); case Cuint : return Make_arbitrary_precision(taskData, __alignof__(unsigned)); #else /* Take a guess... */ /* Use "sizeof" here. DCJM 19/4/01. */ case Cchar : return Make_arbitrary_precision(taskData, sizeof(char)); case Cdouble : return Make_arbitrary_precision(taskData, sizeof(double)); case Cfloat : return Make_arbitrary_precision(taskData, sizeof(float)); case Cint : return Make_arbitrary_precision(taskData, sizeof(int)); case Clong : return Make_arbitrary_precision(taskData, sizeof(long)); case Cpointer : return Make_arbitrary_precision(taskData, sizeof(void*)); case Cshort : return Make_arbitrary_precision(taskData, sizeof(short)); case Cuint : return Make_arbitrary_precision(taskData, sizeof(unsigned)); #endif default: { char buf[100]; sprintf(buf, "Unknown ctype <%s>", stringOfCtype(ctype)); RAISE_EXN(buf); } } /*NOTREACHED*/ /* Keep -Wall happy */ return (Handle)0; } /********************************************************************** * * Volatile Garbage Collection * ********************************************************************** During GC this function is called three times, with "op" taking the values 1 -- MarkRuntimeObject 2 -- ReferenceRuntimeObject 3 -- UpdateRuntimeObject Pass 1 is irrelevant. We call "op" (MarkRuntimeObject) with the second parameter equal to 1. This indicates the ML pointers held by the array "vols" are weak references and so "op" does nothing and returns immediately. During Pass 2, the condition "(vols[from].ML_pointer != NULL)" is always true, so we call "op" (ReferenceRuntimeObject) with the address of each ML pointer cell contained in the array "vols". Any cell that holds a heap pointer that is not marked is overwritten by "op" to be NULL. After the call to "op" we test if the cell has been nulled, if so we deallocate the malloced space pointed to by the corresponding C pointer. Also, because the condition "(vols[from].ML_pointer != NULL)" is true on every iteration of the loop, the counter "to" always keeps in step with the loop counter "from". This prevents us from entering the code guarded by the condition "(from>to)" (intended for pass 3). During the Pass 3, we only call "op" (UpdateRuntimeObject) with the address of those ML pointers that were not nulled on the previous stage. The ML pointers are overwritten by "op" with their new location in the heap. Also, on this pass we compact the array "vols". The "to" counter is only incremented when we encounter an ML pointer that is not NULL, whereas the "from" counter is incremented on every iteration. If "from" > "to" we shift the pair of pointers (ML and C) leftwards in the array from index "from" to index "to" . This requires us to update the index held by the ML heap cell to be "to". Finally we set "next_vol" to be "to", the index of the next volatile to be allocated. Although this occurs on every pass, it only has effect on Pass 3. **********************************************************************/ class Foreign: public RtsModule { public: virtual void Init(void); virtual void Start(void); virtual void Stop(void); void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static Foreign foreignModule; void Foreign::Init() { vols = (Volatile*)malloc(sizeof(Volatile)*INITIAL_NUM_VOLS); ASSERT(vols != 0); // If this fails we won't be able to allocate the NULL. num_vols = INITIAL_NUM_VOLS; } void Foreign::Start() { static void *nullValue = 0; PolyVolData *nullV = (PolyVolData*)IoEntry(POLY_SYS_foreign_null); V_INDEX(nullV) = next_vol++; MakeVolMagic(nullV); ML_POINTER(nullV) = nullV; C_POINTER(nullV) = &nullValue; OWN_C_SPACE(nullV) = false; // Not freed FINALISER(nullV) = 0; // No finaliser } void Foreign::Stop() { // Call finalisers that have not otherwise been called. for (POLYUNSIGNED k = FIRST_VOL; k < next_vol; k++) { if (vols[k].ML_pointer != NULL && vols[k].C_pointer != 0 && vols[k].C_finaliser) vols[k].C_finaliser(*(void**)vols[k].C_pointer); } } void Foreign::GarbageCollect(ScanAddress *process) { TRACE; // First pass: GC and relocate the ML pointers and detect unreferenced // entries. Call any finalisers on them. We have to do that before freeing // any "own" spaces because we may have set a finaliser on the contents of // something that is owned by an earlier vol (i.e. 2 vols have the same // C_pointer value). The higher levels will ensure that we won't GC the // original value until the copy is also GCd. for (POLYUNSIGNED k = FIRST_VOL; k < next_vol; k++) { if (vols[k].ML_pointer != NULL) { PolyObject *p = vols[k].ML_pointer; process->ScanRuntimeAddress(&p, ScanAddress::STRENGTH_WEAK); vols[k].ML_pointer = (PolyVolData*)p; if (vols[k].ML_pointer == NULL && vols[k].C_finaliser) { trace(("Calling finaliser on <%" POLYUFMT ">\n", k)); vols[k].C_finaliser(*(void**)vols[k].C_pointer); } } } // Then compact the table and free any "own" references. POLYUNSIGNED to,from; for (from=FIRST_VOL, to=FIRST_VOL; from < next_vol; from++) { mes(("to=<%" POLYUFMT "> from=<%" POLYUFMT ">\n",to,from)); if (vols[from].ML_pointer == NULL) { if (vols[from].Own_C_space) { // Can now free this. trace(("Freeing malloc space of <%" POLYUFMT ">\n",from)); free(vols[from].C_pointer); vols[from].C_pointer = 0; vols[from].Own_C_space = false; } } else { if (from>to) { trace(("Shifting volatile <%" POLYUFMT "> ---> <%" POLYUFMT ">\n",from,to)); vols[to] = vols[from]; V_INDEX(vols[to].ML_pointer) = to; } to++; } } next_vol = to; /* Callback table. Added DCJM 12/4/04. We always process these as strong references. For the time being at any rate we treat these as permanent entries so that once a callback is set up it cannot be garbage-collected. */ for (unsigned i = 0; i < callBackEntries; i++) { process->ScanRuntimeWord(&callbackTable[i].mlFunction); process->ScanRuntimeWord(&callbackTable[i].argType); } } /********************************************************************** * * Load a Dynamic Library. * **********************************************************************/ static Handle load_lib (TaskData *taskData, Handle string) { TCHAR name[500]; Poly_string_to_C(DEREFWORD(string), name, sizeof(name)/sizeof(TCHAR)); #if (defined(_WIN32) && defined(UNICODE)) info(("<%S>\n", name)); #else info(("<%s>\n", name)); #endif // If the name is the null string use the current executable. #if (defined(_WIN32) && ! defined(__CYGWIN__)) HINSTANCE lib; if (*name == 0) lib = hApplicationInstance; else lib = LoadLibrary(name); if (lib == NULL) { char buf[256]; #if (defined(_WIN32) && defined(UNICODE)) sprintf(buf, "load_lib <%S> : %lu", name, GetLastError()); #else sprintf(buf, "load_lib <%s> : %lu", name, GetLastError()); #endif RAISE_EXN(buf); } Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); *(void**)DEREFVOL(taskData, UNHANDLE(res)) = lib; return res; #else /* UNIX version */ void *lib = dlopen(*name == 0 ? NULL : name,DLOPENFLAGS); if (!lib) { char buf[256]; sprintf(buf, "load_lib <%s> : %s", name, dlerror()); RAISE_EXN(buf); } Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); *(void**)DEREFVOL(taskData, UNHANDLE(res)) = lib; return res; #endif } /********************************************************************** * * Load Symbol from a Dynamic Library * **********************************************************************/ static Handle load_sym (TaskData *taskData, Handle h) { char name[500]; Poly_string_to_C(DEREFHANDLE(h)->Get(1), name, sizeof(name)); info(("<%s>\n", name)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) void *sym = (void*)GetProcAddress( *(HINSTANCE*)DEREFVOL(taskData, DEREFHANDLE(h)->Get(0)), name); if (sym == NULL) { char buf[256]; sprintf(buf, "load_sym <%s> : %lu", name, GetLastError()); RAISE_EXN(buf); } Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); *(void**)DEREFVOL(taskData, UNHANDLE(res)) = sym; return res; #else /* UNIX version */ void *sym = dlsym( *(void**)DEREFVOL(taskData, DEREFHANDLE(h)->Get(0)), name ); if (!sym) { char buf[256]; sprintf(buf, "load_sym <%s> : %s", name, dlerror()); RAISE_EXN(buf); } Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); *(void**)DEREFVOL(taskData, UNHANDLE(res)) = sym; return res; #endif } static unsigned length_list (PolyWord p) { TRACE; { return ML_Cons_Cell::IsNull(p) ? 0 : 1 + length_list (Tail(p)); } } static ffi_type *ctypeToFfiType(TaskData *taskData, PolyWord conv) { if (IS_INT(conv)) { Ctype ctype = (Ctype)UNTAGGED(conv); info(("<%s>\n", stringOfCtype(ctype))); switch (ctype) { case Cchar: return &ffi_type_schar; case Cdouble: return &ffi_type_double; case Cfloat: return &ffi_type_float; case Cint: return &ffi_type_sint; case Clong: return &ffi_type_slong; case Cpointer: return &ffi_type_pointer; case Cshort: return &ffi_type_sshort; case Cuint: return &ffi_type_uint; } RAISE_EXN("Unknown ctype"); } else { // Structure: this is a vector of ctypes. This must be allocated dynamically. PolyObject *vec = conv.AsObjPtr(); POLYUNSIGNED length = vec->Length(); ffi_type **str = (ffi_type **)malloc((length+1)*sizeof(ffi_type *)); if (str == NULL) RAISE_EXN("Insufficient memory"); for (POLYUNSIGNED i = 0; i < length; i++) str[i] = ctypeToFfiType(taskData, vec->Get(i)); str[length] = 0; ffi_type *result = (ffi_type *)malloc(sizeof(ffi_type)); if (result == NULL) RAISE_EXN("Insufficient memory"); result->size = 0; result->alignment = 0; result->type = FFI_TYPE_STRUCT; result->elements = str; return result; } return 0; // Suppress warning } // Free the structure elements of the type vectors. static void freeTypeVec(ffi_type **vec, unsigned elements) { for (unsigned i = 0; i < elements; i++) { ffi_type *t = vec[i]; if (t->elements != 0) { unsigned elems = 0; while (t->elements[elems] != 0) elems++; freeTypeVec(t->elements, elems); free(t->elements); } } } typedef void (*ftype)(void); static Handle call_sym (TaskData *taskData, Handle symH, Handle argsH, Handle retCtypeH) { TRACE; ftype sym = *(ftype*)DEREFVOL(taskData, symH->Word()); PolyWord arg_list = argsH->Word(); unsigned num_args = length_list(arg_list); ffi_cif cif; // Initialise the error vars to "no error". If we have multiple worker // threads the previous value will depend on whatever that worker // did last and not necessarily on what this ML thread did. #ifdef HAVE_ERRNO_H errno = 0; #endif #ifdef _WIN32 SetLastError(0); #endif ffi_type **arg_types = (ffi_type**)alloca(num_args * sizeof(ffi_type*)); void **arg_values = (void**)alloca(num_args * sizeof(void*)); // The argument list is a list of pairs. PolyWord p = arg_list; for (POLYUNSIGNED i=0; iGet(1)); arg_types[i] = ctypeToFfiType(taskData, Head(p).AsObjPtr()->Get(0)); } ffi_type *result_type = ctypeToFfiType(taskData, retCtypeH->Word()); #if(defined(_WIN32) && ! defined(__GNUC__) && ! defined(_WIN64)) const ffi_abi abi = FFI_STDCALL; #else const ffi_abi abi = FFI_DEFAULT_ABI; #endif if (ffi_prep_cif(&cif, abi, num_args, result_type, arg_types) != FFI_OK) RAISE_EXN("libffi error: ffi_prep_cif failed"); // malloc memory for the result void *result = malloc(result_type->size); if (result == 0) RAISE_EXN("Insufficient memory to allocate space for result"); processes->ThreadReleaseMLMemory(taskData); ffi_call(&cif, sym, result, arg_values); processes->ThreadUseMLMemory(taskData); // Allocate a vol for the result. Don't do this before the // call in case we have a call-back and recursion. Handle res; { PLocker lock(&volLock); res = vol_alloc(taskData); C_POINTER(UNVOLHANDLE(res)) = result; OWN_C_SPACE(UNVOLHANDLE(res)) = true; } freeTypeVec(arg_types, num_args); // Free any structure entries freeTypeVec(&result_type, 1); // Record the last error result. If this is Windows and // GetLastError returned a failure set that otherwise use // the value of errno. #ifdef _WIN32 int err = GetLastError(); if (err != 0) taskData->lastError = -err; else #endif #ifdef HAVE_ERRNO_H taskData->lastError = errno; #endif return res; } /********************************************************************** * * Char Conversion * **********************************************************************/ /* This is backwards compatible with the old code in which toCchar and fromCchar worked on "string" rather than "char". Since single character strings and chars have the same representation there's no need to change this. DCJM 27/6/01. */ static Handle toCchar (TaskData *taskData, Handle h) { char s[2]; Poly_string_to_C(DEREFWORD(h),s,2); mes(("<%c>\n", s[0])); Handle res = vol_alloc_with_c_space(taskData, sizeof(char)); *(char*)DEREFVOL(taskData, UNHANDLE(res)) = s[0]; return res; } static Handle fromCchar (TaskData *taskData, Handle h) { char c = *(char*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%c>\n", c)); return SAVE(C_string_to_Poly(taskData, &c,1)); } /********************************************************************** * * Double Conversion * **********************************************************************/ static Handle toCdouble (TaskData *taskData, Handle h) { double d = real_arg(h); mes(("<%f>\n", d)); Handle res = vol_alloc_with_c_space(taskData, sizeof(double)); *(double*)DEREFVOL(taskData, UNHANDLE(res)) = d; return res; } static Handle fromCdouble (TaskData *taskData, Handle h) { double d = *(double*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%f>\n", d)); return real_result(taskData, d); } /********************************************************************** * * Float Conversion * **********************************************************************/ static Handle toCfloat (TaskData *taskData, Handle h) { float f = (float)real_arg(h); mes(("<%f>\n", f)); Handle res = vol_alloc_with_c_space(taskData, sizeof(float)); *(float*)DEREFVOL(taskData, UNHANDLE(res)) = f; return res; } static Handle fromCfloat (TaskData *taskData, Handle h) { float f = *(float*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%f>\n", f)); return real_result(taskData, (double)f); } /********************************************************************** * * Int Conversion * **********************************************************************/ static Handle toCint (TaskData *taskData, Handle h) { int i = get_C_int(taskData, UNHANDLE(h)); mes(("value = %d\n", i)); Handle res = vol_alloc_with_c_space(taskData, sizeof(int)); *(int*)DEREFVOL(taskData, UNHANDLE(res)) = i; return res; } static Handle fromCint (TaskData *taskData, Handle h) { int i = *(int*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%d>\n", i)); return Make_arbitrary_precision(taskData, i); } /********************************************************************** * * Long Conversion * **********************************************************************/ static Handle toClong (TaskData *taskData, Handle h) { long i = (long)get_C_long(taskData, UNHANDLE(h)); mes(("value = %d\n", (int)i)); Handle res = vol_alloc_with_c_space(taskData, sizeof(long)); *(long*)DEREFVOL(taskData, UNHANDLE(res)) = i; return res; } static Handle fromClong (TaskData *taskData, Handle h) { long i = *(long*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%d>\n", (int)i)); return Make_arbitrary_precision(taskData, i); } /********************************************************************** * * Short Conversion * **********************************************************************/ static Handle toCshort (TaskData *taskData, Handle h) { short i = (short)get_C_long(taskData, UNHANDLE(h)); mes(("<%d>\n", (int)i)); Handle res = vol_alloc_with_c_space(taskData, sizeof(short)); *(short*)DEREFVOL(taskData, UNHANDLE(res)) = i; return res; } static Handle fromCshort (TaskData *taskData, Handle h) { short i = *(short*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%d>\n", (int)i)); return Make_arbitrary_precision(taskData, i); } /********************************************************************** * * Unsigned int Conversion * **********************************************************************/ static Handle toCuint (TaskData *taskData, Handle h) { unsigned i = get_C_unsigned(taskData, UNHANDLE(h)); mes(("value = %d\n", (int)i)); Handle res = vol_alloc_with_c_space(taskData, sizeof(unsigned)); *(unsigned*)DEREFVOL(taskData, UNHANDLE(res)) = i; return res; } static Handle fromCuint (TaskData *taskData, Handle h) { unsigned i = *(unsigned*)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%d>\n", (int)i)); return Make_arbitrary_precision(taskData, i); } /********************************************************************** * * String Conversion * **********************************************************************/ static Handle fillCstring (TaskData *taskData, Handle h) { TRACE; { POLYUNSIGNED size; PolyWord str = DEREFHANDLE(h)->Get(1); PolyVolData* cArg = (PolyVolData*)(DEREFHANDLE(h)->Get(0).AsObjPtr()); if (str.IsTagged()) size = 1; else size = ((PolyStringObject*)str.AsObjPtr())->length; size += 1; // For the terminating zero Poly_string_to_C(str, (char*)DEREFVOL(taskData, cArg), size); PLocker plocker(&volLock); mes(("<%s>\n", (char*)C_POINTER(cArg))); return SAVE(TAGGED(0)); }} static Handle toCstring (TaskData *taskData, Handle h) { TRACE; { POLYUNSIGNED size; { PolyWord str = DEREFWORD(h); if (str.IsTagged()) size = 1; else size = ((PolyStringObject*)str.AsObjPtr())->length; } size += 1; // For the terminating zero /* Allocate c-space for both the string & a pointer to the string, which is owned by the same vol. */ Handle res = vol_alloc_with_c_space(taskData, sizeof(char*)+size); PLocker plocker(&volLock); /* Make the first word of the c-space point to the second word */ *(void**)C_POINTER(UNVOLHANDLE(res)) = 1 + (void**)C_POINTER(UNVOLHANDLE(res)); /* Copy the string into the c-space starting at the second word */ Poly_string_to_C(DEREFWORD(h), (char*)(1 + (void**)C_POINTER(UNVOLHANDLE(res))), size); return res; }} static Handle fromCstring (TaskData *taskData, Handle h) { TRACE; { char* str = *(char**)DEREFVOL(taskData, UNHANDLE(h)); mes(("<%s>\n", str)); return SAVE(C_string_to_Poly(taskData, str)); }} /* Byte vector functions. The representation is the same as a string but the values may include zero bytes. For fromCbytes the length therefore has to be passed as an argument. Added DCJM 29/6/01. */ static Handle toCbytes (TaskData *taskData, Handle h) { TRACE; { POLYUNSIGNED size; { PolyWord str = DEREFWORD(h); if (str.IsTagged()) size = 1; else size = ((PolyStringObject*)str.AsObjPtr())->length; } // No terminating null here unlike strings /* Allocate c-space for both the string & a pointer to the string, which is owned by the same vol. */ Handle res = vol_alloc_with_c_space(taskData, sizeof(char*)+size); PLocker plocker(&volLock); char **p = (char**)C_POINTER(UNVOLHANDLE(res)); /* Make the first word of the c-space point to the second word */ *(char***)p = p + 1; /* Copy the string into the c-space starting at the second word */ if (size == 1) **p = (char)UNTAGGED(DEREFHANDLE(h)); else memcpy(*p, ((PolyStringObject*)h->WordP())->chars, size); return res; }} static Handle fromCbytes (TaskData *taskData, Handle h) { TRACE; { char* str = *(char**)DEREFVOL(taskData, DEREFHANDLE(h)->Get(0)); size_t size = get_C_long(taskData, DEREFHANDLE(h)->Get(1)); if (str == NULL) return SAVE(EmptyString()); else return SAVE(C_string_to_Poly(taskData, str, size)); }} /********************************************************************** * * call_sym_and_convert * **********************************************************************/ typedef enum { directedArg_In = 1, directedArg_Out = 2 } DirectedArgs; /* datatype 'a union = Char of string | Double of real | Float of real | Int of int | Long of int | Short of int | String of string | Vol of 'a */ typedef enum { union_Char = 1, union_Double, union_Float, union_Int, union_Long, union_Short, union_String, union_Vol, union_Uint /* 9 */ } UnionTypes; static Handle UNION_MAKE(TaskData *taskData, UnionTypes tag, Handle contents) { Handle res = SAVE(alloc(taskData, 2)); UNHANDLE(res)->Set(1, TAGGED(tag)); DEREFHANDLE(res)->Set(0, UNHANDLE(contents)); return res; } /* datatype 'ctype unionChoice = chooseChar | chooseDouble | chooseFloat | chooseInt | chooseLong | chooseShort | chooseString; | chooseVol of 'ctype */ typedef enum { choice_chooseChar = 1, choice_chooseDouble, choice_chooseFloat, choice_chooseInt, choice_chooseLong, choice_chooseShort, choice_chooseString, choice_chooseVol, /* not used, since boxed value is untagged */ choice_chooseUint /* 9 */ } ChoiceTypes; #define TAG(x) (UNHANDLE(x)->Get(1)) #define CONTENTS(x) (SAVE(UNHANDLE(x)->Get(0))) #define LIST_ISNULL(x) (ML_Cons_Cell::IsNull(UNHANDLE(x))) #define LIST_HEAD(x) (SAVE(Head(DEREFWORD(x)))) #define LIST_TAIL(x) (SAVE(Tail(DEREFWORD(x)))) #define LIST_NULL (SAVE(ListNull)) static Handle LIST_CONS (TaskData *taskData, Handle x,Handle xs) { Handle res = SAVE(alloc(taskData, sizeof(ML_Cons_Cell))); Head(DEREFWORD(res)) = UNHANDLE(x); Tail(DEREFWORD(res)) = DEREFWORD(xs); return res; } #define TUPLE_GET1(x) (SAVE(DEREFHANDLE(x)->Get(0))) #define TUPLE_GET2(x) (SAVE(DEREFHANDLE(x)->Get(1))) #define TUPLE_GET3(x) (SAVE(DEREFHANDLE(x)->Get(2))) static Handle TUPLE_MAKE2 (TaskData *taskData, Handle x,Handle y) { Handle res = SAVE(alloc(taskData, 2)); DEREFHANDLE(res)->Set(0, DEREFWORD(x)); DEREFHANDLE(res)->Set(1, DEREFWORD(y)); return res; } /* For testing... static Handle print_ctype_and_vol (Handle pair) { word* ctype = UNHANDLE(TUPLE_GET1(pair)); Handle vol = TUPLE_GET2(pair); void* thing = DEREFVOL(taskData, UNHANDLE(vol)); switch ((Ctype)UNTAGGED(ctype)) { case Cchar : printf("Cchar <%c>\n", *(char*)thing); break; case Cdouble : printf("Cdouble <%f>\n", *(double*)thing); break; case Cfloat : printf("Cfloat <%f>\n", *(float*)thing); break; case Cint : printf("Cint <%d>\n", *(int*)thing); break; case Clong : printf("Clong <%ld>\n", *(long*)thing); break; case Cpointer : printf("Cpointer <%.3s>...\n", *(char**)thing); break; case Cshort : printf("Cshort <%d>\n", *(short*)thing); break; default : { show(("Must be a Cstruct <%d>\n", get_C_long(taskData, ctype))); }} return pair; } ...*/ static Handle union2vol_and_ctype (TaskData *taskData, Handle u) { Handle contents = CONTENTS(u); switch (UNTAGGED(TAG(u))) { case union_Char: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cchar)), toCchar(taskData, contents)); case union_Double: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cdouble)), toCdouble(taskData, contents)); case union_Float: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cfloat)), toCfloat(taskData, contents)); case union_Int: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cint)), toCint(taskData, contents)); case union_Long: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Clong)), toClong(taskData, contents)); case union_Short: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cshort)), toCshort(taskData, contents)); case union_String: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cpointer)), toCstring(taskData, contents)); case union_Uint: return TUPLE_MAKE2(taskData, SAVE(TAGGED(Cuint)), toCuint(taskData, contents)); case union_Vol: return contents; default: RAISE_EXN ("Unknown union tag"); } /*NOTREACHED*/ return 0; } static Handle choice2ctype (TaskData *taskData, Handle choice) { PolyWord either_tag_or_pointer = DEREFWORDHANDLE(choice); if (IS_INT(either_tag_or_pointer)) { switch (UNTAGGED(either_tag_or_pointer)) { case choice_chooseChar: return SAVE(TAGGED(Cchar)); case choice_chooseDouble: return SAVE(TAGGED(Cdouble)); case choice_chooseFloat: return SAVE(TAGGED(Cfloat)); case choice_chooseInt: return SAVE(TAGGED(Cint)); case choice_chooseLong: return SAVE(TAGGED(Clong)); case choice_chooseShort: return SAVE(TAGGED(Cshort)); case choice_chooseString: return SAVE(TAGGED(Cpointer)); case choice_chooseUint: return SAVE(TAGGED(Cuint)); default: RAISE_EXN ("Unknown choice type"); return 0; } } else /* It's a pointer */ return SAVE(either_tag_or_pointer.AsObjPtr()->Get(0)); } static Handle choice_and_vol2union (TaskData *taskData, Handle pair) { Handle choice = TUPLE_GET1(pair); Handle vol = TUPLE_GET2(pair); PolyWord maybe_tag = DEREFWORDHANDLE(choice); if (IS_INT(maybe_tag)) { switch (UNTAGGED(maybe_tag)) { case choice_chooseChar: return UNION_MAKE(taskData, union_Char, fromCchar(taskData, vol)); case choice_chooseDouble: return UNION_MAKE(taskData, union_Double, fromCdouble(taskData, vol)); case choice_chooseFloat: return UNION_MAKE(taskData, union_Float, fromCfloat(taskData, vol)); case choice_chooseInt: return UNION_MAKE(taskData, union_Int, fromCint(taskData, vol)); case choice_chooseLong: return UNION_MAKE(taskData, union_Long, fromClong(taskData, vol)); case choice_chooseShort: return UNION_MAKE(taskData, union_Short, fromCshort(taskData, vol)); case choice_chooseString: return UNION_MAKE(taskData, union_String, fromCstring(taskData, vol)); case choice_chooseUint: return UNION_MAKE(taskData, union_Uint, fromCuint(taskData, vol)); default: RAISE_EXN ("Unknown choice type"); return 0; } } else /* It's a pointer */ return UNION_MAKE(taskData, union_Vol, vol); } /* DCJM 7/4/04. Based on reading the code, it seems as though the arguments to a function can be either "in" or "out" parameters. "in" parameters are passed as expected from ML to C whereas "out" parameters have to be constructed from the type information supplied and their values returned along with the result. */ static void mkArgs (TaskData *taskData, Handle xs, Handle &args, Handle &rets) { TRACE; if (LIST_ISNULL(xs)) { args = LIST_NULL; rets = LIST_NULL; } else { Handle x = LIST_HEAD(xs); mkArgs(taskData, LIST_TAIL(xs), args, rets); switch (UNTAGGED(TAG(x))) { case directedArg_In: { // IN parameter - We have the type information and the value to pass. // Convert the value into a "vol". Handle vol_and_ctype = union2vol_and_ctype(taskData, CONTENTS(x)); args = LIST_CONS(taskData, vol_and_ctype,args); return; } case directedArg_Out: { // OUT parameter - We have just the type information and have to construct // a "vol" to pass as the actual argument. Handle choice = CONTENTS(x); Handle ctype = choice2ctype(taskData, choice); Handle space = allocate(taskData, c_sizeof(taskData, ctype)); Handle arg = TUPLE_MAKE2(taskData, SAVE(TAGGED(Cpointer)), address(taskData, space)); Handle ret = TUPLE_MAKE2(taskData, choice,space); args = LIST_CONS(taskData, arg,args); rets = LIST_CONS(taskData, ret,rets); return; } default: RAISE_EXN ("Unknown directedArg tag\n"); } } /*NOTREACHED*/ } typedef Handle (*Handle2Handle)(TaskData *taskData, Handle); static Handle map (TaskData *taskData,Handle2Handle f, Handle xs) { return LIST_ISNULL(xs) ? LIST_NULL : LIST_CONS(taskData, f(taskData, LIST_HEAD(xs)), map(taskData, f,LIST_TAIL(xs)) ); } /* DCJM 7/4/04. For reading the code it seems as though call_sym_and_convert takes three arguments: sym, unionArgs and retChoice and returns a pair (x, y) as the result. sym is simply the symbol to call. unionArgs is a list of arguments to the function. An argument can either be an "in" parameter consisting of type info and a value or an "out" parameter in which case only the type info is supplied. retChoice is the type of the result. The result of this function is a pair consisting of the value and a list of the "out" parameters. The reason for using call_sym_and_convert rather than call_sym is that call_sym_and_convert takes the function arguments as a list of a union of the ML values and converts them to the "vols" with the C values as part of the call. This avoids the multiple calls between ML and the RTS that would be needed if each argument was converted separately, something that is needed for call_sym. */ static Handle call_sym_and_convert (TaskData *taskData, Handle triple) { TRACE; Handle sym = TUPLE_GET1(triple); Handle unionArgs = TUPLE_GET2(triple); Handle retChoice = TUPLE_GET3(triple); Handle args, rets; mkArgs(taskData, unionArgs, args, rets); Handle retCtype = choice2ctype(taskData, retChoice); // If call_sym results in a callback the save vector will be reset and // all these handles will be overwritten. We have to save them on a // separate stack per thread. Handle newStack = alloc_and_save(taskData, 3, 0); newStack->WordP()->Set(0, retChoice->Word()); newStack->WordP()->Set(1, rets->Word()); newStack->WordP()->Set(2, taskData->foreignStack); taskData->foreignStack = newStack->Word(); /*map(print_ctype_and_vol,args);*/ Handle vol = call_sym(taskData, sym,args,retCtype); // Pop the old values and put them back on the save vector retChoice = SAVE(taskData->foreignStack.AsObjPtr()->Get(0)); rets = SAVE(taskData->foreignStack.AsObjPtr()->Get(1)); taskData->foreignStack = taskData->foreignStack.AsObjPtr()->Get(2); return TUPLE_MAKE2 (taskData, choice_and_vol2union(taskData, TUPLE_MAKE2(taskData, retChoice, vol)), map(taskData, choice_and_vol2union, rets)); } // This is the C function that will get control when any callback is made. The "data" // argument is the entry in the callback table for this callback. static void callbackEntryPt(ffi_cif *cif, void *ret, void* args[], void *data) { uintptr_t cbIndex = (uintptr_t)data; ASSERT(cbIndex >= 0 && cbIndex < callBackEntries); struct _cbStructEntry *cbEntry = &callbackTable[cbIndex]; // We should get the task data for the thread that is running this code. // If this thread has been created by the foreign code we will have to // create a new one here. TaskData *taskData = processes->GetTaskDataForThread(); if (taskData == 0) { try { taskData = processes->CreateNewTaskData(0, 0, 0, TAGGED(0)); } catch (std::bad_alloc &) { ::Exit("Unable to create thread data - insufficient memory"); } catch (MemoryException &) { ::Exit("Unable to create thread data - insufficient memory"); } } else processes->ThreadUseMLMemory(taskData); Handle mark = taskData->saveVec.mark(); Handle h = SAVE(cbEntry->mlFunction); // Construct an ML argument list from the arguments. Handle saved = taskData->saveVec.mark(); Handle mlArgs = SAVE(ListNull); for (unsigned i = cif->nargs; i > 0; i--) { ffi_type *argType = cif->arg_types[i-1]; Handle value = vol_alloc_with_c_space(taskData, argType->size); memcpy(DEREFVOL(taskData, UNHANDLE(value)), args[i-1], argType->size); Handle next = alloc_and_save(taskData, sizeof(ML_Cons_Cell)/sizeof(PolyWord)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(mlArgs); taskData->saveVec.reset(saved); mlArgs = SAVE(DEREFHANDLE(next)); } // Callbacks previously involved forking a new ML process. They are // now handled on the caller's stack. Handle resultHandle = taskData->EnterCallbackFunction(h, mlArgs); PolyWord resultWord = UNHANDLE(resultHandle); taskData->saveVec.reset(mark); memcpy(ret, DEREFVOL(taskData, resultWord), cif->rtype->size); // Once we have copied the result into C memory we are free of the // ML memory and can allow any GC. processes->ThreadReleaseMLMemory(taskData); } // Creates a call-back entry. Callbacks are never GCd because we don't know when // the C code will be finished with them. static Handle createCallbackFunction(TaskData *taskData, Handle triple, ffi_abi abi) { TRACE; Handle argTypeList = TUPLE_GET1(triple); Handle cResultType = TUPLE_GET2(triple); Handle mlFunction = TUPLE_GET3(triple); PLocker pLocker(&callbackTableLock); // Make a new entry in the callback table. struct _cbStructEntry *newTable = (struct _cbStructEntry*)realloc(callbackTable, (callBackEntries+1)*sizeof(struct _cbStructEntry)); if (newTable == 0) RAISE_EXN("Unable to allocate memory for callback table"); callbackTable = newTable; callbackTable[callBackEntries].argType = UNHANDLE(argTypeList); callbackTable[callBackEntries].mlFunction = UNHANDLE(mlFunction); callbackTable[callBackEntries].cFunction = 0; void *resultFunction; ffi_closure *closure = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &resultFunction); if (closure == 0) RAISE_EXN("Callbacks not implemented or insufficient memory"); unsigned num_args = length_list(argTypeList->Word()); ffi_type **arg_types = (ffi_type**)malloc(num_args * sizeof(ffi_type*)); if (arg_types == 0) RAISE_EXN("Insufficient memory to allocate space for arguments"); PolyWord p = argTypeList->Word(); for (POLYUNSIGNED i=0; iWord()); // The cif needs to be on the heap so that it is available in the callback. ffi_cif *cif = (ffi_cif *)malloc(sizeof(ffi_cif)); if (cif == 0) RAISE_EXN("Insufficient memory to allocate space for cif"); if (ffi_prep_cif(cif, abi, num_args, result_type, arg_types) != FFI_OK) RAISE_EXN("libffi error: ffi_prep_cif failed"); // Pass the index into the callback table here rather than the address of the entry // because the table may move if we realloc. if (ffi_prep_closure_loc(closure, cif, callbackEntryPt, (void*)((uintptr_t)callBackEntries), resultFunction) != FFI_OK) RAISE_EXN("libffi error: ffi_prep_closure_loc failed"); callbackTable[callBackEntries].cFunction = (unsigned char*)resultFunction; /* Construct a "vol" containing the pointer to the C function. */ Handle res = vol_alloc_with_c_space(taskData, sizeof(void*)); PLocker plocker(&volLock); *(unsigned char **)C_POINTER(UNVOLHANDLE(res)) = callbackTable[callBackEntries].cFunction; callBackEntries++; return res; } /* Create a callback using C calling conventions. The calling function removes the arguments from the stack. */ static Handle toCfunction (TaskData *taskData, Handle triple) { return createCallbackFunction(taskData, triple, FFI_DEFAULT_ABI); } /* Create a callback using Pascal/WINAPI/CALLBACK/__stdcall calling conventions. The CALLED function must remove the arguments from the stack before returning. */ static Handle toPascalfunction (TaskData *taskData, Handle triple) { #if(defined(_WIN32) && ! defined(_WIN64)) // We can't actually test for FFI_STDCALL here because it's a value in an enum not a define. return createCallbackFunction(taskData, triple, FFI_STDCALL); #else RAISE_EXN("Pascal (stdcall) calling conventions are not supported on this platform"); return (Handle)0; #endif } typedef void (*finalType)(void*); // Set a finalisation function: A C function that is called when the Vol is freed by // the GC. static Handle set_final (TaskData *taskData, Handle pair) { Handle symH = TUPLE_GET1(pair); Handle volH = TUPLE_GET2(pair); PolyVolData *vol = (PolyVolData*)(UNHANDLE(volH)); finalType f = *(finalType*)DEREFVOL(taskData, symH->Word()); FINALISER(vol) = f; return SAVE(TAGGED(0)); } // Return the NULL vol. This is a persistent vol which always contains null. static Handle getNull(TaskData *taskData, Handle) { return SAVE((PolyObject*)IoEntry(POLY_SYS_foreign_null)); } /********************************************************************** * * Foreign Dispatch * **********************************************************************/ typedef Handle(* type_hh_fun)(TaskData *taskData, Handle); static type_hh_fun handlers[] = { get_foreign_debug, set_foreign_debug, load_lib, load_sym, call_sym_and_convert, allocate, address, deref, offset, assign, c_sizeof, alignment, toCchar, fromCchar, toCdouble, fromCdouble, toCfloat, fromCfloat, toCint, fromCint, toClong, fromClong, toCshort, fromCshort, fillCstring, toCstring, fromCstring, toCuint, /* Added DCJM 17/5/01. */ fromCuint, /* Added DCJM 17/5/01. */ toCbytes, /* Added DCJM 29/6/01. */ fromCbytes, toCfunction, /* Added DCJM 7/4/04. */ toPascalfunction, /* Added DCJM 7/4/04. */ set_final, /* Added DCJM 2/8/09. */ getNull // Added DCJM 16/11/11. }; #define NUM_HANDLERS ((int)(sizeof(handlers)/sizeof(type_hh_fun))) Handle foreign_dispatch_c (TaskData *taskData, Handle args, Handle fcode_h) { int fcode = get_C_int(taskData, DEREFWORD(fcode_h)); if (fcode < 0 || fcode >= NUM_HANDLERS) { char buf[100]; sprintf(buf, "Unknown foreign dispatch code <%d>", fcode); RAISE_EXN(buf); } mes(("dispatch code = %d\n", fcode)); /* dispatch to desired function */ return (handlers[fcode])(taskData, args); } #else // The foreign function interface isn't available. #include "foreign.h" #include "run_time.h" #include "sys.h" Handle foreign_dispatch_c (TaskData *taskData, Handle args, Handle fcode_h) { raise_exception_string(taskData, EXC_foreign, "The foreign function interface is not available on this platform"); } #endif polyml-5.6/libpolyml/foreign.h000066400000000000000000000021511265146633400165160ustar00rootroot00000000000000/* Title: Header for foreign function interface Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _FOREIGN_H_DEFINED #define _FOREIGN_H_DEFINED 1 class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; class ScanAddress; extern Handle foreign_dispatch_c (TaskData *taskData, Handle args, Handle fcode_h); #endif polyml-5.6/libpolyml/gc.cpp000066400000000000000000000336671265146633400160310ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector Copyright (c) 2010-12 David C. J. Matthews Based on the original garbage collector code Copyright 2000-2008 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "run_time.h" #include "machine_dep.h" #include "diagnostics.h" #include "processes.h" #include "timing.h" #include "gc.h" #include "scanaddrs.h" #include "check_objects.h" #include "osmem.h" #include "bitmap.h" #include "rts_module.h" #include "memmgr.h" #include "gctaskfarm.h" #include "mpoly.h" #include "statistics.h" #include "profiling.h" #include "heapsizing.h" static GCTaskFarm gTaskFarm; // Global task farm. GCTaskFarm *gpTaskFarm = &gTaskFarm; // If the GC converts a weak ref from SOME to NONE it sets this ref. It can be // cleared by the signal handler thread. There's no need for a lock since it // is only set during GC and only cleared when not GCing. bool convertedWeak = false; /* How the garbage collector works. The GC has two phases. The minor (quick) GC is a copying collector that copies data from the allocation area into the mutable and immutable area. The major collector is started when either the mutable or the immutable area is full. The major collector uses a mark/sweep scheme. The GC has three phases: 1. Mark phase. Working from the roots; which are the the permanent mutable segments and the RTS roots (e.g. thread stacks), mark all reachable cells. Marking involves setting bits in the bitmap for reachable words. 2. Compact phase. Marked objects are copied to try to compact, upwards, the heap segments. When an object is moved the length word of the object in the old location is set as a tombstone that points to its new location. In particular this means that we cannot reuse the space where an object previously was during the compaction phase. Immutable objects are moved into immutable segments. When an object is moved to a new location the bits are set in the bitmap as though the object had been marked at that location. 3. Update phase. The roots and objects marked during the first two phases are scanned and any addresses for moved objects are updated. The lowest address used in the area then becomes the base of the area for future allocations. There is a sharing phase which may be performed before the mark phase. This merges immutable cells with the same contents with the aim of reducing the size of the live data. It is expensive so is not performed by default. Updated DCJM 12/06/12 */ static bool doGC(const POLYUNSIGNED wordsRequiredToAllocate) { unsigned j; gHeapSizeParameters.RecordAtStartOfMajorGC(); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeStart); globalStats.incCount(PSC_GC_FULLGC); // Remove any empty spaces. There will not normally be any except // if we have triggered a full GC as a result of detecting paging in the // minor GC but in that case we want to try to stop the system writing // out areas that are now empty. gMem.RemoveEmptyLocals(); if (debugOptions & DEBUG_GC) Log("GC: Full GC, %lu words required %u spaces\n", wordsRequiredToAllocate, gMem.nlSpaces); if (debugOptions & DEBUG_HEAPSIZE) gMem.ReportHeapSizes("Full GC (before)"); // Data sharing pass. if (gHeapSizeParameters.PerformSharingPass()) GCSharingPhase(); /* * There is a really weird bug somewhere. An extra bit may be set in the bitmap during * the mark phase. It seems to be related to heavy swapping activity. Duplicating the * bitmap causes it to occur only in one copy and write-protecting the bitmap apart from * when it is actually being updated does not result in a seg-fault. So far I've only * seen it on 64-bit Linux but it may be responsible for other crashes. The work-around * is to check the number of bits set in the bitmap and repeat the mark phase if it does * not match. */ for (unsigned p = 3; p > 0; p--) { for(j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; ASSERT (lSpace->top >= lSpace->upperAllocPtr); ASSERT (lSpace->upperAllocPtr >= lSpace->lowerAllocPtr); ASSERT (lSpace->lowerAllocPtr >= lSpace->bottom); // Set upper and lower limits of weak refs. lSpace->highestWeak = lSpace->bottom; lSpace->lowestWeak = lSpace->top; lSpace->fullGCLowerLimit = lSpace->top; // Put dummy objects in the unused space. This allows // us to scan over the whole of the space. gMem.FillUnusedSpace(lSpace->lowerAllocPtr, lSpace->upperAllocPtr-lSpace->lowerAllocPtr); } // Set limits of weak refs. for (j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *pSpace = gMem.pSpaces[j]; pSpace->highestWeak = pSpace->bottom; pSpace->lowestWeak = pSpace->top; } /* Mark phase */ GCMarkPhase(); POLYUNSIGNED bitCount = 0, markCount = 0; for (j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; markCount += lSpace->i_marked + lSpace->m_marked; bitCount += lSpace->bitmap.CountSetBits(lSpace->spaceSize()); } if (markCount == bitCount) break; else { // Report an error. If this happens again we crash. Log("GC: Count error for space %u - mark count %lu, bitCount %lu\n", j, markCount, bitCount); if (p == 1) { ASSERT(markCount == bitCount); } } } for(j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; // Reset the allocation pointers. They will be set to the // limits of the retained data. lSpace->lowerAllocPtr = lSpace->bottom; lSpace->upperAllocPtr = lSpace->top; } if (debugOptions & DEBUG_GC) Log("GC: Check weak refs\n"); /* Detect unreferenced streams, windows etc. */ GCheckWeakRefs(); // Check that the heap is not overfull. We make sure the marked // mutable and immutable data is no more than 90% of the // corresponding areas. This is a very coarse adjustment. { POLYUNSIGNED iMarked = 0, mMarked = 0; POLYUNSIGNED iSpace = 0, mSpace = 0; for (unsigned i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *lSpace = gMem.lSpaces[i]; iMarked += lSpace->i_marked; mMarked += lSpace->m_marked; if (! lSpace->allocationSpace) { if (lSpace->isMutable) mSpace += lSpace->spaceSize(); else iSpace += lSpace->spaceSize(); } } // Add space if necessary and possible. while (iMarked > iSpace - iSpace/10 && gHeapSizeParameters.AddSpaceBeforeCopyPhase(false) != 0) iSpace += gMem.DefaultSpaceSize(); while (mMarked > mSpace - mSpace/10 && gHeapSizeParameters.AddSpaceBeforeCopyPhase(true) != 0) mSpace += gMem.DefaultSpaceSize(); } /* Compact phase */ GCCopyPhase(); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Copy"); // Update Phase. if (debugOptions & DEBUG_GC) Log("GC: Update\n"); GCUpdatePhase(); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Update"); { POLYUNSIGNED iUpdated = 0, mUpdated = 0, iMarked = 0, mMarked = 0; for(j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; iMarked += lSpace->i_marked; mMarked += lSpace->m_marked; if (lSpace->isMutable) mUpdated += lSpace->updated; else iUpdated += lSpace->updated; } ASSERT(iUpdated+mUpdated == iMarked+mMarked); } // Delete empty spaces. gMem.RemoveEmptyLocals(); if (debugOptions & DEBUG_GC) { for(j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; Log("GC: %s space %p %d free in %d words %2.1f%% full\n", lSpace->spaceTypeString(), lSpace, lSpace->freeSpace(), lSpace->spaceSize(), ((float)lSpace->allocatedSpace()) * 100 / (float)lSpace->spaceSize()); } } // Compute values for statistics globalStats.setSize(PSS_AFTER_LAST_GC, 0); globalStats.setSize(PSS_AFTER_LAST_FULLGC, 0); globalStats.setSize(PSS_ALLOCATION, 0); globalStats.setSize(PSS_ALLOCATION_FREE, 0); for (j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; POLYUNSIGNED free = space->freeSpace(); globalStats.incSize(PSS_AFTER_LAST_GC, free*sizeof(PolyWord)); globalStats.incSize(PSS_AFTER_LAST_FULLGC, free*sizeof(PolyWord)); if (space->allocationSpace) { if (space->allocatedSpace() > space->freeSpace()) // It's more than half full gMem.ConvertAllocationSpaceToLocal(space); else { globalStats.incSize(PSS_ALLOCATION, free*sizeof(PolyWord)); globalStats.incSize(PSS_ALLOCATION_FREE, free*sizeof(PolyWord)); } } #ifdef FILL_UNUSED_MEMORY memset(space->bottom, 0xaa, (char*)space->upperAllocPtr - (char*)space->bottom); #endif if (debugOptions & DEBUG_GC) Log("GC: %s space %p %d free in %d words %2.1f%% full\n", space->spaceTypeString(), space, space->freeSpace(), space->spaceSize(), ((float)space->allocatedSpace()) * 100 / (float)space->spaceSize()); } // End of garbage collection gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeEnd); // Now we've finished we can adjust the heap sizes. gHeapSizeParameters.AdjustSizeAfterMajorGC(wordsRequiredToAllocate); gHeapSizeParameters.resetMajorTimingData(); bool haveSpace = gMem.CheckForAllocation(wordsRequiredToAllocate); // Invariant: the bitmaps are completely clean. if (debugOptions & DEBUG_GC) { if (haveSpace) Log("GC: Completed successfully\n"); else Log("GC: Completed with insufficient space\n"); } if (debugOptions & DEBUG_HEAPSIZE) gMem.ReportHeapSizes("Full GC (after)"); // if (profileMode == kProfileLiveData || profileMode == kProfileLiveMutables) // printprofile(); CheckMemory(); return haveSpace; // Completed } // Create the initial heap. hsize, isize and msize are the requested heap sizes // from the user arguments in units of kbytes. // Fills in the defaults and attempts to allocate the heap. If the heap size // is too large it allocates as much as it can. The default heap size is half the // physical memory. void CreateHeap() { // Create an initial allocation space. if (gMem.CreateAllocationSpace(gMem.DefaultSpaceSize()) == 0) Exit("Insufficient memory to allocate the heap"); // Create the task farm if required if (userOptions.gcthreads != 1) { if (! gTaskFarm.Initialise(userOptions.gcthreads, 100)) Crash("Unable to initialise the GC task farm"); } // Set up the stacks for the mark phase. initialiseMarkerTables(); } class FullGCRequest: public MainThreadRequest { public: FullGCRequest(): MainThreadRequest(MTP_GCPHASEMARK) {} virtual void Perform() { doGC (0); } }; class QuickGCRequest: public MainThreadRequest { public: QuickGCRequest(POLYUNSIGNED words): MainThreadRequest(MTP_GCPHASEMARK), wordsRequired(words) {} virtual void Perform() { result = #ifndef DEBUG_ONLY_FULL_GC // If DEBUG_ONLY_FULL_GC is defined then we skip the partial GC. RunQuickGC(wordsRequired) || #endif doGC (wordsRequired); } bool result; POLYUNSIGNED wordsRequired; }; // Perform a full garbage collection. This is called either from ML via the full_gc RTS call // or from various RTS functions such as open_file to try to recover dropped file handles. void FullGC(TaskData *taskData) { FullGCRequest request; processes->MakeRootRequest(taskData, &request); if (convertedWeak) // Notify the signal thread to broadcast on the condition var when // the GC is complete. We mustn't call SignalArrived within the GC // because it locks schedLock and the main GC thread already holds schedLock. processes->SignalArrived(); } // This is the normal call when memory is exhausted and we need to garbage collect. bool QuickGC(TaskData *taskData, POLYUNSIGNED wordsRequiredToAllocate) { QuickGCRequest request(wordsRequiredToAllocate); processes->MakeRootRequest(taskData, &request); if (convertedWeak) processes->SignalArrived(); return request.result; } // Called in RunShareData. This is called as a root function void FullGCForShareCommonData(void) { doGC(0); } polyml-5.6/libpolyml/gc.h000066400000000000000000000035541265146633400154660ustar00rootroot00000000000000/* Title: gc.h - exports signature for gc.cpp Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2010 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GC_H_INCLUDED #define GC_H_INCLUDED #include "globals.h" // For POLYUNSIGNED class TaskData; // Make a request for a full garbage collection. extern void FullGC(TaskData *taskData); // Make a request for a partial garbage collection. extern bool QuickGC(TaskData *taskData, POLYUNSIGNED words_needed); extern void CreateHeap(); extern void FullGCForShareCommonData(void); extern bool convertedWeak; // Multi-thread GC. extern void initialiseMarkerTables(); // The task farm for the GC. The threads are left waiting for the GC, class GCTaskFarm; extern GCTaskFarm *gpTaskFarm; extern void CopyObjectToNewAddress(PolyObject *srcAddress, PolyObject *destAddress, POLYUNSIGNED L); extern bool RunQuickGC(const POLYUNSIGNED wordsRequiredToAllocate); // GC Phases. extern void GCSharingPhase(void); extern void GCMarkPhase(void); extern void GCheckWeakRefs(void); extern void GCCopyPhase(void); extern void GCUpdatePhase(void); #endif polyml-5.6/libpolyml/gc_check_weak_ref.cpp000066400000000000000000000135161265146633400210200ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector - Check for weak references Copyright (c) 2010, 2012, 2015 David C. J. Matthews Based on the original garbage collector code Copyright 2000-2008 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is an intermediate phase in the GC that checks for weak references that are no longer reachable. It is performed after the first, mark, phase. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "gc.h" #include "scanaddrs.h" #include "rts_module.h" #include "memmgr.h" class MTGCCheckWeakRef: public ScanAddress { public: void ScanAreas(void); private: virtual void ScanRuntimeAddress(PolyObject **pt, RtsStrength weak); // This has to be defined since it's virtual. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } virtual void ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED lengthWord); }; // This deals with weak references within the run-time system. void MTGCCheckWeakRef::ScanRuntimeAddress(PolyObject **pt, RtsStrength weak) { /* If the object has not been marked and this is only a weak reference */ /* then the pointer is set to zero. This allows streams or windows */ /* to be closed if there is no other reference to them. */ PolyObject *val = *pt; PolyWord w = val; if (weak == STRENGTH_STRONG) return; LocalMemSpace *space = gMem.LocalSpaceForAddress(w.AsStackAddr()); if (space == 0) return; // Not in local area // If it hasn't been marked set it to zero. if (! space->bitmap.TestBit(space->wordNo(w.AsStackAddr()))) *pt = 0; } // Deal with weak objects void MTGCCheckWeakRef::ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED L) { if (! OBJ_IS_WEAKREF_OBJECT(L) || OBJ_IS_BYTE_OBJECT(L)) return; // Ignore Weak-Byte cells. ASSERT(OBJ_IS_MUTABLE_OBJECT(L)); // Should be a mutable. // See if any of the SOME objects contain unreferenced refs. POLYUNSIGNED length = OBJ_OBJECT_LENGTH(L); PolyWord *baseAddr = (PolyWord*)obj; for (POLYUNSIGNED i = 0; i < length; i++) { PolyWord someAddr = baseAddr[i]; if (someAddr.IsDataPtr()) { LocalMemSpace *someSpace = gMem.LocalSpaceForAddress(someAddr.AsAddress()); if (someSpace != 0) { PolyObject *someObj = someAddr.AsObjPtr(); // If this is a weak object the SOME value may refer to an unreferenced // ref. If so we have to set this entry to NONE. For safety we also // set the contents of the SOME to TAGGED(0). ASSERT(someObj->Length() == 1 && someObj->IsWordObject()); // Should be a SOME node. PolyWord refAddress = someObj->Get(0); bool deleteRef = false; if (refAddress.IsTagged()) // If we have the same SOME cell referenced in two different places // we will have overwritten the address with TAGGED(0) "For safety". // We still need to overwrite the new reference to the SOME cell. deleteRef = true; // We've overwritten it. else { // Usual case: the contents of the SOME cell is the address of a ref. LocalMemSpace *space = gMem.LocalSpaceForAddress(refAddress.AsAddress()); if (space != 0) // If the ref is permanent it's always there. { POLYUNSIGNED new_bitno = space->wordNo(refAddress.AsStackAddr()); // It wasn't marked so it's otherwise unreferenced. if (! space->bitmap.TestBit(new_bitno)) deleteRef = true; } } if (deleteRef) { baseAddr[i] = TAGGED(0); // Set it to NONE. someObj->Set(0, TAGGED(0)); // For safety. convertedWeak = true; } } } } } // We need to check any weak references both in the areas we are // currently collecting and any other areas. This actually checks // weak refs in the area we're collecting even if they are not // actually reachable any more. N.B. This differs from OpMutables // because it also scans the area we're collecting. void MTGCCheckWeakRef::ScanAreas(void) { for (unsigned i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *space = gMem.lSpaces[i]; if (space->isMutable) ScanAddressesInRegion(space->lowestWeak, space->highestWeak); } // Scan the permanent mutable areas. for (unsigned j = 0; j < gMem.npSpaces; j++) { MemSpace *space = gMem.pSpaces[j]; if (space->isMutable) ScanAddressesInRegion(space->lowestWeak, space->highestWeak); } } void GCheckWeakRefs() { MTGCCheckWeakRef checkRef; GCModules(&checkRef); checkRef.ScanAreas(); } polyml-5.6/libpolyml/gc_copy_phase.cpp000066400000000000000000000335511265146633400202330ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector - Copy phase Copyright (c) 2010-12 David C. J. Matthews Based on the original garbage collector code Copyright 2000-2008 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is the second, copy, phase of the garbage collector. The previous, mark, phase has identified all the live data and set the bits in the bit-maps. This phase compacts the memory by copying cells from lower in the segment or from other segments. When a cell is copied the length-word is modified to be a tomb-stone that gives the new location for the cell. Cells can be copied to areas of memory that are shown as free in the bit-maps and the destination area is then marked as allocated. Because there are tomb-stones left behind the original location of a cell must remain as allocated and its space cannot be reused until the GC is complete. We copy cells in a defined order to avoid copying loops. The ordering on the addresses is: Immutable areas (for immutable cells) (highest) Mutable areas Allocation areas (lowest) Within each group a lower position in the gMem.lSpaces is higher MemMgr::AddLocalSpace enters spaces gMem.lSpaces such that immutable areas come before mutable areas which come before allocation areas so this reduces to the order in that table. Within a space higher addresses are higher. So we try to copy data out of the allocation areas and to copy any cells that are now immutable out of the mutable areas. We try to copy data out of higher numbered spaces in order to try to free them completely and to compact data towards the top of a space if we can't. Once a thread has started copying into or out of an area it takes ownership of the area and no other thread can use the area. This avoids */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_STRING_H #include #endif #include "globals.h" #include "machine_dep.h" #include "processes.h" #include "gc.h" #include "scanaddrs.h" #include "bitmap.h" #include "memmgr.h" #include "gctaskfarm.h" #include "locking.h" #include "diagnostics.h" static PLock copyLock("Copy"); // Search the area downwards looking for n consecutive free words. // Return the address of the word if successful or 0 on failure. // "limit" is the bit position of the bottom of the area or, if we're compacting an area, // the bit position of the object we'd like to move to a higher address. static inline PolyWord *FindFreeAndAllocate(LocalMemSpace *dst, POLYUNSIGNED limit, POLYUNSIGNED n) { if (dst == 0) return 0; // No current space /* SPF's version of the start caching code. SPF 2/10/96 */ // The idea of it is to avoid having to search over an area that is // already known not to have any spaces large enough for an object of // a given size. Knowing that there is no space for an object of // size n implies that there is no space for anything of size larger // than n. SPF's idea is that after finding the space in the bitmap // we update only the element for the size we are looking for rather // than everything larger. unsigned truncated_n = n < NSTARTS ? (unsigned)n : NSTARTS - 1; // If we're looking for something larger than last time update // all the entries last time's size and this size. for (unsigned i = dst->start_index; i < truncated_n; i ++) { if (dst->start[i] < dst->start[i+1]) dst->start[i+1] = dst->start[i]; } dst->start_index = truncated_n; POLYUNSIGNED start = dst->start[truncated_n]; if (start <= limit) return 0; // Look in the bitmap. Returns "start" if it can't find space. POLYUNSIGNED free = dst->bitmap.FindFree(limit, start, n); // If we failed to allocate the space (free == start) we set this to // zero to indicate that there is no space for anything of this size // or larger. if (n < NSTARTS) dst->start[n] = free == start ? 0 : free; if (free == start) return 0; // Allocate the space. dst->bitmap.SetBits(free, n); PolyWord *newp = dst->wordAddr(free); /* New object address */ // Update dst->upperAllocPtr, so the new object doesn't get trampled. if (newp < dst->upperAllocPtr) dst->upperAllocPtr = newp; return newp; } // This does nothing to the addresses but by applying it in ScanConstantsWithinCode we // adjust any relative addresses so they are relative to the new location. class MTGCProcessIdentity: public ScanAddress { public: virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } }; // Copy a cell to its new address. void CopyObjectToNewAddress(PolyObject *srcAddress, PolyObject *destAddress, POLYUNSIGNED L) { destAddress->SetLengthWord(L); /* copy length word */ POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); // Unroll loop for most common cases. switch (n) { default: memcpy(destAddress, srcAddress, n * sizeof(PolyWord)); break; case 4: destAddress->Set(3, srcAddress->Get(3)); case 3: destAddress->Set(2, srcAddress->Get(2)); case 2: destAddress->Set(1, srcAddress->Get(1)); case 1: destAddress->Set(0, srcAddress->Get(0)); } // If this is a code object flush out anything from the instruction cache // that might previously have been at this address if (OBJ_IS_CODE_OBJECT(L)) { MTGCProcessIdentity identity; machineDependent->FlushInstructionCache(destAddress, n * sizeof(PolyWord)); // We have to update any relative addresses in the code. machineDependent->ScanConstantsWithinCode(destAddress, srcAddress, OBJ_OBJECT_LENGTH(L), &identity); } } // Find the next space in the sequence. It may return with the space unchanged if it // is unable to find a suitable space. static bool FindNextSpace(LocalMemSpace *src, LocalMemSpace **dst, bool isMutable, GCTaskId *id) { unsigned m = 0; // If we're compressing the space and it's full that's it. if (*dst == src) return false; if (*dst != 0) { // Find the next space after this while (gMem.lSpaces[m] != *dst) m++; m++; } for (; m < gMem.nlSpaces; m++) { LocalMemSpace *lSpace = gMem.lSpaces[m]; if (lSpace == src) { // The only possibility is to compact this area. ASSERT(!isMutable || src->isMutable); *dst = src; return true; // We already own it } if (lSpace->isMutable == isMutable && !lSpace->allocationSpace && lSpace->spaceOwner == 0) { // Now acquire the lock. We have to retest spaceOwner with the lock held. PLocker lock(©Lock); if (lSpace->spaceOwner == 0) { // Change the space. lSpace->spaceOwner = id; *dst = lSpace; // Return the space if (debugOptions & DEBUG_GC) Log("GC: Copy: copying %s cells from %p to %p\n", isMutable ? "mutable" : "immutable", src, lSpace); return true; } } } return false; } // Copy objects from the source space into an earlier space or up within the // current space. static void copyAllData(GCTaskId *id, void * /*arg1*/, void * /*arg2*/) { LocalMemSpace *mutableDest = 0, *immutableDest = 0; for (unsigned i = gMem.nlSpaces; i > 0; i--) { LocalMemSpace *src = gMem.lSpaces[i-1]; if (src->spaceOwner == 0) { PLocker lock(©Lock); if (src->spaceOwner == 0) src->spaceOwner = id; else continue; } else if (src->spaceOwner != id) continue; if (debugOptions & DEBUG_GC) Log("GC: Copy: copying area %p (thread %p) %s \n", src, id, src->spaceTypeString()); // We start at fullGCLowerLimit which is the lowest marked object in the heap // N.B. It's essential that the first set bit at or above this corresponds // to the length word of a real object. POLYUNSIGNED bitno = src->wordNo(src->fullGCLowerLimit); // Set the limit to the top so we won't rescan this. That can // only happen if copying takes a very short time and the same // thread runs multiple tasks. src->fullGCLowerLimit = src->top; // src->highest is the bit position that corresponds to the top of // generation we're copying. POLYUNSIGNED highest = src->wordNo(src->top); for (;;) { if (bitno >= highest) break; /* SPF version; Invariant: 0 < highest - bitno */ bitno += src->bitmap.CountZeroBits(bitno, highest - bitno); if (bitno >= highest) break; /* first set bit corresponds to the length word */ PolyWord *old = src->wordAddr(bitno); /* Old object address */ PolyObject *obj = (PolyObject*)(old+1); POLYUNSIGNED L = obj->LengthWord(); ASSERT (OBJ_IS_LENGTH(L)); POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L) + 1 ;/* Length of allocation (including length word) */ bitno += n; // Find a mutable space for the mutable objects and an immutable space for // the immutables. We copy objects into earlier spaces or within its own // space but we don't copy an object to a later space. This avoids the // risk of copying an object multiple times. Previously this copied objects // into later spaces but that doesn't work well if we have converted old // saved state segments into local areas. It's much better to delete them // if possible. bool isMutable = OBJ_IS_MUTABLE_OBJECT(L); LocalMemSpace *destSpace = isMutable || immutableDest == 0 ? mutableDest : immutableDest; PolyWord *newp = FindFreeAndAllocate(destSpace, (src == destSpace) ? bitno : 0, n); if (newp == 0 && src != destSpace) { // See if we can find a different space. // N.B. FindNextSpace side-effects mutableDest/immutableDest to give the next space. if (FindNextSpace(src, isMutable ? &mutableDest : &immutableDest, isMutable, id)) { bitno -= n; // Redo this object continue; } // else just leave it } if (newp == 0) /* no room */ { // We're not going to move this object // Update src->upperAllocPtr, so the old object doesn't get trampled. if (old < src->upperAllocPtr) src->upperAllocPtr = old; // Previously this continued compressing to try to make space available // on the next GC. Normally full GCs are infrequent so the chances are // that at the next GC other data will have been freed. Just stop at // this point. // However if we're compressing a mutable area and there is immutable // data in it we should move those out because the mutable area is scanned // on every partial GC. if (! src->isMutable || src->i_marked == 0) break; } else { PolyObject *destAddress = (PolyObject*)(newp+1); obj->SetForwardingPtr(destAddress); CopyObjectToNewAddress(obj, destAddress, L); if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Copy: %p %lu %u -> %p\n", obj, OBJ_OBJECT_LENGTH(L), GetTypeBits(L), destAddress); } } if (mutableDest == src) mutableDest = 0; if (immutableDest == src) immutableDest = 0; } } void GCCopyPhase() { unsigned j; mainThreadPhase = MTP_GCPHASECOMPACT; for(j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *lSpace = gMem.lSpaces[j]; POLYUNSIGNED highest = lSpace->wordNo(lSpace->top); for (unsigned i = 0; i < NSTARTS; i++) lSpace->start[i] = highest; lSpace->start_index = NSTARTS - 1; lSpace->spaceOwner = 0; // Reset the allocation pointers. This puts garbage (and real data) below them. // At the end of the compaction the allocation pointer will point below the // lowest real data. lSpace->upperAllocPtr = lSpace->top; } // Copy the mutable data into a lower area if possible. if (gpTaskFarm->ThreadCount() == 0) copyAllData(globalTask, 0, 0); else { // We start as many tasks as we have threads. If the amount of work to // be done is very small one thread could process more than one task. // Have to be careful because we use the task ID to decide which space // to scan. for (j = 0; j < gpTaskFarm->ThreadCount(); j++) gpTaskFarm->AddWorkOrRunNow(©AllData, 0, 0); } gpTaskFarm->WaitForCompletion(); } polyml-5.6/libpolyml/gc_mark_phase.cpp000066400000000000000000000713331265146633400202130ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector - Mark phase Copyright (c) 2010-12, 2015 David C. J. Matthews Based on the original garbage collector code Copyright 2000-2008 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is the first, mark, phase of the garbage collector. It detects all reachable cells in the area being collected. At the end of the phase the bit-maps associated with the areas will have ones for words belonging to cells that must be retained and zeros for words that can be reused. This is now multi-threaded. The mark phase involves setting a bit in the header of each live cell and then a pass over the memory building the bitmaps and clearing this bit. It is unfortunate that we cannot use the GC-bit that is used in forwarding pointers but we may well have forwarded pointers left over from a partially completed minor GC. Using a bit in the header avoids the need for locking since at worst it may involve two threads duplicating some marking. The code ensures that each reachable cell is marked at least once but with multiple threads a cell may be marked by more than once cell if the memory is not fully up to date. Each thread has a stack on which it remembers cells that have been marked but not fully scanned. If a thread runs out of cells of its own to scan it can pick a pointer off the stack of another thread and scan that. The original thread will still scan it some time later but it should find that the addresses in it have all been marked and it can simply pop this off. This is all done without locking. Stacks are only modified by the owning thread and when they pop anything they write zero in its place. Other threads only need to search for a zero to find if they are at the top and if they get a pointer that has already been scanned then this is safe. The only assumption made about the memory is that all the bits of a word are updated together so that a thread will always read a value that is a valid pointer. Many of the ideas are drawn from Flood, Detlefs, Shavit and Zhang 2001 "Parallel Garbage Collection for Shared Memory Multiprocessors". */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "processes.h" #include "gc.h" #include "scanaddrs.h" #include "check_objects.h" #include "bitmap.h" #include "memmgr.h" #include "diagnostics.h" #include "gctaskfarm.h" #include "profiling.h" #include "heapsizing.h" #define MARK_STACK_SIZE 3000 #define LARGECACHE_SIZE 20 class MTGCProcessMarkPointers: public ScanAddress { public: MTGCProcessMarkPointers(); virtual void ScanRuntimeAddress(PolyObject **pt, RtsStrength weak); virtual PolyObject *ScanObjectAddress(PolyObject *base); virtual void ScanAddressesInObject(PolyObject *base, POLYUNSIGNED lengthWord); // Have to redefine this for some reason. void ScanAddressesInObject(PolyObject *base) { ScanAddressesInObject(base, base->LengthWord()); } virtual void ScanConstant(byte *addressOfConstant, ScanRelocationKind code); static void MarkPointersTask(GCTaskId *, void *arg1, void *arg2); static void InitStatics(unsigned threads) { markStacks = new MTGCProcessMarkPointers[threads]; nInUse = 0; nThreads = threads; } static void MarkRoots(void); static bool RescanForStackOverflow(); private: bool TestForScan(PolyWord *pt); void MarkAndTestForScan(PolyWord *pt); void Reset(); void PushToStack(PolyObject *obj, PolyWord *currentPtr = 0, POLYUNSIGNED originalLength = 0) { // If we don't have all the threads running we start a new one but // only once we have several items on the stack. Otherwise we // can end up creating a task that terminates almost immediately. if (nInUse >= nThreads || msp < 2 || ! ForkNew(obj)) { if (msp < MARK_STACK_SIZE) { markStack[msp++] = obj; if (currentPtr != 0) { locPtr++; if (locPtr == LARGECACHE_SIZE) locPtr = 0; largeObjectCache[locPtr].base = obj; largeObjectCache[locPtr].current = currentPtr; } } else StackOverflow(obj); } // else the new task is processing it. } static void StackOverflow(PolyObject *obj); static bool ForkNew(PolyObject *obj); PolyObject *markStack[MARK_STACK_SIZE]; unsigned msp; bool active; // For the typical small cell it's easier just to rescan from the start // but that can be expensive for large cells. This caches the offset for // large cells. static const POLYUNSIGNED largeObjectSize = 50; struct { PolyObject *base; PolyWord *current; } largeObjectCache[LARGECACHE_SIZE]; unsigned locPtr; static MTGCProcessMarkPointers *markStacks; protected: static unsigned nThreads, nInUse; static PLock stackLock; }; // There is one mark-stack for each GC thread. markStacks[0] is used by the // main thread when marking the roots and rescanning after mark-stack overflow. // Once that work is done markStacks[0] is released and is available for a // worker thread. MTGCProcessMarkPointers *MTGCProcessMarkPointers::markStacks; unsigned MTGCProcessMarkPointers::nThreads, MTGCProcessMarkPointers::nInUse; PLock MTGCProcessMarkPointers::stackLock("GC mark stack"); // It is possible to have two levels of forwarding because // we could have a cell in the allocation area that has been moved // to the immutable area and then shared with another cell. inline PolyObject *FollowForwarding(PolyObject *obj) { while (obj->ContainsForwardingPtr()) obj = obj->GetForwardingPtr(); return obj; } MTGCProcessMarkPointers::MTGCProcessMarkPointers(): msp(0), active(false), locPtr(0) { // Clear the mark stack for (unsigned i = 0; i < MARK_STACK_SIZE; i++) markStack[i] = 0; // Clear the large object cache just to be sure. for (unsigned j = 0; j < LARGECACHE_SIZE; j++) { largeObjectCache[j].base = 0; largeObjectCache[j].current = 0; } } // Clear the state at the beginning of a new GC pass. void MTGCProcessMarkPointers::Reset() { locPtr = 0; //largeObjectCache[locPtr].base = 0; // Clear the cache completely just to be safe for (unsigned j = 0; j < LARGECACHE_SIZE; j++) { largeObjectCache[j].base = 0; largeObjectCache[j].current = 0; } } // Called when the stack has overflowed. We need to include this // in the range to be rescanned. void MTGCProcessMarkPointers::StackOverflow(PolyObject *obj) { LocalMemSpace *space = gMem.LocalSpaceForAddress(obj); ASSERT(space != 0); PLocker lock(&space->spaceLock); // Have to include this in the range to rescan. if (space->fullGCRescanStart > ((PolyWord*)obj) - 1) space->fullGCRescanStart = ((PolyWord*)obj) - 1; POLYUNSIGNED n = obj->Length(); if (space->fullGCRescanEnd < ((PolyWord*)obj) + n) space->fullGCRescanEnd = ((PolyWord*)obj) + n; ASSERT(obj->LengthWord() & _OBJ_GC_MARK); // Should have been marked. if (debugOptions & DEBUG_GC) Log("GC: Mark: Stack overflow. Rescan for %p\n", obj); } // Fork a new task. Because we've checked nInUse without taking the lock // we may find that we can no longer create a new task. bool MTGCProcessMarkPointers::ForkNew(PolyObject *obj) { MTGCProcessMarkPointers *marker = 0; { PLocker lock(&stackLock); if (nInUse == nThreads) return false; for (unsigned i = 0; i < nThreads; i++) { if (! markStacks[i].active) { marker = &markStacks[i]; break; } } ASSERT(marker != 0); marker->active = true; nInUse++; } bool test = gpTaskFarm->AddWork(&MTGCProcessMarkPointers::MarkPointersTask, marker, obj); ASSERT(test); return true; } // Main marking task. This is forked off initially to scan a specific object and // anything reachable from it but once that has finished it tries to find objects // on other stacks to scan. void MTGCProcessMarkPointers::MarkPointersTask(GCTaskId *, void *arg1, void *arg2) { MTGCProcessMarkPointers *marker = (MTGCProcessMarkPointers*)arg1; marker->Reset(); marker->ScanAddressesInObject((PolyObject*)arg2); while (true) { // Look for a stack that has at least one item on it. MTGCProcessMarkPointers *steal = 0; for (unsigned i = 0; i < nThreads && steal == 0; i++) { if (markStacks[i].markStack[0] != 0) steal = &markStacks[i]; } // We're finished if they're all done. if (steal == 0) break; // Look for items on this stack for (unsigned j = 0; j < MARK_STACK_SIZE; j++) { // Pick the item off the stack. // N.B. The owning thread may update this to zero // at any time. PolyObject *toSteal = steal->markStack[j]; if (toSteal == 0) break; // Nothing more on the stack // The idea here is that the original thread pushed this // because there were at least two addresses it needed to // process. It started down one branch but left the other. // Since it will have marked cells in the branch it has // followed this thread will start on the unprocessed // address(es). marker->ScanAddressesInObject(toSteal); } } PLocker lock(&stackLock); marker->active = false; // It's finished nInUse--; ASSERT(marker->markStack[0] == 0); } // Tests if this needs to be scanned. It marks it if it has not been marked // unless it has to be scanned. bool MTGCProcessMarkPointers::TestForScan(PolyWord *pt) { if ((*pt).IsTagged()) return false; // This could contain a forwarding pointer if it points into an // allocation area and has been moved by the minor GC. // We have to be a little careful. Another thread could also // be following any forwarding pointers here. However it's safe // because they will update it with the same value. PolyObject *obj = (*pt).AsObjPtr(); if (obj->ContainsForwardingPtr()) { obj = FollowForwarding(obj); *pt = obj; } if (gMem.LocalSpaceForAddress(obj) == 0) return false; // Ignore it if it points to a permanent area POLYUNSIGNED L = obj->LengthWord(); if (L & _OBJ_GC_MARK) return false; // Already marked if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Mark: %p %" POLYUFMT " %u\n", obj, OBJ_OBJECT_LENGTH(L), GetTypeBits(L)); if (OBJ_IS_BYTE_OBJECT(L)) { obj->SetLengthWord(L | _OBJ_GC_MARK); // Mark it return false; // We've done as much as we need } return true; } void MTGCProcessMarkPointers::MarkAndTestForScan(PolyWord *pt) { if (TestForScan(pt)) { PolyObject *obj = (*pt).AsObjPtr(); obj->SetLengthWord(obj->LengthWord() | _OBJ_GC_MARK); } } // The initial entry to process the roots. These may be RTS addresses or addresses in // a thread stack. Also called recursively to process the addresses of constants in // code segments. This is used in situations where a scanner may return the // updated address of an object. PolyObject *MTGCProcessMarkPointers::ScanObjectAddress(PolyObject *obj) { PolyWord val = obj; LocalMemSpace *space = gMem.LocalSpaceForAddress(val.AsAddress()); if (space == 0) return obj; // Ignore it if it points to a permanent area // We may have a forwarding pointer if this has been moved by the // minor GC. if (obj->ContainsForwardingPtr()) { obj = FollowForwarding(obj); val = obj; space = gMem.LocalSpaceForAddress(val.AsAddress()); } ASSERT(obj->ContainsNormalLengthWord()); POLYUNSIGNED L = obj->LengthWord(); if (L & _OBJ_GC_MARK) return obj; // Already marked obj->SetLengthWord(L | _OBJ_GC_MARK); // Mark it if (profileMode == kProfileLiveData || (profileMode == kProfileLiveMutables && obj->IsMutable())) AddObjectProfile(obj); POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Mark: %p %" POLYUFMT " %u\n", obj, n, GetTypeBits(L)); if (OBJ_IS_BYTE_OBJECT(L)) return obj; // If we already have something on the stack we must being called // recursively to process a constant in a code segment. Just push // it on the stack and let the caller deal with it. if (msp != 0) PushToStack(obj); // Can't check this because it may have forwarding ptrs. else { MTGCProcessMarkPointers::ScanAddressesInObject(obj, L); // We can only check after we've processed it because if we // have addresses left over from an incomplete partial GC they // may need to forwarded. CheckObject (obj); } return obj; } // These functions are only called with pointers held by the runtime system. // Weak references can occur in the runtime system, eg. streams and windows. // Weak references are not marked and so unreferenced streams and windows // can be detected and closed. void MTGCProcessMarkPointers::ScanRuntimeAddress(PolyObject **pt, RtsStrength weak) { if (weak == STRENGTH_WEAK) return; *pt = ScanObjectAddress(*pt); CheckPointer (*pt); // Check it after any forwarding pointers have been followed. } // This is called via ScanAddressesInRegion to process the permanent mutables. It is // also called from ScanObjectAddress to process root addresses. // It processes all the addresses reachable from the object. void MTGCProcessMarkPointers::ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED lengthWord) { if (OBJ_IS_BYTE_OBJECT(lengthWord)) return; while (true) { ASSERT (OBJ_IS_LENGTH(lengthWord)); // Get the length and base address. N.B. If this is a code segment // these will be side-effected by GetConstSegmentForCode. POLYUNSIGNED length = OBJ_OBJECT_LENGTH(lengthWord); if (OBJ_IS_WEAKREF_OBJECT(lengthWord)) { // Special case. ASSERT(OBJ_IS_MUTABLE_OBJECT(lengthWord)); // Should be a mutable. ASSERT(OBJ_IS_WORD_OBJECT(lengthWord)); // Should be a plain object. // We need to mark the "SOME" values in this object but we don't mark // the references contained within the "SOME". PolyWord *baseAddr = (PolyWord*)obj; // Mark every word but ignore the result. for (POLYUNSIGNED i = 0; i < length; i++) (void)MarkAndTestForScan(baseAddr+i); // We've finished with this. length = 0; } else if (OBJ_IS_CODE_OBJECT(lengthWord)) { // It's better to process the whole code object in one go. ScanAddress::ScanAddressesInObject(obj, lengthWord); length = 0; // Finished } // else it's a normal object, // If there are only two addresses in this cell that need to be // followed we follow them immediately and treat this cell as done. // If there are more than two we push the address of this cell on // the stack, follow the first address and then rescan it. That way // list cells are processed once only but we don't overflow the // stack by pushing all the addresses in a very large vector. PolyWord *baseAddr = (PolyWord*)obj; PolyWord *endWord = baseAddr + length; PolyObject *firstWord = 0; PolyObject *secondWord = 0; PolyWord *restartAddr = 0; if (obj == largeObjectCache[locPtr].base) { baseAddr = largeObjectCache[locPtr].current; ASSERT(baseAddr > (PolyWord*)obj && baseAddr < ((PolyWord*)obj)+length); if (locPtr == 0) locPtr = LARGECACHE_SIZE-1; else locPtr--; } while (baseAddr != endWord) { PolyWord wordAt = *baseAddr; if (wordAt.IsDataPtr() && wordAt != PolyWord::FromUnsigned(0)) { // Normal address. We can have words of all zeros at least in the // situation where we have a partially constructed code segment where // the constants at the end of the code have not yet been filled in. if (TestForScan(baseAddr)) { if (firstWord == 0) firstWord = baseAddr->AsObjPtr(); else if (secondWord == 0) { // If we need to rescan because there are three or more words to do // this is the place we need to restart (or the start of the cell if it's // small). restartAddr = baseAddr; secondWord = baseAddr->AsObjPtr(); } else break; // More than two words. } } else if (wordAt.IsCodePtr()) { // If we're processing the constant area of a code segment this could // be a code address. // Check that this is actually an address. If we have had a bad pointer // earlier we may treat some length fields as values. ASSERT(gMem.SpaceForAddress(wordAt.AsCodePtr()) != 0); PolyObject *oldObject = ObjCodePtrToPtr(wordAt.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = wordAt.AsCodePtr() - (byte*)oldObject; wordAt = oldObject; bool test = TestForScan(&wordAt); // If we've changed it because we had a left-over forwarding pointer // we need to update the original. PolyObject *newObject = wordAt.AsObjPtr(); wordAt = PolyWord::FromCodePtr((byte*)newObject + offset); if (wordAt != *baseAddr) *baseAddr = wordAt; if (test) { if (firstWord == 0) firstWord = newObject; else if (secondWord == 0) { restartAddr = baseAddr; secondWord = newObject; } else break; } } baseAddr++; } if (baseAddr != endWord) // Put this back on the stack while we process the first word PushToStack(obj, length < largeObjectSize ? 0 : restartAddr, length); else if (secondWord != 0) { // Mark it now because we will process it. secondWord->SetLengthWord(secondWord->LengthWord() | _OBJ_GC_MARK); // Put this on the stack. If this is a list node we will be // pushing the tail. PushToStack(secondWord); } if (firstWord != 0) { // Mark it and process it immediately. firstWord->SetLengthWord(firstWord->LengthWord() | _OBJ_GC_MARK); obj = firstWord; } else if (msp == 0) { markStack[msp] = 0; // Really finished return; } else { // Clear the item above the top. This really is finished. if (msp < MARK_STACK_SIZE) markStack[msp] = 0; // Pop the item from the stack but don't overwrite it yet. // This allows another thread to steal it if there really // is nothing else to do. This is only really important // for large objects. obj = markStack[--msp]; // Pop something. } lengthWord = obj->LengthWord(); } } // Process a constant within the code. This is a direct copy of ScanAddress::ScanConstant // with the addition of the locking. void MTGCProcessMarkPointers::ScanConstant(byte *addressOfConstant, ScanRelocationKind code) { // If this code is in the local area there's the possibility that // ScanObjectAddress could return an updated address for a // constant within the code. This could happen if the code is // in the allocation area or if it has been moved into the // mutable/immutable area by the last incomplete partial GC. // Constants can be aligned on any byte offset so another thread // scanning the same code could see an invalid address if it read // the constant while it was being updated. We put a lock round // this just in case. LocalMemSpace *space = gMem.LocalSpaceForAddress(addressOfConstant); if (space != 0) space->spaceLock.Lock(); PolyWord p = GetConstantValue(addressOfConstant, code); if (space != 0) space->spaceLock.Unlock(); if (! IS_INT(p)) { PolyWord oldValue = p; ScanAddress::ScanAddressAt(&p); if (p != oldValue) // Update it if it has changed. { if (space != 0) space->spaceLock.Lock(); SetConstantValue(addressOfConstant, p, code); if (space != 0) space->spaceLock.Unlock(); } } } // Mark all the roots. This is run in the main thread and has the effect // of starting new tasks as the scanning runs. void MTGCProcessMarkPointers::MarkRoots(void) { ASSERT(nThreads >= 1); ASSERT(nInUse == 0); MTGCProcessMarkPointers *marker = &markStacks[0]; marker->Reset(); marker->active = true; nInUse = 1; // Scan the permanent mutable areas. for (unsigned j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (space->isMutable && ! space->byteOnly) marker->ScanAddressesInRegion(space->bottom, space->top); } // Scan the RTS roots. GCModules(marker); ASSERT(marker->markStack[0] == 0); // When this has finished there may well be other tasks running. PLocker lock(&stackLock); marker->active = false; nInUse--; } // This class just allows us to use ScanAddress::ScanAddressesInRegion to call // ScanAddressesInObject for each object in the region. class Rescanner: public ScanAddress { public: Rescanner(MTGCProcessMarkPointers *marker): m_marker(marker) {} virtual void ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED lengthWord) { // If it has previously been marked it is known to be reachable but // the contents may not have been scanned if the stack overflowed. if (lengthWord &_OBJ_GC_MARK) m_marker->ScanAddressesInObject(obj, lengthWord); } // Have to define this. virtual PolyObject *ScanObjectAddress(PolyObject *base) { ASSERT(false); return 0; } private: MTGCProcessMarkPointers *m_marker; }; // When the threads created by marking the roots have completed we need to check that // the mark stack has not overflowed. If it has we need to rescan. This rescanning // pass may result in a further overflow so if we find we have to rescan we repeat. bool MTGCProcessMarkPointers::RescanForStackOverflow() { ASSERT(nThreads >= 1); ASSERT(nInUse == 0); MTGCProcessMarkPointers *marker = &markStacks[0]; marker->Reset(); marker->active = true; nInUse = 1; bool rescan = false; Rescanner rescanner(marker); for (unsigned m = 0; m < gMem.nlSpaces; m++) { // Rescan any marked objects in the area between fullGCRescanStart and fullGCRescanEnd. // N.B. We may have threads already processing other areas and they could overflow // their stacks and change fullGCRescanStart or fullGCRescanEnd. LocalMemSpace *lSpace = gMem.lSpaces[m]; PolyWord *start, *end; { PLocker lock(&lSpace->spaceLock); start = lSpace->fullGCRescanStart; end = lSpace->fullGCRescanEnd; lSpace->fullGCRescanStart = lSpace->top; lSpace->fullGCRescanEnd = lSpace->bottom; } if (start < end) { rescan = true; if (debugOptions & DEBUG_GC) Log("GC: Mark: Rescanning from %p to %p\n", start, end); rescanner.ScanAddressesInRegion(start, end); } } { PLocker lock(&stackLock); nInUse--; marker->active = false; } return rescan; } static void SetBitmaps(LocalMemSpace *space, PolyWord *pt, PolyWord *top) { while (pt < top) { PolyObject *obj = (PolyObject*)++pt; // If it has been copied by a minor collection skip it if (obj->ContainsForwardingPtr()) { obj = FollowForwarding(obj); ASSERT(obj->ContainsNormalLengthWord()); pt += obj->Length(); } else { POLYUNSIGNED L = obj->LengthWord(); POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); if (L & _OBJ_GC_MARK) { obj->SetLengthWord(L & ~(_OBJ_GC_MARK)); POLYUNSIGNED bitno = space->wordNo(pt); space->bitmap.SetBits(bitno - 1, n + 1); if (OBJ_IS_MUTABLE_OBJECT(L)) space->m_marked += n + 1; else space->i_marked += n + 1; if ((PolyWord*)obj <= space->fullGCLowerLimit) space->fullGCLowerLimit = (PolyWord*)obj-1; if (OBJ_IS_WEAKREF_OBJECT(L)) { // Add this to the limits for the containing area. PolyWord *baseAddr = (PolyWord*)obj; PolyWord *startAddr = baseAddr-1; // Must point AT length word. PolyWord *endObject = baseAddr + n; if (startAddr < space->lowestWeak) space->lowestWeak = startAddr; if (endObject > space->highestWeak) space->highestWeak = endObject; } } pt += n; } } } static void CreateBitmapsTask(GCTaskId *, void *arg1, void *arg2) { LocalMemSpace *lSpace = (LocalMemSpace *)arg1; lSpace->bitmap.ClearBits(0, lSpace->spaceSize()); SetBitmaps(lSpace, lSpace->bottom, lSpace->top); } void GCMarkPhase(void) { mainThreadPhase = MTP_GCPHASEMARK; // Clear the mark counters and set the rescan limits. for(unsigned k = 0; k < gMem.nlSpaces; k++) { LocalMemSpace *lSpace = gMem.lSpaces[k]; lSpace->i_marked = lSpace->m_marked = 0; lSpace->fullGCRescanStart = lSpace->top; lSpace->fullGCRescanEnd = lSpace->bottom; } MTGCProcessMarkPointers::MarkRoots(); gpTaskFarm->WaitForCompletion(); // Do we have to rescan because the mark stack overflowed? bool rescan; do { rescan = MTGCProcessMarkPointers::RescanForStackOverflow(); gpTaskFarm->WaitForCompletion(); } while(rescan); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Mark"); // Turn the marks into bitmap entries. for (unsigned i = 0; i < gMem.nlSpaces; i++) gpTaskFarm->AddWorkOrRunNow(&CreateBitmapsTask, gMem.lSpaces[i], 0); gpTaskFarm->WaitForCompletion(); // Wait for completion of the bitmaps gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Bitmap"); POLYUNSIGNED totalLive = 0; for(unsigned l = 0; l < gMem.nlSpaces; l++) { LocalMemSpace *lSpace = gMem.lSpaces[l]; if (! lSpace->isMutable) ASSERT(lSpace->m_marked == 0); totalLive += lSpace->m_marked + lSpace->i_marked; if (debugOptions & DEBUG_GC) Log("GC: Mark: %s space %p: %" POLYUFMT " immutable words marked, %" POLYUFMT " mutable words marked\n", lSpace->spaceTypeString(), lSpace, lSpace->i_marked, lSpace->m_marked); } if (debugOptions & DEBUG_GC) Log("GC: Mark: Total live data %" POLYUFMT " words\n", totalLive); } // Set up the stacks. void initialiseMarkerTables() { unsigned threads = gpTaskFarm->ThreadCount(); if (threads == 0) threads = 1; MTGCProcessMarkPointers::InitStatics(threads); } polyml-5.6/libpolyml/gc_share_phase.cpp000066400000000000000000000546041265146633400203650ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector - Data sharing phase Copyright (c) 2012 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* GC Sharing pass. This pass is invoked only if the heap sizing code detects that heap space is running very short because it adds a very considerable overhead to GC. It aims to reduce the size of the live data in a similar way to the data sharing function PolyML.shareCommonData by merging immutable cells that contain data that cannot be distinguished. This version of the code now does a deep structure merge in a similar way to the full sharing function. This code first does a full pass over the heap creating lists of cells that could possibly be merged. There are separate lists for byte and word objects up to a fixed size. Larger objects and other objects are not considered. Because all the items in a list have the same length and type (flag bits) we can use the length word to link the items in the list. A consequence of this is that positive long precision values can be shared but negative values cannot. There is a sharing function that first distributes items into a hash table. Then each hash table is sorted and as part of the sorting process cells with the same contents are merged. One cell is chosen and the length words on the others are set to be forwarding pointers to the chosen cell. Hashing allows for easy parallel processing. The structure sharing code works by first sharing the byte data which cannot contain pointers. Then the word data is processed to separate out "tail" cells that contain only tagged integers or pointers to cells that either cannot be merged, such as mutables, or those that have already been processed, such as the byte data. Any pointers to shared data are updated to point to the merged cell. The tail cells are then sorted and shared using the sharing function and become part of the "processed" set. This process is repeated to find cells that are now tails and so on. Compared with the full sharing code this is expensive since it requires repeated scans of the list of unprocessed cells. In particular there may be cells that form loops (basically closures for mutually recusive functions) and if they are present they and anything that points directly or indirectly at them will never be removed from the list. We stop when it appears that we are not making progress and simply do a final bit-wise share of the remainder. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #include "globals.h" #include "processes.h" #include "gc.h" #include "scanaddrs.h" #include "bitmap.h" #include "memmgr.h" #include "diagnostics.h" #include "gctaskfarm.h" #include "heapsizing.h" class ObjEntry { public: ObjEntry(): objList(0), objCount(0), shareCount(0) {} PolyObject *objList; POLYUNSIGNED objCount; POLYUNSIGNED shareCount; }; // There is an instance of this class for each combination of size and // word/byte. class SortVector { public: SortVector(): totalCount(0), carryOver(0) {} void AddToVector(PolyObject *obj, POLYUNSIGNED length); void SortData(void); POLYUNSIGNED TotalCount() const { return totalCount; } POLYUNSIGNED CurrentCount() const { return baseObject.objCount; } POLYUNSIGNED Shared() const; void SetLengthWord(POLYUNSIGNED l) { lengthWord = l; } POLYUNSIGNED CarryOver() const { return carryOver; } static void hashAndSortAllTask(GCTaskId*, void *a, void *b); static void sharingTask(GCTaskId*, void *a, void *b); static void wordDataTask(GCTaskId*, void *a, void *b); private: void sortList(PolyObject *head, POLYUNSIGNED nItems, POLYUNSIGNED &count); ObjEntry baseObject, processObjects[256]; POLYUNSIGNED totalCount; POLYUNSIGNED lengthWord; POLYUNSIGNED carryOver; }; POLYUNSIGNED SortVector::Shared() const { // Add all the sharing counts POLYUNSIGNED shareCount = baseObject.shareCount; for (unsigned i = 0; i < 256; i++) shareCount += processObjects[i].shareCount; return shareCount; } void SortVector::AddToVector(PolyObject *obj, POLYUNSIGNED length) { obj->SetShareChain(baseObject.objList); baseObject.objList = obj; baseObject.objCount++; totalCount++; } // The number of byte and word entries. // Objects of up to and including this size are shared. // Byte objects include strings so it is more likely that // larger objects will share. Word objects that share // are much more likely to be 2 or 3 words. #define NUM_BYTE_VECTORS 22 #define NUM_WORD_VECTORS 10 class GetSharing: public RecursiveScanWithStack { public: GetSharing(); void SortData(void); static void shareByteData(GCTaskId *, void *, void *); static void shareWordData(GCTaskId *, void *, void *); static void shareRemainingWordData(GCTaskId *, void *, void *); protected: virtual bool TestForScan(PolyWord *); virtual void MarkAsScanning(PolyObject *); virtual void StackOverflow(void) {} // Ignore stack overflow virtual void Completed(PolyObject *); private: // The head of chains of cells of the same size SortVector byteVectors[NUM_BYTE_VECTORS]; SortVector wordVectors[NUM_WORD_VECTORS]; POLYUNSIGNED largeWordCount, largeByteCount, excludedCount; }; GetSharing::GetSharing() { for (unsigned i = 0; i < NUM_BYTE_VECTORS; i++) byteVectors[i].SetLengthWord((POLYUNSIGNED)(i+1) | _OBJ_BYTE_OBJ); for (unsigned j = 0; j < NUM_WORD_VECTORS; j++) wordVectors[j].SetLengthWord(j+1); largeWordCount = largeByteCount = excludedCount = 0; } bool GetSharing::TestForScan(PolyWord *pt) { PolyWord p = *pt; ASSERT(p.IsDataPtr()); PolyObject *obj = p.AsObjPtr(); while (obj->ContainsForwardingPtr()) { obj = obj->GetForwardingPtr(); *pt = obj; } ASSERT(obj == (*pt).AsObjPtr()); LocalMemSpace *space = gMem.LocalSpaceForAddress(obj); if (space == 0) return false; // Ignore it if it points to a permanent area if (space->bitmap.TestBit(space->wordNo((PolyWord*)obj))) return false; return true; } void GetSharing::MarkAsScanning(PolyObject *obj) { ASSERT(obj->ContainsNormalLengthWord()); LocalMemSpace *space = gMem.LocalSpaceForAddress(obj); space->bitmap.SetBit(space->wordNo((PolyWord*)obj)); } void GetSharing::Completed(PolyObject *obj) { POLYUNSIGNED L = obj->LengthWord(); // We have tables for word objects and byte objects // We chain entries together using the length word so it // is important that we only do this for objects that // have no other bits in the header, such as the sign bit. if ((L & _OBJ_PRIVATE_FLAGS_MASK) == 0) { POLYUNSIGNED length = obj->Length(); ASSERT(length != 0); if (length <= NUM_WORD_VECTORS) wordVectors[length-1].AddToVector(obj, length); else largeWordCount++; } else if ((L & _OBJ_PRIVATE_FLAGS_MASK) == _OBJ_BYTE_OBJ) { POLYUNSIGNED length = obj->Length(); ASSERT(length != 0); if (length <= NUM_BYTE_VECTORS) byteVectors[length-1].AddToVector(obj, length); else largeByteCount++; } else if (! OBJ_IS_CODE_OBJECT(L) && ! OBJ_IS_MUTABLE_OBJECT(L)) excludedCount++; // Code and mutables can't be shared - see what could be } // Quicksort the list to detect cells with the same content. These are made // to share and removed from further sorting. void SortVector::sortList(PolyObject *head, POLYUNSIGNED nItems, POLYUNSIGNED &shareCount) { while (nItems > 2) { size_t bytesToCompare = OBJ_OBJECT_LENGTH(lengthWord)*sizeof(PolyWord); PolyObject *median = head; head = head->GetShareChain(); median->SetLengthWord(lengthWord); PolyObject *left = 0, *right = 0; POLYUNSIGNED leftCount = 0, rightCount = 0; while (head != 0) { PolyObject *next = head->GetShareChain(); int res = memcmp(median, head, bytesToCompare); if (res == 0) { // Equal - they can share head->SetForwardingPtr(median); shareCount++; } else if (res < 0) { head->SetShareChain(left); left = head; leftCount++; } else { head->SetShareChain(right); right = head; rightCount++; } head = next; } // We can now drop the median and anything that shares with it. // Process the smaller partition recursively and the larger by // tail recursion. if (leftCount < rightCount) { sortList(left, leftCount, shareCount); head = right; nItems = rightCount; } else { sortList(right, rightCount, shareCount); head = left; nItems = leftCount; } } if (nItems == 1) head->SetLengthWord(lengthWord); else if (nItems == 2) { PolyObject *next = head->GetShareChain(); head->SetLengthWord(lengthWord); if (memcmp(head, next, OBJ_OBJECT_LENGTH(lengthWord)*sizeof(PolyWord)) == 0) { next->SetForwardingPtr(head); shareCount++; } else next->SetLengthWord(lengthWord); } } void SortVector::sharingTask(GCTaskId*, void *a, void *b) { SortVector *s = (SortVector *)a; ObjEntry *o = (ObjEntry*)b; s->sortList(o->objList, o->objCount, o->shareCount); } // Process one level of the word data. // N.B. The length words are updated without any locking. This is safe // because all length words are initially chain entries and a chain entry // can be replaced by another chain entry, a forwarding pointer or a normal // length word. Forwarding pointers and normal length words are only ever // set once. There is a small chance that we could lose some sharing as a // result of a race condition if a thread defers an object because it // contains a pointer with a chain entry and later sees an otherwise // equal object where another thread has replaced the chain with a // normal address, adds it to the list for immediate processing and // so never compares the two. void SortVector::wordDataTask(GCTaskId*, void *a, void *) { SortVector *s = (SortVector*)a; // Partition the objects between those that have pointers to objects that are // still to be processed and those that have been processed. if (s->baseObject.objList == 0) return; PolyObject *h = s->baseObject.objList; s->baseObject.objList = 0; s->baseObject.objCount = 0; POLYUNSIGNED words = OBJ_OBJECT_LENGTH(s->lengthWord); s->carryOver = 0; for (unsigned i = 0; i < 256; i++) { // Clear the entries in the hash table but not the sharing count. s->processObjects[i].objList = 0; s->processObjects[i].objCount = 0; } while (h != 0) { PolyObject *next = h->GetShareChain(); bool deferred = false; for (POLYUNSIGNED i = 0; i < words; i++) { PolyWord w = h->Get(i); if (w.IsDataPtr()) { PolyObject *p = w.AsObjPtr(); // Update the addresses of objects that have been merged if (p->ContainsForwardingPtr()) { h->Set(i, p->GetForwardingPtr()); s->carryOver++; } else if (p->ContainsShareChain()) { // If it is still to be shared leave it deferred = true; break; } } } if (deferred) { // We can't do it yet: add it back to the list h->SetShareChain(s->baseObject.objList); s->baseObject.objList = h; s->baseObject.objCount++; } else { // Add it to the hash table. unsigned char hash = 0; for (POLYUNSIGNED i = 0; i < words*sizeof(PolyWord); i++) hash += h->AsBytePtr()[i]; h->SetShareChain(s->processObjects[hash].objList); s->processObjects[hash].objList = h; s->processObjects[hash].objCount++; } h = next; } s->SortData(); } // Sort the entries in the hash table. void SortVector::SortData() { for (unsigned j = 0; j < 256; j++) { ObjEntry *oentry = &processObjects[j]; // Sort this entry. If it's very small just process it now. switch (oentry->objCount) { case 0: break; // Nothing there case 1: // Singleton - just restore the length word oentry->objList->SetLengthWord(lengthWord); break; case 2: { // Two items - process now PolyObject *obj1 = oentry->objList; PolyObject *obj2 = obj1->GetShareChain(); obj1->SetLengthWord(lengthWord); if (memcmp(obj1, obj2, OBJ_OBJECT_LENGTH(lengthWord)*sizeof(PolyWord)) == 0) { obj2->SetForwardingPtr(obj1); oentry->shareCount++; } else obj2->SetLengthWord(lengthWord); break; } default: gpTaskFarm->AddWorkOrRunNow(sharingTask, this, oentry); } } } void SortVector::hashAndSortAllTask(GCTaskId*, void *a, void *b) { SortVector *s = (SortVector *)a; // Hash the contents of the base object then sort them. for (unsigned i = 0; i < 256; i++) { // Clear the entries in the hash table but not the sharing count. s->processObjects[i].objList = 0; s->processObjects[i].objCount = 0; } PolyObject *h = s->baseObject.objList; POLYUNSIGNED bytes = OBJ_OBJECT_LENGTH(s->lengthWord)*sizeof(PolyWord); while (h != 0) { PolyObject *next = h->GetShareChain(); unsigned char hash = 0; for (POLYUNSIGNED j = 0; j < bytes; j++) hash += h->AsBytePtr()[j]; h->SetShareChain(s->processObjects[hash].objList); s->processObjects[hash].objList = h; s->processObjects[hash].objCount++; h = next; } s->SortData(); } // Look for sharing between byte data. These cannot contain pointers // so they can all be processed together. void GetSharing::shareByteData(GCTaskId *, void *a, void *) { GetSharing *s = (GetSharing*)a; for (unsigned i = 0; i < NUM_BYTE_VECTORS; i++) { if (s->byteVectors[i].CurrentCount() != 0) gpTaskFarm->AddWorkOrRunNow(SortVector::hashAndSortAllTask, &(s->byteVectors[i]), 0); } } // Process word data at this particular level void GetSharing::shareWordData(GCTaskId *, void *a, void *) { GetSharing *s = (GetSharing*)a; for (unsigned i = 0; i < NUM_WORD_VECTORS; i++) { if (s->wordVectors[i].CurrentCount() != 0) gpTaskFarm->AddWorkOrRunNow(SortVector::wordDataTask, &(s->wordVectors[i]), 0); } } // Share any entries left. void GetSharing::shareRemainingWordData(GCTaskId *, void *a, void *) { GetSharing *s = (GetSharing*)a; for (unsigned i = 0; i < NUM_WORD_VECTORS; i++) { if (s->wordVectors[i].CurrentCount() != 0) gpTaskFarm->AddWorkOrRunNow(SortVector::hashAndSortAllTask, &(s->wordVectors[i]), 0); } } void GetSharing::SortData() { // First process the byte objects. They cannot contain pointers. // We create a task to do this so that we never have more threads // running than given with --gcthreads. gpTaskFarm->AddWorkOrRunNow(shareByteData, this, 0); gpTaskFarm->WaitForCompletion(); // Word data may contain pointers to other objects. If an object // has been processed its header will contain either a normal length // word or a forwarding pointer if it shares. We can process an // object if every word in it is either a tagged integer or an // address we have already processed. This works provided there // are no loops so when we reach a stage where we are unable to // process anything we simply run a final scan on the remainder. // Loops can arise from the closures of mutually recursive functions. // Now process the word entries until we have nothing left apart from loops. POLYUNSIGNED lastCount = 0, lastShared = 0; for (unsigned n = 0; n < NUM_WORD_VECTORS; n++) lastCount += wordVectors[n].CurrentCount(); for(unsigned pass = 1; lastCount != 0; pass++) { gpTaskFarm->AddWorkOrRunNow(shareWordData, this, 0); gpTaskFarm->WaitForCompletion(); // At each stage check that we have removed some items // from the lists. POLYUNSIGNED postCount = 0, postShared = 0, carryOver = 0; for (unsigned i = 0; i < NUM_WORD_VECTORS; i++) { postCount += wordVectors[i].CurrentCount(); postShared += wordVectors[i].Shared(); carryOver += wordVectors[i].CarryOver(); } if (debugOptions & DEBUG_GC) Log("GC: Share: Pass %u: %" POLYUFMT " removed (%1.1f%%) %" POLYUFMT " shared (%1.1f%%) %" POLYUFMT " remain. %" POLYUFMT " entries updated (%1.1f%%).\n", pass, lastCount-postCount, (double)(lastCount-postCount) / (double) lastCount * 100.0, postShared - lastShared, (double)(postShared - lastShared) / (double) (lastCount-postCount) * 100.0, postCount, carryOver, (double)carryOver / (double)(lastCount-postCount) * 100.0); // Condition for exiting the loop. There are some heuristics here. // If we remove less than 10% in a pass it's probably not worth continuing // unless the carry over is large. The "carry over" is the number of words updated as // a result of the last pass. It represents the extra sharing we gained in this pass // as a result of the last pass. If there are deep data structures that can be shared // we get better sharing with more passes. If the data structures are shallow we will // get as much sharing by just running the final pass. The first pass only carries // over any sharing from the byte objects so we need to run at least one more before // checking the carry over. if (pass > 1 && (lastCount - postCount) * 10 < lastCount && carryOver*2 < (lastCount-postCount)) break; lastCount = postCount; lastShared = postShared; } // Process any remaining entries. There may be loops. gpTaskFarm->AddWorkOrRunNow(shareRemainingWordData, this, 0); gpTaskFarm->WaitForCompletion(); if (debugOptions & DEBUG_GC) { POLYUNSIGNED postShared = 0; for (unsigned i = 0; i < NUM_WORD_VECTORS; i++) postShared += wordVectors[i].Shared(); if (debugOptions & DEBUG_GC) Log("GC: Share: Final pass %" POLYUFMT " removed %" POLYUFMT " shared (%1.1f%%).\n", lastCount, postShared - lastShared, (double)(postShared - lastShared) / (double) lastCount * 100.0); } // Calculate the totals. POLYUNSIGNED totalSize = 0, totalShared = 0, totalRecovered = 0; for (unsigned k = 0; k < NUM_BYTE_VECTORS; k++) { totalSize += byteVectors[k].TotalCount(); POLYUNSIGNED shared = byteVectors[k].Shared(); totalShared += shared; totalRecovered += shared * (k+2); // Add 2 because the 0th item is one word + length word. if (debugOptions & DEBUG_GC) Log("GC: Share: Byte objects of size %u: %" POLYUFMT " objects %" POLYUFMT " shared\n", k+1, byteVectors[k].TotalCount(), byteVectors[k].Shared()); } for (unsigned l = 0; l < NUM_WORD_VECTORS; l++) { totalSize += wordVectors[l].TotalCount(); POLYUNSIGNED shared = wordVectors[l].Shared(); totalShared += shared; totalRecovered += shared * (l+2); if (debugOptions & DEBUG_GC) Log("GC: Share: Word objects of size %u: %" POLYUFMT " objects %" POLYUFMT " shared\n", l+1, wordVectors[l].TotalCount(), wordVectors[l].Shared()); } if (debugOptions & DEBUG_GC) { Log("GC: Share: Total %" POLYUFMT " objects, %" POLYUFMT " shared (%1.0f%%). %" POLYUFMT " words recovered.\n", totalSize, totalShared, (double)totalShared / (double)totalSize * 100.0, totalRecovered); Log("GC: Share: Excluding %" POLYUFMT " large word objects %" POLYUFMT " large byte objects and %" POLYUFMT " others\n", largeWordCount, largeByteCount, excludedCount); } gHeapSizeParameters.RecordSharingData(totalRecovered); } void GCSharingPhase(void) { mainThreadPhase = MTP_GCPHASESHARING; GetSharing sharer; for (unsigned i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *lSpace = gMem.lSpaces[i]; lSpace->bitmap.ClearBits(0, lSpace->spaceSize()); } // Process the permanent mutable areas. for (unsigned j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (space->isMutable && ! space->byteOnly) sharer.ScanAddressesInRegion(space->bottom, space->top); } // Process the RTS roots. GCModules(&sharer); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Table"); // Sort and merge the data. sharer.SortData(); gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeIntermediate, "Sort"); } polyml-5.6/libpolyml/gc_update_phase.cpp000066400000000000000000000222151265146633400205360ustar00rootroot00000000000000/* Title: Multi-Threaded Garbage Collector - Update phase Copyright (c) 2010-12 David C. J. Matthews Based on the original garbage collector code Copyright 2000-2008 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is the third, update, phase of the garbage collector. The previous, copy, phase will have moved cells in memory. The update phase goes through all cells that could contain an address of a cell that has been moved and looks for a tomb-stone that contains its new location. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "run_time.h" #include "processes.h" #include "gc.h" #include "scanaddrs.h" #include "check_objects.h" #include "bitmap.h" #include "memmgr.h" #include "gctaskfarm.h" #include "diagnostics.h" class MTGCProcessUpdate: public ScanAddress { public: virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); virtual void ScanRuntimeAddress(PolyObject **pt, RtsStrength weak); virtual PolyObject *ScanObjectAddress(PolyObject *base); void UpdateObjectsInArea(LocalMemSpace *area); private: static void UpdateAddress(PolyObject *&obj) { while (obj->ContainsForwardingPtr()) obj = obj->GetForwardingPtr(); } }; /*********************************************************************/ /* This function is called in the update phase to update pointers to */ /* objects in the gc area that are in old mutable segments. */ /*********************************************************************/ PolyObject *MTGCProcessUpdate::ScanObjectAddress(PolyObject *obj) { PolyWord val = obj; LocalMemSpace *space = gMem.LocalSpaceForAddress(val.AsStackAddr()); if (space != 0) { UpdateAddress(obj); ASSERT(obj->ContainsNormalLengthWord()); } return obj; } void MTGCProcessUpdate::ScanRuntimeAddress(PolyObject **pt, RtsStrength/* weak*/) /* weak is not used, but needed so type of the function is correct */ { PolyObject *obj = *pt; if (obj->ContainsForwardingPtr()) { UpdateAddress(obj); *pt = obj; } } // Update the addresses in a group of words. POLYUNSIGNED MTGCProcessUpdate::ScanAddressAt(PolyWord *pt) { PolyWord val = *pt; if (val.IsTagged()) return 0; // It looked like it would be possible to simplify this code and // just call ContainsForwardingPtr on any address. // Profiling shows that it's quite important to avoid calling // ContainsForwardingPtr unnecessarily. I guess the reason is that // it actually accesses the memory referenced by the address and it // is unlikely to be in the cache. PolyObject *obj = val.AsObjPtr(); if (obj->ContainsForwardingPtr()) { UpdateAddress(obj); *pt = obj; } return 0; } // Updates the addresses for objects in the area with the "allocated" bit set. // It processes the area between area->pointer and the bit corresponding to area->highest. // area->highest corresponds to gen_top i.e. we don't process older generations. void MTGCProcessUpdate::UpdateObjectsInArea(LocalMemSpace *area) { PolyWord *pt = area->upperAllocPtr; POLYUNSIGNED bitno = area->wordNo(pt); POLYUNSIGNED highest = area->wordNo(area->top); for (;;) { ASSERT(bitno <= highest); /* Zero unused words. This is necessary so that ScanAddressesInRegion can work. It requires the allocated area of memory to contain either objects with a valid length word or forwarding pointer or zeros. We should only be zeroing words that we couldn't fill with real data so it shouldn't be too much. Profiling showed that using dummy byte objects here didn't make a measurable difference, */ while (bitno < highest && !area->bitmap.TestBit(bitno)) { *pt++ = PolyWord::FromUnsigned(0); bitno++; } if (bitno == highest) { // Have reached the top of the area ASSERT(pt == area->top); break; } /* first set bit corresponds to the length word */ pt++; PolyObject *obj = (PolyObject*)pt; POLYUNSIGNED L = obj->LengthWord(); bitno++; if (obj->ContainsForwardingPtr()) { // Skip over moved objects. We have to find the new location to find // its length. UpdateAddress(obj); POLYUNSIGNED length = obj->Length(); pt += length; bitno += length; } else // Contains real object { if (OBJ_IS_WORD_OBJECT(L)) { POLYUNSIGNED length = OBJ_OBJECT_LENGTH(L); area->updated += length+1; while (length--) { PolyWord val = *pt; if (! val.IsTagged() && val != PolyWord::FromUnsigned(0)) { PolyObject *obj = val.AsObjPtr(); if (obj->ContainsForwardingPtr()) { UpdateAddress(obj); *pt = obj; } } pt++; bitno++; } } else /* !OBJ_IS_WORD_OBJECT(L) */ { POLYUNSIGNED length = OBJ_OBJECT_LENGTH(L); area->updated += length+1; ScanAddressesInObject(obj, L); pt += length; bitno += length; } /* !OBJ_IS_WORD_OBJECT(L) */ CheckObject(obj); // Can check it after it's been updated } /* !OBJ_IS_POINTER(L) */ } /* for loop */ } // Task to update addresses in a local area. static void updateLocalArea(GCTaskId*, void *arg1, void *arg2) { MTGCProcessUpdate *processUpdate = (MTGCProcessUpdate *)arg1; LocalMemSpace *space = (LocalMemSpace *)arg2; if (debugOptions & DEBUG_GC) Log("GC: Update local area %p\n", space); // Process the current generation for mutable or immutable areas. processUpdate->UpdateObjectsInArea(space); if (debugOptions & DEBUG_GC) Log("GC: Completed local update for %p. %lu words updated\n", space, space->updated); } // Task to update addresses in a non-local area. static void updateNonLocalMutableArea(GCTaskId*, void *arg1, void *arg2) { MTGCProcessUpdate *processUpdate = (MTGCProcessUpdate *)arg1; MemSpace *space = (MemSpace *)arg2; if (debugOptions & DEBUG_GC) Log("GC: Update non-local mutable area %p\n", space); processUpdate->ScanAddressesInRegion(space->bottom, space->top); if (debugOptions & DEBUG_GC) Log("GC: Completed non-local mutable update for %p\n", space); } // Task to update addresses maintained by the RTS itself. static void updateGCProcAddresses(GCTaskId*, void *arg1, void *) { MTGCProcessUpdate *processUpdate = (MTGCProcessUpdate *)arg1; GCModules(processUpdate); } void GCUpdatePhase() { unsigned j; /* Update phase */ mainThreadPhase = MTP_GCPHASEUPDATE; /* Invariant: at most the first (gen_top - bottom) bits of each bitmap can be dirty here. */ for(j = 0; j < gMem.nlSpaces; j++) gMem.lSpaces[j]->updated = 0; // We can do the updates in parallel since they don't interfere at all. MTGCProcessUpdate processUpdate; // Process local areas. for (j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; // As well as updating the addresses this also clears the bitmaps. gpTaskFarm->AddWorkOrRunNow(&updateLocalArea, &processUpdate, space); } // Scan the permanent mutable areas. for (j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (space->isMutable && ! space->byteOnly) gpTaskFarm->AddWorkOrRunNow(&updateNonLocalMutableArea, &processUpdate, space); } // Update addresses in RTS modules. gpTaskFarm->AddWorkOrRunNow(&updateGCProcAddresses, &processUpdate, 0); // Wait for these to complete before proceeding. gpTaskFarm->WaitForCompletion(); } polyml-5.6/libpolyml/gctaskfarm.cpp000066400000000000000000000207471265146633400175550ustar00rootroot00000000000000/* Title: Task farm for Multi-Threaded Garbage Collector Copyright (c) 2010 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "gctaskfarm.h" #include "diagnostics.h" #include "timing.h" static GCTaskId gTask; GCTaskId *globalTask = &gTask; GCTaskFarm::GCTaskFarm(): workLock("GC task farm work") { queueSize = queueIn = queuedItems = 0; workQueue = 0; terminate = false; threadCount = activeThreadCount = 0; #if (defined(HAVE_PTHREAD_H) || defined(HAVE_WINDOWS_H)) threadHandles = 0; #endif } GCTaskFarm::~GCTaskFarm() { Terminate(); free(workQueue); #if (defined(HAVE_PTHREAD_H) || defined(HAVE_WINDOWS_H)) free(threadHandles); #endif } bool GCTaskFarm::Initialise(unsigned thrdCount, unsigned qSize) { terminate = false; if (!waitForWork.Init(0, thrdCount)) return false; workQueue = (queue_entry*)calloc(qSize, sizeof(queue_entry)); if (workQueue == 0) return false; #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) queueSize = qSize; threadHandles = (pthread_t*)calloc(thrdCount, sizeof(pthread_t)); if (threadHandles == 0) return false; #elif defined(HAVE_WINDOWS_H) queueSize = qSize; threadHandles = (HANDLE*)calloc(thrdCount, sizeof(HANDLE)); if (threadHandles == 0) return false; #else queueSize = 0; #endif // Create the worker threads. for (unsigned i = 0; i < thrdCount; i++) { // Fork a thread #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) // Create a thread that isn't joinable since we don't want to wait // for it to finish. pthread_t pthreadId; bool isError = pthread_create(&pthreadId, NULL, WorkerThreadFunction, this) != 0; if (isError) break; threadHandles[threadCount++] = pthreadId; #elif defined(HAVE_WINDOWS_H) DWORD dwThrdId; // Have to provide this although we don't use it. HANDLE threadHandle = CreateThread(NULL, 0, WorkerThreadFunction, this, 0, &dwThrdId); if (threadHandle == NULL) break; threadHandles[threadCount++] = threadHandle; #endif } return true; } void GCTaskFarm::Terminate() { terminate = true; // Increment the semaphore by the number of threads to release them all. for (unsigned i = 0; i < threadCount; i++) waitForWork.Signal(); // Wait for the threads to terminate. #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) for (unsigned j = 0; j < threadCount; j++) { void *result; pthread_join(threadHandles[j], &result); } #elif defined(HAVE_WINDOWS_H) if (threadCount != 0) WaitForMultipleObjects(threadCount, threadHandles, TRUE, 10000); #endif } // Add work to the queue. Returns true if it succeeds. bool GCTaskFarm::AddWork(gctask work, void *arg1, void *arg2) { bool wantSignal = false; { PLocker l(&workLock); if (queuedItems == queueSize) return false; // Queue is full workQueue[queueIn].task = work; workQueue[queueIn].arg1 = arg1; workQueue[queueIn].arg2 = arg2; queueIn++; if (queueIn == queueSize) queueIn = 0; queuedItems++; wantSignal = queuedItems <= threadCount; } if (wantSignal) waitForWork.Signal(); return true; } // Schedule this as a task or run it immediately if the queue is full. void GCTaskFarm::AddWorkOrRunNow(gctask work, void *arg1, void *arg2) { if (! AddWork(work, arg1, arg2)) (*work)(globalTask, arg1, arg2); } void GCTaskFarm::ThreadFunction() { GCTaskId myTaskId; #if (defined(_WIN32) && ! defined(__CYGWIN__)) DWORD startActive = GetTickCount(); #else struct timeval startTime; gettimeofday(&startTime, NULL); #endif workLock.Lock(); activeThreadCount++; while (! terminate) { // Invariant: We have the lock and the activeThreadCount includes this thread. // Find some work. if (queuedItems > 0) { // There is work unsigned outPos; if (queuedItems > queueIn) outPos = queueIn+queueSize-queuedItems; else outPos = queueIn-queuedItems; gctask work = workQueue[outPos].task; void *arg1 = workQueue[outPos].arg1; void *arg2 = workQueue[outPos].arg2; workQueue[outPos].task = 0; queuedItems--; ASSERT(work != 0); workLock.Unlock(); (*work)(&myTaskId, arg1, arg2); workLock.Lock(); } else { activeThreadCount--; // We're no longer active // If there is no work and we're the last active thread signal the // main thread that the queue is empty bool wantSignal = activeThreadCount == 0; if (wantSignal) waitForCompletion.Signal(); // Now release the lock. In our Windows partial implementation of // condition vars we assume that signalling is done with the lock // still held. workLock.Unlock(); if (debugOptions & DEBUG_GCTASKS) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) Log("GCTask: Thread %p blocking after %u milliseconds\n", &myTaskId, GetTickCount() - startActive); #else struct timeval endTime; gettimeofday(&endTime, NULL); subTimevals(&endTime, &startTime); Log("GCTask: Thread %p blocking after %0.4f seconds\n", &myTaskId, (float)endTime.tv_sec + (float)endTime.tv_usec / 1.0E6); #endif } if (terminate) return; // Block until there's work. waitForWork.Wait(); // We've been woken up if (debugOptions & DEBUG_GCTASKS) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) startActive = GetTickCount(); #else gettimeofday(&startTime, NULL); #endif Log("GCTask: Thread %p resuming\n", &myTaskId); } workLock.Lock(); activeThreadCount++; } } activeThreadCount--; workLock.Unlock(); } #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) void *GCTaskFarm::WorkerThreadFunction(void *parameter) { GCTaskFarm *t = (GCTaskFarm *)parameter; t->ThreadFunction(); return 0; } #elif defined(HAVE_WINDOWS_H) DWORD WINAPI GCTaskFarm::WorkerThreadFunction(void *parameter) { GCTaskFarm *t = (GCTaskFarm *)parameter; t->ThreadFunction(); return 0; } #endif // Wait until the queue is empty. void GCTaskFarm::WaitForCompletion(void) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) DWORD startWait; if (debugOptions & DEBUG_GCTASKS) startWait = GetTickCount(); #else struct timeval startWait; if (debugOptions & DEBUG_GCTASKS) gettimeofday(&startWait, NULL); #endif workLock.Lock(); while (activeThreadCount > 0 || queuedItems > 0) waitForCompletion.Wait(&workLock); workLock.Unlock(); if (debugOptions & DEBUG_GCTASKS) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) Log("GCTask: Threads completed after %u milliseconds\n", GetTickCount()-startWait); #else struct timeval endWait; gettimeofday(&endWait, NULL); subTimevals(&endWait, &startWait); Log("GCTask: Threads completed after %0.4f seconds\n", (float)endWait.tv_sec + (float)endWait.tv_usec / 1.0E6); #endif } } polyml-5.6/libpolyml/gctaskfarm.h000066400000000000000000000056751265146633400172250ustar00rootroot00000000000000/* Title: Task farm for Multi-Threaded Garbage Collector Copyright (c) 2010-12 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GCTASKFARM_H_INCLUDED #define GCTASKFARM_H_INCLUDED #include "locking.h" // An empty class just used as an ID. class GCTaskId { }; extern GCTaskId *globalTask; // The ID used when a function is run immediately // Function for action. The usual C++ approach would be to use an // object pointer but that requires lots of small objects to be created // and deleted. typedef void (*gctask)(GCTaskId*, void*, void*); typedef struct { gctask task; void *arg1; void *arg2; } queue_entry; class GCTaskFarm { public: GCTaskFarm(); ~GCTaskFarm(); bool Initialise(unsigned threadCount, unsigned queueSize); bool AddWork(gctask task, void *arg1, void *arg2); void AddWorkOrRunNow(gctask task, void *arg1, void *arg2); void WaitForCompletion(void); void Terminate(void); // See if the queue is draining. Used as a hint as to whether // it's worth sparking off some new work. bool Draining(void) const { return queuedItems == 0; } unsigned ThreadCount(void) const { return threadCount; } private: // The semaphore is zero if there is no work or some value up to // the number of threads if there is work. PSemaphore waitForWork; // The lock protects the queue and the item count. PLock workLock; // The condition variable is signalled when the queue is empty. // This can only be waited for by a single thread because it's not a proper // implementation of a condition variable in Windows. PCondVar waitForCompletion; unsigned queueSize, queueIn, queuedItems; queue_entry *workQueue; // Array of unit->unit functions. bool terminate; // Set to true to kill all workers. unsigned threadCount; // Count of workers. unsigned activeThreadCount; // Count of workers doing work. void ThreadFunction(void); #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) static void *WorkerThreadFunction(void *parameter); pthread_t *threadHandles; #elif defined(HAVE_WINDOWS_H) static DWORD WINAPI WorkerThreadFunction(void *parameter); HANDLE *threadHandles; #endif }; #endif polyml-5.6/libpolyml/globals.h000066400000000000000000000455331265146633400165230ustar00rootroot00000000000000/* Title: Globals for the system. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000-7 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _GLOBALS_H #define _GLOBALS_H /* Poly words, pointers and objects. The garbage collector needs to be able to distinguish different uses of a memory word. We need to be able find which words are pointers to other objects and which are simple integers. The simple distinction is between integers, which are tagged by having the bottom bit set, and Addresses which are word aligned (bottom 2 bits set on a 32 bit machine, bottom 3 bits on a 64 bit machine). There is a third case that can arise where we have a return address to a piece of code. These are generally aligned on a word+two-byte boundary except that they can appear with any alignment in the saved PC field of a stack. Normally these will only appear on the stack or in a register saved to the stack but they can be passed as an argument to SetCodeConstant. Addresses always point to the start of objects. There is one exception: a stack object can contain addresses within the current stack. The preceding word of a stack object is the length word. This contains the length of the object in words in the low-order 3 (7 on a 64-bit machine) bytes and a flag byte in the top byte. The flags give information about the type of the object. The length word is also used by the garbage collector and other object processors. */ /* Generally we use a tagged integer representation with 31 bits of precision and the low-order bit as a tag bit. one represents a tagged integer, zero a pointer. Code pointers are always aligned onto a word + 2 byte boundary. The exception is the Sparc which has special tagged add and subtract instructions. These cause a trap if given a value which is not a multiple of 4. To make use of these instructions we represent tagged integers using 30 bits of precision and with the low order bits containing 01. DCJM 27/9/00. */ #if HAVE_STDINT_H # include #endif #if HAVE_INTTYPES_H # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif # include #endif #ifdef HAVE_STDDEF_H # include #endif // Integers (non-pointers) have the bottom bit set and the rest of the word // contains the significant bits. The original native code Sparc version // shifted by two so that it could use the Taddcc/Tsubcc instructions. #define POLY_TAGSHIFT 1 #if (defined(_WIN32) && ! defined(__CYGWIN__)) # include #endif typedef intptr_t POLYSIGNED; typedef uintptr_t POLYUNSIGNED; // libpolyml uses printf-style I/O instead of C++ standard IOstreams, // so we need specifier to format POLYUNSIGNED/POLYSIGNED values. #ifdef PRIuPTR # define POLYUFMT PRIuPTR # define POLYSFMT PRIdPTR #elif (defined(_MSC_VER) && (SIZEOF_VOIDP == 8)) # define POLYUFMT "llu" # define POLYSFMT "lld" #else # define POLYUFMT "lu" // as before. Cross your fingers. # define POLYSFMT "ld" // idem. #endif typedef unsigned char byte; class PolyObject; typedef PolyObject *POLYOBJPTR; typedef byte *POLYCODEPTR; #define PC_RETRY_SPECIAL ((POLYCODEPTR)1) // This was previously TAGGED(0) class PolyWord { public: // An object pointer can become a word directly. PolyWord(POLYOBJPTR p) { contents.objectPtr = p; } // Initialise to TAGGED(0). This is very rarely used. PolyWord() { contents.unsignedInt = 1; } // Integers need to be tagged. static PolyWord TaggedInt(POLYSIGNED s) { return PolyWord((s << POLY_TAGSHIFT) | (POLYSIGNED)0x01); } static PolyWord TaggedUnsigned(POLYUNSIGNED u) { return PolyWord((u << POLY_TAGSHIFT) | 0x01); } static PolyWord FromStackAddr(PolyWord *sp) { return PolyWord(sp); } static PolyWord FromCodePtr(POLYCODEPTR p) { return PolyWord(p); } // Tests for the various cases. bool IsTagged(void) const { return (contents.unsignedInt & 1) != 0; } bool IsCodePtr(void) const { return (contents.unsignedInt & 3) == 2; } bool IsDataPtr(void) const { return (contents.unsignedInt & (sizeof(PolyWord)-1)) == 0; } // Extract the various cases. POLYSIGNED UnTagged(void) const { return contents.signedInt >> POLY_TAGSHIFT; } POLYUNSIGNED UnTaggedUnsigned(void) const { return contents.unsignedInt >> POLY_TAGSHIFT; } POLYOBJPTR AsObjPtr(void) const { return contents.objectPtr; } PolyWord *AsStackAddr(void) const { return contents.stackAddr; } POLYCODEPTR AsCodePtr(void) const { return contents.codePtr; } void *AsAddress(void)const { return AsCodePtr(); } // There are a few cases where we need to store and extract untagged values static PolyWord FromUnsigned(POLYUNSIGNED u) { return PolyWord(u); } static PolyWord FromSigned(POLYSIGNED s) { return PolyWord(s); } POLYUNSIGNED AsUnsigned(void) const { return contents.unsignedInt; } POLYSIGNED AsSigned(void) const { return contents.signedInt; } protected: PolyWord(POLYSIGNED s) { contents.signedInt = s; } PolyWord(POLYUNSIGNED u) { contents.unsignedInt = u; } public: bool operator == (PolyWord b) const { return contents.unsignedInt == b.contents.unsignedInt; } bool operator != (PolyWord b) const { return contents.unsignedInt != b.contents.unsignedInt; } protected: PolyWord(PolyWord *sp) { contents.stackAddr = sp; } PolyWord(POLYCODEPTR p) { contents.codePtr = p; } union { POLYSIGNED signedInt; // A tagged integer - lowest bit set POLYUNSIGNED unsignedInt; // A tagged integer - lowest bit set POLYOBJPTR objectPtr; // Object pointer - two lowest bits clear. POLYCODEPTR codePtr; // Address within code - lowest bits contain 10. PolyWord *stackAddr; // Address within current stack - two lowest bits clear. } contents; }; //typedef PolyWord POLYWORD; inline bool OBJ_IS_AN_INTEGER(const PolyWord & a) { return a.IsTagged(); } inline bool OBJ_IS_CODEPTR(const PolyWord & a) { return a.IsCodePtr(); } inline bool OBJ_IS_DATAPTR(const PolyWord & a) { return a.IsDataPtr(); } // The maximum tagged signed number is one less than 0x80 shifted into the top byte then shifted down // by the tag shift. #define MAXTAGGED (((POLYSIGNED)0x80 << (POLYSIGNED)(8*(sizeof(PolyWord)-1) -POLY_TAGSHIFT)) -1) inline PolyWord TAGGED(POLYSIGNED a) { return PolyWord::TaggedInt(a); } inline POLYSIGNED UNTAGGED(PolyWord a) { return a.UnTagged(); } inline POLYUNSIGNED UNTAGGED_UNSIGNED(PolyWord a) { return a.UnTaggedUnsigned(); } #define IS_INT(x) ((x).IsTagged()) /************************************************************************ * * Low level definitions. * ************************************************************************/ /* length word flags */ /* The following encodings are used: (1) OBJ_PRIVATE_GC_BIT = 0 A normal length word i.e. 7 more flags + 24 bit length. (2) OBJ_PRIVATE_GC_BIT = 1, OBJ_PRIVATE_MUTABLE_BIT = 0 A "normal" tombstone. Remaining 30 bits are (word-aligned) pointer >> 2. (3) OBJ_PRIVATE_GC_BIT = 1, OBJ_PRIVATE_MUTABLE_BIT = 1 A "depth" tombstone; used by share program. Remaining 30 bits are an unsigned integer representing the (approximate) depth of the object in the data-structure. SPF 24/1/95 */ #define OBJ_PRIVATE_FLAGS_SHIFT (8 * (sizeof(PolyWord) - 1)) #define _TOP_BYTE(x) ((POLYUNSIGNED)(x) << OBJ_PRIVATE_FLAGS_SHIFT) // Bottom two bits define the content format. // Zero bits mean ordinary word object containing addresses or tagged integers. #define F_BYTE_OBJ 0x01 /* byte object (contains no pointers) */ #define F_CODE_OBJ 0x02 /* code object (mixed bytes and words) */ #define F_GC_MARK 0x04 // Used during the GC marking phase #define F_NO_OVERWRITE 0x08 /* don't overwrite when loading - mutables only. */ // This bit is overloaded and has different meanings depending on what other bits are set. // For byte objects it is the sign bit for arbitrary precision ints. // For other data it indicates either that the object is a profile block or contains // information for allocation profiling. #define F_NEGATIVE_BIT 0x10 // Sign bit for arbitrary precision ints (byte segs only) #define F_PROFILE_BIT 0x10 // Object has a profile pointer (word segs only) #define F_WEAK_BIT 0x20 /* object contains weak references to option values. */ #define F_MUTABLE_BIT 0x40 /* object is mutable */ #define F_PRIVATE_GC_BIT 0x80 /* object is (pointer or depth) tombstone */ #define F_PRIVATE_FLAGS_MASK 0xFF #define _OBJ_BYTE_OBJ _TOP_BYTE(0x01) /* byte object (contains no pointers) */ #define _OBJ_CODE_OBJ _TOP_BYTE(0x02) /* code object (mixed bytes and words) */ #define _OBJ_GC_MARK _TOP_BYTE(0x04) // Mark bit #define _OBJ_NO_OVERWRITE _TOP_BYTE(0x08) /* don't overwrite when loading - mutables only. */ #define _OBJ_NEGATIVE_BIT _TOP_BYTE(0x10) /* sign bit for arbitrary precision ints */ #define _OBJ_PROFILE_BIT _TOP_BYTE(0x10) /* sign bit for arbitrary precision ints */ #define _OBJ_WEAK_BIT _TOP_BYTE(0x20) #define _OBJ_MUTABLE_BIT _TOP_BYTE(0x40) /* object is mutable */ #define _OBJ_PRIVATE_GC_BIT _TOP_BYTE(0x80) /* object is (pointer or depth) tombstone */ #define _OBJ_PRIVATE_FLAGS_MASK _TOP_BYTE(0xFF) #define _OBJ_PRIVATE_LENGTH_MASK ((-1) ^ _OBJ_PRIVATE_FLAGS_MASK) #define MAX_OBJECT_SIZE _OBJ_PRIVATE_LENGTH_MASK #define _OBJ_PRIVATE_DEPTH_MASK (_OBJ_PRIVATE_GC_BIT|_OBJ_MUTABLE_BIT) /* case 1 - proper length words */ inline bool OBJ_IS_LENGTH(POLYUNSIGNED L) { return ((L & _OBJ_PRIVATE_GC_BIT) == 0); } /* these should only be applied to proper length words */ /* discards GC flag, mutable bit and weak bit. */ inline byte GetTypeBits(POLYUNSIGNED L) { return (byte)(L >> OBJ_PRIVATE_FLAGS_SHIFT) & 0x03; } inline POLYUNSIGNED OBJ_OBJECT_LENGTH(POLYUNSIGNED L) { return L & _OBJ_PRIVATE_LENGTH_MASK; } inline bool OBJ_IS_BYTE_OBJECT(POLYUNSIGNED L) { return (GetTypeBits(L) == F_BYTE_OBJ); } inline bool OBJ_IS_CODE_OBJECT(POLYUNSIGNED L) { return (GetTypeBits(L) == F_CODE_OBJ); } inline bool OBJ_IS_NO_OVERWRITE(POLYUNSIGNED L) { return ((L & _OBJ_NO_OVERWRITE) != 0); } inline bool OBJ_IS_NEGATIVE(POLYUNSIGNED L) { return ((L & _OBJ_NEGATIVE_BIT) != 0); } inline bool OBJ_HAS_PROFILE(POLYUNSIGNED L) { return ((L & _OBJ_PROFILE_BIT) != 0); } inline bool OBJ_IS_MUTABLE_OBJECT(POLYUNSIGNED L) { return ((L & _OBJ_MUTABLE_BIT) != 0); } inline bool OBJ_IS_WEAKREF_OBJECT(POLYUNSIGNED L) { return ((L & _OBJ_WEAK_BIT) != 0); } /* Standard macro for finding the start of a code segment from a code-pointer. First we normalise it to get a properly aligned word pointer. Then we increment this word pointer until we get the zero word which is the end-of-code marker. The next word after this is the byte offset of the start of the segment, so we convert back to a byte pointer to do the subtraction, then return the result as a word pointer. SPF 24/1/95 Note that this code must work even if "cp" is not aligned as a code pointer, since the initial program counter used for profiling may have a random alignment. SPF 26/1/96 */ inline PolyObject *ObjCodePtrToPtr(byte *cp) { while ((POLYUNSIGNED)cp & (sizeof(POLYUNSIGNED)-1)) cp++; // Make it word aligned POLYUNSIGNED *wp = (POLYUNSIGNED*)cp; while (*wp != 0) wp++; wp++; POLYUNSIGNED byte_offset = *wp; return (PolyObject *)((byte *)wp - byte_offset); } /* Don't need to worry about whether shift is signed, because OBJ_PRIVATE_USER_FLAGS_MASK removes the sign bit. We don't want the GC bit (which should be 0) anyway. */ #define OBJ_PRIVATE_USER_FLAGS_MASK _TOP_BYTE(0x7F) #define OBJ_IS_WORD_OBJECT(L) (GetTypeBits(L) == 0) /* case 2 - forwarding pointer */ inline bool OBJ_IS_POINTER(POLYUNSIGNED L) { return (L & _OBJ_PRIVATE_DEPTH_MASK) == _OBJ_PRIVATE_GC_BIT; } inline PolyObject *OBJ_GET_POINTER(POLYUNSIGNED L) { return (PolyObject*)(( L & ~_OBJ_PRIVATE_DEPTH_MASK) <<2); } inline POLYUNSIGNED OBJ_SET_POINTER(PolyObject *pt) { return ((POLYUNSIGNED)pt >> 2) | _OBJ_PRIVATE_GC_BIT; } /* case 3 - depth */ inline bool OBJ_IS_DEPTH(POLYUNSIGNED L) { return (L & _OBJ_PRIVATE_DEPTH_MASK) == _OBJ_PRIVATE_DEPTH_MASK; } inline POLYUNSIGNED OBJ_GET_DEPTH(POLYUNSIGNED L) { return L & ~_OBJ_PRIVATE_DEPTH_MASK; } inline POLYUNSIGNED OBJ_SET_DEPTH(POLYUNSIGNED n) { return n | _OBJ_PRIVATE_DEPTH_MASK; } // or sharing chain inline bool OBJ_IS_CHAINED(POLYUNSIGNED L) { return (L & _OBJ_PRIVATE_DEPTH_MASK) == _OBJ_PRIVATE_DEPTH_MASK; } inline PolyObject *OBJ_GET_CHAIN(POLYUNSIGNED L) { return (PolyObject*)(( L & ~_OBJ_PRIVATE_DEPTH_MASK) <<2); } inline POLYUNSIGNED OBJ_SET_CHAIN(PolyObject *pt) { return ((POLYUNSIGNED)pt >> 2) | _OBJ_PRIVATE_DEPTH_MASK; } // An object i.e. a piece of allocated memory in the heap. In the simplest case this is a // tuple, a list cons cell, a string or a ref. Every object has a length word in the word before // where its address points. The top byte of this contains flags. class PolyObject { public: byte *AsBytePtr(void)const { return (byte*)this; } PolyWord *AsWordPtr(void)const { return (PolyWord*)this; } POLYUNSIGNED LengthWord(void)const { return ((PolyWord*)this)[-1].AsUnsigned(); } POLYUNSIGNED Length(void)const { return OBJ_OBJECT_LENGTH(LengthWord()); } // Get and set a word PolyWord Get(POLYUNSIGNED i) const { return ((PolyWord*)this)[i]; } void Set(POLYUNSIGNED i, PolyWord v) { ((PolyWord*)this)[i] = v; } PolyWord *Offset(POLYUNSIGNED i) const { return ((PolyWord*)this)+i; } // Create a length word from a length and the flags in the top byte. void SetLengthWord(POLYUNSIGNED l, byte f) { ((POLYUNSIGNED*)this)[-1] = l | ((POLYUNSIGNED)f << OBJ_PRIVATE_FLAGS_SHIFT); } void SetLengthWord(POLYUNSIGNED l) { ((PolyWord*)this)[-1] = PolyWord::FromUnsigned(l); } bool IsByteObject(void) const { return OBJ_IS_BYTE_OBJECT(LengthWord()); } bool IsCodeObject(void) const { return OBJ_IS_CODE_OBJECT(LengthWord()); } bool IsWordObject(void) const { return OBJ_IS_WORD_OBJECT(LengthWord()); } bool IsMutable(void) const { return OBJ_IS_MUTABLE_OBJECT(LengthWord()); } bool IsWeakRefObject(void) const { return OBJ_IS_WEAKREF_OBJECT(LengthWord()); } bool IsNoOverwriteObject(void) const { return OBJ_IS_NO_OVERWRITE(LengthWord()); } bool ContainsForwardingPtr(void) const { return OBJ_IS_POINTER(LengthWord()); } PolyObject *GetForwardingPtr(void) const { return OBJ_GET_POINTER(LengthWord()); } void SetForwardingPtr(PolyObject *newp) { ((PolyWord*)this)[-1] = PolyWord::FromUnsigned(OBJ_SET_POINTER(newp)); } bool ContainsShareChain(void) const { return OBJ_IS_CHAINED(LengthWord()); } PolyObject *GetShareChain(void) const { return OBJ_GET_CHAIN(LengthWord()); } void SetShareChain(PolyObject *newp) { ((PolyWord*)this)[-1] = PolyWord::FromUnsigned(OBJ_SET_CHAIN(newp)); } bool ContainsNormalLengthWord(void) const { return OBJ_IS_LENGTH(LengthWord()); } // Find the start of the constant section for a piece of code. // The first of these is really only needed because we may have objects whose length // words have been overwritten. void GetConstSegmentForCode(POLYUNSIGNED obj_length, PolyWord * &cp, POLYUNSIGNED &count) const { PolyWord *last_word = Offset(obj_length - 1); // Last word in the code count = last_word->AsUnsigned(); // This is the number of consts cp = last_word - count; } void GetConstSegmentForCode(PolyWord * &cp, POLYUNSIGNED &count) const { GetConstSegmentForCode(Length(), cp, count); } PolyWord *ConstPtrForCode(void) const { PolyWord *cp; POLYUNSIGNED count; GetConstSegmentForCode(cp, count); return cp; } }; /* There was a problem with version 2.95 on Sparc/Solaris at least. The PolyObject class has no members so classes derived from it e.g. ML_Cons_Cell should begin at the beginning of the object. Later versions of GCC get this right. */ #if defined(__GNUC__) && (__GNUC__ <= 2) #error Poly/ML requires GCC version 3 or newer #endif inline POLYUNSIGNED GetLengthWord(PolyWord p) { return p.AsObjPtr()->LengthWord(); } // Get the length of an object. inline POLYUNSIGNED OBJECT_LENGTH(PolyWord p) { return OBJ_OBJECT_LENGTH(GetLengthWord(p)); } // A list cell. This can be passed to or returned from certain RTS functions. class ML_Cons_Cell: public PolyObject { public: PolyWord h; PolyWord t; #define ListNull (TAGGED(0)) static bool IsNull(PolyWord p) { return p == ListNull; } }; /* An exception packet. This contains an identifier (either a tagged integer for RTS exceptions or the address of a mutable for those created within ML), a string name for printing and an exception argument value. */ class PolyException: public PolyObject { public: PolyWord ex_id; /* Exc identifier */ PolyWord ex_name;/* Exc name */ PolyWord arg; /* Exc arguments */ PolyWord ex_location; // Location of "raise". Always zero for RTS exceptions. }; typedef PolyException poly_exn; /* * Stream tokens are pointers to UNTAGGED C integers * (stored in byte objects) */ class StreamToken: public PolyObject { public: unsigned streamNo; }; /* Macro to round a number of bytes up to a number of words. */ #define WORDS(s) ((s+sizeof(PolyWord)-1)/sizeof(PolyWord)) /********************************************************************** * * Representation of option type. * **********************************************************************/ #define NONE_VALUE (TAGGED(0)) /* SOME x is represented by a single word cell containing x. */ #if (defined(_WIN32)) /* Windows doesn't include 0x in %p format. */ #define ZERO_X "0x" #else #define ZERO_X "" #endif #endif polyml-5.6/libpolyml/heapsizing.cpp000066400000000000000000001101571265146633400175670ustar00rootroot00000000000000/* Title: heapsizing.cpp - parameters to adjust heap size Copyright (c) Copyright David C.J. Matthews 2012, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This module is intended to deal with heap sizing based on measurements of the time taken in the GC compared with the application code. Currently it is very basic. This also provides GC timing information to the ML code as well as statistics and debugging. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_UNISTD_H #include // For sysconf #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_FLOAT_H #include #endif #ifdef HAVE_MATH_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "arb.h" #include "diagnostics.h" #include "rts_module.h" #include "timing.h" #include "heapsizing.h" #include "statistics.h" #include "memmgr.h" // The one and only parameter object HeapSizeParameters gHeapSizeParameters; #ifdef HAVE_WINDOWS_H // There's no (documented) way to get the per-process hard page // count in Windows. Cygwin uses GetProcessMemoryInfo to return the // value in ru_majflt but this is actually incorrect because it returns // the soft page count not the hard page count. We previously used the // undocumented NtQuerySystemInformation call. static long GetPaging(long) { return 0; } #else inline long GetPaging(long rusagePage) { return rusagePage; } #endif HeapSizeParameters::HeapSizeParameters() { startPF = GetPaging(0); fullGCNextTime = false; performSharingPass = false; lastAllocationSucceeded = true; allocationFailedBeforeLastMajorGC = false; minHeapSize = 0; maxHeapSize = 0; // Unlimited lastFreeSpace = 0; pagingLimitSize = 0; highWaterMark = 0; sharingWordsRecovered = 0; cumulativeSharingSaving = 0; // Initial values until we've actually done a sharing pass. sharingRecoveryRate = 0.5; // The structure sharing recovers half the heap. sharingCostFactor = 2; // It doubles the cost } // These macros were originally in globals.h and used more generally. // Since only K_to_words is used now this can be greatly simplified. #define BITSPERWORD (sizeof(PolyWord)*8) #define ROUNDUP_UNITS(m,n) (((m) + (n) - 1) / (n)) #define ROUNDUP(m,n) (ROUNDUP_UNITS(m,n) * (n)) #define K_to_words(k) ROUNDUP((k) * (1024 / sizeof(PolyWord)),BITSPERWORD) // Returns physical memory size in bytes static POLYUNSIGNED GetPhysicalMemorySize(void); // These are the maximum values for the number of words. #if (SIZEOF_VOIDP == 4) # define MAXIMUMADDRESS 0x3fffffff #else # define MAXIMUMADDRESS 0x1fffffffffffffff #endif // Set the initial size based on any parameters specified on the command line. // Any of these can be zero indicating they should default. void HeapSizeParameters::SetHeapParameters(POLYUNSIGNED minsize, POLYUNSIGNED maxsize, POLYUNSIGNED initialsize, unsigned percent) { minHeapSize = K_to_words(minsize); // If these overflow assume the result will be zero maxHeapSize = K_to_words(maxsize); POLYUNSIGNED initialSize = K_to_words(initialsize); POLYUNSIGNED memsize = GetPhysicalMemorySize() / sizeof(PolyWord); // If no maximum is given default it to 80% of the physical memory. // This allows some space for the OS and other things. if (maxHeapSize == 0 || maxHeapSize > MAXIMUMADDRESS) { if (memsize != 0) maxHeapSize = memsize - memsize / 5; else maxHeapSize = MAXIMUMADDRESS; // But if this must not be smaller than the minimum size. if (maxHeapSize < minHeapSize) maxHeapSize = minHeapSize; if (maxHeapSize < initialSize) maxHeapSize = initialSize; } // The default minimum is zero; in practice the live data size. // The default initial size is the minimum if that has been provided, // otherwise 8M words. There are applications that only require a small // heap and if we set the heap large to begin with we'll never do a // full GC and reduce it. if (initialSize == 0) { if (minHeapSize != 0) initialSize = minHeapSize; else initialSize = 8 * gMem.DefaultSpaceSize(); // But not more than the maximum if (initialSize > maxHeapSize) initialSize = maxHeapSize; } // Together with the constraints on user settings that ensures this holds. ASSERT(initialSize >= minHeapSize && initialSize <= maxHeapSize); // Initially we divide the space equally between the major and // minor heaps. That means that there will definitely be space // for the first minor GC to copy its data. This division can be // changed later on. gMem.SetSpaceForHeap(initialSize); gMem.SetSpaceBeforeMinorGC(initialSize/2); lastFreeSpace = initialSize; highWaterMark = initialSize; if (percent == 0) userGCRatio = 1.0 / 9.0; // Default to 10% GC to 90% application else userGCRatio = (float)percent / (float)(100 - percent); predictedRatio = lastMajorGCRatio = userGCRatio; if (debugOptions & DEBUG_HEAPSIZE) { Log("Heap: Initial settings: Initial heap "); LogSize(initialSize); Log(" minimum "); LogSize(minHeapSize); Log(" maximum "); LogSize(maxHeapSize); Log(" target ratio %f\n", userGCRatio); } } void HeapSizeParameters::SetReservation(POLYUNSIGNED rsize) { gMem.SetReservation(K_to_words(rsize)); } // Called in the minor GC if a GC thread needs to grow the heap. // Returns zero if the heap cannot be grown. "space" is the space required for the // object (and length field) in case this is larger than the default size. LocalMemSpace *HeapSizeParameters::AddSpaceInMinorGC(POLYUNSIGNED space, bool isMutable) { // See how much space is allocated to the major heap. POLYUNSIGNED spaceAllocated = gMem.CurrentHeapSize() - gMem.CurrentAllocSpace(); // The new segment is either the default size or as large as // necessary for the object. POLYUNSIGNED spaceSize = gMem.DefaultSpaceSize(); if (space > spaceSize) spaceSize = space; // We allow for extension if the total heap size after extending it // plus one allocation area of the default size would not be more // than the allowed heap size. if (spaceAllocated + spaceSize + gMem.DefaultSpaceSize() <= gMem.SpaceForHeap()) { LocalMemSpace *sp = gMem.NewLocalSpace(spaceSize, isMutable); // Return the space or zero if it failed // If this is the first time the allocation failed report it. if (sp == 0 && (debugOptions & DEBUG_HEAPSIZE) && lastAllocationSucceeded) { Log("Heap: Allocation of new heap segment size "); LogSize(spaceSize); Log(" failed. Limit reached?\n"); } lastAllocationSucceeded = sp != 0; return sp; } return 0; // Insufficient space } // Called in the major GC before the copy phase if the heap is more than // 90% full. This should improve the efficiency of copying. LocalMemSpace *HeapSizeParameters::AddSpaceBeforeCopyPhase(bool isMutable) { LocalMemSpace *sp = gMem.NewLocalSpace(gMem.DefaultSpaceSize(), isMutable); if (sp == 0 && (debugOptions & DEBUG_HEAPSIZE) && lastAllocationSucceeded) Log("Heap: Allocation of new heap segment failed. Limit reached?\n"); lastAllocationSucceeded = sp != 0; return sp; } // The steepness of the curve. #define PAGINGCOSTSTEEPNESS 20.0 // The additional cost at the boundary #define PAGINGCOSTFACTOR 3.0 // The number of pages at the boundary #define PAGINGCOUNTFACTOR 1000.0 // Called at the end of collection. This is where we should do the // fine adjustment of the heap size to minimise the GC time. // Growing the heap is just a matter of adjusting the limits. We // don't actually need to allocate the space here. // See also adjustHeapSizeAfterMinorGC for adjustments after a minor GC. void HeapSizeParameters::AdjustSizeAfterMajorGC(POLYUNSIGNED wordsRequired) { // Cumulative times since the last major GC TIMEDATA gc, nonGc; gc.add(majorGCSystemCPU); gc.add(majorGCUserCPU); nonGc.add(majorNonGCSystemCPU); nonGc.add(majorNonGCUserCPU); if (highWaterMark < heapSizeAtStart) highWaterMark = heapSizeAtStart; POLYUNSIGNED heapSpace = gMem.SpaceForHeap() < highWaterMark ? gMem.SpaceForHeap() : highWaterMark; currentSpaceUsed = wordsRequired; for (unsigned i = 0; i < gMem.nlSpaces; i++) { currentSpaceUsed += gMem.lSpaces[i]->allocatedSpace(); } // N.B. Normally currentSpaceUsed will be less than the size of the heap // except if wordsRequired is very large. // The times for all the minor GCs up to this. The cost of this (major) GC // is actually in minorGCUserCPU/minorGCSystemCPU. TIMEDATA minorGC; minorGC.add(gc); minorGC.sub(minorGCUserCPU); minorGC.sub(minorGCSystemCPU); if (performSharingPass) { // We ran the sharing pass last time: calculate the actual recovery rate. POLYUNSIGNED originalSpaceUsed = currentSpaceUsed + sharingWordsRecovered; sharingRecoveryRate = (double)sharingWordsRecovered / (double)originalSpaceUsed; if (debugOptions & DEBUG_HEAPSIZE) Log("Heap: Sharing recovery rate was %0.3f and cost %0.3f seconds (%0.3f%% of total).\n", sharingRecoveryRate, sharingCPU.toSeconds(), sharingCPU.toSeconds() / gc.toSeconds()); // The cost factor is the ratio of the cost of sharing to the cost without. sharingCostFactor = sharingCPU.toSeconds() / (gc.toSeconds() - sharingCPU.toSeconds()); // Subtract the sharing cost from the GC cost because the initial estimate is // the cost without running the sharing pass. gc.sub(sharingCPU); } if (gc.toSeconds() != 0.0 && nonGc.toSeconds() != 0.0) lastMajorGCRatio = gc.toSeconds() / nonGc.toSeconds(); if (debugOptions & DEBUG_HEAPSIZE) { POLYUNSIGNED currentFreeSpace = currentSpaceUsed < heapSpace ? 0: heapSpace - currentSpaceUsed; Log("Heap: GC cpu time %2.3f non-gc time %2.3f ratio %0.3f for free space ", gc.toSeconds(), nonGc.toSeconds(), lastMajorGCRatio); LogSize((lastFreeSpace + currentFreeSpace)/2); Log("\n"); Log("Heap: GC real time %2.3f non-gc time %2.3f ratio %0.3f\n", majorGCReal.toSeconds(), majorNonGCReal.toSeconds(), majorGCReal.toSeconds()/majorNonGCReal.toSeconds()); Log("Heap: Total of minor GCs %2.3f, %2.3f of total\n", minorGC.toSeconds(), minorGC.toSeconds() / gc.toSeconds()); } // Calculate the paging threshold. if (pagingLimitSize != 0 || majorGCPageFaults != 0) { if (majorGCPageFaults == 0) majorGCPageFaults = 1; // Less than one // Some paging detected. The expression here is the inverse of the one used to // compute the paging contribution in the cost function. double scaleFactor = 1.0 + log((double)majorGCPageFaults / PAGINGCOUNTFACTOR) / PAGINGCOSTSTEEPNESS; ASSERT(scaleFactor > 0.0); POLYUNSIGNED newLimit = (POLYUNSIGNED)((double)heapSpace / scaleFactor); if (pagingLimitSize == 0) pagingLimitSize = newLimit; else pagingLimitSize = (newLimit + pagingLimitSize) / 2; } if (allocationFailedBeforeLastMajorGC) { // If the last allocation failed then we may well have reached the // maximum available memory. Set the paging limit to be the current // heap size. We want to avoid hitting the limit because typically // that happens when we try to extend the major heap in a minor GC // resulting in the minor GC failing and a major GC starting. if (pagingLimitSize == 0 || heapSizeAtStart < pagingLimitSize) pagingLimitSize = heapSizeAtStart; } if (pagingLimitSize != 0 && (debugOptions & DEBUG_HEAPSIZE)) { Log("Heap: Paging threshold adjusted to "); LogSize(pagingLimitSize); Log(" with %ld page faults\n", majorGCPageFaults); } // Calculate the new heap size and the predicted cost. POLYUNSIGNED newHeapSize; double cost; bool atTarget = getCostAndSize(newHeapSize, cost, false); // If we have been unable to allocate any more memory we may already // be at the limit. if (allocationFailedBeforeLastMajorGC && newHeapSize > heapSizeAtStart) { cost = costFunction(heapSizeAtStart, false, true); atTarget = false; } if (atTarget) { // We are at the target level. We don't want to attempt sharing. performSharingPass = false; cumulativeSharingSaving = 0; } else { POLYUNSIGNED newHeapSizeWithSharing; double costWithSharing; // Get the cost and heap size if sharing was enabled. If we are at the // limit, though, we need to work using the size we can achieve. if (! allocationFailedBeforeLastMajorGC) (void)getCostAndSize(newHeapSizeWithSharing, costWithSharing, true); else { newHeapSizeWithSharing = heapSizeAtStart; costWithSharing = costFunction(heapSizeAtStart, true, true); } // Run the sharing pass if that would give a lower cost. // Subtract the cumulative saving that would have been made if the // sharing had been run before. This is an estimate and depends on the // extent to which a reduction in the heap earlier would be carried through // to later GCs. cumulativeSharingSaving = cumulativeSharingSaving * ((double)currentSpaceUsed / (double)heapSpace); if (debugOptions & DEBUG_HEAPSIZE) Log("Heap: Cumulative sharing saving %0.2f\n", cumulativeSharingSaving); if (costWithSharing - cumulativeSharingSaving < cost) { // Run the sharing pass next time. performSharingPass = true; cumulativeSharingSaving = 0; } else { // Don't run the sharing pass next time performSharingPass = false; // Running a sharing pass reduces the heap for subsequent // runs. Add this into the cost. double freeSharingCost = costFunction(newHeapSizeWithSharing, true, false); if (freeSharingCost < cost && freeSharingCost > userGCRatio) { if (debugOptions & DEBUG_HEAPSIZE) Log("Heap: Previous sharing would have saved %0.2f\n", cost - freeSharingCost); cumulativeSharingSaving += cost - freeSharingCost; } } } if (debugOptions & DEBUG_HEAPSIZE) { if (performSharingPass) Log("Heap: Next full GC will enable the sharing pass\n"); Log("Heap: Resizing from "); LogSize(gMem.SpaceForHeap()); Log(" to "); LogSize(newHeapSize); Log(". Estimated ratio %2.2f\n", cost); } // Set the sizes. gMem.SetSpaceForHeap(newHeapSize); // Set the minor space size. It can potentially use the whole of the // rest of the available heap but there could be a problem if that exceeds // the available memory and causes paging. We need to raise the limit carefully. // Also, if we use the whole of the heap we may not then be able to allocate // new areas in the major heap without going over the limit. Restrict it to // half of the available heap. POLYUNSIGNED nextLimit = highWaterMark + highWaterMark / 32; if (nextLimit > newHeapSize) nextLimit = newHeapSize; // gMem.CurrentHeapSize() is the live space size. if (gMem.CurrentHeapSize() > nextLimit) gMem.SetSpaceBeforeMinorGC(0); // Run out of space else gMem.SetSpaceBeforeMinorGC((nextLimit-gMem.CurrentHeapSize())/2); lastFreeSpace = newHeapSize - currentSpaceUsed; predictedRatio = cost; } // Called after a minor GC. Currently does nothing. // See also adjustHeapSize for adjustments after a major GC. bool HeapSizeParameters::AdjustSizeAfterMinorGC(POLYUNSIGNED spaceAfterGC, POLYUNSIGNED spaceBeforeGC) { POLYUNSIGNED spaceCopiedOut = spaceAfterGC-spaceBeforeGC; TIMEDATA gc, total; minorGCsSinceMajor++; // The major costs are cumulative so we use those gc.add(majorGCSystemCPU); gc.add(majorGCUserCPU); total.add(gc); total.add(majorNonGCSystemCPU); total.add(majorNonGCUserCPU); float g = gc.toSeconds() / total.toSeconds(); if (debugOptions & DEBUG_HEAPSIZE) { Log("Heap: Space before "); LogSize(spaceBeforeGC); Log(", space after "); LogSize(spaceAfterGC); Log("\n"); Log("Heap: Minor resizing factors g = %f, recent pf = %ld, cumulative pf = %ld\n", g, minorGCPageFaults, majorGCPageFaults); } if (highWaterMark < gMem.CurrentHeapSize()) highWaterMark = gMem.CurrentHeapSize(); POLYUNSIGNED nextLimit = highWaterMark + highWaterMark / 32; if (nextLimit > gMem.SpaceForHeap()) nextLimit = gMem.SpaceForHeap(); // Set the space available for the allocation area to be the difference between the // total heap size and the allowed heap size together with as much space as we copied // on this GC. That allows for the next minor GC to copy the same amount without // extending the heap. If the next minor GC adds more than this the heap will be // extended and a corresponding amount deducted so that the heap shrinks again. POLYUNSIGNED currHeap = gMem.CurrentHeapSize(); POLYUNSIGNED currAlloc = gMem.CurrentAllocSpace(); POLYUNSIGNED nonAlloc = currHeap - currAlloc + spaceCopiedOut; // TODO: If we have limited the space to the high water mark + 1/32 but that is less // than we really need we should increase it further. POLYUNSIGNED allowedAlloc = nonAlloc >= nextLimit ? 0 : nextLimit - nonAlloc; // Normally the allocation area will be empty but if we've failed to copy // everything out, especially a big object, it may not be. POLYUNSIGNED allocatedInAlloc = gMem.AllocatedInAlloc(); // If we hit the limit at the last major GC we have to be much more careful. // If the minor GC cannot allocate a major GC space when it needs it the minor // GC will fail immediately and a major GC will be started. It's better to // risk doing more minor GCs than we need by making the allocation area smaller // rather than run out of space. if (allocationFailedBeforeLastMajorGC) allowedAlloc = allowedAlloc / 2; if (gMem.CurrentAllocSpace() - allocatedInAlloc != allowedAlloc) { if (debugOptions & DEBUG_HEAPSIZE) { Log("Heap: Adjusting space for allocation area from "); LogSize(gMem.SpaceBeforeMinorGC()); Log(" to "); LogSize(allowedAlloc); Log("\n"); } gMem.SetSpaceBeforeMinorGC(allowedAlloc); if (allowedAlloc < gMem.DefaultSpaceSize() * 2 || minorGCPageFaults > 100) return false; // Trigger full GC immediately. } // Trigger a full GC if the live data is very large or if we have exceeeded // the target ratio over several GCs (this smooths out small variations). if ((minorGCsSinceMajor > 4 && g > predictedRatio*0.8) || majorGCPageFaults > 100) fullGCNextTime = true; return true; } // Estimate the GC cost for a given heap size. The result is the ratio of // GC time to application time. // This is really guesswork. double HeapSizeParameters::costFunction(POLYUNSIGNED heapSize, bool withSharing, bool withSharingCost) { POLYUNSIGNED heapSpace = gMem.SpaceForHeap() < highWaterMark ? gMem.SpaceForHeap() : highWaterMark; POLYUNSIGNED currentFreeSpace = heapSpace < currentSpaceUsed ? 0: heapSpace - currentSpaceUsed; POLYUNSIGNED averageFree = (lastFreeSpace + currentFreeSpace) / 2; POLYUNSIGNED spaceUsed = currentSpaceUsed; // N.B. currentSpaceUsed includes the new space we want if (heapSize <= currentSpaceUsed) return 1.0E6; // If we run the sharing pass the live space will be smaller. if (withSharing) spaceUsed -= (POLYUNSIGNED)((double)currentSpaceUsed * sharingRecoveryRate); POLYUNSIGNED estimatedFree = heapSize - spaceUsed; // The cost scales as the inverse of the amount of free space. double result = lastMajorGCRatio * (double)averageFree / (double)estimatedFree; // If we run the sharing pass the GC cost will increase. if (withSharing && withSharingCost) result += result*sharingCostFactor; // The paging contribution depends on the page limit double pagingCost = 0.0; if (pagingLimitSize != 0) { double factor = ((double)heapSize - (double)pagingLimitSize) / (double)pagingLimitSize * PAGINGCOSTSTEEPNESS; pagingCost = PAGINGCOSTFACTOR * exp(factor); result += pagingCost; } if (debugOptions & DEBUG_HEAPSIZE) { Log("Heap: Cost for heap of size "); LogSize(heapSize); Log(" is %2.2f with paging contributing %2.2f with%s sharing pass.\n", result, pagingCost, withSharing ? "" : "out"); } return result; } // Calculate the size for the minimum cost. Returns true if this is bounded by // the user GC ratio and false if we minimised the cost // TODO: This could definitely be improved although it's not likely to contribute much to // the overall cost of a GC. bool HeapSizeParameters::getCostAndSize(POLYUNSIGNED &heapSize, double &cost, bool withSharing) { bool isBounded = false; POLYUNSIGNED heapSpace = gMem.SpaceForHeap() < highWaterMark ? gMem.SpaceForHeap() : highWaterMark; // Calculate a new heap size. We allow a maximum doubling or halving of size. // It's probably more important to limit the increase in case we hit paging. POLYUNSIGNED sizeMax = heapSpace * 2; if (sizeMax > maxHeapSize) sizeMax = maxHeapSize; POLYUNSIGNED sizeMin = heapSpace / 2; if (sizeMin < minHeapSize) sizeMin = minHeapSize; // We mustn't reduce the heap size too far. If the application does a lot // of work with few allocations and particularly if it calls PolyML.fullGC // explicitly we could attempt to shrink the heap below the current live data size. // Add 3*space size here. We require 2* after a minor GC. Add 1 for rounding. POLYUNSIGNED minForAllocation = gMem.CurrentHeapSize() + gMem.DefaultSpaceSize() * 3; if (minForAllocation > maxHeapSize) minForAllocation = maxHeapSize; if (sizeMin < minForAllocation) sizeMin = minForAllocation; double costMin = costFunction(sizeMin, withSharing, true); if (costMin < userGCRatio) // If the cost of the minimum is below the target we // use that and don't need to look further. isBounded = true; else { double costMax = costFunction(sizeMax, withSharing, true); while (sizeMax - sizeMin > gMem.DefaultSpaceSize()) { POLYUNSIGNED sizeNext = (sizeMin + sizeMax) / 2; double cost = costFunction(sizeNext, withSharing, true); if (cost < userGCRatio) isBounded = true; if (cost < userGCRatio || (costMax > costMin && costMax > userGCRatio)) { sizeMax = sizeNext; costMax = cost; } else { sizeMin = sizeNext; costMin = cost; } ASSERT(costMin > userGCRatio); } } ASSERT(sizeMin >= minHeapSize && sizeMin <= maxHeapSize); // If we are bounded by the user GC ratio we actually return the size and cost // that is slightly above the user ratio. heapSize = sizeMin; cost = costMin; return isBounded; } bool HeapSizeParameters::RunMajorGCImmediately() { if (fullGCNextTime) { fullGCNextTime = false; return true; } return false; } static bool GetLastStats(TIMEDATA &userTime, TIMEDATA &systemTime, TIMEDATA &realTime, long &pageCount) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME kt, ut; FILETIME ct, et; // Unused FILETIME rt; GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut); GetSystemTimeAsFileTime(&rt); userTime = ut; systemTime = kt; realTime = rt; pageCount = GetPaging(0); #else struct rusage rusage; if (getrusage(RUSAGE_SELF, &rusage) != 0) return false; userTime = rusage.ru_utime; systemTime = rusage.ru_stime; struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return false; realTime = tv; pageCount = GetPaging(rusage.ru_majflt); #endif return true; } void HeapSizeParameters::RecordAtStartOfMajorGC() { heapSizeAtStart = gMem.CurrentHeapSize(); allocationFailedBeforeLastMajorGC = !lastAllocationSucceeded; } // This function is called at the beginning and end of garbage // collection to record the time used. // This also reports the GC time if GC debugging is enabled. void HeapSizeParameters::RecordGCTime(gcTime isEnd, const char *stage) { switch (isEnd) { case GCTimeStart: { // Start of GC TIMEDATA userTime, systemTime, realTime; long pageCount; if (! GetLastStats(userTime, systemTime, realTime, pageCount)) break; lastUsageU = userTime; lastUsageS = systemTime; lastRTime = realTime; userTime.sub(startUsageU); // Times since the start systemTime.sub(startUsageS); realTime.sub(startRTime); if (debugOptions & DEBUG_GC) Log("GC: Non-GC time: CPU user: %0.3f system: %0.3f real: %0.3f page faults: %ld\n", userTime.toSeconds(), systemTime.toSeconds(), realTime.toSeconds(), pageCount - startPF); minorNonGCUserCPU.add(userTime); majorNonGCUserCPU.add(userTime); minorNonGCSystemCPU.add(systemTime); majorNonGCSystemCPU.add(systemTime); minorNonGCReal.add(realTime); majorNonGCReal.add(realTime); startUsageU = lastUsageU; startUsageS = lastUsageS; startRTime = lastRTime; // Page faults in the application are included minorGCPageFaults += pageCount - startPF; majorGCPageFaults += pageCount - startPF; startPF = pageCount; break; } case GCTimeIntermediate: // Report intermediate GC time for debugging if (debugOptions & DEBUG_GC) { TIMEDATA userTime, systemTime, realTime; long pageCount; if (! GetLastStats(userTime, systemTime, realTime, pageCount)) break; TIMEDATA nextU = userTime, nextS = systemTime, nextR = realTime; userTime.sub(lastUsageU); systemTime.sub(lastUsageS); realTime.sub(lastRTime); Log("GC: (%s) CPU user: %0.3f system: %0.3f real: %0.3f speed up %0.1f\n", stage, userTime.toSeconds(), systemTime.toSeconds(), realTime.toSeconds(), realTime.toSeconds() == 0.0 ? 0.0 : (userTime.toSeconds() + systemTime.toSeconds()) / realTime.toSeconds()); lastUsageU = nextU; lastUsageS = nextS; lastRTime = nextR; } break; case GCTimeEnd: // End of GC. { TIMEDATA userTime, systemTime, realTime; long pageCount; if (! GetLastStats(userTime, systemTime, realTime, pageCount)) break; lastUsageU = userTime; lastUsageS = systemTime; lastRTime = realTime; userTime.sub(startUsageU); // Times since the start systemTime.sub(startUsageS); realTime.sub(startRTime); totalGCUserCPU.add(userTime); totalGCSystemCPU.add(systemTime); totalGCReal.add(realTime); if (debugOptions & DEBUG_GC) { Log("GC: CPU user: %0.3f system: %0.3f real: %0.3f speed up %0.1f page faults %ld\n", userTime.toSeconds(), systemTime.toSeconds(), realTime.toSeconds(), realTime.toSeconds() == 0.0 ? 0.0 : (userTime.toSeconds() + systemTime.toSeconds()) / realTime.toSeconds(), pageCount - startPF); } minorGCUserCPU.add(userTime); majorGCUserCPU.add(userTime); minorGCSystemCPU.add(systemTime); majorGCSystemCPU.add(systemTime); minorGCReal.add(realTime); majorGCReal.add(realTime); startUsageU = lastUsageU; startUsageS = lastUsageS; startRTime = lastRTime; minorGCPageFaults += pageCount - startPF; majorGCPageFaults += pageCount - startPF; startPF = pageCount; globalStats.copyGCTimes(totalGCUserCPU, totalGCSystemCPU); } break; } } // Record the recovery rate and cost after running the GC sharing pass. // TODO: We should probably average these because if we've run a full // sharing pass and then a full GC after the recovery rate will be zero. void HeapSizeParameters::RecordSharingData(POLYUNSIGNED recovery) { sharingWordsRecovered = recovery; TIMEDATA userTime, systemTime, realTime; long pageCount; if (! GetLastStats(userTime, systemTime, realTime, pageCount)) return; userTime.sub(startUsageU); // Times since the start systemTime.sub(startUsageS); sharingCPU = userTime; sharingCPU.add(systemTime); } Handle HeapSizeParameters::getGCUtime(TaskData *taskData) const { #if (defined(_WIN32) && ! defined(__CYGWIN__)) return Make_arb_from_Filetime(taskData, totalGCUserCPU); #else return Make_arb_from_pair_scaled(taskData, ((struct timeval)totalGCUserCPU).tv_sec, ((struct timeval)totalGCUserCPU).tv_usec, 1000000); #endif } Handle HeapSizeParameters::getGCStime(TaskData *taskData) const { #if (defined(_WIN32) && ! defined(__CYGWIN__)) return Make_arb_from_Filetime(taskData, totalGCSystemCPU); #else return Make_arb_from_pair_scaled(taskData, ((struct timeval)totalGCSystemCPU).tv_sec, ((struct timeval)totalGCSystemCPU).tv_usec, 1000000); #endif } void HeapSizeParameters::Init() { #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Record an initial time of day to use as the basis of real timing FILETIME s; GetSystemTimeAsFileTime(&s); #else struct timeval s; gettimeofday(&s, NULL); #endif startTime = s; // Overall start time startRTime = startTime; // Start of this non-gc phase resetMajorTimingData(); #if (defined(_WIN32) && ! defined(__CYGWIN__)) startPF = GetPaging(0); #else startPF = GetPaging(0); #endif } void HeapSizeParameters::Final() { // Print the overall statistics if (debugOptions & (DEBUG_GC|DEBUG_HEAPSIZE)) { TIMEDATA userTime, systemTime, realTime; #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME kt, ut; FILETIME ct, et; // Unused FILETIME rt; GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut); GetSystemTimeAsFileTime(&rt); userTime.add(ut); systemTime.add(kt); realTime.add(rt); #else struct rusage rusage; struct timeval tv; if (getrusage(RUSAGE_SELF, &rusage) != 0 || gettimeofday(&tv, NULL) != 0) return; userTime.add(rusage.ru_utime); systemTime.add(rusage.ru_stime); realTime.add(tv); #endif realTime.sub(startTime); userTime.sub(totalGCUserCPU); systemTime.sub(totalGCSystemCPU); realTime.sub(totalGCReal); if (debugOptions & DEBUG_GC) { Log("GC (Total): Non-GC time: CPU user: %0.3f system: %0.3f real: %0.3f\n", userTime.toSeconds(), systemTime.toSeconds(), realTime.toSeconds()); Log("GC (Total): GC time: CPU user: %0.3f system: %0.3f real: %0.3f\n", totalGCUserCPU.toSeconds(), totalGCSystemCPU.toSeconds(), totalGCReal.toSeconds()); } if (debugOptions & DEBUG_HEAPSIZE) { TIMEDATA gc, nonGc; gc.add(totalGCUserCPU); gc.add(totalGCSystemCPU); nonGc.add(userTime); nonGc.add(systemTime); Log("Heap: Total CPU GC time %0.3fsecs, Non-GC %0.3fsecs, ratio %0.3f\n", gc.toSeconds(), nonGc.toSeconds(), gc.toSeconds() / nonGc.toSeconds()); } } } void HeapSizeParameters::resetMinorTimingData(void) { minorNonGCUserCPU.fromSeconds(0); minorNonGCSystemCPU.fromSeconds(0); minorNonGCReal.fromSeconds(0); minorGCUserCPU.fromSeconds(0); minorGCSystemCPU.fromSeconds(0); minorGCReal.fromSeconds(0); minorGCPageFaults = 0; } void HeapSizeParameters::resetMajorTimingData(void) { resetMinorTimingData(); majorNonGCUserCPU.fromSeconds(0); majorNonGCSystemCPU.fromSeconds(0); majorNonGCReal.fromSeconds(0); majorGCUserCPU.fromSeconds(0); majorGCSystemCPU.fromSeconds(0); majorGCReal.fromSeconds(0); majorGCPageFaults = 0; minorGCsSinceMajor = 0; } class HeapSizing: public RtsModule { public: virtual void Init(void); virtual void Stop(void); }; // Declare this. It will be automatically added to the table. static HeapSizing heapSizeModule; void HeapSizing::Init(void) { gHeapSizeParameters.Init(); } void HeapSizing::Stop() { gHeapSizeParameters.Final(); } static POLYUNSIGNED GetPhysicalMemorySize(void) { POLYUNSIGNED maxMem = 0-1; // Maximum unsigned value. #if defined(HAVE_WINDOWS_H) { MEMORYSTATUSEX memStatEx; memset(&memStatEx, 0, sizeof(memStatEx)); memStatEx.dwLength = sizeof(memStatEx); if (! GlobalMemoryStatusEx(&memStatEx)) memStatEx.ullTotalPhys = 0; // Clobber any rubbish since it says it failed. if (memStatEx.ullTotalPhys) // If it's non-zero assume it succeeded { DWORDLONG dwlMax = maxMem; if (memStatEx.ullTotalPhys > dwlMax) return maxMem; else return (POLYUNSIGNED)memStatEx.ullTotalPhys; } } #endif #if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) { // Linux and Solaris. This gives a silly value in Cygwin. long physPages = sysconf(_SC_PHYS_PAGES); long physPagesize = sysconf(_SC_PAGESIZE); if (physPages != -1 && physPagesize != -1) { unsigned long maxPages = maxMem / physPagesize; if ((unsigned long)physPages > maxPages) return maxMem; else // We've checked it won't overflow. return physPages*physPagesize; } } #endif #if defined(HAVE_SYSCTL) && defined(CTL_HW) // FreeBSD and Mac OS X. It seems HW_MEMSIZE has been added to // Max OS X to return a 64-bit value. #ifdef HW_MEMSIZE { static int mib[2] = { CTL_HW, HW_MEMSIZE }; uint64_t physMem = 0; size_t len = sizeof(physMem); if (sysctl(mib, 2, &physMem, &len, NULL, 0) == 0 && len == sizeof(physMem)) { if (physMem > (uint64_t)maxMem) return maxMem; else return (POLYUNSIGNED)physMem; } } #endif #ifdef HW_PHYSMEM // If HW_MEMSIZE isn't there or the call failed try this. { static int mib[2] = { CTL_HW, HW_PHYSMEM }; unsigned int physMem = 0; size_t len = sizeof(physMem); if (sysctl(mib, 2, &physMem, &len, NULL, 0) == 0 && len == sizeof(physMem)) { if (physMem > maxMem) return maxMem; else return physMem; } } #endif #endif return 0; // Unable to determine } polyml-5.6/libpolyml/heapsizing.h000066400000000000000000000125371265146633400172370ustar00rootroot00000000000000/* Title: heapsizing.h - parameters to adjust heap size Copyright (c) Copyright David C.J. Matthews 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef HEAPSIZING_H_INCLUDED #define HEAPSIZING_H_INCLUDED 1 #include "timing.h" class LocalMemSpace; class HeapSizeParameters { public: HeapSizeParameters(); // Extract timing information for ML. Handle getGCUtime(TaskData *taskData) const; Handle getGCStime(TaskData *taskData) const; void SetHeapParameters(POLYUNSIGNED minsize, POLYUNSIGNED maxsize, POLYUNSIGNED initialsize, unsigned percent); void SetReservation(POLYUNSIGNED rsize); // Called in the minor GC if a GC thread needs to grow the heap. // Returns zero if the heap cannot be grown. LocalMemSpace *AddSpaceInMinorGC(POLYUNSIGNED space, bool isMutable); // Called in the major GC before the copy phase if the heap is more than // 90% full. This should improve the efficiency of copying. LocalMemSpace *AddSpaceBeforeCopyPhase(bool isMutable); bool PerformSharingPass() const { return performSharingPass; } void AdjustSizeAfterMajorGC(POLYUNSIGNED wordsRequired); bool AdjustSizeAfterMinorGC(POLYUNSIGNED spaceAfterGC, POLYUNSIGNED spaceBeforeGC); // Returns true if we should run a major GC at this point bool RunMajorGCImmediately(); /* Called by the garbage collector at the beginning and end of garbage collection. */ typedef enum __gcTime { GCTimeStart, GCTimeIntermediate, GCTimeEnd } gcTime; // These are called by the GC to record information about its progress. void RecordAtStartOfMajorGC(); void RecordGCTime(gcTime isEnd, const char *stage = ""); void RecordSharingData(POLYUNSIGNED recovery); void resetMinorTimingData(void); void resetMajorTimingData(void); void Init(void); void Final(void); private: // Estimate the GC cost for a given heap size. The result is the ratio of // GC time to application time. double costFunction(POLYUNSIGNED heapSize, bool withSharing, bool withSharingCost); bool getCostAndSize(POLYUNSIGNED &heapSize, double &cost, bool withSharing); // Set if we should do a full GC next time instead of a minor GC. bool fullGCNextTime; // Whether a sharing pass should be performed on the next GC bool performSharingPass; // The proportion of the total heap recovered by the sharing pass double sharingRecoveryRate; // The cost of doing the sharing as a proportion of the rest of the GC. double sharingCostFactor; // The actual number of words recovered in the last sharing pass POLYUNSIGNED sharingWordsRecovered; // The saving we would have made by enabling sharing in the past double cumulativeSharingSaving; // Maximum and minimum heap size as given by the user. POLYUNSIGNED minHeapSize, maxHeapSize; // Target GC cost requested by the user. double userGCRatio; // Actual ratio for the last major GC double lastMajorGCRatio; // Predicted ratio for the next GC double predictedRatio; POLYUNSIGNED lastFreeSpace, currentSpaceUsed; // Set to false if an allocation failed. Indicates that // we may have reached some virtual memory limit. bool lastAllocationSucceeded; // Set to true if the last major GC may have hit the limit bool allocationFailedBeforeLastMajorGC; // The estimated boundary where the paging will become // a significant factor. POLYUNSIGNED pagingLimitSize; // The maximum size the heap has reached so far. POLYUNSIGNED highWaterMark; // The heap size at the start of the current GC before any spaces have been deleted. POLYUNSIGNED heapSizeAtStart; // The start of the clock. TIMEDATA startTime; // Timing for the last minor or major GC TIMEDATA minorNonGCUserCPU; TIMEDATA minorNonGCSystemCPU; TIMEDATA minorNonGCReal; TIMEDATA minorGCUserCPU; TIMEDATA minorGCSystemCPU; TIMEDATA minorGCReal; long minorGCPageFaults; unsigned minorGCsSinceMajor; // Timing for all the minor GCs and the last major GC. // Reset after each major GC. TIMEDATA majorNonGCUserCPU; TIMEDATA majorNonGCSystemCPU; TIMEDATA majorNonGCReal; TIMEDATA majorGCUserCPU; TIMEDATA majorGCSystemCPU; TIMEDATA majorGCReal; long majorGCPageFaults; // Totals for all GCs TIMEDATA totalGCUserCPU; TIMEDATA totalGCSystemCPU; TIMEDATA totalGCReal; // The cost for the last sharing pass TIMEDATA sharingCPU; TIMEDATA startUsageU, startUsageS, lastUsageU, lastUsageS; TIMEDATA startRTime, lastRTime; long startPF; }; extern HeapSizeParameters gHeapSizeParameters; #endif polyml-5.6/libpolyml/int_opcodes.h000066400000000000000000000132321265146633400173750ustar00rootroot00000000000000/* Title: Definitions for the code-tree instructions. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define INSTR_enter_int 0x00 #if 0 /* for the mips version, we have the following relocations: */ INSTR_enter_int1 0x0d /* mips -> int at start of mips closure */ INSTR_enter_int2 0x91 /* used after int call instruction */ INSTR_return_w 0x92 /* int */ 0x90 same as INSTR_local_w /* why? */ #endif /* For use by the interpreter (only) SPF 26/6/95) */ #define INSTR_tail_0_0 0x01 #define INSTR_jump 0x02 #define INSTR_jump_false 0x03 #define INSTR_container 0x04 /* Added DCJM 5/10/05. */ #define INSTR_del_handler 0x05 #define INSTR_jump_i 0x06 #define INSTR_jump_i_false 0x07 #define INSTR_set_container 0x08 /* Added DCJM 5/10/05. */ #define INSTR_del_handler_i 0x09 #define INSTR_case 0x0a #define INSTR_call_sl 0x0b #define INSTR_call_closure 0x0c #define INSTR_return_w 0x0d #define INSTR_pad 0x0e #define INSTR_jump_i_u 0x0f #define INSTR_raise_ex 0x10 #define INSTR_get_store_w 0x11 #define INSTR_non_local 0x12 #define INSTR_local_w 0x13 #define INSTR_indirect_w 0x14 #define INSTR_move_to_vec_w 0x15 #define INSTR_call_sl_X 0x16 /* Added DCJM 25/9/00. */ #define INSTR_set_stack_val_w 0x17 #define INSTR_reset_w 0x18 #define INSTR_reset_r_w 0x19 #define INSTR_const_addr 0x1a #define INSTR_const_int_w 0x1b #define INSTR_io_vec_entry 0x1c #define INSTR_const_nil 0x1d #define INSTR_jump_back 0x1e #define INSTR_return_b 0x1f #define INSTR_jump_back16 0x20 #define INSTR_get_store_b 0x21 #define INSTR_local_b 0x22 #define INSTR_indirect_b 0x23 #define INSTR_move_to_vec_b 0x24 #define INSTR_set_stack_val_b 0x25 #define INSTR_reset_b 0x26 #define INSTR_reset_r_b 0x27 #define INSTR_const_int_b 0x28 #define INSTR_local_0 0x29 #define INSTR_local_1 0x2a #define INSTR_local_2 0x2b #define INSTR_local_3 0x2c #define INSTR_local_4 0x2d #define INSTR_local_5 0x2e #define INSTR_local_6 0x2f #define INSTR_local_7 0x30 #define INSTR_local_8 0x31 #define INSTR_local_9 0x32 #define INSTR_local_10 0x33 #define INSTR_local_11 0x34 #define INSTR_indirect_0 0x35 #define INSTR_indirect_1 0x36 #define INSTR_indirect_2 0x37 #define INSTR_indirect_3 0x38 #define INSTR_indirect_4 0x39 #define INSTR_indirect_5 0x3a #define INSTR_const_0 0x3b #define INSTR_const_1 0x3c #define INSTR_const_2 0x3d #define INSTR_const_3 0x3e #define INSTR_const_4 0x3f #define INSTR_const_10 0x40 #define INSTR_return_0 0x41 #define INSTR_return_1 0x42 #define INSTR_return_2 0x43 #define INSTR_return_3 0x44 #define INSTR_move_to_vec_0 0x45 #define INSTR_move_to_vec_1 0x46 #define INSTR_move_to_vec_2 0x47 #define INSTR_move_to_vec_3 0x48 #define INSTR_move_to_vec_4 0x49 #define INSTR_move_to_vec_5 0x4a #define INSTR_move_to_vec_6 0x4b #define INSTR_move_to_vec_7 0x4c #define INSTR_const_addr_Xb 0x4d /* Added DCJM 25/9/00. */ #define INSTR_const_addr_Xw 0x4e /* Added DCJM 25/9/00. */ #define INSTR_call_sl_cX 0x4f /* Added DCJM 25/9/00. */ #define INSTR_reset_1 0x50 #define INSTR_reset_2 0x51 #define INSTR_get_store_2 0x52 #define INSTR_get_store_3 0x53 #define INSTR_get_store_4 0x54 #define INSTR_tuple_container 0x55 /* Added DCJM 5/10/05. */ #define INSTR_non_local_l_1 0x56 #define INSTR_non_local_l_2 0x57 #define INSTR_non_local_l_3 0x58 #define INSTR_call_sl_c 0x59 #define INSTR_io_vec_5 0x5a #define INSTR_io_vec_6 0x5b #define INSTR_integer_add 0x5c #define INSTR_integer_minus 0x5d #define INSTR_integer_equal 0x5e #define INSTR_integer_leq 0x5f #define INSTR_integer_greater 0x60 #define INSTR_boolean_or 0x61 #define INSTR_word_equal 0x62 #define INSTR_assign_word 0x63 #define INSTR_reset_r_1 0x64 #define INSTR_reset_r_2 0x65 #define INSTR_reset_r_3 0x66 #define INSTR_tuple_w 0x67 #define INSTR_tuple_b 0x68 #define INSTR_tuple_2 0x69 #define INSTR_tuple_3 0x6a #define INSTR_tuple_4 0x6b #define INSTR_lock 0x6c #define INSTR_ldexc 0x6d #define INSTR_io_vec_225 0x6e #define INSTR_io_vec_226 0x6f #define INSTR_io_vec_229 0x70 #define INSTR_io_vec_233 0x71 #define INSTR_io_vec_236 0x72 #define INSTR_io_vec_251 0x73 #define INSTR_io_vec_253 0x74 #define INSTR_io_vec_255 0x75 #define INSTR_set_handler_old 0x76 #define INSTR_push_handler 0x78 #define INSTR_set_handler_old_i 0x7a #define INSTR_tail_b_b 0x7b #define INSTR_tail 0x7c #define INSTR_tail_3_b 0x7d #define INSTR_tail_4_b 0x7e #define INSTR_tail_3_2 0x7f #define INSTR_tail_3_3 0x80 #define INSTR_set_handler_new 0x81 #define INSTR_set_handler_new_i 0x82polyml-5.6/libpolyml/interpret.cpp000066400000000000000000002404571265146633400174510ustar00rootroot00000000000000/* Title: An interpreter for a compact instruction set. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #include "globals.h" #include "int_opcodes.h" #include "machine_dep.h" #include "sys.h" #include "profiling.h" #include "arb.h" #include "processes.h" #include "run_time.h" #include "mpoly.h" #include "gc.h" #include "basicio.h" #include "timing.h" #include "arb.h" #include "reals.h" #include "objsize.h" #include "xwindows.h" #include "foreign.h" #include "process_env.h" #include "network.h" #include "basicio.h" #include "sighandler.h" #include "os_specific.h" #include "diagnostics.h" #include "polystring.h" #include "save_vec.h" #include "memmgr.h" #include "poly_specific.h" #include "scanaddrs.h" #include "polyffi.h" #define arg1 (pc[0] + pc[1]*256) #define arg2 (pc[2] + pc[3]*256) #define arg3 (pc[4] + pc[5]*256) #define arg4 (pc[6] + pc[7]*256) const PolyWord True = TAGGED(1); const PolyWord False = TAGGED(0); const PolyWord Zero = TAGGED(0); #define CHECKED_REGS 2 #define UNCHECKED_REGS 0 #define EXTRA_STACK 0 // Don't need any extra - signals aren't handled on the Poly stack. /* the amount of ML stack space to reserve for registers, C exception handling etc. The compiler requires us to reserve 2 stack-frames worth (2 * 20 words) plus whatever we require for the register save area. We actually reserve slightly more than this. SPF 3/3/97 */ #define OVERFLOW_STACK_SIZE \ (50 + \ sizeof(StackObject)/sizeof(PolyWord) + \ CHECKED_REGS + \ UNCHECKED_REGS + \ EXTRA_STACK) class StackObject { public: // POLYUNSIGNED p_space; // POLYCODEPTR p_pc; // PolyWord *p_sp; // PolyWord *p_hr; // POLYUNSIGNED p_nreg; // PolyWord p_reg[CHECKED_REGS]; // POLYUNSIGNED p_nUnchecked; }; class IntTaskData: public TaskData { public: IntTaskData(): interrupt_requested(false) {} virtual void GCStack(ScanAddress *process); virtual Handle EnterPolyCode(); // Start running ML // Switch to Poly and return with the io function to call. int SwitchToPoly(); virtual void SetException(poly_exn *exc); virtual void InterruptCode(); // GetPCandSPFromContext is used in time profiling. We can't get accurate info so return false. virtual bool GetPCandSPFromContext(SIGNALCONTEXT *context, PolyWord * &sp, POLYCODEPTR &pc) { return false; } virtual void InitStackFrame(TaskData *newTask, Handle proc, Handle arg); // These aren't implemented in the interpreted version. virtual Handle EnterCallbackFunction(Handle func, Handle args) { ASSERT(0); return 0; } virtual int GetIOFunctionRegisterMask(int ioCall) { return 0; } // Increment or decrement the first word of the object pointed to by the // mutex argument and return the new value. virtual Handle AtomicIncrement(Handle mutexp); virtual Handle AtomicDecrement(Handle mutexp); // Set a mutex to one. virtual void AtomicReset(Handle mutexp); virtual POLYCODEPTR pc(void) const { return p_pc; } virtual PolyWord *sp(void) const { return p_sp; } virtual PolyWord *hr(void) const { return p_hr; } virtual void set_hr(PolyWord *hr) { p_hr = hr; } // Return the minimum space occupied by the stack if we are considering shrinking it. virtual POLYUNSIGNED currentStackSpace(void) const { return (this->stack->top - this->p_sp) + OVERFLOW_STACK_SIZE; } virtual void CopyStackFrame(StackObject *old_stack, POLYUNSIGNED old_length, StackObject *new_stack, POLYUNSIGNED new_length); bool interrupt_requested; POLYCODEPTR p_pc; PolyWord *p_sp; PolyWord *p_hr; PolyWord p_exception_arg; unsigned p_lastInstr; }; // Special values for return addresses or in the address of an exception handler. // In an exception handler SPECIAL_PC_TRACE_EX means trace this exception, as // a return address it means exception_trace has returned. #define SPECIAL_PC_TRACE_EX_RETURN TAGGED(0) #define SPECIAL_PC_END_THREAD TAGGED(1) #define SPECIAL_PC_TRACE_EX_FN TAGGED(2) class Interpreter : public MachineDependent { public: Interpreter() {} // Create a task data object. virtual TaskData *CreateTaskData(void) { return new IntTaskData(); } virtual void InitInterfaceVector(void); virtual Architectures MachineArchitecture(void) { return MA_Interpreted; } }; void IntTaskData::InitStackFrame(TaskData *parentTask, Handle proc, Handle arg) /* Initialise stack frame. */ { StackSpace *space = this->stack; StackObject *stack = (StackObject *)space->stack(); PolyObject *closure = DEREFWORDHANDLE(proc); POLYUNSIGNED stack_size = space->spaceSize(); this->p_pc = *(byte**)(closure); this->p_sp = (PolyWord*)stack + stack_size-3; /* sp */ this->p_exception_arg = TAGGED(0); /* Used for exception argument. */ this->p_lastInstr = 256; /* No instruction. */ this->p_sp = (PolyWord*)stack + stack_size; /* Set up exception handler */ /* No previous handler so point it at itself. */ this->p_sp--; *(this->p_sp) = PolyWord::FromStackAddr(this->p_sp); *(--this->p_sp) = SPECIAL_PC_END_THREAD; /* Default return address. */ *(--this->p_sp) = Zero; /* Default handler. */ this->p_hr = this->p_sp; /* If this function takes an argument store it on the stack. */ if (arg != 0) *(--this->p_sp) = DEREFWORD(arg); *(--this->p_sp) = SPECIAL_PC_END_THREAD; /* Return address. */ *(--this->p_sp) = closure; /* Closure address */ } void IntTaskData::InterruptCode() /* Stop the Poly code at a suitable place. */ /* We may get an asynchronous interrupt at any time. */ { IntTaskData *itd = (IntTaskData *)this; itd->interrupt_requested = true; } void IntTaskData::SetException(poly_exn *exc) /* Set up the stack of a process to raise an exception. */ { this->p_lastInstr = INSTR_raise_ex; *(--this->p_sp) = (PolyWord)exc; /* push exception data */ } int IntTaskData::SwitchToPoly() /* (Re)-enter the Poly code from C. */ { register PolyWord *sp; /* Stack pointer. */ register byte *pc; /* Program counter. */ register PolyWord *sl; /* Stack limit register. */ register int li; /* Last instruction. */ POLYUNSIGNED tailCount; PolyWord *tailPtr; POLYUNSIGNED returnCount; POLYUNSIGNED storeWords = 0; int instrBytes; RESTART: /* Load or reload the registers and run the code. */ if (this->allocPointer <= this->allocLimit + storeWords) { if (this->allocPointer < this->allocLimit) Crash ("Bad length in heap overflow trap"); // Find some space to allocate in. Updates this->allocPointer and // returns a pointer to the newly allocated space (if allocWords != 0) PolyWord *space = processes->FindAllocationSpace(this, storeWords, true); if (space != 0) // Undo the allocation just now. We'll redo it now we have the store. this->allocPointer += storeWords; } storeWords = 0; sp = this->p_sp; /* Reload these. */ pc = this->p_pc; li = this->p_lastInstr; sl = (PolyWord*)this->stack->stack()+OVERFLOW_STACK_SIZE; if (li != 256) goto RETRY; /* Re-execute instruction if necessary. */ for(;;){ /* Each instruction */ // char buff[100]; li = *pc++; /* Get next instruction. */ RETRY: // sprintf(buff, "PC=%x, i=%x\n", pc, li); // OutputDebugString(buff); // Check for stack overflow and interrupts. These can be done less // frequently than every instruction. // Don't do this if we're raising an exception: we may be raising // it because we can't grow the stack. Once we've processed the // exception and produced any exception trace the stack will have been // reset to the last handler. if (sp < sl && li != INSTR_raise_ex) { this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; Handle marker = this->saveVec.mark(); POLYUNSIGNED min_size = this->stack->top - this->p_sp + OVERFLOW_STACK_SIZE; CheckAndGrowStack(this, min_size); this->saveVec.reset(marker); goto RESTART; } if (this->interrupt_requested) { this->interrupt_requested = false; this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; return -1; } switch(li) { case INSTR_enter_int: pc++; /* Skip the argument. */ break; case INSTR_jump_false: { PolyWord u = *sp++; /* Pop argument */ if (u == True) { pc += 1; break; } /* else - false - take the jump */ } case INSTR_jump: pc += *pc + 1; break; case INSTR_push_handler: /* Save the old handler value. */ *(--sp) = PolyWord::FromStackAddr(this->p_hr); /* Push old handler */ break; case INSTR_set_handler_new: /* Set up a handler */ *(--sp) = PolyWord::FromCodePtr(pc + *pc + 1); /* Address of handler */ this->p_hr = sp; pc += 1; break; case INSTR_set_handler_old: /* Set up a handler */ // Legacy version. The handler pushes an exception id. *(--sp) = PolyWord::FromCodePtr(pc + *pc + 1); /* Address of handler */ this->p_hr = sp-1; /*Point to identifier about to be pushed*/ pc += 1; break; case INSTR_del_handler: /* Delete handler retaining the result. */ { PolyWord u = *sp++; sp = this->p_hr; if (*sp == TAGGED(0)) sp++; // Legacy sp++; // Skip handler entry point // Restore old handler this->p_hr = (*sp).AsStackAddr(); *sp = u; // Put back the result pc += *pc + 1; /* Skip the handler */ break; } case INSTR_jump_i_false: if (*sp++ == True) { pc += 1; break; } /* else - false - take the jump */ case INSTR_jump_i_u: /* Indirect jump */ { // This is always a forward jump pc += *pc + 1; pc += arg1 + 2; break; } case INSTR_jump_i: /* Indirect jump */ { // This is only for backwards compatibility pc += *pc + 1; /* This may jump backwards. */ int u = arg1; if (u > 32767) u -= 65536; pc += u + 2; break; } case INSTR_set_handler_new_i: /* Set up a handler */ { byte *u = pc + *pc + 1; *(--sp) = /* Address of handler */ PolyWord::FromCodePtr(u + u[0] + u[1]*256 + 2); this->p_hr = sp; pc += 1; break; } case INSTR_set_handler_old_i: /* Set up a handler */ { byte *u = pc + *pc + 1; *(--sp) = /* Address of handler */ PolyWord::FromCodePtr(u + u[0] + u[1]*256 + 2); this->p_hr = sp-1; pc += 1; break; } case INSTR_del_handler_i: /* Delete handler retaining the result. */ { PolyWord u = *sp++; PolyWord *t; sp = this->p_hr; PolyWord *endStack = this->stack->top; while((t = (*sp).AsStackAddr()) < sp || t > endStack) sp++; this->p_hr = t; *sp = u; pc += *pc + 1; /* Skip the handler */ pc += arg1 + 2; break; } case INSTR_case: { POLYSIGNED u = UNTAGGED(*sp++); /* Get the value */ if (u > arg1 || u < 0) pc += (arg1+2)*2; /* Out of range */ else { pc += 2; pc += /* Index */pc[u*2]+pc[u*2 + 1]*256; } break; } case INSTR_call_sl: /* Static link call */ { /* Get static link value. */ PolyWord *t = sp+arg2; for(int i = 1; i <= arg3; i++) t = (t[-1]).AsStackAddr(); PolyWord *constAddr = (PolyWord*)(pc+arg1+2); /* Get entry point. */ *(--sp) = PolyWord::FromCodePtr(pc+6); /* Push return address to point after instruction. */ *(--sp) = PolyWord::FromStackAddr(t); /* Push static link */ pc = (*constAddr).AsCodePtr(); break; } case INSTR_call_sl_X: { /* Get static link value. */ PolyWord *t = sp+arg3; for(int u = 1; u <= arg4; u++) t = (t[-1]).AsStackAddr(); PolyWord *constAddr = (PolyWord*)(pc+arg2+(arg1+4)*sizeof(PolyWord)+4); /* Get entry point. */ *(--sp) = PolyWord::FromCodePtr(pc+8); /* Push return address to point after instruction. */ *(--sp) = PolyWord::FromStackAddr(t); /* Push static link */ pc = (*constAddr).AsCodePtr(); break; } case INSTR_tail_3_b: tailCount = 3; tailPtr = sp + tailCount; sp = tailPtr + *pc; goto TAIL_CALL; case INSTR_tail_3_2: tailCount = 3; tailPtr = sp + tailCount; sp = tailPtr + 2; goto TAIL_CALL; case INSTR_tail_3_3: tailCount = 3; tailPtr = sp + tailCount; sp = tailPtr + 3; goto TAIL_CALL; case INSTR_tail_4_b: tailCount = 4; tailPtr = sp + tailCount; sp = tailPtr + *pc; goto TAIL_CALL; case INSTR_tail_b_b: tailCount = *pc; tailPtr = sp + tailCount; sp = tailPtr + pc[1]; goto TAIL_CALL; case INSTR_tail: /* Tail recursive call. */ /* Move items up the stack. */ /* There may be an overlap if the function we are calling has more args than this one. */ tailCount = arg1; tailPtr = sp + tailCount; sp = tailPtr + arg2; TAIL_CALL: /* For general case. */ if (tailCount < 2) Crash("Invalid argument\n"); for (; tailCount > 0; tailCount--) *(--sp) = *(--tailPtr); pc = (*sp++).AsCodePtr(); /* Pop the original return address. */ li = INSTR_call_closure; /* If we have to re-execute. */ /* And drop through. */ case INSTR_call_closure: /* Closure call - may be machine code. */ CALL_CLOSURE: /* Jumped to from POLY_SYS_callcode */ { PolyWord *t = (*sp).AsStackAddr(); /* Closure */ PolyWord u = *t; /* Get code address. (1st word of closure) */ if (IS_INT(u)) { /* Closure address is io vector */ sp++; /* Remove closure. */ POLYSIGNED uu = UNTAGGED(u); switch(uu) { case POLY_SYS_callcode_tupled: { t = (*sp++).AsStackAddr(); PolyWord v = t[1]; /* Arguments. */ if (v != Zero) /* No args. */ { PolyWord *vv = v.AsStackAddr(); POLYUNSIGNED u = v.AsObjPtr()->Length(); /* No. of args. */ for (; u > 0; u--) *(--sp) = *(vv++); } *(--sp) = t[0]; /* Push closure. */ goto CALL_CLOSURE; } case POLY_SYS_word_eq: u = *sp++; *sp = u == *sp ? True : False; break; case POLY_SYS_word_neq: u = *sp++; *sp = u == *sp ? False : True; break; case POLY_SYS_word_geq: u = *sp++; *sp = ((*sp).AsUnsigned() >= u.AsUnsigned())?True:False; break; case POLY_SYS_word_leq: u = *sp++; *sp = ((*sp).AsUnsigned() <= u.AsUnsigned())?True:False; break; case POLY_SYS_word_gtr: u = *sp++; *sp = ((*sp).AsUnsigned() > u.AsUnsigned())?True:False; break; case POLY_SYS_word_lss: u = *sp++; *sp = ((*sp).AsUnsigned() < u.AsUnsigned())?True:False; break; case POLY_SYS_or_word: u = *sp++; *sp = TAGGED(UNTAGGED(*sp) | UNTAGGED(u)); break; case POLY_SYS_and_word: u = *sp++; *sp = TAGGED(UNTAGGED(*sp) & UNTAGGED(u)); break; case POLY_SYS_not_bool: *sp = (*sp == True) ? False : True; break; case POLY_SYS_string_length: /* Length is first word of string unless it is a single character. */ if (IS_INT(*sp)) *sp = TAGGED(1); else *sp = TAGGED(((PolyStringObject*)(*sp).AsObjPtr())->length); break; case POLY_SYS_touch_final: *sp = TAGGED(0); break; case POLY_SYS_set_string_length: { /* Store the length word of a string. */ POLYUNSIGNED len = UNTAGGED(*sp++); ((PolyStringObject*)(*sp).AsObjPtr())->length = len; *sp = Zero; break; } case POLY_SYS_mul_word: u = *sp++; *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) * UNTAGGED_UNSIGNED(u)); break; case POLY_SYS_plus_word: u = *sp++; *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) + UNTAGGED_UNSIGNED(u)); break; case POLY_SYS_minus_word: u = *sp++; *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) - UNTAGGED_UNSIGNED(u)); break; case POLY_SYS_div_word: { POLYUNSIGNED u = UNTAGGED_UNSIGNED(*sp++); if (u == 0) raise_exception0(this, EXC_divide); *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) / u); break; } case POLY_SYS_mod_word: { POLYUNSIGNED u = UNTAGGED_UNSIGNED(*sp++); if (u == 0) raise_exception0(this, EXC_divide); // It's essential to use UNTAGGED_UNSIGNED here. // The old version used UNTAGGED which uses an arithmetic shift // and produces the wrong answer. *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) % u); break; } case POLY_SYS_xor_word: { PolyWord u = *sp++; *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) ^ UNTAGGED_UNSIGNED(u)); break; } case POLY_SYS_shift_left_word: { PolyWord u = *sp++; if (UNTAGGED_UNSIGNED(u) > sizeof(PolyWord)*8) *sp = Zero; else *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) << UNTAGGED_UNSIGNED(u)); break; } case POLY_SYS_shift_right_word: { PolyWord u = *sp++; if (UNTAGGED_UNSIGNED(u) > sizeof(PolyWord)*8) *sp = Zero; else *sp = TAGGED(UNTAGGED_UNSIGNED(*sp) >> UNTAGGED_UNSIGNED(u)); break; } case POLY_SYS_shift_right_arith_word: { PolyWord u = *sp++; if (UNTAGGED_UNSIGNED(u) > sizeof(PolyWord)*8) { if (UNTAGGED(*sp) < 0) *sp = TAGGED(-1); else *sp = Zero; } else // Strictly speaking, C does not require that this uses // arithmetic shifting so we really ought to set the // high-order bits explicitly. *sp = TAGGED(UNTAGGED(*sp) >> UNTAGGED(u)); break; } case POLY_SYS_load_byte: case POLY_SYS_load_byte_immut: { POLYUNSIGNED u = UNTAGGED(*sp++); *sp = TAGGED((*sp).AsCodePtr()[u]); break; } case POLY_SYS_load_word: case POLY_SYS_load_word_immut: { POLYUNSIGNED u = UNTAGGED(*sp++); *sp = (*sp).AsObjPtr()->Get(u); break; } case POLY_SYS_assign_byte: { POLYUNSIGNED t = UNTAGGED(*sp++); POLYUNSIGNED u = UNTAGGED(*sp++); (*sp).AsCodePtr()[u] = (byte)t; *sp = Zero; break; } case POLY_SYS_assign_word: { PolyWord t = *sp++; POLYUNSIGNED u = UNTAGGED(*sp++); (*sp).AsStackAddr()[u] = t; *sp = Zero; break; } case POLY_SYS_lockseg: { PolyObject *obj = (*sp).AsObjPtr(); POLYUNSIGNED lengthW = obj->LengthWord(); /* Clear the mutable bit. */ obj->SetLengthWord(lengthW & ~_OBJ_MUTABLE_BIT); *sp = Zero; break; } case POLY_SYS_get_length: /* Return the length word. */ *sp = TAGGED((*sp).AsObjPtr()->Length()); break; case POLY_SYS_is_short: *sp = IS_INT(*sp) ? True : False; break; case POLY_SYS_io_operation: *sp = (PolyObject*)IoEntry((unsigned)UNTAGGED(*sp)); break; case POLY_SYS_exception_trace_fn: u = *sp; /* Function to call. */ *(--sp) = PolyWord::FromCodePtr(pc); /* Push a return address. */ *(--sp) = PolyWord::FromStackAddr(this->p_hr); /* Push old handler */ *(--sp) = SPECIAL_PC_TRACE_EX_FN; /* Marks exception trace. */ *(--sp) = Zero; /* Catch everything. */ this->p_hr = sp; /* Handler is here. */ pc = (SPECIAL_PC_TRACE_EX_RETURN).AsCodePtr(); /* Special return address. */ *(--sp) = Zero; /* Unit argument to the function. */ *(--sp) = u; /* Push the procedure. */ goto CALL_CLOSURE; case POLY_SYS_is_big_endian: { union { unsigned long wrd; char chrs[sizeof(unsigned long)]; } endian; endian.wrd = 1; *(--sp) = endian.chrs[0] == 0 ? True : False; break; } case POLY_SYS_bytes_per_word: *(--sp) = TAGGED(sizeof(PolyWord)); break; case POLY_SYS_raisex: goto RAISE_EXCEPTION; case POLY_SYS_aplus: { PolyWord x = sp[0]; PolyWord y = sp[1]; // If they're both short and no overflow. if (IS_INT(x) && IS_INT(y)) { POLYSIGNED t = UNTAGGED(x) + UNTAGGED(y); if (t <= MAXTAGGED && t >= -MAXTAGGED-1) { sp++; *sp = TAGGED(t); break; } else goto FullRTSCall; } else goto FullRTSCall; } case POLY_SYS_aminus: { PolyWord x = sp[0]; PolyWord y = sp[1]; // If they're both short and no overflow. if (IS_INT(x) && IS_INT(y)) { POLYSIGNED t = UNTAGGED(y) - UNTAGGED(x); if (t <= MAXTAGGED && t >= -MAXTAGGED-1) { sp++; *sp = TAGGED(t); break; } else goto FullRTSCall; } else goto FullRTSCall; } case POLY_SYS_equala: { PolyWord x = sp[0]; PolyWord y = sp[1]; // If either argument is short the values are only equal // if the words contain the same bit pattern. if (IS_INT(x) || IS_INT(y)) { sp++; *sp = y == x ? True : False; break; } else goto FullRTSCall; } case POLY_SYS_int_geq: { PolyWord x = sp[0]; PolyWord y = sp[1]; if (IS_INT(x) && IS_INT(y)) { sp++; *sp = UNTAGGED(y) >= UNTAGGED(x) ? True : False; break; } else goto FullRTSCall; } case POLY_SYS_int_leq: { PolyWord x = sp[0]; PolyWord y = sp[1]; if (IS_INT(x) && IS_INT(y)) { sp++; *sp = UNTAGGED(y) <= UNTAGGED(x) ? True : False; break; } else goto FullRTSCall; } case POLY_SYS_int_gtr: { PolyWord x = sp[0]; PolyWord y = sp[1]; if (IS_INT(x) && IS_INT(y)) { sp++; *sp = UNTAGGED(y) > UNTAGGED(x) ? True : False; break; } else goto FullRTSCall; } case POLY_SYS_int_lss: { PolyWord x = sp[0]; PolyWord y = sp[1]; if (IS_INT(x) && IS_INT(y)) { sp++; *sp = UNTAGGED(y) < UNTAGGED(x) ? True : False; break; } else goto FullRTSCall; } default: FullRTSCall: // For all the calls that aren't built in ... /* Save the state so that the instruction can be retried if necessary. */ this->p_pc = pc; /* Pc value after instruction. */ this->p_lastInstr = li; /* Previous instruction. */ this->p_sp = sp-1; /* Include the closure address. */ return (int)uu; } } /* End of system calls. */ else { sp--; *sp = sp[1]; /* Move closure up. */ sp[1] = PolyWord::FromCodePtr(pc); /* Save return address. */ pc = u.AsCodePtr(); /* Get entry point. */ } } break; case INSTR_return_w: returnCount = arg1; /* Get no. of args to remove. */ RETURN: /* Common code for return. */ { PolyWord result = *sp++; /* Result */ sp++; /* Remove the link/closure */ pc = (*sp++).AsCodePtr(); /* Return address */ sp += returnCount; /* Add on number of args. */ if (pc == (SPECIAL_PC_END_THREAD).AsCodePtr()) exitThread(this); // This thread is exiting. else if (pc == (SPECIAL_PC_TRACE_EX_RETURN).AsCodePtr()) { /* Return from a call to exception_trace when an exception has not been raised. */ sp += 1; this->p_hr = (sp[1]).AsStackAddr(); *sp = result; returnCount = 1; goto RETURN; } *(--sp) = result; /* Result */ } break; case INSTR_return_b: returnCount = *pc; goto RETURN; case INSTR_return_0: returnCount = 0; goto RETURN; case INSTR_return_1: returnCount = 1; goto RETURN; case INSTR_return_2: returnCount = 2; goto RETURN; case INSTR_return_3: returnCount = 3; goto RETURN; case INSTR_pad: /* No-op */ break; case INSTR_raise_ex: { RAISE_EXCEPTION: PolyException *exn = (PolyException*)((*sp).AsObjPtr()); this->p_exception_arg = exn; /* Get exception data */ this->p_sp = sp; /* Save this in case of trace. */ PolyWord *t = this->p_hr; /* First handler */ PolyWord *endStack = this->stack->top; // The legacy version pushes an identifier which is always zero. if (*t == Zero) t++; if (*t == SPECIAL_PC_TRACE_EX_FN) { // New exception trace *sp = PolyWord::FromCodePtr(pc); /* So that this function will be included. */ // exceptionToTraceException expects the new format of exception handling that is // used in the X86 code-generator. That does not push an exception id. this->p_hr = t; Handle marker = this->saveVec.mark(); try { exceptionToTraceException(this, this->saveVec.push(this->p_exception_arg)); } catch (IOException &) { } this->saveVec.reset(marker); // This will have reraised the exception by calling SetException goto RESTART; } else if (*t == SPECIAL_PC_END_THREAD) exitThread(this); // Default handler for thread. this->p_pc = (*t).AsCodePtr(); /* Now remove this handler. */ sp = t; while ((t = (*sp).AsStackAddr()) < sp || t > endStack) sp++; this->p_hr = t; /* Restore old handler */ sp++; /* Remove that entry. */ this->p_sp = sp; this->p_lastInstr = 256; /* Get the next instruction. */ goto RESTART; /* Restart in case pc is persistent (??? Still relevant????). */ } case INSTR_get_store_w: { storeWords = arg1+1; instrBytes = 2; // Number of bytes of arg of instruction GET_STORE: /* Common code for allocation. */ this->allocPointer -= storeWords; if (this->allocPointer < this->allocLimit) { this->allocPointer += storeWords; this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; goto RESTART; } pc += instrBytes; storeWords--; // Remove the length word from the count *this->allocPointer = PolyWord::FromUnsigned(storeWords | _OBJ_MUTABLE_BIT); /* Allocation must be mutable! */ PolyWord *t = this->allocPointer+1; for(; storeWords > 0; ) t[--storeWords] = PolyWord::FromUnsigned(0); /* Must initialise store! */ *(--sp) = PolyWord::FromStackAddr(t); break; } case INSTR_get_store_2: storeWords = 2+1; instrBytes = 0; goto GET_STORE; case INSTR_get_store_3: storeWords = 3+1; instrBytes = 0; goto GET_STORE; case INSTR_get_store_4: storeWords = 4+1; instrBytes = 0; goto GET_STORE; case INSTR_get_store_b: storeWords = *pc+1; instrBytes = 1; goto GET_STORE; case INSTR_tuple_w: { storeWords = arg1+1; instrBytes = 2; TUPLE: /* Common code for tupling. */ this->allocPointer -= storeWords; if (this->allocPointer < this->allocLimit) { this->allocPointer += storeWords; this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; goto RESTART; } pc += instrBytes; storeWords--; // Remove the length word from the count *this->allocPointer = PolyWord::FromUnsigned(storeWords); PolyWord *t = this->allocPointer+1; for(; storeWords > 0; ) t[--storeWords] = *sp++; *(--sp) = (PolyObject*)t; break; } case INSTR_tuple_2: storeWords = 2+1; instrBytes = 0; goto TUPLE; case INSTR_tuple_3: storeWords = 3+1; instrBytes = 0; goto TUPLE; case INSTR_tuple_4: storeWords = 4+1; instrBytes = 0; goto TUPLE; case INSTR_tuple_b: storeWords = *pc+1; instrBytes = 1; goto TUPLE; case INSTR_non_local: { PolyWord *t = sp+arg1; POLYSIGNED uu; for(uu = 1; uu <= arg2; uu++) t = (t[-1]).AsStackAddr(); uu = arg3; /* Can be negative. */ if (uu > 32767) uu -= 65536; *(--sp) = t[uu]; pc += 6; break; } case INSTR_local_w: { PolyWord u = sp[arg1]; *(--sp) = u; pc += 2; break; } case INSTR_indirect_w: *sp = (*sp).AsObjPtr()->Get(arg1); pc += 2; break; case INSTR_move_to_vec_w: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(arg1, u); pc += 2; break; } case INSTR_set_stack_val_w: { PolyWord u = *sp++; sp[arg1-1] = u; pc += 2; break; } case INSTR_reset_w: sp += arg1; pc += 2; break; case INSTR_reset_r_w: { PolyWord u = *sp; sp += arg1; *sp = u; pc += 2; break; } case INSTR_const_addr: *(--sp) = *(PolyWord*)(pc + arg1 + 2); pc += 2; break; case INSTR_const_addr_Xb: *(--sp) = (PolyWord::FromCodePtr(pc + (pc[0]+4)*sizeof(PolyWord) + pc[1] + pc[2]*256 + 3)).AsObjPtr()->Get(0); pc += 3; break; case INSTR_const_addr_Xw: *(--sp) = (PolyWord::FromCodePtr(pc + (arg1+4)*sizeof(PolyWord)+arg2 + 4)).AsObjPtr()->Get(0); pc += 4; break; case INSTR_const_int_w: *(--sp) = TAGGED(arg1); pc += 2; break; case INSTR_io_vec_entry: *(--sp) = (PolyObject*)IoEntry(*pc); pc += 1; break; case INSTR_const_nil: *(--sp) = Zero; break; case INSTR_jump_back: pc -= *pc + 1; break; case INSTR_jump_back16: pc -= arg1 + 1; break; case INSTR_lock: { PolyObject *obj = (*sp).AsObjPtr(); obj->SetLengthWord(obj->LengthWord() & ~_OBJ_MUTABLE_BIT); break; } case INSTR_ldexc: *(--sp) = this->p_exception_arg; break; case INSTR_local_b: { PolyWord u = sp[*pc]; *(--sp) = u; pc += 1; break; } case INSTR_indirect_b: *sp = (*sp).AsObjPtr()->Get(*pc); pc += 1; break; case INSTR_move_to_vec_b: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(*pc, u); pc += 1; break; } case INSTR_set_stack_val_b: { PolyWord u = *sp++; sp[*pc-1] = u; pc += 1; break; } case INSTR_reset_b: sp += *pc; pc += 1; break; case INSTR_reset_r_b: { PolyWord u = *sp; sp += *pc; *sp = u; pc += 1; break; } case INSTR_const_int_b: *(--sp) = TAGGED(*pc); pc += 1; break; case INSTR_local_0: { PolyWord u = sp[0]; *(--sp) = u; break; } case INSTR_local_1: { PolyWord u = sp[1]; *(--sp) = u; break; } case INSTR_local_2: { PolyWord u = sp[2]; *(--sp) = u; break; } case INSTR_local_3: { PolyWord u = sp[3]; *(--sp) = u; break; } case INSTR_local_4: { PolyWord u = sp[4]; *(--sp) = u; break; } case INSTR_local_5: { PolyWord u = sp[5]; *(--sp) = u; break; } case INSTR_local_6: { PolyWord u = sp[6]; *(--sp) = u; break; } case INSTR_local_7: { PolyWord u = sp[7]; *(--sp) = u; break; } case INSTR_local_8: { PolyWord u = sp[8]; *(--sp) = u; break; } case INSTR_local_9: { PolyWord u = sp[9]; *(--sp) = u; break; } case INSTR_local_10: { PolyWord u = sp[10]; *(--sp) = u; break; } case INSTR_local_11: { PolyWord u = sp[11]; *(--sp) = u; break; } case INSTR_indirect_0: if ((*sp) == PolyWord::FromStackAddr(IoEntry(55))) *sp = TAGGED(401); // We still seem to have some of the old AHL version number references. else *sp = (*sp).AsObjPtr()->Get(0); break; case INSTR_indirect_1: *sp = (*sp).AsObjPtr()->Get(1); break; case INSTR_indirect_2: *sp = (*sp).AsObjPtr()->Get(2); break; case INSTR_indirect_3: *sp = (*sp).AsObjPtr()->Get(3); break; case INSTR_indirect_4: *sp = (*sp).AsObjPtr()->Get(4); break; case INSTR_indirect_5: *sp = (*sp).AsObjPtr()->Get(5); break; case INSTR_const_0: *(--sp) = Zero; break; case INSTR_const_1: *(--sp) = TAGGED(1); break; case INSTR_const_2: *(--sp) = TAGGED(2); break; case INSTR_const_3: *(--sp) = TAGGED(3); break; case INSTR_const_4: *(--sp) = TAGGED(4); break; case INSTR_const_10: *(--sp) = TAGGED(10); break; /* move_to_vec only occurs to newly allocated store so there is no problem with persistent store faults. */ case INSTR_move_to_vec_0: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(0, u); break; } case INSTR_move_to_vec_1: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(1, u); break; } case INSTR_move_to_vec_2: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(2, u); break; } case INSTR_move_to_vec_3: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(3, u); break; } case INSTR_move_to_vec_4: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(4, u); break; } case INSTR_move_to_vec_5: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(5, u); break; } case INSTR_move_to_vec_6: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(6, u); break; } case INSTR_move_to_vec_7: { PolyWord u = *sp++; (*sp).AsObjPtr()->Set(7, u); break; } case INSTR_reset_r_1: { PolyWord u = *sp; sp += 1; *sp = u; break; } case INSTR_reset_r_2: { PolyWord u = *sp; sp += 2; *sp = u; break; } case INSTR_reset_r_3: { PolyWord u = *sp; sp += 3; *sp = u; break; } case INSTR_reset_1: sp += 1; break; case INSTR_reset_2: sp += 2; break; case INSTR_non_local_l_1: { POLYSIGNED uu = *pc; PolyWord u = (sp[uu >> 4]).AsStackAddr()[(uu & 0xf) - 6]; *(--sp) = u; pc += 1; break; } case INSTR_non_local_l_2: { POLYSIGNED uu = *pc; PolyWord *t = sp[uu >> 4].AsStackAddr() -1; *(--sp) = (*t).AsStackAddr()[(uu & 0xf) - 6]; pc += 1; break; } case INSTR_non_local_l_3: { POLYSIGNED uu = *pc; PolyWord *t = sp[uu >> 4].AsStackAddr() -1; t = (*t).AsStackAddr() - 1; *(--sp) = (*t).AsStackAddr()[(uu & 0xf) - 6]; pc += 1; break; } case INSTR_call_sl_c: /* Static link call */ { /* Get static link value. */ POLYSIGNED uu = pc[2]; PolyWord *t = sp + (uu >> 4) + 2; for(uu = uu & 0xf; uu > 0; uu--) t = t[-1].AsStackAddr(); PolyWord u = PolyWord::FromCodePtr(pc+arg1+2); /* Get entry point. */ *(--sp) = PolyWord::FromCodePtr(pc+3); /* Push return address to point after instruction. */ *(--sp) = PolyWord::FromStackAddr(t); /* Push static link */ pc = u.AsObjPtr()->Get(0).AsCodePtr(); break; } case INSTR_call_sl_cX: { /* Get static link value. */ POLYUNSIGNED uu = pc[3]; PolyWord *t = sp + (uu >> 4) + 2; for(uu = uu & 0xf; uu > 0; uu--) t = t[-1].AsStackAddr(); // This splits the offset into a number of words and a number of bytes // That's needed to try to make the code portable between 32 and 64 bit machines. PolyWord u = PolyWord::FromCodePtr(pc + (pc[0]+4)*sizeof(PolyWord) + pc[1] + pc[2]*256+3); /* Get entry point. */ *(--sp) = PolyWord::FromCodePtr(pc+4); /* Push return address to point after instruction. */ *(--sp) = PolyWord::FromStackAddr(t); /* Push static link */ pc = u.AsObjPtr()->Get(0).AsCodePtr(); break; } case INSTR_io_vec_233: *(--sp) = (PolyObject*)IoEntry(POLY_SYS_int_gtr); break; case INSTR_io_vec_236: *(--sp) = (PolyObject*)IoEntry(POLY_SYS_or_word); break; case INSTR_io_vec_251: *(--sp) = (PolyObject*)IoEntry(POLY_SYS_word_eq); break; case INSTR_io_vec_253: *(--sp) = (PolyObject*)IoEntry(POLY_SYS_load_word); break; case INSTR_io_vec_255: *(--sp) = (PolyObject*)IoEntry(POLY_SYS_assign_word); break; case INSTR_integer_equal: { PolyWord u = *sp++; *sp = (u == *sp)?True:False; break; } case INSTR_integer_leq: { POLYSIGNED uu = UNTAGGED(*sp++); *sp = (UNTAGGED(*sp) <= uu)?True:False; break; } case INSTR_integer_greater: { POLYSIGNED uu = UNTAGGED(*sp++); *sp = (UNTAGGED(*sp) > uu)?True:False; break; } case INSTR_boolean_or: { PolyWord u = *sp++; if (u == True) *sp = True; break; } case INSTR_word_equal: { PolyWord u = *sp++; if (u == *sp) *sp = True; else *sp = u == *sp ? True : False; break; } case INSTR_assign_word: { PolyWord u = *sp++; POLYUNSIGNED uu = UNTAGGED(*sp++); (*sp).AsObjPtr()->Set(uu, u); *sp = Zero; break; } case INSTR_container: /* Create a container. */ { /* This is supposed to be on the stack but that causes problems in gencde so we create a mutable segment on the heap. */ storeWords = arg1+1; this->allocPointer -= storeWords; if (this->allocPointer < this->allocLimit) { this->allocPointer += storeWords; this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; goto RESTART; } storeWords--; PolyObject *t = (PolyObject*)(this->allocPointer+1); t->SetLengthWord(storeWords, F_MUTABLE_BIT); for(; storeWords > 0; ) t->Set(--storeWords, Zero); *(--sp) = t; /* Push the address of the container. */ pc += 2; break; } case INSTR_set_container: /* Copy a tuple into a container. */ { PolyWord u = *sp++; /* Pop the source tuple address. */ for (POLYSIGNED uu = arg1; uu > 0; ) { uu--; (*sp).AsObjPtr()->Set(uu, u.AsObjPtr()->Get(uu)); /* Copy the items. */ } sp++; pc += 2; break; } case INSTR_tuple_container: /* Create a tuple from a container. */ { storeWords = arg1+1; this->allocPointer -= storeWords; if (this->allocPointer < this->allocLimit) { this->allocPointer += storeWords; this->p_sp = sp; this->p_pc = pc; this->p_lastInstr = li; goto RESTART; } storeWords--; PolyObject *t = (PolyObject *)(this->allocPointer+1); t->SetLengthWord(storeWords, 0); for(; storeWords > 0; ) { storeWords--; t->Set(storeWords, (*sp).AsObjPtr()->Get(storeWords)); } *sp = t; pc += 2; break; } default: Crash("Unknown instruction %x\n", li); } /* switch */ } /* for */ return 0; } /* MD_switch_to_poly */ void IntTaskData::GCStack(ScanAddress *process) { if (stack != 0) { StackSpace *stackSpace = stack; PolyWord *stackPtr = this->p_sp; // Save this BEFORE we update PolyWord *stackEnd = stackSpace->top; // Either this is TAGGED(0) indicating a retry or it's a code pointer. if (this->p_pc != TAGGED(0).AsCodePtr()) this->p_pc = process->ScanStackAddress (PolyWord::FromCodePtr(this->p_pc), stackSpace, true).AsCodePtr(); // Stack pointer and handler pointers this->p_sp = process->ScanStackAddress (PolyWord::FromStackAddr(this->p_sp), stackSpace, false).AsStackAddr(); this->p_hr = process->ScanStackAddress (PolyWord::FromStackAddr(this->p_hr), stackSpace, false).AsStackAddr(); // The exception arg if any this->p_exception_arg = process->ScanStackAddress(this->p_exception_arg, stackSpace, false); // Now the values on the stack. for (PolyWord *q = stackPtr; q < stackEnd; q++) *q = process->ScanStackAddress(*q, stackSpace, false); } } // Copy a stack void IntTaskData::CopyStackFrame(StackObject *old_stack, POLYUNSIGNED old_length, StackObject *new_stack, POLYUNSIGNED new_length) { /* Moves a stack, updating all references within the stack */ PolyWord *old_base = (PolyWord *)old_stack; PolyWord *new_base = (PolyWord*)new_stack; PolyWord *old_top = old_base + old_length; /* Calculate the offset of the new stack from the old. If the frame is being extended objects in the new frame will be further up the stack than in the old one. */ POLYSIGNED offset = new_base - old_base + new_length - old_length; PolyWord *oldSp = this->p_sp; this->p_sp = oldSp + offset; this->p_hr = this->p_hr + offset; /* Skip the unused part of the stack. */ POLYUNSIGNED i = oldSp - old_base; ASSERT (i <= old_length); i = old_length - i; PolyWord *old = oldSp; PolyWord *newp= this->p_sp; while (i--) { // ASSERT(old >= old_base && old < old_base+old_length); // ASSERT(newp >= new_base && newp < new_base+new_length); PolyWord old_word = *old++; if (old_word.IsTagged() || old_word.AsStackAddr() < old_base || old_word.AsStackAddr() >= old_top) *newp++ = old_word; else *newp++ = PolyWord::FromStackAddr(old_word.AsStackAddr() + offset); } ASSERT(old == ((PolyWord*)old_stack)+old_length); ASSERT(newp == ((PolyWord*)new_stack)+new_length); } static void CallIO0(IntTaskData *taskData, Handle(*ioFun)(TaskData *)) { Handle result = (*ioFun)(taskData); *(taskData->p_sp) = result->Word(); taskData->p_lastInstr = 256; /* Take next instruction. */ } static void CallIO1(IntTaskData *taskData, Handle(*ioFun)(TaskData *, Handle)) { Handle funarg = taskData->saveVec.push(taskData->p_sp[1]); Handle result = (*ioFun)(taskData, funarg); *(++taskData->p_sp) = result->Word(); taskData->p_lastInstr = 256; /* Take next instruction. */ } static void CallIO2(IntTaskData *taskData, Handle(*ioFun)(TaskData *, Handle, Handle)) { Handle funarg1 = taskData->saveVec.push(taskData->p_sp[1]); Handle funarg2 = taskData->saveVec.push(taskData->p_sp[2]); Handle result = (*ioFun)(taskData, funarg1, funarg2); taskData->p_sp += 2; *(taskData->p_sp) = DEREFWORD(result); taskData->p_lastInstr = 256; /* Take next instruction. */ } static void CallIO3(IntTaskData *taskData, Handle(*ioFun)(TaskData *, Handle, Handle, Handle)) { Handle funarg1 = taskData->saveVec.push(taskData->p_sp[1]); Handle funarg2 = taskData->saveVec.push(taskData->p_sp[2]); Handle funarg3 = taskData->saveVec.push(taskData->p_sp[3]); Handle result = (*ioFun)(taskData, funarg1, funarg2, funarg3); taskData->p_sp += 3; *(taskData->p_sp) = DEREFWORD(result); taskData->p_lastInstr = 256; /* Take next instruction. */ } static void CallIO4(IntTaskData *taskData, Handle(*ioFun)(TaskData *, Handle, Handle, Handle, Handle)) { Handle funarg1 = taskData->saveVec.push(taskData->p_sp[1]); Handle funarg2 = taskData->saveVec.push(taskData->p_sp[2]); Handle funarg3 = taskData->saveVec.push(taskData->p_sp[3]); Handle funarg4 = taskData->saveVec.push(taskData->p_sp[4]); Handle result = (*ioFun)(taskData, funarg1, funarg2, funarg3, funarg4); taskData->p_sp += 4; *(taskData->p_sp) = DEREFWORD(result); taskData->p_lastInstr = 256; } static void CallIO5(IntTaskData *taskData, Handle(*ioFun)(TaskData *, Handle, Handle, Handle, Handle, Handle)) { Handle funarg1 = taskData->saveVec.push(taskData->p_sp[1]); Handle funarg2 = taskData->saveVec.push(taskData->p_sp[2]); Handle funarg3 = taskData->saveVec.push(taskData->p_sp[3]); Handle funarg4 = taskData->saveVec.push(taskData->p_sp[4]); Handle funarg5 = taskData->saveVec.push(taskData->p_sp[5]); Handle result = (*ioFun)(taskData, funarg1, funarg2, funarg3, funarg4, funarg5); taskData->p_sp += 5; *(taskData->p_sp) = DEREFWORD(result); taskData->p_lastInstr = 256; /* Take next instruction. */ } Handle IntTaskData::EnterPolyCode() /* Called from "main" to enter the code. */ { Handle hOriginal = this->saveVec.mark(); // Set this up for the IO calls. while (1) { this->saveVec.reset(hOriginal); // Remove old RTS arguments and results. // Run the ML code and return with the function to call. this->inML = true; int ioFunction = SwitchToPoly(); this->inML = false; if ((debugOptions & DEBUG_RTSCALLS)) IncrementRTSCallCount(ioFunction); try { switch (ioFunction) { case -1: // We've been interrupted. This usually involves simulating a // stack overflow so we could come here because of a genuine // stack overflow. // Previously this code was executed on every RTS call but there // were problems on Mac OS X at least with contention on schedLock. this->pendingInterrupt = false; // Clear this before we handle these // Process any asynchronous events i.e. interrupts or kill processes->ProcessAsynchRequests(this); // Release and re-acquire use of the ML memory to allow another thread // to GC. processes->ThreadReleaseMLMemory(this); processes->ThreadUseMLMemory(this); break; case -2: // A callback has returned. ASSERT(0); // Callbacks aren't implemented case POLY_SYS_exit: CallIO1(this, &finishc); break; case POLY_SYS_alloc_store: CallIO3(this, &alloc_store_long_c); break; case POLY_SYS_alloc_uninit: CallIO2(this, &alloc_uninit_c); break; case POLY_SYS_chdir: CallIO1(this, &change_dirc); break; case POLY_SYS_get_flags: CallIO1(this, &get_flags_c); break; case POLY_SYS_str_compare: CallIO2(this, compareStrings); break; case POLY_SYS_teststrgtr: CallIO2(this, &testStringGreater); break; case POLY_SYS_teststrlss: CallIO2(this, &testStringLess); break; case POLY_SYS_teststrgeq: CallIO2(this, &testStringGreaterOrEqual); break; case POLY_SYS_teststrleq: CallIO2(this, &testStringLessOrEqual); break; case POLY_SYS_profiler: CallIO1(this, &profilerc); break; case POLY_SYS_quotrem: CallIO3(this, "_rem_c); break; case POLY_SYS_aplus: CallIO2(this, &add_longc); break; case POLY_SYS_aminus: CallIO2(this, &sub_longc); break; case POLY_SYS_amul: CallIO2(this, &mult_longc); break; case POLY_SYS_adiv: CallIO2(this, &div_longc); break; case POLY_SYS_amod: CallIO2(this, &rem_longc); break; case POLY_SYS_aneg: CallIO1(this, &neg_longc); break; case POLY_SYS_equala: CallIO2(this, &equal_longc); break; case POLY_SYS_ora: CallIO2(this, &or_longc); break; case POLY_SYS_anda: CallIO2(this, &and_longc); break; case POLY_SYS_xora: CallIO2(this, &xor_longc); break; case POLY_SYS_Real_str: CallIO3(this, &Real_strc); break; case POLY_SYS_Real_geq: CallIO2(this, &Real_geqc); break; case POLY_SYS_Real_leq: CallIO2(this, &Real_leqc); break; case POLY_SYS_Real_gtr: CallIO2(this, &Real_gtrc); break; case POLY_SYS_Real_lss: CallIO2(this, &Real_lssc); break; case POLY_SYS_Real_eq: CallIO2(this, &Real_eqc); break; case POLY_SYS_Real_neq: CallIO2(this, &Real_neqc); break; case POLY_SYS_Real_Dispatch: CallIO2(this, &Real_dispatchc); break; case POLY_SYS_Add_real: CallIO2(this, &Real_addc); break; case POLY_SYS_Sub_real: CallIO2(this, &Real_subc); break; case POLY_SYS_Mul_real: CallIO2(this, &Real_mulc); break; case POLY_SYS_Div_real: CallIO2(this, &Real_divc); break; case POLY_SYS_Abs_real: CallIO1(this, &Real_absc); break; case POLY_SYS_Neg_real: CallIO1(this, &Real_negc); break; case POLY_SYS_conv_real: CallIO1(this, &Real_convc); break; case POLY_SYS_real_to_int: CallIO1(this, &Real_intc); break; case POLY_SYS_int_to_real: CallIO1(this, &Real_floatc); break; case POLY_SYS_sqrt_real: CallIO1(this, &Real_sqrtc); break; case POLY_SYS_sin_real: CallIO1(this, &Real_sinc); break; case POLY_SYS_cos_real: CallIO1(this, &Real_cosc); break; case POLY_SYS_arctan_real: CallIO1(this, &Real_arctanc); break; case POLY_SYS_exp_real: CallIO1(this, &Real_expc); break; case POLY_SYS_ln_real: CallIO1(this, &Real_lnc); break; case POLY_SYS_atomic_reset: CallIO1(this, &ProcessAtomicReset); break; case POLY_SYS_atomic_incr: CallIO1(this, &ProcessAtomicIncrement); break; case POLY_SYS_atomic_decr: CallIO1(this, &ProcessAtomicDecrement); break; case POLY_SYS_thread_self: CallIO0(this, &ThreadSelf); break; case POLY_SYS_thread_dispatch: CallIO2(this, &ThreadDispatch); break; case POLY_SYS_int_geq: CallIO2(this, &ge_longc); break; case POLY_SYS_int_leq: CallIO2(this, &le_longc); break; case POLY_SYS_int_gtr: CallIO2(this, >_longc); break; case POLY_SYS_int_lss: CallIO2(this, &ls_longc); break; // ObjSize and ShowSize are now in the poly_specific functions and // probably should be removed from here. case POLY_SYS_objsize: CallIO1(this, &ObjSize); break; case POLY_SYS_showsize: CallIO1(this, &ShowSize); break; case POLY_SYS_timing_dispatch: CallIO2(this, &timing_dispatch_c); break; case POLY_SYS_XWindows: CallIO1(this, &XWindows_c); break; case POLY_SYS_full_gc: CallIO0(this, &full_gc_c); break; case POLY_SYS_stack_trace: CallIO0(this, & stack_trace_c); break; case POLY_SYS_foreign_dispatch: CallIO2(this, &foreign_dispatch_c); break; case POLY_SYS_ffi: CallIO2(this, &poly_ffi); break; case POLY_SYS_process_env: CallIO2(this, &process_env_dispatch_c); break; case POLY_SYS_shrink_stack: CallIO1(this, &shrink_stack_c); break; case POLY_SYS_code_flags: CallIO2(this, &CodeSegmentFlags); break; case POLY_SYS_get_first_long_word: case POLY_SYS_int_to_word: // POLY_SYS_int_to_word has generally been replaced by POLY_SYS_get_first_long_word. // The reason is that POLY_SYS_int_to_word may be applied to either a long or // a short argument whereas POLY_SYS_get_first_long_word must be applied to a // long argument and can be implemented very easily in the code-generator, at // least on a little-endian machine. CallIO1(this, &int_to_word_c); break; case POLY_SYS_poly_specific: CallIO2(this, &poly_dispatch_c); break; case POLY_SYS_bytevec_eq: CallIO5(this, &testBytesEqual); break; case POLY_SYS_cmem_load_8: CallIO3(this, &cmem_load_8); break; case POLY_SYS_cmem_load_16: CallIO3(this, &cmem_load_16); break; case POLY_SYS_cmem_load_32: CallIO3(this, &cmem_load_32); break; case POLY_SYS_cmem_load_float: CallIO3(this, &cmem_load_float); break; case POLY_SYS_cmem_load_double: CallIO3(this, &cmem_load_double); break; case POLY_SYS_cmem_store_8: CallIO4(this, &cmem_store_8); break; case POLY_SYS_cmem_store_16: CallIO4(this, &cmem_store_16); break; case POLY_SYS_cmem_store_32: CallIO4(this, &cmem_store_32); break; #if (SIZEOF_VOIDP == 8) case POLY_SYS_cmem_load_64: CallIO3(this, &cmem_load_64); break; case POLY_SYS_cmem_store_64: CallIO4(this, &cmem_store_64); break; #endif case POLY_SYS_cmem_store_float: CallIO4(this, &cmem_store_float); break; case POLY_SYS_cmem_store_double: CallIO4(this, &cmem_store_double); break; // case POLY_SYS_set_code_constant: // Not used in the interpreter // CallIO4(this, &set_code_constant); // break; case POLY_SYS_move_bytes: case POLY_SYS_move_bytes_overlap: CallIO5(this, &move_bytes_long_c); break; case POLY_SYS_move_words: case POLY_SYS_move_words_overlap: CallIO5(this, &move_words_long_c); break; case POLY_SYS_io_dispatch: CallIO3(this, &IO_dispatch_c); break; case POLY_SYS_network: CallIO2(this, &Net_dispatch_c); break; case POLY_SYS_os_specific: CallIO2(this, &OS_spec_dispatch_c); break; case POLY_SYS_signal_handler: CallIO2(this, &Sig_dispatch_c); break; case POLY_SYS_kill_self: CallIO0(this, exitThread); break; case POLY_SYS_eq_longword: CallIO2(this, &eqLongWord); break; case POLY_SYS_neq_longword: CallIO2(this, &neqLongWord); break; case POLY_SYS_geq_longword: CallIO2(this, &geqLongWord); break; case POLY_SYS_leq_longword: CallIO2(this, &leqLongWord); break; case POLY_SYS_gt_longword: CallIO2(this, >LongWord); break; case POLY_SYS_lt_longword: CallIO2(this, <LongWord); break; case POLY_SYS_plus_longword: CallIO2(this, &plusLongWord); break; case POLY_SYS_minus_longword: CallIO2(this, &minusLongWord); break; case POLY_SYS_mul_longword: CallIO2(this, &mulLongWord); break; case POLY_SYS_div_longword: CallIO2(this, &divLongWord); break; case POLY_SYS_mod_longword: CallIO2(this, &modLongWord); break; case POLY_SYS_andb_longword: CallIO2(this, &andbLongWord); break; case POLY_SYS_orb_longword: CallIO2(this, &orbLongWord); break; case POLY_SYS_xorb_longword: CallIO2(this, &xorbLongWord); break; case POLY_SYS_shift_left_longword: CallIO2(this, &shiftLeftLongWord); break; case POLY_SYS_shift_right_longword: CallIO2(this, &shiftRightLongWord); break; case POLY_SYS_shift_right_arith_longword: CallIO2(this, &shiftRightArithLongWord); break; case POLY_SYS_longword_to_tagged: CallIO1(this, &longWordToTagged); break; case POLY_SYS_signed_to_longword: CallIO1(this, &signedToLongWord); break; case POLY_SYS_unsigned_to_longword: CallIO1(this, &unsignedToLongWord); break; case POLY_SYS_give_ex_trace_fn: CallIO1(this, exceptionToTraceException); break; default: Crash("Unknown io operation %d\n", ioFunction); } } catch (IOException &) { } } } void Interpreter::InitInterfaceVector(void) { add_word_to_io_area(POLY_SYS_exit, TAGGED(POLY_SYS_exit)); add_word_to_io_area(POLY_SYS_chdir, TAGGED(POLY_SYS_chdir)); add_word_to_io_area(POLY_SYS_alloc_store, TAGGED(POLY_SYS_alloc_store)); add_word_to_io_area(POLY_SYS_alloc_uninit, TAGGED(POLY_SYS_alloc_uninit)); add_word_to_io_area(POLY_SYS_raisex, TAGGED(POLY_SYS_raisex)); add_word_to_io_area(POLY_SYS_get_length, TAGGED(POLY_SYS_get_length)); add_word_to_io_area(POLY_SYS_get_flags, TAGGED(POLY_SYS_get_flags)); add_word_to_io_area(POLY_SYS_str_compare, TAGGED(POLY_SYS_str_compare)); add_word_to_io_area(POLY_SYS_teststrgtr, TAGGED(POLY_SYS_teststrgtr)); add_word_to_io_area(POLY_SYS_teststrlss, TAGGED(POLY_SYS_teststrlss)); add_word_to_io_area(POLY_SYS_teststrgeq, TAGGED(POLY_SYS_teststrgeq)); add_word_to_io_area(POLY_SYS_teststrleq, TAGGED(POLY_SYS_teststrleq)); add_word_to_io_area(POLY_SYS_exception_trace_fn, TAGGED(POLY_SYS_exception_trace_fn)); add_word_to_io_area(POLY_SYS_lockseg, TAGGED(POLY_SYS_lockseg)); add_word_to_io_area(POLY_SYS_network, TAGGED(POLY_SYS_network)); add_word_to_io_area(POLY_SYS_os_specific, TAGGED(POLY_SYS_os_specific)); add_word_to_io_area(POLY_SYS_eq_longword, TAGGED(POLY_SYS_eq_longword)); add_word_to_io_area(POLY_SYS_neq_longword, TAGGED(POLY_SYS_neq_longword)); add_word_to_io_area(POLY_SYS_geq_longword, TAGGED(POLY_SYS_geq_longword)); add_word_to_io_area(POLY_SYS_leq_longword, TAGGED(POLY_SYS_leq_longword)); add_word_to_io_area(POLY_SYS_gt_longword, TAGGED(POLY_SYS_gt_longword)); add_word_to_io_area(POLY_SYS_lt_longword, TAGGED(POLY_SYS_lt_longword)); add_word_to_io_area(POLY_SYS_io_dispatch, TAGGED(POLY_SYS_io_dispatch)); add_word_to_io_area(POLY_SYS_signal_handler, TAGGED(POLY_SYS_signal_handler)); add_word_to_io_area(POLY_SYS_atomic_reset, TAGGED(POLY_SYS_atomic_reset)); add_word_to_io_area(POLY_SYS_atomic_incr, TAGGED(POLY_SYS_atomic_incr)); add_word_to_io_area(POLY_SYS_atomic_decr, TAGGED(POLY_SYS_atomic_decr)); add_word_to_io_area(POLY_SYS_thread_self, TAGGED(POLY_SYS_thread_self)); add_word_to_io_area(POLY_SYS_thread_dispatch, TAGGED(POLY_SYS_thread_dispatch)); add_word_to_io_area(POLY_SYS_plus_longword, TAGGED(POLY_SYS_plus_longword)); add_word_to_io_area(POLY_SYS_minus_longword, TAGGED(POLY_SYS_minus_longword)); add_word_to_io_area(POLY_SYS_mul_longword, TAGGED(POLY_SYS_mul_longword)); add_word_to_io_area(POLY_SYS_div_longword, TAGGED(POLY_SYS_div_longword)); add_word_to_io_area(POLY_SYS_mod_longword, TAGGED(POLY_SYS_mod_longword)); add_word_to_io_area(POLY_SYS_andb_longword, TAGGED(POLY_SYS_andb_longword)); add_word_to_io_area(POLY_SYS_orb_longword, TAGGED(POLY_SYS_orb_longword)); add_word_to_io_area(POLY_SYS_xorb_longword, TAGGED(POLY_SYS_xorb_longword)); add_word_to_io_area(POLY_SYS_kill_self, TAGGED(POLY_SYS_kill_self)); add_word_to_io_area(POLY_SYS_shift_left_longword, TAGGED(POLY_SYS_shift_left_longword)); add_word_to_io_area(POLY_SYS_shift_right_longword, TAGGED(POLY_SYS_shift_right_longword)); add_word_to_io_area(POLY_SYS_shift_right_arith_longword, TAGGED(POLY_SYS_shift_right_arith_longword)); add_word_to_io_area(POLY_SYS_profiler, TAGGED(POLY_SYS_profiler)); add_word_to_io_area(POLY_SYS_longword_to_tagged, TAGGED(POLY_SYS_longword_to_tagged)); add_word_to_io_area(POLY_SYS_signed_to_longword, TAGGED(POLY_SYS_signed_to_longword)); add_word_to_io_area(POLY_SYS_unsigned_to_longword, TAGGED(POLY_SYS_unsigned_to_longword)); add_word_to_io_area(POLY_SYS_full_gc, TAGGED(POLY_SYS_full_gc)); add_word_to_io_area(POLY_SYS_stack_trace, TAGGED(POLY_SYS_stack_trace)); add_word_to_io_area(POLY_SYS_timing_dispatch, TAGGED(POLY_SYS_timing_dispatch)); add_word_to_io_area(POLY_SYS_objsize, TAGGED(POLY_SYS_objsize)); add_word_to_io_area(POLY_SYS_showsize, TAGGED(POLY_SYS_showsize)); add_word_to_io_area(POLY_SYS_quotrem, TAGGED(POLY_SYS_quotrem)); add_word_to_io_area(POLY_SYS_is_short, TAGGED(POLY_SYS_is_short)); add_word_to_io_area(POLY_SYS_aplus, TAGGED(POLY_SYS_aplus)); add_word_to_io_area(POLY_SYS_aminus, TAGGED(POLY_SYS_aminus)); add_word_to_io_area(POLY_SYS_amul, TAGGED(POLY_SYS_amul)); add_word_to_io_area(POLY_SYS_adiv, TAGGED(POLY_SYS_adiv)); add_word_to_io_area(POLY_SYS_amod, TAGGED(POLY_SYS_amod)); add_word_to_io_area(POLY_SYS_aneg, TAGGED(POLY_SYS_aneg)); add_word_to_io_area(POLY_SYS_xora, TAGGED(POLY_SYS_xora)); add_word_to_io_area(POLY_SYS_equala, TAGGED(POLY_SYS_equala)); add_word_to_io_area(POLY_SYS_ora, TAGGED(POLY_SYS_ora)); add_word_to_io_area(POLY_SYS_anda, TAGGED(POLY_SYS_anda)); add_word_to_io_area(POLY_SYS_Real_str, TAGGED(POLY_SYS_Real_str)); add_word_to_io_area(POLY_SYS_Real_geq, TAGGED(POLY_SYS_Real_geq)); add_word_to_io_area(POLY_SYS_Real_leq, TAGGED(POLY_SYS_Real_leq)); add_word_to_io_area(POLY_SYS_Real_gtr, TAGGED(POLY_SYS_Real_gtr)); add_word_to_io_area(POLY_SYS_Real_lss, TAGGED(POLY_SYS_Real_lss)); add_word_to_io_area(POLY_SYS_Real_eq, TAGGED(POLY_SYS_Real_eq)); add_word_to_io_area(POLY_SYS_Real_neq, TAGGED(POLY_SYS_Real_neq)); add_word_to_io_area(POLY_SYS_Real_Dispatch, TAGGED(POLY_SYS_Real_Dispatch)); add_word_to_io_area(POLY_SYS_Add_real, TAGGED(POLY_SYS_Add_real)); add_word_to_io_area(POLY_SYS_Sub_real, TAGGED(POLY_SYS_Sub_real)); add_word_to_io_area(POLY_SYS_Mul_real, TAGGED(POLY_SYS_Mul_real)); add_word_to_io_area(POLY_SYS_Div_real, TAGGED(POLY_SYS_Div_real)); add_word_to_io_area(POLY_SYS_Abs_real, TAGGED(POLY_SYS_Abs_real)); add_word_to_io_area(POLY_SYS_Neg_real, TAGGED(POLY_SYS_Neg_real)); add_word_to_io_area(POLY_SYS_conv_real, TAGGED(POLY_SYS_conv_real)); add_word_to_io_area(POLY_SYS_real_to_int, TAGGED(POLY_SYS_real_to_int)); add_word_to_io_area(POLY_SYS_int_to_real, TAGGED(POLY_SYS_int_to_real)); add_word_to_io_area(POLY_SYS_sqrt_real, TAGGED(POLY_SYS_sqrt_real)); add_word_to_io_area(POLY_SYS_sin_real, TAGGED(POLY_SYS_sin_real)); add_word_to_io_area(POLY_SYS_cos_real, TAGGED(POLY_SYS_cos_real)); add_word_to_io_area(POLY_SYS_arctan_real, TAGGED(POLY_SYS_arctan_real)); add_word_to_io_area(POLY_SYS_exp_real, TAGGED(POLY_SYS_exp_real)); add_word_to_io_area(POLY_SYS_ln_real, TAGGED(POLY_SYS_ln_real)); add_word_to_io_area(POLY_SYS_process_env, TAGGED(POLY_SYS_process_env)); add_word_to_io_area(POLY_SYS_set_string_length, TAGGED(POLY_SYS_set_string_length)); add_word_to_io_area(POLY_SYS_get_first_long_word, TAGGED(POLY_SYS_get_first_long_word)); add_word_to_io_area(POLY_SYS_poly_specific, TAGGED(POLY_SYS_poly_specific)); add_word_to_io_area(POLY_SYS_bytevec_eq, TAGGED(POLY_SYS_bytevec_eq)); add_word_to_io_area(POLY_SYS_cmem_load_8, TAGGED(POLY_SYS_cmem_load_8)); add_word_to_io_area(POLY_SYS_cmem_load_16, TAGGED(POLY_SYS_cmem_load_16)); add_word_to_io_area(POLY_SYS_cmem_load_32, TAGGED(POLY_SYS_cmem_load_32)); add_word_to_io_area(POLY_SYS_cmem_load_64, TAGGED(POLY_SYS_cmem_load_64)); add_word_to_io_area(POLY_SYS_cmem_load_float, TAGGED(POLY_SYS_cmem_load_float)); add_word_to_io_area(POLY_SYS_cmem_load_double, TAGGED(POLY_SYS_cmem_load_double)); add_word_to_io_area(POLY_SYS_cmem_store_8, TAGGED(POLY_SYS_cmem_store_8)); add_word_to_io_area(POLY_SYS_cmem_store_16, TAGGED(POLY_SYS_cmem_store_16)); add_word_to_io_area(POLY_SYS_cmem_store_32, TAGGED(POLY_SYS_cmem_store_32)); add_word_to_io_area(POLY_SYS_cmem_store_64, TAGGED(POLY_SYS_cmem_store_64)); add_word_to_io_area(POLY_SYS_cmem_store_float, TAGGED(POLY_SYS_cmem_store_float)); add_word_to_io_area(POLY_SYS_cmem_store_double, TAGGED(POLY_SYS_cmem_store_double)); add_word_to_io_area(POLY_SYS_io_operation, TAGGED(POLY_SYS_io_operation)); add_word_to_io_area(POLY_SYS_ffi, TAGGED(POLY_SYS_ffi)); add_word_to_io_area(POLY_SYS_move_words_overlap, TAGGED(POLY_SYS_move_words_overlap)); add_word_to_io_area(POLY_SYS_set_code_constant, TAGGED(POLY_SYS_set_code_constant)); add_word_to_io_area(POLY_SYS_move_words, TAGGED(POLY_SYS_move_words)); add_word_to_io_area(POLY_SYS_shift_right_arith_word, TAGGED(POLY_SYS_shift_right_arith_word)); add_word_to_io_area(POLY_SYS_int_to_word, TAGGED(POLY_SYS_int_to_word)); add_word_to_io_area(POLY_SYS_move_bytes, TAGGED(POLY_SYS_move_bytes)); add_word_to_io_area(POLY_SYS_move_bytes_overlap, TAGGED(POLY_SYS_move_bytes_overlap)); add_word_to_io_area(POLY_SYS_code_flags, TAGGED(POLY_SYS_code_flags)); add_word_to_io_area(POLY_SYS_shrink_stack, TAGGED(POLY_SYS_shrink_stack)); add_word_to_io_area(POLY_SYS_callcode_tupled, TAGGED(POLY_SYS_callcode_tupled)); add_word_to_io_area(POLY_SYS_foreign_dispatch, TAGGED(POLY_SYS_foreign_dispatch)); add_word_to_io_area(POLY_SYS_XWindows, TAGGED(POLY_SYS_XWindows)); add_word_to_io_area(POLY_SYS_is_big_endian, TAGGED(POLY_SYS_is_big_endian)); add_word_to_io_area(POLY_SYS_bytes_per_word, TAGGED(POLY_SYS_bytes_per_word)); add_word_to_io_area(POLY_SYS_offset_address, TAGGED(POLY_SYS_offset_address)); add_word_to_io_area(POLY_SYS_shift_right_word, TAGGED(POLY_SYS_shift_right_word)); add_word_to_io_area(POLY_SYS_word_neq, TAGGED(POLY_SYS_word_neq)); add_word_to_io_area(POLY_SYS_not_bool, TAGGED(POLY_SYS_not_bool)); add_word_to_io_area(POLY_SYS_string_length, TAGGED(POLY_SYS_string_length)); add_word_to_io_area(POLY_SYS_touch_final, TAGGED(POLY_SYS_touch_final)); add_word_to_io_area(POLY_SYS_int_geq, TAGGED(POLY_SYS_int_geq)); add_word_to_io_area(POLY_SYS_int_leq, TAGGED(POLY_SYS_int_leq)); add_word_to_io_area(POLY_SYS_int_gtr, TAGGED(POLY_SYS_int_gtr)); add_word_to_io_area(POLY_SYS_int_lss, TAGGED(POLY_SYS_int_lss)); add_word_to_io_area(POLY_SYS_load_byte_immut, TAGGED(POLY_SYS_load_byte_immut)); add_word_to_io_area(POLY_SYS_load_word_immut, TAGGED(POLY_SYS_load_word_immut)); add_word_to_io_area(POLY_SYS_mul_word, TAGGED(POLY_SYS_mul_word)); add_word_to_io_area(POLY_SYS_plus_word, TAGGED(POLY_SYS_plus_word)); add_word_to_io_area(POLY_SYS_minus_word, TAGGED(POLY_SYS_minus_word)); add_word_to_io_area(POLY_SYS_div_word, TAGGED(POLY_SYS_div_word)); add_word_to_io_area(POLY_SYS_or_word, TAGGED(POLY_SYS_or_word)); add_word_to_io_area(POLY_SYS_and_word, TAGGED(POLY_SYS_and_word)); add_word_to_io_area(POLY_SYS_xor_word, TAGGED(POLY_SYS_xor_word)); add_word_to_io_area(POLY_SYS_shift_left_word, TAGGED(POLY_SYS_shift_left_word)); add_word_to_io_area(POLY_SYS_mod_word, TAGGED(POLY_SYS_mod_word)); add_word_to_io_area(POLY_SYS_word_geq, TAGGED(POLY_SYS_word_geq)); add_word_to_io_area(POLY_SYS_word_leq, TAGGED(POLY_SYS_word_leq)); add_word_to_io_area(POLY_SYS_word_gtr, TAGGED(POLY_SYS_word_gtr)); add_word_to_io_area(POLY_SYS_word_lss, TAGGED(POLY_SYS_word_lss)); add_word_to_io_area(POLY_SYS_word_eq, TAGGED(POLY_SYS_word_eq)); add_word_to_io_area(POLY_SYS_load_byte, TAGGED(POLY_SYS_load_byte)); add_word_to_io_area(POLY_SYS_load_word, TAGGED(POLY_SYS_load_word)); add_word_to_io_area(POLY_SYS_assign_byte, TAGGED(POLY_SYS_assign_byte)); add_word_to_io_area(POLY_SYS_assign_word, TAGGED(POLY_SYS_assign_word)); } // As far as possible we want locking and unlocking an ML mutex to be fast so // we try to implement the code in the assembly code using appropriate // interlocked instructions. That does mean that if we need to lock and // unlock an ML mutex in this code we have to use the same, machine-dependent, // code to do it. These are defaults that are used where there is no // machine-specific code. // Increment the value contained in the first word of the mutex. // On most platforms this code will be done with a piece of assembly code. static PLock mutexLock; Handle IntTaskData::AtomicIncrement(Handle mutexp) { PLocker l(&mutexLock); PolyObject *p = DEREFHANDLE(mutexp); // A thread can only call this once so the values will be short PolyWord newValue = TAGGED(UNTAGGED(p->Get(0))+1); p->Set(0, newValue); return this->saveVec.push(newValue); } // Decrement the value contained in the first word of the mutex. Handle IntTaskData::AtomicDecrement(Handle mutexp) { PLocker l(&mutexLock); PolyObject *p = DEREFHANDLE(mutexp); PolyWord newValue = TAGGED(UNTAGGED(p->Get(0))-1); p->Set(0, newValue); return this->saveVec.push(newValue); } // Release a mutex. We need to lock the mutex to ensure we don't // reset it in the time between one of atomic operations reading // and writing the mutex. void IntTaskData::AtomicReset(Handle mutexp) { PLocker l(&mutexLock); DEREFHANDLE(mutexp)->Set(0, TAGGED(1)); // Set this to released. } static Interpreter interpreterObject; MachineDependent *machineDependent = &interpreterObject; polyml-5.6/libpolyml/io_internal.h000066400000000000000000000102441265146633400173720ustar00rootroot00000000000000/* Title: Data structures shared between basioio.c and network.c. Copyright (c) 2000 David C. J. Matthews Portions of this code are derived from the original stream io package copyright CUTS 1983-2000. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef IO_INTERNAL_H #define IO_INTERNAL_H #define IO_BIT_OPEN 1 #define IO_BIT_READ 2 #define IO_BIT_WRITE 4 #define IO_BIT_DIR 8 /* Is it a directory entry? */ #define IO_BIT_SOCKET 16 /* Is it a socket? */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) #define IO_BIT_PIPE 128 #define IO_BIT_DEV 256 #define IO_BIT_GUI_CONSOLE 512 #include #else typedef int SOCKET; //#include #endif #ifdef HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif typedef struct basic_io_struct { PolyObject *token; /* pointer into ML heap */ int ioBits; /* Flag bits */ union { int ioDesc; /* File descriptor. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) struct { HANDLE hFind; /* FindFirstFile handle */ WIN32_FIND_DATA lastFind; int fFindSucceeded; } directory; SOCKET sock; #else #define sock ioDesc DIR *ioDir; /* Directory entry. */ #endif } device; #if (defined(_WIN32) && ! defined(__CYGWIN__)) HANDLE hAvailable; // Used to signal available data #endif } IOSTRUCT, *PIOSTRUCT; class TaskData; #define isOpen(s) ((s)->ioBits & IO_BIT_OPEN) #define isRead(s) ((s)->ioBits & IO_BIT_READ) #define isWrite(s) ((s)->ioBits & IO_BIT_WRITE) #define isDirectory(s) ((s)->ioBits & IO_BIT_DIR) #define isSocket(s) ((s)->ioBits & IO_BIT_SOCKET) #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Needed because testing for available input is different depending on the device. // Console here means our Windows GUI. #define isPipe(s) ((s)->ioBits & IO_BIT_PIPE) #define isDevice(s) ((s)->ioBits & IO_BIT_DEV) #define isConsole(s) ((s)->ioBits & IO_BIT_GUI_CONSOLE) #endif extern PIOSTRUCT get_stream(PolyObject *obj); extern Handle make_stream_entry(TaskData *mdTaskData); extern void free_stream_entry(unsigned stream_no); extern void close_stream(PIOSTRUCT str); extern PIOSTRUCT basic_io_vector; extern bool emfileFlag; #if defined(HAVE_STRUCT_STAT_ST_ATIM) # define STAT_SECS(stat,kind) (stat)->st_##kind##tim.tv_sec # define STAT_USECS(stat,kind) (((stat)->st_##kind##tim.tv_nsec + 500) / 1000) #elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC) # define STAT_SECS(stat,kind) (stat)->st_##kind##time # define STAT_USECS(stat,kind) (((stat)->st_##kind##timensec + 500) / 1000) #elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC) # define STAT_SECS(stat,kind) (stat)->st_##kind##timespec.tv_sec # define STAT_USECS(stat,kind) (((stat)->st_##kind##timespec.tv_nsec + 500) / 1000) #elif defined(HAVE_STRUCT_STAT_ST_ATIME_N) # define STAT_SECS(stat,kind) (stat)->st_##kind##time # define STAT_USECS(stat,kind) (((stat)->st_##kind##time_n + 500) / 1000) #elif defined(HAVE_STRUCT_STAT_ST_UATIME) # define STAT_SECS(stat,kind) (stat)->st_##kind##time # define STAT_USECS(stat,kind) (stat)->st_u##kind##time #else # define STAT_SECS(stat,kind) (stat)->st_##kind##time # define STAT_USECS(stat,kind) 0 #endif #endif polyml-5.6/libpolyml/locking.cpp000066400000000000000000000210061265146633400170460ustar00rootroot00000000000000/* Title: Mutex and Condition Variable library. Copyright (c) 2007, 2012, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) #define HAVE_PTHREAD 1 #include #elif (defined(HAVE_WINDOWS_H)) #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_TIME_H #include #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) // Don't include semaphore.h on Mingw. It's provided but doesn't compile. #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDIO_H #include #endif #include "locking.h" #include "diagnostics.h" // Report contended locks after this many attempts #define LOCK_REPORT_COUNT 50 PLock::PLock(const char *n): lockName(n), lockCount(0) { #ifdef HAVE_PTHREAD pthread_mutex_init(&lock, 0); #elif defined(HAVE_WINDOWS_H) InitializeCriticalSection(&lock); #endif } PLock::~PLock() { #ifdef HAVE_PTHREAD pthread_mutex_destroy(&lock); #elif defined(HAVE_WINDOWS_H) DeleteCriticalSection(&lock); #endif } void PLock::Lock(void) { #if (defined(HAVE_PTHREAD) || defined(HAVE_WINDOWS_H)) if (debugOptions & DEBUG_CONTENTION) { // Report a heavily contended lock. if (Trylock()) return; if (++lockCount > LOCK_REPORT_COUNT) { if (lockName != 0) Log("Lock: contention on lock: %s\n", lockName); else Log("Lock: contention on lock at %p\n", &lock); lockCount = 0; } // Drop through to a normal lock } #endif #ifdef HAVE_PTHREAD pthread_mutex_lock(&lock); #elif defined(HAVE_WINDOWS_H) EnterCriticalSection(&lock); #endif // If we don't support threads this does nothing. } void PLock::Unlock(void) { #ifdef HAVE_PTHREAD pthread_mutex_unlock(&lock); #elif defined(HAVE_WINDOWS_H) LeaveCriticalSection(&lock); #endif } bool PLock::Trylock(void) { #ifdef HAVE_PTHREAD // Since we use normal mutexes this returns EBUSY if the // current thread owns the mutex. return pthread_mutex_trylock(&lock) != EBUSY; #elif defined(HAVE_WINDOWS_H) // This is not implemented properly in Windows. There is // TryEnterCriticalSection in Win NT and later but that // returns TRUE if the current thread owns the mutex. return TryEnterCriticalSection(&lock) == TRUE; #else return true; // Single-threaded. #endif } PCondVar::PCondVar() { #ifdef HAVE_PTHREAD pthread_cond_init(&cond, NULL); #elif defined(HAVE_WINDOWS_H) InitializeConditionVariable(&cond); #endif } PCondVar::~PCondVar() { #ifdef HAVE_PTHREAD pthread_cond_destroy(&cond); #endif } // Wait indefinitely. Drops the lock and reaquires it. void PCondVar::Wait(PLock *pLock) { #ifdef HAVE_PTHREAD pthread_cond_wait(&cond, &pLock->lock); #elif defined(HAVE_WINDOWS_H) SleepConditionVariableCS(&cond, &pLock->lock, INFINITE); #endif } // Wait until a specified absolute time. Drops the lock and reaquires it. #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Windows with Windows-style times void PCondVar::WaitUntil(PLock *pLock, const FILETIME *time) { FILETIME now; GetSystemTimeAsFileTime(&now); LARGE_INTEGER liNow, liTime; liNow.HighPart = now.dwHighDateTime; liNow.LowPart = now.dwLowDateTime; liTime.HighPart = time->dwHighDateTime; liTime.LowPart = time->dwLowDateTime; if (liNow.QuadPart >= liTime.QuadPart) // Already past the time return; DWORD toWait = (DWORD)((liTime.QuadPart - liNow.QuadPart) / (LONGLONG)10000); (void)WaitFor(pLock, toWait); } #else // Unix-style times void PCondVar::WaitUntil(PLock *pLock, const timespec *time) { #ifdef HAVE_PTHREAD pthread_cond_timedwait(&cond, &pLock->lock, time); #elif defined(HAVE_WINDOWS_H) // This must be Cygwin but compiled with --without-threads struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return; if (tv.tv_sec > time->tv_sec || (tv.tv_sec == time->tv_sec && tv.tv_usec >= time->tv_nsec/1000)) return; // Already past the time WaitFor(pLock, (time->tv_sec - tv.tv_sec) * 1000 + time->tv_nsec/1000000 - tv.tv_usec/1000); #endif } #endif // Wait for a number of milliseconds. Used within the RTS. Drops the lock and reaquires it. // Returns true if the return was because the condition variable had been signalled. // Returns false if the timeout expired or there was an error. bool PCondVar::WaitFor(PLock *pLock, unsigned milliseconds) { #ifdef HAVE_PTHREAD struct timespec waitTime; struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return false; waitTime.tv_sec = tv.tv_sec + milliseconds / 1000; waitTime.tv_nsec = (tv.tv_usec + (milliseconds % 1000) * 1000) * 1000; if (waitTime.tv_nsec >= 1000*1000*1000) { waitTime.tv_nsec -= 1000*1000*1000; waitTime.tv_sec += 1; } return pthread_cond_timedwait(&cond, &pLock->lock, &waitTime) == 0; #elif defined(HAVE_WINDOWS_H) // SleepConditionVariableCS returns zero on error or timeout. return SleepConditionVariableCS(&cond, &pLock->lock, milliseconds) != 0; #else return true; // Single-threaded. Return immediately. #endif } // Wake up all the waiting threads. void PCondVar::Signal(void) { #ifdef HAVE_PTHREAD pthread_cond_broadcast(&cond); #elif defined(HAVE_WINDOWS_H) WakeAllConditionVariable(&cond); #endif } // Initialise a semphore. Tries to create an unnamed semaphore if // it can but tries a named semaphore if it can't. Mac OS X only // supports named semaphores. // The semaphore is initialised with a count of zero. PSemaphore::PSemaphore() { #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) sema = 0; isLocal = true; #elif defined(HAVE_WINDOWS_H) sema = NULL; #endif } PSemaphore::~PSemaphore() { #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) if (sema && isLocal) sem_destroy(sema); else if (sema && !isLocal) sem_close(sema); #elif defined(HAVE_WINDOWS_H) if (sema != NULL) CloseHandle(sema); #endif } bool PSemaphore::Init(unsigned init, unsigned max) { #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) isLocal = true; if (sem_init(&localSema, 0, init) == 0) { sema = &localSema; return true; } #if (defined(__CYGWIN__)) // Cygwin doesn't define sem_unlink but that doesn't matter // since sem_init works. sema = 0; return false; #else isLocal = false; char semname[30]; static int count=0; sprintf(semname, "poly%0d-%0d", (int)getpid(), count++); sema = sem_open(semname, O_CREAT|O_EXCL, 00666, init); if (sema == (sem_t*)SEM_FAILED) { sema = 0; return false; } sem_unlink(semname); return true; #endif #elif defined(HAVE_WINDOWS_H) sema = CreateSemaphore(NULL, init, max, NULL); return sema != NULL; #endif } bool PSemaphore::Wait(void) { #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) // Wait until the semaphore is signalled. A Unix signal may interrupt // it so we need to retry in that case. while (sem_wait(sema) == -1) { if (errno != EINTR) return false; } return true; #elif defined(HAVE_WINDOWS_H) return WaitForSingleObject(sema, INFINITE) == WAIT_OBJECT_0; #endif } void PSemaphore::Signal(void) { #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) sem_post(sema); #elif defined(HAVE_WINDOWS_H) ReleaseSemaphore(sema, 1, NULL); #endif } polyml-5.6/libpolyml/locking.h000066400000000000000000000072451265146633400165240ustar00rootroot00000000000000/* Title: Mutex and Condition Variable library. Copyright (c) 2007, 2012 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef LOCKING_H_DEFINED #define LOCKING_H_DEFINED #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_WINDOWS_H #include #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) // Don't include semaphore.h on Mingw. It's provided but doesn't compile. #include #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) // Don't include pthread if this is native Windows and not Cygwin #include #endif // Simple Mutex. class PLock { public: PLock(const char *n = 0); ~PLock(); void Lock(void); // Lock the mutex void Unlock(void); // Unlock the mutex bool Trylock(void); // Try to lock the mutex - returns true if succeeded private: #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) pthread_mutex_t lock; #elif defined(HAVE_WINDOWS_H) CRITICAL_SECTION lock; #endif // Debugging info. const char *lockName; unsigned lockCount; friend class PCondVar; }; // Lock a mutex and automatically unlock it in the destructor. // This can be used in a function to lock a mutex and unlock it // when the function either returns normally or raises an exception. class PLocker { public: PLocker(PLock *lock): m_lock(lock) { m_lock->Lock(); } ~PLocker() { m_lock->Unlock(); } private: PLock *m_lock; }; // Simple condition variable. N.B. The Windows code does not // support multiple threads blocking on this condition variable. class PCondVar { public: PCondVar(); ~PCondVar(); void Wait(PLock *pLock); // Wait indefinitely. Drops the lock and reaquires it. // Wait for a signal or until the time. The argument is an absolute time // represented as a struct timespec in Unix and a FILETIME in Windows. #if (defined(_WIN32) && ! defined(__CYGWIN__)) void WaitUntil(PLock *pLock, const FILETIME *timeArg); #else void WaitUntil(PLock *pLock, const timespec *timeArg); #endif // Wait for a time. This is used internally in the RTS. bool WaitFor(PLock *pLock, unsigned milliseconds); // N.B. Signal MUST be called only with the lock held. void Signal(void); // Wake up the waiting thread. private: #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_PTHREAD_H)) pthread_cond_t cond; #elif defined(HAVE_WINDOWS_H) CONDITION_VARIABLE cond; #endif }; // Semaphore. Wrapper for Posix semaphore or Windows semaphore. class PSemaphore { public: PSemaphore(); ~PSemaphore(); bool Init(unsigned init, unsigned max); bool Wait(void); void Signal(void); private: #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) sem_t localSema, *sema; bool isLocal; #elif defined(HAVE_WINDOWS_H) HANDLE sema; #endif }; #endif polyml-5.6/libpolyml/machine_dep.h000066400000000000000000000042101265146633400173170ustar00rootroot00000000000000/* Title: machine_dep.h - exports signature for machine_dep.c Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _MACHINE_DEP_H #define _MACHINE_DEP_H class ScanAddress; class TaskData; class SaveVecEntry; typedef SaveVecEntry *Handle; class StackSpace; // Machine architecture values. typedef enum { MA_Interpreted = 0, MA_I386, MA_X86_64 } Architectures; // Machine-dependent module. class MachineDependent { public: virtual ~MachineDependent() {} // Keep the compiler happy // Create the machine-specific task data object. virtual TaskData *CreateTaskData(void) = 0; virtual unsigned InitialStackSize(void) { return 128; } // Initial size of a stack // Must be > 40 (i.e. 2*min_stack_check) + base area in each stack frame virtual void InitInterfaceVector(void) = 0; /* ScanConstantsWithinCode - update addresses within a code segment.*/ virtual void ScanConstantsWithinCode(PolyObject *addr, PolyObject *oldAddr, POLYUNSIGNED length, ScanAddress *process) {} void ScanConstantsWithinCode(PolyObject *addr, ScanAddress *process) { ScanConstantsWithinCode(addr, addr, addr->Length(), process); } // Common case virtual void FlushInstructionCache(void *p, POLYUNSIGNED bytes) {} virtual Architectures MachineArchitecture(void) = 0; }; extern MachineDependent *machineDependent; #endif /* _MACHINE_DEP_H */ polyml-5.6/libpolyml/machoexport.cpp000066400000000000000000000452611265146633400177620ustar00rootroot00000000000000/* Title: Write out a database as a Mach object file Author: David Matthews. Copyright (c) 2006-7, 2011-2 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDDEF_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif // If we haven't got the Mach header files we shouldn't be building this. #include #include #include #include #include #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #include "globals.h" #include "diagnostics.h" #include "sys.h" #include "machine_dep.h" #include "gc.h" #include "mpoly.h" #include "scanaddrs.h" #include "machoexport.h" #include "run_time.h" #include "version.h" #include "polystring.h" // Mach-O seems to require each section to have a discrete virtual address range // so we have to adjust various offsets to fit. void MachoExport::adjustOffset(unsigned area, POLYUNSIGNED &offset) { // Add in the offset. If sect is memTableEntries it's actually the // descriptors so doesn't have any additional offset. if (area != memTableEntries) { offset += sizeof(exportDescription)+sizeof(memoryTableEntry)*memTableEntries; for (unsigned i = 0; i < area; i++) offset += memTable[i].mtLength; } } // Generate the address relative to the start of the segment. void MachoExport::setRelocationAddress(void *p, int32_t *reloc) { unsigned area = findArea(p); POLYUNSIGNED offset = (char*)p - (char*)memTable[area].mtAddr; *reloc = offset; } /* Get the index corresponding to an address. */ PolyWord MachoExport::createRelocation(PolyWord p, void *relocAddr) { void *addr = p.AsAddress(); unsigned addrArea = findArea(addr); POLYUNSIGNED offset = (char*)addr - (char*)memTable[addrArea].mtAddr; adjustOffset(addrArea, offset); // It looks as though struct relocation_info entries are only used // with GENERIC_RELOC_VANILLA types. struct relocation_info relInfo; setRelocationAddress(relocAddr, &relInfo.r_address); relInfo.r_symbolnum = addrArea+1; // Section numbers start at 1 relInfo.r_pcrel = 0; #if (SIZEOF_VOIDP == 8) relInfo.r_length = 3; // 8 bytes relInfo.r_type = X86_64_RELOC_UNSIGNED; #else relInfo.r_length = 2; // 4 bytes relInfo.r_type = GENERIC_RELOC_VANILLA; #endif relInfo.r_extern = 0; // r_symbolnum is a section number. It should be 1 if we make the IO area a common. fwrite(&relInfo, sizeof(relInfo), 1, exportFile); relocationCount++; return PolyWord::FromUnsigned(offset); } /* This is called for each constant within the code. Print a relocation entry for the word and return a value that means that the offset is saved in original word. */ void MachoExport::ScanConstant(byte *addr, ScanRelocationKind code) { PolyWord p = GetConstantValue(addr, code); if (IS_INT(p) || p == PolyWord::FromUnsigned(0)) return; void *a = p.AsAddress(); unsigned aArea = findArea(a); // Set the value at the address to the offset relative to the symbol. POLYUNSIGNED offset = (char*)a - (char*)memTable[aArea].mtAddr; adjustOffset(aArea, offset); switch (code) { case PROCESS_RELOC_DIRECT: // 32 bit address of target { struct relocation_info reloc; setRelocationAddress(addr, &reloc.r_address); reloc.r_symbolnum = aArea+1; // Section numbers start at 1 reloc.r_pcrel = 0; #if (defined(HOSTARCHITECTURE_X86_64)) reloc.r_length = 3; // 8 bytes reloc.r_type = X86_64_RELOC_UNSIGNED; #else reloc.r_length = 2; // 4 bytes reloc.r_type = GENERIC_RELOC_VANILLA; #endif reloc.r_extern = 0; // r_symbolnum is a section number. It should be 1 if we make the IO area a common. for (unsigned i = 0; i < sizeof(PolyWord); i++) { addr[i] = (byte)(offset & 0xff); offset >>= 8; } fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } break; #if (defined(HOSTARCHITECTURE_X86) || defined(HOSTARCHITECTURE_X86_64)) case PROCESS_RELOC_I386RELATIVE: // 32 bit relative address { unsigned addrArea = findArea(addr); // If it's in the same area we don't need a relocation because the // relative offset will be unchanged. if (addrArea != aArea) { struct relocation_info reloc; setRelocationAddress(addr, &reloc.r_address); reloc.r_symbolnum = aArea+1; // Section numbers start at 1 reloc.r_pcrel = 1; reloc.r_length = 2; // 4 bytes #if (defined(HOSTARCHITECTURE_X86_64)) reloc.r_type = X86_64_RELOC_SIGNED; #else reloc.r_type = GENERIC_RELOC_VANILLA; #endif reloc.r_extern = 0; // r_symbolnum is a section number. fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; POLYUNSIGNED addrOffset = (char*)addr - (char*)memTable[addrArea].mtAddr; adjustOffset(addrArea, addrOffset); offset -= addrOffset + 4; for (unsigned i = 0; i < 4; i++) { addr[i] = (byte)(offset & 0xff); offset >>= 8; } } } break; #endif default: ASSERT(0); // Wrong type of relocation for this architecture. } } void MachoExport::writeSymbol(const char *symbolName, unsigned char nType, unsigned char nSect, unsigned long offset) { #if (SIZEOF_VOIDP == 8) struct nlist_64 symbol; #else struct nlist symbol; #endif memset(&symbol, 0, sizeof(symbol)); // Zero unused fields symbol.n_un.n_strx = stringTable.makeEntry(symbolName); symbol.n_type = nType; symbol.n_sect = nSect+1; // Sections count from 1. symbol.n_desc = REFERENCE_FLAG_DEFINED; adjustOffset(nSect, offset); symbol.n_value = offset; fwrite(&symbol, sizeof(symbol), 1, exportFile); symbolCount++; } // Set the file alignment. void MachoExport::alignFile(int align) { char pad[32]; // Maximum alignment int offset = ftell(exportFile); memset(pad, 0, sizeof(pad)); if ((offset % align) == 0) return; fwrite(&pad, align - (offset % align), 1, exportFile); } void MachoExport::createStructsRelocation(unsigned sect, POLYUNSIGNED offset) { struct relocation_info reloc; reloc.r_address = offset; reloc.r_symbolnum = sect+1; // Section numbers start at 1 reloc.r_pcrel = 0; #if (SIZEOF_VOIDP == 8) reloc.r_length = 3; // 8 bytes reloc.r_type = X86_64_RELOC_UNSIGNED; #else reloc.r_length = 2; // 4 bytes reloc.r_type = GENERIC_RELOC_VANILLA; #endif reloc.r_extern = 0; // r_symbolnum is a section number. fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } void MachoExport::exportStore(void) { PolyWord *p; #if (SIZEOF_VOIDP == 8) struct mach_header_64 fhdr; struct segment_command_64 sHdr; struct section_64 *sections = new section_64[memTableEntries+1]; size_t sectionSize = sizeof(section_64); #else struct mach_header fhdr; struct segment_command sHdr; struct section *sections = new section[memTableEntries+1]; size_t sectionSize = sizeof(section); #endif struct symtab_command symTab; unsigned i; // Write out initial values for the headers. These are overwritten at the end. // File header memset(&fhdr, 0, sizeof(fhdr)); fhdr.filetype = MH_OBJECT; fhdr.ncmds = 2; // One for the segment and one for the symbol table. fhdr.sizeofcmds = sizeof(sHdr) + sectionSize * (memTableEntries+1) + sizeof(symTab); fhdr.flags = 0; // The machine needs to match the machine we're compiling for // even if this is actually portable code. #if (SIZEOF_VOIDP == 8) fhdr.magic = MH_MAGIC_64; // (0xfeedfacf) 64-bit magic number #else fhdr.magic = MH_MAGIC; // Feed Face (0xfeedface) #endif #if defined(HOSTARCHITECTURE_X86) fhdr.cputype = CPU_TYPE_I386; fhdr.cpusubtype = CPU_SUBTYPE_I386_ALL; #elif defined(HOSTARCHITECTURE_PPC) fhdr.cputype = CPU_TYPE_POWERPC; fhdr.cpusubtype = CPU_SUBTYPE_POWERPC_ALL; #elif defined(HOSTARCHITECTURE_X86_64) fhdr.cputype = CPU_TYPE_X86_64; fhdr.cpusubtype = CPU_SUBTYPE_X86_64_ALL; #else #error "No support for exporting on this architecture" #endif fwrite(&fhdr, sizeof(fhdr), 1, exportFile); // Write it for the moment. // Segment header. memset(&sHdr, 0, sizeof(sHdr)); #if (SIZEOF_VOIDP == 8) sHdr.cmd = LC_SEGMENT_64; #else sHdr.cmd = LC_SEGMENT; #endif sHdr.nsects = memTableEntries+1; // One for each entry plus one for the tables. sHdr.cmdsize = sizeof(sHdr) + sectionSize * sHdr.nsects; // Add up the sections to give the file size sHdr.filesize = 0; for (i = 0; i < memTableEntries; i++) sHdr.filesize += memTable[i].mtLength; // Do we need any alignment? sHdr.filesize += sizeof(exportDescription) + memTableEntries * sizeof(memoryTableEntry); sHdr.vmsize = sHdr.filesize; // Set them the same since we don't have any "common" area. // sHdr.fileOff is set later. sHdr.maxprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE; sHdr.initprot = VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE; sHdr.flags = 0; // Write it initially. fwrite(&sHdr, sizeof(sHdr), 1, exportFile); // Section header for each entry in the table POLYUNSIGNED sectAddr = sizeof(exportDescription)+sizeof(memoryTableEntry)*memTableEntries; for (i = 0; i < memTableEntries; i++) { memset(&(sections[i]), 0, sectionSize); if (memTable[i].mtFlags & MTF_WRITEABLE) { // Mutable areas ASSERT(!(memTable[i].mtFlags & MTF_EXECUTABLE)); // Executable areas can't be writable. sprintf(sections[i].sectname, "__data"); sprintf(sections[i].segname, "__DATA"); sections[i].flags = S_ATTR_LOC_RELOC | S_REGULAR; } else if (memTable[i].mtFlags & MTF_EXECUTABLE) { sprintf(sections[i].sectname, "__text"); sprintf(sections[i].segname, "__TEXT"); sections[i].flags = S_ATTR_LOC_RELOC | S_ATTR_SOME_INSTRUCTIONS | S_REGULAR; } else { sprintf(sections[i].sectname, "__const"); sprintf(sections[i].segname, "__DATA"); sections[i].flags = S_ATTR_LOC_RELOC | S_REGULAR; } sections[i].addr = sectAddr; sections[i].size = memTable[i].mtLength; sectAddr += memTable[i].mtLength; //sections[i].offset is set later //sections[i].reloff is set later //sections[i].nreloc is set later sections[i].align = 3; // 8 byte alignment // theSection.size is set later } // For the tables. memset(&(sections[memTableEntries]), 0, sectionSize); sprintf(sections[memTableEntries].sectname, "__const"); sprintf(sections[memTableEntries].segname, "__DATA"); sections[memTableEntries].addr = 0; sections[memTableEntries].size = sizeof(exportDescription)+sizeof(memoryTableEntry)*memTableEntries; sections[memTableEntries].align = 3; // 8 byte alignment // theSection.size is set later sections[memTableEntries].flags = S_ATTR_LOC_RELOC | S_ATTR_SOME_INSTRUCTIONS | S_REGULAR; // Write them out for the moment. fwrite(sections, sectionSize * (memTableEntries+1), 1, exportFile); // Symbol table header. memset(&symTab, 0, sizeof(symTab)); symTab.cmd = LC_SYMTAB; symTab.cmdsize = sizeof(symTab); //symTab.symoff is set later //symTab.nsyms is set later //symTab.stroff is set later //symTab.strsize is set later fwrite(&symTab, sizeof(symTab), 1, exportFile); // Create the symbol table first before we mess up the addresses by turning them // into relocations. symTab.symoff = ftell(exportFile); // Global symbols: Just one. Mach prefixes symbols with an underscore. writeSymbol("_poly_exports", N_EXT | N_SECT, memTableEntries, 0); // The export table comes first // We create local symbols because they make debugging easier. They may also // mean that we can use the usual Unix profiling tools. writeSymbol("memTable", N_SECT, memTableEntries, sizeof(exportDescription)); // Then the memTable. for (i = 0; i < memTableEntries; i++) { if (i == ioMemEntry) writeSymbol("ioarea", N_SECT, i, 0); else { char buff[50]; sprintf(buff, "area%0d", i); writeSymbol(buff, N_SECT, i, 0); #if (SIZEOF_VOIDP == 8) // See if we can find the names of any functions. // This seems to break on 32-bit Mac OS X. It seems to align // some relocations onto an 8-byte boundary so we just disable it. char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); if (length != 0 && obj->IsCodeObject()) { PolyWord *name = obj->ConstPtrForCode(); // Copy as much of the name as will fit and ignore any extra. // Do we need to worry about duplicates? (void)Poly_string_to_C(*name, buff, sizeof(buff)); writeSymbol(buff, N_SECT, i, (char*)p - start); } p += length; } #endif } } symTab.nsyms = symbolCount; // Create and write out the relocations. for (i = 0; i < memTableEntries; i++) { sections[i].reloff = ftell(exportFile); relocationCount = 0; if (i != ioMemEntry) // Don't relocate the IO area { // Create the relocation table and turn all addresses into offsets. char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); if (length != 0 && obj->IsCodeObject()) machineDependent->ScanConstantsWithinCode(obj, this); relocateObject(obj); p += length; } } sections[i].nreloc = relocationCount; } // Additional relocations for the descriptors. sections[memTableEntries].reloff = ftell(exportFile); relocationCount = 0; // Address of "memTable" within "exports". We can't use createRelocation because // the position of the relocation is not in either the mutable or the immutable area. createStructsRelocation(memTableEntries, offsetof(exportDescription, memTable)); // Address of "rootFunction" within "exports" unsigned rootAddrArea = findArea(rootFunction); POLYUNSIGNED rootOffset = (char*)rootFunction - (char*)memTable[rootAddrArea].mtAddr; adjustOffset(rootAddrArea, rootOffset); createStructsRelocation(rootAddrArea, offsetof(exportDescription, rootFunction)); // Addresses of the areas within memtable. for (i = 0; i < memTableEntries; i++) { createStructsRelocation(i, sizeof(exportDescription) + i * sizeof(memoryTableEntry) + offsetof(memoryTableEntry, mtAddr)); } sections[memTableEntries].nreloc = relocationCount; // The symbol name table symTab.stroff = ftell(exportFile); fwrite(stringTable.strings, stringTable.stringSize, 1, exportFile); symTab.strsize = stringTable.stringSize; alignFile(4); exportDescription exports; memset(&exports, 0, sizeof(exports)); exports.structLength = sizeof(exportDescription); exports.memTableSize = sizeof(memoryTableEntry); exports.memTableEntries = memTableEntries; exports.ioIndex = 0; // The io entry is the first in the memory table exports.memTable = (memoryTableEntry *)sizeof(exportDescription); // It follows immediately after this. // Set the value to be the offset relative to the base of the area. We have set a relocation // already which will add the base of the area. exports.rootFunction = (void*)rootOffset; exports.timeStamp = time(NULL); exports.ioSpacing = ioSpacing; exports.architecture = machineDependent->MachineArchitecture(); exports.rtsVersion = POLY_version_number; sections[memTableEntries].offset = ftell(exportFile); fwrite(&exports, sizeof(exports), 1, exportFile); POLYUNSIGNED addrOffset = sizeof(exports)+sizeof(memoryTableEntry)*memTableEntries; for (i = 0; i < memTableEntries; i++) { void *save = memTable[i].mtAddr; memTable[i].mtAddr = (void*)addrOffset; // Set this to the relative address. addrOffset += memTable[i].mtLength; fwrite(&memTable[i], sizeof(memoryTableEntry), 1, exportFile); memTable[i].mtAddr = save; } // Now the binary data. for (i = 0; i < memTableEntries; i++) { alignFile(4); sections[i].offset = ftell(exportFile); fwrite(memTable[i].mtAddr, 1, memTable[i].mtLength, exportFile); } // Rewind to rewrite the headers with the actual offsets. rewind(exportFile); fwrite(&fhdr, sizeof(fhdr), 1, exportFile); // File header fwrite(&sHdr, sizeof(sHdr), 1, exportFile); // Segment header fwrite(sections, sectionSize * (memTableEntries+1), 1, exportFile); // Section headers fwrite(&symTab, sizeof(symTab), 1, exportFile); // Symbol table header fclose(exportFile); exportFile = NULL; delete[](sections); } polyml-5.6/libpolyml/machoexport.h000066400000000000000000000037031265146633400174220ustar00rootroot00000000000000/* Title: Export memory as a Mach object file Author: David C. J. Matthews. Copyright (c) 2006 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MachExport_H_INCLUDED #define MachExport_H_INCLUDED #include "config.h" #include "scanaddrs.h" // For base class #include "exporter.h" #include class MachoExport: public Exporter, public ScanAddress { public: MachoExport(): relocationCount(0), symbolCount(0) {} public: virtual void exportStore(void); private: // ScanAddress overrides virtual void ScanConstant(byte *addrOfConst, ScanRelocationKind code); // At the moment we should only get calls to ScanConstant. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } private: void setRelocationAddress(void *p, int32_t *reloc); PolyWord createRelocation(PolyWord p, void *relocAddr); void writeSymbol(const char *symbolName, unsigned char nType, unsigned char nSect, unsigned long offset); void alignFile(int align); void createStructsRelocation(unsigned area, POLYUNSIGNED offset); void adjustOffset(unsigned area, POLYUNSIGNED &offset); unsigned relocationCount; unsigned symbolCount; ExportStringTable stringTable; }; #endif polyml-5.6/libpolyml/masm2gas000066400000000000000000000010201265146633400163430ustar00rootroot00000000000000#! /usr/bin/sed -f # N.B. This is used only with GCC. There's a bug in sed under MinGW which means # that CRNL line endings don't work so this file must be marked as binary. s/;#.*// s/^IFDEF/#ifdef/ s/^ELSE/#else/ s/^ENDIF/#endif/ s/^IFNDEF/#ifndef/ # Convert macro calls. s/CALLMACRO[ ]*\([^ ]*\)[ ]*\(.*\)/ \1(\2)/ # Convert addresses of the form [eax], [eax+ebx], [eax+ebx*4] into # (eax), (eax,ebx), (eax,ebx,4) s/\[\([^]]*\)+\([^]]*\)\*\([^]]*\)]/(\1,\2,\3)/g s/\[\([^]]*\)+\([^]]*\)]/(\1,\2)/g s/\[\([^]]*\)]/(\1)/g polyml-5.6/libpolyml/memmgr.cpp000066400000000000000000000771461265146633400167240ustar00rootroot00000000000000/* Title: memmgr.cpp Memory segment manager Copyright (c) 2006-7, 2011-12 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include #include "globals.h" #include "memmgr.h" #include "osmem.h" #include "scanaddrs.h" #include "bitmap.h" #include "mpoly.h" #include "diagnostics.h" #include "statistics.h" #include "processes.h" // heap resizing policy option requested on command line unsigned heapsizingOption = 0; MemSpace::MemSpace(): SpaceTree(true) { spaceType = ST_PERMANENT; isMutable = false; bottom = 0; top = 0; isOwnSpace = false; } MemSpace::~MemSpace() { if (isOwnSpace && bottom != 0) osMemoryManager->Free(bottom, (char*)top - (char*)bottom); } LocalMemSpace::LocalMemSpace(): spaceLock("Local space") { spaceType = ST_LOCAL; upperAllocPtr = lowerAllocPtr = 0; for (unsigned i = 0; i < NSTARTS; i++) start[i] = 0; start_index = 0; i_marked = m_marked = updated = 0; allocationSpace = false; } bool LocalMemSpace::InitSpace(POLYUNSIGNED size, bool mut) { isMutable = mut; // Allocate the heap itself. size_t iSpace = size*sizeof(PolyWord); bottom = (PolyWord*)osMemoryManager->Allocate(iSpace, PERMISSION_READ|PERMISSION_WRITE|PERMISSION_EXEC); if (bottom == 0) return false; isOwnSpace = true; // Deallocate when we're finished. // The size may have been rounded up to a block boundary. size = iSpace/sizeof(PolyWord); top = bottom + size; // Initialise all the fields. The partial GC in particular relies on this. upperAllocPtr = partialGCTop = fullGCRescanStart = fullGCLowerLimit = lowestWeak = top; lowerAllocPtr = partialGCScan = partialGCRootBase = partialGCRootTop = fullGCRescanEnd = highestWeak = bottom; spaceOwner = 0; allocationSpace = false; // Bitmap for the space. return bitmap.Create(size); } MemMgr::MemMgr(): allocLock("Memmgr alloc") { npSpaces = nlSpaces = nsSpaces = 0; pSpaces = 0; lSpaces = 0; eSpaces = 0; sSpaces = 0; nextIndex = 0; reservedSpace = 0; nextAllocator = 0; defaultSpaceSize = 0; spaceBeforeMinorGC = 0; spaceForHeap = 0; currentAllocSpace = currentHeapSize = 0; defaultSpaceSize = 1024 * 1024 / sizeof(PolyWord); // 1Mbyte segments. spaceTree = new SpaceTreeTree; ioSpace = new MemSpace; } MemMgr::~MemMgr() { delete(spaceTree); // Have to do this before we delete the spaces. unsigned i; for (i = 0; i < npSpaces; i++) delete(pSpaces[i]); free(pSpaces); for (i = 0; i < nlSpaces; i++) delete(lSpaces[i]); free(lSpaces); for (i = 0; i < neSpaces; i++) delete(eSpaces[i]); free(eSpaces); for (i = 0; i < nsSpaces; i++) delete(sSpaces[i]); free(sSpaces); delete ioSpace; } // Create and initialise a new local space and add it to the table. LocalMemSpace* MemMgr::NewLocalSpace(POLYUNSIGNED size, bool mut) { try { LocalMemSpace *space = new LocalMemSpace; // Before trying to allocate the heap temporarily allocate the // reserved space. This ensures that this much space will always // be available for C stacks and the C++ heap. void *reservation = 0; size_t rSpace = reservedSpace*sizeof(PolyWord); if (reservedSpace != 0) { reservation = osMemoryManager->Allocate(rSpace, PERMISSION_READ); if (reservation == 0) { // Insufficient space for the reservation. Can't allocate this local space. if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New local %smutable space: insufficient reservation space\n", mut ? "": "im"); delete space; return 0; } } bool success = space->InitSpace(size, mut) && AddLocalSpace(space); if (reservation != 0) osMemoryManager->Free(reservation, rSpace); if (success) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New local %smutable space %p, size=%luk words, bottom=%p, top=%p\n", mut ? "": "im", space, space->spaceSize()/1024, space->bottom, space->top); currentHeapSize += space->spaceSize(); globalStats.setSize(PSS_TOTAL_HEAP, currentHeapSize * sizeof(PolyWord)); return space; } // If something went wrong. delete space; if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New local %smutable space: insufficient space\n", mut ? "": "im"); return 0; } catch (std::bad_alloc&) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New local %smutable space: \"new\" failed\n", mut ? "": "im"); return 0; } } // Create a local space for initial allocation. LocalMemSpace *MemMgr::CreateAllocationSpace(POLYUNSIGNED size) { LocalMemSpace *result = NewLocalSpace(size, true); if (result) { result->allocationSpace = true; currentAllocSpace += result->spaceSize(); globalStats.incSize(PSS_ALLOCATION, result->spaceSize()*sizeof(PolyWord)); globalStats.incSize(PSS_ALLOCATION_FREE, result->freeSpace()*sizeof(PolyWord)); } return result; } // If an allocation space has a lot of data left in it after a GC, particularly // a single large object we should turn it into a local area. void MemMgr::ConvertAllocationSpaceToLocal(LocalMemSpace *space) { ASSERT(space->allocationSpace); space->allocationSpace = false; // Currently it is left as a mutable area but if the contents are all // immutable e.g. a large vector it could be better to turn it into an // immutable area. currentAllocSpace -= space->spaceSize(); } // Add a local memory space to the table. bool MemMgr::AddLocalSpace(LocalMemSpace *space) { // Add to the table. LocalMemSpace **table = (LocalMemSpace **)realloc(lSpaces, (nlSpaces+1) * sizeof(LocalMemSpace *)); if (table == 0) return false; lSpaces = table; // Update the B-tree. try { AddTree(space); } catch (std::bad_alloc&) { RemoveTree(space); return false; } // The entries in the local table are ordered so that the copy phase of the full // GC simply has to copy to an entry earlier in the table. Immutable spaces come // first, followed by mutable spaces and finally allocation spaces. if (space->allocationSpace) lSpaces[nlSpaces++] = space; // Just add at the end else if (space->isMutable) { // Add before the allocation spaces unsigned s; for (s = nlSpaces; s > 0 && lSpaces[s-1]->allocationSpace; s--) lSpaces[s] = lSpaces[s-1]; lSpaces[s] = space; nlSpaces++; } else { // Immutable space: Add before the mutable spaces unsigned s; for (s = nlSpaces; s > 0 && lSpaces[s-1]->isMutable; s--) lSpaces[s] = lSpaces[s-1]; lSpaces[s] = space; nlSpaces++; } return true; } // Create an entry for a permanent space. PermanentMemSpace* MemMgr::NewPermanentSpace(PolyWord *base, POLYUNSIGNED words, unsigned flags, unsigned index, unsigned hierarchy /*= 0*/) { try { PermanentMemSpace *space = new PermanentMemSpace; space->bottom = base; space->topPointer = space->top = space->bottom + words; space->spaceType = ST_PERMANENT; space->isMutable = flags & MTF_WRITEABLE ? true : false; space->noOverwrite = flags & MTF_NO_OVERWRITE ? true : false; space->byteOnly = flags & MTF_BYTES ? true : false; space->index = index; space->hierarchy = hierarchy; if (index >= nextIndex) nextIndex = index+1; // Extend the permanent memory table and add this space to it. PermanentMemSpace **table = (PermanentMemSpace **)realloc(pSpaces, (npSpaces+1) * sizeof(PermanentMemSpace *)); if (table == 0) { delete space; return 0; } pSpaces = table; try { AddTree(space); } catch (std::bad_alloc&) { RemoveTree(space); delete space; return 0; } pSpaces[npSpaces++] = space; return space; } catch (std::bad_alloc&) { return 0; } } // Delete a local space and remove it from the table. bool MemMgr::DeleteLocalSpace(LocalMemSpace *sp) { for (unsigned i = 0; i < nlSpaces; i++) { if (lSpaces[i] == sp) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Deleted local %s space %p\n", sp->spaceTypeString(), sp); currentHeapSize -= sp->spaceSize(); globalStats.setSize(PSS_TOTAL_HEAP, currentHeapSize * sizeof(PolyWord)); if (sp->allocationSpace) currentAllocSpace -= sp->spaceSize(); RemoveTree(sp); delete sp; nlSpaces--; while (i < nlSpaces) { lSpaces[i] = lSpaces[i+1]; i++; } return true; } } ASSERT(false); // It should always be in the table. return false; } // Remove local areas that are now empty after a GC. // It isn't clear if we always want to do this. void MemMgr::RemoveEmptyLocals() { for (unsigned s = nlSpaces; s > 0; s--) { LocalMemSpace *space = lSpaces[s-1]; if (space->allocatedSpace() == 0) DeleteLocalSpace(space); } } // Create an entry for the IO space. MemSpace* MemMgr::InitIOSpace(PolyWord *base, POLYUNSIGNED words) { ioSpace->bottom = base; ioSpace->top = ioSpace->bottom + words; ioSpace->spaceType = ST_IO; ioSpace->isMutable = false; AddTree(ioSpace); return ioSpace; } // Create and initialise a new export space and add it to the table. PermanentMemSpace* MemMgr::NewExportSpace(POLYUNSIGNED size, bool mut, bool noOv) { try { PermanentMemSpace *space = new PermanentMemSpace; space->spaceType = ST_EXPORT; space->isMutable = mut; space->noOverwrite = noOv; space->index = nextIndex++; // Allocate the memory itself. size_t iSpace = size*sizeof(PolyWord); space->bottom = (PolyWord*)osMemoryManager->Allocate(iSpace, PERMISSION_READ|PERMISSION_WRITE|PERMISSION_EXEC); if (space->bottom == 0) { delete space; return 0; } space->isOwnSpace = true; // The size may have been rounded up to a block boundary. size = iSpace/sizeof(PolyWord); space->top = space->bottom + size; space->topPointer = space->bottom; // Add to the table. PermanentMemSpace **table = (PermanentMemSpace **)realloc(eSpaces, (neSpaces+1) * sizeof(PermanentMemSpace *)); if (table == 0) { delete space; return 0; } eSpaces = table; try { AddTree(space); } catch (std::bad_alloc&) { RemoveTree(space); delete space; return 0; } eSpaces[neSpaces++] = space; return space; } catch (std::bad_alloc&) { return 0; } } void MemMgr::DeleteExportSpaces(void) { while (neSpaces > 0) { PermanentMemSpace *space = eSpaces[--neSpaces]; RemoveTree(space); delete(space); } } // If we have saved the state rather than exported a function we turn the exported // spaces into permanent ones, removing existing permanent spaces at the same or // lower level. bool MemMgr::PromoteExportSpaces(unsigned hierarchy) { // Create a new table big enough to hold all the permanent and export spaces PermanentMemSpace **pTable = (PermanentMemSpace **)calloc(npSpaces+neSpaces, sizeof(PermanentMemSpace *)); if (pTable == 0) return false; unsigned newSpaces = 0; // Save permanent spaces at a lower hierarchy. Others are converted into // local spaces. Most or all items will have been copied from these spaces // into an export space but there could be items reachable only from the stack. for (unsigned i = 0; i < npSpaces; i++) { PermanentMemSpace *pSpace = pSpaces[i]; if (pSpace->hierarchy < hierarchy) pTable[newSpaces++] = pSpace; else { try { // Turn this into a local space. // Remove this from the tree - AddLocalSpace will make an entry for the local version. RemoveTree(pSpace); LocalMemSpace *space = new LocalMemSpace; space->top = space->fullGCLowerLimit = pSpace->top; space->bottom = space->upperAllocPtr = space->lowerAllocPtr = pSpace->bottom; space->isMutable = pSpace->isMutable; space->isOwnSpace = true; if (! space->bitmap.Create(space->top-space->bottom) || ! AddLocalSpace(space)) return false; currentHeapSize += space->spaceSize(); globalStats.setSize(PSS_TOTAL_HEAP, currentHeapSize * sizeof(PolyWord)); } catch (std::bad_alloc&) { return false; } } } // Save newly exported spaces. for (unsigned j = 0; j < neSpaces; j++) { PermanentMemSpace *space = eSpaces[j]; space->hierarchy = hierarchy; // Set the hierarchy of the new spaces. space->spaceType = ST_PERMANENT; // Put a dummy object to fill up the unused space. if (space->topPointer != space->top) FillUnusedSpace(space->topPointer, space->top - space->topPointer); // Put in a dummy object to fill the rest of the space. pTable[newSpaces++] = space; } neSpaces = 0; npSpaces = newSpaces; free(pSpaces); pSpaces = pTable; return true; } // Before we import a hierarchical saved state we need to turn any previously imported // spaces into local spaces. bool MemMgr::DemoteImportSpaces() { // Create a new permanent space table. PermanentMemSpace **table = (PermanentMemSpace **)calloc(npSpaces, sizeof(PermanentMemSpace *)); if (table == NULL) return false; unsigned newSpaces = 0; for (unsigned i = 0; i < npSpaces; i++) { PermanentMemSpace *pSpace = pSpaces[i]; if (pSpace->hierarchy == 0) // Leave truly permanent spaces table[newSpaces++] = pSpace; else { try { // Turn this into a local space. // Remove this from the tree - AddLocalSpace will make an entry for the local version. RemoveTree(pSpace); LocalMemSpace *space = new LocalMemSpace; space->top = pSpace->top; // Space is allocated in local areas from the top down. This area is full and // all data is in the old generation. The area can be recovered by a full GC. space->bottom = space->upperAllocPtr = space->lowerAllocPtr = space->fullGCLowerLimit = pSpace->bottom; space->isMutable = pSpace->isMutable; space->isOwnSpace = true; if (! space->bitmap.Create(space->top-space->bottom) || ! AddLocalSpace(space)) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Unable to convert saved state space %p into local space\n", pSpace); return false; } if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Converted saved state space %p into local %smutable space %p\n", pSpace, pSpace->isMutable ? "im": "", space); currentHeapSize += space->spaceSize(); globalStats.setSize(PSS_TOTAL_HEAP, currentHeapSize * sizeof(PolyWord)); } catch (std::bad_alloc&) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Unable to convert saved state space %p into local space (\"new\" failed)\n", pSpace); return false; } } } npSpaces = newSpaces; free(pSpaces); pSpaces = table; return true; } // Return the space for a given index PermanentMemSpace *MemMgr::SpaceForIndex(unsigned index) const { for (unsigned i = 0; i < npSpaces; i++) { PermanentMemSpace *space = pSpaces[i]; if (space->index == index) return space; } return NULL; } // In several places we assume that segments are filled with valid // objects. This fills unused memory with one or more "byte" objects. void MemMgr::FillUnusedSpace(PolyWord *base, POLYUNSIGNED words) { PolyWord *pDummy = base+1; while (words > 0) { POLYUNSIGNED oSize = words; // If the space is larger than the maximum object size // we will need several objects. if (words > MAX_OBJECT_SIZE) oSize = MAX_OBJECT_SIZE; else oSize = words-1; // Make this a byte object so it's always skipped. ((PolyObject*)pDummy)->SetLengthWord(oSize, F_BYTE_OBJ); words -= oSize+1; pDummy += oSize+1; } } // Allocate an area of the heap of at least minWords and at most maxWords. // This is used both when allocating single objects (when minWords and maxWords // are the same) and when allocating heap segments. If there is insufficient // space to satisfy the minimum it will return 0. PolyWord *MemMgr::AllocHeapSpace(POLYUNSIGNED minWords, POLYUNSIGNED &maxWords, bool doAllocation) { PLocker locker(&allocLock); // We try to distribute the allocations between the memory spaces // so that at the next GC we don't have all the most recent cells in // one space. The most recent cells will be more likely to survive a // GC so distibuting them improves the load balance for a multi-thread GC. nextAllocator++; if (nextAllocator > gMem.nlSpaces) nextAllocator = 0; for (unsigned j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[(j + nextAllocator) % gMem.nlSpaces]; if (space->allocationSpace) { POLYUNSIGNED available = space->freeSpace(); if (available > 0 && available >= minWords) { // Reduce the maximum value if we had less than that. if (available < maxWords) maxWords = available; PolyWord *result = space->lowerAllocPtr; // Return the address. if (doAllocation) space->lowerAllocPtr += maxWords; // Allocate it. return result; } } } // There isn't space in the existing areas - can we create a new area? // The reason we don't have enough space could simply be that we want to // allocate an object larger than the default space size. Try deleting // some other spaces to bring currentAllocSpace below spaceBeforeMinorGC - minWords. if (minWords > defaultSpaceSize && minWords < spaceBeforeMinorGC) RemoveExcessAllocation(spaceBeforeMinorGC - minWords); if (currentAllocSpace/* + minWords */ < spaceBeforeMinorGC) { // i.e. the current allocation space is less than the space allowed for the minor GC // but it may be that allocating this object will take us over the limit. We allow // that to happen so that we can successfully allocate very large objects even if // we have a new GC very shortly. POLYUNSIGNED spaceSize = defaultSpaceSize; if (minWords > spaceSize) spaceSize = minWords; // If we really want a large space. LocalMemSpace *space = CreateAllocationSpace(spaceSize); if (space == 0) return 0; // Can't allocate it // Allocate our space in this new area. POLYUNSIGNED available = space->freeSpace(); ASSERT(available >= minWords); if (available < maxWords) maxWords = available; PolyWord *result = space->lowerAllocPtr; // Return the address. if (doAllocation) space->lowerAllocPtr += maxWords; // Allocate it. return result; } return 0; // There isn't space even for the minimum. } // Check that we have sufficient space for an allocation to succeed. // Called from the GC to ensure that we will not get into an infinite // loop trying to allocate, failing and garbage-collecting again. bool MemMgr::CheckForAllocation(POLYUNSIGNED words) { POLYUNSIGNED allocated = 0; return AllocHeapSpace(words, allocated, false) != 0; } // Adjust the allocation area by removing free areas so that the total // size of the allocation area is less than the required value. This // is used after the quick GC and also if we need to allocate a large // object. void MemMgr::RemoveExcessAllocation(POLYUNSIGNED words) { // First remove any non-standard allocation areas. unsigned i; for (i = nlSpaces; i > 0; i--) { LocalMemSpace *space = lSpaces[i-1]; if (space->allocationSpace && space->allocatedSpace() == 0 && space->spaceSize() != defaultSpaceSize) DeleteLocalSpace(space); } for (i = nlSpaces; currentAllocSpace > words && i > 0; i--) { LocalMemSpace *space = lSpaces[i-1]; if (space->allocationSpace && space->allocatedSpace() == 0) DeleteLocalSpace(space); } } // Return number of words free in all allocation spaces. POLYUNSIGNED MemMgr::GetFreeAllocSpace() { POLYUNSIGNED freeSpace = 0; PLocker lock(&allocLock); for (unsigned j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; if (space->allocationSpace) freeSpace += space->freeSpace(); } return freeSpace; } StackSpace *MemMgr::NewStackSpace(POLYUNSIGNED size) { PLocker lock(&stackSpaceLock); try { StackSpace *space = new StackSpace; size_t iSpace = size*sizeof(PolyWord); space->bottom = (PolyWord*)osMemoryManager->Allocate(iSpace, PERMISSION_READ|PERMISSION_WRITE); if (space->bottom == 0) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New stack space: insufficient space\n"); delete space; return 0; } // The size may have been rounded up to a block boundary. size = iSpace/sizeof(PolyWord); space->top = space->bottom + size; space->spaceType = ST_STACK; space->isMutable = true; // Extend the permanent memory table and add this space to it. StackSpace **table = (StackSpace **)realloc(sSpaces, (nsSpaces+1) * sizeof(StackSpace *)); if (table == 0) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New stack space: table realloc failed\n"); delete space; return 0; } sSpaces = table; // Add the stack space to the tree. This ensures that operations such as // LocalSpaceForAddress will work for addresses within the stack. We can // get them in the RTS with functions such as quot_rem and exception stack. // It's not clear whether they really appear in the GC. try { AddTree(space); } catch (std::bad_alloc&) { RemoveTree(space); delete space; return 0; } sSpaces[nsSpaces++] = space; if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New stack space %p allocated at %p size %lu\n", space, space->bottom, space->spaceSize()); return space; } catch (std::bad_alloc&) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: New stack space: \"new\" failed\n"); return 0; } } // If checkmem is given write protect the immutable areas except during a GC. void MemMgr::ProtectImmutable(bool on) { if (debugOptions & DEBUG_CHECK_OBJECTS) { for (unsigned i = 0; i < nlSpaces; i++) { LocalMemSpace *space = lSpaces[i]; if (! space->isMutable) osMemoryManager->SetPermissions(space->bottom, (char*)space->top - (char*)space->bottom, on ? PERMISSION_READ|PERMISSION_EXEC : PERMISSION_READ|PERMISSION_EXEC|PERMISSION_WRITE); } } } bool MemMgr::GrowOrShrinkStack(TaskData *taskData, POLYUNSIGNED newSize) { StackSpace *space = taskData->stack; size_t iSpace = newSize*sizeof(PolyWord); PolyWord *newSpace = (PolyWord*)osMemoryManager->Allocate(iSpace, PERMISSION_READ|PERMISSION_WRITE); if (newSpace == 0) { if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Unable to change size of stack %p from %lu to %lu: insufficient space\n", space, space->spaceSize(), newSize); return false; } // The size may have been rounded up to a block boundary. newSize = iSpace/sizeof(PolyWord); try { AddTree(space, newSpace, newSpace+newSize); } catch (std::bad_alloc&) { RemoveTree(space, newSpace, newSpace+newSize); delete space; return 0; } taskData->CopyStackFrame(space->stack(), space->spaceSize(), (StackObject*)newSpace, newSize); if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Size of stack %p changed from %lu to %lu at %p\n", space, space->spaceSize(), newSize, newSpace); RemoveTree(space); // Remove it BEFORE freeing the space - another thread may allocate it PolyWord *oldBottom = space->bottom; size_t oldSize = (char*)space->top - (char*)space->bottom; space->bottom = newSpace; // Switch this before freeing - We could get a profile trap during the free space->top = newSpace+newSize; osMemoryManager->Free(oldBottom, oldSize); return true; } // Delete a stack when a thread has finished. // This can be called by an ML thread so needs an interlock. bool MemMgr::DeleteStackSpace(StackSpace *space) { PLocker lock(&stackSpaceLock); for (unsigned i = 0; i < nsSpaces; i++) { if (sSpaces[i] == space) { RemoveTree(space); delete space; nsSpaces--; while (i < nsSpaces) { sSpaces[i] = sSpaces[i+1]; i++; } if (debugOptions & DEBUG_MEMMGR) Log("MMGR: Deleted stack space %p\n", space); return true; } } ASSERT(false); // It should always be in the table. return false; } SpaceTreeTree::SpaceTreeTree(): SpaceTree(false) { for (unsigned i = 0; i < 256; i++) tree[i] = 0; } SpaceTreeTree::~SpaceTreeTree() { for (unsigned i = 0; i < 256; i++) { if (tree[i] && ! tree[i]->isSpace) delete(tree[i]); } } // Add and remove entries in the space tree. void MemMgr::AddTree(MemSpace *space, PolyWord *startS, PolyWord *endS) { // It isn't clear we need to lock here but it's probably sensible. PLocker lock(&spaceTreeLock); AddTreeRange(&spaceTree, space, (uintptr_t)startS, (uintptr_t)endS); } void MemMgr::RemoveTree(MemSpace *space, PolyWord *startS, PolyWord *endS) { PLocker lock(&spaceTreeLock); RemoveTreeRange(&spaceTree, space, (uintptr_t)startS, (uintptr_t)endS); } void MemMgr::AddTreeRange(SpaceTree **tt, MemSpace *space, uintptr_t startS, uintptr_t endS) { if (*tt == 0) *tt = new SpaceTreeTree; ASSERT(! (*tt)->isSpace); SpaceTreeTree *t = (SpaceTreeTree*)*tt; const unsigned shift = (sizeof(void*)-1) * 8; // Takes the high-order byte uintptr_t r = startS >> shift; ASSERT(r >= 0 && r < 256); const uintptr_t s = endS == 0 ? 256 : endS >> shift; ASSERT(s >= r && s <= 256); if (r == s) // Wholly within this entry AddTreeRange(&(t->tree[r]), space, startS << 8, endS << 8); else { // Deal with any remainder at the start. if ((r << shift) != startS) { AddTreeRange(&(t->tree[r]), space, startS << 8, 0 /*End of range*/); r++; } // Whole entries. while (r < s) { ASSERT(t->tree[r] == 0); t->tree[r] = space; r++; } // Remainder at the end. if ((s << shift) != endS) AddTreeRange(&(t->tree[r]), space, 0, endS << 8); } } // Remove an entry from the tree for a range. Strictly speaking we don't need the // space argument here but it's useful as a check. // This may be called to remove a partially installed structure if we have // run out of space in AddTreeRange. void MemMgr::RemoveTreeRange(SpaceTree **tt, MemSpace *space, uintptr_t startS, uintptr_t endS) { SpaceTreeTree *t = (SpaceTreeTree*)*tt; if (t == 0) return; // This can only occur if we're recovering. ASSERT(! t->isSpace); const unsigned shift = (sizeof(void*)-1) * 8; uintptr_t r = startS >> shift; const uintptr_t s = endS == 0 ? 256 : endS >> shift; if (r == s) RemoveTreeRange(&(t->tree[r]), space, startS << 8, endS << 8); else { // Deal with any remainder at the start. if ((r << shift) != startS) { RemoveTreeRange(&(t->tree[r]), space, startS << 8, 0); r++; } // Whole entries. while (r < s) { ASSERT(t->tree[r] == space || t->tree[r] == 0 /* Recovery only */); t->tree[r] = 0; r++; } // Remainder at the end. if ((s << shift) != endS) RemoveTreeRange(&(t->tree[r]), space, 0, endS << 8); } // See if the whole vector is now empty. for (unsigned j = 0; j < 256; j++) { if (t->tree[j]) return; // It's not empty - we're done. } delete(t); *tt = 0; } POLYUNSIGNED MemMgr::AllocatedInAlloc() { POLYUNSIGNED inAlloc = 0; for (unsigned i = 0; i < nlSpaces; i++) { LocalMemSpace *sp = lSpaces[i]; if (sp->allocationSpace) inAlloc += sp->allocatedSpace(); } return inAlloc; } // Report heap sizes and occupancy before and after GC void MemMgr::ReportHeapSizes(const char *phase) { POLYUNSIGNED alloc = 0, nonAlloc = 0, inAlloc = 0, inNonAlloc = 0; for (unsigned i = 0; i < nlSpaces; i++) { LocalMemSpace *sp = lSpaces[i]; if (sp->allocationSpace) { alloc += sp->spaceSize(); inAlloc += sp->allocatedSpace(); } else { nonAlloc += sp->spaceSize(); inNonAlloc += sp->allocatedSpace(); } } Log("Heap: %s Major heap used ", phase); LogSize(inNonAlloc); Log(" of "); LogSize(nonAlloc); Log(" (%1.0f%%). Alloc space used ", (float)inNonAlloc / (float)nonAlloc * 100.0F); LogSize(inAlloc); Log(" of "); LogSize(alloc); Log(" (%1.0f%%). Total space ", (float)inAlloc / (float)alloc * 100.0F); LogSize(spaceForHeap); Log(" %1.0f%% full.\n", (float)(inAlloc + inNonAlloc) / (float)spaceForHeap * 100.0F); } MemMgr gMem; // The one and only memory manager object polyml-5.6/libpolyml/memmgr.h000066400000000000000000000316071265146633400163610ustar00rootroot00000000000000/* Title: memmgr.h Memory segment manager Copyright (c) 2006-8, 2010-12 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MEMMGR_H #define MEMMGR_H #include "bitmap.h" #include "locking.h" // utility conversion macros #define Words_to_K(w) (w*sizeof(PolyWord))/1024 #define Words_to_M(w) (w*sizeof(PolyWord))/(1<<20) #define B_to_M(b) (b/(1<<20)) class ScanAddress; class GCTaskId; class TaskData; typedef enum { ST_IO, // The io area forms an interface with the RTS ST_PERMANENT, // Permanent areas are part of the object code // Also loaded saved state. ST_LOCAL, // Local heaps contain volatile data ST_EXPORT, // Temporary export area ST_STACK // ML Stack for a thread } SpaceType; // B-tree used in SpaceForAddress. Leaves are MemSpaces. class SpaceTree { public: SpaceTree(bool is): isSpace(is) { } virtual ~SpaceTree() {} bool isSpace; }; // A non-leaf node in the B-tree class SpaceTreeTree: public SpaceTree { public: SpaceTreeTree(); virtual ~SpaceTreeTree(); SpaceTree *tree[256]; }; // Base class for the various memory spaces. class MemSpace: public SpaceTree { protected: MemSpace(); virtual ~MemSpace(); public: SpaceType spaceType; bool isMutable; bool isOwnSpace; // True if this has been allocated. PolyWord *bottom; // Bottom of area PolyWord *top; // Top of area. POLYUNSIGNED spaceSize(void)const { return top-bottom; } // No of words // These next two are used in the GC to limit scanning for // weak refs. PolyWord *lowestWeak, *highestWeak; // Used when printing debugging info virtual const char *spaceTypeString() { return isMutable ? "mutable" : "immutable"; } friend class MemMgr; }; // Permanent memory space. Either linked into the executable program or // loaded from a saved state file. class PermanentMemSpace: public MemSpace { protected: PermanentMemSpace(): index(0), hierarchy(0), noOverwrite(false), byteOnly(false), topPointer(0) {} public: unsigned index; // An identifier for the space. Used when saving and loading. unsigned hierarchy; // The hierarchy number: 0=from executable, 1=top level saved state, ... bool noOverwrite; // Don't save this in deeper hierarchies. bool byteOnly; // Only contains byte data - no need to scan for addresses. // When exporting or saving state we copy data into a new area. // This area grows upwards unlike the local areas that grow down. PolyWord *topPointer; Bitmap shareBitmap; // Used in sharedata friend class MemMgr; }; #define NSTARTS 10 // Local areas can be garbage collected. class LocalMemSpace: public MemSpace { protected: LocalMemSpace(); virtual ~LocalMemSpace() {} bool InitSpace(POLYUNSIGNED size, bool mut); public: // Allocation. The minor GC allocates at the bottom of the areas while the // major GC and initial allocations are made at the top. The reason for this // is that it's only possible to scan objects from the bottom up and the minor // GC combines scanning with allocation whereas the major GC compacts from the // bottom into the top of an area. PolyWord *upperAllocPtr; // Allocation pointer. Objects are allocated AFTER this. PolyWord *lowerAllocPtr; // Allocation pointer. Objects are allocated BEFORE this. PolyWord *fullGCLowerLimit;// Lowest object in area before copying. PolyWord *fullGCRescanStart; // Upper and lower limits for rescan during mark phase. PolyWord *fullGCRescanEnd; PolyWord *partialGCTop; // Value of upperAllocPtr before the current partial GC. PolyWord *partialGCScan; // Scan pointer used in minor GC PolyWord *partialGCRootBase; // Start of the root objects. PolyWord *partialGCRootTop;// Value of lowerAllocPtr after the roots have been copied. PLock spaceLock; // Lock used to protect forwarding pointers GCTaskId *spaceOwner; // The thread that "owns" this space during a GC. Bitmap bitmap; /* bitmap with one bit for each word in the GC area. */ bool allocationSpace; // True if this is (mutable) space for initial allocation POLYUNSIGNED start[NSTARTS]; /* starting points for bit searches. */ unsigned start_index; /* last index used to index start array */ POLYUNSIGNED i_marked; /* count of immutable words marked. */ POLYUNSIGNED m_marked; /* count of mutable words marked. */ POLYUNSIGNED updated; /* count of words updated. */ POLYUNSIGNED allocatedSpace(void)const // Words allocated { return (top-upperAllocPtr) + (lowerAllocPtr-bottom); } POLYUNSIGNED freeSpace(void)const // Words free { return upperAllocPtr-lowerAllocPtr; } virtual const char *spaceTypeString() { return allocationSpace ? "allocation" : MemSpace::spaceTypeString(); } // Used when converting to and from bit positions in the bitmap POLYUNSIGNED wordNo(PolyWord *pt) { return pt - bottom; } PolyWord *wordAddr(POLYUNSIGNED bitno) { return bottom + bitno; } friend class MemMgr; }; class StackObject; // Abstract - Architecture specific // Stack spaces. These are managed by the thread module class StackSpace: public MemSpace { public: StackSpace() { isOwnSpace = true; } StackObject *stack()const { return (StackObject *)bottom; } }; class MemMgr { public: MemMgr(); ~MemMgr(); // Create a local space for initial allocation. LocalMemSpace *CreateAllocationSpace(POLYUNSIGNED size); // Create and initialise a new local space and add it to the table. LocalMemSpace *NewLocalSpace(POLYUNSIGNED size, bool mut); // Create an entry for a permanent space. PermanentMemSpace *NewPermanentSpace(PolyWord *base, POLYUNSIGNED words, unsigned flags, unsigned index, unsigned hierarchy = 0); // Create an entry for the IO space. MemSpace *InitIOSpace(PolyWord *base, POLYUNSIGNED words); // Delete a local space bool DeleteLocalSpace(LocalMemSpace *sp); // Allocate an area of the heap of at least minWords and at most maxWords. // This is used both when allocating single objects (when minWords and maxWords // are the same) and when allocating heap segments. If there is insufficient // space to satisfy the minimum it will return 0. Updates "maxWords" with // the space actually allocated PolyWord *AllocHeapSpace(POLYUNSIGNED minWords, POLYUNSIGNED &maxWords, bool doAllocation = true); PolyWord *AllocHeapSpace(POLYUNSIGNED words) { POLYUNSIGNED allocated = words; return AllocHeapSpace(words, allocated); } // Check that a subsequent allocation will succeed. Called from the GC to ensure bool CheckForAllocation(POLYUNSIGNED words); // If an allocation space has a lot of data left in it, particularly a single // large object we should turn it into a local area. void ConvertAllocationSpaceToLocal(LocalMemSpace *space); // Allocate space for the initial stack for a thread. The caller must // initialise the new stack. Returns 0 if allocation fails. StackSpace *NewStackSpace(POLYUNSIGNED size); // Adjust the space for a stack. Returns true if it succeeded. If it failed // it leaves the stack untouched. bool GrowOrShrinkStack(TaskData *taskData, POLYUNSIGNED newSize); // Delete a stack when a thread has finished. bool DeleteStackSpace(StackSpace *space); // Create and delete export spaces PermanentMemSpace *NewExportSpace(POLYUNSIGNED size, bool mut, bool noOv); void DeleteExportSpaces(void); bool PromoteExportSpaces(unsigned hierarchy); // Turn export spaces into permanent spaces. bool DemoteImportSpaces(void); // Turn previously imported spaces into local. PermanentMemSpace *SpaceForIndex(unsigned index) const; // Return the space for a given index // As a debugging check, write protect the immutable areas apart from during the GC. void ProtectImmutable(bool on); // Find a space that contains a given address. This is called for every cell // during a GC so needs to be fast., MemSpace *SpaceForAddress(const void *pt) const { uintptr_t t = (uintptr_t)pt; SpaceTree *tr = spaceTree; // Each level of the tree is either a leaf or a vector of trees. unsigned j = sizeof(void *)*8; for (;;) { if (tr == 0 || tr->isSpace) return (MemSpace*)tr; j -= 8; tr = ((SpaceTreeTree*)tr)->tree[(t >> j) & 0xff]; } return 0; } // Find a local address for a space. LocalMemSpace *LocalSpaceForAddress(const void *pt) const { MemSpace *s = SpaceForAddress(pt); if (s != 0 && s->spaceType == ST_LOCAL) return (LocalMemSpace*)s; else return 0; } bool IsIOPointer(const void *pt) const { return pt >= ioSpace->bottom && pt < ioSpace->top; } bool IsLocalMutable(const void *pt) const { LocalMemSpace *space = LocalSpaceForAddress(pt); return space != 0 && space->isMutable; } void SetReservation(POLYUNSIGNED words) { reservedSpace = words; } // In several places we assume that segments are filled with valid // objects. This fills unused memory with one or more "byte" objects. void FillUnusedSpace(PolyWord *base, POLYUNSIGNED words); // Return number of words of free space for stats. POLYUNSIGNED GetFreeAllocSpace(); // Remove unused local areas. void RemoveEmptyLocals(); // Remove unused allocation areas to reduce the space below the limit. void RemoveExcessAllocation(POLYUNSIGNED words); void RemoveExcessAllocation() { RemoveExcessAllocation(spaceBeforeMinorGC); } MemSpace *IoSpace() { return ioSpace; } // Return pointer to the IO space. MemSpace *ioSpace; // The IO space // Table for permanent spaces PermanentMemSpace **pSpaces; unsigned npSpaces; // Table for local spaces LocalMemSpace **lSpaces; unsigned nlSpaces; // Table for export spaces PermanentMemSpace **eSpaces; unsigned neSpaces; // Table for stack spaces StackSpace **sSpaces; unsigned nsSpaces; PLock stackSpaceLock; // Storage manager lock. PLock allocLock; unsigned nextIndex; // Used when allocating new permanent spaces. POLYUNSIGNED SpaceBeforeMinorGC() const { return spaceBeforeMinorGC; } POLYUNSIGNED SpaceForHeap() const { return spaceForHeap; } void SetSpaceBeforeMinorGC(POLYUNSIGNED minorSize) { spaceBeforeMinorGC = minorSize; } void SetSpaceForHeap(POLYUNSIGNED heapSize) { spaceForHeap = heapSize; } POLYUNSIGNED CurrentAllocSpace() { return currentAllocSpace; } POLYUNSIGNED AllocatedInAlloc(); POLYUNSIGNED CurrentHeapSize() { return currentHeapSize; } POLYUNSIGNED DefaultSpaceSize() const { return defaultSpaceSize; } void ReportHeapSizes(const char *phase); private: bool AddLocalSpace(LocalMemSpace *space); POLYUNSIGNED reservedSpace; unsigned nextAllocator; // The default size in words when creating new segments. POLYUNSIGNED defaultSpaceSize; // The number of words that can be used for initial allocation. POLYUNSIGNED spaceBeforeMinorGC; // The number of words that can be used for the heap POLYUNSIGNED spaceForHeap; // The current sizes of the allocation space and the total heap size. POLYUNSIGNED currentAllocSpace, currentHeapSize; // LocalSpaceForAddress is a hot-spot so we use a B-tree to convert addresses; SpaceTree *spaceTree; PLock spaceTreeLock; void AddTree(MemSpace *space) { AddTree(space, space->bottom, space->top); } void RemoveTree(MemSpace *space) { RemoveTree(space, space->bottom, space->top); } void AddTree(MemSpace *space, PolyWord *startS, PolyWord *endS); void RemoveTree(MemSpace *space, PolyWord *startS, PolyWord *endS); void AddTreeRange(SpaceTree **t, MemSpace *space, uintptr_t startS, uintptr_t endS); void RemoveTreeRange(SpaceTree **t, MemSpace *space, uintptr_t startS, uintptr_t endS); }; extern MemMgr gMem; #endif polyml-5.6/libpolyml/mpoly.cpp000066400000000000000000000476211265146633400165730ustar00rootroot00000000000000/* Title: Main program Copyright (c) 2000 Cambridge University Technical Services Limited Further development copyright David C.J. Matthews 2001-12, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STDARG_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #else #define _T(x) x #define _tcslen strlen #define _tcstol strtol #define _tcsncmp strncmp #define _tcschr strchr #endif #include "globals.h" #include "sys.h" #include "gc.h" #include "heapsizing.h" #include "run_time.h" #include "machine_dep.h" #include "version.h" #include "diagnostics.h" #include "processes.h" #include "mpoly.h" #include "scanaddrs.h" #include "save_vec.h" #include "../polyexports.h" #include "memmgr.h" #include "pexport.h" #include "polystring.h" #include "statistics.h" #include "noreturn.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include "Console.h" static const TCHAR *lpszServiceName = 0; // DDE service name #endif FILE *polyStdout, *polyStderr; // Redirected in the Windows GUI static void InitHeaderFromExport(exportDescription *exports); NORETURNFN(static void Usage(const char *message, ...)); // Return the entry in the io vector corresponding to the Poly system call. PolyWord *IoEntry(unsigned sysOp) { MemSpace *space = gMem.IoSpace(); return space->bottom + sysOp * IO_SPACING; } struct _userOptions userOptions; time_t exportTimeStamp; enum { OPT_HEAPMIN, OPT_HEAPMAX, OPT_HEAPINIT, OPT_GCPERCENT, OPT_RESERVE, OPT_GCTHREADS, OPT_DEBUGOPTS, OPT_DEBUGFILE, OPT_DDESERVICE, OPT_CODEPAGE, OPT_REMOTESTATS }; static struct __argtab { const TCHAR *argName; const char *argHelp; unsigned argKey; } argTable[] = { { _T("-H"), "Initial heap size (MB)", OPT_HEAPINIT }, { _T("--minheap"), "Minimum heap size (MB)", OPT_HEAPMIN }, { _T("--maxheap"), "Maximum heap size (MB)", OPT_HEAPMAX }, { _T("--gcpercent"), "Target percentage time in GC (1-99)", OPT_GCPERCENT }, { _T("--stackspace"), "Space to reserve for thread stacks and C++ heap(MB)", OPT_RESERVE }, { _T("--gcthreads"), "Number of threads to use for garbage collection", OPT_GCTHREADS }, { _T("--debug"), "Debug options: checkmem, gc, x", OPT_DEBUGOPTS }, { _T("--logfile"), "Logging file (default is to log to stdout)", OPT_DEBUGFILE }, #if (defined(_WIN32) && ! defined(__CYGWIN__)) #ifdef UNICODE { _T("--codepage"), "Code-page to use for file-names etc in Windows", OPT_CODEPAGE }, #endif { _T("-pServiceName"), "DDE service name for remote interrupt in Windows", OPT_DDESERVICE } #else { _T("--exportstats"), "Enable another process to read the statistics", OPT_REMOTESTATS } #endif }; static struct __debugOpts { const TCHAR *optName; const char *optHelp; unsigned optKey; } debugOptTable[] = { { _T("checkmem"), "Perform additional debugging checks on memory", DEBUG_CHECK_OBJECTS }, { _T("gc"), "Log summary garbage-collector information", DEBUG_GC }, { _T("gcdetail"), "Log detailed garbage-collector information", DEBUG_GC_DETAIL }, { _T("memmgr"), "Memory manager information", DEBUG_MEMMGR }, { _T("threads"), "Thread related information", DEBUG_THREADS }, { _T("gctasks"), "Log multi-thread GC information", DEBUG_GCTASKS }, { _T("heapsize"), "Log heap resizing data", DEBUG_HEAPSIZE }, { _T("x"), "Log X-windows information", DEBUG_X}, { _T("sharing"), "Information from PolyML.shareCommonData", DEBUG_SHARING}, { _T("locks"), "Information about contended locks", DEBUG_CONTENTION}, { _T("rts"), "General run-time system calls", DEBUG_RTSCALLS} }; // Parse a parameter that is meant to be a size. Returns the value as a number // of kilobytes. POLYUNSIGNED parseSize(const TCHAR *p, const TCHAR *arg) { POLYUNSIGNED result = 0; if (*p < '0' || *p > '9') // There must be at least one digit Usage("Incomplete %s option\n", arg); while (true) { result = result*10 + *p++ - '0'; if (*p == 0) { // The default is megabytes result *= 1024; break; } if (*p == 'G' || *p == 'g') { result *= 1024 * 1024; p++; break; } if (*p == 'M' || *p == 'm') { result *= 1024; p++; break; } if (*p == 'K' || *p == 'k') { p++; break; } if (*p < '0' || *p > '9') break; } if (*p != 0) Usage("Malformed %s option\n", arg); // Check that the number of kbytes is less than the address space. // The value could overflow when converted to bytes. if (result >= ((POLYUNSIGNED)1 << (SIZEOF_VOIDP*8 - 10))) Usage("Value of %s option is too large\n", arg); return result; } /* In the Windows version this is called from WinMain in Console.c */ int polymain(int argc, TCHAR **argv, exportDescription *exports) { POLYUNSIGNED minsize=0, maxsize=0, initsize=0; unsigned gcpercent=0; /* Get arguments. */ memset(&userOptions, 0, sizeof(userOptions)); /* Reset it */ userOptions.gcthreads = 0; // Default multi-threaded if (polyStdout == 0) polyStdout = stdout; if (polyStderr == 0) polyStderr = stderr; // Get the program name for CommandLine.name. This is allowed to be a full path or // just the last component so we return whatever the system provides. if (argc > 0) userOptions.programName = argv[0]; else userOptions.programName = _T(""); // Set it to a valid empty string TCHAR *importFileName = 0; debugOptions = 0; userOptions.user_arg_count = 0; userOptions.user_arg_strings = (TCHAR**)malloc(argc * sizeof(TCHAR*)); // Enough room for all of them // Process the argument list removing those recognised by the RTS and adding the // remainder to the user argument list. for (int i = 1; i < argc; i++) { if (argv[i][0] == '-') { bool argUsed = false; for (unsigned j = 0; j < sizeof(argTable)/sizeof(argTable[0]); j++) { size_t argl = _tcslen(argTable[j].argName); if (_tcsncmp(argv[i], argTable[j].argName, argl) == 0) { const TCHAR *p = 0; TCHAR *endp = 0; if (argTable[j].argKey != OPT_REMOTESTATS) { if (_tcslen(argv[i]) == argl) { // If it has used all the argument pick the next i++; p = argv[i]; } else { p = argv[i]+argl; if (*p == '=') p++; // Skip an equals sign } if (i >= argc) Usage("Incomplete %s option\n", argTable[j].argName); } switch (argTable[j].argKey) { case OPT_HEAPMIN: minsize = parseSize(p, argTable[j].argName); break; case OPT_HEAPMAX: maxsize = parseSize(p, argTable[j].argName); break; case OPT_HEAPINIT: initsize = parseSize(p, argTable[j].argName); break; case OPT_GCPERCENT: gcpercent = _tcstol(p, &endp, 10); if (*endp != '\0') Usage("Malformed %s option\n", argTable[j].argName); if (gcpercent < 1 || gcpercent > 99) { Usage("%s argument must be between 1 and 99\n", argTable[j].argName); gcpercent = 0; } break; case OPT_RESERVE: { POLYUNSIGNED reserve = parseSize(p, argTable[j].argName); if (reserve != 0) gHeapSizeParameters.SetReservation(reserve); break; } case OPT_GCTHREADS: userOptions.gcthreads = _tcstol(p, &endp, 10); if (*endp != '\0') Usage("Incomplete %s option\n", argTable[j].argName); break; case OPT_DEBUGOPTS: while (*p != '\0') { // Debug options are separated by commas bool optFound = false; const TCHAR *q = _tcschr(p, ','); if (q == NULL) q = p+_tcslen(p); for (unsigned k = 0; k < sizeof(debugOptTable)/sizeof(debugOptTable[0]); k++) { if (_tcslen(debugOptTable[k].optName) == (size_t)(q-p) && _tcsncmp(p, debugOptTable[k].optName, q-p) == 0) { debugOptions |= debugOptTable[k].optKey; optFound = true; } } if (! optFound) Usage("Unknown argument to --debug\n"); if (*q == ',') p = q+1; else p = q; } break; case OPT_DEBUGFILE: SetLogFile(p); break; #if (defined(_WIN32) && ! defined(__CYGWIN__)) case OPT_DDESERVICE: // Set the name for the DDE service. This allows the caller to specify the // service name to be used to send Interrupt "signals". lpszServiceName = p; break; #if (defined(UNICODE)) case OPT_CODEPAGE: if (! setWindowsCodePage(p)) Usage("Unknown argument to --codepage. Use code page number or CP_ACP, CP_UTF8.\n"); break; #endif #endif case OPT_REMOTESTATS: // If set we export the statistics on Unix. globalStats.exportStats = true; break; } argUsed = true; break; } } if (! argUsed) // Add it to the user args. userOptions.user_arg_strings[userOptions.user_arg_count++] = argv[i]; } else if (exports == 0 && importFileName == 0) importFileName = argv[i]; else userOptions.user_arg_strings[userOptions.user_arg_count++] = argv[i]; } if (exports == 0 && importFileName == 0) Usage("Missing import file name\n"); // If the maximum is provided it must be not less than the minimum. if (maxsize != 0 && maxsize < minsize) Usage("Minimum heap size must not be more than maximum size\n"); // The initial size must be not more than the maximum if (maxsize != 0 && maxsize < initsize) Usage("Initial heap size must not be more than maximum size\n"); // The initial size must be not less than the minimum if (initsize != 0 && initsize < minsize) Usage("Initial heap size must not be less than minimum size\n"); if (userOptions.gcthreads == 0) { // If the gcthreads option is missing or zero the default is to try to // use as many threads as there are physical processors. The result may // be zero in which case we use the number of processors. Because memory // bandwidth is a limiting factor we want to avoid muliple GC threads on // hyperthreaded "processors". userOptions.gcthreads = NumberOfPhysicalProcessors(); if (userOptions.gcthreads == 0) userOptions.gcthreads = NumberOfProcessors(); } // Set the heap size if it has been provided otherwise use the default. gHeapSizeParameters.SetHeapParameters(minsize, maxsize, initsize, gcpercent); #if (defined(_WIN32) && ! defined(__CYGWIN__)) SetupDDEHandler(lpszServiceName); // Windows: Start the DDE handler now we processed any service name. #endif // Initialise the run-time system before creating the heap. InitModules(); CreateHeap(); PolyObject *rootFunction = 0; if (exports != 0) { InitHeaderFromExport(exports); rootFunction = (PolyObject *)exports->rootFunction; } else { if (importFileName != 0) rootFunction = ImportPortable(importFileName); if (rootFunction == 0) exit(1); } /* Initialise the interface vector. */ machineDependent->InitInterfaceVector(); /* machine dependent entries. */ // This word has a zero value and is used for null strings. add_word_to_io_area(POLY_SYS_emptystring, PolyWord::FromUnsigned(0)); // This is used to represent zero-sized vectors. // N.B. This assumes that the word before is zero because it's // actually the length word we want to be zero here. add_word_to_io_area(POLY_SYS_nullvector, PolyWord::FromUnsigned(0)); /* The standard input and output streams are persistent i.e. references to the the standard input in one session will refer to the standard input in the next. */ add_word_to_io_area(POLY_SYS_stdin, PolyWord::FromUnsigned(0)); add_word_to_io_area(POLY_SYS_stdout, PolyWord::FromUnsigned(1)); add_word_to_io_area(POLY_SYS_stderr, PolyWord::FromUnsigned(2)); StartModules(); // Set up the initial process to run the root function. processes->BeginRootThread(rootFunction); finish(0); /*NOTREACHED*/ return 0; /* just to keep lint happy */ } void Uninitialise(void) // Close down everything and free all resources. Stop any threads or timers. { StopModules(); } void finish (int n) { // Make sure we don't get any interrupts once the destructors are // applied to globals or statics. Uninitialise(); #if (defined(_WIN32) && ! defined(__CYGWIN__)) ExitThread(n); #else exit (n); #endif } // Print a message and exit if an argument is malformed. void Usage(const char *message, ...) { va_list vl; fprintf(polyStdout, "\n"); va_start(vl, message); vfprintf(polyStdout, message, vl); va_end(vl); for (unsigned j = 0; j < sizeof(argTable)/sizeof(argTable[0]); j++) { #if (defined(_WIN32) && defined(UNICODE)) fprintf(polyStdout, "%S <%s>\n", argTable[j].argName, argTable[j].argHelp); #else fprintf(polyStdout, "%s <%s>\n", argTable[j].argName, argTable[j].argHelp); #endif } fprintf(polyStdout, "Debug options:\n"); for (unsigned k = 0; k < sizeof(debugOptTable)/sizeof(debugOptTable[0]); k++) { #if (defined(_WIN32) && defined(UNICODE)) fprintf(polyStdout, "%S <%s>\n", debugOptTable[k].optName, debugOptTable[k].optHelp); #else fprintf(polyStdout, "%s <%s>\n", debugOptTable[k].optName, debugOptTable[k].optHelp); #endif } fflush(polyStdout); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (useConsole) { MessageBox(hMainWindow, _T("Poly/ML has exited"), _T("Poly/ML"), MB_OK); } #endif exit (1); } // Return a string containing the argument names. Can be printed out in response // to a --help argument. It is up to the ML application to do that since it may well // want to produce information about any arguments it chooses to process. char *RTSArgHelp(void) { static char buff[2000]; char *p = buff; for (unsigned j = 0; j < sizeof(argTable)/sizeof(argTable[0]); j++) { #if (defined(_WIN32) && defined(UNICODE)) int spaces = sprintf(p, "%S <%s>\n", argTable[j].argName, argTable[j].argHelp); #else int spaces = sprintf(p, "%s <%s>\n", argTable[j].argName, argTable[j].argHelp); #endif p += spaces; } { int spaces = sprintf(p, "Debug options:\n"); p += spaces; } for (unsigned k = 0; k < sizeof(debugOptTable)/sizeof(debugOptTable[0]); k++) { #if (defined(_WIN32) && defined(UNICODE)) int spaces = sprintf(p, "%S <%s>\n", debugOptTable[k].optName, debugOptTable[k].optHelp); #else int spaces = sprintf(p, "%s <%s>\n", debugOptTable[k].optName, debugOptTable[k].optHelp); #endif p += spaces; } ASSERT((unsigned)(p - buff) < (unsigned)sizeof(buff)); return buff; } void InitHeaderFromExport(exportDescription *exports) { // Check the structure sizes stored in the export structure match the versions // used in this library. if (exports->structLength != sizeof(exportDescription) || exports->memTableSize != sizeof(memoryTableEntry) || exports->rtsVersion < FIRST_supported_version || exports->rtsVersion > LAST_supported_version) { #if (FIRST_supported_version == LAST_supported_version) Exit("The exported object file has version %0.2f but this library supports %0.2f", ((float)exports->rtsVersion) / 100.0, ((float)FIRST_supported_version) / 100.0); #else Exit("The exported object file has version %0.2f but this library supports %0.2f-%0.2f", ((float)exports->rtsVersion) / 100.0, ((float)FIRST_supported_version) / 100.0, ((float)LAST_supported_version) / 100.0); #endif } // We could also check the RTS version and the architecture. exportTimeStamp = exports->timeStamp; // Needed for load and save. memoryTableEntry *memTable = exports->memTable; for (unsigned i = 0; i < exports->memTableEntries; i++) { // Construct a new space for each of the entries. if (i == exports->ioIndex) { if (gMem.InitIOSpace((PolyWord*)memTable[i].mtAddr, memTable[i].mtLength/sizeof(PolyWord)) == 0) Exit("Unable to initialise the memory space"); } else { if (gMem.NewPermanentSpace( (PolyWord*)memTable[i].mtAddr, memTable[i].mtLength/sizeof(PolyWord), (unsigned)memTable[i].mtFlags, (unsigned)memTable[i].mtIndex) == 0) Exit("Unable to initialise a permanent memory space"); } } } polyml-5.6/libpolyml/mpoly.h000066400000000000000000000032051265146633400162260ustar00rootroot00000000000000/* Title: exports signature for mpoly.c Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development copyright David C.J. Matthews 2001-12, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _MPOLY_H_DEFINED #define _MPOLY_H_DEFINED #ifdef HAVE_TCHAR_H #include #else typedef char TCHAR; #endif #include "noreturn.h" #include "../polyexports.h" extern struct _userOptions { unsigned user_arg_count; TCHAR **user_arg_strings; const TCHAR *programName; unsigned gcthreads; // Number of threads to use for gc } userOptions; class PolyWord; // Return the entry in the io vector corresponding to the Poly system call. extern PolyWord *IoEntry(unsigned SYS_op); NORETURNFN(extern void finish(int n)); extern char *RTSArgHelp(void); extern time_t exportTimeStamp; #if (defined(_WIN32) && ! defined(__CYGWIN__)) extern int polymain(int argc, TCHAR **argv, exportDescription *exports); #endif #endif /* _MPOLY_H_DEFINED */ polyml-5.6/libpolyml/network.cpp000066400000000000000000001650421265146633400171220ustar00rootroot00000000000000/* Title: Network functions. Copyright (c) 2000-7 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_NETINET_TCP_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #ifdef HAVE_SYS_UN_H #include #endif #ifdef HAVE_SYS_FILIO_H #include #endif #ifdef HAVE_SYS_SOCKIO_H #include #endif #ifdef HAVE_SYS_SELECT_H #include #endif #ifndef HAVE_SOCKLEN_T typedef int socklen_t; #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #endif #ifdef HAVE_WINDOWS_H #include #endif #include "globals.h" #include "gc.h" #include "arb.h" #include "run_time.h" #include "mpoly.h" #include "processes.h" #include "network.h" #include "io_internal.h" #include "sys.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "machine_dep.h" #include "errors.h" #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif #define STREAMID(x) (DEREFSTREAMHANDLE(x)->streamNo) #define SAVE(x) taskData->saveVec.push(x) #define ALLOC(n) alloc_and_save(taskData, n) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) #if (defined(_WIN32) && ! defined(__CYGWIN__)) static int winsock_init = 0; /* Check that it has been initialised. */ #else #define INVALID_SOCKET (-1) #define SOCKET_ERROR (-1) #endif #ifndef HAVE_SOCKLEN_T typedef int socklen_t; // This must be int for Windows at least #endif #ifndef SHUT_RD #define SHUT_RD 0 #endif #ifndef SHUT_WR #define SHUT_WR 1 #endif #ifndef SHUT_RDWR #define SHUT_RDWR 2 #endif /* Address families. Although this table is in ascending numerical order of address family nothing depends on that. The only requirement is that "INET" => AF_INET must always be present and "UNIX" => AF_UNIX must be present on Unix. Other entries are entirely optional and are for amusement only. */ struct af_tab_struct { const char *af_name; int af_num; } af_table[] = { #ifdef AF_UNIX { "UNIX", AF_UNIX }, /* This is nearly always there. */ #endif #ifdef AF_LOCAL { "LOCAL", AF_LOCAL }, #endif { "INET", AF_INET }, /* This one should always be there. */ #ifdef AF_IMPLINK { "IMPLINK", AF_IMPLINK }, #endif #ifdef AF_PUP { "PUP", AF_PUP }, #endif #ifdef AF_CHAOS { "CHAOS", AF_CHAOS }, #endif #ifdef AF_IPX { "IPX", AF_IPX }, #endif #ifdef AF_NS { "NS", AF_NS }, #endif #ifdef AF_ISO { "ISO", AF_ISO }, #endif #ifdef AF_OSI { "OSI", AF_OSI }, #endif #ifdef AF_ECMA { "ECMA", AF_ECMA }, #endif #ifdef AF_DATAKIT { "DATAKIT", AF_DATAKIT }, #endif #ifdef AF_CCITT { "CCITT", AF_CCITT }, #endif #ifdef AF_SNA { "SNA", AF_SNA }, #endif #ifdef AF_DECnet { "DECnet", AF_DECnet }, #endif #ifdef AF_DLI { "DLI", AF_DLI }, #endif #ifdef AF_LAT { "LAT", AF_LAT }, #endif #ifdef AF_HYLINK { "HYLINK", AF_HYLINK }, #endif #ifdef AF_APPLETALK { "APPLETALK", AF_APPLETALK }, #endif #ifdef AF_NETBIOS { "NETBIOS", AF_NETBIOS }, #endif #ifdef AF_ROUTE { "ROUTE", AF_ROUTE }, #endif #ifdef AF_VOICEVIEW { "VOICEVIEW", AF_VOICEVIEW }, #endif #ifdef AF_FIREFOX { "FIREFOX", AF_FIREFOX }, #endif #ifdef AF_BAN { "BAN", AF_BAN }, #endif #ifdef AF_LINK { "LINK", AF_LINK }, #endif #ifdef AF_COIP { "COIP", AF_COIP }, #endif #ifdef AF_CNT { "CNT", AF_CNT }, #endif #ifdef AF_SIP { "SIP", AF_SIP }, #endif #ifdef AF_ISDN { "ISDN", AF_ISDN }, #endif #ifdef AF_E164 { "E164", AF_E164 }, #endif #ifdef AF_INET6 { "INET6", AF_INET6 }, #endif #ifdef AF_NATM { "NATM", AF_NATM }, #endif #ifdef AF_ATM { "ATM", AF_ATM }, #endif #ifdef AF_NETGRAPH { "NETGRAPH", AF_NETGRAPH }, #endif }; /* Socket types. Only STREAM and DGRAM are required. */ struct sk_tab_struct { const char *sk_name; int sk_num; } sk_table[] = { { "STREAM", SOCK_STREAM }, { "DGRAM", SOCK_DGRAM }, { "RAW", SOCK_RAW }, { "RDM", SOCK_RDM }, { "SEQPACKET", SOCK_SEQPACKET } }; static Handle makeHostEntry(TaskData *taskData, struct hostent *host); static Handle makeProtoEntry(TaskData *taskData, struct protoent *proto); static Handle makeServEntry(TaskData *taskData, struct servent *proto); static Handle mkAftab(TaskData *taskData, void*, char *p); static Handle mkSktab(TaskData *taskData, void*, char *p); static Handle setSocketOption(TaskData *taskData, Handle args, int level, int opt); static Handle getSocketOption(TaskData *taskData, Handle args, int level, int opt); static Handle getSocketInt(TaskData *taskData, Handle args, int level, int opt); static Handle selectCall(TaskData *taskData, Handle args, int blockType); /* If these are not defined define them as negative because GetError returns negative values for socket library errors which do not have equivalents as errno-style errors. */ #ifndef EWOULDBLOCK #define EWOULDBLOCK (-WSAEWOULDBLOCK) #endif #ifndef EINPROGRESS #define EINPROGRESS EWOULDBLOCK #endif #ifndef EMFILE #define EMFILE (-WSAEMFILE) #endif #ifndef EINTR #define EINTR (-WSAEINTR) #endif #ifndef EBADF #define EBADF (-WSAEBADF) #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* To allow for portable code we map Windows socket errors to errno-style errors if there is a suitable entry in errno.h. If there isn't we simply return the negative value and handle it later. N.B. WSAEWOULDBLOCK is one of those which does not have an equivalent. (It does seem to be defined in Windows CE). */ int mapWindowsErrorCode(int err) { #ifdef EWOULDBLOCK // This is very common so we treat it specially. if (err == WSAEWOULDBLOCK) return EWOULDBLOCK; #endif const char *errText = stringFromErrorCode(-err); int newErr = 0; if (errText != 0 && errorCodeFromString(errText, &newErr)) return newErr; else return -err; } static int GetError() { return mapWindowsErrorCode(WSAGetLastError()); } #define GETERROR (GetError()) #define MAPERROR(x) (mapWindowsErrorCode(x)) #else #define GETERROR (errno) #define MAPERROR(x) (x) #endif // Wait until "select" returns. In Windows this is used only for networking. class WaitSelect: public Waiter { public: WaitSelect(); virtual void Wait(unsigned maxMillisecs); void SetRead(SOCKET fd) { FD_SET(fd, &readSet); } void SetWrite(SOCKET fd) { FD_SET(fd, &writeSet); } void SetExcept(SOCKET fd) { FD_SET(fd, &exceptSet); } // Save the result of the select call and any associated error int SelectResult(void) { return selectResult; } int SelectError(void) { return errorResult; } private: fd_set readSet, writeSet, exceptSet; int selectResult; int errorResult; }; WaitSelect::WaitSelect() { FD_ZERO(&readSet); FD_ZERO(&writeSet); FD_ZERO(&exceptSet); selectResult = 0; errorResult = 0; } void WaitSelect::Wait(unsigned maxMillisecs) { struct timeval toWait = { 0, 0 }; toWait.tv_sec = maxMillisecs / 1000; toWait.tv_usec = (maxMillisecs % 1000) * 1000; selectResult = select(FD_SETSIZE, &readSet, &writeSet, &exceptSet, &toWait); if (selectResult < 0) errorResult = GETERROR; } class WaitNet: public WaitSelect { public: WaitNet(SOCKET sock, bool isOOB = false); }; // Use "select" in both Windows and Unix. In Windows that means we // don't watch hWakeupEvent but that's only a hint. WaitNet::WaitNet(SOCKET sock, bool isOOB) { if (isOOB) SetExcept(sock); else SetRead(sock); } // Wait for a socket to be free to write. class WaitNetSend: public WaitSelect { public: WaitNetSend(SOCKET sock) { SetWrite(sock); } }; Handle Net_dispatch_c(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORDHANDLE(code)); TryAgain: // Used for various retries. // N.B. If we call ThreadPause etc we may GC. We MUST reload any handles so for // safety we always come back here. switch (c) { case 0: { /* Get the current host name. */ char hostName[MAXHOSTNAMELEN]; if (gethostname(hostName, MAXHOSTNAMELEN) != 0) raise_syscall(taskData, "gethostname failed", GETERROR); return (SAVE(C_string_to_Poly(taskData, hostName))); } case 1: { /* Look up a host name. */ char hostName[MAXHOSTNAMELEN]; POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), hostName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Host name too long", ENAMETOOLONG); struct hostent *host = gethostbyname(hostName); if (host == NULL) raise_syscall(taskData, "gethostbyname failed", GETERROR); return makeHostEntry(taskData, host); } case 2: { /* Look up entry by address. */ unsigned long addr = htonl(get_C_unsigned(taskData, DEREFWORDHANDLE(args))); struct hostent *host; /* Look up a host name given an address. */ host = gethostbyaddr((char*)&addr, sizeof(addr), AF_INET); if (host == NULL) raise_syscall(taskData, "gethostbyaddr failed", GETERROR); return makeHostEntry(taskData, host); } case 3: { /* Look up protocol entry. */ char protoName[MAXHOSTNAMELEN]; POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), protoName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Protocol name too long", ENAMETOOLONG); struct protoent *proto = getprotobyname(protoName); if (proto == NULL) raise_syscall(taskData, "getprotobyname failed", GETERROR); return makeProtoEntry(taskData, proto); } case 4: { /* Look up protocol entry. */ struct protoent *proto; int pNum = get_C_int(taskData, DEREFWORDHANDLE(args)); proto = getprotobynumber(pNum); if (proto == NULL) raise_syscall(taskData, "getprotobynumber failed", GETERROR); return makeProtoEntry(taskData, proto); } case 5: { /* Get service given service name only. */ char servName[MAXHOSTNAMELEN]; POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), servName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Service name too long", ENAMETOOLONG); struct servent *serv = getservbyname (servName, NULL); if (serv == NULL) raise_syscall(taskData, "getservbyname failed", GETERROR); return makeServEntry(taskData, serv); } case 6: { /* Get service given service name and protocol name. */ char servName[MAXHOSTNAMELEN], protoName[MAXHOSTNAMELEN]; POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(0), servName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Service name too long", ENAMETOOLONG); length = Poly_string_to_C(args->WordP()->Get(1), protoName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Protocol name too long", ENAMETOOLONG); struct servent *serv = getservbyname (servName, protoName); if (serv == NULL) raise_syscall(taskData, "getservbyname failed", GETERROR); return makeServEntry(taskData, serv); } case 7: { /* Get service given port number only. */ struct servent *serv; long port = htons(get_C_ushort(taskData, DEREFWORDHANDLE(args))); serv = getservbyport(port, NULL); if (serv == NULL) raise_syscall(taskData, "getservbyport failed", GETERROR); return makeServEntry(taskData, serv); } case 8: { /* Get service given port number and protocol name. */ char protoName[MAXHOSTNAMELEN]; struct servent *serv; long port = htons(get_C_ushort(taskData, DEREFHANDLE(args)->Get(0))); POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), protoName, MAXHOSTNAMELEN); if (length > MAXHOSTNAMELEN) raise_syscall(taskData, "Protocol name too long", ENAMETOOLONG); serv = getservbyport (port, protoName); if (serv == NULL) raise_syscall(taskData, "getservbyport failed", GETERROR); return makeServEntry(taskData, serv); } // 9 and 10 were used for the NetDB structure which was removed from // the basis library a long time ago. case 11: { /* Return a list of known address families. */ return makeList(taskData, sizeof(af_table)/sizeof(af_table[0]), (char*)af_table, sizeof(af_table[0]), 0, mkAftab); } case 12: { /* Return a list of known socket types. */ return makeList(taskData, sizeof(sk_table)/sizeof(sk_table[0]), (char*)sk_table, sizeof(sk_table[0]), 0, mkSktab); } case 13: /* Return the "any" internet address. */ return Make_arbitrary_precision(taskData, INADDR_ANY); case 14: /* Create a socket */ { Handle str_token = make_stream_entry(taskData); PIOSTRUCT strm; unsigned stream_no = STREAMID(str_token); int af = get_C_int(taskData, DEREFHANDLE(args)->Get(0)); int type = get_C_int(taskData, DEREFHANDLE(args)->Get(1)); int proto = get_C_int(taskData, DEREFHANDLE(args)->Get(2)); unsigned long onOff = 1; SOCKET skt = socket(af, type, proto); if (skt == INVALID_SOCKET) { free_stream_entry(stream_no); switch (GETERROR) { case EMFILE: /* too many open files */ { if (emfileFlag) /* Previously had an EMFILE error. */ raise_syscall(taskData, "socket failed", EMFILE); emfileFlag = true; FullGC(taskData); /* May clear emfileFlag if we close a file. */ goto TryAgain; } case EINTR: goto TryAgain; default: raise_syscall(taskData, "socket failed", GETERROR); } } /* Set the socket to non-blocking mode. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (ioctlsocket(skt, FIONBIO, &onOff) != 0) #else if (ioctl(skt, FIONBIO, &onOff) < 0) #endif { free_stream_entry(stream_no); #if (defined(_WIN32) && ! defined(__CYGWIN__)) closesocket(skt); #else close(skt); #endif raise_syscall(taskData, "ioctl failed", GETERROR); } strm = &basic_io_vector[stream_no]; strm->device.sock = skt; strm->ioBits = IO_BIT_OPEN | IO_BIT_READ | IO_BIT_WRITE | IO_BIT_SOCKET ; return(str_token); } case 15: /* Set TCP No-delay option. */ return setSocketOption(taskData, args, IPPROTO_TCP, TCP_NODELAY); case 16: /* Get TCP No-delay option. */ return getSocketOption(taskData, args, IPPROTO_TCP, TCP_NODELAY); case 17: /* Set Debug option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_DEBUG); case 18: /* Get Debug option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_DEBUG); case 19: /* Set REUSEADDR option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_REUSEADDR); case 20: /* Get REUSEADDR option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_REUSEADDR); case 21: /* Set KEEPALIVE option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_KEEPALIVE); case 22: /* Get KEEPALIVE option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_KEEPALIVE); case 23: /* Set DONTROUTE option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_DONTROUTE); case 24: /* Get DONTROUTE option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_DONTROUTE); case 25: /* Set BROADCAST option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_BROADCAST); case 26: /* Get BROADCAST option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_BROADCAST); case 27: /* Set OOBINLINE option. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_OOBINLINE); case 28: /* Get OOBINLINE option. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_OOBINLINE); case 29: /* Set SNDBUF size. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_SNDBUF); case 30: /* Get SNDBUF size. */ return getSocketInt(taskData, args, SOL_SOCKET, SO_SNDBUF); case 31: /* Set RCVBUF size. */ return setSocketOption(taskData, args, SOL_SOCKET, SO_RCVBUF); case 32: /* Get RCVBUF size. */ return getSocketInt(taskData, args, SOL_SOCKET, SO_RCVBUF); case 33: /* Get socket type e.g. SOCK_STREAM. */ return getSocketInt(taskData, args, SOL_SOCKET, SO_TYPE); case 34: /* Get error status and clear it. */ return getSocketOption(taskData, args, SOL_SOCKET, SO_ERROR); case 35: /* Set Linger time. */ { struct linger linger; PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int lTime = get_C_int(taskData, DEREFHANDLE(args)->Get(1)); /* We pass in a negative value to turn the option off, zero or positive to turn it on. */ if (lTime < 0) { linger.l_onoff = 0; linger.l_linger = 0; } else { linger.l_onoff = 1; linger.l_linger = lTime; } if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (setsockopt(strm->device.sock, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger)) != 0) raise_syscall(taskData, "setsockopt failed", GETERROR); return Make_arbitrary_precision(taskData, 0); } case 36: /* Get Linger time. */ { struct linger linger; PIOSTRUCT strm = get_stream(args->WordP()); socklen_t size = sizeof(linger); int lTime = 0; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (getsockopt(strm->device.sock, SOL_SOCKET, SO_LINGER, (char*)&linger, &size) != 0) raise_syscall(taskData, "getsockopt failed", GETERROR); /* If the option is off return a negative. */ if (linger.l_onoff == 0) lTime = -1; else lTime = linger.l_linger; return Make_arbitrary_precision(taskData, lTime); } case 37: /* Get peer name. */ { PIOSTRUCT strm = get_stream(args->WordP()); struct sockaddr sockA; socklen_t size = sizeof(sockA); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (getpeername(strm->device.sock, &sockA, &size) != 0) raise_syscall(taskData, "getpeername failed", GETERROR); /* Addresses are treated as strings. */ return(SAVE(C_string_to_Poly(taskData, (char*)&sockA, size))); } case 38: /* Get socket name. */ { PIOSTRUCT strm = get_stream(args->WordP()); struct sockaddr sockA; socklen_t size = sizeof(sockA); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (getsockname(strm->device.sock, &sockA, &size) != 0) raise_syscall(taskData, "getsockname failed", GETERROR); return(SAVE(C_string_to_Poly(taskData, (char*)&sockA, size))); } case 39: /* Return the address family from an address. */ { PolyStringObject *psAddr = (PolyStringObject *)args->WordP(); struct sockaddr *psock = (struct sockaddr *)&psAddr->chars; return Make_arbitrary_precision(taskData, psock->sa_family); } case 40: /* Create a socket address from a port number and internet address. */ { struct sockaddr_in sockaddr; memset(&sockaddr, 0, sizeof(sockaddr)); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(get_C_ushort(taskData, DEREFHANDLE(args)->Get(0))); sockaddr.sin_addr.s_addr = htonl(get_C_unsigned(taskData, DEREFHANDLE(args)->Get(1))); return(SAVE(C_string_to_Poly(taskData, (char*)&sockaddr, sizeof(sockaddr)))); } case 41: /* Return port number from an internet socket address. Assumes that we've already checked the address family. */ { PolyStringObject *psAddr = (PolyStringObject *)args->WordP(); struct sockaddr_in *psock = (struct sockaddr_in *)&psAddr->chars; return Make_arbitrary_precision(taskData, ntohs(psock->sin_port)); } case 42: /* Return internet address from an internet socket address. Assumes that we've already checked the address family. */ { PolyStringObject * psAddr = (PolyStringObject *)args->WordP(); struct sockaddr_in *psock = (struct sockaddr_in *)&psAddr->chars; return Make_arbitrary_precision(taskData, ntohl(psock->sin_addr.s_addr)); } /* 43 - Set non-blocking mode. Now removed. */ case 44: /* Find number of bytes available. */ { PIOSTRUCT strm = get_stream(args->WordP()); unsigned long readable; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (ioctlsocket(strm->device.sock, FIONREAD, &readable) != 0) raise_syscall(taskData, "ioctlsocket failed", GETERROR); #else if (ioctl(strm->device.sock, FIONREAD, &readable) < 0) raise_syscall(taskData, "ioctl failed", GETERROR); #endif return Make_arbitrary_precision(taskData, readable); } case 45: /* Find out if we are at the mark. */ { PIOSTRUCT strm = get_stream(args->WordP()); unsigned long atMark; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (ioctlsocket(strm->device.sock, SIOCATMARK, &atMark) != 0) raise_syscall(taskData, "ioctlsocket failed", GETERROR); #else if (ioctl(strm->device.sock, SIOCATMARK, &atMark) < 0) raise_syscall(taskData, "ioctl failed", GETERROR); #endif return Make_arbitrary_precision(taskData, atMark == 0 ? 0 : 1); } case 46: /* Accept a connection. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 58: /* Non-blocking accept. */ { PIOSTRUCT strm = get_stream(args->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); else { SOCKET sock = strm->device.sock, result; struct sockaddr resultAddr; socklen_t addrLen; Handle addrHandle, pair; Handle str_token; PIOSTRUCT newStrm; /* Get a token for the new socket - may raise an exception if it fails. */ str_token = make_stream_entry(taskData); unsigned stream_no = STREAMID(str_token); addrLen = sizeof(resultAddr); result = accept(sock, &resultAddr, &addrLen); if (result == INVALID_SOCKET) { /* Free the stream entry */ free_stream_entry(stream_no); switch (GETERROR) { case EINTR: goto TryAgain; /* Have to retry if we got EINTR. */ case EMFILE: /* Too many files. */ { if (emfileFlag) /* Previously had an EMFILE error. */ raise_syscall(taskData, "accept failed", EMFILE); emfileFlag = true; FullGC(taskData); /* May clear emfileFlag if we close a file. */ goto TryAgain; } case EWOULDBLOCK: /* If the socket is in non-blocking mode we pass this back to the caller. If it is blocking we suspend this process and try again later. */ if (c == 46 /* blocking version. */) { WaitNet waiter(strm->device.sock); processes->ThreadPauseForIO(taskData, &waiter); goto TryAgain; } /* else drop through. */ default: raise_syscall(taskData, "accept failed", GETERROR); } } addrHandle = SAVE(C_string_to_Poly(taskData, (char*)&resultAddr, addrLen)); newStrm = &basic_io_vector[stream_no]; newStrm->device.sock = result; newStrm->ioBits = IO_BIT_OPEN | IO_BIT_READ | IO_BIT_WRITE | IO_BIT_SOCKET; /* Return a pair of the new socket and the address. */ pair = ALLOC(2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(str_token)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(addrHandle)); return pair; } } case 47: /* Bind an address to a socket. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PolyStringObject * psAddr = (PolyStringObject *)args->WordP()->Get(1).AsObjPtr(); struct sockaddr *psock = (struct sockaddr *)&psAddr->chars; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (bind(strm->device.sock, psock, (int)psAddr->length) != 0) raise_syscall(taskData, "bind failed", GETERROR); return Make_arbitrary_precision(taskData, 0); } case 48: /* Connect to an address. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 59: /* Non-blocking connect. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PolyStringObject * psAddr = (PolyStringObject *)args->WordP()->Get(1).AsObjPtr(); struct sockaddr *psock = (struct sockaddr *)&psAddr->chars; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); /* In Windows, and possibly also in Unix, if we have received a previous EWOULDBLOCK we have to use "select" to tell us whether the connection actually succeeded. */ while (1) { int res = connect(strm->device.sock, psock, (int)psAddr->length); if (res == 0) return Make_arbitrary_precision(taskData, 0); /* OK */ /* It isn't clear that EINTR can ever occur with connect, but just to be safe, we retry. */ int err = GETERROR; if ((err == EWOULDBLOCK || err == EINPROGRESS) && c == 48 /*blocking version*/) break; // It's in progress and we need to wait for completion else if (err != EINTR) raise_syscall(taskData, "connect failed", err); /* else try again. */ } while (1) { // ThreadPause may GC. We need to reload the socket for security. strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); SOCKET sock = strm->device.sock; /* In Windows failure is indicated by the bit being set in the exception set rather than the write set. */ WaitSelect waiter; waiter.SetWrite(sock); waiter.SetExcept(sock); processes->ThreadPauseForIO(taskData, &waiter); if (waiter.SelectResult() < 0) { int err = waiter.SelectError(); if (err != EINTR) raise_syscall(taskData, "select failed", err); /* else continue */ } else if (waiter.SelectResult() != 0) /* Definite result. */ { int result = 0; socklen_t len = sizeof(result); if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&result, &len) != 0 || result != 0) raise_syscall(taskData, "connect failed", MAPERROR(result)); return Make_arbitrary_precision(taskData, 0); /* Success. */ } } } case 49: /* Put socket into listening mode. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int backlog = get_C_int(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (listen(strm->device.sock, backlog) != 0) raise_syscall(taskData, "listen failed", GETERROR); return Make_arbitrary_precision(taskData, 0); } case 50: /* Shutdown the socket. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int mode = 0; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); switch (get_C_ulong(taskData, DEREFHANDLE(args)->Get(1))) { case 1: mode = SHUT_RD; break; case 2: mode = SHUT_WR; break; case 3: mode = SHUT_RDWR; } if (shutdown(strm->device.sock, mode) != 0) raise_syscall(taskData, "shutdown failed", GETERROR); return Make_arbitrary_precision(taskData, 0); } case 51: /* Send data on a socket. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 60: /* Non-blocking send. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PolyWord pBase = DEREFHANDLE(args)->Get(1); char ch, *base; POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(2)); #if(defined(_WIN32) && ! defined(_CYGWIN)) int length = get_C_int(taskData, DEREFHANDLE(args)->Get(3)); #else ssize_t length = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(3)); #endif unsigned int dontRoute = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(4)); unsigned int outOfBand = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(5)); int flags = 0; if (dontRoute != 0) flags |= MSG_DONTROUTE; if (outOfBand != 0) flags |= MSG_OOB; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (IS_INT(pBase)) { /* Handle the special case where we are sending a single byte vector and the "address" is the tagged byte itself. */ ch = (char)UNTAGGED(pBase); base = &ch; offset = 0; length = 1; } else base = (char*)pBase.AsObjPtr()->AsBytePtr(); while (1) { int err; #if(defined(_WIN32) && ! defined(_CYGWIN)) int sent; #else ssize_t sent; #endif sent = send(strm->device.sock, base+offset, length, flags); /* It isn't clear that EINTR can ever occur with send but just to be safe we deal with that case and retry the send. */ if (sent != SOCKET_ERROR) /* OK. */ return Make_arbitrary_precision(taskData, sent); err = GETERROR; if (err == EWOULDBLOCK && c == 51 /* blocking */) { WaitNetSend waiter(strm->device.sock); processes->ThreadPauseForIO(taskData, &waiter); // It is NOT safe to just loop here. We may have GCed. goto TryAgain; } else if (err != EINTR) raise_syscall(taskData, "send failed", err); /* else try again */ } } case 52: /* Send data on a socket to a given address. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 61: /* Non-blocking send. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PolyStringObject * psAddr = (PolyStringObject *)args->WordP()->Get(1).AsObjPtr(); PolyWord pBase = DEREFHANDLE(args)->Get(2); char ch, *base; POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(3)); #if(defined(_WIN32) && ! defined(_CYGWIN)) int length = get_C_int(taskData, DEREFHANDLE(args)->Get(4)); #else size_t length = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(4)); #endif unsigned int dontRoute = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(5)); unsigned int outOfBand = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(6)); int flags = 0; if (dontRoute != 0) flags |= MSG_DONTROUTE; if (outOfBand != 0) flags |= MSG_OOB; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (IS_INT(pBase)) { /* Handle the special case where we are sending a single byte vector and the "address" is the tagged byte itself. */ ch = (char)UNTAGGED(pBase); base = &ch; offset = 0; length = 1; } else base = (char*)pBase.AsObjPtr()->AsBytePtr(); while (1) { int err; #if(defined(_WIN32) && ! defined(_CYGWIN)) int sent; #else ssize_t sent; #endif sent = sendto(strm->device.sock, base+offset, length, flags, (struct sockaddr *)psAddr->chars, (int)psAddr->length); /* It isn't clear that EINTR can ever occur with send but just to be safe we deal with that case and retry the send. */ if (sent != SOCKET_ERROR) /* OK. */ return Make_arbitrary_precision(taskData, sent); err = GETERROR; if (err == EWOULDBLOCK && c == 52 /* blocking */) { WaitNetSend waiter(strm->device.sock); processes->ThreadPauseForIO(taskData, &waiter); // It is NOT safe to just loop here. We may have GCed. goto TryAgain; } else if (err != EINTR) raise_syscall(taskData, "sendto failed", err); /* else try again */ } } case 53: /* Receive data into an array. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 62: /* Non-blocking receive. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); char *base = (char*)DEREFHANDLE(args)->Get(1).AsObjPtr()->AsBytePtr(); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(2)); #if(defined(_WIN32) && ! defined(_CYGWIN)) int length = get_C_int(taskData, DEREFHANDLE(args)->Get(3)); #else size_t length = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(3)); #endif unsigned int peek = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(4)); unsigned int outOfBand = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(5)); int flags = 0; if (peek != 0) flags |= MSG_PEEK; if (outOfBand != 0) flags |= MSG_OOB; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); while (1) { int err; #if(defined(_WIN32) && ! defined(_CYGWIN)) int recvd; #else ssize_t recvd; #endif recvd = recv(strm->device.sock, base+offset, length, flags); err = GETERROR; if (recvd != SOCKET_ERROR) { /* OK. */ /* It appears that recv may return the length of the message if that is longer than the buffer. */ if (recvd > (int)length) recvd = length; return Make_arbitrary_precision(taskData, recvd); } if (err == EWOULDBLOCK && c == 53 /* blocking */) { /* Block until something arrives. */ WaitNet waiter(strm->device.sock, outOfBand != 0); processes->ThreadPauseForIO(taskData, &waiter); // It is NOT safe to just loop here. We may have GCed. goto TryAgain; } else if (err != EINTR) raise_syscall(taskData, "recv failed", err); /* else try again */ } } case 54: /* Receive data into an array and return the sender's address along with the length. In Windows this can only be used with datagrams. */ // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); case 63: /* Non-blocking receive. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); char *base = (char*)DEREFHANDLE(args)->Get(1).AsObjPtr()->AsBytePtr(); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(2)); #if(defined(_WIN32) && ! defined(_CYGWIN)) int length = get_C_int(taskData, DEREFHANDLE(args)->Get(3)); #else size_t length = getPolyUnsigned(taskData, DEREFHANDLE(args)->Get(3)); #endif unsigned int peek = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(4)); unsigned int outOfBand = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(5)); int flags = 0; socklen_t addrLen; struct sockaddr resultAddr; if (peek != 0) flags |= MSG_PEEK; if (outOfBand != 0) flags |= MSG_OOB; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); while (1) { int err; #if(defined(_WIN32) && ! defined(_CYGWIN)) int recvd; #else ssize_t recvd; #endif recvd = recvfrom(strm->device.sock, base+offset, length, flags, &resultAddr, &addrLen); err = GETERROR; if (recvd != SOCKET_ERROR) { /* OK. */ Handle addrHandle, lengthHandle, pair; if (recvd > (int)length) recvd = length; lengthHandle = Make_arbitrary_precision(taskData, recvd); addrHandle = SAVE(C_string_to_Poly(taskData, (char*)&resultAddr, addrLen)); pair = ALLOC(2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(lengthHandle)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(addrHandle)); return pair; } if (err == EWOULDBLOCK && c == 54 /* blocking */) { WaitNet waiter(strm->device.sock, outOfBand != 0); processes->ThreadPauseForIO(taskData, &waiter); // It is NOT safe to just loop here. We may have GCed. goto TryAgain; } else if (err != EINTR) raise_syscall(taskData, "recvfrom failed", err); /* else try again */ } } case 55: /* Create a socket pair. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Not implemented. */ raise_syscall(taskData, "socketpair not implemented", -WSAEAFNOSUPPORT); #else { Handle str_token1 = make_stream_entry(taskData); Handle str_token2 = make_stream_entry(taskData); Handle pair; PIOSTRUCT strm1, strm2; unsigned stream_no1 = STREAMID(str_token1); unsigned stream_no2 = STREAMID(str_token2); int af = get_C_long(taskData, DEREFHANDLE(args)->Get(0)); int type = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int proto = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); int onOff = 1; SOCKET skt[2]; if (socketpair(af, type, proto, skt) != 0) { free_stream_entry(stream_no1); free_stream_entry(stream_no2); switch (GETERROR) { case EMFILE: /* too many open files */ { if (emfileFlag) /* Previously had an EMFILE error. */ raise_syscall(taskData, "socket failed", EMFILE); emfileFlag = true; FullGC(taskData); /* May clear emfileFlag if we close a file. */ goto TryAgain; } case EINTR: goto TryAgain; default: raise_syscall(taskData, "socketpair failed", GETERROR); } } /* Set the sockets to non-blocking mode. */ if (ioctl(skt[0], FIONBIO, &onOff) < 0 || ioctl(skt[1], FIONBIO, &onOff) < 0) { free_stream_entry(stream_no1); free_stream_entry(stream_no2); close(skt[0]); close(skt[1]); raise_syscall(taskData, "ioctl failed", GETERROR); } strm1 = &basic_io_vector[stream_no1]; strm1->device.sock = skt[0]; strm1->ioBits = IO_BIT_OPEN | IO_BIT_READ | IO_BIT_WRITE | IO_BIT_SOCKET ; strm2 = &basic_io_vector[stream_no2]; strm2->device.sock = skt[1]; strm2->ioBits = IO_BIT_OPEN | IO_BIT_READ | IO_BIT_WRITE | IO_BIT_SOCKET ; /* Return the two streams as a pair. */ pair = ALLOC(2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(str_token1)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(str_token2)); return pair; } #endif case 56: /* Create a Unix socket address from a string. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Not implemented. */ raise_syscall(taskData, "Unix addresses not implemented", -WSAEAFNOSUPPORT); #else { struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; #ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN addr.sun_len = sizeof(addr); // Used in FreeBSD only. #endif POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), addr.sun_path, sizeof(addr.sun_path)); if (length > (int)sizeof(addr.sun_path)) raise_syscall(taskData, "Address too long", ENAMETOOLONG); return SAVE(C_string_to_Poly(taskData, (char*)&addr, sizeof(addr))); } #endif case 57: /* Get the file name from a Unix socket address. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Not implemented. */ raise_syscall(taskData, "Unix addresses not implemented", -WSAEAFNOSUPPORT); #else { PolyStringObject * psAddr = (PolyStringObject *)args->WordP(); struct sockaddr_un *psock = (struct sockaddr_un *)&psAddr->chars; return SAVE(C_string_to_Poly(taskData, psock->sun_path)); } #endif case 64: /* Blocking select call. Infinite timeout. */ return selectCall(taskData, args, 1); case 65: /* Polling select call. Zero timeout. */ return selectCall(taskData, args, 2); case 66: /* Select call with non-zero timeout. */ return selectCall(taskData, args, 0); default: { char msg[100]; sprintf(msg, "Unknown net function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } static Handle mkAddr(TaskData *taskData, void *arg, char *p) { int j; struct hostent *host = (struct hostent *)arg; unsigned long addr = 0; /* Addresses are in network order so this is fairly easy. In practice they will be 4 byte entries so we could just use ntohl. */ for (j = 0; j < host->h_length; j++) addr = (addr << 8) | ((*(char**)p)[j] & 255); return Make_arbitrary_precision(taskData, addr); } /* Convert a host entry into a tuple for ML. */ static Handle makeHostEntry(TaskData *taskData, struct hostent *host) { /* We need to do all this in the right order. We cannot construct the result tuple until all the values are ready. We have to save each entry on the save stack just in case of a garbage collection. */ int i; char **p; Handle aliases, name, addrType, result; Handle addrList = SAVE(ListNull); /* Canonical name. */ name = SAVE(C_string_to_Poly(taskData, host->h_name)); /* Aliases. */ for (i=0, p = host->h_aliases; *p != NULL; p++, i++); aliases = convert_string_list(taskData, i, host->h_aliases); /* Address type. */ addrType = Make_arbitrary_precision(taskData, host->h_addrtype); /* Addresses. */ /* Count them first and then work from the end back. */ for (i=0, p = host->h_addr_list; *p != NULL; p++, i++); addrList = makeList(taskData, i, (char*)host->h_addr_list, sizeof(char*), host, mkAddr); /* Make the result structure. */ result = ALLOC(4); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(name)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(aliases)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(addrType)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(addrList)); return result; } static Handle makeProtoEntry(TaskData *taskData, struct protoent *proto) { int i; char **p; Handle aliases, name, protocol, result; /* Canonical name. */ name = SAVE(C_string_to_Poly(taskData, proto->p_name)); /* Aliases. */ for (i=0, p = proto->p_aliases; *p != NULL; p++, i++); aliases = convert_string_list(taskData, i, proto->p_aliases); /* Protocol number. */ protocol = Make_arbitrary_precision(taskData, proto->p_proto); /* Make the result structure. */ result = ALLOC(3); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(name)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(aliases)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(protocol)); return result; } static Handle makeServEntry(TaskData *taskData, struct servent *serv) { int i; char **p; Handle aliases, name, protocol, result, port; /* Canonical name. */ name = SAVE(C_string_to_Poly(taskData, serv->s_name)); /* Aliases. */ for (i=0, p = serv->s_aliases; *p != NULL; p++, i++); aliases = convert_string_list(taskData, i, serv->s_aliases); /* Port number. */ port = Make_arbitrary_precision(taskData, ntohs(serv->s_port)); /* Protocol name. */ protocol = SAVE(C_string_to_Poly(taskData, serv->s_proto)); /* Make the result structure. */ result = ALLOC(4); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(name)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(aliases)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(port)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(protocol)); return result; } static Handle mkAftab(TaskData *taskData, void *arg, char *p) { struct af_tab_struct *af = (struct af_tab_struct *)p; Handle result, name, num; /* Construct a pair of the string and the number. */ name = SAVE(C_string_to_Poly(taskData, af->af_name)); num = Make_arbitrary_precision(taskData, af->af_num); result = ALLOC(2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(name)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(num)); return result; } static Handle mkSktab(TaskData *taskData, void *arg, char *p) { struct sk_tab_struct *sk = (struct sk_tab_struct *)p; Handle result, name, num; /* Construct a pair of the string and the number. */ name = SAVE(C_string_to_Poly(taskData, sk->sk_name)); num = Make_arbitrary_precision(taskData, sk->sk_num); result = ALLOC(2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(name)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(num)); return result; } /* This sets an option and can also be used to set an integer. */ static Handle setSocketOption(TaskData *taskData, Handle args, int level, int opt) { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int onOff = get_C_int(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (setsockopt(strm->device.sock, level, opt, (char*)&onOff, sizeof(int)) != 0) raise_syscall(taskData, "setsockopt failed", GETERROR); return Make_arbitrary_precision(taskData, 0); } /* Get a socket option as a boolean */ static Handle getSocketOption(TaskData *taskData, Handle args, int level, int opt) { PIOSTRUCT strm = get_stream(args->WordP()); int onOff = 0; socklen_t size = sizeof(int); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (getsockopt(strm->device.sock, level, opt, (char*)&onOff, &size) != 0) raise_syscall(taskData, "getsockopt failed", GETERROR); return Make_arbitrary_precision(taskData, onOff == 0 ? 0 : 1); } /* Get a socket option as an integer */ static Handle getSocketInt(TaskData *taskData, Handle args, int level, int opt) { PIOSTRUCT strm = get_stream(args->WordP()); int optVal = 0; socklen_t size = sizeof(int); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (getsockopt(strm->device.sock, level, opt, (char*)&optVal, &size) != 0) raise_syscall(taskData, "getsockopt failed", GETERROR); return Make_arbitrary_precision(taskData, optVal); } /* Helper function for selectCall. Creates the result vector of active sockets. */ static Handle getSelectResult(TaskData *taskData, Handle args, int offset, fd_set *pFds) { /* Construct the result vectors. */ PolyObject *inVec = DEREFHANDLE(args)->Get(offset).AsObjPtr(); POLYUNSIGNED nVec = OBJECT_LENGTH(inVec); int nRes = 0; POLYUNSIGNED i; for (i = 0; i < nVec; i++) { PIOSTRUCT strm = get_stream(inVec->Get(i).AsObjPtr()); if (FD_ISSET(strm->device.sock, pFds)) nRes++; } if (nRes == 0) return SAVE(EmptyString()); /* None - return empty vector. */ else { Handle result = ALLOC(nRes); inVec = DEREFHANDLE(args)->Get(offset).AsObjPtr(); /* It could have moved as a result of a gc. */ nRes = 0; for (i = 0; i < nVec; i++) { PIOSTRUCT strm = get_stream(inVec->Get(i).AsObjPtr()); if (FD_ISSET(strm->device.sock, pFds)) DEREFWORDHANDLE(result)->Set(nRes++, inVec->Get(i)); } return result; } } /* Wrapper for "select" call. The arguments are arrays of socket ids. These arrays are updated so that "active" sockets are left unchanged and inactive sockets are set to minus one. */ static Handle selectCall(TaskData *taskData, Handle args, int blockType) { TryAgain: // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); fd_set readers, writers, excepts; struct timeval timeout; int selectRes; POLYUNSIGNED i, nVec; Handle rdResult, wrResult, exResult, result; /* Set up the bitmaps for the select call from the arrays. */ PolyObject *readVec = DEREFHANDLE(args)->Get(0).AsObjPtr(); PolyObject *writeVec = DEREFHANDLE(args)->Get(1).AsObjPtr(); PolyObject *excVec = DEREFHANDLE(args)->Get(2).AsObjPtr(); FD_ZERO(&readers); FD_ZERO(&writers); FD_ZERO(&excepts); nVec = OBJECT_LENGTH(readVec); for (i = 0; i < nVec; i++) { PIOSTRUCT strm = get_stream(readVec->Get(i).AsObjPtr()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); FD_SET(strm->device.sock, &readers); } nVec = OBJECT_LENGTH(writeVec); for (i = 0; i < nVec; i++) { PIOSTRUCT strm = get_stream(writeVec->Get(i).AsObjPtr()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); FD_SET(strm->device.sock, &writers); } nVec = OBJECT_LENGTH(excVec); for (i = 0; i < nVec; i++) { PIOSTRUCT strm = get_stream(excVec->Get(i).AsObjPtr()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); FD_SET(strm->device.sock, &excepts); } /* Whatever the timeout specified we simply poll here. */ memset(&timeout, 0, sizeof(timeout)); selectRes = select(FD_SETSIZE, &readers, &writers, &excepts, &timeout); if (selectRes < 0) raise_syscall(taskData, "select failed", GETERROR); if (selectRes == 0) { /* Timed out. Have to look at the timeout value. */ switch (blockType) { case 0: /* Check the timeout. */ { /* The time argument is an absolute time. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) Handle hSave = taskData->saveVec.mark(); FILETIME ftTime, ftNow; /* Get the file time. */ getFileTimeFromArb(taskData, taskData->saveVec.push(DEREFHANDLE(args)->Get(3)), &ftTime); GetSystemTimeAsFileTime(&ftNow); taskData->saveVec.reset(hSave); /* If the timeout time is earlier than the current time we must return, otherwise we block. */ if (CompareFileTime(&ftTime, &ftNow) <= 0) break; /* Return the empty set. */ /* else drop through and block. */ #else /* Unix */ struct timeval tv; Handle hSave = taskData->saveVec.mark(); /* We have a value in microseconds. We need to split it into seconds and microseconds. */ Handle hTime = SAVE(DEREFWORDHANDLE(args)->Get(3)); Handle hMillion = Make_arbitrary_precision(taskData, 1000000); unsigned long secs = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); unsigned long usecs = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); taskData->saveVec.reset(hSave); /* If the timeout time is earlier than the current time we must return, otherwise we block. */ if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); if ((unsigned long)tv.tv_sec > secs || ((unsigned long)tv.tv_sec == secs && (unsigned long)tv.tv_usec >= usecs)) break; /* else block. */ #endif } case 1: /* Block until one of the descriptors is ready. */ processes->ThreadPause(taskData); goto TryAgain; case 2: /* Just a simple poll - drop through. */ break; } } /* Construct the result vectors. */ rdResult = getSelectResult(taskData, args, 0, &readers); wrResult = getSelectResult(taskData, args, 1, &writers); exResult = getSelectResult(taskData, args, 2, &excepts); result = ALLOC(3); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(rdResult)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(wrResult)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(exResult)); return result; } class Networking: public RtsModule { public: virtual void Init(void); virtual void Stop(void); }; // Declare this. It will be automatically added to the table. static Networking networkingModule; void Networking::Init(void) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) #define WINSOCK_MAJOR_VERSION 2 #define WINSOCK_MINOR_VERSION 2 WSADATA wsaData; WORD wVersion = MAKEWORD(WINSOCK_MINOR_VERSION, WINSOCK_MAJOR_VERSION); /* Initialise the system and check that the version it supplied is the one we requested. */ if(WSAStartup(wVersion, &wsaData) == 0) { if (wsaData.wVersion == wVersion) winsock_init = 1; else WSACleanup(); } #endif } void Networking::Stop(void) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (winsock_init) WSACleanup(); winsock_init = 0; #endif } polyml-5.6/libpolyml/network.h000066400000000000000000000020071265146633400165560ustar00rootroot00000000000000/* Title: Network functions. Copyright (c) 2000 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _NETWORK_H #define _NETWORK_H class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle Net_dispatch_c(TaskData *taskData, Handle args, Handle code); #endif polyml-5.6/libpolyml/noreturn.h000066400000000000000000000023341265146633400167440ustar00rootroot00000000000000/* Title: No return header. Author: David C.J. Matthews Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _NORETURN_H #define _NORETURN_H /* The exception functions don't return but instead raise exceptions. This macro tells the compiler about this and prevents spurious errors. */ #if (defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) #define NORETURNFN(x) __declspec(noreturn) x #elif defined(__GNUC__) || defined(__attribute__) #define NORETURNFN(x) x __attribute__((noreturn)) #else #define NORETURNFN(x) x #endif #endif polyml-5.6/libpolyml/objsize.cpp000066400000000000000000000230501265146633400170660ustar00rootroot00000000000000/* Title: Object size Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "arb.h" #include "run_time.h" #include "machine_dep.h" #include "objsize.h" #include "scanaddrs.h" #include "polystring.h" #include "save_vec.h" #include "bitmap.h" #include "memmgr.h" #include "mpoly.h" extern FILE *polyStdout; #define MAX_PROF_LEN 100 // Profile lengths between 1 and this class ProcessVisitAddresses: public ScanAddress { public: virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt) { return ShowWord(*pt); } virtual PolyObject *ScanObjectAddress(PolyObject *base); POLYUNSIGNED ShowWord(PolyWord w); ProcessVisitAddresses(bool show); ~ProcessVisitAddresses(); VisitBitmap *FindBitmap(PolyWord p); void ShowBytes(PolyObject *start); void ShowCode(PolyObject *start); void ShowWords(PolyObject *start); POLYUNSIGNED total_length; bool show_size; void *io_bottom; void *io_top; VisitBitmap **bitmaps; unsigned nBitmaps; // Counts of objects of each size for mutable and immutable data. unsigned iprofile[MAX_PROF_LEN+1]; unsigned mprofile[MAX_PROF_LEN+1]; }; ProcessVisitAddresses::ProcessVisitAddresses(bool show) { // Need to get the allocation lock here. Another thread // could allocate new local areas resulting in gMem.nlSpaces // and gMem.lSpaces changing under our feet. PLocker lock(&gMem.allocLock); MemSpace *ioSpace = gMem.IoSpace(); io_bottom = ioSpace->bottom; io_top = ioSpace->top; total_length = 0; show_size = show; // Create a bitmap for each of the areas apart from the IO area nBitmaps = gMem.nlSpaces+gMem.npSpaces; // bitmaps = new VisitBitmap*[nBitmaps]; unsigned bm = 0; unsigned j; for (j = 0; j < gMem.npSpaces; j++) { MemSpace *space = gMem.pSpaces[j]; // Permanent areas are filled with objects from the bottom. bitmaps[bm++] = new VisitBitmap(space->bottom, space->top); } for (j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; bitmaps[bm++] = new VisitBitmap(space->bottom, space->top); } ASSERT(bm == nBitmaps); // Clear the profile counts. for (unsigned i = 0; i < MAX_PROF_LEN+1; i++) { iprofile[i] = mprofile[i] = 0; } } ProcessVisitAddresses::~ProcessVisitAddresses() { if (bitmaps) { for (unsigned i = 0; i < nBitmaps; i++) delete(bitmaps[i]); delete[](bitmaps); } } // Return the bitmap corresponding to the address or NULL if it isn't there. VisitBitmap *ProcessVisitAddresses::FindBitmap(PolyWord p) { for (unsigned i = 0; i < nBitmaps; i++) { VisitBitmap *bm = bitmaps[i]; if (bm->InRange(p.AsStackAddr())) return bm; } return 0; } void ProcessVisitAddresses::ShowBytes(PolyObject *start) { POLYUNSIGNED bytes = start->Length() * sizeof(PolyWord); char *array = (char *) start; putc('\n', polyStdout); if (start->IsMutable()) fprintf(polyStdout, "MUTABLE "); fprintf(polyStdout, "BYTES:%p:%" POLYUFMT "\n", array, bytes); POLYUNSIGNED i, n; for (i = 0, n = 0; n < bytes; n++) { fprintf(polyStdout, "%02x ",array[n] & 0xff); i++; if (i == 16) { putc('\n', polyStdout); i = 0; } } if (i != 0) putc('\n', polyStdout); } #define MAXNAME 500 void ProcessVisitAddresses::ShowCode(PolyObject *start) { POLYUNSIGNED length = start->Length(); putc('\n', polyStdout); if (start->IsMutable()) fprintf(polyStdout, "MUTABLE "); char buffer[MAXNAME+1]; PolyWord *consts = start->ConstPtrForCode(); PolyWord string = consts[0]; if (string == TAGGED(0)) strcpy(buffer, ""); else (void) Poly_string_to_C(string, buffer, sizeof(buffer)); fprintf(polyStdout, "CODE:%p:%" POLYUFMT " %s\n", start, length, buffer); POLYUNSIGNED i, n; for (i = 0, n = 0; n < length; n++) { if (i != 0) putc('\t', polyStdout); fprintf(polyStdout, "%8p ", start->Get(n).AsObjPtr()); i++; if (i == 4) { putc('\n', polyStdout); i = 0; } } if (i != 0) putc('\n', polyStdout); } void ProcessVisitAddresses::ShowWords(PolyObject *start) { POLYUNSIGNED length = start->Length(); putc('\n', polyStdout); if (start->IsMutable()) fprintf(polyStdout, "MUTABLE "); fprintf(polyStdout, "WORDS:%p:%" POLYUFMT "\n", start, length); POLYUNSIGNED i, n; for (i = 0, n = 0; n < length; n++) { if (i != 0) putc('\t', polyStdout); fprintf(polyStdout, "%8p ", start->Get(n).AsObjPtr()); i++; if (i == 4) { putc('\n', polyStdout); i = 0; } } if (i != 0) putc('\n', polyStdout); } // This is called initially to print the top-level object. // Since we don't process stacks it probably doesn't get called elsewhere. PolyObject *ProcessVisitAddresses::ScanObjectAddress(PolyObject *base) { POLYUNSIGNED lengthWord = ShowWord(base); if (lengthWord) ScanAddressesInObject(base, lengthWord); return base; } // Handle the normal case. Print the object at this word and // return true is it must be handled recursively. POLYUNSIGNED ProcessVisitAddresses::ShowWord(PolyWord w) { if (IS_INT(w)) return 0; /* not a pointer */ if (w.AsAddress() >= io_bottom && w.AsAddress() < io_top) return 0; /* IO segment */ if (w == PolyWord::FromUnsigned(0)) return 0; VisitBitmap *bm = FindBitmap(w); if (bm == 0) { fprintf(polyStdout, "Bad address " ZERO_X "%p found\n", w.AsObjPtr()); return 0; } PolyObject *p; if (OBJ_IS_CODEPTR(w)) p = ObjCodePtrToPtr(w.AsCodePtr()); /* find beginning of the code object */ else p = w.AsObjPtr(); /* Have we already visited this object? */ if (bm->AlreadyVisited(p)) return 0; bm->SetVisited(p); POLYUNSIGNED L = p->LengthWord(); POLYUNSIGNED obj_length = OBJ_OBJECT_LENGTH(L); // Increment the appropriate size profile count. if (p->IsMutable()) { if (obj_length > MAX_PROF_LEN) mprofile[MAX_PROF_LEN]++; else mprofile[obj_length]++; } else { if (obj_length > MAX_PROF_LEN) iprofile[MAX_PROF_LEN]++; else iprofile[obj_length]++; } total_length += obj_length + 1; /* total space needed for object */ if (OBJ_IS_BYTE_OBJECT(L)) { if (show_size) ShowBytes(p); return 0; } else if (OBJ_IS_CODE_OBJECT(L)) { PolyWord *cp; POLYUNSIGNED const_count; p->GetConstSegmentForCode(cp, const_count); if (show_size) ShowCode(p); return L; // Process addresses in it. } else /* Word object */ { if (show_size) ShowWords(p); return L; // Process addresses in it. } } Handle ObjSize(TaskData *taskData, Handle obj) { ProcessVisitAddresses process(false); process.ScanObjectAddress(obj->WordP()); return Make_arbitrary_precision(taskData, process.total_length); } Handle ShowSize(TaskData *taskData, Handle obj) { ProcessVisitAddresses process(true); process.ScanObjectAddress(obj->WordP()); fflush(polyStdout); /* We need this for Windows at least. */ return Make_arbitrary_precision(taskData, process.total_length); } static void printfprof(unsigned *counts) { for(unsigned i = 0; i < MAX_PROF_LEN+1; i++) { if (counts[i] != 0) { if (i == MAX_PROF_LEN) fprintf(polyStdout, ">%d\t%u\n", MAX_PROF_LEN, counts[i]); else fprintf(polyStdout, "%d\t%u\n", i, counts[i]); } } } Handle ObjProfile(TaskData *taskData, Handle obj) { ProcessVisitAddresses process(false); process.ScanObjectAddress(obj->WordP()); fprintf(polyStdout, "\nImmutable object sizes and counts\n"); printfprof(process.iprofile); fprintf(polyStdout, "\nMutable object sizes and counts\n"); printfprof(process.mprofile); fflush(polyStdout); /* We need this for Windows at least. */ return Make_arbitrary_precision(taskData, process.total_length); } polyml-5.6/libpolyml/objsize.h000066400000000000000000000022501265146633400165320ustar00rootroot00000000000000/* Title: objsize.h - export signature for objsize.c Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef OBJSIZE_H_DEFINED #define OBJSIZE_H_DEFINED class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle ObjSize(TaskData *taskData, Handle obj); extern Handle ShowSize(TaskData *taskData, Handle obj); extern Handle ObjProfile(TaskData *taskData, Handle obj); #endif polyml-5.6/libpolyml/os_specific.h000066400000000000000000000020241265146633400173520ustar00rootroot00000000000000/* Title: Operating Specific functions. Copyright (c) 2000 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _OSSPEC_H #define _OSSPEC_H class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle OS_spec_dispatch_c(TaskData *taskData, Handle args, Handle code); #endif polyml-5.6/libpolyml/osmem.cpp000066400000000000000000000135351265146633400165500ustar00rootroot00000000000000/* Title: osomem.cpp - Interface to OS memory management Copyright (c) 2006 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_MMAN_H #include #endif #include "osmem.h" // Linux prefers MAP_ANONYMOUS to MAP_ANON #ifndef MAP_ANON #ifdef MAP_ANONYMOUS #define MAP_ANON MAP_ANONYMOUS #endif #endif #if defined(HAVE_MMAP) && defined(MAP_ANON) // We don't use autoconf's test for mmap here because that tests for // file mapping. Instead the test simply tests for the presence of an mmap // function. // We also insist that the OS supports MAP_ANON or MAP_ANONYMOUS. Older // versions of Solaris required the use of /dev/zero instead. We don't // support that. #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif // How do we get the page size? #ifndef HAVE_GETPAGESIZE #ifdef _SC_PAGESIZE #define getpagesize() sysconf(_SC_PAGESIZE) #else // If this fails we're stuck #define getpagesize() PAGESIZE #endif #endif static int ConvertPermissions(unsigned perm) { int res = 0; if (perm & PERMISSION_READ) res |= PROT_READ; if (perm & PERMISSION_WRITE) res |= PROT_WRITE; if (perm & PERMISSION_EXEC) res |= PROT_EXEC; return res; } // Allocate space and return a pointer to it. The size is the minimum // size requested and it is updated with the actual space allocated. // Returns NULL if it cannot allocate the space. void *OSMem::Allocate(size_t &space, unsigned permissions) { int prot = ConvertPermissions(permissions); // Round up to an integral number of pages. int pageSize = getpagesize(); space = (space + pageSize-1) & ~(pageSize-1); int fd = -1; // This value is required by FreeBSD. Linux doesn't care void *result = mmap(0, space, prot, MAP_PRIVATE|MAP_ANON, fd, 0); // Convert MAP_FAILED (-1) into NULL if (result == MAP_FAILED) return 0; return result; } #ifdef SOLARIS #define FIXTYPE (caddr_t) #else #define FIXTYPE #endif // Release the space previously allocated. This must free the whole of // the segment. The space must be the size actually allocated. bool OSMem::Free(void *p, size_t space) { return munmap(FIXTYPE p, space) == 0; } // Adjust the permissions on a segment. This must apply to the // whole of a segment. bool OSMem::SetPermissions(void *p, size_t space, unsigned permissions) { int res = mprotect(FIXTYPE p, space, ConvertPermissions(permissions)); return res != -1; } #elif defined(_WIN32) // Use Windows memory management. #include static int ConvertPermissions(unsigned perm) { if (perm & PERMISSION_WRITE) { // Write. Always includes read permission. if (perm & PERMISSION_EXEC) return PAGE_EXECUTE_READWRITE; else return PAGE_READWRITE; } else if (perm & PERMISSION_EXEC) { // Execute but not write. if (perm & PERMISSION_READ) return PAGE_EXECUTE_READ; else return PAGE_EXECUTE; // Execute only } else if(perm & PERMISSION_READ) return PAGE_READONLY; else return PAGE_NOACCESS; } // Allocate space and return a pointer to it. The size is the minimum // size requested and it is updated with the actual space allocated. // Returns NULL if it cannot allocate the space. void *OSMem::Allocate(size_t &space, unsigned permissions) { // Get the page size and round up to that multiple. SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); // Get the page size. Put it in a size_t variable otherwise the rounding // up of "space" may go wrong on 64-bits. size_t pageSize = sysInfo.dwPageSize; space = (space + pageSize-1) & ~(pageSize-1); return VirtualAlloc(0, space, MEM_RESERVE|MEM_COMMIT, ConvertPermissions(permissions)); } // Release the space previously allocated. This must free the whole of // the segment. The space must be the size actually allocated. bool OSMem::Free(void *p, size_t space) { return VirtualFree(p, 0, MEM_RELEASE) == TRUE; } // Adjust the permissions on a segment. This must apply to the // whole of a segment. bool OSMem::SetPermissions(void *p, size_t space, unsigned permissions) { DWORD oldProtect; return VirtualProtect(p, space, ConvertPermissions(permissions), &oldProtect) == TRUE; } #else #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_MALLOC_H #include #endif // Use calloc to allocate the memory. Using calloc ensures the memory is // zeroed and is compatible with the other allocators. void *OSMem::Allocate(size_t &bytes, unsigned permissions) { return calloc(bytes, 1); } bool OSMem::Free(void *p, size_t/*space*/) { free(p); return true; } // We can't do this if we don't have mprotect. bool OSMem::SetPermissions(void *p, size_t space, unsigned permissions) { return true; // Let's hope this is all right. } #endif // Create the global object for the memory manager. static OSMem osmemMan; OSMem *osMemoryManager = &osmemMan; polyml-5.6/libpolyml/osmem.h000066400000000000000000000040111265146633400162020ustar00rootroot00000000000000/* Title: osomem.h - Interface to OS memory management Copyright (c) 2006 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef OS_MEM_H_INCLUDED #define OS_MEM_H_INCLUDED // We need size_t so include these two here. #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif // This class provides access to the memory management provided by the // operating system. It would be nice if we could always use malloc and // free for this but we need to have execute permission on the code // objects. #define PERMISSION_READ 1 #define PERMISSION_WRITE 2 #define PERMISSION_EXEC 4 class OSMem { public: // Allocate space and return a pointer to it. The size is the minimum // size requested in bytes and it is updated with the actual space allocated. // Returns NULL if it cannot allocate the space. void *Allocate(size_t &bytes, unsigned permissions); // Release the space previously allocated. This must free the whole of // the segment. The space must be the size actually allocated. bool Free(void *p, size_t space); // Adjust the permissions on a segment. This must apply to the // whole of a segment. bool SetPermissions(void *p, size_t space, unsigned permissions); }; extern OSMem *osMemoryManager; #endif polyml-5.6/libpolyml/pecoffexport.cpp000066400000000000000000000335771265146633400201440ustar00rootroot00000000000000/* Title: Export memory as a PE/COFF object Author: David C. J. Matthews. Copyright (c) 2006, 2011 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include #include #ifdef HAVE_STDDEF_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #endif #include #include "globals.h" #include "pecoffexport.h" #include "machine_dep.h" #include "scanaddrs.h" #include "run_time.h" #include "../polyexports.h" #include "version.h" #include "polystring.h" #ifdef _DEBUG /* MS C defines _DEBUG for debug builds. */ #define DEBUG #endif #ifdef DEBUG #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #if (SIZEOF_VOIDP == 8) #define DIRECT_WORD_RELOCATION IMAGE_REL_AMD64_ADDR64 #define RELATIVE_32BIT_RELOCATION IMAGE_REL_AMD64_REL32 #else #define DIRECT_WORD_RELOCATION IMAGE_REL_I386_DIR32 #define RELATIVE_32BIT_RELOCATION IMAGE_REL_I386_REL32 #endif // Generate the address relative to the start of the segment. void PECOFFExport::setRelocationAddress(void *p, DWORD *reloc) { unsigned area = findArea(p); DWORD offset = (DWORD)((char*)p - (char*)memTable[area].mtAddr); *reloc = offset; } // Create a relocation entry for an address at a given location. PolyWord PECOFFExport::createRelocation(PolyWord p, void *relocAddr) { IMAGE_RELOCATION reloc; // Set the offset within the section we're scanning. setRelocationAddress(relocAddr, &reloc.VirtualAddress); void *addr = p.AsAddress(); unsigned addrArea = findArea(addr); POLYUNSIGNED offset = (char*)addr - (char*)memTable[addrArea].mtAddr; reloc.SymbolTableIndex = addrArea; reloc.Type = DIRECT_WORD_RELOCATION; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; return PolyWord::FromUnsigned(offset); } void PECOFFExport::writeSymbol(const char *symbolName, __int32 value, int section, bool isExtern) { IMAGE_SYMBOL symbol; memset(&symbol, 0, sizeof(symbol)); // Zero the unused part of the string // Short symbol names go in the entry, longer ones go in the string table. if (strlen(symbolName) <= 8) strcpy((char*)symbol.N.ShortName, symbolName); else { symbol.N.Name.Short = 0; // We have to add 4 bytes because the first word written to the file is a length word. symbol.N.Name.Long = stringTable.makeEntry(symbolName) + sizeof(unsigned); } symbol.Value = value; symbol.SectionNumber = section; symbol.Type = IMAGE_SYM_TYPE_NULL; symbol.StorageClass = isExtern ? IMAGE_SYM_CLASS_EXTERNAL : IMAGE_SYM_CLASS_STATIC; fwrite(&symbol, sizeof(symbol), 1, exportFile); symbolCount++; } /* This is called for each constant within the code. Print a relocation entry for the word and return a value that means that the offset is saved in original word. */ void PECOFFExport::ScanConstant(byte *addr, ScanRelocationKind code) { IMAGE_RELOCATION reloc; PolyWord p = GetConstantValue(addr, code); if (IS_INT(p) || p == PolyWord::FromUnsigned(0)) return; void *a = p.AsAddress(); unsigned aArea = findArea(a); // We don't need a relocation if this is relative to the current segment // since the relative address will already be right. if (code == PROCESS_RELOC_I386RELATIVE && aArea == findArea(addr)) return; setRelocationAddress(addr, &reloc.VirtualAddress); // Set the value at the address to the offset relative to the symbol. POLYUNSIGNED offset = (char*)a - (char*)memTable[aArea].mtAddr; reloc.SymbolTableIndex = aArea; // The value we store here is the offset whichever relocation method // we're using. unsigned maxSize = code == PROCESS_RELOC_I386RELATIVE ? 4: sizeof(PolyWord); for (unsigned i = 0; i < maxSize; i++) { addr[i] = (byte)(offset & 0xff); offset >>= 8; } if (code == PROCESS_RELOC_I386RELATIVE) reloc.Type = RELATIVE_32BIT_RELOCATION; else reloc.Type = DIRECT_WORD_RELOCATION; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } // Set the file alignment. void PECOFFExport::alignFile(int align) { char pad[32]; // Maximum alignment int offset = ftell(exportFile); memset(pad, 0, sizeof(pad)); if ((offset % align) == 0) return; fwrite(&pad, align - (offset % align), 1, exportFile); } void PECOFFExport::exportStore(void) { PolyWord *p; IMAGE_FILE_HEADER fhdr; IMAGE_SECTION_HEADER *sections = 0; IMAGE_RELOCATION reloc; unsigned i; // These are written out as the description of the data. exportDescription exports; time_t now; time(&now); sections = new IMAGE_SECTION_HEADER [memTableEntries+1]; // Plus one for the tables. // Write out initial values for the headers. These are overwritten at the end. // File header memset(&fhdr, 0, sizeof(fhdr)); #if (SIZEOF_VOIDP == 8) fhdr.Machine = IMAGE_FILE_MACHINE_AMD64; // x86-64 #else fhdr.Machine = IMAGE_FILE_MACHINE_I386; // i386 #endif fhdr.NumberOfSections = memTableEntries+1; // One for each area plus one for the tables. (void)time((time_t*)&fhdr.TimeDateStamp); //fhdr.NumberOfSymbols = memTableEntries+1; // One for each area plus "poly_exports" fwrite(&fhdr, sizeof(fhdr), 1, exportFile); // Write it for the moment. // Section headers. for (i = 0; i < memTableEntries; i++) { memset(§ions[i], 0, sizeof(IMAGE_SECTION_HEADER)); sections[i].SizeOfRawData = (DWORD)memTable[i].mtLength; sections[i].Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_ALIGN_8BYTES; if (memTable[i].mtFlags & MTF_WRITEABLE) { // Mutable data ASSERT(!(memTable[i].mtFlags & MTF_EXECUTABLE)); // Executable areas can't be writable. strcpy((char*)sections[i].Name, ".data"); sections[i].Characteristics |= IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_INITIALIZED_DATA; } else { // Immutable data areas are marked as executable. strcpy((char*)sections[i].Name, ".text"); sections[i].Characteristics |= IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE; } } // Extra section for the tables. memset(§ions[memTableEntries], 0, sizeof(IMAGE_SECTION_HEADER)); sprintf((char*)sections[memTableEntries].Name, ".data"); sections[memTableEntries].SizeOfRawData = sizeof(exports) + (memTableEntries+1)*sizeof(memoryTableEntry); // Don't need write access here but keep it for consistency with other .data sections sections[memTableEntries].Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_ALIGN_8BYTES | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_INITIALIZED_DATA; fwrite(sections, sizeof(IMAGE_SECTION_HEADER), memTableEntries+1, exportFile); // Write it for the moment. for (i = 0; i < memTableEntries; i++) { if (i != ioMemEntry) // Don't relocate the IO area { // Relocations. The first entry is special and is only used if // we have more than 64k relocations. It contains the number of relocations but is // otherwise ignored. sections[i].PointerToRelocations = ftell(exportFile); memset(&reloc, 0, sizeof(reloc)); fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount = 1; // Create the relocation table and turn all addresses into offsets. char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); // Update any constants before processing the object // We need that for relative jumps/calls in X86/64. if (length != 0 && obj->IsCodeObject()) machineDependent->ScanConstantsWithinCode(obj, this); relocateObject(obj); p += length; } // If there are more than 64k relocations set this bit and set the value to 64k-1. if (relocationCount >= 65535) { sections[i].NumberOfRelocations = 65535; sections[i].Characteristics |= IMAGE_SCN_LNK_NRELOC_OVFL; // We have to go back and patch up the first (dummy) relocation entry // which contains the count. fseek(exportFile, sections[i].PointerToRelocations, SEEK_SET); memset(&reloc, 0, sizeof(reloc)); reloc.VirtualAddress = relocationCount; fwrite(&reloc, sizeof(reloc), 1, exportFile); fseek(exportFile, 0, SEEK_END); // Return to the end of the file. } else sections[i].NumberOfRelocations = relocationCount; } } // We don't need to handle relocation overflow here. sections[memTableEntries].PointerToRelocations = ftell(exportFile); relocationCount = 0; // Relocations for "exports" and "memTable"; // Address of "memTable" within "exports". We can't use createRelocation because // the position of the relocation is not in either the mutable or the immutable area. reloc.Type = DIRECT_WORD_RELOCATION; reloc.SymbolTableIndex = memTableEntries; // Relative to poly_exports reloc.VirtualAddress = offsetof(exportDescription, memTable); fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; // Address of "rootFunction" within "exports" reloc.Type = DIRECT_WORD_RELOCATION; unsigned rootAddrArea = findArea(rootFunction); reloc.SymbolTableIndex = rootAddrArea; reloc.VirtualAddress = offsetof(exportDescription, rootFunction); fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; for (i = 0; i < memTableEntries; i++) { reloc.Type = DIRECT_WORD_RELOCATION; reloc.SymbolTableIndex = i; // Relative to base symbol reloc.VirtualAddress = sizeof(exportDescription) + i * sizeof(memoryTableEntry) + offsetof(memoryTableEntry, mtAddr); fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } ASSERT(relocationCount < 65535); // Shouldn't get overflow!! sections[memTableEntries].NumberOfRelocations = relocationCount; // Now the binary data. for (i = 0; i < memTableEntries; i++) { sections[i].PointerToRawData = ftell(exportFile); fwrite(memTable[i].mtAddr, 1, memTable[i].mtLength, exportFile); } sections[memTableEntries].PointerToRawData = ftell(exportFile); memset(&exports, 0, sizeof(exports)); exports.structLength = sizeof(exportDescription); exports.memTableSize = sizeof(memoryTableEntry); exports.memTableEntries = memTableEntries; exports.ioIndex = 0; // The io entry is the first in the memory table exports.memTable = (memoryTableEntry *)sizeof(exports); // It follows immediately after this. exports.rootFunction = (void*)((char*)rootFunction - (char*)memTable[rootAddrArea].mtAddr); exports.timeStamp = now; exports.ioSpacing = ioSpacing; exports.architecture = machineDependent->MachineArchitecture(); exports.rtsVersion = POLY_version_number; // Set the address values to zero before we write. They will always // be relative to their base symbol. for (i = 0; i < memTableEntries; i++) memTable[i].mtAddr = 0; fwrite(&exports, sizeof(exports), 1, exportFile); fwrite(memTable, sizeof(memoryTableEntry), memTableEntries, exportFile); // First the symbol table. We have one entry for the exports and an additional // entry for each of the sections. fhdr.PointerToSymbolTable = ftell(exportFile); // The section numbers are one-based. Zero indicates the "common" area. // First write symbols for each section and for poly_exports. for (i = 0; i < memTableEntries; i++) { if (i == ioMemEntry) writeSymbol("ioarea", 0, i+1, false); else { char buff[50]; sprintf(buff, "area%0d", i); writeSymbol(buff, 0, i+1, false); } } // This is the only "real" symbol. // Add an underscore prefix if required. #ifdef POLY_LINKAGE_PREFIX #define PLTOSTRING1(x) #x #define PLTOSTRING(x) PLTOSTRING1(x) writeSymbol(PLTOSTRING(POLY_LINKAGE_PREFIX) "poly_exports", 0, memTableEntries+1, true); #else writeSymbol("poly_exports", 0, memTableEntries+1, true); #endif fhdr.NumberOfSymbols = symbolCount; // The string table is written immediately after the symbols. // The length is included as the first word. unsigned strSize = stringTable.stringSize + sizeof(unsigned); fwrite(&strSize, sizeof(strSize), 1, exportFile); fwrite(stringTable.strings, stringTable.stringSize, 1, exportFile); // Rewind to rewrite the headers. fseek(exportFile, 0, SEEK_SET); fwrite(&fhdr, sizeof(fhdr), 1, exportFile); fwrite(sections, sizeof(IMAGE_SECTION_HEADER), memTableEntries+1, exportFile); fclose(exportFile); exportFile = NULL; delete[](sections); } polyml-5.6/libpolyml/pecoffexport.h000066400000000000000000000034571265146633400176030ustar00rootroot00000000000000/* Title: Export memory as a PE/COFF object Author: David C. J. Matthews. Copyright (c) 2006, 2013 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PECOFFEXPORT_H_INCLUDED #define PECOFFEXPORT_H_INCLUDED #include "scanaddrs.h" // For base class #include "exporter.h" #include #include class PECOFFExport: public Exporter, public ScanAddress { public: PECOFFExport(): relocationCount(0), symbolCount(0) {} public: virtual void exportStore(void); private: // ScanAddress overrides virtual void ScanConstant(byte *addrOfConst, ScanRelocationKind code); // At the moment we should only get calls to ScanConstant. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } void alignFile(int align); private: void setRelocationAddress(void *p, DWORD *reloc); PolyWord createRelocation(PolyWord p, void *relocAddr); void writeSymbol(const char *symbolName, __int32 value, int section, bool isExtern); unsigned relocationCount; unsigned symbolCount; ExportStringTable stringTable; }; #endif polyml-5.6/libpolyml/pexport.cpp000066400000000000000000000640511265146633400171300ustar00rootroot00000000000000/* Title: Export and import memory in a portable format Author: David C. J. Matthews. Copyright (c) 2006-7, 2015-6 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "pexport.h" #include "machine_dep.h" #include "scanaddrs.h" #include "run_time.h" #include "../polyexports.h" #include "version.h" #include "sys.h" #include "polystring.h" #include "processes.h" // For IO_SPACING #include "memmgr.h" #include "osmem.h" /* This file contains the code both to export the file and to import it in a new session. */ PExport::PExport() { pMap = 0; nMapSize = 0; nObjects = 0; indexOrder = 0; } PExport::~PExport() { free(pMap); free(indexOrder); } // Get the index corresponding to an address. unsigned long PExport::getIndex(PolyObject *p) { // Binary chop to find the index from the address. unsigned long lower = 0, upper = nObjects; while (1) { ASSERT(lower < upper); unsigned long middle = (lower+upper)/2; ASSERT(middle < nObjects); if (p < pMap[middle]) { // Use lower to middle upper = middle; } else if (p > pMap[middle]) { // Use middle+1 to upper lower = middle+1; } else // Found it return middle; } } void PExport::printCodeAddr(byte *q) // Address into code. Either the pc field of a stack segment or // a word + 2 format address. { PolyObject *obj = ObjCodePtrToPtr(q); unsigned long a = getIndex(obj); fprintf(exportFile, "$%lu+%" POLYUFMT, a, (POLYUNSIGNED)(q - (byte*)obj)); } /* Get the index corresponding to an address. */ void PExport::printAddress(void *p) { unsigned area = findArea(p); if (area == ioMemEntry) { // Is it an IO entry? POLYUNSIGNED byteOffset = (char*)p - (char*)memTable[area].mtAddr; unsigned ioEntry = (unsigned)(byteOffset / (ioSpacing*sizeof(PolyWord))); unsigned ioOffset = (unsigned)(byteOffset - ioEntry * (ioSpacing*sizeof(PolyWord))); ASSERT(ioEntry < POLY_SYS_vecsize); if (ioOffset == 0) fprintf(exportFile, "I%d", ioEntry); else fprintf(exportFile, "J%d+%d", ioEntry, ioOffset); // Can this happen now? } else fprintf(exportFile, "@%lu", getIndex((PolyObject*)p)); } void PExport::printValue(PolyWord q) { if (IS_INT(q) || q == PolyWord::FromUnsigned(0)) fprintf(exportFile, "%" POLYSFMT, UNTAGGED(q)); else if (OBJ_IS_CODEPTR(q)) printCodeAddr(q.AsCodePtr()); else printAddress(q.AsAddress()); } void PExport::printObject(PolyObject *p) { POLYUNSIGNED length = p->Length(); POLYUNSIGNED i; unsigned long myIndex = getIndex(p); fprintf(exportFile, "%lu:", myIndex); if (p->IsMutable()) putc('M', exportFile); if (OBJ_IS_NEGATIVE(p->LengthWord())) putc('N', exportFile); if (OBJ_IS_WEAKREF_OBJECT(p->LengthWord())) putc('W', exportFile); if (OBJ_IS_NO_OVERWRITE(p->LengthWord())) putc('V', exportFile); if (p->IsByteObject()) { /* May be a string, a long format arbitrary precision number or a real number. */ PolyStringObject* ps = (PolyStringObject*)p; /* See if the first word is a possible length. The length cannot be one because single character strings are represented by the character. */ /* This is not infallible but it seems to be good enough to detect the strings. */ POLYUNSIGNED bytes = length * sizeof(PolyWord); if (length >= 2 && ps->length <= bytes - sizeof(POLYUNSIGNED) && ps->length > bytes - 2 * sizeof(POLYUNSIGNED)) { /* Looks like a string. */ fprintf(exportFile, "S%" POLYUFMT "|", ps->length); for (unsigned i = 0; i < ps->length; i++) { char ch = ps->chars[i]; fprintf(exportFile, "%02x", ch); } } else { /* Not a string. May be an arbitrary precision integer. If the source and destination word lengths differ we could find that some long-format arbitrary precision numbers could be represented in the tagged short form or vice-versa. The former case might give rise to errors because when comparing two arbitrary precision numbers for equality we assume that they are not equal if they have different representation. The latter case could be a problem because we wouldn't know whether to convert the tagged form to long form, which would be correct if the value has type "int" or to truncate it which would be correct for "word". It could also be a real number but that doesn't matter if we recompile everything on the new machine. */ byte *u = (byte*)p; putc('B', exportFile); fprintf(exportFile, "%" POLYUFMT "|", length*sizeof(PolyWord)); for (unsigned i = 0; i < (unsigned)(length*sizeof(PolyWord)); i++) { fprintf(exportFile, "%02x", u[i]); } } } else if (p->IsCodeObject()) { POLYUNSIGNED constCount, i; PolyWord *cp; ASSERT(! p->IsMutable() ); /* Work out the number of bytes in the code and the number of constants. */ p->GetConstSegmentForCode(cp, constCount); /* The byte count is the length of the segment minus the number of constants minus one for the constant count. It includes the marker word, byte count, profile count and, on the X86/64 at least, any non-address constants. These are actually word values. */ POLYUNSIGNED byteCount = (length - constCount - 1) * sizeof(PolyWord); fprintf(exportFile, "D%" POLYUFMT ",%" POLYUFMT "|", constCount, byteCount); // First the code. byte *u = (byte*)p; for (i = 0; i < byteCount; i++) fprintf(exportFile, "%02x", u[i]); putc('|', exportFile); // Now the constants. for (i = 0; i < constCount; i++) { printValue(cp[i]); if (i < constCount-1) putc(',', exportFile); } putc('|', exportFile); // Finally any constants in the code object. machineDependent->ScanConstantsWithinCode(p, this); } else /* Ordinary objects, essentially tuples. */ { fprintf(exportFile, "O%" POLYUFMT "|", length); for (i = 0; i < length; i++) { printValue(p->Get(i)); if (i < length-1) putc(',', exportFile); } } fprintf(exportFile, "\n"); } /* This is called for each constant within the code. Print a relocation entry for the word and return a value that means that the offset is saved in original word. */ void PExport::ScanConstant(byte *addr, ScanRelocationKind code) { PolyWord p = GetConstantValue(addr, code); // We put in all the values including tagged constants. PolyObject *obj = ObjCodePtrToPtr(addr); // Put in the byte offset and the relocation type code. fprintf(exportFile, "%" POLYUFMT ",%d,", (POLYUNSIGNED)(addr - (byte*)obj), code); printValue(p); // The value to plug in. fprintf(exportFile, " "); } void PExport::exportStore(void) { unsigned i; time_t now; time(&now); // Calculate a first guess for the map size based on the space size totalBytes = 0; void *startAddr = 0; for (i = 0; i < memTableEntries; i++) { if (i != ioMemEntry) { totalBytes += (unsigned long)memTable[i].mtLength; // Get the lowest address. if (startAddr == 0 || memTable[i].mtAddr < startAddr) startAddr = memTable[i].mtAddr; } } // Create a map entry for each entry. Allow five words per object. nMapSize = totalBytes/(sizeof(PolyWord)*5); pMap = (PolyObject **)malloc(sizeof(PolyObject*)*nMapSize); if (pMap == 0) throw MemoryException(); // We want the entries in pMap to be in ascending // order of address to make searching easy so we need to process the areas // in order of increasing address, which may not be the order in memTable. indexOrder = (unsigned*)calloc(sizeof(unsigned), memTableEntries-1); if (indexOrder == 0) throw MemoryException(); unsigned items = 0; for (i = 0; i < memTableEntries; i++) { if (i != ioMemEntry) { unsigned j = items; while (j > 0 && memTable[i].mtAddr < memTable[indexOrder[j-1]].mtAddr) { indexOrder[j] = indexOrder[j-1]; j--; } indexOrder[j] = i; items++; } } ASSERT(items == memTableEntries-1); // Process the area in order of ascending address. for (i = 0; i < items; i++) { unsigned index = indexOrder[i]; char *start = (char*)memTable[index].mtAddr; char *end = start + memTable[index].mtLength; for (PolyWord *p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; if (nObjects == nMapSize) { // Need to expand the array. PolyObject **newMap = (PolyObject **)realloc(pMap, (nMapSize + nMapSize/2)*sizeof(PolyObject*)); if (newMap == 0) throw MemoryException(); pMap = newMap; } POLYUNSIGNED length = obj->Length(); pMap[nObjects++] = obj; p += length; } } /* Start writing the information. */ fprintf(exportFile, "Objects\t%lu\n", nObjects); fprintf(exportFile, "Root\t%lu\n", getIndex(rootFunction)); // Generate each of the areas apart from the IO area. for (i = 0; i < memTableEntries; i++) { if (i != ioMemEntry) // Don't relocate the IO area { char *start = (char*)memTable[i].mtAddr; char *end = start + memTable[i].mtLength; for (PolyWord *p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); printObject(obj); p += length; } } } fclose(exportFile); exportFile = NULL; } /* Import a portable export file and load it into memory. Creates "permanent" address entries in the global memory table. */ class SpaceAlloc { public: SpaceAlloc(bool isMut, POLYUNSIGNED def); ~SpaceAlloc(); PolyObject *NewObj(POLYUNSIGNED objWords); bool AddToTable(void); POLYUNSIGNED defaultSize; POLYUNSIGNED currentSize; PolyWord *base; POLYUNSIGNED used; bool isMutable; unsigned spaceIndex; }; SpaceAlloc::SpaceAlloc(bool isMut, POLYUNSIGNED def) { isMutable = isMut; defaultSize = def; base = 0; currentSize = 0; used = 0; spaceIndex = 1; } SpaceAlloc::~SpaceAlloc() { if (base) osMemoryManager->Free(base, currentSize*sizeof(PolyWord)); } bool SpaceAlloc::AddToTable(void) { if (base != 0) { // Add the new space to the permanent memory table. MemSpace* space = gMem.NewPermanentSpace(base, used, isMutable ? MTF_WRITEABLE : 0, spaceIndex++); if (space == 0) { fprintf(stderr, "Insufficient memory\n"); return false; } } base = 0; return true; } // Allocate a new object. May create a new space and add the old one to the permanent // memory table if this is exhausted. PolyObject *SpaceAlloc::NewObj(POLYUNSIGNED objWords) { if (currentSize - used <= objWords) { // Need some more space. if (! AddToTable()) return 0; POLYUNSIGNED size = defaultSize; if (size <= objWords) size = objWords+1; size_t iSpace = size*sizeof(PolyWord); base = (PolyWord*)osMemoryManager->Allocate(iSpace, PERMISSION_READ|PERMISSION_WRITE|PERMISSION_EXEC); currentSize = iSpace/sizeof(PolyWord); used = 0; } ASSERT(currentSize - used > objWords); PolyObject *newObj = (PolyObject*)(base+used+1); used += objWords+1; return newObj; } class PImport { public: PImport(); ~PImport(); bool DoImport(void); FILE *f; PolyObject *Root(void) { return objMap[nRoot]; } private: PolyObject *NewObject(POLYUNSIGNED words, bool isMutable); bool ReadValue(PolyObject *p, POLYUNSIGNED i); bool GetValue(PolyWord *result); POLYUNSIGNED nObjects, nRoot; PolyObject **objMap; SpaceAlloc mutSpace, immutSpace; }; PImport::PImport(): mutSpace(true, 1024*1024), immutSpace(false, 1024*1024) { f = NULL; objMap = 0; } PImport::~PImport() { if (f) fclose(f); free(objMap); } PolyObject *PImport::NewObject(POLYUNSIGNED words, bool isMutableObj) { PolyObject *newObj = 0; if (isMutableObj) newObj = mutSpace.NewObj(words); else newObj = immutSpace.NewObj(words); if (newObj == 0) return 0; return newObj; } bool PImport::GetValue(PolyWord *result) { int ch = getc(f); if (ch == '@') { /* Address of an object. */ POLYUNSIGNED obj; fscanf(f, "%" POLYUFMT, &obj); ASSERT(obj < nObjects); *result = objMap[obj]; } else if (ch == '$') { /* Code address. */ POLYUNSIGNED obj, offset; fscanf(f, "%" POLYUFMT "+%" POLYUFMT, &obj, &offset); ASSERT(obj < nObjects); PolyObject *q = objMap[obj]; ASSERT(q->IsCodeObject()); *result = PolyWord::FromCodePtr((PolyWord(q)).AsCodePtr() + offset); /* The offset is in bytes. */ } else if ((ch >= '0' && ch <= '9') || ch == '-') { /* Tagged integer. */ POLYSIGNED j; ungetc(ch, f); fscanf(f, "%" POLYSFMT, &j); /* The assertion may be false if we are porting to a machine with a shorter tagged representation. */ ASSERT(j >= -MAXTAGGED-1 && j <= MAXTAGGED); *result = TAGGED(j); } else if (ch == 'I') { /* IO entry number. */ POLYUNSIGNED j; fscanf(f, "%" POLYUFMT, &j); ASSERT(j < POLY_SYS_vecsize); *result = (PolyObject*)&gMem.ioSpace->bottom[j * IO_SPACING]; } else if (ch == 'J') { /* IO entry number with offset. */ POLYUNSIGNED j, offset; fscanf(f, "%" POLYUFMT "+%" POLYUFMT, &j, &offset); ASSERT(j < POLY_SYS_vecsize); PolyWord base = (PolyObject*)&gMem.ioSpace->bottom[j * IO_SPACING]; *result = PolyWord::FromCodePtr(base.AsCodePtr() + offset); } else { fprintf(stderr, "Unexpected character in stream"); return false; } return true; } /* Read a value and store it at the specified word. */ bool PImport::ReadValue(PolyObject *p, POLYUNSIGNED i) { PolyWord result = TAGGED(0); if (GetValue(&result)) { p->Set(i, result); return true; } else return false; } bool PImport::DoImport() { int ch; POLYUNSIGNED objNo; ASSERT(gMem.npSpaces == 0); ASSERT(gMem.neSpaces == 0); ASSERT(gMem.ioSpace->bottom == 0); PolyWord *ioSpace = (PolyWord*)calloc(POLY_SYS_vecsize*IO_SPACING, sizeof(PolyWord)); if (ioSpace == 0) { fprintf(stderr, "Unable to allocate memory\n"); return false; } gMem.InitIOSpace(ioSpace, POLY_SYS_vecsize*IO_SPACING); ch = getc(f); /* Skip the "Mapping" line. */ if (ch == 'M') { while (getc(f) != '\n') ; ch = getc(f); } ASSERT(ch == 'O'); /* Number of objects. */ while (getc(f) != '\t') ; fscanf(f, "%" POLYUFMT, &nObjects); /* Create a mapping table. */ objMap = (PolyObject**)calloc(nObjects, sizeof(PolyObject*)); if (objMap == 0) { fprintf(stderr, "Unable to allocate memory\n"); return false; } do { ch = getc(f); } while (ch == '\n'); ASSERT(ch == 'R'); /* Root object number. */ while (getc(f) != '\t') ; fscanf(f, "%" POLYUFMT, &nRoot); /* Now the objects themselves. */ while (1) { bool isMutable = false; unsigned objBits = 0; POLYUNSIGNED nWords, nBytes; do { ch = getc(f); } while (ch == '\r' || ch == '\n'); if (ch == EOF) break; ungetc(ch, f); fscanf(f, "%" POLYUFMT, &objNo); ch = getc(f); ASSERT(ch == ':'); ASSERT(objNo < nObjects); /* Modifiers, MNVW. */ do { ch = getc(f); if (ch == 'M') { isMutable = true; objBits |= F_MUTABLE_BIT; } else if (ch == 'N') objBits |= F_NEGATIVE_BIT; if (ch == 'V') objBits |= F_NO_OVERWRITE; if (ch == 'W') objBits |= F_WEAK_BIT; } while (ch == 'M' || ch == 'N' || ch == 'L' || ch == 'V' || ch == 'W'); /* Object type. */ switch (ch) { case 'O': /* Simple object. */ fscanf(f, "%" POLYUFMT, &nWords); break; case 'B': /* Byte segment. */ objBits |= F_BYTE_OBJ; fscanf(f, "%" POLYUFMT, &nBytes); /* Round up to appropriate number of words. */ nWords = (nBytes + sizeof(PolyWord) -1) / sizeof(PolyWord); break; case 'S': /* String. */ objBits |= F_BYTE_OBJ; /* The length is the number of characters. */ fscanf(f, "%" POLYUFMT, &nBytes); /* Round up to appropriate number of words. Need to add one PolyWord for the length PolyWord. */ nWords = (nBytes + sizeof(PolyWord) -1) / sizeof(PolyWord) + 1; break; case 'C': /* Code segment (old form). */ case 'D': /* Code segment (new form). */ objBits |= F_CODE_OBJ; /* Read the number of bytes of code and the number of words for constants. */ fscanf(f, "%" POLYUFMT ",%" POLYUFMT, &nWords, &nBytes); nWords += ch == 'C' ? 4 : 1; /* Add words for extras. */ /* Add in the size of the code itself. */ nWords += (nBytes + sizeof(PolyWord) -1) / sizeof(PolyWord); break; default: fprintf(stderr, "Invalid object type\n"); return false; } PolyObject *p = NewObject(nWords, isMutable); if (p == 0) return false; objMap[objNo] = p; /* Put in length PolyWord and flag bits. */ p->SetLengthWord(nWords, objBits); /* Skip the object contents. */ while (getc(f) != '\n') ; } /* Second pass - fill in the contents. */ fseek(f, 0, SEEK_SET); /* Skip the information at the start. */ ch = getc(f); if (ch == 'M') { while (getc(f) != '\n') ; ch = getc(f); } ASSERT(ch == 'O'); /* Number of objects. */ while (getc(f) != '\n'); ch = getc(f); ASSERT(ch == 'R'); /* Root object number. */ while (getc(f) != '\n') ; while (1) { POLYUNSIGNED nWords, nBytes, i; if (feof(f)) break; fscanf(f, "%" POLYUFMT, &objNo); if (feof(f)) break; ch = getc(f); ASSERT(ch == ':'); ASSERT(objNo < nObjects); PolyObject * p = objMap[objNo]; /* Modifiers, M or N. */ do { ch = getc(f); } while (ch == 'M' || ch == 'N' || ch == 'L' || ch == 'V' || ch == 'W'); /* Object type. */ switch (ch) { case 'O': /* Simple object. */ fscanf(f, "%" POLYUFMT, &nWords); ch = getc(f); ASSERT(ch == '|'); ASSERT(nWords == p->Length()); for (i = 0; i < nWords; i++) { if (! ReadValue(p, i)) return false; ch = getc(f); ASSERT((ch == ',' && i < nWords-1) || (ch == '\n' && i == nWords-1)); } break; case 'B': /* Byte segment. */ { byte *u = (byte*)p; fscanf(f, "%" POLYUFMT, &nBytes); ch = getc(f); ASSERT(ch == '|'); for (i = 0; i < nBytes; i++) { int n; fscanf(f, "%02x", &n); u[i] = n; } ch = getc(f); ASSERT(ch == '\n'); break; } case 'S': /* String. */ { PolyStringObject * ps = (PolyStringObject *)p; /* The length is the number of characters. */ fscanf(f, "%" POLYUFMT, &nBytes); ch = getc(f); ASSERT(ch == '|'); ps->length = nBytes; for (i = 0; i < nBytes; i++) { int n; fscanf(f, "%02x", &n); ps->chars[i] = n; } ch = getc(f); ASSERT(ch == '\n'); break; } case 'C': /* Code segment. */ case 'D': { bool oldForm = ch == 'C'; byte *u = (byte*)p; POLYUNSIGNED length = p->Length(); /* Read the number of bytes of code and the number of words for constants. */ fscanf(f, "%" POLYUFMT ",%" POLYUFMT, &nWords, &nBytes); /* Read the code. */ ch = getc(f); ASSERT(ch == '|'); for (i = 0; i < nBytes; i++) { int n; fscanf(f, "%02x", &n); u[i] = n; } machineDependent->FlushInstructionCache(u, nBytes); ch = getc(f); ASSERT(ch == '|'); /* Set the constant count. */ p->Set(length-1, PolyWord::FromUnsigned(nWords)); if (oldForm) { p->Set(length-1-nWords-1, PolyWord::FromUnsigned(0)); /* Profile count. */ p->Set(length-1-nWords-3, PolyWord::FromUnsigned(0)); /* Marker word. */ p->Set(length-1-nWords-2, PolyWord::FromUnsigned((length-1-nWords-2)*sizeof(PolyWord))); /* Check - the code should end at the marker word. */ ASSERT(nBytes == ((length-1-nWords-3)*sizeof(PolyWord))); } /* Read in the constants. */ for (i = 0; i < nWords; i++) { if (! ReadValue(p, i+length-nWords-1)) return false; ch = getc(f); ASSERT((ch == ',' && i < nWords-1) || ((ch == '\n' || ch == '|') && i == nWords-1)); } // Read in any constants in the code. if (ch == '|') { ch = getc(f); while (ch != '\n') { ungetc(ch, f); POLYUNSIGNED offset; int code; fscanf(f, "%" POLYUFMT ",%d", &offset, &code); ch = getc(f); ASSERT(ch == ','); PolyWord constVal = TAGGED(0); if (! GetValue(&constVal)) return false; byte *toPatch = (byte*)p + offset; ScanAddress::SetConstantValue(toPatch, constVal, (ScanRelocationKind)code); do ch = getc(f); while (ch == ' '); } } // Adjust the byte count. This is only necessary when importing the interpreted // code into a machine with a different endian-ness from the exporter. { POLYUNSIGNED l = 0; while (l < length && p->Get(l) != PolyWord::FromUnsigned(0)) l++; ASSERT(l < length); l++; p->Set(l, PolyWord::FromUnsigned(l*sizeof(PolyWord))); } break; } default: fprintf(stderr, "Invalid object type\n"); return false; } } return mutSpace.AddToTable() && immutSpace.AddToTable(); } // Import a file in the portable format and return a pointer to the root object. PolyObject *ImportPortable(const TCHAR *fileName) { PImport pImport; #if (defined(_WIN32) && defined(UNICODE)) pImport.f = _wfopen(fileName, L"r"); if (pImport.f == 0) { fprintf(stderr, "Unable to open file: %S\n", fileName); return 0; } #else pImport.f = fopen(fileName, "r"); if (pImport.f == 0) { fprintf(stderr, "Unable to open file: %s\n", fileName); return 0; } #endif if (pImport.DoImport()) return pImport.Root(); else return 0; } polyml-5.6/libpolyml/pexport.h000066400000000000000000000037661265146633400166030ustar00rootroot00000000000000/* Title: Export memory in a portable format Author: David C. J. Matthews. Copyright (c) 2006, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR H PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PEXPORT_H_INCLUDED #define PEXPORT_H_INCLUDED #ifdef HAVE_TCHAR_H #include #else typedef char TCHAR; #endif #include "scanaddrs.h" // For base class #include "exporter.h" #include "globals.h" class PExport: public Exporter, public ScanAddress { public: PExport(); virtual ~PExport(); public: virtual void exportStore(void); private: // ScanAddress overrides virtual void ScanConstant(byte *addrOfConst, ScanRelocationKind code); // At the moment we should only get calls to ScanConstant. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } private: unsigned long getIndex(PolyObject *p); void printCodeAddr(byte *q); void printAddress(void *p); void printValue(PolyWord q); void printObject(PolyObject *p); // We don't use the relocation code so just provide a dummy function here. virtual PolyWord createRelocation(PolyWord p, void *relocAddr) { return p; } PolyObject **pMap; unsigned long nMapSize, nObjects, totalBytes; unsigned *indexOrder; }; // Import a file in the portable format and return a pointer to the root object. PolyObject *ImportPortable(const TCHAR *fileName); #endif polyml-5.6/libpolyml/poly_specific.cpp000066400000000000000000000670141265146633400202610ustar00rootroot00000000000000/* Title: poly_specific.cpp - Poly/ML specific RTS calls. Copyright (c) 2006, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This module is used for various run-time calls that are either in the PolyML structure or otherwise specific to Poly/ML. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #endif #include "globals.h" #include "poly_specific.h" #include "arb.h" #include "mpoly.h" #include "sys.h" #include "machine_dep.h" #include "polystring.h" #include "run_time.h" #include "version.h" #include "save_vec.h" #include "exporter.h" #include "version.h" #include "sharedata.h" #include "objsize.h" #include "memmgr.h" #include "processes.h" #include "savestate.h" #include "statistics.h" #include "../polystatistics.h" #define SAVE(x) taskData->saveVec.push(x) static const char *poly_runtime_system_copyright = "Copyright (c) 2002-15 CUTS, David C.J. Matthews and contributors."; #define Str(x) #x #define Xstr(x) Str(x) #ifdef GIT_VERSION #define GitVersion Xstr(GIT_VERSION) #else #define GitVersion "" #endif // Property bits for functions. For compiled functions these are // stored in the register mask word. None of the architectures has // more than 20 usable registers so we're safe putting them in these bits. // N.B. These are untagged values. // NORAISE means the function does not raise an exception. // NOUPDATE means the function does not perform any side-effects so if // its value is not used and it doesn't raise an exception it can be eliminated. // NODEREF means the value of the function depends only on the value of its arguments // and not on any other state. #define PROPWORD_NORAISE 0x40000000 #define PROPWORD_NOUPDATE 0x20000000 #define PROPWORD_NODEREF 0x10000000 static POLYUNSIGNED rtsProperties(TaskData *taskData, int i) { switch (i) { case POLY_SYS_exit: return 0; case POLY_SYS_chdir: return 0; case POLY_SYS_alloc_store: case POLY_SYS_alloc_uninit: // Allocating memory doesn't have any visible effect on the state. It can raise Size. // Two allocations return different addresses. return PROPWORD_NOUPDATE; case POLY_SYS_raisex: return 0; case POLY_SYS_get_length: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_get_flags: // This isn't quite true. It is possible to clear the mutable flag on a mutable segment. return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_str_compare: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_teststrgtr: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_teststrlss: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_teststrgeq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_teststrleq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_exception_trace_fn: return 0; case POLY_SYS_give_ex_trace_fn: return 0; case POLY_SYS_lockseg: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_emptystring: return 0; // Not a function case POLY_SYS_nullvector: return 0; // Not a function case POLY_SYS_network: return 0; case POLY_SYS_os_specific: return 0; case POLY_SYS_eq_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_neq_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_geq_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_leq_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_gt_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_lt_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_io_dispatch: return 0; case POLY_SYS_signal_handler: return 0; case POLY_SYS_atomic_reset: return PROPWORD_NORAISE; case POLY_SYS_atomic_incr: return PROPWORD_NORAISE; case POLY_SYS_atomic_decr: return PROPWORD_NORAISE; case POLY_SYS_thread_self: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_thread_dispatch: return 0; case POLY_SYS_plus_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_minus_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_mul_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_div_longword: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_mod_longword: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_andb_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_orb_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_xorb_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_kill_self: return 0; case POLY_SYS_shift_left_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_shift_right_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_shift_right_arith_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_profiler: return 0; case POLY_SYS_longword_to_tagged: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_signed_to_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_unsigned_to_longword: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_full_gc: return PROPWORD_NORAISE; // Effectively has a side-effect case POLY_SYS_stack_trace: return 0; case POLY_SYS_timing_dispatch: return 0; case POLY_SYS_objsize: return PROPWORD_NORAISE; case POLY_SYS_showsize: return PROPWORD_NORAISE; case POLY_SYS_quotrem: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_is_short: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_aplus: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_aminus: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_amul: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_adiv: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_amod: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_aneg: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_xora: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_equala: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_ora: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_anda: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_str: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_geq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_leq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_gtr: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_lss: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_eq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_neq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Real_Dispatch: return 0; case POLY_SYS_Add_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Sub_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Mul_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Div_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Abs_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_Neg_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_conv_real: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_real_to_int: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_to_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_sqrt_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_sin_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_cos_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_arctan_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_exp_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_ln_real: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_stdin: return 0; // Not a function case POLY_SYS_stdout: return 0; // Not a function case POLY_SYS_process_env: return 0; case POLY_SYS_set_string_length: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_get_first_long_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_poly_specific: return 0; case POLY_SYS_bytevec_eq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_cmem_load_8: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_load_16: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_load_32: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_load_float: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_load_double: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_store_8: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_cmem_store_16: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_cmem_store_32: return PROPWORD_NORAISE|PROPWORD_NODEREF; #if (SIZEOF_VOIDP == 8) case POLY_SYS_cmem_load_64: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_cmem_store_64: return PROPWORD_NORAISE|PROPWORD_NODEREF; #else // These aren't implemented in 32-bit mode. case POLY_SYS_cmem_load_64: return 0; case POLY_SYS_cmem_store_64: return 0; #endif case POLY_SYS_cmem_store_float: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_cmem_store_double: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_io_operation: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_ffi: return 0; case POLY_SYS_set_code_constant: return 0; case POLY_SYS_move_words: return PROPWORD_NORAISE; case POLY_SYS_move_words_overlap: return PROPWORD_NORAISE; case POLY_SYS_shift_right_arith_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_to_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_move_bytes: return PROPWORD_NORAISE; case POLY_SYS_move_bytes_overlap: return PROPWORD_NORAISE; case POLY_SYS_code_flags: return 0; case POLY_SYS_shrink_stack: return 0; case POLY_SYS_stderr: return 0; // Not a function case POLY_SYS_callcode_tupled: return 0; case POLY_SYS_foreign_dispatch: return 0; case POLY_SYS_XWindows: return 0; case POLY_SYS_is_big_endian: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_bytes_per_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_offset_address: return 0; case POLY_SYS_shift_right_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_word_neq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_not_bool: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_touch_final: return PROPWORD_NORAISE; // We need to treat this as though it had side-effects. case POLY_SYS_string_length: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_geq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_leq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_gtr: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_int_lss: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Load_byte/word_immut are the same as load_byte/word except that they can only // be applied to immutables so will always return the same result. case POLY_SYS_load_byte_immut: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_load_word_immut: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_mul_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_plus_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_minus_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_div_word: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_or_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_and_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_xor_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_shift_left_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_mod_word: return PROPWORD_NOUPDATE|PROPWORD_NODEREF; // Can raise Divide case POLY_SYS_word_geq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_word_leq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_word_gtr: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_word_lss: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_word_eq: return PROPWORD_NORAISE|PROPWORD_NOUPDATE|PROPWORD_NODEREF; case POLY_SYS_load_byte: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_load_word: return PROPWORD_NORAISE|PROPWORD_NOUPDATE; case POLY_SYS_assign_byte: return PROPWORD_NORAISE|PROPWORD_NODEREF; case POLY_SYS_assign_word: return PROPWORD_NORAISE|PROPWORD_NODEREF; default: raise_exception_string(taskData, EXC_Fail, "Unknown IO operation"); } } #if (0) // Convert the statistics into ML data. This is further unpicked within ML. static Handle unpackStats(TaskData *taskData, const polystatistics *stats) { // Vector for the counts. Initially created as mutable then locked. Handle counts = alloc_and_save(taskData, N_PS_COUNTERS, F_MUTABLE_BIT); for (unsigned i = 0; i < N_PS_COUNTERS; i++) { Handle mark = taskData->saveVec.mark(); Handle counterValue = Make_arbitrary_precision(taskData, stats->psCounters[i]); counts->WordP()->Set(i, counterValue->Word()); taskData->saveVec.reset(mark); } // Can now lock the count vector by removing the mutable flag. counts->WordP()->SetLengthWord(N_PS_COUNTERS); // Vector for the sizes. Handle sizes = alloc_and_save(taskData, N_PS_SIZES, F_MUTABLE_BIT); for (unsigned j = 0; j < N_PS_SIZES; j++) { Handle mark = taskData->saveVec.mark(); Handle sizeValue = Make_arbitrary_precision(taskData, stats->psSizes[j]); sizes->WordP()->Set(j, sizeValue->Word()); taskData->saveVec.reset(mark); } sizes->WordP()->SetLengthWord(N_PS_SIZES); // Vector for the times. Handle times = alloc_and_save(taskData, N_PS_TIMES, F_MUTABLE_BIT); for (unsigned k = 0; k < N_PS_TIMES; k++) { Handle mark = taskData->saveVec.mark(); #ifdef HAVE_WINDOWS_H Handle sizeValue = Make_arb_from_Filetime(taskData, stats->psTimers[k]); #else Handle sizeValue = Make_arb_from_pair_scaled(taskData, stats->psTimers[k].tv_sec, stats->psTimers[k].tv_usec, 1000000); #endif times->WordP()->Set(k, sizeValue->Word()); taskData->saveVec.reset(mark); } times->WordP()->SetLengthWord(N_PS_TIMES); // Vector for the user stats Handle users = alloc_and_save(taskData, N_PS_USER, F_MUTABLE_BIT); for (unsigned l = 0; l < N_PS_USER; l++) { Handle mark = taskData->saveVec.mark(); Handle userValue = Make_arbitrary_precision(taskData, stats->psUser[l]); users->WordP()->Set(l, userValue->Word()); taskData->saveVec.reset(mark); } users->WordP()->SetLengthWord(N_PS_USER); // Result vector Handle resultVec = alloc_and_save(taskData, 4); resultVec->WordP()->Set(0, counts->Word()); resultVec->WordP()->Set(1, sizes->Word()); resultVec->WordP()->Set(2, times->Word()); resultVec->WordP()->Set(3, users->Word()); return resultVec; } #endif Handle poly_dispatch_c(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORDHANDLE(code)); switch (c) { case 1: return exportNative(taskData, args); // Export case 2: raise_syscall(taskData, "C Export has been withdrawn", 0); return 0; case 3: return exportPortable(taskData, args); // Export as portable format case 9: // Return the GIT version if appropriate { return SAVE(C_string_to_Poly(taskData, GitVersion)); } case 10: // Return the RTS version string. { const char *version; switch (machineDependent->MachineArchitecture()) { case MA_Interpreted: version = "Portable-" TextVersion; break; case MA_I386: version = "I386-" TextVersion; break; case MA_X86_64: version = "X86_64-" TextVersion; break; default: version = "Unknown-" TextVersion; break; } return SAVE(C_string_to_Poly(taskData, version)); } case 11: // Return the RTS copyright string return SAVE(C_string_to_Poly(taskData, poly_runtime_system_copyright)); case 12: // Return the architecture { const char *arch; switch (machineDependent->MachineArchitecture()) { case MA_Interpreted: arch = "Interpreted"; break; case MA_I386: arch = "I386"; break; case MA_X86_64: arch = "X86_64"; break; default: arch = "Unknown"; break; } return SAVE(C_string_to_Poly(taskData, arch)); } case 13: // Share common immutable data. { ShareData(taskData, args); return SAVE(TAGGED(0)); } // ObjSize and ShowSize have their own IO vector entries but really they don't // need them. Include them here and add ObjProfile. case 14: return ObjSize(taskData, args); case 15: return ShowSize(taskData, args); case 16: return ObjProfile(taskData, args); /* 17 and 18 are no longer used. */ case 19: // Return the RTS argument help string. return SAVE(C_string_to_Poly(taskData, RTSArgHelp())); case 20: // Write a saved state file. return SaveState(taskData, args); case 21: // Load a saved state file and any ancestors. return LoadState(taskData, false, args); case 22: // Show the hierarchy. return ShowHierarchy(taskData); case 23: // Change the name of the immediate parent stored in a child return RenameParent(taskData, args); case 24: // Return the name of the immediate parent stored in a child return ShowParent(taskData, args); case 25: // Old statistics - now removed case 26: raise_exception_string(taskData, EXC_Fail, "No statistics available"); case 27: // Get number of user statistics available return Make_arbitrary_precision(taskData, N_PS_USER); case 28: // Set an entry in the user stats table. { unsigned index = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(0)); if (index >= N_PS_USER) raise_exception0(taskData, EXC_subscript); POLYSIGNED value = getPolySigned(taskData, DEREFHANDLE(args)->Get(1)); globalStats.setUserCounter(index, value); Make_arbitrary_precision(taskData, 0); } case 29: // Get local statistics. return globalStats.getLocalStatistics(taskData); case 30: // Get remote statistics. The argument is the process ID to get the statistics. return globalStats.getRemoteStatistics(taskData, getPolyUnsigned(taskData, DEREFHANDLE(args))); case 31: // Store a module return StoreModule(taskData, args); case 32: // Load a module return LoadModule(taskData, args); case 33: // Load hierarchy. This provides a complete list of children and parents. return LoadState(taskData, true, args); case 34: // Return the system directory for modules. This is configured differently // in Unix and in Windows. #if (defined(MODULEDIR)) return SAVE(C_string_to_Poly(taskData, Xstr(MODULEDIR))); #elif (defined(_WIN32) && ! defined(__CYGWIN__)) { // This registry key is configured when Poly/ML is installed using the installer. // It gives the path to the Poly/ML installation directory. We return the // Modules subdirectory. HKEY hk; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\PolyML.exe"), 0, KEY_QUERY_VALUE, &hk) == ERROR_SUCCESS) { DWORD valSize; if (RegQueryValueEx(hk, _T("Path"), 0, NULL, NULL, &valSize) == ERROR_SUCCESS) { #define MODULEDIR _T("Modules") TempString buff((TCHAR*)malloc(valSize + (_tcslen(MODULEDIR) + 1)*sizeof(TCHAR))); DWORD dwType; if (RegQueryValueEx(hk, _T("Path"), 0, &dwType, (LPBYTE)(LPTSTR)buff, &valSize) == ERROR_SUCCESS) { RegCloseKey(hk); // The registry entry should end with a backslash. _tcscat(buff, MODULEDIR); return SAVE(C_string_to_Poly(taskData, buff)); } } RegCloseKey(hk); } return SAVE(C_string_to_Poly(taskData, "")); } #else return SAVE(C_string_to_Poly(taskData, "")); #endif case 50: // GCD return gcd_arbitrary(taskData, SAVE(DEREFHANDLE(args)->Get(0)), SAVE(DEREFHANDLE(args)->Get(1))); case 51: // LCM return lcm_arbitrary(taskData, SAVE(DEREFHANDLE(args)->Get(0)), SAVE(DEREFHANDLE(args)->Get(1))); // These next ones were originally in process_env and have now been moved here, case 100: /* Return the maximum word segment size. */ return taskData->saveVec.push(TAGGED(MAX_OBJECT_SIZE)); case 101: /* Return the maximum string size (in bytes). It is the maximum number of bytes in a segment less one word for the length field. */ return taskData->saveVec.push(TAGGED((MAX_OBJECT_SIZE)*sizeof(PolyWord) - sizeof(PolyWord))); case 102: /* Test whether the supplied address is in the io area. This was previously done by having get_flags return 256 but this was changed so that get_flags simply returns the top byte of the length word. */ { PolyWord *pt = (PolyWord*)DEREFWORDHANDLE(args); if (gMem.IsIOPointer(pt)) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } case 103: /* Return the register mask for the given function. This is used by the code-generator to find out which registers are modified by the function and so need to be saved if they are used by the caller. */ { PolyObject *pt = DEREFWORDHANDLE(args); if (gMem.IsIOPointer(pt)) { /* IO area. We need to get this from the vector. */ int i; for (i=0; i < POLY_SYS_vecsize; i++) { if (pt == (PolyObject*)IoEntry(i)) { int regMask = taskData->GetIOFunctionRegisterMask(i); POLYUNSIGNED props = rtsProperties(taskData, i); return taskData->saveVec.push(TAGGED(regMask | props)); } } raise_exception_string(taskData, EXC_Fail, "Io pointer not found"); } else { /* We may have a pointer to the code or a pointer to a closure. If it's a closure we have to find the code. */ if (! pt->IsCodeObject() && ! pt->IsByteObject()) pt = pt->Get(0).AsObjPtr(); /* Should now be a code object. */ if (pt->IsCodeObject()) { /* Compiled code. This is the second constant in the constant area. */ PolyWord *codePt = pt->ConstPtrForCode(); PolyWord mask = codePt[1]; // A real mask will be an integer. if (IS_INT(mask)) return SAVE(mask); else raise_exception_string(taskData, EXC_Fail, "Invalid mask"); } else raise_exception_string(taskData, EXC_Fail, "Not a code pointer"); } } case 104: return Make_arbitrary_precision(taskData, POLY_version_number); case 105: /* Get the name of the function. */ { PolyObject *pt = DEREFWORDHANDLE(args); if (gMem.IsIOPointer(pt)) { /* IO area. */ int i; for (i=0; i < POLY_SYS_vecsize; i++) { if (pt == (PolyObject*)IoEntry(i)) { char buff[8]; sprintf(buff, "RTS%d", i); return SAVE(C_string_to_Poly(taskData, buff)); } } raise_syscall(taskData, "Io pointer not found", 0); } else if (pt->IsCodeObject()) /* Should now be a code object. */ { /* Compiled code. This is the first constant in the constant area. */ PolyWord *codePt = pt->ConstPtrForCode(); PolyWord name = codePt[0]; /* May be zero indicating an anonymous segment - return null string. */ if (name == PolyWord::FromUnsigned(0)) return SAVE(C_string_to_Poly(taskData, "")); else return SAVE(name); } else raise_syscall(taskData, "Not a code pointer", 0); } default: { char msg[100]; sprintf(msg, "Unknown poly-specific function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } polyml-5.6/libpolyml/poly_specific.h000066400000000000000000000023151265146633400177170ustar00rootroot00000000000000/* Title: poly_specific.h - exports signature for poly_specific.cpp Copyright (c) 2006 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This module is used for various run-time calls that are either in the PolyML structure or otherwise specific to Poly/ML. */ #ifndef POLY_SPECIFIC_H_INCLUDED #define POLY_SPECIFIC_H_INCLUDED class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle poly_dispatch_c(TaskData *mdTaskData, Handle args, Handle code); #endif polyml-5.6/libpolyml/polyffi.cpp000066400000000000000000000653331265146633400171030ustar00rootroot00000000000000/* Title: New Foreign Function Interface Copyright (c) 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #if (defined(_WIN32) || (defined(HAVE_DLOPEN))) #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_DLFCN_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "globals.h" // TODO: Do we need this?? // We need to include globals.h before in mingw64 otherwise // it messes up POLYUFMT/POLYSFMT. #include #include #include "arb.h" #include "save_vec.h" #include "polyffi.h" #include "run_time.h" #include "sys.h" #include "processes.h" #include "polystring.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #include "Console.h" /* For hApplicationInstance. */ #endif #include "scanaddrs.h" #include "diagnostics.h" #include "reals.h" static struct _abiTable { const char *abiName; ffi_abi abiCode; } abiTable[] = { // Unfortunately the ABI entries are enums rather than #defines so we // can't test individual entries. #ifdef X86_WIN32 {"sysv", FFI_SYSV}, {"stdcall", FFI_STDCALL}, {"thiscall", FFI_THISCALL}, {"fastcall", FFI_FASTCALL}, {"ms_cdecl", FFI_MS_CDECL}, #elif defined(X86_WIN64) {"win64", FFI_WIN64}, #elif defined(X86_ANY) {"sysv", FFI_SYSV}, {"unix64", FFI_UNIX64}, #endif { "default", FFI_DEFAULT_ABI} }; // Table of constants returned by call 51 static int constantTable[] = { FFI_DEFAULT_ABI, // Default ABI FFI_TYPE_VOID, // Type codes FFI_TYPE_INT, FFI_TYPE_FLOAT, FFI_TYPE_DOUBLE, FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32, FFI_TYPE_UINT64, FFI_TYPE_SINT64, FFI_TYPE_STRUCT, FFI_TYPE_POINTER, FFI_SIZEOF_ARG // Minimum size for result space }; // Table of predefined ffi types static ffi_type *ffiTypeTable[] = { &ffi_type_void, &ffi_type_uint8, &ffi_type_sint8, &ffi_type_uint16, &ffi_type_sint16, &ffi_type_uint32, &ffi_type_sint32, &ffi_type_uint64, &ffi_type_sint64, &ffi_type_float, &ffi_type_double, &ffi_type_pointer, &ffi_type_uchar, // These are all aliases for the above &ffi_type_schar, &ffi_type_ushort, &ffi_type_sshort, &ffi_type_uint, &ffi_type_sint, &ffi_type_ulong, &ffi_type_slong }; // Callback entry table static struct _cbStructEntry { PolyWord mlFunction; // The ML function to call void *closureSpace; // Space allocated for the closure void *resultFunction; // Executable address for the function. Needed to free. } *callbackTable; static unsigned callBackEntries = 0; static PLock callbackTableLock; // Mutex to protect table. static Handle mkAbitab(TaskData *taskData, void*, char *p); static void callbackEntryPt(ffi_cif *cif, void *ret, void* args[], void *data); static Handle toSysWord(TaskData *taskData, uintptr_t p) { Handle result = alloc_and_save(taskData, 1, F_BYTE_OBJ); *(uintptr_t*)(result->Word().AsCodePtr()) = p; return result; } static Handle toSysWord(TaskData *taskData, void *p) { return toSysWord(taskData, (uintptr_t)p); } Handle poly_ffi(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, code->Word()); switch (c) { case 0: // malloc { POLYUNSIGNED size = getPolyUnsigned(taskData, args->Word()); return toSysWord(taskData, malloc(size)); } case 1: // free { void *mem = *(void**)(args->WordP()); free(mem); return taskData->saveVec.push(TAGGED(0)); } case 2: // Load library { TempString libName(args->Word()); #if (defined(_WIN32) && ! defined(__CYGWIN__)) HINSTANCE lib = LoadLibrary(libName); if (lib == NULL) { char buf[256]; #if (defined(UNICODE)) _snprintf(buf, sizeof(buf), "Loading <%S> failed. Error %lu", (LPCTSTR)libName, GetLastError()); #else _snprintf(buf, sizeof(buf), "Loading <%s> failed. Error %lu", (const char*)libName, GetLastError()); #endif buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #else void *lib = dlopen(libName, RTLD_LAZY); if (lib == NULL) { char buf[256]; snprintf(buf, sizeof(buf), "Loading <%s> failed: %s", (const char *)libName, dlerror()); buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #endif return toSysWord(taskData, lib); } case 3: // Load address of executable. { #if (defined(_WIN32) && ! defined(__CYGWIN__)) HINSTANCE lib = hApplicationInstance; #else void *lib = dlopen(NULL, RTLD_LAZY); if (lib == NULL) { char buf[256]; snprintf(buf, sizeof(buf), "Loading address of executable failed: %s", dlerror()); buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #endif return toSysWord(taskData, lib); } case 4: // Unload library - Is this actually going to be used? { #if (defined(_WIN32) && ! defined(__CYGWIN__)) HMODULE hMod = *(HMODULE*)(args->WordP()); if (! FreeLibrary(hMod)) raise_syscall(taskData, "FreeLibrary failed", -(int)GetLastError()); #else void *lib = *(void**)(args->WordP()); if (dlclose(lib) != 0) { char buf[256]; snprintf(buf, sizeof(buf), "dlclose failed: %s", dlerror()); buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #endif return taskData->saveVec.push(TAGGED(0)); } case 5: // Load the address of a symbol from a library. { TempCString symName(args->WordP()->Get(1)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) HMODULE hMod = *(HMODULE*)(args->WordP()->Get(0).AsAddress()); void *sym = (void*)GetProcAddress(hMod, symName); if (sym == NULL) { char buf[256]; _snprintf(buf, sizeof(buf), "Loading symbol <%s> failed. Error %lu", (LPCSTR)symName, GetLastError()); buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #else void *lib = *(void**)(args->WordP()->Get(0).AsAddress()); void *sym = dlsym(lib, symName); if (sym == NULL) { char buf[256]; snprintf(buf, sizeof(buf), "load_sym <%s> : %s", (const char *)symName, dlerror()); buf[sizeof(buf)-1] = 0; // Terminate just in case raise_exception_string(taskData, EXC_foreign, buf); } #endif return toSysWord(taskData, sym); } // Libffi functions case 50: // Return a list of available ABIs return makeList(taskData, sizeof(abiTable)/sizeof(abiTable[0]), (char*)abiTable, sizeof(abiTable[0]), 0, mkAbitab); case 51: // A constant from the table { unsigned index = get_C_unsigned(taskData, args->Word()); if (index >= sizeof(constantTable) / sizeof(constantTable[0])) raise_exception_string(taskData, EXC_foreign, "Index out of range"); return Make_arbitrary_precision(taskData, constantTable[index]); } case 52: // Return an FFI type { unsigned index = get_C_unsigned(taskData, args->Word()); if (index >= sizeof(ffiTypeTable) / sizeof(ffiTypeTable[0])) raise_exception_string(taskData, EXC_foreign, "Index out of range"); return toSysWord(taskData, ffiTypeTable[index]); } case 53: // Extract fields from ffi type. { ffi_type *ffit = *(ffi_type**)(args->WordP()); Handle sizeHandle = Make_arbitrary_precision(taskData, ffit->size); Handle alignHandle = Make_arbitrary_precision(taskData, ffit->alignment); Handle typeHandle = Make_arbitrary_precision(taskData, ffit->type); Handle elemHandle = toSysWord(taskData, ffit->elements); Handle resHandle = alloc_and_save(taskData, 4); resHandle->WordP()->Set(0, sizeHandle->Word()); resHandle->WordP()->Set(1, alignHandle->Word()); resHandle->WordP()->Set(2, typeHandle->Word()); resHandle->WordP()->Set(3, elemHandle->Word()); return resHandle; } case 54: // Construct an ffi type. { // This is probably only used to create structs. size_t size = getPolyUnsigned(taskData, args->WordP()->Get(0)); unsigned short align = get_C_ushort(taskData, args->WordP()->Get(1)); unsigned short type = get_C_ushort(taskData, args->WordP()->Get(2)); unsigned nElems = 0; for (PolyWord p = args->WordP()->Get(3); !ML_Cons_Cell::IsNull(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) nElems++; size_t space = sizeof(ffi_type); // If we need the elements add space for the elements plus // one extra for the zero terminator. if (nElems != 0) space += (nElems+1) * sizeof(ffi_type *); ffi_type *result = (ffi_type*)malloc(space); // Raise an exception rather than returning zero. if (result == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); ffi_type **elem = 0; if (nElems != 0) elem = (ffi_type **)(result+1); memset(result, 0, sizeof(ffi_type)); // Zero it in case they add fields result->size = size; result->alignment = align; result->type = type; result->elements = elem; if (elem != 0) { for (PolyWord p = args->WordP()->Get(3); !ML_Cons_Cell::IsNull(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) { PolyWord e = ((ML_Cons_Cell*)p.AsObjPtr())->h; *elem++ = *(ffi_type**)(e.AsAddress()); } *elem = 0; } return toSysWord(taskData, result); } case 55: // Create a CIF. This contains all the types and some extra information. // The result is in allocated memory followed immediately by the argument type vector. { ffi_abi abi = (ffi_abi)get_C_ushort(taskData, args->WordP()->Get(0)); ffi_type *rtype = *(ffi_type **)args->WordP()->Get(1).AsAddress(); unsigned nArgs = 0; for (PolyWord p = args->WordP()->Get(2); !ML_Cons_Cell::IsNull(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) nArgs++; // Allocate space for the cif followed by the argument type vector size_t space = sizeof(ffi_cif) + nArgs * sizeof(ffi_type*); ffi_cif *cif = (ffi_cif *)malloc(space); if (cif == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); ffi_type **atypes = (ffi_type **)(cif+1); // Copy the arguments types. ffi_type **at = atypes; for (PolyWord p = args->WordP()->Get(2); !ML_Cons_Cell::IsNull(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) { PolyWord e = ((ML_Cons_Cell*)p.AsObjPtr())->h; *at++ = *(ffi_type**)(e.AsAddress()); } ffi_status status = ffi_prep_cif(cif, abi, nArgs, rtype, atypes); if (status == FFI_BAD_TYPEDEF) raise_exception_string(taskData, EXC_foreign, "Bad typedef in ffi_prep_cif"); else if (status == FFI_BAD_ABI) raise_exception_string(taskData, EXC_foreign, "Bad ABI in ffi_prep_cif"); else if (status != FFI_OK) raise_exception_string(taskData, EXC_foreign, "Error in ffi_prep_cif"); return toSysWord(taskData, cif); } case 56: // Call a function. { ffi_cif *cif = *(ffi_cif **)args->WordP()->Get(0).AsAddress(); void *f = *(void**)args->WordP()->Get(1).AsAddress(); void *res = *(void**)args->WordP()->Get(2).AsAddress(); void **arg = *(void***)args->WordP()->Get(3).AsAddress(); // We release the ML memory across the call so a GC can occur // even if this thread is blocked in the C code. processes->ThreadReleaseMLMemory(taskData); ffi_call(cif, FFI_FN(f), res, arg); // Do we need to save the value of errno/GetLastError here? processes->ThreadUseMLMemory(taskData); return taskData->saveVec.push(TAGGED(0)); } case 57: // Create a callback. { #ifdef INTERPRETED raise_exception_string(taskData, EXC_foreign, "Callbacks are not implemented in the byte code interpreter"); #endif Handle mlFunction = taskData->saveVec.push(args->WordP()->Get(0)); ffi_cif *cif = *(ffi_cif **)args->WordP()->Get(1).AsAddress(); void *resultFunction; // Allocate the memory. resultFunction is set to the executable address in or related to // the memory. ffi_closure *closure = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &resultFunction); if (closure == 0) raise_exception_string(taskData, EXC_foreign, "Callbacks not implemented or insufficient memory"); PLocker pLocker(&callbackTableLock); // Find a free entry in the table if there is one. unsigned entryNo = 0; while (entryNo < callBackEntries && callbackTable[entryNo].closureSpace != 0) entryNo++; if (entryNo == callBackEntries) { // Need to grow the table. struct _cbStructEntry *newTable = (struct _cbStructEntry*)realloc(callbackTable, (callBackEntries+1)*sizeof(struct _cbStructEntry)); if (newTable == 0) raise_exception_string(taskData, EXC_foreign, "Unable to allocate memory for callback table"); callbackTable = newTable; callBackEntries++; } callbackTable[entryNo].mlFunction = mlFunction->Word(); callbackTable[entryNo].closureSpace = closure; callbackTable[entryNo].resultFunction = resultFunction; if (ffi_prep_closure_loc(closure, cif, callbackEntryPt, (void*)((uintptr_t)entryNo), resultFunction) != FFI_OK) raise_exception_string(taskData, EXC_foreign,"libffi error: ffi_prep_closure_loc failed"); return toSysWord(taskData, resultFunction); } case 58: // Free an existing callback. { // The address returned from call 57 above is the executable address that can // be passed as a callback function. The writable memory address returned // as the result of ffi_closure_alloc may or may not be the same. To be safe // we need to search the table. void *resFun = *(void**)args->Word().AsAddress(); PLocker pLocker(&callbackTableLock); for (unsigned i = 0; i < callBackEntries; i++) { if (callbackTable[i].resultFunction == resFun) { ffi_closure_free(callbackTable[i].closureSpace); callbackTable[i].closureSpace = 0; callbackTable[i].resultFunction = 0; callbackTable[i].mlFunction = TAGGED(0); // Release the ML function return taskData->saveVec.push(TAGGED(0)); } } raise_exception_string(taskData, EXC_foreign, "Invalid callback entry"); } default: { char msg[100]; sprintf(msg, "Unknown ffi function: %d", c); raise_exception_string(taskData, EXC_foreign, msg); return 0; } } } // Load and store functions. These are implemented in assembly code or the code-generator // so are only provided for the interpreter. // These functions all take a base address, an offset and an index. The offset is // a byte addition to the base. The index is added after multiplying by the size. Handle cmem_load_8(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); return Make_arbitrary_precision(taskData, baseAddr[index]); } Handle cmem_load_16(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); return Make_arbitrary_precision(taskData, ((uint16_t*)baseAddr)[index]); } #if (SIZEOF_VOIDP == 8) Handle cmem_load_32(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); // Return a tagged value in 64-bit mode. return Make_arbitrary_precision(taskData, ((uint32_t*)baseAddr)[index]); } Handle cmem_load_64(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); // Box the result. return toSysWord(taskData, ((uint64_t*)baseAddr)[index]); } #else Handle cmem_load_32(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { // Load 32-bit int - In 32-bit mode this needs to be boxed uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); return toSysWord(taskData, ((uint32_t*)baseAddr)[index]); } #endif Handle cmem_load_float(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); return real_result(taskData, ((float*)baseAddr)[index]); } Handle cmem_load_double(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); return real_result(taskData, ((double*)baseAddr)[index]); } Handle cmem_store_8(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); uint8_t value = get_C_unsigned(taskData, valueH->Word()); baseAddr[index] = value; return taskData->saveVec.push(TAGGED(0)); } Handle cmem_store_16(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); uint16_t value = get_C_unsigned(taskData, valueH->Word()); ((uint16_t*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } #if (SIZEOF_VOIDP == 8) Handle cmem_store_32(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); uint32_t value = get_C_unsigned(taskData, valueH->Word()); ((uint32_t*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } Handle cmem_store_64(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); // This is boxed. uint64_t value = *(uint64_t*)(valueH->Word().AsAddress()); ((uint64_t*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } #else Handle cmem_store_32(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); // This is boxed in 32-bit mode. uint32_t value = *(uint32_t*)(valueH->Word().AsAddress()); ((uint32_t*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } #endif Handle cmem_store_float(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); float value = (float)real_arg(taskData->saveVec.push(valueH->Word())); ((float*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } Handle cmem_store_double(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH) { uint8_t *baseAddr = *((uint8_t**)baseH->Word().AsAddress()) + getPolySigned(taskData, offsetH->Word()); POLYSIGNED index = getPolySigned(taskData, indexH->Word()); double value = real_arg(taskData->saveVec.push(valueH->Word())); ((double*)baseAddr)[index] = value; return taskData->saveVec.push(TAGGED(0)); } // Construct an entry in the ABI table. static Handle mkAbitab(TaskData *taskData, void *arg, char *p) { struct _abiTable *ab = (struct _abiTable *)p; // Construct a pair of the string and the code Handle name = taskData->saveVec.push(C_string_to_Poly(taskData, ab->abiName)); Handle code = Make_arbitrary_precision(taskData, ab->abiCode); Handle result = alloc_and_save(taskData, 2); result->WordP()->Set(0, name->Word()); result->WordP()->Set(1, code->Word()); return result; } // This is the C function that will get control when any callback is made. The "data" // argument is the index of the entry in the callback table.. static void callbackEntryPt(ffi_cif *cif, void *ret, void* args[], void *data) { uintptr_t cbIndex = (uintptr_t)data; ASSERT(cbIndex >= 0 && cbIndex < callBackEntries); // We should get the task data for the thread that is running this code. // If this thread has been created by the foreign code we will have to // create a new one here. TaskData *taskData = processes->GetTaskDataForThread(); if (taskData == 0) { try { taskData = processes->CreateNewTaskData(0, 0, 0, TAGGED(0)); } catch (std::bad_alloc &) { ::Exit("Unable to create thread data - insufficient memory"); } catch (MemoryException &) { ::Exit("Unable to create thread data - insufficient memory"); } } else processes->ThreadUseMLMemory(taskData); // We may get multiple calls to call-backs and we mustn't risk // overflowing the save-vec. Handle mark = taskData->saveVec.mark(); // In the future we might want to call C functions without some of the // overhead that comes with an RTS call which may allocate in ML // memory. If we do that we also have to ensure that callbacks // don't allocate, so this code would have to change. Handle mlEntryHandle; { // Get the ML function. Lock to avoid another thread moving // callbackTable under our feet. PLocker pLocker(&callbackTableLock); struct _cbStructEntry *cbEntry = &callbackTable[cbIndex]; mlEntryHandle = taskData->saveVec.push(cbEntry->mlFunction); } // Create a pair of the arg vector and the result pointer. Handle argHandle = toSysWord(taskData, args); Handle resHandle = toSysWord(taskData, ret); // Result must go in here. Handle pairHandle = alloc_and_save(taskData, 2); pairHandle->WordP()->Set(0, argHandle->Word()); pairHandle->WordP()->Set(1, resHandle->Word()); // TODO: This calls BuildCodeSegment to allocate small stub code. // They could easily be cached in X86TaskData::SetCallbackFunction at least // up to the next GC. taskData->EnterCallbackFunction(mlEntryHandle, pairHandle); taskData->saveVec.reset(mark); // Release ML memory now we're going back to C. processes->ThreadReleaseMLMemory(taskData); } class PolyFFI: public RtsModule { public: virtual void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static PolyFFI polyFFIModule; // We need to scan the callback table. void PolyFFI::GarbageCollect(ScanAddress *process) { for (unsigned i = 0; i < callBackEntries; i++) process->ScanRuntimeWord(&callbackTable[i].mlFunction); } #else // The foreign function interface isn't available. #include "polyffi.h" #include "run_time.h" #include "sys.h" Handle poly_ffi(TaskData *taskData, Handle args, Handle code) { raise_exception_string(taskData, EXC_foreign, "The foreign function interface is not available on this platform"); } #endif polyml-5.6/libpolyml/polyffi.h000066400000000000000000000043341265146633400165420ustar00rootroot00000000000000/* Title: New Foreign Function Interface Copyright (c) 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _POLYFFI_H_DEFINED #define _POLYFFI_H_DEFINED 1 class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle poly_ffi (TaskData *taskData, Handle args, Handle code); extern Handle cmem_load_8(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_load_16(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_load_32(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_load_float(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_load_double(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_8(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_16(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_32(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_float(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_double(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); #if (SIZEOF_VOIDP == 8) // 64-bit mode only. extern Handle cmem_load_64(TaskData *taskData, Handle indexH, Handle offsetH, Handle baseH); extern Handle cmem_store_64(TaskData *taskData, Handle valueH, Handle indexH, Handle offsetH, Handle baseH); #endif #endif polyml-5.6/libpolyml/polyml.pc.in000066400000000000000000000004601265146633400171620ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ bindir=@bindir@ Name: Poly/ML Description: Poly/ML run-time and main program libraries URL: http://www.polyml.org/ Version: @PACKAGE_VERSION@ Requires: Libs: -L${libdir} -lpolymain -lpolyml @LIBS@ Cflags: -I${includedir} polyml-5.6/libpolyml/polystring.cpp000066400000000000000000000345621265146633400176450ustar00rootroot00000000000000/* Title: polystring.cpp - String functions and types Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include "globals.h" #include "polystring.h" #include "run_time.h" #include "mpoly.h" #include "sys.h" #include "arb.h" #include "save_vec.h" #include "processes.h" #define SAVE(x) mdTaskData->saveVec.push(x) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) // Return empty string. PolyWord EmptyString(void) { return (PolyObject*)IoEntry(POLY_SYS_emptystring); } PolyWord C_string_to_Poly(TaskData *mdTaskData, const char *buffer, size_t buffLen) /* Returns a C string as a Poly string. */ { if (buffer == NULL) return EmptyString(); if (buffLen == (size_t)-1) buffLen = strlen(buffer); /* Return the character itself if the length is 1 */ if (buffLen == 1) return TAGGED(((unsigned char *)buffer)[0]); /* Get the number of words required, plus 1 for length word, plus flag bit. */ PolyStringObject *result = (PolyStringObject *)(alloc(mdTaskData, WORDS(buffLen) + 1, F_BYTE_OBJ)); /* Set length of string, then copy the characters. */ result->length = buffLen; memcpy(result->chars,buffer,buffLen); return result; } /* C_string_to_Poly */ POLYUNSIGNED Poly_string_to_C(PolyWord ps, char *buff, POLYUNSIGNED bufflen) /* Copies the characters from the string into the destination buffer. Returns original length of string. */ { if (IS_INT(ps)) { buff[0] = (char)(UNTAGGED(ps)); buff[1] = '\0'; return(1); } PolyStringObject *str = (PolyStringObject *)ps.AsObjPtr(); POLYUNSIGNED chars = str->length >= bufflen ? bufflen-1 : str->length; if (chars != 0) strncpy(buff, str->chars, chars); buff[chars] = '\0'; return chars; } /* Poly_string_to_C */ char *Poly_string_to_C_alloc(PolyWord ps) /* Similar to Poly_string_to_C except that the string is allocated using malloc and must be freed by the caller. */ { char *res; if (IS_INT(ps)) { res = (char*)malloc(2); if (res == 0) return 0; res[0] = (char)(UNTAGGED(ps)); res[1] = '\0'; } else { PolyStringObject * str = (PolyStringObject *)ps.AsObjPtr(); POLYUNSIGNED chars = str->length; res = (char*)malloc(chars+1); if (res == 0) return 0; if (chars != 0) strncpy(res, str->chars, chars); res[chars] = '\0'; } return res; } /* Poly_string_to_C_alloc */ TempCString::~TempCString() { free(m_value); } #if (defined(_WIN32) && defined(UNICODE)) unsigned int codePage = CP_ACP; bool setWindowsCodePage(const TCHAR *codePageArg) { if (_tcscmp(codePageArg, _T("CP_ACP")) == 0) { codePage = CP_ACP; return true; } if (_tcscmp(codePageArg, _T("CP_UTF7")) == 0 || lstrcmpi(codePageArg, _T("utf7")) == 0) { codePage = CP_UTF7; return true; } if (_tcscmp(codePageArg, _T("CP_UTF8")) == 0 || lstrcmpi(codePageArg, _T("utf8")) == 0) { codePage = CP_UTF8; return true; } if (*codePageArg >= '0' && *codePageArg <= '9') { TCHAR *endp; codePage = _tcstol(codePageArg, &endp, 10); return true; } return false; } /* We need Unicode versions of these. */ PolyWord C_string_to_Poly(TaskData *mdTaskData, const WCHAR *buffer, size_t buffLen) /* Returns a Unicode string as a Poly string. */ { if (buffer == NULL) return EmptyString(); // Get the length of the string, without the terminating null. if (buffLen == -1) buffLen = wcslen(buffer); if (buffLen == 0) return EmptyString(); // If it's zero return empty string. // Find the length when converted. int outputLen = WideCharToMultiByte(codePage, 0, buffer, (int)buffLen, NULL, 0, NULL, NULL); // Return the null string if there's an error if (outputLen <= 0) return EmptyString(); // Return the character itself if the length is 1 */ if (outputLen == 1) { char obuff[1]; int check = WideCharToMultiByte(codePage, 0, buffer, (int)buffLen, obuff, 1, NULL, NULL); if (check <= 0) return EmptyString(); return TAGGED(obuff[0]); } // Get the number of words required, plus 1 for length word, plus flag bit. PolyStringObject *result = (PolyStringObject *)(alloc(mdTaskData, WORDS(outputLen) + 1, F_BYTE_OBJ)); // Set length of string, then copy the characters. result->length = outputLen; int check = WideCharToMultiByte(codePage, 0, buffer, (int)buffLen, result->chars, outputLen, NULL, NULL); if (check <= 0) return EmptyString(); return result; } POLYUNSIGNED Poly_string_to_C(PolyWord ps, WCHAR *buff, POLYUNSIGNED bufflen) { char iBuff[1]; int iLength = 0; const char *iPtr; if (IS_INT(ps)) { iLength = 1; iBuff[0] = (char)UNTAGGED(ps); iPtr = iBuff; } else { PolyStringObject *str = (PolyStringObject *)ps.AsObjPtr(); iLength = (int)str->length; if (iLength == 0) { // Null string. if (bufflen != 0) buff[0] = 0; return 0; } iPtr = str->chars; } // We can convert it directly using the maximum string length. int space = MultiByteToWideChar(codePage, 0, iPtr, iLength, buff, (int)bufflen-1); if (space <= 0) { if (bufflen != 0) buff[0] = 0; return 0; // Error } buff[space] = 0; // Null terminate return space; } WCHAR *Poly_string_to_U_alloc(PolyWord ps) { char iBuff[1]; int iLength = 0; const char *iPtr; if (IS_INT(ps)) { iLength = 1; iBuff[0] = (char)UNTAGGED(ps); iPtr = iBuff; } else { PolyStringObject *str = (PolyStringObject *)ps.AsObjPtr(); iLength = (int)str->length; if (iLength == 0) return _wcsdup(L""); iPtr = str->chars; } // Find the space required. int chars = MultiByteToWideChar(codePage, 0, iPtr, iLength, NULL, 0); if (chars <= 0) return _wcsdup(L""); WCHAR *res = (WCHAR*)malloc((chars+1) * sizeof(WCHAR)); if (res == 0) return 0; chars = MultiByteToWideChar(codePage, 0, iPtr, iLength, res, chars); res[chars] = 0; return res; } // convert_string_list return a list of strings. // This converts Unicode strings. Handle convert_string_list(TaskData *mdTaskData, int count, WCHAR **strings) { Handle saved = mdTaskData->saveVec.mark(); Handle list = SAVE(ListNull); // It's simplest to process the strings in reverse order */ for (int i = count - 1; 0 <= i; i--) { Handle value = SAVE(C_string_to_Poly(mdTaskData, strings[i])); Handle next = alloc_and_save(mdTaskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); // reset save vector to stop it overflowing mdTaskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } TempString::~TempString() { free(m_value); } #endif /* convert_string_list return a list of strings. */ Handle convert_string_list(TaskData *mdTaskData, int count, char **strings) { Handle saved = mdTaskData->saveVec.mark(); Handle list = SAVE(ListNull); // It's simplest to process the strings in reverse order */ for (int i = count - 1; 0 <= i; i--) { /* The order of these declarations is important, becaue we don't want to have make to make the cons cell mutable. This is only safe if we promise to initialise it fully before the next ML heap allocation. SPF 29/11/96 */ Handle value = SAVE(C_string_to_Poly(mdTaskData, strings[i])); Handle next = alloc_and_save(mdTaskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); // reset save vector to stop it overflowing mdTaskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } /* Convert a string list to a vector of C strings. */ char **stringListToVector(Handle list) { int len = 0; /* Find the length of the list */ for (PolyWord p = DEREFHANDLE(list); p != ListNull; p = ((ML_Cons_Cell*)p.AsObjPtr())->t) len++; /* Allocate vector. */ char **vec = (char**)calloc(len+1, sizeof(char*)); /* Copy the strings and put them into the vector. */ len = 0; PolyWord q = DEREFHANDLE(list); while (q != ListNull) { ML_Cons_Cell *cell = (ML_Cons_Cell*)q.AsObjPtr(); vec[len++] = Poly_string_to_C_alloc(cell->h); q = cell->t; } return vec; } /* Free the memory used by the vector. */ void freeStringVector(char **vec) { char **p; if (vec == 0) return; for (p = vec; *p != 0; p++) free(*p); free(vec); } // Concatenate two strings. Now used only internally in the RTS. Handle strconcatc(TaskData *mdTaskData, Handle y, Handle x) /* Note: arguments are in the reverse order from Poly */ { Handle result; POLYUNSIGNED len, xlen, ylen; char *from_ptr, *to_ptr; if (IS_INT(DEREFWORD(x))) xlen = 1; else xlen = DEREFSTRINGHANDLE(x)->length; /* Don't concatenate with null strings */ if (xlen == 0) return y; if (IS_INT(DEREFWORD(y))) ylen = 1; else ylen = DEREFSTRINGHANDLE(y)->length; if (ylen == 0) return x; len = xlen + ylen; /* Get store for combined string. Include rounding up to next word and room for the length word and add in the flag. */ result = alloc_and_save(mdTaskData, (len + sizeof(PolyWord)-1)/sizeof(PolyWord) + 1, F_BYTE_OBJ); DEREFSTRINGHANDLE(result)->length = len; /* Copy first string */ to_ptr = DEREFSTRINGHANDLE(result)->chars; if (xlen == 1) { *to_ptr++ = (char)UNTAGGED(DEREFSTRINGHANDLE(x)); } else { from_ptr = DEREFSTRINGHANDLE(x)->chars; while (xlen-- > 0) (*to_ptr++ = *from_ptr++); } /* Add on second */ if (ylen == 1) { *to_ptr = (char)UNTAGGED(DEREFSTRINGHANDLE(y)); } else { from_ptr = DEREFSTRINGHANDLE(y)->chars; while (ylen-- > 0) (*to_ptr++ = *from_ptr++); } return(result); } /* strconcat */ void print_string(PolyWord s) { extern FILE *polyStdout; if (IS_INT(s)) putc((char)UNTAGGED(s), polyStdout); else { PolyStringObject * str = (PolyStringObject *)s.AsObjPtr(); fwrite(str->chars, 1, str->length, polyStdout); } } Handle string_length_c(TaskData *mdTaskData, Handle string) /* Length of a string */ { PolyWord str = string->Word(); if (str.IsTagged()) // Short form return Make_arbitrary_precision(mdTaskData, 1); POLYUNSIGNED length = ((PolyStringObject *)str.AsObjPtr())->length; return Make_arbitrary_precision(mdTaskData, length); } static PolyStringObject s_test_x, s_test_y; // These functions are used in the interpreter. They are generally replaced by // hand-coded versions in the assembly code section. static int string_test(PolyWord x, PolyWord y) /* Returns -1, 0, +1 if the first string is less, equal to or greater than the second. These are addresses of the strings because calling fix_persistent_address could result in a garbage-collection which could move the other string. */ { POLYUNSIGNED i; PolyStringObject *xs, *ys; /* Deal with single characters. */ if (IS_INT(x)) { s_test_x.length = 1; s_test_x.chars[0] = (char)UNTAGGED(x); xs = &s_test_x; } else xs = (PolyStringObject*)x.AsObjPtr(); if (IS_INT(y)) { s_test_y.length = 1; s_test_y.chars[0] = (char)UNTAGGED(y); ys = &s_test_y; } else ys = (PolyStringObject*)y.AsObjPtr(); /* Now do the comparison. */ for(i = 0; i < xs->length && i < ys->length; i++) { if (xs->chars[i] != ys->chars[i]) return xs->chars[i] < ys->chars[i] ? -1 : 1; } /* They must be equal or one must be a leading substring of the other. */ if (i < xs->length) return 1; /* y must be the substring. */ else if (i < ys->length) return -1; /* x must be the substring */ else return 0; /* They must be equal. */ } Handle compareStrings(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(TAGGED(string_test(DEREFWORD(x), DEREFWORD(y)))); } Handle testStringEqual(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) == 0 ? TAGGED(1) : TAGGED(0)); } Handle testStringNotEqual(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) != 0 ? TAGGED(1) : TAGGED(0)); } Handle testStringGreater(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) > 0 ? TAGGED(1) : TAGGED(0)); } Handle testStringLess(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) < 0 ? TAGGED(1) : TAGGED(0)); } Handle testStringGreaterOrEqual(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) >= 0 ? TAGGED(1) : TAGGED(0)); } Handle testStringLessOrEqual(TaskData *mdTaskData, Handle y, Handle x) { return mdTaskData->saveVec.push(string_test(DEREFWORD(x), DEREFWORD(y)) <= 0 ? TAGGED(1) : TAGGED(0)); } polyml-5.6/libpolyml/polystring.h000066400000000000000000000104131265146633400172770ustar00rootroot00000000000000/* Title: polystring.h - String functions and types Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef POLYSTRING_H #define POLYSTRING_H #include "globals.h" // For PolyObject class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; // A string object. N.B. Poly strings can be either a single tagged integer or // a pointer to this. class PolyStringObject: public PolyObject { public: POLYUNSIGNED length; char chars[1]; }; inline POLYUNSIGNED PolyStringLength(PolyWord ps) { return IS_INT(ps) ? 1 : ((PolyStringObject*)ps.AsObjPtr())->length; } // We often want to be able to allocate a temporary C string from a Poly string // and have it automatically deallocated when the context has been exited. extern PolyWord EmptyString(void); /* PolyStringObject functions */ extern PolyWord C_string_to_Poly(TaskData *mdTaskData, const char *buffer, size_t buffLen = -1); extern POLYUNSIGNED Poly_string_to_C(PolyWord ps, char *buff, POLYUNSIGNED bufflen); extern char *Poly_string_to_C_alloc(PolyWord ps); extern Handle convert_string_list(TaskData *mdTaskData, int count, char **strings); // Dynamically allocated strings with automatic freeing. // These are mainly used for file-names. class TempCString { public: TempCString(char *p = 0): m_value(p) {} TempCString(PolyWord ps): m_value(Poly_string_to_C_alloc(ps)) {} ~TempCString(); operator char*() { return m_value; } char* operator = (char* p) { return (m_value = p); } private: char *m_value; }; #if (defined(_WIN32) && defined(UNICODE)) extern unsigned int codePage; extern bool setWindowsCodePage(const TCHAR *codePageArg); #ifdef HAVE_TCHAR_H #include #else #define WCHAR short #define TCHAR char #endif extern PolyWord C_string_to_Poly(TaskData *mdTaskData, const WCHAR *buffer, size_t buffLen = -1); extern POLYUNSIGNED Poly_string_to_C(PolyWord ps, WCHAR *buff, POLYUNSIGNED bufflen); extern WCHAR *Poly_string_to_U_alloc(PolyWord ps); extern Handle convert_string_list(TaskData *mdTaskData, int count, WCHAR **strings); // Poly_string_to_T_alloc returns a Unicode string in Unicode and char string otherwise. #define Poly_string_to_T_alloc Poly_string_to_U_alloc // Unicode on Windows, character strings elsewhere. class TempString { public: TempString(TCHAR *p = 0): m_value(p) {} TempString(PolyWord ps): m_value(Poly_string_to_T_alloc(ps)) {} ~TempString(); operator TCHAR*() { return m_value; } TCHAR* operator = (TCHAR* p) { return (m_value = p); } private: TCHAR *m_value; }; #else #define Poly_string_to_T_alloc Poly_string_to_C_alloc #define TempString TempCString #endif extern char **stringListToVector(Handle list); extern void freeStringVector(char **vec); extern void print_string(PolyWord s); // These should no longer be used in the RTS except internally. // They are currently used by the ML code during bootstrapping. extern Handle strconcatc(TaskData *mdTaskData, Handle x, Handle y); Handle string_length_c(TaskData *mdTaskData, Handle string); #define DEREFSTRINGHANDLE(_x) ((PolyStringObject *)(_x)->WordP()) extern Handle compareStrings(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringEqual(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringNotEqual(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringGreater(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringLess(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringGreaterOrEqual(TaskData *mdTaskData, Handle y, Handle x); extern Handle testStringLessOrEqual(TaskData *mdTaskData, Handle y, Handle x); #endif /* POLYSTRING_H */ polyml-5.6/libpolyml/process_env.cpp000066400000000000000000000517201265146633400177540ustar00rootroot00000000000000/* Title: Process environment. Copyright (c) 2000-8 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #if (defined(__CYGWIN__) || defined(_WIN32)) #include #endif // Include this next before errors.h since in WinCE at least the winsock errors are defined there. #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #include #else typedef char TCHAR; #define _tgetenv getenv #endif #include "globals.h" #include "sys.h" #include "run_time.h" #include "process_env.h" #include "arb.h" #include "mpoly.h" #include "gc.h" #include "scanaddrs.h" #include "polystring.h" #include "save_vec.h" #include "process_env.h" #include "rts_module.h" #include "machine_dep.h" #include "processes.h" #include "locking.h" #include "errors.h" #include "poly_specific.h" // For the functions that have been moved. #define SAVE(x) mdTaskData->saveVec.push(x) #define ALLOC(n) alloc_and_save(mdTaskData, n) #if (defined(_WIN32) && ! defined(__CYGWIN__)) #define ISPATHSEPARATOR(c) ((c) == '\\' || (c) == '/') #define DEFAULTSEPARATOR "\\" #else #define ISPATHSEPARATOR(c) ((c) == '/') #define DEFAULTSEPARATOR "/" #endif #ifdef _MSC_VER // Don't tell me about ISO C++ changes. #pragma warning(disable:4996) #endif // "environ" is declared in the headers on some systems but not all. // Oddly, declaring it within process_env_dispatch_c causes problems // on mingw where "environ" is actually a function. #if __APPLE__ // On Mac OS X there may be problems accessing environ directly. #include #define environ (*_NSGetEnviron()) #else extern char **environ; #endif /* Functions registered with atExit are added to this list. */ static PolyWord at_exit_list = TAGGED(0); /* Once "exit" is called this flag is set and no further calls to atExit are allowed. */ static bool exiting = false; static PLock atExitLock; // Thread lock for above. #ifdef __CYGWIN__ // Cygwin requires spawnvp to avoid the significant overhead of vfork // but it doesn't seem to be thread-safe. Run it on the main thread // to be sure. class CygwinSpawnRequest: public MainThreadRequest { public: CygwinSpawnRequest(char **argv): MainThreadRequest(MTP_CYGWINSPAWN), spawnArgv(argv) {} virtual void Perform(); char **spawnArgv; int pid; }; void CygwinSpawnRequest::Perform() { pid = spawnvp(_P_NOWAIT, "/bin/sh", spawnArgv); } #endif Handle process_env_dispatch_c(TaskData *mdTaskData, Handle args, Handle code) { unsigned c = get_C_unsigned(mdTaskData, DEREFWORDHANDLE(code)); switch (c) { case 0: /* Return the program name. */ return SAVE(C_string_to_Poly(mdTaskData, userOptions.programName)); case 1: /* Return the argument list. */ return convert_string_list(mdTaskData, userOptions.user_arg_count, userOptions.user_arg_strings); case 14: /* Return a string from the environment. */ { TempString buff(args->Word()); if (buff == 0) raise_syscall(mdTaskData, "Insufficient memory", ENOMEM); TCHAR *res = _tgetenv(buff); if (res == NULL) raise_syscall(mdTaskData, "Not Found", 0); else return SAVE(C_string_to_Poly(mdTaskData, res)); } case 21: // Return the whole environment. Only available in Posix.ProcEnv. { /* Count the environment strings */ int env_count = 0; while (environ[env_count] != NULL) env_count++; return convert_string_list(mdTaskData, env_count, environ); } case 15: /* Return the success value. */ return Make_arbitrary_precision(mdTaskData, EXIT_SUCCESS); case 16: /* Return a failure value. */ return Make_arbitrary_precision(mdTaskData, EXIT_FAILURE); case 17: /* Run command. */ { TempString buff(args->Word()); if (buff == 0) raise_syscall(mdTaskData, "Insufficient memory", ENOMEM); int res = -1; #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Windows. TCHAR *argv[4]; argv[0] = _tgetenv(_T("COMSPEC")); // Default CLI. if (argv[0] == 0) argv[0] = (TCHAR*)_T("cmd.exe"); // Win NT etc. argv[1] = (TCHAR*)_T("/c"); argv[2] = buff; argv[3] = NULL; // If _P_NOWAIT is given the result is the process handle. // spawnvp does any necessary path searching if argv[0] // does not contain a full path. intptr_t pid = _tspawnvp(_P_NOWAIT, argv[0], argv); if (pid == -1) raise_syscall(mdTaskData, "Function system failed", errno); #else // Cygwin and Unix char *argv[4]; argv[0] = (char*)"sh"; argv[1] = (char*)"-c"; argv[2] = buff; argv[3] = NULL; #if (defined(__CYGWIN__)) CygwinSpawnRequest request(argv); processes->MakeRootRequest(mdTaskData, &request); int pid = request.pid; if (pid < 0) raise_syscall(mdTaskData, "Function system failed", errno); #else // We need to break this down so that we can unblock signals in the // child process. // The Unix "system" function seems to set SIGINT and SIGQUIT to // SIG_IGN in the parent so that the wait will not be interrupted. // That may make sense in a single-threaded application but is // that right here? int pid = vfork(); if (pid == -1) raise_syscall(mdTaskData, "Function system failed", errno); else if (pid == 0) { // In child sigset_t sigset; sigemptyset(&sigset); sigprocmask(SIG_SETMASK, &sigset, 0); // Reset other signals? execve("/bin/sh", argv, environ); _exit(1); } #endif #endif while (true) { try { // Test to see if the child has returned. #if (defined(_WIN32) && ! defined(__CYGWIN__)) switch (WaitForSingleObject((HANDLE)pid, 0)) { case WAIT_OBJECT_0: { DWORD result; BOOL fResult = GetExitCodeProcess((HANDLE)pid, &result); if (! fResult) raise_syscall(mdTaskData, "Function system failed", -(int)GetLastError()); CloseHandle((HANDLE)pid); return Make_arbitrary_precision(mdTaskData, result); } case WAIT_FAILED: raise_syscall(mdTaskData, "Function system failed", -(int)GetLastError()); } // Wait for the process to exit or for the timeout WaitHandle waiter((HANDLE)pid); processes->ThreadPauseForIO(mdTaskData, &waiter); #else int wRes = waitpid(pid, &res, WNOHANG); if (wRes > 0) break; else if (wRes < 0) { raise_syscall(mdTaskData, "Function system failed", errno); } // In Unix the best we can do is wait. This may be interrupted // by SIGCHLD depending on where signals are processed. // One possibility is for the main thread to somehow wake-up // the thread when it processes a SIGCHLD. processes->ThreadPause(mdTaskData); #endif } catch (...) { // Either IOException or KillException. // We're abandoning the wait. This will leave // a zombie in Unix. #if (defined(_WIN32) && ! defined(__CYGWIN__)) CloseHandle((HANDLE)pid); #endif throw; } } return Make_arbitrary_precision(mdTaskData, res); } case 18: /* Register function to run at exit. */ { PLocker locker(&atExitLock); if (! exiting) { PolyObject *cell = alloc(mdTaskData, 2); cell->Set(0, at_exit_list); cell->Set(1, DEREFWORD(args)); at_exit_list = cell; } return Make_arbitrary_precision(mdTaskData, 0); } case 19: /* Return the next function in the atExit list and set the "exiting" flag to true. */ { PLocker locker(&atExitLock); Handle res; exiting = true; /* Ignore further calls to atExit. */ if (at_exit_list == TAGGED(0)) raise_syscall(mdTaskData, "List is empty", 0); PolyObject *cell = at_exit_list.AsObjPtr(); res = SAVE(cell->Get(1)); at_exit_list = cell->Get(0); return res; } case 20: /* Terminate without running the atExit list or flushing buffers. */ { /* I don't like terminating without some sort of clean up but we'll do it this way for the moment. */ int i = get_C_int(mdTaskData, DEREFWORDHANDLE(args)); _exit(i); } /************ Error codes **************/ case 2: /* Get the name of a numeric error message. */ { char buff[40]; int e = get_C_int(mdTaskData, DEREFWORDHANDLE(args)); Handle res; /* First look to see if we have the name in the error table. They should generally all be there. */ const char *errorMsg = stringFromErrorCode(e); if (errorMsg != NULL) return SAVE(C_string_to_Poly(mdTaskData, errorMsg)); /* We get here if there's an error which isn't in the table. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* In the Windows version we may have both errno values and also GetLastError values. We convert the latter into negative values before returning them. */ if (e < 0) { sprintf(buff, "WINERROR%0d", -e); res = SAVE(C_string_to_Poly(mdTaskData, buff)); return res; } else #endif { sprintf(buff, "ERROR%0d", e); res = SAVE(C_string_to_Poly(mdTaskData, buff)); } return res; } case 3: /* Get the explanatory message for an error. */ { return errorMsg(mdTaskData, get_C_int(mdTaskData, DEREFWORDHANDLE(args))); } case 4: /* Try to convert an error string to an error number. */ { char buff[40]; /* Get the string. */ Poly_string_to_C(DEREFWORD(args), buff, sizeof(buff)); /* Look the string up in the table. */ int err = 0; if (errorCodeFromString(buff, &err)) return Make_arbitrary_precision(mdTaskData, err); /* If we don't find it then it may have been a constructed error name. */ if (strncmp(buff, "ERROR", 5) == 0) { int i = atoi(buff+5); if (i > 0) return Make_arbitrary_precision(mdTaskData, i); } #if (defined(_WIN32) && ! defined(__CYGWIN__)) if (strncmp(buff, "WINERROR", 8) == 0) { int i = atoi(buff+8); if (i > 0) return Make_arbitrary_precision(mdTaskData, -i); } #endif return Make_arbitrary_precision(mdTaskData, 0); } /************ Directory/file paths **************/ case 5: /* Return the string representing the current arc. */ return SAVE(C_string_to_Poly(mdTaskData, ".")); case 6: /* Return the string representing the parent arc. */ /* I don't know that this exists in MacOS. */ return SAVE(C_string_to_Poly(mdTaskData, "..")); case 7: /* Return the string representing the directory separator. */ return SAVE(C_string_to_Poly(mdTaskData, DEFAULTSEPARATOR)); case 8: /* Test the character to see if it matches a separator. */ { int e = get_C_int(mdTaskData, DEREFWORDHANDLE(args)); if (ISPATHSEPARATOR(e)) return Make_arbitrary_precision(mdTaskData, 1); else return Make_arbitrary_precision(mdTaskData, 0); } case 9: /* Are names case-sensitive? */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Windows - no. */ return Make_arbitrary_precision(mdTaskData, 0); #else /* Unix - yes. */ return Make_arbitrary_precision(mdTaskData, 1); #endif // These are no longer used. The code is handled entirely in ML. case 10: /* Are empty arcs redundant? */ /* Unix and Windows - yes. */ return Make_arbitrary_precision(mdTaskData, 1); case 11: /* Match the volume name part of a path. */ { const TCHAR *volName = NULL; int isAbs = 0; int toRemove = 0; PolyWord path = DEREFHANDLE(args); /* This examines the start of a string and determines how much of it represents the volume name and returns the number of characters to remove, the volume name and whether it is absolute. One would assume that if there is a volume name then it is absolute but there is a peculiar form in Windows/DOS (e.g. A:b\c) which means the file b\c relative to the currently selected directory on the volume A. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) TempString buff(path); if (buff == 0) raise_syscall(mdTaskData, "Insufficient memory", ENOMEM); size_t length = _tcslen(buff); if (length >= 2 && buff[1] == ':') { /* Volume name? */ if (length >= 3 && ISPATHSEPARATOR(buff[2])) { /* Absolute path. */ toRemove = 3; isAbs = 1; } else { toRemove = 2; isAbs = 0; } volName = buff; buff[2] = '\0'; } else if (length > 3 && ISPATHSEPARATOR(buff[0]) && ISPATHSEPARATOR(buff[1]) && ! ISPATHSEPARATOR(buff[2])) { /* UNC name? */ int i; /* Skip the server name. */ for (i = 3; buff[i] != 0 && !ISPATHSEPARATOR(buff[i]); i++); if (ISPATHSEPARATOR(buff[i])) { i++; /* Skip the share name. */ for (; buff[i] != 0 && !ISPATHSEPARATOR(buff[i]); i++); toRemove = i; if (buff[i] != 0) toRemove++; isAbs = 1; volName = buff; buff[i] = '\0'; } } else if (ISPATHSEPARATOR(buff[0])) /* \a\b strictly speaking is relative to the current drive. It's much easier to treat it as absolute. */ { toRemove = 1; isAbs = 1; volName = _T(""); } #else /* Unix - much simpler. */ char toTest = 0; if (IS_INT(path)) toTest = UNTAGGED(path); else { PolyStringObject * ps = (PolyStringObject *)path.AsObjPtr(); if (ps->length > 1) toTest = ps->chars[0]; } if (ISPATHSEPARATOR(toTest)) { toRemove = 1; isAbs = 1; volName = ""; } #endif /* Construct the result. */ { Handle sVol = SAVE(C_string_to_Poly(mdTaskData, volName)); Handle sRes = ALLOC(3); DEREFWORDHANDLE(sRes)->Set(0, TAGGED(toRemove)); DEREFHANDLE(sRes)->Set(1, DEREFWORDHANDLE(sVol)); DEREFWORDHANDLE(sRes)->Set(2, TAGGED(isAbs)); return sRes; } } case 12: /* Construct a name from a volume and whether it is absolute. */ { unsigned isAbs = get_C_unsigned(mdTaskData, DEREFHANDLE(args)->Get(1)); PolyWord volName = DEREFHANDLE(args)->Get(0); /* In Unix the volume name will always be empty. */ if (isAbs == 0) return SAVE(volName); /* N.B. The arguments to strconcatc are in reverse. */ else return strconcatc(mdTaskData, SAVE(C_string_to_Poly(mdTaskData, DEFAULTSEPARATOR)), SAVE(volName)); } case 13: /* Is the string a valid file name? */ { PolyWord volName = DEREFWORD(args); // First check for NULL. This is not allowed in either Unix or Windows. if (IS_INT(volName)) { if (volName == TAGGED(0)) return Make_arbitrary_precision(mdTaskData, 0); } else { PolyStringObject * volume = (PolyStringObject *)(volName.AsObjPtr()); for (POLYUNSIGNED i = 0; i < volume->length; i++) { if (volume->chars[i] == '\0') return Make_arbitrary_precision(mdTaskData, 0); } } #if (defined(_WIN32) && ! defined(__CYGWIN__)) // We need to look for certain invalid characters but only after // we've converted it to Unicode if necessary. TempString name(volName); for (const TCHAR *p = name; *p != 0; p++) { switch (*p) { case '<': case '>': case ':': case '"': case '\\': case '|': case '?': case '*': case '\0': #if (0) // This currently breaks the build. case '/': #endif return Make_arbitrary_precision(mdTaskData, 0); } if (*p >= 0 && *p <= 31) return Make_arbitrary_precision(mdTaskData, 0); } // Should we check for special names such as aux, con, prn ?? return Make_arbitrary_precision(mdTaskData, 1); #else // That's all we need for Unix. // TODO: Check for /. It's invalid in a file name arc. return Make_arbitrary_precision(mdTaskData, 1); #endif } // A group of calls have now been moved to poly_specific. // This entry is returned for backwards compatibility. case 100: case 101: case 102: case 103: case 104: case 105: return poly_dispatch_c(mdTaskData, args, code); default: { char msg[100]; sprintf(msg, "Unknown environment function: %d", c); raise_exception_string(mdTaskData, EXC_Fail, msg); return 0; } } } /* Terminate normally with a result code. */ Handle finishc(TaskData *taskData, Handle h) { int i = get_C_int(taskData, DEREFWORDHANDLE(h)); // Cause the other threads to exit. processes->Exit(i); // Exit this thread processes->ThreadExit(taskData); // Doesn't return. // Push a dummy result to keep lint happy return taskData->saveVec.push(TAGGED(0)); } class ProcessEnvModule: public RtsModule { public: void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static ProcessEnvModule processModule; void ProcessEnvModule::GarbageCollect(ScanAddress *process) /* Ensures that all the objects are retained and their addresses updated. */ { if (at_exit_list.IsDataPtr()) { PolyObject *obj = at_exit_list.AsObjPtr(); process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_STRONG); at_exit_list = obj; } } polyml-5.6/libpolyml/process_env.h000066400000000000000000000021161265146633400174140ustar00rootroot00000000000000/* Title: Process environment. Copyright (c) 2000 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PROCESS_H #define PROCESS_H class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle process_env_dispatch_c(TaskData *mdTaskData, Handle args, Handle code); extern Handle finishc(TaskData *mdTaskData, Handle h); #endif polyml-5.6/libpolyml/processes.cpp000066400000000000000000002264021265146633400174350ustar00rootroot00000000000000/* Title: Thread functions Author: David C.J. Matthews Copyright (c) 2007,2008,2013-15 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_PROCESS_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_UNISTD_H #include // Want unistd for _SC_NPROCESSORS_ONLN at least #endif #ifdef HAVE_SYS_SELECT_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_LIBPTHREAD) && defined(HAVE_PTHREAD_H)) #define HAVE_PTHREAD 1 #include #endif #ifdef HAVE_SYS_SYSCTL_H // Used determine number of processors in Mac OS X. #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #endif #include /************************************************************************ * * Include runtime headers * ************************************************************************/ #include "globals.h" #include "gc.h" #include "mpoly.h" #include "arb.h" #include "machine_dep.h" #include "diagnostics.h" #include "processes.h" #include "run_time.h" #include "sys.h" #include "sighandler.h" #include "scanaddrs.h" #include "save_vec.h" #include "rts_module.h" #include "noreturn.h" #include "memmgr.h" #include "locking.h" #include "profiling.h" #include "sharedata.h" #include "exporter.h" #include "statistics.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include "Console.h" #endif #define SAVE(x) taskData->saveVec.push(x) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) // These values are stored in the second word of thread id object as // a tagged integer. They may be set and read by the thread in the ML // code. #define PFLAG_BROADCAST 1 // If set, accepts a broadcast // How to handle interrrupts #define PFLAG_IGNORE 0 // Ignore interrupts completely #define PFLAG_SYNCH 2 // Handle synchronously #define PFLAG_ASYNCH 4 // Handle asynchronously #define PFLAG_ASYNCH_ONCE 6 // First handle asynchronously then switch to synch. #define PFLAG_INTMASK 6 // Mask of the above bits class Processes: public ProcessExternal, public RtsModule { public: Processes(); virtual void Init(void); virtual void Stop(void); void GarbageCollect(ScanAddress *process); public: void BroadcastInterrupt(void); void BeginRootThread(PolyObject *rootFunction); void Exit(int n); // Request all ML threads to exit and set the process result code. // Called when a thread has completed - doesn't return. virtual NORETURNFN(void ThreadExit(TaskData *taskData)); // Called when a thread may block. Returns some time later when perhaps // the input is available. virtual void ThreadPauseForIO(TaskData *taskData, Waiter *pWait); // Return the task data for the current thread. virtual TaskData *GetTaskDataForThread(void); // Create a new task data object for the current thread. virtual TaskData *CreateNewTaskData(Handle threadId, Handle threadFunction, Handle args, PolyWord flags); // ForkFromRTS. Creates a new thread from within the RTS. virtual bool ForkFromRTS(TaskData *taskData, Handle proc, Handle arg); // Create a new thread. The "args" argument is only used for threads // created in the RTS by the signal handler. Handle ForkThread(TaskData *taskData, Handle threadFunction, Handle args, PolyWord flags, PolyWord stacksize); // Process general RTS requests from ML. Handle ThreadDispatch(TaskData *taskData, Handle args, Handle code); virtual void ThreadUseMLMemory(TaskData *taskData); virtual void ThreadReleaseMLMemory(TaskData *taskData); // If the schedule lock is already held we need to use these functions. void ThreadUseMLMemoryWithSchedLock(TaskData *taskData); void ThreadReleaseMLMemoryWithSchedLock(TaskData *taskData); // Requests from the threads for actions that need to be performed by // the root thread. Make the request and wait until it has completed. virtual void MakeRootRequest(TaskData *taskData, MainThreadRequest *request); // Deal with any interrupt or kill requests. virtual bool ProcessAsynchRequests(TaskData *taskData); // Process an interrupt request synchronously. virtual void TestSynchronousRequests(TaskData *taskData); // Process any events, synchronous or asynchronous. virtual void TestAnyEvents(TaskData *taskData); // Set a thread to be interrupted or killed. Wakes up the // thread if necessary. MUST be called with taskArrayLock held. void MakeRequest(TaskData *p, ThreadRequests request); // Profiling control. virtual void StartProfiling(void); virtual void StopProfiling(void); #ifdef HAVE_WINDOWS_H // Windows: Called every millisecond while profiling is on. void ProfileInterrupt(void); #else // Unix: Start a profile timer for a thread. void StartProfilingTimer(void); #endif // Memory allocation. Tries to allocate space. If the allocation succeeds it // may update the allocation values in the taskData object. If the heap is exhausted // it may set this thread (or other threads) to raise an exception. PolyWord *FindAllocationSpace(TaskData *taskData, POLYUNSIGNED words, bool alwaysInSeg); // Find a task that matches the specified identifier and returns // it if it exists. MUST be called with taskArrayLock held. TaskData *TaskForIdentifier(Handle taskId); // Signal handling support. The ML signal handler thread blocks until it is // woken up by the signal detection thread. virtual bool WaitForSignal(TaskData *taskData, PLock *sigLock); virtual void SignalArrived(void); virtual void SetSingleThreaded(void) { singleThreaded = true; } // Generally, the system runs with multiple threads. After a // fork, though, there is only one thread. bool singleThreaded; // Each thread has an entry in this array. TaskData **taskArray; unsigned taskArraySize; // Current size of the array. /* schedLock: This lock must be held when making scheduling decisions. It must also be held before adding items to taskArray, removing them or scanning the array. It must also be held before deleting a TaskData object or using it in a thread other than the "owner" */ PLock schedLock; #ifdef HAVE_PTHREAD pthread_key_t tlsId; #elif defined(HAVE_WINDOWS_H) DWORD tlsId; #endif // We make an exception packet for Interrupt and store it here. // This exception can be raised if we run out of store so we need to // make sure we have the packet before we do. poly_exn *interrupt_exn; /* initialThreadWait: The initial thread waits on this for wake-ups from the ML threads requesting actions such as GC or close-down. */ PCondVar initialThreadWait; // A requesting thread sets this to indicate the request. This value // is only reset once the request has been satisfied. MainThreadRequest *threadRequest; PCondVar mlThreadWait; // All the threads block on here until the request has completed. int exitResult; bool exitRequest; // Shutdown locking. void CrowBarFn(void); PLock shutdownLock; PCondVar crowbarLock, crowbarStopped; bool crowbarRunning; #ifdef HAVE_WINDOWS_H // Used in profiling HANDLE hStopEvent; /* Signalled to stop all threads. */ HANDLE profilingHd; HANDLE mainThreadHandle; // Handle for main thread LONGLONG lastCPUTime; // CPU used by main thread. #endif TaskData *sigTask; // Pointer to current signal task. }; // Global process data. static Processes processesModule; ProcessExternal *processes = &processesModule; Processes::Processes(): singleThreaded(false), taskArray(0), taskArraySize(0), schedLock("Scheduler"), interrupt_exn(0), threadRequest(0), exitResult(0), exitRequest(false), crowbarRunning(false), sigTask(0) { #ifdef HAVE_WINDOWS_H Waiter::hWakeupEvent = NULL; hStopEvent = NULL; profilingHd = NULL; lastCPUTime = 0; mainThreadHandle = NULL; #endif } enum _mainThreadPhase mainThreadPhase = MTP_USER_CODE; // Get the attribute flags. static POLYUNSIGNED ThreadAttrs(TaskData *taskData) { return UNTAGGED_UNSIGNED(taskData->threadObject->flags); } // Called from interface vector. Generally the assembly code will be // used instead of this. Handle ProcessAtomicIncrement(TaskData *taskData, Handle mutexp) { return taskData->AtomicIncrement(mutexp); } // Called from interface vector. Generally the assembly code will be // used instead of this. Handle ProcessAtomicDecrement(TaskData *taskData, Handle mutexp) { return taskData->AtomicDecrement(mutexp); } Handle ProcessAtomicReset(TaskData *taskData, Handle mutexp) { taskData->AtomicReset(mutexp); return SAVE(TAGGED(0)); // Push the unit result } // Return the thread object for the current thread. // On most platforms this will be done with a piece of assembly code. Handle ThreadSelf(TaskData *taskData) { return SAVE(taskData->threadObject); } // Called from interface vector. This is the normal entry point for // the thread functions. Handle ThreadDispatch(TaskData *taskData, Handle args, Handle code) { return processesModule.ThreadDispatch(taskData, args, code); } Handle Processes::ThreadDispatch(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORDHANDLE(code)); TaskData *ptaskData = taskData; switch (c) { case 1: /* A mutex was locked i.e. the count was ~1 or less. We will have set it to ~1. This code blocks if the count is still ~1. It does actually return if another thread tries to lock the mutex and hasn't yet set the value to ~1 but that doesn't matter since whenever we return we simply try to get the lock again. */ { schedLock.Lock(); // We have to check the value again with schedLock held rather than // simply waiting because otherwise the unlocking thread could have // set the variable back to 1 (unlocked) and signalled any waiters // before we actually got to wait. if (UNTAGGED(DEREFHANDLE(args)->Get(0)) < 0) { // Set this so we can see what we're blocked on. ptaskData->blockMutex = DEREFHANDLE(args); // Now release the ML memory. A GC can start. ThreadReleaseMLMemoryWithSchedLock(ptaskData); // Wait until we're woken up. We mustn't block if we have been // interrupted, and are processing interrupts asynchronously, or // we've been killed. switch (ptaskData->requests) { case kRequestKill: // We've been killed. Handle this later. break; case kRequestInterrupt: { // We've been interrupted. POLYUNSIGNED attrs = ThreadAttrs(ptaskData) & PFLAG_INTMASK; if (attrs == PFLAG_ASYNCH || attrs == PFLAG_ASYNCH_ONCE) break; // If we're ignoring interrupts or handling them synchronously // we don't do anything here. } case kRequestNone: globalStats.incCount(PSC_THREADS_WAIT_MUTEX); ptaskData->threadLock.Wait(&schedLock); globalStats.decCount(PSC_THREADS_WAIT_MUTEX); } ptaskData->blockMutex = 0; // No longer blocked. ThreadUseMLMemoryWithSchedLock(ptaskData); } // Return and try and get the lock again. schedLock.Unlock(); // Test to see if we have been interrupted and if this thread // processes interrupts asynchronously we should raise an exception // immediately. Perhaps we do that whenever we exit from the RTS. return SAVE(TAGGED(0)); } case 2: /* Unlock a mutex. Called after incrementing the count and discovering that at least one other thread has tried to lock it. We may need to wake up threads that are blocked. */ { // The caller has already set the variable to 1 (unlocked). // We need to acquire schedLock so that we can // be sure that any thread that is trying to lock sees either // the updated value (and so doesn't wait) or has successfully // waited on its threadLock (and so will be woken up). schedLock.Lock(); // Unlock any waiters. for (unsigned i = 0; i < taskArraySize; i++) { TaskData *p = taskArray[i]; // If the thread is blocked on this mutex we can signal the thread. if (p && p->blockMutex == DEREFHANDLE(args)) p->threadLock.Signal(); } schedLock.Unlock(); return SAVE(TAGGED(0)); } case 3: // Atomically drop a mutex and wait for a wake up. { // The argument is a pair of a mutex and the time to wake up. The time // may be zero to indicate an infinite wait. The return value is unit. // It WILL NOT RAISE AN EXCEPTION unless it is set to handle exceptions // asynchronously (which it shouldn't do if the ML caller code is correct). // It may return as a result of any of the following: // an explicit wake up. // an interrupt, either direct or broadcast // a trap i.e. a request to handle an asynchronous event. Handle mutexH = SAVE(args->WordP()->Get(0)); Handle wakeTime = SAVE(args->WordP()->Get(1)); // We pass zero as the wake time to represent infinity. bool isInfinite = compareLong(taskData, wakeTime, SAVE(TAGGED(0))) == 0; // Convert the time into the correct format for WaitUntil before acquiring // schedLock. div_longc could do a GC which requires schedLock. #if (defined(_WIN32) && ! defined(__CYGWIN__)) // On Windows it is the number of 100ns units since the epoch FILETIME tWake; if (! isInfinite) getFileTimeFromArb(taskData, wakeTime, &tWake); #else // Unix style times. struct timespec tWake; if (! isInfinite) { // On Unix we represent times as a number of microseconds. Handle hMillion = Make_arbitrary_precision(taskData, 1000000); tWake.tv_sec = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, wakeTime))); tWake.tv_nsec = 1000*get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, wakeTime))); } #endif schedLock.Lock(); // Atomically release the mutex. This is atomic because we hold schedLock // so no other thread can call signal or broadcast. Handle decrResult = taskData->AtomicIncrement(mutexH); if (UNTAGGED(decrResult->Word()) != 1) { taskData->AtomicReset(mutexH); // The mutex was locked so we have to release any waiters. // Unlock any waiters. for (unsigned i = 0; i < taskArraySize; i++) { TaskData *p = taskArray[i]; // If the thread is blocked on this mutex we can signal the thread. if (p && p->blockMutex == DEREFHANDLE(mutexH)) p->threadLock.Signal(); } } // Wait until we're woken up. Don't block if we have been interrupted // or killed. if (ptaskData->requests == kRequestNone) { // Now release the ML memory. A GC can start. ThreadReleaseMLMemoryWithSchedLock(ptaskData); globalStats.incCount(PSC_THREADS_WAIT_CONDVAR); // We pass zero as the wake time to represent infinity. if (isInfinite) ptaskData->threadLock.Wait(&schedLock); else (void)ptaskData->threadLock.WaitUntil(&schedLock, &tWake); globalStats.decCount(PSC_THREADS_WAIT_CONDVAR); // We want to use the memory again. ThreadUseMLMemoryWithSchedLock(ptaskData); } schedLock.Unlock(); return SAVE(TAGGED(0)); } case 4: // Wake up the specified thread. Returns false (0) if the thread has // already been interrupted and is not ignoring interrupts or if the thread // does not exist (i.e. it's been killed while waiting). Returns true // if it successfully woke up the thread. The thread may subsequently // receive an interrupt but we need to know whether we woke the thread // up before that happened. { int result = 0; // Default to failed. // Acquire the schedLock first. This ensures that this is // atomic with respect to waiting. schedLock.Lock(); TaskData *p = TaskForIdentifier(args); if (p && p->threadObject == args->WordP()) { POLYUNSIGNED attrs = ThreadAttrs(p) & PFLAG_INTMASK; if (p->requests == kRequestNone || (p->requests == kRequestInterrupt && attrs == PFLAG_IGNORE)) { p->threadLock.Signal(); result = 1; } } schedLock.Unlock(); return SAVE(TAGGED(result)); } // 5 and 6 are no longer used. case 7: // Fork a new thread. The arguments are the function to run and the attributes. return ForkThread(ptaskData, SAVE(args->WordP()->Get(0)), (Handle)0, args->WordP()->Get(1), // For backwards compatibility we check the length here args->WordP()->Length() <= 2 ? TAGGED(0) : args->WordP()->Get(2)); case 8: // Test if a thread is active { schedLock.Lock(); TaskData *p = TaskForIdentifier(args); schedLock.Unlock(); return SAVE(TAGGED(p != 0)); } case 9: // Send an interrupt to a specific thread { schedLock.Lock(); TaskData *p = TaskForIdentifier(args); if (p) MakeRequest(p, kRequestInterrupt); schedLock.Unlock(); if (p == 0) raise_exception_string(taskData, EXC_thread, "Thread does not exist"); return SAVE(TAGGED(0)); } case 10: // Broadcast an interrupt to all threads that are interested. BroadcastInterrupt(); return SAVE(TAGGED(0)); case 11: // Interrupt this thread now if it has been interrupted TestSynchronousRequests(taskData); // Also process any asynchronous requests that may be pending. // These will be handled "soon" but if we have just switched from deferring // interrupts this guarantees that any deferred interrupts will be handled now. if (ProcessAsynchRequests(taskData)) throw IOException(); return SAVE(TAGGED(0)); case 12: // Kill a specific thread { schedLock.Lock(); TaskData *p = TaskForIdentifier(args); if (p) MakeRequest(p, kRequestKill); schedLock.Unlock(); if (p == 0) raise_exception_string(taskData, EXC_thread, "Thread does not exist"); return SAVE(TAGGED(0)); } case 13: // Return the number of processors. // Returns 1 if there is any problem. return Make_arbitrary_precision(taskData, NumberOfProcessors()); case 14: // Return the number of physical processors. // Returns 0 if there is any problem. return Make_arbitrary_precision(taskData, NumberOfPhysicalProcessors()); case 15: // Set the maximum stack size. { PolyWord newSize = args->Word(); taskData->threadObject->mlStackSize = newSize; if (newSize != TAGGED(0)) { POLYUNSIGNED current = taskData->currentStackSpace(); // Current size in words POLYUNSIGNED newWords = getPolyUnsigned(taskData, newSize); if (current > newWords) raise_exception0(taskData, EXC_interrupt); } return SAVE(TAGGED(0)); } default: { char msg[100]; sprintf(msg, "Unknown thread function: %d", c); raise_fail(taskData, msg); return 0; } } } // Fill unused allocation space with a dummy object to preserve the invariant // that memory is always valid. void TaskData::FillUnusedSpace(void) { if (allocPointer > allocLimit) gMem.FillUnusedSpace(allocLimit, allocPointer-allocLimit); } TaskData::TaskData(): allocPointer(0), allocLimit(0), allocSize(MIN_HEAP_SIZE), allocCount(0), stack(0), threadObject(0), signalStack(0), pendingInterrupt(false), foreignStack(TAGGED(0)), inML(false), requests(kRequestNone), blockMutex(0), inMLHeap(false), runningProfileTimer(false) { #ifdef HAVE_WINDOWS_H lastCPUTime = 0; #endif #ifdef HAVE_WINDOWS_H threadHandle = 0; #endif #ifdef HAVE_PTHREAD threadExited = false; #endif } TaskData::~TaskData() { if (signalStack) free(signalStack); if (stack) gMem.DeleteStackSpace(stack); #ifdef HAVE_WINDOWS_H if (threadHandle) CloseHandle(threadHandle); #endif } // Find a task that matches the specified identifier and returns // it if it exists. MUST be called with taskArrayLock held. TaskData *Processes::TaskForIdentifier(Handle taskId) { // The index is in the first word of the thread object. unsigned index = (unsigned)(UNTAGGED_UNSIGNED(taskId->WordP()->Get(0))); // Check the index is valid and matches the object stored in the table. if (index < taskArraySize) { TaskData *p = taskArray[index]; if (p && p->threadObject == taskId->WordP()) return p; } return 0; } // Broadcast an interrupt to all relevant threads. void Processes::BroadcastInterrupt(void) { // If a thread is set to accept broadcast interrupts set it to // "interrupted". schedLock.Lock(); for (unsigned i = 0; i < taskArraySize; i++) { TaskData *p = taskArray[i]; if (p) { POLYUNSIGNED attrs = ThreadAttrs(p); if (attrs & PFLAG_BROADCAST) MakeRequest(p, kRequestInterrupt); } } schedLock.Unlock(); } // Set the asynchronous request variable for the thread. Must be called // with the schedLock held. Tries to wake the thread up if possible. void Processes::MakeRequest(TaskData *p, ThreadRequests request) { // We don't override a request to kill by an interrupt request. if (p->requests < request) { p->requests = request; p->InterruptCode(); p->threadLock.Signal(); // Set the value in the ML object as well so the ML code can see it p->threadObject->requestCopy = TAGGED(request); } #ifdef HAVE_WINDOWS_H // Wake any threads waiting for IO PulseEvent(Waiter::hWakeupEvent); #endif } void Processes::ThreadExit(TaskData *taskData) { if (debugOptions & DEBUG_THREADS) Log("THREAD: Thread %p exiting\n", taskData); #ifdef HAVE_PTHREAD // Block any profile interrupt from now on. We're deleting the ML stack for this thread. sigset_t block_sigs; sigemptyset(&block_sigs); sigaddset(&block_sigs, SIGVTALRM); pthread_sigmask(SIG_BLOCK, &block_sigs, NULL); // Remove the thread-specific data since it's no // longer valid. pthread_setspecific(tlsId, 0); #endif globalStats.decCount(PSC_THREADS); if (singleThreaded) finish(0); schedLock.Lock(); ThreadReleaseMLMemoryWithSchedLock(taskData); // Allow a GC if it was waiting for us. // Remove this from the taskArray unsigned index = get_C_unsigned(taskData, taskData->threadObject->index); ASSERT(index < taskArraySize && taskArray[index] == taskData); taskArray[index] = 0; delete(taskData); initialThreadWait.Signal(); // Tell it we've finished. schedLock.Unlock(); #ifdef HAVE_PTHREAD pthread_exit(0); #elif defined(HAVE_WINDOWS_H) ExitThread(0); #endif } // These two functions are used for calls from outside where // the lock has not yet been acquired. void Processes::ThreadUseMLMemory(TaskData *taskData) { // Trying to acquire the lock here may block if a GC is in progress schedLock.Lock(); ThreadUseMLMemoryWithSchedLock(taskData); schedLock.Unlock(); } void Processes::ThreadReleaseMLMemory(TaskData *taskData) { schedLock.Lock(); ThreadReleaseMLMemoryWithSchedLock(taskData); schedLock.Unlock(); } // Called when a thread wants to resume using the ML heap. That could // be after a wait for some reason or after executing some foreign code. // Since there could be a GC in progress already at this point we may either // be blocked waiting to acquire schedLock or we may need to wait until // we are woken up at the end of the GC. void Processes::ThreadUseMLMemoryWithSchedLock(TaskData *taskData) { TaskData *ptaskData = taskData; // If there is a request outstanding we have to wait for it to // complete. We notify the root thread and wait for it. while (threadRequest != 0) { initialThreadWait.Signal(); // Wait for the GC to happen mlThreadWait.Wait(&schedLock); } ASSERT(! ptaskData->inMLHeap); ptaskData->inMLHeap = true; } // Called to indicate that the thread has temporarily finished with the // ML memory either because it is going to wait for something or because // it is going to run foreign code. If there is an outstanding GC request // that can proceed. void Processes::ThreadReleaseMLMemoryWithSchedLock(TaskData *taskData) { TaskData *ptaskData = taskData; ASSERT(ptaskData->inMLHeap); ptaskData->inMLHeap = false; // Put a dummy object in any unused space. This maintains the // invariant that the allocated area is filled with valid objects. ptaskData->FillUnusedSpace(); // if (threadRequest != 0) initialThreadWait.Signal(); } // Make a request to the root thread. void Processes::MakeRootRequest(TaskData *taskData, MainThreadRequest *request) { if (singleThreaded) { mainThreadPhase = request->mtp; ThreadReleaseMLMemoryWithSchedLock(taskData); // Primarily to call FillUnusedSpace request->Perform(); ThreadUseMLMemoryWithSchedLock(taskData); mainThreadPhase = MTP_USER_CODE; } else { PLocker locker(&schedLock); // Wait for any other requests. while (threadRequest != 0) { // Deal with any pending requests. ThreadReleaseMLMemoryWithSchedLock(taskData); ThreadUseMLMemoryWithSchedLock(taskData); // Drops schedLock while waiting. } // Now the other requests have been dealt with (and we have schedLock). request->completed = false; threadRequest = request; // Wait for it to complete. while (! request->completed) { ThreadReleaseMLMemoryWithSchedLock(taskData); ThreadUseMLMemoryWithSchedLock(taskData); // Drops schedLock while waiting. } } } // Find space for an object. Returns a pointer to the start. "words" must include // the length word and the result points at where the length word will go. PolyWord *Processes::FindAllocationSpace(TaskData *taskData, POLYUNSIGNED words, bool alwaysInSeg) { bool triedInterrupt = false; while (1) { // After a GC allocPointer and allocLimit are zero and when allocating the // heap segment we request a minimum of zero words. if (taskData->allocPointer != 0 && taskData->allocPointer >= taskData->allocLimit + words) { // There's space in the current segment, taskData->allocPointer -= words; return taskData->allocPointer; } else // Insufficient space in this area. { if (words > taskData->allocSize && ! alwaysInSeg) { // If the object we want is larger than the heap segment size // we allocate it separately rather than in the segment. PolyWord *foundSpace = gMem.AllocHeapSpace(words); if (foundSpace) return foundSpace; } else { // Fill in any unused space in the existing segment taskData->FillUnusedSpace(); // Get another heap segment with enough space for this object. POLYUNSIGNED requestSpace = taskData->allocSize+words; POLYUNSIGNED spaceSize = requestSpace; // Get the space and update spaceSize with the actual size. PolyWord *space = gMem.AllocHeapSpace(words, spaceSize); if (space) { // Double the allocation size for the next time if // we succeeded in allocating the whole space. taskData->allocCount++; if (spaceSize == requestSpace) taskData->allocSize = taskData->allocSize*2; taskData->allocLimit = space; taskData->allocPointer = space+spaceSize; // Actually allocate the object taskData->allocPointer -= words; return taskData->allocPointer; } } // It's possible that another thread has requested a GC in which case // we will have memory when that happens. We don't want to start // another GC. if (! singleThreaded) { PLocker locker(&schedLock); if (threadRequest != 0) { ThreadReleaseMLMemoryWithSchedLock(taskData); ThreadUseMLMemoryWithSchedLock(taskData); continue; // Try again } } // Try garbage-collecting. If this failed return 0. if (! QuickGC(taskData, words)) { extern FILE *polyStderr; if (! triedInterrupt) { triedInterrupt = true; fprintf(polyStderr,"Run out of store - interrupting threads\n"); if (debugOptions & DEBUG_THREADS) Log("THREAD: Run out of store, interrupting threads\n"); BroadcastInterrupt(); if (ProcessAsynchRequests(taskData)) return 0; // Has been interrupted. // Not interrupted: pause this thread to allow for other // interrupted threads to free something. #if defined(_WIN32) Sleep(5000); #else sleep(5); #endif // Try again. } else { // That didn't work. Exit. fprintf(polyStderr,"Failed to recover - exiting\n"); Exit(1); // Begins the shutdown process processes->ThreadExit(taskData); // And terminate this thread. } } // Try again. There should be space now. } } } #ifdef _MSC_VER // Don't tell me that exitThread has a non-void type. #pragma warning(disable:4646) #endif Handle exitThread(TaskData *taskData) /* A call to this is put on the stack of a new thread so when the thread function returns the thread goes away. */ { processesModule.ThreadExit(taskData); } /* Called when a thread is about to block, usually because of IO. If this is interruptable (currently only used for Posix functions) the process will be set to raise an exception if any signal is handled. It may also raise an exception if another thread has called broadcastInterrupt. */ void Processes::ThreadPauseForIO(TaskData *taskData, Waiter *pWait) { TestAnyEvents(taskData); // Consider this a blocking call that may raise Interrupt ThreadReleaseMLMemory(taskData); globalStats.incCount(PSC_THREADS_WAIT_IO); pWait->Wait(1000); // Wait up to a second globalStats.decCount(PSC_THREADS_WAIT_IO); ThreadUseMLMemory(taskData); TestAnyEvents(taskData); // Check if we've been interrupted. } // Default waiter: simply wait for the time. In the case of Windows it // is also woken up if the event is signalled. In Unix it may be woken // up by a signal. void Waiter::Wait(unsigned maxMillisecs) { // Since this is used only when we can't monitor the source directly // we set this to 10ms so that we're not waiting too long. if (maxMillisecs > 10) maxMillisecs = 10; #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* We seem to need to reset the queue before calling MsgWaitForMultipleObjects otherwise it frequently returns immediately, often saying there is a message with a message ID of 0x118 which doesn't correspond to any listed message. While calling PeekMessage afterwards might be better this doesn't seem to work properly. We need to use MsgWaitForMultipleObjects here so that we get a reasonable response with the Windows GUI. */ MSG msg; // N.B. It seems that calling PeekMessage may result in a callback // to a window proc directly without a call to DispatchMessage. That // could result in a recursive call here if we have installed an ML // window proc. PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE); // Wait until we get input or we're woken up. MsgWaitForMultipleObjects(1, &hWakeupEvent, FALSE, maxMillisecs, QS_ALLINPUT); #else // Unix fd_set read_fds, write_fds, except_fds; struct timeval toWait = { 0, 0 }; toWait.tv_sec = maxMillisecs / 1000; toWait.tv_usec = (maxMillisecs % 1000) * 1000; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&except_fds); select(FD_SETSIZE, &read_fds, &write_fds, &except_fds, &toWait); #endif } static Waiter defWait; Waiter *Waiter::defaultWaiter = &defWait; #ifdef HAVE_WINDOWS_H // Windows and Cygwin HANDLE Waiter::hWakeupEvent; // Pulsed to wake up any threads waiting for IO. // Wait for the specified handle to be signalled. void WaitHandle::Wait(unsigned maxMillisecs) { MSG msg; PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE); HANDLE hEvents[2]; DWORD dwEvents = 0; hEvents[dwEvents++] = Waiter::hWakeupEvent; if (m_Handle != NULL) hEvents[dwEvents++] = m_Handle; // Wait until we get input or we're woken up. MsgWaitForMultipleObjects(dwEvents, hEvents, FALSE, maxMillisecs, QS_ALLINPUT); } #endif #if (!defined(_WIN32) || defined(__CYGWIN__)) // Unix and Cygwin: Wait for a file descriptor on input. void WaitInputFD::Wait(unsigned maxMillisecs) { fd_set read_fds, write_fds, except_fds; struct timeval toWait = { 0, 0 }; toWait.tv_sec = maxMillisecs / 1000; toWait.tv_usec = (maxMillisecs % 1000) * 1000; FD_ZERO(&read_fds); if (m_waitFD >= 0) FD_SET(m_waitFD, &read_fds); FD_ZERO(&write_fds); FD_ZERO(&except_fds); select(FD_SETSIZE, &read_fds, &write_fds, &except_fds, &toWait); } #endif // Get the task data for the current thread. This is held in // thread-local storage. Normally this is passed in taskData but // in a few cases this isn't available. TaskData *Processes::GetTaskDataForThread(void) { #ifdef HAVE_PTHREAD return (TaskData *)pthread_getspecific(tlsId); #elif defined(HAVE_WINDOWS_H) return (TaskData *)TlsGetValue(tlsId); #else // If there's no threading. return taskArray[0]; #endif } // Called to create a task data object in the current thread. // This is currently only used if a thread created in foreign code calls // a callback. TaskData *Processes::CreateNewTaskData(Handle threadId, Handle threadFunction, Handle args, PolyWord flags) { TaskData *taskData = machineDependent->CreateTaskData(); #if defined(HAVE_WINDOWS_H) HANDLE thisProcess = GetCurrentProcess(); DuplicateHandle(thisProcess, GetCurrentThread(), thisProcess, &(taskData->threadHandle), THREAD_ALL_ACCESS, FALSE, 0); #endif unsigned thrdIndex; { PLocker lock(&schedLock); // See if there's a spare entry in the array. for (thrdIndex = 0; thrdIndex < taskArraySize && taskArray[thrdIndex] != 0; thrdIndex++); if (thrdIndex == taskArraySize) // Need to expand the array { TaskData **newArray = (TaskData **)realloc(taskArray, sizeof(TaskData *)*(taskArraySize+1)); if (newArray) { taskArray = newArray; taskArraySize++; } else { delete(taskData); schedLock.Unlock(); throw MemoryException(); } } // Add into the new entry taskArray[thrdIndex] = taskData; } taskData->stack = gMem.NewStackSpace(machineDependent->InitialStackSize()); if (taskData->stack == 0) { delete(taskData); throw MemoryException(); } // TODO: Check that there isn't a problem if we try to allocate // memory here and result in a GC. taskData->InitStackFrame(taskData, threadFunction, args); ThreadUseMLMemory(taskData); // If the forking thread has created an ML thread object use that // otherwise create a new one in the current context. if (threadId != 0) taskData->threadObject = (ThreadObject*)threadId->WordP(); else { taskData->threadObject = (ThreadObject*)alloc(taskData, sizeof(ThreadObject)/sizeof(PolyWord), F_MUTABLE_BIT); taskData->threadObject->index = TAGGED(thrdIndex); // Set to the index taskData->threadObject->flags = flags != TAGGED(0) ? TAGGED(PFLAG_SYNCH): flags; taskData->threadObject->threadLocal = TAGGED(0); // Empty thread-local store taskData->threadObject->requestCopy = TAGGED(0); // Cleared interrupt state taskData->threadObject->mlStackSize = TAGGED(0); // Unlimited stack size for (unsigned i = 0; i < sizeof(taskData->threadObject->debuggerSlots)/sizeof(PolyWord); i++) taskData->threadObject->debuggerSlots[i] = TAGGED(0); } #ifdef HAVE_PTHREAD initThreadSignals(taskData); pthread_setspecific(tlsId, taskData); #elif defined(HAVE_WINDOWS_H) TlsSetValue(tlsId, taskData); #endif globalStats.incCount(PSC_THREADS); return taskData; } // This function is run when a new thread has been forked. The // parameter is the taskData value for the new thread. This function // is also called directly for the main thread. #ifdef HAVE_PTHREAD static void *NewThreadFunction(void *parameter) { TaskData *taskData = (TaskData *)parameter; #ifdef HAVE_WINDOWS_H // Cygwin: Get the Windows thread handle in case it's needed for profiling. HANDLE thisProcess = GetCurrentProcess(); DuplicateHandle(thisProcess, GetCurrentThread(), thisProcess, &(taskData->threadHandle), THREAD_ALL_ACCESS, FALSE, 0); #endif initThreadSignals(taskData); pthread_setspecific(processesModule.tlsId, taskData); taskData->saveVec.init(); // Remove initial data globalStats.incCount(PSC_THREADS); processes->ThreadUseMLMemory(taskData); try { (void)taskData->EnterPolyCode(); // Will normally (always?) call ExitThread. } catch (KillException &) { processesModule.ThreadExit(taskData); } return 0; } #elif defined(HAVE_WINDOWS_H) static DWORD WINAPI NewThreadFunction(void *parameter) { TaskData *taskData = (TaskData *)parameter; TlsSetValue(processesModule.tlsId, taskData); taskData->saveVec.init(); // Removal initial data globalStats.incCount(PSC_THREADS); processes->ThreadUseMLMemory(taskData); try { (void)taskData->EnterPolyCode(); } catch (KillException &) { processesModule.ThreadExit(taskData); } return 0; } #else static void NewThreadFunction(void *parameter) { TaskData *taskData = (TaskData *)parameter; initThreadSignals(taskData); taskData->saveVec.init(); // Removal initial data globalStats.incCount(PSC_THREADS); processes->ThreadUseMLMemory(taskData); try { (void)taskData->EnterPolyCode(); } catch (KillException &) { processesModule.ThreadExit(taskData); } } #endif // Sets up the initial thread from the root function. This is run on // the initial thread of the process so it will work if we don't // have pthreads. // When multithreading this thread also deals with all garbage-collection // and similar operations and the ML threads send it requests to deal with // that. These require all the threads to pause until the operation is complete // since they affect all memory but they are also sometimes highly recursive. // On Mac OS X and on Linux if the stack limit is set to unlimited only the // initial thread has a large stack and newly created threads have smaller // stacks. We need to make sure that any significant stack usage occurs only // on the inital thread. void Processes::BeginRootThread(PolyObject *rootFunction) { if (taskArraySize < 1) { taskArray = (TaskData **)realloc(taskArray, sizeof(TaskData *)); if (taskArray == 0) ::Exit("Unable to create the initial thread - insufficient memory"); taskArraySize = 1; } try { // We can't use ForkThread because we don't have a taskData object before we start TaskData *taskData = machineDependent->CreateTaskData(); taskData->threadObject = (ThreadObject*)alloc(taskData, sizeof(ThreadObject) / sizeof(PolyWord), F_MUTABLE_BIT); taskData->threadObject->index = TAGGED(0); // Index 0 // The initial thread is set to accept broadcast interrupt requests // and handle them synchronously. This is for backwards compatibility. taskData->threadObject->flags = TAGGED(PFLAG_BROADCAST|PFLAG_ASYNCH); // Flags taskData->threadObject->threadLocal = TAGGED(0); // Empty thread-local store taskData->threadObject->requestCopy = TAGGED(0); // Cleared interrupt state taskData->threadObject->mlStackSize = TAGGED(0); // Unlimited stack size for (unsigned i = 0; i < sizeof(taskData->threadObject->debuggerSlots)/sizeof(PolyWord); i++) taskData->threadObject->debuggerSlots[i] = TAGGED(0); #if defined(HAVE_WINDOWS_H) taskData->threadHandle = mainThreadHandle; #endif taskArray[0] = taskData; taskData->stack = gMem.NewStackSpace(machineDependent->InitialStackSize()); if (taskData->stack == 0) ::Exit("Unable to create the initial thread - insufficient memory"); taskData->InitStackFrame(taskData, taskData->saveVec.push(rootFunction), (Handle)0); // Create a packet for the Interrupt exception once so that we don't have to // allocate when we need to raise it. // We can only do this once the taskData object has been created. if (interrupt_exn == 0) interrupt_exn = DEREFEXNHANDLE(make_exn(taskData, EXC_interrupt, taskData->saveVec.push(TAGGED(0)))); if (singleThreaded) { // If we don't have threading enter the code as if this were a new thread. // This will call finish so will never return. NewThreadFunction(taskData); } schedLock.Lock(); int errorCode = 0; #ifdef HAVE_PTHREAD // Create a thread that isn't joinable since we don't want to wait // for it to finish. pthread_attr_t attrs; pthread_attr_init(&attrs); pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED); // N.B. Because we create the thread detached the thread ID will be deleted // by the thread itself so may be invalid at any time, unlike the Windows handle. pthread_t pthreadId; if (pthread_create(&pthreadId, &attrs, NewThreadFunction, taskData) != 0) errorCode = errno; pthread_attr_destroy(&attrs); #elif defined(HAVE_WINDOWS_H) taskData->threadHandle = CreateThread(NULL, 0, NewThreadFunction, taskData, 0, NULL); if (taskData->threadHandle == NULL) errorCode = 0-GetLastError(); #endif if (errorCode != 0) { // Thread creation failed. taskArray[0] = 0; delete(taskData); ExitWithError("Unable to create initial thread:", errorCode); } if (debugOptions & DEBUG_THREADS) Log("THREAD: Forked initial root thread %p\n", taskData); } catch (std::bad_alloc &) { ::Exit("Unable to create the initial thread - insufficient memory"); } // Wait until the threads terminate or make a request. // We only release schedLock while waiting. while (1) { // Look at the threads to see if they are running. bool allStopped = true; bool noUserThreads = true; bool signalThreadRunning = false; for (unsigned i = 0; i < taskArraySize; i++) { TaskData *p = taskArray[i]; if (p) { if (p == sigTask) signalThreadRunning = true; else noUserThreads = false; if (p->inMLHeap) { allStopped = false; // It must be running - interrupt it if we are waiting. if (threadRequest != 0) p->InterruptCode(); } else { // Has the thread terminated in foreign code? bool thread_killed = false; #ifdef HAVE_PTHREAD thread_killed = p->threadExited; #elif defined(HAVE_WINDOWS_H) thread_killed = WaitForSingleObject(p->threadHandle, 0) == WAIT_OBJECT_0; #endif if (thread_killed) { delete(p); taskArray[i] = 0; globalStats.decCount(PSC_THREADS); } } } } if (noUserThreads) { // If all threads apart from the signal thread have exited then // we can finish but we must make sure that the signal thread has // exited before we finally finish and deallocate the memory. if (signalThreadRunning) exitRequest = true; else break; // Really no threads. } if (allStopped && threadRequest != 0) { mainThreadPhase = threadRequest->mtp; gMem.ProtectImmutable(false); // GC, sharing and export may all write to the immutable area threadRequest->Perform(); gMem.ProtectImmutable(true); mainThreadPhase = MTP_USER_CODE; threadRequest->completed = true; threadRequest = 0; // Allow a new request. mlThreadWait.Signal(); } // Have we had a request to stop? This may have happened while in the GC. if (exitRequest) { // Set this to kill the threads. for (unsigned i = 0; i < taskArraySize; i++) { TaskData *taskData = taskArray[i]; if (taskData && taskData->requests != kRequestKill) MakeRequest(taskData, kRequestKill); } // Leave exitRequest set so that if we're in the process of // creating a new thread we will request it to stop when the // taskData object has been added to the table. } // Now release schedLock and wait for a thread // to wake us up. Use a timed wait to avoid the race with // setting exitRequest. initialThreadWait.WaitFor(&schedLock, 400); // Update the periodic stats. // Calculate the free memory. We have to be careful here because although // we have the schedLock we don't have any lock that prevents a thread // from allocating a new segment. Since these statistics are only // very rough it doesn't matter if there's a glitch. // One possibility would be see if the value of // gMem.GetFreeAllocSpace() has changed from what it was at the // start and recalculate if it has. // We also count the number of threads in ML code. Taking the // lock in EnterPolyCode on every RTS call turned out to be // expensive. POLYUNSIGNED freeSpace = 0; unsigned threadsInML = 0; for (unsigned j = 0; j < taskArraySize; j++) { TaskData *taskData = taskArray[j]; if (taskData) { // This gets the values last time it was in the RTS. PolyWord *limit = taskData->allocLimit, *ptr = taskData->allocPointer; if (limit < ptr && (POLYUNSIGNED)(ptr-limit) < taskData->allocSize) freeSpace += ptr-limit; if (taskData->inML) threadsInML++; } } // Add the space in the allocation areas after calculating the sizes for the // threads in case a thread has allocated some more. freeSpace += gMem.GetFreeAllocSpace(); globalStats.updatePeriodicStats(freeSpace, threadsInML); } schedLock.Unlock(); // We are about to return normally. Stop any crowbar function // and wait until it stops. shutdownLock.Lock(); if (crowbarRunning) { crowbarLock.Signal(); crowbarStopped.Wait(&shutdownLock); } shutdownLock.Unlock(); // So it's unlocked when we delete it finish(exitResult); // Close everything down and exit. } // Create a new thread. Returns the ML thread identifier object if it succeeds. // May raise an exception. Handle Processes::ForkThread(TaskData *taskData, Handle threadFunction, Handle args, PolyWord flags, PolyWord stacksize) { if (singleThreaded) raise_exception_string(taskData, EXC_thread, "Threads not available"); try { // Create a taskData object for the new thread TaskData *newTaskData = machineDependent->CreateTaskData(); // We allocate the thread object in the PARENT's space Handle threadId = alloc_and_save(taskData, sizeof(ThreadObject) / sizeof(PolyWord), F_MUTABLE_BIT); newTaskData->threadObject = (ThreadObject*)DEREFHANDLE(threadId); newTaskData->threadObject->index = TAGGED(0); newTaskData->threadObject->flags = flags; // Flags newTaskData->threadObject->threadLocal = TAGGED(0); // Empty thread-local store newTaskData->threadObject->requestCopy = TAGGED(0); // Cleared interrupt state newTaskData->threadObject->mlStackSize = stacksize; for (unsigned i = 0; i < sizeof(newTaskData->threadObject->debuggerSlots)/sizeof(PolyWord); i++) newTaskData->threadObject->debuggerSlots[i] = TAGGED(0); unsigned thrdIndex; schedLock.Lock(); // Before forking a new thread check to see whether we have been asked // to exit. Processes::Exit sets the current set of threads to exit but won't // see a new thread. if (taskData->requests == kRequestKill) { schedLock.Unlock(); // Raise an exception although the thread may exit before we get there. raise_exception_string(taskData, EXC_thread, "Thread is exiting"); } // See if there's a spare entry in the array. for (thrdIndex = 0; thrdIndex < taskArraySize && taskArray[thrdIndex] != 0; thrdIndex++); if (thrdIndex == taskArraySize) // Need to expand the array { TaskData **newArray = (TaskData **)realloc(taskArray, sizeof(TaskData *)*(taskArraySize+1)); if (newArray) { taskArray = newArray; taskArraySize++; } else { delete(newTaskData); schedLock.Unlock(); raise_exception_string(taskData, EXC_thread, "Too many threads"); } } // Add into the new entry taskArray[thrdIndex] = newTaskData; newTaskData->threadObject->index = TAGGED(thrdIndex); // Set to the index schedLock.Unlock(); newTaskData->stack = gMem.NewStackSpace(machineDependent->InitialStackSize()); if (newTaskData->stack == 0) { delete(newTaskData); raise_exception_string(taskData, EXC_thread, "Unable to allocate thread stack"); } // Allocate anything needed for the new stack in the parent's heap. // The child still has inMLHeap set so mustn't GC. newTaskData->InitStackFrame(taskData, threadFunction, args); // Now actually fork the thread. bool success = false; schedLock.Lock(); #ifdef HAVE_PTHREAD // Create a thread that isn't joinable since we don't want to wait // for it to finish. pthread_attr_t attrs; pthread_attr_init(&attrs); pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED); pthread_t pthreadId; success = pthread_create(&pthreadId, &attrs, NewThreadFunction, newTaskData) == 0; pthread_attr_destroy(&attrs); #elif defined(HAVE_WINDOWS_H) newTaskData->threadHandle = CreateThread(NULL, 0, NewThreadFunction, newTaskData, 0, NULL); success = newTaskData->threadHandle != NULL; #endif if (success) { schedLock.Unlock(); if (debugOptions & DEBUG_THREADS) Log("THREAD: Forking new thread %p from thread %p\n", newTaskData, taskData); return threadId; } // Thread creation failed. taskArray[thrdIndex] = 0; delete(newTaskData); schedLock.Unlock(); if (debugOptions & DEBUG_THREADS) Log("THREAD: Fork from thread %p failed\n", taskData); raise_exception_string(taskData, EXC_thread, "Thread creation failed"); } catch (std::bad_alloc &) { raise_exception_string(taskData, EXC_thread, "Insufficient memory"); } } // ForkFromRTS. Creates a new thread from within the RTS. This is currently used // only to run a signal function. bool Processes::ForkFromRTS(TaskData *taskData, Handle proc, Handle arg) { try { (void)ForkThread(taskData, proc, arg, TAGGED(PFLAG_SYNCH), TAGGED(0)); return true; } catch (IOException &) { // If it failed return false; } } // Deal with any interrupt or kill requests. bool Processes::ProcessAsynchRequests(TaskData *taskData) { bool wasInterrupted = false; TaskData *ptaskData = taskData; schedLock.Lock(); switch (ptaskData->requests) { case kRequestNone: schedLock.Unlock(); break; case kRequestInterrupt: { // Handle asynchronous interrupts only. // We've been interrupted. POLYUNSIGNED attrs = ThreadAttrs(ptaskData); POLYUNSIGNED intBits = attrs & PFLAG_INTMASK; if (intBits == PFLAG_ASYNCH || intBits == PFLAG_ASYNCH_ONCE) { if (intBits == PFLAG_ASYNCH_ONCE) { // Set this so from now on it's synchronous. // This word is only ever set by the thread itself so // we don't need to synchronise. attrs = (attrs & (~PFLAG_INTMASK)) | PFLAG_SYNCH; ptaskData->threadObject->flags = TAGGED(attrs); } ptaskData->requests = kRequestNone; // Clear this ptaskData->threadObject->requestCopy = TAGGED(0); // And in the ML copy schedLock.Unlock(); // Don't actually throw the exception here. taskData->SetException(interrupt_exn); wasInterrupted = true; } else schedLock.Unlock(); } break; case kRequestKill: // The thread has been asked to stop. schedLock.Unlock(); throw KillException(); // Doesn't return. } #ifndef HAVE_WINDOWS_H // Start the profile timer if needed. if (profileMode == kProfileTime) { if (! ptaskData->runningProfileTimer) { ptaskData->runningProfileTimer = true; StartProfilingTimer(); } } else ptaskData->runningProfileTimer = false; // The timer will be stopped next time it goes off. #endif return wasInterrupted; } // If this thread is processing interrupts synchronously and has been // interrupted clear the interrupt and raise the exception. This is // called from IO routines which may block. void Processes::TestSynchronousRequests(TaskData *taskData) { TaskData *ptaskData = taskData; schedLock.Lock(); switch (ptaskData->requests) { case kRequestNone: schedLock.Unlock(); break; case kRequestInterrupt: { // Handle synchronous interrupts only. // We've been interrupted. POLYUNSIGNED attrs = ThreadAttrs(ptaskData); POLYUNSIGNED intBits = attrs & PFLAG_INTMASK; if (intBits == PFLAG_SYNCH) { ptaskData->requests = kRequestNone; // Clear this ptaskData->threadObject->requestCopy = TAGGED(0); schedLock.Unlock(); taskData->SetException(interrupt_exn); throw IOException(); } else schedLock.Unlock(); } break; case kRequestKill: // The thread has been asked to stop. schedLock.Unlock(); throw KillException(); // Doesn't return. } } // Check for asynchronous or synchronous events void Processes::TestAnyEvents(TaskData *taskData) { TestSynchronousRequests(taskData); if (ProcessAsynchRequests(taskData)) throw IOException(); } // Stop. Usually called by one of the threads but // in the Windows version can also be called by the GUI or // it can be called from the default console interrupt handler. // This is more complicated than it seems. We must avoid // calling exit while there are other threads running because // exit will finalise the modules and deallocate memory etc. // However some threads may be deadlocked or we may be in the // middle of a very slow GC and we just want it to stop. void Processes::CrowBarFn(void) { #if (defined(HAVE_PTHREAD) || defined(HAVE_WINDOWS_H)) shutdownLock.Lock(); crowbarRunning = true; if (crowbarLock.WaitFor(&shutdownLock, 20000)) // Wait for 20s { // We've been woken by the main thread. Let it do the shutdown. crowbarStopped.Signal(); shutdownLock.Unlock(); } else { #if defined(HAVE_WINDOWS_H) ExitProcess(1); #else _exit(1); // Something is stuck. Get out without calling destructors. #endif } #endif } #ifdef HAVE_PTHREAD static void *crowBarFn(void*) { processesModule.CrowBarFn(); return 0; } #elif defined(HAVE_WINDOWS_H) static DWORD WINAPI crowBarFn(LPVOID arg) { processesModule.CrowBarFn(); return 0; } #endif void Processes::Exit(int n) { if (singleThreaded) finish(n); // Start a crowbar thread. This will stop everything if the main thread // does not reach the point of stopping within 5 seconds. #if (defined(HAVE_PTHREAD)) // Create a thread that isn't joinable since we don't want to wait // for it to finish. pthread_attr_t attrs; pthread_attr_init(&attrs); pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED); pthread_t threadId; (void)pthread_create(&threadId, &attrs, crowBarFn, 0); pthread_attr_destroy(&attrs); #elif defined(HAVE_WINDOWS_H) DWORD dwThrdId; HANDLE hCrowBarThread = CreateThread(NULL, 0, crowBarFn, 0, 0, &dwThrdId); CloseHandle(hCrowBarThread); // Not needed #endif // We may be in an interrupt handler with schedLock held. // Just set the exit request and go. exitResult = n; exitRequest = true; initialThreadWait.Signal(); // Wake it if it's sleeping. } /******************************************************************************/ /* */ /* catchVTALRM - handler for alarm-clock signal */ /* */ /******************************************************************************/ #if !defined(HAVE_WINDOWS_H) // N.B. This may be called either by an ML thread or by the main thread. // On the main thread taskData will be null. static void catchVTALRM(SIG_HANDLER_ARGS(sig, context)) { ASSERT(sig == SIGVTALRM); if (profileMode != kProfileTime) { // We stop the timer for this thread on the next signal after we end profile static struct itimerval stoptime = {{0, 0}, {0, 0}}; /* Stop the timer */ setitimer(ITIMER_VIRTUAL, & stoptime, NULL); } else { TaskData *taskData = processes->GetTaskDataForThread(); handleProfileTrap(taskData, (SIGNALCONTEXT*)context); } } #else /* Windows including Cygwin */ // This runs as a separate thread. Every millisecond it checks the CPU time used // by each ML thread and increments the count for each thread that has used a // millisecond of CPU time. static bool testCPUtime(HANDLE hThread, LONGLONG &lastCPUTime) { FILETIME cTime, eTime, kTime, uTime; // Try to get the thread CPU time if possible. This isn't supported // in Windows 95/98 so if it fails we just include this thread anyway. if (GetThreadTimes(hThread, &cTime, &eTime, &kTime, &uTime)) { LONGLONG totalTime = 0; LARGE_INTEGER li; li.LowPart = kTime.dwLowDateTime; li.HighPart = kTime.dwHighDateTime; totalTime += li.QuadPart; li.LowPart = uTime.dwLowDateTime; li.HighPart = uTime.dwHighDateTime; totalTime += li.QuadPart; if (totalTime - lastCPUTime >= 10000) { lastCPUTime = totalTime; return true; } return false; } else return true; // Failed to get thread time, maybe Win95. } void Processes::ProfileInterrupt(void) { // Wait for millisecond or until the stop event is signalled. while (WaitForSingleObject(hStopEvent, 1) == WAIT_TIMEOUT) { // We need to hold schedLock to examine the taskArray but // that is held during garbage collection. if (schedLock.Trylock()) { for (unsigned i = 0; i < taskArraySize; i++) { TaskData *p = taskArray[i]; if (p && p->threadHandle) { if (testCPUtime(p->threadHandle, p->lastCPUTime)) { CONTEXT context; SuspendThread(p->threadHandle); context.ContextFlags = CONTEXT_CONTROL; /* Get Eip and Esp */ if (GetThreadContext(p->threadHandle, &context)) { handleProfileTrap(p, &context); } ResumeThread(p->threadHandle); } } } schedLock.Unlock(); } // Check the CPU time used by the main thread. This is used for GC // so we need to check that as well. if (testCPUtime(mainThreadHandle, lastCPUTime)) handleProfileTrap(NULL, NULL); } } DWORD WINAPI ProfilingTimer(LPVOID parm) { processesModule.ProfileInterrupt(); return 0; } #endif // Profiling control. Called by the root thread. void Processes::StartProfiling(void) { #ifdef HAVE_WINDOWS_H DWORD threadId; extern FILE *polyStdout; if (profilingHd) return; ResetEvent(hStopEvent); profilingHd = CreateThread(NULL, 0, ProfilingTimer, NULL, 0, &threadId); if (profilingHd == NULL) fputs("Creating ProfilingTimer thread failed.\n", polyStdout); /* Give this a higher than normal priority so it pre-empts the main thread. Without this it will tend only to be run when the main thread blocks for some reason. */ SetThreadPriority(profilingHd, THREAD_PRIORITY_ABOVE_NORMAL); #else // In Linux, at least, we need to run a timer in each thread. // We request each to enter the RTS so that it will start the timer. // Since this is being run by the main thread while all the ML threads // are paused this may not actually be necessary. for (unsigned i = 0; i < taskArraySize; i++) { TaskData *taskData = taskArray[i]; if (taskData) { taskData->InterruptCode(); } } StartProfilingTimer(); // Start the timer in the root thread. #endif } void Processes::StopProfiling(void) { #ifdef HAVE_WINDOWS_H if (hStopEvent) SetEvent(hStopEvent); // Wait for the thread to stop if (profilingHd) WaitForSingleObject(profilingHd, 10000); CloseHandle(profilingHd); profilingHd = NULL; #endif } // Called by the ML signal handling thread. It blocks until a signal // arrives. There should only be a single thread waiting here. bool Processes::WaitForSignal(TaskData *taskData, PLock *sigLock) { TaskData *ptaskData = taskData; // We need to hold the signal lock until we have acquired schedLock. schedLock.Lock(); sigLock->Unlock(); if (sigTask != 0) { schedLock.Unlock(); return false; } sigTask = ptaskData; if (ptaskData->requests == kRequestNone) { // Now release the ML memory. A GC can start. ThreadReleaseMLMemoryWithSchedLock(ptaskData); globalStats.incCount(PSC_THREADS_WAIT_SIGNAL); ptaskData->threadLock.Wait(&schedLock); globalStats.decCount(PSC_THREADS_WAIT_SIGNAL); // We want to use the memory again. ThreadUseMLMemoryWithSchedLock(ptaskData); } sigTask = 0; schedLock.Unlock(); return true; } // Called by the signal detection thread to wake up the signal handler // thread. Must be called AFTER releasing sigLock. void Processes::SignalArrived(void) { PLocker locker(&schedLock); if (sigTask) sigTask->threadLock.Signal(); } #ifdef HAVE_PTHREAD // This is called when the thread exits in foreign code and // ThreadExit has not been called. Normally the thread-specific // data is cleared. static void threaddata_destructor(void *p) { TaskData *pt = (TaskData *)p; pt->threadExited = true; } #endif void Processes::Init(void) { #ifdef HAVE_WINDOWS_H // Create event to wake up from IO sleeping. Waiter::hWakeupEvent = CreateEvent(NULL, TRUE, FALSE, NULL); #endif #ifdef HAVE_PTHREAD pthread_key_create(&tlsId, threaddata_destructor); #elif defined(HAVE_WINDOWS_H) tlsId = TlsAlloc(); #else singleThreaded = true; #endif #if defined(HAVE_WINDOWS_H) /* Windows including Cygwin. */ // Create stop event for time profiling. hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Get the thread handle for this thread. HANDLE thisProcess = GetCurrentProcess(); DuplicateHandle(thisProcess, GetCurrentThread(), thisProcess, &mainThreadHandle, THREAD_ALL_ACCESS, FALSE, 0); #else // Set up a signal handler. This will be the same for all threads. markSignalInuse(SIGVTALRM); setSignalHandler(SIGVTALRM, catchVTALRM); #endif } #ifndef HAVE_WINDOWS_H // On Linux, at least, each thread needs to run this. void Processes::StartProfilingTimer(void) { // set virtual timer to go off every millisecond struct itimerval starttime; starttime.it_interval.tv_sec = starttime.it_value.tv_sec = 0; starttime.it_interval.tv_usec = starttime.it_value.tv_usec = 1000; setitimer(ITIMER_VIRTUAL,&starttime,NULL); } #endif void Processes::Stop(void) { #ifdef HAVE_WINDOWS_H if (Waiter::hWakeupEvent) SetEvent(Waiter::hWakeupEvent); #endif #ifdef HAVE_WINDOWS_H if (Waiter::hWakeupEvent) CloseHandle(Waiter::hWakeupEvent); Waiter::hWakeupEvent = NULL; #endif #ifdef HAVE_PTHREAD pthread_key_delete(tlsId); #elif defined(HAVE_WINDOWS_H) TlsFree(tlsId); #endif #if defined(HAVE_WINDOWS_H) /* Stop the timer and profiling threads. */ if (hStopEvent) SetEvent(hStopEvent); if (profilingHd) { WaitForSingleObject(profilingHd, 10000); CloseHandle(profilingHd); profilingHd = NULL; } if (hStopEvent) CloseHandle(hStopEvent); hStopEvent = NULL; if (mainThreadHandle) CloseHandle(mainThreadHandle); mainThreadHandle = NULL; #else profileMode = kProfileOff; // Make sure the timer is not running struct itimerval stoptime; memset(&stoptime, 0, sizeof(stoptime)); setitimer(ITIMER_VIRTUAL, &stoptime, NULL); #endif } void Processes::GarbageCollect(ScanAddress *process) /* Ensures that all the objects are retained and their addresses updated. */ { /* The interrupt exn */ if (interrupt_exn != 0) { PolyObject *p = interrupt_exn; process->ScanRuntimeAddress(&p, ScanAddress::STRENGTH_STRONG); interrupt_exn = (PolyException*)p; } for (unsigned i = 0; i < taskArraySize; i++) { if (taskArray[i]) taskArray[i]->GarbageCollect(process); } } void TaskData::GarbageCollect(ScanAddress *process) { saveVec.gcScan(process); if (stack != 0) GCStack(process); if (threadObject != 0) { PolyObject *p = threadObject; process->ScanRuntimeAddress(&p, ScanAddress::STRENGTH_STRONG); threadObject = (ThreadObject*)p; } if (blockMutex != 0) process->ScanRuntimeAddress(&blockMutex, ScanAddress::STRENGTH_STRONG); // The allocation spaces are no longer valid. allocPointer = 0; allocLimit = 0; // Divide the allocation size by four. If we have made a single allocation // since the last GC the size will have been doubled after the allocation. // On average for each thread, apart from the one that ran out of space // and requested the GC, half of the space will be unused so reducing by // four should give a good estimate for next time. if (allocCount != 0) { // Do this only once for each GC. allocCount = 0; allocSize = allocSize/4; if (allocSize < MIN_HEAP_SIZE) allocSize = MIN_HEAP_SIZE; } process->ScanRuntimeWord(&foreignStack); } // Return the number of processors. extern unsigned NumberOfProcessors(void) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) SYSTEM_INFO info; memset(&info, 0, sizeof(info)); GetSystemInfo(&info); if (info.dwNumberOfProcessors == 0) // Just in case info.dwNumberOfProcessors = 1; return info.dwNumberOfProcessors; #elif(defined(_SC_NPROCESSORS_ONLN)) long res = sysconf(_SC_NPROCESSORS_ONLN); if (res <= 0) res = 1; return res; #elif(defined(HAVE_SYSCTL) && defined(CTL_HW) && defined(HW_NCPU)) static int mib[2] = { CTL_HW, HW_NCPU }; int nCPU = 1; size_t len = sizeof(nCPU); if (sysctl(mib, 2, &nCPU, &len, NULL, 0) == 0 && len == sizeof(nCPU)) return nCPU; else return 1; #else // Can't determine. return 1; #endif } // Return the number of physical processors. If hyperthreading is // enabled this returns less than NumberOfProcessors. Returns zero if // it cannot be determined. // This can be used in Cygwin as well as native Windows. #if (defined(HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION)) typedef BOOL (WINAPI *GETP)(SYSTEM_LOGICAL_PROCESSOR_INFORMATION*, PDWORD); // Windows - use GetLogicalProcessorInformation if it's available. static unsigned WinNumPhysicalProcessors(void) { GETP getProcInfo = (GETP) GetProcAddress(GetModuleHandle(_T("kernel32")), "GetLogicalProcessorInformation"); if (getProcInfo == 0) return 0; // It's there - use it. SYSTEM_LOGICAL_PROCESSOR_INFORMATION *buff = 0; DWORD space = 0; while (getProcInfo(buff, &space) == FALSE) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { free(buff); return 0; } free(buff); buff = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(space); if (buff == 0) return 0; } // Calculate the number of full entries in case it's truncated. unsigned nItems = space / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); unsigned numProcs = 0; for (unsigned i = 0; i < nItems; i++) { if (buff[i].Relationship == RelationProcessorCore) numProcs++; } free(buff); return numProcs; } #endif // Read and parse /proc/cpuinfo static unsigned LinuxNumPhysicalProcessors(void) { // Find out the total. This should be the maximum. unsigned nProcs = NumberOfProcessors(); // If there's only one we don't need to check further. if (nProcs <= 1) return nProcs; long *cpus = (long*)malloc(nProcs * sizeof(long)); if (cpus == 0) return 0; memset(cpus, 0, nProcs * sizeof(long)); FILE *cpuInfo = fopen("/proc/cpuinfo", "r"); if (cpuInfo == NULL) { free(cpus); return 0; } char line[40]; unsigned count = 0; while (fgets(line, sizeof(line), cpuInfo) != NULL) { if (strncmp(line, "core id\t\t:", 10) == 0) { long n = strtol(line+10, NULL, 10); unsigned i = 0; // Skip this id if we've seen it already while (i < count && cpus[i] != n) i++; if (i == count) cpus[count++] = n; } if (strchr(line, '\n') == 0) { int ch; do { ch = getc(cpuInfo); } while (ch != '\n' && ch != EOF); } } fclose(cpuInfo); free(cpus); return count; } extern unsigned NumberOfPhysicalProcessors(void) { unsigned numProcs = 0; #if (defined(HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION)) numProcs = WinNumPhysicalProcessors(); if (numProcs != 0) return numProcs; #endif #if (defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYS_SYSCTL_H)) // Mac OS X int nCores; size_t len = sizeof(nCores); if (sysctlbyname("hw.physicalcpu", &nCores, &len, NULL, 0) == 0) return (unsigned)nCores; #endif numProcs = LinuxNumPhysicalProcessors(); if (numProcs != 0) return numProcs; // Any other cases? return numProcs; } polyml-5.6/libpolyml/processes.h000066400000000000000000000311711265146633400170770ustar00rootroot00000000000000/* Title: Lightweight process library Author: David C.J. Matthews Copyright (c) 2007-8, 2012, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PROCESSES_H_ #define _PROCESSES_H_ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include "globals.h" #include "rts_module.h" #include "save_vec.h" #include "noreturn.h" #include "locking.h" class SaveVecEntry; typedef SaveVecEntry *Handle; class StackSpace; class PolyWord; class ScanAddress; class MDTaskData; class Exporter; class StackObject; #ifdef HAVE_WINDOWS_H typedef void *HANDLE; #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_UCONTEXT_H #include #endif // SIGNALCONTEXT is the argument type that is passed to GetPCandSPFromContext // to get the actual PC and SP in a profiling trap. #if defined(HAVE_WINDOWS_H) // First because it's used in both native Windows and Cygwin. #include #define SIGNALCONTEXT CONTEXT // This is the thread context. #elif defined(HAVE_UCONTEXT_T) #define SIGNALCONTEXT ucontext_t #elif defined(HAVE_STRUCT_SIGCONTEXT) #define SIGNALCONTEXT struct sigcontext #else #define SIGNALCONTEXT void #endif #define MIN_HEAP_SIZE 4096 // Minimum and initial heap segment size (words) // This is the ML "thread identifier" object. The fields // are read and set by the ML code. class ThreadObject: public PolyObject { public: PolyWord index; // Tagged integer with the index into the taskArray // Not used by ML PolyWord flags; // Tagged integer containing flags indicating how interrupts // are handled. Set by ML but only by the thread itself PolyWord threadLocal; // Head of a list of thread-local store items. // Handled entirely by ML but only by the thread. PolyWord requestCopy; // A tagged integer copy of the "requests" field. // This is provided so that ML can easily test if there // is an interrupt pending. PolyWord mlStackSize; // A tagged integer with the maximum ML stack size in bytes PolyWord debuggerSlots[4]; // These are used by the debugger. }; // Other threads may make requests to a thread. typedef enum { kRequestNone = 0, // Increasing severity kRequestInterrupt = 1, kRequestKill = 2 } ThreadRequests; // Per-thread data. This is subclassed for each architecture. class TaskData { public: TaskData(); virtual ~TaskData(); void FillUnusedSpace(void); void GarbageCollect(ScanAddress *process); virtual void GCStack(ScanAddress *process) = 0; virtual Handle EnterPolyCode() = 0; // Start running ML virtual void InterruptCode() = 0; virtual bool GetPCandSPFromContext(SIGNALCONTEXT *context, PolyWord * &sp, POLYCODEPTR &pc) = 0; // Initialise the stack for a new thread. The parent task object is passed in because any // allocation that needs to be made must be made in the parent. virtual void InitStackFrame(TaskData *parentTask, Handle proc, Handle arg) = 0; virtual void SetException(poly_exn *exc) = 0; // If a foreign function calls back to ML we need to set up the call to the // ML callback function. virtual Handle EnterCallbackFunction(Handle func, Handle args) = 0; virtual int GetIOFunctionRegisterMask(int ioCall) = 0; // Increment or decrement the first word of the object pointed to by the // mutex argument and return the new value. virtual Handle AtomicIncrement(Handle mutexp) = 0; virtual Handle AtomicDecrement(Handle mutexp) = 0; // Reset a mutex to one. This needs to be atomic with respect to the // atomic increment and decrement instructions. virtual void AtomicReset(Handle mutexp) = 0; virtual void CopyStackFrame(StackObject *old_stack, POLYUNSIGNED old_length, StackObject *new_stack, POLYUNSIGNED new_length) = 0; // Put these in for the moment. A few functions in run_time.cpp rely on them. virtual POLYCODEPTR pc(void) const = 0; virtual PolyWord *sp(void) const = 0; virtual PolyWord *hr(void) const = 0; virtual void set_hr(PolyWord *hr) = 0; virtual POLYUNSIGNED currentStackSpace(void) const = 0; SaveVec saveVec; PolyWord *allocPointer; // Allocation pointer - decremented towards... PolyWord *allocLimit; // ... lower limit of allocation POLYUNSIGNED allocSize; // The preferred heap segment size unsigned allocCount; // The number of allocations since the last GC StackSpace *stack; ThreadObject *threadObject; // Pointer to the thread object. int lastError; // Last error from foreign code. void *signalStack; // Stack to handle interrupts (Unix only) bool pendingInterrupt; // The thread should trap into the RTS soon. PolyWord foreignStack; // Stack of saved data used in call_sym_and_convert bool inML; // True when this is in ML, false in the RTS private: // If a thread has to block it will block on this. PCondVar threadLock; // External requests made are stored here until they // can be actioned. ThreadRequests requests; // Pointer to the mutex when blocked. Set to NULL when it doesn't apply. PolyObject *blockMutex; // This is set to false when a thread blocks or enters foreign code, // While it is true the thread can manipulate ML memory so no other // thread can garbage collect. bool inMLHeap; // In Linux, at least, we need to run a separate timer in each thread bool runningProfileTimer; #ifdef HAVE_WINDOWS_H LONGLONG lastCPUTime; // Used for profiling #endif #ifdef HAVE_PTHREAD public: bool threadExited; private: #endif #ifdef HAVE_WINDOWS_H public: // Because, on Cygwin, it's used in NewThreadFunction HANDLE threadHandle; private: #endif friend class Processes; }; NORETURNFN(extern Handle exitThread(TaskData *mdTaskData)); Handle ProcessAtomicReset(TaskData *taskData, Handle mutexp); Handle ProcessAtomicIncrement(TaskData *taskData, Handle mutexp); Handle ProcessAtomicDecrement(TaskData *taskData, Handle mutexp); Handle ThreadSelf(TaskData *taskData); Handle ThreadDispatch(TaskData *taskData, Handle args, Handle code); class ScanAddress; // Indicate what the main thread is doing if the profile // timer goes off. extern enum _mainThreadPhase { MTP_USER_CODE=0, MTP_GCPHASESHARING, MTP_GCPHASEMARK, MTP_GCPHASECOMPACT, MTP_GCPHASEUPDATE, MTP_GCQUICK, MTP_SHARING, MTP_EXPORTING, MTP_SAVESTATE, MTP_LOADSTATE, MTP_PROFILING, MTP_SIGHANDLER, MTP_CYGWINSPAWN, MTP_STOREMODULE, MTP_LOADMODULE, MTP_MAXENTRY } mainThreadPhase; // Data structure used for requests from a thread to the root // thread. These are GCs or similar. class MainThreadRequest { public: MainThreadRequest (enum _mainThreadPhase phase): mtp(phase), completed(false) {} virtual ~MainThreadRequest () {} // Suppress silly GCC warning const enum _mainThreadPhase mtp; bool completed; virtual void Perform() = 0; }; class PLock; // Class to wait for a given time or for an event, whichever comes first. // // A pointer to this class or a subclass is passed to ThreadPauseForIO. // Because a thread may be interrupted or killed by another ML thread we // don't allow any thread to block indefinitely. Instead whenever a // thread wants to do an operation that may block we have it enter a // loop that polls for the desired condition and if it is not ready it // calls ThreadPauseForIO. The default action is to block for a short // period and then return so that the caller can poll again. That can // limit performance when, for example, reading from a pipe so where possible // we use a sub-class that waits until either input is available or it times // out, whichever comes first, using "select" in Unix or MsgWaitForMultipleObjects // in Windows. // During a call to Waiter::Wait the thread is set as "not using ML memory" // so a GC can happen while this thread is blocked. class Waiter { public: Waiter() {} virtual ~Waiter() {} virtual void Wait(unsigned maxMillisecs); static Waiter *defaultWaiter; #ifdef HAVE_WINDOWS_H static HANDLE hWakeupEvent; #endif }; #ifdef HAVE_WINDOWS_H class WaitHandle: public Waiter { public: WaitHandle(HANDLE h): m_Handle(h) {} virtual void Wait(unsigned maxMillisecs); private: HANDLE m_Handle; }; #endif #if (! defined(_WIN32) || defined(__CYGWIN__)) // Unix: Wait until a file descriptor is available for input class WaitInputFD: public Waiter { public: WaitInputFD(int fd): m_waitFD(fd) {} virtual void Wait(unsigned maxMillisecs); private: int m_waitFD; }; #endif // External interface to the Process module. These functions are all implemented // by the Processes class. class ProcessExternal { public: virtual ~ProcessExternal() {} // Defined to suppress a warning from GCC virtual TaskData *GetTaskDataForThread(void) = 0; virtual TaskData *CreateNewTaskData(Handle threadId, Handle threadFunction, Handle args, PolyWord flags) = 0; // Request all ML threads to exit and set the result code. Does not cause // the calling thread itself to exit since this may be called on the GUI thread. virtual void Exit(int n) = 0; // Exit from this thread. virtual NORETURNFN(void ThreadExit(TaskData *taskData)) = 0; virtual void BroadcastInterrupt(void) = 0; virtual void BeginRootThread(PolyObject *rootFunction) = 0; // Called when a thread may block. Returns some time later when perhaps // the input is available. virtual void ThreadPauseForIO(TaskData *taskData, Waiter *pWait) = 0; // As ThreadPauseForIO but when there is no stream virtual void ThreadPause(TaskData *taskData) { ThreadPauseForIO(taskData, Waiter::defaultWaiter); } // If a thread is blocking for some time it should release its use // of the ML memory. That allows a GC. ThreadUseMLMemory returns true if // a GC was in progress. virtual void ThreadUseMLMemory(TaskData *taskData) = 0; virtual void ThreadReleaseMLMemory(TaskData *taskData) = 0; // Requests from the threads for actions that need to be performed by // the root thread. virtual void MakeRootRequest(TaskData *taskData, MainThreadRequest *request) = 0; // Deal with any interrupt or kill requests. virtual bool ProcessAsynchRequests(TaskData *taskData) = 0; // Process an interrupt request synchronously. virtual void TestSynchronousRequests(TaskData *taskData) = 0; // Process any events, synchronous or asynchronous. virtual void TestAnyEvents(TaskData *taskData) = 0; // ForkFromRTS. Creates a new thread from within the RTS. virtual bool ForkFromRTS(TaskData *taskData, Handle proc, Handle arg) = 0; // Profiling control. virtual void StartProfiling(void) = 0; virtual void StopProfiling(void) = 0; // Find space for an object. Returns a pointer to the start. "words" must include // the length word and the result points at where the length word will go. // If the allocation succeeds it may update the allocation values in the taskData object. // If the heap is exhausted it may set this thread (or other threads) to raise an exception. virtual PolyWord *FindAllocationSpace(TaskData *taskData, POLYUNSIGNED words, bool alwaysInSeg) = 0; // Signal handling support. The ML signal handler thread blocks until it is // woken up by the signal detection thread. virtual bool WaitForSignal(TaskData *taskData, PLock *sigLock) = 0; virtual void SignalArrived(void) = 0; // After a Unix fork we only have a single thread in the new process. virtual void SetSingleThreaded(void) = 0; }; // Return the number of processors. Used when configuring multi-threaded GC. extern unsigned NumberOfProcessors(void); extern unsigned NumberOfPhysicalProcessors(void); extern ProcessExternal *processes; #define IO_SPACING 8 // This is a bit of a mess. #endif polyml-5.6/libpolyml/profiling.cpp000066400000000000000000000432301265146633400174140ustar00rootroot00000000000000/* Title: Profiling Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development copyright (c) David C.J. Matthews 2011, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #include "globals.h" #include "arb.h" #include "processes.h" #include "polystring.h" #include "profiling.h" #include "save_vec.h" #include "rts_module.h" #include "memmgr.h" #include "scanaddrs.h" #include "locking.h" #include "run_time.h" #include "sys.h" static POLYUNSIGNED mainThreadCounts[MTP_MAXENTRY]; static const char* const mainThreadText[MTP_MAXENTRY] = { "UNKNOWN", "GARBAGE COLLECTION (sharing phase)", "GARBAGE COLLECTION (mark phase)", "GARBAGE COLLECTION (copy phase)", "GARBAGE COLLECTION (update phase)", "GARBAGE COLLECTION (minor collection)", "Common data sharing", "Exporting", "Saving state", "Loading saved state", "Profiling", "Setting signal handler", "Cygwin spawn", "Storing module", "Loading module" }; // Entries for store profiling enum _extraStore { EST_CODE = 0, EST_STRING, EST_BYTE, EST_WORD, EST_MUTABLE, EST_MUTABLEBYTE, EST_MAX_ENTRY }; static POLYUNSIGNED extraStoreCounts[EST_MAX_ENTRY]; static const char * const extraStoreText[EST_MAX_ENTRY] = { "Function code", "Strings", "Byte data (long precision ints etc)", "Unidentified word data", "Unidentified mutable data", "Mutable byte data (profiling counts)" }; // Poly strings for "standard" counts. These are generated from the C strings // above the first time profiling is activated. static PolyWord psRTSString[MTP_MAXENTRY], psExtraStrings[EST_MAX_ENTRY], psGCTotal; ProfileMode profileMode; // If we are just profiling a single thread, this is the thread data. static TaskData *singleThreadProfile = 0; typedef struct _PROFENTRY { POLYUNSIGNED count; PolyWord functionName; struct _PROFENTRY *nextEntry; } PROFENTRY, *PPROFENTRY; class ProfileRequest: public MainThreadRequest { public: ProfileRequest(unsigned prof, TaskData *pTask): MainThreadRequest(MTP_PROFILING), mode(prof), pCallingThread(pTask), pTab(0), errorMessage(0) {} ~ProfileRequest(); virtual void Perform(); Handle extractAsList(TaskData *taskData); private: void getResults(void); void getProfileResults(PolyWord *bottom, PolyWord *top); PPROFENTRY newProfileEntry(void); private: unsigned mode; TaskData *pCallingThread; PPROFENTRY pTab; public: const char *errorMessage; }; ProfileRequest::~ProfileRequest() { PPROFENTRY p = pTab; while (p != 0) { PPROFENTRY toFree = p; p = p->nextEntry; free(toFree); } } // Lock to serialise updates of counts. Only used during update. // Not required when we print the counts since there's only one thread // running then. static PLock countLock; // Get the profile object associated with a piece of code. Returns null if // there isn't one, in particular if this is in the old format. static PolyObject *getProfileObjectForCode(PolyObject *code) { ASSERT(code->IsCodeObject()); PolyWord *consts; POLYUNSIGNED constCount; code->GetConstSegmentForCode(consts, constCount); if (constCount < 3 || ! consts[2].IsDataPtr()) return 0; PolyObject *profObject = consts[2].AsObjPtr(); if (profObject->IsMutable() && profObject->IsByteObject() && profObject->Length() == 1) return profObject; else return 0; } // Adds incr to the profile count for the function pointed at by // pc or by one of its callers. // This is called from a signal handler in the case of time profiling. void add_count(TaskData *taskData, POLYCODEPTR fpc, PolyWord *sp, POLYUNSIGNED incr) { /* The first PC may be valid even if it's not a code pointer */ bool is_code = true; PolyWord pc = PolyWord::FromCodePtr(fpc); PolyWord *endStack = taskData->stack->top; /* First try the pc value we have been given - if that fails search down the stack to see if there is a return address we can use. */ for (;;) { /* Get the address of the code segment from the code pointer */ if (pc.IsCodePtr() || is_code) { is_code = false; // Check that the pc value is within the heap. It could be // in the assembly code. MemSpace *space = gMem.SpaceForAddress(pc.AsAddress()); if (space != 0) { PolyObject *profObject = getProfileObjectForCode(ObjCodePtrToPtr(pc.AsCodePtr())); PLocker locker(&countLock); if (profObject) profObject->Set(0, PolyWord::FromUnsigned(profObject->Get(0).AsUnsigned() + incr)); return; } /* else just fall through and try next candidate address */ } /* OBJ_IS_CODEPTR(pc) */ /* Find next candidate address */ if (sp < endStack) pc = *sp++; else /* Reached bottom of stack without finding valid code pointer */ { PLocker locker(&countLock); mainThreadCounts[MTP_USER_CODE] += incr; return; } } /* loop "forever" */ /*NOTREACHED*/ } // newProfileEntry - Make a new entry in the list PPROFENTRY ProfileRequest::newProfileEntry(void) { PPROFENTRY newEntry = (PPROFENTRY)malloc(sizeof(PROFENTRY)); if (newEntry == 0) { errorMessage = "Insufficient memory"; return 0; } newEntry->nextEntry = pTab; pTab = newEntry; return newEntry; } // We don't use ScanAddress here because we're only interested in the // objects themselves not the addresses in them. // We have to build the list of results in C memory rather than directly in // ML memory because we can't allocate in ML memory in the root thread. void ProfileRequest::getProfileResults(PolyWord *bottom, PolyWord *top) { PolyWord *ptr = bottom; while (ptr < top) { ptr++; // Skip the length word PolyObject *obj = (PolyObject*)ptr; if (obj->ContainsForwardingPtr()) { // It's a forwarding pointer - get the length from the new location while (obj->ContainsForwardingPtr()) obj = obj->GetForwardingPtr(); ASSERT(obj->ContainsNormalLengthWord()); ptr += obj->Length(); } else { ASSERT(obj->ContainsNormalLengthWord()); if (obj->IsCodeObject()) { PolyWord *firstConstant = obj->ConstPtrForCode(); PolyWord name = firstConstant[0]; PolyObject *profCount = getProfileObjectForCode(obj); if (profCount) { POLYUNSIGNED count = profCount->Get(0).AsUnsigned(); if (count != 0) { if (name != TAGGED(0)) { PPROFENTRY pEnt = newProfileEntry(); if (pEnt == 0) return; pEnt->count = count; pEnt->functionName = name; } profCount->Set(0, PolyWord::FromUnsigned(0)); } } } /* code object */ ptr += obj->Length(); } /* else */ } /* while */ } void ProfileRequest::getResults(void) // Print profiling information and reset profile counts. { for (unsigned j = 0; j < gMem.npSpaces; j++) { MemSpace *space = gMem.pSpaces[j]; // Permanent areas are filled with objects from the bottom. getProfileResults(space->bottom, space->top); // Bottom to top } for (unsigned j = 0; j < gMem.nlSpaces; j++) { LocalMemSpace *space = gMem.lSpaces[j]; // Local areas only have objects from the allocation pointer to the top. getProfileResults(space->bottom, space->lowerAllocPtr); getProfileResults(space->upperAllocPtr, space->top); } { POLYUNSIGNED gc_count = mainThreadCounts[MTP_GCPHASESHARING]+ mainThreadCounts[MTP_GCPHASEMARK]+ mainThreadCounts[MTP_GCPHASECOMPACT] + mainThreadCounts[MTP_GCPHASEUPDATE] + mainThreadCounts[MTP_GCQUICK]; if (gc_count) { PPROFENTRY pEnt = newProfileEntry(); if (pEnt == 0) return; // Report insufficient memory? pEnt->count = gc_count; pEnt->functionName = psGCTotal; } } for (unsigned k = 0; k < MTP_MAXENTRY; k++) { if (mainThreadCounts[k]) { PPROFENTRY pEnt = newProfileEntry(); if (pEnt == 0) return; // Report insufficient memory? pEnt->count = mainThreadCounts[k]; pEnt->functionName = psRTSString[k]; mainThreadCounts[k] = 0; } } for (unsigned l = 0; l < EST_MAX_ENTRY; l++) { if (extraStoreCounts[l]) { PPROFENTRY pEnt = newProfileEntry(); if (pEnt == 0) return; // Report insufficient memory? pEnt->count = extraStoreCounts[l]; pEnt->functionName = psExtraStrings[l]; extraStoreCounts[l] = 0; } } } // Extract the accumulated results as an ML list of pairs of the count and the string. Handle ProfileRequest::extractAsList(TaskData *taskData) { Handle saved = taskData->saveVec.mark(); Handle list = taskData->saveVec.push(ListNull); for (PPROFENTRY p = pTab; p != 0; p = p->nextEntry) { Handle pair = alloc_and_save(taskData, 2); Handle countValue = Make_arbitrary_precision(taskData, p->count); pair->WordP()->Set(0, countValue->Word()); pair->WordP()->Set(1, p->functionName); Handle next = alloc_and_save(taskData, sizeof(ML_Cons_Cell) / sizeof(PolyWord)); DEREFLISTHANDLE(next)->h = pair->Word(); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); taskData->saveVec.reset(saved); list = taskData->saveVec.push(next->Word()); } return list; } void handleProfileTrap(TaskData *taskData, SIGNALCONTEXT *context) { if (singleThreadProfile != 0 && singleThreadProfile != taskData) return; /* If we are in the garbage-collector add the count to "gc_count" otherwise try to find out where we are. */ if (mainThreadPhase == MTP_USER_CODE) { if (taskData) { PolyWord *sp; POLYCODEPTR pc; if (taskData->GetPCandSPFromContext(context, sp, pc)) add_count(taskData, pc, sp, 1); else mainThreadCounts[MTP_USER_CODE]++; } else mainThreadCounts[MTP_USER_CODE]++; // On Mac OS X all virtual timer interrupts seem to be directed to the root thread // so all the counts will be "unknown". } else mainThreadCounts[mainThreadPhase]++; } // Called from the GC when allocation profiling is on. void AddObjectProfile(PolyObject *obj) { ASSERT(obj->ContainsNormalLengthWord()); POLYUNSIGNED length = obj->Length(); if (obj->IsWordObject() && OBJ_HAS_PROFILE(obj->LengthWord())) { // It has a profile pointer. The last word should point to the // closure or code of the allocating function. Add the size of this to the count. ASSERT(length != 0); PolyWord profWord = obj->Get(length-1); ASSERT(profWord.IsDataPtr()); PolyObject *profObject = profWord.AsObjPtr(); ASSERT(profObject->IsMutable() && profObject->IsByteObject() && profObject->Length() == 1); profObject->Set(0, PolyWord::FromUnsigned(profObject->Get(0).AsUnsigned() + length + 1)); } // If it doesn't have a profile pointer add it to the appropriate count. else if (obj->IsMutable()) { if (obj->IsByteObject()) extraStoreCounts[EST_MUTABLEBYTE] += length+1; else extraStoreCounts[EST_MUTABLE] += length+1; } else if (obj->IsCodeObject()) extraStoreCounts[EST_CODE] += length+1; else if (obj->IsByteObject()) { // Try to separate strings from other byte data. This is only // approximate. if (OBJ_IS_NEGATIVE(obj->LengthWord())) extraStoreCounts[EST_BYTE] += length+1; else { PolyStringObject *possString = (PolyStringObject*)obj; POLYUNSIGNED bytes = length * sizeof(PolyWord); // If the length of the string as given in the first word is sufficient // to fit in the exact number of words then it's probably a string. if (length >= 2 && possString->length <= bytes - sizeof(POLYUNSIGNED) && possString->length > bytes - 2 * sizeof(POLYUNSIGNED)) extraStoreCounts[EST_STRING] += length+1; else { extraStoreCounts[EST_BYTE] += length+1; } } } else extraStoreCounts[EST_WORD] += length+1; } // Called from ML to control profiling. Handle profilerc(TaskData *taskData, Handle mode_handle) /* Profiler - generates statistical profiles of the code. The parameter is an integer which determines the value to be profiled. When profiler is called it always resets the profiling and prints out any values which have been accumulated. If the parameter is 0 this is all it does, if the parameter is 1 then it produces time profiling, if the parameter is 2 it produces store profiling. 3 - arbitrary precision emulation traps. */ { unsigned mode = get_C_unsigned(taskData, DEREFWORDHANDLE(mode_handle)); { // Create any strings we need. We only need to do this once but // it must be done by a non-root thread since it needs a taskData object. // Don't bother locking. At worst we'll create some garbage. for (unsigned k = 0; k < MTP_MAXENTRY; k++) { if (psRTSString[k] == TAGGED(0)) psRTSString[k] = C_string_to_Poly(taskData, mainThreadText[k]); } for (unsigned k = 0; k < EST_MAX_ENTRY; k++) { if (psExtraStrings[k] == TAGGED(0)) psExtraStrings[k] = C_string_to_Poly(taskData, extraStoreText[k]); } if (psGCTotal == TAGGED(0)) psGCTotal = C_string_to_Poly(taskData, "GARBAGE COLLECTION (total)"); } // All these actions are performed by the root thread. Only profile // printing needs to be performed with all the threads stopped but it's // simpler to serialise all requests. ProfileRequest request(mode, taskData); processes->MakeRootRequest(taskData, &request); if (request.errorMessage != 0) raise_exception_string(taskData, EXC_Fail, request.errorMessage); return request.extractAsList(taskData); } // This is called from the root thread when all the ML threads have been paused. void ProfileRequest::Perform() { if (mode != kProfileOff && profileMode != kProfileOff) { // Profiling must be stopped first. errorMessage = "Profiling is currently active"; return; } singleThreadProfile = 0; // Unless kProfileTimeThread is given this should be 0 switch (mode) { case kProfileOff: // Turn off old profiling mechanism and print out accumulated results profileMode = kProfileOff; processes->StopProfiling(); getResults(); break; case kProfileTimeThread: singleThreadProfile = pCallingThread; // And drop through to kProfileTime case kProfileTime: profileMode = kProfileTime; processes->StartProfiling(); break; case kProfileStoreAllocation: profileMode = kProfileStoreAllocation; break; case kProfileEmulation: profileMode = kProfileEmulation; break; case kProfileLiveData: profileMode = kProfileLiveData; break; case kProfileLiveMutables: profileMode = kProfileLiveMutables; break; default: /* do nothing */ break; } } /* profilerc */ class Profiling: public RtsModule { public: virtual void Init(void); virtual void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static Profiling profileModule; void Profiling::Init(void) { // Reset profiling counts. profileMode = kProfileOff; for (unsigned k = 0; k < MTP_MAXENTRY; k++) mainThreadCounts[k] = 0; } void Profiling::GarbageCollect(ScanAddress *process) { // Process any strings in the table. for (unsigned k = 0; k < MTP_MAXENTRY; k++) process->ScanRuntimeWord(&psRTSString[k]); for (unsigned k = 0; k < EST_MAX_ENTRY; k++) process->ScanRuntimeWord(&psExtraStrings[k]); process->ScanRuntimeWord(&psGCTotal); } polyml-5.6/libpolyml/profiling.h000066400000000000000000000031071265146633400170600ustar00rootroot00000000000000/* Title: profiling.h Copyright (c) 2000 Cambridge University Technical Services Limited Further development copyright (c) David C.J. Matthews 2011, 2-15 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PROFILING_H_DEFINED #define _PROFILING_H_DEFINED 1 class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; // Current profiling mode typedef enum { kProfileOff = 0, kProfileTime, kProfileStoreAllocation, kProfileEmulation, kProfileLiveData, kProfileLiveMutables, kProfileTimeThread } ProfileMode; extern ProfileMode profileMode; #include "processes.h" // For SIGNALCONTEXT extern void handleProfileTrap(TaskData *taskData, SIGNALCONTEXT *context); extern Handle profilerc(TaskData *taskData, Handle mode_handle); extern void add_count(TaskData *taskData, POLYCODEPTR pc, PolyWord *sp, POLYUNSIGNED incr); extern void AddObjectProfile(PolyObject *obj); #endif /* _PROFILING_H_DEFINED */ polyml-5.6/libpolyml/quick_gc.cpp000066400000000000000000000613201265146633400172100ustar00rootroot00000000000000/* Title: Quick copying garbage collector Copyright (c) 2011-12 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This is a quick copying garbage collector that moves all the data out of the allocation areas and into the mutable and immutable areas. If either of these has filled up it fails and a full garbage collection must be done. */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "processes.h" #include "gc.h" #include "scanaddrs.h" #include "check_objects.h" #include "bitmap.h" #include "memmgr.h" #include "diagnostics.h" #include "heapsizing.h" #include "gctaskfarm.h" #include "statistics.h" // This protects access to the gMem.lSpace table. static PLock localTableLock("Minor GC tables"); static bool succeeded = true; class QuickGCScanner: public ScanAddress { public: QuickGCScanner(bool r): rootScan(r) {} virtual ~QuickGCScanner() {} // Overrides for ScanAddress class virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); virtual PolyObject *ScanObjectAddress(PolyObject *base); private: PolyObject *FindNewAddress(PolyObject *obj, POLYUNSIGNED L, LocalMemSpace *srcSpace); virtual LocalMemSpace *FindSpace(POLYUNSIGNED length, bool isMutable) = 0; protected: bool objectCopied; bool rootScan; }; class RootScanner: public QuickGCScanner { public: RootScanner(): QuickGCScanner(true), mutableSpace(0), immutableSpace(0) {} private: virtual LocalMemSpace *FindSpace(POLYUNSIGNED length, bool isMutable); LocalMemSpace *mutableSpace, *immutableSpace; }; class ThreadScanner: public QuickGCScanner { public: ThreadScanner(GCTaskId* id): QuickGCScanner(false), taskID(id), mutableSpace(0), immutableSpace(0), spaceTable(0), nOwnedSpaces(0) {} virtual ~ThreadScanner() { free(spaceTable); } void ScanOwnedAreas(void); private: virtual LocalMemSpace *FindSpace(POLYUNSIGNED length, bool isMutable); bool TakeOwnership(LocalMemSpace *space); GCTaskId *taskID; LocalMemSpace *mutableSpace, *immutableSpace; LocalMemSpace **spaceTable; unsigned nOwnedSpaces; }; // This uses the conditional exchange instruction to check and update // the forwarding pointer. It uses a lock prefix so that if another // thread has updated it in the meantime it will not set it. // Using the assembly code provides a very small speed-up so may not // be worth-while. #if defined(_MSC_VER) && (_MSC_VER >= 1600) // In later versions of MS C we can use the intrinsic. // 1600 is Visual Studio 2010. It may well work in older versions # include # pragma intrinsic(_InterlockedCompareExchange) # if (SIZEOF_VOIDP == 8) # define InterlockedCompareExchange64 _InterlockedCompareExchange64 # else # define InterlockedCompareExchange _InterlockedCompareExchange # endif #endif static bool atomiclySetForwarding(LocalMemSpace *space, POLYUNSIGNED *pt, POLYUNSIGNED testVal, POLYUNSIGNED update) { #ifdef _MSC_VER # if (SIZEOF_VOIDP == 8) LONGLONG *address = (LONGLONG*)(pt-1); POLYUNSIGNED result = InterlockedCompareExchange64(address, update, testVal); return result == testVal; # else LONG *address = (LONG*)(pt-1); POLYUNSIGNED result = InterlockedCompareExchange(address, update, testVal); return result == testVal; # endif #elif(defined(HOSTARCHITECTURE_X86) && defined(__GNUC__)) POLYUNSIGNED result; __asm__ __volatile__ ( "lock; cmpxchgl %1,%2" :"=a"(result) :"r"(update),"m"(pt[-1]),"0"(testVal) :"memory", "cc" ); return result == testVal; #elif(defined(HOSTARCHITECTURE_X86_64) && defined(__GNUC__)) POLYUNSIGNED result; __asm__ __volatile__ ( "lock; cmpxchgq %1,%2" :"=a"(result) :"r"(update),"m"(pt[-1]),"0"(testVal) :"memory", "cc" ); return result == testVal; #else // Fallback on other targets. PLocker lock(&space->spaceLock); if (pt[-1] == testVal) { pt[-1] = update; return true; } return false; #endif } PolyObject *QuickGCScanner::FindNewAddress(PolyObject *obj, POLYUNSIGNED L, LocalMemSpace *srcSpace) { bool isMutable = OBJ_IS_MUTABLE_OBJECT(L); POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); LocalMemSpace *lSpace = FindSpace(n, isMutable); if (lSpace == 0) return 0; // Unable to move it. PolyObject *newObject = (PolyObject*)(lSpace->lowerAllocPtr+1); // It's possible that another thread may have actually copied the // object since we loaded the length word so we check it again. // If this is a mutable we must ensure that checking the forwarding // pointer here and updating it if necessary is atomic. We don't need // to do that for immutable data so there is a small chance that an // object may be copied twice. That's not a problem for immutable data. // Also lock this if it's code. This may not be necessary but code objects // are rare. Updating the addresses in code objects is complicated and // it's possible that there are assumptions somewhere that there's only one // copy. // Avoiding locking for immutables provides only a small speed-up so may not // be worth-while. if (isMutable || OBJ_IS_CODE_OBJECT(L)) { if (! atomiclySetForwarding(srcSpace, (POLYUNSIGNED*)obj, L, OBJ_SET_POINTER(newObject))) { newObject = obj->GetForwardingPtr(); if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Quick: %p %lu %u has already moved to %p\n", obj, n, GetTypeBits(L), newObject); objectCopied = false; return newObject; } } else { if (obj->ContainsForwardingPtr()) { newObject = obj->GetForwardingPtr(); if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Quick: %p %lu %u has already moved to %p\n", obj, n, GetTypeBits(L), newObject); objectCopied = false; return newObject; } else obj->SetForwardingPtr(newObject); } lSpace->lowerAllocPtr += n+1; CopyObjectToNewAddress(obj, newObject, L); objectCopied = true; return newObject; } // When scanning the roots we want to distribute the data among the immutable and mutable areas // so that the work is distributed for the scanning threads. LocalMemSpace *RootScanner::FindSpace(POLYUNSIGNED n, bool isMutable) { LocalMemSpace *lSpace = isMutable ? mutableSpace : immutableSpace; if (lSpace != 0) { // See if there's space in the existing area. if (lSpace->freeSpace() > n /* At least n+1*/) return lSpace; } // Find the space with the largest free area. for (unsigned i = 0; i < gMem.nlSpaces; i++) { LocalMemSpace *sp = gMem.lSpaces[i]; if (sp->isMutable == isMutable && !sp->allocationSpace && (lSpace == 0 || sp->freeSpace() > lSpace->freeSpace())) lSpace = sp; } if (lSpace != 0 && lSpace->freeSpace() > n) { if (isMutable) mutableSpace = lSpace; else immutableSpace = lSpace; return lSpace; } return gHeapSizeParameters.AddSpaceInMinorGC(n+1, isMutable); } // When scanning within a thread we don't want to be searching the space table. LocalMemSpace *ThreadScanner::FindSpace(POLYUNSIGNED n, bool isMutable) { LocalMemSpace *lSpace = isMutable ? mutableSpace : immutableSpace; if (lSpace != 0) { // See if there's space in the existing area. if (lSpace->freeSpace() > n /* At least n+1*/) return lSpace; } for (unsigned i = 0; i < nOwnedSpaces; i++) { lSpace = spaceTable[i]; if (lSpace->isMutable == isMutable && ! lSpace->allocationSpace && lSpace->freeSpace() > n /* At least n+1*/) { if (n < 10) { // We use this space for further allocations unless we are trying to // allocate a "large" object. if (isMutable) mutableSpace = lSpace; else immutableSpace = lSpace; } return lSpace; } } PLocker l(&localTableLock); // Another thread may allocate a new area, reallocating gMem.lSpaces so we // we need a lock here. if (taskID != 0) { // See if we can take a space that is currently unused. for (unsigned i = 0; i < gMem.nlSpaces; i++) { lSpace = gMem.lSpaces[i]; if (lSpace->spaceOwner == 0 && lSpace->isMutable == isMutable && ! lSpace->allocationSpace && lSpace->freeSpace() > n /* At least n+1*/) { if (debugOptions & DEBUG_GC) Log("GC: Quick: Thread %p is taking ownership of space %p\n", taskID, lSpace); if (! TakeOwnership(lSpace)) return 0; return lSpace; } } } lSpace = gHeapSizeParameters.AddSpaceInMinorGC(n+1, isMutable); if (lSpace != 0 && TakeOwnership(lSpace)) return lSpace; return 0; } // Copy all the objects. POLYUNSIGNED QuickGCScanner::ScanAddressAt(PolyWord *pt) { POLYUNSIGNED n = 1; // Set up the loop to process one word at *pt pt++; while (n-- != 0) { PolyWord val = *(--pt); if (! val.IsTagged()) { LocalMemSpace *space = gMem.LocalSpaceForAddress(val.AsAddress()); // We only copy it if it is in a local allocation space and not in the // "overflow" area of data that could not copied by the last full GC. if (space != 0 && space->allocationSpace && val.AsAddress() <= space->upperAllocPtr) { // We shouldn't get code addresses since we handle code // segments separately so if this isn't an integer it must be an object address. ASSERT(OBJ_IS_DATAPTR(val)); PolyObject *obj = val.AsObjPtr(); // Load the length word without any interlock. We can't assume that // another thread won't also copy this at the same time. POLYUNSIGNED L = obj->LengthWord(); // Has it been moved already? N.B. Another thread may be in the process of // moving it so the new object may not be fully copied. if (OBJ_IS_POINTER(L)) *pt = OBJ_GET_POINTER(L); else { // We need to copy this object. PolyObject *newObject = FindNewAddress(obj, L, space); // New address of object. if (newObject == 0) { // Couldn't copy it - not enough space. succeeded = false; if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Quick: Insufficient space to move %p %lu %u\n", obj, OBJ_OBJECT_LENGTH(L), GetTypeBits(L)); return 0; } *pt = newObject; // Update the pointer to the object // N.B. If another thread has just copied it "newObject" may actually // be an address in another thread's space. In that case "objectCopied" // will be false. if (debugOptions & DEBUG_GC_DETAIL) Log("GC: Quick: %p %lu %u moved to %p\n", obj, OBJ_OBJECT_LENGTH(L), GetTypeBits(L), newObject); // Stop now unless this is a simple word object we have been able to move. // Also stop if we're just scanning the roots. if (! rootScan && newObject != obj && ! OBJ_IS_MUTABLE_OBJECT(L) && GetTypeBits(L) == 0 && objectCopied) { // We can simply return zero in which case this performs a breadth-first scan. // A breadth-first scan distributes the objects through the memory so // to retain some degree of locality we try to copy some object pointed at // by this one. We work from the end back so that we follow the tail pointers // for lists. n = OBJ_OBJECT_LENGTH(L); // Object length pt = (PolyWord*)newObject + n; } } } } } // We've reached the end without finding a pointer to follow return 0; } // The initial entry to process the roots. Also used when processing the addresses // in objects that can't be handled by ScanAddressAt. PolyObject *QuickGCScanner::ScanObjectAddress(PolyObject *base) { PolyWord val = base; // Scan this as an address. (void)QuickGCScanner::ScanAddressAt(&val); // Ignore the result of ScanAddressAt which is always zero and // just return the updated address. return val.AsObjPtr(); } // Add this to the set of spaces we own. Must be called with the // localTableLock held. bool ThreadScanner::TakeOwnership(LocalMemSpace *space) { ASSERT(space->spaceOwner == 0); LocalMemSpace **v = (LocalMemSpace**)realloc(spaceTable, (nOwnedSpaces+1)*sizeof(LocalMemSpace*)); if (v == 0) return false; spaceTable = v; space->spaceOwner = taskID; spaceTable[nOwnedSpaces++] = space; return true; } // Thread function to scan an area. It scans the addresses in the region // copying any objects from the allocation area into mutable or immutable // areas it owns. It then processes all the areas it owns until there // are no further addresses to scan. static void scanArea(GCTaskId *id, void *arg1, void *arg2) { ThreadScanner marker(id); marker.ScanAddressesInRegion((PolyWord*)arg1, (PolyWord*)arg2); marker.ScanOwnedAreas(); } void ThreadScanner::ScanOwnedAreas() { while (true) { bool allDone = true; // We're finished when there is no unscanned data in any space we own. for (unsigned k = 0; k < nOwnedSpaces && allDone; k++) { LocalMemSpace *space = spaceTable[k]; allDone = space->partialGCScan == space->lowerAllocPtr; } if (allDone) break; // Scan each area that has had data added to it. for (unsigned l = 0; l < nOwnedSpaces; l++) { LocalMemSpace *space = spaceTable[l]; // Scan the area. This may well result in more data being added while (space->partialGCScan < space->lowerAllocPtr) { // Is the queue draining? If so it's probably worth creating // some spare work. if (gpTaskFarm->Draining() && gpTaskFarm->ThreadCount() > 1) { PolyWord *mid = space->partialGCScan + (space->lowerAllocPtr - space->partialGCScan)/2; // Split the space in two. PolyWord *p = space->partialGCScan; while (p < mid) { PolyObject *o = (PolyObject*)(p+1); ASSERT(o->ContainsNormalLengthWord()); p += o->Length()+1; } // Start a new task to scan the area up to the half-way point. // Because we round up to the end of the next object we may // include the whole area but that's probably better because // we may have other areas to scan. if (gpTaskFarm->AddWork(scanArea, space->partialGCScan, p)) { space->partialGCScan = p; if (space->lowerAllocPtr == space->partialGCScan) break; } } PolyObject *obj = (PolyObject*)(space->partialGCScan+1); ASSERT(obj->ContainsNormalLengthWord()); POLYUNSIGNED length = obj->Length(); ASSERT(space->partialGCScan+length+1 <= space->lowerAllocPtr); space->partialGCScan += length+1; if (length != 0) ScanAddressesInObject(obj); // If any thread has run out of space we should stop. if (! succeeded) return; } } } // Release the spaces we're holding in case another thread wants to use them. for (unsigned m = 0; m < nOwnedSpaces; m++) { LocalMemSpace *space = spaceTable[m]; space->spaceOwner = 0; } nOwnedSpaces = 0; } bool RunQuickGC(const POLYUNSIGNED wordsRequiredToAllocate) { // If the last minor GC took too long force a full GC. if (gHeapSizeParameters.RunMajorGCImmediately()) return false; gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeStart); globalStats.incCount(PSC_GC_PARTIALGC); mainThreadPhase = MTP_GCQUICK; succeeded = true; if (debugOptions & DEBUG_GC) Log("GC: Beginning quick GC\n"); if (debugOptions & DEBUG_HEAPSIZE) gMem.ReportHeapSizes("Minor GC (before)"); POLYUNSIGNED spaceBeforeGC = 0; for(unsigned k = 0; k < gMem.nlSpaces; k++) { LocalMemSpace *lSpace = gMem.lSpaces[k]; ASSERT (lSpace->top >= lSpace->upperAllocPtr); ASSERT (lSpace->upperAllocPtr >= lSpace->lowerAllocPtr); ASSERT (lSpace->lowerAllocPtr >= lSpace->bottom); // Remember the top before we started this GC. It's // only relevant for mutable areas. It avoids us rescanning // objects that may have been added to the space as a result of // scanning another space. if (lSpace->isMutable) lSpace->partialGCTop = lSpace->upperAllocPtr; else lSpace->partialGCTop = lSpace->top; // If we're scanning a space this is where we start. // For immutable areas this only includes newly added // data but for mutable areas we have to scan data added // by previous partial GCs. if (lSpace->isMutable && ! lSpace->allocationSpace) lSpace->partialGCRootBase = lSpace->bottom; else lSpace->partialGCRootBase = lSpace->lowerAllocPtr; lSpace->spaceOwner = 0; // Not currently owned // Add up the space in the mutable and immutable areas if (! lSpace->allocationSpace) spaceBeforeGC += lSpace->allocatedSpace(); } // First scan the roots, copying the data into the mutable and immutable areas. RootScanner rootScan; // Scan the permanent mutable areas. This could be parallelised but it doesn't // appear to be worthwhile at the moment. for (unsigned j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (space->isMutable && ! space->byteOnly) rootScan.ScanAddressesInRegion(space->bottom, space->top); } // Scan RTS addresses. This will include the thread stacks. GCModules(&rootScan); // At this point the immutable and mutable areas will have some root objects // in the space between partialGCRootBase (the old value of lowerAllocPtr) and // lowerAllocPtr. These will contain the addresses of objects in the allocation // areas. We need to scan these root objects and then any new objects we copy // until there are no objects left to scan. // We also need to scan local mutable areas since these are roots as well. // They have data between partialGCTop and top. Parallelising this appears // to be a significant gain. // We have to be careful about the pointers here. AddWorkOrRunNow begins // a thread immediately and so the scanning threads may be running while // we are still creating new tasks. To avoid tripping up we use separate // pointers to the root objects rather than using lowerAllocPtr and // partialGCScan because these can be modified by the scanning tasks. // It's also possible for new spaces to be added to the table by the scanning // tasks while we are still adding tasks. It is important that the values of // partialGCRootBase, partialGCRootTop and partialGCTop are properly initialised // for these new spaces. for (unsigned l = 0; l < gMem.nlSpaces; l++) { LocalMemSpace *space = gMem.lSpaces[l]; space->partialGCRootTop = space->lowerAllocPtr; // Top of the roots space->partialGCScan = space->lowerAllocPtr; // Start of scanning for new data. } // Now start creating tasks. From this point only a thread that owns a space // may read or modify lowerAllocPtr or partialGCScan. { unsigned l = 0; while (true) { LocalMemSpace *space; { // There is a chance that a thread that has already been forked may // allocate a new space and realloc gMem.lSpaces. We have to drop // the lock before calling AddWorkOrRunNow in case we "run now". PLocker lock(&localTableLock); if (l >= gMem.nlSpaces) break; space = gMem.lSpaces[l++]; } if (space->partialGCRootBase != space->partialGCRootTop) gpTaskFarm->AddWorkOrRunNow(scanArea, space->partialGCRootBase, space->partialGCRootTop); if (space->partialGCTop != space->top) gpTaskFarm->AddWorkOrRunNow(scanArea, space->partialGCTop, space->top); } } gpTaskFarm->WaitForCompletion(); POLYUNSIGNED spaceAfterGC = 0; if (succeeded) { globalStats.setSize(PSS_AFTER_LAST_GC, 0); globalStats.setSize(PSS_ALLOCATION, 0); globalStats.setSize(PSS_ALLOCATION_FREE, 0); // If it succeeded the allocation areas are now empty. for(unsigned l = 0; l < gMem.nlSpaces; l++) { LocalMemSpace *lSpace = gMem.lSpaces[l]; POLYUNSIGNED free; if (lSpace->allocationSpace) { lSpace->lowerAllocPtr = lSpace->bottom; free = lSpace->freeSpace(); #ifdef FILL_UNUSED_MEMORY // This provides extra checking if we have dangling pointers memset(lSpace->bottom, 0xaa, (char*)lSpace->upperAllocPtr - (char*)lSpace->bottom); #endif globalStats.incSize(PSS_ALLOCATION, free*sizeof(PolyWord)); globalStats.incSize(PSS_ALLOCATION_FREE, free*sizeof(PolyWord)); } else free = lSpace->freeSpace(); if (debugOptions & DEBUG_GC) Log("GC: %s space %p %d free in %d words %2.1f%% full\n", lSpace->spaceTypeString(), lSpace, lSpace->freeSpace(), lSpace->spaceSize(), ((float)lSpace->allocatedSpace()) * 100 / (float)lSpace->spaceSize()); globalStats.incSize(PSS_AFTER_LAST_GC, free*sizeof(PolyWord)); spaceAfterGC += lSpace->allocatedSpace(); } if (! gMem.CheckForAllocation(wordsRequiredToAllocate)) succeeded = false; } if (succeeded) { gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeEnd); if (! gHeapSizeParameters.AdjustSizeAfterMinorGC(spaceAfterGC, spaceBeforeGC)) // Adjust the allocation size. return false; // If necessary trigger a full GC immediately gHeapSizeParameters.resetMinorTimingData(); // Remove allocation spaces that are larger than the default // and any excess over the current size of the allocation area. gMem.RemoveExcessAllocation(); if (debugOptions & DEBUG_HEAPSIZE) gMem.ReportHeapSizes("Minor GC (after)"); if (debugOptions & DEBUG_GC) Log("GC: Completed successfully\n"); CheckMemory(); } else { // There was insufficient room to copy everything. We will need to // run a full GC. gHeapSizeParameters.RecordGCTime(HeapSizeParameters::GCTimeEnd); if (debugOptions & DEBUG_GC) Log("GC: Quick GC failed\n"); } return succeeded; } polyml-5.6/libpolyml/realconv.cpp000066400000000000000000003340421265146633400172400ustar00rootroot00000000000000/* Note: Although strtod and dtoa seem to be present on some systems they are not always included in the headers or in the libraries. DCJM 6/4/00 To simplify all this strtod, dtoa and free_dtoa all have a poly_ prefix. */ /**************************************************************** * * The author of this software is David M. Gay. * * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. * * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. * ***************************************************************/ /* Please send bug reports to David M. Gay (dmg at acm dot org, * with " at " changed at "@" and " dot " changed to "."). */ /* On a machine with IEEE extended-precision registers, it is * necessary to specify double-precision (53-bit) rounding precision * before invoking strtod or dtoa. If the machine uses (the equivalent * of) Intel 80x87 arithmetic, the call * _control87(PC_53, MCW_PC); * does this with many compilers. Whether this or another call is * appropriate depends on the compiler; for this to work, it may be * necessary to #include "float.h" or another system-dependent header * file. */ /* strtod for IEEE-, VAX-, and IBM-arithmetic machines. * (Note that IEEE arithmetic is disabled by gcc's -ffast-math flag.) * * This strtod returns a nearest machine number to the input decimal * string (or sets errno to ERANGE). With IEEE arithmetic, ties are * broken by the IEEE round-even rule. Otherwise ties are broken by * biased rounding (add half and chop). * * Inspired loosely by William D. Clinger's paper "How to Read Floating * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. * * Modifications: * * 1. We only require IEEE, IBM, or VAX double-precision * arithmetic (not IEEE double-extended). * 2. We get by with floating-point arithmetic in a case that * Clinger missed -- when we're computing d * 10^n * for a small integer d and the integer n is not too * much larger than 22 (the maximum integer k for which * we can represent 10^k exactly), we may be able to * compute (d*10^k) * 10^(e-k) with just one roundoff. * 3. Rather than a bit-at-a-time adjustment of the binary * result in the hard case, we use floating-point * arithmetic to determine the adjustment to within * one bit; only in really hard cases do we need to * compute a second residual. * 4. Because of 3., we don't need a large table of powers of 10 * for ten-to-e (just some small tables, e.g. of 10^k * for 0 <= k <= 22). */ /* * #define IEEE_8087 for IEEE-arithmetic machines where the least * significant byte has the lowest address. * #define IEEE_MC68k for IEEE-arithmetic machines where the most * significant byte has the lowest address. * #define Long int on machines with 32-bit ints and 64-bit longs. * #define IBM for IBM mainframe-style floating-point arithmetic. * #define VAX for VAX-style floating-point arithmetic (D_floating). * #define No_leftright to omit left-right logic in fast floating-point * computation of dtoa. This will cause dtoa modes 4 and 5 to be * treated the same as modes 2 and 3 for some inputs. * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 * and strtod and dtoa should round accordingly. Unless Trust_FLT_ROUNDS * is also #defined, fegetround() will be queried for the rounding mode. * Note that both FLT_ROUNDS and fegetround() are specified by the C99 * standard (and are specified to be consistent, with fesetround() * affecting the value of FLT_ROUNDS), but that some (Linux) systems * do not work correctly in this regard, so using fegetround() is more * portable than using FLT_ROUNDS directly. * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3 * and Honor_FLT_ROUNDS is not #defined. * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines * that use extended-precision instructions to compute rounded * products and quotients) with IBM. * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic * that rounds toward +Infinity. * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased * rounding when the underlying floating-point arithmetic uses * unbiased rounding. This prevent using ordinary floating-point * arithmetic when the result could be computed with one rounding error. * #define Inaccurate_Divide for IEEE-format with correctly rounded * products but inaccurate quotients, e.g., for Intel i860. * #define NO_LONG_LONG on machines that do not have a "long long" * integer type (of >= 64 bits). On such machines, you can * #define Just_16 to store 16 bits per 32-bit Long when doing * high-precision integer arithmetic. Whether this speeds things * up or slows things down depends on the machine and the number * being converted. If long long is available and the name is * something other than "long long", #define Llong to be the name, * and if "unsigned Llong" does not work as an unsigned version of * Llong, #define #ULLong to be the corresponding unsigned type. * #define KR_headers for old-style C function headers. * #define Bad_float_h if your system lacks a float.h or if it does not * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) * if memory is available and otherwise does something you deem * appropriate. If MALLOC is undefined, malloc will be invoked * directly -- and assumed always to succeed. Similarly, if you * want something other than the system's free() to be called to * recycle memory acquired from MALLOC, #define FREE to be the * name of the alternate routine. (FREE or free is only called in * pathological cases, e.g., in a dtoa call after a dtoa return in * mode 3 with thousands of digits requested.) * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making * memory allocations from a private pool of memory when possible. * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, * unless #defined to be a different length. This default length * suffices to get rid of MALLOC calls except for unusual cases, * such as decimal-to-binary conversion of a very long string of * digits. The longest string dtoa can return is about 751 bytes * long. For conversions by strtod of strings of 800 digits and * all dtoa conversions in single-threaded executions with 8-byte * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte * pointers, PRIVATE_MEM >= 7112 appears adequate. * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK * #defined automatically on IEEE systems. On such systems, * when INFNAN_CHECK is #defined, strtod checks * for Infinity and NaN (case insensitively). On some systems * (e.g., some HP systems), it may be necessary to #define NAN_WORD0 * appropriately -- to the most significant word of a quiet NaN. * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, * strtod also accepts (case insensitively) strings of the form * NaN(x), where x is a string of hexadecimal digits and spaces; * if there is only one string of hexadecimal digits, it is taken * for the 52 fraction bits of the resulting NaN; if there are two * or more strings of hex digits, the first is for the high 20 bits, * the second and subsequent for the low 32 bits, with intervening * white space ignored; but if this results in none of the 52 * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0 * and NAN_WORD1 are used instead. * #define MULTIPLE_THREADS if the system offers preemptively scheduled * multiple threads. In this case, you must provide (or suitably * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed * in pow5mult, ensures lazy evaluation of only one copy of high * powers of 5; omitting this lock would introduce a small * probability of wasting memory, but would otherwise be harmless.) * You must also invoke freedtoa(s) to free the value s returned by * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that * avoids underflows on inputs whose result does not underflow. * If you #define NO_IEEE_Scale on a machine that uses IEEE-format * floating-point numbers and flushes underflows to zero rather * than implementing gradual underflow, then you must also #define * Sudden_Underflow. * #define USE_LOCALE to use the current locale's decimal_point value. * #define SET_INEXACT if IEEE arithmetic is being used and extra * computation should be done to set the inexact flag when the * result is inexact and avoid setting inexact when the result * is exact. In this case, dtoa.c must be compiled in * an environment, perhaps provided by #include "dtoa.c" in a * suitable wrapper, that defines two functions, * int get_inexact(void); * void clear_inexact(void); * such that get_inexact() returns a nonzero value if the * inexact bit is already set, and clear_inexact() sets the * inexact bit to 0. When SET_INEXACT is #defined, strtod * also does extra computations to set the underflow and overflow * flags when appropriate (i.e., when the result is tiny and * inexact or when it is a numeric value rounded to +-infinity). * #define NO_ERRNO if strtod should not assign errno = ERANGE when * the result overflows to +-Infinity or underflows to 0. * #define NO_HEX_FP to omit recognition of hexadecimal floating-point * values by strtod. * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now) * to disable logic for "fast" testing of very long input strings * to strtod. This testing proceeds by initially truncating the * input string, then if necessary comparing the whole string with * a decimal expansion to decide close cases. This logic is only * used for input more than STRTOD_DIGLIM digits long (default 40). */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_SYS_PARAM_H #include #endif #include "realconv.h" #include "locking.h" // Try to determine the byte order to set either IEEE_8087 or IEEE_MC68k #ifdef __BYTE_ORDER #if __BYTE_ORDER == __LITTLE_ENDIAN #define IEEE_8087 // Little endian #elif __BYTE_ORDER == __BIG_ENDIAN #define IEEE_MC68k // Big endian #endif #endif #if !defined(IEEE_8087) && ! defined(IEEE_MC68k) #if defined(_WIN32) || defined(HOSTARCHITECTURE_X86) || defined (__i386__) || defined (_M_IX86) || \ defined (vax) || defined (__alpha) || defined(HOSTARCHITECTURE_X86_64) #define IEEE_8087 #else #define IEEE_MC68k #endif #endif #if (SIZEOF_LONG == 8) // If "long" is the same size as "double" we need to define this. #define Long int #define ULong unsigned #endif #ifndef HAVE_LONG_LONG #define NO_LONG_LONG #endif #ifndef Long #define Long long #endif #ifndef ULong typedef unsigned Long ULong; #endif #ifdef DEBUG #include "stdio.h" #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} #endif #include "stdlib.h" #include "string.h" #ifdef USE_LOCALE #include "locale.h" #endif #ifdef Honor_FLT_ROUNDS #ifndef Trust_FLT_ROUNDS #include #endif #endif #ifdef MALLOC #ifdef KR_headers extern char *MALLOC(); #else extern void *MALLOC(size_t); #endif #else #define MALLOC malloc #endif #ifndef Omit_Private_Memory #ifndef PRIVATE_MEM #define PRIVATE_MEM 2304 #endif #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) static double private_mem[PRIVATE_mem], *pmem_next = private_mem; #endif #undef IEEE_Arith #undef Avoid_Underflow #ifdef IEEE_MC68k #define IEEE_Arith #endif #ifdef IEEE_8087 #define IEEE_Arith #endif #ifdef IEEE_Arith #ifndef NO_INFNAN_CHECK #undef INFNAN_CHECK #define INFNAN_CHECK #endif #else #undef INFNAN_CHECK #define NO_STRTOD_BIGCOMP #endif #include "errno.h" #ifdef Bad_float_h #ifdef IEEE_Arith #define DBL_DIG 15 #define DBL_MAX_10_EXP 308 #define DBL_MAX_EXP 1024 #define FLT_RADIX 2 #endif /*IEEE_Arith*/ #ifdef IBM #define DBL_DIG 16 #define DBL_MAX_10_EXP 75 #define DBL_MAX_EXP 63 #define FLT_RADIX 16 #define DBL_MAX 7.2370055773322621e+75 #endif #ifdef VAX #define DBL_DIG 16 #define DBL_MAX_10_EXP 38 #define DBL_MAX_EXP 127 #define FLT_RADIX 2 #define DBL_MAX 1.7014118346046923e+38 #endif #ifndef LONG_MAX #define LONG_MAX 2147483647 #endif #else /* ifndef Bad_float_h */ #include "float.h" #endif /* Bad_float_h */ #ifndef __MATH_H__ #include "math.h" #endif #ifdef __cplusplus extern "C" { #endif #ifndef CONST #ifdef KR_headers #define CONST /* blank */ #else #define CONST const #endif #endif #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. #endif typedef union { double d; ULong L[2]; } U; #ifdef IEEE_8087 #define word0(x) (x)->L[1] #define word1(x) (x)->L[0] #else #define word0(x) (x)->L[0] #define word1(x) (x)->L[1] #endif #define dval(x) (x)->d #ifndef STRTOD_DIGLIM #define STRTOD_DIGLIM 40 #endif #ifdef DIGLIM_DEBUG extern int strtod_diglim; #else #define strtod_diglim STRTOD_DIGLIM #endif /* The following definition of Storeinc is appropriate for MIPS processors. * An alternative that might be better on some machines is * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) */ #if defined(IEEE_8087) + defined(VAX) #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ ((unsigned short *)a)[0] = (unsigned short)c, a++) #else #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ ((unsigned short *)a)[1] = (unsigned short)c, a++) #endif /* #define P DBL_MANT_DIG */ /* Ten_pmax = floor(P*log(2)/log(5)) */ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ #ifdef IEEE_Arith #define Exp_shift 20 #define Exp_shift1 20 #define Exp_msk1 0x100000 #define Exp_msk11 0x100000 #define Exp_mask 0x7ff00000 #define P 53 #define Nbits 53 #define Bias 1023 #define Emax 1023 #define Emin (-1022) #define Exp_1 0x3ff00000 #define Exp_11 0x3ff00000 #define Ebits 11 #define Frac_mask 0xfffff #define Frac_mask1 0xfffff #define Ten_pmax 22 #define Bletch 0x10 #define Bndry_mask 0xfffff #define Bndry_mask1 0xfffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 1 #define Tiny0 0 #define Tiny1 1 #define Quick_max 14 #define Int_max 14 #ifndef NO_IEEE_Scale #define Avoid_Underflow #ifdef Flush_Denorm /* debugging option */ #undef Sudden_Underflow #endif #endif #ifndef Flt_Rounds #ifdef FLT_ROUNDS #define Flt_Rounds FLT_ROUNDS #else #define Flt_Rounds 1 #endif #endif /*Flt_Rounds*/ #ifdef Honor_FLT_ROUNDS #undef Check_FLT_ROUNDS #define Check_FLT_ROUNDS #else #define Rounding Flt_Rounds #endif #else /* ifndef IEEE_Arith */ #undef Check_FLT_ROUNDS #undef Honor_FLT_ROUNDS #undef SET_INEXACT #undef Sudden_Underflow #define Sudden_Underflow #ifdef IBM #undef Flt_Rounds #define Flt_Rounds 0 #define Exp_shift 24 #define Exp_shift1 24 #define Exp_msk1 0x1000000 #define Exp_msk11 0x1000000 #define Exp_mask 0x7f000000 #define P 14 #define Nbits 56 #define Bias 65 #define Emax 248 #define Emin (-260) #define Exp_1 0x41000000 #define Exp_11 0x41000000 #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ #define Frac_mask 0xffffff #define Frac_mask1 0xffffff #define Bletch 4 #define Ten_pmax 22 #define Bndry_mask 0xefffff #define Bndry_mask1 0xffffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 4 #define Tiny0 0x100000 #define Tiny1 0 #define Quick_max 14 #define Int_max 15 #else /* VAX */ #undef Flt_Rounds #define Flt_Rounds 1 #define Exp_shift 23 #define Exp_shift1 7 #define Exp_msk1 0x80 #define Exp_msk11 0x800000 #define Exp_mask 0x7f80 #define P 56 #define Nbits 56 #define Bias 129 #define Emax 126 #define Emin (-129) #define Exp_1 0x40800000 #define Exp_11 0x4080 #define Ebits 8 #define Frac_mask 0x7fffff #define Frac_mask1 0xffff007f #define Ten_pmax 24 #define Bletch 2 #define Bndry_mask 0xffff007f #define Bndry_mask1 0xffff007f #define LSB 0x10000 #define Sign_bit 0x8000 #define Log2P 1 #define Tiny0 0x80 #define Tiny1 0 #define Quick_max 15 #define Int_max 15 #endif /* IBM, VAX */ #endif /* IEEE_Arith */ #ifndef IEEE_Arith #define ROUND_BIASED #else #ifdef ROUND_BIASED_without_Round_Up #undef ROUND_BIASED #define ROUND_BIASED #endif #endif #ifdef RND_PRODQUOT #define rounded_product(a,b) a = rnd_prod(a, b) #define rounded_quotient(a,b) a = rnd_quot(a, b) #ifdef KR_headers extern double rnd_prod(), rnd_quot(); #else extern double rnd_prod(double, double), rnd_quot(double, double); #endif #else #define rounded_product(a,b) a *= b #define rounded_quotient(a,b) a /= b #endif #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) #define Big1 0xffffffff #ifndef Pack_32 #define Pack_32 #endif typedef struct BCinfo BCinfo; struct BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; }; #ifdef KR_headers #define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff) #else #define FFFFFFFF 0xffffffffUL #endif #ifdef NO_LONG_LONG #undef ULLong #ifdef Just_16 #undef Pack_32 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long. * This makes some inner loops simpler and sometimes saves work * during multiplications, but it often seems to make things slightly * slower. Hence the default is now to store 32 bits per Long. */ #endif #else /* long long available */ #ifndef Llong #define Llong long long #endif #ifndef ULLong #define ULLong unsigned Llong #endif #endif /* NO_LONG_LONG */ #define MULTIPLE_THREADS static PLock dtoaLocks[2]; #define ACQUIRE_DTOA_LOCK(n) { dtoaLocks[n].Lock(); } #define FREE_DTOA_LOCK(n) { dtoaLocks[n].Unlock(); } #ifndef MULTIPLE_THREADS #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ #define FREE_DTOA_LOCK(n) /*nothing*/ #endif #define Kmax 7 #ifdef __cplusplus extern "C" double strtod(const char *s00, char **se); extern "C" char *dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); #endif struct Bigint { struct Bigint *next; int k, maxwds, sign, wds; ULong x[1]; }; typedef struct Bigint Bigint; static Bigint *freelist[Kmax+1]; static Bigint * Balloc #ifdef KR_headers (k) int k; #else (int k) #endif { int x; Bigint *rv; #ifndef Omit_Private_Memory unsigned int len; #endif ACQUIRE_DTOA_LOCK(0); /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ /* but this case seems very unlikely. */ if (k <= Kmax && (rv = freelist[k])) freelist[k] = rv->next; else { x = 1 << k; #ifdef Omit_Private_Memory rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); #else len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) /sizeof(double); if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { rv = (Bigint*)pmem_next; pmem_next += len; } else rv = (Bigint*)MALLOC(len*sizeof(double)); #endif rv->k = k; rv->maxwds = x; } FREE_DTOA_LOCK(0); rv->sign = rv->wds = 0; return rv; } static void Bfree #ifdef KR_headers (v) Bigint *v; #else (Bigint *v) #endif { if (v) { if (v->k > Kmax) #ifdef FREE FREE((void*)v); #else free((void*)v); #endif else { ACQUIRE_DTOA_LOCK(0); v->next = freelist[v->k]; freelist[v->k] = v; FREE_DTOA_LOCK(0); } } } #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ y->wds*sizeof(Long) + 2*sizeof(int)) static Bigint * multadd #ifdef KR_headers (b, m, a) Bigint *b; int m, a; #else (Bigint *b, int m, int a) /* multiply by m and add a */ #endif { int i, wds; #ifdef ULLong ULong *x; ULLong carry, y; #else ULong carry, *x, y; #ifdef Pack_32 ULong xi, z; #endif #endif Bigint *b1; wds = b->wds; x = b->x; i = 0; carry = a; do { #ifdef ULLong y = *x * (ULLong)m + carry; carry = y >> 32; *x++ = y & FFFFFFFF; #else #ifdef Pack_32 xi = *x; y = (xi & 0xffff) * m + carry; z = (xi >> 16) * m + (y >> 16); carry = z >> 16; *x++ = (z << 16) + (y & 0xffff); #else y = *x * m + carry; carry = y >> 16; *x++ = y & 0xffff; #endif #endif } while(++i < wds); if (carry) { if (wds >= b->maxwds) { b1 = Balloc(b->k+1); Bcopy(b1, b); Bfree(b); b = b1; } b->x[wds++] = carry; b->wds = wds; } return b; } static Bigint * s2b #ifdef KR_headers (s, nd0, nd, y9, dplen) CONST char *s; int nd0, nd, dplen; ULong y9; #else (const char *s, int nd0, int nd, ULong y9, int dplen) #endif { Bigint *b; int i, k; Long x, y; x = (nd + 8) / 9; for(k = 0, y = 1; x > y; y <<= 1, k++) ; #ifdef Pack_32 b = Balloc(k); b->x[0] = y9; b->wds = 1; #else b = Balloc(k+1); b->x[0] = y9 & 0xffff; b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; #endif i = 9; if (9 < nd0) { s += 9; do b = multadd(b, 10, *s++ - '0'); while(++i < nd0); s += dplen; } else s += dplen + 9; for(; i < nd; i++) b = multadd(b, 10, *s++ - '0'); return b; } static int hi0bits #ifdef KR_headers (x) ULong x; #else (ULong x) #endif { int k = 0; if (!(x & 0xffff0000)) { k = 16; x <<= 16; } if (!(x & 0xff000000)) { k += 8; x <<= 8; } if (!(x & 0xf0000000)) { k += 4; x <<= 4; } if (!(x & 0xc0000000)) { k += 2; x <<= 2; } if (!(x & 0x80000000)) { k++; if (!(x & 0x40000000)) return 32; } return k; } static int lo0bits #ifdef KR_headers (y) ULong *y; #else (ULong *y) #endif { int k; ULong x = *y; if (x & 7) { if (x & 1) return 0; if (x & 2) { *y = x >> 1; return 1; } *y = x >> 2; return 2; } k = 0; if (!(x & 0xffff)) { k = 16; x >>= 16; } if (!(x & 0xff)) { k += 8; x >>= 8; } if (!(x & 0xf)) { k += 4; x >>= 4; } if (!(x & 0x3)) { k += 2; x >>= 2; } if (!(x & 1)) { k++; x >>= 1; if (!x) return 32; } *y = x; return k; } static Bigint * i2b #ifdef KR_headers (i) int i; #else (int i) #endif { Bigint *b; b = Balloc(1); b->x[0] = i; b->wds = 1; return b; } static Bigint * mult #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { Bigint *c; int k, wa, wb, wc; ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; ULong y; #ifdef ULLong ULLong carry, z; #else ULong carry, z; #ifdef Pack_32 ULong z2; #endif #endif if (a->wds < b->wds) { c = a; a = b; b = c; } k = a->k; wa = a->wds; wb = b->wds; wc = wa + wb; if (wc > a->maxwds) k++; c = Balloc(k); for(x = c->x, xa = x + wc; x < xa; x++) *x = 0; xa = a->x; xae = xa + wa; xb = b->x; xbe = xb + wb; xc0 = c->x; #ifdef ULLong for(; xb < xbe; xc0++) { if ((y = *xb++)) { x = xa; xc = xc0; carry = 0; do { z = *x++ * (ULLong)y + *xc + carry; carry = z >> 32; *xc++ = z & FFFFFFFF; } while(x < xae); *xc = carry; } } #else #ifdef Pack_32 for(; xb < xbe; xb++, xc0++) { if (y = *xb & 0xffff) { x = xa; xc = xc0; carry = 0; do { z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; carry = z >> 16; z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; carry = z2 >> 16; Storeinc(xc, z2, z); } while(x < xae); *xc = carry; } if (y = *xb >> 16) { x = xa; xc = xc0; carry = 0; z2 = *xc; do { z = (*x & 0xffff) * y + (*xc >> 16) + carry; carry = z >> 16; Storeinc(xc, z, z2); z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; carry = z2 >> 16; } while(x < xae); *xc = z2; } } #else for(; xb < xbe; xc0++) { if (y = *xb++) { x = xa; xc = xc0; carry = 0; do { z = *x++ * y + *xc + carry; carry = z >> 16; *xc++ = z & 0xffff; } while(x < xae); *xc = carry; } } #endif #endif for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; c->wds = wc; return c; } static Bigint *p5s; static Bigint * pow5mult #ifdef KR_headers (b, k) Bigint *b; int k; #else (Bigint *b, int k) #endif { Bigint *b1, *p5, *p51; int i; static int p05[3] = { 5, 25, 125 }; if ((i = k & 3)) b = multadd(b, p05[i-1], 0); if (!(k >>= 2)) return b; if (!(p5 = p5s)) { /* first time */ #ifdef MULTIPLE_THREADS ACQUIRE_DTOA_LOCK(1); if (!(p5 = p5s)) { p5 = p5s = i2b(625); p5->next = 0; } FREE_DTOA_LOCK(1); #else p5 = p5s = i2b(625); p5->next = 0; #endif } for(;;) { if (k & 1) { b1 = mult(b, p5); Bfree(b); b = b1; } if (!(k >>= 1)) break; if (!(p51 = p5->next)) { #ifdef MULTIPLE_THREADS ACQUIRE_DTOA_LOCK(1); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5,p5); p51->next = 0; } FREE_DTOA_LOCK(1); #else p51 = p5->next = mult(p5,p5); p51->next = 0; #endif } p5 = p51; } return b; } static Bigint * lshift #ifdef KR_headers (b, k) Bigint *b; int k; #else (Bigint *b, int k) #endif { int i, k1, n, n1; Bigint *b1; ULong *x, *x1, *xe, z; #ifdef Pack_32 n = k >> 5; #else n = k >> 4; #endif k1 = b->k; n1 = n + b->wds + 1; for(i = b->maxwds; n1 > i; i <<= 1) k1++; b1 = Balloc(k1); x1 = b1->x; for(i = 0; i < n; i++) *x1++ = 0; x = b->x; xe = x + b->wds; #ifdef Pack_32 if (k &= 0x1f) { k1 = 32 - k; z = 0; do { *x1++ = *x << k | z; z = *x++ >> k1; } while(x < xe); if ((*x1 = z)) ++n1; } #else if (k &= 0xf) { k1 = 16 - k; z = 0; do { *x1++ = *x << k & 0xffff | z; z = *x++ >> k1; } while(x < xe); if (*x1 = z) ++n1; } #endif else do *x1++ = *x++; while(x < xe); b1->wds = n1 - 1; Bfree(b); return b1; } static int cmp #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { ULong *xa, *xa0, *xb, *xb0; int i, j; i = a->wds; j = b->wds; #ifdef DEBUG if (i > 1 && !a->x[i-1]) Bug("cmp called with a->x[a->wds-1] == 0"); if (j > 1 && !b->x[j-1]) Bug("cmp called with b->x[b->wds-1] == 0"); #endif if (i -= j) return i; xa0 = a->x; xa = xa0 + j; xb0 = b->x; xb = xb0 + j; for(;;) { if (*--xa != *--xb) return *xa < *xb ? -1 : 1; if (xa <= xa0) break; } return 0; } static Bigint * diff #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { Bigint *c; int i, wa, wb; ULong *xa, *xae, *xb, *xbe, *xc; #ifdef ULLong ULLong borrow, y; #else ULong borrow, y; #ifdef Pack_32 ULong z; #endif #endif i = cmp(a,b); if (!i) { c = Balloc(0); c->wds = 1; c->x[0] = 0; return c; } if (i < 0) { c = a; a = b; b = c; i = 1; } else i = 0; c = Balloc(a->k); c->sign = i; wa = a->wds; xa = a->x; xae = xa + wa; wb = b->wds; xb = b->x; xbe = xb + wb; xc = c->x; borrow = 0; #ifdef ULLong do { y = (ULLong)*xa++ - *xb++ - borrow; borrow = y >> 32 & (ULong)1; *xc++ = y & FFFFFFFF; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = y >> 32 & (ULong)1; *xc++ = y & FFFFFFFF; } #else #ifdef Pack_32 do { y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } while(xb < xbe); while(xa < xae) { y = (*xa & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*xa++ >> 16) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(xc, z, y); } #else do { y = *xa++ - *xb++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } while(xb < xbe); while(xa < xae) { y = *xa++ - borrow; borrow = (y & 0x10000) >> 16; *xc++ = y & 0xffff; } #endif #endif while(!*--xc) wa--; c->wds = wa; return c; } static double ulp #ifdef KR_headers (x) U *x; #else (U *x) #endif { Long L; U u; L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; #ifndef Avoid_Underflow #ifndef Sudden_Underflow if (L > 0) { #endif #endif #ifdef IBM L |= Exp_msk1 >> 4; #endif word0(&u) = L; word1(&u) = 0; #ifndef Avoid_Underflow #ifndef Sudden_Underflow } else { L = -L >> Exp_shift; if (L < Exp_shift) { word0(&u) = 0x80000 >> L; word1(&u) = 0; } else { word0(&u) = 0; L -= Exp_shift; word1(&u) = L >= 31 ? 1 : 1 << 31 - L; } } #endif #endif return dval(&u); } static double b2d #ifdef KR_headers (a, e) Bigint *a; int *e; #else (Bigint *a, int *e) #endif { ULong *xa, *xa0, w, y, z; int k; U d; #ifdef VAX ULong d0, d1; #else #define d0 word0(&d) #define d1 word1(&d) #endif xa0 = a->x; xa = xa0 + a->wds; y = *--xa; #ifdef DEBUG if (!y) Bug("zero y in b2d"); #endif k = hi0bits(y); *e = 32 - k; #ifdef Pack_32 if (k < Ebits) { d0 = Exp_1 | y >> (Ebits - k); w = xa > xa0 ? *--xa : 0; d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); goto ret_d; } z = xa > xa0 ? *--xa : 0; if (k -= Ebits) { d0 = Exp_1 | y << k | z >> (32 - k); y = xa > xa0 ? *--xa : 0; d1 = z << k | y >> (32 - k); } else { d0 = Exp_1 | y; d1 = z; } #else if (k < Ebits + 16) { z = xa > xa0 ? *--xa : 0; d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; w = xa > xa0 ? *--xa : 0; y = xa > xa0 ? *--xa : 0; d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; goto ret_d; } z = xa > xa0 ? *--xa : 0; w = xa > xa0 ? *--xa : 0; k -= Ebits + 16; d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; y = xa > xa0 ? *--xa : 0; d1 = w << k + 16 | y << k; #endif ret_d: #ifdef VAX word0(&d) = d0 >> 16 | d0 << 16; word1(&d) = d1 >> 16 | d1 << 16; #else #undef d0 #undef d1 #endif return dval(&d); } static Bigint * d2b #ifdef KR_headers (d, e, bits) U *d; int *e, *bits; #else (U *d, int *e, int *bits) #endif { Bigint *b; int de, k; ULong *x, y, z; #ifndef Sudden_Underflow int i; #endif #ifdef VAX ULong d0, d1; d0 = word0(d) >> 16 | word0(d) << 16; d1 = word1(d) >> 16 | word1(d) << 16; #else #define d0 word0(d) #define d1 word1(d) #endif #ifdef Pack_32 b = Balloc(1); #else b = Balloc(2); #endif x = b->x; z = d0 & Frac_mask; d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ #ifdef Sudden_Underflow de = (int)(d0 >> Exp_shift); #ifndef IBM z |= Exp_msk11; #endif #else if ((de = (int)(d0 >> Exp_shift))) z |= Exp_msk1; #endif #ifdef Pack_32 if ((y = d1)) { if ((k = lo0bits(&y))) { x[0] = y | z << (32 - k); z >>= k; } else x[0] = y; #ifndef Sudden_Underflow i = #endif b->wds = (x[1] = z) ? 2 : 1; } else { k = lo0bits(&z); x[0] = z; #ifndef Sudden_Underflow i = #endif b->wds = 1; k += 32; } #else if (y = d1) { if (k = lo0bits(&y)) if (k >= 16) { x[0] = y | z << 32 - k & 0xffff; x[1] = z >> k - 16 & 0xffff; x[2] = z >> k; i = 2; } else { x[0] = y & 0xffff; x[1] = y >> 16 | z << 16 - k & 0xffff; x[2] = z >> k & 0xffff; x[3] = z >> k+16; i = 3; } else { x[0] = y & 0xffff; x[1] = y >> 16; x[2] = z & 0xffff; x[3] = z >> 16; i = 3; } } else { #ifdef DEBUG if (!z) Bug("Zero passed to d2b"); #endif k = lo0bits(&z); if (k >= 16) { x[0] = z; i = 0; } else { x[0] = z & 0xffff; x[1] = z >> 16; i = 1; } k += 32; } while(!x[i]) --i; b->wds = i + 1; #endif #ifndef Sudden_Underflow if (de) { #endif #ifdef IBM *e = (de - Bias - (P-1) << 2) + k; *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); #else *e = de - Bias - (P-1) + k; *bits = P - k; #endif #ifndef Sudden_Underflow } else { *e = de - Bias - (P-1) + 1 + k; #ifdef Pack_32 *bits = 32*i - hi0bits(x[i-1]); #else *bits = (i+2)*16 - hi0bits(x[i]); #endif } #endif return b; } #undef d0 #undef d1 static double ratio #ifdef KR_headers (a, b) Bigint *a, *b; #else (Bigint *a, Bigint *b) #endif { U da, db; int k, ka, kb; dval(&da) = b2d(a, &ka); dval(&db) = b2d(b, &kb); #ifdef Pack_32 k = ka - kb + 32*(a->wds - b->wds); #else k = ka - kb + 16*(a->wds - b->wds); #endif #ifdef IBM if (k > 0) { word0(&da) += (k >> 2)*Exp_msk1; if (k &= 3) dval(&da) *= 1 << k; } else { k = -k; word0(&db) += (k >> 2)*Exp_msk1; if (k &= 3) dval(&db) *= 1 << k; } #else if (k > 0) word0(&da) += k*Exp_msk1; else { k = -k; word0(&db) += k*Exp_msk1; } #endif return dval(&da) / dval(&db); } static CONST double tens[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 #ifdef VAX , 1e23, 1e24 #endif }; static CONST double #ifdef IEEE_Arith bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, #ifdef Avoid_Underflow 9007199254740992.*9007199254740992.e-256 /* = 2^106 * 1e-256 */ #else 1e-256 #endif }; /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */ #define Scale_Bit 0x10 #define n_bigtens 5 #else #ifdef IBM bigtens[] = { 1e16, 1e32, 1e64 }; static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; #define n_bigtens 3 #else bigtens[] = { 1e16, 1e32 }; static CONST double tinytens[] = { 1e-16, 1e-32 }; #define n_bigtens 2 #endif #endif #undef Need_Hexdig #ifdef INFNAN_CHECK #ifndef No_Hex_NaN #define Need_Hexdig #endif #endif #ifndef Need_Hexdig #ifndef NO_HEX_FP #define Need_Hexdig #endif #endif #ifdef Need_Hexdig /*{*/ #if 0 static unsigned char hexdig[256]; static void htinit(unsigned char *h, unsigned char *s, int inc) { int i, j; for(i = 0; (j = s[i]) !=0; i++) h[j] = i + inc; } static void hexdig_init(void) /* Use of hexdig_init omitted 20121220 to avoid a */ /* race condition when multiple threads are used. */ { #define USC (unsigned char *) htinit(hexdig, USC "0123456789", 0x10); htinit(hexdig, USC "abcdef", 0x10 + 10); htinit(hexdig, USC "ABCDEF", 0x10 + 10); } #else static unsigned char hexdig[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0, 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; #endif #endif /* } Need_Hexdig */ #ifdef INFNAN_CHECK #ifndef NAN_WORD0 #define NAN_WORD0 0x7ff80000 #endif #ifndef NAN_WORD1 #define NAN_WORD1 0 #endif static int match #ifdef KR_headers (sp, t) char **sp, *t; #else (const char **sp, const char *t) #endif { int c, d; CONST char *s = *sp; while((d = *t++)) { if ((c = *++s) >= 'A' && c <= 'Z') c += 'a' - 'A'; if (c != d) return 0; } *sp = s + 1; return 1; } #ifndef No_Hex_NaN static void hexnan #ifdef KR_headers (rvp, sp) U *rvp; CONST char **sp; #else (U *rvp, const char **sp) #endif { ULong c, x[2]; CONST char *s; int c1, havedig, udx0, xshift; /**** if (!hexdig['0']) hexdig_init(); ****/ x[0] = x[1] = 0; havedig = xshift = 0; udx0 = 1; s = *sp; /* allow optional initial 0x or 0X */ while((c = *(CONST unsigned char*)(s+1)) && c <= ' ') ++s; if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) s += 2; while((c = *(CONST unsigned char*)++s)) { if ((c1 = hexdig[c])) c = c1 & 0xf; else if (c <= ' ') { if (udx0 && havedig) { udx0 = 0; xshift = 1; } continue; } #ifdef GDTOA_NON_PEDANTIC_NANCHECK else if (/*(*/ c == ')' && havedig) { *sp = s + 1; break; } else return; /* invalid form: don't change *sp */ #else else { do { if (/*(*/ c == ')') { *sp = s + 1; break; } } while((c = *++s)); break; } #endif havedig = 1; if (xshift) { xshift = 0; x[0] = x[1]; x[1] = 0; } if (udx0) x[0] = (x[0] << 4) | (x[1] >> 28); x[1] = (x[1] << 4) | c; } if ((x[0] &= 0xfffff) || x[1]) { word0(rvp) = Exp_mask | x[0]; word1(rvp) = x[1]; } } #endif /*No_Hex_NaN*/ #endif /* INFNAN_CHECK */ #ifdef Pack_32 #define ULbits 32 #define kshift 5 #define kmask 31 #else #define ULbits 16 #define kshift 4 #define kmask 15 #endif #if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/ static Bigint * #ifdef KR_headers increment(b) Bigint *b; #else increment(Bigint *b) #endif { ULong *x, *xe; Bigint *b1; x = b->x; xe = x + b->wds; do { if (*x < (ULong)0xffffffffL) { ++*x; return b; } *x++ = 0; } while(x < xe); { if (b->wds >= b->maxwds) { b1 = Balloc(b->k+1); Bcopy(b1,b); Bfree(b); b = b1; } b->x[b->wds++] = 1; } return b; } #endif /*}*/ #ifndef NO_HEX_FP /*{*/ static void #ifdef KR_headers rshift(b, k) Bigint *b; int k; #else rshift(Bigint *b, int k) #endif { ULong *x, *x1, *xe, y; int n; x = x1 = b->x; n = k >> kshift; if (n < b->wds) { xe = x + b->wds; x += n; if (k &= kmask) { n = 32 - k; y = *x++ >> k; while(x < xe) { *x1++ = (y | (*x << n)) & 0xffffffff; y = *x++ >> k; } if ((*x1 = y) !=0) x1++; } else while(x < xe) *x1++ = *x++; } if ((b->wds = x1 - b->x) == 0) b->x[0] = 0; } static ULong #ifdef KR_headers any_on(b, k) Bigint *b; int k; #else any_on(Bigint *b, int k) #endif { int n, nwds; ULong *x, *x0, x1, x2; x = b->x; nwds = b->wds; n = k >> kshift; if (n > nwds) n = nwds; else if (n < nwds && (k &= kmask)) { x1 = x2 = x[n]; x1 >>= k; x1 <<= k; if (x1 != x2) return 1; } x0 = x; x += n; while(x > x0) if (*--x) return 1; return 0; } enum { /* rounding values: same as FLT_ROUNDS */ Round_zero = 0, Round_near = 1, Round_up = 2, Round_down = 3 }; void #ifdef KR_headers gethex(sp, rvp, rounding, sign) CONST char **sp; U *rvp; int rounding, sign; #else gethex( CONST char **sp, U *rvp, int rounding, int sign) #endif { Bigint *b; CONST unsigned char *decpt, *s0, *s, *s1; Long e, e1; ULong L, lostbits, *x; int big, denorm, esign, havedig, k, n, nbits, up, zret; #ifdef IBM int j; #endif enum { #ifdef IEEE_Arith /*{{*/ emax = 0x7fe - Bias - P + 1, emin = Emin - P + 1 #else /*}{*/ emin = Emin - P, #ifdef VAX emax = 0x7ff - Bias - P + 1 #endif #ifdef IBM emax = 0x7f - Bias - P #endif #endif /*}}*/ }; #ifdef USE_LOCALE int i; #ifdef NO_LOCALE_CACHE const unsigned char *decimalpoint = (unsigned char*) localeconv()->decimal_point; #else const unsigned char *decimalpoint; static unsigned char *decimalpoint_cache; if (!(s0 = decimalpoint_cache)) { s0 = (unsigned char*)localeconv()->decimal_point; if ((decimalpoint_cache = (unsigned char*) MALLOC(strlen((CONST char*)s0) + 1))) { strcpy((char*)decimalpoint_cache, (CONST char*)s0); s0 = decimalpoint_cache; } } decimalpoint = s0; #endif #endif /**** if (!hexdig['0']) hexdig_init(); ****/ havedig = 0; s0 = *(CONST unsigned char **)sp + 2; while(s0[havedig] == '0') havedig++; s0 += havedig; s = s0; decpt = 0; zret = 0; e = 0; if (hexdig[*s]) havedig++; else { zret = 1; #ifdef USE_LOCALE for(i = 0; decimalpoint[i]; ++i) { if (s[i] != decimalpoint[i]) goto pcheck; } decpt = s += i; #else if (*s != '.') goto pcheck; decpt = ++s; #endif if (!hexdig[*s]) goto pcheck; while(*s == '0') s++; if (hexdig[*s]) zret = 0; havedig = 1; s0 = s; } while(hexdig[*s]) s++; #ifdef USE_LOCALE if (*s == *decimalpoint && !decpt) { for(i = 1; decimalpoint[i]; ++i) { if (s[i] != decimalpoint[i]) goto pcheck; } decpt = s += i; #else if (*s == '.' && !decpt) { decpt = ++s; #endif while(hexdig[*s]) s++; }/*}*/ if (decpt) e = -(((Long)(s-decpt)) << 2); pcheck: s1 = s; big = esign = 0; switch(*s) { case 'p': case 'P': switch(*++s) { case '-': esign = 1; /* no break */ case '+': s++; } if ((n = hexdig[*s]) == 0 || n > 0x19) { s = s1; break; } e1 = n - 0x10; while((n = hexdig[*++s]) !=0 && n <= 0x19) { if (e1 & 0xf8000000) big = 1; e1 = 10*e1 + n - 0x10; } if (esign) e1 = -e1; e += e1; } *sp = (char*)s; if (!havedig) *sp = (char*)s0 - 1; if (zret) goto retz1; if (big) { if (esign) { #ifdef IEEE_Arith switch(rounding) { case Round_up: if (sign) break; goto ret_tiny; case Round_down: if (!sign) break; goto ret_tiny; } #endif goto retz; #ifdef IEEE_Arith ret_tinyf: Bfree(b); ret_tiny: #ifndef NO_ERRNO errno = ERANGE; #endif word0(rvp) = 0; word1(rvp) = 1; return; #endif /* IEEE_Arith */ } switch(rounding) { case Round_near: goto ovfl1; case Round_up: if (!sign) goto ovfl1; goto ret_big; case Round_down: if (sign) goto ovfl1; goto ret_big; } ret_big: word0(rvp) = Big0; word1(rvp) = Big1; return; } n = s1 - s0 - 1; for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1) k++; b = Balloc(k); x = b->x; n = 0; L = 0; #ifdef USE_LOCALE for(i = 0; decimalpoint[i+1]; ++i); #endif while(s1 > s0) { #ifdef USE_LOCALE if (*--s1 == decimalpoint[i]) { s1 -= i; continue; } #else if (*--s1 == '.') continue; #endif if (n == ULbits) { *x++ = L; L = 0; n = 0; } L |= (hexdig[*s1] & 0x0f) << n; n += 4; } *x++ = L; b->wds = n = x - b->x; n = ULbits*n - hi0bits(L); nbits = Nbits; lostbits = 0; x = b->x; if (n > nbits) { n -= nbits; if (any_on(b,n)) { lostbits = 1; k = n - 1; if (x[k>>kshift] & 1 << (k & kmask)) { lostbits = 2; if (k > 0 && any_on(b,k)) lostbits = 3; } } rshift(b, n); e += n; } else if (n < nbits) { n = nbits - n; b = lshift(b, n); e -= n; x = b->x; } if (e > Emax) { ovfl: Bfree(b); ovfl1: #ifndef NO_ERRNO errno = ERANGE; #endif word0(rvp) = Exp_mask; word1(rvp) = 0; return; } denorm = 0; if (e < emin) { denorm = 1; n = emin - e; if (n >= nbits) { #ifdef IEEE_Arith /*{*/ switch (rounding) { case Round_near: if (n == nbits && (n < 2 || any_on(b,n-1))) goto ret_tinyf; break; case Round_up: if (!sign) goto ret_tinyf; break; case Round_down: if (sign) goto ret_tinyf; } #endif /* } IEEE_Arith */ Bfree(b); retz: #ifndef NO_ERRNO errno = ERANGE; #endif retz1: rvp->d = 0.; return; } k = n - 1; if (lostbits) lostbits = 1; else if (k > 0) lostbits = any_on(b,k); if (x[k>>kshift] & 1 << (k & kmask)) lostbits |= 2; nbits -= n; rshift(b,n); e = emin; } if (lostbits) { up = 0; switch(rounding) { case Round_zero: break; case Round_near: if (lostbits & 2 && (lostbits & 1) | (x[0] & 1)) up = 1; break; case Round_up: up = 1 - sign; break; case Round_down: up = sign; } if (up) { k = b->wds; b = increment(b); x = b->x; if (denorm) { #if 0 if (nbits == Nbits - 1 && x[nbits >> kshift] & 1 << (nbits & kmask)) denorm = 0; /* not currently used */ #endif } else if (b->wds > k || ((n = nbits & kmask) !=0 && hi0bits(x[k-1]) < 32-n)) { rshift(b,1); if (++e > Emax) goto ovfl; } } } #ifdef IEEE_Arith if (denorm) word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0; else word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20); word1(rvp) = b->x[0]; #endif #ifdef IBM if ((j = e & 3)) { k = b->x[0] & ((1 << j) - 1); rshift(b,j); if (k) { switch(rounding) { case Round_up: if (!sign) increment(b); break; case Round_down: if (sign) increment(b); break; case Round_near: j = 1 << (j-1); if (k & j && ((k & (j-1)) | lostbits)) increment(b); } } } e >>= 2; word0(rvp) = b->x[1] | ((e + 65 + 13) << 24); word1(rvp) = b->x[0]; #endif #ifdef VAX /* The next two lines ignore swap of low- and high-order 2 bytes. */ /* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */ /* word1(rvp) = b->x[0]; */ word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16); word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16); #endif Bfree(b); } #endif /*!NO_HEX_FP}*/ static int #ifdef KR_headers dshift(b, p2) Bigint *b; int p2; #else dshift(Bigint *b, int p2) #endif { int rv = hi0bits(b->x[b->wds-1]) - 4; if (p2 > 0) rv -= p2; return rv & kmask; } static int quorem #ifdef KR_headers (b, S) Bigint *b, *S; #else (Bigint *b, Bigint *S) #endif { int n; ULong *bx, *bxe, q, *sx, *sxe; #ifdef ULLong ULLong borrow, carry, y, ys; #else ULong borrow, carry, y, ys; #ifdef Pack_32 ULong si, z, zs; #endif #endif n = S->wds; #ifdef DEBUG /*debug*/ if (b->wds > n) /*debug*/ Bug("oversize b in quorem"); #endif if (b->wds < n) return 0; sx = S->x; sxe = sx + --n; bx = b->x; bxe = bx + n; q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ #ifdef DEBUG #ifdef NO_STRTOD_BIGCOMP /*debug*/ if (q > 9) #else /* An oversized q is possible when quorem is called from bigcomp and */ /* the input is near, e.g., twice the smallest denormalized number. */ /*debug*/ if (q > 15) #endif /*debug*/ Bug("oversized quotient in quorem"); #endif if (q) { borrow = 0; carry = 0; do { #ifdef ULLong ys = *sx++ * (ULLong)q + carry; carry = ys >> 32; y = *bx - (ys & FFFFFFFF) - borrow; borrow = y >> 32 & (ULong)1; *bx++ = y & FFFFFFFF; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) * q + carry; zs = (si >> 16) * q + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ * q + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); if (!*bxe) { bx = b->x; while(--bxe > bx && !*bxe) --n; b->wds = n; } } if (cmp(b, S) >= 0) { q++; borrow = 0; carry = 0; bx = b->x; sx = S->x; do { #ifdef ULLong ys = *sx++ + carry; carry = ys >> 32; y = *bx - (ys & FFFFFFFF) - borrow; borrow = y >> 32 & (ULong)1; *bx++ = y & FFFFFFFF; #else #ifdef Pack_32 si = *sx++; ys = (si & 0xffff) + carry; zs = (si >> 16) + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; z = (*bx >> 16) - (zs & 0xffff) - borrow; borrow = (z & 0x10000) >> 16; Storeinc(bx, z, y); #else ys = *sx++ + carry; carry = ys >> 16; y = *bx - (ys & 0xffff) - borrow; borrow = (y & 0x10000) >> 16; *bx++ = y & 0xffff; #endif #endif } while(sx <= sxe); bx = b->x; bxe = bx + n; if (!*bxe) { while(--bxe > bx && !*bxe) --n; b->wds = n; } } return q; } #if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/ static double sulp #ifdef KR_headers (x, bc) U *x; BCinfo *bc; #else (U *x, BCinfo *bc) #endif { U u; double rv; int i; rv = ulp(x); if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0) return rv; /* Is there an example where i <= 0 ? */ word0(&u) = Exp_1 + (i << Exp_shift); word1(&u) = 0; return rv * u.d; } #endif /*}*/ #ifndef NO_STRTOD_BIGCOMP static void bigcomp #ifdef KR_headers (rv, s0, bc) U *rv; CONST char *s0; BCinfo *bc; #else (U *rv, const char *s0, BCinfo *bc) #endif { Bigint *b, *d; int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase; dsign = bc->dsign; nd = bc->nd; nd0 = bc->nd0; p5 = nd + bc->e0 - 1; speccase = 0; #ifndef Sudden_Underflow if (rv->d == 0.) { /* special case: value near underflow-to-zero */ /* threshold was rounded to zero */ b = i2b(1); p2 = Emin - P + 1; bbits = 1; #ifdef Avoid_Underflow word0(rv) = (P+2) << Exp_shift; #else word1(rv) = 1; #endif i = 0; #ifdef Honor_FLT_ROUNDS if (bc->rounding == 1) #endif { speccase = 1; --p2; dsign = 0; goto have_i; } } else #endif b = d2b(rv, &p2, &bbits); #ifdef Avoid_Underflow p2 -= bc->scale; #endif /* floor(log2(rv)) == bbits - 1 + p2 */ /* Check for denormal case. */ i = P - bbits; if (i > (j = P - Emin - 1 + p2)) { #ifdef Sudden_Underflow Bfree(b); b = i2b(1); p2 = Emin; i = P - 1; #ifdef Avoid_Underflow word0(rv) = (1 + bc->scale) << Exp_shift; #else word0(rv) = Exp_msk1; #endif word1(rv) = 0; #else i = j; #endif } #ifdef Honor_FLT_ROUNDS if (bc->rounding != 1) { if (i > 0) b = lshift(b, i); if (dsign) b = increment(b); } else #endif { b = lshift(b, ++i); b->x[0] |= 1; } #ifndef Sudden_Underflow have_i: #endif p2 -= p5 + i; d = i2b(1); /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. */ if (p5 > 0) d = pow5mult(d, p5); else if (p5 < 0) b = pow5mult(b, -p5); if (p2 > 0) { b2 = p2; d2 = 0; } else { b2 = 0; d2 = -p2; } i = dshift(d, d2); if ((b2 += i) > 0) b = lshift(b, b2); if ((d2 += i) > 0) d = lshift(d, d2); /* Now b/d = exactly half-way between the two floating-point values */ /* on either side of the input string. Compute first digit of b/d. */ if (!(dig = quorem(b,d))) { b = multadd(b, 10, 0); /* very unlikely */ dig = quorem(b,d); } /* Compare b/d with s0 */ for(i = 0; i < nd0; ) { if ((dd = s0[i++] - '0' - dig)) goto ret; if (!b->x[0] && b->wds == 1) { if (i < nd) dd = 1; goto ret; } b = multadd(b, 10, 0); dig = quorem(b,d); } for(j = bc->dp1; i++ < nd;) { if ((dd = s0[j++] - '0' - dig)) goto ret; if (!b->x[0] && b->wds == 1) { if (i < nd) dd = 1; goto ret; } b = multadd(b, 10, 0); dig = quorem(b,d); } if (dig > 0 || b->x[0] || b->wds > 1) dd = -1; ret: Bfree(b); Bfree(d); #ifdef Honor_FLT_ROUNDS if (bc->rounding != 1) { if (dd < 0) { if (bc->rounding == 0) { if (!dsign) goto retlow1; } else if (dsign) goto rethi1; } else if (dd > 0) { if (bc->rounding == 0) { if (dsign) goto rethi1; goto ret1; } if (!dsign) goto rethi1; dval(rv) += 2.*sulp(rv,bc); } else { bc->inexact = 0; if (dsign) goto rethi1; } } else #endif if (speccase) { if (dd <= 0) rv->d = 0.; } else if (dd < 0) { if (!dsign) /* does not happen for round-near */ retlow1: dval(rv) -= sulp(rv,bc); } else if (dd > 0) { if (dsign) { rethi1: dval(rv) += sulp(rv,bc); } } else { /* Exact half-way case: apply round-even rule. */ if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) { i = 1 - j; if (i <= 31) { if (word1(rv) & (0x1 << i)) goto odd; } else if (word0(rv) & (0x1 << (i-32))) goto odd; } else if (word1(rv) & 1) { odd: if (dsign) goto rethi1; goto retlow1; } } #ifdef Honor_FLT_ROUNDS ret1: #endif return; } #endif /* NO_STRTOD_BIGCOMP */ double poly_strtod #ifdef KR_headers (s00, se) CONST char *s00; char **se; #else (const char *s00, char **se) #endif { int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1; int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign; CONST char *s, *s0, *s1; double aadj, aadj1; Long L; U aadj2, adj, rv, rv0; ULong y, z; BCinfo bc; Bigint *bb=0, *bb1, *bd=0, *bd0, *bs=0, *delta=0; #ifdef Avoid_Underflow ULong Lsb, Lsb1; #endif #ifdef SET_INEXACT int oldinexact; #endif #ifndef NO_STRTOD_BIGCOMP int req_bigcomp = 0; #endif #ifdef Honor_FLT_ROUNDS /*{*/ #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ bc.rounding = Flt_Rounds; #else /*}{*/ bc.rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: bc.rounding = 0; break; case FE_UPWARD: bc.rounding = 2; break; case FE_DOWNWARD: bc.rounding = 3; } #endif /*}}*/ #endif /*}*/ #ifdef USE_LOCALE CONST char *s2; #endif sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0; dval(&rv) = 0.; for(s = s00;;s++) switch(*s) { case '-': sign = 1; /* no break */ case '+': if (*++s) goto break2; /* no break */ case 0: goto ret0; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': continue; default: goto break2; } break2: if (*s == '0') { #ifndef NO_HEX_FP /*{*/ switch(s[1]) { case 'x': case 'X': #ifdef Honor_FLT_ROUNDS gethex(&s, &rv, bc.rounding, sign); #else gethex(&s, &rv, 1, sign); #endif goto ret; } #endif /*}*/ nz0 = 1; while(*++s == '0') ; if (!*s) goto ret; } s0 = s; y = z = 0; for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) if (nd < 9) y = 10*y + c - '0'; else if (nd < 16) z = 10*z + c - '0'; nd0 = nd; bc.dp0 = bc.dp1 = s - s0; for(s1 = s; s1 > s0 && *--s1 == '0'; ) ++nz1; #ifdef USE_LOCALE s1 = localeconv()->decimal_point; if (c == *s1) { c = '.'; if (*++s1) { s2 = s; for(;;) { if (*++s2 != *s1) { c = 0; break; } if (!*++s1) { s = s2; break; } } } } #endif if (c == '.') { c = *++s; bc.dp1 = s - s0; bc.dplen = bc.dp1 - bc.dp0; if (!nd) { for(; c == '0'; c = *++s) nz++; if (c > '0' && c <= '9') { bc.dp0 = s0 - s; bc.dp1 = bc.dp0 + bc.dplen; s0 = s; nf += nz; nz = 0; goto have_dig; } goto dig_done; } for(; c >= '0' && c <= '9'; c = *++s) { have_dig: nz++; if (c -= '0') { nf += nz; for(i = 1; i < nz; i++) if (nd++ < 9) y *= 10; else if (nd <= DBL_DIG + 1) z *= 10; if (nd++ < 9) y = 10*y + c; else if (nd <= DBL_DIG + 1) z = 10*z + c; nz = nz1 = 0; } } } dig_done: e = 0; if (c == 'e' || c == 'E') { if (!nd && !nz && !nz0) { goto ret0; } s00 = s; esign = 0; switch(c = *++s) { case '-': esign = 1; case '+': c = *++s; } if (c >= '0' && c <= '9') { while(c == '0') c = *++s; if (c > '0' && c <= '9') { L = c - '0'; s1 = s; while((c = *++s) >= '0' && c <= '9') L = 10*L + c - '0'; if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents * so large that e might overflow. */ e = 19999; /* safe for 16 bit ints */ else e = (int)L; if (esign) e = -e; } else e = 0; } else s = s00; } if (!nd) { if (!nz && !nz0) { #ifdef INFNAN_CHECK /* Check for Nan and Infinity */ if (!bc.dplen) switch(c) { case 'i': case 'I': if (match(&s,"nf")) { --s; if (!match(&s,"inity")) ++s; word0(&rv) = 0x7ff00000; word1(&rv) = 0; goto ret; } break; case 'n': case 'N': if (match(&s, "an")) { word0(&rv) = NAN_WORD0; word1(&rv) = NAN_WORD1; #ifndef No_Hex_NaN if (*s == '(') /*)*/ hexnan(&rv, &s); #endif goto ret; } } #endif /* INFNAN_CHECK */ ret0: s = s00; sign = 0; } goto ret; } bc.e0 = e1 = e -= nf; /* Now we have nd0 digits, starting at s0, followed by a * decimal point, followed by nd-nd0 digits. The number we're * after is the integer represented by those digits times * 10**e */ if (!nd0) nd0 = nd; k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; dval(&rv) = y; if (k > 9) { #ifdef SET_INEXACT if (k > DBL_DIG) oldinexact = get_inexact(); #endif dval(&rv) = tens[k - 9] * dval(&rv) + z; } bd0 = 0; if (nd <= DBL_DIG #ifndef RND_PRODQUOT #ifndef Honor_FLT_ROUNDS && Flt_Rounds == 1 #endif #endif ) { if (!e) goto ret; #ifndef ROUND_BIASED_without_Round_Up if (e > 0) { if (e <= Ten_pmax) { #ifdef VAX goto vax_ovfl_check; #else #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif /* rv = */ rounded_product(dval(&rv), tens[e]); goto ret; #endif } i = DBL_DIG - nd; if (e <= Ten_pmax + i) { /* A fancier test would sometimes let us do * this for larger i values. */ #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif e -= i; dval(&rv) *= tens[i]; #ifdef VAX /* VAX exponent range is so narrow we must * worry about overflow here... */ vax_ovfl_check: word0(&rv) -= P*Exp_msk1; /* rv = */ rounded_product(dval(&rv), tens[e]); if ((word0(&rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) goto ovfl; word0(&rv) += P*Exp_msk1; #else /* rv = */ rounded_product(dval(&rv), tens[e]); #endif goto ret; } } #ifndef Inaccurate_Divide else if (e >= -Ten_pmax) { #ifdef Honor_FLT_ROUNDS /* round correctly FLT_ROUNDS = 2 or 3 */ if (sign) { rv.d = -rv.d; sign = 0; } #endif /* rv = */ rounded_quotient(dval(&rv), tens[-e]); goto ret; } #endif #endif /* ROUND_BIASED_without_Round_Up */ } e1 += nd - k; #ifdef IEEE_Arith #ifdef SET_INEXACT bc.inexact = 1; if (k <= DBL_DIG) oldinexact = get_inexact(); #endif #ifdef Avoid_Underflow bc.scale = 0; #endif #ifdef Honor_FLT_ROUNDS if (bc.rounding >= 2) { if (sign) bc.rounding = bc.rounding == 2 ? 0 : 2; else if (bc.rounding != 2) bc.rounding = 0; } #endif #endif /*IEEE_Arith*/ /* Get starting approximation = rv * 10**e1 */ if (e1 > 0) { if ((i = e1 & 15)) dval(&rv) *= tens[i]; if (e1 &= ~15) { if (e1 > DBL_MAX_10_EXP) { ovfl: /* Can't trust HUGE_VAL */ #ifdef IEEE_Arith #ifdef Honor_FLT_ROUNDS switch(bc.rounding) { case 0: /* toward 0 */ case 3: /* toward -infinity */ word0(&rv) = Big0; word1(&rv) = Big1; break; default: word0(&rv) = Exp_mask; word1(&rv) = 0; } #else /*Honor_FLT_ROUNDS*/ word0(&rv) = Exp_mask; word1(&rv) = 0; #endif /*Honor_FLT_ROUNDS*/ #ifdef SET_INEXACT /* set overflow bit */ dval(&rv0) = 1e300; dval(&rv0) *= dval(&rv0); #endif #else /*IEEE_Arith*/ word0(&rv) = Big0; word1(&rv) = Big1; #endif /*IEEE_Arith*/ range_err: if (bd0) { Bfree(bb); Bfree(bd); Bfree(bs); Bfree(bd0); Bfree(delta); } #ifndef NO_ERRNO errno = ERANGE; #endif goto ret; } e1 >>= 4; for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= bigtens[j]; /* The last multiplication could overflow. */ word0(&rv) -= P*Exp_msk1; dval(&rv) *= bigtens[j]; if ((z = word0(&rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-P)) goto ovfl; if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { /* set to largest number */ /* (Can't trust DBL_MAX) */ word0(&rv) = Big0; word1(&rv) = Big1; } else word0(&rv) += P*Exp_msk1; } } else if (e1 < 0) { e1 = -e1; if ((i = e1 & 15)) dval(&rv) /= tens[i]; if (e1 >>= 4) { if (e1 >= 1 << n_bigtens) goto undfl; #ifdef Avoid_Underflow if (e1 & Scale_Bit) bc.scale = 2*P; for(j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= tinytens[j]; if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) { /* scaled rv is denormal; clear j low bits */ if (j >= 32) { if (j > 54) goto undfl; word1(&rv) = 0; if (j >= 53) word0(&rv) = (P+2)*Exp_msk1; else word0(&rv) &= 0xffffffff << (j-32); } else word1(&rv) &= 0xffffffff << j; } #else for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) dval(&rv) *= tinytens[j]; /* The last multiplication could underflow. */ dval(&rv0) = dval(&rv); dval(&rv) *= tinytens[j]; if (!dval(&rv)) { dval(&rv) = 2.*dval(&rv0); dval(&rv) *= tinytens[j]; #endif if (!dval(&rv)) { undfl: dval(&rv) = 0.; goto range_err; } #ifndef Avoid_Underflow word0(&rv) = Tiny0; word1(&rv) = Tiny1; /* The refinement below will clean * this approximation up. */ } #endif } } /* Now the hard part -- adjusting rv to the correct value.*/ /* Put digits into bd: true value = bd * 10^e */ bc.nd = nd - nz1; #ifndef NO_STRTOD_BIGCOMP bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */ /* to silence an erroneous warning about bc.nd0 */ /* possibly not being initialized. */ if (nd > strtod_diglim) { /* ASSERT(strtod_diglim >= 18); 18 == one more than the */ /* minimum number of decimal digits to distinguish double values */ /* in IEEE arithmetic. */ i = j = 18; if (i > nd0) j += bc.dplen; for(;;) { if (--j < bc.dp1 && j >= bc.dp0) j = bc.dp0 - 1; if (s0[j] != '0') break; --i; } e += nd - i; nd = i; if (nd0 > nd) nd0 = nd; if (nd < 9) { /* must recompute y */ y = 0; for(i = 0; i < nd0; ++i) y = 10*y + s0[i] - '0'; for(j = bc.dp1; i < nd; ++i) y = 10*y + s0[j++] - '0'; } } #endif bd0 = s2b(s0, nd0, nd, y, bc.dplen); for(;;) { bd = Balloc(bd0->k); Bcopy(bd, bd0); bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ bs = i2b(1); if (e >= 0) { bb2 = bb5 = 0; bd2 = bd5 = e; } else { bb2 = bb5 = -e; bd2 = bd5 = 0; } if (bbe >= 0) bb2 += bbe; else bd2 -= bbe; bs2 = bb2; #ifdef Honor_FLT_ROUNDS if (bc.rounding != 1) bs2++; #endif #ifdef Avoid_Underflow Lsb = LSB; Lsb1 = 0; j = bbe - bc.scale; i = j + bbbits - 1; /* logb(rv) */ j = P + 1 - bbbits; if (i < Emin) { /* denormal */ i = Emin - i; j -= i; if (i < 32) Lsb <<= i; else if (i < 52) Lsb1 = Lsb << (i-32); else Lsb1 = Exp_mask; } #else /*Avoid_Underflow*/ #ifdef Sudden_Underflow #ifdef IBM j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); #else j = P + 1 - bbbits; #endif #else /*Sudden_Underflow*/ j = bbe; i = j + bbbits - 1; /* logb(rv) */ if (i < Emin) /* denormal */ j += P - Emin; else j = P + 1 - bbbits; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ bb2 += j; bd2 += j; #ifdef Avoid_Underflow bd2 += bc.scale; #endif i = bb2 < bd2 ? bb2 : bd2; if (i > bs2) i = bs2; if (i > 0) { bb2 -= i; bd2 -= i; bs2 -= i; } if (bb5 > 0) { bs = pow5mult(bs, bb5); bb1 = mult(bs, bb); Bfree(bb); bb = bb1; } if (bb2 > 0) bb = lshift(bb, bb2); if (bd5 > 0) bd = pow5mult(bd, bd5); if (bd2 > 0) bd = lshift(bd, bd2); if (bs2 > 0) bs = lshift(bs, bs2); delta = diff(bb, bd); bc.dsign = delta->sign; delta->sign = 0; i = cmp(delta, bs); #ifndef NO_STRTOD_BIGCOMP /*{*/ if (bc.nd > nd && i <= 0) { if (bc.dsign) { /* Must use bigcomp(). */ req_bigcomp = 1; break; } #ifdef Honor_FLT_ROUNDS if (bc.rounding != 1) { if (i < 0) { req_bigcomp = 1; break; } } else #endif i = -1; /* Discarded digits make delta smaller. */ } #endif /*}*/ #ifdef Honor_FLT_ROUNDS /*{*/ if (bc.rounding != 1) { if (i < 0) { /* Error is less than an ulp */ if (!delta->x[0] && delta->wds <= 1) { /* exact */ #ifdef SET_INEXACT bc.inexact = 0; #endif break; } if (bc.rounding) { if (bc.dsign) { adj.d = 1.; goto apply_adj; } } else if (!bc.dsign) { adj.d = -1.; if (!word1(&rv) && !(word0(&rv) & Frac_mask)) { y = word0(&rv) & Exp_mask; #ifdef Avoid_Underflow if (!bc.scale || y > 2*P*Exp_msk1) #else if (y) #endif { delta = lshift(delta,Log2P); if (cmp(delta, bs) <= 0) adj.d = -0.5; } } apply_adj: #ifdef Avoid_Underflow /*{*/ if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) word0(&adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { word0(&rv) += P*Exp_msk1; dval(&rv) += adj.d*ulp(dval(&rv)); word0(&rv) -= P*Exp_msk1; } else #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow}*/ dval(&rv) += adj.d*ulp(&rv); } break; } adj.d = ratio(delta, bs); if (adj.d < 1.) adj.d = 1.; if (adj.d <= 0x7ffffffe) { /* adj = rounding ? ceil(adj) : floor(adj); */ y = adj.d; if (y != adj.d) { if (!((bc.rounding>>1) ^ bc.dsign)) y++; adj.d = y; } } #ifdef Avoid_Underflow /*{*/ if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) word0(&adj) += (2*P+1)*Exp_msk1 - y; #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { word0(&rv) += P*Exp_msk1; adj.d *= ulp(dval(&rv)); if (bc.dsign) dval(&rv) += adj.d; else dval(&rv) -= adj.d; word0(&rv) -= P*Exp_msk1; goto cont; } #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow}*/ adj.d *= ulp(&rv); if (bc.dsign) { if (word0(&rv) == Big0 && word1(&rv) == Big1) goto ovfl; dval(&rv) += adj.d; } else dval(&rv) -= adj.d; goto cont; } #endif /*}Honor_FLT_ROUNDS*/ if (i < 0) { /* Error is less than half an ulp -- check for * special case of mantissa a power of two. */ if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask #ifdef IEEE_Arith /*{*/ #ifdef Avoid_Underflow || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1 #else || (word0(&rv) & Exp_mask) <= Exp_msk1 #endif #endif /*}*/ ) { #ifdef SET_INEXACT if (!delta->x[0] && delta->wds <= 1) bc.inexact = 0; #endif break; } if (!delta->x[0] && delta->wds <= 1) { /* exact result */ #ifdef SET_INEXACT bc.inexact = 0; #endif break; } delta = lshift(delta,Log2P); if (cmp(delta, bs) > 0) goto drop_down; break; } if (i == 0) { /* exactly half-way between */ if (bc.dsign) { if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 && word1(&rv) == ( #ifdef Avoid_Underflow (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1) ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : #endif 0xffffffff)) { /*boundary case -- increment exponent*/ if (word0(&rv) == Big0 && word1(&rv) == Big1) goto ovfl; word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1 #ifdef IBM | Exp_msk1 >> 4 #endif ; word1(&rv) = 0; #ifdef Avoid_Underflow bc.dsign = 0; #endif break; } } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { drop_down: /* boundary case -- decrement exponent */ #ifdef Sudden_Underflow /*{{*/ L = word0(&rv) & Exp_mask; #ifdef IBM if (L < Exp_msk1) #else #ifdef Avoid_Underflow if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) #else if (L <= Exp_msk1) #endif /*Avoid_Underflow*/ #endif /*IBM*/ { if (bc.nd >nd) { bc.uflchk = 1; break; } goto undfl; } L -= Exp_msk1; #else /*Sudden_Underflow}{*/ #ifdef Avoid_Underflow if (bc.scale) { L = word0(&rv) & Exp_mask; if (L <= (2*P+1)*Exp_msk1) { if (L > (P+2)*Exp_msk1) /* round even ==> */ /* accept rv */ break; /* rv = smallest denormal */ if (bc.nd >nd) { bc.uflchk = 1; break; } goto undfl; } } #endif /*Avoid_Underflow*/ L = (word0(&rv) & Exp_mask) - Exp_msk1; #endif /*Sudden_Underflow}}*/ word0(&rv) = L | Bndry_mask1; word1(&rv) = 0xffffffff; #ifdef IBM goto cont; #else #ifndef NO_STRTOD_BIGCOMP if (bc.nd > nd) goto cont; #endif break; #endif } #ifndef ROUND_BIASED #ifdef Avoid_Underflow if (Lsb1) { if (!(word0(&rv) & Lsb1)) break; } else if (!(word1(&rv) & Lsb)) break; #else if (!(word1(&rv) & LSB)) break; #endif #endif if (bc.dsign) #ifdef Avoid_Underflow dval(&rv) += sulp(&rv, &bc); #else dval(&rv) += ulp(&rv); #endif #ifndef ROUND_BIASED else { #ifdef Avoid_Underflow dval(&rv) -= sulp(&rv, &bc); #else dval(&rv) -= ulp(&rv); #endif #ifndef Sudden_Underflow if (!dval(&rv)) { if (bc.nd >nd) { bc.uflchk = 1; break; } goto undfl; } #endif } #ifdef Avoid_Underflow bc.dsign = 1 - bc.dsign; #endif #endif break; } if ((aadj = ratio(delta, bs)) <= 2.) { if (bc.dsign) aadj = aadj1 = 1.; else if (word1(&rv) || word0(&rv) & Bndry_mask) { #ifndef Sudden_Underflow if (word1(&rv) == Tiny1 && !word0(&rv)) { if (bc.nd >nd) { bc.uflchk = 1; break; } goto undfl; } #endif aadj = 1.; aadj1 = -1.; } else { /* special case -- power of FLT_RADIX to be */ /* rounded down... */ if (aadj < 2./FLT_RADIX) aadj = 1./FLT_RADIX; else aadj *= 0.5; aadj1 = -aadj; } } else { aadj *= 0.5; aadj1 = bc.dsign ? aadj : -aadj; #ifdef Check_FLT_ROUNDS switch(bc.rounding) { case 2: /* towards +infinity */ aadj1 -= 0.5; break; case 0: /* towards 0 */ case 3: /* towards -infinity */ aadj1 += 0.5; } #else if (Flt_Rounds == 0) aadj1 += 0.5; #endif /*Check_FLT_ROUNDS*/ } y = word0(&rv) & Exp_mask; /* Check for overflow */ if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { dval(&rv0) = dval(&rv); word0(&rv) -= P*Exp_msk1; adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; if ((word0(&rv) & Exp_mask) >= Exp_msk1*(DBL_MAX_EXP+Bias-P)) { if (word0(&rv0) == Big0 && word1(&rv0) == Big1) goto ovfl; word0(&rv) = Big0; word1(&rv) = Big1; goto cont; } else word0(&rv) += P*Exp_msk1; } else { #ifdef Avoid_Underflow if (bc.scale && y <= 2*P*Exp_msk1) { if (aadj <= 0x7fffffff) { if ((z = aadj) <= 0) z = 1; aadj = z; aadj1 = bc.dsign ? aadj : -aadj; } dval(&aadj2) = aadj1; word0(&aadj2) += (2*P+1)*Exp_msk1 - y; aadj1 = dval(&aadj2); adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; if (rv.d == 0.) #ifdef NO_STRTOD_BIGCOMP goto undfl; #else { if (bc.nd > nd) bc.dsign = 1; break; } #endif } else { adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; } #else #ifdef Sudden_Underflow if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) { dval(&rv0) = dval(&rv); word0(&rv) += P*Exp_msk1; adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; #ifdef IBM if ((word0(&rv) & Exp_mask) < P*Exp_msk1) #else if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) #endif { if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1) { if (bc.nd >nd) { bc.uflchk = 1; break; } goto undfl; } word0(&rv) = Tiny0; word1(&rv) = Tiny1; goto cont; } else word0(&rv) -= P*Exp_msk1; } else { adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; } #else /*Sudden_Underflow*/ /* Compute adj so that the IEEE rounding rules will * correctly round rv + adj in some half-way cases. * If rv * ulp(rv) is denormalized (i.e., * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid * trouble from bits lost to denormalization; * example: 1.2e-307 . */ if (y <= (P-1)*Exp_msk1 && aadj > 1.) { aadj1 = (double)(int)(aadj + 0.5); if (!bc.dsign) aadj1 = -aadj1; } adj.d = aadj1 * ulp(&rv); dval(&rv) += adj.d; #endif /*Sudden_Underflow*/ #endif /*Avoid_Underflow*/ } z = word0(&rv) & Exp_mask; #ifndef SET_INEXACT if (bc.nd == nd) { #ifdef Avoid_Underflow if (!bc.scale) #endif if (y == z) { /* Can we stop now? */ L = (Long)aadj; aadj -= L; /* The tolerances below are conservative. */ if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) { if (aadj < .4999999 || aadj > .5000001) break; } else if (aadj < .4999999/FLT_RADIX) break; } } #endif cont: Bfree(bb); Bfree(bd); Bfree(bs); Bfree(delta); } Bfree(bb); Bfree(bd); Bfree(bs); Bfree(bd0); Bfree(delta); #ifndef NO_STRTOD_BIGCOMP if (req_bigcomp) { bd0 = 0; bc.e0 += nz1; bigcomp(&rv, s0, &bc); y = word0(&rv) & Exp_mask; if (y == Exp_mask) goto ovfl; if (y == 0 && rv.d == 0.) goto undfl; } #endif #ifdef SET_INEXACT if (bc.inexact) { if (!oldinexact) { word0(&rv0) = Exp_1 + (70 << Exp_shift); word1(&rv0) = 0; dval(&rv0) += 1.; } } else if (!oldinexact) clear_inexact(); #endif #ifdef Avoid_Underflow if (bc.scale) { word0(&rv0) = Exp_1 - 2*P*Exp_msk1; word1(&rv0) = 0; dval(&rv) *= dval(&rv0); #ifndef NO_ERRNO /* try to avoid the bug of testing an 8087 register value */ #ifdef IEEE_Arith if (!(word0(&rv) & Exp_mask)) #else if (word0(&rv) == 0 && word1(&rv) == 0) #endif errno = ERANGE; #endif } #endif /* Avoid_Underflow */ #ifdef SET_INEXACT if (bc.inexact && !(word0(&rv) & Exp_mask)) { /* set underflow bit */ dval(&rv0) = 1e-300; dval(&rv0) *= dval(&rv0); } #endif ret: if (se) *se = (char *)s; return sign ? -dval(&rv) : dval(&rv); } #ifndef MULTIPLE_THREADS static char *dtoa_result; #endif static char * #ifdef KR_headers rv_alloc(i) int i; #else rv_alloc(int i) #endif { int j, k, *r; j = sizeof(ULong); for(k = 0; sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; j <<= 1) k++; r = (int*)Balloc(k); *r = k; return #ifndef MULTIPLE_THREADS dtoa_result = #endif (char *)(r+1); } static char * #ifdef KR_headers nrv_alloc(s, rve, n) char *s, **rve; int n; #else nrv_alloc(const char *s, char **rve, int n) #endif { char *rv, *t; t = rv = rv_alloc(n); while((*t = *s++)) t++; if (rve) *rve = t; return rv; } /* freedtoa(s) must be used to free values s returned by dtoa * when MULTIPLE_THREADS is #defined. It should be used in all cases, * but for consistency with earlier versions of dtoa, it is optional * when MULTIPLE_THREADS is not defined. */ void #ifdef KR_headers poly_freedtoa(s) char *s; #else poly_freedtoa(char *s) #endif { Bigint *b = (Bigint *)((int *)s - 1); b->maxwds = 1 << (b->k = *(int*)b); Bfree(b); #ifndef MULTIPLE_THREADS if (s == dtoa_result) dtoa_result = 0; #endif } /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. * * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. * * Modifications: * 1. Rather than iterating, we use a simple numeric overestimate * to determine k = floor(log10(d)). We scale relevant * quantities using O(log2(k)) rather than O(k) multiplications. * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't * try to generate digits strictly left to right. Instead, we * compute with fewer bits and propagate the carry if necessary * when rounding the final digit up. This is often faster. * 3. Under the assumption that input will be rounded nearest, * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. * That is, we allow equality in stopping tests when the * round-nearest rule will give the same floating-point value * as would satisfaction of the stopping test with strict * inequality. * 4. We remove common factors of powers of 2 from relevant * quantities. * 5. When converting floating-point integers less than 1e16, * we use floating-point arithmetic rather than resorting * to multiple-precision integers. * 6. When asked to produce fewer than 15 digits, we first try * to get by with floating-point arithmetic; we resort to * multiple-precision integer arithmetic only if we cannot * guarantee that the floating-point calculation has given * the correctly rounded result. For k requested digits and * "uniformly" distributed input, the probability is * something like 10^(k-15) that we must resort to the Long * calculation. */ char * poly_dtoa #ifdef KR_headers (dd, mode, ndigits, decpt, sign, rve) double dd; int mode, ndigits, *decpt, *sign; char **rve; #else (double dd, int mode, int ndigits, int *decpt, int *sign, char **rve) #endif { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives 1e23 whereas mode 1 gives 9.999999999999999e22. 2 ==> max(1,ndigits) significant digits. This gives a return value similar to that of ecvt, except that trailing zeros are suppressed. 3 ==> through ndigits past the decimal point. This gives a return value similar to that from fcvt, except that trailing zeros are suppressed, and ndigits can be negative. 4,5 ==> similar to 2 and 3, respectively, but (in round-nearest mode) with the tests of mode 0 to possibly return a shorter string that rounds to d. With IEEE arithmetic and compilation with -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same as modes 2 and 3 when FLT_ROUNDS != 1. 6-9 ==> Debugging modes similar to mode - 4: don't try fast floating-point estimate (if applicable). Values of mode other than 0-9 are treated as mode 0. Sufficient space is allocated to the return value to hold the suppressed trailing zeros. */ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, spec_case, try_quick; Long L; #ifndef Sudden_Underflow int denorm; ULong x; #endif Bigint *b, *b1, *delta, *mlo=0, *mhi, *S; U d2, eps, u; double ds; char *s, *s0; #ifndef No_leftright #ifdef IEEE_Arith U eps1; #endif #endif #ifdef SET_INEXACT int inexact, oldinexact; #endif #ifdef Honor_FLT_ROUNDS /*{*/ int Rounding; #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ Rounding = Flt_Rounds; #else /*}{*/ Rounding = 1; switch(fegetround()) { case FE_TOWARDZERO: Rounding = 0; break; case FE_UPWARD: Rounding = 2; break; case FE_DOWNWARD: Rounding = 3; } #endif /*}}*/ #endif /*}*/ #ifndef MULTIPLE_THREADS if (dtoa_result) { freedtoa(dtoa_result); dtoa_result = 0; } #endif u.d = dd; if (word0(&u) & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; word0(&u) &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; #if defined(IEEE_Arith) + defined(VAX) #ifdef IEEE_Arith if ((word0(&u) & Exp_mask) == Exp_mask) #else if (word0(&u) == 0x8000) #endif { /* Infinity or NaN */ *decpt = 9999; #ifdef IEEE_Arith if (!word1(&u) && !(word0(&u) & 0xfffff)) return nrv_alloc("Infinity", rve, 8); #endif return nrv_alloc("NaN", rve, 3); } #endif #ifdef IBM dval(&u) += 0; /* normalize */ #endif if (!dval(&u)) { *decpt = 1; return nrv_alloc("0", rve, 1); } #ifdef SET_INEXACT try_quick = oldinexact = get_inexact(); inexact = 1; #endif #ifdef Honor_FLT_ROUNDS if (Rounding >= 2) { if (*sign) Rounding = Rounding == 2 ? 0 : 2; else if (Rounding != 2) Rounding = 0; } #endif b = d2b(&u, &be, &bbits); #ifdef Sudden_Underflow i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); #else if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) { #endif dval(&d2) = dval(&u); word0(&d2) &= Frac_mask1; word0(&d2) |= Exp_11; #ifdef IBM if (j = 11 - hi0bits(word0(&d2) & Frac_mask)) dval(&d2) /= 1 << j; #endif /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) * * This suggests computing an approximation k to log10(d) by * * k = (i - Bias)*0.301029995663981 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); * * We want k to be too large rather than too small. * The error in the first-order Taylor series approximation * is in our favor, so we just round up the constant enough * to compensate for any error in the multiplication of * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, * adding 1e-13 to the constant term more than suffices. * Hence we adjust the constant term to 0.1760912590558. * (We could get a more accurate k by invoking log10, * but this is probably not worthwhile.) */ i -= Bias; #ifdef IBM i <<= 2; i += j; #endif #ifndef Sudden_Underflow denorm = 0; } else { /* d is denormalized */ i = bbits + be + (Bias + (P-1) - 1); x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32) : word1(&u) << (32 - i); dval(&d2) = x; word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ i -= (Bias + (P-1) - 1) + 1; denorm = 1; } #endif ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; k = (int)ds; if (ds < 0. && ds != k) k--; /* want k = floor(ds) */ k_check = 1; if (k >= 0 && k <= Ten_pmax) { if (dval(&u) < tens[k]) k--; k_check = 0; } j = bbits - i - 1; if (j >= 0) { b2 = 0; s2 = j; } else { b2 = -j; s2 = 0; } if (k >= 0) { b5 = 0; s5 = k; s2 += k; } else { b2 -= k; b5 = -k; s5 = 0; } if (mode < 0 || mode > 9) mode = 0; #ifndef SET_INEXACT #ifdef Check_FLT_ROUNDS try_quick = Rounding == 1; #else try_quick = 1; #endif #endif /*SET_INEXACT*/ if (mode > 5) { mode -= 4; try_quick = 0; } leftright = 1; ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ /* silence erroneous "gcc -Wall" warning. */ switch(mode) { case 0: case 1: i = 18; ndigits = 0; break; case 2: leftright = 0; /* no break */ case 4: if (ndigits <= 0) ndigits = 1; ilim = ilim1 = i = ndigits; break; case 3: leftright = 0; /* no break */ case 5: i = ndigits + k + 1; ilim = i; ilim1 = i - 1; if (i <= 0) i = 1; } s = s0 = rv_alloc(i); #ifdef Honor_FLT_ROUNDS if (mode > 1 && Rounding != 1) leftright = 0; #endif if (ilim >= 0 && ilim <= Quick_max && try_quick) { /* Try to get by with floating-point arithmetic. */ i = 0; dval(&d2) = dval(&u); k0 = k; ilim0 = ilim; ieps = 2; /* conservative */ if (k > 0) { ds = tens[k&0xf]; j = k >> 4; if (j & Bletch) { /* prevent overflows */ j &= Bletch - 1; dval(&u) /= bigtens[n_bigtens-1]; ieps++; } for(; j; j >>= 1, i++) if (j & 1) { ieps++; ds *= bigtens[i]; } dval(&u) /= ds; } else if ((j1 = -k)) { dval(&u) *= tens[j1 & 0xf]; for(j = j1 >> 4; j; j >>= 1, i++) if (j & 1) { ieps++; dval(&u) *= bigtens[i]; } } if (k_check && dval(&u) < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; dval(&u) *= 10.; ieps++; } dval(&eps) = ieps*dval(&u) + 7.; word0(&eps) -= (P-1)*Exp_msk1; if (ilim == 0) { S = mhi = 0; dval(&u) -= 5.; if (dval(&u) > dval(&eps)) goto one_digit; if (dval(&u) < -dval(&eps)) goto no_digits; goto fast_failed; } #ifndef No_leftright if (leftright) { /* Use Steele & White method of only * generating digits needed. */ dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); #ifdef IEEE_Arith if (k0 < 0 && j1 >= 307) { eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */ word0(&eps1) -= Exp_msk1 * (Bias+P-1); dval(&eps1) *= tens[j1 & 0xf]; for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++) if (j & 1) dval(&eps1) *= bigtens[i]; if (eps.d < eps1.d) eps.d = eps1.d; } #endif for(i = 0;;) { L = dval(&u); dval(&u) -= L; *s++ = '0' + (int)L; if (1. - dval(&u) < dval(&eps)) goto bump_up; if (dval(&u) < dval(&eps)) goto ret1; if (++i >= ilim) break; dval(&eps) *= 10.; dval(&u) *= 10.; } } else { #endif /* Generate ilim digits, then fix them up. */ dval(&eps) *= tens[ilim-1]; for(i = 1;; i++, dval(&u) *= 10.) { L = (Long)(dval(&u)); if (!(dval(&u) -= L)) ilim = i; *s++ = '0' + (int)L; if (i == ilim) { if (dval(&u) > 0.5 + dval(&eps)) goto bump_up; else if (dval(&u) < 0.5 - dval(&eps)) { while(*--s == '0'); s++; goto ret1; } break; } } #ifndef No_leftright } #endif fast_failed: s = s0; dval(&u) = dval(&d2); k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= Int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || dval(&u) <= 5*ds) goto no_digits; goto one_digit; } for(i = 1;; i++, dval(&u) *= 10.) { L = (Long)(dval(&u) / ds); dval(&u) -= L*ds; #ifdef Check_FLT_ROUNDS /* If FLT_ROUNDS == 2, L will usually be high by 1 */ if (dval(&u) < 0) { L--; dval(&u) += ds; } #endif *s++ = '0' + (int)L; if (!dval(&u)) { #ifdef SET_INEXACT inexact = 0; #endif break; } if (i == ilim) { #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(Rounding) { case 0: goto ret1; case 2: goto bump_up; } #endif dval(&u) += dval(&u); #ifdef ROUND_BIASED if (dval(&u) >= ds) #else if (dval(&u) > ds || (dval(&u) == ds && L & 1)) #endif { bump_up: while(*--s == '9') if (s == s0) { k++; *s = '0'; break; } ++*s++; } break; } } goto ret1; } m2 = b2; m5 = b5; mhi = mlo = 0; if (leftright) { i = #ifndef Sudden_Underflow denorm ? be + (Bias + (P-1) - 1 + 1) : #endif #ifdef IBM 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); #else 1 + P - bbits; #endif b2 += i; s2 += i; mhi = i2b(1); } if (m2 > 0 && s2 > 0) { i = m2 < s2 ? m2 : s2; b2 -= i; m2 -= i; s2 -= i; } if (b5 > 0) { if (leftright) { if (m5 > 0) { mhi = pow5mult(mhi, m5); b1 = mult(mhi, b); Bfree(b); b = b1; } if ((j = b5 - m5)) b = pow5mult(b, j); } else b = pow5mult(b, b5); } S = i2b(1); if (s5 > 0) S = pow5mult(S, s5); /* Check for special case that d is a normalized power of 2. */ spec_case = 0; if ((mode < 2 || leftright) #ifdef Honor_FLT_ROUNDS && Rounding == 1 #endif ) { if (!word1(&u) && !(word0(&u) & Bndry_mask) #ifndef Sudden_Underflow && word0(&u) & (Exp_mask & ~Exp_msk1) #endif ) { /* The special case */ b2 += Log2P; s2 += Log2P; spec_case = 1; } } /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. * * Perhaps we should just compute leading 28 bits of S once * and for all and pass them and a shift to quorem, so it * can do shifts and ors to compute the numerator for q. */ i = dshift(S, s2); b2 += i; m2 += i; s2 += i; if (b2 > 0) b = lshift(b, b2); if (s2 > 0) S = lshift(S, s2); if (k_check) { if (cmp(b,S) < 0) { k--; b = multadd(b, 10, 0); /* we botched the k estimate */ if (leftright) mhi = multadd(mhi, 10, 0); ilim = ilim1; } } if (ilim <= 0 && (mode == 3 || mode == 5)) { if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { /* no digits, fcvt style */ no_digits: k = -1 - ndigits; goto ret; } one_digit: *s++ = '1'; k++; goto ret; } if (leftright) { if (m2 > 0) mhi = lshift(mhi, m2); /* Compute mlo -- check for special case * that d is a normalized power of 2. */ mlo = mhi; if (spec_case) { mhi = Balloc(mhi->k); Bcopy(mhi, mlo); mhi = lshift(mhi, Log2P); } for(i = 1;;i++) { dig = quorem(b,S) + '0'; /* Do we yet have the shortest decimal string * that will round to d? */ j = cmp(b, mlo); delta = diff(S, mhi); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta); #ifndef ROUND_BIASED if (j1 == 0 && mode != 1 && !(word1(&u) & 1) #ifdef Honor_FLT_ROUNDS && Rounding >= 1 #endif ) { if (dig == '9') goto round_9_up; if (j > 0) dig++; #ifdef SET_INEXACT else if (!b->x[0] && b->wds <= 1) inexact = 0; #endif *s++ = dig; goto ret; } #endif if (j < 0 || (j == 0 && mode != 1 #ifndef ROUND_BIASED && !(word1(&u) & 1) #endif )) { if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto accept_dig; } #ifdef Honor_FLT_ROUNDS if (mode > 1) switch(Rounding) { case 0: goto accept_dig; case 2: goto keep_dig; } #endif /*Honor_FLT_ROUNDS*/ if (j1 > 0) { b = lshift(b, 1); j1 = cmp(b, S); #ifdef ROUND_BIASED if (j1 >= 0 /*)*/ #else if ((j1 > 0 || (j1 == 0 && dig & 1)) #endif && dig++ == '9') goto round_9_up; } accept_dig: *s++ = dig; goto ret; } if (j1 > 0) { #ifdef Honor_FLT_ROUNDS if (!Rounding) goto accept_dig; #endif if (dig == '9') { /* possible if i == 1 */ round_9_up: *s++ = '9'; goto roundoff; } *s++ = dig + 1; goto ret; } #ifdef Honor_FLT_ROUNDS keep_dig: #endif *s++ = dig; if (i == ilim) break; b = multadd(b, 10, 0); if (mlo == mhi) mlo = mhi = multadd(mhi, 10, 0); else { mlo = multadd(mlo, 10, 0); mhi = multadd(mhi, 10, 0); } } } else for(i = 1;; i++) { *s++ = dig = quorem(b,S) + '0'; if (!b->x[0] && b->wds <= 1) { #ifdef SET_INEXACT inexact = 0; #endif goto ret; } if (i >= ilim) break; b = multadd(b, 10, 0); } /* Round off last digit */ #ifdef Honor_FLT_ROUNDS switch(Rounding) { case 0: goto trimzeros; case 2: goto roundoff; } #endif b = lshift(b, 1); j = cmp(b, S); #ifdef ROUND_BIASED if (j >= 0) #else if (j > 0 || (j == 0 && dig & 1)) #endif { roundoff: while(*--s == '9') if (s == s0) { k++; *s++ = '1'; goto ret; } ++*s++; } else { #ifdef Honor_FLT_ROUNDS trimzeros: #endif while(*--s == '0'); s++; } ret: Bfree(S); if (mhi) { if (mlo && mlo != mhi) Bfree(mlo); Bfree(mhi); } ret1: #ifdef SET_INEXACT if (inexact) { if (!oldinexact) { word0(&u) = Exp_1 + (70 << Exp_shift); word1(&u) = 0; dval(&u) += 1.; } } else if (!oldinexact) clear_inexact(); #endif Bfree(b); *s = 0; *decpt = k + 1; if (rve) *rve = s; return s0; } #ifdef __cplusplus } #endif polyml-5.6/libpolyml/realconv.h000066400000000000000000000023541265146633400167030ustar00rootroot00000000000000/* Title: Real number conversion Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef REALCONV_H #define REALCONV_H #ifdef __cplusplus extern "C" { #endif extern double poly_strtod(const char *s00, char **se); extern char *poly_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); extern void poly_freedtoa(char *s); #ifdef __cplusplus }; #endif #endif polyml-5.6/libpolyml/reals.cpp000066400000000000000000000605031265146633400165330ustar00rootroot00000000000000/* Title: Real number package. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000 Cambridge University Technical Services Limited Further work copyright David C.J. Matthews 2011 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_IEEEFP_H /* Other operating systems include "finite" in math.h, but Solaris doesn't? */ #include #endif #ifdef HAVE_FPU_CONTROL_H #include #endif #ifdef HAVE_FENV_H #include #endif #if (defined(_MSC_VER)) #define finite _finite #define isnan _isnan #define copysign _copysign #endif #ifdef HAVE_FLOAT_H #include #endif #ifdef HAVE_MATH_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STDINT_H #include #endif #include "globals.h" #include "run_time.h" #include "reals.h" #include "arb.h" #include "sys.h" #include "realconv.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "machine_dep.h" #include "processes.h" /* The Standard Basis Library assumes IEEE representation for reals. Among other things it does not permit equality on reals. That simplifies things considerably since we don't have to worry about there being two different representations of zero as 0 and ~0. We also don't need to check that the result is finite since NaN is allowed as a result. This code could do with being checked by someone who really understands IEEE floating point arithmetic. The original real number functions all had separate entries in the interface vector. Newly added functions all go through a single dispatch function. DCJM: March 2000. */ // Positive and negative infinities and (positive) NaN. double posInf, negInf, notANumber; /* Real numbers are represented by the address of the value. */ #define DBLE sizeof(double) union db { double dble; byte bytes[DBLE]; }; /* Assumes that there will be a separate handler for floating point overflow and underflow. */ /* tidied up 27/10/93 SPF */ /* can't assume (double *) has same alignment as (PolyWord *), so all the */ /* parameters should be passed in as a Handle, not (double **). */ double real_arg(Handle x) { union db r_arg_x; for (unsigned i = 0; i < DBLE; i++) { r_arg_x.bytes[i] = DEREFBYTEHANDLE(x)[i]; } return r_arg_x.dble; } Handle real_result(TaskData *mdTaskData, double x) { union db argx; argx.dble = x; PolyObject *v = alloc(mdTaskData, DBLE/sizeof(PolyWord), F_BYTE_OBJ); /* Copy as words in case the alignment is wrong. */ for(unsigned i = 0; i < DBLE; i++) { v->AsBytePtr()[i] = argx.bytes[i]; } return mdTaskData->saveVec.push(v); } /* CALL_IO2(Real_add, REF, REF, NOIND) */ Handle Real_addc(TaskData *mdTaskData, Handle y, Handle x) { return real_result(mdTaskData, real_arg(x)+real_arg(y)); } /* CALL_IO2(Real_sub, REF, REF, NOIND) */ Handle Real_subc(TaskData *mdTaskData, Handle y, Handle x) { return real_result(mdTaskData, real_arg(x)-real_arg(y)); } /* CALL_IO2(Real_mul, REF, REF, NOIND) */ Handle Real_mulc(TaskData *mdTaskData, Handle y, Handle x) { return real_result(mdTaskData, real_arg(x)*real_arg(y)); } /* CALL_IO2(Real_div, REF, REF, NOIND) */ Handle Real_divc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x); double dy = real_arg(y); return real_result(mdTaskData, dx/dy); } /* CALL_IO1(Real_abs, REF, NOIND) */ // This handles +/- NaN correctly. // TODO: That assumes that notANumber is positive which may not be true. Handle Real_absc(TaskData *mdTaskData, Handle x) { double dx = real_arg(x); if (isnan(dx)) return real_result(mdTaskData, notANumber); else return real_result(mdTaskData, fabs(real_arg(x))); } /* CALL_IO1(Real_neg, REF, NOIND) */ Handle Real_negc(TaskData *mdTaskData, Handle x) { return real_result(mdTaskData, -real_arg(x)); } /* The old Real_comp function isn't right for IEEE arithmetic. These functions were added to implement these correctly. On Windows, at any rate, the comparison operations do not necessarily return false on unordered arguments so we have to explicitly test for NaN. */ Handle Real_geqc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(0)); return mdTaskData->saveVec.push(dx >= dy ? TAGGED(1) : TAGGED(0)); } Handle Real_leqc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(0)); return mdTaskData->saveVec.push(dx <= dy ? TAGGED(1) : TAGGED(0)); } Handle Real_gtrc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(0)); return mdTaskData->saveVec.push(dx > dy ? TAGGED(1) : TAGGED(0)); } Handle Real_lssc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(0)); return mdTaskData->saveVec.push(dx < dy ? TAGGED(1) : TAGGED(0)); } Handle Real_eqc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(0)); return mdTaskData->saveVec.push(dx == dy ? TAGGED(1) : TAGGED(0)); } Handle Real_neqc(TaskData *mdTaskData, Handle y, Handle x) { double dx = real_arg(x), dy = real_arg(y); if (isnan(dx) || isnan(dy)) return mdTaskData->saveVec.push(TAGGED(1)); return mdTaskData->saveVec.push(dx != dy ? TAGGED(1) : TAGGED(0)); } /* CALL_IO1(Real_float, REF, NOIND) */ Handle Real_floatc(TaskData *mdTaskData, Handle x) /* SHORT int to real */ { double d = get_C_real(mdTaskData, DEREFWORDHANDLE(x)); return real_result(mdTaskData, d); } /* CALL_IO1(Real_int, REF, NOIND) */ // This previously always converted to a SHORT integer. Using // int64_t here means we will capture all the significant bits of // the mantissa. The calling code checks for infinities and NaNs // and reduces the exponent if it is too big to fit. Handle Real_intc(TaskData *mdTaskData, Handle x) { double dx = real_arg(x); int64_t i = (int64_t)dx; return Make_arbitrary_precision(mdTaskData, i); } /* CALL_IO1(Real_sqrt, REF, NOIND) */ Handle Real_sqrtc(TaskData *mdTaskData, Handle arg) { double dx = real_arg(arg); return real_result(mdTaskData, sqrt(dx)); } /* CALL_IO1(Real_sin, REF, NOIND) */ Handle Real_sinc(TaskData *mdTaskData, Handle arg) { return real_result(mdTaskData, sin(real_arg(arg))); } /* CALL_IO1(Real_cos, REF, NOIND) */ Handle Real_cosc(TaskData *mdTaskData, Handle arg) { return real_result(mdTaskData, cos(real_arg(arg))); } /* CALL_IO1(Real_arctan, REF, NOIND) */ Handle Real_arctanc(TaskData *mdTaskData, Handle arg) { return real_result(mdTaskData, atan(real_arg(arg))); } /* CALL_IO1(Real_exp, REF, NOIND) */ Handle Real_expc(TaskData *mdTaskData, Handle arg) { return real_result(mdTaskData, exp(real_arg(arg))); } /* CALL_IO1(Real_ln, REF, NOIND) */ Handle Real_lnc(TaskData *mdTaskData, Handle arg) { double x = real_arg(arg); /* Make sure the result conforms to the definition. */ if (x < 0.0) return real_result(mdTaskData, notANumber); /* Nan. */ else if (x == 0.0) /* x may be +0.0 or -0.0 */ return real_result(mdTaskData, negInf); /* -infinity. */ else return real_result(mdTaskData, log(x)); } /* CALL_IO1(Real_conv, REF, NOIND) */ Handle Real_convc(TaskData *mdTaskData, Handle str) /* string to real */ { double result; int i; char *finish; char *string_buffer = Poly_string_to_C_alloc(DEREFHANDLE(str)); /* Scan the string turning '~' into '-' */ for(i = 0; string_buffer[i] != '\0'; i ++) { if (string_buffer[i] == '~') string_buffer[i] = '-'; } /* Now convert it */ result = poly_strtod(string_buffer, &finish); bool isError = *finish != '\0'; // Test before deallocating free(string_buffer); // We no longer detect overflow and underflow and instead return // (signed) zeros for underflow and (signed) infinities for overflow. if (isError) raise_exception_string(mdTaskData, EXC_conversion, ""); return real_result(mdTaskData, result); }/* Real_conv */ static double real_arg1(Handle x) { union db r_arg_x; for(unsigned i = 0; i < DBLE; i++) { r_arg_x.bytes[i] = DEREFHANDLE(x)->Get(0).AsObjPtr()->AsBytePtr()[i]; } return r_arg_x.dble; } static double real_arg2(Handle x) { union db r_arg_x; for(unsigned i = 0; i < DBLE; i++) { r_arg_x.bytes[i] = DEREFHANDLE(x)->Get(1).AsObjPtr()->AsBytePtr()[i]; } return r_arg_x.dble; } static Handle powerOf(TaskData *mdTaskData, Handle args) { double x = real_arg1(args), y = real_arg2(args); /* Some of the special cases are defined and don't seem to match the C pow function (at least as implemented in MS C). */ /* Maybe handle all this in ML? */ if (isnan(x)) { if (y == 0.0) return real_result(mdTaskData, 1.0); else return real_result(mdTaskData, notANumber); } else if (isnan(y)) return real_result(mdTaskData, y); /* i.e. nan. */ else if (x == 0.0 && y < 0.0) { /* This case is not handled correctly in Solaris. It always returns -infinity. */ int iy = (int)floor(y); /* If x is -0.0 and y is an odd integer the result is -infinity. */ if (copysign(1.0, x) < 0.0 && (double)iy == y && (iy & 1)) return real_result(mdTaskData, negInf); /* -infinity. */ else return real_result(mdTaskData, posInf); /* +infinity. */ } return real_result(mdTaskData, pow(x, y)); } #define POLY_ROUND_TONEAREST 0 #define POLY_ROUND_DOWNWARD 1 #define POLY_ROUND_UPWARD 2 #define POLY_ROUND_TOZERO 3 // It would be nice to be able to use autoconf to test for these as functions // but they are frequently inlined #if defined(HAVE_FENV_H) // C99 version. This is becoming the most common. static int getrounding(TaskData *) { switch (fegetround()) { case FE_TONEAREST: return POLY_ROUND_TONEAREST; case FE_DOWNWARD: return POLY_ROUND_DOWNWARD; case FE_UPWARD: return POLY_ROUND_UPWARD; case FE_TOWARDZERO: return POLY_ROUND_TOZERO; } return 0; // Keep the compiler happy } static void setrounding(TaskData *taskData, Handle args) { switch (get_C_long(taskData, DEREFWORDHANDLE(args))) { case POLY_ROUND_TONEAREST: fesetround(FE_TONEAREST); break; // Choose nearest case POLY_ROUND_DOWNWARD: fesetround(FE_DOWNWARD); break; // Towards negative infinity case POLY_ROUND_UPWARD: fesetround(FE_UPWARD); break; // Towards positive infinity case POLY_ROUND_TOZERO: fesetround(FE_TOWARDZERO); break; // Truncate towards zero } } #elif (defined(HAVE_IEEEFP_H) && ! defined(__CYGWIN__)) // Older FreeBSD. Cygwin has the ieeefp.h header but not the functions! static int getrounding(TaskData *) { switch (fpgetround()) { case FP_RN: return POLY_ROUND_TONEAREST; case FP_RM: return POLY_ROUND_DOWNWARD; case FP_RP: return POLY_ROUND_UPWARD; case FP_RZ: return POLY_ROUND_TOZERO; default: return 0; /* Shouldn't happen. */ } } static void setrounding(TaskData *taskData, Handle args) { switch (get_C_long(taskData, DEREFWORDHANDLE(args))) { case POLY_ROUND_TONEAREST: fpsetround(FP_RN); break; /* Choose nearest */ case POLY_ROUND_DOWNWARD: fpsetround(FP_RM); break; /* Towards negative infinity */ case POLY_ROUND_UPWARD: fpsetround(FP_RP); break; /* Towards positive infinity */ case POLY_ROUND_TOZERO: fpsetround(FP_RZ); break; /* Truncate towards zero */ } } #elif defined(_WIN32) // Windows version static int getrounding(TaskData *) { switch (_controlfp(0,0) & _MCW_RC) { case _RC_NEAR: return POLY_ROUND_TONEAREST; case _RC_DOWN: return POLY_ROUND_DOWNWARD; case _RC_UP: return POLY_ROUND_UPWARD; case _RC_CHOP: return POLY_ROUND_TOZERO; } return 0; // Keep the compiler happy } static void setrounding(TaskData *mdTaskData, Handle args) { switch (get_C_long(mdTaskData, DEREFWORDHANDLE(args))) { case POLY_ROUND_TONEAREST: _controlfp(_RC_NEAR, _MCW_RC); break; // Choose nearest case POLY_ROUND_DOWNWARD: _controlfp(_RC_DOWN, _MCW_RC); break; // Towards negative infinity case POLY_ROUND_UPWARD: _controlfp(_RC_UP, _MCW_RC); break; // Towards positive infinity case POLY_ROUND_TOZERO: _controlfp(_RC_CHOP, _MCW_RC); break; // Truncate towards zero } } #elif defined(_FPU_GETCW) && defined(_FPU_SETCW) // Older Linux version static int getrounding(TaskData *) { fpu_control_t ctrl; _FPU_GETCW(ctrl); switch (ctrl & _FPU_RC_ZERO) { case _FPU_RC_NEAREST: return POLY_ROUND_TONEAREST; case _FPU_RC_DOWN: return POLY_ROUND_DOWNWARD; case _FPU_RC_UP: return POLY_ROUND_UPWARD; case _FPU_RC_ZERO: return POLY_ROUND_TOZERO; } return 0; /* Never reached but this avoids warning message. */ } static void setrounding(TaskData *taskData, Handle args) { fpu_control_t ctrl; _FPU_GETCW(ctrl); ctrl &= ~_FPU_RC_ZERO; /* Mask off any existing rounding. */ switch (get_C_long(taskData, DEREFWORDHANDLE(args))) { case POLY_ROUND_TONEAREST: ctrl |= _FPU_RC_NEAREST; case POLY_ROUND_DOWNWARD: ctrl |= _FPU_RC_DOWN; case POLY_ROUND_UPWARD: ctrl |= _FPU_RC_UP; case POLY_ROUND_TOZERO: ctrl |= _FPU_RC_ZERO; } _FPU_SETCW(ctrl); } #elif (defined(HOSTARCHITECTURE_PPC) && defined(MACOSX)) // Older versions of the Mac OS X didn't have a suitable function. static void getround(union db *res) { __asm__ ("mffs f0"); __asm__ ("stfd f0,0(r3)"); } static int getrounding(TaskData *) { union db roundingRes; getround(&roundingRes); switch (roundingRes.wrd[1] & 3) { case 0: return POLY_ROUND_TONEAREST; /* Choose nearest */ case 1: return POLY_ROUND_TOZERO; /* Round towards zero */ case 2: return POLY_ROUND_UPWARD; /* Towards positive infinity */ case 3: return POLY_ROUND_DOWNWARD; /* Towards negative infinity */ } return 0; /* Never reached but this avoids warning message. */ } static void setrounding(TaskData *taskData, Handle args) { switch (get_C_long(taskData, DEREFWORDHANDLE(args))) { case POLY_ROUND_TONEAREST: __asm__("mtfsfi 7,0"); break; /* Choose nearest */ case POLY_ROUND_DOWNWARD: __asm__("mtfsfi 7,3"); break; /* Towards negative infinity */ case POLY_ROUND_UPWARD: __asm__("mtfsfi 7,2"); break; /* Towards positive infinity */ case POLY_ROUND_TOZERO: __asm__("mtfsfi 7,1"); break; /* Truncate towards zero */ } } #else // Give up. static int getrounding(TaskData *mdTaskData) { raise_exception_string(mdTaskData, EXC_Fail, "Unable to get floating point rounding control"); } static void setrounding(TaskData *mdTaskData, Handle) { raise_exception_string(mdTaskData, EXC_Fail, "Unable to set floating point rounding control"); } #endif Handle Real_strc(TaskData *mdTaskData, Handle hDigits, Handle hMode, Handle arg) { double dx = real_arg(arg); int decpt, sign; int mode = get_C_int(mdTaskData, DEREFWORDHANDLE(hMode)); int digits = get_C_int(mdTaskData, DEREFWORDHANDLE(hDigits)); /* Compute the shortest string which gives the required value. */ /* */ char *chars = poly_dtoa(dx, mode, digits, &decpt, &sign, NULL); /* We have to be careful in case an allocation causes a garbage collection. */ PolyWord pStr = C_string_to_Poly(mdTaskData, chars); poly_freedtoa(chars); Handle ppStr = mdTaskData->saveVec.push(pStr); /* Allocate a triple for the results. */ PolyObject *result = alloc(mdTaskData, 3); result->Set(0, DEREFWORDHANDLE(ppStr)); result->Set(1, TAGGED(decpt)); result->Set(2, TAGGED(sign)); return mdTaskData->saveVec.push(result); } /* Functions added for Standard Basis Library are all indirected through here. */ Handle Real_dispatchc(TaskData *mdTaskData, Handle args, Handle code) { unsigned c = get_C_unsigned(mdTaskData, DEREFWORDHANDLE(code)); switch (c) { case 0: /* tan */ return real_result(mdTaskData, tan(real_arg(args))); case 1: /* asin */ { double x = real_arg(args); if (x < -1.0 || x > 1.0) return real_result(mdTaskData, notANumber); else return real_result(mdTaskData, asin(x)); } case 2: /* acos */ { double x = real_arg(args); if (x < -1.0 || x > 1.0) return real_result(mdTaskData, notANumber); else return real_result(mdTaskData, acos(x)); } case 3: /* atan2 */ return real_result(mdTaskData, atan2(real_arg1(args), real_arg2(args))); case 4: /* pow */ return powerOf(mdTaskData, args); case 5: /* log10 */ { double x = real_arg(args); /* Make sure the result conforms to the definition. */ if (x < 0.0) return real_result(mdTaskData, notANumber); /* Nan. */ else if (x == 0.0) /* x may be +0.0 or -0.0 */ return real_result(mdTaskData, negInf); /* -infinity. */ else return real_result(mdTaskData, log10(x)); } case 6: /* sinh */ return real_result(mdTaskData, sinh(real_arg(args))); case 7: /* cosh */ return real_result(mdTaskData, cosh(real_arg(args))); case 8: /* tanh */ return real_result(mdTaskData, tanh(real_arg(args))); case 9: /* setroundingmode */ setrounding(mdTaskData, args); return mdTaskData->saveVec.push(TAGGED(0)); /* Unit */ case 10: /* getroundingmode */ return mdTaskData->saveVec.push(TAGGED(getrounding(mdTaskData))); /* Floating point representation queries. */ #ifdef _DBL_RADIX case 11: /* Value of radix */ return mdTaskData->saveVec.push(TAGGED(_DBL_RADIX)); #else case 11: /* Value of radix */ return mdTaskData->saveVec.push(TAGGED(FLT_RADIX)); #endif case 12: /* Value of precision */ return mdTaskData->saveVec.push(TAGGED(DBL_MANT_DIG)); case 13: /* Maximum number */ return real_result(mdTaskData, DBL_MAX); /* float.h describes DBL_MIN as the minimum positive number. In fact this is the minimum NORMALISED number. The smallest number which can be represented is DBL_MIN*2**(-DBL_MANT_DIG) */ case 14: /* Minimum normalised number. */ return real_result(mdTaskData, DBL_MIN); #if (0) case 15: /* Is finite */ /* No longer used - implemented in ML. */ return mdTaskData->saveVec.push(finite(real_arg(args)) ? TAGGED(1) : TAGGED(0)); case 16: /* Is Nan */ /* No longer used - implemented in ML. */ return mdTaskData->saveVec.push(isnan(real_arg(args)) ? TAGGED(1) : TAGGED(0)); #endif case 17: /* Get sign bit. There may be better ways to find this. */ return mdTaskData->saveVec.push(copysign(1.0, real_arg(args)) < 0.0 ? TAGGED(1) : TAGGED(0)); case 18: /* Copy sign. */ return real_result(mdTaskData, copysign(real_arg1(args), real_arg2(args))); case 19: /* Return largest integral value (as a real) <= x. */ return real_result(mdTaskData, floor(real_arg(args))); case 20: /* Return smallest integral value (as a real) >= x */ return real_result(mdTaskData, ceil(real_arg(args))); case 21: { /* Truncate towards zero */ double dx = real_arg(args); if (dx >= 0.0) return real_result(mdTaskData, floor(dx)); else return real_result(mdTaskData, ceil(dx)); } case 22: /* Round to nearest integral value. */ { double dx = real_arg(args); double drem = fmod(dx, 2.0); if (drem == 0.5 || drem == -1.5) /* If the value was exactly positive even + 0.5 or negative odd -0.5 round it down, otherwise round it up. */ return real_result(mdTaskData, ceil(dx-0.5)); else return real_result(mdTaskData, floor(dx+0.5)); } case 23: /* Compute ldexp */ { int exp = get_C_int(mdTaskData, DEREFHANDLE(args)->Get(1)); return real_result(mdTaskData, ldexp(real_arg1(args), exp)); } case 24: /* Get mantissa. */ { int exp; return real_result(mdTaskData, frexp(real_arg(args), &exp)); } case 25: /* Get exponent. */ { int exp; (void)frexp(real_arg(args), &exp); return mdTaskData->saveVec.push(TAGGED(exp)); } case 26: /* Return the mantissa from a Nan as a real number. */ // I think this is no longer used. { union db r_arg_x, r_arg_y; /* We want to simply replace the exponent by the exponent value for 0.5<=x<1. I think there may be a more portable way of doing this. */ r_arg_x.dble = posInf; /* Positive infinity. */ r_arg_y.dble = 0.5; /* Use the infinity value as a mask, removing any bits set and replace by the exponent from 0.5. */ byte *barg = DEREFBYTEHANDLE(args); for(unsigned i = 0; i < DBLE; i++) { r_arg_x.bytes[i] = (barg[i] & ~r_arg_x.bytes[i]) | r_arg_y.bytes[i]; } return real_result(mdTaskData, r_arg_x.dble); } case 27: /* Construct a Nan from a given mantissa. */ // I think this is no longer used. { union db r_arg; r_arg.dble = posInf; /* Positive infinity. */ /* OR in the exponent. */ byte *barg = DEREFBYTEHANDLE(args); for(unsigned i = 0; i < DBLE; i++) { r_arg.bytes[i] = r_arg.bytes[i] | barg[i]; } return real_result(mdTaskData, r_arg.dble); } case 28: /* Return the number of bytes for a real. */ return mdTaskData->saveVec.push(TAGGED(sizeof(double))); default: { char msg[100]; sprintf(msg, "Unknown real arithmetic function: %d", c); raise_exception_string(mdTaskData, EXC_Fail, msg); return 0; } } } class RealArithmetic: public RtsModule { public: virtual void Init(void); }; // Declare this. It will be automatically added to the table. static RealArithmetic realModule; void RealArithmetic::Init(void) { /* Some compilers object to overflow in constants so we compute the values here. */ #if (HAVE_DECL_FPSETMASK && ! defined(__CYGWIN__)) /* In FreeBSD 3.4 at least, we sometimes get floating point exceptions if we don't clear the mask. Maybe need to do this on other platforms as well just to be sure. */ // N.B. fpsetmask is defined in the headers on Cygwin but there's no function! fpsetmask(0); #endif // NAN and INFINITY are defined in GCC but not in Visual C++. #if (defined(INFINITY)) posInf = INFINITY; negInf = -(INFINITY); #else { double zero = 0.0; posInf = 1.0 / zero; negInf = -1.0 / zero; } #endif #if (defined(NAN)) notANumber = NAN; #else { double zero = 0.0; notANumber = zero / zero; } #endif // Make sure this is a positive NaN since we return it from "abs". // "Positive" in this context is copysign(1.0, x) > 0.0 because that's // how we test the sign so we test it first and then try to change the // sign if it's wrong. if (copysign(1.0, notANumber) < 0) notANumber = copysign(notANumber, 1.0); } polyml-5.6/libpolyml/reals.h000066400000000000000000000050061265146633400161750ustar00rootroot00000000000000/* Title: reals.h Copyright (c) 2000 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _REALS_H #define _REALS_H class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern double real_arg(Handle x); // Also used in "foreign.cpp" extern Handle real_result(TaskData *mdTaskData, double x); // Also used in "foreign.cpp" extern Handle Real_addc (TaskData *mdTaskData, Handle, Handle); extern Handle Real_subc (TaskData *mdTaskData, Handle, Handle); extern Handle Real_mulc (TaskData *mdTaskData, Handle, Handle); extern Handle Real_divc (TaskData *mdTaskData, Handle, Handle); extern Handle Real_absc (TaskData *mdTaskData, Handle); extern Handle Real_negc (TaskData *mdTaskData, Handle); extern Handle Real_convc (TaskData *mdTaskData, Handle); extern Handle Real_intc (TaskData *mdTaskData, Handle); extern Handle Real_floatc (TaskData *mdTaskData, Handle); extern Handle Real_sqrtc (TaskData *mdTaskData, Handle); extern Handle Real_sinc (TaskData *mdTaskData, Handle); extern Handle Real_cosc (TaskData *mdTaskData, Handle); extern Handle Real_arctanc (TaskData *mdTaskData, Handle); extern Handle Real_expc (TaskData *mdTaskData, Handle); extern Handle Real_lnc (TaskData *mdTaskData, Handle); extern Handle Real_strc(TaskData *mdTaskData, Handle hDigits, Handle hMode, Handle arg); extern Handle Real_geqc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_leqc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_gtrc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_lssc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_eqc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_neqc(TaskData *mdTaskData, Handle y, Handle x); extern Handle Real_dispatchc(TaskData *mdTaskData, Handle args, Handle code); #endif polyml-5.6/libpolyml/rts_module.cpp000066400000000000000000000035011265146633400175750ustar00rootroot00000000000000/* Title: rts_module.cpp - Base class for the run-time system modules. Copyright (c) 2006 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include "rts_module.h" #include "diagnostics.h" #define MAX_MODULES 20 static RtsModule *module_table[MAX_MODULES]; static unsigned modCount = 0; // Add a module to the table. This will be done during the static // initialisation phase. void RtsModule::RegisterModule(void) { if (modCount == MAX_MODULES) Crash("Too many run-time modules\n"); module_table[modCount++] = this; } void InitModules(void) { for(unsigned i = 0; i < modCount; i++) module_table[i]->Init(); } void StartModules(void) { for(unsigned i = 0; i < modCount; i++) module_table[i]->Start(); } void StopModules(void) { for(unsigned i = 0; i < modCount; i++) module_table[i]->Stop(); } void GCModules(ScanAddress *process) { for(unsigned i = 0; i < modCount; i++) module_table[i]->GarbageCollect(process); } polyml-5.6/libpolyml/rts_module.h000066400000000000000000000026061265146633400172470ustar00rootroot00000000000000/* Title: rts_module.h - Base class for the run-time system modules. Copyright (c) 2006, 2011 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef RTS_MODULE_H_INCLUDED #define RTS_MODULE_H_INCLUDED class ScanAddress; class TaskData; class RtsModule { public: RtsModule() { RegisterModule(); } virtual ~RtsModule() {} // To keep GCC happy virtual void Init(void) {} virtual void Start(void) {} virtual void Stop(void) {} virtual void GarbageCollect(ScanAddress * /*process*/) {} private: void RegisterModule(void); }; void InitModules(void); void StartModules(void); void StopModules(void); void GCModules(ScanAddress *process); #endif polyml-5.6/libpolyml/run_time.cpp000066400000000000000000001325131265146633400172500ustar00rootroot00000000000000/* Title: Run-time system. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000 Cambridge University Technical Services Limited Further work copyright David C. J. Matthews 2009, 2012, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif /************************************************************************ * * Include system headers * ************************************************************************/ #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_PROCESS_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_EXCPT_H #include #endif #ifdef HAVE_SYS_TIMES_H #include #endif #ifdef HAVE_SYS_SYSTEMINFO_H #include #endif #ifdef HAVE_UNISTD_H #include #endif /************************************************************************ * * Include runtime headers * ************************************************************************/ #include "globals.h" #include "gc.h" #include "mpoly.h" #include "arb.h" #include "machine_dep.h" #include "diagnostics.h" #include "processes.h" #include "profiling.h" #include "run_time.h" #include "sys.h" #include "process_env.h" #include "sighandler.h" #include "scanaddrs.h" #include "check_objects.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "memmgr.h" #define SAVE(x) taskData->saveVec.push(x) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) // used heavily by MD_init_interface_vector in machine_dep.c void add_word_to_io_area (unsigned sysop, PolyWord val) { ASSERT (sysop > 0 && sysop < 256); PolyWord *objAddr = IoEntry(sysop); objAddr[0] = val; } /******************************************************************************/ /* */ /* STORAGE ALLOCATION */ /* */ /******************************************************************************/ // This is the storage allocator for allocating heap objects in the RTS. PolyObject *alloc(TaskData *taskData, POLYUNSIGNED data_words, unsigned flags) /* Allocate a number of words. */ { POLYUNSIGNED words = data_words + 1; if (profileMode == kProfileStoreAllocation) { add_count(taskData, taskData->pc(), taskData->sp(), words); } PolyWord *foundSpace = processes->FindAllocationSpace(taskData, words, false); if (foundSpace == 0) { // Failed - the thread is set to raise an exception. throw IOException(); } PolyObject *pObj = (PolyObject*)(foundSpace + 1); pObj->SetLengthWord(data_words, flags); // Must initialise object here, because GC doesn't clean store. // N.B. This sets the store to zero NOT TAGGED(0). // This is particularly important for byte segments (e.g. strings) since the // ML code may leave bytes at the end uninitialised. Structure equality // checks all the bytes so for it to work properly we need to be sure that // they always have the same value. for (POLYUNSIGNED i = 0; i < data_words; i++) pObj->Set(i, PolyWord::FromUnsigned(0)); return pObj; } /******************************************************************************/ /* */ /* alloc_and_save - called by run-time system */ /* */ /******************************************************************************/ Handle alloc_and_save(TaskData *taskData, POLYUNSIGNED size, unsigned flags) /* Allocate and save the result on the vector. */ { return SAVE(alloc(taskData, size, flags)); } /******************************************************************************/ /* */ /* full_gc_c - called by assembly code */ /* */ /******************************************************************************/ /* CALL_IO0(full_gc_, NOIND) */ Handle full_gc_c(TaskData *taskData) { FullGC(taskData); return SAVE(TAGGED(0)); } /******************************************************************************/ /* */ /* Error Messages */ /* */ /******************************************************************************/ // Return the handle to a string error message. This will return // something like "Unknown error" from strerror if it doesn't match // anything. Handle errorMsg(TaskData *taskData, int err) { #ifdef _WIN32 /* In the Windows version we may have both errno values and also GetLastError values. We convert the latter into negative values before returning them. */ if (err < 0) { LPTSTR lpMsg = NULL; TCHAR *p; if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD)(-err), 0, (LPTSTR)&lpMsg, 1, NULL) > 0) { /* The message is returned with CRLF at the end. Remove them. */ for (p = lpMsg; *p != '\0' && *p != '\n' && *p != '\r'; p++); *p = '\0'; Handle res = SAVE(C_string_to_Poly(taskData, lpMsg)); LocalFree(lpMsg); return res; } } #endif // Unix and unknown Windows errors. return SAVE(C_string_to_Poly(taskData, strerror(err))); } /******************************************************************************/ /* */ /* EXCEPTIONS */ /* */ /******************************************************************************/ Handle make_exn(TaskData *taskData, int id, Handle arg) { const char *exName; switch (id) { case EXC_interrupt: exName = "Interrupt"; break; case EXC_syserr: exName = "SysErr"; break; case EXC_size: exName = "Size"; break; case EXC_overflow: exName = "Overflow"; break; case EXC_underflow: exName = "Underflow"; break; case EXC_divide: exName = "Div"; break; case EXC_conversion: exName = "Conversion"; break; case EXC_XWindows: exName = "XWindows"; break; case EXC_subscript: exName = "Subscript"; break; case EXC_foreign: exName = "Foreign"; break; case EXC_Fail: exName = "Fail"; break; case EXC_thread: exName = "Thread"; break; case EXC_extrace: exName = "ExTrace"; break; default: ASSERT(0); exName = "Unknown"; // Shouldn't happen. } Handle pushed_name = SAVE(C_string_to_Poly(taskData, exName)); Handle exnHandle = alloc_and_save(taskData, SIZEOF(poly_exn)); DEREFEXNHANDLE(exnHandle)->ex_id = TAGGED(id); DEREFEXNHANDLE(exnHandle)->ex_name = DEREFWORD(pushed_name); DEREFEXNHANDLE(exnHandle)->arg = DEREFWORDHANDLE(arg); DEREFEXNHANDLE(exnHandle)->ex_location = TAGGED(0); return exnHandle; } /******************************************************************************/ /* */ /* raise_exception - called by run-time system */ /* */ /******************************************************************************/ void raise_exception(TaskData *taskData, int id, Handle arg) /* Raise an exception with no arguments. */ { Handle exn = make_exn(taskData, id, arg); /* N.B. We must create the packet first BEFORE dereferencing the process handle just in case a GC while creating the packet moves the process and/or the stack. */ taskData->SetException(DEREFEXNHANDLE(exn)); throw IOException(); /* Return to Poly code immediately. */ /*NOTREACHED*/ } /******************************************************************************/ /* */ /* raise_exception0 - called by run-time system */ /* */ /******************************************************************************/ void raise_exception0(TaskData *taskData, int id) /* Raise an exception with no arguments. */ { raise_exception(taskData, id, SAVE(TAGGED(0))); /*NOTREACHED*/ } /******************************************************************************/ /* */ /* raise_exception_string - called by run-time system */ /* */ /******************************************************************************/ void raise_exception_string(TaskData *taskData, int id, const char *str) /* Raise an exception with a C string as the argument. */ { raise_exception(taskData, id, SAVE(C_string_to_Poly(taskData, str))); /*NOTREACHED*/ } // Raise a SysErr exception with a given error code. // The string part must match the result of OS.errorMsg void raiseSyscallError(TaskData *taskData, int err) { Handle errornum = Make_arbitrary_precision(taskData, err); Handle pushed_option = alloc_and_save(taskData, 1); DEREFHANDLE(pushed_option)->Set(0, DEREFWORDHANDLE(errornum)); /* SOME err */ Handle pushed_name = errorMsg(taskData, err); // Generate the string. Handle pair = alloc_and_save(taskData, 2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(pushed_name)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(pushed_option)); raise_exception(taskData, EXC_syserr, pair); } // Raise a SysErr exception which does not correspond to an error code. void raiseSyscallMessage(TaskData *taskData, const char *errmsg) { Handle pushed_option = SAVE(NONE_VALUE); /* NONE */ Handle pushed_name = SAVE(C_string_to_Poly(taskData, errmsg)); Handle pair = alloc_and_save(taskData, 2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(pushed_name)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(pushed_option)); raise_exception(taskData, EXC_syserr, pair); } // This was the previous version. The errmsg argument is ignored unless err is zero. // Calls to it should really be replaced with calls to either raiseSyscallMessage // or raiseSyscallError but it's been left because there may be cases where errno // actually contains zero. void raise_syscall(TaskData *taskData, const char *errmsg, int err) { if (err == 0) raiseSyscallMessage(taskData, errmsg); else raiseSyscallError(taskData, err); } // Raises a Fail exception. void raise_fail(TaskData *taskData, const char *errmsg) { raise_exception_string(taskData, EXC_Fail, errmsg); } /* "Polymorphic" function to generate a list. */ Handle makeList(TaskData *taskData, int count, char *p, int size, void *arg, Handle (mkEntry)(TaskData *, void*, char*)) { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); /* Start from the end of the list. */ p += count*size; while (count > 0) { Handle value, next; p -= size; /* Back up to the last entry. */ value = mkEntry(taskData, arg, p); next = alloc_and_save(taskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); count--; } return list; } // Build a list of the function names on the stack. Handle buildStackList(TaskData *taskData, PolyWord *startOfTrace, PolyWord *endOfTrace) { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); PolyWord *endStack = taskData->stack->top - 1; if (endOfTrace > endStack) endOfTrace = endStack; for (PolyWord *sp = endOfTrace; sp >= startOfTrace; sp--) { PolyWord pc = *sp; if (pc.IsCodePtr() && sp != taskData->hr()) { // A code pointer can be a return address or an exception // handler but if we're producing an exception trace the // only exception handler will be the one for exception // trace itself. PolyObject *ptr = ObjCodePtrToPtr(pc.AsCodePtr()); PolyWord *consts = ptr->ConstPtrForCode(); // The name may be zero if it is anonymous. // We have to be careful that a GC might move the code or the name. // Stack areas are no longer in the ML heap so we don't need to worry // about the stack pointer. Handle functionName = consts[0] == TAGGED(0) ? SAVE(C_string_to_Poly(taskData, "")) : SAVE(consts[0]); Handle next = alloc_and_save(taskData, sizeof(ML_Cons_Cell) / sizeof(PolyWord)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(functionName); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } } return list; } void give_stack_trace(TaskData *taskData, PolyWord *sp, PolyWord *finish) { Handle listHandle = buildStackList(taskData, sp, finish); PolyWord list = listHandle->Word(); extern FILE *polyStdout; while (! (list.IsTagged())) { ML_Cons_Cell *p = (ML_Cons_Cell*)list.AsObjPtr(); print_string(p->h); putc('\n', polyStdout); list = p->t; } fflush(polyStdout); } /******************************************************************************/ /* */ /* stack_trace_c - called from assembly code */ /* */ /******************************************************************************/ /* CALL_IO0(stack_trace_, NOIND) */ Handle stack_trace_c(TaskData *taskData) { give_stack_trace (taskData, taskData->sp(), taskData->stack->top); return SAVE(TAGGED(0)); } // Current exception trace. This creates a special exception packet and // raises it so that the ML code can print the trace. Handle exceptionToTraceException(TaskData *taskData, Handle exnHandle) { // p_hr points at a pair of values. The first word will be the // entry point to the handler i.e. to this code, the second word is // the stack address of the handler to restore. PolyWord *handler = taskData->hr()+1; Handle listHandle = buildStackList(taskData, taskData->sp(), handler); // Construct a pair of the trace list and the exception packet Handle pair = alloc_and_save(taskData, 2); pair->WordP()->Set(0, listHandle->Word()); pair->WordP()->Set(1, exnHandle->Word()); // Set up the next handler so we don't come back here when we raise // the exception again. */ taskData->set_hr((PolyWord*)(handler->AsStackAddr())); // Raise this as an exception. The handler will be able to // print the trace and reraise the exception. raise_exception(taskData, EXC_extrace, pair); } // Return the address of the iovec entry for a given index. Handle io_operation_c(TaskData *taskData, Handle entry) { unsigned entryNo = get_C_unsigned(taskData, DEREFWORD(entry)); if (entryNo >= POLY_SYS_vecsize) raise_exception0(taskData, EXC_subscript); return SAVE((PolyObject*)IoEntry(entryNo)); } /******************************************************************************/ /* */ /* get_flags_c - called from machine_assembly.s */ /* */ /******************************************************************************/ /* CALL_IO1(get_flags_,REF,NOIND) */ Handle get_flags_c(TaskData *taskData, Handle addr_handle) { PolyObject *pt = DEREFWORDHANDLE(addr_handle); PolyWord *addr = (PolyWord*)pt; /* This is for backwards compatibility only. Previously this was used to test for an IO address. Instead an entry has been added to process_env to test for an IO address. */ if (gMem.IsIOPointer(addr)) { return SAVE(TAGGED(256)); } else { const POLYUNSIGNED old_word = pt->LengthWord(); const POLYUNSIGNED old_flags = ((old_word & OBJ_PRIVATE_USER_FLAGS_MASK) >> OBJ_PRIVATE_FLAGS_SHIFT); return SAVE(TAGGED(old_flags)); } } // This is called twice when constructing a piece of code. The first // time is to convert a mutable byte segment into a mutable code segment and // the second call is to freeze the mutable code segment. The reason for the // two calls is that we first have to make sure we have a validly formatted code // segment with the "number of constants" value set before we can make it a code // segment and actually store the constants in it. Handle CodeSegmentFlags(TaskData *taskData, Handle flags_handle, Handle addr_handle) { PolyObject *pt = DEREFWORDHANDLE(addr_handle); unsigned short newFlags = get_C_ushort(taskData, DEREFWORD(flags_handle)); if (newFlags >= 256) raise_exception_string(taskData, EXC_Fail, "FreezeCodeSegment flags must be less than 256"); if (! pt->IsMutable()) raise_exception_string(taskData, EXC_Fail, "FreezeCodeSegment must be applied to a mutable segment"); const POLYUNSIGNED objLength = pt->Length(); pt->SetLengthWord(objLength, (byte)newFlags); // Flush the cache on architectures that need it. if (pt->IsCodeObject() && ! pt->IsMutable()) machineDependent->FlushInstructionCache(pt, objLength * sizeof(PolyWord)); return SAVE(TAGGED(0)); } /* CALL_IO3(assign_byte_long_, REF, REF, REF, NOIND) */ Handle assign_byte_long_c(TaskData *taskData, Handle value_handle, Handle byte_no, Handle vector) { PolyWord value = DEREFHANDLE(value_handle); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(byte_no)); /* SPF 31/10/93 */ byte *pointer = DEREFBYTEHANDLE(vector); byte v = (byte)UNTAGGED(value); pointer[offset] = v; return taskData->saveVec.push(TAGGED(0)); } /* CALL_IO3(assign_word_long_, REF, REF, REF, NOIND) */ Handle assign_word_long_c(TaskData *taskData, Handle value_handle, Handle word_no, Handle vector) { PolyWord value = DEREFHANDLE(value_handle); POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(word_no)); /* SPF 31/10/93 */ PolyObject *pointer = DEREFWORDHANDLE(vector); pointer->Set(offset, value); return taskData->saveVec.push(TAGGED(0)); } /* CALL_IO5(move_bytes_long_, REF, REF, REF, REF, REF, NOIND) */ /* Move a segment of bytes, typically a string. */ Handle move_bytes_long_c(TaskData *taskData, Handle len, Handle dest_offset_handle, Handle dest_handle, Handle src_offset_handle, Handle src_handle) { POLYUNSIGNED src_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(src_offset_handle)); byte *source = DEREFBYTEHANDLE(src_handle) + src_offset; POLYUNSIGNED dest_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(dest_offset_handle)); byte *destination = DEREFBYTEHANDLE(dest_handle); byte *dest = destination + dest_offset; POLYUNSIGNED bytes = getPolyUnsigned(taskData, DEREFWORDHANDLE(len)); PolyObject *obj = DEREFHANDLE(dest_handle); ASSERT(obj->IsByteObject()); memmove(dest, source, bytes); /* must work for overlapping segments. */ return taskData->saveVec.push(TAGGED(0)); } /* CALL_IO5(move_words_long_, REF, REF, REF, REF, REF, NOIND) */ /* Move a segment of words. Similar to move_bytes_long_ except that it is used for PolyWord segments. */ Handle move_words_long_c(TaskData *taskData, Handle len, Handle dest_offset_handle, Handle dest_handle, Handle src_offset_handle, Handle src_handle) { POLYUNSIGNED src_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(src_offset_handle)); PolyObject *sourceObj = DEREFWORDHANDLE(src_handle); PolyWord *source = sourceObj->Offset(src_offset); POLYUNSIGNED dest_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(dest_offset_handle)); PolyObject *destObject = DEREFWORDHANDLE(dest_handle); PolyWord *dest = destObject->Offset(dest_offset); POLYUNSIGNED words = getPolyUnsigned(taskData, DEREFWORDHANDLE(len)); ASSERT(! destObject->IsByteObject()); memmove(dest, source, words*sizeof(PolyWord)); /* must work for overlapping segments. */ return taskData->saveVec.push(TAGGED(0)); } Handle testBytesEqual(TaskData *taskData, Handle len, Handle yOffset, Handle y, Handle xOffset, Handle x) { POLYUNSIGNED x_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(xOffset)); byte *xAddr = DEREFBYTEHANDLE(x) + x_offset; POLYUNSIGNED y_offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(yOffset)); byte *yAddr = DEREFBYTEHANDLE(y) + y_offset; POLYUNSIGNED bytes = getPolyUnsigned(taskData, DEREFWORDHANDLE(len)); int res = memcmp(xAddr, yAddr, bytes); if (res == 0) return taskData->saveVec.push(TAGGED(1)); else return taskData->saveVec.push(TAGGED(0)); } Handle vec_length_c(TaskData *taskData, Handle vector) /* Length of a vector */ { POLYUNSIGNED length = vector->WordP()->Length(); return taskData->saveVec.push(TAGGED(length)); } Handle load_byte_long_c(TaskData *taskData, Handle byte_no /* offset in BYTES */, Handle addr) { POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(byte_no)); return taskData->saveVec.push(TAGGED(DEREFBYTEHANDLE(addr)[offset])); } Handle load_word_long_c(TaskData *taskData, Handle word_no /* offset in WORDS */, Handle addr) { POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORDHANDLE(word_no)); return taskData->saveVec.push(addr->Word().AsObjPtr()->Get(offset)); } // In most cases the assembly coded version of this will handle the // allocation. The function can be called by the assembly code // when it finds it has run out. Using it avoids us having a // return address into the assembly code. Handle alloc_store_long_c(TaskData *taskData, Handle initial, Handle flags_handle, Handle size ) { unsigned flags = get_C_unsigned(taskData, DEREFWORD(flags_handle)); POLYUNSIGNED usize = getPolyUnsigned(taskData, DEREFWORD(size)); if (usize == 0 || usize >= MAX_OBJECT_SIZE) raise_exception0(taskData, EXC_size); PolyObject *vector = alloc(taskData, usize, flags| F_MUTABLE_BIT); PolyWord value = DEREFWORD(initial); if (vector->IsByteObject()) { // Byte segments are supposed to be initialised only with zero if (value != TAGGED(0)) raise_exception_string(taskData, EXC_Fail, "non-zero byte segment"); } else if (value != PolyWord::FromUnsigned(0)) { for (POLYUNSIGNED i = 0; i < usize; i++) vector->Set(i, value); } return taskData->saveVec.push(vector); } // Alloc_uninit returns the address of some memory that will be filled in later // so need not be initialised unlike alloc_store where the initial value may be // significant. For word objects we can't risk leaving them uninitialised in case // we GC before we've finished filling them. There's no harm in initialising byte // objects. Handle alloc_uninit_c(TaskData *taskData, Handle flags_handle, Handle size ) { Handle initial = SAVE(TAGGED(0)); return alloc_store_long_c(taskData, initial, flags_handle, size); } /* Word functions. These functions assume that their arguments are tagged integers and treat them as unsigned values. These functions will almost always be implemented directly in the code generator with back-up versions in the machine-dependent assembly code section. They are included here for completeness. */ Handle mul_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(wx*wy)); } Handle plus_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(wx+wy)); } Handle minus_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(wx-wy)); } Handle div_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); if (wy == 0) raise_exception0(taskData, EXC_divide); return taskData->saveVec.push(TAGGED(wx/wy)); } Handle mod_word_c(TaskData *taskData, Handle y, Handle x) { // In most cases it doesn't matter whether we use UNTAGGED or UNTAGGED_UNSIGNED // but in mod we will get the wrong answer if we use UNTAGGED here. POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); if (wy == 0) raise_exception0(taskData, EXC_divide); return taskData->saveVec.push(TAGGED(wx%wy)); } Handle word_eq_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wx==wy ? TAGGED(1) : TAGGED(0)); } Handle word_neq_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wx!=wy ? TAGGED(1) : TAGGED(0)); } Handle word_geq_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wx>=wy ? TAGGED(1) : TAGGED(0)); } Handle word_leq_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wx<=wy ? TAGGED(1) : TAGGED(0)); } Handle word_gtr_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wx>wy ? TAGGED(1) : TAGGED(0)); } Handle word_lss_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(wxsaveVec.push(TAGGED(wx & wy)); } Handle or_word_c(TaskData *taskData, Handle y, Handle x) { /* Normally it isn't necessary to remove the tags and put them back on again. We leave this code as it is just in case some architecture does it differently. */ POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(wx | wy)); } Handle xor_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); return taskData->saveVec.push(TAGGED(wx ^ wy)); } Handle not_bool_c(TaskData *taskData, Handle x) { return taskData->saveVec.push(DEREFWORD(x) == TAGGED(0) ? TAGGED(1) : TAGGED(0)); } Handle shift_left_word_c(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = UNTAGGED_UNSIGNED(DEREFWORD(x)); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); /* It is defined to return 0 if the shift is greater than the number of bits in the PolyWord. The shift instructions on many architectures don't get that right. */ if (wy > sizeof(PolyWord)*8) return taskData->saveVec.push(TAGGED(0)); return taskData->saveVec.push(TAGGED(wx< sizeof(PolyWord)*8) return taskData->saveVec.push(TAGGED(0)); return taskData->saveVec.push(TAGGED(wx>>wy)); } Handle shift_right_arith_word_c(TaskData *taskData, Handle y, Handle x) { POLYSIGNED wx = UNTAGGED(DEREFWORD(x)); /* Treat as a signed quantity. */ POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); // This function in ML is defined to return 0 or ~1 if the shift is greater // than the number of bits in the word. // C does not actually define how signed values are shifted although most // (all?) compilers seem to use arithmetic shifts here. if (wy > sizeof(PolyWord)*8) return taskData->saveVec.push(wx < 0 ? TAGGED(-1) : TAGGED(0)); return taskData->saveVec.push(TAGGED(wx >> wy)); } // Large-word operations. A large word is a 32/64-bit value in a byte segment. // These will normally be code-generated and in the assembly code. Handle eqLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wx==wy ? TAGGED(1) : TAGGED(0)); } Handle neqLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wx!=wy ? TAGGED(1) : TAGGED(0)); } Handle geqLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wx>=wy ? TAGGED(1) : TAGGED(0)); } Handle leqLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wx<=wy ? TAGGED(1) : TAGGED(0)); } Handle gtLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wx>wy ? TAGGED(1) : TAGGED(0)); } Handle ltLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(wxWordP()->Set(0, PolyWord::FromUnsigned(w)); return result; } Handle plusLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx + wy); } Handle minusLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx - wy); } Handle mulLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx * wy); } Handle divLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); if (wy == 0) raise_exception0(taskData, EXC_divide); return makeLongWord(taskData, wx / wy); } Handle modLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); if (wy == 0) raise_exception0(taskData, EXC_divide); return makeLongWord(taskData, wx % wy); } Handle andbLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx & wy); } Handle orbLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx | wy); } Handle xorbLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = y->WordP()->Get(0).AsUnsigned(); return makeLongWord(taskData, wx ^ wy); } Handle shiftLeftLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); // The amount to shift is always a Word.word value. POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); /* It is defined to return 0 if the shift is greater than the number of bits in the PolyWord. The shift instructions on many architectures don't get that right. */ if (wy > sizeof(PolyWord)*8) return makeLongWord(taskData, 0); return makeLongWord(taskData, wx << wy); } Handle shiftRightLongWord(TaskData *taskData, Handle y, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); /* It is defined to return 0 if the shift is greater than the number of bits in the word. The shift instructions on many architectures don't get that right. */ if (wy > sizeof(PolyWord)*8) return makeLongWord(taskData, 0); return makeLongWord(taskData, wx >> wy); } Handle shiftRightArithLongWord(TaskData *taskData, Handle y, Handle x) { POLYSIGNED wx = x->WordP()->Get(0).AsSigned(); POLYUNSIGNED wy = UNTAGGED_UNSIGNED(DEREFWORD(y)); if (wy > sizeof(PolyWord)*8) return makeLongWord(taskData, wx < 0 ? -1 : 0); // Strictly speaking, C does not define that this uses an arithmetic shift // so we really ought to set the high-order bits explicitly. return makeLongWord(taskData, (POLYUNSIGNED)(wx >> wy)); } // Extract the first word and return it as a tagged value. This loses the top-bit Handle longWordToTagged(TaskData *taskData, Handle x) { POLYUNSIGNED wx = x->WordP()->Get(0).AsUnsigned(); return taskData->saveVec.push(TAGGED(wx)); } // Shift the tagged value to remove the tag and put it into the first word. // The original sign bit is copied in the shift. Handle signedToLongWord(TaskData *taskData, Handle x) { POLYSIGNED wx = x->Word().UnTagged(); return makeLongWord(taskData, (POLYUNSIGNED)wx); } // As with the above except the value is treated as an unsigned // value and the top bit is zero. Handle unsignedToLongWord(TaskData *taskData, Handle x) { POLYUNSIGNED wx = x->Word().UnTaggedUnsigned(); return makeLongWord(taskData, wx); } void CheckAndGrowStack(TaskData *taskData, POLYUNSIGNED minSize) /* Expands the current stack if it has grown. We cannot shrink a stack segment when it grows smaller because the frame is checked only at the beginning of a function to ensure that there is enough space for the maximum that can be allocated. */ { /* Get current size of new stack segment. */ POLYUNSIGNED old_len = taskData->stack->spaceSize(); if (old_len >= minSize) return; /* Ok with present size. */ // If it is too small double its size. POLYUNSIGNED new_len; /* New size */ for (new_len = old_len; new_len < minSize; new_len *= 2); POLYUNSIGNED limitSize = getPolyUnsigned(taskData, taskData->threadObject->mlStackSize); // Do not grow the stack if its size is already too big. if ((limitSize != 0 && old_len >= limitSize) || ! gMem.GrowOrShrinkStack(taskData, new_len)) { /* Cannot expand the stack any further. */ extern FILE *polyStderr; fprintf(polyStderr, "Warning - Unable to increase stack - interrupting thread\n"); if (debugOptions & DEBUG_THREADS) Log("THREAD: Unable to grow stack for thread %p from %lu to %lu\n", taskData, old_len, new_len); // We really should do this only if the thread is handling interrupts // asynchronously. On the other hand what else do we do? Handle exn = make_exn(taskData, EXC_interrupt, SAVE(TAGGED(0))); taskData->SetException(DEREFEXNHANDLE(exn)); } else { if (debugOptions & DEBUG_THREADS) Log("THREAD: Growing stack for thread %p from %lu to %lu\n", taskData, old_len, new_len); } } // This is used after executing each top-level command to minimise the // heap size. It's fairly dubious and there ought to be a better way to do this. Handle shrink_stack_c(TaskData *taskData, Handle reserved_space) /* Shrinks the current stack. */ { unsigned reserved = get_C_unsigned(taskData, DEREFWORDHANDLE(reserved_space)); /* The minimum size must include the reserved space for the registers. */ POLYUNSIGNED min_size = taskData->currentStackSpace() + reserved; POLYUNSIGNED new_len; /* New size */ for (new_len = machineDependent->InitialStackSize(); new_len < min_size; new_len *= 2); if (taskData->stack->spaceSize() <= new_len) return SAVE(TAGGED(0)); /* OK with present size. */ // Try to change the stack size but ignore any error since the current size will do. gMem.GrowOrShrinkStack(taskData, new_len); return SAVE(TAGGED(0)); } static unsigned long rtsCallCounts[POLY_SYS_vecsize]; void IncrementRTSCallCount(unsigned ioFunction) { if ((debugOptions & DEBUG_RTSCALLS) && ioFunction < POLY_SYS_vecsize) rtsCallCounts[ioFunction]++; } // This RTS module is defined purely to allow us to print the statistics. class RTS: public RtsModule { public: virtual void Stop(void); }; static RTS rtsModule; static const char * const rtsName[POLY_SYS_vecsize] = { "RTS Call 0", "SYS_exit", "RTS Call 2", "RTS Call 3", "RTS Call 4", "RTS Call 5", "RTS Call 6", "RTS Call 7", "RTS Call 8", "SYS_chdir", "RTS Call 10", "SYS_alloc_store", "SYS_alloc_unit", "RTS Call 13", "SYS_raisex", "SYS_get_length", "RTS Call 16", "SYS_get_flags", "RTS Call 18", "RTS Call 19", "RTS Call 20", "RTS Call 21", "RTS Call 22", "SYS_str_compare", "RTS Call 24", "RTS Call 25", "SYS_teststrgtr", "SYS_teststrlss", "SYS_teststrgeq", "SYS_teststrleq", "RTS Call 30", "RTS Call 31", "SYS_exception_trace_fn", "SYS_give_ex_trace_fn", "RTS Call 34", "RTS Call 35", "RTS Call 36", "RTS Call 37", "RTS Call 38", "RTS Call 39", "RTS Call 40", "RTS Call 41", "RTS Call 42", "RTS Call 43", "RTS Call 44", "RTS Call 45", "RTS Call 46", "SYS_lockseg", "SYS_emptystring", // Not actually a call "SYS_nullvector", // Not actually a call "RTS Call 50", "SYS_network", "SYS_os_specific", "SYS_eq_longword", "SYS_neq_longword", "SYS_geq_longword", "SYS_leq_longword", "SYS_gt_longword", "SYS_lt_longword", "RTS Call 59", "RTS Call 60", "SYS_io_dispatch", "SYS_signal_handler", "RTS Call 63", "RTS Call 64", "RTS Call 65", "RTS Call 66", "RTS Call 67", "RTS Call 68", "SYS_atomic_reset", "SYS_atomic_incr", "SYS_atomic_decr", "SYS_thread_self", "SYS_thread_dispatch", "SYS_plus_longword", "SYS_minus_longword", "SYS_mul_longword", "SYS_div_longword", "SYS_mod_longword", "SYS_andb_longword", "SYS_orb_longword", "SYS_xorb_longword", "RTS Call 82", "RTS Call 83", "SYS_kill_self", "SYS_shift_left_longword", "SYS_shift_right_longword", "SYS_shift_right_arith_longword", "SYS_profiler", "SYS_longword_to_tagged", "SYS_signed_to_longword", "SYS_unsigned_to_longword", "SYS_full_gc", "SYS_stack_trace", "SYS_timing_dispatch", "RTS Call 95", "RTS Call 96", "RTS Call 97", "RTS Call 98", "SYS_objsize", "SYS_showsize", "RTS Call 101", "RTS Call 102", "RTS Call 103", "SYS_quotrem", "SYS_is_short", "SYS_aplus", "SYS_aminus", "SYS_amul", "SYS_adiv", "SYS_amod", "SYS_aneg", "SYS_xora", "SYS_equala", "SYS_ora", "SYS_anda", "RTS Call 116", "SYS_Real_str", "SYS_Real_geq", "SYS_Real_leq", "SYS_Real_gtr", "SYS_Real_lss", "SYS_Real_eq", "SYS_Real_neq", "SYS_Real_Dispatch", "SYS_Add_real", "SYS_Sub_real", "SYS_Mul_real", "SYS_Div_real", "SYS_Abs_real", "SYS_Neg_real", "RTS Call 131", "SYS_Repr_real", "SYS_conv_real", "SYS_real_to_int", "SYS_int_to_real", "SYS_sqrt_real", "SYS_sin_real", "SYS_cos_real", "SYS_arctan_real", "SYS_exp_real", "SYS_ln_real", "RTS Call 142", "RTS Call 143", "RTS Call 144", "RTS Call 145", "RTS Call 146", "RTS Call 147", "SYS_stdin", // Not actually a call "SYS_stdout", // Not actually a call "SYS_process_env", "SYS_set_string_length", "SYS_get_first_long_word", "SYS_poly_specific", "SYS_bytevec_eq", "RTS Call 155", "RTS Call 156", "RTS Call 157", "RTS Call 158", "RTS Call 159", "SYS_cmem_load_8", "SYS_cmem_load_16", "SYS_cmem_load_32", "SYS_cmem_load_64", "SYS_cmem_load_float", "SYS_cmem_load_double", "SYS_cmem_store_8", "SYS_cmem_store_16", "SYS_cmem_store_32", "SYS_cmem_store_64", "SYS_cmem_store_float", "SYS_cmem_store_double", "RTS Call 172", "RTS Call 173", "RTS Call 174", "RTS Call 175", "RTS Call 176", "RTS Call 177", "RTS Call 178", "RTS Call 179", "RTS Call 170", "RTS Call 181", "RTS Call 182", "RTS Call 183", "RTS Call 184", "RTS Call 185", "RTS Call 186", "RTS Call 187", "RTS Call 188", "SYS_io_operation", "SYS_ffi", "RTS Call 191", "RTS Call 192", "RTS Call 193", "SYS_set_code_constant", "SYS_move_words", "SYS_shift_right_arith_word", "SYS_int_to_word", "SYS_move_bytes", "SYS_move_bytes_overlap", "SYS_code_flags", "SYS_shrink_stack", "SYS_stderr", "RTS Call 203", "SYS_callcode_tupled", "SYS_foreign_dispatch", "SYS_foreign_null", "RTS Call 207", "RTS Call 208", "SYS_XWindows", "RTS Call 210", "RTS Call 211", "RTS Call 212", "SYS_is_big_endian", "SYS_bytes_per_word", "SYS_offset_address", "SYS_shift_right_word", "SYS_word_neq", "SYS_not_bool", "RTS Call 219", "RTS Call 220", "RTS Call 221", "RTS Call 222", "SYS_string_length", "RTS Call 224", "RTS Call 225", "RTS Call 226", "RTS Call 227", "SYS_touch_final", "SYS_int_eq", "SYS_int_neq", "SYS_int_geq", "SYS_int_leq", "SYS_int_gtr", "SYS_int_lss", "SYS_load_byte_immut", "SYS_load_word_immut", "RTS Call 237", "SYS_mul_word", "SYS_plus_word", "SYS_minus_word", "SYS_div_word", "SYS_or_word", "SYS_and_word", "SYS_xor_word", "SYS_shift_left_word", "SYS_mod_word", "SYS_word_geq", "SYS_word_leq", "SYS_word_gtr", "SYS_word_lss", "SYS_word_eq", "SYS_load_byte", "SYS_load_word", "SYS_assign_byte", "SYS_assign_word" }; void RTS::Stop() { if (debugOptions & DEBUG_RTSCALLS) { for (unsigned i = 0; i < POLY_SYS_vecsize; i++) { if (rtsCallCounts[i] != 0) Log("RTS: %s called %lu times\n", rtsName[i], rtsCallCounts[i]); } } } polyml-5.6/libpolyml/run_time.h000066400000000000000000000174201265146633400167140ustar00rootroot00000000000000/* Title: run_time.h Copyright (c) 2000-9 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _RUNTIME_H_DEFINED #define _RUNTIME_H_DEFINED 1 #include "globals.h" // PolyWord, PolyObject etc #include "noreturn.h" class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; // Exceptions thrown by C++ code. Indicates that the caller should not return normally. // They can be thrown in one of two different situations: // 1. The IO function needs to raise an ML exception // 2. The IO function needs to retry the call. class IOException { public: IOException() { } }; // This exception is used in the exporter and sharedata code. It is // converted into an ML exception at the outer level. class MemoryException { public: MemoryException() {} }; // A request to kill the thread raises this exception. class KillException { public: KillException() {} }; /* storage allocation functions */ extern PolyObject *alloc(TaskData *taskData, POLYUNSIGNED words, unsigned flags = 0); extern Handle alloc_and_save(TaskData *taskData, POLYUNSIGNED words, unsigned flags = 0); extern Handle exceptionToTraceException(TaskData *taskData, Handle exnHandle); extern Handle makeList(TaskData *taskData, int count, char *p, int size, void *arg, Handle (mkEntry)(TaskData *, void*, char*)); /* exceptions and interrupts */ NORETURNFN(extern void raise_exception(TaskData *taskData, int id, Handle arg)); NORETURNFN(extern void raise_exception0(TaskData *taskData, int id)); NORETURNFN(extern void raise_exception_string(TaskData *taskData, int id, const char *str)); NORETURNFN(extern void raise_fail(TaskData *taskData, const char *errmsg)); // Raise OS.SysCall(OS.errorMsg err, SOME err) NORETURNFN(extern void raiseSyscallError(TaskData *taskData, int err)); // Raise OS.SysCall(msg, NONE) NORETURNFN(extern void raiseSyscallMessage(TaskData *taskData, const char *errmsg)); // This was the previous version. The errmsg argument is ignored unless err is zero. NORETURNFN(extern void raise_syscall(TaskData *taskData, const char *errmsg, int err)); extern void give_stack_trace(TaskData *taskData, PolyWord *stackPtr, PolyWord *finish); Handle make_exn(TaskData *taskData, int id, Handle arg); extern void add_word_to_io_area(unsigned sysop, PolyWord val); extern Handle CodeSegmentFlags(TaskData *taskData, Handle flags_handle, Handle addr_handle); // Check to see that there is space in the stack. May GC and may raise a C++ exception. extern void CheckAndGrowStack(TaskData *mdTaskData, POLYUNSIGNED minSize); extern Handle errorMsg(TaskData *taskData, int err); extern void IncrementRTSCallCount(unsigned ioFunction); // These are C-language versions of small functions referenced from the IO vector. // A lot of these are implemented directly by the X86 code generator. On the X86 they // may also be implemented directly in assembly code. In a few cases the assembly code // version falls back to the C version, for example if there is insufficient space in the // allocation area. extern Handle assign_byte_long_c(TaskData *taskData, Handle value_handle, Handle byte_no, Handle vector); extern Handle assign_word_long_c(TaskData *taskData, Handle value_handle, Handle word_no, Handle vector); extern Handle move_bytes_long_c(TaskData *taskData, Handle len, Handle dest_offset_handle, Handle dest_handle, Handle src_offset_handle, Handle src_handle); extern Handle move_words_long_c(TaskData *taskData, Handle len, Handle dest_offset_handle, Handle dest_handle, Handle src_offset_handle, Handle src_handle); extern Handle testBytesEqual(TaskData *taskData, Handle len, Handle yOffset, Handle y, Handle xOffset, Handle x); extern Handle vec_length_c(TaskData *taskData, Handle vector); extern Handle load_byte_long_c(TaskData *taskData, Handle byte_no /* offset in BYTES */, Handle addr); extern Handle load_word_long_c(TaskData *taskData, Handle word_no /* offset in WORDS */, Handle addr); extern Handle alloc_store_long_c(TaskData *taskData, Handle initial, Handle flags_handle, Handle size ); extern Handle alloc_uninit_c(TaskData *taskData, Handle flags_handle, Handle size ); extern Handle mul_word_c(TaskData *taskData, Handle y, Handle x); extern Handle plus_word_c(TaskData *taskData, Handle y, Handle x); extern Handle minus_word_c(TaskData *taskData, Handle y, Handle x); extern Handle div_word_c(TaskData *taskData, Handle y, Handle x); extern Handle mod_word_c(TaskData *taskData, Handle y, Handle x); extern Handle word_eq_c(TaskData *taskData, Handle y, Handle x); extern Handle word_neq_c(TaskData *taskData, Handle y, Handle x); extern Handle word_geq_c(TaskData *taskData, Handle y, Handle x); extern Handle word_leq_c(TaskData *taskData, Handle y, Handle x); extern Handle word_gtr_c(TaskData *taskData, Handle y, Handle x); extern Handle word_lss_c(TaskData *taskData, Handle y, Handle x); extern Handle and_word_c(TaskData *taskData, Handle y, Handle x); extern Handle or_word_c(TaskData *taskData, Handle y, Handle x); extern Handle xor_word_c(TaskData *taskData, Handle y, Handle x); extern Handle not_bool_c(TaskData *taskData, Handle x); extern Handle shift_left_word_c(TaskData *taskData, Handle y, Handle x); extern Handle shift_right_word_c(TaskData *taskData, Handle y, Handle x); extern Handle shift_right_arith_word_c(TaskData *taskData, Handle y, Handle x); extern Handle eqLongWord(TaskData *taskData, Handle y, Handle x); extern Handle neqLongWord(TaskData *taskData, Handle y, Handle x); extern Handle geqLongWord(TaskData *taskData, Handle y, Handle x); extern Handle leqLongWord(TaskData *taskData, Handle y, Handle x); extern Handle gtLongWord(TaskData *taskData, Handle y, Handle x); extern Handle ltLongWord(TaskData *taskData, Handle y, Handle x); extern Handle makeLongWord(TaskData *taskData, POLYUNSIGNED w); extern Handle plusLongWord(TaskData *taskData, Handle y, Handle x); extern Handle minusLongWord(TaskData *taskData, Handle y, Handle x); extern Handle mulLongWord(TaskData *taskData, Handle y, Handle x); extern Handle divLongWord(TaskData *taskData, Handle y, Handle x); extern Handle modLongWord(TaskData *taskData, Handle y, Handle x); extern Handle andbLongWord(TaskData *taskData, Handle y, Handle x); extern Handle orbLongWord(TaskData *taskData, Handle y, Handle x); extern Handle xorbLongWord(TaskData *taskData, Handle y, Handle x); extern Handle shiftLeftLongWord(TaskData *taskData, Handle y, Handle x); extern Handle shiftRightLongWord(TaskData *taskData, Handle y, Handle x); extern Handle shiftRightArithLongWord(TaskData *taskData, Handle y, Handle x); extern Handle longWordToTagged(TaskData *taskData, Handle x); extern Handle signedToLongWord(TaskData *taskData, Handle x); extern Handle unsignedToLongWord(TaskData *taskData, Handle x); extern Handle get_flags_c(TaskData *taskData, Handle addr_handle); extern Handle io_operation_c(TaskData *taskData, Handle entry); extern Handle full_gc_c(TaskData *taskData); extern Handle stack_trace_c(TaskData *taskData); extern Handle shrink_stack_c(TaskData *taskData, Handle reserved_space); #endif /* _RUNTIME_H_DEFINED */ polyml-5.6/libpolyml/save_vec.cpp000066400000000000000000000045551265146633400172250ustar00rootroot00000000000000/* Title: save_vec.cpp - The save vector holds temporary values that may move as the result of a garbage collection. Copyright (c) 2006, 2010 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #include "globals.h" #include "save_vec.h" #include "check_objects.h" #include "scanaddrs.h" #include "memmgr.h" #define SVEC_SIZE 1000 SaveVec::SaveVec() { save_vec = new SaveVecEntry[SVEC_SIZE]; save_vec_addr = save_vec; } SaveVec::~SaveVec() { delete[](save_vec); } // DCJM - I've used this in a few cases where we iterate over a list // and want to avoid overflowing the save vec. I've assumed that simply // resetting the list doesn't actually destroy the entry on the save vec // and it's safe to still use it provided that doesn't result in allocation. void SaveVec::reset(Handle old_value) { ASSERT(old_value >= save_vec && old_value <= save_vec_addr); save_vec_addr = old_value; } Handle SaveVec::push(PolyWord valu) /* Push a PolyWord onto the save vec. */ { ASSERT(save_vec_addr < save_vec+SVEC_SIZE); Check(valu); *save_vec_addr = SaveVecEntry(valu); return save_vec_addr++; } void SaveVec::gcScan(ScanAddress *process) /* Ensures that all the objects are retained and their addresses updated. */ { for (Handle sv = save_vec; sv < save_vec_addr; sv++) process->ScanRuntimeWord(&sv->m_Handle); } // We just have one of these. static SaveVec save; SaveVec *gSaveVec = &save; polyml-5.6/libpolyml/save_vec.h000066400000000000000000000051701265146633400166640ustar00rootroot00000000000000/* Title: save_vec.h - The save vector holds temporary values that may move as the result of a garbage collection. Copyright (c) 2006, 2010 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SAVE_VEC_H_DEFINED #define SAVE_VEC_H_DEFINED #include "globals.h" // For PolyWord /* A handle is the address of an element of save_vec */ /* This element points at an element of the Poly heap */ /* The element is currently represented as a (PolyWord *) */ class SaveVecEntry { public: SaveVecEntry(PolyWord w): m_Handle(w) {} SaveVecEntry(): m_Handle(PolyWord::FromUnsigned(0)) {} // Just used when initialising the vec PolyWord Word() { return m_Handle; } PolyObject *WordP() { return m_Handle.AsObjPtr(); } private: PolyWord m_Handle; friend class SaveVec; }; typedef SaveVecEntry *Handle; #define DEREFWORD(_x) ((_x)->Word()) #define DEREFHANDLE(_x) ((_x)->WordP()) #define DEREFWORDHANDLE(_x) ((_x)->WordP()) #define DEREFBYTEHANDLE(_x) ((byte *)DEREFHANDLE(_x)) #define DEREFLISTHANDLE(_x) ((ML_Cons_Cell *)DEREFHANDLE(_x)) #define DEREFEXNHANDLE(_x) ((poly_exn *)DEREFHANDLE(_x)) #define DEREFSTREAMHANDLE(_x) ((StreamToken*)DEREFHANDLE(_x)) class ScanAddress; class SaveVec { public: SaveVec(); ~SaveVec(); // Clear the save vec at the start of an RTS call void init(void) { save_vec_addr = save_vec; } // Add a word to the save vec Handle push(PolyWord valu); // Mark a position Handle mark(void) { return save_vec_addr; } // Reset to the mark void reset(Handle mark); bool isValidHandle(Handle h) { return h >= save_vec && h < save_vec_addr; } // Check it is in the range. // Called by the garbage collector to scan and then update the addresses in the // vector. void gcScan(ScanAddress *process); private: SaveVecEntry *save_vec; SaveVecEntry *save_vec_addr; }; #endif polyml-5.6/libpolyml/savestate.cpp000066400000000000000000001641531265146633400174320ustar00rootroot00000000000000/* Title: savestate.cpp - Save and Load state Copyright (c) 2007, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_WINDOWS_H #include // For MAX_PATH #endif #ifdef HAVE_SYS_PARAM_H #include // For MAX_PATH #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #else typedef char TCHAR; #define _T(x) x #define _tfopen fopen #define _tcscpy strcpy #define _tcsdup strdup #define _tcslen strlen #define _fputtc fputc #define _fputts fputs #ifndef lstrcmpi #define lstrcmpi strcasecmp #endif #endif #include "globals.h" #include "savestate.h" #include "processes.h" #include "run_time.h" #include "polystring.h" #include "scanaddrs.h" #include "arb.h" #include "memmgr.h" #include "mpoly.h" // For exportTimeStamp #include "exporter.h" // For CopyScan #include "machine_dep.h" #include "osmem.h" #include "gc.h" // For FullGC. #if(!defined(MAXPATHLEN) && defined(MAX_PATH)) #define MAXPATHLEN MAX_PATH #endif #ifdef _MSC_VER // Don't tell me about ISO C++ changes. #pragma warning(disable:4996) #endif // Helper class to close files on exit. class AutoClose { public: AutoClose(FILE *f = 0): m_file(f) {} ~AutoClose() { if (m_file) ::fclose(m_file); } operator FILE*() { return m_file; } FILE* operator = (FILE* p) { return (m_file = p); } private: FILE *m_file; }; // This is probably generally useful so may be moved into // a general header file. template class AutoFree { public: AutoFree(BASE p = 0): m_value(p) {} ~AutoFree() { free(m_value); } // Automatic conversions to the base type. operator BASE() { return m_value; } BASE operator = (BASE p) { return (m_value = p); } private: BASE m_value; }; /* * Structure definitions for the saved state files. */ #define SAVEDSTATESIGNATURE "POLYSAVE" #define SAVEDSTATEVERSION 1 // File header for a saved state file. This appears as the first entry // in the file. typedef struct _savedStateHeader { // These entries are primarily to check that we have a valid // saved state file before we try to interpret anything else. char headerSignature[8]; // Should contain SAVEDSTATESIGNATURE unsigned headerVersion; // Should contain SAVEDSTATEVERSION unsigned headerLength; // Number of bytes in the header unsigned segmentDescrLength; // Number of bytes in a descriptor // These entries contain the real data. off_t segmentDescr; // Position of segment descriptor table unsigned segmentDescrCount; // Number of segment descriptors in the table off_t stringTable; // Pointer to the string table (zero if none) size_t stringTableSize; // Size of string table unsigned parentNameEntry; // Position of parent name in string table (0 if top) time_t timeStamp; // The time stamp for this file. uintptr_t fileSignature; // The signature for this file. time_t parentTimeStamp; // The time stamp for the parent. uintptr_t parentSignature; // The signature for the parent. } SavedStateHeader; // Entry for segment table. This describes the segments on the disc that // need to be loaded into memory. typedef struct _savedStateSegmentDescr { off_t segmentData; // Position of the segment data size_t segmentSize; // Size of the segment data off_t relocations; // Position of the relocation table unsigned relocationCount; // Number of entries in relocation table unsigned relocationSize; // Size of a relocation entry unsigned segmentFlags; // Segment flags (see SSF_ values) unsigned segmentIndex; // The index of this segment or the segment it overwrites void *originalAddress; // The base address when the segment was written. } SavedStateSegmentDescr; #define SSF_WRITABLE 1 // The segment contains mutable data #define SSF_OVERWRITE 2 // The segment overwrites the data (mutable) in a parent. #define SSF_NOOVERWRITE 4 // The segment must not be further overwritten #define SSF_BYTES 8 // The segment containing only byte data typedef struct _relocationEntry { // Each entry indicates a location that has to be set to an address. // The location to be set is determined by adding "relocAddress" to the base address of // this segment (the one to which these relocations apply) and the value to store // by adding "targetAddress" to the base address of the segment indicated by "targetSegment". POLYUNSIGNED relocAddress; // The (byte) offset in this segment that we will set POLYUNSIGNED targetAddress; // The value to add to the base of the destination segment unsigned targetSegment; // The base segment. 0 is IO segment. ScanRelocationKind relKind; // The kind of relocation (processor dependent). } RelocationEntry; #define SAVE(x) taskData->saveVec.push(x) /* * Hierarchy table: contains information about last loaded or saved state. */ // Pointer to list of files loaded in last load. // There's no need for a lock since the update is only made when all // the ML threads have stopped. class HierarchyTable { public: HierarchyTable(const TCHAR *file, time_t time): fileName(_tcsdup(file)), timeStamp(time) { } AutoFree fileName; time_t timeStamp; }; HierarchyTable **hierarchyTable; static unsigned hierarchyDepth; static bool AddHierarchyEntry(const TCHAR *fileName, time_t timeStamp) { // Add an entry to the hierarchy table for this file. HierarchyTable *newEntry = new HierarchyTable(fileName, timeStamp); if (newEntry == 0) return false; HierarchyTable **newTable = (HierarchyTable **)realloc(hierarchyTable, sizeof(HierarchyTable *)*(hierarchyDepth+1)); if (newTable == 0) return false; hierarchyTable = newTable; hierarchyTable[hierarchyDepth++] = newEntry; return true; } // Test whether we're overwriting a parent of ourself. #ifdef _WIN32 static bool sameFile(const TCHAR *x, const TCHAR *y) { HANDLE hXFile = INVALID_HANDLE_VALUE, hYFile = INVALID_HANDLE_VALUE; bool result = false; hXFile = CreateFile(x, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hXFile == INVALID_HANDLE_VALUE) goto closeAndExit; hYFile = CreateFile(y, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hYFile == INVALID_HANDLE_VALUE) goto closeAndExit; BY_HANDLE_FILE_INFORMATION fileInfoX, fileInfoY; if (! GetFileInformationByHandle(hXFile, &fileInfoX)) goto closeAndExit; if (! GetFileInformationByHandle(hYFile, &fileInfoY)) goto closeAndExit; result = fileInfoX.dwVolumeSerialNumber == fileInfoY.dwVolumeSerialNumber && fileInfoX.nFileIndexLow == fileInfoY.nFileIndexLow && fileInfoX.nFileIndexHigh == fileInfoY.nFileIndexHigh; closeAndExit: if (hXFile != INVALID_HANDLE_VALUE) CloseHandle(hXFile); if (hYFile != INVALID_HANDLE_VALUE) CloseHandle(hYFile); return result; } #else static bool sameFile(const char *x, const char *y) { struct stat xStat, yStat; // If either file does not exist that's fine. if (stat(x, &xStat) != 0 || stat(y, &yStat) != 0) return false; return (xStat.st_dev == yStat.st_dev && xStat.st_ino == yStat.st_ino); } #endif /* * Saving state. */ // This class is used to create the relocations. It uses Exporter // for this but this may perhaps be too heavyweight. class SaveStateExport: public Exporter, public ScanAddress { public: SaveStateExport(unsigned int h=0): Exporter(h), relocationCount(0) {} public: virtual void exportStore(void) {} // Not used. private: // ScanAddress overrides virtual void ScanConstant(byte *addrOfConst, ScanRelocationKind code); // At the moment we should only get calls to ScanConstant. virtual PolyObject *ScanObjectAddress(PolyObject *base) { return base; } protected: void setRelocationAddress(void *p, POLYUNSIGNED *reloc); PolyWord createRelocation(PolyWord p, void *relocAddr); unsigned relocationCount; friend class SaveRequest; }; // Generate the address relative to the start of the segment. void SaveStateExport::setRelocationAddress(void *p, POLYUNSIGNED *reloc) { unsigned area = findArea(p); POLYUNSIGNED offset = (char*)p - (char*)memTable[area].mtAddr; *reloc = offset; } // Create a relocation entry for an address at a given location. PolyWord SaveStateExport::createRelocation(PolyWord p, void *relocAddr) { RelocationEntry reloc; // Set the offset within the section we're scanning. setRelocationAddress(relocAddr, &reloc.relocAddress); void *addr = p.AsAddress(); unsigned addrArea = findArea(addr); reloc.targetAddress = (char*)addr - (char*)memTable[addrArea].mtAddr; reloc.targetSegment = (unsigned)memTable[addrArea].mtIndex; reloc.relKind = PROCESS_RELOC_DIRECT; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; return p; // Don't change the contents } /* This is called for each constant within the code. Print a relocation entry for the word and return a value that means that the offset is saved in original word. */ void SaveStateExport::ScanConstant(byte *addr, ScanRelocationKind code) { PolyWord p = GetConstantValue(addr, code); if (IS_INT(p) || p == PolyWord::FromUnsigned(0)) return; void *a = p.AsAddress(); unsigned aArea = findArea(a); // We don't need a relocation if this is relative to the current segment // since the relative address will already be right. if (code == PROCESS_RELOC_I386RELATIVE && aArea == findArea(addr)) return; // Set the value at the address to the offset relative to the symbol. RelocationEntry reloc; setRelocationAddress(addr, &reloc.relocAddress); reloc.targetAddress = (char*)a - (char*)memTable[aArea].mtAddr; reloc.targetSegment = (unsigned)memTable[aArea].mtIndex; reloc.relKind = code; fwrite(&reloc, sizeof(reloc), 1, exportFile); relocationCount++; } // Request to the main thread to save data. class SaveRequest: public MainThreadRequest { public: SaveRequest(const TCHAR *name, unsigned h): MainThreadRequest(MTP_SAVESTATE), fileName(name), newHierarchy(h), errorMessage(0), errCode(0) {} virtual void Perform(); const TCHAR *fileName; unsigned newHierarchy; const char *errorMessage; int errCode; }; // This class is used to update references to objects that have moved. If // we have copied an object into the area to be exported we may still have references // to it from the stack or from RTS data structures. We have to ensure that these // are updated. // This is very similar to ProcessFixupAddress in sharedata.cpp class SaveFixupAddress: public ScanAddress { protected: virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); virtual PolyObject *ScanObjectAddress(PolyObject *base) { return GetNewAddress(base).AsObjPtr(); } PolyWord GetNewAddress(PolyWord old); }; POLYUNSIGNED SaveFixupAddress::ScanAddressAt(PolyWord *pt) { *pt = GetNewAddress(*pt); return 0; } // Returns the new address if the argument is the address of an object that // has moved, otherwise returns the original. PolyWord SaveFixupAddress::GetNewAddress(PolyWord old) { if (old.IsTagged() || old == PolyWord::FromUnsigned(0) || gMem.IsIOPointer(old.AsAddress())) return old; // Nothing to do. // When we are updating addresses in the stack or in code segments we may have // code pointers. if (old.IsCodePtr()) { // Find the start of the code segment PolyObject *oldObject = ObjCodePtrToPtr(old.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = old.AsCodePtr() - (byte*)oldObject; PolyWord newObject = GetNewAddress(oldObject); return PolyWord::FromCodePtr(newObject.AsCodePtr() + offset); } ASSERT(old.IsDataPtr()); PolyObject *obj = old.AsObjPtr(); if (obj->ContainsForwardingPtr()) // tombstone is a pointer to a moved object { PolyObject *newp = obj->GetForwardingPtr(); ASSERT (newp->ContainsNormalLengthWord()); return newp; } ASSERT (obj->ContainsNormalLengthWord()); // object is not moved return old; } // Called by the root thread to actually save the state and write the file. void SaveRequest::Perform() { // Check that we aren't overwriting our own parent. for (unsigned q = 0; q < newHierarchy-1; q++) { if (sameFile(hierarchyTable[q]->fileName, fileName)) { errorMessage = "File being saved is used as a parent of this file"; errCode = 0; return; } } SaveStateExport exports; // Open the file. This could quite reasonably fail if the path is wrong. exports.exportFile = _tfopen(fileName, _T("wb")); if (exports.exportFile == NULL) { errorMessage = "Cannot open save file"; errCode = errno; return; } // Scan over the permanent mutable area copying all reachable data that is // not in a lower hierarchy into new permanent segments. CopyScan copyScan(newHierarchy); copyScan.initialise(false); bool success = true; try { for (unsigned i = 0; i < gMem.npSpaces; i++) { PermanentMemSpace *space = gMem.pSpaces[i]; if (space->isMutable && ! space->noOverwrite && ! space->byteOnly) copyScan.ScanAddressesInRegion(space->bottom, space->top); } } catch (MemoryException &) { success = false; } // Copy the areas into the export object. Make sufficient space for // the largest possible number of entries. exports.memTable = new memoryTableEntry[gMem.neSpaces+gMem.npSpaces+1]; exports.ioMemEntry = 0; // The IO vector. unsigned memTableCount = 0; MemSpace *ioSpace = gMem.IoSpace(); exports.memTable[0].mtAddr = ioSpace->bottom; exports.memTable[0].mtLength = (char*)ioSpace->top - (char*)ioSpace->bottom; exports.memTable[0].mtFlags = 0; exports.memTable[0].mtIndex = 0; memTableCount++; // Permanent spaces at higher level. These have to have entries although // only the mutable entries will be written. for (unsigned w = 0; w < gMem.npSpaces; w++) { PermanentMemSpace *space = gMem.pSpaces[w]; if (space->hierarchy < newHierarchy) { memoryTableEntry *entry = &exports.memTable[memTableCount++]; entry->mtAddr = space->bottom; entry->mtLength = (space->topPointer-space->bottom)*sizeof(PolyWord); entry->mtIndex = space->index; if (space->isMutable) { entry->mtFlags = MTF_WRITEABLE; if (space->noOverwrite) entry->mtFlags |= MTF_NO_OVERWRITE; if (space->byteOnly) entry->mtFlags |= MTF_BYTES; } else entry->mtFlags = MTF_EXECUTABLE; } } unsigned permanentEntries = memTableCount; // Remember where new entries start. // Newly created spaces. for (unsigned i = 0; i < gMem.neSpaces; i++) { memoryTableEntry *entry = &exports.memTable[memTableCount++]; PermanentMemSpace *space = gMem.eSpaces[i]; entry->mtAddr = space->bottom; entry->mtLength = (space->topPointer-space->bottom)*sizeof(PolyWord); entry->mtIndex = space->index; if (space->isMutable) { entry->mtFlags = MTF_WRITEABLE; if (space->noOverwrite) entry->mtFlags |= MTF_NO_OVERWRITE; if (space->byteOnly) entry->mtFlags |= MTF_BYTES; } else entry->mtFlags = MTF_EXECUTABLE; } exports.memTableEntries = memTableCount; exports.ioSpacing = IO_SPACING; // Update references to moved objects. SaveFixupAddress fixup; for (unsigned l = 0; l < gMem.nlSpaces; l++) { LocalMemSpace *space = gMem.lSpaces[l]; fixup.ScanAddressesInRegion(space->bottom, space->lowerAllocPtr); fixup.ScanAddressesInRegion(space->upperAllocPtr, space->top); } GCModules(&fixup); // Update the global memory space table. Old segments at the same level // or lower are removed. The new segments become permanent. // Try to promote the spaces even if we've had a failure because export // spaces are deleted in ~CopyScan and we may have already copied // some objects there. if (! gMem.PromoteExportSpaces(newHierarchy) || ! success) { errorMessage = "Out of Memory"; errCode = ENOMEM; return; } // Remove any deeper entries from the hierarchy table. while (hierarchyDepth > newHierarchy-1) { hierarchyDepth--; delete(hierarchyTable[hierarchyDepth]); hierarchyTable[hierarchyDepth] = 0; } // Write out the file header. SavedStateHeader saveHeader; memset(&saveHeader, 0, sizeof(saveHeader)); saveHeader.headerLength = sizeof(saveHeader); strncpy(saveHeader.headerSignature, SAVEDSTATESIGNATURE, sizeof(saveHeader.headerSignature)); saveHeader.headerVersion = SAVEDSTATEVERSION; saveHeader.segmentDescrLength = sizeof(SavedStateSegmentDescr); if (newHierarchy == 1) saveHeader.parentTimeStamp = exportTimeStamp; else { saveHeader.parentTimeStamp = hierarchyTable[newHierarchy-2]->timeStamp; saveHeader.parentNameEntry = sizeof(TCHAR); // Always the first entry. } saveHeader.timeStamp = time(NULL); saveHeader.segmentDescrCount = exports.memTableEntries; // One segment for each space. // Write out the header. fwrite(&saveHeader, sizeof(saveHeader), 1, exports.exportFile); // We need a segment header for each permanent area whether it is // actually in this file or not. SavedStateSegmentDescr *descrs = new SavedStateSegmentDescr [exports.memTableEntries]; for (unsigned j = 0; j < exports.memTableEntries; j++) { memoryTableEntry *entry = &exports.memTable[j]; memset(&descrs[j], 0, sizeof(SavedStateSegmentDescr)); descrs[j].relocationSize = sizeof(RelocationEntry); descrs[j].segmentIndex = (unsigned)entry->mtIndex; descrs[j].segmentSize = entry->mtLength; // Set this even if we don't write it. descrs[j].originalAddress = entry->mtAddr; if (entry->mtFlags & MTF_WRITEABLE) { descrs[j].segmentFlags |= SSF_WRITABLE; if (entry->mtFlags & MTF_NO_OVERWRITE) descrs[j].segmentFlags |= SSF_NOOVERWRITE; if (j < permanentEntries && (entry->mtFlags & MTF_NO_OVERWRITE) == 0) descrs[j].segmentFlags |= SSF_OVERWRITE; if (entry->mtFlags & MTF_BYTES) descrs[j].segmentFlags |= SSF_BYTES; } } // Write out temporarily. Will be overwritten at the end. saveHeader.segmentDescr = ftell(exports.exportFile); fwrite(descrs, sizeof(SavedStateSegmentDescr), exports.memTableEntries, exports.exportFile); // Write out the relocations and the data. for (unsigned k = 1 /* Not IO area */; k < exports.memTableEntries; k++) { memoryTableEntry *entry = &exports.memTable[k]; // Write out the contents if this is new or if it is a normal, overwritable // mutable area. if (k >= permanentEntries || (entry->mtFlags & (MTF_WRITEABLE|MTF_NO_OVERWRITE)) == MTF_WRITEABLE) { descrs[k].relocations = ftell(exports.exportFile); // Have to write this out. exports.relocationCount = 0; // Create the relocation table. char *start = (char*)entry->mtAddr; char *end = start + entry->mtLength; for (PolyWord *p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); // Most relocations can be computed when the saved state is // loaded so we only write out the difficult ones: those that // occur within compiled code. // exports.relocateObject(obj); if (length != 0 && obj->IsCodeObject()) machineDependent->ScanConstantsWithinCode(obj, &exports); p += length; } descrs[k].relocationCount = exports.relocationCount; // Write out the data. descrs[k].segmentData = ftell(exports.exportFile); fwrite(entry->mtAddr, entry->mtLength, 1, exports.exportFile); } } // If this is a child we need to write a string table containing the parent name. if (newHierarchy > 1) { saveHeader.stringTable = ftell(exports.exportFile); _fputtc(0, exports.exportFile); // First byte of string table is zero _fputts(hierarchyTable[newHierarchy-2]->fileName, exports.exportFile); _fputtc(0, exports.exportFile); // A terminating null. saveHeader.stringTableSize = (_tcslen(hierarchyTable[newHierarchy-2]->fileName) + 2)*sizeof(TCHAR); } // Rewrite the header and the segment tables now they're complete. fseek(exports.exportFile, 0, SEEK_SET); fwrite(&saveHeader, sizeof(saveHeader), 1, exports.exportFile); fwrite(descrs, sizeof(SavedStateSegmentDescr), exports.memTableEntries, exports.exportFile); // Add an entry to the hierarchy table for this file. (void)AddHierarchyEntry(fileName, saveHeader.timeStamp); delete[](descrs); } Handle SaveState(TaskData *taskData, Handle args) { TCHAR fileNameBuff[MAXPATHLEN]; POLYUNSIGNED length = Poly_string_to_C(DEREFHANDLE(args)->Get(0), fileNameBuff, MAXPATHLEN); if (length > MAXPATHLEN) raise_syscall(taskData, "File name too long", ENAMETOOLONG); // The value of depth is zero for top-level save so we need to add one for hierarchy. unsigned newHierarchy = get_C_unsigned(taskData, DEREFHANDLE(args)->Get(1)) + 1; if (newHierarchy > hierarchyDepth+1) raise_fail(taskData, "Depth must be no more than the current hierarchy plus one"); // Request a full GC first. The main reason is to avoid running out of memory as a // result of repeated saves. Old export spaces are turned into local spaces and // the GC will delete them if they are completely empty FullGC(taskData); SaveRequest request(fileNameBuff, newHierarchy); processes->MakeRootRequest(taskData, &request); if (request.errorMessage) raise_syscall(taskData, request.errorMessage, request.errCode); return SAVE(TAGGED(0)); } /* * Loading saved state files. */ class StateLoader: public MainThreadRequest { public: StateLoader(bool isH, Handle files): MainThreadRequest(MTP_LOADSTATE), isHierarchy(isH), fileNameList(files), errorResult(0), errNumber(0) { } virtual void Perform(void); bool LoadFile(bool isInitial, time_t requiredStamp, PolyWord tail); bool isHierarchy; Handle fileNameList; const char *errorResult; // The fileName here is the last file loaded. As well as using it // to load the name can also be printed out at the end to identify the // particular file in the hierarchy that failed. TCHAR fileName[MAXPATHLEN]; int errNumber; }; // Called by the main thread once all the ML threads have stopped. void StateLoader::Perform(void) { // Copy the first file name into the buffer. if (isHierarchy) { if (ML_Cons_Cell::IsNull(fileNameList->Word())) { errorResult = "Hierarchy list is empty"; return; } ML_Cons_Cell *p = DEREFLISTHANDLE(fileNameList); POLYUNSIGNED length = Poly_string_to_C(p->h, fileName, MAXPATHLEN); if (length > MAXPATHLEN) { errorResult = "File name too long"; errNumber = ENAMETOOLONG; return; } (void)LoadFile(true, 0, p->t); } else { POLYUNSIGNED length = Poly_string_to_C(DEREFHANDLE(fileNameList), fileName, MAXPATHLEN); if (length > MAXPATHLEN) { errorResult = "File name too long"; errNumber = ENAMETOOLONG; return; } (void)LoadFile(true, 0, TAGGED(0)); } } // This class is used to relocate addresses in areas that have been loaded. class LoadRelocate { public: LoadRelocate(): descrs(0), targetAddresses(0), nDescrs(0), errorMessage(0) {} ~LoadRelocate(); void RelocateObject(PolyObject *p); void RelocateAddressAt(PolyWord *pt); SavedStateSegmentDescr *descrs; PolyWord **targetAddresses; unsigned nDescrs; const char *errorMessage; }; LoadRelocate::~LoadRelocate() { if (descrs) delete[](descrs); if (targetAddresses) delete[](targetAddresses); } // Update the addresses in a group of words. void LoadRelocate::RelocateAddressAt(PolyWord *pt) { PolyWord val = *pt; if (val.IsTagged()) return; // Which segment is this address in? unsigned i; for (i = 0; i < nDescrs; i++) { SavedStateSegmentDescr *descr = &descrs[i]; if (val.AsAddress() > descr->originalAddress && val.AsAddress() <= (char*)descr->originalAddress + descr->segmentSize) { // It's in this segment: relocate it to the current position. PolyWord *newAddress = targetAddresses[descr->segmentIndex]; ASSERT(newAddress != 0); byte *setAddress = (byte*)newAddress + ((char*)val.AsAddress() - (char*)descr->originalAddress); *pt = PolyWord::FromCodePtr(setAddress); break; } } if (i == nDescrs) { // Error: Not found. errorMessage = "Unmatched address"; } } // This is based on Exporter::relocateObject but does the reverse. // It attempts to adjust all the addresses in the object when it has // been read in. void LoadRelocate::RelocateObject(PolyObject *p) { if (p->IsByteObject()) { } else if (p->IsCodeObject()) { POLYUNSIGNED constCount; PolyWord *cp; ASSERT(! p->IsMutable() ); p->GetConstSegmentForCode(cp, constCount); /* Now the constant area. */ for (POLYUNSIGNED i = 0; i < constCount; i++) RelocateAddressAt(&(cp[i])); // N.B. This does not deal with constants within the code. These have // to be handled by real relocation entries. } else /* Ordinary objects, essentially tuples. */ { POLYUNSIGNED length = p->Length(); for (POLYUNSIGNED i = 0; i < length; i++) RelocateAddressAt(p->Offset(i)); } } // Load a saved state file. Calls itself to handle parent files. bool StateLoader::LoadFile(bool isInitial, time_t requiredStamp, PolyWord tail) { LoadRelocate relocate; AutoFree thisFile(_tcsdup(fileName)); AutoClose loadFile(_tfopen(fileName, _T("rb"))); if ((FILE*)loadFile == NULL) { errorResult = "Cannot open load file"; errNumber = errno; return false; } SavedStateHeader header; // Read the header and check the signature. if (fread(&header, sizeof(SavedStateHeader), 1, loadFile) != 1) { errorResult = "Unable to load header"; return false; } if (strncmp(header.headerSignature, SAVEDSTATESIGNATURE, sizeof(header.headerSignature)) != 0) { errorResult = "File is not a saved state"; return false; } if (header.headerVersion != SAVEDSTATEVERSION || header.headerLength != sizeof(SavedStateHeader) || header.segmentDescrLength != sizeof(SavedStateSegmentDescr)) { errorResult = "Unsupported version of saved state file"; return false; } // Check that we have the required stamp before loading any children. // If a parent has been overwritten we could get a loop. if (! isInitial && header.timeStamp != requiredStamp) { // Time-stamps don't match. errorResult = "The parent for this saved state does not match or has been changed"; return false; } // Have verified that this is a reasonable saved state file. If it isn't a // top-level file we have to load the parents first. if (header.parentNameEntry != 0) { if (isHierarchy) { // Take the file name from the list if (ML_Cons_Cell::IsNull(tail)) { errorResult = "Missing parent name in argument list"; return false; } ML_Cons_Cell *p = (ML_Cons_Cell *)tail.AsObjPtr(); POLYUNSIGNED length = Poly_string_to_C(p->h, fileName, MAXPATHLEN); if (length > MAXPATHLEN) { errorResult = "File name too long"; errNumber = ENAMETOOLONG; return false; } if (! LoadFile(false, header.parentTimeStamp, p->t)) return false; } else { size_t toRead = header.stringTableSize-header.parentNameEntry; if (MAXPATHLEN < toRead) toRead = MAXPATHLEN; if (header.parentNameEntry >= header.stringTableSize /* Bad entry */ || fseek(loadFile, header.stringTable + header.parentNameEntry, SEEK_SET) != 0 || fread(fileName, 1, toRead, loadFile) != toRead) { errorResult = "Unable to read parent file name"; return false; } fileName[toRead] = 0; // Should already be null-terminated, but just in case. if (! LoadFile(false, header.parentTimeStamp, TAGGED(0))) return false; } ASSERT(hierarchyDepth > 0 && hierarchyTable[hierarchyDepth-1] != 0); } else // Top-level file { if (isHierarchy && ! ML_Cons_Cell::IsNull(tail)) { // There should be no further file names if this is really the top. errorResult = "Too many file names in the list"; return false; } if (header.parentTimeStamp != exportTimeStamp) { // Time-stamp does not match executable. errorResult = "Saved state was exported from a different executable or the executable has changed"; return false; } // Any existing spaces at this level or greater must be turned // into local spaces. We may have references from the stack to objects that // have previously been imported but otherwise these spaces are no longer // needed. gMem.DemoteImportSpaces(); // Clean out the hierarchy table. for (unsigned h = 0; h < hierarchyDepth; h++) { delete(hierarchyTable[h]); hierarchyTable[h] = 0; } hierarchyDepth = 0; } // Now have a valid, matching saved state. // Load the segment descriptors. relocate.nDescrs = header.segmentDescrCount; relocate.descrs = new SavedStateSegmentDescr[relocate.nDescrs]; if (fseek(loadFile, header.segmentDescr, SEEK_SET) != 0 || fread(relocate.descrs, sizeof(SavedStateSegmentDescr), relocate.nDescrs, loadFile) != relocate.nDescrs) { errorResult = "Unable to read segment descriptors"; return false; } { unsigned maxIndex = 0; for (unsigned i = 0; i < relocate.nDescrs; i++) if (relocate.descrs[i].segmentIndex > maxIndex) maxIndex = relocate.descrs[i].segmentIndex; relocate.targetAddresses = new PolyWord*[maxIndex+1]; for (unsigned i = 0; i <= maxIndex; i++) relocate.targetAddresses[i] = 0; } // Read in and create the new segments first. If we have problems, // in particular if we have run out of memory, then it's easier to recover. for (unsigned i = 0; i < relocate.nDescrs; i++) { SavedStateSegmentDescr *descr = &relocate.descrs[i]; MemSpace *space = descr->segmentIndex == 0 ? gMem.IoSpace() : gMem.SpaceForIndex(descr->segmentIndex); if (space != NULL) relocate.targetAddresses[descr->segmentIndex] = space->bottom; if (descr->segmentData == 0) { // No data - just an entry in the index. if (space == NULL/* || descr->segmentSize != (size_t)((char*)space->top - (char*)space->bottom)*/) { errorResult = "Mismatch for existing memory space"; return false; } } else if ((descr->segmentFlags & SSF_OVERWRITE) == 0) { // New segment. if (space != NULL) { errorResult = "Segment already exists"; return false; } // Allocate memory for the new segment. size_t actualSize = descr->segmentSize; PolyWord *mem = (PolyWord*)osMemoryManager->Allocate(actualSize, PERMISSION_READ|PERMISSION_WRITE|PERMISSION_EXEC); if (mem == 0) { errorResult = "Unable to allocate memory"; return false; } if (fseek(loadFile, descr->segmentData, SEEK_SET) != 0 || fread(mem, descr->segmentSize, 1, loadFile) != 1) { errorResult = "Unable to read segment"; osMemoryManager->Free(mem, descr->segmentSize); return false; } // Fill unused space to the top of the area. gMem.FillUnusedSpace(mem+descr->segmentSize/sizeof(PolyWord), (actualSize-descr->segmentSize)/sizeof(PolyWord)); // At the moment we leave all segments with write access. unsigned mFlags = (descr->segmentFlags & SSF_WRITABLE ? MTF_WRITEABLE : 0) | (descr->segmentFlags & SSF_NOOVERWRITE ? MTF_NO_OVERWRITE : 0) | (descr->segmentFlags & SSF_BYTES ? MTF_BYTES : 0); PermanentMemSpace *newSpace = gMem.NewPermanentSpace(mem, actualSize / sizeof(PolyWord), mFlags, descr->segmentIndex, hierarchyDepth+1); relocate.targetAddresses[descr->segmentIndex] = mem; if (newSpace->isMutable && newSpace->byteOnly) { ClearWeakByteRef cwbr; cwbr.ScanAddressesInRegion(newSpace->bottom, newSpace->topPointer); } } } // Now read in the mutable overwrites and relocate. for (unsigned j = 0; j < relocate.nDescrs; j++) { SavedStateSegmentDescr *descr = &relocate.descrs[j]; MemSpace *space = descr->segmentIndex == 0 ? gMem.IoSpace() : gMem.SpaceForIndex(descr->segmentIndex); ASSERT(space != NULL); // We should have created it. if (descr->segmentFlags & SSF_OVERWRITE) { if (fseek(loadFile, descr->segmentData, SEEK_SET) != 0 || fread(space->bottom, descr->segmentSize, 1, loadFile) != 1) { errorResult = "Unable to read segment"; return false; } } // Relocation. if (descr->segmentData != 0) { // Adjust the addresses in the loaded segment. for (PolyWord *p = space->bottom; p < space->top; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); relocate.RelocateObject(obj); p += length; } } // Process explicit relocations. // If we get errors just skip the error and continue rather than leave // everything in an unstable state. if (descr->relocations) { if (fseek(loadFile, descr->relocations, SEEK_SET) != 0) { errorResult = "Unable to read relocation segment"; } for (unsigned k = 0; k < descr->relocationCount; k++) { RelocationEntry reloc; if (fread(&reloc, sizeof(reloc), 1, loadFile) != 1) { errorResult = "Unable to read relocation segment"; } MemSpace *toSpace = reloc.targetSegment == 0 ? gMem.IoSpace() : gMem.SpaceForIndex(reloc.targetSegment); if (toSpace == NULL) { errorResult = "Unknown space reference in relocation"; continue; } byte *setAddress = (byte*)space->bottom + reloc.relocAddress; byte *targetAddress = (byte*)toSpace->bottom + reloc.targetAddress; if (setAddress >= (byte*)space->top || targetAddress >= (byte*)toSpace->top) { errorResult = "Bad relocation"; continue; } ScanAddress::SetConstantValue(setAddress, PolyWord::FromCodePtr(targetAddress), reloc.relKind); } } } // Add an entry to the hierarchy table for this file. if (! AddHierarchyEntry(thisFile, header.timeStamp)) return false; return true; // Succeeded } Handle LoadState(TaskData *taskData, bool isHierarchy, Handle hFileList) // Load a saved state or a hierarchy. // hFileList is a list if this is a hierarchy and a single name if it is not. { StateLoader loader(isHierarchy, hFileList); // Request the main thread to do the load. This may set the error string if it failed. processes->MakeRootRequest(taskData, &loader); if (loader.errorResult != 0) { if (loader.errNumber == 0) raise_fail(taskData, loader.errorResult); else { char buff[MAXPATHLEN+100]; #if (defined(_WIN32) && defined(UNICODE)) sprintf(buff, "%s: %S", loader.errorResult, loader.fileName); #else sprintf(buff, "%s: %s", loader.errorResult, loader.fileName); #endif raise_syscall(taskData, buff, loader.errNumber); } } return SAVE(TAGGED(0)); } /* * Additional functions to provide information or change saved-state files. */ // These functions do not affect the global state so can be executed by // the ML threads directly. Handle ShowHierarchy(TaskData *taskData) // Return the list of files in the hierarchy. { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); // Process this in reverse order. for (unsigned i = hierarchyDepth; i > 0; i--) { Handle value = SAVE(C_string_to_Poly(taskData, hierarchyTable[i-1]->fileName)); Handle next = alloc_and_save(taskData, sizeof(ML_Cons_Cell)/sizeof(PolyWord)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } Handle RenameParent(TaskData *taskData, Handle args) // Change the name of the immediate parent stored in a child { TCHAR fileNameBuff[MAXPATHLEN], parentNameBuff[MAXPATHLEN]; // The name of the file to modify. POLYUNSIGNED fileLength = Poly_string_to_C(DEREFHANDLE(args)->Get(0), fileNameBuff, MAXPATHLEN); if (fileLength > MAXPATHLEN) raise_syscall(taskData, "File name too long", ENAMETOOLONG); // The new parent name to insert. POLYUNSIGNED parentLength = Poly_string_to_C(DEREFHANDLE(args)->Get(1), parentNameBuff, MAXPATHLEN); if (parentLength > MAXPATHLEN) raise_syscall(taskData, "Parent name too long", ENAMETOOLONG); AutoClose loadFile(_tfopen(fileNameBuff, _T("r+b"))); // Open for reading and writing if ((FILE*)loadFile == NULL) { char buff[MAXPATHLEN+1+23]; #if (defined(_WIN32) && defined(UNICODE)) sprintf(buff, "Cannot open load file: %S", fileNameBuff); #else sprintf(buff, "Cannot open load file: %s", fileNameBuff); #endif raise_syscall(taskData, buff, errno); } SavedStateHeader header; // Read the header and check the signature. if (fread(&header, sizeof(SavedStateHeader), 1, loadFile) != 1) raise_fail(taskData, "Unable to load header"); if (strncmp(header.headerSignature, SAVEDSTATESIGNATURE, sizeof(header.headerSignature)) != 0) raise_fail(taskData, "File is not a saved state"); if (header.headerVersion != SAVEDSTATEVERSION || header.headerLength != sizeof(SavedStateHeader) || header.segmentDescrLength != sizeof(SavedStateSegmentDescr)) { raise_fail(taskData, "Unsupported version of saved state file"); } // Does this actually have a parent? if (header.parentNameEntry == 0) raise_fail(taskData, "File does not have a parent"); // At the moment the only entry in the string table is the parent // name so we can simply write a new one on the end of the file. // This makes the file grow slightly each time but it shouldn't be // significant. fseek(loadFile, 0, SEEK_END); header.stringTable = ftell(loadFile); // Remember where this is _fputtc(0, loadFile); // First byte of string table is zero _fputts(parentNameBuff, loadFile); _fputtc(0, loadFile); // A terminating null. header.stringTableSize = (_tcslen(parentNameBuff) + 2)*sizeof(TCHAR); // Now rewind and write the header with the revised string table. fseek(loadFile, 0, SEEK_SET); fwrite(&header, sizeof(header), 1, loadFile); return SAVE(TAGGED(0)); } Handle ShowParent(TaskData *taskData, Handle hFileName) // Return the name of the immediate parent stored in a child { TCHAR fileNameBuff[MAXPATHLEN+1]; POLYUNSIGNED length = Poly_string_to_C(DEREFHANDLE(hFileName), fileNameBuff, MAXPATHLEN); if (length > MAXPATHLEN) raise_syscall(taskData, "File name too long", ENAMETOOLONG); AutoClose loadFile(_tfopen(fileNameBuff, _T("rb"))); if ((FILE*)loadFile == NULL) { char buff[MAXPATHLEN+1+23]; #if (defined(_WIN32) && defined(UNICODE)) sprintf(buff, "Cannot open load file: %S", fileNameBuff); #else sprintf(buff, "Cannot open load file: %s", fileNameBuff); #endif raise_syscall(taskData, buff, errno); } SavedStateHeader header; // Read the header and check the signature. if (fread(&header, sizeof(SavedStateHeader), 1, loadFile) != 1) raise_fail(taskData, "Unable to load header"); if (strncmp(header.headerSignature, SAVEDSTATESIGNATURE, sizeof(header.headerSignature)) != 0) raise_fail(taskData, "File is not a saved state"); if (header.headerVersion != SAVEDSTATEVERSION || header.headerLength != sizeof(SavedStateHeader) || header.segmentDescrLength != sizeof(SavedStateSegmentDescr)) { raise_fail(taskData, "Unsupported version of saved state file"); } // Does this have a parent? if (header.parentNameEntry != 0) { TCHAR parentFileName[MAXPATHLEN+1]; size_t toRead = header.stringTableSize-header.parentNameEntry; if (MAXPATHLEN < toRead) toRead = MAXPATHLEN; if (header.parentNameEntry >= header.stringTableSize /* Bad entry */ || fseek(loadFile, header.stringTable + header.parentNameEntry, SEEK_SET) != 0 || fread(parentFileName, 1, toRead, loadFile) != toRead) { raise_fail(taskData, "Unable to read parent file name"); } parentFileName[toRead] = 0; // Should already be null-terminated, but just in case. // Convert the name into a Poly string and then build a "Some" value. // It's possible, although silly, to have the empty string as a parent name. Handle resVal = SAVE(C_string_to_Poly(taskData, parentFileName)); Handle result = alloc_and_save(taskData, 1); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(resVal)); return result; } else return SAVE(NONE_VALUE); } // Module system #define MODULESIGNATURE "POLYMODU" #define MODULEVERSION 1 typedef struct _moduleHeader { // These entries are primarily to check that we have a valid // saved state file before we try to interpret anything else. char headerSignature[8]; // Should contain MODULESIGNATURE unsigned headerVersion; // Should contain MODULEVERSION unsigned headerLength; // Number of bytes in the header unsigned segmentDescrLength; // Number of bytes in a descriptor // These entries contain the real data. off_t segmentDescr; // Position of segment descriptor table unsigned segmentDescrCount; // Number of segment descriptors in the table off_t stringTable; // Pointer to the string table (zero if none) size_t stringTableSize; // Size of string table time_t timeStamp; // The time stamp for this file. uintptr_t fileSignature; // The signature for this file. time_t executableTimeStamp; // The time stamp for the parent executable. // Root uintptr_t rootSegment; POLYUNSIGNED rootOffset; } ModuleHeader; // Store a module class ModuleStorer: public MainThreadRequest { public: ModuleStorer(const TCHAR *file, Handle r): MainThreadRequest(MTP_STOREMODULE), fileName(file), root(r), errorMessage(0), errCode(0) {} virtual void Perform(); const TCHAR *fileName; Handle root; const char *errorMessage; int errCode; }; class ModuleExport: public SaveStateExport { public: ModuleExport(): SaveStateExport(1/* Everything EXCEPT the executable. */) {} virtual void exportStore(void); // Write the data out. }; void ModuleStorer::Perform() { ModuleExport exporter; #if (defined(_WIN32) && defined(UNICODE)) exporter.exportFile = _wfopen(fileName, L"wb"); #else exporter.exportFile = fopen(fileName, "wb"); #endif if (exporter.exportFile == NULL) { errorMessage = "Cannot open export file"; errCode = errno; return; } // RunExport copies everything reachable from the root, except data from // the executable because we've set the hierarchy to 1, using CopyScan. // It builds the tables in the export data structure then calls exportStore // to actually write the data. exporter.RunExport(root->WordP()); errorMessage = exporter.errorMessage; // This will be null unless there's been an error. } void ModuleExport::exportStore(void) { // What we need to do here is implement the export in a similar way to e.g. PECOFFExport::exportStore // This is copied from SaveRequest::Perform and should be common code. ModuleHeader modHeader; memset(&modHeader, 0, sizeof(modHeader)); modHeader.headerLength = sizeof(modHeader); strncpy(modHeader.headerSignature, MODULESIGNATURE, sizeof(modHeader.headerSignature)); modHeader.headerVersion = MODULEVERSION; modHeader.segmentDescrLength = sizeof(SavedStateSegmentDescr); modHeader.executableTimeStamp = exportTimeStamp; { unsigned rootArea = findArea(this->rootFunction); struct _memTableEntry *mt = &memTable[rootArea]; modHeader.rootSegment = mt->mtIndex; modHeader.rootOffset = (char*)this->rootFunction - (char*)mt->mtAddr; } modHeader.timeStamp = time(NULL); modHeader.segmentDescrCount = this->memTableEntries; // One segment for each space. // Write out the header. fwrite(&modHeader, sizeof(modHeader), 1, this->exportFile); SavedStateSegmentDescr *descrs = new SavedStateSegmentDescr [this->memTableEntries]; // We need an entry in the descriptor tables for each segment in the executable because // we may have relocations that refer to addresses in it. for (unsigned j = 0; j < this->memTableEntries; j++) { SavedStateSegmentDescr *thisDescr = &descrs[j]; memoryTableEntry *entry = &this->memTable[j]; memset(thisDescr, 0, sizeof(SavedStateSegmentDescr)); thisDescr->relocationSize = sizeof(RelocationEntry); thisDescr->segmentIndex = (unsigned)entry->mtIndex; thisDescr->segmentSize = entry->mtLength; // Set this even if we don't write it. thisDescr->originalAddress = entry->mtAddr; if (entry->mtFlags & MTF_WRITEABLE) { thisDescr->segmentFlags |= SSF_WRITABLE; if (entry->mtFlags & MTF_NO_OVERWRITE) thisDescr->segmentFlags |= SSF_NOOVERWRITE; if ((entry->mtFlags & MTF_NO_OVERWRITE) == 0) thisDescr->segmentFlags |= SSF_OVERWRITE; if (entry->mtFlags & MTF_BYTES) thisDescr->segmentFlags |= SSF_BYTES; } } // Write out temporarily. Will be overwritten at the end. modHeader.segmentDescr = ftell(this->exportFile); fwrite(descrs, sizeof(SavedStateSegmentDescr), this->memTableEntries, this->exportFile); // Write out the relocations and the data. for (unsigned k = 0; k < this->memTableEntries; k++) { SavedStateSegmentDescr *thisDescr = &descrs[k]; memoryTableEntry *entry = &this->memTable[k]; if (k >= newAreas) // Not permanent areas { thisDescr->relocations = ftell(this->exportFile); // Have to write this out. this->relocationCount = 0; // Create the relocation table. char *start = (char*)entry->mtAddr; char *end = start + entry->mtLength; for (PolyWord *p = (PolyWord*)start; p < (PolyWord*)end; ) { p++; PolyObject *obj = (PolyObject*)p; POLYUNSIGNED length = obj->Length(); // For saved states we don't include explicit relocations except // in code but it's easier if we do for modules. if (length != 0 && obj->IsCodeObject()) machineDependent->ScanConstantsWithinCode(obj, this); relocateObject(obj); p += length; } thisDescr->relocationCount = this->relocationCount; // Write out the data. thisDescr->segmentData = ftell(exportFile); fwrite(entry->mtAddr, entry->mtLength, 1, exportFile); } } // Rewrite the header and the segment tables now they're complete. fseek(exportFile, 0, SEEK_SET); fwrite(&modHeader, sizeof(modHeader), 1, exportFile); fwrite(descrs, sizeof(SavedStateSegmentDescr), this->memTableEntries, exportFile); delete[](descrs); fclose(exportFile); exportFile = NULL; } Handle StoreModule(TaskData *taskData, Handle args) { TempString fileName(args->WordP()->Get(0)); ModuleStorer storer(fileName, SAVE(args->WordP()->Get(1))); processes->MakeRootRequest(taskData, &storer); if (storer.errorMessage) raise_syscall(taskData, storer.errorMessage, storer.errCode); return SAVE(TAGGED(0)); } // Load a module. class ModuleLoader: public MainThreadRequest { public: ModuleLoader(TaskData *taskData, const TCHAR *file): MainThreadRequest(MTP_LOADMODULE), callerTaskData(taskData), fileName(file), errorResult(NULL), errNumber(0), rootHandle(0) {} virtual void Perform(); TaskData *callerTaskData; const TCHAR *fileName; const char *errorResult; int errNumber; Handle rootHandle; }; void ModuleLoader::Perform() { AutoClose loadFile(_tfopen(fileName, _T("rb"))); if ((FILE*)loadFile == NULL) { errorResult = "Cannot open load file"; errNumber = errno; return; } ModuleHeader header; // Read the header and check the signature. if (fread(&header, sizeof(ModuleHeader), 1, loadFile) != 1) { errorResult = "Unable to load header"; return; } if (strncmp(header.headerSignature, MODULESIGNATURE, sizeof(header.headerSignature)) != 0) { errorResult = "File is not a Poly/ML module"; return; } if (header.headerVersion != MODULEVERSION || header.headerLength != sizeof(ModuleHeader) || header.segmentDescrLength != sizeof(SavedStateSegmentDescr)) { errorResult = "Unsupported version of module file"; return; } if (header.executableTimeStamp != exportTimeStamp) { // Time-stamp does not match executable. errorResult = "Module was exported from a different executable or the executable has changed"; return; } LoadRelocate relocate; relocate.nDescrs = header.segmentDescrCount; relocate.descrs = new SavedStateSegmentDescr[relocate.nDescrs]; if (fseek(loadFile, header.segmentDescr, SEEK_SET) != 0 || fread(relocate.descrs, sizeof(SavedStateSegmentDescr), relocate.nDescrs, loadFile) != relocate.nDescrs) { errorResult = "Unable to read segment descriptors"; return; } { unsigned maxIndex = 0; for (unsigned i = 0; i < relocate.nDescrs; i++) if (relocate.descrs[i].segmentIndex > maxIndex) maxIndex = relocate.descrs[i].segmentIndex; relocate.targetAddresses = new PolyWord*[maxIndex+1]; for (unsigned i = 0; i <= maxIndex; i++) relocate.targetAddresses[i] = 0; } // Read in and create the new segments first. If we have problems, // in particular if we have run out of memory, then it's easier to recover. for (unsigned i = 0; i < relocate.nDescrs; i++) { SavedStateSegmentDescr *descr = &relocate.descrs[i]; MemSpace *space = descr->segmentIndex == 0 ? gMem.IoSpace() : gMem.SpaceForIndex(descr->segmentIndex); if (descr->segmentData == 0) { // No data - just an entry in the index. if (space == NULL/* || descr->segmentSize != (size_t)((char*)space->top - (char*)space->bottom)*/) { errorResult = "Mismatch for existing memory space"; return; } else relocate.targetAddresses[descr->segmentIndex] = space->bottom; } else { // New segment. if (space != NULL) { errorResult = "Segment already exists"; return; } // Allocate memory for the new segment. size_t actualSize = descr->segmentSize; LocalMemSpace *space = gMem.NewLocalSpace(actualSize, descr->segmentFlags & SSF_WRITABLE); if (space == 0) { errorResult = "Unable to allocate memory"; return; } if (fseek(loadFile, descr->segmentData, SEEK_SET) != 0 || fread(space->bottom, descr->segmentSize, 1, loadFile) != 1) { errorResult = "Unable to read segment"; return; } space->lowerAllocPtr = (PolyWord*)((byte*)space->bottom + descr->segmentSize); relocate.targetAddresses[descr->segmentIndex] = space->bottom; if (space->isMutable && (descr->segmentFlags & SSF_BYTES) != 0) { ClearWeakByteRef cwbr; cwbr.ScanAddressesInRegion(space->bottom, space->lowerAllocPtr); } } } // Now deal with relocation. for (unsigned j = 0; j < relocate.nDescrs; j++) { SavedStateSegmentDescr *descr = &relocate.descrs[j]; PolyWord *baseAddr = relocate.targetAddresses[descr->segmentIndex]; ASSERT(baseAddr != NULL); // We should have created it. // Process explicit relocations. // If we get errors just skip the error and continue rather than leave // everything in an unstable state. if (descr->relocations) { if (fseek(loadFile, descr->relocations, SEEK_SET) != 0) errorResult = "Unable to read relocation segment"; for (unsigned k = 0; k < descr->relocationCount; k++) { RelocationEntry reloc; if (fread(&reloc, sizeof(reloc), 1, loadFile) != 1) errorResult = "Unable to read relocation segment"; byte *setAddress = (byte*)baseAddr + reloc.relocAddress; byte *targetAddress = (byte*)relocate.targetAddresses[reloc.targetSegment] + reloc.targetAddress; ScanAddress::SetConstantValue(setAddress, PolyWord::FromCodePtr(targetAddress), reloc.relKind); } } } // Get the root address. Push this to the caller's save vec. If we put the // newly created areas into local memory we could get a GC as soon as we // complete this root request. { PolyWord *baseAddr = relocate.targetAddresses[header.rootSegment]; rootHandle = callerTaskData->saveVec.push((PolyObject*)((byte*)baseAddr + header.rootOffset)); } } Handle LoadModule(TaskData *taskData, Handle args) { TempString fileName(args->Word()); ModuleLoader loader(taskData, fileName); processes->MakeRootRequest(taskData, &loader); if (loader.errorResult != 0) { if (loader.errNumber == 0) raise_fail(taskData, loader.errorResult); else { char buff[MAXPATHLEN+100]; #if (defined(_WIN32) && defined(UNICODE)) sprintf(buff, "%s: %S", loader.errorResult, loader.fileName); #else sprintf(buff, "%s: %s", loader.errorResult, loader.fileName); #endif raise_syscall(taskData, buff, loader.errNumber); } } return loader.rootHandle; } polyml-5.6/libpolyml/savestate.h000066400000000000000000000030501265146633400170630ustar00rootroot00000000000000/* Title: savestate.h - Save and Load state Copyright (c) 2007, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SAVESTATE_H_INCLUDED #define SAVESTATE_H_INCLUDED class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; // Write a saved state file. Handle SaveState(TaskData *taskData, Handle args); // Load a saved state file and any ancestors. Handle LoadState(TaskData *taskData, bool isHierarchy, Handle hFileName); // Show the hierarchy. Handle ShowHierarchy(TaskData *taskData); // Change the name of the immediate parent stored in a child Handle RenameParent(TaskData *taskData, Handle args); // Return the name of the immediate parent stored in a child Handle ShowParent(TaskData *taskData, Handle hFileName); // Write out a module. Handle StoreModule(TaskData *taskData, Handle args); // Load a module. Handle LoadModule(TaskData *taskData, Handle args); #endif polyml-5.6/libpolyml/scanaddrs.cpp000066400000000000000000000470031265146633400173670ustar00rootroot00000000000000/* Title: Address scanner Copyright (c) 2006-8, 2012 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #include #include "globals.h" #include "scanaddrs.h" #include "machine_dep.h" #include "check_objects.h" #include "diagnostics.h" #include "memmgr.h" // Process the value at a given location and update it as necessary. POLYUNSIGNED ScanAddress::ScanAddressAt(PolyWord *pt) { PolyWord val = *pt; PolyWord newVal = val; if (IS_INT(val) || val == PolyWord::FromUnsigned(0)) { // We can get zeros in the constant area if we garbage collect // while compiling some code. */ } else if (val.IsCodePtr()) { // We can get code pointers either in the stack as return addresses or // handler pointers or in constants in code segments as the addresses of // exception handlers. // Find the start of the code segment PolyObject *oldObject = ObjCodePtrToPtr(val.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = val.AsCodePtr() - (byte*)oldObject; // Mustn't use ScanAddressAt here. That's only valid if the value points // into the area being updated. PolyObject *newObject = ScanObjectAddress(oldObject); newVal = PolyWord::FromCodePtr((byte*)newObject + offset); } else { ASSERT(OBJ_IS_DATAPTR(val)); // Database pointer, local pointer or IO pointer. // We need to include IO area pointers when we produce an object module. newVal = ScanObjectAddress(val.AsObjPtr()); } if (newVal != val) // Only update if we need to. *pt = newVal; return 0; } // Process a value within the stack. PolyWord ScanAddress::ScanStackAddress(PolyWord val, StackSpace *stack, bool isCode) { PolyWord *base = stack->bottom; PolyWord *end = stack->top; // If isCode is set we definitely have a code address. It may have the // bottom bit set or it may be word aligned. if (isCode || val.IsCodePtr()) { /* Find the start of the code segment */ PolyObject *oldObject = ObjCodePtrToPtr(val.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = val.AsCodePtr() - (byte*)oldObject; PolyObject *newObject = ScanObjectAddress(oldObject); return PolyWord::FromCodePtr((byte*)newObject + offset); } else if (val.IsTagged() || val == PolyWord::FromUnsigned(0) || (val.AsAddress() > base && val.AsAddress() <= end)) /* We don't need to process tagged integers (now we've checked it isn't a code address) and we don't need to process addresses within the current stack. */ /* N.B. We have "<= end" rather than "< end" because it is possible for the stack to be completely empty on a terminated thread. */ return val; else { ASSERT(val.IsDataPtr()); return ScanObjectAddress(val.AsObjPtr()); } } // General purpose object processor, Processes all the addresses in an object. // Handles the various kinds of object that may contain addresses. void ScanAddress::ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED lengthWord) { do { ASSERT (OBJ_IS_LENGTH(lengthWord)); if (OBJ_IS_BYTE_OBJECT(lengthWord)) return; /* Nothing more to do */ POLYUNSIGNED length = OBJ_OBJECT_LENGTH(lengthWord); PolyWord *baseAddr = (PolyWord*)obj; if (OBJ_IS_CODE_OBJECT(lengthWord)) { // Scan constants within the code. machineDependent->ScanConstantsWithinCode(obj, obj, length, this); // Skip to the constants and get ready to scan them. obj->GetConstSegmentForCode(length, baseAddr, length); } // else it's a normal object, PolyWord *endWord = baseAddr + length; // We want to minimise the actual recursion we perform so we try to // use tail recursion if we can. We first scan from the end and // remove any words that don't need recursion. POLYUNSIGNED lastLengthWord = 0; while (endWord != baseAddr) { PolyWord wordAt = endWord[-1]; if (IS_INT(wordAt) || wordAt == PolyWord::FromUnsigned(0)) endWord--; // Don't need to look at this. else if ((lastLengthWord = ScanAddressAt(endWord-1)) != 0) // We need to process this one break; else endWord--; // We're not interested in this. } if (endWord == baseAddr) return; // We've done everything. // There is at least one word that needs to be processed, the // one at endWord-1. // Now process from the beginning forward to see if there are // any words before this that need to be handled. This way we are more // likely to handle the head of a list by recursion and the // tail by looping (tail recursion). while (baseAddr < endWord-1) { PolyWord wordAt = *baseAddr; if (IS_INT(wordAt) || wordAt == PolyWord::FromUnsigned(0)) baseAddr++; // Don't need to look at this. else { POLYUNSIGNED lengthWord = ScanAddressAt(baseAddr); if (lengthWord != 0) { wordAt = *baseAddr; // Reload because it may have been side-effected // We really have to process this recursively. if (wordAt.IsCodePtr()) ScanAddressesInObject(ObjCodePtrToPtr(wordAt.AsCodePtr()), lengthWord); else ScanAddressesInObject(wordAt.AsObjPtr(), lengthWord); baseAddr++; } else baseAddr++; } } // Finally process the last word we found that has to be processed. // Do this by looping rather than recursion. PolyWord wordAt = *baseAddr; // Last word to do. // This must be an address if (wordAt.IsCodePtr()) obj = ObjCodePtrToPtr(wordAt.AsCodePtr()); else obj = wordAt.AsObjPtr(); lengthWord = lastLengthWord; } while(1); } void ScanAddress::ScanAddressesInRegion(PolyWord *region, PolyWord *end) { PolyWord *pt = region; while (pt < end) { pt++; // Skip length word. // pt actually points AT the object here. PolyObject *obj = (PolyObject*)pt; if (obj->ContainsForwardingPtr()) /* skip over moved object */ { // We can now get multiple forwarding pointers as a result // of applying ShareData repeatedly. Perhaps we should // turn the forwarding pointers back into normal words in // an extra pass. while (obj->ContainsForwardingPtr()) obj = obj->GetForwardingPtr(); ASSERT(obj->ContainsNormalLengthWord()); CheckObject(obj); pt += obj->Length(); } else { ASSERT(obj->ContainsNormalLengthWord()); POLYUNSIGNED length = obj->Length(); if (pt+length > end) Crash("Malformed object at %p - length %lu\n", pt, length); if (length != 0) ScanAddressesInObject(obj); pt += length; } } } // Extract a constant from the code. PolyWord ScanAddress::GetConstantValue(byte *addressOfConstant, ScanRelocationKind code) { switch (code) { case PROCESS_RELOC_DIRECT: // 32 or 64 bit address of target { POLYUNSIGNED valu; unsigned i; byte *pt = addressOfConstant; if (pt[3] & 0x80) valu = 0-1; else valu = 0; for (i = sizeof(PolyWord); i > 0; i--) valu = (valu << 8) | pt[i-1]; /* The old code generator generated reverse subtraction of words using a move immediate which loaded a register with a the tagged value plus one. In practice the only reverse subtraction of a constant is 0-x so for backwards compatibility we need to treat 2 specially. */ ASSERT(valu != 2); return PolyWord::FromUnsigned(valu); } case PROCESS_RELOC_I386RELATIVE: // 32 bit relative address { POLYSIGNED disp; byte *pt = addressOfConstant; // Get the displacement. This is signed. if (pt[3] & 0x80) disp = -1; else disp = 0; // Set the sign just in case. for(unsigned i = 4; i > 0; i--) disp = (disp << 8) | pt[i-1]; byte *absAddr = pt + disp + 4; // The address is relative to AFTER the constant return PolyWord::FromCodePtr(absAddr); } default: ASSERT(false); return TAGGED(0); } } // Store a constant value. Also used with a patch table when importing a saved heap which has // been exported using the C exporter. void ScanAddress::SetConstantValue(byte *addressOfConstant, PolyWord p, ScanRelocationKind code) { switch (code) { case PROCESS_RELOC_DIRECT: // 32 or 64 bit address of target { POLYUNSIGNED valu = p.AsUnsigned(); for (unsigned i = 0; i < sizeof(PolyWord); i++) { addressOfConstant[i] = (byte)(valu & 255); valu >>= 8; } } break; case PROCESS_RELOC_I386RELATIVE: // 32 bit relative address { POLYSIGNED newDisp = p.AsCodePtr() - addressOfConstant - 4; #if (SIZEOF_VOIDP != 4) ASSERT(newDisp < 0x80000000 && newDisp >= -(POLYSIGNED)0x80000000); #endif for (unsigned i = 0; i < 4; i++) { addressOfConstant[i] = (byte)(newDisp & 0xff); newDisp >>= 8; } } break; } } // The default action is to call the DEFAULT ScanAddressAt NOT the virtual which means that it calls // ScanObjectAddress for the base address of the object referred to. void ScanAddress::ScanConstant(byte *addressOfConstant, ScanRelocationKind code) { PolyWord p = GetConstantValue(addressOfConstant, code); if (! IS_INT(p)) { PolyWord oldValue = p; ScanAddress::ScanAddressAt(&p); if (p != oldValue) // Update it if it has changed. SetConstantValue(addressOfConstant, p, code); } } void ScanAddress::ScanRuntimeWord(PolyWord *w) { if (w->IsTagged()) {} // Don't need to do anything else if (w->IsCodePtr()) { // We can have code pointers in set_code_address. // Find the start of the code segment PolyObject *obj = ObjCodePtrToPtr(w->AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = w->AsCodePtr() - (byte*)obj; obj = ScanObjectAddress(obj); *w = PolyWord::FromCodePtr((byte*)obj + offset); } else { ASSERT(w->IsDataPtr()); *w = ScanObjectAddress(w->AsObjPtr()); } } // This gets called in two circumstances. It may be called for the roots // in which case the stack will be empty and we want to process it completely // or it is called for a constant address in which case it will have been // called from RecursiveScan::ScanAddressesInObject and that can process // any addresses. PolyObject *RecursiveScan::ScanObjectAddress(PolyObject *obj) { PolyWord pWord = obj; // Test to see if this needs to be scanned. // It may update the word. bool test = TestForScan(&pWord); obj = pWord.AsObjPtr(); if (test) { MarkAsScanning(obj); if (obj->IsByteObject()) Completed(obj); // Don't need to put it on the stack // If we already have something on the stack we must being called // recursively to process a constant in a code segment. Just push // it on the stack and let the caller deal with it. else if (StackIsEmpty()) RecursiveScan::ScanAddressesInObject(obj, obj->LengthWord()); else PushToStack(obj); } return obj; } // This is called via ScanAddressesInRegion to process the permanent mutables. It is // also called from ScanObjectAddress to process root addresses. // It processes all the addresses reachable from the object. void RecursiveScan::ScanAddressesInObject(PolyObject *obj, POLYUNSIGNED lengthWord) { if (OBJ_IS_BYTE_OBJECT(lengthWord)) { Completed(obj); return; } while (true) { ASSERT (OBJ_IS_LENGTH(lengthWord)); // Get the length and base address. N.B. If this is a code segment // these will be side-effected by GetConstSegmentForCode. POLYUNSIGNED length = OBJ_OBJECT_LENGTH(lengthWord); PolyWord *baseAddr = (PolyWord*)obj; if (OBJ_IS_CODE_OBJECT(lengthWord)) { // It's better to process the whole code object in one go. ScanAddress::ScanAddressesInObject(obj, lengthWord); length = 0; // Finished } ASSERT(! OBJ_IS_BYTE_OBJECT(lengthWord)); // Check - remove this later // else it's a normal object, // If there are only two addresses in this cell that need to be // followed we follow them immediately and treat this cell as done. // If there are more than two we push the address of this cell on // the stack, follow the first address and then rescan it. That way // list cells are processed once only but we don't overflow the // stack by pushing all the addresses in a very large vector. PolyWord *endWord = baseAddr + length; PolyObject *firstWord = 0; PolyObject *secondWord = 0; while (baseAddr != endWord) { PolyWord wordAt = *baseAddr; if (wordAt.IsDataPtr() && wordAt != PolyWord::FromUnsigned(0)) { // Normal address. We can have words of all zeros at least in the // situation where we have a partially constructed code segment where // the constants at the end of the code have not yet been filled in. if (TestForScan(baseAddr)) // Test value at baseAddr (may side-effect it) { PolyObject *wObj = (*baseAddr).AsObjPtr(); if (wObj->IsByteObject()) { // Can do this now - don't need to push it MarkAsScanning(wObj); Completed(wObj); } else if (firstWord == 0) { firstWord = wObj; // We mark the word immediately. We can have // two words in an object that are the same // and we don't want to process it again. MarkAsScanning(firstWord); } else if (secondWord == 0) secondWord = wObj; else break; // More than two words. } } else if (wordAt.IsCodePtr()) { // If we're processing the constant area of a code segment this could // be a code address. PolyObject *oldObject = ObjCodePtrToPtr(wordAt.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = wordAt.AsCodePtr() - (byte*)oldObject; wordAt = oldObject; bool test = TestForScan(&wordAt); // TestForScan may side-effect the word. PolyObject *newObject = wordAt.AsObjPtr(); wordAt = PolyWord::FromCodePtr((byte*)newObject + offset); if (wordAt != *baseAddr) *baseAddr = wordAt; if (test) { if (firstWord == 0) { firstWord = newObject; MarkAsScanning(firstWord); } else if (secondWord == 0) secondWord = newObject; else break; } } baseAddr++; } if (baseAddr == endWord) { // We have done everything except possibly firstWord and secondWord. Completed(obj); if (secondWord != 0) { MarkAsScanning(secondWord); // Put this on the stack. If this is a list node we will be // pushing the tail. PushToStack(secondWord); } } else // Put this back on the stack while we process the first word PushToStack(obj); if (firstWord != 0) // Process it immediately. obj = firstWord; else if (StackIsEmpty()) return; else obj = PopFromStack(); lengthWord = obj->LengthWord(); } } // The stack is allocated as a series of blocks chained together. #define RSTACK_SEGMENT_SIZE 1000 class RScanStack { public: RScanStack(): nextStack(0), lastStack(0), sp(0) {} ~RScanStack() { delete(nextStack); } RScanStack *nextStack; RScanStack *lastStack; unsigned sp; PolyObject * stack[RSTACK_SEGMENT_SIZE]; }; RecursiveScanWithStack::~RecursiveScanWithStack() { delete(stack); } bool RecursiveScanWithStack::StackIsEmpty(void) { return stack == 0 || (stack->sp == 0 && stack->lastStack == 0); } void RecursiveScanWithStack::PushToStack(PolyObject *obj) { if (stack == 0 || stack->sp == RSTACK_SEGMENT_SIZE) { if (stack != 0 && stack->nextStack != 0) stack = stack->nextStack; else { // Need a new segment try { RScanStack *s = new RScanStack; s->lastStack = stack; if (stack != 0) stack->nextStack = s; stack = s; } catch (std::bad_alloc &) { StackOverflow(); return; } } } stack->stack[stack->sp++] = obj; } PolyObject *RecursiveScanWithStack::PopFromStack(void) { if (stack->sp == 0) { // Chain to the previous stack if any if (stack->lastStack == 0) return 0; // Before we do, delete any further one to free some memory delete(stack->nextStack); stack->nextStack = 0; stack = stack->lastStack; ASSERT(stack->sp == RSTACK_SEGMENT_SIZE); } return stack->stack[--stack->sp]; } polyml-5.6/libpolyml/scanaddrs.h000066400000000000000000000137071265146633400170400ustar00rootroot00000000000000/* Title: scanaddrs.h - Scan addresses in objects Copyright (c) 2006-8, 2012, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SCANADDRS_H_INCLUDED #define SCANADDRS_H_INCLUDED #include "globals.h" // Type of relocations. typedef enum { PROCESS_RELOC_DIRECT = 0, // 32 or 64 bit address of target PROCESS_RELOC_I386RELATIVE // 32 or 64 bit relative address } ScanRelocationKind; class StackSpace; class ScanAddress { public: virtual ~ScanAddress() {} // Keeps gcc happy protected: // Scan an address in the memory. "pt" always points into an object. // It is not called with pt pointing at a C++ automatic variable. // Tagged integers have already been filtered out. // The result is the length word of the object to use if the object // is to be processed recursively or 0 if it should not be. // Default action - call ScanObjectAddress for the base object address of // the address. virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); public: // The fundamental overridable for this class. Takes the object address and returns // the updated address. If nothing else is overridden everything eventually comes here. virtual PolyObject *ScanObjectAddress(PolyObject *base) = 0;// { return base; } typedef enum { STRENGTH_STRONG = 0, STRENGTH_WEAK = 1 } RtsStrength; // Scan an address in the run-time system. This normally just applies ScanObjectAddress // but if this is a weak reference it can set *pt to NULL virtual void ScanRuntimeAddress(PolyObject **pt, RtsStrength weak) { *pt = ScanObjectAddress(*pt); } // Scan a word in the run-time system. This is the preferred call for non-weak // references and deals with the general case of a word. void ScanRuntimeWord(PolyWord *w); // Process a constant within the code. // The default action is to call the DEFAULT ScanAddressAt NOT the virtual which means that it calls // ScanObjectAddress for the base address of the object referred to. virtual void ScanConstant(byte *addressOfConstant, ScanRelocationKind code); // Scan the objects in the region and process their addresses. Applies ScanAddressesInObject // to each of the objects. The "region" argument points AT the first length word. // Typically used to scan or update addresses in the mutable area. void ScanAddressesInRegion(PolyWord *region, PolyWord *endOfRegion); protected: // General object processor. // If the object is a word object calls ScanAddressesAt for all the addresses. // // If the object is a code object calls ScanAddressesAt for the constant area and // calls (indirectly) ScanConstant, and by default ScanObjectAddress for addresses within // the code // // If the object is a stack calls ScanStackAddress which calls ScanObjectAddress for // addresses within the code. virtual void ScanAddressesInObject(PolyObject *base, POLYUNSIGNED lengthWord); void ScanAddressesInObject(PolyObject *base) { ScanAddressesInObject(base, base->LengthWord()); } public: // Process a word found on the stack and return the (updated) value. Stacks may contain // code addresses and addresses within the current stack. "isCode" is set to true for // the program counter which may be a code address but not satisfy IsCodeObject. // The default action is to ignore integers and addresses within the stack and to call // ScanObjectAddress for the base addresses of all other addresses. PolyWord ScanStackAddress(PolyWord val, StackSpace *base, bool isCode); // Extract a constant from the code. static PolyWord GetConstantValue(byte *addressOfConstant, ScanRelocationKind code); // Store a constant in the code. static void SetConstantValue(byte *addressOfConstant, PolyWord p, ScanRelocationKind code); }; // Recursive scan over a data structure. class RecursiveScan: public ScanAddress { public: virtual PolyObject *ScanObjectAddress(PolyObject *base); virtual void ScanAddressesInObject(PolyObject *base, POLYUNSIGNED lengthWord); // Have to redefine this for some reason. void ScanAddressesInObject(PolyObject *base) { ScanAddressesInObject(base, base->LengthWord()); } protected: // The derived class must provide a stack. virtual void PushToStack(PolyObject *obj) = 0; virtual PolyObject *PopFromStack(void) = 0; virtual bool StackIsEmpty(void) = 0; // Test the word at the location to see if it points to // something that may have to be scanned. We pass in the // pointer here because the called may side-effect it. virtual bool TestForScan(PolyWord *) = 0; // If we are definitely scanning the address we mark it. virtual void MarkAsScanning(PolyObject *) = 0; // Called when the object has been completed. virtual void Completed(PolyObject *) {} }; // Recursive scan with a dynamically allocated stack class RScanStack; class RecursiveScanWithStack: public RecursiveScan { public: RecursiveScanWithStack(): stack(0) {} ~RecursiveScanWithStack(); protected: // StackOverflow is called if allocating a new stack // segment fails. virtual void StackOverflow(void) = 0; virtual void PushToStack(PolyObject *obj); virtual PolyObject *PopFromStack(void); virtual bool StackIsEmpty(void); RScanStack *stack; }; #endif polyml-5.6/libpolyml/sharedata.cpp000066400000000000000000000744711265146633400173720ustar00rootroot00000000000000/* Title: Share common immutable data Copyright (c) 2000 Cambridge University Technical Services Limited and David C. J. Matthews 2006, 2010-13 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_STRING_H #include #endif #include "globals.h" #include "save_vec.h" #include "machine_dep.h" #include "scanaddrs.h" #include "run_time.h" #include "sys.h" #include "gc.h" #include "rts_module.h" #include "memmgr.h" #include "processes.h" #include "gctaskfarm.h" #include "diagnostics.h" /* This code was largely written by Simon Finn as a database improver for the the memory-mapped persistent store version. The aim is that where two immutable objects (cells) contain the same data (i.e. where ML equality would say they were equal) they should be merged so that only a single object is retained. The basic algorithm works like this: 1. From the root, recursively process all objects and calculate a "depth" for each object. Mutable data, stacks and code segments have depth 0 and cannot be merged. Byte segments (e.g. strings and long-format arbitrary precision values) have depth 1. Other cells have depths of 1 or greater, the depth being the maximum recursion depth until a byte segment or an object with depth 0 is reached. Cycles of immutable data don't arise normally in ML but could be produced as a result of locking mutable objects. To avoid infinite recursion cycles are broken by setting the depth of an object to zero before processing it. The depth of each object is stored in the length word of the object. This ensures each object is processed once only. 2. Vectors are created containing objects of the same depth, from 1 to the maximum depth found. 3. We begin a loop starting at depth 1. 4. The objects are sorted by their contents so bringing together objects with the same contents. The contents are considered simply as uninterpreted bits. 5. The sorted vector is processed to find those objects that are actually bitwise equal. One object is selected to be retained and its length word is restored to be a normal length (phase 1 had set it to be a depth). The other objects have their length words turned into tombstones pointing at the retained object. 6. Objects at the next depth are first processed to find pointers to objects that moved in the previous step (or that step with a lower depth). The addresses are updated to point to the retained object. The effect of this step is to ensure that now two objects that are equal in ML terms have identical contents. e.g. If we have val a = ("abc", "def") and b = ("abc", "def") then we will have merged the two occurrences of "abc" and "def" in the previous pass of level 1 objects. This step ensures that the two cells containing the pairs both hold pointers to the same objects and so are bitwise equal. 7. Repeat with 4, 5 and 6 until all the levels have been processed. Each object is processed once and at the end most of the objects have been updated with the shared addresses. We have to scan all the mutable and code objects to update the addresses but also have to scan the immutables because of the possibility of missing an update as a result of breaking a loop (see SPF's comment below). DCJM 3/8/06 This has been substantially updated while retaining the basic algorithm. Sorting is now done in parallel by the GC task farm and the stack is now in dynamic memory. That avoids a possible segfault if the normal C stack overflows. */ typedef struct { POLYUNSIGNED L; PolyObject *pt; } Item; // The DepthVector type contains all the items of a particular depth. class DepthVector { public: POLYUNSIGNED MergeSameItems(void); POLYUNSIGNED depth; POLYUNSIGNED nitems; POLYUNSIGNED vsize; Item *vector; void Sort(void); private: static void SortRange(Item *first, Item *last); static int CompareItems(const Item *a, const Item *b); static int qsCompare(const void *a, const void *b) { return CompareItems((const Item*)a, (const Item*)b); } static void sortTask(GCTaskId*, void *s, void *l) { SortRange((Item*)s, (Item*)l); } }; class ShareDataClass { public: ShareDataClass() { depthVectors = 0; depthVectorSize = 0; } ~ShareDataClass(); bool RunShareData(PolyObject *root); DepthVector *AddDepth(POLYUNSIGNED depth); void AddToVector(POLYUNSIGNED depth, POLYUNSIGNED L, PolyObject *pt); private: DepthVector *depthVectors; POLYUNSIGNED depthVectorSize; }; ShareDataClass::~ShareDataClass() { // Free the bitmaps associated with the permanent spaces. for (unsigned j = 0; j < gMem.npSpaces; j++) gMem.pSpaces[j]->shareBitmap.Destroy(); } DepthVector *ShareDataClass::AddDepth(POLYUNSIGNED depth) { if (depth >= depthVectorSize) { POLYUNSIGNED newDepth = depth+1; DepthVector *newVec = (DepthVector *)realloc(depthVectors, sizeof(DepthVector)*newDepth); if (newVec == 0) throw MemoryException(); depthVectors = newVec; for (POLYUNSIGNED d = depthVectorSize; d < newDepth; d++) { DepthVector *dv = &depthVectors[d]; dv->depth = d; dv->nitems = dv->vsize = 0; dv->vector = 0; } depthVectorSize = newDepth; } return &depthVectors[depth]; } // Add an object to a depth vector void ShareDataClass::AddToVector(POLYUNSIGNED depth, POLYUNSIGNED L, PolyObject *pt) { DepthVector *v = AddDepth (depth); ASSERT (v->nitems <= v->vsize); if (v->nitems == v->vsize) { // The vector is full or has not yet been allocated. Grow it by 50%. POLYUNSIGNED new_vsize = v->vsize + v->vsize / 2 + 1; if (new_vsize < 15) new_vsize = 15; Item *new_vector = (Item *)realloc (v->vector, new_vsize*sizeof(Item)); if (new_vector == 0) { // The vectors can get large and we may not be able to grow them // particularly if the address space is limited in 32-bit mode. // Try again with just a small increase. new_vsize = v->vsize + 15; new_vector = (Item *)realloc (v->vector, new_vsize*sizeof(Item)); // If that failed give up. if (new_vector == 0) throw MemoryException(); } v->vector = new_vector; v->vsize = new_vsize; } ASSERT (v->nitems < v->vsize); v->vector[v->nitems].L = L; v->vector[v->nitems].pt = pt; v->nitems++; ASSERT (v->nitems <= v->vsize); } // Comparison function used for sorting and also to test whether // two cells can be merged. int DepthVector::CompareItems(const Item *a, const Item *b) { PolyObject *x = a->pt; PolyObject *y = b->pt; // POLYUNSIGNED A = x->LengthWord(); // POLYUNSIGNED B = y->LengthWord(); // ASSERT (OBJ_IS_DEPTH(A)); // ASSERT (OBJ_IS_DEPTH(B)); // ASSERT (A == B); // Should be the same depth. // ASSERT (OBJ_IS_LENGTH(a->L)); // ASSERT (OBJ_IS_LENGTH(b->L)); if (a->L > b->L) return 1; // These tests include the flag bits if (a->L < b->L) return -1; // Return simple bitwise equality. return memcmp(x, y, OBJ_OBJECT_LENGTH(a->L)*sizeof(PolyWord)); } // Merge cells with the same contents. POLYUNSIGNED DepthVector::MergeSameItems() { DepthVector *v = this; POLYUNSIGNED N = v->nitems; Item *itemVec = v->vector; POLYUNSIGNED n = 0; POLYUNSIGNED i = 0; while (i < N) { PolyObject *bestShare = 0; // Candidate to share. MemSpace *bestSpace = 0; POLYUNSIGNED j; for (j = i; j < N; j++) { ASSERT (OBJ_IS_DEPTH(itemVec[i].pt->LengthWord())); // Search for identical objects. Don't bother to compare it with itself. if (i != j && CompareItems (& itemVec[i], & itemVec[j]) != 0) break; // The order of sharing is significant. // Choose an object in the permanent memory if that is available. // This is necessary to retain the invariant that no object in // the permanent memory points to an object in the temporary heap. // (There may well be pointers to this object elsewhere in the permanent // heap). // Choose the lowest hierarchy value for preference since that // may reduce the size of saved state when resaving already saved // data. // If we can't find a permanent space choose a space that isn't // an allocation space. Otherwise we could break the invariant // that immutable areas never point into the allocation area. MemSpace *space = gMem.SpaceForAddress(itemVec[j].pt); if (bestSpace == 0) { bestShare = itemVec[j].pt; bestSpace = space; } else if (bestSpace->spaceType == ST_PERMANENT) { // Only update if the current space is also permanent and a lower hierarchy if (space->spaceType == ST_PERMANENT && ((PermanentMemSpace *)space)->hierarchy < ((PermanentMemSpace *)bestSpace)->hierarchy) { bestShare = itemVec[j].pt; bestSpace = space; } } else if (bestSpace->spaceType == ST_LOCAL) { // Update if the current space is not an allocation space if (space->spaceType != ST_LOCAL || ! ((LocalMemSpace*)space)->allocationSpace) { bestShare = itemVec[j].pt; bestSpace = space; } } } POLYUNSIGNED k = j; // Remember the first object that didn't match. //.For each identical object set all but the one we want to point to // the shared object. for (j = i; j < k; j++) { ASSERT (OBJ_IS_DEPTH(itemVec[j].pt->LengthWord())); if (itemVec[j].pt == bestShare) { // This is the common object. bestShare->SetLengthWord(itemVec[j].L); // restore genuine length word ASSERT (OBJ_IS_LENGTH(bestShare->LengthWord())); } else { itemVec[j].pt->SetForwardingPtr(bestShare); /* an indirection */ ASSERT (itemVec[j].pt->ContainsForwardingPtr()); n++; } } ASSERT(! OBJ_IS_DEPTH(itemVec[i].pt->LengthWord())); i = k; } return n; } // Sort this vector void DepthVector::Sort() { SortRange(vector, vector+(nitems-1)); gpTaskFarm->WaitForCompletion(); // Check // for (POLYUNSIGNED i = 0; i < nitems-1; i++) // ASSERT(CompareItems(vector+i, vector+i+1) <= 0); } inline void swapItems(Item *i, Item *j) { Item t = *i; *i = *j; *j = t; } // Simple parallel quick-sort. "first" and "last" are the first // and last items (inclusive) in the vector. void DepthVector::SortRange(Item *first, Item *last) { while (first < last) { if (last-first <= 100) { // Use the standard library function for small ranges. qsort(first, last-first+1, sizeof(Item), qsCompare); return; } // Select the best pivot from the first, last and middle item // by sorting these three items. We use the middle item as // the pivot and since the first and last items are sorted // by this we can skip them when we start the partitioning. Item *middle = first + (last-first)/2; if (CompareItems(first, middle) > 0) swapItems(first, middle); if (CompareItems(middle, last) > 0) { swapItems(middle, last); if (CompareItems(first, middle) > 0) swapItems(first, middle); } // Partition the data about the pivot. This divides the // vector into two partitions with all items <= pivot to // the left and all items >= pivot to the right. // Note: items equal to the pivot could be in either partition. Item *f = first+1; Item *l = last-1; do { // Find an item we have to move. These loops will always // terminate because testing the middle with itself // will return == 0. while (CompareItems(f, middle/* pivot*/) < 0) f++; while (CompareItems(middle/* pivot*/, l) < 0) l--; // If we haven't finished we need to swap the items. if (f < l) { swapItems(f, l); // If one of these was the pivot item it will have moved to // the other position. if (middle == f) middle = l; else if (middle == l) middle = f; f++; l--; } else if (f == l) { f++; l--; break; } } while (f <= l); // Process the larger partition as a separate task or // by recursion and do the smaller partition by tail // recursion. if (l-first > last-f) { // Lower part is larger gpTaskFarm->AddWorkOrRunNow(sortTask, first, l); first = f; } else { // Upper part is larger gpTaskFarm->AddWorkOrRunNow(sortTask, f, last); last = l; } } } class ProcessFixupAddress: public ScanAddress { public: void FixupItems (DepthVector *v); protected: virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt); virtual PolyObject *ScanObjectAddress(PolyObject *base) { return GetNewAddress(base).AsObjPtr(); } PolyWord GetNewAddress(PolyWord old); }; POLYUNSIGNED ProcessFixupAddress::ScanAddressAt(PolyWord *pt) { *pt = GetNewAddress(*pt); return 0; } // Returns the new address if the argument is the address of an object that // has moved, otherwise returns the original. PolyWord ProcessFixupAddress::GetNewAddress(PolyWord old) { if (old.IsTagged() || old == PolyWord::FromUnsigned(0) || gMem.IsIOPointer(old.AsAddress())) return old; // Nothing to do. // When we are updating addresses in the stack or in code segments we may have // code pointers. if (old.IsCodePtr()) { // Find the start of the code segment PolyObject *oldObject = ObjCodePtrToPtr(old.AsCodePtr()); // Calculate the byte offset of this value within the code object. POLYUNSIGNED offset = old.AsCodePtr() - (byte*)oldObject; PolyWord newObject = GetNewAddress(oldObject); return PolyWord::FromCodePtr(newObject.AsCodePtr() + offset); } ASSERT(old.IsDataPtr()); PolyObject *obj = old.AsObjPtr(); POLYUNSIGNED L = obj->LengthWord(); // Generally each address will point to an object processed at a lower depth. // The exception is if we have a cycle and have assigned the rest of the // structure to a higher depth. // N.B. We return the original address here but this could actually share // with something else and not be retained. if (OBJ_IS_DEPTH(L)) return old; if (obj->ContainsForwardingPtr()) // tombstone is a pointer to a shared object { PolyObject *newp = obj->GetForwardingPtr(); // ASSERT (newp->ContainsNormalLengthWord()); return newp; } ASSERT (obj->ContainsNormalLengthWord()); // object is not shared return old; } void ProcessFixupAddress::FixupItems (DepthVector *v) { POLYUNSIGNED N = v->nitems; Item *V = v->vector; for (POLYUNSIGNED i = 0; i < N; i++) { ScanAddressesInObject(V[i].pt, V[i].L); } } class ProcessAddToVector: public ScanAddress { public: ProcessAddToVector(ShareDataClass *p): m_parent(p), addStack(0), stackSize(0), asp(0) {} ~ProcessAddToVector(); virtual POLYUNSIGNED ScanAddressAt(PolyWord *pt) { (void)AddObjectsToDepthVectors(*pt); return 0; } virtual PolyObject *ScanObjectAddress(PolyObject *base) { (void)AddObjectsToDepthVectors(base); return base; } void ProcessRoot(PolyObject *root); protected: POLYUNSIGNED AddObjectsToDepthVectors(PolyWord old); void PushToStack(PolyObject *obj); ShareDataClass *m_parent; PolyObject **addStack; unsigned stackSize; unsigned asp; }; ProcessAddToVector::~ProcessAddToVector() { // Normally the stack will be empty. However if we have run out of // memory and thrown an exception we may well have items left. // We have to remove the mark bits otherwise it will mess up any // subsequent GC. for (unsigned i = 0; i < asp; i++) { PolyObject *obj = addStack[i]; if (obj->LengthWord() & _OBJ_GC_MARK) obj->SetLengthWord(obj->LengthWord() & (~_OBJ_GC_MARK)); } free(addStack); // Now free the stack } // We use _OBJ_GC_MARK to detect when we have visited a cell but not yet // computed the depth. We have to be careful that this bit is removed // before we finish in the case that we run out of memory and throw an // exception. PushToStack may throw the exception if the stack needs to // grow. POLYUNSIGNED ProcessAddToVector::AddObjectsToDepthVectors(PolyWord old) { // If this is a tagged integer or an IO pointer that's simply a constant. if (old.IsTagged() || old == PolyWord::FromUnsigned(0)) return 0; MemSpace *space = gMem.SpaceForAddress(old.AsAddress()); if (space == 0 || space->spaceType == ST_IO) return 0; PolyObject *obj = old.AsObjPtr(); POLYUNSIGNED L = obj->LengthWord(); if (OBJ_IS_DEPTH(L)) // tombstone contains genuine depth or 0. return OBJ_GET_DEPTH(L); if (obj->LengthWord() & _OBJ_GC_MARK) return 0; // Marked but not yet scanned. Circular structure. ASSERT (OBJ_IS_LENGTH(L)); if (obj->IsMutable()) { // Mutable data in the local or permanent areas if (! obj->IsByteObject()) { // Add it to the vector so we will update any addresses it contains. m_parent->AddToVector(0, L, old.AsObjPtr()); // and follow any addresses to try to merge those. PushToStack(obj); obj->SetLengthWord(L | _OBJ_GC_MARK); // To prevent rescan } return 0; // Level is zero } if (space->spaceType == ST_PERMANENT && ((PermanentMemSpace*)space)->hierarchy == 0) { // Immutable data in the permanent area can't be merged // because it's read only. We need to follow the addresses // because they may point to mutable areas containing data // that can be. A typical case is the root function pointing // at the global name table containing new declarations. Bitmap *bm = &((PermanentMemSpace*)space)->shareBitmap; if (! bm->TestBit((PolyWord*)obj - space->bottom)) { bm->SetBit((PolyWord*)obj - space->bottom); if (! obj->IsByteObject()) PushToStack(obj); } return 0; } /* There's a problem sharing code objects if they have relative calls/jumps in them to other code. The code of two functions may be identical (e.g. they both call functions 100 bytes ahead) and so they will appear the same but if the functions they jump to are different they are actually different. For that reason we don't share code segments. DCJM 4/1/01 */ if (obj->IsCodeObject()) { // We want to update addresses in the code segment. m_parent->AddToVector(0, L, old.AsObjPtr()); PushToStack(obj); obj->SetLengthWord(L | _OBJ_GC_MARK); // To prevent rescan return 0; } // Byte objects always have depth 1 and can't contain addresses. if (obj->IsByteObject()) { m_parent->AddToVector (1, L, old.AsObjPtr());// add to vector at correct depth obj->SetLengthWord(OBJ_SET_DEPTH(1)); return 1; } ASSERT(OBJ_IS_WORD_OBJECT(L)); // That leaves immutable data objects. PushToStack(obj); obj->SetLengthWord(L | _OBJ_GC_MARK); // To prevent rescan return 0; } void ProcessAddToVector::PushToStack(PolyObject *obj) { if (asp == stackSize) { if (addStack == 0) { addStack = (PolyObject**)malloc(sizeof(PolyObject*) * 100); if (addStack == 0) throw MemoryException(); stackSize = 100; } else { unsigned newSize = stackSize+100; PolyObject** newStack = (PolyObject**)realloc(addStack, sizeof(PolyObject*) * newSize); if (newStack == 0) throw MemoryException(); stackSize = newSize; addStack = newStack; } } ASSERT(asp < stackSize); addStack[asp++] = obj; } void ProcessAddToVector::ProcessRoot(PolyObject *root) { // Mark the initial object AddObjectsToDepthVectors(root); // Process the stack until it's empty. while (asp != 0) { // Pop it from the stack. PolyObject *obj = addStack[asp-1]; if (obj->IsCodeObject()) { /* There's a problem sharing code objects if they have relative calls/jumps in them to other code. The code of two functions may be identical (e.g. they both call functions 100 bytes ahead) and so they will appear the same but if the functions they jump to are different they are actually different. For that reason we don't share code segments. DCJM 4/1/01 */ asp--; // Pop it because we'll process it completely ScanAddressesInObject(obj); // If it's local set the depth with the value zero. if (obj->LengthWord() & _OBJ_GC_MARK) { obj->SetLengthWord(obj->LengthWord() & (~_OBJ_GC_MARK)); m_parent->AddToVector(0, obj->LengthWord() & (~_OBJ_GC_MARK), obj); obj->SetLengthWord(OBJ_SET_DEPTH(0)); // Now scanned } } else if ((obj->LengthWord() & _OBJ_GC_MARK) && ! obj->IsMutable()) { POLYUNSIGNED depth = 0; POLYUNSIGNED length = obj->Length(); PolyWord *pt = (PolyWord*)obj; unsigned osp = asp; while (length != 0 && osp == asp) { POLYUNSIGNED d = AddObjectsToDepthVectors(*pt); if (d > depth) depth = d; pt++; length--; } if (osp == asp) { // We've finished it asp--; // Pop this item. depth++; // One more for this object obj->SetLengthWord(obj->LengthWord() & (~_OBJ_GC_MARK)); m_parent->AddToVector(depth, obj->LengthWord() & (~_OBJ_GC_MARK), obj); obj->SetLengthWord(OBJ_SET_DEPTH(depth)); } } else { POLYUNSIGNED length = obj->Length(); PolyWord *pt = (PolyWord*)obj; unsigned osp = asp; while (length != 0) { if (! (*pt).IsTagged()) { // If we've already pushed an address break now if (osp != asp) break; // Process the address and possibly push it AddObjectsToDepthVectors(*pt); } pt++; length--; } if (length == 0) { // We've finished it if (osp != asp) { ASSERT(osp == asp-1); addStack[osp-1] = addStack[osp]; } asp--; // Pop this item. if (obj->LengthWord() & _OBJ_GC_MARK) obj->SetLengthWord(OBJ_SET_DEPTH(0)); } } } } static void RestoreLengthWords(DepthVector *vec) { // Restore the length words. Item *itemVec = vec->vector; for (POLYUNSIGNED i = 0; i < vec->nitems; i++) { itemVec[i].pt->SetLengthWord(itemVec[i].L); // restore genuine length word ASSERT (OBJ_IS_LENGTH(itemVec[i].pt->LengthWord())); } } // This is called by the root thread to do the work. bool ShareDataClass::RunShareData(PolyObject *root) { // We use a bitmap to indicate when we've visited an object to avoid // infinite recursion in cycles in the data. for (unsigned j = 0; j < gMem.npSpaces; j++) { PermanentMemSpace *space = gMem.pSpaces[j]; if (!space->isMutable && space->hierarchy == 0) { if (! space->shareBitmap.Create(space->spaceSize())) return false; } } POLYUNSIGNED totalObjects = 0; POLYUNSIGNED totalShared = 0; depthVectors = 0; depthVectorSize = 0; // Build the vectors from the immutable objects. bool success = true; try { ProcessAddToVector addToVector(this); addToVector.ProcessRoot(root); } catch (MemoryException &) { // If we ran out of memory we may still be able to process what we have. // That will also do any clean-up. success = false; } ProcessFixupAddress fixup; for (POLYUNSIGNED depth = 1; depth < depthVectorSize; depth++) { DepthVector *vec = &depthVectors[depth]; fixup.FixupItems(vec); vec->Sort(); POLYUNSIGNED n = vec->MergeSameItems(); if ((debugOptions & DEBUG_SHARING) && n > 0) Log("Sharing: Level %4" POLYUFMT ", Objects %6" POLYUFMT ", Shared %6" POLYUFMT " (%1.0f%%)\n", vec->depth, vec->nitems, n, (float)n / (float)vec->nitems * 100.0); totalObjects += vec->nitems; totalShared += n; } /* At this stage, we have fixed up most but not all of the forwarding pointers. The ones that we haven't fixed up arise from situations such as the following: X -> Y <-> Z i.e. Y and Z form a loop, and X is isomorphic to Z. When we assigned the depths, we have to arbitrarily break the loop between Y and Z. Suppose Y is assigned to level 1, and Z is assigned to level 2. When we process level 1 and fixup Y, there's nothing to do, since Z is still an ordinary object. However when we process level 2, we find that X and Z are isomorphic so we arbitrarily choose one of them and turn it into a "tombstone" pointing at the other. If we change Z into the tombstone, then Y now contains a pointer that needs fixing up. That's why we need the second fixup pass. Note also that if we had broken the loop the other way, we would have assigned Z to level 1, Y to level 2 and X to level 3, so we would have missed the chance to share Z and X. Perhaps that's why running the program repeatedly sometimes finds extra things to share? SPF 26/1/95 */ /* We have updated the addresses in objects with non-zero level so they point to the single occurrence but we need to do the same with level 0 objects (mutables, stacks and code). */ if (depthVectorSize > 0) { DepthVector *v = &depthVectors[0]; RestoreLengthWords(v); fixup.FixupItems(v); free(v->vector); } /* Previously we made a complete scan over the memory updating any addresses so that if we have shared two substructures within our root we would also share any external pointers. This has been removed but we have to reinstate the length words we've overwritten with forwarding pointers because there may be references to unshared objects from outside. */ for (POLYUNSIGNED d = 1; d < depthVectorSize; d++) { DepthVector *v = &depthVectors[d]; RestoreLengthWords(v); free(v->vector); } free(depthVectors); depthVectors = 0; if (debugOptions & DEBUG_SHARING) Log ("Sharing: Total Objects %6" POLYUFMT ", Total Shared %6" POLYUFMT " (%1.0f%%)\n", totalObjects, totalShared, (float)totalShared / (float)totalObjects * 100.0); return success; // Succeeded. } class ShareRequest: public MainThreadRequest { public: ShareRequest(Handle root): MainThreadRequest(MTP_SHARING), shareRoot(root), result(false) {} virtual void Perform() { ShareDataClass s; // Do a full GC. If we have a large heap the allocation of the vectors // can cause paging. Doing this now reduces the heap and discards the // allocation spaces. It may be overkill if we are applying the sharing // to a small root but generally it seems to be applied to the whole heap. FullGCForShareCommonData(); // Now do the sharing. result = s.RunShareData(shareRoot->WordP()); } Handle shareRoot; bool result; }; // ShareData. This is the main entry point. // Because this can recurse deeply it needs to be run by the main thread. // Also it manipulates the heap in ways that could mess up other threads // so we need to stop them before executing this. void ShareData(TaskData *taskData, Handle root) { if (! root->Word().IsDataPtr()) return; // Nothing to do. We could do handle a code pointer but it shouldn't occur. // Request the main thread to do the sharing. ShareRequest request(root); processes->MakeRootRequest(taskData, &request); // Raise an exception if it failed. if (! request.result) raise_exception_string(taskData, EXC_Fail, "Insufficient memory"); } polyml-5.6/libpolyml/sharedata.h000066400000000000000000000021301265146633400170160ustar00rootroot00000000000000/* Title: Share common immutable data Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _SHAREDATA_H #define _SHAREDATA_H // Called by the thread to make the request. void ShareData(TaskData *taskData, Handle root); // Called by the root thread to do the work. bool RunShareData(PolyObject *root); #endif polyml-5.6/libpolyml/sighandler.cpp000066400000000000000000000427401265146633400175500ustar00rootroot00000000000000/* Title: Signal handling Author: David C.J. Matthews Copyright (c) 2000-8 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) 0 #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STDLIB_H #include // For malloc #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_SEMAPHORE_H)) // Don't include semaphore.h on Mingw. It's provided but doesn't compile. #include #endif #if ((!defined(_WIN32) || defined(__CYGWIN__)) && defined(HAVE_LIBPTHREAD) && defined(HAVE_PTHREAD_H) && defined(HAVE_SEMAPHORE_H)) // If we have the pthread library and header and we have semaphores we can use the pthread // signalling mechanism. But if this is a native Windows build we don't use semaphores or // pthread even if they're provided. #define USE_PTHREAD_SIGNALS 1 #endif /* Signal handling is complicated in a multi-threaded environment. The pthread mutex and condition variables are not safe to use in a signal handler so we need to use POSIX semaphores since sem_post is safe. */ #if (defined(HAVE_STACK_T) && defined(HAVE_SIGALTSTACK)) extern "C" { // This is missing in older versions of Mac OS X int sigaltstack(const stack_t *, stack_t *); } #endif #include "globals.h" #include "arb.h" #include "run_time.h" #include "sighandler.h" #include "processes.h" #include "machine_dep.h" #include "sys.h" #include "save_vec.h" #include "rts_module.h" #include "gc.h" // For convertedWeak #include "scanaddrs.h" #include "locking.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include "Console.h" #endif #define SAVE(x) taskData->saveVec.push(x) #define SIZEOF(x) (sizeof(x)/sizeof(word)) #define DEFAULT_SIG 0 #define IGNORE_SIG 1 #define HANDLE_SIG 2 // This is only used in SignalRequest static struct _sigData { bool nonMaskable; // True if this sig is used within the RTS. Must not be ignored or replaced PolyWord handler; // User-installed handler, TAGGED(DEFAULT_SIG) or TAGGED(IGNORE_SIG) int signalCount; } sigData[NSIG]; unsigned receivedSignalCount = 0; // Incremented each time we get a signal // sigLock protects access to the signalCount values in sigData but // not the "handler" field. static PLock sigLock; #ifdef USE_PTHREAD_SIGNALS static PSemaphore *waitSema; static int lastSignals[NSIG]; static bool terminate = false; #endif // This must not be called from an asynchronous signal handler. static void signalArrived(int sig) { sigLock.Lock(); receivedSignalCount++; sigData[sig].signalCount++; sigLock.Unlock(); // To avoid deadlock we must release sigLock first. processes->SignalArrived(); } // Called whenever a signal handler is installed other than in this // module. Because modules are initialised in an unspecified order // we may have already masked off this signal. void markSignalInuse(int sig) { sigData[sig].nonMaskable = true; #ifdef USE_PTHREAD_SIGNALS // Enable this signal. sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, sig); pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); #endif } /* Find the existing handler for this signal. */ static PolyWord findHandler(int sig) { if ((unsigned)sig >= NSIG) // Check it's in range. return TAGGED(DEFAULT_SIG); /* Not there - default action. */ else return sigData[sig].handler; } #if (defined(_WIN32) && ! defined(__CYGWIN__)) // This is called to simulate a SIGINT in Windows. void RequestConsoleInterrupt(void) { // The default action for SIGINT is to exit. if (findHandler(SIGINT) == TAGGED(DEFAULT_SIG)) processes->Exit(2); // Exit with the signal value. else signalArrived(SIGINT); } #endif #ifdef USE_PTHREAD_SIGNALS // Request the main thread to change the blocking state of a signal. class SignalRequest: public MainThreadRequest { public: SignalRequest(int s, int r): MainThreadRequest(MTP_SIGHANDLER), signl(s), state(r) {} virtual void Perform(); int signl, state; }; // Called whenever a signal is received. static void handle_signal(SIG_HANDLER_ARGS(s, c)) { if (waitSema != 0) { lastSignals[s]++; // Assume this is atomic with respect to reading. // Wake the signal detection thread. waitSema->Signal(); } } void SignalRequest::Perform() { struct sigaction action; memset(&action, 0, sizeof(action)); switch (state) { case DEFAULT_SIG: action.sa_handler = SIG_DFL; sigaction(signl, &action, 0); break; case IGNORE_SIG: action.sa_handler = SIG_IGN; sigaction(signl, &action, 0); break; case HANDLE_SIG: setSignalHandler(signl, handle_signal); break; } } #endif /* CALL_IO2(Sig_dispatch_,IND) */ /* This function behaves fairly similarly to the Unix and Windows signal handler. It takes a signal number and a handler which may be a function or may be 0 (default) or 1 (ignore) and returns the value corresponding to the previous handler. I've used a general dispatch function here to allow for future expansion. */ Handle Sig_dispatch_c(TaskData *taskData, Handle args, Handle code) { int c = get_C_int(taskData, DEREFWORDHANDLE(code)); switch (c) { case 0: /* Set up signal handler. */ { int sign; int action; Handle oldaction; { // Lock while we look at the signal vector but release // it before making a root request. PLocker locker(&sigLock); // We have to pass this to the main thread to // set up the signal handler. sign = get_C_int(taskData, DEREFHANDLE(args)->Get(0)); /* Decode the action if it is Ignore or Default. */ if (IS_INT(DEREFHANDLE(args)->Get(1))) action = (int)UNTAGGED(DEREFHANDLE(args)->Get(1)); else action = HANDLE_SIG; /* Set the handler. */ if (sign <= 0 || sign >= NSIG) raise_syscall(taskData, "Invalid signal value", EINVAL); /* Get the old action before updating the vector. */ oldaction = SAVE(findHandler(sign)); // Now update it. sigData[sign].handler = DEREFWORDHANDLE(args)->Get(1); } // Request a change in the masking by the root thread. // This doesn't do anything in Windows so the only "signal" // we affect is SIGINT and that is handled by RequestConsoleInterrupt. if (! sigData[sign].nonMaskable) { #ifdef USE_PTHREAD_SIGNALS SignalRequest request(sign, action); processes->MakeRootRequest(taskData, &request); #endif } return oldaction; } case 1: // Called by the signal handler thread. Blocks until a signal // is available. { while (true) { processes->ProcessAsynchRequests(taskData); // Check for kill. sigLock.Lock(); // Any pending signals? for (int sig = 0; sig < NSIG; sig++) { if (sigData[sig].signalCount > 0) { sigData[sig].signalCount--; if (!IS_INT(findHandler(sig))) /* If it's not DEFAULT or IGNORE. */ { // Create a pair of the handler and signal and pass // them back to be run. Handle pair = alloc_and_save(taskData, 2); // Have to call findHandler again here because that // allocation could have garbage collected. DEREFHANDLE(pair)->Set(0, findHandler(sig)); DEREFHANDLE(pair)->Set(1, TAGGED(sig)); sigLock.Unlock(); return pair; } } } if (convertedWeak) { // Last GC converted a weak SOME into NONE. This isn't // anything to do with signals but the signal thread can // deal with this. sigLock.Unlock(); convertedWeak = false; return SAVE(TAGGED(0)); } // No pending signal. Wait until we're woken up. // This releases sigLock after acquiring schedLock. if (! processes->WaitForSignal(taskData, &sigLock)) raise_exception_string(taskData, EXC_Fail, "Only one thread may wait for signals"); } } default: { char msg[100]; sprintf(msg, "Unknown signal function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } // Set up per-thread signal data: basically signal stack. // This is really only needed for profiling timer signals. void initThreadSignals(TaskData *taskData) { #if (!(defined(_WIN32)||defined(MACOSX))) // On the i386, at least, we need to set up a signal stack for // each thread if it might receive a signal. ML code checks for // stack overflow but a signal could result in C code being // executed on the ML stack. The signal stack avoids this. // On some architectures the C stack pointer is left unused // when executing ML code so this isn't a problem. // In Linux each thread can receive a SIGVTALRM signal when // profiling. // This is currently disabled in Mac OS X. In 10.4 and before // setting a signal stack in a thread seemed to set it for the // whole process and crash with an illegal instruction on the // second signal. This isn't currently a problem since only the // main thread receives signals in Mac OS X. #if (defined(SA_ONSTACK) && defined(HAVE_SIGALTSTACK)) taskData->signalStack = malloc(SIGSTKSZ); #ifdef HAVE_STACK_T stack_t ex_stack; #else // This used to be used in FreeBSD and Mac OS X struct sigaltstack ex_stack; #endif memset(&ex_stack, 0, sizeof(ex_stack)); // Cast to char* because ss_sp is char* in FreeBSD. // Linux simply casts it back to void*. ex_stack.ss_sp = (char*)taskData->signalStack; ex_stack.ss_size = SIGSTKSZ; ex_stack.ss_flags = 0; /* not SS_DISABLE */ int sigaltstack_result = sigaltstack(&ex_stack, NULL); ASSERT(sigaltstack_result == 0); #endif #endif /* not the PC */ #ifdef USE_PTHREAD_SIGNALS // Block all signals except those marked as in use by the RTS so // that they will only be picked up by the signal detection thread. // Since the signal mask is inherited we really don't need to do // this for every thread, just the initial one. sigset_t sigset; sigfillset(&sigset); for (int i = 0; i < NSIG; i++) { if (sigData[i].nonMaskable) sigdelset(&sigset, i); } pthread_sigmask(SIG_SETMASK, &sigset, NULL); #endif } /* General purpose function to set up a signal handler. */ #if (!defined(_WIN32) || defined(__CYGWIN__)) bool setSignalHandler(int sig, signal_handler_type func) { struct sigaction sigcatch; memset(&sigcatch, 0, sizeof(sigcatch)); sigcatch.sa_sigaction = func; /* Both Linux and FreeBSD now use SA_SIGINFO in a similar way. If SA_SIGINFO is set the handler is supposed to be in sa_sigaction rather than sa_handler (actually this is a union so they're in the same place). */ init_asyncmask(&sigcatch.sa_mask); sigcatch.sa_flags = 0; #if defined(SA_ONSTACK) && defined(HAVE_SIGALTSTACK) sigcatch.sa_flags |= SA_ONSTACK; #endif #ifdef SA_RESTART sigcatch.sa_flags |= SA_RESTART; #endif #ifdef SA_SIGINFO sigcatch.sa_flags |= SA_SIGINFO; #endif #ifdef SV_SAVE_REGS sigcatch.sa_flags |= SV_SAVE_REGS; #endif return sigaction(sig, &sigcatch,NULL) >= 0; } // Signals to mask off when handling a signal. The signal being handled // is always masked off. This really only applied when emulation traps // and requests to GC involved signals. That no longer applies except // on the Sparc. void init_asyncmask(sigset_t *mask) { /* disable asynchronous interrupts while servicing interrupt */ sigemptyset(mask); sigaddset(mask,SIGVTALRM); sigaddset(mask,SIGINT); sigaddset(mask,SIGUSR2); sigaddset(mask,SIGWINCH); // This next used to be needed when emulation traps resulted in // signals. This no longer applies except on the Sparc. #ifdef SPARC sigaddset(mask,SIGILL); sigaddset(mask,SIGFPE); /* Mask off SIGSEGV. This is definitely needed when we are installing a handler for SIGINT under Linux and may also be needed in other cases as well e.g. SIGVTALRM. Without it typing control-C to a program which is taking lots of emulation traps can cause a crash because the signals are delivered in the "wrong" order and the pc value given to catchSEGV can point at the handler for SIGINT. DCJM 7/2/01. */ sigaddset(mask,SIGSEGV); /* And, just to be sure, include SIGBUS. DCJM 22/5/02. */ sigaddset(mask,SIGBUS); #endif } #endif class SigHandler: public RtsModule { public: virtual void Init(void); virtual void Stop(void); virtual void GarbageCollect(ScanAddress * /*process*/); #ifdef USE_PTHREAD_SIGNALS SigHandler() { threadRunning = false; } pthread_t detectionThreadId; bool threadRunning; #endif }; // Declare this. It will be automatically added to the table. static SigHandler sighandlerModule; #ifdef USE_PTHREAD_SIGNALS // This thread is really only to convert between POSIX semaphores and // pthread condition variables. It waits for a semphore to be released by the // signal handler running on the main thread and then wakes up the ML handler // thread. The ML thread must not wait directly on a POSIX semaphore because it // may also be woken by other events, particularly a kill request when the program // exits. static void *SignalDetectionThread(void *) { // Block all signals so they will be delivered to the main thread. sigset_t active_signals; sigfillset(&active_signals); pthread_sigmask(SIG_SETMASK, &active_signals, NULL); int readSignals[NSIG]; memset(readSignals, 0, sizeof(readSignals)); while (true) { if (waitSema == 0) return 0; // Wait until we are woken up by an arriving signal. // waitSema will be incremented for each signal so we should // not block until we have processed them all. if (! waitSema->Wait() || terminate) return 0; for (int j = 1; j < NSIG; j++) { if (readSignals[j] < lastSignals[j]) { readSignals[j]++; signalArrived(j); } } } } #endif void SigHandler::Init(void) { // Mark certain signals as non-maskable since they really // indicate a fatal error. #ifdef SIGSEGV sigData[SIGSEGV].nonMaskable = true; #endif #ifdef SIGBUS sigData[SIGBUS].nonMaskable = true; #endif #ifdef SIGILL sigData[SIGILL].nonMaskable = true; #endif #ifdef USE_PTHREAD_SIGNALS static PSemaphore waitSemaphore; // Initialise the "wait" semaphore so that it blocks immediately. if (! waitSemaphore.Init(0, NSIG)) return; waitSema = &waitSemaphore; // Create a new thread to handle signals synchronously. // for it to finish. pthread_attr_t attrs; pthread_attr_init(&attrs); #ifdef PTHREAD_STACK_MIN #if (PTHREAD_STACK_MIN < 4096) pthread_attr_setstacksize(&attrs, 4096); // But not too small: FreeBSD makes it 2k #else pthread_attr_setstacksize(&attrs, PTHREAD_STACK_MIN); // Only small stack. #endif #endif threadRunning = pthread_create(&detectionThreadId, &attrs, SignalDetectionThread, 0) == 0; pthread_attr_destroy(&attrs); #endif } // Wait for the signal thread to finish before the semaphore is deleted in the // final clean-up. Failing to do this causes a hang in Mac OS X. void SigHandler::Stop(void) { #ifdef USE_PTHREAD_SIGNALS terminate = true; waitSema->Signal(); pthread_join(detectionThreadId, NULL); #endif } void SigHandler::GarbageCollect(ScanAddress *process) { for (unsigned i = 0; i < NSIG; i++) { if (sigData[i].handler != PolyWord::FromUnsigned(0)) process->ScanRuntimeWord(&sigData[i].handler); } } polyml-5.6/libpolyml/sighandler.h000066400000000000000000000032211265146633400172040ustar00rootroot00000000000000/* Title: sighandler.h Copyright (c) 2000-7 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _SIGHANDLER_H #define _SIGHANDLER_H 1 class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle Sig_dispatch_c(TaskData *taskData, Handle handler, Handle sig); extern void markSignalInuse(int sig); #if (defined(_WIN32) && ! defined(__CYGWIN__)) extern void RequestConsoleInterrupt(void); #else #ifdef HAVE_SIGNAL_H #include #endif extern void init_asyncmask(sigset_t *mask); #define SIG_HANDLER_ARGS(_sig,_contxt) int _sig, siginfo_t *, void *_contxt typedef void (*signal_handler_type)(SIG_HANDLER_ARGS(s, c)); extern bool setSignalHandler(int sig, signal_handler_type func); // Set up per-thread signal data: basically signal stack. extern void initThreadSignals(TaskData *taskData); #endif /* ! _WIN32 */ extern unsigned receivedSignalCount; // Incremented each time we get a signal #endif polyml-5.6/libpolyml/statistics.cpp000066400000000000000000000534311265146633400176210ustar00rootroot00000000000000/* Title: statics.cpp - Profiling statistics Copyright (c) 2011, 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_WINDOWS_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_MMAN_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TIMES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_RESOURCE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #if defined(HAVE_MMAP) // How do we get the page size? #ifndef HAVE_GETPAGESIZE #ifdef _SC_PAGESIZE #define getpagesize() sysconf(_SC_PAGESIZE) #else // If this fails we're stuck #define getpagesize() PAGESIZE #endif #endif #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #else #define _T(x) x #endif #include "run_time.h" #include "sys.h" #include "save_vec.h" #include "rts_module.h" #include "timing.h" #include "polystring.h" #include "processes.h" #include "statistics.h" #include "../polystatistics.h" #define STATS_SPACE 4096 // Enough for all the statistics #define ASN1_U_BOOL 1 #define ASN1_U_INT 2 #define ASN1_U_STRING 4 #define ASN1_U_NULL 5 #define ASN1_U_ENUM 10 #define ASN1_U_SEQUENCE 16 // For the moment we don't bother to interlock access to the statistics memory. // Other processes only read the memory and at worst they may get a glitch in // the values. Statistics::Statistics(): accessLock("Statistics") { statMemory = 0; memSize = 0; newPtr = 0; for (unsigned i = 0; i < N_PS_INTS; i++) counterAddrs[i] = 0; for (unsigned j = 0; j < N_PS_TIMES; j++) timeAddrs[j].secAddr = timeAddrs[j].usecAddr = 0; for (unsigned k = 0; k < N_PS_USER; k++) userAddrs[k] = 0; memset(&gcUserTime, 0, sizeof(gcUserTime)); memset(&gcSystemTime, 0, sizeof(gcSystemTime)); #ifdef HAVE_WINDOWS_H // File mapping handle hFileMap = NULL; exportStats = true; // Actually unused #else mapFd = -1; mapFileName = 0; exportStats = false; // Don't export by default #endif memSize = 0; statMemory = 0; newPtr = 0; } void Statistics::Init() { #ifdef HAVE_WINDOWS_H // Get the process ID to use in the shared memory name DWORD pid = ::GetCurrentProcessId(); TCHAR shmName[MAX_PATH]; wsprintf(shmName, _T(POLY_STATS_NAME) _T("%lu"), pid); // Create a piece of shared memory hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, STATS_SPACE, shmName); if (hFileMap == NULL) return; // If it already exists it's the wrong one. if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hFileMap); hFileMap = NULL; return; } statMemory = (unsigned char*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, STATS_SPACE); if (statMemory == NULL) { CloseHandle(hFileMap); hFileMap = NULL; return; } memSize = STATS_SPACE; #else #if HAVE_MMAP if (exportStats) { // Create the shared memory in the user's .polyml directory int pageSize = getpagesize(); memSize = (STATS_SPACE + pageSize-1) & ~(pageSize-1); char *homeDir = getenv("HOME"); if (homeDir == NULL) return; mapFileName = (char*)malloc(strlen(homeDir) + 100); strcpy(mapFileName, homeDir); strcat(mapFileName, "/.polyml"); mkdir(mapFileName, 0777); // Make the directory to ensure it exists sprintf(mapFileName + strlen(mapFileName), "/" POLY_STATS_NAME "%d", getpid()); // Open the file. Truncates it if it already exists. That should only happen // if a previous run with the same process id crashed. mapFd = open(mapFileName, O_RDWR|O_CREAT, 0444); if (mapFd == -1) return; // Write enough of the file to fill the space. char ch = 0; for (size_t i = 0; i < memSize; i++) write(mapFd, &ch, 1); statMemory = (unsigned char*)mmap(0, memSize, PROT_READ|PROT_WRITE, MAP_SHARED, mapFd, 0); if (statMemory == MAP_FAILED) { statMemory = 0; return; } } else #endif { // If we just want the statistics locally. statMemory = (unsigned char*)malloc(STATS_SPACE); if (statMemory == 0) return; memset(statMemory, 0, STATS_SPACE); } #endif // Set up the ASN1 structure in the statistics area. newPtr = statMemory; *newPtr++ = POLY_STATS_C_STATISTICS; // Context tag for statistics *newPtr++ = 0x82; // Extended length, 2 bytes *newPtr++ = 0x00; // Length is initially zero *newPtr++ = 0x00; addCounter(PSC_THREADS, POLY_STATS_ID_THREADS, "ThreadCount"); addCounter(PSC_THREADS_IN_ML, POLY_STATS_ID_THREADS_IN_ML, "ThreadsInML"); addCounter(PSC_THREADS_WAIT_IO, POLY_STATS_ID_THREADS_WAIT_IO, "ThreadsInIOWait"); addCounter(PSC_THREADS_WAIT_MUTEX, POLY_STATS_ID_THREADS_WAIT_MUTEX, "ThreadsInMutexWait"); addCounter(PSC_THREADS_WAIT_CONDVAR, POLY_STATS_ID_THREADS_WAIT_CONDVAR, "ThreadsInCondVarWait"); addCounter(PSC_THREADS_WAIT_SIGNAL, POLY_STATS_ID_THREADS_WAIT_SIGNAL, "ThreadsInSignalWait"); addCounter(PSC_GC_FULLGC, POLY_STATS_ID_GC_FULLGC, "FullGCCount"); addCounter(PSC_GC_PARTIALGC, POLY_STATS_ID_GC_PARTIALGC, "PartialGCCount"); addSize(PSS_TOTAL_HEAP, POLY_STATS_ID_TOTAL_HEAP, "TotalHeap"); addSize(PSS_AFTER_LAST_GC, POLY_STATS_ID_AFTER_LAST_GC, "HeapAfterLastGC"); addSize(PSS_AFTER_LAST_FULLGC, POLY_STATS_ID_AFTER_LAST_FULLGC, "HeapAfterLastFullGC"); addSize(PSS_ALLOCATION, POLY_STATS_ID_ALLOCATION, "AllocationSpace"); addSize(PSS_ALLOCATION_FREE, POLY_STATS_ID_ALLOCATION_FREE, "AllocationSpaceFree"); addTime(PST_NONGC_UTIME, POLY_STATS_ID_NONGC_UTIME, "NonGCUserTime"); addTime(PST_NONGC_STIME, POLY_STATS_ID_NONGC_STIME, "NonGCSystemTime"); addTime(PST_GC_UTIME, POLY_STATS_ID_GC_UTIME, "GCUserTime"); addTime(PST_GC_STIME, POLY_STATS_ID_GC_STIME, "GCSystemTime"); addUser(0, POLY_STATS_ID_USER0, "UserCounter0"); addUser(1, POLY_STATS_ID_USER1, "UserCounter1"); addUser(2, POLY_STATS_ID_USER2, "UserCounter2"); addUser(3, POLY_STATS_ID_USER3, "UserCounter3"); addUser(4, POLY_STATS_ID_USER4, "UserCounter4"); addUser(5, POLY_STATS_ID_USER5, "UserCounter5"); addUser(6, POLY_STATS_ID_USER6, "UserCounter6"); addUser(7, POLY_STATS_ID_USER7, "UserCounter7");} void Statistics::addCounter(int cEnum, unsigned statId, const char *name) { // Tag header *newPtr++ = POLY_STATS_C_COUNTERSTAT; *newPtr++ = 0x00; // Initial length - overwritten at the end unsigned char *tagStart = newPtr; // First item - Id of this statistic - Implicit int *newPtr++ = POLY_STATS_C_IDENTIFIER; *newPtr++ = 0x01; ASSERT(statId < 128); *newPtr++ = statId; // Second item - The name size_t nameLength = strlen(name); ASSERT(nameLength < 125); *newPtr++ = POLY_STATS_C_NAME; *newPtr++ = (unsigned char)nameLength; for (unsigned i = 0; i < nameLength; i++) *newPtr++ = name[i]; // Third item - the counter itself. // This, along with the other counters, is technically incorrect // for an ASN1 integer because it should not contain more than // one zero byte. *newPtr++ = POLY_STATS_C_COUNTER_VALUE; *newPtr++ = sizeof(POLYUNSIGNED); counterAddrs[cEnum] = newPtr; // This is the address for (unsigned j = 0; j < sizeof(POLYUNSIGNED); j++) *newPtr++ = 0; // Finally set the tag length and the overall size. size_t length = newPtr - tagStart; ASSERT(length < 128); tagStart[-1] = (unsigned char)length; // Set the overall size. length = newPtr-statMemory - 4; statMemory[2] = (length >> 8) & 0xff; statMemory[3] = length & 0xff; } void Statistics::addSize(int cEnum, unsigned statId, const char *name) { // Tag header *newPtr++ = POLY_STATS_C_SIZESTAT; *newPtr++ = 0x00; // Initial length - overwritten at the end unsigned char *tagStart = newPtr; // First item - Id of this statistic - Implicit int *newPtr++ = POLY_STATS_C_IDENTIFIER; *newPtr++ = 0x01; ASSERT(statId < 128); *newPtr++ = statId; // Second item - The name size_t nameLength = strlen(name); ASSERT(nameLength < 125); *newPtr++ = POLY_STATS_C_NAME; *newPtr++ = (unsigned char)nameLength; for (unsigned i = 0; i < nameLength; i++) *newPtr++ = name[i]; // Third item - the size value itself. We have to allow one // byte extra to ensure that the value we encode is unsigned. unsigned bytes = sizeof(size_t) + 1; *newPtr++ = POLY_STATS_C_BYTE_COUNT; *newPtr++ = bytes; counterAddrs[cEnum] = newPtr; // This is the address for (unsigned j = 0; j < bytes; j++) *newPtr++ = 0; // Finally set the tag length and the overall size. size_t length = newPtr - tagStart; ASSERT(length < 128); tagStart[-1] = (unsigned char)length; // Set the overall size. length = newPtr-statMemory - 4; statMemory[2] = (length >> 8) & 0xff; statMemory[3] = length & 0xff; } void Statistics::addTime(int cEnum, unsigned statId, const char *name) { // Tag header *newPtr++ = POLY_STATS_C_TIMESTAT; *newPtr++ = 0x00; // Initial length - overwritten at the end unsigned char *tagStart = newPtr; // First item - Id of this statistic - Implicit int *newPtr++ = POLY_STATS_C_IDENTIFIER; *newPtr++ = 0x01; ASSERT(statId < 128); *newPtr++ = statId; // Second item - The name size_t nameLength = strlen(name); ASSERT(nameLength < 125); *newPtr++ = POLY_STATS_C_NAME; *newPtr++ = (unsigned char)nameLength; for (unsigned i = 0; i < nameLength; i++) *newPtr++ = name[i]; // Third item - the time. Two four byte values. *newPtr++ = POLY_STATS_C_TIME; *newPtr++ = 12; *newPtr++ = POLY_STATS_C_SECONDS; *newPtr++ = 4; timeAddrs[cEnum].secAddr = newPtr; // This is the address for (unsigned j = 0; j < 4; j++) *newPtr++ = 0; *newPtr++ = POLY_STATS_C_MICROSECS; *newPtr++ = 4; timeAddrs[cEnum].usecAddr = newPtr; // This is the address for (unsigned k = 0; k < 4; k++) *newPtr++ = 0; // Finally set the tag length and the overall size. size_t length = newPtr - tagStart; ASSERT(length < 128); tagStart[-1] = (unsigned char)length; // Set the overall size. length = newPtr-statMemory - 4; statMemory[2] = (length >> 8) & 0xff; statMemory[3] = length & 0xff; } void Statistics::addUser(int n, unsigned statId, const char *name) { // Tag header *newPtr++ = POLY_STATS_C_USERSTAT; *newPtr++ = 0x00; // Initial length - overwritten at the end unsigned char *tagStart = newPtr; // First item - Id of this statistic - Implicit int *newPtr++ = POLY_STATS_C_IDENTIFIER; *newPtr++ = 0x01; ASSERT(statId < 128); *newPtr++ = statId; // Second item - The name size_t nameLength = strlen(name); ASSERT(nameLength < 125); *newPtr++ = POLY_STATS_C_NAME; *newPtr++ = (unsigned char)nameLength; for (unsigned i = 0; i < nameLength; i++) *newPtr++ = name[i]; // Third item - the counter itself. For a user counter the value is a POLYSIGNED. *newPtr++ = POLY_STATS_C_COUNTER_VALUE; *newPtr++ = sizeof(POLYSIGNED); userAddrs[n] = newPtr; // This is the address for (unsigned j = 0; j < sizeof(POLYSIGNED); j++) *newPtr++ = 0; // Finally set the tag length and the overall size. size_t length = newPtr - tagStart; ASSERT(length < 128); tagStart[-1] = (unsigned char)length; // Set the overall size. length = newPtr-statMemory - 4; statMemory[2] = (length >> 8) & 0xff; statMemory[3] = length & 0xff; } Statistics::~Statistics() { #ifdef HAVE_WINDOWS_H if (statMemory != NULL) ::UnmapViewOfFile(statMemory); if (hFileMap != NULL) ::CloseHandle(hFileMap); #else #if HAVE_MMAP if (mapFileName != 0) { if (statMemory != 0 && statMemory != MAP_FAILED) munmap(statMemory, memSize); if (mapFd != -1) close(mapFd); if (mapFileName != 0) unlink(mapFileName); free(mapFileName); } else #endif { free(statMemory); } #endif } // Counters. These are used for thread state so need interlocks void Statistics::incCount(int which) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); unsigned length = counterAddrs[which][-1]; while (length--) { if ((++counterAddrs[which][length]) != 0) break; } } } void Statistics::decCount(int which) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); unsigned length = counterAddrs[which][-1]; while (length--) { if ((counterAddrs[which][length]--) != 0) break; } } } // Sizes. Some of these are only set during GC so may not need interlocks size_t Statistics::getSizeWithLock(int which) { unsigned length = counterAddrs[which][-1]; size_t result = 0; for (unsigned i = 0; i < length; i++) result = (result << 8) | counterAddrs[which][i]; return result; } void Statistics::setSizeWithLock(int which, size_t s) { unsigned length = counterAddrs[which][-1]; while (length--) { counterAddrs[which][length] = (unsigned char)(s & 0xff); s = s >> 8; } } void Statistics::setSize(int which, size_t s) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); setSizeWithLock(which, s); } } void Statistics::incSize(int which, size_t s) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); setSizeWithLock(which, getSizeWithLock(which) + s); } } void Statistics::decSize(int which, size_t s) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); setSizeWithLock(which, getSizeWithLock(which) - s); } } size_t Statistics::getSize(int which) { if (statMemory && counterAddrs[which]) { PLocker lock(&accessLock); return getSizeWithLock(which); } else return 0; } void Statistics::setTimeValue(int which, unsigned long secs, unsigned long usecs) { if (statMemory && timeAddrs[which].secAddr && timeAddrs[which].usecAddr) { PLocker lock(&accessLock); // Necessary ??? unsigned sLength = timeAddrs[which].secAddr[-1]; while (sLength--) { timeAddrs[which].secAddr[sLength] = (unsigned char)(secs & 0xff); secs = secs >> 8; } unsigned usLength = timeAddrs[which].usecAddr[-1]; while (usLength--) { timeAddrs[which].usecAddr[usLength] = (unsigned char)(usecs & 0xff); usecs = usecs >> 8; } } } #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Native Windows void Statistics::copyGCTimes(const FILETIME &gcUtime, const FILETIME &gcStime) { gcUserTime = gcUtime; gcSystemTime = gcStime; ULARGE_INTEGER li; li.LowPart = gcUtime.dwLowDateTime; li.HighPart = gcUtime.dwHighDateTime; setTimeValue(PST_GC_UTIME, (unsigned long)(li.QuadPart / 10000000), (unsigned long)((li.QuadPart / 10) % 1000000)); li.LowPart = gcStime.dwLowDateTime; li.HighPart = gcStime.dwHighDateTime; setTimeValue(PST_GC_STIME, (unsigned long)(li.QuadPart / 10000000), (unsigned long)((li.QuadPart / 10) % 1000000)); } #else // Unix void Statistics::copyGCTimes(const struct timeval &gcUtime, const struct timeval &gcStime) { gcUserTime = gcUtime; gcSystemTime = gcStime; setTimeValue(PST_GC_UTIME, gcUtime.tv_sec, gcUtime.tv_usec); setTimeValue(PST_GC_STIME, gcStime.tv_sec, gcStime.tv_usec); } #endif // Update the statistics that are not otherwise copied. Called from the // root thread every second. void Statistics::updatePeriodicStats(POLYUNSIGNED freeWords, unsigned threadsInML) { setSize(PSS_ALLOCATION_FREE, freeWords*sizeof(PolyWord)); #if (defined(HAVE_WINDOWS_H) && ! defined(__CYGWIN__)) FILETIME ct, et, st, ut; GetProcessTimes(GetCurrentProcess(), &ct, &et, &st, &ut); subFiletimes(&st, &gcSystemTime); subFiletimes(&ut, &gcUserTime); ULARGE_INTEGER li; li.LowPart = ut.dwLowDateTime; li.HighPart = ut.dwHighDateTime; setTimeValue(PST_NONGC_UTIME, (unsigned long)(li.QuadPart / 10000000), (unsigned long)((li.QuadPart / 10) % 1000000)); li.LowPart = st.dwLowDateTime; li.HighPart = st.dwHighDateTime; setTimeValue(PST_NONGC_STIME, (unsigned long)(li.QuadPart / 10000000), (unsigned long)((li.QuadPart / 10) % 1000000)); #elif HAVE_GETRUSAGE struct rusage usage; getrusage(RUSAGE_SELF, &usage); subTimevals(&usage.ru_stime, &gcSystemTime); subTimevals(&usage.ru_utime, &gcUserTime); setTimeValue(PST_NONGC_UTIME, usage.ru_utime.tv_sec, usage.ru_utime.tv_usec); setTimeValue(PST_NONGC_STIME, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); #endif if (statMemory && counterAddrs[PSC_THREADS_IN_ML]) { PLocker lock(&accessLock); unsigned length = counterAddrs[PSC_THREADS_IN_ML][-1]; while (length--) { counterAddrs[PSC_THREADS_IN_ML][length] = (unsigned char)(threadsInML & 0xff); threadsInML = threadsInML >> 8; } } } void Statistics::setUserCounter(unsigned which, POLYSIGNED value) { if (statMemory && userAddrs[which]) { PLocker lock(&accessLock); // Not really needed // The ASN1 int is big-endian unsigned length = userAddrs[which][-1]; while (length--) { userAddrs[which][length] = (unsigned char)value; value = value >> 8; } } } Handle Statistics::returnStatistics(TaskData *taskData, unsigned char *stats) { // Parse the ASN1 tag and length. unsigned char *p = stats; if (*p == POLY_STATS_C_STATISTICS) // Check and skip the tag { p++; if ((*p & 0x80) == 0) p += *p + 1; else { int lengthOfLength = *p++ & 0x7f; if (lengthOfLength != 0) { unsigned l = 0; while (lengthOfLength--) l = (l << 8) | *p++; p += l; } } } return taskData->saveVec.push(C_string_to_Poly(taskData, (const char*)stats, p - stats)); } // Copy the local statistics into the buffer Handle Statistics::getLocalStatistics(TaskData *taskData) { if (statMemory == 0) raise_exception_string(taskData, EXC_Fail, "No statistics available"); return returnStatistics(taskData, statMemory); } // Get statistics for a remote instance. We don't do any locking Handle Statistics::getRemoteStatistics(TaskData *taskData, POLYUNSIGNED pid) { #ifdef HAVE_WINDOWS_H TCHAR shmName[MAX_PATH]; wsprintf(shmName, _T(POLY_STATS_NAME) _T("%") _T(POLYUFMT), pid); HANDLE hRemMemory = OpenFileMapping(FILE_MAP_READ, FALSE, shmName); if (hRemMemory == NULL) raise_exception_string(taskData, EXC_Fail, "No statistics available"); unsigned char *sMem = (unsigned char *)MapViewOfFile(hRemMemory, FILE_MAP_READ, 0, 0, 0); CloseHandle(hRemMemory); if (sMem == NULL) raise_exception_string(taskData, EXC_Fail, "No statistics available"); if (*sMem != POLY_STATS_C_STATISTICS) { UnmapViewOfFile(sMem); raise_exception_string(taskData, EXC_Fail, "Statistics data malformed"); } Handle result = returnStatistics(taskData, sMem); UnmapViewOfFile(sMem); return result; #elif HAVE_MMAP // Find the shared memory in the user's home directory int remMapFd = -1; char remMapFileName[MAXPATHLEN]; remMapFileName[0] = 0; char *homeDir = getenv("HOME"); if (homeDir == NULL) raise_exception_string(taskData, EXC_Fail, "No statistics available"); sprintf(remMapFileName, "%s/.polyml/" POLY_STATS_NAME "%" POLYUFMT, homeDir, pid); remMapFd = open(remMapFileName, O_RDONLY); if (remMapFd == -1) raise_exception_string(taskData, EXC_Fail, "No statistics available"); unsigned char *sMem = (unsigned char*)mmap(0, memSize, PROT_READ, MAP_PRIVATE, remMapFd, 0); if (sMem == MAP_FAILED) { close(remMapFd); raise_exception_string(taskData, EXC_Fail, "No statistics available"); } // Check the tag. if (*sMem != POLY_STATS_C_STATISTICS) { munmap(sMem, memSize); close(remMapFd); raise_exception_string(taskData, EXC_Fail, "Statistics data malformed"); } Handle result = returnStatistics(taskData, sMem); munmap(sMem, memSize); close(remMapFd); return result; #else raise_exception_string(taskData, EXC_Fail, "No statistics available"); #endif } // Create the global statistics object. Statistics globalStats; polyml-5.6/libpolyml/statistics.h000066400000000000000000000100131265146633400172530ustar00rootroot00000000000000/* Title: statics.h - Interface to profiling statistics Copyright (c) 2011, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef STATISTICS_INCLUDED #define STATISTICS_INCLUDED #ifdef HAVE_WINDOWS_H #include #endif #include "globals.h" #include "locking.h" #include "rts_module.h" #include "../polystatistics.h" enum { PSC_THREADS = 0, // Total number of threads PSC_THREADS_IN_ML, // Threads running ML code PSC_THREADS_WAIT_IO, // Threads waiting for IO PSC_THREADS_WAIT_MUTEX, // Threads waiting for a mutex PSC_THREADS_WAIT_CONDVAR, // Threads waiting for a condition var PSC_THREADS_WAIT_SIGNAL, // Special case - signal handling thread PSC_GC_FULLGC, // Number of full garbage collections PSC_GC_PARTIALGC, // Number of partial GCs PSS_TOTAL_HEAP, // Total size of the local heap PSS_AFTER_LAST_GC, // Space free after last GC PSS_AFTER_LAST_FULLGC, // Space free after the last full GC PSS_ALLOCATION, // Size of allocation space PSS_ALLOCATION_FREE, // Space available in allocation area N_PS_INTS }; enum { PST_NONGC_UTIME, PST_NONGC_STIME, PST_GC_UTIME, PST_GC_STIME, N_PS_TIMES }; // A few counters that can be used by the application #define N_PS_USER 8 class TaskData; class SaveVecEntry; typedef SaveVecEntry *Handle; class Statistics: RtsModule { public: Statistics(); ~Statistics(); virtual void Init(void); // Initialise after set-up Handle getLocalStatistics(TaskData *taskData); Handle getRemoteStatistics(TaskData *taskData, POLYUNSIGNED processId); void incCount(int which); void decCount(int which); void setSize(int which, size_t s); void incSize(int which, size_t s); void decSize(int which, size_t s); size_t getSize(int which); void setUserCounter(unsigned which, POLYSIGNED value); #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Native Windows void copyGCTimes(const FILETIME &gcUtime, const FILETIME &gcStime); FILETIME gcUserTime, gcSystemTime; #else // Unix and Cygwin void copyGCTimes(const struct timeval &gcUtime, const struct timeval &gcStime); struct timeval gcUserTime, gcSystemTime; #endif void updatePeriodicStats(POLYUNSIGNED freeSpace, unsigned threadsInML); bool exportStats; private: PLock accessLock; #ifdef HAVE_WINDOWS_H // File mapping handle HANDLE hFileMap; #else char *mapFileName; int mapFd; #endif size_t memSize; unsigned char *statMemory; unsigned char *newPtr; unsigned char *counterAddrs[N_PS_INTS]; struct { unsigned char *secAddr; unsigned char *usecAddr; } timeAddrs[N_PS_TIMES]; unsigned char *userAddrs[N_PS_USER]; Handle returnStatistics(TaskData *taskData, unsigned char *stats); void addCounter(int cEnum, unsigned statId, const char *name); void addSize(int cEnum, unsigned statId, const char *name); void addTime(int cEnum, unsigned statId, const char *name); void addUser(int n, unsigned statId, const char *name); size_t getSizeWithLock(int which); void setSizeWithLock(int which, size_t s); void setTimeValue(int which, unsigned long secs, unsigned long usecs); }; extern Statistics globalStats; #endif // STATISTICS_INCLUDED polyml-5.6/libpolyml/sys.h000066400000000000000000000256011265146633400157100ustar00rootroot00000000000000/* Title: sys.h Copyright (c) 2000-7 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2007-12, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This file is included in some of the assembly code files so it must only contain preprocessor directives and not C code. */ /* N.B. This must be kept consistent with the ML version in basis/RuntimeCalls.ML. There are tables of RTS call properties in poly_specific.cpp and of RTS function names in run_time.cpp. */ #ifndef _SYS_H #define _SYS_H /********************************************************************* * * Entries in the IO area. * *********************************************************************/ #define POLY_SYS_exit 1 #define POLY_SYS_chdir 9 #define POLY_SYS_alloc_store 11 #define POLY_SYS_alloc_uninit 12 #define POLY_SYS_raisex 14 /* This is now used only by SetException. */ #define POLY_SYS_get_length 15 #define POLY_SYS_get_flags 17 #define POLY_SYS_str_compare 23 /* DCJM 21/3/06 */ #define POLY_SYS_teststrgtr 26 #define POLY_SYS_teststrlss 27 #define POLY_SYS_teststrgeq 28 #define POLY_SYS_teststrleq 29 //#define POLY_SYS_exception_trace 30 //#define POLY_SYS_give_ex_trace 31 /* Called from exception unwind code. */ #define POLY_SYS_exception_trace_fn 32 #define POLY_SYS_give_ex_trace_fn 33 // Called to produce the exception trace #define POLY_SYS_lockseg 47 #define POLY_SYS_emptystring 48 // A value not a function #define POLY_SYS_nullvector 49 // A value not a function #define POLY_SYS_network 51 /* DCJM 22/5/00 */ #define POLY_SYS_os_specific 52 /* DCJM 22/5/00 */ #define POLY_SYS_eq_longword 53 #define POLY_SYS_neq_longword 54 #define POLY_SYS_geq_longword 55 #define POLY_SYS_leq_longword 56 #define POLY_SYS_gt_longword 57 #define POLY_SYS_lt_longword 58 #define POLY_SYS_io_dispatch 61 /* DCJM 8/5/00 */ #define POLY_SYS_signal_handler 62 /* DCJM 18/7/00 */ #define POLY_SYS_atomic_reset 69 /* DCJM 18/9/12 */ #define POLY_SYS_atomic_incr 70 /* DCJM 12/3/07 */ #define POLY_SYS_atomic_decr 71 /* DCJM 12/3/07 */ #define POLY_SYS_thread_self 72 /* DCJM 12/3/07 */ #define POLY_SYS_thread_dispatch 73 /* DCJM 12/3/07 */ #define POLY_SYS_plus_longword 74 #define POLY_SYS_minus_longword 75 #define POLY_SYS_mul_longword 76 #define POLY_SYS_div_longword 77 #define POLY_SYS_mod_longword 78 #define POLY_SYS_andb_longword 79 #define POLY_SYS_orb_longword 80 #define POLY_SYS_xorb_longword 81 #define POLY_SYS_kill_self 84 #define POLY_SYS_shift_left_longword 85 #define POLY_SYS_shift_right_longword 86 #define POLY_SYS_shift_right_arith_longword 87 #define POLY_SYS_profiler 88 #define POLY_SYS_longword_to_tagged 89 #define POLY_SYS_signed_to_longword 90 #define POLY_SYS_unsigned_to_longword 91 #define POLY_SYS_full_gc 92 /* MJC 18/03/91 */ #define POLY_SYS_stack_trace 93 /* MJC 18/03/91 */ #define POLY_SYS_timing_dispatch 94 /* DCJM 10/4/00 */ #define POLY_SYS_objsize 99 /* MJC 27/04/88 */ #define POLY_SYS_showsize 100 /* MJC 09/03/89 */ #define POLY_SYS_quotrem 104 /* DCJM 05/03/10 */ #define POLY_SYS_is_short 105 #define POLY_SYS_aplus 106 #define POLY_SYS_aminus 107 #define POLY_SYS_amul 108 #define POLY_SYS_adiv 109 #define POLY_SYS_amod 110 #define POLY_SYS_aneg 111 #define POLY_SYS_xora 112 /* DCJM 21/6/00 */ #define POLY_SYS_equala 113 #define POLY_SYS_ora 114 /* DCJM 21/6/00 */ #define POLY_SYS_anda 115 /* DCJM 21/6/00 */ #define POLY_SYS_Real_str 117 /* DCJM 6/4/00 */ #define POLY_SYS_Real_geq 118 /* DCJM 28/3/00 */ #define POLY_SYS_Real_leq 119 /* DCJM 28/3/00 */ #define POLY_SYS_Real_gtr 120 /* DCJM 28/3/00 */ #define POLY_SYS_Real_lss 121 /* DCJM 28/3/00 */ #define POLY_SYS_Real_eq 122 /* DCJM 28/3/00 */ #define POLY_SYS_Real_neq 123 /* DCJM 28/3/00 */ #define POLY_SYS_Real_Dispatch 124 /* DCJM 25/3/00 */ #define POLY_SYS_Add_real 125 #define POLY_SYS_Sub_real 126 #define POLY_SYS_Mul_real 127 #define POLY_SYS_Div_real 128 #define POLY_SYS_Abs_real 129 // DCJM 26/12/11 #define POLY_SYS_Neg_real 130 //#define POLY_SYS_Repr_real 132 #define POLY_SYS_conv_real 133 #define POLY_SYS_real_to_int 134 #define POLY_SYS_int_to_real 135 #define POLY_SYS_sqrt_real 136 #define POLY_SYS_sin_real 137 #define POLY_SYS_cos_real 138 #define POLY_SYS_arctan_real 139 #define POLY_SYS_exp_real 140 #define POLY_SYS_ln_real 141 #define POLY_SYS_stdin 148 #define POLY_SYS_stdout 149 #define POLY_SYS_process_env 150 /* DCJM 25/4/00 */ #define POLY_SYS_set_string_length 151 /* DCJM 28/2/01 */ #define POLY_SYS_get_first_long_word 152 /* DCJM 28/2/01 */ #define POLY_SYS_poly_specific 153 /* DCJM 17/6/06 */ #define POLY_SYS_bytevec_eq 154 /* DCJM 13/1/10 */ #define POLY_SYS_cmem_load_8 160 #define POLY_SYS_cmem_load_16 161 #define POLY_SYS_cmem_load_32 162 #define POLY_SYS_cmem_load_64 163 #define POLY_SYS_cmem_load_float 164 #define POLY_SYS_cmem_load_double 165 #define POLY_SYS_cmem_store_8 166 #define POLY_SYS_cmem_store_16 167 #define POLY_SYS_cmem_store_32 168 #define POLY_SYS_cmem_store_64 169 #define POLY_SYS_cmem_store_float 170 #define POLY_SYS_cmem_store_double 171 #define POLY_SYS_io_operation 189 #define POLY_SYS_ffi 190 #define POLY_SYS_move_words_overlap 193 #define POLY_SYS_set_code_constant 194 /* DCJM 2/1/01 */ #define POLY_SYS_move_words 195 /* DCJM 9/10/99 */ #define POLY_SYS_shift_right_arith_word 196 /* DCJM 9/10/99 */ #define POLY_SYS_int_to_word 197 /* DCJM 9/10/99 */ /* Obsolete: Now replaced by POLY_SYS_get_first_long_word. */ #define POLY_SYS_move_bytes 198 /* DCJM 9/10/99 */ #define POLY_SYS_move_bytes_overlap 199 #define POLY_SYS_code_flags 200 /* Previously POLY_SYS_set_flags */ #define POLY_SYS_shrink_stack 201 /* SPF 9/12/96 */ #define POLY_SYS_stderr 202 /* SPF 29/11/96 */ #define POLY_SYS_callcode_tupled 204 /* SPF 07/07/94 */ #define POLY_SYS_foreign_dispatch 205 /* NIC 22/04/94 */ #define POLY_SYS_foreign_null 206 // DCJM 16/11/11 #define POLY_SYS_XWindows 209 /* MJC 27/09/90 */ #define POLY_SYS_is_big_endian 213 /* added 30/3/95 (DCJM) */ #define POLY_SYS_bytes_per_word 214 /* added 30/3/95 (DCJM) */ #define POLY_SYS_offset_address 215 #define POLY_SYS_shift_right_word 216 #define POLY_SYS_word_neq 217 #define POLY_SYS_not_bool 218 #define POLY_SYS_string_length 223 #define POLY_SYS_touch_final 228 #define POLY_SYS_int_geq 231 #define POLY_SYS_int_leq 232 #define POLY_SYS_int_gtr 233 #define POLY_SYS_int_lss 234 #define POLY_SYS_load_byte_immut 235 #define POLY_SYS_load_word_immut 236 #define POLY_SYS_mul_word 238 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_plus_word 239 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_minus_word 240 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_div_word 241 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_or_word 242 #define POLY_SYS_and_word 243 #define POLY_SYS_xor_word 244 #define POLY_SYS_shift_left_word 245 #define POLY_SYS_mod_word 246 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_word_geq 247 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_word_leq 248 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_word_gtr 249 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_word_lss 250 /* Reinstated DCJM 9/10/99 */ #define POLY_SYS_word_eq 251 #define POLY_SYS_load_byte 252 #define POLY_SYS_load_word 253 #define POLY_SYS_assign_byte 254 #define POLY_SYS_assign_word 255 /********************************************************************* * * The number of entries in the IO area. * *********************************************************************/ #define POLY_SYS_vecsize 256 /****************************************************************** * * Exception identifiers * ******************************************************************/ #define EXC_interrupt 1 /* SML90.Interrupt */ #define EXC_syserr 2 /* System call failed. */ /* EXC_size (formerly EXC_range) is raised in a number of places, most particularly in alloc_store when given a length which is too large. As "Size" it is used extensively in the Basis library. */ #define EXC_size 4 /* General.Size */ #define EXC_overflow 5 /* General.Overflow */ #define EXC_underflow 6 /* This does not correspond to any ML exception. */ #define EXC_divide 7 /* General.Div */ #define EXC_conversion 8 /* EXC_conversion is used within the compiler and by conversion routines added by the compiler in order to signal failure of conversion. */ #define EXC_XWindows 10 /* EXC_subscript is raised both by the string subscript function and also by substring. As "Subscript" it is used extensively in the Basis library. */ #define EXC_subscript 11 /* General.Subscript */ #define EXC_thread 12 /* Thread.Thread. */ /* DCJM 13/3/07 */ #define EXC_extrace 13 // Used for exception tracing #define EXC_foreign 23 /* nic 4/5/94 */ #define EXC_Fail 103 /* DCJM 11/5/06 */ // Make sure to add any additional exceptions to make_exn. #endif polyml-5.6/libpolyml/timing.cpp000066400000000000000000000377101265146633400167200ustar00rootroot00000000000000/* Title: Time functions. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright (c) 2000 Cambridge University Technical Services Limited Further development copyright David C.J. Matthews 2011,12 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_LOCALE_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TIMES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_RESOURCE_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SYS_SIGNAL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_ASSERT_H #include #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif #include "locking.h" #include "globals.h" #include "arb.h" #include "run_time.h" #include "sys.h" #include "timing.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "processes.h" #include "heapsizing.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Windows file times are 64-bit numbers representing times in tenths of a microsecond. */ #define TICKS_PER_MICROSECOND 10 #ifdef __GNUC__ #define SECSSINCE1601 11644473600LL #else #define SECSSINCE1601 11644473600 #endif #else /* For Unix return times in microseconds. */ #define TICKS_PER_MICROSECOND 1 #endif /* The original Poly timing functions used a variety of timing bases (e.g. seconds, tenths of a second). The old functions have been retained but the intention is to phase them out in favour of new functions. Most of these are handled through the timing_dispatch function. The intention behind the timing functions is to make use of the arbitrary precision arithmetic to allow for a wider range of dates than the usual mktime range of 1970 to 2036. We also want to handle more accurate timing than per second or per microsecond where the operating system provides it. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) static FILETIME startTime; #else static struct timeval startTime; #endif #if(!(defined(HAVE_GMTIME_R) && defined(HAVE_LOCALTIME_R))) // gmtime and localtime are not re-entrant so if we don't have the // re-entrant versions we need to use a lock. static PLock timeLock("Timing"); #endif Handle timing_dispatch_c(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORDHANDLE(code)); switch (c) { case 0: /* Get ticks per microsecond. */ return Make_arbitrary_precision(taskData, TICKS_PER_MICROSECOND); case 1: /* Return time since the time base. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME ft; GetSystemTimeAsFileTime(&ft); return Make_arb_from_Filetime(taskData, ft); #else struct timeval tv; if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); return Make_arb_from_pair_scaled(taskData, tv.tv_sec, tv.tv_usec, 1000000); #endif } case 2: /* Return the base year. This is the year which corresponds to zero in the timing sequence. */ #if (defined(_WIN32) && ! defined(__CYGWIN__)) return Make_arbitrary_precision(taskData, 1601); #else return Make_arbitrary_precision(taskData, 1970); #endif case 3: /* In both Windows and Unix the time base is 1st of January in the base year. This function is provided just in case we are running on a system with a different base. It returns the number of seconds after 1st January of the base year that corresponds to zero of the time base. */ return Make_arbitrary_precision(taskData, 0); case 4: /* Return the time offset which applied/will apply at the specified time (in seconds). */ { int localoff = 0; time_t theTime; int day = 0; #if (defined(HAVE_GMTIME_R) || defined(HAVE_LOCALTIME_R)) struct tm result; #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Although the offset is in seconds it is since 1601. */ FILETIME ftSeconds; // Not really a file-time because it's a number of seconds. getFileTimeFromArb(taskData, args, &ftSeconds); /* May raise exception. */ ULARGE_INTEGER liTime; liTime.HighPart = ftSeconds.dwHighDateTime; liTime.LowPart = ftSeconds.dwLowDateTime; theTime = (long)(liTime.QuadPart - SECSSINCE1601); #else theTime = get_C_long(taskData, DEREFWORDHANDLE(args)); /* May raise exception. */ #endif { #ifdef HAVE_GMTIME_R struct tm *loctime = gmtime_r(&theTime, &result); #else PLocker lock(&timeLock); struct tm *loctime = gmtime(&theTime); #endif if (loctime == NULL) raise_exception0(taskData, EXC_size); localoff = (loctime->tm_hour*60 + loctime->tm_min)*60 + loctime->tm_sec; day = loctime->tm_yday; } { #ifdef HAVE_LOCALTIME_R struct tm *loctime = localtime_r(&theTime, &result); #else PLocker lock(&timeLock); struct tm *loctime = localtime(&theTime); #endif if (loctime == NULL) raise_exception0(taskData, EXC_size); localoff -= (loctime->tm_hour*60 + loctime->tm_min)*60 + loctime->tm_sec; if (loctime->tm_yday != day) { // Different day - have to correct it. We can assume that there // is at most one day to correct. if (day == loctime->tm_yday+1 || (day == 0 && loctime->tm_yday >= 364)) localoff += 24*60*60; else localoff -= 24*60*60; } } return Make_arbitrary_precision(taskData, localoff); } case 5: /* Find out if Summer Time (daylight saving) was/will be in effect. */ { time_t theTime; #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME ftSeconds; // Not really a file-time because it's a number of seconds. getFileTimeFromArb(taskData, args, &ftSeconds); /* May raise exception. */ ULARGE_INTEGER liTime; liTime.HighPart = ftSeconds.dwHighDateTime; liTime.LowPart = ftSeconds.dwLowDateTime; theTime = (long)(liTime.QuadPart - SECSSINCE1601); #else theTime = get_C_long(taskData, DEREFWORDHANDLE(args)); /* May raise exception. */ #endif int isDst = 0; #ifdef HAVE_LOCALTIME_R struct tm result; struct tm *loctime = localtime_r(&theTime, &result); isDst = loctime->tm_isdst; #else { PLocker lock(&timeLock); struct tm *loctime = localtime(&theTime); if (loctime == NULL) raise_exception0(taskData, EXC_size); isDst = loctime->tm_isdst; } #endif return Make_arbitrary_precision(taskData, isDst); } case 6: /* Call strftime. It would be possible to do much of this in ML except that it requires the current locale. */ { struct tm time; char *format, buff[2048]; Handle resString; /* Get the format string. */ format = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); /* Copy the time information. */ time.tm_year = get_C_int(taskData, DEREFHANDLE(args)->Get(1)) - 1900; time.tm_mon = get_C_int(taskData, DEREFHANDLE(args)->Get(2)); time.tm_mday = get_C_int(taskData, DEREFHANDLE(args)->Get(3)); time.tm_hour = get_C_int(taskData, DEREFHANDLE(args)->Get(4)); time.tm_min = get_C_int(taskData, DEREFHANDLE(args)->Get(5)); time.tm_sec = get_C_int(taskData, DEREFHANDLE(args)->Get(6)); time.tm_wday = get_C_int(taskData, DEREFHANDLE(args)->Get(7)); time.tm_yday = get_C_int(taskData, DEREFHANDLE(args)->Get(8)); time.tm_isdst = get_C_int(taskData, DEREFHANDLE(args)->Get(9)); #if (defined(_WIN32) && ! defined(__CYGWIN__)) _tzset(); /* Make sure we set the current locale. */ #else setlocale(LC_TIME, ""); #endif /* It would be better to dynamically allocate the string rather than use a fixed size but Unix unlike Windows does not distinguish between an error in the input and the buffer being too small. */ if (strftime(buff, sizeof(buff), format, &time) <= 0) { /* Error */ free(format); raise_exception0(taskData, EXC_size); } resString = taskData->saveVec.push(C_string_to_Poly(taskData, buff)); free(format); return resString; } case 7: /* Return User CPU time since the start. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME ut, ct, et, kt; if (! GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) raise_syscall(taskData, "GetProcessTimes failed", 0-GetLastError()); return Make_arb_from_Filetime(taskData, ut); #else struct rusage rusage; if (getrusage(RUSAGE_SELF, &rusage) != 0) raise_syscall(taskData, "getrusage failed", errno); return Make_arb_from_pair_scaled(taskData, rusage.ru_utime.tv_sec, rusage.ru_utime.tv_usec, 1000000); #endif } case 8: /* Return System CPU time since the start. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME ct, et, kt, ut; if (! GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) raise_syscall(taskData, "GetProcessTimes failed", 0-GetLastError()); return Make_arb_from_Filetime(taskData, kt); #else struct rusage rusage; if (getrusage(RUSAGE_SELF, &rusage) != 0) raise_syscall(taskData, "getrusage failed", errno); return Make_arb_from_pair_scaled(taskData, rusage.ru_stime.tv_sec, rusage.ru_stime.tv_usec, 1000000); #endif } case 9: /* Return GC time since the start. */ return gHeapSizeParameters.getGCUtime(taskData); case 10: /* Return real time since the start. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) FILETIME ft; GetSystemTimeAsFileTime(&ft); subFiletimes(&ft, &startTime); return Make_arb_from_Filetime(taskData, ft); #else struct timeval tv; if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); subTimevals(&tv, &startTime); return Make_arb_from_pair_scaled(taskData, tv.tv_sec, tv.tv_usec, 1000000); #endif } /* These next two are used only in the Posix structure. */ case 11: /* Return User CPU time used by child processes. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) return Make_arbitrary_precision(taskData, 0); #else struct rusage rusage; if (getrusage(RUSAGE_CHILDREN, &rusage) != 0) raise_syscall(taskData, "getrusage failed", errno); return Make_arb_from_pair_scaled(taskData, rusage.ru_utime.tv_sec, rusage.ru_utime.tv_usec, 1000000); #endif } case 12: /* Return System CPU time used by child processes. */ { #if (defined(_WIN32) && ! defined(__CYGWIN__)) return Make_arbitrary_precision(taskData, 0); #else struct rusage rusage; if (getrusage(RUSAGE_CHILDREN, &rusage) != 0) raise_syscall(taskData, "getrusage failed", errno); return Make_arb_from_pair_scaled(taskData, rusage.ru_stime.tv_sec, rusage.ru_stime.tv_usec, 1000000); #endif } case 13: /* Return GC system time since the start. */ return gHeapSizeParameters.getGCStime(taskData); default: { char msg[100]; sprintf(msg, "Unknown timing function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } #ifdef HAVE_WINDOWS_H void addFiletimes(FILETIME *result, const FILETIME *x) { ULARGE_INTEGER liA, liB; liA.LowPart = result->dwLowDateTime; liA.HighPart = result->dwHighDateTime; liB.LowPart = x->dwLowDateTime; liB.HighPart = x->dwHighDateTime; liA.QuadPart += liB.QuadPart; result->dwLowDateTime = liA.LowPart; result->dwHighDateTime = liA.HighPart; } void subFiletimes(FILETIME *result, const FILETIME *x) { ULARGE_INTEGER liA, liB; liA.LowPart = result->dwLowDateTime; liA.HighPart = result->dwHighDateTime; liB.LowPart = x->dwLowDateTime; liB.HighPart = x->dwHighDateTime; liA.QuadPart -= liB.QuadPart; result->dwLowDateTime = liA.LowPart; result->dwHighDateTime = liA.HighPart; } float filetimeToSeconds(const FILETIME *x) { ULARGE_INTEGER ul; ul.LowPart = x->dwLowDateTime; ul.HighPart = x->dwHighDateTime; return (float)ul.QuadPart / (float)1.0E7; } void FileTimeTime::fromSeconds(unsigned u) { ULARGE_INTEGER li; li.QuadPart = (ULONGLONG)u * TICKS_PER_MICROSECOND * 1000000; t.dwLowDateTime = li.LowPart; t.dwHighDateTime = li.HighPart; } void FileTimeTime::add(const FileTimeTime &f) { addFiletimes(&t, &f.t); } void FileTimeTime::sub(const FileTimeTime &f) { subFiletimes(&t, &f.t); } float FileTimeTime::toSeconds(void) { return filetimeToSeconds(&t); } #endif #ifdef HAVE_SYS_TIME_H void addTimevals(struct timeval *result, const struct timeval *x) { long uSecs = result->tv_usec + x->tv_usec; result->tv_sec += x->tv_sec; if (uSecs >= 1000000) { result->tv_sec++; uSecs -= 1000000; } result->tv_usec = uSecs; } void subTimevals(struct timeval *result, const struct timeval *x) { long uSecs = result->tv_usec - x->tv_usec; result->tv_sec -= x->tv_sec; if (uSecs < 0) { result->tv_sec--; uSecs += 1000000; } result->tv_usec = uSecs; } float timevalToSeconds(const struct timeval *x) { return (float)x->tv_sec + (float)x->tv_usec / 1.0E6; } void TimeValTime::add(const TimeValTime &f) { addTimevals(&t, &f.t); } void TimeValTime::sub(const TimeValTime &f) { subTimevals(&t, &f.t); } #endif class Timing: public RtsModule { public: virtual void Init(void); }; // Declare this. It will be automatically added to the table. static Timing timingModule; void Timing::Init(void) { #if (defined(_WIN32) && ! defined(__CYGWIN__)) // Record an initial time of day to use as the basis of real timing GetSystemTimeAsFileTime(&startTime); #else gettimeofday(&startTime, NULL); #endif } polyml-5.6/libpolyml/timing.h000066400000000000000000000060041265146633400163550ustar00rootroot00000000000000/* Title: Header for time functions Copyright (c) 2000 Cambridge University Technical Services Limited Further development Copyright David C.J. Matthews 2011-12. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _TIMING_H_DEFINED #define _TIMING_H_DEFINED 1 #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TIMES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_RESOURCE_H #include #endif #ifdef HAVE_WINDOWS_H #include #endif class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; /* time functions etc */ extern Handle timing_dispatch_c(TaskData *taskData, Handle args, Handle code); // Define classes for operations on time values in Windows and Posix. // N.B. In Cygwin we use both classes because in some cases we need // Windows-style timing and in other places we use Unix-style. #ifdef HAVE_WINDOWS_H class FileTimeTime { public: FileTimeTime() { t.dwLowDateTime = t.dwHighDateTime = 0; } FileTimeTime(const FILETIME f) { t = f; } void fromSeconds(unsigned u); void add(const FileTimeTime &); void sub(const FileTimeTime &); float toSeconds(void); operator FILETIME() const { return t; } protected: FILETIME t; }; #endif #ifdef HAVE_SYS_TIME_H class TimeValTime { public: TimeValTime() { t.tv_sec = 0; t.tv_usec = 0; } TimeValTime(const timeval f) { t = f; } void fromSeconds(unsigned u) { t.tv_sec = u; t.tv_usec = 0; } void add(const TimeValTime &); void sub(const TimeValTime &); float toSeconds(void) { return (float)t.tv_sec + (float)t.tv_usec / 1.0E6; } operator timeval() const { return t; } protected: struct timeval t; }; #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) /* Native windows */ #define TIMEDATA FileTimeTime #else /* Unix and Cygwin. */ #define TIMEDATA TimeValTime #endif #ifdef HAVE_WINDOWS_H extern void addFiletimes(FILETIME *result, const FILETIME *x); extern void subFiletimes(FILETIME *result, const FILETIME *x); extern float filetimeToSeconds(const FILETIME *x); #endif #ifdef HAVE_SYS_TIME_H extern void addTimevals(struct timeval *result, const struct timeval *x); extern void subTimevals(struct timeval *result, const struct timeval *x); extern float timevalToSeconds(const struct timeval *x); #endif #endif polyml-5.6/libpolyml/unix_specific.cpp000066400000000000000000002124731265146633400202620ustar00rootroot00000000000000/* Title: Operating Specific functions: Unix version. Copyright (c) 2000-8 David C. J. Matthews Portions of this code are derived from the original stream io package copyright CUTS 1983-2000. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_ASSERT_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_LIMITS_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_PWD_H #include #endif #ifdef HAVE_GRP_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #ifdef HAVE_SYS_SIGNAL_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_TERMIOS_H #include #elif (defined(HAVE_TERMIOS_H)) #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #include "globals.h" #include "arb.h" #include "run_time.h" #include "io_internal.h" #include "sys.h" #include "diagnostics.h" #include "machine_dep.h" #include "os_specific.h" #include "gc.h" #include "processes.h" #include "mpoly.h" #include "sighandler.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #define STREAMID(x) (DEREFSTREAMHANDLE(x)->streamNo) #define SAVE(x) taskData->saveVec.push(x) #define ALLOC(n) alloc_and_save(taskData, n) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) /* Table of constants returned by call 4. */ static int unixConstVec[] = { /* Error codes. */ E2BIG, /* 0 */ EACCES, EAGAIN, EBADF, #ifdef EBADMSG /* This is not defined in FreeBSD. */ EBADMSG, #else 0, #endif EBUSY, #ifdef ECANCELED /* This is not defined in Linux. Perhaps someone knows how to spell "cancelled". */ ECANCELED, #else 0, /* Perhaps some other value. */ #endif ECHILD, EDEADLK, EDOM, EEXIST, EFAULT, EFBIG, EINPROGRESS, EINTR, EINVAL, EIO, EISDIR, ELOOP, EMFILE, EMLINK, /* 20 */ EMSGSIZE, ENAMETOOLONG, ENFILE, ENODEV, ENOENT, ENOEXEC, ENOLCK, ENOMEM, ENOSPC, ENOSYS, ENOTDIR, ENOTEMPTY, #ifdef ENOTSUP /* Not defined in Linux. */ ENOTSUP, #else 0, #endif ENOTTY, ENXIO, EPERM, EPIPE, ERANGE, EROFS, ESPIPE, ESRCH, EXDEV, /* 42 */ /* Signals. */ SIGABRT, /* 43 */ SIGALRM, SIGBUS, SIGFPE, SIGHUP, SIGILL, SIGINT, SIGKILL, SIGPIPE, SIGQUIT, SIGSEGV, SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, /* 62 */ /* Open flags. */ O_RDONLY, /* 63 */ O_WRONLY, O_RDWR, O_APPEND, O_EXCL, O_NOCTTY, O_NONBLOCK, #ifdef O_SYNC O_SYNC, /* Not defined in FreeBSD. */ #else 0, #endif O_TRUNC, /* 71 */ /* TTY: Special characters. */ VEOF, /* 72 */ VEOL, VERASE, VINTR, VKILL, VMIN, VQUIT, VSUSP, VTIME, VSTART, VSTOP, NCCS, /* 83 */ /* TTY: Input mode. */ BRKINT, /* 84 */ ICRNL, IGNBRK, IGNCR, IGNPAR, INLCR, INPCK, ISTRIP, IXOFF, IXON, PARMRK, /* 94 */ /* TTY: Output mode. */ OPOST, /* 95 */ /* TTY: Control modes. */ CLOCAL, /* 96 */ CREAD, CS5, CS6, CS7, CS8, CSIZE, CSTOPB, HUPCL, PARENB, PARODD, /* 106 */ /* TTY: Local modes. */ ECHO, /* 107 */ ECHOE, ECHOK, ECHONL, ICANON, IEXTEN, ISIG, NOFLSH, TOSTOP, /* 115 */ /* TTY: Speeds. */ B0, /* 116 */ B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, /* 131 */ /* FD flags. */ FD_CLOEXEC, /* 132 */ /* Wait flags. */ WUNTRACED, /* 133 */ WNOHANG, /* 134 */ /* tcsetattr flags. */ TCSANOW, /* 135 */ TCSADRAIN, TCSAFLUSH, /* tcflow flags. */ TCOOFF, /* 138 */ TCOON, TCIOFF, TCION, /* tcflush flags. */ TCIFLUSH, /* 142 */ TCOFLUSH, TCIOFLUSH, /* File permissions. */ S_IRUSR, /* 145 */ S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH, S_ISUID, S_ISGID, /* 155 */ /* Bits for access function. */ R_OK, /* 156 */ W_OK, X_OK, F_OK, /* 159 */ /* Values for lseek. */ SEEK_SET, /* 160 */ SEEK_CUR, SEEK_END, /* 162 */ /* Values for lock types. */ F_RDLCK, /* 163 */ F_WRLCK, F_UNLCK, /* 165 */ /* Mask for file access. */ O_ACCMODE, /* 166 */ }; /* Auxiliary functions which implement the more complex cases. */ static Handle waitForProcess(TaskData *taskData, Handle args); static Handle makePasswordEntry(TaskData *taskData, struct passwd *pw); static Handle makeGroupEntry(TaskData *taskData, struct group *grp); static Handle getUname(TaskData *taskData); static Handle getSysConf(TaskData *taskData, Handle args); static Handle getTTYattrs(TaskData *taskData, Handle args); static Handle setTTYattrs(TaskData *taskData, Handle args); static Handle getStatInfo(TaskData *taskData, struct stat *buf); static Handle lockCommand(TaskData *taskData, int cmd, Handle args); static int findPathVar(TaskData *taskData, PolyWord ps); // Unmask all signals just before exec. static void restoreSignals(void) { sigset_t sigset; sigemptyset(&sigset); sigprocmask(SIG_SETMASK, &sigset, NULL); } Handle OS_spec_dispatch_c(TaskData *taskData, Handle args, Handle code) { unsigned lastSigCount = receivedSignalCount; // Have we received a signal? TryAgain: int c = get_C_long(taskData, DEREFWORDHANDLE(code)); switch (c) { case 0: /* Return our OS type. Not in any structure. */ return Make_arbitrary_precision(taskData, 0); /* 0 for Unix. */ case 4: /* Return a constant. */ { unsigned i = get_C_unsigned(taskData, DEREFWORDHANDLE(args)); if (i >= sizeof(unixConstVec)/sizeof(unixConstVec[0])) raise_syscall(taskData, "Invalid index", 0); return Make_arbitrary_precision(taskData, unixConstVec[i]); } case 5: /* fork. */ { pid_t pid = fork(); if (pid < 0) raise_syscall(taskData, "fork failed", errno); if (pid == 0) processes->SetSingleThreaded(); return Make_arbitrary_precision(taskData, pid); } case 6: /* kill */ { int pid = get_C_long(taskData, DEREFHANDLE(args)->Get(0)); int sig = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (kill(pid, sig) < 0) raise_syscall(taskData, "kill failed", errno); return Make_arbitrary_precision(taskData, 0); } case 7: /* get process id */ { pid_t pid = getpid(); if (pid < 0) raise_syscall(taskData, "getpid failed", errno); return Make_arbitrary_precision(taskData, pid); } case 8: /* get process id of parent */ { pid_t pid = getppid(); if (pid < 0) raise_syscall(taskData, "getppid failed", errno); return Make_arbitrary_precision(taskData, pid); } case 9: /* get real user id */ { uid_t uid = getuid(); // This is defined always to succeed return Make_arbitrary_precision(taskData, uid); } case 10: /* get effective user id */ { uid_t uid = geteuid(); // This is defined always to succeed return Make_arbitrary_precision(taskData, uid); } case 11: /* get real group id */ { gid_t gid = getgid(); // This is defined always to succeed return Make_arbitrary_precision(taskData, gid); } case 12: /* get effective group id */ { gid_t gid = getegid(); // This is defined always to succeed return Make_arbitrary_precision(taskData, gid); } case 13: /* Return process group */ { pid_t pid = getpgrp(); if (pid < 0) raise_syscall(taskData, "getpgrp failed", errno); return Make_arbitrary_precision(taskData, pid); } case 14: /* Wait for child process to terminate. */ return waitForProcess(taskData, args); case 15: /* Unpack a process result. */ { int resType, resVal; Handle result, typeHandle, resHandle; int status = get_C_long(taskData, DEREFWORDHANDLE(args)); if (WIFEXITED(status)) { resType = 1; resVal = WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { resType = 2; resVal = WTERMSIG(status); } else if (WIFSTOPPED(status)) { resType = 3; resVal = WSTOPSIG(status); } else { /* ?? */ resType = 0; resVal = 0; } typeHandle = Make_arbitrary_precision(taskData, resType); resHandle = Make_arbitrary_precision(taskData, resVal); result = ALLOC(2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(typeHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(resHandle)); return result; } case 16: /* Pack up a process result. The inverse of the previous call. */ { int resType = get_C_long(taskData, DEREFHANDLE(args)->Get(0)); int resVal = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int result = 0; switch (resType) { case 1: /* Exited */ result = resVal << 8; break; case 2: /* Signalled */ result = resVal; break; case 3: /* Stopped */ result = (resVal << 8) | 0177; } return Make_arbitrary_precision(taskData, result); } case 17: /* Run a new executable. */ { char *path = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); char **argl = stringListToVector(SAVE(DEREFHANDLE(args)->Get(1))); int err; restoreSignals(); execv(path, argl); err = errno; /* We only get here if there's been an error. */ free(path); freeStringVector(argl); raise_syscall(taskData, "execv failed", err); } case 18: /* Run a new executable with given environment. */ { char *path = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); char **argl = stringListToVector(SAVE(DEREFHANDLE(args)->Get(1))); char **envl = stringListToVector(SAVE(DEREFHANDLE(args)->Get(2))); int err; restoreSignals(); execve(path, argl, envl); err = errno; /* We only get here if there's been an error. */ free(path); freeStringVector(argl); freeStringVector(envl); raise_syscall(taskData, "execve failed", err); } case 19: /* Run a new executable using PATH environment variable. */ { char *path = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); char **argl = stringListToVector(SAVE(DEREFHANDLE(args)->Get(1))); int err; restoreSignals(); execvp(path, argl); err = errno; /* We only get here if there's been an error. */ free(path); freeStringVector(argl); raise_syscall(taskData, "execvp failed", err); } case 20: /* Sets an alarm and returns the current alarm time. A value of zero for the time cancels the timer. */ { /* We have a value in microseconds. We need to split it into seconds and microseconds. */ Handle hTime = args; Handle hMillion = Make_arbitrary_precision(taskData, 1000000); struct itimerval newTimer, oldTimer; newTimer.it_interval.tv_sec = 0; newTimer.it_interval.tv_usec = 0; newTimer.it_value.tv_sec = get_C_long(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); newTimer.it_value.tv_usec = get_C_long(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); if (setitimer(ITIMER_REAL, &newTimer, &oldTimer) != 0) raise_syscall(taskData, "setitimer failed", errno); Handle result = /* Return the previous setting. */ Make_arb_from_pair_scaled(taskData, oldTimer.it_value.tv_sec, oldTimer.it_value.tv_usec, 1000000); return result; } case 21: /* Pause until signal. */ { /* This never returns. When a signal is handled it will be interrupted. */ processes->ThreadPause(taskData); if (lastSigCount != receivedSignalCount) raise_syscall(taskData, "Call interrupted by signal", EINTR); goto TryAgain; } case 22: /* Sleep until given time or until a signal. Note: this is called with an absolute time as an argument and returns a relative time as result. This RTS call is tried repeatedly until either the time has expired or a signal has occurred. */ { struct timeval tv; /* We have a value in microseconds. We need to split it into seconds and microseconds. */ Handle hTime = args; Handle hMillion = Make_arbitrary_precision(taskData, 1000000); unsigned long secs = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hTime))); unsigned long usecs = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hTime))); /* Has the time expired? */ if (gettimeofday(&tv, NULL) != 0) raise_syscall(taskData, "gettimeofday failed", errno); /* If the timeout time is earlier than the current time we must return, otherwise we block. This can be interrupted by a signal. */ if ((unsigned long)tv.tv_sec < secs || ((unsigned long)tv.tv_sec == secs && (unsigned long)tv.tv_usec < usecs)) { processes->ThreadPause(taskData); if (lastSigCount != receivedSignalCount) raise_syscall(taskData, "Call interrupted by signal", EINTR); goto TryAgain; } else processes->TestAnyEvents(taskData); // Check for interrupts anyway return Make_arbitrary_precision(taskData, 0); } case 23: /* Set uid. */ { uid_t uid = get_C_long(taskData, DEREFWORDHANDLE(args)); if (setuid(uid) != 0) raise_syscall(taskData, "setuid failed", errno); return Make_arbitrary_precision(taskData, 0); } case 24: /* Set gid. */ { gid_t gid = get_C_long(taskData, DEREFWORDHANDLE(args)); if (setgid(gid) != 0) raise_syscall(taskData, "setgid failed", errno); return Make_arbitrary_precision(taskData, 0); } case 25: /* Get group list. */ { // This previously allocated gid_t[NGROUPS_MAX] on the stack but this // requires quite a bit of stack space. gid_t gid[1]; int ngroups = getgroups(0, gid); // Just get the number. if (ngroups < 0) raise_syscall(taskData, "getgroups failed", errno); if (ngroups == 0) return SAVE(ListNull); gid_t *groups = (gid_t*)calloc(sizeof(gid_t), ngroups); if (groups == 0) raise_syscall(taskData, "Unable to allocate memory", errno); if (getgroups(ngroups, groups) < 0) { int lasterr = errno; free(groups); raise_syscall(taskData, "getgroups failed", lasterr); } Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); /* It's simplest to process the integers in reverse order */ while (--ngroups >= 0) { Handle value = Make_arbitrary_precision(taskData, groups[ngroups]); Handle next = ALLOC(SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } free(groups); return list; } case 26: /* Get login name. */ { char *login = getlogin(); if (login == 0) raise_syscall(taskData, "getlogin failed", errno); return SAVE(C_string_to_Poly(taskData, login)); } case 27: /* Set sid */ { pid_t pid = setsid(); if (pid < 0) raise_syscall(taskData, "setsid failed", errno); return Make_arbitrary_precision(taskData, pid); } case 28: /* Set process group. */ { pid_t pid = get_C_long(taskData, DEREFHANDLE(args)->Get(0)); pid_t pgid = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (setpgid(pid, pgid) < 0 ) raise_syscall(taskData, "setpgid failed", errno); return Make_arbitrary_precision(taskData, 0); } case 29: /* uname */ return getUname(taskData); case 30: /* Get controlling terminal. */ #ifdef HAVE_CTERMID { char *term = ctermid(0); /* Can this generate an error? */ if (term == 0) raise_syscall(taskData, "ctermid failed", errno); return SAVE(C_string_to_Poly(taskData, term)); } #else raise_syscall(taskData, "ctermid is not implemented", 0); #endif case 31: /* Get terminal name for file descriptor. */ { PIOSTRUCT str = get_stream(args->WordP()); char *term; if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); term = ttyname(str->device.ioDesc); if (term == 0) raise_syscall(taskData, "ttyname failed", errno); return SAVE(C_string_to_Poly(taskData, term)); } case 32: /* Test if file descriptor is a terminal. Returns false if the stream is closed. */ { PIOSTRUCT str = get_stream(args->WordP()); if (str != NULL && isatty(str->device.ioDesc)) return Make_arbitrary_precision(taskData, 1); else return Make_arbitrary_precision(taskData, 0); } case 33: /* sysconf. */ return getSysConf(taskData, args); /* Filesys entries. */ case 50: /* Set the file creation mask and return the old one. */ { mode_t mode = get_C_ulong(taskData, DEREFWORDHANDLE(args)); return Make_arbitrary_precision(taskData, umask(mode)); } case 51: /* Create a hard link. */ { char *old = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); char *newp = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(1)); int err, res; res = link(old, newp); err = errno; /* Save the error result in case free changes it. */ free(old); free(newp); if (res < 0) raise_syscall(taskData, "link failed", err); return Make_arbitrary_precision(taskData, 0); } case 52: /* Create a directory. There is an OS-independent version in basicio which uses a default creation mode. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); mode_t mode = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int err, res; res = mkdir(name, mode); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "mkdir failed", err); return Make_arbitrary_precision(taskData, 0); } case 53: /* Create a fifo. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); mode_t mode = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int err, res; res = mkfifo(name, mode); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "mkfifo failed", err); return Make_arbitrary_precision(taskData, 0); } case 54: /* Create a symbolic link. */ { char *old = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); char *newp = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(1)); int err, res; res = symlink(old, newp); err = errno; /* Save the error result in case free changes it. */ free(old); free(newp); if (res < 0) raise_syscall(taskData, "link failed", err); return Make_arbitrary_precision(taskData, 0); } case 55: /* Get information about a file. */ { struct stat buf; int res, err; char *name = Poly_string_to_C_alloc(DEREFWORD(args)); res = stat(name, &buf); err = errno; free(name); if (res < 0) raise_syscall(taskData, "stat failed", err); return getStatInfo(taskData, &buf); } case 56: /* Get information about a symbolic link. */ { struct stat buf; int res, err; char *name = Poly_string_to_C_alloc(DEREFWORD(args)); res = lstat(name, &buf); err = errno; free(name); if (res < 0) raise_syscall(taskData, "lstat failed", err); return getStatInfo(taskData, &buf); } case 57: /* Get information about an open file. */ { struct stat buf; PIOSTRUCT strm = get_stream(args->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fstat(strm->device.ioDesc, &buf) < 0) raise_syscall(taskData, "fstat failed", errno); return getStatInfo(taskData, &buf); } case 58: /* Test access rights to a file. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); int amode = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int res; res = access(name, amode); free(name); /* Return false if error, true if not. It's not clear that this is correct since there are several reasons why we might get -1 as the result. */ return Make_arbitrary_precision(taskData, res < 0 ? 0 : 1); } case 59: /* Change access rights. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); mode_t mode = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int err, res; res = chmod(name, mode); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "chmod failed", err); return Make_arbitrary_precision(taskData, 0); } case 60: /* Change access rights on open file. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); mode_t mode = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fchmod(strm->device.ioDesc, mode) < 0) raise_syscall(taskData, "fchmod failed", errno); return Make_arbitrary_precision(taskData, 0); } case 61: /* Change owner and group. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); uid_t uid = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); gid_t gid = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); int err, res; res = chown(name, uid, gid); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "chown failed", err); return Make_arbitrary_precision(taskData, 0); } case 62: /* Change owner and group on open file. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); uid_t uid = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); gid_t gid = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fchown(strm->device.ioDesc, uid, gid) < 0) raise_syscall(taskData, "fchown failed", errno); return Make_arbitrary_precision(taskData, 0); } case 63: /* Set access and modification times. We use utimes rather than utime since it allows us to be more accurate. There's a similar function in basicio which sets both the access and modification times to the same time. */ { char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); Handle hAccess = SAVE(DEREFHANDLE(args)->Get(1)); Handle hMod = SAVE(DEREFHANDLE(args)->Get(2)); struct timeval times[2]; /* We have a value in microseconds. We need to split it into seconds and microseconds. N.B. The arguments to div_longc and rem_longc are in reverse order. */ Handle hMillion = Make_arbitrary_precision(taskData, 1000000); unsigned secsAccess = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hAccess))); unsigned usecsAccess = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hAccess))); unsigned secsMod = get_C_ulong(taskData, DEREFWORDHANDLE(div_longc(taskData, hMillion, hMod))); unsigned usecsMod = get_C_ulong(taskData, DEREFWORDHANDLE(rem_longc(taskData, hMillion, hMod))); int err, res; times[0].tv_sec = secsAccess; times[0].tv_usec = usecsAccess; times[1].tv_sec = secsMod; times[1].tv_usec = usecsMod; res = utimes(name, times); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "utimes failed", err); return Make_arbitrary_precision(taskData, 0); } case 64: /* Set access and modification times to the current time. This could be defined in terms of the previous call and Time.now but it could result in an error due to rounding. This is probably safer. */ { char *name = Poly_string_to_C_alloc(DEREFWORD(args)); int err, res; res = utimes(name, 0); err = errno; /* Save the error result in case free changes it. */ free(name); if (res < 0) raise_syscall(taskData, "utimes failed", err); return Make_arbitrary_precision(taskData, 0); } case 65: /* Truncate an open file. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int size = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (ftruncate(strm->device.ioDesc, size) < 0) raise_syscall(taskData, "ftruncate failed", errno); return Make_arbitrary_precision(taskData, 0); } case 66: /* Get the configured limits for a file. */ { /* Look up the variable. May raise an exception. */ int nvar = findPathVar(taskData, DEREFHANDLE(args)->Get(1)); char *name = Poly_string_to_C_alloc(DEREFHANDLE(args)->Get(0)); int err, res; /* Set errno to zero. If there is no limit pathconf returns -1 but does not change errno. */ errno = 0; res = pathconf(name, nvar); err = errno; /* Save the error result in case free changes it. */ free(name); /* We return -1 as a valid result indicating no limit. */ if (res < 0 && err != 0) raise_syscall(taskData, "pathconf failed", err); return Make_arbitrary_precision(taskData, res); } case 67: /* Get the configured limits for an open file. */ { /* Look up the variable. May raise an exception. */ int nvar = findPathVar(taskData, DEREFHANDLE(args)->Get(1)); PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int res; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); errno = 0; /* Unchanged if there is no limit. */ res = fpathconf(strm->device.ioDesc, nvar); if (res < 0 && errno != 0) raise_syscall(taskData, "fpathconf failed", errno); return Make_arbitrary_precision(taskData, res); } /* Password and group entries. */ case 100: /* Get Password entry by name. */ { char pwName[200]; int length; struct passwd *pw; length = Poly_string_to_C(DEREFWORD(args), pwName, 200); if (length > 200) raise_syscall(taskData, "Password name too long", ENAMETOOLONG); pw = getpwnam(pwName); if (pw == NULL) raise_syscall(taskData, "Password entry not found", ENOENT); return makePasswordEntry(taskData, pw); } case 101: /* Get password entry by uid. */ { int uid = get_C_long(taskData, DEREFWORDHANDLE(args)); struct passwd *pw = getpwuid(uid); if (pw == NULL) raise_syscall(taskData, "Password entry not found", ENOENT); return makePasswordEntry(taskData, pw); } case 102: /* Get group entry by name. */ { struct group *grp; char grpName[200]; int length; length = Poly_string_to_C(DEREFWORD(args), grpName, 200); if (length > 200) raise_syscall(taskData, "Group name too long", ENAMETOOLONG); grp = getgrnam(grpName); if (grp == NULL) raise_syscall(taskData, "Group entry not found", ENOENT); return makeGroupEntry(taskData, grp); } case 103: /* Get group entry by gid. */ { int gid = get_C_long(taskData, DEREFWORDHANDLE(args)); struct group *grp = getgrgid(gid); if (grp == NULL) raise_syscall(taskData, "Group entry not found", ENOENT); return makeGroupEntry(taskData, grp); } /* IO Entries. */ case 110: /* Create a pipe. */ { int filedes[2]; Handle strRead = make_stream_entry(taskData); Handle strWrite = make_stream_entry(taskData); Handle result; PIOSTRUCT instrm, outstrm; if (pipe(filedes) < 0) raise_syscall(taskData, "pipe failed", errno); instrm = &basic_io_vector[STREAMID(strRead)]; outstrm = &basic_io_vector[STREAMID(strWrite)]; instrm->device.ioDesc = filedes[0]; instrm->ioBits = IO_BIT_OPEN | IO_BIT_READ; outstrm->device.ioDesc = filedes[1]; outstrm->ioBits = IO_BIT_OPEN | IO_BIT_WRITE; result = ALLOC(2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(strRead)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(strWrite)); return result; } case 111: /* Duplicate a file descriptor. */ { PIOSTRUCT str = get_stream(args->WordP()); PIOSTRUCT newstr; Handle strToken = make_stream_entry(taskData); int fd; if (str == NULL) raise_syscall(taskData, "Stream is closed", EBADF); fd = dup(str->device.ioDesc); if (fd < 0) raise_syscall(taskData, "dup failed", errno); newstr = &basic_io_vector[STREAMID(strToken)]; newstr->device.ioDesc = fd; /* I'm assuming that we're not going to put any other status information in the bits. */ newstr->ioBits = str->ioBits; return strToken; } case 112: /* Duplicate a file descriptor to a given entry. */ { PIOSTRUCT old = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PIOSTRUCT newp = get_stream(DEREFHANDLE(args)->Get(1).AsObjPtr()); /* The "newp" entry must be an open entry in our io table. It may, though, be an entry added through wordToFD (basicio call 31) which may not refer to a valid descriptor. */ if (old == NULL || newp == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (dup2(old->device.ioDesc, newp->device.ioDesc) < 0) raise_syscall(taskData, "dup2 failed", errno); newp->ioBits = old->ioBits; return Make_arbitrary_precision(taskData, 0); } case 113: /* Duplicate a file descriptor to an entry equal to or greater than the given value. */ { PIOSTRUCT old = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); PIOSTRUCT base = get_stream(DEREFHANDLE(args)->Get(1).AsObjPtr()); int newfd; Handle strToken = make_stream_entry(taskData); PIOSTRUCT newstr; /* The "base" entry must be an open entry in our io table. It may, though, be an entry added through wordToFD (basicio call 31) which may not refer to a valid descriptor. */ if (old == NULL || base == NULL) raise_syscall(taskData, "Stream is closed", EBADF); newfd = fcntl(old->device.ioDesc, F_DUPFD, base->device.ioDesc); if (newfd < 0) raise_syscall(taskData, "dup2 failed", errno); newstr = &basic_io_vector[STREAMID(strToken)]; newstr->device.ioDesc = newfd; /* I'm assuming that we're not going to put any other status information in the bits. */ newstr->ioBits = old->ioBits; return strToken; } case 114: /* Get the file descriptor flags. */ { PIOSTRUCT strm = get_stream(args->WordP()); int res; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); res = fcntl(strm->device.ioDesc, F_GETFD); if (res < 0) raise_syscall(taskData, "fcntl failed", errno); return Make_arbitrary_precision(taskData, res); } case 115: /* Set the file descriptor flags. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int flags = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fcntl(strm->device.ioDesc, F_SETFD, flags) < 0) raise_syscall(taskData, "fcntl failed", errno); return Make_arbitrary_precision(taskData, 0); } case 116: /* Get the file status and access flags. */ { PIOSTRUCT strm = get_stream(args->WordP()); int res; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); res = fcntl(strm->device.ioDesc, F_GETFL); if (res < 0) raise_syscall(taskData, "fcntl failed", errno); return Make_arbitrary_precision(taskData, res); } case 117: /* Set the file status and access flags. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int flags = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fcntl(strm->device.ioDesc, F_SETFL, flags) < 0) raise_syscall(taskData, "fcntl failed", errno); return Make_arbitrary_precision(taskData, 0); } case 118: /* Seek to a position on the stream. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); long position = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int whence = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); long newpos; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); newpos = lseek(strm->device.ioDesc, position, whence); if (newpos < 0) raise_syscall(taskData, "lseek failed", errno); return Make_arbitrary_precision(taskData, (POLYSIGNED)newpos); } case 119: /* Synchronise file contents. */ { PIOSTRUCT strm = get_stream(args->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (fsync(strm->device.ioDesc) < 0) raise_syscall(taskData, "fsync failed", errno); return Make_arbitrary_precision(taskData, 0); } case 120: /* get lock */ return lockCommand(taskData, F_GETLK, args); case 121: /* set lock */ return lockCommand(taskData, F_SETLK, args); case 122: /* wait for lock */ /* TODO: This may well block the whole process. We should look at the result and retry if need be. */ return lockCommand(taskData, F_SETLKW, args); /* TTY entries. */ case 150: /* Get attributes. */ return getTTYattrs(taskData, args); case 151: /* Set attributes. */ return setTTYattrs(taskData, args); case 152: /* Send a break. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int duration = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (tcsendbreak(strm->device.ioDesc, duration) < 0) raise_syscall(taskData, "tcsendbreak failed", errno); return Make_arbitrary_precision(taskData, 0); } case 153: /* Wait for output to drain. */ { /* TODO: This will block the process. It really needs to check whether the stream has drained and run another process until it has. */ PIOSTRUCT strm = get_stream(args->WordP()); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); #ifdef HAVE_TCDRAIN if (tcdrain(strm->device.ioDesc) < 0) raise_syscall(taskData, "tcdrain failed", errno); #else raise_syscall(taskData, "tcdrain is not implemented", 0); #endif return Make_arbitrary_precision(taskData, 0); } case 154: /* Flush terminal stream. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int qs = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (tcflush(strm->device.ioDesc, qs) < 0) raise_syscall(taskData, "tcflush failed", errno); return Make_arbitrary_precision(taskData, 0); } case 155: /* Flow control. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int action = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (tcflow(strm->device.ioDesc, action) < 0) raise_syscall(taskData, "tcflow failed", errno); return Make_arbitrary_precision(taskData, 0); } case 156: /* Get process group. */ { PIOSTRUCT strm = get_stream(args->WordP()); pid_t pid; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); pid = tcgetpgrp(strm->device.ioDesc); if (pid < 0) raise_syscall(taskData, "tcgetpgrp failed", errno); return Make_arbitrary_precision(taskData, pid); } case 157: /* Set process group. */ { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); pid_t pid = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (tcsetpgrp(strm->device.ioDesc, pid) < 0) raise_syscall(taskData, "tcsetpgrp failed", errno); return Make_arbitrary_precision(taskData, 0); } default: { char msg[100]; sprintf(msg, "Unknown unix-specific function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); } } } Handle waitForProcess(TaskData *taskData, Handle args) /* Get result status of a child process. */ { TryAgain: // We should check for interrupts even if we're not going to block. processes->TestAnyEvents(taskData); int kind = get_C_long(taskData, DEREFHANDLE(args)->Get(0)); int pid = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); int callFlags = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); int flags = callFlags | WNOHANG; // Add in WNOHANG so we never block. pid_t pres = 0; int status; switch (kind) { case 0: /* Wait for any child. */ pres = waitpid(-1, &status, flags); break; case 1: /* Wait for specific process. */ pres = waitpid(pid, &status, flags); break; case 2: /* Wait for any in current process group. */ pres = waitpid(0, &status, flags); break; case 3: /* Wait for child in given process group */ pres = waitpid(-pid, &status, flags); break; } if (pres < 0) { if (errno == EINTR) goto TryAgain; else raise_syscall(taskData, "wait failed", errno); } /* If the caller did not specify WNOHANG but there wasn't a child process waiting we have to block and come back here later. */ if (pres == 0 && !(callFlags & WNOHANG)) { processes->ThreadPause(taskData); goto TryAgain; } /* Construct the result tuple. */ { Handle result, pidHandle, resHandle; pidHandle = Make_arbitrary_precision(taskData, pres); resHandle = Make_arbitrary_precision(taskData, status); result = ALLOC(2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(pidHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(resHandle)); return result; } } static Handle makePasswordEntry(TaskData *taskData, struct passwd *pw) /* Return a password entry. */ { Handle nameHandle, uidHandle, gidHandle, homeHandle, shellHandle, result; nameHandle = SAVE(C_string_to_Poly(taskData, pw->pw_name)); uidHandle = Make_arbitrary_precision(taskData, pw->pw_uid); gidHandle = Make_arbitrary_precision(taskData, pw->pw_gid); homeHandle = SAVE(C_string_to_Poly(taskData, pw->pw_dir)); shellHandle = SAVE(C_string_to_Poly(taskData, pw->pw_shell)); result = ALLOC(5); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(nameHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(uidHandle)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(gidHandle)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(homeHandle)); DEREFHANDLE(result)->Set(4, DEREFWORDHANDLE(shellHandle)); return result; } static Handle makeGroupEntry(TaskData *taskData, struct group *grp) { Handle nameHandle, gidHandle, membersHandle, result; int i; char **p; nameHandle = SAVE(C_string_to_Poly(taskData, grp->gr_name)); gidHandle = Make_arbitrary_precision(taskData, grp->gr_gid); /* Group members. */ for (i=0, p = grp->gr_mem; *p != NULL; p++, i++); membersHandle = convert_string_list(taskData, i, grp->gr_mem); result = ALLOC(3); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(nameHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(gidHandle)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(membersHandle)); return result; } /* Make a cons cell for a pair of strings. */ // Doesn't currently reset the save vec so it's only safe for a small number // of cells. static void makeStringPairList(TaskData *taskData, Handle &list, const char *s1, const char *s2) { Handle nameHandle, valueHandle, pairHandle, next; /* This has to be done carefully to ensure we don't throw anything away if we garbage-collect and also to ensure that each object is fully initialised before the next object is created. */ /* Make the strings. */ nameHandle = SAVE(C_string_to_Poly(taskData, s1)); valueHandle = SAVE(C_string_to_Poly(taskData, s2)); /* Make the pair. */ pairHandle = ALLOC(2); DEREFHANDLE(pairHandle)->Set(0, DEREFWORDHANDLE(nameHandle)); DEREFHANDLE(pairHandle)->Set(1, DEREFWORDHANDLE(valueHandle)); /* Make the cons cell. */ next = ALLOC(SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(pairHandle); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); list = SAVE(DEREFHANDLE(next)); } /* Return the uname information. */ static Handle getUname(TaskData *taskData) { #ifdef HAVE_SYS_UTSNAME_H struct utsname name; Handle list = SAVE(ListNull); if (uname(&name) < 0) raise_syscall(taskData, "uname failed", errno); makeStringPairList(taskData, list, "sysname", name.sysname); makeStringPairList(taskData, list, "nodename", name.nodename); makeStringPairList(taskData, list, "release", name.release); makeStringPairList(taskData, list, "version", name.version); makeStringPairList(taskData, list, "machine", name.machine); return list; #else raise_syscall(taskData, "uname not available on this machine", errno); #endif } /* Return the contents of a stat buffer. */ static Handle getStatInfo(TaskData *taskData, struct stat *buf) { int kind; Handle result, modeHandle, kindHandle, inoHandle, devHandle, linkHandle; Handle uidHandle, gidHandle, sizeHandle, atimeHandle, mtimeHandle, ctimeHandle; /* Get the protection mode, masking off the file type info. */ modeHandle = Make_arbitrary_precision(taskData, buf->st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID)); if (S_ISDIR(buf->st_mode)) kind = 1; else if (S_ISCHR(buf->st_mode)) kind = 2; else if (S_ISBLK(buf->st_mode)) kind = 3; else if (S_ISFIFO(buf->st_mode)) kind = 4; else if ((buf->st_mode & S_IFMT) == S_IFLNK) kind = 5; else if ((buf->st_mode & S_IFMT) == S_IFSOCK) kind = 6; else /* Regular. */ kind = 0; kindHandle = Make_arbitrary_precision(taskData, kind); inoHandle = Make_arbitrary_precision(taskData, buf->st_ino); devHandle = Make_arbitrary_precision(taskData, buf->st_dev); linkHandle = Make_arbitrary_precision(taskData, buf->st_nlink); uidHandle = Make_arbitrary_precision(taskData, buf->st_uid); gidHandle = Make_arbitrary_precision(taskData, buf->st_gid); sizeHandle = Make_arbitrary_precision(taskData, buf->st_size); atimeHandle = Make_arb_from_pair_scaled(taskData, STAT_SECS(buf,a), STAT_USECS(buf,a), 1000000); mtimeHandle = Make_arb_from_pair_scaled(taskData, STAT_SECS(buf,m), STAT_USECS(buf,m), 1000000); ctimeHandle = Make_arb_from_pair_scaled(taskData, STAT_SECS(buf,c), STAT_USECS(buf,c), 1000000); result = ALLOC(11); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(modeHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(kindHandle)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(inoHandle)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(devHandle)); DEREFHANDLE(result)->Set(4, DEREFWORDHANDLE(linkHandle)); DEREFHANDLE(result)->Set(5, DEREFWORDHANDLE(uidHandle)); DEREFHANDLE(result)->Set(6, DEREFWORDHANDLE(gidHandle)); DEREFHANDLE(result)->Set(7, DEREFWORDHANDLE(sizeHandle)); DEREFHANDLE(result)->Set(8, DEREFWORDHANDLE(atimeHandle)); DEREFHANDLE(result)->Set(9, DEREFWORDHANDLE(mtimeHandle)); DEREFHANDLE(result)->Set(10, DEREFWORDHANDLE(ctimeHandle)); return result; } static Handle getTTYattrs(TaskData *taskData, Handle args) { PIOSTRUCT strm = get_stream(args->WordP()); struct termios tios; speed_t ispeed, ospeed; Handle ifHandle, ofHandle, cfHandle, lfHandle, ccHandle; Handle isHandle, osHandle, result; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); if (tcgetattr(strm->device.ioDesc, &tios) < 0) raise_syscall(taskData, "tcgetattr failed", errno); /* Extract the speed entries. */ ospeed = cfgetospeed(&tios); ispeed = cfgetispeed(&tios); /* Set the speed entries to zero. In Solaris, at least, the speed is encoded in the flags and we don't want any confusion. The order of these functions is significant. */ cfsetospeed(&tios, B0); cfsetispeed(&tios, B0); /* Convert the values to ML representation. */ ifHandle = Make_arbitrary_precision(taskData, tios.c_iflag); ofHandle = Make_arbitrary_precision(taskData, tios.c_oflag); cfHandle = Make_arbitrary_precision(taskData, tios.c_cflag); lfHandle = Make_arbitrary_precision(taskData, tios.c_lflag); /* The cc vector is treated as a string. */ ccHandle = SAVE(C_string_to_Poly(taskData, (const char *)tios.c_cc, NCCS)); isHandle = Make_arbitrary_precision(taskData, ispeed); osHandle = Make_arbitrary_precision(taskData, ospeed); /* We can now create the result tuple. */ result = ALLOC(7); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(ifHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(ofHandle)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(cfHandle)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(lfHandle)); DEREFHANDLE(result)->Set(4, DEREFWORDHANDLE(ccHandle)); DEREFHANDLE(result)->Set(5, DEREFWORDHANDLE(isHandle)); DEREFHANDLE(result)->Set(6, DEREFWORDHANDLE(osHandle)); return result; } /* Assemble the tios structure from the arguments and set the TTY attributes. */ static Handle setTTYattrs(TaskData *taskData, Handle args) { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); int actions = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); struct termios tios; speed_t ispeed, ospeed; if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); /* Make sure anything unset is zero. It might be better to call tcgetattr instead. */ memset(&tios, 0, sizeof(tios)); tios.c_iflag = get_C_ulong(taskData, DEREFHANDLE(args)->Get(2)); tios.c_oflag = get_C_ulong(taskData, DEREFHANDLE(args)->Get(3)); tios.c_cflag = get_C_ulong(taskData, DEREFHANDLE(args)->Get(4)); tios.c_lflag = get_C_ulong(taskData, DEREFHANDLE(args)->Get(5)); /* The cc vector should be a string of exactly NCCS characters. It may well contain nulls so we can't use Poly_string_to_C to copy it. */ PolyWord ccv = DEREFHANDLE(args)->Get(6); if (ccv.IsTagged()) // Just to check. raise_syscall(taskData, "Incorrect cc vector", EINVAL); PolyStringObject * ccvs = (PolyStringObject *)ccv.AsObjPtr(); if (ccvs->length != NCCS) // Just to check. */ raise_syscall(taskData, "Incorrect cc vector", EINVAL); memcpy(tios.c_cc, ccvs->chars, NCCS); ispeed = get_C_ulong(taskData, DEREFHANDLE(args)->Get(7)); ospeed = get_C_ulong(taskData, DEREFHANDLE(args)->Get(8)); if (cfsetispeed(&tios, ispeed) < 0) raise_syscall(taskData, "cfsetispeed failed", errno); if (cfsetospeed(&tios, ospeed) < 0) raise_syscall(taskData, "cfsetospeed failed", errno); /* Now it's all set we can call tcsetattr to do the work. */ if (tcsetattr(strm->device.ioDesc, actions, &tios) < 0) raise_syscall(taskData, "tcsetattr failed", errno); return Make_arbitrary_precision(taskData, 0); } /* Lock/unlock/test file locks. Returns the, possibly modified, argument structure. */ static Handle lockCommand(TaskData *taskData, int cmd, Handle args) { PIOSTRUCT strm = get_stream(DEREFHANDLE(args)->Get(0).AsObjPtr()); struct flock lock; Handle result, typeHandle, whenceHandle, startHandle, lenHandle, pidHandle; memset(&lock, 0, sizeof(lock)); /* Make sure unused fields are zero. */ if (strm == NULL) raise_syscall(taskData, "Stream is closed", EBADF); lock.l_type = get_C_long(taskData, DEREFHANDLE(args)->Get(1)); lock.l_whence = get_C_long(taskData, DEREFHANDLE(args)->Get(2)); lock.l_start = get_C_long(taskData, DEREFHANDLE(args)->Get(3)); lock.l_len = get_C_long(taskData, DEREFHANDLE(args)->Get(4)); lock.l_pid = get_C_long(taskData, DEREFHANDLE(args)->Get(5)); if (fcntl(strm->device.ioDesc, cmd, &lock) < 0) raise_syscall(taskData, "fcntl failed", errno); /* Construct the result. */ typeHandle = Make_arbitrary_precision(taskData, lock.l_type); whenceHandle = Make_arbitrary_precision(taskData, lock.l_whence); startHandle = Make_arbitrary_precision(taskData, (POLYUNSIGNED)lock.l_start); lenHandle = Make_arbitrary_precision(taskData, (POLYUNSIGNED)lock.l_len); pidHandle = Make_arbitrary_precision(taskData, lock.l_pid); result = ALLOC(5); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(typeHandle)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(whenceHandle)); DEREFHANDLE(result)->Set(2, DEREFWORDHANDLE(startHandle)); DEREFHANDLE(result)->Set(3, DEREFWORDHANDLE(lenHandle)); DEREFHANDLE(result)->Set(4, DEREFWORDHANDLE(pidHandle)); return result; } /* This table maps string arguments for sysconf into the corresponding constants. */ /* These are highly OS dependent. It has been configured on Solaris 2.8, Linux Redhat 5.2 and FreeBSD 3.4. */ static struct { const char *saName; int saVal; } sysArgTable[] = { { "_SC_ARG_MAX", _SC_ARG_MAX }, { "_SC_CHILD_MAX", _SC_CHILD_MAX }, { "_SC_CLK_TCK", _SC_CLK_TCK }, { "_SC_NGROUPS_MAX", _SC_NGROUPS_MAX }, { "_SC_OPEN_MAX", _SC_OPEN_MAX }, { "_SC_JOB_CONTROL", _SC_JOB_CONTROL }, { "_SC_SAVED_IDS", _SC_SAVED_IDS }, { "_SC_VERSION", _SC_VERSION }, #ifdef _SC_PASS_MAX { "_SC_PASS_MAX", _SC_PASS_MAX }, #endif #ifdef _SC_LOGNAME_MAX { "_SC_LOGNAME_MAX", _SC_LOGNAME_MAX }, #endif #ifdef _SC_PAGESIZE { "_SC_PAGESIZE", _SC_PAGESIZE }, #endif #ifdef _SC_XOPEN_VERSION { "_SC_XOPEN_VERSION", _SC_XOPEN_VERSION }, #endif #ifdef _SC_NPROCESSORS_CONF { "_SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF }, #endif #ifdef _SC_NPROCESSORS_ONLN { "_SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN }, #endif #ifdef _SC_STREAM_MAX { "_SC_STREAM_MAX", _SC_STREAM_MAX }, #endif #ifdef _SC_TZNAME_MAX { "_SC_TZNAME_MAX", _SC_TZNAME_MAX }, #endif #ifdef _SC_AIO_LISTIO_MAX { "_SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX }, #endif #ifdef _SC_AIO_MAX { "_SC_AIO_MAX", _SC_AIO_MAX }, #endif #ifdef _SC_AIO_PRIO_DELTA_MAX { "_SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX }, #endif #ifdef _SC_ASYNCHRONOUS_IO { "_SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO }, #endif #ifdef _SC_DELAYTIMER_MAX { "_SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX }, #endif #ifdef _SC_FSYNC { "_SC_FSYNC", _SC_FSYNC }, #endif #ifdef _SC_MAPPED_FILES { "_SC_MAPPED_FILES", _SC_MAPPED_FILES }, #endif #ifdef _SC_MEMLOCK { "_SC_MEMLOCK", _SC_MEMLOCK }, #endif #ifdef _SC_MEMLOCK_RANGE { "_SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE }, #endif #ifdef _SC_MEMORY_PROTECTION { "_SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION }, #endif #ifdef _SC_MESSAGE_PASSING { "_SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING }, #endif #ifdef _SC_MQ_OPEN_MAX { "_SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX }, #endif #ifdef _SC_MQ_PRIO_MAX { "_SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX }, #endif #ifdef _SC_PRIORITIZED_IO { "_SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO }, #endif #ifdef _SC_PRIORITY_SCHEDULING { "_SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING }, #endif #ifdef _SC_REALTIME_SIGNALS { "_SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS }, #endif #ifdef _SC_RTSIG_MAX { "_SC_RTSIG_MAX", _SC_RTSIG_MAX }, #endif #ifdef _SC_SEMAPHORES { "_SC_SEMAPHORES", _SC_SEMAPHORES }, #endif #ifdef _SC_SEM_NSEMS_MAX { "_SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX }, #endif #ifdef _SC_SEM_VALUE_MAX { "_SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX }, #endif #ifdef _SC_SHARED_MEMORY_OBJECTS { "_SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS }, #endif #ifdef _SC_SIGQUEUE_MAX { "_SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX }, #endif #ifdef _SC_SIGRT_MIN { "_SC_SIGRT_MIN", _SC_SIGRT_MIN }, #endif #ifdef _SC_SIGRT_MAX { "_SC_SIGRT_MAX", _SC_SIGRT_MAX }, #endif #ifdef _SC_SYNCHRONIZED_IO { "_SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO }, #endif #ifdef _SC_TIMERS { "_SC_TIMERS", _SC_TIMERS }, #endif #ifdef _SC_TIMER_MAX { "_SC_TIMER_MAX", _SC_TIMER_MAX }, #endif #ifdef _SC_2_C_BIND { "_SC_2_C_BIND", _SC_2_C_BIND }, #endif #ifdef _SC_2_C_DEV { "_SC_2_C_DEV", _SC_2_C_DEV }, #endif #ifdef _SC_2_C_VERSION { "_SC_2_C_VERSION", _SC_2_C_VERSION }, #endif #ifdef _SC_2_FORT_DEV { "_SC_2_FORT_DEV", _SC_2_FORT_DEV }, #endif #ifdef _SC_2_FORT_RUN { "_SC_2_FORT_RUN", _SC_2_FORT_RUN }, #endif #ifdef _SC_2_LOCALEDEF { "_SC_2_LOCALEDEF", _SC_2_LOCALEDEF }, #endif #ifdef _SC_2_SW_DEV { "_SC_2_SW_DEV", _SC_2_SW_DEV }, #endif #ifdef _SC_2_UPE { "_SC_2_UPE", _SC_2_UPE }, #endif #ifdef _SC_2_VERSION { "_SC_2_VERSION", _SC_2_VERSION }, #endif #ifdef _SC_BC_BASE_MAX { "_SC_BC_BASE_MAX", _SC_BC_BASE_MAX }, #endif #ifdef _SC_BC_DIM_MAX { "_SC_BC_DIM_MAX", _SC_BC_DIM_MAX }, #endif #ifdef _SC_BC_SCALE_MAX { "_SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX }, #endif #ifdef _SC_BC_STRING_MAX { "_SC_BC_STRING_MAX", _SC_BC_STRING_MAX }, #endif #ifdef _SC_COLL_WEIGHTS_MAX { "_SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX }, #endif #ifdef _SC_EXPR_NEST_MAX { "_SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX }, #endif #ifdef _SC_LINE_MAX { "_SC_LINE_MAX", _SC_LINE_MAX }, #endif #ifdef _SC_RE_DUP_MAX { "_SC_RE_DUP_MAX", _SC_RE_DUP_MAX }, #endif #ifdef _SC_XOPEN_CRYPT { "_SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT }, #endif #ifdef _SC_XOPEN_ENH_I18N { "_SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N }, #endif #ifdef _SC_XOPEN_SHM { "_SC_XOPEN_SHM", _SC_XOPEN_SHM }, #endif #ifdef _SC_2_CHAR_TERM { "_SC_2_CHAR_TERM", _SC_2_CHAR_TERM }, #endif #ifdef _SC_XOPEN_XCU_VERSION { "_SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION }, #endif #ifdef _SC_ATEXIT_MAX { "_SC_ATEXIT_MAX", _SC_ATEXIT_MAX }, #endif #ifdef _SC_IOV_MAX { "_SC_IOV_MAX", _SC_IOV_MAX }, #endif #ifdef _SC_XOPEN_UNIX { "_SC_XOPEN_UNIX", _SC_XOPEN_UNIX }, #endif #ifdef _SC_PAGE_SIZE { "_SC_PAGE_SIZE", _SC_PAGE_SIZE }, #endif #ifdef _SC_T_IOV_MAX { "_SC_T_IOV_MAX", _SC_T_IOV_MAX }, #endif #ifdef _SC_PHYS_PAGES { "_SC_PHYS_PAGES", _SC_PHYS_PAGES }, #endif #ifdef _SC_AVPHYS_PAGES { "_SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES }, #endif #ifdef _SC_COHER_BLKSZ { "_SC_COHER_BLKSZ", _SC_COHER_BLKSZ }, #endif #ifdef _SC_SPLIT_CACHE { "_SC_SPLIT_CACHE", _SC_SPLIT_CACHE }, #endif #ifdef _SC_ICACHE_SZ { "_SC_ICACHE_SZ", _SC_ICACHE_SZ }, #endif #ifdef _SC_DCACHE_SZ { "_SC_DCACHE_SZ", _SC_DCACHE_SZ }, #endif #ifdef _SC_ICACHE_LINESZ { "_SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ }, #endif #ifdef _SC_DCACHE_LINESZ { "_SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ }, #endif #ifdef _SC_ICACHE_BLKSZ { "_SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ }, #endif #ifdef _SC_DCACHE_BLKSZ { "_SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ }, #endif #ifdef _SC_DCACHE_TBLKSZ { "_SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ }, #endif #ifdef _SC_ICACHE_ASSOC { "_SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC }, #endif #ifdef _SC_DCACHE_ASSOC { "_SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC }, #endif #ifdef _SC_MAXPID { "_SC_MAXPID", _SC_MAXPID }, #endif #ifdef _SC_STACK_PROT { "_SC_STACK_PROT", _SC_STACK_PROT }, #endif #ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS { "_SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS }, #endif #ifdef _SC_GETGR_R_SIZE_MAX { "_SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX }, #endif #ifdef _SC_GETPW_R_SIZE_MAX { "_SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX }, #endif #ifdef _SC_LOGIN_NAME_MAX { "_SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX }, #endif #ifdef _SC_THREAD_KEYS_MAX { "_SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX }, #endif #ifdef _SC_THREAD_STACK_MI { "_SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN }, #endif #ifdef _SC_THREAD_THREADS_MAX { "_SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX }, #endif #ifdef _SC_THREAD_ATTR_STACKADDR { "_SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR }, #endif #ifdef _SC_THREAD_ATTR_STACKSIZE { "_SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE }, #endif #ifdef _SC_THREAD_PRIORITY_SCHEDULING { "_SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING }, #endif #ifdef _SC_THREAD_PRIO_INHERIT { "_SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT }, #endif #ifdef _SC_THREAD_PRIO_PROTECT { "_SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT }, #endif #ifdef _SC_THREAD_PROCESS_SHARED { "_SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED }, #endif #ifdef _SC_XOPEN_LEGACY { "_SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY }, #endif #ifdef _SC_XOPEN_REALTIME { "_SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME }, #endif #ifdef _SC_XOPEN_REALTIME_THREADS { "_SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS }, #endif #ifdef _SC_XBS5_ILP32_OFF32 { "_SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32 }, #endif #ifdef _SC_XBS5_ILP32_OFFBIG { "_SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG }, #endif #ifdef _SC_XBS5_LP64_OFF64 { "_SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64 }, #endif #ifdef _SC_XBS5_LPBIG_OFFBIG { "_SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG }, #endif #ifdef _SC_EQUIV_CLASS_MAX { "_SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX }, #endif #ifdef _SC_CHARCLASS_NAME_MAX { "_SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX }, #endif #ifdef _SC_PII { "_SC_PII", _SC_PII }, #endif #ifdef _SC_PII_XTI { "_SC_PII_XTI", _SC_PII_XTI }, #endif #ifdef _SC_PII_SOCKET { "_SC_PII_SOCKET", _SC_PII_SOCKET }, #endif #ifdef _SC_PII_INTERNET { "_SC_PII_INTERNET", _SC_PII_INTERNET }, #endif #ifdef _SC_PII_OSI { "_SC_PII_OSI", _SC_PII_OSI }, #endif #ifdef _SC_POLL { "_SC_POLL", _SC_POLL }, #endif #ifdef _SC_SELECT { "_SC_SELECT", _SC_SELECT }, #endif #ifdef _SC_UIO_MAXIOV { "_SC_UIO_MAXIOV", _SC_UIO_MAXIOV }, #endif #ifdef _SC_PII_INTERNET_STREAM { "_SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM }, #endif #ifdef _SC_PII_INTERNET_DGRAM { "_SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM }, #endif #ifdef _SC_PII_OSI_COTS { "_SC_PII_OSI_COTS", _SC_PII_OSI_COTS }, #endif #ifdef _SC_PII_OSI_CLTS { "_SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS }, #endif #ifdef _SC_PII_OSI_M { "_SC_PII_OSI_M", _SC_PII_OSI_M }, #endif #ifdef _SC_T_IOV_MAX { "_SC_T_IOV_MAX", _SC_T_IOV_MAX }, #endif #ifdef _SC_THREADS { "_SC_THREADS", _SC_THREADS }, #endif #ifdef _SC_THREAD_SAFE_FUNCTIONS { "_SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS }, #endif #ifdef _SC_TTY_NAME_MAX { "_SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX }, #endif #ifdef _SC_XOPEN_XPG2 { "_SC_XOPEN_XPG2", _SC_XOPEN_XPG2 }, #endif #ifdef _SC_XOPEN_XPG3 { "_SC_XOPEN_XPG3", _SC_XOPEN_XPG3 }, #endif #ifdef _SC_XOPEN_XPG4 { "_SC_XOPEN_XPG4", _SC_XOPEN_XPG4 }, #endif #ifdef _SC_CHAR_BIT { "_SC_CHAR_BIT", _SC_CHAR_BIT }, #endif #ifdef _SC_CHAR_MAX { "_SC_CHAR_MAX", _SC_CHAR_MAX }, #endif #ifdef _SC_CHAR_MIN { "_SC_CHAR_MIN", _SC_CHAR_MIN }, #endif #ifdef _SC_INT_MAX { "_SC_INT_MAX", _SC_INT_MAX }, #endif #ifdef _SC_INT_MIN { "_SC_INT_MIN", _SC_INT_MIN }, #endif #ifdef _SC_LONG_BIT { "_SC_LONG_BIT", _SC_LONG_BIT }, #endif #ifdef _SC_WORD_BIT { "_SC_WORD_BIT", _SC_WORD_BIT }, #endif #ifdef _SC_MB_LEN_MAX { "_SC_MB_LEN_MAX", _SC_MB_LEN_MAX }, #endif #ifdef _SC_NZERO { "_SC_NZERO", _SC_NZERO }, #endif #ifdef _SC_SSIZE_MAX { "_SC_SSIZE_MAX", _SC_SSIZE_MAX }, #endif #ifdef _SC_SCHAR_MAX { "_SC_SCHAR_MAX", _SC_SCHAR_MAX }, #endif #ifdef _SC_SCHAR_MIN { "_SC_SCHAR_MIN", _SC_SCHAR_MIN }, #endif #ifdef _SC_SHRT_MAX { "_SC_SHRT_MAX", _SC_SHRT_MAX }, #endif #ifdef _SC_SHRT_MIN { "_SC_SHRT_MIN", _SC_SHRT_MIN }, #endif #ifdef _SC_UCHAR_MAX { "_SC_UCHAR_MAX", _SC_UCHAR_MAX }, #endif #ifdef _SC_UINT_MAX { "_SC_UINT_MAX", _SC_UINT_MAX }, #endif #ifdef _SC_ULONG_MAX { "_SC_ULONG_MAX", _SC_ULONG_MAX }, #endif #ifdef _SC_USHRT_MAX { "_SC_USHRT_MAX", _SC_USHRT_MAX }, #endif #ifdef _SC_NL_ARGMAX { "_SC_NL_ARGMAX", _SC_NL_ARGMAX }, #endif #ifdef _SC_NL_LANGMAX { "_SC_NL_LANGMAX", _SC_NL_LANGMAX }, #endif #ifdef _SC_NL_MSGMAX { "_SC_NL_MSGMAX", _SC_NL_MSGMAX }, #endif #ifdef _SC_NL_NMAX { "_SC_NL_NMAX", _SC_NL_NMAX }, #endif #ifdef _SC_NL_SETMAX { "_SC_NL_SETMAX", _SC_NL_SETMAX }, #endif }; static Handle getSysConf(TaskData *taskData, Handle args) { char argName[200]; int length; unsigned i; long res; length = Poly_string_to_C(DEREFWORD(args), argName, 200); if (length > 200) raise_syscall(taskData, "Argument name too long", ENAMETOOLONG); for (i = 0; i < sizeof(sysArgTable)/sizeof(sysArgTable[0]); i++) { if (strcmp(argName, sysArgTable[i].saName) == 0) break; /* See if it matches without the _SC_ at the beginning. */ if (strcmp(argName, sysArgTable[i].saName+4) == 0) break; } if (i == sizeof(sysArgTable)/sizeof(sysArgTable[0])) raise_syscall(taskData, "sysconf argument not found", EINVAL); errno = 0; /* Sysconf may return -1 without updating errno. */ res = sysconf(sysArgTable[i].saVal); if (res < 0) raise_syscall(taskData, "sysconf failed", errno); return Make_arbitrary_precision(taskData, (POLYUNSIGNED)res); } static struct { const char *pcName; int pcVal; } pathConfTable[] = { { "_PC_LINK_MAX", _PC_LINK_MAX }, { "_PC_MAX_CANON", _PC_MAX_CANON }, { "_PC_MAX_INPUT", _PC_MAX_INPUT }, { "_PC_NAME_MAX", _PC_NAME_MAX }, { "_PC_PATH_MAX", _PC_PATH_MAX }, { "_PC_PIPE_BUF", _PC_PIPE_BUF }, { "_PC_NO_TRUNC", _PC_NO_TRUNC }, { "_PC_VDISABLE", _PC_VDISABLE }, { "_PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED }, #ifdef _PC_ASYNC_IO { "_PC_ASYNC_IO", _PC_ASYNC_IO }, #endif #ifdef _PC_PRIO_IO { "_PC_PRIO_IO", _PC_PRIO_IO }, #endif #ifdef _PC_SYNC_IO { "_PC_SYNC_IO", _PC_SYNC_IO }, #endif #ifdef _PC_FILESIZEBITS { "_PC_FILESIZEBITS", _PC_FILESIZEBITS }, #endif #ifdef _PC_SOCK_MAXBUF { "_PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF }, #endif }; /* Look up a path variable in the table. */ static int findPathVar(TaskData *taskData, PolyWord ps) { char argName[200]; int length; unsigned i; length = Poly_string_to_C(ps, argName, 200); if (length > 200) raise_syscall(taskData, "Argument name too long", ENAMETOOLONG); for (i = 0; i < sizeof(pathConfTable)/sizeof(pathConfTable[0]); i++) { if (strcmp(argName, pathConfTable[i].pcName) == 0) return pathConfTable[i].pcVal; /* See if it matches without the _PC_ at the beginning. */ if (strcmp(argName, pathConfTable[i].pcName+4) == 0) return pathConfTable[i].pcVal; } raise_syscall(taskData, "pathconf argument not found", EINVAL); } class UnixSpecific: public RtsModule { public: virtual void Init(void); }; // Declare this. It will be automatically added to the table. static UnixSpecific unixModule; void UnixSpecific::Init(void) { struct sigaction sigcatch; /* Ignore SIGPIPE - return any errors as failure to write. */ memset(&sigcatch, 0, sizeof(sigcatch)); sigcatch.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sigcatch, NULL); } polyml-5.6/libpolyml/version.h000066400000000000000000000025461265146633400165620ustar00rootroot00000000000000/* Title: version.h Copyright (c) 2000-15 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef VERSION_H_INCLUDED #define VERSION_H_INCLUDED // Poly/ML system interface level #define POLY_version_number 560 // POLY_version_number is written into all exported files and tested // when we start up. The idea is to ensure that if a file is exported // from one version of the library it will run successfully if linked // with a different version. // This only supports version 5.6 #define FIRST_supported_version 560 #define LAST_supported_version 560 #define TextVersion "5.6" #endif polyml-5.6/libpolyml/windows_specific.cpp000066400000000000000000001421751265146633400207720ustar00rootroot00000000000000/* Title: Operating Specific functions: Windows version. Copyright (c) 2000, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include #include #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_TCHAR_H #include #endif #ifdef HAVE_IO_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #include #include "globals.h" #include "arb.h" #include "gc.h" #include "run_time.h" #include "io_internal.h" #include "os_specific.h" #include "sys.h" #include "processes.h" #include "Console.h" #include "mpoly.h" #include "diagnostics.h" #include "scanaddrs.h" #include "polystring.h" #include "save_vec.h" #include "rts_module.h" #include "machine_dep.h" #define STREAMID(x) (DEREFSTREAMHANDLE(x)->streamNo) #define SAVE(x) taskData->saveVec.push(x) #define SIZEOF(x) (sizeof(x)/sizeof(word)) typedef enum { HE_UNUSED, HE_REGISTRY, HE_PROCESS, HE_DDECONVERSATION } HANDENTRYTYPE; /* Table of open handles. This is modelled after the IO table in basicio.c and performs a similar function. Each resource has an entry in here and there is a token which is an ML object. The token is simply a word containing the index in the table. It is the token itself which represents the entry within the ML world. The token is checked against the entry whenever it is used since it is possible for the tokens to be persistent although the corresponding entry in the table will not make sense in a subsequent session. This table also allows us to garbage-collect entries since if the token becomes unreachable we know that there is no longer a reference to the entry within ML. */ typedef struct { PolyObject *token; /* pointer into ML heap */ HANDENTRYTYPE entryType; /* Type of handle */ union { HKEY hKey; /* Registry key. */ struct { /* Process and IO channels. */ HANDLE hProcess, hInput, hOutput, hEvent; PolyObject *readToken, *writeToken; } process; HCONV hcDDEConv; /* DDE Conversation. */ } entry; } HANDLETAB, *PHANDLETAB; static PHANDLETAB handleTable; static POLYUNSIGNED maxHandleTab; /* General "close" function which may be called from the garbage-collector. */ static void close_handle(PHANDLETAB pTab) { switch (pTab->entryType) { case HE_REGISTRY: RegCloseKey(pTab->entry.hKey); break; case HE_PROCESS: if (pTab->entry.process.hProcess) CloseHandle(pTab->entry.process.hProcess); if (pTab->entry.process.hInput != INVALID_HANDLE_VALUE) CloseHandle(pTab->entry.process.hInput); if (pTab->entry.process.hOutput != INVALID_HANDLE_VALUE) CloseHandle(pTab->entry.process.hOutput); if (pTab->entry.process.hEvent) CloseHandle(pTab->entry.process.hEvent); break; case HE_DDECONVERSATION: CloseDDEConversation(pTab->entry.hcDDEConv); break; case HE_UNUSED: break; // Avoid warnings } pTab->token = 0; pTab->entryType = HE_UNUSED; } static PHANDLETAB get_handle(PolyWord token, HANDENTRYTYPE heType) { StreamToken *handle_token = (StreamToken*)token.AsObjPtr(); POLYUNSIGNED handle_no = handle_token->streamNo; if (handle_no >= maxHandleTab || handleTable[handle_no].token != handle_token || handleTable[handle_no].entryType != heType) return 0; return &handleTable[handle_no]; } static Handle make_handle_entry(TaskData *taskData) { unsigned handle_no; Handle str_token; bool have_collected = false; do { for(handle_no = 0; handle_no < maxHandleTab && handleTable[handle_no].token != 0; handle_no++); /* Check we have enough space. */ if (handle_no >= maxHandleTab) { /* No space. */ /* See if we have unreferenced streams. */ if (! have_collected) { FullGC(taskData); have_collected = true; } else /* No space - expand vector. */ { POLYUNSIGNED oldMax = maxHandleTab; maxHandleTab += maxHandleTab/2; void *p = realloc(handleTable, maxHandleTab*sizeof(HANDLETAB)); // If there's insufficient memory leave the old table. if (p == 0) raise_syscall(taskData, "Insufficient memory", ENOMEM); handleTable = (PHANDLETAB)p; /* Clear the new space. */ memset(handleTable+oldMax, 0, (maxHandleTab-oldMax)*sizeof(HANDLETAB)); } } } while (handle_no >= maxHandleTab); str_token = alloc_and_save(taskData, 1, F_BYTE_OBJ); STREAMID(str_token) = handle_no; /* Clear the entry then set the token. */ memset(&handleTable[handle_no], 0, sizeof(HANDLETAB)); handleTable[handle_no].token = DEREFWORDHANDLE(str_token); return str_token; } static Handle execute(TaskData *taskData, Handle pname); static Handle simpleExecute(TaskData *taskData, Handle args); static Handle openProcessHandle(TaskData *taskData, Handle args, BOOL fIsRead, BOOL fIsText); static Handle openRegistryKey(TaskData *taskData, Handle args, HKEY hkParent); static Handle createRegistryKey(TaskData *taskData, Handle args, HKEY hkParent); static Handle queryRegistryKey(TaskData *taskData, Handle args, HKEY hkParent); static Handle setRegistryKey(TaskData *taskData, Handle args, HKEY hkParent); static Handle deleteRegistryKey(TaskData *taskData, Handle args, HKEY hkParent); static Handle deleteRegistryValue(TaskData *taskData, Handle args, HKEY hkParent); static Handle enumerateRegistry(TaskData *taskData, Handle args, HKEY hkey, BOOL isKey); // Vector of constants returned by call1006 static POLYUNSIGNED winConstVec[] = { KEY_ALL_ACCESS, // 0 KEY_CREATE_LINK, KEY_CREATE_SUB_KEY, KEY_ENUMERATE_SUB_KEYS, KEY_EXECUTE, KEY_NOTIFY, KEY_QUERY_VALUE, KEY_READ, KEY_SET_VALUE, KEY_WRITE, // 9 STATUS_ACCESS_VIOLATION, // 10 STATUS_ARRAY_BOUNDS_EXCEEDED, STATUS_BREAKPOINT, STATUS_CONTROL_C_EXIT, STATUS_DATATYPE_MISALIGNMENT, STATUS_FLOAT_DENORMAL_OPERAND, STATUS_FLOAT_DIVIDE_BY_ZERO, STATUS_FLOAT_INEXACT_RESULT, STATUS_FLOAT_INVALID_OPERATION, STATUS_FLOAT_OVERFLOW, STATUS_FLOAT_STACK_CHECK, STATUS_FLOAT_UNDERFLOW, STATUS_GUARD_PAGE_VIOLATION, STATUS_INTEGER_DIVIDE_BY_ZERO, STATUS_INTEGER_OVERFLOW, STATUS_ILLEGAL_INSTRUCTION, STATUS_INVALID_DISPOSITION, #ifdef STATUS_INVALID_HANDLE STATUS_INVALID_HANDLE, #else 0, // Not defined in Win CE #endif STATUS_IN_PAGE_ERROR, STATUS_NONCONTINUABLE_EXCEPTION, STATUS_PENDING, STATUS_PRIVILEGED_INSTRUCTION, STATUS_SINGLE_STEP, STATUS_STACK_OVERFLOW, STATUS_TIMEOUT, STATUS_USER_APC, // 35 VER_PLATFORM_WIN32s, // 36 VER_PLATFORM_WIN32_WINDOWS, VER_PLATFORM_WIN32_NT, // 38 // VER_PLATFORM_WIN32_CE is only defined in the Windows CE headers #ifdef VER_PLATFORM_WIN32_CE VER_PLATFORM_WIN32_CE, // 39 #else 3, // 39 #endif }; HKEY hkPredefinedKeyTab[] = { HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, #ifdef HKEY_PERFORMANCE_DATA HKEY_PERFORMANCE_DATA, #else 0, // Not defined in Win CE #endif #ifdef HKEY_CURRENT_CONFIG HKEY_CURRENT_CONFIG, #else 0, #endif #ifdef HKEY_DYN_DATA HKEY_DYN_DATA #else 0 #endif }; Handle OS_spec_dispatch_c(TaskData *taskData, Handle args, Handle code) { unsigned c = get_C_unsigned(taskData, DEREFWORD(code)); switch (c) { case 0: /* Return our OS type. Not in any structure. */ return Make_arbitrary_precision(taskData, 1); /* 1 for Windows. */ /* Windows-specific functions. */ case 1000: /* execute */ return execute(taskData, args); case 1001: /* Get input stream as text. */ return openProcessHandle(taskData, args, TRUE, TRUE); case 1002: /* Get output stream as text. */ return openProcessHandle(taskData, args, FALSE, TRUE); case 1003: /* Get input stream as binary. */ return openProcessHandle(taskData, args, TRUE, FALSE); case 1004: /* Get output stream as binary. */ return openProcessHandle(taskData, args, FALSE, FALSE); case 1005: /* Get result of process. */ { PHANDLETAB hnd = get_handle(DEREFWORD(args), HE_PROCESS); if (hnd == 0) raise_syscall(taskData, "Process is closed", EINVAL); // Close the streams. Either of them may have been // passed to the stream package. if (hnd->entry.process.hInput != INVALID_HANDLE_VALUE) CloseHandle(hnd->entry.process.hInput); hnd->entry.process.hInput = INVALID_HANDLE_VALUE; if (hnd->entry.process.hEvent) CloseHandle(hnd->entry.process.hEvent); hnd->entry.process.hEvent = NULL; if (hnd->entry.process.readToken) { PIOSTRUCT strm = get_stream(hnd->entry.process.readToken); if (strm != NULL) close_stream(strm); } hnd->entry.process.readToken = 0; if (hnd->entry.process.hOutput != INVALID_HANDLE_VALUE) CloseHandle(hnd->entry.process.hOutput); hnd->entry.process.hOutput = INVALID_HANDLE_VALUE; if (hnd->entry.process.writeToken) { PIOSTRUCT strm = get_stream(hnd->entry.process.writeToken); if (strm != NULL) close_stream(strm); } hnd->entry.process.writeToken = 0; // See if it's finished. while (true) { DWORD dwResult; if (GetExitCodeProcess(hnd->entry.process.hProcess, &dwResult) == 0) raise_syscall(taskData, "GetExitCodeProcess failed", -(int)GetLastError()); if (dwResult != STILL_ACTIVE) { /* Finished - return the result. */ /* Note: we haven't closed the handle because we might want to ask for the result again. We only close it when we've garbage-collected the token. Doing this runs the risk of running out of handles. Maybe change it and remember the result in ML. */ return Make_arbitrary_precision(taskData, dwResult); } // Block and try again. WaitHandle waiter(hnd->entry.process.hProcess); processes->ThreadPauseForIO(taskData, &waiter); } } case 1006: /* Return a constant. */ { unsigned i = get_C_unsigned(taskData, DEREFWORD(args)); if (i >= sizeof(winConstVec)/sizeof(winConstVec[0])) raise_syscall(taskData, "Invalid index", 0); return Make_arbitrary_precision(taskData, winConstVec[i]); } /* Registry functions. */ case 1007: // Open a key within one of the roots. { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return openRegistryKey(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1008: // Open a subkey of an opened key. { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return openRegistryKey(taskData, args, hnd->entry.hKey); } case 1009: // Create a subkey within one of the roots. { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return createRegistryKey(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1010: // Create a subkey within an opened key. { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return createRegistryKey(taskData, args, hnd->entry.hKey); } case 1011: // Close a registry handle. { PHANDLETAB hnd = get_handle(DEREFWORD(args), HE_REGISTRY); if (hnd != 0) close_handle(hnd); return Make_arbitrary_precision(taskData, 0); } case 1012: // Get a value { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return queryRegistryKey(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1013: // Get a value { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return queryRegistryKey(taskData, args, hnd->entry.hKey); } case 1014: // Delete a subkey { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return deleteRegistryKey(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1015: // Delete a subkey { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return deleteRegistryKey(taskData, args, hnd->entry.hKey); } case 1016: // Set a value { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return setRegistryKey(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1017: // Set a value { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return setRegistryKey(taskData, args, hnd->entry.hKey); } case 1018: // Enumerate a key in the predefined keys { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return enumerateRegistry(taskData, args, hkPredefinedKeyTab[keyIndex], TRUE); } case 1019: // Enumerate a key in an opened key { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return enumerateRegistry(taskData, args, hnd->entry.hKey, TRUE); } case 1020: // Enumerate a value in the predefined keys { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return enumerateRegistry(taskData, args, hkPredefinedKeyTab[keyIndex], FALSE); } case 1021: // Enumerate a value in an opened key { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return enumerateRegistry(taskData, args, hnd->entry.hKey, FALSE); } case 1022: // Delete a value { unsigned keyIndex = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(0)); // This should only ever happen as a result of a fault in // the Windows structure. if (keyIndex >= sizeof(hkPredefinedKeyTab)/sizeof(hkPredefinedKeyTab[0])) raise_syscall(taskData, "Invalid index", 0); return deleteRegistryValue(taskData, args, hkPredefinedKeyTab[keyIndex]); } case 1023: // Delete a value { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_REGISTRY); if (hnd == 0) raise_syscall(taskData, "Handle is closed", -ERROR_INVALID_HANDLE); return deleteRegistryValue(taskData, args, hnd->entry.hKey); } case 1030: // Convert UTC time values to local time. -- No longer used?? { FILETIME ftUTC, ftLocal; /* Get the file time. */ getFileTimeFromArb(taskData, args, &ftUTC); if (! FileTimeToLocalFileTime(&ftUTC, &ftLocal)) raise_syscall(taskData, "FileTimeToLocalFileTime failed", -(int)GetLastError()); return Make_arb_from_Filetime(taskData, ftLocal); } case 1031: // Convert local time values to UTC. -- No longer used?? { FILETIME ftUTC, ftLocal; /* Get the file time. */ getFileTimeFromArb(taskData, args, &ftLocal); if (! LocalFileTimeToFileTime(&ftLocal, &ftUTC)) raise_syscall(taskData, "LocalFileTimeToFileTime failed", -(int)GetLastError()); return Make_arb_from_Filetime(taskData, ftUTC); } case 1032: // Get volume information. { TCHAR rootName[MAX_PATH], volName[MAX_PATH], sysName[MAX_PATH]; DWORD dwVolSerial, dwMaxComponentLen, dwFlags; Handle volHandle, sysHandle, serialHandle, maxCompHandle; Handle resultHandle; POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), rootName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Root name too long", ENAMETOOLONG); if (!GetVolumeInformation(rootName, volName, MAX_PATH, &dwVolSerial, &dwMaxComponentLen, &dwFlags, sysName, MAX_PATH)) raise_syscall(taskData, "GetVolumeInformation failed", -(int)GetLastError()); volHandle = SAVE(C_string_to_Poly(taskData, volName)); sysHandle = SAVE(C_string_to_Poly(taskData, sysName)); serialHandle = Make_arbitrary_precision(taskData, dwVolSerial); maxCompHandle = Make_arbitrary_precision(taskData, dwMaxComponentLen); resultHandle = alloc_and_save(taskData, 4); DEREFHANDLE(resultHandle)->Set(0, DEREFWORDHANDLE(volHandle)); DEREFHANDLE(resultHandle)->Set(1, DEREFWORDHANDLE(sysHandle)); DEREFHANDLE(resultHandle)->Set(2, DEREFWORDHANDLE(serialHandle)); DEREFHANDLE(resultHandle)->Set(3, DEREFWORDHANDLE(maxCompHandle)); return resultHandle; } case 1033: { TCHAR fileName[MAX_PATH], execName[MAX_PATH]; POLYUNSIGNED length = Poly_string_to_C(DEREFWORD(args), fileName, MAX_PATH); HINSTANCE hInst; if (length > MAX_PATH) raise_syscall(taskData, "File name too long", ENAMETOOLONG); hInst = FindExecutable(fileName, NULL, execName); if ((POLYUNSIGNED)hInst <= 32) { raise_syscall(taskData, "FindExecutable failed", -(int)(POLYUNSIGNED)hInst); } return SAVE(C_string_to_Poly(taskData, execName)); } case 1034: // Open a document { SHELLEXECUTEINFO shellEx; memset(&shellEx, 0, sizeof(shellEx)); shellEx.cbSize = sizeof(shellEx); shellEx.lpVerb = _T("open"); shellEx.lpFile = Poly_string_to_T_alloc(DEREFWORD(args)); shellEx.hwnd = hMainWindow; shellEx.nShow = SW_SHOWNORMAL; BOOL fRes = ShellExecuteEx(&shellEx); free((void*)shellEx.lpFile); if (! fRes) raise_syscall(taskData, "ShellExecuteEx failed", 0-GetLastError()); return Make_arbitrary_precision(taskData, 0); } case 1035: // Launch an application. { SHELLEXECUTEINFO shellEx; memset(&shellEx, 0, sizeof(shellEx)); shellEx.cbSize = sizeof(shellEx); shellEx.lpVerb = _T("open"); shellEx.lpFile = Poly_string_to_T_alloc(args->WordP()->Get(0)); shellEx.lpParameters = Poly_string_to_T_alloc(args->WordP()->Get(1)); shellEx.nShow = SW_SHOWNORMAL; BOOL fRes = ShellExecuteEx(&shellEx); free((void*)shellEx.lpFile); free((void*)shellEx.lpParameters); if (! fRes) raise_syscall(taskData, "ShellExecuteEx failed", 0-GetLastError()); return Make_arbitrary_precision(taskData, 0); } case 1036: // Does the process have its own console? return Make_arbitrary_precision(taskData, hMainWindow != NULL ? 1: 0); case 1037: // Simple execute. return simpleExecute(taskData, args); // DDE case 1038: // Start DDE dialogue. { Handle handToken; PHANDLETAB pTab; HCONV hcDDEConv; TCHAR *serviceName = Poly_string_to_T_alloc(args->WordP()->Get(0)); TCHAR *topicName = Poly_string_to_T_alloc(args->WordP()->Get(1)); /* Send a request to the main thread to do the work. */ hcDDEConv = StartDDEConversation(serviceName, topicName); free(serviceName); free(topicName); if (hcDDEConv == 0) raise_syscall(taskData, "DdeConnect failed", 0); // Create an entry to return the conversation. handToken = make_handle_entry(taskData); pTab = &handleTable[STREAMID(handToken)]; pTab->entryType = HE_DDECONVERSATION; pTab->entry.hcDDEConv = hcDDEConv; return handToken; } case 1039: // Send DDE execute request. { PHANDLETAB hnd = get_handle(DEREFHANDLE(args)->Get(0), HE_DDECONVERSATION); LRESULT res; char *command; if (hnd == NULL) { raise_syscall(taskData, "DDE Conversation is closed", 0); } command = Poly_string_to_C_alloc(args->WordP()->Get(1)); /* Send a request to the main thread to do the work. */ res = ExecuteDDE(command, hnd->entry.hcDDEConv); free(command); if (res == -1) raise_syscall(taskData, "DdeClientTransaction failed", 0); else return Make_arbitrary_precision(taskData, res); } case 1040: // Close a DDE conversation. { PHANDLETAB hnd = get_handle(args->Word(), HE_DDECONVERSATION); if (hnd != 0) close_handle(hnd); return Make_arbitrary_precision(taskData, 0); } // Configuration functions. case 1050: // Get version data { OSVERSIONINFO osver; ZeroMemory(&osver, sizeof(OSVERSIONINFO)); osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); // GetVersionEx is deprecated in Windows 8.1 if (! GetVersionEx(&osver)) raise_syscall(taskData, "GetVersionEx failed", -(int)GetLastError()); Handle major = Make_arbitrary_precision(taskData, osver.dwMajorVersion); Handle minor = Make_arbitrary_precision(taskData, osver.dwMinorVersion); Handle build = Make_arbitrary_precision(taskData, osver.dwBuildNumber); Handle platform = Make_arbitrary_precision(taskData, osver.dwPlatformId); Handle version = SAVE(C_string_to_Poly(taskData, osver.szCSDVersion)); Handle resVal = alloc_and_save(taskData, 5); DEREFHANDLE(resVal)->Set(0, DEREFWORDHANDLE(major)); DEREFHANDLE(resVal)->Set(1, DEREFWORDHANDLE(minor)); DEREFHANDLE(resVal)->Set(2, DEREFWORDHANDLE(build)); DEREFHANDLE(resVal)->Set(3, DEREFWORDHANDLE(platform)); DEREFHANDLE(resVal)->Set(4, DEREFWORDHANDLE(version)); return resVal; } case 1051: // Get windows directory { TCHAR path[MAX_PATH+1]; if (GetWindowsDirectory(path, sizeof(path)/sizeof(TCHAR)) == 0) raise_syscall(taskData, "GetWindowsDirectory failed", -(int)GetLastError()); return SAVE(C_string_to_Poly(taskData, path)); } case 1052: // Get system directory { TCHAR path[MAX_PATH+1]; if (GetSystemDirectory(path, sizeof(path)/sizeof(TCHAR)) == 0) raise_syscall(taskData, "GetSystemDirectory failed", -(int)GetLastError()); return SAVE(C_string_to_Poly(taskData, path)); } case 1053: // Get computer name { TCHAR name[MAX_COMPUTERNAME_LENGTH +1]; DWORD dwSize = MAX_COMPUTERNAME_LENGTH +1; if (GetComputerName(name, &dwSize) == 0) raise_syscall(taskData, "GetComputerName failed", -(int)GetLastError()); return SAVE(C_string_to_Poly(taskData, name)); } case 1054: // Get user name { TCHAR name[UNLEN +1]; DWORD dwSize = UNLEN +1; if (GetUserName(name, &dwSize) == 0) raise_syscall(taskData, "GetUserName failed", -(int)GetLastError()); return SAVE(C_string_to_Poly(taskData, name)); } case 1100: // Get the error result from the last call. // This is saved when we make a call to a foreign function. { return(SAVE(TAGGED(taskData->lastError))); } case 1101: // Wait for a message. { HWND hwnd = *(HWND*)(DEREFWORDHANDLE(args)->Get(0).AsCodePtr()); UINT wMsgFilterMin = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(1)); UINT wMsgFilterMax = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); while (1) { MSG msg; processes->ThreadReleaseMLMemory(taskData); // N.B. PeekMessage may directly call the window proc resulting in a // callback to ML. For this to work a callback must not overwrite "args". BOOL result = PeekMessage(&msg, hwnd, wMsgFilterMin, wMsgFilterMax, PM_NOREMOVE); processes->ThreadUseMLMemory(taskData); if (result) return Make_arbitrary_precision(taskData, 0); // Pause until a message arrives. processes->ThreadPause(taskData); } } // case 1102: // Return the address of the window callback function. case 1103: // Return the application instance. { Handle result = alloc_and_save(taskData, 1, F_BYTE_OBJ); *(HINSTANCE*)(result->Word().AsCodePtr()) = hApplicationInstance; return result; } case 1104: // Return the main window handle { Handle result = alloc_and_save(taskData, 1, F_BYTE_OBJ); *(HWND*)(result->Word().AsCodePtr()) = hMainWindow; return result; } // case 1105: // Set the callback function default: { char msg[100]; sprintf(msg, "Unknown windows-specific function: %d", c); raise_exception_string(taskData, EXC_Fail, msg); return 0; } } } /* The Windows version of this is more complicated than the Unix version because we can't manipulate the pipe handles in the child process. Everything has to be set up in the parent. As with Unix we create two pipes and pass one end of each pipe to the child. The end we pass to the child is "inheritable" (i.e. duplicated in the child as with Unix file descriptors) while the ends we keep in the parent are non-inheritable (i.e. not duplicated in the child). DCJM: December 1999. This is now further complicated to improve the performance. In Unix we can pass the file ID to "select" which will return immediately when input is available (we ignore blocking on output at the moment). That allows the ML process to respond immediately. There's no easy way to do that in Windows since the pipe handle is signalled whether there is input available or not. One possibility would be to use overlapped IO but that requires using the ReadFile call directly and some contortions to create a pipe with overlapped IO. The other, taken here, is to interpose a thread which can signal an event when input is available. */ static Handle execute(TaskData *taskData, Handle args) { LPCSTR lpszError = ""; HANDLE hWriteToChild = INVALID_HANDLE_VALUE, hReadFromParent = INVALID_HANDLE_VALUE, hWriteToParent = INVALID_HANDLE_VALUE, hReadFromChild = INVALID_HANDLE_VALUE; HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hTemp; STARTUPINFO startupInfo; PROCESS_INFORMATION processInfo; Handle handToken = make_handle_entry(taskData); PHANDLETAB pTab = &handleTable[STREAMID(handToken)]; LPTSTR commandName = Poly_string_to_T_alloc(args->WordP()->Get(0)); LPTSTR arguments = Poly_string_to_T_alloc(args->WordP()->Get(1)); // Create pipes for connection. Setting the security argument to NULL creates // the pipe handles as non-inheritable. We have to make sure that the // child process does not inherit handles for the parent end of the // connection otherwise the pipe will remain open after the parent has // closed its end, causing the child process to sit around even after // the parent process has gone away. if (!CreatePipe(&hReadFromParent, &hWriteToChild, NULL, 0)) { lpszError = "Could not create pipe"; goto error; } if (!CreatePipe(&hReadFromChild, &hWriteToParent, NULL, 0)) { lpszError = "Could not create pipe"; goto error; } // Create the copying thread. hTemp = CreateCopyPipe(hReadFromChild, hEvent); if (hTemp == NULL) { lpszError = "Could not create pipe"; goto error; } hReadFromChild = hTemp; // Convert the handles we want to pass to the child into inheritable // handles by duplicating and replacing them with the duplicates. if (! DuplicateHandle(GetCurrentProcess(), hWriteToParent, GetCurrentProcess(), &hTemp, 0, TRUE, // inheritable DUPLICATE_SAME_ACCESS )) { lpszError = "Could not create pipe"; goto error; } CloseHandle(hWriteToParent); hWriteToParent = hTemp; if (! DuplicateHandle(GetCurrentProcess(), hReadFromParent, GetCurrentProcess(), &hTemp, 0, TRUE, // inheritable DUPLICATE_SAME_ACCESS )) { lpszError = "Could not create pipe"; goto error; } CloseHandle(hReadFromParent); hReadFromParent = hTemp; // Create a STARTUPINFO structure in which to pass the pipes as stdin // and stdout to the new process. memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdInput = hReadFromParent; startupInfo.hStdOutput = hWriteToParent; // What should we do about the stderr? For the moment, inherit the original. startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); // Treat the empty string as NULL. This is non-standard. if (!CreateProcess(commandName[0] == 0 ? NULL: commandName, arguments[0] == 0 ? NULL: arguments, // Command line NULL, NULL, TRUE, // Security attributes. Inherit handles CREATE_NO_WINDOW, // creation flags NULL, NULL, // Inherit our environment and directory &startupInfo, &processInfo)) { lpszError = "Could not create process"; goto error; } free(commandName); free(arguments); /* Close thread handle since we don't need it. */ CloseHandle(processInfo.hThread); /* Close the sides of the pipes we don't use in the parent. */ CloseHandle(hReadFromParent); CloseHandle(hWriteToParent); pTab->entryType = HE_PROCESS; pTab->entry.process.hProcess = processInfo.hProcess; pTab->entry.process.hInput = hReadFromChild; pTab->entry.process.hOutput = hWriteToChild; pTab->entry.process.hEvent = hEvent; pTab->entry.process.readToken = 0; pTab->entry.process.writeToken = 0; return(handToken); error: { int err = GetLastError(); free(commandName); free(arguments); // Close all the pipe handles. if (hWriteToChild != INVALID_HANDLE_VALUE) CloseHandle(hWriteToChild); if (hReadFromParent != INVALID_HANDLE_VALUE) CloseHandle(hReadFromParent); if (hWriteToParent != INVALID_HANDLE_VALUE) CloseHandle(hWriteToParent); if (hReadFromChild != INVALID_HANDLE_VALUE) CloseHandle(hReadFromChild); if (hEvent) CloseHandle(hEvent); raise_syscall(taskData, lpszError, -err); return NULL; // Never reached. } } static Handle simpleExecute(TaskData *taskData, Handle args) { HANDLE hNull = INVALID_HANDLE_VALUE; PROCESS_INFORMATION processInfo; Handle handToken; PHANDLETAB pTab; TCHAR *commandName = Poly_string_to_T_alloc(args->WordP()->Get(0)); TCHAR *arguments = Poly_string_to_T_alloc(args->WordP()->Get(1)); STARTUPINFO startupInfo; // Open a handle to NUL for input and output. hNull = CreateFile(_T("NUL"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Create a STARTUPINFO structure in which to pass hNULL as stdin // and stdout to the new process. memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdInput = hNull; startupInfo.hStdOutput = hNull; startupInfo.hStdError = hNull; STARTUPINFO *start = &startupInfo; // Treat the empty string as NULL. This is non-standard. if (!CreateProcess(commandName[0] == 0 ? NULL : commandName, arguments[0] == 0 ? NULL : arguments, // Command line NULL, NULL, // Security attributes TRUE, CREATE_NO_WINDOW, // Inherit handles, creation flags NULL, NULL, // Inherit our environment and directory start, &processInfo)) { int nErr = GetLastError(); // Clean up free(commandName); free(arguments); CloseHandle(hNull); raise_syscall(taskData, "CreateProcess failed", -nErr); } free(commandName); free(arguments); /* Close thread handle since we don't need it. */ CloseHandle(processInfo.hThread); #ifndef _WIN32_WCE CloseHandle(hNull); // We no longer need this #endif handToken = make_handle_entry(taskData); pTab = &handleTable[STREAMID(handToken)]; pTab->entryType = HE_PROCESS; pTab->entry.process.hProcess = processInfo.hProcess; // We only use the process handle entry. pTab->entry.process.hInput = INVALID_HANDLE_VALUE; pTab->entry.process.hOutput = INVALID_HANDLE_VALUE; pTab->entry.process.hEvent = NULL; pTab->entry.process.readToken = 0; pTab->entry.process.writeToken = 0; return(handToken); } /* Return a stream, either text or binary, connected to an open process. */ static Handle openProcessHandle(TaskData *taskData, Handle args, BOOL fIsRead, BOOL fIsText) { PHANDLETAB hnd = get_handle(args->Word(), HE_PROCESS); HANDLE hStream; int mode = 0, ioBits = 0; if (hnd == 0) raise_syscall(taskData, "Process is closed", EINVAL); if (fIsRead) hStream = hnd->entry.process.hInput; else hStream = hnd->entry.process.hOutput; /* I had previously assumed that it wasn't possible to get the same stream twice. The current basis library definition allows it but warns it may produce unpredictable results. For the moment we don't allow it because we could get problems with closing the same handle twice. */ #ifdef _WIN32_WCE // Not possible in Windows CE. raise_syscall(taskData, "Process is closed", EBADF); return 0; #else if (hStream == INVALID_HANDLE_VALUE) raise_syscall(taskData, "Process is closed", EBADF); if (fIsRead) { mode = _O_RDONLY; ioBits = IO_BIT_READ; } else { mode = 0; ioBits = IO_BIT_WRITE; } if (fIsText) mode |= _O_TEXT; else mode |= _O_BINARY; Handle str_token = make_stream_entry(taskData); PIOSTRUCT strm = &basic_io_vector[STREAMID(str_token)]; strm->device.ioDesc = _open_osfhandle ((POLYSIGNED) hStream, mode); if (strm->device.ioDesc == -1) raise_syscall(taskData, "_open_osfhandle failed", errno); strm->ioBits = ioBits | IO_BIT_OPEN | IO_BIT_PIPE; /* The responsibility for closing the handle is passed to the stream package. We need to retain a pointer to the stream entry so that we can close the stream in "reap". */ if (fIsRead) { hnd->entry.process.hInput = INVALID_HANDLE_VALUE; hnd->entry.process.readToken = strm->token; // Pass the "input available" event. strm->hAvailable = hnd->entry.process.hEvent; hnd->entry.process.hEvent = NULL; } else { hnd->entry.process.hOutput = INVALID_HANDLE_VALUE; hnd->entry.process.writeToken = strm->token; } return str_token; #endif } // Open a registry key and make an entry in the table for it. static Handle openRegistryKey(TaskData *taskData, Handle args, HKEY hkParent) { TCHAR keyName[MAX_PATH]; LONG lRes; Handle result; PHANDLETAB pTab; HKEY hkey; REGSAM sam = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), keyName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Key name too long", ENAMETOOLONG); // Try opening the key. lRes = RegOpenKeyEx(hkParent, keyName, 0, sam, &hkey); if (lRes != ERROR_SUCCESS) raise_syscall(taskData, "RegOpenKeyEx failed", -lRes); // Make an entry in the table. result = make_handle_entry(taskData); pTab = &handleTable[STREAMID(result)]; pTab->entryType = HE_REGISTRY; pTab->entry.hKey = hkey; return result; } // Create a registry key and make an entry in the table for it. static Handle createRegistryKey(TaskData *taskData, Handle args, HKEY hkParent) { TCHAR keyName[MAX_PATH]; LONG lRes; Handle keyResult, dispRes, pair; PHANDLETAB pTab; HKEY hkey; DWORD dwDisp; REGSAM sam = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(3)); unsigned opt = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), keyName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Key name too long", ENAMETOOLONG); // Try opening the key. lRes = RegCreateKeyEx(hkParent, keyName, 0, NULL, opt ? REG_OPTION_NON_VOLATILE : REG_OPTION_VOLATILE, sam, NULL, &hkey, &dwDisp); if (lRes != ERROR_SUCCESS) raise_syscall(taskData, "RegCreateKeyEx failed", -lRes); // Make an entry in the table. keyResult = make_handle_entry(taskData); pTab = &handleTable[STREAMID(keyResult)]; pTab->entryType = HE_REGISTRY; pTab->entry.hKey = hkey; // Record whether this was new or old. dispRes = Make_arbitrary_precision(taskData, dwDisp == REG_CREATED_NEW_KEY ? 0: 1); /* Return a pair of the disposition and the token. */ pair = alloc_and_save(taskData, 2); DEREFHANDLE(pair)->Set(0, DEREFWORDHANDLE(dispRes)); DEREFHANDLE(pair)->Set(1, DEREFWORDHANDLE(keyResult)); return pair; } // Delete a key. Note that in Windows NT (but not 95) this will fail if // the key has subkeys. static Handle deleteRegistryKey(TaskData *taskData, Handle args, HKEY hkParent) { TCHAR keyName[MAX_PATH]; LONG lRes; POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), keyName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Key name too long", ENAMETOOLONG); // Try deleting the key. lRes = RegDeleteKey(hkParent, keyName); if (lRes != ERROR_SUCCESS) /* Return the error. */ raise_syscall(taskData, "RegDeleteKey failed", -lRes); return Make_arbitrary_precision(taskData, 0); } static Handle deleteRegistryValue(TaskData *taskData, Handle args, HKEY hkParent) { TCHAR keyName[MAX_PATH]; LONG lRes; POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1).AsObjPtr(), keyName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Key name too long", ENAMETOOLONG); // Try deleting the value. lRes = RegDeleteValue(hkParent, keyName); if (lRes != ERROR_SUCCESS) /* Return the original error. */ raise_syscall(taskData, "RegDeleteValue failed", -lRes); return Make_arbitrary_precision(taskData, 0); } static Handle queryRegistryKey(TaskData *taskData, Handle args, HKEY hkey) { TCHAR valName[MAX_PATH]; byte *keyValue = 0; LONG lRes; DWORD valSize; Handle result, resVal, resType; DWORD dwType; POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), valName, MAX_PATH); if (length > MAX_PATH) raise_syscall(taskData, "Value name too long", ENAMETOOLONG); // How long is the entry? lRes = RegQueryValueEx(hkey, valName, 0, NULL, NULL, &valSize); // When opening HKEY_PERFORMANCE_DATA we don't get a sensible // answer here. if (lRes == ERROR_MORE_DATA) valSize = 1024; // Guess else if (lRes != ERROR_SUCCESS) raise_syscall(taskData, "RegQueryValueEx failed", -lRes); // Allocate that much store and get the value. We could // try reading directly into ML store to save copying but // it hardly seems worthwhile. // Note: It seems that valSize can be zero for some items. if (valSize == 0) resVal = SAVE(C_string_to_Poly(taskData, "", 0)); else { do { byte *newAlloc = (byte*)realloc(keyValue, valSize); if (newAlloc == 0) { free(keyValue); raise_syscall(taskData, "Insufficient memory", ENOMEM); } keyValue = newAlloc; lRes = RegQueryValueEx(hkey, valName, 0, &dwType, keyValue, &valSize); // In the special case of HKEY_PERFORMANCE_DATA we may need to keep // growing the buffer. if (lRes == ERROR_MORE_DATA) valSize = valSize + 1024; } while (lRes == ERROR_MORE_DATA); if (lRes != ERROR_SUCCESS) { free(keyValue); raise_syscall(taskData, "RegQueryValue failed", -lRes); } // If we have a string we have to convert this to ANSI/utf-8. if (dwType == REG_SZ || dwType == REG_MULTI_SZ || dwType == REG_EXPAND_SZ) resVal = SAVE(C_string_to_Poly(taskData, (TCHAR*)keyValue, valSize / sizeof(TCHAR))); else resVal = SAVE(C_string_to_Poly(taskData, (char*)keyValue, valSize)); free(keyValue); } /* Create a pair containing the type and the value. */ resType = Make_arbitrary_precision(taskData, dwType); result = alloc_and_save(taskData, 2); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(resType)); DEREFHANDLE(result)->Set(1, DEREFWORDHANDLE(resVal)); return result; } static Handle setRegistryKey(TaskData *taskData, Handle args, HKEY hkey) { TCHAR valName[MAX_PATH]; LONG lRes; PolyWord str = args->WordP()->Get(3); POLYUNSIGNED length = Poly_string_to_C(args->WordP()->Get(1), valName, MAX_PATH); DWORD dwType = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(2)); if (length > MAX_PATH) raise_syscall(taskData, "Value name too long", ENAMETOOLONG); // The value is binary. Strings will already have had a null added. if (IS_INT(str)) { byte b = (byte)UNTAGGED(str); // Single byte value. lRes = RegSetValueEx(hkey, valName, 0, dwType, &b, 1); } else { PolyStringObject *ps = (PolyStringObject*)str.AsObjPtr(); lRes = RegSetValueEx(hkey, valName, 0, dwType, (CONST BYTE *)ps->chars, (DWORD)ps->length); } if (lRes != ERROR_SUCCESS) raise_syscall(taskData, "RegSetValue failed", -lRes); return Make_arbitrary_precision(taskData, 0); } // Enumerate a key or a value. Returns a string option containing NONE if // no key/value could be found or SOME s where s is the name of the key/value. static Handle enumerateRegistry(TaskData *taskData, Handle args, HKEY hkey, BOOL isKey) { DWORD num = get_C_unsigned(taskData, DEREFWORDHANDLE(args)->Get(1)); LONG lRes; TCHAR keyName[MAX_PATH]; DWORD dwLength = sizeof(keyName)/sizeof(keyName[0]); Handle result, resVal; if (isKey) { FILETIME ftMod; lRes = RegEnumKeyEx(hkey, num, keyName, &dwLength, NULL, NULL, NULL, &ftMod); if (lRes != ERROR_SUCCESS && lRes != ERROR_NO_MORE_ITEMS) raise_syscall(taskData, "RegEnumKeyEx failed", -lRes); } else { lRes = RegEnumValue(hkey, num, keyName, &dwLength, NULL, NULL, NULL, NULL); if (lRes != ERROR_SUCCESS && lRes != ERROR_NO_MORE_ITEMS) raise_syscall(taskData, "RegEnumValue failed", -lRes); } if (lRes == ERROR_NO_MORE_ITEMS) return SAVE(NONE_VALUE); /* NONE. */ resVal = SAVE(C_string_to_Poly(taskData, keyName)); result = alloc_and_save(taskData, 1); DEREFHANDLE(result)->Set(0, DEREFWORDHANDLE(resVal)); return result; } class WindowsModule: public RtsModule { public: virtual void Init(void); virtual void Stop(void); void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static WindowsModule windowsModule; void WindowsModule::GarbageCollect(ScanAddress *process) /* Ensures that all the objects are retained and their addresses updated. */ { POLYUNSIGNED i; /* Entries in the file table. These are marked as weak references so may return 0 for unreferenced streams. */ for(i = 0; i < maxHandleTab; i++) { PHANDLETAB str = &(handleTable[i]); if (str->token != 0) { if (str->entryType == HE_PROCESS) { /* Update the references to opened streams but do this only as weak references. If the stream has gone away then that's fine. */ if (str->entry.process.readToken) process->ScanRuntimeAddress(&str->entry.process.readToken, ScanAddress::STRENGTH_WEAK); if (str->entry.process.writeToken) process->ScanRuntimeAddress(&str->entry.process.writeToken, ScanAddress::STRENGTH_WEAK); } process->ScanRuntimeAddress(&str->token, ScanAddress::STRENGTH_WEAK); /* Unreferenced entries may return zero. */ if (str->token == 0 && str->entryType != HE_UNUSED) close_handle(str); } } } void WindowsModule::Stop(void) { if (handleTable) { for (POLYUNSIGNED i = 0; i < maxHandleTab; i++) { if (handleTable[i].token != 0) close_handle(&handleTable[i]); } free(handleTable); } handleTable = NULL; } void WindowsModule::Init(void) { maxHandleTab = 5; /* Initialise to a small number. */ /* A vector for the streams (initialised by calloc) */ handleTable = (PHANDLETAB)calloc(maxHandleTab,sizeof(HANDLETAB)); } polyml-5.6/libpolyml/x86_dep.cpp000066400000000000000000003372141265146633400167100ustar00rootroot00000000000000/* Title: Machine dependent code for i386 and X64 under Windows and Unix Copyright (c) 2000-7 Cambridge University Technical Services Limited Further work copyright David C. J. Matthews 2011-14 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #ifdef HAVE_STDLIB_H #include #endif #include #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_ASSERT_H #include #define ASSERT(x) assert(x) #else #define ASSERT(x) #endif #ifdef HAVE_STRING_H #include #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include #include #endif #include "globals.h" #include "run_time.h" #include "mpoly.h" #include "arb.h" #include "diagnostics.h" #include "processes.h" #include "sys.h" #include "profiling.h" #include "sighandler.h" #include "machine_dep.h" #include "scanaddrs.h" #include "gc.h" #include "check_objects.h" #include "save_vec.h" #include "memmgr.h" #include "reals.h" #include "polystring.h" #include "xwindows.h" #include "objsize.h" #include "foreign.h" #include "process_env.h" #include "basicio.h" #include "network.h" #include "os_specific.h" #include "poly_specific.h" #include "timing.h" #include "polyffi.h" #ifndef HAVE_SIGALTSTACK // If we can't handle signals on a separate stack make sure there's space // on the Poly stack. At the moment this includes Windows although we // probably don't need this. #define EXTRA_STACK 1024 #else #define EXTRA_STACK 0 #endif #ifndef HOSTARCHITECTURE_X86_64 #define CHECKED_REGS 6 #else /* HOSTARCHITECTURE_X86_64 */ #define CHECKED_REGS 13 #endif /* HOSTARCHITECTURE_X86_64 */ // The unchecked reg field is used for the condition codes and FP save. #define UNCHECKED_REGS 1 + (108/sizeof(PolyWord)) // Number of arguments passed in registers, // The remainder go on the stack. #ifndef HOSTARCHITECTURE_X86_64 #define ARGS_IN_REGS 2 #else /* HOSTARCHITECTURE_X86_64 */ #define ARGS_IN_REGS 5 #endif /* HOSTARCHITECTURE_X86_64 */ /********************************************************************** * * Register usage: * * %Reax: First argument to function. Result of function call. * %Rebx: Second argument to function. * %Recx: General register * %Redx: Closure pointer in call. * %Rebp: Points to memory used for extra registers * %Resi: General register. * %Redi: General register. * %Resp: Stack pointer. * The following apply only on the X64 * %R8: Third argument to function * %R9: Fourth argument to function * %R10: Fifth argument to function * %R11: General register * %R12: General register * %R13: General register * %R14: General register * %R15: Memory allocation pointer * **********************************************************************/ // Structure of floating point save area. // This is dictated by the hardware. typedef byte fpregister[10]; struct fpSaveArea { unsigned short cw; unsigned short _unused0; unsigned short sw; unsigned short _unused1; unsigned short tw; unsigned short _unused2; unsigned fip; unsigned short fcs0; unsigned short _unused3; unsigned foo; unsigned short fcs1; unsigned short _unused4; fpregister registers[8]; }; // Layout of base of stack on X86. class StackObject { public: POLYUNSIGNED p_unused1; POLYCODEPTR p_pc; PolyWord *p_sp; PolyWord *p_unused2; POLYUNSIGNED p_unused3; PolyWord p_eax; PolyWord p_ebx; PolyWord p_ecx; PolyWord p_edx; PolyWord p_esi; PolyWord p_edi; #ifdef HOSTARCHITECTURE_X86_64 PolyWord p_r8; PolyWord p_r9; PolyWord p_r10; PolyWord p_r11; PolyWord p_r12; PolyWord p_r13; PolyWord p_r14; #endif POLYUNSIGNED p_nUnchecked; POLYUNSIGNED p_flags; struct fpSaveArea p_fp; }; /* the amount of ML stack space to reserve for registers, C exception handling etc. The compiler requires us to reserve 2 stack-frames worth (2 * 20 words) plus whatever we require for the register save area. We actually reserve slightly more than this. SPF 3/3/97 */ #define OVERFLOW_STACK_SIZE \ (50 + \ sizeof(StackObject)/sizeof(PolyWord) + \ CHECKED_REGS + \ UNCHECKED_REGS + \ EXTRA_STACK) // These "memory registers" are referenced from the assembly code. // Some are actually referenced from ML code so the offsets are built in. typedef struct _MemRegisters { // These offsets are built into the code generator and assembly code PolyWord *localMpointer; // Allocation ptr + 1 word PolyWord *handlerRegister; // Current exception handler PolyWord *localMbottom; // Base of memory + 1 word PolyWord *stackLimit; // Lower limit of stack PolyWord *unusedNow; // Previously: Upper limit of stack // These offsets are built into the assembly code section byte requestCode; // IO function to call. // The offset (20/40) of requestCode is built into the MAKE_IO_CALL_SEQUENCE macro byte inRTS; // Flag indicating we're not in ML byte returnReason; // Reason for returning from ML. byte fullRestore; // 0 => clear registers, 1 => reload registers // The offset (22/42) of returnReason is built into the MAKE_IO_CALL_SEQUENCE macro StackObject *polyStack; // Current stack base PolyWord *savedSp; // Saved C stack pointer byte *heapOverflow; // Called when the heap limit is reached byte *stackOverflow; // Called when the stack limit is reached byte *stackOverflowEx; // Called when the stack limit is reached (alternate) byte *raiseException; // Called to raise an exception. The packet is passed in eax. // The offset (48/96) of ioEntry is built into the MAKE_IO_CALL_SEQUENCE macro byte *ioEntry; // Called for an IO function byte *raiseDiv; // Called to raise the Div exception. byte *arbEmulation; // This address is called to emulate an arbitrary precision op PolyObject *threadId; // My thread id. Saves having to call into RTS for it. POLYSIGNED real_temp; // Space used to convert integers to reals. } MemRegisters; class X86TaskData: public TaskData { public: X86TaskData(); unsigned allocReg; // The register to take the allocated space. POLYUNSIGNED allocWords; // The words to allocate. Handle callBackResult; MemRegisters memRegisters; virtual void GCStack(ScanAddress *process); virtual Handle EnterPolyCode(); // Start running ML virtual void InterruptCode(); virtual bool GetPCandSPFromContext(SIGNALCONTEXT *context, PolyWord *&sp, POLYCODEPTR &pc); virtual void InitStackFrame(TaskData *parentTask, Handle proc, Handle arg); virtual void SetException(poly_exn *exc); virtual int GetIOFunctionRegisterMask(int ioCall); // Increment or decrement the first word of the object pointed to by the // mutex argument and return the new value. virtual Handle AtomicIncrement(Handle mutexp); virtual Handle AtomicDecrement(Handle mutexp); // Set a mutex to one. virtual void AtomicReset(Handle mutexp); // These are retained for the moment. virtual POLYCODEPTR pc(void) const { return stack->stack()->p_pc; } virtual PolyWord *sp(void) const { return stack->stack()->p_sp; } virtual PolyWord *hr(void) const { return memRegisters.handlerRegister; } virtual void set_hr(PolyWord *hr) { memRegisters.handlerRegister = hr; } // Return the minimum space occupied by the stack if we are considering shrinking it. virtual POLYUNSIGNED currentStackSpace(void) const { return (this->stack->top - this->stack->stack()->p_sp) + OVERFLOW_STACK_SIZE; } virtual void CopyStackFrame(StackObject *old_stack, POLYUNSIGNED old_length, StackObject *new_stack, POLYUNSIGNED new_length); void SetExceptionTrace(void); void CallCodeTupled(); virtual Handle EnterCallbackFunction(Handle func, Handle args); int SwitchToPoly(); void HeapOverflowTrap(); void SetMemRegisters(); void SaveMemRegisters(); void ArbitraryPrecisionTrap(); PolyWord *get_reg(int n); PolyWord *getArgument(unsigned int opByte, unsigned int rexPrefix, bool *inConsts=0); void do_compare(PolyWord v1, PolyWord v2); void do_op(int dest, PolyWord v1, PolyWord v2, Handle (*op)(TaskData *, Handle, Handle)); bool emulate_instrs(); Handle BuildCodeSegment(const byte *code, unsigned bytes, char functionName); Handle BuildKillSelf(); Handle BuildExceptionTrace(); }; class X86Dependent: public MachineDependent { public: X86Dependent() {} // Create a task data object. virtual TaskData *CreateTaskData(void) { return new X86TaskData(); } virtual unsigned InitialStackSize(void) { return 128+OVERFLOW_STACK_SIZE; } // Initial size of a stack virtual void InitInterfaceVector(void); virtual void ScanConstantsWithinCode(PolyObject *addr, PolyObject *oldAddr, POLYUNSIGNED length, ScanAddress *process); virtual Architectures MachineArchitecture(void) #ifndef HOSTARCHITECTURE_X86_64 { return MA_I386; } #else /* HOSTARCHITECTURE_X86_64 */ { return MA_X86_64; } #endif /* HOSTARCHITECTURE_X86_64 */ }; // Entry code sequences - copied to memRegisters before entering ML. static byte *heapOverflow, *stackOverflow, *stackOverflowEx, *raiseDiv, *arbEmulation; /********************************************************************** * * Register fields in the stack. * **********************************************************************/ // Changed from macros to inline functions to improve type safety inline StackObject* x86Stack(TaskData *taskData) { return taskData->stack->stack(); } inline PolyWord& PSP_EAX(TaskData *taskData) { return x86Stack(taskData)->p_eax; } inline PolyWord& PSP_EBX(TaskData *taskData) { return x86Stack(taskData)->p_ebx; } inline PolyWord& PSP_ECX(TaskData *taskData) { return x86Stack(taskData)->p_ecx; } inline PolyWord& PSP_EDX(TaskData *taskData) { return x86Stack(taskData)->p_edx; } inline PolyWord& PSP_ESI(TaskData *taskData) { return x86Stack(taskData)->p_esi; } inline PolyWord& PSP_EDI(TaskData *taskData) { return x86Stack(taskData)->p_edi; } #ifdef HOSTARCHITECTURE_X86_64 // X64 registers only inline PolyWord& PSP_R8(TaskData *taskData) { return x86Stack(taskData)->p_r8; } inline PolyWord& PSP_R9(TaskData *taskData) { return x86Stack(taskData)->p_r9; } inline PolyWord& PSP_R10(TaskData *taskData) { return x86Stack(taskData)->p_r10; } inline PolyWord& PSP_R11(TaskData *taskData) { return x86Stack(taskData)->p_r11; } inline PolyWord& PSP_R12(TaskData *taskData) { return x86Stack(taskData)->p_r12; } inline PolyWord& PSP_R13(TaskData *taskData) { return x86Stack(taskData)->p_r13; } inline PolyWord& PSP_R14(TaskData *taskData) { return x86Stack(taskData)->p_r14; } #endif inline POLYUNSIGNED& PSP_EFLAGS(TaskData *taskData) { return x86Stack(taskData)->p_flags; } #define EFLAGS_CF 0x0001 #define EFLAGS_PF 0x0004 #define EFLAGS_AF 0x0010 #define EFLAGS_ZF 0x0040 #define EFLAGS_SF 0x0080 #define EFLAGS_OF 0x0800 inline POLYCODEPTR& PSP_IC(TaskData *taskData) { return x86Stack(taskData)->p_pc; } inline void PSP_INCR_PC(TaskData *taskData, int /* May be -ve */n) { x86Stack(taskData)->p_pc += n; } inline PolyWord*& PSP_SP(TaskData *taskData) { return x86Stack(taskData)->p_sp; } inline PolyWord*& PSP_HR(X86TaskData *taskData) { return taskData->memRegisters.handlerRegister; } // Values for the returnReason byte enum RETURN_REASON { RETURN_IO_CALL = 0, RETURN_HEAP_OVERFLOW, RETURN_STACK_OVERFLOW, RETURN_STACK_OVERFLOWEX, RETURN_RAISE_DIV, RETURN_ARB_EMULATION, RETURN_CALLBACK_RETURN, RETURN_CALLBACK_EXCEPTION }; extern "C" { // These are declared in the assembly code segment. void X86AsmSwitchToPoly(MemRegisters *); void X86AsmSaveStateAndReturn(void); extern int X86AsmRestoreHandlerAfterExceptionTraceTemplate(void); extern int X86AsmGiveExceptionTraceFnTemplate(void); extern int X86AsmKillSelfTemplate(void); extern int X86AsmCallbackReturnTemplate(void); extern int X86AsmCallbackExceptionTemplate(void); POLYUNSIGNED X86AsmAtomicIncrement(PolyObject*); POLYUNSIGNED X86AsmAtomicDecrement(PolyObject*); extern int X86AsmCallExtraRETURN_HEAP_OVERFLOW(void); extern int X86AsmCallExtraRETURN_STACK_OVERFLOW(void); extern int X86AsmCallExtraRETURN_STACK_OVERFLOWEX(void); extern int X86AsmCallExtraRETURN_RAISE_DIV(void); extern int X86AsmCallExtraRETURN_ARB_EMULATION(void); extern int X86AsmCallExtraRETURN_CALLBACK_RETURN(void); extern int X86AsmCallExtraRETURN_CALLBACK_EXCEPTION(void); // The entry points to assembly code functions. extern byte CallPOLY_SYS_exit, CallPOLY_SYS_chdir, alloc_store, alloc_uninit, raisex, get_length_a, CallPOLY_SYS_get_flags, str_compare, teststrgtr, teststrlss, teststrgeq, teststrleq, CallPOLY_SYS_exception_trace_fn, locksega, CallPOLY_SYS_network, CallPOLY_SYS_os_specific, eq_longword, neq_longword, geq_longword, leq_longword, gt_longword, lt_longword, CallPOLY_SYS_io_dispatch, CallPOLY_SYS_signal_handler, atomic_reset, atomic_increment, atomic_decrement, thread_self, CallPOLY_SYS_thread_dispatch, plus_longword, minus_longword, mul_longword, div_longword, mod_longword, andb_longword, orb_longword, xorb_longword, CallPOLY_SYS_kill_self, shift_left_longword, shift_right_longword, shift_right_arith_longword, CallPOLY_SYS_profiler, longword_to_tagged, signed_to_longword, unsigned_to_longword, CallPOLY_SYS_full_gc, CallPOLY_SYS_stack_trace, CallPOLY_SYS_timing_dispatch, CallPOLY_SYS_objsize, CallPOLY_SYS_showsize, quotrem_long, is_shorta, add_long, sub_long, mult_long, div_long, rem_long, neg_long, xor_long, equal_long, or_long, and_long, CallPOLY_SYS_Real_str, real_geq, real_leq, real_gtr, real_lss, real_eq, real_neq, CallPOLY_SYS_Real_Dispatch, real_add, real_sub, real_mul, real_div, real_abs, real_neg, CallPOLY_SYS_conv_real, CallPOLY_SYS_real_to_int, real_from_int, CallPOLY_SYS_sqrt_real, CallPOLY_SYS_sin_real, CallPOLY_SYS_cos_real, CallPOLY_SYS_arctan_real, CallPOLY_SYS_exp_real, CallPOLY_SYS_ln_real, CallPOLY_SYS_process_env, set_string_length_a, get_first_long_word_a, CallPOLY_SYS_poly_specific, bytevec_eq, cmem_load_asm_8, cmem_load_asm_16, cmem_load_asm_32, cmem_load_asm_float, cmem_load_asm_double, cmem_store_asm_8, cmem_store_asm_16, cmem_store_asm_32, cmem_store_asm_float, cmem_store_asm_double, CallPOLY_SYS_io_operation, CallPOLY_SYS_ffi, move_words, CallPOLY_SYS_set_code_constant, move_words, shift_right_arith_word, int_to_word, move_bytes, CallPOLY_SYS_code_flags, CallPOLY_SYS_shrink_stack, CallPOLY_SYS_callcode_tupled, CallPOLY_SYS_foreign_dispatch, CallPOLY_SYS_XWindows, is_big_endian, bytes_per_word, offset_address, shift_right_word, word_neq, not_bool, string_length, touch_final, int_geq, int_leq, int_gtr, int_lss, mul_word, plus_word, minus_word, div_word, or_word, and_word, xor_word, shift_left_word, mod_word, word_geq, word_leq, word_gtr, word_lss, word_eq, load_byte, load_word, assign_byte, assign_word; #ifdef HOSTARCHITECTURE_X86_64 extern byte cmem_load_asm_64, cmem_store_asm_64; #endif }; // GCC doesn't seem to like these inside the brackets above. extern "C" int registerMaskVector[]; // This vector could perfectly well be in x86asm.asm except that it would be more // complicated to make the code position independent. Mac OS X wants PIC for dynamic // libraries. static byte *entryPointVector[256] = { 0, &CallPOLY_SYS_exit, // 1 0, // 2 is unused 0, // 3 is unused 0, // 4 is unused 0, // 5 is unused 0, // 6 is unused 0, // 7 is unused 0, // 8 is unused &CallPOLY_SYS_chdir, // 9 0, // 10 is unused &alloc_store, // 11 &alloc_uninit, // 12 0, // 13 is unused &raisex, // raisex = 14 &get_length_a, // 15 0, // 16 is unused &CallPOLY_SYS_get_flags, // 17 0, // 18 is no longer used 0, // 19 is no longer used 0, // 20 is no longer used 0, // 21 is unused 0, // 22 is unused &str_compare, // 23 0, // 24 is unused 0, // 25 is unused &teststrgtr, // 26 &teststrlss, // 27 &teststrgeq, // 28 &teststrleq, // 29 0, // 30 0, // 31 is no longer used &CallPOLY_SYS_exception_trace_fn, // 32 0, // 33 - exception trace 0, // 34 is no longer used 0, // 35 is no longer used 0, // 36 is no longer used 0, // 37 is unused 0, // 38 is unused 0, // 39 is unused 0, // 40 is unused 0, // 41 is unused 0, // 42 0, // 43 0, // 44 is no longer used 0, // 45 is no longer used 0, // 46 &locksega, // 47 0, // nullorzero = 48 0, // 49 is no longer used 0, // 50 is no longer used &CallPOLY_SYS_network, // 51 &CallPOLY_SYS_os_specific, // 52 &eq_longword, // 53 &neq_longword, // 54 &geq_longword, // 55 &leq_longword, // 56 >_longword, // 57 <_longword, // 58 0, // 59 is unused 0, // 60 is unused &CallPOLY_SYS_io_dispatch, // 61 &CallPOLY_SYS_signal_handler, // 62 0, // 63 is unused 0, // 64 is unused 0, // 65 is unused 0, // 66 is unused 0, // 67 is unused 0, // 68 is unused &atomic_reset, // 69 &atomic_increment, // 70 &atomic_decrement, // 71 &thread_self, // 72 &CallPOLY_SYS_thread_dispatch, // 73 &plus_longword, // 74 &minus_longword, // 75 &mul_longword, // 76 &div_longword, // 77 &mod_longword, // 78 &andb_longword, // 79 &orb_longword, // 80 &xorb_longword, // 81 0, // 82 is unused 0, // 83 is now unused &CallPOLY_SYS_kill_self, // 84 &shift_left_longword, // 85 &shift_right_longword, // 86 &shift_right_arith_longword, // 87 &CallPOLY_SYS_profiler, // 88 &longword_to_tagged, // 89 &signed_to_longword, // 90 &unsigned_to_longword, // 91 &CallPOLY_SYS_full_gc, // 92 &CallPOLY_SYS_stack_trace, // 93 &CallPOLY_SYS_timing_dispatch, // 94 0, // 95 is unused 0, // 96 is unused 0, // 97 is unused 0, // 98 is unused &CallPOLY_SYS_objsize, // 99 &CallPOLY_SYS_showsize, // 100 0, // 101 is unused 0, // 102 is unused 0, // 103 is unused "rem_long, // 104 &is_shorta, // 105 &add_long, // 106 &sub_long, // 107 &mult_long, // 108 &div_long, // 109 &rem_long, // 110 &neg_long, // 111 &xor_long, // 112 &equal_long, // 113 &or_long, // 114 &and_long, // 115 0, // 116 is unused &CallPOLY_SYS_Real_str, // 117 &real_geq, // 118 &real_leq, // 119 &real_gtr, // 120 &real_lss, // 121 &real_eq, // 122 &real_neq, // 123 &CallPOLY_SYS_Real_Dispatch, // 124 &real_add, // 125 &real_sub, // 126 &real_mul, // 127 &real_div, // 128 &real_abs, // 129 &real_neg, // 130 0, // 131 is unused 0, // 132 is no longer used &CallPOLY_SYS_conv_real, // 133 &CallPOLY_SYS_real_to_int, // 134 &real_from_int, // 135 &CallPOLY_SYS_sqrt_real, // 136 &CallPOLY_SYS_sin_real, // 137 &CallPOLY_SYS_cos_real, // 138 &CallPOLY_SYS_arctan_real, // 139 &CallPOLY_SYS_exp_real, // 140 &CallPOLY_SYS_ln_real, // 141 0, // 142 is no longer used 0, // 143 is unused 0, // 144 is unused 0, // 145 is unused 0, // 146 is unused 0, // 147 is unused 0, // stdin = 148 0, // stdout = 149 &CallPOLY_SYS_process_env, // 150 &set_string_length_a, // 151 &get_first_long_word_a, // 152 &CallPOLY_SYS_poly_specific, // 153 &bytevec_eq, // 154 0, // 155 is unused 0, // 156 is unused 0, // 157 is unused 0, // 158 is unused 0, // 159 is unused &cmem_load_asm_8, // 160 &cmem_load_asm_16, // 161 &cmem_load_asm_32, // 162 #ifdef HOSTARCHITECTURE_X86_64 &cmem_load_asm_64, // 163 #else 0, // 163 #endif &cmem_load_asm_float, // 164 &cmem_load_asm_double, // 165 &cmem_store_asm_8, // 166 &cmem_store_asm_16, // 167 &cmem_store_asm_32, // 168 #ifdef HOSTARCHITECTURE_X86_64 &cmem_store_asm_64, // 169 #else 0, // 169 #endif &cmem_store_asm_float, // 170 &cmem_store_asm_double, // 171 0, // 172 is unused 0, // 173 is unused 0, // 174 is unused 0, // 175 is unused 0, // 176 is unused 0, // 177 is unused 0, // 178 is unused 0, // 179 is unused 0, // 180 is unused 0, // 181 is unused 0, // 182 is unused 0, // 183 is unused 0, // 184 is unused 0, // 185 is unused 0, // 186 is unused 0, // 187 is unused 0, // 188 is unused &CallPOLY_SYS_io_operation, // 189 &CallPOLY_SYS_ffi, // 190 0, // 191 is no longer used 0, // 192 is unused &move_words, // move_words_overlap = 193 &CallPOLY_SYS_set_code_constant, // 194 &move_words, // 195 &shift_right_arith_word, // 196 &int_to_word, // 197 &move_bytes, // 198 &move_bytes, // move_bytes_overlap = 199 &CallPOLY_SYS_code_flags, // 200 &CallPOLY_SYS_shrink_stack, // 201 0, // stderr = 202 0, // 203 now unused &CallPOLY_SYS_callcode_tupled, // 204 &CallPOLY_SYS_foreign_dispatch, // 205 0, // 206 - foreign null 0, // 207 is unused 0, // 208 now unused &CallPOLY_SYS_XWindows, // 209 0, // 210 is unused 0, // 211 is unused 0, // 212 is unused &is_big_endian, // 213 &bytes_per_word, // 214 &offset_address, // 215 &shift_right_word, // 216 &word_neq, // 217 ¬_bool, // 218 0, // 219 is unused 0, // 220 is unused 0, // 221 is unused 0, // 222 is unused &string_length, // 223 0, // 224 is unused 0, // 225 is unused 0, // 226 is unused 0, // 227 is unused &touch_final, // 228 0, // 229 is no longer used 0, // 230 is no longer used &int_geq, // 231 &int_leq, // 232 &int_gtr, // 233 &int_lss, // 234 &load_byte, // load_byte_immut = 235 &load_word, // load_word_immut = 236 0, // 237 is unused &mul_word, // 238 &plus_word, // 239 &minus_word, // 240 &div_word, // 241 &or_word, // 242 &and_word, // 243 &xor_word, // 244 &shift_left_word, // 245 &mod_word, // 246 &word_geq, // 247 &word_leq, // 248 &word_gtr, // 249 &word_lss, // 250 &word_eq, // 251 &load_byte, // 252 &load_word, // 253 &assign_byte, // 254 &assign_word }; X86TaskData::X86TaskData(): allocReg(0), allocWords(0) { memRegisters.inRTS = 1; // We start off in the RTS. // Point "raiseException" at the assembly code for "raisex" memRegisters.raiseException = (byte*)entryPointVector[POLY_SYS_raisex]; // Entry point to save the state for an IO call. This is the common entry // point for all the return and IO-call cases. memRegisters.ioEntry = (byte*)X86AsmSaveStateAndReturn; memRegisters.heapOverflow = heapOverflow; memRegisters.stackOverflow = stackOverflow; memRegisters.stackOverflowEx = stackOverflowEx; memRegisters.raiseDiv = raiseDiv; memRegisters.arbEmulation = arbEmulation; memRegisters.fullRestore = 1; // To force the floating point to 64-bit } void X86TaskData::GCStack(ScanAddress *process) { if (stack != 0) { StackSpace *stackSpace = stack; StackObject *stack = (StackObject*)(stackSpace->stack()); PolyWord *stackPtr = stack->p_sp; // Save this BEFORE we update PolyWord *stackEnd = stackSpace->top; // Either this is TAGGED(0) indicating a retry or it's a code pointer. if (stack->p_pc != TAGGED(0).AsCodePtr()) stack->p_pc = process->ScanStackAddress (PolyWord::FromCodePtr(stack->p_pc), stackSpace, true).AsCodePtr(); stack->p_eax = process->ScanStackAddress(stack->p_eax, stackSpace, false); stack->p_edx = process->ScanStackAddress(stack->p_edx, stackSpace, false); // Process the registers if they have been saved otherwise clear them if (this->memRegisters.fullRestore) { stack->p_ebx = process->ScanStackAddress(stack->p_ebx, stackSpace, false); stack->p_ecx = process->ScanStackAddress(stack->p_ecx, stackSpace, false); stack->p_esi = process->ScanStackAddress(stack->p_esi, stackSpace, false); stack->p_edi = process->ScanStackAddress(stack->p_edi, stackSpace, false); #ifdef HOSTARCHITECTURE_X86_64 stack->p_r8 = process->ScanStackAddress(stack->p_r8, stackSpace, false); stack->p_r9 = process->ScanStackAddress(stack->p_r9, stackSpace, false); stack->p_r10 = process->ScanStackAddress(stack->p_r10, stackSpace, false); stack->p_r11 = process->ScanStackAddress(stack->p_r11, stackSpace, false); stack->p_r12 = process->ScanStackAddress(stack->p_r12, stackSpace, false); stack->p_r13 = process->ScanStackAddress(stack->p_r13, stackSpace, false); stack->p_r14 = process->ScanStackAddress(stack->p_r14, stackSpace, false); #endif } else { stack->p_ebx = TAGGED(0); stack->p_ecx = TAGGED(0); stack->p_esi = TAGGED(0); stack->p_edi = TAGGED(0); #ifdef HOSTARCHITECTURE_X86_64 stack->p_r8 = TAGGED(0); stack->p_r9 = TAGGED(0); stack->p_r10 = TAGGED(0); stack->p_r11 = TAGGED(0); stack->p_r12 = TAGGED(0); stack->p_r13 = TAGGED(0); stack->p_r14 = TAGGED(0); #endif } // Now the values on the stack. for (PolyWord *q = stackPtr; q < stackEnd; q++) *q = process->ScanStackAddress(*q, stackSpace, false); } } // Copy a stack void X86TaskData::CopyStackFrame(StackObject *old_stack, POLYUNSIGNED old_length, StackObject *new_stack, POLYUNSIGNED new_length) { /* Moves a stack, updating all references within the stack */ PolyWord *old_base = (PolyWord *)old_stack; PolyWord *new_base = (PolyWord*)new_stack; PolyWord *old_top = old_base + old_length; /* Calculate the offset of the new stack from the old. If the frame is being extended objects in the new frame will be further up the stack than in the old one. */ POLYSIGNED offset = new_base - old_base + new_length - old_length; /* Copy the registers, changing any that point into the stack. */ new_stack->p_pc = old_stack->p_pc; new_stack->p_sp = old_stack->p_sp + offset; memRegisters.handlerRegister = memRegisters.handlerRegister + offset; POLYUNSIGNED i; for (i = 0; i < CHECKED_REGS; i++) { PolyWord *orr = (&old_stack->p_eax)+i; PolyWord *nrr = (&new_stack->p_eax)+i; PolyWord R = *orr; /* if the register points into the old stack, make the new copy point at the same relative offset within the new stack, otherwise make the new copy identical to the old version. */ if (R.IsTagged() || R.AsStackAddr() < old_base || R.AsStackAddr() >= old_top) *nrr = R; else *nrr = PolyWord::FromStackAddr(R.AsStackAddr() + offset); } /* Copy unchecked registers. - The next "register" is the number of unchecked registers to copy. Unchecked registers are used for values that might look like addresses, i.e. don't have tag bits, but are not. */ new_stack->p_nUnchecked = old_stack->p_nUnchecked; new_stack->p_flags = old_stack->p_flags; new_stack->p_fp = old_stack->p_fp; /* Skip the unused part of the stack. */ i = (PolyWord*)old_stack->p_sp - old_base; ASSERT (i <= old_length); i = old_length - i; PolyWord *old = old_stack->p_sp; PolyWord *newp= new_stack->p_sp; while (i--) { // ASSERT(old >= old_base && old < old_base+old_length); // ASSERT(newp >= new_base && newp < new_base+new_length); PolyWord old_word = *old++; if (old_word.IsTagged() || old_word.AsStackAddr() < old_base || old_word.AsStackAddr() >= old_top) *newp++ = old_word; else *newp++ = PolyWord::FromStackAddr(old_word.AsStackAddr() + offset); } ASSERT(old == ((PolyWord*)old_stack)+old_length); ASSERT(newp == ((PolyWord*)new_stack)+new_length); } // Store a constant in the code segment. This has to be handled specially because // the constant is probably an address. // At the moment this assumes we're dealing with a 32-bit constant on a 32-bit machine // and a 64-bit constant on a 64-bit machine. static Handle set_code_constant(TaskData *taskData, Handle data, Handle constant, Handle offseth, Handle base) { POLYUNSIGNED offset = getPolyUnsigned(taskData, DEREFWORD(offseth)); // Byte offset byte *pointer = DEREFWORD(base).AsCodePtr() + offset; POLYUNSIGNED flags = UNTAGGED(DEREFWORD(data)); POLYUNSIGNED c = DEREFWORD(constant).AsUnsigned(); // N.B. This may well really be an address. if (flags == 1) c -= (POLYUNSIGNED)(pointer + sizeof(PolyWord)); // Relative address. Relative to AFTER the pointer. // Store the value into the code. It can be on an arbitrary alignment. for (unsigned i = 0; i < sizeof(PolyWord); i++) { pointer[i] = (byte)(c & 255); c >>= 8; } return taskData->saveVec.push(TAGGED(0)); } // IO Functions called indirectly from assembly code. static void CallIO0(X86TaskData *taskData, Handle (*ioFun)(TaskData *)) { // Set the return address now. PSP_IC(taskData) = (*PSP_SP(taskData)).AsCodePtr(); Handle result = (*ioFun)(taskData); PSP_EAX(taskData) = result->Word(); // If this is a normal return we can pop the return address. // If this has raised an exception, set for retry or changed process // we mustn't. N,B, The return address could have changed because of GC PSP_SP(taskData)++; } static void CallIO1(X86TaskData *taskData, Handle (*ioFun)(TaskData *, Handle)) { PSP_IC(taskData)= (*PSP_SP(taskData)).AsCodePtr(); Handle saved1 = taskData->saveVec.push(PSP_EAX(taskData)); Handle result = (*ioFun)(taskData, saved1); PSP_EAX(taskData) = result->Word(); PSP_SP(taskData)++; // Pop the return address. } static void CallIO2(X86TaskData *taskData, Handle (*ioFun)(TaskData *, Handle, Handle)) { PSP_IC(taskData) = (*PSP_SP(taskData)).AsCodePtr(); Handle saved1 = taskData->saveVec.push(PSP_EAX(taskData)); Handle saved2 = taskData->saveVec.push(PSP_EBX(taskData)); Handle result = (*ioFun)(taskData, saved2, saved1); PSP_EAX(taskData) = result->Word(); PSP_SP(taskData)++; } static void CallIO3(X86TaskData *taskData, Handle (*ioFun)(TaskData *, Handle, Handle, Handle)) { PSP_IC(taskData) = (*PSP_SP(taskData)).AsCodePtr(); Handle saved1 = taskData->saveVec.push(PSP_EAX(taskData)); Handle saved2 = taskData->saveVec.push(PSP_EBX(taskData)); #ifndef HOSTARCHITECTURE_X86_64 Handle saved3 = taskData->saveVec.push(PSP_SP(taskData)[1]); #else /* HOSTARCHITECTURE_X86_64 */ Handle saved3 = taskData->saveVec.push(PSP_R8(taskData)); #endif /* HOSTARCHITECTURE_X86_64 */ Handle result = (*ioFun)(taskData, saved3, saved2, saved1); PSP_EAX(taskData) = result->Word(); #ifndef HOSTARCHITECTURE_X86_64 PSP_SP(taskData) += 2; // Pop the return address and a stack arg. #else /* HOSTARCHITECTURE_X86_64 */ PSP_SP(taskData)++; #endif /* HOSTARCHITECTURE_X86_64 */ } static void CallIO4(X86TaskData *taskData, Handle (*ioFun)(TaskData *, Handle, Handle, Handle, Handle)) { PSP_IC(taskData) = (*PSP_SP(taskData)).AsCodePtr(); Handle saved1 = taskData->saveVec.push(PSP_EAX(taskData)); Handle saved2 = taskData->saveVec.push(PSP_EBX(taskData)); #ifndef HOSTARCHITECTURE_X86_64 Handle saved3 = taskData->saveVec.push(PSP_SP(taskData)[2]); Handle saved4 = taskData->saveVec.push(PSP_SP(taskData)[1]); #else /* HOSTARCHITECTURE_X86_64 */ Handle saved3 = taskData->saveVec.push(PSP_R8(taskData)); Handle saved4 = taskData->saveVec.push(PSP_R9(taskData)); #endif /* HOSTARCHITECTURE_X86_64 */ Handle result = (*ioFun)(taskData, saved4, saved3, saved2, saved1); PSP_EAX(taskData) = result->Word(); #ifndef HOSTARCHITECTURE_X86_64 PSP_SP(taskData) += 3; // Pop the return address and two stack args. #else /* HOSTARCHITECTURE_X86_64 */ PSP_SP(taskData)++; #endif /* HOSTARCHITECTURE_X86_64 */ } // The only functions with 5 args are move_bytes/word_long static void CallIO5(X86TaskData *taskData, Handle (*ioFun)(TaskData *, Handle, Handle, Handle, Handle, Handle)) { PSP_IC(taskData) = (*PSP_SP(taskData)).AsCodePtr(); Handle saved1 = taskData->saveVec.push(PSP_EAX(taskData)); Handle saved2 = taskData->saveVec.push(PSP_EBX(taskData)); #ifndef HOSTARCHITECTURE_X86_64 Handle saved3 = taskData->saveVec.push(PSP_SP(taskData)[3]); Handle saved4 = taskData->saveVec.push(PSP_SP(taskData)[2]); Handle saved5 = taskData->saveVec.push(PSP_SP(taskData)[1]); #else /* HOSTARCHITECTURE_X86_64 */ Handle saved3 = taskData->saveVec.push(PSP_R8(taskData)); Handle saved4 = taskData->saveVec.push(PSP_R9(taskData)); Handle saved5 = taskData->saveVec.push(PSP_R10(taskData)); #endif /* HOSTARCHITECTURE_X86_64 */ Handle result = (*ioFun)(taskData, saved5, saved4, saved3, saved2, saved1); PSP_EAX(taskData) = result->Word(); #ifndef HOSTARCHITECTURE_X86_64 PSP_SP(taskData) += 4; // Pop the return address and 3 stack args #else /* HOSTARCHITECTURE_X86_64 */ PSP_SP(taskData)++; #endif /* HOSTARCHITECTURE_X86_64 */ } Handle X86TaskData::EnterPolyCode() /* Called from "main" to enter the code. */ { Handle hOriginal = this->saveVec.mark(); // Set this up for the IO calls. while (1) { this->saveVec.reset(hOriginal); // Remove old RTS arguments and results. // Run the ML code and return with the function to call. this->inML = true; int ioFunction = SwitchToPoly(); this->inML = false; if ((debugOptions & DEBUG_RTSCALLS)) IncrementRTSCallCount(ioFunction); try { switch (ioFunction) { case -1: // We've been interrupted. This usually involves simulating a // stack overflow so we could come here because of a genuine // stack overflow. // Previously this code was executed on every RTS call but there // were problems on Mac OS X at least with contention on schedLock. this->pendingInterrupt = false; // Clear this before we handle these // Process any asynchronous events i.e. interrupts or kill processes->ProcessAsynchRequests(this); // Release and re-acquire use of the ML memory to allow another thread // to GC. processes->ThreadReleaseMLMemory(this); processes->ThreadUseMLMemory(this); break; case -2: // A callback has returned. return callBackResult; // Return the saved value. Not used in the new interface. case POLY_SYS_exit: CallIO1(this, &finishc); break; case POLY_SYS_alloc_store: CallIO3(this, &alloc_store_long_c); break; case POLY_SYS_alloc_uninit: CallIO2(this, &alloc_uninit_c); break; case POLY_SYS_chdir: CallIO1(this, &change_dirc); break; case POLY_SYS_get_length: CallIO1(this, &vec_length_c); break; case POLY_SYS_get_flags: CallIO1(this, &get_flags_c); break; case POLY_SYS_str_compare: CallIO2(this, compareStrings); break; case POLY_SYS_teststrgtr: CallIO2(this, &testStringGreater); break; case POLY_SYS_teststrlss: CallIO2(this, &testStringLess); break; case POLY_SYS_teststrgeq: CallIO2(this, &testStringGreaterOrEqual); break; case POLY_SYS_teststrleq: CallIO2(this, &testStringLessOrEqual); break; case POLY_SYS_exception_trace_fn: // Special case. SetExceptionTrace(); break; // case POLY_SYS_lockseg: CallIO1(taskData, &locksegc); break; case POLY_SYS_profiler: CallIO1(this, &profilerc); break; case POLY_SYS_quotrem: CallIO3(this, "_rem_c); break; // case POLY_SYS_is_short: CallIO1(this, &is_shortc); break; case POLY_SYS_aplus: CallIO2(this, &add_longc); break; case POLY_SYS_aminus: CallIO2(this, &sub_longc); break; case POLY_SYS_amul: CallIO2(this, &mult_longc); break; case POLY_SYS_adiv: CallIO2(this, &div_longc); break; case POLY_SYS_amod: CallIO2(this, &rem_longc); break; case POLY_SYS_aneg: CallIO1(this, &neg_longc); break; case POLY_SYS_equala: CallIO2(this, &equal_longc); break; case POLY_SYS_ora: CallIO2(this, &or_longc); break; case POLY_SYS_anda: CallIO2(this, &and_longc); break; case POLY_SYS_xora: CallIO2(this, &xor_longc); break; case POLY_SYS_Real_str: CallIO3(this, &Real_strc); break; case POLY_SYS_Real_geq: CallIO2(this, &Real_geqc); break; case POLY_SYS_Real_leq: CallIO2(this, &Real_leqc); break; case POLY_SYS_Real_gtr: CallIO2(this, &Real_gtrc); break; case POLY_SYS_Real_lss: CallIO2(this, &Real_lssc); break; case POLY_SYS_Real_eq: CallIO2(this, &Real_eqc); break; case POLY_SYS_Real_neq: CallIO2(this, &Real_neqc); break; case POLY_SYS_Real_Dispatch: CallIO2(this, &Real_dispatchc); break; case POLY_SYS_Add_real: CallIO2(this, &Real_addc); break; case POLY_SYS_Sub_real: CallIO2(this, &Real_subc); break; case POLY_SYS_Mul_real: CallIO2(this, &Real_mulc); break; case POLY_SYS_Div_real: CallIO2(this, &Real_divc); break; case POLY_SYS_Abs_real: CallIO1(this, &Real_absc); break; case POLY_SYS_Neg_real: CallIO1(this, &Real_negc); break; case POLY_SYS_conv_real: CallIO1(this, &Real_convc); break; case POLY_SYS_real_to_int: CallIO1(this, &Real_intc); break; case POLY_SYS_int_to_real: CallIO1(this, &Real_floatc); break; case POLY_SYS_sqrt_real: CallIO1(this, &Real_sqrtc); break; case POLY_SYS_sin_real: CallIO1(this, &Real_sinc); break; case POLY_SYS_cos_real: CallIO1(this, &Real_cosc); break; case POLY_SYS_arctan_real: CallIO1(this, &Real_arctanc); break; case POLY_SYS_exp_real: CallIO1(this, &Real_expc); break; case POLY_SYS_ln_real: CallIO1(this, &Real_lnc); break; case POLY_SYS_io_operation: CallIO1(this, &io_operation_c); break; case POLY_SYS_atomic_reset: CallIO1(this, &ProcessAtomicReset); break; case POLY_SYS_atomic_incr: CallIO1(this, &ProcessAtomicIncrement); break; case POLY_SYS_atomic_decr: CallIO1(this, &ProcessAtomicDecrement); break; case POLY_SYS_thread_self: CallIO0(this, &ThreadSelf); break; case POLY_SYS_thread_dispatch: CallIO2(this, &ThreadDispatch); break; // case POLY_SYS_offset_address: CallIO2(this, &offset_addressc); break; case POLY_SYS_shift_right_word: CallIO2(this, &shift_right_word_c); break; case POLY_SYS_word_neq: CallIO2(this, &word_neq_c); break; case POLY_SYS_not_bool: CallIO1(this, ¬_bool_c); break; case POLY_SYS_string_length: CallIO1(this, &string_length_c); break; case POLY_SYS_int_geq: CallIO2(this, &ge_longc); break; case POLY_SYS_int_leq: CallIO2(this, &le_longc); break; case POLY_SYS_int_gtr: CallIO2(this, >_longc); break; case POLY_SYS_int_lss: CallIO2(this, &ls_longc); break; case POLY_SYS_or_word: CallIO2(this, &or_word_c); break; case POLY_SYS_and_word: CallIO2(this, &and_word_c); break; case POLY_SYS_xor_word: CallIO2(this, &xor_word_c); break; case POLY_SYS_shift_left_word: CallIO2(this, &shift_left_word_c); break; case POLY_SYS_word_eq: CallIO2(this, &word_eq_c); break; case POLY_SYS_load_byte: case POLY_SYS_load_byte_immut: CallIO2(this, &load_byte_long_c); break; case POLY_SYS_load_word: case POLY_SYS_load_word_immut: CallIO2(this, &load_word_long_c); break; // case POLY_SYS_is_big_endian: CallIO0(this, &is_big_endianc); break; // case POLY_SYS_bytes_per_word: CallIO0(this, &bytes_per_wordc); break; case POLY_SYS_assign_byte: CallIO3(this, &assign_byte_long_c); break; case POLY_SYS_assign_word: CallIO3(this, &assign_word_long_c); break; // ObjSize and ShowSize are now in the poly_specific functions and // probably should be removed from here. case POLY_SYS_objsize: CallIO1(this, &ObjSize); break; case POLY_SYS_showsize: CallIO1(this, &ShowSize); break; case POLY_SYS_timing_dispatch: CallIO2(this, &timing_dispatch_c); break; case POLY_SYS_XWindows: CallIO1(this, &XWindows_c); break; case POLY_SYS_full_gc: CallIO0(this, &full_gc_c); break; case POLY_SYS_stack_trace: CallIO0(this, & stack_trace_c); break; case POLY_SYS_foreign_dispatch: CallIO2(this, &foreign_dispatch_c); break; case POLY_SYS_ffi: CallIO2(this, &poly_ffi); break; case POLY_SYS_callcode_tupled: CallCodeTupled(); break; case POLY_SYS_process_env: CallIO2(this, &process_env_dispatch_c); break; // case POLY_SYS_set_string_length: CallIO2(this, &set_string_length_c); break; case POLY_SYS_shrink_stack: CallIO1(this, &shrink_stack_c); break; case POLY_SYS_code_flags: CallIO2(this, &CodeSegmentFlags); break; case POLY_SYS_shift_right_arith_word: CallIO2(this, &shift_right_arith_word_c); break; case POLY_SYS_get_first_long_word: case POLY_SYS_int_to_word: // POLY_SYS_int_to_word has generally been replaced by POLY_SYS_get_first_long_word. // The reason is that POLY_SYS_int_to_word may be applied to either a long or // a short argument whereas POLY_SYS_get_first_long_word must be applied to a // long argument and can be implemented very easily in the code-generator, at // least on a little-endian machine. CallIO1(this, &int_to_word_c); break; case POLY_SYS_poly_specific: CallIO2(this, &poly_dispatch_c); break; case POLY_SYS_bytevec_eq: CallIO5(this, &testBytesEqual); break; case POLY_SYS_cmem_load_32: CallIO3(this, &cmem_load_32); break; case POLY_SYS_cmem_load_float: CallIO3(this, &cmem_load_float); break; case POLY_SYS_cmem_load_double: CallIO3(this, &cmem_load_double); break; case POLY_SYS_cmem_store_8: CallIO4(this, &cmem_store_8); break; case POLY_SYS_cmem_store_16: CallIO4(this, &cmem_store_16); break; case POLY_SYS_cmem_store_32: CallIO4(this, &cmem_store_32); break; #if (SIZEOF_VOIDP == 8) case POLY_SYS_cmem_load_64: CallIO3(this, &cmem_load_64); break; case POLY_SYS_cmem_store_64: CallIO4(this, &cmem_store_64); break; #endif case POLY_SYS_cmem_store_float: CallIO4(this, &cmem_store_float); break; case POLY_SYS_cmem_store_double: CallIO4(this, &cmem_store_double); break; case POLY_SYS_set_code_constant: CallIO4(this, &set_code_constant); break; case POLY_SYS_move_bytes: case POLY_SYS_move_bytes_overlap: CallIO5(this, &move_bytes_long_c); break; case POLY_SYS_move_words: case POLY_SYS_move_words_overlap: CallIO5(this, &move_words_long_c); break; case POLY_SYS_mul_word: CallIO2(this, &mul_word_c); break; case POLY_SYS_plus_word: CallIO2(this, &plus_word_c); break; case POLY_SYS_minus_word: CallIO2(this, &minus_word_c); break; case POLY_SYS_div_word: CallIO2(this, &div_word_c); break; case POLY_SYS_mod_word: CallIO2(this, &mod_word_c); break; case POLY_SYS_word_geq: CallIO2(this, &word_geq_c); break; case POLY_SYS_word_leq: CallIO2(this, &word_leq_c); break; case POLY_SYS_word_gtr: CallIO2(this, &word_gtr_c); break; case POLY_SYS_word_lss: CallIO2(this, &word_lss_c); break; case POLY_SYS_io_dispatch: CallIO3(this, &IO_dispatch_c); break; case POLY_SYS_network: CallIO2(this, &Net_dispatch_c); break; case POLY_SYS_os_specific: CallIO2(this, &OS_spec_dispatch_c); break; case POLY_SYS_signal_handler: CallIO2(this, &Sig_dispatch_c); break; case POLY_SYS_kill_self: CallIO0(this, exitThread); break; case POLY_SYS_eq_longword: CallIO2(this, &eqLongWord); break; case POLY_SYS_neq_longword: CallIO2(this, &neqLongWord); break; case POLY_SYS_geq_longword: CallIO2(this, &geqLongWord); break; case POLY_SYS_leq_longword: CallIO2(this, &leqLongWord); break; case POLY_SYS_gt_longword: CallIO2(this, >LongWord); break; case POLY_SYS_lt_longword: CallIO2(this, <LongWord); break; case POLY_SYS_plus_longword: CallIO2(this, &plusLongWord); break; case POLY_SYS_minus_longword: CallIO2(this, &minusLongWord); break; case POLY_SYS_mul_longword: CallIO2(this, &mulLongWord); break; case POLY_SYS_div_longword: CallIO2(this, &divLongWord); break; case POLY_SYS_mod_longword: CallIO2(this, &modLongWord); break; case POLY_SYS_andb_longword: CallIO2(this, &andbLongWord); break; case POLY_SYS_orb_longword: CallIO2(this, &orbLongWord); break; case POLY_SYS_xorb_longword: CallIO2(this, &xorbLongWord); break; case POLY_SYS_shift_left_longword: CallIO2(this, &shiftLeftLongWord); break; case POLY_SYS_shift_right_longword: CallIO2(this, &shiftRightLongWord); break; case POLY_SYS_shift_right_arith_longword: CallIO2(this, &shiftRightArithLongWord); break; case POLY_SYS_longword_to_tagged: CallIO1(this, &longWordToTagged); break; case POLY_SYS_signed_to_longword: CallIO1(this, &signedToLongWord); break; case POLY_SYS_unsigned_to_longword: CallIO1(this, &unsignedToLongWord); break; // This is called from assembly code and doesn't actually have an entry in the // io vector. case POLY_SYS_give_ex_trace_fn: CallIO1(this, exceptionToTraceException); break; default: Crash("Unknown io operation %d\n", ioFunction); } } catch (IOException &) { } } } // Run the current ML process. X86AsmSwitchToPoly saves the C state so that // whenever the ML requires assistance from the rest of the RTS it simply // returns to C with the appropriate values set in memRegisters.requestCode and // int X86TaskData::SwitchToPoly() // (Re)-enter the Poly code from C. Returns with the io function to call or // -1 if we are responding to an interrupt. { Handle mark = this->saveVec.mark(); do { this->saveVec.reset(mark); // Remove old data e.g. from arbitrary precision. SetMemRegisters(); X86AsmSwitchToPoly(&this->memRegisters); SaveMemRegisters(); // Update globals from the memory registers. // Handle any heap/stack overflows or arbitrary precision traps. switch (this->memRegisters.returnReason) { case RETURN_IO_CALL: return this->memRegisters.requestCode; case RETURN_HEAP_OVERFLOW: // The heap has overflowed. Pop the return address into the program counter. // It may well not be a valid code address anyway. PSP_IC(this) = (*(PSP_SP(this))++).AsCodePtr(); this->HeapOverflowTrap(); // Computes a value for allocWords only break; case RETURN_STACK_OVERFLOW: try { // The stack check has failed. This may either be because we really have // overflowed the stack or because the stack limit value has been adjusted // to result in a call here. PSP_IC(this) = (*PSP_SP(this)++).AsCodePtr(); POLYUNSIGNED min_size = this->stack->top - PSP_SP(this) + OVERFLOW_STACK_SIZE; CheckAndGrowStack(this, min_size); } catch (IOException &) { // We may get an exception while handling this if we run out of store } return -1; // We're in a safe state to handle any interrupts. case RETURN_STACK_OVERFLOWEX: try { // Stack limit overflow. If the required stack space is larger than // the fixed overflow size the code will calculate the limit in %EDI. // We need to extract that and the clear that register since it may // very well be outside the stack and therefore a "bad address". PolyWord *stackP = PSP_EDI(this).AsStackAddr(); PSP_EDI(this) = TAGGED(0); PSP_IC(this) = (*PSP_SP(this)++).AsCodePtr(); POLYUNSIGNED min_size = this->stack->top - stackP + OVERFLOW_STACK_SIZE; CheckAndGrowStack(this, min_size); } catch (IOException &) { // We may get an exception while handling this if we run out of store } return -1; // We're in a safe state to handle any interrupts. case RETURN_RAISE_DIV: try { // Generally arithmetic operations don't raise exceptions. Overflow // is either ignored, for Word operations, or results in a call to // the arbitrary precision emulation code. This is the exception // (no pun intended). PSP_IC(this) = (*PSP_SP(this)++).AsCodePtr(); // Set all the registers to a safe value here. We will almost certainly // have shifted a value in one of the registers before testing it for zero. for (POLYUNSIGNED i = 0; i < CHECKED_REGS; i++) { PolyWord *pr = (&this->stack->stack()->p_eax)+i; *pr = TAGGED(0); } raise_exception0(this, EXC_divide); } catch (IOException &) { // Handle the C++ exception. } break; case RETURN_ARB_EMULATION: try { PSP_IC(this) = (*PSP_SP(this)++).AsCodePtr(); this->ArbitraryPrecisionTrap(); } catch (IOException &) { // We may get an exception in the trap handler e.g. if we run out of store. } break; case RETURN_CALLBACK_RETURN: // Remove the extra exception handler we created in EnterCallbackFunction ASSERT(PSP_HR(this) == PSP_SP(this)); PSP_SP(this) += 1; PSP_HR(this) = (*(PSP_SP(this)++)).AsStackAddr(); // Restore the previous handler. this->callBackResult = this->saveVec.push(PSP_EAX(this)); // Argument to return is in EAX. // Restore the registers #ifdef HOSTARCHITECTURE_X86_64 PSP_R10(this) = *PSP_SP(this)++; PSP_R9(this) = *PSP_SP(this)++; PSP_R8(this) = *PSP_SP(this)++; #endif PSP_EBX(this) = *PSP_SP(this)++; PSP_EAX(this) = *PSP_SP(this)++; PSP_EDX(this) = *PSP_SP(this)++; PSP_IC(this) = (*PSP_SP(this)).AsCodePtr(); // Set the return address return -2; case RETURN_CALLBACK_EXCEPTION: // An ML callback has raised an exception. // It isn't possible to do anything here except abort. Crash("An ML function called from foreign code raised an exception. Unable to continue."); default: Crash("Unknown return reason code %u", this->memRegisters.returnReason); } } while (1); } void X86TaskData::InitStackFrame(TaskData *parentTaskData, Handle proc, Handle arg) /* Initialise stack frame. */ { StackSpace *space = this->stack; StackObject * newStack = space->stack(); POLYUNSIGNED stack_size = space->spaceSize(); POLYUNSIGNED topStack = stack_size-3; newStack->p_pc = PC_RETRY_SPECIAL; newStack->p_sp = (PolyWord*)newStack+topStack; this->memRegisters.handlerRegister = (PolyWord*)newStack+topStack+1; /* If this function takes an argument store it in the argument register. */ if (arg == 0) newStack->p_eax = TAGGED(0); else newStack->p_eax = DEREFWORD(arg); newStack->p_ebx = TAGGED(0); newStack->p_ecx = TAGGED(0); newStack->p_edx = DEREFWORDHANDLE(proc); /* rdx - closure pointer */ newStack->p_esi = TAGGED(0); newStack->p_edi = TAGGED(0); #ifdef HOSTARCHITECTURE_X86_64 newStack->p_r8 = TAGGED(0); newStack->p_r9 = TAGGED(0); newStack->p_r10 = TAGGED(0); newStack->p_r11 = TAGGED(0); newStack->p_r12 = TAGGED(0); newStack->p_r13 = TAGGED(0); newStack->p_r14 = TAGGED(0); #endif newStack->p_nUnchecked = UNCHECKED_REGS; // 1 unchecked register plus FP area newStack->p_flags = 0; // Floating point save area. ASSERT(sizeof(struct fpSaveArea) == 108); memset(&newStack->p_fp, 0, 108); // Set the control word for 64-bit precision otherwise we get inconsistent results. newStack->p_fp.cw = 0x027f ; // Control word newStack->p_fp.tw = 0xffff; // Tag registers - all unused /* We initialise the end of the stack with a sequence that will jump to kill_self whether the process ends with a normal return or by raising an exception. A bit of this was added to fix a bug when stacks were objects on the heap and could be scanned by the GC. */ ((PolyWord*)newStack)[topStack+2] = TAGGED(0); // Probably no longer needed // Set the default handler and return address to point to this code. X86TaskData *mdParentTask = (X86TaskData*)parentTaskData; Handle killCode = mdParentTask->BuildKillSelf(); PolyWord killJump = killCode->Word(); // Exception handler. ((PolyWord*)newStack)[topStack+1] = killJump; // Normal return address. We need a separate entry on the stack from // the exception handler because it is possible that the code we are entering // may replace this entry with an argument. The code-generator optimises tail-recursive // calls to functions with more args than the called function. ((PolyWord*)newStack)[topStack] = killJump; } // Build an ML code segment to hold a copy of a piece of code Handle X86TaskData::BuildCodeSegment(const byte *code, unsigned bytes, char functionName) { POLYUNSIGNED codeWords = (bytes + sizeof(PolyWord)-1) / sizeof(PolyWord); POLYUNSIGNED words = codeWords + 6; Handle codeHandle = alloc_and_save(this, words, F_BYTE_OBJ|F_MUTABLE_BIT); byte *cp = codeHandle->Word().AsCodePtr(); memcpy(cp, code, bytes); if (bytes % sizeof(PolyWord) != 0) // Fill unused bytes with NOPs memset(cp+bytes, 0x90, sizeof(PolyWord)- bytes % sizeof(PolyWord)); codeHandle->WordP()->Set(codeWords++, PolyWord::FromUnsigned(0)); // Marker word codeHandle->WordP()->Set(codeWords, PolyWord::FromUnsigned(codeWords*sizeof(PolyWord))); // Bytes to the start codeWords++; codeHandle->WordP()->Set(codeWords++, TAGGED(functionName)); // Name of function codeHandle->WordP()->Set(codeWords++, TAGGED(0)); // Register set codeHandle->WordP()->Set(codeWords++, TAGGED(0)); // No profile counter codeHandle->WordP()->Set(codeWords++, PolyWord::FromUnsigned(3)); // Number of constants CodeSegmentFlags(this, this->saveVec.push(TAGGED(F_CODE_OBJ)), codeHandle); return codeHandle; } // Set up a handler that, if it's called, will print an exception trace. // If the handler isn't called the dummy handler is simply removed. // This is tricky since when we "return" we actually need to run the new // function. void X86TaskData::SetExceptionTrace() { PSP_IC(this) = (*PSP_SP(this)).AsCodePtr(); Handle fun = this->saveVec.push(PSP_EAX(this)); Handle extrace = BuildExceptionTrace(); PolyObject *functToCall = fun->WordP(); PSP_EDX(this) = functToCall; // Closure address // Leave the return address where it is on the stack. PSP_IC(this) = functToCall->Get(0).AsCodePtr(); // First word of closure is entry pt. *(--PSP_SP(this)) = PolyWord::FromStackAddr(PSP_HR(this)); // Handler addresses must be word + 2 byte aligned. // Is that still true or only for the old exception mechanism? *(--PSP_SP(this)) = PolyWord::FromCodePtr(extrace->WordP()->AsBytePtr()+2); PSP_HR(this) = PSP_SP(this); byte *codeAddr = (byte*)&X86AsmRestoreHandlerAfterExceptionTraceTemplate; Handle retCode = BuildCodeSegment(codeAddr, 8 /* Code is 8 bytes */, 'R'); *(--PSP_SP(this)) = retCode->WordP(); // Code for normal return. PSP_EAX(this) = TAGGED(0); // Set the argument of the function to "unit". } // In Solaris-x86 the registers are named EIP and ESP. #if (!defined(REG_EIP) && defined(EIP)) #define REG_EIP EIP #endif #if (!defined(REG_ESP) && defined(ESP)) #define REG_ESP ESP #endif // Get the PC and SP(stack) from a signal context. This is needed for profiling. bool X86TaskData::GetPCandSPFromContext(SIGNALCONTEXT *context, PolyWord * &sp, POLYCODEPTR &pc) { // Check carefully for valid pointers. Because this can be called // at any time some of these may be invalid. if (this->memRegisters.inRTS) { if (this->stack == 0) return false; sp = PSP_SP(this); pc = PSP_IC(this); return true; } if (context == 0) return false; // The tests for HAVE_UCONTEXT_T, HAVE_STRUCT_SIGCONTEXT and HAVE_WINDOWS_H need // to follow the tests in processes.h. #if defined(HAVE_WINDOWS_H) #ifdef _WIN64 sp = (PolyWord *)context->Rsp; pc = (POLYCODEPTR)context->Rip; #else // Windows 32 including cygwin. sp = (PolyWord *)context->Esp; pc = (POLYCODEPTR)context->Eip; #endif #elif defined(HAVE_UCONTEXT_T) #ifdef HAVE_MCONTEXT_T_GREGS // Linux #ifndef HOSTARCHITECTURE_X86_64 pc = (byte*)context->uc_mcontext.gregs[REG_EIP]; sp = (PolyWord*)context->uc_mcontext.gregs[REG_ESP]; #else /* HOSTARCHITECTURE_X86_64 */ pc = (byte*)context->uc_mcontext.gregs[REG_RIP]; sp = (PolyWord*)context->uc_mcontext.gregs[REG_RSP]; #endif /* HOSTARCHITECTURE_X86_64 */ #elif defined(HAVE_MCONTEXT_T_MC_ESP) // FreeBSD #ifndef HOSTARCHITECTURE_X86_64 pc = (byte*)context->uc_mcontext.mc_eip; sp = (PolyWord*)context->uc_mcontext.mc_esp; #else /* HOSTARCHITECTURE_X86_64 */ pc = (byte*)context->uc_mcontext.mc_rip; sp = (PolyWord*)context->uc_mcontext.mc_rsp; #endif /* HOSTARCHITECTURE_X86_64 */ #else // Mac OS X #ifndef HOSTARCHITECTURE_X86_64 #if(defined(HAVE_STRUCT_MCONTEXT_SS)||defined(HAVE_STRUCT___DARWIN_MCONTEXT32_SS)) pc = (byte*)context->uc_mcontext->ss.eip; sp = (PolyWord*)context->uc_mcontext->ss.esp; #elif(defined(HAVE_STRUCT___DARWIN_MCONTEXT32___SS)) pc = (byte*)context->uc_mcontext->__ss.__eip; sp = (PolyWord*)context->uc_mcontext->__ss.__esp; #else return false; #endif #else /* HOSTARCHITECTURE_X86_64 */ #if(defined(HAVE_STRUCT_MCONTEXT_SS)||defined(HAVE_STRUCT___DARWIN_MCONTEXT64_SS)) pc = (byte*)context->uc_mcontext->ss.rip; sp = (PolyWord*)context->uc_mcontext->ss.rsp; #elif(defined(HAVE_STRUCT___DARWIN_MCONTEXT64___SS)) pc = (byte*)context->uc_mcontext->__ss.__rip; sp = (PolyWord*)context->uc_mcontext->__ss.__rsp; #else return false; #endif #endif /* HOSTARCHITECTURE_X86_64 */ #endif #elif defined(HAVE_STRUCT_SIGCONTEXT) #if defined(HOSTARCHITECTURE_X86_64) && defined(__OpenBSD__) // CPP defines missing in amd64/signal.h in OpenBSD pc = (byte*)context->sc_rip; sp = (PolyWord*)context->sc_rsp; #else // !HOSTARCHITEXTURE_X86_64 || !defined(__OpenBSD__) pc = (byte*)context->sc_pc; sp = (PolyWord*)context->sc_sp; #endif #else // Can't get context. return false; #endif // Check the sp value is in the current stack. if (sp >= this->stack->bottom && sp < this->stack->top) return true; else return false; // Bad stack pointer } void X86TaskData::InterruptCode() { // Set the stack limit pointer to the top of the stack to cause // a trap when we next check for stack overflow. // SetMemRegisters actually does this anyway if "pendingInterrupt" is set but // it's safe to do this repeatedly. if (this->stack != 0) this->memRegisters.stackLimit = this->stack->top-1; this->pendingInterrupt = true; } // This is called from SwitchToPoly before we enter the ML code. void X86TaskData::SetMemRegisters() { // Copy the current store limits into variables before we go into the assembly code. // If we haven't yet set the allocation area or we don't have enough we need // to create one (or a new one). if (this->allocPointer <= this->allocLimit + this->allocWords) { if (this->allocPointer < this->allocLimit) Crash ("Bad length in heap overflow trap"); // Find some space to allocate in. Updates taskData->allocPointer and // returns a pointer to the newly allocated space (if allocWords != 0) PolyWord *space = processes->FindAllocationSpace(this, this->allocWords, true); if (space == 0) { // We will now raise an exception instead of returning. // Set allocWords to zero so we don't set the allocation register // since that could be holding the exception packet. this->allocWords = 0; } // Undo the allocation just now. this->allocPointer += this->allocWords; } if (this->allocWords != 0) { // If we have had a heap trap we actually do the allocation here. // We will have already garbage collected and recovered sufficient space. // This also happens if we have just trapped because of store profiling. this->allocPointer -= this->allocWords; // Now allocate // Set the allocation register to this area. if (this->allocReg < 15) *(get_reg(this->allocReg)) = PolyWord::FromStackAddr(this->allocPointer + 1); /* remember: it's off-by-one */ this->allocWords = 0; } // If we have run out of store, either just above or while allocating in the RTS, // allocPointer and allocLimit will have been set to zero as part of the GC. We will // now be raising an exception which may free some store but we need to come back here // before we allocate anything. The compiled code uses unsigned arithmetic to check for // heap overflow but only after subtracting the space required. We need to make sure // that the values are still non-negative after substracting any object size. if (this->allocPointer == 0) this->allocPointer += MAX_OBJECT_SIZE; if (this->allocLimit == 0) this->allocLimit += MAX_OBJECT_SIZE; this->memRegisters.localMbottom = this->allocLimit + 1; this->memRegisters.localMpointer = this->allocPointer + 1; // If we are profiling store allocation we set mem_hl so that a trap // will be generated. if (profileMode == kProfileStoreAllocation) this->memRegisters.localMbottom = this->memRegisters.localMpointer; this->memRegisters.polyStack = this->stack->stack(); // Whenever the ML code enters a function it checks that the stack pointer is above // this value. The default is to set it to the top of the reserved area // but if we've had an interrupt we set it to the end of the stack. // InterruptCode may be called either when the thread is in the RTS or in ML code. if (this->pendingInterrupt) this->memRegisters.stackLimit = this->stack->top - 1; else this->memRegisters.stackLimit = this->stack->bottom + OVERFLOW_STACK_SIZE; this->memRegisters.requestCode = 0; // Clear these because only one will be set. this->memRegisters.returnReason = RETURN_IO_CALL; this->memRegisters.threadId = this->threadObject; // We set the PC to zero to indicate that we should retry the call to the RTS // function. In that case we need to set it back to the code address before we // return. This is also used if we have raised an exception. if (PSP_IC(this) == PC_RETRY_SPECIAL) PSP_IC(this) = PSP_EDX(this).AsObjPtr()->Get(0).AsCodePtr(); } // This is called whenever we have returned from ML to C. void X86TaskData::SaveMemRegisters() { // Check a few items on the stack to see it hasn't been overwritten StackObject *st = this->stack->stack(); if (st->p_nUnchecked != UNCHECKED_REGS) Crash("Stack overwritten\n"); this->allocPointer = this->memRegisters.localMpointer - 1; this->allocWords = 0; // We need to restore all the registers if we are emulating an instruction or // are handling a heap or stack overflow. For the moment we just consider // all cases apart from an RTS call. this->memRegisters.fullRestore = this->memRegisters.returnReason != 0 ? 1 : 0; } PolyWord *X86TaskData::get_reg(int n) /* Returns a pointer to the register given by n. */ { StackObject *stack = x86Stack(this); switch (n) { case 0: return &stack->p_eax; case 1: return &stack->p_ecx; case 2: return &stack->p_edx; case 3: return &stack->p_ebx; case 4: return (PolyWord*)&stack->p_sp; case 6: return &stack->p_esi; case 7: return &stack->p_edi; #ifdef HOSTARCHITECTURE_X86_64 case 8: return &stack->p_r8; case 9: return &stack->p_r9; case 10: return &stack->p_r10; case 11: return &stack->p_r11; case 12: return &stack->p_r12; case 13: return &stack->p_r13; case 14: return &stack->p_r14; // R15 is the heap pointer so shouldn't occur here. #endif /* HOSTARCHITECTURE_X86_64 */ default: Crash("Unknown register %d at %p\n", n, stack->p_pc); } } PolyWord *X86TaskData::getArgument(unsigned int modRm, unsigned int rexPrefix, bool *inConsts) { unsigned int md = modRm >> 6; unsigned int rm = modRm & 7; if (inConsts) *inConsts = false; // Default if (md == 3) // Register return get_reg(rm + (rexPrefix & 0x1)*8); else if (rm == 4) { // s-i-b present. Used for esp and r12 as well as indexing. unsigned int sib = PSP_IC(this)[0]; unsigned int index = (sib >> 3) & 7; unsigned int ss = (sib >> 6) & 3; unsigned int base = sib & 7; PSP_INCR_PC(this, 1); if (md == 0 && base == 5) // This should not occur in either 32 or 64-bit mode. Crash("Immediate address in emulated instruction"); else { int offset = 0; if (md == 1) { // One byte offset offset = PSP_IC(this)[0]; if (offset >= 128) offset -= 256; PSP_INCR_PC(this, 1); } else if (md == 2) { // Four byte offset offset = PSP_IC(this)[3]; if (offset >= 128) offset -= 256; offset = offset*256 + PSP_IC(this)[2]; offset = offset*256 + PSP_IC(this)[1]; offset = offset*256 + PSP_IC(this)[0]; PSP_INCR_PC(this, 4); } if (ss != 0 || index != 4) Crash("Index register present"); byte *ea; if (rexPrefix & 0x1) base += 8; if (base == 4) /* esp */ ea = (byte*)PSP_SP(this) + offset; else ea = get_reg(base)->AsCodePtr()+offset; return (PolyWord*)ea; } } else if (md == 0 && rm == 5) { #ifdef HOSTARCHITECTURE_X86_64 // In 64-bit mode this means PC-relative int offset = PSP_IC(this)[3]; if (offset >= 128) offset -= 256; offset = offset*256 + PSP_IC(this)[2]; offset = offset*256 + PSP_IC(this)[1]; offset = offset*256 + PSP_IC(this)[0]; PSP_INCR_PC(this, 4); if (inConsts) *inConsts = true; return (PolyWord*)(this->stack->stack()->p_pc + offset); #else Crash("Immediate address in emulated instruction"); #endif } else { int offset = 0; if (md == 1) { // One byte offset offset = PSP_IC(this)[0]; if (offset >= 128) offset -= 256; PSP_INCR_PC(this, 1); } else if (md == 2) { // Four byte offset offset = PSP_IC(this)[3]; if (offset >= 128) offset -= 256; offset = offset*256 + PSP_IC(this)[2]; offset = offset*256 + PSP_IC(this)[1]; offset = offset*256 + PSP_IC(this)[0]; PSP_INCR_PC(this, 4); } PolyWord base = *(get_reg(rm + (rexPrefix & 0x1)*8)); byte *ea = base.AsCodePtr() + offset; return (PolyWord*)ea; } } // Called as a result of a heap overflow trap void X86TaskData::HeapOverflowTrap() { X86TaskData *mdTask = this; StackObject *stack = x86Stack(this); POLYUNSIGNED wordsNeeded = 0; // The next instruction, after any branches round forwarding pointers, will // be a store of register containing the adjusted heap pointer. We need to // find that register and the value in it in order to find out how big the // area we actually wanted is. while (stack->p_pc[0] == 0xeb) { if (stack->p_pc[1] >= 128) stack->p_pc += 256 - stack->p_pc[1] + 2; else stack->p_pc += stack->p_pc[1] + 2; } #ifndef HOSTARCHITECTURE_X86_64 // This should be movl REG,0[%ebp]. ASSERT(stack->p_pc[0] == 0x89); mdTask->allocReg = (stack->p_pc[1] >> 3) & 7; // Remember this until we allocate the memory PolyWord *reg = get_reg(mdTask->allocReg); PolyWord reg_val = *reg; // The space we need is the difference between this register // and the current value of newptr. // The +1 here is because memRegisters.localMpointer is A.M.pointer +1. The reason // is that after the allocation we have the register pointing at the address we will // actually use. wordsNeeded = (this->allocPointer - (PolyWord*)reg_val.AsAddress()) + 1; *reg = TAGGED(0); // Clear this - it's not a valid address. /* length in words, including length word */ ASSERT (wordsNeeded <= (1<<24)); /* Max object size including length/flag word is 2^24 words. */ #else /* HOSTARCHITECTURE_X86_64 */ if (stack->p_pc[1] == 0x89) { // New (5.4) format. This should be movq REG,%r15 ASSERT(stack->p_pc[0] == 0x49 || stack->p_pc[0] == 0x4d); mdTask->allocReg = (stack->p_pc[2] >> 3) & 7; // Remember this until we allocate the memory if (stack->p_pc[0] & 0x4) mdTask->allocReg += 8; PolyWord *reg = get_reg(this->allocReg); PolyWord reg_val = *reg; wordsNeeded = (this->allocPointer - (PolyWord*)reg_val.AsAddress()) + 1; *reg = TAGGED(0); // Clear this - it's not a valid address. } else { // Old (pre-5.4) format. // This should be movq Length,-8(%r15) ASSERT(stack->p_pc[0] == 0x49 && stack->p_pc[1] == 0xc7 && stack->p_pc[2] == 0x47 && stack->p_pc[3] == 0xf8); // The Length field should be in the next word. N.B. This assumes that // the length word < 2^31. ASSERT((stack->p_pc[7] & 0x80) == 0); // Should not be negative for (unsigned i = 7; i >= 4; i--) wordsNeeded = (wordsNeeded << 8) | stack->p_pc[i]; wordsNeeded += 1; // That was the object size. We need to add one for the length word. mdTask->allocReg = 15; // Don't put it in a register // The value that ends up in allocSpace->pointer includes the // attempted allocation. Add back the space we tried to allocate this->allocPointer += wordsNeeded; } #endif /* HOSTARCHITECTURE_X86_64 */ if (profileMode == kProfileStoreAllocation) add_count(this, stack->p_pc, stack->p_sp, wordsNeeded); mdTask->allocWords = wordsNeeded; // The actual allocation is done in SetMemRegisters. } /******************************************************************************/ /* */ /* do_compare - do a "long" comparison, setting the flags register */ /* */ /******************************************************************************/ void X86TaskData::do_compare(PolyWord v1, PolyWord v2) { Handle val1, val2; /* Must push these to the save vec. A persistent store trap might cause a garbage collection and move the stack. */ val1 = this->saveVec.push(v1); val2 = this->saveVec.push(v2); int r = compareLong(this, val2, val1); /* Clear the flags. */ POLYUNSIGNED flags = PSP_EFLAGS(this); flags &= -256; if (r == 0) flags |= EFLAGS_ZF; else if (r < 0) flags |= EFLAGS_SF; PSP_EFLAGS(this) = flags; } /******************************************************************************/ /* */ /* do_op - do a "long" operation, setting the destination register */ /* */ /******************************************************************************/ void X86TaskData::do_op(int dest, PolyWord v1, PolyWord v2, Handle (*op)(TaskData *, Handle, Handle)) { Handle val1, val2, result; /* Must push these to the save vec. A persistent store trap or a garbage collection might move the stack. */ val1 = this->saveVec.push(v1); val2 = this->saveVec.push(v2); /* Clobber the destination which may have overflowed. */ *(get_reg(dest)) = TAGGED(0); result = op (this, val2, val1); /* N.B parameters are intentionally reversed */ /* N.B. the stack may have moved so we must recompute get_reg(dest). */ *(get_reg(dest)) = DEREFWORD(result); } // Emulate a long precision operation. // The instruction formats have changed in 5.4 so this supports // both 5.3 and earlier and also 5.4 format. bool X86TaskData::emulate_instrs() { int src1 = -1, src2 = -1, dest = -1; bool doneSubtraction = false; POLYUNSIGNED flagsWord = PSP_EFLAGS(this); PSP_EFLAGS(this) &= ~EFLAGS_OF; // Make sure the overflow flag is clear. while(1) { byte rexPrefix = 0; #ifdef HOSTARCHITECTURE_X86_64 // Get any REX prefix if (PSP_IC(this)[0] >= 0x40 && PSP_IC(this)[0] <= 0x4f) { rexPrefix = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); } #endif /* HOSTARCHITECTURE_X86_64 */ // Decode the register fields and include any REX bits int bbb = PSP_IC(this)[1] & 7; if (rexPrefix & 0x1) bbb += 8; int rrr = (PSP_IC(this)[1] >> 3) & 7; if (rexPrefix & 0x4) rrr += 8; switch (PSP_IC(this)[0]) { case 0x03: { /* add. */ PSP_INCR_PC(this, 1); int modRm = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); bool inConsts = false; PolyWord arg2 = *(getArgument(modRm, rexPrefix, &inConsts)); if (dest == -1 || dest == src1) { // New format. ASSERT(dest == -1 || dest == rrr); // Destination regs should be the same PolyWord *destReg = get_reg(rrr); PolyWord arg1 = *destReg; // We could have come here because of testing the tags, which happens // before the operation, or as a result of adding two tagged values in which // case arg1 will contain the result after the addition. if (flagsWord & EFLAGS_OF) { if (rrr == bbb) { // Same register POLYUNSIGNED arg = arg1.AsUnsigned()/2; // If the carry flag was set the value was originally negative. if (flagsWord & EFLAGS_CF) arg |= (POLYUNSIGNED)1 << (sizeof(POLYUNSIGNED)*8-1); arg1 = arg2 = PolyWord::FromUnsigned(arg); } else arg1 = PolyWord::FromUnsigned(arg1.AsUnsigned() - arg2.AsUnsigned()); // If we have previously subtracted the tag we have to add it back. if (dest != -1) arg1 = PolyWord::FromUnsigned(arg1.AsUnsigned()+1); } // If this is in the 64-bit non-address area it is a constant with the // tag removed. Add it back in. if (inConsts) arg2 = PolyWord::FromUnsigned(arg2.AsUnsigned()+1); do_op(rrr, arg1, arg2, add_longc); // The next operation will subtract the tag. We need to add in a dummy tag.. // This may cause problems with CheckRegion which assumes that every register // contains a valid value. if (! inConsts && dest == -1) { destReg = get_reg(rrr); // May have moved because of a GC. *destReg = PolyWord::FromUnsigned(destReg->AsUnsigned()+1); } } else { // Legacy format if (dest != rrr) Crash("Expected same destination register."); do_op(dest, *(get_reg(src1)), arg2, add_longc); } return true; } case 0x2b: /* Subtraction. */ { PSP_INCR_PC(this, 1); int modRm = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); bool inConsts = false; PolyWord arg2 = *(getArgument(modRm, rexPrefix, &inConsts)); if (dest == -1) { // New format PolyWord *destReg = get_reg(rrr); PolyWord arg1 = *destReg; // We could have come here because of testing the tags, which happens // before the operation, or as a result of subtracting two tagged values in which // case arg1 will contain the result after the subtraction. if (flagsWord & EFLAGS_OF) { arg1 = PolyWord::FromUnsigned(arg1.AsUnsigned() + arg2.AsUnsigned()); } // If this is in the 64-bit non-address area it is a constant with the // tag removed. Add it back in. N.B. In this case we don't have a following // instruction to add the tag. if (inConsts) arg2 = PolyWord::FromUnsigned(arg2.AsUnsigned()+1); do_op(rrr, arg1, arg2, sub_longc); // The next operation will add the tag. We need to subtract a dummy tag.. // This may cause problems with CheckRegion which assumes that every register // contains a valid value. if (! inConsts) { destReg = get_reg(rrr); // May have moved because of a GC. *destReg = PolyWord::FromUnsigned(destReg->AsUnsigned()-1); } return true; } else { // Legacy format if (dest != rrr) Crash("Expected same destination register."); do_op(dest, *(get_reg(src1)), arg2, sub_longc); doneSubtraction = true; break; } } case 0x3b: /* Compare. */ { PSP_INCR_PC(this, 1); int modRm = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); PolyWord arg = *(getArgument(modRm, rexPrefix)); do_compare(*(get_reg(rrr)), arg); return true; } case 0x8d: /* leal - Used to remove a tag before an add and multiply. */ // Also used to put the tag on after a subtraction. if ((PSP_IC(this)[1] & 7) == 4) { // R12 (and RSP but that isn't used here) have to be encoded with a SIB byte. ASSERT((PSP_IC(this)[2] & 7) == 4); // Should be same register PSP_INCR_PC(this, 1); } if (doneSubtraction) { PSP_INCR_PC(this, 3); return true; } if (src1 == -1) src1 = bbb; else src2 = bbb; dest = rrr; ASSERT(PSP_IC(this)[2] == 0xff); PSP_INCR_PC(this, 3); break; case 0x89: /* movl: move source into dest. */ if ((PSP_IC(this)[1] & 0xc0) != 0xc0) Crash("Can't move into store."); dest = bbb; if (src1 == -1) src1 = rrr; else src2 = rrr; PSP_INCR_PC(this, 2); /* Next should be add-immediate. */ break; case 0x83: { /* One byte immediate: Add, sub or compare. */ PSP_INCR_PC(this, 1); int modRm = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); PolyWord arg = *(getArgument(modRm, rexPrefix)); int cval = PSP_IC(this)[0]; if (cval >= 128) cval -= 256; PSP_INCR_PC(this, 1); switch (modRm & (7 << 3)) // This is a code. Ignore any REX override. { case (0 << 3): /* add */ { if (dest != bbb) { // New format: Same register for source and destination. // We didn't have a move instruction before this. // We may come here either because we had an overflow or because we found // that the argument was long. If it was oveflow we will have already // added the value so must substract before we redo the operation // as proper long precision. if (arg.IsTagged()) { arg = PolyWord::FromUnsigned(arg.AsUnsigned() - cval); } // Immediate value is shifted, but hasn't had 1 added; // do this now before calling add_longc do_op(bbb, arg, PolyWord::FromSigned(cval+1), add_longc); } else do_op(dest, *(get_reg(src1)), PolyWord::FromSigned(cval+1), add_longc); break; } case (5 << 3): /* sub */ { if (dest != bbb) { // New format: Same register for source and destination. // We didn't have a move instruction before this. PolyWord arg = *(get_reg(bbb)); if (arg.IsTagged()) arg = PolyWord::FromUnsigned(arg.AsUnsigned() + cval); // Immediate value is shifted, but hasn't had 1 added; // do this now before calling sub_longc do_op(bbb, arg, PolyWord::FromSigned(cval+1), sub_longc); } else do_op(dest, *(get_reg(src1)), PolyWord::FromSigned(cval+1), sub_longc); break; } case (7 << 3): /* cmp */ { /* immediate value is already tagged */ do_compare(arg, PolyWord::FromSigned(cval)); break; } default: Crash("Unknown instruction after overflow trap"); } return true; } case 0x81: { /* 4 byte immediate: Add, sub or compare. */ PSP_INCR_PC(this, 1); int modRm = PSP_IC(this)[0]; PSP_INCR_PC(this, 1); PolyWord arg = *(getArgument(modRm, rexPrefix)); int cval = PSP_IC(this)[3]; if (cval >= 128) cval -= 256; cval = cval*256 + PSP_IC(this)[2]; cval = cval*256 + PSP_IC(this)[1]; cval = cval*256 + PSP_IC(this)[0]; PSP_INCR_PC(this, 4); switch (modRm & (7 << 3)) { case (0 << 3): /* add */ { if (dest != bbb) { // New format: Same register for source and destination. if (arg.IsTagged()) { arg = PolyWord::FromUnsigned(arg.AsUnsigned() - cval); } do_op(bbb, arg, PolyWord::FromSigned(cval+1), add_longc); } else do_op(dest, *(get_reg(src1)), PolyWord::FromSigned(cval+1), add_longc); break; } case (5 << 3): /* sub */ { if (dest != bbb) { // New format: Same register for source and destination. // We didn't have a move instruction before this. if (arg.IsTagged()) arg = PolyWord::FromUnsigned(arg.AsUnsigned() + cval); do_op(bbb, arg, PolyWord::FromSigned(cval+1), sub_longc); } else do_op(dest, *(get_reg(src1)), PolyWord::FromSigned(cval+1), sub_longc); break; } case (7 << 3): /* cmp */ { // Immediate value is already tagged or may be an address. do_compare(arg, PolyWord::FromSigned(cval)); break; } default: Crash("Unknown instruction after overflow trap"); } return true; } case 0xeb: // jmp - used in branch forwarding. // This is used to skip back to the instruction being emulated. if (PSP_IC(this)[1] >= 128) PSP_INCR_PC(this, PSP_IC(this)[1] - 256 + 2); else PSP_INCR_PC(this, PSP_IC(this)[1] + 2); break; case 0x50: /* push eax - used before a multiply. */ #ifdef HOSTARCHITECTURE_X86_64 ASSERT((rexPrefix & 1) == 0); // Check it's not r8 #endif /* HOSTARCHITECTURE_X86_64 */ *(--PSP_SP(this)) = PSP_EAX(this); PSP_INCR_PC(this, 1); break; case 0x52: /* push edx - used before a multiply. */ #ifdef HOSTARCHITECTURE_X86_64 ASSERT((rexPrefix & 1) == 0); // Check it's not r10 #endif /* HOSTARCHITECTURE_X86_64 */ *(--PSP_SP(this)) = PSP_EDX(this); PSP_INCR_PC(this, 1); break; case 0xd1: /* Group1A - must be sar edx before a multiply or sar [esp] before Real.fromInt */ if (PSP_IC(this)[1] == 0xfa) { PSP_INCR_PC(this, 2); /* If we haven't moved anything into edx then edx must be one of the arguments. */ if (src2 == -1) src2 = 2; /* edx. */ } else if (PSP_IC(this)[1] == 0x3c) { PSP_INCR_PC(this, 3); } else Crash("Unknown instruction after overflow trap"); break; case 0xf7: /* Multiply instruction. */ if (PSP_IC(this)[1] != 0xea) Crash("Unknown instruction after overflow trap"); do_op(0 /* eax */, *(get_reg(src1)), *(get_reg(src2)), mult_longc); /* Subtract one because the next instruction will tag it. */ PSP_EAX(this) = PolyWord::FromUnsigned(PSP_EAX(this).AsUnsigned() - 1); PSP_INCR_PC(this, 2); return true; case 0xdb: // Floating point ESCAPE 3 case 0xdf: { StackObject *stack = x86Stack(this); #ifdef HOSTARCHITECTURE_X86_64 if (stack->p_pc[1] != 0x2c || stack->p_pc[2] != 0x24) Crash("Unknown instruction after overflow trap"); #else if (stack->p_pc[1] != 0x04 || stack->p_pc[2] != 0x24) Crash("Unknown instruction after overflow trap"); #endif /* HOSTARCHITECTURE_X86_64 */ // The operand is on the stack. union { double dble; byte bytes[sizeof(double)]; } dValue; dValue.dble = get_C_real(this, stack->p_sp[0]); unsigned top = (stack->p_fp.sw >> 11) & 7; top = (top-1) & 0x7; stack->p_fp.sw = (stack->p_fp.sw & (~0x3800)) | (top << 11); stack->p_fp.tw &= ~(3 << top*2); // Needed? // Push the stack down for (unsigned i = 7; i != 0; i--) memcpy(stack->p_fp.registers[i], stack->p_fp.registers[i-1], sizeof(fpregister)); // Turn the double precision value into extended precision. Because // the double precision has less precision than the extended it will // always fit. The result is always put into the first register which is // the top of the stack. memset(stack->p_fp.registers[0], 0, 10); if (dValue.dble != 0.0) { // Check for zero although that's short so shouldn't occur. // Since we've converted an integer the exp is always +ve // This works correctly for infinity which can occur with large // arbitrary precision numbers e.g. IntInf.pow(10, 309) int exp = ((dValue.bytes[7] & 0x7f) << 4) | (dValue.bytes[6] >> 4); if (exp != 0) exp = exp - 1023+16383; stack->p_fp.registers[0][9] = (exp >> 8) & 0xff; stack->p_fp.registers[0][8] = exp & 0xff; if (dValue.dble < 0) stack->p_fp.registers[0][9] |= 0x80; // Set the sign bit // Mantissa is shifted down by one bit and the top bit is set. unsigned acc = dValue.bytes[6] | (0x80 >> 3); for (int i = 5; i >= 0; i--) { acc = (acc << 8) | dValue.bytes[i]; stack->p_fp.registers[0][i+2] = acc >> 5; } stack->p_fp.registers[0][1] = acc << 3; } PSP_INCR_PC(this, 3); } return true; default: Crash("Unknown instruction after overflow trap"); } } return false; } void X86TaskData::ArbitraryPrecisionTrap() { // Arithmetic operation has overflowed or detected long values. if (profileMode == kProfileEmulation) add_count(this, PSP_IC(this), PSP_SP(this), 1); // Emulate the arbitrary precision instruction. if (! emulate_instrs()) Crash("Arbitrary precision emulation fault at %x\n", PSP_IC(this)); } // These macros build small pieces of assembly code for each io call. // The code simply sets the requestCode value and jumps to // X86AsmSaveStateAndReturn. The address of these code pieces is // stored in iovec. Values in iovec are never looked at with the // garbage collector so that's safe. // N.B. The length of this code (7) is built into BuildKillSelf // It's 7 bytes on both x86 and X86_64. #define MAKE_CALL_SEQUENCE_BYTES 7 void X86Dependent::InitInterfaceVector(void) { for (int i = 0; i < POLY_SYS_vecsize; i++) { if (entryPointVector[i] != 0) add_word_to_io_area(i, PolyWord::FromCodePtr(entryPointVector[i])); } // Entries for special cases. These are generally, but not always, called from // compiled code. heapOverflow = (byte*)&X86AsmCallExtraRETURN_HEAP_OVERFLOW; stackOverflow = (byte*)&X86AsmCallExtraRETURN_STACK_OVERFLOW; stackOverflowEx = (byte*)X86AsmCallExtraRETURN_STACK_OVERFLOWEX; raiseDiv = (byte*)X86AsmCallExtraRETURN_RAISE_DIV; arbEmulation = (byte*)X86AsmCallExtraRETURN_ARB_EMULATION; } // We need the kill-self code in a little function. Handle X86TaskData::BuildKillSelf() { byte *codeAddr = (byte*)&X86AsmKillSelfTemplate; return BuildCodeSegment(codeAddr, MAKE_CALL_SEQUENCE_BYTES, 'K'); } // Similarly for the exception trace code. This is more complicated. // For backwards compatibility we need the address to be on a word + 2 byte // boundary. Handle X86TaskData::BuildExceptionTrace() { byte *codeAddr = (byte*)&X86AsmGiveExceptionTraceFnTemplate; return BuildCodeSegment(codeAddr, 9, 'E'); } void X86TaskData::SetException(poly_exn *exc) // Set up the stack of a process to raise an exception. { PSP_EDX(this) = (PolyObject*)IoEntry(POLY_SYS_raisex); PSP_IC(this) = PC_RETRY_SPECIAL; PSP_EAX(this) = exc; /* put exception data into eax */ } // Call a piece of compiled code. void X86TaskData::CallCodeTupled() { // The eventual return address is on the stack - leave it there. PolyObject *argTuple = PSP_EAX(this).AsObjPtr(); Handle closure = this->saveVec.push(argTuple->Get(0)); Handle argvec = this->saveVec.push(argTuple->Get(1)); if (! IS_INT(DEREFWORD(argvec))) // May be nil if there are no args. { PolyObject *argv = DEREFHANDLE(argvec); POLYUNSIGNED argCount = argv->Length(); // Check we have space for the arguments. This may result in a GC which // in turn may throw a C++ exception. if (argCount > ARGS_IN_REGS) { try { POLYUNSIGNED min_size = this->stack->top - PSP_SP(this) + OVERFLOW_STACK_SIZE + argCount - ARGS_IN_REGS; CheckAndGrowStack(this, min_size); } catch (IOException &) { return; // Will have been set up to raise an exception. } } // First argument is in EAX PSP_EAX(this) = argv->Get(0); // Second arg, if there is one, goes into EBX if (argCount > 1) PSP_EBX(this) = argv->Get(1); #ifdef HOSTARCHITECTURE_X86_64 if (argCount > 2) PSP_R8(this) = argv->Get(2); if (argCount > 3) PSP_R9(this) = argv->Get(3); if (argCount > 4) PSP_R10(this) = argv->Get(4); #endif /* HOSTARCHITECTURE_X86_64 */ // Remaining args go on the stack. PolyWord returnAddress = *PSP_SP(this)++; for (POLYUNSIGNED i = ARGS_IN_REGS; i < argCount; i++) { *(--PSP_SP(this)) = argv->Get(i); } *(--PSP_SP(this)) = returnAddress; } // The closure goes into the closure reg. PSP_EDX(this) = DEREFWORD(closure); // First word of closure is entry point. PSP_IC(this) = (PSP_EDX(this)).AsObjPtr()->Get(0).AsCodePtr(); } // Sets up a callback function on the current stack. The present state is that // the ML code has made a call in to foreign_dispatch. We need to set the stack // up so that we will enter the callback (as with CallCodeTupled) but when we return // the result we enter callback_return. Handle X86TaskData::EnterCallbackFunction(Handle func, Handle args) { // If we ever implement a light version of the FFI that allows a call to C // code without saving enough to allow allocation in C code we need to ensure // that this code doesn't do any allocation. Essentially we need the values // in localMpointer and localMbottom to be valid across a call to C. If we do // a callback the ML callback function would pick up the values saved in the // originating call byte *codeAddr1 = (byte*)&X86AsmCallbackReturnTemplate; byte *codeAddr2 = (byte*)&X86AsmCallbackExceptionTemplate; Handle callBackReturn = this->BuildCodeSegment(codeAddr1, MAKE_CALL_SEQUENCE_BYTES, 'C'); Handle callBackException = this->BuildCodeSegment(codeAddr2, MAKE_CALL_SEQUENCE_BYTES, 'X'); // Save the closure pointer and argument registers to the stack. If we have to // retry the current RTS call we need these to have their original values. // TODO: Is that really required any longer? We don't retry RTS calls now. *(--PSP_SP(this)) = PSP_EDX(this); *(--PSP_SP(this)) = PSP_EAX(this); *(--PSP_SP(this)) = PSP_EBX(this); #ifdef HOSTARCHITECTURE_X86_64 *(--PSP_SP(this)) = PSP_R8(this); *(--PSP_SP(this)) = PSP_R9(this); *(--PSP_SP(this)) = PSP_R10(this); #endif // Set up an exception handler so we will enter callBackException if there is an exception. *(--PSP_SP(this)) = PolyWord::FromStackAddr(PSP_HR(this)); // Create a special handler entry *(--PSP_SP(this)) = callBackException->Word(); PSP_HR(this) = PSP_SP(this); // Push the call to callBackReturn onto the stack as the return address. *(--PSP_SP(this)) = callBackReturn->Word(); // Set up the entry point of the callback. PolyObject *functToCall = func->WordP(); PSP_EDX(this) = functToCall; // Closure address PSP_EAX(this) = args->Word(); PSP_IC(this) = functToCall->Get(0).AsCodePtr(); // First word of closure is entry pt. return EnterPolyCode(); } // Decode and process an effective address. There may // be a constant address in here but in any case we need // to decode it to work out where the next instruction starts. // If this is an lea instruction any addresses are just constants // so must not be treated as addresses. static void skipea(byte **pt, ScanAddress *process, bool lea) { unsigned int modrm = *((*pt)++); unsigned int md = modrm >> 6; unsigned int rm = modrm & 7; if (md == 3) { } /* Register. */ else if (rm == 4) { /* s-i-b present. */ unsigned int sib = *((*pt)++); if (md == 0) { if ((sib & 7) == 5) { if (! lea) { #ifndef HOSTARCHITECTURE_X86_64 process->ScanConstant(*pt, PROCESS_RELOC_DIRECT); #endif /* HOSTARCHITECTURE_X86_64 */ } (*pt) += 4; } } else if (md == 1) (*pt)++; else if (md == 2) (*pt) += 4; } else if (md == 0 && rm == 5) { if (!lea) { #ifndef HOSTARCHITECTURE_X86_64 /* Absolute address. */ process->ScanConstant(*pt, PROCESS_RELOC_DIRECT); #endif /* HOSTARCHITECTURE_X86_64 */ } *pt += 4; } else { if (md == 1) *pt += 1; else if (md == 2) *pt += 4; } } /* Added to deal with constants within the code rather than in the constant area. The constant area is still needed for the function name. DCJM 2/1/2001 */ void X86Dependent::ScanConstantsWithinCode(PolyObject *addr, PolyObject *old, POLYUNSIGNED length, ScanAddress *process) { byte *pt = (byte*)addr; PolyWord *end = addr->Offset(length - 1); while (true) { // We've finished when this is word aligned and points to a zero word. if (((POLYUNSIGNED)pt & (0-sizeof(POLYUNSIGNED))) && ((PolyWord*)pt)->AsUnsigned() == 0) break; #ifdef HOSTARCHITECTURE_X86_64 // REX prefixes. Set this first. byte lastRex; if (*pt >= 0x40 && *pt <= 0x4f) lastRex = *pt++; else lastRex = 0; //printf("pt=%p *pt=%x\n", pt, *pt); #endif /* HOSTARCHITECTURE_X86_64 */ switch (*pt) { case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: /* Push */ case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: /* Pop */ case 0x90: /* nop */ case 0xc3: /* ret */ case 0xf9: /* stc */ case 0xce: /* into */ case 0xf0: /* lock. */ case 0xf3: /* rep/repe */ case 0xa4: case 0xa5: case 0xaa: case 0xab: /* movs/stos */ case 0xa6: /* cmpsb */ case 0x9e: /* sahf */ pt++; break; case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x7c: case 0x7d: case 0x7e: case 0x7f: case 0xeb: /* short jumps. */ case 0xcd: /* INT */ case 0xa8: /* TEST_ACC8 */ case 0x6a: /* PUSH_8 */ pt += 2; break; case 0xc2: /* RET_16 */ pt += 3; break; case 0x8d: /* leal. */ pt++; skipea(&pt, process, true); break; case 0x03: case 0x0b: case 0x13: case 0x1b: case 0x23: case 0x2b: case 0x33: case 0x3b: /* Add r,ea etc. */ case 0x88: /* MOVB_R_A */ case 0x89: /* MOVL_R_A */ case 0x8b: /* MOVL_A_R */ case 0x62: /* BOUNDL */ case 0xff: /* Group5 */ case 0xd1: /* Group2_1_A */ case 0x8f: /* POP_A */ case 0xd3: /* Group2_CL_A */ case 0x87: // XCHNG pt++; skipea(&pt, process, false); break; case 0xf6: /* Group3_a */ { int isTest = 0; pt++; /* The test instruction has an immediate operand. */ if ((*pt & 0x38) == 0) isTest = 1; skipea(&pt, process, false); if (isTest) pt++; break; } case 0xf7: /* Group3_A */ { int isTest = 0; pt++; /* The test instruction has an immediate operand. */ if ((*pt & 0x38) == 0) isTest = 1; skipea(&pt, process, false); if (isTest) pt += 4; break; } case 0xc1: /* Group2_8_A */ case 0xc6: /* MOVB_8_A */ case 0x83: /* Group1_8_A */ case 0x80: /* Group1_8_a */ pt++; skipea(&pt, process, false); pt++; break; case 0x81: /* Group1_32_A */ { pt ++; #ifndef HOSTARCHITECTURE_X86_64 unsigned opCode = *pt; #endif /* HOSTARCHITECTURE_X86_64 */ skipea(&pt, process, false); // Only check the 32 bit constant if this is a comparison. // For other operations this may be untagged and shouldn't be an address. #ifndef HOSTARCHITECTURE_X86_64 if ((opCode & 0x38) == 0x38) process->ScanConstant(pt, PROCESS_RELOC_DIRECT); #endif /* HOSTARCHITECTURE_X86_64 */ pt += 4; break; } case 0xe8: case 0xe9: // Long jump and call. These are used to call constant (known) functions // and also long jumps within the function. { pt++; POLYSIGNED disp = (pt[3] & 0x80) ? -1 : 0; // Set the sign just in case. for(unsigned i = 4; i > 0; i--) disp = (disp << 8) | pt[i-1]; byte *absAddr = pt + disp + 4; // The address is relative to AFTER the constant // If the new address is within the current piece of code we don't do anything if (absAddr >= (byte*)addr && absAddr < (byte*)end) {} else { #ifdef HOSTARCHITECTURE_X86_64 ASSERT(sizeof(PolyWord) == 4); // Should only be used internally on x64 #endif /* HOSTARCHITECTURE_X86_64 */ if (addr != old) { // The old value of the displacement was relative to the old address before // we copied this code segment. // We have to correct it back to the original address. absAddr = absAddr - (byte*)addr + (byte*)old; // We have to correct the displacement for the new location and store // that away before we call ScanConstant. POLYSIGNED newDisp = absAddr - pt - 4; for (unsigned i = 0; i < 4; i++) { pt[i] = (byte)(newDisp & 0xff); newDisp >>= 8; } } process->ScanConstant(pt, PROCESS_RELOC_I386RELATIVE); } pt += 4; break; } case 0xc7:/* MOVL_32_A */ { pt++; if ((*pt & 0xc0) == 0x40 /* Byte offset or sib present */ && ((*pt & 7) != 4) /* But not sib present */ && pt[1] == 256-sizeof(PolyWord)) { /* We may use a move instruction to set the length word on a new segment. We mustn't try to treat this as a constant. */ pt += 6; /* Skip the modrm byte, the offset and the constant. */ } else { skipea(&pt, process, false); #ifndef HOSTARCHITECTURE_X86_64 process->ScanConstant(pt, PROCESS_RELOC_DIRECT); #endif /* HOSTARCHITECTURE_X86_64 */ pt += 4; } break; } case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: /* MOVL_32_64_R */ pt ++; #ifdef HOSTARCHITECTURE_X86_64 if ((lastRex & 8) == 0) pt += 4; // 32-bit mode on 64-bits. Can this occur? else #endif /* HOSTARCHITECTURE_X86_64 */ { // 32 bits in 32-bit mode, 64-bits in 64-bit mode. process->ScanConstant(pt, PROCESS_RELOC_DIRECT); pt += sizeof(PolyWord); } break; case 0x68: /* PUSH_32 */ pt ++; #ifndef HOSTARCHITECTURE_X86_64 process->ScanConstant(pt, PROCESS_RELOC_DIRECT); #endif /* HOSTARCHITECTURE_X86_64 */ pt += 4; break; case 0x0f: /* ESCAPE */ { pt++; switch (*pt) { case 0xb6: /* movzl */ case 0xc1: /* xaddl */ pt++; skipea(&pt, process, false); break; case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: /* Conditional branches with 32-bit displacement. */ pt += 5; break; default: Crash("Unknown opcode %d at %p\n", *pt, pt); } break; } case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: // Floating point escape instructions { pt++; if ((*pt & 0xe0) == 0xe0) pt++; else skipea(&pt, process, false); break; } default: Crash("Unknown opcode %d at %p\n", *pt, pt); } } } int X86TaskData::GetIOFunctionRegisterMask(int ioCall) { return registerMaskVector[ioCall]; } // Increment the value contained in the first word of the mutex. Handle X86TaskData::AtomicIncrement(Handle mutexp) { PolyObject *p = DEREFHANDLE(mutexp); POLYUNSIGNED result = X86AsmAtomicIncrement(p); return this->saveVec.push(PolyWord::FromUnsigned(result)); } // Decrement the value contained in the first word of the mutex. Handle X86TaskData::AtomicDecrement(Handle mutexp) { PolyObject *p = DEREFHANDLE(mutexp); POLYUNSIGNED result = X86AsmAtomicDecrement(p); return this->saveVec.push(PolyWord::FromUnsigned(result)); } // Release a mutex. Because the atomic increment and decrement // use the hardware LOCK prefix we can simply set this to one. void X86TaskData::AtomicReset(Handle mutexp) { DEREFHANDLE(mutexp)->Set(0, TAGGED(1)); } static X86Dependent x86Dependent; MachineDependent *machineDependent = &x86Dependent; polyml-5.6/libpolyml/x86asm.asm000066400000000000000000003210741265146633400165540ustar00rootroot00000000000000;# ;# Title: Assembly code routines for the poly system. ;# Author: David Matthews ;# Copyright (c) Cambridge University Technical Services Limited 2000 ;# Further development David C. J. Matthews 2000-2015 ;# ;# This library is free software; you can redistribute it and/or ;# modify it under the terms of the GNU Lesser General Public ;# License version 2.1 as published by the Free Software Foundation. ;# ;# This library is distributed in the hope that it will be useful, ;# but WITHOUT ANY WARRANTY; without even the implied warranty of ;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;# Lesser General Public License for more details. ;# ;# You should have received a copy of the GNU Lesser General Public ;# License along with this library; if not, write to the Free Software ;# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ;# ;# ;# ;# ;# ********************************************************************* ;# * IMPORTANT * ;# * This file is used directly by MASM but is also converted * ;# * for use by gas on Unix. For reasons best known to the respective * ;# * developers the assembly language accepted by gas is different * ;# * from that used by MASM. This file uses a sort of half-way house * ;# * between the two versions in that the gas instruction ordering is * ;# * used i.e. the first argument is the source and the second the * ;# * destination, but the MASM format of addresses is used. * ;# * After making any changes to this file ensure that it can be * ;# * successfully converted and compiled under both MASM and gas. * ;# * DCJM January 2000 * ;# ********************************************************************* ;# ;# Registers used :- ;# ;# %Reax: First argument to function. Result of function call. ;# %Rebx: Second argument to function. ;# %Recx: General register ;# %Redx: Closure pointer in call. ;# %Rebp: Points to memory used for extra registers ;# %Resi: General register. ;# %Redi: General register. ;# %Resp: Stack pointer. ;# X86_64 Additional registers ;# %R8: Third argument to function ;# %R9: Fourth argument to function ;# %R10: Fifth argument to function ;# %R11: General register ;# %R12: General register ;# %R13: General register ;# %R14: General register ;# %R15: Memory allocation pointer IFDEF WINDOWS IFNDEF HOSTARCHITECTURE_X86_64 .486 .model flat,c ENDIF ;# No name munging needed in MASM EXTNAME TEXTEQU <> ;# CALLMACRO is used to indicate to the converter that we have a macro ;# since macros have to be converted into C preprocessor macros. CALLMACRO TEXTEQU <> IFNDEF HOSTARCHITECTURE_X86_64 Reax TEXTEQU Rebx TEXTEQU Recx TEXTEQU Redx TEXTEQU Resi TEXTEQU Redi TEXTEQU Resp TEXTEQU Rebp TEXTEQU ELSE Reax TEXTEQU Rebx TEXTEQU Recx TEXTEQU Redx TEXTEQU Resi TEXTEQU Redi TEXTEQU Resp TEXTEQU Rebp TEXTEQU ENDIF R_cl TEXTEQU R_bl TEXTEQU R_al TEXTEQU R_ax TEXTEQU CONST TEXTEQU <> ;# gas-style instructions ;# These are the reverse order from MASM. MOVL MACRO f,t mov t,f ENDM MOVB MACRO f,t mov t,f ENDM ADDL MACRO f,t add t,f ENDM SUBL MACRO f,t sub t,f ENDM XORL MACRO f,t xor t,f ENDM ORL MACRO f,t or t,f ENDM ANDL MACRO f,t and t,f ENDM CMPL MACRO f,t cmp t,f ENDM CMPB MACRO f,t cmp t,f ENDM LEAL MACRO f,t lea t,f ENDM SHRL MACRO f,t shr t,f ENDM SARL MACRO f,t sar t,f ENDM SHLL MACRO f,t shl t,f ENDM TESTL MACRO f,t test t,f ENDM IMULL MACRO f,t imul t,f ENDM LOCKXADDL MACRO f,t lock xadd t,f ENDM MULL TEXTEQU NEGL TEXTEQU PUSHL TEXTEQU POPL TEXTEQU IFDEF HOSTARCHITECTURE_X86_64 POPFL TEXTEQU PUSHFL TEXTEQU PUSHAL TEXTEQU POPAL TEXTEQU FULLWORD TEXTEQU ;# Return instructions - all in registers in x86-64 RET0 TEXTEQU RET1 TEXTEQU RET2 TEXTEQU RET3 TEXTEQU RET4 TEXTEQU RET5 TEXTEQU ELSE POPFL TEXTEQU PUSHFL TEXTEQU PUSHAL TEXTEQU POPAL TEXTEQU FULLWORD TEXTEQU ;# Return instructions - First two values in registers, remainder on the stack RET0 TEXTEQU RET1 TEXTEQU RET2 TEXTEQU RET3 TEXTEQU RET4 TEXTEQU RET5 TEXTEQU ENDIF INCL TEXTEQU ELSE #include "config.h" #if defined __MINGW64__ # if defined POLY_LINKAGE_PREFIX # define EXTNAME(x) POLY_LINKAGE_PREFIX ## x # else # define EXTNAME(x) x # endif ;# External names in older versions of FreeBSD have a leading underscore. #elif ! defined(__ELF__) #define EXTNAME(x) _##x #else #define EXTNAME(x) x #endif IFNDEF HOSTARCHITECTURE_X86_64 #define Reax %eax #define Rebx %ebx #define Recx %ecx #define Redx %edx #define Resi %esi #define Redi %edi #define Resp %esp #define Rebp %ebp ELSE #define Reax %rax #define Rebx %rbx #define Recx %rcx #define Redx %rdx #define Resi %rsi #define Redi %rdi #define Resp %rsp #define Rebp %rbp ENDIF #define R_al %al #define R_cl %cl #define R_bl %bl #define R_ax %ax IFDEF HOSTARCHITECTURE_X86_64 #define R8 %r8 #define R9 %r9 #define R10 %r10 #define R11 %r11 #define R12 %r12 #define R13 %r13 #define R14 %r14 #define R15 %r15 ENDIF #define CONST $ #define END IFDEF HOSTARCHITECTURE_X86_64 #define MOVL movq #define MOVB movb #define ADDL addq #define SUBL subq #define XORL xorq #define ORL orq #define ANDL andq #define CMPL cmpq #define CMPB cmpb #define LEAL leaq #define SHRL shrq #define SARL sarq #define SHLL shlq #define TESTL testq #define IMULL imulq #define MULL mulq #define DIVL divl #define NEGL negq #define PUSHL pushq #define POPL popq #define POPFL popfq #define PUSHFL pushfq #define PUSHAL pushaq #define POPAL popaq #define LOCKXADDL lock xaddq ;# Return instructions for n arguments. All these are in registers #define RET0 ret #define RET1 ret #define RET2 ret #define RET3 ret #define RET4 ret #define RET5 ret ELSE #define MOVL movl #define MOVB movb #define ADDL addl #define SUBL subl #define XORL xorl #define ORL orl #define ANDL andl #define CMPL cmpl #define CMPB cmpb #define LEAL leal #define SHRL shrl #define SARL sarl #define SHLL shll #define TESTL testl #define IMULL imull #define MULL mull #define DIVL divl #define NEGL negl #define PUSHL pushl #define POPL popl #define POPFL popfl #define PUSHFL pushfl #define PUSHAL pushal #define POPAL popal ;# Older versions of GCC require a semicolon here. #define LOCKXADDL lock; xaddl ;# Return instructions for n arguments. #define RET0 ret #define RET1 ret #define RET2 ret #define RET3 ret $4 #define RET4 ret $8 #define RET5 ret $12 ENDIF ENDIF ;# Register mask entries - must match coding used in I386CODECONS.ML IFDEF WINDOWS M_Reax EQU 000001H M_Recx EQU 000002H M_Redx EQU 000004H M_Rebx EQU 000008H M_Resi EQU 000010H M_Redi EQU 000020H IFDEF HOSTARCHITECTURE_X86_64 M_R8 EQU 64 M_R9 EQU 128 M_R10 EQU 256 M_R11 EQU 512 M_R12 EQU 1024 M_R13 EQU 2048 M_R14 EQU 4096 ENDIF M_FP0 EQU 002000H M_FP1 EQU 004000H M_FP2 EQU 008000H M_FP3 EQU 010000H M_FP4 EQU 020000H M_FP5 EQU 040000H M_FP6 EQU 080000H M_FP7 EQU 100000H Mask_all EQU 1FFFFFH ;# Set the register mask entry RegMask MACRO name,mask Mname TEXTEQU %Mname EQU mask ENDM ELSE ;# Register mask entries - must match coding used in I386CODECONS.ML #define M_Reax 0x000001 #define M_Recx 0x000002 #define M_Redx 0x000004 #define M_Rebx 0x000008 #define M_Resi 0x000010 #define M_Redi 0x000020 IFDEF HOSTARCHITECTURE_X86_64 #define M_R8 64 #define M_R9 128 #define M_R10 256 #define M_R11 512 #define M_R12 1024 #define M_R13 2048 #define M_R14 4096 ENDIF ;# Floating point registers. #define M_FP0 0x002000 #define M_FP1 0x004000 #define M_FP2 0x008000 #define M_FP3 0x010000 #define M_FP4 0x020000 #define M_FP5 0x040000 #define M_FP6 0x080000 #define M_FP7 0x100000 #define Mask_all 0x1FFFFF #define RegMask(name,mask) \ .set Mask_##name, mask #define OR | ENDIF ;# ;# Macro to begin the hand-coded functions ;# IFDEF WINDOWS INLINE_ROUTINE MACRO id PUBLIC id id: ENDM ELSE IFDEF MACOSX #define GLOBAL .globl ELSE #define GLOBAL .global ENDIF #define INLINE_ROUTINE(id) \ GLOBAL EXTNAME(id); \ EXTNAME(id): ENDIF IFDEF WINDOWS ;# ;# Tagged values. A few operations, such as shift assume that the tag bit ;# is the bottom bit. ;# TAG EQU 1 TAGSHIFT EQU 1 TAGMULT EQU 2 TAGGED MACRO i LOCAL t t TEXTEQU EXITM %t ENDM MAKETAGGED MACRO f,t lea t,1[f*2] ENDM IFDEF HOSTARCHITECTURE_X86_64 POLYWORDSIZE EQU 8 ELSE POLYWORDSIZE EQU 4 ENDIF ELSE .set TAG, 1 .set TAGSHIFT, 1 .set TAGMULT, (1 << TAGSHIFT) #define TAGGED(i) ((i << TAGSHIFT) | TAG) #define MAKETAGGED(from,to) LEAL TAG(,from,2),to IFDEF HOSTARCHITECTURE_X86_64 .set POLYWORDSIZE, 8 ELSE .set POLYWORDSIZE, 4 ENDIF ENDIF IFDEF WINDOWS NIL TEXTEQU TAGGED(0) UNIT TEXTEQU TAGGED(0) ZERO TEXTEQU TAGGED(0) FALSE TEXTEQU TAGGED(0) TRUE TEXTEQU TAGGED(1) MINUS1 TEXTEQU TAGGED(0-1) B_bytes EQU 01h B_mutablebytes EQU 41h B_mutable EQU 40h IFNDEF HOSTARCHITECTURE_X86_64 Max_Length EQU 00ffffffh ELSE Max_Length EQU 00ffffffffffffffh ENDIF ELSE .set NIL, TAGGED(0) .set UNIT, TAGGED(0) .set ZERO, TAGGED(0) .set FALSE, TAGGED(0) .set TRUE, TAGGED(1) .set MINUS1, TAGGED(0-1) .set B_bytes, 0x01 .set B_mutable, 0x40 .set B_mutablebytes, 0x41 IFNDEF HOSTARCHITECTURE_X86_64 .set Max_Length, 0x00ffffff ELSE .set Max_Length, 0x00ffffffffffffff ENDIF ENDIF ;# The "memory registers" are pointed to by Rebp within the ML code ;# The first few offsets are built into the compiled code. ;# All the offsets are built into x86_dep.c . IFDEF WINDOWS LocalMpointer EQU 0 IFNDEF HOSTARCHITECTURE_X86_64 HandlerRegister EQU 4 LocalMbottom EQU 8 RequestCode EQU 20 ;# Byte: Io function to call. InRTS EQU 21 ;# Byte: Set when in the RTS ReturnReason EQU 22 ;# Byte: Reason for returning from ML. FullRestore EQU 23 ;# Byte: Full/partial restore PolyStack EQU 24 ;# Current stack base SavedSp EQU 28 ;# Saved stack pointer IOEntryPoint EQU 48 ;# IO call RaiseDiv EQU 52 ;# Call to raise the Div exception ArbEmulation EQU 56 ;# Arbitrary precision emulation ThreadId EQU 60 ;# My thread id RealTemp EQU 64 ;# Space for int-real conversions ELSE HandlerRegister EQU 8 LocalMbottom EQU 16 StackLimit EQU 24 ;# Lower limit of stack RequestCode EQU 40 ;# Byte: Io function to call. InRTS EQU 41 ;# Byte: Set when in the RTS ReturnReason EQU 42 ;# Byte: Reason for returning from ML. FullRestore EQU 43 ;# Byte: Full/partial restore PolyStack EQU 48 ;# Current stack base SavedSp EQU 56 ;# Saved stack pointer HeapOverflow EQU 64 ;# Heap overflow code StackOverflow EQU 72 ;# Stack overflow code StackOverflowEx EQU 80 ;# Stack overflow code (for EDI) RaiseExEntry EQU 88 ;# Raise exception IOEntryPoint EQU 96 ;# IO call RaiseDiv EQU 104 ;# Exception trace ArbEmulation EQU 112 ;# Arbitrary precision emulation ThreadId EQU 120 ;# My thread id RealTemp EQU 128 ;# Space for int-real conversions ENDIF ELSE .set LocalMpointer,0 IFNDEF HOSTARCHITECTURE_X86_64 .set HandlerRegister,4 .set LocalMbottom,8 .set RequestCode,20 .set InRTS,21 .set ReturnReason,22 .set FullRestore,23 .set PolyStack,24 .set SavedSp,28 .set IOEntryPoint,48 .set RaiseDiv,52 .set ArbEmulation,56 .set ThreadId,60 .set RealTemp,64 ELSE .set HandlerRegister,8 .set LocalMbottom,16 .set StackLimit,24 .set RequestCode,40 .set InRTS,41 .set ReturnReason,42 .set FullRestore,43 .set PolyStack,48 .set SavedSp,56 .set HeapOverflow,64 .set StackOverflow,72 .set StackOverflowEx,80 .set RaiseExEntry,88 .set IOEntryPoint,96 .set RaiseDiv,104 .set ArbEmulation,112 .set ThreadId,120 .set RealTemp,128 ENDIF ENDIF ;# IO function numbers. These are functions that are called ;# to handle special cases in this code IFDEF WINDOWS POLY_SYS_exit EQU 1 POLY_SYS_chdir EQU 9 POLY_SYS_alloc_store EQU 11 POLY_SYS_get_flags EQU 17 POLY_SYS_exception_trace_fn EQU 32 POLY_SYS_give_ex_trace_fn EQU 33 POLY_SYS_network EQU 51 POLY_SYS_os_specific EQU 52 POLY_SYS_io_dispatch EQU 61 POLY_SYS_signal_handler EQU 62 POLY_SYS_thread_dispatch EQU 73 POLY_SYS_plus_longword EQU 74 POLY_SYS_minus_longword EQU 75 POLY_SYS_mul_longword EQU 76 POLY_SYS_div_longword EQU 77 POLY_SYS_mod_longword EQU 78 POLY_SYS_andb_longword EQU 79 POLY_SYS_orb_longword EQU 80 POLY_SYS_xorb_longword EQU 81 POLY_SYS_kill_self EQU 84 POLY_SYS_shift_left_longword EQU 85 POLY_SYS_shift_right_longword EQU 86 POLY_SYS_shift_right_arith_longword EQU 87 POLY_SYS_profiler EQU 88 POLY_SYS_signed_to_longword EQU 90 POLY_SYS_unsigned_to_longword EQU 91 POLY_SYS_full_gc EQU 92 POLY_SYS_stack_trace EQU 93 POLY_SYS_timing_dispatch EQU 94 POLY_SYS_objsize EQU 99 POLY_SYS_showsize EQU 100 POLY_SYS_quotrem EQU 104 POLY_SYS_aplus EQU 106 POLY_SYS_aminus EQU 107 POLY_SYS_amul EQU 108 POLY_SYS_adiv EQU 109 POLY_SYS_amod EQU 110 POLY_SYS_aneg EQU 111 POLY_SYS_xora EQU 112 POLY_SYS_equala EQU 113 POLY_SYS_ora EQU 114 POLY_SYS_anda EQU 115 POLY_SYS_Real_str EQU 117 POLY_SYS_Real_geq EQU 118 POLY_SYS_Real_leq EQU 119 POLY_SYS_Real_gtr EQU 120 POLY_SYS_Real_lss EQU 121 POLY_SYS_Real_eq EQU 122 POLY_SYS_Real_neq EQU 123 POLY_SYS_Real_Dispatch EQU 124 POLY_SYS_Add_real EQU 125 POLY_SYS_Sub_real EQU 126 POLY_SYS_Mul_real EQU 127 POLY_SYS_Div_real EQU 128 POLY_SYS_Abs_real EQU 129 POLY_SYS_Neg_real EQU 130 POLY_SYS_conv_real EQU 133 POLY_SYS_real_to_int EQU 134 POLY_SYS_int_to_real EQU 135 POLY_SYS_sqrt_real EQU 136 POLY_SYS_sin_real EQU 137 POLY_SYS_cos_real EQU 138 POLY_SYS_arctan_real EQU 139 POLY_SYS_exp_real EQU 140 POLY_SYS_ln_real EQU 141 POLY_SYS_process_env EQU 150 POLY_SYS_poly_specific EQU 153 ;# Define these for the moment. POLY_SYS_cmem_load_32 EQU 162 POLY_SYS_cmem_load_64 EQU 163 POLY_SYS_cmem_load_float EQU 164 POLY_SYS_cmem_load_double EQU 165 POLY_SYS_cmem_store_32 EQU 168 POLY_SYS_cmem_store_64 EQU 169 POLY_SYS_cmem_store_float EQU 170 POLY_SYS_cmem_store_double EQU 171 POLY_SYS_io_operation EQU 189 POLY_SYS_ffi EQU 190 POLY_SYS_set_code_constant EQU 194 POLY_SYS_code_flags EQU 200 POLY_SYS_shrink_stack EQU 201 POLY_SYS_callcode_tupled EQU 204 POLY_SYS_foreign_dispatch EQU 205 POLY_SYS_XWindows EQU 209 POLY_SYS_int_geq EQU 231 POLY_SYS_int_leq EQU 232 POLY_SYS_int_gtr EQU 233 POLY_SYS_int_lss EQU 234 RETURN_HEAP_OVERFLOW EQU 1 RETURN_STACK_OVERFLOW EQU 2 RETURN_STACK_OVERFLOWEX EQU 3 RETURN_RAISE_DIV EQU 4 RETURN_ARB_EMULATION EQU 5 RETURN_CALLBACK_RETURN EQU 6 RETURN_CALLBACK_EXCEPTION EQU 7 ELSE #include "sys.h" #define RETURN_HEAP_OVERFLOW 1 #define RETURN_STACK_OVERFLOW 2 #define RETURN_STACK_OVERFLOWEX 3 #define RETURN_RAISE_DIV 4 #define RETURN_ARB_EMULATION 5 #define RETURN_CALLBACK_RETURN 6 #define RETURN_CALLBACK_EXCEPTION 7 ENDIF ;# ;# Stack format from objects.h is: ;# typedef struct ;# { byte offset of start ;# word p_space ; 0 -- Now unused - remove ;# byte *p_pc ; 4 ;# word *p_sp ; 8 -- Now unused - remove ;# word *p_hr ; 12 ;# word p_nreg ; 16 -- Now unused - remove ;# word p_reg[1] ; 20 ;# } StackObject ; ;# ;# ;# Starting offsets IFDEF WINDOWS IFNDEF HOSTARCHITECTURE_X86_64 PC_OFF EQU 4 SP_OFF EQU 8 EAX_OFF EQU 20 EBX_OFF EQU 24 ECX_OFF EQU 28 EDX_OFF EQU 32 ESI_OFF EQU 36 EDI_OFF EQU 40 FLAGS_OFF EQU 48 FPREGS_OFF EQU 52 ELSE PC_OFF EQU 8 SP_OFF EQU 16 EAX_OFF EQU 40 EBX_OFF EQU 48 ECX_OFF EQU 56 EDX_OFF EQU 64 ESI_OFF EQU 72 EDI_OFF EQU 80 R8_OFF EQU 88 R9_OFF EQU 96 R10_OFF EQU 104 R11_OFF EQU 112 R12_OFF EQU 120 R13_OFF EQU 128 R14_OFF EQU 136 FLAGS_OFF EQU 152 FPREGS_OFF EQU 160 ENDIF ELSE ;#.set SPACE_OFF, 0 IFNDEF HOSTARCHITECTURE_X86_64 .set PC_OFF, 4 .set SP_OFF, 8 .set EAX_OFF, 20 .set EBX_OFF, 24 .set ECX_OFF, 28 .set EDX_OFF, 32 .set ESI_OFF, 36 .set EDI_OFF, 40 .set FLAGS_OFF, 48 .set FPREGS_OFF, 52 ELSE .set PC_OFF, 8 .set SP_OFF, 16 ;# 32 is the count of the number of checked registers .set EAX_OFF, 40 .set EBX_OFF, 48 .set ECX_OFF, 56 .set EDX_OFF, 64 .set ESI_OFF, 72 .set EDI_OFF, 80 .set R8_OFF, 88 .set R9_OFF, 96 .set R10_OFF, 104 .set R11_OFF, 112 .set R12_OFF, 120 .set R13_OFF, 128 .set R14_OFF, 136 ;# 144 is the count of the number of unchecked registers .set FLAGS_OFF, 152 .set FPREGS_OFF, 160 ENDIF ENDIF ;# Mark the stack as non-executable when compiling for Linux IFDEF __linux__ IFDEF __ELF__ .section .note.GNU-stack, "", @progbits ENDIF ENDIF ;# ;# CODE STARTS HERE ;# IFDEF WINDOWS .CODE ELSE .text ENDIF ;# Define standard call macro. CALL_IO ioCallNo where ioCallNo is the io function to call. ;# We need to include M_Redx in the register sets. MD_set_for_retry may modify it ;# if the function was called directly and not via the closure register. IFDEF WINDOWS CALL_IO MACRO index mov byte ptr [RequestCode+Rebp],index jmp SaveStateAndReturnLocal ENDM CALL_EXTRA MACRO index mov byte ptr [ReturnReason+Rebp],index jmp SaveFullState ENDM ELSE #define CALL_IO(index) \ MOVB $index,RequestCode[Rebp]; \ jmp SaveStateAndReturnLocal; #define CALL_EXTRA(index) \ MOVB $index,ReturnReason[Rebp]; \ jmp SaveFullState; ENDIF ;# Load the registers from the ML stack and jump to the code. ;# This is used to start ML code. ;# The argument is the address of the MemRegisters struct and goes into %rbp. CALLMACRO INLINE_ROUTINE X86AsmSwitchToPoly IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx ;# Argument - address of MemRegisters - goes into Rebp PUSHAL ;# Save all the registers just to be safe MOVL Resp,SavedSp[Recx] ;# savedSp:=%Resp - Save the system stack pointer. MOVL Recx,Rebp ;# Put address of MemRegisters where it belongs ELSE IFDEF WINDOWS ;# The argument to the function is passed in Recx ELSE IFDEF _WIN32 ;# The argument to the function is passed in Recx ELSE ;# The argument to the function is passed in Redi MOVL Redi,Recx ENDIF ENDIF PUSHL Rebp ;# Save callee--save registers PUSHL Rebx PUSHL R12 PUSHL R13 PUSHL R14 PUSHL R15 PUSHL Redi ;# Callee save in Windows PUSHL Resi MOVL Resp,SavedSp[Recx] ;# savedSp:=%Resp - Save the system stack pointer. MOVL Recx,Rebp ;# Put address of MemRegisters where it belongs ENDIF MOVL PolyStack[Rebp],Reax IFDEF HOSTARCHITECTURE_X86_64 MOVL LocalMpointer[Rebp],R15 ;# Set the heap pointer register ENDIF MOVL SP_OFF[Reax],Resp ;# Set the new stack ptr PUSHL PC_OFF[Reax] ;# Push the code address IFDEF WINDOWS test byte ptr [Rebp+FullRestore],1 ;# Should we restore or clear the regs? ELSE testb CONST 1,FullRestore[Rebp] ;# Should we restore or clear the regs? ENDIF jnz sw2polyfull ;# We're returning from an RTS call. We need to clear the registers we're ;# not restoring so that they are valid if we GC. We restore EDX and the ;# argument regs because this may have been CallCode MOVL EBX_OFF[Reax],Rebx MOVL CONST ZERO,Recx MOVL EDX_OFF[Reax],Redx MOVL CONST ZERO,Resi MOVL CONST ZERO,Redi IFDEF HOSTARCHITECTURE_X86_64 MOVL R8_OFF[Reax],R8 MOVL R9_OFF[Reax],R9 MOVL R10_OFF[Reax],R10 MOVL CONST ZERO,R11 MOVL CONST ZERO,R12 MOVL CONST ZERO,R13 MOVL CONST ZERO,R14 ENDIF MOVL EAX_OFF[Reax],Reax cld ;# Clear this just in case IFDEF WINDOWS mov byte ptr [InRTS+Rebp],0 ELSE MOVB CONST 0,InRTS[Rebp] ;# inRTS:=0 (stack now kosher) ENDIF ret ;# Jump to code address sw2polyfull: PUSHL FLAGS_OFF[Reax] ;# Push the flags FRSTOR FPREGS_OFF[Reax] MOVL EBX_OFF[Reax],Rebx ;# Load the registers MOVL ECX_OFF[Reax],Recx MOVL EDX_OFF[Reax],Redx MOVL ESI_OFF[Reax],Resi MOVL EDI_OFF[Reax],Redi IFDEF HOSTARCHITECTURE_X86_64 MOVL R8_OFF[Reax],R8 MOVL R9_OFF[Reax],R9 MOVL R10_OFF[Reax],R10 MOVL R11_OFF[Reax],R11 MOVL R12_OFF[Reax],R12 MOVL R13_OFF[Reax],R13 MOVL R14_OFF[Reax],R14 ENDIF cld ;# Clear this just in case MOVL EAX_OFF[Reax],Reax POPFL ;# reset flags IFDEF WINDOWS mov byte ptr [InRTS+Rebp],0 ELSE MOVB CONST 0,InRTS[Rebp] ;# inRTS:=0 (stack now kosher) ENDIF ret ;# Jump to code address ;# Code to save the state and switch to C ;# This saves the full register state. SaveFullState: PUSHFL ;# Save flags PUSHL Reax ;# Save eax MOVL PolyStack[Rebp],Reax MOVL Rebx,EBX_OFF[Reax] MOVL Recx,ECX_OFF[Reax] MOVL Redx,EDX_OFF[Reax] MOVL Resi,ESI_OFF[Reax] MOVL Redi,EDI_OFF[Reax] FNSAVE FPREGS_OFF[Reax] ;# Save FP state. Also resets the state so... FLDCW FPREGS_OFF[Reax] ;# ...load because we need the same rounding mode in the RTS IFDEF HOSTARCHITECTURE_X86_64 MOVL R8,R8_OFF[Reax] MOVL R9,R9_OFF[Reax] MOVL R10,R10_OFF[Reax] MOVL R11,R11_OFF[Reax] MOVL R12,R12_OFF[Reax] MOVL R13,R13_OFF[Reax] MOVL R14,R14_OFF[Reax] MOVL R15,LocalMpointer[Rebp] ;# Save the heap pointer ENDIF POPL Rebx ;# Get old eax value MOVL Rebx,EAX_OFF[Reax] POPL Rebx MOVL Rebx,FLAGS_OFF[Reax] MOVL Resp,SP_OFF[Reax] IFDEF WINDOWS mov byte ptr [InRTS+Rebp],1 ELSE MOVB CONST 1,InRTS[Rebp] ;# inRTS:=0 (stack now kosher) ENDIF MOVL SavedSp[Rebp],Resp IFNDEF HOSTARCHITECTURE_X86_64 POPAL ELSE POPL Resi POPL Redi POPL R15 ;# Restore callee-save registers POPL R14 POPL R13 POPL R12 POPL Rebx POPL Rebp ENDIF ret ;# As X86AsmSaveFullState but only save what is necessary for an RTS call. CALLMACRO INLINE_ROUTINE X86AsmSaveStateAndReturn SaveStateAndReturnLocal: ;# This is necessary so that the jmps use a PC-relative address PUSHL Reax ;# Save eax MOVL PolyStack[Rebp],Reax MOVL Rebx,EBX_OFF[Reax] MOVL Redx,EDX_OFF[Reax] FSTCW FPREGS_OFF[Reax] FNINIT ;# Reset the FP state. FLDCW FPREGS_OFF[Reax] ;# But reload the rounding mode IFDEF HOSTARCHITECTURE_X86_64 MOVL R8,R8_OFF[Reax] MOVL R9,R9_OFF[Reax] MOVL R10,R10_OFF[Reax] MOVL R15,LocalMpointer[Rebp] ;# Save the heap pointer ENDIF POPL Rebx ;# Get old eax value MOVL Rebx,EAX_OFF[Reax] MOVL Resp,SP_OFF[Reax] IFDEF WINDOWS mov byte ptr [InRTS+Rebp],1 ELSE MOVB CONST 1,InRTS[Rebp] ;# inRTS:=0 (stack now kosher) ENDIF MOVL SavedSp[Rebp],Resp IFNDEF HOSTARCHITECTURE_X86_64 POPAL ELSE POPL Resi POPL Redi POPL R15 ;# Restore callee-save registers POPL R14 POPL R13 POPL R12 POPL Rebx POPL Rebp ENDIF ret ;# ;# A number of functions implemented in Assembly for efficiency reasons ;# CALLMACRO INLINE_ROUTINE int_to_word ;# Extract the low order bits from a word. TESTL CONST TAG,Reax jz get_first_long_word_a1 ret ;# Return the argument CALLMACRO RegMask int_to_word,(M_Reax) ;# This is now used in conjunction with isShort in Word.fromInt. CALLMACRO INLINE_ROUTINE get_first_long_word_a get_first_long_word_a1: IFDEF WINDOWS test byte ptr [Reax-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Reax] ;# 16 is the "negative" bit ENDIF MOVL [Reax],Reax ;# Extract the word which is already little-endian jz gfw1 NEGL Reax ;# We can ignore overflow gfw1: CALLMACRO MAKETAGGED Reax,Reax ret CALLMACRO RegMask get_first_long_word,(M_Reax) CALLMACRO INLINE_ROUTINE move_bytes ;# Move a segment of memory from one location to another. ;# Must deal with the case of overlapping segments correctly. ;# (source, sourc_offset, destination, dest_offset, length) ;# Assume that the offsets and length are all short integers. IFNDEF HOSTARCHITECTURE_X86_64 MOVL 12[Resp],Redi ;# Destination address MOVL 8[Resp],Recx ;# Destination offset, untagged ELSE MOVL R8,Redi ;# Destination address MOVL R9,Recx ;# Destination offset, untagged ENDIF SHRL CONST TAGSHIFT,Recx ADDL Recx,Redi MOVL Reax,Resi ;# Source address SHRL CONST TAGSHIFT,Rebx ADDL Rebx,Resi IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx ;# Get the length to move ELSE MOVL R10,Recx ;# Get the length to move ENDIF SHRL CONST TAGSHIFT,Recx cld ;# Default to increment Redi,Resi CMPL Redi,Resi ;# Check for potential overlap ;# If dest > src then use decrementing moves else ;# use incrementing moves. ja mvb1 std ;# Decrement Redi,Resi LEAL (-1)[Resi+Recx],Resi LEAL (-1)[Redi+Recx],Redi mvb1: IFDEF WINDOWS rep movsb ;# Copy the bytes ELSE rep movsb ;# Copy the bytes ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Clobber bad value in %rbx MOVL Reax,Recx ;# and %Recx MOVL Reax,Redi MOVL Reax,Resi ;# Visual Studio 5 C++ seems to assume that the direction flag ;# is cleared. I think that`s a bug but we have to go along with it. cld IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 12 ELSE ret ENDIF CALLMACRO RegMask move_bytes,Mask_all CALLMACRO INLINE_ROUTINE move_words ;# Move a segment of memory from one location to another. ;# Must deal with the case of overlapping segments correctly. ;# (source, source_offset, destination, dest_offset, length) ;# Assume that the offsets and length are all short integers. IFNDEF HOSTARCHITECTURE_X86_64 MOVL 12[Resp],Redi ;# Destination address MOVL 8[Resp],Recx ;# Destination offset LEAL (-2)[Redi+Recx*2],Redi ;# Destination address plus offset LEAL (-2)[Reax+Rebx*2],Resi ;# Source address plus offset MOVL 4[Resp],Recx ;# Get the length to move (words) ELSE MOVL R8,Redi ;# Destination address MOVL R9,Recx ;# Destination offset LEAL (-4)[Redi+Recx*4],Redi ;# Destination address plus offset LEAL (-4)[Reax+Rebx*4],Resi ;# Source address plus offset MOVL R10,Recx ;# Get the length to move (words) ENDIF SHRL CONST TAGSHIFT,Recx cld ;# Default to increment Redi,Resi CMPL Redi,Resi ;# Check for potential overlap ;# If dest > src then use decrementing moves else ;# use incrementing moves. ja mvw1 std ;# Decrement Redi,Resi LEAL (-POLYWORDSIZE)[Resi+Recx*POLYWORDSIZE],Resi LEAL (-POLYWORDSIZE)[Redi+Recx*POLYWORDSIZE],Redi mvw1: IFDEF WINDOWS IFNDEF HOSTARCHITECTURE_X86_64 rep movsd ;# Copy the words ELSE rep movsq ;# Copy the words ENDIF ELSE rep IFNDEF HOSTARCHITECTURE_X86_64 movsl ;# Copy the words ELSE movsq ;# Copy the words ENDIF ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Recx ;# Clobber bad values MOVL Reax,Redi MOVL Reax,Resi ;# Visual Studio 5 C++ seems to assume that the direction flag ;# is cleared. I think that`s a bug but we have to go along with it. cld IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 12 ELSE ret ENDIF CALLMACRO RegMask move_words,Mask_all ;# RetFalse: MOVL CONST FALSE,Reax ret RetTrue: MOVL CONST TRUE,Reax ret CALLMACRO INLINE_ROUTINE not_bool XORL CONST (TRUE-TAG),Reax ;# Change the value but leave the tag ret CALLMACRO RegMask not_bool,(M_Reax) ;# or, and, xor shift etc. assume the values are tagged integers CALLMACRO INLINE_ROUTINE or_word ORL Rebx,Reax ret CALLMACRO RegMask or_word,(M_Reax) CALLMACRO INLINE_ROUTINE and_word ANDL Rebx,Reax ret CALLMACRO RegMask and_word,(M_Reax) CALLMACRO INLINE_ROUTINE xor_word XORL Rebx,Reax ORL CONST TAG,Reax ;# restore the tag ret CALLMACRO RegMask xor_word,(M_Reax) CALLMACRO INLINE_ROUTINE shift_left_word ;# Assume that both args are tagged integers ;# Word.<<(a,b) is defined to return 0 if b > Word.wordSize IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(31),Rebx ELSE CMPL CONST TAGGED(63),Rebx ENDIF jb slw1 MOVL CONST ZERO,Reax ret slw1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag SUBL CONST TAG,Reax SHLL R_cl,Reax ORL CONST TAG,Reax ;# restore the tag MOVL Reax,Recx ;# clobber %Recx ret CALLMACRO RegMask shift_left_word,(M_Reax OR M_Recx) CALLMACRO INLINE_ROUTINE shift_right_word ;# Word.>>(a,b) is defined to return 0 if b > Word.wordSize IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(31),Rebx ELSE CMPL CONST TAGGED(63),Rebx ENDIF jb srw1 MOVL CONST ZERO,Reax ret srw1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag SHRL R_cl,Reax ORL CONST TAG,Reax ;# restore the tag MOVL Reax,Recx ;# clobber %Recx ret CALLMACRO RegMask shift_right_word,(M_Reax OR M_Recx) CALLMACRO INLINE_ROUTINE shift_right_arith_word ;# Word.~>>(a,b) is defined to return 0 or ~1 if b > Word.wordSize ;# The easiest way to do that is to set the shift to 31. IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(31),Rebx ELSE CMPL CONST TAGGED(63),Rebx ENDIF jb sra1 IFNDEF HOSTARCHITECTURE_X86_64 MOVL CONST TAGGED(31),Rebx ELSE MOVL CONST TAGGED(63),Rebx ENDIF sra1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag SARL R_cl,Reax ORL CONST TAG,Reax ;# restore the tag MOVL Reax,Recx ;# clobber %Recx ret CALLMACRO RegMask shift_right_arith_word,(M_Reax OR M_Recx) ;# Clears the "mutable" bit on a segment CALLMACRO INLINE_ROUTINE locksega IFDEF WINDOWS and byte ptr [Reax-1],CONST(0ffh-B_mutable) ELSE andb CONST(0xff-B_mutable),-1[Reax] ENDIF MOVL CONST TAGGED(0),Reax ;# Return Unit, ret CALLMACRO RegMask lockseg,M_Reax CALLMACRO INLINE_ROUTINE get_length_a MOVL (-POLYWORDSIZE)[Reax],Reax SHLL CONST 8,Reax ;# Clear top byte SHRL CONST(8-TAGSHIFT),Reax ;# Make it a tagged integer ORL CONST TAG,Reax ret CALLMACRO RegMask get_length,(M_Reax) CALLMACRO INLINE_ROUTINE is_shorta ;# Returns true if the argument is tagged ANDL CONST TAG,Reax jz RetFalse jmp RetTrue CALLMACRO RegMask is_short,(M_Reax) CALLMACRO INLINE_ROUTINE string_length TESTL CONST TAG,Reax ;# Single char strings are represented by the jnz RetOne ;# character. MOVL [Reax],Reax ;# Get length field CALLMACRO MAKETAGGED Reax,Reax ret RetOne: MOVL CONST TAGGED(1),Reax ret CALLMACRO RegMask string_length,(M_Reax) ;# Store the length of a string in the first word. CALLMACRO INLINE_ROUTINE set_string_length_a SHRL CONST TAGSHIFT,Rebx ;# Untag the length MOVL Rebx,[Reax] MOVL CONST UNIT,Reax ;# Return unit MOVL Reax,Rebx ;# Clobber untagged value ret CALLMACRO RegMask set_string_length,(M_Reax OR M_Rebx) ;# raisex (formerly raisexn) is used by compiled code. CALLMACRO INLINE_ROUTINE raisex MOVL HandlerRegister[Rebp],Recx ;# Get next handler into %rcx IFDEF WINDOWS jmp FULLWORD ptr [Recx] ELSE jmp *[Recx] ENDIF CALLMACRO INLINE_ROUTINE load_byte MOVL Rebx,Redi SHRL CONST TAGSHIFT,Redi IFDEF WINDOWS movzx Redi, byte ptr [Reax][Redi] ELSE IFNDEF HOSTARCHITECTURE_X86_64 movzbl (Reax,Redi,1),Redi ELSE movzbq (Reax,Redi,1),Redi ENDIF ENDIF CALLMACRO MAKETAGGED Redi,Reax MOVL Reax,Redi ;# Clobber bad value in %Redi ret CALLMACRO RegMask load_byte,(M_Reax OR M_Redi) CALLMACRO INLINE_ROUTINE load_word IFNDEF HOSTARCHITECTURE_X86_64 MOVL (-2)[Reax+Rebx*2],Reax ELSE MOVL (-4)[Reax+Rebx*4],Reax ENDIF MOVL Reax,Rebx ret CALLMACRO RegMask load_word,(M_Reax) CALLMACRO INLINE_ROUTINE assign_byte ;# We can assume that the data value will not overflow 30 bits (it is only 1 byte!) IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx ELSE MOVL R8,Recx ENDIF SHRL CONST TAGSHIFT,Recx ;# Remove tags from data value ;# We can assume that the index will not overflow 30 bits i.e. it is a tagged short SHRL CONST TAGSHIFT,Rebx ;# Remove tags from offset MOVB R_cl,[Reax+Rebx] MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Clobber bad value in %Rebx MOVL Reax,Recx ;# and %Recx IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 4 ELSE ret ENDIF CALLMACRO RegMask assign_byte,(M_Reax OR M_Rebx OR M_Recx) CALLMACRO INLINE_ROUTINE assign_word IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx MOVL Recx,(-2)[Reax+Rebx*2] ELSE MOVL R8,(-4)[Reax+Rebx*4] ;# The offset is tagged already ENDIF MOVL CONST UNIT,Reax ;# The function returns unit IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 4 CALLMACRO RegMask assign_word,(M_Reax OR M_Recx) ELSE ret CALLMACRO RegMask assign_word,(M_Reax) ENDIF ;# Allocate a piece of memory that does not need to be initialised. ;# We can't actually risk leaving word objects uninitialised so for the ;# moment we always initialise. CALLMACRO INLINE_ROUTINE alloc_uninit IFDEF HOSTARCHITECTURE_X86_64 MOVL CONST ZERO,R8 ELSE POP Recx ;# Get the return address PUSHL CONST ZERO ;# Push the initial value - zero PUSHL Recx ;# Restore the return address ENDIF ;# Drop through into alloc_store IFNDEF HOSTARCHITECTURE_X86_64 CALLMACRO RegMask alloc_uninit,Mask_all ;# All, because we may call RTS ELSE CALLMACRO RegMask alloc_uninit,Mask_all ;# All, because we may call RTS ENDIF ;# alloc(size, flags, initial). Allocates a segment of a given size and ;# initialises it. ;# ;# This is primarily used for arrays and for strings. Refs are ;# allocated using inline code. CALLMACRO INLINE_ROUTINE alloc_store allsts: ;# alloc(size, flags, initial). Allocates a segment of a given size and ;# initialises it. ;# First check that the length is acceptable TESTL CONST TAG,Reax jz alloc_in_rts ;# Get the RTS to raise an exception MOVL Reax,Redi SHRL CONST TAGSHIFT,Redi ;# Remove tag jnz allst0 ;# (test for 0) Make zero sized objects 1 MOVL CONST 1,Redi ;# because they mess up the g.c. jmp alloc_in_rts allst0: IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST Max_Length,Redi ;# Length field must fit in 24 bits ELSE MOVL CONST Max_Length,Redx ;# Length field must fit in 56 bits CMPL Redx,Redi ENDIF ja alloc_in_rts ;# Get the RTS to raise an exception IFNDEF HOSTARCHITECTURE_X86_64 INCL Redi ;# Add 1 word SHLL CONST 2,Redi ;# Get length in bytes MOVL LocalMpointer[Rebp],Redx ELSE ADDL CONST 1,Redi ;# Add 1 word SHLL CONST 3,Redi ;# Get length in bytes MOVL R15,Redx ENDIF SUBL Redi,Redx ;# Allocate the space MOVL Reax,Redi ;# Clobber bad value in Redi CMPL LocalMbottom[Rebp],Redx ;# Check for free space jb alloc_in_rts ;# Normally the above test is sufficient but if LocalMpointer is near the bottom of ;# memory and the store requested is very large the value in Redx can be negative ;# which is greater, unsigned, than LocalMbottom. We have to check it is less ;# than, unsigned, the allocation pointer. IFNDEF HOSTARCHITECTURE_X86_64 CMPL LocalMpointer[Rebp],Redx jnb alloc_in_rts MOVL Redx,LocalMpointer[Rebp] ;# Put back in the heap ptr ELSE CMPL R15,Redx jnb alloc_in_rts MOVL Redx,R15 ;# Put back in the heap ptr ENDIF SHRL CONST TAGSHIFT,Reax IFNDEF HOSTARCHITECTURE_X86_64 MOVL Reax,(-4)[Redx] ;# Put in length ELSE MOVL Reax,(-8)[Redx] ;# Put in length ENDIF SHRL CONST TAGSHIFT,Rebx ;# remove tag from flag ORL CONST B_mutable,Rebx ;# set mutable bit MOVB R_bl,(-1)[Redx] ;# and put it in. ;# Initialise the store. MOVL Reax,Recx ;# Get back the no. of words. IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Reax ;# Get initial value. ELSE MOVL R8,Reax ;# Get initial value. ENDIF CMPL CONST B_mutablebytes,Rebx jne allst2 ;# If this is a byte seg SHRL CONST TAGSHIFT,Reax ;# untag the initialiser IFNDEF HOSTARCHITECTURE_X86_64 SHLL CONST 2,Recx ;# Convert to bytes ELSE SHLL CONST 3,Recx ;# Convert to bytes ENDIF MOVL Redx,Redi IFDEF WINDOWS rep stosb ELSE rep stosb ENDIF jmp allst3 ;# If this is a word segment allst2: MOVL Redx,Redi IFDEF WINDOWS IFNDEF HOSTARCHITECTURE_X86_64 rep stosd ELSE rep stosq ENDIF ELSE rep IFNDEF HOSTARCHITECTURE_X86_64 stosl ELSE stosq ENDIF ENDIF allst3: MOVL Redx,Reax MOVL Reax,Recx ;# Clobber these MOVL Reax,Redx MOVL Reax,Rebx MOVL Reax,Redi IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 4 ELSE ret ENDIF CALLMACRO RegMask alloc_store,Mask_all ;# All, because we may use RTS call ;# This is used if we have reached the store limit and need to garbage-collect. alloc_in_rts: MOVL Reax,Redx ;# Clobber these first MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_alloc_store CALLMACRO INLINE_ROUTINE touch_final ;# This is really a pseudo-op MOVL CONST UNIT,Reax CALLMACRO RegMask touch_final,(M_Reax) CALLMACRO INLINE_ROUTINE add_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz add_really_long LEAL (-TAG)[Reax],Redi ADDL Rebx,Redi jo add_really_long MOVL Redi,Reax ret add_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_aplus CALLMACRO RegMask aplus,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE sub_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz sub_really_long MOVL Reax,Redi SUBL Rebx,Redi jo sub_really_long LEAL TAG[Redi],Reax ;# Put back the tag MOVL Reax,Redi ret sub_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_aminus CALLMACRO RegMask aminus,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE mult_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz mul_really_long MOVL Rebx,Redi SARL CONST TAGSHIFT,Redi ;# Shift multiplicand MOVL Reax,Resi SUBL CONST TAG,Resi ;# Just subtract off the tag off multiplier IMULL Redi,Resi jo mul_really_long ADDL CONST TAG,Resi MOVL Resi,Reax MOVL Reax,Redi ret mul_really_long: MOVL Reax,Resi ;# Clobber this MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_amul CALLMACRO RegMask amul,(M_Reax OR M_Redi OR M_Resi OR Mask_all) CALLMACRO INLINE_ROUTINE div_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi ;# %Redi now contains $0 or $1 (both legal!) jz div_really_long CMPL CONST TAGGED(0),Rebx ;# Check that it's non-zero jz div_really_long ;# We don't want a trap. ;# The only case of overflow is dividing the smallest negative number by -1 CMPL CONST TAGGED((-1)),Rebx jz div_really_long SARL CONST TAGSHIFT,Reax MOVL Rebx,Redi SARL CONST TAGSHIFT,Redi IFNDEF HOSTARCHITECTURE_X86_64 cdq ELSE cqo ENDIF idiv Redi CALLMACRO MAKETAGGED Reax,Reax MOVL Reax,Redx MOVL Reax,Redi ret div_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_adiv CALLMACRO RegMask adiv,(M_Reax OR M_Redi OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE rem_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi ;# %Redi now contains $0 or $1 (both legal! jz rem_really_long CMPL CONST TAGGED(0),Rebx ;# Check that it's non-zero jz rem_really_long ;# We don't want a trap. ;# The only case of overflow is dividing the smallest negative number by -1 CMPL CONST TAGGED((-1)),Rebx jz rem_really_long SARL CONST TAGSHIFT,Reax MOVL Rebx,Redi SARL CONST TAGSHIFT,Redi IFNDEF HOSTARCHITECTURE_X86_64 cdq ELSE cqo ENDIF idiv Redi CALLMACRO MAKETAGGED Redx,Reax MOVL Reax,Redx MOVL Reax,Redi ret rem_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_amod CALLMACRO RegMask amod,(M_Reax OR M_Redi OR M_Redx OR Mask_all) ;# Combined quotient and remainder. We have to use the long form ;# if the arguments are long or there's an overflow. The first two ;# arguments are the values to be divided. The third argument is the ;# address where the results should be placed. CALLMACRO INLINE_ROUTINE quotrem_long MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz quotrem_really_long CMPL CONST TAGGED(0),Rebx jz quotrem_really_long ;# The only case of overflow is dividing the smallest negative number by -1 CMPL CONST TAGGED((-1)),Rebx jz quotrem_really_long ;# Get the address for the result. IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx ELSE MOVL R8,Recx ENDIF ;# Do the division SARL CONST TAGSHIFT,Reax MOVL Rebx,Redi SARL CONST TAGSHIFT,Redi IFNDEF HOSTARCHITECTURE_X86_64 cdq ELSE cqo ENDIF idiv Redi CALLMACRO MAKETAGGED Reax,Reax CALLMACRO MAKETAGGED Redx,Redx MOVL Reax,Redi MOVL Reax,[Recx] MOVL Redx,POLYWORDSIZE[Recx] MOVL Recx,Reax IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 4 ELSE ret ENDIF mem_for_remquot1: ;# Not enough store: clobber bad value in ecx. MOVL CONST 1,Recx quotrem_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_quotrem CALLMACRO RegMask quotrem,(M_Reax OR M_Redi OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE equal_long CMPL Reax,Rebx je RetTrue MOVL Reax,Recx ;# If either is short ORL Rebx,Reax ;# the result is false ANDL CONST TAG,Reax jnz RetFalse MOVL Recx,Reax CALLMACRO CALL_IO POLY_SYS_equala CALLMACRO RegMask equala,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE or_long IFDEF NOTATTHEMOMENT MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz or_really_long ORL Rebx,Reax MOVL Reax,Redi ret or_really_long: ENDIF CALLMACRO CALL_IO POLY_SYS_ora CALLMACRO RegMask ora,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE xor_long IFDEF NOTATTHEMOMENT MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz xor_really_long XORL Rebx,Reax ORL CONST TAG,Reax ;# restore the tag MOVL Reax,Redi ret xor_really_long: ENDIF CALLMACRO CALL_IO POLY_SYS_xora CALLMACRO RegMask xora,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE and_long IFDEF NOTATTHEMOMENT MOVL Reax,Redi ANDL Rebx,Redi ANDL CONST TAG,Redi jz and_really_long ANDL Rebx,Reax MOVL Reax,Redi ret and_really_long: ENDIF CALLMACRO CALL_IO POLY_SYS_anda CALLMACRO RegMask anda,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE neg_long TESTL CONST TAG,Reax jz neg_really_long MOVL CONST (TAGGED(0)+TAG),Redi SUBL Reax,Redi jo neg_really_long MOVL Redi,Reax ret neg_really_long: MOVL Reax,Redi CALLMACRO CALL_IO POLY_SYS_aneg CALLMACRO RegMask aneg,(M_Reax OR M_Redi OR Mask_all) CALLMACRO INLINE_ROUTINE int_geq TESTL CONST TAG,Reax ;# Is first arg short? jz igeq2 TESTL CONST TAG,Rebx ;# Is second arg short? jz igeq1 CMPL Rebx,Reax jge RetTrue jmp RetFalse igeq1: ;# First arg is short, second isn't IFDEF WINDOWS test byte ptr [Rebx-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Rebx] ;# 16 is the "negative" bit ENDIF jnz RetTrue ;# Negative - always less jmp RetFalse igeq2: ;# First arg is long TESTL CONST TAG,Rebx ;# Is second arg short? jz igeq3 ;# First arg is long, second is short IFDEF WINDOWS test byte ptr [Reax-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Reax] ;# 16 is the "negative" bit ENDIF jz RetTrue ;# Positive - always greater jmp RetFalse igeq3: ;# Both long CALLMACRO CALL_IO POLY_SYS_int_geq CALLMACRO RegMask int_geq,(M_Reax OR Mask_all) CALLMACRO INLINE_ROUTINE int_leq TESTL CONST TAG,Reax ;# Is first arg short? jz ileq2 TESTL CONST TAG,Rebx ;# Is second arg short? jz ileq1 CMPL Rebx,Reax jle RetTrue jmp RetFalse ileq1: ;# First arg is short, second isn't IFDEF WINDOWS test byte ptr [Rebx-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Rebx] ;# 16 is the "negative" bit ENDIF jz RetTrue ;# Negative - always less jmp RetFalse ileq2: ;# First arg is long TESTL CONST TAG,Rebx ;# Is second arg short? jz ileq3 ;# First arg is long, second is short IFDEF WINDOWS test byte ptr [Reax-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Reax] ;# 16 is the "negative" bit ENDIF jnz RetTrue ;# Positive - always greater jmp RetFalse ileq3: CALLMACRO CALL_IO POLY_SYS_int_leq CALLMACRO RegMask int_leq,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE int_gtr TESTL CONST TAG,Reax ;# Is first arg short? jz igtr2 TESTL CONST TAG,Rebx ;# Is second arg short? jz igtr1 CMPL Rebx,Reax jg RetTrue jmp RetFalse igtr1: ;# First arg is short, second isn't IFDEF WINDOWS test byte ptr [Rebx-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Rebx] ;# 16 is the "negative" bit ENDIF jnz RetTrue ;# Negative - always less jmp RetFalse igtr2: ;# First arg is long TESTL CONST TAG,Rebx ;# Is second arg short? jz igtr3 ;# First arg is long, second is short IFDEF WINDOWS test byte ptr [Reax-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Reax] ;# 16 is the "negative" bit ENDIF jz RetTrue ;# Positive - always greater jmp RetFalse igtr3: CALLMACRO CALL_IO POLY_SYS_int_gtr CALLMACRO RegMask int_gtr,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE int_lss TESTL CONST TAG,Reax ;# Is first arg short? jz ilss2 TESTL CONST TAG,Rebx ;# Is second arg short? jz ilss1 CMPL Rebx,Reax jl RetTrue jmp RetFalse ilss1: ;# First arg is short, second isn't IFDEF WINDOWS test byte ptr [Rebx-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Rebx] ;# 16 is the "negative" bit ENDIF jz RetTrue ;# Negative - always less jmp RetFalse ilss2: ;# First arg is long TESTL CONST TAG,Rebx ;# Is second arg short? jz ilss3 ;# First arg is long, second is short IFDEF WINDOWS test byte ptr [Reax-1],CONST 16 ;# 16 is the "negative" bit ELSE testb CONST 16,(-1)[Reax] ;# 16 is the "negative" bit ENDIF jnz RetTrue ;# Positive - always greater jmp RetFalse ilss3: CALLMACRO CALL_IO POLY_SYS_int_lss CALLMACRO RegMask int_lss,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE offset_address ;# This is needed in the code generator, but is a very risky thing to do. SHRL CONST TAGSHIFT,Rebx ;# Untag ADDL Rebx,Reax ;# and add in MOVL Reax,Rebx ret CALLMACRO RegMask offset_address,(M_Reax OR M_Rebx) ;# General test routine. Returns with the condition codes set ;# appropriately. teststr: TESTL CONST TAG,Reax ;# Is arg1 short jz tststr1 TESTL CONST TAG,Rebx ;# Yes: is arg2 also short? jz tststr0a ;# Both are short - just compare the characters CMPL Rebx,Reax ret tststr0a: MOVL CONST 1,Redi ;# Is arg2 the null string ? CMPL [Rebx],Redi jg tststr4 ;# Return with "gtr" set if it is SHRL CONST TAGSHIFT,Reax CMPB POLYWORDSIZE[Rebx],R_al jne tststr4 ;# If they're not equal that's the result CMPL CONST 256,Reax ;# But if they're equal set "less" because A is less than B jmp tststr4 tststr1: ;# arg2 is not short. Is arg1 ? TESTL CONST TAG,Rebx jz tststr2 MOVL [Reax],Redi ;# Is arg1 the null string CMPL CONST 1,Redi jl tststr4 ;# Return with "less" set if it is SHRL CONST TAGSHIFT,Rebx MOVB POLYWORDSIZE[Reax],R_cl CMPB R_bl,R_cl jne tststr4 ;# If they're not equal that's the result CMPL CONST 0,Redi ;# But if they're equal set "greater" because A is greater than B jmp tststr4 tststr2: MOVL [Reax],Redi ;# Get length. MOVL [Rebx],Recx ;# CMPL Recx,Redi ;# Find shorter length jge tststr3 MOVL Redi,Recx tststr3: LEAL POLYWORDSIZE[Reax],Resi ;# Load ptrs for cmpsb LEAL POLYWORDSIZE[Rebx],Redi cld ;# Make sure we increment CMPL Reax,Reax ;# Set the Zero bit IFDEF WINDOWS repe cmpsb ;# Compare while equal and Recx > 0 ELSE repe IFNDEF HOSTARCHITECTURE_X86_64 cmpsb ;# Compare while equal and %ecx > 0 ELSE cmpsb ;# Compare while equal and %rcx > 0 ENDIF ENDIF jnz tststr4 ;# Strings are equal as far as the shorter of the two. Have to compare ;# the lengths. MOVL [Reax],Redi CMPL [Rebx],Redi tststr4: MOVL CONST 1,Reax ;# Clobber these MOVL Reax,Rebx MOVL Reax,Recx MOVL Reax,Resi MOVL Reax,Redi ret ;# These functions compare strings for lexical ordering. This version, at ;# any rate, assumes that they are UNSIGNED bytes. CALLMACRO INLINE_ROUTINE str_compare call teststr ja RetTrue ;# Return TAGGED(1) if it's greater je RetFalse ;# Return TAGGED(0) if it's equal MOVL CONST MINUS1,Reax ;# Return TAGGED(-1) if it's less. ret CALLMACRO RegMask str_compare,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE teststrgeq call teststr jnb RetTrue jmp RetFalse CALLMACRO RegMask teststrgeq,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE teststrleq call teststr jna RetTrue jmp RetFalse CALLMACRO RegMask teststrleq,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE teststrlss call teststr jb RetTrue jmp RetFalse CALLMACRO RegMask teststrlss,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE teststrgtr call teststr ja RetTrue jmp RetFalse CALLMACRO RegMask teststrgtr,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE bytevec_eq ;# Compare arrays of bytes. The arguments are the same as move_bytes. ;# (source, sourc_offset, destination, dest_offset, length) ;# Assume that the offsets and length are all short integers. IFNDEF HOSTARCHITECTURE_X86_64 MOVL 12[Resp],Redi ;# Destination address MOVL 8[Resp],Recx ;# Destination offset, untagged ELSE MOVL R8,Redi ;# Destination address MOVL R9,Recx ;# Destination offset, untagged ENDIF SHRL CONST TAGSHIFT,Recx ADDL Recx,Redi MOVL Reax,Resi ;# Source address SHRL CONST TAGSHIFT,Rebx ADDL Rebx,Resi IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Recx ;# Get the length to move ELSE MOVL R10,Recx ;# Get the length to move ENDIF SHRL CONST TAGSHIFT,Recx cld ;# Make sure we increment CMPL Reax,Reax ;# Set the Zero bit IFDEF WINDOWS repe cmpsb ELSE repe cmpsb ENDIF MOVL Reax,Resi ;# Make these valid MOVL Reax,Recx MOVL Reax,Redi jz bvTrue MOVL CONST FALSE,Reax jmp bvRet bvTrue: MOVL CONST TRUE,Reax bvRet: IFNDEF HOSTARCHITECTURE_X86_64 ret CONST 12 ELSE ret ENDIF CALLMACRO RegMask bytevec_eq,(M_Reax OR M_Recx OR M_Redi OR M_Resi) CALLMACRO INLINE_ROUTINE is_big_endian jmp RetFalse ;# I386/486 is little-endian CALLMACRO RegMask is_big_endian,(M_Reax) CALLMACRO INLINE_ROUTINE bytes_per_word MOVL CONST TAGGED(POLYWORDSIZE),Reax ;# 4/8 bytes per word ret CALLMACRO RegMask bytes_per_word,(M_Reax) ;# Word functions. These are all unsigned and do not raise Overflow CALLMACRO INLINE_ROUTINE mul_word SHRL CONST TAGSHIFT,Rebx ;# Untag the multiplier SUBL CONST TAG,Reax ;# Remove the tag from the multiplicand MULL Rebx ;# unsigned multiplication ADDL CONST TAG,Reax ;# Add back the tag, but don`t shift MOVL Reax,Redx ;# clobber this which has the high-end result MOVL Reax,Rebx ;# and the other bad result. ret CALLMACRO RegMask mul_word,(M_Reax OR M_Rebx OR M_Redx) CALLMACRO INLINE_ROUTINE plus_word LEAL (-TAG)[Reax+Rebx],Reax ;# Add the values and subtract a tag ret CALLMACRO RegMask plus_word,(M_Reax) CALLMACRO INLINE_ROUTINE minus_word SUBL Rebx,Reax ADDL CONST TAG,Reax ;# Put back the tag ret CALLMACRO RegMask minus_word,(M_Reax) CALLMACRO INLINE_ROUTINE div_word SHRL CONST TAGSHIFT,Rebx jz raise_div_ex SHRL CONST TAGSHIFT,Reax MOVL CONST 0,Redx div Rebx CALLMACRO MAKETAGGED Reax,Reax MOVL Reax,Redx MOVL Reax,Rebx ret CALLMACRO RegMask div_word,(M_Reax OR M_Rebx OR M_Redx) CALLMACRO INLINE_ROUTINE mod_word SHRL CONST TAGSHIFT,Rebx jz raise_div_ex SHRL CONST TAGSHIFT,Reax MOVL CONST 0,Redx div Rebx CALLMACRO MAKETAGGED Redx,Reax MOVL Reax,Redx MOVL Reax,Rebx ret CALLMACRO RegMask mod_word,(M_Reax OR M_Rebx OR M_Redx) raise_div_ex: IFDEF WINDOWS jmp FULLWORD ptr [RaiseDiv+Rebp] ELSE jmp *RaiseDiv[Rebp] ENDIF CALLMACRO INLINE_ROUTINE word_eq CMPL Rebx,Reax jz RetTrue ;# True if they are equal. jmp RetFalse CALLMACRO RegMask word_eq,(M_Reax) CALLMACRO INLINE_ROUTINE word_neq CMPL Rebx,Reax jz RetFalse jmp RetTrue CALLMACRO RegMask word_neq,(M_Reax) CALLMACRO INLINE_ROUTINE word_geq CMPL Rebx,Reax jnb RetTrue jmp RetFalse CALLMACRO RegMask word_geq,(M_Reax) CALLMACRO INLINE_ROUTINE word_leq CMPL Rebx,Reax jna RetTrue jmp RetFalse CALLMACRO RegMask word_leq,(M_Reax) CALLMACRO INLINE_ROUTINE word_gtr CMPL Rebx,Reax ja RetTrue jmp RetFalse CALLMACRO RegMask word_gtr,(M_Reax) CALLMACRO INLINE_ROUTINE word_lss CMPL Rebx,Reax jb RetTrue jmp RetFalse CALLMACRO RegMask word_lss,(M_Reax) ;# Atomically increment the value at the address of the arg and return the ;# updated value. Since the xadd instruction returns the original value ;# we have to increment it. CALLMACRO INLINE_ROUTINE atomic_increment atomic_incr: ;# Internal name in case "atomic_increment" is munged. MOVL CONST 2,Rebx LOCKXADDL Rebx,[Reax] ADDL CONST 2,Rebx MOVL Rebx,Reax ret CALLMACRO RegMask atomic_incr,(M_Reax OR M_Rebx) ;# Atomically decrement the value at the address of the arg and return the ;# updated value. Since the xadd instruction returns the original value ;# we have to decrement it. CALLMACRO INLINE_ROUTINE atomic_decrement atomic_decr: MOVL CONST -2,Rebx LOCKXADDL Rebx,[Reax] MOVL Rebx,Reax SUBL CONST 2,Reax ret CALLMACRO RegMask atomic_decr,(M_Reax OR M_Rebx) ;# Reset a mutex to (tagged) one. Because the increment and decrements ;# are atomic this doesn't have to do anything special. CALLMACRO INLINE_ROUTINE atomic_reset IFDEF WINDOWS mov FULLWORD ptr [Reax],3 ELSE MOVL CONST 3,[Reax] ENDIF MOVL CONST UNIT,Reax ;# The function returns unit ret CALLMACRO RegMask atomic_reset,M_Reax ;# Return the thread id object for the current thread CALLMACRO INLINE_ROUTINE thread_self MOVL ThreadId[Rebp],Reax ret CALLMACRO RegMask thread_self,(M_Reax) ;# Memory for LargeWord.word values. This is the same as mem_for_real on ;# 64-bits but only a single word on 32-bits. mem_for_largeword: IFNDEF HOSTARCHITECTURE_X86_64 MOVL LocalMpointer[Rebp],Recx SUBL CONST 8,Recx ;# Length word (4 bytes) + 4 bytes IFDEF TEST_ALLOC ;# Test case - this will always force a call into RTS. CMPL LocalMpointer[Rebp],Recx ELSE CMPL LocalMbottom[Rebp],Recx ENDIF jb mem_for_real1 MOVL Recx,LocalMpointer[Rebp] ;# Updated allocation pointer IFDEF WINDOWS mov FULLWORD ptr (-4)[Recx],01000001h ;# Length word: ELSE MOVL CONST 0x01000001,(-4)[Recx] ;# Length word ENDIF ret ENDIF ;# Else if it is 64-bits just drop through ;# FLOATING POINT ;# If we have insufficient space for the result we call in to ;# main RTS to do the work. The reason for this is that it is ;# not safe to make a call into memory allocator and then ;# continue with the rest of the floating point operation ;# because that would produce a return address pointing into the ;# assembly code itself. It's possible that this is no longer ;# a problem. mem_for_real: ;# Allocate memory for the result. IFNDEF HOSTARCHITECTURE_X86_64 MOVL LocalMpointer[Rebp],Recx SUBL CONST 12,Recx ;# Length word (4 bytes) + 8 bytes ELSE MOVL R15,Recx SUBL CONST 16,Recx ;# Length word (8 bytes) + 8 bytes ENDIF IFDEF TEST_ALLOC ;# Test case - this will always force a call into RTS. CMPL LocalMpointer[Rebp],Recx ELSE CMPL LocalMbottom[Rebp],Recx ENDIF jb mem_for_real1 IFNDEF HOSTARCHITECTURE_X86_64 MOVL Recx,LocalMpointer[Rebp] ;# Updated allocation pointer IFDEF WINDOWS mov FULLWORD ptr (-4)[Recx],01000002h ;# Length word: ELSE MOVL CONST 0x01000002,(-4)[Recx] ;# Two words plus tag ENDIF ELSE MOVL Recx,R15 ;# Updated allocation pointer IFDEF WINDOWS mov qword ptr (-8)[Recx],1 ;# One word mov byte ptr (-1)[Recx],B_bytes ;# Set the byte flag. ELSE MOVL CONST 1,(-8)[Recx] ;# One word MOVB CONST B_bytes,(-1)[Recx] ;# Set the byte flag. ENDIF ENDIF ret mem_for_real1: ;# Not enough store: clobber bad value in ecx. MOVL CONST 1,Recx ret CALLMACRO INLINE_ROUTINE real_add call mem_for_real jb real_add_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. IFDEF WINDOWS FLD qword ptr [Reax] FADD qword ptr [Rebx] FSTP qword ptr [Recx] ELSE FLDL [Reax] FADDL [Rebx] FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_add_1: CALLMACRO CALL_IO POLY_SYS_Add_real ;# The mask includes FP7 rather than FP0 because this pushes a value which ;# overwrites the bottom of the stack. CALLMACRO RegMask real_add,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE real_sub call mem_for_real jb real_sub_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. IFDEF WINDOWS FLD qword ptr [Reax] FSUB qword ptr [Rebx] FSTP qword ptr [Recx] ELSE FLDL [Reax] FSUBL [Rebx] FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_sub_1: CALLMACRO CALL_IO POLY_SYS_Sub_real CALLMACRO RegMask real_sub,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE real_mul call mem_for_real jb real_mul_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. IFDEF WINDOWS FLD qword ptr [Reax] FMUL qword ptr [Rebx] FSTP qword ptr [Recx] ELSE FLDL [Reax] FMULL [Rebx] FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_mul_1: CALLMACRO CALL_IO POLY_SYS_Mul_real CALLMACRO RegMask real_mul,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE real_div call mem_for_real jb real_div_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. IFDEF WINDOWS FLD qword ptr [Reax] FDIV qword ptr [Rebx] FSTP qword ptr [Recx] ELSE FLDL [Reax] FDIVL [Rebx] FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_div_1: CALLMACRO CALL_IO POLY_SYS_Div_real CALLMACRO RegMask real_div,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) ;# For all values except NaN it's possible to do this by a test such as ;# "if x < 0.0 then ~ x else x" but the test always fails for NaNs CALLMACRO INLINE_ROUTINE real_abs call mem_for_real jb real_abs_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. ;# N.B. Real.~ X is not the same as 0.0 - X. Real.~ 0.0 is ~0.0; IFDEF WINDOWS FLD qword ptr [Reax] FABS FSTP qword ptr [Recx] ELSE FLDL [Reax] FABS FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_abs_1: CALLMACRO CALL_IO POLY_SYS_Abs_real CALLMACRO RegMask real_abs,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE real_neg call mem_for_real jb real_neg_1 ;# Not enough space - call RTS. ;# Do the operation and put the result in the allocated ;# space. ;# N.B. Real.~ X is not the same as 0.0 - X. Real.~ 0.0 is ~0.0; IFDEF WINDOWS FLD qword ptr [Reax] FCHS FSTP qword ptr [Recx] ELSE FLDL [Reax] FCHS FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_neg_1: CALLMACRO CALL_IO POLY_SYS_Neg_real CALLMACRO RegMask real_neg,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE real_eq IFDEF WINDOWS FLD qword ptr [Reax] FCOMP qword ptr [Rebx] ELSE FLDL [Reax] FCOMPL [Rebx] ENDIF FNSTSW R_ax ;# Not all 64-bit processors support SAHF. ;# The result is true if the zero flag is set and parity flag clear. ANDL CONST 17408,Reax ;# 0x4400 CMPL CONST 16384,Reax ;# 0x4000 je RetTrue jmp RetFalse CALLMACRO RegMask real_eq,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_neq IFDEF WINDOWS FLD qword ptr [Reax] FCOMP qword ptr [Rebx] ELSE FLDL [Reax] FCOMPL [Rebx] ENDIF FNSTSW R_ax ANDL CONST 17408,Reax ;# 0x4400 CMPL CONST 16384,Reax ;# 0x4000 jne RetTrue jmp RetFalse CALLMACRO RegMask real_neq,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_lss ;# Compare Rebx > Reax IFDEF WINDOWS FLD qword ptr [Rebx] FCOMP qword ptr [Reax] ELSE FLDL [Rebx] FCOMPL [Reax] ENDIF FNSTSW R_ax ;# True if the carry flag (C0), zero flag (C3) and parity (C2) are all clear ANDL CONST 17664,Reax ;# 0x4500 je RetTrue jmp RetFalse CALLMACRO RegMask real_lss,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_gtr IFDEF WINDOWS FLD qword ptr [Reax] FCOMP qword ptr [Rebx] ELSE FLDL [Reax] FCOMPL [Rebx] ENDIF FNSTSW R_ax ;# True if the carry flag (C0), zero flag (C3) and parity (C2) are all clear ANDL CONST 17664,Reax ;# 0x4500 je RetTrue jmp RetFalse CALLMACRO RegMask real_gtr,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_leq ;# Compare Rebx > Reax IFDEF WINDOWS FLD qword ptr [Rebx] FCOMP qword ptr [Reax] ELSE FLDL [Rebx] FCOMPL [Reax] ENDIF FNSTSW R_ax ;# True if the carry flag (C0) and parity (C2) are both clear ANDL CONST 1280,Reax ;# 0x500 je RetTrue jmp RetFalse CALLMACRO RegMask real_leq,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_geq IFDEF WINDOWS FLD qword ptr [Reax] FCOMP qword ptr [Rebx] ELSE FLDL [Reax] FCOMPL [Rebx] ENDIF FNSTSW R_ax ;# True if the carry flag (C0) and parity (C2) are both clear ANDL CONST 1280,Reax ;# 0x500 je RetTrue jmp RetFalse CALLMACRO RegMask real_geq,(M_Reax OR M_FP7) CALLMACRO INLINE_ROUTINE real_from_int TESTL CONST TAG,Reax ;# Is it long ? jz real_float_1 call mem_for_real jb real_float_1 ;# Not enough space - call RTS. SARL CONST TAGSHIFT,Reax ;# Untag the value MOVL Reax,RealTemp[Rebp] ;# Save it in a temporary (N.B. It's now untagged) IFDEF WINDOWS FILD FULLWORD ptr RealTemp[Rebp] FSTP qword ptr [Recx] ELSE IFDEF HOSTARCHITECTURE_X86_64 FILDQ RealTemp[Rebp] ELSE FILDL RealTemp[Rebp] ENDIF FSTPL [Recx] ENDIF MOVL Recx,Reax ret real_float_1: CALLMACRO CALL_IO POLY_SYS_int_to_real CALLMACRO RegMask real_from_int,(M_Reax OR M_Recx OR M_Redx OR M_FP7 OR Mask_all) ;# Additional assembly code routines ;# This template code is copied into a newly allocated piece of memory which ;# is set up to look like an ML function. ;# The code itself is called if a function set up with exception_trace ;# returns normally. It removes the handler. CALLMACRO INLINE_ROUTINE X86AsmRestoreHandlerAfterExceptionTraceTemplate ADDL CONST POLYWORDSIZE,Resp ;# Remove handler POPL HandlerRegister[Rebp] RET NOP ;# Add an extra byte so we have 8 bytes on both X86 and X86_64 ;# This is template code and must be position independent. ;# The length of this code (9 bytes) is built into X86Dependent::BuildExceptionTrace. CALLMACRO INLINE_ROUTINE X86AsmGiveExceptionTraceFnTemplate NOP ;# Two NOPs - for alignment NOP ;# The exception packet is the first argument. IFDEF WINDOWS mov byte ptr [RequestCode+Rebp],POLY_SYS_give_ex_trace_fn jmp FULLWORD ptr [IOEntryPoint+Rebp] ELSE MOVB CONST POLY_SYS_give_ex_trace_fn,RequestCode[Rebp] jmp *IOEntryPoint[Rebp] ENDIF ;# This is template code for an RTS call to kill the current thread. CALLMACRO INLINE_ROUTINE X86AsmKillSelfTemplate IFDEF WINDOWS mov byte ptr [RequestCode+Rebp],POLY_SYS_kill_self jmp FULLWORD ptr [IOEntryPoint+Rebp] ELSE MOVB CONST POLY_SYS_kill_self,RequestCode[Rebp] jmp *IOEntryPoint[Rebp] ENDIF CALLMACRO INLINE_ROUTINE X86AsmCallbackReturnTemplate IFDEF WINDOWS mov byte ptr [ReturnReason+Rebp],RETURN_CALLBACK_RETURN jmp FULLWORD ptr [IOEntryPoint+Rebp] ELSE MOVB CONST RETURN_CALLBACK_RETURN,ReturnReason[Rebp] jmp *IOEntryPoint[Rebp] ENDIF CALLMACRO INLINE_ROUTINE X86AsmCallbackExceptionTemplate IFDEF WINDOWS mov byte ptr [ReturnReason+Rebp],RETURN_CALLBACK_EXCEPTION jmp FULLWORD ptr [IOEntryPoint+Rebp] ELSE MOVB CONST RETURN_CALLBACK_EXCEPTION,ReturnReason[Rebp] jmp *IOEntryPoint[Rebp] ENDIF ;# This implements atomic addition in the same way as atomic_increment CALLMACRO INLINE_ROUTINE X86AsmAtomicIncrement IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Reax ELSE IFDEF WINDOWS MOVL Recx,Reax ;# The argument to the function is passed in Recx ELSE IFDEF _WIN32 MOVL Recx,Reax ;# The argument to the function is passed in Recx ELSE MOVL Redi,Reax ;# On X86_64 the argument is passed in Redi ENDIF ENDIF ENDIF ;# Use Recx and Reax because they are volatile (unlike Rebx on X86/64/Unix) MOVL CONST 2,Recx LOCKXADDL Recx,[Reax] ADDL CONST 2,Recx MOVL Recx,Reax ret ;# This implements atomic subtraction in the same way as atomic_decrement CALLMACRO INLINE_ROUTINE X86AsmAtomicDecrement IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Reax ELSE MOVL Redi,Reax ;# On X86_64 the argument is passed in Redi ENDIF MOVL CONST -2,Recx LOCKXADDL Recx,[Reax] MOVL Recx,Reax SUBL CONST 2,Reax ret ;# LargeWord.word operations. These are 32 or 64-bit values in a single-word byte ;# memory cell. CALLMACRO INLINE_ROUTINE eq_longword MOVL [Reax],Reax CMPL [Rebx],Reax jz RetTrue ;# True if they are equal. jmp RetFalse CALLMACRO RegMask eq_longword,(M_Reax) CALLMACRO INLINE_ROUTINE neq_longword MOVL [Reax],Reax CMPL [Rebx],Reax jz RetFalse jmp RetTrue CALLMACRO RegMask neq_longword,(M_Reax) CALLMACRO INLINE_ROUTINE geq_longword MOVL [Reax],Reax CMPL [Rebx],Reax jnb RetTrue jmp RetFalse CALLMACRO RegMask geq_longword,(M_Reax) CALLMACRO INLINE_ROUTINE leq_longword MOVL [Reax],Reax CMPL [Rebx],Reax jna RetTrue jmp RetFalse CALLMACRO RegMask leq_longword,(M_Reax) CALLMACRO INLINE_ROUTINE gt_longword MOVL [Reax],Reax CMPL [Rebx],Reax ja RetTrue jmp RetFalse CALLMACRO RegMask gt_longword,(M_Reax) CALLMACRO INLINE_ROUTINE lt_longword MOVL [Reax],Reax CMPL [Rebx],Reax jb RetTrue jmp RetFalse CALLMACRO RegMask lt_longword,(M_Reax) CALLMACRO INLINE_ROUTINE longword_to_tagged ;# Load the value and tag it, discarding the top bit MOVL [Reax],Reax CALLMACRO MAKETAGGED Reax,Reax ret CALLMACRO RegMask longword_to_tagged,(M_Reax) CALLMACRO INLINE_ROUTINE signed_to_longword ;# Shift the value to remove the tag and store it. call mem_for_largeword jb signed_to_longword1 SARL CONST TAGSHIFT,Reax ;# Arithmetic shift, preserve sign MOVL Reax,[Recx] MOVL Recx,Reax ret signed_to_longword1: CALLMACRO CALL_IO POLY_SYS_signed_to_longword CALLMACRO RegMask signed_to_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE unsigned_to_longword ;# Shift the value to remove the tag and store it. call mem_for_largeword jb unsigned_to_longword1 SHRL CONST TAGSHIFT,Reax ;# Logical shift, zero top bit MOVL Reax,[Recx] MOVL Recx,Reax ret unsigned_to_longword1: CALLMACRO CALL_IO POLY_SYS_unsigned_to_longword CALLMACRO RegMask unsigned_to_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE plus_longword call mem_for_largeword jb plus_longword1 MOVL [Reax],Reax ADDL [Rebx],Reax MOVL Reax,[Recx] MOVL Recx,Reax ret plus_longword1: CALLMACRO CALL_IO POLY_SYS_plus_longword CALLMACRO RegMask plus_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE minus_longword call mem_for_largeword jb minus_longword1 MOVL [Reax],Reax SUBL [Rebx],Reax MOVL Reax,[Recx] MOVL Recx,Reax ret minus_longword1: CALLMACRO CALL_IO POLY_SYS_minus_longword CALLMACRO RegMask minus_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE mul_longword call mem_for_largeword jb mul_longword1 MOVL [Reax],Reax IFDEF WINDOWS mul FULLWORD ptr [Rebx] ELSE MULL [Rebx] ENDIF MOVL Reax,[Recx] MOVL Recx,Reax MOVL Reax,Redx ;# clobber this which has the high-end result ret mul_longword1: CALLMACRO CALL_IO POLY_SYS_mul_longword CALLMACRO RegMask mul_longword,(M_Reax OR M_Recx OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE div_longword IFDEF WINDOWS cmp FULLWORD ptr [Rebx],0 ELSE CMPL CONST 0,[Rebx] ENDIF jz raise_div_ex call mem_for_largeword jb div_longword1 MOVL [Reax],Reax MOVL CONST 0,Redx IFDEF WINDOWS div FULLWORD ptr [Rebx] ELSE DIVL [Rebx] ENDIF MOVL Reax,[Recx] ;# Store the quotient MOVL Recx,Reax MOVL Reax,Redx ;# clobber this which has the remainder ret div_longword1: CALLMACRO CALL_IO POLY_SYS_div_longword CALLMACRO RegMask div_longword,(M_Reax OR M_Recx OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE mod_longword IFDEF WINDOWS cmp FULLWORD ptr [Rebx],0 ELSE CMPL CONST 0,[Rebx] ENDIF jz raise_div_ex call mem_for_largeword jb mod_longword1 MOVL [Reax],Reax MOVL CONST 0,Redx IFDEF WINDOWS div FULLWORD ptr [Rebx] ELSE DIVL [Rebx] ENDIF MOVL Redx,[Recx] ;# Store the remainder MOVL Recx,Reax MOVL Reax,Redx ;# clobber this which has the remainder ret mod_longword1: CALLMACRO CALL_IO POLY_SYS_mod_longword CALLMACRO RegMask mod_longword,(M_Reax OR M_Recx OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE andb_longword call mem_for_largeword jb andb_longword1 MOVL [Reax],Reax ANDL [Rebx],Reax MOVL Reax,[Recx] MOVL Recx,Reax ret andb_longword1: CALLMACRO CALL_IO POLY_SYS_andb_longword CALLMACRO RegMask andb_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE orb_longword call mem_for_largeword jb orb_longword1 MOVL [Reax],Reax ORL [Rebx],Reax MOVL Reax,[Recx] MOVL Recx,Reax ret orb_longword1: CALLMACRO CALL_IO POLY_SYS_orb_longword CALLMACRO RegMask orb_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE xorb_longword call mem_for_largeword jb xorb_longword1 MOVL [Reax],Reax XORL [Rebx],Reax MOVL Reax,[Recx] MOVL Recx,Reax ret xorb_longword1: CALLMACRO CALL_IO POLY_SYS_xorb_longword CALLMACRO RegMask xorb_longword,(M_Reax OR M_Recx OR Mask_all) CALLMACRO INLINE_ROUTINE shift_left_longword call mem_for_largeword jb shift_left_longword1 MOVL Recx,Redx ;# We need Recx for the shift ;# The shift value is always a Word.word value i.e. tagged ;# LargeWord.<<(a,b) is defined to return 0 if b > LargeWord.wordSize IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(32),Rebx ELSE CMPL CONST TAGGED(64),Rebx ENDIF jb sllw1 MOVL CONST 0,Reax jmp sllw2 sllw1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag MOVL [Reax],Reax SHLL R_cl,Reax sllw2: MOVL Reax,[Redx] MOVL Redx,Reax MOVL Reax,Recx ;# Clobber Recx ret shift_left_longword1: CALLMACRO CALL_IO POLY_SYS_shift_left_longword CALLMACRO RegMask shift_left_longword,(M_Reax OR M_Recx OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE shift_right_longword call mem_for_largeword jb shift_right_longword1 MOVL Recx,Redx ;# We need Recx for the shift ;# The shift value is always a Word.word value i.e. tagged ;# LargeWord.>>(a,b) is defined to return 0 if b > LargeWord.wordSize IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(32),Rebx ELSE CMPL CONST TAGGED(64),Rebx ENDIF jb srlw1 MOVL CONST 0,Reax jmp srlw2 srlw1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag MOVL [Reax],Reax SHRL R_cl,Reax srlw2: MOVL Reax,[Redx] MOVL Redx,Reax MOVL Reax,Recx ;# Clobber Recx ret shift_right_longword1: CALLMACRO CALL_IO POLY_SYS_shift_right_longword CALLMACRO RegMask shift_right_longword,(M_Reax OR M_Recx OR M_Redx OR Mask_all) CALLMACRO INLINE_ROUTINE shift_right_arith_longword call mem_for_largeword jb shift_right_arith_longword1 MOVL Recx,Redx ;# We need Recx for the shift ;# The shift value is always a Word.word value i.e. tagged ;# LargeWord.~>>(a,b) is defined to return 0 or ~1 if b > LargeWord.wordSize IFNDEF HOSTARCHITECTURE_X86_64 CMPL CONST TAGGED(32),Rebx ELSE CMPL CONST TAGGED(64),Rebx ENDIF jb sralw1 ;# Setting the shift to 31/63 propagates the sign bit IFNDEF HOSTARCHITECTURE_X86_64 MOVL CONST TAGGED(31),Rebx ELSE MOVL CONST TAGGED(63),Rebx ENDIF sralw1: MOVL Rebx,Recx SHRL CONST TAGSHIFT,Recx ;# remove tag MOVL [Reax],Reax SARL R_cl,Reax MOVL Reax,[Redx] MOVL Redx,Reax MOVL Reax,Recx ;# Clobber Recx ret shift_right_arith_longword1: CALLMACRO CALL_IO POLY_SYS_shift_right_arith_longword CALLMACRO RegMask shift_right_arith_longword,(M_Reax OR M_Rebx OR M_Recx OR M_Redx OR Mask_all) ;# C-memory operations. CALLMACRO INLINE_ROUTINE cmem_load_asm_8 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Rebx ;# Get the index. ELSE MOVL R8,Rebx ;# Get the index. ENDIF SARL CONST TAGSHIFT,Rebx ;# That's also tagged IFDEF WINDOWS movzx Reax, byte ptr [Reax][Rebx] ELSE IFNDEF HOSTARCHITECTURE_X86_64 movzbl (Reax,Rebx,1),Reax ELSE movzbq (Reax,Rebx,1),Reax ENDIF ENDIF CALLMACRO MAKETAGGED Reax,Reax MOVL Reax,Rebx ;# Clobber bad value in %Rebx RET3 CALLMACRO RegMask cmem_load_8,(M_Reax OR M_Rebx) CALLMACRO INLINE_ROUTINE cmem_load_asm_16 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Rebx ;# Get the index. ELSE MOVL R8,Rebx ;# Get the index. ENDIF ;# The index is tagged but since we want to multiply by two we don't need anything here. IFDEF WINDOWS movzx Reax, word ptr [Reax-1][Rebx] ELSE IFNDEF HOSTARCHITECTURE_X86_64 movzwl -1(Reax,Rebx,1),Reax ELSE movzwq -1(Reax,Rebx,1),Reax ENDIF ENDIF CALLMACRO MAKETAGGED Reax,Reax RET3 CALLMACRO RegMask cmem_load_16,(M_Reax OR M_Rebx) CALLMACRO INLINE_ROUTINE cmem_load_asm_32 IFDEF HOSTARCHITECTURE_X86_64 ;# 64-bit mode - the result is tagged MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFDEF WINDOWS mov eax, dword ptr [Reax-2][R8*2] ELSE movl -2(Reax,R8,2),%eax ENDIF CALLMACRO MAKETAGGED Reax,Reax MOVL Reax,Rebx ;# Clobber bad value in %Rebx RET3 CALLMACRO RegMask cmem_load_32,(M_Reax OR M_Rebx) ELSE ;# 32-bit mode - the result is boxed call mem_for_largeword jb cmem_load_32_1 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in MOVL 4[Resp],Rebx ;# Get the index. MOVL (-2)[Reax+Rebx*2],Reax MOVL Reax,[Recx] ;# Save in the new memory MOVL Recx,Reax ;# Copy the result address RET3 cmem_load_32_1: CALLMACRO CALL_IO POLY_SYS_cmem_load_32 CALLMACRO RegMask cmem_load_32,(M_Reax OR M_Rebx OR M_Recx OR Mask_all) ENDIF CALLMACRO INLINE_ROUTINE cmem_load_asm_64 ;# The result is boxed in 64-bit mode. Not implemented in 32-bit mode IFDEF HOSTARCHITECTURE_X86_64 call mem_for_largeword jb cmem_load_64_1 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in MOVL (-4)[Reax+R8*4],Reax MOVL Reax,[Recx] ;# Save in the new memory MOVL Recx,Reax ;# Copy the result address MOVL Reax,Rebx ;# Clobber bad value RET3 cmem_load_64_1: CALLMACRO CALL_IO POLY_SYS_cmem_load_64 CALLMACRO RegMask cmem_load_64,(M_Reax OR M_Rebx OR M_Recx OR Mask_all) ENDIF CALLMACRO INLINE_ROUTINE cmem_load_asm_float call mem_for_real jb cmem_load_float1 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Rebx ;# Get the index. ELSE MOVL R8,Rebx ;# Get the index. ENDIF IFDEF WINDOWS FLD dword ptr [Reax-2][Rebx*2] FSTP qword ptr [Recx] ELSE FLDS -2(Reax,Rebx,2) FSTPL [Recx] ENDIF MOVL Recx,Reax RET3 cmem_load_float1: CALLMACRO CALL_IO POLY_SYS_cmem_load_float CALLMACRO RegMask cmem_load_float,(M_Reax OR M_Rebx OR M_Recx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE cmem_load_asm_double call mem_for_real jb cmem_load_double1 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 4[Resp],Rebx ;# Get the index. ELSE MOVL R8,Rebx ;# Get the index. ENDIF IFDEF WINDOWS FLD qword ptr [Reax-4][Rebx*4] FSTP qword ptr [Recx] ELSE FLDL -4(Reax,Rebx,4) FSTPL [Recx] ENDIF MOVL Recx,Reax RET3 cmem_load_double1: CALLMACRO CALL_IO POLY_SYS_cmem_load_double CALLMACRO RegMask cmem_load_double,(M_Reax OR M_Rebx OR M_Recx OR M_FP7 OR Mask_all) CALLMACRO INLINE_ROUTINE cmem_store_asm_8 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 8[Resp],Rebx ;# Get the index. MOVL 4[Resp],Recx ;# Get the value to store ELSE MOVL R8,Rebx ;# Get the index. MOVL R9,Recx ENDIF SARL CONST TAGSHIFT,Rebx ;# That's also tagged SARL CONST TAGSHIFT,Recx MOVB R_cl,[Reax+Rebx] MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Clobber bad value in %Rebx MOVL Reax,Recx ;# and %Recx RET4 CALLMACRO RegMask cmem_store_8,(M_Reax OR M_Rebx OR M_Recx) CALLMACRO INLINE_ROUTINE cmem_store_asm_16 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 8[Resp],Rebx ;# Get the index. MOVL 4[Resp],Recx ;# Get the value to store ELSE MOVL R8,Rebx ;# Get the index. MOVL R9,Recx ENDIF SARL CONST TAGSHIFT,Recx ;# Untag the value to store IFDEF WINDOWS mov word ptr [Reax-1][Rebx],cx ELSE movw %cx,-1(Reax,Rebx,1) ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Recx ;# Bad value in %Recx RET4 CALLMACRO RegMask cmem_store_16,(M_Reax OR M_Rebx OR M_Recx) CALLMACRO INLINE_ROUTINE cmem_store_asm_32 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 8[Resp],Rebx ;# Get the index. MOVL 4[Resp],Recx ;# Get the value to store MOVL [Recx],Recx ELSE MOVL R8,Rebx ;# Get the index. MOVL R9,Recx SARL CONST TAGSHIFT,Recx ;# Untag the value to store ENDIF IFDEF WINDOWS mov dword ptr [Reax-2][Rebx*2],ecx ELSE movl %ecx,-2(Reax,Rebx,2) ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Recx ;# Bad value in %Recx RET4 CALLMACRO RegMask cmem_store_32,(M_Reax OR M_Rebx OR M_Recx) CALLMACRO INLINE_ROUTINE cmem_store_asm_64 ;# The value is boxed in 64-bit mode. Not implemented in 32-bit mode IFDEF HOSTARCHITECTURE_X86_64 MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in MOVL [R9],Rebx ;# Value to store MOVL Rebx,(-4)[Reax+R8*4] ;# Store it MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Bad value in %Rebx RET4 CALLMACRO RegMask cmem_store_64,(M_Reax OR M_Rebx OR M_Recx) ENDIF CALLMACRO INLINE_ROUTINE cmem_store_asm_float MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 8[Resp],Rebx ;# Get the index. MOVL 4[Resp],Recx ;# Get the address of the real ELSE MOVL R8,Rebx ;# Get the index. MOVL R9,Recx ENDIF IFDEF WINDOWS FLD qword ptr [Recx] FSTP dword ptr [Reax-2][Rebx*2] ELSE FLDL [Recx] FSTPS -2(Reax,Rebx,2) ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Bad value in %Rebx RET4 CALLMACRO RegMask cmem_store_float,(M_Reax OR M_Rebx OR M_Recx OR M_FP7) CALLMACRO INLINE_ROUTINE cmem_store_asm_double MOVL [Reax],Reax ;# The address is boxed. SARL CONST TAGSHIFT,Rebx ;# The offset is a signed tagged value ADDL Rebx,Reax ;# Add it in IFNDEF HOSTARCHITECTURE_X86_64 MOVL 8[Resp],Rebx ;# Get the index. MOVL 4[Resp],Recx ;# Get the address of the real ELSE MOVL R8,Rebx ;# Get the index. MOVL R9,Recx ENDIF IFDEF WINDOWS FLD qword ptr [Recx] FSTP qword ptr [Reax-4][Rebx*4] ELSE FLDL [Recx] FSTPL -4(Reax,Rebx,4) ENDIF MOVL CONST UNIT,Reax ;# The function returns unit MOVL Reax,Rebx ;# Bad value in %Rebx RET4 CALLMACRO RegMask cmem_store_double,(M_Reax OR M_Rebx OR M_Recx OR M_FP7) IFDEF WINDOWS CREATE_IO_CALL MACRO index INLINE_ROUTINE Call&index& CALL_IO index ENDM CREATE_EXTRA_CALL MACRO index INLINE_ROUTINE X86AsmCallExtra&index& CALL_EXTRA index ENDM ELSE #define CREATE_IO_CALL(index) \ INLINE_ROUTINE(Call##index##) \ CALL_IO(index) #define CREATE_EXTRA_CALL(index) \ INLINE_ROUTINE(X86AsmCallExtra##index##) \ CALL_EXTRA(index) ENDIF CALLMACRO CREATE_IO_CALL POLY_SYS_exit CALLMACRO CREATE_IO_CALL POLY_SYS_chdir CALLMACRO CREATE_IO_CALL POLY_SYS_get_flags CALLMACRO CREATE_IO_CALL POLY_SYS_exception_trace_fn CALLMACRO CREATE_IO_CALL POLY_SYS_profiler CALLMACRO CREATE_IO_CALL POLY_SYS_Real_str CALLMACRO CREATE_IO_CALL POLY_SYS_Real_Dispatch CALLMACRO CREATE_IO_CALL POLY_SYS_conv_real CALLMACRO CREATE_IO_CALL POLY_SYS_real_to_int CALLMACRO CREATE_IO_CALL POLY_SYS_sqrt_real CALLMACRO CREATE_IO_CALL POLY_SYS_sin_real CALLMACRO CREATE_IO_CALL POLY_SYS_signal_handler CALLMACRO CREATE_IO_CALL POLY_SYS_os_specific CALLMACRO CREATE_IO_CALL POLY_SYS_network CALLMACRO CREATE_IO_CALL POLY_SYS_io_dispatch CALLMACRO CREATE_IO_CALL POLY_SYS_poly_specific CALLMACRO CREATE_IO_CALL POLY_SYS_set_code_constant CALLMACRO CREATE_IO_CALL POLY_SYS_code_flags CALLMACRO CREATE_IO_CALL POLY_SYS_shrink_stack CALLMACRO CREATE_IO_CALL POLY_SYS_process_env CALLMACRO CREATE_IO_CALL POLY_SYS_callcode_tupled CALLMACRO CREATE_IO_CALL POLY_SYS_foreign_dispatch CALLMACRO CREATE_IO_CALL POLY_SYS_ffi CALLMACRO CREATE_IO_CALL POLY_SYS_stack_trace CALLMACRO CREATE_IO_CALL POLY_SYS_full_gc CALLMACRO CREATE_IO_CALL POLY_SYS_XWindows CALLMACRO CREATE_IO_CALL POLY_SYS_timing_dispatch CALLMACRO CREATE_IO_CALL POLY_SYS_showsize CALLMACRO CREATE_IO_CALL POLY_SYS_objsize CALLMACRO CREATE_IO_CALL POLY_SYS_kill_self CALLMACRO CREATE_IO_CALL POLY_SYS_thread_dispatch CALLMACRO CREATE_IO_CALL POLY_SYS_io_operation CALLMACRO CREATE_IO_CALL POLY_SYS_ln_real CALLMACRO CREATE_IO_CALL POLY_SYS_exp_real CALLMACRO CREATE_IO_CALL POLY_SYS_arctan_real CALLMACRO CREATE_IO_CALL POLY_SYS_cos_real CALLMACRO CREATE_EXTRA_CALL RETURN_HEAP_OVERFLOW CALLMACRO CREATE_EXTRA_CALL RETURN_STACK_OVERFLOW CALLMACRO CREATE_EXTRA_CALL RETURN_STACK_OVERFLOWEX CALLMACRO CREATE_EXTRA_CALL RETURN_RAISE_DIV CALLMACRO CREATE_EXTRA_CALL RETURN_ARB_EMULATION ;# Register mask vector. - extern int registerMaskVector[]; ;# Each entry in this vector is a set of the registers modified ;# by the function. It is an untagged bitmap with the registers ;# encoded in the same way as the IFDEF WINDOWS align 4 PUBLIC registerMaskVector registerMaskVector dd Mask_all ;# 0 is unused ELSE GLOBAL EXTNAME(registerMaskVector) EXTNAME(registerMaskVector): #define dd .long dd Mask_all ;# 0 is unused ENDIF dd Mask_all ;# 1 dd Mask_all ;# 2 dd Mask_all ;# 3 is unused dd Mask_all ;# 4 is unused dd Mask_all ;# 5 is unused dd Mask_all ;# 6 dd Mask_all ;# 7 is unused dd Mask_all ;# 8 is unused dd Mask_all ;# 9 dd Mask_all ;# 10 is unused dd Mask_alloc_store ;# 11 dd Mask_alloc_uninit ;# 12 dd Mask_all ;# return = 13 dd Mask_all ;# raisex = 14 dd Mask_get_length ;# 15 dd Mask_all ;# 16 is unused dd Mask_all ;# 17 dd Mask_all ;# 18 is no longer used dd Mask_all ;# 19 is no longer used dd Mask_all ;# 20 is no longer used dd Mask_all ;# 21 is unused dd Mask_all ;# 22 is unused dd Mask_str_compare ;# 23 dd Mask_all ;# 24 is unused dd Mask_all ;# 25 is unused dd Mask_teststrgtr ;# 26 dd Mask_teststrlss ;# 27 dd Mask_teststrgeq ;# 28 dd Mask_teststrleq ;# 29 dd Mask_all ;# 30 dd Mask_all ;# 31 is no longer used dd Mask_all ;# exception_trace_fn 32 dd Mask_all ;# 33 is no longer used dd Mask_all ;# 34 is no longer used dd Mask_all ;# 35 is no longer used dd Mask_all ;# 36 is no longer used dd Mask_all ;# 37 is unused dd Mask_all ;# 38 is unused dd Mask_all ;# 39 is unused dd Mask_all ;# 40 dd Mask_all ;# 41 is unused dd Mask_all ;# 42 dd Mask_all ;# 43 dd Mask_all ;# 44 is no longer used dd Mask_all ;# 45 is no longer used dd Mask_all ;# 46 dd Mask_lockseg ;# 47 dd Mask_all ;# nullorzero = 48 dd Mask_all ;# 49 is no longer used dd Mask_all ;# 50 is no longer used dd Mask_all ;# 51 dd Mask_all ;# 52 dd Mask_eq_longword ;# 53 dd Mask_neq_longword ;# 54 dd Mask_geq_longword ;# 55 dd Mask_leq_longword ;# 56 dd Mask_gt_longword ;# 57 dd Mask_lt_longword ;# 58 dd Mask_all ;# 59 is unused dd Mask_all ;# 60 is unused dd Mask_all ;# 61 dd Mask_all ;# 62 dd Mask_all ;# 63 is unused dd Mask_all ;# 64 is unused dd Mask_all ;# 65 is unused dd Mask_all ;# 66 is unused dd Mask_all ;# 67 is unused dd Mask_all ;# 68 is unused dd Mask_atomic_reset ;# 69 dd Mask_atomic_incr ;# 70 dd Mask_atomic_decr ;# 71 dd Mask_thread_self ;# 72 dd Mask_all ;# 73 dd Mask_plus_longword ;# 74 dd Mask_minus_longword ;# 75 dd Mask_mul_longword ;# 76 dd Mask_div_longword ;# 77 dd Mask_mod_longword ;# 78 dd Mask_andb_longword ;# 79 dd Mask_orb_longword ;# 80 dd Mask_xorb_longword ;# 81 dd Mask_all ;# 82 is unused dd Mask_all ;# 83 is now unused dd Mask_all ;# 84 dd Mask_shift_left_longword ;# 85 dd Mask_shift_right_longword ;# 86 dd Mask_shift_right_arith_longword ;# 87 dd Mask_all ;# 88 dd Mask_longword_to_tagged ;# 89 dd Mask_signed_to_longword ;# 90 dd Mask_unsigned_to_longword ;# 91 dd Mask_all ;# 92 dd Mask_all ;# 93 dd Mask_all ;# 94 dd Mask_all ;# 95 is unused dd Mask_all ;# 96 is unused dd Mask_all ;# 97 is unused dd Mask_all ;# 98 dd Mask_all ;# 99 dd Mask_all ;# 100 dd Mask_all ;# 101 is unused dd Mask_all ;# 102 is unused dd Mask_all ;# 103 dd Mask_quotrem ;# 104 dd Mask_is_short ;# 105 dd Mask_aplus ;# 106 dd Mask_aminus ;# 107 dd Mask_amul ;# 108 dd Mask_adiv ;# 109 dd Mask_amod ;# 110 dd Mask_aneg ;# 111 dd Mask_xora ;# 112 dd Mask_equala ;# 113 dd Mask_ora ;# 114 dd Mask_anda ;# 115 dd Mask_all ;# 116 is unused dd Mask_all ;# 117 dd Mask_real_geq ;# 118 dd Mask_real_leq ;# 119 dd Mask_real_gtr ;# 120 dd Mask_real_lss ;# 121 dd Mask_real_eq ;# 122 dd Mask_real_neq ;# 123 dd Mask_all ;# 124 dd Mask_real_add ;# 125 dd Mask_real_sub ;# 126 dd Mask_real_mul ;# 127 dd Mask_real_div ;# 128 dd Mask_real_abs ;# 129 dd Mask_real_neg ;# 130 dd Mask_all ;# 131 is unused dd Mask_all ;# 132 dd Mask_all ;# 133 dd Mask_all ;# 134 dd Mask_real_from_int ;# 135 dd Mask_all ;# 136 dd Mask_all ;# 137 dd Mask_all ;# 138 dd Mask_all ;# 139 dd Mask_all ;# 140 dd Mask_all ;# 141 dd Mask_all ;# 142 is no longer used dd Mask_all ;# 143 is unused dd Mask_all ;# 144 is unused dd Mask_all ;# 145 is unused dd Mask_all ;# 146 is unused dd Mask_all ;# 147 is unused dd Mask_all ;# stdin = 148 dd Mask_all ;# stdout= 149 dd Mask_all ;# 150 dd Mask_set_string_length ;# 151 dd Mask_get_first_long_word ;# 152 dd Mask_all ;# poly_specific = 153 dd Mask_bytevec_eq ;# 154 dd Mask_all ;# 155 is unused dd Mask_all ;# 156 is unused dd Mask_all ;# 157 is unused dd Mask_all ;# 158 is unused dd Mask_all ;# 159 is unused dd Mask_cmem_load_8 ;# 160 dd Mask_cmem_load_16 ;# 161 dd Mask_cmem_load_32 ;# 162 IFDEF HOSTARCHITECTURE_X86_64 dd Mask_cmem_load_64 ;# 163 ELSE dd Mask_all ;# 169 ENDIF dd Mask_cmem_load_float ;# 164 dd Mask_cmem_load_double ;# 165 dd Mask_cmem_store_8 ;# 166 dd Mask_cmem_store_16 ;# 167 dd Mask_cmem_store_32 ;# 168 IFDEF HOSTARCHITECTURE_X86_64 dd Mask_cmem_store_64 ;# 169 ELSE dd Mask_all ;# 169 ENDIF dd Mask_cmem_store_float ;# 170 dd Mask_cmem_store_double ;# 171 dd Mask_all ;# 172 is unused dd Mask_all ;# 173 is unused dd Mask_all ;# 174 is unused dd Mask_all ;# 175 is unused dd Mask_all ;# 176 is unused dd Mask_all ;# 177 is unused dd Mask_all ;# 178 is unused dd Mask_all ;# 179 is unused dd Mask_all ;# 180 is unused dd Mask_all ;# 181 is unused dd Mask_all ;# 182 is unused dd Mask_all ;# 183 is unused dd Mask_all ;# 184 is unused dd Mask_all ;# 185 is unused dd Mask_all ;# 186 is unused dd Mask_all ;# 187 is unused dd Mask_all ;# 188 is unused dd Mask_all ;# 189 dd Mask_all ;# 190 dd Mask_all ;# 191 is no longer used dd Mask_all ;# 192 is unused dd Mask_move_words ;# 193 dd Mask_all ;# 194 dd Mask_move_words ;# 195 dd Mask_shift_right_arith_word ;# 196 dd Mask_int_to_word ;# 197 dd Mask_move_bytes ;# 198 dd Mask_move_bytes ;# 199 dd Mask_all ;# 200 dd Mask_all ;# 201 dd Mask_all ;# stderr = 202 dd Mask_all ;# 203 now unused dd Mask_all ;# 204 dd Mask_all ;# 205 dd Mask_all ;# 206 dd Mask_all ;# 207 is unused dd Mask_all ;# 208 now unused dd Mask_all ;# 209 dd Mask_all ;# 210 is unused dd Mask_all ;# 211 is unused dd Mask_all ;# 212 is unused dd Mask_is_big_endian ;# 213 dd Mask_bytes_per_word ;# 214 dd Mask_offset_address ;# 215 dd Mask_shift_right_word ;# 216 dd Mask_word_neq ;# 217 dd Mask_not_bool ;# 218 dd Mask_all ;# 219 is unused dd Mask_all ;# 220 is unused dd Mask_all ;# 221 is unused dd Mask_all ;# 222 is unused dd Mask_string_length ;# 223 dd Mask_all ;# 224 is unused dd Mask_all ;# 225 is unused dd Mask_all ;# 226 is unused dd Mask_all ;# 227 is unused dd Mask_touch_final ;# 228 dd Mask_all ;# 229 - no longer used dd Mask_all ;# 230 - no longer used dd Mask_int_geq ;# 231 dd Mask_int_leq ;# 232 dd Mask_int_gtr ;# 233 dd Mask_int_lss ;# 234 dd Mask_load_byte ;# load_byte_immut = 235 dd Mask_load_word ;# load_word_immut = 236 dd Mask_all ;# 237 is unused dd Mask_mul_word ;# 238 dd Mask_plus_word ;# 239 dd Mask_minus_word ;# 240 dd Mask_div_word ;# 241 dd Mask_or_word ;# 242 dd Mask_and_word ;# 243 dd Mask_xor_word ;# 244 dd Mask_shift_left_word ;# 245 dd Mask_mod_word ;# 246 dd Mask_word_geq ;# 247 dd Mask_word_leq ;# 248 dd Mask_word_gtr ;# 249 dd Mask_word_lss ;# 250 dd Mask_word_eq ;# 251 dd Mask_load_byte ;# 252 dd Mask_load_word ;# 253 dd Mask_assign_byte ;# 254 dd Mask_assign_word ;# 255 END polyml-5.6/libpolyml/xcall_numbers.h000066400000000000000000000561261265146633400177360ustar00rootroot00000000000000/* Title: X-Windows/Motif calls. Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define XCALL_Not 10 #define XCALL_And 11 #define XCALL_Or 12 #define XCALL_Xor 13 #define XCALL_DownShift 14 #define XCALL_UpShift 15 #define XCALL_NoDrawable 20 #define XCALL_NoCursor 21 #define XCALL_NoFont 22 #define XCALL_NoColormap 23 #define XCALL_NoVisual 24 #define XCALL_GetTimeOfDay 30 /* Colorcells 100 */ #define XCALL_XAllocColor 103 #define XCALL_XAllocColorCells 104 #define XCALL_XAllocColorPlanes 105 #define XCALL_XAllocNamedColor 106 #define XCALL_XFreeColors 107 #define XCALL_XLookupColor 108 #define XCALL_XParseColor 109 #define XCALL_XQueryColor 110 #define XCALL_XQueryColors 111 #define XCALL_XStoreColor 112 #define XCALL_XStoreColors 113 #define XCALL_XStoreNamedColor 114 #define XCALL_BlackPixel 115 #define XCALL_WhitePixel 116 /* Colormaps 150 */ #define XCALL_XCopyColormapAndFree 150 #define XCALL_XCreateColormap 151 #define XCALL_XInstallColormap 154 #define XCALL_XListInstalledColormaps 155 #define XCALL_XUninstallColormap 158 #define XCALL_DefaultColormap 159 #define XCALL_DefaultVisual 160 #define XCALL_DisplayCells 161 #define XCALL_VisualClass 162 #define XCALL_VisualRedMask 163 #define XCALL_VisualGreenMask 164 #define XCALL_VisualBlueMask 165 /* Cursors 200 */ #define XCALL_XCreateFontCursor 200 #define XCALL_XCreateGlyphCursor 201 #define XCALL_XCreatePixmapCursor 202 #define XCALL_XDefineCursor 203 #define XCALL_XQueryBestCursor 205 #define XCALL_XRecolorCursor 206 #define XCALL_XUndefineCursor 207 #define XCALL_XOpenDisplay 222 /* Display Specifications 250 */ #define XCALL_CellsOfScreen 250 #define XCALL_DefaultDepth 251 #define XCALL_DisplayHeight 252 #define XCALL_DisplayHeightMM 253 #define XCALL_DisplayPlanes 254 #define XCALL_DisplayString 255 #define XCALL_DisplayWidth 256 #define XCALL_DisplayWidthMM 257 #define XCALL_DoesBackingStore 258 #define XCALL_DoesSaveUnders 259 #define XCALL_EventMaskOfScreen 260 #define XCALL_MaxCmapsOfScreen 261 #define XCALL_MinCmapsOfScreen 262 #define XCALL_ProtocolRevision 263 #define XCALL_ProtocolVersion 264 #define XCALL_ServerVendor 265 #define XCALL_VendorRelease 266 /* Drawing Primitives 300 */ #define XCALL_XClearArea 300 #define XCALL_XClearWindow 301 #define XCALL_XCopyArea 302 #define XCALL_XCopyPlane 303 #define XCALL_XDrawArc 304 #define XCALL_XDrawArcs 305 #define XCALL_XDrawImageString 306 #define XCALL_XDrawImageString16 307 #define XCALL_XDrawLine 308 #define XCALL_XDrawLines 309 #define XCALL_XDrawPoint 310 #define XCALL_XDrawPoints 311 #define XCALL_XDrawRectangle 312 #define XCALL_XDrawRectangles 313 #define XCALL_XDrawSegments 314 #define XCALL_XDrawString 315 #define XCALL_XDrawString16 316 #define XCALL_XDrawText 317 #define XCALL_XDrawText16 318 #define XCALL_XFillArc 319 #define XCALL_XFillArcs 320 #define XCALL_XFillPolygon 321 #define XCALL_XFillRectangle 322 #define XCALL_XFillRectangles 323 /* Events 350 */ #define XCALL_XSelectInput 350 #define XCALL_XSynchronize 351 #define XCALL_GetState 361 #define XCALL_SetState 362 #define XCALL_NextEvent 365 #define XCALL_InsertTimeout 366 #define XCALL_XSetInputFocus 370 #define XCALL_XGetInputFocus 371 #define XCALL_XSetSelectionOwner 372 #define XCALL_XGetSelectionOwner 373 #define XCALL_XConvertSelection 374 #define XCALL_XSendSelectionNotify 375 #define XCALL_XDeleteProperty 376 #define XCALL_XInternAtom 377 #define XCALL_XGetAtomName 378 /* Fonts 400 */ #define XCALL_XGetFontPath 401 #define XCALL_XListFonts 402 #define XCALL_XListFontsWithInfo 403 #define XCALL_XLoadFont 404 #define XCALL_XLoadQueryFont 405 #define XCALL_XQueryFont 406 #define XCALL_XSetFontPath 407 /* Grabbing 450 */ /* Graphics Context 500 */ #define XCALL_DefaultGC 500 #define XCALL_UpdateGC 501 #define XCALL_XCreateGC 503 #define XCALL_XSetClipRectangles 509 #define XCALL_XSetDashes 510 /* Images 550 */ #define XCALL_XAddPixel 550 #define XCALL_XGetImage 552 #define XCALL_XGetPixel 553 #define XCALL_XGetSubImage 554 #define XCALL_XPutImage 555 #define XCALL_XPutPixel 556 #define XCALL_XSubImage 557 #define XCALL_BitmapBitOrder 558 #define XCALL_BitmapPad 559 #define XCALL_BitmapUnit 560 #define XCALL_ByteOrder 561 /* Keyboard 600 */ #define XCALL_XLookupString 611 #define XCALL_XQueryKeymap 612 #define XCALL_IsCursorKey 618 #define XCALL_IsFunctionKey 619 #define XCALL_IsKeypadKey 620 #define XCALL_IsMiscFunctionKey 621 #define XCALL_IsModifierKey 622 #define XCALL_IsPFKey 623 /* Output Buffer 650 */ #define XCALL_XFlush 650 #define XCALL_XSync 651 /* Pointers 700 */ #define XCALL_XQueryPointer 703 /* Regions 750 */ /* Save Set 800 */ /* Screen Saver 850 */ #define XCALL_XActivateScreenSaver 850 #define XCALL_XForceScreenSaver 851 #define XCALL_XGetScreenSaver 852 #define XCALL_XResetScreenSaver 853 #define XCALL_XSetScreenSaver 854 /* Standard Geometry 900 */ #define XCALL_XTranslateCoordinates 902 /* Text 950 */ #define XCALL_XTextExtents 950 #define XCALL_XTextExtents16 951 #define XCALL_XTextWidth 952 #define XCALL_XTextWidth16 953 /* Tiles, Pixmaps, Stipples and Bitmaps 1000 */ #define XCALL_XCreateBitmapFromData 1000 #define XCALL_XCreatePixmap 1001 #define XCALL_XCreatePixmapFromBitmapData 1002 #define XCALL_XQueryBestStipple 1004 #define XCALL_XQueryBestTile 1005 #define XCALL_XReadBitmapFile 1006 #define XCALL_XWriteBitmapFile 1007 /* User Preferences 1050 */ #define XCALL_XAutoRepeatOff 1050 #define XCALL_XAutoRepeatOn 1051 #define XCALL_XBell 1052 #define XCALL_XGetDefault 1053 /* Window Attributes 1100 */ #define XCALL_ChangeWindow 1100 #define XCALL_XGetGeometry 1101 #define XCALL_XGetWindowAttributes 1102 #define XCALL_XSetWindowBorderWidth 1107 /* Window Configuration 1150 */ #define XCALL_XCirculateSubwindows 1150 #define XCALL_XConfigureWindow 1153 #define XCALL_XLowerWindow 1154 #define XCALL_XMapRaised 1155 #define XCALL_XMapSubwindows 1156 #define XCALL_XMapWindow 1157 #define XCALL_XMoveResizeWindow 1158 #define XCALL_XMoveWindow 1159 #define XCALL_XQueryTree 1160 #define XCALL_XRaiseWindow 1161 #define XCALL_XReparentWindow 1162 #define XCALL_XResizeWindow 1163 #define XCALL_XRestackWindows 1164 #define XCALL_XUnmapSubwindows 1165 #define XCALL_XUnmapWindow 1166 /* Window Existence 1200 */ #define XCALL_RootWindow 1200 #define XCALL_DestroyXObject 1201 #define XCALL_XDestroySubwindows 1202 #define XCALL_XCreateSimpleWindow 1203 #define XCALL_XCreateWindow 1204 /* Window Manager 1250 */ #define XCALL_XSetProperty 1299 #define XCALL_XGetTextProperty 1250 #define XCALL_XGetWMHints 1253 #define XCALL_XGetWMSizeHints 1255 #define XCALL_XGetIconSizes 1257 #define XCALL_XGetTransientForHint 1259 #define XCALL_XGetWMColormapWindows 1261 #define XCALL_XGetRGBColormaps 1263 #define XCALL_XWMGeometry 1264 /* Miscellaneous and Convenience functions 1300 */ #define XCALL_GetID 1300 #define XCALL_ResourceExists 1301 #define XCALL_GetDisplay 1303 /* X Toolkit 3000 */ #define XCALL_NoWidget 3000 #define XCALL_AppInitialise 3001 #define XCALL_XtRealizeWidget 3002 #define XCALL_XtManageChildren 3003 #define XCALL_XtUnmanageChildren 3004 #define XCALL_XtDestroyWidget 3005 #define XCALL_SetCallbacks 3006 #define XCALL_XtSetValues 3007 #define XCALL_GetValue 3008 #define XCALL_XtParent 3009 #define XCALL_XtWindow 3010 #define XCALL_XtDisplay 3011 #define XCALL_XtUnrealizeWidget 3012 #define XCALL_XtName 3013 #define XCALL_XtParseTranslationTable 3014 #define XCALL_XtOverrideTranslations 3015 #define XCALL_XtAugmentTranslations 3016 #define XCALL_XtUninstallTranslations 3017 #define XCALL_XtTranslateTablePrint 3018 #define XCALL_XtCreatePopupShell 3019 #define XCALL_InsertWidgetTimeout 3020 #define XCALL_GetWidgetState 3021 #define XCALL_SetWidgetState 3022 #define XCALL_XtSetSensitive 3023 #define XCALL_XtIsSensitive 3024 #define XCALL_GetSubresources 3025 #define XCALL_Cast 3026 /* added 6/12/94 SPF */ #define XCALL_XtPopup 3027 #define XCALL_XtPopdown 3028 #define XCALL_XtMapWidget 3029 #define XCALL_XtUnmapWidget 3030 /* added 19/1/95 SPF */ #define XCALL_XtIsManaged 3031 #define XCALL_XtIsRealized 3032 /* added 23/3/01 DCJM */ #define XCALL_XtGetApplicationResources 3033 #define XCALL_XtAddEventHandler 3034 #define XCALL_XmCreateArrowButton 4000 #define XCALL_XmCreateArrowButtonGadget 4001 #define XCALL_XmCreateBulletinBoard 4002 #define XCALL_XmCreateBulletinBoardDialog 4003 #define XCALL_XmCreateCascadeButton 4004 #define XCALL_XmCreateCascadeButtonGadget 4005 #define XCALL_XmCreateCommand 4006 #define XCALL_XmCreateDialogShell 4007 #define XCALL_XmCreateDrawingArea 4008 #define XCALL_XmCreateDrawnButton 4009 #define XCALL_XmCreateErrorDialog 4010 #define XCALL_XmCreateFileSelectionBox 4011 #define XCALL_XmCreateFileSelectionDialog 4012 #define XCALL_XmCreateForm 4013 #define XCALL_XmCreateFormDialog 4014 #define XCALL_XmCreateFrame 4015 #define XCALL_XmCreateInformationDialog 4016 #define XCALL_XmCreateLabel 4017 #define XCALL_XmCreateLabelGadget 4018 #define XCALL_XmCreateList 4019 #define XCALL_XmCreateMainWindow 4020 #define XCALL_XmCreateMenuBar 4021 #define XCALL_XmCreateMenuShell 4022 #define XCALL_XmCreateMessageBox 4023 #define XCALL_XmCreateMessageDialog 4024 #define XCALL_XmCreateOptionMenu 4025 #define XCALL_XmCreatePanedWindow 4026 #define XCALL_XmCreatePopupMenu 4027 #define XCALL_XmCreatePromptDialog 4028 #define XCALL_XmCreatePulldownMenu 4029 #define XCALL_XmCreatePushButton 4030 #define XCALL_XmCreatePushButtonGadget 4031 #define XCALL_XmCreateQuestionDialog 4032 #define XCALL_XmCreateRadioBox 4033 #define XCALL_XmCreateRowColumn 4034 #define XCALL_XmCreateScale 4035 #define XCALL_XmCreateScrollBar 4036 #define XCALL_XmCreateScrolledList 4037 #define XCALL_XmCreateScrolledText 4038 #define XCALL_XmCreateScrolledWindow 4039 #define XCALL_XmCreateSelectionBox 4040 #define XCALL_XmCreateSelectionDialog 4041 #define XCALL_XmCreateSeparator 4042 #define XCALL_XmCreateSeparatorGadget 4043 #define XCALL_XmCreateSimpleCheckBox 4044 #define XCALL_XmCreateSimpleMenuBar 4045 #define XCALL_XmCreateSimpleOptionMenu 4046 #define XCALL_XmCreateSimplePopupMenu 4047 #define XCALL_XmCreateSimplePulldownMenu 4048 #define XCALL_XmCreateSimpleRadioBox 4049 #define XCALL_XmCreateText 4050 #define XCALL_XmCreateTextField 4051 #define XCALL_XmCreateToggleButton 4052 #define XCALL_XmCreateToggleButtonGadget 4053 #define XCALL_XmCreateWarningDialog 4054 #define XCALL_XmCreateWorkArea 4055 #define XCALL_XmCreateWorkingDialog 4056 #define XCALL_XmCascadeButtonHighlight 4060 #define XCALL_XmCommandError 4061 #define XCALL_XmCommandGetChild 4062 #define XCALL_XmFileSelectionBoxGetChild 4063 #define XCALL_XmFileSelectionDoSearch 4064 #define XCALL_XmIsSomething 4080 #define XCALL_XmMainWindowSetAreas 4100 #define XCALL_XmMainWindowSepX 4101 #define XCALL_XmMessageBoxGetChild 4105 #define XCALL_XmOptionButtonGadget 4106 #define XCALL_XmOptionLabelGadget 4107 #define XCALL_XmSelectionBoxGetChild 4108 #define XCALL_XmSetMenuCursor 4200 #define XCALL_XmScrolledWindowSetAreas 4201 #define XCALL_XmTextGetString 4202 #define XCALL_XmTextSetString 4203 #define XCALL_XmTextSetInsertionPosition 4204 #define XCALL_XmTrackingLocate 4210 #define XCALL_XmUpdateDisplay 4211 /* XmText widget 4300 */ /* XmTextClearSelection 4300 */ /* XmTextCopy 4301 */ /* XmTextCut 4302 */ #define XCALL_XmTextGetAddMode 4303 #define XCALL_XmTextGetBaseline 4304 #define XCALL_XmTextGetCursorPosition 4305 #define XCALL_XmTextGetEditable 4306 #define XCALL_XmTextGetInsertionPosition 4307 #define XCALL_XmTextGetLastPosition 4308 #define XCALL_XmTextGetMaxLength 4309 #define XCALL_XmTextGetSelection 4310 /* XmTextGetSelectionPosition 4311 */ /* XCALL_XmTextGetString defined above */ /* XmTextGetSource 4313 */ #define XCALL_XmTextGetTopCharacter 4314 #define XCALL_XmTextInsert 4315 #define XCALL_XmTextPaste 4316 /* XmTextPosToXY 4317 */ #define XCALL_XmTextRemove 4318 #define XCALL_XmTextReplace 4319 #define XCALL_XmTextScroll 4320 #define XCALL_XmTextSetAddMode 4321 #define XCALL_XmTextSetCursorPosition 4322 #define XCALL_XmTextSetEditable 4323 /* XmTextSetHighlight 4324 */ /* XCALL_XmTextSetInsertionPosition defined above */ #define XCALL_XmTextSetMaxLength 4326 /* XmTextSetSelection 4327 */ /* XmTextSetSource 4328 */ /* XCALL_XmTextSetString defined above */ #define XCALL_XmTextSetTopCharacter 4330 #define XCALL_XmTextShowPosition 4331 #define XCALL_XmTextXYToPos 4332 #if 0 /* should think about adding the following sometime, but */ /* they are not supported by the (SUNOS) 1.1.4a toolkit */ extern int XmTextGetSubstring() extern int XmTextGetSubstringWcs() extern wchar_t * XmTextGetStringWcs() extern void XmTextSetStringWcs() extern void XmTextReplaceWcs() extern void XmTextInsertWcs() extern wchar_t * XmTextGetSelectionWcs() extern void XmTextDisableRedisplay() extern void XmTextEnableRedisplay() extern Boolean XmTextFindString() extern Boolean XmTextFindStringWcs() #endif /* XmTextField widget 4350 */ /* XmTextFieldClearSelection 4350 */ /* XmTextFieldCopy 4351 */ /* XmTextFieldCut 4352 */ #define XCALL_XmTextFieldGetAddMode 4353 #define XCALL_XmTextFieldGetBaseline 4354 #define XCALL_XmTextFieldGetCursorPosition 4355 #define XCALL_XmTextFieldGetEditable 4356 #define XCALL_XmTextFieldGetInsertionPosition 4357 #define XCALL_XmTextFieldGetLastPosition 4358 #define XCALL_XmTextFieldGetMaxLength 4359 #define XCALL_XmTextFieldGetSelection 4360 /* XmTextFieldGetSelectionPosition 4361 */ #define XCALL_XmTextFieldGetString 4362 #define XCALL_XmTextFieldInsert 4363 #define XCALL_XmTextFieldPaste 4364 /* XmTextFieldPosToXY 4365 */ #define XCALL_XmTextFieldRemove 4366 #define XCALL_XmTextFieldReplace 4367 #define XCALL_XmTextFieldSetAddMode 4368 #define XCALL_XmTextFieldSetCursorPosition 4369 #define XCALL_XmTextFieldSetEditable 4370 /* XmTextFieldSetHighlight 4371 */ #define XCALL_XmTextFieldSetInsertionPosition 4372 #define XCALL_XmTextFieldSetMaxLength 4373 /* XmTextFieldSetSelection 4374 */ #define XCALL_XmTextFieldSetString 4375 #define XCALL_XmTextFieldShowPosition 4376 #define XCALL_XmTextFieldXYToPos 4377 #if 0 /* should think about adding the following sometime, but */ /* they are not supported by the (SUNOS) 1.1.4a toolkit */ extern int XmTextFieldGetSubstring() extern wchar_t * XmTextFieldGetStringWcs() extern int XmTextFieldGetSubstringWcs() extern void XmTextFieldSetStringWcs() extern void XmTextFieldReplaceWcs() extern void XmTextFieldInsertWcs() extern wchar_t * XmTextFieldGetSelectionWcs() #endif /* XmList widget 4400 */ #define XCALL_XmListAddItem 4400 #define XCALL_XmListAddItemUnselected 4401 #define XCALL_XmListAddItems 4402 #define XCALL_XmListDeleteAllItems 4403 #define XCALL_XmListDeleteItem 4404 #define XCALL_XmListDeleteItems 4405 #define XCALL_XmListDeletePos 4406 #define XCALL_XmListDeleteItemsPos 4407 #define XCALL_XmListDeselectAllItems 4408 #define XCALL_XmListDeselectItem 4409 #define XCALL_XmListDeselectPos 4410 #define XCALL_XmListGetMatchPos 4411 #define XCALL_XmListGetSelectedPos 4412 #define XCALL_XmListItemExists 4413 #define XCALL_XmListItemPos 4414 #define XCALL_XmListReplaceItems 4415 #define XCALL_XmListReplaceItemsPos 4416 #define XCALL_XmListSelectItem 4417 #define XCALL_XmListSelectPos 4418 #define XCALL_XmListSetAddMode 4419 #define XCALL_XmListSetBottomItem 4420 #define XCALL_XmListSetBottomPos 4421 #define XCALL_XmListSetHorizPos 4422 #define XCALL_XmListSetItem 4423 #define XCALL_XmListSetPos 4424 /* Added by DCJM. 23/3/01. */ #define XCALL_XmMenuPosition 4500 #if 0 /* Not supported by the SUNOS version of the tool-kit */ #define XCALL_XmListAddItemsUnselected #define XCALL_XmListDeletePositions #define XCALL_XmListGetKbdItemPos #define XCALL_XmListPosSelected #define XCALL_XmListReplaceItemsPosUnselected #define XCALL_XmListReplaceItemsPositions #define XCALL_XmListSetKbdItemPos #define XCALL_XmListUpdateSelectedList #define XCALL_XmListYToPos #define XCALL_XmListPosToBounds #endif polyml-5.6/libpolyml/xwindows.cpp000066400000000000000000011525221265146633400173130ustar00rootroot00000000000000/* Title: X-Windows/Motif Interface. Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #if (defined(WITH_XWINDOWS)) // X-Windows is required. /* xwindows.c */ /* Removed indirection from get_C_* functions SPF 31/10/93 */ /* Added Handle type 2/11/93 */ /* Fixed "GetString can only be used once" bug 17/11/93 */ /* Dealing with gcc warning messages SPF 6/1/94 */ /* Retrofit to old Sun cc SPF 7/1/94 */ /* 25/1/94 SPF Fixed bug in EmptyVisual (core-dump when v==NULL) */ /* Comment added 4/11/93 SPF Global Invariants: (1) Get functions promise not to allocate on the Poly/ML heap (2) The Poly/ML heap contains pointers into the C heap! As these are only valid for one session, the run-time system records which Poly/ML objects have been created in the current session. Only these objects contain valid C pointers, and so may be dereferenced. The "bad" Poly/ML objects are: Flags Object Bad Field Access Function ----- ------ --------- --------------- M X_GC_Object GC *gc GetGC X_Font_Object Font *font GetFont ditto XFontStruct **fs GetFS X_Cursor_Object Cursor *cursor GetCursor BM X_Window_Object Drawable *drawable GetDrawable, GetPixmap X_Pixmap_Object Pixmap *pixmap GetDrawable, GetPixmap X_Colormap_Object Colormap *cmap GetColormap X_Visual_Object Visual **visual GetVisual (* FISHY *) B X_Display_Object Display *display (?) GetDisplay (?) ditto XtAppContext app_context NONE(?) M X_Widget_Object Widget *widget GetWidget, GetNWidget B X_Trans_Object XtTranslations table GetTrans B X_Acc_Object XtAccelerators acc GetAcc WARNING: the above list of unsafe fields was created by SPF and may be incomplete. The function CheckExists should be called on these objects before it is safe to use any of the above fields. That's because the object may have been created in a previous ML session, so the pointers that it contains may no longer be valid. Using the appropriate access function listed above guarantees that CheckExists is called. Exception: the fields can safely be tested against C's zero (None, Null) even if CheckExists hasn't been called. Note that this is only database-safe because this value is used for uninitialised fields, so it doesn't confuse the garbage-collector. For all the above fields EXCEPT display, app_context, table, acc the run-time system creates an indirection object in the Poly heap. These fields don't need an indirection object because the object which contains them is itself a BYTE object. This indirection is a byte-object. The indirection is necessary because the garbage collector would object to finding a C pointer in a standard ML labelled record. The alternative would be to store the C pointer as an ML integer, but then we would have to convert back to a C pointer befor we could dereference it. For similar reasons, eventMask is also stored as a boxed PolyWord. abstype Colormap = Colormap with end; (* X_Colormap_Object *) abstype Cursor = Cursor with end; (* X_Cursor_Object *) abstype Drawable = Drawable with end; (* X_Window_Object, XPixmap_Object *) abstype Font = Font with end; (* X_Font_Object *) abstype GC = GC with end; (* X_GC_Object *) abstype Visual = Visual with end; (* X_Visual_Object *) abstype Display = Display with end; (* X_Display_Object *) abstype Widget = Widget of int with end; abstype XtAccelerators = XtAccelerators of int with end; abstype XtTranslations = XtTranslations of int with end; */ /* MLXPoint, MLXRectangle, MLXArc, MLPair, MLTriple added 31/10/93 SPF */ #ifdef HAVE_STDIO_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_CTYPE_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_ASSERT_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_ALLOCA_H #include #endif #ifdef HAVE_ERRNO_H #include #endif /* what goes wrong? ... gid, fd, private15 inaccessible */ /* THIS NEEDS TO BE FIXED!!!! */ #define XLIB_ILLEGAL_ACCESS 1 /* We need access to some opaque structures */ /* use prototypes, but make sure we get Booleans, not ints */ #define NeedWidePrototypes 0 #include #include /* IsCursorKey, IsFunctionKey, et cetera */ #include /* needed for protocol names such as X_CreateWindow */ #include /* XA_ATOM, et cetera */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Motif 1.2 */ #include /* for XmIsDesktopObject */ #include /* for XmIsExtObject */ #include /* for XmIsShellExt */ #include /* for XmIsVendorShellExt */ #include #if(0) /* for XmIsWorldObject */ /* This is not supported in FreeBSD or Solaris 8. */ #include #endif #include "globals.h" #include "sys.h" #include "xwindows.h" #include "run_time.h" #include "arb.h" #include "mpoly.h" #include "gc.h" #include "xcall_numbers.h" #include "diagnostics.h" #include "processes.h" #include "rts_module.h" #include "save_vec.h" #include "polystring.h" #include "scanaddrs.h" #include "memmgr.h" #include "machine_dep.h" #include "processes.h" /* The following are only forward so we can declare attributes */ static void RaiseXWindows(TaskData *taskData, const char *s) __attribute__((noreturn)); #define ButtonClickMask (((unsigned)1 << 31)) #define XMASK(m) ((m) &~ButtonClickMask) #undef SIZEOF #define debug1(fmt,p1) { /*EMPTY*/ } #undef debug1 #define debug1(fmt,p1) {if (debugOptions & DEBUG_X) printf(fmt,p1);} #define debug3(fmt,p1,p2,p3) {if (debugOptions & DEBUG_X) printf(fmt,p1,p2,p3);} #define debugCreate(type,value) debug1("%lx " #type " created\n",(unsigned long)(value)) #define debugReclaim(type,value) debug1("%lx " #type " reclaimed\n",(unsigned long)(value)) #define debugReclaimRef(type,value) debug1("%lx " #type " reference reclaimed\n",(unsigned long)(value)) #define debugRefer(type,value) debug1("%lx " #type " referenced\n",(unsigned long)(value)) #define debugCreateCallback(MLValue,CValue,CListCell) debug3("%p Widget callback reference created (%p,%p)\n",CValue,CListCell,MLValue) #define debugReclaimCallback(MLValue,CValue,CListCell) debug3("%p Widget callback reference removed (%p,%p)\n",CValue,CListCell,MLValue) /* forward declarations */ static Atom WM_DELETE_WINDOW(Display *d); /* was int SPF 6/1/94 */ #define DEREFDISPLAYHANDLE(h) ((X_Display_Object *)DEREFHANDLE(h)) #define DEREFWINDOWHANDLE(h) ((X_Window_Object *)DEREFHANDLE(h)) #define DEREFXOBJECTHANDLE(h) ((X_Object *)DEREFHANDLE(h)) #define SAVE(x) taskData->saveVec.push(x) #define Make_int(x) Make_arbitrary_precision(taskData, x) #define Make_string(s) SAVE(C_string_to_Poly(taskData, s)) #define Make_bool(b) Make_arbitrary_precision(taskData, (b) != 0) #define SIZEOF(x) (sizeof(x)/sizeof(PolyWord)) #define min(a,b) (a < b ? a : b) #define max(a,b) (a > b ? a : b) #define ISNIL(p) (ML_Cons_Cell::IsNull(p)) #define NONNIL(p) (!ISNIL(p)) typedef Handle EventHandle; /********************************************************************************/ /* Objects are created MUTABLE and are FINISHED when all their fields have been */ /* filled in (assuming they are immutable objects). This is so that we can */ /* consider the possibility of storing immutable objects in read-only memory */ /* segments (not currently implemented). SPF 7/12/93 */ /********************************************************************************/ static Handle FINISHED(TaskData *taskData, Handle P) { PolyObject *pt = DEREFHANDLE(P); assert(taskData->saveVec.isValidHandle(P)); assert(pt->IsMutable()); POLYUNSIGNED lengthW = pt->LengthWord(); pt->SetLengthWord(lengthW & ~_OBJ_MUTABLE_BIT); return P; } static void RaiseXWindows(TaskData *taskData, const char *s) { if (mainThreadPhase == MTP_USER_CODE) { raise_exception_string(taskData, EXC_XWindows,s); } else { /* Crash added 7/7/94 SPF */ Crash("Tried to raise exception (XWindows \"%s\") during garbage collection\n",s); } /*NOTREACHED*/ } /* bugfixed 6/12/94 SPF */ #define RaiseXWindows2(varmessage,constmessage) \ { \ const char message[] = constmessage; \ int n1 = strlen(varmessage); \ int n2 = strlen(message); \ char *mess = (char *)alloca(n1 + n2 + 1); \ strcat(strncpy(mess,varmessage,n1),message); \ RaiseXWindows(taskData, mess); \ /*NOTREACHED*/ \ } static void RaiseRange(TaskData *taskData) { raise_exception0(taskData, EXC_size); } typedef unsigned char uchar; static uchar get_C_uchar(TaskData *taskData, PolyWord a) { unsigned u = get_C_ushort(taskData, a); if (u >= 256) RaiseRange(taskData); return u; } /******************************************************************************/ /* */ /* String */ /* */ /******************************************************************************/ //#define String PolyStringObject //#define GetString(s) _GetString((PolyWord *)(s)) /* can only be called TABLESIZE times per X opcode */ static PolyStringObject *GetString(PolyWord s) { #define TABLESIZE 5 static PolyStringObject string[TABLESIZE]; static int index = 0; if (! s.IsTagged()) return (PolyStringObject *) s.AsObjPtr(); index = (index + 1) % TABLESIZE; string[index].length = 1; string[index].chars[0] = UNTAGGED(s); return &string[index]; #undef TABLESIZE } /******************************************************************************/ /* */ /* XObjects (Type definitions) */ /* */ /******************************************************************************/ /* We keep a list of all objects created by calls to X. */ /* When an object is created we add an entry to the list and */ /* return the entry. If the entry becomes inaccessible */ /* by the garbage collector then we free the object. */ /* The list is created by malloc so that it is not in the heap. */ // Types of objects. These are tagged when they are stored // in objects because some objects are not byte objects. typedef enum { X_GC = 111, X_Font = 222, X_Cursor = 333, X_Window = 444, X_Pixmap = 555, X_Colormap = 666, X_Visual = 777, X_Display = 888, X_Widget = 999, X_Trans = 1111, X_Acc = 2222 } X_types; class X_Object: public PolyObject { public: X_Object(): type(TAGGED(1)) {} // Just to keep gcc happy PolyWord type; }; class X_Trans_Object: public X_Object /* BYTE object */ { public: XtTranslations table; /* C value */ }; class X_Acc_Object: public X_Object /* BYTE object */ { public: XtAccelerators acc; /* C value */ }; class X_Display_Object: public X_Object /* BYTE object */ { public: Display *display; /* C value */ unsigned screen; /* C value */ XtAppContext app_context; /* C value */ } ; class X_Font_Object: public X_Object { public: Font *font; /* Token for C value */ XFontStruct **fs; /* Token for C value */ X_Display_Object *ds; /* Token */ } ; class X_Cursor_Object: public X_Object { public: Cursor *cursor; /* Token for C value */ X_Display_Object *ds; /* Token */ } ; class X_Pixmap_Object: public X_Object { public: Pixmap *pixmap; /* Token for C value */ X_Display_Object *ds; /* Token */ } ; class X_Colormap_Object: public X_Object { public: Colormap *cmap; /* Token for C value */ X_Display_Object *ds; /* Token */ } ; class X_Widget_Object: public X_Object /* MUTABLE */ { public: Widget *widget; /* Token for C value */ PolyWord callbackList; /* mutable */ PolyWord state; /* mutable */ X_Display_Object *ds; /* Token */ } ; class X_Visual_Object: public X_Object { public: Visual **visual; /* Token for C value */ X_Display_Object *ds; /* Token */ } ; class X_GC_Object: public X_Object /* MUTABLE */ { public: GC *gc; /* Token for C value */ X_Font_Object *font_object; /* mutable; may be 0 */ X_Pixmap_Object *tile; /* mutable; may be 0 */ X_Pixmap_Object *stipple; /* mutable; may be 0 */ X_Pixmap_Object *clipMask; /* mutable; may be 0 */ X_Display_Object *ds; /* Token */ } ; class X_Window_Struct: public X_Object /* MUTABLE */ { public: Drawable *drawable; /* Token for C value */ PolyWord handler; /* mutable? */ PolyWord state; /* mutable? */ PolyObject *eventMask; /* Token for C value; token itself is mutable */ X_Colormap_Object *colormap_object; /* mutable; may be 0 */ X_Cursor_Object *cursor_object; /* mutable; may be 0 */ X_Pixmap_Object *backgroundPixmap; /* mutable; may be 0 */ X_Pixmap_Object *borderPixmap; /* mutable; may be 0 */ X_Window_Struct *parent; /* may be 0 */ X_Display_Object *ds; /* Token */ }; typedef X_Window_Struct X_Window_Object; /******************************************************************************/ /* */ /* Forward declarations */ /* */ /******************************************************************************/ static Font GetFont(TaskData *taskData, X_Object *P); static Cursor GetCursor(TaskData *taskData,X_Object *P); static Colormap GetColormap(TaskData *taskData,X_Object *P); static Visual *GetVisual(TaskData *taskData,X_Object *P); static XtTranslations GetTrans(TaskData *taskData,X_Object *P); static XtAccelerators GetAcc(TaskData *taskData,X_Object *P); static Pixmap GetPixmap(TaskData *, X_Object *P); static Widget GetNWidget(TaskData *, X_Object *P); static Window GetWindow(TaskData *, X_Object *P); static Display *GetDisplay(TaskData *, X_Object *P); static void DestroyWindow(X_Object *W); static void DestroySubwindows(X_Object *W); static X_GC_Object *GCObject(X_Object *P); static X_Pixmap_Object *PixmapObject(X_Object *P); static X_Widget_Object *WidgetObject(TaskData *, X_Object *P); static X_Window_Object *WindowObject(X_Object *P); /******************************************************************************/ /* */ /* C lists (Type definitions) */ /* */ /******************************************************************************/ typedef struct X_List_struct X_List; struct X_List_struct { X_List *next; /* pointer into C heap */ X_Object *object; /* pointer into Poly heap; weak */ }; typedef struct timeval TimeVal; /* In C heap */ typedef struct T_List_struct T_List; struct T_List_struct { T_List *next; /* pointer into C heap */ TimeVal timeout; /* here */ X_Window_Object *window_object; /* pointer into Poly heap, or 0; weak */ X_Widget_Object *widget_object; /* pointer into Poly heap, or 0; strong */ PolyObject *alpha; /* pointer into Poly heap; strong */ PolyObject *handler; /* pointer into Poly heap; strong */ int expired; /* here */ }; /* NB precisely one of window_object and widget_object should be non-zero */ /* In C heap */ typedef struct C_List_struct C_List; struct C_List_struct { PolyObject *function; /* pointer into Poly heap; strong */ X_Widget_Object *widget_object; /* pointer into Poly heap; strong */ C_List *next; /* pointer into C heap */ }; /* lists of X objects currently in Poly heap i.e. those created in this session */ #define XLISTSIZE 1001 /* must be coprime to 4 ('cos pointers are PolyWord-aligned) */ static X_List *XList[XLISTSIZE] = {0}; static T_List *TList = 0; /* C pending messages list, ordered by arrival time */ static C_List *CList = 0; /* Acts as root for objects "owned" by C callbacks */ static PolyWord FList = TAGGED(0); /* ML Callback list - acts as a Root for the Heap */ static PolyWord GList = TAGGED(0); /* ML Event list - acts as a Root for the Heap */ static Bool callbacks_enabled = False; /******************************************************************************/ /* */ /* High-speed XList routines */ /* */ /******************************************************************************/ /* maps an (X_Object *) to an (unsigned); this mapping from must give the same */ /* (unsigned) for each (X_Object) for an entire Poly/ML session, even though its */ /* address may change at every garbage collection. */ /* The way we achieve this is by returning the address of the corresponding C */ /* object. Note that since the ML object doesn't necessarily correspond to a real*/ /* C object, this value may be neither valid nor sensible (but it WILL be a */ /* constant). */ /* Unfortunately, we can't do this for GCs or VISUALS, since the actual C object */ /* contains the id we want, and we can't access the id if we haven't got the */ /* object. For these, we return a constant instead. */ static unsigned long hashId(X_Object *P) { #define HASH_GC 0 #define HASH_VISUAL 1 switch(UNTAGGED(P->type)) { case X_GC: return HASH_GC; case X_Font: return (unsigned long)(*(((X_Font_Object*)P)->font)); case X_Cursor: return (unsigned long)(*(((X_Cursor_Object*)P)->cursor)); case X_Window: return (unsigned long)(*(((X_Window_Struct*)P)->drawable)); case X_Pixmap: return (unsigned long)(*(((X_Pixmap_Object*)P)->pixmap)); case X_Colormap: return (unsigned long)(*(((X_Colormap_Object*)P)->cmap)); case X_Visual: return HASH_VISUAL; case X_Display: return (unsigned long)(((X_Display_Object*)P)->display); case X_Widget: return (unsigned long)(*(((X_Widget_Object*)P)->widget)); case X_Trans: return (unsigned long)(((X_Trans_Object*)P)->table); case X_Acc: return (unsigned long)(((X_Acc_Object*)P)->acc); default: Crash ("Bad X_Object type (%d) in hashId",UNTAGGED(P->type)); } /*NOTREACHED*/ } static void initXList(void) { int i; for (i = 0; i < XLISTSIZE; i++) { XList[i] = NULL; } } static X_List **hashXList(X_Object *P) { unsigned long id = hashId(P); unsigned n = (id % XLISTSIZE); /* a poor hash function, but good enough for now */ return &(XList[n]); } static X_List *findXList(unsigned long id) { unsigned n = (id % XLISTSIZE); /* a poor hash function, but good enough for now */ return XList[n]; } /******************************************************************************/ /* */ /* C lists (Polymorphic functions) */ /* */ /******************************************************************************/ // Creates a list from a vector of items. static Handle CreateList4(TaskData *taskData, unsigned n, void *p, unsigned objSize, Handle (*f)(TaskData *, void *)) { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); // Process the vector in reverse order. That way we can make the // cells as immutable objects rather than having to create them as // mutable and then lock them. while (n) { n--; byte *objP = (byte*)p + objSize*n; Handle value = (* f)(taskData, objP); Handle next = alloc_and_save(taskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); /* reset save vector to stop it overflowing */ taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } static Handle CreateList4I(TaskData *taskData, unsigned n, void *p, unsigned objSize, Handle (*f)(TaskData *, void *, unsigned i)) { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); while (n) { n--; byte *objP = (byte*)p + objSize*n; Handle value = (* f)(taskData, objP, n); Handle next = alloc_and_save(taskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); /* reset save vector to stop it overflowing */ taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } static Handle CreateList5(TaskData *taskData, POLYUNSIGNED n, void *p, POLYUNSIGNED objSize, Handle (*f)(TaskData *, void *, Handle), Handle a1) { Handle saved = taskData->saveVec.mark(); Handle list = SAVE(ListNull); // Process the vector in reverse order. That way we can make the // cells as immutable objects rather than having to create them as // mutable and then lock them. while (n) { n--; byte *objP = (byte*)p + objSize*n; Handle value = (* f)(taskData, objP, a1); Handle next = alloc_and_save(taskData, SIZEOF(ML_Cons_Cell)); DEREFLISTHANDLE(next)->h = DEREFWORDHANDLE(value); DEREFLISTHANDLE(next)->t = DEREFLISTHANDLE(list); /* reset save vector to stop it overflowing */ taskData->saveVec.reset(saved); list = SAVE(DEREFHANDLE(next)); } return list; } static void GetList4(TaskData *taskData, PolyWord list, void *v, unsigned bytes, void (*get)(TaskData *, PolyWord, void*, unsigned)) { unsigned i = 0; byte *s = (byte*)v; for(PolyWord p = list; NONNIL(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) { (* get)(taskData, ((ML_Cons_Cell*)p.AsObjPtr())->h, s, i); s += bytes; i++; } } /* ListLength no longer requires indirection via handle SPF 4/11/93 */ static unsigned ListLength(PolyWord list) { unsigned n = 0; for(PolyWord p = list; NONNIL(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) n++; return n; } /******************************************************************************/ /* */ /* TList Purge Functions (SPF 29/11/93) */ /* */ /******************************************************************************/ static void PurgePendingWidgetMessages(X_Widget_Object *P) { T_List **T = &TList; while(*T) { T_List *t = *T; if (t->widget_object == P) /* clear out pending messages for this widget */ { *T = t->next; free(t); } else T = &t->next; } } static void PurgePendingWindowMessages(X_Window_Object *P) { T_List **T = &TList; while(*T) { T_List *t = *T; if (t->window_object == P) /* clear out pending messages for this window */ { *T = t->next; free(t); } else T = &t->next; } } /******************************************************************************/ /* */ /* CList Purge Functions (SPF 29/2/96) */ /* */ /******************************************************************************/ static void PurgeCCallbacks(X_Widget_Object *P, Widget w) { C_List **C = &CList; while(*C) { C_List *c = *C; if (c->widget_object == P) /* clear out callback info for this widget */ { debugReclaimCallback(P,w,c); *C = c->next; free(c); } else C = &c->next; } } /******************************************************************************/ /* */ /* XObjects (Polymorphic functions 1) */ /* */ /******************************************************************************/ static int ResourceExists(X_Object *P) { X_List *L; for(L = *hashXList(P); L; L = L->next) { if (L->object == P) return 1; } return 0; } /* SafeResourceExists is like ResourceExists but doesn't assume that we actually have a valid X object, so it doesn't use hashing. SPF 6/4/95 */ static int SafeResourceExists(X_Object *P) { unsigned n; for (n = 0; n < XLISTSIZE; n++) { X_List *L; for(L = XList[n]; L; L = L->next) { if (L->object == P) return 1; } } return 0; } static void DestroyXObject(X_Object *P) { TaskData *taskData = processes->GetTaskDataForThread(); X_List **X = hashXList(P); switch(UNTAGGED(P->type)) { case X_GC: { X_GC_Object *G = GCObject(P); GC gc = *G->gc; Display *d = G->ds->display; if (gc == DefaultGC(d,G->ds->screen)) { debugReclaimRef(GC,gc->gid); } else { debugReclaim(GC,gc->gid); XFreeGC(d,gc); /* SAFE(?) */ } break; } case X_Font: { Font f = GetFont(taskData, P); if (f == None) { debugReclaimRef(Font,f); } else { debugReclaim(Font,f); #if NEVER XUnloadFont(GetDisplay(taskData, P),f); #endif } break; } case X_Cursor: { Cursor cursor = GetCursor(taskData, P); if (cursor == None) { debugReclaimRef(Cursor,cursor); } else { debugReclaim(Cursor,cursor); #if NEVER XFreeCursor(GetDisplay(taskData, P),cursor); #endif } break; } case X_Window: { /* added 29/11/93 SPF */ PurgePendingWindowMessages(WindowObject(P)); if (((X_Window_Object *)P)->parent != 0) /* this clients window */ { debugReclaim(Window,GetWindow(taskData, P)); DestroyWindow(P); } else /* None, ParentRelative, and other clients windows */ { debugReclaimRef(Window,GetWindow(taskData, P)); } break; } case X_Pixmap: { Pixmap pixmap = GetPixmap(taskData, P); if (pixmap == None) { debugReclaimRef(Pixmap,pixmap); } else { debugReclaim(Pixmap,pixmap); #if NEVER XFreePixmap(GetDisplay(taskData, P),pixmap); #endif } break; } case X_Colormap: { Colormap cmap = GetColormap(taskData, P); if (cmap == None) { debugReclaimRef(Colormap,cmap); } else { debugReclaim(Colormap,cmap); #if NEVER XFreeColormap(GetDisplay(taskData, P),cmap); #endif } break; } case X_Visual: { Visual *visual = GetVisual(taskData, P); debugReclaimRef(Visual,visual->visualid); break; } case X_Widget: { Widget widget = GetNWidget(taskData, P); PurgePendingWidgetMessages(WidgetObject(taskData, P)); debugReclaimRef(Widget,widget); break; } case X_Trans: { XtTranslations table = GetTrans(taskData, P); debugReclaimRef(Trans,table); break; } case X_Acc: { XtAccelerators acc = GetAcc(taskData, (X_Object *)P); debugReclaimRef(Acc,acc); break; } default: Crash ("Unknown X_Object type %d",UNTAGGED(P->type)); } while(*X) { X_List *L = *X; if (L->object == P) { *X = L->next; free(L); return; } else X = &L->next; } printf("DestroyXObject: destroy failed\n"); } #define CheckExists(P,resource) \ {\ if (! ResourceExists(P)) RaiseXWindows(taskData, (char*) "Non-existent " #resource); \ } static X_Font_Object *FontObject(X_Object *P) { assert(UNTAGGED(P->type) == X_Font); return (X_Font_Object *)P; } static X_Object *FindResource ( Handle dsHandle, /* Handle to (X_Display_Object *) */ X_types type, unsigned long id, unsigned long hashid ) { X_List *L; X_Display_Object *d = (type == X_Widget) ? NULL : DEREFDISPLAYHANDLE(dsHandle); for(L = findXList(hashid); L; L = L->next) { X_Object *P = L->object; if (UNTAGGED(P->type) == type) { switch(type) { case X_GC: if (((X_GC_Object*)P)->ds == d && (*((X_GC_Object*)P)->gc)->gid == id) return P; break; case X_Font: if (((X_Font_Object*)P)->ds == d && (*((X_Font_Object*)P)->font) == id) return P; break; case X_Cursor: if (((X_Cursor_Object*)P)->ds == d && (*((X_Cursor_Object*)P)->cursor) == id) return P; break; case X_Window: if (((X_Window_Object*)P)->ds == d && (*((X_Window_Object*)P)->drawable) == id) return P; break; case X_Pixmap: if (((X_Pixmap_Object*)P)->ds == d && (*((X_Pixmap_Object*)P)->pixmap) == id) return P; break; case X_Colormap: if (((X_Colormap_Object*)P)->ds == d && (*((X_Colormap_Object*)P)->cmap) == id) return P; break; case X_Visual: if (((X_Visual_Object*)P)->ds == d && (*((X_Visual_Object*)P)->visual)->visualid == id) return P; break; case X_Widget: if (*(((X_Widget_Object*)P)->widget) == (Widget) id) return P; break; case X_Display: break; case X_Trans: break; case X_Acc: break; default: Crash ("Bad X_Object type (%d) in FindResource", type); } } } return 0; } // Why are there these casts to unsigned here???? #define FindWindow(d,id) ((X_Window_Object *) FindResource(d,X_Window,(unsigned long)id,(unsigned long)id)) #define FindPixmap(d,id) ((X_Pixmap_Object *) FindResource(d,X_Pixmap,(unsigned long)id,(unsigned long)id)) #define FindCursor(d,id) ((X_Cursor_Object *) FindResource(d,X_Cursor,(unsigned long)id,(unsigned long)id)) #define FindFont(d,id) ((X_Font_Object *) FindResource(d,X_Font,(unsigned long)id,(unsigned long)id)) #define FindColormap(d,id) ((X_Colormap_Object *) FindResource(d,X_Colormap,(unsigned long)id,(unsigned long)id)) #define FindWidget(id) ((X_Widget_Object *) FindResource((Handle)NULL,X_Widget,(unsigned long)id,(unsigned long)id)) /* can't use id for hashing in the following, so use arbitrary values instead */ #define FindGC(d,id) ((X_GC_Object *) FindResource(d,X_GC,(unsigned long)id,HASH_GC)) #define FindVisual(d,id) ((X_Visual_Object *) FindResource(d,X_Visual,(unsigned long)id,HASH_VISUAL)) static Handle AddXObject(Handle objectHandle) { X_List **X = hashXList(DEREFXOBJECTHANDLE(objectHandle)); X_List *L = (X_List *) malloc(sizeof(X_List)); L->next = *X; L->object = (X_Object *)DEREFHANDLE(objectHandle); *X = L; return objectHandle; } /******************************************************************************/ /* */ /* MLXPoint - implements ML XPoint datatype */ /* */ /******************************************************************************/ typedef struct /* depends on XPoint datatype + ML compiler hash function */ { PolyWord x; /* ML int */ PolyWord y; /* ML int */ } MLXPoint; inline MLXPoint * Point(PolyWord p) { return (MLXPoint *) p.AsObjPtr(); } /* shouldn't these be long values? */ inline short GetPointX(TaskData *taskData, PolyWord p) { return get_C_short(taskData, Point(p)->x); } inline short GetPointY(TaskData *taskData, PolyWord p) { return get_C_short(taskData, Point(p)->y); } inline short GetOffsetX(TaskData *taskData, PolyWord p) { return get_C_ushort(taskData, Point(p)->x); } inline short GetOffsetY(TaskData *taskData, PolyWord p) { return get_C_ushort(taskData, Point(p)->y); } static Handle CreatePoint(TaskData *taskData, int x, int y) { Handle pointHandle = alloc_and_save(taskData, SIZEOF(MLXPoint), F_MUTABLE_BIT); /* Still allocating, so must use explicit DEREF for each element */ #define point ((MLXPoint *)DEREFHANDLE(pointHandle)) point->x = DEREFWORD(Make_int(x)); point->y = DEREFWORD(Make_int(y)); #undef point return FINISHED(taskData, pointHandle); } static void GetPoints(TaskData *taskData, PolyWord p, void *v, unsigned) { XPoint *A = (XPoint *)v; A->x = GetPointX(taskData, p); A->y = GetPointY(taskData, p); } /******************************************************************************/ /* */ /* MLXRectangle - implements ML XRectangle datatype */ /* */ /******************************************************************************/ typedef struct /* depends on XRectangle datatype + ML compiler hash function */ { PolyWord top; /* ML int */ PolyWord left; /* ML int */ PolyWord right; /* ML int */ PolyWord bottom; /* ML int */ } MLXRectangle; inline MLXRectangle *Rect(PolyWord R) { return (MLXRectangle *) R.AsObjPtr(); } inline short GetRectTop(TaskData *taskData, PolyWord R) { return get_C_short(taskData, Rect(R)->top); } inline short GetRectLeft(TaskData *taskData, PolyWord R) { return get_C_short(taskData, Rect(R)->left); } inline short GetRectRight(TaskData *taskData, PolyWord R) { return get_C_short(taskData, Rect(R)->right); } inline short GetRectBottom(TaskData *taskData, PolyWord R) { return get_C_short(taskData, Rect(R)->bottom); } #define GetRectX(taskData, R) GetRectLeft(taskData, R) #define GetRectY(taskData, R) GetRectTop(taskData, R) /* functions added 29/10/93 SPF */ static unsigned GetRectW(TaskData *taskData, PolyWord R) { long result = GetRectRight(taskData, R) - GetRectLeft(taskData, R); if (result < 0) RaiseRange(taskData); return (unsigned)result; } static unsigned GetRectH(TaskData *taskData, PolyWord R) { long result = GetRectBottom(taskData, R) - GetRectTop(taskData, R); if (result < 0) RaiseRange(taskData); return (unsigned)result; } /* static MLXRectangle **CreateRect(top,left,bottom,right) */ static Handle CreateRect(TaskData *taskData, int top, int left, int bottom, int right) { Handle rectHandle = alloc_and_save(taskData, SIZEOF(MLXRectangle), F_MUTABLE_BIT); /* Still allocating, so must use explicit DEREF for each element */ #define rect ((MLXRectangle *)DEREFHANDLE(rectHandle)) rect->top = DEREFWORD(Make_int(top)); rect->left = DEREFWORD(Make_int(left)); rect->right = DEREFWORD(Make_int(right)); rect->bottom = DEREFWORD(Make_int(bottom)); #undef rect return FINISHED(taskData, rectHandle); } #define CreateArea(w,h) CreateRect(taskData, 0,0,(int)h,(int)w) static void GetRects(TaskData *taskData, PolyWord p, void *v, unsigned) { XRectangle *A = (XRectangle *)v; A->x = GetRectX(taskData, p); A->y = GetRectY(taskData, p); A->width = GetRectW(taskData, p); A->height = GetRectH(taskData, p); } static void CheckZeroRect(TaskData *taskData, PolyWord R) { unsigned x = GetRectX(taskData, R); unsigned y = GetRectY(taskData, R); unsigned w = GetRectW(taskData, R); unsigned h = GetRectH(taskData, R); if (x != 0 || y != 0 || /* w <= 0 || h <= 0 || w,h now unsigned SPF 29/10/93 */ w == 0 || h == 0 || w > 65535 || h > 65535) RaiseRange(taskData); } /******************************************************************************/ /* */ /* MLXArc - implements ML XArc datatype */ /* */ /******************************************************************************/ /* MLXArc added 31/10/93 SPF; depends on ML XArc datatype */ typedef struct { PolyWord r; /* MMLXRectangle* */ PolyWord a1; /* ML int */ PolyWord a2; /* ML int */ } MLXArc; inline MLXArc *Arc(PolyWord A) { return (MLXArc *) A.AsObjPtr(); } inline PolyWord GetArcR(PolyWord A) { return Arc(A)->r; } inline short GetArcA1(TaskData *taskData, PolyWord A) { return get_C_short(taskData, Arc(A)->a1); } inline short GetArcA2(TaskData *taskData, PolyWord A) { return get_C_short(taskData, Arc(A)->a2); } static void GetArcs(TaskData *taskData, PolyWord p, void *v, unsigned) { XArc *A = (XArc *)v; A->x = GetRectX(taskData, GetArcR(p)); A->y = GetRectY(taskData, GetArcR(p)); A->width = GetRectW(taskData, GetArcR(p)); A->height = GetRectH(taskData, GetArcR(p)); A->angle1 = GetArcA1(taskData, p); A->angle2 = GetArcA2(taskData, p); } /******************************************************************************/ /* */ /* Colormap */ /* */ /******************************************************************************/ static X_Colormap_Object *ColormapObject(X_Object *P) { assert(UNTAGGED(P->type) == X_Colormap); return (X_Colormap_Object *)P; } static Colormap GetColormap(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Colormap); /* val NoColormap = xcall (23,0) : Colormap; */ /* special case for NoColormap - correct(?) */ if ( *(((X_Colormap_Object *)P)->cmap) == None) return None; CheckExists(P,colormap); return *(((X_Colormap_Object *)P)->cmap); } static Handle EmptyColormap ( TaskData *taskData, Handle dsHandle /* Handle to (X_Display_Object *) */, Colormap id ) { X_Colormap_Object *E = FindColormap(dsHandle,id); if (E) { return SAVE(E); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Colormap_Object), F_MUTABLE_BIT); Handle cmapHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT | F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Colormap_Object *object = (X_Colormap_Object *)DEREFHANDLE(objectHandle); Colormap *cmap = (Colormap *)DEREFHANDLE(cmapHandle); *cmap = id; FINISHED(taskData, cmapHandle); object->type = TAGGED(X_Colormap); object->cmap = cmap; object->ds = DEREFDISPLAYHANDLE(dsHandle); debugRefer(Colormap,id); return AddXObject(FINISHED(taskData, objectHandle)); } } /******************************************************************************/ /* */ /* Visual */ /* */ /******************************************************************************/ static Visual *GetVisual(TaskData *taskData, X_Object *P) { static Visual EMPTYVISUAL = { 0 }; assert(UNTAGGED(P->type) == X_Visual); /* val NoVisual = xcall (24,0) : Visual; */ /* special case for NoVisual */ if (*(((X_Visual_Object *)P)->visual) == None) return &EMPTYVISUAL; /* FISHY (?) */ CheckExists(P,visual); return *(((X_Visual_Object *)P)->visual); } static Handle EmptyVisual ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Visual *v ) { if (v != None) { X_Visual_Object *E = FindVisual(dsHandle,v->visualid); if (E) return SAVE(E); } /* else */ { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Visual_Object), F_MUTABLE_BIT); Handle visualHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Visual_Object *object = (X_Visual_Object *)DEREFHANDLE(objectHandle); Visual **visual = (Visual **)DEREFHANDLE(visualHandle); *visual = v; FINISHED(taskData, visualHandle); object->type = TAGGED(X_Visual); object->visual = visual; object->ds = DEREFDISPLAYHANDLE(dsHandle); debugRefer(Visual,(v == None) ? None : v->visualid); return AddXObject(FINISHED(taskData, objectHandle)); } } /******************************************************************************/ /* */ /* GC */ /* */ /******************************************************************************/ static X_GC_Object *GCObject(X_Object *P) { assert(UNTAGGED(P->type) == X_GC); return (X_GC_Object *)P; } static GC GetGC(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_GC); CheckExists(P,gc); return *(((X_GC_Object *)P)->gc); } static Handle GetDefaultGC(TaskData *taskData, Handle dsHandle /* Handle to (X_Display_Object *) */) { GC defaultGC = DefaultGC(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen); X_GC_Object *G = FindGC(dsHandle,defaultGC->gid); if (G) { return SAVE(G); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_GC_Object), F_MUTABLE_BIT); Handle GCHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_GC_Object *object = (X_GC_Object *)DEREFHANDLE(objectHandle); GC *gc = (GC *)DEREFHANDLE(GCHandle); *gc = defaultGC; FINISHED(taskData, GCHandle); debugRefer(GC,defaultGC->gid); object->type = TAGGED(X_GC); object->gc = gc; object->ds = DEREFDISPLAYHANDLE(dsHandle); /* object->font_object = 0; object->tile = 0; object->stipple = 0; object->clipMask = 0; */ return AddXObject(objectHandle); /* must stay MUTABLE */ } } static void ChangeGC(TaskData *taskData, X_GC_Object *G, unsigned n, PolyWord P) { XGCValues v; unsigned mask = 1 << n; switch(mask) { case GCFunction: v.function = get_C_ushort(taskData, P); break; case GCPlaneMask: v.plane_mask = get_C_ulong (taskData, P); break; case GCForeground: v.foreground = get_C_ulong (taskData, P); break; case GCBackground: v.background = get_C_ulong (taskData, P); break; case GCLineWidth: v.line_width = get_C_short (taskData, P); break; case GCLineStyle: v.line_style = get_C_ushort(taskData, P); break; case GCCapStyle: v.cap_style = get_C_ushort(taskData, P); break; case GCJoinStyle: v.join_style = get_C_ushort(taskData, P); break; case GCFillStyle: v.fill_style = get_C_ushort(taskData, P); break; case GCFillRule: v.fill_rule = get_C_ushort(taskData, P); break; case GCTileStipXOrigin: v.ts_x_origin = get_C_short (taskData, P); break; case GCTileStipYOrigin: v.ts_y_origin = get_C_short (taskData, P); break; case GCSubwindowMode: v.subwindow_mode = get_C_ushort(taskData, P); break; case GCGraphicsExposures: v.graphics_exposures = get_C_ushort(taskData, P); break; case GCClipXOrigin: v.clip_x_origin = get_C_short (taskData, P); break; case GCClipYOrigin: v.clip_y_origin = get_C_short (taskData, P); break; case GCDashOffset: v.dash_offset = get_C_ushort(taskData, P); break; case GCDashList: v.dashes = get_C_uchar (taskData, P); break; case GCArcMode: v.arc_mode = get_C_ushort(taskData, P); break; case GCFont: v.font = GetFont(taskData, (X_Object *)P.AsObjPtr()); G->font_object = FontObject((X_Object *)P.AsObjPtr()); break; case GCTile: v.tile = GetPixmap(taskData, (X_Object *)P.AsObjPtr()); G->tile = PixmapObject((X_Object *)P.AsObjPtr()); break; case GCStipple: v.stipple = GetPixmap(taskData, (X_Object *)P.AsObjPtr()); G->stipple = PixmapObject((X_Object *)P.AsObjPtr()); break; case GCClipMask: v.clip_mask = GetPixmap(taskData, (X_Object *)P.AsObjPtr()); G->clipMask = PixmapObject((X_Object *)P.AsObjPtr()); break; default: Crash ("Bad gc mask %u",mask); } XChangeGC(GetDisplay(taskData, (X_Object *)G),GetGC(taskData, (X_Object *)G),mask,&v); } static Handle CreateGC ( TaskData *taskData, Handle dsHandle /* Handle to (X_Display_Object *) */, Drawable w ) { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_GC_Object), F_MUTABLE_BIT); Handle GCHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_GC_Object *object = (X_GC_Object *)DEREFHANDLE(objectHandle); GC *gc = (GC *)DEREFHANDLE(GCHandle); *gc = XCreateGC(DEREFDISPLAYHANDLE(dsHandle)->display,w,0,0); FINISHED(taskData, GCHandle); debugCreate(GC,(*gc)->gid); object->type = TAGGED(X_GC); object->gc = gc; object->ds = DEREFDISPLAYHANDLE(dsHandle); /* object->font_object = 0; object->tile = 0; object->stipple = 0; object->clipMask = 0; */ return AddXObject(objectHandle); /* must remain MUTABLE */ } /******************************************************************************/ /* */ /* Window */ /* */ /******************************************************************************/ static X_Window_Object *WindowObject(X_Object *P) { assert(UNTAGGED(P->type) == X_Window); return (X_Window_Object *)P; } static Window GetWindow(TaskData *taskData, X_Object *P) { if (UNTAGGED(P->type) == X_Pixmap) { if (*((X_Pixmap_Object*)P)->pixmap == None) return None; RaiseXWindows(taskData, "Not a window"); } assert(UNTAGGED(P->type) == X_Window); CheckExists(P,window); return *(((X_Window_Object*)P)->drawable); } static Handle EmptyWindow ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w ) { X_Window_Object *W = FindWindow(dsHandle,w); if (W) { return SAVE(W); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Window_Object), F_MUTABLE_BIT); Handle eventMaskHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); Handle drawableHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Window_Object *object = DEREFWINDOWHANDLE(objectHandle); Drawable *drawable = (Drawable *)DEREFHANDLE(drawableHandle); PolyObject *eventMask = DEREFHANDLE(eventMaskHandle); *drawable = w; FINISHED(taskData, drawableHandle); #ifdef nodef /* DCJM: This gets in the way of trying to handle ButtonPress events - get rid of it. */ /* so that Motif windows get ButtonClick XEvent structures */ eventMask->Set(0, PolyWord::FromUnsigned(ButtonClickMask)); /* eventMask must remain MUTABLE */ #else eventMask->Set(0, PolyWord::FromUnsigned(0)); #endif object->type = TAGGED(X_Window); object->drawable = drawable; object->handler = TAGGED(0); object->state = TAGGED(0); object->eventMask = eventMask; /* object->colormap_object = 0; object->cursor_object = 0; object->backgroundPixmap = 0; object->borderPixmap = 0; object->parent = 0; */ object->ds = DEREFDISPLAYHANDLE(dsHandle); debugRefer(Window,w); return AddXObject(objectHandle); /* must remain MUTABLE */ } } /******************************************************************************/ /* */ /* Pixmap */ /* */ /******************************************************************************/ static X_Pixmap_Object *PixmapObject(X_Object *P) { assert(UNTAGGED(P->type) == X_Pixmap); return (X_Pixmap_Object *)P; } static Pixmap GetPixmap(TaskData *taskData, X_Object *P) { if (UNTAGGED(P->type) == X_Window) { if (! ResourceExists(P)) { debug1("Non-existent window %lx\n",(long)P); } if (*(((X_Window_Object*)P)->drawable) == None) return None; RaiseXWindows(taskData, "Not a pixmap"); } assert(UNTAGGED(P->type) == X_Pixmap); /* val NoDrawable = xcall (20,0) : Drawable; */ /* val ParentRelative = xcall (20,1) : Drawable; */ /* special case for NoDrawable */ if (*((X_Pixmap_Object*)P)->pixmap == 0) return None; /* special case for ParentRelative */ if (*((X_Pixmap_Object*)P)->pixmap == 1) return None; CheckExists(P,pixmap); return *(((X_Pixmap_Object*)P)->pixmap); } static Handle EmptyPixmap ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Pixmap id ) { X_Pixmap_Object *E = FindPixmap(dsHandle,id); if (E) { return SAVE(E); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Pixmap_Object), F_MUTABLE_BIT); Handle pixmapHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Pixmap_Object *object = (X_Pixmap_Object *)DEREFHANDLE(objectHandle); Pixmap *pixmap = (Pixmap *)DEREFHANDLE(pixmapHandle); *pixmap = id; FINISHED(taskData, pixmapHandle); object->type = TAGGED(X_Pixmap); object->pixmap = pixmap; object->ds = DEREFDISPLAYHANDLE(dsHandle); debugCreate(Pixmap,id); return AddXObject(FINISHED(taskData, objectHandle)); } } /******************************************************************************/ /* */ /* Drawable */ /* */ /******************************************************************************/ static Drawable GetDrawable(TaskData *taskData, X_Object *P) { CheckExists(P,drawable); switch(UNTAGGED(P->type)) { case X_Window: return *(((X_Window_Object*)P)->drawable); case X_Pixmap: return *(((X_Pixmap_Object*)P)->pixmap); default: Crash ("Bad X_Object type (%d) in GetDrawable",UNTAGGED(P->type)); } /*NOTREACHED*/ } /******************************************************************************/ /* */ /* DS / Display */ /* */ /******************************************************************************/ static Handle GetDS(TaskData *taskData, X_Object *P) { X_Display_Object *ds; CheckExists(P,resource); switch(UNTAGGED(P->type)) { case X_GC: ds = ((X_GC_Object*)P)->ds; break; case X_Font: ds = ((X_Font_Object*)P)->ds; break; case X_Cursor: ds = ((X_Cursor_Object*)P)->ds; break; case X_Window: ds = ((X_Window_Object*)P)->ds; break; case X_Pixmap: ds = ((X_Pixmap_Object*)P)->ds; break; case X_Colormap: ds = ((X_Colormap_Object*)P)->ds; break; case X_Visual: ds = ((X_Visual_Object*)P)->ds; break; case X_Widget: ds = ((X_Widget_Object*)P)->ds; break; case X_Display: ds = (X_Display_Object*)P; break; /* i.e. P cast to the right type */ default: Crash ("Bad X_Object type (%d) in GetDS",UNTAGGED(P->type)); } assert((PolyWord)ds != TAGGED(0)); return SAVE(ds); } static Display *GetDisplay(TaskData *taskData, X_Object *P) { CheckExists(P,resource); switch(UNTAGGED(P->type)) { case X_GC: return ((X_GC_Object*)P)->ds->display; case X_Font: return ((X_Font_Object*)P)->ds->display; case X_Cursor: return ((X_Cursor_Object*)P)->ds->display; case X_Window: return ((X_Window_Object*)P)->ds->display; case X_Pixmap: return ((X_Pixmap_Object*)P)->ds->display; case X_Colormap: return ((X_Colormap_Object*)P)->ds->display; case X_Visual: return ((X_Visual_Object*)P)->ds->display; case X_Widget: return ((X_Widget_Object*)P)->ds->display; case X_Display: return ((X_Display_Object*)P)->display; default: Crash ("Bad X_Object type (%d) in GetDisplay",UNTAGGED(P->type)); } /*NOTREACHED*/ } /******************************************************************************/ /* */ /* FS / Font */ /* */ /******************************************************************************/ static Font GetFont(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Font); /* val NoFont = xcall (22,0) : Font; */ /* special case for NoFont - valid(?) */ if (*(((X_Font_Object *)P)->font) == None) return None; CheckExists(P,font); return *(((X_Font_Object *)P)->font); } static Handle EmptyFont ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Font id, XFontStruct *fs ) { X_Font_Object *E = FindFont(dsHandle,id); if (E && (fs == NULL || *(E->fs) == fs)) { return SAVE(E); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Font_Object), F_MUTABLE_BIT); Handle fontHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); Handle FSHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Font_Object *object = (X_Font_Object *)DEREFHANDLE(objectHandle); Font *font = (Font *)DEREFHANDLE(fontHandle); XFontStruct **xfstr = (XFontStruct **)DEREFHANDLE(FSHandle); *font = id; FINISHED(taskData, fontHandle); *xfstr = fs; FINISHED(taskData, FSHandle); object->type = TAGGED(X_Font); object->font = font; object->fs = xfstr; object->ds = DEREFDISPLAYHANDLE(dsHandle); debugCreate(Font,id); return AddXObject(FINISHED(taskData, objectHandle)); } } /******************************************************************************/ /* */ /* Cursor */ /* */ /******************************************************************************/ static X_Cursor_Object *CursorObject(X_Object *P) { assert(UNTAGGED(P->type) == X_Cursor); return (X_Cursor_Object *)P; } static Cursor GetCursor(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Cursor); /* val NoCursor = xcall (21,0) : Cursor; */ /* special case for NoCursor */ if (*(((X_Cursor_Object *)P)->cursor) == None) return None; CheckExists(P,cursor); return *(((X_Cursor_Object *)P)->cursor); } static Handle EmptyCursor ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Cursor id ) { X_Cursor_Object *E = FindCursor(dsHandle,id); if (E) { return SAVE(E); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Cursor_Object), F_MUTABLE_BIT); Handle cursorHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Cursor_Object *object = (X_Cursor_Object *)DEREFHANDLE(objectHandle); Cursor *cursor = (Cursor *)DEREFHANDLE(cursorHandle); *cursor = id; FINISHED(taskData, cursorHandle); object->type = TAGGED(X_Cursor); object->cursor = cursor; object->ds = DEREFDISPLAYHANDLE(dsHandle); debugRefer(Cursor,id); return AddXObject(FINISHED(taskData, objectHandle)); } } static Handle CreateFontCursor ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ unsigned shape ) { return EmptyCursor(taskData, dsHandle,XCreateFontCursor(DEREFDISPLAYHANDLE(dsHandle)->display,shape)); } static Handle CreateGlyphCursor ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Font sf, Font mf, unsigned sc, unsigned mc, XColor *foreground, XColor *background ) { return EmptyCursor(taskData, dsHandle,XCreateGlyphCursor(DEREFDISPLAYHANDLE(dsHandle)->display,sf,mf,sc,mc,foreground,background)); } static Handle CreatePixmapCursor ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Pixmap source, Pixmap mask, XColor *foreground, XColor *background, unsigned x, unsigned y ) { return EmptyCursor(taskData, dsHandle,XCreatePixmapCursor(DEREFDISPLAYHANDLE(dsHandle)->display,source,mask,foreground,background,x,y)); } /******************************************************************************/ /* */ /* Widget */ /* */ /******************************************************************************/ static Widget GetNWidget(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Widget); if (*(((X_Widget_Object *)P)->widget) == NULL) return NULL; CheckExists(P,widget); return *(((X_Widget_Object *)P)->widget); } static Widget GetWidget(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Widget); if (*(((X_Widget_Object *)P)->widget) == NULL) { RaiseXWindows(taskData, "Not a real widget"); } CheckExists(P,widget); return *(((X_Widget_Object *)P)->widget); } /* added 6/11/94 SPF */ static Widget GetRealizedWidget(TaskData *taskData, char *where, X_Object *P) { Widget w; assert(UNTAGGED(P->type) == X_Widget); w = *(((X_Widget_Object *)P)->widget); if (w == NULL) { RaiseXWindows2(where,": not a real widget"); } CheckExists(P,widget); if (XtIsRealized(w) == False) { RaiseXWindows2(where,": widget is not realized"); } return w; } /* P is a pointer to an X_Widget_Object */ static X_Widget_Object *WidgetObjectToken(X_Object *P) { assert(UNTAGGED(P->type) == X_Widget); return (X_Widget_Object *)P; } /* P is a pointer to an X_Widget_Object, which is bound to a C widget */ static X_Widget_Object *WidgetObject(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Widget); CheckExists(P,widget); return (X_Widget_Object *)P; } static Handle EmptyWidget ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget id ) { X_Widget_Object *E = FindWidget(id); if (E) { return SAVE(E); } else { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Widget_Object), F_MUTABLE_BIT); Handle widgetHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Widget_Object *object = (X_Widget_Object *)DEREFHANDLE(objectHandle); Widget *widget = (Widget *)DEREFHANDLE(widgetHandle); *widget = id; FINISHED(taskData, widgetHandle); object->type = TAGGED(X_Widget); object->widget = widget; object->callbackList = ListNull; object->state = TAGGED(0); object->ds = DEREFDISPLAYHANDLE(dsHandle); debugRefer(Widget,id); return AddXObject(objectHandle); /* Must stay MUTABLE */ } } static Handle NewWidget ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget id ) { X_Widget_Object *E = FindWidget(id); if (E) DestroyXObject((X_Object *)E); return EmptyWidget(taskData, dsHandle,id); } /******************************************************************************/ /* */ /* Text Widgets */ /* */ /******************************************************************************/ static Widget GetTextWidget(TaskData *taskData, char *funcname, X_Object *P) { Widget w = GetWidget(taskData, P); if (XmIsText(w)) return w; /* Text operations are also legal on TextField widgets */ if (XmIsTextField(w)) return w; RaiseXWindows2(funcname,": not a Text or TextField widget"); /*NOTREACHED*/ } /******************************************************************************/ /* */ /* TextField Widgets */ /* */ /******************************************************************************/ static Widget GetTextFieldWidget(TaskData *taskData, char *funcname, X_Object *P) { Widget w = GetWidget(taskData, P); if (XmIsTextField(w)) return w; RaiseXWindows2(funcname,": not a TextField widget"); /*NOTREACHED*/ } /******************************************************************************/ /* */ /* List Widgets */ /* */ /******************************************************************************/ static Widget GetListWidget(TaskData *taskData, char *funcname, X_Object *P) { Widget w = GetWidget(taskData, P); if (XmIsList(w)) return w; RaiseXWindows2(funcname,": not a List widget"); /*NOTREACHED*/ } /******************************************************************************/ /* */ /* Window */ /* */ /******************************************************************************/ static void RemoveWindowEvents(Display *d, Window w) { XEvent event; XSync(d,False); while(XCheckWindowEvent(d,w,~0,&event)) { /* do nothing */ } } static Handle AddWindow ( TaskData *taskData, Window W, Handle handlerHandle, /* Handle to (PolyWord *) (?) */ Handle stateHandle, /* Handle to (PolyWord *) (?) */ Handle parentHandle /* Handle to (X_Window_Object *) */ ) { XWMHints hints; Atom deleteWindow; /* was int SPF 6/1/94 */ Display *d = GetDisplay(taskData, DEREFXOBJECTHANDLE(parentHandle)); Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Window_Object), F_MUTABLE_BIT); Handle eventMaskHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); Handle drawableHandle = alloc_and_save(taskData, 1, F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Window_Object *object = DEREFWINDOWHANDLE(objectHandle); Drawable *drawable = (Drawable *)DEREFHANDLE(drawableHandle); PolyObject *eventMask = DEREFHANDLE(eventMaskHandle); eventMask->Set(0, PolyWord::FromUnsigned(0)); /* eventMask must remain MUTABLE */ *drawable = W; FINISHED(taskData, drawableHandle); hints.flags = InputHint; hints.input = True; XSetWMHints(d,W,&hints); deleteWindow = WM_DELETE_WINDOW(d); if (deleteWindow != None) XSetWMProtocols(d,W,&deleteWindow,1); debugCreate(Window,W); object->type = TAGGED(X_Window); object->drawable = drawable; object->eventMask = eventMask; object->handler = DEREFHANDLE(handlerHandle); object->state = DEREFHANDLE(stateHandle); object->parent = DEREFWINDOWHANDLE(parentHandle); object->ds = DEREFWINDOWHANDLE(parentHandle)->ds; /* Tidy up (?) */ /* object->colormap_object = 0; object->cursor_object = 0; object->backgroundPixmap = 0; object->borderPixmap = 0; */ if (ISNIL(DEREFHANDLE(handlerHandle))) Crash ("No handler set"); return AddXObject(objectHandle); /* object must remain MUTABLE */ } static void DestroyWindow(X_Object *W /* Should be a Window Object! */) { TaskData *taskData = processes->GetTaskDataForThread(); Window w = GetWindow(taskData, W); Display *d = GetDisplay(taskData, W); debugReclaim(Window,w); XUnmapWindow(d,w); DestroySubwindows(W); XDestroyWindow(d,w); RemoveWindowEvents(d,w); } static Handle CreateSimpleWindow ( TaskData *taskData, Handle parent, /* Handle to (X_Window_Object *) */ int x, int y, unsigned w, unsigned h, unsigned borderWidth, unsigned border, unsigned background, Handle handler, /* Handle to (PolyWord *) (?) */ Handle state /* Handle to (PolyWord *) (?) */ ) { Window W = XCreateSimpleWindow(GetDisplay(taskData, DEREFXOBJECTHANDLE(parent)), GetWindow(taskData, DEREFXOBJECTHANDLE(parent)), x,y,w,h, borderWidth,border,background); if (W == 0) RaiseXWindows(taskData, "XCreateSimpleWindow failed"); return AddWindow(taskData,W,handler,state,parent); } static Handle CreateWindow ( TaskData *taskData, Handle parent, /* Handle to (X_Window_Object *) */ int x, int y, unsigned w, unsigned h, unsigned borderWidth, unsigned depth, unsigned clas, Visual *visual, Handle handler, /* Handle to (PolyWord *) (?) */ Handle state /* Handle to (PolyWord *) (?) */ ) { Window W; W = XCreateWindow(GetDisplay(taskData, DEREFXOBJECTHANDLE(parent)), GetWindow(taskData, DEREFXOBJECTHANDLE(parent)), x,y,w,h, borderWidth,depth,clas,visual,0,0); if (W == 0) RaiseXWindows(taskData, "XCreateWindow failed"); return AddWindow(taskData,W,handler,state,parent); } static void DestroySubwindows(X_Object *W /* should be a Window object! */) { TaskData *taskData = processes->GetTaskDataForThread(); Window root,parent,*children; unsigned n; int s; Window w = GetWindow(taskData, W); Display *d = GetDisplay(taskData, W); s = XQueryTree(d,w,&root,&parent,&children,&n); if (s == 0) { RaiseXWindows(taskData, "XDestroySubwindows failed"); return; } XUnmapSubwindows(d,w); if (n) { Handle dsHandle = GetDS(taskData, W); while(n--) { X_Window_Object *child = FindWindow(dsHandle,children[n]); if (child) DestroyXObject((X_Object *)child); } XFree((char *)children); } XDestroySubwindows(d,w); } /******************************************************************************/ /* */ /* Translations / Accelerators */ /* */ /******************************************************************************/ static Handle EmptyTrans(TaskData *taskData, XtTranslations table) { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Trans_Object), F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Trans_Object *object = (X_Trans_Object *)DEREFHANDLE(objectHandle); /* OK to store C values because this is a byte object */ object->type = TAGGED(X_Trans); object->table = table; debugRefer(Trans,table); return AddXObject(FINISHED(taskData, objectHandle)); } static XtTranslations GetTrans(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Trans); CheckExists(P,trans); return ((X_Trans_Object *)P)->table; } static Handle EmptyAcc(TaskData *taskData, XtTranslations acc) { Handle objectHandle = alloc_and_save(taskData, SIZEOF(X_Acc_Object), F_MUTABLE_BIT|F_BYTE_OBJ); /* Must do all allocations before we do the first dereference */ X_Acc_Object *object = (X_Acc_Object *)DEREFHANDLE(objectHandle); /* OK to store C values because this is a byte object */ object->type = TAGGED(X_Acc); object->acc = acc; debugRefer(Acc,acc); return AddXObject(FINISHED(taskData, objectHandle)); } static XtAccelerators GetAcc(TaskData *taskData, X_Object *P) { assert(UNTAGGED(P->type) == X_Acc); CheckExists(P,acc); return ((X_Acc_Object *)P)->acc; } /******************************************************************************/ /* */ /* Utility functions */ /* */ /******************************************************************************/ static XtGrabKind GetXtGrabKind(TaskData *taskData, PolyWord P) { int i = get_C_long(taskData, P); /* This encoding must be the same as that used in Motif/ml_bind.ML */ switch (i) { case 0: return XtGrabNone; case 1: return XtGrabNonexclusive; case 2: return XtGrabExclusive; default: Crash ("Bad XtGrabKind index (%d) in GetXtGrabKind",i); } return XtGrabNone; /* to keep lint/gcc happy */ } /******************************************************************************/ /* */ /* MLXStandardColormap - implements ML XStandardColormap datatype */ /* */ /******************************************************************************/ typedef struct { X_Colormap_Object *Colormap; PolyWord redMax; /* ML int */ PolyWord redMult; /* ML int */ PolyWord greenMax; /* ML int */ PolyWord greenMult; /* ML int */ PolyWord blueMax; /* ML int */ PolyWord blueMult; /* ML int */ PolyWord basePixel; /* ML int */ X_Visual_Object *visual; } MLXStandardColormap; static void GetStandardColormap(TaskData *taskData, PolyWord p, void *v, unsigned) { MLXStandardColormap *P = (MLXStandardColormap *)p.AsObjPtr(); XStandardColormap *s = (XStandardColormap *)v; s->colormap = GetColormap(taskData, (X_Object *)P->Colormap); s->red_max = get_C_ulong(taskData, P->redMax); s->red_mult = get_C_ulong(taskData, P->redMult); s->green_max = get_C_ulong(taskData, P->greenMax); s->green_mult = get_C_ulong(taskData, P->greenMult); s->blue_max = get_C_ulong(taskData, P->blueMax); s->blue_mult = get_C_ulong(taskData, P->blueMult); s->base_pixel = get_C_ulong(taskData, P->basePixel); s->visualid = GetVisual(taskData, (X_Object *)P->visual)->visualid; /* UNSAFE(?) */ s->killid = None; } static Handle CreateStandardColormap ( TaskData *taskData, void *v, Handle dsHandle /* Handle to (X_Display_Object *) */ ) { XStandardColormap *s = (XStandardColormap *)v; XVisualInfo T; XVisualInfo *info; int count; Handle tupleHandle = alloc_and_save(taskData, SIZEOF(MLXStandardColormap), F_MUTABLE_BIT); T.visualid = s->visualid; T.visual = None; info = XGetVisualInfo(DEREFDISPLAYHANDLE(dsHandle)->display,VisualIDMask,&T,&count); if (info) { T.visual = info->visual; XFree((char *)info); } /* Still allocating, so must use explicit DEREF for each element */ #define tuple /* hack */((MLXStandardColormap *)DEREFHANDLE(tupleHandle)) tuple->Colormap = (X_Colormap_Object *)DEREFHANDLE(EmptyColormap(taskData, dsHandle,s->colormap)); tuple->redMax = DEREFWORD(Make_arbitrary_precision(taskData, s->red_max)); tuple->redMult = DEREFWORD(Make_arbitrary_precision(taskData, s->red_mult)); tuple->greenMax = DEREFWORD(Make_arbitrary_precision(taskData, s->green_max)); tuple->greenMult = DEREFWORD(Make_arbitrary_precision(taskData, s->green_mult)); tuple->blueMax = DEREFWORD(Make_arbitrary_precision(taskData, s->blue_max)); tuple->blueMult = DEREFWORD(Make_arbitrary_precision(taskData, s->blue_mult)); tuple->basePixel = DEREFWORD(Make_arbitrary_precision(taskData, s->base_pixel)); tuple->visual = (X_Visual_Object *)DEREFHANDLE(EmptyVisual(taskData, dsHandle,T.visual)); #undef tuple return FINISHED(taskData, tupleHandle); } /******************************************************************************/ /* */ /* Polymorphic pairs */ /* */ /******************************************************************************/ class MLPair: public PolyObject { public: PolyWord x0; /* first value */ PolyWord x1; /* second value */ }; /* Polymorphic pair creation */ static Handle CreatePair(TaskData *taskData, Handle p1, Handle p2) { Handle pairHandle = alloc_and_save(taskData, SIZEOF(MLPair), F_MUTABLE_BIT); /* Still allocating, so must use explicit DEREF for each element */ #define pair ((MLPair *)DEREFHANDLE(pairHandle)) pair->x0 = DEREFWORD(p1); pair->x1 = DEREFWORD(p2); #undef pair return FINISHED(taskData, pairHandle); } /******************************************************************************/ /* */ /* Polymorphic triples */ /* */ /******************************************************************************/ class MLTriple: public PolyObject { public: PolyWord x0; /* first value */ PolyWord x1; /* second value */ PolyWord x2; /* third value */ }; inline PolyWord FST(PolyWord P) { return ((MLTriple*)P.AsObjPtr())->x0; } inline PolyWord SND(PolyWord P) { return ((MLTriple*)P.AsObjPtr())->x1; } inline PolyWord THIRD(PolyWord P) { return ((MLTriple*)P.AsObjPtr())->x2; } static Handle CreateTriple(TaskData *taskData, Handle p1, Handle p2, Handle p3) { Handle tripleHandle = alloc_and_save(taskData, SIZEOF(MLTriple), F_MUTABLE_BIT); /* Still allocating, so must use explicit DEREF for each element */ #define triple ((MLTriple *)DEREFHANDLE(tripleHandle)) triple->x0 = DEREFWORD(p1); triple->x1 = DEREFWORD(p2); triple->x2 = DEREFWORD(p3); #undef triple return FINISHED(taskData, tripleHandle); } /******************************************************************************/ /* */ /* MLXImage - Implements ML XImage datatype */ /* */ /******************************************************************************/ typedef struct { PolyWord data; /* ML (abstype containing) string */ PolyWord size; /* MLXRectangle * */ PolyWord depth; /* ML int */ PolyWord format; /* (short ML int) XYBitmap | XYPixmap | ZPixmap */ PolyWord xoffset; /* ML int */ PolyWord bitmapPad; /* ML int */ PolyWord byteOrder; /* (short ML int) LSBFirst | MSBFirst */ PolyWord bitmapUnit; /* ML int */ PolyWord bitsPerPixel; /* ML int */ PolyWord bytesPerLine; /* ML int */ PolyWord visualRedMask; /* ML int */ PolyWord bitmapBitOrder; /* (short ML int) LSBFirst | MSBFirst */ PolyWord visualBlueMask; /* ML int */ PolyWord visualGreenMask; /* ML int */ } MLXImage; #define MLImageFormat(n) (n+1) #define MLImageOrder(n) (n+1) #define CImageFormat(n) (n-1) #define CImageOrder(n) (n-1) static unsigned ImageBytes(XImage *image) { unsigned dsize = image->bytes_per_line * image->height; if (image->format == XYPixmap) dsize = dsize * image->depth; return dsize; } static XImage *GetXImage(TaskData *taskData, Display *d, PolyWord p) /* can only be called once per X opcode */ { MLXImage *I = (MLXImage *)p.AsObjPtr(); static XImage image = { 0 }; PolyStringObject *data = GetString(I->data); unsigned width = GetRectW(taskData, I->size); unsigned height = GetRectH(taskData, I->size); unsigned depth = get_C_ulong(taskData, I->depth); unsigned format = get_C_ulong(taskData, I->format); int xoffset = get_C_short(taskData, I->xoffset); int bitmapPad = get_C_short(taskData, I->bitmapPad); int bytesPerLine = get_C_long (taskData, I->bytesPerLine); unsigned byteOrder = get_C_ulong(taskData, I->byteOrder); unsigned bitmapUnit = get_C_ulong(taskData, I->bitmapUnit); unsigned bitsPerPixel = get_C_ulong(taskData, I->bitsPerPixel); unsigned bitmapBitOrder = get_C_ulong(taskData, I->bitmapBitOrder); format = CImageFormat(format); byteOrder = CImageOrder(byteOrder); bitmapBitOrder = CImageOrder(bitmapBitOrder); image.width = width; image.height = height; image.xoffset = xoffset; image.format = format; image.data = data->chars; image.byte_order = byteOrder; image.bitmap_unit = bitmapUnit; image.bitmap_bit_order = bitmapBitOrder; image.bitmap_pad = bitmapPad; image.depth = depth; image.bytes_per_line = bytesPerLine; image.bits_per_pixel = bitsPerPixel; image.red_mask = get_C_ulong(taskData, I->visualRedMask); image.green_mask = get_C_ulong(taskData, I->visualGreenMask); image.blue_mask = get_C_ulong(taskData, I->visualBlueMask); if (ImageBytes(&image) != data->length) RaiseXWindows(taskData, "Bad image string length"); return ℑ } static Handle CreateImage(TaskData *taskData, XImage *image) { Handle XHandle = alloc_and_save(taskData, SIZEOF(MLXImage), F_MUTABLE_BIT); int dsize = ImageBytes(image); /* Still allocating, so must use explicit DEREF for each element */ #define X ((MLXImage *)DEREFHANDLE(XHandle)) X->data = C_string_to_Poly(taskData, image->data,dsize); X->size = DEREFWORD(CreateArea(image->width,image->height)); X->depth = DEREFWORD(Make_arbitrary_precision(taskData, image->depth)); X->format = DEREFWORD(Make_arbitrary_precision(taskData, MLImageFormat(image->format))); X->xoffset = DEREFWORD(Make_int(image->xoffset)); X->bitmapPad = DEREFWORD(Make_int(image->bitmap_pad)); X->byteOrder = DEREFWORD(Make_arbitrary_precision(taskData, MLImageOrder(image->byte_order))); X->bitmapUnit = DEREFWORD(Make_arbitrary_precision(taskData, image->bitmap_unit)); X->bitsPerPixel = DEREFWORD(Make_arbitrary_precision(taskData, image->bits_per_pixel)); X->bytesPerLine = DEREFWORD(Make_int(image->bytes_per_line)); X->visualRedMask = DEREFWORD(Make_arbitrary_precision(taskData, image->red_mask)); X->bitmapBitOrder = DEREFWORD(Make_arbitrary_precision(taskData, MLImageOrder(image->bitmap_bit_order))); X->visualBlueMask = DEREFWORD(Make_arbitrary_precision(taskData, image->blue_mask)); X->visualGreenMask = DEREFWORD(Make_arbitrary_precision(taskData, image->green_mask)); #undef X XDestroyImage(image); return FINISHED(taskData, XHandle); } static Handle GetImage ( TaskData *taskData, Display *d, Drawable drawable, int x, int y, unsigned w, unsigned h, unsigned /* long */ mask, int format ) { XImage *image = XGetImage(d,drawable,x,y,w,h,mask,CImageFormat(format)); if (image == 0) RaiseXWindows(taskData, "XGetImage failed"); return CreateImage(taskData, image); } static Handle SubImage ( TaskData *taskData, XImage *image, int x, int y, unsigned w, unsigned h ) { XImage *subimage = XSubImage(image,x,y,w,h); if (subimage == 0) RaiseXWindows(taskData, "XSubImage failed"); return CreateImage(taskData, subimage); } /******************************************************************************/ /* */ /* XImage */ /* */ /******************************************************************************/ static void GetSubImage ( Display *d, Drawable drawable, int sx, int sy, unsigned sw, unsigned sh, unsigned /* long */ mask, int format, XImage *image, int dx, int dy ) { XGetSubImage(d,drawable,sx,sy,sw,sh,mask,CImageFormat(format),image,dx,dy); /* XFree((char *)image); */ } static void PutImage ( Display *d, Drawable drawable, GC gc, XImage *image, int sx, int sy, int dx, int dy, unsigned dw, unsigned dh ) { XPutImage(d,drawable,gc,image,sx,sy,dx,dy,dw,dh); /* XFree((char *)image); */ } static Handle GetPixel(TaskData *taskData, XImage *image, int x, int y) { unsigned pixel = XGetPixel(image,x,y); /* XFree((char *)image); */ return Make_arbitrary_precision(taskData, pixel); } static void PutPixel(XImage *image, int x, int y, unsigned pixel) { XPutPixel(image,x,y,pixel); /* XFree((char *)image); */ } static void AddPixel(XImage *image, unsigned value) { XAddPixel(image,value); /* XFree((char *)image); */ } /******************************************************************************/ /* */ /* TimeVal */ /* */ /******************************************************************************/ static int DoubleClickTime = 250; /* Double click time in milliseconds */ static int MouseDrift = 5; /* Mouse movement allowed in button events */ static void NormaliseTime(TimeVal *t) { while(t->tv_usec >= 1000000) { t->tv_usec -= 1000000; t->tv_sec++; } while(t->tv_usec < 0) { t->tv_usec += 1000000; t->tv_sec--; } } static void TimeAdd(TimeVal *a, TimeVal *b, TimeVal *t) { t->tv_sec = a->tv_sec + b->tv_sec; t->tv_usec = a->tv_usec + b->tv_usec; NormaliseTime(t); } static int TimeLt(TimeVal *a, TimeVal *b) { return ((a->tv_sec < b->tv_sec) || ((a->tv_sec == b->tv_sec) && (a->tv_usec < b->tv_usec))); } static int TimeLeq(TimeVal *a, TimeVal *b) { return ((a->tv_sec < b->tv_sec) || ((a->tv_sec == b->tv_sec) && (a->tv_usec <= b->tv_usec))); } /******************************************************************************/ /* */ /* (?) */ /* */ /******************************************************************************/ typedef struct { XButtonEvent *button; /* initial button press event */ int up,down; /* count of button transitions */ } PredicateArgs; static Bool SameClickEvent(Display *dpy, XEvent *ev, XPointer arg) { PredicateArgs *A = (PredicateArgs *)arg; switch(ev->type) { case MotionNotify: { int dx = ev->xmotion.x - A->button->x; int dy = ev->xmotion.y - A->button->y; if (ev->xmotion.window != A->button->window) return False; if (abs(dx) > MouseDrift) return False; if (abs(dy) > MouseDrift) return False; return True; } case ButtonPress: case ButtonRelease: { int dx = ev->xbutton.x - A->button->x; int dy = ev->xbutton.y - A->button->y; if (ev->xbutton.window != A->button->window) return False; if (ev->xbutton.button != A->button->button) return False; if (abs(dx) > MouseDrift) return False; if (abs(dy) > MouseDrift) return False; if (ev->type == ButtonPress) A->down++; else A->up++; return True; } } return False; } static void WaitDoubleClickTime(Handle dsHandle, PredicateArgs *A) { XEvent N; TimeVal start_time,end_time,dt; Display *d = DEREFDISPLAYHANDLE(dsHandle)->display; /* AIX doesn't document support for NULL pointers in the select call, so we have to initialise empty fd_sets instead. SPF 30/10/95 */ fd_set read_fds, write_fds, except_fds; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&except_fds); { int fd = d->fd; assert (0 <= fd && fd < FD_SETSIZE); FD_SET(fd,&read_fds); } gettimeofday(&start_time, NULL); dt.tv_sec = 0; dt.tv_usec = DoubleClickTime * 1000; TimeAdd(&start_time,&dt,&end_time); for (;;) { int extended = 0; while(XCheckIfEvent(d,&N,SameClickEvent,(char *) A)) { if (DEREFDISPLAYHANDLE(dsHandle)->app_context) XtDispatchEvent(&N); extended = 1; } if (QLength(d)) break; /* some other event to be processed next */ if (extended) /* button event extended, so extend time period */ { dt.tv_sec = 0; dt.tv_usec = DoubleClickTime * 1000; TimeAdd(&end_time,&dt,&end_time); } if (TimeLeq(&end_time,&start_time)) break; /* the time period has elapsed */ select(FD_SETSIZE,&read_fds,&write_fds,&except_fds,&dt); gettimeofday(&start_time, NULL); } } static Handle GetKeyVector(TaskData *taskData, void *k, unsigned i) { uchar *keys = (uchar*)k; unsigned index = i / 8; unsigned mask = 1 << (i % 8); return Make_bool(keys[index] & mask); } static Handle QueryKeymap(TaskData *taskData, Display *d) { char keys[32]; XQueryKeymap(d, keys); return CreateList4I(taskData, 256,keys,0,GetKeyVector); } /******************************************************************************/ /* */ /* EventName */ /* */ /******************************************************************************/ typedef struct { const char *name; int type; } EventName; static EventName EventNames[] = { { "KeyPress",KeyPress }, { "KeyRelease",KeyRelease }, { "ButtonPress",ButtonPress }, { "ButtonRelease",ButtonRelease }, { "MotionNotify",MotionNotify }, { "EnterNotify",EnterNotify }, { "LeaveNotify",LeaveNotify }, { "FocusIn",FocusIn }, { "FocusOut",FocusOut }, { "KeymapNotify",KeymapNotify }, { "Expose",Expose }, { "GraphicsExpose",GraphicsExpose }, { "NoExpose",NoExpose }, { "VisibilityNotify",VisibilityNotify }, { "CreateNotify",CreateNotify }, { "DestroyNotify",DestroyNotify }, { "UnmapNotify",UnmapNotify }, { "MapNotify",MapNotify }, { "MapRequest",MapRequest }, { "ReparentNotify",ReparentNotify }, { "ConfigureNotify",ConfigureNotify }, { "ConfigureRequest",ConfigureRequest }, { "GravityNotify",GravityNotify }, { "ResizeRequest",ResizeRequest }, { "CirculateNotify",CirculateNotify }, { "CirculateRequest",CirculateRequest }, { "PropertyNotify",PropertyNotify }, { "SelectionClear",SelectionClear }, { "SelectionRequest",SelectionRequest }, { "SelectionNotify",SelectionNotify }, { "ColormapNotify",ColormapNotify }, { "ClientMessage",ClientMessage }, { "MappingNotify",MappingNotify }, }; #define NEVENTS (sizeof(EventNames)/sizeof(EventName)) static const char *DebugEventName(int type) { for(unsigned i = 0; i < NEVENTS; i++) { if (EventNames[i].type == type) return EventNames[i].name; } return "** BAD EVENT **"; } static int WM_PROTOCOLS(Display *d) { static int protocols = None; if (protocols == None) protocols = XInternAtom(d,"WM_PROTOCOLS",True); return protocols; } static Atom WM_DELETE_WINDOW(Display *d) { static Atom deleteWindow = None; if (deleteWindow == None) deleteWindow = XInternAtom(d,"WM_DELETE_WINDOW",True); return deleteWindow; } /******************************************************************************/ /* */ /* Structures used by CreateEvent function. */ /* */ /* These typedefs should correspond with the tuples used by MakeXKeyEvent etc */ /* */ /******************************************************************************/ typedef struct { X_Window_Object *root; X_Window_Object *subwindow; PolyWord time; /* ML int */ MLXPoint *pointer; MLXPoint *rootPointer; PolyWord modifiers; /* ML modifier (int) */ PolyWord keycode; /* ML int */ } ML_KeyEvent_Data; typedef struct { X_Window_Object *root; X_Window_Object *subwindow; PolyWord time; /* ML int */ MLXPoint *pointer; MLXPoint *rootPointer; PolyWord modifiers; /* ML modifier (int) */ PolyWord button; /* ML int */ } ML_ButtonEvent_Data; typedef struct { X_Window_Object *root; X_Window_Object *subwindow; PolyWord time; /* ML int */ MLXPoint *pointer; MLXPoint *rootPointer; PolyWord modifiers; /* ML modifier (int) */ PolyWord button; /* ML int */ PolyWord up; /* ML int */ PolyWord down; /* ML int */ } ML_ButtonClick_Data; typedef struct { X_Window_Object *root; X_Window_Object *subwindow; PolyWord time; /* ML int */ MLXPoint *pointer; MLXPoint *rootPointer; PolyWord modifiers; /* ML modifier (int) */ PolyWord isHint; /* ML bool */ } ML_MotionEvent_Data; typedef struct { X_Window_Object *root; X_Window_Object *subwindow; PolyWord time; /* ML int */ MLXPoint *pointer; MLXPoint *rootPointer; PolyWord mode; /* ? */ PolyWord detail; /* ? */ PolyWord focus; /* ? */ PolyWord modifiers; /* ML modifier (int) */ } ML_CrossingEvent_Data; typedef struct { MLXRectangle *region; PolyWord count; /* ML int */ } ML_ExposeEvent_Data; typedef struct { X_Window_Object *window; MLXPoint *position; MLXRectangle *size; PolyWord borderWidth; /* ML int */ X_Window_Object *above; PolyWord overrideRedirect; /* ML bool */ } ML_ConfigureNotify_Data; typedef struct { X_Window_Object *window; MLXPoint *position; MLXRectangle *size; PolyWord borderWidth; X_Window_Object *above; PolyWord detail; /* ? */ } ML_ConfigureRequest_Data; typedef struct { MLXRectangle *region; PolyWord count; /* ML int */ PolyWord code; /* ML int */ } ML_GraphicsExposeEvent_Data; typedef struct { PolyWord mode; /* ML int ? */ PolyWord detail; /* ML int ? */ } ML_FocusChangeEvent_Data; typedef struct { X_Window_Object *window; MLXPoint *position; MLXRectangle *size; PolyWord borderWidth; /* ML int */ PolyWord overrideRedirect; /* ML bool */ } ML_CreateEvent_Data; typedef struct { X_Window_Object *window; PolyWord fromConfigure; /* ML bool */ } ML_UnmapEvent_Data; typedef struct { X_Window_Object *window; PolyWord overrideRedirect; /* ML bool */ } ML_MapEvent_Data; typedef struct { X_Window_Object *window; X_Window_Object *parent; MLXPoint *position; PolyWord overrideRedirect; /* ML bool */ } ML_ReparentEvent_Data; typedef struct { X_Window_Object *window; MLXPoint *position; } ML_GravityEvent_Data; typedef struct { X_Window_Object *window; PolyWord place; } ML_CirculateEvent_Data; typedef struct { X_Colormap_Object *colormap_object; PolyWord c_new; /* ML bool */ PolyWord installed; /* ML bool */ } ML_ColormapEvent_Data; typedef struct { PolyWord selection; /* ML int */ PolyWord time; /* ML int */ } ML_SelectionClear_Data; typedef struct { X_Window_Object *requestor; PolyWord selection; /* ML int */ PolyWord target; /* ML int */ PolyWord property; /* ML int */ PolyWord time; /* ML int */ } ML_SelectionRequest_Data; typedef struct { PolyWord selection; /* ML int */ PolyWord target; /* ML int */ PolyWord property; /* ML int */ PolyWord time; /* ML int */ } ML_Selection_Data; class ML_Event: public PolyObject { public: PolyWord type; /* ML (?) */ PolyWord sendEvent; /* ML bool */ PolyWord window; /* X_Window_Object* */ PolyWord data; /* pointer to event-specific data, in ML_XXX_Data format */ PolyWord callbacks; /* ML list of something */ PolyWord events; /* ML list */ }; /******************************************************************************/ /* */ /* CreateEvent function */ /* */ /******************************************************************************/ static Handle CreateEvent ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ XEvent *ev, Handle W /* Handle to (X_Window_Object *) */ ) { Handle eventHandle = alloc_and_save(taskData, SIZEOF(ML_Event), F_MUTABLE_BIT); Display *d = DEREFDISPLAYHANDLE(dsHandle)->display; int type = ev->xany.type; int send_event = ev->xany.send_event; assert(d == ev->xany.display); if (debugOptions & DEBUG_X) { printf("CreateEvent called, type=%s,", DebugEventName(type)); printf(" window=%lx\n", ev->xany.window); } #define event ((ML_Event *)DEREFHANDLE(eventHandle)) event->type = DEREFWORD(Make_arbitrary_precision(taskData, type)); event->sendEvent = DEREFWORD(Make_bool(send_event)); event->window = DEREFWINDOWHANDLE(W); switch(type) { case KeyPress: case KeyRelease: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_KeyEvent_Data), F_MUTABLE_BIT); #define data ((ML_KeyEvent_Data *)DEREFHANDLE(dataHandle)) data->root = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xkey.root)); data->subwindow = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xkey.subwindow)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xkey.time)); data->pointer = (MLXPoint *)DEREFHANDLE(CreatePoint(taskData, ev->xkey.x,ev->xkey.y)); data->rootPointer = (MLXPoint *)DEREFHANDLE(CreatePoint(taskData, ev->xkey.x_root,ev->xkey.y_root)); data->modifiers = DEREFWORD(Make_arbitrary_precision(taskData, ev->xkey.state)); data->keycode = DEREFWORD(Make_arbitrary_precision(taskData, ev->xkey.keycode)); #undef data event->data = DEREFHANDLE(FINISHED(taskData, dataHandle)); break; } case ButtonPress: case ButtonRelease: { if (DEREFWINDOWHANDLE(W)->eventMask->Get(0).AsUnsigned() & ButtonClickMask) { Handle dataHandle; PredicateArgs A; A.button = &ev->xbutton; A.up = (ev->type == ButtonRelease); A.down = (ev->type == ButtonPress); WaitDoubleClickTime(dsHandle,&A); dataHandle = alloc_and_save(taskData, SIZEOF(ML_ButtonClick_Data), F_MUTABLE_BIT); #define data ((ML_ButtonClick_Data *)DEREFHANDLE(dataHandle)) data->root = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xbutton.root)); data->subwindow = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xbutton.subwindow)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.time)); data->pointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xbutton.x,ev->xbutton.y)); data->rootPointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xbutton.x_root,ev->xbutton.y_root)); data->modifiers = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.state)); data->button = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.button)); data->up = DEREFWORD(Make_arbitrary_precision(taskData, A.up)); data->down = DEREFWORD(Make_arbitrary_precision(taskData, A.down)); #undef data event->type = DEREFWORD(Make_arbitrary_precision(taskData, 42)); /* What's this for? */ event->data = DEREFWORD(FINISHED(taskData, dataHandle)); } else { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_ButtonEvent_Data), F_MUTABLE_BIT); #define data ((ML_ButtonEvent_Data *)DEREFHANDLE(dataHandle)) data->root = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xbutton.root)); data->subwindow = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xbutton.subwindow)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.time)); data->pointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xbutton.x,ev->xbutton.y)); data->rootPointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xbutton.x_root,ev->xbutton.y_root)); data->modifiers = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.state)); data->button = DEREFWORD(Make_arbitrary_precision(taskData, ev->xbutton.button)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); } break; } case MotionNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_MotionEvent_Data), F_MUTABLE_BIT); #define data ((ML_MotionEvent_Data *)DEREFHANDLE(dataHandle)) data->root = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xmotion.root)); data->subwindow = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xmotion.subwindow)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xmotion.time)); data->pointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xmotion.x,ev->xmotion.y)); data->rootPointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xmotion.x_root,ev->xmotion.y_root)); data->modifiers = DEREFWORD(Make_arbitrary_precision(taskData, ev->xmotion.state)); data->isHint = DEREFWORD(Make_arbitrary_precision(taskData, ev->xmotion.is_hint)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case EnterNotify: case LeaveNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_CrossingEvent_Data), F_MUTABLE_BIT); #define data ((ML_CrossingEvent_Data *)DEREFHANDLE(dataHandle)) data->root = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xcrossing.root)); data->subwindow = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xcrossing.subwindow)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xcrossing.time)); data->pointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xcrossing.x,ev->xcrossing.y)); data->rootPointer = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xcrossing.x_root,ev->xcrossing.y_root)); data->mode = DEREFWORD(Make_arbitrary_precision(taskData, ev->xcrossing.mode)); data->detail = DEREFWORD(Make_arbitrary_precision(taskData, ev->xcrossing.detail)); data->focus = DEREFWORD(Make_bool(ev->xcrossing.focus)); data->modifiers = DEREFWORD(Make_arbitrary_precision(taskData, ev->xcrossing.state)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case Expose: { int left = ev->xexpose.x; int top = ev->xexpose.y; int right = left + ev->xexpose.width; int bottom = top + ev->xexpose.height; Handle dataHandle; while(XCheckTypedWindowEvent(d,ev->xexpose.window,Expose,ev)) { int L = ev->xexpose.x; int T = ev->xexpose.y; int R = L + ev->xexpose.width; int B = T + ev->xexpose.height; assert(ev->type == Expose); left = min(left,L); top = min(top,T); right = max(right,R); bottom = max(bottom,B); } dataHandle = alloc_and_save(taskData, SIZEOF(ML_ExposeEvent_Data), F_MUTABLE_BIT); #define data ((ML_ExposeEvent_Data *)DEREFHANDLE(dataHandle)) data->region = (MLXRectangle *)DEREFHANDLE(CreateRect(taskData, top,left,bottom,right)); data->count = DEREFWORD(Make_arbitrary_precision(taskData, 0)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case GraphicsExpose: { int left = ev->xgraphicsexpose.x; int top = ev->xgraphicsexpose.y; int right = left + ev->xgraphicsexpose.width; int bottom = top + ev->xgraphicsexpose.height; Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_GraphicsExposeEvent_Data), F_MUTABLE_BIT); #define data ((ML_GraphicsExposeEvent_Data *)DEREFHANDLE(dataHandle)) data->region = (MLXRectangle *)DEREFHANDLE(CreateRect(taskData, top,left,bottom,right)); data->count = DEREFWORD(Make_arbitrary_precision(taskData, ev->xgraphicsexpose.count)); data->code = DEREFWORD(Make_arbitrary_precision(taskData, ev->xgraphicsexpose.major_code)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case NoExpose: { event->data = DEREFWORD(Make_arbitrary_precision(taskData, ev->xnoexpose.major_code)); break; } case ConfigureNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_ConfigureNotify_Data), F_MUTABLE_BIT); #define data ((ML_ConfigureNotify_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xconfigure.window)); data->position = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xconfigure.x,ev->xconfigure.y)); data->size = (MLXRectangle *) DEREFHANDLE(CreateArea(ev->xconfigure.width,ev->xconfigure.height)); data->borderWidth = DEREFWORD(Make_int(ev->xconfigure.border_width)); data->above = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xconfigure.above)); data->overrideRedirect = DEREFWORD(Make_bool(ev->xconfigure.override_redirect)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case FocusIn: case FocusOut: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_FocusChangeEvent_Data), F_MUTABLE_BIT); #define data ((ML_FocusChangeEvent_Data *)DEREFHANDLE(dataHandle)) data->mode = DEREFWORD(Make_int(ev->xfocus.mode)); data->detail = DEREFWORD(Make_int(ev->xfocus.detail)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case VisibilityNotify: { event->data = DEREFWORD(Make_int(ev->xvisibility.state)); break; } case CreateNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_CreateEvent_Data), F_MUTABLE_BIT); #define data ((ML_CreateEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xcreatewindow.window)); data->position = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xcreatewindow.x,ev->xcreatewindow.y)); data->size = (MLXRectangle *) DEREFHANDLE(CreateArea(ev->xcreatewindow.width,ev->xcreatewindow.height)); data->borderWidth = DEREFWORD(Make_int(ev->xcreatewindow.border_width)); data->overrideRedirect = DEREFWORD(Make_bool(ev->xcreatewindow.override_redirect)); #undef data event->data = DEREFHANDLE(FINISHED(taskData, dataHandle)); break; } case DestroyNotify: { debugReclaim(Window,ev->xdestroywindow.window); event->data = DEREFWORD(EmptyWindow(taskData, dsHandle,ev->xdestroywindow.window)); break; } case UnmapNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_UnmapEvent_Data), F_MUTABLE_BIT); #define data ((ML_UnmapEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xunmap.window)); data->fromConfigure = DEREFWORD(Make_bool(ev->xunmap.from_configure)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case MapNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_MapEvent_Data), F_MUTABLE_BIT); #define data ((ML_MapEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xmap.window)); data->overrideRedirect = DEREFWORD(Make_bool(ev->xmap.override_redirect)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case MapRequest: { event->data = DEREFWORD(EmptyWindow(taskData, dsHandle,ev->xmaprequest.window)); break; } case ReparentNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_ReparentEvent_Data), F_MUTABLE_BIT); #define data ((ML_ReparentEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xreparent.window)); data->parent = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xreparent.parent)); data->position = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xreparent.x,ev->xreparent.y)); data->overrideRedirect = DEREFWORD(Make_bool(ev->xreparent.override_redirect)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case ConfigureRequest: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_ConfigureRequest_Data), F_MUTABLE_BIT); #define data ((ML_ConfigureRequest_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xconfigurerequest.window)); data->position = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xconfigurerequest.x,ev->xconfigurerequest.y)); data->size = (MLXRectangle *) DEREFHANDLE(CreateArea(ev->xconfigurerequest.width,ev->xconfigurerequest.height)); data->borderWidth = DEREFWORD(Make_int(ev->xconfigurerequest.border_width)); data->above = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xconfigurerequest.above)); data->detail = DEREFWORD(Make_int(ev->xconfigurerequest.detail)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case GravityNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_GravityEvent_Data), F_MUTABLE_BIT); #define data ((ML_GravityEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xgravity.window)); data->position = (MLXPoint *) DEREFHANDLE(CreatePoint(taskData, ev->xgravity.x,ev->xgravity.y)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case ResizeRequest: { event->data = DEREFWORD(CreateArea(ev->xresizerequest.width,ev->xresizerequest.height)); break; } case CirculateNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_CirculateEvent_Data), F_MUTABLE_BIT); #define data ((ML_CirculateEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xcirculate.window)); data->place = DEREFWORD(Make_int(ev->xcirculate.place)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case CirculateRequest: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_CirculateEvent_Data), F_MUTABLE_BIT); #define data ((ML_CirculateEvent_Data *)DEREFHANDLE(dataHandle)) data->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xcirculaterequest.window)); data->place = DEREFWORD(Make_int(ev->xcirculaterequest.place)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case ColormapNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_ColormapEvent_Data), F_MUTABLE_BIT); #define data ((ML_ColormapEvent_Data *)DEREFHANDLE(dataHandle)) data->colormap_object = (X_Colormap_Object *)DEREFHANDLE(EmptyColormap(taskData, dsHandle,ev->xcolormap.colormap)); data->c_new = DEREFWORD(Make_bool(ev->xcolormap.c_new)); data->installed = DEREFWORD(Make_bool(ev->xcolormap.state == ColormapInstalled)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case MappingNotify: { XRefreshKeyboardMapping((XMappingEvent *)ev); /* cast added SPF 6/1/94 */ return 0; /* HACK !!!! */ } case SelectionClear: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_SelectionClear_Data), F_MUTABLE_BIT); #define data ((ML_SelectionClear_Data *)DEREFHANDLE(dataHandle)) data->selection = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionclear.selection)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionclear.time)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case SelectionNotify: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_Selection_Data), F_MUTABLE_BIT); #define data ((ML_Selection_Data *)DEREFHANDLE(dataHandle)) data->selection = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselection.selection)); data->target = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselection.target)); data->property = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselection.property)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselection.time)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case SelectionRequest: { Handle dataHandle = alloc_and_save(taskData, SIZEOF(ML_SelectionRequest_Data), F_MUTABLE_BIT); #define data ((ML_SelectionRequest_Data *)DEREFHANDLE(dataHandle)) data->requestor = DEREFWINDOWHANDLE(EmptyWindow(taskData, dsHandle,ev->xselectionrequest.requestor)); data->selection = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionrequest.selection)); data->target = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionrequest.target)); data->property = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionrequest.property)); data->time = DEREFWORD(Make_arbitrary_precision(taskData, ev->xselectionrequest.time)); #undef data event->data = DEREFWORD(FINISHED(taskData, dataHandle)); break; } case ClientMessage: { unsigned protocols = WM_PROTOCOLS(d); int deleteWindow = WM_DELETE_WINDOW(d); if (protocols != None && deleteWindow != None && ev->xclient.message_type == protocols && ev->xclient.format == 32 && ev->xclient.data.l[0] == deleteWindow) { event->type = DEREFWORD(Make_arbitrary_precision(taskData, 43)); /* (?) */ break; } else return 0; } case PropertyNotify: return 0; case KeymapNotify: return 0; /* Broken: the window field does not tell me the window requesting this event */ default: Crash ("Bad event type %x",ev->type); } event->callbacks = FList; /* Safe, since FList is a Root */ FList = TAGGED(0); event->events = GList; /* Safe, since GList is a Root */ GList = TAGGED(0); return FINISHED(taskData, eventHandle); #undef event } /******************************************************************************/ /* */ /* HERE */ /* */ /******************************************************************************/ static Handle LookupString(TaskData *taskData, Display *d, unsigned keycode, unsigned modifiers) { XKeyEvent ev; int n; KeySym keysym; /* was int SPF 6/1/94 */ char buffer[500]; ev.display = d; ev.keycode = keycode; ev.state = modifiers; n = XLookupString(&ev,buffer,sizeof(buffer)-1,&keysym,NULL); buffer[n] = '\0'; return CreatePair(taskData, Make_string(buffer),Make_arbitrary_precision(taskData, keysym)); } static Handle GetScreenSaver(TaskData *taskData, Display *d) { int timeout,interval,blanking,exposures; Handle tuple; XGetScreenSaver(d,&timeout,&interval,&blanking,&exposures); tuple = alloc_and_save(taskData, 4, F_MUTABLE_BIT); #define data DEREFHANDLE(tuple) data->Set(0, DEREFWORD(Make_int(timeout))); data->Set(1, DEREFWORD(Make_int(interval))); data->Set(2, DEREFWORD(Make_arbitrary_precision(taskData, blanking))); data->Set(3, DEREFWORD(Make_arbitrary_precision(taskData, exposures))); #undef data return FINISHED(taskData, tuple); } static Handle TranslateCoordinates ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window src, Window dst, int x, int y ) { Window child; int dx,dy,s; s = XTranslateCoordinates(DEREFDISPLAYHANDLE(dsHandle)->display,src,dst,x,y,&dx,&dy,&child); if (s == 0) RaiseXWindows(taskData, "XTranslateCoordinates failed"); return CreatePair(taskData, CreatePoint(taskData, dx,dy),EmptyWindow(taskData, dsHandle,child)); } static Handle QueryBest ( TaskData *taskData, int (*f)(Display*, Drawable, unsigned, unsigned, unsigned *, unsigned *), Display *d, Drawable drawable, unsigned width, unsigned height ) { unsigned W,H; int s = (* f)(d,drawable,width,height,&W,&H); if (s == 0) RaiseXWindows(taskData, "XQueryBest failed"); return CreateArea(W,H); } static Handle QueryPointer ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w ) { Window root,child; int rootX,rootY; int winX,winY; unsigned mask; int s; Handle tuple; s = XQueryPointer(DEREFDISPLAYHANDLE(dsHandle)->display,w,&root,&child,&rootX,&rootY,&winX,&winY,&mask); tuple = alloc_and_save(taskData, 6, F_MUTABLE_BIT); #define data DEREFHANDLE(tuple) data->Set(0, DEREFWORD(Make_arbitrary_precision(taskData, s))); data->Set(1, DEREFWORD(EmptyWindow(taskData, dsHandle,root))); data->Set(2, DEREFWORD(EmptyWindow(taskData, dsHandle,child))); data->Set(3, DEREFWORD(CreatePoint(taskData, rootX,rootY))); data->Set(4, DEREFWORD(CreatePoint(taskData, winX,winY))); data->Set(5, DEREFWORD(Make_arbitrary_precision(taskData, mask))); #undef data return FINISHED(taskData, tuple); } static Handle ReadBitmap ( TaskData *taskData, Handle dsHandle, /* handle to (X_Display_Object *) */ Drawable w, PolyStringObject *string ) { unsigned width,height; char name[500]; int s,xhot,yhot; Pixmap pixmap; Handle tuple; Poly_string_to_C(string,name,sizeof(name)); s = XReadBitmapFile(DEREFDISPLAYHANDLE(dsHandle)->display,w,name,&width,&height,&pixmap,&xhot,&yhot); tuple = alloc_and_save(taskData, 4, F_MUTABLE_BIT); #define data DEREFHANDLE(tuple) data->Set(0,DEREFWORD(Make_arbitrary_precision(taskData, s))); if (s == BitmapSuccess) { data->Set(1, DEREFWORD(EmptyPixmap(taskData, dsHandle,pixmap))); data->Set(2, DEREFWORD(CreateArea(width,height))); data->Set(3, DEREFWORD(CreatePoint(taskData, xhot,yhot))); } /******************** What if we don't succeed? Badly-formed tuple !!!! */ #undef data return FINISHED(taskData, tuple); } static Handle WriteBitmapFile ( TaskData *taskData, PolyStringObject *string, Display *d, Pixmap bitmap, unsigned w, unsigned h, int x, int y ) { char name[500]; int s; Poly_string_to_C(string,name,sizeof(name)); s = XWriteBitmapFile(d,name,bitmap,w,h,x,y); return Make_arbitrary_precision(taskData, s); } static Handle GetDefault(TaskData *taskData, Display *d, PolyStringObject *s1, PolyStringObject *s2) { char program[500]; char option[500]; char *s; Poly_string_to_C(s1,program,sizeof(program)); Poly_string_to_C(s2,option ,sizeof(option)); s = XGetDefault(d,program,option); if (s == NULL) RaiseXWindows(taskData, "XGetDefault failed"); return Make_string(s); } static void GetWindows(TaskData *taskData, PolyWord p, void *w, unsigned) { *(Window *)w = GetWindow(taskData, (X_Object *)p.AsObjPtr()); } static void GetSegments(TaskData *taskData, PolyWord pp, void *w, unsigned) { XSegment *A = (XSegment *)w; PolyObject *p = pp.AsObjPtr(); A->x1 = GetPointX(taskData, p->Get(0)); A->y1 = GetPointY(taskData, p->Get(0)); A->x2 = GetPointX(taskData, p->Get(1)); A->y2 = GetPointY(taskData, p->Get(1)); } static void GetChar2(TaskData *taskData, PolyWord p, void *v, unsigned) { XChar2b *A = (XChar2b *)v; unsigned short u = get_C_ushort(taskData, p); A->byte1 = u >> 8; A->byte2 = u &0xFF; } static void CopyString(TaskData *, PolyWord w, void *v, unsigned) { char **p = (char**)v; PolyStringObject *s = GetString(w); POLYUNSIGNED n = s->length+1; *p = (char*)malloc(n); Poly_string_to_C(s,*p,n); } static void GetText(TaskData *taskData, PolyWord p, void *w, unsigned) { XTextItem *A = (XTextItem *)w; PolyObject *obj = p.AsObjPtr(); CopyString(taskData, obj->Get(0), &A->chars, 0); A->nchars = strlen(A->chars); A->delta = get_C_short(taskData, obj->Get(1)); A->font = GetFont(taskData, (X_Object *)obj->Get(2).AsObjPtr()); } static void GetText16(TaskData *taskData, PolyWord p, void *v, unsigned) { XTextItem16 *A = (XTextItem16 *)v; PolyObject *obj = p.AsObjPtr(); unsigned N = ListLength(obj->Get(0)); XChar2b *L = (XChar2b *) malloc(N * sizeof(XChar2b)); GetList4(taskData,obj->Get(0),L,sizeof(XChar2b),GetChar2); A->chars = L; A->nchars = N; A->delta = get_C_short(taskData, obj->Get(1)); A->font = GetFont(taskData, (X_Object *)obj->Get(2).AsObjPtr()); } typedef void (*GetFunc)(TaskData *taskData, PolyWord, void*, unsigned); static void SetClipRectangles ( TaskData *taskData, Display *d, GC gc, int x, int y, Handle list, unsigned order ) { if (ISNIL(DEREFWORD(list))) { XSetClipRectangles(d,gc,x,y,NULL,0,order); } else { unsigned N = ListLength(DEREFWORD(list)); XRectangle *L = (XRectangle *) alloca(N * sizeof(XRectangle)); GetList4(taskData, DEREFWORD(list),L,sizeof(XRectangle),GetRects); XSetClipRectangles(d,gc,x,y,L,N,order); } } static void GetUChars(TaskData *taskData, PolyWord p, void *u, unsigned) { *(uchar*)u = get_C_uchar(taskData, p); } static void SetDashes ( TaskData *taskData, Display *d, GC gc, unsigned offset, Handle list ) { if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); char *D = (char *) alloca(N); GetList4(taskData,DEREFWORD(list),D,sizeof(uchar),GetUChars); XSetDashes(d,gc,offset,D,N); } } static Handle CreateDrawable ( TaskData *taskData, void *p, Handle dsHandle /* Handle to (X_Display_Object *) */ ) { return EmptyWindow(taskData, dsHandle,*(Window*)p); } static Handle QueryTree ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w ) { Window root,parent,*children; unsigned n; Handle data; int s = XQueryTree(DEREFDISPLAYHANDLE(dsHandle)->display,w,&root,&parent,&children,&n); if (s == 0) RaiseXWindows(taskData, "XQueryTree failed"); data = CreateTriple(taskData, EmptyWindow(taskData, dsHandle,root), EmptyWindow(taskData, dsHandle,parent), CreateList5(taskData, n,children,sizeof(Window),CreateDrawable,dsHandle)); if (n) XFree((char *)children); return data; } static void RestackWindows(TaskData *taskData, Handle list /* handle to list of X_Window_Objects (?) */) { if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); Window *W = (Window *) alloca(N * sizeof(Window)); Display *d = GetDisplay(taskData, (X_Object *)DEREFLISTHANDLE(list)->h.AsObjPtr()); GetList4(taskData, DEREFWORD(list),W,sizeof(Window),GetWindows); XRestackWindows(d,W,N); } } static Handle GetGeometry ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Drawable w ) { int x,y; unsigned width,height,borderWidth,depth; Window root; Handle dataHandle; int s = XGetGeometry(DEREFDISPLAYHANDLE(dsHandle)->display,w,&root,&x,&y,&width,&height,&borderWidth,&depth); if (s == 0) RaiseXWindows(taskData, "XGetGeometry failed"); dataHandle = alloc_and_save(taskData, 5, F_MUTABLE_BIT); #define data DEREFHANDLE(dataHandle) data->Set(0, DEREFWORD(EmptyWindow(taskData, dsHandle,root))); data->Set(1, DEREFWORD(CreatePoint(taskData, x,y))); data->Set(2, DEREFWORD(CreateArea(width,height))); data->Set(3, DEREFWORD(Make_arbitrary_precision(taskData, borderWidth))); data->Set(4, DEREFWORD(Make_arbitrary_precision(taskData, depth))); #undef data return FINISHED(taskData, dataHandle); } static Handle GetWindowAttributes ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Drawable w ) { XWindowAttributes wa; Handle dataHandle; int s = XGetWindowAttributes(DEREFDISPLAYHANDLE(dsHandle)->display,w,&wa); if (s == 0) RaiseXWindows(taskData, "XGetWindowAttributes failed"); dataHandle = alloc_and_save(taskData, 20, F_MUTABLE_BIT); /* HACKY - should define struct? */ DEREFHANDLE(dataHandle)->Set( 0, DEREFWORD(CreatePoint(taskData, wa.x,wa.y))); DEREFHANDLE(dataHandle)->Set( 1, DEREFWORD(CreateArea(wa.width,wa.height))); DEREFHANDLE(dataHandle)->Set( 2, DEREFWORD(Make_int(wa.border_width))); DEREFHANDLE(dataHandle)->Set( 3, DEREFWORD(Make_arbitrary_precision(taskData, wa.depth))); DEREFHANDLE(dataHandle)->Set( 4, DEREFWORD(EmptyVisual(taskData, dsHandle,wa.visual))); DEREFHANDLE(dataHandle)->Set( 5, DEREFWORD(EmptyWindow(taskData, dsHandle,wa.root))); DEREFHANDLE(dataHandle)->Set( 6, DEREFWORD(Make_arbitrary_precision(taskData, wa.c_class))); DEREFHANDLE(dataHandle)->Set( 7, DEREFWORD(Make_arbitrary_precision(taskData, wa.bit_gravity))); DEREFHANDLE(dataHandle)->Set( 8, DEREFWORD(Make_arbitrary_precision(taskData, wa.win_gravity))); DEREFHANDLE(dataHandle)->Set( 9, DEREFWORD(Make_arbitrary_precision(taskData, wa.backing_store))); DEREFHANDLE(dataHandle)->Set(10, DEREFWORD(Make_arbitrary_precision(taskData, wa.backing_planes))); DEREFHANDLE(dataHandle)->Set(11, DEREFWORD(Make_arbitrary_precision(taskData, wa.backing_pixel))); DEREFHANDLE(dataHandle)->Set(12, DEREFWORD(Make_bool(wa.save_under))); DEREFHANDLE(dataHandle)->Set(13, DEREFWORD(EmptyColormap(taskData, dsHandle,wa.colormap))); DEREFHANDLE(dataHandle)->Set(14, DEREFWORD(Make_bool(wa.map_installed))); DEREFHANDLE(dataHandle)->Set(15, DEREFWORD(Make_arbitrary_precision(taskData, wa.map_state))); DEREFHANDLE(dataHandle)->Set(16, DEREFWORD(Make_arbitrary_precision(taskData, wa.all_event_masks))); DEREFHANDLE(dataHandle)->Set(17, DEREFWORD(Make_arbitrary_precision(taskData, wa.your_event_mask))); DEREFHANDLE(dataHandle)->Set(18, DEREFWORD(Make_arbitrary_precision(taskData, wa.do_not_propagate_mask))); DEREFHANDLE(dataHandle)->Set(19, DEREFWORD(Make_bool(wa.override_redirect))); return FINISHED(taskData, dataHandle); } static void ChangeWindowAttributes ( TaskData *taskData, X_Window_Object *W, unsigned n, PolyWord P ) { XSetWindowAttributes a; unsigned mask = 1 << n; switch(mask) { case CWBitGravity: a.bit_gravity = get_C_ulong(taskData, P); break; case CWWinGravity: a.win_gravity = get_C_ulong(taskData, P); break; case CWBackingStore: a.backing_store = get_C_ulong(taskData, P); break; case CWBackingPlanes: a.backing_planes = get_C_ulong(taskData, P); break; case CWBackingPixel: a.backing_pixel = get_C_ulong(taskData, P); break; case CWOverrideRedirect: a.override_redirect = get_C_ulong(taskData, P); break; case CWSaveUnder: a.save_under = get_C_ulong(taskData, P); break; case CWEventMask: a.event_mask = get_C_ulong(taskData, P); break; case CWDontPropagate: a.do_not_propagate_mask = get_C_ulong(taskData, P); break; case CWBackPixel: a.background_pixel = get_C_ulong(taskData, P); W->backgroundPixmap = 0; break; case CWBackPixmap: a.background_pixmap = GetPixmap(taskData, (X_Object *)P.AsObjPtr()); W->backgroundPixmap = PixmapObject((X_Object *)P.AsObjPtr()); break; case CWBorderPixel: a.border_pixel = get_C_ulong(taskData, P); W->borderPixmap = 0; break; case CWBorderPixmap: a.border_pixmap = GetPixmap(taskData, (X_Object *)P.AsObjPtr()); W->borderPixmap = PixmapObject((X_Object *)P.AsObjPtr()); break; case CWColormap: a.colormap = GetColormap(taskData, (X_Object *)P.AsObjPtr()); W->colormap_object = ColormapObject((X_Object *)P.AsObjPtr()); break; case CWCursor: a.cursor = GetCursor(taskData, (X_Object *)P.AsObjPtr()); W->cursor_object = CursorObject((X_Object *)P.AsObjPtr()); break; default: Crash ("Bad window mask %u",mask); } XChangeWindowAttributes(GetDisplay(taskData, (X_Object *)W),GetWindow(taskData, (X_Object *)W),mask,&a); } static void ConfigureWindow ( TaskData *taskData, Display *d, Window w, PolyWord tup /* (P,S,w,d,s,flags) */ ) { PolyObject *tuple = tup.AsObjPtr(); XWindowChanges wc; unsigned mask = get_C_ulong(taskData, tuple->Get(5)); CheckZeroRect(taskData, tuple->Get(1)); wc.x = GetPointX (taskData,tuple->Get(0)); wc.y = GetPointY (taskData,tuple->Get(0)); wc.width = GetRectW (taskData,tuple->Get(1)); wc.height = GetRectH (taskData,tuple->Get(1)); wc.border_width = get_C_ulong(taskData, tuple->Get(2)); wc.sibling = GetWindow (taskData,(X_Object *)tuple->Get(3).AsObjPtr()); wc.stack_mode = get_C_ulong(taskData, tuple->Get(4)); XConfigureWindow(d,w,mask,&wc); } /* The order of these depends on the XColor datatype */ typedef struct { PolyWord red; /* ML bool */ PolyWord blue; /* ML bool */ PolyWord doRed; /* ML bool */ PolyWord green; /* ML int */ PolyWord pixel; /* ML int */ PolyWord doBlue; /* ML int */ PolyWord doGreen; /* ML int */ } MLXColor; /* in Poly heap */ static void ClearXColor(XColor *x) { x->red = x->green = x->blue = x->pixel = x->flags = 0; } static Handle CreateXColor(TaskData *taskData, XColor *x) { Handle XHandle = alloc_and_save(taskData, SIZEOF(MLXColor), F_MUTABLE_BIT); #define X ((MLXColor *)DEREFHANDLE(XHandle)) X->red = DEREFWORD(Make_arbitrary_precision(taskData, x->red)); X->green = DEREFWORD(Make_arbitrary_precision(taskData, x->green)); X->blue = DEREFWORD(Make_arbitrary_precision(taskData, x->blue)); X->pixel = DEREFWORD(Make_arbitrary_precision(taskData, x->pixel)); X->doRed = DEREFWORD(Make_bool(x->flags &DoRed)); X->doGreen = DEREFWORD(Make_bool(x->flags &DoGreen)); X->doBlue = DEREFWORD(Make_bool(x->flags &DoBlue)); #undef X return FINISHED(taskData, XHandle); } static Handle CreateXColorF(TaskData *taskData, void *p) { return CreateXColor(taskData, (XColor*)p); } static XColor xcolor1 = { 0 }; static XColor xcolor2 = { 0 }; static void GetXColor(TaskData *taskData, PolyWord p, void *v, unsigned) { MLXColor *P = (MLXColor *)p.AsObjPtr(); XColor *x = (XColor *)v; x->red = get_C_ushort(taskData, P->red); x->green = get_C_ushort(taskData, P->green); x->blue = get_C_ushort(taskData, P->blue); x->pixel = get_C_ulong (taskData, P->pixel); x->flags = (DoRed * get_C_ulong(taskData, P->doRed)) | (DoGreen * get_C_ulong(taskData, P->doGreen)) | (DoBlue * get_C_ulong(taskData, P->doBlue)); } static XColor *GetXColor1(TaskData *taskData, PolyWord P) { GetXColor(taskData, P, &xcolor1, 0); return &xcolor1; } static XColor *GetXColor2(TaskData *taskData, PolyWord P) { GetXColor(taskData, P, &xcolor2, 0); return &xcolor2; } static Handle AllocColor(TaskData *taskData, Display *d, Colormap cmap, XColor *x) { int s = XAllocColor(d,cmap,x); if (s == 0) RaiseXWindows(taskData, "XAllocColor failed"); return CreateXColor(taskData, x); } static Handle CreateUnsigned(TaskData *taskData, void *q) { unsigned *p = (unsigned *)q; return Make_arbitrary_precision(taskData, *p); } static Handle CreateUnsignedLong(TaskData *taskData, void *p) { return Make_arbitrary_precision(taskData, *(unsigned long*)p); } static Handle AllocColorCells ( TaskData *taskData, Display *d, Colormap cmap, unsigned contig, unsigned nplanes, unsigned ncolors ) { unsigned long *masks; /* was unsigned SPF 6/1/94 */ unsigned long *pixels; /* was unsigned SPF 6/1/94 */ int s; if (ncolors < 1) RaiseRange(taskData); masks = (unsigned long *) alloca(nplanes * sizeof(unsigned long)); pixels = (unsigned long *) alloca(ncolors * sizeof(unsigned long)); s = XAllocColorCells(d,cmap,contig,masks,nplanes,pixels,ncolors); if (s == 0) RaiseXWindows (taskData, "XAllocColorCells failed"); return CreatePair(taskData, CreateList4(taskData,nplanes,masks ,sizeof(unsigned long),CreateUnsignedLong), CreateList4(taskData,ncolors,pixels,sizeof(unsigned long),CreateUnsignedLong)); } static Handle AllocColorPlanes ( TaskData *taskData, Display *d, Colormap cmap, unsigned contig, unsigned ncolors, unsigned nreds, unsigned ngreens, unsigned nblues ) { unsigned long rmask; /* was unsigned SPF 6/1/94 */ unsigned long gmask; /* was unsigned SPF 6/1/94 */ unsigned long bmask; /* was unsigned SPF 6/1/94 */ unsigned long *pixels; /* was unsigned SPF 6/1/94 */ Handle tuple; int s; if (ncolors < 1) RaiseRange(taskData); pixels = (unsigned long *) alloca(ncolors * sizeof(unsigned long)); s = XAllocColorPlanes(d,cmap,contig,pixels,ncolors,nreds,ngreens,nblues,&rmask,&gmask,&bmask); if (s == 0) RaiseXWindows (taskData, "XAllocColorPlanes failed"); tuple = alloc_and_save(taskData, 4, F_MUTABLE_BIT); #define data DEREFHANDLE(tuple) data->Set(0, DEREFWORD(CreateList4(taskData,ncolors,pixels,sizeof(unsigned long),CreateUnsignedLong))); data->Set(1, DEREFWORD(Make_arbitrary_precision(taskData, rmask))); data->Set(2, DEREFWORD(Make_arbitrary_precision(taskData, gmask))); data->Set(3, DEREFWORD(Make_arbitrary_precision(taskData, bmask))); #undef data return FINISHED(taskData, tuple); } static Handle AllocNamedColor(TaskData *taskData, Display *d, Colormap cmap, PolyStringObject *string) { char name[500]; int s; XColor hardware; XColor database; ClearXColor(&hardware); ClearXColor(&database); Poly_string_to_C(string,name,sizeof(name)); s = XAllocNamedColor(d,cmap,name,&hardware,&database); if (s == 0) RaiseXWindows (taskData, "XAllocNamedColor failed"); return CreatePair(taskData, CreateXColor(taskData, &hardware),CreateXColor(taskData, &database)); } static Handle LookupColor(TaskData *taskData, Display *d, Colormap cmap, PolyStringObject *string) { char name[500]; int s; XColor hardware; XColor database; ClearXColor(&hardware); ClearXColor(&database); Poly_string_to_C(string,name,sizeof(name)); s = XLookupColor(d,cmap,name,&database,&hardware); if (s == 0) RaiseXWindows (taskData, "XLookupColor failed"); return CreatePair(taskData, CreateXColor(taskData, &database),CreateXColor(taskData, &hardware)); } static Handle ParseColor(TaskData *taskData, Display *d, Colormap cmap, PolyStringObject *string) { char name[500]; int s; XColor x; ClearXColor(&x); Poly_string_to_C(string,name,sizeof(name)); s = XParseColor(d,cmap,name,&x); if (s == 0) RaiseXWindows(taskData, "XParseColor failed"); return CreateXColor(taskData, &x); } static Handle QueryColor(TaskData *taskData, Display *d, Colormap cmap, unsigned pixel) { XColor x; ClearXColor(&x); x.pixel = pixel; XQueryColor(d,cmap,&x); return CreateXColor(taskData, &x); } static void GetXPixel(TaskData *taskData, PolyWord p, void *v, unsigned) { XColor *X = (XColor *)v; ClearXColor(X); X->pixel = get_C_ulong(taskData, p); } static Handle QueryColors(TaskData *taskData, Display *d, Colormap cmap, Handle list) { unsigned N = ListLength(DEREFWORD(list)); XColor *P = (XColor *) alloca(N * sizeof(XColor)); GetList4(taskData, DEREFWORD(list),P,sizeof(XColor),GetXPixel); XQueryColors(d,cmap,P,N); return CreateList4(taskData,N,P,sizeof(XColor),CreateXColorF); } static void StoreNamedColor ( Display *d, Colormap cmap, PolyStringObject *string, unsigned pixel, unsigned doRed, unsigned doGreen, unsigned doBlue ) { unsigned flags = (DoRed * doRed) | (DoGreen * doGreen) | (DoBlue * doBlue); char name[500]; Poly_string_to_C(string,name,sizeof(name)); XStoreNamedColor(d,cmap,name,pixel,flags); } static void StoreColors(TaskData *taskData, Display *d, Colormap cmap, Handle list) { unsigned N = ListLength(DEREFWORD(list)); XColor *P = (XColor *) alloca(N * sizeof(XColor)); GetList4(taskData, DEREFWORD(list),P,sizeof(XColor),GetXColor); XStoreColors(d,cmap,P,N); } static void GetUnsigned(TaskData *taskData, PolyWord p, void *v, unsigned) { unsigned *u = (unsigned *)v; *u = get_C_ulong(taskData, p); } static void GetUnsignedLong(TaskData *taskData, PolyWord p, void *v, unsigned) { unsigned long *u = (unsigned long *)v; *u = get_C_ulong(taskData, p); } static void FreeColors ( TaskData *taskData, Display *d, Colormap cmap, Handle list, unsigned planes ) { unsigned N = ListLength(DEREFWORD(list)); unsigned long *P = (unsigned long *) alloca(N * sizeof(unsigned long)); GetList4(taskData,DEREFWORD(list),P,sizeof(unsigned long),GetUnsignedLong); XFreeColors(d,cmap,P,N,planes); } static Handle CreateColormap ( TaskData *taskData, void *p, Handle dsHandle /* handle to (X_Display_Object *) */ ) { return EmptyColormap(taskData, dsHandle,*(Colormap *)p); } static Handle ListInstalledColormaps ( TaskData *taskData, Handle dsHandle, /* handle to (X_Display_Object *) */ Drawable drawable ) { int count; Colormap *cmaps; Handle list; cmaps = XListInstalledColormaps(DEREFDISPLAYHANDLE(dsHandle)->display,drawable,&count); if (cmaps == 0) RaiseXWindows(taskData, "XListInstalledColormaps failed"); list = CreateList5(taskData,count,cmaps,sizeof(Colormap),CreateColormap,dsHandle); XFree((char *)cmaps); return list; } static Handle GetTimeOfDay(TaskData *taskData) { TimeVal now; gettimeofday(&now, NULL); return CreatePair(taskData, Make_arbitrary_precision(taskData, now.tv_sec),Make_arbitrary_precision(taskData, now.tv_usec)); } static Handle GetState(TaskData *taskData, X_Window_Object *P) { assert(UNTAGGED(P->type) == X_Window); CheckExists((X_Object *)P,window); if (ISNIL(P->handler)) Crash ("No handler set"); return CreatePair(taskData, SAVE(P->handler),SAVE(P->state)); } static void SetState(X_Window_Object *W, PolyWord handler, PolyWord state) { if (! ResourceExists((X_Object *)W)) return; assert(W->type == TAGGED(X_Window)); if (NONNIL(handler)) { /* we are setting the handler and initial state */ /* so we need to remove all pending messages for */ /* this window since they will have the wrong type */ PurgePendingWindowMessages(W); W->handler = handler; W->state = state; } else W->state = state; /* just update state */ } /* Check if the first timer event has already expired. */ static void CheckTimerQueue(void) { if (TList) { TimeVal now; gettimeofday(&now, NULL); TList->expired = TimeLeq(&TList->timeout,&now); } } static void InsertTimeout ( TaskData *taskData, X_Window_Object *window_object, unsigned ms, PolyWord alpha, PolyWord handler ) { T_List **tail; T_List *newp; TimeVal now; assert(window_object->type == TAGGED(X_Window)); CheckExists((X_Object *)window_object,window); if (ISNIL(window_object->handler)) Crash ("No handler set"); if (window_object->handler != handler) RaiseXWindows(taskData, "Handler mismatch"); { /* find insertion point in list */ TimeVal dt; gettimeofday(&now, NULL); dt.tv_sec = ms / 1000; dt.tv_usec = 1000 * (ms % 1000); newp = (T_List *) malloc(sizeof(T_List)); TimeAdd(&now,&dt,&newp->timeout); /* We use TimeLt here, not TimeLeq, because we want to add new messages AFTER existing ones. SPF 21/3/97 */ for(tail = &TList; *tail; tail = &(*tail)->next) { if (TimeLt(&newp->timeout,&(*tail)->timeout)) break; } } newp->next = *tail; newp->window_object = window_object; newp->widget_object = (X_Widget_Object *)0; newp->alpha = alpha.AsObjPtr(); newp->handler = handler.AsObjPtr(); newp->expired = 0; *tail = newp; } /* called when a widget is destroyed by Xt/Motif */ static void DestroyWidgetCallback ( Widget widget, XtPointer client_data, XtPointer call_data ) { /* find the ML widget (if any) associated with the C widget */ X_Widget_Object *widget_object = FindWidget(widget); if (widget_object != NULL) { /* Destroy the ML widget representations */ DestroyXObject((X_Object *)widget_object); /* Assume we can't get a C callback from a destroyed widget */ PurgeCCallbacks(widget_object,widget); } debugReclaim(Widget,widget); } #if 0 #define CheckRealized(Widget,Where)\ { \ if (XtIsRealized(Widget) == False) \ RaiseXWindows(taskData, #Where ": widget is not realized"); \ } static Window WindowOfWidget(TaskData *taskData, Widget widget) { CheckRealized(widget,WindowOfWidget); return XtWindowOfObject(widget); } #endif /* Now returns NULL (None) for unrealized widgets SPF 1/2/94 */ static Window WindowOfWidget(Widget widget) { return XtIsRealized(widget) ? XtWindowOfObject(widget) : None; } static void InsertWidgetTimeout ( TaskData *taskData, X_Widget_Object *widget_object, unsigned ms, PolyWord alpha, PolyWord handler ) { T_List **tail; T_List *newp; TimeVal now; assert(widget_object->type == TAGGED(X_Widget)); CheckExists((X_Object *)widget_object,widget); #if NEVER CheckRealized(GetWidget(taskData, (X_Object *)widget_object),InsertWidgetTimeout); #endif /* check that handler occurs in widget's callback list */ { PolyWord p = widget_object->callbackList; for(; NONNIL(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) { MLPair *q = (MLPair *)((ML_Cons_Cell*)p.AsObjPtr())->h.AsObjPtr(); if (SND(q) == handler) break; } if (ISNIL(p)) RaiseXWindows(taskData, "Handler mismatch"); } { TimeVal dt; gettimeofday(&now, NULL); dt.tv_sec = ms / 1000; dt.tv_usec = 1000 * (ms % 1000); newp = (T_List *) malloc(sizeof(T_List)); TimeAdd(&now,&dt,&newp->timeout); /* We use TimeNegative here, not TimeExpired, because we want to add new messages AFTER existing ones. SPF 21/3/97 */ for(tail = &TList; *tail; tail = &(*tail)->next) { if (TimeLt(&newp->timeout,&(*tail)->timeout)) break; } } newp->next = *tail; newp->window_object = (X_Window_Object *)0; newp->widget_object = widget_object; newp->alpha = alpha.AsObjPtr(); newp->handler = handler.AsObjPtr(); newp->expired = 0; *tail = newp; } // Test whether input is available and block if it is not. // N.B. There may be a GC while in here. // This was previously in basicio.cpp but has been moved here // since this is the only place it's used now. static void process_may_block(TaskData *taskData, int fd, int/* ioCall*/) { #ifdef __CYGWIN__ static struct timeval poll = {0,1}; #else static struct timeval poll = {0,0}; #endif fd_set read_fds; int selRes; while (1) { FD_ZERO(&read_fds); FD_SET(fd,&read_fds); /* If there is something there we can return. */ selRes = select(FD_SETSIZE, &read_fds, NULL, NULL, &poll); if (selRes > 0) return; /* Something waiting. */ else if (selRes < 0 && errno != EINTR) // Maybe another thread closed descr raise_syscall(taskData, "select failed %d\n", errno); WaitInputFD waiter(fd); processes->ThreadPauseForIO(taskData, &waiter); } } static Handle NextEvent(TaskData *taskData, Handle dsHandle /* handle to (X_Display_Object *) */) { for (;;) { /* Added here SPF 23/2/95 - check whether a timer event has expired */ CheckTimerQueue(); if (TList && TList->expired) { T_List *next = TList->next; EventHandle E = alloc_and_save(taskData, SIZEOF(ML_Event), F_MUTABLE_BIT); #define event ((ML_Event *)DEREFHANDLE(E)) event->type = DEREFWORD(Make_arbitrary_precision(taskData, 99)); event->sendEvent = DEREFWORD(Make_bool(True)); event->data = TList->alpha; if (TList->window_object != 0) { assert(TList->widget_object == 0); event->window = TList->window_object; event->callbacks = ListNull; event->events = ListNull; assert(TList->window_object->handler == TList->handler); } else /* it is a Widget message */ { /* TList->widget_object etc. act like Roots */ assert(TList->widget_object != 0); { Window w = WindowOfWidget(GetWidget(taskData, (X_Object *)TList->widget_object)); event->window = DEREFWINDOWHANDLE(EmptyWindow(taskData, GetDS(taskData, (X_Object *)TList->widget_object),w)); } { /* create callback list - allocates storage */ Handle tailHandle = SAVE(ListNull); Handle widgetHandle = SAVE(TList->widget_object); Handle handlerHandle = SAVE(TList->handler); Handle pairHandle = CreatePair(taskData, widgetHandle,handlerHandle); event->callbacks = DEREFLISTHANDLE(CreatePair(taskData, pairHandle,tailHandle)); event->events = ListNull; } } #undef event free(TList); TList = next; return FINISHED(taskData, E); } else /* ! (TList && TList->expired) */ if (DEREFDISPLAYHANDLE(dsHandle)->app_context == 0) /* use XNextEvent to get next event */ { Display *display = DEREFDISPLAYHANDLE(dsHandle)->display; int pending = XPending(display); if (pending == 0) { process_may_block(taskData, display->fd, POLY_SYS_XWindows); } else /* X Event arrived */ { XEvent ev; X_Window_Object *W; XNextEvent(display,&ev); W = FindWindow(dsHandle,ev.xany.window); if (W && NONNIL(W->handler)) { EventHandle E = CreateEvent(taskData, dsHandle,&ev,SAVE(W)); if (E) return E; } } } else /* use XtAppNextEvent to get next event */ { /* should use Xt to do time events as well */ int pending = XtAppPending(DEREFDISPLAYHANDLE(dsHandle)->app_context); if (pending == 0) { process_may_block(taskData, DEREFDISPLAYHANDLE(dsHandle)->display->fd, POLY_SYS_XWindows); } else { if ((pending & XtIMXEvent) == 0) /* not an X Event, probably an Xt timer event */ { assert(FList == TAGGED(0)); callbacks_enabled = True; XtAppProcessEvent(DEREFDISPLAYHANDLE(dsHandle)->app_context,pending); callbacks_enabled = False; if (FList != TAGGED(0)) { EventHandle E = alloc_and_save(taskData, SIZEOF(ML_Event), F_MUTABLE_BIT); #define event ((ML_Event *)DEREFHANDLE(E)) event->type = DEREFWORD(Make_arbitrary_precision(taskData, 100)); event->sendEvent = DEREFWORD(Make_bool(True)); event->window = TAGGED(0); event->data = TAGGED(0); event->callbacks = FList; /* FList != 0 */ event->events = GList; #undef event FList = TAGGED(0); GList = TAGGED(0); return FINISHED(taskData, E); } } else /* Xt Event arrived */ { XEvent ev; int dispatched; assert(FList == TAGGED(0)); XtAppNextEvent(DEREFDISPLAYHANDLE(dsHandle)->app_context,&ev); callbacks_enabled = True; dispatched = XtDispatchEvent(&ev); callbacks_enabled = False; if (!dispatched) { X_Window_Object *W = FindWindow(dsHandle,ev.xany.window); assert(FList == TAGGED(0) && GList == TAGGED(0)); if (W && NONNIL(W->handler)) { EventHandle E = CreateEvent(taskData, dsHandle,&ev,SAVE(W)); if (E) return E; } } else if (! FList.IsTagged() || ! GList.IsTagged()) { EventHandle E = CreateEvent(taskData, dsHandle,&ev,EmptyWindow(taskData, dsHandle,ev.xany.window)); if (E) return E; } } } } } } static Handle GetInputFocus(TaskData *taskData, Handle dsHandle /* handle to (X_Display_Object *) */) { Window focus; int revertTo; XGetInputFocus(DEREFDISPLAYHANDLE(dsHandle)->display,&focus,&revertTo); return CreatePair(taskData, EmptyWindow(taskData, dsHandle,focus),Make_arbitrary_precision(taskData, revertTo)); } static void SetSelectionOwner ( Handle dsHandle, /* handle to (X_Display_Object *) */ unsigned selection, Window owner, unsigned time ) { Window old = XGetSelectionOwner(DEREFDISPLAYHANDLE(dsHandle)->display,selection); if (old != owner) { /* SelectionClear is only sent by the server when the ownership of a */ /* selection passes from one client to another. We want every ML */ /* window to behave like a separate client, so when the ownership of */ /* a selection passes from one ML window to another we have to send */ /* the SelectionClear ourselves. */ X_Window_Object *W = FindWindow(dsHandle,old); if (W && NONNIL(W->handler)) /* this clients window */ { XEvent event; /* was XSelectionClearEvent SPF 6/1/94 */ event.xselectionclear.type = SelectionClear; event.xselectionclear.serial = 0; event.xselectionclear.send_event = True; event.xselectionclear.display = DEREFDISPLAYHANDLE(dsHandle)->display; event.xselectionclear.window = old; event.xselectionclear.selection = selection; event.xselectionclear.time = time; XSendEvent(DEREFDISPLAYHANDLE(dsHandle)->display,old,True,0,&event); } } XSetSelectionOwner(DEREFDISPLAYHANDLE(dsHandle)->display,selection,owner,time); } static void SendSelectionNotify ( Display *d, unsigned selection, unsigned target, unsigned property, Window requestor, unsigned time ) { XEvent event; /* was XSelectionEvent SPF 6/1/94 */ event.xselection.type = SelectionNotify; event.xselection.serial = 0; event.xselection.send_event = True; event.xselection.display = d; event.xselection.requestor = requestor; event.xselection.selection = selection; event.xselection.target = target; event.xselection.property = property; event.xselection.time = time; XSendEvent(d,requestor,True,0,&event); } static Handle InternAtom ( TaskData *taskData, Display *d, PolyStringObject *string, Bool only_if_exists ) { char name[500]; Poly_string_to_C(string,name,sizeof(name)); return Make_arbitrary_precision(taskData, XInternAtom(d,name,only_if_exists)); } static Handle GetAtomName(TaskData *taskData, Display *d, unsigned atom) { Handle s; char *name = XGetAtomName(d,atom); if (name == NULL) RaiseXWindows(taskData, "XGetAtomName failed"); s = Make_string(name); XFree((char *)name); return s; } /* The order of these depends on the XCharStruct datatype */ typedef struct { PolyWord width; /* ML int */ PolyWord ascent; /* ML int */ PolyWord descent; /* ML int */ PolyWord lbearing; /* ML int */ PolyWord rbearing; /* ML int */ PolyWord attributes; /* ML int */ } MLXCharStruct; static Handle CreateCharStruct(TaskData *taskData, void *v) { XCharStruct *cs = (XCharStruct *)v; Handle dataHandle = alloc_and_save(taskData, SIZEOF(MLXCharStruct), F_MUTABLE_BIT); #define data ((MLXCharStruct *)DEREFHANDLE(dataHandle)) data->width = DEREFWORD(Make_int(cs->width)); data->ascent = DEREFWORD(Make_int(cs->ascent)); data->descent = DEREFWORD(Make_int(cs->descent)); data->lbearing = DEREFWORD(Make_int(cs->lbearing)); data->rbearing = DEREFWORD(Make_int(cs->rbearing)); data->attributes = DEREFWORD(Make_arbitrary_precision(taskData, cs->attributes)); #undef data return FINISHED(taskData, dataHandle); } /* The order of these depends on the XFontStruct datatype */ typedef struct { X_Font_Object *font_object; PolyWord ascent; /* ML int */ PolyWord descent; /* ML int */ PolyWord maxChar; /* ML int */ PolyWord minChar; /* ML int */ PolyWord perChar; /* ML XCharStruct list */ PolyWord maxByte1; /* ML int */ PolyWord minByte1; /* ML int */ PolyWord direction; /* (short ML int) FontLeftToRight | FontRightToLeft */ MLXCharStruct *maxBounds; MLXCharStruct *minBounds; PolyWord defaultChar; /* ML int */ PolyWord allCharsExist; /* ML bool */ } MLXFontStruct; static Handle CreateFontStruct ( TaskData *taskData, void *v, Handle dsHandle /* Handle to (X_Display_Object *) */ ) { XFontStruct *fs = (XFontStruct *)v; Handle dataHandle = alloc_and_save(taskData, SIZEOF(MLXFontStruct), F_MUTABLE_BIT); int n = fs->max_char_or_byte2 - fs->min_char_or_byte2 + 1; if (fs->per_char == 0) n = 0; #define data ((MLXFontStruct *)DEREFHANDLE(dataHandle)) data->font_object = (X_Font_Object *)DEREFHANDLE(EmptyFont(taskData, dsHandle,fs->fid,fs)); data->ascent = DEREFWORD(Make_int(fs->ascent)); data->descent = DEREFWORD(Make_int(fs->descent)); data->maxChar = DEREFWORD(Make_arbitrary_precision(taskData, fs->max_char_or_byte2)); data->minChar = DEREFWORD(Make_arbitrary_precision(taskData, fs->min_char_or_byte2)); data->perChar = DEREFHANDLE(CreateList4(taskData,n,fs->per_char,sizeof(XCharStruct),CreateCharStruct)); data->maxByte1 = DEREFWORD(Make_arbitrary_precision(taskData, fs->max_byte1)); data->minByte1 = DEREFWORD(Make_arbitrary_precision(taskData, fs->min_byte1)); data->direction = DEREFWORD(Make_arbitrary_precision(taskData, (fs->direction == FontLeftToRight) ? 1 : 2)); data->maxBounds = (MLXCharStruct *)DEREFHANDLE(CreateCharStruct(taskData, &fs->max_bounds)); data->minBounds = (MLXCharStruct *)DEREFHANDLE(CreateCharStruct(taskData, &fs->min_bounds)); data->defaultChar = DEREFWORD(Make_arbitrary_precision(taskData, fs->default_char)); data->allCharsExist = DEREFWORD(Make_bool(fs->all_chars_exist)); #undef data return FINISHED(taskData, dataHandle); } static XFontStruct *GetFS(TaskData *taskData, X_Font_Object *P) { assert(UNTAGGED(P->type) == X_Font); if (*(P->fs) == NULL) RaiseXWindows(taskData, "Not a real XFontStruct"); CheckExists((X_Object *)P,font); return *(P->fs); } static XFontStruct *GetFontStruct(TaskData *taskData,PolyWord p) { MLXFontStruct *P = (MLXFontStruct *)p.AsObjPtr(); return GetFS(taskData,P->font_object); } static Handle CreateString(TaskData *taskData, void *s) { return Make_string(*(char **)s); } static Handle GetFontPath(TaskData *taskData, Display *d) { Handle list; char **names; int count; names = XGetFontPath(d,&count); if (names == 0) RaiseXWindows(taskData, "XGetFontPath failed"); list = CreateList4(taskData,count,names,sizeof(char *),CreateString); XFreeFontNames(names); return list; } static void FreeStrings(char **s, int n) { while(n--) free(*s++); return; } static void SetFontPath(TaskData *taskData, Display *d, Handle list) { if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); char **D = (char **) alloca(N * sizeof(char *)); GetList4(taskData, DEREFWORD(list),D,sizeof(char *),CopyString); XSetFontPath(d,D,N); FreeStrings(D,N); } return; } static Handle ListFonts(TaskData *taskData,Display *d, PolyStringObject *string, unsigned maxnames) { char name[500]; Handle list; char **names; int count; Poly_string_to_C(string,name,sizeof(name)); names = XListFonts(d,name,maxnames,&count); if (names == 0) RaiseXWindows(taskData, "XListFonts failed"); list = CreateList4(taskData,count,names,sizeof(char *),CreateString); XFreeFontNames(names); return list; } static Handle ListFontsWithInfo ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ PolyStringObject *string, unsigned maxnames ) { char name[500]; char **names; int count; XFontStruct *info; Handle pair; Poly_string_to_C(string,name,sizeof(name)); names = XListFontsWithInfo(DEREFDISPLAYHANDLE(dsHandle)->display,name,maxnames,&count,&info); if (names == 0) RaiseXWindows(taskData, "XListFontsWithInfo failed"); pair = CreatePair(taskData, CreateList4(taskData,count,names,sizeof(char *),CreateString), CreateList5(taskData,count,info,sizeof(XFontStruct),CreateFontStruct,dsHandle)); XFree((char *)info); XFreeFontNames(names); return pair; } static Handle LoadFont ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ PolyStringObject *string ) { char name[500]; Font font; Poly_string_to_C(string,name,sizeof(name)); font = XLoadFont(DEREFDISPLAYHANDLE(dsHandle)->display,name); if (font == 0) RaiseXWindows(taskData, "XLoadFont failed"); return EmptyFont(taskData, dsHandle,font,(XFontStruct *)NULL); } static Handle LoadQueryFont ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ PolyStringObject *string ) { char name[500]; XFontStruct *fs; Poly_string_to_C(string,name,sizeof(name)); fs = XLoadQueryFont(DEREFDISPLAYHANDLE(dsHandle)->display,name); if (fs == 0) RaiseXWindows(taskData, "XLoadQueryFont failed"); return CreateFontStruct(taskData,fs,dsHandle); } static Handle QueryFont ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Font font ) { XFontStruct *fs; fs = XQueryFont(DEREFDISPLAYHANDLE(dsHandle)->display,font); if (fs == 0) RaiseXWindows(taskData, "XQueryFont failed"); return CreateFontStruct(taskData,fs,dsHandle); } static Handle TextExtents(TaskData *taskData, XFontStruct *fs, PolyStringObject *s) { Handle dataHandle = alloc_and_save(taskData, 4, F_MUTABLE_BIT); int direction,ascent,descent; XCharStruct overall; XTextExtents(fs,s->chars,s->length,&direction,&ascent,&descent,&overall); #define data DEREFHANDLE(dataHandle) data->Set(0, DEREFWORD(Make_arbitrary_precision(taskData, (direction == FontLeftToRight) ? 1 : 2))); data->Set(1, DEREFWORD(Make_int(ascent))); data->Set(2, DEREFWORD(Make_int(descent))); data->Set(3, DEREFWORD(CreateCharStruct(taskData, &overall))); #undef data return FINISHED(taskData, dataHandle); } static Handle TextExtents16(TaskData *taskData, XFontStruct *fs, Handle list) { Handle dataHandle = alloc_and_save(taskData, 4, F_MUTABLE_BIT); int direction,ascent,descent; XCharStruct overall; unsigned N = ListLength(DEREFWORD(list)); XChar2b *L = (XChar2b *) alloca(N * sizeof(XChar2b)); GetList4(taskData,DEREFWORD(list),L,sizeof(XChar2b),GetChar2); XTextExtents16(fs,L,N,&direction,&ascent,&descent,&overall); #define data DEREFHANDLE(dataHandle) data->Set(0, DEREFWORD(Make_arbitrary_precision(taskData, (direction == FontLeftToRight) ? 1 : 2))); data->Set(1, DEREFWORD(Make_int(ascent))); data->Set(2, DEREFWORD(Make_int(descent))); data->Set(3, DEREFWORD(CreateCharStruct(taskData, &overall))); #undef data return FINISHED(taskData, dataHandle); } static Handle TextWidth(TaskData *taskData, XFontStruct *fs, PolyStringObject *s) { if (fs->per_char == 0) return Make_int(s->length * fs->max_bounds.width); return Make_int(XTextWidth(fs,s->chars,s->length)); } static Handle TextWidth16(TaskData *taskData, XFontStruct *fs, Handle list) { unsigned N = ListLength(DEREFWORD(list)); XChar2b *L = (XChar2b *) alloca(N * sizeof(XChar2b)); GetList4(taskData, DEREFWORD(list),L,sizeof(XChar2b),GetChar2); return Make_int(XTextWidth16(fs,L,N)); } static Handle GetTextProperty(TaskData *taskData, Display *d, Window w, unsigned property) { XTextProperty T; Handle tuple; int s = XGetTextProperty(d,w,&T,property); if (s == 0) RaiseXWindows(taskData, "XGetTextProperty failed"); tuple = alloc_and_save(taskData, 4, F_MUTABLE_BIT); #define data DEREFHANDLE(tuple) data->Set(0, C_string_to_Poly(taskData, (char *)T.value,T.nitems * T.format / 8)); data->Set(1, DEREFWORD(Make_arbitrary_precision(taskData, T.encoding))); data->Set(2, DEREFWORD(Make_int(T.format))); data->Set(3, DEREFWORD(Make_arbitrary_precision(taskData, T.nitems))); #undef data return FINISHED(taskData, tuple); } static void GetXWMHints(TaskData *taskData, PolyWord p, void *v, unsigned) { PolyObject *P = p.AsObjPtr(); XWMHints *H = (XWMHints *)v; H->input = get_C_ulong(taskData, P->Get(0)); H->initial_state = get_C_ulong(taskData, P->Get(1)); H->icon_pixmap = GetPixmap(taskData, (X_Object *)P->Get(2).AsObjPtr()); H->icon_window = GetWindow(taskData, (X_Object *)P->Get(3).AsObjPtr()); H->icon_x = GetPointX(taskData, P->Get(4)); H->icon_y = GetPointY(taskData, P->Get(4)); H->icon_mask = GetPixmap(taskData, (X_Object *)P->Get(5).AsObjPtr()); H->flags = get_C_ulong(taskData, P->Get(6)); H->window_group = 0; } typedef struct { PolyWord x0; PolyWord x1; PolyWord x2; PolyWord x3; PolyWord x4; PolyWord x5; /* pair of points */ PolyWord x6; PolyWord x7; PolyWord x8; } MLXWMSizeHintsTuple; static void GetXWMSizeHints(TaskData *taskData, PolyWord p, void *v, unsigned) { MLXWMSizeHintsTuple *P = (MLXWMSizeHintsTuple *)p.AsObjPtr(); XSizeHints *H = (XSizeHints *)v; CheckZeroRect(taskData, P->x1); CheckZeroRect(taskData, P->x2); CheckZeroRect(taskData, P->x3); CheckZeroRect(taskData, P->x4); CheckZeroRect(taskData, P->x6); H->x = GetPointX(taskData, P->x0); H->y = GetPointY(taskData, P->x0); H->width = GetRectW(taskData, P->x1); H->height = GetRectH(taskData, P->x1); H->min_width = GetRectW(taskData, P->x2); H->min_height = GetRectH(taskData, P->x2); H->max_width = GetRectW(taskData, P->x3); H->max_height = GetRectH(taskData, P->x3); H->width_inc = GetRectW(taskData, P->x4); H->height_inc = GetRectH(taskData, P->x4); H->min_aspect.x = GetPointX(taskData, FST(P->x5)); H->min_aspect.y = GetPointY(taskData, FST(P->x5)); H->max_aspect.x = GetPointX(taskData, SND(P->x5)); H->max_aspect.y = GetPointY(taskData, SND(P->x5)); H->base_width = GetRectW(taskData, P->x6); H->base_height = GetRectH(taskData, P->x6); H->win_gravity = get_C_ulong(taskData, P -> x7); H->flags = get_C_ulong(taskData, P -> x8); } static void GetIconSize(TaskData *taskData, PolyWord p, void *v, unsigned) { MLTriple *P = (MLTriple *)p.AsObjPtr(); XIconSize *s = (XIconSize *)v; CheckZeroRect(taskData, FST(P)); CheckZeroRect(taskData, SND(P)); CheckZeroRect(taskData, THIRD(P)); s->min_width = GetRectW(taskData, FST(P)); s->min_height = GetRectH(taskData, FST(P)); s->max_width = GetRectW(taskData, SND(P)); s->max_height = GetRectH(taskData, SND(P)); s->width_inc = GetRectW(taskData, THIRD(P)); s->height_inc = GetRectH(taskData, THIRD(P)); } static void GetSigned(TaskData *taskData, PolyWord p, void *i, unsigned) { *(int*)i = get_C_long(taskData, p); } static void GetPixmaps(TaskData *taskData, PolyWord pp, void *m, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(Pixmap *)m = GetPixmap(taskData, p); } static void GetColormaps(TaskData *taskData, PolyWord pp, void *v, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(Colormap *)v = GetColormap(taskData, p); } static void GetCursors(TaskData *taskData, PolyWord pp, void *c, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(Cursor *)c = GetCursor(taskData, p); } static void GetDrawables(TaskData *taskData, PolyWord pp, void *d, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(Drawable *)d = GetDrawable(taskData, p); } static void GetFonts(TaskData *taskData, PolyWord pp, void *f, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(Font *)f = GetFont(taskData, p); } static void GetVisualIds(TaskData *taskData, PolyWord pp, void *u, unsigned) { X_Object *p = (X_Object *)pp.AsObjPtr(); *(unsigned *)u = GetVisual(taskData, p)->visualid; } static void SetProperty ( TaskData *taskData, Display *d, Window w, unsigned property, unsigned target, Handle list, unsigned encoding ) { unsigned format; unsigned bytes; uchar *value; /* SPF 7/7/94 - XA_STRING pulled out as special case; this enables */ /* gcc to understand the previously data-dependant control flow. */ if (encoding == XA_STRING) { PolyStringObject *s = GetString (DEREFHANDLE(list)); format = 8; bytes = s->length; value = (uchar *) s->chars; } else { unsigned length = ListLength(DEREFWORD(list)); unsigned size; GetFunc get; switch(encoding) { case XA_ATOM: size = sizeof(unsigned); get = GetUnsigned; format = 32; break; case XA_BITMAP: size = sizeof(Pixmap); get = GetPixmaps; format = 32; break; case XA_COLORMAP: size = sizeof(Colormap); get = GetColormaps; format = 32; break; case XA_CURSOR: size = sizeof(Cursor); get = GetCursors; format = 32; break; case XA_DRAWABLE: size = sizeof(Drawable); get = GetDrawables; format = 32; break; case XA_FONT: size = sizeof(Font); get = GetFonts; format = 32; break; case XA_PIXMAP: size = sizeof(Pixmap); get = GetPixmaps; format = 32; break; case XA_VISUALID: size = sizeof(unsigned); get = GetVisualIds; format = 32; break; case XA_CARDINAL: size = sizeof(unsigned); get = GetUnsigned; format = 32; break; case XA_INTEGER: size = sizeof(int); get = GetSigned; format = 32; break; case XA_WINDOW: size = sizeof(Window); get = GetWindows; format = 32; break; case XA_ARC: size = sizeof(XArc); get = GetArcs; format = 16; break; case XA_POINT: size = sizeof(XPoint); get = GetPoints; format = 16; break; case XA_RECTANGLE: size = sizeof(XRectangle); get = GetRects; format = 16; break; case XA_RGB_COLOR_MAP: size = sizeof(XStandardColormap); get = GetStandardColormap; format = 32; break; case XA_WM_HINTS: size = sizeof(XWMHints); get = GetXWMHints; format = 32; break; case XA_WM_SIZE_HINTS: size = sizeof(XSizeHints); get = GetXWMSizeHints; format = 32; break; case XA_WM_ICON_SIZE: size = sizeof(XIconSize); get = GetIconSize; format = 32; break; default: Crash ("Bad property type %x",encoding); /*NOTREACHED*/ } bytes = length * size; value = (uchar *) alloca(bytes); GetList4(taskData, DEREFWORD(list),value,(int)size,get); } { XTextProperty T; T.value = value; T.encoding = target; T.format = format; T.nitems = (bytes * 8) / format; XSetTextProperty(d,w,&T,property); } } static Handle GetWMHints ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w ) { Handle tuple = alloc_and_save(taskData, 7, F_MUTABLE_BIT); XWMHints *H = XGetWMHints(DEREFDISPLAYHANDLE(dsHandle)->display,w); if (H) { #define data DEREFHANDLE(tuple) data->Set(0, DEREFWORD(Make_arbitrary_precision(taskData, H->input))); data->Set(1, DEREFWORD(Make_arbitrary_precision(taskData, H->initial_state))); data->Set(2, DEREFWORD(EmptyPixmap(taskData, dsHandle,H->icon_pixmap))); data->Set(3, DEREFWORD(EmptyWindow(taskData, dsHandle,H->icon_window))); data->Set(4, DEREFWORD(CreatePoint(taskData, H->icon_x,H->icon_y))); data->Set(5, DEREFWORD(EmptyPixmap(taskData, dsHandle,H->icon_mask))); data->Set(6, DEREFWORD(Make_arbitrary_precision(taskData, H->flags))); #undef data XFree((char *)H); } /* else what (?) */ return FINISHED(taskData, tuple); } static Handle GetWMSizeHints ( TaskData *taskData, Display *d, Window w, unsigned property ) { XSizeHints H; long supplied; /* was unsigned SPF 6/1/94 */ Handle tuple = alloc_and_save(taskData, 9, F_MUTABLE_BIT); int s = XGetWMSizeHints(d,w,&H,&supplied,property); if (s) { Handle p1 = CreatePoint(taskData, H.min_aspect.x,H.min_aspect.y); Handle p2 = CreatePoint(taskData, H.max_aspect.x,H.max_aspect.y); #define data DEREFHANDLE(tuple) data->Set(0, DEREFWORD(CreatePoint(taskData, H.x,H.y))); data->Set(1, DEREFWORD(CreateArea(H.width,H.height))); data->Set(2, DEREFWORD(CreateArea(H.min_width,H.min_height))); data->Set(3, DEREFWORD(CreateArea(H.max_width,H.max_height))); data->Set(4, DEREFWORD(CreateArea(H.width_inc,H.height_inc))); data->Set(5, DEREFWORD(CreatePair(taskData, p1,p2))); data->Set(6, DEREFWORD(CreateArea(H.base_width,H.base_height))); data->Set(7, DEREFWORD(Make_arbitrary_precision(taskData, H.win_gravity))); data->Set(8, DEREFWORD(Make_arbitrary_precision(taskData, H.flags))); #undef data } /* else (?) */ return FINISHED(taskData, tuple); } #if 0 typedef struct { MLPair *x0; /* pair of points */ MLXRectangle *x1; PolyWord x2; /* ML int */ } MLWMGeometryTriple; #endif static Handle WMGeometry ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ PolyStringObject *user, PolyStringObject *def, unsigned borderWidth, PolyWord P ) { XSizeHints H; int x,y,width,height,gravity,mask; char userGeometry[500],defaultGeometry[500]; GetXWMSizeHints(taskData, P, &H, 0); Poly_string_to_C(user,userGeometry ,sizeof(userGeometry)); Poly_string_to_C(def ,defaultGeometry,sizeof(defaultGeometry)); mask = XWMGeometry(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen, userGeometry, defaultGeometry, borderWidth, &H,&x,&y,&width,&height,&gravity); return CreateTriple(taskData, CreatePoint(taskData, x,y),CreateArea(width,height),Make_arbitrary_precision(taskData, gravity)); } static Handle CreateIconSize(TaskData *taskData, void *v) { XIconSize *s = (XIconSize *)v; return CreateTriple(taskData, CreateArea(s->min_width,s->min_height), CreateArea(s->max_width,s->max_height), CreateArea(s->width_inc,s->height_inc)); } static Handle GetIconSizes(TaskData *taskData, Display *d, Window w) { XIconSize *sizes; int count; int s = XGetIconSizes(d,w,&sizes,&count); if (s) { Handle list = CreateList4(taskData,count,sizes,sizeof(XIconSize),CreateIconSize); XFree((char *)sizes); return list; } return SAVE(ListNull); } static Handle GetTransientForHint ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w ) { Window p; int s = XGetTransientForHint(DEREFDISPLAYHANDLE(dsHandle)->display,w,&p); if (s == 0) RaiseXWindows(taskData, "XGetTransientForHint failed"); return EmptyWindow(taskData, dsHandle,p); } static Handle GetWMColormapWindows ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window parent ) { Window *windows; int count; int s = XGetWMColormapWindows(DEREFDISPLAYHANDLE(dsHandle)->display,parent,&windows,&count); if (s) { Handle list = CreateList5(taskData,count,windows,sizeof(Window),CreateDrawable,dsHandle); XFree((char *)windows); return list; } return SAVE(ListNull); } static Handle GetRGBColormaps ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Window w, unsigned property ) { XStandardColormap *maps; int count; int s = XGetRGBColormaps(DEREFDISPLAYHANDLE(dsHandle)->display,w,&maps,&count,property); if (s) { Handle list = CreateList5(taskData,count,maps,sizeof(XStandardColormap),CreateStandardColormap,dsHandle); XFree((char *)maps); return list; } return SAVE(ListNull); } static Handle GetID(TaskData *taskData, X_Object *P) { switch(UNTAGGED(P->type)) { case X_GC: return Make_arbitrary_precision(taskData, GetGC(taskData, P)->gid); /* GCID */ case X_Font: return Make_arbitrary_precision(taskData, GetFont(taskData, P)); /* FontID */ case X_Cursor: return Make_arbitrary_precision(taskData, GetCursor(taskData, P)); /* CursorId */ case X_Window: return Make_arbitrary_precision(taskData, GetWindow(taskData, P)); /* DrawableID */ case X_Pixmap: return Make_arbitrary_precision(taskData, GetPixmap(taskData, P)); /* DrawableID */ case X_Colormap: return Make_arbitrary_precision(taskData, GetColormap(taskData, P)); /* ColormapID */ case X_Visual: return Make_arbitrary_precision(taskData, GetVisual(taskData, P)->visualid); /* VisualID */ case X_Widget: return Make_arbitrary_precision(taskData, (unsigned long)GetNWidget(taskData, P)); /* Widget -- SAFE(?) */ default: Crash ("Bad X_Object type (%d) in GetID",UNTAGGED(P->type)) /*NOTREACHED*/; } } static Handle OpenDisplay(TaskData *taskData, PolyStringObject *string) { char name[500]; Display *display; Handle dsHandle /* Handle to (X_Display_Object *) */; Poly_string_to_C(string,name,sizeof(name)); display = XOpenDisplay(name); if (display == 0) RaiseXWindows(taskData, "XOpenDisplay failed"); /* I don't think this is needed. DCJM 26/5/2000. */ /* add_file_descr(display->fd); */ dsHandle = alloc_and_save(taskData, SIZEOF(X_Display_Object), F_MUTABLE_BIT|F_BYTE_OBJ); debug1 ("%s display opened\n",DisplayString(display)); debug1 ("%x display fd\n",display->fd); #define ds DEREFDISPLAYHANDLE(dsHandle) /* Ok to store C values because this is a byte object */ ds->type = TAGGED(X_Display); ds->display = display; ds->screen = DefaultScreen(display); ds->app_context = 0; #undef ds return AddXObject(FINISHED(taskData, dsHandle)); } /* indirection removed SPF 11/11/93 */ static XmFontList GetXmFontList(PolyWord p /* NOT a handle */) { if (NONNIL(p)) { char charset[500]; XmFontList L; MLPair *q = (MLPair *)(((ML_Cons_Cell*)p.AsObjPtr())->h.AsObjPtr()); Poly_string_to_C(SND(q),charset,sizeof(charset)); L = XmFontListCreate((XFontStruct *)FST(q).AsObjPtr(),charset); /* cast added SPF 6/1/94 */ p = ((ML_Cons_Cell*)p.AsObjPtr())->t; while(NONNIL(p)) { q = (MLPair *)(((ML_Cons_Cell*)p.AsObjPtr())->h.AsObjPtr()); Poly_string_to_C(SND(q),charset,sizeof(charset)); L = XmFontListAdd(L,(XFontStruct *)FST(q).AsObjPtr(),charset); /* cast added SPF 6/1/94 */ p = ((ML_Cons_Cell*)p.AsObjPtr())->t; } return L; } return 0; } /* datatype CType = CAccelerators of XtAccelerators | CBool of bool | CColormap of Colormap | CCursor of Cursor | CDimension of int | CFontList of (XFontStruct * string) list | CInt of int | CIntTable of int list | CKeySym of int | CPixmap of Drawable | CPosition of int | CString of string | CStringTable of string list | CTrans of XtTranslations | CUnsignedChar of int | CUnsignedTable of int list | CVisual of Visual | CWidget of Widget | CWidgetList of Widget list | CXmString of XmString | CXmStringTable of XmString list; */ #define CAccelerators 1 #define CBool 2 #define CColormap 3 #define CCursor 4 #define CDimension 5 #define CFontList 6 #define CInt 7 #define CIntTable 8 #define CKeySym 9 #define CPixmap 10 #define CPosition 11 #define CString 12 #define CStringTable 13 #define CTrans 14 #define CUnsignedChar 15 #define CUnsignedTable 16 #define CVisual 17 #define CWidget 18 #define CWidgetList 19 #define CXmString 20 #define CXmStringTable 21 typedef struct { unsigned tag; unsigned N; char *name; union { XtAccelerators acc; Boolean boolean; Colormap cmap; Cursor cursor; Dimension dim; XmFontList F; int i; int *I; KeySym keysym; Pixmap pixmap; Position posn; char *string; char **S; XtTranslations trans; uchar u; uchar *U; Visual *visual; Widget widget; WidgetList W; XmString xmString; XmString *X; } u; } ArgType; static void GetXmString(TaskData *taskData, PolyWord w, void *v, unsigned ) { XmString *p = (XmString *)v; char *s; CopyString(taskData, w, &s, 0); *p = XmStringCreateLtoR(s, (char *)XmSTRING_DEFAULT_CHARSET); free(s); } static void GetXmStrings(TaskData *taskData, PolyWord list, ArgType *T) { T->N = 0; T->u.X = 0; if (NONNIL(list)) { T->N = ListLength(list); T->u.X = (XmString *) malloc(T->N * sizeof(XmString)); GetList4(taskData, list,T->u.X,sizeof(XmString),GetXmString); } } static void GetStrings(TaskData *taskData, PolyWord list, ArgType *T) { T->N = 0; T->u.S = 0; if (NONNIL(list)) { T->N = ListLength(list); T->u.S = (char **) malloc(T->N * sizeof(char *)); GetList4(taskData, list,T->u.S,sizeof(char *),CopyString); } } static void FreeXmStrings(ArgType *T) { for(unsigned i = 0; i < T->N; i++) XmStringFree (T->u.X[i]); free(T->u.X); } static void GetITable(TaskData *taskData, PolyWord list, ArgType *T) { T->N = 0; T->u.I = 0; if (NONNIL(list)) { T->N = ListLength(list); T->u.I = (int *) malloc(T->N * sizeof(int)); GetList4(taskData, list,T->u.I,sizeof(int),GetUnsigned); } } static void GetUTable(TaskData *taskData, PolyWord list, ArgType *T) { T->N = 0; T->u.U = 0; if (NONNIL(list)) { T->N = ListLength(list); T->u.U = (uchar *)malloc(T->N * sizeof(uchar)); GetList4(taskData, list,T->u.U,sizeof(uchar),GetUChars); } } /* case CIntTable: GetITable ((ML_Cons_Cell *)v,T); break; case CUnsignedTable: GetUTable ((ML_Cons_Cell *)v,T); break; case CString: CopyString (v,&T->u.string); break; case CStringTable: GetStrings ((ML_Cons_Cell *)v,T); break; case CXmString: GetXmString (v,&T->u.xmString); break; case CXmStringTable: GetXmStrings((ML_Cons_Cell *)v,T); break; */ static void FreeArgs(ArgType *T, unsigned N) { while(N--) { free(T->name); switch(T->tag) { case CAccelerators: break; case CBool: break; case CColormap: break; case CCursor: break; case CDimension: break; case CFontList: XmFontListFree(T->u.F); break; case CInt: break; case CIntTable: break; case CKeySym: break; case CPixmap: break; case CPosition: break; case CString: XtFree(T->u.string); break; case CStringTable: FreeStrings(T->u.S,T->N); free(T->u.S); break; case CTrans: break; case CUnsignedChar: break; case CUnsignedTable: break; case CVisual: break; case CWidget: break; case CWidgetList: break; case CXmString: XmStringFree (T->u.xmString); break; case CXmStringTable: FreeXmStrings(T); break; default: Crash ("Bad arg type %x",T->tag); } T++; } } /* type Arg sharing type Arg = exn; val Exn: Arg -> Exn = Cast; val Arg: Exn -> Arg = Cast; datatype Exn = EXN of unit ref * string * unit; */ /* (string,(v,tag)) */ static void SetArgTypeP(TaskData *taskData, PolyWord fst, PolyWord snd, ArgType *T) { PolyWord v = FST(snd); T->tag = UNTAGGED(SND(snd)); T->N = 0; T->u.i = 0; CopyString(taskData, fst, &T->name, 0); switch(T->tag) { case CAccelerators: T->u.acc = GetAcc (taskData, (X_Object *)v.AsObjPtr()); break; case CBool: T->u.boolean = get_C_ulong (taskData, v); break; case CColormap: T->u.cmap = GetColormap (taskData, (X_Object *)v.AsObjPtr()); break; case CCursor: T->u.cursor = GetCursor (taskData, (X_Object *)v.AsObjPtr()); break; case CDimension: T->u.dim = get_C_ushort (taskData, v); break; case CFontList: T->u.F = GetXmFontList(v); break; case CInt: T->u.i = get_C_long (taskData, v); break; case CKeySym: T->u.keysym = get_C_ulong (taskData, v); break; case CPixmap: T->u.pixmap = GetPixmap (taskData, (X_Object *)v.AsObjPtr()); break; case CPosition: T->u.posn = get_C_short (taskData, v); break; case CTrans: T->u.trans = GetTrans (taskData, (X_Object *)v.AsObjPtr()); break; case CUnsignedChar: T->u.u = get_C_uchar (taskData, v); break; case CVisual: T->u.visual = GetVisual (taskData, (X_Object *)v.AsObjPtr()); break; case CWidget: T->u.widget = GetNWidget (taskData, (X_Object *)v.AsObjPtr()); break; /* The following types allocate memory, but only in the C heap */ case CIntTable: GetITable (taskData, v,T); break; case CUnsignedTable: GetUTable (taskData, v,T); break; case CString: CopyString (taskData, v, &T->u.string, 0); break; case CStringTable: GetStrings (taskData, v,T); break; case CXmString: GetXmString (taskData, v, &T->u.xmString, 0); break; case CXmStringTable: GetXmStrings(taskData, v,T); break; default: Crash ("Bad arg type %x",T->tag); } } static void SetArgType(TaskData *taskData, PolyWord p, void *v, unsigned) { ArgType *T = (ArgType *)v; SetArgTypeP(taskData, FST(p), SND(p), T); } static void SetArgs(Arg *A, ArgType *T, unsigned N) { while(N--) { A->name = T->name; switch(T->tag) { case CAccelerators: A->value = (XtArgVal) T->u.acc; break; case CBool: A->value = (XtArgVal) T->u.boolean; break; case CColormap: A->value = (XtArgVal) T->u.cmap; break; case CCursor: A->value = (XtArgVal) T->u.cursor; break; case CDimension: A->value = (XtArgVal) T->u.dim; break; case CFontList: A->value = (XtArgVal) T->u.F; break; case CInt: A->value = (XtArgVal) T->u.i; break; case CIntTable: A->value = (XtArgVal) T->u.I; break; case CKeySym: A->value = (XtArgVal) T->u.keysym; break; case CPixmap: A->value = (XtArgVal) T->u.pixmap; break; case CPosition: A->value = (XtArgVal) T->u.posn; break; case CString: A->value = (XtArgVal) T->u.string; break; case CStringTable: A->value = (XtArgVal) T->u.S; break; case CTrans: A->value = (XtArgVal) T->u.trans; break; case CUnsignedChar: A->value = (XtArgVal) T->u.u; break; case CUnsignedTable: A->value = (XtArgVal) T->u.U; break; case CVisual: A->value = (XtArgVal) T->u.visual; break; case CWidget: A->value = (XtArgVal) T->u.widget; break; case CXmString: A->value = (XtArgVal) T->u.xmString; break; case CXmStringTable: A->value = (XtArgVal) T->u.X; break; default: Crash ("Bad arg type %x",T->tag); } A++; T++; } } /* add current callback to (pending?) FList */ static void RunWidgetCallback(Widget w, XtPointer closure, XtPointer call_data) { C_List *C = (C_List *)closure; if (callbacks_enabled) { // Only synchronous callbacks are handled. TaskData *taskData = processes->GetTaskDataForThread(); Handle tailHandle = SAVE(FList); Handle widgetHandle = SAVE(C->widget_object); Handle functionHandle = SAVE(C->function); Handle pairHandle = CreatePair(taskData, widgetHandle,functionHandle); FList = DEREFWORD(CreatePair(taskData, pairHandle,tailHandle)); } #if 0 else printf("Ignoring event for widget %p\n",C->widget_object); #endif } static void SetCallbacks(TaskData *taskData, X_Widget_Object *W, PolyWord list, PolyWord initial) { char name[100]; Widget w = GetWidget(taskData, (X_Object *)W); assert(w != NULL); /* SPF */ assert(w != (Widget)1); /* SPF */ for(PolyWord pp = W->callbackList; NONNIL(pp); pp = ((ML_Cons_Cell*)pp.AsObjPtr())->t) { MLPair *q = (MLPair *)((ML_Cons_Cell*)pp.AsObjPtr())->h.AsObjPtr(); Poly_string_to_C(FST(q),name,sizeof(name)); if (strcmp(name,"messageCallback") != 0 && strcmp(name,XtNdestroyCallback) != 0) { XtRemoveAllCallbacks(w,name); } } #if 0 /* We no longer need the old callback data for this widget, assuming we've replaced all the callbacks. But what if we've only replaced some of them? It's probably better to allow this space leak that to delete vital callback data. I'll have to think about this hard sometime. (Of course, the user isn't supposed to call XtSetCallbacks more than once, in which case the problem doesn't even arise.) SPF 29/2/96 */ PurgeCCallbacks(W,w); #endif for(PolyWord p = list; NONNIL(p); p = ((ML_Cons_Cell*)p.AsObjPtr())->t) { C_List *C = (C_List *)malloc(sizeof(C_List)); MLPair *q = (MLPair *)((ML_Cons_Cell*)p.AsObjPtr())->h.AsObjPtr(); C->function = SND(q).AsObjPtr(); C->widget_object = W; C->next = CList; debugCreateCallback(W,w,C); CList = C; Poly_string_to_C(FST(q),name,sizeof(name)); if (strcmp(name,"messageCallback") != 0 && strcmp(name,XtNdestroyCallback) != 0) { XtAddCallback(w,name,RunWidgetCallback,C); } } W->state = initial; W->callbackList = list; } static void RunWidgetEventhandler (Widget w, XtPointer p, XEvent *ev, Boolean *c) { C_List *C = (C_List *)p; if ( callbacks_enabled ) { TaskData *taskData = processes->GetTaskDataForThread(); Handle tailHandle = SAVE(GList); Handle widgetHandle = SAVE(C->widget_object); Handle functionHandle = SAVE(C->function); Handle pairHandle = CreatePair(taskData, widgetHandle,functionHandle); GList = (ML_Cons_Cell *)DEREFHANDLE(CreatePair(taskData, pairHandle,tailHandle)); } } static void AddEventhandler ( TaskData *taskData, X_Widget_Object *W, EventMask EventM, Boolean nonmask, Handle p) { Widget w = GetWidget(taskData, (X_Object *)W) ; C_List *C = (C_List *) malloc ( sizeof(C_List) ) ; /* Add the function to the callback list, so that it will not be G.C'ed away. */ C->function = DEREFHANDLE(p); C->widget_object = W ; C->next = CList ; CList = C ; XtAddEventHandler (w, EventM, nonmask, RunWidgetEventhandler, C); } static Handle AppInitialise ( TaskData *taskData, PolyWord s1, PolyWord s2, PolyWord s3, Handle fallbackHead, Handle argHead ) { char displayName[500]; char appName[500]; char appClass[500]; XtAppContext app_context; Display *display; Widget shell; Handle dsHandle /* Handle to (X_Display_Object *) */; int argc = 0; /* an "int" for Solaris, but should be "unsigned" for SunOS */ unsigned F = ListLength(DEREFWORD(fallbackHead)) + 1; unsigned N = ListLength(DEREFWORD(argHead)); char **S = (char **) alloca(F * sizeof(char *)); Arg *R = (Arg *) alloca(N * sizeof(Arg)); ArgType *T = (ArgType *) alloca(N * sizeof(ArgType)); Poly_string_to_C(s1,displayName ,sizeof(displayName)); Poly_string_to_C(s2,appName ,sizeof(appName)); Poly_string_to_C(s3,appClass ,sizeof(appClass)); app_context = XtCreateApplicationContext(); GetList4(taskData, DEREFWORD(fallbackHead),S,sizeof(char *),CopyString); S[F-1] = NULL; /* list must be NULL terminated */ XtAppSetFallbackResources(app_context,S); display = XtOpenDisplay(app_context,displayName,appName,appClass,NULL,0,&argc,0); if (display == 0) RaiseXWindows(taskData, "XtAppInitialise failed (can't open display)"); /* I don't think this is needed. DCJM 26/5/2000 */ /* add_file_descr(display->fd); */ debug1 ("%s display opened\n",DisplayString(display)); debug1 ("%x display fd\n",display->fd); /* ok to store C values because this is a BYTE object */ dsHandle = alloc_and_save(taskData, SIZEOF(X_Display_Object), F_MUTABLE_BIT|F_BYTE_OBJ); DEREFDISPLAYHANDLE(dsHandle)->type = TAGGED(X_Display); DEREFDISPLAYHANDLE(dsHandle)->display = display; DEREFDISPLAYHANDLE(dsHandle)->screen = DefaultScreen(display); DEREFDISPLAYHANDLE(dsHandle)->app_context = app_context; AddXObject(FINISHED(taskData, dsHandle)); GetList4(taskData, DEREFWORD(argHead),T,sizeof(ArgType),SetArgType); SetArgs(R,T,N); shell = XtAppCreateShell(appName,appClass,applicationShellWidgetClass,display,R,N); FreeArgs(T,N); if (shell == 0) RaiseXWindows(taskData, "XtAppInitialise failed (can't create application shell)"); /* added 7/12/94 SPF */ XtAddCallback(shell,XtNdestroyCallback,DestroyWidgetCallback,NULL); return NewWidget(taskData, dsHandle,shell); } static Handle CreatePopupShell ( TaskData *taskData, PolyStringObject *s, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget parent, Handle list ) { char name[100]; Widget shell; unsigned N = ListLength(DEREFWORD(list)); Arg *A = (Arg *) alloca(N * sizeof(Arg)); ArgType *T = (ArgType *) alloca(N * sizeof(ArgType)); GetList4(taskData, DEREFWORD(list),T,sizeof(ArgType),SetArgType); SetArgs(A,T,N); Poly_string_to_C(s,name,sizeof(name)); shell = XtCreatePopupShell(name,applicationShellWidgetClass,parent,A,N); FreeArgs(T,N); if (shell == 0) RaiseXWindows(taskData, "XtCreatePopupShell failed"); /* added 7/12/94 SPF */ XtAddCallback(shell,XtNdestroyCallback,DestroyWidgetCallback,NULL); return NewWidget(taskData, dsHandle,shell); } static Handle CreateXm ( TaskData *taskData, Widget (*create)(Widget, String, ArgList, Cardinal), char *failed, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget parent, PolyStringObject *s, Handle list /* Handle to (ML_Cons_Cell *) */ ) { char name[100]; Widget w; unsigned N = ListLength(DEREFWORD(list)); Arg *A = (Arg *) alloca(N * sizeof(Arg)); ArgType *T = (ArgType *) alloca(N * sizeof(ArgType)); GetList4(taskData, DEREFWORD(list),T,sizeof(ArgType),SetArgType); SetArgs(A,T,N); Poly_string_to_C(s,name,sizeof(name)); w = (* create)(parent,name,A,N); FreeArgs(T,N); if (w == 0) RaiseXWindows(taskData, failed); XtAddCallback(w,XtNdestroyCallback,DestroyWidgetCallback,NULL); return NewWidget(taskData, dsHandle,w); } static void SetValues(TaskData *taskData, Widget w, Handle list) { unsigned N = ListLength(DEREFWORD(list)); Arg *A = (Arg *) alloca(N * sizeof(Arg)); ArgType *T = (ArgType *) alloca(N * sizeof(ArgType)); GetList4(taskData, DEREFWORD(list),T,sizeof(ArgType),SetArgType); SetArgs(A,T,N); XtSetValues(w,A,N); FreeArgs(T,N); } typedef struct { const char *listName; char *intName; } StringPair; static StringPair listTypes[] = { {"argv" ,(char *) "argc"}, {"buttonAccelerators" ,(char *) "buttonCount"}, {"buttonAcceleratorText" ,(char *) "buttonCount"}, {"buttonMnemonicCharSets",(char *) "buttonCount"}, {"buttonMnemonics" ,(char *) "buttonCount"}, {"buttons" ,(char *) "buttonCount"}, {"buttonType" ,(char *) "buttonCount"}, {"children" ,(char *) "numChildren"}, {"dirListItems" ,(char *) "dirListItemCount"}, {"fileListItems" ,(char *) "fileListItemCount"}, {"historyItems" ,(char *) "historyItemCount"}, {"items" ,(char *) "itemCount"}, {"listItems" ,(char *) "listItemCount"}, {"selectedItems" ,(char *) "selectedItemCount"}, {"selectionArray" ,(char *) "selectionArrayCount"}, }; #define MAXListTYPES (sizeof(listTypes)/sizeof(listTypes[0])) /* (string,(v,tag)) - ML (string*Ctype) */ static void GetArgType ( TaskData *taskData, PolyWord p, ArgType *T, int i, /* not used; needed to keep function type right */ Widget w ) { T->tag = UNTAGGED(SND(SND(p))); T->N = 0; T->u.i = 0; CopyString(taskData, FST(p), &T->name, 0); if (T->tag == CIntTable || T->tag == CUnsignedTable || T->tag == CWidgetList || T->tag == CStringTable || T->tag == CXmStringTable) /* if it is a list type we need to get the length from another resource */ { Arg arg; unsigned i; int result; for(i = 0; i < MAXListTYPES; i++) { if (strcmp(listTypes[i].listName,T->name) == 0) break; } if (i == MAXListTYPES) Crash ("Bad list resource name %s",T->name); arg.name = listTypes[i].intName; arg.value = (XtArgVal) &result; /* Bug fix here which only appeared in OpenMotif and LessTif. We need to pass the address of an integer here to receive the result. DCJM 17/5/02. */ XtGetValues(w, &arg, 1); T->N = result; } } static Handle CreateWidget(TaskData *taskData, void *p, Handle dsHandle /* Handle to (X_Display_Object *) */) { return EmptyWidget(taskData, dsHandle, *(Widget*)p); } static Handle CreateXmString(TaskData *taskData, void *t) { char *s; Handle S; XmStringGetLtoR(*(XmString *)t,(char *) XmSTRING_DEFAULT_CHARSET,&s); S = Make_string(s); XtFree(s); return S; } static Handle CreateFontList ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ XmFontList F ) { XmFontContext C; XmStringCharSet charset; XFontStruct *fs; Handle list = 0; Handle tail = 0; if (XmFontListInitFontContext(&C,F) == False) return SAVE(ListNull); // TODO: This previously reset the save vector each time to make sure it // didn't overflow. I've removed that code but it needs to be put back. while (XmFontListGetNextFont(C,&charset,&fs)) { Handle L = alloc_and_save(taskData, SIZEOF(ML_Cons_Cell), F_MUTABLE_BIT); if (list == 0) list = L; // This is the first. if (tail != 0) { DEREFLISTHANDLE(tail)->t = DEREFWORD(L); FINISHED(taskData, tail); } tail = L; /* the new list element is joined on, but not filled in */ DEREFLISTHANDLE(tail)->h = DEREFWORD(CreatePair(taskData, CreateFontStruct(taskData,fs,dsHandle),Make_string(charset))); DEREFLISTHANDLE(tail)->t = ListNull; } XmFontListFreeFontContext(C); if (tail != 0) FINISHED(taskData, tail); return list; } static Handle CreateUChar(TaskData *taskData, void *p) { return Make_arbitrary_precision(taskData, *(uchar *)p); } static Handle CreateArg(TaskData *taskData, void *v, Handle dsHandle /* Handle to (X_Display_Object *) */) { ArgType *T = (ArgType *)v; Handle value; switch(T->tag) { case CAccelerators: value = EmptyAcc (taskData, T->u.acc); break; case CBool: value = Make_bool (T->u.boolean); break; case CColormap: value = EmptyColormap (taskData, dsHandle,T->u.cmap); break; case CCursor: value = EmptyCursor (taskData, dsHandle,T->u.cursor); break; case CDimension: value = Make_int (T->u.dim); break; case CFontList: value = CreateFontList(taskData, dsHandle,T->u.F); break; case CInt: value = Make_int (T->u.i); break; case CKeySym: value = Make_arbitrary_precision (taskData, T->u.keysym); break; case CPixmap: value = EmptyPixmap (taskData, dsHandle,T->u.pixmap); break; case CPosition: value = Make_int (T->u.posn); break; case CString: value = Make_string (T->u.string); break; case CTrans: value = EmptyTrans (taskData, T->u.trans); break; case CUnsignedChar: value = Make_arbitrary_precision (taskData, T->u.u); break; case CVisual: value = EmptyVisual (taskData, dsHandle,T->u.visual); break; case CWidget: value = EmptyWidget (taskData, dsHandle,T->u.widget); break; case CXmString: value = CreateXmString(taskData, &T->u.xmString); break; case CIntTable: value = CreateList4(taskData, T->N,T->u.I,sizeof(int), CreateUnsigned); break; case CUnsignedTable: value = CreateList4(taskData, T->N,T->u.U,sizeof(uchar), CreateUChar); break; case CStringTable: value = CreateList4(taskData, T->N,T->u.S,sizeof(char *), CreateString); break; case CWidgetList: value = CreateList5(taskData,T->N,T->u.W,sizeof(Widget), CreateWidget,dsHandle); break; case CXmStringTable: value = CreateList4(taskData, T->N,T->u.X,sizeof(XmString),CreateXmString); break; default: Crash ("Bad arg type %x",T->tag); /*NOTREACHED*/ } return value; } static Handle GetValue ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget w, PolyWord pair /* ML (string*Ctype) */ ) { Arg A; ArgType T; XmString *X = (XmString *) 0x55555555; XmString *Y = (XmString *) 0xAAAAAAAA; GetArgType(taskData,pair,&T,0,w); A.name = T.name; A.value = (XtArgVal) &T.u; T.u.X = X; /* The value is set to X. If it is left set to X */ /* then this may be a value this widget doesn't have. */ XtGetValues(w,&A,1); if (T.u.X == X) { T.u.X = Y; XtGetValues(w,&A,1); if (T.u.X == Y) { char buffer[500]; sprintf(buffer,"XtGetValues (%s) failed",T.name); RaiseXWindows(taskData, buffer); } } return CreateArg(taskData, &T,dsHandle); } /* What is the real ML type of p? (string*Ctype*string*string*string*Ctype) */ static void GetResource ( TaskData *taskData, PolyWord pp, XtResource *R, int i, ArgType *T, ArgType *D, Widget w ) { PolyObject *p = pp.AsObjPtr(); GetArgType(taskData,pp,&T[i],0,w); /* HACK !!! */ CopyString(taskData, p->Get(0), &R->resource_name, 0); CopyString(taskData, p->Get(2), &R->resource_class, 0); CopyString(taskData, p->Get(3), &R->resource_type, 0); R->resource_size = 4; R->resource_offset = (byte*)(&T[i].u) - (byte*)(T); SetArgTypeP(taskData, p->Get(4), p->Get(5), &D[i]); /* This was a hack. I hope I converted it correctly. DCJM */ R->default_type = D[i].name; if (UNTAGGED(p->Get(5).AsObjPtr()->Get(1)) == CString) R->default_addr = (XtPointer) D[i].u.string; else R->default_addr = (XtPointer) &D[i].u; } static Handle GetSubresources ( TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget w, PolyStringObject *s1, PolyStringObject *s2, Handle list ) { char name [100]; char clas[100]; unsigned N = ListLength(DEREFWORD(list)); ArgType *T = (ArgType *) alloca(N * sizeof(ArgType)); ArgType *D = (ArgType *) alloca(N * sizeof(ArgType)); XtResource *R = (XtResource *) alloca(N * sizeof(XtResource)); { unsigned i = 0; for(PolyWord p = DEREFWORD(list); NONNIL(p); p = ((ML_Cons_Cell *)p.AsObjPtr())->t) { GetResource(taskData,((ML_Cons_Cell *)p.AsObjPtr())->h,&R[i],i,T,D,w); i++; } } Poly_string_to_C(s1,name ,sizeof(name)); Poly_string_to_C(s2,clas,sizeof(clas)); XtGetSubresources(w,T,name,clas,R,N,NULL,0); return CreateList5(taskData,N,T,sizeof(ArgType),CreateArg,dsHandle); } static Handle GetApplicationResources (TaskData *taskData, Handle dsHandle, /* Handle to (X_Display_Object *) */ Widget w, Handle list ) { unsigned N = ListLength (DEREFLISTHANDLE(list)) ; ArgType *T = (ArgType *) alloca ( N * sizeof(ArgType) ) ; ArgType *D = (ArgType *) alloca ( N * sizeof(ArgType) ) ; XtResource *R = (XtResource *) alloca ( N * sizeof(XtResource) ) ; { unsigned i = 0; for(PolyWord p = DEREFWORD(list); NONNIL(p); p = ((ML_Cons_Cell *)p.AsObjPtr())->t) { GetResource(taskData,((ML_Cons_Cell *)p.AsObjPtr())->h,&R[i],i,T,D,w); i++; } } XtGetApplicationResources ( w,T,R,N,NULL,0 ) ; return CreateList5 (taskData, N,T,sizeof(ArgType),CreateArg,dsHandle ) ; } static void GetChild(TaskData *taskData, PolyWord p, void *v, unsigned) { Widget *w = (Widget *)v; *w = GetWidget(taskData, (X_Object *)p.AsObjPtr()); if (XtParent(*w) == NULL) RaiseXWindows(taskData, "not a child"); } static void ManageChildren(TaskData *taskData, Handle list) { unsigned N = ListLength(DEREFWORD(list)); Widget *W = (Widget *) alloca(N * sizeof(Widget)); GetList4(taskData, DEREFWORD(list),W,sizeof(Widget),GetChild); XtManageChildren(W,N); } static void UnmanageChildren(TaskData *taskData, Handle list) { unsigned N = ListLength(DEREFWORD(list)); Widget *W = (Widget *) alloca(N * sizeof(Widget)); GetList4(taskData, DEREFWORD(list),W,sizeof(Widget),GetChild); XtUnmanageChildren(W,N); } static Handle ParseTranslationTable(TaskData *taskData, PolyStringObject *s) { XtTranslations table; int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); table = XtParseTranslationTable(buffer); return EmptyTrans(taskData, table); } static void CommandError(TaskData *taskData, Widget w, PolyWord s) { XmString p; GetXmString(taskData, s, &p, 0); XmCommandError(w,p); XmStringFree (p); } static void FileSelectionDoSearch(TaskData *taskData, Widget w, PolyWord s) { XmString p; GetXmString(taskData, s, &p, 0); XmFileSelectionDoSearch(w,p); XmStringFree (p); } static void MenuPosition (Widget w, int x, int y) { XButtonPressedEvent ev; memset (&ev, 0, sizeof(ev)); ev.type = 4; /* Must be button. */ ev.x_root = x; ev.y_root = y; ev.button = 3; /* Is this required? */ ev.same_screen = 1; /* Assume this. */ XmMenuPosition (w, &ev); } static Handle XmIsSomething(TaskData *taskData, unsigned is_code, Widget widget) { unsigned i; switch(is_code) { case 1: i = XmIsArrowButton (widget); break; case 2: i = XmIsArrowButtonGadget (widget); break; case 3: i = XmIsBulletinBoard (widget); break; case 4: i = XmIsCascadeButton (widget); break; case 5: i = XmIsCascadeButtonGadget(widget); break; case 6: i = XmIsCommand (widget); break; case 7: i = XmIsDesktopObject (widget); break; /* ok - SPF 9/8/94 */ case 8: i = XmIsDialogShell (widget); break; /* Unsupported in Motif 1.2 case 9: i = XmIsDisplayObject (widget); break; */ case 10: i = XmIsDrawingArea (widget); break; case 11: i = XmIsDrawnButton (widget); break; case 12: i = XmIsExtObject (widget); break; /* ok - SPF 9/8/94 */ case 13: i = XmIsFileSelectionBox (widget); break; case 14: i = XmIsForm (widget); break; case 15: i = XmIsFrame (widget); break; case 16: i = XmIsGadget (widget); break; case 17: i = XmIsLabel (widget); break; case 18: i = XmIsLabelGadget (widget); break; case 19: i = XmIsList (widget); break; case 20: i = XmIsMainWindow (widget); break; case 21: i = XmIsManager (widget); break; case 22: i = XmIsMenuShell (widget); break; case 23: i = XmIsMessageBox (widget); break; case 24: i = XmIsMotifWMRunning (widget); break; case 25: i = XmIsPanedWindow (widget); break; case 26: i = XmIsPrimitive (widget); break; case 27: i = XmIsPushButton (widget); break; case 28: i = XmIsPushButtonGadget (widget); break; case 29: i = XmIsRowColumn (widget); break; case 30: i = XmIsScale (widget); break; /* Unsupported in Motif 1.2 case 31: i = XmIsScreenObject (widget); break; */ case 32: i = XmIsScrollBar (widget); break; case 33: i = XmIsScrolledWindow (widget); break; case 34: i = XmIsSelectionBox (widget); break; case 35: i = XmIsSeparator (widget); break; case 36: i = XmIsSeparatorGadget (widget); break; #ifdef LESSTIF_VERSION /* This is not supported in LessTif, at least not 0.89. */ case 37: RaiseXWindows(taskData, "XmIsShellExt: not implemented"); #else case 37: i = XmIsShellExt (widget); break; /* ok - SPF 9/8/94 */ #endif case 38: i = XmIsText (widget); break; case 39: i = XmIsTextField (widget); break; case 40: i = XmIsToggleButton (widget); break; case 41: i = XmIsToggleButtonGadget (widget); break; case 42: i = XmIsVendorShell (widget); break; case 43: i = XmIsVendorShellExt (widget); break; /* ok - SPF 9/8/94 */ /* Unsupported in Motif 1.2 case 44: i = XmIsWorldObject (widget); break; */ default: Crash ("Bad code (%d) in XmIsSomething",is_code); /* NOTREACHED*/ } return Make_bool(i); } /******************************************************************************/ /* */ /* Wrappers for standard widget operations */ /* */ /******************************************************************************/ /************************* 0 parameters, no result ****************************/ /* widget -> unit */ static void WidgetAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData,func_name,arg1); applyFunc(w); } /************************* 1 parameter, no result *****************************/ /* widget -> bool -> unit */ static void WidgetBoolAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, Boolean), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); Boolean b = (get_C_short(taskData, arg2) != 0); applyFunc(w,b); } /* widget -> int -> unit */ static void WidgetIntAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, int), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); int i = get_C_long(taskData, arg2); applyFunc(w,i); } /* widget -> int -> unit */ static void WidgetLongAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, long), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); long i = get_C_long(taskData, arg2); applyFunc(w,i); } /* widget -> string -> unit */ static void WidgetXmstringAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, XmString), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); XmString s; GetXmString(taskData, arg2, &s, 0); applyFunc(w,s); XmStringFree(s); } /* widget -> string list -> unit */ static void WidgetXmstringlistAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, XmString *, int), X_Object *arg1, ML_Cons_Cell *arg2 ) { Widget w = getWidget(taskData,func_name,arg1); unsigned n = ListLength(arg2); XmString *strings = (XmString *)alloca(n * sizeof(XmString)); GetList4(taskData, arg2,strings,sizeof(XmString),GetXmString); applyFunc(w,strings,n); for (unsigned i = 0; i < n; i ++) XmStringFree(strings[i]); } /************************* 2 parameters, no result ****************************/ /* widget -> int -> bool -> unit */ static void WidgetIntBoolAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, int, Boolean), X_Object *arg1, PolyWord arg2, PolyWord arg3 ) { Widget w = getWidget(taskData,func_name,arg1); int i = get_C_long(taskData, arg2); Boolean b = (get_C_ushort(taskData, arg3) != 0); applyFunc(w,i,b); } /* widget -> int -> int -> unit */ static void WidgetIntIntAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, int, int), X_Object *arg1, PolyWord arg2, PolyWord arg3 ) { Widget w = getWidget(taskData,func_name,arg1); int x = get_C_long(taskData, arg2); int y = get_C_long(taskData, arg3); applyFunc(w,x,y); } /* widget -> string -> bool -> unit */ static void WidgetXmstringBoolAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, XmString, Boolean), X_Object *arg1, PolyWord arg2, PolyWord arg3 ) { Widget w = getWidget(taskData,func_name,arg1); XmString s; Boolean b = (get_C_ushort(taskData, arg3) != 0); GetXmString(taskData, arg2, &s, 0); applyFunc(w,s,b); XmStringFree(s); } /* widget -> string -> int -> unit */ static void WidgetXmstringIntAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, XmString, int), X_Object *arg1, PolyWord arg2, PolyWord arg3 ) { Widget w = getWidget(taskData,func_name,arg1); XmString s; int i = get_C_long(taskData, arg3); GetXmString(taskData, arg2, &s, 0); applyFunc(w,s,i); XmStringFree(s); } /* widget -> string list -> int -> unit */ static void WidgetXmstringlistIntAction ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), void applyFunc(Widget, XmString *, int, int), X_Object *arg1, ML_Cons_Cell *arg2, PolyWord arg3 ) { Widget w = getWidget(taskData,func_name,arg1); unsigned n = ListLength(arg2); int i = get_C_long(taskData, arg3); XmString *strings = (XmString *)alloca(n * sizeof(XmString)); GetList4(taskData, arg2,strings,sizeof(XmString),GetXmString); applyFunc(w,strings,n,i); for (unsigned i = 0; i < n; i ++) XmStringFree(strings[i]); } /************************* n parameters, some result **************************/ static Handle int_ptr_to_arb(TaskData *taskData, void *p) { return Make_arbitrary_precision(taskData, *(int *)p); } /* widget -> int */ static Handle WidgetToInt ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), int applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData, func_name,arg1); int res = applyFunc(w); return(Make_arbitrary_precision(taskData, res)); } /* widget -> int */ static Handle WidgetToLong ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *taskData, char *, X_Object *), long applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData, func_name,arg1); long res = applyFunc(w); return(Make_arbitrary_precision(taskData, res)); } #if 0 /* widget -> int */ static Handle WidgetToUnsigned ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), unsigned applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData, func_name,arg1); unsigned res = applyFunc(w); return(Make_arbitrary_precision(taskData, res)); } #endif /* widget -> bool */ static Handle WidgetToBool ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), Boolean applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData, func_name,arg1); Boolean res = applyFunc(w); return(Make_bool(res)); } /* widget -> string */ static Handle WidgetToString ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), char *applyFunc(Widget), X_Object *arg1 ) { Widget w = getWidget(taskData, func_name,arg1); char *s = applyFunc(w); Handle res = Make_string(s); /* safe, even if C pointer is NULL */ XtFree(s); return(res); } /* widget -> int list */ static Handle WidgetToIntlist ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), Boolean applyFunc(Widget, int**, int *), X_Object *arg1 ) { int item_count, *items; Boolean non_empty; Widget w = getWidget(taskData,func_name,arg1); non_empty = applyFunc(w, &items, &item_count); if (non_empty != TRUE) /* nothing found, and Motif hasn't allocated any space */ /* so just retun nil */ { return (SAVE(ListNull)); } else /* copy the list into the ML heap, then free it */ { Handle res = CreateList4(taskData, item_count,items,sizeof(int),int_ptr_to_arb); XtFree((char *)items); return res; } } /* widget -> string -> int list */ static Handle WidgetXmstringToIntlist ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), Boolean applyFunc(Widget, XmString, int**, int *), X_Object *arg1, PolyWord arg2 ) { int item_count, *items; Boolean non_empty; Widget w = getWidget(taskData,func_name,arg1); XmString s; GetXmString(taskData, arg2, &s, 0); non_empty = applyFunc(w, s, &items, &item_count); XmStringFree(s); if (non_empty != TRUE) /* nothing found, so just retun nil */ { return (SAVE(ListNull)); } else /* copy the list into the ML heap, then free it */ { Handle res = CreateList4(taskData, item_count,items,sizeof(int),int_ptr_to_arb); XtFree((char *)items); return res; } } /* widget -> string -> int */ static Handle WidgetXmstringToInt ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), int applyFunc(Widget, XmString), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); XmString s; int res; GetXmString(taskData, arg2, &s, 0); res = applyFunc(w, s); XmStringFree(s); return (Make_int(res)); } /* widget -> string -> bool */ static Handle WidgetXmstringToBool ( TaskData *taskData, char *func_name, Widget getWidget(TaskData *, char *, X_Object *), Boolean applyFunc(Widget, XmString), X_Object *arg1, PolyWord arg2 ) { Widget w = getWidget(taskData,func_name,arg1); XmString s; Boolean res; GetXmString(taskData, arg2, &s, 0); res = applyFunc(w, s); XmStringFree(s); return (Make_bool(res)); } /******************************************************************************/ /* code added SPF 25/2/95 */ static bool isPossibleString(PolyObject *P) { if (!OBJ_IS_DATAPTR(P)) return false; POLYUNSIGNED L = P->LengthWord(); if (! OBJ_IS_BYTE_OBJECT(L)) return false; /* get object PolyWord count */ POLYUNSIGNED n = OBJ_OBJECT_LENGTH(L); if (n < 1) return false; /* get string byte count */ POLYUNSIGNED m = P->Get(0).AsUnsigned(); /* number of words to hold the bytes */ m = (m + 3) / 4; /* number of words to hold the bytes, plus the byte count */ m = m + 1; /* If that's the same as the object PolyWord count, we've probably got a genuine string! */ return (m == n); } /* Prints out the contents of a PolyWord in the X interface tuple */ static void DebugPrintWord(PolyWord P /* was X_Object *P */) { TaskData *taskData = processes->GetTaskDataForThread(); if (IS_INT((P))) { printf("Short %d", (int)UNTAGGED(P)); return; } if (gMem.IsIOPointer(P.AsAddress())) { printf("IO %p",P.AsAddress()); return; } if (isPossibleString(P.AsObjPtr())) { if (((PolyStringObject*)P.AsObjPtr())->length <= 40) { printf("String: \""); print_string((PolyStringObject*) P.AsObjPtr()); printf("\""); return; } else { printf("Long String: %p", P.AsAddress()); return; } } /* The problem with the following code was that we can't be sure that the object we have is really an X_Object - it might just look like one. If this is the case, when we try to validate the object using ResourceExists we may get a core dump because ResourceExists assumes it has a valid X_Object and calls hashId which dereferences fields within the so-called X_object. That's why we redefine ResourceExists to be SafeResourceExists which doesn't make any assumptions about the contents of the so-called X_object. SPF 6/4/95 */ #define XP ((X_Object *)P.AsObjPtr()) #define ResourceExists SafeResourceExists { switch(UNTAGGED(XP->type)) { case X_GC: (ResourceExists(XP) ? printf("GC %lx", GetGC(taskData, XP)->gid) : printf("Old GC <%lx>",P.AsUnsigned())); return; case X_Font: (ResourceExists(XP) ? printf("Font %lx",GetFont(taskData, XP)) : printf("Old Font <%x>",(int)P.AsUnsigned())); return; case X_Cursor: (ResourceExists(XP) ? printf("Cursor %lx",GetCursor(taskData, XP)) : printf("Old Cursor <%x>",(int)P.AsUnsigned())); return; case X_Window: (ResourceExists(XP) ? printf("Window %lx",GetWindow(taskData, XP)) : printf("Old Window <%p>",P.AsAddress())); return; case X_Pixmap: (ResourceExists(XP) ? printf("Pixmap %lx",GetPixmap(taskData, XP)) : printf("Old Pixmap <%p>",P.AsAddress())); return; case X_Colormap: (ResourceExists(XP) ? printf("Colormap %lx",GetColormap(taskData, XP)) : printf("Old Colormap <%p>",P.AsAddress())); return; case X_Visual: (ResourceExists(XP) ? printf("Visual %lx",GetVisual(taskData, XP)->visualid) : printf("Old Visual <%p>",P.AsAddress())); return; case X_Widget: (ResourceExists(XP) ? printf("Widget %p",GetNWidget(taskData, XP)) : printf("Old Widget <%p>",P.AsAddress())); return; case X_Trans: (ResourceExists(XP) ? printf("Trans %p",GetTrans(taskData, XP)) : printf("Old Trans <%p>",P.AsAddress())); return; case X_Acc: (ResourceExists(XP) ? printf("Acc %p",GetAcc(taskData, XP)) : printf("Old Acc <%p>",P.AsAddress())); return; case X_Display: (ResourceExists(XP) ? printf("Display %s", DisplayString(GetDisplay(taskData, XP))) + printf(":%x", GetDisplay(taskData, XP)->fd) : printf("Old Display <%p>",P.AsAddress())); return; default: printf("Pointer "ZERO_X"%p",P.AsAddress()); return; } } #undef ResourceExists #undef XP } /* Prints out the contents of the X interface tuple */ static void DebugPrintCode(PolyObject *pt) { POLYUNSIGNED N = pt->Length(); POLYUNSIGNED i = 1; assert(IS_INT(pt->Get(0))); printf("%ld:(", UNTAGGED(pt->Get(0))); while(i < N) { DebugPrintWord(pt->Get(i++)); if (i < N) printf(","); } printf(")\n"); } #define P0 DEREFHANDLE(params)->Get(0) #define P1 DEREFHANDLE(params)->Get(1) #define P2 DEREFHANDLE(params)->Get(2) #define P3 DEREFHANDLE(params)->Get(3) #define P4 DEREFHANDLE(params)->Get(4) #define P5 DEREFHANDLE(params)->Get(5) #define P6 DEREFHANDLE(params)->Get(6) #define P7 DEREFHANDLE(params)->Get(7) #define P8 DEREFHANDLE(params)->Get(8) #define P9 DEREFHANDLE(params)->Get(9) #define P10 DEREFHANDLE(params)->Get(10) #define P11 DEREFHANDLE(params)->Get(11) #define P12 DEREFHANDLE(params)->Get(12) #define XP1 ((X_Object *)P1.AsObjPtr()) #define XP2 ((X_Object *)P2.AsObjPtr()) #define XP3 ((X_Object *)P3.AsObjPtr()) #define XP4 ((X_Object *)P4.AsObjPtr()) #define XP5 ((X_Object *)P5.AsObjPtr()) #define XP6 ((X_Object *)P6.AsObjPtr()) #define XP7 ((X_Object *)P7.AsObjPtr()) /* Xwindows_c gets passed the address of an object in save_vec, */ /* which is itself a pointer to a tuple in the Poly heap. */ Handle XWindows_c(TaskData *taskData, Handle params) { int code = get_C_short(taskData, P0); if ((debugOptions & DEBUG_X)) DebugPrintCode(DEREFHANDLE(params)); switch(code) { case XCALL_Not: return Make_arbitrary_precision(taskData, ~ get_C_ulong(taskData, P1)); case XCALL_And: return Make_arbitrary_precision(taskData, get_C_ulong(taskData, P1) & get_C_ulong(taskData, P2)); case XCALL_Or: return Make_arbitrary_precision(taskData, get_C_ulong(taskData, P1) | get_C_ulong(taskData, P2)); case XCALL_Xor: return Make_arbitrary_precision(taskData, get_C_ulong(taskData, P1) ^ get_C_ulong(taskData, P2)); case XCALL_DownShift: return Make_arbitrary_precision(taskData, get_C_ulong(taskData, P1) >> get_C_ulong(taskData, P2)); case XCALL_UpShift: return Make_arbitrary_precision(taskData, get_C_ulong(taskData, P1) << get_C_ulong(taskData, P2)); case XCALL_NoDrawable: return EmptyPixmap(taskData, SAVE(ListNull),(Pixmap)get_C_ulong(taskData, P1)); case XCALL_NoCursor: return EmptyCursor(taskData, SAVE(ListNull),(Cursor)None); case XCALL_NoFont: return EmptyFont(taskData, SAVE(ListNull),(Font)None,(XFontStruct *)NULL); case XCALL_NoColormap: return EmptyColormap(taskData, SAVE(ListNull),(Colormap) None); case XCALL_NoVisual: return EmptyVisual(taskData, SAVE(ListNull),(Visual *)None); case XCALL_GetTimeOfDay: return GetTimeOfDay(taskData); /* Colorcells 100 */ case XCALL_XAllocColor: return AllocColor(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),GetXColor1(taskData, P2)); case XCALL_XAllocColorCells: return AllocColorCells(taskData, GetDisplay(taskData, XP1), GetColormap(taskData, XP1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), get_C_ulong(taskData, P4)); case XCALL_XAllocColorPlanes: return AllocColorPlanes(taskData, GetDisplay(taskData, XP1), GetColormap(taskData, XP1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), get_C_ulong(taskData, P4), get_C_ulong(taskData, P5), get_C_ulong(taskData, P6)); case XCALL_XAllocNamedColor: return AllocNamedColor(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),GetString(P2)); case XCALL_XFreeColors: FreeColors(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),SAVE(P2),get_C_ulong(taskData, P3)); break; case XCALL_XLookupColor: return LookupColor(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),GetString(P2)); case XCALL_XParseColor: return ParseColor(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),GetString(P2)); case XCALL_XQueryColor: return QueryColor(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),get_C_ulong(taskData, P2)); case XCALL_XQueryColors: return QueryColors(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),SAVE(P2)); case XCALL_XStoreColor: XStoreColor(GetDisplay(taskData, XP1),GetColormap(taskData, XP1),GetXColor1(taskData, P2)); break; case XCALL_XStoreColors: StoreColors(taskData, GetDisplay(taskData, XP1),GetColormap(taskData, XP1),SAVE(P2)); break; case XCALL_XStoreNamedColor: StoreNamedColor(GetDisplay(taskData, XP1), GetColormap(taskData, XP1), GetString(P2), get_C_ulong(taskData, P3), get_C_ulong(taskData, P4), get_C_ulong(taskData, P5), get_C_ulong(taskData, P6)); break; case XCALL_BlackPixel: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, BlackPixel(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } case XCALL_WhitePixel: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, WhitePixel(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } /* Colormaps 150 */ case XCALL_XCopyColormapAndFree: return EmptyColormap(taskData, GetDS(taskData, XP1),XCopyColormapAndFree(GetDisplay(taskData, XP1),GetColormap(taskData, XP1))); case XCALL_XCreateColormap: return EmptyColormap(taskData, GetDS(taskData, XP1),XCreateColormap(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetVisual(taskData, XP2),get_C_ulong(taskData, P3))); case XCALL_XInstallColormap: XInstallColormap(GetDisplay(taskData, XP1),GetColormap(taskData, XP1)); break; case XCALL_XListInstalledColormaps: return ListInstalledColormaps(taskData, GetDS(taskData, XP1),GetDrawable(taskData, XP1)); case XCALL_XUninstallColormap: XUninstallColormap(GetDisplay(taskData, XP1),GetColormap(taskData, XP1)); break; case XCALL_DefaultColormap: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return EmptyColormap(taskData, dsHandle, DefaultColormap(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } case XCALL_DefaultVisual: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return EmptyVisual(taskData, dsHandle, DefaultVisual(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } case XCALL_DisplayCells: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, DisplayCells(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } case XCALL_VisualClass: return Make_arbitrary_precision(taskData, GetVisual(taskData, XP1)->c_class); case XCALL_VisualRedMask: return Make_arbitrary_precision(taskData, GetVisual(taskData, XP1)->red_mask); case XCALL_VisualGreenMask: return Make_arbitrary_precision(taskData, GetVisual(taskData, XP1)->green_mask); case XCALL_VisualBlueMask: return Make_arbitrary_precision(taskData, GetVisual(taskData, XP1)->blue_mask); /* Cursors 200 */ case XCALL_XCreateFontCursor: return CreateFontCursor(taskData, GetDS(taskData, XP1),get_C_ulong(taskData, P2)); case XCALL_XCreateGlyphCursor: return CreateGlyphCursor(taskData, GetDS(taskData, XP1), GetFont(taskData, XP1), GetFont(taskData, XP2), get_C_ulong(taskData, P3), get_C_ulong(taskData, P4), GetXColor1(taskData, P5), GetXColor2(taskData, P6)); case XCALL_XCreatePixmapCursor: return CreatePixmapCursor(taskData, GetDS(taskData, XP1), GetPixmap(taskData, XP1), /* source */ GetPixmap(taskData, XP2), /* mask */ GetXColor1(taskData, P3), /* foreground */ GetXColor2(taskData, P4), /* background */ GetOffsetX(taskData, P5), /* x */ GetOffsetY(taskData, P5) /* y */); case XCALL_XDefineCursor: XDefineCursor(GetDisplay(taskData, XP1),GetWindow(taskData, XP1),GetCursor(taskData, XP2)); WindowObject(XP1)->cursor_object = CursorObject(XP2); break; case XCALL_XQueryBestCursor: CheckZeroRect(taskData, P2); return QueryBest(taskData, XQueryBestCursor, GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetRectW(taskData, P2), GetRectH(taskData, P2)); case XCALL_XRecolorCursor: XRecolorCursor(GetDisplay(taskData, XP1), GetCursor(taskData, XP1), GetXColor1(taskData, P2), GetXColor2(taskData, P3)); break; case XCALL_XUndefineCursor: XUndefineCursor(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); WindowObject(XP1)->cursor_object = 0; break; /* Display Specifications 250 */ case XCALL_XOpenDisplay: return OpenDisplay(taskData, GetString(XP1)); #define DODISPLAYOP(op) \ {\ Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1);\ return Make_arbitrary_precision(taskData, op(DEREFDISPLAYHANDLE(dsHandle)->display,\ DEREFDISPLAYHANDLE(dsHandle)->screen));\ } case XCALL_CellsOfScreen: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, CellsOfScreen(ScreenOfDisplay(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen))); } case XCALL_DefaultDepth: DODISPLAYOP(DefaultDepth) case XCALL_DisplayHeight: DODISPLAYOP(DisplayHeight) case XCALL_DisplayHeightMM: DODISPLAYOP(DisplayHeightMM) case XCALL_DisplayPlanes: DODISPLAYOP(DisplayPlanes) case XCALL_DisplayString: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_string(DisplayString(DEREFDISPLAYHANDLE(dsHandle)->display)); } case XCALL_DisplayWidth: DODISPLAYOP(DisplayWidth) case XCALL_DisplayWidthMM: DODISPLAYOP(DisplayWidthMM) #undef DODISPLAYOP #define DODISPLAYSCREENOP(op) \ {\ Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1);\ return Make_arbitrary_precision(taskData, op(ScreenOfDisplay(DEREFDISPLAYHANDLE(dsHandle)->display,\ DEREFDISPLAYHANDLE(dsHandle)->screen)));\ } case XCALL_DoesBackingStore: DODISPLAYSCREENOP(DoesBackingStore) case XCALL_DoesSaveUnders: DODISPLAYSCREENOP(DoesSaveUnders) case XCALL_EventMaskOfScreen: DODISPLAYSCREENOP(EventMaskOfScreen) case XCALL_MaxCmapsOfScreen: DODISPLAYSCREENOP(MaxCmapsOfScreen) case XCALL_MinCmapsOfScreen: DODISPLAYSCREENOP(MinCmapsOfScreen) #undef DODISPLAYSCREENOP case XCALL_ProtocolRevision: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, ProtocolRevision(DEREFDISPLAYHANDLE(dsHandle)->display)); } case XCALL_ProtocolVersion: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, ProtocolVersion(DEREFDISPLAYHANDLE(dsHandle)->display)); } case XCALL_ServerVendor: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_string (ServerVendor(DEREFDISPLAYHANDLE(dsHandle)->display)); } case XCALL_VendorRelease: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return Make_arbitrary_precision(taskData, VendorRelease(DEREFDISPLAYHANDLE(dsHandle)->display)); } /* Drawing Primitives 300 */ case XCALL_XClearArea: XClearArea(GetDisplay(taskData, XP1), GetWindow(taskData, XP1), GetRectX(taskData, P2), GetRectY(taskData, P2), GetRectW(taskData, P2), GetRectH(taskData, P2), get_C_ulong(taskData, P3)); break; case XCALL_XClearWindow: XClearWindow(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XCopyArea: XCopyArea(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetDrawable(taskData, XP2), GetGC(taskData, XP3), GetPointX(taskData, P4), GetPointY(taskData, P4), GetRectW(taskData, P5), GetRectH(taskData, P5), GetRectX(taskData, P5), GetRectY(taskData, P5)); break; case XCALL_XCopyPlane: XCopyPlane(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetDrawable(taskData, XP2), GetGC(taskData, XP3), GetPointX(taskData, P4), GetPointY(taskData, P4), GetRectW(taskData, P5), GetRectH(taskData, P5), GetRectX(taskData, P5), GetRectY(taskData, P5), get_C_ulong(taskData, P6)); break; case XCALL_XDrawArc: XDrawArc(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetRectX(taskData, GetArcR(P3)), GetRectY(taskData, GetArcR(P3)), GetRectW(taskData, GetArcR(P3)), GetRectH(taskData, GetArcR(P3)), GetArcA1(taskData, P3), GetArcA2(taskData, P3)); break; case XCALL_XDrawArcs: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XArc *L = (XArc *)alloca(N * sizeof(XArc)); GetList4(taskData, DEREFWORD(list), L, sizeof(XArc), GetArcs); XDrawArcs(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), L, N); } } break; case XCALL_XDrawImageString: XDrawImageString(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3), GetString(P4)->chars, GetString(P4)->length); break; case XCALL_XDrawImageString16: { Handle list = SAVE(P4); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XChar2b *L = (XChar2b *)alloca(N * sizeof(XChar2b)); GetList4(taskData, DEREFWORD(list),L, sizeof(XChar2b), GetChar2); XDrawImageString16(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),GetPointX(taskData, P3),GetPointY(taskData, P3),L,N); } } break; case XCALL_XDrawLine: XDrawLine(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3), GetPointX(taskData, P4), GetPointY(taskData, P4)); break; case XCALL_XDrawLines: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XPoint *L = (XPoint *)alloca(N * sizeof(XPoint)); GetList4(taskData, DEREFWORD(list), L, sizeof(XPoint), GetPoints); XDrawLines(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), L, N, get_C_ulong(taskData, P4)); } } break; case XCALL_XDrawPoint: XDrawPoint(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3)); break; case XCALL_XDrawPoints: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XPoint *L = (XPoint *)alloca(N * sizeof(XPoint)); GetList4(taskData, DEREFWORD(list),L,sizeof(XPoint),GetPoints); XDrawPoints(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), L, N, get_C_ulong(taskData, P4)); } } break; case XCALL_XDrawRectangle: XDrawRectangle(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetRectX(taskData, P3), GetRectY(taskData, P3), GetRectW(taskData, P3), GetRectH(taskData, P3)); break; case XCALL_XDrawRectangles: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XRectangle *L = (XRectangle *)alloca(N * sizeof(XRectangle)); GetList4(taskData, DEREFWORD(list),L,sizeof(XRectangle),GetRects); XDrawRectangles(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),L,N); } } break; case XCALL_XDrawSegments: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XSegment *L = (XSegment *)alloca(N * sizeof(XSegment)); GetList4(taskData, DEREFWORD(list),L,sizeof(XSegment),GetSegments); XDrawSegments(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),L,N); } } break; case XCALL_XDrawString: XDrawString(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3), GetString(P4)->chars, GetString(P4)->length); break; case XCALL_XDrawString16: { Handle list = SAVE(P4); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XChar2b *L = (XChar2b *)alloca(N * sizeof(XChar2b)); GetList4(taskData, DEREFWORD(list),L,sizeof(XChar2b),GetChar2); XDrawString16(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),GetPointX(taskData, P3),GetPointY(taskData, P3),L,N); } } break; case XCALL_XDrawText: { Handle list = SAVE(P4); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XTextItem *L = (XTextItem *)alloca(N * sizeof(XTextItem)); GetList4(taskData, DEREFWORD(list),L,sizeof(XTextItem),GetText); XDrawText(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),GetPointX(taskData, P3),GetPointY(taskData, P3),L,N); while (N--) { free(L->chars); L++; } } } break; case XCALL_XDrawText16: { Handle list = SAVE(P4); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XTextItem16 *L = (XTextItem16 *)alloca(N * sizeof(XTextItem16)); GetList4(taskData, DEREFWORD(list),L,sizeof(XTextItem16), GetText16); XDrawText16(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),GetPointX(taskData, P3),GetPointY(taskData, P3),L,N); while (N--) { free(L->chars); L++; } } } break; case XCALL_XFillArc: XFillArc(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetRectX(taskData, GetArcR(P3)), GetRectY(taskData, GetArcR(P3)), GetRectW(taskData, GetArcR(P3)), GetRectH(taskData, GetArcR(P3)), GetArcA1(taskData, P3), GetArcA2(taskData, P3)); break; case XCALL_XFillArcs: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XArc *L = (XArc *)alloca(N * sizeof(XArc)); GetList4(taskData, DEREFWORD(list),L,sizeof(XArc),GetArcs); XFillArcs(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),L,N); } } break; case XCALL_XFillPolygon: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XPoint *L = (XPoint *)alloca(N * sizeof(XPoint)); GetList4(taskData, DEREFWORD(list),L,sizeof(XPoint),GetPoints); XFillPolygon(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),L,N,get_C_ulong(taskData, P4),get_C_ulong(taskData, P5)); } } break; case XCALL_XFillRectangle: XFillRectangle(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetRectX(taskData, P3), GetRectY(taskData, P3), GetRectW(taskData, P3), GetRectH(taskData, P3)); break; case XCALL_XFillRectangles: { Handle list = SAVE(P3); if (NONNIL(DEREFWORD(list))) { unsigned N = ListLength(DEREFWORD(list)); XRectangle *L = (XRectangle *)alloca(N * sizeof(XRectangle)); GetList4(taskData, DEREFWORD(list),L,sizeof(XRectangle),GetRects); XFillRectangles(GetDisplay(taskData, XP1),GetDrawable(taskData, XP1),GetGC(taskData, XP2),L,N); } } break; /* Events 350 */ case XCALL_XSelectInput: (WindowObject(XP1))->eventMask->Set(0, PolyWord::FromUnsigned(get_C_ulong(taskData, P2))); XSelectInput(GetDisplay(taskData, XP1),GetWindow(taskData, XP1),XMASK((WindowObject(XP1))->eventMask->Get(0).AsUnsigned())); break; case XCALL_XSynchronize: XSynchronize(GetDisplay(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_GetState: return GetState(taskData, WindowObject(XP1)); /* WindowObject added SPF */ case XCALL_SetState: SetState(WindowObject(XP1),P2,P3); /* WindowObject added SPF */ break; case XCALL_NextEvent: return NextEvent(taskData, GetDS(taskData, XP1)); case XCALL_InsertTimeout: InsertTimeout(taskData, WindowObject(XP1),get_C_ulong(taskData, P2),P3,P4); /* WindowObject added SPF */ break; case XCALL_XSetInputFocus: XSetInputFocus(GetDisplay(taskData, XP1),GetWindow(taskData, XP2),get_C_ulong(taskData, P3),get_C_ulong(taskData, P4)); break; case XCALL_XGetInputFocus: return GetInputFocus(taskData, GetDS(taskData, XP1)); case XCALL_XSetSelectionOwner: SetSelectionOwner(GetDS(taskData, XP1),get_C_ulong(taskData, P2),GetWindow(taskData, XP3),get_C_ulong(taskData, P4)); break; case XCALL_XGetSelectionOwner: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return EmptyWindow(taskData, dsHandle,XGetSelectionOwner(DEREFDISPLAYHANDLE(dsHandle)->display, get_C_ulong(taskData, P2))); } case XCALL_XConvertSelection: XConvertSelection(GetDisplay(taskData, XP4), get_C_ulong(taskData, P1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), GetWindow(taskData, XP4), get_C_ulong(taskData, P5)); break; case XCALL_XSendSelectionNotify: SendSelectionNotify(GetDisplay(taskData, XP4), get_C_ulong(taskData, P1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), GetWindow(taskData, XP4), get_C_ulong(taskData, P5)); break; case XCALL_XDeleteProperty: XDeleteProperty(GetDisplay(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_XInternAtom: return InternAtom(taskData, GetDisplay(taskData, XP1),GetString(P2),get_C_long(taskData, P3)); case XCALL_XGetAtomName: return GetAtomName(taskData, GetDisplay(taskData, XP1),get_C_ulong(taskData, P2)); /* Fonts 400 */ case XCALL_XGetFontPath: return GetFontPath(taskData, GetDisplay(taskData, XP1)); case XCALL_XListFonts: return ListFonts(taskData, GetDisplay(taskData, XP1),GetString(P2),get_C_ulong(taskData, P3)); case XCALL_XListFontsWithInfo: return ListFontsWithInfo(taskData, GetDS(taskData, XP1),GetString(P2),get_C_ulong(taskData, P3)); case XCALL_XLoadFont: return LoadFont(taskData, GetDS(taskData, XP1),GetString(P2)); case XCALL_XLoadQueryFont: return LoadQueryFont(taskData, GetDS(taskData, XP1),GetString(P2)); case XCALL_XQueryFont: return QueryFont(taskData, GetDS(taskData, XP1),GetFont(taskData, XP1)); case XCALL_XSetFontPath: SetFontPath(taskData, GetDisplay(taskData, XP1),SAVE(P2)); break; /* Grabbing 450 */ /* Graphics Context 500 */ case XCALL_DefaultGC: return GetDefaultGC(taskData, GetDS(taskData, XP1)); case XCALL_UpdateGC: ChangeGC(taskData, GCObject(XP1),get_C_ulong(taskData, P2),P3); break; case XCALL_XCreateGC: return CreateGC(taskData, GetDS(taskData, XP1),GetDrawable(taskData, XP1)); case XCALL_XSetClipRectangles: SetClipRectangles(taskData, GetDisplay(taskData, XP1), GetGC(taskData, XP1), GetPointX(taskData, P2), GetPointY(taskData, P2), SAVE(P3), get_C_ulong(taskData, P4)); break; case XCALL_XSetDashes: SetDashes(taskData, GetDisplay(taskData, XP1), GetGC(taskData, XP1), get_C_ulong(taskData, P2), SAVE(P3)); break; /* Images 550 */ case XCALL_XAddPixel: AddPixel(GetXImage(taskData, GetDisplay(taskData, XP1),P2),get_C_ulong(taskData, P3)); break; case XCALL_XGetImage: return GetImage(taskData, GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetRectX(taskData, P2), GetRectY(taskData, P2), GetRectW(taskData, P2), GetRectH(taskData, P2), get_C_ulong(taskData, P3), get_C_long(taskData, P4)); case XCALL_XGetPixel: return GetPixel(taskData, GetXImage(taskData, GetDisplay(taskData, XP1),P2), GetPointX(taskData, P3), GetPointY(taskData, P3)); case XCALL_XGetSubImage: GetSubImage(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetRectX(taskData, P2), GetRectY(taskData, P2), GetRectW(taskData, P2), GetRectH(taskData, P2), get_C_ulong(taskData, P3), get_C_long(taskData, P4), GetXImage(taskData, GetDisplay(taskData, XP1),P5), GetPointX(taskData, P6), GetPointY(taskData, P6)); break; case XCALL_XPutImage: PutImage(GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetGC(taskData, XP2), GetXImage(taskData, GetDisplay(taskData, XP1),P3), GetPointX(taskData, P4), GetPointY(taskData, P4), GetRectX(taskData, P5), GetRectY(taskData, P5), GetRectW(taskData, P5), GetRectH(taskData, P5)); break; case XCALL_XPutPixel: PutPixel(GetXImage(taskData, GetDisplay(taskData, XP1),P2), GetPointX(taskData, P3), GetPointY(taskData, P3), get_C_ulong(taskData, P4)); break; case XCALL_XSubImage: return SubImage(taskData, GetXImage(taskData, GetDisplay(taskData, XP1),P2), GetRectX(taskData, P3), GetRectY(taskData, P3), GetRectW(taskData, P3), GetRectH(taskData, P3)); case XCALL_BitmapBitOrder: return Make_arbitrary_precision(taskData, MLImageOrder(BitmapBitOrder(GetDisplay(taskData, XP1)))); case XCALL_BitmapPad: return Make_arbitrary_precision(taskData, BitmapPad(GetDisplay(taskData, XP1))); case XCALL_BitmapUnit: return Make_arbitrary_precision(taskData, BitmapUnit(GetDisplay(taskData, XP1))); case XCALL_ByteOrder: return Make_arbitrary_precision(taskData, MLImageOrder(ImageByteOrder(GetDisplay(taskData, XP1)))); /* Keyboard 600 */ case XCALL_XLookupString: return LookupString(taskData, GetDisplay(taskData, XP1),get_C_ulong(taskData, P2),get_C_ulong(taskData, P3)); case XCALL_XQueryKeymap: return QueryKeymap(taskData, GetDisplay(taskData, XP1)); case XCALL_IsCursorKey: return Make_bool(IsCursorKey(get_C_ulong(taskData, P1))); case XCALL_IsFunctionKey: return Make_bool(IsFunctionKey(get_C_ulong(taskData, P1))); case XCALL_IsKeypadKey: return Make_bool(IsKeypadKey(get_C_ulong(taskData, P1))); case XCALL_IsMiscFunctionKey: return Make_bool(IsMiscFunctionKey(get_C_ulong(taskData, P1))); case XCALL_IsModifierKey: return Make_bool(IsModifierKey(get_C_ulong(taskData, P1))); case XCALL_IsPFKey: return Make_bool(IsPFKey(get_C_ulong(taskData, P1))); /* Output Buffer 650 */ case XCALL_XFlush: XFlush(GetDisplay(taskData, XP1)); break; case XCALL_XSync: XSync(GetDisplay(taskData, XP1),get_C_ulong(taskData, P2)); break; /* Pointers 700 */ case XCALL_XQueryPointer: return QueryPointer(taskData, GetDS(taskData, XP1),GetWindow(taskData, XP1)); /* Regions 750*/ /* SAVE Set 800 */ /* Screen Saver 850 */ case XCALL_XActivateScreenSaver: XActivateScreenSaver(GetDisplay(taskData, XP1)); break; case XCALL_XForceScreenSaver: XForceScreenSaver(GetDisplay(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_XGetScreenSaver: return GetScreenSaver(taskData, GetDisplay(taskData, XP1)); case XCALL_XResetScreenSaver: XResetScreenSaver(GetDisplay(taskData, XP1)); break; case XCALL_XSetScreenSaver: XSetScreenSaver(GetDisplay(taskData, XP1), get_C_long(taskData, P2), get_C_long(taskData, P3), get_C_ulong(taskData, P4), get_C_ulong(taskData, P5)); break; /* Standard Geometry 900 */ case XCALL_XTranslateCoordinates: return TranslateCoordinates(taskData, GetDS(taskData, XP1), GetWindow(taskData, XP1), GetWindow(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3)); /* Text 950 */ case XCALL_XTextExtents: return TextExtents(taskData, GetFontStruct(taskData, P1),GetString(P2)); case XCALL_XTextExtents16: return TextExtents16(taskData, GetFontStruct(taskData, P1),SAVE(P2)); case XCALL_XTextWidth: return TextWidth(taskData, GetFontStruct(taskData, P1),GetString(P2)); case XCALL_XTextWidth16: return TextWidth16(taskData, GetFontStruct(taskData, P1),SAVE(P2)); /* Tiles, Pixmaps, Stipples and Bitmaps 1000 */ case XCALL_XCreateBitmapFromData: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); CheckZeroRect(taskData, P3); return EmptyPixmap(taskData, dsHandle, XCreateBitmapFromData( DEREFDISPLAYHANDLE(dsHandle)->display, GetDrawable(taskData, XP1), /* drawable */ GetString(P2)->chars, /* data */ GetRectW(taskData, P3), /* width */ GetRectH(taskData, P3))); /* height */ } case XCALL_XCreatePixmap: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); CheckZeroRect(taskData, P2); return EmptyPixmap(taskData, dsHandle, XCreatePixmap( DEREFDISPLAYHANDLE(dsHandle)->display, GetDrawable(taskData, XP1), /* drawable */ GetRectW(taskData, P2), /* width */ GetRectH(taskData, P2), /* height */ get_C_ulong(taskData, P3))); /* depth */ } case XCALL_XCreatePixmapFromBitmapData: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); CheckZeroRect(taskData, P3); return EmptyPixmap(taskData, dsHandle, XCreatePixmapFromBitmapData( DEREFDISPLAYHANDLE(dsHandle)->display, GetDrawable(taskData, XP1), /* drawable */ GetString(P2)->chars, /* data */ GetRectW(taskData, P3), /* width */ GetRectH(taskData, P3), /* height */ get_C_ulong(taskData, P4), /* foreground */ get_C_ulong(taskData, P5), /* background */ get_C_ulong(taskData, P6))); /* depth */ } case XCALL_XQueryBestStipple: CheckZeroRect(taskData, P2); return QueryBest(taskData, XQueryBestStipple, GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetRectW(taskData, P2), GetRectH(taskData, P2)); case XCALL_XQueryBestTile: CheckZeroRect(taskData, P2); return QueryBest(taskData, XQueryBestTile, GetDisplay(taskData, XP1), GetDrawable(taskData, XP1), GetRectW(taskData, P2), GetRectH(taskData, P2)); case XCALL_XReadBitmapFile: return ReadBitmap(taskData, GetDS(taskData, XP1),GetDrawable(taskData, XP1),GetString(P2)); case XCALL_XWriteBitmapFile: CheckZeroRect(taskData, P3); return WriteBitmapFile(taskData, GetString(XP1), GetDisplay(taskData, XP2), GetPixmap(taskData, XP2), GetRectW(taskData, P3), GetRectH(taskData, P3), GetPointX(taskData, P4), GetPointY(taskData, P4)); /* User Preferences 1050 */ case XCALL_XAutoRepeatOff: XAutoRepeatOff(GetDisplay(taskData, XP1)); break; case XCALL_XAutoRepeatOn: XAutoRepeatOn (GetDisplay(taskData, XP1)); break; case XCALL_XBell: XBell(GetDisplay(taskData, XP1),get_C_short(taskData, P2)); break; case XCALL_XGetDefault: return GetDefault(taskData, GetDisplay(taskData, XP1),GetString(P2),GetString(P3)); /* Window Attributes 1100 */ case XCALL_ChangeWindow: ChangeWindowAttributes(taskData, WindowObject(XP1),get_C_ulong(taskData, P2),P3); break; case XCALL_XGetGeometry: return GetGeometry(taskData, GetDS(taskData, XP1),GetDrawable(taskData, XP1)); case XCALL_XGetWindowAttributes: return GetWindowAttributes(taskData, GetDS(taskData, XP1),GetDrawable(taskData, XP1)); case XCALL_XSetWindowBorderWidth: XSetWindowBorderWidth(GetDisplay(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); break; /* Window Configuration 1150 */ case XCALL_XCirculateSubwindows: XCirculateSubwindows(GetDisplay(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_XConfigureWindow: ConfigureWindow(taskData, GetDisplay(taskData, XP1),GetWindow(taskData, XP1), P2); break; case XCALL_XLowerWindow: XLowerWindow(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XMapRaised: XMapRaised(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XMapSubwindows: XMapSubwindows(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XMapWindow: XMapWindow(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XMoveResizeWindow: CheckZeroRect(taskData, P3); XMoveResizeWindow(GetDisplay(taskData, XP1), GetWindow(taskData, XP1), GetPointX(taskData, P2), GetPointY(taskData, P2), GetRectW(taskData, P3), GetRectH(taskData, P3)); break; case XCALL_XMoveWindow: XMoveWindow(GetDisplay(taskData, XP1), GetWindow(taskData, XP1), GetPointX(taskData, P2), GetPointY(taskData, P2)); break; case XCALL_XQueryTree: return QueryTree(taskData,GetDS(taskData, XP1),GetWindow(taskData, XP1)); case XCALL_XRaiseWindow: XRaiseWindow(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XReparentWindow: XReparentWindow(GetDisplay(taskData, XP1), GetWindow(taskData, XP1), GetWindow(taskData, XP2), GetPointX(taskData, P3), GetPointY(taskData, P3)); break; case XCALL_XResizeWindow: CheckZeroRect(taskData, P2); XResizeWindow(GetDisplay(taskData, XP1), GetWindow(taskData, XP1), GetRectW(taskData, P2), GetRectH(taskData, P2)); break; case XCALL_XRestackWindows: RestackWindows(taskData, SAVE(P1)); break; case XCALL_XUnmapSubwindows: XUnmapSubwindows(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; case XCALL_XUnmapWindow: XUnmapWindow(GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); break; /* Window Existence 1200 */ case XCALL_RootWindow: { Handle dsHandle /* Handle to (X_Display_Object *) */ = GetDS(taskData, XP1); return EmptyWindow(taskData, dsHandle, RootWindow(DEREFDISPLAYHANDLE(dsHandle)->display, DEREFDISPLAYHANDLE(dsHandle)->screen)); } case XCALL_DestroyXObject: DestroyXObject(XP1); break; case XCALL_XDestroySubwindows: DestroySubwindows(XP1); break; case XCALL_XCreateSimpleWindow: CheckZeroRect(taskData, P3); return CreateSimpleWindow(taskData, SAVE(XP1), /* parent */ GetPointX(taskData, P2), /* x */ GetPointY(taskData, P2), /* y */ GetRectW(taskData, P3), /* w */ GetRectH(taskData, P3), /* h */ get_C_ulong(taskData, P4), /* borderWidth */ get_C_ulong(taskData, P5), /* border */ get_C_ulong(taskData, P6), /* background */ SAVE(P7), /* handler */ SAVE(P8)); /* state */ case XCALL_XCreateWindow: CheckZeroRect(taskData, P3); return CreateWindow(taskData, SAVE(XP1), /* parent */ GetPointX(taskData, P2), /* x */ GetPointY(taskData, P2), /* y */ GetRectW(taskData, P3), /* w */ GetRectH(taskData, P3), /* h */ get_C_ulong(taskData, P4), /* borderWidth */ get_C_ulong(taskData, P5), /* depth */ get_C_ulong(taskData, P6), /* class */ GetVisual(taskData, XP7), /* visual */ SAVE(P8), /* handler */ SAVE(P9)); /* state */ /* Window Manager 1250 */ case XCALL_XSetProperty: SetProperty(taskData, GetDisplay(taskData, XP1), GetWindow(taskData, XP1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), SAVE(P4), get_C_ulong(taskData, P5)); break; case XCALL_XGetTextProperty: return GetTextProperty(taskData, GetDisplay(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); case XCALL_XGetWMHints: return GetWMHints(taskData, GetDS(taskData, XP1),GetWindow(taskData, XP1)); case XCALL_XGetWMSizeHints: return GetWMSizeHints(taskData, GetDisplay(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); case XCALL_XGetIconSizes: return GetIconSizes(taskData, GetDisplay(taskData, XP1),GetWindow(taskData, XP1)); case XCALL_XGetTransientForHint: return GetTransientForHint(taskData, GetDS(taskData, XP1),GetWindow(taskData, XP1)); case XCALL_XGetWMColormapWindows: return GetWMColormapWindows(taskData, GetDS(taskData, XP1),GetWindow(taskData, XP1)); case XCALL_XGetRGBColormaps: return GetRGBColormaps(taskData, GetDS(taskData, XP1),GetWindow(taskData, XP1),get_C_ulong(taskData, P2)); case XCALL_XWMGeometry: return WMGeometry(taskData, GetDS(taskData, XP1), GetString(P2), GetString(P3), get_C_ulong(taskData, P4), P5); /* Miscellaneous 1300 */ case XCALL_GetID: return GetID(taskData, XP1); case XCALL_ResourceExists: return Make_bool(ResourceExists(XP1)); case XCALL_GetDisplay: return GetDS(taskData, XP1); /******************************************************************************/ /* */ /* Xt Calls */ /* */ /******************************************************************************/ case XCALL_NoWidget: return EmptyWidget(taskData, SAVE(ListNull), (Widget)NULL); case XCALL_AppInitialise: return AppInitialise(taskData, P1, /* display name */ P2, /* application name */ P3, /* application class */ SAVE(P4), /* Fallback list */ SAVE(P5) /* Arg list */); case XCALL_XtRealizeWidget: XtRealizeWidget(GetWidget(taskData, XP1)); break; case XCALL_XtManageChildren: ManageChildren(taskData, SAVE(P1)); break; case XCALL_XtUnmanageChildren: UnmanageChildren(taskData, SAVE(P1)); break; case XCALL_XtDestroyWidget: { Widget w = GetWidget(taskData, XP1); XtDestroyWidget(w); /* The following test seems necessary - sometimes the callback from */ /* the above call destroys the widget, sometimes it doesn't. I think */ /* it always should, and I can't work out why this strange behaviour */ /* occurs. SPF 9/12/93 */ if (ResourceExists(XP1)) { DestroyXObject(XP1); PurgeCCallbacks((X_Widget_Object *)XP1,w); } break; } case XCALL_SetCallbacks: SetCallbacks (taskData, WidgetObject(taskData, XP1),P2,P3); break; /* WidgetObject added SPF */ case XCALL_XtSetValues: SetValues(taskData, GetWidget(taskData, XP1),SAVE(P2)); break; case XCALL_GetValue: return GetValue(taskData, GetDS(taskData, XP1),GetWidget(taskData, XP1),P2); case XCALL_XtParent: return EmptyWidget(taskData, GetDS(taskData, XP1),XtParent(GetWidget(taskData, XP1))); case XCALL_XtWindow: return EmptyWindow(taskData, GetDS(taskData, XP1),WindowOfWidget(GetWidget(taskData, XP1))); case XCALL_XtDisplay: return GetDS(taskData, XP1); case XCALL_XtUnrealizeWidget: XtUnrealizeWidget(GetWidget(taskData, XP1)); break; case XCALL_XtName: return Make_string(XtName(GetWidget(taskData, XP1))); case XCALL_XtParseTranslationTable: return ParseTranslationTable(taskData, GetString(XP1)); case XCALL_XtOverrideTranslations: XtOverrideTranslations(GetWidget(taskData, XP1),GetTrans(taskData, XP2)); break; case XCALL_XtAugmentTranslations: XtAugmentTranslations(GetWidget(taskData, XP1),GetTrans(taskData, XP2)); break; case XCALL_XtUninstallTranslations: XtUninstallTranslations(GetWidget(taskData, XP1)); break; /* case XCALL_XtTranslateTablePrint: _XtTranslateTablePrint(GetTrans(taskData, XP1)); break; */ case XCALL_XtCreatePopupShell: return CreatePopupShell(taskData, GetString(XP1),GetDS(taskData, XP2),GetWidget(taskData, XP2),SAVE(P3)); case XCALL_InsertWidgetTimeout: InsertWidgetTimeout(taskData, WidgetObject(taskData, XP1),get_C_ulong(taskData, P2),P3,P4); break; /* WidgetObject added SPF */ case XCALL_GetWidgetState: return SAVE(WidgetObjectToken(XP1)->state); /* was WidgetObject(XP1) (SPF) */ case XCALL_SetWidgetState: WidgetObjectToken(XP1)->state = P2; break; /* was WidgetObject(XP1) (SPF) */ case XCALL_XtSetSensitive: XtSetSensitive(GetWidget(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_XtIsSensitive: return Make_bool(XtIsSensitive(GetWidget(taskData, XP1))); case XCALL_GetSubresources: return GetSubresources(taskData, GetDS(taskData, XP1), GetWidget(taskData, XP1), GetString(P2), GetString(P3), SAVE(P4)); case XCALL_Cast: return SAVE(P1); case XCALL_XtPopup: XtPopup(GetWidget(taskData, XP1),GetXtGrabKind(taskData, P2)); break; case XCALL_XtPopdown: XtPopdown(GetWidget(taskData, XP1)); break; case XCALL_XtMapWidget: XtMapWidget(GetRealizedWidget(taskData, (char *) "XtMapWidget",XP1)); break; case XCALL_XtUnmapWidget: XtUnmapWidget(GetRealizedWidget(taskData, (char *) "XtUnmapWidget",XP1)); break; case XCALL_XtIsManaged: return Make_bool(XtIsManaged(GetWidget(taskData, XP1))); case XCALL_XtIsRealized: return Make_bool(XtIsRealized(GetWidget(taskData, XP1))); /* Added DCJM. */ case XCALL_XtGetApplicationResources: return GetApplicationResources (taskData, GetDS(taskData, XP1),GetWidget(taskData, XP1),SAVE(P2) ) ; case XCALL_XtAddEventHandler: AddEventhandler (taskData, WidgetObject(taskData, XP1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3), SAVE(P4)); break; /******************************************************************************/ /* */ /* Motif Calls - widget creation */ /* */ /******************************************************************************/ /* Motif 4000 */ #define XMCREATE(number,name) \ case number: return CreateXm(taskData, name, (char *) \ #name " failed", \ GetDS(taskData, XP1), \ GetWidget(taskData, XP1), \ GetString(P2), \ SAVE(P3)) XMCREATE(XCALL_XmCreateArrowButton,XmCreateArrowButton); XMCREATE(XCALL_XmCreateArrowButtonGadget,XmCreateArrowButtonGadget); XMCREATE(XCALL_XmCreateBulletinBoard,XmCreateBulletinBoard); XMCREATE(XCALL_XmCreateBulletinBoardDialog,XmCreateBulletinBoardDialog); XMCREATE(XCALL_XmCreateCascadeButton,XmCreateCascadeButton); XMCREATE(XCALL_XmCreateCascadeButtonGadget,XmCreateCascadeButtonGadget); XMCREATE(XCALL_XmCreateCommand,XmCreateCommand); XMCREATE(XCALL_XmCreateDialogShell,XmCreateDialogShell); XMCREATE(XCALL_XmCreateDrawingArea,XmCreateDrawingArea); XMCREATE(XCALL_XmCreateDrawnButton,XmCreateDrawnButton); XMCREATE(XCALL_XmCreateErrorDialog,XmCreateErrorDialog); XMCREATE(XCALL_XmCreateFileSelectionBox,XmCreateFileSelectionBox); XMCREATE(XCALL_XmCreateFileSelectionDialog,XmCreateFileSelectionDialog); XMCREATE(XCALL_XmCreateForm,XmCreateForm); XMCREATE(XCALL_XmCreateFormDialog,XmCreateFormDialog); XMCREATE(XCALL_XmCreateFrame,XmCreateFrame); XMCREATE(XCALL_XmCreateInformationDialog,XmCreateInformationDialog); XMCREATE(XCALL_XmCreateLabel,XmCreateLabel); XMCREATE(XCALL_XmCreateLabelGadget,XmCreateLabelGadget); XMCREATE(XCALL_XmCreateList,XmCreateList); XMCREATE(XCALL_XmCreateMainWindow,XmCreateMainWindow); XMCREATE(XCALL_XmCreateMenuBar,XmCreateMenuBar); XMCREATE(XCALL_XmCreateMenuShell,XmCreateMenuShell); XMCREATE(XCALL_XmCreateMessageBox,XmCreateMessageBox); XMCREATE(XCALL_XmCreateMessageDialog,XmCreateMessageDialog); XMCREATE(XCALL_XmCreateOptionMenu,XmCreateOptionMenu); XMCREATE(XCALL_XmCreatePanedWindow,XmCreatePanedWindow); XMCREATE(XCALL_XmCreatePopupMenu,XmCreatePopupMenu); XMCREATE(XCALL_XmCreatePromptDialog,XmCreatePromptDialog); XMCREATE(XCALL_XmCreatePulldownMenu,XmCreatePulldownMenu); XMCREATE(XCALL_XmCreatePushButton,XmCreatePushButton); XMCREATE(XCALL_XmCreatePushButtonGadget,XmCreatePushButtonGadget); XMCREATE(XCALL_XmCreateQuestionDialog,XmCreateQuestionDialog); XMCREATE(XCALL_XmCreateRadioBox,XmCreateRadioBox); XMCREATE(XCALL_XmCreateRowColumn,XmCreateRowColumn); XMCREATE(XCALL_XmCreateScale,XmCreateScale); XMCREATE(XCALL_XmCreateScrollBar,XmCreateScrollBar); XMCREATE(XCALL_XmCreateScrolledList,XmCreateScrolledList); XMCREATE(XCALL_XmCreateScrolledText,XmCreateScrolledText); XMCREATE(XCALL_XmCreateScrolledWindow,XmCreateScrolledWindow); XMCREATE(XCALL_XmCreateSelectionBox,XmCreateSelectionBox); XMCREATE(XCALL_XmCreateSelectionDialog,XmCreateSelectionDialog); XMCREATE(XCALL_XmCreateSeparator,XmCreateSeparator); XMCREATE(XCALL_XmCreateSeparatorGadget,XmCreateSeparatorGadget); XMCREATE(XCALL_XmCreateSimpleCheckBox,XmCreateSimpleCheckBox); XMCREATE(XCALL_XmCreateSimpleMenuBar,XmCreateSimpleMenuBar); XMCREATE(XCALL_XmCreateSimpleOptionMenu,XmCreateSimpleOptionMenu); XMCREATE(XCALL_XmCreateSimplePopupMenu,XmCreateSimplePopupMenu); XMCREATE(XCALL_XmCreateSimplePulldownMenu,XmCreateSimplePulldownMenu); XMCREATE(XCALL_XmCreateSimpleRadioBox,XmCreateSimpleRadioBox); XMCREATE(XCALL_XmCreateText,XmCreateText); XMCREATE(XCALL_XmCreateTextField,XmCreateTextField); XMCREATE(XCALL_XmCreateToggleButton,XmCreateToggleButton); XMCREATE(XCALL_XmCreateToggleButtonGadget,XmCreateToggleButtonGadget); XMCREATE(XCALL_XmCreateWarningDialog,XmCreateWarningDialog); XMCREATE(XCALL_XmCreateWorkArea,XmCreateWorkArea); XMCREATE(XCALL_XmCreateWorkingDialog,XmCreateWorkingDialog); #undef XMCREATE /******************************************************************************/ /* */ /* Motif Calls - miscellaneous */ /* */ /******************************************************************************/ case XCALL_XmCascadeButtonHighlight: XmCascadeButtonHighlight(GetWidget(taskData, XP1),get_C_ulong(taskData, P2)); break; case XCALL_XmCommandError: CommandError(taskData, GetWidget(taskData, XP1),P2); break; case XCALL_XmCommandGetChild: return EmptyWidget(taskData, GetDS(taskData, XP1), XmCommandGetChild(GetWidget(taskData, XP1),get_C_ulong(taskData, P2))); case XCALL_XmFileSelectionBoxGetChild: return EmptyWidget(taskData, GetDS(taskData, XP1), XmFileSelectionBoxGetChild(GetWidget(taskData, XP1),get_C_ulong(taskData, P2))); case XCALL_XmFileSelectionDoSearch: FileSelectionDoSearch(taskData, GetWidget(taskData, XP1),P2); break; case XCALL_XmIsSomething: return XmIsSomething(taskData, get_C_ulong(taskData, P1),GetWidget(taskData, XP2)); case XCALL_XmMainWindowSetAreas: XmMainWindowSetAreas(GetWidget(taskData, XP1), GetNWidget(taskData, XP2), GetNWidget(taskData, XP3), GetNWidget(taskData, XP4), GetNWidget(taskData, XP5), GetNWidget(taskData, XP6)); break; case XCALL_XmMainWindowSepX: switch(get_C_ulong(taskData, P2)) { case 1: return EmptyWidget(taskData, GetDS(taskData, XP1),XmMainWindowSep1(GetWidget(taskData, XP1))); case 2: return EmptyWidget(taskData, GetDS(taskData, XP1),XmMainWindowSep2(GetWidget(taskData, XP1))); default: return EmptyWidget(taskData, GetDS(taskData, XP1),XmMainWindowSep3(GetWidget(taskData, XP1))); } case XCALL_XmMessageBoxGetChild: return EmptyWidget(taskData, GetDS(taskData, XP1), XmMessageBoxGetChild(GetWidget(taskData, XP1),get_C_ulong(taskData, P2))); case XCALL_XmOptionButtonGadget: return EmptyWidget(taskData, GetDS(taskData, XP1),XmOptionButtonGadget(GetWidget(taskData, XP1))); case XCALL_XmOptionLabelGadget: return EmptyWidget(taskData, GetDS(taskData, XP1),XmOptionLabelGadget (GetWidget(taskData, XP1))); case XCALL_XmSelectionBoxGetChild: return EmptyWidget(taskData, GetDS(taskData, XP1), XmSelectionBoxGetChild(GetWidget(taskData, XP1),get_C_ulong(taskData, P2))); case XCALL_XmSetMenuCursor: XmSetMenuCursor(GetDisplay(taskData, XP1),GetCursor(taskData, XP2)); break; case XCALL_XmScrolledWindowSetAreas: XmScrolledWindowSetAreas(GetWidget(taskData, XP1), GetNWidget(taskData, XP2), GetNWidget(taskData, XP3), GetNWidget(taskData, XP4)); break; /******************************************************************************/ /* */ /* Operations on XmText widgets */ /* */ /******************************************************************************/ #define TextWidgetToLong(func) \ case XCALL_ ## func : \ return(WidgetToLong(taskData,(char *) #func,GetTextWidget,func,XP1)) #define TextWidgetToInt(func) \ case XCALL_ ## func : \ return(WidgetToInt(taskData,(char *) #func,GetTextWidget,func,XP1)) #define TextWidgetToBool(func) \ case XCALL_ ## func : \ return(WidgetToBool(taskData,(char *) #func,GetTextWidget,func,XP1)) #define TextWidgetToString(func) \ case XCALL_ ## func : \ return(WidgetToString(taskData,(char *) #func,GetTextWidget,func,XP1)) #define TextWidgetIntAction(func) \ case XCALL_ ## func : \ WidgetIntAction(taskData,(char *) #func,GetTextWidget,func,XP1,P2); \ break #define TextWidgetLongAction(func) \ case XCALL_ ## func : \ WidgetLongAction(taskData,(char *) #func,GetTextWidget,func,XP1,P2); \ break #define TextWidgetBoolAction(func) \ case XCALL_ ## func : \ WidgetBoolAction(taskData,(char *) #func,GetTextWidget,func,XP1,P2); \ break /* XmTextClearSelection not supported */ /* XmTextCopy not supported */ /* XmTextCut not supported */ #ifdef LESSTIF_VERSION /* This is not supported in LessTif, at least not 0.89. */ case XCALL_XmTextGetAddMode: RaiseXWindows(taskData, "XmTextGetAddMode: not implemented"); #else TextWidgetToBool(XmTextGetAddMode); #endif TextWidgetToLong(XmTextGetCursorPosition); TextWidgetToInt(XmTextGetBaseline); TextWidgetToBool(XmTextGetEditable); TextWidgetToLong(XmTextGetInsertionPosition); TextWidgetToLong(XmTextGetLastPosition); TextWidgetToInt(XmTextGetMaxLength); TextWidgetToString(XmTextGetSelection); /* XmTextGetSelectionPosition not supported */ TextWidgetToString(XmTextGetString); /* XmTextGetSource not supported */ TextWidgetToLong(XmTextGetTopCharacter); case XCALL_XmTextInsert: { Widget w = GetTextWidget(taskData, (char *) "XmTextInsert",XP1); { unsigned pos = get_C_ulong(taskData, P2); PolyStringObject *s = GetString(P3); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextInsert(w,pos,buffer); break; } } TextWidgetToBool(XmTextPaste); /* with side effect! */ /* XmTextPosToXY not supported */ TextWidgetToBool(XmTextRemove); /* with side effect! */ case XCALL_XmTextReplace: { Widget w = GetTextWidget(taskData, (char *) "XmTextReplace",XP1); { unsigned from_pos = get_C_ulong(taskData, P2); unsigned to_pos = get_C_ulong(taskData, P3); PolyStringObject *s = GetString(P4); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextReplace(w,from_pos,to_pos,buffer); break; } } TextWidgetIntAction(XmTextScroll); /* for side effect! */ TextWidgetBoolAction(XmTextSetAddMode); TextWidgetLongAction(XmTextSetCursorPosition); TextWidgetBoolAction(XmTextSetEditable); /* XmTextSetHighlight not supported */ TextWidgetLongAction(XmTextSetInsertionPosition); TextWidgetIntAction(XmTextSetMaxLength); /* XmTextSetSelection not supported */ /* XmTextSetSource not supported */ /* inlined SPF 15/2/94 */ case XCALL_XmTextSetString: { Widget w = GetTextWidget(taskData, (char *) "XmTextSetString",XP1); { PolyStringObject *s = GetString(P2); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextSetString(w,buffer); break; } } TextWidgetLongAction(XmTextSetTopCharacter); TextWidgetLongAction(XmTextShowPosition); case XCALL_XmTextXYToPos: { Widget w = GetTextWidget(taskData, (char *) "XmTextXYToPos",XP1); { int x = get_C_long(taskData, P2); int y = get_C_long(taskData, P3); return Make_int(XmTextXYToPos(w,x,y)); } } #undef TextWidgetToLong #undef TextWidgetToInt #undef TextWidgetToBool #undef TextWidgetToString #undef TextWidgetIntAction #undef TextWidgetBoolAction /******************************************************************************/ /* */ /* Operations on XmTextField widgets */ /* */ /******************************************************************************/ #define TextFieldWidgetToLong(func) \ case XCALL_ ## func : \ return(WidgetToLong(taskData, (char *) #func,GetTextFieldWidget,func,XP1)) #define TextFieldWidgetToInt(func) \ case XCALL_ ## func : \ return(WidgetToInt(taskData, (char *) #func,GetTextFieldWidget,func,XP1)) #define TextFieldWidgetToBool(func) \ case XCALL_ ## func : \ return(WidgetToBool(taskData, (char *) #func,GetTextFieldWidget,func,XP1)) #define TextFieldWidgetToString(func) \ case XCALL_ ## func : \ return(WidgetToString(taskData, (char *) #func,GetTextFieldWidget,func,XP1)) #define TextFieldWidgetIntAction(func) \ case XCALL_ ## func : \ WidgetIntAction(taskData, (char *) #func,GetTextFieldWidget,func,XP1,P2); \ break #define TextFieldWidgetLongAction(func) \ case XCALL_ ## func : \ WidgetLongAction(taskData, (char *) #func,GetTextFieldWidget,func,XP1,P2); \ break #define TextFieldWidgetBoolAction(func) \ case XCALL_ ## func : \ WidgetBoolAction(taskData, (char *) #func,GetTextFieldWidget,func,XP1,P2); \ break /* XmTextFieldClearSelection not supported */ /* XmTextFieldCopy not supported */ /* XmTextFieldCut not supported */ #ifdef LESSTIF_VERSION /* This is not supported in LessTif, at least not 0.89. */ case XCALL_XmTextFieldGetAddMode: RaiseXWindows(taskData, "XmTextFieldGetAddMode: not implemented"); #else TextFieldWidgetToBool(XmTextFieldGetAddMode); #endif TextFieldWidgetToInt(XmTextFieldGetBaseline); TextFieldWidgetToLong(XmTextFieldGetCursorPosition); TextFieldWidgetToBool(XmTextFieldGetEditable); TextFieldWidgetToLong(XmTextFieldGetInsertionPosition); TextFieldWidgetToLong(XmTextFieldGetLastPosition); TextFieldWidgetToInt(XmTextFieldGetMaxLength); TextFieldWidgetToString(XmTextFieldGetSelection); /* XmTextFieldGetSelectionPosition not supported */ TextFieldWidgetToString(XmTextFieldGetString); /* XmTextFieldGetSource not supported */ case XCALL_XmTextFieldInsert: { Widget w = GetTextFieldWidget(taskData, (char *) "XmTextFieldInsert",XP1); { unsigned pos = get_C_ulong(taskData, P2); PolyStringObject *s = GetString(P3); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextFieldInsert(w,pos,buffer); break; } } TextFieldWidgetToBool(XmTextFieldPaste); /* for side effect! */ /* XmTextFieldPosToXY not supported */ TextFieldWidgetToBool(XmTextFieldRemove); /* for side effect! */ case XCALL_XmTextFieldReplace: { Widget w = GetTextFieldWidget(taskData, (char *) "XmTextFieldReplace",XP1); { unsigned from_pos = get_C_ulong(taskData, P2); unsigned to_pos = get_C_ulong(taskData, P3); PolyStringObject *s = GetString(P4); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextFieldReplace(w,from_pos,to_pos,buffer); break; } } TextFieldWidgetBoolAction(XmTextFieldSetAddMode); TextFieldWidgetLongAction(XmTextFieldSetCursorPosition); TextFieldWidgetBoolAction(XmTextFieldSetEditable); /* XmTextFieldSetHighlight not supported */ TextFieldWidgetLongAction(XmTextFieldSetInsertionPosition); TextFieldWidgetIntAction(XmTextFieldSetMaxLength); /* XmTextFieldSetSelection not supported */ /* inlined SPF 15/2/94 */ case XCALL_XmTextFieldSetString: { Widget w = GetTextFieldWidget(taskData, (char *) "XmTextFieldSetString",XP1); { PolyStringObject *s = GetString(P2); int size = s->length + 1; char *buffer = (char *)alloca(size); Poly_string_to_C(s,buffer,size); XmTextFieldSetString(w,buffer); break; } } TextFieldWidgetLongAction(XmTextFieldShowPosition); /* for side effect! */ case XCALL_XmTextFieldXYToPos: { Widget w = GetTextFieldWidget(taskData, (char *) "XmTextFieldXYToPos",XP1); { int x = get_C_long(taskData, P2); int y = get_C_long(taskData, P3); return Make_int(XmTextFieldXYToPos(w,x,y)); } } case XCALL_XmTrackingLocate: return EmptyWidget(taskData, GetDS(taskData, XP1), XmTrackingLocate(GetWidget(taskData, XP1),GetCursor(taskData, XP2),get_C_ulong(taskData, P3))); case XCALL_XmUpdateDisplay: XmUpdateDisplay(GetWidget(taskData, XP1)); break; #undef TextFieldWidgetToLong #undef TextFieldWidgetToInt #undef TextFieldWidgetToBool #undef TextFieldWidgetToString #undef TextFieldWidgetIntAction #undef TextFieldWidgetLongAction #undef TextFieldWidgetBoolAction /******************************************************************************/ /* */ /* Operations on XmList widgets */ /* */ /******************************************************************************/ #define ListWidgetAction(func) \ case XCALL_ ## func : \ WidgetAction(taskData, (char *) #func,GetListWidget,func,XP1); \ break #define ListWidgetBoolAction(func) \ case XCALL_ ## func : \ WidgetBoolAction(taskData, (char *) #func,GetListWidget,func,XP1,P2); \ break #define ListWidgetXmstringAction(func) \ case XCALL_ ## func : \ WidgetXmstringAction(taskData, (char *) #func,GetListWidget,func,XP1,P2); \ break #define ListWidgetXmstringlistAction(func) \ case XCALL_ ## func : \ WidgetXmstringlistAction(taskData, (char *) #func,GetListWidget,func,XP1,(ML_Cons_Cell *)XP2); \ break #define ListWidgetIntAction(func) \ case XCALL_ ## func : \ WidgetIntAction(taskData, (char *) #func,GetListWidget,func,XP1,P2); \ break #define ListWidgetIntIntAction(func) \ case XCALL_ ## func : \ WidgetIntIntAction(taskData, (char *) #func,GetListWidget,func,XP1,P2,P3); \ break #define ListWidgetXmstringIntAction(func) \ case XCALL_ ## func : \ WidgetXmstringIntAction(taskData, (char *) #func,GetListWidget,func,XP1,P2,P3); \ break #define ListWidgetIntBoolAction(func) \ case XCALL_ ## func : \ WidgetIntBoolAction(taskData, (char *) #func,GetListWidget,func,XP1,P2,P3); \ break #define ListWidgetXmstringBoolAction(func) \ case XCALL_ ## func : \ WidgetXmstringBoolAction(taskData, (char *) #func,GetListWidget,func,XP1,P2,P3); \ break #define ListWidgetXmstringlistIntAction(func) \ case XCALL_ ## func : \ WidgetXmstringlistIntAction(taskData, (char *) #func,GetListWidget,func,XP1,(ML_Cons_Cell *)XP2,P3); \ break #define ListWidgetXmstringToIntlist(func) \ case XCALL_ ## func : \ return(WidgetXmstringToIntlist(taskData, (char *) #func,GetListWidget,func,XP1,P2)) #define ListWidgetToIntlist(func) \ case XCALL_ ## func : \ return(WidgetToIntlist(taskData, (char *) #func,GetListWidget,func,XP1)) #define ListWidgetXmstringToBool(func) \ case XCALL_ ## func : \ return(WidgetXmstringToBool(taskData, (char *) #func,GetListWidget,func,XP1,P2)) #define ListWidgetXmstringToInt(func) \ case XCALL_ ## func : \ return(WidgetXmstringToInt(taskData, (char *) #func,GetListWidget,func,XP1,P2)) /************************* Adding Items to List *******************************/ ListWidgetXmstringIntAction(XmListAddItem); ListWidgetXmstringIntAction(XmListAddItemUnselected); ListWidgetXmstringlistIntAction(XmListAddItems); /************************* Deleting Items from List ***************************/ ListWidgetAction(XmListDeleteAllItems); ListWidgetXmstringAction(XmListDeleteItem); ListWidgetXmstringlistAction(XmListDeleteItems); ListWidgetIntAction(XmListDeletePos); ListWidgetIntIntAction(XmListDeleteItemsPos); /************************* Deselecting Items **********************************/ ListWidgetAction(XmListDeselectAllItems); ListWidgetXmstringAction(XmListDeselectItem); ListWidgetIntAction(XmListDeselectPos); /************************* Query Functions ************************************/ ListWidgetXmstringToIntlist(XmListGetMatchPos); ListWidgetToIntlist(XmListGetSelectedPos); ListWidgetXmstringToBool(XmListItemExists); ListWidgetXmstringToInt(XmListItemPos); /************************* Replacing Items in the List ************************/ case XCALL_XmListReplaceItems: /* Unpairing the strings is done in the ML, because it's easier there. */ { Widget w = GetListWidget(taskData, (char *) "XmListReplaceItems",XP1); unsigned n = ListLength(P2); unsigned n2 = ListLength(P3); if (n != n2) { RaiseXWindows(taskData, "XmListReplaceItems: strings lists are different lengths"); } else { XmString *oldstrings = (XmString *)alloca(n * sizeof(XmString)); XmString *newstrings = (XmString *)alloca(n * sizeof(XmString)); GetList4(taskData, P2,oldstrings,sizeof(XmString),GetXmString); GetList4(taskData, P3,newstrings,sizeof(XmString),GetXmString); XmListReplaceItems(w,oldstrings,n,newstrings); for (unsigned i = 0; i < n; i ++) XmStringFree(oldstrings[i]); for (unsigned i = 0; i < n; i ++) XmStringFree(newstrings[i]); } break; } ListWidgetXmstringlistIntAction(XmListReplaceItemsPos); /************************* Selecting Items in the List ************************/ ListWidgetXmstringBoolAction(XmListSelectItem); ListWidgetIntBoolAction(XmListSelectPos); /************************* Set Add Mode ***************************************/ ListWidgetBoolAction(XmListSetAddMode); /************************* Set Appearance *************************************/ ListWidgetXmstringAction(XmListSetBottomItem); ListWidgetIntAction(XmListSetBottomPos); ListWidgetIntAction(XmListSetHorizPos); ListWidgetXmstringAction(XmListSetItem); ListWidgetIntAction(XmListSetPos); #undef ListWidgetAction #undef ListWidgetBoolAction #undef ListWidgetXmstringAction #undef ListWidgetXmstringlistAction #undef ListWidgetIntAction #undef ListWidgetIntIntAction #undef ListWidgetXmstringIntAction #undef ListWidgetXmstringBoolAction #undef ListWidgetXmstringlistIntAction #undef ListWidgetXmstringToIntlist #undef ListWidgetToIntlist #undef ListWidgetXmstringToBool #undef ListWidgetXmstringToInt /* Calls added by DCJM. */ case XCALL_XmMenuPosition: MenuPosition( GetWidget(taskData, XP1), get_C_ulong(taskData, P2), get_C_ulong(taskData, P3)); break; /******************************************************************************/ /* */ /* Default case */ /* */ /******************************************************************************/ default: Crash ("Unimplemented X Windows call %d", code); } return Make_bool(False); } typedef struct { int code; const char *name; } CodeName; static CodeName ProtocolNames[] = { { X_CreateWindow,"XCreateWindow"}, { X_ChangeWindowAttributes,"XChangeWindowAttributes"}, { X_GetWindowAttributes,"XGetWindowAttributes"}, { X_DestroyWindow,"XDestroyWindow"}, { X_DestroySubwindows,"XDestroySubwindows"}, { X_ChangeSaveSet,"XChangeSAVESet"}, { X_ReparentWindow,"XReparentWindow"}, { X_MapWindow,"XMapWindow"}, { X_MapSubwindows,"XMapSubwindows"}, { X_UnmapWindow,"XUnmapWindow"}, { X_UnmapSubwindows,"XUnmapSubwindows"}, { X_ConfigureWindow,"XConfigureWindow"}, { X_CirculateWindow,"XCirculateWindow"}, { X_GetGeometry,"XGetGeometry"}, { X_QueryTree,"XQueryTree"}, { X_InternAtom,"XInternAtom"}, { X_GetAtomName,"XGetAtomName"}, { X_ChangeProperty,"XChangeProperty"}, { X_DeleteProperty,"XDeleteProperty"}, { X_GetProperty,"XGetProperty"}, { X_ListProperties,"XListProperties"}, { X_SetSelectionOwner,"XSetSelectionOwner"}, { X_GetSelectionOwner,"XGetSelectionOwner"}, { X_ConvertSelection,"XConvertSelection"}, { X_SendEvent,"XSendEvent"}, { X_GrabPointer,"XGrabPointer"}, { X_UngrabPointer,"XUngrabPointer"}, { X_GrabButton,"XGrabButton"}, { X_UngrabButton,"XUngrabButton"}, { X_ChangeActivePointerGrab,"XChangeActivePointerGrab"}, { X_GrabKeyboard,"XGrabKeyboard"}, { X_UngrabKeyboard,"XUngrabKeyboard"}, { X_GrabKey,"XGrabKey"}, { X_UngrabKey,"XUngrabKey"}, { X_AllowEvents,"XAllowEvents"}, { X_GrabServer,"XGrabServer"}, { X_UngrabServer,"XUngrabServer"}, { X_QueryPointer,"XQueryPointer"}, { X_GetMotionEvents,"XGetMotionEvents"}, { X_TranslateCoords,"XTranslateCoords"}, { X_WarpPointer,"XWarpPointer"}, { X_SetInputFocus,"XSetInputFocus"}, { X_GetInputFocus,"XGetInputFocus"}, { X_QueryKeymap,"XQueryKeymap"}, { X_OpenFont,"XOpenFont"}, { X_CloseFont,"XCloseFont"}, { X_QueryFont,"XQueryFont"}, { X_QueryTextExtents,"XQueryTextExtents"}, { X_ListFonts,"XListFonts"}, { X_ListFontsWithInfo,"XListFontsWithInfo"}, { X_SetFontPath,"XSetFontPath"}, { X_GetFontPath,"XGetFontPath"}, { X_CreatePixmap,"XCreatePixmap"}, { X_FreePixmap,"XFreePixmap"}, { X_CreateGC,"XCreateGC"}, { X_ChangeGC,"XChangeGC"}, { X_CopyGC,"XCopyGC"}, { X_SetDashes,"XSetDashes"}, { X_SetClipRectangles,"XSetClipRectangles"}, { X_FreeGC,"XFreeGC"}, { X_ClearArea,"XClearArea"}, { X_CopyArea,"XCopyArea"}, { X_CopyPlane,"XCopyPlane"}, { X_PolyPoint,"XPolyPoint"}, { X_PolyLine,"XPolyLine"}, { X_PolySegment,"XPolySegment"}, { X_PolyRectangle,"XPolyRectangle"}, { X_PolyArc,"XPolyArc"}, { X_FillPoly,"XFillPoly"}, { X_PolyFillRectangle,"XPolyFillRectangle"}, { X_PolyFillArc,"XPolyFillArc"}, { X_PutImage,"XPutImage"}, { X_GetImage,"XGetImage"}, { X_PolyText8,"XPolyText8"}, { X_PolyText16,"XPolyText16"}, { X_ImageText8,"XImageText8"}, { X_ImageText16,"XImageText16"}, { X_CreateColormap,"XCreateColormap"}, { X_FreeColormap,"XFreeColormap"}, { X_CopyColormapAndFree,"XCopyColormapAndFree"}, { X_InstallColormap,"XInstallColormap"}, { X_UninstallColormap,"XUninstallColormap"}, { X_ListInstalledColormaps,"XListInstalledColormaps"}, { X_AllocColor,"XAllocColor"}, { X_AllocNamedColor,"XAllocNamedColor"}, { X_AllocColorCells,"XAllocColorCells"}, { X_AllocColorPlanes,"XAllocColorPlanes"}, { X_FreeColors,"XFreeColors"}, { X_StoreColors,"XStoreColors"}, { X_StoreNamedColor,"XStoreNamedColor"}, { X_QueryColors,"XQueryColors"}, { X_LookupColor,"XLookupColor"}, { X_CreateCursor,"XCreateCursor"}, { X_CreateGlyphCursor,"XCreateGlyphCursor"}, { X_FreeCursor,"XFreeCursor"}, { X_RecolorCursor,"XRecolorCursor"}, { X_QueryBestSize,"XQueryBestSize"}, { X_QueryExtension,"XQueryExtension"}, { X_ListExtensions,"XListExtensions"}, { X_ChangeKeyboardMapping,"XChangeKeyboardMapping"}, { X_GetKeyboardMapping,"XGetKeyboardMapping"}, { X_ChangeKeyboardControl,"XChangeKeyboardControl"}, { X_GetKeyboardControl,"XGetKeyboardControl"}, { X_Bell,"XBell"}, { X_ChangePointerControl,"XChangePointerControl"}, { X_GetPointerControl,"XGetPointerControl"}, { X_SetScreenSaver,"XSetScreenSaver"}, { X_GetScreenSaver,"XGetScreenSaver"}, { X_ChangeHosts,"XChangeHosts"}, { X_ListHosts,"XListHosts"}, { X_SetAccessControl,"XSetAccessControl"}, { X_SetCloseDownMode,"XSetCloseDownMode"}, { X_KillClient,"XKillClient"}, { X_RotateProperties,"XRotateProperties"}, { X_ForceScreenSaver,"XForceScreenSaver"}, { X_SetPointerMapping,"XSetPointerMapping"}, { X_GetPointerMapping,"XGetPointerMapping"}, { X_SetModifierMapping,"XSetModifierMapping"}, { X_GetModifierMapping,"XGetModifierMapping"}, { X_NoOperation,"XNoOperation"} }; static CodeName ProtocolErrors[] = { { Success,"Success"}, { BadRequest,"BadRequest"}, { BadValue,"BadValue"}, { BadWindow,"BadWindow"}, { BadPixmap,"BadPixmap"}, { BadAtom,"BadAtom"}, { BadCursor,"BadCursor"}, { BadFont,"BadFont"}, { BadMatch,"BadMatch"}, { BadDrawable,"BadDrawable"}, { BadAccess,"BadAccess"}, { BadAlloc,"BadAlloc"}, { BadColor,"BadColor"}, { BadGC,"BadGC"}, { BadIDChoice,"BadIDChoice"}, { BadName,"BadName"}, { BadLength,"BadLength"}, { BadImplementation,"BadImplementation"} }; static int XWindowsError(Display *display, XErrorEvent *error) { const char *errorName = "unknown"; const char *requestName = "unknown"; int i,n; char buffer[500]; n = sizeof(ProtocolErrors) / sizeof(ProtocolErrors[0]); for(i = 0; i < n; i++) { if (ProtocolErrors[i].code == error->error_code) { errorName = ProtocolErrors[i].name; } } n = sizeof(ProtocolNames) / sizeof(ProtocolNames[0]); for(i = 0; i < n; i++) { if (ProtocolNames[i].code == error->request_code) { requestName = ProtocolNames[i].name; } } sprintf(buffer,"%s in %s",errorName,requestName); printf("\nX Error %s\n\n", buffer); #if NEVER /* Raise exception if we are running in synchronous mode */ if (display->private15) RaiseXWindows(taskData, buffer); #endif return 0; /* DUMMY value - SPF 6/1/94 */ } class XWinModule: public RtsModule { public: virtual void Init(void); void GarbageCollect(ScanAddress *process); }; // Declare this. It will be automatically added to the table. static XWinModule xwinModule; void XWinModule::GarbageCollect(ScanAddress *process) { /* Process all the objects in the list. If an object */ /* is not found from outside then it is removed. */ T_List **T = &TList; C_List **C = &CList; int i; /* process all XList headers */ for (i = 0; i < XLISTSIZE; i++) { X_List *L = XList[i]; while(L) { PolyObject *P = L->object; /* copy object pointer */ X_List *N = L->next; /* copy next pointer */ process->ScanRuntimeAddress(&P, ScanAddress::STRENGTH_WEAK); /* P may have been moved, or overwritten with a 0 if not accessible */ if (P == 0) DestroyXObject(L->object); else L->object = (X_Object*)P; L = N; } } /* Process the timeout/message list */ while (*T) { T_List *t = *T; process->ScanRuntimeAddress(&t->alpha, ScanAddress::STRENGTH_STRONG); process->ScanRuntimeAddress(&t->handler, ScanAddress::STRENGTH_STRONG); PolyObject *obj = t->window_object; process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_WEAK); t->window_object = (X_Window_Object*)obj; obj = t->widget_object; process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_STRONG); t->widget_object = (X_Widget_Object*)obj; // DCJM: I don't understand this. The widget entry will never go // to zero since it's strong not weak. if (t->window_object == 0 && t->widget_object == 0) { *T = t->next; free(t); } else T = &t->next; } /* Process the callback list */ while(*C) { C_List *c = *C; process->ScanRuntimeAddress(&c->function, ScanAddress::STRENGTH_STRONG); PolyObject *obj = c->widget_object; process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_STRONG); c->widget_object = (X_Widget_Object*)obj; /* DCJM: This doesn't make sense. The widget entry will only go to zero if the G.C. operation was weak, not strong as in the line above. */ if (c->widget_object == 0) { *C = c->next; free(c); } else C = &c->next; } /* Process the callback waiting list */ if (! FList.IsTagged()) { PolyObject *obj = FList.AsObjPtr(); process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_STRONG); FList = obj; } /* and the Xt event waiting list. */ if (! GList.IsTagged()) { PolyObject *obj = GList.AsObjPtr(); process->ScanRuntimeAddress(&obj, ScanAddress::STRENGTH_STRONG) ; GList = obj; } } void XWinModule::Init(void) { initXList(); /* added 9/12/93 SPF */ XtToolkitThreadInitialize(); XtToolkitInitialize(); XSetErrorHandler(XWindowsError); } #else // We haven't got X or we haven't got Motif #include "globals.h" #include "run_time.h" #include "sys.h" #include "save_vec.h" #include "machine_dep.h" #include "processes.h" #include "xwindows.h" Handle XWindows_c(TaskData *taskData, Handle/*params*/) { raise_exception_string(taskData, EXC_XWindows, "Not implemented"); /*NOTREACHED*/ return taskData->saveVec.push(TAGGED(0)); /* just to keep lint happy */ } #endif polyml-5.6/libpolyml/xwindows.h000066400000000000000000000021601265146633400167470ustar00rootroot00000000000000/* Title: xwindows.h - export signature for xwindows.c, noxwindows.c Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* created 26/10/93 - SPF */ #ifndef XWINDOWS_H_INCLUDED #define XWINDOWS_H_INCLUDED class SaveVecEntry; typedef SaveVecEntry *Handle; class TaskData; extern Handle XWindows_c(TaskData *taskData, Handle params); #endif polyml-5.6/ltmain.sh000066400000000000000000010520301265146633400145330ustar00rootroot00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.11 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.11" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 polyml-5.6/m4/000077500000000000000000000000001265146633400132325ustar00rootroot00000000000000polyml-5.6/m4/libtool.m4000066400000000000000000010601111265146633400151400ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS polyml-5.6/m4/ltdl.m4000066400000000000000000000647041265146633400144460ustar00rootroot00000000000000# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*- # # Copyright (C) 1999-2006, 2007, 2008, 2011 Free Software Foundation, Inc. # Written by Thomas Tanner, 1999 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 18 LTDL_INIT # LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE]) # ------------------------------------------ # DIRECTORY contains the libltdl sources. It is okay to call this # function multiple times, as long as the same DIRECTORY is always given. AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) _$0($*) ])# LT_CONFIG_LTDL_DIR # We break this out into a separate macro, so that we can call it safely # internally without being caught accidentally by the sed scan in libtoolize. m4_defun([_LT_CONFIG_LTDL_DIR], [dnl remove trailing slashes m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$])) m4_case(_LTDL_DIR, [], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.' m4_if(_ARG_DIR, [.], [], [m4_define([_LTDL_DIR], _ARG_DIR) _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])], [m4_if(_ARG_DIR, _LTDL_DIR, [], [m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])]) m4_popdef([_ARG_DIR]) ])# _LT_CONFIG_LTDL_DIR # Initialise: m4_define([_LTDL_DIR], []) # _LT_BUILD_PREFIX # ---------------- # If Autoconf is new enough, expand to `${top_build_prefix}', otherwise # to `${top_builddir}/'. m4_define([_LT_BUILD_PREFIX], [m4_ifdef([AC_AUTOCONF_VERSION], [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]), [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX], [${top_build_prefix}], [${top_builddir}/])], [${top_build_prefix}])], [${top_builddir}/])[]dnl ]) # LTDL_CONVENIENCE # ---------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. LIBLTDL will be prefixed with # '${top_build_prefix}' if available, otherwise with '${top_builddir}/', # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_build_prefix, top_builddir, and top_srcdir appropriately # in your Makefiles. AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl dnl Although the argument is deprecated and no longer documented, dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one dnl here make sure it is the same as any other declaration of libltdl's dnl location! This also ensures lt_ltdl_dir is set when configure.ac is dnl not yet using an explicit LT_CONFIG_LTDL_DIR. m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl _$0() ])# LTDL_CONVENIENCE # AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools, # now we have LT_CONFIG_LTDL_DIR: AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) _LTDL_CONVENIENCE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], []) # _LTDL_CONVENIENCE # ----------------- # Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]). m4_defun([_LTDL_CONVENIENCE], [case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la" LTDLDEPS=$LIBLTDL LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" AC_SUBST([LIBLTDL]) AC_SUBST([LTDLDEPS]) AC_SUBST([LTDLINCL]) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" AC_SUBST([INCLTDL]) ])# _LTDL_CONVENIENCE # LTDL_INSTALLABLE # ---------------- # sets LIBLTDL to the link flags for the libltdl installable library # and LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called from here. If an installed libltdl # is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if # available, otherwise with '${top_builddir}/', and LTDLINCL will be # prefixed with '${top_srcdir}/' (note the single quotes!). If your # package is not flat and you're not using automake, define top_build_prefix, # top_builddir, and top_srcdir appropriately in your Makefiles. # In the future, this macro may have to be called after LT_INIT. AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl dnl Although the argument is deprecated and no longer documented, dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one dnl here make sure it is the same as any other declaration of libltdl's dnl location! This also ensures lt_ltdl_dir is set when configure.ac is dnl not yet using an explicit LT_CONFIG_LTDL_DIR. m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl _$0() ])# LTDL_INSTALLABLE # AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools, # now we have LT_CONFIG_LTDL_DIR: AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) _LTDL_INSTALLABLE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], []) # _LTDL_INSTALLABLE # ----------------- # Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]). m4_defun([_LTDL_INSTALLABLE], [if test -f $prefix/lib/libltdl.la; then lt_save_LDFLAGS="$LDFLAGS" LDFLAGS="-L$prefix/lib $LDFLAGS" AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes]) LDFLAGS="$lt_save_LDFLAGS" if test x"${lt_lib_ltdl-no}" = xyes; then if test x"$enable_ltdl_install" != xyes; then # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install']) enable_ltdl_install=no fi elif test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) fi fi # If configure.ac declared an installable ltdl, and the user didn't override # with --disable-ltdl-install, we will install the shipped libltdl. case $enable_ltdl_install in no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLDEPS= LTDLINCL= ;; *) enable_ltdl_install=yes ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la" LTDLDEPS=$LIBLTDL LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}" ;; esac AC_SUBST([LIBLTDL]) AC_SUBST([LTDLDEPS]) AC_SUBST([LTDLINCL]) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" AC_SUBST([INCLTDL]) ])# LTDL_INSTALLABLE # _LTDL_MODE_DISPATCH # ------------------- m4_define([_LTDL_MODE_DISPATCH], [dnl If _LTDL_DIR is `.', then we are configuring libltdl itself: m4_if(_LTDL_DIR, [], [], dnl if _LTDL_MODE was not set already, the default value is `subproject': [m4_case(m4_default(_LTDL_MODE, [subproject]), [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR) _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])], [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])], [recursive], [], [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl dnl Be careful not to expand twice: m4_define([$0], []) ])# _LTDL_MODE_DISPATCH # _LT_LIBOBJ(MODULE_NAME) # ----------------------- # Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead # of into LIBOBJS. AC_DEFUN([_LT_LIBOBJ], [ m4_pattern_allow([^_LT_LIBOBJS$]) _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" ])# _LT_LIBOBJS # LTDL_INIT([OPTIONS]) # -------------------- # Clients of libltdl can use this macro to allow the installer to # choose between a shipped copy of the ltdl sources or a preinstalled # version of the library. If the shipped ltdl sources are not in a # subdirectory named libltdl, the directory name must be given by # LT_CONFIG_LTDL_DIR. AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) dnl We need to keep our own list of libobjs separate from our parent project, dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while dnl we look for our own LIBOBJs. m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) m4_pushdef([AC_LIBSOURCES]) dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: m4_if(_LTDL_MODE, [], [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) AC_ARG_WITH([included_ltdl], [AS_HELP_STRING([--with-included-ltdl], [use the GNU ltdl sources included here])]) if test "x$with_included_ltdl" != xyes; then # We are not being forced to use the included libltdl sources, so # decide whether there is a useful installed version we can use. AC_CHECK_HEADER([ltdl.h], [AC_CHECK_DECL([lt_dlinterface_register], [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], [with_included_ltdl=no], [with_included_ltdl=yes])], [with_included_ltdl=yes], [AC_INCLUDES_DEFAULT #include ])], [with_included_ltdl=yes], [AC_INCLUDES_DEFAULT] ) fi dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE dnl was called yet, then for old times' sake, we assume libltdl is in an dnl eponymous directory: AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) AC_ARG_WITH([ltdl_include], [AS_HELP_STRING([--with-ltdl-include=DIR], [use the ltdl headers installed in DIR])]) if test -n "$with_ltdl_include"; then if test -f "$with_ltdl_include/ltdl.h"; then : else AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) fi else with_ltdl_include=no fi AC_ARG_WITH([ltdl_lib], [AS_HELP_STRING([--with-ltdl-lib=DIR], [use the libltdl.la installed in DIR])]) if test -n "$with_ltdl_lib"; then if test -f "$with_ltdl_lib/libltdl.la"; then : else AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) fi else with_ltdl_lib=no fi case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in ,yes,no,no,) m4_case(m4_default(_LTDL_TYPE, [convenience]), [convenience], [_LTDL_CONVENIENCE], [installable], [_LTDL_INSTALLABLE], [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) ;; ,no,no,no,) # If the included ltdl is not to be used, then use the # preinstalled libltdl we found. AC_DEFINE([HAVE_LTDL], [1], [Define this if a modern libltdl is already installed]) LIBLTDL=-lltdl LTDLDEPS= LTDLINCL= ;; ,no*,no,*) AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) ;; *) with_included_ltdl=no LIBLTDL="-L$with_ltdl_lib -lltdl" LTDLDEPS= LTDLINCL="-I$with_ltdl_include" ;; esac INCLTDL="$LTDLINCL" # Report our decision... AC_MSG_CHECKING([where to find libltdl headers]) AC_MSG_RESULT([$LTDLINCL]) AC_MSG_CHECKING([where to find libltdl library]) AC_MSG_RESULT([$LIBLTDL]) _LTDL_SETUP dnl restore autoconf definition. m4_popdef([AC_LIBOBJ]) m4_popdef([AC_LIBSOURCES]) AC_CONFIG_COMMANDS_PRE([ _ltdl_libobjs= _ltdl_ltlibobjs= if test -n "$_LT_LIBOBJS"; then # Remove the extension. _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" done fi AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) ]) # Only expand once: m4_define([LTDL_INIT]) ])# LTDL_INIT # Old names: AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIB_LTDL], []) dnl AC_DEFUN([AC_WITH_LTDL], []) dnl AC_DEFUN([LT_WITH_LTDL], []) # _LTDL_SETUP # ----------- # Perform all the checks necessary for compilation of the ltdl objects # -- including compiler checks and header checks. This is a public # interface mainly for the benefit of libltdl's own configure.ac, most # other users should call LTDL_INIT instead. AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_SYS_MODULE_EXT])dnl AC_REQUIRE([LT_SYS_MODULE_PATH])dnl AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl AC_REQUIRE([LT_LIB_DLLOAD])dnl AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl AC_REQUIRE([gl_FUNC_ARGZ])dnl m4_require([_LT_CHECK_OBJDIR])dnl m4_require([_LT_HEADER_DLFCN])dnl m4_require([_LT_CHECK_DLPREOPEN])dnl m4_require([_LT_DECL_SED])dnl dnl Don't require this, or it will be expanded earlier than the code dnl that sets the variables it relies on: _LT_ENABLE_INSTALL dnl _LTDL_MODE specific code must be called at least once: _LTDL_MODE_DISPATCH # In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS # the user used. This is so that ltdl.h can pick up the parent projects # config.h file, The first file in AC_CONFIG_HEADERS must contain the # definitions required by ltdl.c. # FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). AC_CONFIG_COMMANDS_PRE([dnl m4_pattern_allow([^LT_CONFIG_H$])dnl m4_ifset([AH_HEADER], [LT_CONFIG_H=AH_HEADER], [m4_ifset([AC_LIST_HEADERS], [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], [])])]) AC_SUBST([LT_CONFIG_H]) AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], [], [], [AC_INCLUDES_DEFAULT]) AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) m4_pattern_allow([LT_LIBEXT])dnl AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) name= eval "lt_libprefix=\"$libname_spec\"" m4_pattern_allow([LT_LIBPREFIX])dnl AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) name=ltdl eval "LTDLOPEN=\"$libname_spec\"" AC_SUBST([LTDLOPEN]) ])# _LTDL_SETUP # _LT_ENABLE_INSTALL # ------------------ m4_define([_LT_ENABLE_INSTALL], [AC_ARG_ENABLE([ltdl-install], [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])]) case ,${enable_ltdl_install},${enable_ltdl_convenience} in *yes*) ;; *) enable_ltdl_convenience=yes ;; esac m4_ifdef([AM_CONDITIONAL], [AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno) AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)]) ])# _LT_ENABLE_INSTALL # LT_SYS_DLOPEN_DEPLIBS # --------------------- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether deplibs are loaded by dlopen], [lt_cv_sys_dlopen_deplibs], [# PORTME does your system automatically load deplibs for dlopen? # or its logical equivalent (e.g. shl_load for HP-UX < 11) # For now, we just catch OSes we know something about -- in the # future, we'll try test this programmatically. lt_cv_sys_dlopen_deplibs=unknown case $host_os in aix3*|aix4.1.*|aix4.2.*) # Unknown whether this is true for these versions of AIX, but # we want this `case' here to explicitly catch those versions. lt_cv_sys_dlopen_deplibs=unknown ;; aix[[4-9]]*) lt_cv_sys_dlopen_deplibs=yes ;; amigaos*) case $host_cpu in powerpc) lt_cv_sys_dlopen_deplibs=no ;; esac ;; darwin*) # Assuming the user has installed a libdl from somewhere, this is true # If you are looking for one http://www.opendarwin.org/projects/dlcompat lt_cv_sys_dlopen_deplibs=yes ;; freebsd* | dragonfly*) lt_cv_sys_dlopen_deplibs=yes ;; gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) # GNU and its variants, using gnu ld.so (Glibc) lt_cv_sys_dlopen_deplibs=yes ;; hpux10*|hpux11*) lt_cv_sys_dlopen_deplibs=yes ;; interix*) lt_cv_sys_dlopen_deplibs=yes ;; irix[[12345]]*|irix6.[[01]]*) # Catch all versions of IRIX before 6.2, and indicate that we don't # know how it worked for any of those versions. lt_cv_sys_dlopen_deplibs=unknown ;; irix*) # The case above catches anything before 6.2, and it's known that # at 6.2 and later dlopen does load deplibs. lt_cv_sys_dlopen_deplibs=yes ;; netbsd* | netbsdelf*-gnu) lt_cv_sys_dlopen_deplibs=yes ;; openbsd*) lt_cv_sys_dlopen_deplibs=yes ;; osf[[1234]]*) # dlopen did load deplibs (at least at 4.x), but until the 5.x series, # it did *not* use an RPATH in a shared library to find objects the # library depends on, so we explicitly say `no'. lt_cv_sys_dlopen_deplibs=no ;; osf5.0|osf5.0a|osf5.1) # dlopen *does* load deplibs and with the right loader patch applied # it even uses RPATH in a shared library to search for shared objects # that the library depends on, but there's no easy way to know if that # patch is installed. Since this is the case, all we can really # say is unknown -- it depends on the patch being installed. If # it is, this changes to `yes'. Without it, it would be `no'. lt_cv_sys_dlopen_deplibs=unknown ;; osf*) # the two cases above should catch all versions of osf <= 5.1. Read # the comments above for what we know about them. # At > 5.1, deplibs are loaded *and* any RPATH in a shared library # is used to find them so we can finally say `yes'. lt_cv_sys_dlopen_deplibs=yes ;; qnx*) lt_cv_sys_dlopen_deplibs=yes ;; solaris*) lt_cv_sys_dlopen_deplibs=yes ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) libltdl_cv_sys_dlopen_deplibs=yes ;; esac ]) if test "$lt_cv_sys_dlopen_deplibs" != yes; then AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], [Define if the OS needs help to load dependent libraries for dlopen().]) fi ])# LT_SYS_DLOPEN_DEPLIBS # Old name: AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], []) # LT_SYS_MODULE_EXT # ----------------- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([which extension is used for runtime loadable modules], [libltdl_cv_shlibext], [ module=yes eval libltdl_cv_shlibext=$shrext_cmds module=no eval libltdl_cv_shrext=$shrext_cmds ]) if test -n "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_MODULE_EXT])dnl AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], [Define to the extension used for runtime loadable modules, say, ".so".]) fi if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then m4_pattern_allow([LT_SHARED_EXT])dnl AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], [Define to the shared library suffix, say, ".dylib".]) fi ])# LT_SYS_MODULE_EXT # Old name: AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SHLIBEXT], []) # LT_SYS_MODULE_PATH # ------------------ AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([which variable specifies run-time module search path], [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) if test -n "$lt_cv_module_path_var"; then m4_pattern_allow([LT_MODULE_PATH_VAR])dnl AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], [Define to the name of the environment variable that determines the run-time module search path.]) fi ])# LT_SYS_MODULE_PATH # Old name: AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SHLIBPATH], []) # LT_SYS_DLSEARCH_PATH # -------------------- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl AC_CACHE_CHECK([for the default library search path], [lt_cv_sys_dlsearch_path], [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) if test -n "$lt_cv_sys_dlsearch_path"; then sys_dlsearch_path= for dir in $lt_cv_sys_dlsearch_path; do if test -z "$sys_dlsearch_path"; then sys_dlsearch_path="$dir" else sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" fi done m4_pattern_allow([LT_DLSEARCH_PATH])dnl AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], [Define to the system default library search path.]) fi ])# LT_SYS_DLSEARCH_PATH # Old name: AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], []) # _LT_CHECK_DLPREOPEN # ------------------- m4_defun([_LT_CHECK_DLPREOPEN], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen], [libltdl_cv_preloaded_symbols], [if test -n "$lt_cv_sys_global_symbol_pipe"; then libltdl_cv_preloaded_symbols=yes else libltdl_cv_preloaded_symbols=no fi ]) if test x"$libltdl_cv_preloaded_symbols" = xyes; then AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1], [Define if libtool can extract symbol lists from object files.]) fi ])# _LT_CHECK_DLPREOPEN # LT_LIB_DLLOAD # ------------- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) LT_DLLOADERS= AC_SUBST([LT_DLLOADERS]) AC_LANG_PUSH([C]) LIBADD_DLOPEN= AC_SEARCH_LIBS([dlopen], [dl], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) if test "$ac_cv_search_dlopen" != "none required" ; then LIBADD_DLOPEN="-ldl" fi libltdl_cv_lib_dl_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H # include #endif ]], [[dlopen(0, 0);]])], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) libltdl_cv_func_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], [AC_CHECK_LIB([svld], [dlopen], [AC_DEFINE([HAVE_LIBDL], [1], [Define if you have the libdl library or equivalent.]) LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes then lt_save_LIBS="$LIBS" LIBS="$LIBS $LIBADD_DLOPEN" AC_CHECK_FUNCS([dlerror]) LIBS="$lt_save_LIBS" fi AC_SUBST([LIBADD_DLOPEN]) LIBADD_SHL_LOAD= AC_CHECK_FUNC([shl_load], [AC_DEFINE([HAVE_SHL_LOAD], [1], [Define if you have the shl_load function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], [AC_CHECK_LIB([dld], [shl_load], [AC_DEFINE([HAVE_SHL_LOAD], [1], [Define if you have the shl_load function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" LIBADD_SHL_LOAD="-ldld"])]) AC_SUBST([LIBADD_SHL_LOAD]) case $host_os in darwin[[1567]].*) # We only want this for pre-Mac OS X 10.4. AC_CHECK_FUNC([_dyld_func_lookup], [AC_DEFINE([HAVE_DYLD], [1], [Define if you have the _dyld_func_lookup function.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) ;; beos*) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" ;; cygwin* | mingw* | os2* | pw32*) AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" ;; esac AC_CHECK_LIB([dld], [dld_link], [AC_DEFINE([HAVE_DLD], [1], [Define if you have the GNU dld library.]) LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) AC_SUBST([LIBADD_DLD_LINK]) m4_pattern_allow([^LT_DLPREOPEN$]) LT_DLPREOPEN= if test -n "$LT_DLLOADERS" then for lt_loader in $LT_DLLOADERS; do LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " done AC_DEFINE([HAVE_LIBDLLOADER], [1], [Define if libdlloader will be built on this platform]) fi AC_SUBST([LT_DLPREOPEN]) dnl This isn't used anymore, but set it for backwards compatibility LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" AC_SUBST([LIBADD_DL]) AC_LANG_POP ])# LT_LIB_DLLOAD # Old name: AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_DLLIB], []) # LT_SYS_SYMBOL_USCORE # -------------------- # does the compiler prefix global symbols with an underscore? AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl AC_CACHE_CHECK([for _ prefix in compiled symbols], [lt_cv_sys_symbol_underscore], [lt_cv_sys_symbol_underscore=no cat > conftest.$ac_ext <<_LT_EOF void nm_test_func(){} int main(){nm_test_func;return 0;} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. ac_nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then # See whether the symbols have a leading underscore. if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then lt_cv_sys_symbol_underscore=yes else if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then : else echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD fi fi else echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.c >&AS_MESSAGE_LOG_FD fi rm -rf conftest* ]) sys_symbol_underscore=$lt_cv_sys_symbol_underscore AC_SUBST([sys_symbol_underscore]) ])# LT_SYS_SYMBOL_USCORE # Old name: AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], []) # LT_FUNC_DLSYM_USCORE # -------------------- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl if test x"$lt_cv_sys_symbol_underscore" = xyes; then if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then AC_CACHE_CHECK([whether we have to add an underscore for dlsym], [libltdl_cv_need_uscore], [libltdl_cv_need_uscore=unknown save_LIBS="$LIBS" LIBS="$LIBS $LIBADD_DLOPEN" _LT_TRY_DLOPEN_SELF( [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], [], [libltdl_cv_need_uscore=cross]) LIBS="$save_LIBS" ]) fi fi if test x"$libltdl_cv_need_uscore" = xyes; then AC_DEFINE([NEED_USCORE], [1], [Define if dlsym() requires a leading underscore in symbol names.]) fi ])# LT_FUNC_DLSYM_USCORE # Old name: AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], []) polyml-5.6/m4/ltoptions.m4000066400000000000000000000300731265146633400155320ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) polyml-5.6/m4/ltsugar.m4000066400000000000000000000104241265146633400151560ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) polyml-5.6/m4/ltversion.m4000066400000000000000000000012621265146633400155220ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) polyml-5.6/m4/lt~obsolete.m4000066400000000000000000000137561265146633400160620ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) polyml-5.6/m4/pkg.m4000066400000000000000000000130231265146633400142540ustar00rootroot00000000000000# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES polyml-5.6/missing000077500000000000000000000153301265146633400143130ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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 to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: polyml-5.6/mlsource/000077500000000000000000000000001265146633400145435ustar00rootroot00000000000000polyml-5.6/mlsource/BuildAll.sml000066400000000000000000000030621265146633400167510ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Script to rebuild the compiler. *) (* This is used only during testing. The normal build process uses BuildExport to export a newly compiled compiler and exportPoly to compile the basis and produce an object file. *) PolyML.print_depth 0; PolyML.use "basis/RuntimeCalls"; PolyML.make "mlsource/MLCompiler/Boot"; PolyML.make "mlsource/MLCompiler"; (* Compile the prelude and basis in the new compiler. *) MLCompiler.use "mlsource/BuildBasis.sml"; (* Use useString to start the new shell because it allows this to be pasted into a window as a single item. Otherwise the line to start the new shell will be in the buffer of the old TextIO.stdIn not the one we've just built. *) MLCompiler.useString "PolyML.rootFunction();"; polyml-5.6/mlsource/BuildBasis.sml000066400000000000000000000034201265146633400173000ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Install initial conversion functions. These can be replaced later on. *) val () = RunCall.addOverload Bootstrap.convString Bootstrap.convStringName; val () = RunCall.addOverload Bootstrap.convInt "convInt"; val () = RunCall.addOverload Bootstrap.convWord "convWord"; (* Build the main basis library. *) val () = Bootstrap.use "basis/build.sml"; (* We've now set up the new name space so everything has to be compiled into that rather than the old space. *) PolyML.make "mlsource/extra/CInterface"; PolyML.use "mlsource/extra/CInterface/clean"; (* XWindows/Motif *) let val xcall: int*int->int*int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows; (* See if the RTS supports the X GetTimeOfDay call. *) val isX = (xcall(30, 0); true) handle _ => false in if isX then ( PolyML.make "mlsource/extra/XWindows"; PolyML.make "mlsource/extra/Motif" ) else () end; PolyML.print_depth 10; polyml-5.6/mlsource/BuildExport.sml000066400000000000000000000024061265146633400175230ustar00rootroot00000000000000(* Copyright (c) 2006-10 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Compiler the compiler and export it as a portable file. The rest of the bootstrap process is then done when the portable file is imported. *) PolyML.print_depth 0; PolyML.use "basis/RuntimeCalls"; PolyML.make "mlsource/MLCompiler/Boot"; PolyML.make "mlsource/MLCompiler"; PolyML.shareCommonData MLCompiler.shell; PolyML.exportPortable("polytemp", fn () => (MLCompiler.shell(); OS.Process.exit OS.Process.success) handle _ => OS.Process.exit OS.Process.failure); polyml-5.6/mlsource/MLCompiler/000077500000000000000000000000001265146633400165465ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/Boot/000077500000000000000000000000001265146633400174515ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/Boot/Address.ML000066400000000000000000000456121265146633400213000ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further development copyright David C.J. Matthews 2000-2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* TODO: This duplicates some of the Word structure although it adds certain "unsafe" and Poly-specific functions. It probably should be rewritten now that we have the standard basis library. DCJM June 2000. *) signature AddressSig = sig type machineWord type address type handler type short = Word.word val stringOfWord: machineWord -> string val wordEq : 'a * 'a -> bool val isShort : machineWord -> bool exception Cast of string val toMachineWord: 'a -> machineWord val toShort: machineWord -> Word.word val toAddress: machineWord -> address val loadByte: (address * Word.word) -> Word8.word val loadWord: (address * Word.word) -> machineWord val assignByte: (address * Word.word * Word8.word) -> unit val assignWord: (address * Word.word * machineWord) -> unit val alloc: (short * Word8.word * machineWord) -> address val maxAllocation: word val lock: address -> unit val length: address -> short val flags: address -> Word8.word val setFlags: address * Word8.word -> unit val getFlags: address -> Word8.word val wordSize: int val F_words : Word8.word val F_bytes : Word8.word val F_code : Word8.word val F_negative : Word8.word val F_mutable : Word8.word val F_gc : Word8.word val F_noOverwrite : Word8.word val F_weak : Word8.word val F_profile : Word8.word val isWords : address -> bool val isBytes : address -> bool val isCode : address -> bool val isMutable:address -> bool val call: (address * machineWord) -> machineWord val isIoAddress : address -> bool (* The following function is VERY unsafe and should only be used by the Poly/ML code generator *) val offsetAddr : address * short -> handler end structure Address :> AddressSig = struct type machineWord = word (* a legal ML object (tag = 0 or 1) *) and address = word (* a normal pointer (tag = 0) *) and handler = word (* pointer to exception handler (tag = 2!) *) and short = word (* a 31/63-bit int (tag = 1) *) open RuntimeCalls (* pointer equality *) val wordEq = PolyML.pointerEq val unsafeCast : 'a -> 'b = RunCall.unsafeCast val isShort : machineWord->bool = RunCall.run_call1 POLY_SYS_is_short (* The following cast is always safe *) val toMachineWord : 'a -> machineWord = unsafeCast (* The following casts need checking *) exception Cast of string fun toAddress (w: machineWord) : address = if isShort w then raise Cast "toAddress" else unsafeCast w fun toShort (w: machineWord) : Word.word = if isShort w then unsafeCast w else raise Cast "toShort" (* Note: assignByte should *not* be used with word-objects (we might copy half a pointer into the object, then call the garbage collector) loadWord should *not* be used with byte-objects (we might load something that's not a valid ML value, then call the garbage collector) Violating these assertions may corrupt the heap and cause unpredictable behaviour. It's safe to use assignWord with a byte-object or loadByte with a word-object but it may not do what you expect. One difference is that loadWord / assignWord leave the tag bits unchanged but loadByte / assignByte strip and replace them. Another difference is that the offset for the "Word" functions is in words, whereas the offset for the "Byte" functions is in bytes. *) val loadByte: (address * Word.word) -> Word8.word = RunCall.run_call2 POLY_SYS_load_byte val loadWord: (address * Word.word) -> machineWord = RunCall.run_call2 POLY_SYS_load_word val assignByte: (address * Word.word * Word8.word) -> unit = RunCall.run_call3 POLY_SYS_assign_byte val assignWord: (address * Word.word * machineWord) -> unit = RunCall.run_call3 POLY_SYS_assign_word val maxAllocation: word = RunCall.run_call2 POLY_SYS_process_env(100, ()) fun alloc(len: word, flags: Word8.word, initial: machineWord): address = (* Zero sized-objects are not allowed. Check that the size is within the acceptable range. *) if len = 0w0 orelse len >= maxAllocation then raise Size else RunCall.run_call3 POLY_SYS_alloc_store(len, flags, initial) val lock: address -> unit = RunCall.run_call1 POLY_SYS_lockseg val getFlags: address -> Word8.word = RunCall.run_call1 POLY_SYS_get_flags val setFlags: address * Word8.word -> unit = RunCall.run_call2 POLY_SYS_code_flags val wordSize: int = RunCall.run_call0 POLY_SYS_bytes_per_word () val length: address -> Word.word = RunCall.run_call1 POLY_SYS_get_length val flags: address -> Word8.word = RunCall.run_call1 POLY_SYS_get_flags (* "call" added SPF 7/7/94, corrected 13/7/94, 8/9/94 *) (* call takes the address of the code of a function [N.B. *NOT* *) (* the closure for the function] that uses Poly parameter *) (* conventions (values in registers e.g. an ML secondary entry *) (* point) and applies it to the address of a single ML tuple. *) (* N.B. it MUST be a tuple, even if there's only one parameter. *) (* However, since unit is a "short" not an "address", the type *) (* of the second parameter has to be "word" (not "address"). *) (* The run-time system functions all use Poly convention. *) val call: (address * machineWord) -> machineWord = RunCall.run_call1 POLY_SYS_callcode_tupled val F_words : Word8.word = 0wx00 (* word object - contains pointers and/or tagged values. *) val F_bytes : Word8.word = 0wx01 (* byte object (contains no pointers) *) val F_code : Word8.word = 0wx02 (* code object (mixed bytes and words) *) val F_noOverwrite : Word8.word = 0wx08 (* don't overwrite when loading - mutables only. *) val F_negative : Word8.word = 0wx10 (* sign bit for arbitrary precision ints (byte objects) *) val F_profile : Word8.word = 0wx10 (* object has a profile pointer (word objects) *) val F_weak : Word8.word = 0wx20 (* object contains weak references to option values. *) val F_mutable : Word8.word = 0wx40 (* object is mutable *) val F_gc : Word8.word = 0wx80 (* object is (pointer or depth) tombstone *) local val doCall: int*address -> bool = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in fun isIoAddress (a: address) : bool = doCall(102, a) end (* The following function is VERY unsafe and should only be *) (* used by the Poly/ML code generator (ML version). *) val offsetAddr : address * short -> handler = RunCall.run_call2 POLY_SYS_offset_address local val typeMask : Word8.word = 0wx03 fun isType (t: Word8.word) (a: address):bool = Word8.andb(flags a, typeMask) = t in val isWords = isType F_words val isBytes = isType F_bytes val isCode = isType F_code (* The mutable flag may be used with any of the others. *) fun isMutable a = Word8.andb(flags a, F_mutable) = F_mutable end local val rtsTable = [ (POLY_SYS_exit,"POLY_SYS_exit"), (POLY_SYS_chdir,"POLY_SYS_chdir"), (POLY_SYS_alloc_store,"POLY_SYS_alloc_store"), (POLY_SYS_alloc_uninit,"POLY_SYS_alloc_uninit"), (POLY_SYS_raisex,"POLY_SYS_raisex"), (POLY_SYS_get_length,"POLY_SYS_get_length"), (POLY_SYS_get_flags,"POLY_SYS_get_flags"), (POLY_SYS_str_compare,"POLY_SYS_str_compare"), (POLY_SYS_teststrgtr,"POLY_SYS_teststrgtr"), (POLY_SYS_teststrlss,"POLY_SYS_teststrlss"), (POLY_SYS_teststrgeq,"POLY_SYS_teststrgeq"), (POLY_SYS_teststrleq,"POLY_SYS_teststrleq"), (POLY_SYS_exception_trace,"POLY_SYS_exception_trace"), (POLY_SYS_give_ex_trace,"POLY_SYS_give_ex_trace"), (POLY_SYS_exception_trace_fn,"POLY_SYS_exception_trace_fn"), (POLY_SYS_give_ex_trace_fn,"POLY_SYS_give_ex_trace_fn"), (POLY_SYS_lockseg,"POLY_SYS_lockseg"), (POLY_SYS_emptystring,"POLY_SYS_emptystring"), (POLY_SYS_nullvector,"POLY_SYS_nullvector"), (POLY_SYS_network,"POLY_SYS_network"), (POLY_SYS_os_specific,"POLY_SYS_os_specific"), (POLY_SYS_eq_longword,"POLY_SYS_eq_longword"), (POLY_SYS_neq_longword,"POLY_SYS_neq_longword"), (POLY_SYS_geq_longword,"POLY_SYS_geq_longword"), (POLY_SYS_leq_longword,"POLY_SYS_leq_longword"), (POLY_SYS_gt_longword,"POLY_SYS_gt_longword"), (POLY_SYS_lt_longword,"POLY_SYS_lt_longword"), (POLY_SYS_io_dispatch,"POLY_SYS_io_dispatch"), (POLY_SYS_signal_handler,"POLY_SYS_signal_handler"), (POLY_SYS_atomic_reset,"POLY_SYS_atomic_reset"), (POLY_SYS_atomic_incr,"POLY_SYS_atomic_incr"), (POLY_SYS_atomic_decr,"POLY_SYS_atomic_decr"), (POLY_SYS_thread_self,"POLY_SYS_thread_self"), (POLY_SYS_thread_dispatch,"POLY_SYS_thread_dispatch"), (POLY_SYS_plus_longword,"POLY_SYS_plus_longword"), (POLY_SYS_minus_longword,"POLY_SYS_minus_longword"), (POLY_SYS_mul_longword,"POLY_SYS_mul_longword"), (POLY_SYS_div_longword,"POLY_SYS_div_longword"), (POLY_SYS_mod_longword,"POLY_SYS_mod_longword"), (POLY_SYS_andb_longword,"POLY_SYS_andb_longword"), (POLY_SYS_orb_longword,"POLY_SYS_orb_longword"), (POLY_SYS_xorb_longword,"POLY_SYS_xorb_longword"), (POLY_SYS_kill_self,"POLY_SYS_kill_self"), (POLY_SYS_shift_left_longword,"POLY_SYS_shift_left_longword"), (POLY_SYS_shift_right_longword,"POLY_SYS_shift_right_longword"), (POLY_SYS_shift_right_arith_longword,"POLY_SYS_shift_right_arith_longword"), (POLY_SYS_longword_to_tagged,"POLY_SYS_longword_to_tagged"), (POLY_SYS_signed_to_longword,"POLY_SYS_signed_to_longword"), (POLY_SYS_unsigned_to_longword,"POLY_SYS_unsigned_to_longword"), (POLY_SYS_profiler,"POLY_SYS_profiler"), (POLY_SYS_full_gc,"POLY_SYS_full_gc"), (POLY_SYS_stack_trace,"POLY_SYS_stack_trace"), (POLY_SYS_timing_dispatch,"POLY_SYS_timing_dispatch"), (POLY_SYS_objsize,"POLY_SYS_objsize"), (POLY_SYS_showsize,"POLY_SYS_showsize"), (POLY_SYS_quotrem,"POLY_SYS_quotrem"), (POLY_SYS_is_short,"POLY_SYS_is_short"), (POLY_SYS_aplus,"POLY_SYS_aplus"), (POLY_SYS_aminus,"POLY_SYS_aminus"), (POLY_SYS_amul,"POLY_SYS_amul"), (POLY_SYS_adiv,"POLY_SYS_adiv"), (POLY_SYS_amod,"POLY_SYS_amod"), (POLY_SYS_aneg,"POLY_SYS_aneg"), (POLY_SYS_xora,"POLY_SYS_xora"), (POLY_SYS_equala,"POLY_SYS_equala"), (POLY_SYS_ora,"POLY_SYS_ora"), (POLY_SYS_anda,"POLY_SYS_anda"), (POLY_SYS_Real_str,"POLY_SYS_Real_str"), (POLY_SYS_Real_geq,"POLY_SYS_Real_geq"), (POLY_SYS_Real_leq,"POLY_SYS_Real_leq"), (POLY_SYS_Real_gtr,"POLY_SYS_Real_gtr"), (POLY_SYS_Real_lss,"POLY_SYS_Real_lss"), (POLY_SYS_Real_eq,"POLY_SYS_Real_eq"), (POLY_SYS_Real_neq,"POLY_SYS_Real_neq"), (POLY_SYS_Real_Dispatch,"POLY_SYS_Real_Dispatch"), (POLY_SYS_Add_real,"POLY_SYS_Add_real"), (POLY_SYS_Sub_real,"POLY_SYS_Sub_real"), (POLY_SYS_Mul_real,"POLY_SYS_Mul_real"), (POLY_SYS_Div_real,"POLY_SYS_Div_real"), (POLY_SYS_Abs_real,"POLY_SYS_Abs_real"), (POLY_SYS_Neg_real,"POLY_SYS_Neg_real"), (POLY_SYS_conv_real,"POLY_SYS_conv_real"), (POLY_SYS_real_to_int,"POLY_SYS_real_to_int"), (POLY_SYS_int_to_real,"POLY_SYS_int_to_real"), (POLY_SYS_sqrt_real,"POLY_SYS_sqrt_real"), (POLY_SYS_sin_real,"POLY_SYS_sin_real"), (POLY_SYS_cos_real,"POLY_SYS_cos_real"), (POLY_SYS_arctan_real,"POLY_SYS_arctan_real"), (POLY_SYS_exp_real,"POLY_SYS_exp_real"), (POLY_SYS_ln_real,"POLY_SYS_ln_real"), (POLY_SYS_stdin,"POLY_SYS_stdin"), (POLY_SYS_stdout,"POLY_SYS_stdout"), (POLY_SYS_process_env,"POLY_SYS_process_env"), (POLY_SYS_set_string_length,"POLY_SYS_set_string_length"), (POLY_SYS_get_first_long_word,"POLY_SYS_get_first_long_word"), (POLY_SYS_poly_specific,"POLY_SYS_poly_specific"), (POLY_SYS_bytevec_eq,"POLY_SYS_bytevec_eq"), (POLY_SYS_cmem_load_8,"POLY_SYS_cmem_load_8"), (POLY_SYS_cmem_load_16, "POLY_SYS_cmem_load_16"), (POLY_SYS_cmem_load_32,"POLY_SYS_cmem_load_32"), (POLY_SYS_cmem_load_64,"POLY_SYS_cmem_load_64"), (POLY_SYS_cmem_load_float,"POLY_SYS_cmem_load_float"), (POLY_SYS_cmem_load_double, "POLY_SYS_cmem_load_double"), (POLY_SYS_cmem_store_8, "POLY_SYS_cmem_store_8"), (POLY_SYS_cmem_store_16, "POLY_SYS_cmem_store_16"), (POLY_SYS_cmem_store_32, "POLY_SYS_cmem_store_32"), (POLY_SYS_cmem_store_64, "POLY_SYS_cmem_store_64"), (POLY_SYS_cmem_store_float, "POLY_SYS_cmem_store_float"), (POLY_SYS_cmem_store_double, "POLY_SYS_cmem_store_double"), (POLY_SYS_io_operation,"POLY_SYS_io_operation"), (POLY_SYS_ffi, "POLY_SYS_ffi"), (POLY_SYS_set_code_constant,"POLY_SYS_set_code_constant"), (POLY_SYS_move_words,"POLY_SYS_move_words"), (POLY_SYS_shift_right_arith_word,"POLY_SYS_shift_right_arith_word"), (POLY_SYS_move_bytes,"POLY_SYS_move_bytes"), (POLY_SYS_code_flags,"POLY_SYS_code_flags"), (POLY_SYS_shrink_stack,"POLY_SYS_shrink_stack"), (POLY_SYS_stderr,"POLY_SYS_stderr"), (POLY_SYS_callcode_tupled,"POLY_SYS_callcode_tupled"), (POLY_SYS_foreign_dispatch,"POLY_SYS_foreign_dispatch"), (POLY_SYS_XWindows,"POLY_SYS_XWindows"), (POLY_SYS_is_big_endian,"POLY_SYS_is_big_endian"), (POLY_SYS_bytes_per_word,"POLY_SYS_bytes_per_word"), (POLY_SYS_offset_address,"POLY_SYS_offset_address"), (POLY_SYS_shift_right_word,"POLY_SYS_shift_right_word"), (POLY_SYS_word_neq,"POLY_SYS_word_neq"), (POLY_SYS_not_bool,"POLY_SYS_not_bool"), (POLY_SYS_string_length,"POLY_SYS_string_length"), (POLY_SYS_touch_final, "POLY_SYS_touch_final"), (POLY_SYS_int_geq,"POLY_SYS_int_geq"), (POLY_SYS_int_leq,"POLY_SYS_int_leq"), (POLY_SYS_int_gtr,"POLY_SYS_int_gtr"), (POLY_SYS_int_lss,"POLY_SYS_int_lss"), (POLY_SYS_load_byte_immut,"POLY_SYS_load_byte_immut"), (POLY_SYS_load_word_immut,"POLY_SYS_load_word_immut"), (POLY_SYS_mul_word,"POLY_SYS_mul_word"), (POLY_SYS_plus_word,"POLY_SYS_plus_word"), (POLY_SYS_minus_word,"POLY_SYS_minus_word"), (POLY_SYS_div_word,"POLY_SYS_div_word"), (POLY_SYS_or_word,"POLY_SYS_or_word"), (POLY_SYS_and_word,"POLY_SYS_and_word"), (POLY_SYS_xor_word,"POLY_SYS_xor_word"), (POLY_SYS_shift_left_word,"POLY_SYS_shift_left_word"), (POLY_SYS_mod_word,"POLY_SYS_mod_word"), (POLY_SYS_word_geq,"POLY_SYS_word_geq"), (POLY_SYS_word_leq,"POLY_SYS_word_leq"), (POLY_SYS_word_gtr,"POLY_SYS_word_gtr"), (POLY_SYS_word_lss,"POLY_SYS_word_lss"), (POLY_SYS_word_eq,"POLY_SYS_word_eq"), (POLY_SYS_load_byte,"POLY_SYS_load_byte"), (POLY_SYS_load_word,"POLY_SYS_load_word"), (POLY_SYS_assign_byte,"POLY_SYS_assign_byte"), (POLY_SYS_assign_word,"POLY_SYS_assign_word") ] in val rtsNames = Vector.tabulate(256, fn n => case List.find(fn (rtsNo, _) => rtsNo=n) rtsTable of SOME(_, name) => name | _ => " RTS" ^ Int.toString n) end local val doCall: int*machineWord -> string = RunCall.run_call2 RuntimeCalls.POLY_SYS_process_env in fun functionName w = doCall(105, w) end fun stringOfWord w = if isShort w then "LIT" ^ Word.toString (unsafeCast w) else let val v = toAddress w in if isIoAddress v then (* RTS call - print the number. *) let val ioOp : int -> machineWord = RunCall.run_call1 RuntimeCalls.POLY_SYS_io_operation fun matchIo n = if n = 256 then raise Fail "Unknown RTS entry" else if wordEq (w, ioOp n) then Vector.sub(rtsNames, n) else matchIo (n+1) in matchIo 0 end else if isCode v then "CODE \"" ^ functionName w ^ "\"" else if isBytes v then let val length = Int.min(Word.toInt(length v) * wordSize, 16) val data = Word8Vector.tabulate(length, fn n => loadByte(v, Word.fromInt n)) in "BYTE data" ^ String.toString(Byte.bytesToString data) end else if isWords(toAddress w) andalso Word.toInt(length(toAddress w)) >= 1 then (* If it's the closure of a function try to print that. *) let val firstWord = loadWord(toAddress w, 0w0) in if not (isShort firstWord) andalso isCode(toAddress firstWord) then "FUN \"" ^ functionName firstWord ^ "\"" (* Get the function name. *) else "LIT " end else "LIT " end end; (* Add a print function for machineWord. This is really only for the debugger but prevents addresses being printed as Word.word values. *) local open PolyML Address fun printMachineWord _ _ w = PrettyString(stringOfWord w) in val () = addPrettyPrinter printMachineWord end; polyml-5.6/mlsource/MLCompiler/Boot/HashTable.ML000066400000000000000000000170421265146633400215420ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Hash table type - Creates a hash table of specified initial size. This version expands the hash table and rehashes when the table gets too full *) structure HashTable: (*****************************************************************************) (* HashTable export signature *) (*****************************************************************************) sig type 'a hash val hashMake: int -> 'a hash val hashSet: 'a hash * string * 'a -> unit val hashSub: 'a hash * string -> 'a option val fold: (string * 'a * 'b -> 'b) -> 'b -> 'a hash -> 'b (* Construct an immutable hash table from a mutable one. *) val hashFreeze: 'a hash -> 'a hash end = (*****************************************************************************) (* HashTable structure body *) (*****************************************************************************) struct exception InternalError = Misc.InternalError infix 8 sub (* Each entry in the table is a pair containing the key and the value. *) (* make namedOption local, because that means the new compiler can optimise its representation. SPF 11/5/95 *) datatype 'a namedOption = None | Some of (string * 'a); fun hashValue (N : int) (str: string) : int = Word.toInt( Word.mod( CharVector.foldr (fn (ch: char, n: Word.word) => Word.fromInt(Char.ord ch) + 0w7*n) 0w0 str, (Word.fromInt N))) (* The above function is the quickest and simplest way of computing the hash value now that we have Word.* and Word.mod compiled inline. They aren't implemented in all code-generators so it could be worth retaining the old code. DCJM 26/2/01. *) datatype 'a hash = Hash of { used: int ref, entries: 'a namedOption array ref, hash: (string -> int) ref } | Frozen of { entries: 'a namedOption vector, hash: (string -> int) }; fun hashMake (n : int) = Hash { used = ref 0, entries = ref (Array.array (n, None)), hash = ref (hashValue n) } handle Size => raise InternalError ("HashTable.hash: " ^ Int.toString n); fun hashSub (Hash {entries = ref A, hash = ref hashN, ...}, name : string) : 'a option = (* Searches the table starting from the position given by the hash value. *) let open Array (* Loops until it either finds an empty entry - in which case it returns NONE, or it finds the name it is looking for. There will always be several empty entries because we rehash if it gets too full. *) fun find i = let val h = A sub i; in case h of None => NONE | Some (n,v) => if name = n then SOME v else find ((if i = 0 then length A else i) - 1) end in find (hashN name) end | hashSub (Frozen {entries = V, hash = hashN, ...}, name : string) : 'a option = let open Vector fun find i = let val h = V sub i; in case h of None => NONE | Some (n,v) => if name = n then SOME v else find ((if i = 0 then length V else i) - 1) end in find (hashN name) end fun hashSet (Frozen _, name : string, _ : 'a) : unit = raise Fail ("Attempt to set a value with name (" ^ name ^ ") in a frozen hash table") | hashSet (Hash {entries, used, hash}, name : string, value : 'a) = let open Array (* Enters the value at the first free entry at or after the one pointed to by the hash value. *) fun enterTab (_ : 'a namedOption array, _ : int, None : 'a namedOption) = () | enterTab (A, i, entry as Some (name,_)) = let fun enter (i : int) : unit = (* Loops until it either finds an empty entry - in which case it enters the value in there, or it finds the string. *) case (A sub i) of None => update (A, i, entry) | Some (n : string, _) => if n = name then update (A, i, entry) (* Same name as previous - overwrite it *) else enter ((if i = 0 then length A else i) - 1); in enter i end val A : 'a namedOption array = !entries; val N : int = length A; val hashN : string -> int = !hash val () = enterTab (A, hashN name, Some (name, value)); val () = used := !used + 1; in (* Do we need to rehash ? *) if !used * 5 > N * 4 (* More than 80% full so rehash *) then let val newN : int = N * 2; (* Double the size *) val newA : 'a namedOption array = array (newN, None); val hashNewN : string -> int = hashValue newN; fun copyOver (index : int) : unit = if index < 0 then () else ( case (A sub index) of None => () | entry as Some (name : string,_) => enterTab (newA, hashNewN name, entry); copyOver (index - 1) ); val () = entries := newA; val () = hash := hashNewN; in copyOver (length A - 1) end else () end; (* Fold a function over each of the items in the table. *) fun fold f acc table = let val (length, getItem) = case table of Hash { entries = ref e, ...} => (Array.length e, fn i => Array.sub(e, i)) | Frozen { entries, ... } => (Vector.length entries, fn i => Vector.sub(entries, i)) fun foldF i acc = if i >= length then acc (* End of table. *) else let val next = case getItem i of None => acc | Some (name, alpha) => f (name, alpha, acc) in foldF (i+1) next end in foldF 0 acc end (* If this is a mutable hash table create an immutable one from it. The reason for this is to reduce the number of mutables stored. TODO: Possible change the size of the table rather than simply copy it. *) fun hashFreeze (Hash{entries = ref e, hash = ref hashN, ...}) = Frozen{ entries = Array.vector e, hash = hashN } | hashFreeze h = h end (* HashTable *); polyml-5.6/mlsource/MLCompiler/Boot/Misc.ML000066400000000000000000000076301265146633400206040ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Misc : (*****************************************************************************) (* Misc exports signature *) (*****************************************************************************) sig (* standard exceptions used by the compiler *) exception Interrupt; (* These are handled in the compiler *) exception Conversion of string; (* string to int conversion failure *) (* This isn't handled at all (except generically) *) exception InternalError of string; (* compiler error *) val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list val unescapeString : string -> string val lookupDefault : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option end = (*****************************************************************************) (* Misc structure body *) (*****************************************************************************) struct exception Interrupt = SML90.Interrupt; (* These are handled in the compiler *) (* Conversion may be also raised by run-time Conversion routines *) exception Conversion = RunCall.Conversion (* This isn't handled at all (except generically) *) exception InternalError of string; (* compiler error *) (* Simple definition of quicksort. This is fairly efficient on time but is very bad for memory allocation and is only suitable for small cases. The call to List.partition builds O(N.log N) cells, if the list is random or O(N.N) if it is already sorted. It has been improved from the original which used append (@) to build the sorted list which added a second O(N.N) phase. *) fun quickSort (leq: 'a -> 'a -> bool) (l: 'a list) = let fun qs ([], tail) = tail | qs ([h], tail) = h :: tail | qs (h::t, tail) = let val (after, befor) = List.partition (leq h) t in qs(befor, h :: qs(after, tail)) end in qs(l, []) end (* Convert a string, recognising and converting escape codes. This is installed as the initial string conversion function and replaced when the String structure is compiled. We can't use fromString because it stops on invalid input and returns as much as it can rather than raising an exception. *) fun unescapeString(s: string) : string = let val len = size s fun rdr i = if i = len then NONE else SOME(String.sub(s, i), i+1) (* Repeatedly convert escape sequences and accumulate the results in a list. *) fun convChars i = if i = len then [] (* Finished *) else case Char.scan rdr i of NONE => (* Bad conversion *) raise Conversion "Invalid string constant" | SOME(res, j) => res :: convChars j in String.implode(convChars 0) end fun lookupDefault first second = (fn key => case first key of NONE => second key | v => v); end (* Misc *); polyml-5.6/mlsource/MLCompiler/Boot/StretchArray.ML000066400000000000000000000113261265146633400223210ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: StretchArray.ML Author: Simon Finn, Abstract Hardware Ltd. *) (* Version of array which expands as new elements are assigned. Used for tables which have no obvious upper limit. This is used in CODETREE and the resulting tables are captured in the environments of the resulting values. Previously this resulted in a lot of mutable data being kept around and in particularly ending up in exported module. The garbage collector has to scan mutables on every collection so mutable data can have a disproportionate effect on performance. We now freeze the tables once they have been created. This costs extra time during compilation but that should be more than made up for by faster garbage collection. *) structure StretchArray : sig type 'a stretchArray; exception Subscript; exception Size; val stretchArray : int * 'a -> 'a stretchArray; val update : 'a stretchArray * int * 'a -> unit; val length : 'a stretchArray -> int; val sub : 'a stretchArray * int -> 'a; val freeze : 'a stretchArray -> unit val vector: 'a stretchArray -> 'a vector end = struct val expansionFactor = 3; (* Factor by which to increase size. *) exception Subscript = (*Array.*)Subscript and Size = (*Array.*)Size; (* use Array to hold the contents - less efficient than making this a primitive, but does it matter? *) datatype 'a vecOrArray = AnArray of 'a array | AVector of 'a vector type 'a stretchArray = { initialVal : 'a, contents : 'a vecOrArray ref } fun stretchArray (originalSize: int, initialVal: 'a) :'a stretchArray = { initialVal = initialVal, contents = ref (AnArray(Array.array(originalSize, initialVal))) }; fun length { contents = ref (AnArray a), ...} = Array.length a | length { contents = ref (AVector v), ...} = Vector.length v (* Returns the value if there is one, otherwise returns the default. *) infix 9 sub; fun ({contents = ref (AnArray a), initialVal, ...} :'a stretchArray) sub index : 'a = if index < Array.length a then Array.sub (a, index) (* may raise Subscript *) else initialVal | ({contents = ref (AVector v), initialVal, ...} :'a stretchArray) sub index : 'a = if index < Vector.length v then Vector.sub (v, index) (* may raise Subscript *) else initialVal (* Sets the appropriate entry. *) fun update ({contents = ref (AVector _), ...}, _, _) = raise Fail "Attempt to update a locked stretchArray" | update ({contents = contents as ref (AnArray a), initialVal, ... }: 'a stretchArray, index: int, value: 'a) : unit = if index < Array.length a then Array.update (a, index, value) (* May raise Subscript if the index is -ve *) else let (* The new vector must be big enough to hold the new item and expanded by the expansion factor. *) val oldSize = Array.length a; val newSize = Int.max (oldSize * expansionFactor, index + 1); val newVec = Array.array(newSize, initialVal); in Array.copy{src=a, dst=newVec, di=0}; contents := AnArray newVec; Array.update (newVec, index, value) end (* Create an immutable vector from the current contents of the array. *) fun vector ({contents = ref (AnArray a), ...}: 'a stretchArray): 'a vector = Array.vector a | vector {contents = ref (AVector v), ...} = v (* Turn an array into a vector and turn the ref into an immutable. *) fun freeze {contents = ref (AVector _), ...} = () | freeze {contents = contents as ref (AnArray a), ...} = ( contents := AVector(Array.vector a); Address.lock(Address.toAddress(Address.toMachineWord contents)) ) end; polyml-5.6/mlsource/MLCompiler/Boot/UniversalTable.ML000066400000000000000000000063271265146633400226330ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure UniversalTable : sig type universal; type 'a tag; type univTable; val makeUnivTable: unit -> univTable; val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; val univDelete: univTable * 'a tag * string -> unit; val fold: (string * universal * 'a -> 'a) -> 'a -> univTable -> 'a val app: (string * universal -> unit) -> univTable -> unit val univFold: univTable * (string * universal * 'a -> 'a) * 'a -> 'a (* Freeze a mutable table so it is immutable. *) val univFreeze: univTable -> univTable end = struct open Misc; open HashTable; open Universal; type universal = universal datatype univTable = Table of universal list hash fun makeUnivTable() = Table (hashMake 10); (* Choose a number. *) fun univLookup (Table tab, t:'a tag, name:string) : 'a option = let fun search [] = NONE | search (H::T) = if tagIs t H then SOME (tagProject t H) else search T; in case hashSub (tab, name) of NONE => NONE | SOME t => search t end fun univEnter (Table tab, t:'a tag, name:string, v:'a) : unit = let val u = tagInject t v; (* If there is already an entry we add it to the list, otherwise we start a new list. *) fun search [] = [u] | search (H::T) = if tagIs t H then u :: T else H :: search T; val newList = case hashSub (tab, name) of SOME v => search v | NONE => [u] in hashSet (tab, name, newList) end; fun univDelete (Table tab, t:'a tag, name:string) : unit = let fun search [] = [] | search (H::T) = if tagIs t H then T else H :: search T; in case hashSub (tab, name) of SOME l => hashSet (tab, name, search l) | NONE => () end; fun fold f acc (Table table) = let fun foldHashEntry (s, l, acc) = List.foldl (fn (c, a) => f (s, c, a)) acc l in HashTable.fold foldHashEntry acc table end fun app f = fold (fn (s, c, ()) => f (s, c)) () (* Backwards compatibility. *) fun univFold (t, f, acc) = fold f acc t fun univFreeze (Table h) = Table(hashFreeze h) end (* UniversalTable *); polyml-5.6/mlsource/MLCompiler/Boot/ml_bind.ML000066400000000000000000000020501265146633400213040ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Boot = struct structure Address = Address structure Misc = Misc structure HashTable = HashTable structure UniversalTable = UniversalTable structure StretchArray = StretchArray end; polyml-5.6/mlsource/MLCompiler/CODETREESIG.ML000066400000000000000000000110031265146633400205300ustar00rootroot00000000000000(* Copyright (c) 2012,13,15 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CODETREESIG = sig type machineWord type codetree type pretty type codeBinding type level datatype argumentType = GeneralType | FloatingPtType val CodeTrue: codetree; (* code for "true" *) val CodeFalse: codetree; (* code for "false" *) val CodeZero: codetree; (* code for 0, nil etc. *) val mkFunction: { body: codetree, argTypes:argumentType list, resultType: argumentType, name: string, closure: codetree list, numLocals: int } -> codetree val mkInlineFunction: { body: codetree, argTypes:argumentType list, resultType: argumentType, name: string, closure: codetree list, numLocals: int } -> codetree val mkCall: codetree * (codetree * argumentType) list * argumentType -> codetree val mkLoadLocal: int -> codetree and mkLoadArgument: int -> codetree and mkLoadClosure: int -> codetree val mkConst: machineWord -> codetree; val mkInd: int * codetree -> codetree val mkVarField: int * codetree -> codetree val mkProc: codetree * int * string * codetree list * int -> codetree; val mkInlproc: codetree * int * string * codetree list * int -> codetree; val mkMacroProc: codetree * int * string * codetree list * int -> codetree; val mkIf: codetree * codetree * codetree -> codetree; val mkWhile: codetree * codetree -> codetree; val mkEnv: codeBinding list * codetree -> codetree val mkStr: string -> codetree; val mkTuple: codetree list -> codetree; val mkDatatype: codetree list -> codetree val mkRaise: codetree -> codetree; val mkNot: codetree -> codetree; val mkCor: codetree * codetree -> codetree; val mkCand: codetree * codetree -> codetree; val mkTestptreq: codetree * codetree -> codetree; val mkTestinteq: codetree * codetree -> codetree; val mkHandle: codetree * codetree -> codetree val mkEval: codetree * codetree list -> codetree; val identityFunction: string -> codetree; val Ldexc: codetree; val mkSetContainer: codetree * codetree * int -> codetree val mkTupleFromContainer: int * int -> codetree val mkTagTest: codetree * word * word -> codetree val mkBeginLoop: codetree * (int * codetree) list -> codetree val mkLoop: codetree list -> codetree val mkDec: int * codetree -> codeBinding val mkMutualDecs: (int * codetree) list -> codeBinding val mkNullDec: codetree -> codeBinding val mkContainer: int * int * codetree -> codeBinding val decSequenceWithFinalExp: codeBinding list -> codetree val pretty: codetree -> pretty; val evalue: codetree -> machineWord option val genCode: codetree * Universal.universal list * int -> (unit -> codetree); val rtsFunction: int -> codetree (* Helper functions to build closure. *) val mkLoad: int * level * level -> codetree and mkLoadParam: int * level * level -> codetree val baseLevel: level val newLevel: level -> level val getClosure: level -> codetree list val multipleUses: codetree * (unit -> int) * level -> {load: level -> codetree, dec: codeBinding list} structure Sharing: sig type machineWord = machineWord type codetree = codetree type pretty = pretty type argumentType=argumentType type codeBinding = codeBinding type level = level end end; polyml-5.6/mlsource/MLCompiler/COMPILERBODYSIG.sml000066400000000000000000000055321265146633400215230ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature COMPILERBODYSIG = sig type values; type typeConstrSet; type fixStatus; type structVals; type signatures; type functors; type exportTree type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list }; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } (* The completed compiler. Returns the parse tree and, if successful, a function that executes the compiled code. *) val compiler : nameSpace * (unit->char option) * Universal.universal list -> exportTree option * (unit -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list }) option structure Sharing: sig type values = values and typeConstrSet = typeConstrSet and fixStatus = fixStatus and structVals = structVals and signatures = signatures and functors = functors and exportTree = exportTree end end; polyml-5.6/mlsource/MLCompiler/COMPILER_BODY.ML000066400000000000000000000213301265146633400210260ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Body of ML Compiler. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor COMPILER_BODY ( structure SYMSET : sig type sys type symset val inside: sys * symset -> bool; val ++ : symset * symset -> symset val abortParse: symset val semicolon: symset end; structure LEX : LEXSIG structure CODETREE : CODETREESIG structure STRUCTVALS : STRUCTVALSIG; structure VALUEOPS : VALUEOPSSIG; structure EXPORTTREE: EXPORTTREESIG structure STRUCTURES : STRUCTURESSIG structure PARSEDEC : sig type lexan type symset type fixStatus type program val parseDec: symset * lexan * { enterFix: string * fixStatus -> unit, lookupFix: string -> fixStatus option } -> program end; structure DEBUG: DEBUGSIG structure UTILITIES : sig val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option} end; structure PRETTY : PRETTYSIG structure MISC : sig exception InternalError of string val lookupDefault : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list end; sharing STRUCTVALS.Sharing = VALUEOPS.Sharing = PRETTY.Sharing = STRUCTURES.Sharing = LEX.Sharing = EXPORTTREE.Sharing = SYMSET = PARSEDEC = CODETREE ) : COMPILERBODYSIG = (*****************************************************************************) (* COMPILERBODY functor body *) (*****************************************************************************) struct open MISC; open STRUCTVALS; open PRETTY; open LEX; type nameSpace = VALUEOPS.nameSpace open STRUCTURES open EXPORTTREE val stopSyms = let open SYMSET in op ++ (abortParse, semicolon) end fun baseCompiler (lex : lexan, nameSpace: nameSpace, debugSwitches) : exportTree option * (unit -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list }) option = let (* let1 *) val compilerOutput = getCompilerOutput debugSwitches val printParsetree = DEBUG.getParameter DEBUG.parsetreeTag debugSwitches val globals = { lookupFix = #lookupFix nameSpace, lookupVal = #lookupVal nameSpace, lookupType = #lookupType nameSpace, lookupSig = #lookupSig nameSpace, lookupStruct = #lookupStruct nameSpace, lookupFunct = #lookupFunct nameSpace, enterFix = #enterFix nameSpace, enterVal = #enterVal nameSpace, enterType = #enterType nameSpace, enterStruct = #enterStruct nameSpace, enterSig = #enterSig nameSpace, enterFunct = #enterFunct nameSpace, allValNames = fn () => map #1 (#allVal nameSpace ()) } val startLocn = location lex val () = if SYMSET.inside (sy lex, SYMSET.semicolon) then insymbol lex else () val parentTreeNav = case List.find (Universal.tagIs rootTreeTag) debugSwitches of SOME opt => Universal.tagProject rootTreeTag opt | NONE => { parent = NONE, next = NONE, previous = NONE } in (* An empty declaration (or end of file!) *) if SYMSET.inside (sy lex, stopSyms) then if errorOccurred lex (* We could have, for example, an unterminated comment. *) then (NONE, NONE) else (SOME(locSpan(startLocn, location lex), []), SOME (fn () => { fixes=[], values=[], structures=[], functors=[], types=[], signatures=[] }) ) (* Do nothing *) else let (* create a "throw away" compiling environment for this topdec *) val newFixEnv = UTILITIES.searchList () val enterFix = #enter newFixEnv val lookupFix = lookupDefault (#lookup newFixEnv) (#lookupFix globals) (* parse a program: a sequence of topdecs ending with a semicolon. *) val parseTree : STRUCTURES.program = PARSEDEC.parseDec (stopSyms, lex, {enterFix = enterFix, lookupFix = lookupFix}) val () = if printParsetree then compilerOutput (STRUCTURES.displayProgram (parseTree, 10000)) else () in if errorOccurred lex then (NONE, NONE) (* Error: No result and the parse tree won't be useful. *) else let (* If no errors then do second pass to match identifiers and declarations and return type of expression. *) val () = STRUCTURES.pass2Structs (parseTree, lex, Env globals) in if errorOccurred lex then (SOME(structsExportTree(parentTreeNav, parseTree)), NONE) else let (* Only code-generate if there were no errors and it's not a directive. *) val (structCode, nLocals) = STRUCTURES.gencodeStructs (parseTree, lex) in if errorOccurred lex then (* Errors can be produced during the code-generation phase. *) (SOME(structsExportTree(parentTreeNav, parseTree)), NONE) (* Error: No result. *) else let val resultCode = CODETREE.genCode(structCode, debugSwitches, nLocals) (* This is the function that is returned as the result of the compilation. *) fun executeCode() = STRUCTURES.pass4Structs (resultCode (), parseTree) in (SOME(structsExportTree (parentTreeNav, parseTree)), SOME executeCode) end end end end end fun compiler (nameSpace: nameSpace, getChar: unit->char option, parameters: Universal.universal list) : exportTree option * (unit -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list }) option = let val debugSwitches = parameters val lex = LEX.initial(getChar, debugSwitches); val traceCompiler = DEBUG.getParameter DEBUG.traceCompilerTag debugSwitches val compilerOutput = getCompilerOutput parameters fun printReport s = compilerOutput(PrettyString s) in ( if traceCompiler then PolyML.exception_trace (fn () => baseCompiler(lex, nameSpace, debugSwitches)) else baseCompiler(lex, nameSpace, debugSwitches) ) handle SML90.Interrupt => ( printReport "Compilation interrupted\n"; raise SML90.Interrupt ) | InternalError s => let val s' = "Exception- InternalError: " ^ String.toString s ^ " raised while compiling" in printReport (s' ^ "\n"); raise Fail s' end | exn => let val s' = "Exception- " ^ General.exnName exn ^ " unexpectedly raised while compiling" in printReport (s' ^ "\n"); raise Fail s' end end structure Sharing = struct type values = values and typeConstrSet = typeConstrSet and fixStatus = fixStatus and structVals = structVals and signatures = signatures and functors = functors and exportTree = exportTree end end; (* struct *) polyml-5.6/mlsource/MLCompiler/COPIER.sml000066400000000000000000000331101265146633400202420ustar00rootroot00000000000000(* Copyright (c) 2009-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the STRUCTURES module: Copyright (c) 2000-9 Cambridge University Technical Services Limited Title: Module Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor COPIER( structure STRUCTVALS : STRUCTVALSIG; structure TYPETREE : TYPETREESIG structure UNIVERSALTABLE: sig type universal = Universal.universal type univTable type 'a tag = 'a Universal.tag val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; val univFold: univTable * (string * universal * 'a -> 'a) * 'a -> 'a; end; structure UTILITIES: sig val splitString: string -> { first:string,second:string } end sharing STRUCTVALS.Sharing = TYPETREE.Sharing sharing type UNIVERSALTABLE.univTable = STRUCTVALS.univTable ) :COPIERSIG = struct open STRUCTVALS TYPETREE UNIVERSALTABLE UTILITIES open Universal; (* for tag record selectors *) type tsvEnv = { enterType: string * typeConstrSet -> unit, enterStruct: string * structVals -> unit, enterVal : string * values -> unit }; (* Type constructor cache. This maps typeIDs in the copied signature to type constructors. More importantly, it identifies a type constructor that carries that type ID so that when we copy the values the string name is appropriate. *) (* Generate new entries for all the elements of the signature. As well as copying the signature it also keeps track of addresses used in the signature for values. This is needed because when we're constructing a signature we need to know the maximum address used. This is used to two cases only: when we have a named signature with possible sharing or "where types" or when including a signature. Really these cases should renumber the value entries. *) fun localCopySig(sourceTab, resEnv, mapTypeId, singleLevel, strName, newMap, cacheTail): unit = let fun buildTypeCache(sourceTab, strName, mapTypeId, buildDatatypes, initialCache, cacheTail) = let (* Process sub-directories first. That way they will be further down the list. *) fun foldSubStructs(dName, dVal, rest) = if tagIs structVar dVal then let val Struct { signat = Signatures { tab, typeIdMap, ...}, ...} = tagProject structVar dVal in buildTypeCache(tab, strName ^ dName ^ "." (* Add structure names. *), composeMaps(typeIdMap, mapTypeId), buildDatatypes, initialCache, rest) end else rest (* Then the types within this structure. *) fun foldTypes(_, dVal, rest) = if tagIs typeConstrVar dVal then let val TypeConstrSet(tcon, _) = tagProject typeConstrVar dVal fun makeName s = strName ^ s fun copyId(TypeId{idKind=Bound{ offset, ...}, ...}) = SOME(mapTypeId offset) | copyId _ = NONE in (* On the first pass we build datatypes, on the second type abbreviations using the copied datatypes. *) case tcIdentifier tcon of TypeId{idKind=TypeFn(args, equiv), access, description, ...} => if buildDatatypes then rest (* Not on this pass. *) else (* Build a new entry whether the typeID has changed or not. *) let val copiedEquiv = copyType(equiv, fn x => x, fn tcon => copyTypeConstrWithCache(tcon, copyId, fn x => x, makeName, initialCache)) val copiedId = TypeId{idKind=TypeFn(args, copiedEquiv), access=access, description=description} in makeTypeConstructor(makeName(tcName tcon), copiedId, tcLocations tcon) :: rest end | id => if not buildDatatypes then rest (* Not on this pass. *) else ( case copyId id of NONE => rest (* Skip (or add to cache?) *) | SOME newId => makeTypeConstructor (makeName(tcName tcon), newId, tcLocations tcon) :: rest ) end else rest in univFold(sourceTab, foldTypes, univFold(sourceTab, foldSubStructs, cacheTail)) end (* Process datatypes. While processing these we make new entries for every datatype even if they are already in the cache. That way we end up with the last entry in the list being the most local and that's the one we want to use for type abbreviations and values. *) val datatypeCache = buildTypeCache(sourceTab, strName, mapTypeId, true, (* Datatypes *) [], cacheTail) (* Now add any type abbreviations. These can refer to datatypes we added in the previous pass but don't reuse type abbreviations we add elsewhere. *) val typeCache = buildTypeCache(sourceTab, strName, mapTypeId, false, (* Type abbreviations. *)datatypeCache, datatypeCache) fun copyTypeCons (tcon : typeConstrs) : typeConstrs = let fun copyId(TypeId{idKind=Bound{ offset, ...}, ...}) = SOME(mapTypeId offset) | copyId _ = NONE in copyTypeConstrWithCache (tcon, copyId, fn x => x, fn s => strName ^ s, typeCache) end fun copyTyp (t : types) : types = copyType (t, fn x => x, (* Don't bother with type variables. *) copyTypeCons) in univFold (sourceTab, fn (dName: string, dVal: universal, _) => if tagIs structVar dVal then let val Struct { signat, name=structName, access, locations=structLocs, ...} = tagProject structVar dVal val Signatures { name=sigName, tab, typeIdMap, firstBoundIndex, locations=sigLocs, ...} = signat val newSig = if singleLevel then (* Just compose the maps. *) makeSignature(sigName, tab, firstBoundIndex, sigLocs, composeMaps(typeIdMap, mapTypeId), []) else (* Recursive copy. *) let (* Make a new sub-structure. *) val newTab = makeSignatureTable (); (* Copy everything into the new signature. *) val () = localCopySig (tab, { enterType = fn (s,v) => univEnter (newTab, typeConstrVar, s, v), enterStruct = fn (s,v) => univEnter (newTab, structVar, s, v), enterVal = fn (s,v) => univEnter (newTab, valueVar, s, v) }, composeMaps(typeIdMap, mapTypeId), false, strName ^ dName ^ ".", newMap, typeCache) in (* If we're copying it all set the resulting map to the new map. *) makeSignature(sigName, newTab, firstBoundIndex, sigLocs, newMap, []) end val newStruct = Struct { name = structName, signat = newSig, access = access, locations = structLocs} in #enterStruct resEnv (dName, newStruct) end (* structures *) else if tagIs typeConstrVar dVal then let val TypeConstrSet(oldConstr, tcConstructors) = tagProject typeConstrVar dVal val newConstr = copyTypeCons oldConstr; (* Copy the value constructors for a datatype. *) fun copyValueConstr( v as Value{name, typeOf, class, access, locations, references, instanceTypes, ...}) = let (* Copy its type and make a new constructor if the type has changed. *) val newType = copyTyp typeOf; in if not (identical (newType, typeOf)) then Value{name=name, typeOf=newType, class=class, access=access, locations = locations, references = references, instanceTypes=instanceTypes} else v end; val copiedConstrs = map copyValueConstr tcConstructors in #enterType resEnv (dName, TypeConstrSet(newConstr, copiedConstrs)) end (* Finally the values and exceptions. *) else if tagIs valueVar dVal then let val v as Value {typeOf, class, name, access, locations, references, instanceTypes, ...} = tagProject valueVar dVal; val newType = copyTyp typeOf; (* Can save creating a new object if the address and type are the same as they were. *) val res = if not (identical (newType, typeOf)) then Value {typeOf=newType, class=class, name=name, instanceTypes=instanceTypes, access=access,locations=locations, references = references} else v in #enterVal resEnv (name, res) end else (), () ) end (* fullCopySig *) (* Exported versions of these. *) (* Open a structure or include a signature. *) fun openSignature(Signatures{ tab, typeIdMap, ...}, resEnv, strName) = localCopySig(tab, resEnv, typeIdMap, true (* One level. *), strName, typeIdMap, []) and fullCopyDatatype(oldConstr:typeConstrSet, mapTypeId, strName) = let val sigSpace = makeSignatureTable() val Env { enterType, ...} = makeEnv sigSpace val () = enterType(tcName(tsConstr oldConstr), oldConstr) val resType = ref NONE val resEnv = { enterType = fn (_, tc) => resType := SOME tc, enterStruct = fn (s, _) => raise Misc.InternalError ("enterStruct "^s), enterVal = fn (s, _) => raise Misc.InternalError ("enterVal "^s) } val () = localCopySig(sigSpace, resEnv, mapTypeId, true, strName, fn _ => raise Subscript, []) in valOf(! resType) end fun replaceMap(Signatures{tab=sourceTab, name = sourceName, locations, ...}, mapTypeId: int -> typeId, min, boundIds, newMap): signatures = let (* Make a new signature. *) val tab = makeSignatureTable (); val tsvEnv = { enterType = fn (s,v) => univEnter (tab, typeConstrVar, s, v), enterStruct = fn (s,v) => univEnter (tab, structVar, s, v), enterVal = fn (s, v) => univEnter (tab, valueVar, s, v) } (* Copy everything into the new signature. *) val () = localCopySig(sourceTab, tsvEnv, mapTypeId, false, "", newMap, []) in makeSignature(sourceName, tab, min, locations, newMap, boundIds) end (* replaceMap *) (* Find the maximum run-time offset used for a value or structure in a signature. This excludes type IDs. *) fun getNextRuntimeOffset(Signatures{tab, ...}): int = let fun getOffset(_, dVal, m) = if tagIs valueVar dVal then case tagProject valueVar dVal of Value { access = Formal addr, ...} => Int.max(addr+1, m) | _ => m else if tagIs structVar dVal then case tagProject structVar dVal of Struct{access=Formal addr, ...} => Int.max(addr+1, m) | _ => m else if tagIs typeConstrVar dVal then let fun getConstrOffset(Value { access = Formal addr, ...}, m) = Int.max(addr+1, m) | getConstrOffset(_, m) = m in List.foldl getConstrOffset m (tsConstructors (tagProject typeConstrVar dVal)) end else m in univFold(tab, getOffset, 0) end structure Sharing = struct type signatures = signatures type typeConstrSet = typeConstrSet type structVals = structVals type values = values type typeId = typeId type valAccess = valAccess type types = types type univTable = univTable end end; polyml-5.6/mlsource/MLCompiler/COPIERSIG.sml000066400000000000000000000033421265146633400206110ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature COPIERSIG = sig type signatures type typeConstrSet type structVals type values type typeId type types type univTable type tsvEnv = { enterType: string * typeConstrSet -> unit, enterStruct: string * structVals -> unit, enterVal : string * values -> unit }; val openSignature: signatures * tsvEnv * string -> unit val fullCopyDatatype: typeConstrSet * (int -> typeId) * string -> typeConstrSet val replaceMap: signatures * (int -> typeId) * int * typeId list * (int -> typeId) -> signatures val getNextRuntimeOffset : signatures -> int structure Sharing: sig type signatures = signatures type typeConstrSet = typeConstrSet type structVals = structVals type values = values type typeId = typeId type types = types type univTable = univTable end end; polyml-5.6/mlsource/MLCompiler/CodeTree/000077500000000000000000000000001265146633400202405ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/CodeTree/BackendIntermediateCode.sml000066400000000000000000000422251265146633400254370ustar00rootroot00000000000000(* Copyright (c) 2012 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Intermediate code tree for the back end of the compiler. *) structure BackendIntermediateCode: BackendIntermediateCodeSig = struct open Address datatype argumentType = GeneralType | FloatingPtType datatype backendIC = BICNewenv of bicCodeBinding list * backendIC (* Set of bindings with an expression. *) | BICConstnt of machineWord * Universal.universal list (* Load a constant *) | BICExtract of bicLoadForm * bool (* Get a local variable, an argument or a closure value *) | BICField of {base: backendIC, offset: int } (* Load a field from a tuple or record *) | BICEval of (* Evaluate a function with an argument list. *) { function: backendIC, argList: (backendIC * argumentType) list, resultType: argumentType } | BICLambda of bicLambdaForm (* Lambda expressions. *) | BICCond of backendIC * backendIC * backendIC (* If-then-else expression *) | BICCase of (* Case expressions *) { cases : (backendIC * word) list, test : backendIC, caseType: caseType, default : backendIC } | BICBeginLoop of (* Start of tail-recursive inline function. *) { loop: backendIC, arguments: (bicSimpleBinding * argumentType) list } | BICLoop of (backendIC * argumentType) list (* Jump back to start of tail-recursive function. *) | BICKillItems of (* Kill entries. Used to mark a branch where a binding is no longer required. "killSet" is always an Extract with lastRef=true so the type should be loadForm list rather than backendIC list. *) { expression: backendIC, killSet: backendIC list, killBefore: bool } | BICRaise of backendIC (* Raise an exception *) | BICLdexc (* Load the exception (used at the start of a handler) *) | BICHandle of (* Exception handler. *) { exp: backendIC, handler: backendIC } | BICTuple of backendIC list (* Tuple *) | BICContainer of int (* Create a container for a tuple on the stack. *) | BICSetContainer of (* Copy a tuple to a container. *) { container: backendIC, tuple: backendIC, filter: BoolVector.vector } | BICTagTest of { test: backendIC, tag: word, maxTag: word } and bicCodeBinding = BICDeclar of bicSimpleBinding (* Make a local declaration or push an argument *) | BICRecDecs of { addr: int, references: int, lambda: bicLambdaForm } list (* Set of mutually recursive declarations. *) | BICNullBinding of backendIC (* Just evaluate the expression and discard the result. *) and caseType = CaseInt | CaseWord | CaseTag of word and bicLoadForm = BICLoadLocal of int (* Local binding *) | BICLoadArgument of int (* Argument - 0 is first arg etc.*) | BICLoadClosure of int (* Closure - 0 is first closure item etc *) | BICLoadRecursive (* Recursive call *) withtype bicSimpleBinding = { (* Declare a value or push an argument. *) value: backendIC, addr: int, references: int } and bicLambdaForm = { (* Lambda expressions. *) body : backendIC, name : string, closure : backendIC list, argTypes : argumentType list, resultType : argumentType, closureRefs : int, localCount : int, heapClosure : bool, argLifetimes : int list } structure CodeTags = struct open Universal val tupleTag: universal list list tag = tag() fun splitProps _ [] = (NONE, []) | splitProps tag (hd::tl) = if Universal.tagIs tag hd then (SOME hd, tl) else let val (p, l) = splitProps tag tl in (p, hd :: l) end fun mergeTupleProps(p, []) = p | mergeTupleProps([], p) = p | mergeTupleProps(m, n) = ( case (splitProps tupleTag m, splitProps tupleTag n) of ((SOME mp, ml), (SOME np, nl)) => let val mpl = Universal.tagProject tupleTag mp and npl = Universal.tagProject tupleTag np val merge = ListPair.mapEq mergeTupleProps (mpl, npl) in Universal.tagInject tupleTag merge :: (ml @ nl) end | _ => m @ n ) end open Pretty fun pList ([]: 'b list, _: string, _: 'b->pretty) = [] | pList ([h], _, disp) = [disp h] | pList (h::t, sep, disp) = PrettyBlock (0, false, [], [ disp h, PrettyBreak (0, 0), PrettyString sep ] ) :: PrettyBreak (1, 0) :: pList (t, sep, disp) fun pretty (pt : backendIC) : pretty = let fun printList(start, lst, sep) : pretty = PrettyBlock (1, true, [], PrettyString (start ^ "(") :: pList(lst, sep, pretty) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) fun prettyArgType GeneralType = PrettyString "G" | prettyArgType FloatingPtType = PrettyString "F" fun prettyArg (c, t) = PrettyBlock(1, false, [], [pretty c, PrettyBreak (1, 0), prettyArgType t]) fun prettyArgs(start, lst, sep) : pretty = PrettyBlock (1, true, [], PrettyString (start ^ "(") :: pList(lst, sep, prettyArg) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) in case pt of BICEval {function, argList, resultType} => let val prettyArgs = PrettyBlock (1, true, [], PrettyString ("$(") :: pList(argList, ",", prettyArg) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) in PrettyBlock (3, false, [], [ pretty function, PrettyBreak(1, 0), prettyArgType resultType, PrettyBreak(1, 0), prettyArgs ] ) end | BICKillItems {expression, killSet, killBefore} => PrettyBlock(1, false, [], [ PrettyString(if killBefore then "KILLBEFORE(" else "KILLAFTER("), PrettyBreak(1, 0), pretty expression, PrettyBreak(1, 0), printList (" KILL=", killSet, ","), PrettyString ")" ] ) | BICExtract (BICLoadLocal addr, lastRef) => let val last = if lastRef then ", last" else ""; val str : string = concat ["LOCAL(", Int.toString addr, last, ")"] in PrettyString str end | BICExtract (BICLoadArgument addr, lastRef) => let val last = if lastRef then ", last" else ""; val str : string = concat ["PARAM(", Int.toString addr, last, ")"] in PrettyString str end | BICExtract (BICLoadClosure addr, lastRef) => let val last = if lastRef then ", last" else ""; val str : string = concat ["CLOS(", Int.toString addr, last, ")"] in PrettyString str end | BICExtract (BICLoadRecursive, lastRef) => let val last = if lastRef then ", last" else ""; val str : string = concat ["RECURSIVE(", last, ")"] in PrettyString str end | BICField {base, offset} => let val str = "INDIRECT(" ^ Int.toString offset ^ ", "; in PrettyBlock(0, false, [], [ PrettyString str, pretty base, PrettyString ")" ] ) end | BICLambda {body, name, closure, argTypes, closureRefs, heapClosure, resultType, localCount, argLifetimes} => let fun prettyArgTypes [] = [] | prettyArgTypes [last] = [prettyArgType last] | prettyArgTypes (hd::tl) = prettyArgType hd :: PrettyBreak(1, 0) :: prettyArgTypes tl fun prettyArgLife [] = [] | prettyArgLife [last] = [PrettyString(Int.toString last)] | prettyArgLife (hd::tl) = PrettyString(Int.toString hd) :: PrettyBreak(1, 0) :: prettyArgLife tl in PrettyBlock (1, true, [], [ PrettyString ("LAMBDA("), PrettyBreak (1, 0), PrettyString name, PrettyBreak (1, 0), PrettyString ( "CL=" ^ Bool.toString heapClosure), PrettyString (" CR=" ^ Int.toString closureRefs), PrettyString (" LOCALS=" ^ Int.toString localCount), PrettyBreak(1, 0), PrettyBlock (1, false, [], PrettyString "ARGS=" :: prettyArgTypes argTypes), PrettyBreak(1, 0), PrettyBlock (1, false, [], PrettyString "ARGLIVES=" :: prettyArgLife argLifetimes), PrettyBreak(1, 0), PrettyBlock (1, false, [], [PrettyString "RES=", prettyArgType resultType]), printList (" CLOS=", (*map BICExtract *)closure, ","), PrettyBreak (1, 0), pretty body, PrettyString "){LAMBDA}" ] ) end | BICConstnt (w, _) => PrettyString (stringOfWord w) | BICCond (f, s, t) => PrettyBlock (1, true, [], [ PrettyString "IF(", pretty f, PrettyString ", ", PrettyBreak (0, 0), pretty s, PrettyString ", ", PrettyBreak (0, 0), pretty t, PrettyBreak (0, 0), PrettyString (")") ] ) | BICNewenv(decs, final) => PrettyBlock (1, true, [], PrettyString ("BLOCK" ^ "(") :: pList(decs, ";", prettyBinding) @ [ PrettyBreak (1, 0), pretty final, PrettyBreak (0, 0), PrettyString (")") ] ) | BICBeginLoop{loop=loopExp, arguments=args } => let fun prettyArg (c, t) = PrettyBlock(1, false, [], [prettySimpleBinding c, PrettyBreak (1, 0), prettyArgType t]) in PrettyBlock (3, false, [], [ PrettyBlock (1, true, [], PrettyString ("BEGINLOOP(") :: pList(args, ",", prettyArg) @ [ PrettyBreak (0, 0), PrettyString (")") ] ), PrettyBreak (0, 0), PrettyString "(", PrettyBreak (0, 0), pretty loopExp, PrettyBreak (0, 0), PrettyString ")" ] ) end | BICLoop ptl => prettyArgs("LOOP", ptl, ",") | BICRaise c => PrettyBlock (1, true, [], [ PrettyString "RAISE(", pretty c, PrettyBreak (0, 0), PrettyString (")") ] ) | BICHandle {exp, handler, ...} => PrettyBlock (3, false, [], [ PrettyString "HANDLE(", pretty exp, PrettyString "WITH", PrettyBreak (1, 0), pretty handler, PrettyString ")" ] ) | BICLdexc => PrettyString "LDEXC" | BICCase {cases, test, default, caseType} => PrettyBlock (1, true, [], PrettyString (concat ["CASE ", case caseType of CaseInt => "INT" | CaseWord => "WORD" | CaseTag n => "TAG " ^ Word.toString n, " (" ]) :: pretty test :: PrettyBreak (1, 0) :: PrettyString "(" :: PrettyBreak (1, 0) :: pList(cases, ",", fn (exp, label : word) => PrettyBlock (1, true, [], [ PrettyString (Word.toString label ^ ":"), PrettyBreak (1, 0), pretty exp ]) ) @ [ PrettyBreak (1, 0), PrettyBlock (1, false, [], [ PrettyString "ELSE:", PrettyBreak (1, 0), pretty default ] ), PrettyBreak (1, 0), PrettyString (") {"^"CASE"^"}") ] ) | BICTuple ptl => printList("RECCONSTR", ptl, ",") | BICContainer size => PrettyString ("CONTAINER " ^ Int.toString size) | BICSetContainer{container, tuple, filter} => let val source = BoolVector.length filter val dest = BoolVector.foldl(fn (true, n) => n+1 | (false, n) => n) 0 filter in PrettyBlock (3, false, [], [ PrettyString (concat["SETCONTAINER(", Int.toString dest, "/", Int.toString source, ", "]), pretty container, PrettyBreak (0, 0), PrettyString ",", PrettyBreak (1, 0), pretty tuple, PrettyBreak (0, 0), PrettyString ")" ] ) end | BICTagTest { test, tag, maxTag } => PrettyBlock (3, false, [], [ PrettyString (concat["TAGTEST(", Word.toString tag, ", ", Word.toString maxTag, ","]), PrettyBreak (1, 0), pretty test, PrettyBreak (0, 0), PrettyString ")" ] ) (* That list should be exhaustive! *) end (* pretty *) and prettyBinding(BICDeclar dec) = prettySimpleBinding dec | prettyBinding(BICRecDecs ptl) = let fun prettyRDec {lambda, addr, references} = PrettyBlock (1, false, [], [ PrettyString (concat ["DECL #", Int.toString addr, "{", Int.toString references, " uses} ="]), PrettyBreak (1, 0), pretty(BICLambda lambda) ] ) in PrettyBlock (1, true, [], PrettyString ("MUTUAL" ^ "(") :: pList(ptl, " AND ", prettyRDec) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) end | prettyBinding(BICNullBinding c) = pretty c and prettySimpleBinding{value, addr, references} = PrettyBlock (1, false, [], [ PrettyString (concat ["DECL #", Int.toString addr, "{", Int.toString references, " uses} ="]), PrettyBreak (1, 0), pretty value ] ) structure Sharing = struct type backendIC = backendIC and caseType = caseType and pretty = pretty and argumentType = argumentType and bicCodeBinding = bicCodeBinding and bicSimpleBinding = bicSimpleBinding end end; polyml-5.6/mlsource/MLCompiler/CodeTree/BackendIntermediateCodeSig.sml000066400000000000000000000116071265146633400261020ustar00rootroot00000000000000(* Copyright (c) 2012 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Intermediate code tree for the back end of the compiler. *) signature BackendIntermediateCodeSig = sig type machineWord = Address.machineWord datatype argumentType = GeneralType | FloatingPtType datatype backendIC = BICNewenv of bicCodeBinding list * backendIC (* Set of bindings with an expression. *) | BICConstnt of machineWord * Universal.universal list (* Load a constant *) | BICExtract of bicLoadForm * bool (* Get a local variable, an argument or a closure value *) | BICField of {base: backendIC, offset: int } (* Load a field from a tuple or record *) | BICEval of (* Evaluate a function with an argument list. *) { function: backendIC, argList: (backendIC * argumentType) list, resultType: argumentType } | BICLambda of bicLambdaForm (* Lambda expressions. *) | BICCond of backendIC * backendIC * backendIC (* If-then-else expression *) | BICCase of (* Case expressions *) { cases : (backendIC * word) list, test : backendIC, caseType: caseType, default : backendIC } | BICBeginLoop of (* Start of tail-recursive inline function. *) { loop: backendIC, arguments: (bicSimpleBinding * argumentType) list } | BICLoop of (backendIC * argumentType) list (* Jump back to start of tail-recursive function. *) | BICKillItems of (* Kill entries. Used to mark a branch where a binding is no longer required. "killSet" is always an Extract with lastRef=true so the type should be loadForm list rather than backendIC list. *) { expression: backendIC, killSet: backendIC list, killBefore: bool } | BICRaise of backendIC (* Raise an exception *) | BICLdexc (* Load the exception (used at the start of a handler) *) | BICHandle of (* Exception handler. *) { exp: backendIC, handler: backendIC } | BICTuple of backendIC list (* Tuple *) | BICContainer of int (* Create a container for a tuple on the stack. *) | BICSetContainer of (* Copy a tuple to a container. *) { container: backendIC, tuple: backendIC, filter: BoolVector.vector } | BICTagTest of { test: backendIC, tag: word, maxTag: word } and bicCodeBinding = BICDeclar of bicSimpleBinding (* Make a local declaration or push an argument *) | BICRecDecs of { addr: int, references: int, lambda: bicLambdaForm } list (* Set of mutually recursive declarations. *) | BICNullBinding of backendIC (* Just evaluate the expression and discard the result. *) and caseType = CaseInt | CaseWord | CaseTag of word and bicLoadForm = BICLoadLocal of int (* Local binding *) | BICLoadArgument of int (* Argument - 0 is first arg etc.*) | BICLoadClosure of int (* Closure - 0 is first closure item etc *) | BICLoadRecursive (* Recursive call *) withtype bicSimpleBinding = { (* Declare a value or push an argument. *) value: backendIC, addr: int, references: int } and bicLambdaForm = { (* Lambda expressions. *) body : backendIC, name : string, closure : backendIC list, argTypes : argumentType list, resultType : argumentType, closureRefs : int, localCount : int, heapClosure : bool, argLifetimes : int list } type pretty val pretty : backendIC -> pretty structure CodeTags: sig val tupleTag: Universal.universal list list Universal.tag val mergeTupleProps: Universal.universal list * Universal.universal list -> Universal.universal list end structure Sharing: sig type backendIC = backendIC and caseType = caseType and pretty = pretty and argumentType = argumentType and bicCodeBinding = bicCodeBinding and bicSimpleBinding = bicSimpleBinding end end; polyml-5.6/mlsource/MLCompiler/CodeTree/BaseCodeTree.sml000066400000000000000000000572621265146633400232560ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2008-2010, 2013, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Basic code-tree data structure. This was previously partly in GCODE.ML and partly in CODETREE.ML. *) structure BaseCodeTree: BaseCodeTreeSig = struct open Address datatype argumentType = datatype BackendIntermediateCode.argumentType datatype inlineStatus = NonInline | Inline (* How variables are used. Added and examined by the optimisation pass. *) datatype codeUse = UseGeneral (* Used in some other context. *) | UseExport (* Exported i.e. the result of a top-level binding. *) | UseApply of codeUse list * codetree list (* Applied as a function - the list is where the result goes, the codetree list is the code that was used for each argument. *) | UseField of int * codeUse list (* Selected as a field - the list is where the result goes *) and codetree = Newenv of codeBinding list * codetree (* Set of bindings with an expression. *) | Constnt of machineWord * Universal.universal list (* Load a constant *) | Extract of loadForm (* Get a local variable, an argument or a closure value *) | Indirect of {base: codetree, offset: int, isVariant: bool } (* Load a value from a heap record *) | Eval of (* Evaluate a function with an argument list. *) { function: codetree, argList: (codetree * argumentType) list, resultType: argumentType } | Lambda of lambdaForm (* Lambda expressions. *) | Cond of codetree * codetree * codetree (* If-statement *) | BeginLoop of (* Start of tail-recursive inline function. *) { loop: codetree, arguments: (simpleBinding * argumentType) list } | Loop of (codetree * argumentType) list (* Jump back to start of tail-recursive function. *) | Raise of codetree (* Raise an exception *) | Ldexc (* Load the exception (used at the start of a handler) *) | Handle of (* Exception handler. *) { exp: codetree, handler: codetree } | Tuple of { fields: codetree list, isVariant: bool } (* Tuples and datatypes *) | SetContainer of (* Copy a tuple to a container. *) { container: codetree, tuple: codetree, filter: BoolVector.vector } | TagTest of { test: codetree, tag: word, maxTag: word } and codeBinding = Declar of simpleBinding (* Make a local declaration or push an argument *) | RecDecs of { addr: int, lambda: lambdaForm, use: codeUse list } list (* Set of mutually recursive declarations. *) | NullBinding of codetree (* Just evaluate the expression and discard the result. *) | Container of { addr: int, use: codeUse list, size: int, setter: codetree } (* Container: allocate a piece of stack space and set it to the values from a tuple. *) and loadForm = LoadArgument of int | LoadLocal of int | LoadClosure of int | LoadRecursive (* When we look up an entry in the environment we get a pair of a "general" value, which is either a constant or a load, and an optional special value, which is either a tuple or an inline function. Tuple entries are functions from an integer offset to one of these pairs; inline function entries are a lambda together with a map for the free variables. *) and envGeneral = EnvGenLoad of loadForm | EnvGenConst of machineWord * Universal.universal list (* Special entries. The type of both EnvSpecTuple and EnvSpecInlineFunction includes a function from int, the index, to the (general, special) pair rather than a list of either fields or closure entries. The main reason is that if we have a function that contains a reference to, say a tuple, in its closure we can pass in a EnvSpecTuple entry with a function that only adds a field to the closure if the field is actually used. Passing a list would require adding all the fields to the closure at the time the EnvSpecTuple was passed. *) and envSpecial = EnvSpecNone | EnvSpecTuple of int * (int -> envGeneral * envSpecial) | EnvSpecInlineFunction of lambdaForm * (int -> envGeneral * envSpecial) withtype simpleBinding = { (* Declare a value or push an argument. *) value: codetree, addr: int, use: codeUse list } and lambdaForm = { (* Lambda expressions. *) body : codetree, isInline : inlineStatus, name : string, closure : loadForm list, argTypes : (argumentType * codeUse list) list, resultType : argumentType, localCount : int, recUse : codeUse list } structure CodeTags = struct open Universal (* Import tags from back end *) open BackendIntermediateCode.CodeTags val inlineCodeTag: envSpecial tag = tag() end open Pretty (* Common cases. *) val space = PrettyBreak (1, 0) fun block l = PrettyBlock (0, false, [], l) val string = PrettyString fun pList ([]: 'b list, _: string, _: 'b->pretty) = [] | pList ([h], _, disp) = [disp h] | pList (h::t, sep, disp) = PrettyBlock (0, false, [], [ disp h, PrettyBreak (0, 0), PrettyString sep ] ) :: PrettyBreak (1, 0) :: pList (t, sep, disp) fun pretty (pt : codetree) : pretty = let fun printList(start, lst, sep) : pretty = PrettyBlock (1, true, [], PrettyString (start ^ "(") :: pList(lst, sep, pretty) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) fun prettyArg (c, _) = pretty c fun prettyArgs(start, lst, sep) : pretty = PrettyBlock (1, true, [], PrettyString (start ^ "(") :: pList(lst, sep, prettyArg) @ [ PrettyBreak (0, 0), PrettyString (")") ] ) in case pt of Eval {function, argList, ...} => PrettyBlock (2, false, [], [ case function of Extract _ => pretty function | Constnt _ => pretty function | _ => PrettyBlock(2, true, [], [ string "(", PrettyBreak(0, 0), pretty function, PrettyBreak(0, 0), string ")" ] ) , PrettyBreak(1, 2), PrettyBlock(2, true, [], ( string "(" :: PrettyBreak(0, 0) :: pList(argList, ",", prettyArg) @ [PrettyBreak (0, 0), PrettyString (")")] ) ) ] ) | Extract(LoadArgument addr) => string ("Arg" ^ Int.toString addr) | Extract(LoadLocal addr) => string ("Local" ^ Int.toString addr) | Extract(LoadClosure addr) => string ("Closure" ^ Int.toString addr) | Extract LoadRecursive => string "Recursive" | Indirect {base, offset, isVariant} => PrettyBlock(2, false, [], [ pretty base, PrettyBreak(0, 2), string(concat["[", Int.toString offset, "]", if isVariant then "(*V*)" else ""]) ] ) | Lambda {body, isInline, name, closure, argTypes, localCount, recUse, ...} => let val inl = case isInline of NonInline => "" | Inline => "inline," fun printArgs(n, (t, u) :: rest) = PrettyBlock(4, false, [], [ string("Arg"^Int.toString n), space, prettyUses "" u ] @ ( case t of GeneralType => [] | FloatingPtType => [ space, string ":real" ] ) @ ( if null rest then [] else [PrettyBreak(0,0), string ",", space] ) ) :: printArgs(n+1, rest) | printArgs(_, []) = [] in PrettyBlock(2, true, [], [ PrettyBlock(4, false, [], [ string "fn(", space, block(printArgs(0, argTypes)), space, string ")", space, string "(*", space, string("\"" ^ name ^ "\""), space, string inl, space, string(Int.toString localCount ^ " locals,"), space, printList ("closure=", map Extract closure, ","), space, prettyUses "recursive use=" recUse, space, string "*)" ]), PrettyBreak(1, 2), pretty body ]) end | Constnt(w, m) => if isShort w andalso toShort w = 0w0 then ( case List.find (Universal.tagIs CodeTags.inlineCodeTag) m of SOME h => ( case Universal.tagProject CodeTags.inlineCodeTag h of EnvSpecInlineFunction(lambda, _) => pretty(Lambda lambda) | _ => PrettyString (stringOfWord w) ) | NONE => PrettyString (stringOfWord w) ) else PrettyString (stringOfWord w) | Cond (f, s, t) => PrettyBlock (0, true, [], [ PrettyBlock(2, false, [], [string "if", space, pretty f]), space, PrettyBlock(2, false, [], [string "then", space, pretty s]), space, PrettyBlock(2, false, [], [string "else", space, pretty t]) ] ) | Newenv(decs, final) => PrettyBlock (0, true, [], [ string "let", PrettyBreak (1, 2), PrettyBlock(2, true, [], pList(decs, ";", prettyBinding)), space, string "in", PrettyBreak(1, 2), PrettyBlock(2, true, [], [pretty final]), space, string "end" ] ) | BeginLoop{loop=loopExp, arguments=args } => let fun prettyArg (c, _) = prettySimpleBinding c in PrettyBlock (3, false, [], [ PrettyBlock (1, true, [], PrettyString ("BEGINLOOP(") :: pList(args, ",", prettyArg) @ [ PrettyBreak (0, 0), PrettyString (")") ] ), PrettyBreak (0, 0), PrettyString "(", PrettyBreak (0, 0), pretty loopExp, PrettyBreak (0, 0), PrettyString ")" ] ) end | Loop ptl => prettyArgs("LOOP", ptl, ",") | Raise c => PrettyBlock (1, true, [], [ PrettyString "RAISE(", pretty c, PrettyBreak (0, 0), PrettyString (")") ] ) | Handle {exp, handler, ...} => PrettyBlock (3, false, [], [ PrettyString "HANDLE(", pretty exp, PrettyString "WITH", PrettyBreak (1, 0), pretty handler, PrettyString ")" ] ) | Ldexc => PrettyString "LDEXC" | Tuple { fields, isVariant } => printList(if isVariant then "DATATYPE" else "TUPLE", fields, ",") | SetContainer{container, tuple, filter} => let val source = BoolVector.length filter val dest = BoolVector.foldl(fn (true, n) => n+1 | (false, n) => n) 0 filter in PrettyBlock (3, false, [], [ string (concat["SETCONTAINER(", Int.toString dest, "/", Int.toString source, ", "]), pretty container, PrettyBreak (0, 0), PrettyString ",", PrettyBreak (1, 0), pretty tuple, PrettyBreak (0, 0), PrettyString ")" ] ) end | TagTest { test, tag, maxTag } => PrettyBlock (3, false, [], [ PrettyString (concat["TAGTEST(", Word.toString tag, ", ", Word.toString maxTag, ","]), PrettyBreak (1, 0), pretty test, PrettyBreak (0, 0), PrettyString ")" ] ) (* That list should be exhaustive! *) end (* pretty *) and prettyBinding(Declar dec) = prettySimpleBinding dec | prettyBinding(RecDecs ptl) = let fun prettyRDec {lambda, addr, use, ...} = block [ string ("Local" ^ Int.toString addr), space, string "(*", prettyUses "" use, space, string "*)", space, string "=", PrettyBreak (1, 2), PrettyBlock (2, false, [], [pretty(Lambda lambda)]) ] in PrettyBlock(0, true, [], string "val rec " :: pList(ptl, " and ", prettyRDec) ) end | prettyBinding(NullBinding c) = pretty c | prettyBinding(Container{addr, use, size, setter}) = PrettyBlock(1, false, [], [ string ("val Local" ^ Int.toString addr), space, string "(*", string "", space, prettyUses "" use, space, string "*)", space, string ("= Container " ^ Int.toString size), space, string "with", space, pretty setter ] ) and prettySimpleBinding{value, addr, use, ...} = PrettyBlock (1, false, [], [ string ("val Local" ^ Int.toString addr), space, string "(*", string "", space, prettyUses "" use, space, string "*)", space, string "=", PrettyBreak (1, 2), PrettyBlock (2, false, [], [pretty value]) ] ) and prettyUses prefix cl = PrettyBlock (1, true, [], PrettyString (prefix ^ "[") :: pList(cl, ",", prettyUsage) @ [ PrettyBreak (0, 0), PrettyString ("]") ] ) and prettyUsage UseGeneral = PrettyString "_" | prettyUsage UseExport = PrettyString "Export" | prettyUsage (UseApply (cl, al)) = PrettyBlock (1, true, [], string "(" :: pList(al, "|", fn _ => string "-") @ string ")" :: space :: string "->" :: space :: string "(" :: pList(cl, "|", prettyUsage) @ [ PrettyBreak (0, 0), string ")" ] ) | prettyUsage (UseField (n, cl)) = PrettyBlock (1, true, [], string ("UseField"^ Int.toString n ^ "[") :: pList(cl, ",", prettyUsage) @ [ PrettyBreak (0, 0), string "]" ] ) (* Mapping function to enable parts of the tree to be replaced. *) fun mapCodetree f code = let (* We use these functions to allow all nodes to be processed even if they are not full codetree nodes. *) fun deExtract(Extract l) = l | deExtract _ = raise Misc.InternalError "deExtract" fun deLambda (Lambda l) = l | deLambda _ = raise Misc.InternalError "deLambda" fun mapt (Newenv(decs, exp)) = let fun mapbinding(Declar{value, addr, use}) = Declar{value=mapCodetree f value, addr=addr, use=use} | mapbinding(RecDecs l) = RecDecs(map(fn {addr, lambda, use} => {addr=addr, use = use, lambda = deLambda(mapCodetree f (Lambda lambda))}) l) | mapbinding(NullBinding exp) = NullBinding(mapCodetree f exp) | mapbinding(Container{addr, use, size, setter}) = Container{addr=addr, use=use, size=size, setter=mapCodetree f setter} in Newenv(map mapbinding decs, mapCodetree f exp) end | mapt (c as Constnt _) = c | mapt (e as Extract _) = e | mapt (Indirect { base, offset, isVariant }) = Indirect{ base = mapCodetree f base, offset = offset, isVariant = isVariant } | mapt (Eval { function, argList, resultType }) = Eval { function = mapCodetree f function, argList = map (fn(c, a) => (mapCodetree f c, a)) argList, resultType = resultType } | mapt (Lambda { body, isInline, name, closure, argTypes, resultType, localCount, recUse }) = Lambda { body = mapCodetree f body, isInline = isInline, name = name, closure = map (deExtract o (mapCodetree f) o Extract) closure, argTypes = argTypes, resultType = resultType, localCount = localCount, recUse = recUse } | mapt (Cond(i, t, e)) = Cond(mapCodetree f i, mapCodetree f t, mapCodetree f e) | mapt (BeginLoop{loop, arguments}) = BeginLoop { loop = mapCodetree f loop, arguments = map(fn({value, addr, use}, t) => ({value=mapCodetree f value, addr=addr, use=use}, t)) arguments } | mapt (Loop l) = Loop (map(fn(c, t) => (mapCodetree f c, t)) l) | mapt (Raise r) = Raise(mapCodetree f r) | mapt Ldexc = Ldexc | mapt (Handle{exp, handler}) = Handle{exp=mapCodetree f exp, handler=mapCodetree f handler } | mapt (Tuple { fields, isVariant} ) = Tuple { fields = map (mapCodetree f) fields, isVariant = isVariant } | mapt (SetContainer{container, tuple, filter}) = SetContainer{ container = mapCodetree f container, tuple = mapCodetree f tuple, filter = filter } | mapt (TagTest{test, tag, maxTag}) = TagTest{test = mapCodetree f test, tag = tag, maxTag = maxTag } in (* Apply f to node. If it returns SOME c use that otherwise traverse the tree. *) case f code of SOME c => c | NONE => mapt code end (* Fold a function over the tree. f is applied to the node and the input value and returns an output and a flag. If the flag is FOLD_DONT_DESCEND the output value is used and the code tree is not examined further. Otherwise this function descends into the tree and folds over the subtree. *) datatype foldControl = FOLD_DESCEND | FOLD_DONT_DESCEND fun foldtree (f: codetree * 'a -> 'a * foldControl) (input: 'a) code = let fun ftree (Newenv(decs, exp), v) = let fun foldbinding(Declar{value, ...}, w) = foldtree f w value | foldbinding(RecDecs l, w) = foldl(fn ({lambda, ...}, x) => foldtree f x (Lambda lambda)) w l | foldbinding(NullBinding exp, w) = foldtree f w exp | foldbinding(Container{setter, ...}, w) = foldtree f w setter in foldtree f (foldl foldbinding v decs) exp end | ftree (Constnt _, v) = v | ftree (Extract _, v) = v | ftree (Indirect{base, ...}, v) = foldtree f v base | ftree (Eval { function, argList, ...}, v) = foldl(fn((c, _), w) => foldtree f w c) (foldtree f v function) argList | ftree (Lambda { body, closure, ...}, v) = foldtree f (foldl (fn (c, w) => foldtree f w (Extract c)) v closure) body | ftree (Cond(i, t, e), v) = foldtree f (foldtree f (foldtree f v i) t) e | ftree (BeginLoop{loop, arguments, ...}, v) = foldtree f (foldl (fn (({value, ...}, _), w) => foldtree f w value) v arguments) loop | ftree (Loop l, v) = foldl (fn ((c, _), w) => foldtree f w c) v l | ftree (Raise r, v) = foldtree f v r | ftree (Ldexc, v) = v | ftree (Handle{exp, handler}, v) = foldtree f (foldtree f v exp) handler | ftree (Tuple { fields, ...}, v) = foldl (fn (c, w) => foldtree f w c) v fields | ftree (SetContainer { container, tuple, ...}, v) = foldtree f (foldtree f v container) tuple | ftree (TagTest{test, ...}, v) = foldtree f v test in case f (code, input) of (v, FOLD_DONT_DESCEND) => v | (v, FOLD_DESCEND) => ftree(code, v) end structure Sharing = struct type codetree = codetree and pretty = pretty and inlineStatus = inlineStatus and argumentType = argumentType and codeBinding = codeBinding and simpleBinding = simpleBinding and loadForm = loadForm and envGeneral = envGeneral and envSpecial = envSpecial and codeUse = codeUse and foldControl = foldControl end end; polyml-5.6/mlsource/MLCompiler/CodeTree/BaseCodeTreeSig.sml000066400000000000000000000141531265146633400237110ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2008-2010, 2013 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Signature for the basic codetree types and operations. *) signature BaseCodeTreeSig = sig type machineWord = Address.machineWord datatype inlineStatus = NonInline | Inline datatype argumentType = GeneralType | FloatingPtType (* How variables are used. Added and examined by the optimisation pass. *) datatype codeUse = UseGeneral (* Used in some other context. *) | UseExport (* Exported i.e. the result of a top-level binding. *) | UseApply of codeUse list * codetree list (* Applied as a function - the list is where the result goes, the codetree list is the code that was used for each argument. *) | UseField of int * codeUse list (* Selected as a field - the list is where the result goes *) and codetree = Newenv of codeBinding list * codetree (* Set of bindings with an expression. *) | Constnt of machineWord * Universal.universal list (* Load a constant *) | Extract of loadForm | Indirect of {base: codetree, offset: int, isVariant: bool } (* Load a value from a heap record *) | Eval of (* Evaluate a function with an argument list. *) { function: codetree, argList: (codetree * argumentType) list, resultType: argumentType } | Lambda of lambdaForm (* Lambda expressions. *) | Cond of codetree * codetree * codetree (* If-statement *) | BeginLoop of (* Start of tail-recursive inline function. *) { loop: codetree, arguments: (simpleBinding * argumentType) list } | Loop of (codetree * argumentType) list (* Jump back to start of tail-recursive function. *) | Raise of codetree (* Raise an exception *) | Ldexc (* Load the exception (used at the start of a handler) *) | Handle of (* Exception handler. *) { exp: codetree, handler: codetree } | Tuple of { fields: codetree list, isVariant: bool } (* Tuples and datatypes *) | SetContainer of { container: codetree, tuple: codetree, filter: BoolVector.vector} (* Copy a tuple to a container. *) | TagTest of { test: codetree, tag: word, maxTag: word } and codeBinding = Declar of simpleBinding (* Make a local declaration or push an argument *) | RecDecs of { addr: int, lambda: lambdaForm, use: codeUse list } list (* Set of mutually recursive declarations. *) | NullBinding of codetree (* Just evaluate the expression and discard the result. *) | Container of { addr: int, use: codeUse list, size: int, setter: codetree } and loadForm = LoadArgument of int | LoadLocal of int | LoadClosure of int | LoadRecursive (* When we look up an entry in the environment we get a pair of a "general" value, which is either a constant or a load, and an optional special value, which is either a tuple or an inline function. Tuple entries are functions from an integer offset to one of these pairs; inline function entries are a lambda together with a map for the free variables. *) and envGeneral = EnvGenLoad of loadForm | EnvGenConst of machineWord * Universal.universal list and envSpecial = EnvSpecNone | EnvSpecTuple of int * (int -> envGeneral * envSpecial) | EnvSpecInlineFunction of lambdaForm * (int -> envGeneral * envSpecial) withtype simpleBinding = { (* Declare a value or push an argument. *) value: codetree, addr: int, use: codeUse list } and lambdaForm = { (* Lambda expressions. *) body : codetree, (* The body of the function. *) isInline : inlineStatus, (* Whether it's inline - modified by optimiser *) name : string, (* Text name for profiling etc. *) closure : loadForm list, (* List of items for closure. *) argTypes : (argumentType * codeUse list) list, (* "Types" and usage of arguments. *) resultType : argumentType, (* Result "type" of the function. *) localCount : int, (* Maximum (+1) declaration address for locals. *) recUse : codeUse list (* Recursive use of the function *) } type pretty val pretty : codetree -> pretty val mapCodetree: (codetree -> codetree option) -> codetree -> codetree datatype foldControl = FOLD_DESCEND | FOLD_DONT_DESCEND val foldtree: (codetree * 'a -> 'a * foldControl) -> 'a -> codetree -> 'a structure CodeTags: sig val tupleTag: Universal.universal list list Universal.tag val inlineCodeTag: envSpecial Universal.tag val mergeTupleProps: Universal.universal list * Universal.universal list -> Universal.universal list end structure Sharing: sig type codetree = codetree and pretty = pretty and inlineStatus = inlineStatus and argumentType = argumentType and codeBinding = codeBinding and simpleBinding = simpleBinding and loadForm = loadForm and envGeneral = envGeneral and envSpecial = envSpecial and codeUse = codeUse and foldControl = foldControl end end; polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/000077500000000000000000000000001265146633400217365ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/CODE_SEG.ML000066400000000000000000000270641265146633400234110ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Code vector operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This module constructs and operates on segments for machine code. "csegMake" constructs and returns a segment of the specified size with give flag codes. The segment can be read and written a byte at a time using the "csegGet" procedure, and the code can be entered using "csegCall" (this is only used if the code is an "early" procedure which must be called by the compiler or is a declaration or expression at the outer level. More usually "csegAddr" is used to return the address of the segment which is then compiled into another procedure as a constant. When a procedure has been compiled "csegLock" is called to remove the "mutable" bit. The segment then becomes a constant and cannot be changed. It is used in two ways. Initially the code is assembled into a segment which expands as necessary so that there is always room for the code. When the code has been completely assembled and we know how much there is, it is copied into a segment of the correct size. *) structure CODE_SEG : (*****************************************************************************) (* CODESEG export signature *) (*****************************************************************************) (* We use "int" rather than "short" for the indexes, to try to keep *) (* the interface complexity in this module. SPF 14/7/94 *) sig type machineWord; (* added 14/7/94 SPF *) type short; (* added 15/7/94 SPF *) type address; (* added 14/7/94 SPF *) type cseg; val csegMake: int -> cseg; val csegConvertToCode: cseg -> unit; val csegLock: cseg -> unit; val csegGet: cseg * int -> Word8.word; val csegSet: cseg * int * Word8.word -> unit; val csegGetWord: cseg * int -> machineWord; val csegPutWord: cseg * int * machineWord -> unit; val csegCopySeg: cseg * cseg * int * int -> unit; val csegAddr: cseg -> address; val csegPutConstant: cseg * int * machineWord * 'a -> unit; end = (*****************************************************************************) (* CODESEG functor body *) (*****************************************************************************) struct open Address; open Misc; datatype csegStatus = Bytes | UnlockedCode | LockedCode type cseg = (csegStatus * address) ref; fun objLength (a : address) : int = Word.toInt (length a); val expansionFactor = 3; (* Factor by which to increase size of segment *) val F_mutable_bytes = Word8.orb (F_mutable, F_bytes); val F_mutable_code = Word8.orb (F_mutable, F_code); fun csegMake (size : int) : cseg = let val vec : address = alloc (Word.fromInt size, F_mutable_bytes, toMachineWord 0); in ref (Bytes, vec) end; fun csegConvertToCode (r as ref (Bytes, addr)) : unit = let val () = setFlags (addr, F_mutable_code); in r := (UnlockedCode, addr) end | csegConvertToCode _ = raise InternalError "csegConvertToCode: not a byte segment"; fun csegLock (r as ref (UnlockedCode, addr)) : unit = let val () = setFlags (addr, F_code); in r := (LockedCode, addr) end | csegLock _ = raise InternalError "csegConvertToCode: not an unlocked code segment"; fun csegAddr (ref (status, addr)) : address = if status = Bytes then raise InternalError "csegAddr: not a code segment" else addr; (* The old comment said: Copies the first "length" words from the start of "fromVec" to the "offset" words in "toVec". Which is right, except that it copies the first length BYTES, not words, even though "offset" is in words! *) fun csegCopySeg (ref (Bytes, fromAddr), ref (Bytes, toAddr), lengthBytes : int, offsetWords : int) = let val fromLengthWords : int = objLength fromAddr; val toLengthWords : int = objLength toAddr; val fromLengthBytes : int = wordSize * fromLengthWords; val toLengthBytes : int = wordSize * toLengthWords; val offsetBytes : int = wordSize * offsetWords (* Copy the data a byte at a time (rather than a word) because the bytes copied might look like bad addresses. Note: this makes the rather rash assumption that we're copying the "code" part of the cseg, not the "constants" part, which *should* be copied a word at a time, since otherwise we could have a garbage collection while we're half-way through copying a pointer. We need to completely redesign this module to fix this problem. SPF 14/7/94. The redesign is that you shouldn't put ML constants into a codeseg without calling csegConvertToCode first. SPF 13/2/97 *) fun copyBytes (fromPtr:int) (toPtr:int) = if fromPtr = lengthBytes then () else let val byte = loadByte (fromAddr, Word.fromInt fromPtr); in assignByte (toAddr, Word.fromInt toPtr, byte); copyBytes (fromPtr + 1) (toPtr + 1) end (* must check: 0 <= lengthBytes <= fromLengthBytes 0 <= offsetWords offsetBytes + lengthBytes <= toLengthBytes *) val maxOffsetBytes = toLengthBytes - lengthBytes; in (* Check the lengths are in the range. *) if lengthBytes < 0 orelse fromLengthBytes < lengthBytes then let val msg = concat [ "csegCopySeg: Byte length ", Int.toString lengthBytes, " out of range 0..", Int.toString fromLengthBytes ] in raise InternalError msg end else if offsetBytes < 0 orelse maxOffsetBytes < offsetBytes then let val msg = concat [ "csegCopySeg: Byte offset ", Int.toString offsetBytes, " out of range 0..", Int.toString maxOffsetBytes ] in raise InternalError msg end else copyBytes 0 offsetBytes end | csegCopySeg _ = raise InternalError "csegCopySeg: can only copy between byte segements" (* Returns a value from the vector. *) fun csegGet (ref (_, addr), byteIndex : int) : Word8.word = let val lengthWords = objLength addr; val lengthBytes = wordSize * lengthWords; in if 0 <= byteIndex andalso byteIndex < lengthBytes then loadByte (addr, Word.fromInt byteIndex) else let val msg = concat [ "csegGet: Index ", Int.toString byteIndex, " out of range 0..", Int.toString lengthBytes ] in raise InternalError msg end end; fun csegSet (ref (LockedCode, _), _, _) : unit = raise InternalError "csegSet: can't change locked code segement" | csegSet (r as (ref (status, addr)), byteIndex:int, value:Word8.word) : unit = let val lengthWords : int = objLength addr; val lengthBytes : int = wordSize * lengthWords; in if byteIndex < 0 then let val msg = concat [ "csegSet: Index ", Int.toString byteIndex, " out of range 0..infinity" ] in raise InternalError msg end else if byteIndex < lengthBytes then assignByte (addr, Word.fromInt byteIndex, value) else if status <> Bytes then raise InternalError "csegSet: can't extend code segment" else let (* length <= byteIndex; construct a new segment*) val oldSize : int = lengthWords; (* size in words *) val expSize : int = expansionFactor * oldSize; val wordIndex : int = byteIndex div wordSize; val minSize : int = wordIndex + 1; val newSize : int = Int.max(expSize, minSize); (* create temporary codeseg (with larger byte-vector) *) val newVec = alloc (Word.fromInt newSize, F_bytes, toMachineWord 0); val newSeg = (Bytes, newVec); in (* copy the old code into the new codeseg *) csegCopySeg (r, ref newSeg, lengthBytes, 0); (* assign the byte to the new codeseg's byte-vector *) assignByte (newVec, Word.fromInt byteIndex, value); (* update the old segment to point at the new byte-vector *) r := newSeg end end; (* Puts in a word at a given word offset. Does not expand the segment. *) fun csegPutWord (ref (UnlockedCode, addr), wordIndex:int, value:machineWord) : unit = let val lengthWords : int = objLength addr; in if wordIndex < 0 orelse lengthWords <= wordIndex then let val msg = concat [ "csegPutWord: Index ", Int.toString wordIndex, " out of range 0..", Int.toString lengthWords ] in raise InternalError msg end else assignWord (addr, Word.fromInt wordIndex, value) end | csegPutWord _ = raise InternalError "csegPutWord: not an unlocked code segment" (* Gets a word at a given word offset. Does not expand the segment. *) fun csegGetWord (ref (status, addr), wordIndex : int) : machineWord = let val lengthWords : int = objLength addr; in if status = Bytes then raise InternalError "csegGetWord: can't load a a word from a byte segment" else if wordIndex < 0 orelse lengthWords <= wordIndex then let val msg = concat [ "csegGetWord: Index ", Int.toString wordIndex, " out of range 0..", Int.toString lengthWords ] in raise InternalError msg end else loadWord (addr, Word.fromInt wordIndex) end; (* csegPutConstant: store a constant into the code. Exactly how this is done is architecture dependent: on the i386 it's simply a store, on other architectures the constant may have to be split between instructions. This means that it has to be done by the RTS so as to be certain that we don't have a garbage collection with an invalid address. DCJM 2/1/01. *) fun csegPutConstant (ref (UnlockedCode, addr), byteIndex:int, value:machineWord, data: 'a) : unit = let val lengthWords : int = objLength addr; val lengthBytes : int = wordSize * lengthWords; in if byteIndex < 0 orelse lengthBytes <= byteIndex then let val msg = concat [ "csegPutConstant: Index ", Int.toString byteIndex, " out of range 0..", Int.toString lengthWords ] in raise InternalError msg end else RunCall.run_call4 RuntimeCalls.POLY_SYS_set_code_constant (addr, Word.fromInt byteIndex, value, data) end | csegPutConstant _ = raise InternalError "csegPutConstant: not an unlocked code segment" end; (* CODE_SEG *) polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/CodeSeg.ML000066400000000000000000000015511265146633400235030ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CodeSeg = CODE_SEG; polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/INTCODECONS.ML000066400000000000000000002263211265146633400237460ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further development Copyright (c) 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Code Generator Routines. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This module contains the code vector and operations to insert code into it. Each procedure is compiled into a separate segment. Initially it is compiled into a fixed size segment, and then copied into a segment of the correct size at the end. *) functor INTCODECONS ( structure DEBUG: DEBUGSIG (*****************************************************************************) (* PRETTY for compilerOutTag *) (*****************************************************************************) structure PRETTY: PRETTYSIG (*****************************************************************************) (* MISC *) (*****************************************************************************) structure MISC : sig exception InternalError of string end ) : (*****************************************************************************) (* CODECONS export signature *) (*****************************************************************************) sig type machineWord; type address; type code; type opcode; eqtype addrs; (*hacky! *) type labels; val noJump: labels; val jumpFalse : opcode; val jump : opcode; val setHandler : opcode; val delHandler : opcode; val addrPlus : addrs * int -> addrs; val addrMinus : addrs * addrs -> int; val codeCreate: bool * string * Universal.universal list -> code; (* makes the initial segment. *) (* ic - Address for the next instruction in the segment. *) val ic: code -> addrs; (* putBytes : puts "length" bytes of "val" into locations "addr", "addr"+1 *) val putBytes: int * int * addrs * code -> unit; (* GEN- routines all put a value at the instruction counter and add an appropriate amount to it. *) (* genWord - Puts 2 bytes. *) val genWord : int * code -> unit; (* gen... - put instructions and their operands. *) val genCallClosure : code -> unit; val genRaiseEx : code -> unit; val genLock : code -> unit; val genLdexc : code -> unit; val genPushHandler : code -> unit; val genReturn : int * code -> unit; val genGetStore : int * code -> unit; val genLocal : int * code -> unit; val genIndirect : int * code -> unit; val genMoveToVec : int * code -> unit; val genSetStackVal : int * code -> unit; val genCase : int * code -> unit; val genTuple : int * code -> unit; val genTailCall : int * int * code -> unit; val genNonLocal : int * int * int * code -> unit; (* genEnter instructions are only needed when machine-code routines can call interpreted routines or vice-versa. The enterInt instruction causes the interpreter to be entered and the argument indicates the reason. *) val genEnterIntCatch : code -> unit; val genEnterIntProc : code * int -> unit; val genEnterIntCall : code * int -> unit; (* pushConst - Generates code to push a constant. *) val pushConst : machineWord * code -> unit; (* genRecRef - Recursive reference to a procedure. *) val genRecRef: code * code -> unit (* Create a container on the stack *) val genContainer : int * code -> unit; (* Create a tuple from a container. *) val genTupleFromContainer : int * code -> unit; (* copyCode - Finish up after compiling a procedure. *) val copyCode : code -> address; (* getBytes - gets "length" bytes from locations "addr", "addr"+1... Returns a negative number if the first bit was set. *) val getBytes: int * addrs * code -> int; (* putBranchInstruction puts in an instruction which involves a forward reference. *) val putBranchInstruction: opcode * code -> labels; (* Instruction to delete a handler and skip round it. *) val fixup: labels * code -> unit; (* Fix up a forward reference. *) val linkLabels: labels * labels * code -> labels; (* Link label lists. *) val jumpback: addrs * code -> unit (* Backwards jump. *) val resetStack: int * bool * code -> unit; (* Set a pending reset *) val alignOffWord: code * int -> unit; (* Add a pad byte if the value would be word-aligned. *) end (* CODECONS export signature *) = let (*****************************************************************************) (* CODESEG *) (*****************************************************************************) structure CODESEG : sig type machineWord; type short; type address; type cseg; val csegMake: int -> cseg; val csegConvertToCode: cseg -> unit; val csegLock: cseg -> unit; val csegGet: cseg * int -> Word8.word; val csegSet: cseg * int * Word8.word -> unit; val csegPutWord: cseg * int * machineWord -> unit; val csegCopySeg: cseg * cseg * int * int -> unit; val csegAddr: cseg -> address; end = CodeSeg; (*****************************************************************************) (* ADDRESS *) (*****************************************************************************) structure ADDRESS : AddressSig = Address in (*****************************************************************************) (* CODECONS functor body *) (*****************************************************************************) struct open CODESEG; open DEBUG; open ADDRESS; open MISC; (* The original way of dealing with constants was to store the offset (in bytes) of the constant from the end of the instruction. That has a problem when the database is ported to a different word-length machine because while the byte count to the end of the interpreted code does not change the marker word and other constants will all have a different length. I've changed it to use new instructions which take an extra argument which is the number of the constant. The byte offset is then always the number of bytes to the end of the code. DCJM 25/9/00. *) val usePortableConstantOffset = false; (* To make the code portable these are both functions. Note that similar changes are needed in Code_seg.ML and in the basis library. DCJM 28/9/00. *) (* Unfortunately the code-generator always evaluates these at compile time if it can. We need to use a ref to force it not to. It's too complicated making this completely word-length independent but it's useful to have it byte-order independent. *) local val bigEndian = ref RuntimeCalls.POLY_SYS_is_big_endian in fun littleEndian () : bool = not (RunCall.run_call0 (! bigEndian) ()) end; val wordLength : unit->int = RunCall.run_call0 RuntimeCalls.POLY_SYS_bytes_per_word; val MAXINTARGS = (* 31 *) 126; fun forLoop f i n = if i > n then () else (f i; forLoop f (i + 1) n); fun applyList (_, []) = () | applyList (f, h::t) = let val () = f h; in applyList (f, t) end; fun applyCountList (_, _, []) = () | applyCountList (f, n, h::t) = let val () = f (n, h); in applyCountList (f, n + 1, t) end; (*****************************************************************************) (* Abstype for instruction addresses *) (*****************************************************************************) infix 6 addrPlus addrMinus; infix 4 (* ? *) addrLt; (* All indexes into the code vector have type "addrs" *) (* This should be an abstype, but it's exported as an eqtype *) datatype addrs = Addr of int (* + is defined to add an integer to an address *) fun (Addr a) addrPlus b = Addr (a + b); (* The difference between two addresses is an integer *) fun (Addr a) addrMinus (Addr b) = a - b; fun (Addr a) addrLt (Addr b) = a < b; fun mkAddr n = Addr n; (* addr.up *) fun getAddr (Addr a) = a; (* addr.down *) val addrZero = mkAddr 0; val addrLast = mkAddr (Word.toInt (Word.<<(0w1, 0w29)) - 1); (* A big number. *) (*****************************************************************************) (* Opcodes *) (*****************************************************************************) (* These instructions are only needed during porting between interpreted and machine-code versions. The first should be the interrupt or break-point instruction of the host machine-code and causes the machine to enter the interpreter. It is ignored by the interpreter except immediately after the interpreter has been entered when result registers may be pushed depending on the argument. The second instruction should be a no-op in the machine code instruction set and has the reverse effect. It is never generated by this code-generator but it is needed in machine-code code-generators. Note: indirect forms of jumps are assumed to have the opcode 4 more than the corresponding direct form. *) local (* Not an abstype, because we we require the equality attribute *) datatype opcode = Opcode of int; in type opcode = opcode; fun opcode_down (Opcode n) : int = n; fun opcode_up (n : int) : opcode = Opcode n; val opcode_enterInt = Opcode 0; (* Opcode 1 reserved for Interpreter's internal use *) val opcode_jump = Opcode 2; val opcode_jumpFalse = Opcode 3; val opcode_containerW = Opcode 4; (* Added DCJM 5/10/05. *) val opcode_delHandler = Opcode 5; val opcode_jumpIFalse = Opcode 7; val opcode_set_containerW = Opcode 8; (* Added DCJM 5/10/05. *) val opcode_delHandlerI = Opcode 9; val opcode_caseSwitch = Opcode 10; val opcode_callSl = Opcode 11; val opcode_callClosure = Opcode 12; val opcode_returnW = Opcode 13; val opcode_pad = Opcode 14; val opcode_jumpI = Opcode 15 (* Moved from 6 because this is unsigned *) val opcode_raiseEx = Opcode 16; val opcode_getStoreW = Opcode 17; val opcode_nonLocal = Opcode 18; val opcode_localW = Opcode 19; val opcode_indirectW = Opcode 20; val opcode_moveToVecW = Opcode 21; val opcode_callSlX = Opcode 22; (* Added DCJM 25/9/00. *) val opcode_setStackValW = Opcode 23; val opcode_resetW = Opcode 24; val opcode_resetR_w = Opcode 25; val opcode_constAddr = Opcode 26; val opcode_constIntW = Opcode 27; val opcode_ioVecEntry = Opcode 28; val opcode_constNil = Opcode 29; val opcode_jumpBack8 = Opcode 30; val opcode_returnB = Opcode 31; val opcode_jumpBack16 = Opcode 32 val opcode_getStoreB = Opcode 33; val opcode_localB = Opcode 34; val opcode_indirectB = Opcode 35; val opcode_moveToVecB = Opcode 36; val opcode_setStackValB = Opcode 37; val opcode_resetB = Opcode 38; val opcode_resetRB = Opcode 39; val opcode_constIntB = Opcode 40; val opcode_local_0 = Opcode 41; val opcode_local_1 = Opcode 42; val opcode_local_2 = Opcode 43; val opcode_local_3 = Opcode 44; val opcode_local_4 = Opcode 45; val opcode_local_5 = Opcode 46; val opcode_local_6 = Opcode 47; val opcode_local_7 = Opcode 48; val opcode_local_8 = Opcode 49; val opcode_local_9 = Opcode 50; val opcode_local_10 = Opcode 51; val opcode_local_11 = Opcode 52; val opcode_indirect_0 = Opcode 53; val opcode_indirect_1 = Opcode 54; val opcode_indirect_2 = Opcode 55; val opcode_indirect_3 = Opcode 56; val opcode_indirect_4 = Opcode 57; val opcode_indirect_5 = Opcode 58; val opcode_const_0 = Opcode 59; val opcode_const_1 = Opcode 60; val opcode_const_2 = Opcode 61; val opcode_const_3 = Opcode 62; val opcode_const_4 = Opcode 63; val opcode_const_10 = Opcode 64; val opcode_return_0 = Opcode 65; val opcode_return_1 = Opcode 66; val opcode_return_2 = Opcode 67; val opcode_return_3 = Opcode 68; val opcode_moveToVec_0 = Opcode 69; val opcode_moveToVec_1 = Opcode 70; val opcode_moveToVec_2 = Opcode 71; val opcode_moveToVec_3 = Opcode 72; val opcode_moveToVec_4 = Opcode 73; val opcode_moveToVec_5 = Opcode 74; val opcode_moveToVec_6 = Opcode 75; val opcode_moveToVec_7 = Opcode 76; val opcode_constAddrX_b = Opcode 77; (* Added DCJM 25/9/00. *) val opcode_constAddrX_w = Opcode 78; (* Added DCJM 25/9/00. *) val opcode_callSlCX = Opcode 79; (* Added DCJM 25/9/00. *) val opcode_reset_1 = Opcode 80; val opcode_reset_2 = Opcode 81; val opcode_getStore_2 = Opcode 82; val opcode_getStore_3 = Opcode 83; val opcode_getStore_4 = Opcode 84; val opcode_tuple_containerW = Opcode 85; (* Added DCJM 5/10/05. *) val opcode_nonLocalL_1 = Opcode 86; val opcode_nonLocalL_2 = Opcode 87; val opcode_nonLocalL_3 = Opcode 88; val opcode_callSlC = Opcode 89; val opcode_ioVec_5 = Opcode 90; val opcode_ioVec_6 = Opcode 91; (* val opcode_integerAdd = Opcode 92; val opcode_integerMinus = Opcode 93; val opcode_integerEqual = Opcode 94; val opcode_integerLeq = Opcode 95; val opcode_integerGreater = Opcode 96; val opcode_booleanOr = Opcode 97; val opcode_wordEqual = Opcode 98; val opcode_assignWord = Opcode 99;*) val opcode_resetR_1 = Opcode 100; val opcode_resetR_2 = Opcode 101; val opcode_resetR_3 = Opcode 102; val opcode_tupleW = Opcode 103; val opcode_tupleB = Opcode 104; val opcode_tuple_2 = Opcode 105; val opcode_tuple_3 = Opcode 106; val opcode_tuple_4 = Opcode 107; val opcode_lock = Opcode 108; val opcode_ldexc = Opcode 109; val opcode_ioVec_225 = Opcode 110; val opcode_ioVec_226 = Opcode 111; val opcode_ioVec_229 = Opcode 112; val opcode_ioVec_233 = Opcode 113; val opcode_ioVec_236 = Opcode 114; val opcode_ioVec_251 = Opcode 115; val opcode_ioVec_253 = Opcode 116; val opcode_ioVec_255 = Opcode 117; (*val opcode_setHandler = Opcode 118; *) (* Opcode 119 not used *) val opcode_pushHandler = Opcode 120; (* Opcode 121 not used *) (*val opcode_setHandlerI = Opcode 122;*) val opcode_tailbb = Opcode 123; val opcode_tail = Opcode 124; val opcode_tail3b = Opcode 125; val opcode_tail4b = Opcode 126; val opcode_tail3_2 = Opcode 127; val opcode_tail3_3 = Opcode 128; (* These have been moved since the old versions were for the old exception mechanism. *) val opcode_setHandler = Opcode 129 val opcode_setHandlerI = Opcode 130 (* val opcode_last = opcode_ioVec_225; *) local val repArray : string Array.array = Array.tabulate (256, fn (i : int) => ""); fun repUpdate (Opcode n, s) = Array.update (repArray, n, s); val () = repUpdate(opcode_enterInt, "enterInt"); val () = repUpdate(opcode_jump, "jump"); val () = repUpdate(opcode_jumpFalse, "jumpFalse"); val () = repUpdate(opcode_delHandler, "delHandler"); val () = repUpdate(opcode_jumpI, "jumpI"); val () = repUpdate(opcode_jumpIFalse, "jumpIFalse"); val () = repUpdate(opcode_delHandlerI, "delHandlerI"); val () = repUpdate(opcode_caseSwitch, "caseSwitch"); val () = repUpdate(opcode_callSl, "callSl"); val () = repUpdate(opcode_callSlX, "callSlX"); val () = repUpdate(opcode_callClosure, "callClosure"); val () = repUpdate(opcode_returnW, "returnW"); val () = repUpdate(opcode_pad, "pad"); val () = repUpdate(opcode_raiseEx, "raiseEx"); val () = repUpdate(opcode_getStoreW, "getStoreW"); val () = repUpdate(opcode_nonLocal, "nonLocal"); val () = repUpdate(opcode_localW, "localW"); val () = repUpdate(opcode_indirectW, "indirectW"); val () = repUpdate(opcode_moveToVecW, "moveToVecW"); val () = repUpdate(opcode_setStackValW, "setStackValW"); val () = repUpdate(opcode_resetW, "resetW"); val () = repUpdate(opcode_resetR_w, "resetR_w"); val () = repUpdate(opcode_constAddr, "constAddr"); val () = repUpdate(opcode_constAddrX_b, "constAddrX_b"); val () = repUpdate(opcode_constAddrX_w, "constAddrX_w"); val () = repUpdate(opcode_constIntW, "constIntW"); val () = repUpdate(opcode_ioVecEntry, "ioVecEntry"); val () = repUpdate(opcode_constNil, "constNil"); val () = repUpdate(opcode_jumpBack8, "jumpBack8"); val () = repUpdate(opcode_returnB, "returnB"); val () = repUpdate(opcode_jumpBack16, "jumpBack16"); val () = repUpdate(opcode_getStoreB, "getStoreB"); val () = repUpdate(opcode_localB, "localB"); val () = repUpdate(opcode_indirectB, "indirectB"); val () = repUpdate(opcode_moveToVecB, "moveToVecB"); val () = repUpdate(opcode_setStackValB, "setStackValB"); val () = repUpdate(opcode_resetB, "resetB"); val () = repUpdate(opcode_resetRB, "resetRB"); val () = repUpdate(opcode_constIntB, "constIntB"); val () = repUpdate(opcode_local_0, "local_0"); val () = repUpdate(opcode_local_1, "local_1"); val () = repUpdate(opcode_local_2, "local_2"); val () = repUpdate(opcode_local_3, "local_3"); val () = repUpdate(opcode_local_4, "local_4"); val () = repUpdate(opcode_local_5, "local_5"); val () = repUpdate(opcode_local_6, "local_6"); val () = repUpdate(opcode_local_7, "local_7"); val () = repUpdate(opcode_local_8, "local_8"); val () = repUpdate(opcode_local_9, "local_9"); val () = repUpdate(opcode_local_10, "local_10"); val () = repUpdate(opcode_local_11, "local_11"); val () = repUpdate(opcode_indirect_0, "indirect_0"); val () = repUpdate(opcode_indirect_1, "indirect_1"); val () = repUpdate(opcode_indirect_2, "indirect_2"); val () = repUpdate(opcode_indirect_3, "indirect_3"); val () = repUpdate(opcode_indirect_4, "indirect_4"); val () = repUpdate(opcode_indirect_5, "indirect_5"); val () = repUpdate(opcode_const_0, "const_0"); val () = repUpdate(opcode_const_1, "const_1"); val () = repUpdate(opcode_const_2, "const_2"); val () = repUpdate(opcode_const_3, "const_3"); val () = repUpdate(opcode_const_4, "const_4"); val () = repUpdate(opcode_const_10, "const_10"); val () = repUpdate(opcode_return_0, "return_0"); val () = repUpdate(opcode_return_1, "return_1"); val () = repUpdate(opcode_return_2, "return_2"); val () = repUpdate(opcode_return_3, "return_3"); val () = repUpdate(opcode_moveToVec_0, "moveToVec_0"); val () = repUpdate(opcode_moveToVec_1, "moveToVec_1"); val () = repUpdate(opcode_moveToVec_2, "moveToVec_2"); val () = repUpdate(opcode_moveToVec_3, "moveToVec_3"); val () = repUpdate(opcode_moveToVec_4, "moveToVec_4"); val () = repUpdate(opcode_moveToVec_5, "moveToVec_5"); val () = repUpdate(opcode_moveToVec_6, "moveToVec_6"); val () = repUpdate(opcode_moveToVec_7, "moveToVec_7"); val () = repUpdate(opcode_reset_1, "reset_1"); val () = repUpdate(opcode_reset_2, "reset_2"); val () = repUpdate(opcode_getStore_2, "getStore_2"); val () = repUpdate(opcode_getStore_3, "getStore_3"); val () = repUpdate(opcode_getStore_4, "getStore_4"); val () = repUpdate(opcode_nonLocalL_1, "nonLocalL_1"); val () = repUpdate(opcode_nonLocalL_2, "nonLocalL_2"); val () = repUpdate(opcode_nonLocalL_3, "nonLocalL_3"); val () = repUpdate(opcode_callSlC, "callSlC"); val () = repUpdate(opcode_callSlCX, "callSlCX"); val () = repUpdate(opcode_ioVec_5, "ioVec_5"); val () = repUpdate(opcode_ioVec_6, "opcode_ioVec_6"); (* ... (* added missing instructions (not used yet!) SPF 28/6/95 *) (* Removed them again, becuase I'd rather see UNKNOWN if they ever get generated. SPF 9/1/96 *) val () = repUpdate(opcode_integerAdd, "integerAdd"); val () = repUpdate(opcode_integerMinus, "integerMinus"); val () = repUpdate(opcode_integerEqual, "integerEqual"); val () = repUpdate(opcode_integerLeq, "integerLeq"); val () = repUpdate(opcode_integerGreater,"integerGreater"); val () = repUpdate(opcode_booleanOr, "booleanOr"); val () = repUpdate(opcode_wordEqual, "wordEqual"); val () = repUpdate(opcode_assignWord, "assignWord"); ... *) val () = repUpdate(opcode_resetR_1, "resetR_1"); val () = repUpdate(opcode_resetR_2, "resetR_2"); val () = repUpdate(opcode_resetR_3, "resetR_3"); val () = repUpdate(opcode_tupleW, "tupleW"); val () = repUpdate(opcode_tupleB, "tupleB"); val () = repUpdate(opcode_tuple_2, "tuple_2"); val () = repUpdate(opcode_tuple_3, "tuple_3"); val () = repUpdate(opcode_tuple_4, "tuple_4"); val () = repUpdate(opcode_lock, "lock"); val () = repUpdate(opcode_ldexc, "ldexc"); val () = repUpdate(opcode_ioVec_225, "ioVec_225"); val () = repUpdate(opcode_ioVec_226, "ioVec_226"); val () = repUpdate(opcode_ioVec_229, "ioVec_229"); val () = repUpdate(opcode_ioVec_233, "ioVec_233"); val () = repUpdate(opcode_ioVec_236, "ioVec_236"); val () = repUpdate(opcode_ioVec_251, "ioVec_251"); val () = repUpdate(opcode_ioVec_253, "ioVec_253"); val () = repUpdate(opcode_ioVec_255, "ioVec_255"); val () = repUpdate(opcode_setHandler, "setHandler"); val () = repUpdate(opcode_pushHandler, "pushHandler"); val () = repUpdate(opcode_setHandlerI, "setHandlerI"); val () = repUpdate(opcode_tailbb, "tailbb"); val () = repUpdate(opcode_tail, "tail"); val () = repUpdate(opcode_tail3b, "tail3b"); val () = repUpdate(opcode_tail4b, "tail4b"); val () = repUpdate(opcode_tail3_2, "tail3_2"); val () = repUpdate(opcode_tail3_3, "tail3_3"); in fun repr (Opcode n) : string = Array.sub (repArray, n); end; local val sizeArray : int Array.array = Array.array (256, 1); fun sizeUpdate (Opcode n, s) = Array.update (sizeArray, n, s); val () = sizeUpdate(opcode_enterInt , 2); (* Restored DCJM 22/9/00. *) (* val () = sizeUpdate(opcode_enterInt , 4); *)(* SPF 30/1/97 *) val () = sizeUpdate(opcode_jump , 2); val () = sizeUpdate(opcode_jumpFalse , 2); val () = sizeUpdate(opcode_delHandler , 2); val () = sizeUpdate(opcode_jumpIFalse , 2); val () = sizeUpdate(opcode_delHandlerI , 2); val () = sizeUpdate(opcode_caseSwitch , 3); val () = sizeUpdate(opcode_callSl , 7); val () = sizeUpdate(opcode_callSlX , 9); val () = sizeUpdate(opcode_returnW , 3); val () = sizeUpdate(opcode_getStoreW , 3); val () = sizeUpdate(opcode_nonLocal , 7); val () = sizeUpdate(opcode_localW , 3); val () = sizeUpdate(opcode_indirectW , 3); val () = sizeUpdate(opcode_moveToVecW , 3); val () = sizeUpdate(opcode_setStackValW, 3); val () = sizeUpdate(opcode_resetW , 3); val () = sizeUpdate(opcode_resetR_w , 3); val () = sizeUpdate(opcode_constAddr , 3); val () = sizeUpdate(opcode_constAddrX_b , 4); val () = sizeUpdate(opcode_constAddrX_w , 5); val () = sizeUpdate(opcode_constIntW , 3); val () = sizeUpdate(opcode_ioVecEntry , 2); val () = sizeUpdate(opcode_jumpBack8 , 2); val () = sizeUpdate(opcode_returnB , 2); val () = sizeUpdate(opcode_jumpBack16 , 3); val () = sizeUpdate(opcode_getStoreB , 2); val () = sizeUpdate(opcode_localB , 2); val () = sizeUpdate(opcode_indirectB , 2); val () = sizeUpdate(opcode_moveToVecB , 2); val () = sizeUpdate(opcode_setStackValB, 2); val () = sizeUpdate(opcode_resetB , 2); val () = sizeUpdate(opcode_resetRB , 2); val () = sizeUpdate(opcode_constIntB , 2); val () = sizeUpdate(opcode_nonLocalL_1 , 2); val () = sizeUpdate(opcode_nonLocalL_2 , 2); val () = sizeUpdate(opcode_nonLocalL_3 , 2); val () = sizeUpdate(opcode_callSlC , 4); val () = sizeUpdate(opcode_callSlCX , 5); val () = sizeUpdate(opcode_tupleW , 3); val () = sizeUpdate(opcode_tupleB , 2); val () = sizeUpdate(opcode_setHandler , 2); val () = sizeUpdate(opcode_setHandlerI , 2); val () = sizeUpdate(opcode_tailbb , 3); val () = sizeUpdate(opcode_tail , 5); val () = sizeUpdate(opcode_tail3b , 2); val () = sizeUpdate(opcode_tail4b , 2); in fun size (Opcode n) : int = Array.sub (sizeArray, n); end; end; (* opcode abstype *) (*****************************************************************************) (* Types for branch labels *) (*****************************************************************************) (* The addrs is the address of the branch instruction, so we can fix up the branch later, NOT the address we're branching to, which we don't know when we generate the label. The cacheState indicates whether what was cached at the source of the jump. *) datatype jumpFrom = Jump8From of addrs (* branch instruction has 8-bit offset field *) | Jump16From of addrs; (* branch instruction has 16-bit offset field *) (* We need a jumpFrom ref, because we may have to indirect short branches via long branches if the offset won't fit into 14 bits *) type labels = (jumpFrom ref) list; val noJump : labels = []; (* This is the list of outstanding labels. Use a separate type from "labels" for extra security. *) type labList = (jumpFrom ref) list; (*****************************************************************************) (* The main "code" datatype *) (*****************************************************************************) datatype const = WVal of machineWord (* an existing constant *) | CVal of code (* a forward-reference to another function *) and setCodeseg = Unset | Set of cseg (* Used for completing forward references. *) and code = Code of { codeVec: cseg, (* This segment is used as a buffer. When the procedure has been code generated it is copied into a new segment of the correct size *) ic: addrs ref, (* Pointer to first free location in "codevec" *) constVec: const list ref, (* Vector of words to be put at end *) numOfConsts: int ref, (* size of constVec *) stackReset: int ref, (* Distance to reset the stack before the next instr. *) carry: bool ref, (* Should a value be moved down if stackReset <> 0? *) labelList: labList ref, (* List of outstanding short branches. *) longestBranch: addrs ref, (* Address of the earliest short branch.*) procName: string, (* Name of the procedure. *) otherCodes: code list ref, (* Other code vectors with forward references to this vector. *) resultSeg: setCodeseg ref, (* The segment as the final result. *) noClosure: bool, (* should we make a closure from this? *) constLoads: (addrs * int) list ref, (* where do we load constants? *) printAssemblyCode:bool, (* Whether to print the code when we finish. *) printStream: string->unit (* The stream to use *) }; (*****************************************************************************) (* Auxiliary functions on "code" *) (*****************************************************************************) fun codeVec (Code {codeVec,...}) = codeVec; fun ic (Code {ic,...}) = ic; fun constVec (Code {constVec,...}) = constVec; fun numOfConsts (Code {numOfConsts,...}) = numOfConsts; fun stackReset (Code {stackReset ,...}) = stackReset; fun carry (Code {carry,...}) = carry; fun labelList (Code {labelList,...}) = labelList; fun longestBranch (Code {longestBranch,...}) = longestBranch; fun procName (Code {procName,...}) = procName; fun otherCodes (Code {otherCodes,...}) = otherCodes; fun resultSeg (Code {resultSeg,...}) = resultSeg; fun noClosure (Code {noClosure,...}) = noClosure; fun constLoads (Code {constLoads,...}) = constLoads; fun scSet (Set x) = x | scSet _ = raise Match; fun isSet (Set _) = true | isSet _ = false val codesize = 32; (* bytes. Initial size of segment. *) (* Test for identity of the code segments by testing whether the numOfConsts ref is the same. N.B. NOT its contents. *) infix is; fun a is b = (numOfConsts a = numOfConsts b); fun sameConst (WVal w1, WVal w2) = wordEq (w1, w2) | sameConst (CVal c1, CVal c2) = c1 is c2 | sameConst (_, _) = false; (* create and initialise a code segment *) fun codeCreate (noClosure : bool, name : string, parameters) : code = let val words : int = codesize div wordLength(); val printStream = PRETTY.getSimplePrinter parameters; in Code { codeVec = csegMake words, (* a byte array *) ic = ref addrZero, constVec = ref [], numOfConsts = ref 0, stackReset = ref 0, (* stack adjustment in WORDs *) carry = ref false, labelList = ref [], longestBranch = ref addrLast, (* None so far *) procName = name, otherCodes = ref [], resultSeg = ref Unset, (* Not yet done *) noClosure = noClosure, constLoads = ref [], printAssemblyCode = DEBUG.getParameter DEBUG.assemblyCodeTag parameters, printStream = printStream } end; fun setLong (value : int, Addr a : addrs, seg : cseg) : unit = let fun putBytes(value, a, seg, i) = if i = wordLength() then () else ( csegSet(seg, if littleEndian() then a+i else a+wordLength()-i-1, Word8.fromInt(value mod 256)); putBytes(value div 256, a, seg, i+1) ) in putBytes(value, a, seg, 0) end; fun putByte (ival: int, Addr a, cvec: code) : unit = csegSet(codeVec cvec, a, Word8.fromInt (if ival < 0 then 256 + ival else ival)); fun genByte (ival: int, cvec: code) : unit = let val icVal : addrs = ! (ic cvec); val () = putByte (ival, icVal, cvec); in ic cvec := icVal addrPlus 1 end; fun genBytes (ival: int, length: int, cvec: code) : unit = let val () = genByte (ival mod 256, cvec); in if length = 1 then () else genBytes (ival div 256, length - 1, cvec) end; fun genWord (ival : int, cvec : code) : unit = genBytes (ival, 2, cvec); (* puts "length" bytes of "val" into locations "addr", "addr"+1... *) fun putBytes (ival : int, length : int, addr : addrs, cvec : code) : unit = let val () = putByte (ival mod 256, addr, cvec); in if length = 1 then () else putBytes (ival div 256, length - 1, addr addrPlus 1, cvec) end; fun getByte (Addr a, cvec : code) : int = Word8.toInt (csegGet (codeVec cvec, a)); (* Gets "length" bytes from locations "addr", "addr"+1... Returns an unsigned number. *) fun getB (length : int, addr : int, seg: cseg) : int = let val byte = Word8.toInt (csegGet (seg, addr)); in if length = 1 (* Top byte *) then byte else let val rest = getB (length - 1, addr + 1, seg); in rest * 256 + byte end end; fun getBytes (length: int, Addr a, cvec : code) : int = getB (length, a, codeVec cvec); fun resetSp (cvec: code) : unit = let val offset = !(stackReset cvec); val () = if offset < 0 then raise InternalError ("resetSp: bad reset value " ^ Int.toString offset) else if offset = 0 then () else if 255 <= offset then let val opc = if !(carry cvec) then opcode_resetR_w else opcode_resetW; val () = genByte (opcode_down opc, cvec); in genWord (offset, cvec) end else if !(carry cvec) then if 3 < offset then let val () = genByte (opcode_down opcode_resetRB, cvec); in genByte (offset, cvec) end else let val opc : int = opcode_down opcode_resetR_1 + offset - 1; in genByte(opc, cvec) end else if 2 < offset then let val () = genByte (opcode_down opcode_resetB, cvec); in genByte (offset, cvec) end else let val opc : int = opcode_down opcode_reset_1 + offset - 1; in genByte(opc, cvec) end in stackReset cvec := 0 end; (* resetSp *) (* The cvec holds a list of short branches so that they can be extended to long branches before they go out of range. If we fix up a short branch, we must call "removeLabel" to purge it from this list. To keep things simple, we call "removeLabel" whenever we fix up a jump - if the label is long, or if it doesn't appear in the list (which is the case for branches backwards), we just won't find it in the list. SPF 21/9/95 *) fun removeLabel (lab : addrs, cvec : code) : unit = let fun removeEntry ([]: labList) : labList = [] | removeEntry ((ref (Jump16From _)) :: t) = removeEntry t (* we discard all long jumps *) | removeEntry ((entry as ref (Jump8From addr)) :: t) = if lab = addr then removeEntry t else let val () = if addr addrLt !(longestBranch cvec) then longestBranch cvec := addr else (); in entry :: removeEntry t end; in (* We recompute the longest 14-bit branch. *) longestBranch cvec := addrLast; labelList cvec := removeEntry (! (labelList cvec)) end; fun fixupOffset (Jump8From addr, target, cvec) = let (* Offsets are calculated from the END of the instruction, which explains the "+ 1" *) val newOffset : int = target addrMinus (addr addrPlus 1); val () = if 0 <= newOffset andalso newOffset < 256 then () else raise InternalError "fixupOffset: jump too far (8-bit offset)" val oldOffset : int = getByte (addr, cvec); val () = if oldOffset = 0 then () else raise InternalError "fixupOffset: 8-bit branch already fixed up" (* We're about to fix up the jump, so remove it from the list of pending short jumps. *) val () = removeLabel (addr, cvec); in putByte (newOffset, addr, cvec) end | fixupOffset (Jump16From addr, target, cvec) = let (* Offsets are calculated from the END of the instruction, which explains the "+ 2" *) val newOffset = target addrMinus (addr addrPlus 2); val () = (* Jumps are unsigned. *) if 0 <= newOffset andalso newOffset < 65536 then () else raise InternalError "fixupOffset: jump too far (16-bit offset)" val oldOffset = getBytes (2, addr, cvec); val () = if oldOffset = 0 then () else raise InternalError "fixupOffset: 16-bit branch already fixed up" in putBytes (newOffset, 2, addr, cvec) end fun fixup ([] : labels, _: code) : unit = () | fixup (lab : labels, cvec: code) : unit = let (* Deal with any pending resets. *) val () = resetSp cvec; val target : addrs = ! (ic cvec); in applyList (fn (ref jf) => fixupOffset (jf, target, cvec), lab) end; (* Makes a new label and puts it in the list. *) fun makeLabel (cvec: code, addr: addrs) : labels = let (* All labels are created as short jumps *) val lab : jumpFrom ref = ref (Jump8From addr); val () = if addr addrLt !(longestBranch cvec) then longestBranch cvec := addr else (); (* Add to the list of pending fixups *) val () = labelList cvec := lab :: !(labelList cvec); in [lab] end; (* If the longest branch is close to going out of range it must be converted into a long form. If the size is large (e.g. casel/casew) then all labels should be converted. If we have just made an unconditional branch then we make the distance shorter. 220 is just a fairly conservative number. (Dave used a clever calculation, but I don't like too much cleverness.) This code isn't very clever because it uses a separate 16-bit extension for each original 8-bit jump. I think Dave's original code tried to use a single 16-bit extension per target (not per jump). Since this code is only for use in bootstrapping, simplicity is more important than efficiency (KISS!). SPF 7/1/97 *) fun checkBranchList (cvec: code, branched: bool, size: int): unit = let val maxDiff = 220 - size; fun convertLabels ([]:labList) : labList = [] | convertLabels (lab::labs) = let (* Process the list starting at the end. The reason for this is that more recent labels appear before earlier ones. We must put the earliest labels in first because they may be about to go out of range. *) val convertRest = convertLabels labs; in (* Now do this entry. *) case !lab of Jump16From _ => (* shouldn't happen? *) convertRest | Jump8From addr => let val here : addrs = !(ic cvec); in if maxDiff < here addrMinus addr then let (* Getting close - fix up the short branch to indirect via here *) (* Offsets are calculated from the END of the instruction, which explains the "+ 1" *) val newOffset : int = here addrMinus (addr addrPlus 1); val () = if 0 <= newOffset andalso newOffset < 256 then () else raise InternalError "checkBranchList: offset too large to convert" val oldOffset : int = getByte (addr, cvec); val () = if oldOffset = 0 then () else raise InternalError "checkBranchList: 8-bit offset already fixed up"; (* Convert the instruction to the "indirect" form *) val instrAddr : addrs = addr addrPlus ~1; val oldInstr = opcode_up(getByte (instrAddr, cvec)) val newInstr = if oldInstr = opcode_jump then opcode_jumpI else if oldInstr = opcode_jumpFalse then opcode_jumpIFalse else if oldInstr = opcode_delHandler then opcode_delHandlerI else if oldInstr = opcode_setHandler then opcode_setHandlerI else raise InternalError "Extending unknown branch instruction" (* Fix up the instruction and offset *) val () = putByte (opcode_down newInstr, instrAddr, cvec); val () = putByte (newOffset, addr, cvec); (* Generate the indirection itself, and alter the jump state *) val () = genWord (0, cvec); val () = lab := Jump16From here; in convertRest end else let (* Not ready to remove this. Just find out if this is an earlier branch and continue. *) val () = if addr addrLt !(longestBranch cvec) then longestBranch cvec := addr else (); in lab :: convertRest end end end; (* convertLabels *) in if !(ic cvec) addrMinus !(longestBranch cvec) <= maxDiff then () else let (* Must save the stack-reset, otherwise "fixup" will try to reset it. *) val sr = ! (stackReset cvec); val () = stackReset cvec := 0; (* Must skip round the branches unless we have just taken an unconditional branch. *) val lab : labels = if branched then noJump else let val () = genByte(opcode_down opcode_jump, cvec); val () = genByte(0, cvec); in makeLabel(cvec, !(ic cvec) addrPlus ~1) end (* Find the new longest branch while converting the labels *) val () = longestBranch cvec := addrLast; val () = labelList cvec := convertLabels (! (labelList cvec)); val () = fixup (lab, cvec); (* Continue with normal processing. *) in stackReset cvec := sr (* Restore old value. *) end end; (* checkBranchList *) (* Dave had some complicated scheme here - with the new representation of labels, everything gets much simpler. *) fun linkLabels (lab1 : labels, lab2 : labels, _ : code) : labels = lab1 @ lab2; (* Put in the opcode for an instruction. *) fun genOpc (opc: opcode, size: int, cvec: code) : unit = let val opn : int = opcode_down opc; (* ... val () = if 0 <= opn andalso opn < 256 andalso opn <> opcode_down opcode_booleanOr then () else raise InternalError ("genOpc: bad opcode: " ^ Int.toString opn); ... *) val () = checkBranchList (cvec, false, size); val () = resetSp cvec; in genByte (opn, cvec) end; fun genRaiseEx (cvec: code) : unit = genOpc (opcode_raiseEx, 1, cvec); fun genLock(cvec: code) : unit = genOpc (opcode_lock, 1, cvec); fun genLdexc (cvec: code) : unit = genOpc (opcode_ldexc, 1, cvec); fun genPushHandler (cvec: code) : unit = genOpc (opcode_pushHandler, 1, cvec); (* Generate word, byte or single opcodes. The values from ``f'' to ``l'' are packed into the opcode by generating opF, opF+1, ... opF+(l-f). Other arguments which will fit into a byte generate opB followed by the argument. The rest require opW and a word argument. *) fun gen1 (opW: opcode, opB: opcode, opF: opcode, first : int, last : int, arg1: int, cvec: code) : unit = if (first <= arg1 andalso arg1 <= last) then genOpc (opcode_up (opcode_down opF + arg1 - first), 1, cvec) else if 0 <= arg1 andalso arg1 <= 254 (* why not 255? *) then let val () = genOpc(opB, 2, cvec); in genByte(arg1, cvec) end else let val () = genOpc(opW, 3, cvec); in genWord(arg1, cvec) end; fun genReturn (arg1 : int, cvec : code) : unit = gen1 (opcode_returnW, opcode_returnB, opcode_return_0, 0, 3, arg1, cvec); fun genGetStore (arg1 : int, cvec : code) : unit = gen1 (opcode_getStoreW, opcode_getStoreB, opcode_getStore_2, 2, 4, arg1, cvec); fun genLocal (arg1 : int, cvec : code) : unit = gen1 (opcode_localW, opcode_localB, opcode_local_0, 0, 11, arg1, cvec); fun genIndirect (arg1 : int, cvec : code) : unit = gen1 (opcode_indirectW, opcode_indirectB, opcode_indirect_0, 0, 5, arg1, cvec); fun genMoveToVec (arg1 : int, cvec : code) : unit = gen1 (opcode_moveToVecW, opcode_moveToVecB, opcode_moveToVec_0, 0, 7, arg1, cvec); fun genSetStackVal (arg1 : int, cvec : code) : unit = gen1 (opcode_setStackValW, opcode_setStackValB, opcode_setStackValB, (* Don't care - no "implied" form exists *) 1, 0, arg1, cvec); fun genCase (arg1 : int, cvec : code) : unit = let (* The destination addresses immediately follow the case instruction so we must make sure there is enough room. *) val () = genOpc (opcode_caseSwitch, 3 + arg1 * 2, cvec); in genWord (arg1, cvec) end; fun genTuple (arg1: int, cvec: code) : unit = gen1 (opcode_tupleW, opcode_tupleB, opcode_tuple_2, 2, 4, arg1, cvec); (* Single byte argument. *) (* fun genIoVecEntry (arg: int, cvec : code) : unit = case arg of (* Some of these entries are very common. *) 5 => genOpc(opcode_ioVec_5, 1, cvec) | 6 => genOpc(opcode_ioVec_6, 1, cvec) | 225 => genOpc(opcode_ioVec_225, 1, cvec) | 226 => genOpc(opcode_ioVec_226, 1, cvec) | 229 => genOpc(opcode_ioVec_229, 1, cvec) | 233 => genOpc(opcode_ioVec_233, 1, cvec) | 236 => genOpc(opcode_ioVec_236, 1, cvec) | 251 => genOpc(opcode_ioVec_251, 1, cvec) | 253 => genOpc(opcode_ioVec_253, 1, cvec) | 255 => genOpc(opcode_ioVec_255, 1, cvec) | _ => let val () = genOpc(opcode_ioVecEntry, 2, cvec); in genByte(arg, cvec) end;*) fun genNonLocal (arg1 : int, arg2 : int, arg3 : int, cvec: code) : unit = if arg1 <= 0 orelse arg2 <= 0 then raise InternalError "genNonLocal: invalid parameters" else if arg1 <= 16 andalso arg2 <= 3 andalso ~6 <= arg3 andalso arg3 <= 9 then let (* use a coded representation *) val opc = opcode_up(opcode_down opcode_nonLocalL_1 + arg2 - 1); val () = genOpc (opc, 1, cvec); in genByte((arg1 - 1) * 16 + arg3 + 6, cvec) end else let val () = genOpc (opcode_nonLocal, 5, cvec); val () = genWord (arg1, cvec); val () = genWord (arg2, cvec); in genWord (arg3, cvec) end; fun genEnterInt (cvec: code, args: int) : unit = let val () = genByte(opcode_down opcode_enterInt, cvec); val () = genByte(args + 1, cvec); in () end; fun genEnterIntCall (cvec: code, args: int) : unit = let val () = if args < MAXINTARGS then () else raise InternalError "genEnterIntCall: too many arguments"; in genEnterInt(cvec, args) end; local val enterHandlerCode = (*2 * MAXINTARGS *) 254; in fun genEnterIntCatch (cvec: code) : unit = genEnterInt(cvec, enterHandlerCode); end; fun genEnterIntProc (cvec: code, args: int) : unit = let val () = if args < MAXINTARGS then () else raise InternalError "genEnterIntProc: too many arguments"; val argCode : int = MAXINTARGS + args; (* Primary entry point (address 0) *) val () = genEnterInt(cvec, argCode); in () end; (* Used for jump, jumpFalse, setHandler and delHandler. *) fun putBranchInstruction (opc: opcode, cvec: code) : labels = if opc = opcode_setHandler orelse opc = opcode_jumpFalse then let (* The next instruction may or will be executed. *) val () = genOpc (opc, 3, cvec); (* why not 2? *) val () = genByte (0, cvec); in makeLabel (cvec, !(ic cvec) addrPlus ~1) end else let (* Unconditional branches. *) val () = resetSp cvec; val () = genByte (opcode_down opc, cvec); val () = genByte (0, cvec); val lab : labels = makeLabel (cvec, !(ic cvec) addrPlus ~1); (* Having just generated an unconditional branch we can extend branches without the overhead of an extra branch. That's why we did a genByte, rather than a genOpc, just now. *) val () = checkBranchList (cvec, true, 0); in lab end; (* Generate either a short or long jump. *) fun jumpback (lab: addrs, cvec: code) : unit = let val () = resetSp cvec; (* Don't use genOpc(opcode_jump) because we want to check the branch list afterwards, and also because it might generate some code if we try to use a short branch and take it over the limit. *) val newOffset : int = !(ic cvec) addrMinus lab; val () = if newOffset < 256 then let (* short *) (* For opcode_jumpBack, exceptionally, the offset is relative to the START of the instruction. Also, the offset is backwards, as opposed to the usual forwards convention. *) val () = genByte (opcode_down opcode_jumpBack8, cvec); in genByte (newOffset, cvec) end else let (* must use 16-bit jump *) val () = genByte (opcode_down opcode_jumpBack16, cvec); in genWord (newOffset, cvec) end; in (* Having just generated an unconditional branch we can extend branches without the overhead of an extra branch. *) checkBranchList(cvec, true, 0) end local fun fixupConstantLoad (constStartAddrs : addrs, cvec : code) = fn (fixupAddr : addrs, constNum : int) => let val oldOffset : int = getBytes (2, fixupAddr, cvec); val () = if oldOffset = 0 then () else raise InternalError "fixupConstantLoad: already fixed-up"; val constAddr : addrs = if usePortableConstantOffset then constStartAddrs else constStartAddrs addrPlus (wordLength() * (constNum+4)); (* Offsets are calculated from the END of the instruction, which explains the "+ 2" *) val newOffset : int = constAddr addrMinus (fixupAddr addrPlus 2); val () = if 0 <= newOffset andalso newOffset < 65536 then () else raise InternalError "fixupConstantLoad: constant too distant (16-bit offset)" in putBytes (newOffset, 2, fixupAddr, cvec) end in fun fixupConstantLoads (cvec, constStartAddrs, loadInfo) : unit = applyList (fixupConstantLoad (constStartAddrs, cvec), loadInfo); end; (* Find the offset in the constant area of a constant. *) (* The first has offset 0. *) fun addConstToVec (valu : const, cvec : code) : int = let (* Search the list to see if the constant is already there. *) fun findConst valu [] num = (* Add to the list *) ( numOfConsts cvec := ! (numOfConsts cvec) + 1; constVec cvec := ! (constVec cvec) @ [valu]; num ) | findConst valu (h :: t) num = if sameConst (valu, h) then num else findConst valu t (num + 1) (* Not equal *); in findConst valu (! (constVec cvec)) 0 end; fun genConstRef (constNum : int, cvec : code) : unit = let (* Remember address of the indirection so we can fix it up later *) val fixupAddrs : addrs = !(ic cvec); val () = genWord (0, cvec); in constLoads cvec := (fixupAddrs, constNum) :: !(constLoads cvec) end; fun pushConst (value : machineWord, cvec : code) : unit = if isShort value andalso toShort value < 0w32768 then let val iVal: int = Word.toInt (toShort value); in if iVal = 10 then genOpc (opcode_const_10, 1, cvec) else if iVal <= 4 then genOpc (opcode_up (opcode_down opcode_const_0 + iVal), 1, cvec) else if iVal < 256 then let val () = genOpc (opcode_constIntB, 2, cvec); in genByte (iVal, cvec) end else let val () = genOpc (opcode_constIntW, 3, cvec); in genWord (iVal, cvec) end end else let (* address or large short *) val constNum : int = addConstToVec (WVal value, cvec); val () = if not usePortableConstantOffset then genOpc (opcode_constAddr, 3, cvec) else if constNum < 256 then (genOpc (opcode_constAddrX_b, 4, cvec); genByte (constNum, cvec)) else (genOpc (opcode_constAddrX_w, 5, cvec); genWord (constNum, cvec)); in genConstRef (constNum, cvec) end; (* Now aligns *on* a word boundary, because machine instructions themselves adjust the return address etc. SPF 23/6/95 *) (* That may be OK for some architectures but it's no good for the portable interpreted code. Changed back to align OFF word. Note: I've left it as addr mod 4 <> 2 rather than addr mod wordLength <> 2 since I think that it would be safe to treat word+2 or word+6 as being code addresses. DCJM 21/9/2000. *) fun alignOffWord (cvec: code, length: int) : unit = let val mustReset = !(stackReset cvec) <> 0; (* Must allow enough space for the possible pad and the next instruction. It would be a nuisance if we had aligned it off a word boundary and then we found that genOpc lengthed some branches and put it back on a word boundary. *) (* Size is now increased to 20, to allow for extra "pad" instructions following enterInt. (8 + 10 < 20). This will (hopefully) fix the "jump too large" which appeared when I added the extra return-point. SPF 3/8/95 *) val size : int = if mustReset then 23 else 20; val () = checkBranchList (cvec, false, size); val () = resetSp cvec; in while (getAddr (! (ic cvec)) + length) mod 4 <> (* 0 *) 2 do genByte (opcode_down opcode_pad, cvec) end; fun genCallClosure (cvec: code) : unit = let val () = alignOffWord(cvec, 1); in genOpc (opcode_callClosure, 1, cvec) end; fun genTailCall (toslide : int, slideby: int, cvec: code) : unit = if toslide < 256 andalso slideby < 256 then case (toslide, slideby) of (3, 2) => let val () = alignOffWord (cvec, 1); in genOpc (opcode_tail3_2, 1, cvec) end | (3, 3) => let val () = alignOffWord (cvec, 1); in genOpc (opcode_tail3_3, 1, cvec) end | (3, _) => let val () = alignOffWord (cvec, 2); val () = genOpc (opcode_tail3b, 2, cvec); in genByte (slideby, cvec) end | (4, _) => let val () = alignOffWord (cvec, 2); val () = genOpc (opcode_tail4b, 2, cvec); in genByte (slideby, cvec) end | (_, _) => let (* General byte case *) val () = alignOffWord (cvec, 3); val () = genOpc (opcode_tailbb, 3, cvec); val () = genByte (toslide, cvec); in genByte (slideby, cvec) end else let (* General case. *) val () = alignOffWord (cvec, 5); val () = genOpc (opcode_tail, 5, cvec); val () = genWord (toslide, cvec); in genWord(slideby, cvec) end; (* genTailCall *) (* Make a reference to another procedure. Usually this will be a forward *) (* reference but it may have been compiled already, in which case we can *) (* put the code address in now. *) fun codeConst (r : code, into : code) : int = let val cseg = ! (resultSeg r); in if isSet cseg (* Already done - insert the actual address *) then let val addr : address = csegAddr (scSet cseg); in addConstToVec (WVal (toMachineWord addr), into) end else (* forward *) (* Add the referring procedure onto the list of the procedure referred to if it is not already there. This makes sure that when the referring procedure is finished and its address is known the address will be plugged in to every procedure which needs it. *) let fun onList _ [] = false | onList x (c::cs) = (x is c) orelse onList x cs; val codeList = ! (otherCodes r); val () = if onList into codeList then () else otherCodes r := into :: codeList; in addConstToVec (CVal r, into) end end; (* Recursive reference, either direct or indirect. *) fun genRecRef (target : code, into: code) : unit = let val constNum : int = codeConst (target, into); val () = if not usePortableConstantOffset then genOpc (opcode_constAddr, 3, into) else if constNum < 256 then (genOpc (opcode_constAddrX_b, 4, into); genByte (constNum, into)) else (genOpc (opcode_constAddrX_w, 5, into); genWord (constNum, into)); in genConstRef (constNum, into) end; fun genContainer (size : int, cvec: code) : unit = (genOpc(opcode_containerW, 3, cvec); genWord(size, cvec)); fun genTupleFromContainer (size : int, cvec: code) : unit = (genOpc(opcode_tuple_containerW, 3, cvec); genWord(size, cvec)); (* Adds in the reset. *) fun resetStack (offset : int, carryValue : bool, cvec : code) : unit = let val () = if 0 < offset then () else raise InternalError ("resetStack: bad offset " ^ Int.toString offset); val () = stackReset cvec := !(stackReset cvec) + offset; in carry cvec := carryValue end; fun printCode (seg: cseg, procName: string, endcode : int, printStream) : unit = let val () = printStream "\n"; val () = if procName = "" (* No name *) then printStream "?" else printStream procName; val () = printStream ":\n"; (* prints a string representation of a number *) fun printHex (v : int) : unit = printStream(Int.fmt StringCvt.HEX v); val ptr = ref 0; (* To make sure we do not print branch extensions as though they were instructions we keep a list of all indirect forward references and print values at those addresses as addresses. This list is sorted with the lowest address first. *) val indirections : int list ref = ref []; local fun addL (n, [] : int list) : int list = [n] | addL (n, l as (x :: xs)) = if n < x then n :: l else if n = x then l else x :: addL (n, xs) in fun addInd (ind : int) : unit = indirections := addL (ind, !indirections) end; (* Prints a relative address. *) fun printDisp (len: int, spacer: string, addToList: bool) : unit = let val ad : int = getB(len, !ptr, seg) + !ptr + len; val () = if addToList then addInd ad else (); val () = printStream spacer; val () = printHex ad; in ptr := !ptr + len end; (* Prints an operand of an instruction *) fun printOp (len: int, spacer : string) : unit = let val () = printStream spacer; val () = printHex (getB (len, !ptr, seg)); in ptr := !ptr + len end; val () = while !ptr < endcode do let val addr : int = !ptr; val () = printHex addr; (* The address. *) val () = if (case !indirections of v :: _ => v = addr | [] => false) then let (* It's an address. *) val () = printDisp (2, "\t", false); in case !indirections of _ :: vs => indirections := vs | _ => raise InternalError "printCode: indirection list confused" end else let (* It's an instruction. *) val () = printStream "\t"; val opc : opcode = opcode_up (Word8.toInt (csegGet (seg, !ptr))); (* opcode *) val () = ptr := !ptr + 1; val () = printStream (repr opc); val sz : int = size opc; in if sz = 1 then () else if opc = opcode_jump orelse opc = opcode_jumpFalse orelse opc = opcode_setHandler orelse opc = opcode_delHandler orelse opc = opcode_constAddr then printDisp (sz - 1, "\t", false) else if opc = opcode_jumpI orelse opc = opcode_jumpIFalse orelse opc = opcode_setHandlerI orelse opc = opcode_delHandlerI then printDisp (1, "\t", true) else if opc = opcode_jumpBack8 (* Should be negative *) then let val () = printStream "\t"; val () = printHex((!ptr - 1) - getB(1,!ptr,seg)); in ptr := !ptr + 1 end else if opc = opcode_jumpBack16 (* Should be negative *) then let val () = printStream "\t"; val () = printHex((!ptr - 1) - getB(2,!ptr,seg)); in ptr := !ptr + 2 end else if opc = opcode_nonLocal then let val () = printOp (2, "\t"); val () = printOp (2, ","); in printOp(2, ",") end else if opc = opcode_callSl then let val () = printDisp (2, "\t", false); val () = printOp (2, ","); in printOp (2, ",") end else if opc = opcode_callSlX then ( printOp (2, "\t"); printDisp (2, ",", false); printOp (2, ","); printOp (2, ",") ) else if opc = opcode_callSlC then ( printDisp (2, "\t", false); printOp (1, ",") ) else if opc = opcode_callSlCX then ( printOp (1, "\t"); printDisp (2, ",", false); printOp (1, ",") ) else if opc = opcode_caseSwitch then let (* Have to find out how many items there are. *) val limit : int = getB (2, !ptr, seg); val () = printOp (2, "\t"); val base : int = !ptr; fun printEntry (_ : int) = let val () = printStream "\n\t"; val () = printHex(base + getB(2, !ptr, seg)); in ptr := !ptr + 2 end; in forLoop printEntry 0 limit end else if opc = opcode_tail then let val () = printOp (2, "\t"); in printOp (2, ",") end else if opc = opcode_tailbb then let val () = printOp (1, "\t"); in printOp (1, ",") end else if opc = opcode_constAddrX_b then ( printOp (1, "\t"); printDisp (sz - 1, ",", false) ) else if opc = opcode_constAddrX_w then ( printOp (2, "\t"); printDisp (sz - 1, ",", false) ) else printOp (sz - 1, "\t") end; (* an instruction. *) in printStream "\n" end (* main loop *) in (* body of printCode *) () end; (* printCode *) (* The count of the number of constants is an untagged value so we can't use loadWord. *) fun loadConstCount (a : address, offset : int) : int = let val byteOffset : int = wordLength() * offset; fun loadBytes (i: int) (acc: int) : int = if i = wordLength() then acc else let val addr: int = if littleEndian() then byteOffset + wordLength() - i - 1 else byteOffset + i; val b = loadByte (a, Word.fromInt addr); val acc' = acc*256 + Word8.toInt b in loadBytes (i+1) acc' end in loadBytes 0 0 end; (* Bootstrapping problems currently prevent us from using Address.nameOfCode *) fun nameOfCode (a : address) = let val objLength : int = Word.toInt (ADDRESS.length a); val lastWord : int = objLength - 1; val constCount : int = loadConstCount (a, lastWord); val codeName : machineWord = loadWord (a, Word.fromInt (lastWord - constCount)); in RunCall.unsafeCast codeName end; (* prints a string representation of a number *) fun printHex (v : int, printStream) : unit = printStream(Int.fmt StringCvt.HEX v); fun printConstCode (a : address, printStream) : unit = printStream ("code:\t" ^ nameOfCode a); fun printConstClosure (a : address, printStream) : unit = printStream ("clos:\t" ^ nameOfCode a); fun printWords (a : address, printStream) : unit = let val objLength : int = Word.toInt (ADDRESS.length a) in if objLength = 1 then printStream ("long:\t1 word") else printStream ("long:\t" ^ Int.toString objLength ^ " words") end; fun printBytes (a : address, printStream) : unit = let val objLength : int = Word.toInt (ADDRESS.length a) in if objLength = 1 then printStream ("bytes:\t1 word") else printStream ("bytes:\t" ^ Int.toString objLength ^ " words") end; fun printConst (c : const, printStream) : unit = case c of CVal c => let val () = printStream(if noClosure c then "code:\t" else "clos:\t"); in printStream(procName c) end | WVal w => if isShort w then let val value : int = Word.toInt (toShort w); val () = printStream "short:\t"; val () = printHex(value, printStream); val () = printStream " ("; val () = printStream (Int.toString value); in printStream ")" end else let val a : address = toAddress w; in if isIoAddress a then printStream "RTS entry" else if isCode a then printConstCode(a, printStream) else if isBytes a then printBytes(a, printStream) else if isWords a andalso 0w1 <= ADDRESS.length a then let val w' : machineWord = loadWord (a, 0w0) in if not (isShort w') then let val a' : address = toAddress w'; in if not (isIoAddress a') andalso isCode a' then printConstClosure(a', printStream) else printWords(a, printStream) (* First element of tuple is not a code segment *) end else printWords(a, printStream) (* First element of tuple is a short *) end else printWords(a, printStream) (* Not a proper tuple (shouldn't occur) *) end; fun printConstants (_ : int, [] : const list, _) : unit = () | printConstants (addr : int, h :: t, printStream) : unit = let val () = printHex(addr, printStream); val () = printStream "\t"; val () = printConst(h, printStream); val () = printStream "\n"; in printConstants (addr + wordLength(), t, printStream) end; (* set the num'th constant in cvec to be value *) fun constLabels (cvec : code, num : int, value : machineWord) : unit = let val seg = scSet (!(resultSeg cvec)); (* The +2 in the next instruction is because ic is always the byte count of the word after the marker word. We need to skip over the function name and the profile count. *) val constAddr = (getAddr (!(ic cvec))) div wordLength() + num + 2; in csegPutWord (seg, constAddr, value) end; (* Fix up references from other vectors to this one. *) fun fixOtherRefs (refTo : code, value : machineWord) : unit = let fun fixRef (refFrom : code) : unit = let val noc = numOfConsts refFrom; fun putNonLocalConst (num : int, const : const) = case const of CVal c => if c is refTo then let (* A reference to this one. *) (* Fix up the forward reference. *) val () = constLabels (refFrom, num, value); in (* decrement the "pending references" count *) noc := !noc - 1 end else () | _ => (); (* look down its list of forward references until we find ourselves. *) val () = applyCountList (putNonLocalConst, 1, !(constVec refFrom)); in (* If there are no more references, we can lock it. *) if !noc = 0 then csegLock (scSet (! (resultSeg refFrom))) else () end (* fixRef *); in (* For each `code' which needs a forward reference to `refTo' fixing up. *) applyList (fixRef, !(otherCodes refTo)) end; (* fixOtherRefs *) (* Adds the constants onto the code, and copies the code into a new segment *) fun copyCode (cvec: code as Code{ printAssemblyCode, printStream, ...}) : address = let (* Pad out to long word boundary. Don't just leave as zero because, if the last instruction (return) had a zero argument, this could give a whole word of zero, which would mess up the garbage-collector. *) (* Now round up to 8 byte boundary. This makes porting to a 64 bit machine much simpler. DCJM 22/9/00. *) val alignTo = if wordLength() < 8 then 8 else wordLength(); val () = while (getAddr (! (ic cvec)) mod alignTo) <> 0 do genByte (opcode_down opcode_pad, cvec); (* This also aligns ic onto a fullword boundary. *) val endIC = !(ic cvec); (* Remember end *) val () = genBytes (0, wordLength(), cvec); (* Marker *) (* +4 for code size, profile count, function name and constants count *) val numOfConst = !(numOfConsts cvec); val endOfCode : int = getAddr (! (ic cvec)) div wordLength(); val segSize : int = endOfCode + numOfConst + 4; (* fix-up all the constant loads (or indirections) *) val () = fixupConstantLoads (cvec, endIC, !(constLoads cvec)); (* Now make the byte segment that we'll turn into the code segment *) val seg : cseg = csegMake segSize; val () = resultSeg cvec := Set seg; (* Copy the code into the new segment. *) val () = csegCopySeg (codeVec cvec, seg, getAddr (!(ic cvec)), 0); (* Byte offset of start of code. *) local val byteEndOfCode = endOfCode * wordLength(); val addr = mkAddr byteEndOfCode; in val () = setLong (byteEndOfCode, addr, seg); end; (* Put in the number of constants. This must go in before we actually put in any constants. *) local val addr = mkAddr ((segSize - 1) * wordLength()); in val () = setLong (numOfConst + 1, addr, seg) end; (* Next the profile count. *) local val addr = mkAddr ((endOfCode + 1) * wordLength()); in val () = setLong (0, addr, seg) end; (* Now we've filled in all the C integers; now we need to convert the segment into a proper code segment before it's safe to put in any ML values. SPF 13/2/97 *) val () = csegConvertToCode seg; local (* why do we treat the empty string as a special case? SPF 15/7/94 *) (* This is so that profiling can print "". Note that a tagged zero *is* a legal string (it's "\000"). SPF 14/10/94 *) val name : string = procName cvec; val nameWord : machineWord = if name = "" then toMachineWord 0 else toMachineWord name; in val () = csegPutWord (seg, endOfCode + 2, nameWord) end; (* and then copy the objects from the constant list. *) fun putLocalConsts [] _ = () | putLocalConsts (c::cs) num = let val () = case c of WVal w => (* an ordinary (non-short) constant *) let val () = constLabels (cvec, num, w); in numOfConsts cvec := ! (numOfConsts cvec) - 1 end (* forward-reference - fix up later when we compile the referenced code *) | CVal _ => (); in putLocalConsts cs (num + 1) end; val () = putLocalConsts (! (constVec cvec)) 1; (* Switch off "mutable" bit now if we have no forward or recursive references to fix-up *) val () = if !(numOfConsts cvec) = 0 then csegLock seg else (); (* Do we need to make a closure, or just return the code? *) val addr : address = if noClosure cvec then csegAddr seg else let val addr : address = alloc (0w1, F_words, toMachineWord (csegAddr seg)); (* Logically unnecessary; however the RTS currently allocates everything as mutable because Dave's code assumed that things were done this way and I'm not completely sure that everything that needs a mutable allocation actually asks for it yet. SPF 19/2/97 *) val () = lock addr; in addr end (* Now we know the address of this object we can fix up any forward references outstanding. This is put in here because there may be directly recursive references. *) val () = fixOtherRefs (cvec, toMachineWord addr); val () = if printAssemblyCode then let (* print out the code *) val () = printCode (seg, procName cvec, getAddr endIC, printStream); (* Skip: byte offset of start of code segment, number of constants, profiling word, name of code segment *) val constants : const list = ! (constVec cvec); val () = printConstants (getAddr endIC + 4*wordLength(), constants, printStream); in printStream"\n" end else (); in addr end (* copyCode *) (* ic function exported to GCODE *) val ic : code -> addrs = fn (cvec : code) => let (* Make sure any pending stack resets are done. *) val () = resetSp cvec in ! (ic cvec) end; (* For export from the functor *) val jump : opcode = opcode_jump; val jumpFalse : opcode = opcode_jumpFalse; val setHandler : opcode = opcode_setHandler; val delHandler : opcode = opcode_delHandler; end (* CODECONS functor body *) end; (* structure-level let *) polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/INTGCODE.ML000066400000000000000000001251441265146633400233730ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Generate interpretable code for Poly system from the code tree. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This code-generator is primarily intended as a porting aid from one machine-code to another. It is modelled on the VAX code-generator and has a similar structure. Note: It does not use the use-count information on declarations. *) functor INTGCODE ( (*****************************************************************************) (* CODECONS *) (*****************************************************************************) structure CODECONS : sig type machineWord = Address.machineWord; type address = Address.address; type code; type opcode; eqtype addrs; (*hacky! *) type labels; val noJump: labels; val jumpFalse : opcode; val jump : opcode; val setHandler : opcode; val delHandler : opcode; val addrPlus : addrs * int -> addrs; val addrMinus : addrs * addrs -> int; val codeCreate: bool * string * Universal.universal list -> code; (* makes the initial segment. *) (* ic - Address for the next instruction in the segment. *) val ic: code -> addrs; (* putBytes : puts "length" bytes of "val" into locations "addr", "addr"+1 *) val putBytes : int * int * addrs * code -> unit; (* GEN- routines all put a value at the instruction counter and add an appropriate amount to it. *) (* genWord - Puts 2 bytes. *) val genWord : int * code -> unit; (* gen... - put instructions and their operands. *) val genCallClosure : code -> unit; val genRaiseEx : code -> unit; val genLock : code -> unit; val genLdexc : code -> unit; val genPushHandler : code -> unit; val genReturn : int * code -> unit; val genGetStore : int * code -> unit; val genLocal : int * code -> unit; val genIndirect : int * code -> unit; val genMoveToVec : int * code -> unit; val genSetStackVal : int * code -> unit; val genCase : int * code -> unit; val genTuple : int * code -> unit; val genTailCall : int * int * code -> unit; val genNonLocal : int * int * int * code -> unit; (* genEnter instructions are only needed when machine-code routines can call interpreted routines or vice-versa. The enterInt instruction causes the interpreter to be entered and the argument indicates the reason. *) val genEnterIntCatch : code -> unit; val genEnterIntProc : code * int -> unit; val genEnterIntCall : code * int -> unit; (* pushConst - Generates code to push a constant. *) val pushConst : machineWord * code -> unit; (* genRecRef - Recursive reference to a function. *) val genRecRef: code * code -> unit (* Create a container on the stack *) val genContainer : int * code -> unit; (* Create a tuple from a container. *) val genTupleFromContainer : int * code -> unit; (* copyCode - Finish up after compiling a function. *) val copyCode : code -> address; (* getBytes - gets "length" bytes from locations "addr", "addr"+1... Returns a negative number if the first bit was set. *) val getBytes: int * addrs * code -> int; (* putBranchInstruction puts in an instruction which involves a forward reference. *) val putBranchInstruction: opcode * code -> labels; (* Instruction to delete a handler and skip round it. *) val fixup: labels * code -> unit; (* Fix up a forward reference. *) val linkLabels: labels * labels * code -> labels; (* Link label lists. *) val jumpback: addrs * code -> unit; (* Backwards jump. *) val resetStack: int * bool * code -> unit; (* Set a pending reset *) val alignOffWord: code * int -> unit; (* Add a pad byte if the value would be word-aligned. *) end (* CODECONS *); (*****************************************************************************) (* MISC *) (*****************************************************************************) structure MISC : sig exception InternalError of string; end; structure BACKENDTREE: BackendIntermediateCodeSig ) : (*****************************************************************************) (* GCODE export signature *) (*****************************************************************************) sig type backendIC type machineWord val gencode: backendIC * Universal.universal list * int -> ((unit -> machineWord) * Universal.universal list) structure Sharing: sig type backendIC = backendIC end end = let (*****************************************************************************) (* STRETCHARRAY *) (*****************************************************************************) structure STRETCHARRAY : sig type 'a stretchArray; val stretchArray : int * '_a -> '_a stretchArray; val update : '_a stretchArray * int * '_a -> unit; val sub : 'a stretchArray * int -> 'a; end = StretchArray; in (*****************************************************************************) (* GCODE functor body *) (*****************************************************************************) struct open CODECONS; open Address; open BACKENDTREE; open MISC; open RuntimeCalls; (* for POLY_SYS numbers *) (* gets a value from the run-time system; usually this is a closure, but sometimes it's an int. *) val ioOp : int -> machineWord = RunCall.run_call1 POLY_SYS_io_operation; (* minor HACKS *) fun forLoop f i n = if i > n then () else (f i; forLoop f (i + 1) n); fun apply _ [] = () | apply f (h::t) = (f h; apply f t); val word0 = toMachineWord 0; val DummyValue : machineWord = word0; (* used as result of "raise e" etc. *) type caseForm = { cases : (backendIC * word) list, test : backendIC, caseType: caseType, default : backendIC } (* Where the result, if any, should go *) datatype whereto = NoResult (* discard result *) | ToStack (* Need a result but it can stay on the pseudo-stack *); (* Are we at the end of the function. *) datatype tail = EndOfProc | NotEnd; datatype slValue = Address of int * int (* Address of an entry on the stack. *) | Recursive of code (* A recursive reference to a closure. *) (* Code generate a function or global declaration *) fun codegen (pt : backendIC, cvec : code, loadStaticLink : int * int -> slValue, numOfArgs: int, parameters) : address = let val initTrans = 5; (* Initial size of tables. *) datatype decEntry = StackAddr of int | Empty; val decVec : decEntry STRETCHARRAY.stretchArray = STRETCHARRAY.stretchArray (initTrans, Empty); (* Count of number of items on the stack. *) val realstackptr = ref 1; (* The static-link/closure ptr is already there *) (* Exited - set to true if we have jumped out. *) val exited = ref false; (* Push a value onto the stack. For the moment this merely involves adding corresponding values to the real and pseudo-stacks. *) fun incsp () : unit = realstackptr := !realstackptr + 1; (* An entry has been removed from the stack. *) fun decsp () : unit= realstackptr := !realstackptr - 1; (* Pushes a local or non-local stack value. *) fun pushStackValue (addr : int, level : int) : unit = let val () = if level > 0 then (* Non-local *) genNonLocal(!realstackptr, level, addr, cvec) else (* Locals and references to the closure. *) genLocal(!realstackptr + addr, cvec); in incsp () end; (* Loads a local, argument or closure value; translating local stack addresses to real stack offsets. *) fun locaddr(BICLoadArgument locn, _) = pushStackValue (numOfArgs-locn, 0) | locaddr(BICLoadLocal locn, _) = ( (* positive address - on the stack. *) case STRETCHARRAY.sub (decVec, locn) of StackAddr n => pushStackValue (~ n, 0) | _ => (* Should be on the stack, not a function. *) raise InternalError "locaddr: bad stack address" ) | locaddr(BICLoadClosure locn, _) = ( (* closure-pointer relative *) case loadStaticLink (locn+1, 1) of Recursive code => ( genRecRef (code, cvec); incsp () ) | Address (addr, level) => pushStackValue (addr, level) ) | locaddr(BICLoadRecursive, _) = ( case loadStaticLink (0, 1) of Recursive code => ( genRecRef (code, cvec); incsp () ) | Address (addr, level) => pushStackValue (addr, level) ) (* generates code from the tree *) fun gencde (pt : backendIC, whereto : whereto, tailKind : tail, loopAddr) : unit = let (* Save the stack pointer value here. We may want to reset the stack. *) val oldsp = !realstackptr; val () = case pt of BICEval evl => genEval (evl, tailKind) | BICExtract ext => (* This may just be being used to discard a value which isn't used on this branch. *) if whereto = NoResult then () else locaddr ext | BICField {base, offset} => let val () = gencde (base, ToStack, NotEnd, loopAddr); in genIndirect (offset, cvec) end | BICLambda lam => genProc (lam, false, fn () => ()) | BICConstnt(w, _) => let val () = pushConst (w, cvec); in incsp () end | BICCond (testPart, thenPart, elsePart) => genCond (testPart, thenPart, elsePart, whereto, tailKind, loopAddr) | BICNewenv(decls, exp) => let (* Processes a list of entries. *) (* Mutually recursive declarations. May be either lambdas or constants. Recurse down the list pushing the addresses of the closure vectors, then unwind the recursion and fill them in. *) fun genMutualDecs [] = () | genMutualDecs ({lambda, addr, ...} :: otherDecs) = genProc (lambda, true, fn() => ( STRETCHARRAY.update (decVec, addr, StackAddr (! realstackptr)); genMutualDecs (otherDecs) )) fun codeDecls(BICRecDecs dl) = genMutualDecs (dl) | codeDecls(BICDeclar{value, addr, ...}) = ( gencde (value, ToStack, NotEnd, loopAddr); STRETCHARRAY.update (decVec, addr, StackAddr(!realstackptr)) ) | codeDecls(BICNullBinding exp) = gencde (exp, NoResult, NotEnd, loopAddr) in List.app codeDecls decls; gencde (exp, whereto, tailKind, loopAddr) end | BICBeginLoop {loop=body, arguments} => (* Execute the body which will contain at least one Loop instruction. There will also be path(s) which don't contain Loops and these will drop through. *) let val args = List.map #1 arguments (* Evaluate each of the arguments, pushing the result onto the stack. *) fun genLoopArg ({addr, value, ...}) = ( gencde (value, ToStack, NotEnd, loopAddr); STRETCHARRAY.update (decVec, addr, StackAddr (!realstackptr)); !realstackptr (* Return the posn on the stack. *) ) val argIndexList = map genLoopArg args; val startSp = ! realstackptr; (* Remember the current top of stack. *) val startLoop : addrs = ic cvec; (* Start of loop *) in (* Process the body, passing the jump-back address down for the Loop instruction(s). *) gencde (body, whereto, tailKind, SOME(startLoop, startSp, argIndexList)) (* Leave the arguments on the stack. They can be cleared later if needed. *) end | BICLoop argList => (* Jump back to the enclosing BeginLoop. *) let val (startLoop, startSp, argIndexList) = case loopAddr of SOME l => l | NONE => raise InternalError "No BeginLoop for Loop instr" (* Evaluate the arguments. First push them to the stack because evaluating an argument may depend on the current value of others. Only when we've evaluated all of them can we overwrite the original argument positions. *) fun loadArgs ([], []) = !realstackptr - startSp (* The offset of all the args. *) | loadArgs (arg:: argList, _ :: argIndexList) = let (* Evaluate all the arguments. *) val () = gencde (arg, ToStack, NotEnd, NONE); val argOffset = loadArgs(argList, argIndexList); in genSetStackVal(argOffset, cvec); (* Copy the arg over. *) decsp(); (* The argument has now been popped. *) argOffset end | loadArgs _ = raise InternalError "loadArgs: Mismatched arguments"; val _: int = loadArgs(List.map #1 argList, argIndexList) in if !realstackptr <> startSp then resetStack (!realstackptr - startSp, false, cvec) (* Remove any local variables. *) else (); (* Jump back to the start of the loop. *) jumpback (startLoop, cvec) end | BICRaise exp => let val () = gencde (exp, ToStack, NotEnd, loopAddr); val () = genRaiseEx cvec; in exited := true end | BICHandle {exp, handler} => let type handler = labels; (* Save old handler *) val () = genPushHandler cvec; val () = incsp (); val genTag = putBranchInstruction (setHandler, cvec) before incsp() val handlerList : handler list = [genTag] (* Code generate the body; "NotEnd" because we have to come back to remove the handler; "ToStack" because delHandler needs a result to carry down. *) val () = gencde (exp, ToStack, NotEnd, loopAddr); (* Now get out of the handler and restore the old one. *) val skipHandler : labels = putBranchInstruction (delHandler, cvec); (* Now process the handler itself. First we have to reset the stack. Note that we have to use "ToStack" again to be consistent with the stack-handling in the body-part. If we actually wanted "NoResult", the stack adjustment code at the end of gencde will take care of this. This means that I don't want to do any clever "end-of-function" optimisation either. SPF 6/1/97 The exception handler must be aligned to an odd word boundary so that the garbage collector does not get confused when it finds the address on the stack. Values on full-word boundaries always point to the start of objects whereas values off full-word boundaries (either return addresses or catch-phrases) point into code-segments. *) val () = realstackptr := oldsp; val () = exited := false; val () = alignOffWord (cvec, 0); val () = apply (fn handlerLab => fixup (handlerLab, cvec)) handlerList; (* If we were executing machine code we must re-enter the interpreter. *) val () = genEnterIntCatch cvec; val () = gencde (handler, ToStack, NotEnd, loopAddr); (* Finally fix-up the jump around the handler *) val () = fixup (skipHandler, cvec); in exited := false end | BICLdexc => let (* Get the name of the exception. *) val () = genLdexc cvec in incsp () end | BICCase (cas as {cases, caseType, ...}) => let val numberOfCases = List.length cases; val (isExhaustive, min:int, max:int) = case caseType of CaseTag max => (true, 0, Word.toInt max) | _ => let val (_, aLabel) = hd cases fun foldCases((_, w), (min, max)) = (Word.min(w, min), Word.max(w, max)) val (min, max) = List.foldl foldCases (aLabel, aLabel) cases in (false, Word.toInt min, Word.toInt max) end in if 3 * numberOfCases < max - min + 5 then genSparseCase(cas, whereto, tailKind, loopAddr) else genDenseCase (cas, whereto, tailKind, loopAddr) end | BICTuple recList => let (* Move the fields into the vector. *) fun loadItems [] = () | loadItems (v :: vs) = let val () = gencde (v, ToStack, NotEnd, loopAddr); in loadItems vs end; val size : int = List.length recList; val () = loadItems recList; val () = genTuple (size, cvec); in realstackptr := !realstackptr - (size - 1) end (* Containers are supposed to be implemented on the stack for efficiency. Unfortunately they cause problems in this code because we assume that if we generate a value to the stack it only occupies a single word. Rather than change this code and risk breaking something I'm simply generating them as mutable tuples on the heap. *) | BICContainer size => (* Reserve a number of words on the stack for use as a tuple on the stack. The result is the address of this space. *) ( genContainer(size, cvec); (* Push the address of this container. *) incsp() (* Pushes a single word. *) ) | BICSetContainer{container, tuple, filter} => (* Copy the contents of a tuple into a container. If the tuple is a Tuple instruction we can avoid generating the tuple and then unpacking it and simply copy the fields that make up the tuple directly into the container. *) ( case tuple of BICTuple cl => (* Simply set the container from the values. *) let (* Load the address of the container. *) val _ = gencde (container, ToStack, NotEnd, loopAddr); fun setValues([], _, _) = () | setValues(v::tl, sourceOffset, destOffset) = if sourceOffset < BoolVector.length filter andalso BoolVector.sub(filter, sourceOffset) then ( gencde (v, ToStack, NotEnd, loopAddr); (* Move the entry into the container. This instruction pops the value to be moved but not the destination. *) genMoveToVec(destOffset, cvec); decsp(); setValues(tl, sourceOffset+1, destOffset+1) ) else setValues(tl, sourceOffset+1, destOffset) in setValues(cl, 0, 0) (* The container address is still on the stack. *) end | _ => let (* General case. *) (* First the target tuple, then the container. *) val () = gencde (tuple, ToStack, NotEnd, loopAddr) val () = gencde (container, ToStack, NotEnd, loopAddr) val last = BoolVector.foldli(fn (i, true, _) => i | (_, false, n) => n) ~1 filter fun copy (sourceOffset, destOffset) = if BoolVector.sub(filter, sourceOffset) then ( (* Duplicate the tuple address . *) genLocal(1, cvec); genIndirect(sourceOffset, cvec); genMoveToVec(destOffset, cvec); if sourceOffset = last then () else copy (sourceOffset+1, destOffset+1) ) else copy(sourceOffset+1, destOffset) in copy (0, 0) (* The container and tuple addresses are still on the stack. *) end ) | BICTagTest { test, tag, ... } => let (* Convert this into a simple equality function. *) val code = BICEval { function = BICConstnt(ioOp POLY_SYS_word_eq, []), argList=[(test, GeneralType), (BICConstnt(toMachineWord tag, []), GeneralType)], resultType=GeneralType } in gencde (code, whereto, tailKind, loopAddr) end | BICKillItems { expression, ... } => (* This is inserted by the higher level code to get the use-counts correct. Kill entries are BICExtract entries with lastRef true. *) gencde (expression, whereto, tailKind, loopAddr) in (* body of gencde *) (* This ensures that there is precisely one item on the stack if whereto = ToStack and no items if whereto = NoResult. There are two points to note carefully here: (1) Negative stack adjustments are legal if we have exited. This is because matchFailFn can cut the stack back too far for its immediately enclosing expression. This is harmless because the code actually exits that expression. (2) A stack adjustment of ~1 is legal if we're generating a declaration in "ToStack" mode, because not all declarations actually generate the dummy value that we expect. This used to be handled in resetStack itself, but it's more transparent to do it here. (In addition, there was a bug in resetStack - it accumulated the stack resets, but didn't correctly accumulate these "~1" dummy value pushes.) It's all much better now. SPF 9/1/97 *) case whereto of ToStack => let val newsp = oldsp + 1; val adjustment = !realstackptr - newsp; val () = if !exited orelse adjustment = 0 then () else if adjustment < ~1 then raise InternalError ("gencde: bad adjustment " ^ Int.toString adjustment) (* Hack for declarations that should push values, but don't *) else if adjustment = ~1 then pushConst (DummyValue, cvec) else resetStack (adjustment, true, cvec); in realstackptr := newsp end | NoResult => let val adjustment = !realstackptr - oldsp; val () = if !exited orelse adjustment = 0 then () else if adjustment < 0 then raise InternalError ("gencde: bad adjustment " ^ Int.toString adjustment) else resetStack (adjustment, false, cvec); in realstackptr := oldsp end end (* gencde *) (* doNext is only used for mutually recursive functions where a function may not be able to fill in its closure if it does not have all the remaining declarations. *) (* TODO: This always creates the closure on the heap even when makeClosure is false. *) and genProc (lam as { closure=[], ...}, mutualDecs, doNext: unit -> unit) : unit = let val newCode : code = codeCreate(false, #name lam, parameters); (* The only global references are recursive ones (?) *) fun loadRecLink _ = Recursive newCode (* Code-gen function. No non-local references. *) val res : address = codegen (#body lam, newCode, loadRecLink, List.length (#argLifetimes lam), parameters); val () = pushConst(toMachineWord res, cvec); val () = incsp(); in if mutualDecs then doNext () else () end | genProc (lam, mutualDecs: bool, doNext: unit -> unit) : unit = let (* Full closure required. *) (* If there is a closure we must fetch all non-local references from it. *) (* Loads the value from the closure. *) fun loadSl (addr : int, level : int) : slValue = if addr = 0 then (* recursive - return address of closure. *) Address (~1, level - 1) else (* Return an entry in the closure. *) Address (addr, level); val newCode : code = codeCreate (true, #name lam, parameters); (* Code-gen function. *) val res : address = codegen (#body lam, newCode, loadSl, List.length (#argLifetimes lam), parameters); val sizeOfClosure = List.length (#closure lam) + 1; in if mutualDecs then let (* Have to make the closure now and fill it in later. *) val () = genGetStore (sizeOfClosure, cvec); val () = incsp (); (* Put code address into closure *) val () = pushConst(toMachineWord res, cvec); val () = genMoveToVec(0, cvec); val entryAddr : int = !realstackptr; val () = doNext (); (* Any mutually recursive functions. *) (* Push the address of the vector - If we have processed other closures the vector will no longer be on the top of the stack. *) val () = pushStackValue (~ entryAddr, 0); (* Load items for the closure. *) fun loadItems ([], _) = () | loadItems (v :: vs, addr : int) = let (* Generate an item and move it into the vector *) val () = gencde (v, ToStack, NotEnd, NONE); val () = genMoveToVec(addr, cvec); val () = decsp (); in loadItems (vs, addr + 1) end; val () = loadItems (#closure lam, 1); val () = genLock cvec; (* Lock it. *) (* Remove the extra reference. *) val () = resetStack (1, false, cvec); in realstackptr := !realstackptr - 1 end else let (* Put it on the stack. *) val () = pushConst (toMachineWord res, cvec); val () = incsp (); val () = apply (fn (pt: backendIC) => gencde (pt, ToStack, NotEnd, NONE)) (#closure lam); val () = genTuple (sizeOfClosure, cvec); in realstackptr := !realstackptr - (sizeOfClosure - 1) end end and genCond (first: backendIC, second: backendIC, third: backendIC, whereto: whereto, tailKind: tail, loopAddr) : unit = let val () = gencde (first, ToStack, NotEnd, loopAddr); val toElse : labels = putBranchInstruction(jumpFalse, cvec); val () = decsp(); in let val () = gencde (second, whereto, tailKind, loopAddr); (* Get rid of the result from the stack. If there is a result then the ``else-part'' will push it. *) val () = case whereto of ToStack => decsp () | NoResult => (); val thenExited : bool = !exited; val toExit : labels = if thenExited then noJump else putBranchInstruction (jump, cvec); (* start of "else part" *) val () = fixup (toElse, cvec); val () = exited := false; val () = gencde (third, whereto, tailKind, loopAddr); val elseExited : bool= !exited; val () = fixup (toExit, cvec); in exited := (thenExited andalso elseExited) (* Only exited if both sides did. *) end end (* genCond *) and genEval (eval, tailKind : tail) : unit = let val argList : backendIC list = List.map #1 (#argList eval) val argsToPass : int = List.length argList; (* Load arguments *) fun loadArgs [] = () | loadArgs (v :: vs) = let (* Push each expression onto the stack. *) val () = gencde(v, ToStack, NotEnd, NONE); in loadArgs vs end; (* Called after the args and the closure to call have been pushed onto the stack. *) fun callClosure () : unit = case tailKind of NotEnd => (* Normal call. *) genCallClosure cvec | EndOfProc => (* Tail recursive call. *) let (* Get the return address onto the top of the stack. *) val () = pushStackValue (0, 0); (* Slide the return address, closure and args over the old closure, return address and args, and reset the stack. Then jump to the closure. *) val () = genTailCall(argsToPass + 2, !realstackptr - 1 + (numOfArgs - argsToPass), cvec); (* It's "-1" not "-2", because we didn't bump the realstackptr when we pushed the return address. SPF 3/1/97 *) in exited := true end; val () = case #function eval of (* The function is being loaded from the stack or closure so it may be a static-link function. *) BICExtract(ext, _) => let (* Since the function is on the stack there can be no side-effects in loading it. Can therefore load the arguments now. *) val () = loadArgs argList; val staticLinkValue = case ext of BICLoadArgument addr => Address (numOfArgs - addr, 0) | BICLoadLocal addr => ( (* Local - is it a function? *) case STRETCHARRAY.sub (decVec, addr) of StackAddr n => Address (~ n, 0) | Empty => raise InternalError "staticLinkValue: missing decVec entry" ) | BICLoadClosure addr => loadStaticLink (addr+1, 1)(* Non-local or recursive. *) | BICLoadRecursive => loadStaticLink (0, 1) in case staticLinkValue of Address (addr, level) => let val () = pushStackValue (addr, level); in callClosure () end (* recursive reference to a function - not static link. *) | Recursive code => let val () = genRecRef (code, cvec); val () = incsp(); in callClosure () end end (* BICExtract *) | _ => (* The function is not being found by simply loading a value from the stack or the closure. *) let (* Must load the closure and call. *) (* Have to guarantee that the expression to return the function is evaluated before the arguments. *) (* Returns true if evaluating it later is safe. *) fun safeToLeave (node: backendIC) : bool = case node of BICConstnt _ => true | BICLambda _ => true | BICField {base, ...} => (* Safe only if the expression (always a type) being indirected is. This is put in because calling functions in a type is a common occurence and should be made reasonably efficient. *) safeToLeave base | _ => false val () = if (case argList of [] => true | _ => safeToLeave (#function eval)) then let (* Can load the args first. *) val () = loadArgs argList; in gencde (#function eval, ToStack, NotEnd, NONE) end else let (* The expression for the function is too complicated to risk leaving. It might have a side-effect and we must ensure that any side-effects it has are done before the arguments are loaded. *) val () = gencde(#function eval, ToStack, NotEnd, NONE); val () = loadArgs(argList); (* Load the function again. *) val () = genLocal(argsToPass, cvec); in incsp () end in (* Call the function. *) callClosure () end; (* Not BICExtract *) (* Make sure we interpret when we return from the call *) val () = genEnterIntCall (cvec, argsToPass); in (* body of genEval *) realstackptr := !realstackptr - argsToPass (* Args popped by caller. *) end (* This is used for cases which are not sparse i.e. the values occupy a narrow enough range to make indexing efficient. *) and genDenseCase (pt as { cases, ...}: caseForm, whereto: whereto, tailKind: tail, loopAddr) : unit = let val () = gencde (#test pt, ToStack, NotEnd, loopAddr); (* The exit jumps are chained together. *) val lastEndJump : labels ref = ref noJump; val (isExhaustive, min:int, max:int) = case #caseType pt of CaseTag max => (true, 0, Word.toInt max) | _ => let val (_, aLabel) = hd cases fun foldCases((_, w), (min, max)) = (Word.min(w, min), Word.max(w, max)) val (min, max) = List.foldl foldCases (aLabel, aLabel) cases in (false, Word.toInt min, Word.toInt max) end val limit : int = max - min val () = if min = 0 then () else let (* Subtract lower limit. *) val () = pushConst(toMachineWord min, cvec); val () = pushConst(ioOp POLY_SYS_aminus, cvec); val () = genCallClosure cvec; in genEnterIntCall (cvec, 2) (* added SPF 28/6/95 *) end; val () = genCase (limit, cvec); val () = decsp (); (* Addresses are relative to the first entry in the vector. *) val startVec : addrs = ic cvec; (* Set each address in the vector to point to the default - they will be overwritten by the actual address later. *) val defaultAddr : int = (limit + 1) * 2; val () = forLoop (fn (_ : int) => genWord (defaultAddr, cvec)) 0 limit; (* The default case, if any, follows the case statement. *) val () = gencde (#default pt, whereto, tailKind, loopAddr); val () = exited := false; (* Now generate the code for each of the cases. *) fun genEachCase ([] : (backendIC * word) list) : unit = () | genEachCase ((body : backendIC, matches : word) :: otherCases) : unit = let (* First exit from the previous case or the default if this is the first. *) val () = lastEndJump := linkLabels (!lastEndJump, if !exited then noJump else putBranchInstruction(jump, cvec), cvec); (* Remove the result - the last case will leave it. *) val () = case whereto of ToStack => decsp () | NoResult => (); (* Now put the address of this code into the table if an entry has not already been set. If it has the new entry should be ignored. It is NOT an error (just redundant). *) local val entryAddr : addrs = addrPlus(startVec, (Word.toInt matches - min) * 2) in val () = if getBytes(2, entryAddr, cvec) = defaultAddr then putBytes(addrMinus(ic cvec, startVec), 2, entryAddr, cvec) else () end (* Generate code for this case *) val () = exited := false; val () = gencde (body, whereto, tailKind, loopAddr); in genEachCase otherCases end; (* genEachCase *) val () = genEachCase (#cases pt); (* Finally go down the list of exit labels pointing them to here. *) val () = fixup (!lastEndJump, cvec); in exited := false end (* genDenseCase *) (* Generate a sparse case. *) and genSparseCase (pt : caseForm, whereto : whereto, tailKind : tail, loopAddr) : unit = let (* Have already dealt with cases where there is only one case. *) (* The exit jumps are chained together. *) val lastEndJump = ref noJump; fun caseCode ([], othersExited : bool) : bool = othersExited | caseCode ((body : backendIC, matches : word) :: otherCases, othersExited : bool) : bool = let local (* Is this really safe? What about multiple side-effects? SPF *) val () = gencde (#test pt, ToStack, NotEnd, loopAddr); (* Push the value to be compared. *) val () = pushConst(toMachineWord matches, cvec); (* Compare them. *) val () = pushConst (ioOp (POLY_SYS_word_eq), cvec); val () = genCallClosure cvec; val () = genEnterIntCall(cvec, 2); (* added SPF 28/6/95 *) in val lab : labels = putBranchInstruction (jumpFalse, cvec); val () = decsp (); (* Remove result of test. *) end (* Now the expression. *) val () = gencde(body, whereto, tailKind, loopAddr); val thisHasExited : bool = !exited; (* Remove the result - the default case will leave it. *) val () = case whereto of ToStack => decsp () | NoResult => (); val () = lastEndJump := linkLabels (!lastEndJump, if thisHasExited then noJump else putBranchInstruction(jump, cvec), cvec); (* Now the next case. *) val () = fixup (lab, cvec); val () = exited := false; in caseCode (otherCases, othersExited andalso thisHasExited) end; (* caseCode *) (* First the cases. *) val casesExited : bool = caseCode (#cases pt, true); val () = exited := false; val () = let val () = gencde(#default pt, whereto, tailKind, loopAddr); in exited := (!exited andalso casesExited) end; in (* Finally go down the list of exit labels pointing them to here. *) fixup (!lastEndJump, cvec) end (* Closure functions must start with ``enterIntProc''. This is actually a break-point instruction in the machine-code instruction set to make sure that the code is interpreted. It is a no-op if we are already interpreting. *) val () = genEnterIntProc (cvec, numOfArgs); (* SPF 23/6/95 *) (* Generate the function. *) (* Assume we always want a result. There is otherwise a problem if the called routine returns a result of type void (i.e. no result) but the caller wants a result (e.g. the identity function). *) val () = gencde (pt, ToStack, EndOfProc, NONE) val () = if !exited then () else genReturn (numOfArgs, cvec); in (* body of codegen *) (* Having code-generated the body of the function, it is copied into a new data segment. *) copyCode cvec end (* codegen *); fun gencode (pt: backendIC, parameters, _) : (unit -> machineWord) * Universal.universal list = case pt of BICLambda lam => (* We are compiling a function. *) let (* It is not essential to treat this specially, but it saves generating a piece of code whose only function is to return the address of the function. *) (* make the code buffer for the new function. *) val newCode : code = codeCreate (false, #name lam, parameters); (* The only global references are recursive ones (?) *) fun loadRecLink (_ : int, _ : int) : slValue = Recursive newCode; (* This function must have no non-local references. *) val closureAddr : address = codegen (#body lam, newCode, loadRecLink, List.length (#argLifetimes lam), parameters); val res : machineWord = toMachineWord closureAddr; in (* Result is a function which returns the address of the function. *) (fn () => res, []) end | _ => let (* Compile a top-level expression. *) val newCode : code = codeCreate(false, "", parameters); (* There ane *no* global references at all *) fun loadRecLink (_ : int, _ : int) : slValue = raise InternalError "top level reached"; val closureAddr : address = codegen (pt, newCode, loadRecLink, 0, parameters) in (* Result is a function to execute the code. *) (fn () => call (closureAddr, toMachineWord ()), []) end; (* gencode *) end (* GCODE functor body *) end; (* structure-level let *) polyml-5.6/mlsource/MLCompiler/CodeTree/ByteCode/ml_bind.interpreted.ML000066400000000000000000000023771265146633400261310ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local structure CodeCons = INTCODECONS ( structure CODESEG = CodeSeg structure DEBUG = Debug structure MISC = Boot.Misc structure PRETTY = Pretty ) in structure ByteCode = INTGCODE ( structure CODECONS = CodeCons structure BACKENDTREE = BackendIntermediateCode structure MISC = Boot.Misc ) end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE.ML000066400000000000000000000560111265146633400216670ustar00rootroot00000000000000(* Copyright (c) 2012,13,15 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CODETREE ( structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure BACKEND: sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing : sig type codetree = codetree end end structure OPTIMISER: sig type codetree and envSpecial and codeBinding val codetreeOptimiser: codetree * Universal.universal list * int -> { numLocals: int, general: codetree, bindings: codeBinding list, special: envSpecial } structure Sharing: sig type codetree = codetree and envSpecial = envSpecial and codeBinding = codeBinding end end sharing type PRETTY.pretty = BASECODETREE.pretty sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = BACKEND.Sharing = OPTIMISER.Sharing ) : CODETREESIG = (*****************************************************************************) (* CODETREE functor body *) (*****************************************************************************) struct open Address; open StretchArray; open RuntimeCalls; (* for POLY_SYS numbers and EXC_nil *) open BASECODETREE; open PRETTY; open CODETREE_FUNCTIONS exception InternalError = Misc.InternalError and Interrupt = Thread.Thread.Interrupt infix 9 sub; (* gets a value from the run-time system *) val ioOp : int -> machineWord = RunCall.run_call1 POLY_SYS_io_operation; (* since code generator relies on these representations, we may as well export them *) fun rtsFunction v = Constnt(ioOp v, []) fun mkDec (laddr, res) = Declar{value = res, addr = laddr, use=[]} fun deExtract(Extract ext) = ext | deExtract _ = raise InternalError "deExtract" datatype level = Level of { lev: int, closure: createClosure, lookup: int * int * bool -> loadForm } local (* We can have locals at the outer level. *) fun bottomLevel(addr, 0, false) = if addr < 0 then raise InternalError "load: negative" else LoadLocal addr | bottomLevel _ = (* Either the level is wrong or it's a parameter. *) raise InternalError "bottom level" in val baseLevel = Level { lev = 0, closure = makeClosure(), lookup = bottomLevel } end fun newLevel (Level{ lev, lookup, ...}) = let val closureList = makeClosure() val makeClosure = addToClosure closureList fun check n = if n < 0 then raise InternalError "load: negative" else n fun thisLevel(addr, level, isParam) = if level < 0 then raise InternalError "mkLoad: level must be non-negative" else if level > 0 then makeClosure(lookup(addr, level-1, isParam)) else (* This level *) if isParam then LoadArgument(check addr) else LoadLocal(check addr) in Level { lev = lev+1, closure = closureList, lookup = thisLevel } end fun getClosure(Level{ closure, ...}) = List.map Extract (extractClosure closure) fun mkLoad (addr, Level { lev = newLevel, lookup, ... } , Level { lev = oldLevel, ... }) = Extract(lookup(addr, newLevel - oldLevel, false)) and mkLoadParam(addr, Level { lev = newLevel, lookup, ... } , Level { lev = oldLevel, ... }) = Extract(lookup(addr, newLevel - oldLevel, true)) (* Transform a function so that free variables are converted to closure form. Returns the maximum local address used. *) fun genCode(pt, debugSwitches, numLocals) = let val printCodeTree = DEBUG.getParameter DEBUG.codetreeTag debugSwitches and compilerOut = PRETTY.getCompilerOutput debugSwitches (* val printCodeTree = true and compilerOut = PRETTY.prettyPrint(TextIO.print, 70) *) (* If required, print it first. This is the code that the front-end has produced. *) val () = if printCodeTree then compilerOut(pretty pt) else () (* This ensures that everything is printed just before it is code-generated. *) fun codeAndPrint(code, localCount) = let val () = if printCodeTree then compilerOut (BASECODETREE.pretty code) else (); in BACKEND.codeGenerate(code, localCount, debugSwitches) end (* Optimise it. *) val { numLocals = localCount, general = gen, bindings = decs, special = spec } = OPTIMISER.codetreeOptimiser(pt, debugSwitches, numLocals) (* At this stage we have a "general" value and also, possibly a "special" value. We could simply create mkEnv(decs, gen) and run preCode and genCode on that. However, we would lose the ability to insert any inline functions from this code into subsequent top-level expressions. We can't simply retain the "special" entry either because that may refer to values that have to be created once when the code is run. Such values will be referenced by "load" entries which refer to entries in the "decs". We construct a tuple which will contain the actual values after the code is run. Then if we want the value at some time in the future when we use something from the "special" entry we can extract the corresponding value from this tuple. Previously, this code always generated a tuple containing every declaration. That led to some very long compilation times because the back-end has some code which is quadratic in the number of entries on the stack. We now try to prune bindings by only generating the tuple if we have an inline function somewhere and only generating bindings we actually need. *) fun simplifySpec (EnvSpecTuple(size, env)) = let (* Get all the field entries. *) fun simpPair (gen, spec) = (gen, simplifySpec spec) val fields = List.tabulate(size, simpPair o env) in if List.all(fn (_, EnvSpecNone) => true | _ => false) fields then EnvSpecNone else EnvSpecTuple(size, fn n => List.nth(fields, n)) end | simplifySpec s = s (* None or inline function. *) in case simplifySpec spec of EnvSpecNone => let val (code, props) = codeAndPrint (mkEnv(decs, gen), localCount) in fn () => Constnt(code(), props) end | simpleSpec => let (* The bindings are marked using a three-valued mark. A binding is needed if it is referenced in any way. During the scan to find the references we need to avoid processing an entry that has already been processed but it is possible that a binding may be referenced as a general value only (e.g. from a function closure) and separately as a special value. See Test148.ML *) datatype visit = UnVisited | VisitedGeneral | VisitedSpecial local val refArray = Array.array(localCount, UnVisited) fun findDecs EnvSpecNone = () | findDecs (EnvSpecTuple(size, env)) = let val fields = List.tabulate(size, env) in List.app processGenAndSpec fields end | findDecs (EnvSpecInlineFunction({closure, ...}, env)) = let val closureItems = List.tabulate(List.length closure, env) in List.app processGenAndSpec closureItems end and processGenAndSpec (gen, spec) = (* The spec part needs only to be processed if this entry has not yet been visited, *) case gen of EnvGenLoad(LoadLocal addr) => let val previous = Array.sub(refArray, addr) in case (previous, spec) of (VisitedSpecial, _) => () (* Fully done *) | (VisitedGeneral, EnvSpecNone) => () (* Nothing useful *) | (_, EnvSpecNone) => (* We need this entry but we don't have any special entry to process. We could find another reference with a special entry. *) Array.update(refArray, addr, VisitedGeneral) | (_, _) => ( (* This has a special entry. Mark it and process. *) Array.update(refArray, addr, VisitedSpecial); findDecs spec ) end | EnvGenConst _ => () | _ => raise InternalError "doGeneral: not LoadLocal or Constant" val () = findDecs simpleSpec in (* Convert to an immutable data structure. This will continue to be referenced in any inline function after the code has run. *) val refVector = Array.vector refArray end val decArray = Array.array(localCount, CodeZero) fun addDec(addr, dec) = if Vector.sub(refVector, addr) <> UnVisited then Array.update(decArray, addr, dec) else () fun addDecs(Declar{addr, ...}) = addDec(addr, mkLoadLocal addr) | addDecs(RecDecs decs) = List.app(fn {addr, ...} => addDec(addr, mkLoadLocal addr)) decs | addDecs(NullBinding _) = () | addDecs(Container{addr, size, ...}) = addDec(addr, mkTupleFromContainer(addr, size)) val () = List.app addDecs decs (* Construct the tuple and add the "general" value at the start. *) val resultTuple = mkTuple(gen :: Array.foldr(op ::) nil decArray) (* Now generate the machine code and return it as a function that can be called. *) val (code, codeProps) = codeAndPrint (mkEnv (decs, resultTuple), localCount) in (* Return a function that executes the compiled code and then creates the final "global" value as the result. *) fn () => let local (* Execute the code. This will perform any side-effects the user has programmed and may raise an exception if that is required. *) val resVector = code () (* The result is a vector containing the "general" value as the first word and the evaluated bindings for any "special" entries in subsequent words. *) val decVals : address = if isShort resVector then raise InternalError "Result vector is not an address" else toAddress resVector in fun resultWordN n = loadWord (decVals, n) (* Get the general value, the zero'th entry in the vector. *) val generalVal = resultWordN 0w0 (* Get the properties for a field in the tuple. Because the result is a tuple all the properties should be contained in a tupleTag entry. *) val fieldProps = case Option.map (Universal.tagProject CodeTags.tupleTag) (List.find(Universal.tagIs CodeTags.tupleTag) codeProps) of NONE => (fn _ => []) | SOME p => (fn n => List.nth(p, n)) val generalProps = fieldProps 0 end (* Construct a new environment so that when an entry is looked up the corresponding constant is returned. *) fun newEnviron (oldEnv) args = let val (oldGeneral, oldSpecial) = oldEnv args val genPair = case oldGeneral of EnvGenLoad(LoadLocal addr) => ( (* For the moment retain this check. It's better to have an assertion failure than a segfault. *) Vector.sub(refVector, addr) <> UnVisited orelse raise InternalError "Reference to non-existent binding"; (resultWordN(Word.fromInt addr+0w1), fieldProps(addr+1)) ) | EnvGenConst c => c | _ => raise InternalError "codetree newEnviron: Not Extract or Constnt" val specVal = mapSpec oldSpecial in (EnvGenConst genPair, specVal) end and mapSpec EnvSpecNone = EnvSpecNone | mapSpec (EnvSpecTuple(size, env)) = EnvSpecTuple(size, newEnviron env) | mapSpec (EnvSpecInlineFunction(spec, env)) = EnvSpecInlineFunction(spec, (newEnviron env)) in (* and return the whole lot as a global value. *) Constnt(generalVal, setInline(mapSpec simpleSpec) generalProps) end end end (* genCode *) (* Constructor functions for the front-end of the compiler. *) local fun mkSimpleFunction inlineType (lval, args, name, closure, numLocals) = { body = lval, isInline = inlineType, name = if name = "" then "" else name, closure = map deExtract closure, argTypes = List.tabulate(args, fn _ => (GeneralType, [])), resultType = GeneralType, localCount = numLocals, recUse = [] } in val mkProc = Lambda o mkSimpleFunction NonInline (* Normal function *) and mkInlproc = Lambda o mkSimpleFunction Inline (* Explicitly inlined by the front-end *) (* Unless Compiler.inlineFunctor is false functors are treated as macros and expanded when they are applied. Unlike core-language functions they are not first-class values so if they are inline the "value" returned in the initial binding can just be zero except if there is something in the closure. Almost always the closure will be empty since free variables will come from previous topdecs and will be constants, The exception is if a structure and a functor using the structure appear in the same topdec (no semicolon between them). In that case we can't leave it. We would have to update the closure even if we leave the body untouched but we could have closure entries that are constants. e.g. structure S = struct val x = 1 end functor F() = struct open S end *) fun mkMacroProc (args as (_, _, _, [], _)) = Constnt(toMachineWord 0, setInline ( EnvSpecInlineFunction(mkSimpleFunction Inline args, fn _ => raise InternalError "mkMacroProc: closure")) []) | mkMacroProc args = Lambda(mkSimpleFunction Inline args) end local fun mkFunWithTypes inlineType { body, argTypes=argsAndTypes, resultType, name, closure, numLocals } = Lambda { body = body, isInline = inlineType, name = if name = "" then "" else name, closure = map deExtract closure, argTypes = map (fn t => (t, [])) argsAndTypes, resultType = resultType, localCount = numLocals, recUse = [] } in val mkFunction = mkFunWithTypes NonInline and mkInlineFunction = mkFunWithTypes Inline end fun mkEval (ct, clist) = Eval { function = ct, argList = List.map(fn c => (c, GeneralType)) clist, resultType=GeneralType } fun mkCall(func, argsAndTypes, resultType) = Eval { function = func, argList = argsAndTypes, resultType=resultType } local open RuntimeCalls in fun mkNot arg = mkEval (rtsFunction POLY_SYS_not_bool, [arg]) val testptreqFunction = rtsFunction POLY_SYS_word_eq (* N.B. int equality is SHORT integer equality *) fun mkTestinteq (xp1, xp2) = mkEval (rtsFunction POLY_SYS_word_eq, [xp1,xp2]); fun mkTestptreq (xp1, xp2) = mkEval (testptreqFunction, [xp1,xp2]); end fun identityFunction (name : string) : codetree = mkInlproc (mkLoadArgument 0, 1, name, [], 0) (* Returns its argument. *); (* Test a tag value. *) fun mkTagTest(test: codetree, tagValue: word, maxTag: word) = TagTest {test=test, tag=tagValue, maxTag=maxTag } (*mkEval (rtsFunction POLY_SYS_word_eq, [test, Constnt(toMachineWord tagValue)], true);*) fun mkHandle (exp, handler) = Handle {exp = exp, handler = handler}; fun mkStr (strbuff:string) = Constnt (toMachineWord strbuff, []) (* If we have multiple references to a piece of code we may have to save it in a temporary and then use it from there. If the code has side-effects we certainly must do that to ensure that the side-effects are done exactly once and in the correct order, however if the code is just a constant or a load we can reduce the amount of code we generate by simply returning the original code. *) fun multipleUses (code as Constnt _, _, _) = {load = (fn _ => code), dec = []} (* | multipleUses (code as Extract(LoadLegacy{addr, level=loadLevel, ...}), _, level) = let (* May have to adjust the level. *) fun loadFn lev = if lev = level then code else mkLoad (addr, loadLevel + lev, level)) in {load = loadFn, dec = []} end | multipleUses (code as Extract(LoadLocal addr), _, level) = let (* May have to adjust the level. *) fun loadFn lev = if lev = level then code else mkLoad (addr, lev - level) in {load = loadFn, dec = []} end | multipleUses (code as Extract(LoadArgument _), _, level) = let (* May have to adjust the level. *) fun loadFn lev = if lev = level then code else raise InternalError "multipleUses: different level" (*else mkLoad (addr, lev - level)*) in {load = loadFn, dec = []} end | multipleUses (Extract _, _, _) = raise InternalError "multipleUses: TODO" *) | multipleUses (code, nextAddress, level) = let val addr = nextAddress(); fun loadFn lev = mkLoad (addr, lev, level); in {load = loadFn, dec = [mkDec (addr, code)]} end (* multipleUses *); fun mkMutualDecs [] = raise InternalError "mkMutualDecs: empty declaration list" | mkMutualDecs l = let fun convertDec(a, Lambda lam) = {lambda = lam, addr = a, use=[]} | convertDec _ = raise InternalError "mkMutualDecs: Recursive declaration is not a function" in RecDecs(List.map convertDec l) end val mkNullDec = NullBinding fun mkContainer(addr, size, setter) = Container{addr=addr, size=size, use=[], setter=setter} val mkIf = Cond and mkRaise = Raise fun mkConst v = Constnt(v, []) (* For the moment limit these to general arguments. *) fun mkLoop args = Loop (List.map(fn c => (c, GeneralType)) args) and mkBeginLoop(exp, args) = BeginLoop{loop=exp, arguments=List.map(fn(i, v) => ({value=v, addr=i, use=[]}, GeneralType)) args} fun mkWhile(b, e) = (* Generated as if b then (e; ) else (). *) mkBeginLoop(mkIf(b, mkEnv([NullBinding e], mkLoop[]), CodeZero), []) (* We previously had conditional-or and conditional-and as separate instructions. I've taken them out since they can be implemented just as efficiently as a normal conditional. In addition they were interfering with the optimisation where the second expression contained the last reference to something. We needed to add a "kill entry" to the other branch but there wasn't another branch to add it to. DCJM 7/12/00. *) fun mkCor(xp1, xp2) = mkIf(xp1, CodeTrue, xp2); fun mkCand(xp1, xp2) = mkIf(xp1, xp2, CodeZero); val mkSetContainer = fn (container, tuple, size) => mkSetContainer(container, tuple, BoolVector.tabulate(size, fn _ => true)) structure Sharing = struct type machineWord = machineWord type codetree = codetree type pretty = pretty type argumentType=argumentType type codeBinding = codeBinding type level = level end end (* CODETREE functor body *); polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_CODEGEN_CONSTANT_FUNCTIONS.sml000066400000000000000000000277471265146633400262550ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* If a function has an empty closure it can be code-generated immediately. That may allow other functions or tuples to be generated immediately as well. As well as avoiding run-time allocations this also allows the code-generator to use calls/jumps to constant addresses. *) functor CODETREE_CODEGEN_CONSTANT_FUNCTIONS ( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure BACKEND: sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing : sig type codetree = codetree end end structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = BACKEND.Sharing = PRETTY.Sharing ): sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing: sig type codetree = codetree end end = struct open BASECODETREE open CODETREE_FUNCTIONS open Address exception InternalError = Misc.InternalError datatype lookupVal = EnvGenLoad of loadForm | EnvGenConst of machineWord * Universal.universal list type cgContext = { lookupAddr: loadForm -> lookupVal, enterConstant: int * (machineWord * Universal.universal list) -> unit, debugArgs: Universal.universal list } (* Code-generate a function or set of mutually recursive functions that contain no free variables and run the code to return the address. This allows us to further fold the address as a constant if, for example, it is used in a tuple. *) local exception Interrupt = Thread.Thread.Interrupt in fun codeGenerateToConstant debugSwitches (pt, localCount) = let val () = if DEBUG.getParameter DEBUG.codetreeAfterOptTag debugSwitches then PRETTY.getCompilerOutput debugSwitches (BASECODETREE.pretty pt) else () val (code, props) = BACKEND.codeGenerate(pt, localCount, debugSwitches) in Constnt (code(), props) (* Evaluate it and convert any exceptions into Raise instrs. *) handle Interrupt => raise Interrupt (* Must not handle this *) | exn => Raise (Constnt(toMachineWord exn, [])) end end fun cgFuns ({ lookupAddr, ...}: cgContext) (Extract ext) = ( (* Look up the entry. It may now be a constant. If it isn't it may still have changed if it is a closure entry and other closure entries have been replaced by constants. *) case lookupAddr ext of EnvGenLoad load => SOME(Extract load) | EnvGenConst w => SOME(Constnt w) ) | cgFuns ({lookupAddr, debugArgs, ...}) (Lambda { body, isInline, name, closure, argTypes, resultType, localCount, recUse}) = let val cArray = Array.array(localCount, NONE) val newClosure = makeClosure() fun lookupLocal(load as LoadLocal n) = ( case Array.sub(cArray, n) of NONE => EnvGenLoad load | SOME w => EnvGenConst w ) | lookupLocal(LoadClosure n) = ( case lookupAddr(List.nth (closure, n)) of EnvGenLoad load => EnvGenLoad(addToClosure newClosure load) | c as EnvGenConst _ => c ) | lookupLocal load = EnvGenLoad load (* Argument or Recursive *) val context = { lookupAddr = lookupLocal, enterConstant = fn (n, w) => Array.update(cArray, n, SOME w), debugArgs = debugArgs } (* Process the body to deal with any sub-functions and also to bind in any constants from free variables. *) val newBody = mapCodetree (cgFuns context) body (* Build the resulting lambda. *) val resultClosure = extractClosure newClosure val resultLambda = Lambda { body = newBody, isInline = isInline, name = name, closure = resultClosure, argTypes = argTypes, resultType = resultType, localCount = localCount, recUse = recUse } in (* If the closure is (now) empty we can code-generate it. *) case resultClosure of [] => SOME(codeGenerateToConstant debugArgs (resultLambda, localCount)) | _ => SOME resultLambda end | cgFuns (context as { enterConstant, debugArgs, ...}) (Newenv(envBindings, envExp)) = let (* First expand out any mutually-recursive bindings. This ensures that if we have any RecDecs left *) val expandedBindings = List.foldr (fn (d, l) => partitionMutableBindings d @ l) [] envBindings fun processBindings(Declar{value, addr, use} :: tail) = ( (* If this is a constant put it in the table otherwise create a binding. *) case mapCodetree (cgFuns context) value of Constnt w => (enterConstant(addr, w); processBindings tail) | code => Declar{value=code, addr=addr, use=use} :: processBindings tail ) | processBindings(NullBinding c :: tail) = NullBinding(mapCodetree (cgFuns context) c) :: processBindings tail | processBindings(RecDecs[{addr, lambda, use}] :: tail) = (* Single recursive bindings - treat as simple binding *) processBindings(Declar{addr=addr, value=Lambda lambda, use = use} :: tail) | processBindings(RecDecs recdecs :: tail) = let (* We know that this forms a strongly connected component so it is only possible to code-generate the group if no function has a free-variable outside the group. Each function must have at least one free variable which is part of the group. *) fun processEntry {addr, lambda, use} = case mapCodetree (cgFuns context) (Lambda lambda) of Lambda result => { addr=addr, lambda=result, use=use} | _ => raise InternalError "processEntry: not lambda" val processedGroup = map processEntry recdecs (* If every free variable is another member of the group we can code-generate the group. *) local fun closureItemInGroup(LoadLocal n) = List.exists(fn{addr, ...} => n = addr) processedGroup | closureItemInGroup _ = false fun onlyInGroup{lambda={closure, ...}, ...} = List.all closureItemInGroup closure in val canCodeGen = List.all onlyInGroup processedGroup end in if canCodeGen then let val extracts = List.map(fn {addr, ...} => Extract(LoadLocal addr)) processedGroup val code = Newenv([RecDecs processedGroup], mkTuple extracts) val maxAddr = List.foldl(fn ({addr, ...}, n) => Int.max(addr, n)) 0 processedGroup (* Code generate it. *) val results = codeGenerateToConstant debugArgs (code, maxAddr+1) (* Enter the constants in the table. *) fun enterDec ({addr, ...}, n) = ( case findEntryInBlock(results, n, false) of Constnt w => enterConstant(addr, w) | _ => raise InternalError "Not a constant"; n+1 ) val _ = List.foldl enterDec 0 processedGroup in processBindings tail end else RecDecs processedGroup :: processBindings tail end | processBindings(Container{addr, use, size, setter} :: tail) = Container{addr=addr, use=use, size=size, setter = mapCodetree (cgFuns context) setter} :: processBindings tail | processBindings [] = [] val bindings = processBindings expandedBindings val body = mapCodetree (cgFuns context) envExp in case bindings of [] => SOME body | _ => SOME(Newenv(bindings, body)) end | cgFuns context (Tuple{ fields, isVariant }) = (* Create any constant tuples that have arisen because they contain constant functions. *) SOME((if isVariant then mkDatatype else mkTuple)(map (mapCodetree (cgFuns context)) fields)) | cgFuns _ _ = NONE fun codeGenerate(original, nLocals, debugArgs) = let val cArray = Array.array(nLocals, NONE) fun lookupAddr(load as LoadLocal n) = ( case Array.sub(cArray, n) of NONE => EnvGenLoad load | SOME w => EnvGenConst w ) | lookupAddr _ = raise InternalError "lookupConstant: top-level reached" val context = { lookupAddr = lookupAddr, enterConstant = fn (n, w) => Array.update(cArray, n, SOME w), debugArgs = debugArgs } val resultCode = mapCodetree (cgFuns context) original val (code, props) = BACKEND.codeGenerate(resultCode, nLocals, debugArgs) (* The code may consist of tuples (i.e. compiled ML structures) containing a mixture of Loads, where the values are yet to be compiled, and Constants, where the code has now been compiled. We need to extract any properties from the constants and return the whole lot as tuple properties. *) fun extractProps(Constnt(_, p)) = p | extractProps(Extract ext) = ( case lookupAddr ext of EnvGenLoad _ => [] | EnvGenConst(_, p) => p ) | extractProps(Tuple{fields, ...}) = let val fieldProps = map extractProps fields in if List.all null fieldProps then [] else [Universal.tagInject CodeTags.tupleTag fieldProps] end | extractProps(Newenv(_, exp)) = extractProps exp | extractProps _ = [] val newProps = extractProps original in (code, CodeTags.mergeTupleProps(newProps, props)) end structure Sharing = struct type codetree = codetree end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_FUNCTIONS.sml000066400000000000000000000506531265146633400236100ustar00rootroot00000000000000(* Copyright (c) 2012,13 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Miscellaneous construction and operation functions on the code-tree. *) functor CODETREE_FUNCTIONS( structure BASECODETREE: BaseCodeTreeSig ) : CodetreeFunctionsSig = struct open BASECODETREE open Address exception InternalError = Misc.InternalError fun mkEnv([], exp) = exp | mkEnv(decs, exp) = Newenv(decs, exp) val word0 = toMachineWord 0 and word1 = toMachineWord 1 val False = word0 and True = word1 val F_mutable_words : Word8.word = Word8.orb (F_words, F_mutable) val CodeFalse = Constnt(False, []) and CodeTrue = Constnt(True, []) and CodeZero = Constnt(word0, []) (* Properties of code. This indicates the extent to which the code has side-effects (i.e. where even if the result is unused the code still needs to be produced) or is applicative (i.e. where its value depends only arguments and can safely be reordered). *) local val doCall: int*machineWord -> Word.word = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific in (* The RTS has a table of properties for RTS functions. The 103 call returns these Or-ed into the register mask. *) val PROPWORD_NORAISE = 0wx40000000 and PROPWORD_NOUPDATE = 0wx20000000 and PROPWORD_NODEREF = 0wx10000000 fun rtsProperties ioCall = doCall(103, ioCall) end (* RTS calls that can be evaluated at compile-time i.e. they always return the same result and have no side-effects but may raise an exception for particular arguments. *) fun earlyRtsCall function = let val props = rtsProperties function val noUpdateNoDeref = Word.orb(PROPWORD_NOUPDATE, PROPWORD_NODEREF) in Word.andb(props, noUpdateNoDeref) = noUpdateNoDeref end (* RTS calls that have have no side-effects and do not raise exceptions. They may return different results for different calls but that doesn't matter if the result is going to be discarded. *) and sideEffectFreeRTSCall function = let val props = rtsProperties function val noUpdateNoRaise = Word.orb(PROPWORD_NOUPDATE, PROPWORD_NORAISE) in Word.andb(props, noUpdateNoRaise) = noUpdateNoRaise end local infix orb andb val op orb = Word.orb and op andb = Word.andb val noSideEffect = PROPWORD_NORAISE orb PROPWORD_NOUPDATE val applicative = noSideEffect orb PROPWORD_NODEREF in fun codeProps (Lambda _) = applicative | codeProps (Constnt _) = applicative | codeProps (Extract _) = applicative | codeProps (TagTest{ test, ... }) = codeProps test | codeProps (Cond(i, t, e)) = codeProps i andb codeProps t andb codeProps e | codeProps (Newenv(decs, exp)) = List.foldl (fn (d, r) => bindingProps d andb r) (codeProps exp) decs | codeProps (Handle { exp, handler }) = (* A handler processes all the exceptions in the body *) (codeProps exp orb PROPWORD_NORAISE) andb codeProps handler | codeProps (Tuple { fields, ...}) = testList fields | codeProps (Indirect{base, ...}) = codeProps base (* An RTS call, which may actually be code which is inlined by the code-generator, may be side-effect free. This can occur if we have, for example, "if exp1 orelse exp2" where exp2 can be reduced to "true", typically because it's inside an inline function and some of the arguments to the function are constants. This then gets converted to (exp1; true) and we can eliminate exp1 if it is simply a comparison. *) | codeProps (Eval{function=Constnt(w, _), argList, ...}) = if isIoAddress(toAddress w) then List.foldl(fn ((c, _), r) => codeProps c andb r) (rtsProperties w) argList else 0w0 (* Any other function is assumed to be unsafe *) | codeProps (Eval _) = 0w0 | codeProps(Raise exp) = codeProps exp andb (Word.notb PROPWORD_NORAISE) (* Treat these as unsafe at least for the moment. *) | codeProps(BeginLoop _) = 0w0 | codeProps(Loop _) = 0w0 | codeProps Ldexc = 0w0 | codeProps (SetContainer _) = 0w0 and testList t = List.foldl(fn (c, r) => codeProps c andb r) applicative t and bindingProps(Declar{value, ...}) = codeProps value | bindingProps(RecDecs _) = applicative (* These should all be lambdas *) | bindingProps(NullBinding c) = codeProps c | bindingProps(Container{setter, ...}) = codeProps setter (* sideEffectFree - does not raise an exception or make an assignment. *) fun sideEffectFree c = (codeProps c andb noSideEffect) = noSideEffect (* reorderable - does not raise an exception or access a reference. *) and reorderable c = codeProps c = applicative end (* Return the inline property if it is set. *) fun findInline [] = EnvSpecNone | findInline (h::t) = if Universal.tagIs CodeTags.inlineCodeTag h then Universal.tagProject CodeTags.inlineCodeTag h else findInline t (* Makes a constant value from an expression which is known to be constant but may involve inline functions, tuples etc. *) fun makeConstVal (cVal:codetree) = let fun makeVal (c as Constnt _) = c (* should just be a tuple *) (* Get a vector, copy the entries into it and return it as a constant. *) | makeVal (Tuple {fields= [], ...}) = CodeZero (* should have been optimised already! *) | makeVal (Tuple {fields, ...}) = let val tupleSize = List.length fields val vec : address = alloc (Word.fromInt tupleSize, F_mutable_words, word0) val fieldCode = map makeVal fields fun copyToVec ([], _) = [] | copyToVec (Constnt(w, prop) :: t, locn) = ( assignWord (vec, locn, w); prop :: copyToVec (t, locn + 0w1) ) | copyToVec _ = raise InternalError "not constant" val props = copyToVec(fieldCode, 0w0) (* If any of the constants have properties create a tuple property for the result. *) val tupleProps = if List.all null props then [] else let (* We also need to construct an EnvSpecTuple property because findInline does not look at tuple properties. *) val inlineProps = map findInline props val inlineProp = if List.all (fn EnvSpecNone => true | _ => false) inlineProps then [] else let fun tupleEntry n = (EnvGenConst(loadWord(vec, Word.fromInt n), List.nth(props, n)), List.nth(inlineProps, n)) in [Universal.tagInject CodeTags.inlineCodeTag (EnvSpecTuple(tupleSize, tupleEntry))] end in Universal.tagInject CodeTags.tupleTag props :: inlineProp end in lock vec; Constnt(toMachineWord vec, tupleProps) end | makeVal _ = raise InternalError "makeVal - not constant or tuple" in makeVal cVal end local fun allConsts [] = true | allConsts (Constnt _ :: t) = allConsts t | allConsts _ = false fun mkRecord isVar xp = let val tuple = Tuple{fields = xp, isVariant = isVar } in if allConsts xp then (* Make it now. *) makeConstVal tuple else tuple end; in val mkTuple = mkRecord false and mkDatatype = mkRecord true end (* Set the inline property. If the property is already present it is replaced. If the property we are setting is EnvSpecNone no property is set. *) fun setInline p (h::t) = if Universal.tagIs CodeTags.inlineCodeTag h then setInline p t else h :: setInline p t | setInline EnvSpecNone [] = [] | setInline p [] = [Universal.tagInject CodeTags.inlineCodeTag p] (* These are very frequently used and it might be worth making special bindings for values such as 0, 1, 2, 3 etc to reduce garbage. *) fun checkNonZero n = if n < 0 then raise InternalError "mkLoadxx: argument negative" else n val mkLoadLocal = Extract o LoadLocal o checkNonZero and mkLoadArgument = Extract o LoadArgument o checkNonZero and mkLoadClosure = Extract o LoadClosure o checkNonZero (* Set the container to the fields of the record. Try to push this down as far as possible. *) fun mkSetContainer(container, Cond(ifpt, thenpt, elsept), filter) = Cond(ifpt, mkSetContainer(container, thenpt, filter), mkSetContainer(container, elsept, filter)) | mkSetContainer(container, Newenv(decs, exp), filter) = Newenv(decs, mkSetContainer(container, exp, filter)) | mkSetContainer(_, r as Raise _, _) = r (* We may well have the situation where one branch of an "if" raises an exception. We can simply raise the exception on that branch. *) | mkSetContainer(container, Handle {exp, handler}, filter) = Handle{exp=mkSetContainer(container, exp, filter), handler=mkSetContainer(container, handler, filter)} | mkSetContainer(container, tuple, filter) = SetContainer{container = container, tuple = tuple, filter = filter } local val except: exn = InternalError "Invalid load encountered in compiler" (* Exception value to use for invalid cases. We put this in the code but it should never actually be executed. *) val raiseError = Raise (Constnt (toMachineWord except, [])) in (* Look for an entry in a tuple. Used in both the optimiser and in mkInd. *) fun findEntryInBlock (Tuple { fields, isVariant, ...}, offset, isVar) = ( isVariant = isVar orelse raise InternalError "findEntryInBlock: tuple/datatype mismatch"; if offset < List.length fields then List.nth(fields, offset) (* This can arise if we're processing a branch of a case discriminating on a datatype which won't actually match at run-time. e.g. Tests/Succeed/Test030. *) else if isVar then raiseError else raise InternalError "findEntryInBlock: invalid address" ) | findEntryInBlock (Constnt (b, props), offset, isVar) = let (* Find the tuple property if it is present and extract the field props. *) val fieldProps = case List.find(Universal.tagIs CodeTags.tupleTag) props of NONE => [] | SOME p => List.nth(Universal.tagProject CodeTags.tupleTag p, offset) in case findInline props of EnvSpecTuple(_, env) => (* Do the selection now. This is especially useful if we have a global structure *) (* At the moment at least we assume that we can get all the properties from the tuple selection. *) ( case env offset of (EnvGenConst(w, p), inl) => Constnt(w, setInline inl p) (* The general value from selecting a field from a constant tuple must be a constant. *) | _ => raise InternalError "findEntryInBlock: not constant" ) | _ => (* The ML compiler may generate loads from invalid addresses as a result of a val binding to a constant which has the wrong shape. e.g. val a :: b = nil It will always result in a Bind exception being generated before the invalid load, but we have to be careful that the optimiser does not fall over. *) if isShort b orelse not (Address.isWords (toAddress b)) orelse Address.length (toAddress b) <= Word.fromInt offset then if isVar then raiseError else raise InternalError "findEntryInBlock: invalid address" else Constnt (loadWord (toAddress b, Word.fromInt offset), fieldProps) end | findEntryInBlock(base, offset, isVar) = Indirect {base = base, offset = offset, isVariant = isVar} (* anything else *) end (* Exported indirect load operation i.e. load a field from a tuple. We can't use findEntryInBlock in every case since that discards unused entries in a tuple and at this point we haven't checked that the unused entries don't have side-effects/raise exceptions e.g. #1 (1, raise Fail "bad") *) local fun mkIndirect isVar (addr, base as Constnt _) = findEntryInBlock(base, addr, isVar) | mkIndirect isVar (addr, base) = Indirect {base = base, offset = addr, isVariant = isVar} in val mkInd = mkIndirect false and mkVarField = mkIndirect true end (* Create a tuple from a container. *) fun mkTupleFromContainer(addr, size) = Tuple{fields = List.tabulate(size, fn n => mkInd(n, mkLoadLocal addr)), isVariant = false} (* Get the value from the code. *) fun evalue (Constnt(c, _)) = SOME c | evalue _ = NONE (* This is really to simplify the change from mkEnv taking a codetree list to taking a codeBinding list * code. This extracts the last entry which must be a NullBinding and packages the declarations with it. *) fun decSequenceWithFinalExp decs = let fun splitLast _ [] = raise InternalError "decSequenceWithFinalExp: empty" | splitLast decs [NullBinding exp] = (List.rev decs, exp) | splitLast _ [_] = raise InternalError "decSequenceWithFinalExp: last is not a NullDec" | splitLast decs (hd::tl) = splitLast (hd:: decs) tl in mkEnv(splitLast [] decs) end fun partitionMutableBindings(RecDecs rlist) = (* In general any mutually recursive declaration can refer to any other. It's better to partition the recursive declarations into strongly connected components i.e. those that actually refer to each other. *) let local val anAddr = #addr (hd rlist) (* Must be at least one *) in val (startAddress, lastAddress) = List.foldl (fn({addr, ...}, (mn, mx)) => (Int.min(addr, mn), Int.max(addr+1, mx))) (anAddr, anAddr) rlist end (* *) val mapArray = Array.array(lastAddress - startAddress, NONE) fun updateMin(addr, try) = let val off = addr - startAddress val { lowLink, index } = valOf(Array.sub(mapArray, off)) in Array.update(mapArray, off, SOME{ index = index, lowLink = Int.min(lowLink, try) }) end fun addrInList a = List.exists(fn{addr, ...} => a = addr) fun strongcomponent(item as {addr, lambda = { closure, ...}, ...}, (thisIndex, stack, resList)) = let val newStack = item :: stack val v = addr - startAddress (* Mark this item as processed. *) val () = Array.update(mapArray, v, SOME{index = thisIndex, lowLink = thisIndex}) (* Process links that refer to other items *) fun processLink(LoadLocal a, args as (_, stack, _)) = if addrInList a rlist then (* It refers to another within this declaration *) let val w = a - startAddress in case Array.sub(mapArray, w) of NONE => (* Not yet processed. *) let val result = strongcomponent(valOf(List.find(fn {addr, ...} => addr = a) rlist), args); in updateMin(addr, #lowLink(valOf(Array.sub(mapArray, w)))); result end | SOME _ => ( (* Already processed - was it in this pass or a previous? *) if addrInList a stack (* On the stack so in the current SCC *) then updateMin(addr, #index(valOf(Array.sub(mapArray, w)))) else (); (* Processed in previous pass *) args ) end else args | processLink (_, args) = args val (nextIndex, stack', subRes) = List.foldl processLink (thisIndex+1, newStack, resList) closure in (* Process references from this function. *) if #lowLink(valOf(Array.sub(mapArray, v))) = thisIndex (* This is the minimum *) then (* Create an SCC *) let fun popItems([], _) = raise InternalError "stack empty" | popItems((item as {addr=a, ...}) :: r, l) = if a = addr then (r, item :: l) else popItems(r, item :: l) val (newStack, scc) = popItems(stack', []) in (nextIndex, newStack, RecDecs scc :: subRes) end else (nextIndex, stack', subRes) end (* Process items that have not yet been reached *) fun processUnprocessed (item as {addr, ...}, args) = case Array.sub(mapArray, addr-startAddress) of NONE => strongcomponent(item, args) | _ => args val (_, _, result) = List.foldl processUnprocessed (0, [], []) rlist; val recBindings = List.rev result in recBindings end (* This is only intended for RecDecs but it's simpler to handle all bindings. *) | partitionMutableBindings other = [other] (* Functions to help in building a closure. *) datatype createClosure = Closure of (loadForm * int) list ref fun makeClosure() = Closure(ref []) (* Function to build a closure. Items are added to the closure if they are not already there. *) fun addToClosure (Closure closureList) (ext: loadForm): loadForm = case (List.find (fn (l, _) => l = ext) (!closureList), ! closureList) of (SOME(_, n), _) => (* Already there *) LoadClosure n | (NONE, []) => (* Not there - first *) (closureList := [(ext, 0)]; LoadClosure 0) | (NONE, cl as (_, n) :: _) => (closureList := (ext, n+1) :: cl; LoadClosure(n+1)) fun extractClosure(Closure (ref closureList)) = List.foldl (fn ((ext, _), l) => ext :: l) [] closureList structure Sharing = struct type codetree = codetree and codeBinding = codeBinding and loadForm = loadForm and createClosure = createClosure and envSpecial = envSpecial end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_LAMBDA_LIFT.sml000066400000000000000000000545441265146633400240010ustar00rootroot00000000000000(* Copyright (c) 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Lambda-lifting. If every call point to a function can be identified we can lift the free variables as extra parameters. This avoids the need for a closure on the heap. It makes stack-closures largely redundant. The advantages of lambda-lifting over stack closures are that the containing function of a stack-closure cannot call a stack-closure with tail-recursion because the closure must remain on the stack until the function returns. Also we can lambda-lift a function even if it is used in a function that requires a full closure whereas we cannot use a stack closure for a function if the closure would be used in a full, heap closure. This pass is called after optimisation and after any functions that have empty closures have been code-generated to constants. *) functor CODETREE_LAMBDA_LIFT ( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure BACKEND: sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing : sig type codetree = codetree end end structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = BACKEND.Sharing = PRETTY.Sharing ): sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing: sig type codetree = codetree end end = struct open BASECODETREE open CODETREE_FUNCTIONS exception InternalError = Misc.InternalError (* First pass: identify the functions whose only use are calls. This annotates the tree by setting the "use" or any bindings or recursive uses that require a closure to [UseGeneral]. *) fun checkBody(code: codetree, closureRef: int -> unit, recursiveRef: unit -> unit, localCount) = let (* An entry for each local binding. Set to true if we find a non-call reference. *) val localsNeedClosures = BoolArray.array(localCount, false) fun markExtract(LoadLocal n) = BoolArray.update(localsNeedClosures, n, true) | markExtract LoadRecursive = recursiveRef() | markExtract(LoadClosure n) = closureRef n | markExtract(LoadArgument _) = () fun checkCode(ext as Extract load) = (markExtract load; SOME ext) (* These are loads which aren't calls. If they are functions they need closures. *) | checkCode(Eval{function as Extract _, argList, resultType}) = (* A call of a function. We don't need to mark the function as needing a closure. *) SOME( Eval{function=function, argList=map(fn (c, t) => (checkMapCode c, t)) argList, resultType=resultType}) | checkCode(Lambda lambda) = SOME(Lambda(checkLambda lambda)) | checkCode(Newenv(decs, exp)) = (* We want to add [UseGeneral] to bindings that require closures. To do that we have to process the bindings in reverse order. *) let val processedExp = checkMapCode exp (* The expression first. *) fun getFlag addr = if BoolArray.sub(localsNeedClosures, addr) then [UseGeneral] else [] fun processDecs [] = [] | processDecs ((Declar { value, addr, ...}) :: tail) = let val pTail = processDecs tail (* Tail first *) val pValue = checkMapCode value in Declar{value = pValue, addr=addr, use=getFlag addr} :: pTail end | processDecs (RecDecs l :: tail) = let val pTail = processDecs tail (* Tail first *) (* Process the lambdas. Because they're mutually recursive this may set the closure flag for others in the set. *) val pLambdas = map (fn {lambda, addr, ...} => {addr=addr, use=[], lambda=checkLambda lambda}) l (* Can now pick up the closure flags. *) val pDecs = map(fn {lambda, addr, ...} => {lambda=lambda, addr=addr, use=getFlag addr}) pLambdas in RecDecs pDecs :: pTail end | processDecs (NullBinding c :: tail) = let val pTail = processDecs tail in NullBinding(checkMapCode c) :: pTail end | processDecs (Container{ addr, size, setter,... } :: tail) = let val pTail = processDecs tail in Container{addr=addr, use=[], size=size, setter=checkMapCode setter} :: pTail end in SOME(Newenv(processDecs decs, processedExp)) end | checkCode _ = NONE and checkLambda({body, closure, localCount, name, argTypes, resultType, ...}) = (* Lambdas - check the function body and any recursive uses. *) let val recNeedsClosure = ref false fun refToRecursive() = recNeedsClosure := true fun refToClosure n = markExtract(List.nth(closure, n)) val processedBody = checkBody(body, refToClosure, refToRecursive, localCount) in {body=processedBody, isInline=NonInline, closure=closure, localCount=localCount, name=name, argTypes=argTypes, resultType=resultType, recUse=if !recNeedsClosure then [UseGeneral] else []} end and checkMapCode code = mapCodetree checkCode code in checkMapCode code end (* Second pass: Actually do the lambda-lifting. *) datatype lift = LiftLoad of loadForm (* Usually unlifted but also for recursive calls. *) | LiftConst of codetree (* A lifted function. *) fun processBody(code: codetree, getClosure: int -> lift * loadForm list, getRecursive: unit -> loadForm list, localCount, debugArgs): codetree = let val processedLambdas: (codetree * loadForm list) option array = Array.array(localCount, NONE) fun findBinding(ext as LoadLocal n) = ( case Array.sub(processedLambdas, n) of SOME (c, l) => (LiftConst c, l) | NONE => (LiftLoad ext, []) ) | findBinding(LoadRecursive) = (LiftLoad LoadRecursive, getRecursive()) (* The code for the recursive case is always LoadRecursive but depending on whether it's been lifted or not there may be extra args. *) | findBinding(LoadClosure n) = getClosure n | findBinding(ext as LoadArgument _) = (LiftLoad ext, []) fun processCode(Eval{function=Extract ext, argList, resultType}) = let (* If this has been lifted we have to add the extra arguments. The function may also now be a constant. *) val (newFunction, extraArgs) = case findBinding ext of (LiftConst c, l) => (c, l) | (LiftLoad e, l) => (Extract e, l) (* Process the original args. There may be functions in there. *) val processedArgs = map(fn (c, t) => (processMapCode c, t)) argList in SOME(Eval{function=newFunction, argList=processedArgs @ map(fn c => (Extract c, GeneralType)) extraArgs, resultType=resultType}) end | processCode(Eval{function=Lambda(lambda as { recUse=[], ...}), argList, resultType}) = (* We have a call to a lambda. This must be a recursive function otherwise it would have been expanded inline. If the recursive references are just calls we can lambda-lift it. *) let val (fnConstnt, extraArgs) = hd(liftLambdas([(lambda, NONE)])) val processedArgs = map(fn (c, t) => (processMapCode c, t)) argList in SOME(Eval{function=fnConstnt, argList=processedArgs @ map(fn c => (Extract c, GeneralType)) extraArgs, resultType=resultType}) end | processCode(Extract ext) = ( (* A load of a binding outside a call. We need to process this to rebuild the closure but if we get a lifted function it's an error. *) case findBinding ext of (LiftLoad e, []) => SOME(Extract e) | _ => raise InternalError "Lifted function out of context" ) | processCode(Lambda lambda) = (* Bare lambda or lambda in binding where we need a closure. This can't be lambda-lifted but we still need to process the body and rebuild the closure. *) SOME(Lambda(processLambdaWithClosure lambda)) | processCode(Newenv(decs, exp)) = let fun processDecs [] = [] | processDecs ((Declar { value = Lambda (lambda as { recUse=[], ...}), addr, use=[]}) :: tail) = let (* We can lambda-lift. This results in a constant which is added to the table. We don't need an entry for the binding. *) val constntAndArgs = hd(liftLambdas[(lambda, SOME addr(*or NONE*))]) in Array.update(processedLambdas, addr, SOME constntAndArgs); processDecs tail end | processDecs ((Declar { value, addr, ...}) :: tail) = (* All other non-recursive bindings. *) Declar{value = processMapCode value, addr=addr, use=[]} :: processDecs tail | processDecs (RecDecs l :: tail) = let (* We only lambda-lift if all the functions are called. We could actually lift all those that are called and leave the others but it's probably not worth it. *) fun checkLift({lambda={recUse=[], ...}, use=[], ...}, true) = true | checkLift _ = false in if List.foldl checkLift true l then let val results = liftLambdas(map(fn{lambda, addr, ...} => (lambda, SOME addr)) l) in (* Add the code of the functions to the array. *) ListPair.appEq( fn (ca, {addr, ...}) => Array.update(processedLambdas, addr, SOME ca)) (results, l); (* And just deal with the rest of the bindings. *) processDecs tail end else let val pLambdas = map (fn {lambda, addr, ...} => {addr=addr, use=[], lambda=processLambdaWithClosure lambda}) l in RecDecs pLambdas :: processDecs tail end end | processDecs (NullBinding c :: tail) = NullBinding(processMapCode c) :: processDecs tail | processDecs (Container{ addr, size, setter,... } :: tail) = Container{addr=addr, use=[], size=size, setter=processMapCode setter} :: processDecs tail in SOME(Newenv(processDecs decs, processMapCode exp)) end | processCode _ = NONE and processLambdaWithClosure({body, closure, localCount, name, argTypes, resultType, ...}) = (* Lambdas that are not to be lifted. They may still have functions inside that can be lifted. They may also refer to functions that have been lifted. *) let (* We have to rebuild the closure. If any of the closure entries were lifted functions they are now constants but their arguments have to be added to the closure. *) val newClosure = makeClosure() fun closureRef n = let val (localFunction, extraArgs) = findBinding(List.nth(closure, n)) (* If the function is a local we have to add it to the closure. If it is a lifted function the function itself will be a constant except in the case of a recursive call. We do have to add the arguments to the closure. *) val resFunction = case localFunction of LiftLoad ext => LiftLoad(addToClosure newClosure ext) | c as LiftConst _ => c val resArgs = map(fn ext => addToClosure newClosure ext) extraArgs in (resFunction, resArgs) end val processedBody = processBody(body, closureRef, fn () => [], localCount, debugArgs) in {body=processedBody, isInline=NonInline, closure=extractClosure newClosure, localCount=localCount, name=name, argTypes=argTypes, resultType=resultType, recUse=[]} end and liftLambdas (bindings: (lambdaForm * int option) list) = (* Lambda-lift one or more functions. The general, but least common, case is a set of mutually recursive functions. More usually we have a single binding of a function or a single anonymous lambda. Lambda-lifting involves replacing the closure with arguments so it can only be used when we can identify all the call sites of the function and add the extra arguments. Because the transformed function has an empty closure (but see below for the mutually-recursive case) it can be code-generated immediately. The code then becomes a constant. There are a few complications. Although the additional, "closure" arguments are taken from the original function closure there may be changes if some of the closure entries are actually lambda-lifted functions. In that case the function may become a constant, and so not need to be included in the arguments, but the additional arguments for that function may need to be added to the closure. The other complication is recursion, especially mutual recursion. If we have references to mutually recursive functions we actually leave those references in the closure. This means that we actually code-generate mutually-recursive functions with non-empty closures but that is allowed if the references are only to other functions in the set. The code-generator sorts that out. *) let (* We need to construct a new common closure. This will be used by all the functions. *) val newClosure = makeClosure() fun closureEntry clItem = let val (localFunction, extraArgs) = findBinding clItem (* If the function is a local we have to add it to the closure. If it is a lifted function the function itself will be a constant except in the case of a recursive call. We do have to add the arguments to the closure. *) val resFunction = case localFunction of LiftLoad ext => LiftLoad(addToClosure newClosure ext) | c as LiftConst _ => c val resArgs = map(fn ext => addToClosure newClosure ext) extraArgs in (resFunction, resArgs) end local (* Check for an address which is one of the recursive set. *) val addressesUsed = List.mapPartial #2 bindings in fun isRecursive(LoadLocal n) = List.exists(fn p => p=n) addressesUsed | isRecursive _ = false end local fun closureItem ext = (* If it's a local we have to check that it's not one of our mutually recursive set. These items aren't going to be passed as arguments. *) if isRecursive ext then () else (closureEntry ext; ()) in val () = List.app(fn ({closure, ...}, _) => List.app closureItem closure) bindings end (* This composite closure is the set of additional arguments we need. *) val transClosure = extractClosure newClosure local val extraArgs = List.map(fn _ => (GeneralType, [])) transClosure val closureSize = List.length transClosure (* Process the function bodies. *) fun transformLambda({body, closure, localCount, name, argTypes, resultType, ...}, addr) = let val argSize = List.length argTypes val recArgs = List.tabulate(closureSize, fn n => LoadArgument(n+argSize)) (* References to other functions in the set are added to a residual closure. *) val residual = makeClosure() fun closureRef clItem = (* We have a reference to the (old) closure item. We need to change that to return the appropriate argument. The exception is that if we have a (recursive) reference to another function in the set we instead use an entry from the residual closure. *) let val oldClosureItem = List.nth(closure, clItem) in if isRecursive oldClosureItem then (LiftLoad(addToClosure residual oldClosureItem), recArgs) else let val (localFunction, resArgs) = closureEntry oldClosureItem fun mapToArg(LoadClosure n) = LoadArgument(n+argSize) | mapToArg _ = raise InternalError "mapToArg" (* Not a closure item. *) val resFunction = case localFunction of LiftLoad ext => LiftLoad(mapToArg ext) | c as LiftConst _ => c in (resFunction, map mapToArg resArgs) end end (* Recursive case - add the extra args. *) and recursiveRef() = recArgs val processedBody = processBody(body, closureRef, recursiveRef, localCount, debugArgs) val lambda = {body=processedBody, isInline=NonInline, closure=extractClosure residual, localCount=localCount, name=name, argTypes=argTypes @ extraArgs, resultType=resultType, recUse=[]} in { lambda=lambda, addr=getOpt(addr, 0), use=[] } end in val bindingsForCode = List.map transformLambda bindings end local (* We may have a single anonymous lambda. In that case we can give it address zero. *) val addresses = map (fn (_, addr) => getOpt(addr, 0)) bindings (* To get the constant addresses we create bindings for the functions and return a tuple with one entry for each binding. *) val extracts = List.map(Extract o LoadLocal) addresses val code = Newenv([RecDecs bindingsForCode], mkTuple extracts) val maxAddr = List.foldl(fn (addr, n) => Int.max(addr, n)) 0 addresses (* Code-generate, "run" the code and extract the results. *) val (code, props) = BACKEND.codeGenerate(code, maxAddr+1, debugArgs) val codeConstnt = Constnt(code(), props) fun getItem([], _) = [] | getItem(_ :: l, n) = (mkInd(n, codeConstnt), transClosure) :: getItem(l, n+1) in (* Put in the results with the closures. *) val results = getItem(bindings, 0) end in results end and processMapCode code = mapCodetree processCode code in processMapCode code end fun codeGenerate(original, nLocals, debugArgs) = let fun toplevel _ = raise InternalError "Top level reached" val checked = checkBody(original, toplevel, toplevel, nLocals) val processed = processBody(checked, toplevel, toplevel, nLocals, debugArgs) in BACKEND.codeGenerate(processed, nLocals, debugArgs) end structure Sharing = struct type codetree = codetree end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_OPTIMISER.sml000066400000000000000000002325101265146633400236050ustar00rootroot00000000000000(* Copyright (c) 2012,13,15 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CODETREE_OPTIMISER( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure REMOVE_REDUNDANT: sig type codetree type loadForm type codeUse val cleanProc : (codetree * codeUse list * (int -> loadForm) * int) -> codetree structure Sharing: sig type codetree = codetree and loadForm = loadForm and codeUse = codeUse end end structure SIMPLIFIER: sig type codetree and codeBinding and envSpecial val simplifier: codetree * int -> (codetree * codeBinding list * envSpecial) * int * bool val specialToGeneral: codetree * codeBinding list * envSpecial -> codetree structure Sharing: sig type codetree = codetree and codeBinding = codeBinding and envSpecial = envSpecial end end structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG structure BACKEND: sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing : sig type codetree = codetree end end sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = REMOVE_REDUNDANT.Sharing = SIMPLIFIER.Sharing = PRETTY.Sharing = BACKEND.Sharing ) : sig type codetree and envSpecial and codeBinding val codetreeOptimiser: codetree * Universal.universal list * int -> { numLocals: int, general: codetree, bindings: codeBinding list, special: envSpecial } structure Sharing: sig type codetree = codetree and envSpecial = envSpecial and codeBinding = codeBinding end end = struct open BASECODETREE open Address open CODETREE_FUNCTIONS open StretchArray infix 9 sub exception InternalError = Misc.InternalError datatype inlineTest = TooBig | NonRecursive | TailRecursive of bool vector | NonTailRecursive of bool vector fun evaluateInlining(function, numArgs, maxInlineSize) = let (* This checks for the possibility of inlining a function. It sees if it is small enough according to some rough estimate of the cost and it also looks for recursive uses of the function. Typically if the function is small enough to inline there will be only one recursive use but we consider the possibility of more than one. If the only uses are tail recursive we can replace the recursive calls by a Loop with a BeginLoop outside it. If there are non-tail recursive calls we may be able to lift out arguments that are unchanged. For example for fun map f [] = [] | map f (a::b) = f a :: map f b it may be worth lifting out f and generating specific mapping functions for each application. *) val hasRecursiveCall = ref false (* Set to true if rec call *) val allTail = ref true (* Set to false if non recursive *) (* An element of this is set to false if the actual value if anything other than the original argument. At the end we are then left with the arguments that are unchanged. *) val argMod = Array.array(numArgs, true) infix 6 -- (* Subtract y from x but return 0 rather than a negative number. *) fun x -- y = if x >= y then x-y else 0 (* Check for the code size and also recursive references. N,B. We assume in hasLoop that tail recursion applies only with Cond, Newenv and Handler. *) fun checkUse _ (_, 0, _) = 0 (* The function is too big to inline. *) | checkUse isMain (Newenv(decs, exp), cl, isTail) = let fun checkBind (Declar{value, ...}, cl) = checkUse isMain(value, cl, false) | checkBind (RecDecs decs, cl) = List.foldl(fn ({lambda, ...}, n) => checkUse isMain (Lambda lambda, n, false)) cl decs | checkBind (NullBinding c, cl) = checkUse isMain (c, cl, false) | checkBind (Container{setter, ...}, cl) = checkUse isMain(setter, cl -- 1, false) in checkUse isMain (exp, List.foldl checkBind cl decs, isTail) end | checkUse _ (Constnt(w, _), cl, _) = if isShort w then cl else cl -- 1 (* A recursive reference in any context other than a call prevents any inlining. *) | checkUse true (Extract LoadRecursive, _, _) = 0 | checkUse _ (Extract _, cl, _) = cl -- 1 | checkUse isMain (Indirect{base, ...}, cl, _) = checkUse isMain (base, cl -- 1, false) | checkUse _ (Lambda {body, argTypes, closure, ...}, cl, _) = (* For the moment, any recursive use in an inner function prevents inlining. *) if List.exists (fn LoadRecursive => true | _ => false) closure then 0 else checkUse false (body, cl -- (List.length argTypes + List.length closure), false) | checkUse true (Eval{function = Extract LoadRecursive, argList, ...}, cl, isTail) = let (* If the actual argument is anything but the original argument then the corresponding entry in the array is set to false. *) fun testArg((exp, _), n) = ( if (case exp of Extract(LoadArgument a) => n = a | _ => false) then () else Array.update(argMod, n, false); n+1 ) in List.foldl testArg 0 argList; hasRecursiveCall := true; if isTail then () else allTail := false; List.foldl(fn ((e, _), n) => checkUse true (e, n, false)) (cl--3) argList end | checkUse isMain (Eval{function, argList, ...}, cl, _) = checkUse isMain (function, List.foldl(fn ((e, _), n) => checkUse isMain (e, n, false)) (cl--2) argList, false) | checkUse isMain (Cond(i, t, e), cl, isTail) = checkUse isMain (i, checkUse isMain (t, checkUse isMain (e, cl -- 2, isTail), isTail), false) | checkUse isMain (BeginLoop { loop, arguments, ...}, cl, _) = checkUse isMain (loop, List.foldl (fn (({value, ...}, _), n) => checkUse isMain (value, n, false)) cl arguments, false) | checkUse isMain (Loop args, cl, _) = List.foldl(fn ((e, _), n) => checkUse isMain (e, n, false)) cl args | checkUse isMain (Raise c, cl, _) = checkUse isMain (c, cl -- 1, false) | checkUse _ (Ldexc, cl, _) = cl -- 1 | checkUse isMain (Handle {exp, handler}, cl, isTail) = checkUse isMain (exp, checkUse isMain (handler, cl, isTail), false) | checkUse isMain (Tuple{ fields, ...}, cl, _) = checkUseList isMain (fields, cl) | checkUse isMain (SetContainer{container, tuple = Tuple { fields, ...}, ...}, cl, _) = (* This can be optimised *) checkUse isMain (container, checkUseList isMain (fields, cl), false) | checkUse isMain (SetContainer{container, tuple, filter}, cl, _) = checkUse isMain (container, checkUse isMain (tuple, cl -- (BoolVector.length filter), false), false) | checkUse isMain (TagTest{test, ...}, cl, _) = checkUse isMain (test, cl -- 1, false) and checkUseList isMain (elems, cl) = List.foldl(fn (e, n) => checkUse isMain (e, n, false)) cl elems val costLeft = checkUse true (function, maxInlineSize, true) in if costLeft = 0 then TooBig else if not (! hasRecursiveCall) then NonRecursive else if ! allTail then TailRecursive(Array.vector argMod) else NonTailRecursive(Array.vector argMod) end (* Turn a list of fields to use into a filter for SetContainer. *) fun fieldsToFilter useList = let val maxDest = List.foldl Int.max ~1 useList val fields = BoolArray.array(maxDest+1, false) val _ = List.app(fn n => BoolArray.update(fields, n, true)) useList in BoolArray.vector fields end and filterToFields filter = BoolVector.foldri (fn (i, true, l) => i :: l | (_, _, l) => l) [] filter and setInFilter filter = BoolVector.foldl (fn (true, n) => n+1 | (false, n) => n) 0 filter (* Work-around for bug in bytevector equality. *) and boolVectorEq(a, b) = filterToFields a = filterToFields b fun buildFullTuple(filter, select) = let fun extArg(t, u) = if t = BoolVector.length filter then [] else if BoolVector.sub(filter, t) then select u :: extArg(t+1, u+1) else CodeZero :: extArg (t+1, u) in mkTuple(extArg(0, 0)) end (* When transforming code we only process one level and do not descend into sub-functions. *) local fun deExtract(Extract l) = l | deExtract _ = raise Misc.InternalError "deExtract" fun onlyFunction repEntry (Lambda{ body, isInline, name, closure, argTypes, resultType, localCount, recUse }) = SOME( Lambda { body = body, isInline = isInline, name = name, closure = map (deExtract o mapCodetree repEntry o Extract) closure, argTypes = argTypes, resultType = resultType, localCount = localCount, recUse = recUse } ) | onlyFunction repEntry code = repEntry code in fun mapFunctionCode repEntry = mapCodetree (onlyFunction repEntry) end local (* This transforms the body of a "small" recursive function replacing any reference to the arguments by the appropriate entry and the recursive calls themselves by either a Loop or a recursive call. *) fun mapCodeForFunctionRewriting(code, argMap, modVec, transformCall) = let fun repEntry(Extract(LoadArgument n)) = SOME(Extract(Vector.sub(argMap, n))) | repEntry(Eval { function = Extract LoadRecursive, argList, resultType }) = let (* Filter arguments to include only those that are changed and map any values we pass. They may include references to the parameters. *) fun mapArg((arg, argT)::rest, n) = if Vector.sub(modVec, n) then mapArg(rest, n+1) else (mapCode arg, argT) :: mapArg(rest, n+1) | mapArg([], _) = [] in SOME(transformCall(mapArg(argList, 0), resultType)) end | repEntry _ = NONE and mapCode code = mapFunctionCode repEntry code in mapCode code end in (* If we have a tail recursive function we can replace the tail calls by a loop. modVec indicates the arguments that have not changed. *) fun replaceTailRecursiveWithLoop(body, argTypes, modVec, nextAddress) = let (* We need to create local bindings for arguments that will change. Those that do not can be reused. *) local fun mapArgs((argT, use):: rest, n, decs, mapList) = if Vector.sub(modVec, n) then mapArgs (rest, n+1, decs, LoadArgument n :: mapList) else let val na = ! nextAddress before nextAddress := !nextAddress + 1 in mapArgs (rest, n+1, ({addr = na, value = mkLoadArgument n, use=use}, argT) :: decs, LoadLocal na :: mapList) end | mapArgs([], _, decs, mapList) = (List.rev decs, List.rev mapList) val (decs, mapList) = mapArgs(argTypes, 0, [], []) in val argMap = Vector.fromList mapList val loopArgs = decs end in BeginLoop { arguments = loopArgs, loop = mapCodeForFunctionRewriting(body, argMap, modVec, fn (l, _) => Loop l) } end (* If we have a small recursive function where some arguments are passed through unchanged we can transform it by extracting the stable arguments and only passing the changing arguments. The advantage is that this allows the stable arguments to be inserted inline which is important if they are functions. The canonical example is List.map. *) fun liftRecursiveFunction(body, argTypes, modVec, closureSize, name, resultType, localCount) = let local fun getArgs((argType, use)::rest, nArg, clCount, argCount, stable, change, mapList) = let (* This is the argument from the outer function. It is either added to the closure or passed to the inner function. *) val argN = LoadArgument nArg in if Vector.sub(modVec, nArg) then getArgs(rest, nArg+1, clCount+1, argCount, argN :: stable, change, LoadClosure clCount :: mapList) else getArgs(rest, nArg+1, clCount, argCount+1, stable, (Extract argN, argType, use) :: change, LoadArgument argCount :: mapList) end | getArgs([], _, _, _, stable, change, mapList) = (List.rev stable, List.rev change, List.rev mapList) in (* The stable args go into the closure. The changeable args are passed in. *) val (stableArgs, changeArgsAndTypes, mapList) = getArgs(argTypes, 0, closureSize, 0, [], [], []) val argMap = Vector.fromList mapList end val subFunction = Lambda { body = mapCodeForFunctionRewriting(body, argMap, modVec, fn (l, t) => Eval { function = Extract LoadRecursive, argList = l, resultType = t }), isInline = NonInline, (* Don't inline this function. *) name = name ^ "()", closure = List.tabulate(closureSize, fn n => LoadClosure n) @ stableArgs, argTypes = List.map (fn (_, t, u) => (t, u)) changeArgsAndTypes, resultType = resultType, localCount = localCount, recUse = [UseGeneral] } in Eval { function = subFunction, argList = map (fn (c, t, _) => (c, t)) changeArgsAndTypes, resultType = resultType } end end (* If the function arguments are used in a way that could be optimised the data structure represents it. *) datatype functionArgPattern = ArgPattTuple of { filter: BoolVector.vector, allConst: bool, fromFields: bool } (* ArgPattCurry is a list, one per level of application, of a list, one per argument of the pattern for that argument. *) | ArgPattCurry of functionArgPattern list list * functionArgPattern | ArgPattSimple (* Returns ArgPattCurry even if it is just a single application. *) local (* Control how we check for side-effects. *) datatype curryControl = CurryNoCheck | CurryCheck | CurryReorderable local open Address (* Return the width of a tuple. Returns 1 for non-tuples including datatypes where different variants could have different widths. Also returns a flag indicating if the value came from a constant. Constants are already tupled so there's no advantage in untupling them unless there are other non-constant arguments as well. *) fun findTuple(Tuple{fields, isVariant=false}) = (List.length fields, false) | findTuple(Constnt(w, _)) = if isShort w orelse flags (toAddress w) <> F_words then (1, false) else (Word.toInt(length (toAddress w)), true) | findTuple(Extract _) = (1, false) (* TODO: record this for variables *) | findTuple(Cond(_, t, e)) = let val (tl, tc) = findTuple t and (el, ec) = findTuple e in if tl = el then (tl, tc andalso ec) else (1, false) end | findTuple(Newenv(_, e)) = findTuple e | findTuple _ = (1, false) in fun mapArg c = let val (n, f) = findTuple c in if n <= 1 then ArgPattSimple else ArgPattTuple{filter=BoolVector.tabulate(n, fn _ => true), allConst=f, fromFields=false} end end fun useToPattern _ [] = ArgPattSimple | useToPattern checkCurry (hd::tl) = let (* Construct a possible pattern from the head. *) val p1 = case hd of UseApply(resl, arguments) => let (* If the result is also curried extend the list. *) val subCheck = case checkCurry of CurryCheck => CurryReorderable | c => c val (resultPatts, resultResult) = case useToPattern subCheck resl of ArgPattCurry l => l | tupleOrSimple => ([], tupleOrSimple) val thisArg = map mapArg arguments in (* If we have an argument that is a curried function we can safely apply it to the first argument even if that has a side-effect but we can't uncurry further than that because the behaviour could rely on a side-effect of the first application. *) if checkCurry = CurryReorderable andalso List.exists(not o reorderable) arguments then ArgPattSimple else ArgPattCurry(thisArg :: resultPatts, resultResult) end | UseField (n, _) => ArgPattTuple{filter=BoolVector.tabulate(n+1, fn m => m=n), allConst=false, fromFields=true} | _ => ArgPattSimple fun mergePattern(ArgPattCurry(l1, r1), ArgPattCurry(l2, r2)) = let (* Each argument list should be the same length. The length here is the number of arguments provided to this application. *) fun mergeArgLists(al1, al2) = ListPair.mapEq mergePattern (al1, al2) (* The currying lists could be different lengths because some applications could only partially apply it. It is essential not to assume more currying than the minimum so we stop with the shorter. *) val prefix = ListPair.map mergeArgLists (l1, l2) in if null prefix then ArgPattSimple else ArgPattCurry(prefix, mergePattern(r1, r2)) end | mergePattern(ArgPattTuple{filter=n1, allConst=c1, fromFields=f1}, ArgPattTuple{filter=n2, allConst=c2, fromFields=f2}) = (* If the tuples are different sizes we can't use a tuple. Unlike currying it would be safe to assume tupling where there isn't (unless the function is actually polymorphic). *) if boolVectorEq(n1, n2) then ArgPattTuple{filter=n1, allConst=c1 andalso c2, fromFields = f1 andalso f2} else if f1 andalso f2 then let open BoolVector val l1 = length n1 and l2 = length n2 fun safesub(n, v) = if n < length v then v sub n else false val union = tabulate(Int.max(l1, l2), fn n => safesub(n, n1) orelse safesub(n, n2)) in ArgPattTuple{filter=union, allConst=c1 andalso c2, fromFields = f1 andalso f2} end else ArgPattSimple | mergePattern _ = ArgPattSimple in case tl of [] => p1 | tl => mergePattern(p1, useToPattern checkCurry tl) end (* If the result is just a function where all the arguments are simple it's not actually curried. *) fun usageToPattern checkCurry use = case useToPattern checkCurry use of (* a as ArgPattCurry [s] => if List.all(fn ArgPattSimple => true | _ => false) s then ArgPattSimple else a |*) patt => patt in (* Decurrying involves reordering (f exp1) exp2 into code where any effects of evaluating exp2 are done before the application. That's only safe if either (f exp1) or exp2 have no side-effects and do not depend on references. In the case of the function body we can check that the body does not depend on any references (typically it's a lambda) but for function arguments we have to check how it is applied. *) val usageForFunctionBody = usageToPattern CurryNoCheck and usageForFunctionArg = usageToPattern CurryCheck (* To decide whether we want to detuple the argument we look to see if the function is ever applied to a tuple. This is rather different to currying where we only decurry if every application is to multiple arguments. This information is then merged with information about the arguments within the function. *) fun existTupling (use: codeUse list): functionArgPattern list = let val argListLists = List.foldl (fn (UseApply(_, args), l) => map mapArg args :: l | (_, l) => l) [] use fun orMerge [] = raise Empty | orMerge [hd] = hd | orMerge (hd1 :: hd2 :: tl) = let fun merge(a as ArgPattTuple _, _) = a | merge(_, b) = b in orMerge(ListPair.mapEq merge (hd1, hd2) :: tl) end in orMerge argListLists end (* If the result of a function contains a tuple but it is not detupled on every path, see if it is detupled on at least one. *) fun existDetupling(UseApply(resl, _) :: rest) = List.exists(fn UseField _ => true | _ => false) resl orelse existDetupling rest | existDetupling(_ :: rest) = existDetupling rest | existDetupling [] = false end (* Return a tuple if any of the branches returns a tuple. The idea is that if the body actually constructs a tuple on the heap on at least one branch it is probably worth attempting to detuple the result. *) fun bodyReturnsTuple (Tuple{fields, isVariant=false}) = ArgPattTuple{ filter=BoolVector.tabulate(List.length fields, fn _ => true), allConst=false, fromFields=false } | bodyReturnsTuple(Cond(_, t, e)) = ( case bodyReturnsTuple t of a as ArgPattTuple _ => a | _ => bodyReturnsTuple e ) | bodyReturnsTuple(Newenv(_, exp)) = bodyReturnsTuple exp | bodyReturnsTuple _ = ArgPattSimple (* If the usage indicates that the body of the function should be transformed these do the transformation. It is possible that each of these cases could apply and it would be possible to merge them all. For the moment keep them separate. If another of the cases applies this will be re-entered on a subsequent pass. *) fun detupleResult({ argTypes, name, resultType, closure, isInline, localCount, body, ...}: lambdaForm , filter, makeAddress) = (* The function returns a tuple or at least the uses of the function take apart a tuple. Transform it to take a container as an argument and put the result in there. *) let local fun mapArg f n ((t, _) :: tl) = (Extract(f n), t) :: mapArg f (n+1) tl | mapArg _ _ [] = [] in fun mapArgs f l = mapArg f 0 l end val mainAddress = makeAddress() and shimAddress = makeAddress() (* The main function performs the previous computation but puts the result into the container. We need to replace any recursive references with calls to the shim.*) local val recEntry = LoadClosure(List.length closure) fun doMap(Extract LoadRecursive) = SOME(Extract recEntry) | doMap _ = NONE in val transBody = mapFunctionCode doMap body end local val containerArg = Extract(LoadArgument(List.length argTypes)) val newBody = SetContainer{container = containerArg, tuple = transBody, filter=filter } val mainLambda: lambdaForm = { body = newBody, name = name, resultType=GeneralType, argTypes=argTypes @ [(GeneralType, [])], closure=closure @ [LoadLocal shimAddress], localCount=localCount + 1, isInline=isInline, recUse = [UseGeneral] } in val mainFunction = (mainAddress, mainLambda) end (* The shim function creates a container, passes it to the main function and then builds a tuple from the container. *) val shimBody = mkEnv( [Container{addr = 0, use = [], size = setInFilter filter, setter= Eval { function = Extract(LoadClosure 0), argList = mapArgs LoadArgument argTypes @ [(Extract(LoadLocal 0), GeneralType)], resultType = GeneralType } } ], buildFullTuple(filter, fn n => mkInd(n, mkLoadLocal 0)) ) val shimLambda = { body = shimBody, name = name, argTypes = argTypes, closure = [LoadLocal mainAddress], resultType = resultType, isInline = Inline, localCount = 1, recUse = [UseGeneral] } val shimFunction = (shimAddress, shimLambda) in (shimLambda, [mainFunction, shimFunction]) end fun transformFunctionArgs({ argTypes, name, resultType, closure, isInline, localCount, body, ...} , usage, makeAddress) = (* Not curried - just a single argument. *) let (* We need to construct an inline "shim" function that has the same calling pattern as the original. This simply calls the transformed main function. We need to construct the arguments to call the transformed main function. That needs, for example, to unpack tuples and repack argument functions. We need to produce an argument map to transform the main function. This needs, for example, to pack the arguments into tuples. Then when the code is run through the simplifier the tuples will be optimised away. *) val localCounter = ref localCount fun mapPattern(ArgPattTuple{filter, allConst=false, ...} :: patts, n, m) = let val fieldList = filterToFields filter val (decs, args, mapList) = mapPattern(patts, n+1, m + setInFilter filter) val newAddr = ! localCounter before localCounter := ! localCounter + 1 val tuple = buildFullTuple(filter, fn u => mkLoadArgument(m+u)) val thisDec = Declar { addr = newAddr, use = [], value = tuple } (* Arguments for the call *) val thisArg = List.map(fn p => mkInd(p, mkLoadArgument n)) fieldList in (thisDec :: decs, thisArg @ args, LoadLocal newAddr :: mapList) end | mapPattern(ArgPattCurry(currying as [_], ArgPattTuple{allConst=false, filter, ...}) :: patts, n, m) = (* It's a function that returns a tuple. The function must not be curried because otherwise it returns a function not a tuple. *) let val (thisDec, thisArg, thisMap) = transformFunctionArgument(currying, [LoadArgument m], [LoadArgument n], SOME filter) val (decs, args, mapList) = mapPattern(patts, n+1, m+1) in (thisDec :: decs, thisArg :: args, thisMap :: mapList) end | mapPattern(ArgPattCurry(currying as firstArgSet :: _, _) :: patts, n, m) = (* Transform it if it's curried or if there is a tuple in the first arg. *) if (*List.length currying >= 2 orelse *) (* This transformation is unsafe. *) List.exists(fn ArgPattTuple{allConst=false, ...} => true | _ => false) firstArgSet then let val (thisDec, thisArg, thisMap) = transformFunctionArgument(currying, [LoadArgument m], [LoadArgument n], NONE) val (decs, args, mapList) = mapPattern(patts, n+1, m+1) in (thisDec :: decs, thisArg :: args, thisMap :: mapList) end else let val (decs, args, mapList) = mapPattern(patts, n+1, m+1) in (decs, Extract(LoadArgument n) :: args, LoadArgument m :: mapList) end | mapPattern(_ :: patts, n, m) = let val (decs, args, mapList) = mapPattern(patts, n+1, m+1) in (decs, Extract(LoadArgument n) :: args, LoadArgument m :: mapList) end | mapPattern([], _, _) = ([], [], []) and transformFunctionArgument(argumentArgs, loadPack, loadThisArg, filterOpt) = let (* Disable the transformation of curried arguments for the moment. This is unsafe. See Test146. The problem is that this transformation is only safe if the function is applied immediately to all the arguments. However the usage information is propagated so that if the result of the first application is bound to a variable and then that variable is applied it still appears as curried. *) val argumentArgs = [hd argumentArgs] (* We have a function that takes a series of curried argument. Change that so that the function takes a list of arguments. *) val newAddr = ! localCounter before localCounter := ! localCounter + 1 (* In the main function we are expecting to call the argument in a curried fashion. We need to construct a function that packages up the arguments and, when all of them have been provided, calls the actual argument. *) local fun curryPack([], fnclosure) = let (* We're ready to call the function. We now need to unpack any tupled arguments. *) fun mapArgs(c :: ctl, args) = let fun mapArg([], args) = mapArgs(ctl, args) | mapArg(ArgPattTuple{filter, allConst=false, ...} :: patts, arg :: argctl) = let val fields = filterToFields filter in List.map(fn p => (mkInd(p, Extract arg), GeneralType)) fields @ mapArg(patts, argctl) end | mapArg(_ :: patts, arg :: argctl) = (Extract arg, GeneralType) :: mapArg(patts, argctl) | mapArg(_, []) = raise InternalError "mapArgs: mismatch" in mapArg(c, args) end | mapArgs _ = [] val argList = mapArgs(argumentArgs, tl fnclosure) in case filterOpt of NONE => Eval { function = Extract(hd fnclosure), resultType = GeneralType, argList = argList } | SOME filter => (* We need a container here for the result. *) mkEnv( [ Container{addr=0, size=setInFilter filter, use=[UseGeneral], setter= Eval { function = Extract(hd fnclosure), resultType = GeneralType, argList = argList @ [(mkLoadLocal 0, GeneralType)] } } ], buildFullTuple(filter, fn n => mkInd(n, mkLoadLocal 0)) ) end | curryPack(hd :: tl, fnclosure) = let val nArgs = List.length hd (* If this is the last then we need to include the container if required. *) val needContainer = case (tl, filterOpt) of ([], SOME _) => true | _ => false in Lambda { closure = fnclosure, isInline = Inline, name = name ^ "-P", resultType = GeneralType, argTypes = List.tabulate(nArgs, fn _ => (GeneralType, [UseGeneral])), localCount = if needContainer then 1 else 0, recUse = [], body = curryPack(tl, (* The closure for the next level is the current closure together with all the arguments at this level. *) List.tabulate(List.length fnclosure, fn n => LoadClosure n) @ List.tabulate(nArgs, LoadArgument)) } end in val packFn = curryPack(argumentArgs, loadPack) end val thisDec = Declar { addr = newAddr, use = [], value = packFn } fun argCount(ArgPattTuple{filter, allConst=false, ...}, m) = setInFilter filter + m | argCount(_, m) = m+1 local (* In the shim function, i.e. the inline function outside, we have a lambda that will be called when the main function wants to call its argument function. This is provided with all the arguments and so it has to call the actual argument, which is expected to be curried, an argument at a time. *) fun curryApply(hd :: tl, n, c) = let fun makeArgs(_, []) = [] | makeArgs(q, ArgPattTuple{filter, allConst=false, ...} :: args) = (buildFullTuple(filter, fn r => mkLoadArgument(r+q)), GeneralType) :: makeArgs(q + setInFilter filter, args) | makeArgs(q, _ :: args) = (mkLoadArgument q, GeneralType) :: makeArgs(q+1, args) val args = makeArgs(n, hd) in curryApply(tl, n + List.foldl argCount 0 hd, Eval{function=c, resultType = GeneralType, argList=args}) end | curryApply([], _, c) = c in val thisBody = curryApply (argumentArgs, 0, mkLoadClosure 0) end local (* We have one argument for each argument at each level of currying, or where we've expanded a tuple, one argument for each field. If the function is returning a tuple we have an extra argument for the container. *) val totalArgCount = List.foldl(fn (c, n) => n + List.foldl argCount 0 c) 0 argumentArgs + (case filterOpt of SOME _ => 1 | _ => 0) val functionBody = case filterOpt of NONE => thisBody | SOME filter => mkSetContainer(mkLoadArgument(totalArgCount-1), thisBody, filter) in val thisArg = Lambda { closure = loadThisArg, isInline = Inline, name = name ^ "-E", argTypes = List.tabulate(totalArgCount, fn _ => (GeneralType, [UseGeneral])), resultType = GeneralType, localCount = 0, recUse = [UseGeneral], body = functionBody } end in (thisDec, thisArg, LoadLocal newAddr) end val (extraBindings, transArgCode, argMapList) = mapPattern(usage, 0, 0) local (* Transform the body by replacing the arguments with the new arguments. *) val argMap = Vector.fromList argMapList (* If we have a recursive reference we have to replace it with a reference to the shim. *) val recEntry = LoadClosure(List.length closure) fun doMap(Extract(LoadArgument n)) = SOME(Extract(Vector.sub(argMap, n))) | doMap(Extract LoadRecursive) = SOME(Extract recEntry) | doMap _ = NONE in val transBody = mapFunctionCode doMap body end local (* The argument types for the main function have the tuples expanded, Functions are not affected. *) fun expand(ArgPattTuple{filter, allConst=false, ...}, _, r) = List.tabulate(setInFilter filter, fn _ => (GeneralType, [])) @ r | expand(_, a, r) = a :: r in val transArgTypes = ListPair.foldrEq expand [] (usage, argTypes) end (* Add the type information to the argument code. *) val transArgs = ListPair.mapEq(fn (c, (t, _)) => (c, t)) (transArgCode, transArgTypes) val mainAddress = makeAddress() and shimAddress = makeAddress() val transLambda = { body = mkEnv(extraBindings, transBody), name = name, argTypes = transArgTypes, closure = closure @ [LoadLocal shimAddress], resultType = resultType, isInline = isInline, localCount = ! localCounter, recUse = [UseGeneral] } (* Return the pair of functions. *) val mainFunction = (mainAddress, transLambda) val shimBody = Eval { function = Extract(LoadClosure 0), argList = transArgs, resultType = resultType } val shimLambda = { body = shimBody, name = name, argTypes = argTypes, closure = [LoadLocal mainAddress], resultType = resultType, isInline = Inline, localCount = 0, recUse = [UseGeneral] } val shimFunction = (shimAddress, shimLambda) (* TODO: We have two copies of the shim function here. *) in (shimLambda, [mainFunction, shimFunction]) end fun decurryFunction( { argTypes, name, resultType, closure, isInline, localCount, body as Lambda { argTypes=subArgTypes, resultType=subResultType, ... } , ...}, makeAddress) = (* Curried - just unwind one level this time. This case is normally dealt with by the front-end at least for fun bindings. *) let local fun mapArg f n ((t, _) :: tl) = (Extract(f n), t) :: mapArg f (n+1) tl | mapArg _ _ [] = [] in fun mapArgs f l = mapArg f 0 l end val mainAddress = makeAddress() and shimAddress = makeAddress() (* The main function calls the original body as a function. The body is a lambda which will contain references to the outer arguments but because we're just adding arguments these will be as before. *) (* We have to transform any recursive references to point to the shim. *) local val recEntry = LoadClosure(List.length closure) fun doMap(Extract LoadRecursive) = SOME(Extract recEntry) | doMap _ = NONE in val transBody = mapFunctionCode doMap body end val arg1Count = List.length argTypes val mainLambda = { body = Eval{ function = transBody, resultType = subResultType, argList = mapArgs (fn n => LoadArgument(n+arg1Count)) subArgTypes }, name = name, resultType = subResultType, closure = closure @ [LoadLocal shimAddress], isInline = isInline, localCount = localCount, argTypes = argTypes @ subArgTypes, recUse = [UseGeneral] } val mainFunction = (mainAddress, mainLambda) val shimInnerLambda = Lambda { (* The inner shim closure contains the main function and the outer arguments. *) closure = LoadClosure 0 :: List.tabulate(arg1Count, LoadArgument), body = Eval { function = Extract(LoadClosure 0), resultType = resultType, (* Calls main function with both sets of args. *) argList = mapArgs (fn n => LoadClosure(n+1)) argTypes @ mapArgs LoadArgument subArgTypes }, name = name ^ "-", resultType = subResultType, localCount = 0, isInline = Inline, argTypes = subArgTypes, recUse = [UseGeneral] } val shimOuterLambda = { body = shimInnerLambda, name = name, argTypes = argTypes, closure = [LoadLocal mainAddress], resultType = resultType, isInline = Inline, localCount = 0, recUse = [UseGeneral] } val shimFunction = (shimAddress, shimOuterLambda) in (shimOuterLambda: lambdaForm, [mainFunction, shimFunction]) end | decurryFunction _ = raise InternalError "decurryFunction" (* Process a Lambda slightly differently in different contexts. *) datatype lambdaContext = LCNormal | LCRecursive | LCImmediateCall (* Transforming a lambda may result in producing auxiliary functions that are in general mutually recursive. *) fun mapLambdaResult([], lambda) = lambda | mapLambdaResult(bindings, lambda) = mkEnv([RecDecs(map(fn(addr, lam) => {addr=addr, use=[], lambda=lam}) bindings)], lambda) fun optimise (context, use) (Lambda lambda) = SOME(mapLambdaResult(optLambda(context, use, lambda, LCNormal))) | optimise (context, use) (Newenv(envDecs, envExp)) = let fun mapExp mapUse = mapCodetree (optimise(context, mapUse)) fun mapbinding(Declar{value, addr, use}) = Declar{value=mapExp use value, addr=addr, use=use} | mapbinding(RecDecs l) = let fun mapRecDec({addr, lambda, use}, rest) = case optLambda(context, use, lambda, LCRecursive) of (bindings, Lambda lambdaRes) => (* Turn any bindings into extra mutually-recursive functions. *) {addr=addr, use = use, lambda = lambdaRes } :: map (fn (addr, res) => {addr=addr, use=use, lambda=res }) bindings @ rest | _ => raise InternalError "mapbinding: not lambda" in RecDecs(foldl mapRecDec [] l) end | mapbinding(NullBinding exp) = NullBinding(mapExp [UseGeneral] exp) | mapbinding(Container{addr, use, size, setter}) = Container{addr=addr, use=use, size=size, setter = mapExp [UseGeneral] setter} in SOME(Newenv(map mapbinding envDecs, mapExp use envExp)) end (* Immediate call to a function. We may be able to expand this inline unless it is recursive. *) | optimise (context, use) (Eval {function = Lambda lambda, argList, resultType}) = let val args = map (fn (c, t) => (optGeneral context c, t)) argList val argTuples = map #1 args val (bindings, newLambda) = optLambda(context, [UseApply(use, argTuples)], lambda, LCImmediateCall) val call = Eval { function=newLambda, argList=args, resultType = resultType } in SOME(mapLambdaResult(bindings, call)) end | optimise (context as { reprocess, ...}, use) (Eval {function = Cond(i, t, e), argList, resultType}) = let (* Transform "(if i then t else e) x" into "if i then t x else e x". This allows for other optimisations and inline expansion. *) (* We duplicate the function arguments which could cause the size of the code to blow-up if they involve complicated expressions. *) fun pushFunction l = mapCodetree (optimise(context, use)) (Eval{function=l, argList=argList, resultType=resultType}) in reprocess := true; SOME(Cond(i, pushFunction t, pushFunction e)) end | optimise (context, use) (Eval {function, argList, resultType}) = (* If nothing else we need to ensure that "use" is correctly set on the function and arguments and we don't simply pass the original. *) let val args = map (fn (c, t) => (optGeneral context c, t)) argList val argTuples = map #1 args in SOME( Eval{ function= mapCodetree (optimise (context, [UseApply(use, argTuples)])) function, argList=args, resultType = resultType }) end | optimise (context, use) (Indirect{base, offset, isVariant = false}) = SOME(Indirect{base = mapCodetree (optimise(context, [UseField(offset, use)])) base, offset = offset, isVariant = false}) | optimise (context, use) (code as Cond _) = (* If the result of the if-then-else is always taken apart as fields then we are better off taking it apart further down and putting the fields into a container on the stack. *) if List.all(fn UseField _ => true | _ => false) use then SOME(optFields(code, context, use)) else NONE | optimise (context, use) (code as BeginLoop _) = (* If the result of the loop is taken apart we should push this down as well. *) if List.all(fn UseField _ => true | _ => false) use then SOME(optFields(code, context, use)) else NONE | optimise _ _ = NONE and optGeneral context exp = mapCodetree (optimise(context, [UseGeneral])) exp and optLambda( { debugArgs, reprocess, makeAddr, ... }, contextUse, { body, name, argTypes, resultType, closure, localCount, isInline, recUse, ...}, lambdaContext) : (int * lambdaForm) list * codetree = (* Optimisations on lambdas. 1. A lambda that simply calls another function with all its own arguments can be replaced by a reference to the function provided the "function" is a side-effect-free expression. 2. Don't attempt to optimise inline functions that are exported. 3. Transform lambdas that take tuples as arguments or are curried or where an argument is a function with tupled or curried arguments into a pair of an inline function with the original argument set and a new "main" function with register/stack arguments. *) let (* The overall use of the function is the context plus the recursive use. *) val use = contextUse @ recUse (* Check if it's a call to another function with all the original arguments. This is really wanted when we are passing this lambda as an argument to another function and really only when we have produced a shim function that has been inline expanded. Otherwise this will be a "small" function and will be inline expanded when it's used. *) val replaceBody = case (body, lambdaContext = LCRecursive) of (Eval { function, argList, resultType=callresult }, false) => let fun argSequence((Extract(LoadArgument a), _) :: rest, b) = a = b andalso argSequence(rest, b+1) | argSequence([], _) = true | argSequence _ = false val argumentsMatch = argSequence(argList, 0) andalso ListPair.allEq(fn((_, a), (b, _)) => a = b) (argList, argTypes) andalso callresult = resultType in if not argumentsMatch then NONE else case function of (* This could be any function which has neither side-effects nor depends on a reference nor depends on another argument but if it has local variables they would have to be renumbered into the surrounding scope. In practice we're really only interested in simple cases that arise as a result of using a "shim" function created in the code below. *) c as Constnt _ => SOME c | Extract(LoadClosure addr) => SOME(Extract(List.nth(closure, addr))) | _ => NONE end | _ => NONE in case replaceBody of SOME c => ([], c) | NONE => if isInline = Inline andalso List.exists (fn UseExport => true | _ => false) use then let (* If it's inline any application of this will be optimised after inline expansion. We still apply any opimisations to the body at this stage because we will compile and code-generate a version for use if we want a "general" value. *) val addressAllocator = ref localCount val optContext = { makeAddr = fn () => (! addressAllocator) before addressAllocator := ! addressAllocator + 1, reprocess = reprocess, debugArgs = debugArgs } val optBody = mapCodetree (optimise(optContext, [UseGeneral])) body val lambdaRes = { body = optBody, isInline = isInline, name = name, closure = closure, argTypes = argTypes, resultType = resultType, recUse = recUse, localCount = !addressAllocator (* After optimising body. *) } in ([], Lambda lambdaRes) end else let (* Allocate any new addresses after the existing ones. *) val addressAllocator = ref localCount val optContext = { makeAddr = fn () => (! addressAllocator) before addressAllocator := ! addressAllocator + 1, reprocess = reprocess, debugArgs = debugArgs } val optBody = mapCodetree (optimise(optContext, [UseGeneral])) body (* See if this should be expanded inline. If we are calling the lambda immediately we try to expand it unless maxInlineSize is zero. We may not be able to expand it if it is recursive. (It may have been inside an inline function). *) val maxInlineSize = DEBUG.getParameter DEBUG.maxInlineSizeTag debugArgs val (inlineType, updatedBody, localCount) = case evaluateInlining(optBody, List.length argTypes, if maxInlineSize <> 0 andalso lambdaContext = LCImmediateCall then 1000 else maxInlineSize) of NonRecursive => (Inline, optBody, ! addressAllocator) | TailRecursive bv => (Inline, replaceTailRecursiveWithLoop(optBody, argTypes, bv, addressAllocator), ! addressAllocator) | NonTailRecursive bv => if Vector.exists (fn n => n) bv then (Inline, liftRecursiveFunction( optBody, argTypes, bv, List.length closure, name, resultType, !addressAllocator), 0) else (NonInline, optBody, ! addressAllocator) (* All arguments have been modified *) | TooBig => (NonInline, optBody, ! addressAllocator) val lambda: lambdaForm = { body = updatedBody, name = name, argTypes = argTypes, closure = closure, resultType = resultType, isInline = inlineType, localCount = localCount, recUse = recUse } (* See if it should be transformed. We only do this if the function is not going to be inlined. If it is then there's no point because the transformation is going to be done as part of the inling process. Even if it's marked for inlining we may not actually call the function and instead pass it as an argument or return it as result but in that case transformation doesn't achieve anything because we are going to pass the untransformed "shim" function anyway. *) val (newLambda, bindings) = if isInline = NonInline then let val functionPattern = case usageForFunctionBody use of ArgPattCurry(arg1 :: arg2 :: moreArgs, res) => (* The function is always called with at least two curried arguments. We can decurry the function if the body is applicative - typically if it's a lambda - but not if applying the body would have a side-effect. We only do it one level at this stage. If it's curried more than that we'll come here again. *) (* In order to get the types we restrict this to the case of a body that is a lambda. The result is a function and therefore ArgPattSimple unless we are using up all the args. *) if (*reorderable body*) case updatedBody of Lambda _ => true | _ => false then ArgPattCurry([arg1, arg2], if null moreArgs then res else ArgPattSimple) else ArgPattCurry([arg1], ArgPattSimple) | usage => usage val argPatterns = map (usageForFunctionArg o #2) argTypes (* fullArgPattern is a list, one per level of currying, of a list, one per argument of the patterns. resultPattern is used to detect whether the result is a tuple that is taken apart. *) val (fullArgPattern, resultPattern) = case functionPattern of ArgPattCurry(_ :: rest, resPattern) => let (* The function is always applied at least to the first set of arguments. (It's never just passed). Merge the applications of the function with the use of the arguments. Return the usage within the function unless the function takes apart a tuple but no application passes in a tuple. *) fun merge(ArgPattTuple _, argUse as ArgPattTuple _) = argUse | merge(_, ArgPattTuple _) = ArgPattSimple | merge(_, argUse) = argUse val mergedArgs = (ListPair.mapEq merge (existTupling use, argPatterns)) :: rest (* *) val mergedResult = case (bodyReturnsTuple updatedBody, resPattern) of (bodyTuple as ArgPattTuple _, ArgPattSimple) => if existDetupling use then bodyTuple else ArgPattSimple | _ => resPattern in (mergedArgs, mergedResult) end | _ => (* Not called: either exported or passed as a value. *) (* If this is exported we don't know how it will be used so we assume that it is called with all its args and we detuple the result if it contains a tuple. *) if List.exists (fn UseExport => true | _ => false) use then ([argPatterns], bodyReturnsTuple updatedBody) else ([], ArgPattSimple) in case (fullArgPattern, resultPattern) of (_ :: _ :: _, _) => (* Curried *) ( reprocess := true; decurryFunction(lambda, makeAddr)) | (_, ArgPattTuple {filter, ...}) => (* Result is a tuple *) ( reprocess := true; detupleResult(lambda, filter, makeAddr)) | (first :: _, _) => let fun checkArg (ArgPattTuple{allConst=false, ...}) = true (* Function has at least one tupled arg. *) | checkArg (ArgPattCurry([_], ArgPattTuple{allConst=false, ...})) = true (* Function has an arg that is a function that returns a tuple. It must not be curried otherwise it returns a function not a tuple. *) (* This transformation is unsafe. See comment in transformFunctionArgument above. *) (*| checkArg (ArgPattCurry(_ :: _ :: _, _)) = true *) (* Function has an arg that is a curried function. *) | checkArg (ArgPattCurry(firstArgSet :: _, _)) = (* Function has an arg that is a function that takes a tuple in its first argument set. *) List.exists(fn ArgPattTuple{allConst=false, ...} => true | _ => false) firstArgSet | checkArg _ = false in (* It isn't curried - look at the arguments. *) if List.exists checkArg first then ( reprocess := true; transformFunctionArgs(lambda, first, makeAddr) ) else (lambda, []) end | _ => (lambda, []) end else (lambda, []) in (* If this is to be inlined but was not before we may need to reprocess. We don't reprocess if this is only exported. If it's only exported we're not going to expand it within this code and we can end up with repeated processing. *) if #isInline newLambda = Inline andalso isInline = NonInline andalso (case use of [UseExport] => false | _ => true) then reprocess := true else (); (bindings, Lambda newLambda) end end and optFields (code, context as { reprocess, makeAddr, ...}, use) = let (* We have an if-then-else or a loop whose result is only ever taken apart. We push this down. *) (* Find the fields that are used. Not all may be. *) local val maxField = List.foldl(fn (UseField(f, _), m) => Int.max(f, m) | (_, m) => m) 0 use val fieldUse = BoolArray.array(maxField+1, false) val _ = List.app(fn UseField(f, _) => BoolArray.update(fieldUse, f, true) | _ => ()) use in val maxField = maxField val useList = BoolArray.foldri (fn (i, true, l) => i :: l | (_, _, l) => l) [] fieldUse end fun pushContainer(Cond(ifpt, thenpt, elsept), leafFn) = Cond(ifpt, pushContainer(thenpt, leafFn), pushContainer(elsept, leafFn)) | pushContainer(Newenv(decs, exp), leafFn) = Newenv(decs, pushContainer(exp, leafFn)) | pushContainer(BeginLoop{loop, arguments}, leafFn) = (* If we push it through a BeginLoop we MUST then push it through anything that could contain the Loop i.e. Cond, Newenv, Handle. *) BeginLoop{loop = pushContainer(loop, leafFn), arguments=arguments} | pushContainer(l as Loop _, _) = l (* Within a BeginLoop only the non-Loop leaves return values. Loop entries go back to the BeginLoop so these are unchanged. *) | pushContainer(Handle{exp, handler}, leafFn) = Handle{exp=pushContainer(exp, leafFn), handler=pushContainer(handler, leafFn)} | pushContainer(tuple, leafFn) = leafFn tuple (* Anything else. *) val () = reprocess := true in case useList of [offset] => (* We only want a single field. Push down an Indirect. *) let (* However the context still requires a tuple. We need to reconstruct one with unused fields set to zero. They will be filtered out later by the simplifier pass. *) val field = optGeneral context (pushContainer(code, fn t => mkInd(offset, t))) fun mkFields n = if n = offset then field else CodeZero in Tuple{ fields = List.tabulate(offset+1, mkFields), isVariant = false } end | _ => let (* We require a container. *) val containerAddr = makeAddr() val width = List.length useList val loadContainer = Extract(LoadLocal containerAddr) fun setContainer tuple = (* At the leaf set the container. *) SetContainer{container = loadContainer, tuple = tuple, filter = fieldsToFilter useList } val setCode = optGeneral context (pushContainer(code, setContainer)) val makeContainer = Container{addr=containerAddr, use=[], size=width, setter=setCode} (* The context requires a tuple of the original width. We need to add dummy fields where necessary. *) val container = if width = maxField+1 then mkTupleFromContainer(containerAddr, width) else let fun mkField(n, m, hd::tl) = if n = hd then mkInd(m, loadContainer) :: mkField(n+1, m+1, tl) else CodeZero :: mkField(n+1, m, hd::tl) | mkField _ = [] in Tuple{fields = mkField(0, 0, useList), isVariant=false} end in mkEnv([makeContainer], container) end end (* TODO: convert "(if a then b else c) (args)" into if a then b(args) else c(args). This would allow for possible inlining and also passing information about call patterns. *) (* Once all the inlining is done we look for functions that can be compiled immediately. These are either functions with no free variables or functions where every use is a call, as opposed to being passed or returned as a closure. Functions that have free variables but are called can be lambda-lifted where the free variables are turned into extra parameters. The advantage compared with using a static-link or a closure on the stack is that they can be fully tail-recursive. With a static-link or stack closure the free variables have to remain on the stack until the function returns. *) fun lambdaLiftAndConstantFunction(code, debugSwitches, numLocals) = let val needReprocess = ref false (* At the moment this just code-generates immediately any lambdas without free-variables. The idea is to that we will get a constant which can then be inserted directly in references to the function. In general this takes a list of mutually recursive functions which can be code- generated immediately if all the free variables are other functions in the list. The simplifier has separated mutually recursive bindings into strongly connected components so we can consider the list as a single entity. *) fun processLambdas lambdaList = let (* First process the bodies of the functions. *) val needed = ! needReprocess val _ = needReprocess := false; val transLambdas = map (fn {lambda={body, isInline, name, closure, argTypes, resultType, localCount, recUse}, use, addr} => {lambda={body=mapChecks body, isInline=isInline, name=name, closure=closure, argTypes=argTypes, resultType=resultType, localCount=localCount, recUse=recUse}, use=use, addr=addr}) lambdaList val theseTransformed = ! needReprocess val _ = if needed then needReprocess := true else () fun hasFreeVariables{lambda={closure, ...}, ...} = let fun notInLambdas(LoadLocal lAddr) = (* A local is allowed if it only refers to another lambda. *) not (List.exists (fn {addr, ...} => addr = lAddr) lambdaList) | notInLambdas _ = true (* Anything else is not allowed. *) in List.exists notInLambdas closure end in if theseTransformed orelse List.exists (fn {lambda={isInline=Inline, ...}, ...} => true | _ => false) lambdaList orelse List.exists hasFreeVariables lambdaList (* If we have transformed any of the bodies we need to reprocess so defer any code-generation. Don't CG it if it is inline, or perhaps if it is inline and exported. Don't CG it if it has free variables. We still need to examine the bodies of the functions. *) then (transLambdas, []) else let (* Construct code to declare the functions and extract the values. *) val tupleFields = map (fn {addr, ...} => Extract(LoadLocal addr)) transLambdas val decsAndTuple = Newenv([RecDecs transLambdas], mkTuple tupleFields) val maxLocals = List.foldl(fn ({addr, ...}, n) => Int.max(addr, n)) 0 transLambdas val (code, props) = BACKEND.codeGenerate(decsAndTuple, maxLocals + 1, debugSwitches) val resultConstnt = Constnt(code(), props) fun getResults([], _) = [] | getResults({addr, use, ...} :: tail, n) = Declar {value=mkInd(n, resultConstnt), addr=addr, use=use} :: getResults(tail, n+1) val () = needReprocess := true in ([], getResults(transLambdas, 0)) end end and runChecks (Lambda (lambda as { isInline=NonInline, closure=[], ... })) = ( (* Bare lambda. *) case processLambdas[{lambda=lambda, use = [], addr = 0}] of ([{lambda=unCGed, ...}], []) => SOME(Lambda unCGed) | ([], [Declar{value, ...}]) => SOME value | _ => raise InternalError "processLambdas" ) | runChecks (Newenv(bindings, exp)) = let (* We have a block of bindings. Are any of them functions that are only ever called? *) fun checkBindings(Declar{value=Lambda lambda, addr, use}, tail) = ( (* Process this lambda and extract the result. *) case processLambdas[{lambda=lambda, use = use, addr = addr}] of ([{lambda=unCGed, use, addr}], []) => Declar{value=Lambda unCGed, use=use, addr=addr} :: tail | ([], cgedDec) => cgedDec @ tail | _ => raise InternalError "checkBindings" ) | checkBindings(Declar{value, addr, use}, tail) = Declar{value=mapChecks value, addr=addr, use=use} :: tail | checkBindings(RecDecs l, tail) = let val (notConsts, asConsts) = processLambdas l in asConsts @ (if null notConsts then [] else [RecDecs notConsts]) @ tail end | checkBindings(NullBinding exp, tail) = NullBinding(mapChecks exp) :: tail | checkBindings(Container{addr, use, size, setter}, tail) = Container{addr=addr, use=use, size=size, setter=mapChecks setter} :: tail in SOME(Newenv((List.foldr checkBindings [] bindings), mapChecks exp)) end | runChecks _ = NONE and mapChecks c = mapCodetree runChecks c in (mapCodetree runChecks code, numLocals, !needReprocess) end (* Main optimiser and simplifier loop. *) fun codetreeOptimiser(code, debugSwitches, numLocals) = let fun topLevel _ = raise InternalError "top level reached in optimiser" fun processTree (code, nLocals, optAgain) = let (* First run the simplifier. Among other things this does inline expansion and if it does any we at least need to run cleanProc on the code so it will have set simpAgain. *) val (simpCode, simpCount, simpAgain) = SIMPLIFIER.simplifier(code, nLocals) in if optAgain orelse simpAgain then let (* Identify usage information and remove redundant code. *) val printCodeTree = DEBUG.getParameter DEBUG.codetreeTag debugSwitches and compilerOut = PRETTY.getCompilerOutput debugSwitches val simpCode = SIMPLIFIER.specialToGeneral simpCode val () = if printCodeTree then compilerOut(PRETTY.PrettyString "Output of simplifier") else () val () = if printCodeTree then compilerOut (BASECODETREE.pretty simpCode) else () val preOptCode = REMOVE_REDUNDANT.cleanProc(simpCode, [UseExport], topLevel, simpCount) (* Print the code with the use information before it goes into the optimiser. *) val () = if printCodeTree then compilerOut(PRETTY.PrettyString "Output of cleaner") else () val () = if printCodeTree then compilerOut (BASECODETREE.pretty preOptCode) else () val reprocess = ref false (* May be set in the optimiser *) (* Allocate any new addresses after the existing ones. *) val addressAllocator = ref simpCount fun makeAddr() = (! addressAllocator) before addressAllocator := ! addressAllocator + 1 val optContext = { makeAddr = makeAddr, reprocess = reprocess, debugArgs = debugSwitches } (* Optimise the code, rewriting it as necessary. *) val optCode = mapCodetree (optimise(optContext, [UseExport])) preOptCode val (llCode, llCount, llAgain) = if ! reprocess (* Re-optimise *) then (optCode, ! addressAllocator, ! reprocess) else (* We didn't detect any inlineable functions. Check for lambda-lifting. *) lambdaLiftAndConstantFunction(optCode, debugSwitches, ! addressAllocator) (* Print the code after the optimiser. *) val () = if printCodeTree then compilerOut(PRETTY.PrettyString "Output of optimiser") else () val () = if printCodeTree then compilerOut (BASECODETREE.pretty llCode) else () in (* Rerun the simplifier at least. *) processTree(llCode, llCount, llAgain) end else (simpCode, simpCount) (* We're done *) end val (postOptCode, postOptCount) = processTree(code, numLocals, true (* Once at least *)) val (rGeneral, rDecs, rSpec) = postOptCode in { numLocals = postOptCount, general = rGeneral, bindings = rDecs, special = rSpec } end structure Sharing = struct type codetree = codetree and envSpecial = envSpecial and codeBinding = codeBinding end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_REMOVE_REDUNDANT.sml000066400000000000000000000422261265146633400246360ustar00rootroot00000000000000(* Copyright (c) 2012,13 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CODETREE_REMOVE_REDUNDANT( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing ) : sig type codetree type loadForm type codeUse val cleanProc : (codetree * codeUse list * (int -> loadForm) * int) -> codetree structure Sharing: sig type codetree = codetree and loadForm = loadForm and codeUse = codeUse end end = struct open BASECODETREE open CODETREE_FUNCTIONS exception InternalError = Misc.InternalError (* This function annotates the tree with information about how variables are used. This assists the optimiser to choose the best alternative for code. It also discards bindings that are unused and side-effect-free. These can arise as the result of optimiser constructing bindings in case they are required. That was originally its only function; hence the name. *) fun cleanProc (pt, procUses: codeUse list, prev: int * codeUse list -> loadForm, recursiveRef: codeUse list -> unit, localCount, checkArg) = let val locals = Array.array(localCount, []) fun addLocalUse addr use = Array.update(locals, addr, use @ Array.sub(locals, addr)) fun cleanLambda(lambda as {body, isInline, name, argTypes, resultType, localCount, closure, ...}: lambdaForm, lambdaUse) = let (* Rebuild the closure with the entries actually used. *) val closureUse = makeClosure() fun lookup (closureEntry, clUse) = let (* Find the original closure entry. *) val ext = List.nth(closure, closureEntry) (* Process the closure entry. We need to do this to record the usage information even if we have already seen this entry. *) val copied = cleanExtract(ext, clUse) in addToClosure closureUse copied end (* This array records the way the arguments are used inside the function. *) val argUses = Array.array (List.length argTypes, []) fun checkArg(addr, uses) = Array.update(argUses, addr, uses @ Array.sub(argUses, addr)) val recursiveRefRef = ref [] fun addRef use = recursiveRefRef := use @ !recursiveRefRef val resultOfApps = List.foldl (fn (UseApply (l, _), r) => l @ r | (UseExport, r) => UseExport :: r | (_, r) => UseGeneral :: r) [] val bodyUse = resultOfApps lambdaUse val bodyCode = cleanProc(body, bodyUse, lookup, addRef, localCount, checkArg) val recursiveApps = !recursiveRefRef (* If we have called this function somewhere and used the result that gives us a hint on the preferred result. If the function is recursive, though, we can't assume anything because the result of the recursive calls may be used in some other context. For example they could be passed into an argument function which may require more fields. That in turn affects any functions whose results are used. See Test138.ML. So, we check to see whether the result of recursive use has added anything to the original usage and reprocess the body if it has. *) val recursiveResults = resultOfApps recursiveApps val needReprocess = if null recursiveApps orelse List.exists(fn UseGeneral => true | UseExport => true | _ => false) bodyUse then NONE (* Not recursive or already general or export *) else if List.all(fn UseField _ => true | _ => false) bodyUse andalso List.all(fn UseField _ => true | _ => false) recursiveResults then (* All the entries are UseField - has the recursion added something new? *) if List.foldl (fn (UseField(n, _), false) => List.all (fn UseField(m, _) => m <> n | _ => raise InternalError "not UseField") bodyUse (* false if it's already there *) | (_, true) => true | _ => raise InternalError "not UseField") false recursiveResults then SOME recursiveApps else NONE else SOME [UseGeneral] (* If there's anything else reprocess it with UseGeneral *) in case needReprocess of SOME reprocessWith => cleanLambda(lambda, lambdaUse @ reprocessWith) | NONE => let val newClosure = extractClosure closureUse val newArgTypes = ListPair.zip(map #1 argTypes, Array.foldr (op ::) [] argUses) in {body=bodyCode, isInline=isInline, name=name, closure=newClosure, argTypes=newArgTypes, resultType=resultType, localCount=localCount, recUse = recursiveApps} : lambdaForm end end (* Process a load from a variable. Locals and arguments operate on the relevant array, closure entries involve a look-up *) and cleanExtract(ext as LoadLocal addr, codeUse) = ( (* Check we're actually adding to the usage. *) null codeUse andalso raise InternalError "cleanExtract: empty usage"; addLocalUse addr codeUse; ext ) | cleanExtract(ext as LoadArgument addr, codeUse) = ( checkArg(addr, codeUse); ext ) | cleanExtract(LoadClosure addr, codeUse) = prev(addr, codeUse) | cleanExtract(LoadRecursive, codeUse) = (recursiveRef codeUse; LoadRecursive) and cleanCode (code, codeUse) = let fun doClean codeUse (Newenv(decs, exp)) = let (* First process the expression so as to mark any references it makes. *) val processedExp = cleanCode (exp, codeUse) (* Process the declarations in reverse order. A binding may be used in a later declaration but apart from mutually-recursive functions no binding can be used in an earlier one. *) fun processDecs [] = [] | processDecs(Declar{value, addr, ...} :: rest) = let val processedRest = processDecs rest val decUses = case Array.sub(locals, addr) of [] => if sideEffectFree value then [] else [UseGeneral] | uses => uses in (* We can drop bindings that are unused if they have no side-effects. If we retain the binding we must set at least one reference. *) if null decUses then processedRest (* Skip it *) else let val cleanvalue = case value of Lambda lambda => Lambda(cleanLambda(lambda, decUses)) | value => cleanCode (value, decUses) in Declar{value=cleanvalue, addr=addr, use=decUses} :: processedRest end end | processDecs(RecDecs decs :: rest) = let val processedRest = processDecs rest (* We now know the entries that have actually been used in the rest of the code. We need to include those declarations and any that they use. The result we pass down may well exclude some or all recursive uses. We need to include UseGeneral in the result for safety. *) fun processMutuals([], excluded, true) = (* If we have included a function in this pass we have to reprocess the list of those we excluded before. *) processMutuals(excluded, [], false) | processMutuals([], _, false) = (* We didn't add anything more - finish *) [] | processMutuals( (this as {addr, lambda, ...}) :: rest, excluded, added) = ( case Array.sub(locals, addr) of [] => (* Put this on the excluded list. *) processMutuals(rest, this::excluded, added) | useSoFar => (* Process this then the rest of the list. *) (addr, cleanLambda(lambda, UseGeneral :: useSoFar)) :: processMutuals(rest, excluded, true) ) val entriesUsed = processMutuals(decs, [], false) (* Get all the uses now we're finished and have identified all the recursive uses. *) val processedDecs = map (fn(a, l) => {addr=a, lambda=l, use=Array.sub(locals, a)}) entriesUsed in if null processedDecs then processedRest else RecDecs processedDecs :: processedRest end | processDecs(NullBinding exp :: rest) = let val processedRest = processDecs rest in if sideEffectFree exp then processedRest else NullBinding(cleanCode(exp, [UseGeneral])) :: processedRest end | processDecs(Container{setter, size, addr, ...} :: rest) = let val processedRest = processDecs rest val decUses = case Array.sub(locals, addr) of [] => if sideEffectFree setter then [] else [UseGeneral] | uses => uses in (* We can drop bindings that are unused if they have no side-effects. If we retain the binding we must set at least one reference. *) (* Currently SetContainer is treated as having a side-effect so we will never discard this even if the container is unused. *) if null decUses then processedRest (* Skip it *) else Container{setter=cleanCode (setter, [UseGeneral]), addr=addr, size=size, use=decUses} :: processedRest end val processedDecs = processDecs decs in SOME(mkEnv(processedDecs, processedExp)) end (* Newenv *) (* Reference to a binding. *) | doClean codeUse (Extract ext) = SOME(Extract(cleanExtract(ext, codeUse))) (* Select a field from a tuple. We can't do this for selection from datatypes because some fields may not be present on all paths. *) | doClean codeUse (Indirect{base, offset, isVariant = false}) = (* Try to pass down the use. If the "base" is an Extract or another Indirect we may be able to record this information. If it is something else we can't. *) SOME(Indirect{base=cleanCode(base, [UseField(offset, codeUse)]), offset=offset, isVariant=false}) | doClean codeUse (Tuple{ fields, isVariant = false}) = let (* If the use of the tuple include UseGeneral or UseExport then every field is required. If, though, we have UseField we can transfer the corresponding usage onto the field of the tuple. *) fun fieldUse n (UseField(offset, uses), tl) = if n = offset then uses @ tl else tl | fieldUse _ (use, tl) = use :: tl fun fieldUses n = (* For the moment, if we find that the field is not used we set the usage to UseGeneral. I'm not convinced it would be safe to discard anything in the expression at this point. *) case List.foldl(fieldUse n) [] codeUse of [] => [UseGeneral] | other => other fun processField([], _) = [] | processField(hd::tl, n) = cleanCode(hd, fieldUses n) :: processField(tl, n+1) in SOME(Tuple{ fields = processField(fields, 0), isVariant = false}) end | doClean codeUse (Lambda lam) = SOME(Lambda(cleanLambda(lam, codeUse))) | doClean codeUse (Eval{function, argList, resultType}) = (* As with Indirect we try to pass this information down so that if the function is a variable it will be marked as "called". *) let val args = map (fn (c, t) => (cleanCode(c, [UseGeneral]), t)) argList val argTuples = map #1 args in SOME( Eval{ function=cleanCode(function, [UseApply(codeUse, argTuples)]), argList=args, resultType = resultType }) end | doClean codeUse (Cond(i, t, e)) = SOME(Cond(cleanCode(i, [UseGeneral]), cleanCode(t, codeUse), cleanCode(e, codeUse))) | doClean use (BeginLoop{loop, arguments}) = let val cleanBody = cleanCode(loop, use) (* TODO: If the arguments are not actually used (e.g. Succeed/Test114) we should remove them but then we also have to remove the corresponding arguments from the Loop nodes. We have to be careful about side-effects. At the moment we add a UseGeneral if the value is not used to ensure that we always pass a non-null list to any Extract node used in the actual argument. *) fun mapArg({value, addr, use}, t) = ({value=cleanCode(value, if null use then [UseGeneral] else use), addr=addr, use=use}, t) in SOME(BeginLoop {loop = cleanBody, arguments = map mapArg arguments}) end | doClean _ _ = NONE (* Anything else *) in (* If we recognise this as a special case we use the result otherwise we process it as a general value using UseGeneral as the usage. *) case doClean codeUse code of SOME result => result | NONE => mapCodetree (doClean [UseGeneral]) code end in cleanCode (pt, procUses) end (* cleanProc *) val cleanProc = fn (code, procUse, prev, localCount) => cleanProc(code, procUse, fn (i, _) => prev i, fn _ => (), localCount, fn _ => ()) structure Sharing = struct type codetree = codetree and loadForm = loadForm and codeUse = codeUse end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_SIMPLIFIER.sml000066400000000000000000001300361265146633400236750ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is a cut-down version of the optimiser which simplifies the code but does not apply any heuristics. It follows chained bindings, in particular through tuples, folds constants expressions involving built-in functions, expands inline functions that have previously been marked as inlineable. It does not detect small functions that can be inlined nor does it code-generate functions without free variables. *) functor CODETREE_SIMPLIFIER( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure REMOVE_REDUNDANT: sig type codetree type loadForm type codeUse val cleanProc : (codetree * codeUse list * (int -> loadForm) * int) -> codetree structure Sharing: sig type codetree = codetree and loadForm = loadForm and codeUse = codeUse end end sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = REMOVE_REDUNDANT.Sharing ) : sig type codetree and codeBinding and envSpecial val simplifier: codetree * int -> (codetree * codeBinding list * envSpecial) * int * bool val specialToGeneral: codetree * codeBinding list * envSpecial -> codetree structure Sharing: sig type codetree = codetree and codeBinding = codeBinding and envSpecial = envSpecial end end = struct open BASECODETREE open Address open CODETREE_FUNCTIONS exception InternalError = Misc.InternalError exception RaisedException type simpContext = { lookupAddr: loadForm -> envGeneral * envSpecial, enterAddr: int * (envGeneral * envSpecial) -> unit, nextAddress: unit -> int, reprocess: bool ref } fun envGeneralToCodetree(EnvGenLoad ext) = Extract ext | envGeneralToCodetree(EnvGenConst w) = Constnt w fun mkDec (laddr, res) = Declar{value = res, addr = laddr, use=[]} fun mkEnv([], exp) = exp | mkEnv(decs, exp as Extract(LoadLocal loadAddr)) = ( (* A common case is where we have a binding as the last item and then a load of that binding. Reduce this so other optimisations are possible. This is still something of a special case that could/should be generalised. *) case List.last decs of Declar{addr=decAddr, value, ... } => if loadAddr = decAddr then mkEnv(List.take(decs, List.length decs - 1), value) else Newenv(decs, exp) | _ => Newenv(decs, exp) ) | mkEnv(decs, exp) = Newenv(decs, exp) fun isConstnt(Constnt _) = true | isConstnt _ = false (* Wrap up the general, bindings and special value as a codetree node. The special entry is discarded except for Constnt entries which are converted to ConstntWithInline. That allows any inlineable code to be carried forward to later passes. *) fun specialToGeneral(g, b as _ :: _, s) = mkEnv(b, specialToGeneral(g, [], s)) | specialToGeneral(Constnt(w, p), [], s) = Constnt(w, setInline s p) | specialToGeneral(g, [], _) = g (* Call and RTS function to fold constants. The function must be safe to evaluate "early". *) fun callRTSFunction(rtsCall: machineWord, argList) = let exception Interrupt = Thread.Thread.Interrupt val _ = (isIoAddress(toAddress rtsCall) andalso earlyRtsCall rtsCall) orelse raise InternalError "not early rts" (* Turn the arguments into a vector. *) val argVector = case makeConstVal(mkTuple argList) of Constnt(w, _) => w | _ => raise InternalError "makeConstVal: Not constant" (* Call the function. If it raises an exception (e.g. divide by zero) generate code to raise the exception at run-time. We don't do that for Interrupt which we assume only arises by user interaction and not as a result of executing the code so we reraise that exception immediately. *) in Constnt (call(toAddress rtsCall, argVector), []) handle exn as Interrupt => raise exn (* Must not handle this *) | exn => Raise (Constnt(toMachineWord exn, [])) end fun simplify(c, s) = mapCodetree (simpGeneral s) c (* Process the codetree to return a codetree node. This is used when we don't want the special case. *) and simpGeneral { lookupAddr, ...} (Extract ext) = let val (gen, spec) = lookupAddr ext in SOME(specialToGeneral(envGeneralToCodetree gen, [], spec)) end | simpGeneral context (Newenv envArgs) = SOME(specialToGeneral(simpNewenv(envArgs, context))) | simpGeneral context (Lambda lambda) = SOME(Lambda(#1(simpLambda(lambda, context, NONE, NONE)))) | simpGeneral context (Eval {function, argList, resultType}) = SOME(specialToGeneral(simpFunctionCall(function, argList, resultType, context))) | simpGeneral context (Cond(condTest, condThen, condElse)) = SOME(specialToGeneral(simpIfThenElse(condTest, condThen, condElse, context))) | simpGeneral context (Tuple { fields, isVariant }) = SOME(specialToGeneral(simpTuple(fields, isVariant, context))) | simpGeneral context (Indirect{ base, offset, isVariant }) = SOME(specialToGeneral(simpFieldSelect(base, offset, isVariant, context))) | simpGeneral context (SetContainer{container, tuple, filter}) = let val optCont = simplify(container, context) val (cGen, cDecs, cSpec) = simpSpecial(tuple, context) in case cSpec of (* If the tuple is a local binding it is simpler to pick it up from the "special" entry. *) EnvSpecTuple(size, recEnv) => let val fields = List.tabulate(size, envGeneralToCodetree o #1 o recEnv) in SOME(simpPostSetContainer(optCont, Tuple{isVariant=false, fields=fields}, cDecs, filter)) end | _ => SOME(simpPostSetContainer(optCont, cGen, cDecs, filter)) end | simpGeneral (context as { enterAddr, nextAddress, reprocess, ...}) (BeginLoop{loop, arguments, ...}) = let val didReprocess = ! reprocess (* To see if we really need the loop first try simply binding the arguments and process it. It's often the case that if one or more arguments is a constant that the looping case will be eliminated. It would be possible to look more carefully and eliminate arguments that do not change round the loop. *) val withoutBeginLoop = simplify(mkEnv(List.map (Declar o #1) arguments, loop), context) (* Check if the Loop instruction is there. This assumes that these are the only tail-recursive cases. *) fun hasLoop (Loop _) = true | hasLoop (Newenv(_, exp)) = hasLoop exp | hasLoop (Cond(_, t, e)) = hasLoop t orelse hasLoop e | hasLoop (Handle {handler, ...}) = hasLoop handler | hasLoop (SetContainer{tuple, ...}) = hasLoop tuple | hasLoop _ = false in if not (hasLoop withoutBeginLoop) then SOME withoutBeginLoop else let (* Reset "reprocess". It may have been set in the withoutBeginLoop that's not the code we're going to return. *) val () = reprocess := didReprocess (* We need the BeginLoop. Create new addresses for the arguments. *) fun declArg({addr, value, use, ...}, typ) = let val newAddr = nextAddress() in enterAddr(addr, (EnvGenLoad(LoadLocal newAddr), EnvSpecNone)); ({addr = newAddr, value = simplify(value, context), use = use }, typ) end val declArgs = map declArg arguments val beginBody = simplify(loop, context) in SOME(BeginLoop {loop=beginBody, arguments=declArgs}) end end | simpGeneral context (TagTest{test, tag, maxTag}) = ( case simplify(test, context) of Constnt(testResult, _) => if isShort testResult andalso toShort testResult = tag then SOME CodeTrue else SOME CodeFalse | sTest => SOME(TagTest{test=sTest, tag=tag, maxTag=maxTag}) ) | simpGeneral _ _ = NONE (* Where we have an Indirect or Eval we want the argument as either a tuple or an inline function respectively if that's possible. Getting that also involves various other cases as well. Because a binding may later be used in such a context we treat any binding in that way as well. *) and simpSpecial (Extract ext, { lookupAddr, ...}) = let val (gen, spec) = lookupAddr ext in (envGeneralToCodetree gen, [], spec) end | simpSpecial (Newenv envArgs, context) = simpNewenv(envArgs, context) | simpSpecial (Lambda lambda, context) = let val (gen, spec) = simpLambda(lambda, context, NONE, NONE) in (Lambda gen, [], spec) end | simpSpecial (Eval {function, argList, resultType}, context) = simpFunctionCall(function, argList, resultType, context) | simpSpecial (Cond(condTest, condThen, condElse), context) = simpIfThenElse(condTest, condThen, condElse, context) | simpSpecial (Tuple { fields, isVariant }, context) = simpTuple(fields, isVariant, context) | simpSpecial (Indirect{ base, offset, isVariant }, context) = simpFieldSelect(base, offset, isVariant, context) | simpSpecial (c: codetree, s: simpContext): codetree * codeBinding list * envSpecial = let (* Anything else - copy it and then split it into the fields. *) fun split(Newenv(l, e)) = let (* Pull off bindings. *) val (c, b, s) = split e in (c, l @ b, s) end | split(Constnt(m, p)) = (Constnt(m, p), [], findInline p) | split c = (c, [], EnvSpecNone) in split(simplify(c, s)) end (* Process a Newenv. We need to add the bindings to the context. *) and simpNewenv((envDecs, envExp), context as { enterAddr, nextAddress, reprocess, ...}) = let fun copyDecs [] = (* End of the list - process the result expression. *) simpSpecial(envExp, context) | copyDecs (Declar{addr, value, ...} :: vs) = ( case simpSpecial(value, context) of (* If this raises an exception stop here. *) vBinding as (Raise _, _, _) => vBinding | vBinding => let (* Add the declaration to the table. *) val (optV, dec) = makeNewDecl(vBinding, context) val () = enterAddr(addr, optV) (* Deal with the rest of the block. *) val (rGen, rDecs, rSpec) = copyDecs vs in (rGen, dec @ rDecs, rSpec) end ) | copyDecs(NullBinding v :: vs) = (* Not a binding - process this and the rest.*) ( case simpSpecial(v, context) of (* If this raises an exception stop here. *) vBinding as (Raise _, _, _) => vBinding | (cGen, cDecs, _) => let val (rGen, rDecs, rSpec) = copyDecs vs in (rGen, cDecs @ (NullBinding cGen :: rDecs), rSpec) end ) | copyDecs(RecDecs mutuals :: vs) = (* Mutually recursive declarations. Any of the declarations may refer to any of the others. They should all be lambdas. The front end generates functions with more than one argument (either curried or tupled) as pairs of mutually recursive functions. The main function body takes its arguments on the stack (or in registers) and the auxiliary inline function, possibly nested, takes the tupled or curried arguments and calls it. If the main function is recursive it will first call the inline function which is why the pair are mutually recursive. As far as possible we want to use the main function since that uses the least memory. Specifically, if the function recurses we want the recursive call to pass all the arguments if it can. *) let (* Reorder the function so the explicitly-inlined ones come first. Their code can then be inserted into the main functions. *) local val (inlines, nonInlines) = List.partition ( fn {lambda = { isInline=Inline, ...}, ... } => true | _ => false) mutuals in val orderedDecs = inlines @ nonInlines end (* Go down the functions creating new addresses for them and entering them in the table. *) val addresses = map (fn {addr, ... } => let val decAddr = nextAddress() in enterAddr (addr, (EnvGenLoad(LoadLocal decAddr), EnvSpecNone)); decAddr end) orderedDecs fun processFunction({ lambda, addr, ... }, newAddr) = let val (gen, spec) = simpLambda(lambda, context, SOME addr, SOME newAddr) (* Update the entry in the table to include any inlineable function. *) val () = enterAddr (addr, (EnvGenLoad (LoadLocal newAddr), spec)) in {addr=newAddr, lambda=gen, use=[]} end val rlist = ListPair.map processFunction (orderedDecs, addresses) (* Deal with the rest of the block *) val (rGen, rDecs, rSpec) = copyDecs vs in (* and put these declarations onto the list. *) (rGen, partitionMutableBindings(RecDecs rlist) @ rDecs, rSpec) end | copyDecs (Container{addr, size, setter, ...} :: vs) = let (* Enter the new address immediately - it's needed in the setter. *) val decAddr = nextAddress() val () = enterAddr (addr, (EnvGenLoad(LoadLocal decAddr), EnvSpecNone)) val (setGen, setDecs, _) = simpSpecial(setter, context) in (* If we have inline expanded a function that sets the container we're better off eliminating the container completely. *) case setGen of SetContainer { tuple, filter, container } => let (* Check the container we're setting is the address we've made for it. *) val _ = (case container of Extract(LoadLocal a) => a = decAddr | _ => false) orelse raise InternalError "copyDecs: Container/SetContainer" val newDecAddr = nextAddress() val () = enterAddr (addr, (EnvGenLoad(LoadLocal newDecAddr), EnvSpecNone)) val (rGen, rDecs, rSpec) = copyDecs vs val tupleAddr = nextAddress() val tupleDec = Declar{addr=tupleAddr, use=[], value=tuple} val tupleLoad = mkLoadLocal tupleAddr val resultTuple = BoolVector.foldri(fn (i, true, l) => mkInd(i, tupleLoad) :: l | (_, false, l) => l) [] filter val _ = List.length resultTuple = size orelse raise InternalError "copyDecs: Container/SetContainer size" val containerDec = Declar{addr=newDecAddr, use=[], value=mkTuple resultTuple} val _ = reprocess := true in (rGen, setDecs @ tupleDec :: containerDec :: rDecs, rSpec) end | _ => let val (rGen, rDecs, rSpec) = copyDecs vs val dec = Container{addr=decAddr, use=[], size=size, setter=mkEnv(setDecs, setGen)} in (rGen, dec :: rDecs, rSpec) end end in copyDecs envDecs end (* Prepares a binding for entry into a look-up table. Returns the entry to put into the table together with any bindings that must be made. If the general part of the optVal is a constant we can just put the constant in the table. If it is a load (Extract) it is just renaming an existing entry so we can return it. Otherwise we have to make a new binding and return a load (Extract) entry for it. *) and makeNewDecl((Constnt w, decs, spec), _) = ((EnvGenConst w, spec), decs) (* No need to create a binding for a constant. *) | makeNewDecl((Extract ext, decs, spec), _) = ((EnvGenLoad ext, spec), decs) (* Binding is simply giving a new name to a variable - can ignore this declaration. *) | makeNewDecl((gen, decs, spec), { nextAddress, ...}) = let (* Create a binding for this value. *) val newAddr = nextAddress() in ((EnvGenLoad(LoadLocal newAddr), spec), decs @ [mkDec(newAddr, gen)]) end and simpLambda({body, isInline, name, argTypes, resultType, closure, localCount, ...}, { lookupAddr, reprocess, ... }, myOldAddrOpt, myNewAddrOpt) = let (* A new table for the new function. *) val oldAddrTab = Array.array (localCount, NONE) val optClosureList = makeClosure() val isNowRecursive = ref false local fun localOldAddr (LoadLocal addr) = valOf(Array.sub(oldAddrTab, addr)) | localOldAddr (ext as LoadArgument _) = (EnvGenLoad ext, EnvSpecNone) | localOldAddr (ext as LoadRecursive) = (EnvGenLoad ext, EnvSpecNone) | localOldAddr (LoadClosure addr) = let val oldEntry = List.nth(closure, addr) (* If the entry in the closure is our own address this is recursive. *) fun isRecursive(EnvGenLoad(LoadLocal a), SOME b) = if a = b then (isNowRecursive := true; true) else false | isRecursive _ = false in if isRecursive(EnvGenLoad oldEntry, myOldAddrOpt) then (EnvGenLoad LoadRecursive, EnvSpecNone) else let val newEntry = lookupAddr oldEntry val makeClosure = addToClosure optClosureList fun convertResult(genEntry, specEntry) = (* If after looking up the entry we get our new address it's recursive. *) if isRecursive(genEntry, myNewAddrOpt) then (EnvGenLoad LoadRecursive, EnvSpecNone) else let val newGeneral = case genEntry of EnvGenLoad ext => EnvGenLoad(makeClosure ext) | EnvGenConst w => EnvGenConst w (* Have to modify the environment here so that if we look up free variables we add them to the closure. *) fun convertEnv env args = convertResult(env args) val newSpecial = case specEntry of EnvSpecTuple(size, env) => EnvSpecTuple(size, convertEnv env) | EnvSpecInlineFunction(spec, env) => EnvSpecInlineFunction(spec, convertEnv env) | EnvSpecNone => EnvSpecNone in (newGeneral, newSpecial) end in convertResult newEntry end end and setTab (index, v) = Array.update (oldAddrTab, index, SOME v) in val newAddressAllocator = ref 0 fun mkAddr () = ! newAddressAllocator before newAddressAllocator := ! newAddressAllocator + 1 val newCode = simplify (body, { enterAddr = setTab, lookupAddr = localOldAddr, nextAddress=mkAddr, reprocess = reprocess }) end val closureAfterOpt = extractClosure optClosureList val localCount = ! newAddressAllocator (* If we have mutually recursive "small" functions we may turn them into recursive functions. We have to remove the "small" status from them to prevent them from being expanded inline anywhere else. The optimiser may turn them back into "small" functions if the recursion is actually tail-recursion. *) val isNowInline = case isInline of Inline => if ! isNowRecursive then NonInline else Inline | NonInline => NonInline (* Clean up the function body at this point if it could be inlined. There are examples where failing to do this can blow up. This can be the result of creating both a general and special function inside an inline function. *) val cleanBody = case isNowInline of NonInline => newCode | _ => REMOVE_REDUNDANT.cleanProc(newCode, [UseExport], LoadClosure, localCount) val copiedLambda: lambdaForm = { body = cleanBody, isInline = isNowInline, name = name, closure = closureAfterOpt, argTypes = argTypes, resultType = resultType, localCount = localCount, recUse = [] } val inlineCode = case isNowInline of NonInline => EnvSpecNone | _ => EnvSpecInlineFunction(copiedLambda, fn addr => (EnvGenLoad(List.nth(closureAfterOpt, addr)), EnvSpecNone)) in ( copiedLambda, inlineCode ) end and simpFunctionCall(function, argList, resultType, context as { reprocess, ...}) = let (* Function call - This may involve inlining the function. We may also be able to call the function immediately if it is a simple built-in function and the arguments are constants. *) (* Get the function to be called and see if it is inline or a lambda expression. *) val funct as (genFunct, decsFunct, specFunct) = simpSpecial(function, context) (* We have to make a special check here that we are not passing in the function we are trying to expand. This could result in an infinitely recursive expansion. It is only going to happen in very special circumstances such as a definition of the Y combinator. If we see that we don't attempt to expand inline. It could be embedded in a tuple or the closure of a function as well as passed directly. *) val isRecursiveArg = case function of Extract extOrig => let fun containsFunction(Extract thisArg, v) = (v orelse thisArg = extOrig, FOLD_DESCEND) | containsFunction(Lambda{closure, ...}, v) = (* Only the closure, not the body *) (foldl (fn (c, w) => foldtree containsFunction w (Extract c)) v closure, FOLD_DONT_DESCEND) | containsFunction(Eval _, v) = (v, FOLD_DONT_DESCEND) (* OK if it's called *) | containsFunction(_, v) = (v, FOLD_DESCEND) in List.exists(fn (c, _) => foldtree containsFunction false c) argList end | _ => false in case (specFunct, genFunct, isRecursiveArg) of (EnvSpecInlineFunction({body=lambdaBody, localCount, argTypes, ...}, functEnv), _, false) => let val _ = List.length argTypes = List.length argList orelse raise InternalError "simpFunctionCall: argument mismatch" val () = reprocess := true (* If we expand inline we have to reprocess *) val (_, functDecs, _) = funct and { nextAddress, reprocess, ...} = context (* Expand a function inline, either one marked explicitly to be inlined or one detected as "small". *) (* Calling inline proc or a lambda expression which is just called. The function is replaced with a block containing declarations of the parameters. We need a new table here because the addresses we use to index it are the addresses which are local to the function. New addresses are created in the range of the surrounding function. *) val localVec = Array.array(localCount, NONE) local val (params, bindings) = ListPair.unzip( List.map (fn (h, _) => makeNewDecl(simpSpecial(h, context), context)) argList) val paramVec = Vector.fromList params in fun getParameter n = Vector.sub(paramVec, n) (* Bindings necessary for the arguments *) val copiedArgs = List.foldr (op @) [] bindings end local fun localOldAddr(LoadLocal addr) = valOf(Array.sub(localVec, addr)) | localOldAddr(LoadArgument addr) = getParameter addr | localOldAddr(LoadClosure closureEntry) = functEnv closureEntry | localOldAddr LoadRecursive = raise InternalError "localOldAddr: LoadRecursive" fun setTabForInline (index, v) = Array.update (localVec, index, SOME v) val lambdaContext = { lookupAddr=localOldAddr, enterAddr=setTabForInline, nextAddress=nextAddress, reprocess = reprocess } in val (cGen, cDecs, cSpec) = simpSpecial(lambdaBody,lambdaContext) end in (cGen, functDecs @ (copiedArgs @ cDecs), cSpec) end | (_, gen as Constnt(w, _), _) => (* Not inlinable - constant function. *) let val copiedArgs = map (fn (arg, argType) => (simplify(arg, context), argType)) argList (* If the function is an RTS call that is safe to evaluate immediately and all the arguments are constants evaluate it now. *) val evCopiedCode = if isIoAddress(toAddress w) andalso earlyRtsCall w andalso List.all (isConstnt o #1) copiedArgs then callRTSFunction(w, List.map #1 copiedArgs) else Eval {function = gen, argList = copiedArgs, resultType=resultType} in (evCopiedCode, decsFunct, EnvSpecNone) end | (_, gen, _) => (* Anything else. *) let val copiedArgs = map (fn (arg, argType) => (simplify(arg, context), argType)) argList val evCopiedCode = Eval {function = gen, argList = copiedArgs, resultType=resultType} in (evCopiedCode, decsFunct, EnvSpecNone) end end and simpIfThenElse(condTest, condThen, condElse, context) = (* If-then-else. The main simplification is if we have constants in the test or in both the arms. *) let val word0 = toMachineWord 0 val word1 = toMachineWord 1 val False = word0 val True = word1 in case simpSpecial(condTest, context) of (* If the test is a constant we can return the appropriate arm and ignore the other. *) (Constnt(testResult, _), bindings, _) => let val arm = if wordEq (testResult, False) (* false - return else-part *) then condElse (* if false then x else y == y *) (* if true then x else y == x *) else condThen val (c, b, s) = simpSpecial(arm, context) in (c, bindings @ b, s) end | test => let val simpTest = specialToGeneral test local open RuntimeCalls val ioOp : int -> machineWord = RunCall.run_call1 POLY_SYS_io_operation fun rtsFunction v = Constnt(ioOp v, []) fun mkEval (ct, clist) = Eval { function = ct, argList = List.map(fn c => (c, GeneralType)) clist, resultType=GeneralType } in fun mkNot arg = mkEval (rtsFunction POLY_SYS_not_bool, [arg]) end in case (simpSpecial(condThen, context), simpSpecial(condElse, context)) of ((thenConst as Constnt(thenVal, _), [], _), (elseConst as Constnt(elseVal, _), [], _)) => (* Both arms return constants. This situation can arise in situations where we have andalso/orelse where the second "argument" has been reduced to a constant. *) if wordEq (thenVal, elseVal) then (* Include the test in the decs in case it has side-effects. *) (thenConst (* or elseConst *), [NullBinding simpTest], EnvSpecNone) (* if x then true else false == x *) else if wordEq (thenVal, True) andalso wordEq (elseVal, False) then (simpTest, [], EnvSpecNone) (* if x then false else true == not x *) else if wordEq (thenVal, False) andalso wordEq (elseVal, True) then (mkNot simpTest, [], EnvSpecNone) else (* can't optimise *) (Cond (simpTest, thenConst, elseConst), [], EnvSpecNone) (* Rewrite "if x then raise y else z" into "(if x then raise y else (); z)" The advantage is that any tuples in z are lifted outside the "if". *) | (thenPart as (Raise _, _, _), (elsePart, elseBindings, elseSpec)) => (* then-part raises an exception *) (elsePart, NullBinding(Cond (simpTest, specialToGeneral thenPart, CodeZero)) :: elseBindings, elseSpec) | ((thenPart, thenBindings, thenSpec), elsePart as (Raise _, _, _)) => (* else part raises an exception *) (thenPart, NullBinding(Cond (simpTest, CodeZero, specialToGeneral elsePart)) :: thenBindings, thenSpec) | (thenPart, elsePart) => (Cond (simpTest, specialToGeneral thenPart, specialToGeneral elsePart), [], EnvSpecNone) end end (* Tuple construction. Tuples are also used for datatypes and structures (i.e. modules) *) and simpTuple(entries, isVariant, context) = (* The main reason for optimising record constructions is that they appear as tuples in ML. We try to ensure that loads from locally created tuples do not involve indirecting from the tuple but can get the value which was put into the tuple directly. If that is successful we may find that the tuple is never used directly so the use-count mechanism will ensure it is never created. *) let val tupleSize = List.length entries (* The record construction is treated as a block of local declarations so that any expressions which might have side-effects are done exactly once. *) val (fieldEntries, bindings) = ListPair.unzip(List.map(fn h => makeNewDecl(simpSpecial(h, context), context)) entries) (* Make sure we include any inline code in the result. If this tuple is being "exported" we will lose the "special" part. *) fun envResToCodetree(EnvGenLoad(ext), _) = Extract ext | envResToCodetree(EnvGenConst(w, p), s) = Constnt(w, setInline s p) val generalFields = List.map envResToCodetree fieldEntries val genRec = if List.all isConstnt generalFields then makeConstVal(Tuple{ fields = generalFields, isVariant = isVariant }) else Tuple{ fields = generalFields, isVariant = isVariant } val allBindings = List.foldr(op @) [] bindings val specRec = EnvSpecTuple(tupleSize, fn addr => List.nth(fieldEntries, addr)) in (genRec, allBindings, specRec) end and simpFieldSelect(base, offset, isVariant, context) = let val (genSource, decSource, specSource) = simpSpecial(base, context) in (* Try to do the selection now if possible. *) case specSource of EnvSpecTuple(_, recEnv) => let (* The "special" entry we've found is a tuple. That means that we are taking a field from a tuple we made earlier and so we should be able to get the original code we used when we made the tuple. That might mean the tuple is never used and we can optimise away the construction of it completely. *) val (newGen, newSpec) = recEnv offset in (envGeneralToCodetree newGen, decSource, newSpec) end | _ => (* No special case possible. If the tuple is a constant mkInd/mkVarField will do the selection immediately. *) ((if isVariant then mkVarField else mkInd) (offset, genSource), decSource, EnvSpecNone) end (* Process a SetContainer. Unlike the other simpXXX functions this is called after the arguments have been processed. We try to push the SetContainer to the leaves of the expression. *) and simpPostSetContainer(container, Tuple{fields, ...}, tupleDecs, filter) = let (* Apply the filter now. *) fun select(n, hd::tl) = if n >= BoolVector.length filter then [] else if BoolVector.sub(filter, n) then hd :: select(n+1, tl) else select(n+1, tl) | select(_, []) = [] val selected = select(0, fields) (* Frequently we will have produced an indirection from the same base. These will all be bindings so we have to reverse the process. *) fun findOriginal a = List.find(fn Declar{addr, ...} => addr = a | _ => false) tupleDecs fun checkFields(last, Extract(LoadLocal a) :: tl) = ( case findOriginal a of SOME(Declar{value=Indirect{base=Extract ext, isVariant=false, offset, ...}, ...}) => ( case last of NONE => checkFields(SOME(ext, [offset]), tl) | SOME(lastExt, offsets) => (* It has to be the same base and with increasing offsets (no reordering). *) if lastExt = ext andalso offset > hd offsets then checkFields(SOME(ext, offset :: offsets), tl) else NONE ) | _ => NONE ) | checkFields(_, _ :: _) = NONE | checkFields(last, []) = last fun fieldsToFilter fields = let val maxDest = List.foldl Int.max ~1 fields val filterArray = BoolArray.array(maxDest+1, false) val _ = List.app(fn n => BoolArray.update(filterArray, n, true)) fields in BoolArray.vector filterArray end in case checkFields(NONE, selected) of SOME (ext, fields) => let val filter = fieldsToFilter fields in case ext of LoadLocal localAddr => let (* Is this a container? If it is and we're copying all of it we can replace the inner container with a binding to the outer. We have to be careful because it is possible that we may create and set the inner container, then have some bindings that do some side-effects with the inner container before then copying it to the outer container. For simplicity and to maintain the condition that the container is set in the tails we only merge the containers if it's at the end (after any "filtering"). *) val allSet = BoolVector.foldl (fn (a, t) => a andalso t) true filter fun findContainer [] = NONE | findContainer (Declar{value, ...} :: tl) = if sideEffectFree value then findContainer tl else NONE | findContainer (Container{addr, size, setter, ...} :: tl) = if localAddr = addr andalso size = BoolVector.length filter andalso allSet then SOME (setter, tl) else NONE | findContainer _ = NONE in case findContainer (List.rev tupleDecs) of SOME (setter, decs) => (* Put in a binding for the inner container address so the setter will set the outer container. *) mkEnv(List.rev(Declar{addr=localAddr, value=container, use=[]} :: decs), setter) | NONE => mkEnv(tupleDecs, SetContainer{container=container, tuple = Extract ext, filter=filter}) end | _ => mkEnv(tupleDecs, SetContainer{container=container, tuple = Extract ext, filter=filter}) end | NONE => mkEnv(tupleDecs, SetContainer{container=container, tuple = mkTuple selected, filter=BoolVector.tabulate(List.length selected, fn _ => true)}) end | simpPostSetContainer(container, Cond(ifpt, thenpt, elsept), tupleDecs, filter) = mkEnv(tupleDecs, Cond(ifpt, simpPostSetContainer(container, thenpt, [], filter), simpPostSetContainer(container, elsept, [], filter))) | simpPostSetContainer(container, Newenv(envDecs, envExp), tupleDecs, filter) = simpPostSetContainer(container, envExp, tupleDecs @ envDecs, filter) | simpPostSetContainer(container, BeginLoop{loop, arguments}, tupleDecs, filter) = mkEnv(tupleDecs, BeginLoop{loop = simpPostSetContainer(container, loop, [], filter), arguments=arguments}) | simpPostSetContainer(_, loop as Loop _, tupleDecs, _) = (* If we are inside a BeginLoop we only set the container on leaves that exit the loop. Loop entries will go back to the BeginLoop so we don't add SetContainer nodes. *) mkEnv(tupleDecs, loop) | simpPostSetContainer(container, Handle{exp, handler}, tupleDecs, filter) = mkEnv(tupleDecs, Handle{ exp = simpPostSetContainer(container, exp, [], filter), handler = simpPostSetContainer(container, handler, [], filter)}) | simpPostSetContainer(container, tupleGen, tupleDecs, filter) = mkEnv(tupleDecs, mkSetContainer(container, tupleGen, filter)) fun simplifier(c, numLocals) = let val localAddressAllocator = ref 0 val addrTab = Array.array(numLocals, NONE) fun lookupAddr (LoadLocal addr) = valOf(Array.sub(addrTab, addr)) | lookupAddr (env as LoadArgument _) = (EnvGenLoad env, EnvSpecNone) | lookupAddr (env as LoadRecursive) = (EnvGenLoad env, EnvSpecNone) | lookupAddr (LoadClosure _) = raise InternalError "top level reached in simplifier" and enterAddr (addr, tab) = Array.update (addrTab, addr, SOME tab) fun mkAddr () = ! localAddressAllocator before localAddressAllocator := ! localAddressAllocator + 1 val reprocess = ref false val code = simpSpecial(c, {lookupAddr = lookupAddr, enterAddr = enterAddr, nextAddress = mkAddr, reprocess = reprocess}) in (code, ! localAddressAllocator, !reprocess) end structure Sharing = struct type codetree = codetree and codeBinding = codeBinding and envSpecial = envSpecial end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CODETREE_STATIC_LINK_AND_CASES.sml000066400000000000000000002245701265146633400254450ustar00rootroot00000000000000(* Copyright (c) 2012-13, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CODETREE_STATIC_LINK_AND_CASES( structure BASECODETREE: BaseCodeTreeSig structure CODETREE_FUNCTIONS: CodetreeFunctionsSig structure GCODE : sig type backendIC type machineWord = Address.machineWord val gencode: backendIC * Universal.universal list * int -> (unit -> machineWord) * Universal.universal list structure Sharing: sig type backendIC = backendIC end end structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG structure BACKENDTREE: BackendIntermediateCodeSig sharing BASECODETREE.Sharing = CODETREE_FUNCTIONS.Sharing = GCODE.Sharing = PRETTY.Sharing = BACKENDTREE.Sharing ) : sig type codetree type machineWord = Address.machineWord val codeGenerate: codetree * int * Universal.universal list -> (unit -> machineWord) * Universal.universal list structure Sharing : sig type codetree = codetree end end = struct open BASECODETREE open Address datatype caseType = datatype BACKENDTREE.caseType exception InternalError = Misc.InternalError (* Internal version of code-tree used as the result of the earlier (closure/case) pass and the input to the later (variable lifetimes) pass. *) datatype p2Codetree = P2Newenv of p2CodeBinding list * p2Codetree (* Set of bindings with an expression. *) | P2Constnt of machineWord * Universal.universal list (* Load a constant *) | P2Extract of p2LoadForm (* Get a local variable, an argument or a closure value *) | P2Field of {base: p2Codetree, offset: int } (* Load a field from a tuple *) | P2Eval of (* Evaluate a function with an argument list. *) { function: p2Codetree, argList: (p2Codetree * argumentType) list, resultType: argumentType } | P2Lambda of p2LambdaForm (* Lambda expressions. *) | P2Cond of p2Codetree * p2Codetree * p2Codetree (* If-statement *) | P2Case of (* Case expressions *) { cases : (p2Codetree * word) list, test : p2Codetree, caseType: caseType, default : p2Codetree } | P2BeginLoop of (* Start of tail-recursive inline function. *) { loop: p2Codetree, arguments: (int * p2Codetree * argumentType) list } | P2Loop of (p2Codetree * argumentType) list (* Jump back to start of tail-recursive function. *) | P2Raise of p2Codetree (* Raise an exception *) | P2Ldexc (* Load the exception (used at the start of a handler) *) | P2Handle of (* Exception handler. *) { exp: p2Codetree, handler: p2Codetree } | P2Tuple of p2Codetree list (* Records (tuples) *) | P2Container of int (* Create a container for a tuple on the stack. *) | P2SetContainer of (* Copy a tuple to a container. *) { container: p2Codetree, tuple: p2Codetree, filter: BoolVector.vector } | P2TagTest of { test: p2Codetree, tag: word, maxTag: word } and p2CodeBinding = P2Declar of int * p2Codetree (* Make a local declaration or push an argument *) | P2RecDecs of (int * p2LambdaForm) list (* Set of mutually recursive declarations. *) | P2NullBinding of p2Codetree (* Just evaluate the expression and discard the result. *) and p2LoadForm = P2LoadLocal of int (* Local binding *) | P2LoadArgument of int (* Argument - 0 is first arg etc.*) | P2LoadClosure of int (* Closure - 0 is first closure item etc *) | P2LoadRecursive (* Recursive call *) withtype p2LambdaForm = { (* Lambda expressions. *) body : p2Codetree, name : string, closure : p2LoadForm list, argTypes : argumentType list, resultType : argumentType, localCount : int, heapClosure : bool } val ioOp : int -> machineWord = RunCall.run_call1 RuntimeCalls.POLY_SYS_io_operation local open BACKENDTREE fun mkDecRef(ct, i1, i2) = BICDeclar{value = ct, addr = i1, references = i2} fun sideEffectFree (P2Lambda _) = true | sideEffectFree (P2Constnt _) = true | sideEffectFree (P2Extract _) = true | sideEffectFree (P2Cond(i, t, e)) = sideEffectFree i andalso sideEffectFree t andalso sideEffectFree e | sideEffectFree (P2Newenv(decs, exp)) = List.all sideEffectBinding decs andalso sideEffectFree exp | sideEffectFree (P2Handle { exp, handler }) = sideEffectFree exp andalso sideEffectFree handler | sideEffectFree (P2Tuple recs) = testList recs | sideEffectFree (P2Field{base, ...}) = sideEffectFree base (* An RTS call, which may actually be code which is inlined by the code-generator, may be side-effect free. This can occur if we have, for example, "if exp1 orelse exp2" where exp2 can be reduced to "true", typically because it's inside an inline function and some of the arguments to the function are constants. This then gets converted to (exp1; true) and we can eliminate exp1 if it is simply a comparison. *) | sideEffectFree (P2Eval{function=P2Constnt(w, _), argList, ...}) = isIoAddress(toAddress w) andalso CODETREE_FUNCTIONS.sideEffectFreeRTSCall w andalso List.all (fn (c, _) => sideEffectFree c) argList | sideEffectFree(P2Container _) = true (* But since SetContainer has a side-effect we'll always create the container even if it isn't used. *) | sideEffectFree _ = false (* Rest are unsafe (or too rare to be worth checking) *) and testList t = List.all sideEffectFree t and sideEffectBinding(P2Declar(_, value)) = sideEffectFree value | sideEffectBinding(P2RecDecs _) = true (* These should all be lambdas *) | sideEffectBinding(P2NullBinding c) = sideEffectFree c in (* This function transforms the codetree to add "lifetime" information for bindings ("declarations"). The idea is to aid the code-generator by indicating when a binding is no longer required and also to distinguish short-lived bindings from longer-lived bindings when deciding on register allocation. It also causes unused bindings to be discarded if they are not used and have no side-effects. The previous passes may generate extra bindings and rely on this pass to remove them if they are not actually used. *) fun lifeTimes (pt: p2Codetree, localAddressCount): backendIC = let fun copyCode (pt: p2Codetree, argUses, localCount): backendIC = let (* Tables for local declarations. "localUses" is the last reference for the declaration. *) val localUses = Array.array(localCount, 0) (* Because we count instructions from the end smaller values mean further away and we want to count the smallest non-zero value. *) fun maxUse(m, 0) = m | maxUse(0, m) = m | maxUse(m, n) = Int.min(m, n) (* If we are inside a loop these entries indicate that the declaration was made outside so the entries must not be killed there. *) val outsideLoop = Array.array (localCount, false) (* This also applies to all the parameters of the function which could be passed in registers. *) val outsideLoopRef = ref false (* This counts the number of "instructions" from the end of the code (because we process it depth first) to give a measure of how long a declaration is in use. This is used to control register spilling in the code-generator. *) val instrCount = ref 1 abstype usageSet = UsageSet of {locals: int Vector.vector, args: int Vector.vector} with (* Used to give us a "kill set" for an expression. In the case of parallel flows of control (e.g. then- and else-parts of an if-then-else) we can explicitly kill variables if they appear in the kill set for one branch but not in another. e.g. in if x then y else z assuming that x, y, z are not used in subsequent expressions we can kill z in the then-branch and y in the else-branch. The advantage of this is that we don't need to save variables if they are never used. *) fun saveUsages() = UsageSet{locals=Array.vector localUses, args=Array.vector argUses} (* Restore the table to the saved values. *) fun setToSaved(UsageSet{locals, args}): unit = ( Array.copyVec{src=locals, dst=localUses, di=0}; Array.copyVec{src=args, dst=argUses, di=0} ) (* Similar to setToSaved except that it sets the current set to the union of the current set and the saved set. *) fun addFromSaved(UsageSet{locals=locals, args=args}): unit = ( Array.modifyi(fn(i, v) => maxUse(v, Vector.sub(args, i))) argUses; Array.modifyi(fn(i, v) => maxUse(v, Vector.sub(locals, i))) localUses ) (* Compute the differences between usage sets as kill entries. *) fun computeKillSetLists usages = let (* We want to find the cases where the value is zero in at least one branch and non-zero in at least one other branch. Sum the zeros. If the result is zero the variable is not referenced at all in the set and we can ignore it. Similarly if it is the length of the list then it is referenced in all the branches and again we can ignore it. *) fun getAllLocals i = List.foldl(fn(UsageSet{locals, ...}, l) => if Vector.sub(locals, i) = 0 then l+1 else l) 0 usages val sumLocalSet = Vector.tabulate(localCount, getAllLocals) val argCount = Array.length argUses fun getAllArgs i = List.foldl(fn(UsageSet{args, ...}, l) => if Vector.sub(args, i) = 0 then l+1 else l) 0 usages val sumArgSet = Vector.tabulate(argCount, getAllArgs) val fullSet = List.length usages fun computeKills(UsageSet{locals, args}) = let (* Create lists of Extract entries with lastRef true to indicate that the item is no longer required. *) val killArgs = Vector.foldli (fn (addr, n, l) => if n = 0 orelse n = fullSet orelse Vector.sub(args, addr) <> 0 orelse ! outsideLoopRef then l else if addr = 0 then BICExtract(BICLoadRecursive, true) :: l else BICExtract(BICLoadArgument(addr-1), true) :: l) [] sumArgSet in Vector.foldli (fn (addr, n, l) => if n = 0 orelse n = fullSet orelse Vector.sub(locals, addr) <> 0 orelse Array.sub(outsideLoop, addr) then l else BICExtract(BICLoadLocal addr, true) :: l) killArgs sumLocalSet end in List.map computeKills usages end end fun addKillSet(original, []): backendIC = original (* No change *) | addKillSet(BICNewenv(decs, exp), killSet) = BICNewenv(map BICNullBinding killSet @ decs, exp) | addKillSet(original, killSet) = BICNewenv(map BICNullBinding killSet, original) (* returns the translated node *) fun locaddr (P2LoadArgument argNo) = let (* parameters *) val () = instrCount := !instrCount+1; val lastReference = Array.sub(argUses, argNo+1 (* Zero is used for recursive *)) = 0 andalso not (!outsideLoopRef) in (* Mark the argument as used. *) Array.update (argUses, argNo+1, maxUse(! instrCount, Array.sub(argUses, argNo+1))); BICExtract(BICLoadArgument argNo, lastReference) end | locaddr (P2LoadLocal laddr) = let val () = instrCount := !instrCount+1; (* If this was outside a loop we can't mark this as the last reference because it needs to be retained for the next time round. *) val lastReference = Array.sub(localUses, laddr) = 0 andalso not (Array.sub(outsideLoop, laddr)) in Array.update (localUses, laddr, maxUse(! instrCount, Array.sub(localUses, laddr))); BICExtract(BICLoadLocal laddr, lastReference) end | locaddr P2LoadRecursive = let val () = instrCount := !instrCount+1; val lastReference = Array.sub(argUses, 0) = 0 andalso not (!outsideLoopRef) in (* Mark the closure as used. *) Array.update (argUses, 0, maxUse(! instrCount, Array.sub(argUses, 0))); BICExtract (BICLoadRecursive, lastReference) end | locaddr (P2LoadClosure laddr) = let val () = instrCount := !instrCount+1; val lastReference = Array.sub(argUses, 0) = 0 andalso not (!outsideLoopRef) in (* Mark the closure as used. *) Array.update (argUses, 0, maxUse(! instrCount, Array.sub(argUses, 0))); BICExtract (BICLoadClosure laddr, lastReference) end (* locaddr *) (* Map f onto a list tail first. N.B. It doesn't reverse the list. Generally used to map "insert" over a list where we need to ensure that last references to variables are detected correctly. *) fun mapright _ [] = [] | mapright f (a::b) = let val rest = mapright f b in f a :: rest end fun insert(P2Eval { function, argList, resultType, ...}) = let (* Process the arguments first. *) val newargs = mapright(fn (c, t) => (insert c, t)) argList (* Then the body. *) val func = insert function in BICEval {function = func, argList = newargs, resultType=resultType} end | insert(P2Extract ext) = locaddr ext | insert(P2Field {base, offset}) = BICField {base = insert base, offset = offset} | insert(P2Constnt cp) = BICConstnt cp (* Constants can be returned untouched. *) | insert(P2BeginLoop{loop=body, arguments=argList, ...}) = (* Start of tail-recursive inline function. *) let (* If we have declarations outside the loop that are last used inside it we must make sure they're not marked as last used within the loop. That would cause the register containing the value to become available for reuse which could mean that when we jumped back to the start of the loop it was no longer there. We lift all such last-uses out of the loop and add them after the loop. *) val () = instrCount := !instrCount+1 val loopEndPosition = !instrCount (* Save the usage state before we process the loop. Because we're processing the block tail first this indicates all the declarations that are in use AFTER the loop. *) val usagesAfterLoop = saveUsages() val oldLoopEntries = Array.vector outsideLoop (* Set every entry to the "outsideLoop" array to true. *) val () = Array.modify (fn _ => true) outsideLoop val wasInLoop = ! outsideLoopRef val () = outsideLoopRef := true; (* Make entries in the tables for the arguments. I'm not sure if this is essential. *) fun declareArg(caddr, _, _) = ( Array.update (localUses, caddr, 0); Array.update (outsideLoop, caddr, false) (* Must do this. *) ) val _ = List.app declareArg argList (* Process the body. *) val insBody = insert body (* We want to set the arguments to "unreferenced". These are effectively local to the loop so they can safely be killed inside it. However we want to record the final references so we can attach them to the declarations. *) local fun processDec(addr, _, _) = Array.sub(localUses, addr) before Array.update (localUses, addr, 0) in val loopArgUses = List.map processDec argList end val usagesBeforeLoop = saveUsages() (* Restore the state. *) val () = outsideLoopRef := wasInLoop val () = Array.copyVec{src=oldLoopEntries, dst=outsideLoop, di=0} val (killAfter, killBefore) = case computeKillSetLists [usagesAfterLoop, usagesBeforeLoop] of [thenKill, elseKill] => (thenKill, elseKill) | _ => raise InternalError "computeKillSets" val _ = null killBefore orelse raise InternalError "Not killBefore" (* Set the lifetime of everything in the killAfter set to be the end of the loop. Since their last references are inside the loop this means extending the lifetime until the end. *) local fun extendLife(BICExtract(BICLoadArgument addr, _)) = Array.update (argUses, addr+1, loopEndPosition) | extendLife(BICExtract(BICLoadLocal addr, _)) = Array.update (localUses, addr, loopEndPosition) | extendLife(BICExtract(BICLoadRecursive, _)) = Array.update (argUses, 0, loopEndPosition) | extendLife _ = raise InternalError "Not an Extract" in val () = List.app extendLife killAfter end (* Finally the initial argument values. *) local fun copyDec((addr, value, _), uses) = {addr=addr, value=insert value, references=uses} in val newargs = mapright copyDec (ListPair.zipEq(argList, loopArgUses)) end val loop = BICBeginLoop{loop=insBody, arguments=ListPair.zipEq(newargs, List.map #3 argList)} in (* Add the kill entries on after the loop. *) if null killAfter then loop else BICKillItems{expression=loop, killSet=killAfter, killBefore=false} end | insert(P2Loop argList) = (* Jump back to start of tail-recursive function. *) BICLoop(mapright(fn (c, t) => (insert c, t)) argList) | insert(P2Raise x) = BICRaise (insert x) (* See if we can use a case-instruction. Arguably this belongs in the optimiser but it is only really possible when we have removed redundant declarations. *) | insert(P2Cond(condTest, condThen, condElse)) = copyCond (condTest, condThen, condElse) | insert(P2Newenv(ptElistDecs, ptExp)) = let (* Process the body. Recurses down the list of declarations and expressions processing each, and then reconstructs the list on the way back. *) fun copyDeclarations ([]) = [] | copyDeclarations ((P2Declar(caddr, pt)) :: vs) = let (* Set the table entries. We don't reuse entries so this is just a check. *) val _ = Array.sub(localUses, caddr) <> 0 andalso raise InternalError "copyDeclarations: Already used" val () = Array.update (outsideLoop, caddr, false) (* It's local *) val rest = copyDeclarations vs val wasUsed = Array.sub(localUses, caddr) val () = instrCount := !instrCount+1 in (* It is never used and it has no side-effects so we can ignore it. *) if wasUsed = 0 andalso sideEffectFree pt then rest else let val dec = insert pt in (* Set the use count back to free otherwise this local declaration would become part of the kill set for the surrounding expression. *) Array.update (localUses, caddr, 0); mkDecRef(dec, caddr, wasUsed) :: rest end end (* copyDeclarations.isDeclar *) | copyDeclarations (P2RecDecs mutualDecs :: vs) = let (* Recursive declarations. *) (* Get the closure lists for all the declarations. We assume that any of these can call any of the others so we just accumulate them into a single list. *) local fun getClosure((_, {closure, ...}), fcClosures) = (closure @ fcClosures) val fcClosures = List.foldl getClosure [] mutualDecs in val fullClosureList = fcClosures end (* Make the declarations. *) local fun applyFn(caddr, _) = ( Array.sub(localUses, caddr) <> 0 andalso raise InternalError "applyFn: Already used"; Array.update (outsideLoop, caddr, false) (* It's local *) ) in val () = List.app applyFn mutualDecs end (* Process the rest of the block. Identifies all other references to these declarations. *) val restOfBlock = copyDeclarations vs val () = instrCount := !instrCount+1 (* Process the closure entries and extract the ones that are the last refs. *) val lastRefsForClosure = List.map BICNullBinding (List.filter (fn BICExtract(_, true) => true | _ => false) (map (insert o P2Extract) fullClosureList)) val copiedDecs = map (fn (addr, lambda) => {addr=addr, lambda=copyLambda lambda, references= 0}) mutualDecs (* Now we know all the references we can complete the declaration and put on the use-count. *) fun copyEntries [] = [] | copyEntries ({ addr, lambda, ...} ::ds) = let val wasUsed = Array.sub(localUses, addr) in if wasUsed = 0 (*andalso sideEffectFree value*) then copyEntries ds else ( (* Set the use count back to false otherwise this entry would become part of the kill set for the surrounding expression. *) Array.update(localUses, addr, 0); {lambda=lambda, addr=addr, references=wasUsed} :: copyEntries ds ) end val decs = copyEntries copiedDecs in (* Return the mutual declarations and the rest of the block. *) if null decs then lastRefsForClosure @ restOfBlock else BICRecDecs decs :: (lastRefsForClosure @ restOfBlock) end (* copyDeclarations.isMutualDecs *) | copyDeclarations (P2NullBinding v :: vs) = let (* Not a declaration - process this and the rest. *) (* Must process later expressions before earlier ones so that the last references to variables are found correctly. *) val copiedRest = copyDeclarations vs val copiedNode = insert v in (* Expand out blocks *) case copiedNode of BICNewenv(decs, exp) => decs @ (BICNullBinding exp :: copiedRest) | _ => BICNullBinding copiedNode :: copiedRest end (* copyDeclarations *) val insElist = copyDeclarations(ptElistDecs @ [P2NullBinding ptExp]) (* TODO: Tidy this up. *) fun splitLast _ [] = raise InternalError "decSequenceWithFinalExp: empty" | splitLast decs [BICNullBinding exp] = (List.rev decs, exp) | splitLast _ [_] = raise InternalError "decSequenceWithFinalExp: last is not a NullDec" | splitLast decs (hd::tl) = splitLast (hd:: decs) tl in case splitLast [] insElist of ([], exp) => exp | (decs, exp) => BICNewenv(decs, exp) end (* isNewEnv *) | insert(P2Tuple recs) = (* perhaps it's a constant now? *) BICTuple (mapright insert recs) | insert P2Ldexc = BICLdexc (* just a constant so return it *) | insert(P2Lambda lambda) = BICLambda(copyLambda lambda) | insert(P2Handle { exp, handler }) = let (* The order here is important. We want to make sure that the last reference to a variable really is the last. *) val hand = insert handler val exp = insert exp in BICHandle {exp = exp, handler = hand} end | insert(P2Container c) = BICContainer c | insert(P2SetContainer {container, tuple, filter}) = BICSetContainer{container = insert container, tuple = insert tuple, filter = filter} | insert(P2TagTest{test, tag, maxTag}) = BICTagTest{test=insert test, tag=tag, maxTag=maxTag} | insert(P2Case{cases, test, caseType, default}) = let (* We need to compute the usages for each of the branches: i.e. the default plus each of the cases. Because they are done in parallel any of the branches contains the last reference of a variable then we need to add kill entries to the other branches so that every branch contains either a "real" final usage or a kill entry. *) val usagesAfterCase = saveUsages() val insDefault = insert default val defaultUsage = saveUsages() val () = setToSaved usagesAfterCase fun processCase(c, tag) = let val () = setToSaved usagesAfterCase val insCase = insert c val caseUsage = saveUsages() in ((insCase, tag), caseUsage) end val (caseList, usageList) = ListPair.unzip (List.map processCase cases) val kills = computeKillSetLists(defaultUsage :: usageList) val casePlusKills = ListPair.mapEq(fn ((c, t), k) => (addKillSet(c, k), t)) (caseList, tl kills) (* Restore the overall usage by setting the reference to the union of all the branches. *) val () = List.app addFromSaved(defaultUsage :: usageList) in BICCase{cases=casePlusKills, test=insert test, caseType=caseType, default=addKillSet(insDefault, hd kills)} end and copyLambda({body=lambdaBody, argTypes, name=lambdaName, resultType, localCount, closure, heapClosure, ...}: p2LambdaForm) = let val numArgs = List.length argTypes (* The size is one more than the number of arguments because the first item is used to represent the closure. Argument n is represented by index n+1. This is a historical anomaly and ought to be fixed by using a separate ref for the closure. *) val argUses = Array.array(numArgs+1, 0) (* process the body *) val insertedCode: backendIC = copyCode (lambdaBody, argUses, localCount) (* All the closure entries ought to be loads but there used to be cases where functions were compiled late in the process and then appeared as constants in the closure. Include this check for the moment. *) val copiedClosure = map(fn BICExtract a => BICExtract a | _ => raise InternalError "map closure") (mapright (insert o P2Extract) closure) val argUseList = Array.foldr(op ::) [] argUses in { body = insertedCode, name = lambdaName, closure = copiedClosure, argTypes = argTypes, resultType = resultType, closureRefs = hd argUseList, localCount = localCount, heapClosure = heapClosure, argLifetimes = tl argUseList (* Exclusde the first item used for the closure itself. *) } end and copyCond (condTest, condThen, condElse) = let (* Process each of the arms, computing the kill sets for each arm. *) (* Save the current usage set. Because we process the codetree in reverse order to the control flow entries in here show the variables which are in use after the if-expression has completed. *) val usagesAfterIf = saveUsages(); (* Process the then-part. Save the usage set which corresponds to variables which are in use in the flow of control through the then-part and afterwards. *) val insThen = insert condThen; val thenUsage = saveUsages(); (* Reset the use-counts to the saved value. *) val () = setToSaved usagesAfterIf; (* Process the else-part. *) val insElse = insert condElse; val elseUsage = saveUsages(); (* Now compute the differences of the sets. The differences are returned as Extract codetree entries. *) val (killElseOnly, killThenOnly) = case computeKillSetLists [thenUsage, elseUsage] of [thenKill, elseKill] => (thenKill, elseKill) | _ => raise InternalError "computeKillSets" (* Now ensure that all the variables that were used in the then-part are marked as used. It may be that they have already been set if they also appeared in the else-part. This sets the usage sets to the union of the then-part, the else-part and code after the if-expression. *) val () = addFromSaved thenUsage (* Add kill entries to the other branch. We simply add Extract entries with lastRef=true before the appropriate branch. This does what we want since the code-generator does not generate any code for them but it might make the intermediate code easier to read if we used a different instruction. *) (* Process the condition AFTER the then- and else-parts. *) val insFirst = insert condTest in BICCond (insFirst, addKillSet(insThen, killElseOnly), addKillSet(insElse, killThenOnly)) end in insert pt end (* copyCode *) val insertedCode: backendIC = copyCode (pt, Array.array(0, 0), localAddressCount); in insertedCode end (* lifeTimes *) end (* local *) open BACKENDTREE.CodeTags (* Property tag to indicate which arguments to a function are functions that are only ever called. *) val closureFreeArgsTag: int list Universal.tag = Universal.tag() fun staticLinkAndCases (pt, localAddressCount) = let fun mkEval (ct, clist) = P2Eval { function = ct, argList = List.map(fn c => (c, GeneralType)) clist, resultType=GeneralType } fun copyCode (pt, nonLocals, recursive, localCount, localAddresses, argClosure) = let (* "closuresForLocals" is a flag indicating that if the declaration is a function a closure must be made for it. *) val closuresForLocals = Array.array(localCount, false) val newLocalAddresses = Array.array (localCount, 0) val argProperties = Array.array(localCount, []) (* Reference to local or non-local bindings. This sets the "closure" property on the binding depending on how the binding will be used. *) fun locaddr (LoadLocal addr, closure) = let val () = if closure then Array.update (closuresForLocals, addr, true) else () val newAddr = Array.sub(newLocalAddresses, addr) in P2LoadLocal newAddr end | locaddr(LoadArgument addr, closure) = ( argClosure(addr, closure); P2LoadArgument addr ) | locaddr(LoadRecursive, closure) = recursive closure | locaddr(LoadClosure addr, closure) = #1 (nonLocals (addr, closure)) (* Argument properties. This returns information of which arguments can have functions passed in without requiring a full heap closure. *) fun argumentProps(LoadLocal addr) = Array.sub(argProperties, addr) | argumentProps(LoadArgument _) = [] | argumentProps LoadRecursive = [] | argumentProps (LoadClosure addr) = #2 (nonLocals (addr, false)) fun makeDecl addr = let val newAddr = ! localAddresses before (localAddresses := !localAddresses+1) val () = Array.update (closuresForLocals, addr, false) val () = Array.update (newLocalAddresses, addr, newAddr) val () = Array.update (argProperties, addr, []) in newAddr end fun insert(Eval { function = Extract LoadRecursive, argList, resultType, ...}) = let (* Recursive. If we pass an argument in the same position we don't necessarily need a closure. It depends on what else happens to it. *) fun mapArgs(n, (Extract (ext as LoadArgument m), t) :: tail) = (P2Extract(locaddr(ext, n <> m)), t) :: mapArgs(n+1, tail) | mapArgs(n, (c, t) :: tail) = (insert c, t) :: mapArgs(n+1, tail) | mapArgs(_, []) = [] val newargs = mapArgs(0, argList) val func = locaddr(LoadRecursive, (* closure = *) false) in (* If we are calling a function which has been declared this does not require it to have a closure. Any other use of the function would. *) P2Eval {function = P2Extract func, argList = newargs, resultType=resultType} end | insert(Eval { function = Extract ext, argList, resultType, ...}) = let (* Non-recursive but a binding. *) val cfArgs = argumentProps ext fun isIn n = not(List.exists(fn m => m = n) cfArgs) fun mapArgs(n, (Extract ext, t) :: tail) = (P2Extract(locaddr(ext, isIn n)), t) :: mapArgs(n+1, tail) | mapArgs(n, (Lambda lam, t) :: tail) = (insertLambda(lam, isIn n), t) :: mapArgs(n+1, tail) | mapArgs(n, (c, t) :: tail) = (insert c, t) :: mapArgs(n+1, tail) | mapArgs(_, []) = [] val newargs = mapArgs(0, argList) val func = locaddr(ext, (* closure = *) false) in (* If we are calling a function which has been declared this does not require it to have a closure. Any other use of the function would. *) P2Eval {function = P2Extract func, argList = newargs, resultType=resultType} end | insert(Eval { function = Constnt(w, p), argList, resultType, ...}) = let (* Constant function. *) val cfArgs = case List.find (Universal.tagIs closureFreeArgsTag) p of NONE => [] | SOME u => Universal.tagProject closureFreeArgsTag u fun isIn n = not(List.exists(fn m => m = n) cfArgs) fun mapArgs(n, (Extract ext, t) :: tail) = (P2Extract(locaddr(ext, isIn n)), t) :: mapArgs(n+1, tail) | mapArgs(n, (Lambda lam, t) :: tail) = (insertLambda(lam, isIn n), t) :: mapArgs(n+1, tail) | mapArgs(n, (c, t) :: tail) = (insert c, t) :: mapArgs(n+1, tail) | mapArgs(_, []) = [] val newargs = mapArgs(0, argList) in P2Eval {function = P2Constnt (w, p), argList = newargs, resultType=resultType} end | insert(Eval { function = Lambda lam, argList, resultType, ...}) = let (* Call of a lambda. Typically this will be a recursive function that can't be inlined. *) val newargs = map(fn (c, t) => (insert c, t)) argList val (copiedLambda, newClosure, makeRecClosure, _) = copyLambda lam val func = copyProcClosure (copiedLambda, newClosure, makeRecClosure) in P2Eval {function = func, argList = newargs, resultType=resultType} end | insert(Eval { function, argList, resultType, ...}) = let (* Process the arguments first. *) val newargs = map(fn (c, t) => (insert c, t)) argList val func = insert function in P2Eval {function = func, argList = newargs, resultType=resultType} end | insert(Extract ext) = (* Load the value bound to an identifier. The closure flag is set to true since the only cases where a closure is not needed, eval and load-andStore, are handled separately. *) P2Extract(locaddr(ext, (* closure = *) true)) | insert(Indirect {base, offset, ...}) = P2Field {base = insert base, offset = offset} | insert(Constnt wp) = P2Constnt wp (* Constants can be returned untouched. *) | insert(BeginLoop{loop=body, arguments=argList, ...}) = (* Start of tail-recursive inline function. *) let (* Make entries in the tables for the arguments. *) val newAddrs = List.map (fn ({addr, ...}, _) => makeDecl addr) argList (* Process the body. *) val insBody = insert body (* Finally the initial argument values. *) local fun copyDec(({value, ...}, t), addr) = (addr, insert value, t) in val newargs = ListPair.map copyDec (argList, newAddrs) end in (* Add the kill entries on after the loop. *) P2BeginLoop{loop=insBody, arguments=newargs} end | insert(Loop argList) = (* Jump back to start of tail-recursive function. *) P2Loop(List.map(fn (c, t) => (insert c, t)) argList) | insert(Raise x) = P2Raise (insert x) (* See if we can use a case-instruction. Arguably this belongs in the optimiser but it is only really possible when we have removed redundant declarations. *) | insert(Cond(condTest, condThen, condElse)) = reconvertCase(copyCond (condTest, condThen, condElse)) | insert(Newenv(ptElist, ptExp)) = let (* Process the body. Recurses down the list of declarations and expressions processing each, and then reconstructs the list on the way back. *) fun copyDeclarations ([]) = [] | copyDeclarations (Declar({addr=caddr, value = Lambda lam, ...}) :: vs) = let (* Binding a Lambda - process the function first. *) val newAddr = makeDecl caddr val (copiedLambda, newClosure, makeRecClosure, cfArgs) = copyLambda lam val () = Array.update(argProperties, caddr, cfArgs) (* Process all the references to the function. *) val rest = copyDeclarations vs (* We now know if we need a heap closure. *) val dec = copyProcClosure(copiedLambda, newClosure, makeRecClosure orelse Array.sub(closuresForLocals, caddr)) in P2Declar(newAddr, dec) :: rest end | copyDeclarations (Declar({addr=caddr, value = pt, ...}) :: vs) = let (* Non-function binding. *) val newAddr = makeDecl caddr val rest = copyDeclarations vs in P2Declar(newAddr, insert pt) :: rest end | copyDeclarations (RecDecs mutualDecs :: vs) = let (* Mutually recursive declarations. Any of the declarations may refer to any of the others. This causes several problems in working out the use-counts and whether the functions (they should be functions) need closures. A function will need a closure if any reference would require one (i.e. does anything other than call it). The reference may be from one of the other mutually recursive declarations and may be because that function requires a full closure. This means that once we have dealt with any references in the rest of the containing block we have to repeatedly scan the list of declarations removing those which need closures until we are left with those that do not. The use-counts can only be obtained when all the non-local lists have been copied. *) (* First go down the list making a declaration for each entry. This makes sure there is a table entry for all the declarations. *) val _ = List.map (fn {addr, ...} => makeDecl addr) mutualDecs (* Process the rest of the block. Identifies all other references to these declarations. *) val restOfBlock = copyDeclarations vs (* We now want to find out which of the declarations require closures. First we copy all the declarations, except that we don't copy the non-local lists of functions. *) fun copyDec ({addr=caddr, lambda, ...}) = let val (dec, newClosure, makeRecClosure, cfArgs) = copyLambda lambda val () = if makeRecClosure then Array.update (closuresForLocals, caddr, true) else () val () = Array.update(argProperties, caddr, cfArgs) in (caddr, dec, newClosure) end val copiedDecs = map copyDec mutualDecs (* We now have identified all possible references to the functions apart from those of the closures themselves. Any of closures may refer to any other function so we must iterate until all the functions which need full closures have been processed. *) fun processClosures([], outlist, true) = (* Sweep completed. - Must repeat. *) processClosures(outlist, [], false) | processClosures([], outlist, false) = (* We have processed the whole of the list without finding anything which needs a closure. The remainder do not need full closures. *) let fun mkLightClosure ((addr, value, newClosure)) = let val clos = copyProcClosure(value, newClosure, false) val newAddr = Array.sub(newLocalAddresses, addr) in (newAddr, clos) end in map mkLightClosure outlist end | processClosures((h as (caddr, value, newClosure))::t, outlist, someFound) = if Array.sub(closuresForLocals, caddr) then let (* Must copy it. *) val clos = copyProcClosure(value, newClosure, true) val newAddr = Array.sub(newLocalAddresses, caddr) in (newAddr, clos) :: processClosures(t, outlist, true) end (* Leave it for the moment. *) else processClosures(t, h :: outlist, someFound) val decs = processClosures(copiedDecs, [], false) local fun isLambda(_, P2Lambda _) = true | isLambda _ = false in val (lambdas, nonLambdas) = List.partition isLambda decs end fun asMutual(addr, P2Lambda lambda) = (addr, lambda) | asMutual _ = raise InternalError "asMutual" in (* Return the mutual declarations and the rest of the block. *) if null lambdas then map P2Declar nonLambdas @ restOfBlock (* None left *) else P2RecDecs (map asMutual lambdas) :: (map P2Declar nonLambdas @ restOfBlock) end (* copyDeclarations.isMutualDecs *) | copyDeclarations (NullBinding v :: vs) = let (* Not a declaration - process this and the rest. *) (* Must process later expressions before earlier ones so that the last references to variables are found correctly. DCJM 30/11/99. *) val copiedRest = copyDeclarations vs; val copiedNode = insert v in (* Expand out blocks *) case copiedNode of P2Newenv(decs, exp) => decs @ (P2NullBinding exp :: copiedRest) | _ => P2NullBinding copiedNode :: copiedRest end | copyDeclarations (Container{addr, size, setter, ...} :: vs) = let val newAddr = makeDecl addr val rest = copyDeclarations vs val setCode = insert setter in P2Declar(newAddr, P2Container size) :: P2NullBinding setCode :: rest end val insElist = copyDeclarations(ptElist @ [NullBinding ptExp]) fun mkEnv([], exp) = exp | mkEnv(decs, exp) = P2Newenv(decs, exp) fun decSequenceWithFinalExp decs = let fun splitLast _ [] = raise InternalError "decSequenceWithFinalExp: empty" | splitLast decs [P2NullBinding exp] = (List.rev decs, exp) | splitLast _ [_] = raise InternalError "decSequenceWithFinalExp: last is not a NullDec" | splitLast decs (hd::tl) = splitLast (hd:: decs) tl in mkEnv(splitLast [] decs) end in (* TODO: Tidy this up. *) decSequenceWithFinalExp insElist end (* isNewEnv *) | insert(Tuple { fields, ...}) = P2Tuple (map insert fields) | insert Ldexc = P2Ldexc (* just a constant so return it *) | insert(Lambda lam) = (* Using a lambda in a context other than a call or being passed to a function that is known only to call the function. It requires a heap closure. *) insertLambda(lam, true) | insert(Handle { exp, handler }) = let (* The order here is important. We want to make sure that the last reference to a variable really is the last. *) val hand = insert handler val exp = insert exp in P2Handle {exp = exp, handler = hand} end | insert(SetContainer {container, tuple, filter}) = P2SetContainer{container = insert container, tuple = insert tuple, filter = filter} | insert(TagTest{test, tag, maxTag}) = P2TagTest{test=insert test, tag=tag, maxTag=maxTag} and insertLambda (lam, needsClosure) = let val (copiedLambda, newClosure, _, _) = copyLambda lam in copyProcClosure (copiedLambda, newClosure, needsClosure) end and copyCond (condTest, condThen, condElse) = let (* Process the then-part. *) val insThen = insert condThen (* Process the else-part. If it's a conditional process it here. *) val insElse = case condElse of Cond(i, t, e) => copyCond(i, t, e) | _ => insert condElse (* Process the condition after the then- and else-parts. *) val insFirst = insert condTest type caseVal = { tag: word, test: codetree, caseType: caseType } option; (* True if both instructions are loads or indirections with the same effect. More complicated cases could be considered but function calls must always be treated as different. Note: the reason we consider Indirect entries here as well as Extract is because we (used to) defer Indirect entries. *) datatype similarity = Different | Similar of p2LoadForm fun similar (P2Extract a, P2Extract b) = if a = b then Similar a else Different | similar (P2Field{offset=aOff, base=aBase}, P2Field{offset=bOff, base=bBase}) = if aOff <> bOff then Different else similar (aBase, bBase) | similar _ = Different; (* If we have a call to the int equality operation *) (* then we may be able to use a case statement. *) fun findCase (P2Eval{ function=P2Constnt(cv, _), argList, ... }) = let val isArbitrary = wordEq (cv, ioOp RuntimeCalls.POLY_SYS_equala) val isWord = wordEq (cv, ioOp RuntimeCalls.POLY_SYS_word_eq) in if isArbitrary orelse isWord then (* Should be just two arguments. *) case argList of [(P2Constnt(c1, _), _), (arg2, _)] => if isShort c1 then SOME{tag=toShort c1, test=arg2, caseType = if isArbitrary then CaseInt else CaseWord} else NONE (* Not a short constant. *) | [(arg1, _), (P2Constnt(c2, _), _)] => if isShort c2 then SOME{tag=toShort c2, test=arg1, caseType = if isArbitrary then CaseInt else CaseWord} else NONE (* Not a short constant. *) | _ => NONE (* Wrong number of arguments - should raise exception? *) else NONE (* Function is not a comparison. *) end | findCase(P2TagTest { test, tag, maxTag }) = SOME { tag=tag, test=test, caseType=CaseTag maxTag } | findCase _ = NONE val testCase = findCase insFirst in case testCase of NONE => (* Can't use a case *) P2Cond (insFirst, insThen, reconvertCase insElse) | SOME { tag=caseTags, test=caseTest, caseType=caseCaseTest } => (* Can use a case. Can we combine two cases? If we have an expression like "if x = a then .. else if x = b then ..." we can combine them into a single "case". *) case insElse of P2Case { cases=nextCases, test=nextTest, default=nextDefault, caseType=nextCaseType } => ( case (similar(nextTest, caseTest), caseCaseTest = nextCaseType) of (* Note - it is legal (though completely redundant) for the same case to appear more than once in the list. This is not checked for at this stage. *) (Similar _, true) => P2Case { cases = (insThen, caseTags) :: map (fn (c, l) => (c, l)) nextCases, test = nextTest, default = nextDefault, caseType = caseCaseTest } | _ => (* Two case expressions but they test different variables. We can't combine them. *) P2Case { cases = [(insThen, caseTags)], test = caseTest, default = reconvertCase insElse, caseType=caseCaseTest } ) | _ => (* insElse is not a case *) P2Case { cases = [(insThen, caseTags)], test = caseTest, default = insElse, caseType=caseCaseTest } end (* Check something that's been created as a Case and see whether it is sparse. If it is turn it back into a sequence of conditionals. This was previously done at the bottom level and the choice of when to use an indexed case was made by the architecture-specific code-generator. That's probably unnecessary and complicates the code-generator. *) and reconvertCase(P2Case{cases, test, default, caseType}) = let (* Count the number of cases and compute the maximum and minimum. *) (* If we are testing on integers we could have negative values here. Because we're using "word" here any negative values are treated as large positive values and so we won't use a "case". If this is a case on constructor tags we know the range. There will always be a "default" which may be anywhere in the range but if we construct a jump table that covers all the values we don't need the range checks. *) val useIndexedCase = case caseType of CaseTag _ => (* Exhaustive *) List.length cases > 4 | _ => let val (_, aLabel) = hd cases fun foldCases((_, w), (min, max)) = (Word.min(w, min), Word.max(w, max)) val (min, max) = List.foldl foldCases (aLabel, aLabel) cases val numberOfCases = List.length cases in numberOfCases > 7 andalso numberOfCases >= (Word.toInt max - Word.toInt min) div 3 end in if useIndexedCase then P2Case{cases=cases, test=test, default=default, caseType=caseType} else let fun reconvert [] = default | reconvert ((c, t) :: rest) = let val test = case caseType of CaseInt => mkEval(P2Constnt(ioOp RuntimeCalls.POLY_SYS_equala, []), [test, P2Constnt(toMachineWord t, [])]) | CaseWord => mkEval(P2Constnt(ioOp RuntimeCalls.POLY_SYS_word_eq, []), [test, P2Constnt(toMachineWord t, [])]) | CaseTag maxTag => P2TagTest { test=test, tag=t, maxTag=maxTag } in P2Cond(test, c, reconvert rest) end in reconvert cases end end | reconvertCase t = t (* Just a simple conditional. *) (* If "makeClosure" is true the function will need a full closure. It may need a full closure even if makeClosure is false if it involves a recursive reference which will need a closure. *) and copyLambda ({body=lambdaBody, argTypes, name=lambdaName, resultType, localCount, closure=lambdaClosure, ...}: lambdaForm) = let val newGrefs: loadForm list ref = ref [] (* non-local references *) val newNorefs = ref 0 (* number of non-local refs *) val makeClosureForRecursion = ref false (* A new table for the new function. *) fun prev (closureAddr, closure) = let val loadEntry = List.nth(lambdaClosure, closureAddr) (* Returns the closure address of the non-local *) fun makeClosureEntry([], _) = (* not found - construct new entry *) let val () = newGrefs := loadEntry :: !newGrefs; val newAddr = !newNorefs + 1; in newNorefs := newAddr; (* increment count *) newAddr-1 end | makeClosureEntry(oldEntry :: t, newAddr) = if oldEntry = loadEntry then newAddr-1 else makeClosureEntry(t, newAddr - 1) (* Set the closure flag if necessary and get the argument props. At this point we discard the "Load" entry returned by nonLocals and "recursive". The closure will be processed later. *) val argProps = case loadEntry of LoadLocal addr => let val () = if closure then Array.update (closuresForLocals, addr, true) else () in Array.sub(argProperties, addr) end | LoadArgument addr => (argClosure(addr, closure); []) | LoadRecursive => (recursive closure; []) | LoadClosure entry => #2 (nonLocals (entry, closure)) in (* Just return the closure entry. *) (P2LoadClosure(makeClosureEntry (!newGrefs, !newNorefs)), argProps) end fun recCall closure = (* Reference to the closure itself. *) ( if closure then makeClosureForRecursion := true else (); P2LoadRecursive ) local datatype tri = TriUnref | TriCall | TriClosure val argClosureArray = Array.array(List.length argTypes, TriUnref) in fun argClosure(n, t) = Array.update(argClosureArray, n, (* If this is true it requires a closure. If it is false it requires a closure if any other reference does. *) if t orelse Array.sub(argClosureArray, n) = TriClosure then TriClosure else TriCall) fun closureFreeArgs() = Array.foldri(fn (n, TriCall, l) => n :: l | (_, _, l) => l) [] argClosureArray end (* process the body *) val newLocalAddresses = ref 0 val (insertedCode, _) = copyCode (lambdaBody, prev, recCall, localCount, newLocalAddresses, argClosure) val globalRefs = !newGrefs val cfArgs = closureFreeArgs() in (P2Lambda { body = insertedCode, name = lambdaName, closure = [], argTypes = map #1 argTypes, resultType = resultType, localCount = ! newLocalAddresses, heapClosure = false }, globalRefs, ! makeClosureForRecursion, cfArgs) end (* copyLambda *) (* Copy the closure of a function which has previously been processed by copyLambda. *) and copyProcClosure (P2Lambda{ body, name, argTypes, resultType, localCount, ...}, newClosure, heapClosure) = let (* process the non-locals in this function *) (* If a heap closure is needed then any functions referred to from the closure also need heap closures.*) fun makeLoads ext = locaddr(ext, heapClosure) val copyRefs = rev (map makeLoads newClosure) in P2Lambda { body = body, name = name, closure = copyRefs, argTypes = argTypes, resultType = resultType, localCount = localCount, heapClosure = heapClosure orelse null copyRefs (* False if closure is empty *) } end | copyProcClosure(pt, _, _) = pt (* may now be a constant *) (* end copyProcClosure *) in case pt of Lambda lam => let val (copiedLambda, newClosure, _, cfArgs) = copyLambda lam val code = copyProcClosure (copiedLambda, newClosure, true) val props = if null cfArgs then [] else [Universal.tagInject closureFreeArgsTag cfArgs] in (code, props) end | c as Newenv(_, exp) => let val code = insert c fun getProps(Extract(LoadLocal addr)) = let val cfArgs = Array.sub(argProperties, addr) in if null cfArgs then [] else [Universal.tagInject closureFreeArgsTag cfArgs] end | getProps(Tuple { fields, ...}) = let val fieldProps = map getProps fields in if List.all null fieldProps then [] else [Universal.tagInject CodeTags.tupleTag fieldProps] end | getProps _ = [] val props = getProps exp in (code, props) end | c as Constnt(_, p) => (insert c, p) | pt => (insert pt, []) end (* copyCode *) val outputAddresses = ref 0 fun topLevel _ = raise InternalError "outer level reached in copyCode" val (insertedCode, argProperties) = copyCode (pt, topLevel, topLevel, localAddressCount, outputAddresses, fn _ => ()) in (insertedCode, !outputAddresses, argProperties) end (* staticLinkAndCases *) fun codeGenerate(code, localCount, debugSwitches) = let val (code, localCount, argProperties) = staticLinkAndCases(code, localCount) val backendCode = lifeTimes(code, localCount) val () = if DEBUG.getParameter DEBUG.codetreeAfterOptTag debugSwitches then PRETTY.getCompilerOutput debugSwitches (BACKENDTREE.pretty backendCode) else (); val (code, props) = GCODE.gencode(backendCode, debugSwitches, localCount) in (code, argProperties @ props) end structure Sharing = struct type codetree = codetree end end; polyml-5.6/mlsource/MLCompiler/CodeTree/CodetreeFunctionsSig.sml000066400000000000000000000047701265146633400250530ustar00rootroot00000000000000(* Copyright (c) 2012,13 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CodetreeFunctionsSig = sig type codetree and codeBinding and loadForm and envSpecial type machineWord = Address.machineWord val mkLoadLocal: int -> codetree and mkLoadArgument: int -> codetree and mkLoadClosure: int -> codetree val mkEnv: codeBinding list * codetree -> codetree and mkInd: int * codetree -> codetree and mkVarField: int * codetree -> codetree and mkTuple: codetree list -> codetree and mkDatatype: codetree list -> codetree val CodeFalse: codetree and CodeTrue: codetree and CodeZero: codetree val mkSetContainer: codetree * codetree * BoolVector.vector -> codetree val mkTupleFromContainer: int * int -> codetree val decSequenceWithFinalExp: codeBinding list -> codetree val sideEffectFree: codetree -> bool and reorderable: codetree -> bool and sideEffectFreeRTSCall: machineWord -> bool val makeConstVal: codetree -> codetree val evalue: codetree -> machineWord option val findEntryInBlock: codetree * int * bool -> codetree val earlyRtsCall: machineWord -> bool val partitionMutableBindings: codeBinding -> codeBinding list type createClosure val makeClosure: unit -> createClosure and addToClosure: createClosure -> loadForm -> loadForm and extractClosure: createClosure -> loadForm list val findInline: Universal.universal list -> envSpecial val setInline: envSpecial -> Universal.universal list -> Universal.universal list structure Sharing: sig type codetree = codetree and codeBinding = codeBinding and loadForm = loadForm and createClosure = createClosure and envSpecial = envSpecial end end; polyml-5.6/mlsource/MLCompiler/CodeTree/GCode.i386.ML000066400000000000000000000014771265146633400221540ustar00rootroot00000000000000(* Copyright (c) 2013 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure GCode = X86Code; polyml-5.6/mlsource/MLCompiler/CodeTree/GCode.interpreted.ML000066400000000000000000000015001265146633400237730ustar00rootroot00000000000000(* Copyright (c) 2013 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure GCode = ByteCode; polyml-5.6/mlsource/MLCompiler/CodeTree/GCode.x86_64.ML000066400000000000000000000014771265146633400224210ustar00rootroot00000000000000(* Copyright (c) 2013 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure GCode = X86Code; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/000077500000000000000000000000001265146633400214205ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CODECONSSIG.sml000066400000000000000000000225311265146633400237000ustar00rootroot00000000000000(* Copyright (c) David C.J. Matthews 2009, 2012 Derived from original code: Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CODECONSSIG = sig type machineWord = Address.machineWord type short = Address.short type address = Address.address type code eqtype reg (* Machine registers *) datatype argType = ArgGeneral | ArgFP val sameCode: code * code -> bool val regNone: reg option val regClosure: reg val regStackPtr: reg (* For vector indexing we provide a numbering for the registers. *) val regs: int val regN: int -> reg val nReg: reg -> int val regRepr: reg -> string val argRegs: argType list -> reg option list val resultReg: argType -> reg structure RegSet: sig eqtype regSet val singleton: reg -> regSet val allRegisters: regSet (* All registers: data, address, floating pt. *) val generalRegisters: regSet (* Registers checked by the GC. *) val floatingPtRegisters: regSet val noRegisters: regSet val isAllRegs: regSet->bool val regSetUnion: regSet * regSet -> regSet val regSetIntersect: regSet * regSet -> regSet val listToSet: reg list -> regSet val setToList: regSet -> reg list val regSetMinus: regSet * regSet -> regSet val inSet: reg * regSet -> bool val cardinality: regSet -> int val regSetRepr: regSet -> string val oneOf: regSet -> reg end val getRegisterSet: Word.word -> RegSet.regSet type addrs val addrZero: addrs (* Operations. *) type 'a instrs val instrVeclen: 'a instrs val instrVecflags: 'a instrs val instrGetFirstLong: 'a instrs val instrStringLength: 'a instrs val instrAddA: 'a instrs and instrSubA: 'a instrs and instrMulA: 'a instrs and instrAddW: 'a instrs and instrSubW: 'a instrs and instrMulW: 'a instrs and instrDivW: 'a instrs and instrModW: 'a instrs and instrOrW: 'a instrs and instrAndW: 'a instrs and instrXorW: 'a instrs and instrLoad: 'a instrs and instrLoadB: 'a instrs and instrUpshiftW: 'a instrs (* logical shift left *) and instrDownshiftW: 'a instrs (* logical shift right *) and instrDownshiftArithW: 'a instrs (* arithmetic shift right *) and instrSetStringLength: 'a instrs and instrThreadSelf: 'a instrs and instrAtomicIncr: 'a instrs and instrAtomicDecr: 'a instrs and instrStoreW: 'a instrs and instrStoreB: 'a instrs and instrLockSeg: 'a instrs and instrAddFP: 'a instrs and instrSubFP: 'a instrs and instrMulFP: 'a instrs and instrDivFP: 'a instrs and instrAbsFP: 'a instrs and instrNegFP: 'a instrs and instrIntToRealFP: 'a instrs and instrRealToIntFP: 'a instrs and instrSqrtFP: 'a instrs and instrSinFP: 'a instrs and instrCosFP: 'a instrs and instrAtanFP: 'a instrs and instrExpFP: 'a instrs and instrLnFP: 'a instrs and instrAllocStore: 'a instrs and instrMoveBytes: 'a instrs and instrMoveWords: 'a instrs (* Check whether an operation is implemented and, if appropriate, remove constant values into the instruction part. *) type negotiation val checkAndReduce: 'a instrs * 'a list * ('a -> machineWord option) -> (negotiation * 'a list) option val isPushI: machineWord -> bool type 'a tests val testNeqW: 'a tests val testEqW: 'a tests val testGeqW: 'a tests val testGtW: 'a tests val testLeqW: 'a tests val testLtW: 'a tests val testNeqA: 'a tests val testEqA: 'a tests val testGeqA: 'a tests val testGtA: 'a tests val testLeqA: 'a tests val testLtA: 'a tests val Short: 'a tests val Long: 'a tests val testNeqFP: 'a tests val testEqFP: 'a tests val testGeqFP: 'a tests val testGtFP: 'a tests val testLeqFP: 'a tests val testLtFP: 'a tests val byteVecEq: 'a tests and byteVecNe: 'a tests type forwardLabel and backwardLabel (* Compare and branch for fixed and arbitrary precision. *) type negotiateTests val checkAndReduceBranches: 'a tests * 'a list * ('a -> machineWord option) -> (negotiateTests * 'a list) option datatype callKinds = Recursive | ConstantClosure of machineWord | ConstantCode of machineWord | CodeFun of code | FullCall val procName: code -> string (* Name of the procedure. *) type operation type operations = operation list val moveRegisterToRegister: reg(*source*) * reg(*dest*) -> operations and moveMemoryToRegister: reg (*base*) * int (*offset*) * reg (*dest*) -> operations and moveConstantToRegister: machineWord * reg -> operations and moveCodeRefToRegister: code * reg -> operations (* The address of another function *) and moveStackAddress: int * reg -> operations (* Offset within the stack. *) val pushRegisterToStack: reg -> operations and pushConstantToStack: machineWord -> operations and pushMemoryToStack: reg * int -> operations val storeRegisterToStack: reg * int -> operations and storeConstantToStack: machineWord * int -> operations val allocStore: { size: int, flags: Word8.word, output: reg } -> operations val allocationComplete: operations val callFunction: callKinds -> operations val jumpToFunction: callKinds -> operations val returnFromFunction: int -> operations val raiseException: operations val uncondBranch: unit -> operations * forwardLabel val resetStack: int -> operations val backJumpLabel: unit -> operations * backwardLabel val jumpBack: backwardLabel -> operations val interruptCheck: operations val forwardJumpLabel: forwardLabel -> operations val loadHandlerAddress: { handlerLab: addrs ref, output: reg } -> operations val startHandler: { handlerLab: addrs ref } -> operations val indexedCase: { testReg: reg, workReg: reg, minCase: word, maxCase: word, isArbitrary: bool, isExhaustive: bool } -> operations * forwardLabel list * forwardLabel val activeRegister: reg -> operations val freeRegister: reg -> operations val pushToReserveSpace: operations val loadCurrentHandler: reg -> operations val storeToHandler: reg -> operations val pushCurrentHandler: operations val printOperation: operation * (string -> unit) -> unit datatype regHint = UseReg of RegSet.regSet | NoHint | NoResult (* These are almost the same as source values except that a value may be in more than one register. *) datatype actionSource = ActLiteralSource of machineWord | ActInRegisterSet of { modifiable: RegSet.regSet, readable: RegSet.regSet} | ActBaseOffset of reg * int | ActCodeRefSource of code (* The address of another function *) | ActStackAddress of int (* Offset within the stack. *) datatype argAction = ActionDone of (* The output register if any and the final operation. *) { outReg: reg option, operation: operations } | ActionLockRegister of (* Lock the register of an argument. *) { argNo: int, reg: reg, willOverwrite: bool, next: nextAction } | ActionLoadArg of (* Load an argument into a register. *) { argNo: int, regSet: RegSet.regSet, willOverwrite: bool, next: nextAction } | ActionGetWorkReg of (* Get a work/result register. *) { regSet: RegSet.regSet, setReg: reg -> nextAction } withtype nextAction = actionSource list -> argAction (* Negotiate arguments *) val negotiateArguments: negotiation * regHint -> nextAction val negotiateTestArguments: negotiateTests -> nextAction * forwardLabel val codeCreate: bool * string * machineWord * Universal.universal list -> code (* makes the initial segment. *) (* Code generate operations and construct the final code. *) val copyCode: code * operations * int * RegSet.regSet * bool -> address val codeAddress: code -> address option val addCompletionHook: code * (code * machineWord -> unit) -> unit structure Sharing: sig type code = code and 'a instrs = 'a instrs and negotiation = negotiation and negotiateTests = negotiateTests and reg = reg and 'a tests = 'a tests and addrs = addrs and operation = operation and regHint = regHint and argAction = argAction and regSet = RegSet.regSet and backwardLabel = backwardLabel and forwardLabel = forwardLabel end end; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CODEGEN_TABLE.ML000066400000000000000000004550641265146633400236430ustar00rootroot00000000000000(* Copyright David C. J. Matthews 1991, 2000-2001, 2009-10, 2012-13, 2015 Derived from code Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Pseudo-stack Operations for Code Generator. Author: Dave Matthews, Edinburgh University / Prolingua Ltd. Copyright D.C.J. Matthews 1991 *) (* This part of the code-generator deals with the pseudo-stack and the translation of addresses into stack offsets. *) (* TODO: Many of the functions involve complete scans of the pseudo-stack. This leads to quadratic increase in compile-time with large numbers of bindings. Hotspots are marked in the code. *) functor CODEGEN_TABLE ( structure CODECONS : CODECONSSIG structure DEBUG: DEBUGSIG structure PRETTY: PRETTYSIG structure MISC : sig exception InternalError of string; val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list end sharing PRETTY.Sharing = CODECONS.Sharing ) : CODEGEN_TABLESIG = struct open CODECONS; open DEBUG; open MISC; open Address; structure StretchArray = StretchArray open RegSet fun forLoop f i n = if i > n then () else (f i; forLoop f (i + 1) n); type stackIndex = int val first: stackIndex = 0 val noIndex: stackIndex = ~1 (* An invalid index. *) datatype stackUnion = Register of reg * int (* In a register. The int is the stack offset if the value was originally a container. *) | Literal of machineWord (* A constant (was "int") *) | CodeRef of code (* Forward reference to code *) | Direct of {base: reg, offset: int} (* Register/Offset *) | StackW of int (* On the real stack. *) (* Container entries are a group of items on the stack. They are used for tuples and also for function closures. A function closure can contain the addresses of other function closures so these must be retained until the last references to the closure that references them. *) | Container of { items: stackIndex list, dependencies: stackIndex list} datatype stackEntry = NoStackEntry | StackEntry of { ent: stackUnion, cache: regSet, uses: int, destStack: int option, (* destStack is used to indicate where on the stack this entry must be placed if it has to be spilled. A value of NONE means that we don't care. The reason for having this is to ensure that if we split a flow of control (e.g. the then- and else-parts of an "if") with a value in a register and have to spill the register in one branch then we spill it to the same location on the other branch. This ensures that when we merge the flows of control we don't have to mess around with the stack. *) lifeTime: int (* lifeTime is a measure of how long the item will live. Because these values are derived from a depth first scan in preCode lower values mean longer life except that zero means temporary. The lifeTime is used to decide which items to spill from registers if we need to. *) } fun forIndDownTo(i, finishInd, perform: stackIndex->unit) = if i >= finishInd then (perform i; forIndDownTo (i - 1, finishInd, perform)) else () fun revfoldIndDownTo(f, x, i, finishInd) = if i >= finishInd then revfoldIndDownTo(f, f i x, i - 1, finishInd) else x (* The set of available registers. A register is free if its use-count is zero. A register has a reference for each occurence in an entry on the pseudo-stack or cache field (even if the use-count of the stack entry is zero). *) (* Added modification set to indicate if a register has been changed. We assume that if a register is allocated it has been modified. DCJM 26/11/00. *) type rset = {vec: int array, modSet: regSet ref, freeRegs: regSet ref}; val vecSize = regs; (* Returns the first free register. *) (* This is a major hotspot in the compiler. *) fun getAcceptableRegister ({vec, modSet, freeRegs}:rset, acceptable: regSet) = let val available = regSetIntersect(!freeRegs, acceptable) in if available = noRegisters then NONE else (* Mark the register as in use. *) let val r = oneOf available val i = nReg r in Array.update (vec, i, 1); (* Set the register use-count to 1 *) modSet := regSetUnion(singleton r, ! modSet); (* Mark as used *) freeRegs := regSetMinus(!freeRegs, singleton r); SOME r end end (* Print the allocated registers. *) fun printRegs printStream ({vec, ...}) = let fun printReg i = let val useCount = Array.sub (vec, i) in if useCount > 0 then ( printStream " "; printStream (regRepr (regN i)); printStream "="; printStream(Int.toString useCount) ) else () end (* printReg *); in forLoop printReg 0 (vecSize - 1) end fun free ({freeRegs, vec, ...}) reg = let val r = nReg reg val useCount = Array.sub (vec, r) in if useCount = 0 then raise InternalError ("free: register already free:" ^ regRepr(regN r)) else ( Array.update (vec, r, useCount - 1); if useCount = 1 then ( freeRegs := regSetUnion(!freeRegs, singleton reg); freeRegister reg ) else [] ) end fun freeSet(regs, regSet) = List.foldl (fn (r, l) => free regs r @ l) [] (setToList regSet) (* Increment use count. *) fun incr ({freeRegs, vec, ...}) reg = let val r = nReg reg val useCount = Array.sub (vec, r) in Array.update (vec, r, useCount + 1); if useCount = 0 then ( freeRegs := regSetMinus(!freeRegs, singleton reg); activeRegister reg ) else [] end fun lastRegRef({vec, ...}, reg) = Array.sub (vec, nReg reg) = 1 fun rsetMake () : rset = {vec = Array.array (vecSize, 0), modSet = ref noRegisters, freeRegs = ref allRegisters} (* This table maps declaration numbers for a particular function into pseudo-stack offsets. The pseudo-stack simulates the real stack and gives the real locations of objects which may be in store, on the real stack or in registers. It maintains use-counts for values and allows the stack to be contracted and registers to be re-used when they are no longer required. *) datatype ttab = Ttab of { regset: rset, pstack: stackEntry StretchArray.stretchArray, (* Pseudo-stack *) pstackptr: stackIndex ref, realstackptr: int ref, (* The number of items on the real stack. *) maxstack: int ref, (* The maximum number of items on the real stack. *) exited: bool ref, branched: bool ref, marker: stackIndex ref, markReal: int ref, lowestDirect: stackIndex ref, pstackTrace: bool, printStream: string->unit } fun ttabCreate(localCount, debugSwitches) = let val printStream = PRETTY.getSimplePrinter debugSwitches in Ttab { regset = rsetMake(), pstack = StretchArray.stretchArray ((* Hint *)localCount, NoStackEntry), pstackptr = ref first, realstackptr = ref 0, maxstack = ref 1, exited = ref false, branched = ref false, marker = ref first, markReal = ref 0, lowestDirect = ref first, pstackTrace = DEBUG.getParameter DEBUG.pstackTraceTag debugSwitches, printStream = printStream } end fun pstackEntry (Ttab{pstack, ...}, locn) = StretchArray.sub(pstack, locn) and setPstackEntry(Ttab{pstack, ...}, locn, entry) = StretchArray.update(pstack, locn, entry) (* Returns the entry after removing the option type. *) fun pstackRealEntry (ttab, locn) = case pstackEntry(ttab, locn) of StackEntry record => record | NoStackEntry => raise InternalError ("pstackRealEntry: not entry: " ^ Int.toString(locn)) fun printStackUnion printStream stackun = case stackun of Register(reg, _) => printStream(regRepr reg) | Literal w => if isShort w then printStream(Int.toString (Word.toIntX (toShort w))) else printStream "?" (* ??? *) | CodeRef si => ( printStream "("; printStream (procName si); printStream ")" ) | Direct {base, offset} => ( printStream(regRepr base); printStream "@("; printStream(Int.toString offset); printStream ")" ) | StackW i => ( printStream "base@("; printStream(Int.toString i); printStream ")" ) | Container{items, ...} => ( printStream "["; List.app (fn i => (printStream(Int.toString(i)); printStream " ")) items; printStream "]" ) fun printEntry _ NoStackEntry _ = () | printEntry printStream (StackEntry {ent, uses, cache, destStack, lifeTime}) entry = ( printStream(Int.toString(entry)); printStream " "; printStream(Int.toString uses); printStream " "; printStackUnion printStream ent; if cache <> noRegisters then (printStream " in "; printStream(regSetRepr cache)) else (); if lifeTime = 0 then printStream " temp " else printStream(" life " ^ Int.toString lifeTime ^ " "); case destStack of NONE => () | SOME stack => (printStream " to base@("; printStream(Int.toString stack); printStream")"); printStream "\n" ) fun printStack (table as Ttab {printStream, realstackptr=ref realstackVal, pstackptr, marker, regset, ...}, why, recentInstrs) = ( printStream ("\n" ^ why ^"\n"); List.app(fn i => printOperation(i, printStream)) (List.rev recentInstrs); printStream "psp="; printStream(Int.toString(! pstackptr)); printStream " lim="; printStream(Int.toString(!marker)); printStream " rsp="; printStream (Int.toString realstackVal); printStream "\n"; printStream "regs="; printRegs printStream regset; printStream "\n"; let fun pEntry i = if i <= 0 then () else ( printEntry printStream (pstackEntry(table, i)) i; pEntry (i-1) ) in pEntry (! pstackptr) end; printStream "-\n" (* Extra line break between entries. *) ) (* Removes empty entries from the top of the stack. *) fun clearOff(table as Ttab{pstackptr, marker, ...}) = let val newIndex = ! pstackptr - 1 in if newIndex >= ! marker then case pstackEntry(table, newIndex) of NoStackEntry => ( pstackptr := newIndex; clearOff table ) | StackEntry _ => () else () end (* clearOff *) (* Reset the real stack pointer iff there are items that are no longer referenced. This has been added since much of the other code was written and that assumed that the stack wouldn't be popped so there are only a few places where this is safe to use. *) (* TODO: When there are a lot of bindings this becomes a major hotspot. *) fun removeOldItemsFromRealStack( table as Ttab{realstackptr as ref current, markReal=ref markReal, pstackptr=ref pstackptr, ...}) = let fun maxStack(i, n) = if i = pstackptr then n else case pstackEntry(table, i) of (* HOTSPOT - 510 *) StackEntry{ent=StackW addr, ...} => maxStack(i+1, Int.max(addr+1, n)) | StackEntry{ent=Register(_, addr), ...} => maxStack(i+1, Int.max(addr+1, n)) | _ => maxStack(i+1, n) val stackMax = maxStack(first, markReal) in if current > stackMax then (realstackptr := stackMax; resetStack (current-stackMax)) else [] end (* Removes an entry which is no longer required. If the entry is cached it may be retained unless it refers to the stack or another register when it MUST be removed. *) fun removeEntry (table as Ttab{regset, ...}, entry, keepIfCache): operation list = case pstackEntry(table, entry) of NoStackEntry => [] | StackEntry {ent = stacken, cache, lifeTime, ...} => (* If we are removing an entry from the real stack it must not be retained in the cache since we may push something else into that location. Actual parameters to procedures are not use-counted in the same way as locals so it is worth keeping them cached. *) let val (cacheRegs, code) = if cache = noRegisters then (noRegisters, []) else if not keepIfCache orelse (case stacken of Register _ => true | StackW i => i > 0 (* Parameters on the stack have -ve address. *) | _ => false) then (* Clear cache. *) (noRegisters, freeSet(regset, cache)) else (* Retain cache value. *) (cache, []) in if cacheRegs = noRegisters then (* If the cache is (now) empty we can remove the entry completely. *) let (* clobber the entry. *) val () = setPstackEntry (table, entry, NoStackEntry) val freeCode = case stacken of Register(reg, _) => free regset reg | Direct {base, ...} => free regset base | Container{items, dependencies} => let (* Release the dependencies. The normal use count mechanism doesn't remove mutually recursive closures and so they may be forcibly removed at the end of a block. Since the dependencies form a loop when we come back to the start we will find an entry that has already been clobbered. *) fun releaseDep(i, f) = case pstackEntry(table, i) of NoStackEntry => f | _ => incrUseCount(table, i, ~1) @ f val releaseList = List.foldl releaseDep in releaseList (releaseList [] items) dependencies end | _ => [] val () = clearOff table in code @ freeCode end (* otherwise we just leave the entry there. *) else ( setPstackEntry (table, entry, StackEntry { ent = stacken, cache = cacheRegs, uses = 0, destStack = NONE, lifeTime=lifeTime }); code ) end (* end removeEntry *) (* Add the number of uses to the use count of an item on the stack. *) and incrUseCount (table, entry, incr) : operation list = case pstackEntry(table, entry) of NoStackEntry => raise InternalError ("incrUseCount: no entry " ^ Int.toString(entry)) | StackEntry {ent, cache, uses, destStack, lifeTime} => let val newUses = uses + incr; in if newUses <= 0 then removeEntry(table, entry, true) else ( setPstackEntry (table, entry, StackEntry {ent=ent, cache=cache, uses=newUses, destStack=destStack, lifeTime=lifeTime}); [] ) end and setLifetime(table, entry, life) = case pstackEntry(table, entry) of NoStackEntry => raise InternalError ("setLifetime: no entry " ^ Int.toString(entry)) | StackEntry {ent, cache, uses, destStack, ...} => setPstackEntry (table, entry, StackEntry {ent=ent, cache=cache, uses=uses, destStack=destStack, lifeTime=life}) (* True if this is the last reference to this entry. i.e. the use-count *) (* of this entry is 1. *) fun lastReference table entry = case pstackEntry(table, entry) of NoStackEntry => raise InternalError "lastReference: no entry" | StackEntry {uses, ...} => uses = 1 (* Push a value on the stack and return its location. *) fun pushPstack (table as Ttab{pstackTrace, pstackptr, ...}, entry, name, ops) = let val stacktop = ! pstackptr; val psp = stacktop; val destStack = case entry of StackW addr => SOME addr | _ => NONE in setPstackEntry (table, psp, StackEntry {ent=entry, cache=noRegisters, uses=1, destStack=destStack, lifeTime=0}); pstackptr := stacktop + 1; if pstackTrace then printStack(table, name, ops) else (); stacktop end (* Push a value onto the real stack. *) fun incsp(table as Ttab{maxstack, realstackptr, ...}) = let val stackaddr = ! realstackptr in realstackptr := ! realstackptr + 1; if ! realstackptr > ! maxstack then maxstack := ! realstackptr else (); pushPstack(table, StackW stackaddr, "incsp", []) end; (* The top of the pseudo-stack is held in a register *) fun pushRegFromContainer(table, reg, offset) = pushPstack(table, Register(reg, offset), "pushReg", []) fun pushReg (table, reg) = pushRegFromContainer(table, reg, 0) (* The top of the pseudo-stack is a constant *) fun pushConst (table, v : machineWord) = pushPstack(table, Literal v, "pushConst", []) (* The top of the pseudo-stack is a forward reference to a procedure. *) fun pushCodeRef (table, rf : code) = pushPstack(table, CodeRef rf, "pushCodeRef", []) fun addRegUse (Ttab{regset, ...}, reg) = incr regset reg (* If we load a value into the last available register and then need to load another value (e.g. a second argument), it is possible for the first to be pushed onto the stack and the register to be re-used. To avoid this we increment the use count on the first register before we attempt to load the second value. This doesn't prevent the register being pushed onto the stack but it does prevent the register being reused. *) fun lockRegister (table as Ttab{pstackTrace, ...}, reg) = let val _ = addRegUse (table, reg); in if pstackTrace then printStack(table, "lockRegister:"^regRepr reg, []) else () end; fun unlockRegister (table as Ttab{pstackTrace, regset, ...}, reg) : operation list = let val code = free regset reg in if pstackTrace then printStack(table, "unlockRegister:"^regRepr reg, []) else (); code end (* Puts a value in the real stack onto the pseudo-stack. Used for references to arguments that have not been passed in registers. *) fun pushStack (table as Ttab{pstackptr, ...}, addr : int) : stackIndex = let (* Enter it only if it is not already there. *) fun search s = if s >= ! pstackptr then pushPstack(table, StackW addr, "pushStack", []) else case pstackEntry(table, s) of StackEntry {ent = StackW index, ...} => if index = addr then (incrUseCount (table, s, 1); s) else search (s + 1) | _ => search (s + 1) in search first end fun clearCacheEntry(table as Ttab{regset, ...}, regSet, entry): operation list = case pstackEntry(table, entry) of (* HOTSPOT - 198 *) NoStackEntry => [] | StackEntry {ent = stacken, cache, uses, destStack, lifeTime} => if cache = noRegisters then [] else let val keep = regSetMinus(cache, regSet) val remove = regSetIntersect(cache, regSet) in if uses = 0 andalso (* If it has a zero use count we are keeping it only because of the cache. We completely remove an entry, which frees all the registers both in the cache and the entry, either if the cache is now empty or if the entry itself contains a register we want. *) (keep = noRegisters orelse (case stacken of Register(reg, _) => inSet(reg, regSet) | Direct {base,...} => inSet(base, regSet) | _ => false) ) then removeEntry(table, entry, false) else ( setPstackEntry (table, entry, StackEntry {ent = stacken, cache=keep, uses=uses, destStack=destStack, lifeTime=lifeTime}); freeSet(regset, remove) ) end (* Remove registers from the cache. *) fun removeFromCache (table as Ttab{pstackTrace, pstackptr, ...}, regSet, continue: unit -> bool) = let fun clear (entry: stackIndex, limit: stackIndex) = if entry < limit then clearCacheEntry(table, regSet, entry) @ (if continue () then clear (entry + 1, limit) else []) else [] val clearRegs = clear (first, ! pstackptr); in if pstackTrace then printStack(table, "removeFromCache"^regSetRepr regSet, clearRegs) else (); clearRegs end (* Remove everything from the cache. *) fun clearCache table = removeFromCache(table, allRegisters, fn () => true) fun removeRegistersFromCache (table, regs) = removeFromCache(table, regs, fn () => true); (* The value on the stack is no longer required. This now just decrements the use count. *) fun removeStackEntry (table, index) = incrUseCount(table, index, ~1) (* Reset the real stack stack pointer after a function call. *) fun decsp (table as Ttab{pstackTrace, realstackptr, ...}, args) = ( realstackptr := ! realstackptr - args; if pstackTrace then printStack(table, "decsp", []) else () ) (* Frees registers by pushing values onto the stack or moving them to other registers. `selectRegister' selects which registers are affected, `selectEntry' selects which entries are affected. Used either to clear all registers or just to free a particular one. `loadIfPoss' is true if it is sufficient to move the entry to another register. *) fun pushRegisters (table as Ttab{pstackTrace, maxstack, realstackptr, pstackptr, regset, ...}, setToFree, selectEntry, loadIfPoss, dontCache) = let (*fun freeSet rset = List.app (free regset) (setToList rset)*) (* Sort the items by the longest lifetime first. The idea is to push items with a longer time to go before those with shorter lifetimes. *) local fun enumerate(n, l) = if n >= ! pstackptr then l else case pstackEntry(table, n) of (* HOTSPOT - 103 *) StackEntry{lifeTime, ent=Direct _, ...} => enumerate(n+1, (lifeTime, n) :: l) | StackEntry{lifeTime, ent=Register _, ...} => enumerate(n+1, (lifeTime, n) :: l) | _ => enumerate(n+1, l) (* Temporary values with a lifetime of zero should go after those with a finite lifetime but otherwise we put smaller values first because those represent longer lives. *) fun leq (_, _) (0, _) = true | leq (0, _) (_, _) = false | leq (l1, _) (l2, _) = l1 <= l2 in val lifeList = quickSort leq (enumerate(first, [])) end fun pushEntries([], instrList) = (* Finished *) instrList | pushEntries((_, entry)::entries, instrList: operation list) = let val stackent = pstackEntry(table, entry); val pushThis: operation list = case stackent of StackEntry {uses, ent = Direct {base, offset}, cache = cacheReg, destStack, lifeTime} => (* Values which are cached but are otherwise not needed have a zero use-count. There is no need to push them. *) if uses = 0 orelse not (selectEntry entry) then [] else let (* Push reg onto the stack without changing the use count.*) fun saveDirectOnStack () = let val alignInstrs = alignStack(table, [], destStack); val pushInstr = if regSetIntersect(cacheReg, generalRegisters) <> noRegisters then pushRegisterToStack(oneOf(regSetIntersect(cacheReg, generalRegisters))) else pushMemoryToStack(base, offset) val freeCode1 = free regset base val (newCache, freeCode2) = if dontCache then (noRegisters, freeSet(regset, cacheReg)) else (cacheReg, []) (* Overwrite this entry with a reference to the stack. *) val stackAddr = ! realstackptr val () = setPstackEntry (table, entry, StackEntry{ent=StackW stackAddr, cache=newCache, uses=uses, destStack=SOME stackAddr, lifeTime=lifeTime}) in realstackptr := ! realstackptr + 1; if ! realstackptr > !maxstack then maxstack := ! realstackptr else (); freeCode2 @ freeCode1 @ pushInstr @ alignInstrs end fun saveDirectInReg destReg = let (* Free the base register. *) val freeCode1 = free regset base (* Free all cache registers except the destination, if it's in there. *) val freeCode2 = freeSet(regset, regSetMinus(cacheReg, singleton destReg)) val loadInstrs = if inSet(destReg, cacheReg) then [] (* already cached in destination register. *) else if regSetIntersect(cacheReg, generalRegisters) <> noRegisters then (* Cached in a different register - move it there and free the cache. *) moveRegisterToRegister(oneOf(regSetIntersect(cacheReg, generalRegisters)), destReg) else (* Not in a suitable cache register. *) moveMemoryToRegister(base, offset, destReg) in (* Clear out the cache and overwrite this entry with a reference to the register. *) setPstackEntry (table, entry, StackEntry{ent=Register(destReg, 0), cache=noRegisters, uses=uses, destStack=destStack, lifeTime=lifeTime}); freeCode2 @ freeCode1 @ loadInstrs end in if not (inSet(base, setToFree)) then [] else if uses = 0 then (* discardDirect () *) (removeEntry(table, entry, false); []) else if not loadIfPoss (* Not allowed to move it to another register. *) then saveDirectOnStack () else if regSetMinus(cacheReg, setToFree) <> noRegisters (* It's cached in an acceptable register i.e. one NOT in setToFree. *) then saveDirectInReg(oneOf(regSetMinus(cacheReg, setToFree))) else (* Is there an acceptable register free? If so load it into that. *) case getAcceptableRegister (regset, regSetMinus(generalRegisters, setToFree)) of SOME destReg => saveDirectInReg destReg | NONE => saveDirectOnStack () end | StackEntry {uses, ent = Register(reg, _), cache = cacheReg, destStack, lifeTime} => if (* uses = 0 orelse *) not (selectEntry entry) then [] else let (* Push reg onto the stack without changing the use count.*) fun saveRegOnStack () = let val alignInstrs = alignStack(table, [], destStack); val pushInstr = pushRegisterToStack reg (* Have pushed a register - can treat the register as caching the stack location we have pushed it into. *) val (newCache, freeCode) = if dontCache then (noRegisters, freeSet(regset, regSetUnion(cacheReg, singleton reg))) else (regSetUnion(cacheReg, singleton reg), []) val stackAddr = ! realstackptr in (* Overwrite this entry with a reference to the stack. *) setPstackEntry (table, entry, StackEntry {ent=StackW stackAddr, cache=newCache, uses=uses, destStack=SOME stackAddr, lifeTime=lifeTime}); realstackptr := ! realstackptr + 1; if ! realstackptr > ! maxstack then maxstack := ! realstackptr else (); freeCode @ pushInstr @ alignInstrs end (* If we have any direct references using this register we can adjust them to use the new register. This is particularly important if we are moving values out of this register because we want to load it with something else. *) fun saveRegInReg destReg = let fun regChanged entry = if entry < ! pstackptr then let val freeCode = case pstackEntry(table, entry) of StackEntry {ent = Direct {base, offset}, cache, uses, destStack, lifeTime} => if base = reg then let(* Decrement the use count for the source reg and increment it for the destination. *) val freeCode = free regset reg; val _ = addRegUse (table, destReg); in setPstackEntry (table, entry, StackEntry {ent = Direct {base = destReg, offset = offset}, cache=cache, uses=uses, destStack=destStack, lifeTime=lifeTime}); freeCode end else [] | _ => [] in regChanged (entry + 1) @ freeCode end else [] val moveInstrs = if inSet(destReg, cacheReg) then [] (* already cached in destination register *) else moveRegisterToRegister(reg, destReg) (* Free this register *) val freeCode1 = free regset reg (* Free all cache registers except the destination, if it's in there. *) val freeCode2 = freeSet(regset, regSetMinus(cacheReg, singleton destReg)) val freeCode3 = regChanged entry (* Start from this entry not from the bottom *) in (* Clear out the cache and overwrite this entry with a reference to the register. *) setPstackEntry (table, entry, StackEntry {ent = Register(destReg, 0), cache=noRegisters, uses=uses, destStack=destStack, lifeTime=lifeTime}); freeCode3 @ freeCode2 @ freeCode1 @ moveInstrs end in if not (inSet(reg, setToFree)) then [] else if uses = 0 then (* discardReg () *) (removeEntry(table, entry, false); []) else if not loadIfPoss then saveRegOnStack () else if regSetMinus(cacheReg, setToFree) <> noRegisters (* It's cached in a register that we don't need - save it there. *) then saveRegInReg(oneOf(regSetMinus(cacheReg, setToFree))) else let val prefSet = if inSet(reg, floatingPtRegisters) then floatingPtRegisters else generalRegisters in case getAcceptableRegister (regset, regSetMinus(prefSet, setToFree)) of SOME destReg => saveRegInReg destReg | NONE =>saveRegOnStack () end end (* let for saveReg etc. *) | _ => [] (* neither Direct nor Register *) in pushEntries (entries, pushThis @ instrList) end val code = pushEntries(lifeList, []) in if pstackTrace then printStack(table, "pushRegisters"^regSetRepr setToFree, code) else (); code end and pushAnyEntryAtCurrentSP(table as Ttab{realstackptr, ...}): (bool * operation list) = (* Check that the next stack location is not the destination of an entry which has not yet been pushed and pushes it if it is. *) let val currentSp = ! realstackptr fun selectEntry addr = case pstackEntry(table, addr) of NoStackEntry => raise InternalError "pushAnyEntryAtCurrentSP: no entry" | StackEntry {ent=StackW addr, ...} => (* Ok if already pushed. Check that we don't have an entry above the stack pointer. *) if addr > currentSp then raise InternalError "pushAnyEntryAtCurrentSP: entry above rsp" else false | StackEntry {destStack=NONE, ...} => false | StackEntry {destStack=SOME destStack, ...} => (* Consistency check to make sure that we haven't got an unpushed entry below the current sp. *) if destStack < currentSp then raise InternalError "pushAnyEntryAtCurrentSP: unpushed entry" else destStack = currentSp (* Push it if we're there. *) val pushInstrs = pushRegisters(table, allRegisters (* Any register *), selectEntry, false, false) in (* Return true if the stack pointer has changed. *) (! realstackptr <> currentSp, pushInstrs) end and alignStack (table as Ttab{realstackptr, pstackptr, ...}, previous, NONE) = (* Can use any offset. *) (* There is a problem when we have gaps where we have reserved addresses which are not consecutive. This can arise if we have something like: val a = ... val b = ... val c = if ...then ...(*X*)[push a]; [push b] a(last ref) else (if ... then (*Y*)[push b because we need its register} else (*Z*)[push a into the unused addr ???]; [push b to its explicit addr]...; a(last ref) ) in ... b ... end. At X a and b are pushed and given explicit addresses but a is removed at the end of the branch. At Y we've lost the explicit address for "a" so we have a gap. What should we put in the gap? We might be lucky and push a into it but what if we put something else in there? All this is only a problem if, when we merge the states, we only try to push entries. If we could store into the stack we'd be fine. We can store registers into the stack but not "direct" entries. For the moment, use the lowest value above the current sp which is not currently reserved. DCJM 25/1/01.*) let fun minReserved s i = case pstackEntry(table, s) of (* HOTSPOT - 117 *) StackEntry {destStack=NONE, ...} => i | StackEntry {destStack=SOME destStack, ...} => Int.max(destStack+1, i) | _ => i val newAddr = revfoldIndDownTo(minReserved, ! realstackptr, ! pstackptr - 1, first) in alignStack (table, previous, SOME newAddr) end | alignStack (table as Ttab{realstackptr, ...}, previous, destAddr as SOME addr) = (* Can use any offset. *) (* We have an explicit offset *) ( if addr < ! realstackptr then raise InternalError "pushRegisters: unpushed register" else (); if addr = ! realstackptr then previous (* Got there. *) else let val (pushIt, pushInstrs) = pushAnyEntryAtCurrentSP table val alignInstrs = (* If there is another entry for this address push it. *) if pushIt then pushInstrs @ previous else (* Push any register simply to align the stack. *) ( realstackptr := ! realstackptr + 1; pushToReserveSpace @ pushInstrs @ previous ) in alignStack(table, alignInstrs, destAddr) (* Keep going. *) end ) (* Push a specific entry. This should really be incorporated into pushRegisters since at the moment it processes all the entries and only selects the particular one. *) fun pushSpecificEntry (table, entry) = pushRegisters(table, allRegisters, fn e => e = entry, false, false) (* Used particularly before procedure calls where we want to ensure that anything in a register is pushed onto the stack unless its last reference is in the call itself. Also used before a handler. *) fun pushAllBut (table as Ttab{pstackptr, ...}, but, pushTheseRegs) = let val useTab = Array.array(!pstackptr, 0) in but (fn addr => let val ind = addr in Array.update (useTab, ind, Array.sub (useTab, ind) + 1) end); pushRegisters(table, (* registers that are modified *) pushTheseRegs, (* entries with more uses than this *) fn addr => case pstackEntry(table, addr) of NoStackEntry => raise InternalError "pushAllBut: no entry" | StackEntry {uses, destStack, ent, cache, lifeTime} => if uses > Array.sub (useTab, addr) then true else ( (* Set the destination stack for this entry to "undefined". That's safe because we're going to remove this entry. We do this because we may be about to push some arguments or exception handlers and destStack may be in that area. *) case destStack of NONE => () | SOME _ => setPstackEntry (table, addr, StackEntry {ent=ent, cache=cache, uses=uses, destStack=NONE, lifeTime=lifeTime}); false ), false, false) end; (* Ensures that all values which need to be preserved across a function call are pushed onto the stack or are in registers that will not be modified. *) fun pushNonArguments (table as Ttab{pstackptr, ...}, args, pushTheseRegs) : (reg list * operation list) = let fun checkAddress [] _ = false | checkAddress (h::t) addr = h = addr orelse checkAddress t addr val onList = checkAddress args (* Get the list of registers which weren't pushed. We need to lock them so that they don't get pushed onto the stack while we are pushing the arguments. Actually I'm not sure this achieves what we want. *) fun getRegisterList entry regs = if entry < ! pstackptr then if onList entry (* Is it an argument? *) then (* Ignore this. *) getRegisterList (entry + 1) regs else let val stackent = pstackEntry(table, entry) (* HOTSPOT - 90 *) val nextRegs = case stackent of StackEntry {uses, ent = Direct {base, ...}, ...} => if uses = 0 then regs else (lockRegister(table, base); base::regs) | StackEntry {uses, ent = Register(reg, _), ...} => if uses = 0 then regs else (lockRegister(table, reg); reg::regs) | _ => (* neither Direct nor Register *) regs in getRegisterList (entry + 1) nextRegs end else regs val instrs = pushRegisters(table, (* registers that are modified *) pushTheseRegs, (* Ignore entries corresponding to the arguments but only if they have a use count of exactly one, *) fn addr => case pstackEntry(table, addr) of NoStackEntry => raise InternalError "pushNonArguments: no entry" | StackEntry {uses, destStack, ent, cache, lifeTime} => if uses > 1 orelse not (onList addr) then true (* Must push it now if the register is modified. *) else (* Don't need to save it because it's an argument. *) ( (* Set the destination stack for this entry to "undefined". That's safe because we're going to remove this entry. We do this because we may be about to push some arguments and destStack may be in that area. There may not be the same need for this as in pushAllBut but it shouldn't do any harm. *) case destStack of NONE => () | SOME _ => setPstackEntry (table, addr, StackEntry {ent=ent, cache=cache, uses=uses, destStack=NONE, lifeTime=lifeTime }); false ), (* If all the registers must be pushed there's no point in trying to move to another register. *) not (isAllRegs pushTheseRegs), false) in (getRegisterList first [], instrs) end type savedState = { pStackPtr: stackIndex, realStackPtr: int, pStack: stackEntry Vector.vector } fun pStackPtr ({pStackPtr ,...}:savedState) = pStackPtr; fun realStackPtr ({realStackPtr,...}:savedState) = realStackPtr; fun pStack ({pStack ,...}:savedState) = pStack; fun saveStateEntry ({pStack, ...}: savedState, locn) = if locn >= Vector.length pStack then NoStackEntry else Vector.sub(pStack, locn) fun printState printStream (save: savedState as {pStackPtr, realStackPtr, ... }) name = ( printStream name; printStream "\n"; printStream " psp="; printStream(Int.toString(pStackPtr)); printStream " rsp="; printStream(Int.toString realStackPtr); printStream "\n"; forIndDownTo(pStackPtr, first, fn i => printEntry printStream (saveStateEntry(save, i)) i) ); fun pStackRealEntry (table:savedState, locn:stackIndex) = let val pstack = pStack table in case (Vector.sub(pstack, locn)) of NoStackEntry => raise InternalError "pStackRealEntry: no entry" | StackEntry record => (locn,record) end (* Sets the pseudo stack into a state to which it can be restored later. It is used when there are conditional branches to ensure that the state is the same if the branch falls through or is taken. *) fun saveState (table as Ttab{pstackTrace, printStream, realstackptr, pstackptr, ...}) : savedState = let val maxIndex = ! pstackptr val state = { pStackPtr = ! pstackptr, realStackPtr = ! realstackptr, pStack = Vector.tabulate(maxIndex, fn n => pstackEntry(table, n)) } in if pstackTrace then printState printStream state "saveState" else (); state end (* Extract one of the acceptable registers. *) fun getRegisterInSet(table as Ttab{pstackTrace, regset, ...}, rSet) : reg * operation list = let fun getReg() = getAcceptableRegister(regset, rSet) (* First see if there is one free and grab that. *) val rAndCode = case getReg () of SOME r => (r, []) | NONE => let (* We seem to have run out. First flush the cache, then if that fails push a register. *) fun untilSomethingFree () = case getReg () of NONE => true | SOME r => let val _ = free regset r in false end val clearAll = removeFromCache(table, rSet, untilSomethingFree) in case getReg () of SOME r => (r, clearAll) | NONE => let val pushInstrs = pushRegisters(table, rSet, fn _ => untilSomethingFree(), true (* Allow moves *), true (* Free it once it's been pushed *)) (* Pushed values stay in the cache. *) val clearPush = removeFromCache(table, rSet, untilSomethingFree) in (* If we still haven't found anything we are in big trouble. *) case getReg () of SOME r => (r, clearPush @ pushInstrs @ clearAll) | NONE => raise InternalError("No free registers: " ^ regSetRepr rSet) end end in if pstackTrace then printStack(table, "getRegisterInSet", #2 rAndCode) else (); rAndCode end fun getRegister(table, reg) = #2(getRegisterInSet(table, singleton reg)) and getAnyRegister table = getRegisterInSet(table, generalRegisters) (* Resets the stack to the value given by removing any entries with non-zero use counts above it. This is fairly rare so does not have to be particularly efficient. Assumes that there are enough data registers to hold all the values. *) (* We use the stack for saving values, for function parameters and for handler entries. Function parameters and handler entries have specific formats with multiple words which must be contiguous. If we have to spill a register after, say, pushing one parameter and while computing another, we must reload any spilled values and set the real stack pointer correctly before continuing. *) fun resetButReload ( table as Ttab{pstackTrace, realstackptr, pstackptr, regset, ...}, stackOffset) : operation list = let val oldSp = ! realstackptr (* Load any values above "stackOffset". *) fun loadEntries(entry, otherCode): operation list = if entry < first then otherCode else let val stackent = pstackEntry(table, entry); val thisCode = case stackent of StackEntry {ent = StackW addr, cache, uses, lifeTime, ...} => if addr >= stackOffset (* Above the limit on the stack. *) then let (* Load it without changing the use count. *) val (reg, regCode) = if cache <> noRegisters then (oneOf cache, []) else let val (reg, code) = getAnyRegister table val stackOffset = (addr - ! realstackptr + 1) * ~wordSize val fullCode = moveMemoryToRegister(regStackPtr, stackOffset, reg) @ code in (reg, fullCode) end (* Free all cache registers except the destination, if it's in there. *) val freeCode = freeSet(regset, regSetMinus(cache, singleton reg)) in (* Clear out the cache and overwrite this entry with a reference to the register. *) setPstackEntry (table, entry, StackEntry {ent = Register(reg, 0), cache=noRegisters, uses=uses, destStack=NONE, lifeTime=lifeTime}); freeCode @ regCode end else [] | _ => [] in loadEntries (entry - 1, thisCode @ otherCode) end (* loadEntries *); val loadCode = loadEntries ((! pstackptr) - 1, []); (* If the real stack ptr has changed we must have pushed something, so our check has been useless. *) val () = if ! realstackptr <> oldSp then raise InternalError "resetButReload: must have pushed something more" else (); val finalCode = resetStack (! realstackptr - stackOffset) @ loadCode in (* Now reset the stack pointer. *) realstackptr := stackOffset; if pstackTrace then printStack(table, "resetButReload", finalCode) else (); finalCode end; fun freeRegister (Ttab{regset, ...}, reg) = free regset reg (* Choose a register to be used to hold the result e.g. of a "case". *) fun chooseRegister (Ttab{regset, ...}) : reg option = let fun chooseReg ({vec, ...}:rset) = let val nextReg = 0 fun next n = if n = 0 then (vecSize - 1) else (n - 1); fun findFree (i : int) : reg option = if Array.sub (vec, i) = 0 andalso inSet(regN i, generalRegisters) then SOME(regN i) else let val n = next i; in if n = nextReg then (* None free. *) NONE else findFree n end in findFree nextReg end in chooseReg regset end (* Return the set of modified registers for this function. *) fun getModifedRegSet (Ttab{regset={modSet=ref modSet, ...}, ...}) = modSet (* Add a set of registers to those modified by this function. This will be the set of registers modified by a function called by this one. *) fun addModifiedRegSet (transtable: ttab, regs: regSet): unit = let val Ttab{regset={modSet, ...}, ...} = transtable in modSet := regSetUnion(!modSet, regs) end (* Generates code for an entry on the pseudo-stack. *) (* Moves the entry (at locn) into destReg, decrementing the use-count for entry. Doesn't push anything new on the pstack. *) fun loadPstackEntry (table as Ttab{pstackTrace, realstackptr, regset, ...}, locn (* Offset on the stack *), destReg) = let val {cache = cacheReg, ent, ...} = pstackRealEntry(table, locn) fun moveFromMemory(base, offset, destReg) = if inSet(destReg, floatingPtRegisters) then (* We can't load directly to the FP regs - put first into a general reg. This is X86-specific and really should be in a negotiator but since we only have FP regs on the X86 leave it. *) let val (aReg, regCode) = getAnyRegister table in free regset aReg @ moveRegisterToRegister(aReg, destReg) @ moveMemoryToRegister(base, offset, aReg) @ regCode end else moveMemoryToRegister(base, offset, destReg) val loadCode = if inSet(destReg, cacheReg) then [] else if cacheReg <> noRegisters then moveRegisterToRegister(oneOf cacheReg, destReg) else case ent of Register(reg, _) => if reg <> destReg then moveRegisterToRegister(reg, destReg) else [] | Literal lit => moveConstantToRegister(lit, destReg) | CodeRef code => moveCodeRefToRegister(code, destReg) | Direct {base, offset} => moveFromMemory(base, offset, destReg) | StackW index => moveFromMemory(regStackPtr, (! realstackptr - index - 1) * wordSize, destReg) | Container{items, ...} => (* The first entry in the container gives us the address. *) case pstackRealEntry(table, hd items) of {ent = StackW index, ...} => moveStackAddress(! realstackptr - index -1, destReg) | _ => raise InternalError "loadPstackEntry: container entry is not on stack"; (* Decrement use count and remove if done. *) val codeAndRelease = incrUseCount (table, locn, ~1) @ loadCode in if pstackTrace then printStack(table, "loadPstackEntry", codeAndRelease) else (); codeAndRelease end (* loadPstackEntry *) (* Pushes a new pstack entry; loads value into register; decrements the use count of old pstack entry. *) fun loadEntryToSet (table as Ttab{regset, ...}, entry, rSet, willTrample) = let val realLoc = entry val {ent = stackEntry, cache = cacheReg, uses, destStack, lifeTime} = pstackRealEntry(table, entry) (* If we find an entry in the cache or already in a register we can use it provided it will not be modified or this is its last use. Otherwise we must make a copy of it. *) val lastRef = lastReference table entry val acceptable = case stackEntry of Register(reg, _) => if inSet(reg, rSet) then if not willTrample (* It's acceptable. *) then SOME (reg, entry) else if lastRef then ( (* We are going to trample on it but this is the last reference so we can use it. It may, though, be caching a value so we must remove it from the cache before we return it. *) removeRegistersFromCache(table, listToSet [reg]); SOME (reg, entry) ) else NONE (* Must copy it. *) (* TODO: Won't this result in double copying? Once to free this and again to move the value into the now free register. *) else NONE (* Not in the right register. *) | _ => (* May be cached. *) if regSetIntersect(cacheReg, rSet) <> noRegisters then (* There's an acceptable register in the cache. *) let val destReg = oneOf(regSetIntersect(cacheReg, rSet)) (* Get the register, increment its use count and put it on the stack *) (* If we are going to trample on the register we must remove it from the cache. If this is the last real reference that will not matter, but if this is actually a reference to a parameter which could be loaded onto the stack again we have to be careful that the cache does not indicate a register which has been changed. *) val () = if willTrample then setPstackEntry (table, realLoc, StackEntry{ent=stackEntry, cache=regSetMinus(cacheReg, singleton destReg), uses=uses, destStack=destStack, lifeTime=lifeTime}) else (addRegUse (table, destReg); ()) val newEntry = pushReg (table, destReg) in (* Must decrement the use-count of the entry we are loading as though we had actually loaded it. *) incrUseCount (table, entry, ~1); SOME (destReg, newEntry) end else NONE in case acceptable of SOME (reg, entry) => (reg, entry, []) (* Can use what we have. *) | NONE => let (* It is loaded into a register. This is complicated because we want to put entries into the cache if we can. They must not be put into the cache until after they have been loaded otherwise the load instruction will simply copy the new cache value. It is possible that a value might be cached in a data register when it is needed in an address register or vice-versa. *) val (resultReg, regCode) = (* If we have a Direct entry which currently uses the register we want to load into as the base register the default code will load this into a different register in order to free the base register and then move this into the destination. We can avoid that if this is the last reference to the base register and the Direct entry. This is a very common case. *) case stackEntry of Direct{base, ...} => if cacheReg = noRegisters andalso inSet(base, rSet) andalso lastRef andalso lastRegRef(regset, base) then (base, incr regset base) else getRegisterInSet(table, rSet) | _ => getRegisterInSet(table, rSet)(* N.B. May side-effect table. *) in (* Get the entry again - getAnyRegister could have forced the entry onto the stack if it had run out of registers. *) case pstackEntry(table, realLoc) of NoStackEntry => raise InternalError "loadEntry: entry deleted" | StackEntry {ent, uses, cache, destStack, lifeTime} => let (* If the value is already cached, keep it in the old cache register, rather than the new one. This should help to minimise register-register moves when we have to merge branches. *) val cacheIt = not willTrample andalso case ent of Direct{base, ...} => base <> resultReg (* Cannot cache it if we are about to pop it. *) | StackW index => (0 >= index orelse not lastRef) | _ => false (* If we are going to cache it we musn't let it be removed. *) val freeCode1 = if cacheIt then incrUseCount (table, entry, 1) else [] (* If we're loading the address of a container we need to ensure that it stays on the stack as long as the register is in use. This is only a problem if we're calling a function which returns its result via a container but in this particular case its result is discarded. In that case loading its address in order to pass it into the function will be the last reference so the container entry will be removed from the pstack and removeOldItemsFromRealStack could remove the container from the real stack before the function is called. *) val stackOffset = case ent of Container{items, ...} => ( case pstackRealEntry(table, hd items) of {ent = StackW index, ...} => index | _ => raise InternalError "loadPstackEntry: container entry is not on stack" ) | _ => 0 val loadEntry = loadPstackEntry(table, entry, resultReg) val newEntry = pushRegFromContainer(table, resultReg, stackOffset) val freeCode2 = if cacheIt then ( (* put in the cache and restore use-count. *) setPstackEntry (table, realLoc, StackEntry {ent=ent, cache=regSetUnion(cache, singleton resultReg), uses=uses, destStack=destStack, lifeTime=lifeTime}); addRegUse (table, resultReg); incrUseCount (table, entry, ~1) ) else [] (* If we call removeOldItemsFromRealStack now we may be able to change a load into a pop. *) val removeCode = removeOldItemsFromRealStack table in (resultReg, newEntry, removeCode @ freeCode2 @ loadEntry @ freeCode1 @ regCode) end end (* useNewRegister *) end fun loadToSpecificReg (table, reg, entry, needExclusive) = let val (_, regIndex, ops) = loadEntryToSet(table, entry, singleton reg, needExclusive) in (regIndex, ops) end (* Make sure that the entry will not require an allocation in order to put it into memory. This really means that the value must not be in a floating point register. This is used when evaluating expressions that will be stored into a newly allocated piece of memory. A value in a FP register first has to be stored into memory and this has to be done first. *) fun ensureNoAllocation(table, entry) = case pstackRealEntry(table, entry) of { ent = Register(reg, _), ... } => if inSet(reg, floatingPtRegisters) then let val (_, regIndex, ops) = loadEntryToSet(table, entry, generalRegisters, false) in (regIndex, ops) end else (entry, []) (* Safe *) | _ => (* We must remove any floating point registers that cache this entry. This is a bit of a shame because we may want the FP register further on but is because argAsSource chooses ActInRegisterSet if the cache is non-empty. That's wrong if we want the FP value in memory because we will attempt to store the FP register again. See Tests/Succeed/Test159.ML *) (entry, clearCacheEntry(table, floatingPtRegisters, entry)) (* Checks if we are going to overwrite the stack, and loads the entry into a register. *) fun loadEntryBeforeOverwriting (table as Ttab{realstackptr, pstackptr, regset, ...}, offset:int) = if 0 <= offset andalso offset < ! realstackptr then let (* May have to reload something. *) fun findTheEntry (entry: stackIndex, previousCode) = if entry < first then previousCode (* finish *) else let val stackent = pstackEntry(table, entry) val thisCode = case stackent of StackEntry {ent = StackW addr, cache, uses, lifeTime, ...} => if addr = offset then let (* This is the entry. *) (* Load it without changing the use count. *) val (reg, code) = if cache <> noRegisters then (oneOf cache, []) else let val (reg, regCode) = getAnyRegister table val off = (! realstackptr - 1 - addr) * wordSize; in (reg, moveMemoryToRegister(regStackPtr, off, reg) @ regCode) end; (* Free all cache registers except the destination, if it's in there. *) val freeCode = freeSet(regset, regSetMinus(cache, singleton reg)) val newStackent = (* Make a new entry with a NEW stack destination. If we have to push it we have to use a new location. I don't like this but it's safe because this only occurs for a tail-recursive value or for a temporary value in an exception handler. It does have implications when setting the state which is why we no longer check that destinations match in "setState". *) StackEntry {ent = Register(reg, 0), cache=noRegisters, uses=uses, destStack=NONE, lifeTime=lifeTime} in (* Clear out the cache and overwrite this entry with a reference to the register. *) setPstackEntry (table, entry, newStackent); freeCode @ code end else [] (* not this entry *) | _ => [] in findTheEntry (entry - 1, thisCode @ previousCode) end (* findTheEntry *) in findTheEntry ((! pstackptr) - 1, []) end else [] (* end of loadEntryBeforeOverwriting *) (* Store a pseudo-stack entry at a given location on the real stack. Used when making a tail-recursive call. The problem is that the old entry in the real stack may be in use, so we may have to reload it first. We load all the values before storing any, so there is no danger of overwriting entries in the argument area, but we may have had to push some of the registers while doing the load, so those entries will have to be saved. *) fun storeInStack (table as Ttab{maxstack, realstackptr, markReal as ref initMark, ...}, entry, locn) = let (* Make sure we don't reset the stack below this point. *) val () = markReal := Int.max(locn, initMark) (* Move it to the stack, using a move-immediate if possible. *) fun inc x = (x := !x + 1); fun generalStoreInStack () = (* General case. *) let val (reg, regEntry, code) = loadEntryToSet(table, entry, generalRegisters, false) (* Lock the register, otherwise it might be used to load an entry. *) val () = lockRegister (table, reg) val loadCode = loadEntryBeforeOverwriting(table, locn) (* N.B. loadEntry may push values onto the stack, so we cannot use isPush. *) val pushCode = if ! realstackptr = locn then ( inc realstackptr; pushRegisterToStack reg ) else let val loc = (! realstackptr - locn - 1) * wordSize in storeRegisterToStack(reg, loc) end in unlockRegister (table, reg); removeStackEntry(table, regEntry); pushCode @ loadCode @ code end; val isPush = ! realstackptr = locn val {ent = valEnt, cache = cacheReg, ...} = pstackRealEntry(table, entry); (* Select the best instruction to use. The default is to load it into a register and store or push that. *) val code = case valEnt of Literal lit => if isPush andalso isPushI lit then let val loadCode = loadEntryBeforeOverwriting(table, locn) in (* Push-immediate. *) incrUseCount (table, entry, ~1); inc realstackptr; pushConstantToStack lit @ loadCode end else if false (* isStoreI(lit, false) *) (* TEMPORARILY *) then let (* Store immediate. *) val loadCode = loadEntryBeforeOverwriting(table, locn) val locn = (! realstackptr - locn - 1) * wordSize in (* Remove the entry for the literal. *) incrUseCount (table, entry, ~1); storeConstantToStack(lit, locn) @ loadCode end else generalStoreInStack () | Direct {base, offset} => if isPush andalso cacheReg = noRegisters then let (* Push memory. *) val loadCode = loadEntryBeforeOverwriting(table, locn) in incrUseCount (table, entry, ~1); inc realstackptr; pushMemoryToStack(base, offset) @ loadCode end else generalStoreInStack () | StackW index => if isPush andalso cacheReg = noRegisters then let (* Push stack entry. *) val loadCode = loadEntryBeforeOverwriting(table, locn) val locn = (! realstackptr - 1 - index) * wordSize; in incrUseCount (table, entry, ~1); inc realstackptr; pushMemoryToStack(regStackPtr, locn) @ loadCode end else generalStoreInStack () | _ => generalStoreInStack (); val stackEntry = pushPstack(table, StackW locn, "pushValueToStack", []) in if ! realstackptr > ! maxstack then maxstack := ! realstackptr else (); markReal := initMark; (stackEntry, code) end (* storeInStack *); fun genError() = raise InternalError "pushValueToStack: Couldn't push to stack" (* Ensures that the top of the pseudo stack has been copied onto the real stack and is at the correct position. stackOffset contains the stack offset it should have. Primarily used to push arguments to procedures. *) fun pushValueToStack (table as Ttab{realstackptr, ...}, entry, stackOffset) : stackIndex * operation list = let val stackAddr = stackOffset - 1 val (storeLocn, storeCode) = storeInStack (table, entry, stackAddr) val clearCode = (* Remove any entries above the stack offset we need. *) if ! realstackptr > stackOffset then resetButReload (table, stackOffset) else [] in (* The stack pointer should now be the required value. *) if ! realstackptr <> stackOffset then genError() else (); (storeLocn, clearCode @ storeCode) end; fun reserveStackSpace(table: ttab, space: int): stackIndex * operation list = (* Reserve space on the stack for a tuple. *) let (* We must first make sure that the space we're going to allocate hasn't been reserved for a register. *) val alignCode = alignStack(table, [], NONE) (* Initialise the store so that the garbage collector doesn't accidentally pick up an invalid pointer. *) (* The stack grows downwards so we want the entries in reverse order. The first entry must be lowest address. *) fun pushEntries(0, code) = ([], code) | pushEntries(n, code) = let val (pushRest, pushCode) = pushEntries (n-1, code) val stackLocn = incsp table in (* Reserve space on the stack. *) (stackLocn :: pushRest, pushToReserveSpace @ pushCode) end; val (entries, code) = pushEntries(space, alignCode) in (pushPstack(table, Container{items=entries, dependencies=[]}, "reserveStackSpace", code), code) end (* Generates an indirection on an item on the pseudo-stack. *) fun indirect (wordOffset, entry, table as Ttab{pstackptr, lowestDirect, ...}) : stackIndex * operation list = case pstackRealEntry(table, entry) of {ent = Container {items, ...}, ...} => (* If we are indirecting off a container we can simply load the entry. *) let val resIndex = List.nth(items, wordOffset) in (* Increment its use count. *) incrUseCount (table, resIndex, 1); removeStackEntry(table, entry); (* Remove the container entry. *) (resIndex, []) end | {ent = Literal i, ...} => ( removeStackEntry(table, entry); (* Remove the container entry. *) (* We won't normally get this because it will have been optimised out. The exception is when we have SetContainer with a tuple which is a constant. For safety we check that we have a valid address here although unlike in findEntryInBlock we should never actually get an invalid one. *) (* Actually, we can, in cases such as val (a,b) = raise ... where we will do an indirection on the dummyValue put on the pstack to represent the non-existent result of the "raise". In that case we put in a dummy result of zero. *) if isShort i andalso toShort i = 0w0 then (pushConst(table, toMachineWord 0), []) else if isShort i orelse Address.length (toAddress i) <= Word.fromInt wordOffset then raise InternalError "indirect - invalid constant address" else (pushConst (table, loadWord (toAddress i, Word.fromInt wordOffset)), []) ) | _ => let val (topReg, topEntry, code) = loadEntryToSet(table, entry, generalRegisters, false) val _ = removeStackEntry(table, topEntry) (* Remove the entry for the register. *) (* and push the indirection *) (* Profiling shows that this search is where the compiler can spend most of its time. To speed it up we keep a lower limit pointer which saves us searching below the lowest direct entry. *) (* See if it is already on the stack. *) fun search(s, max, foundD) = if s >= max then ( (* Not there. *) addRegUse (table, topReg); (* If this is below the previous lower limit we need to reset it. *) if ! lowestDirect > ! pstackptr then lowestDirect := ! pstackptr else (); pushPstack(table, Direct {base = topReg, offset = wordOffset * wordSize}, "indirect", code) ) else case pstackEntry(table, s) of StackEntry {ent = Direct {base, offset}, ...} => ( (* If we found no direct entries below here then remember this as the first. *) if not foundD then lowestDirect := s else (); if base = topReg andalso offset = wordOffset * wordSize then (* Found it *) ( incrUseCount (table, s, 1); s ) else search(s + 1, max, true (* Found one *)) ) | _ => search (s + 1, max, foundD); (* end search *) in (search (! lowestDirect, ! pstackptr, false), code) end (* Loads a value into a register if it is in the argument area. Used for tail-recursive calls. "storeInStack" checks for overwriting entries elsewhere on the stack, but because the argument area is not represented by entries on the pstack it won't work for them. *) fun loadIfArg (table, entry) : stackIndex * operation list = case pstackRealEntry(table, entry) of {ent = StackW index, ...} => if index < 0 then let val (_, newEntry, loadCode) = loadEntryToSet(table, entry, generalRegisters, false) in (newEntry, loadCode) end else (entry, []) | _ => (entry, []) (* return the original. *) (* Get the register set for a function that has already been compiled or for an RTS function. *) fun getRegisterSetForFunction addr = let val doCall: int*machineWord -> Word.word = RunCall.run_call2 RuntimeCalls.POLY_SYS_poly_specific val rSet = doCall(103, addr) (* Get the bit pattern from the function. *) in getRegisterSet rSet end fun getRegisterSetForCode (cvec: code) : regSet = (* Get the register set for a forward reference which may or may not have already been compiled. *) case codeAddress cvec of SOME addr => (* Now compiled - return the register set. *) getRegisterSetForFunction (toMachineWord addr) | NONE => (* We haven't compiled this yet: assume worst case. *) allRegisters (* Get the register set for an entry on the stack which will be the entry point of a function. If it's not a constant we have to assume it modifies any of the registers. *) fun getFunctionRegSet(index: stackIndex, transtab: ttab) : regSet = let val {ent = stacken, ...} = pstackRealEntry(transtab, index) in case stacken of Literal lit => getRegisterSetForFunction lit | CodeRef code => getRegisterSetForCode code | _ => allRegisters end (* An optional result. i.e. if the code before the jump has returned a result this is the offset in the table of the result. *) datatype mergeResult = NoMerge | MergeIndex of stackIndex; (* A code label packaged up with a saved state. *) abstype labels = NoLabels | Labels of {result: mergeResult, lab: CODECONS.forwardLabel, state: savedState} with val noJump = NoLabels; fun isEmptyLabel NoLabels = true | isEmptyLabel _ = false; fun makeLabels(res, cLab, sState) = Labels {result=res, lab = cLab, state = sState}; fun labs (Labels {lab ,...}) = lab | labs _ = raise Match; fun state (Labels {state,...}) = state | state _ = raise Match; fun result (Labels {result,...}) = result | result _ = raise Match; end (* Set the state to the saved values. This could almost certainly be radically simplified. Most of the complicating factors have now been removed. *) fun setState (save : savedState, table as Ttab{pstackTrace, printStream, pstackptr, realstackptr, regset, markReal, ...}, carry, mark, isMerge, isRestoreLoop): mergeResult * operation list = let val () = if pstackTrace then printState printStream save "setState" else () val topReg: reg = case carry of NoMerge => regClosure (* Unused *) | MergeIndex savedTop => ( case pStackRealEntry(save, savedTop) of (_,{ent = Register(reg, _), ...}) => reg | (_,{cache, ...}) => if cache = noRegisters then raise InternalError "setState: not a register" else oneOf cache ) (* Clobber all entries above the "mark". This will remove the result register if there is one. *) (* TODO: I don't like this. I think we should explicitly remove it. *) fun freeAbove i = if i < mark then [] else removeEntry(table, i, true) @ freeAbove(i-1) val freeTop = freeAbove(! pstackptr - 1) (* Set up the saved state. Need to set the register set. Free the registers from the table. *) fun frees s = if s >= ! pstackptr then [] else let val stacken = pstackEntry(table, s) val freeEntry = case stacken of NoStackEntry => [] | StackEntry {ent, cache, ...} => let val freeThis = case ent of Register(reg, _) => freeRegister (table, reg) | Direct {base, ...} => freeRegister (table, base) | _ => [] in freeSet(regset, cache) @ freeThis end in frees(s + 1) @ freeEntry end val freeTable = frees first val () = realstackptr := realStackPtr save; local val oldPstackptr = ! pstackptr val () = pstackptr := pStackPtr save (* Go up the entries putting them onto the table from the saved state, then come back setting the use-counts where appropriate. We have to do it this way because of copy entries. *) (* But we don't have copy entries any longer so this could be improved. DCJM 30/11/99. *) fun putOnEntries s = if s >= pStackPtr save then [] else let val saveEntry = saveStateEntry(save, s) val (tabUseCount, tabDestStack) = (* Get the use-count and stack destination in the table. *) if s >= oldPstackptr then (0, NONE) else case pstackEntry(table, s) of NoStackEntry => (0, NONE) | StackEntry {uses, destStack, ...} => (uses, (*if ! exited then NONE else*) destStack) in (* Put the saved entry into the table. *) setPstackEntry (table, s, saveEntry); case saveEntry of NoStackEntry => putOnEntries (s + 1) | StackEntry {ent, cache, uses, lifeTime, ...} => let (* Compute the new register set. *) val loadReg = case ent of Register(reg, _) => incr regset reg | Direct {base, ...} => incr regset base | _ => [] val cacheRegs = List.foldl(fn (r, l) => incr regset r @ l) [] (setToList cache) (* The destination stack information is intended to avoid problems when a value is pushed to the stack in different flows of control. The first flow of control sets the destination stack with the actual location where the value was pushed and then when we set the state we record the destination stack location as the location where subsequent flows of control should push it. This goes wrong if we are using setState to restore the loop state rather than set the initial state for a new flow of control. In the first case we need to ensure that the destination stack values are inherited from the current state and override those in the saved state, because we may have popped items during the first flow and subsequently pushed different items in their place, whereas if we're restoring the state we want to throw away any destination stack information in the current state and take the information only from the saved state. *) val () = if isRestoreLoop then () else setPstackEntry (table, s, StackEntry {ent=ent, cache=cache, uses=uses, destStack=tabDestStack, lifeTime=lifeTime}) val otherEntries = putOnEntries (s + 1) (* Can now set the use counts. The use-counts may have changed and entries may have been removed because the use-counts of copy entries have been decremented. *) (* This no longer applies now that copy entries have been removed. Continue to do it that way for the moment. Note that with the change from use-counts to last-references we no longer reduce the use count to the lower of the saved and current values in the case where we are setting the state at the start of a parallel flow of control (e.g. at the start of the else-part of an if-then-else) but only when this is being used to "merge" flows of control where one flow has actually exited. In that case the use counts should normally agree but there may be cases where they don't, maybe associated with statically-linked functions. *) val () = if isMerge then let val currUseCount = if s >= (! pstackptr) then 0 else case pstackEntry(table, s) of NoStackEntry => 0 | StackEntry {uses, ...} => uses in if tabUseCount < currUseCount then (incrUseCount (table, s, tabUseCount - currUseCount); ()) else () end else () in otherEntries @ cacheRegs @ loadReg end end (* If the state we're setting into has a destination location for an entry we don't override it with an entry for the saved state but instead merge in. However we could have pushed something else on route to the saved state and even though the entry is no longer on the pstack we could now find that the real stack pointer is above the current destination location. We need to reset the stack if that happens so that we can push the entry if we need to. *) fun checkUnPushed s min = case pstackEntry(table, s) of StackEntry{ent=StackW _, ...} => min | StackEntry{destStack=SOME dest, ...} => Int.min(dest, min) | _ => min in val addRegs = putOnEntries first val minUnpushed = revfoldIndDownTo(checkUnPushed, ! realstackptr, ! pstackptr - 1, first) val andReset = if minUnpushed < ! realstackptr then if minUnpushed < !markReal then raise InternalError "Unpushed entry below stack mark" else let val current = !realstackptr; in realstackptr := minUnpushed; resetStack(current-minUnpushed) end else [] end val regLoadFree = andReset @ addRegs @ freeTable @ freeTop val result = case carry of MergeIndex _ =>(* Put the result register onto the stack. *) let val regCode = getRegister (table, topReg) in (MergeIndex(pushReg (table, topReg)), activeRegister topReg @ regCode @ regLoadFree) end | NoMerge => (NoMerge, regLoadFree) in if pstackTrace then printStack(table, "setState", #2 result) else (); result end fun unconditionalBranch (result, table as Ttab { branched, ...}) : labels * operation list = if ! branched then (noJump, []) else let val state = saveState table val (branchCode, label) = uncondBranch() in branched := true; (makeLabels(result, label, state), branchCode) end; fun jumpBack(start, Ttab { branched, ...}): operation list = ( branched := true; (* Check for interrupts when jumping backwards. *) CODECONS.jumpBack start @ interruptCheck ) (* Record the stack limit when we diverge and then use it when we merge back again. *) type stackMark = { newMark: stackIndex, oldMark: stackIndex, oldReal: int } fun newMark ({newMark,...}: stackMark) = newMark fun markStack(Ttab{pstackptr, marker, markReal, realstackptr, ...}) = { newMark = ! pstackptr, oldMark = ! marker, oldReal = ! markReal } before (marker := ! pstackptr; markReal := ! realstackptr) fun unmarkStack(Ttab{marker, markReal, ...}, {oldMark, oldReal, ...}) = ( marker := oldMark; markReal := oldReal ) (* mergeState is used when two flows of control merge e.g. at the end of the else-part of an if-then-else when the state saved at the end of the then-part has to be merged with the state resulting from the else-part. This function first tries to do what it can to make the current state match the saved state. If it can't do it it may require a "reverse merge" where we swap over the saved and current states. Ideally we would simply patch in extra code in the then-part but that's too complicated. Instead "fixup" does it by generating an unconditional branch, fixing up the original branch and then calling mergeState to try and merge again. This should only require one reverse to converge. I've virtually rewritten this function since it was the source of a number of bugs, particularly some identified by Simon Finn. The aim now is to converge by having a (partial) ordering on the types of entries: Stack > Register/Cached > Direct. We never load a stack entry into a register. DCJM 29/6/2000. *) fun mergeState (save : savedState, savedResult: mergeResult, table as Ttab{pstackTrace, printStream, realstackptr, pstackptr, marker, regset, ...}, currentResult: mergeResult, mark) : bool * mergeResult * operation list = let val needOtherWay = ref false; val () = if pstackTrace then ( printStack(table, "mergeState", []); printState printStream save "saved state" ) else (); val () = if ! marker <> newMark mark then raise InternalError "Marker" else (); (* Merge the tables together. The only complication is that if both sides are returning values they may be at different locations on the pseudo stack. We load the top of the current stack into the register that was used for the top of the saved state and then remove it. There is no need to remove the top of the saved state because those entries will correspond to zero-use count entries in the current stack. *) val (topReg, topRegCode) = case (savedResult, currentResult) of (MergeIndex savedTop, MergeIndex currentTop) => let val sTopReg = case pStackRealEntry (save, savedTop) of (_,{ent = Register(reg, _), ...}) => reg | (_,{cache, ...}) => if cache = noRegisters then raise InternalError "Not a register" else oneOf cache (* Load the value on the top of "table" into the same register (it ought to be there anyway). *) val (regEntry, loadCode) = loadToSpecificReg (table, sTopReg, currentTop, true); (* Because this register will be at a different offset in the table from in the saved state it is easier to remove the register and put it on later. *) val removeEntry = removeStackEntry(table, regEntry); in (sTopReg, removeEntry @ getRegister (table, sTopReg) @ loadCode) end | (NoMerge, NoMerge) => (regClosure (* Unused *), []) | _ => (* They should agree on whether they will return a result or not. *) raise InternalError "mergeState - Mismatched result states" (* Clobber all entries above the "mark". These are values which are local to the block since the split and so are no longer required. They should normally have been removed as soon as they were no longer required. *) val freeEntries0 = revfoldIndDownTo (fn s => fn l => removeEntry(table, s, true) @ l, [], ! pstackptr - 1, newMark mark) (* First pass: get rid of entries which are no longer required. Also propagate stack destination info. That probably isn't required because it should already have happened (the saved state represents a previous state) but shouldn't be a problem. *) (* The entries on the stack will only be those that were there before we split the instruction streams we are now merging. All those pushed since then will be in different positions in the saved state and current state and so will be removed from the merged state. The common entries may differ if we have had to push some values that were in registers onto the real stack. *) fun fixEntry s l = let val entry = case (pstackEntry(table, s), saveStateEntry(save, s)) of (NoStackEntry, _) => [] (* No entry in table. *) | (StackEntry _, NoStackEntry) => (* table entry could be non-empty if it is a cache entry or if we are doing a backwards merge. If we do a backwards merge we can have entries in the table with non-zero use counts, but those can be removed. *) removeEntry(table, s, false) | (StackEntry {uses = tabUses, cache = tabCache, ent = tabEnt, destStack = tabDest, lifeTime}, StackEntry {uses = saveUses, cache = saveCache, ent = saveEnt, destStack = saveDest, ...}) => let val mergedDest = case (tabDest, saveDest) of (tb as SOME tabDest, SOME saveDest) => if tabDest <> saveDest then raise InternalError("merge: mismatched destination "^Int.toString tabDest^ " " ^ Int.toString saveDest) else tb | (NONE, saveDest) => saveDest | (tabDest, _) => tabDest in if tabUses = 0 orelse saveUses = 0 (* The use-counts may be zero if we have retained an entry because it is cached in a register. We remove these entries unless it is the same value and cached in the same register *) then if tabCache <> saveCache (* TODO: Handle non-empty intersection. *) then removeEntry(table, s, false) else case (tabEnt, saveEnt) of (Direct {base = tabBase, offset = tabOffset}, Direct {base = saveBase, offset = saveOffset}) => if tabBase = saveBase andalso tabOffset = saveOffset then [] else removeEntry(table, s, false) | (StackW tabIndex, StackW saveIndex) => if tabIndex = saveIndex then [] else removeEntry(table, s, false) | _ => removeEntry(table, s, false) else (* We need to retain this entry. *) ( if tabDest <> mergedDest then setPstackEntry (table, s, StackEntry{ent=tabEnt, cache=tabCache, uses=tabUses, destStack=mergedDest, lifeTime=lifeTime}) else (); [] ) end in entry @ l end val freeEntries1 = revfoldIndDownTo (fixEntry, [], ! pstackptr - 1, first) local (* Try to align the real stack pointer by popping unused values. We MUST remove entries which have been pushed onto the stack in the saved state but not in the current state since we'll have to push them here. We must not remove entries which are currently in use. One further complication is that we may have exception handler(s) on the real stack so we can't simply pop everything above the highest used stack position. It would probably be better if we recorded handler locations on the pstack - maybe change this. *) (* Find the highest stack value which is actually in use. *) fun getInUse s i = case pstackEntry(table, s) of StackEntry {ent = StackW addr, ...} => (* The stack pointer must be one more than the highest value in use. *) Int.max(addr+1, i) | _ => i val stackInUse = (* This is the highest used stack location, but we may have a handler above it so we can't necessarily reset the stack to here. *) revfoldIndDownTo(getInUse, 0, (! pstackptr) - 1, first) (* Examine the saved stack to see those entries which have been pushed in the saved state but not in the current state. We need to reset the stack below this. If there are no such entries we return the stack pointer from the saved state. *) fun getMinStack s i = case (pstackEntry(table, s), saveStateEntry(save, s)) of (StackEntry {ent = StackW _, ...}, _) => i | (StackEntry _, StackEntry{ent = StackW addr, ...}) => (* We have an entry which has been pushed in the saved state but not in the current state. We have to set sp below this. *) let val minStack = Int.min(addr, i) in if minStack < stackInUse (* Check that we don't have entries we're going to have to push below those we've already pushed. DCJM 25/1/01. *) then raise InternalError "mergeState: unpushed entries" else minStack end | _ => i; val minStack = revfoldIndDownTo(getMinStack, realStackPtr save, (! pstackptr) - 1, first) (* We can reset the stack to the maximum of the entries currently in use and those which need to be pushed or the saved sp if there aren't any. *) val maxStack = Int.max(stackInUse, minStack) in val resetCode = if maxStack < ! realstackptr then let val reset = resetStack (! realstackptr - maxStack) in realstackptr := maxStack; reset end else [] end; (* Second pass: push any entry which was pushed in the saved state. *) (* We have a choice here about what to do when we have a value which is in a register on one branch and on the stack in the other. The original approach was to get both values back into the register by reloading the register from the stack. That worked well on the Sparc where there were plenty of registers but less well on the i386. The advantage is that if we have a branch which is small and frequently taken we don't incur any cost. e.g. "val x = ...; val y = if ... then 1 else f();" The register containing x has to be pushed before we call f but not before 1. If the then-branch is most frequently taken we don't want to incur extra cost by pushing x on that branch as well. There are two disadvantages of trying to reload registers. The first is that we may have to spill other registers as we do it and end up thrashing around trying to get the values into the correct registers. The other is that if we have to push the registers anyway we've incurred extra cost. The current approach is to move values to the stack. *) local fun mustPush s = case (pstackEntry(table, s), saveStateEntry(save, s)) of (StackEntry {ent = StackW _, ...}, StackEntry {ent = StackW _, ...}) => false (* both on stack *) | (StackEntry _, StackEntry {ent = StackW _, ...}) => true (* Saved value is on stack but current value isn't. *) | _ => false in (* Pushing one entry may result in others being pushed if they have a lower "destStack". *) val pushCode = pushRegisters(table, allRegisters, mustPush, false, false) end; (* Third pass: Load any entry which is in a register in the saved state and ensure that values in registers in the current state are moved into the same register as before. *) local (* Put the table entry in a specified register and make it a register entry. *) fun loadToReg (s, prefReg: reg option, tabEnt, tabCache: regSet, tabUses, tabDest, tabLife) = let (* First get the register to put the value in. *) val (dReg, getRegCode) = case prefReg of NONE => getAnyRegister table | SOME prefReg => if (case tabEnt of Register(reg, _) => reg = prefReg | _ => false) orelse inSet(prefReg, tabCache) (* Already there. *) then (addRegUse (table, prefReg); (prefReg, [])) (* Already there. *) else (prefReg, getRegister (table, prefReg)) (* Now load it. However, we have to be careful. We only call loadToReg if an entry was in a register or a "Direct". But in the process of getting the destination register we could have ended up pushing it onto the stack. This can happen if the destination register was in use. We always push unpushed entries with a lower "destStack" first so if the register we want was in an entry with a higher "destStack" and this entry has a lower "destStack" we could have pushed it. In that case we MUST leave it where it is and NOT overwrite it. (See Test145.ML) *) in case pstackEntry(table, s) of StackEntry {ent = StackW _, ...} => free regset dReg @ getRegCode | _ => let val loadCode = loadPstackEntry(table, s, dReg) (* loadPstackEntry will have decremented the use count and may have completely removed the entry. If it hasn't we need to remove it before we replace it with the loaded register. *) val freeCode = case (pstackEntry(table, s)) of NoStackEntry => [] | StackEntry _ => removeEntry(table, s, false) in setPstackEntry (table, s, StackEntry{ent=Register(dReg, 0), cache=noRegisters, uses=tabUses, destStack=tabDest, lifeTime=tabLife}); freeCode @ loadCode @ getRegCode end end (* val (dReg, dRegCode) = case prefReg of NONE => let val (reg, regCode) = getAnyRegister table in (reg, loadPstackEntry(table, s, reg) @ regCode) end | SOME prefReg => (* Put it in the preferred register. If it's already there we need to increment the use count because we will decrement it in "removeEntry". *) if (case tabEnt of Register(reg, _) => reg = prefReg | _ => false) orelse inSet(prefReg, tabCache) (* Already there. *) then (addRegUse (table, prefReg); (prefReg, [])) (* Already there. *) else let val getRegCode = getRegister (table, prefReg) in (prefReg, loadPstackEntry(table, s, prefReg) @ getRegCode) end (* loadPstackEntry will have decremented the use count and may have completely removed the entry. If it hasn't we need to remove it before we replace it with the loaded register. If we didn't call loadPstackEntry (because we already had the value in the correct register) we have to call removeEntry to decrement the register use count (we incremented it above) and so restore it to the original value. *) val freeCode = case (pstackEntry(table, s)) of NoStackEntry => [] | StackEntry _ => removeEntry(table, s, false); in setPstackEntry (table, s, StackEntry{ent=Register(dReg, 0), cache=noRegisters, uses=tabUses, destStack=tabDest, lifeTime=tabLife}); freeCode @ dRegCode end (* loadToReg *) *) fun loadEntries(s, others) = if s >= first then let val thisItem = case (pstackEntry(table, s), saveStateEntry(save, s)) of (StackEntry {ent = StackW _, ...}, _) => (* If it's in the stack we don't try reloading it. *) [] | (StackEntry {ent = tabEnt, cache, uses, destStack, lifeTime, ...}, StackEntry {ent = Register(savedReg, _), ...}) => loadToReg(s, SOME savedReg, tabEnt, cache, uses, destStack, lifeTime) | (StackEntry{ent = tabEnt as Direct{base = tabBase, offset = tabOffset}, cache = tabCache, uses, destStack, lifeTime, ...}, StackEntry{ent = Direct{base = saveBase, offset = saveOffset}, cache = savedCache, ...}) => ( if tabOffset <> saveOffset then raise InternalError "merge: mismatched offsets" else (); (* If the base registers are different (which might happen if the original reg was required) we need to load this entry. We will probably also need to do a reverse merge and load the corresponding entry in the saved state. *) if tabBase <> saveBase then let val prefReg = if regSetIntersect(savedCache, tabCache) <> noRegisters then SOME(oneOf(regSetIntersect(savedCache, tabCache))) else NONE (* No preference. *) in loadToReg (s, prefReg, tabEnt, tabCache, uses, destStack, lifeTime) end else [] ) | _ => [] in loadEntries(s - 1, thisItem @ others) end else others in val loadRegCode = loadEntries (! pstackptr - 1, []) end; (* Final pass: Check to see if we need to do a "reverse merge" i.e. operations that have to be done on the saved state before we can finally merge. Also flush mismatched items from the cache. *) local fun checkEntries s l = let val entry = case (pstackEntry(table, s), saveStateEntry(save, s)) of (StackEntry {uses = tabUses, cache = tabCache, ent = tabEnt, destStack = tabDest, lifeTime}, StackEntry {cache = saveCache, ent = saveEnt, ...}) => let fun flushCache () = let (* Remove all entries from the current cache that are not also in the saved cache. *) val keep = regSetIntersect(tabCache, saveCache) in setPstackEntry (table, s, StackEntry {ent=tabEnt, cache=keep, uses=tabUses, destStack=tabDest, lifeTime=lifeTime}); freeSet(regset, regSetMinus(tabCache, keep)) end in case tabEnt of Register(tabReg, _) => ( (* It's fine if the saved value was cached in that register. *) if inSet(tabReg, saveCache) then () else case saveEnt of Register(saveReg, _) => (* We should have moved these into the same register. It's possible it got moved again as a result of loading something else. *) if tabReg <> saveReg then needOtherWay := true else () | StackW _ => (* We should have pushed it in the second pass. *) raise InternalError "merge: unpushed entry" | _ => (* Maybe a Direct entry which has to be loaded in a reverse merge. *) needOtherWay := true; [] ) | Literal _ => ( case saveEnt of Literal _ => flushCache() | _ => raise InternalError "Literal mismatch" ) | CodeRef _ => ( case saveEnt of CodeRef _ => flushCache() | _ => raise InternalError "Coderef mismatch" ) | Direct {base = tabBase, ...} => ( (* As with register entries these should have been merged but might have diverged again. *) if saveCache = tabCache (* TODO: Should this be an intersection? *) then [] else case saveEnt of Direct{base=saveBase, ...} => if tabBase = saveBase then flushCache() (* Ok but must flush cache. *) else (needOtherWay := true; []) | _ => raise InternalError "merge: mismatched Direct" ) | StackW tabIndex => ( case saveEnt of StackW saveIndex => ( (* Consistency check. *) if tabIndex = saveIndex then () else raise InternalError "merge: mismatched stack entries"; flushCache() ) | _ => (* Need to push this in a reverse merge. *) (needOtherWay := true; []) ) | Container _ => ( case saveEnt of Container _ => [] | _ => raise InternalError "merge: mismatched Container" ) end | _ => [] in entry @ l end in val freeEntries2 = revfoldIndDownTo (checkEntries, [], ! pstackptr - 1, first) end; (* Last of all, try to align the stack. If the current stack pointer is greater than the saved value we must have live values on the stack and have to do a reverse merge. If the saved stack pointer was greater than the current but otherwise everything is fine we just push some dummy values rather than doing a reverse merge. I may change this later. *) val () = if realStackPtr save < ! realstackptr then needOtherWay := true else (); val alignCode = if ! needOtherWay then [] else let fun addAlign others = if realStackPtr save <= ! realstackptr then others else let val (pushIt, pushInstrs) = pushAnyEntryAtCurrentSP table in if pushIt then addAlign(pushInstrs @ others) else (* Push a register just to align the stack. It would be better to push a register that wasn't currently saved but this will do for the moment. *) ( realstackptr := ! realstackptr + 1; addAlign pushToReserveSpace @ pushInstrs @ others ) end in addAlign [] end val (result, resultCode) = (* Push any result. *) case currentResult of MergeIndex _ => (MergeIndex(pushReg (table, topReg)), activeRegister topReg) | NoMerge => (NoMerge, []) in if pstackTrace then printStack(table, "mergeState", []) else (); (!needOtherWay, result, resultCode @ alignCode @ freeEntries2 @ loadRegCode @ pushCode @ resetCode @ freeEntries1 @ freeEntries0 @ topRegCode) end (* Fix up a label after an unconditional branch. *) fun fixup (lab, table as Ttab { branched, exited, pstackptr, ...}) : operation list = if not (! branched) then raise InternalError "Not branched" else if isEmptyLabel lab then [] else let val (_, code) = setState (state lab, table, NoMerge, ! pstackptr, false, false) in branched := false; exited := false; code @ forwardJumpLabel(labs lab) end local (* Fix up a label. If this follows an unconditional branch we replace the existing state with the saved state, otherwise we have to merge in. *) fun mergeLab (lab, table as Ttab { branched, exited, ...}, currentResult: mergeResult, mark) = if isEmptyLabel lab then (currentResult, []) else if ! branched then let val (newResult, newCode) = setState (state lab, table, result lab, newMark mark, true, false) in branched := false; exited := false; (newResult, newCode @ forwardJumpLabel(labs lab)) end else let val (otherWay, mergeRes, mergeCode) = mergeState (state lab, result lab, table, currentResult, mark); in (* We can generate code before we fix up the label, but if we want to add code to the other arm we have to put in an unconditional branch and make the changes after it. *) if otherWay then let (* Have to jump round to get the states the same. *) val (lab1, lab1Code) = unconditionalBranch (mergeRes, table) val (newResult, newCode) = setState (state lab, table, result lab, newMark mark, true, false) val () = exited := false; val () = branched := false; val (mergeResult, otherMerge) = (* Merge the other way. *) mergeLab (lab1, table, newResult, mark) in (mergeResult, otherMerge @ newCode @ forwardJumpLabel(labs lab) @ lab1Code @ mergeCode) end else (mergeRes, forwardJumpLabel(labs lab) @ mergeCode) end in (* Fix up a label. If this follows an unconditional branch we replace the existing state with the saved state, otherwise we have to merge in. *) fun merge (lab, table, carry, mark) = let val resCode = mergeLab (lab, table, carry, mark); in (* Reset the marker even if we have not actually done any merging. *) unmarkStack(table, mark); resCode end; (* Fix up a list of labels, using the same stack mark *) fun mergeList (labs, table, carry, mark) = let fun mergeLabs (l, (carry, otherCode)) = let val (newCarry, code) = mergeLab (l, table, carry, mark) in (newCarry, code @ otherCode) end val resCode = List.foldl mergeLabs (carry, []) labs in unmarkStack(table, mark); resCode end; end; type handler = { lab: addrs ref, oldps: stackIndex }; (* Push the address of a handler. *) fun pushAddress (table as Ttab{pstackptr, ...}, offset) = let (* This is just after a mark. *) val (reg, regCode) = getAnyRegister table val oldps = ! pstackptr val labelRef = ref addrZero (* Load the address of the handler into a register. *) val loadCode = loadHandlerAddress{ handlerLab=labelRef, output=reg} val regEntry = pushReg(table, reg) (* Push it onto the stack at the specific offset. *) val (pushedEntry, pushCode) = pushValueToStack (table, regEntry, offset) in (pushedEntry, {lab = labelRef, oldps = oldps}, pushCode @ loadCode @ regCode) end (* Fixup the address at the start of a handler. *) fun fixupH ({lab, oldps}, oldsp, table as Ttab{branched, exited, pstackptr, realstackptr, ...}) = let val clear = clearCache table (* Don't know the registers here. *) in realstackptr := oldsp; exited := false; branched := false; (* Remove any entries above the old pstack pointer. If the expression whose exceptions we are handling contained static-link functions there may be entries whose use-counts have not gone to zero. *) startHandler{ handlerLab=lab} @ revfoldIndDownTo(fn s => fn l => removeEntry(table, s, false) @ l, [], ! pstackptr - 1, oldps) @ clear end (* Reload the handler "register" from an entry on the real stack. *) fun reloadHandler(table, hIndex) = let val (reg, entry, loadCode) = loadEntryToSet(table, hIndex, generalRegisters, false) val storeCode = storeToHandler reg val clear = incrUseCount (table, entry, ~1) val clearCode = removeOldItemsFromRealStack table in clearCode @ clear @ storeCode @ loadCode end (* Generate operations. Negotiates the arguments and results with the machine-specific code-generator. This module knows where the arguments are as a result of previous operations but the machine-dependent code-generator will have requirements depending on the available instructions e.g. some or all the arguments may have to be in registers. *) local (* We have to re-evaluate this after each action because we may have had to push values to the stack that were previously in registers. *) fun argsAsSources(table as Ttab{realstackptr, ...}, args) = let fun argAsSource entry = let val {ent = stackEntry, cache, ...} = pstackRealEntry(table, entry); val lastRef = lastReference table entry; in if cache <> noRegisters then ( (* This assumes that it is preferable to have the value in a register. That's generally true but can be wrong if we have pushed a floating point value to the stack, i.e. we've allocated a heap cell and stored the FP value into it then pushed the address of the cell. In that case we might actually want the heap cell address. ensureNoAllocation has to clear the cache to make sure we use the address. *) if lastRef then ActInRegisterSet{modifiable=cache, readable=cache} else ActInRegisterSet{modifiable=noRegisters, readable=cache} ) else case stackEntry of Register(reg, _) => if lastRef then ActInRegisterSet{modifiable=singleton reg, readable=singleton reg} else ActInRegisterSet{modifiable=noRegisters, readable=singleton reg} | Literal m => ActLiteralSource m | Direct{base, offset} => ActBaseOffset(base, offset) | StackW index => ActBaseOffset(regStackPtr, (! realstackptr - 1 - index) * wordSize) | Container{items, ...} => ( case pstackRealEntry(table, hd items) of {ent = StackW index, ...} => ActStackAddress((! realstackptr - index -1) * wordSize) | _ => raise InternalError "argAsSource: container entry is not on stack" ) | CodeRef code => ActCodeRefSource code end in List.map argAsSource args end fun performActions(start, finish, args, table as Ttab{pstackTrace, ...}) = let (* Process each action and then get the next action until we are finally finished. *) fun untilDone(ActionDone{outReg, operation}, args, loadOps, lockedRegs) = let (* Finished. Unlock the registers, push the result and return. *) (* If we have an output register increment its use-count first. *) val () = case outReg of SOME reg => lockRegister(table, reg) | NONE => () val result = finish outReg (* Set the result. *) val freeLock = List.foldl (fn(reg, l) => unlockRegister(table, reg) @ l) [] lockedRegs val freeEntries = List.foldl (fn(arg, l) => incrUseCount (table, arg, ~1) @ l) [] args val () = if pstackTrace then printStack(table, "performActions", operation @ loadOps) else () in (result, freeEntries @ freeLock @ operation @ loadOps) end | untilDone(ActionLockRegister{argNo=_, reg, willOverwrite, next}, args, loadOps, lockedRegs) = let (* Lock a register that's currently being used for an argument so that it won't be reused for a different argument. *) (* We only use ActionLockRegister if the entry has been detected as being in a register but this may be because the entry is a Register or a cache entry. *) val () = lockRegister (table, reg) val clear = if willOverwrite then removeRegistersFromCache(table, listToSet [reg]) else [] in untilDone(next(argsAsSources(table, args)), args, clear @ loadOps, reg :: lockedRegs) end | untilDone(ActionLoadArg{argNo, regSet, willOverwrite, next}, args, loadOps, lockedRegs) = let val arg = List.nth(args, argNo) val (_, regLoc, loadCode) = loadEntryToSet (table, arg, regSet, willOverwrite) (* Replace the argument by the location that refers to the register. *) val repArgs = List.take(args, argNo) @ [regLoc] @ List.drop(args, argNo+1) in untilDone(next(argsAsSources(table, repArgs)), repArgs, loadCode @ loadOps, lockedRegs) end | untilDone(ActionGetWorkReg{regSet, setReg}, args, loadOps, lockedRegs) = let val (reg, regCode) = getRegisterInSet(table, regSet) in untilDone(setReg reg (argsAsSources(table, args)), args, regCode @ loadOps, reg :: lockedRegs) end in untilDone(start (argsAsSources(table, args)), args, [], []) end in (* Data operations that return a result in a register. *) fun dataOp (args, instr, table, hint) = let (* Match up the result that the instruction has provided with what we need for the context. Generally these will match already but we have to consider the case where a result is being discarded or where we want the unit result from an assignment function. *) fun finalOp outReg = case (outReg, hint) of (NONE, NoResult) => noIndex | (NONE, _) => (* Want a unit result. *) pushConst (table, toMachineWord 0) | (SOME outReg, NoResult) => (* Discard *) (unlockRegister(table, outReg); noIndex) | (SOME outReg, _) => (* Want this result. *) pushReg (table, outReg) in performActions(negotiateArguments(instr, hint), finalOp, args, table) end (* Comparison and test operations that make a conditional branch. *) and compareAndBranch(args, test, table) : labels * operation list = let val (startActions, destLabel) = negotiateTestArguments test val ((), code) = performActions(startActions, fn _ => (), args, table) in (makeLabels(NoMerge, destLabel, saveState table), code) end (* Moves an expression into a newly created vector or into a container. The offset is the number of bytes if this a byte store and the number of words if this is word store. *) and moveToVec (vecEntry, valueEntry, offset: int, table) : operation list = let val freeCode1 = incrUseCount (table, vecEntry, 1) (* This must be kept. *) (* Turn this into an assignment operation. *) val arguments = [vecEntry, pushConst(table, toMachineWord offset), valueEntry] fun mapLiteral ent = case pstackRealEntry(table, ent) of {ent = Literal lit, ...} => SOME lit | _ => NONE in case checkAndReduce(instrStoreW, arguments, mapLiteral) of SOME(ins, args) => let (* Decrement the use counts for entries that we're not using. *) val freeCode2 = List.foldl(fn (a, l) => incrUseCount (table, a, 1) @ l) [] args val freeCode3 = List.foldl(fn (a, l) => incrUseCount (table, a, ~1) @ l) [] arguments in #2(dataOp(args, ins, table, NoResult)) @ freeCode3 @ freeCode2 @ freeCode1 end | NONE => raise InternalError "moveToVec: Not implemented" end end (* Tail recursive jump to a function. *) fun jumpToCode(codeAddr, isIndirect, transtable) = let val {ent, ...} = pstackRealEntry(transtable, codeAddr) val code = case ent of Literal lit => jumpToFunction(if isIndirect then ConstantClosure lit else ConstantCode lit) | CodeRef code => if isIndirect then raise InternalError "jumpToCode: indirect call to codeRef" else jumpToFunction(CodeFun code) | Register(reg, _) => (* Should only be the closure register and only in the indirect case. *) if isIndirect andalso reg = regClosure then jumpToFunction FullCall else raise InternalError "jumpToCode: Not indirection through closure reg" | _ => (* Anything else shouldn't happen. *) raise InternalError "jumpToCode: Not a constant or register"; in incrUseCount (transtable, codeAddr, ~1); code end; (* Call a function. *) fun callCode(codeAddr, isIndirect, transtable) = let val {ent, ...} = pstackRealEntry(transtable, codeAddr) val code = case ent of Literal lit => callFunction(if isIndirect then ConstantClosure lit else ConstantCode lit) | CodeRef code => if isIndirect then raise InternalError "callCode: indirect call to codeRef" else callFunction(CodeFun code) | Register(reg, _) => (* Should only be the closure register and only in the indirect case. *) if isIndirect andalso reg = regClosure then callFunction FullCall else raise InternalError "callCode: Not indirection through closure reg" | _ => (* Anything else shouldn't happen. *) raise InternalError "callCode: Not a constant or register"; in incrUseCount (transtable, codeAddr, ~1); code end; datatype argdest = ArgToRegister of reg | ArgToStack of int | ArgDiscard (* Get the destination for the argument of a loop instruction. This finds out where the argument was loaded at the start of the loop so that it can be put back there at the end. *) fun getLoopDestinations(indices, transtable) = let fun getLoopDest entry = if entry = noIndex then ArgDiscard else case pstackRealEntry(transtable, entry) of {ent = StackW index, ...} => ArgToStack index | {ent = Register(reg, _), ...} => ArgToRegister reg | _ => raise InternalError "getLoopDest: wrong entry type" (* Remove cache registers from loop variables. There was a bug where a loop variable was not being reloaded when the corresponding stack entry had been modified within the loop. *) fun removeCache(entry, ops) = if entry = noIndex then ops else clearCacheEntry(transtable, allRegisters, entry) @ ops in (map getLoopDest indices, List.foldl removeCache [] indices) end type loopPush = stackIndex (* Compare the saved state at the start of the loop with the current state at the point we're looping and see whether we need to modify the original state and reprocess the loop. We look for differences in the cache and values that have been pushed to the stack. *) fun compareLoopStates(table as Ttab{ pstackptr, ...}, state, argIndexes) = let fun processTables(entry, cacheSet, pushList: loopPush list) = if entry = ! pstackptr then (cacheSet, pushList) else if List.exists(fn e => entry = e) argIndexes then (* It's an argument. These can be modified in the loop. *) processTables(entry+1, cacheSet, pushList) else case (pstackEntry(table, entry), saveStateEntry(state, entry)) of (StackEntry{ent=tabEnt, cache=tabCache, ...}, StackEntry{ent=saveEnt, cache=saveCache, ...}) => let (* Add any registers that were cached before but aren't now. It's ok if we have loaded something in the loop and are currently caching it. *) val newCacheSet = regSetUnion(cacheSet, regSetMinus(saveCache, tabCache)) (* Put this on the push list if there are entries that were in registers or were direct entries and are now on the stack or in registers. TODO: If we just loaded an entry or moved it to a different register we might be able to put it in that register rather than having to push it to the stack. *) val newPushList = case (tabEnt, saveEnt) of (StackW _, Register _) => entry :: pushList | (StackW _, Direct _) => entry :: pushList | (Register _, Direct _) => entry :: pushList | (Register tabReg, Register saveReg) => (* Was moved to a different reg. *) if tabReg = saveReg then pushList else entry :: pushList | (StackW _, StackW _) => pushList | (Literal _, Literal _) => pushList | (CodeRef _, CodeRef _) => pushList | (Direct _, Direct _) => pushList | (Container _, Container _) => pushList | _ => raise InternalError "Funny entries" in processTables(entry+1, newCacheSet, newPushList) end | (NoStackEntry, StackEntry{cache, ...}) => ( (* We could have entries that started out being cached but which were subsquently cleared out. We add them here if only to indicate that we need to reprocess the loop. *) processTables(entry+1, regSetUnion(cacheSet, cache), pushList) ) | _ => processTables(entry+1, cacheSet, pushList) in processTables(first, noRegisters, []) end (* Restore the state if we're reprocessing a loop. *) fun restoreLoopState(table as Ttab{branched, exited, pstackptr, ...}, state, cacheSet, pushes: loopPush list) = let (* We're restoring the state to what it was before the loop and we don't generate the previous loop code so we can simply discard the "free" instructions here. *) val (_, _) = setState (state, table, NoMerge, ! pstackptr, false, true) (* Remove entries from the cache if they've been changed in the loop. *) val _ = removeFromCache(table, cacheSet, fn () => true); (* Push items to the stack that are pushed in the loop. Don't move them into other registers but allow them to be cached. *) val pushes = pushRegisters(table, allRegisters, fn e => List.exists(fn e' => e=e') pushes, false, false); val () = exited := false; val () = branched := false; in pushes end (* These are exported as read-only. *) fun maxstack(Ttab{maxstack=ref maxstackVal, ...}) = maxstackVal fun realstackptr(Ttab{realstackptr=ref realstackVal, ...}) = realstackVal fun haveExited(Ttab{exited=ref exitedVal, ...}) = exitedVal (* This is called when we have either made a tail-recursive call, returned from a function or raised an exception. *) fun exiting(Ttab{branched, exited, ...}) = ( branched := true; exited := true ) (* Put the arguments and closure/static link register onto the pseudo-stack. If the lifeTime is zero the parameter/closure is never used and we don't need to do anything. *) fun parameterInRegister(reg, lifeTime, transtable as Ttab{pstackTrace, printStream, ...}) = if lifeTime > 0 then let val code = getRegister (transtable, reg) (* Code is only generated if we have to save something to get the register and that shouldn't happen here. *) val () = case code of [] => () | _ => raise InternalError "registerArg: non-empty code" val addrInd = pushReg (transtable, reg) val () = setLifetime(transtable, addrInd, lifeTime) in if pstackTrace then ( printStream "parameterInRegister: locn="; printStream(Int.toString addrInd); printStream " lifeTime="; printStream(Int.toString lifeTime); printStream "\n" ) else (); addrInd end else noIndex (* Check that the only item on the stack after the block is the result. We could have removed items and replaced them with something else. We could have pushed values that were previously in registers. This is purely validation and could be removed. *) fun checkBlockResult(table as Ttab{pstackptr, marker, ...}, result) = let fun checkStack entry = if entry = ! pstackptr then () else ( case pstackEntry(table, entry) of NoStackEntry => () | StackEntry {uses = 0, ...} => () (* May be a cache entry. *) | StackEntry _ => if (case result of NoMerge => true | MergeIndex m => m <> entry) (* Comment out for the moment. Container entries from mutually recursive stack closures will never get their use counts zero so they and their stack entries will not be removed. *) then () (*print "checkBlockResult: Entry not removed\n"*) else (); checkStack(entry+1) ) in checkStack(!marker) end datatype constEntry = ConstLit of machineWord | ConstCode of code | NotConst fun isConstant(entry, table) = case pstackRealEntry(table, entry) of {ent = Literal l, ...} => ConstLit l | {ent = CodeRef c, ...} => ConstCode c | _ => NotConst fun isRegister(entry, table) = case pstackRealEntry(table, entry) of {ent = Register(reg, _), ...} => SOME reg | _ => NONE fun isContainer(entry, table) = case pstackRealEntry(table, entry) of {ent = Container _, ...} => true | _ => false (* Create a closure on the stack. There may be entries in the list which have not yet been set. *) fun createStackClosure(table, entries) = let (* If any entries are containers they need to be added to the dependencies. *) local fun depFold (index, (code, deps)) = if index = noIndex then (code, deps) else case pstackEntry(table, index) of StackEntry { ent = Container _, ...} => (incrUseCount(table, index, 1) @ code, index :: deps) | _ => (code, deps) in val (incCode, depends) = List.foldl depFold ([], []) entries end (* We must first make sure that the space we're going to allocate hasn't been reserved for a register. *) val alignCode = alignStack(table, [], NONE) (* There's a potential problem if some of the entries are base+offset. We need to load them into a register before we can push them but that may involve pushing a register to get a free one. Make sure there is at least one free register. *) val (aReg, getRegCode) = getAnyRegister table val freeCode = freeRegister(table, aReg) (* Push all entries. There may be entries that refer to other closures in the same mutually recursive set. Use a zero for these and fill them in later. *) fun pushEntry(index :: indices) = let (* Push the later entries first. *) val (pushEntries, pushTail) = pushEntry indices val sp = realstackptr table val indexOrDummy = if index = noIndex then (* Recursive entry. *) pushConst (table, toMachineWord 0) else index val (pushedEntry, pushThis) = pushValueToStack (table, indexOrDummy, sp + 1) in (pushedEntry :: pushEntries, pushThis @ pushTail) end | pushEntry [] = ([], []) val (fillEntries, fillCode) = pushEntry entries val container = pushPstack(table, Container{items=fillEntries, dependencies=depends}, "createStackClosure", fillCode) in (container, fillCode @ freeCode @ getRegCode @ alignCode @ incCode) end (* If we are creating mutually recursive closures on the stack we will have to complete the loop by updating earlier closures with the addresses of later ones. *) (* TODO: This effectively prevents the closures from ever being removed. If we have two mutually recursive closures then the use-count of neither will ever go to zero. *) fun setRecursiveClosureEntry(vecEntry, valueEntry, offset, table) = let (* This is a dependency of the container. *) val stackent = pstackEntry(table, vecEntry) (* Increment the use count so it's not thrown away in moveToVec but instead add it to the dependencies of the container. *) val incCode = incrUseCount(table, valueEntry, 1) val _ = case stackent of StackEntry{ ent = Container{items, dependencies}, uses, cache, destStack, lifeTime} => setPstackEntry(table, vecEntry, StackEntry{ ent=Container{items=items, dependencies = valueEntry:: dependencies}, uses=uses, cache=cache, destStack=destStack, lifeTime=lifeTime}) | _ => raise InternalError "setRecursiveClosureEntry: not container" in moveToVec(vecEntry, valueEntry, offset, table) @ incCode end structure Sharing = struct type code = code and negotiation = negotiation and reg = reg and negotiateTests = negotiateTests and addrs = addrs and operation = operation and machineWord = machineWord and ttab = ttab and savedState = savedState and regSet = regSet and stackIndex = stackIndex and stackMark = stackMark and labels = labels and handler = handler and regHint = regHint and argdest = argdest and loopPush = loopPush and forwardLabel = forwardLabel and backwardLabel = backwardLabel and constEntry = constEntry end end; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CODEGEN_TABLESIG.sml000066400000000000000000000152061265146633400244570ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2009, 2012-13 Derived from code Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CODEGEN_TABLESIG = sig type machineWord; type ttab; type code; type reg; (* Machine registers *) type negotiateTests type negotiation type addrs; type savedState; type regSet type operation type loopPush type forwardLabel type backwardLabel val ttabCreate: int * Universal.universal list -> ttab (* Register allocation *) val getRegister: ttab * reg -> operation list val getRegisterInSet: ttab * regSet -> reg * operation list val freeRegister: ttab * reg -> operation list val addRegUse: ttab * reg -> operation list val removeRegistersFromCache: ttab * regSet -> operation list (* Stack handling *) eqtype stackIndex val noIndex: stackIndex (* Push entries *) val pushReg: ttab * reg -> stackIndex; val pushStack: ttab * int -> stackIndex; val pushConst: ttab * machineWord -> stackIndex; val pushCodeRef: ttab * code -> stackIndex; val pushAllBut: ttab * ((stackIndex -> unit) -> unit) * regSet -> operation list val pushNonArguments: ttab * stackIndex list * regSet -> reg list * operation list val pushSpecificEntry: ttab * stackIndex -> operation list val incsp: ttab -> stackIndex; val decsp: ttab*int -> unit; val reserveStackSpace: ttab * int -> stackIndex * operation list (* Code entries *) val loadEntryToSet: ttab * stackIndex * regSet * bool -> reg * stackIndex * operation list val loadToSpecificReg: ttab * reg * stackIndex * bool -> stackIndex * operation list val lockRegister: ttab * reg -> unit val unlockRegister: ttab * reg -> operation list val loadIfArg: ttab * stackIndex -> stackIndex * operation list val indirect: int * stackIndex * ttab -> stackIndex * operation list val moveToVec: stackIndex * stackIndex * int * ttab -> operation list val ensureNoAllocation: ttab * stackIndex -> stackIndex * operation list val removeStackEntry: ttab*stackIndex -> operation list val resetButReload: ttab * int -> operation list val pushValueToStack: ttab * stackIndex * int -> stackIndex * operation list val storeInStack: ttab * stackIndex * int -> stackIndex * operation list val realstackptr: ttab -> int val maxstack: ttab -> int val parameterInRegister: reg * int * ttab -> stackIndex val incrUseCount: ttab * stackIndex * int -> operation list val setLifetime: ttab * stackIndex * int -> unit type stackMark; val markStack: ttab -> stackMark; val unmarkStack: ttab * stackMark -> unit type labels; val noJump: labels; val isEmptyLabel: labels -> bool datatype mergeResult = NoMerge | MergeIndex of stackIndex; val unconditionalBranch: mergeResult * ttab -> labels * operation list val makeLabels: mergeResult * forwardLabel * savedState -> labels val jumpBack: backwardLabel * ttab -> operation list val fixup: labels * ttab -> operation list val merge: labels * ttab * mergeResult * stackMark -> mergeResult * operation list val mergeList: labels list * ttab * mergeResult * stackMark -> mergeResult * operation list type handler; val pushAddress: ttab * int -> stackIndex * handler * operation list val fixupH: handler * int * ttab -> operation list val reloadHandler: ttab * stackIndex -> operation list val exiting: ttab -> unit; val haveExited: ttab -> bool type regHint val dataOp: stackIndex list * negotiation * ttab * regHint -> stackIndex * operation list val compareAndBranch: stackIndex list * negotiateTests * ttab -> labels * operation list val saveState : ttab -> savedState val compareLoopStates: ttab * savedState * stackIndex list -> regSet * loopPush list val restoreLoopState: ttab * savedState * regSet * loopPush list -> operation list (* Temporary checking that the stack has been emptied. *) val checkBlockResult: ttab * mergeResult -> unit val chooseRegister : ttab -> reg option val getRegisterSetForFunction: machineWord -> regSet val getRegisterSetForCode: code -> regSet val getFunctionRegSet: stackIndex * ttab -> regSet val addModifiedRegSet: ttab * regSet -> unit val getModifedRegSet: ttab -> regSet datatype argdest = ArgToRegister of reg | ArgToStack of int | ArgDiscard val getLoopDestinations: stackIndex list * ttab -> argdest list * operation list val callCode: stackIndex * bool * ttab -> operation list val jumpToCode: stackIndex * bool * ttab -> operation list (* Get constants or code refs, which are really constants. *) datatype constEntry = ConstLit of machineWord | ConstCode of code | NotConst val isConstant: stackIndex * ttab -> constEntry val isRegister: stackIndex * ttab -> reg option val isContainer: stackIndex * ttab -> bool val createStackClosure: ttab * stackIndex list -> stackIndex * operation list val setRecursiveClosureEntry: stackIndex * stackIndex * int * ttab -> operation list structure Sharing: sig type code = code and negotiation = negotiation and reg = reg and negotiateTests = negotiateTests and addrs = addrs and operation = operation and machineWord = machineWord and ttab = ttab and savedState = savedState and regSet = regSet and stackIndex = stackIndex and stackMark = stackMark and labels = labels and handler = handler and regHint = regHint and argdest = argdest and loopPush = loopPush and forwardLabel = forwardLabel and backwardLabel = backwardLabel and constEntry = constEntry end end; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CODE_ARRAY.ML000066400000000000000000000207741265146633400233340ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Code vector operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This module constructs and operates on segments for machine code. "csegMake" constructs and returns a segment of the specified size with give flag codes. The segment can be read and written a byte at a time using the "csegGet" procedure, and the code can be entered using "csegCall" (this is only used if the code is an "early" procedure which must be called by the compiler or is a declaration or expression at the outer level. More usually "csegAddr" is used to return the address of the segment which is then compiled into another procedure as a constant. When a procedure has been compiled "csegLock" is called to remove the "mutable" bit. The segment then becomes a constant and cannot be changed. It is used in two ways. Initially the code is assembled into a segment which expands as necessary so that there is always room for the code. When the code has been completely assembled and we know how much there is, it is copied into a segment of the correct size. *) structure CODE_ARRAY : sig type machineWord type address type cseg val csegMake: word -> cseg val csegConvertToCode: cseg -> unit val csegLock: cseg -> unit val csegGet: cseg * word -> Word8.word val csegSet: cseg * word * Word8.word -> unit val csegGetWord: cseg * word -> machineWord val csegPutWord: cseg * word * machineWord -> unit val csegCopySeg: cseg * cseg * word * word -> unit val csegAddr: cseg -> address val csegPutConstant: cseg * word * machineWord * 'a -> unit end = struct open Address open Misc datatype csegStatus = Bytes | UnlockedCode | LockedCode type cseg = (csegStatus * address) ref val objLength: address -> word = length val expansionFactor = 0w3 (* Factor by which to increase size of segment *) val F_mutable_bytes = Word8.orb (F_mutable, F_bytes) val F_mutable_code = Word8.orb (F_mutable, F_code) val wordSize = Word.fromInt Address.wordSize fun csegMake (size : word) : cseg = let val vec : address = alloc (size, F_mutable_bytes, toMachineWord 0) in ref (Bytes, vec) end fun csegConvertToCode (r as ref (Bytes, addr)) : unit = let val () = setFlags (addr, F_mutable_code) in r := (UnlockedCode, addr) end | csegConvertToCode _ = raise InternalError "csegConvertToCode: not a byte segment" fun csegLock (r as ref (UnlockedCode, addr)) : unit = let val () = setFlags (addr, F_code) in r := (LockedCode, addr) end | csegLock _ = raise InternalError "csegConvertToCode: not an unlocked code segment" fun csegAddr (ref (status, addr)) : address = if status = Bytes then raise InternalError "csegAddr: not a code segment" else addr (* Copy a segment. This can only be called while the code is being constructed when it consists only of bytes. Constants are not added to the vector at this stage. *) fun csegCopySeg (ref (Bytes, fromAddr), ref (Bytes, toAddr), lengthBytes : word, offsetWords : word) = let val fromLengthWords : word = objLength fromAddr val toLengthWords : word = objLength toAddr val fromLengthBytes : word = wordSize * fromLengthWords val toLengthBytes : word = wordSize * toLengthWords val offsetBytes : word = wordSize * offsetWords val System_move_bytes: address*word*address*word*word->unit = RunCall.run_call5 RuntimeCalls.POLY_SYS_move_bytes val maxOffsetBytes = toLengthBytes - lengthBytes in (* Check the lengths are in the range. *) if fromLengthBytes < lengthBytes orelse maxOffsetBytes < offsetBytes then raise Subscript else System_move_bytes(fromAddr, 0w0, toAddr, offsetBytes, lengthBytes) end | csegCopySeg _ = raise InternalError "csegCopySeg: can only copy between byte segements" (* Returns a value from the vector. *) fun csegGet (ref (_, addr), byteIndex : word) : Word8.word = let val lengthWords = objLength addr val lengthBytes = wordSize * lengthWords in if byteIndex < lengthBytes then loadByte (addr, byteIndex) else raise Subscript end fun csegSet (ref (LockedCode, _), _, _) : unit = raise InternalError "csegSet: can't change locked code segement" | csegSet (r as (ref (status, addr)), byteIndex, value:Word8.word) : unit = let val lengthWords = objLength addr val lengthBytes = wordSize * lengthWords in if byteIndex < lengthBytes then assignByte (addr, byteIndex, value) else if status <> Bytes then raise InternalError "csegSet: can't extend code segment" else let (* length <= byteIndex; construct a new segment*) val oldSize = lengthWords (* size in words *) val expSize = expansionFactor * oldSize val wordIndex = byteIndex div wordSize val minSize = wordIndex + 0w1 val newSize = Word.max(expSize, minSize) (* create temporary codeseg (with larger byte-vector) *) val newVec = alloc (newSize, F_mutable_bytes, toMachineWord 0w0) val newSeg = (Bytes, newVec) in (* copy the old code into the new codeseg *) csegCopySeg (r, ref newSeg, lengthBytes, 0w0); (* assign the byte to the new codeseg's byte-vector *) assignByte (newVec, byteIndex, value); (* update the old segment to point at the new byte-vector *) r := newSeg end end (* Puts in a word at a given word offset. Does not expand the segment. *) fun csegPutWord (ref (UnlockedCode, addr), wordIndex, value:machineWord) : unit = let val lengthWords = objLength addr in if lengthWords <= wordIndex then raise Subscript else assignWord (addr, wordIndex, value) end | csegPutWord _ = raise InternalError "csegPutWord: not an unlocked code segment" (* Gets a word at a given word offset. Does not expand the segment. *) fun csegGetWord (ref (status, addr), wordIndex) : machineWord = let val lengthWords = objLength addr in if status = Bytes then raise InternalError "csegGetWord: can't load a a word from a byte segment" else if lengthWords <= wordIndex then raise Subscript else loadWord (addr, wordIndex) end (* csegPutConstant: store a constant into the code. Exactly how this is done is architecture dependent: on the i386 it's simply a store, on other architectures the constant may have to be split between instructions. This means that it has to be done by the RTS so as to be certain that we don't have a garbage collection with an invalid address. DCJM 2/1/01. *) fun csegPutConstant (ref (UnlockedCode, addr), byteIndex, value:machineWord, data: 'a) : unit = let val lengthWords = objLength addr val lengthBytes = wordSize * lengthWords in if lengthBytes <= byteIndex then raise Subscript else RunCall.run_call4 RuntimeCalls.POLY_SYS_set_code_constant (addr, byteIndex, value, data) end | csegPutConstant _ = raise InternalError "csegPutConstant: not an unlocked code segment" end; (* CODE_SEG *) polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CodeCons.i386.ML000066400000000000000000000023021265146633400240340ustar00rootroot00000000000000(* Copyright (c) 2000-10 David C.J. Matthews and Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure X86OutputCode = X86OUTPUTCODE( structure DEBUG = Debug structure PRETTY = Pretty ); structure X86Optimise = X86OPTIMISE( structure X86CODE = X86OutputCode ); structure CodeCons = X86LOWLEVEL( structure X86CODE = X86OutputCode structure X86OPTIMISE = X86Optimise ); polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CodeCons.x86_64.ML000066400000000000000000000022001265146633400242760ustar00rootroot00000000000000(* Copyright (c) 2006 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure X86OutputCode = X86OUTPUTCODE( structure DEBUG = Debug structure PRETTY = Pretty ); structure X86Optimise = X86OPTIMISE( structure X86CODE = X86OutputCode ); structure CodeCons = X86LOWLEVEL( structure X86CODE = X86OutputCode structure X86OPTIMISE = X86Optimise ); polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/CodeGenTable.ML000066400000000000000000000020411265146633400241230ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CodeGenTable = CODEGEN_TABLE ( structure CODECONS = CodeCons structure DEBUG = Debug structure MISC = Misc structure PRETTY = Pretty ) polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/GENERATE_CODE.ML000066400000000000000000003730021265146633400236430ustar00rootroot00000000000000(* Copyright David C. J. Matthews 1991, 2009-10, 2012, 2013, 2015 Title: General purpose code generator. Author: Dave Matthews, Edinburgh University / Prolingua Ltd. Copyright D.C.J. Matthews 1991 Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor GENERATE_CODE ( structure CODECONS : CODECONSSIG structure CODEGEN_TABLE : CODEGEN_TABLESIG where type machineWord = Address.machineWord structure BACKENDTREE: BackendIntermediateCodeSig structure DEBUG: DEBUGSIG sharing CODECONS.Sharing = CODEGEN_TABLE.Sharing = BACKENDTREE.Sharing ) : (*****************************************************************************) (* GCODE export signature *) (*****************************************************************************) sig type backendIC type machineWord val gencode: backendIC * Universal.universal list * int -> (unit -> machineWord) * Universal.universal list structure Sharing: sig type backendIC = backendIC end end = (*****************************************************************************) (* GCODE functor body *) (*****************************************************************************) struct open CODECONS; open CODEGEN_TABLE; open Address; open Misc; (* after address, so we get Misc.length, not Address.length *) open RuntimeCalls; (* for POLY_SYS numbers *) open BACKENDTREE; open RegSet val F_mutable_words = Word8.orb (F_mutable, F_words); val objLength = Address.length; infix 7 regEq regNeq; (*************************** end of copied code *****************************) (* gets a value from the run-time system; usually this is a closure, but sometimes it's an int. *) val ioOp : int -> machineWord = RunCall.run_call1 POLY_SYS_io_operation; val word0 = toMachineWord 0; val word1 = toMachineWord 1; val DummyValue : machineWord = word0; (* used as result of "raise e" etc. *) val False : machineWord = word0; (* false *) val True : machineWord = word1; (* true *) val Zero : machineWord = word0; (* 0 *) val constntTrue = BICConstnt(True, []) val constntFalse = BICConstnt(False, []) val constntZero = BICConstnt(Zero, []) fun isNoResult NoResult = true | isNoResult _ = false; (* Are we at the end of the function. *) datatype tail = EndOfProc of reg | NotEnd fun isEndOfProc (EndOfProc _) = true | isEndOfProc _ = false; fun chooseMergeRegister(_, EndOfProc res) = UseReg(singleton res) | chooseMergeRegister(NoHint, _) = UseReg generalRegisters | chooseMergeRegister(whereto, _) = whereto fun codeToCgType GeneralType = ArgGeneral | codeToCgType FloatingPtType = ArgFP fun createProfileObject _ (*functionName*) = let (* The profile object is a single mutable with the F_bytes bit set. *) open Address val profileObject = alloc(0w1, Word8.orb(F_mutable, F_bytes), toMachineWord 0w0); in toMachineWord profileObject end (* Code generate a function or global declaration *) fun codegen (pt : backendIC, declOnPrevLevel : bicLoadForm * (unit -> stackIndex * operations) * ttab -> stackIndex * operations, closureLifetime : int, argTypes : argumentType list, argLifetimes : int list, resultType : argumentType, localCount : int, profileObject : machineWord, debugSwitches : Universal.universal list) : operations * int * regSet * bool = let val cvec: operations ref = ref [] val callsAFunction = ref false fun codeGenerate(ops: operations, cvec) = cvec := ops @ ! cvec (* make the translation table *) val transtable = ttabCreate(localCount, debugSwitches) (* Map from declaration location to pstack entry. *) val decToPstack = Array.array (localCount, noIndex) (* If this is set to one add the allocating function to each tuple. *) val addAllocatingFunction = DEBUG.getParameter DEBUG.profileAllocationTag debugSwitches = 1 fun localDeclaration(index, locn, lifeTime) = ( Array.update (decToPstack, locn, index); (* If the lifetime is zero remove the item. *) if lifeTime = 0 then incrUseCount (transtable, index, ~1) else (setLifetime(transtable, index, lifeTime); []) ) (* Header code for function. *) (* Push the return address - may have multiple references because we may exit at any of the "tails". *) val returnAddress = incsp transtable (* If discardClosure is true, all uses of the closure are directly-recursive calls which will be handled as "Recursive". This doesn't require the function closure as a parameter. SPF 22/5/95 Unfortunately, this is not quite true - we can still embed the function in a datatype, so we still require access to the closure. However, this is handled by storing the closure in the constants section (it *is* a constant) if we have any such uses of it. SPF 30/5/95 Note that it's important for correctness that we load "embedded" uses of an empty closure from the constants section. If we tried to be clever and use the value that we find in closureReg at function entry, we would generate bad code. That's because functions with empty closures may get called using the PureCode calling convention, which doesn't actually initialise closureReg. Note also that it's the *calls* to codegen that have to be right, since the function that loads the closure is actually a parameter to codegen. SPF 2/1/97 *) val closureOrSlAddr = parameterInRegister(regClosure, closureLifetime, transtable) val () = codeGenerate(activeRegister regClosure, cvec) (* Find out which arguments are in which registers. *) val argLocations = argRegs (List.map codeToCgType argTypes) val numberOfArgsOnStack = List.length(List.filter(not o isSome) argLocations) (* Create a vector the actual argument locations. Those in registers are marked as entries on the pstack. The values may be pushed to the real stack or moved to other registers but this will keep track of them. Those on the stack are represented by negative values. *) datatype argLocation = ArgInReg of stackIndex | ArgOnStack of int local fun mapArgs ([], []) = ([], 0) | mapArgs(SOME reg :: l, life:: lives) = let val (l', n) = mapArgs(l, lives) val () = codeGenerate(activeRegister reg, cvec) in (ArgInReg(parameterInRegister (reg, life, transtable)) :: l', n) end | mapArgs(NONE :: l, _::lives) = let val (l', n) = mapArgs(l, lives) in (ArgOnStack(n-1) :: l', n-1) end | mapArgs _ = raise InternalError "Mismatched argument types/lifetimes" val (args, _) = mapArgs(argLocations, argLifetimes) in val argRegTab = Vector.fromList args end fun exit () = let val stackArgs = List.length(List.filter(not o isSome) argLocations) val exitCode = (* Reset to just above the return address. *) returnFromFunction stackArgs @ resetStack (realstackptr transtable - 1) in exiting transtable; exitCode end (* Allocate a segment of the required size. *) fun callgetvec (csize, flag, whereto, transtable) : stackIndex * operations = let (* Get a register for the result. *) val (resultReg, regCode) = getRegisterInSet(transtable, case whereto of UseReg rr => rr | _ => generalRegisters) val resAddr = pushReg (transtable, resultReg) in if addAllocatingFunction then let val moveCode = moveToVec (resAddr, pushConst(transtable, profileObject), csize, transtable) in (resAddr, moveCode @ allocStore {size=csize+1, flags=Word8.orb(flag, F_profile), output=resultReg} @ regCode) end else (resAddr, allocStore {size=csize, flags=flag, output=resultReg} @ regCode) end; (*infix 9 sub;*) (* Loads a local, argument or closure value; translating local stack addresses to real stack offsets. N.B. In the case of non-local variables lastRef is true only for the last non-local variable, not the last use of this particular variable. *) fun locaddr (BICLoadArgument addr, lastRef) = ( (* The arguments are numbered from -n upto -1. The first few arguments are in registers and the rest on the stack. *) case Vector.sub(argRegTab, addr) of ArgInReg regEntry => ( (* If this is NOT the last reference we need to increment the use count on the entry. *) if lastRef then () else (incrUseCount(transtable, regEntry, 1); ()); (regEntry, []) ) | ArgOnStack actualAddr => (pushStack (transtable, actualAddr), []) ) | locaddr (BICLoadLocal addr, lastRef) = (* reference to entry on the pstack. *) let val resIndex = Array.sub(decToPstack, addr) val freeCode = if lastRef then [] (* Last reference. When we've finished with this entry it will be discarded. *) else (* There's at least one more reference after this. *) incrUseCount(transtable, resIndex, 1) in (resIndex, freeCode) end | locaddr(closureOrRecursive, lastRef) = (* cp relative *) let (* If this is the last reference to the closure we want it to be removed afterwards. makeSl is not always called if, for example, the value is constant. To ensure the use-count is correct we increment it if it is used and then decrement it afterwards. DCJM 2/12/99. *) val (dec, code) = declOnPrevLevel(closureOrRecursive, fn () => (incrUseCount(transtable, closureOrSlAddr, 1); (closureOrSlAddr, [])), transtable) val freeCode = if lastRef andalso closureLifetime <> 0 then incrUseCount(transtable, closureOrSlAddr, ~1) else [] in (dec, freeCode @ code) end (* locaddr *); (* For each load of a local in the tree it calls the `add' function. *) fun identifyLoads expList add = let (* Need to identify declarations within the current block. This was originally there because declaration addresses could at one time be reused. That shouldn't happen now. *) val newDecs : bool StretchArray.stretchArray = StretchArray.stretchArray (4, false) fun loads pt = case pt of BICExtract (BICLoadArgument locn, lastRef) => ( case Vector.sub(argRegTab, locn) of ArgInReg regEntry => if lastRef then add regEntry else () | _ => () ) | BICExtract (BICLoadLocal locn, lastRef) => if not (StretchArray.sub (newDecs,locn)) andalso lastRef (* Ignore new declarations. *) then add (Array.sub(decToPstack, locn)) else () (* If discardClosure is true, then we've already zeroed the use-count for closureOrSlAddr, so don't adjust it now. SPF 22/5/95 *) | BICExtract (BICLoadClosure _, lastRef) => if closureLifetime <> 0 (* Non-local *) andalso lastRef then add closureOrSlAddr (* Reference to the closure. *) else () | BICEval {function, argList, ...} => ( loads function; List.app (fn (l, _) => loads l) argList ) | BICField {base, ...} => loads base | BICNewenv(decs, exp) => let fun loadDecs(BICDeclar {addr, value, ...}) = ( (* Indicate that this is a new declaration. *) StretchArray.update (newDecs, addr, true); loads value (* Check the expression. *) ) | loadDecs(BICRecDecs decs) = ( (* First process the declarations to ensure that new declarations are marked as such then process the values being declared. *) List.app( fn {addr, ...} => StretchArray.update (newDecs, addr, true)) decs; List.app (fn{lambda, ...} => loads (BICLambda lambda)) decs ) | loadDecs(BICNullBinding c) = loads c in List.app loadDecs decs; loads exp end | BICTuple vl => List.app loads vl | BICBeginLoop{loop, arguments, ...} => let fun declArg({addr, value, ...}, _) = ( (* Indicate that this is a new declaration. *) StretchArray.update (newDecs, addr, true); loads value (* Check the expression. *) ) in List.app declArg arguments; loads loop end | BICLoop argList => List.app (fn (l, _) => loads l) argList | BICHandle{exp, handler} => (loads exp; loads handler) | _ => () in List.app loads expList end (* code-generates code from the tree *) (* SPF 2/5/95 - primBoolOps added to prevent loop when trying to inline unsupported boolean primitives. We might get the calling sequence: genEval -> genCond -> genTest -> genOtherTests -> gencde -> genEval where both versions of genEval are for the same (unsupported) boolean comparison. If this occurs, the second call will have primBoolOps set to false, and will generate a call to the RTS. Note that "whereto" is only a HINT. There is no guarantee that specifying "UseReg r" will actually get the value loaded into that register. For example, the code that handles constants completely ignores this hint. SPF 15/8/96 *) fun gencde (pt, primBoolOps, whereto, tailKind, loopAddr) : mergeResult = let val needsResult : bool = not (isNoResult whereto) val result : mergeResult = case pt of BICEval {function, argList, resultType, ...} => genEval (function, argList, resultType, primBoolOps, whereto, tailKind) | BICExtract ext => let val (loc, locCode) = locaddr ext val () = codeGenerate(locCode, cvec) in if needsResult then MergeIndex loc else (* If the result is not required discard it. This is used to remove variables which are not used on this path. *) ( codeGenerate(removeStackEntry(transtable, loc), cvec); NoMerge ) end | BICField {base, offset} => let val baseCode = genToStack (base) val (index, indCode) = indirect (offset, baseCode, transtable) val () = codeGenerate(indCode, cvec) in (* Get the value to be indirected on. *) MergeIndex index end | BICLambda lam => MergeIndex(genProc (lam, fn _ => (), whereto)) | BICConstnt(w, _) => MergeIndex(pushConst (transtable, w)) | BICCond (testPart, thenPart, elsePart) => genCond (testPart, thenPart, elsePart, whereto, tailKind, loopAddr) | BICNewenv(decs, exp) => let (* Processes a list of entries. *) val startMark = markStack transtable (* We may have the situation where we want the result in a specific register but we actually have a Decl entry followed by an BICExtract. Don't do this unless we've asked for a specific register. *) val specificLoc = case (exp, whereto) of (BICExtract(BICLoadLocal addr, _), UseReg _) => SOME(addr, whereto) | _ => NONE val () = List.app (codeBinding specificLoc) decs val resultPosn = gencde (exp, true, whereto, tailKind, loopAddr) val () = checkBlockResult(transtable, resultPosn) val () = unmarkStack(transtable, startMark) in resultPosn end | BICBeginLoop{loop=body, arguments=args} => let (* Execute the body which will contain at least one Loop instruction. There will also be path(s) which don't contain Loops and these will drop through. *) (* Load the arguments. We put them into registers at this stage to ensure that constants and "direct" entries are loaded. They may go onto the stack, which is fine. It could be worth doing this in two passes, the first simply evaluating the arguments onto the pstack, the second loading them into registers since that would generate better code when some arguments are constants but others are expressions that push those constants onto the stack. *) fun genLoopArg ({addr, value, references}, argType) = let (* This is almost the same as a normal declaration except that we have to make sure that we use a new location, stack or register, since we're going to be changing the contents of this location. The easiest way to do that is to load it into a register. We could do better if we are loading the last reference to the initial value in which case we could reuse its location. *) val index = genToStack(value) (* Put this in a floating point register if it is a floating point value otherwise a fixed point register. *) val prefSet = case argType of GeneralType => RegSet.generalRegisters | FloatingPtType => RegSet.floatingPtRegisters val (_, decl, decCode) = loadEntryToSet(transtable, index, prefSet, true) val () = codeGenerate(decCode, cvec) (* It should not be a non-heap function - just check. *) val _ = case value of BICLambda {heapClosure = false, ...} => raise InternalError "LoopArg: static link function" | _ => () in localDeclaration (decl, addr, references); (* Normally "references" will be non-zero but it does seem that we can get loop variables that are never used. This may happen as a result of multiple levels of inline function expansion. If it's zero we won't have a location for the loop argument. *) if references = 0 then noIndex else decl end val argIndexList = map genLoopArg args; (* We need to ensure that the state we return to after the loop is the same as it was at the start. If we find inside the loop that we need to spill values from registers that were declared outside we need to move those spills to before the loop. We first process the loop optimistically and then reprocess it we find we've had to spill. *) fun reprocessLoop n = let (* Include a check that we don't loop too many times. *) val _ = n > 20 andalso raise InternalError "reprocessLoop" (* Record the code at the start. If we have to reprocess we discard everything after this. *) val codeAtStart = !cvec val initialState = saveState transtable (* Now we have loaded the registers we can find out the destinations i.e. the register or stack location they were in at the start of the loop. We have to do this after we've loaded all the arguments because we may have pushed some onto the stack as we loaded the later ones. That's fine so long as when we loop we put the new values in the same place. *) val (argDestList, clearOps) = getLoopDestinations(argIndexList, transtable) val () = codeGenerate(clearOps, cvec) (* Start of loop. This is where we jump to if the loop is taken. *) val (startLoopCode, startLoop) = backJumpLabel() val () = codeGenerate(startLoopCode, cvec) val startSp = realstackptr transtable val cacheSet = ref noRegisters and pushList = ref [] fun onLoop () = (* This function is called whenever we loop. The state here is the state at the point we take the loop. We need to record the state at each of those points to produce a composite. *) let val (caches, pushes) = compareLoopStates(transtable, initialState, argIndexList) val () = cacheSet := regSetUnion(caches, !cacheSet) and () = pushList := pushes @ !pushList in (* We have to make sure that the real stack pointer is consistent. We may have pushed local values within the loop and these need to be removed. *) codeGenerate(resetStack (realstackptr transtable - startSp), cvec) end (* Compile the loop with the jumps back to the start. *) val runLoop = gencde (body, true, whereto, tailKind, SOME(startLoop, onLoop, argDestList)) (* The state we have here is the state when we haven't taken the loop. *) in if ! cacheSet = noRegisters andalso null (! pushList) then runLoop else ( cvec := codeAtStart; codeGenerate(restoreLoopState(transtable, initialState, ! cacheSet, ! pushList), cvec); reprocessLoop(n+1) ) end in reprocessLoop 0 end | BICLoop argList => let val (startLoop, onLoop, argDestList) = case loopAddr of SOME l => l | NONE => raise InternalError "No BeginLoop for Loop instr" (* Evaluate the arguments. Try to put them in the destination register if we can. It doesn't matter at this stage too much. *) fun evalArg((arg, _), dest) = let val whereto = case dest of ArgToRegister reg => UseReg (singleton reg) | ArgToStack _ => NoHint | ArgDiscard => NoHint val res = gencde (arg, true, whereto, NotEnd, NONE) in case res of MergeIndex index => index | NoMerge => raise InternalError "evalArg: no result" end val argsOnPstack : stackIndex list = ListPair.map evalArg (argList, argDestList) fun moveArgs([], []) = [] | moveArgs(arg :: args, ArgToRegister reg :: dests) = let (* Do it in reverse order so that we can delay locking the register arguments. *) val argEntries = moveArgs(args, dests) val (argEntry, argCode) = loadToSpecificReg (transtable, reg, arg, false) val () = codeGenerate(argCode, cvec) in lockRegister(transtable, reg); argEntry :: argEntries end | moveArgs(arg :: args, ArgToStack offset :: dests) = let val (argEntry, code) = storeInStack(transtable, arg, offset) in codeGenerate(code, cvec); argEntry :: moveArgs(args, dests) end | moveArgs(arg :: args, ArgDiscard :: dests) = (* If we're just discarding it return the location so we will remove it from the stack. *) arg :: moveArgs(args, dests) | moveArgs _ = raise InternalError "moveArgs: Mismatched arguments" (* the arguments are now all in their rightful places. *) val argEntries = moveArgs(argsOnPstack, argDestList); in (* Remove the entries and unlock the registers. It may be unnecessary to remove the entries because we're about to fix up a jump but there's no harm in it. *) List.app ( fn (ArgToRegister reg) => codeGenerate(unlockRegister(transtable, reg), cvec) | _ => ()) argDestList; List.app (fn index => codeGenerate(removeStackEntry(transtable, index), cvec)) argEntries; onLoop(); (* Repeat. *) codeGenerate(jumpBack (startLoop, transtable), cvec); (* Put on a dummy result. *) if needsResult then MergeIndex(pushConst (transtable, DummyValue)) else NoMerge (* Unused. *) end | BICRaise exp => let (* movl ,resultReg; jmp raisex *) val () = (* Ensure the return address is on the stack in case we are tracing exceptions. *) codeGenerate(pushSpecificEntry (transtable, returnAddress), cvec); val excVal = genToStack (exp); val (resultIndex, resultCode) = loadToSpecificReg (transtable, resultReg ArgGeneral, excVal, true); in codeGenerate(raiseException @ resultCode, cvec); codeGenerate(removeStackEntry(transtable, resultIndex), cvec); exiting transtable; (* Nothing further *) (* Put a dummy value on the stack so that subsequent merge code works It really ought to ignore this since we've exited. *) if needsResult then MergeIndex(pushConst (transtable, DummyValue)) else NoMerge (* Unused. *) end | BICHandle {exp, handler} => let (* Push all regs - we don't know what the state will be when we reach the handler. *) (* i.e. Push all registers except those whose last use occurs in the expression we're handling. *) val () = codeGenerate(pushAllBut (transtable, identifyLoads[exp], allRegisters), cvec); (* It's not clear what registers will be modified as a result of raising and handling an exception. Many functions may result in exceptions being raised and rather than add the registers to the register set of those functions it's probably better to include them in the modification set here. DCJM 26/11/00. *) val _ = addModifiedRegSet(transtable, allRegisters); (* This is the real stack state at the start of the handler *) val startOfHandler = realstackptr transtable; (* Remember this pseudo-stack position for later merge *) val mark = markStack transtable (* Save old handler - push regHandler *) val () = codeGenerate(pushCurrentHandler, cvec) val oldIndex = incsp transtable (* Now it's on the real stack we can remove it from the pstack. *) local (* Push address of new handler. *) val rsp = realstackptr transtable val (handlerEntry, handlerLab, handlerCode) = pushAddress (transtable, rsp + 1) val () = codeGenerate(handlerCode, cvec) (* Set the current handler to the stack pointer after these items. *) val () = codeGenerate(storeToHandler regStackPtr, cvec) in val handlerLab = handlerLab and handlerEntry = handlerEntry end val whereto = chooseMergeRegister(whereto, tailKind) (* Code generate body, putting the result in result register. *) (* "NotEnd" because we have to come back to remove the handler. *) val bodyResult = genToRegister (exp, whereto, NotEnd, loopAddr); (* Reload the old value of regHandler i.e. remove handler. *) (* Remove the handler entries. *) val () = codeGenerate(removeStackEntry(transtable, handlerEntry), cvec) val () = codeGenerate(reloadHandler(transtable, oldIndex), cvec) (* Optimisation: return immediately, if possible, rather than jumping and then returning. This may turn the following unconditional branch into dead code, in which case it will be removed by the lower-level code generator. *) val () = if isEndOfProc tailKind andalso not (haveExited transtable) then codeGenerate(exit (), cvec) else () (* Skip over the handler. *) val (skipHandler, skipCode) = unconditionalBranch (bodyResult, transtable) val () = codeGenerate(skipCode, cvec) (* Remove any result at the start of the handler. Need this because fixupH does not do setState. (It probably should do, though the state is fairly simple). *) val () = case bodyResult of MergeIndex bodyIndex => codeGenerate(removeStackEntry(transtable, bodyIndex), cvec) | NoMerge => () (* Fix up the handler entry point - this resets the stack pointer and clears the cache since the state is not known. *) val () = codeGenerate(fixupH (handlerLab, startOfHandler, transtable), cvec) (* The code for the handler body itself *) val handlerRes = genToRegister (handler, whereto, tailKind, loopAddr) (* Merge the results. *) val (mergeRes, mergeCode) = merge (skipHandler, transtable, handlerRes, mark) val () = codeGenerate(mergeCode, cvec) in mergeRes end | BICLdexc => let val regResult = resultReg ArgGeneral (* Exception packet is returned in result register. *) in codeGenerate(getRegister (transtable, regResult), cvec); codeGenerate(activeRegister regResult, cvec); MergeIndex(pushReg (transtable, regResult)) end | BICCase {cases, test, default, caseType} => let (* Cases are constructed by the optimiser out of if-then-else expressions. *) val whereto = chooseMergeRegister(whereto, tailKind) (* Sort the cases into ascending order. It's possible that we may have duplicates if this came from an if-then-else construction so we need to retain the ordering for items with the same case label. *) local val labelCount = List.length cases (* Add an extra field before sorting which retains the ordering for equal labels. *) val ordered = ListPair.zipEq (cases, List.tabulate(labelCount, fn n=>n)) fun leq ((_, w1: word), n1: int) ((_, w2), n2) = if w1 = w2 then n1 <= n2 else w1 < w2 val sorted = List.map #1 (Misc.quickSort leq ordered) (* Filter out any duplicates. *) fun filter [] = [] | filter [p] = [p] | filter ((p as (_, lab1)) :: (q as (_, lab2)) :: tl) = if lab1 = lab2 then p :: filter tl else p :: filter (q :: tl) in val cases = filter sorted end val (isExhaustive, min, max) = case caseType of CaseTag max => (true, 0w0, max) | _ => let val (_, aLabel) = hd cases fun foldCases((_, w), (min, max)) = (Word.min(w, min), Word.max(w, max)) val (min, max) = List.foldl foldCases (aLabel, aLabel) cases in (false, min, max) end val testValue = genToStack (test) val mark = markStack transtable (* Get exclusive use so that indexedCase can modify the registers. *) val (testReg, testIndex, testCode) = loadEntryToSet (transtable, testValue, RegSet.generalRegisters, true); (* Need a work register. *) val (workReg, regCode) = getRegisterInSet(transtable, generalRegisters) val (indexCaseInstr, caseLabels, defaultLabel) = indexedCase{testReg=testReg, workReg=workReg, minCase=min, maxCase=max, isArbitrary = case caseType of CaseInt => true | _ => false, isExhaustive=isExhaustive} val () = codeGenerate(indexCaseInstr @ regCode @ testCode, cvec) val () = codeGenerate(removeStackEntry (transtable, testIndex), cvec) val () = codeGenerate(freeRegister (transtable, workReg), cvec) val startOfCase = saveState transtable (* Put in the default case. Even when the case is exhaustive one entry is always treated as a default and not included in the list of cases. *) local (* We have to set "branched" to true before calling fixup. *) val () = exiting transtable val startCode = fixup(makeLabels(NoMerge, defaultLabel, startOfCase), transtable) val () = codeGenerate(startCode, cvec) (* Go down the list of cases and fix up any default labels to come here. Default entries are represented by "holes" in the case list. *) fun genDefaults(indexVal, label :: labelList, cl as ((_, caseLabel) :: cps)) = if indexVal = caseLabel then genDefaults(indexVal+0w1, labelList, cps) else ( codeGenerate(forwardJumpLabel label, cvec); genDefaults(indexVal+0w1, labelList, cl) ) | genDefaults(indexVal, label :: labelList, []) = ( codeGenerate(forwardJumpLabel label, cvec); genDefaults(indexVal+0w1, labelList, []) ) | genDefaults(_, [], _) = () val () = genDefaults(min, caseLabels, cases) val defaultRes = genToRegister (default, whereto, tailKind, loopAddr); (* Optimisation: return immediately, if possible, rather than jumping and then returning. This may turn the following unconditional branch into dead code, in which case it will be removed by the lower-level code generator. *) val () = if isEndOfProc tailKind andalso not (haveExited transtable) then codeGenerate(exit (), cvec) else (); val (lab, branchCode) = unconditionalBranch (defaultRes, transtable) val () = codeGenerate(branchCode, cvec) val () = case defaultRes of MergeIndex defaultIndex => codeGenerate(removeStackEntry (transtable, defaultIndex), cvec) | NoMerge => () in val exitDefault = lab end (* Generate the cases. *) fun genCases(indexVal, label :: labelList, (caseExp, caseLabel) :: cps) = if indexVal <> caseLabel then (* We have a hole. Skip this item. *) genCases(indexVal+0w1, labelList, (caseExp, caseLabel) :: cps) else (* The index value corresponds to a label. *) let val startCode = fixup(makeLabels(NoMerge, label, startOfCase), transtable) val () = codeGenerate(startCode, cvec) val mark = markStack transtable (* Generate this case and exit if tail-recursive. *) val expResult = genToRegister (caseExp, whereto, tailKind, loopAddr); val () = if isEndOfProc tailKind andalso not (haveExited transtable) then codeGenerate(exit (), cvec) else (); in if null cps then (* Finished. *) expResult (* Last expression. *) else let val (lab, branchCode) = unconditionalBranch (expResult, transtable) val () = codeGenerate(branchCode, cvec) val () = case expResult of MergeIndex expIndex => codeGenerate(removeStackEntry(transtable, expIndex), cvec) | NoMerge => (); val lastResult = genCases(indexVal+0w1, labelList, cps) val (mergeRes, mergeCode) = (* Now fix up the exit label. *) merge (lab, transtable, lastResult, mark) val () = codeGenerate(mergeCode, cvec) in mergeRes end end | genCases _ = raise InternalError "genCase - null case list" val caseResult = genCases(min, caseLabels, cases) val (mergeRes, mergeCode) = merge (exitDefault, transtable, caseResult, mark) val () = codeGenerate(mergeCode, cvec) in mergeRes end | BICTuple reclist => let val vecsize = List.length reclist val () = if vecsize = 0 (* shouldn't occur *) then raise InternalError "Zero sized vector" else () (* Since the vector is immutable, we have to evaluate all the values before we can allocate it. *) val entries = List.map(fn h => genToStackOrGeneralRegister (h)) reclist val asConstants = List.map(fn i => isConstant(i, transtable)) entries in if List.exists(fn NotConst => true | _ => false) asConstants then let fun loadSmallVector ([], _) = callgetvec (vecsize, F_words, whereto, transtable) | loadSmallVector (v::t, wordOffset) = let val (vec, vecCode) = loadSmallVector (t, wordOffset + 1) val moveCode = moveToVec (vec, v, wordOffset, transtable) in (vec, moveCode @ vecCode) end; val (vec, code) = loadSmallVector(entries, 0) val () = codeGenerate(code, cvec) val () = codeGenerate(allocationComplete, cvec) in MergeIndex vec end else let (* The higher levels of the code generator attempt to remove tuples of constants but some still slip through. One particular case that can't be handled in the higher levels is a tuple that contains a recursive reference. That does occur with equality functions. *) (* Construct a mutable object and fill it in. *) val toFill = ref vecsize val vec : address = alloc(toShort(toMachineWord vecsize), F_mutable_words, toMachineWord 0) (* Set the element in the address. If this is a forward reference to a code segment it won't be called until the code has been completed. *) fun setItem (n: int) (_, addr: machineWord) = ( assignWord(vec, toShort(toMachineWord n), addr); toFill := !toFill - 1; if !toFill = 0 then lock vec else () ) fun addItem(ConstLit lit, n) = (setItem n ((), lit); n+1) | addItem(ConstCode code, n) = (addCompletionHook(code, setItem n); n+1) | addItem(NotConst, _) = raise InternalError "addItem: NotConst" val _ = List.foldl addItem 0 asConstants (* Remove the entries which aren't actually used. *) val () = List.app(fn n => codeGenerate(incrUseCount(transtable, n, ~1), cvec)) entries in MergeIndex(pushConst(transtable, toMachineWord vec)) end end | BICContainer size => (* Reserve a number of words on the stack for use as a tuple on the stack. The result is the address of this space. *) let val (reserveEntry, reserveCode) = reserveStackSpace(transtable, size) in codeGenerate(reserveCode, cvec); MergeIndex reserveEntry end | BICSetContainer{container, tuple, filter} => (* Copy the contents of a tuple into a container. *) let val vec = genToStack container in case tuple of BICTuple cl => (* Simply set the container from the values filtering out those required. *) let fun setValues([], _, _) = () | setValues(v::tl, sourceOffset, destOffset) = let val entry = genToStack v in (* Move the entry into the container. Does not affect the use count for the container entry. *) if sourceOffset < BoolVector.length filter andalso BoolVector.sub(filter, sourceOffset) then ( codeGenerate(moveToVec (vec, entry, destOffset, transtable), cvec); setValues(tl, sourceOffset+1, destOffset+1) ) else ( codeGenerate(removeStackEntry(transtable, entry), cvec); setValues(tl, sourceOffset+1, destOffset) ) end in setValues(cl, 0, 0) end | _ => let val tup = genToStack tuple val last = BoolVector.foldli(fn (i, true, _) => i | (_, false, n) => n) ~1 filter fun copy (sourceOffset, destOffset) = if BoolVector.sub(filter, sourceOffset) then let (* We need to ensure that the tuple entry is only removed when we load the last item from it. *) val _ = if sourceOffset = last then () else codeGenerate(incrUseCount(transtable, tup, 1), cvec) val (entry, entryCode) = indirect (sourceOffset, tup, transtable) val () = codeGenerate(entryCode, cvec) in codeGenerate(moveToVec (vec, entry, destOffset, transtable), cvec); if sourceOffset = last then () else copy (sourceOffset+1, destOffset+1) end else copy(sourceOffset+1, destOffset) in copy (0, 0) end; codeGenerate(removeStackEntry(transtable, vec), cvec); (* Free the container entry. *) (* Return a void result if necessary. *) if isNoResult whereto then NoMerge else MergeIndex(pushConst (transtable, DummyValue)) end | BICTagTest { test, tag, ... } => let (* Convert this into a simple equality function. *) val code = BICEval { function = BICConstnt(ioOp POLY_SYS_word_eq, []), argList=[(test, GeneralType), (BICConstnt(toMachineWord tag, []), GeneralType)], resultType=GeneralType } in gencde (code, true(* Try to put in-line *), whereto, tailKind, loopAddr) end | BICKillItems { expression, killSet, killBefore } => let (* This is inserted by the higher level code to get the use-counts correct. Kill entries are BICExtract entries with lastRef true. *) fun cgKill toKill = (gencde(toKill, true, NoResult, NotEnd, loopAddr); ()) in if killBefore then (* Process the kill set before the expression. *) ( List.app cgKill killSet; gencde (expression, primBoolOps, whereto, tailKind, loopAddr) ) else (* Process the expression first, then kill the items *) let val result = gencde (expression, primBoolOps, whereto, tailKind, loopAddr) in List.app cgKill killSet; result end end in (* Various cases create results even if they're not required. Remove them. *) case (result, whereto) of (NoMerge, NoResult) => NoMerge | (NoMerge, _) => raise InternalError "gencde: Result wanted but none supplied" | (MergeIndex m, NoResult) => (incrUseCount(transtable, m, ~1); NoMerge) | (MergeIndex _, _) => result end (* gencde *) (* Generate an expression putting the result in any register, and return the location of it on the stack. *) and genToStack (pt : backendIC) : stackIndex = let val res = gencde (pt, true, NoHint, NotEnd, NONE) in case res of MergeIndex index => index | NoMerge => raise InternalError "genToStack: no result" end (* Reduce the expression to a constant, general register or simple address. This differs from genToStack in that a value must not be in a floating point register. This is important if we are about to put the value into a newly allocated object. The floating point value will have to be moved into memory and that must be done before we allocate the new object. *) and genToStackOrGeneralRegister(pt : backendIC) : stackIndex = let val res = gencde (pt, true, NoHint, NotEnd, NONE) in case res of MergeIndex index => let val (newIndex, code) = ensureNoAllocation(transtable, index) in codeGenerate(code, cvec); newIndex end | NoMerge => raise InternalError "genToStack: no result" end (* ... (* Used when the result must be put in a register. *) and genToResult (pt, whereto, tailKind, loopAddr) : unit = let (* Stack results are forced into result register *) val toWhere = if isToPstack whereto then UseReg regResult else whereto; val result = gencde (pt, true, toWhere, tailKind, loopAddr); in (* If we need a result put it in the result reg. We request exclusive use of it because otherwise there is a problem when merging the results of an if-then-else if the result register is somewhere else on the pstack (e.g. let a == ...; if ... then a else ...) *) case toWhere of UseReg rr => loadToSpecificReg (cvec, transtable, rr, result, true) | _ => () end (* genToResult *) ... *) (* Used when the result must be put in a register. *) and genToRegister (pt, whereto, tailKind, loopAddr) : mergeResult = let val result = gencde (pt, true, whereto, tailKind, loopAddr) in case (whereto, result) of (NoResult, _) => NoMerge | (UseReg rr, MergeIndex index) => if haveExited transtable (* If we've raised an exception we can ignore this. *) then MergeIndex index else let (* If we need a result put it in the result reg. We request exclusive use of it because otherwise there is a problem when merging the results of an if-then-else if the result register is somewhere else on the pstack (e.g. val a = ...; if ... then a else ...), If we're at the end of a function, we're not merging, so we don't need exclusive use. However, I don't think we actually save anything by trying to make use of this fact so let's just be naive. SPF 27/11/96 *) val (_, mergeItem, mergeCode) = loadEntryToSet (transtable, index, rr, true) in codeGenerate(mergeCode, cvec); MergeIndex mergeItem end | (UseReg _, NoMerge) => raise InternalError "genToRegister: no result" | (NoHint, _) => raise InternalError "genToRegister: not a register" end (* genToRegister *) (* `mutualRecursive' is used for mutually recursive functions where a function may not be able to fill in its closure if it does not function address has been pushed but before the code is generated. *) and genProc ({ closure=closureList, heapClosure, name=lambdaName, body=lambdaBody, argTypes, resultType, closureRefs, argLifetimes, localCount, ... }, mutualRecursive: stackIndex -> unit, whereto) = (* Requires a closure but this may be a constant. *) let (* Frequently the closure is actually empty but it may be that there are values that are now constants. This can occur if we are compiling an inner function that contains a recursive reference to an outer function and the outer function has an empty closure and is therefore a constant. First try loading all the items of the closure. If there are mutually recursive references we may not be able to load them at this point. *) fun loadClosure(c as BICExtract(BICLoadLocal addr, _)) = if Array.sub(decToPstack, addr) = noIndex then noIndex else genToStackOrGeneralRegister (c) | loadClosure(c as BICExtract(BICLoadArgument _, _)) = genToStackOrGeneralRegister (c) | loadClosure c = genToStackOrGeneralRegister (c) val initialLocs = List.map loadClosure closureList (* Extract any constants. *) val constants = List.map(fn i => if i = noIndex then NotConst else isConstant(i, transtable)) initialLocs val nonConstCount = List.foldl(fn (NotConst, n) => n+1 | (_, n) => n) 0 constants in if nonConstCount = 0 then (* All the entries that are there are constants. We can avoid constructing a closure at run-time. Instead we construct a single word item containing the address of the code that can be used if a full closure call is used. As far as possible, though, calls to this function are made using the PureCode convention which bypasses the closure altogether. That means that any constants that are there must be passed back via "previous". *) let (* Create a one word item for the closure. This is returned for recursive references and filled in with the address of the code when we've finished. *) val profileObject = createProfileObject lambdaName val newCode = codeCreate (false (* make a closure *), lambdaName, profileObject, debugSwitches) fun previous (BICLoadRecursive, _, newtab) = (* load the address of the closure itself *) (pushCodeRef(newtab, newCode), []) | previous (BICLoadClosure locn, _, newtab) = ( (* load a constant (item locn of the logical closure) *) case List.nth(constants, locn) of ConstLit lit => (pushConst (newtab, lit), []) | ConstCode code => (pushCodeRef(newtab, code), []) | NotConst => raise InternalError "previous: NotConst" ) | previous _ = raise InternalError "previous: local" val (ops, maxStack, regList, callsAFunction) = codegen (lambdaBody, previous, 0, (* Discard regClosure *) argTypes, argLifetimes, resultType, localCount, profileObject, debugSwitches) val closureAddr = copyCode (newCode, ops, maxStack, regList, callsAFunction) val result = pushConst (transtable, toMachineWord closureAddr); (* Clear off the constant entries. *) val () = List.app(fn n => codeGenerate(incrUseCount(transtable, n, ~1), cvec)) initialLocs (* Handle any other recursive functions. *) val () = mutualRecursive result in result end else (* There's at least one non-constant so we're going to have to build a closure. *) let local (* Convert the original index to a new index with the constants skipped. *) fun makeIndex(NotConst :: t, n) = SOME n :: makeIndex(t, n+1) | makeIndex(_ :: t, n) = NONE :: makeIndex(t, n) | makeIndex([], _) = [] in val closureIndexes = Vector.fromList(makeIndex(constants, 1(*Starts from 1*))) end fun previous(BICLoadRecursive, makeSl, _) = makeSl () (* load the address of the closure itself *) | previous(BICLoadClosure locn, makeSl, newtab) = ( case List.nth(constants, locn) of ConstLit lit => (pushConst (newtab, lit), []) | ConstCode code => (pushCodeRef(newtab, code), []) | NotConst => let val newLocn = valOf(Vector.sub(closureIndexes, locn)) val (sl, closureCode) = makeSl() (* load the closure *) val (entry, indCode) = indirect(newLocn, sl, newtab) (* load value from the closure *) in (entry, indCode @ closureCode) end ) | previous(_, _, _) = raise InternalError "previous: local" val profileObject = createProfileObject lambdaName val newCode = codeCreate (true (* just the code *), lambdaName, profileObject, debugSwitches) val (ops, maxStack, regList, callsAFunction) = (* code-gen function *) codegen (lambdaBody, previous, closureRefs, argTypes, argLifetimes, resultType, localCount, profileObject, debugSwitches) val codeAddr = copyCode (newCode, ops, maxStack, regList, callsAFunction) val res = toMachineWord codeAddr (* Build the closure. If there are outstanding entries it has to be mutable and we can't complete it until we've done the other mutually recursive entries. *) val incomplete = List.exists(fn i => i = noIndex) initialLocs in if heapClosure then let val (vector, vecCode) = callgetvec (nonConstCount+1, if incomplete then F_mutable_words else F_words, whereto, transtable) val () = codeGenerate(vecCode, cvec) (* First word is the address of the code. *) val () = codeGenerate(moveToVec (vector, pushConst (transtable, res), 0, transtable), cvec) (* Put in everything else *) fun fillClosure(index::indices, NotConst::constEntries, n) = let val indexOrDummy = if index = noIndex then (* Recursive entry. This has to be initialised to avoid problems if we GC when allocating other closures. *) pushConst (transtable, DummyValue) else index val vecAddr = valOf(Vector.sub(closureIndexes, n)) in codeGenerate(moveToVec(vector, indexOrDummy, vecAddr, transtable), cvec); fillClosure(indices, constEntries, n+1) end | fillClosure(index::indices, _::constEntries, n) = ( (* It was a constant. Remove it. *) codeGenerate(incrUseCount(transtable, index, ~1), cvec); fillClosure(indices, constEntries, n+1) ) | fillClosure _ = () val () = fillClosure(initialLocs, constants, 0) val () = codeGenerate(allocationComplete, cvec) (* Have to ensure that the closure remains on the psuedo-stack until we've filled in all uses of it. The only references may be in the closures of other functions so it's possible that its use-count could be zero when `mutualRecursive' returns. Have to increment the use-count and then decrement it afterwards to make sure it is still on the stack. *) val () = codeGenerate(incrUseCount (transtable, vector, 1), cvec) (* Any mutually recursive references. *) val () = mutualRecursive vector (* We should now be able to fill in the recursive references. *) fun fillRecursive(index::indices, entry::entries, n) = ( if index = noIndex (* Deferred entry*) then let val loadEntry = genToStack entry val addr = valOf(Vector.sub(closureIndexes, n)) val moveCode = moveToVec(vector, loadEntry, addr, transtable) in codeGenerate(moveCode, cvec) end else (); fillRecursive(indices, entries, n+1) ) | fillRecursive _ = () val () = fillRecursive(initialLocs, closureList, 0) val () = let (* Finally we can lock this. *) (* Increment the use count before the lock. *) val () = codeGenerate(incrUseCount (transtable, vector, 1), cvec) val lockInstr = case checkAndReduce(instrLockSeg, [], fn _ => NONE) of SOME(lockInstr, _) => lockInstr | NONE => raise InternalError "Lock instruction not implemented" val (_, lockCode) = dataOp([vector], lockInstr, transtable, NoResult) in codeGenerate(lockCode, cvec) end (* Restore the use count *) val () = codeGenerate(incrUseCount (transtable, vector, ~1), cvec) in vector end else let (* Stack closure *) (* Get the non-constant entries and release the constants. *) val nonConstEntries = ListPair.foldr (fn (index, NotConst, l) => index :: l | (index, _, l) => (codeGenerate(incrUseCount(transtable, index, ~1), cvec); l)) [] (initialLocs, constants) val (container, containerCode) = createStackClosure(transtable, pushConst (transtable, res) :: nonConstEntries) val () = codeGenerate(containerCode, cvec) (* Have to ensure that the closure remains on the psuedo-stack until we've filled in all uses of it. The only references may be in the closures of other functions so it's possible that its use-count could be zero when `mutualRecursive' returns. Have to increment the use-count and then decrement it afterwards to make sure it is still on the stack. *) val () = codeGenerate(incrUseCount (transtable, container, 1), cvec) (* Any mutually recursive references. *) val () = mutualRecursive container (* We should now be able to fill in the recursive references. *) fun fillRecursive(index::indices, entry::entries, n) = ( if index = noIndex (* Deferred entry*) then let val loadEntry = genToStack entry val addr = valOf(Vector.sub(closureIndexes, n)) (* Move this into the stack. *) val moveCode = setRecursiveClosureEntry(container, loadEntry, addr, transtable) in codeGenerate(moveCode, cvec) end else (); fillRecursive(indices, entries, n+1) ) | fillRecursive _ = () val () = fillRecursive(initialLocs, closureList, 0) (* Restore the use count *) val () = codeGenerate(incrUseCount (transtable, container, ~1), cvec) in container end end end (* genProc *) (* Generates test for if..then..else or while..do. Returns address of address field of jump. If jumpOn is true the jump is taken if the condition is true, if false it is taken if the condition is false. *) and genTest (pt, jumpOn) : labels = let (* See if we can generate a conditional instruction. *) (* Those we can't deal with specially are evaluated to the stack and tested. *) fun genOtherTests () = case checkAndReduceBranches(if jumpOn then testNeqW else testEqW, [pt, constntFalse], fn (BICConstnt (w, _)) => SOME w | _ => NONE) of SOME (tst, args) => let (* We can't use genToStack here because we need primBoolOps to be false. *) fun cgArg arg = case gencde (arg, false (* primBoolOps *), NoHint, NotEnd, NONE) of MergeIndex index => (index, []) | NoMerge => raise InternalError "genTest: no result" val argsAndCode = List.map cgArg args val argLocns = List.map #1 argsAndCode (* Return the code ordered with earlier arguments later in the list. *) val argCode = List.foldl (fn ((_, argCode), code) => argCode @ code) [] argsAndCode val (label, testCode) = compareAndBranch (argLocns, tst, transtable) in codeGenerate(testCode @ argCode, cvec); label end (* Should consider the possibility that checkAndReduceBranches might return two args. *) | NONE => raise InternalError "compareAndBranch returned failure" in case pt of BICCond (testPart, thenPart, elsePart) => let val mark1 = markStack transtable val mark2 = markStack transtable (* Test the condition part. *) val a : labels = genTest (testPart, false) in if isEmptyLabel a then (* The test evaluated to true. We must only generate the then-part. This is more than an optimisation. "Nojump" does not set the correct state for the else-part which can cause problems. *) ( unmarkStack(transtable, mark2); unmarkStack(transtable, mark1); genTest (thenPart, jumpOn) ) else if haveExited transtable then (* Unconditional jump. Only need the else-part. *) ( unmarkStack(transtable, mark2); unmarkStack(transtable, mark1); codeGenerate(fixup (a, transtable), cvec); genTest (elsePart, jumpOn) ) else let (* Now the `then-part' *) val b : labels = genTest (thenPart, jumpOn); (* Put in an unconditional jump round the `else-part'. This will be taken if the `then-part' drops through. *) val (notB, notCode) = unconditionalBranch (NoMerge, transtable) val () = codeGenerate(notCode, cvec) (* Fill in the label for the then-part part. *) val () = codeGenerate(fixup (a, transtable), cvec); (* Now do the `else-part' and jump on the inverse of the condition. *) val notC = genTest (elsePart, not jumpOn); (* i.e. we drop though if the condition is the one we should have jumped on. Now merge in the first label so we have both cases when we should jump together, *) val (_, mergeBCode) = merge (b, transtable, NoMerge, mark2) val () = codeGenerate(mergeBCode, cvec) (* and now take the jump. *) val (resultLab, resultCode) = unconditionalBranch (NoMerge, transtable) val () = codeGenerate(resultCode, cvec) (* Come here if we are not jumping. *) val () = codeGenerate(fixup (notB, transtable), cvec); val (_, mergeCCode) = merge (notC, transtable, NoMerge, mark1) val () = codeGenerate(mergeCCode, cvec) in resultLab end end (* Simple Cases generate better jumping code like this, rather than creating a boolean return value, then testing it and jumping on the result. We could be less special-case here, but this particular case is exceptionally important for handling inlined selector functions. SPF 24/2/1998 *) (* Previously Cases were generated from almost all simple comparisons. Now that they are only generated if there are sufficient numbers of branches this can probably be removed. *) | BICCase {cases = [(result, tag)], test, default, ...} => let val equalFun : backendIC = BICConstnt (ioOp POLY_SYS_equala, []) val arguments = [(test, GeneralType), (BICConstnt (toMachineWord tag, []), GeneralType)] val eqTest : backendIC = BICEval {function = equalFun, argList = arguments, resultType=GeneralType}; in genTest (BICCond (eqTest, result, default), jumpOn) end (* Constants - primarily for andalso/orelse. *) | BICConstnt(w, _) => (* If true and we jump on true or false and jump on false *) (* then put in an unconditional jump. *) if wordEq (w, True) = jumpOn then let val (lab, code) = unconditionalBranch (NoMerge, transtable) val () = codeGenerate(code, cvec) in lab end else noJump (* else drop through. *) | BICNewenv(decs, exp) => ( List.app (codeBinding NONE) decs; genTest (exp, jumpOn) ) | BICTagTest { test, tag, ... } => let (* Convert this into a simple equality function. *) val code = BICEval { function = BICConstnt(ioOp POLY_SYS_word_eq, []), argList=[(test, GeneralType), (BICConstnt(toMachineWord tag, []), GeneralType)], resultType=GeneralType } in genTest(code, jumpOn) end | BICEval {function = BICConstnt(oper, _), argList = args, ...} => (* May be an interface operation which can be put in line. *) let (* Generate a compare instruction. *) fun genCompare (args, t, f) = let val test = if jumpOn then t else f; in (* Check that the instruction is implemented. *) case checkAndReduceBranches(test, args, fn (BICConstnt(w, _)) => SOME w | _ => NONE) of SOME (test, args) => let (* Generate the instruction and get the direction. *) (* Code generate each argument to the pstack. *) val argLocns = List.map (fn arg => genToStack (arg)) args val (label, testCode) = compareAndBranch (argLocns, test, transtable) val () = codeGenerate(testCode, cvec) in label end | NONE => genOtherTests () end (* genCompare *); in case args of [] => (* We don't currently have any nullary special cases *) genOtherTests () | [(arg, _)] => (* unary special cases *) if wordEq (oper,ioOp POLY_SYS_not_bool) then genTest (arg, not jumpOn) else if wordEq (oper,ioOp POLY_SYS_is_short) then ( case arg of BICConstnt (w, _) => if isShort w then genTest (constntTrue, jumpOn) else genTest (constntFalse, jumpOn) | _ => ( case checkAndReduceBranches(if jumpOn then Short else Long, [arg], fn (BICConstnt(w, _)) => SOME w | _ => NONE) of SOME (testOp, [arg]) => let val locnOfArg1 = genToStack (arg); val (label, testCode) = compareAndBranch([locnOfArg1], testOp, transtable) val () = codeGenerate(testCode, cvec) in label end | _ => genOtherTests () ) ) else (* Non-special unary function.*) genOtherTests () | [(arg1, _), (arg2, _)] => (* binary special cases *) if wordEq (oper,ioOp POLY_SYS_word_eq) then genCompare ([arg1, arg2], testEqW, testNeqW) else if wordEq (oper,ioOp POLY_SYS_word_neq) then genCompare ([arg1, arg2], testNeqW, testEqW) else if wordEq (oper,ioOp POLY_SYS_equala) then genCompare ([arg1, arg2], testEqA, testNeqA) else if wordEq (oper,ioOp POLY_SYS_int_geq) then genCompare ([arg1, arg2], testGeqA, testLtA) else if wordEq (oper,ioOp POLY_SYS_int_leq) then genCompare ([arg1, arg2], testLeqA, testGtA) else if wordEq (oper,ioOp POLY_SYS_int_gtr) then genCompare ([arg1, arg2], testGtA, testLeqA) else if wordEq (oper,ioOp POLY_SYS_int_lss) then genCompare ([arg1, arg2], testLtA, testGeqA) else if wordEq (oper,ioOp POLY_SYS_word_geq) then genCompare ([arg1, arg2], testGeqW, testLtW) else if wordEq (oper,ioOp POLY_SYS_word_leq) then genCompare ([arg1, arg2], testLeqW, testGtW) else if wordEq (oper,ioOp POLY_SYS_word_gtr) then genCompare ([arg1, arg2], testGtW, testLeqW) else if wordEq (oper,ioOp POLY_SYS_word_lss) then genCompare ([arg1, arg2], testLtW, testGeqW) else if wordEq (oper,ioOp POLY_SYS_Real_eq) then genCompare ([arg1, arg2], testEqFP, testNeqFP) else if wordEq (oper,ioOp POLY_SYS_Real_neq) then genCompare ([arg1, arg2], testNeqFP, testEqFP) else if wordEq (oper,ioOp POLY_SYS_Real_geq) then genCompare ([arg1, arg2], testGeqFP, testLtFP) else if wordEq (oper,ioOp POLY_SYS_Real_leq) then genCompare ([arg1, arg2], testLeqFP, testGtFP) else if wordEq (oper,ioOp POLY_SYS_Real_gtr) then genCompare ([arg1, arg2], testGtFP, testLeqFP) else if wordEq (oper,ioOp POLY_SYS_Real_lss) then genCompare ([arg1, arg2], testLtFP, testGeqFP) else genOtherTests () (* Non-special binary function. *) | [(arg1, _), (arg2, _), (arg3, _), (arg4, _), (arg5, _)] => if wordEq (oper,ioOp POLY_SYS_bytevec_eq) then genCompare ([arg1, arg2, arg3, arg4, arg5], byteVecEq, byteVecNe) else genOtherTests () (* Non-special function. *) | _ => (* Functions with more than 2 arguments. *) genOtherTests () end (* constant functions *) | _ => (* Anything else *) genOtherTests () end (* if/then/else, cand and cor. NB if/then/else may be translated into a CASE by the optimiser and code-generated there. *) and genCond (testExp, thenPt, elsePt, whereto, tailKind, loopAddr) = let val mark = markStack transtable (* We use the then-part to determine the register for the result so if it's simple we probably want to swap the else- and then-parts *) val reverse = case thenPt of BICConstnt _ => true | BICExtract _ => true | BICRaise _ => true | _ => false val (direction, thenExp, elseExp) = if reverse then (true, elsePt, thenPt) else (false, thenPt, elsePt) val lab = genTest (testExp, direction) (* code for condition *) (* There used to be code in here to handle specially the case where the test expression was a constant. I've taken that out, partly because the simple cases are dealt with by the optimiser but more seriously because it's necessary to deal with the slightly more general case where the test expression results in a constant (e.g. "if not false" or "if (print "something"; true)" ). There was a bug in the case where the expression resulted in "true" since "lab" becomes "noJump" if the jump is never taken. "fixup" leaves "exited" as true so no code is generated for the else-part but it doesn't set the pseudo-stack properly which can cause problems while processing the else-part. DCJM 27 June 2000. *) in if isEmptyLabel lab then ( (* Only the "then" part will be executed. Don't generate the else-part. *) unmarkStack(transtable, mark); gencde (thenExp, true, whereto, tailKind, loopAddr) ) else if haveExited transtable then ( (* Jump was unconditional - just generate the else-part. *) unmarkStack(transtable, mark); codeGenerate(fixup (lab, transtable), cvec); gencde (elseExp, true, whereto, tailKind, loopAddr) ) else let (* Generate the then-part and see where the result is. We need it in a register but we don't want to decide in advance which register to use. In particular, if the result is in a floating point register we don't want to move it to a general register. *) val (thenResult, whereto) = case (whereto, tailKind) of (NoHint, NotEnd) => let (* We don't have any preferences. *) val initialThenResult = gencde(thenExp, true, whereto, tailKind, loopAddr) in if haveExited transtable (* If we've raised an exception we can ignore this. *) then (initialThenResult, NoHint) else case initialThenResult of MergeIndex res => let (* Is it in a register? Merging requires exclusive use of the result register and it may be that this register is required elsewhere. Use it as a hint for the register type we require and then load it. If it's not required elsewhere this will just return the register it's in. *) val regSet = case isRegister(res, transtable) of SOME reg => if inSet(reg, floatingPtRegisters) then floatingPtRegisters else generalRegisters | NONE => generalRegisters val (_, mergeItem, mergeCode) = loadEntryToSet (transtable, res, regSet, true) val () = codeGenerate(mergeCode, cvec) in (MergeIndex mergeItem, UseReg(singleton(valOf(isRegister(mergeItem, transtable))))) end | NoMerge => raise InternalError "genCond: no result" end | (_, EndOfProc res) => let (* We want the result in the result reg. *) val whereto = UseReg(singleton res) in (genToRegister (thenExp, whereto, tailKind, loopAddr), whereto) end | (whereto, _) => (* No result or we have a specific register. *) (genToRegister (thenExp, whereto, tailKind, loopAddr), whereto) val () = if isEndOfProc tailKind andalso not (haveExited transtable) then codeGenerate(exit(), cvec) else () val (lab1, branchCode) = unconditionalBranch (thenResult, transtable) val () = codeGenerate(branchCode, cvec) (* Get rid of the result from the stack. If there is a result then the "else-part" will push it. *) val () = case thenResult of MergeIndex thenIndex => codeGenerate(removeStackEntry(transtable, thenIndex), cvec) | NoMerge => () (* start of "else part" *) val () = codeGenerate(fixup (lab, transtable), cvec); val elseResult = case whereto of NoHint => (* Only if the then-part raised an exception *) gencde(elseExp, true, whereto, tailKind, loopAddr) | _ => genToRegister (elseExp, whereto, tailKind, loopAddr) val (mergeRes, mergeCode) = merge (lab1, transtable, elseResult, mark) val () = codeGenerate(mergeCode, cvec) in mergeRes end end (* genCond *) (* Call a function. Detects special cases of calls to the run-time system to do simple operations such as int arithmetic and generates the instructions directly. For ordinary calls it has to distinguish between those called with a static-link and those called with a closure. *) and genEval (evalFun, argList: (backendIC * argumentType) list, resultType, primBoolOps, whereto, tailKind) : mergeResult = let (* Call a closure function. *) fun callClosure (clos : backendIC option, canTail): mergeResult = let (* If we're actually calling the function where do the arguments go? *) val argLocations = argRegs (List.map (codeToCgType o #2) argList) val modifiedArgRegs = List.map valOf (List.filter isSome argLocations) val needsResult = not (isNoResult whereto) val regResult = resultReg(codeToCgType resultType) (* Can use a jump if we're at the end, the closure is not the stack, the result is in the right register (we don't need to convert floating point to fixed point or vice versa) and none of the arguments are functions with closures on the stack. *) local fun nonContainer(BICExtract(BICLoadLocal addr, _), _) = not(isContainer(Array.sub(decToPstack, addr), transtable)) | nonContainer(BICLambda{heapClosure, ...}, _) = heapClosure | nonContainer _ = true in val isTail = case tailKind of EndOfProc reg => canTail andalso regResult = reg andalso List.all nonContainer argList | _ => false end (* Get the set of registers modified by this call. We have to include the argument, closure and code registers even if they're not actually modified because otherwise we may find that we've locked them. *) val modifiedRegisters = case clos of SOME (BICConstnt(w, _)) => regSetUnion(listToSet(regClosure :: modifiedArgRegs), getRegisterSetForFunction w) | _ (* Recursive or not a constant. *) => allRegisters; (* Add the registers to the set modified by this function. We don't need to do this for recursive calls. In that case we must push all the registers (so we set registerSet to allRegisters) but the modification set for this function is simply the registers modified by everything else. *) val _ = case clos of NONE => () | _ => addModifiedRegSet(transtable, modifiedRegisters) (* In a tail-recursive call we may overwrite arguments on the stack. We have to load any argument values we need before we overwrite them.*) fun checkTailArgument originalLocn = if isTail then let val (safeLocn, safeCode) = loadIfArg (transtable, originalLocn) val () = codeGenerate(safeCode, cvec) in safeLocn end else originalLocn (* Have to guarantee that the expression to return the function is evaluated before the arguments. *) val procLocn = case clos of SOME(BICConstnt _) => noIndex (* Unused. *) | SOME c => checkTailArgument(genToStack c) | NONE => noIndex (* Unused. *) local fun loadReg reg addr : stackIndex = let (* We don't need exclusive use of this value, because it only gets modified by the function call itself, not here. We either don't return from the function (tail-call: we set exited) or we explicitly clear the cache in setUpResult. *) val (regIndex, regCode) = loadToSpecificReg(transtable, reg, addr, false (* was bodyCall *)); in codeGenerate(regCode, cvec); (* Lock the register down so that it doesn't get used to move values onto the stack. *) lockRegister (transtable, reg); regIndex end in fun loadProc (): (stackIndex option * bool * stackIndex list * reg list) = case clos of SOME(BICConstnt(w, _)) => (* Do we need to load the closure register? *) let val addr = toAddress w; in if isIoAddress addr then (* We don't need the closure register but we can't do the indirection here. That's because the code address isn't valid. We have to do the indirection at run time. *) (SOME(pushConst(transtable, w)), true, [], []) else let val code : machineWord = loadWord (addr, 0w0) val codeLocn = pushConst(transtable, code) in if objLength addr = 0w1 then (* The closure is just one word - we don't need to put it in the closure register since the function won't need it. Do the indirection now. *) (SOME codeLocn, false, [], []) else (* We need to load the closure register. We have a choice here. We could either return the closure register as the address as we do in the general case, in which case we would do an indirect call through the closure register, or we can do the indirection here and do a direct call. On the i386 the latter is definitely better but on the PPC it will generate longer code, although possibly no slower if there was a pipeline stall. *) (SOME codeLocn, false, [loadReg regClosure (pushConst(transtable, w))], [regClosure]) end end | SOME _ => (* Calling a non-constant - load the closure register and set the code address as this with the "indirection" flag set to true. *) (SOME(loadReg regClosure procLocn), true, [], [regClosure]) | NONE => (* Recursive *) (* If this function requires a closure we need to reload the closure register with our original closure. *) if closureLifetime = 0 then (NONE, false, [], []) else (NONE, false, [loadReg regClosure closureOrSlAddr], [regClosure]) end (* Code-generate each entry to the pstack. If this is a tail recursive call we have to load any values that are currently used as arguments because we may overwrite them later. *) local fun loadArg((arg, _), argLocn) = let val originalLocn = case argLocn of SOME argReg => let (* Put into a register. *) (* If we are evaluating an expression we might as well put the result in the register we want to use. They may not stay there because loading other arguments may involve function calls which will use these registers. For that reason we don't put constants in yet. *) val whereto = case arg of BICConstnt _ => NoHint | _ => UseReg(singleton argReg) in case gencde (arg, true, whereto, NotEnd, NONE) of MergeIndex index => index | NoMerge => raise InternalError "ldArgs: No result" end | NONE => (* On the stack *) genToStack arg in checkTailArgument originalLocn end in val argsOnPstack = ListPair.mapEq loadArg(argList, argLocations) end in if isTail then (* Enter a function by jumping rather than calling. *) let (* Now move the arguments to their final destination. argAddr is a negative value and is the address of the arguments in the original stack. *) fun moveArgs ([], [], _) = [] | moveArgs (arg::args, SOME argReg :: argTypes, argAddr) = let (* Do it in reverse order so that we can delay locking the register arguments. *) val argEntries = moveArgs(args, argTypes, argAddr) val (argEntry, argCode) = loadToSpecificReg (transtable, argReg, arg, false); in codeGenerate(argCode, cvec); lockRegister (transtable, argReg); argEntry :: argEntries end | moveArgs (arg::args, NONE :: argTypes, argAddr) = let (* Store it in the stack, reloading anything it displaces. *) val (argEntry, argCode) = storeInStack(transtable, arg, argAddr) val () = codeGenerate(argCode, cvec) in argEntry :: moveArgs(args, argTypes, argAddr+1) end | moveArgs _ = raise InternalError "moveArgs: Length mismatch" (* the arguments are now all in their rightful places *) val argEntries = moveArgs(argsOnPstack, argLocations, ~numberOfArgsOnStack) (* Now load regClosure as appropriate. *) val (codeAddrOpt, isIndirect, callEntries, registersLocked) = loadProc () (* Compute the number of stack arguments we're passing. *) val stackArgCount = List.length(List.filter(not o isSome) argLocations) (* Get the return address. *) val returnReg : reg option = (* The return address is on the stack. Do we need to load it? *) (* Only if we're passing a different number of arguments on stack - this would change the offset of the return address. *) if stackArgCount = numberOfArgsOnStack then NONE (* Leave it there. *) else let val (reg, regIndex, loadCode) = loadEntryToSet (transtable, returnAddress, RegSet.generalRegisters, false) val () = codeGenerate(loadCode, cvec) in codeGenerate(removeStackEntry(transtable, regIndex), cvec); SOME reg end local (* Move the stack pointer if necessary. *) val diffInArgs = numberOfArgsOnStack - stackArgCount (* One more "arg" if the return address is passed on the stack. *) val adjust = case returnReg of NONE => 1 | SOME _ => 0 in val stackMove= realstackptr transtable + diffInArgs - adjust end in codeGenerate(resetStack stackMove, cvec); (* Push the register with the return address. *) case returnReg of NONE => () | SOME r => codeGenerate(pushRegisterToStack r, cvec); (* Call the function. If it's not recursive we have to get the entry point. *) (* We have to include a stack check in this function to ensure that it's interruptible even though a tail jump doesn't require any more stack. *) callsAFunction := true; (* Don't really need this for RTS calls. *) case codeAddrOpt of NONE => codeGenerate(jumpToFunction Recursive, cvec) | SOME codeAddr => codeGenerate(jumpToCode(codeAddr, isIndirect, transtable), cvec); (* Unlock any registers we locked. *) List.app (fn r => codeGenerate(unlockRegister (transtable, r), cvec)) registersLocked; (* Remove the arguments and code/closure registers. *) List.app (fn index => codeGenerate(removeStackEntry(transtable, index), cvec)) (argEntries @ callEntries) (* Since we've exited we don't need to clear the cache. *) end else (* Call a function. Used in cases when it's not tail-recursive. *) let (* Save any values to the stack other than those that are being used in this call. Values in registers not modified by the call are locked in their current registers. *) val (lockedRegs, pushInstrs) = pushNonArguments(transtable, procLocn :: argsOnPstack, modifiedRegisters); val () = codeGenerate(pushInstrs, cvec) (* Push the arguments onto the real stack and/or load them into the argument registers. *) (* Second phase of argument evaluation. Push the values onto the real stack or load them into the argument registers. The result is the stack base for stack arguments together with a list of pseudo-stack entries for the arguments. *) fun pushArgs (argList : stackIndex list) : int * stackIndex list = let fun ldArgs ([], stackAddr, []) = (stackAddr, []) | ldArgs (argLoc :: t, stackAddr, SOME argReg :: t') = let (* Put into a register. *) (* Load the first before putting these into the registers. *) val (rAddr : int, others) = ldArgs(t, stackAddr, t'); val (regEntry, regCode) = loadToSpecificReg (transtable, argReg, argLoc, false); in codeGenerate(regCode, cvec); lockRegister (transtable, argReg); (rAddr, regEntry :: others) end | ldArgs (argLoc::t, stackAddr : int, NONE :: t') = let (* Store on the real stack. *) (* We take the current stack pointer as the base for the stack args. *) val sAddr : int = if stackAddr < 0 then realstackptr transtable else stackAddr; val (pushedEntry, pushCode) = pushValueToStack (transtable, argLoc, sAddr + 1) val () = codeGenerate(pushCode, cvec) val (rAddr, others) = ldArgs(t, sAddr + 1, t') in (rAddr, pushedEntry :: others) end (* ldArgs *) | ldArgs _ = raise InternalError "ldArgs: Length mismatch" in ldArgs(argList, ~1, argLocations) end (* pushArgs *) val (endOfArgs, argEntries) = pushArgs argsOnPstack (* load regClosure *) val (codeAddrOpt, isIndirect, codeEntries, regsLocked) = loadProc (); val checkContiguous = (* Make sure that the arguments are contiguous on the stack and that there is nothing beyond them on it. *) if endOfArgs >= 0 then resetButReload (transtable, endOfArgs) else [] (* Record that we've called a function. *) val () = callsAFunction := true; val callCode = case codeAddrOpt of NONE => callFunction Recursive | SOME codeAddr => callCode(codeAddr, isIndirect, transtable) in codeGenerate(callCode @ checkContiguous, cvec); (* Unlock any registers we locked. *) List.app (fn r => codeGenerate(unlockRegister (transtable, r), cvec)) (lockedRegs @ regsLocked); (* Remove the arguments and code/closure registers. *) List.app (fn index => codeGenerate(removeStackEntry(transtable, index), cvec)) (codeEntries @ argEntries); (* Remove any registers from the cache which may have been modified by the function. *) codeGenerate(removeRegistersFromCache(transtable, modifiedRegisters), cvec) end; (* Set up the results of the function call. *) (* Unlock the argument registers. *) List.app(fn SOME r => codeGenerate(unlockRegister (transtable, r), cvec) | NONE => ()) argLocations; (* Remove any stack arguments. Don't do this for tail calls*) if isTail then exiting transtable else List.app(fn SOME _ => () | NONE => decsp(transtable, 1)) argLocations; if not needsResult then NoMerge (* Unused *) else ( (* Result is returned in regResult. *) codeGenerate(addRegUse (transtable, regResult), cvec); (* Needed? *) MergeIndex(pushReg (transtable, regResult)) ) end (* callClosure *) fun codeRTSFunction(instr, arguments, whereto) = case checkAndReduce(instr, arguments, fn (BICConstnt(w, _)) => SOME w | _ => NONE) of SOME(i, args) => let (* Code generate each argument to the pstack. *) val argLocns = List.map (fn arg => genToStack (arg)) args val (opRes, opCode) = dataOp (argLocns, i, transtable, whereto) val () = codeGenerate(opCode, cvec) in (* Put in the result. *) case whereto of NoResult => NoMerge (* Unused. *) | _ => MergeIndex opRes end | NONE => (* Have to use a function call *) callClosure (SOME evalFun, true) in (* body of genEval *) case evalFun of BICConstnt (oper, _) => let val args = List.map #1 argList val addr = toAddress oper in if isIoAddress addr then ( if wordEq (oper,ioOp POLY_SYS_thread_self) then codeRTSFunction(instrThreadSelf, args, whereto) else if wordEq (oper,ioOp POLY_SYS_get_length) then codeRTSFunction(instrVeclen, args, whereto) else if wordEq (oper,ioOp POLY_SYS_get_flags) then codeRTSFunction(instrVecflags, args, whereto) else if wordEq (oper,ioOp POLY_SYS_get_first_long_word) then codeRTSFunction(instrGetFirstLong, args, whereto) else if wordEq (oper,ioOp POLY_SYS_string_length) then codeRTSFunction(instrStringLength, args, whereto) else if wordEq (oper,ioOp POLY_SYS_set_string_length) then codeRTSFunction(instrSetStringLength, args, whereto) else if wordEq (oper,ioOp POLY_SYS_aplus) then codeRTSFunction(instrAddA, args, whereto) else if wordEq (oper,ioOp POLY_SYS_aminus) then codeRTSFunction(instrSubA, args, whereto) else if wordEq (oper,ioOp POLY_SYS_amul) then codeRTSFunction(instrMulA, args, whereto) (* Negation is coded as 0 - X. *) else if wordEq (oper,ioOp POLY_SYS_aneg) then codeRTSFunction(instrSubA, constntZero :: args, whereto) (* Boolean "not" is coded as xor with "true" *) else if wordEq (oper,ioOp POLY_SYS_not_bool) then codeRTSFunction(instrXorW, args @ [constntTrue], whereto) else if wordEq (oper,ioOp POLY_SYS_or_word) then codeRTSFunction(instrOrW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_and_word) then codeRTSFunction(instrAndW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_xor_word) then codeRTSFunction(instrXorW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_shift_left_word) then codeRTSFunction(instrUpshiftW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_shift_right_word) then codeRTSFunction(instrDownshiftW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_shift_right_arith_word) then codeRTSFunction(instrDownshiftArithW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_xor_word) then codeRTSFunction(instrXorW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_mul_word) then codeRTSFunction(instrMulW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_plus_word) then codeRTSFunction(instrAddW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_minus_word) then codeRTSFunction(instrSubW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_div_word) then codeRTSFunction(instrDivW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_mod_word) then codeRTSFunction(instrModW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_load_byte) then codeRTSFunction(instrLoadB, args, whereto) else if wordEq (oper,ioOp POLY_SYS_load_word) then codeRTSFunction(instrLoad, args, whereto) else if wordEq (oper,ioOp POLY_SYS_atomic_incr) then codeRTSFunction(instrAtomicIncr, args, whereto) else if wordEq (oper,ioOp POLY_SYS_atomic_decr) then codeRTSFunction(instrAtomicDecr, args, whereto) else if wordEq (oper,ioOp POLY_SYS_alloc_store) then let (* This is used to allocate all memory apart from tuples and closures. We particularly want to be able to profile the allocation of refs so we consider them specially. *) in case args of [BICConstnt(len, _), BICConstnt(flag, _), initValArg] => if isShort len andalso toShort len = 0w1 andalso isShort flag andalso toShort flag = Word.fromLargeWord(Word8.toLargeWord F_mutable) then let val initLoc = genToStackOrGeneralRegister (initValArg) val (vec, vecCode) = callgetvec (1, F_mutable, whereto, transtable) val () = codeGenerate(vecCode, cvec) val moveCode = moveToVec (vec, initLoc, 0, transtable) val () = codeGenerate(moveCode, cvec) val () = codeGenerate(allocationComplete, cvec) in case whereto of NoResult => NoMerge (* Unused. *) | _ => MergeIndex vec end else codeRTSFunction(instrAllocStore, args, whereto) | _ => codeRTSFunction(instrAllocStore, args, whereto) end else if wordEq (oper,ioOp POLY_SYS_assign_word) then codeRTSFunction(instrStoreW, args, whereto) else if wordEq (oper,ioOp POLY_SYS_assign_byte) then codeRTSFunction(instrStoreB, args, whereto) else if wordEq(oper, ioOp POLY_SYS_lockseg) then codeRTSFunction(instrLockSeg, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Add_real) then codeRTSFunction(instrAddFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Sub_real) then codeRTSFunction(instrSubFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Mul_real) then codeRTSFunction(instrMulFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Div_real) then codeRTSFunction(instrDivFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Abs_real) then codeRTSFunction(instrAbsFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_Neg_real) then codeRTSFunction(instrNegFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_int_to_real) then codeRTSFunction(instrIntToRealFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_real_to_int) then codeRTSFunction(instrRealToIntFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_sqrt_real) then codeRTSFunction(instrSqrtFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_sin_real) then codeRTSFunction(instrSinFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_cos_real) then codeRTSFunction(instrCosFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_arctan_real) then codeRTSFunction(instrAtanFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_exp_real) then codeRTSFunction(instrExpFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_ln_real) then codeRTSFunction(instrLnFP, args, whereto) else if wordEq (oper,ioOp POLY_SYS_move_bytes) then codeRTSFunction(instrMoveBytes, args, whereto) else if wordEq (oper,ioOp POLY_SYS_move_words) then codeRTSFunction(instrMoveWords, args, whereto) (* The point of the following code is to call genCond, which will call genTest which will hopefully use machine instructions for these operations. We could avoid this by duplicating most of the body of genTest (the "jumping" boolean code generator) here, but we would like to avoid that. *) else if primBoolOps andalso (wordEq (oper,ioOp POLY_SYS_word_eq) orelse wordEq (oper,ioOp POLY_SYS_word_neq) orelse wordEq (oper,ioOp POLY_SYS_equala) orelse wordEq (oper,ioOp POLY_SYS_int_geq) orelse wordEq (oper,ioOp POLY_SYS_int_leq) orelse wordEq (oper,ioOp POLY_SYS_int_gtr) orelse wordEq (oper,ioOp POLY_SYS_int_lss) orelse wordEq (oper,ioOp POLY_SYS_word_geq) orelse wordEq (oper,ioOp POLY_SYS_word_leq) orelse wordEq (oper,ioOp POLY_SYS_word_gtr) orelse wordEq (oper,ioOp POLY_SYS_word_lss) orelse wordEq (oper,ioOp POLY_SYS_Real_eq) orelse wordEq (oper,ioOp POLY_SYS_Real_neq) orelse wordEq (oper,ioOp POLY_SYS_Real_geq) orelse wordEq (oper,ioOp POLY_SYS_Real_leq) orelse wordEq (oper,ioOp POLY_SYS_Real_gtr) orelse wordEq (oper,ioOp POLY_SYS_Real_lss) orelse wordEq (oper,ioOp POLY_SYS_is_short) orelse wordEq (oper,ioOp POLY_SYS_bytevec_eq)) then genCond (BICEval {function = evalFun, argList = argList, resultType=resultType}, constntTrue, constntFalse, whereto, tailKind, NONE) else (* unoptimised I/O call *) callClosure (SOME evalFun, true) ) else (* All other constant functions. *) callClosure (SOME evalFun, true) end | BICExtract (ext, lastRef) => let (* Local function with non-empty closure. *) val selfCall = case ext of BICLoadRecursive => true | _ => false (* We cannot make a tail-recursive call to a function whose closure is on the current stack because that would remove the closure. *) val canTail = case ext of BICLoadLocal addr => let val index = Array.sub(decToPstack, addr) in not(isContainer(index, transtable)) end | _ => true in (* Set the use count on the closure register if this is a recursive call. We have to do that for the recursive case because we don't pass the BICExtract entry in to callClosure. DCJM 1/12/99. *) if selfCall andalso not lastRef andalso closureLifetime <>0 then codeGenerate(incrUseCount(transtable, closureOrSlAddr, 1), cvec) else (); callClosure (if selfCall then NONE else SOME evalFun, canTail) end (* BICExtract *) | evalLambda as BICLambda{heapClosure, ...} => (* If we're going to put the closure on the stack we can't call it with tail-recursion. *) callClosure (SOME evalLambda, heapClosure) | _ => (* The function is not being found by simply loading a value from the stack or the closure and is not a constant. *) callClosure (SOME evalFun, true) end (* genEval *) and codeBinding specific (BICDeclar{addr, value, references}) = (* Declaration. *) let (* If the result of this block is this declaration choose a preferred register. *) val dest = case specific of SOME(destAddr, whereto) => if addr = destAddr then whereto else NoHint | NONE => NoHint in case value of BICLambda lam => let fun nextMutual dec = codeGenerate(localDeclaration (dec, addr, references), cvec) val _ = genProc (lam, nextMutual, dest) in () end | _ => let val res = gencde (value, true, dest, NotEnd, NONE) val decl = case res of MergeIndex index => index | NoMerge => raise InternalError "genToStack: no result" in codeGenerate(localDeclaration (decl, addr, references), cvec) end end | codeBinding _ (BICRecDecs dl) = let (* Mutually recursive declarations. These can only be functions. Recurse down the list pushing the addresses of the closure vectors or forward references to the code, then unwind the recursion and fill in closures or compile the code. *) local (* We now use the fact that decToPstack contains noindex to detect mutual recursion in genProc.*) fun setToEmpty({addr, ...}) = Array.update (decToPstack, addr, noIndex) in val () = List.app setToEmpty dl end fun genMutualDecs [] = () | genMutualDecs (({lambda, addr, references, ...})::ds) = let (* This function is called once the closure has been created but before the entries have been filled in. *) fun nextMutual r = let val () = codeGenerate(localDeclaration (r, addr, references), cvec) in (* Now time to do the other closures. *) genMutualDecs ds end val _ = genProc(lambda, nextMutual, NoHint) in () end in genMutualDecs dl end | codeBinding _ (BICNullBinding valu) = (* Expression in a sequence. *) ( gencde (valu, true, NoResult, NotEnd, NONE); () ) val resReg = resultReg(codeToCgType resultType) val _ = genToRegister (pt, UseReg(singleton resReg), EndOfProc resReg, NONE) val () = if not (haveExited transtable) then codeGenerate(exit (), cvec) else () in (* Having code generated the body of the function, it is copied into a new data segment. *) (!cvec, maxstack transtable, getModifedRegSet transtable, !callsAFunction) end (* codegen *) fun gencode (BICLambda { name, body, argTypes, resultType, argLifetimes, localCount, ...}, debugSwitches, _) = let (* We are compiling a function. *) (* It is not essential to treat this specially, but it saves generating a piece of code whose only function is to return the address of the function. *) (* make the code buffer for the new function. *) val profileObject = createProfileObject name val newCode = codeCreate (false (* don't make a closure *), name, profileObject, debugSwitches); (* The only non-local references will be references to the closure itself. We have to fetch these from the constants section because: (1) we don't save the closure register in the function body (2) we don't even initialise it if we use the PureCode calling convention SPF 2/1/97 *) val (ops, maxStack, regList, callsAFunction) = codegen (body, fn (_ , _, newtab) => (pushCodeRef (newtab, newCode), []), 0, (* Discard regClosure *) argTypes, argLifetimes, resultType, localCount, profileObject, debugSwitches) val closureAddr = copyCode (newCode, ops, maxStack, regList, callsAFunction) in (* Result is a function which returns the address of the function. *) (fn () => (toMachineWord closureAddr), []) end | gencode (pt, debugSwitches, localCount) = let (* Compile a top-level expression. *) val profileObject = createProfileObject "" val newCode = codeCreate (false (* make a closure *), "", profileObject, debugSwitches); (* There should be *no* non-local references. *) val (ops, maxStack, regList, callsAFunction) = codegen (pt, fn _ => raise InternalError "top level reached", 0, (* Discard regClosure *) [], [], (* No args. *) GeneralType, (* General result (if any?) *) localCount, profileObject, debugSwitches) val closureAddr = copyCode (newCode, ops, maxStack, regList, callsAFunction) in (* Result is a function to execute the code. *) (fn () => call (closureAddr, toMachineWord ()), []) end (* gencode *) end; (* GCODE functor body *) polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/X86CODESIG.sml000066400000000000000000000177311265146633400235310ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2010, 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature X86CODESIG = sig type machineWord = Address.machineWord type short = Address.short type address = Address.address type code val sameCode: code * code -> bool datatype reg = GenReg of Word8.word * bool | FPReg of Word8.word val isX64: bool val eax: reg and ebx: reg and ecx: reg and edx: reg and edi: reg and esi: reg and esp: reg and ebp: reg and fp0: reg and fp1: reg and fp2: reg and fp3: reg and fp4: reg and fp5: reg and fp6: reg and fp7: reg and r8: reg and r9: reg and r10: reg and r11: reg and r12: reg and r13: reg and r14: reg and r15: reg (* For vector indexing we provide a numbering for the registers. *) val regs: int val regN: int -> reg val nReg: reg -> int val regRepr: reg -> string type addrs and labList val addrZero: addrs structure RegSet: sig eqtype regSet val singleton: reg -> regSet val allRegisters: regSet (* All registers: data, address, floating pt. *) val generalRegisters: regSet (* Registers checked by the GC. *) val floatingPtRegisters: regSet val noRegisters: regSet val isAllRegs: regSet->bool val regSetUnion: regSet * regSet -> regSet val regSetIntersect: regSet * regSet -> regSet val listToSet: reg list -> regSet val setToList: regSet -> reg list val regSetMinus: regSet * regSet -> regSet val inSet: reg * regSet -> bool val cardinality: regSet -> int val regSetRepr: regSet -> string val oneOf: regSet -> reg end val getRegisterSet: Word.word -> RegSet.regSet datatype arithOp = ADD | OR (*|ADC | SBB*) | AND | SUB | XOR | CMP and shiftType = SLL | SRL | SRA and repOps = CMPSB | MOVSB | MOVSL | STOSB | STOSL and fpOps = FADD | FMUL | FCOM | FCOMP | FSUB | FSUBR | FDIV | FDIVR and fpUnaryOps = FABS | FCHS | FSQRT | FSIN | FCOS | FPATAN | FLD1 | FLDZ and group3Ops = NOT | NEG | MUL | IMUL | DIV | IDIV datatype branchOps = JO | JNO | JE | JNE | JL | JGE | JLE | JG | JB | JNB | JNA | JA datatype callKinds = Recursive | ConstantClosure of machineWord | ConstantCode of machineWord | CodeFun of code | FullCall datatype label = Labels of { forward: labList ref, reverse: addrs ref, labId: int ref, uses: int ref, chain: label option ref } val mkLabel: unit -> label datatype indexType = NoIndex | Index1 of reg | Index2 of reg | Index4 of reg | Index8 of reg datatype memoryAddress = BaseOffset of { base: reg, offset: int, index: indexType } | ConstantAddress of machineWord datatype branchPrediction = PredictNeutral | PredictTaken | PredictNotTaken datatype operation = MoveRR of { source: reg, output: reg } | MoveConstR of { source: int, output: reg } | MoveLongConstR of { source: machineWord, output: reg } | LoadMemR of { source: memoryAddress, output: reg } | LoadByteR of { source: memoryAddress, output: reg } | PushR of reg | PushConst of int | PushLongConst of machineWord | PushMem of { base: reg, offset: int } | PopR of reg | ArithRR of { opc: arithOp, output: reg, source: reg } | ArithRConst of { opc: arithOp, output: reg, source: int } | ArithRLongConst of { opc: arithOp, output: reg, source: machineWord } | ArithRMem of { opc: arithOp, output: reg, offset: int, base: reg } | ArithMemConst of { opc: arithOp, offset: int, base: reg, source: int } | ArithMemLongConst of { opc: arithOp, offset: int, base: reg, source: machineWord } | ShiftConstant of { shiftType: shiftType, output: reg, shift: Word8.word } | ShiftVariable of { shiftType: shiftType, output: reg } (* Shift amount is in ecx *) | ConditionalBranch of { test: branchOps, label: label, predict: branchPrediction } | LockMutableSegment of reg | LoadAddress of { output: reg, offset: int, base: reg option, index: indexType } | LoadCodeRef of { output: reg, code: code } | TestTagR of reg | TestByteMem of { base: reg, offset: int, bits: word } | CallRTS of int | StoreRegToMemory of { toStore: reg, address: memoryAddress } | StoreConstToMemory of { toStore: int, address: memoryAddress } | StoreLongConstToMemory of { toStore: machineWord, address: memoryAddress } | StoreByteRegToMemory of { toStore: reg, address: memoryAddress } | StoreByteConstToMemory of { toStore: Word8.word, address: memoryAddress } | AllocStore of { size: int, output: reg } | AllocStoreVariable of reg | StoreInitialised | CallFunction of callKinds | JumpToFunction of callKinds | ReturnFromFunction of int | RaiseException | UncondBranch of label | ResetStack of int | InterruptCheck | JumpLabel of label | TagValue of { source: reg, output: reg } (* Some of these operations are higher-level and should be reduced. *) | LoadHandlerAddress of { handlerLab: addrs ref, output: reg } | StartHandler of { handlerLab: addrs ref } | IndexedCase of { testReg: reg, workReg: reg, min: word, cases: label list } | FreeRegisters of RegSet.regSet | MakeSafe of reg | RepeatOperation of repOps | Group3Ops of reg * group3Ops | AtomicXAdd of {base: reg, output: reg} | FPLoadFromGenReg of reg | FPLoadFromFPReg of { source: reg, lastRef: bool } | FPLoadFromConst of real | FPStoreToFPReg of { output: reg, andPop: bool } | FPStoreToMemory of { base: reg, offset: int, andPop: bool } | FPArithR of { opc: fpOps, source: reg } | FPArithConst of { opc: fpOps, source: machineWord } | FPArithMemory of { opc: fpOps, base: reg, offset: int } | FPUnary of fpUnaryOps | FPStatusToEAX | FPLoadIntAndPop | FPFree of reg | PreAddDetag of reg type operations = operation list val printOperation: operation * (string -> unit) -> unit val codeCreate: bool * string * machineWord * Universal.universal list -> code (* makes the initial segment. *) (* Code generate operations and construct the final code. *) val createCodeSegment: operations * RegSet.regSet * code -> address val addCompletionHook: code * (code * machineWord -> unit) -> unit val codeAddress: code -> address option val procName: code -> string (* Name of the procedure. *) val memRegHandlerRegister: int and memRegRaiseDiv: int and memRegArbEmulation: int and memRegThreadSelf: int and memRegStackLimit: int and memRegStackOverflowCall: int and memRegStackOverflowCallEx: int (* Debugging controls and streams for optimiser. *) val lowLevelOptimise: code -> bool val printLowLevelCode: operation list * code -> unit structure Sharing: sig type code = code and reg = reg and addrs = addrs and operation = operation and regSet = RegSet.regSet and label = label and labList = labList end end; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/X86LOWLEVEL.ML000066400000000000000000003464341265146633400234270ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2010, 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Produce the low-level code for the X86. *) functor X86LOWLEVEL ( structure X86CODE: X86CODESIG structure X86OPTIMISE: sig type operation type code type operations = operation list val optimise: code * operations -> operations structure Sharing: sig type operation = operation type code = code end end sharing X86CODE.Sharing = X86OPTIMISE.Sharing ) : CODECONSSIG = struct open Address open Misc open X86CODE open RegSet infix 5 << <<+ <<- >> >>+ >>- ~>> ~>>+ ~>>- (* Shift operators *) infix 3 andb orb xorb andbL orbL xorbL andb8 orb8 xorb8 val op orb = Word.orb val op andb8 = Word8.andb val wordToWord8 = Word8.fromLargeWord o Word.toLargeWord and word8ToWord = Word.fromLargeWord o Word8.toLargeWord val exp2_30 = 0x40000000 (* This actually checks that the value will fit in 31 bits because we normally have to tag it later. *) fun is31bitSigned a = isShort a andalso let val aI = Word.toIntX(toShort a) in ~exp2_30 <= aI andalso aI < exp2_30 end (* tag a short constant *) fun tag c = 2 * c + 1; (* shift a short constant, but don't set tag bit *) fun semitag c = 2 * c; (* Not real registers. *) val regNone = NONE; val regClosure = edx; (* Addr. of closure for fn. call goes here. *) val regStackPtr = esp; datatype argType = ArgGeneral | ArgFP (* The first two general arguments are passed in eax and ebx (X86/32) or the first five arguments (X86/64), with the first three floating point args in fp0, fp1, fp2. The cost of pushing floating point values to the stack is high so it's almost certainly better to use registers if possible. *) fun argRegs l = let fun allocReg ([], _, _) = [] | allocReg (ArgGeneral :: l, genReg :: genRegs, fpRegs) = SOME genReg :: allocReg(l, genRegs, fpRegs) | allocReg (ArgFP :: l, genRegs, fpReg :: fpRegs) = SOME fpReg :: allocReg(l, genRegs, fpRegs) | allocReg (_ :: l, genRegs, fpRegs) = NONE :: allocReg(l, genRegs, fpRegs) in allocReg(l, if isX64 then [eax, ebx, r8, r9, r10] else [eax, ebx], [fp0, fp1, fp2]) end fun resultReg ArgGeneral = eax (* Result is in eax *) | resultReg ArgFP = fp0 (* Result is in fp0 *) infix 7 ** infix 6 ++ -- infix 4 ins val op ** = regSetIntersect and op ++ = regSetUnion and op -- = regSetMinus and op ins = inSet fun allocStore{size, flags, output} = if isX64 andalso flags <> 0w0 then [StoreByteConstToMemory{toStore=flags, address=BaseOffset{offset= ~1, base=output, index=NoIndex}}, StoreConstToMemory{toStore=size, address=BaseOffset{offset= ~wordSize, base=output, index=NoIndex}}, AllocStore{size=size, output=output}] else let val lengthWord = IntInf.orb(size, IntInf.<<(Word8.toInt flags, 0w24)) in [StoreConstToMemory{toStore=lengthWord, address=BaseOffset{offset= ~wordSize, base=output, index=NoIndex}}, AllocStore{size=size, output=output}] end val allocationComplete = [StoreInitialised] (* Code to load a floating point constant. *) fun loadFPConstant source = (* Real constants are the addresses of 64-bit quantities on the heap. *) let val realConst: real = if isShort source then (* This can occur when the higher level puts a dummy zero value on after raising an exception. *) if toShort source = 0w0 then 0.0 else raise InternalError "moveConstantToRegister: short real value" else if getFlags(toAddress source) <> F_bytes orelse length(toAddress source) <> 0w8 div Word.fromInt wordSize then raise InternalError "moveConstantToRegister to fp reg: invalid source" else RunCall.unsafeCast source in FPLoadFromConst realConst end datatype implement = ImplementGeneral | ImplementLiteral of machineWord (* | checkAndReduce(InstrMulA, args as [arg1, arg2], mapper) = ( (* The only special case we recognise is multiplication by 2. *) case List.map mapper args of [_, SOME lit] => if isShort lit andalso toShort lit = 0w2 then SOME(InstrMulAConst2, [arg1]) else SOME(InstrMulA, args) | [SOME lit, _] => if isShort lit andalso toShort lit = 0w2 then SOME(InstrMulAConst2, [arg2]) else SOME(InstrMulA, args) | _ => SOME(InstrMulA, args) ) *) (* Argument negotiation. The idea is to get the arguments into the "best" locations for the instruction. *) datatype regHint = UseReg of regSet | NoHint | NoResult (* These are almost the same as source values except that a value may be in more than one register. *) datatype actionSource = ActLiteralSource of machineWord | ActInRegisterSet of { modifiable: RegSet.regSet, readable: RegSet.regSet} | ActBaseOffset of reg * int | ActCodeRefSource of code (* The address of another function *) | ActStackAddress of int (* Offset within the stack. *) datatype argAction = ActionDone of (* The output register if any and the final operation. *) { outReg: reg option, operation: operations } | ActionLockRegister of (* Lock the register of an argument. *) { argNo: int, reg: reg, willOverwrite: bool, next: nextAction } | ActionLoadArg of (* Load an argument into a register. *) { argNo: int, regSet: regSet, willOverwrite: bool, next: nextAction } | ActionGetWorkReg of (* Get a work/result register. *) { regSet: regSet, setReg: reg -> nextAction } withtype nextAction = actionSource list -> argAction type negotiation = regHint -> nextAction and negotiateTests = unit -> nextAction * label type 'a instrs = 'a list * ('a -> machineWord option) -> (negotiation * 'a list) option and 'a tests = 'a list * ('a -> machineWord option) -> (negotiateTests * 'a list) option type forwardLabel = label and backwardLabel = label fun negotiateArguments(perform, pref) = perform pref and negotiateTestArguments perform = perform() (* See if the instruction is implemented but otherwise do nothing else. Nearly all the operations are implemented on this architecture. *) fun checkAndReduce(instr, args, f) = instr(args, f) and checkAndReduceBranches(tests, args, f) = tests(args, f) (* Exported versions of operations datatype *) fun callFunction v = [CallFunction v] and jumpToFunction v = [JumpToFunction v] and returnFromFunction v = [ReturnFromFunction v] and indexedCase { testReg, workReg, minCase, maxCase, isArbitrary, isExhaustive } = let val defaultLab as Labels{uses=defUses, ...} = mkLabel() fun makeLab _ = let val lab as Labels{uses, ...} = mkLabel() in uses := 1; lab end val indexLabels = List.tabulate(Word.toInt(maxCase-minCase+0w1), makeLab) val testCode = if isExhaustive then [] else let (* If this is an arbitrary precision int we need to check it's short and go to the default if it isn't. *) val testTag = if isArbitrary then ( defUses := 3; [ConditionalBranch{test=JE, predict=PredictNotTaken, label=defaultLab}, TestTagR testReg] ) else (defUses := 2; []) (* Range checks. *) val range1 = [ConditionalBranch{test=JB, predict=PredictNotTaken, label=defaultLab}, ArithRConst{ opc=CMP, output=testReg, source=tag(Word.toInt minCase) }] val range2 = [ConditionalBranch{test=JA, predict=PredictNotTaken, label=defaultLab}, ArithRConst{ opc=CMP, output=testReg, source=tag(Word.toInt maxCase) }] in range2 @ range1 @ testTag end val code = [IndexedCase{testReg=testReg, workReg=workReg, min=minCase, cases=indexLabels}] @ testCode in (code, indexLabels, defaultLab) end and forwardJumpLabel v = [JumpLabel v] and jumpBack (v as Labels{uses, ...}) = (uses := !uses+1; [UncondBranch v]) (* We're only interested in when floating point registers are freed in order to optimise the code. For the moment at least we don't use FFree here because that actually generates code and the higher levels call freeRegister after branches which puts them in the wrong position. *) and activeRegister _ = [] and freeRegister r = if r ins floatingPtRegisters then [FreeRegisters(singleton r)] else [] and moveRegisterToRegister(source as GenReg _, output as GenReg _) = [MoveRR{source=source, output=output}] | moveRegisterToRegister(source as GenReg _, output as FPReg _) = [FPStoreToFPReg{output=output, andPop=true}, FPLoadFromGenReg source] | moveRegisterToRegister(source as FPReg _, output as FPReg _) = [FPStoreToFPReg{output=output, andPop=true}, FPLoadFromFPReg{source=source, lastRef=false}] | moveRegisterToRegister(source as FPReg _, output as GenReg _) = (* We need to allocate memory to contain the value. *) [StoreInitialised, FPStoreToMemory{ base=output, offset=0, andPop=true }, FPLoadFromFPReg{source=source, lastRef=false}] @ allocStore{size=8 div wordSize, flags=F_bytes, output=output} and moveMemoryToRegister(base, offset, output) = (* Destination can only be a general register not a FP reg. *) [LoadMemR{source=BaseOffset{base=base, offset=offset, index=NoIndex}, output=output}] and moveConstantToRegister(lit, output as GenReg _) = if isShort lit then [MoveConstR{source=tag(Word.toIntX(toShort lit)), output=output}] else [MoveLongConstR{source=lit, output=output}] | moveConstantToRegister(source, output as FPReg _) = (* Real constants are the addresses of 64-bit quantities on the heap. *) [FPStoreToFPReg{output=output, andPop=true}, loadFPConstant source] and moveCodeRefToRegister(code, output) = (* The address of another function *) [LoadCodeRef{code=code, output=output}] (* Set a register to an address in the stack. Just a reg-reg move if offset is zero otherwise a load-address. *) and moveStackAddress(0, output) = [MoveRR{source=esp, output=output}] | moveStackAddress(stackAddr, output) = [LoadAddress{base=SOME esp, offset=stackAddr*wordSize, index=NoIndex, output=output}] and storeRegisterToStack(reg, loc) = if loc < 0 then raise InternalError "storeRegisterToStack: Negative stack offset" else [StoreRegToMemory{toStore=reg, address=BaseOffset{offset=loc, base=esp, index=NoIndex}}] and storeConstantToStack(lit, loc) = let val addr = BaseOffset{offset=loc, base=regStackPtr, index=NoIndex} in if loc < 0 then raise InternalError "storeRegisterToStack: Negative stack offset" else if isShort lit then [StoreConstToMemory{toStore=tag(Word.toIntX(toShort lit)), address=addr}] else [StoreLongConstToMemory{toStore=lit, address=addr}] end fun pushRegisterToStack v = [PushR v] and pushMemoryToStack(reg, offset) = [PushMem{base=reg, offset=offset}] fun pushConstantToStack lit = if is31bitSigned lit (* Push only allows a 32-bit literal *) then [PushConst(tag(Word.toIntX(toShort lit)))] else [PushLongConst lit] fun resetStack 0 = [] | resetStack n = if n < 0 then raise InternalError "resetStack: negative" else [ResetStack n] val raiseException = [RaiseException] val interruptCheck = [InterruptCheck] val pushToReserveSpace = pushConstantToStack(toMachineWord 0) fun uncondBranch() = let val label as Labels{uses, ...} = mkLabel() in uses := 1; ([UncondBranch label], label) end fun condBranch(test, predict) = let val label as Labels{uses, ...} = mkLabel() in uses := 1; ([ConditionalBranch{test=test, predict=predict, label=label}], label) end fun backJumpLabel() = let val loopLabel = mkLabel() in ([JumpLabel loopLabel], loopLabel) end fun loadCurrentHandler output = [LoadMemR{ source=BaseOffset{base=ebp, offset=memRegHandlerRegister, index=NoIndex}, output=output }] and storeToHandler reg = [StoreRegToMemory{ toStore=reg, address=BaseOffset{offset=memRegHandlerRegister, base=ebp, index=NoIndex}}] val pushCurrentHandler = [PushMem{base=ebp, offset=memRegHandlerRegister}] fun loadHandlerAddress v = [LoadHandlerAddress v] (* Start of handler. Set the label, reload esp from the handler register, remove the handler address and restore old handler. *) and startHandler v = storeToHandler ebx @ [ ResetStack 2, LoadMemR{ source=BaseOffset{base=esp, offset=wordSize, index=NoIndex}, output=ebx }] @ loadCurrentHandler esp @ [StartHandler v] (* Default action for all operations. *) local datatype source = InRegister of reg | LiteralSource of machineWord | BaseOffsetSource of { base: reg, offset: int } fun getArg(instr, regSet, outputReg, operands) args = let (* Take each NONE in the operand list and replace it with the appropriate operand. *) fun nextArg([], [], _) = (* All done *) ActionDone{ outReg=outputReg, operation=instr(List.map valOf operands, outputReg) } | nextArg(NONE :: otherOps, arg :: _, argNo) = ( case arg of (* Look at the next argument *) (ActInRegisterSet{ readable, ...}) => if regSetIntersect(readable, regSet) <> noRegisters then let val aReg = oneOf(regSetIntersect(readable, regSet)) in (* It's in a register. Lock it, record it and go on to the next arg. *) ActionLockRegister{argNo=argNo, reg=aReg, willOverwrite=false, next=getArg(instr, regSet, outputReg, List.take(operands, argNo) @ (SOME(InRegister aReg) :: otherOps))} end else ActionLoadArg{argNo=argNo, regSet=regSet, willOverwrite=false, (* Load into a register - won't modify it afterwards. Next action is to look at this again after it's been loaded. *) next=getArg(instr, regSet, outputReg, operands)} | _ => (* If the value is not in a register we need to load it first to a general register even if the eventual destination is a floating pt reg. *) ActionLoadArg{argNo=argNo, regSet=generalRegisters, willOverwrite=false, (* Load into a register - won't modify it afterwards. Next action is to look at this again after it's been loaded. *) next=getArg(instr, regSet, outputReg, operands)} ) | nextArg(SOME _ :: otherOps, _ :: otherArgs, argNo) = nextArg(otherOps, otherArgs, argNo+1) | nextArg _ = raise Empty in nextArg(operands, args, 0) end (* Replace an entry in the operand list, which should be NONE, with SOME operand. *) fun replaceOperand(n, repWith) (operands, results) = case List.nth(operands, n) of NONE => (List.take(operands, n) @ SOME repWith :: List.drop(operands, n+1), results) | SOME _ => raise InternalError "replaceOperand: Operand already present" fun generateInstruction genInstr (operands, results) _ = ActionDone{ outReg=results, operation=genInstr(List.map valOf operands, results) } (* If we have specified a preferred register set use one of those unless they're already in use. *) fun prefAsSet(UseReg regs, regSet, operands) = let fun inUse(SOME(InRegister r), s) = s ++ singleton r | inUse(_, s) = s val available = (regs ** regSet) -- List.foldl inUse noRegisters operands in if available <> noRegisters then singleton (oneOf available) else regSet end | prefAsSet(_, regSet, _) = regSet (* Get a register for the results. In some cases, e.g. loadWord/byte we may already have a result register. *) fun getResultRegister(regSet, pref: regHint, whenDone) (operands, NONE) _ = ActionGetWorkReg{regSet=prefAsSet(pref, regSet, operands), (* Use the preferred destination. *) setReg = fn reg => whenDone (operands, SOME reg)} | getResultRegister(_, _, whenDone) operandAndResults args = whenDone operandAndResults args fun getWorkingRegister(regSet, whenDone) opAndResults _ = ActionGetWorkReg{regSet=regSet, setReg = fn reg => whenDone reg opAndResults} (* Load the argument to one of a set of possible registers. *) fun loadToOneOf(regSet, overWrite, argNo, whenDone) opAndResults args = case List.nth(args, argNo) of (ActInRegisterSet{ modifiable, readable, ...}) => let val chooseFrom = if overWrite then modifiable else readable in if regSetIntersect(regSet, chooseFrom) <> noRegisters then let val aReg = oneOf(regSetIntersect(chooseFrom, regSet)) in ActionLockRegister{argNo=argNo, reg=aReg, willOverwrite=overWrite, next=whenDone (replaceOperand(argNo, InRegister aReg) opAndResults)} end else (* Not in the right register - move it. *) ActionLoadArg{argNo=argNo, regSet=regSet, willOverwrite=overWrite, next=loadToOneOf(regSet, overWrite, argNo, whenDone) opAndResults} end | _=> let (* We can't load directly into a floating point register so if the set does not include any general registers we first need to load the value into a general register and then once it's in a register move it over. Actually, we're not loading from the general register to the floating point register: the "move" involves loading the boxed value that contains the real number into the fp register. *) val (loadSet, write) = if regSetIntersect(regSet, generalRegisters) <> noRegisters then (regSet, overWrite) else (generalRegisters, false) in ActionLoadArg{argNo=argNo, regSet=loadSet, willOverwrite=write, next=loadToOneOf(regSet, overWrite, argNo, whenDone) opAndResults} end (* Load to a register (read-only) or, if it's a literal leave it. In 64-bit mode we load anything that won't fit in 32-bits when tagged. *) fun loadToRegOrLiteral(regSet, argNo, whenDone) opAndResults args = case List.nth(args, argNo) of ActLiteralSource lit => if not isX64 orelse is31bitSigned lit then whenDone (replaceOperand(argNo, LiteralSource lit) opAndResults) args else loadToOneOf(regSet, false, argNo, whenDone) opAndResults args | _ => loadToOneOf(regSet, false, argNo, whenDone) opAndResults args (* Load a base address for a load or store operation. We can use a constant source but only if the index is zero. The base address is the first argument and the index is the second. We can't use a constant base address in 64-bit mode because inline addresses aren't possible (the equivalent code means PC-relative). *) fun loadBaseAddress (pref, whenDone) (opAndResults as (_, resReg)) (args as (ActLiteralSource base :: ActLiteralSource index :: _)) = if isShort index andalso toShort index = 0w0 andalso not isX64 then whenDone (replaceOperand(0, LiteralSource base) opAndResults) args else ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite= case (pref, resReg) of (NoResult, _) => false | (_, SOME _) => false | _ => true, next=loadBaseAddress(pref, whenDone) opAndResults} | loadBaseAddress (pref, whenDone) (opAndResults as (ops, resReg)) (ActInRegisterSet{modifiable, readable} :: _) = if modifiable ** generalRegisters <> noRegisters then let val reg = oneOf(prefAsSet(pref, modifiable ** generalRegisters, ops)) (* We can use this for the result if we want one and don't already have one. *) val (outReg, modify) = case (resReg, pref) of (_, NoResult) => (resReg, false) | (SOME _, _) => (resReg, false) | _ => (SOME reg, true) in ActionLockRegister { argNo=0, reg=reg, willOverwrite=modify, next=whenDone (replaceOperand(0, InRegister reg) (ops, outReg)) } end else if readable ** generalRegisters <> noRegisters (* The base register isn't modifiable. *) then let val reg = oneOf(prefAsSet(pref, readable ** generalRegisters, ops)) in ActionLockRegister { argNo=0, reg=reg, willOverwrite=false, next=whenDone (replaceOperand(0, InRegister reg) opAndResults) } end else ActionLoadArg { argNo=0, regSet=generalRegisters, willOverwrite=true, next=loadBaseAddress (pref, whenDone) opAndResults } | loadBaseAddress (pref, whenDone) (opAndResults as (_, resReg)) _ = (* It's not a literal or in a register - load it. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite= case (pref, resReg) of (NoResult, _) => false | (_, SOME _) => false | _ => true, next=loadBaseAddress(pref, whenDone) opAndResults} (* Process all the remaining arguments i.e. those with NONE in the argument list. *) fun allArgs (eachArg, whenDone) (operands as (opers, _)) = let (* Take each NONE in the operand list and replace it with the appropriate operand. *) fun nextArg([], _) = (* All done *) whenDone operands | nextArg(NONE :: _, argNo) = eachArg (argNo, fn operands => allArgs (eachArg, whenDone) operands) operands | nextArg(SOME _ :: otherOps, argNo) = nextArg(otherOps, argNo+1) in nextArg(opers, 0) end (* This deals with any remaining operands and puts them into registers. It is the fall-back in a lot of cases. *) fun allInRegisters (regSet, whenDone) = allArgs(fn (argNo, whenDone) => loadToOneOf(regSet, false, argNo, whenDone), whenDone) fun allInRegsOrLiterals (regSet, whenDone) = allArgs(fn (argNo, whenDone) => loadToRegOrLiteral(regSet, argNo, whenDone), whenDone) (* Some cases require arguments in specific registers. *) fun loadToSpecificReg(specReg, overWrite, argNo, whenDone) = loadToOneOf(singleton specReg, overWrite, argNo, whenDone) in (* Default if we don't need a result register. *) fun noresultNegotiator instr args = allInRegisters(generalRegisters, generateInstruction instr) (List.map(fn _ => NONE) args, NONE) args (* Default if we need a result which is different from the argument registers. *) fun generalNegotiator(instr, pref) args = getResultRegister(generalRegisters, pref, allInRegisters(generalRegisters, generateInstruction instr) ) (List.map(fn _ => NONE) args, NONE) args local (* Single argument case *) fun loadDestArg(instr, pref) [ActInRegisterSet{ modifiable, ...}] = if regSetIntersect(modifiable, generalRegisters) <> noRegisters then let val aReg = oneOf(regSetIntersect(modifiable, generalRegisters)) in ActionLockRegister{argNo=0, reg=aReg, willOverwrite=true, next=getArg(instr, generalRegisters, SOME aReg, [SOME(InRegister aReg)])} end else ActionLoadArg{argNo=0, regSet=prefAsSet(pref, generalRegisters, []), willOverwrite=true, next=loadDestArg(instr, pref)} | loadDestArg(instr, pref) [_] = (* Not in a register. *) ActionLoadArg{argNo=0, regSet=prefAsSet(pref, generalRegisters, []), willOverwrite=true, next=loadDestArg(instr, pref)} | loadDestArg _ _ = raise InternalError "loadDestArg: not a single argument" in val sharedSingleArgNegotiator = loadDestArg end local fun genStoreWord([base, index, value], NONE) = let val address = case (base, index) of (InRegister address, InRegister indexR) => if wordSize = 4 then BaseOffset{offset= ~2, base=address, index=Index2 indexR} (* Index is tagged so double *) else (*8*) BaseOffset{offset= ~4, base=address, index=Index4 indexR} | (InRegister address, LiteralSource offset) => BaseOffset{offset=Word.toInt(toShort offset)*wordSize, base=address, index=NoIndex} | (LiteralSource address, LiteralSource index) => if isShort index andalso toShort index = 0w0 andalso not isX64 then ConstantAddress address else raise InternalError "genStoreWord" | _ => raise InternalError "genStoreWord" in case value of InRegister storeReg => [StoreRegToMemory{toStore=storeReg, address=address}] | LiteralSource storeConst => if isShort storeConst then [StoreConstToMemory{ toStore=tag(Word.toIntX(toShort storeConst)), address=address}] else [StoreLongConstToMemory{ toStore=storeConst, address=address}] | BaseOffsetSource _ => raise InternalError "genStoreWord" end | genStoreWord _ = raise InternalError "genStoreWord" fun storeWordNegotiator _ = (* The first argument, the address needs to be in a register even if it's a constant. The others may be literals. Actually the first argument could be a constant as well if the offset is zero. *) loadBaseAddress(NoResult, loadToRegOrLiteral(generalRegisters, 1, loadToRegOrLiteral(generalRegisters, 2, generateInstruction genStoreWord ))) ([NONE, NONE, NONE], NONE) in val instrStoreW: 'a instrs = fn(args, _) => SOME(storeWordNegotiator, args) end local (* Remove the mutable bit from the flag byte. *) fun genLockSeg([InRegister reg], NONE) = [LockMutableSegment reg] | genLockSeg _ = raise InternalError "genLockSeg" in val instrLockSeg: 'a instrs = fn (args, _) => SOME(fn _ => noresultNegotiator genLockSeg, args) end local (* Load word or load byte. Load word with a constant offset is very common since it's used for refs. Load byte is more likely to be with an index and since we have to untag the index it's better to reuse it for the result if we can. *) fun loadIndex (pref, isWord, whenDone) (opAndResults as (ops, resReg)) (_ :: ActInRegisterSet{modifiable, readable} ::_) = if modifiable ** generalRegisters <> noRegisters then (* It's in a modifiable register. *) let val reg = oneOf(prefAsSet(pref, modifiable ** generalRegisters, ops)) (* We can use this for the result if we don't already have one. *) val outReg = case resReg of NONE => SOME reg | resReg => resReg in ActionLockRegister { argNo=1, reg=reg, willOverwrite=true, next=whenDone (replaceOperand(1, InRegister reg) (ops, outReg)) } end else if isWord andalso readable ** generalRegisters <> noRegisters (* We don't have a writable index register. If this is a word operation we can use a readable one but if it's a byte operation we need to use a writable one. *) then let val reg = oneOf(readable ** generalRegisters) in ActionLockRegister { argNo=1, reg=reg, willOverwrite=false, next=whenDone (replaceOperand(1, InRegister reg) opAndResults) } end else ActionLoadArg { argNo=1, regSet=generalRegisters, willOverwrite=true, next=loadIndex (pref, isWord, whenDone) opAndResults } | loadIndex (_, _, whenDone) opAndResults (args as [_, ActLiteralSource offset]) = (* Constant index - record it and go on to the base register *) whenDone (replaceOperand(1, LiteralSource offset) opAndResults) args | loadIndex (pref, isWord, whenDone) opAndResults _ = (* Not in a register or a literal. Load it. *) ActionLoadArg { argNo=1, regSet=generalRegisters, willOverwrite=true, next=loadIndex (pref, isWord, whenDone) opAndResults } fun genLoadInstr isWord ([LiteralSource base, LiteralSource offset], SOME destReg) = if isShort offset andalso toShort offset = 0w0 andalso not isX64 then [(if isWord then LoadMemR else LoadByteR) {source=ConstantAddress base, output=destReg}] else raise InternalError "genLoadWord: not zero" | genLoadInstr true (*Word*) ([InRegister base, LiteralSource offset], SOME destReg) = [LoadMemR{ source=BaseOffset{base=base, offset=Word.toInt(toShort offset)*wordSize, index=NoIndex}, output=destReg}] | genLoadInstr false (*Byte*) ([InRegister base, LiteralSource offset], SOME destReg) = (* Byte values need to be tagged. The offset is a byte offset. *) [TagValue{source=destReg, output=destReg}, LoadByteR{source=BaseOffset{base=base, offset=Word.toInt(toShort offset), index=NoIndex}, output=destReg}] | genLoadInstr true (*Word*) ([InRegister base, InRegister indexR], SOME destReg) = let val (offset, scale) = (* The index is tagged: Multiply by the wordSize/2 and subtract the scaled tag. *) if wordSize = 4 then (~2, Index2 indexR) else (~4, Index4 indexR) in [LoadMemR{source=BaseOffset{base=base, offset=offset, index=scale}, output=destReg}] end | genLoadInstr false (*Byte*) ([InRegister base, InRegister indexR], SOME destReg) = (* The index needs to be made safe unless it's actually the result. *) let val safeIndex = if indexR = destReg then [] else [MakeSafe indexR] (* Retag the index. *) in safeIndex @ [TagValue{source=destReg, output=destReg}, LoadByteR{source=BaseOffset{base=base, offset=0, index=Index1 indexR}, output=destReg}, ShiftConstant{shiftType=SRL, output=indexR, shift=0w1} (* Untag. *)] end | genLoadInstr _ _ = raise InternalError "genLoadInstr" fun genLoadWord isWord pref = loadIndex(pref, isWord, loadBaseAddress(pref, getResultRegister(generalRegisters, pref, generateInstruction(genLoadInstr isWord)) ) ) ([NONE, NONE], NONE) in fun instrLoad(args, _) = SOME(genLoadWord true, args) and instrLoadB(args, _) = SOME(genLoadWord false, args) end local (* The allocStore operation takes three arguments: a number of words to allocate, the flags byte to go into the newly allocated store, and the initial value for each of the words of the memory. We implement some common cases here and leave the rest to the allocator in the RTS. *) fun genFixedAlloc(length, flags) ([InRegister initReg], SOME output) = let fun initialiser n = StoreRegToMemory{ toStore=initReg, address=BaseOffset{offset=n * wordSize, base=output, index=NoIndex}} in [StoreInitialised] @ List.tabulate(length, initialiser) @ allocStore{size=length, flags=flags, output=output} end | genFixedAlloc _ _ = raise InternalError "genFixedAlloc" (* Allocate memory whose length isn't known at compile time and initialise it. *) fun genVarAlloc flags ([InRegister _(*ecx*), InRegister _(*eax*)], SOME _ (* edi*)) = let val initialiser = if (flags andb8 F_bytes) <> 0w0 then (* Initialise it as bytes. *) [MakeSafe eax, RepeatOperation STOSB, (* Untag the initialiser in eax. *) ShiftConstant{ shiftType=SRL, output=eax, shift=0w1}, (* Convert the length, which is in words, to bytes. *) ShiftConstant{shiftType=SLL, output=ecx, shift=if wordSize=4 then 0w2 else 0w3}] else [RepeatOperation STOSL] in [PopR edi, StoreInitialised] @ (* Pop the saved edi; initialisation done *) initialiser @ [ (* Now initialise the memory. *) (* Save edi before we start. *) PushR edi, (* Set the flags. At least the mutable bit should be set. *) StoreByteConstToMemory{ toStore=flags, address=BaseOffset{offset= ~1, base=edi, index=NoIndex}}, (* Store it as the length field. *) StoreRegToMemory{toStore=ecx, address=BaseOffset{base=edi, offset= ~wordSize, index=NoIndex}}, (* It's now safe to untag ecx *) ShiftConstant{ shiftType=SRL, output=ecx, shift=0w1}, (* Allocate the memory *) AllocStoreVariable edi, (* Compute the number of bytes into edi. The length in ecx is the number of words as a tagged value so we need to multiply it, add wordSize to include one word for the header then subtract the, multiplied, tag. *) if wordSize = 4 then LoadAddress{output=edi, base=SOME ecx, offset=wordSize-2, index=Index1 ecx } else LoadAddress{output=edi, base=NONE, offset=wordSize-4, index=Index4 ecx } ] end | genVarAlloc _ _ = raise InternalError "genVarAlloc" in (* Decide if we can implement it. *) fun instrAllocStore([lengthArg, flagArg, initValArg], mapper) = let (* This is used to allocate memory for refs, arrays, strings etc. The first arg is the length, the second the flags byte and the third the initial value used to initialise each word, for word segments, or byte for byte segs. *) val len = (* We only use the fixed length version for small segments of words (possibly with the noOverwrite/weak flag as well). *) case (mapper lengthArg, mapper flagArg) of (SOME constLength, SOME constFlags) => if toShort constLength < 0w5 andalso (wordToWord8(toShort constFlags) andb8 0w3) = F_words then SOME(toShort constLength) else NONE | _ => NONE in case mapper flagArg of NONE => NONE (* Non-constant flags: leave it to the RTS. *) | SOME constFlags => let val flags = wordToWord8(toShort constFlags) fun allocStoreFixedLength(length, flags) prefs = (* Get a result reg and put the initial value in a reg. *) generalNegotiator(genFixedAlloc(length, flags), prefs) fun allocStoreVarLength flags pref = (* When allocating vectors/arrays we have to initialise the store and the easiest way to do that is to put the length in ecx, the initialiser in eax and get the result in edi. *) loadToSpecificReg(ecx, true, 0, (* We don't actually need this to be modifiable if we're initialising with words. *) loadToSpecificReg(eax, true, 1, getResultRegister(singleton edi, pref, generateInstruction(genVarAlloc flags)))) ([NONE, NONE], NONE) in case len of SOME len => SOME(allocStoreFixedLength(Word.toInt len, flags), [initValArg]) | NONE => SOME(allocStoreVarLength flags, [lengthArg, initValArg]) end end | instrAllocStore _ = raise InternalError "instrAllocStore: Wrong number of args" end local fun makeTest(InRegister reg) = TestTagR reg | makeTest(BaseOffsetSource{base, offset}) = TestByteMem{base=base, offset=offset,bits=0w1} | makeTest _ = raise InternalError "makeTest" (* Test tags for the arguments and call the emulator if either is long. Unless the operation is just a comparison check for overflow and jump to the emulator if the operation overflowed. Rather than try to follow the static pattern we just generate the shortest code. *) fun testTags checkOverflow (operations, tag1, tag2) = let fun checkTag(LiteralSource l) = if isShort l then ([], []) else (* Long constant - shouldn't be code-generating. *) raise InternalError "testTags: long constant" | checkTag tag = let val (code, lab) = condBranch(JE, PredictNotTaken) in (code @ [makeTest tag], forwardJumpLabel lab) end val (tag1Check, tag1Lab) = checkTag tag1 and (tag2Check, tag2Lab) = checkTag tag2 val (overflowCheck, overflowLab) = if checkOverflow then let val (code2, lab2) = condBranch(JO, PredictNotTaken) in (code2, (* Emulate if overflow. *) forwardJumpLabel lab2) end else ([], []) val (skipEmulatorCode, skipEmulatorLabel) = uncondBranch() val (backToInstrCode, backToInstrLabel) = backJumpLabel() in forwardJumpLabel skipEmulatorLabel @ jumpBack backToInstrLabel @ [CallRTS memRegArbEmulation] @ overflowLab @ tag2Lab @ tag1Lab @ skipEmulatorCode @ (* Skip the emulator call. *) overflowCheck @ operations (* The actual instruction *) @ backToInstrCode @ tag2Check @ tag1Check end in val testTagsForArithmetic = testTags true fun reverseTestOp JE = JE | reverseTestOp JNE = JNE | reverseTestOp JA = JB | reverseTestOp JB = JA | reverseTestOp JNA = JNB | reverseTestOp JNB = JNA | reverseTestOp JL = JG | reverseTestOp JG = JL | reverseTestOp JLE = JGE | reverseTestOp JGE = JLE | reverseTestOp _ = raise InternalError "reverseTestOp: unknown branch" (* If we're comparing a value with a short constant we don't need to emulate the comparison even if the value is actually long. We just need to look at the sign to decide if it's less or greater because every positive long form value is greater than any short value and every negative long form value is less than any short value. *) fun testTagsForComparison (shortTestAndJump, tag1, LiteralSource tag2Const, opc, destLab) = let (* The constant should always be short. *) val _ = isShort tag2Const orelse raise InternalError "testTagsForComparison: long" val (jumpOnLongCode, longLab) = condBranch(JE, PredictNotTaken) val (skipLongCode, skipLongLabel) = uncondBranch() val tag1Reg = case tag1 of InRegister reg => reg | _ => raise InternalError "testTagsForComparison: not reg" (* If we're jumping on greater (equal) we jump if the value is positive (sign bit clear). If less (equal) we jump if it's negative. We need to increment the reference count for the destination label. *) val Labels{uses, ...} = destLab val () = uses := !uses + 1 val skipOnSign = case opc of JG => ConditionalBranch{test=JE, predict=PredictNeutral, label=destLab} | JGE => ConditionalBranch{test=JE, predict=PredictNeutral, label=destLab} | JL => ConditionalBranch{test=JNE, predict=PredictNeutral, label=destLab} | JLE => ConditionalBranch{test=JNE, predict=PredictNeutral, label=destLab} | _ => raise InternalError "testTagsForComparison: opc" in forwardJumpLabel skipLongLabel @ [skipOnSign, TestByteMem{base=tag1Reg, offset= ~1, bits=word8ToWord F_negative}] @ forwardJumpLabel longLab @ skipLongCode @ shortTestAndJump @ jumpOnLongCode @ [makeTest tag1] end | testTagsForComparison (operations, tag1 as LiteralSource _, tag2, opc, destLab) = (* First argument is the constant - reverse the arguments and the test. *) testTagsForComparison(operations, tag2, tag1, reverseTestOp opc, destLab) | testTagsForComparison (operations, tag1, tag2, _, _) = testTags false (operations, tag1, tag2) (* Because short integers are normalised we can skip the tag tests completely when comparing short constants for equality. Otherwise we only need emulation if both arguments are long. *) fun eqTestTags(operations, LiteralSource l1, _, _, _) = if isShort l1 then operations else operations @ [CallRTS memRegArbEmulation] | eqTestTags(operations, _, LiteralSource l2, _, _) = if isShort l2 then operations else operations @ [CallRTS memRegArbEmulation] | eqTestTags(operations, tag1, tag2, _, _) = let val (code1, lab1) = condBranch(JNE, PredictTaken) and (code2, lab2) = condBranch(JNE, PredictTaken) in operations @ forwardJumpLabel lab1 @ forwardJumpLabel lab2 @ [CallRTS memRegArbEmulation] @ code2 @ [makeTest tag2] @ code1 @ [makeTest tag1] end fun noTagTest (operations, _, _) = operations (* When we don't need a test. *) end local (* Various instructions also affect the tag and that has to be reinstated after the operation. *) fun postTagAdjust(ADD, _) = [] (* Dealt with before the operation. *) | postTagAdjust(SUB, reg) = [ArithRConst{opc=ADD, source=1, output=reg}] | postTagAdjust(OR, _) = [] (* Doesn't affect the tag. *) | postTagAdjust(AND, _) = [] (* Doesn't affect the tag. *) | postTagAdjust(XOR, reg) = [ArithRConst{opc=ADD, source=1, output=reg}] | postTagAdjust(CMP, _) = raise InternalError "postTagAdjust" fun preTagAdjust(ADD, reg) = [PreAddDetag reg] | preTagAdjust _ = [] (* TODO: If we have the same argument on both sides (e.g. a+a) this seems to force them into different registers. That also involves a double tag test. *) (* First select an output register. Unless this is a SUB instruction we can choose a modifiable register from either argument. *) fun wordSelectDest (opT as (opcode, _)) pref [ActInRegisterSet{ modifiable=mod1, ... }, ActInRegisterSet{ modifiable=mod2, ...}] = let (* Assume that these are in general registers because of the type. If this is subtraction we can only use a register from the first argument. *) val options = case opcode of SUB => mod1 | _ => mod1 ++ mod2 in if options = noRegisters (* No suitable modifiable register is available. *) then ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=true, next = wordSelectDest opT pref } else (* There is one available. Pick a prefered reg is possible otherwise any. *) let val choice = oneOf(prefAsSet(pref, options, [])) in if choice ins mod1 then ActionLockRegister { argNo=0, reg=choice, willOverwrite=true, next=wordSelectedLeft (opT, choice) } else ActionLockRegister { argNo=1, reg=choice, willOverwrite=true, next=wordSelectedRight (opT, choice) } end end | wordSelectDest opT pref [ActInRegisterSet{ modifiable, ... }, _] = if modifiable = noRegisters (* No suitable modifiable register is available. *) then ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=true, next = wordSelectDest opT pref } else (* There is one available. Pick a prefered reg is possible otherwise any. *) let val choice = oneOf(prefAsSet(pref, modifiable, [])) in ActionLockRegister { argNo=0, reg=choice, willOverwrite=true, next=wordSelectedLeft(opT, choice) } end | wordSelectDest (opT as (SUB, _)) pref _ = (* Not reversible - load first arg. *) ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=true, next = wordSelectDest opT pref } | wordSelectDest opT pref [_, ActInRegisterSet{ modifiable, ... }] = if modifiable = noRegisters (* No suitable modifiable register is available. *) then ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=true, next = wordSelectDest opT pref } else (* There is one available. Pick a prefered reg is possible otherwise any. *) let val choice = oneOf(prefAsSet(pref, modifiable, [])) in ActionLockRegister { argNo=1, reg=choice, willOverwrite=true, next=wordSelectedRight(opT, choice) } end | wordSelectDest opT pref _ = (* Neither in reg - load first arg. *) ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=true, next = wordSelectDest opT pref } (* We have selected a result register. Get the other argument. *) and wordSelectedLeft ((opcode, tagTest), result) [_, ActInRegisterSet{ readable, ...}] = let val argReg = oneOf readable in ActionDone{ outReg=SOME result, operation=postTagAdjust(opcode, result) @ tagTest(ArithRR{opc=opcode, source=argReg, output=result} :: preTagAdjust(opcode, result), InRegister result, InRegister argReg)} end | wordSelectedLeft (opRes as ((opcode, tagTest), result)) [_, ActLiteralSource lit] = if isShort lit then let val intArg = Word.toIntX(toShort lit) val source = case opcode of ADD => semitag intArg (* Shift but don't tag. *) | SUB => semitag intArg | OR => tag intArg (* Could use either tag or semitag *) | AND => tag intArg (* Must include the tag bit *) | XOR => semitag intArg (* Leave the tag bit unchanged. *) | _ => raise InternalError "addWordArg: opcode" in ActionDone{ outReg=SOME result, operation=if intArg = 0 andalso opcode <> AND then [] (* Discard *) else tagTest([ArithRConst{opc=opcode, source=source, output=result}], InRegister result, LiteralSource lit)} end else (* Long literal - put it into a register. We'd have been better not code-generating this at all. *) ActionLoadArg{ argNo=1, regSet=generalRegisters, willOverwrite=false, next = wordSelectedLeft opRes } | wordSelectedLeft ((opcode, tagTest), result) [_, ActBaseOffset(base, offset)] = ActionDone{ outReg=SOME result, operation=postTagAdjust(opcode, result) @ tagTest(ArithRMem{opc=opcode, base=base, offset=offset, output=result} :: preTagAdjust(opcode, result), InRegister result, BaseOffsetSource{base=base, offset=offset})} | wordSelectedLeft _ _ = raise InternalError "addWordArg" and wordSelectedRight opRes (args as [ActLiteralSource lit, _]) = if isShort lit then wordSelectedLeft opRes (List.rev args) else (* Long literal - put it into a register. *) ActionLoadArg{ argNo=0, regSet=generalRegisters, willOverwrite=false, next = wordSelectedRight opRes } | wordSelectedRight opRes args = wordSelectedLeft opRes (List.rev args) (* If either of the arguments are long constants we don't code-generate and instead fall back to the RTS. This is likely to be more efficient. *) fun checkShort (opc, args, mapper) = if List.exists(fn a => case mapper a of SOME n => not(isShort n) | NONE => false) args then NONE else SOME(wordSelectDest(opc, testTagsForArithmetic), args) in val instrAddA = fn (args, mapper) => checkShort(ADD, args, mapper) and instrSubA = fn (args, mapper) => checkShort(SUB, args, mapper) and instrAddW = fn (args, _) => SOME(wordSelectDest(ADD, noTagTest), args) and instrSubW = fn (args, _) => SOME(wordSelectDest(SUB, noTagTest), args) and instrOrW = fn (args, _) => SOME(wordSelectDest(OR, noTagTest), args) and instrAndW = fn (args, _) => SOME(wordSelectDest(AND, noTagTest), args) and instrXorW = fn (args, _) => SOME(wordSelectDest(XOR, noTagTest), args) end local (* If the source or the index are in registers they have to be untagged first and then retagged afterwards. *) fun genStoreByte([base, index, toStore], NONE) = let val (untagIndex, retagIndex) = case index of InRegister indexReg => ([ShiftConstant{shiftType=SRL, output=indexReg, shift=0w1}], [TagValue{source=indexReg, output=indexReg }]) | _ => ([], []) val address = case (base, index) of (InRegister address, InRegister index) => BaseOffset{offset=0, base=address, index=Index1 index} | (InRegister address, LiteralSource offset) => BaseOffset{offset=Word.toInt(toShort offset), base=address, index=NoIndex } | (LiteralSource address, LiteralSource offset) => if isShort offset andalso toShort offset = 0w0 andalso not isX64 then ConstantAddress address else raise InternalError "genStoreByte" | _ => raise InternalError "genStoreByte" in case toStore of InRegister toStore => retagIndex @ [ TagValue{source=toStore, output=toStore }, StoreByteRegToMemory{ toStore=toStore, address=address }, ShiftConstant{shiftType=SRL, output=toStore, shift=0w1}(* Untag value to store *) ] @ untagIndex | LiteralSource toStore => retagIndex @ [ StoreByteConstToMemory{ toStore=wordToWord8(toShort toStore), address=address}] @ untagIndex | _ => raise InternalError "genStoreByte" end | genStoreByte _ = raise InternalError "genStoreByte" (* We store from the low order byte of a register so we want the value in one of the registers that has a low-byte form i.e. AL. BL, CL, DL. *) fun storeByte _ = loadToRegOrLiteral(listToSet[eax, ebx, ecx, edx], 2, loadBaseAddress(NoResult, loadToRegOrLiteral(generalRegisters, 1, generateInstruction genStoreByte))) ([NONE, NONE, NONE], NONE) in fun instrStoreB(args, _) = SOME(storeByte, args) end local (* Load the flags byte from a memory segment. The result must be tagged. *) (* We could reuse the base register for the output. *) fun genVecFlags([InRegister baseReg], SOME outReg) = [TagValue{source=outReg, output=outReg}, LoadByteR{source=BaseOffset{base=baseReg, offset= ~1, index=NoIndex}, output=outReg}] | genVecFlags _ = raise InternalError "genVecFlags" in fun instrVecflags(args, _) = SOME(fn pref => generalNegotiator(genVecFlags, pref), args) end local (* Get the first word of a long integer. Used when converting to "word". *) fun genFirstLong([InRegister baseReg], SOME outReg) = let val (code, lab) = condBranch(JE, PredictNeutral) in [TagValue{source=outReg, output=outReg} ] @ forwardJumpLabel lab @ [Group3Ops(outReg, NEG)] @ (* Negate if the sign was set. *) code @ [ (* Test the the sign bit in the header. *) TestByteMem{offset= ~1, base=baseReg, bits=0w16 }, LoadMemR{source=BaseOffset{base=baseReg, offset=0, index=NoIndex}, output=outReg} ] end | genFirstLong _ = raise InternalError "genFirstLong" in (* This is another case where we could reuse the argument for the result. *) fun instrGetFirstLong(args, _) = SOME(fn pref => generalNegotiator(genFirstLong, pref), args) end local (* Get the length of a string. *) fun genStringLength([InRegister rs], SOME rd) = let val (condBr, lab1) = condBranch(JE, PredictTaken(*More likely long*)) and (uncondBr, lab2) = uncondBranch() in forwardJumpLabel lab2 @ [ TagValue{source=rd, output=rd}, LoadMemR{source=BaseOffset{base=rs, offset=0, index=NoIndex}, output=rd} (* It's an address. *) ] @ forwardJumpLabel lab1 @ uncondBr @ [MoveConstR{source=tag 1, output=rd}] @ (* It's a byte: result is 1 *) condBr @ [TestTagR rs (* Is it a single byte? *)] end | genStringLength _ = raise InternalError "genStringLength" (* We could use the same register for the result and the argument. For the moment we force it to use different regs. *) in fun instrStringLength(args, _) = SOME(fn pref => generalNegotiator(genStringLength, pref), args) end local (* Set the length word of a string. *) fun genSetStringStringLength ([InRegister base, InRegister length], NONE) = [ TagValue{ source=length, output=length }, (* Retag it *) StoreRegToMemory{ toStore=length, address=BaseOffset{offset=0, base=base, index=NoIndex }}, ShiftConstant{shiftType=SRL, output=length, shift=0w1 } (* Untag it *) ] | genSetStringStringLength _ = raise InternalError "genSetStringStringLength" in fun instrSetStringLength(args, _) = SOME(fn _ => noresultNegotiator genSetStringStringLength, args) end local (* Shift operations: shifting by a variable amount requires ecx. Some special cases of multiplication can be implemented as shifts. *) (* Variable shifts always use the cl register i.e. the low order byte of ecx. *) fun loadShiftArg (instr, pref) opAndResult = loadToSpecificReg(ecx, true, 1, loadResultArg(instr, pref)) opAndResult (* Load the first argument into a register we can use for the result. *) and loadResultArg (instr, pref) opAndResult [arg1, _] = ( case arg1 of (ActInRegisterSet{ modifiable, ...}) => if regSetIntersect(modifiable, generalRegisters) <> noRegisters then let val aReg = oneOf(regSetIntersect(modifiable, generalRegisters)) in ActionLockRegister{argNo=0, reg=aReg, willOverwrite=true, next=finished(instr, aReg)} end else (* Can't clobber this register - move the value. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=true, next=loadResultArg(instr, pref) opAndResult} | _ => ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=true, next=loadResultArg(instr, pref) opAndResult} ) | loadResultArg _ _ _ = raise InternalError "loadResultArg: bad arguments" and finished (genInstr, resReg) _ = ActionDone{ outReg=SOME resReg, operation=genInstr([InRegister resReg, InRegister ecx], SOME resReg) } fun shiftNegotiator (instr, pref) = loadShiftArg (instr, pref) ([NONE, NONE], NONE) (* We have to consider what happens to the tag. Shifts are word values so are always non-negative. N.B. This is the untagged value i.e. 31 or 63. *) val maxShift = Word.fromInt wordSize * 0w8 - 0w1 fun genConstShift(_, 0w0) _ = [] (* Zero shifts do nothing *) | genConstShift(SLL, shift) (_, SOME reg) = (* Left shift. Use LEAL for some cases otherwise perform the shift and then subtract 1 << shift -1. This removes the existing shifted tag and sets the bottom bit. *) if shift > maxShift then [MoveConstR{source=tag 0, output=reg}](* This is defined to return zero. *) else ( case shift of 0w1 => [LoadAddress{output=reg, base=SOME reg, index=Index1 reg, offset= ~1}] | 0w2 => [LoadAddress{output=reg, base=NONE, index=Index4 reg, offset= ~3}] | 0w3 => [LoadAddress{output=reg, base=NONE, index=Index8 reg, offset= ~7}] | _ => if shift < 0w32 then (* Can remove the shifted tag and set the new tag. *) [ArithRConst{opc=SUB, output=reg, source=IntInf.<<(1, shift) -1 }, ShiftConstant{shiftType=SLL, output=reg, shift=wordToWord8 shift}] else (* 64-bit only. If the shift is more than 32 bits we remove the tag beforehand and put it back afterwards. *) [ArithRConst{opc=OR, output=reg, source=1 }, ShiftConstant{shiftType=SLL, output=reg, shift=wordToWord8 shift}, ArithRConst{opc=SUB, output=reg, source=1 }] ) | genConstShift(SRL, shift) (_, SOME reg) = (* Right logical shift. *) if shift > maxShift then [MoveConstR{source=tag 0, output=reg}](* This is defined to return zero. *) else (* The original tag will have been shifted out but we have to set the bottom bit as the tag. *) [ArithRConst{opc=OR, output=reg, source=1 }, ShiftConstant{shiftType=SRL, output=reg, shift=wordToWord8 shift}] | genConstShift(SRA, shift) (_, SOME reg) = (* Right shifts absorb the tag. *) (* If the shift is more than the word length this returns 0 for positive values and all ones for negative. We just limit the shift to 31/63. *) [ArithRConst{opc=OR, output=reg, source=1 }, ShiftConstant{shiftType=SRA, output=reg, shift=wordToWord8(Word.min(maxShift, shift))}] | genConstShift _ _ = raise InternalError "genConstShift" (* The X86 masks the shift value but the ML basis library requires shift values greater than the word size to set the value to 0/-1 as appropriate. We set the shift to the maximum if it is larger rather than trying to set the result to the appropriate value. The shift value is always in ecx. *) and genVarShift shift ([InRegister r, InRegister shiftR], SOME reg) = let val _ = r = reg orelse raise InternalError "genVarShift: different regs" val _ = shiftR = ecx orelse raise InternalError "genVarShift: shift not in ecx" val (test, lab) = condBranch(JNA, PredictTaken) in [ MakeSafe ecx, (* ecx may be invalid. *) ArithRConst{ opc=OR, output=reg, source= 1 }, (* Set dest tag. *) ShiftVariable { shiftType=shift, output=reg }, (* Do the shift *) ShiftConstant{shiftType=SRL, output=ecx, shift=0w1}(* Untag ecx *) ] @ forwardJumpLabel lab @ [ MoveConstR{ source=tag(Word.toInt maxShift), output=ecx } ] @ test @ [ ArithRConst{ opc=CMP, output=ecx, source=tag(Word.toInt maxShift) } ] @ ( (* If this is a left shift we have to remove the tag. That isn't needed for right shifts. Use a subtraction because we may be able to merge this with preceding operations. *) case shift of SLL => [ArithRConst{ opc=SUB, output=reg, source= 1}] | _ => [] ) end | genVarShift _ _ = raise InternalError "genVarShift" fun constantShift(opc, shift) pref = sharedSingleArgNegotiator(genConstShift(opc, shift), pref) and variableShift opc pref = shiftNegotiator(genVarShift opc, pref) fun shiftInstr opc (args as [arg1, arg2], mapper) = ( case mapper arg2 of SOME lit => SOME(constantShift(opc, toShort lit), [arg1]) | NONE => SOME(variableShift opc, args) ) | shiftInstr _ _ = raise InternalError "shiftInstr" fun getPower2 n = let fun p2 (n, l) = if n = 0w1 then SOME l else if Word.andb(n, 0w1) = 0w1 then NONE else p2(Word.>>(n, 0w1), l+0w1) in if n = 0w0 then NONE else p2(n,0w0) end local (* Multiply always places the result in EDX:EAX. Since we're going to modify those registers the best arrangement for the arguments is to get the first argument into eax and the second into edx. *) val eaxSet = singleton eax and edxSet = singleton edx fun loadArg1 instr [(ActInRegisterSet{ modifiable, ...}), _] = if regSetIntersect(modifiable, eaxSet) <> noRegisters then ActionLockRegister{argNo=0, reg=eax, willOverwrite=true, next=loadArg2 instr} else (* Not in the right register - move it. *) ActionLoadArg{argNo=0, regSet=eaxSet, willOverwrite=true, next=loadArg1 instr} | loadArg1 instr [_, _] = ActionLoadArg{argNo=0, regSet=eaxSet, willOverwrite=true, next=loadArg1 instr} | loadArg1 _ _ = raise InternalError "loadArg1: bad arguments" and loadArg2 instr [_, (ActInRegisterSet{ modifiable, ...})] = if regSetIntersect(modifiable, edxSet) <> noRegisters then ActionLockRegister{argNo=1, reg=edx, willOverwrite=true, next=finished instr} else (* Not in the right register - move it. *) ActionLoadArg{argNo=1, regSet=edxSet, willOverwrite=true, next=loadArg2 instr} | loadArg2 instr [_, _] = ActionLoadArg{argNo=1, regSet=edxSet, willOverwrite=true, next=loadArg2 instr} | loadArg2 _ _ = raise InternalError "loadArg1: bad arguments" and finished genInstr _ = ActionDone{ outReg=SOME eax, operation=genInstr([InRegister eax, InRegister edx], SOME eax) } in val multiplyNegotiator = loadArg1 end fun genMultiplyUnsigned _ = (* The arguments are in eax and edx and result in eax. *) [ MakeSafe edx, (* Could just copy eax in here *) (* Add back the tag, but don't shift. *) ArithRConst{opc=ADD, output=eax, source=1}, Group3Ops(edx, MUL), (* Shift down the multiplier. *) ShiftConstant{shiftType=SRL, output=edx, shift=0w1 }, (* Untag, but don't shift the multiplicand. *) ArithRConst{opc=SUB, output=eax, source=1} ] (* The only case we treat specially is multiplication by two because the overflow flag isn't defined for larger shifts. *) fun genAddSelf(_, SOME output) = let val (skipEmulator, skipEmulatorLab) = uncondBranch() val (lab1Code, lab1) = condBranch(JE, PredictNotTaken) val (lab2Code, lab2) = condBranch(JO, PredictNotTaken) val (backToInstr, backToInstrLab) = backJumpLabel() in [ArithRConst{opc=SUB, source=1, output=output}] @ forwardJumpLabel skipEmulatorLab @ jumpBack backToInstrLab @ [CallRTS memRegArbEmulation] @ forwardJumpLabel lab1 @ forwardJumpLabel lab2 @ skipEmulator @ lab2Code @ [ArithRR{opc=ADD, source=output, output=output}] @ backToInstr @ lab1Code @ [TestTagR output] end | genAddSelf _ = raise InternalError "genAddSelf" fun mulAConst2 pref = sharedSingleArgNegotiator(genAddSelf, pref) in fun instrUpshiftW am = shiftInstr SLL am and instrDownshiftW am = shiftInstr SRL am and instrDownshiftArithW am = shiftInstr SRA am fun instrMulW(args as [arg1, arg2], mapper) = ( (* This is implemented specially for powers of 2. It could also be implemented specially for some other cases as well. *) case List.map (Option.composePartial(getPower2 o toShort, mapper)) args of [_, SOME shift] => SOME(constantShift(SLL, shift), [arg1]) | [SOME shift, _] => SOME(constantShift(SLL, shift), [arg2]) | _ => SOME(fn _ => multiplyNegotiator genMultiplyUnsigned, args) ) | instrMulW _ = raise InternalError "instrMulW" fun instrMulA(args as [arg1, arg2], mapper) = ( (* The only special case we recognise is multiplication by 2. *) case List.map mapper args of [_, SOME lit] => if isShort lit andalso toShort lit = 0w2 then SOME(mulAConst2, [arg1]) else NONE(*SOME(InstrMulA, args)*) | [SOME lit, _] => if isShort lit andalso toShort lit = 0w2 then SOME(mulAConst2, [arg2]) else NONE(*SOME(InstrMulA, args)*) | _ => NONE(*SOME(InstrMulA, args)*) ) | instrMulA _ = raise InternalError "instrMulA" local (* Unsigned word div and mod. *) (* Division by a power of two is just a right shift. *) fun shiftDown shift = constantShift(SRL, shift) (* Modulo by a power of two is a mask. *) fun maskBits shift pref = let fun genMask(_, SOME resReg) = if shift > maxShift then [] else (* Because we're going to mask a tagged value we need to add 1 to the shift. *) [ArithRConst{opc=AND, output=resReg, source=IntInf.<<(1, shift+0w1) -1 }] | genMask _ = raise InternalError "genMask" in sharedSingleArgNegotiator(genMask, pref) end (* If the dividend is not a power of two we have to use the DIV instruction. This takes the divisor in the EDX/EAX pair and the dividend in a separate register. We get EDX as a work register and put the divisor in EAX. *) fun genDivMod isDiv ([_, InRegister dividend], _) = let val (notZero, notZeroLab) = condBranch(JNE, PredictTaken) (* The instruction to add back the tag to "dividend" was missing and this caused a rare crash on X86/64. I've now added it in to fix the bug and I'm assuming that dividend cannot be either eax or edx. This next test to just to make sure. *) val _ = if dividend = eax orelse dividend = edx then raise InternalError "genDivMod" else () in (* Because we didn't shift the dividend and the divisor we don't need to shift the remainder but just add in the tag. We do have to shift and tag the quotient. Either way we have to make the other register safe. *) (if isDiv then [MakeSafe edx, TagValue{source=eax, output=eax}] else [MakeSafe eax, ArithRConst{opc=ADD, output=edx, source=1}]) @ [ ArithRConst{opc=ADD, source=1, output=dividend}, (* Clear the high order of the accumulator and do the division. *) Group3Ops(dividend, DIV), ArithRR{opc=XOR, source=edx, output=edx}, (* Untag, but don't shift, the divisor and dividend. At the same time check for zero and raise an exception if it is. *) ArithRConst{opc=SUB, source=1, output=eax} ] @ forwardJumpLabel notZeroLab @ [CallRTS memRegRaiseDiv ] @ notZero @ [ArithRConst{opc=SUB, source=1, output=dividend}] end | genDivMod _ _ = raise InternalError "genDivMod" fun divModCode isDiv _ = getWorkingRegister(singleton edx, fn _ => loadToSpecificReg(eax, true, 0, loadToOneOf(generalRegisters, false, 1, generateInstruction(genDivMod isDiv) ) ) ) ([NONE, NONE], SOME(if isDiv then eax else edx)) fun checkPower2 (p2Code, genCode, args as [arg1, arg2], mapper) = ( (* Special case where the dividend is a power of two. We could maybe take out the special case of zero here and just raise an exception but that's hardly worth it. *) case Option.composePartial(getPower2 o toShort, mapper) arg2 of SOME n => SOME(p2Code n, [arg1]) | NONE => SOME(genCode, args) ) | checkPower2 _ = raise InternalError "checkPower2" in fun instrDivW(args, mapper) = checkPower2(shiftDown, divModCode true, args, mapper) and instrModW(args, mapper) = checkPower2(maskBits, divModCode false, args, mapper) end end local (* Load the length word from a memory cell. We could reuse the base for the result rather than getting a new register here. *) val mask = IntInf.<<(1, (Word.fromInt wordSize-0w1)*0w8) - 1 fun vecLen([InRegister base], SOME output) = [TagValue{source=output, output=output}, ArithRMem{opc=AND, output=output, base=base, offset= ~ wordSize }, MoveConstR{source= mask, output=output }] | vecLen _ = raise InternalError "vecLen" in fun instrVeclen(args, _) = SOME(fn prefs => generalNegotiator(vecLen, prefs), args) end local (* Load the "self" entry from the thread-specific block. *) fun threadSelf([], SOME output) = [LoadMemR{source=BaseOffset{base=ebp, offset=memRegThreadSelf, index=NoIndex}, output=output}] | threadSelf _ = raise InternalError "threadSelf" in fun instrThreadSelf(args, _) = SOME(fn prefs => generalNegotiator(threadSelf, prefs), args) end local fun atomicOp incr ([InRegister rs], SOME rd) = [ (* Since xadd returns the original value we have to add in the value again. *) ArithRConst{opc=ADD, output=rd, source=semitag incr}, AtomicXAdd{base=rs, output=rd}, MoveConstR{source=semitag incr, output=rd} ] | atomicOp _ _ = raise InternalError "atomicOp" in fun instrAtomicIncr(args, _) = SOME(fn pref => generalNegotiator(atomicOp 1, pref), args) and instrAtomicDecr(args, _) = SOME(fn pref => generalNegotiator(atomicOp ~1, pref), args) end local fun byteMemMove([InRegister _, sourceOffset, InRegister _, destOffset, InRegister _], _) = let (* Byte move. The offsets are byte offsets. *) fun getOffset(InRegister offsetReg, baseReg) = [ (* If it's in a register untag it, add it and then retag. *) TagValue{ source=offsetReg, output=offsetReg}, ArithRR{ opc=ADD, output=baseReg, source=offsetReg }, ShiftConstant{ shiftType=SRL, output=offsetReg, shift=0w1} ] | getOffset(LiteralSource lit, baseReg) = let val shortLit = toShort lit in if shortLit = 0w0 then [] else [ArithRConst{opc=ADD, output=baseReg, source=Word.toInt shortLit}] end | getOffset _ = raise InternalError "getOffset" in [MakeSafe ecx, MakeSafe esi, MakeSafe edi, RepeatOperation MOVSB] @ getOffset(destOffset, edi) @ getOffset(sourceOffset, esi) @ (* Untag the length. *) [ShiftConstant{ shiftType=SRL, output=ecx, shift=0w1}] end | byteMemMove _ = raise InternalError "byteMemMove" and wordMemMove([InRegister _, sourceOffset, InRegister _, destOffset, InRegister _], _) = let (* Word move. The offsets and the count are the number of words. We can compute the offset by using the LEAL instruction. *) fun getOffset(InRegister offsetReg, baseReg) = if wordSize = 4 then [LoadAddress{output=baseReg, offset= ~2, base=SOME baseReg, index=Index2 offsetReg }] else [LoadAddress{output=baseReg, offset= ~4, base=SOME baseReg, index=Index4 offsetReg }] | getOffset(LiteralSource lit, baseReg) = let val shortLit = toShort lit in if shortLit = 0w0 then [] else [ArithRConst{opc=ADD, output=baseReg, source=Word.toInt shortLit * wordSize}] end | getOffset _ = raise InternalError "getOffset" in [MakeSafe ecx, MakeSafe esi, MakeSafe edi, RepeatOperation MOVSL] @ getOffset(destOffset, edi) @ getOffset(sourceOffset, esi) @ (* Untag the length. *) [ShiftConstant{ shiftType=SRL, output=ecx, shift=0w1}] end | wordMemMove _ = raise InternalError "byteMemMove" fun genMemMove memMove _ = (* Memory moves: The source must be in esi, the destination in edi and the count in ecx. The source and destination offsets can be any registers. We can't add the offsets in advance because that would create invalid addresses. *) loadToSpecificReg(esi, true, 0, loadToSpecificReg(edi, true, 2, loadToSpecificReg(ecx, true, 4, allInRegsOrLiterals(generalRegisters, generateInstruction memMove) ))) ([NONE, NONE, NONE, NONE, NONE], NONE) in fun instrMoveBytes(args, _) = SOME(genMemMove byteMemMove, args) and instrMoveWords(args, _) = SOME(genMemMove wordMemMove, args) end local (* Pick an argument register from the general register set. *) fun chooseGenReg{readable, ...} = oneOf(regSetIntersect(readable, generalRegisters)) (* Test to see if this is testing arbitrary precision for ordering. Because of the way we deal with long-precision comparisons we can't use the memory-constant form for arbitrary precision valuess. *) fun isIntOrdering JG = true | isIntOrdering JGE = true | isIntOrdering JL = true | isIntOrdering JLE = true | isIntOrdering _ = false (* Word comparisons are used both for the word type itself but also for tests such as tag tests and pointer comparisons. The x86 allows most combinations of registers, memory and constants. *) fun testActions (testType, destLabel, tagTest) ([ActBaseOffset _, ActBaseOffset _]) = (* Both in memory: Load one. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=false, next=testActions(testType, destLabel, tagTest)} | testActions (testType, destLabel, tagTest) ([ActLiteralSource _, ActLiteralSource _]) = (* Both constants: Should have been optimised. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=false, next=testActions(testType, destLabel, tagTest)} | testActions (testType, destLabel, tagTest) ([ActInRegisterSet s1, ActInRegisterSet s2]) = let val reg1 = chooseGenReg s1 and reg2 = chooseGenReg s2 val Labels{uses, ...} = destLabel val () = uses := !uses+1 in ActionDone{ outReg=NONE, operation=ConditionalBranch { test=testType, label=destLabel, predict=PredictNeutral }:: tagTest([ArithRR{opc=CMP, output=reg1, source=reg2}], InRegister reg1, InRegister reg2, testType, destLabel) } end | testActions (testType, destLabel, tagTest) ([ActInRegisterSet s1, ActLiteralSource constnt]) = let val reg1 = chooseGenReg s1 val Labels{uses, ...} = destLabel val () = uses := !uses+1 in ActionDone{ outReg=NONE, operation= tagTest( [ConditionalBranch { test=testType, label=destLabel, predict=PredictNeutral }, if isShort constnt then ArithRConst{opc=CMP, output=reg1, source=tag(Word.toIntX(toShort constnt))} else ArithRLongConst{opc=CMP, output=reg1, source=constnt}], InRegister reg1, LiteralSource constnt, testType, destLabel) } end | testActions (testType, destLabel, tagTest) ([ActLiteralSource constnt, ActInRegisterSet s2]) = let val reg2 = chooseGenReg s2 val Labels{uses, ...} = destLabel val () = uses := !uses+1 val revTest = reverseTestOp testType in ActionDone{ outReg=NONE, operation= tagTest( [ConditionalBranch { test=revTest, label=destLabel, predict=PredictNeutral }, if isShort constnt then ArithRConst{opc=CMP, output=reg2, source=tag(Word.toIntX(toShort constnt))} else ArithRLongConst{opc=CMP, output=reg2, source=constnt}], InRegister reg2, LiteralSource constnt, revTest, destLabel) } end | testActions (testType, destLabel, tagTest) ([ActInRegisterSet s1, ActBaseOffset(base, offset)]) = let val reg1 = chooseGenReg s1 val Labels{uses, ...} = destLabel val () = uses := !uses+1 in ActionDone{ outReg=NONE, operation= tagTest([ConditionalBranch { test=testType, label=destLabel, predict=PredictNeutral }, ArithRMem{opc=CMP, output=reg1, base=base, offset=offset}], InRegister reg1, BaseOffsetSource{base=base, offset=offset}, testType, destLabel)} end | testActions (testType, destLabel, tagTest) ([ActBaseOffset(base, offset), ActInRegisterSet s2]) = let val reg2 = chooseGenReg s2 val Labels{uses, ...} = destLabel val () = uses := !uses+1 val revTest = reverseTestOp testType in ActionDone{ outReg=NONE, operation= tagTest([ConditionalBranch { test=revTest, label=destLabel, predict=PredictNeutral }, ArithRMem{opc=CMP, output=reg2, base=base, offset=offset}], InRegister reg2, BaseOffsetSource{base=base, offset=offset}, revTest, destLabel)} end | testActions (testType, destLabel, tagTest) ([ActBaseOffset(base, offset), ActLiteralSource constnt]) = if not (isIntOrdering testType) andalso (not isX64 orelse is31bitSigned constnt) then (* In 32-bit mode we can put all constants inline but in 64-bit mode anything that won't fit in 32-bits as well as all addresses need to go in the constant area. That requires memory addressing and we don't have memory-memory comparison operations. *) let val Labels{uses, ...} = destLabel val () = uses := !uses+1 in ActionDone{ outReg=NONE, operation= tagTest( [ConditionalBranch { test=testType, label=destLabel, predict=PredictNeutral }, if isShort constnt then ArithMemConst{opc=CMP, base=base, offset=offset, source=tag(Word.toIntX(toShort constnt))} else ArithMemLongConst{opc=CMP, base=base, offset=offset, source=constnt}], BaseOffsetSource{base=base, offset=offset}, LiteralSource constnt, testType, destLabel)} end else (* If it won't fit in 32-bits we have to load one of the args. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=false, next=testActions(testType, destLabel, tagTest)} | testActions (testType, destLabel, tagTest) ([ActLiteralSource constnt, ActBaseOffset(base, offset)]) = if not (isIntOrdering testType) andalso (not isX64 orelse is31bitSigned constnt) then let val Labels{uses, ...} = destLabel val () = uses := !uses+1 val revTest = reverseTestOp testType in ActionDone{ outReg=NONE, operation= tagTest( [ConditionalBranch { test=revTest, label=destLabel, predict=PredictNeutral }, if isShort constnt then ArithMemConst{opc=CMP, base=base, offset=offset, source=tag(Word.toIntX(toShort constnt))} else ArithMemLongConst{opc=CMP, base=base, offset=offset, source=constnt}], BaseOffsetSource{base=base, offset=offset}, LiteralSource constnt, revTest, destLabel) } end else (* If it won't fit in 32-bits we have to load one of the args. *) ActionLoadArg{argNo=1, regSet=generalRegisters, willOverwrite=false, next=testActions(testType, destLabel, tagTest)} | testActions _ _ = raise InternalError "testActions" fun makeBranch (testType, tagTest) () = let val destLabel = mkLabel() in (testActions(testType, destLabel, tagTest), destLabel) end fun lengthTest test () = let val destLabel as Labels{uses, ...} = mkLabel() fun testActions ([ActInRegisterSet regs]) = ( uses := !uses+1; ActionDone { outReg=NONE, operation=[ConditionalBranch { test=test, label=destLabel, predict=PredictNeutral }, TestTagR(chooseGenReg regs)]} ) | testActions([ActBaseOffset(base, offset)]) = ( uses := !uses+1; ActionDone { outReg=NONE, operation=[ConditionalBranch { test=test, label=destLabel, predict=PredictNeutral }, TestByteMem{base=base, offset=offset, bits=0w1}]} ) | testActions([ActLiteralSource _]) = (* This should have been optimised away. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=false, next=testActions} | testActions _ = raise InternalError "lengthTestActions" in (testActions: nextAction, destLabel) end (* If either of the arguments are long constants we don't code-generate and instead fall back to the RTS. This is likely to be more efficient. *) fun checkShort (opc, test) (args, mapper) = if List.exists(fn a => case mapper a of SOME n => not(isShort n) | NONE => false) args then NONE else SOME(makeBranch(opc, test), args) fun noTagTest (operations, _, _, _, _) = operations (* When we don't need a test. *) in fun testNeqW(args, _) = SOME(makeBranch(JNE, noTagTest), args) fun testEqW(args, _) = SOME(makeBranch(JE, noTagTest), args) fun testGeqW(args, _) = SOME(makeBranch(JNB, noTagTest), args) (* These are unsigned. *) fun testGtW (args, _) = SOME(makeBranch(JA, noTagTest), args) fun testLeqW(args, _) = SOME(makeBranch(JNA, noTagTest), args) fun testLtW(args, _) = SOME(makeBranch(JB, noTagTest), args) fun testNeqA(args, mapper) = checkShort(JNE, eqTestTags)(args, mapper) and testEqA(args, mapper) = checkShort(JE, eqTestTags)(args, mapper) and testGeqA(args, mapper) = checkShort(JGE, testTagsForComparison)(args, mapper) and testGtA(args, mapper) = checkShort(JG, testTagsForComparison)(args, mapper) and testLeqA(args, mapper) = checkShort(JLE, testTagsForComparison)(args, mapper) and testLtA(args, mapper) = checkShort(JL, testTagsForComparison)(args, mapper) fun Short(args, _) = SOME(lengthTest JNE, args) fun Long(args, _) = SOME(lengthTest JE, args) end local fun genByteVec test () = let val destLabel as Labels{uses, ...} = mkLabel() fun generateByteVec([InRegister addr1, offset1, InRegister addr2, offset2, InRegister len]) = let val () = if addr1 = esi andalso addr2 = edi andalso len = ecx then () else raise InternalError "Incorrect registers" fun getOffset(InRegister offsetReg, baseReg) = [ (* If it's in a register untag it, add it and then retag. *) TagValue{ source=offsetReg, output=offsetReg }, ArithRR{opc=ADD, output=baseReg, source=offsetReg}, ShiftConstant{shiftType=SRL, output=offsetReg, shift=0w1} ] | getOffset(LiteralSource lit, baseReg) = let val shortLit = toShort lit in if shortLit = 0w0 then [] else [ArithRConst{opc=ADD, output=baseReg, source=Word.toInt shortLit}] end | getOffset _ = raise InternalError "getOffset" val () = uses := !uses+1 in [ ConditionalBranch { test=test, label=destLabel, predict=PredictNeutral }, MakeSafe ecx, (* These will now be invalid *) MakeSafe esi, MakeSafe edi, RepeatOperation CMPSB, (* Compare the bytes. *) ArithRR{opc=CMP, output=ecx, source=ecx}, (* Set the Z flag before we start. *) ShiftConstant{shiftType=SRL, output=ecx, shift=0w1} (* Untag the length. *) ] @ getOffset(offset2, edi) @ getOffset(offset1, esi) end | generateByteVec _ = raise InternalError "generateByteVec" fun generateCode (operands, _) _ = ActionDone{ outReg=NONE, operation=generateByteVec(List.map valOf operands) } val testActions = (* The vectors to compare are in esi and edi and the count in ecx. Since it doesn't matter which is in esi and which in edi it would be nice if we could leave that open but for the moment we require the first in esi and the second in edi. The offsets can be in any register. Edi, esi and ecx are marked as modifiable and are left as values that need to be made safe. Offset values are read-only and need to be restored in case they're reused. *) loadToSpecificReg(esi, true, 0, loadToSpecificReg(edi, true, 2, loadToSpecificReg(ecx, true, 4, loadToRegOrLiteral(generalRegisters, 1, loadToRegOrLiteral(generalRegisters, 3, generateCode))))) ([NONE, NONE, NONE, NONE, NONE], NONE) in (testActions: nextAction, destLabel) end in fun byteVecEq(args, _) = SOME(genByteVec JE, args) and byteVecNe(args, _) = SOME(genByteVec JNE, args) end local fun loadBaseOffsets genInstr ops (ActBaseOffset _ :: _) = (* Unary or binary case. *) (* Base-offset values need to be loaded into a general register because we don't have a doubly indirect load, at least on X86/32. *) ActionLoadArg{argNo=0, regSet=generalRegisters, willOverwrite=false, next=loadBaseOffsets genInstr ops} | loadBaseOffsets genInstr ops [_, ActBaseOffset _] = ActionLoadArg{argNo=1, regSet=generalRegisters, willOverwrite=false, next=loadBaseOffsets genInstr ops} | loadBaseOffsets genInstr (_, outputReg) args = let fun argToSource(ActInRegisterSet { readable, modifiable }) = (* Choose the best register. First choice is a modifiable FP reg, then a non-modifiable FP reg, then a general register. *) if regSetIntersect(modifiable, floatingPtRegisters) <> noRegisters then InRegister(oneOf(regSetIntersect(modifiable, floatingPtRegisters))) else if regSetIntersect(readable, floatingPtRegisters) <> noRegisters then InRegister(oneOf(regSetIntersect(readable, floatingPtRegisters))) else InRegister(oneOf readable) | argToSource(ActLiteralSource m) = LiteralSource m | argToSource _ = raise InternalError "negotiateFP: not reg or literal" val ops = map argToSource args in ActionDone{ outReg=outputReg, operation=genInstr(ops, outputReg) } end fun genTest(opc, destLabel as Labels{uses, ...}) ([arg1, arg2], _) = let (* We need one argument at the top of the stack. The second can be anywhere. The order depends on the operation. *) val (stackArg, secondArg) = case opc of JNA => (arg2, arg1) (* Reverse *) | JB => (arg2, arg1) (* Reverse *) | JA => (arg1, arg2) (* Forward *) | JNB => (arg1, arg2) (* Forward *) (* JE/JNE can be in either order. It might be better to choose an argument based on which is more likely to be at the top of the stack but it's probably not worth it. *) | _ => (arg1, arg2) val loadToStack = case stackArg of InRegister(reg as FPReg _) => FPLoadFromFPReg{source=reg, lastRef=false} | InRegister(reg as GenReg _) => FPLoadFromGenReg reg | LiteralSource lit => loadFPConstant lit | _ => raise InternalError "testActions" val fpOperation = case secondArg of InRegister(reg as FPReg _) => FPArithR{opc=FCOMP, source=reg} | InRegister(reg as GenReg _) => FPArithMemory{opc=FCOMP, base=reg, offset=0} | LiteralSource lit => FPArithConst{opc=FCOMP, source=lit} | _ => raise InternalError "testActions" val c3 = 0wx4000 and c2 = 0wx0400 and c0 = 0wx0100 val mask = case opc of JE => c2 orb c3 | JNE => c2 orb c3 | JB => c0 orb c2 orb c3 | JA => c0 orb c2 orb c3 | JNB => c0 orb c2 | JNA => c0 orb c2 | _ => raise InternalError "testActions" val () = uses := !uses+1 in [ ConditionalBranch { test=if opc = JNE then JNE else JE, label=destLabel, predict=PredictNeutral }, MakeSafe eax (* Has an unsafe value in it. *) ] @ (* We use these operations to set the condition codes. Do we need to put something in to indicate to an optimiser that we're using the condition code "result" here? *) (if opc = JE orelse opc = JNE then [ArithRConst{ opc=XOR, output=eax, source=Word.toInt c3 }] else []) @ [ (* Mask and set the condition codes. *) ArithRConst{ opc=AND, output=eax, source=Word.toInt mask }, FPStatusToEAX, fpOperation, (* Compare and pop. *) loadToStack (* First arg to stack*) ] end | genTest _ _ = raise InternalError "genTest" fun fpTests opc () = let val destLabel = mkLabel() in (* We need eax as a work register. *) (fn _ => ActionGetWorkReg{regSet=singleton eax, setReg = fn _ => loadBaseOffsets (genTest(opc, destLabel)) ([NONE, NONE], NONE)}, destLabel) end fun getFP genInstr pref = getResultRegister(floatingPtRegisters, pref, loadBaseOffsets genInstr) ([NONE, NONE], NONE) and getUnaryFP genInstr pref = getResultRegister(floatingPtRegisters, pref, loadBaseOffsets genInstr) ([NONE], NONE) and getArctanFP genInstr pref = (* Arctan requires two items on the stack. The effect is to overwrite fp6 *) getWorkingRegister(singleton fp6, fn _ => getResultRegister(floatingPtRegisters, pref, loadBaseOffsets genInstr) ) ([NONE], NONE) val unimplementedInstr = fn _ => NONE fun genBinaryFP(forward, reverse) ([op1, op2], SOME output) = let val (stackArg, secondArg, opc) = case (op1, op2) of (InRegister(FPReg fp1), InRegister(FPReg fp2)) => (* Choose the reg nearer the top. *) if fp1 <= fp2 then (op1, op2, forward) else (op2, op1, reverse) | (_, InRegister(FPReg _)) => (op2, op1, reverse) | _ => (op1, op2, forward) val loadToStack = case stackArg of InRegister(reg as FPReg _) => FPLoadFromFPReg{source=reg, lastRef=false} | InRegister(reg as GenReg _) => FPLoadFromGenReg reg | LiteralSource lit => loadFPConstant lit | _ => raise InternalError "genBinaryFP" val fpOperation = case secondArg of InRegister(reg as FPReg _) => FPArithR{opc=opc, source=reg} | InRegister(reg as GenReg _) => FPArithMemory{opc=opc, base=reg, offset=0} | LiteralSource lit => FPArithConst{opc=opc, source=lit} | _ => raise InternalError "genBinaryFP" in [ FPStoreToFPReg{output=output, andPop=true}, fpOperation, (* Do operation. *) loadToStack (* First arg to stack*) ] end | genBinaryFP _ _ = raise InternalError "genBinaryFP" fun genUnaryFP opc ([opn], SOME output) = let val loadToStack = case opn of InRegister(reg as FPReg _) => FPLoadFromFPReg{source=reg, lastRef=false} | InRegister(reg as GenReg _) => FPLoadFromGenReg reg | LiteralSource lit => loadFPConstant lit | _ => raise InternalError "genUnaryFP" in case opc of FPATAN => (* The FPATAN function takes two arguments so we need to push 1.0. We must invalidate FP7 before we push the second argument otherwise we may get a stack overflow. *) [FPStoreToFPReg{output=output, andPop=true}, FPUnary FPATAN, (* Because we have pushed an extra value this appears as modifying fp6. *) FreeRegisters(singleton fp6), FPUnary FLD1, FPFree fp7, loadToStack ] | _ => (* The rest are much simpler. *) [FPStoreToFPReg{output=output, andPop=true}, FPUnary opc, loadToStack] end | genUnaryFP _ _ = raise InternalError "genUnaryFP" in fun instrAddFP(args, _) = SOME(getFP(genBinaryFP(FADD, FADD)), args) and instrSubFP(args, _) = SOME(getFP(genBinaryFP(FSUB, FSUBR)), args) and instrMulFP(args, _) = SOME(getFP(genBinaryFP(FMUL, FMUL)), args) and instrDivFP(args, _) = SOME(getFP(genBinaryFP(FDIV, FDIVR)), args) fun instrAbsFP(args, _) = SOME(getUnaryFP(genUnaryFP FABS), args) and instrNegFP(args, _) = SOME(getUnaryFP(genUnaryFP FCHS), args) and instrSqrtFP(args, _)= SOME(getUnaryFP(genUnaryFP FSQRT), args) and instrSinFP(args, _) = SOME(getUnaryFP(genUnaryFP FSIN), args) and instrCosFP(args, _) = SOME(getUnaryFP(genUnaryFP FCOS), args) and instrAtanFP(args, _)= SOME(getArctanFP(genUnaryFP FPATAN), args) local fun genIntToFPInstr([InRegister source], SOME output) = let (* This is a bit complicated because we can only load from memory but the memory needs to be modifiable. We have a special location we can load from. *) val (test, skipEmulator) = condBranch(JNE, PredictTaken) in [ FPStoreToFPReg{output=output, andPop=true}, (* Store into dest. *) FPLoadIntAndPop (* Do instr. *) ] @ forwardJumpLabel skipEmulator @ [ CallRTS memRegArbEmulation ] @ test @ [TestTagR source, PushR source (* Push and test tag. *) ] end | genIntToFPInstr _ = raise InternalError "genIntToFPInstr" fun genIntToFP pref = (* Real.fromInt generates its result in a FP reg but takes its arg in a general reg. *) getResultRegister(floatingPtRegisters, pref, loadToOneOf(generalRegisters, true (* Will modify *), 0, generateInstruction genIntToFPInstr) ) ([NONE], NONE) in fun instrIntToRealFP(args, _) = SOME(genIntToFP, args) end val instrExpFP = unimplementedInstr and instrLnFP = unimplementedInstr and instrRealToIntFP = unimplementedInstr fun testNeqFP(args, _)= SOME(fpTests JNE, args) fun testEqFP(args, _) = SOME(fpTests JE, args) fun testGeqFP(args, _)= SOME(fpTests JNB, args) fun testGtFP(args, _) = SOME(fpTests JA, args) fun testLeqFP(args, _)= SOME(fpTests JNA, args) fun testLtFP(args, _) = SOME(fpTests JB, args) end end fun isPushI _ = true (* The stack limit register is set at least twice this far from the end of the stack so we can simply compare the stack pointer with the stack limit register if we need less than this much. Setting it at twice this value means that procedures which use up to this much stack and do not call any other procedures do not need to check the stack at all. *) val minStackCheck = 20 (* Adds the constants onto the code, and copies the code into a new segment *) fun copyCode (cvec, operations, stackRequired, registerSet, callsAProc) : address = let (* Prelude consists of stack checking code. N.B. This is added on after the main list is reversed so the code is not reversed. *) val preludeCode = let fun testRegAndTrap(reg, entryPt) = let (* Normally we won't have a stack overflow so we will skip the check. *) val (skipCheck, skipCheckLab) = condBranch(JNB, PredictTaken) in [ArithRMem{ opc=CMP, output=reg, offset=memRegStackLimit, base=ebp }] @ skipCheck @ [CallRTS entryPt] @ forwardJumpLabel skipCheckLab end in if stackRequired >= minStackCheck then let (* Compute the necessary amount in edi and compare that. *) val stackByteAdjust = ~wordSize * stackRequired val testEdiCode = testRegAndTrap (edi, memRegStackOverflowCallEx) in [LoadAddress{output=edi, base=SOME esp, index=NoIndex, offset=stackByteAdjust}] @ testEdiCode end else if callsAProc (* check for interrupt *) then testRegAndTrap (esp, memRegStackOverflowCall) else [] (* no stack check required *) end (* The code is in reverse order. Reverse it and put the prelude first. *) in createCodeSegment(X86OPTIMISE.optimise(cvec, preludeCode @ List.rev operations), registerSet, cvec) end structure Sharing = struct type code = code and 'a instrs = 'a instrs and negotiation = negotiation and negotiateTests = negotiateTests and reg = reg and 'a tests = 'a tests and addrs = addrs and operation = operation and regHint = regHint and argAction = argAction and regSet = RegSet.regSet and forwardLabel = forwardLabel and backwardLabel = backwardLabel end end (* struct *) (* CODECONS *); polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/X86OPTIMISE.ML000066400000000000000000000471451265146633400234240ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2010, 2012 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor X86OPTIMISE( structure X86CODE: X86CODESIG ) : sig type operation type code type operations = operation list val optimise: code * operations -> operations structure Sharing: sig type operation = operation type code = code end end = struct open X86CODE exception InternalError = Misc.InternalError fun optimise(code, ops) = let open RegSet (* Print the pre-optimised code if required. *) val () = printLowLevelCode(ops, code) (* All these instructions can't be eliminated after a jump. *) fun labelInstruction(JumpLabel(Labels{uses=ref uses, ...})) = uses > 0 | labelInstruction(StartHandler _) = true | labelInstruction _ = false (* If we remove a branch the use counts are reduced. *) fun eliminate(UncondBranch(Labels{uses, ...})) = (!uses > 0 orelse raise InternalError "eliminate"; uses := !uses-1) | eliminate(ConditionalBranch{label=Labels{uses, ...}, ...}) = (!uses > 0 orelse raise InternalError "eliminate"; uses := !uses-1) | eliminate _ = () (* Optimise the code list by repeated scans up and down the list. Scan forward through the list reversing it as we go. Then scan the reversed list and turn it back into the original order. *) fun forward([], list, rep) = reverse(list, [], rep) (* Eliminate dead instructions after RaiseException up to the next label. *) | forward((u as RaiseException) :: next :: tl, list, rep) = if labelInstruction next then forward(next :: tl, u :: list, rep) else (eliminate next; forward(u :: tl, list, true)) (* Eliminate Unconditional branches to the next instruction. *) | forward((u as UncondBranch(Labels{forward=source, ...})) :: (next as JumpLabel(Labels{forward=dest, ...})) :: tl, list, rep) = if source = dest then (eliminate u; forward(next :: tl, list, true)) else forward(next :: tl, u :: list, rep) (* Eliminate dead instructions after UnconditionalBranch up to the next label. *) | forward((u as UncondBranch _) :: next :: tl, list, rep) = if labelInstruction next then forward(next :: tl, u :: list, rep) else (eliminate next; forward(u :: tl, list, true)) (* Eliminate unreferenced labels. *) | forward(JumpLabel(Labels{uses=ref 0, ...}) :: tl, list, _) = forward(tl, list, true) (* Branch chaining. If we have a label followed by an unconditional branch set the chain entry of the label to destination of the branch. *) | forward((l as JumpLabel(Labels{chain as ref NONE, ...})) :: (u as UncondBranch(uncondLab as Labels{chain=ref chainL, ...})) :: tl, list, _) = ( if isSome chainL then chain := chainL else chain := SOME uncondLab; (* It's essential to include the branch in the output at this point. Otherwise we could eliminate the branch if it happened to be followed by its destination, set the use count of the destination label to zero, eliminate that; all before we had updated the incoming branches. *) forward(tl, u :: l :: list, true) ) (* Reorder conditional and unconditional branches. If we have a conditional branch followed by an unconditional branch followed by the destination of the conditional branch we can turn the test round. *) | forward((c as ConditionalBranch{label=condDest, test, predict, ...}) :: (u as UncondBranch uncondLab) :: (d as JumpLabel(Labels{forward=nextLabel, ...})) :: tl, list, rep) = let (* See where the ultimate destination of the conditional branch is. If it's already been forwarded we don't want to change that. *) fun follow(Labels{chain=ref(SOME c), ...}) = follow c | follow c = c val Labels{forward=condRef, ...} = follow condDest fun reverseTest JE = JNE | reverseTest JNE = JE | reverseTest JA = JNA | reverseTest JB = JNB | reverseTest JNA = JA | reverseTest JNB = JB | reverseTest JL = JGE | reverseTest JG = JLE | reverseTest JLE = JG | reverseTest JGE = JL | reverseTest JO = JNO | reverseTest JNO = JO fun reversePrediction PredictNeutral = PredictNeutral | reversePrediction PredictTaken = PredictNotTaken | reversePrediction PredictNotTaken = PredictTaken in if condRef = nextLabel then ( eliminate c; forward(d :: tl, ConditionalBranch{label=uncondLab, test=reverseTest test, predict=reversePrediction predict} :: list, true) ) else forward(u :: d :: tl, c :: list, rep) end | forward(ResetStack count1 :: ResetStack count2 :: tl, list, _) = (* Combine adjacent resets. *) forward(ResetStack(count1+count2) :: tl, list, true) | forward((a as ArithRConst{ opc=opA, output=outA, source=constA }) :: (b as ArithRConst{ opc=opB, output=outB, source=constB }) :: tl, list, rep) = if outA = outB andalso (opA = ADD orelse opA = SUB) andalso (opB = ADD orelse opB = SUB) then let val (opc, result) = case (opA, opB) of (ADD, ADD) => (ADD, constA+constB) | (SUB, SUB) => (SUB, constA+constB) | (ADD, SUB) => if constA >= constB then (ADD, constA-constB) else (SUB, constB-constA) | (SUB, ADD) => if constA >= constB then (SUB, constA-constB) else (ADD, constB-constA) | _ => raise InternalError "forward: ArithRConst" in (* We could extract the case where the result is zero but that doesn't seem to occur. *) forward(ArithRConst{ opc=opc, output=outA, source=result } :: tl, list, true) end else forward(b :: tl, a :: list, rep) | forward(hd :: tl, list, rep) = forward(tl, hd :: list, rep) and reverse([], list, rep) = (list, rep) (* Eliminate unreferenced labels. *) | reverse(JumpLabel(Labels{uses=ref 0, ...}) :: tl, list, _) = reverse(tl, list, true) (* Combine multiple labels by setting the earlier to point to the later. This may subsequently eliminate the first label. This simplifies branch chaining. This can only be done after we've checked that the later label is actually referenced. *) | reverse((a as JumpLabel(aL as Labels{chain=ref chainA, ...})) :: (b as JumpLabel(Labels{chain as ref NONE, ...})) :: tl, list, _) = ( if isSome chainA then chain := chainA else chain := SOME aL; reverse(b :: tl, a :: list, true) ) (* Branch chaining. If we have a branch to a destination that is chained we replace this by a branch to the ultimate destination. This is done on the reverse pass because generally branches are forward and the extensions will have been added after the branches were seen on the forward pass. *) | reverse(UncondBranch(Labels{chain=ref(SOME dest), uses=oldUses, ...}) :: tl, list, _) = let fun follow(Labels{chain=ref(SOME c), ...}) = follow c | follow c = c val dest as Labels{uses=newUses, ...} = follow dest in oldUses := !oldUses - 1; ! newUses >= 1 orelse raise InternalError "UncondBranch1"; newUses := !newUses + 1; ! oldUses >= 0 orelse raise InternalError "UncondBranch2"; reverse(UncondBranch dest :: tl, list, true) end | reverse( ConditionalBranch{ label=Labels{chain=ref(SOME dest), uses=oldUses, ...}, test, predict} :: tl, list, _) = let fun follow(Labels{chain=ref(SOME c), ...}) = follow c | follow c = c val dest as Labels{uses=newUses, ...} = follow dest in oldUses := !oldUses - 1; ! newUses >= 1 orelse raise InternalError "ConditionalBranch1"; newUses := !newUses + 1; ! oldUses >= 0 orelse raise InternalError "ConditionalBranch2"; reverse(ConditionalBranch{label=dest, test=test, predict=predict} :: tl, list, true) end (* Branch chaining with indexed branches. We may be able to forward branch table entries to their new location. *) | reverse( (i as IndexedCase{testReg, workReg, min, cases}) :: tl, list, rep) = let val changed = ref false fun forwardBranch(Labels{chain=ref(SOME dest), uses=oldUses, ...}) = let fun follow(Labels{chain=ref(SOME c), ...}) = follow c | follow c = c val dest as Labels{uses=newUses, ...} = follow dest in oldUses := !oldUses - 1; ! newUses >= 1 orelse raise InternalError "IndexedBranch1"; newUses := !newUses + 1; ! oldUses >= 0 orelse raise InternalError "IndexedBranch2"; changed := true; dest end | forwardBranch lab = lab val newList = List.map forwardBranch cases in if ! changed then reverse(tl, IndexedCase{testReg=testReg, workReg=workReg, min=min, cases=newList} :: list, true) else reverse(tl, i :: list, rep) end (* If we free a floating point register after loading it onto the stack we want to propagate that information. Otherwise push the RegisterStatusChange back up the list. *) | reverse((r as FreeRegisters regs) :: (f as FPLoadFromFPReg{source, ...}) :: tl, list, _) = if inSet(source, regs) then let val left = regSetMinus(regs, singleton source) in if left = noRegisters then reverse(FPLoadFromFPReg{source=source, lastRef=true} :: tl, list, true) else reverse(FPLoadFromFPReg{source=source, lastRef=true} :: FreeRegisters left :: tl, list, true) end else reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters regs) :: (f as FPStoreToFPReg{output, ...}) :: tl, list, rep) = if inSet(output, regs) then (* We're discarding this register without using it. Why? Split the sets but otherwise do nothing for the moment. *) let val left = regSetMinus(regs, singleton output) in if left = noRegisters then reverse(f :: tl, FreeRegisters(singleton output) :: list, rep) else reverse(f :: FreeRegisters left :: tl, FreeRegisters(singleton output) :: list, rep) end else (* We're saving into a different register. Push back the Free. *) reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as FPArithConst _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as FPArithMemory _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) (* This isn't right. The register may be being freed because its last use was in the test associated with the conditional but it could be because the register contains a value that is not used in the "fall through" branch but IS used in the branch we're going to. | reverse((r as FreeRegisters _) :: (f as ConditionalBranch _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) *) | reverse((r as FreeRegisters _) :: (f as MakeSafe _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as ArithRConst _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as FPStatusToEAX) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as FPLoadFromConst _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters _) :: (f as MoveRR _) :: tl, list, _) = reverse(f :: r :: tl, list, true) (* Push it back *) | reverse((r as FreeRegisters regs) :: (f as FPArithR{source, ...}) :: tl, list, rep) = if inSet(source, regs) then (* We're freeing the register after the arithmetic. Split the sets but otherwise do nothing. *) let val left = regSetMinus(regs, singleton source) in if left = noRegisters then reverse(f :: tl, FreeRegisters(singleton source) :: list, rep) else reverse(f :: FreeRegisters left :: tl, FreeRegisters(singleton source) :: list, rep) end else reverse(f :: r :: tl, list, true) (* Push it back *) (* Merge multiple sets. *) | reverse(FreeRegisters a :: FreeRegisters b :: tl, list, _) = reverse(FreeRegisters(RegSet.regSetUnion(a,b)) :: tl, list, true) (* We store a result, then load it. *) | reverse((l as FPLoadFromFPReg{source, lastRef}) :: (s as FPStoreToFPReg{output, andPop=true}) :: tl, list, rep) = if source = output then if lastRef then (* We're not reusing the register so we don't need to store. *) reverse(tl, list, true) else (* We're reusing the register later. Store it there but don't pop. *) reverse(FPStoreToFPReg{output=output, andPop=false} :: tl, list, true) else reverse(s :: tl, l :: list, rep) (* See if we can merge two allocations. *) | reverse((l as AllocStore{size=aSize, output=aOut}) :: tl, list, rep) = let fun searchAlloc([], _, _, _) = [] | searchAlloc (AllocStore{size=bSize, output=bOut} :: tl, instrs, modRegs, true) = (* We can merge this allocation unless the output register has been modified in the meantime. *) if inSet(bOut, modRegs) then [] else (* Construct a new list with the allocation replaced by an addition, the original instructions in between and the first allocation now allocating the original space plus space for the additional object and its length word. *) LoadAddress{output=aOut, offset=(bSize+1) * Address.wordSize, base=SOME bOut, index=NoIndex} :: List.filter (fn StoreInitialised => false | _ => true) (List.rev instrs) @ (AllocStore{size=aSize+bSize+1, output=bOut} :: tl) (* Check the correct matching of allocation and completion. *) | searchAlloc (AllocStore _ :: _, _, _, false) = raise InternalError "AllocStore found but last allocation not complete" | searchAlloc((s as StoreInitialised) :: tl, instrs, modRegs, false) = searchAlloc(tl, s :: instrs, modRegs, true) | searchAlloc(StoreInitialised :: _, _, _, true) = raise InternalError "StoreInitialised found with no allocation" (* For the moment we allow only a limited range of instructions here*) | searchAlloc((s as StoreConstToMemory _) :: tl, instrs, modRegs, alloc) = searchAlloc(tl, s :: instrs, modRegs, alloc) | searchAlloc((s as StoreRegToMemory _) :: tl, instrs, modRegs, alloc) = searchAlloc(tl, s :: instrs, modRegs, alloc) | searchAlloc((s as StoreLongConstToMemory _) :: tl, instrs, modRegs, alloc) = searchAlloc(tl, s :: instrs, modRegs, alloc) | searchAlloc((s as ResetStack _) :: tl, instrs, modRegs, alloc) = searchAlloc(tl, s :: instrs, modRegs, alloc) | searchAlloc((s as LoadMemR{output, ...}) :: tl, instrs, modRegs, alloc) = if output = aOut then [] else searchAlloc(tl, s :: instrs, regSetUnion(modRegs, singleton output), alloc) | searchAlloc((s as MoveRR{output, ...}) :: tl, instrs, modRegs, alloc) = if output = aOut then [] else searchAlloc(tl, s :: instrs, regSetUnion(modRegs, singleton output), alloc) (* Anything else terminates the search. *) | searchAlloc _ = [] in case searchAlloc(tl, [], noRegisters, false) of [] => reverse(tl, l :: list, rep) | newTail => reverse(newTail, list, true) end | reverse(hd :: tl, list, rep) = reverse(tl, hd :: list, rep) (* Repeat scans through the code until there are no further changes. *) fun repeat ops = case forward(ops, [], false) of (list, false) => list | (list, true) => repeat list in if lowLevelOptimise code then repeat ops else ops end structure Sharing = struct type operation = operation type code = code end end; polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/X86OUTPUTCODE.ML000066400000000000000000005164131265146633400236650ustar00rootroot00000000000000(* Copyright David C. J. Matthews 1989, 2000, 2009-10, 2012-13, 2015 Based on original code: Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Code Generator Routines. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1989 *) (* This module contains the code vector and operations to insert code into it. Each procedure is compiled into a separate segment. Initially it is compiled into a fixed size segment, and then copied into a segment of the correct size at the end. This module contains all the definitions of the X86 opCodes and registers. It uses "codeseg" to create and operate on the segment itself. *) functor X86OUTPUTCODE ( structure DEBUG: DEBUGSIG structure PRETTY: PRETTYSIG (* for compilerOutTag *) ) : X86CODESIG = struct open CODE_ARRAY open DEBUG; open Address open Misc; val isX64 = wordSize = 8 (* Generate X64 instructions if the word length is 8. *) infix 5 << <<+ <<- >> >>+ >>- ~>> ~>>+ ~>>- (* Shift operators *) infix 3 andb orb xorb andbL orbL xorbL andb8 orb8 xorb8 val op << = Word.<< and op >> = Word.>> val op <<+ = LargeWord.<< and op >>+ = LargeWord.>> val op <<- = Word8.<< and op >>- = Word8.>> val op orb = Word.orb and op orbL = LargeWord.orb and op orb8 = Word8.orb val op andb8 = Word8.andb val op andb = Word.andb (* and op andbL = LargeWord.andb *) val wordToWord8 = Word8.fromLargeWord o Word.toLargeWord (*and word8ToWord = Word.fromLargeWord o Word8.toLargeWord*) val exp2_7 = 0x80 val exp2_8 = 0x100 val exp2_16 = 0x10000 val exp2_30 = 0x40000000 val exp2_31 = 0x80000000 val exp2_56 = 0x100000000000000 val exp2_64 = 0x10000000000000000 (* tag a short constant *) fun tag c = 2 * c + 1; fun is8Bit n = ~ 0x80 <= n andalso n < 0x80 local val shift = if wordSize = 4 then 0w2 else if wordSize = 8 then 0w3 else raise InternalError "Invalid word size for x86_32 or x86+64" in fun wordsToBytes n = n << shift and bytesToWords n = n >> shift end infix 6 addrPlus addrMinus; (* All indexes into the code vector have type "addrs" *) type addrs = Word.word (* + is defined to add an integer to an address *) fun a addrPlus b = a + Word.fromInt b; (* The difference between two addresses is an integer *) fun a addrMinus b = Word.toInt a - Word.toInt b val addrZero = 0w0; val addrLast = wordsToBytes maxAllocation (* A large address. *) val addrUnsetLabel = addrLast (* An invalid address *) (* The "value" points at the jump instruction, or rather at the jump offset part of it. It is a ref because we may have to change it if we have to put in a jump with a 32-bit offset. *) datatype jumpFrom = Jump8From of addrs | Jump32From of addrs (* This is the list of outstanding labels. *) type labList = jumpFrom ref list (* This is the external label type used when constructing operations. The ref int is just an identifier for convenience when printing. *) datatype label = Labels of { forward: labList ref, reverse: addrs ref, labId: int ref, uses: int ref, chain: label option ref } fun mkLabel() = Labels{forward = ref [], reverse=ref addrUnsetLabel, labId = ref 0, uses = ref 0, chain=ref NONE} datatype setCodeseg = Unset | Set of cseg (* Used for completing forward references. *) (* Constants which are too large to go inline in the code are put in a list and put at the end of the code. They are arranged so that the garbage collector can find them and change them as necessary. A reference to a constant is treated like a forward reference to a label. *) (* A code list is used to hold a list of code-vectors which must have the address of this code-vector put into it. *) datatype const = WVal of machineWord (* an existing constant *) | CVal of code (* a forward-reference to another function *) | HVal of addrs ref (* a handler *) and ConstPosn = InlineAbsolute (* The constant is within the code. *) | InlineRelative (* The constant is within the code but is PC relative (call or jmp). *) | ConstArea of int (* The constant is in the constant area (64-bit only). *) | NonAddrArea (* The constant is in the non-address area (64-bit real values). *) and code = Code of { codeVec: cseg, (* This segment is used as a buffer. When the procedure has been code generated it is copied into a new segment of the correct size *) ic: addrs ref, (* Pointer to first free location in "codevec" *) constVec: (* Constants used in the code *) {const: const, addrs: addrs, posn: ConstPosn} list ref, numOfConsts: word ref, (* size of constVec *) nonInlineConsts: int ref, nonAddressConsts: int ref, labelList: labList ref, (* List of outstanding short branches. *) longestBranch: addrs ref, (* Address of the earliest 1-byte branch. *) procName: string, (* Name of the procedure. *) completionHooks: (* Functions to call when we have the final code address. *) (code * machineWord -> unit) list ref, resultSeg: setCodeseg ref, (* The segment as the final result. *) (* These next two are closely related but kept separate to avoid making big changes to the code. They are only non-empty immediately after JumpLabel instructions. justComeFrom accumulates forward branches to the current location. justComeFromAddrs accumulates the labels themselves if they are needed for reverse jumps. *) justComeFrom: labList ref, (* The label we have just jumped from. *) justComeFromAddrs: addrs ref list ref, (* *) exited: bool ref, (* False if we can fall-through to here *) noClosure: bool, (* should we make a closure from this? *) branchCheck: addrs ref, (* the address we last fixed up to. I added this to track down a bug and I've left it in for security. DCJM 19/1/01. *) printAssemblyCode:bool, (* Whether to print the code when we finish. *) printStream: string->unit, (* The stream to use *) lowLevelOptimise: bool, (* Whether to do the low-level optimisation pass *) profileObject : machineWord, (* The profile object for this code. *) inAllocation: bool ref (* Whether we have an incomplete allocation. *) } (* Exported functions *) fun procName (Code {procName,...}) = procName and lowLevelOptimise(Code{lowLevelOptimise, ...}) = lowLevelOptimise (* Add a function to be called when the code is complete and the final address is known. Called immediately if it has already been compiled. *) fun addCompletionHook(code as Code{resultSeg = ref(Set seg), ...}, hookFn) = hookFn(code, toMachineWord(csegAddr seg)) | addCompletionHook(Code{completionHooks, ...}, hookFn) = completionHooks := hookFn :: !completionHooks (* %ebp points to a structure that interfaces to the RTS. These are offsets into that structure. *) val memRegLocalMPointer = 0 and memRegHandlerRegister = wordSize and memRegLocalMbottom = wordSize*2 and memRegStackLimit = wordSize*3 and memRegHeapOverflowCall = wordSize*8 and memRegStackOverflowCall = wordSize*9 and memRegStackOverflowCallEx = wordSize*10 and memRegRaiseException = wordSize*11 and memRegRaiseDiv = wordSize*13 and memRegArbEmulation = wordSize*14 and memRegThreadSelf = wordSize*15 (* Several operations are not generated immediately but recorded and generated later. Labels (i.e. the destination of a branch) are recorded in just_come_from. Adjustments to the real stack pointer are recorded in stack_reset. The order in which these "instructions" are assumed to happen is of course significant. If just_come_from is not empty it is assumed to have happened before anything else. After that the stack pointer is adjusted and finally the next instruction is executed. *) val initialCodeSize = 0w15 (* words. Initial size of segment. *) (* Test for identity of the code segments by testing whether the "ic" ref is the same. N.B. NOT its contents. *) fun sameCode(Code{ic=a, ...}, Code{ic=b, ...}) = a=b; (* create and initialise a code segment *) fun codeCreate (noClosure : bool, name : string, profObj, parameters) : code = let val printStream = PRETTY.getSimplePrinter parameters; in Code { codeVec = csegMake initialCodeSize, (* a byte array *) ic = ref addrZero, constVec = ref [], numOfConsts = ref 0w0, nonInlineConsts = ref 0, nonAddressConsts = ref 0, labelList = ref [], longestBranch = ref addrLast, (* None so far *) procName = name, completionHooks= ref [], resultSeg = ref Unset, (* Not yet done *) justComeFrom = ref [], justComeFromAddrs = ref [], exited = ref false, noClosure = noClosure, branchCheck = ref addrZero, printAssemblyCode = DEBUG.getParameter DEBUG.assemblyCodeTag parameters, printStream = printStream, lowLevelOptimise = DEBUG.getParameter DEBUG.lowlevelOptimiseTag parameters, profileObject = profObj, inAllocation = ref false } end (* Put 1 unsigned byte at a given offset in the segment. *) fun set8u (b, addr, seg) = csegSet (seg, addr, b) (* Put 1 signed byte at a given offset in the segment. *) fun set8s (b : int, addr, seg) = let val a = addr; val b' = if b < 0 then b + exp2_8 else b; in csegSet (seg, a, Word8.fromInt b') end; (* Get 1 unsigned byte from the given offset in the segment. *) fun get8u (a: word, seg: cseg) : Word8.word = csegGet (seg, a); (* Get 1 signed byte from the given offset in the segment. *) fun get8s (a: word, seg: cseg) : int = Word8.toIntX (csegGet (seg, a)); (* Put 4 bytes at a given offset in the segment. *) (* b0 is the least significant byte. *) fun set4Bytes (b3, b2, b1, b0, addr, seg) = let val a = addr; in (* Little-endian *) csegSet (seg, a, b0); csegSet (seg, a + 0w1, b1); csegSet (seg, a + 0w2, b2); csegSet (seg, a + 0w3, b3) end; (* Put 1 unsigned word at a given offset in the segment. *) fun set32u (ival: LargeWord.word, addr: addrs, seg) : unit = let val b3 = Word8.fromLargeWord (ival >>+ 0w24) val b2 = Word8.fromLargeWord (ival >>+ 0w16) val b1 = Word8.fromLargeWord (ival >>+ 0w8) val b0 = Word8.fromLargeWord ival in set4Bytes (b3, b2, b1, b0, addr, seg) end (* Put 1 signed word at a given offset in the segment. *) fun set32s (ival: int, addr: addrs, seg) : unit = set32u(LargeWord.fromInt ival, addr, seg) fun setBytes(_, _, _, 0) = () | setBytes(seg, ival, offset, count) = ( csegSet(seg, offset, Word8.fromInt(ival mod exp2_8)); setBytes(seg, ival div exp2_8, offset+0w1, count-1) ) fun setWordU (ival: int, addr: addrs, seg) : unit = setBytes(seg, ival, addr, wordSize) fun set64u (ival: int, addr: addrs, seg) : unit = setBytes(seg, ival, addr, 8) fun set64s (ival: int, addr: addrs, seg) : unit = let val topByte = (ival div exp2_56) mod exp2_8 in setBytes(seg, ival, addr, 7); setBytes(seg, if topByte < 0 then topByte + exp2_8 else topByte, addr + 0w7, 1) end (* Get 1 signed 32 bit word from the given offset in the segment. *) fun get32s (a: word, seg: cseg) : int = let val b0 = Word8.toInt (csegGet (seg, a)); val b1 = Word8.toInt (csegGet (seg, a + 0w1)); val b2 = Word8.toInt (csegGet (seg, a + 0w2)); val b3 = Word8.toInt (csegGet (seg, a + 0w3)); val b3' = if b3 >= exp2_7 then b3 - exp2_8 else b3; val topHw = (b3' * exp2_8) + b2; val bottomHw = (b1 * exp2_8) + b0; in (topHw * exp2_16) + bottomHw end fun get64s (a: word, seg: cseg) : int = let val b0 = Word8.toInt (csegGet (seg, a)); val b1 = Word8.toInt (csegGet (seg, a + 0w1)); val b2 = Word8.toInt (csegGet (seg, a + 0w2)); val b3 = Word8.toInt (csegGet (seg, a + 0w3)); val b4 = Word8.toInt (csegGet (seg, a + 0w4)); val b5 = Word8.toInt (csegGet (seg, a + 0w5)); val b6 = Word8.toInt (csegGet (seg, a + 0w6)); val b7 = Word8.toInt (csegGet (seg, a + 0w7)); val b7' = if b7 >= exp2_7 then b7 - exp2_8 else b7; in ((((((((b7' * exp2_8 + b6) * exp2_8 + b5) * exp2_8 + b4) * exp2_8 + b3) * exp2_8 + b2) * exp2_8) + b1) * exp2_8) + b0 end (* Test whether a tagged value will fit into a 32-bit signed constant. *) fun isTagged32bitS(a: machineWord) = if isShort a then let val aI = Word.toIntX(toShort a) in ~exp2_30 <= aI andalso aI < exp2_30 end else false (* Code-generate a byte. *) fun gen8u (ival: Word8.word, Code {ic, codeVec, ...}) : unit = let val icVal = !ic; in ic := icVal addrPlus 1; set8u (ival, icVal, codeVec) end (* Used for signed byte values. *) fun gen8s (ival: int, Code {ic, codeVec, ...}) = if ~exp2_7 <= ival andalso ival < exp2_7 then let val icVal = !ic; in ic := icVal + 0w1; set8s (ival, icVal, codeVec) end else raise InternalError "gen8s: invalid byte"; (* Code-generate a 32-bit word. *) fun gen32u (ival: LargeWord.word, Code {ic, codeVec, ...}) : unit = let val icVal = !ic; in ic := icVal + 0w4; set32u (ival, icVal, codeVec) end fun gen32s (ival: int, Code {ic, codeVec, ...}) : unit = (* We really only need to check this on the 64-bit machine and it would otherwise be a hot-spot for arbitrary precision arithmetic on 32-bit m/c. *) if not isX64 orelse ~exp2_31 <= ival andalso ival < exp2_31 then let val icVal = !ic; in ic := icVal addrPlus 4; set32s (ival, icVal, codeVec) end else raise InternalError "gen32s: invalid word" fun gen64u (ival: int, Code {ic, codeVec, ...}) : unit = if 0 <= ival andalso (isShort(toMachineWord ival) orelse ival < exp2_64) then let val icVal = !ic; in ic := icVal addrPlus 8; set64u (ival, icVal, codeVec) end else raise InternalError "gen64u: invalid word" fun genWordU(ival, code) = if wordSize = 8 then gen64u(LargeWord.toInt ival, code) else gen32u (ival, code) fun gen64s (ival: int, Code {ic, codeVec, ...}) : unit = let val icVal = !ic; in ic := icVal addrPlus 8; set64s (ival, icVal, codeVec) end (* Add a constant to the list along with its address. We mustn't put the constant directly in the code since at this stage the code is simply a byte segment and if we have a garbage collection the value won't be updated. *) fun addConstToVec (valu: const, posn: ConstPosn, cvec as Code{numOfConsts, constVec, ic, nonInlineConsts, ...}): unit = let (* Inline constants are in the body of the code. Non-inline constants are stored in the constant vector at the end of the code. The value that goes in here is the PC-relative offset of the constant. *) val realPosn = case posn of ConstArea _ => (nonInlineConsts := ! nonInlineConsts + 1; ConstArea(!nonInlineConsts)) | p => p val isInline = case posn of ConstArea _ => false | NonAddrArea => false | _ => true in numOfConsts := ! numOfConsts + 0w1; constVec := {const = valu, addrs = !ic, posn = realPosn} :: ! constVec; (* We must put a valid tagged integer in here because we might get a garbage collection after we have copied this code into the new code segment but before we've put in the real constant. If this is a relative branch we need to point this at itself. Until it is set to the relative offset of the destination it needs to contain an address within the code and this could be the last instruction. *) if isInline andalso wordSize = 8 then gen64s (tag 0, cvec) else gen32s (case posn of InlineRelative => ~5 | _ => tag 0, cvec) end (* Registers and pseudo-registers. *) datatype reg = GenReg of Word8.word * bool | FPReg of Word8.word (* These are the real registers we have. The AMD extension encodes the additional registers through the REX prefix. *) val eax = GenReg (0w0, false) val ecx = GenReg (0w1, false) val edx = GenReg (0w2, false) val ebx = GenReg (0w3, false) val esp = GenReg (0w4, false) val ebp = GenReg (0w5, false) val esi = GenReg (0w6, false) val edi = GenReg (0w7, false) val r8 = GenReg (0w0, true) val r9 = GenReg (0w1, true) val r10 = GenReg (0w2, true) val r11 = GenReg (0w3, true) val r12 = GenReg (0w4, true) val r13 = GenReg (0w5, true) val r14 = GenReg (0w6, true) val r15 = GenReg (0w7, true) (* Floating point "registers". Actually entries on the floating point stack. The X86 has a floating point stack with eight entries. *) val fp0 = FPReg 0w0 and fp1 = FPReg 0w1 and fp2 = FPReg 0w2 and fp3 = FPReg 0w3 and fp4 = FPReg 0w4 and fp5 = FPReg 0w5 and fp6 = FPReg 0w6 and fp7 = FPReg 0w7 val regClosure = edx (* Addr. of closure for fn. call goes here. *) fun getReg (GenReg r) = r | getReg _ = raise InternalError "getReg: not a general register" fun mkReg n = GenReg n (* reg.up *) (* The maximum size of the register vectors and masks. Although the X86/32 has a floating point stack with eight entries it's much simpler to treat it as having seven "real" registers. Items are pushed to the stack and then stored and popped into the current location. It may be possible to improve the code by some peephole optimisation. *) val regs = 23 (* Include the X86/64 registers even if this is 32-bit. *) (* The nth register (counting from 0). *) (* Profiling shows that applying the constructors here creates a lot of garbage. Create the entries once and then use vector indexing instead. *) local fun regN i = if i < 8 then GenReg(Word8.fromInt i, false) else if i < 16 then GenReg(Word8.fromInt(i-8), true) else FPReg(Word8.fromInt(i-16)) val regVec = Vector.tabulate(regs, regN) in fun regN i = Vector.sub(regVec, i) handle Subscript => raise InternalError "Bad register number" end (* The number of the register. *) fun nReg(GenReg(r, false)) = Word8.toInt r | nReg(GenReg(r, true)) = Word8.toInt r + 8 | nReg(FPReg r) = Word8.toInt r + 16 fun regRepr(r as GenReg _) = if r = eax then (if isX64 then "%rax" else "%eax") else if r = ebx then (if isX64 then "%rbx" else "%ebx") else if r = ecx then (if isX64 then "%rcx" else "%ecx") else if r = edx then (if isX64 then "%rdx" else "%edx") else if r = esp then (if isX64 then "%rsp" else "%esp") else if r = ebp then (if isX64 then "%rbp" else "%ebp") else if r = esi then (if isX64 then "%rsi" else "%esi") else if r = edi then (if isX64 then "%rdi" else "%edi") else (* X86/64 registers *) "%r" ^ Int.toString (nReg r) | regRepr(FPReg n) = "fp" ^ Word8.toString n (* Install a pretty printer. This is simply for when this code is being run under the debugger. N.B. We need PolyML.PrettyString here. *) val () = PolyML.addPrettyPrinter(fn _ => fn _ => fn r => PolyML.PrettyString(regRepr r)) datatype argType = ArgGeneral | ArgFP structure RegSet = struct (* Implement a register set as a bit mask. *) datatype regSet = RegSet of word fun singleton r = RegSet(0w1 << Word.fromInt(nReg r)) fun regSetUnion(RegSet r1, RegSet r2) = RegSet(Word.orb(r1, r2)) fun regSetIntersect(RegSet r1, RegSet r2) = RegSet(Word.andb(r1, r2)) local fun addReg(acc, n) = if n = regs then acc else addReg(regSetUnion(acc, singleton(regN n)), n+1) in val allRegisters = addReg(RegSet 0w0, 0) end val noRegisters = RegSet 0w0 fun inSet(r, rs) = regSetIntersect(singleton r, rs) <> noRegisters fun regSetMinus(RegSet s1, RegSet s2) = RegSet(Word.andb(s1, Word.notb s2)) val listToSet = List.foldl (fn(r, rs) => regSetUnion(singleton r, rs)) noRegisters val generalRegisters = (* Registers checked by the GC. *) if isX64 then listToSet [eax, ecx, edx, ebx, esi, edi, r8, r9, r10, r11, r12, r13, r14] else listToSet [eax, ecx, edx, ebx, esi, edi] val floatingPtRegisters = listToSet [fp0, fp1, fp2, fp3, fp4, fp5, fp6(*, fp7*)] fun isAllRegs rs = rs = allRegisters fun setToList (RegSet regSet)= let fun testBit (n, bit, res) = if n = regs then res else testBit(n+1, bit << 0w1, if (regSet andb bit) <> 0w0 then regN n :: res else res) in testBit(0, 0w1, []) end val cardinality = List.length o setToList (* Choose one of the set. This chooses the least value which means that the ordering of the registers is significant. This is a hot-spot so is coded directly with the word operations. *) fun oneOf(RegSet regSet) = let fun find(n, bit) = if n = Word.fromInt regs then raise InternalError "oneOf: empty" else if Word.andb(bit, regSet) <> 0w0 then n else find(n+0w1, Word.<<(bit, 0w1)) in regN(Word.toInt(find(0w0, 0w1))) end fun regSetRepr regSet = let val regs = setToList regSet in "[" ^ String.concatWith "," (List.map regRepr regs) ^ "]" end (* Install a pretty printer for when this code is being debugged. *) val () = PolyML.addPrettyPrinter(fn _ => fn _ => fn r => PolyML.PrettyString(regSetRepr r)) end open RegSet (* Encode and decode the mask of modified registers stored in compiled code and maintained for the RTS. N.B. This encoding is built into x86asm.asm in the RTS. *) local val regMap = [ (eax, 0wx000001), (ecx, 0wx000002), (edx, 0wx000004), (ebx, 0wx000008), (esi, 0wx000010), (edi, 0wx000020), (r8, 0wx000040), (r9, 0wx000080), (r10, 0wx000100), (r11, 0wx000200), (r12, 0wx000400), (r13, 0wx000800), (r14, 0wx001000), (* Floating point registers. *) (fp0, 0wx002000), (fp1, 0wx004000), (fp2, 0wx008000), (fp3, 0wx010000), (fp4, 0wx020000), (fp5, 0wx040000), (fp6, 0wx080000), (fp7, 0wx100000) ] in fun getRegisterSet (rSet: Word.word): regSet = let fun testBit((reg, bit), acc) = if (rSet andb bit) = 0w0 then acc else reg :: acc val regs = List.foldl testBit [] regMap in listToSet regs end and encodeRegSet(regSet: regSet): word = let fun testBit((reg, bit), acc) = if inSet(reg, regSet) then acc orb bit else acc in List.foldl testBit 0w0 regMap end end datatype arithOp = ADD | OR (*|ADC | SBB*) | AND | SUB | XOR | CMP fun arithOpToWord ADD = 0w0: Word8.word | arithOpToWord OR = 0w1 | arithOpToWord AND = 0w4 | arithOpToWord SUB = 0w5 | arithOpToWord XOR = 0w6 | arithOpToWord CMP = 0w7 fun arithOpRepr ADD = "Add" | arithOpRepr OR = "Or" | arithOpRepr AND = "And" | arithOpRepr SUB = "Sub" | arithOpRepr XOR = "Xor" | arithOpRepr CMP = "Cmp" datatype shiftType = SLL | SRL | SRA fun shiftTypeToWord SLL = 0w4: Word8.word | shiftTypeToWord SRL = 0w5 | shiftTypeToWord SRA = 0w7 fun shiftTypeRepr SLL = "Shift Left Logical" | shiftTypeRepr SRL = "Shift Right Logical" | shiftTypeRepr SRA = "Shift Right Arithemetic" datatype group3Ops = NOT | NEG | MUL | IMUL | DIV | IDIV fun group3OpsToWord NOT = 0w2: Word8.word | group3OpsToWord NEG = 0w3 | group3OpsToWord MUL = 0w4 | group3OpsToWord IMUL = 0w5 | group3OpsToWord DIV = 0w6 | group3OpsToWord IDIV = 0w7 fun group3OpsRepr NOT = "NOT" | group3OpsRepr NEG = "NEG" | group3OpsRepr MUL = "MUL" | group3OpsRepr IMUL = "IMUL" | group3OpsRepr DIV = "DIV" | group3OpsRepr IDIV = "IDIV" datatype repOps = CMPSB | MOVSB | MOVSL | STOSB | STOSL fun repOpsToWord CMPSB = 0wxa6: Word8.word | repOpsToWord MOVSB = 0wxa4 | repOpsToWord MOVSL = 0wxa5 | repOpsToWord STOSB = 0wxaa | repOpsToWord STOSL = 0wxab fun repOpsRepr CMPSB = "CompareBytes" | repOpsRepr MOVSB = "MoveBytes" | repOpsRepr MOVSL = "MoveWords" | repOpsRepr STOSB = "StoreBytes" | repOpsRepr STOSL = "StoreWords" datatype fpOps = FADD | FMUL | FCOM | FCOMP | FSUB | FSUBR | FDIV | FDIVR fun fpOpToWord FADD = 0w0: Word8.word | fpOpToWord FMUL = 0w1 | fpOpToWord FCOM = 0w2 | fpOpToWord FCOMP = 0w3 | fpOpToWord FSUB = 0w4 | fpOpToWord FSUBR = 0w5 | fpOpToWord FDIV = 0w6 | fpOpToWord FDIVR = 0w7 fun fpOpRepr FADD = "FPAdd" | fpOpRepr FMUL = "FPMultiply" | fpOpRepr FCOM = "FPCompare" | fpOpRepr FCOMP = "FPCompareAndPop" | fpOpRepr FSUB = "FPSubtract" | fpOpRepr FSUBR = "FPReverseSubtract" | fpOpRepr FDIV = "FPDivide" | fpOpRepr FDIVR = "FPReverseDivide" datatype fpUnaryOps = FCHS | FABS | FSQRT | FSIN | FCOS | FPATAN | FLD1 | FLDZ fun fpUnaryToWords FCHS = {rm=0w0:Word8.word, nnn=0w4: Word8.word} | fpUnaryToWords FABS = {rm=0w1, nnn=0w4} | fpUnaryToWords FSQRT = {rm=0w2, nnn=0w7} | fpUnaryToWords FSIN = {rm=0w6, nnn=0w7} | fpUnaryToWords FCOS = {rm=0w7, nnn=0w7} | fpUnaryToWords FPATAN = {rm=0w3, nnn=0w6} | fpUnaryToWords FLD1 = {rm=0w0, nnn=0w5} | fpUnaryToWords FLDZ = {rm=0w6, nnn=0w5} fun fpUnaryRepr FCHS = "FPChangeSign" | fpUnaryRepr FABS = "FPAbs" | fpUnaryRepr FSQRT = "FPSquareRoot" | fpUnaryRepr FSIN = "FPSin" | fpUnaryRepr FCOS = "FPCos" | fpUnaryRepr FPATAN = "FPPartialArctan" | fpUnaryRepr FLD1 = "FPLoadOne" | fpUnaryRepr FLDZ = "FPLoadZero" datatype branchOps = JO | JNO | JE | JNE | JL | JGE | JLE | JG | JB | JNB | JNA | JA fun branchOpToWord JO = 0wx0: Word8.word | branchOpToWord JNO = 0wx1 | branchOpToWord JB = 0wx2 | branchOpToWord JNB = 0wx3 | branchOpToWord JE = 0wx4 | branchOpToWord JNE = 0wx5 | branchOpToWord JNA = 0wx6 | branchOpToWord JA = 0wx7 | branchOpToWord JL = 0wxc | branchOpToWord JGE = 0wxd | branchOpToWord JLE = 0wxe | branchOpToWord JG = 0wxf fun branchOpRepr JO = "JumpOverflow" | branchOpRepr JNO = "JumpNotOverflow" | branchOpRepr JE = "JumpEqual" | branchOpRepr JNE = "JumpNotEqual" | branchOpRepr JL = "JumpLess" | branchOpRepr JGE = "JumpGreaterOrEqual" | branchOpRepr JLE = "JumpLessOrEqual" | branchOpRepr JG = "JumpGreater" | branchOpRepr JB = "JumpBefore" | branchOpRepr JNB= "JumpNotBefore" | branchOpRepr JNA = "JumpNotAfter" | branchOpRepr JA = "JumpAfter" (* Primary opCodes. N.B. only opCodes actually used are listed here. If new instruction are added check they will be handled by the run-time system in the event of trap. *) datatype opCode = Group1_8_A | Group1_32_A | Group1_8_a | JMP_8 | JMP_32 | CALL_32 (* SPF 6/6/95 *) | MOVL_A_R | MOVL_R_A | MOVB_R_A | PUSH_R of Word8.word | POP_R of Word8.word | Group5 | NOP | LEAL | MOVL_32_64_R of Word8.word | MOVL_32_A | MOVB_8_A | ESCAPE | POP_A | RET | RET_16 | CondJump of branchOps | Arith of arithOp * Word8.word | STC | Group3_A | Group3_a | Group2_8_A | Group2_CL_A | Group2_1_A | PUSH_8 | PUSH_32 | TEST_ACC8 | LOCK_XADD | FPESC of Word8.word | XCHNG | REP (* Rep prefix *) | SAHF | MOVZX (* Needs escape code. *) fun opToInt opn: Word8.word = case opn of Group1_8_A => 0wx83 | Group1_32_A => 0wx81 | Group1_8_a => 0wx80 | JMP_8 => 0wxeb | JMP_32 => 0wxe9 | CALL_32 => 0wxe8 | MOVL_A_R => 0wx8b | MOVL_R_A => 0wx89 | MOVB_R_A => 0wx88 | PUSH_R reg => 0wx50 + reg | POP_R reg => 0wx58 + reg | Group5 => 0wxff | NOP => 0wx90 | LEAL => 0wx8d | MOVL_32_64_R reg => 0wxb8 + reg | MOVL_32_A => 0wxc7 | MOVB_8_A => 0wxc6 | ESCAPE => 0wx0f | POP_A => 0wx8f | RET => 0wxc3 | RET_16 => 0wxc2 | CondJump opc => 0wx70 + branchOpToWord opc | Arith (ao,dw) => arithOpToWord ao * 0w8 + dw | STC => 0wxf9 | Group3_A => 0wxf7 | Group3_a => 0wxf6 | Group2_8_A => 0wxc1 | Group2_1_A => 0wxd1 | Group2_CL_A => 0wxd3 | PUSH_8 => 0wx6a | PUSH_32 => 0wx68 | TEST_ACC8 => 0wxa8 | LOCK_XADD => 0wxC1 (* Needs lock and escape prefixes. *) | FPESC n => 0wxD8 orb8 n | XCHNG => 0wx87 | REP => 0wxf3 | SAHF => 0wx9e | MOVZX => 0wxb6 (* Needs escape code. *) (* ... val eax = Reg 0; val ecx = Reg 1; val edx = Reg 2; val ebx = Reg 3; val esp = Reg 4; (* also used for "SIB used" and "no index" *) val ebp = Reg 5; (* also used for "absolute" *) val esi = Reg 6; val edi = Reg 7; type basereg = reg; {0,1,2,3,6,7 only} type indexreg = reg; {0,1,2,3,5,6,7 only} The i386 family has a horrendous collection of not-quite-orthogonal addressing modes. Register mode: (1) reg mod = 3; r/m = getReg reg DS-relative addressing modes: (2) DS:[basereg] mod = 0; r/m = getReg basereg (3) DS:[basereg + disp8] mod = 1; r/m = getReg basereg (4) DS:[basereg + disp32] mod = 2; r/m = getReg basereg (2a) DS:[basereg] mod = 0; r/m = 4; s = ?; i = 4; b = getReg basereg (3a) DS:[basereg + disp8] mod = 1; r/m = 4; s = ?; i = 4; b = getReg basereg (4a) DS:[basereg + disp32] mod = 2; r/m = 4; s = ?; i = 4; b = getReg basereg (5) DS:[basereg + (scale * indexreg)] mod = 0; r/m = 4; s = scale; i = getReg indexreg; b = getReg basereg (6) DS:[basereg + (scale * indexreg) + disp8] mod = 1; r/m = 4; s = scale; i = getReg indexreg; b = getReg basereg (7) DS:[basereg + (scale * indexreg) + disp32] mod = 2; r/m = 4; s = scale; i = getReg indexreg; b = getReg basereg (8) DS:disp32 mod = 0; r/m = 5 (8a) DS:[disp32] mod = 0; r/m = 4; s = ?; i = 4; b = 5 (9) DS:[disp32 + (scale * indexreg)] mod = 0; r/m = 4; s = scale; i = getReg indexreg; b = 5 SS-relative addressing modes: (10) SS:[ebp + disp8] mod = 1; r/m = 5 (11) SS:[ebp + disp32] mod = 2; r/m = 5 (12) SS:[ebp + (scale * indexreg) + disp8] mod = 1; r/m = 4; s = scale; i = getReg indexreg; b = 5 (13) SS:[ebp + (scale * indexreg) + disp32] mod = 2; r/m = 4; s = scale; i = getReg indexreg; b = 5 (14) SS:[esp + (scale * indexreg)] mod = 0; r/m = 4; s = scale; i = getReg indexreg; b = 4 (15) SS:[esp + (scale * indexreg) + disp8] mod = 1; r/m = 4; s = scale; i = getReg indexreg; b = 4 (16) SS:[esp + (scale * indexreg) + disp32] mod = 2; r/m = 4; s = scale; i = getReg indexreg; b = 4 ... *) datatype mode = Based0 (* mod = 0 *) | Based8 (* mod = 1 *) | Based32 (* mod = 2 *) | Register (* mod = 3 *) ; (* Put together the three fields which make up the mod r/m byte. *) fun modrm (md : mode, rg: Word8.word, rm : Word8.word) : Word8.word = let val _ = if rg > 0w7 then raise InternalError "modrm: bad rg" else () val _ = if rm > 0w7 then raise InternalError "modrm: bad rm" else () val modField: Word8.word = case md of Based0 => 0w0 | Based8 => 0w1 | Based32 => 0w2 | Register => 0w3 in (modField <<- 0w6) orb8 (rg <<- 0w3) orb8 rm end fun genmodrm (md : mode, rg: Word8.word, rm : Word8.word, cvec) : unit = gen8u (modrm (md, rg, rm), cvec) (* REX prefix *) fun rex {w,r,x,b} = 0wx40 orb8 (if w then 0w8 else 0w0) orb8 (if r then 0w4 else 0w0) orb8 (if x then 0w2 else 0w0) orb8 (if b then 0w1 else 0w0) (* The X86 has the option to include an index register and to scale it. *) datatype indexType = NoIndex | Index1 of reg | Index2 of reg | Index4 of reg | Index8 of reg (* Put together the three fields which make up the s-i-b byte. *) fun sib (s : indexType, b : reg option) : Word8.word = let val sizeField = case s of NoIndex => 0w4 <<- 0w3 (* No index reg. *) | Index1 i => (0w0 <<- 0w6) orb8 (#1 (getReg i) <<- 0w3) | Index2 i => (0w1 <<- 0w6) orb8 (#1 (getReg i) <<- 0w3) | Index4 i => (0w2 <<- 0w6) orb8 (#1 (getReg i) <<- 0w3) | Index8 i => (0w3 <<- 0w6) orb8 (#1 (getReg i) <<- 0w3) val baseField = case b of SOME r => #1 (getReg r) | NONE => 0w5 (* No base *) in sizeField orb8 baseField end fun gensib (s : indexType, b : reg option, cvec : code) = gen8u (sib (s, b), cvec); fun scSet (Set x) = x | scSet _ = raise InternalError "scSet"; (* Make a reference to another procedure. Usually this will be a forward reference but it may have been compiled already, in which case we can put the code address in now. *) fun codeConst (Code {resultSeg = ref(Set seg), ... }, isRel, into) = (* Already done. *) addConstToVec (WVal (toMachineWord(csegAddr seg)), isRel, into) | codeConst (r, isRel, into as Code{ic = ref constPosition, nonInlineConsts=ref nic, ...} ) = (* forward *) (* Forward reference to other code or a recursive reference to this one. Add a completion hook to the other code. *) let fun onCompletion(_, finalAddr) = let (* This is called after the forward reference is completed but also after this code, the one making the reference, has been completed. *) val Code{numOfConsts, resultSeg = ref resultSeg, ic = ref endByte, ...} = into in (* Fix up the forward reference. *) case isRel of InlineRelative => csegPutConstant (scSet resultSeg, constPosition, finalAddr, true) | InlineAbsolute => csegPutConstant (scSet resultSeg, constPosition, finalAddr, false) | NonAddrArea => raise InternalError "onCompletion: NonAddrArea" | ConstArea _ => let val addrOfConst = endByte addrPlus (nic+1-1 + 2+1) * wordSize val seg = scSet resultSeg in csegPutConstant (seg, addrOfConst, finalAddr, false); set32s(Word.toInt(addrOfConst - constPosition - 0w4), constPosition, seg) end; (* decrement the "pending references" count *) numOfConsts := !numOfConsts - 0w1; (* If this function has no more references we can lock it. *) if !numOfConsts = 0w0 then csegLock (scSet resultSeg) else () end val _ = addCompletionHook(r, onCompletion) in addConstToVec (CVal r, isRel, into) end (* Removes a label from the list when it has been fixed up or converted to the long form. *) fun removeLabel (lab:addrs, Code{longestBranch, labelList, ... }) : unit = let fun removeEntry ([]: labList) : labList = [] | removeEntry ((ref (Jump32From _)) :: t) = removeEntry t (* we discard long jumps *) | removeEntry ((entry as ref (Jump8From addr)) :: t) = if lab = addr then removeEntry t else ( if addr < !longestBranch then longestBranch := addr else (); entry :: removeEntry t ) (* removeEntry *); in (* Must also find the new longest branch. *) longestBranch := addrLast; labelList := removeEntry (! labelList) end; (* Fix up the list of labels. *) fun reallyFixBranches ([] : labList) _ = () | reallyFixBranches (h::t) (cvec as Code{codeVec=cseg, ic, branchCheck, ...}) = ((case !h of Jump8From addr => let val offset : int = get8s (addr, cseg); val diff : int = (!ic addrMinus addr) - 1; in branchCheck := !ic; if is8Bit diff then () else raise InternalError "jump too large"; if offset <> 0 then raise InternalError "reallyFixBranches: jump already patched" else set8s (diff, addr, cseg); removeLabel (addr, cvec) end | Jump32From addr => let val offset : int = get32s (addr, cseg); val diff : int = (!ic addrMinus addr) - 4; in branchCheck := !ic; if offset <> 0 then raise InternalError "reallyFixBranches: jump already patched" else (* A zero offset is more than simply redundant, it can introduce zero words into the code which could be taken as markers. It will not normally be produced but can occur in very unusual cases. The only example I've seen is a branch extension in a complicated series of andalsos and orelses where the branch extension was followed by an unconditional branch which was then backed up by check_labs. We simply fill it with no-ops. *) if diff = 0 then let val a = addr; val nop = opToInt NOP; in csegSet (cseg, a - 0w1, nop); csegSet (cseg, a, nop); csegSet (cseg, a + 0w1, nop); csegSet (cseg, a + 0w2, nop); csegSet (cseg, a + 0w3, nop) end else set32s (diff, addr, cseg) end ); reallyFixBranches t cvec ) (* Makes a new label. *) fun makeShortLabel (addr: addrs, Code{longestBranch, labelList ,...}) : jumpFrom ref = let val lab = ref (Jump8From addr); in if addr < ! longestBranch then longestBranch := addr else (); labelList := lab :: ! labelList; lab end; (* Apparently fix up jumps - actually just record where we have come from *) fun fixup (labs:labList, cvec as Code{justComeFrom, exited, ic, branchCheck, ...}) = let (* If the jump we are fixing up is immediately preceding, we can remove it. It is particularly important to remove 32 bit jumps to the next instruction because they would put a word of all zeros in the code, and that could be mistaken for a marker word. *) fun checkLabs [] = [] | checkLabs ((lab as ref (Jump8From addr))::labs) = if !ic addrMinus addr = 1 andalso !ic <> !branchCheck then ( (* It now seems that we can have a !ic = !branchCheck in the situation where we have a handler that does nothing. Setting the handler entry point sets branchCheck but the branch round the empty handler does nothing. This should be tidied up by peep-hole optimisation. *) if !ic <= !branchCheck then raise InternalError "Backing up too far (8bit)" else (); ic := addr addrPlus ~1; (* Back up over the opCode *) removeLabel (addr, cvec); exited := false; checkLabs labs ) else lab :: checkLabs labs | checkLabs ((lab as ref (Jump32From addr))::labs) = if !ic addrMinus addr = 4 then ( if !ic <= !branchCheck then raise InternalError "Backing up too far (32bit)" else (); ic := addr addrPlus ~1; (* Back up over the opCode *) exited := false; checkLabs labs ) else lab :: checkLabs labs fun doCheck labs = (* Repeatedly check the labels until we are no longer backing up. We may have several to back up if we have just extended some branches and then immediately fix them up. DCJM 19/1/01. *) let val lastIc = !ic val newLabs = checkLabs labs in if lastIc = !ic then newLabs else doCheck newLabs end in case labs of [] => () (* we're not actually jumping from anywhere *) | _ => ( (* Add together the jumps to here and remove redundant jumps. *) justComeFrom := doCheck (labs @ !justComeFrom) ) end; fun checkBranchList (cvec as Code{longestBranch, justComeFrom, exited, ic, labelList, ...}, branched, size) = (* If the longest branch is close to going out of range it must be converted into a long form. *) (* If we have just made an unconditional branch then we make the distance shorter. *) let (* Generally we only need to extend the nearest short branch but it is possible that two branches could be very close together. In that case extending one branch could push another out of range. *) val maxDiff = Int.min(if branched then 100 else 127, 127 - 5 * List.length (!labelList)) - size; (* See if we must extend some branches. If we are going to fix up a label immediately we don't normally extend it. The exception is if we have to extend some other labels in which case we may have to extend this because the jumps we add may push this label out of range. *) local val icOffset = if branched then !ic else !ic addrPlus 2 (* Size of the initial branch. *) fun checkLab (lab as ref (Jump8From addr), n) = if List.exists (fn a => a = lab) (! justComeFrom) then n (* Don't include it here. *) else if (icOffset addrMinus addr) + n > (100 - size) then n+5 else n | checkLab (_, n) = n (* Extending one branch may extend others. We need to process the list in reverse order. *) in val jumpSpace = List.foldr checkLab 0 (!labelList) end (* Go down the list converting any long labels, and finding the longest remaining. *) fun convertLabels ([]:labList) : labList = [] | convertLabels (lab::labs) = let (* Process the list starting at the end. The reason for this is that more recent labels appear before earlier ones. We must put the earliest labels in first because they may be about to go out of range. *) val convertRest = convertLabels labs in (* Now do this entry. *) case !lab of Jump32From _ => raise InternalError "Long jump in label list" (* shouldn't happen *) | Jump8From addr => (* If we are about to fix this label up we don't need to extend it except that we must extend it if we are going to put in more branch extensions which will take it out of range. DCJM 9/4/01. *) if List.exists (fn a => a = lab) (! justComeFrom) andalso (jumpSpace = 0 orelse !ic addrMinus addr < 127 - jumpSpace) then lab :: convertRest else if !ic addrMinus addr > (100 - size) orelse !ic addrMinus addr > maxDiff then (* Getting close - convert it. *) ( reallyFixBranches [lab] cvec; (* fix up short jump to here *) gen8u (opToInt JMP_32, cvec); gen32u (0w0, cvec); (* long jump to final destination *) lab := Jump32From (!ic addrPlus ~4); (* Return the rest of the list. *) convertRest ) else ( (* Not ready to remove this. Just find out if this is an earlier branch and continue. *) if addr < ! longestBranch then longestBranch := addr else (); lab :: convertRest ) end (* convertLabels *); in if ! longestBranch <> addrLast andalso !ic addrMinus ! longestBranch > maxDiff then let (* Must skip round the branches unless we have just taken an unconditional branch. *) val lab = if branched then [] else ( exited := true; gen8u (opToInt JMP_8, cvec); gen8u (0w0, cvec); [makeShortLabel (!ic addrPlus ~1, cvec)] ); in (* Find the new longest branch. *) longestBranch := addrLast; (* Initial value. *) labelList := convertLabels (!labelList); fixup (lab, cvec) (* Continue with normal processing. *) end else () end (* Do all the outstanding operations including fixing up the branches. *) fun doPending (cvec as Code{exited, justComeFromAddrs, branchCheck, ic, ...}, size) : unit = let (* Deal with a pending fix-up. *) fun reallyFixup (Code{justComeFrom=ref [], ... }) = () | reallyFixup (cvec as Code{justComeFrom=jcf as ref labs, exited, ... }) = (exited := false; reallyFixBranches labs cvec; jcf := []); in (* If we have not exited and there are branches coming in here then we fix them up before jumping round any branch extensions. *) if ! exited then () else reallyFixup cvec; checkBranchList(cvec, ! exited, size); exited := false; (* Fix up any incoming branches, including a jump round any branch extensions. *) reallyFixup cvec; (* Finally record the current location into any reverse branches. *) branchCheck := !ic; List.app (fn addr => addr := !ic) (! justComeFromAddrs); justComeFromAddrs := [] end (* 12 is maximum size of an instruction. It's also big enough for a comparison and the following conditional branch. *) val maxInstrSize = if isX64 then 15 else 12 (* Generate an opCode byte after doing any pending operations. *) fun genop(opb:opCode, rx, cvec) = ( doPending (cvec, maxInstrSize); case rx of NONE => () | SOME rxx => if isX64 then gen8u(rex rxx, cvec) else raise InternalError "genop: rex prefix in 32 bit mode"; gen8u (opToInt opb, cvec) ) (* This has to be done quite carefully if we are to be able to back-up over jumps that point to the next instruction in fixup. We have to guarantee that if we back up we haven't already set a jump to point beyond where we're backing up. See below for more explanation. DCJM 19/1/01.*) fun putConditional (br: branchOps, cvec as Code{ic, ...}) : jumpFrom ref = ( gen8u (opToInt(CondJump br), cvec); (* Don't use genop. *) gen8u (0w0, cvec); makeShortLabel (!ic addrPlus ~1, cvec) ) (* Generates an unconditional branch. *) fun unconditionalBranch (cvec as Code {justComeFrom, exited, ic, ...}): labList = let (* If we have just jumped here we may be able to avoid generating a jump instruction. *) val labs = ! justComeFrom in justComeFrom := []; (* We may get the sequence: jmp L1; L2: jmp L3. If this is the "jmp L3" we can simply remember everything that was supposed to jump to L2 and replace it with jumps to L3. *) (* This code has one disadvantage. If we have several short branches coming here we don't record against the branches themselves that they're all going to the same place. If we have to extend them we put in separate long branches for each rather than pointing them all at the same branch. This doesn't increase run-time but makes the code larger than it need be. DCJM 1/1/01. *) if ! exited then labs else let (* The code here has gone through various versions. The original version always fixed up pending branches so that if we had a short branch coming here we might avoid having to extend it. A subsequent version separated out long and short branches coming here and fixed up short branches but added long ones onto the label list. I discovered a bug with this which occurred when we put in branch extension code before an unconditional branch and then backed up over the unconditional branch and over one of the extended branches. Since we'd already fixed up (really fixed up) the branch round the branch extensions we ended up with that branch now pointing into the middle of the code we subsequently generated. We could get a similar situation if we have a conditional branch immediately before this instruction and back up over both, for example (if exp then () else (); ...). In that case we have to make sure we haven't already fixed up another branch to come here. Instead we must always add it onto the label list so that we only (really) fix it up when we generate something other than a branch. DCJM 19/1/01. *) val br = ( gen8u (opToInt JMP_8, cvec); (* Don't use genop. *) gen8u (0w0, cvec); makeShortLabel (!ic addrPlus ~1, cvec) ) in exited := true; br :: labs end end (* unconditionalBranch *) (* Generate an effective address. *) fun genEACode (offset: int, rb: Word8.word, r: Word8.word, cvec) : unit = let val offsetCode = (* don't generate [ebp] (use [ebp+0]) 'cos it doesn't exist! *) if offset = 0 andalso rb <> 0w5 then Based0 (* no disp field *) else if is8Bit offset then Based8 (* use 8-bit disp field *) else Based32 (* use 32-bit disp field *) in if rb = 0w4 (* Code for esp and r12 *) then (* Need to use s-i-b byte. *) ( (* Normally we will have a non-zero offset for esp. The exception is computing the maximum stack in the prelude. *) genmodrm (offsetCode, r, 0w4 (* use SIB *), cvec); gensib (NoIndex, SOME esp, cvec) ) else genmodrm(offsetCode, r, rb, cvec); (* generate the disp field (if any) *) case offsetCode of Based8 => gen8s (offset, cvec) | Based32 => gen32s (offset, cvec) | _ => () end (* Generate a opcode plus a modrm byte. *) fun genOpEA(opb:opCode, offset: int, rb: reg, r: reg, cvec): unit = let val (rbC, rbX) = getReg rb val (rrC, rrX) = getReg r in doPending (cvec, maxInstrSize); (* Any lock prefix comes before any REX prefix. *) case opb of LOCK_XADD => gen8u(0wxF0, cvec) | _ => (); (* For the moment always put in a REX prefix. *) if isX64 then gen8u(rex{w=true, r=rrX, b=rbX, x = false}, cvec) else (); (* Generate the escape codes for the opcodes that need them. *) case opb of MOVZX => gen8u(opToInt ESCAPE, cvec) | LOCK_XADD => gen8u(opToInt ESCAPE, cvec) | _ => (); (*if offset < 0 andalso rb = esp then raise InternalError "Negative stack offset" else ();*) gen8u(opToInt opb, cvec); genEACode(offset, rbC, rrC, cvec) end (* Generate a opcode plus a second modrm byte but where the "register" field in the modrm byte is actually a code. *) fun genOpPlus2(opb:opCode, offset: int, rb: reg, op2: Word8.word, cvec): unit = let val (rbC, rbX) = getReg rb val need64bit = case opb of MOVB_8_A => false | Group3_a => false | FPESC _ => false | Group5 => false (* Call/Jmp/Push - size is intrinsic *) | Group1_8_A => isX64 (* Arithmetic operations - must be 64-bit *) | Group2_1_A => isX64 (* 1-bit shifts - must be 64-bit *) | Group2_8_A => isX64 (* n-bit shifts - must be 64-bit *) | _ => isX64 (* Anything else? Assume it requires prefix. *) in doPending (cvec, maxInstrSize); (* For the moment always put in a REX prefix. *) (* If (opb = Group5 andalso op2 = 6 (* push *) orelse opb = POP_A) andalso not rbX then we don't need it. *) if need64bit orelse rbX then gen8u(rex{w=need64bit, r=false, b=rbX, x = false}, cvec) else (); gen8u(opToInt opb, cvec); genEACode(offset, rbC, op2, cvec) end (* Register/register operation. *) fun genOpReg(opb:opCode, rd: reg, rs: reg, cvec) = let val (rbC, rbX) = getReg rs val (rrC, rrX) = getReg rd in doPending (cvec, maxInstrSize); (* For the moment always put in a REX prefix. *) if isX64 then gen8u(rex{w=true, r=rrX, b=rbX, x = false}, cvec) else (); gen8u(opToInt opb, cvec); genmodrm(Register, rrC, rbC, cvec) end fun genOpRegPlus2(opb:opCode, rd: reg, op2: Word8.word, cvec) = let val (rrC, rrX) = getReg rd in doPending (cvec, maxInstrSize); (* For the moment always put in a REX prefix. *) if isX64 then gen8u(rex{w=true, r=false, b=rrX, x = false}, cvec) else (); gen8u(opToInt opb, cvec); genmodrm(Register, op2, rrC, cvec) end (* Similar to genEA, but used when there is an index register. rb may be NONE if no base register is required (used with leal to tag values). *) fun genOpIndexed (opb:opCode, offset: int, rb: reg option, ri: indexType, rd: reg, cvec) = let val (rbC, rbX) = case rb of NONE => (0w0, false) | SOME rb => getReg rb val (_, riX) = case ri of NoIndex => (0w0, false) (* No index reg. *) | Index1 i => getReg i | Index2 i => getReg i | Index4 i => getReg i | Index8 i => getReg i val (rrC, rrX) = getReg rd val (offsetCode, basefield) = case rb of NONE => (Based0, NONE (* no base register *)) | SOME rb => let val base = if offset = 0 andalso rbC <> 0wx5 then Based0 (* no disp field *) else if is8Bit offset then Based8 (* use 8-bit disp field *) else Based32; (* use 32-bit disp field *) in (base, SOME rb) end in doPending (cvec, maxInstrSize); (* For the moment always put in a REX prefix. *) if isX64 then gen8u(rex{w=true, r=rrX, b=rbX, x=riX}, cvec) else (); (* Generate the ESCAPE code if needed. *) case opb of MOVZX => gen8u(opToInt ESCAPE, cvec) | _ => (); gen8u(opToInt opb, cvec); genmodrm (offsetCode, rrC, 0w4 (* s-i-b *), cvec); gensib (ri, basefield, cvec); (* generate the disp field (if any) *) case offsetCode of Based8 => gen8s (offset, cvec) | Based32 => gen32s (offset, cvec) | _ => case rb of NONE => (* 32 bit absolute used as base *) gen32s (offset, cvec) | _ => () end fun genPushPop(opc, r, cvec) = let val (rc, rx) = getReg r in (* These are always 64-bit but a REX prefix may be needed for the register. *) genop(opc rc, if rx then SOME{w=false, b = true, x=false, r = false } else NONE, cvec) end (* Tag the value in register r *) fun genTag (r, cvec) = genOpIndexed(LEAL, 1, SOME r, Index1 r, r, cvec) fun genImmed (opn: arithOp, rd: reg, imm: int, cvec) : unit = if is8Bit imm then (* Can use one byte immediate *) ( genOpRegPlus2(Group1_8_A, rd, arithOpToWord opn, cvec); gen8s (imm, cvec) ) else if not isX64 orelse (~exp2_31 <= imm andalso imm < exp2_31) then (* Need 32 bit immediate. *) ( genOpRegPlus2(Group1_32_A, rd, arithOpToWord opn, cvec); gen32s(imm, cvec) ) else (* It won't fit in the immediate; put it in the non-address area. *) let (* For the moment use the same format as real numbers and put this into a piece of memory which is then byte-copied into the constant area. *) open Address val mem = alloc(0w1, F_bytes orb8 F_mutable, toMachineWord 0w0) fun setMem(m, n) = if n = Word.fromInt wordSize then () else ( assignByte(mem, n, Word8.fromInt(m mod exp2_8)); setMem(m div exp2_8, n+0w1) ) val () = setMem(imm, 0w0) val () = lock mem val (rc, rx) = getReg rd in genop(Arith (opn, 0w3 (* r/m to reg *)), SOME{w=true, r=rx, b=false, x = false}, cvec); genmodrm (Based0, rc, 0w5 (* PC-relative *), cvec); addConstToVec(WVal(toMachineWord mem), NonAddrArea, cvec) end fun genReg (opn: arithOp, rd: reg, rs: reg, cvec) = genOpReg (Arith (opn, 0w3 (* r/m to reg *)), rd, rs, cvec) (* generate padding no-ops to align to n modulo 4 *) (* The Intel 64 instruction manual recommends: 1 byte: NOP 2 bytes: 66 NOP 3 bytes: 0F 1F 00 - Multibyte NOP probably not generally supported. *) (* generate padding no-ops to align to n modulo 4 *) fun align (n, cvec as Code{ic, ...}) = while (n - (!ic)) mod 0w4 <> 0w0 do genop (NOP, NONE, cvec); (* movl offset(rb),rd. *) fun genLoad (offset: int, rb: reg, rd: reg, cvec) = genOpEA(MOVL_A_R, offset, rb, rd, cvec) (* Called when we have a memory operand and a constant that is an address. This is either a move or a comparison. *) fun genMemoryConstant (cnstnt, opcode, arithOp, offset, rb, ri, cvec as Code{ic, ...}) = let val haveIndex = case ri of NoIndex => false | _ => true in (* We have a little problem here: we have to be very careful that we don't end up with a full word of zeros on a word boundary because that is used as an end-of-code marker. This can arise if we have zero bytes in the high order part of the offset and zero bytes in the low order part of the immediate value. We can get the former if the offset is greater than 127 and we can get the latter if the immediate is an address but not if it is a tagged value. Furthermore the garbage collector may change the address in the future so even if it is safe now it may not always be. We add in no-ops to align the offset onto a word boundary ensuring that the offset and the immediate value never come together in the same word. There's also another case. If the mod-rm byte is zero and aligned on a word boundary then this could combine with the immediate value if all three low-order words were zero. It's very unlikely but we need to consider it. *) if isX64 then raise InternalError "genMemoryConstant" (* We don't have 64-bit immediates. *) else if not (is8Bit offset) then ( doPending(cvec, maxInstrSize + 2); (* We have a sib byte if we either have an index or the base register is esp. *) align(if haveIndex orelse rb = esp then 0w1 else 0w2, cvec) ) else if offset = 0 andalso rb = eax andalso not haveIndex then (* modrm will be zero. We need to be sure that this is not the first byte in a word. *) ( doPending(cvec, maxInstrSize + 1); if (!ic) mod 0w4 = 0w3 (* opcode will be the last byte in this word. *) then align(0w1, cvec) else () ) else (); case ri of NoIndex => genOpPlus2 (opcode, offset, rb, arithOp, cvec) | ri => genOpIndexed (opcode, offset, SOME rb, ri, mkReg(arithOp, false), cvec); addConstToVec (WVal cnstnt, InlineAbsolute, cvec) end (* Register/register move. *) fun genMove (rd, rs, cvec) = genOpReg (MOVL_R_A, rs,rd, cvec) (* Add a register to a constant. *) fun genLeal (rd, rs, offset, cvec) = genOpEA (LEAL, offset, rs, rd, cvec) type handlerLab = addrs ref; (* Loads the address of the destination of a branch. Used to put in the address of the exception handler. We used to have pushAddress in place of this which pushed the address at the same time. On this architecture it can save an instruction but it's a problem on machines where we have to load the address into a register - we don't have a spare checked register available. *) fun loadHandlerAddress (rd, lab, cvec) = let val (rc, rx) = getReg rd in genop(MOVL_32_64_R rc, if isX64 then SOME {w=true, r=false, b=rx, x=false} else NONE, cvec); addConstToVec (HVal lab, InlineAbsolute, cvec) end fun fixupHandler (lab:handlerLab, cvec as Code{exited, ic, branchCheck, ...}) : unit = ( (* Make sure anything pending is done first. *) (* 15 comes from maximum instruction size + up to 3 nops. *) doPending (cvec, maxInstrSize+3); (* Ensure the return address is aligned onto a word + 2 byte boundary. *) align (0w2, cvec); exited := false; branchCheck := !ic; lab := !ic ); datatype callKinds = Recursive (* The function calls itself. *) | ConstantClosure of machineWord (* A pre-compiled or io function. *) | ConstantCode of machineWord (* A function that doesn't need a closure *) | CodeFun of code (* Forward reference to code *) | FullCall (* Full closure call *) (***************************************************************************** Calling conventions: FullCall: the caller loads the function's closure into regClosure and then (the code here) does an indirect jump through it. Recursive: the caller loads its own function's closure/static-link into regClosure and the code here does a jump to the start of the code. ConstantFun: a direct or indirect call through the given address. If possible the caller will have done the indirection for us and passed false as the indirection value. The exception is calls to IO functions where the address of the code itself is invalid. If the closure/static-link value is needed that will already have been loaded. CodeFun: the same as ConstantFun except that this is used only for static-link calls so is never indirect. *****************************************************************************) (* Call a function. *) fun callFunction (callKind, cvec as Code {ic, ... }) : unit = ( case callKind of Recursive => ( (* Call back to the start of the current function. *) doPending (cvec, maxInstrSize + 3); align (0w1, cvec); genop (CALL_32, NONE, cvec); (* 1 byte *) gen32s (~(Word.toInt(!ic) + 4), cvec) (* 4 bytes *) ) | FullCall => (* Indirect call through closure reg. *) ( (* Make sure anything pending is done first. *) doPending (cvec, maxInstrSize+3); (* Ensure the return address is aligned on a word + 2 byte boundary. *) align (0w0, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w2 (* call *), #1 (getReg regClosure), cvec) ) | CodeFun c => ( (* Make sure anything pending is done first. *) doPending (cvec, maxInstrSize+3); if isX64 then ( align (0w0, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w2 (* call *), 0w5 (* PC rel *), cvec); codeConst (c, ConstArea 0, cvec) ) else ( (* Ensure the return address is aligned on a word + 2 byte boundary. *) align (0w1, cvec); genop (CALL_32, NONE, cvec); codeConst (c, InlineRelative, cvec) ) ) | ConstantCode w => ( (* Make sure anything pending is done first. *) doPending (cvec, maxInstrSize+3); if isX64 then ( align (0w0, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w2 (* call *), 0w5 (* PC rel *), cvec); addConstToVec (WVal w, ConstArea 0, cvec) ) else ( (* Ensure the return address is aligned on a word + 2 byte boundary. *) align (0w1, cvec); genop (CALL_32, NONE, cvec); addConstToVec (WVal w, InlineRelative, cvec) ) ) | ConstantClosure w => if isX64 then let val (rc, rx) = getReg regClosure in genop (MOVL_32_64_R rc, SOME {w=true, r=false, b=rx, x=false}, cvec); addConstToVec (WVal w, InlineAbsolute, cvec); doPending (cvec, maxInstrSize+3); (* Ensure the return address is aligned on a word + 2 byte boundary. *) align (0w0, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w2 (* call *), rc, cvec) end else ( (* Make sure anything pending is done first. *) doPending (cvec, maxInstrSize+3); (* Ensure the return address is aligned on a word + 2 byte boundary. *) align (0w0, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w2 (* call *), 0w5 (* Immediate address. *), cvec); addConstToVec (WVal w, InlineAbsolute, cvec) ); if (!ic) mod 0w4 <> 0w2 then raise InternalError "callFunction: call not aligned" else () ); (* Tail recursive jump to a function. N.B. stack checking is used both to ensure that the stack does not overflow and also as a way for the RTS to interrupt the code at a safe place. The RTS can set the stack limit "register" at any time but the code will only take a trap when it next checks the stack. The only way to break out of infinite loops is for the user to type control-C and some time later for the code to do a stack check. We need to make sure that we check the stack in any function that my be recursive, directly or indirectly. *) fun jumpToFunction (callKind, cvec as Code{exited, ic, ...}) = ( case callKind of Recursive => ( (* Jump to the start of the current function. *) genop (JMP_32, NONE, cvec); gen32s (~(Word.toInt(!ic) + 4), cvec) ) | FullCall => ( (* Full closure call *) genop (Group5, NONE, cvec); genmodrm(Based0, 0w4 (* jmp *), #1 (getReg regClosure), cvec) ) | CodeFun c => if isX64 then ( genop (Group5, NONE, cvec); genmodrm(Based0, 0w4 (* jmp *), 0w5 (* PC rel *), cvec); codeConst (c, ConstArea 0, cvec) ) else ( genop (JMP_32, NONE, cvec); codeConst (c, InlineRelative, cvec) ) | ConstantCode w => if isX64 then ( genop (Group5, NONE, cvec); genmodrm(Based0, 0w4 (* jmp *), 0w5 (* PC rel *), cvec); addConstToVec (WVal w, ConstArea 0, cvec) ) else ( genop (JMP_32, NONE, cvec); addConstToVec (WVal w, InlineRelative, cvec) ) | ConstantClosure w => (* Indirect jumps are used to call into the RTS. *) if isX64 then let val (rc, rx) = getReg regClosure in genop (MOVL_32_64_R rc, SOME {w=true, r=false, b=rx, x=false}, cvec); addConstToVec (WVal w, InlineAbsolute, cvec); genop (Group5, NONE, cvec); genmodrm(Based0, 0w4 (* jmp *), rc, cvec) end else ( genop (Group5, NONE, cvec); genmodrm(Based0, 0w4 (* jmp *), 0w5 (* Immediate address. *), cvec); addConstToVec (WVal w, InlineAbsolute, cvec) ); exited := true (* We're not coming back. *) ); (* Return and remove args. *) fun returnFromFunction (args, cvec as Code{exited, ...}) : unit = ( if args = 0 then genop (RET, NONE, cvec) else let val offset = Word.fromInt(args * wordSize) in genop (RET_16, NONE, cvec); gen8u (wordToWord8 offset, cvec); gen8u (wordToWord8(offset >> 0w8), cvec) end; exited := true (* We're not coming back. *) ) (* Backwards jump for loops. *) (* Put in a stack check in a loop. This is used to allow the code to be interrupted. *) fun stackCheck cvec = let (* cmp reg,16(%ebp)*) val () = genOpEA(Arith (CMP, 0w3), memRegStackLimit, ebp, esp, cvec) (* jnb 3 *) val lab = [putConditional (JNB, cvec)] in (* call *) genop(Group5, NONE, cvec); genmodrm (Based8, 0w2 (* call *), #1 (getReg ebp), cvec); gen8u (Word8.fromInt memRegStackOverflowCall, cvec); fixup (lab, cvec) end fun genFloatingPt({escape, md, nnn, rm}, code) = ( genop(FPESC escape, NONE, code); gen8u((md <<- 0w6) orb8 (nnn <<- 0w3) orb8 rm, code) ) (* Load a floating point register to the stack. Because the positions are dependent on the number of items already pushed we may need to add an offset. *) fun loadFpRegToStack(fpReg, offset, code) = let val fp = case fpReg of FPReg fp => fp | _ => raise InternalError "fpreg" in genFloatingPt({escape=0w1, md=0w3, nnn=0w0, rm= fp + offset}, code) (* FLD ST(r1) *) end (* Pops the top of the stack into a register. This assumes that there is exactly one item on the stack which is why we add one here. *) fun storeFpRegFromStack(fpReg, code) = let val dest = case fpReg of FPReg fp => fp | _ => raise InternalError "fpreg" in genFloatingPt({escape=0w5, md=0w3, nnn=0w3, rm = dest+0w1(* One item *)}, code) (* FSTP ST(n+1) *) end (* Allocate store and put the resulting pointer in the result register. *) local fun allocStoreCommonCode (resultReg, cvec as Code{ic=_, ...}, isVarAlloc) = ( (* Common code. resultReg contains the possible new address. *) genOpEA(Arith (CMP, 0w3 (* r/m to reg *)), memRegLocalMbottom, ebp, resultReg, cvec); let (* Normally we won't have run out of store so we want the default branch prediction to skip the test here. However doing that involves adding an extra branch which lengthens the code so it's probably not worth while. *) (*val lab = let val () = genop(CondJump JB, cvec); val () = gen8u (0w0, cvec); val lab2 = [makeShortLabel (!ic addrPlus ~1, cvec)] val () = genop(JMP_8, cvec); val () = gen8u (0w0, cvec); val lab = [makeShortLabel (!ic addrPlus ~1, cvec)] in fixup(lab2, cvec); lab end*) (* Just checking against the lower limit in this way can fail in the situation where the heap pointer is at the low end of the address range and the store required is so large that the subtraction results in a negative number. In that case it will be > (unsigned) lower_limit so in addition we have to check that the result is < (unsigned) heap_pointer. This actually happened on Windows with X86-64. In theory this can happen with fixed-size allocations as well as variable allocations but in practice fixed-size allocations are going to be small enough that it's not a problem. *) val lab = if isVarAlloc then let val lab1 = [putConditional(JB, cvec)] val () = if isX64 then genReg (CMP, resultReg, r15, cvec) else genOpEA(Arith (CMP, 0w3), memRegLocalMPointer, ebp, resultReg, cvec) val lab2 = [putConditional(JB, cvec)] in fixup(lab1, cvec); lab2 end else [putConditional(JNB, cvec)] in (* If we don't have enough store for this allocation we call this function. *) genop (Group5, NONE, cvec); genmodrm(Based8, 0w2 (* call *), #1 (getReg ebp), cvec); gen8s (memRegHeapOverflowCall, cvec); fixup (lab, cvec) end; (* Update the heap pointer now we have the store. This is also used by the RTS in the event of a trap to work out how much store was being allocated. *) if isX64 then genMove(r15, resultReg, cvec) else genOpEA (MOVL_R_A, memRegLocalMPointer, ebp, resultReg, cvec) ) in fun allocStoreCode (size, resultReg, cvec as Code { inAllocation as ref false, ...}) = let val _ = inAllocation := true val bytes = (size + 1) * wordSize in if isX64 then genLeal (resultReg, r15, ~ bytes, cvec) (* TODO: What if it's too big to fit? *) else ( (* movl 0(%ebp),r; subl (size+1)*4,r; cmpl r,8(%ebp); jnb 1f; call 40[%ebp]; 1f: movl r,0(%ebp); movl size,-4(r); *) genLoad (memRegLocalMPointer, ebp, resultReg, cvec); genLeal (resultReg, resultReg, ~ bytes, cvec) ); allocStoreCommonCode(resultReg, cvec, false) end | allocStoreCode _ = raise InternalError "Allocation started but not complete" and allocStoreVarCode(resultReg, code as Code { inAllocation as ref false, ...}) = (* The result reg contains the requested size as a number of bytes on entry and returns with the base address. *) ( inAllocation := true; (* Turn this into a negative value. *) genOpRegPlus2(Group3_A, resultReg, 0w3 (* neg *), code); (* Add this negative value to the current heap pointer. *) if isX64 then genReg(ADD, resultReg, r15, code) else genOpEA(Arith (ADD, 0w3 (* r/m to reg *)), memRegLocalMPointer, ebp, resultReg, code); allocStoreCommonCode(resultReg, code, true) ) | allocStoreVarCode _ = raise InternalError "Allocation started but not complete" end fun allocStoreAndSetSize (size, flag, resultReg, cvec) = ( allocStoreCode (size, resultReg, cvec); if isX64 then ( genOpPlus2(MOVL_32_A, ~wordSize, resultReg, 0w0, cvec); (* TODO: What if the length won't fit in 32 bits? *) gen32s (size, cvec); (* Set the flag byte separately. *) if flag <> 0w0 then ( genOpPlus2(MOVB_8_A, ~1, resultReg, 0w0, cvec); gen8s (Word8.toInt flag, cvec) ) else () ) else ( genOpPlus2 (MOVL_32_A, ~wordSize, resultReg, 0w0, cvec); gen32u (LargeWord.fromInt size orbL (Word8.toLargeWord flag <<+ 0w24), cvec) ) ) (* Operations. *) type cases = word * label datatype memoryAddress = BaseOffset of { base: reg, offset: int, index: indexType } | ConstantAddress of machineWord datatype branchPrediction = PredictNeutral | PredictTaken | PredictNotTaken datatype operation = MoveRR of { source: reg, output: reg } | MoveConstR of { source: int, output: reg } | MoveLongConstR of { source: machineWord, output: reg } | LoadMemR of { source: memoryAddress, output: reg } | LoadByteR of { source: memoryAddress, output: reg } | PushR of reg | PushConst of int | PushLongConst of machineWord | PushMem of { base: reg, offset: int } | PopR of reg | ArithRR of { opc: arithOp, output: reg, source: reg } | ArithRConst of { opc: arithOp, output: reg, source: int } | ArithRLongConst of { opc: arithOp, output: reg, source: machineWord } | ArithRMem of { opc: arithOp, output: reg, offset: int, base: reg } | ArithMemConst of { opc: arithOp, offset: int, base: reg, source: int } | ArithMemLongConst of { opc: arithOp, offset: int, base: reg, source: machineWord } | ShiftConstant of { shiftType: shiftType, output: reg, shift: Word8.word } | ShiftVariable of { shiftType: shiftType, output: reg } (* Shift amount is in ecx *) | ConditionalBranch of { test: branchOps, label: label, predict: branchPrediction } | LockMutableSegment of reg | LoadAddress of { output: reg, offset: int, base: reg option, index: indexType } | LoadCodeRef of { output: reg, code: code } | TestTagR of reg | TestByteMem of { base: reg, offset: int, bits: word } | CallRTS of int | StoreRegToMemory of { toStore: reg, address: memoryAddress } | StoreConstToMemory of { toStore: int, address: memoryAddress } | StoreLongConstToMemory of { toStore: machineWord, address: memoryAddress } | StoreByteRegToMemory of { toStore: reg, address: memoryAddress } | StoreByteConstToMemory of { toStore: Word8.word, address: memoryAddress } | AllocStore of { size: int, output: reg } | AllocStoreVariable of reg | StoreInitialised | CallFunction of callKinds | JumpToFunction of callKinds | ReturnFromFunction of int | RaiseException | UncondBranch of label | ResetStack of int | InterruptCheck | JumpLabel of label | TagValue of { source: reg, output: reg } (* Some of these operations are higher-level and should be reduced. *) | LoadHandlerAddress of { handlerLab: addrs ref, output: reg } | StartHandler of { handlerLab: addrs ref } | IndexedCase of { testReg: reg, workReg: reg, min: word, cases: label list } | FreeRegisters of regSet | MakeSafe of reg | RepeatOperation of repOps | Group3Ops of reg * group3Ops | AtomicXAdd of {base: reg, output: reg} | FPLoadFromGenReg of reg | FPLoadFromFPReg of { source: reg, lastRef: bool } | FPLoadFromConst of real | FPStoreToFPReg of { output: reg, andPop: bool } | FPStoreToMemory of { base: reg, offset: int, andPop: bool } | FPArithR of { opc: fpOps, source: reg } | FPArithConst of { opc: fpOps, source: machineWord } | FPArithMemory of { opc: fpOps, base: reg, offset: int } | FPUnary of fpUnaryOps | FPStatusToEAX | FPLoadIntAndPop | FPFree of reg | PreAddDetag of reg type operations = operation list fun printOperation(operation, stream) = let fun printReg r = stream(regRepr r) fun printBaseOffset(b, x, i) = ( stream(Int.toString i); stream "("; printReg b; stream ")"; case x of NoIndex => () | Index1 x => (stream "["; printReg x; stream "]") | Index2 x => (stream "["; printReg x; stream "*2]") | Index4 x => (stream "["; printReg x; stream "*4]") | Index8 x => (stream "["; printReg x; stream "*8]") ) fun printMemAddress(BaseOffset{ base, offset, index }) = printBaseOffset(base, index, offset) | printMemAddress(ConstantAddress addr) = stream(stringOfWord addr) fun printCallKind Recursive = stream "Recursive" | printCallKind (ConstantClosure w) = (stream "closure="; stream(stringOfWord w)) | printCallKind (ConstantCode w) = (stream "code="; stream(stringOfWord w)) | printCallKind (CodeFun(Code{procName, ...})) = stream("CODE-" ^ procName) | printCallKind FullCall = stream "via ClosureReg" in case operation of MoveRR { source, output } => (stream "MoveRR "; printReg output; stream " <= "; printReg source) | MoveConstR { source, output } => (stream "MoveCR "; printReg output; stream " <="; stream(Int.toString source)) | MoveLongConstR { output, source } => (stream "MoveCR "; printReg output; stream " <= "; stream(Address.stringOfWord source)) | LoadMemR { source, output } => (stream "MoveMR "; printReg output; stream " <= "; printMemAddress source ) | LoadByteR { source, output } => (stream "MoveByteR "; printReg output; stream " <= "; printMemAddress source ) | ArithRR { opc, output, source } => (stream (arithOpRepr opc ^ "RR "); printReg output; stream " <= "; printReg source ) | ArithRConst { opc, output, source } => (stream (arithOpRepr opc ^ "RC "); printReg output; stream " <= "; stream(Int.toString source) ) | ArithRLongConst { opc, output, source } => (stream (arithOpRepr opc ^ "RC "); printReg output; stream " <= "; stream(Address.stringOfWord source) ) | ArithRMem { opc, output, offset, base } => (stream (arithOpRepr opc ^ "RM "); printReg output; stream " <= "; printBaseOffset(base, NoIndex, offset) ) | ArithMemConst { opc, offset, base, source } => ( stream (arithOpRepr opc ^ "MC "); printBaseOffset(base, NoIndex, offset); stream " "; stream(Int.toString source) ) | ArithMemLongConst { opc, offset, base, source } => ( stream (arithOpRepr opc ^ "MC "); printBaseOffset(base, NoIndex, offset); stream " <= "; stream(Address.stringOfWord source) ) | ShiftConstant { shiftType, output, shift } => ( stream(shiftTypeRepr shiftType); stream " "; printReg output; stream " by "; stream(Word8.toString shift) ) | ShiftVariable { shiftType, output } => (* Shift amount is in ecx *) ( stream(shiftTypeRepr shiftType); stream " "; printReg output; stream " by ECX" ) | ConditionalBranch { test, label=Labels{labId=ref lab, ...}, predict } => ( stream(branchOpRepr test); stream " L"; stream(Int.toString lab); case predict of PredictNeutral => () | PredictTaken => stream " PredictTaken" | PredictNotTaken => stream " PredictNotTaken" ) | LockMutableSegment reg => (stream "LockMutableSegment "; printReg reg) | PushR source => (stream "PushR "; printReg source) | PushConst source => (stream "PushC "; stream(Int.toString source)) | PushLongConst source => (stream "PushC "; stream(Address.stringOfWord source)) | PushMem{base, offset} => (stream "PushM "; printBaseOffset(base, NoIndex, offset)) | PopR dest => (stream "PopR "; printReg dest) | StoreRegToMemory { toStore, address } => ( stream "StoreRegToMemory "; printMemAddress address; stream " <= "; stream(regRepr toStore) ) | StoreConstToMemory { toStore, address } => ( stream "StoreConstToMemory "; printMemAddress address; stream " <= "; stream(Int.toString toStore) ) | StoreLongConstToMemory { address, toStore } => ( stream "StoreLongConstToMemory "; printMemAddress address; stream " <= "; stream(Address.stringOfWord toStore) ) | StoreByteRegToMemory { toStore, address } => ( stream "StoreByteRegToMemory "; printMemAddress address; stream " <= "; stream(regRepr toStore) ) | StoreByteConstToMemory { toStore, address } => ( stream "StoreByteConstToMemory "; printMemAddress address; stream " <= 0x"; stream(Word8.toString toStore) ) | LoadAddress{ output, offset, base, index } => ( stream "LoadAddress "; case base of NONE => () | SOME r => (printReg r; stream " + "); stream(Int.toString offset); case index of NoIndex => () | Index1 x => (stream " + "; printReg x) | Index2 x => (stream " + "; printReg x; stream "*2 ") | Index4 x => (stream " + "; printReg x; stream "*4 ") | Index8 x => (stream " + "; printReg x; stream "*8 "); stream " => "; printReg output ) | LoadCodeRef { output, code=Code{procName, ...} } => ( stream "LoadCodeRef "; stream procName; stream " => "; printReg output ) | TestTagR reg => ( stream "TestTagR "; printReg reg ) | TestByteMem { base, offset, bits } => ( stream "TestByteMem "; printBaseOffset(base, NoIndex, offset); stream " 0x"; stream(Word.toString bits) ) | CallRTS entry => ( stream "CallRTS "; if entry = memRegStackOverflowCall then stream "StackOverflowCall" else if entry = memRegHeapOverflowCall then stream "HeapOverflow" else if entry = memRegStackOverflowCallEx then stream "StackOverflowCallEx" else if entry = memRegRaiseException then stream "RaiseException" else if entry = memRegRaiseDiv then stream "RaiseDiv" else if entry = memRegArbEmulation then stream "ArbEmulation" else stream(Int.toString entry) ) | AllocStore { size, output } => (stream "AllocStore "; stream(Int.toString size); stream " => "; printReg output ) | AllocStoreVariable reg => (stream "AllocStoreVariable "; printReg reg ) | StoreInitialised => stream "StoreInitialised" | TagValue { source, output } => (stream "TagValue "; printReg output; stream " <= "; printReg source) | CallFunction callKind => (stream "CallFunction "; printCallKind callKind) | JumpToFunction callKind => (stream "JumpToFunction "; printCallKind callKind) | ReturnFromFunction argsToRemove => (stream "ReturnFromFunction "; stream(Int.toString argsToRemove)) | RaiseException => stream "RaiseException" | UncondBranch(Labels{labId=ref lab, ...})=> (stream "UncondBranch L"; stream(Int.toString lab)) | ResetStack i => (stream "ResetStack "; stream(Int.toString i)) | InterruptCheck => stream "InterruptCheck" | JumpLabel(Labels{labId=ref lab, ...}) => (stream "L"; stream(Int.toString lab); stream ":") | LoadHandlerAddress { handlerLab=_, output=_ } => stream "LoadHandlerAddress" | StartHandler { handlerLab=_ } => stream "StartHandler" | IndexedCase { testReg, workReg, min, cases } => ( stream "IndexedCase "; printReg testReg; stream " with "; printReg workReg; stream "\n"; List.foldl(fn(Labels{labId=ref lab, ...}, v) => (stream(Word.toString v); stream " => L"; stream(Int.toString lab); stream "\n"; v+0w1)) min cases; () ) | FreeRegisters regs => (stream "FreeRegister "; stream(regSetRepr regs)) | MakeSafe reg => ( stream "MakeSafe "; printReg reg) | RepeatOperation repOp => (stream "Repeat "; stream(repOpsRepr repOp)) | Group3Ops(reg, ops) => ( stream(group3OpsRepr ops); stream " "; printReg reg) | AtomicXAdd{base, output} => (stream "LockedXAdd ("; printReg base; stream ") <=> "; printReg output) | FPLoadFromGenReg reg => (stream "FPLoad "; printReg reg) | FPLoadFromFPReg {source, lastRef} => (stream "FPLoad "; printReg source; if lastRef then stream " (LAST)" else()) | FPLoadFromConst const => (stream "FPLoad "; stream(Real.toString const) ) | FPStoreToFPReg{ output, andPop } => (if andPop then stream "FPStoreAndPop => " else stream "FPStore => "; printReg output) | FPStoreToMemory{ base: reg, offset: int, andPop: bool } => ( if andPop then stream "FPStoreAndPop => " else stream "FPStore => "; printBaseOffset(base, NoIndex, offset) ) | FPArithR{ opc, source } => (stream(fpOpRepr opc); stream " "; printReg source) | FPArithConst{ opc, source } => (stream(fpOpRepr opc); stream(Address.stringOfWord source)) | FPArithMemory{ opc, base, offset } => (stream(fpOpRepr opc); stream " "; printBaseOffset(base, NoIndex, offset)) | FPUnary opc => stream(fpUnaryRepr opc) | FPStatusToEAX => (stream "FPStatus "; printReg eax) | FPLoadIntAndPop => (stream "FPLoadIntAndPop (%ESP)") | FPFree reg => (stream "FPFree "; printReg reg) | PreAddDetag reg => (stream "Detag "; printReg reg) ; stream "\n" end datatype implement = ImplementGeneral | ImplementLiteral of machineWord (* Test the bottom bit and jump depending on its value. This is used for tag tests in arbitrary precision operations and also for testing for short/long values. *) fun testTag(r, cvec) = let val (regNum, rx) = getReg r in if r = eax then (* Special instruction for testing accumulator. Can use an 8-bit test. *) ( genop (TEST_ACC8, NONE, cvec); gen8u (0w1, cvec) ) else if isX64 then ( (* We can use a REX code to force it to always use the low order byte. *) genop (Group3_a, if rx orelse regNum >= 0w4 then SOME{w=false, r=false, b=rx, x=false} else NONE, cvec); genmodrm (Register, 0w0 (* test *), regNum, cvec); gen8u(0w1, cvec) ) else if r = ebx orelse r = ecx orelse r = edx (* can we use an 8-bit test? *) then (* Yes. The register value refers to low-order byte. *) ( genop (Group3_a, NONE, cvec); genmodrm (Register, 0w0 (* test *), regNum, cvec); gen8u (0w1, cvec) ) else ( genop (Group3_A, NONE, cvec); genmodrm (Register, 0w0 (* test *), regNum, cvec); gen32u (0w1, cvec) ) end (* Previously the jump table was a vector of destination addresses. Now changed to use a vector of jump instructions. These are padded out to 8 bytes with no-ops. The reason for the change is to ensure that the code segment only contains instructions so that we can scan for addresses within the code. It also simplifies and speeds up the indexed jump at the expense of doubling the size of the table itself. *) fun indexedCase (r1:reg, r2:reg, min:word, cases, cvec as Code{exited, ic, ...}) = let val startJumpTable = ref addrZero val nCases = List.length cases val (rc2, rx2) = getReg r2 in (* Load the address of the jump table. *) genop (MOVL_32_64_R rc2, if isX64 then SOME {w=true, r=false, b=rx2, x=false} else NONE, cvec); addConstToVec (HVal startJumpTable, InlineAbsolute, cvec); (* Compute the jump address. The index is a tagged integer so it is already multiplied by 2. We need to multiply by four to get the correct size. We subtract off the minimum value and also the shifted tag. *) let val adjustment = Word.toIntX min * ~8 - 4 in (* In 64-bit mode this may not fit in a 32-bit value. It will always fit in 32-bit mode so we avoid an unnecessary long integer test. *) (* We don't need to consider any possible overflow in the execution because we've already checked that the value is within the range. *) if isX64 andalso (adjustment < ~exp2_31 orelse adjustment >= exp2_31) then ( genImmed(ADD, r2, adjustment, cvec); genOpIndexed(LEAL, 0, SOME r2, Index4 r1, r2, cvec) ) else genOpIndexed(LEAL, adjustment, SOME r2, Index4 r1, r2, cvec) end; (* Jump into the jump table. Since each entry in the table is 8 bytes long r2 will still be on a word + 2 byte boundary. *) genop (Group5, if rx2 then SOME{w=false, r=false, b=rx2, x=false} else NONE, cvec); genmodrm(Register, 0w4 (* jmp *), #1 (getReg r2), cvec); exited := true; (* There's a very good chance that we will now extend the branches for the "out of range" checks. The code to do that doesn't know that all these branches will come to the same point so will generate three separate long branches. We could combine them but it's hardly worth it. *) doPending (cvec, nCases * 8 (* size of table. *) + 3 (* Maximum alignment *)); (* The start address must be on a two byte boundary so that the address we've loaded is a valid code address. *) while (!ic) mod 0w4 <> 0w2 do genop (NOP, NONE, cvec); let fun addJump(Labels{forward, reverse=ref reverse, ...}) = ( reverse = addrUnsetLabel orelse raise InternalError "addJump"; gen8u (opToInt JMP_32, cvec); gen32u (0w0, cvec); forward := [ref(Jump32From (!ic addrPlus ~4))] @ ! forward; (* Add no-ops to make it 8 bytes. *) gen8u (opToInt NOP, cvec); gen8u (opToInt NOP, cvec); gen8u (opToInt NOP, cvec) ) in startJumpTable := !ic; List.app addJump cases end end; fun printLowLevelCode(ops, Code{printAssemblyCode, printStream, procName, ...}) = if printAssemblyCode then let (* Set the label fields so it will be clearer. *) fun setLabels(JumpLabel(Labels{labId, ...}), labNo) = (labId := labNo; labNo+1) | setLabels(_, labNo) = labNo val _ = List.foldl setLabels 1 ops in if procName = "" (* No name *) then printStream "?" else printStream procName; printStream ":\n"; List.app(fn i => printOperation(i, printStream)) ops; printStream "\n" end else () (* Code generate a list of operations. The list is in reverse order i.e. last instruction first. *) fun codeGenerate (ops, code as Code{ic, ...}) = let val () = printLowLevelCode(ops, code) (* Source and destination checking. No longer used. The optimiser removes RegisterStatusChange "instructions". *) fun checkSources _ = () fun addDests _ = () fun checkIndexSource _ = () fun cgOp [] = () (* | cgOp(DataOp{ instr=InstrMulA, operands=[InRegister r1, InRegister r2], output=SOME rd } :: remainder) = (* Arbitrary precision multiplication. *) let val _ = checkSources[r1, r2]; val _ = addDests[rd]; val addr = tagTest2 (rd, r1, r2, code) (* generates code *) in (* This is a bit complicated because the result is always placed in the EDX:EAX register pair so we have to save one or both. *) (* If the multiply overflows we need to be able to recover the original arguments in order to emulate the instruction. *) if rd <> eax then genPush(eax, code) else (); if rd <> edx then genPush(edx, code) else (); if r2 = edx then ( (* Untag, but don't shift the multiplicand. *) genLeal (eax, r1, ~1, code); (* Shift down the multiplier to remove the tag. *) genop (Group2_1_A, code); genmodrm(Register, 0w7 (* sar *), getReg edx, code) ) else (* r2 <> edx *) ( (* Shift down the multiplier. *) if r1 <> edx then genMove(edx, r1, code) else (); genop (Group2_1_A, code); genmodrm(Register, 0w7 (* sar *), getReg edx, code); (* Untag, but don't shift the multiplicand. *) genLeal (eax, r2, ~1, code) ); (* Do the multiplication. *) genop (Group3_A, code); genmodrm(Register, 0w5 (* imull *), getReg edx, code); (* Add back the tag, but don't shift. *) genLeal (rd, eax, 1, code); (* Restore the saved registers. N.B. This also has the effect of making sure that both eax and edx contain valid values. *) if rd <> edx then genop(POP_R edx, code) else (); if rd <> eax then genop(POP_R eax, code) else (); genJO8 (addr, code) (* Check for overflow. *); cgOp remainder end *) | cgOp(LockMutableSegment baseReg :: remainder) = (* Remove the mutable bit from the flag byte. *)(*andb CONST(0xff-0x40),-1[Reax]*) ( checkSources[baseReg]; genOpPlus2 (Group1_8_a, ~1, baseReg, arithOpToWord AND, code); gen8u(0wxff - 0wx40, code); cgOp remainder ) | cgOp(MoveRR{ source=source, output } :: remainder) = (* Move from one general register to another. *) ( checkSources[source]; addDests[output]; genMove(output, source, code); cgOp remainder ) | cgOp(MoveConstR{ source, output as GenReg _ } :: remainder) = ( addDests[output]; (* The RTS scans for possible addresses in MOV instructions so we can only use MOV if this is a tagged value. If it isn't we have to use something else such as XOR/ADD. *) if source mod 2 = 0 then ( genReg(XOR, output, output, code); if source = 0 then () else genImmed (ADD, output, source, code) ) else if isX64 andalso isTagged32bitS(toMachineWord source) then (* This is better on X64 but longer than a 32 bit immediate on i386 *) ( genOpRegPlus2 (MOVL_32_A, output, 0w0, code); gen32s (source, code) ) else let val (rc, rx) = getReg output in genop (MOVL_32_64_R rc, if isX64 then SOME {w=true, r=false, b=rx, x=false} else NONE, code); if isX64 then gen64s (source, code) else gen32s (source, code) end; cgOp remainder ) | cgOp(MoveConstR{ source, output as FPReg _ } :: remainder) = let val _ = addDests[output] (* We seem to get a short zero here as a result of putting in a void value. I think this occurs when a dummy value is put on when one side of a branch raises an exception. *) val _ = source = tag 0 orelse raise InternalError "Move LiteralSource to fp reg: invalid source" in genFloatingPt({escape=0w1, md=0w3, nnn=0w5, rm=0w6}, code); (* FLDZ *) storeFpRegFromStack(output, code); cgOp remainder end | cgOp(MoveLongConstR{ source, output } :: remainder) = let val (rc, rx) = getReg output in addDests[output]; genop(MOVL_32_64_R rc, if isX64 then SOME {w=true, r=false, b=rx, x=false} else NONE, code); addConstToVec (WVal source, InlineAbsolute, code); (* Remember this constant and address. *) cgOp remainder end | cgOp(LoadMemR{ source=BaseOffset{base, offset, index=NoIndex}, output as GenReg _} :: ResetStack count :: remainder) = if base = esp andalso offset < count * wordSize then (* Can use a pop instruction. *) let val resetBefore = Int.min(offset div wordSize, count) in if resetBefore = 0 (* So offset must be zero. *) then let val _ = offset = 0 orelse raise InternalError "cgOp: offset non-zero" val resetAfter = count - resetBefore - 1 in checkSources[base]; addDests[output]; genPushPop(POP_R, output, code); cgOp(if resetAfter = 0 then remainder else ResetStack resetAfter :: remainder) end else cgOp(ResetStack resetBefore :: LoadMemR{source=BaseOffset{base=base, offset=offset-resetBefore*wordSize, index=NoIndex}, output=output } :: (if count = resetBefore then remainder else ResetStack(count - resetBefore) :: remainder)) end else ( checkSources[base]; addDests[output]; genLoad(offset, base, output, code); cgOp(ResetStack count :: remainder) ) | cgOp(LoadMemR{source=BaseOffset{base, offset, index=NoIndex}, output} :: remainder) = ( checkSources[base]; addDests[output]; genLoad(offset, base, output, code); cgOp remainder ) | cgOp(LoadMemR{source=BaseOffset{base, offset, index}, output } :: remainder) = ( checkSources[base]; checkIndexSource index; addDests[output]; genOpIndexed(MOVL_A_R, offset, SOME base, index, output, code); cgOp remainder ) | cgOp(LoadMemR{source=ConstantAddress addr, output } :: remainder) = ( addDests[output]; (* The absolute address form is interpreted as PC relative in 64-bit mode. *) if isX64 then raise InternalError "LoadMemR: ConstantAddress" else (); genop(MOVL_A_R, NONE, code); genmodrm (Based0, #1 (getReg output), 0w5 (* constant address *), code); addConstToVec(WVal addr, InlineAbsolute, code); cgOp remainder ) | cgOp(LoadByteR{source=BaseOffset{base, offset, index}, output } :: remainder) = ( checkSources[base]; checkIndexSource index; addDests[output]; case index of NoIndex => genOpEA (MOVZX (* 2 byte opcode *), offset, base, output, code) | _ => genOpIndexed (MOVZX, 0, SOME base, index, output, code); cgOp remainder ) | cgOp(LoadByteR{source=ConstantAddress addr, output } :: remainder) = ( addDests[output]; if isX64 then raise InternalError "LoadByteR: ConstantAddress" else (); genop (MOVZX, NONE, code); genmodrm (Based0, #1(getReg output), 0w5 (* constant address *), code); addConstToVec(WVal addr, InlineAbsolute, code); cgOp remainder ) | cgOp(LoadCodeRef{ code=refCode, output } :: remainder) = let val (rc, rx) = getReg output in addDests[output]; genop (MOVL_32_64_R rc, if isX64 then SOME {w=true, r=false, b=rx, x=false} else NONE, code); codeConst(refCode, InlineAbsolute, code); cgOp remainder end | cgOp(LoadAddress{ offset, base, index, output } :: remainder) = ( (* This provides a mixture of addition and multiplication in a single instruction. *) addDests[output]; case base of NONE => () | SOME b => checkSources[b]; case (index, base) of (NoIndex, SOME base) => genOpEA(LEAL, offset, base, output, code) | (NoIndex, NONE) => raise InternalError "LoadAddress: no base or index" | _ => genOpIndexed(LEAL, offset, base, index, output, code); cgOp remainder ) | cgOp(ArithRR{ opc, output, source } :: remainder) = ( case opc of XOR => (if output = source then () else checkSources[output, source]; addDests[output]) | CMP => checkSources[output, source] | _ => (checkSources[output, source]; addDests[output]); genReg (opc, output, source, code); cgOp remainder ) | cgOp(ArithRConst{ opc, output, source } :: remainder) = ( checkSources[output]; case opc of CMP => () | _ => addDests[output]; genImmed (opc, output, source, code); cgOp remainder ) | cgOp(ArithRLongConst{ opc, output, source } :: remainder) = (* This is only used for opc=CMP to compare addresses for equality. *) let val (rc, rx) = getReg output in checkSources[output]; case opc of CMP => () | _ => addDests[output]; if isX64 then ( genop(Arith (opc, 0w3), SOME {w=true, r=rx, b=false, x=false}, code); genmodrm(Based0, rc, 0w5 (* Immediate address. *), code); addConstToVec (WVal source, ConstArea 0, code) ) else ( genop (Group1_32_A (* group1, 32 bit immediate *), NONE, code); genmodrm(Register, arithOpToWord opc, rc, code); addConstToVec (WVal source, InlineAbsolute, code) (* Remember this constant and address. *) ); cgOp remainder end | cgOp(ArithRMem{ opc, output, offset, base } :: remainder) = ( checkSources[output, base]; case opc of CMP => () | _ => addDests[output]; genOpEA(Arith (opc, 0w3), offset, base, output, code); cgOp remainder ) | cgOp(ArithMemConst{ opc, offset, base, source } :: remainder) = let val () = checkSources[base]; in if is8Bit source then (* Can use one byte immediate *) ( genOpPlus2(Group1_8_A (* group1, 8 bit immediate *), offset, base, arithOpToWord opc, code); gen8s (source, code) ) else (* Need 32 bit immediate. *) ( genOpPlus2(Group1_32_A (* group1, 32 bit immediate *), offset, base, arithOpToWord opc, code); gen32s(source, code) ); cgOp remainder end | cgOp(ArithMemLongConst{ opc, offset, base, source } :: remainder) = ( checkSources[base]; (* Currently this is always a comparison. We have to be careful that we don't accidentally get a zero word. *) genMemoryConstant(source, Group1_32_A, arithOpToWord opc, offset, base, NoIndex, code); cgOp remainder ) | cgOp(ShiftConstant { shiftType, output, shift } :: remainder) = ( if shift = 0w1 then genOpRegPlus2(Group2_1_A, output, shiftTypeToWord shiftType, code) else ( genOpRegPlus2(Group2_8_A, output, shiftTypeToWord shiftType, code); gen8u(shift, code) ); cgOp remainder ) | cgOp(ShiftVariable { shiftType, output } :: remainder) = ( genOpRegPlus2(Group2_CL_A, output, shiftTypeToWord shiftType, code); cgOp remainder ) | cgOp(TestTagR reg :: remainder) = ( checkSources[reg]; (* Test the tag bit and set the condition code *) testTag(reg, code); cgOp remainder ) | cgOp(TestByteMem{base, offset, bits} :: remainder) = ( checkSources[base]; (* Test the tag bit and set the condition code. *) genOpPlus2(Group3_a, offset, base, 0w0 (* test *), code); gen8u(wordToWord8 bits, code); cgOp remainder ) | cgOp(ConditionalBranch{ test=opc, label=Labels{forward, reverse, ...}, ... } :: remainder) = ( !reverse = addrUnsetLabel orelse raise InternalError "Conditional jump back"; genop(CondJump opc, NONE, code); gen8u(0w0, code); forward := makeShortLabel (!ic addrPlus ~1, code) :: !forward; cgOp remainder ) | cgOp(CallRTS entry :: remainder) = ( genop(Group5, NONE, code); genmodrm (Based8, 0w2 (* call *), #1 (getReg ebp), code); gen8u (Word8.fromInt entry(*memRegArbEmulation*), code); cgOp remainder ) | cgOp(TagValue{ source, output} :: remainder) = ( (* Convert an untagged integer into a tagged value by shifting and adding 1. *) checkSources[source]; addDests[output]; genOpIndexed (LEAL, 1, SOME source, Index1 source, output, code); cgOp remainder ) | cgOp(RepeatOperation repOp :: remainder) = ( checkSources[edi, ecx]; addDests[edi, ecx]; case repOp of STOSB => checkSources[eax] | STOSL => checkSources[eax] | _ => (checkSources[esi]; addDests[esi]); genop(REP, NONE, code); (* Put in a rex prefix to force 64-bit mode. *) if isX64 andalso (case repOp of STOSL => true | MOVSL => true | _ => false) then gen8u(rex{w=true, r=false, b=false, x = false}, code) else (); gen8u(repOpsToWord repOp, code); cgOp remainder ) | cgOp(Group3Ops(reg, ops) :: remainder) = ( checkSources[reg]; case ops of NOT => addDests[reg] | NEG => addDests[reg] | MUL => (checkSources[eax]; addDests[eax, edx]) | IMUL => (checkSources[eax]; addDests[eax, edx]) | DIV => (checkSources[eax, edx]; addDests[eax, edx]) | IDIV => (checkSources[eax, edx]; addDests[eax, edx]); genOpRegPlus2(Group3_A, reg, group3OpsToWord ops, code); cgOp remainder ) | cgOp(AtomicXAdd{base, output}:: remainder) = ( checkSources[base, output]; addDests[output]; (* Locked exchange-and-add. We need the lock prefix before the REX prefix. *) genOpEA (LOCK_XADD, 0, base, output, code); (*0wxF0 gen8u (0wx0f (* ESCAPE *), code); gen8u(0wxC1 (* xaddl *), code); genEA(0, base, output, code);*) cgOp remainder ) | cgOp(PushR(reg as GenReg _ ) :: remainder) = (checkSources[reg]; genPushPop(PUSH_R, reg, code); cgOp remainder) | cgOp(PushR(src as FPReg _ ) :: remainder) = ( (* We need to push a fp register to the stack. This can't be done directly so needs to go through a general register. Push eax (any register would do), allocate memory into that, then swap the value with the top of the stack, restoring the original eax and putting the address of the store onto the stack. It would be better to choose a free register and use that since we wouldn't need to save it. *) (* This originally used the XCHNG instruction to do the swap but that is very expensive because it involves a lock. This version is slightly more complicated but much quicker. *) checkSources[src]; genPushPop (PUSH_R, eax, code); genPushPop (PUSH_R, eax, code); loadFpRegToStack(src, 0w0, code); allocStoreAndSetSize(8 div wordSize, F_bytes, eax, code); genOpPlus2(FPESC 0w5, 0, eax, 0wx3, code); (* FSTP [rd] *) genOpEA (MOVL_R_A, wordSize, esp, eax, code); genPushPop(POP_R, eax, code); (* We've completed the allocation. *) case code of Code { inAllocation, ...} => inAllocation := false; cgOp remainder ) | cgOp(PushMem{base, offset} :: remainder) = ( checkSources[base]; genOpPlus2(Group5, offset, base, 0w6 (* push *), code); cgOp remainder ) | cgOp(PushConst constnt :: remainder) = ( if is8Bit constnt then ( genop (PUSH_8, NONE, code); gen8s (constnt, code) ) else ( genop (PUSH_32, NONE, code); gen32s(constnt, code) ); cgOp remainder ) | cgOp(PushLongConst constnt :: remainder) = ( if isX64 then (* Put it in the constant area. *) ( genop (Group5, NONE, code); genmodrm(Based0, 0w6 (* push *), 0w5 (* PC rel *), code); addConstToVec (WVal constnt, ConstArea 0, code) ) else (* 32-bit *) ( genop (PUSH_32, NONE, code); addConstToVec (WVal constnt, InlineAbsolute, code) ); cgOp remainder ) | cgOp(PopR reg :: remainder) = (addDests[reg]; genPushPop(POP_R, reg, code); cgOp remainder) | cgOp(StoreRegToMemory{ toStore, address } :: remainder) = ( checkSources[toStore]; case address of BaseOffset{offset, base, index=NoIndex} => ( checkSources[base]; genOpEA(MOVL_R_A, offset, base, toStore, code) ) | BaseOffset{offset, base, index} => ( checkSources[base]; checkIndexSource index; genOpIndexed(MOVL_R_A, offset, SOME base, index, toStore, code) ) | ConstantAddress address => ( if isX64 then raise InternalError "StoreRegToMemory: ConstantAddress" else (); genop(MOVL_R_A, NONE, code); genmodrm(Based0, #1 (getReg toStore), 0w5 (* constant address *), code); addConstToVec(WVal address, InlineAbsolute, code) ); cgOp remainder ) | cgOp(StoreConstToMemory{ toStore=toStore, address } :: remainder) = ( (* Short constant *) case address of BaseOffset{offset, base, index=NoIndex} => ( checkSources[base]; genOpPlus2(MOVL_32_A, offset, base, 0w0, code) ) | BaseOffset{offset, base, index} => ( checkSources[base]; checkIndexSource index; genOpIndexed (MOVL_32_A, offset, SOME base, index, mkReg(0w0, false), code) ) | ConstantAddress address => ( if isX64 then raise InternalError "StoreRegToMemory: ConstantAddress" else (); genop (MOVL_32_A, NONE, code); genmodrm (Based0, 0w0, 0w5 (* constant address *), code); addConstToVec(WVal address, InlineAbsolute, code) ); gen32s (toStore, code); cgOp remainder ) | cgOp(StoreLongConstToMemory{ toStore=toStore, address=BaseOffset{offset, base, index} } :: remainder) = ( checkSources[base]; checkIndexSource index; genMemoryConstant(toStore, MOVL_32_A, 0w0, offset, base, index, code); cgOp remainder ) | cgOp(StoreLongConstToMemory{ toStore=toStore, address=ConstantAddress address } :: remainder) = ( (* We have to be careful here that we don't accidentally produce a full word of zeros aligned on a word boundary. Since we have two addresses here which could potentially have any combination of zeros in the high bytes of one and the low bytes of the next the only safe option is to ensure the addresses are on word boundaries. *) if isX64 then raise InternalError "StoreLongConstToMemory: ConstantAddress" else (); doPending(code, wordSize*2 + 2); align(0w2, code); genop (MOVL_32_A, NONE, code); genmodrm (Based0, 0w0, 0w5 (* constant address *), code); addConstToVec(WVal address, InlineAbsolute, code); addConstToVec(WVal toStore, InlineAbsolute, code); cgOp remainder ) | cgOp(StoreByteRegToMemory{ toStore, address } :: remainder) = ( checkSources[toStore]; case address of BaseOffset{offset, base, index=NoIndex} => ( checkSources[base]; genOpEA(MOVB_R_A, offset, base, toStore, code) ) | BaseOffset{offset, base, index} => ( checkSources[base]; checkIndexSource index; genOpIndexed(MOVB_R_A, offset, SOME base, index, toStore, code) ) | ConstantAddress address => ( if isX64 then raise InternalError "StoreByteRegToMemory: ConstantAddress" else (); genop (MOVB_R_A, NONE, code); genmodrm(Based0, #1 (getReg toStore), 0w5 (* constant address *), code); addConstToVec(WVal address, InlineAbsolute, code) ); cgOp remainder ) | cgOp(StoreByteConstToMemory{ toStore=toStore, address } :: remainder) = ( (* Short constant *) case address of BaseOffset{offset, base, index=NoIndex} => ( checkSources[base]; genOpPlus2(MOVB_8_A, offset, base, 0w0, code) ) | BaseOffset{offset, base, index} => ( checkSources[base]; checkIndexSource index; genOpIndexed(MOVB_8_A, offset, SOME base, index, mkReg(0w0, false), code) ) | ConstantAddress address => ( if isX64 then raise InternalError "StoreByteConstToMemory: ConstantAddress" else (); genop (MOVB_8_A, NONE, code); genmodrm (Based0, 0w0, 0w5 (* constant address *), code); addConstToVec(WVal address, InlineAbsolute, code) ); gen8u (toStore, code); cgOp remainder ) | cgOp(AllocStore{ size, output } :: remainder) = (addDests[output]; allocStoreCode(size, output, code); cgOp remainder) | cgOp(AllocStoreVariable reg :: remainder) = (checkSources[reg]; addDests[reg]; allocStoreVarCode(reg, code); cgOp remainder) | cgOp(StoreInitialised :: remainder) = ( (* This is just for debugging to ensure we have properly initialised a piece of memory before allocating a new one. *) case code of Code { inAllocation as ref true, ...} => inAllocation := false | _ => raise InternalError "Found StoreInitialised but not in allocation" ; cgOp remainder ) | cgOp(CallFunction callKind :: remainder) = (callFunction(callKind, code); cgOp remainder) | cgOp(JumpToFunction callKind :: remainder) = (jumpToFunction(callKind, code); cgOp remainder) | cgOp(ReturnFromFunction argsToRemove :: remainder) = ( returnFromFunction(argsToRemove, code); cgOp remainder ) | cgOp(RaiseException :: remainder) = ( checkSources[eax]; (* Load the current handler into ebx. Any register will do since we don't preserve registers across exceptions. Call, rather than jump to, the exception code so that we have the address of the caller if we need to produce an exception trace. *) genLoad(memRegHandlerRegister, ebp, ebx, code); doPending (code, maxInstrSize+3); (* Since we're calling we put the "return address" on a word+2 byte boundary. This is never actually used as a return address but it's probably best to make sure it's properly aligned. It probably simplifies exception tracing which is the reason it's there. *) align (0w3, code); genop(Group5, NONE, code); genmodrm (Based0, 0w2 (* call *), #1 (getReg ebx), code); cgOp remainder ) | cgOp(UncondBranch(Labels{forward, reverse=ref reverse, ...}) :: remainder) = ( (* This may be a forward jump, in which case we don't have the destination and can just record it, or it may be a backward jump in which case we already have the destination. *) if reverse = addrUnsetLabel (* Destination is after this. *) then forward := unconditionalBranch code @ ! forward else let (* Do any pending instructions before calculating the offset, just in case we put in some instructions first. *) val () = doPending (code, maxInstrSize) val offset = reverse addrMinus (!ic); (* Negative *) val offset2 = offset - 2; in if is8Bit offset2 then ( genop (JMP_8, NONE, code); gen8s (offset2, code) ) else ( genop (JMP_32, NONE, code); gen32s (offset - 5, code) ) end; cgOp remainder ) | cgOp(ResetStack count1 :: ResetStack count2 :: remainder) = (* Combine adjacent resets. *) cgOp(ResetStack(count1+count2) :: remainder) | cgOp((r as ResetStack _) :: (f as FreeRegisters _) :: remainder) = (* Re-order register frees round resets. *) cgOp(f :: r :: remainder) | cgOp(ResetStack count :: remainder) = let val sr = Word.toInt(wordsToBytes(Word.fromInt count)) (* Offset in bytes. *) in if is8Bit sr then (* Can use one byte immediate *) ( genOpRegPlus2(Group1_8_A (* group1, 8-bit immediate *), esp, arithOpToWord ADD, code); gen8s(sr, code) ) else (* Need 32 bit immediate. *) ( genOpRegPlus2(Group1_32_A (* group1, 32-bit immediate *), esp, arithOpToWord ADD, code); gen32s(sr, code) ); cgOp remainder end | cgOp(JumpLabel(Labels{forward=ref forward, reverse, ...}) :: remainder) = let (* This is a bit complicated. We may have multiple labels at this location and they may be a combination of forward and backward labels. We don't want to put in a branch extension to this location unnecessarily and in particular we really don't want a 32-bit branch immediately before this because that would put in a zero word. Instead we just record the branches and actually set them when we generate real code. *) val Code {justComeFromAddrs, ...} = code in fixup(forward, code); (* Fix up any forward branches to here. *) (* Record the address. *) justComeFromAddrs := reverse :: ! justComeFromAddrs; cgOp remainder end | cgOp(InterruptCheck :: remainder) = (stackCheck code; cgOp remainder) | cgOp(LoadHandlerAddress{ handlerLab, output } :: remainder) = ( addDests[output]; loadHandlerAddress(output, handlerLab, code); cgOp remainder ) | cgOp(StartHandler{ handlerLab } :: remainder) = (fixupHandler(handlerLab, code); cgOp remainder) | cgOp(IndexedCase { testReg, workReg, min, cases } :: remainder) = ( checkSources[testReg]; addDests[workReg]; (* Check workReg is free? *) indexedCase(testReg, workReg, min, cases, code); cgOp remainder ) | cgOp (FreeRegisters _ :: remainder) = cgOp remainder | cgOp (MakeSafe output :: remainder) = ( addDests[output]; (* The register contains an untagged value. Clobber it. Because this is executed in the floating point comparison code we need to choose something that doesn't affect the condition codes. One possibility would be a move from another register if we could find one that was definitely safe. *) genTag(output, code); cgOp remainder ) | cgOp (FPLoadFromGenReg source :: remainder) = ( checkSources[source]; (* The "value" in the general register is actually the address of the memory containing the FP value. *) genOpPlus2(FPESC 0w5, 0, source, 0wx0, code); (* FLD [r1] *) cgOp remainder ) | cgOp (FPLoadFromFPReg{source, ...} :: remainder) = ( checkSources[source]; (* Assume there's nothing currently on the stack. *) loadFpRegToStack(source, 0w0, code); cgOp remainder ) | cgOp (FPLoadFromConst realValue :: remainder) = let open Real infix == in (* Treat +/- 0,1 as special cases. *) if realValue == 0.0 (* This is also true for -0.0 *) then ( genFloatingPt({escape=0w1, md=0w3, nnn=0w5, rm=0w6}, code); (* FLDZ *) if signBit realValue then genFloatingPt({escape=0w1, md=0w3, nnn=0w4, rm=0w0}, code) else () ) else if realValue == 1.0 then genFloatingPt({escape=0w1, md=0w3, nnn=0w5, rm=0w0}, code) (* FLD1 *) else if realValue == ~1.0 then ( genFloatingPt({escape=0w1, md=0w3, nnn=0w5, rm=0w0}, code); (* FLD1 *) genFloatingPt({escape=0w1, md=0w3, nnn=0w4, rm=0w0}, code) (* FCHS *) ) else ( (* The real constant here is actually the address of an 8-byte memory object. FLD takes the address as the argument and in 32-bit mode we use an absolute address. In 64-bit mode we need to put the constant at the end of the code segment and use PC-relative addressing which happens to be encoded in the same way. *) genop(FPESC 0w5, NONE, code); (* FLD [Constant] *) genmodrm (Based0, 0w0, 0w5 (* constant address/PC-relative *), code); addConstToVec(WVal(toMachineWord realValue), if isX64 then NonAddrArea else InlineAbsolute, code) ); cgOp remainder end | cgOp (FPStoreToFPReg{ output, andPop } :: remainder) = let val _ = addDests[output] val dest = case output of FPReg fp => fp | _ => raise InternalError "fpreg" in (* Assume there's one item on the stack. *) genFloatingPt({escape=0w5, md=0w3, nnn=if andPop then 0wx3 else 0wx2, rm = dest+0w1(* One item *)}, code); (* FSTP ST(n+1) *) cgOp remainder end | cgOp (FPStoreToMemory{ base, offset, andPop } :: remainder) = ( checkSources[base]; genOpPlus2(FPESC 0w5, offset, base, if andPop then 0wx3 else 0wx2, code); (* FST/FSTP [rd] *) cgOp remainder ) | cgOp (FPArithR{ opc, source } :: remainder) = let val fp = case source of FPReg fp => fp | _ => raise InternalError "cgOp: FPArithR" in genFloatingPt({escape=0w0, md=0w3, nnn=fpOpToWord opc, rm=fp + 0w1 (* One item already there *)}, code); cgOp remainder end | cgOp (FPArithConst{ opc, source } :: remainder) = ( (* See comment on FPLoadFromConst *) genop(FPESC 0w4, NONE, code); (* FADD etc [constnt] *) genmodrm (Based0, fpOpToWord opc, 0w5 (* constant address *), code); addConstToVec(WVal source, if isX64 then NonAddrArea else InlineAbsolute, code); cgOp remainder ) | cgOp (FPArithMemory{ opc, base, offset } :: remainder) = ( checkSources[base]; genOpPlus2(FPESC 0w4, offset, base, fpOpToWord opc, code); (* FADD/FMUL etc [r2] *) cgOp remainder ) | cgOp (FPUnary opc :: remainder) = let val {rm, nnn} = fpUnaryToWords opc in genFloatingPt({escape=0w1, md=0w3, nnn=nnn, rm=rm}, code); (* FCHS etc *) cgOp remainder end | cgOp (FPStatusToEAX :: remainder) = ( addDests[eax]; genop(FPESC 0w7, NONE, code); (* FNSTSW AX *) gen8u(0wxe0, code); cgOp remainder ) | cgOp (FPFree reg :: remainder) = let val dest = case reg of FPReg fp => fp | _ => raise InternalError "fpreg" in genFloatingPt({escape=0w5, md=0w3, nnn=0w0, rm=dest}, code); (* FFREE FP(n) *) cgOp remainder end | cgOp (FPLoadIntAndPop :: remainder) = ( (* There are some constraints here: We need to load from memory but the value has to be shifted first. We need to be able to emulate the instruction. The easiest way to do this is to push the value to the stack. *) (* Shift the value we pushed to untag it now we've done any trapping. *) genOpPlus2 (Group2_1_A, 0, esp, 0w7 (* sar *), code); (* fildl (esp) in 32-bit mode or fildq (esp) in 64-bit mode. *) if isX64 then genOpPlus2(FPESC 0w7, 0, esp, 0w5, code) else genOpPlus2(FPESC 0w3, 0, esp, 0w0, code); (* Pop the stack. This value is not a valid tagged value. *) cgOp(ResetStack 1 :: remainder) (* Pop the stack. *) ) | cgOp (PreAddDetag reg :: remainder) = ( (* Subtract the tag before an ADD instruction. This is needed because when testing for overflow in an arbitrary precision operation we have to have removed the tag from one of the arguments. Use LEAL here because if there is a trap the emulation code needs to treat it specially. *) genLeal(reg, reg, ~1, code); cgOp remainder ) in cgOp ops end fun printCode (Code{procName, numOfConsts, constVec, printStream, ...}) seg endcode = let val print = printStream val ptr = ref 0w0; (* prints a string representation of a number *) fun printHex v = print(Int.fmt StringCvt.HEX v) infix 3 +:= ; fun (x +:= y) = (x := !x + (y:word)); fun print32 () = let val valu = get32s (!ptr, seg); val () = (ptr +:= 0w4); in if valu = tag 0 andalso !numOfConsts <> 0w0 then (* May be a reference to a code-segment we haven't generated yet. In that case we try to print the name of the function rather than simply printing "1". It might be nice to print the function name in other cases but that might be complicated. *) let val caddr = !ptr - 0w4 fun findRef [] = (* Not there - probably really tagged 0 *) printHex valu | findRef ({const = CVal(Code{procName, ...}), addrs, ...} :: rest) = if caddr = addrs then print("=" ^ procName) else findRef rest | findRef (_ :: rest) = findRef rest in findRef(! constVec) end else printHex valu end; fun print64 () = let val valu = get64s(!ptr, seg); in printHex valu; ptr +:= 0w8 end fun get16s (a, seg: cseg) : int = let val b0 = Word8.toInt (csegGet (seg, a)); val b1 = Word8.toInt (csegGet (seg, a + 0w1)); val b1' = if b1 >= exp2_7 then b1 - exp2_8 else b1; in (b1' * exp2_8) + b0 end fun print16 () = printHex(get16s (!ptr, seg) before (ptr +:= 0w2)) and print8 () = printHex(get8s (!ptr, seg) before (ptr +:= 0w1)) fun printJmp () = let val valu = get8s (!ptr, seg) val () = ptr +:= 0w1; in printHex (valu + Word.toInt(!ptr)) end; (* Print an effective address. *) fun printEA rex = let val modrm = Word8.toInt (csegGet (seg, !ptr)); val () = (ptr +:= 0w1); val md = modrm div 64; val rm = modrm mod 8; (* Decode the Rex prefix if present. *) val rexX = (rex andb8 0wx2) <> 0w0 val rexB = (rex andb8 0wx1) <> 0w0 in if md = 3 then print (regRepr (mkReg(Word8.fromInt rm, rexB))) else if rm = 4 then let (* s-i-b present. *) val sib = Word8.toInt (csegGet (seg, !ptr)); val () = (ptr +:= 0w1); val ss = sib div 64; val index = (sib div 8) mod 8; val base = sib mod 8; in if md = 1 then print8 () else if md = 2 orelse base = 5 (* andalso md=0 *) then print32 () else (); print "("; if md <> 0 orelse base <> 5 then print (regRepr (mkReg (Word8.fromInt base, rexB))) else (); if index <> 4 (* No index. *) then print ("," ^ regRepr (mkReg(Word8.fromInt index, rexX)) ^ (if ss = 0 then ",1" else if ss = 1 then ",2" else if ss = 2 then ",4" (* N.B. *not* 3 - bugfix 29/3/95 *) else ",8")) else (); print ")" end else (* no s-i-b. *) if md = 0 andalso rm = 5 then (* Absolute address. *) (print "("; print32 (); print ")") else (* register plus offset. *) ( if md = 1 then print8 () else if md = 2 then print32 () else (); print ("(" ^ regRepr (mkReg(Word8.fromInt rm, rexB)) ^ ")") ) end; fun printArith opc = print (case opc of 0 => "add" | 1 => "or" | 2 => "adc" | 3 => "sbb" | 4 => "and" | 5 => "sub" | 6 => "xor" | _ => "cmp" ); in if procName = "" (* No name *) then print "?" else print procName; print ":\n"; while !ptr < endcode do let val () = printHex (Word.toInt(!ptr)) (* The address. *) val () = print "\t" (* See if we have a lock prefix. *) val () = if get8u (!ptr, seg) = 0wxF0 then (print "lock "; ptr := !ptr + 0w1) else () (* See if we have a REX byte. *) val rex = let val b = get8u (!ptr, seg); in if b >= 0wx40 andalso b <= 0wx4f then (ptr := !ptr + 0w1; b) else 0w0 end val rexW = (rex andb8 0wx8) <> 0w0 val rexR = (rex andb8 0wx4) <> 0w0 val rexX = (rex andb8 0wx2) <> 0w0 val rexB = (rex andb8 0wx1) <> 0w0 val opByte = get8u (!ptr, seg); val () = ptr +:= 0w1; in if opByte = opToInt Group1_8_A orelse opByte = opToInt Group1_32_A orelse opByte = opToInt Group1_8_a then let (* Opcode is determined by next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); in printArith ((nb div 8) mod 8); if opByte = opToInt Group1_8_a then print "b" else print "l"; print "_rev\t"; printEA rex; (* These are the wrong way round for gas. *) print ","; if opByte = opToInt Group1_32_A then print32 () else print8 () end else if opByte = opToInt (CondJump JE) then (print "je \t"; printJmp()) else if opByte = opToInt (CondJump JNE) then (print "jne \t"; printJmp()) else if opByte = opToInt (CondJump JO) then (print "jo \t"; printJmp()) else if opByte = opToInt (CondJump JNO) then (print "jno \t"; printJmp()) else if opByte = opToInt (CondJump JL) then (print "jl \t"; printJmp()) else if opByte = opToInt (CondJump JG) then (print "jg \t"; printJmp()) else if opByte = opToInt (CondJump JLE) then (print "jle \t"; printJmp()) else if opByte = opToInt (CondJump JGE) then (print "jge \t"; printJmp()) else if opByte = opToInt (CondJump JB) then (print "jb \t"; printJmp()) else if opByte = opToInt (CondJump JA) then (print "ja \t"; printJmp()) else if opByte = opToInt (CondJump JNA) then (print "jna \t"; printJmp()) else if opByte = opToInt (CondJump JNB) then (print "jnb \t"; printJmp()) else if opByte = opToInt JMP_8 then (print "jmp \t"; printJmp()) else if opByte = opToInt JMP_32 then let val valu = get32s (!ptr, seg); val () = (ptr +:= 0w4); in print "jmp\t"; printHex (Word.toInt(!ptr) + valu) end else if opByte = opToInt CALL_32 then let val valu = get32s (!ptr, seg); val () = (ptr +:= 0w4); in print "call\t"; printHex (Word.toInt(!ptr) + valu) end else if opByte = opToInt MOVL_A_R then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print "movl\t"; printEA rex; print ","; print (regRepr (mkReg(Word8.fromInt reg, rexR))) end else if opByte mod 0w8 = 0w3 andalso opByte < 0wx3f then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in printArith(Word8.toInt((opByte div 0w8) mod 0w8)); print "\t"; printEA rex; print ","; print (regRepr (mkReg(Word8.fromInt reg, rexR))) end else if opByte = opToInt MOVL_R_A then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print "movl\t"; print (regRepr (mkReg(Word8.fromInt reg, rexR))); print ","; printEA rex end else if opByte = opToInt XCHNG then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print "xchngl\t"; print (regRepr (mkReg(Word8.fromInt reg, rexR))); print ","; printEA rex end else if opByte = opToInt MOVB_R_A then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print "movb\t"; if rexX then print ("r" ^ Int.toString(reg+8) ^ "B") else case reg of 0 => print "%al" | 1 => print "%cl" | 2 => print "%dl" | 3 => print "%bl" (* If there is a REX byte these select the low byte of the registers. *) | 4 => print (if rex = 0w0 then "%ah" else "%sil") | 5 => print (if rex = 0w0 then "%ch" else "%dil") | 6 => print (if rex = 0w0 then "%dh" else "%bpl") | 7 => print (if rex = 0w0 then "%bh" else "%spl") | _ => print ("r" ^ Int.toString reg); print ","; printEA rex end else if opByte >= opToInt (PUSH_R 0w0) andalso opByte <= opToInt (PUSH_R 0w7) then print ("pushl\t" ^ regRepr (mkReg (opByte mod 0w8, rexB))) else if opByte >= opToInt (POP_R 0w0) andalso opByte <= opToInt (POP_R 0w7) then print ("pop\t" ^ regRepr (mkReg (opByte mod 0w8, rexB))) else if opByte = opToInt NOP then print "nop" else if opByte = opToInt LEAL then let (* Register is in next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print "leal\t"; printEA rex; print ","; print (regRepr (mkReg(Word8.fromInt reg, rexR))) end else if opByte >= opToInt (MOVL_32_64_R(#1(getReg eax))) andalso opByte <= opToInt (MOVL_32_64_R(#1(getReg edi))) then ( print "movl\t"; if rexW then print64 () else print32 (); print("," ^ regRepr (mkReg (opByte mod 0w8, rexB))) ) else if opByte = opToInt MOVL_32_A then ( print "movl_rev\t"; printEA rex; (* These are the wrong way round. *) print ","; print32 () ) else if opByte = opToInt MOVB_8_A then ( print "movb_rev\t"; printEA rex; (* These are the wrong way round. *) print ","; print8 () ) else if opByte = opToInt PUSH_32 then (print "push\t"; print32 ()) else if opByte = opToInt PUSH_8 then (print "push\t"; print8 ()) else if opByte = opToInt Group5 then let (* Opcode is determined by next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val opc = (nb div 8) mod 8; in print (case opc of 2 => "call" | 4 => "jmp " | 6 => "push" | _ => "???" ); print "\t"; printEA rex end else if opByte = opToInt Group3_A then let (* Opcode is determined by next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val opc = (nb div 8) mod 8; in print (case opc of 0 => "testl" | 3 => "negl" | 4 => "mull" | 5 => "imull" | 6 => "divl" | 7 => "idivl" | _ => "???" ); print "\t"; printEA rex; if opc = 0 then (print ","; print32 ()) else () end else if opByte = opToInt Group3_a then let (* Opcode is determined by next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val opc = (nb div 8) mod 8; in print (case opc of 0 => "testb" | 3 => "negb" | _ => "???" ); print "\t"; printEA rex; if opc = 0 then (print ","; print8 ()) else () end else if opByte = opToInt Group2_1_A orelse opByte = opToInt Group2_CL_A orelse opByte = opToInt Group2_8_A then let (* Opcode is determined by next byte. *) val nb = Word8.toInt (csegGet (seg, !ptr)); val opc = (nb div 8) mod 8; in print (case opc of 4 => "shl " | 5 => "shr " | 7 => "sar " | _ => "???" ); print "\t"; printEA rex; print ","; (* This is the reverse order from gas which has the shift first. *) if opByte = opToInt Group2_1_A then print "1" else if opByte = opToInt Group2_CL_A then print "cl" else print8 () end else if opByte = opToInt ESCAPE then let (* Opcode is in next byte. *) val opByte2 = Word8.toInt (csegGet (seg, !ptr)); val () = (ptr +:= 0w1); in if opByte2 = 0xB6 orelse opByte2 = 0xC1 then let val nb = Word8.toInt (csegGet (seg, !ptr)); val reg = (nb div 8) mod 8; in print (if opByte2 = 0xB6 then "movzl\t" else "xaddl\t"); printEA rex; print ","; print (regRepr (mkReg(Word8.fromInt reg, rexR))) end else if opByte2 >= 0x80 andalso opByte2 <= 0x8f then let val valu = get32s (!ptr, seg); val () = (ptr +:= 0w4); in print( case opByte2 of 0x80 => "jo\t" | 0x84 => "je\t" | 0x85 => "jne\t" | 0x8c => "jl\t" | 0x8d => "jge\t" | 0x8e => "jle\t" | 0x8f => "jg\t" | 0x82 => "jb\t" | 0x83 => "jnb\t" | 0x86 => "jna\t" | 0x87 => "ja\t" | _ => "???\t" ); printHex (Word.toInt(!ptr) + valu) end else (print "esc\t"; printHex opByte2) end (* ESCAPE *) else if opByte = opToInt POP_A then (print "pop\t"; printEA rex) else if opByte = opToInt RET then print "ret" else if opByte = opToInt STC then print "stc" else if opByte = opToInt RET_16 then (print "ret\t"; print16 ()) else if opByte = opToInt TEST_ACC8 then (print "testb\t%al,"; print8 ()) else if opByte >= opToInt (FPESC 0w0) andalso opByte <= opToInt (FPESC 0w7) then (* Floating point escapes *) let (* Opcode is in next byte. *) val opByte2 = csegGet (seg, !ptr) val nnn = (opByte2 >>- 0w3) andb8 0w7 val escNo = opByte andb8 0wx7 in if (opByte2 andb8 0wxC0) = 0wxC0 then (* mod = 11 *) ( case (escNo, nnn, opByte2 andb8 0wx7 (* modrm *)) of (0w1, 0w4, 0w0) => print "fchs" | (0w1, 0w5, 0w6) => print "fldz" | (0w1, 0w5, 0w1) => print "flf1" | (0w7, 0w4, 0w0) => print "fnstsw\tax" | (0w1, 0w5, 0w0) => print "fld1" | (0w1, 0w6, 0w3) => print "fpatan" | (0w1, 0w7, 0w2) => print "fsqrt" | (0w1, 0w7, 0w6) => print "fsin" | (0w1, 0w7, 0w7) => print "fcos" | (0w1, 0w6, 0w7) => print "fincstp" | (0w1, 0w6, 0w6) => print "fdecstp" | (0w5, 0w2, rno) => print ("fst \tst(" ^ Word8.toString rno ^ ")") | (0w5, 0w3, rno) => print ("fstp\tst(" ^ Word8.toString rno ^ ")") | (0w1, 0w0, rno) => print ("fld \tst(" ^ Word8.toString rno ^ ")") | (0w1, 0w1, rno) => print ("fxch\tst(" ^ Word8.toString rno ^ ")") | (0w0, 0w3, rno) => print ("fcomp\tst(" ^ Word8.toString rno ^ ")") | (0w0, 0w0, rno) => print ("fadd\tst,st(" ^ Word8.toString rno ^ ")") | (0w0, 0w1, rno) => print ("fmul\tst,st(" ^ Word8.toString rno ^ ")") | (0w0, 0w4, rno) => print ("fsub\tst,st(" ^ Word8.toString rno ^ ")") | (0w0, 0w5, rno) => print ("fsubr\tst,st(" ^ Word8.toString rno ^ ")") | (0w0, 0w6, rno) => print ("fdiv\tst,st(" ^ Word8.toString rno ^ ")") | (0w0, 0w7, rno) => print ("fdivr\tst,st(" ^ Word8.toString rno ^ ")") | (0w5, 0w0, rno) => print ("ffree\tst(" ^ Word8.toString rno ^ ")") | _ => (printHex(Word8.toInt opByte); printHex(Word8.toInt opByte2)); ptr +:= 0w1 ) else (* mod = 00, 01, 10 *) ( case (escNo, nnn) of (0w3, 0w0) => print "fildl\t" | (0w7, 0w5) => print "fildq\t" | (0w4, 0w0) => print "fadd\t" | (0w4, 0w1) => print "fmul\t" | (0w4, 0w3) => print "fcomp\t" | (0w4, 0w4) => print "fsub\t" | (0w4, 0w5) => print "fsubr\t" | (0w4, 0w6) => print "fdiv\t" | (0w4, 0w7) => print "fdivr\t" | (0w5, 0w0) => print "fld \t" | (0w5, 0w2) => print "fst\t" | (0w5, 0w3) => print "fstp\t" | _ => (printHex(Word8.toInt opByte); printHex(Word8.toInt opByte2)); printEA rex ) end else if opByte = opToInt SAHF then print "sahf\n" else if opByte = opToInt REP then print "rep\t" else if opByte = 0wxA4 then print "movsb\n" else if opByte = 0wxA5 then print "movsl\n" else if opByte = 0wxA6 then print "cmpsb\n" else if opByte = 0wxAA then print "stosb\n" else if opByte = 0wxAB then print "stosl\n" else printHex(Word8.toInt opByte); print "\n" end; (* end of while loop *) print "\n" end (* printCode *); (* Adds the constants onto the code, and copies the code into a new segment *) fun createCodeSegment (operations, registerSet, cvec) : address = let val () = codeGenerate(operations, cvec) (* After code generation get the final values of some refs. *) val Code{codeVec, noClosure, numOfConsts, ic, constVec = ref constVec, nonInlineConsts = ref constsInConstArea, resultSeg, procName, printAssemblyCode, printStream, profileObject, ...} = cvec (* This aligns ic onto a fullword boundary. *) val () = while Word.toInt (!ic) mod wordSize <> 0 do genop(NOP, NONE, cvec) val endic = !ic (* Remember end *) val () = genWordU(0w0, cvec) (* Marker - 0 (changes !ic) *) (* Byte offset of start of code. (changes !ic) *) val () = genWordU(Word.toLargeWord(!ic), cvec) (* Copy the non-address constants. These are currently only used for real constants in 64-bit mode. Other constants are left until we have a valid code object. *) local fun putNonAddrConst{const = WVal c, addrs, posn=NonAddrArea, ...} = let val addrOfConst = ! ic val cAsAddr = toAddress c (* For the moment this should always be a real number contained in a byte segment. If this changes in the future we may need to align this back onto a 4/8-byte boundary. *) val cLength = length cAsAddr * Word.fromInt wordSize val _ = (cLength = 0w8 andalso flags cAsAddr = F_bytes) orelse raise InternalError "putNonAddrConst: Not a real number" fun doCopy n = if n = cLength then () else (gen8u(loadByte(cAsAddr, n), cvec); doCopy(n+0w1)) val () = doCopy 0w0 in set32s(Word.toInt(addrOfConst - addrs - 0w4), addrs, codeVec) end | putNonAddrConst _ = () in val () = List.app putNonAddrConst constVec end (* +4 for code size, function name, register mask and profile object. *) val segSize = !ic div Word.fromInt wordSize + Word.fromInt constsInConstArea + 0w4 (* Now make the byte segment that we'll turn into the code segment *) val seg : cseg = csegMake segSize val _ = resultSeg := Set seg; (* Copy the code into the new segment. *) val _ = csegCopySeg (codeVec, seg, (! ic), 0w0); local val endOfCode = bytesToWords(! ic) in (* Put in the number of constants. This must go in before we actually put in any constants. In 32-bit mode there are only two constants: the function name and the register mask. All other constants are in the code. *) local val addr = wordsToBytes(endOfCode + 0w3 + Word.fromInt constsInConstArea) in val () = setWordU(3 + constsInConstArea, addr, seg) end; (* Now we've filled in all the C integers; now we need to convert the segment into a proper code segment before it's safe to put in any ML values. *) val () = csegConvertToCode seg val () = csegPutWord (seg, endOfCode, toMachineWord procName) val () = csegPutWord (seg, endOfCode + 0w1, toMachineWord(encodeRegSet registerSet)) (* Next the profile object. *) val () = csegPutWord (seg, endOfCode + 0w2, profileObject) end in let (* constLabels - fill in a constant in the code. *) fun constLabels (Code{resultSeg=ref rseg, ...}, addr, value, InlineAbsolute) = csegPutConstant (scSet rseg, addr, value, false) | constLabels (Code{resultSeg=ref rseg, ...}, addr, value, InlineRelative) = csegPutConstant (scSet rseg, addr, value, true) | constLabels (_, _, _, NonAddrArea) = () (* Already done. *) | constLabels (Code{resultSeg=ref rseg, ic = ref endByte, ...}, constAddr, value, ConstArea nonInlineCount) = (* Not inline. Put the constant in the constant area and set the original address to be the relative offset to the constant itself. *) let val addrOfConst = endByte addrPlus (nonInlineCount-1 + 2+1) * wordSize val seg = scSet rseg (* The address of the segment. *) in csegPutConstant (seg, addrOfConst, value, false); set32s(Word.toInt(addrOfConst - constAddr - 0w4), constAddr, seg) end (* and then copy the objects from the constant list. *) fun putConst {const = WVal c, addrs, posn, ...} = ( (* Can put these in now. *) constLabels (cvec, addrs, c, posn); numOfConsts := ! numOfConsts - 0w1 ) | putConst {const = HVal(ref hv), addrs, posn, ...} = let val handlerByteOffset = hv (* The following comment applies to offsetAddr *) (* Special function to add to an address. This only works if the resulting value is in a code segment and is on a word + 2 byte boundary. *) val handlerAddr : handler = offsetAddr (csegAddr seg, handlerByteOffset); in constLabels (cvec, addrs, toMachineWord handlerAddr, posn); numOfConsts := ! numOfConsts - 0w1 end (* forward-reference - fix up later when we compile the referenced code *) | putConst {const = CVal _, ...} = () val () = List.app putConst constVec (* Switch off "mutable" bit now if we have no forward or recursive references to fix-up *) val _ = if ! numOfConsts = 0w0 then csegLock seg else (); (* Do we need to make a closure, or just return the code? *) val addr : address = if noClosure then csegAddr seg else let val addr : address = alloc (0w1, F_words, toMachineWord (csegAddr seg)) (* Logically unnecessary; however the RTS currently allocates everything as mutable because Dave's code assumed that things were done this way and I'm not completely sure that everything that needs a mutable allocation actually asks for it yet. *) val () = lock addr in addr end (* Now we know the address of this object we can fix up any forward references outstanding. This is put in here because there may be directly recursive references. *) local val Code{completionHooks=ref hooks, ...} = cvec in val () = List.app(fn f => f(cvec, toMachineWord addr)) hooks end val () = if printAssemblyCode then (* print out the code *) ( printCode cvec seg endic; printStream "Register set = "; printStream(regSetRepr registerSet); printStream "\n\n" ) else () in addr end (* the result *) end (* copyCode *); fun codeAddress (cvec: code) : address option = (* This is used to find the register set for a function which was originally a forward reference. If it has now been compiled we can get the code. *) case cvec of Code {resultSeg = ref (Set cseg), ...} => SOME(csegAddr cseg) | Code {resultSeg = ref Unset, ...} => (* We haven't compiled this yet: assume worst case. *) NONE structure Sharing = struct type code = code and reg = reg and addrs = addrs and operation = operation and regSet = RegSet.regSet and label = label and labList = labList end end (* struct *) (* CODECONS *); polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/ml_bind.i386.ML000066400000000000000000000021041265146633400237430ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009, 2013 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure X86Code = GENERATE_CODE ( structure CODECONS = CodeCons structure CODEGEN_TABLE = CodeGenTable structure BACKENDTREE = BackendIntermediateCode structure DEBUG = Debug ); polyml-5.6/mlsource/MLCompiler/CodeTree/X86Code/ml_bind.x86_64.ML000066400000000000000000000021041265146633400242100ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2010, 2013 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure X86Code = GENERATE_CODE ( structure CODECONS = CodeCons structure CODEGEN_TABLE = CodeGenTable structure BACKENDTREE = BackendIntermediateCode structure DEBUG = Debug ); polyml-5.6/mlsource/MLCompiler/CodeTree/ml_bind.ML000066400000000000000000000064711265146633400221060ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local structure CodetreeFunctions = CODETREE_FUNCTIONS(structure BASECODETREE = BaseCodeTree) structure CodetreeBackend = CODETREE_STATIC_LINK_AND_CASES( structure PRETTY = Pretty structure GCODE = GCode structure DEBUG = Debug structure BASECODETREE = BaseCodeTree structure BACKENDTREE = BackendIntermediateCode structure CODETREE_FUNCTIONS = CodetreeFunctions ) structure CodetreeLamdbaLift = CODETREE_LAMBDA_LIFT ( structure BASECODETREE = BaseCodeTree and CODETREE_FUNCTIONS = CodetreeFunctions and BACKEND = CodetreeBackend and PRETTY = Pretty and DEBUG = Debug ) structure CodetreeCodegenConstantFns = CODETREE_CODEGEN_CONSTANT_FUNCTIONS ( structure BASECODETREE = BaseCodeTree and CODETREE_FUNCTIONS = CodetreeFunctions and BACKEND = CodetreeLamdbaLift and PRETTY = Pretty and DEBUG = Debug ) structure CodetreeRemoveRedundant = CODETREE_REMOVE_REDUNDANT( structure BASECODETREE = BaseCodeTree structure CODETREE_FUNCTIONS = CodetreeFunctions ) structure CodetreeSimplifier = CODETREE_SIMPLIFIER( structure BASECODETREE = BaseCodeTree structure CODETREE_FUNCTIONS = CodetreeFunctions structure REMOVE_REDUNDANT = CodetreeRemoveRedundant ) structure CodetreeOptimiser = CODETREE_OPTIMISER( structure PRETTY = Pretty structure DEBUG = Debug structure BASECODETREE = BaseCodeTree structure CODETREE_FUNCTIONS = CodetreeFunctions structure BACKEND = CodetreeCodegenConstantFns structure REMOVE_REDUNDANT = CodetreeRemoveRedundant structure SIMPLIFIER = CodetreeSimplifier ) in structure CodeTree = CODETREE ( structure PRETTY = Pretty structure DEBUG = Debug structure BASECODETREE = BaseCodeTree structure CODETREE_FUNCTIONS = CodetreeFunctions structure BACKEND = CodetreeCodegenConstantFns structure OPTIMISER = CodetreeOptimiser ) end; polyml-5.6/mlsource/MLCompiler/CompilerBody.ML000066400000000000000000000026451265146633400213770ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Make the ML system. Author: Mike Crawley Copyright AHL 1993 *) structure CompilerBody = COMPILER_BODY ( structure SYMBOLS = Symbols structure SYMSET = SymSet structure LEX = Lex structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure STRUCTURES = Structures structure PARSEDEC = ParseDec structure DEBUG = Debug structure UTILITIES = Utilities structure MISC = Misc structure PRETTY = Pretty structure EXPORTTREE = ExportTreeStruct ) ; polyml-5.6/mlsource/MLCompiler/CompilerVersion.sml000066400000000000000000000016001265146633400224000ustar00rootroot00000000000000(* Copyright (c) 2007-16 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CompilerVersion = struct val compilerVersion = "5.6 Release" val versionNumber = 560 val versionSuffix = Int.toString versionNumber end; polyml-5.6/mlsource/MLCompiler/CopierStruct.sml000066400000000000000000000017401265146633400217130ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CopierStruct = COPIER( structure STRUCTVALS = StructVals and TYPETREE = TypeTree and UNIVERSALTABLE = UniversalTable and UTILITIES = Utilities );polyml-5.6/mlsource/MLCompiler/DATATYPEREPSIG.sml000066400000000000000000000042411265146633400214110ustar00rootroot00000000000000(* Copyright (c) 2009 David C. J. Matthews 2009. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature DATATYPEREPSIG = sig type codetree type types type values type typeConstrSet type typeId type typeVarForm type typeVarMap type level val chooseConstrRepr : (string*types) list * types list -> { constrs: codetree list, boxed: codetree, size: codetree } type representations val RefForm: representations; val EnumForm: { tag: word, maxTag: word } -> representations; val createNullaryConstructor: representations * types list * string -> codetree val createUnaryConstructor: representations * types list * string -> codetree (* Standard values *) val listConstr: typeConstrSet val nilConstructor: values; val consConstructor: values; val noneConstructor: values val someConstructor: values val optionConstr: typeConstrSet val locationConstr: typeConstrSet and contextConstr: typeConstrSet and prettyConstr: typeConstrSet val mkExIden: types * level * typeVarMap -> codetree (* Types that can be shared. *) structure Sharing: sig type codetree = codetree type types = types type values = values type typeConstrSet = typeConstrSet type typeId = typeId type typeVarForm = typeVarForm type typeVarMap = typeVarMap type level = level end end; polyml-5.6/mlsource/MLCompiler/DATATYPE_REP.ML000066400000000000000000001015761265146633400207330ustar00rootroot00000000000000(* Copyright (c) 2009, 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Operations on global and local values. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1986 *) functor DATATYPE_REP ( structure CODETREE : CODETREESIG structure STRUCTVALS : STRUCTVALSIG; structure TYPESTRUCT : TYPETREESIG structure MISC : sig exception InternalError of string; (* compiler error *) val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list end; structure ADDRESS : AddressSig structure COPIER: COPIERSIG structure TYPEIDCODE: TYPEIDCODESIG sharing STRUCTVALS.Sharing = TYPESTRUCT.Sharing = COPIER.Sharing = CODETREE.Sharing = ADDRESS = MISC = TYPEIDCODE.Sharing ) : DATATYPEREPSIG = struct open MISC; open CODETREE; open TYPESTRUCT; (* Open this first because unitType is in STRUCTVALS as well. *) open Universal; (* for tag etc. *) open STRUCTVALS; open ADDRESS; open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open TYPEIDCODE open COPIER val length = List.length; val orb = Word8.orb infix 7 orb; (* These are the possible representations of a value constructor. *) datatype representations = RefForm (* As for OnlyOne but must be a monotype. *) | UnitForm (* If the only value in an enumeration. *) | OnlyOne (* If only one constructor, there is no tag or box. *) (* Could be replaced by "UnboxedForm"? *) | EnumForm of { tag: word, maxTag: word } (* Enumeration - argument is the number. *) | ShortForm of word (* As EnumForm except that one datatype is BoxedForm. *) | BoxedForm (* Boxed but not tagged (only unary constructor) *) | UnboxedForm of int (* Unboxed and untagged (only unary constructor) *) | ConstForm of { value: machineWord, maxTag: word} (* Constant - argument is a tagged value. *) | TaggedBox of { tag: word, maxTag: word } (* Union - tagged and boxed. i.e. the representation is a pair whose first word is the tag and second is the value. *) | TaggedTuple of { tag: word, maxTag: word, size: int } (* Union - tagged but with in-line tuple. i.e. for a tuple of size n the representation is a tuple of size n+1 whose first word contains the tag. *) val arg1 = mkLoadArgument 0 (* saves a lot of garbage *) val mutableFlags = F_words orb F_mutable; (* allocate 1 mutable word, initialise to "v"; do not evaluate "early" *) fun refApplyCode (v: codetree) = mkEval (rtsFunction POLY_SYS_alloc_store, [mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), v]); local fun mkTag (tag:word) : codetree = mkConst (toMachineWord tag); (* How to apply the constructor at run-time or, if, it's a constant make it now. *) fun constrApply (test: representations, arg) : codetree = let fun tagTupleApplyCode (tag, n, arg) = mkEval (mkInlproc (mkDatatype (mkTag tag :: List.tabulate(n, fn i => mkInd(i, arg1))), 1, "", [], 0), [arg]) (* Even though unboxed tuples (e.g. list cells) are the same as tuples we need to add this extra step so that the result is a variant tuple i.e. the optimiser can tell that this may not always be a tuple. *) fun tupleApplyCode (n, arg) = mkEval (mkInlproc (mkDatatype (List.tabulate(n, fn i => mkInd(i, arg1))), 1, "", [], 0), [arg]) in case test of UnboxedForm 0 => arg (* Function - never detupled. *) | UnboxedForm size => tupleApplyCode(size, arg) | BoxedForm => mkDatatype [arg] | RefForm => refApplyCode arg | TaggedBox{tag, ...} => mkDatatype [mkTag tag, arg] | TaggedTuple{tag, size, ...} => tagTupleApplyCode(tag, size, arg) | OnlyOne => arg | ConstForm{ value, ...} => mkConst value (* tagged value. *) | EnumForm{tag, ...} => mkConst (toMachineWord tag) | ShortForm tag => mkConst (toMachineWord tag) | UnitForm => CodeZero end (* The run-time test whether a value matches a constructor. *) fun constrMatch (test: representations, value:codetree) : codetree = let fun testTag (tag, v) = mkTestinteq (mkTag tag, v) fun testTagOf(tag, maxTag, v) = mkTagTest (v, tag, maxTag) fun testBoxedTagOf (tag, maxTag, v) = testTagOf (tag, maxTag, mkInd (0, v)) (* Tag is first field. It is always present and is always the tag so we can use mkInd here rather than mkVarField. *) fun testBoxed (v: codetree) : codetree = (* not (isShort v) *) mkEval (rtsFunction POLY_SYS_not_bool, [mkEval (rtsFunction POLY_SYS_is_short, [v])]); (* get the tag from a TaggedBox or ConstForm *) fun loadTag (u: machineWord) : machineWord = loadWord (toAddress u, 0w0); (* tag is first field *) in case test of UnboxedForm _ => testBoxed value | BoxedForm => testBoxed value | RefForm => CodeTrue | EnumForm{tag, maxTag} => testTagOf(tag, maxTag, value) | ShortForm tag => testTag(tag, value) | TaggedBox{tag, maxTag} => testBoxedTagOf(tag, maxTag, value) | TaggedTuple{tag, maxTag, ...} => testBoxedTagOf(tag, maxTag, value) | ConstForm{value=c, maxTag} => testBoxedTagOf(toShort (loadTag c), maxTag, value) | OnlyOne => CodeTrue | UnitForm => CodeTrue end (* The run-time code to destruct a construction. *) (* shouldn't the CodeZero's raise an exception instead? No, because I think there are circumstances in which the destructor code is created even for nullary constructors. *) fun constrDestruct (test: representations, value: codetree) : codetree = let (* Copy out the fields and build a tuple. Used either if we have a tagged tuple (offset 1) or a tuple that does not need boxing (because we need to use mkVarField to extract the fields). *) fun tupleDestructCode (n, arg, offset) = mkEval ( mkInlproc (mkTuple (List.tabulate(n, fn i => mkVarField(i+offset, arg1))), 1, "", [], 0), [arg]) (* Use loadWord not indirect because the optimiser reorders indirections. *) fun refDestructCode (v : codetree) : codetree = mkEval (rtsFunction POLY_SYS_load_word, [v, CodeZero]) in case test of UnboxedForm 0 => value (* Function - never detupled. *) | UnboxedForm size => tupleDestructCode(size, value, 0) | BoxedForm => mkVarField (0, value) | RefForm => refDestructCode value | TaggedBox _ => mkVarField (1, value) (* contents is second field of record *) | TaggedTuple { size, ...} => tupleDestructCode(size, value, 1) | OnlyOne => value | EnumForm _ => CodeZero (* To keep optimiser happy. *) | ShortForm _ => CodeZero (* To keep optimiser happy. *) | ConstForm _ => CodeZero (* (rather than raising an exception) *) | UnitForm => CodeZero end open ValueConstructor in (* Constructors are now represented as run-time values. A nullary constructor is a pair consisting of a test function and the constructor value. A unary constructor is a triple: a test function, an injection function and a projection function. The above applies to monotypes. If this is a polytype each of these is actually a function from the base type values to the functions. *) fun createNullaryConstructor (test, tvs, name): codetree = let val numTypes = if justForEqualityTypes then 0 else List.length tvs val testFn = mkInlproc(constrMatch(test, arg1), 1, name, [], 0) (* Test function. *) and constrVal = constrApply(test, CodeZero) (* Value. *) in if numTypes = 0 then createNullaryConstr{ testMatch = testFn, constrValue = constrVal } else createNullaryConstr{ testMatch = mkInlproc(testFn, numTypes, name, [], 0), constrValue = mkInlproc(constrVal, numTypes, name, [], 0)} end fun createUnaryConstructor(test: representations, tvs, name: string): codetree = let val numTypes = if justForEqualityTypes then 0 else List.length tvs val testMatch = mkInlproc(constrMatch(test, arg1), 1, name, [], 0) (* Test function. *) and injectValue = mkInlproc(constrApply(test, arg1), 1, name, [], 0) (* Injection function. *) and projectValue = mkInlproc(constrDestruct(test, arg1), 1, name, [], 0) (* Projection function. *) in if numTypes = 0 then createValueConstr{testMatch = testMatch, injectValue = injectValue, projectValue = projectValue } else createValueConstr{ testMatch = mkInlproc(testMatch, numTypes, name, [], 0), injectValue = mkInlproc(injectValue, numTypes, name, [], 0), projectValue = mkInlproc(projectValue, numTypes, name, [], 0)} end end (* RefForm is used for "ref" (only). We use various representations of datatype / abstype constructors. Nullary constructors are represented as: UnitForm (if it's the only constructor in the datatype) EnumForm (if all the constructors are nullary) ShortForm (if there's one unary constructor) ConstForm (otherwise) Unary constructors are represented as: OnlyOne (if it's the only constructor in the datatype) UnboxedForm (if it's the only unary constructor and the argument is always a tuple e.g. list) TaggedTuple (if it's not the only unary constructor, applied to a tuple) BoxedForm (if it's the only unary constructor and the argument may not be a tuple e.g. SOME) TaggedBox (otherwise) Note that we use ConstForm, not EnumForm, for nullary constructors when the unary constructors are represented as TaggedTuple/TaggedBox because that allows the TaggedBox test to be: fn w => wordEq (loadWord (w,0), tag) rather than: fn w => not (isShort w) andalso wordEq (loadWord (w,0), tag) *) datatype constructorKind = Nullary (* a nullary constructor *) | UnaryGeneric (* a normal unary constructor *) | UnaryFunction (* unary constructor applied to a function *) | UnaryTupled of int (* a unary constructor applied to a tuple of size n *) ; fun getTupleKind t = case t of (* We cannot have flexible records here. All the fields must be listed. *) LabelledType {recList = [{typeof=t', ...}], ...} => (* Singleton records are always represented simply by the value. *) getTupleKind t' | LabelledType {recList, ...} => UnaryTupled (length recList) | FunctionType _ => UnaryFunction | TypeConstruction {constr, args, ...} => ( (* We may have a type equivalence or this may be a datatype. *) if tcIsAbbreviation constr then getTupleKind (makeEquivalent(constr, args)) else if sameTypeId (tcIdentifier constr, tcIdentifier refConstr) then UnaryGeneric (* A tuple ref is NOT the same as the tuple. *) else (* Datatype. For the moment we only consider datatypes with a single constructor since we want to find the width of the tuple. At present we simply return UnaryGeneric for all other cases but it might be helpful to return a special result when we have a datatype which we know will always be boxed. *) (* case tcConstructors constr of [Value{typeOf, class=Constructor{nullary=false, ...}, ...}] => (* This may be a polymorphic datatype in which case we have to invert the constructor to find the base type. e.g. we may have an instance (int*int) t where t was declared as datatype 'a t = X of 'a .*) getTupleKind(constructorResult(typeOf, args)) | _ => UnaryGeneric *) UnaryGeneric ) | _ => UnaryGeneric (* This now creates the functions as well as choosing the representation. *) (* N.B. The representation for the "context" and "pretty" datatypes is defined in Pretty.sml. Any changes here that may affect the representation of a datatype may require changes there as well. *) fun chooseConstrRepr(cs, tvs: types list) = let fun checkArgKind (name, EmptyType) = (Nullary, name) | checkArgKind (name, argType) = (getTupleKind argType, name) val kinds = map checkArgKind cs; fun chooseRepr [(Nullary, name)] = [createNullaryConstructor(UnitForm, tvs, name)] | chooseRepr [(UnaryGeneric, name)] = [createUnaryConstructor(OnlyOne, tvs, name)] | chooseRepr [(UnaryFunction, name)] = [createUnaryConstructor(OnlyOne, tvs, name)] | chooseRepr [(UnaryTupled _, name)] = [createUnaryConstructor(OnlyOne, tvs, name)] | chooseRepr l = let val unaryCount = List.foldl(fn((Nullary, _), n) => n | (_,n) => n+1) 0 l in case unaryCount of 0 => (* All are nullary. *) let val maxTag = Word.fromInt(List.length l)-0w1 (* Largest no is length-1 *) fun createRepr(_, []) = [] | createRepr(n, (_, name) :: t) = createNullaryConstructor(EnumForm{tag=n, maxTag=maxTag}, tvs, name) :: createRepr (n + 0w1, t) in createRepr(0w0, l) end | 1 => let (* We use this version if all the constructors are nullary (i.e. constants) except one. The unary constructor is represented by the boxed value and the nullary constructors by untagged integers. *) (* Note that "UnaryTupled 0" (which would arise as a result of a declaration of the form datatype t = A of () | ... ) can't be represented as "UnboxedForm" because "{}" is represented as a short (unboxed) integer. *) fun chooseOptimisedRepr1(_, _, []) = [] | chooseOptimisedRepr1(n, tvs, (Nullary, name) :: t) = createNullaryConstructor(ShortForm n, tvs, name) :: chooseOptimisedRepr1 (n + 0w1, tvs, t) | chooseOptimisedRepr1(n, tvs, (UnaryGeneric, name) :: t) = createUnaryConstructor(BoxedForm, tvs, name) :: chooseOptimisedRepr1(n, tvs, t) | chooseOptimisedRepr1(n, tvs, (UnaryFunction, name) :: t) = createUnaryConstructor(UnboxedForm 0, tvs, name) :: chooseOptimisedRepr1(n, tvs, t) | chooseOptimisedRepr1(n, tvs, (UnaryTupled 0, name) :: t) = createUnaryConstructor(BoxedForm, tvs, name) :: chooseOptimisedRepr1(n, tvs, t) | chooseOptimisedRepr1(n, tvs, (UnaryTupled s, name) :: t) = createUnaryConstructor(UnboxedForm s, tvs, name) :: chooseOptimisedRepr1(n, tvs, t) in chooseOptimisedRepr1(0w0, tvs, l) (* can save the box *) end | _ => let (* We use this version there's more than 1 unary constructor. *) (* With this representation constructors of small tuples make tuples of size n+1 whose first word is the tag. Nullary constructors are represented by single word objects containing the tag. *) val maxTag = Word.fromInt(List.length l) - 0w1 (* Largest no is length - 1 *) fun chooseOptimisedRepr2(_, _, []) = [] | chooseOptimisedRepr2(n, tvs, h :: t) = let val repr = case h of (Nullary, name) => let (* Make an object with the appropriate tag. Doing it here means we only do it once for this object. *) fun genConstForm (n :word) : representations = let val vec : address = alloc (0w1, F_words, toMachineWord n); val () = lock vec; in ConstForm{value=toMachineWord vec, maxTag=maxTag} end in createNullaryConstructor(genConstForm n, tvs, name) end | (UnaryGeneric, name) => createUnaryConstructor(TaggedBox{tag=n, maxTag=maxTag}, tvs, name) | (UnaryFunction, name) => createUnaryConstructor(TaggedBox{tag=n, maxTag=maxTag}, tvs, name) | (UnaryTupled i, name) => createUnaryConstructor( if i <= 4 (*!maxPacking*) then TaggedTuple {tag=n, size=i, maxTag=maxTag} else TaggedBox{tag=n, maxTag=maxTag}, tvs, name) in repr :: chooseOptimisedRepr2(n + 0w1, tvs, t) end; in chooseOptimisedRepr2(0w0, tvs, l) (* can use tagged tuples *) end end; fun makeFun c = mkInlproc(c, List.length tvs, "boxed/size", [], 0) val (boxed, size) = case tvs of [] => (* Monotype *) (TypeValue.boxedEither, TypeValue.singleWord) | _ => (* Polytype *) (makeFun TypeValue.boxedEither, makeFun TypeValue.singleWord) in { constrs = chooseRepr kinds, boxed = boxed, size = size } end; (* RefForm, NilForm and ConsForm are only used for built-in types *) (*****************************************************************************) (* Standard values and exceptions. *) (*****************************************************************************) (* Build a datatype within the basis. *) fun buildBasisDatatype(tcName, tIdPath, arity: int, isEqType: bool, mkValConstrs: typeConstrs -> (values * codetree) list * codetree * codetree) = let (* Create a temporary datatype. The "name" we put in here is usually the same as the type constructor name except for datatypes in the PolyML structure which have the PolyML prefix. *) val description = basisDescription tIdPath val id = makeBoundId(arity, Local{addr = ref ~1, level = ref baseLevel}, 0 (* IdNumber*), isEqType, true, description) val dtype = makeTypeConstructor (tcName, id, [DeclaredAt inBasis]); (* Build the constructors. *) val (valConstrsAndDecs, boxedCode, sizeCode) = mkValConstrs dtype (* The constructors have to be ordered as in genValueConstrs in PARSE_TREE. *) fun leq (Value{name=xname, ...}, _) (Value{name=yname, ...}, _) = xname < yname; val sortedConstrs = quickSort leq valConstrsAndDecs; val initialTypeSet = TypeConstrSet(dtype, (List.map #1 valConstrsAndDecs)) val addrs = ref 0 fun mkAddrs n = ! addrs before (addrs := !addrs+n) fun declConstr(Value{access=Local{addr, level}, ...}, repr) = let val newAddr = mkAddrs 1 in addr := newAddr; level := baseLevel; (mkDec(newAddr, repr), mkLoadLocal newAddr) end | declConstr _ = raise InternalError "declConstr: not local" val (declConstrs, loadConstrs) = ListPair.unzip(List.map declConstr sortedConstrs) val defMap = TypeVarMap.defaultTypeVarMap(mkAddrs, baseLevel) (* Create the datatype. Sets the address of the local in "id". *) val dtCode = createDatatypeFunctions( [{typeConstr=initialTypeSet, eqStatus=isEqType, boxedCode=boxedCode, sizeCode=sizeCode}], mkAddrs, baseLevel, defMap, true) (* Compile and execute the code to build the functions and extract the result. *) val globalCode = genCode( mkEnv( declConstrs @ TypeVarMap.getCachedTypeValues defMap @ dtCode, mkTuple(codeId(id, baseLevel) :: loadConstrs)), [], !addrs)() val newId = makeFreeId(arity, Global(mkInd(0, globalCode)), isEqType, description) (* Get the value constructors out as globals. *) fun mkGlobal((Value{name, typeOf, class, locations, ...}, _), (decs, offset)) = (decs @ [Value{name=name, typeOf=typeOf, class=class, locations=locations, references=NONE, instanceTypes=NONE, access=Global(mkInd(offset, globalCode))}], offset+1) val (gConstrs, _) = List.foldl mkGlobal ([], 1 (* Offset 0 is the type ID *)) sortedConstrs (* Finally copy the datatype to put in the code. *) in fullCopyDatatype(TypeConstrSet(dtype, gConstrs), fn 0 => newId | _ => raise Subscript, "") end (* Nil and :: are used in parsetree for lists constructed using [ ... ] and are also used for initialisation. *) local fun makeConsAndNil listType = let val alpha = mkTypeVar(generalisable, false, false, false) val alphaList = mkTypeConstruction ("list", listType, [alpha], [DeclaredAt inBasis]); val consType = mkFunctionType (mkProductType [alpha, alphaList], alphaList); val nilConstructor = makeValueConstr ("nil", alphaList, true, 2, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]) val consConstructor = makeValueConstr ("::", consType, false, 2, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]) val nilRepresentation = createNullaryConstructor(EnumForm{tag=0w0, maxTag=0w0}, [alpha], "nil") val consRepresentation = createUnaryConstructor(UnboxedForm 2, [alpha], "::") in ([(nilConstructor, nilRepresentation), (consConstructor, consRepresentation)], mkInlproc(TypeValue.boxedEither, 1, "boxed-list", [], 0), mkInlproc(TypeValue.singleWord, 1, "size-list", [], 0)) end in val listConstr = buildBasisDatatype("list", "list", 1, true, makeConsAndNil) val (nilConstructor, consConstructor) = case listConstr of TypeConstrSet(_, [consC as Value{name="::", ...}, nilC as Value{name="nil", ...}]) => (nilC, consC) | _ => raise InternalError "nil and cons in wrong order" end local fun makeNoneAndSome optionType = let val alpha = mkTypeVar(generalisable, false, false, false) val alphaOption = mkTypeConstruction ("option", optionType, [alpha], [DeclaredAt inBasis]); val someType = mkFunctionType (alpha, alphaOption); val noneConstructor = makeValueConstr ("NONE", alphaOption, true, 2, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]); val someConstructor = makeValueConstr ("SOME", someType, false, 2, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]); val noneRepresentation = createNullaryConstructor(EnumForm{tag=0w0, maxTag=0w0}, [alpha], "NONE") and someRepresentation = createUnaryConstructor(BoxedForm, [alpha], "SOME") in ([(noneConstructor, noneRepresentation), (someConstructor, someRepresentation)], mkInlproc(TypeValue.boxedEither, 1, "boxed-option", [], 0), mkInlproc(TypeValue.singleWord, 1, "size-option", [], 0)) end in val optionConstr= buildBasisDatatype("option", "option", 1, true, makeNoneAndSome) val (noneConstructor, someConstructor) = case optionConstr of TypeConstrSet(_, [noneC as Value{name="NONE", ...}, someC as Value{name="SOME", ...}]) => (noneC, someC) | _ => raise InternalError "NONE and SOME in wrong order" end local fun listConstruct (base : types) : types = let val TypeConstrSet(listCons, _) = listConstr in mkTypeConstruction ("list", listCons, [base], [DeclaredAt inBasis]) end; val intTypeConstr = TYPESTRUCT.intType val stringTypeConstr = TYPESTRUCT.stringType val boolTypeConstr = TYPESTRUCT.boolType in local val fields = [ mkLabelEntry("file", stringTypeConstr), mkLabelEntry("startLine", intTypeConstr), mkLabelEntry("startPosition", intTypeConstr), mkLabelEntry("endLine", intTypeConstr), mkLabelEntry("endPosition", intTypeConstr) ] in val locationCons = makeTypeConstructor("location", makeTypeFunction(basisDescription "PolyML.location", ([], mkLabelled(sortLabels fields, true))), [DeclaredAt inBasis]) val locationConstr = TypeConstrSet(locationCons, []) end local (* Pretty print context information. *) fun makeConstructors typeconstr = let val contextType = mkTypeConstruction ("context", typeconstr, [], [DeclaredAt inBasis]) val locationType = mkTypeConstruction ("location", locationCons, [], [DeclaredAt inBasis]) val constrs = [ ("ContextLocation", locationType), ("ContextProperty", mkProductType[stringTypeConstr, stringTypeConstr])]; (* The representation of this datatype is given in Pretty.sml and must be the same as the representation that chooseConstrRepr will use. *) val numConstrs = List.length constrs fun makeCons(s,t) = makeValueConstr(s, mkFunctionType(t, contextType), false, numConstrs, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]) val {constrs=constrCode, boxed, size} = chooseConstrRepr(constrs, []) in (ListPair.zipEq(List.map makeCons constrs, constrCode), boxed, size) end in val contextConstr = buildBasisDatatype("context", "PolyML.context", 0, false, makeConstructors) end local fun makeConstructors typeconstr = let val TypeConstrSet(contextCons, _) = contextConstr val prettyType = mkTypeConstruction ("pretty", typeconstr, [], [DeclaredAt inBasis]) val contextType = mkTypeConstruction ("context", contextCons, [], [DeclaredAt inBasis]) val constrs = [ ("PrettyBlock", mkProductType[intTypeConstr, boolTypeConstr, listConstruct contextType, listConstruct prettyType]), ("PrettyBreak", mkProductType[intTypeConstr, intTypeConstr]), ("PrettyLineBreak", EmptyType), ("PrettyString", stringTypeConstr), ("PrettyStringWithWidth", mkProductType[stringTypeConstr, intTypeConstr])]; (* The representation of this datatype is given in Pretty.sml and must be the same as the representation that chooseConstrRepr will use. *) val numConstrs = List.length constrs fun makeCons(s,t) = let val (ctype, nullary) = case t of EmptyType => (prettyType, true) | t => (mkFunctionType(t, prettyType), false) in makeValueConstr(s, ctype, nullary, numConstrs, Local{addr=ref ~1, level=ref baseLevel}, [DeclaredAt inBasis]) end val {constrs=constrCode, ...} = chooseConstrRepr(constrs, []) in (ListPair.zipEq(List.map makeCons constrs, constrCode), TypeValue.boxedEither, TypeValue.singleWord) end in val prettyConstr = buildBasisDatatype("pretty", "PolyML.pretty", 0, false, makeConstructors) end end (* The representation of ptProperties is given in ExportTree.sml and must also match. *) (* Construct an exception identifier - This is a ref (so we can uniquely identify it) containing a print function for the type. *) local (* The exception identifier contains a value of type (exn*int->pretty) option. *) val TypeConstrSet(optionCons, _) = optionConstr and TypeConstrSet(prettyCons, _) = prettyConstr val exnPrinter = mkTypeConstruction ("option", optionCons, [ mkFunctionType( mkProductType[TYPESTRUCT.exnType, TYPESTRUCT.intType], mkTypeConstruction ("pretty", prettyCons, [], [DeclaredAt inBasis]) ) ], [DeclaredAt inBasis]) in fun mkExIden(ty, level, tvMap) = let (* Get the constructor tuple, select the constructor operation, apply it to the type. *) val makeSome = applyToInstance( [{value=exnPrinter, equality=false, printity=false}], level, tvMap, fn _ => mkInd(1, case someConstructor of Value { access, ...} => vaGlobal access)) val makeNone = applyToInstance( [{value=exnPrinter, equality=false, printity=false}], level, tvMap, fn _ => mkInd(1, case noneConstructor of Value { access, ...} => vaGlobal access)) val printerCode = case ty of FunctionType { arg, ...} => mkEval(makeSome, [printerForType(arg, level, tvMap)]) | _ => makeNone in refApplyCode printerCode end end (* Types that can be shared. *) structure Sharing = struct type codetree = codetree type types = types type values = values type typeConstrSet = typeConstrSet type typeId = typeId type typeVarForm = typeVarForm type typeVarMap = typeVarMap type level = level end end; polyml-5.6/mlsource/MLCompiler/DEBUGGERSIG.sml000066400000000000000000000122451265146633400210160ustar00rootroot00000000000000(* Title: Source level debugger for Poly/ML Author: David Matthews Copyright (c) David Matthews 2000, 2009, 2014-15 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature DEBUGGERSIG = sig type types type values type machineWord type fixStatus type structVals type typeConstrSet type signatures type functors type locationProp type typeId type level type lexan type codeBinding type codetree type typeVarMap type environEntry type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val envTypeId: typeId -> environEntry type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list } type breakPoint = bool ref (* Functions to make debug entries for various values, types etc. *) type debuggerStatus val initialDebuggerStatus: debuggerStatus val makeValDebugEntries: values list * debuggerStatus * level * lexan * (int -> int) * typeVarMap -> codeBinding list * debuggerStatus val makeTypeConstrDebugEntries: typeConstrSet list * debuggerStatus * level * lexan * (int -> int) -> codeBinding list * debuggerStatus val makeStructDebugEntries: structVals list * debuggerStatus * level * lexan * (int->int) -> codeBinding list * debuggerStatus val makeTypeIdDebugEntries: typeId list * debuggerStatus * level * lexan * (int->int) -> codeBinding list * debuggerStatus val updateDebugLocation: debuggerStatus * location * lexan -> codeBinding list * debuggerStatus (* Create a local break point and check the global and local break points. *) val breakPointCode: breakPoint option ref * location * level * lexan * (int->int) -> codeBinding list (* Add debugging calls on entry and exit to a function. *) val wrapFunctionInDebug: (debuggerStatus -> codetree) * string * codetree * types * types * location * debuggerStatus * level * lexan * (int -> int) -> codetree (* Exported functions that appear in PolyML.DebuggerInterface. *) type debugState (* The run-time state. *) val makeValue: debugState -> string * types * locationProp list * machineWord -> values and makeException: debugState -> string * types * locationProp list * machineWord -> values and makeConstructor: debugState -> string * types * bool * int * locationProp list * machineWord -> values and makeAnonymousValue: debugState -> types * machineWord -> values val makeStructure: debugState -> string * signatures * locationProp list * machineWord -> structVals and makeTypeConstr: debugState -> typeConstrSet -> typeConstrSet val setOnEntry: (string * PolyML.location -> unit) option -> unit and setOnExit: (string * PolyML.location -> unit) option -> unit and setOnExitException: (string * PolyML.location -> exn -> unit) option -> unit and setOnBreakPoint: (PolyML.location * bool ref -> unit) option -> unit structure Sharing: sig type types = types type values = values type machineWord = machineWord type fixStatus = fixStatus type structVals = structVals type typeConstrSet = typeConstrSet type signatures = signatures type functors = functors type locationProp = locationProp type environEntry = environEntry type typeId = typeId type level = level type lexan = lexan type codeBinding = codeBinding type codetree = codetree type typeVarMap = typeVarMap type debuggerStatus = debuggerStatus end end; polyml-5.6/mlsource/MLCompiler/DEBUGGER_.sml000066400000000000000000000673541265146633400206250ustar00rootroot00000000000000(* Title: Source level debugger for Poly/ML Author: David Matthews Copyright (c) David Matthews 2000, 2014, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor DEBUGGER_ ( structure STRUCTVALS : STRUCTVALSIG structure VALUEOPS : VALUEOPSSIG structure CODETREE : CODETREESIG structure TYPETREE: TYPETREESIG structure ADDRESS : AddressSig structure COPIER: COPIERSIG structure TYPEIDCODE: TYPEIDCODESIG structure LEX : LEXSIG structure DEBUG: DEBUGSIG structure UTILITIES : sig val splitString: string -> { first:string,second:string } end sharing STRUCTVALS.Sharing = VALUEOPS.Sharing = TYPETREE.Sharing = COPIER.Sharing = TYPEIDCODE.Sharing = CODETREE.Sharing = ADDRESS = LEX.Sharing ) : DEBUGGERSIG = struct open STRUCTVALS VALUEOPS CODETREE COPIER TYPETREE DEBUG (* The static environment contains these kinds of entries. *) datatype environEntry = EnvValue of string * types * locationProp list | EnvException of string * types * locationProp list | EnvVConstr of string * types * bool * int * locationProp list | EnvTypeid of { original: typeId, freeId: typeId } | EnvStructure of string * signatures * locationProp list | EnvTConstr of string * typeConstrSet | EnvStartFunction of string * location * types | EnvEndFunction of string * location * types local open ADDRESS RuntimeCalls in (* Entries in the thread data. The RTS allocates enough space for this. The first entry is 5 because earlier entries are used by Thread.Thread. *) val threadIdStack = mkConst(toMachineWord 0w5) (* The static/dynamic/location entries for calling fns *) and threadIdCurrentStatic = mkConst(toMachineWord 0w6) (* The static info for bindings i.e. name/type. *) and threadIdCurrentDynamic = mkConst(toMachineWord 0w7) (* Dynamic infor for bindings i.e. actual run-time value. *) and threadIdCurrentLocation = mkConst(toMachineWord 0w8) (* Location in code: line number/offset etc. *) (* Global function entries. These could be in storage allocated by the RTS. *) (* Specialised option type here. Because a function is always boxed this avoids the need for an extra level of indirection. *) datatype ('a, 'b) functionOpt = NoFunction | AFunction of 'a -> 'b val globalOnEntry = ref NoFunction and globalOnExit = ref NoFunction and globalOnExitExc = ref NoFunction and globalOnBreakPoint = ref NoFunction val onEntryCode = mkEval(rtsFunction POLY_SYS_load_word, [mkConst(toMachineWord globalOnEntry), CodeZero]) and onExitCode = mkEval(rtsFunction POLY_SYS_load_word, [mkConst(toMachineWord globalOnExit), CodeZero]) and onExitExcCode = mkEval(rtsFunction POLY_SYS_load_word, [mkConst(toMachineWord globalOnExitExc), CodeZero]) and onBreakPointCode = mkEval(rtsFunction POLY_SYS_load_word, [mkConst(toMachineWord globalOnBreakPoint), CodeZero]) (* We need to ensure that any break-point code preserves the state. It could be modified if we hit a break-point and run the interactive debugger with PolyML.Compiler.debug true. *) fun wrap (f:'a -> unit) (x: 'a) : unit = let val threadId: address = RunCall.run_call0 POLY_SYS_thread_self () val stack = loadWord(threadId, 0w5) and static = loadWord(threadId, 0w6) and dynamic = loadWord(threadId, 0w7) and location = loadWord(threadId, 0w8) fun restore () = ( assignWord(threadId, 0w5, stack); assignWord(threadId, 0w6, static); assignWord(threadId, 0w7, dynamic); assignWord(threadId, 0w8, location) ) in f x handle exn => (restore(); PolyML.Exception.reraise exn); restore() end fun setOnEntry NONE = globalOnEntry := NoFunction | setOnEntry (SOME(f: string * PolyML.location -> unit)) = globalOnEntry := AFunction (wrap f) and setOnExit NONE = globalOnExit := NoFunction | setOnExit (SOME(f: string * PolyML.location -> unit)) = globalOnExit := AFunction (wrap f) and setOnExitException NONE = globalOnExitExc := NoFunction | setOnExitException (SOME(f: string * PolyML.location -> exn -> unit)) = globalOnExitExc := AFunction (fn x => wrap (f x)) and setOnBreakPoint NONE = globalOnBreakPoint := NoFunction | setOnBreakPoint (SOME(f: PolyML.location * bool ref -> unit)) = globalOnBreakPoint := AFunction (wrap f) end (* When stopped at a break-point any Bound ids must be replaced by Free ids. We make new Free ids at this point. *) fun envTypeId (id as TypeId{ description, idKind = Bound{arity, ...}, ...}) = EnvTypeid { original = id, freeId = makeFreeId(arity, Global CodeZero, isEquality id, description) } | envTypeId id = EnvTypeid { original = id, freeId = id } fun searchEnvs match (staticEntry :: statics, dlist as dynamicEntry :: dynamics) = ( case (match (staticEntry, dynamicEntry), staticEntry) of (SOME result, _) => SOME result | (NONE, EnvTypeid _) => searchEnvs match (statics, dynamics) | (NONE, EnvVConstr _) => searchEnvs match (statics, dynamics) | (NONE, EnvValue _) => searchEnvs match (statics, dynamics) | (NONE, EnvException _) => searchEnvs match (statics, dynamics) | (NONE, EnvStructure _) => searchEnvs match (statics, dynamics) | (NONE, EnvStartFunction _) => searchEnvs match (statics, dynamics) | (NONE, EnvEndFunction _) => searchEnvs match (statics, dynamics) (* EnvTConstr doesn't have an entry in the dynamic list *) | (NONE, EnvTConstr _) => searchEnvs match (statics, dlist) ) | searchEnvs _ _ = NONE (* N.B. It is possible to have ([EnvTConstr ...], []) in the arguments so we can't treat that if either the static or dynamic list is nil and the other non-nil as an error. *) (* Exported functions that appear in PolyML.DebuggerInterface. *) type debugState = environEntry list * machineWord list * location fun searchType ((clist, rlist, _): debugState) typeid = let fun match (EnvTypeid{original, freeId }, valu) = if sameTypeId(original, typeid) then case freeId of TypeId{description, idKind as Free _, ...} => (* This can occur for datatypes inside functions. *) SOME(TypeId { access= Global(mkConst valu), idKind=idKind, description=description}) | _ => raise Misc.InternalError "searchType: TypeFunction" else NONE | match _ = NONE in case (searchEnvs match (clist, rlist), typeid) of (SOME t, _) => t | (NONE, TypeId{description, idKind = TypeFn typeFn, ...}) => makeTypeFunction(description, typeFn) | (NONE, typeid as TypeId{description, idKind = Bound{arity, ...}, ...}) => (* The type ID is missing. Make a new temporary ID. *) makeFreeId(arity, Global(TYPEIDCODE.codeForUniqueId()), isEquality typeid, description) | (NONE, typeid as TypeId{description, idKind = Free{arity, ...}, ...}) => (* The type ID is missing. Make a new temporary ID. *) makeFreeId(arity, Global(TYPEIDCODE.codeForUniqueId()), isEquality typeid, description) end (* Values must be copied so that compile-time type IDs are replaced by their run-time values. *) fun makeTypeConstr (state: debugState) (TypeConstrSet(tcons, (*tcConstructors*) _)) = let val typeID = searchType state (tcIdentifier tcons) val newTypeCons = makeTypeConstructor(tcName tcons, typeID, tcLocations tcons) val newValConstrs = (*map copyAConstructor tcConstructors*) [] in TypeConstrSet(newTypeCons, newValConstrs) end (* When creating a structure we have to add a type map that will look up the bound Ids. *) fun makeStructure state (name, rSig, locations, valu) = let local val Signatures{ name = sigName, tab, typeIdMap, firstBoundIndex, locations=sigLocs, ... } = rSig fun getFreeId n = searchType state (makeBoundId(0 (* ??? *), Global CodeZero, n, false, false, basisDescription "")) in val newSig = makeSignature(sigName, tab, firstBoundIndex, sigLocs, composeMaps(typeIdMap, getFreeId), []) end in makeGlobalStruct (name, newSig, mkConst valu, locations) end local fun runTimeType (state: debugState) ty = let fun copyId(TypeId{idKind=Free _, access=Global _ , ...}) = NONE (* Use original *) | copyId id = SOME(searchType state id) in copyType (ty, fn x => x, fn tcon => copyTypeConstr (tcon, copyId, fn x => x, fn s => s)) end in fun makeValue state (name, ty, location, valu) = mkGvar(name, runTimeType state ty, mkConst valu, location) and makeException state (name, ty, location, valu) = mkGex(name, runTimeType state ty, mkConst valu, location) and makeConstructor state (name, ty, nullary, count, location, valu) = makeValueConstr(name, runTimeType state ty, nullary, count, Global(mkConst valu), location) and makeAnonymousValue state (ty, valu) = makeValue state ("", ty, [], valu) end (* Functions to make the debug entries. These are needed both in CODEGEN_PARSETREE for the core language and STRUCTURES for the module language. *) (* Debugger status within the compiler. During compilation the environment is built up as a pair consisting of the static data and code to compute the run-time data. The static data, a constant at run-time, holds the variable names and types. The run-time code, when executed at run-time, returns the address of a list holding the actual values of the variables. "dynEnv" is always a "load" from a (codetree) variable. It has type level->codetree rather than codetree because the next reference could be inside an inner function. "lastLoc" is the last location that was *) type debuggerStatus = {staticEnv: environEntry list, dynEnv: level->codetree, lastLoc: location} val initialDebuggerStatus: debuggerStatus = {staticEnv = [], dynEnv = fn _ => CodeZero, lastLoc = LEX.nullLocation } (* Set the current state in the thread data. *) fun updateState (level, mkAddr) (decs, debugEnv: debuggerStatus as {staticEnv, dynEnv, ...}) = let open ADDRESS RuntimeCalls val threadId = multipleUses(mkEval(rtsFunction POLY_SYS_thread_self, []), fn () => mkAddr 1, level) fun assignItem(offset, value) = mkNullDec(mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, offset, value])) val newDecs = decs @ #dec threadId @ [assignItem(threadIdCurrentStatic, mkConst(toMachineWord staticEnv)), assignItem(threadIdCurrentDynamic, dynEnv level)] in (newDecs, debugEnv) end fun makeValDebugEntries (vars: values list, debugEnv: debuggerStatus, level, lex, mkAddr, typeVarMap) = if getParameter debugTag (LEX.debugParams lex) then let fun loadVar (var, (decs, {staticEnv, dynEnv, lastLoc, ...})) = let val loadVal = codeVal (var, level, typeVarMap, [], lex, LEX.nullLocation) val newEnv = (* Create a new entry in the environment. *) mkDatatype [ loadVal (* Value. *), dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) val ctEntry = case var of Value{class=Exception, name, typeOf, locations, ...} => EnvException(name, typeOf, locations) | Value{class=Constructor{nullary, ofConstrs, ...}, name, typeOf, locations, ...} => EnvVConstr(name, typeOf, nullary, ofConstrs, locations) | Value{name, typeOf, locations, ...} => EnvValue(name, typeOf, locations) in (decs @ dec, {staticEnv = ctEntry :: staticEnv, dynEnv = load, lastLoc = lastLoc}) end in updateState (level, mkAddr) (List.foldl loadVar ([], debugEnv) vars) end else ([], debugEnv) fun makeTypeConstrDebugEntries(typeCons, debugEnv, level, lex, mkAddr) = if not (getParameter debugTag (LEX.debugParams lex)) then ([], debugEnv) else let fun foldIds(tc :: tcs, {staticEnv, dynEnv, lastLoc, ...}) = let val cons = tsConstr tc val id = tcIdentifier cons val {second = typeName, ...} = UTILITIES.splitString(tcName cons) in if tcIsAbbreviation (tsConstr tc) then foldIds(tcs, {staticEnv=EnvTConstr(typeName, tc) :: staticEnv, dynEnv=dynEnv, lastLoc = lastLoc}) else let (* This code will build a cons cell containing the run-time value associated with the type Id as the hd and the rest of the run-time environment as the tl. *) val loadTypeId = TYPEIDCODE.codeId(id, level) val newEnv = mkDatatype [ loadTypeId, dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) (* Make an entry for the type constructor itself as well as the new type id. The type Id is used both for the type constructor and also for any values of the type. *) val (decs, newEnv) = foldIds(tcs, {staticEnv=EnvTConstr(typeName, tc) :: envTypeId id :: staticEnv, dynEnv=load, lastLoc = lastLoc}) in (dec @ decs, newEnv) end end | foldIds([], debugEnv) = ([], debugEnv) in updateState (level, mkAddr) (foldIds(typeCons, debugEnv)) end fun makeStructDebugEntries (strs: structVals list, debugEnv, level, lex, mkAddr) = if getParameter debugTag (LEX.debugParams lex) then let fun loadStruct (str as Struct { name, signat, locations, ...}, (decs, {staticEnv, dynEnv, lastLoc, ...})) = let val loadStruct = codeStruct (str, level) val newEnv = mkDatatype [ loadStruct (* Structure. *), dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) val ctEntry = EnvStructure(name, signat, locations) in (decs @ dec, {staticEnv=ctEntry :: staticEnv, dynEnv=load, lastLoc = lastLoc}) end in updateState (level, mkAddr) (List.foldl loadStruct ([], debugEnv) strs) end else ([], debugEnv) (* Create debug entries for typeIDs. The idea is that if we stop in the debugger we can access the type ID, particularly for printing values of the type. "envTypeId" creates a free id for each bound id but the print and equality functions are extracted when we are stopped in the debugger. *) fun makeTypeIdDebugEntries(typeIds, debugEnv, level, lex, mkAddr) = if not (getParameter debugTag (LEX.debugParams lex)) then ([], debugEnv) else let fun foldIds(id :: ids, {staticEnv, dynEnv, lastLoc, ...}) = let (* This code will build a cons cell containing the run-time value associated with the type Id as the hd and the rest of the run-time environment as the tl. *) val loadTypeId = case id of TypeId { access = Formal addr, ... } => (* If we are processing functor arguments we will have a Formal here. *) mkInd(addr, mkLoadArgument 0) | _ => TYPEIDCODE.codeId(id, level) val newEnv = mkDatatype [ loadTypeId, dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) val (decs, newEnv) = foldIds(ids, {staticEnv=envTypeId id :: staticEnv, dynEnv=load, lastLoc = lastLoc}) in (dec @ decs, newEnv) end | foldIds([], debugEnv) = ([], debugEnv) in updateState (level, mkAddr) (foldIds(typeIds, debugEnv)) end (* Update the location info in the thread data if we want debugging info. If the location has not changed don't do anything. Whether it has changed could depend on whether we're only counting line numbers or whether we have more precise location info with the IDE. *) fun updateDebugLocation(debuggerStatus as {staticEnv, dynEnv, lastLoc, ...}, location, lex) = if not (getParameter debugTag (LEX.debugParams lex)) orelse lastLoc = location then ([], debuggerStatus) else let open ADDRESS RuntimeCalls val setLocation = mkEval(rtsFunction POLY_SYS_assign_word, [mkEval(rtsFunction POLY_SYS_thread_self, []), threadIdCurrentLocation, mkConst(toMachineWord location)]) in ([mkNullDec setLocation], {staticEnv=staticEnv, dynEnv=dynEnv, lastLoc=location}) end (* Add debugging calls on entry and exit to a function. *) fun wrapFunctionInDebug(codeBody: debuggerStatus -> codetree, name: string, argCode, argType, resType: types, location, entryEnv: debuggerStatus, level, lex, mkAddr) = if not (getParameter debugTag (LEX.debugParams lex)) then codeBody entryEnv (* Code-generate the body without any wrapping. *) else let open ADDRESS RuntimeCalls val functionName = name (* TODO: munge this to get the root. *) fun addStartExitEntry({staticEnv, dynEnv, lastLoc, ...}, code, ty, startExit) = let val newEnv = mkDatatype [ code, dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) val ctEntry = startExit(functionName, location, ty) in (dec, {staticEnv=ctEntry :: staticEnv, dynEnv=load, lastLoc = lastLoc}) end (* All the "on" functions take this as an argument. *) val onArgs = [mkConst(toMachineWord(functionName, location))] val threadId = multipleUses(mkEval(rtsFunction POLY_SYS_thread_self, []), fn () => mkAddr 1, level) fun loadIdEntry offset = multipleUses(mkEval(rtsFunction POLY_SYS_load_word, [#load threadId level, offset]), fn () => mkAddr 1, level) val currStatic = loadIdEntry threadIdCurrentStatic and currDynamic = loadIdEntry threadIdCurrentDynamic and currLocation = loadIdEntry threadIdCurrentLocation and currStack = loadIdEntry threadIdStack (* At the start of the function: 1. Push the previous state to the stack. 2. Create a debugging entry for the arguments 3. Update the state to the state on entry, including the args 4. Call the global onEntry function if it's set 5. Call the local onEntry function if it's set *) (* Save the previous state. *) val assignStack = mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, threadIdStack, mkDatatype[ #load currStatic level, #load currDynamic level, #load currLocation level, #load currStack level]]) val prefixCode = #dec threadId @ #dec currStatic @ #dec currDynamic @ #dec currLocation @ #dec currStack @ [mkNullDec assignStack] (* Make a debugging entry for the arguments. This needs to be set before we call onEntry so we can produce tracing info. It also needs to be passed to the body of the function so that it is included in the debug status of the rest of the body. *) local val {staticEnv, dynEnv, lastLoc, ...} = entryEnv val newEnv = mkDatatype [ argCode, dynEnv level ] val { dec, load } = multipleUses (newEnv, fn () => mkAddr 1, level) val ctEntry = EnvStartFunction(functionName, location, argType) in val debuggerDecs = dec val bodyDebugEnv = {staticEnv = ctEntry :: staticEnv, dynEnv = load, lastLoc = lastLoc} end local val {staticEnv, dynEnv, ...} = bodyDebugEnv val assignStatic = mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, threadIdCurrentStatic, mkConst(toMachineWord staticEnv)]) val assignDynamic = mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, threadIdCurrentDynamic, dynEnv level]) val assignLocation = mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, threadIdCurrentLocation, mkConst(toMachineWord location)]) val onEntryFn = multipleUses(onEntryCode, fn () => mkAddr 1, level) val optCallOnEntry = mkIf(mkTagTest(#load onEntryFn level, 0w0, 0w0), CodeZero, mkEval(#load onEntryFn level, onArgs)) in val entryCode = debuggerDecs @ [mkNullDec assignStatic, mkNullDec assignDynamic, mkNullDec assignLocation] @ #dec onEntryFn @ [mkNullDec optCallOnEntry] end (* Restore the state. Used both if the function returns normally or if it raises an exception. We use the old state rather than popping the stack because that is more reliable if we have an asynchronous exception. *) local (* Set the entry in the thread vector to an entry from the top-of-stack. *) fun restoreEntry(offset, value) = mkNullDec( mkEval(rtsFunction POLY_SYS_assign_word, [#load threadId level, offset, value])) in val restoreState = [restoreEntry(threadIdCurrentStatic, #load currStatic level), restoreEntry(threadIdCurrentDynamic, #load currDynamic level), restoreEntry(threadIdCurrentLocation, #load currLocation level), restoreEntry(threadIdStack, #load currStack level)] end local (* If an exception is raised we need to call the onExitException entry, restore the state and reraise the exception. *) (* There are potential race conditions here if we have asynchronous exceptions. *) val savedExn = multipleUses(Ldexc, fn () => mkAddr 1, level) val onExitExcFn = multipleUses(onExitExcCode, fn () => mkAddr 1, level) (* OnExitException has an extra curried argument - the exception packet. *) val optCallOnExitExc = mkIf(mkTagTest(#load onExitExcFn level, 0w0, 0w0), CodeZero, mkEval(mkEval(#load onExitExcFn level, onArgs), [#load savedExn level])) in val exceptionCase = mkEnv(#dec savedExn @ #dec onExitExcFn @ [mkNullDec optCallOnExitExc] @ restoreState, mkRaise(#load savedExn level)) end (* Code for the body and the exception. *) val bodyCode = multipleUses(mkHandle(codeBody bodyDebugEnv, exceptionCase), fn () => mkAddr 1, level) (* Code for normal exit. *) local val endFn = addStartExitEntry(entryEnv, #load bodyCode level, resType, EnvEndFunction) val (rtEnvDec, _) = updateState (level, mkAddr) endFn val onExitFn = multipleUses(onExitCode, fn () => mkAddr 1, level) val optCallOnExit = mkIf(mkTagTest(#load onExitFn level, 0w0, 0w0), CodeZero, mkEval(#load onExitFn level, onArgs)) in val exitCode = rtEnvDec @ #dec onExitFn @ [mkNullDec optCallOnExit] end in mkEnv(prefixCode @ entryCode @ #dec bodyCode @ exitCode @ restoreState, #load bodyCode level) end type breakPoint = bool ref (* Create a local break point and check the global and local break points. *) fun breakPointCode(breakPoint, location, level, lex, mkAddr) = if not (getParameter debugTag (LEX.debugParams lex)) then [] else let open ADDRESS RuntimeCalls (* Create a new local breakpoint and assign it to the ref. It is possible for the ref to be already assigned a local breakpoint value if we are compiling a match. In that case the same expression may be code-generated more than once but we only want one local break-point. *) val localBreakPoint = case breakPoint of ref (SOME bpt) => bpt | r as ref NONE => let val b = ref false in r := SOME b; b end; (* Call the breakpoint function if it's defined. *) val globalBpt = multipleUses(onBreakPointCode, fn () => mkAddr 1, level) val testCode = mkIf( mkNot(mkTagTest(#load globalBpt level, 0w0, 0w0)), mkEval(#load globalBpt level, [mkTuple[mkConst(toMachineWord location), mkConst(toMachineWord localBreakPoint)]]), CodeZero ) in #dec globalBpt @ [mkNullDec testCode] end structure Sharing = struct type types = types type values = values type machineWord = machineWord type fixStatus = fixStatus type structVals = structVals type typeConstrSet = typeConstrSet type signatures = signatures type functors = functors type locationProp = locationProp type environEntry = environEntry type typeId = typeId type level = level type lexan = lexan type codeBinding = codeBinding type codetree = codetree type typeVarMap = typeVarMap type debuggerStatus = debuggerStatus end end; polyml-5.6/mlsource/MLCompiler/DEBUGSIG.ML000066400000000000000000000042671265146633400202020ustar00rootroot00000000000000(* Copyright (c) 2013-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Signature for debugging flags *) signature DEBUGSIG = sig val assemblyCodeTag : bool Universal.tag val bindingCounterTag : (unit -> int) Universal.tag val codetreeAfterOptTag : bool Universal.tag val codetreeTag : bool Universal.tag val createPrintFunctionsTag : bool Universal.tag val debugTag : bool Universal.tag val defaults : Universal.universal list val errorDepthTag : int Universal.tag val fileNameTag : string Universal.tag val getParameter : 'a Universal.tag -> Universal.universal list -> 'a val inlineFunctorsTag : bool Universal.tag val lineLengthTag : int Universal.tag val lineNumberTag : (unit -> int) Universal.tag val lowlevelOptimiseTag : bool Universal.tag val maxInlineSizeTag : int Universal.tag val narrowOverloadFlexRecordTag : bool Universal.tag val offsetTag : (unit -> int) Universal.tag val parsetreeTag : bool Universal.tag val printDepthFunTag : (unit -> int) Universal.tag val profileAllocationTag : int Universal.tag val pstackTraceTag : bool Universal.tag val reportExhaustiveHandlersTag : bool Universal.tag val reportUnreferencedIdsTag : bool Universal.tag val traceCompilerTag : bool Universal.tag val reportDiscardedValuesTag: int Universal.tag val reportDiscardNone: int (* No reports *) and reportDiscardFunction: int (* Only report discarded functions *) and reportDiscardNonUnit: int (* Report discarding any non unit values *) end; polyml-5.6/mlsource/MLCompiler/DatatypeRep.ML000066400000000000000000000021311265146633400212170ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure DatatypeRep = DATATYPE_REP ( structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure TYPESTRUCT = TypeTree structure ADDRESS = Address structure MISC = Misc structure COPIER = CopierStruct structure TYPEIDCODE = TypeIDCodeStruct ) ; polyml-5.6/mlsource/MLCompiler/Debug.ML000066400000000000000000000140161265146633400200300ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008, 2013, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation;. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Debug: DEBUGSIG = struct local open Universal in (* Get the current line number. *) val lineNumberTag: (unit->int) tag = tag() (* Get the current offset (position on line or in file). *) val offsetTag: (unit->int) tag = tag() (* File name. *) val fileNameTag: string tag = tag() (* Binding counter *) val bindingCounterTag: (unit->int) tag = tag() (* How much to print in error messages? default 6 *) val errorDepthTag: int tag = tag() (* Control print depth in PolyML.print. *) val printDepthFunTag: (unit->int) tag = tag() (* Length of line in PolyML.print. error messages etc. *) val lineLengthTag: int tag = tag() (* Compile in debugging code? default false *) val debugTag: bool tag = tag() (* Compilation fine tuning. *) (* Should functors be made inline? default true. *) val inlineFunctorsTag: bool tag = tag() (* Control how big functions should be before they're not inlined. *) val maxInlineSizeTag: int tag = tag() (* Add profile information to each allocation? default zero. At the moment this is effectively a bool but having an int allows for the possibility of recording different information. *) val profileAllocationTag: int tag = tag() (* Compiler debugging. *) (* Trace exceptions generated within the compiler? default false. *) val traceCompilerTag: bool tag = tag() (* Print parsetree after parsing? default false *) val parsetreeTag: bool tag = tag() (* Print codetree after compiling? default false *) val codetreeTag: bool tag = tag() (* Print the optimised code after compiling? default false *) val codetreeAfterOptTag: bool tag = tag() (* Print pseudo-stack in code-generator? default false *) val pstackTraceTag: bool tag = tag() (* Switch on/off low-level optimisation. *) val lowlevelOptimiseTag: bool tag = tag() (* Print assembly code in code-generator? default false *) val assemblyCodeTag: bool tag = tag() (* Report unreferenced identifiers as warnings *) val reportUnreferencedIdsTag: bool tag = tag() (* Report catch-all handlers as warnings *) val reportExhaustiveHandlersTag: bool tag = tag() (* Use a narrow context to resolve overloading and flexible records. *) val narrowOverloadFlexRecordTag: bool tag = tag() (* Create print functions for datatypes based on the constructors. *) val createPrintFunctionsTag: bool tag = tag() (* Warning level for discarding values *) val reportDiscardedValuesTag: int tag = tag() val reportDiscardNone = 0 (* No reports *) and reportDiscardFunction = 1 (* Only report discarded functions *) and reportDiscardNonUnit = 2 (* Report discarding any non unit values *) (* To avoid circularity of dependencies a few tags are defined elsewhere: *) (* ValueOps.printSpaceTag: ValueOps.nameSpace tag Pretty.printOutputTag: (pretty->unit) tag Pretty.compilerOutputTag: (pretty->unit) tag Lex.errorMessageProcTag: (pretty * bool * int -> unit) tag ExportTreeString.rootTreeTag: (unit -> exportTree) tag *) val defaults = [ tagInject lineNumberTag (fn () => 0), (* Zero line number *) tagInject offsetTag (fn () => 0), (* Zero offset *) tagInject fileNameTag "", tagInject bindingCounterTag (fn () => 0), (* Zero counter *) tagInject inlineFunctorsTag true, tagInject maxInlineSizeTag 80, tagInject profileAllocationTag 0, tagInject parsetreeTag false, tagInject codetreeTag false, tagInject pstackTraceTag false, tagInject lowlevelOptimiseTag true, tagInject assemblyCodeTag false, tagInject codetreeAfterOptTag false, tagInject errorDepthTag 6, tagInject printDepthFunTag (fn () => 0), tagInject lineLengthTag 77, tagInject traceCompilerTag false, tagInject debugTag false, tagInject reportUnreferencedIdsTag false, tagInject reportExhaustiveHandlersTag false, tagInject narrowOverloadFlexRecordTag false, tagInject createPrintFunctionsTag true, tagInject reportDiscardedValuesTag reportDiscardFunction ] fun getParameter (t:'a tag) (tagList: universal list) :'a = case List.find (tagIs t) tagList of SOME a => tagProject t a | NONE => (* Use the default *) ( case List.find (tagIs t) defaults of SOME a => tagProject t a | NONE => raise Misc.InternalError "tag missing" ) end end; polyml-5.6/mlsource/MLCompiler/Debugger.sml000066400000000000000000000024321265146633400210100ustar00rootroot00000000000000(* Title: Source level debugger for Poly/ML Author: David Matthews Copyright (c) David Matthews 2000 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Debugger = DEBUGGER_( structure STRUCTVALS = StructVals structure CODETREE = CodeTree structure VALUEOPS = ValueOps structure TYPETREE = TypeTree structure ADDRESS = Address structure COPIER = CopierStruct structure TYPEIDCODE = TypeIDCodeStruct structure LEX = Lex structure UTILITIES = Utilities structure DEBUG = Debug ); polyml-5.6/mlsource/MLCompiler/EXPORTTREESIG.sml000066400000000000000000000057241265146633400213370ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature EXPORTTREESIG = sig type pretty type types type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type locationProp (* Export tree. *) type ptProperties type exportTree = location * ptProperties list val PTprint: (int -> pretty) -> ptProperties (* Print the tree *) val PTtype: types -> ptProperties (* Type of an expression *) val PTdeclaredAt: location -> ptProperties (* Declaration location for id. *) val PTopenedAt: location -> ptProperties (* When an identifier comes from an "open" the location of the open. *) val PTstructureAt: location -> ptProperties (* When an identifier comes from open S or S.a the declaration of S. *) val PTreferences: (bool * location list) -> ptProperties (* The references to the ID. The first is true if this is exported. *) val PTparent: (unit -> exportTree) -> ptProperties val PTpreviousSibling: (unit -> exportTree) -> ptProperties val PTnextSibling: (unit -> exportTree) -> ptProperties val PTfirstChild: (unit -> exportTree) -> ptProperties val PTcompletions: string list -> ptProperties val PTbreakPoint: bool ref -> ptProperties (* Breakpoint associated with location. *) val PTdefId: int -> ptProperties (* Defining binding id *) val PTrefId: int -> ptProperties (* Reference binding id *) type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} val exportList : (navigation * 'a -> exportTree) * (unit -> exportTree) option -> 'a list -> ptProperties list val exportNavigationProps: navigation -> ptProperties list val getStringAsTree: navigation * string * location * ptProperties list -> exportTree val rootTreeTag: navigation Universal.tag val mapLocationProps: locationProp list -> ptProperties list (* Types that can be shared. *) structure Sharing: sig type types = types and locationProp = locationProp and pretty = pretty and ptProperties = ptProperties end end; polyml-5.6/mlsource/MLCompiler/ExportTree.sml000066400000000000000000000120451265146633400213660ustar00rootroot00000000000000(* Copyright (c) 2009, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor ExportTree( structure STRUCTVALS : STRUCTVALSIG structure PRETTY: PRETTYSIG ): EXPORTTREESIG = struct open PRETTY STRUCTVALS (* datatype ptProperties = PTprint of int -> pretty (* Print the tree *) | PTtype of types (* Type of an expression *) | PTdeclaredAt of location (* Declaration location for id. *) | PTopenedAt of location (* When an identifier comes from an "open" the location of the open. *) | PTstructureAt of location (* When an identifier comes from open S or S.a the declaration of S. *) | PTreferences of bool * location list (* The references to the ID. The first is true if this is exported. *) | PTparent of unit -> exportTree | PTpreviousSibling of unit -> exportTree | PTnextSibling of unit -> exportTree | PTfirstChild of unit -> exportTree | PTbreakPoint of bool ref | PTcompletions of string list withtype exportTree = location * ptProperties list *) local open Address fun cast p = toAddress(toMachineWord p) in type ptProperties = address type exportTree = location * ptProperties list fun PTbreakPoint(bpt: bool ref): ptProperties = cast(0w0, bpt) and PTcompletions(sl: string list): ptProperties = cast(0w1, sl) and PTdeclaredAt(loc: location): ptProperties = cast(0w2, loc) and PTdefId(id: int): ptProperties = cast(0w3, id) and PTfirstChild(entry: unit -> exportTree): ptProperties = cast(0w4, entry) and PTnextSibling(entry: unit -> exportTree): ptProperties = cast(0w5, entry) and PTopenedAt(loc: location): ptProperties = cast(0w6, loc) and PTparent(entry: unit -> exportTree): ptProperties = cast(0w7, entry) and PTpreviousSibling(entry: unit -> exportTree): ptProperties = cast(0w8, entry) and PTprint(pr: int -> pretty): ptProperties = cast(0w9, pr) and PTreferences(exp: bool, locs: location list): ptProperties = cast(0w10, exp, locs) and PTrefId(id: int): ptProperties = cast(0w11, id) and PTstructureAt(loc: location): ptProperties = cast(0w12, loc) and PTtype(typ: types): ptProperties = cast(0w13, typ) end (* This representation is exported so we have to use a *) type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} (* Navigate within a list *) fun exportList _ [] = [] | exportList(exp, parent) sl = let fun getEntry(this as (s :: sl), getPrevious) () = exp( { parent = parent, previous = getPrevious, (* If we have a successor then that is the entry and its predecessor returns here. *) next = case sl of [] => NONE | t => SOME(getEntry(t, SOME(getEntry(this, getPrevious)))) }, s ) | getEntry _ () = raise Empty in [PTfirstChild (getEntry(sl, NONE))] end fun exportNavigationProps{parent, previous, next} = let fun mapProps(_, NONE) = [] | mapProps(f, SOME v) = [f v] in (* Common properties for navigation and printing. *) mapProps(PTparent, parent) @ mapProps(PTpreviousSibling, previous) @ mapProps(PTnextSibling, next) end fun getStringAsTree (navigation, s: string, location: location, otherProps) = (location, otherProps @ exportNavigationProps navigation @ [PTprint(fn _ => PrettyString s)]) (* Tag used to indicate the root tree node in the compiler arguments. *) val rootTreeTag: navigation Universal.tag = Universal.tag() (* Map value locations into properties. *) fun mapLocationProps locs = let fun prop (DeclaredAt loc) = PTdeclaredAt loc | prop (OpenedAt loc) = PTopenedAt loc | prop (StructureAt loc) = PTstructureAt loc | prop (SequenceNo id) = PTrefId id in List.map prop locs end (* Types that can be shared. *) structure Sharing = struct type types = types and locationProp = locationProp and pretty = pretty and ptProperties = ptProperties end end; polyml-5.6/mlsource/MLCompiler/ExportTreeStruct.sml000066400000000000000000000016151265146633400225740ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ExportTreeStruct = ExportTree ( structure STRUCTVALS = StructVals and PRETTY = Pretty); polyml-5.6/mlsource/MLCompiler/INITIALISE_.ML000066400000000000000000002147071265146633400206040ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Updated David C.J. Matthews 2008-9, 2012, 2013, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Initialise ML Global Declarations. Author: Dave Matthews,Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor INITIALISE_ ( structure LEX: LEXSIG structure TYPETREE : TYPETREESIG; structure STRUCTVALS : STRUCTVALSIG; structure VALUEOPS : VALUEOPSSIG; structure CODETREE : CODETREESIG structure EXPORTTREE: EXPORTTREESIG structure DATATYPEREP: DATATYPEREPSIG structure TYPEIDCODE: TYPEIDCODESIG structure MAKE : sig type gEnv type env type values; type typeConstrSet; type fixStatus; type structVals; type signatures; type functors; type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list } val gEnvAsEnv : gEnv -> env val gEnvAsNameSpace: gEnv -> nameSpace val useIntoEnv : gEnv -> Universal.universal list -> string -> unit type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type exportTree = EXPORTTREE.exportTree val compiler : nameSpace * (unit->char option) * Universal.universal list -> exportTree option * ( unit -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list }) option end; structure ADDRESS : AddressSig structure DEBUG: DEBUGSIG structure MISC : sig val unescapeString : string -> string exception Conversion of string; (* string to int conversion failure *) end; structure DEBUGGER : DEBUGGERSIG structure PRETTY : PRETTYSIG structure VERSION: sig val compilerVersion: string val versionNumber: int end; sharing STRUCTVALS.Sharing = VALUEOPS.Sharing = TYPETREE.Sharing = EXPORTTREE.Sharing = PRETTY.Sharing = CODETREE.Sharing = MAKE = ADDRESS = DATATYPEREP.Sharing = TYPEIDCODE.Sharing = DEBUGGER.Sharing = LEX.Sharing ) : sig type gEnv val initGlobalEnv : gEnv -> unit end = struct open STRUCTVALS; open TYPETREE open VALUEOPS; open CODETREE; open ADDRESS; open MAKE; open MISC; open RuntimeCalls; (* for POLY_SYS calls *) open EXPORTTREE open DATATYPEREP val declInBasis = [DeclaredAt inBasis] fun applyList _ [] = () | applyList f (h :: t) = (f h : unit; applyList f t); fun initGlobalEnv(globalTable : gEnv) = let val Env globalEnv = MAKE.gEnvAsEnv globalTable val enterGlobalValue = #enterVal globalEnv; val enterGlobalType = #enterType globalEnv; (* Some routines to help make the types. *) local (* careful - STRUCTVALS.intType differs from TYPETREE.intType *) open TYPETREE; in (* Make some type variables *) fun makeEqTV () = mkTypeVar (generalisable, true, false, false) fun makeTV () = mkTypeVar (generalisable, false, false, false) fun makePrintTV() = mkTypeVar (generalisable, false, false, true) (* Make some functions *) infixr 5 ->> fun a ->> b = mkFunctionType (a, b); infix 7 **; fun a ** b = mkProductType [a, b]; (* Type identifiers for the types of the declarations. *) val Int = intType; val String = stringType; val Bool = boolType; val Unit = unitType; val Char = charType; val Word = wordType; val Exn = exnType val mkTypeConstruction = mkTypeConstruction; end; fun makePolymorphic(tvs, c) = let open TYPEIDCODE val tvs = List.filter(fn TypeVar tv => not justForEqualityTypes orelse tvEquality tv | _ => false) tvs in if null tvs then c else mkInlproc(c, List.length tvs, "", [], 0) end (* Function to make a type identifier with a pretty printer that just prints "?". None of the types are equality types so the equality function is empty. *) local fun monotypePrinter _ = PRETTY.PrettyString "?" in fun defaultEqAndPrintCode () = let open TypeValue val code = createTypeValue{ eqCode = CodeZero, printCode = mkConst (toMachineWord (ref monotypePrinter)), boxedCode = boxedEither (* Assume this for the moment *), sizeCode = singleWord } in Global (genCode(code, [], 0) ()) end end fun makeTypeAbbreviation(name, fullName, typeVars, typeResult, locations) = makeTypeConstructor( name, makeTypeFunction(basisDescription fullName, (typeVars, typeResult)), locations) (* Make an opaque type and add it to an environment. *) fun makeAndDeclareOpaqueType(typeName, fullName, env) = let val typeconstr = makeTypeConstructor(typeName, makeFreeId(0, defaultEqAndPrintCode(), false, basisDescription fullName), declInBasis); in #enterType env (typeName, TypeConstrSet(typeconstr, [])); mkTypeConstruction (typeName, typeconstr, [], declInBasis) end; (* List of something *) fun List (base : types) : types = mkTypeConstruction ("list", tsConstr listConstr, [base], declInBasis); (* ref something *) fun Ref (base : types) : types = mkTypeConstruction ("ref", refConstr, [base], declInBasis); fun Option (base : types) : types = mkTypeConstruction ("option", tsConstr optionConstr, [base], declInBasis); (* Type-dependent functions. *) fun mkSpecialFun (name:string, typeof:types, opn: typeDependent) : values = makeOverloaded (name, typeof, opn); (* Overloaded functions. *) fun mkOverloaded (name:string) (typeof: types) : values = mkSpecialFun(name, typeof, TypeDep) (* Make a structure. Returns the table as an environment so that entries can be added to the structure. *) fun makeStructure(parentEnv, name) = let val str as Struct{signat=Signatures{tab, ...}, ...} = makeEmptyGlobal name val () = #enterStruct parentEnv (name, str) val Env env = makeEnv tab in env end val () = enterGlobalType ("unit", TypeConstrSet(unitConstr, [])); local val falseCons = mkGconstr ("false", Bool, createNullaryConstructor(EnumForm{tag=0w0, maxTag=0w1}, [], "false"), true, 2, declInBasis); val trueCons = mkGconstr ("true", Bool, createNullaryConstructor(EnumForm{tag=0w1, maxTag=0w1}, [], "true"), true, 2, declInBasis); in val () = enterGlobalType ("bool", TypeConstrSet(boolConstr, [trueCons, falseCons])); val () = enterGlobalValue ("true", trueCons); val () = enterGlobalValue ("false", falseCons); end; val () = enterGlobalType ("int", TypeConstrSet(intConstr, [])); val () = enterGlobalType ("char", TypeConstrSet(charConstr, [])); val () = enterGlobalType ("string", TypeConstrSet(stringConstr, [])); (* chr - define it as an identity function for now. It is redefined in the prelude to check that the value is a valid character. *) local val chrCode = identityFunction "chr"; val chrType = Int ->> String; val chrVal = mkGvar ("chr", chrType, chrCode, declInBasis); in val () = enterGlobalValue ("chr", chrVal); end val () = enterGlobalType ("real", TypeConstrSet(realConstr, [])); val () = (* Enter :: and nil. *) List.app(fn(tv as Value{name, ...}) => enterGlobalValue(name, tv)) (tsConstructors listConstr) val () = enterGlobalType ("list", listConstr); val () = (* Enter NONE and SOME. *) List.app(fn(tv as Value{name, ...}) => enterGlobalValue(name, tv)) (tsConstructors optionConstr) val () = enterGlobalType ("option", optionConstr); local val refCons = let val a = mkTypeVar(generalisable, false, false, false) in mkGconstr ("ref", a ->> Ref a, createUnaryConstructor(RefForm, [a], "ref"), false, 1, declInBasis) end in val () = enterGlobalType ("ref", TypeConstrSet(refConstr, [refCons])); val () = enterGlobalValue ("ref", refCons); end val () = enterGlobalType ("exn", TypeConstrSet(exnConstr, [])); val () = enterGlobalType ("word", TypeConstrSet(wordConstr, [])); val runCallEnv = makeStructure(globalEnv, "RunCall") fun enterRunCall (name : string, entry : codetree, typ : types) : unit = let val value = mkGvar (name, typ, entry, declInBasis); in #enterVal runCallEnv (name, value) end local val a = makeTV (); val b = makeTV (); val unsafeCastType = a ->> b; val unsafeCastEntry : codetree = let val name = "unsafeCast(1)"; val args = 1; val body = mkLoadArgument 0 (* just the parameter *) in mkInlproc (body, args, name, [], 0) end; in val () = enterRunCall ("unsafeCast", makePolymorphic([a, b], unsafeCastEntry), unsafeCastType); end local val a = makeTV (); val b = makeTV (); val c = makeTV (); val d = makeTV (); val e = makeTV (); val f = makeTV (); val runCall0Type = Int ->> Unit ->> a; val runCall1Type = Int ->> a ->> b; val runCall2Type = Int ->> TYPETREE.mkProductType [a,b] ->> c; val runCall3Type = Int ->> TYPETREE.mkProductType [a,b,c] ->> d; val runCall4Type = Int ->> TYPETREE.mkProductType [a,b,c,d] ->> e; val runCall5Type = Int ->> TYPETREE.mkProductType [a,b,c,d,e] ->> f; val runCall2C2Type = Int ->> TYPETREE.mkProductType [a,b] ->> TYPETREE.mkProductType [c,d] (* We used to have the following definition: val runCall1Entry = mkEntry POLY_SYS_io_operation; but it didn't work as well, because CODETREE.ML wouldn't optimise expressions like: RunCall.run_call1 POLY_SYS_io_operation because there was nothing to tell it that this should be evaluated "early". Now we use an inline procedure wrapped round the constant, and set the "early" flag in the inline proc. SPF 2/5/95. *) val runCall1Entry : codetree = let val name = "run_call1(1)"; val ioOpEntry = rtsFunction POLY_SYS_io_operation; val n = mkLoadArgument 0 (* the outer parameter *) val body = mkEval (ioOpEntry, [n]); in makePolymorphic([a, b], mkInlproc (body, 1, name, [], 0)) end; fun makeRunCallTupled (width:int) : codetree = let (* These declarations should really be read in the reverse order. We are trying to build the codetree for something like the following: val run_call3 = fn (n:int) => let val f = ioOp n in fn (x,y,z) => f end; where "f " designates Poly-style (values in registers) uncurried parameter passing. *) val name = "run_call" ^ Int.toString width; val ioOpEntry = rtsFunction POLY_SYS_io_operation; val innerBody : codetree = let val f = mkLoadClosure 0 (* first item from enclosing scope *) val tuple = mkLoadArgument 0 (* the inner parameter *) val args = List.tabulate(width, fn n => mkInd (n, tuple)) in mkEval (f, args) end val innerLambda = mkInlproc (innerBody, 1, name ^ "(1)", [mkLoadLocal 0], 0) val outerBody : codetree = let val n = mkLoadArgument 0 (* the outer parameter *) val f = mkEval (ioOpEntry, [n]); in mkEnv([mkDec (0, f)], innerLambda) end val outerLambda = mkInlproc (outerBody, 1, name, [], 1) in outerLambda end (* Versions that return the results in a container i.e. a tuple on the stack. Currently this is only used for quotrem. *) fun makeRunCallTupledWithContainer (width:int, containerWidth) : codetree = let val name = String.concat["run_call", Int.toString width, "C", Int.toString containerWidth] val ioOpEntry = rtsFunction POLY_SYS_io_operation val innerLambda : codetree = let val f = mkLoadClosure 0 (* first item from enclosing scope *) val tuple = mkLoadArgument 0 (* the inner parameter *) val ca = 0 (* Address of container *) val args = List.tabulate(width, fn n => mkInd (n, tuple)) @ [mkLoadLocal ca] in mkInlproc( mkEnv([mkContainer(ca, containerWidth, mkEval (f, args))], mkTupleFromContainer(ca, containerWidth)), 1, name ^ "(1)", [mkLoadLocal 0], 1) end val outerLambda = let val n = mkLoadArgument 0 (* the outer parameter *) val f = mkEval (ioOpEntry, [n]) in mkInlproc(mkEnv([mkDec (0, f)], innerLambda), 1, name, [], 1) end in outerLambda end val runCall0Entry = makePolymorphic([a], makeRunCallTupled 0); val runCall2Entry = makePolymorphic([a, b, c], makeRunCallTupled 2); val runCall3Entry = makePolymorphic([a, b, c, d], makeRunCallTupled 3); val runCall4Entry = makePolymorphic([a, b, c, d, e], makeRunCallTupled 4); val runCall5Entry = makePolymorphic([a, b, c, d, e, f], makeRunCallTupled 5); val runCall2C2Entry = makePolymorphic([a, b, c, d], makeRunCallTupledWithContainer(2, 2)); in val () = enterRunCall ("run_call0", runCall0Entry, runCall0Type); val () = enterRunCall ("run_call1", runCall1Entry, runCall1Type); val () = enterRunCall ("run_call2", runCall2Entry, runCall2Type); val () = enterRunCall ("run_call3", runCall3Entry, runCall3Type); val () = enterRunCall ("run_call4", runCall4Entry, runCall4Type); val () = enterRunCall ("run_call5", runCall5Entry, runCall5Type); val () = enterRunCall ("run_call2C2", runCall2C2Entry, runCall2C2Type); end local (* Create nullary exception. *) fun makeException0(name, id) = let val exc = Value{ name = name, typeOf = TYPETREE.exnType, access = Global(mkConst(toMachineWord id)), class = Exception, locations = declInBasis, references = NONE, instanceTypes=NONE } in #enterVal runCallEnv (name, exc) end (* Create exception with parameter. *) and makeException1(name, id, exType) = let val exc = Value{ name = name, typeOf = exType ->> TYPETREE.exnType, access = Global(mkConst(toMachineWord id)), class = Exception, locations = declInBasis, references = NONE, instanceTypes=NONE } in #enterVal runCallEnv (name, exc) end in val () = List.app makeException0 [ ("Interrupt", EXC_interrupt), ("Size", EXC_size), ("Bind", EXC_Bind), ("Div", EXC_divide), ("Match", EXC_Match), ("Overflow", EXC_overflow), ("Subscript", EXC_subscript) ] val () = List.app makeException1 [ ("Fail", EXC_Fail, String), ("Conversion", EXC_conversion, String), ("XWindows", EXC_XWindows, String), ("Foreign", EXC_foreign, String), ("Thread", EXC_thread, String), ("SysErr", EXC_syserr, String ** Option Int), ("ExTrace", EXC_extrace, List String ** Exn) ] end val bootstrapEnv = makeStructure(globalEnv, "Bootstrap") fun enterBootstrap (name : string, entry : codetree, typ : types) : unit = let val value = mkGvar (name, typ, entry, declInBasis); in #enterVal bootstrapEnv (name, value) end; local fun addVal (name : string, value : 'a, typ : types) : unit = enterBootstrap (name, mkConst (toMachineWord value), typ) (* These are only used during the bootstrap phase. Replacements are installed once the appropriate modules of the basis library are compiled. *) fun intOfString s = let val radix = if String.size s >= 3 andalso String.substring(s, 0, 2) = "0x" orelse String.size s >= 4 andalso String.substring(s, 0, 3) = "~0x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (Int.scan radix) s of NONE => raise Conversion "Invalid integer constant" | SOME res => res end fun wordOfString s = let val radix = if String.size s > 2 andalso String.sub(s, 2) = #"x" then StringCvt.HEX else StringCvt.DEC in case StringCvt.scanString (Word.scan radix) s of NONE => raise Conversion "Invalid word constant" | SOME res => res end in (* When we start the compiler we don't have any conversion functions. We can't even use a literal string until we have installed a basic converter. *) val () = addVal ("convStringName", "convString": string, String); val () = addVal ("convInt", intOfString : string -> int, String ->> Int); val () = addVal ("convWord", wordOfString : string -> word, String ->> Word); (* Convert a string, recognising and converting the escape codes. *) val () = addVal ("convString", unescapeString: string -> string, String ->> String); end (* The only reason we have vector here is to get equality right. We need vector to be an equality type and to have a specific equality function. *) local fun polyTypePrinter _ _ = PRETTY.PrettyString "?" (* The equality function takes the base equality type as an argument. The inner function takes two arguments which are the two vectors to compare, checks the lengths and if they're equal applies the base equality to each field. *) val eqCode = mkInlproc( mkProc( mkEnv([ (* Length of the items. *) mkDec(0, mkEval(rtsFunction POLY_SYS_get_length, [mkLoadArgument 0])), mkDec(1, mkEval(rtsFunction POLY_SYS_get_length, [mkLoadArgument 1])), mkMutualDecs[(2, (* Loop function. *) mkProc( mkIf( (* Finished? *) mkEval(rtsFunction POLY_SYS_word_eq, [mkLoadClosure 0, mkLoadArgument 0]), CodeTrue, (* Yes, all equal. *) mkIf( mkEval( TypeValue.extractEquality(mkLoadClosure 2), (* Base equality fn *) [ mkEval(rtsFunction POLY_SYS_load_word, [mkLoadClosure 3, mkLoadArgument 0]), mkEval(rtsFunction POLY_SYS_load_word, [mkLoadClosure 4, mkLoadArgument 0]) ]), mkEval(mkLoadClosure 1, (* Recursive call with index+1. *) [ mkEval(rtsFunction POLY_SYS_plus_word, [mkLoadArgument 0, mkConst(toMachineWord 1)]) ]), CodeFalse (* Not equal elements - result false *) ) ), 1, "vector-loop", [mkLoadLocal 0 (* Length *), mkLoadLocal 2 (* Loop function *), mkLoadClosure 0 (* Base equality function *), mkLoadArgument 0 (* Vector 0 *), mkLoadArgument 1 (* Vector 1 *)], 0))] ], mkIf( (* Test the lengths. *) mkEval(rtsFunction POLY_SYS_word_eq, [mkLoadLocal 0, mkLoadLocal 1]), (* Equal - test the contents. *) mkEval(mkLoadLocal 2, [CodeZero]), CodeFalse (* Not same length- result false *) ) ), 2, "vector-eq", [mkLoadArgument 0], 3), 1, "vector-eq()", [], 0) val idCode = (* Polytype *) let open TypeValue val code = createTypeValue{ eqCode=eqCode, printCode=mkConst (toMachineWord (ref polyTypePrinter)), boxedCode=mkInlproc(boxedAlways, 1, "boxed-vector", [], 0), sizeCode=mkInlproc(singleWord, 1, "size-vector", [], 0)} in Global (genCode(code, [], 0) ()) end in val vectorType = makeTypeConstructor("vector", makeFreeId(1, idCode, true, basisDescription "vector"), declInBasis); val () = enterGlobalType ("vector", TypeConstrSet(vectorType, [])); end (* We also need a type with byte-wise equality. *) local fun monoTypePrinter _ = PRETTY.PrettyString "?" (* This is a monotype equality function that takes two byte vectors and compares them byte-by-byte for equality. Because they are vectors of bytes it's unsafe to load the whole words which could look like addresses if the bottom bit happens to be zero. *) val eqCode = mkProc( mkEnv([ (* Length of the items. *) mkDec(0, mkEval(rtsFunction POLY_SYS_get_length, [mkLoadArgument 0])), mkDec(1, mkEval(rtsFunction POLY_SYS_get_length, [mkLoadArgument 1])) ], mkIf( (* Test the lengths. *) mkEval(rtsFunction POLY_SYS_word_eq, [mkLoadLocal 0, mkLoadLocal 1]), (* Equal - test the contents. *) mkEnv([ (* POLY_SYS_bytevec_eq takes a byte length so we have to multiply by the number of bytes per word. *) mkDec(2, mkEval(rtsFunction POLY_SYS_mul_word, [mkEval(rtsFunction POLY_SYS_bytes_per_word, []), mkLoadLocal 0] )) ], mkEval(rtsFunction POLY_SYS_bytevec_eq, [mkLoadArgument 0, CodeZero, mkLoadArgument 1, CodeZero, mkLoadLocal 2])), CodeFalse (* Not same length- result false *) ) ), 2, "byteVector-eq", [], 3) val idCode = (* Polytype *) let open TypeValue val code = createTypeValue{ eqCode=eqCode, printCode=mkConst (toMachineWord (ref monoTypePrinter)), boxedCode=boxedAlways, sizeCode=singleWord} in Global (genCode(code, [], 0) ()) end in val byteVectorType = makeTypeConstructor("byteVector", makeFreeId(0, idCode, true, basisDescription "byteVector"), declInBasis); val () = #enterType bootstrapEnv ("byteVector", TypeConstrSet(byteVectorType, [])); end (* Similarly we need LargeWord.word *) local fun monoTypePrinter _ = PRETTY.PrettyString "?" val idCode = let open TypeValue val code = createTypeValue{ eqCode=CODETREE.rtsFunction POLY_SYS_eq_longword, printCode=mkConst (toMachineWord (ref monoTypePrinter)), boxedCode = boxedNever, sizeCode = singleWord } in Global (genCode(code, [], 0) ()) end in val largeWordType = makeTypeConstructor("word", makeFreeId(0, idCode, true, basisDescription "word"), declInBasis); (* This is put in Bootstrap so it can be picked out in the basis library. The default "word" type (Word.word) is in the global namespace. *) val () = #enterType bootstrapEnv ("word", TypeConstrSet(largeWordType, [])); end (* We also need array and Array2.array to be passed through here so that they have the special property of being eqtypes even if their argument is not. "array" is defined to be in the global environment. *) val () = enterGlobalType ("array", TypeConstrSet(arrayConstr, [])); val () = #enterType bootstrapEnv ("array", TypeConstrSet(array2Constr, [])) val () = #enterType bootstrapEnv ("byteArray", TypeConstrSet(byteArrayConstr, [])); (* "=', '<>', PolyML.print etc are type-specific function which appear to be polymorphic. The compiler recognises these and treats them specially. For (in)equality that means generating type-specific versions of the equality operations; for print etc that means printing in a type-specific way. They can become true polymorphic functions and lose their type-specificity. For (in)equality that means defaulting to structure equality which is normal and expected behaviour. For print etc that means losing the ability to print and just printing "?" so it's important to avoid that happening. "open" treats type-specific functions specially and retains the type-specificity. That's important to allow the prelude code to expand the PolyML structure. *) local val eqType = let val a = makeEqTV () in a ** a ->> Bool end; val eqVal = mkSpecialFun("=", eqType, Equal); in val () = enterGlobalValue ("=", eqVal); end; local val neqType = let val a = makeEqTV () in a ** a ->> Bool end; val neqVal = mkSpecialFun("<>", neqType, NotEqual); in val () = enterGlobalValue ("<>", neqVal); end; val polyMLEnv = makeStructure(globalEnv, "PolyML") val enterPolyMLVal = #enterVal polyMLEnv local (* This version of the environment must match that used in the NameSpace structure. *) open TYPETREE (* Create a new structure for them. *) val nameSpaceEnv = makeStructure(polyMLEnv, "NameSpace") (* Substructures. *) val valuesEnv = makeStructure(nameSpaceEnv, "Values") and typesEnv = makeStructure(nameSpaceEnv, "TypeConstrs") and fixesEnv = makeStructure(nameSpaceEnv, "Infixes") and structsEnv = makeStructure(nameSpaceEnv, "Structures") and sigsEnv = makeStructure(nameSpaceEnv, "Signatures") and functsEnv = makeStructure(nameSpaceEnv, "Functors") (* Types for the basic values. These are opaque. *) val valueVal = makeAndDeclareOpaqueType("value", "PolyML.NameSpace.Values.value", valuesEnv) (* Representation of the type of a value. *) val Types = makeAndDeclareOpaqueType("typeExpression", "PolyML.NameSpace.Values.typeExpression", valuesEnv) val typeVal = makeAndDeclareOpaqueType("typeConstr", "PolyML.NameSpace.TypeConstrs.typeConstr", typesEnv) val fixityVal = makeAndDeclareOpaqueType("fixity", "PolyML.NameSpace.Infixes.fixity", fixesEnv) val signatureVal = makeAndDeclareOpaqueType("signatureVal", "PolyML.NameSpace.Signatures.signatureVal", sigsEnv) val structureVal = makeAndDeclareOpaqueType("structureVal", "PolyML.NameSpace.Structures.structureVal", structsEnv) val functorVal = makeAndDeclareOpaqueType("functorVal", "PolyML.NameSpace.Functors.functorVal", functsEnv) (* nameSpace type. Labelled record. *) fun createFields(name, vType): { name: string, typeof: types} list = let val enterFun = String ** vType ->> Unit val lookupFun = String ->> Option vType val allFun = Unit ->> List (String ** vType) in [mkLabelEntry("enter" ^ name, enterFun), mkLabelEntry("lookup" ^ name, lookupFun), mkLabelEntry("all" ^ name, allFun)] end (* We have to use the same names as we use in the env type because we're passing "env" values through the bootstrap. *) val valTypes = [("Val", valueVal), ("Type", typeVal), ("Fix", fixityVal), ("Struct", structureVal), ("Sig", signatureVal), ("Funct", functorVal)]; val fields = List.foldl (fn (p,l) => createFields p @ l) [] valTypes val recordType = makeTypeAbbreviation("nameSpace", "PolyML.NameSpace.nameSpace", [], mkLabelled(sortLabels fields, true), declInBasis); val () = #enterType nameSpaceEnv ("nameSpace", TypeConstrSet(recordType, [])); (* The result type of the compiler includes valueVal etc. *) val resultFields = List.map TYPETREE.mkLabelEntry [("values", List(String ** valueVal)), ("fixes", List(String ** fixityVal)), ("types", List(String ** typeVal)), ("structures", List(String ** structureVal)), ("signatures", List(String ** signatureVal)), ("functors", List(String ** functorVal))] in val nameSpaceType = mkTypeConstruction ("nameSpace", recordType, [], declInBasis) val execResult = mkLabelled(sortLabels resultFields, true) type execResult = { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list } val valueVal = valueVal val typeVal = typeVal val fixityVal = fixityVal val signatureVal = signatureVal val structureVal = structureVal val functorVal = functorVal val Types = Types val valuesEnv = valuesEnv and typesEnv = typesEnv and fixesEnv = fixesEnv and structsEnv = structsEnv and sigsEnv = sigsEnv and functsEnv = functsEnv end local val typeconstr = locationConstr val () = #enterType polyMLEnv ("location", typeconstr); in val Location = mkTypeConstruction ("location", tsConstr typeconstr, [], declInBasis) end (* Interface to the debugger. *) local open TYPETREE val debuggerEnv = makeStructure(polyMLEnv, "DebuggerInterface") (* Make these opaque at this level. *) val locationPropList = makeAndDeclareOpaqueType("locationPropList", "PolyML.DebuggerInterface.locationPropList", debuggerEnv) val typeId = makeAndDeclareOpaqueType("typeId", "PolyML.DebuggerInterface.typeId", debuggerEnv) val machineWordType = makeAndDeclareOpaqueType("machineWord", "PolyML.DebuggerInterface.machineWord", debuggerEnv) (* For long term security keep these as different from global types and sigs. Values in the static environment need to be copied before they are global. *) val localType = makeAndDeclareOpaqueType("localType", "PolyML.DebuggerInterface.localType", debuggerEnv) val localTypeConstr = makeAndDeclareOpaqueType("localTypeConstr", "PolyML.DebuggerInterface.localTypeConstr", debuggerEnv) val localSig = makeAndDeclareOpaqueType("localSig", "PolyML.DebuggerInterface.localSig", debuggerEnv) open DEBUGGER (* Entries in the static list. This type is only used within the implementation of DebuggerInterface in the basis library and does not appear in the final signature. *) val environEntryConstr = makeTypeConstructor("environEntry", makeFreeId(0, defaultEqAndPrintCode(), false, basisDescription "PolyML.DebuggerInterface.environEntry"), declInBasis) val environEntryType = mkTypeConstruction ("environEntry", environEntryConstr, [], declInBasis) val constrs = (* Order is significant. *) [ ("EnvEndFunction", mkProductType[String, Location, localType]), ("EnvException", mkProductType[String, localType, locationPropList]), ("EnvStartFunction", mkProductType[String, Location, localType]), ("EnvStructure", mkProductType[String, localSig, locationPropList]), ("EnvTConstr", String ** localTypeConstr), ("EnvTypeid", typeId ** typeId), ("EnvVConstr", mkProductType[String, localType, Bool, Int, locationPropList]), ("EnvValue", mkProductType[String, localType, locationPropList]) ] (* This representation must match the representation defined in DEBUGGER_.sml. *) val numConstrs = List.length constrs val {constrs=constrReps, ...} = chooseConstrRepr(constrs, []) val constructors = ListPair.map (fn ((s,t), code) => mkGconstr(s, t ->> environEntryType, code, false, numConstrs, declInBasis)) (constrs, constrReps) val () = List.app (fn c => #enterVal debuggerEnv(valName c, c)) constructors (* Put these constructors onto the type. *) val () = #enterType debuggerEnv ("environEntry", TypeConstrSet(environEntryConstr, constructors)) (* Debug state type. *) val debugStateConstr = makeTypeAbbreviation("debugState", "PolyML.DebuggerInterface.debugState", [], mkProductType[List environEntryType, List machineWordType, Location], declInBasis) val () = #enterType debuggerEnv ("debugState", TypeConstrSet(debugStateConstr, [])) val debugStateType = mkTypeConstruction ("debugState", debugStateConstr, [], declInBasis) in val () = applyList (fn (name, v, t) => #enterVal debuggerEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("makeValue", toMachineWord(makeValue: debugState -> string * types * locationProp list * machineWord -> values), debugStateType ->> mkProductType[String, localType, locationPropList, machineWordType] ->> valueVal), ("makeException", toMachineWord(makeException: debugState -> string * types * locationProp list * machineWord -> values), debugStateType ->> mkProductType[String, localType, locationPropList, machineWordType] ->> valueVal), ("makeConstructor", toMachineWord(makeConstructor: debugState -> string * types * bool * int * locationProp list * machineWord -> values), debugStateType ->> mkProductType[String, localType, Bool, Int, locationPropList, machineWordType] ->> valueVal), ("makeAnonymousValue", toMachineWord(makeAnonymousValue: debugState -> types * machineWord -> values), debugStateType ->> mkProductType[localType, machineWordType] ->> valueVal), ("makeStructure", toMachineWord(makeStructure: debugState -> string * signatures * locationProp list * machineWord -> structVals), debugStateType ->> mkProductType[String, localSig, locationPropList, machineWordType] ->> structureVal), ("makeTypeConstr", toMachineWord(makeTypeConstr: debugState -> typeConstrSet -> typeConstrSet), debugStateType ->> localTypeConstr ->> typeVal), ("unitValue", toMachineWord(mkGvar("", unitType, CodeZero, []): values), valueVal), (* Used as a default *) ("setOnEntry", toMachineWord(setOnEntry: (string * PolyML.location -> unit) option -> unit), Option (String ** Location ->> Unit) ->> Unit), ("setOnExit", toMachineWord(setOnExit: (string * PolyML.location -> unit) option -> unit), Option (String ** Location ->> Unit) ->> Unit), ("setOnExitException", toMachineWord(setOnExitException: (string * PolyML.location -> exn -> unit) option -> unit), Option (String ** Location ->> Exn ->> Unit) ->> Unit), ("setOnBreakPoint", toMachineWord(setOnBreakPoint: (PolyML.location * bool ref -> unit) option -> unit), Option (Location ** Ref Bool ->> Unit) ->> Unit) ] end local val typeconstr = contextConstr in val () = #enterType polyMLEnv ("context", typeconstr); val () = List.app(fn(tv as Value{name, ...}) => #enterVal polyMLEnv(name, tv)) (tsConstructors typeconstr) end local val typeconstr = prettyConstr in val () = #enterType polyMLEnv ("pretty", typeconstr); val () = List.app(fn(tv as Value{name, ...}) => #enterVal polyMLEnv(name, tv)) (tsConstructors typeconstr) val PrettyType = mkTypeConstruction ("pretty", tsConstr typeconstr, [], declInBasis) end local val printType = let val a = makePrintTV () in a ->> a end; val printVal = mkSpecialFun("print", printType, Print); in val () = enterPolyMLVal ("print", printVal); end; local val makeStringType = let val a = makePrintTV () in a ->> String end; val makeStringVal = mkSpecialFun("makestring", makeStringType, MakeString); in val () = enterPolyMLVal ("makestring", makeStringVal); end; local val prettyType = let val a = makePrintTV () in a ** Int ->> PrettyType end; val prettyVal = mkSpecialFun("prettyRepresentation", prettyType, GetPretty); in val () = enterPolyMLVal ("prettyRepresentation", prettyVal); end; local (* addPrettyPrinter is the new function to install a pretty printer. *) val a = makeTV () val b = makeTV () val addPrettyType = (Int ->> b ->> a ->> PrettyType) ->> Unit; val addPrettyVal = mkSpecialFun("addPrettyPrinter", addPrettyType, AddPretty); in val () = enterPolyMLVal ("addPrettyPrinter", addPrettyVal); end; (* This goes in RunCall since it's only for the basis library. *) local val addOverloadType = let val a = makeTV () and b = makeTV () in (a ->> b) ->> String ->> Unit end; val addOverloadVal = mkSpecialFun("addOverload", addOverloadType, AddOverload); in val () = #enterVal runCallEnv ("addOverload", addOverloadVal); end; local val sourceLocVal = mkSpecialFun("sourceLocation", Unit ->> Location, GetLocation); in val () = enterPolyMLVal ("sourceLocation", sourceLocVal); end; local (* This is used as one of the arguments to the compiler function. *) open TYPETREE val uniStructEnv = makeStructure(bootstrapEnv, "Universal") fun enterUniversal (name : string, entry : codetree, typ : types) : unit = let val value = mkGvar (name, typ, entry, declInBasis); in #enterVal uniStructEnv (name, value) end; local fun polyTypePrinter _ _ = PRETTY.PrettyString "?" open TypeValue val idCode = let val code = createTypeValue{ eqCode=CodeZero, (* Not an equality type *) printCode=mkConst (toMachineWord (ref polyTypePrinter)), boxedCode=mkInlproc(boxedEither(* Assume worst case *), 1, "boxed-tag", [], 0), sizeCode=mkInlproc(singleWord, 1, "size-tag", [], 0)} in Global (genCode(code, [], 0) ()) end in (* type 'a tag *) val tagConstr = makeTypeConstructor("tag", makeFreeId(1, idCode, false, basisDescription "tag"), declInBasis); val () = #enterType uniStructEnv ("tag", TypeConstrSet(tagConstr, [])) end (* type universal *) val univConstr = makeTypeConstructor("universal", makeFreeId(0, defaultEqAndPrintCode(), false, basisDescription "universal"), declInBasis); val () = #enterType uniStructEnv ("universal", TypeConstrSet(univConstr, [])); fun Tag base = mkTypeConstruction ("tag", tagConstr, [base], declInBasis) val Universal = mkTypeConstruction ("universal", univConstr, [], declInBasis) val a = makeTV() (* val tagInject : 'a tag -> 'a -> universal *) val injectType = Tag a ->> a ->> Universal val () = enterUniversal ("tagInject", makePolymorphic([a], mkConst (toMachineWord (Universal.tagInject: 'a Universal.tag -> 'a -> Universal.universal))), injectType) (* We don't actually need tagIs and tagProject since this is only used for the compiler. Universal is redefined in the basis library. *) val projectType = Tag a ->> Universal ->> a val () = enterUniversal ("tagProject", makePolymorphic([a], mkConst (toMachineWord(Universal.tagProject: 'a Universal.tag -> Universal.universal -> 'a))), projectType) val testType = Tag a ->> Universal ->> Bool val () = enterUniversal ("tagIs", makePolymorphic([a], mkConst (toMachineWord(Universal.tagIs: 'a Universal.tag -> Universal.universal -> bool))), testType) in val Tag = Tag and Universal = Universal end local open TYPETREE (* Parsetree properties datatype. *) val propConstr = makeTypeConstructor("ptProperties", makeFreeId(0, defaultEqAndPrintCode(), false, basisDescription "PolyML.ptProperties"), declInBasis); val PtProperties = mkTypeConstruction ("ptProperties", propConstr, [], declInBasis) (* Parsetree type. *) val parseTreeConstr = makeTypeAbbreviation("parseTree", "PolyML.parseTree", [], Location ** List PtProperties, declInBasis); val ParseTree = mkTypeConstruction ("parseTree", parseTreeConstr, [], declInBasis) val () = #enterType polyMLEnv ("parseTree", TypeConstrSet(parseTreeConstr, [])); val constrs = (* Order is significant. *) [ ("PTbreakPoint", Ref Bool), ("PTcompletions", List String), ("PTdeclaredAt", Location), ("PTdefId", Int), ("PTfirstChild", Unit ->> ParseTree), ("PTnextSibling", Unit ->> ParseTree), ("PTopenedAt", Location), ("PTparent", Unit ->> ParseTree), ("PTpreviousSibling", Unit ->> ParseTree), ("PTprint", Int ->> PrettyType), ("PTreferences", Bool ** List Location), ("PTrefId", Int), ("PTstructureAt", Location), ("PTtype", Types) ]; (* This representation must match the representation defined in ExportTree.sml. *) val numConstrs = List.length constrs val {constrs=constrReps, ...} = chooseConstrRepr(constrs, []) val constructors = ListPair.map (fn ((s,t), code) => mkGconstr(s, t ->> PtProperties, code, false, numConstrs, declInBasis)) (constrs, constrReps) val () = List.app (fn c => #enterVal polyMLEnv(valName c, c)) constructors (* Put these constructors onto the type. *) val () = #enterType polyMLEnv ("ptProperties", TypeConstrSet(propConstr, constructors)); in val ParseTree = ParseTree and PtProperties = PtProperties end local open TYPETREE val compilerType : types = mkProductType[nameSpaceType, Unit ->> Option Char, List Universal] ->> mkProductType[Option ParseTree, Option (Unit ->> execResult)] type compilerType = nameSpace * (unit -> char option) * Universal.universal list -> exportTree option * (unit->execResult) option in val () = enterBootstrap ("use", mkConst (toMachineWord ((useIntoEnv globalTable []): string -> unit)), String ->> Unit) val () = enterBootstrap ("useWithParms", mkConst (toMachineWord ((useIntoEnv globalTable): Universal.universal list -> string -> unit)), List Universal ->> String ->> Unit) val () = enterPolyMLVal("compiler", mkGvar ("compiler", compilerType, mkConst (toMachineWord (compiler: compilerType)), declInBasis)); val () = enterBootstrap("globalSpace", mkConst (toMachineWord(gEnvAsNameSpace globalTable: nameSpace)), nameSpaceType) end; local val ty = TYPETREE.mkOverloadSet[] val addType = ty ** ty ->> ty; val negType = ty ->> ty; val cmpType = ty ** ty ->> Bool; in val () = enterGlobalValue ("+", mkOverloaded "+" addType); val () = enterGlobalValue ("-", mkOverloaded "-" addType); val () = enterGlobalValue ("*", mkOverloaded "*" addType); val () = enterGlobalValue ("~", mkOverloaded "~" negType); val () = enterGlobalValue ("abs", mkOverloaded "abs" negType); val () = enterGlobalValue (">=", mkOverloaded ">=" cmpType); val () = enterGlobalValue ("<=", mkOverloaded "<=" cmpType); val () = enterGlobalValue (">", mkOverloaded ">" cmpType); val () = enterGlobalValue ("<", mkOverloaded "<" cmpType); (* The following overloads are added in ML97 *) val () = enterGlobalValue ("div", mkOverloaded "div" addType); val () = enterGlobalValue ("mod", mkOverloaded "mod" addType); val () = enterGlobalValue ("/", mkOverloaded "/" addType); end; local open DEBUG; local open TYPETREE val fields = [ mkLabelEntry("location", Location), mkLabelEntry("hard", Bool), mkLabelEntry("message", PrettyType), mkLabelEntry("context", Option PrettyType) ] in val errorMessageProcType = mkLabelled(sortLabels fields, true) ->> Unit type errorMessageProcType = { location: location, hard: bool, message: pretty, context: pretty option } -> unit end local open TYPETREE val optNav = Option(Unit->>ParseTree) val fields = [ mkLabelEntry("parent", optNav), mkLabelEntry("next", optNav), mkLabelEntry("previous", optNav) ] in val navigationType = mkLabelled(sortLabels fields, true) type navigationType = { parent: (unit->exportTree) option, next: (unit->exportTree) option, previous: (unit->exportTree) option } end type 'a tag = 'a Universal.tag in val () = applyList (fn (name, v, t) => enterBootstrap(name, mkConst v, t)) [ ("compilerVersion", toMachineWord (VERSION.compilerVersion: string), String), ("compilerVersionNumber", toMachineWord (VERSION.versionNumber: int), Int), ("lineNumberTag", toMachineWord (lineNumberTag : (unit->int) tag), Tag (Unit->>Int)), ("offsetTag", toMachineWord (offsetTag: (unit->int) tag), Tag (Unit->>Int)), ("fileNameTag", toMachineWord (fileNameTag: string tag), Tag String), ("bindingCounterTag", toMachineWord (bindingCounterTag: (unit->int) tag), Tag (Unit->>Int)), ("maxInlineSizeTag", toMachineWord (maxInlineSizeTag: int tag), Tag Int), ("assemblyCodeTag", toMachineWord (assemblyCodeTag: bool tag), Tag Bool), ("parsetreeTag", toMachineWord (parsetreeTag: bool tag), Tag Bool), ("codetreeTag", toMachineWord (codetreeTag: bool tag), Tag Bool), ("pstackTraceTag", toMachineWord (pstackTraceTag: bool tag), Tag Bool), ("lowlevelOptimiseTag", toMachineWord (lowlevelOptimiseTag: bool tag), Tag Bool), ("codetreeAfterOptTag", toMachineWord (codetreeAfterOptTag: bool tag), Tag Bool), ("traceCompilerTag", toMachineWord (traceCompilerTag: bool tag), Tag Bool), ("inlineFunctorsTag", toMachineWord (inlineFunctorsTag: bool tag), Tag Bool), ("debugTag", toMachineWord (debugTag: bool tag), Tag Bool), ("printDepthFunTag", toMachineWord (DEBUG.printDepthFunTag: (unit->int) tag), Tag (Unit->>Int)), ("errorDepthTag", toMachineWord (DEBUG.errorDepthTag: int tag), Tag Int), ("lineLengthTag", toMachineWord (DEBUG.lineLengthTag: int tag), Tag Int), ("profileAllocationTag", toMachineWord (DEBUG.profileAllocationTag: int tag), Tag Int), ("printOutputTag", toMachineWord (PRETTY.printOutputTag: (pretty->unit) tag), Tag (PrettyType->>Unit)) , ("compilerOutputTag", toMachineWord (PRETTY.compilerOutputTag: (pretty->unit) tag), Tag (PrettyType->>Unit)), ("errorMessageProcTag", toMachineWord (LEX.errorMessageProcTag: errorMessageProcType tag), Tag errorMessageProcType), ("rootTreeTag", toMachineWord (EXPORTTREE.rootTreeTag: navigation tag), Tag navigationType), ("reportUnreferencedIdsTag", toMachineWord (reportUnreferencedIdsTag: bool tag), Tag Bool), ("reportExhaustiveHandlersTag", toMachineWord (reportExhaustiveHandlersTag: bool tag), Tag Bool), ("narrowOverloadFlexRecordTag", toMachineWord (narrowOverloadFlexRecordTag: bool tag), Tag Bool), ("createPrintFunctionsTag", toMachineWord (createPrintFunctionsTag: bool tag), Tag Bool), ("reportDiscardedValuesTag", toMachineWord (reportDiscardedValuesTag: int tag), Tag Int) ] end; (* PolyML.CodeTree structure. This exports the CodeTree structure into the ML space. *) local open CODETREE val codetreeEnv = makeStructure(polyMLEnv, "CodeTree") fun createType typeName = makeAndDeclareOpaqueType(typeName, "PolyML.CodeTree." ^ typeName, codetreeEnv) val CodeTree = createType "codetree" and MachineWord = createType "machineWord" and CodeBinding = createType "codeBinding" (* For the moment export these only for the general argument and result types. *) fun simpleFn (code, nArgs, name, closure, nLocals) = mkFunction{body=code, argTypes=List.tabulate(nArgs, fn _ => GeneralType), resultType=GeneralType, name=name, closure=closure, numLocals=nLocals} and simpleInlineFn (code, nArgs, name, closure, nLocals) = mkInlineFunction{body=code, argTypes=List.tabulate(nArgs, fn _ => GeneralType), resultType=GeneralType, name=name, closure=closure, numLocals=nLocals} and simpleCall(func, args) = mkCall(func, List.map (fn c => (c, GeneralType)) args, GeneralType) in val CodeTree = CodeTree val () = applyList (fn (name, v, t) => #enterVal codetreeEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("pretty", toMachineWord (CODETREE.pretty: codetree -> pretty), CodeTree ->> PrettyType), ("mkConstant", toMachineWord(mkConst: machineWord -> codetree), MachineWord ->> CodeTree), ("genCode", toMachineWord (genCode: codetree * Universal.universal list * int -> (unit->codetree)), mkProductType[CodeTree, List Universal, Int] ->> (Unit ->> CodeTree)), ("evalue", toMachineWord (evalue: codetree -> machineWord option), CodeTree ->> Option MachineWord), ("mkFunction", toMachineWord (simpleFn: codetree * int * string * codetree list * int -> codetree), mkProductType[CodeTree, Int, String, List CodeTree, Int] ->> CodeTree), ("mkInlineFunction", toMachineWord (simpleInlineFn: codetree * int * string * codetree list * int -> codetree), mkProductType[CodeTree, Int, String, List CodeTree, Int] ->> CodeTree), ("mkCall", toMachineWord (simpleCall: codetree * codetree list -> codetree), CodeTree ** List CodeTree ->> CodeTree), ("mkLoadLocal", toMachineWord (mkLoadLocal: int -> codetree), Int ->> CodeTree), ("mkLoadArgument", toMachineWord (mkLoadArgument: int -> codetree), Int ->> CodeTree), ("mkLoadClosure", toMachineWord (mkLoadClosure: int -> codetree), Int ->> CodeTree), ("mkDec", toMachineWord (mkDec: int * codetree -> codeBinding), Int ** CodeTree ->> CodeBinding), ("mkInd", toMachineWord (mkInd: int * codetree -> codetree), Int ** CodeTree ->> CodeTree), ("mkIf", toMachineWord (mkIf: codetree * codetree * codetree -> codetree), mkProductType[CodeTree, CodeTree, CodeTree] ->> CodeTree), ("mkWhile", toMachineWord (mkWhile: codetree * codetree -> codetree), CodeTree ** CodeTree ->> CodeTree), ("mkLoop", toMachineWord (mkLoop: codetree list -> codetree), List CodeTree ->> CodeTree), ("mkBeginLoop", toMachineWord (mkBeginLoop: codetree * (int * codetree) list -> codetree), CodeTree ** List(Int ** CodeTree) ->> CodeTree), ("mkEnv", toMachineWord (mkEnv: codeBinding list * codetree -> codetree), List CodeBinding ** CodeTree ->> CodeTree), ("mkMutualDecs", toMachineWord (mkMutualDecs: (int * codetree) list -> codeBinding), List(Int ** CodeTree) ->> CodeBinding), ("mkTuple", toMachineWord (mkTuple: codetree list -> codetree), List CodeTree ->> CodeTree), ("mkRaise", toMachineWord (mkRaise: codetree -> codetree), CodeTree ->> CodeTree), ("mkHandle", toMachineWord (mkHandle: codetree * codetree -> codetree), CodeTree ** CodeTree ->> CodeTree), ("mkNullDec", toMachineWord (mkNullDec: codetree -> codeBinding), CodeTree ->> CodeBinding), ("Ldexc", toMachineWord (Ldexc: codetree), CodeTree), ("rtsFunction", toMachineWord (rtsFunction: int->codetree), Int ->> CodeTree) ] end local (* Finish off the NameSpace structure now we have types such as pretty. *) open TYPETREE (* The exported versions expect full name spaces as arguments. Because we convert the exported versions to machineWord and give them types as data structures the compiler can't actually check that the type we give matched the internal type. *) fun makeTypeEnv NONE = { lookupType = fn _ => NONE, lookupStruct = fn _ => NONE } | makeTypeEnv(SOME(nameSpace: nameSpace)): printTypeEnv = { lookupType = fn s => case #lookupType nameSpace s of NONE => NONE | SOME t => SOME(t, NONE), lookupStruct = fn s => case #lookupStruct nameSpace s of NONE => NONE | SOME t => SOME(t, NONE) } local (* Values substructure. This also has operations related to type expressions. *) fun codeForValue (Value{access = Global code, class = ValBound, ...}) = code | codeForValue _ = raise Fail "Not a global value" and exportedDisplayTypeExp(ty, depth, nameSpace: nameSpace option) = TYPETREE.display(ty, depth, makeTypeEnv nameSpace) and exportedDisplayValues(valu, depth, nameSpace: nameSpace option) = displayValues(valu, depth, makeTypeEnv nameSpace) and propsForValue (Value {locations, typeOf, ...}) = PTtype typeOf :: mapLocationProps locations fun isConstructor (Value{class = Exception, ...}) = true | isConstructor (Value{class = Constructor _, ...}) = true | isConstructor _ = false fun isException (Value{class = Exception, ...}) = true | isException _ = false in val () = applyList (fn (name, v, t) => #enterVal valuesEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord (valName: values -> string), valueVal ->> String), ("print", toMachineWord (printValues: values * int -> pretty), mkProductType[valueVal, Int] ->> PrettyType), ("printWithType", toMachineWord (exportedDisplayValues: values * int * nameSpace option -> pretty), mkProductType[valueVal, Int, Option nameSpaceType] ->> PrettyType), ("printType", toMachineWord(exportedDisplayTypeExp: types * int * nameSpace option -> pretty), mkProductType[Types, Int, Option nameSpaceType] ->> PrettyType), ("typeof", toMachineWord (valTypeOf: values -> types), valueVal ->> Types), ("code", toMachineWord (codeForValue: values -> codetree), valueVal ->> CodeTree), ("properties", toMachineWord (propsForValue: values ->ptProperties list), valueVal ->> List PtProperties), ("isConstructor", toMachineWord(isConstructor: values -> bool), valueVal ->> Bool), ("isException", toMachineWord(isException: values -> bool), valueVal ->> Bool) ] end local (* TypeConstrs substructure. *) fun exportedDisplayTypeConstr(tyCons, depth, nameSpace: nameSpace option) = TYPETREE.displayTypeConstrs(tyCons, depth, makeTypeEnv nameSpace) and propsForTypeConstr (TypeConstrSet(TypeConstrs {locations, ...}, _)) = mapLocationProps locations and nameForType (TypeConstrSet(TypeConstrs{name, ...}, _)) = name in val () = applyList (fn (name, v, t) => #enterVal typesEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord(nameForType: typeConstrSet -> string), typeVal ->> String), ("print", toMachineWord (exportedDisplayTypeConstr: typeConstrSet * int * nameSpace option -> pretty), mkProductType[typeVal, Int, Option nameSpaceType] ->> PrettyType), ("properties", toMachineWord (propsForTypeConstr: typeConstrSet ->ptProperties list), typeVal ->> List PtProperties) ] end local (* Structures substructure *) fun exportedDisplayStructs(str, depth, nameSpace: nameSpace option) = displayStructures(str, depth, makeTypeEnv nameSpace) and codeForStruct (Struct{access = Global code, ...}) = code | codeForStruct _ = raise Fail "Not a global structure" and propsForStruct (Struct {locations, ...}) = mapLocationProps locations and nameForStruct (Struct{name, ...}) = name in val () = applyList (fn (name, v, t) => #enterVal structsEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord(nameForStruct: structVals -> string), structureVal ->> String), ("print", toMachineWord (exportedDisplayStructs: structVals * int * nameSpace option -> pretty), mkProductType[structureVal, Int, Option nameSpaceType] ->> PrettyType), ("code", toMachineWord (codeForStruct: structVals -> codetree), structureVal ->> CodeTree), ("properties", toMachineWord (propsForStruct: structVals ->ptProperties list), structureVal ->> List PtProperties) ] end local (* Signatures substructure *) fun exportedDisplaySigs(sign, depth, nameSpace: nameSpace option) = displaySignatures(sign, depth, makeTypeEnv nameSpace) and propsForSig (Signatures {locations, ...}) = mapLocationProps locations and nameForSig (Signatures{name, ...}) = name in val () = applyList (fn (name, v, t) => #enterVal sigsEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord(nameForSig: signatures -> string), signatureVal ->> String), ("print", toMachineWord (exportedDisplaySigs: signatures * int * nameSpace option -> pretty), mkProductType[signatureVal, Int, Option nameSpaceType] ->> PrettyType), ("properties", toMachineWord (propsForSig: signatures ->ptProperties list), signatureVal ->> List PtProperties) ] end local (* Functors substructure *) fun exportedDisplayFunctors(funct, depth, nameSpace: nameSpace option) = displayFunctors(funct, depth, makeTypeEnv nameSpace) and codeForFunct (Functor{access = Global code, ...}) = code | codeForFunct _ = raise Fail "Not a global functor" and propsForFunctor (Functor {locations, ...}) = mapLocationProps locations and nameForFunctor (Functor{name, ...}) = name in val () = applyList (fn (name, v, t) => #enterVal functsEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord(nameForFunctor: functors -> string), functorVal ->> String), ("print", toMachineWord (exportedDisplayFunctors: functors * int * nameSpace option -> pretty), mkProductType[functorVal, Int, Option nameSpaceType] ->> PrettyType), ("code", toMachineWord (codeForFunct: functors -> codetree), functorVal ->> CodeTree), ("properties", toMachineWord (propsForFunctor: functors ->ptProperties list), functorVal ->> List PtProperties) ] end local (* Infixes substructure *) fun nameForFix(FixStatus(s, _)) = s in val () = applyList (fn (name, v, t) => #enterVal fixesEnv (name, mkGvar (name, t, mkConst v, declInBasis))) [ ("name", toMachineWord(nameForFix: fixStatus -> string), fixityVal ->> String), ("print", toMachineWord (displayFixStatus: fixStatus -> pretty), fixityVal ->> PrettyType) ] end in end in () end (* initGlobalEnv *); end; polyml-5.6/mlsource/MLCompiler/Initialise.ML000066400000000000000000000025671265146633400211040ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Initialise = INITIALISE_ ( structure LEX = Lex structure TYPETREE = TypeTree structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure CODETREE = CodeTree structure ADDRESS = Address structure DEBUG = Debug structure MAKE = Make structure MISC = Misc structure DEBUGGER = Debugger structure VERSION = CompilerVersion structure PRETTY = Pretty structure EXPORTTREE = ExportTreeStruct structure DATATYPEREP = DatatypeRep structure TYPEIDCODE = TypeIDCodeStruct ); polyml-5.6/mlsource/MLCompiler/LEXSIG.sml000066400000000000000000000057131265146633400202640ustar00rootroot00000000000000(* Copyright (c) 2009, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature LEXSIG = (*****************************************************************************) (* LEX export signature *) (*****************************************************************************) sig type lexan; type sys; type pretty; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val insymbol: lexan -> unit; (* insymbol sets sy and id which are exported as "read-only" *) val sy: lexan -> sys; val id: lexan -> string; val location: lexan -> location; val pushBackSymbol: lexan * sys -> unit; val initial: (unit -> char option) * Universal.universal list -> lexan; (* Error handling *) val reportError: lexan -> { location: location, hard: bool, message: pretty, context: pretty option } -> unit (* Simple error message. *) val errorMessage: lexan * location * string -> unit (* Simple warning message. *) val warningMessage: lexan * location * string -> unit val errorOccurred: lexan -> bool; val nullLex: lexan; (* Used when no errors are expected - streams raise exceptions. *) (* To save passing an extra argument to many functions we include the debug/control parameters here. *) val debugParams: lexan -> Universal.universal list (* This is also not really part of the lexical analyser. *) val newBindingId: lexan -> int val errorDepth: lexan -> int (* Print error and warning messages. *) val errorMessageProcTag: ({ location: location, hard: bool, message: pretty, context: pretty option } -> unit) Universal.tag (* A null location *) val nullLocation: location (* Construct the location that starts at the start of the first location and ends at the end of the second. Used to combine the locations of individual lexical units into a location for a larger syntactic unit. *) val locSpan: location * location -> location (* Types that can be shared. *) structure Sharing: sig type pretty = pretty and lexan = lexan and sys = sys end end (* LEX export signature *); polyml-5.6/mlsource/MLCompiler/LEX_.ML000066400000000000000000000575041265146633400176020ustar00rootroot00000000000000(* Original Poly version: Title: Lexical Analyser. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 ML translation and other changes: Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor LEX_ ( structure PRETTY: PRETTYSIG structure SYMBOLS : SymbolsSig structure DEBUG: DEBUGSIG ) : LEXSIG = (*****************************************************************************) (* LEX functor body *) (*****************************************************************************) struct open Misc; open PRETTY; open SYMBOLS; infix 8 eq neq; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type lexan = { stream: unit -> char option, ch: char ref, sy: sys ref, id: string ref, messageOut: { location: location, hard: bool, message: pretty, context: pretty option } -> unit, errors: bool ref, pushedSym: sys ref, extraChars: char list ref, debugParams: Universal.universal list, (* Location information. *) getLineNo: unit -> int, getOffset: unit -> int, fileName: string, startLine: int ref, endLine: int ref, startPosition: int ref, endPosition: int ref, bindingCounter: unit -> int }; (* The lexical analyser reads characters from the stream and updates the references in the lexan structure. That's not perhaps very ML-like but the lexical analyser can be a hot-spot in the compiler unless it's made as fast as possible. *) val eofChar = Char.chr 4; (* ctrl/D *) val isNumeric = Char.isDigit and isAlphabetic = Char.isAlpha and isWhiteSpace = Char.isSpace and isHexadecimal = Char.isHexDigit (* For our purposes we include quote and underscore. *) fun isAlphaNumeric c = Char.isAlphaNum c orelse c = #"'" orelse c = #"_" (* Print error and warning messages. *) val errorMessageProcTag: ({ location: location, hard: bool, message: pretty, context: pretty option } -> unit) Universal.tag = Universal.tag() val isOperator = Char.contains ":=<>+*!^/|&%~-?`@\\$#"; (* The initial state looks like we've just processed a complete ML declaration *) fun initial (stream, parameters) : lexan = let open DEBUG val errorMessageProc = case List.find (Universal.tagIs errorMessageProcTag) parameters of SOME f => Universal.tagProject errorMessageProcTag f | NONE => fn _ => raise Fail "Error in source code" val lineno = getParameter lineNumberTag parameters val offset = getParameter offsetTag parameters val filename = getParameter fileNameTag parameters val initialLine = lineno() (* Before the first char. *) and initialOffset = offset() val bindingCounter = getParameter bindingCounterTag parameters in { stream = stream, ch = ref #" ", (* " " - we've just "clobbered the ";" *) sy = ref Semicolon, (* ";" *) id = ref "", messageOut = errorMessageProc, errors = ref false, pushedSym = ref Othersy, extraChars = ref [], debugParams = parameters, getLineNo = lineno, getOffset = offset, fileName = filename, startLine = ref initialLine, endLine = ref initialLine, startPosition = ref initialOffset, endPosition = ref initialOffset, bindingCounter = bindingCounter } end val nullLex = initial (fn () => NONE, []); (* Error messages *) fun errorOccurred ({errors, ...}: lexan) = ! errors; fun location ({fileName, startLine, endLine, startPosition, endPosition,...}:lexan) = { file = fileName, startLine = !startLine, endLine = !endLine, startPosition = !startPosition, endPosition = !endPosition} fun reportError ({messageOut,errors,...} : lexan) (report as { hard, ...}) = ( (* If this is a hard error we have to set the flag to prevent further passes. *) if hard then errors := true else (); messageOut report ) (* Record the position of the current symbol. This sets the start for the current symbol to the last recorded end and sets the new end to the current position. *) fun setSymbolStart {getLineNo, getOffset, startLine, endLine, startPosition, endPosition, ...} = let val line = getLineNo() and offset = getOffset() in startLine := ! endLine; endLine := line; startPosition := ! endPosition; endPosition := offset end fun setSymbolEnd {getLineNo, getOffset, endLine, endPosition, ...} = let val line = getLineNo() and offset = getOffset() in endLine := line; endPosition := offset end (* Convert a piece of text into a series of words so that the pretty printing can break it into lines. *) fun breakWords str = let val words = String.tokens Char.isSpace str fun addBreaks [] = [PrettyString ""] (* Shouldn't happen *) | addBreaks [last] = [PrettyString last] | addBreaks (hd :: tl) = PrettyString hd :: PrettyBreak(1, 0) :: addBreaks tl in addBreaks words end (* Simple string error messages. *) fun errorMessage (lexan, location, message) = reportError lexan { location = location, message = PrettyBlock(3, false, [], breakWords message), hard = true, context = NONE } and warningMessage (lexan, location, message) = reportError lexan { location = location, message = PrettyBlock(3, false, [], breakWords message), hard = false, (* Just a warning *) context = NONE } (* Errors within the lexer. *) fun lexError(state, text) = ( setSymbolEnd state; errorMessage (state, location state, text) ) exception EndOfLine; (* "ch" contains the next character in the stream. extraChars is a hack that is needed to deal with a number that looks like it might be a real number but actually isn't. *) fun nextCh({ch, stream, extraChars = ref [], ...}) = ch := getOpt(stream(), eofChar) | nextCh({ch, extraChars = extra as ref(c::l), ...}) = (extra := l; ch := c) (* Skip over white space. If we have to skip we record this as the END of the previous symbol. If it turns out that the character is actually the start of a symbol then this will be set as the START by setSymbolStart. *) fun skipWhiteSpace (state as {ch = ref c, ...}:lexan) : char = if isWhiteSpace c then (setSymbolEnd state; nextCh state; skipWhiteSpace state) else c (* Leave string construction until we have all the characters. Since Single character strings are the same as single characters it doesn't cost anything to apply "str" but it allows us to conatenate with any prefix string in one go. *) fun readChars (state as { ch, ... }) (isOk: char -> bool) (s: string) : string = let fun loop (): string list = let val theChar = ! ch; in if isOk theChar then (setSymbolEnd state; nextCh state; str theChar :: loop ()) else [] end; in concat (s :: loop ()) end; (* Read in a number. *) fun parseNumber (hasMinus, state as { sy, id, ch, extraChars, ... }) = ( sy := IntegerConst; (* Copy digits into the buffer. *) id := readChars state isNumeric ""; (* May be the end of an integer, part of a real number, or w for word or x for hex. *) (* Since "0" is a valid integer what follows it is only treated as part of the integer if it is well-formed. If it is not we return the "0" as an integer constant and leave the rest to be returned. In particular that means that 0wxz is the INTEGER constant "0" followed by the identifier "wxz". N.B. ~0w1 is ~0 w1 because word constants cannot begin with ~. *) if not hasMinus andalso !ch = #"w" andalso !id = "0" then (* word constant; if it's well formed. *) ( nextCh state; if !ch = #"x" then ( nextCh state; if isHexadecimal (!ch) then ( sy := WordConst; id := readChars state isHexadecimal "0wx" ) else (extraChars := [#"x", !ch]; ch := #"w") ) else if isNumeric (!ch) then ( sy := WordConst; id := readChars state isNumeric "0w" ) else (extraChars := [!ch]; ch := #"w") ) else if !ch = #"x" andalso !id = "0" then (* Hexadecimal integer constant. *) ( nextCh state; if isHexadecimal (!ch) then id := readChars state isHexadecimal "0x" else (extraChars := [!ch]; ch := #"x") ) else if !ch = #"." orelse !ch = #"E" orelse !ch = #"e" (* "e" is allowed in ML97 *) then (* possible real constant. *) ( if !ch = #"." then ( sy := RealConst; (* Add the "." to the string. *) id := !id ^ "."; nextCh state; (* Must be followed by at least one digit. *) if not (isNumeric (!ch)) then lexError(state, "malformed real number: " ^ !id ^ str(!ch)) else id := readChars state isNumeric (!id) ) else (); (* There's a nasty here. We may actually have 1e~; which should (probably) be treated as 1 e ~ ; That means that if after we've read the e and possible ~ we find that the next character is not a digit we return the number read so far and leave the e, ~ and whatever character we found to be read next time. *) if !ch = #"E" orelse !ch = #"e" then let val eChar = !ch in nextCh state; (* May be followed by a ~ *) (* If it's followed by a digit we have an exponent otherwise we have a number followed by a identifier. In that case we have to leave the identifier until the next time we're called. *) if !ch = #"~" then ( nextCh state; if isNumeric(!ch) then (sy := RealConst; id := readChars state isNumeric (!id ^ "E~")) else (extraChars := [#"~", !ch]; ch := eChar) ) else ( if isNumeric(!ch) then (sy := RealConst; id := readChars state isNumeric (!id ^ "E")) else (extraChars := [!ch]; ch := eChar) ) end else () ) else () ); fun parseString (state as { ch, id, ... }) = let (* The original version of this simply concatenated the characters onto "id". For very long strings that's expensive since each concatenation copies the existing string, resulting in quadratic performance. This version creates a list and then implodes it. DCJM 24/5/02. *) fun getString (soFar: char list) = ( case !ch of #"\"" (* double-quote. *) => (* Finished - return result. *) (setSymbolEnd state; nextCh state; soFar) | #"\n" => (setSymbolEnd state; nextCh state; raise EndOfLine) | #"\\" => (* Escape *) let val _ = nextCh state; (* Skip the escape char. *) val next = !ch; (* Look at the next char. *) val _ = nextCh state; in (* Remove \f...\ sequences but otherwise leave the string as it is. Escape sequences are processed in the conversion function. In particular we can only decide whether \uxxxx is valid when we know whether we are converting to Ascii or Unicode. *) if isWhiteSpace next then ( if skipWhiteSpace state = #"\\" then () else ( lexError(state, "unexpected character " ^ String.toString (str (!ch)) ^" in \\ ... \\"); while !ch <> #"\\" andalso !ch <> #"\"" andalso !ch <> eofChar do nextCh state ); nextCh state; getString soFar ) else if next = #"^" (* \^c escape sequence for Control+c *) then let val next2 = !ch; val _ = nextCh state; in getString (next2 :: #"^" :: #"\\" :: soFar) end else getString (next :: #"\\" :: soFar) end | ch => (* Anything else *) ( nextCh state; if ch = eofChar then raise EndOfLine else if Char.isPrint ch (* Ok if it's printable. *) then getString (ch :: soFar) else (* Report unprintable characters. *) ( lexError(state, "unprintable character " ^ Char.toString ch ^ " found in string"); getString soFar ) ) ) in nextCh state; (* Skip the opening quote. *) id := String.implode(List.rev(getString [])) handle EndOfLine => lexError(state, "no matching quote found on this line") end (* parseString *) (* parseComment deals with nested comments. Returns with !ch containing the first character AFTER the comment. *) fun parseComment (state as { stream, ch, ... }) = let (* skipComment is called after we've already seen the "(" and "*", and returns the first chararacter AFTER the comment. *) fun skipComment () : char = let (* Returns the first chararacter AFTER the comment *) fun skipCommentBody (firstCh : char) : char = if firstCh = eofChar then ( setSymbolEnd state; lexError(state, "end of file found in comment"); firstCh ) else case (firstCh, getOpt(stream (), eofChar)) of (#"*", #")") => getOpt(stream (), eofChar) (* End of comment - return next ch. *) | (#"(", #"*") => skipCommentBody (skipComment ()) (* Nested comment. *) | (_, nextCh) => skipCommentBody nextCh in skipCommentBody (getOpt(stream (), eofChar)) (* Skip the initial "*" *) end; (* skipComment *) in ch := skipComment () end (* parseComment *); (* Sets "id" and "sy" if an identifier is read. Looks up a word to see if it is reserved. *) fun parseIdent (state as { ch, id, sy, ... }) charsetTest first (* any characters read so far *) = let val idVal = readChars state charsetTest first; in (* Qualified names may involve fields of different lexical form e.g. A.B.+ *) if !ch = #"." (* May be qualified *) then let val () = nextCh state; val c = !ch; in if isAlphabetic c then parseIdent state isAlphaNumeric (idVal ^ ".") else if isOperator c then parseIdent state isOperator (idVal ^ ".") else lexError(state, "invalid identifer - "^ idVal ^ "." ^ str c) end else ( id := idVal; sy := (if 0 < size idVal andalso String.str(String.sub(idVal, 0)) = "'" then TypeIdent else lookup idVal) ) end; (* parseIdent *) (* Main lexical analyser loop. *) fun parseToken (state as { ch, id, sy, ... }) = let val nextSym = skipWhiteSpace state (* remove leading spaces *) in setSymbolStart state; (* Set the start to the previous end and the end to after this. *) case nextSym of #"~" => (* Either an operator or part of a number. *) ( nextCh state;(* get next character *) if isNumeric (!ch) then ( (* Read the number and sets sy to integerConst. *) parseNumber(true, state); (* Prepend the "~" to the num *) id := "~" ^ !id ) else (* Part of an operator. *) parseIdent state isOperator "~" ) | #"#" =>(* Either an operator, which include a field selection or a character constant. N.B. It is not absolutely clear whether any separator is allowed between # and the following string constant. Assume that it isn't for the moment. *) ( nextCh state;(* get next character *) if !ch = #"\"" then (parseString state; sy := CharConst) else (* Part of an operator. *) parseIdent state isOperator "#" ) | #"\"" (* double quote. *) => (parseString state; sy := StringConst) | #";" => ( sy := Semicolon; (* This is a special case. If this is the final semicolon in the top-dec we mustn't read the next character because that will be put into "ch" field of this lex object and will then be discarded. Instead we clobber this with a space so that the normal space-skipping case will apply. *) ch := #" " ) | #"," => (sy := Comma; nextCh state) | #"(" => ( nextCh state; if !ch <> #"*" then sy := LeftParen else parseComment state ) | #")" => (sy := RightParen; nextCh state) | #"[" => (sy := LeftBrack; nextCh state) | #"]" => (sy := RightBrack; nextCh state) | #"_" => (sy := Underline; nextCh state) | #"{" => (sy := LeftCurly; nextCh state) | #"}" => (sy := RightCurly; nextCh state) | #"." => (* "..." *) ( nextCh state; if !ch <> #"." then lexError(state, "unknown symbol ." ^ str(!ch)) else ( setSymbolEnd state; nextCh state; if !ch <> #"." then lexError(state, "unknown symbol .." ^ str(!ch)) else (sy := ThreeDots; setSymbolEnd state; nextCh state) ) ) | firstCh => (* These can't be so easily incorporated into a "case". *) if firstCh = eofChar then sy := AbortParse else if isNumeric firstCh then parseNumber(false, state) else if isAlphabetic firstCh orelse firstCh = #"'" then parseIdent state isAlphaNumeric "" else if isOperator firstCh (* excludes ~ which has already been done *) then parseIdent state isOperator "" else let (* illegal character *) val printableFirstCh = Char.toString firstCh in (* Report the character. *) lexError(state, "unknown character \"" ^ printableFirstCh ^ "\""); nextCh state end; (* Read another token if this wasn't recognised. *) if (!sy = Othersy) then parseToken state else () end; (* parseToken *) (* Insymbol - exported interface to lexical analyser. *) fun insymbol (state as {sy,pushedSym,...}:lexan) = if ! pushedSym <> Othersy then pushedSym := Othersy (* pushedSym is a hack to handle the difficulty of parsing val ('a, 'b) f = ... compared with val (a, b) = ... and the similar fun declarations. It's also used to handle where type t = int and type ... compared with where type t = int and S = sig ...*) else ( if ! sy = AbortParse (* already end-of-file? *) then ( setSymbolStart state; lexError(state, "unexpected end of file encountered"); raise InternalError "end of file" ) else (); sy := Othersy; (* default - anything unrecognisable *) parseToken state ); (* insymbol *) fun pushBackSymbol ({pushedSym,...}:lexan, sym) = (* TODO: This does not restore the location so parses such as val () = ... get the wrong location for the opening parenthesis. *) if !pushedSym <> Othersy then raise InternalError "Attempt to push two parentheses" else pushedSym := sym (* exported version of sy and id. *) fun sy ({sy=ref sy, pushedSym = ref pushed, ...}:lexan) = if pushed <> Othersy then pushed else sy; fun id ({id=ref id,...}:lexan) = id; val debugParams = #debugParams fun newBindingId({bindingCounter, ...}: lexan) = bindingCounter() val nullLocation: location = { file="", startLine=0, startPosition=0, endLine=0, endPosition=0 } (* Construct the location that includes all the locations in the list. Used to combine the locations of individual lexical units into a location for a larger syntactic unit. *) fun locSpan ({ file, startLine, startPosition, ... }: location, { endLine, endPosition, ... }: location) = { file=file, startLine=startLine, startPosition=startPosition, endLine=endLine, endPosition=endPosition } fun errorDepth{debugParams, ...} = DEBUG.getParameter DEBUG.errorDepthTag debugParams structure Sharing = struct type pretty = pretty and lexan = lexan and sys = sys end end (* LEX functor body *); polyml-5.6/mlsource/MLCompiler/Lex.ML000066400000000000000000000017131265146633400175320ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Lex = LEX_ ( structure PRETTY = Pretty structure SYMBOLS = Symbols structure DEBUG = Debug ); polyml-5.6/mlsource/MLCompiler/MAKE_.ML000066400000000000000000000371751265146633400176710ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008-9, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Poly Make Program. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This previously contained PolyML.make which was passed through to the basis. It has now been reduced to just "use" and is only used during the bootstrap process to compile the basis library itself. *) functor MAKE_ ( structure COMPILERBODY : COMPILERBODYSIG structure UNIVERSALTABLE : sig type 'a tag = 'a Universal.tag; type univTable; type universal = Universal.universal val makeUnivTable: unit -> univTable val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; val univDelete: univTable * 'a tag * string -> unit; val fold: (string * universal * 'a -> 'a) -> 'a -> univTable -> 'a end; structure STRUCTVALS : STRUCTVALSIG; structure DEBUG: DEBUGSIG structure PRETTY: PRETTYSIG (* For compilerOutputTag *) structure LEX: LEXSIG (* For errorMessageProcTag *) structure VERSION: sig val versionSuffix: string end sharing STRUCTVALS.Sharing = COMPILERBODY.Sharing sharing LEX.Sharing = PRETTY.Sharing ) : sig type env type gEnv type values; type typeConstrSet; type fixStatus; type structVals; type signatures; type functors; type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list }; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type exportTree val compiler : nameSpace * (unit->char option) * Universal.universal list -> exportTree option * ( unit -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string * typeConstrSet) list }) option val makeGEnv : unit -> gEnv val gEnvAsEnv : gEnv -> env val gEnvAsNameSpace: gEnv -> nameSpace val useIntoEnv : gEnv -> Universal.universal list -> string -> unit val useStringIntoEnv: gEnv -> string -> unit val shellProc : gEnv -> unit -> unit (* The command processor *) end = let in (*****************************************************************************) (* MAKE functor body *) (*****************************************************************************) struct type univTable = UNIVERSALTABLE.univTable; type values = STRUCTVALS.values type typeConstrs = STRUCTVALS.typeConstrs type fixStatus = STRUCTVALS.fixStatus type structVals = STRUCTVALS.structVals type signatures = STRUCTVALS.signatures type functors = STRUCTVALS.functors type env = STRUCTVALS.env open COMPILERBODY local open UNIVERSALTABLE open Thread.Thread open Thread.Mutex in (* Create an environment with a mutex to protect concurrent access. *) datatype gEnv = DbEnv of mutex * univTable (* Lock the mutex during any lookup or entry. This is primarily to avoid the underlying hash table from being rehashed by different threads at the same time. This code should be in a library. *) fun protect mutx f = let (* Turn off interrupts while we have the lock. *) val oldAttrs = getAttributes() val () = setAttributes[InterruptState InterruptDefer] val () = lock mutx val result = f() handle exn => (unlock mutx; setAttributes oldAttrs; raise exn) in unlock mutx; setAttributes oldAttrs; result end (* Create an environment *) fun makeGEnv () : gEnv = DbEnv (mutex(), makeUnivTable()); (* enter a value into an environment *) fun dbEnvEnter (DbEnv(mutx, db)) (t : 'a tag) (s : string, v : 'a) : unit = protect mutx (fn () => univEnter (db, t, s, v)) (* find a value in an environment *) fun dbEnvLookup (DbEnv(mutx, db)) (t : 'a tag) (s : string) : 'a option = protect mutx(fn () => univLookup (db, t, s)) fun dbEnvAll (DbEnv(mutx, db)) (t : 'a tag) () : (string * 'a) list = let open Universal UNIVERSALTABLE fun filter (s, c, l) = if tagIs t c then (s, tagProject t c) :: l else l in protect mutx (fn () => fold filter [] db) end fun gEnvAsEnv gEnv = STRUCTVALS.Env { lookupFix = dbEnvLookup gEnv STRUCTVALS.fixVar, lookupVal = dbEnvLookup gEnv STRUCTVALS.valueVar, lookupType = dbEnvLookup gEnv STRUCTVALS.typeConstrVar, lookupSig = dbEnvLookup gEnv STRUCTVALS.signatureVar, lookupStruct = dbEnvLookup gEnv STRUCTVALS.structVar, lookupFunct = dbEnvLookup gEnv STRUCTVALS.functorVar, enterFix = dbEnvEnter gEnv STRUCTVALS.fixVar, enterVal = dbEnvEnter gEnv STRUCTVALS.valueVar, enterType = dbEnvEnter gEnv STRUCTVALS.typeConstrVar, enterSig = dbEnvEnter gEnv STRUCTVALS.signatureVar, enterStruct = dbEnvEnter gEnv STRUCTVALS.structVar, enterFunct = dbEnvEnter gEnv STRUCTVALS.functorVar, allValNames = fn () => map #1 (dbEnvAll gEnv STRUCTVALS.valueVar ()) }; fun gEnvAsNameSpace gEnv: nameSpace = { lookupFix = dbEnvLookup gEnv STRUCTVALS.fixVar, lookupVal = dbEnvLookup gEnv STRUCTVALS.valueVar, lookupType = dbEnvLookup gEnv STRUCTVALS.typeConstrVar, lookupSig = dbEnvLookup gEnv STRUCTVALS.signatureVar, lookupStruct = dbEnvLookup gEnv STRUCTVALS.structVar, lookupFunct = dbEnvLookup gEnv STRUCTVALS.functorVar, enterFix = dbEnvEnter gEnv STRUCTVALS.fixVar, enterVal = dbEnvEnter gEnv STRUCTVALS.valueVar, enterType = dbEnvEnter gEnv STRUCTVALS.typeConstrVar, enterSig = dbEnvEnter gEnv STRUCTVALS.signatureVar, enterStruct = dbEnvEnter gEnv STRUCTVALS.structVar, enterFunct = dbEnvEnter gEnv STRUCTVALS.functorVar, allFix = dbEnvAll gEnv STRUCTVALS.fixVar, allVal = dbEnvAll gEnv STRUCTVALS.valueVar, allType = dbEnvAll gEnv STRUCTVALS.typeConstrVar, allSig = dbEnvAll gEnv STRUCTVALS.signatureVar, allStruct = dbEnvAll gEnv STRUCTVALS.structVar, allFunct = dbEnvAll gEnv STRUCTVALS.functorVar }; end; (*****************************************************************************) (* useIntoEnv (runcompiler with ML compiler bound in) *) (*****************************************************************************) fun compileIntoEnv (globalEnv : gEnv) : (string * TextIO.instream * Universal.universal list) -> unit = let val useEnv : nameSpace = { lookupFix = dbEnvLookup globalEnv STRUCTVALS.fixVar, lookupVal = dbEnvLookup globalEnv STRUCTVALS.valueVar, lookupType = dbEnvLookup globalEnv STRUCTVALS.typeConstrVar, lookupSig = dbEnvLookup globalEnv STRUCTVALS.signatureVar, lookupStruct = dbEnvLookup globalEnv STRUCTVALS.structVar, lookupFunct = dbEnvLookup globalEnv STRUCTVALS.functorVar, enterFix = dbEnvEnter globalEnv STRUCTVALS.fixVar, enterVal = dbEnvEnter globalEnv STRUCTVALS.valueVar, enterType = dbEnvEnter globalEnv STRUCTVALS.typeConstrVar, enterStruct = dbEnvEnter globalEnv STRUCTVALS.structVar, enterSig = dbEnvEnter globalEnv STRUCTVALS.signatureVar, enterFunct = dbEnvEnter globalEnv STRUCTVALS.functorVar, allFix = dbEnvAll globalEnv STRUCTVALS.fixVar, allVal = dbEnvAll globalEnv STRUCTVALS.valueVar, allType = dbEnvAll globalEnv STRUCTVALS.typeConstrVar, allSig = dbEnvAll globalEnv STRUCTVALS.signatureVar, allStruct = dbEnvAll globalEnv STRUCTVALS.structVar, allFunct = dbEnvAll globalEnv STRUCTVALS.functorVar }; fun use (fileName, inStream, parameters) = let val lineNo = ref 1; val eof = ref false; fun getChar () : char option = case TextIO.input1 inStream of eoln as SOME #"\n" => ( lineNo := !lineNo + 1; eoln ) | NONE => (eof := true; NONE) | c => c fun errorProc {message, hard, location={ file, startLine=line, ... }, ...} = TextIO.print(concat [if hard then "Error-" else "Warning-", " in '", file, "', line ", Int.toString line, ".\n", PRETTY.uglyPrint message, "\n"]) in ( while not (! eof) do let open DEBUG Universal (* Compile the code *) val code = case COMPILERBODY.compiler (useEnv, getChar, parameters @ (* These will be found first and override the defaults. *) [ tagInject traceCompilerTag true, tagInject PRETTY.compilerOutputTag (PRETTY.prettyPrint(print, 70)), tagInject lineNumberTag (fn () => !lineNo), tagInject fileNameTag fileName, tagInject LEX.errorMessageProcTag errorProc, tagInject maxInlineSizeTag 80, tagInject reportUnreferencedIdsTag true, tagInject reportExhaustiveHandlersTag false, (* True for testing. *) (* These are only needed for debugging. *) tagInject PRETTY.printOutputTag (PRETTY.prettyPrint(print, 70)), tagInject printDepthFunTag(fn () => 20), tagInject parsetreeTag false, tagInject codetreeTag false, tagInject codetreeAfterOptTag false, tagInject pstackTraceTag false, tagInject assemblyCodeTag false ] ) of (_, NONE) => raise Fail "Static Errors" | (_, SOME c) => c (* execute the code and get the resulting declarations. *) val { fixes, values, structures, signatures, functors, types } = PolyML.exception_trace code in (* Just enter the values in the environment without printing. *) List.app (#enterFix useEnv) fixes; List.app (#enterVal useEnv) values; List.app (#enterStruct useEnv) structures; List.app (#enterSig useEnv) signatures; List.app (#enterFunct useEnv) functors; List.app (#enterType useEnv) types end ) handle Fail s => (* E.g. syntax error. *) ( TextIO.closeIn inStream; raise Fail s ) | exn => (* close inStream if an error occurs *) ( print ("Exception- " ^ General.exnName exn ^ " raised\n"); TextIO.closeIn inStream; raise exn ) end (* use *) in use end; (* scope of compileIntoEnv *) fun useIntoEnv globalEnv parameters baseName = let val () = print ("Use: " ^ baseName ^ "\n") (* See if there is a path given as a command line argument. *) val args = CommandLine.arguments(); (* If we have -I filename use that as the output name. N.B. polyImport takes the first argument that is not recognised as an RTS argument and treats that as the file name so any -I must occur AFTER the import file. *) fun getPath [] = "." (* Default path *) | getPath ("-I" :: path :: _) = path | getPath (_::tl) = getPath tl open OS.Path (* Add the path to the source on to the directory. *) val filePath = concat(getPath args, baseName) open VERSION (* See if we have a version of the file specific to this version of the compiler. For x.ML see if x.VER.ML exists. When bootstrapping from one version of the compiler to another we need to compile the basis library in both the old and new compiler. If the interface has changed we may need version-specific files. *) val { base, ext } = splitBaseExt filePath val versionName = joinBaseExt { base = joinBaseExt{base = base, ext = SOME versionSuffix}, ext = ext } val (inStream, fileName) = (TextIO.openIn versionName, versionName) handle IO.Io _ => (TextIO.openIn filePath, filePath) in compileIntoEnv globalEnv (fileName, inStream, parameters); TextIO.closeIn inStream end fun shellProc globalEnv () = compileIntoEnv globalEnv ("", TextIO.stdIn, []) fun useStringIntoEnv globalEnv str = compileIntoEnv globalEnv (str, TextIO.openString str, []) end (* MAKE *) end; (* structure-level let *) polyml-5.6/mlsource/MLCompiler/Make.ML000066400000000000000000000021771265146633400176640ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Make = MAKE_ ( structure STRUCTVALS = StructVals; structure LEX = Lex; structure COMPILERBODY = CompilerBody; structure MISC = Misc; structure UNIVERSALTABLE = UniversalTable structure DEBUG = Debug structure PRETTY = Pretty structure VERSION = CompilerVersion ); polyml-5.6/mlsource/MLCompiler/PARSETREESIG.sml000066400000000000000000000173501265146633400211660ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-9, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature PARSETREESIG = sig type types; type infixity; type lexan; type pretty; type typeId; type typeVarMap type codetree; type env; type typeConstrs; type typeVarForm type values; type structVals; type environEntry; type structureIdentForm; type typeParsetree type funpattern type codeBinding type level type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type ptProperties type exportTree = location * ptProperties list type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} type typeIdDescription = { location: location, name: string, description: string } (* An identifier is just a name. In the second pass it is associated with a particular declaration and the type is assigned into the type field. The type of this identifier is needed to deal with overloaded operators. If we have an occurence of ``='', say, the type of the value will be 'a * 'a -> bool but the type of a particular occurence, i.e. the type of the identifier must be int * int -> bool, say, after all the unification has been done. *) type parsetree and valbind and fvalbind and fvalclause and typebind and datatypebind and exbind and labelRecEntry and matchtree; val isIdent : parsetree -> bool; val mkIdent : string * location -> parsetree; val mkString : string * location -> parsetree; val mkInt : string * location -> parsetree; val mkReal : string * location -> parsetree; val mkChar : string * location -> parsetree; val mkWord : string * location -> parsetree; val mkApplic : parsetree * parsetree * location * bool -> parsetree; val mkCond : parsetree * parsetree * parsetree * location -> parsetree; val mkTupleTree : parsetree list * location -> parsetree; val mkValDeclaration : valbind list * { lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit } * { lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit } * location -> parsetree; val mkFunDeclaration : fvalbind list * { lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit } * { lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit } * location -> parsetree; val mkOpenTree : structureIdentForm list * location -> parsetree; val mkStructureIdent : string * location -> structureIdentForm; val mkValBinding : parsetree * parsetree * bool * location -> valbind; val mkClausal : fvalclause list * location -> fvalbind; val mkClause : funpattern * parsetree * location -> fvalclause; val mkFunPattern: parsetree * lexan -> funpattern * string * int val mkList : parsetree list * location -> parsetree; val mkConstraint : parsetree * typeParsetree * location -> parsetree; val mkLayered : parsetree * parsetree * location -> parsetree; val mkFn : matchtree list * location -> parsetree; val mkMatchTree : parsetree * parsetree * location -> matchtree; val mkLocalDeclaration : parsetree list * parsetree list * location * bool -> parsetree; val mkTypeDeclaration : typebind list * location -> parsetree; val mkDatatypeDeclaration : datatypebind list * typebind list * location -> parsetree; val mkDatatypeReplication : { newType: string, oldType: string, newLoc: location, oldLoc: location, location: location } -> parsetree; val mkAbstypeDeclaration : datatypebind list * typebind list * parsetree list * location -> parsetree; val mkTypeBinding : string * typeVarForm list * typeParsetree option * bool * location * location -> typebind; val mkDatatypeBinding : string * typeVarForm list * {constrName: string, constrArg: typeParsetree option, idLocn: location} list * location * location -> datatypebind; val mkExBinding : string * parsetree * typeParsetree option * location * location -> exbind; val mkLabelledTree : labelRecEntry list * bool * location -> parsetree; val mkLabelRecEntry: string * location * parsetree * location -> labelRecEntry val mkSelector : string * location -> parsetree; val mkRaise : parsetree * location -> parsetree; val mkHandleTree : parsetree * matchtree list * location * location -> parsetree; val mkWhile : parsetree * parsetree * location -> parsetree; val mkCase : parsetree * matchtree list * location * location -> parsetree; val mkAndalso : parsetree * parsetree * location -> parsetree; val mkOrelse : parsetree * parsetree * location -> parsetree; val mkDirective : string list * infixity * location -> parsetree; val mkExpseq : parsetree list * location -> parsetree; val mkExDeclaration : exbind list * location -> parsetree; val mkParenthesised: parsetree * location -> parsetree val unit : location -> parsetree; val wildCard : location -> parsetree; val emptyTree : parsetree; val pass2: parsetree * (bool * bool * (typeVarForm list * types) * typeIdDescription -> typeId) * env * lexan * (int -> bool) -> types val setLeastGeneralTypes: parsetree * lexan -> unit (* Inherited from PrintAndExportParsetree *) val displayParsetree: parsetree * int -> pretty; val getExportTree: navigation * parsetree -> exportTree (* Inherited from CodegenParsetree *) type debuggerStatus val gencode: parsetree * lexan * debuggerStatus * level * (int->int) * typeVarMap * string * (codeBinding list * debuggerStatus * typeVarMap -> codeBinding list * debuggerStatus) -> codeBinding list * debuggerStatus (* Types that can be shared. *) structure Sharing: sig type lexan = lexan and pretty = pretty and environEntry = environEntry and codetree = codetree and codeBinding = codeBinding and types = types and values = values and typeId = typeId and structVals = structVals and typeConstrs= typeConstrs and typeVarForm=typeVarForm and env = env and infixity = infixity and structureIdentForm = structureIdentForm and typeParsetree = typeParsetree and parsetree = parsetree and valbind = valbind and fvalbind = fvalbind and fvalclause = fvalclause and typebind = typebind and datatypebind=datatypebind and exbind = exbind and labelRecEntry=labelRecEntry and ptProperties = ptProperties and matchtree = matchtree and typeVarMap = typeVarMap and level = level and debuggerStatus = debuggerStatus end end (* PARSETREE export signature *); polyml-5.6/mlsource/MLCompiler/PARSE_DEC.ML000066400000000000000000002751241265146633400203400ustar00rootroot00000000000000(* Copyright (c) 2000-7 Cambridge University Technical Services Limited Further Development Copyright 2009, 2015 David C.J. Matthews. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Parse Expressions and Declarations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor PARSE_DEC ( structure SYMBOLS : SymbolsSig structure SYMSET : SymsetSig structure LEX : LEXSIG structure SKIPS : sig type sys type lexan type symset type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val getsym: sys * lexan -> unit val badsyms: sys * lexan -> unit val notfound: string * lexan -> unit val skipon: symset * symset * string * lexan -> unit val getid: symset * symset * lexan -> string * location val getLabel: symset * lexan -> string * location val getList: sys * symset * lexan * (unit -> 'a * location) -> 'a list * location; end; structure STRUCTVALS : STRUCTVALSIG; structure TYPETREE : TYPETREESIG; structure PARSETREE : PARSETREESIG structure STRUCTURES : STRUCTURESSIG structure SIGNATURES: SIGNATURESSIG structure PARSETYPE : sig type symset; type lexan; type types; type typeParsetree; type typeVarForm type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val parseType: symset * lexan * {lookupTvar:string -> typeVarForm} -> typeParsetree * location; end; structure UTILITIES : sig type lexan type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option } val checkForDots: string * lexan * location -> unit val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; end; structure MISC : sig val lookupDefault : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option end; sharing STRUCTVALS.Sharing = TYPETREE.Sharing = PARSETREE.Sharing = STRUCTURES.Sharing = LEX.Sharing = SIGNATURES.Sharing = UTILITIES sharing SYMBOLS = SYMSET = SKIPS = LEX.Sharing sharing type PARSETYPE.types = STRUCTVALS.Sharing.types sharing type PARSETYPE.typeVarForm = STRUCTVALS.Sharing.typeVarForm sharing type PARSETYPE.typeParsetree = TYPETREE.typeParsetree sharing type SYMSET.symset = PARSETYPE.symset sharing type LEX.lexan = PARSETYPE.lexan ) : (*****************************************************************************) (* PARSEDEC export signature *) (*****************************************************************************) sig type lexan; type symset; type fixStatus; type program val parseDec: symset * lexan * { enterFix: string * fixStatus -> unit, lookupFix: string -> fixStatus option } -> program; end = (*****************************************************************************) (* PARSEDEC functor body *) (*****************************************************************************) struct open MISC; open SYMBOLS open SYMSET; infix 9 ++; infix 4 inside; open LEX; open SKIPS; open STRUCTVALS; open TYPETREE; open PARSETREE; open STRUCTURES; open PARSETYPE; open UTILITIES; open SIGNATURES (* constant sets defined here to reduce run-time garbage SPF 24/9/94 *) val structureLocalSy = structureSy ++ localSy; val structureLocalStartDecSy = structureSy ++ localSy ++ startDecSys; val commaRightCurlySy = comma ++ rightCurly; val declarableVarOpSy = declarableVarSys ++ opSy; val declarableVarLetSy = declarableVarSys ++ letSy; val startTypeDeclarableVarOpSy = startTypeSys ++ declarableVarOpSy; val startDecStructureSy = startDecSys ++ structureSy; val ofVerticalBarSy = ofSy ++ verticalBar; val semicolonStartDecSy = semicolon ++ startDecSys; val semicolonStartDecStructureSy = semicolonStartDecSy ++ structureSy; val commaRightBrackSy = comma ++ rightBrack; val rightParenCommaSy = rightParen ++ comma; val rightParenSemicolonSy = rightParen ++ semicolon; val rightParenSemicolonCommaSy = rightParenSemicolonSy ++ comma; val rightParenEqualsSignSy = rightParen ++ equalsSign; val colonAsSy = colon ++ asSy; val colonEqualsSignSy = colon ++ colonGt ++ equalsSign; val thenStartExpressionSy = thenSy ++ startExpressionSys; val elseStartExpressionSy = elseSy ++ startExpressionSys; val ofStartMatchSy = ofSy ++ startMatchSys; val semicolonEndSy = semicolon ++ endSy val andalsoColonSy = andalsoSy ++ colon; val withTypeWithSy = withtypeSy ++ withSy; val ofEqualsSignSy = ofSy ++ equalsSign; val inEndSy = inSy ++ endSy; val startSigEndSy = startSigSys ++ endSy; val startSigEndAndSy = startSigEndSy ++ andSy; val endAndSy = endSy ++ andSy; val semicolonStartSigSys = startSigSys ++ semicolon; val topdecStartSy = functorSy ++ signatureSy ++ structureLocalStartDecSy; fun mkLocalFixEnv {lookupFix,lookupTvar, ...} = let val newFixEnv = searchList (); in { enterFix = #enter newFixEnv, lookupFix = lookupDefault (#lookup newFixEnv) lookupFix, lookupTvar = lookupTvar } end; fun mkLocalBodyFixEnv {enterFix,lookupFix,lookupTvar} outerEnterFix = { enterFix = fn p => (enterFix p; outerEnterFix p), lookupFix = lookupFix, lookupTvar = lookupTvar } fun getLongId (kind, fsys, lex): string * location = getid (kind, fsys, lex); fun getShortId (kind, fsys, lex): string * location = let val idLoc as (iden, location) = getid (kind, fsys, lex); val () = checkForDots (iden, lex, location); in idLoc end; (* Attributes of type variables. *) fun isEqtype name = size name > 1 andalso String.str(String.sub(name, 1)) = "'"; (* Global declarations *) fun parseDec (fsys, lex, {enterFix, lookupFix}) : program = let (* These procedures to parse type declarations are used in both signature and expression parsing. *) fun getTypeVars (isDatatype, {apply,enter,...}) = let (* Optional type identifier or sequence of type identifiers. Used in type and datatype declarations and also in val and fun declarations. *) (* The type identifiers must be remembered since they will occur subsequently in the components. This is the only case where type variables are actually bound. *) fun getTypeVar (): typeVarForm * location = (* Read a type variable and return it. *) case sy lex of TypeIdent => let val iden = id lex; val locn = location lex (* Each type variable must be distinct. *) val () = apply (fn (nm,_) => if nm = iden (* Same name ? *) then errorMessage (lex, location lex, nm ^ " has already been used.") else () ); (* Construct a type variable and enter it. Equality is only set if this is a datatype (or abstype). The type variable should be non-unifiable to get value-constructor signature checking right.*) (* DCJM 11/2/00. isDatatype is now true for tyvarseqs in fun and val. I don't think it matters what it is set to in datatypes. *) val isEqtype = isDatatype andalso isEqtype iden; val tyVar = makeTv {value=emptyType, level=generalisable, equality=isEqtype, nonunifiable=true, printable=false} in enter (iden, tyVar); insymbol lex; (tyVar, locn) end | _ => ( badsyms (SYMBOLS.TypeIdent, lex); (makeTv {value=emptyType, level=generalisable, equality=true, nonunifiable=true, printable=false}, location lex) ) in (* May be one type variable or a bracketed sequence. *) case sy lex of TypeIdent => [#1(getTypeVar())] (* One type var. *) | LeftParen => (* Sequence. *) ( insymbol lex; (* There is an awkward parsing problem here if we have either val (a, b) = ... or fun (a X b) = ... We only know that we haven't got a tyvarseq once we find a symbol that isn't a tyvar. The easiest way round this is to push the parenthesis back into the lex stream and return an empty tyvarseq. *) case sy lex of TypeIdent => let val (t, _) = getList (SYMBOLS.Comma, typeIdent, lex, getTypeVar); in getsym (SYMBOLS.RightParen, lex); t end | _ => (pushBackSymbol(lex, SYMBOLS.LeftParen); [] ) ) | _ => [] (* None at all. *) end; (* getTypeVars *) fun getLongNonInfix opThere sys fsys lex {lookupFix,...} = let (* op followed by a (long) variable *) val idLoc as (id, location) = getLongId (sys, fsys, lex); val isInfix = case lookupFix id of SOME(FixStatus(_, Infix _)) => true | SOME(FixStatus(_, InfixR _)) => true | _ => false in if isInfix andalso not opThere then warningMessage (lex, location, "(" ^ id ^") has infix status but was not preceded by op.") else (); idLoc end; fun andBindings(fsys, p: symset -> 'a * location) : 'a list * location = (* Handles a sequence of non-recursive declarations separated by "and". Returns the list plus the spanning location. *) let val (item, itemLocn) = p (fsys ++ andSy) in case sy lex of AndSy => let val () = insymbol lex val (rest, restLocn) = andBindings(fsys, p) in (item::rest, locSpan(itemLocn, restLocn)) end | _ => ([item], itemLocn) end fun genTypeVarEnv {lookup,...} = { (* All type variables used on the right-hand side of the type binding must have been declared before the new type constructor *) lookupTvar = fn name => (case lookup name of SOME t => t | NONE => ( errorMessage (lex, location lex, name ^ " has not been declared in type declaration"); makeTv {value=emptyType, level=generalisable, equality=false, nonunifiable=true, printable=false} ) ) } (* genTypeVarEnv *); fun typeBinding (isSpec, isEqtype, _) fsys = let val newTVenv = searchList (); val typeVars = getTypeVars (false, newTVenv); (* The name of the type *) val (typeName, idLocn) = getShortId (ident, fsys ++ equalsSign, lex); (* val typeVarEnv = { lookupTvar = lookupDefault (#lookup newTVenv) lookupTvar } *) val typeVarEnv = genTypeVarEnv newTVenv; val (matchedType, endLocn) = (* If this is part of a signature we do not need to have an "= ty" after it. If it is an eqtype we must not have one. *) if (isSpec andalso (sy lex) <> SYMBOLS.EqualsSign) orelse isEqtype then (NONE, idLocn) else let val () = getsym (SYMBOLS.EqualsSign, lex); (* Followed by a type or a sequence of constructors *) val () = skipon (startTypeSys, fsys, "type", lex); val (t, l) = parseType (fsys, lex, typeVarEnv) in (SOME t, l) end val bindLocn = locSpan(idLocn, endLocn) in (mkTypeBinding (typeName, typeVars, matchedType, isEqtype, idLocn, bindLocn), bindLocn) end (* typeBinding *); fun datatypeDecOrRepl(fsys, env, isSpecification, startLocn) = (* "datatype" has been read. This may be followed by tycon = datatype ... if it is a datatype replication or by tyvarseq tycon = vid ... if it is a datatype binding. We can only distinguish the two when we reach either the second datatype or an identifier. This is used both for declarations and for specifications. *) let val () = insymbol lex; val newTVenv = searchList (); (* The type variables will be empty if this is a replication. *) val typeVars = getTypeVars (true, newTVenv); (* The name of the type *) val (typeName, idLocn) = getShortId (ident, fsys ++ equalsSign, lex); val () = getsym (SYMBOLS.EqualsSign, lex); in case sy lex of DatatypeSy => (* Replication *) let (* Check that the type var sequence was empty. *) val () = case typeVars of [] => () | _ => errorMessage (lex, location lex, "Datatype replication must not contain type variables"); val () = insymbol lex; val (originalTypeName, repLocn) = getLongId (ident, fsys, lex); val fullLocn = locSpan(startLocn, repLocn) in (mkDatatypeReplication{newType=typeName, oldType=originalTypeName, newLoc=idLocn, oldLoc=repLocn, location=fullLocn}, fullLocn) end | _ => (* Binding *) let (* Process the rest of this binding. *) val (db, dbLocn) = datatypeBind (fsys ++ withtypeSy ++ andSy, typeName, typeVars, newTVenv, idLocn, isSpecification); (* Process any others *) val (dbs, dbsLocn) = case sy lex of AndSy => ( insymbol lex; andBindings (fsys ++ withtypeSy, datatypeBinding isSpecification) ) | _ => ([], dbLocn) val (withtypes, lastLocn) = case sy lex of WithtypeSy => ( insymbol lex; andBindings(fsys, typeBinding(false, false, env)) ) | _ => ([], dbsLocn) val fullLocn = locSpan(startLocn, lastLocn) in (mkDatatypeDeclaration (db :: dbs, withtypes, fullLocn), fullLocn) end end and datatypeBind (fsys, typeName, typeVars, newTVenv, idLocn, isSpecification) = (* Process the rest of a binding. *) let (* Followed by a type or a sequence of constructors *) val () = skipon (startTypeDeclarableVarOpSy, fsys, "type", lex); (* In ML 90 all type variables on the right hand side of a datbind had to appear in the tyvarseq on the left. That restriction appears to have been removed for declarations, but not specifications, in ML97. This appears, though, to have been a mistake so I'm reinstating the old behaviour. *) (* val typeVarEnv = { lookupTvar = lookupDefault (#lookup newTVenv) (#lookupTvar env) } *) val typeVarEnv = genTypeVarEnv newTVenv; fun constrs fsys = let val () = case sy lex of OpSy => ( if isSpecification then warningMessage (lex, location lex, "``op'' may not appear before a constructor in a specification.") else (); insymbol lex ) | _ => () (* Identifier - name of constructor *) val (constrName, idLocn) = getShortId (declarableVarSys, fsys ++ ofVerticalBarSy, lex) (* If there is an "of" after this then the constructor is a function from the type following the "of" to the type being declared. Otherwise it is a constant of the type being declared. *) val (component, componentLoc) = case sy lex of OfSy => let val () = insymbol lex;(* Followed by a type. *) val (theType,typeLocn) = parseType (fsys ++ verticalBar, lex, typeVarEnv) in ({constrName=constrName, constrArg=SOME theType, idLocn=idLocn}, locSpan(idLocn, typeLocn)) end | _ => ({constrName=constrName, constrArg=NONE, idLocn=idLocn}, idLocn); in case sy lex of VerticalBar => let val () = insymbol lex val (tail, locn) = constrs fsys in (component :: tail, locSpan(componentLoc, locn)) end | _ => ([component], componentLoc) end val (constrs, constrsLocn) = constrs fsys val bindLocn = locSpan(idLocn, constrsLocn) in (mkDatatypeBinding (typeName, typeVars, constrs, idLocn, bindLocn), bindLocn) end and datatypeBinding isSpecification fsys = (* Datatype and abstype declarations and datatype specifications. *) let val newTVenv = searchList (); val typeVars = getTypeVars (true, newTVenv); (* The name of the type *) val (typeName, idLocn) = getShortId (ident, fsys ++ equalsSign, lex); val () = getsym (SYMBOLS.EqualsSign, lex); in datatypeBind (fsys, typeName, typeVars, newTVenv, idLocn, isSpecification) end; (* infix, infixr and nonfix *) fun fixity (lex, env) = let val sym = sy lex and startLocn = location lex val () = insymbol lex fun getPrecedence() = case sy lex of IntegerConst => (* Read a precedence number *) let val num = valOf(Int.fromString (id lex)) in if num < 0 orelse num > 9 then errorMessage (lex, location lex, "Precedence " ^ id lex ^ " not allowed, must be between 0 and 9") else (); insymbol lex; num end | _ => 0 (* default is zero *); val fixForm = case sym of NonfixSy => Nonfix | InfixSy => Infix(getPrecedence()) | InfixrSy => InfixR(getPrecedence()) | _ => raise Misc.InternalError "fixity" (* Should now be at least one variable. *) val () = skipon (variableSys, fsys, "Variable", lex); (* Read the variables and put them in the environ with their fix status. Qualified names prohibited. *) fun vars endLoc = if (sy lex) inside variableSys then let val (iden, idLoc) = getShortId (variableSys, fsys, lex); val () = #enterFix env (iden, FixStatus(iden, fixForm)) val (tail, endLoc) = vars idLoc in (iden :: tail, endLoc) end else ([], endLoc); val (variables, endLoc) = vars startLocn val fullLocn = locSpan(startLocn, endLoc) in (mkDirective (variables, fixForm, fullLocn), fullLocn) end fun makeTypeVarEnv() = (* Make an environment for type variables. A type variable is put into the environment if it is not already there. Type variables are always put into the most local scope first and then tidied up in the second pass. *) let val {enter,lookup,apply} = searchList (); (* Type variables used here should go in the scope of the most local val or fun. *) fun lookupT name = let (* These type variables are not unifiable until they are generalised. *) val newTypeVar = makeTv {value=emptyType, level=generalisable, equality=isEqtype name, nonunifiable=true, printable=false} val () = enter (name, newTypeVar); in newTypeVar end; in { lookupTvar = fn s => case lookup s of SOME t => t | NONE => lookupT s, lookup = lookup, apply = apply, enter = enter } end (* makeTypeVarEnv *); fun dec (fsys, lex, decOnly, env as {enterFix,...}): parsetree * location = let (* Sequence of declarations optionally separated by semicolons. *) fun decSequence(fsys, env) : parsetree list = if (sy lex) = SYMBOLS.Semicolon then (* Semicolons are optional. *) (insymbol lex; decSequence(fsys, env)) else if (sy lex) inside startDecSys then #1(dec(fsys ++ semicolonStartDecSy, lex, true, env)) :: decSequence(fsys, env) else (* May be empty *) []; (* Constraints *) fun constraint (exp, expLoc) fsys (env as {lookupTvar, ...}) = case sy lex of Colon => let val () = insymbol lex val (constrType, typeLoc) = parseType (fsys ++ colon, lex, {lookupTvar=lookupTvar}) val locs = locSpan(expLoc, typeLoc) in constraint (mkConstraint (exp, constrType, locs), locs) fsys env end | _ =>(exp, expLoc); fun getConstant mkConst = let (* Return the string. *) val data = id lex; (* Save it before insymbol. *) val loc = location lex in insymbol lex; mkConst(data, loc) end; fun parseInfix fsys opSys startSys atomic{lookupFix: string -> fixStatus option, ... } = let (* Infix operators have a precedence value associated with them, the larger the value the more tightly they bind. *) val opStartSy = opSy ++ startSys; fun parseApplication fsys (funExp, funLoc) : parsetree * location = (* Applies a function to an argument and then tries to apply that to the next expression/pattern. *) if (sy lex) inside startSys then (* Read an argument and apply the constructor *) if (sy lex) inside opSys andalso ( (* It is infix if we find it and it has been declared as infix. If it hasn't been declared then it isn't infix. *) case lookupFix(id lex) of SOME (FixStatus(_, Infix _)) => true | SOME (FixStatus(_, InfixR _)) => true | _ => false ) then (* it's an infix operator - don't treat it as an arg. *) (funExp, funLoc) else let val (arg, argLoc) = atomic (fsys ++ startSys) val appLoc = locSpan(funLoc, argLoc) in parseApplication fsys (mkApplic (funExp, arg, appLoc, false), appLoc) end else (funExp, funLoc); (* end parseApplication *) fun readNextOps () = (* Gets the operand and the following operator (if any) *) let val express = (* function applications *) parseApplication (fsys ++ opSys) (atomic (fsys ++ opStartSy)); val (operator, loc, fix) = if (sy lex) inside opSys then let val (id, loc) = getLongId (opSys, fsys, lex) val FixStatus(_, fixity) = valOf(lookupFix id) in (id, loc, fixity) end else ("", nullLocation, Nonfix); val (preclevl, right) = (* ~1 if not infix or infixr *) case fix of Infix prec => (prec, false) | InfixR prec => (prec, true) | Nonfix => (~1, false) (* Not infix *); in {express=express,operator=(operator,loc),preclevl=preclevl,right=right} end; fun nextLevel {express: parsetree*location,operator: string*location,preclevl,right} (returnLevel, lastRight, lastOp) = let val next = readNextOps(); (* get the next operator and operand.*) (* In ML97 two operators of the same precedence must both be left associative or both right associative. We actually have to check this in two different places depending on whether these are consecutive operators or there is a higher precedence operator in the middle. *) fun checkAssociativity(op1, op2 (* Type includes unused express field. *)) = if #preclevl op1 = #preclevl op2 andalso #right op1 <> #right op2 then errorMessage (lex, location lex, concat["Operators \"", #1(#operator op1), "\" and \"", #1 (#operator op2), "\" have the same precedence but \"", #1(#operator op1), "\" is ", if #right op1 then "right" else "left", "-associative while \"", #1 (#operator op2), "\" is ", if #right op2 then "right" else "left", "-associative."]) else (); val () = checkAssociativity({right=right, operator=operator, preclevl=preclevl}, next) val rightOp = if #preclevl next > preclevl orelse (* next operator is more binding-it must be processed first *) right andalso #preclevl next = preclevl then nextLevel next (preclevl, right, operator) else next; (* At this point we are either at the end of the expression or ``rightOp'' contains an operator which is as weak or weaker than the ``previous''. We can therefore apply the previous operator to the previous operand and the ``rightOp'' operand. *) val oper = mkIdent operator; val appLocn = locSpan(#2 express, #2 (#express rightOp)) val applied = { express = (mkApplic (oper, mkTupleTree([#1 express, #1 (#express rightOp)], appLocn), appLocn, true), appLocn), operator = #operator rightOp, preclevl = #preclevl rightOp, right = #right rightOp }; (* If the right operator is stronger than the ``returnLimit'' (i.e. stronger than the operator before this series) then repeat else return this result. *) in checkAssociativity({right=lastRight, operator=lastOp, preclevl=returnLevel}, rightOp); if #preclevl rightOp > returnLevel orelse #preclevl rightOp = returnLevel andalso lastRight then nextLevel applied (returnLevel, lastRight, lastOp) else applied end (* nextLevel *); (* parseInfix *) val ops = readNextOps (); (* Get the first item. *) in if #preclevl ops < 0 (* no operator *) then #express ops else #express (nextLevel ops (~1, false, ("", nullLocation))) end (* parseInfix *); fun pattern fsys lex env = (* Parse a pattern or a fun name apat ... apat sequence. *) let fun constraintOrLayered (pat, patLoc) fsys = let val isVar = isIdent pat; val (constr, constrLoc) = constraint (pat, patLoc) (fsys ++ asSy) env; in case sy lex of AsSy => let (* Layered pattern *) val () = insymbol lex val () = if not isVar then errorMessage (lex, location lex, "Expected id or id:ty before `as'") else (); val (lPatt, lPattLoc) = pattern fsys lex env val layeredLoc = locSpan(patLoc, lPattLoc) in (mkLayered (constr, lPatt, layeredLoc), layeredLoc) end | _ => (constr, constrLoc) end fun atomicPattern fsys: parsetree * location = let val sym = sy lex; val startLocn = location lex in case sym of Underline (* wild card *) => ( insymbol lex; (wildCard startLocn, startLocn) ) | LeftBrack (* list - may be empty *) => let val () = insymbol lex; val p = case sy lex of RightBrack => [] (* may be empty *) | _ => let fun varsList() = let val (p, _) = pattern (fsys ++ commaRightBrackSy) lex env in case sy lex of Comma => (insymbol lex; p :: varsList()) | _ => [p] end in varsList() end val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.RightBrack, lex); in (mkList(p, locs), locs) end (* bracketed pattern or unit value. *) | LeftParen => let val () = insymbol lex; val p = case sy lex of RightParen => (* unit *) unit(locSpan(startLocn, location lex)) | _ => let val (first,_) = pattern (fsys ++ rightParenCommaSy) lex env; (* May be a tuple *) in case sy lex of Comma => let val () = insymbol lex (* It is a tuple - read the other patterns and make the tuple. *) fun tuples () = let val (p, _) = pattern (fsys ++ rightParenCommaSy) lex env in case sy lex of Comma => (insymbol lex; p :: tuples()) | _ => [p] end in mkTupleTree (first :: tuples(), locSpan(startLocn, location lex)) end | _ => (* just one *) mkParenthesised(first, locSpan(startLocn, location lex)) end val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.RightParen, lex); in (p, locs) end (* Either a labelled record or unit. *) | LeftCurly => let val () = insymbol lex; val posEnd = location lex in case sy lex of RightCurly => (* Empty brackets denote unit *) let val () = insymbol lex val locs = locSpan(startLocn, posEnd) in (unit locs, locs) end | _ => let (* lab1 = pat1, __ , labn = patn <<, ... >>*) (* The same label name should not be used more than once. *) fun reportDup (name, newLoc, _) = errorMessage(lex, newLoc, "Label (" ^ name ^ ") appears more than once.") val dupCheck = noDuplicates reportDup fun getLabels () = case sy lex of ThreeDots => (insymbol lex; {frozen = false, result = []}) | _ => let val fsys = fsys ++ commaRightCurlySy; val (ident, idLoc) = getLabel (fsys ++ equalsSign, lex); val () = #enter dupCheck (ident, idLoc) (* Check for dups. *) val (patt, pattLoc) = case sy lex of EqualsSign => (* Simple case -- lab = pat *) (insymbol lex; pattern fsys lex env) | _ =>(* sugared form - label is also identifier *) ( (* Sugared form not allowed for numeric labels. *) if 0 < size ident andalso String.str(String.sub(ident, 0)) >= "1" andalso String.str(String.sub(ident, 0)) <= "9" then errorMessage (lex, location lex, " = pat expected after numeric label") else (); (* May have constraint and/or be layered. *) constraintOrLayered (mkIdent (ident, idLoc), idLoc) fsys ) val labEntry = mkLabelRecEntry(ident, idLoc, patt, locSpan(idLoc, pattLoc)) in case sy lex of Comma => let val () = insymbol lex val getRest = getLabels (); in {frozen = #frozen getRest, result = labEntry :: #result getRest} end | _ => (* Finished. *) {frozen = true, result = [labEntry]} end (* getLabels *) val {frozen, result} = getLabels (); val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.RightCurly, lex); in (mkLabelledTree (result, frozen, locs), locs) end end (* Constants *) | StringConst => (getConstant mkString, startLocn) | IntegerConst => (getConstant mkInt, startLocn) | RealConst => ( (* Real literals were allowed in patterns in ML90. *) errorMessage (lex, location lex, "Real constants not allowed in patterns"); (getConstant mkReal, startLocn) ) | CharConst => (getConstant mkChar, startLocn) | WordConst => (getConstant mkWord, startLocn) | _ => if (sy lex) inside declarableVarOpSy (* Identifiers *) then let val opThere = (sy lex) = SYMBOLS.OpSy; val () = if opThere then insymbol lex else (); val idLoc as (_, endLoc) = getLongNonInfix opThere declarableVarSys fsys lex env in (mkIdent idLoc, locSpan(startLocn, endLoc)) end else (skipon (empty, fsys, "Pattern", lex); (emptyTree, startLocn)) end (* atomicPattern *); (* pattern *) val () = skipon (startPatternSys, fsys, "Pattern", lex); val patAndLoc = constraintOrLayered (parseInfix (fsys ++ colonAsSy) declarableVarSys startPatternSys atomicPattern env) fsys; val () = skipon (fsys, empty, "End of pattern", lex); in patAndLoc end (* pattern *); fun expression fsys env: parsetree * location = (* Parse an expression *) let fun expressionList(fsys, separator, env): parsetree list = (* Sequence of expressions separated by semicolons or commas. Returns the list and strips the locations. *) #1 (getList (separator, empty, lex, fn () => expression fsys env)); fun match fsys: matchtree list * location = (* vs1.exp1 | .. | vsn.expn *) let val () = skipon (startMatchSys, fsys, "Match", lex); (* Read the pattern. *) val (vars, varLoc) = pattern (fsys ++ thickArrow) lex env; val () = (* We expect to get a => here but a common problem is to confuse matches with fun declarations and use a = here. We report it as an error but swallow it as though it was what we wanted. *) case sy lex of ThickArrow => insymbol lex | _ => ( notfound ("=>", lex); if (sy lex) = SYMBOLS.EqualsSign then insymbol lex else () ) (* And now the expression. *) val (exp, expLoc) = expression (fsys ++ verticalBar) env; (* Construct this node, and append any more. *) val thisLocn = locSpan(varLoc, expLoc) val thisMatch = mkMatchTree (vars, exp, thisLocn) val res = case sy lex of VerticalBar => let val () = insymbol lex val (m, mloc) = match fsys in (thisMatch :: m, locSpan(thisLocn, mloc)) end | _ => ([thisMatch], thisLocn) in skipon (fsys, empty, "End of match", lex); res end (* end match *); fun atomicExpression fsys: parsetree * location = let val startSym = sy lex and startLocn = location lex in case startSym of LeftBrack => let val () = insymbol lex; val p = if sy lex <> SYMBOLS.RightBrack (* may be empty *) then expressionList (fsys ++ commaRightBrackSy, SYMBOLS.Comma, env) else []; val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.RightBrack, lex); in (mkList(p, locs), locs) end (* A parenthesised expression, a tuple, a sequence or a unit value *) | LeftParen => let val () = insymbol lex; val posEnd = location lex in case sy lex of RightParen => (* Empty parentheses denote unit *) let val () = insymbol lex val locs = locSpan(startLocn, posEnd) in (unit locs, locs) end | _ => let val (firstExp, _) = expression (fsys ++ rightParenSemicolonCommaSy) env; val (exps, fullLocn) = case sy lex of Comma => (* Tuple *) let val () = insymbol lex val expressions = firstExp :: expressionList (fsys ++ rightParenCommaSy, SYMBOLS.Comma, env) val locs = locSpan(startLocn, location lex) in (mkTupleTree (expressions, locs), locs) end | Semicolon => (* Expression sequence. *) let val () = insymbol lex val expressions = firstExp :: expressionList (fsys ++ rightParenSemicolonSy, SYMBOLS.Semicolon, env) val locs = locSpan(startLocn, location lex) in (mkExpseq (expressions, locs), locs) end | _ => (* Only one *) let val locs = locSpan(startLocn, location lex) in (mkParenthesised(firstExp, locs), locs) end; val () = getsym (SYMBOLS.RightParen, lex); in (exps, fullLocn) end end (* Either a labelled record or unit. *) | LeftCurly => let val () = insymbol lex; val posEnd = location lex in case sy lex of RightCurly => (* Empty brackets denote unit *) let val () = insymbol lex val locs = locSpan(startLocn, posEnd) in (unit locs, locs) end | _ => let (* lab1 = exp1, __ , labn = expn *) (* The same label name should not be used more than once. *) fun reportDup (name, newLoc, _) = errorMessage(lex, newLoc, "Label (" ^ name ^ ") appears more than once.") val dupCheck = noDuplicates reportDup fun getEntry () = let val (ident, idLoc) = getLabel (fsys ++ equalsSign, lex); val () = #enter dupCheck (ident, idLoc) (* Check for dups. *) val () = getsym (SYMBOLS.EqualsSign, lex); val (labExp, labLoc) = expression (fsys ++ commaRightCurlySy) env val locs = locSpan(idLoc, labLoc) in (mkLabelRecEntry(ident, idLoc, labExp, locs), locs) end val (labs, _) = getList (SYMBOLS.Comma, empty, lex, getEntry) val locs = locSpan(startLocn, location lex) (* Include brackets. *) val labelled = mkLabelledTree (labs, true (* always frozen *), locs) val () = getsym (SYMBOLS.RightCurly, lex); in (labelled, locs) end end (* local declaration *) | LetSy => let val () = insymbol lex; val newEnv = mkLocalFixEnv env val decs = decSequence (fsys ++ inSy, newEnv); val () = getsym (SYMBOLS.InSy, lex); val exp = expressionList (fsys ++ semicolonEndSy, SYMBOLS.Semicolon, newEnv); val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.EndSy, lex); val () = skipon (fsys, empty, "End of let expression", lex); in (mkLocalDeclaration (decs, exp, locs, false) (* "let" rather than "local"*), locs) end (* ordinary expression - qualified names allowed *) | _ => let val opThere = startSym = SYMBOLS.OpSy; val () = if opThere then insymbol lex else (); val sym = sy lex; val symLoc = location lex in case sym of HashSign (* Selector. *) => let val () = insymbol lex; val (lab, labLoc) = getLabel (fsys, lex) val locs = locSpan(startLocn, labLoc) in (mkSelector(lab, locs), locs) end | StringConst => (getConstant mkString, locSpan(startLocn, symLoc)) | IntegerConst => (getConstant mkInt, locSpan(startLocn, symLoc)) | RealConst => (getConstant mkReal, locSpan(startLocn, symLoc)) | WordConst => (getConstant mkWord, locSpan(startLocn, symLoc)) | CharConst => (getConstant mkChar, locSpan(startLocn, symLoc)) | _ => if sym inside variableSys then let val (ident, idLoc) = getLongNonInfix opThere variableSys fsys lex env in (mkIdent (ident, idLoc), locSpan(startLocn, idLoc)) end else (* Expected something e.g. an identifier. *) (badsyms (SYMBOLS.Ident, lex); (emptyTree, symLoc)) end end(* end atomicExpression *); fun keyWordExp fsys: parsetree * location = (* Expressions introduced by keywords, atomic expressions or infixed expressions. Expressions introduced by keywords (e.g. if) swallow all of the rest of the expression but they can appear within other keyword expressions or after "andalso" and "orelse". *) let val sym = sy lex; val startLocn = location lex in (* if expression *) case sym of IfSy => let val () = insymbol lex; val (test, _) = expression (fsys ++ thenStartExpressionSy) env; val () = getsym (SYMBOLS.ThenSy, lex); val (thenPt, _) = expression (fsys ++ elseStartExpressionSy) env; val () = getsym (SYMBOLS.ElseSy, lex); val (elsePt, elseLocn) = expression fsys env; val locs = locSpan(startLocn, elseLocn) in (mkCond (test, thenPt, elsePt, locs), locs) end (* while expression *) | WhileSy => let val () = insymbol lex; val (test, testLocn) = expression (fsys ++ doSy) env; in if (sy lex) = SYMBOLS.DoSy then let val () = insymbol lex; val (doExp, doLocn) = expression fsys env val locs = locSpan(startLocn, doLocn) in (mkWhile (test, doExp, locs), locs) end else (badsyms (SYMBOLS.DoSy, lex); (test, testLocn)) end (* case expression *) | CaseSy => let val () = insymbol lex; val (exp, _) = expression (fsys ++ ofStartMatchSy) env; val () = getsym (SYMBOLS.OfSy, lex); val (m, matchLoc) = match (fsys ++ semicolon) val locs = locSpan(startLocn, matchLoc) in (mkCase (exp, m, locs, matchLoc), locs) end (* raise exception *) | RaiseSy => let val () = insymbol lex; val (exp, expLoc) = expression fsys env val locs = locSpan(startLocn, expLoc) in (mkRaise (exp, locs), locs) end (* fn expression *) | FnSy => let val () = insymbol lex; val (m, matchLoc) = match (fsys ++ semicolon) val locs = locSpan(startLocn, matchLoc) in (mkFn (m, locs), locs) end (* type constraint, or similar *) | _ => let val exp = parseInfix (fsys ++ andalsoColonSy) variableSys startAtomicSys atomicExpression env in constraint exp (fsys ++ andalsoSy) env end end (* keyWordExp *); fun parseAndalso fsys = (* EXP1 andalso EXP2 = if EXP1 then EXP2 else false *) let val (first, firstLoc) = keyWordExp (fsys ++ andalsoSy); (* N.B. If the expression had been introduced by a keyword (e.g. if) then the "else" part would have swallowed any "andalso". *) in case sy lex of AndalsoSy => let val () = insymbol lex; val (right, rightLoc) = parseAndalso fsys val locs = locSpan(firstLoc, rightLoc) in (mkAndalso (first, right, locs), locs) end | _ => (first, firstLoc) end; fun parseOrelse fsys = (* EXP1 orelse EXP2 = if EXP1 then true else EXP2 *) let val (first, firstLoc) = parseAndalso (fsys ++ orelseSy); in case sy lex of OrelseSy => let val () = insymbol lex; val (right, rightLoc) = parseOrelse fsys val locs = locSpan(firstLoc, rightLoc) in (mkOrelse (first, right, locs), locs) end | _ => (first, firstLoc) end; in skipon (startExpressionSys, fsys, "Expression", lex); if (sy lex) inside startExpressionSys then let val (exp, expLoc) = parseOrelse (fsys ++ handleSy); in case sy lex of HandleSy => let val () = insymbol lex; (* Remove "handle" *) val (m, mLoc) = match fsys val locs = locSpan(expLoc, mLoc) in (mkHandleTree (exp, m, locs, mLoc), locs) end | _ => (exp, expLoc) end else (emptyTree (* No expression *), location lex) end; (* expression *) in (* One declaration. "decOnly" is true if the derived form exp => val it = exp is not allowed here. *) if decOnly orelse (sy lex) inside startDecSys then let val sym = sy lex; val startLocn = location lex in case sym of ValSy => let val () = insymbol lex; (* Create two different scopes, for explicitly declared type variables and those implicitly declared. *) val implicitTvars = makeTypeVarEnv() and explicitTvars = makeTypeVarEnv(); val newEnv = {enterFix = #enterFix env, lookupFix = #lookupFix env, lookupTvar = (* Look up type variables in the explicit environment, otherwise look them up and add them to the implicit environment. *) fn s => case #lookup explicitTvars s of SOME t => t | NONE => #lookupTvar implicitTvars s}; (* Tyvarseq *) val _ = getTypeVars(true, { enter = #enter explicitTvars, lookup = #lookup explicitTvars, apply = #apply explicitTvars}); (* Processes a value binding. *) (* We check for qualified names in the second pass *) fun valB(fsys, isRec) = case sy lex of RecSy => (insymbol lex; valB(fsys, true)) | _ => let (* Pattern *) val (vars, varLoc) = pattern (fsys ++ equalsSign) lex newEnv; (* = *) val () = getsym (SYMBOLS.EqualsSign, lex); (* expression *) val (exp, expLoc) = expression fsys newEnv; (* Other declarations. *) val (tail, tailLocn) = case sy lex of AndSy => (insymbol lex; valB(fsys, isRec)) | _ => ([], expLoc) in (mkValBinding (vars, exp, isRec, locSpan(varLoc, expLoc)) :: tail, tailLocn) end val (bindings, bindLocns) = valB (fsys ++ andSy, false) val fullLocn = locSpan(startLocn, bindLocns) in (mkValDeclaration (bindings, {lookup= #lookup explicitTvars, apply= #apply explicitTvars}, {lookup= #lookup implicitTvars, apply= #apply implicitTvars}, fullLocn), fullLocn) end | FunSy => let val () = insymbol lex; (* Create two different scopes, for explicitly declared type variables and those implicitly declared. *) val implicitTvars = makeTypeVarEnv() and explicitTvars = makeTypeVarEnv(); val newEnv = {enterFix = #enterFix env, lookupFix = #lookupFix env, lookupTvar = fn s => case #lookup explicitTvars s of SOME t => t | NONE => #lookupTvar implicitTvars s}; (* Tyvarseq *) val _ = getTypeVars(true, { enter = #enter explicitTvars, lookup = #lookup explicitTvars, apply = #apply explicitTvars}); fun funB fsys = (* Processes a fun binding. *) (* We check for qualified names in the second pass *) let fun bindings soFar = let (* Pattern - This isn't really a pattern but we can parse it as that initially. That results in accepting some invalid syntax so we need to check the parsed code. *) val (vars, varLoc) = pattern (fsys ++ equalsSign) lex newEnv; (* Get the name and number of args. *) val (funPattern, funName, argCount) = mkFunPattern(vars, lex) val () = case soFar of SOME(prevName, prevCount) => ( if prevName = funName then () else errorMessage (lex, location lex, "This clause defines function ``" ^ funName ^ "'' but previous clause(s) defined ``" ^ prevName ^ "''"); if prevCount = argCount then () else errorMessage (lex, location lex, "This clause has " ^ Int.toString argCount ^ " arguments but previous clause(s) had " ^ Int.toString prevCount) ) | NONE => () (* This was first. *) (* = *) (* We expect an equals sign here but a common problem is to confuse fun declarations with matches and use a => here. Report the error but swallow the =>. *) val () = case sy lex of EqualsSign => insymbol lex | _ => ( notfound ("=", lex); case sy lex of ThickArrow => insymbol lex | _ => () ) (* expression *) val (exp, expLoc) = expression (fsys ++ verticalBar) newEnv; val bind = mkClause (funPattern, exp, locSpan(varLoc, expLoc)); (* Followed by a vertical bar and another binding ? *) val (rest, endLoc) = case sy lex of VerticalBar => (insymbol lex; bindings(SOME(funName, argCount))) | _ => ([], expLoc) in (bind :: rest, locSpan(varLoc, endLoc)) end; val (bindings, bindLocns) = bindings NONE in (mkClausal (bindings, bindLocns), bindLocns) end (* funB *); val (bindings, bindLocns) = andBindings(fsys, funB); val fullLocn = locSpan(startLocn, bindLocns) in (mkFunDeclaration (bindings, {lookup= #lookup explicitTvars, apply= #apply explicitTvars}, {lookup= #lookup implicitTvars, apply= #apply implicitTvars}, fullLocn), fullLocn) end | TypeSy => let val () = insymbol lex; val (bindings, bindLocns) = andBindings(fsys, typeBinding(false, false, env)) val fullLocn = locSpan(startLocn, bindLocns) in (mkTypeDeclaration (bindings, fullLocn), fullLocn) end | DatatypeSy => datatypeDecOrRepl(fsys, env, false, startLocn) | AbstypeSy => let val () = insymbol lex; val (tb, _) = andBindings (fsys ++ withTypeWithSy, datatypeBinding false); val (withtypes, _) = case sy lex of WithtypeSy => ( insymbol lex; andBindings (fsys ++ withSy, typeBinding(false, false, env)) ) | _ => ([], startLocn); val () = getsym (SYMBOLS.WithSy, lex); val decs = decSequence (fsys ++ endSy, env); val fullLocn = locSpan(startLocn, location lex) in getsym (SYMBOLS.EndSy, lex); (mkAbstypeDeclaration (tb, withtypes, decs, fullLocn), fullLocn) end | ExceptionSy => let (* Declares exception identifiers and their types. *) val () = insymbol lex; (* Get an exception binding. Qualified names prohibited. *) fun exceptionBinding fsys = let (* Allow an "op" here but don't produce a warning if it's absent. *) val () = if (sy lex) = SYMBOLS.OpSy then insymbol lex else () (* First the identifier. *) val (iden, idLoc) = getShortId (variableSys, fsys ++ ofEqualsSignSy, lex); in (* Either excon of ty or excon = excon' *) case sy lex of OfSy => let val () = insymbol lex val (theType, typeLocn) = parseType (fsys ++ equalsSign, lex, {lookupTvar= #lookupTvar env}) val fullLoc = locSpan(idLoc, typeLocn) in (mkExBinding (iden, emptyTree, SOME theType, idLoc, fullLoc), fullLoc) end | EqualsSign => let (* Must be = excon' *) val () = insymbol lex (* Allow an "op" here but don't produce a warning if it's absent. *) val () = if (sy lex) = SYMBOLS.OpSy then insymbol lex else () val (oldIden, oldIdenLoc) = getLongId (variableSys, fsys, lex); val fullLoc = locSpan(idLoc, oldIdenLoc) in (mkExBinding (iden, mkIdent(oldIden, oldIdenLoc), NONE, idLoc, fullLoc), fullLoc) end | _ => (mkExBinding (iden, emptyTree, NONE, idLoc, idLoc), idLoc) end; val (bindings, bindLocns) = andBindings(fsys, exceptionBinding) val fullLocn = locSpan(startLocn, bindLocns) in (mkExDeclaration (bindings, fullLocn), fullLocn) end | LocalSy => let val () = insymbol lex; (* Infix status have this scope. Type-variables have the scope of the enclosing val or fun. *) val newEnv = mkLocalFixEnv env (* The local declaration *) val ins = decSequence (fsys ++ inEndSy, newEnv); val () = getsym (SYMBOLS.InSy, lex); (* Decs are added to both the local and surrounding environment. *) val resultEnv = mkLocalBodyFixEnv newEnv enterFix val body = decSequence (fsys ++ endSy, resultEnv) val locs = locSpan(startLocn, location lex) in getsym (SYMBOLS.EndSy, lex); (mkLocalDeclaration (ins, body, locs, true), (*"local" rather than "let"*) locs) end | InfixSy => fixity(lex, env) | InfixrSy => fixity(lex, env) | NonfixSy => fixity(lex, env) (* "open" declaration - qualified names allowed *) | OpenSy => let val () = insymbol lex fun vars endLoc = if (sy lex) inside variableSys then let val (id, idLoc) = getLongId (variableSys, fsys, lex); val (tail, tailLoc) = vars idLoc in (mkStructureIdent(id, idLoc) :: tail, tailLoc) end else ([], endLoc); in if (sy lex) inside variableSys then let val (vars, varLocns) = vars startLocn val fullLocn = locSpan(startLocn, varLocns) in (mkOpenTree(vars, fullLocn), fullLocn) end else (* Identifier missing. *) (badsyms (SYMBOLS.Ident, lex); (emptyTree, startLocn)) end | _ => (emptyTree, startLocn) (* Empty declaration. *) end else let (* Single expression allowed - short for val it = exp *) val newTvars = makeTypeVarEnv(); val explicitTvars = makeTypeVarEnv();(* This will always be empty. *) val newEnv = {enterFix = #enterFix env, lookupFix = #lookupFix env, lookupTvar = #lookupTvar newTvars}; val (exp, expLoc) = expression fsys newEnv in (mkValDeclaration ([mkValBinding (mkIdent ("it", nullLocation), exp, false, expLoc)], {lookup= #lookup explicitTvars,apply= #apply explicitTvars}, {lookup= #lookup newTvars,apply= #apply newTvars}, expLoc), expLoc) end end (* dec *); (* Parses a signature. *) fun parseSignature (fsys : symset) (lex : lexan) env : sigs * location = let (* May be either a signature name or a sig spec .. spec end seq followed by multiple where type expressions. *) val () = skipon (declarableVarSys ++ sigSy, fsys, "Start of signature", lex) val startLocn = location lex val sigexp : sigs * location = case sy lex of SigSy => let (* sig *) val () = insymbol lex val sigs = signatureSpec (fsys ++ endSy ++ whereSy ++ semicolon) lex env val locs = locSpan(startLocn, location lex) in getsym (SYMBOLS.EndSy, lex); (mkSig (sigs, locs), locs) end | Ident => let val ident as (_, locs) = getShortId (declarableVarSys, fsys ++ whereSy, lex) in (mkSigIdent ident, locs) end | _ => (* Only if parse error which will have been reported in skipon. *) (mkSigIdent("error", location lex), location lex); fun getWhereTypes(sigexp, sigLoc) = let (* This is similar to a type binding but with the possibility that the type is a longtycon. *) val () = getsym(SYMBOLS.TypeSy, lex); val newTVenv = searchList (); val typeVars = getTypeVars (false, newTVenv); val (typeName, nameLoc) = getLongId (ident, fsys ++ equalsSign, lex); val typeVarEnv = genTypeVarEnv newTVenv; val () = getsym (SYMBOLS.EqualsSign, lex); (* Followed by a type or a sequence of constructors *) val () = skipon (startTypeSys, fsys, "type", lex); val (theType, typeLoc) = parseType (fsys ++ whereSy ++ andSy, lex, typeVarEnv) val constrainedSig = (mkWhereType(sigexp, typeVars, typeName, theType, nameLoc), locSpan(sigLoc, typeLoc)) in case sy lex of WhereSy => (* Recurse to handle any other wheres. *) (insymbol lex; getWhereTypes constrainedSig) | AndSy => ( insymbol lex; (* There are two possibilities here. It may be the start of another type abbreviation or it may be the start of another signature. *) case sy lex of TypeSy => getWhereTypes constrainedSig | _ => (* Push the "and" back into the lexer so it can be picked out later. *) ( pushBackSymbol(lex, SYMBOLS.AndSy); constrainedSig ) ) | _ => constrainedSig end in case sy lex of WhereSy => (insymbol lex; getWhereTypes sigexp) | _ => sigexp end (* parseSignature *) (* Sequence of "specs" *) and signatureSpec (fsys : symset) (lex : lexan) (env as {lookupTvar, ...}) : specs list = let val signatureTvars = makeTypeVarEnv(); fun parseSigEntries () : specs list = let val () = skipon (fsys ++ semicolonStartSigSys, fsys, "Signature", lex) val sym = sy lex and startLocn = location lex val thisSig = case sym of DatatypeSy => let val startLocn = location lex val sys = fsys ++ startSigEndSy val newenv = {enterFix = #enterFix env, lookupFix = #lookupFix env, (* All type variables on the right hand side of a datatype specification must appear on the left. *) lookupTvar = fn name => ( errorMessage (lex, location lex, name ^ " has not been declared in type declaration"); badType ) } in [mkCoreType (datatypeDecOrRepl(sys, newenv, true, startLocn))] end | TypeSy => (* It isn't obvious whether specifications of the form type s and t = int * int (i.e. mixed specifications and abbreviations) are allowed. For the moment allow them. *) let val sys = fsys ++ startSigEndSy val () = insymbol lex; val (bindings, bindLocns) = andBindings(sys, typeBinding(true, false, env)) in [mkCoreType (mkTypeDeclaration(bindings, bindLocns), locSpan(startLocn, bindLocns))] end | EqtypeSy => let val sys = fsys ++ startSigEndSy val () = insymbol lex; val (bindings, bindLocns) = andBindings(sys, typeBinding(true, true, env)) in [mkCoreType (mkTypeDeclaration(bindings, bindLocns), locSpan(startLocn, bindLocns))] end | ValSy => let val () = insymbol lex fun doVal () = let val idAndLoc as (_, idLoc) = getShortId (declarableVarSys, fsys ++ colon, lex); val () = getsym (SYMBOLS.Colon, lex); val (ty, tyLoc) = parseType (fsys ++ startSigEndAndSy, lex, {lookupTvar = #lookupTvar signatureTvars}); val locs = locSpan(idLoc, tyLoc) in (mkValSig (idAndLoc, ty, locs), locs) end in #1 (getList (SYMBOLS.AndSy, empty, lex, doVal)) end (* val *) | ExceptionSy => let(* exception id1 of ty1 and _ and idn of tyn *) val () = insymbol lex fun doEx () = let val idAndLoc as (_, idLoc) = getShortId (variableSys, fsys ++ ofSy, lex) val (ty, locs) = case sy lex of OfSy => let val () = insymbol lex val (types, tyLoc) = parseType (fsys ++ startSigEndAndSy, lex, {lookupTvar = lookupTvar}) in (SOME types, locSpan(idLoc, tyLoc)) end | _ => (* Nullary *) (NONE, idLoc); in (mkExSig (idAndLoc, ty, locs), locs) end in #1 (getList (SYMBOLS.AndSy, empty, lex, doEx)) end (* exception *) | StructureSy => let val () = insymbol lex fun doStructure () = let val idAndLoc as (_, idLoc) = getShortId (variableSys, empty, lex) val () = getsym (SYMBOLS.Colon, lex) val (sgn, sgnLoc) = parseSignature (fsys ++ startSigEndAndSy) lex env val locs = locSpan(idLoc, sgnLoc) in (mkStructureSigBinding (idAndLoc, (sgn, false, sgnLoc), locs), locs) end in [mkStructureSig(getList(SYMBOLS.AndSy, empty, lex, doStructure))] end | IncludeSy => let (* In ML 97 we can have "include sigexp" but in addition as a derived form we can have "include ident...ident". Presumably this is for backwards compatibility. sigexp may be a single identifier but could also be an identifier with a "where type" constraint. I hate this sort of inconsistency. The simplest way to deal with this is to parse the first one as a general signature and then allow multiple identifiers. That is rather more general than the syntax allows and perhaps we should check that the first signature was simply an identifier. *) val () = insymbol lex val () = skipon (declarableVarSys ++ sigSy, fsys, "Start of signature", lex) val (firstSig, firstLoc) = parseSignature (fsys ++ startSigEndSy ++ declarableVarSys) lex env fun sigids locs = case sy lex of Ident => let val nameLoc as (_, loc) = getShortId (declarableVarSys, fsys, lex) val (rest, lastLoc) = sigids loc in (mkSigIdent nameLoc :: rest, lastLoc) end | _ => ([], locs) val (otherSigs, finalLoc) = sigids firstLoc in [mkInclude (firstSig :: otherSigs, locSpan(startLocn, finalLoc))] end | SharingSy => let (* sharing *) val startLocn = location lex val () = insymbol lex val isType = case sy lex of TypeSy => (insymbol lex; true) | _ => false fun getShare () = let val (id, loc) = getLongId (declarableVarSys, fsys ++ rightParenEqualsSignSy, lex) in (* We want to include the location in the list as well as in the result here. *) ((id, loc), loc) end val (shares, _) = getShare () val () = getsym (SYMBOLS.EqualsSign, lex) val (shareRest, shareLocn) = getList (SYMBOLS.EqualsSign, ident, lex, getShare) val fullLoc = locSpan(startLocn, shareLocn) val share = mkSharing (isType, shares :: shareRest, fullLoc) in [share] end | _ => [] (* Empty. *) (* end of parse of thisSig *) (* continue until the `end' *) val () = case sy lex of Semicolon => insymbol lex | _ => () in if (sy lex) inside semicolonStartSigSys then thisSig @ parseSigEntries () else thisSig end (* parseSigEntries *) in parseSigEntries () end (* signatureSpec *); fun signatureDec (fsys : symset) (lex : lexan) env : topdec = let val startLocn = location lex val () = insymbol lex fun doSigDec () = let val idAndLoc as (_, idLoc) = getShortId (variableSys, empty, lex); val () = getsym (SYMBOLS.EqualsSign, lex) val (sgn, sigLoc) = parseSignature (fsys ++ endAndSy) lex env val locs = locSpan(idLoc, sigLoc) in (mkSignatureBinding (idAndLoc, sgn, locs), locs) end val (sigs, sigLoc) = getList (SYMBOLS.AndSy, empty, lex, doSigDec) in mkSignatureDec (sigs, locSpan(startLocn, sigLoc)) end fun structVal (fsys : symset) (lex : lexan) env : structValue * location = let (* Series of declarations inside struct...end or (...) in functor application. *) val () = skipon (structSy ++ declarableVarLetSy, fsys, "struct or functor application", lex); val fsysPcolon = fsys ++ colon ++ colonGt val startLocn = location lex val strExp = case sy lex of StructSy => let(* It's a new structure *) val () = insymbol lex (* Infix declarations are local to struct ... end. *) val structEnv = mkLocalFixEnv env val str = strDec (fsysPcolon ++ endSy) lex structEnv val locs = locSpan(startLocn, location lex) val () = getsym (SYMBOLS.EndSy, lex) in (mkStruct(str, locs), locs) end | LetSy => let val () = insymbol lex (* Fixity is local. *) val newEnv = mkLocalFixEnv env (* The local declaration *) val ins = strDec (fsysPcolon ++ inEndSy) lex newEnv val () = getsym (SYMBOLS.InSy, lex) val body = #1 (structVal (fsysPcolon ++ endSy) lex newEnv) val endLoc = location lex val () = getsym (SYMBOLS.EndSy, lex) val locs = locSpan(startLocn, endLoc) in (mkLetdec (ins, body, locs), locs) end | _ => let (* Either a structure path or a functor application *) val (iden, idLoc) = getLongId (declarableVarSys, fsysPcolon ++ leftParen, lex); val startLoc = location lex in case sy lex of LeftParen => let (* functor application *) val () = insymbol lex (* Functor names must not be qualified. *) val () = checkForDots (iden, lex, idLoc); val parameter = case sy lex of RightParen => (* Empty parameter list *) mkStruct([], locSpan(startLoc, location lex)) | _ => let val tsys = fsysPcolon ++ rightParenCommaSy in (* May be either a structure value or a sequence of declarations. *) if (sy lex) inside startDecStructureSy then (* implied struct...end *) let val structEnv = mkLocalFixEnv env val str = strDec tsys lex structEnv val locs = locSpan(startLoc, location lex) in mkStruct(str, locs) end else #1 (structVal tsys lex env) end val endPos = location lex val () = getsym (SYMBOLS.RightParen, lex) val locs = locSpan(idLoc, endPos) in (mkFunctorAppl (iden, parameter, idLoc, locs), locs) end | _ => (mkStructIdent (iden, idLoc), idLoc) end (* We may have one or more constraints. *) fun doConstraints (strExp, strExpLoc) = case sy lex of Colon => let val () = insymbol lex val (sign, sigLoc) = parseSignature fsysPcolon lex env in doConstraints(mkSigConstraint(strExp, sign, false, sigLoc), locSpan(strExpLoc, sigLoc)) end | ColonGt => let val () = insymbol lex val (sign, sigLoc) = parseSignature fsysPcolon lex env in doConstraints(mkSigConstraint(strExp, sign, true, sigLoc), locSpan(strExpLoc, sigLoc)) end | _ => (strExp, strExpLoc) in doConstraints strExp end (* structVal *) and structureDec (fsys : symset) (lex : lexan) (env as {enterFix, ...}) : structDec = let val startLocn = location lex in case sy lex of StructureSy => let val () = insymbol lex fun doStrDec () = let (* Read strId <<: sig>> = str *) (* First the identifier *) val idAndLoc as (_, idLoc) = getShortId (declarableVarSys, fsys ++ colonEqualsSignSy, lex); (* Next the signature if there is one. *) val sgn = case sy lex of Colon => let val () = insymbol lex val (sign, sigLoc) = parseSignature (fsys ++ equalsSign) lex env in SOME (sign, false, sigLoc) end | ColonGt => let val () = insymbol lex val (sign, sigLoc) = parseSignature (fsys ++ equalsSign) lex env in SOME (sign, true, sigLoc) end | _ => NONE (* Now the equals sign *) val () = getsym (SYMBOLS.EqualsSign, lex) val (strVal, strLoc) = structVal fsys lex env val locs = locSpan(idLoc, strLoc) in (* And finally the structure value. *) (mkStructureBinding (idAndLoc, sgn, strVal, locs), locs) end val (strs, strLocs) = getList (SYMBOLS.AndSy, structSy, lex, doStrDec) in mkStructureDec (strs, locSpan(startLocn, strLocs)) end | _ => let val () = getsym (SYMBOLS.LocalSy, lex) val startLoc = location lex val newEnv = mkLocalFixEnv env (* The local declaration *) val ins = strDec (fsys ++ inEndSy) lex newEnv val () = getsym (SYMBOLS.InSy, lex) (* Decs are added to both the local and surrounding environment. *) val resultEnv = mkLocalBodyFixEnv newEnv enterFix val body = strDec (fsys ++ endSy) lex resultEnv val endLoc = location lex val () = getsym (SYMBOLS.EndSy, lex) in mkLocaldec (ins, body, locSpan(startLoc, endLoc)) end end (* end of structureDec *) (* Functor declarations. *) and functorDec (fsys : symset) (lex : lexan) env : topdec = let val startLocn = location lex val () = insymbol lex; (* remove ``functor'' *) fun doFunctDec () : functorBind * location = let (* Read fncId (<> ) <<: sig>> = str *) (* First the identifier *) val (strId, idLocn) = getShortId (declarableVarSys, fsys ++ colonEqualsSignSy, lex); val () = getsym (SYMBOLS.LeftParen, lex); (* Now the parameters *) val tsys = fsys ++ rightParenCommaSy; val parameter = (* empty | name:sigexp | spec *) if (sy lex) = SYMBOLS.RightParen (* empty *) then mkFormalArg ("", mkSig([], location lex)) else if (sy lex) inside startSigSys (* spec *) then let val startLocn = location lex val sigs = signatureSpec tsys lex env in mkFormalArg ("", mkSig (sigs, locSpan(startLocn, location lex))) end (* name : sigexp *) else let val (strId, _) = getShortId (declarableVarSys, tsys ++ colon, lex); val () = getsym (SYMBOLS.Colon, lex) (* Next the signature. *) val (sgn, _) = parseSignature (tsys ++ sharingSy) lex env in mkFormalArg (strId, sgn) end (* parameter *) val () = getsym (SYMBOLS.RightParen, lex) (* Next the signature if there is one. *) val sigOpt = case sy lex of Colon => let val () = insymbol lex val (sign, sigLoc) = parseSignature (fsys ++ equalsSign) lex env in SOME(sign, false, sigLoc) end | ColonGt => let val () = insymbol lex val (sign, sigLoc) = parseSignature (fsys ++ equalsSign) lex env in SOME(sign, true, sigLoc) end | _ => NONE (* Now the equals sign *) val () = getsym (SYMBOLS.EqualsSign, lex) (* And finally the functor value. *) val (strVal, strLoc) = structVal fsys lex env val locs = locSpan(idLocn, strLoc) in (mkFunctorBinding (strId, idLocn, sigOpt, strVal, parameter, locs), locs) end (* doFunctDec *) val (functs, functLoc) = getList (SYMBOLS.AndSy, structSy, lex, doFunctDec) in mkFunctorDec (functs, locSpan(startLocn, functLoc)) end (* functorDec *) and strDec (fsys : symset) (lex : lexan) env : structDec list = (* A sequence of declarations, optionally separated by semicolons. *) let fun getDecs () : structDec list = let val tsys = fsys ++ semicolonStartDecStructureSy; in (* Semicolons are optional. *) if (sy lex) = SYMBOLS.Semicolon then let val () = insymbol lex in getDecs () end else if (sy lex) inside structureLocalSy then (structureDec tsys lex env) :: getDecs() else if (sy lex) inside startDecSys then (mkCoreLang (dec(tsys, lex, true, env))) :: getDecs() else (* May be empty *) [] end (* getDecs *) in (* Return the declarations. *) getDecs () end (* strDec *); val globalEnv = (* Extend the fixity environment with a type var environment which traps top-level type variables in exceptions. *) { enterFix = enterFix, lookupFix = lookupFix, lookupTvar = fn _ => let val () = errorMessage (lex, location lex, "Free type variables not allowed"); in makeTv {value=emptyType, level=generalisable, equality=false, nonunifiable=true, printable=false} end} (* May be structure/functor dec, signature dec or top-level dec. Treat "local" as a structure dec even if it is actually declaring a value or type. *) val tsys = fsys ++ startTopSys; fun parseTopDecs (_ : symset) : topdec list * location = let val startSym = sy lex and startLoc = location lex; in if startSym = SYMBOLS.Semicolon orelse startSym = SYMBOLS.AbortParse then ([], startLoc) else if startSym inside topdecStartSy then let val (aDec : topdec, newOkStartSet : symset) = case startSym of FunctorSy => (functorDec tsys lex globalEnv, functorSy) | SignatureSy => (signatureDec tsys lex globalEnv, signatureSy) | StructureSy => (mkTopDec(structureDec tsys lex globalEnv), structureLocalStartDecSy) (* Local declarations are ambiguous; we treat them as strDecs *) | LocalSy => (mkTopDec(structureDec tsys lex globalEnv), structureLocalStartDecSy) (* let, val, fun etc. *) | _ => (mkTopDec(mkCoreLang (dec(tsys, lex, true, globalEnv))), structureLocalStartDecSy); val (rest, locRest) = parseTopDecs newOkStartSet in (aDec :: rest, locSpan(startLoc, locRest)) end else (notfound (";", lex); ([], startLoc)) end; (* parseTopDecs *) in (* body of parseDec *) (* topdecs are either fundecs, sigdecs, strDecs (including decs) or a single expression. We now handle everything except the single expression in "parseTopDecs". This makes it easier to produce warning messages for missing semi-colons that the ML Standard requires between different kinds of topdec. SPF 18/7/96 *) if (sy lex) inside topdecStartSy then mkProgram(parseTopDecs topdecStartSy) else let (* expression - only one allowed. *) val startLoc = location lex; val aDec = mkCoreLang (dec(tsys, lex, false, globalEnv)); val () = if (sy lex) <> SYMBOLS.Semicolon andalso (sy lex) <> SYMBOLS.AbortParse then notfound (";", lex) else () in mkProgram([mkTopDec aDec], locSpan(startLoc, location lex)) end end; (* parseDec *) end (* PARSEDEC *); polyml-5.6/mlsource/MLCompiler/PARSE_TYPE.ML000066400000000000000000000264701265146633400205240ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Parse Types. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor PARSE_TYPE ( structure SYMBOLS : SymbolsSig structure SYMSET : SymsetSig structure LEX : LEXSIG structure SKIPS : sig type sys; type lexan; type symset; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val badsyms: sys * lexan -> unit; val getsym: sys * lexan -> unit; val skipon: symset * symset * string * lexan -> unit; val getid: symset * symset * lexan -> string * location; val getLabel: symset * lexan -> string * location; val getList: sys * symset * lexan * (unit -> 'a * location) -> 'a list * location; end; structure UTILITIES : sig val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; end structure TYPETREE : TYPETREESIG (*****************************************************************************) (* PARSETYPE sharing constraints *) (*****************************************************************************) sharing type SYMBOLS.sys = SYMSET.sys = SKIPS.sys = LEX.sys sharing type SYMSET.symset = SKIPS.symset sharing type LEX.lexan = SKIPS.lexan ) : (*****************************************************************************) (* PARSETYPE export signature *) (*****************************************************************************) sig type symset; type lexan; type types; type typeParsetree; type typeVarForm type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val parseType: symset * lexan * {lookupTvar:string -> typeVarForm} -> typeParsetree * location; end = (*****************************************************************************) (* PARSETYPE functor body *) (*****************************************************************************) struct open TYPETREE open LEX open SYMSET open SKIPS open SYMBOLS open UTILITIES infix 8 ++; infix 8 inside; val tyseqSyntax = SYMSET.comma ++ SYMSET.rightParen val lrSyntax = SYMSET.comma ++ SYMSET.rightCurly fun parseType (fsys, lex, env) = let fun tupleType fsys = let fun basicType fsys = let (* First part may be a type sequence. *) val sym = sy lex and startLocn = location lex val (tySeq, seqLocn) = case sym of LeftParen => (* sequence of types *) let fun processList () = let val thisType = if sy lex inside startTypeSys then #1 (parseType (fsys ++ tyseqSyntax, lex, env)) else ( badsyms (TypeIdent, lex); ParseTypeBad (* not there *) ); fun testfor (sym, startsys, lex) = (* repeat if the separator or a starting sym is found *) if sy lex = sym then (insymbol lex; true) else if sy lex inside startsys then (badsyms (sym, lex); true) else false; in (* Check for any more *) if testfor (SYMBOLS.Comma, startTypeSys, lex) then thisType :: processList() (* get some more *) else [thisType] (* that's it *) end (* processList *); val () = insymbol lex; (* Remove opening bracket *) val sequence = processList(); (* read list of items *) val endLocn = location lex (* Should be the loc. of the close paren. *) in getsym (SYMBOLS.RightParen, lex); (sequence, locSpan(startLocn, endLocn)) end | LeftCurly => let val () = insymbol lex; (* Remove opening bracket *) val posEnd = location lex in case sy lex of RightCurly => let val () = insymbol lex val locs = locSpan(startLocn, posEnd) in ([unitTree locs], locs) end | _ => let (* The same label name should not be used more than once. *) fun reportDup (name, newLoc, _) = errorMessage (lex, newLoc, "Label (" ^ name ^ ") appears more than once.") val dupCheck = noDuplicates reportDup (* All the labels should be the same sort. *) val (l, _) = getList (SYMBOLS.Comma, empty, lex, fn () => let val nameAndLoc as (_, nameLoc) = getLabel (fsys ++ SYMSET.colon, lex); val () = #enter dupCheck nameAndLoc; val () = getsym (SYMBOLS.Colon, lex); val (types, typeLoc) = parseType (fsys ++ lrSyntax, lex, env) val fullLoc = locSpan(nameLoc, typeLoc) in ((nameAndLoc, types, fullLoc), fullLoc) end); val locs = locSpan(startLocn, location lex) (* Include '}' *) in getsym (SYMBOLS.RightCurly, lex); ([makeParseTypeLabelled(l, true, locs) (* frozen *)], locs) end end | TypeIdent => let (* type variable *) val ty = #lookupTvar env (id lex); in getsym (TypeIdent, lex); ([makeParseTypeId(ty, startLocn)], startLocn) end | Ident => (* Constructor such as `int' *) let val idLocn as (_, locn) = getid (SYMSET.ident, fsys, lex) in ([makeParseTypeConstruction (idLocn, ([], locn), locn)], locn) end | _ => ( badsyms (SYMBOLS.Ident, lex); ([], startLocn) ) in (* Type sequence read. Can now have some type constructors. *) case (sy lex, tySeq) of (Ident, _) => let (* Returns the type made from the constructors. *) fun constructors(args, argLoc) = let val idAndLoc as (_, idLoc) = (id lex, location lex) val loc = locSpan(argLoc, idLoc) val constructed = makeParseTypeConstruction(idAndLoc, (args, argLoc), loc); in insymbol lex; if sy lex = SYMBOLS.Ident then constructors([constructed], loc) else (constructed, loc) end; in constructors(tySeq, seqLocn) end (* no constructor - get the first part of the sequence and check that that's all. *) | (_, []) => (ParseTypeBad, seqLocn) | (_, [t]) => (t, seqLocn) | (_, t::_) => (badsyms (SYMBOLS.Ident, lex); (t, seqLocn)) end (* basicType *); (* ty * .. * ty *) fun getProduct () = let val fsys' = fsys ++ SYMSET.asterisk; val (firstPart, firstLocn) = basicType fsys' in case sy lex of Asterisk => let val () = insymbol lex val (rest, restLocn) = getProduct () in (firstPart :: rest, locSpan(firstLocn, restLocn)) end | _ => ([firstPart], firstLocn) end in case getProduct () of ([notProduct], locn) => (notProduct, locn) | (product, locn) => (makeParseTypeProduct(product, locn), locn) end (* tupleType *)(* ty -> ty *) val (firstType, firstLoc) = tupleType (fsys ++ SYMSET.arrow); in case sy lex of Arrow => let val () = insymbol lex val (resType, resLocn) = parseType (fsys, lex, env) val locs = locSpan(firstLoc, resLocn) in (makeParseTypeFunction (firstType, resType, locs), locs) end | _ => ( skipon (fsys, empty, "End of type", lex); (firstType, firstLoc) ) end end; polyml-5.6/mlsource/MLCompiler/PRETTYSIG.sml000066400000000000000000000054421265146633400206620ustar00rootroot00000000000000(* Copyright (c) 2009. 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Signature for the pretty printer. *) signature PRETTYSIG = sig type context type pretty val ContextLocation: { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } -> context and ContextProperty: string * string (* User property. *) -> context val PrettyBlock: int * bool * context list * pretty list -> pretty and PrettyBreak: int * int -> pretty and PrettyString: string -> pretty val isPrettyBlock: pretty -> bool val isPrettyBreak: pretty -> bool val isPrettyString: pretty -> bool val projPrettyBlock: pretty -> int * bool * context list * pretty list val projPrettyBreak: pretty -> int * int val projPrettyString: pretty -> string (* datatype context = ContextLocation of { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } | ContextProperty of string * string (* User property. *) datatype pretty = PrettyBlock of int * bool * context list * pretty list | PrettyBreak of int * int | PrettyString of string *) (* A simple "pretty printer" that just accumulates strings. *) val uglyPrint: pretty -> string (* A proper pretty printer. *) val prettyPrint: (string -> unit) * int -> pretty -> unit (* Tag for pretty printed out from PolyML.print. *) val printOutputTag : (pretty -> unit) Universal.tag (* Compiler output. Used for timing information and compiler debug output. *) and compilerOutputTag: (pretty->unit) Universal.tag val getPrintOutput : Universal.universal list -> pretty -> unit and getCompilerOutput : Universal.universal list -> pretty -> unit (* getSimplePrinter prints strings through compilerOutput. *) and getSimplePrinter: Universal.universal list -> string -> unit val tagPrettyBlock: word and tagPrettyBreak: word and tagPrettyString: word val maxPrettyTag: word (* Types that can be shared. *) structure Sharing: sig type pretty = pretty and context = context end end; polyml-5.6/mlsource/MLCompiler/PRINT_TABLE.ML000066400000000000000000000116361265146633400206120ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Table of printing functions for user-defined types. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1990 *) (* implicitly imports Boot.Misc, Boot.PrettyPrinter, StructVals and Address *) (* The original purpose of this module was to allow for type-dependent print functions to be installed by the user. That requires a special mechanism to allow a function to be installed in a child database without needing to be able to write to the top-level database containing the compiler. This has been extended to deal with SML97 overloading for both functions and literal constants and also for ref-like types which support pointer equality even though these cases are intended only for the implementors of libraries which would probably be in the top-level database. *) functor PRINT_TABLE ( structure CODETREE: sig type machineWord; type codetree end; (*****************************************************************************) (* STRUCTVALS *) (*****************************************************************************) structure STRUCTVALS : sig type typeId; type typeConstrs val sameTypeId: typeId * typeId -> bool; val tcIdentifier: typeConstrs -> typeId end; (*****************************************************************************) (* PRETTY *) (*****************************************************************************) structure PRETTY : PRETTYSIG ): (*****************************************************************************) (* PRINTTABLE export signature *) (*****************************************************************************) sig type typeConstrs type codetree val addOverload: string * typeConstrs * codetree -> unit val getOverloads: string -> (typeConstrs * codetree) list val getOverload: string * typeConstrs * (unit->codetree) -> codetree structure Sharing: sig type typeConstrs = typeConstrs type codetree = codetree end end = (*****************************************************************************) (* PRINTTABLE functor body *) (*****************************************************************************) struct open STRUCTVALS; type pretty = PRETTY.pretty open CODETREE type overloadEntry = string * typeConstrs * codetree; (* Create a ref to hold the list *) val overloadTable : overloadEntry list ref = ref [] (* The most recent ref refers to the current level of the hierarchy, so is the one we should update. *) fun addOverload (name, cons, overload) = let (* Remove any existing occurrences of the type. The only reason is to allow any existing function to be garbage-collected. *) fun filter [] = [] | filter ((this as (n, t, _)) :: rest) = if n = name andalso sameTypeId (tcIdentifier cons, tcIdentifier t) then filter rest else this :: filter rest in overloadTable := (name, cons, overload) :: filter (!overloadTable) end (* Return all the overloads for a particular identifier. *) fun getOverloads name = let fun searchList [] = [] | searchList ((n,t,v)::rest) = if name = n then (t, v) :: searchList rest else searchList rest in searchList (! overloadTable) end; (* Return the first matching overload or call mkDefault. *) fun getOverload(name, constr, mkDefault) = let fun searchList [] = mkDefault() | searchList ((n,t,v)::rest) = if name = n andalso sameTypeId (tcIdentifier constr, tcIdentifier t) then v else searchList rest in searchList (! overloadTable) end; structure Sharing = struct type codetree = codetree and typeConstrs = typeConstrs end end; polyml-5.6/mlsource/MLCompiler/ParseDec.ML000066400000000000000000000024601265146633400204700ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ParseDec = PARSE_DEC ( structure MISC = Misc structure SYMBOLS = Symbols structure LEX = Lex structure SYMSET = SymSet structure SKIPS = Skips structure STRUCTVALS = StructVals structure TYPETREE = TypeTree structure PARSETREE = ParseTree structure STRUCTURES = Structures structure PARSETYPE = ParseType structure UTILITIES = Utilities structure SIGNATURES = SignaturesStruct ); polyml-5.6/mlsource/MLCompiler/ParseTree/000077500000000000000000000000001265146633400204405ustar00rootroot00000000000000polyml-5.6/mlsource/MLCompiler/ParseTree/BASE_PARSE_TREE.sml000066400000000000000000000272551265146633400234530ustar00rootroot00000000000000(* Copyright (c) 2013-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor BASE_PARSE_TREE ( structure STRUCTVALS : STRUCTVALSIG structure TYPETREE : TYPETREESIG structure DEBUGGER : DEBUGGERSIG sharing STRUCTVALS.Sharing = TYPETREE.Sharing = DEBUGGER.Sharing ): BaseParseTreeSig = struct open STRUCTVALS open TYPETREE type breakPoint = DEBUGGER.breakPoint datatype parsetree = Ident of (* An identifier is just a name. In the second pass it is associated with a particular declaration and the type is assigned into the type field. The type of this identifier is needed to deal with overloaded operators. If we have an occurence of ``='', say, the type of the value will be 'a * 'a -> bool but the type of a particular occurence, i.e. the type of the identifier must be int * int -> bool, say, after all the unification has been done. *) { name: string, expType: types ref, value: values ref, location: location, possible: (unit -> string list) ref (* Used with the IDE. *) } | Literal of (* Literal constants may be overloaded on more than one type. The types are specified by installing appropriate conversion functions: convInt, convReal, convChar, convString and convWord. *) { converter: values, expType: types ref, literal: string, location: location } | Applic of (* Function application *) { f: parsetree, arg: parsetree, location: location, isInfix: bool, expType: types ref } | Cond of (* Conditional *) { test: parsetree, thenpt: parsetree, elsept: parsetree, location: location, thenBreak: breakPoint option ref, elseBreak: breakPoint option ref } | TupleTree of { fields: parsetree list, location: location, expType: types ref } | ValDeclaration of { dec: valbind list, explicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, implicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, location: location } | FunDeclaration of { dec: fvalbind list, explicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, implicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, location: location } | OpenDec of (* Open a structure. The variables, structures and types are just needed if debugging information is being generated. *) { decs: structureIdentForm list, variables: values list ref, structures: structVals list ref, typeconstrs: typeConstrSet list ref, location: location } | Constraint of (* Constraint (explicit type given) *) (* A constraint has a value and a type. The actual type, will, however be the unification of these two and not necessarily the given type. *) { value: parsetree, given: typeParsetree, location: location } | Layered of (* Layered pattern. Equivalent to an ordinary pattern except that the variable is given the name of the object which is to be matched. *) { var: parsetree, pattern: parsetree, location: location } | Fn of { matches: matchtree list, location: location, expType: types ref } | Localdec of (* Local dec in dec and let dec in exp. *) { decs: (parsetree * breakPoint option ref) list, body: (parsetree * breakPoint option ref) list, isLocal: bool, varsInBody: values list ref, (* Variables in the in..dec part of a local declaration. *) location: location } | TypeDeclaration of typebind list * location | AbsDatatypeDeclaration of (* Datatype and Abstract Type declarations *) { isAbsType: bool, typelist: datatypebind list, withtypes: typebind list, declist: (parsetree * breakPoint option ref) list, location: location, equalityStatus: bool list ref } | DatatypeReplication of { newType: string, oldType: string, oldLoc: location, newLoc: location, location: location } | ExpSeq of (parsetree * breakPoint option ref) list * location | Directive of (* Directives are infix, infixr and nonfix. They are processed by the parser itself and only appear in the parse tree for completeness. *) { tlist: string list, fix: infixity, location: location } | ExDeclaration of exbind list * location | Raise of parsetree * location | HandleTree of (* Execute an expression and catch any exceptions. *) { exp: parsetree, hrules: matchtree list, location: location, listLocation: location } | While of (* Ordinary while-loop *) { test: parsetree, body: parsetree, location: location, breakPoint: breakPoint option ref } | Case of (* Case-statement *) { test: parsetree, match: matchtree list, location: location, listLocation: location, expType: types ref } | Andalso of { first: parsetree, second: parsetree, location: location } | Orelse of { first: parsetree, second: parsetree, location: location } | Labelled of (* Labelled record & the entry in the list. "frozen" is false if it's a pattern with "...". *) { recList: labelRecEntry list, frozen: bool, expType: types ref, location: location } | Selector of { name: string, labType: types, typeof: types, location: location } | List of { elements: parsetree list, location: location, expType: types ref } | EmptyTree | WildCard of location | Unit of location | Parenthesised of parsetree * location and valbind = (* Value bindings.*) ValBind of (* Consists of a declaration part (pattern) and an expression. *) { dec: parsetree, exp: parsetree, line: location, isRecursive: bool, variables: values list ref (* list of variables declared and their poly vars *) } and fvalbind = (* Function binding *) (* `Fun' bindings *) (* A function binding is a list of clauses, each of which uses a valBinding to hold the list of patterns and the corresponding function body. The second pass extracts the function variable and the number of patterns in each clause. It checks that they are the same in each clause. *) FValBind of { clauses: fvalclause list, numOfPatts: int ref, functVar: values ref, argType: types ref, resultType: types ref, location: location } and fvalclause = (* Clause within a function binding. *) FValClause of { dec: funpattern, exp: parsetree, line: location, breakPoint: breakPoint option ref } and typebind = (* Non-generative type binding *) TypeBind of { name: string, typeVars: typeVarForm list, decType: typeParsetree option, isEqtype: bool, (* True if this was an eqtype in a signature. *) tcon: typeConstrSet ref, nameLoc: location, fullLoc: location } and datatypebind = (* Generative type binding *) DatatypeBind of { name: string, typeVars: typeVarForm list, constrs: {constrName: string, constrArg: typeParsetree option, idLocn: location} list, tcon: typeConstrSet ref, nameLoc: location, fullLoc: location } and exbind = (* An exception declaration. It has a name and optionally a previous exception and a type. *) ExBind of { name: string, previous: parsetree, ofType: typeParsetree option, value: values ref, nameLoc: location, fullLoc: location } and matchtree = (* A match is a pattern and an expression. If the pattern matches then the expression is evaluated in the environment of the pattern. *) MatchTree of { vars: parsetree, exp: parsetree, location: location, argType: types ref, resType: types ref, breakPoint: breakPoint option ref } (* Name of a structure. Used only in an ``open'' declaration. *) withtype structureIdentForm = { name: string, value: structVals option ref, location: location } (* An entry in a label record in an expression or a pattern. *) and labelRecEntry = { name: string, nameLoc: location, valOrPat: parsetree, fullLocation: location, expType: types ref } and funpattern = (* The declaration part of a fun binding. *) { ident: { name: string, expType: types ref, location: location }, isInfix: bool, args: parsetree list, constraint: typeParsetree option } structure Sharing = struct type types = types and typeVarForm = typeVarForm and typeConstrSet = typeConstrSet and values = values and infixity = infixity and structVals = structVals and typeParsetree = typeParsetree and parsetree = parsetree and valbind = valbind and fvalbind = fvalbind and fvalclause = fvalclause and typebind = typebind and datatypebind = datatypebind and exbind = exbind and matchtree = matchtree end end; polyml-5.6/mlsource/MLCompiler/ParseTree/BaseParseTreeSig.sml000066400000000000000000000272401265146633400243120ustar00rootroot00000000000000(* Copyright (c) 2013-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) signature BaseParseTreeSig = sig type types and typeVarForm and typeConstrSet and values and infixity and structVals type typeParsetree type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type breakPoint = bool ref datatype parsetree = Ident of (* An identifier is just a name. In the second pass it is associated with a particular declaration and the type is assigned into the type field. The type of this identifier is needed to deal with overloaded operators. If we have an occurence of ``='', say, the type of the value will be 'a * 'a -> bool but the type of a particular occurence, i.e. the type of the identifier must be int * int -> bool, say, after all the unification has been done. *) { name: string, expType: types ref, value: values ref, location: location, possible: (unit -> string list) ref (* Used with the IDE. *) } | Literal of (* Literal constants may be overloaded on more than one type. The types are specified by installing appropriate conversion functions: convInt, convReal, convChar, convString and convWord. *) { converter: values, expType: types ref, literal: string, location: location } | Applic of (* Function application *) { f: parsetree, arg: parsetree, location: location, isInfix: bool, expType: types ref } | Cond of (* Conditional *) { test: parsetree, thenpt: parsetree, elsept: parsetree, location: location, thenBreak: breakPoint option ref, elseBreak: breakPoint option ref } | TupleTree of { fields: parsetree list, location: location, expType: types ref } | ValDeclaration of { dec: valbind list, explicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, implicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, location: location } | FunDeclaration of { dec: fvalbind list, explicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, implicit: {lookup: string -> typeVarForm option, apply: (string * typeVarForm -> unit) -> unit }, location: location } | OpenDec of (* Open a structure. The variables, structures and types are just needed if debugging information is being generated. *) { decs: structureIdentForm list, variables: values list ref, structures: structVals list ref, typeconstrs: typeConstrSet list ref, location: location } | Constraint of (* Constraint (explicit type given) *) (* A constraint has a value and a type. The actual type, will, however be the unification of these two and not necessarily the given type. *) { value: parsetree, given: typeParsetree, location: location } | Layered of (* Layered pattern. Equivalent to an ordinary pattern except that the variable is given the name of the object which is to be matched. *) { var: parsetree, pattern: parsetree, location: location } | Fn of { matches: matchtree list, location: location, expType: types ref } | Localdec of (* Local dec in dec and let dec in exp. *) { decs: (parsetree * breakPoint option ref) list, body: (parsetree * breakPoint option ref) list, isLocal: bool, varsInBody: values list ref, (* Variables in the in..dec part of a local declaration. *) location: location } | TypeDeclaration of typebind list * location | AbsDatatypeDeclaration of (* Datatype and Abstract Type declarations *) { isAbsType: bool, typelist: datatypebind list, withtypes: typebind list, declist: (parsetree * breakPoint option ref) list, location: location, equalityStatus: bool list ref } | DatatypeReplication of { newType: string, oldType: string, oldLoc: location, newLoc: location, location: location } | ExpSeq of (parsetree * breakPoint option ref) list * location | Directive of (* Directives are infix, infixr and nonfix. They are processed by the parser itself and only appear in the parse tree for completeness. *) { tlist: string list, fix: infixity, location: location } | ExDeclaration of exbind list * location | Raise of parsetree * location | HandleTree of (* Execute an expression and catch any exceptions. *) { exp: parsetree, hrules: matchtree list, location: location, listLocation: location } | While of (* Ordinary while-loop *) { test: parsetree, body: parsetree, location: location, breakPoint: breakPoint option ref } | Case of (* Case-statement *) { test: parsetree, match: matchtree list, location: location, listLocation: location, expType: types ref } | Andalso of { first: parsetree, second: parsetree, location: location } | Orelse of { first: parsetree, second: parsetree, location: location } | Labelled of (* Labelled record & the entry in the list. "frozen" is false if it's a pattern with "...". *) { recList: labelRecEntry list, frozen: bool, expType: types ref, location: location } | Selector of { name: string, labType: types, typeof: types, location: location } | List of { elements: parsetree list, location: location, expType: types ref } | EmptyTree | WildCard of location | Unit of location | Parenthesised of parsetree * location and valbind = (* Value bindings.*) ValBind of (* Consists of a declaration part (pattern) and an expression. *) { dec: parsetree, exp: parsetree, line: location, isRecursive: bool, variables: values list ref (* list of variables declared and their poly vars *) } and fvalbind = (* Function binding *) (* `Fun' bindings *) (* A function binding is a list of clauses, each of which uses a valBinding to hold the list of patterns and the corresponding function body. The second pass extracts the function variable and the number of patterns in each clause. It checks that they are the same in each clause. *) FValBind of { clauses: fvalclause list, numOfPatts: int ref, functVar: values ref, argType: types ref, resultType: types ref, location: location } and fvalclause = (* Clause within a function binding. *) FValClause of { dec: funpattern, exp: parsetree, line: location, breakPoint: breakPoint option ref } and typebind = (* Non-generative type binding *) TypeBind of { name: string, typeVars: typeVarForm list, decType: typeParsetree option, isEqtype: bool, (* True if this was an eqtype in a signature. *) tcon: typeConstrSet ref, nameLoc: location, fullLoc: location } and datatypebind = (* Generative type binding *) DatatypeBind of { name: string, typeVars: typeVarForm list, constrs: {constrName: string, constrArg: typeParsetree option, idLocn: location} list, tcon: typeConstrSet ref, nameLoc: location, fullLoc: location } and exbind = (* An exception declaration. It has a name and optionally a previous exception and a type. *) ExBind of { name: string, previous: parsetree, ofType: typeParsetree option, value: values ref, nameLoc: location, fullLoc: location } and matchtree = (* A match is a pattern and an expression. If the pattern matches then the expression is evaluated in the environment of the pattern. *) MatchTree of { vars: parsetree, exp: parsetree, location: location, argType: types ref, resType: types ref, breakPoint: breakPoint option ref } (* Name of a structure. Used only in an ``open'' declaration. *) withtype structureIdentForm = { name: string, value: structVals option ref, location: location } (* An entry in a label record in an expression or a pattern. *) and labelRecEntry = { name: string, nameLoc: location, valOrPat: parsetree, fullLocation: location, expType: types ref } and funpattern = (* The declaration part of a fun binding. *) { ident: { name: string, expType: types ref, location: location }, isInfix: bool, args: parsetree list, constraint: typeParsetree option } structure Sharing: sig type types = types and typeVarForm = typeVarForm and typeConstrSet = typeConstrSet and values = values and infixity = infixity and structVals = structVals and typeParsetree = typeParsetree and parsetree = parsetree and valbind = valbind and fvalbind = fvalbind and fvalclause = fvalclause and typebind = typebind and datatypebind = datatypebind and exbind = exbind and matchtree = matchtree end end; polyml-5.6/mlsource/MLCompiler/ParseTree/CODEGEN_PARSETREE.sml000066400000000000000000002573201265146633400236440ustar00rootroot00000000000000(* Copyright (c) 2013-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor CODEGEN_PARSETREE ( structure BASEPARSETREE : BaseParseTreeSig structure PRINTTREE: PrintParsetreeSig structure EXPORTTREE: ExportParsetreeSig structure MATCHCOMPILER: MatchCompilerSig structure LEX : LEXSIG structure CODETREE : CODETREESIG structure DEBUGGER : DEBUGGERSIG structure TYPETREE : TYPETREESIG structure TYPEIDCODE: TYPEIDCODESIG structure STRUCTVALS : STRUCTVALSIG structure VALUEOPS : VALUEOPSSIG structure DATATYPEREP: DATATYPEREPSIG structure DEBUG: DEBUGSIG structure MISC : sig (* These are handled in the compiler *) exception Conversion of string (* string to int conversion failure *) (* This isn't handled at all (except generically) *) exception InternalError of string (* compiler error *) end structure ADDRESS : AddressSig sharing BASEPARSETREE.Sharing = PRINTTREE.Sharing = EXPORTTREE.Sharing = MATCHCOMPILER.Sharing = LEX.Sharing = CODETREE.Sharing = DEBUGGER.Sharing = TYPETREE.Sharing = TYPEIDCODE.Sharing = STRUCTVALS.Sharing = VALUEOPS.Sharing = DATATYPEREP.Sharing = ADDRESS ): CodegenParsetreeSig = struct open BASEPARSETREE open PRINTTREE open EXPORTTREE open MATCHCOMPILER open CODETREE open TYPEIDCODE open LEX open TYPETREE open DEBUG open STRUCTVALS open VALUEOPS open MISC open DATATYPEREP open TypeVarMap open DEBUGGER open RuntimeCalls; (* for POLY_SYS numbers *) datatype environEntry = datatype DEBUGGER.environEntry (* To simplify passing the context it is wrapped up in this type. *) type cgContext = { decName: string, debugEnv: debuggerStatus, mkAddr: int->int, level: level, typeVarMap: typeVarMap, lex: lexan, lastDebugLine: int ref, isOuterLevel: bool (* Used only to decide if we need to report non-exhaustive matches. *) } fun repDecName decName ({debugEnv, mkAddr, level, typeVarMap, lex, lastDebugLine, isOuterLevel, ...}: cgContext) = { debugEnv=debugEnv, mkAddr=mkAddr, level=level, typeVarMap=typeVarMap, decName=decName, lex=lex, lastDebugLine=lastDebugLine, isOuterLevel = isOuterLevel}: cgContext and repDebugEnv debugEnv ({decName, mkAddr, level, typeVarMap, lex, lastDebugLine, isOuterLevel, ...}: cgContext) = { debugEnv=debugEnv, mkAddr=mkAddr, level=level, typeVarMap=typeVarMap, decName=decName, lex=lex, lastDebugLine=lastDebugLine, isOuterLevel = isOuterLevel}: cgContext and repTypeVarMap typeVarMap ({decName, debugEnv, mkAddr, level, lex, lastDebugLine, isOuterLevel, ...}: cgContext) = { debugEnv=debugEnv, mkAddr=mkAddr, level=level, typeVarMap=typeVarMap, decName=decName, lex=lex, lastDebugLine=lastDebugLine, isOuterLevel = isOuterLevel}: cgContext (* Create a new level. Sets isOuterLevel to false. *) and repNewLevel(decName, mkAddr, level) ({debugEnv, lex, lastDebugLine, typeVarMap, ...}: cgContext) = { debugEnv=debugEnv, mkAddr=mkAddr, level=level, typeVarMap=typeVarMap, decName=decName, lex=lex, lastDebugLine=lastDebugLine, isOuterLevel = false}: cgContext (* Try this pipeline function *) infix |> fun a |> f = f a val singleArg = mkLoadArgument 0 (* Make a tuple out of a set of arguments or return the single argument if there is just one. *) fun mkArgTuple(from, nTuple) = if nTuple = 1 (* "tuple" is a singleton *) then mkLoadArgument from else if nTuple <= 0 then raise InternalError "mkArgTuple" else mkTuple(List.tabulate(nTuple, fn n => mkLoadArgument(n+from))) (* Load args by selecting from a tuple. *) fun loadArgsFromTuple([t], arg) = [(arg, t)](* "tuple" is a singleton *) | loadArgsFromTuple(types, arg) = ListPair.zip(List.tabulate(List.length types, fn num => mkInd (num, arg)), types) (* Return the argument/result type which is currently just floating point or everything else. *) fun getCodeArgType t = if isFloatingPt t then FloatingPtType else GeneralType (* tupleWidth returns the width of a tuple or record or 1 if it isn't one. It is used to detect both argument tuples and results. When used for arguments the idea is that frequently a tuple is used as a way of passing multiple arguments and these can be passed on the stack. When used for results the idea is to create the result tuple on the stack and avoid garbage collector and allocator time. If we could tell that the caller was simply going to explode it we would gain but if the caller needed a tuple on the heap we wouldn't. We wouldn't actually lose if we were going to create a tuple and return it but we would lose if we exploded a tuple here and then created a new one in the caller. This version of the code assumes that if we create a tuple on one branch we're going to create one on others which may not be correct. *) (* This now returns the argument type for each entry so returns a list rather than a number. *) fun tupleWidth(TupleTree{expType=ref expType, ...}) = recordFieldMap getCodeArgType expType | tupleWidth(Labelled{expType=ref expType, ...}) = if recordNotFrozen expType (* An error, but reported elsewhere. *) then [GeneralType] (* Safe enough *) else recordFieldMap getCodeArgType expType | tupleWidth(Cond{thenpt, elsept, ...}) = ( case tupleWidth thenpt of [_] => tupleWidth elsept | w => w ) | tupleWidth(Constraint{value, ...}) = tupleWidth value | tupleWidth(HandleTree{exp, ...}) = (* Look only at the expression and ignore the handlers on the, possibly erroneous, assumption that they won't normally be executed. *) tupleWidth exp | tupleWidth(Localdec{body=[], ...}) = raise InternalError "tupleWidth: empty localdec" | tupleWidth(Localdec{body, ...}) = (* We are only interested in the last expression. *) tupleWidth(#1 (List.last body)) | tupleWidth(Case{match, ...}) = let fun getWidth(MatchTree{exp, ...}) = tupleWidth exp in List.foldl(fn(v, [_]) => getWidth v | (_, s) => s) [GeneralType] match end | tupleWidth(Parenthesised(p, _)) = tupleWidth p | tupleWidth(ExpSeq(p, _)) = tupleWidth(#1 (List.last p)) | tupleWidth(Ident{ expType=ref expType, ...}) = [getCodeArgType expType] | tupleWidth(Literal{ expType=ref expType, ...}) = [getCodeArgType expType] | tupleWidth(Applic{ expType=ref expType, ...}) = [getCodeArgType expType] | tupleWidth _ = [GeneralType] (* Start of the code-generator itself. *) (* Report unreferenced identifiers. *) fun reportUnreferencedValue lex (Value{name, references=SOME{exportedRef=ref false, localRef=ref nil, ...}, locations, ...}) = let fun getDeclLoc (DeclaredAt loc :: _) = loc | getDeclLoc (_ :: locs) = getDeclLoc locs | getDeclLoc [] = nullLocation (* Shouldn't happen. *) in warningMessage(lex, getDeclLoc locations, "Value identifier ("^name^") has not been referenced.") end | reportUnreferencedValue _ _ = () (* Process a list of possibly mutually recursive functions and identify those that are really referenced. *) fun reportUnreferencedValues(valList, lex) = let fun checkRefs valList = let fun unReferenced(Value{references=SOME{exportedRef=ref false, localRef=ref nil, ...}, ...}) = true | unReferenced _ = false val (unrefed, refed) = List.partition unReferenced valList fun update(Value{references=SOME{localRef, recursiveRef, ...}, ...}, changed) = let (* If it is referred to by a referenced function it is referenced. *) fun inReferenced(_, refName) = List.exists (fn Value{name, ...} => name=refName) refed val (present, absent) = List.partition inReferenced (!recursiveRef) in if null present then changed else ( localRef := List.map #1 present @ ! localRef; recursiveRef := absent; true ) end | update(_, changed) = changed in (* Repeat until there's no change. *) if List.foldl update false unrefed then checkRefs unrefed else () end in checkRefs valList; List.app (reportUnreferencedValue lex) valList end fun makeDebugEntries (vars: values list, {debugEnv, level, typeVarMap, lex, mkAddr, ...}: cgContext) = let val (code, newDebug) = DEBUGGER.makeValDebugEntries(vars, debugEnv, level, lex, mkAddr, typeVarMap) in (code, newDebug) end (* Add a breakpoint if debugging is enabled. The bpt argument is set in the parsetree so that it can be found by the IDE. *) fun addBreakPointCall(bpt, location, {mkAddr, level, lex, debugEnv, ...}) = let open DEBUGGER val (lineCode, newStatus) = updateDebugLocation(debugEnv, location, lex) val code = breakPointCode(bpt, location, level, lex, mkAddr) in (lineCode @ code, newStatus) end (* In order to build a call stack in the debugger we need to know about function entry and exit. *) fun wrapFunctionInDebug(codeBody, name, argCode, argType, restype, location, {debugEnv, mkAddr, level, lex, ...}) = DEBUGGER.wrapFunctionInDebug(codeBody, name, argCode, argType, restype, location, debugEnv, level, lex, mkAddr) (* Create an entry in the static environment for the function. *) (* fun debugFunctionEntryCode(name, argCode, argType, location, {debugEnv, mkAddr, level, lex, ...}) = DEBUGGER.debugFunctionEntryCode(name, argCode, argType, location, debugEnv, level, lex, mkAddr)*) (* Find all the variables declared by each pattern. *) fun getVariablesInPatt (Ident {value = ref ident, ...}, varl) = (* Ignore constructors *) if isConstructor ident then varl else ident :: varl | getVariablesInPatt(TupleTree{fields, ...}, varl) = List.foldl getVariablesInPatt varl fields | getVariablesInPatt(Labelled {recList, ...}, varl) = List.foldl (fn ({valOrPat, ...}, vl) => getVariablesInPatt(valOrPat, vl)) varl recList (* Application of a constructor: only the argument can contain vars. *) | getVariablesInPatt(Applic {arg, ...}, varl) = getVariablesInPatt (arg, varl) | getVariablesInPatt(List{elements, ...}, varl) = List.foldl getVariablesInPatt varl elements | getVariablesInPatt(Constraint {value, ...}, varl) = getVariablesInPatt(value, varl) | getVariablesInPatt(Layered {var, pattern, ...}, varl) = (* There may be a constraint on the variable so it is easiest to recurse. *) getVariablesInPatt(pattern, getVariablesInPatt(var, varl)) | getVariablesInPatt(Parenthesised(p, _), varl) = getVariablesInPatt(p, varl) | getVariablesInPatt(_, varl) = varl (* constants and error cases. *); (* If we are only passing equality types filter out the others. *) val filterTypeVars = List.filter (fn tv => not justForEqualityTypes orelse tvEquality tv) fun codeMatch(near, alt : matchtree list, arg, isHandlerMatch, matchContext as { level, mkAddr, lex, typeVarMap, ...}): codetree = let val noOfPats = length alt (* Check for unreferenced variables. *) val () = if getParameter reportUnreferencedIdsTag (debugParams lex) then let fun getVars(MatchTree{vars, ...}, l) = getVariablesInPatt(vars, l) val allVars = List.foldl getVars [] alt in List.app (reportUnreferencedValue lex) allVars end else () val lineNo = case alt of MatchTree {location, ... } :: _ => location | _ => raise Match (* Save the argument in a variable. *) val decCode = multipleUses (arg, fn () => mkAddr 1, level); (* Generate code to load it. *) val loadExpCode = #load decCode level; (* Generate a range of addresses for any functions that have to be generated for the expressions. *) val baseAddr = mkAddr noOfPats (* We want to avoid the code blowing up if we have a large expression which occurs multiple times in the resulting code. e.g. case x of [1,2,3,4] => exp1 | _ => exp2 Here exp2 will be called at several points in the code. Most patterns occur only once, sometimes a few more times. The first three times the pattern occurs the code is inserted directly. Further cases are dealt with as function calls. *) val insertDirectCount = 3 (* First three cases are inserted directly. *) (* Make an array to count the number of references to a pattern. This is used to decide whether to use a function for certain expressions or to make it inline. *) val uses = IntArray.array (noOfPats, 0); (* Called when a selection has been made to code-generate the expression. *) fun codePatternExpression pattChosenIndex = let val context = matchContext (* Increment the count for this pattern. *) val useCount = IntArray.sub(uses, pattChosenIndex) + 1 val () = IntArray.update (uses, pattChosenIndex, useCount) val MatchTree {vars, exp, breakPoint, ... } = List.nth(alt, pattChosenIndex) in if useCount <= insertDirectCount then (* Use the expression directly *) let (* If debugging add debug entries for the variables then put in a break-point. *) val vl = getVariablesInPatt(vars, []) val (envDec, varDebugEnv) = makeDebugEntries(vl, context) val (bptCode, bptEnv) = addBreakPointCall(breakPoint, getLocation exp, context |> repDebugEnv varDebugEnv) in mkEnv(envDec @ bptCode, codegen (exp, context |> repDebugEnv bptEnv)) end else let (* Put in a call to the expression as a function. *) val thisVars = getVariablesInPatt(vars, []) (* Make an argument list from the variables bound in the pattern. *) fun makeArg(Value{access=Local{addr=ref lvAddr, ...}, ...}) = mkLoadLocal lvAddr | makeArg _ = raise InternalError "makeArg" val argsForCall = List.map makeArg thisVars in mkEval(mkLoadLocal (baseAddr + pattChosenIndex), argsForCall) end end (* Generate the code and also check for redundancy and exhaustiveness. *) local val cmContext = { mkAddr = mkAddr, level = level, typeVarMap = typeVarMap, lex = lex } in val (matchCode, exhaustive) = codeMatchPatterns(alt, loadExpCode, isHandlerMatch, lineNo, codePatternExpression, cmContext) end (* Report inexhaustiveness if necessary. TODO: It would be nice to have some example of a pattern that isn't matched for. *) (* If this is a handler we may have set the option to report exhaustiveness. This helps in tracking down handlers that don't treat Interrupt specially. *) val () = if exhaustive then if isHandlerMatch andalso getParameter reportExhaustiveHandlersTag (debugParams lex) then errorNear (lex, false, near, lineNo, "Handler catches all exceptions.") else () else if isHandlerMatch then () else errorNear (lex, false, near, lineNo, "Matches are not exhaustive.") (* Report redundant patterns. *) local fun reportRedundant(patNo, 0) = let val MatchTree {location, ... } = List.nth(alt, patNo) in errorNear (lex, false, near, location, "Pattern " ^ Int.toString (patNo+1) ^ " is redundant.") end | reportRedundant _ = () in val () = IntArray.appi reportRedundant uses end (* Generate functions for expressions that have been used more than 3 times. *) fun cgExps([], _, _, _, _, _, _) = [] | cgExps (MatchTree {vars, exp, breakPoint, ...} ::al, base, patNo, uses, lex, near, cgContext as { decName, level, ...}) = if IntArray.sub(uses, patNo - 1) <= insertDirectCount then (* Skip if it has been inserted directly and we don't need a fn. *) cgExps(al, base, patNo + 1, uses, lex, near, cgContext) else let val functionLevel = newLevel level (* For the function. *) local val addresses = ref 1 in fun fnMkAddrs n = ! addresses before (addresses := !addresses + n) end val fnContext = cgContext |> repNewLevel(decName, fnMkAddrs, functionLevel) (* We have to pass the variables as arguments. Bind a local variable to the argument so we can set the variable address as a local address. *) val pattVars = getVariablesInPatt(vars, []) val noOfArgs = length pattVars val argumentList = List.tabulate(noOfArgs, mkLoadArgument) val localAddresses = List.map(fn _ => fnMkAddrs 1) pattVars (* One address for each argument. *) val localDecs = ListPair.mapEq mkDec (localAddresses, argumentList) local (* Set the addresses to be suitable for arguments. At the same time create a debugging environment if required. *) fun setAddr (Value{access=Local{addr=lvAddr, level=lvLevel}, ...}, localAddr) = (lvAddr := localAddr; lvLevel := functionLevel) | setAddr _ = raise InternalError "setAddr" in val _ = ListPair.appEq setAddr (pattVars, localAddresses) end (* If debugging add the debug entries for the variables then a break-point. *) val (envDec, varDebugEnv) = makeDebugEntries(pattVars, fnContext) val (bptCode, bptEnv) = addBreakPointCall(breakPoint, getLocation exp, fnContext |> repDebugEnv varDebugEnv) val functionBody = mkEnv(localDecs @ envDec @ bptCode, codegen (exp, fnContext |> repDebugEnv bptEnv)) val patNoIndex = patNo - 1 in mkDec(base + patNoIndex, mkProc (functionBody, noOfArgs, decName ^ "/" ^ Int.toString patNo, getClosure functionLevel, fnMkAddrs 0)) :: cgExps(al, base, patNo + 1, uses, lex, near, cgContext) end val expressionFuns = cgExps(alt, baseAddr, 1, uses, lex, near, matchContext) in (* Return the code in a block. *) mkEnv (#dec decCode @ expressionFuns, matchCode) end (* codeMatch *) (* Code-generates a piece of tree. Returns the code and also the, possibly updated, debug context. This is needed to record the last location that was set in the thread data. *) and codeGenerate(Ident {value = ref (v as Value{class = Exception, ...}), location, ...}, { level, typeVarMap, lex, debugEnv, ...}) = (* Exception identifier *) (codeExFunction (v, level, typeVarMap, [], lex, location), debugEnv) | codeGenerate(Ident {value = ref (v as Value{class = Constructor _, ...}), expType=ref expType, location, ...}, { level, typeVarMap, lex, debugEnv, ...}) = (* Constructor identifier *) let (* The instance type is not necessarily the same as the type of the value of the identifier. e.g. in the expression 1 :: nil, "::" has an instance type of int * list int -> list int but the type of "::" is 'a * 'a list -> 'a list. *) (* When using the constructor as a value we just want the second word. Must pass [] as the polyVars otherwise this will be applied BEFORE extracting the construction function not afterwards. *) fun getConstr level = ValueConstructor.extractInjection(codeVal (v, level, typeVarMap, [], lex, location)) val polyVars = getPolymorphism (v, expType, typeVarMap) val code = applyToInstance(if justForEqualityTypes then [] else polyVars, level, typeVarMap, getConstr) in (code, debugEnv) end | codeGenerate(Ident {value = ref v, expType=ref expType, location, ...}, { level, typeVarMap, lex, debugEnv, ...}) = (* Value identifier *) let val polyVars = getPolymorphism (v, expType, typeVarMap) val code = codeVal (v, level, typeVarMap, polyVars, lex, location) in (code, debugEnv) end | codeGenerate(c as Literal{converter, literal, expType=ref expType, location}, { lex, debugEnv, ...}) = ( case getLiteralValue(converter, literal, expType, fn s => errorNear(lex, true, c, location, s)) of SOME w => (mkConst w, debugEnv) | NONE => (CodeZero, debugEnv) ) | codeGenerate(Applic {f = Ident {value = ref function, expType=ref expType, ...}, arg, location, ...}, context as { level, typeVarMap, lex, ...}) = (* Some functions are special e.g. overloaded and type-specific functions. These need to picked out and processed by applyFunction. *) let val polyVars = getPolymorphism (function, expType, typeVarMap) val (argCode, argEnv) = codeGenerate (arg, context) val code = applyFunction (function, argCode, level, typeVarMap, polyVars, lex, location) in (code, argEnv) end | codeGenerate(Applic {f, arg, ...}, context) = let val (fnCode, fnEnv) = codeGenerate(f, context) val (argCode, argEnv) = codeGenerate(arg, context |> repDebugEnv fnEnv) in (mkEval (fnCode, [argCode]), argEnv) end | codeGenerate(Cond {test, thenpt, elsept, thenBreak, elseBreak, ...}, context) = let val (testCode, testEnv) = codeGenerate(test, context) val (thenBptCode, thenDebug) = addBreakPointCall(thenBreak, getLocation thenpt, context |> repDebugEnv testEnv) val (thenCode, _) = codeGenerate(thenpt, context |> repDebugEnv thenDebug) val (elseBptCode, elseDebug) = addBreakPointCall(elseBreak, getLocation elsept, context |> repDebugEnv testEnv) val (elseCode, _) = codeGenerate(elsept, context |> repDebugEnv elseDebug) in (mkIf (testCode, mkEnv(thenBptCode, thenCode), mkEnv(elseBptCode, elseCode)), testEnv) end | codeGenerate(TupleTree{fields=[(*pt*)_], ...}, _) = (* There was previously a special case to optimise unary tuples but I can't understand how they can occur. Check this and remove the special case if it really doesn't. *) raise InternalError "codegen: Unary tuple" (*codegen (pt, context)*) | codeGenerate(TupleTree{fields, ...}, context as { debugEnv, ...}) = (* Construct a vector of objects. *) (mkTuple(map (fn x => codegen (x, context)) fields), debugEnv) | codeGenerate(Labelled {recList = [{valOrPat, ...}], ...}, context) = codeGenerate (valOrPat, context) (* optimise unary records *) | codeGenerate(Labelled {recList, expType=ref expType, ...}, context as { level, mkAddr, debugEnv, ...}) = let (* We must evaluate the expressions in the order they are written. This is not necessarily the order they appear in the record. *) val recordSize = length recList; (* The size of the record. *) (* First declare the values as local variables. *) (* We work down the list evaluating the expressions and putting the results away in temporaries. When we reach the end we construct the tuple by asking for each entry in turn. *) fun declist [] look = ([], mkTuple (List.tabulate (recordSize, look))) | declist ({name, valOrPat, ...} :: t) look = let val thisDec = multipleUses (codegen (valOrPat, context), fn () => mkAddr 1, level); val myPosition = entryNumber (name, expType); fun lookFn i = if i = myPosition then #load thisDec (level) else look i val (otherDecs, tuple) = declist t lookFn in (#dec thisDec @ otherDecs, tuple) end in (* Create the record and package it up as a block. *) (mkEnv (declist recList (fn _ => raise InternalError "missing in record")), debugEnv) end | codeGenerate(c as Selector {name, labType, location, typeof, ...}, { decName, typeVarMap, lex, debugEnv, ...}) = let (* Check that the type is frozen. *) val () = if recordNotFrozen labType then errorNear (lex, true, c, location, "Can't find a fixed record type.") else (); val selectorBody : codetree = if recordWidth labType = 1 then singleArg (* optimise unary tuples - no indirection! *) else let val offset : int = entryNumber (name, labType); in mkInd (offset, singleArg) end val code =(* Make an inline function. *) case filterTypeVars (getPolyTypeVars(typeof, mapTypeVars typeVarMap)) of [] => mkInlproc (selectorBody, 1, decName ^ "#" ^ name, [], 0) | polyVars => (* This may be polymorphic. *) mkInlproc( mkInlproc (selectorBody, 1, decName ^ "#" ^ name, [], 0), List.length polyVars, decName ^ "#" ^ name ^ "(P)", [], 0) in (code, debugEnv) end | codeGenerate(Unit _, { debugEnv, ...}) = (* Use zero. It is possible to have () = (). *) (CodeZero, debugEnv) | codeGenerate(List{elements, expType = ref listType, location, ...}, context as { level, typeVarMap, lex, debugEnv, ...}) = let (* Construct a list. We need to apply the constructors appropriate to the type. *) val baseType = case listType of TypeConstruction{args=[baseType], ...} => baseType | _ => raise InternalError "List: bad element type" val consType = mkFunctionType(mkProductType[baseType, listType], listType) fun consList [] = let (* "nil" *) val polyVars = getPolymorphism (nilConstructor, listType, typeVarMap) fun getConstr level = ValueConstructor.extractInjection( codeVal (nilConstructor, level, typeVarMap, [], lex, location)) in applyToInstance(polyVars, level, typeVarMap, getConstr) end | consList (h::t) = let (* :: *) val H = codegen (h, context) and T = consList t val polyVars = getPolymorphism (consConstructor, consType, typeVarMap) in applyFunction (consConstructor, mkTuple [H,T], level, typeVarMap, polyVars, lex, location) end in (consList elements, debugEnv) end | codeGenerate(Constraint {value, ...}, context) = codeGenerate (value, context) (* code gen. the value *) | codeGenerate(c as Fn { location, expType=ref expType, ... }, context as { typeVarMap, debugEnv, ...}) = (* Function *) (codeLambda(c, location, filterTypeVars(getPolyTypeVars(expType, mapTypeVars typeVarMap)), context), debugEnv) | codeGenerate(Localdec {decs, body, ...}, context) = (* Local expressions only. Local declarations will be handled by codeSequence.*) let (* This is the continuation called when the declarations have been processed. We need to ensure that if there are local datatypes we make new entries in the type value cache after them. *) (* TODO: This is a bit of a mess. We want to return the result of the last expression as an expression rather than a codeBinding. *) fun processBody (previousDecs: codeBinding list, nextContext as {debugEnv, ...}) = let fun codeList ([], d) = ([], d) | codeList ((p, bpt) :: tl, d) = (* Generate any break point code first, then this entry, then the rest. *) let val (lineChange, newEnv) = addBreakPointCall(bpt, getLocation p, nextContext |> repDebugEnv d) (* addBreakPointCall also updates the location info in case of a break-point or a function call. We want to pass that along. *) val code = mkNullDec(codegen (p, nextContext |> repDebugEnv newEnv)) val (codeRest, finalEnv) = codeList (tl, newEnv) in (lineChange @ [code] @ codeRest, finalEnv) end val (exps, finalDebugEnv) = codeList (body, debugEnv) in (previousDecs @ exps, finalDebugEnv) end val (decs, lastEnv) = codeSequence (decs, [], context, processBody) in (decSequenceWithFinalExp decs, lastEnv) end | codeGenerate(ExpSeq(ptl, _), context as { debugEnv, ...}) = (* Sequence of expressions. Discard results of all except the last.*) let fun codeList ([], _) = raise InternalError "ExpSeq: empty sequence" | codeList ((p, bpt)::tl, d) = let val (bptCode, newEnv) = addBreakPointCall(bpt, getLocation p, context |> repDebugEnv d) (* Because addBreakPointCall updates the location info in the debug env we need to pass this along in the same way as when making bindings. *) val (thisCode, postCodeEnv) = codeGenerate (p, context |> repDebugEnv newEnv) in case tl of [] => (bptCode, thisCode, postCodeEnv) | tl => let val (otherDecs, expCode, postListEnv) = codeList(tl, postCodeEnv) in (bptCode @ (mkNullDec thisCode :: otherDecs), expCode, postListEnv) end end val (codeDecs, codeExp, finalEnv) = codeList(ptl, debugEnv) in (mkEnv (codeDecs, codeExp), finalEnv) end | codeGenerate(Raise (pt, location), context as { level, mkAddr, ...}) = let val (raiseCode, raiseEnv) = codeGenerate(pt, context) val {dec, load} = multipleUses (raiseCode, fn () => mkAddr 1, level) val load = load level (* Copy the identifier, name and argument from the packet and add this location. *) val excPacket = mkEnv(dec, mkTuple[mkInd(0, load), mkInd(1, load), mkInd(2, load), codeLocation location]) in (mkRaise excPacket, raiseEnv) end | codeGenerate(c as HandleTree {exp, hrules, ...}, context as { debugEnv, ...}) = (* Execute an expression in the scope of a handler *) let val handleExp = codegen (exp, context) val handlerCode = codeMatch (c, hrules, Ldexc, true, context) in (mkHandle (handleExp, handlerCode), debugEnv) end | codeGenerate(While {test, body, breakPoint, ...}, context as { debugEnv, ...}) = let val (testCode, testEnv) = codeGenerate(test, context) val (bptCode, testDebug) = addBreakPointCall(breakPoint, getLocation body, context |> repDebugEnv testEnv) val (bodyCode, _) = codeGenerate(body, context |> repDebugEnv testDebug) in (mkWhile (testCode, mkEnv(bptCode, bodyCode)), debugEnv) end | codeGenerate(c as Case {test, match, ...}, context as { debugEnv, ...}) = (* The matches are made into a series of tests and applied to the test expression. *) let val testCode = codegen (test, context) in (codeMatch (c, match, testCode, false, context), debugEnv) end | codeGenerate(Andalso {first, second, ...}, context) = let val (firstCode, firstEnv) = codeGenerate(first, context) (* Any updates to the debug context in the first part will carry over but we can't be sure whether any of the second part will be executed. *) val (secondCode, _) = codeGenerate(second, context |> repDebugEnv firstEnv) in (* Equivalent to if first then second else false *) (mkCand (firstCode, secondCode), firstEnv) end | codeGenerate(Orelse {first, second, ...}, context) = let val (firstCode, firstEnv) = codeGenerate(first, context) (* Any updates to the debug context in the first part will carry over but we can't be sure whether any of the second part will be executed. *) val (secondCode, _) = codeGenerate(second, context |> repDebugEnv firstEnv) in (* Equivalent to if first then true else second *) (mkCor (firstCode, secondCode), firstEnv) end | codeGenerate(Parenthesised(p, _), context) = codeGenerate (p, context) | codeGenerate(_, {debugEnv, ...}) = (CodeZero, debugEnv) (* empty and any others *) (* Old codegen function which discards the debug context. *) and codegen (c: parsetree, context) = #1 (codeGenerate(c, context)) (* Code-generate a lambda (fn expression). *) and codeLambda(c, location, polyVars, cpContext as {mkAddr=originalmkAddr, level=originalLevel, decName, ...}) = let fun getFnBody (Constraint {value, ...}) = getFnBody value | getFnBody (Fn{matches, ...}) = matches | getFnBody (Parenthesised(p, _)) = getFnBody p | getFnBody _ = raise InternalError "getFnBody: not a constrained fn-expression"; val f = getFnBody c; (* This function comprises a new declaration level *) val nLevel = if null polyVars then originalLevel else newLevel originalLevel local val addresses = ref 1 in fun fnMkAddr n = (! addresses) before (addresses := ! addresses + n) end val (firstPat, resType, argType) = case f of MatchTree {vars, resType = ref rtype, argType = ref atype, ...} :: _ => (vars, rtype, atype) | _ => raise InternalError "codeLambda: body of fn is not a clause list"; val tupleSize = List.length(tupleWidth firstPat) in if tupleSize <> 1 andalso null polyVars then let (* If the first pattern is a tuple we make a tuple from the arguments and pass that in. Could possibly treat labelled records in the same way but we have the problem of finding the size of the record. Currently, we don't apply this optimisation if the function is polymorphic. *) val newDecName : string = decName ^ "(" ^ Int.toString tupleSize ^ ")"; val fnLevel = newLevel nLevel val argumentCode = mkArgTuple(0, tupleSize) val newContext = cpContext |> repNewLevel(newDecName, fnMkAddr, fnLevel) fun codeAlts newDebugEnv = let val bodyContext = newContext |> repDebugEnv newDebugEnv in codeMatch (c, f, argumentCode, false, bodyContext) end val wrap = wrapFunctionInDebug(codeAlts, newDecName, argumentCode, argType, resType, location, newContext) val mainProc = mkProc(wrap, tupleSize, newDecName, getClosure fnLevel, fnMkAddr 0) (* Now make a block containing the procedure which expects multiple arguments and an inline procedure which expects a single tuple argument and calls the main procedure after taking the tuple apart. *) val thisDec = multipleUses (mainProc, fn () => originalmkAddr 1, originalLevel); val resProc = (* Result procedure. *) let val nLevel = newLevel originalLevel in mkInlproc (mkEval(#load thisDec nLevel, List.map #1 (loadArgsFromTuple(List.tabulate(tupleSize, fn _ => GeneralType), singleArg))), 1, decName ^ "(1)", getClosure nLevel, 0) end in mkEnv(#dec thisDec, resProc) end else let (* No tuple or polymorphic. *) val newDecName : string = decName ^ "(1)"; val fnLevel = newLevel nLevel val newContext = cpContext |> repNewLevel(newDecName, fnMkAddr, fnLevel) fun codeAlts newDebugEnv = let val bodyContext = newContext |> repDebugEnv newDebugEnv in codeMatch (c, f, mkLoadArgument 0, false, bodyContext) end (* If we're debugging add the debug info before resetting the level. *) val wrapped = wrapFunctionInDebug(codeAlts, newDecName, mkLoadArgument 0, argType, resType, location, newContext) val pr = mkProc (wrapped, 1, newDecName, getClosure fnLevel, fnMkAddr 0) in if null polyVars then pr else mkProc(pr, List.length polyVars, newDecName^"(P)", getClosure nLevel, 0) end end (* codeLambda *) (* Code-generates a sequence of declarations. *) and codeSequence ([], leading, codeSeqContext, processBody): codeBinding list * debuggerStatus = processBody(leading, codeSeqContext) (* Do the continuation. *) | codeSequence ((firstEntry as FunDeclaration {dec, ...}, _) :: pTail, leading, codeSeqContext, processBody) = let val (firstDec, firstEnv) = codeFunBindings(dec, firstEntry, codeSeqContext) in codeSequence (pTail, leading @ firstDec, codeSeqContext |> repDebugEnv firstEnv, processBody) end | codeSequence ((firstEntry as ValDeclaration {dec, location, ...}, bpt) :: pTail, leading, codeSeqContext as {lex, ...}, processBody) = let (* Check the types for escaped datatypes. *) local fun checkVars(ValBind{variables=ref vars, line, ...}) = List.app(fn var => checkForEscapingDatatypes(valTypeOf var, fn message => errorNear (lex, true, firstEntry, line, message))) vars in val () = List.app checkVars dec end (* Put in a break point *) val (bptCode, bptDbEnv) = addBreakPointCall(bpt, location, codeSeqContext) val postBptContext = codeSeqContext |> repDebugEnv bptDbEnv (* Split the bindings into recursive and non-recursive. These have to be processed differently. *) val (recBindings, nonrecBindings) = List.partition(fn ValBind{isRecursive, ...} => isRecursive) dec val nonRecCode = codeNonRecValBindings(nonrecBindings, firstEntry, postBptContext) val recCode = case recBindings of [] => [] | _ => #1 (codeRecValBindings(recBindings, firstEntry, postBptContext)) (* Construct the debugging environment by loading all variables. *) val vars = List.foldl(fn (ValBind{variables=ref v, ...}, vars) => v @ vars) [] dec val (decEnv, env) = makeDebugEntries (vars, postBptContext) in codeSequence (pTail, leading @ bptCode @ nonRecCode @ recCode @ decEnv, codeSeqContext |> repDebugEnv env, processBody) end | codeSequence ((Localdec {decs, body, varsInBody=ref vars, ...}, _) :: pTail, leading, codeSeqContext, processBody) = let (* Local declarations only *) (* The debug environment needs to reflect the local...in...end structure but if there are local datatypes we need to process all subsequent declarations in the scope of the "stopper" we've put onto the typeVarMap. *) fun processTail(previous, newContext) = let (* The debug env for the tail is the original environment together with the variables in the body, excluding variables in the local...in part. *) val (decEnv, resEnv) = makeDebugEntries (vars, codeSeqContext) (* Original context. *) in codeSequence (pTail, previous @ decEnv, newContext |> repDebugEnv resEnv, processBody) end in (* Process the declarations then the tail. *) codeSequence (decs @ body, leading, codeSeqContext, processTail) end | codeSequence ((ExDeclaration(tlist, _), _) :: pTail, leading, codeSeqContext as {mkAddr, level, typeVarMap, lex, ...}, processBody) = let fun codeEx (ExBind{value=ref exval, previous, ... }) = let val ex = exval; (* This exception is treated in the same way as a local variable except that the value it contains is created by generating a word on the heap. The address of this word constitutes a unique identifier. Non-generative exception bindings i.e. exception ex=ex' merely copy the word from the previous exception. *) val (lvAddr, lvLevel, exType) = case ex of Value{access=Local{addr, level}, typeOf, ...} => (addr, level, typeOf) | _ => raise InternalError "lvAddr" in lvAddr := mkAddr 1; lvLevel := level; mkDec (! lvAddr, case previous of EmptyTree => (* Generate a new exception. This is a single mutable word which acts as a token. It is a mutable to ensure that there is precisely one copy of it. It contains a function to print values of the type so when we raise the exception we can print the exception packet without knowing the type. *) mkExIden (exType, level, typeVarMap) | Ident{value=ref prevVal, location, ...} => (* Copy the previous value. N.B. We want the exception identifier here so we can't call codegen. *) codeVal (prevVal, level, typeVarMap, [], lex, location) | _ => raise InternalError "codeEx" ) end (* codeEx *); val exdecs = map codeEx tlist fun getValue(ExBind{value=ref exval, ...}) = exval val (debugDecs, newDebugEnv) = makeDebugEntries(map getValue tlist, codeSeqContext) in codeSequence (pTail, leading @ exdecs @ debugDecs, codeSeqContext |> repDebugEnv newDebugEnv, processBody) end (* ExDeclaration *) | codeSequence ( (AbsDatatypeDeclaration {typelist, declist, equalityStatus = ref absEq, isAbsType, withtypes, ...}, _) :: pTail, leading, codeSeqContext as {mkAddr, level, typeVarMap, debugEnv, lex, ...}, processBody) = let (* Code-generate the eq and print functions for the abstype first then the declarations, which may use these. *) (* The debugging environment for the declarations should include the constructors but the result shouldn't. For the moment ignore the constructors. *) val typeCons = List.map(fn (DatatypeBind {tcon = ref tc, ...}) => tc) typelist val eqStatus = if isAbsType then absEq else List.map (tcEquality o tsConstr) typeCons local fun getConstrCode(DatatypeBind {tcon = ref (tc as TypeConstrSet(_, constrs)), typeVars, ...}, eqStatus) = let (* Get the argument types or EmptyType if this is nullary. *) fun getConstrType(Value{typeOf=FunctionType{arg, ...}, name, ...}) = (name, arg) | getConstrType(Value{name, ...}) = (name, EmptyType) val constrTypesAndNames = List.map getConstrType constrs val {constrs, boxed, size} = chooseConstrRepr(constrTypesAndNames, List.map TypeVar typeVars) in ({typeConstr=tc, eqStatus=eqStatus, boxedCode=boxed, sizeCode=size}, constrs) end in val constrAndBoxSizeCode = ListPair.mapEq getConstrCode (typelist, eqStatus) val (tcEqBoxSize, constrsCode) = ListPair.unzip constrAndBoxSizeCode end local fun decConstrs(DatatypeBind {tcon = ref (TypeConstrSet(_, constrs)), ...}, reprs, (decs, debugEnv)) = let (* Declare the constructors as local variables. *) fun decCons(Value{access=Local{addr, level=lev}, ...}, repr) = let val newAddr = mkAddr 1 in addr := newAddr; lev := level; mkDec(newAddr, repr) end | decCons _ = raise InternalError "decCons: Not local" val constrDecs = ListPair.map decCons (constrs, reprs) val (newDecs, newDebug) = makeDebugEntries(constrs, codeSeqContext |> repDebugEnv debugEnv) in (constrDecs @ decs @ newDecs, newDebug) end in val (valConstrDecs: codeBinding list, constrDebugenv: debuggerStatus) = ListPair.foldl decConstrs ([], debugEnv) (typelist, constrsCode) end val typeFunctions = createDatatypeFunctions(tcEqBoxSize, mkAddr, level, typeVarMap, getParameter createPrintFunctionsTag (debugParams lex)) local (* Create debug entries for the type constructors and the new type ids. *) val (dataTypeDebugDecs, dataTypeDebugEnv) = makeTypeConstrDebugEntries(typeCons, constrDebugenv, level, lex, mkAddr) val withTypeTypes = List.map(fn (TypeBind {tcon = ref tc, ...}) => tc) withtypes val (withTypeDebugDecs, withTypeDebugEnv) = makeTypeConstrDebugEntries(withTypeTypes, dataTypeDebugEnv, level, lex, mkAddr) in val typeDebugDecs = dataTypeDebugDecs @ withTypeDebugDecs val typeDebugEnv = withTypeDebugEnv end (* Mark these in the type value cache. If they are used in subsequent polymorphic IDs we must create them after this. *) val newTypeVarMap = markTypeConstructors(List.map tsConstr typeCons, mkAddr, level, typeVarMap) (* Process the with..end part. We have to restore the equality attribute for abstypes here in case getPolymorphism requires it. *) val () = if isAbsType then ListPair.appEq(fn(TypeConstrSet(tc, _), eqt) => tcSetEquality (tc, eqt)) (typeCons, absEq) else () val (localDecs, newDebug) = codeSequence (declist, [], codeSeqContext |> repDebugEnv typeDebugEnv |> repTypeVarMap newTypeVarMap, fn (code, {debugEnv, ...}) => (code, debugEnv)) val () = if isAbsType then List.app(fn TypeConstrSet(tc, _) => tcSetEquality (tc, false)) typeCons else () (* Then the subsequent declarations. *) val (tailDecs, finalEnv) = codeSequence (pTail, [], codeSeqContext |> repDebugEnv newDebug |> repTypeVarMap newTypeVarMap, processBody) in (* The code consists of previous declarations, the value constructors, the type IDs, debug declarations for the types and value constructors, any type values created for subsequent polymorphic calls, declarations in with...end and finally code after this declaration within the same "let..in..end" block. *) (leading @ valConstrDecs @ typeFunctions @ typeDebugDecs @ getCachedTypeValues newTypeVarMap @ localDecs @ tailDecs, finalEnv) end | codeSequence ((OpenDec {variables=ref vars, structures = ref structs, typeconstrs = ref types, ...}, _) :: pTail, leading, codeSeqContext as { level, lex, mkAddr, ...}, processBody) = let (* All we need to do here is make debugging entries. *) val (firstDec, firstEnv) = makeDebugEntries(vars, codeSeqContext) val (secondDec, secondEnv) = makeTypeConstrDebugEntries(types, firstEnv, level, lex, mkAddr) val (thirdDec, thirdEnv) = makeStructDebugEntries(structs, secondEnv, level, lex, mkAddr) in codeSequence (pTail, leading @ firstDec @ secondDec @ thirdDec, codeSeqContext |> repDebugEnv thirdEnv, processBody) end | codeSequence ((TypeDeclaration (typebinds, _), _) :: pTail, leading, codeSeqContext as { debugEnv, level, lex, mkAddr, ...}, processBody) = let (* Just create debug entries for the type constructors. *) val typeCons = List.map(fn (TypeBind {tcon = ref tc, ...}) => tc) typebinds val (typeDebugDecs, typeDebugEnv) = makeTypeConstrDebugEntries(typeCons, debugEnv, level, lex, mkAddr) in codeSequence (pTail, leading @ typeDebugDecs, codeSeqContext |> repDebugEnv typeDebugEnv, processBody) end | codeSequence (_ :: pTail, leading, (* Directive *) codeSeqContext, processBody) = codeSequence (pTail, leading, codeSeqContext, processBody) (* Code generate a set of fun bindings. This is used for other function creation as well since it handles the most general case. *) and codeFunBindings(tlist: fvalbind list, near, context as {decName, mkAddr, level, typeVarMap, lex, ...}) = let (* Get the function variables. *) val functionVars = map (fn(FValBind{functVar = ref var, ...}) => var) tlist (* Check the types for escaped datatypes. *) local fun checkVars(FValBind{functVar=ref var, location, ...}) = checkForEscapingDatatypes(valTypeOf var, fn message => errorNear (lex, true, near, location, message)) in val () = List.app checkVars tlist end (* Each function may result in either one or two functions actually being generated. If a function is not curried it will generate a single function of one argument, but if it is curried (e.g. fun f a b = ...) it will generate two mutually recursive functions. A function fun f a b = X will be translated into val rec f' = fn(a,b) => X and f = fn a => b => f'(a,b) with the second function (f) being inline. This allows the optimiser to replace references to f with all its arguments by f' which avoids building unneccessary closures. *) fun setValueAddress( FValBind{functVar = ref(Value{access=Local{addr, level}, ...}), ...}, ad, lev) = (addr := ad; level := lev) | setValueAddress _ = raise InternalError "setValueAddress" (* Create a list of addresses for the functions. This is the address used for the most general case. Also set the variable addresses. These may be changed for polymorphic functions but will eventually be reset. *) val addressList = List.map (fn _ => mkAddr 2 (* We need two addresses. *)) tlist val () = ListPair.appEq (fn (t, a) => setValueAddress(t, a, level)) (tlist, addressList) (* Get the polymorphic variables for each function. *) local fun getPoly(FValBind{functVar = ref (Value{typeOf, ...}), ...}) = filterTypeVars(getPolyTypeVars(typeOf, mapTypeVars typeVarMap)) in val polyVarList = List.map getPoly tlist end (* Now we can process the function bindings. *) fun loadFunDecs ((fb as FValBind{numOfPatts = ref numOfPats, functVar = ref(Value{name, ...}), clauses, argType = ref aType, resultType = ref resType, location, ...})::otherDecs, polyVars :: otherPolyVars, addr :: otherAddresses) = let (* Make up the function, and if there are several mutually recursive functions, put it in the vector. *) val procName = decName ^ name; val nPolyVars = List.length polyVars (*val _ = print(concat[name, " is ", Int.toString nPolyVars, "-ary\n"])*) (* Check that all the type-vars are in the list. *) (*local fun checkVars tv = case List.find(fn t => sameTv(t, tv)) fdTypeVars of SOME _ => () | NONE => raise InternalError "Type var not found" in val _ = List.app checkVars polyVars end*) (* Produce a list of the size of any tuples or labelled records in the first clause. Tuples in the first clause are passed as separate arguments. We could look at the other clauses and only pass them as separate arguments if each clause contains a tuple. We can treat labelled records exactly like tuples here - we only need to worry about the mapping from labels to tuple offsets when we create the record (getting the order of evaluation right) and in the pattern-matching code (extracting the right fields). We don't have to worry about that here, because all we're doing is untupling and retupling, taking care always to put the values back at exactly the same offset we got them from. *) val tupleSeq : argumentType list list = case clauses of (FValClause{dec= { args, ...}, ...} :: _) => List.map tupleWidth args | _ => raise InternalError "badly formed parse tree"; local fun getResultTuple(FValClause{exp, ...}) = tupleWidth exp val resultTuples = List.foldl(fn(t, [_]) => getResultTuple t | (_, s) => s) [GeneralType] clauses (* If we're debugging we want the result of the function so we don't do this optimisation. *) (* Now disable this optimisation completely. The lower-level optimiser does this. *) val resultTuple = if (getParameter debugTag (debugParams lex)) then [GeneralType] else if List.length resultTuples > 1 then [GeneralType] else resultTuples in val resTupleLength = List.length resultTuple (*val _ = resTupleLength = 1 orelse raise InternalError "resTupleLength <> 1"*) (* If there's a single argument return the type of that otherwise if we're tupling the result is general. *) val (resultType, extraArg) = case resultTuple of [one] => (one, 0) | _ => (GeneralType, 1) end (* Count the total number of arguments needed. *) val totalArgs = List.foldl (op +) (extraArg+nPolyVars) (List.map List.length tupleSeq) (* The old test was "totalArgs = 1", but that's not really right, because we could have one genuine arg plus a lot of "()" patterns. We now use the normal inlining mechanism to optimise this (unusual) case too. *) val noInlineFunction = numOfPats = 1 andalso totalArgs = 1 andalso tupleSeq = [[GeneralType]] andalso resultType = GeneralType (* Turn the list of clauses into a match. *) fun clauseToTree(FValClause {dec={ args, ...}, exp, line, breakPoint, ...}) = MatchTree { vars = if numOfPats = 1 then hd args else TupleTree{fields=args, location=line, expType=ref EmptyType}, exp = exp, location = line, argType = ref badType, resType = ref badType, breakPoint = breakPoint } val matches = map clauseToTree clauses (* We arrange for the inner function to be called with the curried arguments in reverse order, but the tupled arguments in the normal order. For example, the ML declaration: fun g a b c = ... gives the order fun g (a, b, c) = ... gives the order fun g (a, b) c (d, e, f) = ... gives the order We want reverse the order of curried arguments to produce better code. (The last curried argument often gets put into the first argument register by the normal calling mechanism, so we try to ensure that it stays there.) We don't reverse the order of tupled arguments because I'm still a bit confused about when a tuple is an argument tuple (reversed?) and when it isn't (not reversed). Just to add to this, if the function is polymorphic we have to add the polymorphic arguments on at the end. *) local (* Create the argument type list. I'm sure this can be combined with the next version of makeArgs but it's all too complicated. *) fun makeArgs(parms, []) = let val polyParms = List.tabulate(nPolyVars, fn _ => GeneralType) val resTupleSize = resTupleLength in if resTupleSize = 1 then parms @ polyParms else parms @ polyParms @ [GeneralType] end | makeArgs(parms, t::ts) = makeArgs (t @ parms, ts) in val argTypes = makeArgs ([], tupleSeq) end local (* This function comprises a new declaration level *) val nArgTypes = List.length argTypes val fnLevel = newLevel level val argList : codetree = if numOfPats = 1 then mkArgTuple(nArgTypes-totalArgs, totalArgs-extraArg-nPolyVars) else let fun makeArgs([], _) = [] | makeArgs(h::t, n) = mkArgTuple(nArgTypes-n-List.length h, List.length h) :: makeArgs(t, n + List.length h) in mkTuple (makeArgs(tupleSeq, extraArg+nPolyVars)) end local val addresses = ref 1 in fun fnMkAddr n = (! addresses) before (addresses := ! addresses + n) end val innerProcName : string = concat ([procName, "(" , Int.toString totalArgs, ")"]); local (* The poly args come after any result tuple. *) val tupleOffset = if resTupleLength = 1 then 0 else 1 val argAddrs = List.tabulate(nPolyVars, fn n => fn l => mkLoadParam(n+nArgTypes-nPolyVars-tupleOffset, l, fnLevel)) val mainTypeVars = ListPair.zipEq(polyVars, argAddrs) (* Also need to add any variables used by other polymorphic functions but not in the existing list. This is only for very unusual cases. *) fun addExtras (fPolyVars, pVarList) = let fun checkPolymorphism(fpVar, pVars) = if isSome(List.find (fn(t, _) => sameTv(t, fpVar)) mainTypeVars) orelse isSome(List.find (fn (t, _) => sameTv(t, fpVar)) pVars) then pVars else (fpVar, fn _ => defaultTypeCode) :: pVars in List.foldl checkPolymorphism pVarList fPolyVars end val extraEntries = List.foldl addExtras [] polyVarList in val typevarArgMap = mainTypeVars @ extraEntries val newTypeVarMap = extendTypeVarMap(typevarArgMap, fnMkAddr, fnLevel, typeVarMap) end val fnContext = context |> repNewLevel(innerProcName, fnMkAddr, fnLevel) |> repTypeVarMap newTypeVarMap (* If we have (mutually) recursive references to polymorphic functions we need to create local versions applied to the polymorphic variables. We only need to consider functions that use the polymorphic variables for this function. If another function uses different variables it can't be called from this one. If it had been called from this any type variables would have been fixed as monotypes or the type variables of this function. Except this is wrong in one case. If one of the recursive calls involves an exception (e.g. f (fn _ => raise Fail "") (or perhaps some other case involving "don't care" polymorphic variables) it is possible to call a function with more polymorphism. *) local fun createApplications(fVal::fVals, addr::addrList, [] :: polyVarList, otherDecs) = ( (* Monomorphic functions. *) setValueAddress(fVal, addr, level); createApplications(fVals, addrList, polyVarList, otherDecs) ) | createApplications( fVal::fVals, addr::addrList, fPolyVars ::polyVarList, otherDecs) = let fun createMatches fpVar = case List.find (fn(t, _) => sameTv(t, fpVar)) typevarArgMap of SOME (_, codeFn) => codeFn fnLevel | NONE => raise InternalError "createMatches: Missing type var" val polyArgs = List.map createMatches fPolyVars val newAddr = fnMkAddr 1 val polyFn = mkLoad(addr, fnLevel, level) (* Set the address to this so if we use this function we pick up this declaration. *) val () = setValueAddress(fVal, newAddr, fnLevel); val newDecs = mkDec(newAddr, mkEval(polyFn, polyArgs)) :: otherDecs in createApplications(fVals, addrList, polyVarList, newDecs) end | createApplications(_, _, _, decs) = decs in val appDecs = if noInlineFunction then [] (* This may be directly recursive. *) else createApplications (tlist, addressList, polyVarList, []) end local (* Function body. The debug state has a "start of function" entry that is used when tracing and points to the arguments. There are then entries for the recursive functions so they can be used if we break within the function. *) fun codeBody fnEntryEnv = let val startContext = fnContext |> repDebugEnv fnEntryEnv (* Create debug entries for recursive references. *) val (recDecs, recDebugEnv) = makeDebugEntries(functionVars, startContext) val bodyContext = fnContext |> repDebugEnv recDebugEnv val codeMatches = mkEnv(recDecs, codeMatch (near, matches, argList, false, bodyContext)) in (* If the result is a tuple we try to avoid creating it by adding an extra argument to the inline function and setting this to the result. *) if resTupleLength = 1 then codeMatches else (* The function sets the extra argument to the result of the body of the function. We use the last argument for the container so that other arguments will be passed in registers in preference. Since the container is used for the result this argument is more likely to have to be pushed onto the stack within the function than an argument which may have its last use early on. *) mkSetContainer(mkLoadParam(nArgTypes-1, fnLevel, fnLevel), codeMatches, resTupleLength) end in (* If we're debugging add the debug info before resetting the level. *) val codeForBody = wrapFunctionInDebug(codeBody, procName, argList, aType, resType, location, fnContext) end val () = if List.length argTypes = totalArgs then () else raise InternalError "Argument length problem" in val innerFun = mkFunction{ body=mkEnv(getCachedTypeValues newTypeVarMap @ appDecs, codeForBody), argTypes=argTypes, resultType=resultType, name=innerProcName, closure=getClosure fnLevel, numLocals=fnMkAddr 0} end; (* We now have a function which can be applied to the arguments once we have them. If the function is curried we must make a set of nested inline procedures which will take one of the parameters at a time. If all the parameters are provided at once they will be optimised away. *) val polyLevel = if null polyVars then level else newLevel level (* Make into curried functions *) fun makeFuns(innerLevel, _, mkParms, []) = let (* Load a reference to the inner function. *) val loadInnerFun = mkLoad (addr + 1, innerLevel, level) val polyParms = List.tabulate(nPolyVars, fn n => (mkLoadParam(n, innerLevel, polyLevel), GeneralType)) val resTupleSize = resTupleLength val parms = mkParms innerLevel in (* Got to the bottom. - put in a call to the procedure. *) if resTupleSize = 1 then (mkCall (loadInnerFun, parms @ polyParms, resultType), 0) else (* Create a container for the result, side-effect it in the function, then create a tuple from it. Most of the time this will be optimised away. *) let val containerAddr = 0 (* In a new space *) val loadContainer = mkLoadLocal containerAddr in (mkEnv( [mkContainer(containerAddr, resTupleSize, mkCall(loadInnerFun, parms @ polyParms @ [(loadContainer, GeneralType)], GeneralType))], mkTupleFromContainer(containerAddr, resTupleSize)), containerAddr+1 (* One local *)) end end | makeFuns(innerLevel, decName, mkParms, t::ts) = let (* Make a function. *) val nLevel = newLevel innerLevel val newDecName : string = decName ^ "(1)" (* Arguments from this tuple precede older arguments, but order of arguments within the tuple is preserved. *) fun nextParms l = loadArgsFromTuple(t, mkLoadParam (0, l, nLevel)) @ mkParms l val (body, lCount) = makeFuns (nLevel, newDecName, nextParms, ts) in (mkInlproc (body, 1, newDecName, getClosure nLevel, lCount), 0) end (* end makeFuns *); (* Reset the address of the variable. *) val () = setValueAddress(fb, addr, level) in if noInlineFunction then (addr, innerFun) :: loadFunDecs(otherDecs, otherPolyVars, otherAddresses) else let val (baseFun, _) = makeFuns (polyLevel, procName, fn _ => [], tupleSeq) val polyFun = if null polyVars then baseFun else mkInlproc(baseFun, List.length polyVars, procName ^ "(P)", getClosure polyLevel, 0) in (* Return the `inner' procedure and the inline functions as a mutually recursive pair. Try putting the inner function first to see if the optimiser does better this way. *) (addr + 1, innerFun) :: (addr, polyFun) :: loadFunDecs(otherDecs, otherPolyVars, otherAddresses) end end (* loadFunDecs *) | loadFunDecs _ = [] val loaded = loadFunDecs(tlist, polyVarList, addressList) (* Set the final addresses in case they have changed. N.B. Do this before loading any debug references. *) val () = ListPair.appEq (fn (t, a) => setValueAddress(t, a, level)) (tlist, addressList) (* Construct the debugging environment for the rest of the scope. *) val (decEnv, newDebugEnv) = makeDebugEntries(functionVars, context) (* Check whether any of the functions were unreferenced. *) val _ = if getParameter reportUnreferencedIdsTag (debugParams lex) then reportUnreferencedValues(functionVars, lex) else () in (* Put the declarations into a package of mutual decs. *) (mkMutualDecs loaded :: decEnv, newDebugEnv) end (* codeFunBindings *) (* Recursive val declarations. Turn them into fun-bindings. This avoids duplicating a lot of code and codeFunBindings does a lot of optimisation. *) and codeRecValBindings(valDecs, near, context) = let (* Turn this into a fun binding. *) fun valBindToFvalBind(ValBind{ exp, line, variables=ref vars, ...}, fVals) = let fun getMatches (Fn { matches: matchtree list, ... }) = matches | getMatches (Constraint {value, ...}) = getMatches value | getMatches (Parenthesised(p, _)) = getMatches p | getMatches _ = raise InternalError "getMatches" fun matchTreeToClause(MatchTree{vars, exp, location, breakPoint, ...}) = let val dec = { ident = { name="", expType=ref EmptyType, location=location}, isInfix = false, args=[vars], constraint=NONE} in FValClause{dec = dec, exp=exp, line=location, breakPoint = breakPoint } end val clauses = List.map matchTreeToClause (getMatches exp) fun mkFValBind(var as Value{typeOf, ...}) = let val argType = mkTypeVar(generalisable, false, false, false) and resultType = mkTypeVar(generalisable, false, false, false) val () = if isSome(unifyTypes(typeOf, mkFunctionType(argType, resultType))) then raise InternalError "mkFValBind" else () in FValBind { clauses=clauses, numOfPatts=ref 1, functVar=ref var, argType=ref argType, resultType=ref resultType, location=line } end in fVals @ List.map mkFValBind vars end val converted = List.foldl valBindToFvalBind [] valDecs in codeFunBindings(converted, near, context) end (* codeRecValBindings *) (* Non-recursive val bindings. *) and codeNonRecValBindings(valBindings, near, originalContext: cgContext as { decName, typeVarMap, lex, isOuterLevel, ...}) = let (* Non-recursive val bindings. *) fun codeBinding (ValBind{dec=vbDec, exp=vbExp, line, variables=ref vars, ...}, otherDecs) = let (* A binding. *) (* Get a name for any functions. This is used for profiling and exception trace. *) val fName = case vars of [] => "_" | _ => String.concatWith "|" (List.map valName vars) (* Does this contain polymorphism? *) val polyVarsForVals = List.map(fn Value{typeOf, ...} => filterTypeVars (getPolyTypeVars(typeOf, mapTypeVars typeVarMap))) vars val polyVars = List.foldl(op @) [] polyVarsForVals val nPolyVars = List.length polyVars (* In almost all cases polymorphic declarations are of the form val a = b or val a = fn ... . They can, though, arise in pathological cases with arbitrary patterns and complex expressions. If any of the variables are polymorphic the expression must have been non-expansive. That means that we can safely evaluate it repeatedly. There's one exception: it may raise Bind. (e.g. val SOME x = NONE). For that reason we make sure it is evaluated at least once. We build the code as a function and then apply it one or more times. This is really to deal with pathological cases and pretty well all of this will be optimised away. *) val localContext as {level, mkAddr, typeVarMap, ...} = if nPolyVars = 0 then originalContext else let val addresses = ref 1 fun fnMkAddr n = (! addresses) before (addresses := ! addresses + n) val fnLevel = newLevel (#level originalContext) val argAddrs = List.tabulate(nPolyVars, fn n => fn l => mkLoadParam(n, l, fnLevel)) val argMap = ListPair.zipEq(polyVars, argAddrs) val newTypeVarMap = extendTypeVarMap(argMap, fnMkAddr, fnLevel, #typeVarMap originalContext) in originalContext |> repNewLevel(decName, fnMkAddr, fnLevel) |> repTypeVarMap newTypeVarMap end val exp = codegen (vbExp, localContext |> repDecName (decName ^ fName ^ "-")) (* Save the argument in a variable. *) val decCode = multipleUses (exp, fn () => mkAddr 1, level) (* Generate the code and also check for redundancy and exhaustiveness. *) local val cmContext = { mkAddr = mkAddr, level = level, typeVarMap = typeVarMap, lex = lex } in val (bindCode, exhaustive) = codeBindingPattern(vbDec, #load decCode level, line, cmContext) end (* Report inexhaustiveness if necessary. *) val () = if not exhaustive andalso not isOuterLevel then errorNear (lex, false, near, line, "Pattern is not exhaustive.") else () (* Check for unreferenced variables. *) val () = if getParameter reportUnreferencedIdsTag (debugParams lex) then List.app (reportUnreferencedValue lex) (getVariablesInPatt(vbDec, [])) else () val resultCode = if nPolyVars = 0 then #dec decCode @ bindCode else let fun loadVal(Value{access=Local{addr=ref add, ...}, ...}) = mkLoadLocal add | loadVal _ = raise InternalError "loadVal" val outerAddrs = #mkAddr originalContext and outerLevel = #level originalContext (* Construct a function that, when applied, returns all the variables. *) val fnAddr = outerAddrs 1 val resFunction = mkDec(fnAddr, mkInlproc( mkEnv(getCachedTypeValues typeVarMap @ #dec decCode @ bindCode, mkTuple(List.map loadVal vars)), nPolyVars, "(P)", getClosure level, mkAddr 0)) (* Apply the general function to the set of type variables using either the actual type variables if they are in this particular variable or defaults if they're not. *) fun application(pVars, level) = let val nPVars = List.length pVars val varNos = ListPair.zipEq(pVars, List.tabulate(nPVars, fn x=>x)) fun getArg argV = case List.find (fn (v, _) => sameTv(v, argV)) varNos of SOME (_, n) => mkLoadParam(n, level, level) | NONE => defaultTypeCode in mkEval(mkLoad(fnAddr, level, outerLevel), List.map getArg polyVars) end (* For each variable construct either a new function if it is polymorphic or a simple value if it is not (e.g. val (a, b) = (fn x=>x, 1)). Set the local addresses at the same time. *) fun loadFunctions(var::vars, polyV::polyVs, n) = let val vAddr = outerAddrs 1 val () = case var of Value{access=Local{addr, level}, ...} => (addr := vAddr; level := outerLevel) | _ => raise InternalError "loadFunctions" in mkDec(vAddr, case polyV of [] => (* monomorphic *) mkInd(n, application([], outerLevel)) | _ => (* polymorphic *) let val nPolyVars = List.length polyV val nLevel = newLevel outerLevel in mkInlproc( mkInd(n, application(polyV, nLevel)), nPolyVars, "(P)", getClosure nLevel, 0) end ) :: loadFunctions(vars, polyVs, n+1) end | loadFunctions _ = [] val loadCode = loadFunctions(vars, polyVarsForVals, 0) in (* Return the declaration of the function, a dummy application that will force any pattern checking and raise a Match if necessary and the declarations of the variables. *) resFunction :: mkNullDec(application([], outerLevel)) :: loadCode end in otherDecs @ resultCode end in List.foldl codeBinding [] valBindings end (* codeNonRecValBindings *) (* Code generates the parse tree. *) fun gencode (pt : parsetree, lex: lexan, debugEnv: debuggerStatus, outerLevel, mkOuterAddresses, outerTypeVarMap, structName: string, continuation) : codeBinding list * debuggerStatus = codeSequence ([(pt, ref NONE)], [], {decName=structName, mkAddr=mkOuterAddresses, level=outerLevel, typeVarMap=outerTypeVarMap, debugEnv=debugEnv, lex=lex, lastDebugLine=ref 0, isOuterLevel = true}, fn (code: codeBinding list, {debugEnv, typeVarMap, ...}) => continuation(code, debugEnv, typeVarMap)) (* Types that can be shared. *) structure Sharing = struct type parsetree = parsetree and lexan = lexan and codetree = codetree and environEntry = environEntry and level = level and typeVarMap = typeVarMap and codeBinding = codeBinding and debuggerStatus = debuggerStatus end end; polyml-5.6/mlsource/MLCompiler/ParseTree/CodegenParsetreeSig.sml000066400000000000000000000027541265146633400250470ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CodegenParsetreeSig = sig type parsetree type lexan type level type typeVarMap type codetree type codeBinding type environEntry type debuggerStatus val gencode: parsetree * lexan * debuggerStatus * level * (int->int) * typeVarMap * string * (codeBinding list * debuggerStatus * typeVarMap -> codeBinding list * debuggerStatus) -> codeBinding list * debuggerStatus structure Sharing: sig type parsetree = parsetree and lexan = lexan and codetree = codetree and environEntry = environEntry and level = level and typeVarMap = typeVarMap and codeBinding = codeBinding and debuggerStatus = debuggerStatus end end polyml-5.6/mlsource/MLCompiler/ParseTree/EXPORT_PARSETREE.sml000066400000000000000000000606361265146633400236230ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor EXPORT_PARSETREE ( structure BASEPARSETREE : BaseParseTreeSig structure PRINTTREE: PrintParsetreeSig structure LEX : LEXSIG structure STRUCTVALS : STRUCTVALSIG structure EXPORTTREE: EXPORTTREESIG structure TYPETREE : TYPETREESIG structure DEBUGGER : DEBUGGERSIG sharing LEX.Sharing = TYPETREE.Sharing = STRUCTVALS.Sharing = EXPORTTREE.Sharing = BASEPARSETREE.Sharing = PRINTTREE.Sharing = DEBUGGER.Sharing ): ExportParsetreeSig = struct open LEX open STRUCTVALS open EXPORTTREE open TYPETREE open BASEPARSETREE open PRINTTREE fun getExportTree(navigation, p: parsetree) = let (* Common properties for navigation and printing. *) val commonProps = exportNavigationProps navigation @ [PTprint(fn d => displayParsetree(p, d))] fun asParent () = getExportTree(navigation, p) (* Put all these into a common list. That simplifies navigation between the various groups in abstypes and datatypes. *) datatype lType = DataT of datatypebind | TypeB of typebind | Decl of parsetree * breakPoint option ref (* Common code for datatypes, abstypes and type bindings. *) fun exportTypeBinding(navigation, this as DataT(DatatypeBind{name, nameLoc, fullLoc, constrs, ...})) = let fun asParent () = exportTypeBinding(navigation, this) (* Ignore any type variables before the type name. *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=SOME getConstrs}, name, nameLoc, []) and getConstrs () = let fun exportConstrs(navigation, {constrName, idLocn, ... }) = (* TODO: the constructor type. *) getStringAsTree(navigation, constrName, idLocn, []) in (fullLoc, (* TODO: We need a separate location for the constrs. *) exportList(exportConstrs, SOME asParent) constrs @ exportNavigationProps {parent=SOME asParent, previous=SOME getName, next=NONE}) end in (fullLoc, PTfirstChild getName :: exportNavigationProps navigation) end | exportTypeBinding(navigation, this as TypeB(TypeBind{name, nameLoc, decType = SOME decType, fullLoc, ...})) = let fun asParent () = exportTypeBinding(navigation, this) (* Ignore any type variables before the type name. *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=SOME getType}, name, nameLoc, []) and getType () = typeExportTree({parent=SOME asParent, previous=SOME getName, next=NONE}, decType) in (fullLoc, PTfirstChild getName :: exportNavigationProps navigation) end (* TypeBind is also used in a signature in which case decType could be NONE. *) | exportTypeBinding(navigation, this as TypeB(TypeBind{name, nameLoc, decType = NONE, fullLoc, ...})) = let fun asParent () = exportTypeBinding(navigation, this) (* Ignore any type variables before the type name. *) (* Retain this as a child entry in case we decide to add the type vars later. *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=NONE}, name, nameLoc, []) in (fullLoc, PTfirstChild getName :: exportNavigationProps navigation) end | exportTypeBinding(navigation, Decl dec) = (* Value declarations in an abstype. *) exportTreeWithBpt(navigation, dec) (* In a couple of cases we can have a breakpoint associated with an entry. *) and exportTreeWithBpt(nav, (p, ref NONE)) = getExportTree (nav, p) | exportTreeWithBpt(nav, (p, ref (SOME bpt))) = let val (loc, props) = getExportTree (nav, p) in (loc, PTbreakPoint bpt :: props) end fun exportMatch(navigation, p as MatchTree{location, vars, exp, resType = ref rtype, argType = ref atype, breakPoint = ref bpt, ...}) = let fun asParent () = exportMatch(navigation, p) val debugProp = case bpt of NONE => [] | SOME bpt => [PTbreakPoint bpt] in (location, [PTprint(fn d => displayMatch(p, d)), PTtype (mkFunctionType (atype, rtype))] @ exportList(getExportTree, SOME asParent) [vars, exp] @ exportNavigationProps navigation @ debugProp ) end in case p of Ident{location, expType=ref expType, value, possible, name, ...} => let (* Include the type and declaration properties if these have been set. *) val (decProp, references, possProp) = case value of ref (Value{name = "", ...}) => let (* Generate possible completions. For the moment just consider simple prefixes. *) val completions = List.filter (String.isPrefix name) (! possible ()) in ([], NONE, [PTcompletions completions]) end | ref (Value{locations, references, ...}) => (mapLocationProps locations, references, []) val refProp = case references of NONE => [] | SOME {exportedRef=ref exp, localRef=ref locals, recursiveRef=ref recs} => [PTreferences(exp, List.map #1 recs @ locals)] in (location, PTtype expType :: decProp @ commonProps @ refProp @ possProp) end | Literal {location, expType=ref expType, ...} => (location, PTtype expType :: commonProps) (* Infixed application. For the purposes of navigation we treat this as three entries in order. *) | Applic{location, f, arg = TupleTree{fields=[left, right], ...}, isInfix = true, expType=ref expType, ...} => (location, PTtype expType :: exportList(getExportTree, SOME asParent) [left, f, right] @ commonProps) (* Non-infixed application. *) | Applic{location, f, arg, expType=ref expType, ...} => (location, PTtype expType :: exportList(getExportTree, SOME asParent) [f, arg] @ commonProps) | Cond{location, test, thenpt, elsept, thenBreak, elseBreak, ...} => (location, exportList(exportTreeWithBpt, SOME asParent) [(test, ref NONE), (thenpt, thenBreak), (elsept, elseBreak)] @ commonProps) | TupleTree{fields, location, expType=ref expType, ...}=> (location, PTtype expType :: exportList(getExportTree, SOME asParent) fields @ commonProps) | ValDeclaration{location, dec, ...} => let fun exportVB(navigation, vb as ValBind{dec, exp, line, ...}) = let val vbProps = exportNavigationProps navigation (* First child should give the pattern *) (* Second child should give the expression *) fun exportThis () = exportVB(navigation, vb) val asChild = exportList(getExportTree, SOME exportThis) [dec, exp] in (line, asChild @ vbProps) end val expChild = exportList(exportVB, SOME asParent) dec in (* We need a special case for a top-level expression. This has been converted by the parser into val it = exp but the "val it = " takes up no space. We need to go directly to the expression in that case. *) case dec of [ValBind{dec=Ident{name="it", location=itLoc, ...}, exp, ...}] => if #startPosition itLoc = #endPosition itLoc andalso #startLine itLoc = #endLine itLoc then getExportTree(navigation, exp) else (location, expChild @ commonProps) | _ => (location, expChild @ commonProps) end | FunDeclaration{location, dec, ...} => let (* It's easiest to put these all together into a single list. *) datatype funEntry = FunIdent of { name: string, expType: types ref, location: location } * references | FunPtree of parsetree | FunConstraint of typeParsetree | FunInfixed of funEntry list * location fun exportFunEntry(navigation, FunIdent({expType=ref expType, location, ...}, refs)) = let val refProp = case refs of NONE => [] | SOME {exportedRef=ref exp, localRef=ref locals, recursiveRef=ref recs} => [PTreferences(exp, List.map #1 recs @ locals)] in (location, refProp @ (PTtype expType :: PTdeclaredAt location :: exportNavigationProps navigation)) end | exportFunEntry(navigation, FunPtree pt) = getExportTree(navigation, pt) | exportFunEntry(navigation, FunConstraint typ) = typeExportTree(navigation, typ) | exportFunEntry(navigation, this as FunInfixed(inf, location)) = let fun asParent () = exportFunEntry(navigation, this) val expChild = exportList(exportFunEntry, SOME asParent) inf in (location, expChild @ exportNavigationProps navigation) end fun exportAClause( FValClause{dec = {ident, isInfix, args, constraint}, exp, breakPoint = ref bpt, ...}, refs, exportThis) = let (* The effect of this is to have all the elements of the clause as a single level except that if we have an infixed application of the function (e.g. fun f o g = ...) then this is a subnode. *) val funAndArgs = case (isInfix, args) of (true, TupleTree{fields=[left, right], location, ...} :: otherArgs) => (* Infixed. *) FunInfixed([FunPtree left, FunIdent(ident, refs), FunPtree right], location) :: map FunPtree otherArgs | (_, args) => (* Normal prefixed form. *) FunIdent(ident, refs) :: map FunPtree args val constraint = case constraint of NONE => [] |SOME typ => [FunConstraint typ] val debugProp = case bpt of NONE => [] | SOME bpt => [PTbreakPoint bpt] in exportList(exportFunEntry, SOME exportThis) (funAndArgs @ constraint @ [FunPtree exp]) @ debugProp end fun exportFB(navigation, fb as FValBind{clauses=[clause], location, functVar = ref(Value{references, ...}), ...}) = (* If there's just one clause go straight to it. Otherwise we have an unnecessary level of navigation. *) let val fbProps = exportNavigationProps navigation val asChild = exportAClause(clause, references, fn () => exportFB(navigation, fb)) in (location, asChild @ fbProps) end | exportFB(navigation, fb as FValBind{clauses, location, functVar = ref(Value{references, ...}), ...}) = let val fbProps = exportNavigationProps navigation (* Each child gives a clause. *) (* First child should give the pattern *) (* Second child should give the expression *) fun exportThis () = exportFB(navigation, fb) fun exportClause(navigation, clause as FValClause{ line, ...}) = let val clProps = exportNavigationProps navigation val asChild = exportAClause(clause, references, fn () => exportClause(navigation, clause)) in (line, asChild @ clProps) end val asChild = exportList(exportClause, SOME exportThis) clauses in (location, asChild @ fbProps) end val expChild = exportList(exportFB, SOME asParent) dec in (location, expChild @ commonProps) end | OpenDec{location, decs, ...} => let fun exportStructIdent(navigation, { value, location, ...} ) = let (* Include the declaration properties if it has been set. *) val locProps = case !value of SOME(Struct{locations, ...}) => mapLocationProps locations | NONE => [] val siProps = exportNavigationProps navigation @ locProps in (location, siProps) end val expChild = exportList(exportStructIdent, SOME asParent) decs in (location, expChild @ commonProps) end | Constraint{location, value, given, ...} => let (* The first position is the expression, the second the type *) fun getExpr () = getExportTree({parent=SOME asParent, previous=NONE, next=SOME getType}, value) and getType () = typeExportTree({parent=SOME asParent, previous=SOME getExpr, next=NONE}, given) in (location, PTfirstChild getExpr :: commonProps) end | Layered{location, var, pattern, ...} => (location, exportList(getExportTree, SOME asParent) [var, pattern] @ commonProps) | Fn {matches, location, expType = ref expType, ...} => (location, PTtype expType :: exportList(exportMatch, SOME asParent) matches @ commonProps) | Localdec{location, decs, body, ...} => (location, exportList(exportTreeWithBpt, SOME asParent) (decs @ body) @ commonProps) | TypeDeclaration(tbl, location) => let val allItems = List.map TypeB tbl in (location, exportList(exportTypeBinding, SOME asParent) allItems @ commonProps) end | AbsDatatypeDeclaration { location, typelist, withtypes, declist, ... } => let val allItems = List.map DataT typelist @ List.map TypeB withtypes @ List.map Decl declist in (location, exportList(exportTypeBinding, SOME asParent) allItems @ commonProps) end | DatatypeReplication{location, ...} => (* TODO *) (location, commonProps) | ExpSeq(ptl, location) => (location, exportList(exportTreeWithBpt, SOME asParent) ptl @ commonProps) | Directive{location, ...} => (* No need to process the individual identifiers. *) (location, commonProps) | ExDeclaration(exbinds, location) => let (* There are three possibilities here. exception exc; exception exc of ty; exception exc = exc' *) fun exportExdec(navigation, ExBind{name, previous=EmptyTree, ofType=NONE, nameLoc, ...}) = (* Simple, generative exception with no type. *) getStringAsTree(navigation, name, nameLoc, [PTtype exnType]) | exportExdec(navigation, eb as ExBind{name, previous=EmptyTree, ofType=SOME ofType, nameLoc, fullLoc, ...}) = (* exception exc of type. *) let fun asParent () = exportExdec (navigation, eb) fun getName () = getStringAsTree({parent=SOME asParent, next=SOME getOfType, previous=NONE}, name, nameLoc, [(* Type could be in here? *)]) and getOfType () = typeExportTree({parent=SOME asParent, previous=SOME getName, next=NONE}, ofType) in (fullLoc, PTfirstChild getName :: exportNavigationProps navigation) end | exportExdec(navigation, eb as ExBind{name, previous, (* ofType=NONE, *) nameLoc, fullLoc, ...}) = let fun asParent () = exportExdec (navigation, eb) fun getName () = getStringAsTree({parent=SOME asParent, next=SOME getPreviousExc, previous=NONE}, name, nameLoc, [(* Type could be in here? *)]) and getPreviousExc () = getExportTree({parent=SOME asParent, previous=SOME getName, next=NONE}, previous) in (fullLoc, PTfirstChild getName :: exportNavigationProps navigation) end val expChild = exportList(exportExdec, SOME asParent) exbinds in (location, expChild @ commonProps) end | Raise(raiseExp, location) => let fun getExp () = getExportTree({parent=SOME asParent, next=NONE, previous=NONE}, raiseExp) in (location, [PTfirstChild getExp] @ commonProps) end | HandleTree{location, exp, hrules, listLocation, ...} => let (* The first position is the expression, the second the matches *) fun getExpr () = getExportTree({parent=SOME asParent, previous=NONE, next=SOME getMatches}, exp) and getMatches () = (listLocation, exportList(exportMatch, SOME getMatches) hrules @ exportNavigationProps{parent=SOME asParent, previous=SOME getExpr, next=NONE}) in (location, [PTfirstChild getExpr] @ commonProps) end | While{location, test, body, breakPoint, ...} => (location, exportList(exportTreeWithBpt, SOME asParent) [(test, ref NONE), (body, breakPoint)] @ commonProps) | Case{location, test, match, listLocation, expType=ref expType, ...} => let (* The first position is the expression, the second the matches *) fun getExpr () = getExportTree({parent=SOME asParent, previous=NONE, next=SOME getMatches}, test) and getMatches () = (listLocation, exportList(exportMatch, SOME getMatches) match @ exportNavigationProps{parent=SOME asParent, previous=SOME getExpr, next=NONE}) in (location, [PTfirstChild getExpr, PTtype expType] @ commonProps) end | Andalso {location, first, second, ...} => (location, exportList(getExportTree, SOME asParent) [first, second] @ commonProps) | Orelse{location, first, second, ...} => (location, exportList(getExportTree, SOME asParent) [first, second] @ commonProps) | Labelled{location, expType=ref expType, recList, ...} => let (* It's convenient to be able to click on the label part and get the type of the expression or pattern on the right of the '='. *) fun exportField(navigation, label as {name, nameLoc, valOrPat, expType=ref expType, fullLocation, ...}) = let val patTree as (patLocation, _) = getExportTree(navigation, valOrPat) in if patLocation = fullLocation then (* The parser rewrites { name, ...} as { name=name, ... } (more generally { name: ty as pat, ...} as { name = name: ty as pat). To avoid having nodes that overlap we return only the pattern part here. *) patTree else let (* The first position is the label, the second the type *) fun asParent () = exportField (navigation, label) fun getLab () = getStringAsTree({parent=SOME asParent, next=SOME getExp, previous=NONE}, name, nameLoc, [PTtype expType]) and getExp () = getExportTree({parent=SOME asParent, previous=SOME getLab, next=NONE}, valOrPat) in (fullLocation, PTfirstChild getLab :: exportNavigationProps navigation) end end val expChild = exportList(exportField, SOME asParent) recList in (location, PTtype expType :: (expChild @ commonProps)) end | Selector{location, typeof, ...} => (location, PTtype typeof :: commonProps) | List{elements, location, expType = ref expType, ...} => (location, PTtype expType :: exportList(getExportTree, SOME asParent) elements @ commonProps) | EmptyTree => (nullLocation, commonProps) | WildCard location => (location, commonProps) | Unit location => (location, PTtype unitType :: commonProps) | Parenthesised(p, _) => getExportTree(navigation, p) end fun getLocation c = #1 (getExportTree({parent=NONE, next=NONE, previous=NONE}, c)) (* Extract the declaration location from the location list. *) fun declaredAt [] = LEX.nullLocation | declaredAt (DeclaredAt loc :: _) = loc | declaredAt (_::l) = declaredAt l (* Types that can be shared. *) structure Sharing = struct type lexan = lexan and parsetree = parsetree and matchtree = matchtree and locationProp = locationProp and pretty = pretty and ptProperties = ptProperties end end; polyml-5.6/mlsource/MLCompiler/ParseTree/ExportParsetreeSig.sml000066400000000000000000000031561265146633400247610ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature ExportParsetreeSig = sig type lexan type parsetree type matchtree type locationProp type ptProperties type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type exportTree = location * ptProperties list type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} val getExportTree: navigation * parsetree -> exportTree val getLocation: parsetree -> location val declaredAt: locationProp list -> location structure Sharing: sig type lexan = lexan and parsetree = parsetree and matchtree = matchtree and locationProp = locationProp and ptProperties = ptProperties end end; polyml-5.6/mlsource/MLCompiler/ParseTree/MATCH_COMPILER.sml000066400000000000000000001526231265146633400233140ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor MATCH_COMPILER ( structure BASEPARSETREE : BaseParseTreeSig structure PRINTTREE: PrintParsetreeSig structure LEX : LEXSIG structure CODETREE : CODETREESIG structure DEBUGGER : DEBUGGERSIG structure TYPETREE : TYPETREESIG structure TYPEIDCODE: TYPEIDCODESIG structure STRUCTVALS : STRUCTVALSIG structure VALUEOPS : VALUEOPSSIG structure DATATYPEREP: DATATYPEREPSIG structure DEBUG: DEBUGSIG structure MISC : sig (* These are handled in the compiler *) exception Conversion of string (* string to int conversion failure *) (* This isn't handled at all (except generically) *) exception InternalError of string (* compiler error *) end structure ADDRESS : AddressSig sharing BASEPARSETREE.Sharing = PRINTTREE.Sharing = LEX.Sharing = CODETREE.Sharing = DEBUGGER.Sharing = TYPETREE.Sharing = TYPEIDCODE.Sharing = STRUCTVALS.Sharing = VALUEOPS.Sharing = DATATYPEREP.Sharing = ADDRESS ): MatchCompilerSig = struct open BASEPARSETREE open PRINTTREE open CODETREE open TYPEIDCODE open LEX open TYPETREE open DEBUG open STRUCTVALS open VALUEOPS open MISC open DATATYPEREP open TypeVarMap open RuntimeCalls; (* for POLY_SYS numbers *) datatype environEntry = datatype DEBUGGER.environEntry type debuggerStatus = DEBUGGER.debuggerStatus (* To simplify passing the context it is wrapped up in this type. This is a subset of the context used in CODEGEN_PARSETREE. *) type matchContext = { mkAddr: int->int, level: level, typeVarMap: typeVarMap, lex: lexan } (* Devised by Mike Fourman, Nick Rothwell and me (DCJM). First coded up by Nick Rothwell for the Kit Compiler. First phase of the match compiler. The purpose of this phase is to take a match (a set of patterns) and bring together the elements that will be discriminated by testing any particular part of the value. Where a pattern is a tuple, for example, it is possible to discriminate on each of the fields independently, but it may be more efficient to discriminate on one of the fields first, and then on the others. The aim is to produce a set of tests that discriminate between the patterns quickly. *) abstype patSet = PatSet of int list with (* Each leaf in the tree contains a number which identifies the pattern it came from. As well as linking back to the patterns, these numbers represent an ordering, because earlier patterns mask out later ones. *) (* A set of pattern identifiers. *) val empty = PatSet []; fun singleton i = PatSet [i]; fun list (PatSet p) = p; infix 3 :::; fun a ::: b = PatSet (a :: list b); fun isEmptySet (PatSet []) = true | isEmptySet _ = false fun first (PatSet p) = hd p; fun next (PatSet p) = PatSet (tl p); fun cardinality(PatSet p) = List.length p (* Set from i to j inclusive. *) fun from i j = if i > j then empty else i ::: from (i + 1) j; infix 3 plus; infix 4 inside; infix 5 intersect; infix 6 diff; infix 7 eq; infix 8 eqSc infix 9 neq; (* Union of sets. *) fun a plus b = if isEmptySet a then b else if isEmptySet b then a else if first a = first b then first a ::: (next a plus next b) else if first a < first b then first a ::: (next a plus b) else first b ::: (a plus next b); (* Set membership. *) fun i inside a = if isEmptySet a then false else if i = first a then true else if i < first a then false else i inside next a (* Intersection of sets. *) fun a intersect b = if isEmptySet a orelse isEmptySet b then empty else if first a = first b then first a ::: ((next a) intersect (next b)) else if first a < first b then (next a) intersect b else a intersect next b; (* Set difference. *) fun a diff b = if isEmptySet a then empty else if isEmptySet b then a else if first a = first b then (next a) diff (next b) else if first a < first b then first a ::: ((next a) diff b) else a diff next b; (* Set equality. *) fun (PatSet a) eq (PatSet b) = a = b end (* patSet *); datatype aot = Aot of { patts: aots, (* Choices made at this point. *) defaults: patSet, (* Patterns that do not discriminate on this node. *) vars: values list (* The variables bound at this point. *) } and aots = TupleField of aot list (* Each element of the list is a field of the tuple. *) | Cons of consrec list * int (* List of constructors and the number of different constructors. *) | Excons of exconsrec list (* Exception constructors. *) | Scons of sconsrec list (* Int, char, string, real. *) | Wild (* Patterns that do not discriminate at all. *) (* Datatype constructors and exception constructors. *) withtype consrec = { constructor: values, (* The constructor itself. *) patts: patSet, (* Patterns that use this constructor *) appliedTo: aot, (* Patterns this constructor was applied to. *) polyVars: types list (* If this was polymorphic, the matched types. *) } and exconsrec = { constructor: values, patts: patSet, appliedTo: aot, exValue: machineWord option } and sconsrec = { eqFun: codetree, (* Equality functions for this type*) specVal: machineWord option, (* The constant value. NONE here means we had a conversion error. *) patts: patSet (* Patterns containing this value. *) } fun makeAot(patts, defaults, vars) = Aot { patts = patts, defaults = defaults, vars = vars } fun makeConsrec(constructor, patts, appliedTo, polyVars): consrec = { constructor = constructor, patts = patts, appliedTo = appliedTo, polyVars = polyVars } fun makeExconsrec(constructor, patts, appliedTo, exValue): exconsrec = { constructor = constructor, patts = patts, appliedTo = appliedTo, exValue = exValue } fun makeSconsrec(eqFun, specVal, patts) : sconsrec = { eqFun = eqFun, specVal = specVal, patts = patts } (* An empty wild card - can be expanded as required. *) val aotEmpty = makeAot(Wild, empty, []) (* A new wild card entry with the same defaults as a previous entry. *) fun wild (Aot {defaults, ...}) = makeAot(Wild, defaults, []) local (* Add a default (wild card or variable) to every node in the tree. *) fun addDefault (Aot {patts, defaults, vars}) patNo = let val newPatts = case patts of TupleField pl => TupleField (map (fn a => addDefault a patNo) pl) | Cons(cl, width) => let fun addDefaultToConsrec {constructor, patts, appliedTo, polyVars} = makeConsrec(constructor, patts, addDefault appliedTo patNo, polyVars) in Cons (map addDefaultToConsrec cl, width) end | Excons cl => let fun addDefaultToExconsrec {constructor, patts, appliedTo, exValue} = makeExconsrec(constructor, patts, addDefault appliedTo patNo, exValue) in Excons (map addDefaultToExconsrec cl) end | otherPattern => (* Wild, Scons *) otherPattern in makeAot(newPatts, defaults plus singleton patNo, vars) end (* addDefault *) fun addVar (Aot {patts, defaults, vars}) var = makeAot(patts, defaults, var :: vars) (* Add a constructor to the tree. It can only be added to a cons node or a wild card. *) fun addConstr(cons, noOfConstrs, doArg, tree as Aot {patts = Wild, defaults, vars, ...}, patNo, polyVars) = let (* Expand out the wildCard into a constructor node. *) val cr = makeConsrec(cons, singleton patNo, (* Expand the argument *) doArg (wild tree), polyVars); in makeAot(Cons([cr], noOfConstrs), defaults, vars) end | addConstr(cons, _, doArg, tree as Aot {patts = Cons(pl, width), defaults, vars}, patNo, polyVars) = let (* Merge this constructor with other occurences. *) fun addClist [] = (* Not there - add this on the end. *) [makeConsrec(cons, singleton patNo, doArg (wild tree), polyVars)] | addClist ((ccl as {constructor, patts, appliedTo, ... })::ccls) = if valName constructor = valName cons then (* Merge in. *) makeConsrec(cons, singleton patNo plus patts, doArg appliedTo, polyVars) :: ccls else (* Carry on looking. *) ccl :: addClist ccls; in makeAot (Cons (addClist pl, width), defaults, vars) end | addConstr _ = raise InternalError "addConstr: badly-formed and-or tree" (* Add a special constructor to the tree. Very similar to preceding. *) fun addSconstr(eqFun, cval, Aot {patts = Wild, defaults, vars, ...}, patNo, _) = (* Expand out the wildCard into a constructor node. *) makeAot (Scons [makeSconsrec(eqFun, cval, singleton patNo)], defaults, vars) | addSconstr(eqFun, cval, Aot {patts = Scons pl, defaults, vars, ...}, patNo, lex) = let (* Must be scons *) (* Merge this constructor with other occurrences. *) (* Special constants may be overloaded so we don't have a fixed set of types here. We need to use the type-specific equality function to test. Since only the basis library overloads constants we can assume that eqFun is a constant. *) fun equalSpecials(SOME a, SOME b) = let val eqCode = mkEval(eqFun, [mkTuple[mkConst a, mkConst b]]) in RunCall.unsafeCast(valOf(evalue(genCode(eqCode, debugParams lex, 0)()))) end | equalSpecials _ = false fun addClist [] = (* Not there - add this on the end. *) [makeSconsrec(eqFun, cval, singleton patNo)] | addClist ((ccl as { specVal, patts, ...}) :: ccls) = if equalSpecials(cval, specVal) then (* Merge in. *) makeSconsrec(eqFun, cval, singleton patNo plus patts) :: ccls else (* Carry on looking. *) ccl :: addClist ccls in makeAot (Scons (addClist pl), defaults, vars) end | addSconstr _ = raise InternalError "addSconstr: badly-formed and-or tree" (* Return the exception id if it is a constant. It may be a top-level exception or it could be in a top-level structure. *) local fun testAccess(Global code) = evalue code | testAccess(Selected{addr, base = Struct{access, ...}}) = ( case testAccess access of NONE => NONE | SOME c => evalue(mkInd(addr, mkConst c)) ) | testAccess _ = NONE in fun exceptionId(Value{access, ...}) = testAccess access end (* Add an exception constructor to the tree. Similar to the above now that non-constant exceptions are excluded from codePatt. *) fun addExconstr(cons, doArg, tree as Aot {patts = Wild, defaults, vars, ...}, patNo) = (* Expand out the wildCard into a constructor node. *) let val cr = makeExconsrec (cons, singleton patNo, doArg(wild tree), exceptionId cons) in makeAot (Excons [cr], defaults, vars) end | addExconstr(cons, doArg, tree as Aot {patts = Excons cl, defaults, vars, ...}, patNo) = let (* See if this is a constant. *) val newExval = exceptionId cons (* Two exceptions can only be considered the same if they are both constants and the same value. *) fun sameException(SOME a, SOME b) = PolyML.pointerEq(a, b) | sameException _ = false (* It would not be safe to merge exceptions if we were *) fun addClist [] = (* Not there - add this on the end. *) [makeExconsrec(cons, singleton patNo, doArg(wild tree), newExval)] | addClist ((ccl as {constructor, patts, appliedTo, exValue, ... })::ccls) = if sameException(newExval, exValue) then (* Merge in. *) makeExconsrec(constructor, singleton patNo plus patts, doArg appliedTo, exValue) :: ccls else (* Carry on looking. *) ccl :: addClist ccls in makeAot (Excons (addClist cl), defaults, vars) end | addExconstr _ = raise InternalError "addExconstr: badly-formed and-or tree" in (* Take a pattern and merge it into an andOrTree. *) fun buildAot (Ident {value=ref ident, expType=ref expType, ... }, tree, patNo, line, context as { typeVarMap, ...} ) = let val polyVars = List.map #value (getPolymorphism (ident, expType, typeVarMap)) fun doArg a = buildAot(WildCard nullLocation, a, patNo, line, context) in case ident of Value{class=Constructor {ofConstrs, ...}, ...} => (* Only nullary constructors. Constructors with arguments will be dealt with by ``isApplic'. *) addConstr(ident, ofConstrs, doArg, tree, patNo, polyVars) | Value{class=Exception, ...} => addExconstr(ident, doArg, tree, patNo) | _ => (* variable - matches everything. Defaults here and pushes a var. *) addVar (addDefault tree patNo) ident end | buildAot (TupleTree{fields, location, ...}, tree as Aot {patts = Wild, defaults = treeDefaults, vars = treeVars, ...}, patNo, _, context) = (* Adding tuple to existing wild-card *) let val tlist = map (fn el => buildAot(el, wild tree, patNo, location, context)) fields in makeAot (TupleField tlist, treeDefaults, treeVars) end | buildAot (TupleTree{fields, ...}, Aot {patts = TupleField pl, defaults = treeDefaults, vars = treeVars, ...}, patNo, line, context) = let (* Adding tuple to existing tuple. *) (* Merge each field of the tuple in with the corresponding field of the existing tree. *) val tlist = ListPair.mapEq (fn(t, a) => buildAot(t, a, patNo, line, context)) (fields, pl) in makeAot (TupleField tlist, treeDefaults, treeVars) end | buildAot (TupleTree _, _, _, _, _) = raise InternalError "pattern is not a tuple in a-o-t" | buildAot (vars as Labelled {recList, expType=ref expType, location, ...}, tree, patNo, _, context as { lex, ...}) = let (* Treat as a tuple, but in the order of the record entries. Missing entries are replaced by wild-cards. The order of the patterns given may bear no relation to the order in the record which will be matched. e.g. case X of (a = 1, ...) => ___ | (b = 2, a = 3) => ___ *) (* Check that the type is frozen. *) val () = if recordNotFrozen expType then errorNear (lex, true, vars, location, "Can't find a fixed record type.") else () (* Get the maximum number of patterns. *) val wilds = List.tabulate(recordWidth expType, fn _ => WildCard nullLocation) (* Now REPLACE entries from the actual pattern, leaving the defaulting ones behind. *) (* Take a pattern and add it into the list. *) fun mergen (_ :: t) 0 pat = pat :: t | mergen (h :: t) n pat = h :: mergen t (n - 1) pat | mergen [] _ _ = raise InternalError "mergen"; fun enterLabel ({name, valOrPat, ...}, l) = (* Put this label in the appropriate place in the tree. *) mergen l (entryNumber (name, expType)) valOrPat val tupleList = List.foldl enterLabel wilds recList in (* And process it as a tuple. *) buildAot(TupleTree{fields=tupleList, location=location, expType=ref expType}, tree, patNo, location, context) end | buildAot (Applic{f = Ident{value = ref applVal, expType = ref expType, ...}, arg, location, ...}, tree, patNo, _, context as { typeVarMap, ...}) = let val polyVars = List.map #value (getPolymorphism (applVal, expType, typeVarMap)) fun doArg atree = buildAot(arg, atree, patNo, location, context) in case applVal of Value{class=Constructor{ofConstrs, ...}, ...} => addConstr(applVal, ofConstrs, doArg, tree, patNo, polyVars) | Value{class=Exception, ...} => addExconstr(applVal, doArg, tree, patNo) | _ => tree (* Only if error *) end | buildAot (Applic _ , tree, _, _, _) = tree (* Only if error *) | buildAot (Unit _, tree, patNo, _, _) = (* There is only one value so it matches everything. *) addDefault tree patNo | buildAot (WildCard _, tree, patNo, _, _) = addDefault tree patNo (* matches everything *) | buildAot (List{elements, location, expType=ref expType, ...}, tree, patNo, _, context) = let (* Generate suitable combinations of cons and nil. e.g [1,2,3] becomes ::(1, ::(2, ::(3, nil))). *) (* Get the base type. *) val elementType = mkTypeVar (generalisable, false, false, false) val listType = mkTypeConstruction ("list", tsConstr listConstr, [elementType], [DeclaredAt inBasis]) val _ = unifyTypes(listType, expType) val polyVars = [elementType] fun processList [] tree = (* At the end put in a nil constructor. *) addConstr(nilConstructor, 2, fn a => buildAot (WildCard nullLocation, a, patNo, location, context), tree, patNo, polyVars) | processList (h :: t) tree = (* Cons node. *) let fun mkConsPat (Aot {patts = TupleField [hPat, tPat], defaults, vars, ...}) = let (* The argument is a pair consisting of the list element and the rest of the list. *) val tlist = [buildAot(h, hPat, patNo, location, context), processList t tPat]; in makeAot (TupleField tlist, defaults, vars) end | mkConsPat (tree as Aot {patts = Wild, defaults, vars, ...}) = let val hPat = wild tree; val tPat = wild tree; val tlist = [buildAot(h, hPat, patNo, location, context), processList t tPat]; in makeAot (TupleField tlist, defaults, vars) end | mkConsPat _ = raise InternalError "mkConsPat: badly-formed parse-tree" in addConstr(consConstructor, 2, mkConsPat, tree, patNo, polyVars) end (* end processList *); in processList elements tree end | buildAot (vars as Literal{converter, literal, expType=ref expType, location}, tree, patNo, _, {lex, level, ...}) = let (* At the same time we have to get the equality function for this type to plug into the code. Literals are overloaded so this may require first resolving the overload to the preferred type. *) val constr = typeConstrFromOverload(expType, true) val equality = equalityForType( mkTypeConstruction(tcName constr, constr, [], []), level, defaultTypeVarMap(fn _ => raise InternalError "equalityForType", baseLevel) (* Should never be used. *)) val litValue: machineWord option = getLiteralValue(converter, literal, expType, fn s => errorNear(lex, true, vars, location, s)) in addSconstr(equality, litValue, tree, patNo, lex) end | buildAot (Constraint {value, location, ...}, tree, patNo, _, context) = (* process the pattern *) buildAot(value, tree, patNo, location, context) | buildAot (Layered {var, pattern, location}, tree, patNo, _, context) =(* process the pattern *) let (* A layered pattern may involve a constraint which has to be removed. *) fun getVar (Ident {value, ...}) = !value | getVar (Constraint {value, ...}) = getVar value | getVar _ = undefinedValue (* error *) in addVar (buildAot(pattern, tree, patNo, location, context)) (getVar var) end | buildAot (Parenthesised(p, location), tree, patNo, _, context) = buildAot(p, tree, patNo, location, context) | buildAot (_, tree, _, _, _) = tree (* error cases *) end fun buildTree (patts: matchtree list, context) = let (* Merge together all the patterns into a single tree. *) fun maket [] _ tree = tree | maket ((MatchTree{vars, location, ...})::t) patNo tree = maket t (patNo + 1) (buildAot(vars, tree, patNo, location, context)) in maket patts 1 aotEmpty end fun bindPattVars(arg, vars, { mkAddr, level, ...}) = let val addressOfVar = mkAddr 1 val dec = mkDec (addressOfVar, arg) and load = mkLoadLocal addressOfVar (* Set the addresses of the variables and create debug entries. *) fun setAddr (Value{access=Local{addr=lvAddr, level=lvLevel}, ...}) = ( (* Set the address of the variable. *) lvAddr := addressOfVar; lvLevel := level ) | setAddr _ = raise InternalError "setAddr" val () = List.app setAddr vars in (load, dec) end local (* Find the "depth" of pattern i.e. the position of any defaults. If one of the fields is itself a tuple find the maximum depth of its fields, since if we decide to discriminate on this field we will come back and choose the deepest in that tuple. *) fun pattDepth (Aot {patts=TupleField pl, ...}, active) = List.foldl (fn (t, d) => Int.max(pattDepth(t, active), d)) 0 pl | pattDepth (Aot {patts, defaults,...}, active) = let (* Wild cards, constructors etc. *) val activeDefaults = defaults intersect active in if not (isEmptySet activeDefaults) then first activeDefaults else (* No default - the depth is the number of patterns that will be discriminated. Apart from Cons which could be a complete match, all the other cases will only occur if the match is not exhaustive. *) case patts of Cons (cl, _) => length cl + 1 | Excons cl => length cl + 1 | Scons sl => length sl + 1 | _ => 0 (* Error? *) end in fun bestColumn(colsToDo, noOfCols, asTuples, active) = let fun findDeepest(column, bestcol, depth) = if column = noOfCols (* Finished. *) then bestcol else if column inside colsToDo then let val thisDepth = pattDepth (List.nth(asTuples, column), active) in if thisDepth > depth then findDeepest (column + 1, column, thisDepth) else findDeepest (column + 1, bestcol, depth) end else findDeepest (column + 1, bestcol, depth) in findDeepest(0, 0, 0) end end (* The result of compiling the pattern match code. *) datatype pattCodeOption = PattCodeLeaf (* All the discrimination is done. *) | PattCodeBindTuple of (* The value is a tuple - take it apart. *) { tupleNo: int, next: pattCode } | PattCodeTupleSelect of (* Select a field of a tuple. *) { tupleNo: int, fieldOffset: int, next: pattCode } | PattCodeConstructors of (* Test a set of constructors *) { nConstrs: int, (* Number of constrs in datatype. 0 = infinite *) patterns: (pattCodeConstructor * pattCode) list, (* Constructor and pattern to follow. *) default: pattCode (* Pattern if none match *) } | PattCodeNaive of (* Do all the discrimination for each pattern separately. *) { pattNo: int, tests: (naiveTest * values list) list } list and pattCodeConstructor = PattCodeDatatype of values * types list | PattCodeException of values | PattCodeSpecial of codetree * machineWord option and naiveTest = NaiveWild | NaiveBindTuple of int | NaiveTupleSelect of { tupleNo: int, fieldOffset: int } | NaivePattTest of pattCodeConstructor withtype pattCode = { leafSet: patSet, (* Set of different patterns fired by the discrimination. *) leafCount: int, (* Count of number of leaves - >= cardinality of leafSet *) vars: values list, (* Variables bound to this node. May be layered i.e. id as pat *) code: pattCodeOption (* Code to apply at this node. *) } local fun pattCode(Aot {patts, defaults, vars, ...}, active: patSet, nextMatch: patSet * int -> pattCode, tupleNo) = let (* Get the set of defaults which are active. *) val activeDefaults = defaults intersect active fun makePattTest(patts, default, nConstrs) = let (* If we have included all the constructors the default may be redundant. *) val nPatts = length patts val (initSet, initCount) = if nPatts = nConstrs then (empty, 0) else (#leafSet default, #leafCount default) val defaultSet = #leafSet default (* If we have a default above a constructor then we may not need to discriminate on the constructor. This can occur in tuples where we have already discriminated on a different constructor. e.g (1, _) => ...| (_, SOME _) => ... | (_, NONE) => ... The values (1, NONE) and (1, SOME _) will both match the first pattern. *) val allSame = List.all (fn (_, { leafSet, ...}) => leafSet eq defaultSet) patts in if allSame then default else let val unionSet = foldl (fn ((_, {leafSet, ...}), s) => s plus leafSet) initSet patts val leafCount = foldl (fn ((_, {leafCount, ...}), n) => n + leafCount) initCount patts val constrs = { leafSet = unionSet, vars = [], code = PattCodeConstructors{nConstrs = nConstrs, patterns=patts, default=default}, leafCount = leafCount } in (* If the patterns are blowing up we are better off using naive matching. leafCount indicates the number of different times a pattern is fired. The cardinality of the unionSet is the number of different patterns. In particular we can have pathological cases that really blow up. See Tests/Succeed/Test133.ML. *) if leafCount > 1 andalso leafCount >= cardinality unionSet * 2 - 1 then makeNaive constrs else constrs end end val codePatt = (* If the active set is empty (match is not exhaustive) or everything will default we can skip further checks. *) if isEmptySet active orelse active eq activeDefaults then nextMatch(active, tupleNo) else case patts of TupleField [single] => (* Singleton tuple - this is just the same as the field. *) pattCode(single, active, nextMatch, tupleNo) | TupleField asTuples => let val thisTuple = tupleNo (* The address is used to refer to this tuple. *) val nextTupleNo = tupleNo+1 (* A simple-minded scheme would despatch the first column and then do the others. The scheme used here tries to do better by choosing the column that has any wild card furthest down the column. *) val noOfCols = length asTuples fun despatch colsToDo (active, tupleNo) = (* If we have done all the columns we can stop. (Or if the active set is empty). *) if isEmptySet colsToDo orelse isEmptySet active then nextMatch(active, tupleNo) else let (* Choose the best column. *) val bestcol = bestColumn(colsToDo, noOfCols, asTuples, active) (* Discriminate on the constructors in it. *) val code as { leafSet, leafCount, ...} = pattCode(List.nth(asTuples, bestcol), active, despatch (colsToDo diff (singleton bestcol)), tupleNo) (* Code to do the selection. *) val select = PattCodeTupleSelect{tupleNo = thisTuple, fieldOffset = bestcol, next = code } in { leafSet = leafSet, leafCount = leafCount, vars = [], code = select } end val takeApartTuple as { leafSet, leafCount, ...} = despatch (from 0 (noOfCols-1)) (active, nextTupleNo) val code = PattCodeBindTuple { tupleNo=tupleNo, next = takeApartTuple } in { leafSet = leafSet, leafCount = leafCount, vars=[], code=code } end | Cons(cl, width) => let fun doConstr({ patts, constructor, appliedTo, polyVars, ...}, rest) = let (* If this pattern is in the active set we discriminate on it. *) val newActive = patts intersect active in if isEmptySet newActive then (* No point *) rest else let val thenCode = pattCode(appliedTo, newActive plus activeDefaults, nextMatch, tupleNo) in (PattCodeDatatype(constructor, polyVars), thenCode) :: rest end end val pattList = foldl doConstr [] cl in makePattTest(pattList, nextMatch(activeDefaults, tupleNo), width) end | Excons cl => let (* We now process exception constructors in the same way as datatype constructors. This is only valid because all the exception constructors are constants. *) fun doConstr({ patts, constructor, appliedTo, ...}, rest) = let (* If this pattern is in the active set we discriminate on it. *) val newActive = patts intersect active in if isEmptySet newActive then (* No point *) rest else let val thenCode = pattCode(appliedTo, newActive plus activeDefaults, nextMatch, tupleNo) in (PattCodeException constructor, thenCode) :: rest end end val pattList = foldl doConstr [] cl in makePattTest(pattList, nextMatch(activeDefaults, tupleNo), 0) end | Scons sl => let (* Int, char, string *) (* Generate if..then..else for each of the choices. *) fun doConstr({ patts, eqFun, specVal, ...}, rest) = let val newActive = patts intersect active in if isEmptySet newActive then (* No point *) rest else (PattCodeSpecial(eqFun, specVal), nextMatch(newActive plus activeDefaults, tupleNo)) :: rest end val pattList = foldl doConstr [] sl in makePattTest(pattList, nextMatch(activeDefaults, tupleNo), 0) end | Wild => nextMatch(activeDefaults, tupleNo) in { leafSet = #leafSet codePatt, leafCount = #leafCount codePatt, vars=vars @ #vars codePatt, code = #code codePatt } end (* Turn a decision tree into a series of tests for each pattern. *) and makeNaive(pattern as { leafSet, vars, ... }) = let fun createTests(_, { code = PattCodeLeaf, vars, ...}) = [(NaiveWild, vars)] | createTests(pat, { code = PattCodeBindTuple{ tupleNo, next }, vars, ... }) = (NaiveBindTuple tupleNo, vars) :: createTests(pat, next) | createTests(pat, { code = PattCodeTupleSelect { tupleNo, fieldOffset, next }, vars, ...}) = (NaiveTupleSelect { tupleNo = tupleNo, fieldOffset = fieldOffset }, vars) :: createTests(pat, next) | createTests(pat, { code = PattCodeConstructors { patterns, default, ... }, vars, ...}) = if pat inside #leafSet default (* If it's in the default set we don't discriminate here. *) then (NaiveWild, vars) :: createTests(pat, default) else let (* If it's not in the default it must be in one of the constructors. *) val (constr, code) = valOf(List.find(fn (_, {leafSet, ...}) => pat inside leafSet) patterns) in (NaivePattTest constr, vars) :: createTests(pat, code) end | createTests(pat, { code = PattCodeNaive l, vars, ...}) = let val { tests, ...} = valOf(List.find(fn{pattNo, ...} => pat = pattNo) l) in (NaiveWild, vars) :: tests end fun createPatts setToDo = if isEmptySet setToDo then [] else let val pat = first setToDo val entry = { pattNo = pat, tests = createTests(pat, pattern) } val otherPatts = createPatts(setToDo diff singleton pat) in (* Normally we want the patterns in order since earlier ones will generally be more specific. If 0 is in the set it represents "non-exhaustive" and must go last. *) if pat = 0 then otherPatts @ [entry] else entry :: otherPatts end in { leafSet=leafSet, vars=vars, code=PattCodeNaive(createPatts leafSet), leafCount = cardinality leafSet } end in fun buildPatternCode(tree, noOfPats, alwaysNaive) = let fun firePatt(pattsLeft, _) = let val pattern = if isEmptySet pattsLeft then 0 (* This represents non-exhaustive. *) else first pattsLeft in { vars = [], code = PattCodeLeaf, leafSet = singleton pattern, leafCount = 1 } end val patts = pattCode(tree, from 1 noOfPats, firePatt, 0) in if alwaysNaive then makeNaive patts else patts end end local (* Raises an exception. *) fun raiseException(exName, exIden, line) = mkRaise (mkTuple [exIden, mkStr exName, CodeZero, codeLocation line]); (* Create exception values - Small integer values are used for run-time system exceptions. *) val bindExceptionVal = mkConst (ADDRESS.toMachineWord EXC_Bind); val matchExceptionVal = mkConst (ADDRESS.toMachineWord EXC_Match); in (* Raise match and bind exceptions. *) fun raiseBindException line = raiseException("Bind", bindExceptionVal, line) and raiseMatchException line = raiseException("Match", matchExceptionVal, line) end (* Turn the decision tree into real code. *) local (* Guard and inversion code for constructors *) fun constructorCode(PattCodeDatatype(cons, polyVars), arg, {level, typeVarMap, ...}) = ( makeGuard (cons, polyVars, arg, level, typeVarMap), makeInverse (cons, polyVars, arg, level, typeVarMap) ) | constructorCode(PattCodeException cons, arg, {level, typeVarMap, ...}) = ( makeGuard (cons, [], arg, level, typeVarMap), makeInverse (cons, [], arg, level, typeVarMap) ) | constructorCode(PattCodeSpecial(eqFun, cval), arg, _) = let val constVal = case cval of SOME cv => mkConst cv | NONE => CodeZero in (mkEval(eqFun, [mkTuple[arg, constVal]]), CodeZero (* Unused *)) end (* Sequence of tests for naive match. *) fun makeNaiveTests([], _, _, _) = CodeTrue | makeNaiveTests ((NaiveWild, _) :: rest, arg, tupleMap, context) = makeNaiveTests(rest, arg, tupleMap, context) | makeNaiveTests ((NaiveBindTuple tupleNo, _) :: rest, arg, tupleMap, context) = let (* Bind it to a variable. We don't set the addresses of the vars at this point. *) val (declLoad, declDec) = bindPattVars(arg, [], context) in mkEnv([declDec], makeNaiveTests(rest, arg, (tupleNo, declLoad) :: tupleMap, context)) end | makeNaiveTests ((NaiveTupleSelect { tupleNo, fieldOffset}, _) :: rest, _, tupleMap, context) = let val findTuple = List.find(fn(a, _) => tupleNo = a) tupleMap in makeNaiveTests(rest, mkInd(fieldOffset, #2 (valOf findTuple)), tupleMap, context) end | makeNaiveTests ((NaivePattTest constr, _) :: rest, arg, tupleMap, context) = let (* Bind it to a variable. This avoids making multiple copies of code. *) val (declLoad, declDec) = bindPattVars(arg, [], context) val (thisTest, inverse) = constructorCode(constr, declLoad, context) in mkEnv([declDec], mkCand(thisTest, makeNaiveTests(rest, inverse, tupleMap, context))) end (* Load all the variables. *) fun makeLoads([], _, _, _, _) = [] | makeLoads((pattern, vars) :: rest, patNo, arg, tupleMap, context) = let val (declLoad, declDec) = bindPattVars(arg, vars, context) val pattLoad = case pattern of NaiveWild => makeLoads(rest, patNo, declLoad, tupleMap, context) | NaiveBindTuple tupleNo => makeLoads(rest, patNo, declLoad, (tupleNo, declLoad) :: tupleMap, context) | NaiveTupleSelect { tupleNo, fieldOffset} => let val findTuple = List.find(fn(a, _) => tupleNo = a) tupleMap in makeLoads(rest, patNo, mkInd(fieldOffset, #2 (valOf findTuple)), tupleMap, context) end | NaivePattTest constr => let val (_, inverse) = constructorCode(constr, declLoad, context) in makeLoads(rest, patNo, inverse, tupleMap, context) end in declDec :: pattLoad end in fun codeGenerateMatch(patCode, arg, firePatt, context: matchContext as {level, typeVarMap, ...}) = let fun codeMatch({ leafSet, vars, code, ...}, arg, tupleMap) = let (* Bind the current value to a codetree variable and set the addresses of any ML variables to this. *) val (declLoad, declDec) = bindPattVars(arg, vars, context) val pattCode = case code of PattCodeLeaf => (* Finished - fire the pattern. *) firePatt(first leafSet) | PattCodeBindTuple { tupleNo, next }=> (* Bind the tuple number to this address. *) codeMatch(next, arg, (tupleNo, declLoad) :: tupleMap) | PattCodeTupleSelect { tupleNo, fieldOffset, next } => let (* The tuple number should be in the map. Find the address and select the field. *) val findTuple = List.find(fn(a, _) => tupleNo = a) tupleMap in codeMatch(next, mkInd(fieldOffset, #2 (valOf findTuple)), tupleMap) end | PattCodeConstructors { nConstrs, patterns, default } => let fun doPattern((PattCodeDatatype(cons, polyVars), code) :: rest, 1) = (* This is the last pattern and we have done all the others. We don't need to test this one and we don't use the default. *) let val _ = null rest orelse raise InternalError "doPattern: not at end" val invertCode = makeInverse (cons, polyVars, declLoad, level, typeVarMap) in codeMatch(code, invertCode, tupleMap) end | doPattern([], _) = (* We've done all of them - do the default *) codeMatch(default, arg, tupleMap) | doPattern((constructor, matchCode) :: next, constrsLeft) = let val (testCode, invertCode) = constructorCode(constructor, declLoad, context) val thenCode = codeMatch(matchCode, invertCode, tupleMap) in mkIf(testCode, thenCode, doPattern(next, constrsLeft-1)) end in doPattern(patterns, nConstrs) end | PattCodeNaive patterns => let fun makePatterns [] = raise InternalError "makeTests: empty" | makePatterns ({ tests, pattNo} :: rest) = let val pattDecs = makeLoads(tests, pattNo, arg, tupleMap, context) val pattCode = mkEnv(pattDecs, firePatt pattNo) in (* If this is the last one there's no need for a test. *) if null rest then pattCode else mkIf(makeNaiveTests(tests, arg, tupleMap, context), pattCode, makePatterns rest) end in makePatterns patterns end in mkEnv([declDec], pattCode) end in codeMatch(patCode, arg, []) end (* Binding. This should be a single naive match. Generally it will be exhaustive so we will only have to load the variables. *) fun codeBinding( { leafSet, vars, code = PattCodeNaive({ tests, ...} :: _ (* Normally nil but could be PattCodeWild if non-exhaustive *)), ...}, arg, line, context) = let (* Bind this to a variable and set any top-level variable(s). *) val (declLoad, declDec) = bindPattVars(arg, vars, context) (* Create any test code to raise the bind exception *) val testCode = if not (0 inside leafSet) then [] (* Exhaustive - no test needed. *) else [mkNullDec(mkIf(makeNaiveTests(tests, declLoad, [], context), CodeZero, raiseBindException line))] (* Load the variables. *) val pattDecs = makeLoads(tests, 1, declLoad, [], context) in declDec :: testCode @ pattDecs end | codeBinding _ = raise InternalError "codeBinding: should be naive pattern match" end fun containsNonConstException(Aot{patts = TupleField fields, ...}) = List.foldl(fn (aot, t) => t orelse containsNonConstException aot) false fields | containsNonConstException(Aot{patts = Cons(cl, _), ...}) = List.foldl(fn ({appliedTo, ...}, t) => t orelse containsNonConstException appliedTo) false cl | containsNonConstException(Aot{patts = Excons cl, ...}) = List.foldl(fn ({appliedTo, exValue, ...}, t) => t orelse not (isSome exValue) orelse containsNonConstException appliedTo) false cl | containsNonConstException _ = false (* Scons or Wild *) (* Process a pattern in a binding. *) (* This previously used codePatt with special options to generate the correct structure for a binding. This does the test separately from loading the variables. If the pattern is not exhaustive this may do more work since the pattern is taken apart both in the test and for loading. *) fun codeBindingPattern(vbDec, arg, line, context) = let (* Build the tree. *) val andortree = buildAot(vbDec, aotEmpty, 1, line, context) (* Build the pattern code *) val patternCode as { leafSet, ... } = buildPatternCode(andortree, 1, true (* Always *)) (* It's not exhaustive if pattern zero is in the set. *) val exhaustive = not (0 inside leafSet) val codeDecs = codeBinding(patternCode, arg, line, context) in (codeDecs, exhaustive) end (* Process a set of patterns in a match. *) (* Naive match code. Doesn't check for exhaustiveness or redundancy. *) fun codeMatchPatterns(alt, arg, isHandlerMatch, lineNo, codePatternExpression, context as { lex, ...}) = let val noOfPats = length alt val andortree = buildTree(alt, context) (* If the match is sparse or there are any non-constant exceptions we need to use pattern-by-pattern matching. Non-constant exceptions could involve exception aliasing and this complicates pattern matching. It could break the rule that says that if a value matches one constructor it cannot then match any other. If we are compiling with debugging we also use the naive match. *) val alwaysNaive = containsNonConstException andortree orelse getParameter debugTag (debugParams lex) val patternCode as { leafSet, ... } = buildPatternCode(andortree, noOfPats, alwaysNaive) (* It's not exhaustive if pattern zero is in the set. *) val exhaustive = not (0 inside leafSet) fun firePatt 0 = ( exhaustive andalso raise InternalError "codeDefault called but exhaustive"; if isHandlerMatch then mkRaise arg else raiseMatchException lineNo ) | firePatt pattChosen = codePatternExpression(pattChosen - 1) in (codeGenerateMatch(patternCode, arg, firePatt, context), exhaustive) end (* Types that can be shared. *) structure Sharing = struct type parsetree = parsetree type typeVarMap = typeVarMap type level = level type codetree = codetree type matchtree = matchtree type codeBinding = codeBinding type lexan = lexan end end; polyml-5.6/mlsource/MLCompiler/ParseTree/MatchCompilerSig.sml000066400000000000000000000031511265146633400243470ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature MatchCompilerSig = sig type parsetree type typeVarMap type level type codetree type matchtree type codeBinding type lexan type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } and matchContext = { mkAddr: int->int, level: level, typeVarMap: typeVarMap, lex: lexan } val codeMatchPatterns: matchtree list * codetree * bool * location * (int -> codetree) * matchContext -> codetree * bool and codeBindingPattern: parsetree * codetree * location * matchContext -> codeBinding list * bool structure Sharing: sig type parsetree = parsetree type typeVarMap = typeVarMap type level = level type codetree = codetree type matchtree = matchtree type codeBinding = codeBinding type lexan = lexan end end; polyml-5.6/mlsource/MLCompiler/ParseTree/PARSE_TREE.ML000066400000000000000000000413451265146633400223720ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-15 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor PARSE_TREE ( structure BASEPARSETREE : BaseParseTreeSig structure PRINTTREE: PrintParsetreeSig structure EXPORTTREE: ExportParsetreeSig structure TYPECHECKTREE: TypeCheckParsetreeSig structure CODEGENPARSETREE: CodegenParsetreeSig structure LEX : LEXSIG structure STRUCTVALS : STRUCTVALSIG; structure TYPETREE : TYPETREESIG sharing LEX.Sharing = TYPETREE.Sharing = STRUCTVALS.Sharing = BASEPARSETREE.Sharing = PRINTTREE.Sharing = EXPORTTREE.Sharing = CODEGENPARSETREE.Sharing = TYPECHECKTREE.Sharing ) : PARSETREESIG = struct open LEX open STRUCTVALS open TYPETREE open BASEPARSETREE open PRINTTREE open EXPORTTREE open CODEGENPARSETREE open TYPECHECKTREE val badType = BadType fun isIdent (Ident _) = true | isIdent _ = false; val unit = Unit; val wildCard = WildCard; val emptyTree = EmptyTree; (* A general type variable for an expression. This is used to record the type. *) fun makeGeneralTypeVar() = mkTypeVar(generalisable, false, false, false) fun mkIdent (name, loc) : parsetree = Ident { name = name, expType = ref EmptyType, value = ref undefinedValue, location = loc, possible = ref(fn () => []) }; local (* Make overloaded functions for the conversions. *) (* For the moment we make the type string->t and raise an exception if the constant cannot be converted. *) val ty = mkOverloadSet[] val funType = mkFunctionType (stringType, ty); fun mkOverloaded name : values = makeOverloaded (name, funType, TypeDep) in val convString = mkOverloaded "convString" and convInt = mkOverloaded "convInt" and convWord = mkOverloaded "convWord" and convChar = mkOverloaded "convChar" and convReal = mkOverloaded "convReal" end; fun mkString(s: string, loc): parsetree = Literal{converter=convString, literal=s, expType=ref EmptyType, location=loc}; fun mkInt (i : string, loc) : parsetree = Literal{converter=convInt, literal=i, expType=ref EmptyType, location=loc}; fun mkReal (r : string, loc) : parsetree = Literal{converter=convReal, literal=r, expType=ref EmptyType, location=loc}; fun mkChar (c : string, loc) : parsetree = Literal{converter=convChar, literal=c, expType=ref EmptyType, location=loc}; fun mkWord (w : string, loc) : parsetree = Literal{converter=convWord, literal=w, expType=ref EmptyType, location=loc}; fun mkApplic (f, arg, loc, isInfix) : parsetree = Applic { f = f, arg = arg, location = loc, isInfix = isInfix, expType = ref EmptyType }; fun mkCond (test, thenpt, elsept, location) : parsetree = Cond { test = test, thenpt = thenpt, elsept = elsept, location = location, thenBreak = ref NONE, elseBreak = ref NONE } fun mkTupleTree(fields, location) = TupleTree { fields=fields, location=location, expType = ref EmptyType } fun mkValDeclaration (dec, explicit, implicit, location) : parsetree = ValDeclaration { dec = dec, explicit = explicit, implicit = implicit, location = location }; fun mkFunDeclaration (dec, explicit, implicit, location) : parsetree = FunDeclaration { dec=dec, explicit = explicit, implicit = implicit, location = location }; fun mkOpenTree(ptl : structureIdentForm list, location): parsetree = OpenDec{decs=ptl, variables=ref [], structures = ref [], typeconstrs = ref [], location = location}; fun mkStructureIdent (name, location) : structureIdentForm = { name = name, value = ref NONE, location = location }; fun mkValBinding (dec, exp, isRecursive, line) : valbind = ValBind { dec = dec, exp = exp, isRecursive = isRecursive, line = line, variables = ref nil }; fun mkClausal(clauses, location) : fvalbind = FValBind { clauses = clauses, numOfPatts = ref 0, functVar = ref undefinedValue, argType = ref badType, resultType = ref badType, location = location }; (* A clause for a clausal function is initially parsed as a pattern because that is the easiest way to handle it but that's actually more general than the syntax allows. Process it at this point to check for some validity. *) fun mkFunPattern (fPat, lex): funpattern * string * int = let fun makeId(name, loc) = {name = name, expType = ref EmptyType, location = loc } fun unpick (Applic{ f, arg, isInfix, ... }) = (* "Application" of function to a parameter. *) let val () = (* This could be an infixed application and since it has been parsed using the normal infix handler the arguments could be prefixed constructor applications or infixed constructor applications with a higher precedence. These are not allowed because the arguments are supposed to just be "atpats". Any applications should have been parenthesised. *) case (isInfix, arg) of (true, TupleTree{fields=[Applic _, _], location, ...}) => errorMessage(lex, location, "Constructor applications in fun bindings must be parenthesised.") | (true, TupleTree{fields=[_, Applic _], location, ...}) => errorMessage(lex, location, "Constructor applications in fun bindings must be parenthesised.") | _ => (); val { ident, isInfix, args, ... } = unpick f in { ident=ident, isInfix=isInfix, args = args @ [arg], constraint = NONE } end | unpick (Ident{ name, location, ...}) = { ident={ name = name, location = location, expType = ref EmptyType}, isInfix=false, args = [], constraint = NONE } | unpick (Parenthesised(Applic{ f = Ident { name, location, ...}, isInfix=true, arg, ... }, _)) = { ident={ name = name, location = location, expType = ref EmptyType}, isInfix=true, args = [arg], constraint = NONE } | unpick (Parenthesised(_, location)) = (* Only the bottom (i.e. first) application may be parenthesised and then only if the application is infixed. *) ( errorMessage(lex, location, "Parentheses are only allowed for infixed applications in fun bindings."); { ident=makeId("", location), isInfix=false, args = [], constraint = NONE } ) | unpick _ = ( errorMessage(lex, location lex, "Syntax error: fun binding is not an identifier applied to one or more patterns."); { ident=makeId("", location lex), isInfix=false, args = [], constraint = NONE } ) val unpicked as { ident = { name, ...}, args, ...} = (* The "pattern" may have a single constraint giving the result type of the function. Otherwise it must be a set of one or more, possibly infixed, applications. *) case fPat of Constraint { value = value as Applic _, given, ... } => let val { ident, isInfix, args, ... } = unpick value in { ident = ident, isInfix = isInfix, args = args, constraint = SOME given } end | Constraint { value = value as Parenthesised(Applic _, _), given, ... } => let val { ident, isInfix, args, ... } = unpick value in { ident = ident, isInfix = isInfix, args = args, constraint = SOME given } end | fPat as Parenthesised(Applic _, _) => unpick fPat | fPat as Applic _ => unpick fPat | _ => ( errorMessage(lex, location lex, "Syntax error: fun binding is not an identifier applied to one or more patterns."); { ident=makeId("", location lex), isInfix=false, args = [], constraint = NONE } ) in (unpicked, name, List.length args) end; fun mkClause (dec, exp, line) : fvalclause = FValClause { dec = dec, exp = exp, line = line, breakPoint = ref NONE } fun mkList(elem, loc) = List{ elements = elem, location = loc, expType = ref EmptyType } fun mkConstraint (value, given, location) : parsetree = Constraint { value = value, given = given, location = location }; fun mkLayered (var, pattern, location) : parsetree = Layered { var = var, pattern = pattern, location = location }; fun mkFn(matches, location) = Fn { matches = matches, location = location, expType = ref EmptyType } fun mkMatchTree (vars, exp, location) : matchtree = MatchTree { vars = vars, exp = exp, location = location, argType = ref badType, resType = ref badType, breakPoint = ref NONE } fun mkLocalDeclaration (decs, body, location, isLocal) : parsetree = Localdec { decs = map (fn p => (p, ref NONE)) decs, body = map (fn p => (p, ref NONE))body, isLocal = isLocal, varsInBody = ref [], location = location }; val mkTypeDeclaration : typebind list * location -> parsetree = TypeDeclaration; fun mkDatatypeDeclaration (typelist, withtypes, location) : parsetree = AbsDatatypeDeclaration { isAbsType = false, typelist = typelist, withtypes = withtypes, declist = [], location = location, equalityStatus = ref [] }; fun mkAbstypeDeclaration (typelist, withtypes, declist, location) : parsetree = AbsDatatypeDeclaration { isAbsType = true, typelist = typelist, withtypes = withtypes, declist = map (fn p => (p, ref NONE)) declist, location = location, equalityStatus = ref [] }; val mkDatatypeReplication = DatatypeReplication fun mkTypeBinding (name, typeVars, decType, isEqtype, nameLoc, fullLoc) : typebind = TypeBind { name = name, typeVars = typeVars, decType = decType, isEqtype = isEqtype, tcon = ref(TypeConstrSet(undefConstr, [])), nameLoc = nameLoc, fullLoc = fullLoc }; fun mkDatatypeBinding (name, typeVars, constrs, typeNameLoc, fullLoc) : datatypebind = DatatypeBind { name = name, typeVars = typeVars, constrs = constrs, tcon = ref(TypeConstrSet(undefConstr, [])), nameLoc = typeNameLoc, fullLoc = fullLoc }; fun mkExBinding (name, previous, typeof, nameLoc, fullLoc) : exbind = ExBind { name = name, previous = previous, ofType = typeof, value = ref undefinedValue, nameLoc = nameLoc, fullLoc = fullLoc }; fun mkLabelledTree (recList, frozen, location) : parsetree = Labelled { recList = recList, frozen = frozen, expType = ref EmptyType, location = location }; fun mkLabelRecEntry (name, nameLoc, valOrPat, fullLocation) = { name = name, nameLoc = nameLoc, valOrPat = valOrPat, fullLocation = fullLocation, expType = ref EmptyType } fun mkSelector(name, location) : parsetree = let (* Make a type for this. It's equivalent to fn { name = exp, ...} => exp. *) val resType = makeGeneralTypeVar(); val entryType = mkLabelEntry (name, resType); val labType = mkLabelled ([entryType], false) (* Not frozen*); in Selector { name = name, labType = labType, typeof = mkFunctionType (labType, resType), location = location } end; val mkRaise : parsetree * location -> parsetree = Raise; fun mkHandleTree (exp, hrules, location, listLocation) : parsetree = HandleTree { exp = exp, hrules = hrules, location = location, listLocation = listLocation }; fun mkWhile (test, body, location) : parsetree = While { test = test, body = body, location = location, breakPoint = ref NONE } fun mkCase (test, match, location, listLocation) : parsetree = Case { test = test, match = match, location = location, listLocation = listLocation, expType = ref EmptyType }; fun mkAndalso (first, second, location) : parsetree = Andalso { first = first, second = second, location = location }; fun mkOrelse (first, second, location) : parsetree = Orelse { first = first, second = second, location = location }; fun mkDirective (tlist, fix, location) : parsetree = Directive { tlist = tlist, fix = fix, location = location }; fun mkExpseq (pl: parsetree list, l: location) = ExpSeq (map (fn p => (p, ref NONE)) pl, l) val mkExDeclaration : exbind list * location -> parsetree = ExDeclaration; val mkParenthesised = Parenthesised (* Types that can be shared. *) structure Sharing = struct type lexan = lexan and pretty = pretty and environEntry = environEntry and codetree = codetree and codeBinding = codeBinding and types = types and values = values and typeId = typeId and structVals = structVals and typeConstrs= typeConstrs and typeVarForm=typeVarForm and env = env and infixity = infixity and structureIdentForm = structureIdentForm and typeParsetree = typeParsetree and parsetree = parsetree and valbind = valbind and fvalbind = fvalbind and fvalclause = fvalclause and typebind = typebind and datatypebind=datatypebind and exbind = exbind and labelRecEntry=labelRecEntry and ptProperties = ptProperties and matchtree = matchtree and typeVarMap = typeVarMap and level = level and debuggerStatus = debuggerStatus end end (* PARSETREE *); polyml-5.6/mlsource/MLCompiler/ParseTree/PRINT_PARSETREE.sml000066400000000000000000000603501265146633400234670ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor PRINT_PARSETREE ( structure BASEPARSETREE : BaseParseTreeSig structure LEX : LEXSIG structure STRUCTVALS : STRUCTVALSIG; structure TYPETREE : TYPETREESIG structure VALUEOPS : VALUEOPSSIG; structure PRETTY : PRETTYSIG sharing LEX.Sharing = TYPETREE.Sharing = STRUCTVALS.Sharing = VALUEOPS.Sharing = PRETTY.Sharing = BASEPARSETREE.Sharing ): PrintParsetreeSig = struct open LEX open STRUCTVALS open VALUEOPS open TYPETREE open PRETTY open BASEPARSETREE fun isEmptyTree EmptyTree = true | isEmptyTree _ = false; (* This pretty printer is used to format the parsetree for error messages (Error near ...) and also for debugging. There is a quite different pretty printer in VALUEOPS that is used to format values produced as a result of compiling and executing an expression or declaration. *) fun printList (doPrint: 'a*int->pretty) (c: 'a list, separator, depth): pretty list = if depth <= 0 then [PrettyString "..."] else case c of [] => [] | [v] => [doPrint (v, depth)] | (v::vs) => PrettyBlock (0, false, [], [ doPrint (v, depth), PrettyBreak (if separator = "," orelse separator = ";" orelse separator = "" then 0 else 1, 0), PrettyString separator ] ) :: PrettyBreak (1, 0) :: printList doPrint (vs, separator, depth - 1) (* Generates a pretty-printed representation of a piece of tree. *) fun displayParsetree (c : parsetree, (* The value to print. *) depth : int) : pretty = (* The number of levels to display. *) let val displayList = printList displayParsetree and displayListWithBpts = printList (fn ((c,_), depth) => displayParsetree(c, depth)) (* type bindings and datatype bindings are used in several cases *) fun printTypeBind (TypeBind{name, typeVars, decType, ...}, depth) = PrettyBlock (3, true, [], displayTypeVariables (typeVars, depth) @ ( PrettyString name :: (* The type may be missing if this is a signature. *) (case decType of NONE => [] | SOME t => [ PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayTypeParse (t, depth, emptyTypeEnv) ] ) ) ) and printDatatypeBind (DatatypeBind{name, typeVars, constrs, ...}, depth) = PrettyBlock (3, true, [], displayTypeVariables (typeVars, depth) @ ( PrettyString name :: PrettyBreak (1, 0) :: PrettyString "=" :: PrettyBreak (1, 0) :: printList printConstructor (constrs, "|", depth - 1) ) ) and printConstructor ({constrName, constrArg, ...}, depth) = PrettyBlock (2, false, [], PrettyString constrName :: ( case constrArg of NONE => [] | SOME argType => [ PrettyBreak (1, 0), PrettyString "of", PrettyBreak (1, 0), displayTypeParse (argType, depth, emptyTypeEnv) ] ) ) in if depth <= 0 (* elide further text. *) then PrettyString "..." else case c of Ident {name, ...} => PrettyString name | Literal{literal, converter, ...} => let val convName = valName converter val lit = if convName = "convString" then concat["\"" , literal, "\""] else if convName = "convChar" then concat["#\"" , literal, "\""] else literal in PrettyString lit end | Applic { f, arg = TupleTree{fields=[left, right], ...}, isInfix = true, ...} => (* Infixed application. *) PrettyBlock (0, false, [], [ displayParsetree (left, depth - 1), PrettyBreak (1, 0), displayParsetree (f, depth), (* Just an identifier. *) PrettyBreak (1, 0), displayParsetree (right, depth - 1) ] ) | Applic {f, arg, ...} => (* Function application. *) PrettyBlock (0, false, [], [ displayParsetree (f, depth - 1), PrettyBreak (1, 0), displayParsetree (arg, depth - 1) ] ) | Cond {test, thenpt, elsept, ...} => (* if..then..else.. *) PrettyBlock (0, false, [], [ PrettyString "if", PrettyBreak (1, 0), displayParsetree (test, depth - 1), PrettyBreak (1, 0), PrettyString "then", PrettyBreak (1, 0), displayParsetree (thenpt, depth - 1), PrettyBreak (1, 0), PrettyString "else", PrettyBreak (1, 0), displayParsetree (elsept, depth - 1) ] ) | TupleTree{fields, ...} => PrettyBlock (3, true, [], ( PrettyString "(" :: PrettyBreak (0, 0) :: displayList (fields, ",", depth - 1) ) @ [PrettyBreak (0, 0), PrettyString ")"] ) | ValDeclaration {dec, ...} => let (* We can't use printList here because we don't want an "and" after a "rec". *) fun printValBind ([], _) = [] | printValBind (ValBind{dec, exp, isRecursive, ...} :: rest, depth) = if depth <= 0 then [PrettyString "..."] else let val isRec = if isRecursive then [PrettyString "rec" , PrettyBreak (1, 0)] else [] val pValBind = PrettyBlock (3, false, [], [ displayParsetree (dec, depth - 1), PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayParsetree (exp, depth - 1) ] ) in case rest of [] => isRec @ [pValBind] | _ => PrettyBlock (0, false, [], isRec @ [pValBind, PrettyBreak(1, 0), PrettyString "and"]) :: PrettyBreak(1, 0) :: printValBind(rest, depth-1) end in PrettyBlock (3, true, [], PrettyString "val" :: PrettyBreak (1, 0) :: (* TODO: Display the explicit type variables. *) (* displayTypeVariables (explicit, depth); *) printValBind (dec, depth - 1) ) end | FunDeclaration {dec, ...} => let fun printfvalbind (FValBind{clauses, ...}, depth) = PrettyBlock(3, true, [], printList printClause (clauses, "|", depth - 1)) and printClause (FValClause{dec, exp, ...}, depth) = PrettyBlock (3, true, [], [ printDec (dec, depth - 1), PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayParsetree (exp, depth - 1) ] ) and printDec( { ident = { name, ... }, isInfix=true, args=[TupleTree{fields=[left, right], ...}], constraint }, depth) = (* Single infixed application. *) PrettyBlock (0, false, [], [ displayParsetree (left, depth - 1), PrettyBreak (1, 0), PrettyString name, PrettyBreak (1, 0), displayParsetree (right, depth - 1) ] @ printConstraint (constraint, depth-1) ) | printDec( { ident = { name, ... }, isInfix=true, args=TupleTree{fields=[left, right], ...} :: args, constraint }, depth) = (* Infixed application followed by other arguments. *) PrettyBlock (0, false, [], [ PrettyString "(", PrettyBreak (0, 0), displayParsetree (left, depth - 1), PrettyBreak (1, 0), PrettyString name, PrettyBreak (1, 0), displayParsetree (right, depth - 1), PrettyBreak (0, 0), PrettyString ")" ] @ displayList (args, "", depth - 1) @ printConstraint(constraint, depth-2) ) | printDec({ ident = { name, ...}, args, constraint, ... }, depth) = (* Prefixed application. *) PrettyBlock (0, false, [], [ PrettyString name, PrettyBreak (1, 0) ] @ displayList (args, "", depth - 1) @ printConstraint(constraint, depth-2) ) and printConstraint(NONE, _) = [] | printConstraint(SOME given, depth) = [ PrettyBreak (1, 0), PrettyString ":", PrettyBreak (1, 0), displayTypeParse (given, depth, emptyTypeEnv) ] in PrettyBlock (3, true, [], PrettyString "fun" :: PrettyBreak (1, 0) :: (* TODO: Display the explicit type variables. *) (* displayTypeVariables (explicit, depth); *) printList printfvalbind (dec, "and", depth - 1) ) end | OpenDec {decs, ...} => let fun printStrName ({name, ...}: structureIdentForm, _) = PrettyString name in PrettyBlock (3, true, [], PrettyString "open" :: PrettyBreak (1, 0) :: printList printStrName (decs, "", depth - 1) ) end | List {elements, ...} => PrettyBlock (3, true, [], PrettyString "[" :: PrettyBreak (0, 0) :: displayList (elements, ",", depth - 1) @ [PrettyBreak (0, 0), PrettyString "]" ] ) | Constraint {value, given, ...} => PrettyBlock (3, false, [], [ displayParsetree (value, depth - 1), PrettyBreak (1, 0), PrettyString ":", PrettyBreak (1, 0), displayTypeParse (given, depth, emptyTypeEnv) ] ) | Layered {var, pattern, ...} => PrettyBlock (3, true, [], [ displayParsetree (var, depth - 1), PrettyBreak (1, 0), PrettyString "as", PrettyBreak (1, 0), displayParsetree (pattern, depth - 1) ] ) | Fn {matches, ...} => PrettyBlock (3, true, [], PrettyString "fn" :: PrettyBreak (1, 0) :: printList displayMatch (matches, "|", depth - 1) ) | Unit _ => PrettyString "()" | WildCard _ => PrettyString "_" | Localdec {isLocal, decs, body, ...} => PrettyBlock (3, false, [], PrettyString (if isLocal then "local" else "let") :: PrettyBreak (1, 0) :: displayListWithBpts (decs, ";", depth - 1) @ [PrettyBreak (1, 0), PrettyString "in", PrettyBreak (1, 0)] @ displayListWithBpts (body, ";", depth - 1) @ [PrettyBreak (1, 0), PrettyString "end"] ) | TypeDeclaration(ptl, _) => let (* This is used both for type bindings and also in signatures. In a signature we may have "eqtype". *) val typeString = case ptl of TypeBind {isEqtype=true, ...} :: _ => "eqtype" | _ => "type" in PrettyBlock (3, true, [], PrettyString typeString :: PrettyBreak (1, 0) :: printList printTypeBind (ptl, "and", depth - 1) ) end | AbsDatatypeDeclaration {typelist, withtypes, isAbsType=false, ...} => PrettyBlock (3, true, [], PrettyString "datatype" :: PrettyBreak (1, 0) :: printList printDatatypeBind (typelist, "and", depth - 1) @ ( if null withtypes then [] else PrettyBreak (1, 0) :: PrettyString "withtype" :: PrettyBreak (1, 0) :: printList printTypeBind (withtypes, "and", depth - 1) ) ) | DatatypeReplication {newType, oldType, ...} => PrettyBlock (3, true, [], [ PrettyString "datatype", PrettyBreak (1, 0), PrettyString newType, PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), PrettyString "datatype", PrettyBreak (1, 0), PrettyString oldType ] ) | AbsDatatypeDeclaration {typelist, withtypes, declist, isAbsType=true, ...} => PrettyBlock (3, true, [], PrettyString "abstype" :: PrettyBreak (1, 0) :: printList printDatatypeBind (typelist, "and", depth - 1) @ [ PrettyBreak (1, 0) ] @ ( if null withtypes then [] else PrettyString "withtype" :: PrettyBreak (1, 0) :: printList printTypeBind (withtypes, "and", depth - 1) @ [PrettyBreak (1, 0)] ) @ [ PrettyString "with", PrettyBreak (1, 0), PrettyBlock (3, true, [], displayListWithBpts(declist, ";", depth - 1)) ] ) | ExpSeq(ptl, _) => PrettyBlock (3, true, [], PrettyString "(" :: PrettyBreak (0, 0) :: displayListWithBpts (ptl, ";", depth - 1) @ [ PrettyBreak (0, 0), PrettyString ")"] ) | Directive {fix, tlist, ...} => let val status = case fix of Nonfix => PrettyString "nonfix" | Infix prec => PrettyBlock(0, false, [], [ PrettyString "infix", PrettyBreak (1, 0), PrettyString (Int.toString prec) ]) | InfixR prec => PrettyBlock(0, false, [], [ PrettyString "infixr", PrettyBreak (1, 0), PrettyString (Int.toString prec) ]) in PrettyBlock (3, true, [], status :: PrettyBreak (1, 0) :: printList (fn (name, _) => PrettyString name) (tlist, "", depth - 1) ) end | ExDeclaration(pt, _) => let fun printExBind (ExBind {name, ofType, previous, ...}, depth) = PrettyBlock (0, false, [], PrettyString name :: (case ofType of NONE => [] | SOME typeof => [ PrettyBreak (1, 0), PrettyString "of", PrettyBreak (1, 0), displayTypeParse (typeof, depth, emptyTypeEnv) ] ) @ (if isEmptyTree previous then [] else [ PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayParsetree (previous, depth - 1) ]) ) in PrettyBlock (3, true, [], PrettyString "exception" :: PrettyBreak (1, 0) :: printList printExBind (pt, "and", depth - 1) ) end | Raise (pt, _) => PrettyBlock (0, false, [], [ PrettyString "raise", PrettyBreak (1, 0), displayParsetree (pt, depth - 1) ] ) | HandleTree {exp, hrules, ...} => PrettyBlock (0, false, [], [ displayParsetree (exp, depth - 1), PrettyBreak (1, 0), PrettyBlock (3, true, [], PrettyString "handle" :: PrettyBreak (1, 0) :: printList displayMatch (hrules, "|", depth - 1) ) ] ) | While {test, body, ...} => PrettyBlock (0, false, [], [ PrettyString "while", PrettyBreak (1, 0), displayParsetree (test, depth - 1), PrettyBreak (1, 0), PrettyString "do", PrettyBreak (1, 0), displayParsetree (body, depth - 1) ] ) | Case {test, match, ...} => PrettyBlock (3, true, [], PrettyBlock (0, false, [], [ PrettyString "case", PrettyBreak (1, 0), displayParsetree (test, depth - 1), PrettyBreak (1, 0), PrettyString "of" ] ) :: PrettyBreak (1, 0) :: printList displayMatch (match, "|", depth - 1) ) | Andalso {first, second, ...} => PrettyBlock (3, true, [], [ displayParsetree (first, depth - 1), PrettyBreak (1, 0), PrettyString "andalso", PrettyBreak (1, 0), displayParsetree (second, depth - 1) ] ) | Orelse {first, second, ...} => PrettyBlock (3, true, [], [ displayParsetree (first, depth - 1), PrettyBreak (1, 0), PrettyString "orelse", PrettyBreak (1, 0), displayParsetree (second, depth - 1) ] ) | Labelled {recList, frozen, ...} => let fun displayRecList (c, depth): pretty list = if depth <= 0 then [PrettyString "..."] else case c of [] => [] | [{name, valOrPat, ...}] => [ PrettyBlock (0, false, [], [ PrettyString (name ^ " ="), PrettyBreak (1, 0), displayParsetree (valOrPat, depth - 1) ] ) ] | ({name, valOrPat, ...}::vs) => PrettyBlock (0, false, [], [ PrettyBlock (0, false, [], [ PrettyString (name ^ " ="), PrettyBreak (1, 0), displayParsetree (valOrPat, depth - 1) ] ), PrettyBreak (0, 0), PrettyString "," ] ) :: PrettyBreak (1, 0) :: displayRecList (vs, depth - 1) (* end displayRecList *) in PrettyBlock (2, false, [], PrettyString "{" :: displayRecList (recList, depth - 1) @ (if frozen then [PrettyString "}"] else [PrettyString (if null recList then "...}" else ", ...}")]) ) end | Selector {name, ...} => PrettyString ("#" ^ name) | EmptyTree => PrettyString "" | Parenthesised(p, _) => PrettyBlock(0, false, [], [ PrettyString "(", PrettyBreak (0, 0), displayParsetree (p, depth), PrettyBreak (0, 0), PrettyString ")" ] ) end (* displayParsetree *) and displayMatch(MatchTree {vars, exp, ...}, depth) = PrettyBlock (0, false, [], [ displayParsetree (vars, depth - 1), PrettyBreak (1, 0), PrettyString "=>", PrettyBreak (1, 0), displayParsetree (exp, depth - 1) ] ) (* Error message routine. Used in both pass 2 and pass 3. *) fun errorNear (lex, hard, near, line, message) = let val errorDepth = errorDepth lex in (* Puts out an error message and then prints the piece of tree. *) reportError lex { hard = hard, location = line, message = PrettyBlock (0, false, [], [PrettyString message]), context = SOME(displayParsetree (near, errorDepth)) } end (* Types that can be shared. *) structure Sharing = struct type lexan = lexan and parsetree = parsetree and matchtree = matchtree and pretty = pretty end end; polyml-5.6/mlsource/MLCompiler/ParseTree/PrintParsetreeSig.sml000066400000000000000000000025321265146633400245710ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature PrintParsetreeSig = sig type lexan type parsetree type matchtree type pretty type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val displayParsetree: parsetree * int -> pretty val displayMatch: matchtree * int -> pretty val errorNear: lexan * bool * parsetree * location * string -> unit structure Sharing: sig type lexan = lexan and parsetree = parsetree and matchtree = matchtree and pretty = pretty end end; polyml-5.6/mlsource/MLCompiler/ParseTree/TYPECHECK_PARSETREE.sml000066400000000000000000003425531265146633400241220ustar00rootroot00000000000000(* Copyright (c) 2013-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Derived from the original parse-tree Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-13 David C.J. Matthews Title: Parse Tree Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor TYPECHECK_PARSETREE ( structure BASEPARSETREE : BaseParseTreeSig structure PRINTTREE: PrintParsetreeSig structure EXPORTTREE: ExportParsetreeSig structure LEX : LEXSIG structure CODETREE : CODETREESIG structure STRUCTVALS : STRUCTVALSIG; structure TYPETREE : TYPETREESIG structure VALUEOPS : VALUEOPSSIG; structure PRETTY : PRETTYSIG structure COPIER: COPIERSIG structure DATATYPEREP: DATATYPEREPSIG structure UTILITIES : sig type lexan; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option}; val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; val checkForDots: string * lexan * location -> unit; val splitString: string -> { first:string,second:string } structure Sharing: sig type lexan = lexan end end structure PRINTTABLE : sig type typeConstrs type codetree val getOverloads: string -> (typeConstrs * codetree) list structure Sharing: sig type codetree = codetree and typeConstrs = typeConstrs end end; structure MISC : sig exception InternalError of string; (* compiler error *) val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list; val lookupDefault : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option end sharing LEX.Sharing = TYPETREE.Sharing = STRUCTVALS.Sharing = COPIER.Sharing = VALUEOPS.Sharing = UTILITIES.Sharing = PRETTY.Sharing = CODETREE.Sharing = PRINTTABLE.Sharing = DATATYPEREP.Sharing = BASEPARSETREE.Sharing = PRINTTREE.Sharing = EXPORTTREE.Sharing ): TypeCheckParsetreeSig = struct open MISC open LEX open CODETREE open STRUCTVALS open TYPETREE open VALUEOPS open UTILITIES open PRETTY open PRINTTABLE open DATATYPEREP open BASEPARSETREE open PRINTTREE open EXPORTTREE val emptyType = EmptyType val badType = BadType (* Second pass of ML parse tree. *) (* This is pass 2 of the compiler. It walks over the parse tree generated by pass 1 and looks up identifiers to match them to declarations. It performs the type checking. "makeTypeId" is used to construct unique identifiers for types depending on the context (i.e. in a signature, structure or functor). *) fun pass2 (v, makeTypeId, env, lex, sigTypeIdMap) = let (* Returns a function which can be passed to unify or apply to print a bit of context info. *) fun foundNear v () = let val errorDepth = errorDepth lex in displayParsetree (v, errorDepth) end (* A simpler error message routine for lookup_... where the message does not involve pretty-printing anything. *) fun giveError (v, lex, line) = fn message => errorNear (lex, true, v, line, message); fun checkForBuiltIn (name, v, lex, lineno, isConstr) = (* ML97 does not allow the standard constructors to be rebound and does not allow "it" to become a constructor. *) if name = "true" orelse name = "false" orelse name = "nil" orelse name = "::" orelse name = "ref" orelse (isConstr andalso name = "it") then errorNear(lex, true, v, lineno, "Rebinding or specifying \"" ^ name ^ "\" is illegal") else () (* Turn a result from unifyTypes into a pretty structure so that it can be included in a message. *) fun unifyErrorReport(lex, typeEnv) = unifyTypesErrorReport(lex, typeEnv, typeEnv, "unify") (* Error message for incompatible types. Displays both expressions and their types. *) fun typeMismatch (title, left, right, detail, lex : lexan, location, moreInfo) = let val message = PrettyBlock(3, true, [], [ PrettyString title, PrettyBreak(1, 0), left, PrettyBreak(1, 0), right, PrettyBreak(1, 0), PrettyBlock(0, false, [], [PrettyString "Reason:", PrettyBreak(1, 3), detail]) ]) in reportError lex { location = location, hard = true, message = message, context = SOME (moreInfo ()) } end; (* Error message for single expressions with the wrong type. e.g. "if" not followed by a "bool". *) fun typeWrong (title, value, detail, lex : lexan, location, moreInfo) = let val message = PrettyBlock(3, true, [], [ PrettyString title, PrettyBreak(1, 0), value, PrettyBreak(1, 0), PrettyBlock(0, false, [], [ PrettyString "Reason:", PrettyBreak(1, 3), detail]) ]) in reportError lex { location = location, hard = true, message = message, context = SOME (moreInfo ()) } end; (* Display a value and its type as part of an error message. *) fun valTypeMessage (lex, typeEnv) (title, value, valType) = let val errorDepth = errorDepth lex in PrettyBlock(3, false, [], [ PrettyString title, PrettyBreak(1, 0), displayParsetree (value, errorDepth), PrettyBreak(1, 0), PrettyString ":", PrettyBreak(1, 0), display(valType, 10000 (* All of it *), typeEnv) ]) end fun matchTypeMessage (lex, typeEnv) (title, match, valType) = let val errorDepth = errorDepth lex in PrettyBlock(3, false, [], [ PrettyString title, PrettyBreak(1, 0), displayMatch (match, errorDepth), PrettyBreak(1, 0), PrettyString ":", PrettyBreak(1, 0), display(valType, 10000 (* All of it *), typeEnv) ]) end (* Old error message and unification functions. These will eventually be removed. *) fun matchError (error: matchResult, lex : lexan, location : LEX.location, moreInfo : unit -> pretty, typeEnv) : unit = reportError lex { location = location, hard = true, message = unifyErrorReport(lex, typeEnv) error, context = SOME (moreInfo ()) } fun unify (alpha, beta, lex, location, moreInfo, typeEnv) = case unifyTypes (alpha, beta) of NONE => () | SOME error => matchError (error, lex, location, moreInfo, typeEnv) fun apply (f, arg, lex, location, moreInfo, typeEnv) = case eventual f of FunctionType {arg=farg, result} => ( unify (farg, arg, lex, location, moreInfo, typeEnv); result ) | ef => (* Type variables etc. - Use general case. *) let (* Make arg->'a, and unify with the function. *) val resType = mkTypeVar (generalisable, false, false, false) val fType = mkFunctionType (arg, resType) (* This may involve more than just assigning the type to "ef". *) val () = unify (ef, fType, lex, location, moreInfo, typeEnv); in resType (* The result is the type variable unified to the result. *) end (* These cases currently use the "apply" or "unify" and may need to be improved in order to produce better messages. apply: Literals. The conversion functions are applied to the string literal. In effect this produces the set of overloadings of the literal. This should never produce an error message. Constructors in patterns to their args. "case": the patterns are "applied" to the value to be tested. unify: Layered patterns, to set the variable. Also checks the pattern against any explicit type. Handlers: the handling patterns are unified against a function from exn -> the result type of the expression being handled. *) fun stringsOfSearchList { apply: (string * 'a -> unit) -> unit, ...} () = let val v = ref [] val () = apply (fn (s, _) => v := s :: !v) in !v end fun assignValues (level, letDepth, env, near, v) = let val typeEnv = { lookupType = fn s => case #lookupType env s of NONE => NONE | SOME t => SOME(t, NONE), lookupStruct = fn s => case #lookupStruct env s of NONE => NONE | SOME t => SOME(t, NONE) } (* Process each item of the sequence and return the type of the last item. A default item is returned if the list is empty. *) fun assignSeq(env, depth, l, isExp) = let fun applyList last [] = last | applyList _ ((h, _) :: t) = let val expT = assignValues(level, depth, env, v, h) val _ = if isExp andalso not (null t) then (* It's not the last value and we're going to discard it *) case checkDiscard(expT, lex) of NONE => () | SOME s => errorNear (lex, false, h, getLocation h, s) else () in applyList expT t end in applyList badType l end (* Variables, constructors and fn are non-expansive. [] is a derived form of "nil" so must be included. Integer and string constants are also constructors but cannot involve imperative type variables. Constrained versions are also non-expansive. This has been extended and made more explicit in ML 97. *) fun nonExpansive (Fn _) = true | nonExpansive (Ident _) = true | nonExpansive (List{elements = [], ...}) = true | nonExpansive (List{elements, ...}) = List.foldl (fn (v, a) => a andalso nonExpansive v) true elements | nonExpansive (Constraint {value, ...}) = nonExpansive value | nonExpansive (Literal _) = true | nonExpansive (Unit _) = true | nonExpansive (TupleTree{fields, ...}) = List.foldl (fn (v, a) => a andalso nonExpansive v) true fields | nonExpansive (Labelled{recList, ...}) = List.foldl (fn ({valOrPat, ...}, a) => a andalso nonExpansive valOrPat) true recList (* Every element must be non-expansive *) | nonExpansive (Applic{f, arg, ...}) = isNonRefConstructor f andalso nonExpansive arg | nonExpansive (Selector _) = true (* derived from fn {..} => ...*) | nonExpansive (Parenthesised(p, _)) = nonExpansive p | nonExpansive _ = false (* An application is non-expansive only if it is a, possibly constrained, constructor which is not ref. *) and isNonRefConstructor (Ident {value=ref v, ...}) = (* It is possible to rebind ref by way of datatype replication so we have to check the type here. *) let fun isRefConstructor t = case eventual t of FunctionType{result, ...} => (case eventual result of TypeConstruction{constr, ...} => sameTypeId (tcIdentifier constr, tcIdentifier refConstr) | _ => false) | _ => false in isConstructor v andalso not (isRefConstructor(valTypeOf v)) end | isNonRefConstructor (Constraint {value, ...}) = isNonRefConstructor value | isNonRefConstructor (Parenthesised(p, _)) = isNonRefConstructor p | isNonRefConstructor _ = false (* Applies "assignValues" or "processPattern" to every element of a list and unifies the types. Returns a type variable if the list is empty. This is used for lists, function values (fn .. => ...), handlers and case expressions. *) fun assignList _ _ [] = mkTypeVar (generalisable, false, false, false) | assignList (processValue: 'a->types, _, _) _ [single] = processValue single | assignList (processValue: 'a->types, displayValue, typeMsg) (errorMsg, itemName, separator, location, near) (tlist as hd :: tl) = let val firstType = processValue hd fun printList (doPrint: 'a*int->pretty) (c: 'a list, separator, depth): pretty list = if depth <= 0 then [PrettyString "..."] else case c of [] => [] | [v] => [doPrint (v, depth)] | (v::vs) => PrettyBlock (0, false, [], [ doPrint (v, depth), PrettyBreak (if separator = "," orelse separator = ";" orelse separator = "" then 0 else 1, 0), PrettyString separator ] ) :: PrettyBreak (1, 0) :: printList doPrint (vs, separator, depth - 1) fun applyList(ty, _, []) = ty | applyList(ty, n, h::t) = let val typ = processValue h in case unifyTypes (ty, typ) of NONE => applyList(ty, n+1, t) | SOME report => let (* We have a type error but we don't know which is correct. The previous items must have produced a consistent type otherwise we'd already have reported an error but we can't identify exactly where the error occurred. *) val errorDepth = errorDepth lex val previousValsAndType = PrettyBlock(3, false, [], [ PrettyString ( if n = 1 then itemName ^ " 1:" else itemName ^ "s 1-" ^ Int.toString n ^ ":"), PrettyBreak(1, 0), PrettyBlock(0, false, [], printList (*displayParsetree*)displayValue (List.take(tlist, n), separator, errorDepth)), PrettyBreak(1, 0), PrettyString ":", PrettyBreak(1, 0), display(ty, 10000 (* All of it *), typeEnv) ]) in typeMismatch(errorMsg, previousValsAndType, (*valTypeMessage*)typeMsg(lex, typeEnv) (concat[itemName, " ", Int.toString(n+1), ":"], h, typ), unifyErrorReport(lex, typeEnv) report, lex, location, foundNear near); (* Continue with "bad" which suppresses further error messages and return "bad" as the result. *) applyList(badType, n+1, t) end end in applyList(firstType, 1, tl) end fun ptAssignTypes (t, near) = assignTypes (t, fn (s, line) => lookupTyp ({lookupType = #lookupType env, lookupStruct = #lookupStruct env}, s, giveError (near, lex, line)), lex); (* Makes a type for an instance of an identifier. *) (* Get the current overload set for the function and return a new instance of the type containing the overload set. *) fun overloadType(Value{typeOf, access = Overloaded TypeDep, name, ...}, isConv) = #1 (generaliseOverload(typeOf, List.map #1 (getOverloads name), isConv)) | overloadType(Value{typeOf, ...}, _) = #1 (generalise typeOf) fun instanceType (v as Value{access=Overloaded TypeDep, ...}) = (* Look up the current overloading for this function. *) overloadType(v, false) | instanceType(Value{typeOf, ...}) = #1 (generalise typeOf) (* The types of constructors and variables are copied to create new instances of type variables. *) fun processPattern(pat, enterResult, level, notConst, mkVar, isRec) = let val mapProcessPattern = map (fn x => processPattern(x, enterResult, level, notConst, mkVar, isRec)); in case pat of Ident {name, value, expType, location, possible, ...} => (* Variable or nullary constructor. *) let (* Look up the name. If it is a constructor then use it, otherwise return `undefined'. If it is a qualified name, i.e. it contains a full-stop, we assume it is a constructor and give an error message if it does not exist. *) (* In ML 97 recursive declarations such as val rec f = ... override constructor status. If this is a recursive declaration we don't check for constructor status. *) val names = splitString name; val nameVal = if isRec then undefinedValue else if #first names = "" then (* Not qualified - may be a variable. *) getOpt (#lookupVal env name, undefinedValue) else (* Qualified - cannot be a variable. *) lookupValue ("Constructor", {lookupVal= #lookupVal env, lookupStruct= #lookupStruct env}, name, giveError (pat, lex, location)) (* Remember the possible names here. *) val () = possible := #allValNames env val instanceType = (* If the result is a constructor use it. *) if isConstructor nameVal (* exceptions. *) then if notConst then ( errorNear (lex, true, pat, location, "Identifier before `as' must not be a constructor."); badType ) else (* Must be a nullary constructor otherwise it should have been applied to something. *) let (* set this value in the record *) val () = value := nameVal; val isNullary = case nameVal of Value{class=Constructor{nullary, ...}, ...} => nullary | Value{typeOf, ...} => (* exception *) not (isSome(getFnArgType typeOf)) in if isNullary then instanceType nameVal else ( errorNear (lex, true, pat, location, "Constructor must be applied to an argument pattern."); badType ) end (* If undefined or another variable, construct a new variable. *) else let val props = [DeclaredAt location, SequenceNo (newBindingId lex)] val var = mkVar(name, mkTypeVar (level, false, false, false), props) in checkForDots (name, lex, location); (* Must not be qualified *) (* Must not be "true", "false" etc. *) checkForBuiltIn (name, v, lex, location, false); enterResult (name, var); value := var; valTypeOf var (* and return its type *) end; in expType := instanceType; (* Record the instance type.*) instanceType end | Literal{converter, expType, location, ...} => let (* Find out the overloadings on this converter and construct an instance of it. The converters are all functions from string to the result type. *) val instanceType = overloadType(converter, true) (* Apply the converter to string to get the type of the literal. *) val instance = apply(instanceType, stringType, lex, location, foundNear pat, typeEnv) in expType := instance; (* Record the instance type.*) instance end | Applic {f = con, arg, location, expType, ...} => let (* Apply the function to the argument and return the result. *) (* Function must be a constructor. *) val conType = case con of Ident {name, value, location, expType, possible, ...} => let (* Look up the value and return the type. *) (* Remember the possible names here. *) val () = possible := #allValNames env val constrVal = lookupValue ("Constructor", {lookupVal = #lookupVal env, lookupStruct = #lookupStruct env}, name, giveError (pat, lex, location)); in if isConstructor constrVal then let val cType = instanceType constrVal in value := constrVal; expType := cType; (* Record the instance type.*) cType end else (* Undeclared or a variable. *) ( if isUndefinedValue constrVal then () else errorNear (lex, true, pat, location, name ^ " is not a constructor"); badType ) end | _ => (* con is not an Ident *) ( errorNear (lex, true, pat, location, "Constructor in a pattern was not an identifier"); badType ) val patType = processPattern(arg, enterResult, level, notConst, mkVar, isRec); (* Apply to the pattern type. *) val resultType = apply (conType, patType, lex, location, foundNear pat, typeEnv) in expType := resultType; (* Record the instance type.*) resultType end (* Applic *) | TupleTree{fields, expType, ...} => let (* Construct the type obtained by mapping "processPattern" onto each element of the tuple. *) val tupleType = mkProductType (mapProcessPattern fields) in expType := tupleType; tupleType end | Labelled {recList, frozen, expType, ...} => let (* Process each item in the list. *) fun mapLabels [] = [] | mapLabels ({name, valOrPat, expType, ...}::T) = (* Type is a label entry with the label name and the type of the pattern. *) let val ty = processPattern(valOrPat, enterResult, level, notConst, mkVar, isRec) in expType := ty; mkLabelEntry(name, ty) :: mapLabels T end; val patType = mkLabelled (sortLabels(mapLabels recList), frozen); in expType := patType; patType end | (aList as List{elements, location, expType}) => let (* Applies "processPattern" to every element of a list and unifies the types. Returns a type variable if the list is empty *) fun processElement elem = processPattern(elem, enterResult, level, notConst, mkVar, isRec) val elementType = assignList (processElement, displayParsetree, valTypeMessage) ("Elements in a list have different types.", "Item", ",", location, aList) elements val resType = if isBadType elementType then badType else mkTypeConstruction ("list", tsConstr listConstr, [elementType], [DeclaredAt inBasis]) in expType := resType; resType end | aConstraint as Constraint {value, given, location} => let val valType = processPattern(value, enterResult, level, notConst, mkVar, isRec); val theType = ptAssignTypes(given, pat); in (* These must be unifiable. *) case unifyTypes(valType, theType) of NONE => () (* OK. *) | SOME report => typeMismatch("Type mismatch in type constraint.", valTypeMessage (lex, typeEnv) ("Value:", value, valType), PrettyBlock(0, false, [], [ PrettyString "Constraint:", PrettyBreak(1, 0), display(theType, 10000 (* All of it *), typeEnv) ]), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear aConstraint); theType end | Layered {var, pattern, location} => let (* Unify the variable and the pattern - At this stage that simply involves assigning the type of the pattern to the variable, but it may result in more unification when the variable is used *) (* The "variable" must be either id or id: ty but we have to check that the id is not a constructor. *) val varType = processPattern(var, enterResult, level, true, mkVar, isRec); val patType = processPattern(pattern, enterResult, level, notConst, mkVar, isRec) val () = unify (varType, patType, lex, location, foundNear pat, typeEnv); in varType end | Unit _ => unitType | WildCard _ => mkTypeVar (generalisable, false, false, false) | Parenthesised(p, _) => processPattern(p, enterResult, level, notConst, mkVar, isRec) | _ => (* not a legal pattern *) badType end (* processPattern *) (* val assValues = assignValues level line env; *) and assValues near v = case v of Ident {name, value, expType, location, possible, ...} => let val expValue = lookupValue ("Value or constructor", {lookupVal = #lookupVal env, lookupStruct = #lookupStruct env}, name, giveError (near, lex, location)); (* Set the value and type found. *) val instanceType = instanceType expValue; in (* Include this reference in the list of local references. *) case expValue of Value { references=SOME{localRef, ...}, ...} => localRef := location :: ! localRef | _ => (); (* Include this type in the list of instance types. *) case expValue of Value { instanceTypes=SOME instanceRef, ...} => instanceRef := instanceType :: ! instanceRef | _ => (); expType := instanceType; value := expValue; possible := #allValNames env; instanceType (* Result is the instance type. *) end | Literal{converter, expType, location, ...} => let (* Find out the overloadings on this converter and construct an instance of it. The converters are all functions from string to the result type. *) val instanceType = overloadType(converter, true) val instance = apply(instanceType, stringType, lex, location, foundNear near, typeEnv) in expType := instance; instance end | Applic {f, arg, location, expType, ...} => let (* Apply the function to the argument and return the result. *) val funType = assValues near f; val argType = assValues near arg; (* If this is not a constructor the expression is expansive. We need to unify this with a type-variable with local (non-generalisable) scope to force any type variables to be monomorphic. The reason for this is that if there are polymorphic type variables remaining in identifiers in the next pass we treat the identifier as polymorphic and wrap a function round it. *) val () = if nonExpansive v then () else (unifyTypes (funType, mkTypeVar(level, false, false, false)); ()) (* Test to see if we have a function. *) val fType = case eventual funType of FunctionType {arg, result} => SOME(arg, result) | _ => (* May be a simple type variable. *) let val funResType = mkTypeVar (generalisable, false, false, false) val funArgType = mkTypeVar (generalisable, false, false, false) val fType = mkFunctionType (funArgType, funResType) in case unifyTypes (fType, funType) of NONE => SOME(funArgType, funResType) | SOME _ => ( (* It's not a function. *) typeMismatch("Type error in function application.", valTypeMessage (lex, typeEnv) ("Function:", f, funType), valTypeMessage (lex, typeEnv) ("Argument:", arg, argType), PrettyString "Value being applied does not have a function type", lex, location, foundNear near); NONE ) end in case fType of NONE => badType (* Not a function *) | SOME (fArg, fResult) => ( case unifyTypes (fArg, argType) of NONE => () | SOME report => typeMismatch("Type error in function application.", valTypeMessage (lex, typeEnv) ("Function:", f, funType), valTypeMessage (lex, typeEnv) ("Argument:", arg, argType), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear near); expType := fResult; (* Preserve for browsing. *) fResult ) end | Cond {test, thenpt, elsept, location, ...} => let (* The test must be bool, and the then and else parts must be the same. The result is either of these two once they have been unified. *) val testType = assValues v test; val thenType = assValues v thenpt; val elseType = assValues v elsept; in case unifyTypes(testType, boolType) of NONE => () | SOME report => typeWrong("Condition in if-statement must have type bool.", valTypeMessage (lex, typeEnv) ("If:", test, testType), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear v); case unifyTypes(thenType, elseType) of NONE => thenType (* or equally elseType *) | SOME report => ( typeMismatch("Type mismatch between then-part and else-part.", valTypeMessage (lex, typeEnv) ("Then:", thenpt, thenType), valTypeMessage (lex, typeEnv) ("Else:", elsept, elseType), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear v); badType ) end | TupleTree{fields, expType, ...} => let (* Construct the type obtained by mapping "assignValue" onto each element of the tuple. *) val tupleType = mkProductType (map (assValues near) fields) in expType := tupleType; tupleType end | Labelled {recList, frozen, expType, ...} => let (* Process each item in the list. *) fun labEntryToLabType {name, valOrPat, expType, ...} = let val ty = assValues v valOrPat in expType := ty; {name = name, typeof = ty } end val expressionType = mkLabelled (sortLabels (map labEntryToLabType recList), frozen) (* should always be true *); in expType := expressionType; expressionType end | Selector {typeof, ...} => typeof (* Already made. *) | ValDeclaration {dec, explicit, implicit, ...} => (assValDeclaration (dec, explicit, implicit); badType (* Should never be used. *)) | FunDeclaration fund => (assFunDeclaration fund; badType (* Should never be used. *)) | OpenDec{decs=ptl, variables, structures, typeconstrs, ...} => let (* Go down the list of names opening the structures. *) (* We have to be careful because open A B is not the same as open A; open B if A contains a structure called B. *) (* We accumulate the values so that we can produce debugging information if we need to. Note: we have to be careful if we have the same name in multiple structures. *) val valTable = HashTable.hashMake 10 and typeTable = HashTable.hashMake 10 and structTable = HashTable.hashMake 10 (* First get the structures... *) fun findStructure ({name, location, ...}: structureIdentForm) = Option.map (fn s => (s, location)) (lookupStructure ("Structure", {lookupStruct = #lookupStruct env}, name, giveError (v, lex, location))) val strs = List.mapPartial findStructure ptl (* Value and substructure entries in a structure will generally have "Formal" access which simply gives the offset of the entry within the parent structure. We need to convert these into "Select" entries to capture the address of the base structure. *) fun copyEntries (str as Struct{locations, signat = sigTbl, name=strName, ...}, varLoc) = let val openLocs = (* If we have a declaration location for the structure set this as the structure location. Add in here as the "open location". *) case List.find (fn DeclaredAt _ => true | _ => false) locations of SOME (DeclaredAt loc) => [StructureAt loc, OpenedAt varLoc] | _ => [OpenedAt varLoc] (* Open the structure. Formal entries are turned into Selected entries. *) val _ = COPIER.openSignature (sigTbl, { enterType = fn (name, TypeConstrSet(ty, valConstrs)) => let (* We also have to turn the value constructors into "selected" entries in case we use datatype replication. Unlike with "include" in signatures, there's no guarantee that the constructors will also be part of the value environment. They could have been redefined. *) val newTypeSet = TypeConstrSet(ty, List.map (fn c => mkSelectedVar (c, str, openLocs)) valConstrs) in HashTable.hashSet(typeTable, name, newTypeSet); #enterType env (name, newTypeSet) end, enterStruct = fn (name, strVal) => let val selectedStruct = makeSelectedStruct (strVal, str, openLocs); in HashTable.hashSet(structTable, name, selectedStruct); #enterStruct env (name, selectedStruct) end, enterVal = fn (name, value) => let val selectedVar = mkSelectedVar (value, str, openLocs); in HashTable.hashSet(valTable, name, selectedVar); #enterVal env (name, selectedVar) end }, (* Add the structure we're opening here to the types of the values. The name will be removed in messages if the type constructor is in scope but if it has been redefined we can get an identifiable name. *) strName ^ "."); in () end (* ...then put them into the name space. *) val () = List.app copyEntries strs; in variables := HashTable.fold (fn (_, v, t) => v :: t) [] valTable; structures := HashTable.fold (fn (_, v, t) => v :: t) [] structTable; typeconstrs := HashTable.fold (fn (_, v, t) => v :: t) [] typeTable; badType (* Does not return a type *) end | TypeDeclaration(tlist, _) => let (* This is either a type abbreviation in the core language, in a structure or in a signature or it is a type specification in a signaure. *) fun messFn(name, _, new) = errorNear (lex, true, v, declaredAt(tcLocations new), name ^ " has already been bound in this declaration"); val newEnv = noDuplicates messFn; (* First match all the types on the right-hand sides. *) fun processTypeBody (TypeBind {decType = SOME decType, ...}) = ptAssignTypes(decType, v) | processTypeBody _ = emptyType (* Specification. *) val resTypes = List.map processTypeBody tlist; (* Can now declare the new types. *) fun processType (TypeBind {name, typeVars, isEqtype, nameLoc, tcon=tcRef, ...}, decType) = let (* Construct a type constructor which is an alias of the right-hand side of the declaration. If we are effectively giving a new name to a type constructor we use the same type identifier. This is needed to check "well-formedness" in signatures. *) val props = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] val tcon = if isEmpty decType then (* Type specification *) let val description = { location = nameLoc, name = name, description = "" } in makeTypeConstructor (name, makeTypeId(isEqtype, false, (typeVars, EmptyType), description), props) end else case typeNameRebinding(typeVars, decType) of SOME typeId => makeTypeConstructor (name, typeId, props) | NONE => let val description = { location = nameLoc, name = name, description = "" } in makeTypeConstructor (name, makeTypeId(isEqtype, false, (typeVars, decType), description), props) end in checkForDots (name, lex, nameLoc); (* Must not be qualified *) #enter newEnv (name, tcon); (* Check for duplicates. *) tcRef := TypeConstrSet(tcon, []); #enterType env (name, TypeConstrSet(tcon, [])) (* Put in the surrounding scope. *) end val () = ListPair.app processType (tlist, resTypes); in badType (* Does not return a type *) end | AbsDatatypeDeclaration absData => assAbsData absData | DatatypeReplication{oldType, newType, oldLoc, newLoc, ...} => (* Adds both the type and the constructors to the current environment. *) let (* Look up the type constructor in the environment. *) val oldTypeCons: typeConstrSet = lookupTyp ({lookupType = #lookupType env, lookupStruct = #lookupStruct env}, oldType, giveError (near, lex, oldLoc)) (* Copy the datatype, converting any Formal constructors to Selected. *) local (* If the type name was qualified (e.g. S.t) we need to find the value constructors from the same structure. *) val {first = namePrefix, ...} = splitString oldType; val baseStruct = if namePrefix = "" then NONE else lookupStructure("Structure", {lookupStruct = #lookupStruct env}, namePrefix, giveError (v, lex, oldLoc)) val TypeConstrSet(tcons, tcConstructors) = oldTypeCons val newName = newType val locations = [DeclaredAt newLoc, SequenceNo (newBindingId lex)] (* Create a new constructor with the same unique ID. *) val typeID = tcIdentifier tcons val newTypeCons = makeTypeConstructor(newName, typeID, locations) (* Copy the value constructors. *) fun copyAConstructor(Value{name=cName, typeOf, class, access, ...}) = let (* Copy the types of value constructors replacing occurrences of the old type with the new one. This is not strictly necessary but improves printing. e.g. local datatype X = A | B in datatype Y = datatype X end; A; prints A: Y rather than A: X *) fun copyTypeCons (tcon : typeConstrs) : typeConstrs = if sameTypeId(tcIdentifier tcon, typeID) then newTypeCons else tcon; fun copyTyp (t : types) : types = copyType (t, fn x => x, (* Don't bother with type variables. *) copyTypeCons); val newType = copyTyp typeOf; val newAccess = case (access, baseStruct) of (* If we are opening a structure we must have a base structure and we turn Formal entries into Selected. If we are replicating a datatype within a signature the original constructors will be Formal. *) (Formal addr, SOME base) => Selected{base=base, addr=addr} | (Formal _, NONE) => access | _ => access; (* Probably already a global. *) in Value{name=cName, typeOf=newType, class=class, access=newAccess, locations=locations, references = NONE, instanceTypes=NONE} end in val newValConstrs = map copyAConstructor tcConstructors val newTypeCons = TypeConstrSet(newTypeCons, newValConstrs) end in (* This previously checked that it was a datatype but that's not actually correct. *) (* Enter the value constrs in the environment. *) List.app (fn c => (#enterVal env) (valName c, c)) newValConstrs; (* Add this type constructor to the environment. *) (#enterType env) (newType, newTypeCons); badType (* Does not return a type *) end | (aList as List{elements, location, expType, ...}) => let val elementType = assignList(assValues v, displayParsetree, valTypeMessage) ("Elements in a list have different types.", "Item", ",", location, aList) elements val resType = if isBadType elementType then badType else mkTypeConstruction ("list", tsConstr listConstr, [elementType], [DeclaredAt inBasis]) in expType := resType; resType end | Constraint {value, given, location} => let val valType = assValues near value; val theType = ptAssignTypes(given, v) in (* These must be unifiable. *) case unifyTypes(valType, theType) of NONE => () (* OK. *) | SOME report => typeMismatch("Type mismatch in type constraint.", valTypeMessage (lex, typeEnv) ("Value:", value, valType), PrettyBlock(0, false, [], [ PrettyString "Constraint:", PrettyBreak(1, 0), display(theType, 10000 (* All of it *), typeEnv) ]), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear v); theType end | (aFun as Fn {matches, location, expType, ...}) => (* Must unify the types of each of the alternatives.*) let val resType = assignList(assMatchTree aFun, displayMatch, matchTypeMessage) ("Clauses in fn expression have different types.", "Clause", "|", location, aFun) matches in expType := resType; resType end | Unit _ => unitType | Localdec {decs, body, isLocal, varsInBody, ...} => let (* Local declarations or expressions. *) val newValEnv = searchList(); val newTypeEnv = searchList(); val newStrEnv = searchList(); val newLetDepth = if isLocal then letDepth else letDepth+1; (* The environment for the local declarations. *) val localEnv = { lookupVal = lookupDefault (#lookup newValEnv) (#lookupVal env), lookupType = lookupDefault (#lookup newTypeEnv) (#lookupType env), lookupFix = #lookupFix env, (* This environment is needed if we open a structure which has sub-structures. *) lookupStruct = lookupDefault (#lookup newStrEnv) (#lookupStruct env), lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, lookupTvars = #lookupTvars env, enterVal = #enter newValEnv, enterType = #enter newTypeEnv, (* Fixity has already been dealt with in the parsing process. The only reason we deal with it here is to ensure that declarations are printed in the correct order. We simply need to make sure that local fixity declarations are ignored. *) enterFix = fn _ => (), enterStruct = #enter newStrEnv, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = fn () => (stringsOfSearchList newValEnv () @ #allValNames env ()) }; (* Process the local declarations and discard the result. *) val _ : types = assignSeq(localEnv, newLetDepth, decs, false) (* This is the environment used for the body of the declaration. Declarations are added both to the local environment and to the surrounding scope. *) val bodyEnv = { (* Look-ups come from the local environment *) lookupVal = #lookupVal localEnv, lookupType = #lookupType localEnv, lookupFix = #lookupFix localEnv, lookupStruct = #lookupStruct localEnv, lookupSig = #lookupSig localEnv, lookupFunct = #lookupFunct localEnv, lookupTvars = #lookupTvars localEnv, enterVal = fn (pair as (_, v)) => (varsInBody := v :: ! varsInBody; #enter newValEnv pair; #enterVal env pair), enterType = fn pair => (#enter newTypeEnv pair; #enterType env pair), enterFix = #enterFix env, enterStruct = fn pair => (#enter newStrEnv pair; #enterStruct env pair), enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = #allValNames localEnv }; (* Now the body, returning its result if it is an expression. *) val resType = assignSeq(bodyEnv, newLetDepth, body, not isLocal) in resType end (* LocalDec *) | ExpSeq (ptl, _) => (* A sequence of expressions separated by semicolons. Result is result of last expression. *) assignSeq (env, letDepth, ptl, true) | ExDeclaration(tlist, _) => let fun messFn(name, _, line) = errorNear (lex, true, v, line, name ^ " has already been bound in this declaration"); (* Construct an environment to check for duplicate declarations. Include the declaration location as the value. *) val dupEnv = noDuplicates messFn; fun processException (ExBind {name, previous, ofType, value, nameLoc, ...}) = let (* Fill in any types. If there was no type given the exception has type exn otherwise it has type ty->exn. *) val oldType = case ofType of NONE => exnType | SOME typeof => mkFunctionType(ptAssignTypes(typeof, v), exnType) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] val exValue = case previous of EmptyTree => mkEx (name, oldType, locations) (* Generative binding. *) | Ident {name = prevName, value = prevValue, location, expType, possible, ...} => let (* ex = ex' i.e. a non-generative binding? *) (* Match up the previous exception. *) val prev = lookupValue ("Exception", {lookupVal= #lookupVal env, lookupStruct= #lookupStruct env}, prevName, giveError (v, lex, location)) val excType = valTypeOf prev in (* Check that it is an exception *) case prev of Value{class=Exception, ...} => () | _ => errorNear (lex, true, v, location, "(" ^ prevName ^ ") is not an exception."); prevValue := prev; (* Set the value of the looked-up identifier. *) expType := excType; (* And remember the type. *) possible := #allValNames env; (* The result is an exception with the same type. *) mkEx (name, excType, locations) end | _ => raise InternalError "processException: badly-formed parse-tree" in (* Save this value. *) value := exValue; (* In the check environment *) #enter dupEnv (name, nameLoc); (* Must not be qualified *) checkForDots (name, lex, nameLoc) : unit; (* Must not be "true", "false" etc. *) checkForBuiltIn (name, v, lex, nameLoc, true) : unit; (* Put this exception into the env *) #enterVal env (name, exValue) end val () = List.app processException tlist; in badType end (* ExDeclaration *) | Raise (pt, line) => let val exType = assValues v pt in (* The exception value must have type exn. *) case unifyTypes(exType, exnType) of NONE => () | SOME report => typeWrong("Exception to be raised must have type exn.", valTypeMessage (lex, typeEnv) ("Raise:", pt, exType), unifyErrorReport (lex, typeEnv) report, lex, line, foundNear v); (* Matches anything *) mkTypeVar (generalisable, false, false, false) end | (aHandler as HandleTree {exp, hrules, location, ...}) => let (* If the expression returns type E the handler must be exn -> E *) val expType = assValues aHandler exp; (* Unify the handler with a function from exn -> expType *) val clauses = assignList(assMatchTree aHandler, displayMatch, matchTypeMessage) ("Clauses in handler have different types.", "Clause", "|", location, aHandler) hrules (* The result type of the handlers must match the result type of the expression being handled and the arguments must all have type exn. *) val () = unify (clauses, mkFunctionType (exnType, expType), lex, location, foundNear v, typeEnv); in expType (* Result is expType. *) end | While {test, body, location, ...} => let val testType = assValues v test in (* Test must be bool. Result is unit *) case unifyTypes(testType, boolType) of NONE => () | SOME report => typeWrong("Loop condition of while-expression must have type bool.", valTypeMessage (lex, typeEnv) ("While:", test, testType), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear v); assValues v body; (* Result of body is discarded. *) unitType end | aCase as Case {test, match, location, expType, ...} => let val funType = assignList(assMatchTree aCase, displayMatch, matchTypeMessage) ("Clauses in case have different types.", "Clause", "|", location, aCase) match; val argType = assValues aCase test; (* The matches constitute a function from the test type to the result of the case statement, so we apply the match type to the test. *) val resType = apply (funType, argType, lex, location, foundNear aCase, typeEnv) in expType := resType; resType end | anAndAlso as Andalso {first, second, location} => let (* Both parts must be bool and the result is bool. *) fun mkTupleTree(fields, location) = TupleTree { fields=fields, location=location, expType = ref EmptyType } val pairArgs = mkTupleTree([first, second], location) val argTypes = assValues anAndAlso pairArgs; val boolStarBool = mkProductType[boolType, boolType] val () = case unifyTypes(argTypes, boolStarBool) of NONE => () | SOME report => typeWrong("Arguments of andalso must have type bool*bool.", valTypeMessage (lex, typeEnv) ("Arguments:", pairArgs, argTypes), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear anAndAlso) in boolType end | anOrElse as Orelse {first, second, location} => let (* Both parts must be bool and the result is bool. *) fun mkTupleTree(fields, location) = TupleTree { fields=fields, location=location, expType = ref EmptyType } val pairArgs = mkTupleTree([first, second], location) val argTypes = assValues anOrElse pairArgs; val boolStarBool = mkProductType[boolType, boolType] val () = case unifyTypes(argTypes, boolStarBool) of NONE => () | SOME report => typeWrong("Arguments of orelse must have type bool*bool.", valTypeMessage (lex, typeEnv) ("Arguments:", pairArgs, argTypes), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear anOrElse) in boolType end | Directive { tlist, fix, ... } => ( (* Infix declarations have already been processed by the parser. We include them here merely so that we get all declarations in the correct order. *) List.app (fn name => #enterFix env (name, FixStatus(name, fix))) tlist; badType ) | WildCard _ => (* Should never occur in an expression. *) raise InternalError "assignTypes: wildcard found" | Layered _ => raise InternalError "assignTypes: layered pattern found" | EmptyTree => raise InternalError "assignTypes: emptytree found" | Parenthesised(p, _) => assValues near p (* end of assValues *) and assMatchTree _ (MatchTree {vars, exp, resType, argType, ...}) = let (* A match is a function from the pattern to the expression *) (* Process the pattern looking for variables. *) (* Construct a new environment for the variables. *) fun messFn(name, _, Value{locations, ...}) = errorNear (lex, true, v, declaredAt locations, name ^ " has already been bound in this match"); val newEnv = noDuplicates messFn; val newLevel = level + 1; val decs = processPattern(vars, #enter newEnv, newLevel, false, mkPattVar, false) (* The identifiers declared in the pattern are available in the body of the function. *) val bodyEnv = { lookupVal = lookupDefault (#lookup newEnv) (#lookupVal env), lookupType = #lookupType env, lookupFix = #lookupFix env, lookupStruct = #lookupStruct env, lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, lookupTvars = #lookupTvars env, enterVal = #enterVal env, enterType = #enterType env, enterFix = #enterFix env, enterStruct = #enterStruct env, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = fn () => (stringsOfSearchList newEnv () @ #allValNames env ()) }; (* Now the body. *) val expType = assignValues(newLevel, letDepth, bodyEnv, v, exp); in resType := expType; argType := decs; (* Result is a function from the type of the pattern to the type of the body. This previously generalised the resulting type. Why? *) mkFunctionType (decs, expType) end (* MatchTree *) and assValDeclaration (valdecs: valbind list, explicit, implicit) = (* assignTypes for a val-declaration. *) let val newLevel = level + 1; (* Set the scope of explicit type variables. *) val () = #apply explicit(fn (_, tv) => setTvarLevel (tv, newLevel)); (* For each implicit type variable associated with this value declaration, link it to any type variable with the same name in an outer scope. *) val () = #apply implicit (fn (name, tv) => case #lookupTvars env name of SOME v => linkTypeVars(v, tv) | NONE => setTvarLevel (tv, newLevel)); (* If it isn't there set the level of the type variable. *) (* Construct a new environment for the variables. *) val newEnv = noDuplicates (fn(name, _, Value{locations, ...}) => errorNear (lex, true, v, declaredAt locations, name ^ " has already been bound in this declaration")); (* This environment is those identifiers declared by recursive bindings *) val recEnv = searchList (); (* If this is a recursive declaration we will have to find all the variables declared by the patterns in each binding before we can look at the bodies of the bindings. For simplicity we process the patterns first even if this is not recursive but arrange for the variables to be added to the environment after rather than before processing the bodies. The result of processing the patterns is a list of their types. Each item in the list must be unified with the type of the corresponding body. *) (* Process the patterns. *) local fun doVal (ValBind {dec, isRecursive, variables, ...}) = let fun enterVals(pair as (_, value)) = ( #enter newEnv pair; if isRecursive then #enter recEnv pair else (); variables := value :: ! variables ) val patType = processPattern(dec, enterVals, newLevel, false, mkValVar, isRecursive); in patType end; in val decs = List.map doVal (valdecs) end (* Now the bodies. *) local (* Check that the types match by going down the list of value bindings and the list of types produced from the patterns, and matching corresponding types. *) fun checkTypes (patType, (ValBind {dec, exp, line, isRecursive, ...})) = let val newEnv = { (* If this is recursive we find the recursive names and others in the surrounding scope. *) lookupVal = if isRecursive then lookupDefault (#lookup recEnv) (#lookupVal env) else #lookupVal env, lookupType = #lookupType env, lookupFix = #lookupFix env, lookupStruct = #lookupStruct env, lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, (* Extend the environment of type variables. *) lookupTvars = lookupDefault (#lookup explicit) (lookupDefault (#lookup implicit) (#lookupTvars env)), enterVal = #enterVal env, enterType = #enterType env, enterFix = #enterFix env, enterStruct = #enterStruct env, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = if isRecursive then fn () => (stringsOfSearchList recEnv () @ #allValNames env ()) else #allValNames env } val expType = assignValues(newLevel, letDepth, newEnv, exp, exp); val () = case unifyTypes(patType, expType) of NONE => () (* OK*) | SOME report => typeMismatch("Pattern and expression have incompatible types.", valTypeMessage (lex, typeEnv) ("Pattern:", dec, patType), valTypeMessage (lex, typeEnv) ("Expression:", exp, expType), unifyErrorReport (lex, typeEnv) report, lex, line, foundNear v) (* true if the expression is a possibly-constrained fn-expression. It isn't clear whether a parenthesised expression is allowed here. As often, the definition is informal. On p8 of the ML97 definition it says "exp must be of the form fn match". In ML90 it added "possibly constrained by one or more type expressions". This is such a mess that I'm allowing both contraints and parentheses here. *) fun isConstrainedFn (Constraint {value, ...}) = isConstrainedFn value | isConstrainedFn (Fn _) = true | isConstrainedFn (Parenthesised(p, _)) = isConstrainedFn p | isConstrainedFn _ = false; in (* Must check that the expression is of the form FN match. *) (* N.B. the code generator assumes this is true. *) if isRecursive andalso not (isConstrainedFn exp) then errorNear (lex, true, v, line, "Recursive declaration is not of the form `fn match'") else () end in val () = ListPair.app checkTypes (decs, valdecs) end (* Now allow generalisation on the variables being declared. For imperative type variables we have to know whether the expression is expansive. *) fun allowGen (d, (ValBind {exp, line, ...})) = ( allowGeneralisation (d, newLevel, nonExpansive exp, lex, line, foundNear v, typeEnv) ) (* allowGen *) in ListPair.appEq allowGen (decs, valdecs); (* And declare the new names into the surrounding environment. *) let fun enterDec(s, v as Value{instanceTypes, ...}) = ( valOf instanceTypes := []; (* Remove any recursive references. *) #enterVal env (s, v) ) in #apply newEnv enterDec end end (* assValDeclaration *) and assFunDeclaration {dec=tlist: fvalbind list, explicit, implicit, ...} = (* Assigntypes for a fun-declaration. *) let val funLevel = level + 1; (* Level for function names. *) (* Set the scope of explicit type variables. *) val () = #apply explicit(fn (_, tv) => setTvarLevel (tv, funLevel)); (* For each implicit type variable associated with this value declaration, link it to any type variable with the same name in an outer scope. *) val () = #apply implicit (fn (name, tv) => case #lookupTvars env name of SOME v => linkTypeVars(v, tv) | NONE => setTvarLevel (tv, funLevel)); (* If it isn't there set the level of the type variable. *) (* Construct a new environment for the variables. *) fun msgFn(name, _, Value{locations, ...}) = errorNear (lex, true, v, declaredAt locations, name ^ " has already been bound in this declaration"); val newEnv = noDuplicates msgFn; (* Since this is a recursive declaration we must get the function names first. Because of the way they are parsed they are hidden as applications of the function to one or more patterns. There may be more than one clause in a function binding but each should declare the same function and have the same number of patterns. We need to know the number of patterns and the function name in the third pass so we save them in the function binding. *) local fun findNameAndPatts (FValBind {clauses = (FValClause {dec, line, ...}::_), numOfPatts, functVar, ...}) = let (* Just look at the first clause for the moment. *) val { ident = { name, location, ... }, ... } = dec; (* Declare a new identifier with this name. *) val locations = [DeclaredAt location, SequenceNo (newBindingId lex)] val funVar = mkValVar (name, mkTypeVar (funLevel, false, false, false), locations) val arity = case dec of { args, ...} => List.length args val () = numOfPatts := arity; val () = (* Put the results onto the function binding. *) if arity = 0 then errorNear (lex, true, v, line, "Clausal function does not have any parameters.") else () in (* Must not be qualified *) checkForDots (name, lex, line); (* Must not be "true", "false" etc. but may be "it" *) checkForBuiltIn (name, v, lex, line, false); functVar := funVar; (* Save the variable. *) (* Enter it in the environment. *) #enter newEnv (name, funVar) end | findNameAndPatts _ = raise InternalError "findNameAndPatts: badly-formed parse-tree"; in val () = List.app findNameAndPatts tlist end; local (* Can now process the clausal functions in the environment of the function names and using the information about function name and number of patterns we have saved. *) fun processBinding (fvalBind as FValBind {clauses, functVar=ref functVar, argType, resultType, location, ...}) = let (* Each fun binding in the declaration may consist of several clauses. Each must have the same function name, the same number of patterns and a unifiable type. *) (* The type information is built up from the bottom so that if there are errors we can report them in the most appropriate place. Build a type to be used for the function. This will later be unified with the type that we've already created for the function variable. *) val funType = mkTypeVar(generalisable, false, false, false) fun processClause (clause as FValClause {dec, exp, line, ...}) = let val { ident = ident, args, constraint, ... } = dec fun mkClausal(clauses, location) : fvalbind = FValBind { clauses = clauses, numOfPatts = ref 0, functVar = ref undefinedValue, argType = ref badType, resultType = ref badType, location = location } fun mkFunDeclaration (dec, explicit, implicit, location) : parsetree = FunDeclaration { dec=dec, explicit = explicit, implicit = implicit, location = location } val clauseAsTree: parsetree = (* This clause as a parsetree object for error messages. *) mkFunDeclaration([mkClausal([clause], line)], explicit, implicit, line) val () = (* Set the type. Only in case we look at the export tree. *) #expType ident := valTypeOf functVar fun messFn (name, _, Value{locations, ...}) = errorNear (lex, true, clauseAsTree, declaredAt locations, name ^ " has already been bound in this clause."); (* Construct a new environment for the variables in the patts. *) val varEnv = noDuplicates messFn; val varLevel = funLevel + 1; (* Level for variables. *) (* Process the patterns. *) val argTypeList = List.map (fn arg => processPattern(arg, #enter varEnv, varLevel, false, mkPattVar, false)) args (* This list is used for the type of the helper function. *) val () = argType := (case argTypeList of [] => badType (* error *) | [single] => single | multiple => mkProductType multiple) (* The identifiers declared in the pattern are available in the body of the function. Since it is recursive the function names are also available. *) val bodyEnv = { lookupVal = lookupDefault (#lookup varEnv) (lookupDefault (#lookup newEnv) (#lookupVal env)), lookupType = #lookupType env, lookupFix = #lookupFix env, lookupStruct = #lookupStruct env, lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, (* Extend the environment of type variables. *) lookupTvars = lookupDefault (#lookup explicit) (lookupDefault (#lookup implicit) (#lookupTvars env)), enterVal = #enterVal env, enterType = #enterType env, enterFix = #enterFix env, enterStruct = #enterStruct env, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = fn () => (stringsOfSearchList varEnv () @ stringsOfSearchList newEnv () @ #allValNames env ()) }; (* Now the body. *) val expTyp = assignValues(varLevel, letDepth, bodyEnv, exp, exp); (* Check the expression type against any explicit type constraint. *) (* Return the explicit constraint if possible. For the purposes of type checking this is identical to "expTyp" but if there is a type abbreviation this will be used when printing the result. .e.g type t = int * int; fun f ((x, y):t): t = (y, x); *) val typeOfBody = case constraint of NONE => expTyp | SOME given => let val theType = ptAssignTypes(given, v) in case unifyTypes(expTyp, theType) of NONE => () (* OK. *) | SOME report => typeMismatch("Body of fun binding does not match type constraint.", valTypeMessage (lex, typeEnv) ("Expression:", exp, expTyp), PrettyBlock(0, false, [], [ PrettyString "Constraint:", PrettyBreak(1, 0), display(theType, 10000 (* All *), typeEnv) ]), unifyErrorReport (lex, typeEnv) report, lex, line, foundNear clauseAsTree); theType end (* Remember the result type for the debugger. Actually this assigns the result type for each clause in the fun but they'll all be the same. *) val () = resultType := typeOfBody (* The type of this clause is a function type. *) val clauseType = List.foldr mkFunctionType typeOfBody argTypeList (* Unify this with the type we're using for the other clauses. *) val () = case unifyTypes(clauseType, funType) of NONE => () (* OK. *) | SOME report => typeMismatch("Type of clause does not match the type of previous clauses.", valTypeMessage (lex, typeEnv) ("Clause:", clauseAsTree, clauseType), PrettyBlock(0, false, [], [ PrettyString "Other clauses:", PrettyBreak(1, 0), display(funType, 10000 (* All *), typeEnv) ]), unifyErrorReport (lex, typeEnv) report, lex, line, foundNear clauseAsTree) in (* body of processClause *) () end in (* body of processFun *) List.app processClause clauses; (* If this function makes any recursive references move those references from the local list to the recursive list. In that way if we're looking for whether a function is actually referenced we'll only include it if it's referenced outside or from another referenced function. *) let fun moveRefs(FValBind{functVar=ref(Value{references,...}), ...}) = let val {localRef as ref locals, recursiveRef, ...} = valOf references val callerName = valName functVar (* Name of referring function. *) in recursiveRef := List.map (fn r => (r, callerName)) locals @ !recursiveRef; localRef := [] end in List.app moveRefs tlist end; (* Finally unify the function type with the type of the function variable. If the variable has not yet been used that will simply set its type but if it has been used recursively it may have been given an incompatible type. *) case unifyTypes(funType, valTypeOf functVar) of NONE => () (* OK. *) | SOME report => let fun mkFunDeclaration (dec, explicit, implicit, location) : parsetree = FunDeclaration { dec=dec, explicit = explicit, implicit = implicit, location = location } fun mkIdent (name, loc) : parsetree = Ident { name = name, expType = ref EmptyType, value = ref undefinedValue, location = loc, possible = ref(fn () => []) } val fvalAsTree = mkFunDeclaration([fvalBind], explicit, implicit, location) in typeMismatch("Type of function does not match type of recursive application.", valTypeMessage (lex, typeEnv) ("Function:", fvalAsTree, funType), valTypeMessage (lex, typeEnv) ("Variable:", mkIdent(valName functVar, location), valTypeOf functVar), unifyErrorReport (lex, typeEnv) report, lex, location, foundNear fvalAsTree) end end in val () = List.app processBinding tlist end; in (* Now declare the new names into the surrounding environment, releasing the copy flags on the type variables. All fun bindings are non-expansive. *) List.app (fn(FValBind{ functVar as ref(var as Value{typeOf, locations, name, instanceTypes, ...}), ...}) => ( (* Generalise the types. allowGeneralisation side-effects the type variables, replaces any that can be generalised by general variables. *) allowGeneralisation(typeOf, funLevel, true, lex, declaredAt locations, foundNear v, typeEnv); (* Remove any recursive references. This really isn't right. *) valOf instanceTypes := []; #enterVal env (name, var); functVar := var )) tlist end (* assFunDeclaration *) and assAbsData({typelist=typeList, withtypes, declist, equalityStatus, isAbsType=isAbs, ...}) = let (* A type declaration causes a type to be entered in the type environment, together with some constructors. *) fun messFn (name, _, TypeConstrSet(new, _)) = errorNear (lex, true, v, declaredAt(tcLocations new), name ^ " has already been bound in this declaration"); val localTypeEnv = noDuplicates messFn; (* datatype and abstype declarations are both recursive so we can enter the type names into the environment during a first pass, and then process the value constructors during a second. *) fun enterType(typeConstr, typeName) = ( checkForDots (typeName, lex, declaredAt(tcLocations(tsConstr typeConstr))); (* Must not be qualified *) #enter localTypeEnv (typeName, typeConstr) (* Check for duplicates. *) ); (* Make the type constructors and put them in a list. *) fun enterTcon (DatatypeBind {name, tcon, typeVars, nameLoc, ...}) = let (* Make a new ID. If this is within a let declaration we always make a free ID because it is purely local and can't be exported. *) val description = { location = nameLoc, name = name, description = "" } val arity = length typeVars val newId = if letDepth = 0 then makeTypeId(false, true, (typeVars, EmptyType), description) else makeFreeIdEqUpdate (arity, Local{addr = ref ~1, level = ref baseLevel}, false, description) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] val tc = makeTypeConstructor(name, newId, locations) in tcon := TypeConstrSet(tc, []); enterType(TypeConstrSet(tc, []), name); tc end val listOfTypes = map enterTcon typeList; local fun lookup(s, line) = lookupTyp ({lookupType = lookupDefault(#lookup localTypeEnv) (#lookupType env), lookupStruct = #lookupStruct env}, s, giveError (v, lex, line)) in fun localAssignTypes decType = assignTypes (decType, lookup, lex) end (* First match all the types on the right-hand sides using the datatypes and the existing bindings. *) local fun processType (TypeBind {decType = SOME decType, ...}) = localAssignTypes decType | processType _ = emptyType in val decTypes = List.map processType withtypes end; (* Can now enter the `withtypes'. *) fun enterWithType (TypeBind {name, typeVars, nameLoc, tcon=tcRef, ...}, decType) = let val description = { location = nameLoc, name = name, description = "" } (* Construct a type constructor which is an alias of the right-hand side of the declaration. *) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] val tcon = makeTypeConstructor (name, makeTypeId(false, false, (typeVars, decType), description), locations) val tset = TypeConstrSet(tcon, []) in tcRef := tset; enterType(tset, name); (* Checks for duplicates. *) #enterType env (name, tset) (* Put in the global environment. *) end val () = ListPair.app enterWithType (withtypes, decTypes); (* For the constructors *) fun messFn (name, _, Value{locations, ...}) = errorNear (lex, true, v, declaredAt locations, name ^ " has already been used as a constructor in this type"); val consEnv = noDuplicates messFn; val abstypeEnv = searchList (); (* Now process the types and generate the constructors. *) fun genValueConstrs (DatatypeBind {name, typeVars, constrs, nameLoc, tcon, ...}, typ) = let val numOfConstrs = length constrs; val typeVarsAsTypes = List.map TypeVar typeVars (* The new constructor applied to the type variables (if any) *) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] val resultType = mkTypeConstruction (name, typ, typeVarsAsTypes, locations) (* Sort the constructors by name. This simplifies matching with datatypes in signatures. *) fun leq {constrName=xname: string, ...} {constrName=yname, ...} = xname < yname; val sortedConstrs = quickSort leq constrs; fun processConstr ({constrName=name, constrArg, idLocn, ...}) = let val (constrType, isNullary) = case constrArg of NONE => (resultType, true) | SOME argtype => (mkFunctionType (localAssignTypes argtype, resultType), false) val locations = [DeclaredAt idLocn, SequenceNo (newBindingId lex)] val cons = makeValueConstr (name, constrType, isNullary, numOfConstrs, Local{addr = ref ~1, level = ref baseLevel}, locations) (* Name must not be qualified *) val () = checkForDots (name, lex, idLocn); (* Must not be "true", "false" etc. *) val () = checkForBuiltIn (name, v, lex, idLocn, true) : unit; (* Put into the environment. *) val () = #enter consEnv (name, cons); in cons end (* processConstr *) val tset = TypeConstrSet (typ, List.map processConstr sortedConstrs) in (* If this is an abstype enter the version with the constructors into a local environment and a version without the constructors into the global environment. If it is a datatype enter the version with constructors in the global environment. *) if isAbs then (#enter abstypeEnv (name, tset); #enterType env (name, TypeConstrSet(typ, []))) else #enterType env (name, tset); tcon := tset; tset end (* genValueConstrs *) val listOfTypeSets = ListPair.map genValueConstrs (typeList, listOfTypes); (* Third pass - Check to see if equality testing is allowed for these types. *) val () = computeDatatypeEqualities(listOfTypeSets, sigTypeIdMap); (* If this is a datatype declaration the value constructors should be entered in the surrounding scope, otherwise (abstract type declaration) we evaluate the declarations in an environment containing the value constructors, but the value constructors themselves do not appear in the surrounding scope. *) val () = if not isAbs then #apply consEnv (#enterVal env) else let (* Abstract type *) (* The declarations have to be evaluated in an environment in which the constructors have been declared. When an identifier is looked up it may: (a) be one of these new declarations, or else (b) be a constructor from the type declarations, or else (c) be outside the abstract type declaration. New declarations are entered in the local environment so that they can be found under (a) and in the surrounding environment where they will be available after this declaration. *) val decEnv = let val localEnv = searchList (); fun enterValFn pair = (#enter localEnv pair; #enterVal env pair); val lookupValFn = lookupDefault (#lookup localEnv) (lookupDefault (#lookup consEnv) (#lookupVal env)) fun allValNames () = (stringsOfSearchList localEnv () @ stringsOfSearchList consEnv () @ #allValNames env ()) (* We also have to do something similar with types. This is really only for perverse cases where there is a datatype replication inside the abstype. *) fun enterTypeFn pair = (#enter abstypeEnv pair; #enterType env pair); val lookupTypeFn = lookupDefault (#lookup abstypeEnv) (#lookupType env) in { lookupVal = lookupValFn, lookupType = lookupTypeFn, lookupFix = #lookupFix env, lookupStruct = #lookupStruct env, lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, lookupTvars = #lookupTvars env, enterVal = enterValFn, enterType = enterTypeFn, enterFix = #enterFix env, enterStruct = #enterStruct env, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = allValNames } end; in (* Process the declarations, discarding the result. *) assignSeq (decEnv, letDepth, declist, false); (* Turn off equality outside the with..end block. This is required by the "Abs" function defined in section 4.9 of the ML Definition. We need to record the equality status, though, because we need to reinstate this for code-generation. *) equalityStatus := List.map tcEquality listOfTypes; List.app(fn tc => tcSetEquality (tc, false)) listOfTypes; () end; in badType (* Does not return a type *) end (* assAbsData *) in assValues near v end (* assignValues *); val Env gEnv = env val env = { lookupVal = #lookupVal gEnv, lookupType = #lookupType gEnv, lookupFix = #lookupFix gEnv, lookupStruct = #lookupStruct gEnv, lookupSig = #lookupSig gEnv, lookupFunct = #lookupFunct gEnv, lookupTvars = fn _ => NONE, enterVal = #enterVal gEnv, enterType = #enterType gEnv, enterFix = #enterFix gEnv, enterStruct = #enterStruct gEnv, enterSig = #enterSig gEnv, enterFunct = #enterFunct gEnv, allValNames = #allValNames gEnv }; in assignValues(1, 0, env, v, v) end (* pass2 *); (* Before code-generation perform an extra pass through the tree to remove unnecessary polymorphism. The type-checking computes a most general type for a value, typically a function, but it is frequently used in situations where a less general type would suffice. *) (* Note: if the less general type involves a local datatype this isn't done to avoid a possible bug with datatypes defined after the function. *) fun setLeastGeneralTypes(p: parsetree, _: lexan) = let (* Because of mutual recursion we need to process the set of variables produced by a fun-declaration or a val rec declaration as a group. We also process no-recursive val bindings here for simplicity. *) fun processVariableSet(variables: values list) = let (* Two polymorphic values that are involved in mutual recursion will have the same type variable in both values. When we produce the least general type we have to consider all the types that may be used for those variables. Unfortunately, because of flexible records we need to repeat the unification we did in the previous pass. *) local fun getTypeVarsAndInstance (Value{typeOf, instanceTypes, ...}, vars) = let val instances = ! (valOf instanceTypes) fun getPolyVars typ = let val (copied, tyVars) = generalise typeOf (* Unify the types. If there's an error we return a fresh set of the type variables which gives the most general type. There shouldn't be an error but there is one circumstance at least where we can get an error here. If we have a functor declaration followed by an application of the functor in the same "program" we can set an entry in instanceTypes of a Value used in the functor declaration to an instance in the functor application because the instanceTypes value is inherited into the functor signature if there's no explicit signature. We really need to handle this properly and not inherit the instanceTypes value in that case. Test116 shows this. *) in if isSome(unifyTypes(copied, typ)) then #2 (generalise typeOf) else tyVars (* Return the type vars instantiated to the instance types. *) end (* This returns a list, one entry for each instance, of a list of the type variables for that instance. *) val instanceVarLists = List.map getPolyVars instances (* Transpose that list so we get a list, one entry for each type variable, of all the instance types that are possible. *) fun transpose ([]::_) = [] | transpose (args as _::_) = (List.map hd args) :: transpose (List.map tl args) | transpose [] = [] val instanceVars = transpose instanceVarLists (* Get the original type variables. *) val originalVars = getPolyTypeVars(typeOf, fn _ => NONE) (* Look to see if we already have some of the original vars in the list. If we have we use the same ref for each var and merge the instance types. *) fun mergeVars(ovar, iTypes) = case List.find (fn (tv, _) => sameTv(tv, ovar)) vars of NONE => (ovar, ref iTypes) | SOME(matched as (_, otherRef)) => ( otherRef := iTypes @ ! otherRef; matched) val mergedList = ListPair.map mergeVars (originalVars, instanceVars) @ vars in mergedList end in (* Get a list of the original type variables each with a reference containing the shared list of instance types. *) val typeVarMap = List.foldl getTypeVarsAndInstance [] variables end local fun reduceTypes(tv, ref types) = (* Although tv is a type variable it could occur as the least general type. Unify takes care of that. *) if isSome(unifyTypes(TypeVar tv, leastGeneral(List.map #value types))) then raise InternalError "reduceTypes: Unable to set type vars" else () in val () = List.app reduceTypes typeVarMap end in () end fun leastGenExp(ValDeclaration{dec, ...}) = ( (* Val declarations may be recursive or non-recursive. In the case of recursive declarations we need to handle these in the same way as fun-declarations. *) (* Gather all the variables and process them as a group. There can't be any dependencies between them except for mutual recursion. *) processVariableSet (List.foldl (fn (ValBind{variables=ref variables, ...}, vars) => variables @ vars) [] dec); List.app (fn ValBind{exp, ...} => leastGenExp exp) dec ) | leastGenExp(FunDeclaration{dec, ...}) = ( (* First process the outer declarations. *) processVariableSet(List.map(fn FValBind{functVar=ref var, ...} => var) dec); (* Then process the inner declarations. Setting the outer type may have set the instance types within the bodies. *) let fun processClause(FValClause{exp, ...}) = leastGenExp exp fun processBind(FValBind{clauses, ...}) = List.app processClause clauses in List.app processBind dec end ) | leastGenExp(Localdec{decs, body, ...}) = ( (* Process the body expressions in order but the declarations must be done in reverse order after the body. *) List.app (leastGenExp o #1) body; List.foldr (fn ((p, _), ()) => leastGenExp p) () decs ) | leastGenExp(AbsDatatypeDeclaration { declist, ... }) = (* Declarations in reverse order *) List.foldr (fn ((p, _), ()) => leastGenExp p) () declist (* All the rest of these just involve processing sub-expressions. *) | leastGenExp(Applic{f, arg, ...}) = (leastGenExp f; leastGenExp arg) | leastGenExp(Cond{test, thenpt, elsept, ...}) = (leastGenExp test; leastGenExp thenpt; leastGenExp elsept) | leastGenExp(TupleTree{fields, ...}) = List.app leastGenExp fields | leastGenExp(Constraint{value, ...}) = leastGenExp value | leastGenExp(Fn {matches, ...}) = List.app (fn MatchTree{exp, ...} => leastGenExp exp) matches | leastGenExp(ExpSeq(ptl, _)) = List.app (leastGenExp o #1) ptl | leastGenExp(HandleTree{exp, hrules, ...}) = (leastGenExp exp; List.app (fn MatchTree{exp, ...} => leastGenExp exp) hrules) | leastGenExp(While{test, body, ...}) = (leastGenExp test; leastGenExp body) | leastGenExp(Case{test, match, ...}) = (leastGenExp test; List.app (fn MatchTree{exp, ...} => leastGenExp exp) match) | leastGenExp(Andalso {first, second, ...}) = (leastGenExp first; leastGenExp second) | leastGenExp(Orelse{first, second, ...}) = (leastGenExp first; leastGenExp second) | leastGenExp(Labelled{recList, ...}) = List.app (leastGenExp o #valOrPat) recList | leastGenExp(List{elements, ...}) = List.app leastGenExp elements | leastGenExp(Parenthesised(p, _)) = leastGenExp p | leastGenExp _ = () in leastGenExp p end (* Types that can be shared. *) structure Sharing = struct type lexan = lexan and pretty = pretty and codetree = codetree and codeBinding = codeBinding and types = types and values = values and typeId = typeId and structVals = structVals and typeConstrs= typeConstrs and typeVarForm=typeVarForm and env = env and fixStatus = fixStatus and structureIdentForm = structureIdentForm and typeParsetree = typeParsetree and parsetree = parsetree and valbind = valbind and fvalbind = fvalbind and fvalclause = fvalclause and typebind = typebind and datatypebind=datatypebind and exbind = exbind and labelRecEntry=labelRecEntry and ptProperties = ptProperties and matchtree = matchtree and typeVarMap = typeVarMap and level = level end end (* PARSETREE *); polyml-5.6/mlsource/MLCompiler/ParseTree/TypeCheckParsetreeSig.sml000066400000000000000000000030601265146633400253510ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature TypeCheckParsetreeSig = sig type parsetree type types type typeVarForm type typeId type lexan type env type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type typeIdDescription = { location: location, name: string, description: string } val pass2: parsetree * (bool * bool * (typeVarForm list * types) * typeIdDescription -> typeId) * env * lexan * (int -> bool) -> types val setLeastGeneralTypes: parsetree * lexan -> unit structure Sharing: sig type parsetree = parsetree type types = types type typeVarForm = typeVarForm type typeId = typeId type lexan = lexan type env = env end end; polyml-5.6/mlsource/MLCompiler/ParseTree/ml_bind.ML000066400000000000000000000103761265146633400223050ustar00rootroot00000000000000(* Copyright (c) 2013, 2015 David C.J. Matthews Derived from previous work Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) local structure BaseParseTree = BASE_PARSE_TREE( structure STRUCTVALS = StructVals structure TYPETREE = TypeTree structure DEBUGGER = Debugger ) structure PrintTree = PRINT_PARSETREE( structure BASEPARSETREE = BaseParseTree structure LEX = Lex structure STRUCTVALS = StructVals structure TYPETREE = TypeTree structure VALUEOPS = ValueOps structure PRETTY = Pretty ) structure ExportTree = EXPORT_PARSETREE( structure BASEPARSETREE = BaseParseTree structure PRINTTREE = PrintTree structure LEX = Lex structure STRUCTVALS = StructVals structure EXPORTTREE = ExportTreeStruct structure TYPETREE = TypeTree structure DEBUGGER = Debugger ) structure TypeCheckParsetree = TYPECHECK_PARSETREE ( structure BASEPARSETREE = BaseParseTree structure PRINTTREE = PrintTree structure EXPORTTREE = ExportTree structure LEX = Lex structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure TYPETREE = TypeTree structure VALUEOPS = ValueOps structure UTILITIES = Utilities structure MISC = Misc structure PRETTY = Pretty structure COPIER = CopierStruct structure PRINTTABLE = PrintTable structure DATATYPEREP = DatatypeRep ) structure MatchCompiler = MATCH_COMPILER( structure BASEPARSETREE = BaseParseTree structure PRINTTREE = PrintTree structure LEX = Lex structure CODETREE = CodeTree structure DEBUGGER = Debugger structure TYPETREE = TypeTree structure TYPEIDCODE = TypeIDCodeStruct structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure DATATYPEREP = DatatypeRep structure DEBUG = Debug structure MISC = Misc structure ADDRESS = Address ) structure CodeGenParseTree = CODEGEN_PARSETREE( structure BASEPARSETREE = BaseParseTree structure PRINTTREE = PrintTree structure EXPORTTREE = ExportTree structure MATCHCOMPILER = MatchCompiler structure LEX = Lex structure CODETREE = CodeTree structure DEBUGGER = Debugger structure TYPETREE = TypeTree structure TYPEIDCODE = TypeIDCodeStruct structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure DATATYPEREP = DatatypeRep structure DEBUG = Debug structure MISC = Misc structure ADDRESS = Address ) in structure ParseTree = PARSE_TREE ( structure BASEPARSETREE = BaseParseTree structure PRINTTREE = PrintTree structure EXPORTTREE = ExportTree structure CODEGENPARSETREE = CodeGenParseTree structure TYPECHECKTREE = TypeCheckParsetree structure LEX = Lex structure STRUCTVALS = StructVals structure TYPETREE = TypeTree ) end; polyml-5.6/mlsource/MLCompiler/ParseType.ML000066400000000000000000000021241265146633400207130ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ParseType = PARSE_TYPE ( structure LEX = Lex structure SYMSET = SymSet structure SKIPS = Skips structure TYPETREE = TypeTree structure SYMBOLS = Symbols structure UTILITIES = Utilities ) ; polyml-5.6/mlsource/MLCompiler/Pretty.sml000066400000000000000000000301751265146633400205600ustar00rootroot00000000000000(* Copyright (c) 2009 David C.J. Matthews 2008, 2013, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Pretty:> PRETTYSIG = struct (* abstype context = AbsContextLocation of { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } | AbsContextProperty of string * string (* User property. *) and pretty = AbsPrettyBlock of int * bool * context list * pretty list | AbsPrettyBreak of int * int | AbsPrettyString of string | AbsPrettyStringAndWidth of string * int | AbsPrettyLineBreak with val ContextLocation = AbsContextLocation and ContextProperty = AbsContextProperty val PrettyBlock = AbsPrettyBlock and PrettyBreak = AbsPrettyBreak and PrettyString = AbsPrettyString fun isPrettyBlock(AbsPrettyBlock _) = true | isPrettyBlock _ = false and isPrettyBreak(AbsPrettyBreak _) = true | isPrettyBreak _ = false and isPrettyString(AbsPrettyString _) = true | isPrettyString _ = false fun projPrettyBlock(AbsPrettyBlock b) = b | projPrettyBlock _ = raise Match and projPrettyBreak(AbsPrettyBreak b) = b | projPrettyBreak _ = raise Match and projPrettyString(AbsPrettyString b) = b | projPrettyString _ = raise Match end;*) (* This is complicated because the data structures we use here will be exported into the code produced by the compiler. We can't assume that the same representations will be used by this version of the compiler as are used by the compiler that is compiling this code. We use an explicit representation here which must be kept in synch with the representation used in DATATYPE_REP.ML *) local open Address fun cast p = toAddress(toMachineWord p) in type context = address type loc = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } (* Because the argument tuple has more than 4 fields the address is used rather than copying the fields. *) fun ContextLocation(p: loc): context = cast(0w0, p) and ContextProperty(s1: string, s2: string): context = cast(0w1, s1, s2) end local open Address fun cast p = toAddress(toMachineWord p) in type pretty = address val tagPrettyBlock = 0w0 and tagPrettyBreak = 0w1 (*and tagPrettyLineBreak = 0w2*) (* Not used in the compiler. *) and tagPrettyString = 0w3 (*and tagPrettyStringWithWidth = 0w4*) (* Not used in the compiler. *) val maxPrettyTag = 0w4 (* Exported because it is used in TagTest. *) fun PrettyBlock(offset: int, consistent: bool, context: context list, items: pretty list): pretty = cast(tagPrettyBlock, offset, consistent, context, items) and PrettyBreak(breaks: int, offset: int): pretty = cast(tagPrettyBreak, breaks, offset) and PrettyString(s: string): pretty = cast(tagPrettyString, s) fun isPrettyBlock p = toShort(loadWord(p, 0w0)) = tagPrettyBlock and isPrettyBreak p = toShort(loadWord(p, 0w0)) = tagPrettyBreak and isPrettyString p = toShort(loadWord(p, 0w0)) = tagPrettyString fun projPrettyBlock p = if isPrettyBlock p then let val (_: int, offset: int, consistent: bool, context: context list, items: pretty list) = RunCall.unsafeCast p in (offset, consistent, context, items) end else raise Match and projPrettyBreak p = if isPrettyBreak p then let val (_: int, breaks: int, offset: int) = RunCall.unsafeCast p in (breaks, offset) end else raise Match and projPrettyString p = if isPrettyString p then let val (_: int, s: string) = RunCall.unsafeCast p in s end else raise Match end fun uglyPrint p = if isPrettyBlock p then String.concat(map uglyPrint(#4 (projPrettyBlock p))) else if isPrettyBreak p then String.implode(List.tabulate(#1 (projPrettyBreak p), fn _ => #" ")) else projPrettyString p (* Pretty printer copied directly from basis/PrettyPrinter. We can't use the same code because the "pretty" type is not the same. *) fun prettyPrint (stream : string -> unit, lineWidth : int) (pretty: pretty): unit = let fun printBlanks n = if n > 0 then (stream " "; printBlanks(n-1)) else () (* Find out whether the block fits and return the space left if it does. Terminates with NONE as soon as it finds the line doesn't fit. *) fun getSize(p, spaceLeft) = if isPrettyBlock p then let val (_, _, _, entries) = projPrettyBlock p in List.foldl(fn (p, SOME s) => getSize(p, s) | (_, NONE) => NONE) (SOME spaceLeft) entries end else if isPrettyBreak p then let val (blanks, _) = projPrettyBreak p in if blanks <= spaceLeft then SOME(spaceLeft-blanks) else NONE end else let val size = String.size (projPrettyString p) in if size <= spaceLeft then SOME(spaceLeft-size) else NONE end (* Lay out the block and return the space that is left after the line has been printed. *) fun layOut (p, indent, spaceLeft) = if isPrettyBlock p then let val (blockOffset, consistent, _, entries) = projPrettyBlock p val blockIndent = indent+blockOffset in case getSize(p, spaceLeft) of SOME s => (* Fits *) ( (* Lay out the contents. This will not need to break. *) List.foldl(fn(p, space) => layOut(p, blockIndent, space)) spaceLeft entries; s ) | NONE => (* Doesn't fit - break line somewhere. *) let (* Lay out this block, breaking where necessary. *) fun doPrint([], left) = (* Finished: return what's left. *) left | doPrint(hd :: rest, left) = if isPrettyBreak hd then if null rest then left (* Ignore trailing breaks. *) else let val (blanks, breakOffset) = projPrettyBreak hd (* Compute the space of the next item(s) up to the end or the next space. Since we only break at spaces if there are Blocks or Strings without spaces between we need to know the total size. *) fun getsp([], left) = SOME left | getsp(next::rest, left) = if isPrettyBreak next then SOME left else case getSize(next, left) of NONE => NONE | SOME sp => getsp(rest, sp) in if consistent orelse left <= blanks orelse not(isSome(getsp(rest, left-blanks))) then (* Either a consistent break or the next item won't fit. *) ( stream "\n"; printBlanks(blockIndent+breakOffset); doPrint(rest, lineWidth-blockIndent-breakOffset) ) else (* We don't need to break here. *) ( printBlanks blanks; doPrint(rest, left-blanks) ) end else if isPrettyString hd then let val s = projPrettyString hd in stream s; doPrint(rest, left-size s) end else (* Block *) doPrint(rest, layOut(hd, blockIndent, left)) val onLine = doPrint(entries, spaceLeft); in onLine end end else if isPrettyBreak p then let val (blanks, _) = projPrettyBreak p in printBlanks blanks; Int.max(spaceLeft-blanks, 0) end else let val st = projPrettyString p in stream st; Int.max(spaceLeft-String.size st, 0) end in if layOut(pretty, 0, lineWidth) <> lineWidth then stream "\n" (* End the line unless we haven't written anything. *) else () end local open Universal in (* Tag for pretty printed out from PolyML.print. *) val printOutputTag : (pretty -> unit) tag = tag() (* Compiler output. Used for timing information and compiler debug output. *) and compilerOutputTag: (pretty->unit) tag = tag() end local open Universal fun getTag (t: (pretty -> unit) tag) (tagList: universal list) : pretty -> unit = case List.find (tagIs t) tagList of SOME a => tagProject t a | NONE => fn _ => () (* Use the default *) in val getPrintOutput = getTag printOutputTag and getCompilerOutput = getTag compilerOutputTag (* The low-level code-generators print strings a bit at a time and separate the lines with new-line characters. This provides a simple string printer for backwards compatibility. *) fun getSimplePrinter parameters = let val compilerOut: pretty -> unit = getTag compilerOutputTag parameters val buff = ref "" fun printStream (s: string) = let (* If there's a newline split there. *) val (a, b) = Substring.splitl(fn #"\n" => false | _ => true) (Substring.full(!buff ^ s)) in if Substring.size b = 0 (* No newline. *) then buff := Substring.string a else ( compilerOut(PrettyString(Substring.string a)); buff := ""; printStream(Substring.string(Substring.slice(b, 1, NONE))) ) end in printStream end end (* Types that can be shared. *) structure Sharing = struct type pretty = pretty and context = context end end; polyml-5.6/mlsource/MLCompiler/PrintTable.ML000066400000000000000000000017511265146633400210500ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure PrintTable = PRINT_TABLE ( structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure PRETTY = Pretty ); polyml-5.6/mlsource/MLCompiler/SIGNATURES.sml000066400000000000000000002047421265146633400207600ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2009 Largely extracted from STRUCTURES_.ML Copyright (c) 2000 Cambridge University Technical Services Limited Modified D.C.J. Matthews 2001-2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Module Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor SIGNATURES ( structure LEX : LEXSIG structure STRUCTVALS : STRUCTVALSIG; structure EXPORTTREE: EXPORTTREESIG structure PRETTY : PRETTYSIG structure COPIER: COPIERSIG structure TYPETREE : TYPETREESIG structure PARSETREE : PARSETREESIG structure VALUEOPS : VALUEOPSSIG; structure UNIVERSALTABLE: sig type universal = Universal.universal type univTable type 'a tag = 'a Universal.tag val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; val univFold: univTable * (string * universal * 'a -> 'a) * 'a -> 'a; end; structure DEBUG: DEBUGSIG structure UTILITIES : sig val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; end; sharing LEX.Sharing = TYPETREE.Sharing = PARSETREE.Sharing = PRETTY.Sharing = EXPORTTREE.Sharing = STRUCTVALS.Sharing = COPIER.Sharing = VALUEOPS.Sharing = UNIVERSALTABLE ) : SIGNATURESSIG = struct open Misc (* Open this first because it contains Value. *) open LEX STRUCTVALS EXPORTTREE PRETTY COPIER TYPETREE PARSETREE UNIVERSALTABLE DEBUG open VALUEOPS UTILITIES Universal datatype sigs = SignatureIdent of string * location * locationProp list ref (* A signature name *) | SigDec of specs list * location (* sig ... end *) | WhereType of whereTypeStruct (* type realisation. *) and specs = StructureSig of structSigBind list * location | ValSig of (* Signature of a value. *) { name: string * location, typeof: typeParsetree, line: location } | ExSig of (* Signature of an exception. May be a nullary exception. *) { name: string * location, typeof: typeParsetree option, line: location } | CoreType of (* Any other decln. *) { dec: parsetree, (* The value *) location: location } | Sharing of shareConstraint (* Sharing constraints. *) | IncludeSig of sigs list * location (* Include. *) withtype shareConstraint = { isType: bool, shares: (string * location) list, line: location } and structSigBind = { name: string, (* The name of the structure *) nameLoc: location, sigStruct: sigs * bool * location, line: location } and whereTypeStruct = { sigExp: sigs, typeVars: typeVarForm list, typeName: string, realisation: typeParsetree, line: location } fun mkSigIdent(name, nameLoc) = SignatureIdent(name, nameLoc, ref []) fun mkCoreType (dec, location) = CoreType { dec = dec, location = location }; fun mkValSig (nameLoc, typeof, line) = ValSig { name = nameLoc, typeof = typeof, line = line }; fun mkExSig (nameLoc, typeof, line) = ExSig { name = nameLoc, typeof = typeof, line = line }; fun mkSharing (isType, shares, line) = Sharing { isType = isType, shares = shares, line = line }; fun mkWhereType (sigexp, typeVars, name, types, line) = WhereType { sigExp = sigexp, typeVars = typeVars, typeName = name, realisation = types, line = line }; val mkInclude = IncludeSig and mkStructureSig = StructureSig and mkSig = SigDec fun mkStructureSigBinding ((name, nameLoc), signat, fullLoc):structSigBind = { name = name, nameLoc = nameLoc, sigStruct = signat, line = fullLoc } (* Make a signature for initialisating variables and for undeclared signature variables. *) val undefinedSignature = makeSignature("", makeSignatureTable(), 0, [], fn _ => raise Subscript, []); (* We use a name that isn't otherwise valid for a signature. *) fun isUndefinedSignature(Signatures{name, ...}) = name = "" fun displayList ([], _, _) _ = [] | displayList ([v], _, depth) dodisplay = if depth <= 0 then [PrettyString "..."] else [dodisplay (v, depth)] | displayList (v::vs, separator, depth) dodisplay = if depth <= 0 then [PrettyString "..."] else let val brk = if separator = "," orelse separator = ";" then 0 else 1 in PrettyBlock (0, false, [], [ dodisplay (v, depth), PrettyBreak (brk, 0), PrettyString separator ] ) :: PrettyBreak (1, 0) :: displayList (vs, separator, depth - 1) dodisplay end (* displayList *) fun displaySigs (str, depth) = if depth <= 0 (* elide further text. *) then PrettyString "..." else case str of SignatureIdent (name : string, _, _) => PrettyString name | SigDec (structList : specs list, _) => PrettyBlock (0, true, [], PrettyString "sig" :: PrettyBreak (1, 0) :: displayList (structList, "", depth) displaySpecs @ [ PrettyBreak (1, 0), PrettyString "end"] ) | WhereType { sigExp, typeVars, typeName, realisation, ... } => PrettyBlock (3, false, [], displaySigs (sigExp, depth) :: PrettyBreak (1, 0) :: PrettyString "where" :: PrettyBreak (1, 0) :: PrettyString "type" :: PrettyBreak (1, 0) :: displayTypeVariables (typeVars, depth) @ [ PrettyString typeName, PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayTypeParse (realisation, depth - 1, emptyTypeEnv) ] ) and displaySpecs (specs, depth) = if depth <= 0 (* elide further text. *) then PrettyString "..." else case specs of StructureSig (structList : structSigBind list, _) => let fun displaySigsBind ( {name, sigStruct=(sigStruct, opaque, _), ...}: structSigBind, depth) = PrettyBlock (3, false, [], [ PrettyString name, PrettyString (if opaque then " :>" else " :"), PrettyBreak (1, 0), displaySigs (sigStruct, depth - 1) ] ) in PrettyBlock (3, false, [], PrettyString "structure" :: PrettyBreak (1, 0) :: displayList (structList, "and", depth) displaySigsBind ) end | ValSig {name = (name, _), typeof, ...} => PrettyBlock (0, false, [], [ PrettyString "val", PrettyBreak (1, 1), PrettyString (name ^ " :"), PrettyBreak (1, 0), displayTypeParse (typeof, depth - 1, emptyTypeEnv) ] ) | ExSig {name = (name, _), typeof = NONE, ...} => PrettyBlock (0, false, [], [ PrettyString "exception", PrettyBreak (1, 1), PrettyString (name) ] ) | ExSig {name = (name, _), typeof = SOME typeof, ...} => PrettyBlock (0, false, [], [ PrettyString "exception", PrettyBreak (1, 1), PrettyString (name ^ " :"), PrettyBreak (1, 0), displayTypeParse (typeof, depth - 1, emptyTypeEnv) ] ) | Sharing { isType, shares, ... } => PrettyBlock (3, false, [], PrettyString "sharing" :: PrettyBreak (1, 0) :: ( if not isType then [] else [ PrettyString "type", PrettyBreak (1, 0) ] ) @ displayList (shares, "=", depth) (fn ((name, _), _) => PrettyString name) ) | IncludeSig (structList : sigs list, _) => PrettyBlock (3, true, [], PrettyString "include" :: PrettyBreak (1, 0) :: displayList (structList, "", depth - 1) displaySigs ) | CoreType {dec, ...} => displayParsetree (dec, depth - 1) (* End displaySigs *) fun sigExportTree(navigation, s: sigs) = let (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => displaySigs(s, d)) :: exportNavigationProps navigation fun asParent () = sigExportTree(navigation, s) in case s of SignatureIdent(_, loc, ref decLocs) => (loc, mapLocationProps decLocs @ commonProps) | SigDec(structList, location) => (location, exportList(specExportTree, SOME asParent) structList @ commonProps) | WhereType _ => (nullLocation, commonProps) end and specExportTree(navigation, s: specs) = let (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => displaySpecs(s, d)) :: exportNavigationProps navigation fun asParent () = specExportTree(navigation, s) in case s of StructureSig(sbl, location) => let fun exportSB(navigation, sb as {name, nameLoc, sigStruct=(theSig, _, _), line, ...}) = let fun exportThis () = exportSB(navigation, sb) fun getName () = getStringAsTree({parent=SOME exportThis, previous=NONE, next=SOME getSigStruct}, name, nameLoc, []) and getSigStruct () = sigExportTree({parent=SOME exportThis, previous=SOME getName, next=NONE}, theSig) in (line, PTfirstChild getName :: exportNavigationProps navigation) end val expChild = exportList(exportSB, SOME asParent) sbl in (location, expChild @ commonProps) end | ValSig{name=(name, nameLoc), typeof, line, ...} => let (* The first position is the value name, the second the type. *) (* TODO: Include the actual type as PTtype? *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=SOME getType}, name, nameLoc, []) and getType () = typeExportTree({parent=SOME asParent, previous=SOME getName, next=NONE}, typeof) in (line, PTfirstChild getName :: commonProps) end | ExSig{name=(name, nameLoc), typeof = NONE, line, ...} => let (* The first position is the value name, the second the type. *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=NONE}, name, nameLoc, []) in (line, PTfirstChild getName :: commonProps) end | ExSig{name=(name, nameLoc), typeof = SOME typeof, line, ...} => let (* The first position is the value name, the second the type. *) (* TODO: Include the actual type as PTtype? *) fun getName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=SOME getType}, name, nameLoc, []) and getType () = typeExportTree({parent=SOME asParent, previous=SOME getName, next=NONE}, typeof) in (line, PTfirstChild getName :: commonProps) end | CoreType {dec, ...} => (* A value parse-tree entry. *) getExportTree(navigation, dec) | Sharing _ => (nullLocation, commonProps) | IncludeSig (sigs, loc) => (loc, exportList(sigExportTree, SOME asParent) sigs @ commonProps) end (* Puts out an error message and then prints the piece of tree. *) fun errorMsgNear (lex, hard, near, lno, message) : unit = let val parameters = debugParams lex val errorDepth = getParameter errorDepthTag parameters in reportError lex { hard = hard, location = lno, message = message, context = SOME(near errorDepth) } end fun errorNear(lex, hard, near, lno, message: string) = errorMsgNear (lex, hard, near, lno, PrettyBlock (0, false, [], [PrettyString message])) fun giveError (sVal : sigs, lno : LEX.location, lex : lexan) : string -> unit = fn (message : string) => errorNear (lex, true, fn n => displaySigs(sVal, n), lno, message) and giveSpecError(sVal : specs, lno : LEX.location, lex : lexan) : string -> unit = fn (message : string) => errorNear (lex, true, fn n => displaySpecs(sVal, n), lno, message); val makeEnv = fn x => let val Env e = makeEnv x in e end; fun printId(TypeId{description, ...}) = printDesc description and printDesc{ location: location, name: string, description = "" } = PrettyBlock(0, false, [ContextLocation location], [PrettyString name]) | printDesc{ location: location, name: string, description: string } = PrettyBlock(0, false, [ContextLocation location], [PrettyString name, PrettyBreak(1, 0), PrettyString ("(*" ^ description ^ "*)")]) (* Formal paramater to a functor - either value or exception. *) fun mkFormal (name : string, class, typ, addr, locations) = Value{class=class, name=name, typeOf=typ, access=Formal addr, locations=locations, references = NONE, instanceTypes=NONE} (* Get the value from a signature-returning expression (either the name of a signature or sig ... end. The type IDs in the signature are bound names. *) fun sigVal(str : sigs, initTypeId : int, outerTypeIdEnv: int->typeId, Env globalEnv : env, lex, lno : LEX.location ) : signatures = let datatype varId = SharedWith of int (* Index of shared ID, always less than current index. *) | VariableSlot of { boundId: typeId, descriptions: string list } | FreeSlot of typeId (* Bound to a Free type ID. *) | Unset val idCount = ref initTypeId val mapArray = StretchArray.stretchArray(10 (* Guess initial size. *), Unset) val sourceArray = StretchArray.stretchArray(10 (* Guess initial size. *), NONE) fun makeVariableId(arity, isEq, isDt, requireUpdate, { location, name, description }, structPath) = let val fullName = structPath^name val descr = { location=location, name=fullName, description=description} (* Make a new bound ID after any existing ones. *) val newIdNumber = !idCount before (idCount := !idCount+1) val newId = (if requireUpdate then makeBoundIdWithEqUpdate else makeBoundId) (arity, Formal 0 (* Not used. *), newIdNumber, isEq, isDt, descr) (* Enter a variable entry in the array. *) val arrayEntry = VariableSlot{ boundId=newId, descriptions = [fullName] } val () = StretchArray.update(mapArray, newIdNumber-initTypeId, arrayEntry) val () = StretchArray.update(sourceArray, newIdNumber-initTypeId, SOME newId) in newId end (* Follow a chain of shared IDs. This should terminate because we always point down the array. *) fun realId n = case StretchArray.sub(mapArray, n) of SharedWith m => if m >= n then raise InternalError "realId: Sharing loop" else realId m | id => id fun isVariableId(TypeId{idKind=Bound{offset, ...}, ...}) = if offset < initTypeId then false (* Outside the signature. *) else ( case realId(offset-initTypeId) of VariableSlot _ => true | FreeSlot _ => false | _ => raise InternalError "isVar" ) | isVariableId _ (* Free or TypeFunction *) = false (* The internal type ID map after mapping to the internal Bound IDs but before the application of any "where types" or sharing. *) fun typeIdEnv () = let val v = Vector.tabulate(!idCount-initTypeId, fn n => valOf(StretchArray.sub(sourceArray, n))) in fn n => if n < initTypeId then outerTypeIdEnv n else Vector.sub(v, n-initTypeId) end fun linkFlexibleTypeIds(typeId1, typeId2) = (* Link together and share two IDs. The result is an equality type if either was an equality type and a datatype if either was a datatype. *) case (typeId1, typeId2) of (TypeId{idKind=Bound{offset=offset1, ...}, ...}, TypeId{idKind=Bound{offset=offset2, ...}, ...}) => ( case (realId(offset1-initTypeId), realId(offset2-initTypeId)) of (VariableSlot{descriptions = desc1, boundId=TypeId{ idKind=Bound{eqType=eqType1, offset=off1, isDatatype=isDatatype1, arity=arity1, ...}, description, ...}}, VariableSlot{descriptions = desc2, boundId=TypeId{ idKind=Bound{eqType=eqType2, offset=off2, isDatatype=isDatatype2, arity=arity2, ...}, ...}}) => if off1 = off2 then () (* They may already share. *) else let val resOffset = Int.min(off1, off2) val setOffset = Int.max(off1, off2) val isDatatype = isDatatype1 orelse isDatatype2 val _ = arity1 = arity2 orelse raise InternalError "linkFlexibleTypeIds: different arities" val newId = makeBoundId(arity1, Formal 0, resOffset, pling eqType1 orelse pling eqType2, isDatatype, description (* Not used *)) val newEntry = VariableSlot{ boundId=newId, descriptions = desc1 @ desc2 } in StretchArray.update(mapArray, resOffset-initTypeId, newEntry); StretchArray.update(mapArray, setOffset-initTypeId, SharedWith(resOffset-initTypeId)) end | _ => raise InternalError "linkFlexibleTypeIds: not variable" ) | _ => raise InternalError "linkFlexibleTypeIds: not bound" local (* Sharing *) fun shareTypes(typeA as TypeConstrSet(constrA, _), aPath, aMap, typeB as TypeConstrSet(constrB, _), bPath, bMap, lno, nearStruct) = let fun cantShare reason = let fun showTypeCons(TypeConstrSet(t, _), p) = let val context = case List.find(fn DeclaredAt _ => true | _ => false) (tcLocations t) of SOME(DeclaredAt loc) => [ContextLocation loc] | _ => [] in PrettyBlock(0, false, context, [PrettyString(p ^ tcName t)]) end in errorMsgNear (lex, true, fn n => displaySigs(nearStruct, n), lno, PrettyBlock(3, false, [], [ PrettyString "Cannot share type", PrettyBreak(1, 2), showTypeCons(typeA, aPath), PrettyBreak(1, 0), PrettyString "with type", PrettyBreak(1, 0), showTypeCons(typeB, bPath), PrettyBreak(0, 0), PrettyString ".", PrettyBreak(1, 0), reason ])) end fun alreadyBound(path, typeName, tcId) = cantShare ( PrettyBlock(3, false, [], [ PrettyString(path ^ typeName), PrettyBreak(1, 0), PrettyString "is already defined as", PrettyBreak(1, 0), printId tcId ])) in if isUndefinedTypeConstr constrA orelse isUndefinedTypeConstr constrB then () else if tcArity constrA <> tcArity constrB (* Check arity. *) then cantShare(PrettyString "The type constructors take different numbers of arguments.") else let fun mapId (map, TypeId{idKind=Bound{offset, ...}, ...}) = map offset | mapId (_, id) = id val aId = mapId(aMap, tcIdentifier constrA) and bId = mapId(bMap, tcIdentifier constrB) in (* The type constructors are only looked up in the signature but they already may be set to another type through a "where type" or they may have been created with Free IDs through type t=s declarations. This could be a free identifier or a type function. *) if not (isVariableId aId) then alreadyBound(aPath, tcName constrA, aId) else if not (isVariableId bId) then alreadyBound(bPath, tcName constrB, bId) else linkFlexibleTypeIds(aId, bId) end end (* shareTypes *); (* Find all the structures and type constructors in one structure. *) fun structsAndTypes((Struct{signat=Signatures { tab, typeIdMap, ... }, ...}, path, oldMap), start) = let val newMap = composeMaps(typeIdMap, oldMap) fun get(name, dVal, (ts, ss)) = if tagIs structVar dVal then (ts, (name, (tagProject structVar dVal, path ^ name ^ ".", newMap)) :: ss) else if tagIs typeConstrVar dVal then ((name, (tagProject typeConstrVar dVal, path, newMap)) :: ts, ss) else (ts, ss) in univFold (tab, get, start) end (* Get all the structures and type constructors in a list of structures. *) fun allStructsAndTypes structs = List.foldl structsAndTypes ([], []) structs (* Turn a list of names and structures/types into a list of lists. Each entry in the result list is all those structures/types with the same name. *) fun getMatchedEntries entries = let (* Sort the items so that items with the same name are brought together. A signature is not allowed to have items of the same kind with the same name so this means that we are bringing together items from different structures. Then filter the result to produce sets of items with the same name. Discard singletons in the result. *) val sortedEntries = quickSort (fn (s1, _) => fn (s2, _) => s1 <= s2) entries (* *) fun getEquals([], _, [], res) = res (* End of empty list. *) | getEquals([], _, [_], res) = res (* Last item was singleton: discard *) | getEquals([], _, acc, res) = acc :: res (* Return last item. *) | getEquals((s, t) :: r, a: string, acc, res) = if a = s then getEquals(r, a, t :: acc, res) (* Same name as last item. *) else case acc of (* Different from last item: *) [] => getEquals(r, s, [t], res) (* No previous item. *) | [_] => getEquals(r, s, [t], res) (* Last was singleton: discard. *) | acc => getEquals(r, s, [t], acc :: res) in getEquals(sortedEntries, "", [], []) end (* Recursively apply the sharing constraints to corresponding types in a list of structures. *) fun structureSharing(structs, line, near) = let fun shareStructs structs = let val (allTypes, allSubstructs) = allStructsAndTypes structs (* Get the lists of structures and types to share. *) val matchedTypes = getMatchedEntries allTypes val matchedStructs = getMatchedEntries allSubstructs in List.app(fn types => (* Share types. *) case types of [] => raise List.Empty | (hd, hdName, hdMap) :: tl => (* Share the rest of the list with the first item. *) List.app(fn (t, tName, tMap) => shareTypes(hd, hdName, hdMap, t, tName, tMap, line, near)) tl) matchedTypes; List.app shareStructs matchedStructs (* Recursively share sub-structures. *) end in shareStructs(List.map(fn (s as Struct{name=sName, ...}) => (s, sName ^ ".", typeIdEnv())) structs) end in (* Process a sharing constraint. *) fun applySharingConstraint({shares, isType, line}, Env tEnv, near) : unit = let (* When looking up the structure and type names we look only in the signature in ML97. We add this to make it clear that we are only looking up in the signature otherwise we get confusing messages such as "type (int) has not been declared". *) fun lookupFailure locn msg = giveError (str, locn, lex) (msg ^ " in signature.") in if isType then let (* Type sharing. *) fun lookupSharing (name, locn) = lookupTyp ({ lookupType = #lookupType tEnv, lookupStruct = #lookupStruct tEnv }, name, lookupFailure locn) in case shares of nil => raise Empty | hd :: tl => let val first = lookupSharing hd in if isUndefinedTypeConstr(tsConstr first) then () else List.app (fn typ => shareTypes (lookupSharing typ, "", typeIdEnv(), first, "", typeIdEnv(), line, near)) tl end end else let (* structure sharing. *) fun getStruct(name, locn) = lookupStructureAsSignature (#lookupStruct tEnv, name, lookupFailure locn) in (* Now share all these signatures. *) structureSharing(List.mapPartial getStruct shares, line, near) end end (* applySharingConstraint *) end (* Sharing *) (* Look up a signature. Signatures can only be in the global environment. *) fun lookSig (name : string, lno : LEX.location) : signatures = case #lookupSig globalEnv name of SOME v => v | NONE => ( giveError (str, lno, lex)("Signature (" ^ name ^ ") has not been declared"); undefinedSignature ) (* Construct a signature. All the type IDs within the signature are variables. *) fun sigValue (str : sigs, Env env : env, _ : LEX.location, structPath) = case str of SignatureIdent(name, loc, declLoc) => signatureIdentValue(name, loc, declLoc, Env env, structPath) | WhereType {sigExp, typeVars, typeName, realisation, line, ...} => signatureWhereType(sigExp, typeVars, typeName, realisation, line, Env env, structPath) | SigDec(sigList, lno) => makeSigInto(sigList, Env env, lno, 0, structPath) and signatureIdentValue(name, loc, declLocs, _, structPath) = let (* Look up the signature and copy it to turn bound IDs into variables. This is needed because we may have sharing. *) val Signatures { name, tab, typeIdMap, firstBoundIndex, boundIds, locations, ...} = lookSig(name, loc); (* Remember the declaration location for possible browsing. *) val () = declLocs := locations val startNewIds = ! idCount (* Create a new variable ID for each bound ID. Type functions have to be copied to replace references to other bound IDs. These must be earlier in the list. *) fun makeNewIds([], _) = [] | makeNewIds( (oldId as TypeId{description, idKind=Bound { isDatatype, offset, arity, ...}, ...}) :: rest, typeMap ) = let val newId = makeVariableId(arity, isEquality oldId, isDatatype, false, description, structPath) fun newMap(id as TypeId{idKind=Bound{offset=n, ...}, ...}) = if n = offset then SOME newId else typeMap id | newMap _ = NONE in newId :: makeNewIds(rest, newMap) end | makeNewIds _ = raise InternalError "Map does not return Bound Id" val v = Vector.fromList(makeNewIds(boundIds, fn _ => NONE)) (* Map bound IDs only. *) val mapIds = if firstBoundIndex = startNewIds orelse null boundIds then typeIdMap (* Optimisation to reduce space: don't add map if it's not needed. *) else let fun mapId n = if n < firstBoundIndex then outerTypeIdEnv n else Vector.sub (v, n - firstBoundIndex) in composeMaps(typeIdMap, mapId) end in makeSignature(name, tab, !idCount, locations, mapIds, []) end and signatureWhereType(sigExp, typeVars, typeName, realisationType, line, Env globalEnv, structPath) = let (* We construct the signature into the result signature. When we apply the "where" we need to look up the types (and structures) only within the signature constrained by the "where" and not in the surrounding signature. e.g. If we have sig type t include S where type t = ... end we need to generate an error if S does not include t. Of course if it does that's also an error since t would be rebound! Equally, we must look up the right hand side of a where type in the surrounding scope, which will consist of the global environment and the signature excluding the entries we're adding here. *) val resSig as Signatures { typeIdMap = idMap, tab = resTab, ... } = sigValue(sigExp, Env globalEnv, lno, structPath) val sigEnv = makeEnv resTab fun lookupFailure msg = giveError (str, line, lex) (msg ^ " in signature.") (* Look up the type constructor in the signature. *) val sigTypeConstr = lookupTyp ({ lookupType = #lookupType sigEnv, lookupStruct = #lookupStruct sigEnv }, typeName, lookupFailure); (* The type, though, is looked up in the surrounding environment. *) fun lookupGlobal(s, locn) = lookupTyp ({ lookupType = #lookupType globalEnv, lookupStruct = #lookupStruct globalEnv }, s, giveError (str, locn, lex)) (* Process the type, looking up any type constructors. *) val realisation = assignTypes (realisationType, lookupGlobal, lex); fun cantSet(reason1, reason2) = let val typeEnv = { lookupType = fn s => case #lookupType globalEnv s of NONE => NONE | SOME t => SOME(t, NONE), lookupStruct = fn s => case #lookupStruct globalEnv s of NONE => NONE | SOME t => SOME(t, NONE) } in errorMsgNear (lex, true, fn n => displaySigs(sigExp, n), lno, PrettyBlock(3, false, [], [ PrettyString "Cannot apply type realisation.", PrettyBreak(1, 2), PrettyString("``" ^ typeName ^ "''"), PrettyBreak(1, 0), PrettyString reason1, PrettyBreak(1, 0), display(realisation, 1000, typeEnv), PrettyBreak(0, 0), PrettyString reason2 ])) end in (* Now try to set the target type to the type function. *) if isUndefinedTypeConstr (tsConstr sigTypeConstr) then () (* Probably because looking up the type constructor name failed. *) else let (* Map the type identifier to be set. *) val typeId = case tcIdentifier (tsConstr sigTypeConstr) of TypeId{idKind=Bound{offset, ...}, ...} => idMap offset | id => id in if not (isVariableId typeId) then (* May have been declared as type t=int or bound by a where type already. *) errorMsgNear (lex, true, fn n => displaySigs(sigExp, n), lno, PrettyBlock(3, false, [], [ PrettyString "Cannot apply type realisation.", PrettyBreak(1, 2), PrettyString("``" ^ typeName ^ "''"), PrettyBreak(1, 0), PrettyString " has already been set to", PrettyBreak(1, 0), printId typeId ])) else case typeId of TypeId{idKind=Bound { offset, ... }, ...} => ( case realId(offset-initTypeId) of VariableSlot {boundId=varId as TypeId{idKind=Bound{eqType, offset, isDatatype, ...}, ...}, ... } => ( (* The rule for "where type" says that we must check that an eqtype is only set to a type that permits equality and that the result is "well-formed". This seems to mean that if the type we're setting is a datatype (has constructors) it can only be set to a type that is a type name and not a general type function. *) if pling eqType andalso not(typePermitsEquality realisation) then cantSet ("is an eqtype but", "does not permit equality.") else case typeNameRebinding (typeVars, realisation) of SOME typeId => (* Renaming an existing constructor e.g. type t = s. Propagate the id. "s" may be free or it may be within the signature and equivalent to a sharing constraint. e.g. sig type t structure S: sig type s end where type s = t end. *) let (* We need to check what it has been set to if it's already set. *) val linkedId = case typeId of id as TypeId{idKind=Bound{offset, ...}, ...} => if offset < initTypeId then FreeSlot id (* Outside the sig: treat it as Free. *) else realId(offset-initTypeId) | id => FreeSlot id (* Free *) in case linkedId of VariableSlot _ => linkFlexibleTypeIds(typeId, varId) | _ => StretchArray.update(mapArray, offset-initTypeId, linkedId) end | NONE => if isDatatype (* The type we're trying to set is a datatype but the type we're setting it to isn't. *) then cantSet ("is a datatype but", "is not a simple type.") else let val typeId = makeTypeFunction( { location = line, description = "", name = typeName }, (typeVars, realisation)) in StretchArray.update(mapArray, offset-initTypeId, FreeSlot typeId) end ) | _ => (* Already checked. *) raise InternalError "setWhereType" ) | _ => (* Already checked. *) raise InternalError "setWhereType" end; resSig end (* signatureWhereType *) (* Constructs a signature and inserts it into an environment at a given offset. Generally offset will be zero except if we are including a signature. All the type IDs corresponding to local types are variables. There may be free IDs (and bound IDs?) as a result of "where type" constraints. *) and makeSigInto(sigsList: specs list, Env globalEnv, (* The surrounding environment excluding this sig. *) lno: LEX.location, offset: int, structPath): signatures = let (* Make a new signature. *) val newTable = makeSignatureTable(); (* Copy everything into the new signature. *) local (* ML 97 does not allow multiple declarations in a signature. *) fun checkAndEnter (enter, lookup, kind, locs) (s: string, v) = case lookup s of SOME _ => (* Already there. *) let fun getDecLoc(DeclaredAt loc :: _) = loc | getDecLoc [] = lno | getDecLoc(_::rest) = getDecLoc rest (* TODO: This shows the location of the identifier that is the duplicate. It would be nice if it could also show the original location. *) in errorNear (lex, true, fn n => displaySigs(str, n), getDecLoc(locs v), kind ^ " (" ^ s ^ ") is already present in this signature.") end | NONE => enter(s, v) val structEnv = makeEnv newTable; in val structEnv = { lookupVal = #lookupVal structEnv, lookupType = #lookupType structEnv, lookupFix = #lookupFix structEnv, lookupStruct = #lookupStruct structEnv, lookupSig = #lookupSig structEnv, lookupFunct = #lookupFunct structEnv, enterVal = checkAndEnter (#enterVal structEnv, #lookupVal structEnv, "Value", fn (Value{ locations, ...}) => locations), enterType = checkAndEnter (#enterType structEnv, #lookupType structEnv, "Type", tcLocations o tsConstr), enterStruct = checkAndEnter (#enterStruct structEnv, #lookupStruct structEnv, "Structure", fn Struct{locations, ...} => locations), (* These next three can't occur. *) enterFix = fn _ => raise InternalError "Entering fixity in signature", enterSig = fn _ => raise InternalError "Entering signature in signature", enterFunct = fn _ => raise InternalError "Entering functor in signature", allValNames = #allValNames structEnv } end (* Process the entries in the signature and allocate an address to each. *) fun processSig (signat: specs, offset : int, lno : LEX.location) : int = case signat of StructureSig (structList : structSigBind list, _) => let (* Each element in the list should be a structure binding. *) fun pStruct [] offset = offset | pStruct (({name, sigStruct = (sigStruct, _, _), line, ...}: structSigBind) :: t) offset = let (* Create a new surrounding environment to include the surrounding structure. This is the scope for any structures or types. Specifically, if we look up a type defined by a "where type" we use this environment and not the signature we're creating. *) val newEnv = { lookupVal = #lookupVal structEnv, lookupType = lookupDefault (#lookupType structEnv) (#lookupType globalEnv), lookupFix = #lookupFix structEnv, lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct globalEnv), lookupSig = #lookupSig structEnv, lookupFunct = #lookupFunct structEnv, enterVal = #enterVal structEnv, enterType = #enterType structEnv, enterStruct = #enterStruct structEnv, enterFix = #enterFix structEnv, enterSig = #enterSig structEnv, enterFunct = #enterFunct structEnv, allValNames = fn () => (#allValNames structEnv () @ #allValNames globalEnv ()) }; val resSig = sigValue (sigStruct, Env newEnv, line, structPath ^ name ^ "."); (* Process the rest of the list before declaring the structure. *) val result = pStruct t (offset + 1); (* Make a structure. *) val locations = [DeclaredAt lno, SequenceNo (newBindingId lex)] val resStruct = makeFormalStruct (name, resSig, offset, locations) val () = #enterStruct structEnv (name, resStruct); in result (* One slot for each structure. *) end in pStruct structList offset end | ValSig {name=(name, nameLoc), typeof, line, ...} => let val errorFn = giveSpecError (signat, line, lex); fun lookup(s, locn) = lookupTyp ({ lookupType = lookupDefault (#lookupType structEnv) (#lookupType globalEnv), lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct globalEnv) }, s, giveSpecError (signat, locn, lex)); (* Check for rebinding of built-ins. "it" is allowed here. *) val () = if name = "true" orelse name = "false" orelse name = "nil" orelse name = "::" orelse name = "ref" then errorFn("Specifying \"" ^ name ^ "\" is illegal.") else (); val typeof = assignTypes (typeof, lookup, lex) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] in (* If the type is not found give an error. *) (* The type is copied before being entered in the environment. This isn't logically necessary but has the effect of removing ref we put in for type constructions. *) #enterVal structEnv (name, mkFormal (name, ValBound, copyType (typeof, fn x => x, fn x => x), offset, locations)); (offset + 1) end | ExSig {name=(name, nameLoc), typeof, line, ...} => let val errorFn = giveSpecError (signat, line, lex); fun lookup(s, _) = lookupTyp ({ lookupType = lookupDefault (#lookupType structEnv) (#lookupType globalEnv), lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct globalEnv) }, s, errorFn); val exType = case typeof of NONE => exnType | SOME typeof => mkFunctionType (assignTypes (typeof, lookup, lex), exnType) val locations = [DeclaredAt nameLoc, SequenceNo (newBindingId lex)] in (* If the type is not found give an error. *) (* Check for rebinding of built-ins. "it" is not allowed. *) if name = "true" orelse name = "false" orelse name = "nil" orelse name = "::" orelse name = "ref" orelse name = "it" then errorFn("Specifying \"" ^ name ^ "\" is illegal.") else (); #enterVal structEnv (name, mkFormal (name, Exception, exType, offset, locations)); (offset + 1) end | IncludeSig (structList : sigs list, _) => let (* include sigid ... sigid or include sigexp. For simplicity we handle the slightly more general case of a list of signature expressions. The contents of the signature are added to the environment. *) fun includeSigExp (str: sigs, offset) = let val address = ref offset (* The environment for the signature being included must at least include local types. *) val includeEnv = { lookupVal = #lookupVal structEnv, lookupType = lookupDefault (#lookupType structEnv) (#lookupType globalEnv), lookupFix = #lookupFix structEnv, lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct globalEnv), lookupSig = #lookupSig structEnv, lookupFunct = #lookupFunct structEnv, enterVal = #enterVal structEnv, enterType = #enterType structEnv, enterStruct = #enterStruct structEnv, enterFix = #enterFix structEnv, enterSig = #enterSig structEnv, enterFunct = #enterFunct structEnv, allValNames = #allValNames structEnv } val resultSig = sigValue(str, Env includeEnv, lno, structPath) (* Renumber the run-time offsets for Values and Structures as we enter them into the surrounding signature. *) fun newAccess(Formal _) = let val addr = !address in address := addr+1; Formal addr end | newAccess _ = raise InternalError "newAccess: Not Formal" fun enterType(name, tySet as TypeConstrSet(ty, tcConstructors)) = let (* Process value constructors with the type. Because values can't be redefined within a signature we can't have overridden this with a new declaration. We don't allocate run-time IDs to type identifiers. That's done at the end when we've sorted out any sharing *) fun copyConstructor(Value { name, typeOf, access, class, locations, ... }) = Value{name=name, typeOf = typeOf, access=newAccess access, class=class, locations=locations, references=NONE, instanceTypes=NONE} val newType = case tcConstructors of [] => tySet (* Not a datatype. *) | constrs => let val newTy = makeTypeConstructor(tcName ty, tcIdentifier ty, tcLocations ty) in TypeConstrSet(newTy, List.map copyConstructor constrs) end; in #enterType structEnv(name, newType) end and enterStruct(name, Struct{name=strName, signat, access, locations, ...}) = #enterStruct structEnv (name, Struct{ name = strName, signat = signat, access = newAccess access, locations = locations}) and enterVal(dName, Value { name, typeOf, access, class, locations, ... }) = #enterVal structEnv (dName, Value{name=name, typeOf = typeOf, access=newAccess access, class=class, locations=locations, references=NONE, instanceTypes=NONE}) val tsvEnv = { enterType = enterType, enterStruct = enterStruct, enterVal = enterVal } val () = openSignature(resultSig, tsvEnv, "") in ! address end in List.foldl includeSigExp offset structList end | Sharing (share : shareConstraint) => (* Sharing constraint. *) let (* In ML90 it was possible to share with any identifier in scope. In ML97 sharing is restricted to identifiers in the "spec". *) val envForSharing = Env structEnv in applySharingConstraint (share, envForSharing, str); offset (* No entry *) end | CoreType {dec, ...} => let (* datatype or type binding(s) *) (* This pass puts the data constructors into the environment. *) val addrs = ref offset (* Pass2 creates value constructors of datatypes as global values. Rather than complicate pass2 by trying to make formal values in this case it's easier to trap the value constructors at this point. N.B. We may get constructors from a datatype declaration or from datatype replication. *) fun convertValueConstr(Value{class=class, typeOf, locations, name, ...}) = Value{class=class, typeOf=typeOf, access=Formal(!addrs before (addrs := !addrs+1)), name=name, locations=locations, references=NONE, instanceTypes=NONE} fun enterVal(name, v) = (#enterVal structEnv)(name, convertValueConstr v) (* Record all the types and enter them later. *) val datatypeList = searchList () val enterType = #enter datatypeList val newEnv = { lookupVal = #lookupVal structEnv, lookupType = lookupDefault (#lookup datatypeList) (lookupDefault (#lookupType structEnv) (#lookupType globalEnv)), lookupFix = #lookupFix structEnv, lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct globalEnv), lookupSig = #lookupSig structEnv, lookupFunct = #lookupFunct structEnv, enterVal = enterVal, enterType = enterType, enterStruct = #enterStruct structEnv, enterFix = #enterFix structEnv, enterSig = #enterSig structEnv, enterFunct = #enterFunct structEnv, allValNames = #allValNames structEnv }; fun makeId (eq, isdt, (args, EmptyType), loc) = makeVariableId(length args, eq, isdt, true, loc, structPath) | makeId (_, _, (typeVars, decType), { location, name, description }) = makeTypeFunction( { location = location, name = structPath ^ name, description = description }, (typeVars, decType)) (* We need a map to look up types. This is only used in one place: if the item we're processing is a datatype then we need to look at the bindings of type identifiers to compute equality correctly. e.g. type t = int*int datatype s = X of t . *) fun equalityForId(TypeId{idKind=TypeFn(_, equiv), ...}) = typePermitsEquality equiv | equalityForId id = isEquality id fun findEquality n = if n < initTypeId then equalityForId(outerTypeIdEnv n) else case realId(n-initTypeId) of FreeSlot t => equalityForId t | VariableSlot { boundId, ...} => equalityForId boundId | _ => raise InternalError "internalMap: Not bound or Free" val _ : types = pass2 (dec, makeId, Env newEnv, lex, findEquality); (* Replace the constructor list for the datatype with a new set. We need to have separate addresses for the constructors in the datatype environment from those in the value environment. This is needed for compatibility with the "signature" constructed from a struct...end block. *) fun enterFinalType (name, TypeConstrSet(tyCons, constrs)) = #enterType structEnv (name, TypeConstrSet(tyCons, List.map convertValueConstr constrs)) val _ = #apply datatypeList enterFinalType in ! addrs end (* end processSig *); val _ = List.foldl (fn (signat, offset) => processSig (signat, offset, lno)) offset sigsList val locations = [DeclaredAt lno, SequenceNo (newBindingId lex)] in makeSignature("", newTable, ! idCount, locations, typeIdEnv (), []) end (* Process the contents of the signature. *) val resultSig = sigValue (str, Env globalEnv, lno, "") (* After the signature has been built and any sharing or "where type" constraints have been applied we replace the remaining variable stamps by bound stamps. *) val nextAddress = getNextRuntimeOffset resultSig val typeCounter = ref initTypeId; val addrCounter = ref nextAddress (* Construct final bound IDs for each distinct type ID in the array. *) local fun mapIds n = if n = !idCount-initTypeId then ([], []) else ( (* Process lowest numbered IDs first since they represent the result of any sharing. *) case realId n of VariableSlot { boundId = TypeId{ idKind=Bound{eqType, isDatatype, arity, ... }, description = { name, location, description}, ...}, descriptions, ...} => let (* Need to make a new ID. *) (* If we have sharing we want to produce a description that expresses that. *) val descript = case descriptions of descs as _ :: _ :: _ => "sharing " ^ String.concatWith "," descs | _ => description (* Original description. *) val newId = let (* For each ID we need a new entry in the ID vector. We also need an entry in the run-time vector for the structure so that we can pass the equality/print value at run-time. *) val n = !typeCounter val () = typeCounter := n + 1 val addr = ! addrCounter val () = addrCounter := addr + 1 val description = { name = name, location = location, description = descript } in makeBoundId(arity, Formal addr, n, pling eqType, isDatatype, description) end (* Update the entry for any sharing. *) val () = StretchArray.update(mapArray, n, FreeSlot newId) val (distinctIds, mappedIds) = mapIds (n+1) in (newId :: distinctIds, newId :: mappedIds) end | FreeSlot (TypeId{idKind=TypeFn(args, equiv), description, ...}) => let (* Generally, IDs in a FreeSlot will be either Bound or Free but they could be TypeFunctions as a result of a "where type" and the function could involve type IDs within the signature. We have to copy the ID now after all the new IDs have been created. *) fun copyId(TypeId{idKind=Bound { offset, ...}, ...}) = if offset < initTypeId then NONE else (* At this stage we've overwritten all entries with FreeSlots. *) ( case realId(offset-initTypeId) of FreeSlot id => SOME id | _ => raise InternalError "mapIds:copyTypeConstr" ) | copyId _ = NONE val copiedEquiv = copyType(equiv, fn x => x, fn tcon => copyTypeConstr (tcon, copyId, fn x => x, fn s => s)) (* For the moment always use a Free ID here. *) val copiedId = makeTypeFunction(description, (args, copiedEquiv)) (* Update the array with this copied version. If other subsequent type functions use this entry they will then pick up the copied version. Because "where type" constraints can only refer to earlier types we have to process this from earlier to later. *) val () = StretchArray.update(mapArray, n, FreeSlot copiedId) val (distinctIds, mappedIds) = mapIds (n+1) in (distinctIds, copiedId :: mappedIds) end | FreeSlot id => (* Free or shares with existing type ID. *) let val (distinctIds, mappedIds) = mapIds (n+1) in (distinctIds, id :: mappedIds) end | _ => raise InternalError "mapIds" ) val (distinctIds, mappedIds) = mapIds 0 val mapVector = Vector.fromList mappedIds val resVector = Vector.fromList distinctIds in fun mapFunction n = if n < initTypeId then outerTypeIdEnv n else Vector.sub(mapVector, n-initTypeId) val distinctIds = distinctIds val allMapped = Vector.length mapVector = Vector.length resVector end in let val Signatures { tab, name, locations, typeIdMap, ... } = resultSig (* We have allocated Bound Ids starting at initTypeId. If there has not been any sharing or where type constraints these Ids will correspond exactly to the bound Ids of the signature and we can use the result without any further mapping. This is particularly the case if we have simply used a named signature here. If there have been some sharing or where type we have to produce a new map so that the boundId list consists of contiguously numbered items. This is an optimisation to reduce the space of the final signature. *) val finalMap = if allMapped then typeIdMap else composeMaps(typeIdMap, mapFunction) in makeSignature(name, tab, initTypeId, locations, finalMap, distinctIds) end end (* sigVal *); structure Sharing = struct type sigs = sigs type structSigBind = structSigBind type parsetree = parsetree type typeParsetree = typeParsetree type typeVarForm = typeVarForm type pretty = pretty type ptProperties = ptProperties type env = env type signatures = signatures type lexan = lexan type typeId = typeId type specs = specs end end; polyml-5.6/mlsource/MLCompiler/SIGNATURESSIG.sml000066400000000000000000000055351265146633400213220ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature SIGNATURESSIG = sig type sigs type structSigBind type parsetree type typeParsetree type typeVarForm type pretty type ptProperties type env type signatures type lexan type typeId type specs type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type exportTree = location * ptProperties list type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} val mkStructureSig: structSigBind list * location -> specs val mkStructureSigBinding: (string * location) * (sigs * bool * location) * location -> structSigBind val mkValSig: (string * location) * typeParsetree * location -> specs val mkExSig: (string * location) * typeParsetree option * location -> specs val mkCoreType: parsetree * location -> specs val mkSharing: bool * (string * location) list * location -> specs val mkWhereType: sigs * typeVarForm list * string * typeParsetree * location -> sigs val mkInclude: sigs list * location -> specs val mkSigIdent: string * location -> sigs; val mkSig: specs list * location -> sigs; val displaySigs: sigs * int -> pretty val sigExportTree: navigation * sigs -> exportTree val sigVal: sigs * int * (int->typeId) * env * lexan * location -> signatures val undefinedSignature: signatures val isUndefinedSignature: signatures -> bool structure Sharing: sig type sigs = sigs type structSigBind = structSigBind type signatures = signatures type parsetree = parsetree type typeParsetree = typeParsetree type typeVarForm = typeVarForm type pretty = pretty type ptProperties = ptProperties type env = env type lexan = lexan type typeId = typeId type specs = specs end end; polyml-5.6/mlsource/MLCompiler/SKIPS_.ML000066400000000000000000000117131265146633400200330ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Auxiliary Parsing Functions. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor SKIPS_ ( structure SYMBOLS : SymbolsSig structure LEX : LEXSIG structure SYMSET : SymsetSig sharing type SYMBOLS.sys = LEX.sys = SYMSET.sys ) : (*****************************************************************************) (* SKIPS export signature *) (*****************************************************************************) sig type sys; type lexan; type symset; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val notfound: string * lexan -> unit; val badsyms: sys * lexan -> unit; val getsym: sys * lexan -> unit; val skipon: symset * symset * string * lexan -> unit; val getid: symset * symset * lexan -> string * location; val getLabel: symset * lexan -> string * location; val getList: sys * symset * lexan * (unit -> 'a * location) -> 'a list * location; end = (*****************************************************************************) (* SKIPS functor body *) (*****************************************************************************) struct infix 5 inside; infix 6 ++; open SYMBOLS LEX SYMSET; local (* Result is in ``id'' *) val idSys = ident ++ typeIdent ++ integerConst ++ realConst; in (* Try to recreate the original lexical item. *) fun notfound (expected, lex) = let val found = if sy lex = SYMBOLS.StringConst then "\"" ^ id lex ^ "\"" else if sy lex inside idSys then id lex else repr (sy lex) in errorMessage (lex, location lex, expected ^ " expected but " ^ found ^ " was found") end; end; fun badsyms (sym, lex) = (notfound (repr sym, lex); insymbol lex); fun getsym (sym, lex) = if (sy lex) = sym then insymbol lex else notfound (repr sym, lex); infix 5 notin; fun a notin b = not (a inside b); (* used at the end of a syntactic unit to check that the current symbol is a suitable terminator *) fun skipon (a, b, errmss, lex) = if (sy lex) notin a then ( notfound (errmss, lex); while sy lex notin (a ++ b) do insymbol lex ) else (); (* returns an identifier *) fun getid (syms, fsys, lex) = if (sy lex) inside syms then let val iden = id lex val loc = location lex in insymbol lex; (iden, loc) end else ( notfound ("Identifier", lex); while sy lex notin fsys do insymbol lex; ("", nullLocation) ); (* Read a label and check that it is valid if numeric. *) fun getLabel (fsys, lex) = if (sy lex) = SYMBOLS.IntegerConst then let val iden = id lex; val loc = location lex val firstCh = String.str(String.sub(iden, 0)); in insymbol lex; if firstCh = "~" orelse firstCh = "0" then errorMessage (lex, location lex, "Labels must be 1,2,3,....") else (); (iden, loc) end else getid (declarableVarSys, fsys, lex); (* Tests for a symbol and removes it if it is there. startsys is the set of symbols which can start each element. *) fun testfor (sym, startsys, lex) = (* repeat if the separator or a starting sym is found *) if sy lex = sym then (insymbol lex; true) else if sy lex inside startsys then (badsyms (sym, lex); true) else false; fun getList (separator, startsys, lex, each) = let fun forList(list, startLoc) = let val (item, itemLoc) = each() in (* Add each item to the list. The final span is from the start to the final location. *) if testfor (separator, startsys, lex) then forList(list @ [item], startLoc) else (list @ [item], locSpan(startLoc, itemLoc)) end in forList ([], location lex) end; end (* SKIPS *); polyml-5.6/mlsource/MLCompiler/STRUCTURESSIG.sml000066400000000000000000000113141265146633400213510ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*****************************************************************************) (* STRUCTURES export signature *) (*****************************************************************************) signature STRUCTURESSIG = sig type structDec type structValue type structVals; type types; type parsetree; type lexan; type pretty; type values; type typeConstrSet; type typeVarForm type codetree; type signatures; type functors; type env; type sigBind and functorBind and structBind type machineWord type fixStatus type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type topdec type program type ptProperties type exportTree = location * ptProperties list type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} type typeParsetree type formalArgStruct type sigs val mkStructureDec: structBind list * location -> structDec val mkStruct: structDec list * location -> structValue val mkSignatureDec: sigBind list * location -> topdec; val mkFunctorDec: functorBind list * location -> topdec; val mkLocaldec: structDec list * structDec list * location -> structDec; val mkLetdec: structDec list * structValue * location -> structValue; val mkCoreLang: parsetree * location -> structDec; val mkStructureBinding: (string * location) * (sigs * bool * location) option * structValue * location -> structBind val mkStructIdent: string * location -> structValue; val mkSignatureBinding: (string * location) * sigs * location -> sigBind; val mkFunctorAppl: string * structValue * location * location -> structValue; val mkFormalArg: string * sigs -> formalArgStruct; val mkFunctorBinding: string * location * (sigs * bool * location) option * structValue * formalArgStruct * location -> functorBind; val mkSigConstraint: structValue * sigs * bool * location -> structValue val mkTopDec: structDec -> topdec val mkProgram: topdec list * location -> program val pass2Structs: program * lexan * env -> unit; val pass4Structs: codetree * program -> { fixes: (string * fixStatus) list, values: (string * values) list, structures: (string * structVals) list, signatures: (string * signatures) list, functors: (string * functors) list, types: (string* typeConstrSet) list }; val gencodeStructs: program * lexan -> codetree * int val displayProgram: program * int -> pretty; val structsExportTree: navigation * program -> exportTree structure Sharing: sig type structDec = structDec type structValue = structValue type structVals = structVals type types = types type parsetree = parsetree type lexan = lexan type pretty = pretty type values = values type typeConstrSet = typeConstrSet type codetree = codetree type signatures = signatures type functors = functors type env = env type sigBind = sigBind and functorBind = functorBind and structBind = structBind type machineWord = machineWord type fixStatus = fixStatus type topdec = topdec type program = program type typeParsetree = typeParsetree type formalArgStruct= formalArgStruct type ptProperties = ptProperties type typeVarForm = typeVarForm type sigs = sigs end end; polyml-5.6/mlsource/MLCompiler/STRUCTURES_.ML000066400000000000000000004730651265146633400207010ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified D.C.J. Matthews 2001-2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Module Structure and Operations. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) functor STRUCTURES_ ( structure LEX : LEXSIG structure CODETREE : CODETREESIG structure STRUCTVALS : STRUCTVALSIG; structure VALUEOPS : VALUEOPSSIG; structure EXPORTTREE: EXPORTTREESIG structure TYPETREE : TYPETREESIG structure PARSETREE : PARSETREESIG structure PRETTY : PRETTYSIG structure COPIER: COPIERSIG structure TYPEIDCODE: TYPEIDCODESIG structure SIGNATURES: SIGNATURESSIG structure DEBUGGER : DEBUGGERSIG structure UTILITIES : sig val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; val splitString: string -> { first:string,second:string } end; structure UNIVERSALTABLE: sig type universal = Universal.universal type univTable type 'a tag = 'a Universal.tag val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; val univFold: univTable * (string * universal * 'a -> 'a) * 'a -> 'a; end; structure DEBUG: DEBUGSIG sharing LEX.Sharing = VALUEOPS.Sharing = TYPETREE.Sharing = PARSETREE.Sharing = PRETTY.Sharing = EXPORTTREE.Sharing = STRUCTVALS.Sharing = COPIER.Sharing = CODETREE = UNIVERSALTABLE = TYPEIDCODE.Sharing = SIGNATURES.Sharing = DEBUGGER.Sharing ) : STRUCTURESSIG = (*****************************************************************************) (* STRUCTURES functor body *) (*****************************************************************************) struct open Misc; open PRETTY; open COPIER; open LEX; open CODETREE; open STRUCTVALS; open VALUEOPS; open TYPETREE; open PARSETREE; open UTILITIES; open DEBUG; open UNIVERSALTABLE; open Universal; (* for tag record selectors *) open EXPORTTREE; open TYPEIDCODE open SIGNATURES open DEBUGGER (* Transitional bindings. Calls to these should be replaced by pattern matching. *) fun sigTab (Signatures {tab,...}) = tab and sigMinTypes (Signatures {firstBoundIndex,...}) = firstBoundIndex and sigMaxTypes (Signatures {firstBoundIndex, boundIds,...}) = firstBoundIndex + List.length boundIds and sigTypeIdMap (Signatures {typeIdMap, ...}) = typeIdMap and sigBoundIds (Signatures {boundIds, ...}) = boundIds fun structName (Struct {name,...}) = name and structAccess (Struct {access,...}) = access and structLocations (Struct {locations,...}) = locations and structSignat (Struct {signat,...}) = signat (* Union of the various kinds of core language declaration. Structures are included because they can be declared by opening a structure with substructures. *) datatype coreDeclaration = CoreValue of values | CoreType of typeConstrSet | CoreFix of string*fixStatus (* Include the name because it isn't part of fixStatus. *) | CoreStruct of structVals (* Description of the actions to perform when a structure matches a signature. *) datatype valueMatching = ValueMatch of { sourceValue: values, targetType: types, coercion: valueCoercions } | StructureMatch of { sourceStructure: structVals, contentsMatch: structureMatch} | TypeIdMatch of { sourceIdNo: int, isEquality: bool } and valueCoercions = (* The coercions that may apply to a value. *) NoCoercion | ExceptionToValue | ConstructorToValue withtype structureMatch = (int * valueMatching) list (* "structs" is the abstract syntax for the module language. *) datatype structValue = StructureIdent of (* A structure name *) { name: string, (* The name *) valRef: structVals option ref, (* The variable found. *) location: location } | StructDec of (* struct ... end *) { alist: structDec list, (* List of items in it. *) location: location, matchToResult: structureMatch ref } | FunctorAppl of (* Application of a functor. *) { name: string, arg: structValue, valRef: functors option ref, (* The functor looked up. *) nameLoc: location, (* The location of the name itself. *) fullLoc: location, (* The location of the full application. *) argIds: { source: typeId, dest: typeId } list ref, (* The IDs that are required in the arguments. *) resIds: { source: typeId, dest: typeId } list ref, (* Generative IDs in the result. *) matchToArgument: structureMatch ref } | LetDec of (* let strdec in strexp. *) { decs: structDec list, body: structValue, line: location } | SigConstraint of (* Constraint of str to match sig. *) { str: structValue, (* Structure to constrain *) csig: sigs, (* Constraining signature *) opaque: bool, (* True if opaque, false if transparent. *) sigLoc: location, opaqueIds: { source : typeId, dest: typeId } list ref, matchToConstraint: structureMatch ref } and structDec = StructureDec of (* List of structure decs *) { bindings: structBind list, typeIdsForDebug: typeId list ref, line: location } | CoreLang of (* Any other decln. *) { dec: parsetree, (* The value *) vars: coreDeclaration list ref, (* The declarations *) location: location } | Localdec of (* Local strdec in strdec. *) { decs: structDec list, body: structDec list, line: location } withtype structBind = { name: string, (* The name of the structure *) nameLoc: location, haveSig: bool, (* Whether we moved an explicit signature to the value. *) value: structValue, (* And its value *) valRef: structVals option ref, (* The structure variable declared. *) line: location } fun mkStructIdent (name, location) = StructureIdent { name = name, valRef = ref NONE, location = location } (* For struct...end, make a signature to accept the values. *) fun mkStruct(alist, location) = StructDec { alist = alist, location = location, matchToResult = ref [] }; fun mkCoreLang (dec, location) = CoreLang { dec = dec, vars = ref [], location = location }; fun mkFunctorAppl (name, arg, nameLoc, fullLoc) = FunctorAppl { name = name, arg = arg, valRef = ref NONE, nameLoc = nameLoc, fullLoc = fullLoc, argIds = ref nil, resIds = ref nil, matchToArgument = ref [] }; fun mkFormalArg (name, signat) = { name = name, sigStruct = signat, valRef = ref NONE } fun mkLocaldec (decs, body, line) = Localdec { decs = decs, body = body, line = line }; fun mkLetdec (decs, body, line) = LetDec { decs = decs, body = body, line = line }; fun mkSigConstraint(str, csig, opaque, sigLoc) = SigConstraint { str=str, csig=csig, opaque=opaque, sigLoc=sigLoc, opaqueIds=ref nil, matchToConstraint = ref [] } fun mkStructureDec(bindings, line) = StructureDec { bindings = bindings, typeIdsForDebug = ref [], line = line } fun mkStructureBinding ((name, nameLoc), signat, value, fullLoc): structBind = let (* If there's an explicit signature move that to a constraint. *) val value = case signat of NONE => value | SOME (csig, opaque, sigLoc) => mkSigConstraint(value, csig, opaque, sigLoc) in { name = name, nameLoc = nameLoc, haveSig = isSome signat, value = value, valRef = ref NONE, line = fullLoc } end; type formalArgStruct = { name: string, sigStruct: sigs, valRef: structVals option ref } (* The structure variable. *) (* Top level declarations and program. *) datatype topdec = StrDec of structDec * typeId list ref (* Structure decs and core lang. *) | FunctorDec of functorBind list * location (* List of functor decs. *) | SignatureDec of sigBind list * location (* List of signature decs *) withtype (* Functor binding. *) functorBind = { name: string, nameLoc: location, haveSig: bool, (* Whether we moved an explicit signature to the value. *) body: structValue, arg: formalArgStruct, valRef: functors option ref, (* The functor variable declared. *) resIds: { source: typeId, dest: typeId } list ref, line: location, matchToResult: structureMatch ref, (* If we are debugging we need these at code-gen time. *) debugArgVals: values list ref, debugArgStructs: structVals list ref, debugArgTypeConstrs: typeConstrSet list ref } and sigBind = { name: string, (* The name of the signature *) nameLoc: location, sigStruct: sigs,(* Its value *) sigRef: signatures ref, (* The "value" of the signature. *) line: location } fun mkTopDec t = StrDec(t, ref nil) and mkFunctorDec s = FunctorDec s and mkSignatureDec s = SignatureDec s; fun mkFunctorBinding (name, nameLoc, signat, body, arg, line): functorBind = let (* If there's an explicit signature move that to a constraint. *) val body = case signat of NONE => body | SOME (csig, opaque, sigLoc) => mkSigConstraint(body, csig, opaque, sigLoc) in { name = name, nameLoc = nameLoc, haveSig = isSome signat, body = body, arg = arg, valRef = ref NONE, resIds = ref nil, line = line, matchToResult = ref [], debugArgVals = ref [], debugArgStructs = ref [], debugArgTypeConstrs = ref [] } end and mkSignatureBinding ((name, nameLoc), sg, ln) = { name = name, nameLoc = nameLoc, sigStruct = sg, line = ln, sigRef = ref undefinedSignature } type program = topdec list * location fun mkProgram tl = tl (* Pretty printing *) fun displayList ([], _, _) _ = [] | displayList ([v], _, depth) dodisplay = if depth <= 0 then [PrettyString "..."] else [dodisplay (v, depth)] | displayList (v::vs, separator, depth) dodisplay = if depth <= 0 then [PrettyString "..."] else let val brk = if separator = "," orelse separator = ";" then 0 else 1 in PrettyBlock (0, false, [], [ dodisplay (v, depth), PrettyBreak (brk, 0), PrettyString separator ] ) :: PrettyBreak (1, 0) :: displayList (vs, separator, depth - 1) dodisplay end (* displayList *) fun displayStruct (str, depth) = if depth <= 0 (* elide further text. *) then PrettyString "..." else case str of StructureDec { bindings = structList, ...} => let fun displayStructBind ( {name, haveSig, value, ...}: structBind, depth) = let (* If we desugared this before, return it to its original form. *) val (sigStruct, value) = case (haveSig, value) of (true, SigConstraint{str, csig, opaque, sigLoc, ...}) => (SOME(csig, opaque, sigLoc), str) | _ => (NONE, value) in PrettyBlock (3, false, [], PrettyString name :: ( case sigStruct of (* Signature is optional *) NONE => [] | SOME (sigStruct, opaque, _) => [ PrettyString (if opaque then " :>" else " :"), PrettyBreak (1, 0), displaySigs (sigStruct, depth - 1) ] ) @ [ PrettyString " =", PrettyBreak (1, 0), displayStructValue (value, depth - 1) ] ) end in PrettyBlock (3, false, [], PrettyString "structure" :: PrettyBreak (1, 0) :: displayList (structList, "and", depth) displayStructBind ) end | Localdec {decs, body, ...} => PrettyBlock (3, false, [], PrettyString "local" :: PrettyBreak (1, 0) :: displayList (decs, ";", depth - 1) displayStruct @ [ PrettyBreak (1, 0), PrettyString "in", PrettyBreak (1, 0)] @ displayList (body, ";", depth - 1) displayStruct @ [ PrettyBreak (1, 0), PrettyString "end" ] ) | CoreLang {dec, ...} => displayParsetree (dec, depth - 1) and displayStructValue (str, depth) = if depth <= 0 (* elide further text. *) then PrettyString "..." else case str of StructureIdent {name, ...} => PrettyString name | StructDec {alist, ...} => PrettyBlock (1, true, [], PrettyString "struct" :: PrettyBreak (1, 0) :: displayList (alist, "", depth) displayStruct @ [ PrettyBreak (1, 0), PrettyString "end"] ) | FunctorAppl {name, arg, ...} => PrettyBlock (1, false, [], [ PrettyString (name ^ "("), PrettyBreak (0, 0), displayStructValue (arg, depth), PrettyBreak (0, 0), PrettyString ")" ] ) | LetDec {decs, body, ...} => PrettyBlock (3, false, [], PrettyString "let" :: PrettyBreak (1, 0) :: displayList (decs, ";", depth - 1) displayStruct @ [ PrettyBreak (1, 0), PrettyString "in", PrettyBreak (1, 0), displayStructValue (body, depth - 1) ] @ [ PrettyBreak (1, 0), PrettyString "end" ] ) | SigConstraint{str, csig, opaque, ...} => PrettyBlock (0, false, [], [ displayStructValue (str, depth - 1), PrettyString (if opaque then " :>" else " :"), PrettyBreak (1, 0), displaySigs (csig, depth - 1) ] ) fun displayTopDec(top, depth) = if depth <= 0 (* elide further text. *) then PrettyString "..." else case top of StrDec(s, _) => displayStruct(s, depth) | SignatureDec (structList : sigBind list, _) => let fun displaySigBind ({name, sigStruct, ...}: sigBind, depth) = PrettyBlock (3, false, [], [ PrettyString (name ^ " ="), PrettyBreak (1, 0), displaySigs (sigStruct, depth - 1) ] ) in PrettyBlock (3, false, [], PrettyString "signature" :: PrettyBreak (1, 0) :: displayList (structList, "and", depth) displaySigBind ) end | FunctorDec (structList : functorBind list, _) => let fun displayFunctBind ( {name, arg={name=argName, sigStruct=argStruct, ...}, haveSig, body, ...}, depth) = let val (sigStruct, body) = case (haveSig, body) of (true, SigConstraint{str, csig, opaque, sigLoc, ...}) => (SOME(csig, opaque, sigLoc), str) | _ => (NONE, body) in PrettyBlock (3, false, [], PrettyString (name ^ "(") :: PrettyBreak (1, 0) :: PrettyBlock (1, false, [], ( if argName = "" then [] else [ PrettyString (argName ^ " :"), PrettyBreak (1, 2)] ) @ [displaySigs (argStruct, depth - 1)] ) :: PrettyString ")" :: ( case sigStruct of NONE => [] (* Signature is optional *) | SOME (sigStruct, opaque, _) => [ PrettyString(if opaque then " :>" else " :"), PrettyBreak (1, 0), displaySigs (sigStruct, depth - 1) ] ) @ [ PrettyBreak (1, 0), PrettyString "=", PrettyBreak (1, 0), displayStructValue (body, depth - 1) ] ) end in PrettyBlock (3, false, [], PrettyString "functor" :: PrettyBreak (1, 0) :: displayList (structList, "and", depth) displayFunctBind ) end (* End displayTopDec *) fun displayProgram ((sl, _), d) = PrettyBlock(0, true, [], displayList (sl, "", d) displayTopDec ) fun structExportTree(navigation, s: structDec) = let (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => displayStruct(s, d)) :: exportNavigationProps navigation fun asParent () = structExportTree(navigation, s) in case s of StructureDec{ bindings = sbl, line = location, ...} => let fun exportSB(navigation, sb as {name, nameLoc, haveSig, value, line, ...}) = let (* If we desugared this before, return it to its original form. *) val (sigStruct, value) = case (haveSig, value) of (true, SigConstraint{str, csig, opaque, sigLoc, ...}) => (SOME(csig, opaque, sigLoc), str) | _ => (NONE, value) fun exportThis () = exportSB(navigation, sb) (* Three groups: name, signature and structures. It's all complicated because the signature may not be present. *) fun getName () = let val next = case sigStruct of SOME _ => getSigStruct | NONE => getValue in getStringAsTree({parent=SOME exportThis, previous=NONE, next=SOME next}, name, nameLoc, []) end and getSigStruct () = let val next = SOME getValue val (theSig, _, _) = valOf sigStruct in sigExportTree({parent=SOME exportThis, previous=SOME getName, next=next}, theSig) end and getValue () = let val previous = case sigStruct of NONE => getName | SOME _ => getSigStruct in structValueExportTree({parent=SOME exportThis, previous=SOME previous, next=NONE}, value) end in (line, PTfirstChild getName :: exportNavigationProps navigation) end val expChild = exportList(exportSB, SOME asParent) sbl in (location, expChild @ commonProps) end | CoreLang {dec, ...} => (* A value parse-tree entry. *) getExportTree(navigation, dec) | Localdec {decs, body, line, ...} => (line, exportList(structExportTree, SOME asParent) (decs @ body) @ commonProps) end and structValueExportTree(navigation, s: structValue) = let (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => displayStructValue(s, d)) :: exportNavigationProps navigation fun asParent () = structValueExportTree(navigation, s) in case s of StructureIdent { valRef = ref var, location, ... } => let val locs = case var of SOME(Struct{locations, ...}) => locations | NONE => [] in (* Get the location properties for the identifier. *) (location, mapLocationProps locs @ commonProps) end | StructDec{ location, alist, ...} => (location, exportList(structExportTree, SOME asParent) alist @ commonProps) | FunctorAppl { valRef, name, nameLoc, fullLoc, arg, ... } => let val locs = case ! valRef of SOME(Functor { locations, ...}) => locations | NONE => [] (* Navigate between the functor name and the argument. *) (* The first position is the expression, the second the type *) fun getFunctorName () = getStringAsTree({parent=SOME asParent, previous=NONE, next=SOME getFunctorArg}, name, nameLoc, mapLocationProps locs) and getFunctorArg () = structValueExportTree({parent=SOME asParent, previous=SOME getFunctorName, next=NONE}, arg) in (fullLoc, PTfirstChild getFunctorName :: commonProps) end | LetDec {decs, body, line, ...} => let (* For simplicity just merge these as a single list. *) datatype allEntries = Value of structValue | Dec of structDec fun exportEntries(navigation, Value strval) = structValueExportTree(navigation, strval) | exportEntries(navigation, Dec strdec) = structExportTree(navigation, strdec) in (line, exportList(exportEntries, SOME asParent) (List.map Dec decs @ [Value body]) @ commonProps) end | SigConstraint { str, csig, sigLoc, ... } => let (* Navigate between the functor name and the argument. *) (* The first position is the expression, the second the type *) fun getStructure () = structValueExportTree({parent=SOME asParent, previous=NONE, next=SOME getSignature}, str) and getSignature () = sigExportTree({parent=SOME asParent, previous=SOME getStructure, next=NONE}, csig) in (sigLoc, PTfirstChild getStructure :: commonProps) end end fun topDecExportTree(navigation, top: topdec) = let (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => displayTopDec(top, d)) :: exportNavigationProps navigation fun asParent () = topDecExportTree(navigation, top) in case top of StrDec(s, _) => structExportTree(navigation, s) | SignatureDec(sigs, location) => let fun exportSB(navigation, sb as {name, nameLoc, sigStruct, line, ...}) = let fun exportThis () = exportSB(navigation, sb) fun getName () = getStringAsTree({parent=SOME exportThis, previous=NONE, next=SOME getSig}, name, nameLoc, []) and getSig () = sigExportTree({parent=SOME exportThis, previous=SOME getName, next=NONE}, sigStruct) in (line, PTfirstChild getName :: exportNavigationProps navigation) end in (location, exportList(exportSB, SOME asParent) sigs @ commonProps) end | FunctorDec(fbl, location) => let fun exportFB(navigation, fb as {name, nameLoc, haveSig, arg={sigStruct=argStruct, ...}, body, line, ...}) = let val (sigStruct, body) = case (haveSig, body) of (true, SigConstraint{str, csig, opaque, sigLoc, ...}) => (SOME(csig, opaque, sigLoc), str) | _ => (NONE, body) val fbProps = exportNavigationProps navigation fun exportThis () = exportFB(navigation, fb) (* Because the signature is optional navigation on the arg and body depends on whether there's a signature. *) fun getName() = getStringAsTree({parent=SOME exportThis, previous=NONE, next=SOME getArg}, name, nameLoc, []) and getArg() = let val next = if isSome sigStruct then getSig else getBody in sigExportTree({parent=SOME exportThis, previous=SOME getName, next=SOME next}, argStruct) end and getSig() = sigExportTree({parent=SOME exportThis, previous=SOME getArg, next=SOME getBody}, #1(valOf sigStruct)) and getBody() = let val previous = if isSome sigStruct then getSig else getArg in structValueExportTree({parent=SOME exportThis, previous=SOME previous, next=NONE}, body) end in (line, PTfirstChild getName :: fbProps) end val expChild = exportList(exportFB, SOME asParent) fbl in (location, expChild @ commonProps) end end (* Convert a "program" into a navigable tree. *) fun structsExportTree (parentTree, trees: program) = let val parentTreeNav = exportNavigationProps parentTree (* The top level is actually a list. *) fun exportTree(([], location)) = (location, parentTreeNav) | exportTree(topdec as (sl, location)) = let fun getEntry(this as (s :: sl), getPrevious) (): exportTree = topDecExportTree( { parent = SOME(fn () => exportTree topdec), (* Parent is this. *) previous = getPrevious, (* If we have a successor then that is the entry and its predecessor returns here. *) next = case sl of [] => NONE | t => SOME(getEntry(t, SOME(getEntry(this, getPrevious)))) }, s ) | getEntry _ () = raise Empty in (location, parentTreeNav @ [PTfirstChild(getEntry(sl, NONE))]) end in exportTree trees end (* Puts out an error message and then prints the piece of tree. *) fun errorMsgNear (lex, hard, near, lno, message) : unit = let val parameters = debugParams lex val errorDepth = getParameter errorDepthTag parameters in reportError lex { hard = hard, location = lno, message = message, context = SOME(near errorDepth) } end; (* TODO: If the item being errored is in a substructure it currently doesn't report the name of the substructure. *) (* Report an error about signature-structure matching. *) fun sigStructMatchMsg (lex, near, lno, structName) (doDisplay: 'a -> pretty) (structValue: 'a, sigValue: 'a, reason) = let val message = PrettyBlock(3, true, [], [ PrettyString ("Structure does not match signature" ^ (if structName = "" then "." else " in sub-structure " ^ structName)), PrettyBreak(1, 0), PrettyBlock(3, false, [], [ PrettyString "Signature:", PrettyBreak(1, 0), doDisplay sigValue ]), PrettyBreak(1, 0), PrettyBlock(3, false, [], [ PrettyString "Structure:", PrettyBreak(1, 0), doDisplay structValue ]), PrettyBreak(1, 0), PrettyBlock(3, false, [], [ PrettyString "Reason:", PrettyBreak(1, 0), reason ]) ]) in errorMsgNear(lex, true, near, lno, message) end fun sigStructMissingMsg (lex, near, lno, structName) (doDisplay: 'a -> pretty) (sigValue: 'a) = let val message = PrettyBlock(3, true, [], [ PrettyString ("Structure does not match signature" ^ (if structName = "" then "." else " in sub-structure " ^ structName)), PrettyBreak(1, 0), PrettyBlock(3, false, [], [ PrettyString "Signature:", PrettyBreak(1, 0), doDisplay sigValue ]), PrettyBreak(1, 0), PrettyBlock(3, false, [], [ PrettyString "Structure:", PrettyBreak(1, 0), PrettyString "Not present" ]) ]) in errorMsgNear(lex, true, near, lno, message) end (* Older version: prints just a string message. *) fun errorNear(lex, hard, near, lno, message: string) = errorMsgNear (lex, hard, near, lno, PrettyBlock (0, false, [], [PrettyString message])) fun errorDepth lex = let open DEBUG val parameters = LEX.debugParams lex in getParameter errorDepthTag parameters end (* Error message routine for lookupType and lookupStructure. *) fun giveError (sVal : structValue, lno : LEX.location, lex : lexan) : string -> unit = fn (message : string) => errorNear (lex, true, fn n => displayStructValue(sVal, n), lno, message); (* Turn a result from matchTypes into a pretty structure so that it can be included in a message. *) (* TODO: When reporting type messages from inside the structure we should use the environment from within the structure and for type within the signature the signature env. *) fun matchErrorReport(lex, structTypeEnv, sigTypeEnv) = unifyTypesErrorReport(lex, structTypeEnv, sigTypeEnv, "match") datatype matchTypeResult = MatchError of matchResult | MatchSuccess of types (* Check that two types match. Returns either an error result or the set of polymorphic variables for the source and the target. *) fun matchTypes (candidate, target, targMap: int -> typeId option, _) = let fun copyId(TypeId{idKind=Bound{ offset, ...}, ...}) = targMap offset | copyId _ = NONE fun copyATypeConstr tcon = copyTypeConstr(tcon, copyId, fn x => x, fn s => s) fun copyTarget t = (* Leave type variables. *) copyType (t, fn x => x, copyATypeConstr); val copiedTarget = copyTarget target (* Do the match to a version of the candidate with copies of the type variables so that we can instantiate them. We could do this by passing in a mapping function but the problem is that if we have a type variable that gets unified to another variable we will not map it properly if it occurs again (we call "eventual" and get the second tv before calling the map function so we get a second copy and not the first copy). *) val (copiedCandidate : types, _) = generalise candidate; in case unifyTypes (copiedCandidate, copiedTarget) of NONE => (* Succeeded. Return the unified type. Either will do. *) MatchSuccess copiedTarget | SOME error => MatchError error end; (* Check that a matching has succeeded, and check the value constructors if they are datatypes. *) fun checkTypeConstrs (candidSet as TypeConstrSet(candid, candidConstrs), targetSet as TypeConstrSet(target, targetConstrs), targTypeMap: int -> typeId option, lex, near, lno, typeEnv, structPath) = let val candidName : string = tcName candid; val targetName : string = tcName target; val tvars = List.tabulate(tcArity target (* either will do *), fn _ => mkTypeVar(generalisable, false, false, false)) (* If we get an error in the datatype itself print the full datatype. *) val printTypeEnv = { lookupType = fn _ => NONE, lookupStruct = fn _ => NONE } val errorInDatatype = sigStructMatchMsg(lex, near, lno, structPath)(fn t => displayTypeConstrs(t, errorDepth lex, printTypeEnv)) in if tcArity candid <> tcArity target then () (* Have already given the error message. *) else (* Check the type constructors themselves first. This checks that the sharing constraints have been satisfied. *) case matchTypes (mkTypeConstruction (candidName, candid, tvars, []), mkTypeConstruction (targetName, target, tvars, []), targTypeMap, lex) of MatchError error => (* Report the error. *) errorInDatatype(candidSet, targetSet, matchErrorReport(lex, typeEnv, typeEnv) error) | MatchSuccess _ => (* We have already checked for matching a type in the structure to a datatype in the signature. In ML97 we can't rebind an identifier in a signature so each constructor for this datatype must be present in the signature i.e. it can't be hidden by a constructor for another datatype. So we can check the types of the constructors when we check the values. We still need to check that if this has constructors that the candidate does not have more constructors. *) if null targetConstrs then () (* Target is just a type: this isn't a problem. *) else if List.length candidConstrs <= List.length targetConstrs then () (* If it's less then it will be picked up later. *) else let fun checkConstrs(Value{name=candidConstrName, ...}) = if List.exists(fn Value{name, ...} => name=candidConstrName) targetConstrs then () else errorNear(lex, true, near, lno, concat["Error while matching datatype ", candidName, ": constructor ", candidConstrName, " was present in the structure but not in the signature."]); in List.app checkConstrs candidConstrs end end (* Check that a candidate signature (actually the environment part of a structure) matches a target signature. The direction is important because a candidate is allowed to have more components and more polymorphism than the target. As part of the matching process we build up a map of typeIDs in the target to type IDs in the candidate and that is returned as the result. N.B. the map function takes an argument between minTarget and maxTarget. *) fun matchSigs(originalCandidate, originalTarget, near, lno, lex, typeIdEnv, typeEnv) :(int -> typeId) * (int * valueMatching) list = let val candidate = (* The structure. *) let val Signatures { typeIdMap, firstBoundIndex, boundIds, ... } = originalCandidate val _ = case boundIds of [] => () | _ => raise InternalError "Candidate structure with non-empty bound ID list" in if isUndefinedSignature originalCandidate then undefinedSignature else replaceMap(originalCandidate, typeIdMap, firstBoundIndex, [], typeIdEnv) end val target = (* The signature. *) let val Signatures { typeIdMap, firstBoundIndex, boundIds, ... } = originalTarget fun newMap n = if n < firstBoundIndex then typeIdEnv n else List.nth(boundIds, n-firstBoundIndex) in replaceMap(originalTarget, typeIdMap, firstBoundIndex, boundIds, newMap) end local val minTarget = sigMinTypes target and maxTarget = sigMaxTypes target (* All the Bound type IDs in the target are in this range. We create an array to contain the matched IDs from the candidate. *) val matchArray = Array.array(maxTarget-minTarget, NONE) in (* These two functions are used during the match process. *) (* When looking up a Bound ID we return NONE if it is out of the range. Bound IDs below the minimum are treated as global at this level and so only match if they are the same in the target and candidate. *) fun lookupType n = if n < minTarget then NONE else Array.sub(matchArray, n-minTarget) and enterType (n, id) = if n < minTarget then () else Array.update(matchArray, n-minTarget, SOME id) (* This is the result function. If everything is right every entry in the array will be SOME but if we have had an error there may be entries that are still NONE. To prevent an exception we return the undefined type in that case. *) fun resultType n = getOpt(Array.sub(matchArray, n-minTarget), tcIdentifier undefConstr) end (* Match typeIDs for types. This is slightly more complicated than simply assigning the stamps. *) fun matchNames (candidate, target, structPath) : unit = if isUndefinedSignature candidate then () (* Suppress unnecessary messages. *) else univFold (sigTab target, fn (dName, dVal, ()) => if tagIs typeConstrVar dVal then let (* See if there is one with the same name. *) val targetSet as TypeConstrSet(target, targetConstrs) = tagProject typeConstrVar dVal; val printTypeEnv = { lookupType = fn _ => NONE, lookupStruct = fn _ => NONE } fun displayType t = displayTypeConstrs(t, errorDepth lex, printTypeEnv) val typeError = sigStructMatchMsg(lex, near, lno, structPath) displayType in (* Match up the types. This does certain checks but does not check sharing. Equality is checked for. *) case univLookup (sigTab candidate, typeConstrVar, dName) of SOME (candidSet as TypeConstrSet(candid, candidConstrs)) => if not (isUndefinedTypeConstr target) (* just in case *) then ( (* Check for arity and equality - value constructors are checked later. If the target is a bound identifier in the range it can be matched by a candidate. *) case tcIdentifier target of TypeId{idKind=Bound { offset, ...}, ...} => enterType (offset, tcIdentifier candid) | _ => (); if tcArity target <> tcArity candid then typeError(candidSet, targetSet, PrettyString "Types take different numbers of type arguments.") (* Check that it's a datatype before checking for eqtype. *) else if not (null targetConstrs) andalso null candidConstrs then typeError(candidSet, targetSet, PrettyString "Type in structure is not a datatype") else if not(tcIsAbbreviation target) andalso tcEquality target andalso not (permitsEquality candid) then typeError(candidSet, targetSet, PrettyString "Type in structure is not an equality type") else () ) else () | NONE => sigStructMissingMsg(lex, near, lno, structPath) displayType targetSet end else if tagIs structVar dVal then let (* and sub-structures. *) val target = (tagProject structVar) dVal; (* For each target structure: find a candidate with the same name and recursively check them. *) in case univLookup (sigTab candidate, structVar, dName) of SOME candid => matchNames (structSignat candid, structSignat target, structPath ^ dName ^ ".") | NONE => let fun displayStructure s = PrettyBlock(0, false, [], [PrettyString "structure" , PrettyBreak(1, 3), PrettyString(structName s)]) in sigStructMissingMsg(lex, near, lno, structPath) displayStructure target end end else (), (* not a type or structure *) () (* default value for fold *) ) (* matchNames *); val () = matchNames (candidate, target, ""); (* Match the values and exceptions in the signatures. This actually does the checking of types. *) fun matchVals (candidate, target, structPath): (int * valueMatching) list = if isUndefinedSignature candidate then [] (* Suppress unnecessary messages. *) else (* Map the identifiers first, returning the originals if they are not in the map. *) let local fun matchStructures(dName, dVal, matches) = if tagIs typeConstrVar dVal then (* Types *) let (* For each type in the target ... *) val target = tagProject typeConstrVar dVal in (* Find a candidate with the same name. *) case univLookup (sigTab candidate, typeConstrVar, dName) of SOME candid => let (* We don't actually check the value constructors here, just load them if they match. Because of the no-redefinition rule value constructors in the signature must also be present in the value environment so we check them there. *) fun matchConstructor(source as Value{typeOf, ...}, Value{access=Formal addr, ...}, matches) = (addr, ValueMatch { sourceValue = source, coercion = NoCoercion, targetType = typeOf }) :: matches | matchConstructor(_, _, matches) = matches in (* Now check that the types match. *) checkTypeConstrs(candid, target, lookupType, lex, near, lno, typeEnv, structPath); ListPair.foldl matchConstructor matches (tsConstructors candid, tsConstructors target) end | NONE => matches (* If the lookup failed ignore the error - we've already reported it in matchNames *) end else if tagIs structVar dVal then let (* and each sub-structure *) val target = tagProject structVar dVal in (* For each target structure: find a candidate with the same name and recursively check them. *) case univLookup (sigTab candidate, structVar, dName) of SOME candid => let val substructMatch = matchVals (structSignat candid, structSignat target, structPath ^ dName ^ ".") in (* Produce the match instructions for the sub-structure. We only include Formal entries here. It's possible that there might be Global entries in some circumstances. *) case target of Struct{access=Formal addr, ...} => (addr, StructureMatch{ sourceStructure=candid, contentsMatch = substructMatch}) :: matches | _ => matches end | NONE => matches (* Ignore the error - we've already reported it in matchNames *) end else matches; in val structureMatches = univFold(sigTab target, matchStructures, []) end fun displayValue(value as Value {name, locations, typeOf, ...}) = let val decLocation = case List.find (fn DeclaredAt _ => true | _ => false) locations of SOME(DeclaredAt loc) => [ContextLocation loc] | _ => [] val valName = PrettyBlock(0, false, decLocation, [PrettyString name]) fun dispVal(kind, typeof) = PrettyBlock(0, false, [], [ PrettyString kind, PrettyBreak(1, 3), valName, PrettyBreak(0, 0), PrettyString(":"), PrettyBreak(1, 0), display (typeof, errorDepth lex, typeEnv) ]) in case value of Value{class=Constructor _, ...} => (* When displaying the constructor show the function type. We may have rebound the constructor in the candidate structure so that it creates a different datatype. *) dispVal("constructor", typeOf) | Value{class=Exception, ...} => PrettyBlock(0, false, [], PrettyString "exception" :: PrettyBreak(1, 3) :: valName :: ( case getFnArgType typeOf of NONE => [] | SOME excType => [ PrettyBreak (1, 1), PrettyString "of", PrettyBreak (1, 3), display (excType, errorDepth lex, typeEnv) ] )) | _ => dispVal("val", typeOf) end local fun matchLocalValues(dName, dVal, matches) = if tagIs valueVar dVal then let val destVal as Value { typeOf=destTypeOf, class=destClass, access=destAccess, ...} = tagProject valueVar dVal in case univLookup (sigTab candidate, valueVar, dName) of NONE => (sigStructMissingMsg(lex, near, lno, structPath) displayValue destVal; matches) | SOME (candid as Value { typeOf=sourceTypeOf, class=sourceClass, ...}) => let (* If the target is a constructor or exception the candidate must be similar. If the candidate is a constructor or exception this will match a value but requires some coercion. *) datatype matchType = IsOK of valueCoercions | IsWrong of pretty val matchKind = case (destClass, sourceClass) of (Constructor _, Constructor _) => IsOK NoCoercion | (Constructor _, _) => IsWrong(PrettyString "Value is not a constructor") | (Exception, Exception) => IsOK NoCoercion | (Exception, _) => IsWrong(PrettyString "Value is not an exception") | (_, Exception) => IsOK ExceptionToValue | (_, Constructor _) => IsOK ConstructorToValue | _ => IsOK NoCoercion in case matchKind of IsWrong error => ( sigStructMatchMsg(lex, near, lno, structPath) displayValue (candid, destVal, error); matches ) | IsOK coercion => case matchTypes (sourceTypeOf, destTypeOf, lookupType, lex) of MatchSuccess instanceType => ( (* If it matches an entry in the signature it counts as being exported and therefore referenced. *) case candid of Value { references=SOME{exportedRef, ...}, ...} => exportedRef := true | _ => (); (* Add the instance type to the instance types. *) case candid of Value{ instanceTypes=SOME instanceRef, ...} => (* This has to be generalised before it is added here. Unlike normal unification when matching to a signature any polymorphic variables in the target will not have been generalised. *) instanceRef := #1(generalise instanceType) :: !instanceRef | _ => (); case destAccess of Formal destAddr => (destAddr, ValueMatch { sourceValue = candid, coercion = coercion, targetType = instanceType }) :: matches | _ => matches (* This could be global. *) ) | MatchError error => ( sigStructMatchMsg(lex, near, lno, structPath) displayValue (candid, destVal, matchErrorReport(lex, typeEnv, typeEnv) error); matches ) end end else matches in val matchedValues = univFold(sigTab target, matchLocalValues, structureMatches) end in matchedValues end (* matchVals *); val doMatch = matchVals (candidate, target, ""); (* Do the match. *) in (resultType, doMatch) (* Return the function to look up the results. *) end (* matchSigs *); val makeEnv = fn x => let val Env e = makeEnv x in e end; (* Any values in the signature are counted as exported. This case applies if there was no result signature because if there was a signature the values would have been given their references and types in the signature matching. *) fun markValsAsExported resSig = let fun refVals(_, dVal, ()) = if tagIs valueVar dVal then let val valu = tagProject valueVar dVal in case valu of Value {references=SOME{exportedRef, ...}, ...} => exportedRef := true | _ => (); (* If we have exported the value without a signature we use the most general type and discard any, possibly less general, references. *) case valu of Value{ typeOf, instanceTypes=SOME instanceRef, ...} => instanceRef := [#1(generalise typeOf)] | _ => () end else () in univFold(sigTab resSig, refVals, ()) end (* Construct a set of actions for matching a structure to itself. This is only really needed to ensure that type IDs are passed through correctly but we don't actually do them here yet. *) fun makeCopyActions signat : (int * valueMatching) list = let fun matchEntry(_, dVal, matches) = if tagIs structVar dVal then let val str = tagProject structVar dVal in case str of Struct{access=Formal addr, ...} => (addr, StructureMatch{ sourceStructure=str, contentsMatch = makeCopyActions(structSignat str)}) :: matches | _ => matches end else if tagIs valueVar dVal then let val v = tagProject valueVar dVal in case v of Value { access=Formal addr, typeOf, ...} => (addr, ValueMatch { sourceValue = v, coercion = NoCoercion, targetType = typeOf }) :: matches | _ => matches end else if tagIs typeConstrVar dVal then let fun matchConstructor(v as Value{access=Formal addr, typeOf, ...}, matches) = (addr, ValueMatch { sourceValue = v, coercion = NoCoercion, targetType = typeOf }) :: matches | matchConstructor(_, matches) = matches in List.foldl matchConstructor matches (tsConstructors(tagProject typeConstrVar dVal)) end else matches in univFold(sigTab signat, matchEntry, []) end (* Actions to copy the type Ids into the result signature. *) local fun matchTypeIds(_, []) = [] | matchTypeIds(n, (typeId as TypeId{ access = Formal addr, ...}) :: rest) = (addr, TypeIdMatch{ sourceIdNo=n, isEquality=isEquality typeId }) :: matchTypeIds(n+1, rest) | matchTypeIds(_, _) = raise InternalError "matchTypeIds: Not Formal" in fun makeMatchTypeIds destIds = matchTypeIds(0, destIds) end (* Second pass - identify names with values and type-check *) (* Process structure-returning expressions i.e. structure names, struct..end values and functor applications. *) fun structValue(str: structValue, newTypeId: (int*bool*bool*bool*typeIdDescription)->typeId, currentTypeCount, newTypeIdEnv: unit -> int->typeId, Env env, lex, lno, structPath) = let val typeEnv = { lookupType = fn s => case #lookupType env s of NONE => NONE | SOME t => SOME(t, SOME(newTypeIdEnv())), lookupStruct = fn s => case #lookupStruct env s of NONE => NONE | SOME t => SOME(t, SOME(newTypeIdEnv())) } in case str of StructureIdent {name, valRef, location} => let (* Look up the name and save the value. *) val result = lookupStructure ("Structure", {lookupStruct = #lookupStruct env}, name, giveError (str, location, lex)) val () = valRef := result in case result of SOME(Struct{signat, ...}) => signat | NONE => undefinedSignature end | FunctorAppl {name, arg, valRef, nameLoc, fullLoc, argIds, resIds, matchToArgument, ... } => (* The result structure must be copied to generate a new environment. This will make new types so that different applications of the functor yield different types. There may be dependencies between the parameters and result signatures so copying may have to take that into account. *) ( case #lookupFunct env name of NONE => ( giveError (str, nameLoc, lex) ("Functor (" ^ name ^ ") has not been declared"); undefinedSignature ) | SOME functr => let val Functor { arg = Struct{signat=formalArgSig, ...}, result=functorResSig, ...} = functr val () = valRef := SOME functr (* save it till later. *) (* Apply a functor to an argument. The result structure contains a mixture of IDs from the argument structure and generative IDs from the result structure. There are two parts to this process. 1. We have to match the actual argument structure to the formal argument to ensure that IDs are in the right place for the functor. 2. We have to take the actual argument structure and the functor result structure and produce a combination of this as a structure. *) (* IDs: argIDs: A list of pairs of IDs as Selected/Local/Global values and Formal values. This contains the IDs that must be passed into the functor. resIDs: A list of pairs of IDs as Local values and Formal values. The Local value is the location where a new generative ID is stored and the Formal offset is the offset within the run-time vector returned by the signature where the source ID for the generative ID is to be found. *) (* This provides information about the arguments. *) (* Get the actual parameter value. *) val actualArgSig = structValue(arg, newTypeId, currentTypeCount, newTypeIdEnv, Env env, lex, fullLoc, structPath); local (* Check that the actual arguments match formal arguments, and instantiate the variables. *) val (matchResults, matchActions) = matchSigs (actualArgSig, formalArgSig, fn n => displayStructValue(str, n), fullLoc, lex, newTypeIdEnv(), typeEnv); (* Record the code to match to this and include instructions to load the typeIDs. *) val () = matchToArgument := matchActions @ makeMatchTypeIds(sigBoundIds formalArgSig) in val matchResults = matchResults end (* Create a list of the type IDs that the argument must supply. *) local val maxT = sigMaxTypes formalArgSig and minT = sigMinTypes formalArgSig val results = List.tabulate(maxT-minT, fn n => matchResults(n+minT)) val args = ListPair.mapEq(fn(s, d) => { source = s, dest = d })(results, sigBoundIds formalArgSig) in val () = argIds := args; (* Save for code-generation. *) end (* Now create the generative typeIDs. These are IDs that are in the bound ID range of the result signature. Any type IDs inherited from the argument will have type ID values less than sigMinTypes functorResSig. *) local fun makeNewTypeId( oldId as TypeId{idKind=Bound{isDatatype, arity, ...}, description = { name=oldName, ...}, ...}) = let val description = { location = fullLoc, name = oldName, description = "Created from applying functor " ^ name } val newId = newTypeId(arity, false, isEquality oldId, isDatatype, description) in { source = oldId, dest = newId } end | makeNewTypeId _ = raise InternalError "Not Bound" (* The resIds list tells the code-generator where to find the source of each ID in the result structure and where to save the generative ID. *) val sdList = List.map makeNewTypeId (sigBoundIds functorResSig) val _ = resIds := sdList (* Save for code-generation. *) in (* This vector contains the resulting type IDs. They all have Local access. *) val resVector = Vector.fromList(List.map(fn { dest, ...} => dest) sdList) end (* Construct a result signature. This will contain all the IDs created here i.e. IDs in the argument and generative IDs at the start and then all the values and structures returned from the functor. When we come to code-generate we need to 1. Use loadOpaqueIds over the resIDs to create the opaque IDs. 2. Basically, do the same as StructDec to match to the result signature. We don't need to do anything about type IDs from the argument. Processing the argument will ensure that type IDs created in the argument are declared as Locals and if we pass localIDs to matchStructure we will load IDs from both the argument and generative IDs created by loadOpaqueIds. *) val minCopy = Int.min(sigMinTypes formalArgSig, sigMinTypes functorResSig) val idEnv = newTypeIdEnv() fun getCombinedTypeId n = if n < minCopy then idEnv n else if n >= sigMinTypes functorResSig then Vector.sub(resVector, n - sigMinTypes functorResSig) else if n >= sigMinTypes formalArgSig then matchResults n else sigTypeIdMap formalArgSig n val resSig = let val Signatures { name, tab, locations, ... } = functorResSig in makeSignature(name, tab, currentTypeCount(), locations, composeMaps(sigTypeIdMap functorResSig, getCombinedTypeId), []) end in resSig end ) | StructDec {alist, location, matchToResult, ...} => let (* Collection of declarations packaged into a structure or a collection of signatures. *) (* Some of the environment, the types and the value constructors, is generated during the first pass. Get the environment from the structure. *) val structTable = makeSignatureTable () val structEnv = makeEnv structTable val makeLocalTypeId = newTypeId val makeLocalTypeIdEnv = newTypeIdEnv val newEnv = { enterType = #enterType structEnv, enterVal = #enterVal structEnv, enterStruct = #enterStruct structEnv, enterSig = fn _ => raise InternalError "Signature in Struct End", enterFunct = fn _ => raise InternalError "Functor in Struct End", lookupVal = lookupDefault (#lookupVal structEnv) (#lookupVal env), lookupType = lookupDefault (#lookupType structEnv) (#lookupType env), lookupStruct = lookupDefault (#lookupStruct structEnv) (#lookupStruct env), lookupSig = #lookupSig env, (* Global *) lookupFunct = #lookupFunct env, (* Global *) lookupFix = #lookupFix env, (* Fixity declarations are dealt with in the parsing process. They are only processed again in this pass in order to get declarations in the right order. *) enterFix = fn _ => (), allValNames = fn () => (#allValNames structEnv () @ #allValNames env ()) } (* process body of structure *) val () = pass2Struct (alist, makeLocalTypeId, currentTypeCount, makeLocalTypeIdEnv, Env newEnv, lex, lno, structPath); (* We need to make a signature for the result in the form that can be used if there is no explicit signature, for example if this is used as the result of a functor. That means creating Formal values for all the values and structures. These Formal entries define the position in the run-time vector where each of the values and sub-structures are located. We don't include typeIDs in this. Any typeIDs that need to be included in the run-time vector are added by the functor declaration code. *) val finalTable = makeSignatureTable(); val finalEnv = makeEnv finalTable (* Create the result signature and also build the match structure to match to it. *) fun enterItem(dName, dVal, (addrs, matches)) = if tagIs typeConstrVar dVal then let val tConstr as TypeConstrSet(typConstr, valConstrs) = tagProject typeConstrVar dVal in if null valConstrs then (#enterType finalEnv (dName, tConstr); (addrs, matches)) else let (* If this is a datatype constructor convert the value constructors. The "no redefinition" rule for signatures doesn't apply to a structure so the signature we create here could have some constructors that have been hidden by later declarations. We still need the whole value environment in case of datatype replication. *) fun convertConstructor( valVal as Value{class, typeOf, locations, references, name, instanceTypes, ...}, (otherConstrs, (addrs, matches))) = let val formalValue = Value{class=class, name=name, typeOf=typeOf, access=Formal addrs, locations=locations, references=references, instanceTypes=instanceTypes} in (formalValue :: otherConstrs, (addrs + 1, (addrs, ValueMatch { sourceValue = valVal, coercion = NoCoercion, targetType=typeOf}) :: matches)) end val (newConstrs, newAddrMatch) = List.foldl convertConstructor ([], (addrs, matches)) valConstrs val newConstructor = makeTypeConstructor( tcName typConstr, tcIdentifier typConstr, tcLocations typConstr) in #enterType finalEnv (dName, TypeConstrSet(newConstructor, List.rev newConstrs)); newAddrMatch end end else if tagIs structVar dVal then let val strVal = tagProject structVar dVal val locations = structLocations strVal val strSig = structSignat strVal val matchSubStructure = makeCopyActions strSig in #enterStruct finalEnv (dName, makeFormalStruct (dName, strSig, addrs, locations)); (addrs + 1, (addrs, StructureMatch { sourceStructure=strVal, contentsMatch = matchSubStructure}) :: matches) end else if tagIs valueVar dVal then let val valVal = tagProject valueVar dVal in (* If this is a type-dependent function such as PolyML.print we must put in the original type-dependent version not the version which will have frozen its type as 'a. *) case valVal of value as Value{access = Overloaded _, ...} => ( #enterVal finalEnv (dName, value); (addrs, matches) ) | Value{class, typeOf, locations, references, instanceTypes, ...} => let val formalValue = Value{class=class, name=dName, typeOf=typeOf, access=Formal addrs, locations=locations, references=references, instanceTypes=instanceTypes} in #enterVal finalEnv (dName, formalValue); (addrs + 1, (addrs, ValueMatch { sourceValue = valVal, coercion = NoCoercion, targetType=typeOf}) :: matches) end end else (addrs, matches) val () = matchToResult := #2(univFold(structTable, enterItem, (0, []))) val locations = [DeclaredAt location, SequenceNo (newBindingId lex)] val resSig = makeSignature("", finalTable, currentTypeCount(), locations, newTypeIdEnv(), []) in resSig end | LetDec {decs, body = localStr, line, ...} => let (* let strdec in strexp end *) val newEnv = makeEnv (makeSignatureTable()); (* The environment for the local declarations. *) val localEnv = { lookupVal = lookupDefault (#lookupVal newEnv) (#lookupVal env), lookupType = lookupDefault (#lookupType newEnv) (#lookupType env), lookupFix = #lookupFix newEnv, lookupStruct = lookupDefault (#lookupStruct newEnv) (#lookupStruct env), lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, (* Sigs and functs are global *) enterVal = #enterVal newEnv, enterType = #enterType newEnv, (* Fixity declarations are dealt with in the parsing process. At this stage we simply need to make sure that local declarations aren't entered into the global environment. *) enterFix = fn _ => (), enterStruct = #enterStruct newEnv, enterSig = #enterSig newEnv, enterFunct = #enterFunct newEnv, allValNames = fn () => (#allValNames newEnv () @ #allValNames env ()) }; (* Process the local declarations. *) val () = pass2Struct (decs, newTypeId, currentTypeCount, newTypeIdEnv, Env localEnv, lex, line, structPath); in (* There should just be one entry in the "body" list. *) structValue(localStr, newTypeId, currentTypeCount, newTypeIdEnv, Env localEnv, lex, line, structPath) end | SigConstraint { str, csig, opaque, sigLoc, opaqueIds, matchToConstraint, ... } => let val bodyIds = ref [] val startTypes = currentTypeCount() val startTypeEnv = newTypeIdEnv() fun sconstraintMakeTypeId (arity, isVar, eq, isdt, desc) = let val newId = newTypeId(arity, isVar, eq, isdt, desc) in bodyIds := newId :: ! bodyIds; newId end fun sconstraintTypeIdEnv () n = if n < startTypes then startTypeEnv n else valOf( List.find(fn TypeId{idKind=Bound{offset, ...}, ...} => offset = n | _ => raise Subscript) (!bodyIds)) val resSig = structValue(str, sconstraintMakeTypeId, currentTypeCount, sconstraintTypeIdEnv, Env env, lex, lno, structPath); (* Get the explicit signature. *) val explicitSig = sigVal(csig, startTypes, startTypeEnv, Env env, lex, sigLoc) val minExplicitSig = sigMinTypes explicitSig and maxExplicitSig = sigMaxTypes explicitSig (* Match the signature. This instantiates entries in typeMap. *) val (matchResults, matchActions) = matchSigs (resSig, explicitSig, fn n => displayStructValue(str, n), sigLoc, lex, startTypeEnv, typeEnv); val () = matchToConstraint := matchActions val rSig = if opaque then let (* Construct new IDs for the generic IDs. For each ID in the signature we need to make a new Local ID. *) fun makeNewId(oldId as TypeId{idKind=Bound{ isDatatype, arity, ...}, description = { name, ...}, ...}) = let val description = { location = sigLoc, name = name, description = "Created from opaque signature" } in newTypeId(arity, false, isEquality oldId, isDatatype, description) end | makeNewId _ = raise InternalError "Not Bound" val sources = List.tabulate(maxExplicitSig-minExplicitSig, fn n => matchResults(n+minExplicitSig)) val dests = List.map makeNewId (sigBoundIds explicitSig) (* Add the matching IDs to a list. When we create the code for the structure we need to create new run-time ID values using the original equality code and a new ref to hold the printer. *) val () = opaqueIds := ListPair.mapEq (fn (s, d) => { source=s, dest=d }) (sources, dests) (* Create new IDs for all the bound IDs in the signature. *) val v = Vector.fromList dests (* And copy it to put in the names from the structure. *) val currentEnv = newTypeIdEnv() fun oldMap n = if n < minExplicitSig then currentEnv n else Vector.sub (v, n - minExplicitSig) val Signatures{locations, name, tab, typeIdMap, ...} = explicitSig in makeSignature(name, tab, currentTypeCount(), locations, composeMaps(typeIdMap, oldMap), []) end else (* Transparent: Use the IDs from the structure. *) let val newIdEnv = newTypeIdEnv () fun matchedIds n = if n < sigMinTypes explicitSig then newIdEnv n else matchResults n val Signatures{locations, name, tab, typeIdMap, ...} = explicitSig in (* The result signature. This needs to be able to enumerate the type IDs including those we've added. *) makeSignature(name, tab, currentTypeCount(), locations, composeMaps(typeIdMap, matchedIds), []) end in rSig end end (* structValue *) and pass2Struct (strs : structDec list, makeLocalTypeId : (int * bool * bool * bool * typeIdDescription) -> typeId, makeCurrentTypeCount: unit -> int, makeTypeIdEnv: unit -> int -> typeId, Env env : env, lex, lno : LEX.location, structPath: string ) : unit = let fun pass2StructureDec (str : structDec, structList : structBind list, typeIdsForDebug) : unit = let (* Declaration of structures. *) (* The declarations must be made in parallel. i.e. structure A = struct ... end and B = A; binds B to the A in the PREVIOUS environment, not the A being declared. *) val sEnv = (* The new names. *) noDuplicates (fn(name, _, _) => errorNear (lex, true, fn n => displayStruct(str, n), lno, "Structure " ^ name ^ " has already been bound in this declaration") ) (* Any new type Ids we create need to be added onto a list in case we need them for the debugger. *) fun captureIds args = let val id = makeLocalTypeId args in typeIdsForDebug := id :: ! typeIdsForDebug; id end (* Put the new names into this environment. *) fun pass2StructureBind ({name, value, valRef, line, ...}) : unit= let (* Each element in the list is a structure binding. *) val resSig = structValue(value, captureIds, makeCurrentTypeCount, makeTypeIdEnv, Env env, lex, line, structPath ^ name ^ "."); (* Any values in the signature are counted as exported. *) val () = markValsAsExported resSig; (* Now make a local structure variable using this signature. *) val locations = [DeclaredAt line, SequenceNo (newBindingId lex)] val var = makeLocalStruct (name, resSig, locations) in #enter sEnv (name, var); valRef := SOME var end in List.app pass2StructureBind structList; (* Put them into the enclosing env. *) #apply sEnv (#enterStruct env) end; (* pass2StructureDec *) fun pass2Localdec (decs : structDec list, body : structDec list) : unit = let val newEnv = makeEnv (makeSignatureTable()); (* The environment for the local declarations. *) val localEnv = { lookupVal = lookupDefault (#lookupVal newEnv) (#lookupVal env), lookupType = lookupDefault (#lookupType newEnv) (#lookupType env), lookupFix = #lookupFix newEnv, lookupStruct = lookupDefault (#lookupStruct newEnv) (#lookupStruct env), lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, enterVal = #enterVal newEnv, enterType = #enterType newEnv, enterFix = fn _ => (), enterStruct = #enterStruct newEnv, enterSig = #enterSig newEnv, enterFunct = #enterFunct newEnv, allValNames = fn () => (#allValNames newEnv () @ #allValNames env ()) }; (* Process the local declarations. *) val () = pass2Struct (decs, makeLocalTypeId, makeCurrentTypeCount, makeTypeIdEnv, Env localEnv, lex, lno, structPath); (* This is the environment used for the body of the declaration. Declarations are added both to the local environment and to the surrounding scope. *) (* Look-ups come from the local env *) val bodyEnv = { lookupVal = #lookupVal localEnv, lookupType = #lookupType localEnv, lookupFix = #lookupFix localEnv, lookupStruct = #lookupStruct localEnv, lookupSig = #lookupSig localEnv, lookupFunct = #lookupFunct localEnv, enterVal = fn pair => ( #enterVal newEnv pair; #enterVal env pair ), enterType = fn pair => ( #enterType newEnv pair; #enterType env pair ), enterFix = #enterFix localEnv, enterStruct = fn pair => ( #enterStruct newEnv pair; #enterStruct env pair ), enterSig = fn pair => ( #enterSig newEnv pair; #enterSig env pair ), enterFunct = #enterFunct localEnv, allValNames = #allValNames localEnv }; in (* Now the body. *) pass2Struct (body, makeLocalTypeId, makeCurrentTypeCount, makeTypeIdEnv, Env bodyEnv, lex, lno, structPath) end; (* pass2Localdec *) fun pass2Singleton (dec : parsetree, vars) : unit = let (* Single declaration - may declare several names. *) (* As well as entering the declarations we must keep a list of the value and exception declarations. *) val newEnv = { lookupVal = #lookupVal env, lookupType = #lookupType env, lookupFix = #lookupFix env, lookupStruct = #lookupStruct env, lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, (* Must add the entries onto the end in case a declaration with the same name is made. e.g. local ... in val a=1; val a=2 end. *) enterVal = fn (pair as (_,v)) => ( #enterVal env pair; vars := !vars @ [CoreValue v] ), enterType = fn (pair as (_,t)) => ( #enterType env pair; vars := !vars @ [CoreType t] ), enterFix = fn pair => ( #enterFix env pair; vars := !vars @ [CoreFix pair] ), (* This will only be used if we do `open A' where A contains sub-structures. *) enterStruct = fn (pair as (_,v)) => ( #enterStruct env pair; vars := !vars @ [CoreStruct v] ), enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = #allValNames env }; (* Create a new type ID for each new datatype. Add the structure path to the name. *) fun makeId (eq, isdt, (args, EmptyType), { location, name, description }) = makeLocalTypeId(List.length args, true, eq, isdt, { location = location, name = structPath ^ name, description = description }) | makeId (_, _, (typeVars, decType), { location, name, description }) = makeTypeFunction( { location = location, name = structPath ^ name, description = description }, (typeVars, decType)) (* Process the body and discard the type. *) val _ : types = pass2 (dec, makeId, Env newEnv, lex, fn _ => false); in () end (* pass2Singleton *) fun pass2Dec (str as StructureDec { bindings, typeIdsForDebug, ... }) = pass2StructureDec (str, bindings, typeIdsForDebug) | pass2Dec(Localdec {decs, body, ...}) = pass2Localdec (decs, body) | pass2Dec(CoreLang {dec, vars, ...}) = pass2Singleton (dec, vars) in List.app pass2Dec strs (* Process all the top level entries. *) end (* pass2Struct *) fun pass2Structs ((strs, _): program, lex : lexan, Env globals : env) : unit = let (* Create a local environment to capture declarations. We don't want to add them to the global environment at this point. *) val newValEnv = UTILITIES.searchList() and newTypeEnv = UTILITIES.searchList() and newStrEnv = UTILITIES.searchList() and newSigEnv = UTILITIES.searchList() and newFuncEnv = UTILITIES.searchList() val lookupVal = lookupDefault (#lookup newValEnv) (#lookupVal globals) and lookupType = lookupDefault (#lookup newTypeEnv) (#lookupType globals) and lookupStruct = lookupDefault (#lookup newStrEnv) (#lookupStruct globals) and lookupSig = lookupDefault (#lookup newSigEnv) (#lookupSig globals) and lookupFunct = lookupDefault (#lookup newFuncEnv) (#lookupFunct globals) fun allValNames () = let val v = ref [] val () = #apply newValEnv (fn (s, _) => v := s :: ! v) in !v @ #allValNames globals () end val env = { lookupVal = lookupVal, lookupType = lookupType, lookupFix = #lookupFix globals, lookupStruct = lookupStruct, lookupSig = lookupSig, lookupFunct = lookupFunct, enterVal = #enter newValEnv, enterType = #enter newTypeEnv, enterFix = fn _ => (), (* ?? Already entered by the parser. *) enterStruct = #enter newStrEnv, enterSig = #enter newSigEnv, enterFunct = #enter newFuncEnv, allValNames = allValNames }; (* Create the free identifiers. These are initially Bound but are replaced by Free after the code has been executed and we have the values for the printer and equality functions. They are only actually created in strdecs but functor or signature topdecs in the same program could refer to them. *) local val typeIds = ref [] in fun topLevelId(arity, isVar, eq, isdt, description) = let val idNumber = topLevelIdNumber() val newId = (if isVar then makeBoundIdWithEqUpdate else makeBoundId) (arity, Local{addr = ref ~1, level = ref baseLevel}, idNumber, eq, isdt, description) in typeIds := newId :: ! typeIds; newId end and topLevelIdNumber() = List.length(!typeIds) and makeTopLevelIdEnv() = (* When we process a topdec we create a top-level ID environment which matches any ID numbers we've already created in this "program" to the actual ID. Generally this will be empty. *) let val typeVec = Vector.fromList(List.rev(!typeIds)) in fn n => Vector.sub(typeVec, n) end end (* We have to check that a type does not contain free variables and turn them into unique monotypes if they exist. This is a bit messy. We have to allow subsequent structure declarations to freeze the types (there's an example on p90 of the Definition) but we can't functors to get access to unfrozen free variables because that can break the type system. *) fun checkValueForFreeTypeVariables(name: string, v: values) = checkForFreeTypeVariables(name, valTypeOf v, lex, codeForUniqueId) (* Find all the values in the structure. *) fun checkStructSigForFreeTypeVariables(name: string, s: signatures) = let fun checkEntry(dName: string, dVal: universal, ()) = if tagIs structVar dVal then checkStructSigForFreeTypeVariables(name ^ dName ^ ".", structSignat((tagProject structVar) dVal)) else if tagIs valueVar dVal then checkValueForFreeTypeVariables(name ^ dName, (tagProject valueVar) dVal) else () in univFold(sigTab s, checkEntry, ()) end fun checkVariables (newValEnv, newStrEnv) = ( #apply newValEnv (fn (s: string, v: values) => checkValueForFreeTypeVariables(s, v)); #apply newStrEnv ( fn (n: string, s: structVals) => checkStructSigForFreeTypeVariables(n^".", structSignat s)) ) fun pass2TopDec ([], envs) = List.app checkVariables envs | pass2TopDec (StrDec(str, typeIds)::rest, envs) = let (* Remember the top-level Ids created in this strdec. *) fun makeId(arity, isVar, eq, isdt, desc) = let val newId = topLevelId(arity, isVar, eq, isdt, desc) in typeIds := newId :: ! typeIds; newId end in (* strdec: structure or core-language topdec. *) pass2Struct([str], makeId, topLevelIdNumber, makeTopLevelIdEnv, Env env, lex, location lex, ""); pass2TopDec(rest, if errorOccurred lex then [] else (newValEnv, newStrEnv) :: envs) end | pass2TopDec((topdec as FunctorDec (structList : functorBind list, lno)) :: rest, envs) = let val () = List.app checkVariables envs (* Check previous variables. *) (* There is a restriction that the same name may not be bound twice. As with other bindings functor bindings happen in parallel. DCJM 6/1/00. *) val sEnv = (* The new names. *) noDuplicates (fn (name, _, _) => errorNear(lex, true, fn n => displayTopDec(topdec, n), lno, "Functor " ^ name ^ " has already been bound in this declaration") ); val startTopLevelIDs = topLevelIdNumber() and topLevelEnv = makeTopLevelIdEnv() (* Put the new names into this environment. *) fun pass2FunctorBind ({name, arg = {name = argName, sigStruct = argSig, valRef = argVal}, body, valRef, resIds, line, matchToResult, debugArgVals, debugArgStructs, debugArgTypeConstrs, ...}: functorBind) = let (* When we apply a functor we share type IDs with the argument if they have an ID less than sigMinTypes for the result signature and treat other IDs as generative. If we don't have an explicit result signature or if we have a transparent signature the type IDs in the result are those returned from the body. To keep the argument IDs separate from newly created IDs we start creating local IDs with offsets after the args. *) val typeStamps = ref startTopLevelIDs; val localStamps = ref [] val argumentSignature = sigVal (argSig, startTopLevelIDs, topLevelEnv, Env env, lex, line) val locations = [DeclaredAt line, SequenceNo (newBindingId lex)] val resArg = makeLocalStruct (argName, argumentSignature, locations) (* sigVal will have numbered the bound IDs to start at startTopLevelIDs. We need to enter these bound IDs into the local environment but as Selected entries. *) local fun mkId(TypeId{idKind=Bound{ arity, eqType, isDatatype, offset, ...}, description={ location, name, description}, access = Formal addr, ...}) = TypeId{idKind=Bound { arity = arity, offset = offset, eqType = eqType, isDatatype = isDatatype }, description = { location=location, (* Add the structure name to the argument type IDs. *) name=if argName = "" then name else argName^"."^name, description=description }, access = makeSelected(addr, resArg)} | mkId _ = raise InternalError "mkId: Not Bound or not Formal" in (* argIDVector is part of the environment now. *) val argIDVector = Vector.fromList(List.map mkId (sigBoundIds argumentSignature)) val () = typeStamps := !typeStamps + List.length(sigBoundIds argumentSignature) end val startBodyIDs = ! typeStamps; (* After the arguments. *) local (* We also have to apply the above map to the signature. Structures may not have Formal entries for their type IDs so we must map them to the Selected items. Actually, there's a nasty sort of circularity here; we'd like the Selected entries to use structArg as the base but we can't create it until we have its signature...which uses structArg. *) val argSigWithSelected = let val Signatures { tab, name, locations, typeIdMap, ...} = argumentSignature fun mapToSelected n = if n < startTopLevelIDs then topLevelEnv n else Vector.sub(argIDVector, n-startTopLevelIDs) in makeSignature(name, tab, startBodyIDs, locations, composeMaps(typeIdMap, mapToSelected), []) end in val argEnv = makeEnv (makeSignatureTable()); (* Local name space. *) (* We may either have a single named structure in which case that is the argument or effectively a sig...end block in which case we have to open a dummy structure. *) val () = if argName <> "" then (* Named structure. *) let val structArg = Struct { name = argName, signat = argSigWithSelected, access = structAccess resArg, locations=structLocations resArg } in debugArgStructs := [structArg]; #enterStruct argEnv (argName, structArg) end else (* Open the dummy argument. Similar to "open" in treestruct. *) COPIER.openSignature (argSigWithSelected, { enterType = fn (s,v) => (debugArgTypeConstrs := v :: ! debugArgTypeConstrs; #enterType argEnv (s, v)), enterStruct = fn (name, strVal) => let val argStruct = makeSelectedStruct (strVal, resArg, []) in debugArgStructs := argStruct :: ! debugArgStructs; #enterStruct argEnv (name, argStruct) end, enterVal = fn (name, value) => let val argVal = mkSelectedVar (value, resArg, []) in debugArgVals := argVal :: ! debugArgVals; #enterVal argEnv (name, argVal) end }, "") end val () = argVal := SOME resArg (* Now process the body of the functor using the environment of the arguments to the functor and the global environment. *) val envWithArgs = { lookupVal = lookupDefault (#lookupVal argEnv) (#lookupVal env), lookupType = lookupDefault (#lookupType argEnv) (#lookupType env), lookupFix = #lookupFix env, lookupStruct = lookupDefault (#lookupStruct argEnv) (#lookupStruct env), lookupSig = #lookupSig env, lookupFunct = #lookupFunct env, enterVal = #enterVal env, enterType = #enterType env, enterFix = fn _ => (), enterStruct = #enterStruct env, enterSig = #enterSig env, enterFunct = #enterFunct env, allValNames = fn () => (#allValNames argEnv () @ #allValNames env ()) }; local (* Create local IDs for any datatypes declared in the body or any generative functor applications. *) fun newTypeId(arity, isVar, eq, isdt, desc) = let val n = !typeStamps val () = typeStamps := n + 1; val newId = (if isVar then makeBoundIdWithEqUpdate else makeBoundId) (arity, Local{addr = ref ~1, level = ref baseLevel}, n, eq, isdt, desc) in localStamps := newId :: !localStamps; newId end fun typeIdEnv () = let val localIds = Vector.fromList(List.rev(! localStamps)) in fn n => if n < startTopLevelIDs then topLevelEnv n else if n < startBodyIDs then Vector.sub(argIDVector, n-sigMinTypes argumentSignature) else Vector.sub(localIds, n-startBodyIDs) end in val resSig = structValue(body, newTypeId, fn () => !typeStamps, typeIdEnv, Env envWithArgs, lex, line, "") val () = if errorOccurred lex then () else checkStructSigForFreeTypeVariables(name^"().", resSig) (* This counts as a reference. *) val () = markValsAsExported resSig end; local val startRunTimeOffsets = getNextRuntimeOffset resSig fun convertId(n, id as TypeId{idKind=Bound { offset, isDatatype, arity, ...}, description, ...}) = (* Either inherited from the argument or a new type ID. *) makeBoundId (arity, Formal(n + startRunTimeOffsets), offset, isEquality id, isDatatype, description) | convertId (_, id) = id (* Free or TypeFunction. *) val localVector = Vector.fromList(List.rev(!localStamps)) val bodyVec = Vector.mapi convertId localVector val Signatures { name, tab, typeIdMap, locations, ...} = resSig (* These local IDs are included in the bound ID range for the result signature. Since they were created in the functor new instances will be generated when the functor is applied. *) val newBoundIds = Vector.foldr (op ::) [] bodyVec (* Record the ID map for code-generation. *) val () = resIds := Vector.foldri(fn (n, b, r) => { source=b, dest=Vector.sub(bodyVec, n)} :: r) [] localVector fun resTypeMap n = if n < startTopLevelIDs then topLevelEnv n else if n < startBodyIDs then Vector.sub(argIDVector, n-sigMinTypes argumentSignature) else Vector.sub(bodyVec, n-startBodyIDs) in val functorSig = makeSignature(name, tab, startBodyIDs, locations, composeMaps(typeIdMap, resTypeMap), newBoundIds) val () = matchToResult := makeCopyActions functorSig @ makeMatchTypeIds newBoundIds end (* Now make a local functor variable and put it in the name space. Because functors can only be declared at the top level the only way it can be used is if we have functor F(..) = ... functor G() = ..F.. with no semicolon between them. They will then be taken as a single declaration and F will be picked up as a local. *) (* Set the size of the type map. *) val locations = [DeclaredAt line, SequenceNo (newBindingId lex)] val var = makeFunctor (name, resArg, functorSig, makeLocal (), locations) in #enter sEnv (name, var); valRef := SOME var end in (* Each element in the list is a functor binding. *) List.app pass2FunctorBind structList; (* Put them into the enclosing env. *) #apply sEnv (#enterFunct env); pass2TopDec(rest, []) end (* FunctorDec *) | pass2TopDec((topdec as SignatureDec (structList : sigBind list, lno)) :: rest, envs) = let val () = List.app checkVariables envs (* Check previous variables. *) (* There is a restriction that the same name may not be bound twice. As with other bindings functor bindings happen in parallel. DCJM 6/1/00. *) val sEnv = (* The new names. *) noDuplicates (fn (name, _, _) => errorNear (lex, true, fn n => displayTopDec(topdec, n), lno, "Signature " ^ name ^ " has already been bound in this declaration") ); val startTopLevelIDs = topLevelIdNumber() and topLevelEnv = makeTopLevelIdEnv() fun pass2SignatureBind ({name, sigStruct, line, sigRef, ...}) = let (* Each element in the list is a signature binding. *) val Signatures { tab, typeIdMap, firstBoundIndex, boundIds, ...} = sigVal (sigStruct, startTopLevelIDs, topLevelEnv, Env env, lex, line) val locations = [DeclaredAt line, SequenceNo (newBindingId lex)] val namedSig = (* Put in the signature name. *) makeSignature(name, tab, firstBoundIndex, locations, typeIdMap, boundIds) in sigRef := namedSig; (* Remember for pass4. *) #enter sEnv (name, namedSig) end in List.app pass2SignatureBind structList; (* Put them into the enclosing env. *) #apply sEnv (#enterSig env) ; pass2TopDec(rest, []) end in pass2TopDec(strs, []); (* Mark any exported values as referenced. *) #apply newValEnv (fn (s: string, valu: values) => ( (* If we have exported the value we need to mark it as a reference. But if the identifier has been rebound we only want to mark the last reference. Looking the identifier up will return only the last reference. *) case #lookup newValEnv s of SOME(Value { references=SOME{exportedRef, ...}, ...}) => exportedRef := true | _ => (); (* Since it's been exported the instance type is the most general type. We can discard any other instance type info since it cannot be more general. *) case valu of Value{ typeOf, instanceTypes=SOME instanceRef, ...} => instanceRef := [#1(generalise typeOf)] | _ => () ) ) end (*pass2Structs *); (* * * Code-generation phase. * * *) (* Generate code from the expressions and arrange to return the results so that "pass4" can find them. *) fun gencodeStructs ((strs, _), lex) = let (* Before code-generation perform an extra pass through the tree to remove unnecessary polymorphism. The type-checking computes a most general type for a value, typically a function, but it is frequently used in situations where a less general type would suffice. *) local fun leastGenStructDec(StructureDec { bindings, ... }) = (* Declarations are independent so can be processed in order. *) List.app (leastGenStructValue o #value) bindings | leastGenStructDec(CoreLang{dec, ...}) = setLeastGeneralTypes(dec, lex) | leastGenStructDec(Localdec{decs, body, ...}) = ( (* Process the body in reverse order then the declaration in reverse. *) List.foldr (fn (d, ()) => leastGenStructDec d) () body; List.foldr (fn (d, ()) => leastGenStructDec d) () decs ) and leastGenStructValue(StructureIdent _) = () | leastGenStructValue(StructDec {alist, ...}) = (* Declarations in reverse order. *) List.foldr (fn (d, ()) => leastGenStructDec d) () alist | leastGenStructValue(FunctorAppl {arg, ...}) = leastGenStructValue arg | leastGenStructValue(LetDec {decs, body, ...}) = ( (* First the body then the declarations in reverse. *) leastGenStructValue body; List.foldr (fn (d, ()) => leastGenStructDec d) () decs ) | leastGenStructValue(SigConstraint {str, ...}) = leastGenStructValue str fun leastGenTopDec(StrDec(aStruct, _)) = leastGenStructDec aStruct | leastGenTopDec(FunctorDec(fbinds, _)) = List.app(fn{body, ...} => leastGenStructValue body) fbinds | leastGenTopDec(SignatureDec _) = () in val () = (* These are independent so can be processed in order. *) List.app leastGenTopDec strs end (* Apply a function which returns a pair of codelists to a list of structs. This now threads the debugging environment through the functions so the name is no longer really appropriate. DCJM 23/2/01. *) fun mapPair (_: 'a * debuggerStatus -> {code: codeBinding list, debug: debuggerStatus}) [] debug = { code = [], debug = debug } | mapPair f (h::t) debug = let (* Process the list in order. In the case of a declaration sequence later entries in the list may refer to earlier ones. *) val this = f (h, debug); val rest = mapPair f t (#debug this); in (* Return the combined code. *) { code = #code this @ #code rest, debug = #debug rest } end; fun applyMatchActions (code : codetree, actions, sourceIds, mkAddr, level) = let (* Generate a new structure which will match the given signature. A structure is represented by a vector of entries, and its signature is a map which gives the offset in the vector of each value. When we match a signature the candidate structure will in general not have its entries in the same positions as the target. We have to construct a new structure from it with the entries in the correct positions. In most cases the optimiser will simplify this code considerably so there is no harm in using a general mechanism. Nevertheless, we check for the case when we are building a structure which is a direct copy of the original and use the original code if possible. *) fun matchSubStructure (code: codetree, actions: structureMatch): codetree * bool = let val decs = multipleUses (code, fn () => mkAddr 1, level) (* First sort by the address in the destination vector. This previously used Misc.quickSort but that results in a lot of memory allocation for the partially sorted lists. Since we should have exactly N items the range checking in "update" and the "valOf" provide additional checking that all the items are present. *) val a = Array.array(List.length actions, NONE) val () = List.app(fn (i, action) => Array.update(a, i, SOME action)) actions val sortedActions = Array.foldri (fn (n, a, l) => (n, valOf a) :: l) [] a fun applyAction ((destAddr, StructureMatch { sourceStructure, contentsMatch }), (otherCode, allSame)) = let val access = structAccess sourceStructure; (* Since these have come from a signature we might expect all the entries to be "formal". However if the structure is global the entries in the signature may be global, and if the structure is in a "struct .. end" it may be local. *) val (code, equalDest) = case access of Formal sourceAddr => (mkInd (sourceAddr, #load decs level), sourceAddr=destAddr) | _ => (codeStruct (sourceStructure, level), false) val (resCode, isSame) = matchSubStructure (code, contentsMatch: structureMatch) in (resCode::otherCode, allSame andalso equalDest andalso isSame) end | applyAction ((destAddr, ValueMatch { sourceValue as Value{typeOf=sourceTypeOf, name, ...}, coercion, targetType }), (otherCode, allSame)) = let (* Set up a new type variable environment in case this needs to create type values to match a polymorphic source value to a monomorphic context. *) val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) (* If the entry is from a signature select from the code. Apply any coercion from constructors to values. *) fun loadCode localLevel = case sourceValue of Value{access=Formal svAddr, ...} => ( case coercion of NoCoercion => mkInd (svAddr, #load decs localLevel) | ExceptionToValue => let fun loadEx l = mkInd (svAddr, #load decs l) in case getFnArgType sourceTypeOf of NONE => mkTuple [loadEx localLevel, mkStr name, CodeZero, codeLocation nullLocation] | SOME _ => let val nLevel = newLevel level in mkProc (mkTuple[loadEx nLevel, mkStr name, mkLoadArgument 0, codeLocation nullLocation], 1, "", getClosure nLevel, 0) end end | ConstructorToValue => (* Extract the injection function/nullary value. *) ValueConstructor.extractInjection(mkInd (svAddr, #load decs localLevel)) ) | _ => ( case coercion of NoCoercion => codeVal (sourceValue, localLevel, typeVarMap, [], lex, location nullLex) | ExceptionToValue => codeExFunction(sourceValue, localLevel, typeVarMap, [], lex, location nullLex) | ConstructorToValue => mkInd(1, codeVal (sourceValue, localLevel, typeVarMap, [], lex, location nullLex)) ) local val (copiedCandidate, sourceVars) = generalise sourceTypeOf val sourceVars = List.filter (fn {equality, ...} => not justForEqualityTypes orelse equality) sourceVars val () = case unifyTypes(copiedCandidate, targetType) of NONE => () | SOME report => (print(name ^ ":\n"); PolyML.print report; raise InternalError "unifyTypes failed in pass 3") val filterTypeVars = List.filter (fn tv => not justForEqualityTypes orelse tvEquality tv) val destVars = filterTypeVars (getPolyTypeVars(targetType, fn _ => NONE)) (* If we have the same polymorphic variables in the source and destination we don't need to apply a coercion. N.B. We may have the same number of polymorphic variables but still have to apply it if we have, for example, fun f x => x matching val f: 'a list -> 'a list. *) fun equalEntry({value=source, ...}, destTv) = case eventual source of TypeVar sourceTv => sameTv(sourceTv, destTv) | _ => false in val (polyCode, justCopy) = if ListPair.allEq equalEntry (sourceVars, destVars) then (loadCode(level) (* Nothing to do. *), (* We're just copying if this is the same address. *) case sourceValue of Value{access=Formal sourceAddr, ...} => destAddr=sourceAddr | _ => false) else if null destVars (* Destination is monomorphic. *) then (applyToInstance(sourceVars, level, typeVarMap, loadCode), false) else let open TypeVarMap val destPolymorphism = List.length destVars val localLevel = newLevel level val argAddrs = List.tabulate(destPolymorphism, fn n => fn l => mkLoadParam(n, l, localLevel)) val argMap = ListPair.zipEq(destVars, argAddrs) val addrs = ref 0 fun mkAddrs n = ! addrs before (addrs := !addrs+n) val newTypeVarMap = extendTypeVarMap(argMap, mkAddrs, localLevel, typeVarMap) (* Apply the source to the parameters provided by the destination. In almost all cases we will be removing polymorphism here but it is possible to add polymorphism through type definitions of the form type 'a t = int. *) val application = applyToInstance(sourceVars, localLevel, newTypeVarMap, loadCode) in (mkProc( mkEnv(getCachedTypeValues newTypeVarMap, application), destPolymorphism, name ^ "(P)", getClosure localLevel, !addrs), false) end end in (mkEnv(TypeVarMap.getCachedTypeValues typeVarMap, polyCode) :: otherCode, (* We can use the original structure if nothing else has changed, the offset in the destination structure is the same as the offset in the source and we don't have any coercion. *) allSame andalso justCopy andalso (case coercion of NoCoercion => true | _ => false)) end | applyAction ((_, TypeIdMatch { sourceIdNo, isEquality }), (otherCode, _)) = (* Get the corresponding source ID. *) (codeAccess(sourceIds(sourceIdNo, isEquality), level) :: otherCode, false) val (codeList, isAllEq) = List.foldr applyAction ([], true) sortedActions in if isAllEq then (code, true) else (mkEnv (#dec decs, mkTuple codeList), false) end in #1 (matchSubStructure (code, actions)) end (* applyMatchActions *) (* If we are declaring a structure with an opaque signature we need to create the run-time IDs for newly generated IDs. *) fun loadOpaqueIds (opaqueIds, mkAddr, level) = let fun decId { dest, source } = let val { addr=idAddr, level=idLevel } = vaLocal(idAccess dest) val addr = mkAddr 1; val () = idAddr := addr and () = idLevel := level; val idCode = codeGenerativeId(source, isEquality dest, mkAddr, level) in mkDec(addr, idCode) end in List.map decId opaqueIds end (* Code-generate a structure value. *) fun structureCode (str, strName, debugEnv, mkAddr, level: level): { code: codeBinding list, load: codetree } = case str of FunctorAppl {arg, valRef = ref functs, argIds=ref argIds, resIds=ref resIds, matchToArgument=ref matchToArgument, ...} => let val {code = argCodeSource, load = argLoadSource, ...} = structureCode (arg, strName, debugEnv, mkAddr, level) (* Match the actual argument to the required arguments. *) fun getMatchedId(n, isEq) = case #source(List.nth (argIds, n)) of id as TypeId{idKind=TypeFn _, ...} => (* Have to generate a function here. *) Global(codeGenerativeId(id, isEq, mkAddr, level)) | id => idAccess id val argCode = applyMatchActions(argLoadSource, matchToArgument, getMatchedId, mkAddr, level) (* To produce the generative type IDs we need to save the result vector returned by the functor application and then generate the new type IDs from the IDs in it. To make valid source IDs we have to turn the Formal entries in the signature into Selected entries. *) val resAddr = mkAddr 1 local val dummyResStruct = makeLocalStruct("", undefinedSignature, []) (* Dummy structure. *) val resl = vaLocal (structAccess dummyResStruct); val () = #addr resl := resAddr; val () = #level resl := level fun mkSelected { source = TypeId{idKind, access = Formal addr, description}, dest } = { source = TypeId{idKind=idKind, access = makeSelected(addr, dummyResStruct), description = description }, dest = dest } | mkSelected _ = raise InternalError "makeSelected: Not Bound or not Formal" val resultIds = List.map mkSelected resIds in val loadIds = loadOpaqueIds(resultIds, mkAddr, level) end val functorCode = case functs of SOME(Functor{access=functorAccess, ...}) => codeAccess (functorAccess, level) | NONE => raise InternalError "FunctorAppl: undefined" in (* Evaluate the functor. *) { code = argCodeSource @ (mkDec(resAddr, mkEval (functorCode, [argCode])) :: loadIds), load = mkLoadLocal resAddr } end | StructureIdent {valRef = ref v, ...} => { code = [], load = codeStruct (valOf v, level) } | LetDec {decs, body = localStr, ...} => let (* let strdec in strexp end *) (* Generate the declarations but throw away the loads. *) val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) (* TODO: Get the debug environment correct here. *) fun processBody(decs, _, debugEnv, _, _, _) = (decs, debugEnv) val (code, debug) = codeStrdecs(strName, decs, debugEnv, mkAddr, level, typeVarMap, [], processBody) val {code = bodyCode, load = bodyLoad } = structureCode (localStr, strName, debug, mkAddr, level) in { code = TypeVarMap.getCachedTypeValues typeVarMap @ code @ bodyCode, load = bodyLoad } end | StructDec {alist, matchToResult=ref matchToResult, ...} => let val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) fun processBody(decs, _, debugEnv, _, _, _) = (decs: codeBinding list, debugEnv) val (coded, _(*debugEnv*)) = codeStrdecs(strName, alist, debugEnv, mkAddr, level, typeVarMap, [], processBody) (* We match to the dummy signature here. If there is a signature outside we will match again. This results in double copying but that should all be sorted out by the optimiser. *) val loads = List.rev(List.foldl(fn (s, l) => codeLoadStrdecs(s, level) @ l) [] alist) in (* The result is a block containing the declarations and code to load the results. *) { code = TypeVarMap.getCachedTypeValues typeVarMap @ coded, load = applyMatchActions (mkTuple loads, matchToResult, fn _ => raise Subscript, mkAddr, level) } end | SigConstraint { str, opaqueIds=ref opaqueIds, matchToConstraint = ref matchToConstraint,... } => let val {code = strCode, load = strLoad, ...} = structureCode (str, strName, debugEnv, mkAddr, level) val tempDecs = multipleUses (strLoad, fn () => mkAddr 1, level); val ids = loadOpaqueIds(opaqueIds, mkAddr, level) in { code = strCode @ #dec tempDecs @ ids, load = applyMatchActions (#load tempDecs level, matchToConstraint, fn _ => raise Subscript, mkAddr, level) } end (* structureCode *) (* We need to generate code for the declaration and then code to load the results into a tuple. *) and codeStrdecs (strName, [], debugEnv, mkAddr, level, typeVarMap, leadingDecs, processBody) = processBody(leadingDecs: codeBinding list, strName, debugEnv, mkAddr, level, typeVarMap) (* Do the continuation. *) | codeStrdecs (strName, (StructureDec { bindings = structList, typeIdsForDebug = ref debugIds, ... }) :: sTail, debugEnv, mkAddr, level, _(*typeVarMap*), leadingDecs, processBody) = let fun codeStructureBind ({name, value, valRef, ...}: structBind, debug) = let val structureVal = valOf(! valRef) val sName = strName ^ name ^ "." val {code = strCode, load = strLoad, ...} = structureCode (value, sName, debug, mkAddr, level) val addr = mkAddr 1 val var = vaLocal (structAccess structureVal) val () = #addr var := addr; val () = #level var := level; val (debugDecs, newDebug) = makeStructDebugEntries([structureVal], debugEnv, level, lex, mkAddr) in (* Get the code and save the result in the variable. *) { code = strCode @ [mkDec (addr, strLoad)] @ debugDecs : codeBinding list, debug = newDebug } end val { code: codeBinding list, debug = strDebug } = (* Code-generate each declaration. *) mapPair codeStructureBind structList debugEnv val (debugIdDecs, idDebug) = makeTypeIdDebugEntries(debugIds, strDebug, level, lex, mkAddr) (* A structure binding may introduce new type IDs either directly or by way of opaque signatures or functor application. Ideally we'd add these using something like markTypeConstructors but for now just start a new environment. *) (* TODO: Check this. It looks as though TypeVarMap.getCachedTypeValues newTypeVarMap always returns the empty list. *) val newTypeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) val (codeRest, debugRest) = codeStrdecs (strName, sTail, idDebug, mkAddr, level, newTypeVarMap, [], processBody) in (leadingDecs @ code @ debugIdDecs @ TypeVarMap.getCachedTypeValues newTypeVarMap @ codeRest, debugRest) end | codeStrdecs (strName, (Localdec {decs, body, ...}) :: sTail, debugEnv, mkAddr, level, typeVarMap, leadingDecs, processBody) = let fun processTail(previousDecs, newStrName, newDebugEnv, newMkAddr, newLevel, newTypeVarMap) = let (* TODO: Get the debug environment right here. *) in codeStrdecs (newStrName, sTail, newDebugEnv, newMkAddr, newLevel, newTypeVarMap, previousDecs, processBody) end fun processBody(previousDecs, newStrName, newDebugEnv, newMkAddr, newLevel, newTypeVarMap) = let (* TODO: Get the debug environment right here. *) in codeStrdecs (newStrName, body, newDebugEnv, newMkAddr, newLevel, newTypeVarMap, previousDecs, processTail) end in (* Process the declarations then the body and then the tail. *) codeStrdecs (strName, decs, debugEnv, mkAddr, level, typeVarMap, leadingDecs, processBody) end | codeStrdecs (strName, (CoreLang {dec, ...}) :: sTail, debugEnv, mkAddr, level, typeVarMap, leadingDecs, processBody) = let fun processTail(newCode, newDebugEnv, newTypeVarMap) = codeStrdecs (strName, sTail, newDebugEnv, mkAddr, level, newTypeVarMap, newCode, processBody) val (code, debug) = gencode (dec, lex, debugEnv, level, mkAddr, typeVarMap, strName, processTail) in (leadingDecs @ code, debug) end (* end codeStrdecs *) (* Generate a list of load instructions to build the result tuple. *) and codeLoadStrdecs(StructureDec { bindings, ... }, _) = let fun loadStructureBind ({valRef = ref v, ...}, loads) = let val { addr=ref addr, ...} = vaLocal (structAccess(valOf v)) in mkLoadLocal addr :: loads end in (* Code-generate each declaration. *) List.foldl loadStructureBind [] bindings end | codeLoadStrdecs(Localdec {body, ...}, level) = List.foldl (fn(s, l) => codeLoadStrdecs(s, level) @ l) [] body | codeLoadStrdecs(CoreLang {vars=ref vars, ...}, level) = let (* Load each variable, exception and type ID (i.e. equality & print function) that has been declared. Since value declarations may be mutually recursive we have to code-generate the declarations first then return the values. *) val typeVarMap = TypeVarMap.defaultTypeVarMap(fn _ => raise InternalError "typeVarMap", level) fun loadVals (CoreValue v, rest) = codeVal (v, level, typeVarMap, [], nullLex, location nullLex) :: rest | loadVals (CoreStruct s, rest) = codeStruct (s, level) :: rest | loadVals (CoreType (TypeConstrSet(_, tcConstructors)), rest) = (* Type IDs are handled separately but we need to load the value constructors if this is a datatype. This is really only because of datatype replication where we need to be able to get the value constructors from the datatype. *) List.rev(List.map( fn v => codeVal (v, level, typeVarMap, [], nullLex, location nullLex)) tcConstructors) @ rest | loadVals (_, rest) = rest in List.foldl loadVals [] vars end fun codeTopdecs (StrDec(str, _), debugEnv, mkAddr) = let open TypeVarMap val level = baseLevel val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) val (code, debug) = codeStrdecs("", [str], debugEnv, mkAddr, level, typeVarMap, [], fn(decs, _, debugEnv, _, _, _) => (decs, debugEnv)) in { code = TypeVarMap.getCachedTypeValues typeVarMap @ code, debug = debug } end | codeTopdecs (FunctorDec (structList : functorBind list, _), debugEnv, mkOuterAddr) = let fun codeFunctorBind ({name, arg = {valRef=argValRef, ...}, body, valRef, resIds=ref resIds, matchToResult=ref matchToResult, debugArgVals, debugArgStructs, debugArgTypeConstrs, ...}: functorBind, debugEnv) = let val argVal = valOf(! argValRef) local (* Separate context for each functor binding. *) val address = ref 1 in fun mkAddr n = !address before (address := ! address+n) val level = newLevel baseLevel (* Inside the functor *) end val arg = vaLocal (structAccess argVal) (* Create a local binding for the argument. This allows the new variable to be a local. *) val localAddr = mkAddr 1 val () = #addr arg := localAddr val () = #level arg := level val func = valOf(!valRef) local (* These are the entries for the functor arguments. *) val (typeIdDebugDecs, typeIdDebugEnv) = makeTypeIdDebugEntries(sigBoundIds (structSignat argVal), debugEnv, level, lex, mkAddr) val (structDebugDecs, structDebugEnv) = makeStructDebugEntries(! debugArgStructs, typeIdDebugEnv, level, lex, mkAddr) val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, level) (* ???Check??? *) val (valDebugDecs, valDebugEnv) = makeValDebugEntries(! debugArgVals, structDebugEnv, level, lex, mkAddr, typeVarMap) val (typeDebugDecs, typeDebugEnv) = makeTypeConstrDebugEntries(! debugArgTypeConstrs, valDebugEnv, level, lex, mkAddr) in val fBindDebugDecs = typeIdDebugDecs @ structDebugDecs @ valDebugDecs @ typeDebugDecs val fBindDebugEnv = typeDebugEnv end (* Process the body and make a function out of it. *) local val {code = strCode, load = strLoad, ...} = structureCode (body, name ^ "().", fBindDebugEnv, mkAddr, level) fun getIds(n, isEq) = case #source(List.nth(resIds, n)) of id as TypeId{idKind=TypeFn _, ...} => (* Have to generate a function here. *) Global(codeGenerativeId(id, isEq, mkAddr, level)) | id => idAccess id val matchedCode = applyMatchActions(strLoad, matchToResult, getIds, mkAddr, level) in val functorCode = (* The function that implements the functor. *) (if getParameter inlineFunctorsTag (debugParams lex) then mkMacroProc else mkProc) (mkEnv(mkDec(localAddr, mkLoadArgument 0) :: (fBindDebugDecs @ strCode), matchedCode), 1, name, getClosure level, mkAddr 0) end (* Set the address of this variable. Because functors can only be declared at the top level the only way it can be used is if we have functor F(..) = ... functor G() = ..F.. with no semicolon between them. They will then be taken as a single declaration and F will be picked up as a local. *) val addr = mkOuterAddr 1 val Functor { access, ...} = func val var = vaLocal access val () = #addr var := addr; val () = #level var := baseLevel(* Top level *); in { code = [mkDec (addr, functorCode)], debug = debugEnv } end in mapPair codeFunctorBind structList debugEnv end | codeTopdecs(SignatureDec _, debugEnv, _) = { code = [], debug = debugEnv } and loadTopdecs (StrDec(str, ref typeIds)) = let val level = baseLevel val load = codeLoadStrdecs(str, level) (* Load all the IDs created in this topdec even if they're not directly referenced. *) fun loadIds id = codeId(id, level) in load @ List.rev(List.map loadIds typeIds) end | loadTopdecs (FunctorDec (structList, _)) = let fun loadFunctorBind ({valRef, ...}) = let val Functor{access, ...} = valOf(! valRef) val {addr = ref addr, ...} = vaLocal access in mkLoadLocal addr end in List.rev(List.map loadFunctorBind structList) end | loadTopdecs(SignatureDec _) = [] local (* Separate context for each top level item. *) val address = ref 0 in fun mkAddr n = !address before (address := ! address+n) end val coded = (* Process top level list. *) mapPair (fn (str, debug) => codeTopdecs (str, debug, mkAddr)) strs initialDebuggerStatus val loaded = List.foldl (fn (s, l) => loadTopdecs s @ l) [] strs in (* The result is code for a vector containing the results of the declarations which pass4 can use to pull out the values after the code has been run. *) (mkEnv (#code coded, mkTuple(List.rev loaded)), mkAddr 0) end (* gencodeStructs *); (* Once the code has been executed the declarations must be added to the global scope. The type and infix status environments have already been processed so they can be dumped into the global environment unchanged. The values and exceptions, however, have to be picked out the compiled code. Note: The value constructors are actually produced at the same time as their types but are dumped out by enterGlobals. *) (* This previously only processed declarations which required some code-generation and evaluation (structures, values and functors). It now includes types, signatures and fixity so that all declarations can be printed in the order of declaration. DCJM 6/6/02. *) fun pass4Structs (results, (strs: topdec list, _)) = let fun extractStruct(str, mapTypeIds, args as (addr, { fixes, values, structures, signatures, functors, types } )) = case str of StructureDec { bindings, ... } => let fun extractStructureBind ({name, valRef, line, ...}: structBind, (addr, structures)) = let val structCode = mkInd (addr, results) (* We need to replace type IDs with their Global versions. *) local val Struct{signat=Signatures { name, locations, typeIdMap, tab, ...}, ...} = valOf(!valRef) in val resultSig = makeSignature(name, tab, 0, locations, composeMaps(typeIdMap, mapTypeIds), []) end in (* Make a global structure. *) (addr + 1, (name, makeGlobalStruct (name, resultSig, structCode, [DeclaredAt line])) :: structures) end val (newAddr, newstructures) = List.foldl extractStructureBind (addr, structures) bindings in (newAddr, { structures=newstructures, functors=functors, signatures=signatures, fixes=fixes, values=values, types=types }) end | Localdec {body, ...} => List.foldl (fn(s, a) => extractStruct(s, mapTypeIds, a))args body (* Value, exception or type declaration at the top level. *) | CoreLang {vars=ref vars, ...} => let (* Enter the values and exceptions. *) (* Copy the types to replace the type IDs with the versions with Global access. *) fun replaceTypes t = let fun copyId(TypeId{idKind=Bound{ offset, ...}, ...}) = SOME(mapTypeIds offset) | copyId _ = NONE fun replaceTypeConstrs tcon = copyTypeConstr (tcon, copyId, fn x => x, fn s => s) in copyType(t, fn tv=>tv, replaceTypeConstrs) end fun makeDecs (CoreValue(Value{class, name, typeOf, locations, access, ...}), (addr, { fixes, values, structures, signatures, functors, types } )) = let (* Extract the value from the result vector except if we have a type-dependent function e.g. PolyML.print where we must use the type-dependent version. *) val newAccess = case access of Overloaded _ => access | _ => Global(mkInd (addr, results)) (* Replace the typeIDs. *) val newVal = Value{class=class, name=name, typeOf=replaceTypes typeOf, access=newAccess, locations=locations, references = NONE, instanceTypes=NONE} in (addr+1, { fixes=fixes, values=(name, newVal) :: values, structures=structures, signatures=signatures, functors=functors, types=types } ) end | makeDecs (CoreStruct dec, (addr, {fixes, values, structures, signatures, functors, types})) = (* If we open a structure we've created in the same "program" we may have a non-global substructure. We have to process any structures and also map any type IDs. *) let local val Signatures { name, locations, typeIdMap, tab, ...} = structSignat dec in val resultSig = makeSignature(name, tab, 0, locations, composeMaps(typeIdMap, mapTypeIds), []) end val strName = structName dec val newStruct = Struct { name = strName, signat = resultSig, access = Global(mkInd (addr, results)), locations = structLocations dec } in (addr+1, { fixes=fixes, values=values, structures=(strName, newStruct) :: structures, signatures=signatures, functors=functors, types=types } ) end | makeDecs (CoreFix pair, (addr, {fixes, values, structures, signatures, functors, types})) = (addr, { fixes=pair :: fixes, values=values, structures=structures, signatures=signatures, functors=functors, types=types } ) | makeDecs (CoreType (TypeConstrSet(tc, constrs)), (addr, {fixes, values, structures, signatures, functors, types})) = let fun loadConstr(Value{class, name, typeOf, locations, ...}, (addr, others)) = let val newAccess = Global(mkInd (addr, results)) (* Don't bother replacing the type ID here. fullCopyDatatype will do it. *) val newConstr = Value{class=class, name=name, typeOf=typeOf, access=newAccess, locations=locations, references = NONE, instanceTypes=NONE} in (addr+1, others @ [newConstr]) end val (nextAddr, newConstrs) = List.foldl loadConstr (addr, []) constrs val copiedTC = fullCopyDatatype(TypeConstrSet(tc, newConstrs), mapTypeIds, "") val newName = #second(splitString(tcName tc)) in (nextAddr, { fixes=fixes, values=values, structures=structures, signatures=signatures, functors=functors, types=(newName, copiedTC) :: types } ) end in List.foldl makeDecs args vars end fun extractTopDec(str, (addr, env as { fixes, values, structures, signatures, functors, types }, nIds, mapPrevTypIds)) = case str of StrDec(str, ref typeIds) => let (* Create new Free IDs for top-level IDs. *) fun loadId(TypeId{idKind=Bound{eqType, arity, ...}, description, ...}, (n, ids)) = let val newId = makeFreeId(arity, Global(mkInd(n, results)), pling eqType, description) in (n+1, newId :: ids) end | loadId _ = raise InternalError "Not Bound" (* Construct the IDs and reverse the list so the first ID is first*) val (newAddr, mappedIds) = List.foldl loadId (addr, []) typeIds val idMap = Vector.fromList mappedIds fun mapTypeIds n = if n < nIds then mapPrevTypIds n else Vector.sub(idMap, n-nIds) val (resAddr, resEnv) = extractStruct (str, mapTypeIds, (newAddr, env)) in (resAddr, resEnv, nIds + Vector.length idMap, mapTypeIds) end | FunctorDec (structList : functorBind list, _) => let (* Get the functor values. *) fun extractFunctorBind ({name, valRef, ...}: functorBind, (addr, funcs)) = let val code = mkInd (addr, results) val func = valOf(!valRef) (* We need to convert any references to typeIDs created in strdecs in the same "program". *) (* The result signature shares with the argument so we only copy IDs less than the min for the argument signature. *) val Functor {result=fnResult, name=functorName, locations=functorLocations, arg=fnArg as Struct{name = fnArgName, signat=fnArgSig, ...}, ...} = func local val Signatures { name, tab, typeIdMap, boundIds, firstBoundIndex, locations, ... } = fnArgSig fun newMap n = if n < firstBoundIndex then mapPrevTypIds n else List.nth(boundIds, n-firstBoundIndex) in val functorArgSig = makeSignature(name, tab, firstBoundIndex, locations, composeMaps(typeIdMap, newMap), boundIds) val copiedArg = Struct{name=fnArgName, signat=functorArgSig, access=structAccess fnArg, locations=structLocations fnArg} end local val Signatures { name, tab, typeIdMap, boundIds, firstBoundIndex, locations, ... } = fnResult val Signatures { boundIds=argBoundIds, firstBoundIndex=argMinTypes, ...} = functorArgSig fun newMap n = if n >= firstBoundIndex then List.nth(boundIds, n-firstBoundIndex) else if n >= argMinTypes then case List.nth(argBoundIds, n-argMinTypes) of (* Add the argument structure name onto the name of type IDs in the argument. *) TypeId{ access, idKind, description={location, name, description}} => TypeId { access=access, idKind=idKind, description= { location=location, description=description, name=if fnArgName = "" then name else fnArgName^"."^name } } else mapPrevTypIds n in val functorSigResult = makeSignature(name, tab, firstBoundIndex, locations, composeMaps(typeIdMap, newMap), boundIds) end val funcTree = makeFunctor(functorName, copiedArg, functorSigResult, makeGlobal code, functorLocations) in (addr + 1, (name, funcTree) :: funcs) end val (newAddr, newfunctors ) = List.foldl extractFunctorBind (addr, functors) structList in (newAddr, { functors=newfunctors, fixes=fixes, values=values, signatures=signatures, structures=structures, types=types }, nIds, mapPrevTypIds) end | SignatureDec (structList : sigBind list, _) => let (* We need to convert any references to typeIDs created in strdecs in the same "program". *) fun copySignature fnSig = let val Signatures { name, tab, typeIdMap, firstBoundIndex, boundIds, locations, ... } = fnSig fun mapIDs n = if n < firstBoundIndex then mapPrevTypIds n else List.nth(boundIds, n-firstBoundIndex) in makeSignature(name, tab, firstBoundIndex, locations, composeMaps(typeIdMap, mapIDs), boundIds) end val newSigs = List.map (fn ({sigRef=ref s, name, ...}: sigBind) => (name, copySignature s)) structList in (addr, { fixes=fixes, values=values, structures=structures, signatures=newSigs @ signatures, functors=functors, types=types }, nIds, mapPrevTypIds) end val empty = { fixes=[], values=[], structures=[], functors=[], types=[], signatures=[] } val (_, result, _, _) = List.foldl extractTopDec (0, empty, 0, fn _ => raise Subscript) strs; (* The entries in "result" are in reverse order of declaration and may contain duplicates. We need to reverse and filter the lists so that we end up with the lists in order and with duplicates removed. *) fun revFilter result [] = result | revFilter result ((nameValue as (name, _)) ::rest) = let (* Remove any entries further down the list if they have the same name. *) val filtered = List.filter (fn (n,_) => name <> n) rest in revFilter (nameValue :: result) filtered end in { fixes=revFilter [] (#fixes result), values=revFilter [] (#values result), structures=revFilter [] (#structures result), functors=revFilter [] (#functors result), types=revFilter [] (#types result), signatures=revFilter [] (#signatures result) } end (* pass4Structs *) structure Sharing = struct type structDec = structDec type structValue = structValue type structVals = structVals type types = types type parsetree = parsetree type lexan = lexan type pretty = pretty type values = values type typeConstrSet = typeConstrSet type codetree = codetree type signatures = signatures type functors = functors type env = env type sigBind = sigBind and functorBind = functorBind and structBind = structBind type machineWord = machineWord type fixStatus = fixStatus type topdec = topdec type program = program type typeParsetree = typeParsetree type formalArgStruct= formalArgStruct type ptProperties = ptProperties type structSigBind = structSigBind type typeVarForm = typeVarForm type sigs = sigs end end; polyml-5.6/mlsource/MLCompiler/STRUCTVALSIG.sml000066400000000000000000000250451265146633400212230ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature STRUCTVALSIG = sig type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val inBasis: location type codetree and level type univTable (* Types *) datatype 'a possRef = FrozenRef of 'a | VariableRef of 'a ref val pling: 'a possRef -> 'a val updatePR: 'a possRef * 'a -> unit (* Standard type constructors. *) type typeVarForm type uniqueId type typeIdDescription = { location: location, name: string, description: string } type references = { exportedRef: bool ref, localRef: location list ref, recursiveRef: (location * string) list ref } option val makeRef: unit -> references datatype typeId = TypeId of { access: valAccess, description: typeIdDescription, idKind: typeIdKind } and typeIdKind = Free of { uid: uniqueId, allowUpdate: bool, arity: int } | Bound of { offset: int, eqType: bool possRef, isDatatype: bool, arity: int } | TypeFn of typeVarForm list * types (* A type is the union of these different cases. *) and types = TypeVar of typeVarForm | TypeConstruction of { name: string, constr: typeConstrs, args: types list, locations: locationProp list } | FunctionType of { arg: types, result: types } | LabelledType of labelledRec | OverloadSet of { typeset: typeConstrs list } | BadType | EmptyType and typeConstrs = TypeConstrs of { name: string, identifier: typeId, locations: locationProp list (* Location of declaration *) } and labelFieldList = FieldList of string list * bool (* True if this is frozen *) | FlexibleList of labelFieldList ref and valAccess = Global of codetree | Local of { addr: int ref, level: level ref } | Selected of { addr: int, base: structVals } | Formal of int | Overloaded of typeDependent (* Values only. *) (* Structures. *) and structVals = Struct of { name: string, signat: signatures, access: valAccess, locations: locationProp list } and signatures = Signatures of { name: string, tab: univTable, typeIdMap: int -> typeId, firstBoundIndex: int, boundIds: typeId list, locations: locationProp list } and functors = Functor of { name: string, arg: structVals, result: signatures, access: valAccess, locations: locationProp list } (* Values. *) and typeDependent = Print | GetPretty | MakeString | AddPretty | Equal | NotEqual | AddOverload | TypeDep | GetLocation and values = Value of { name: string, typeOf: types, access: valAccess, class: valueClass, locations: locationProp list, references: references, instanceTypes: types list ref option } (* Classes of values. *) and valueClass = ValBound | PattBound | Exception | Constructor of { nullary: bool, ofConstrs: int } (* Location properties. A value may have some or all of these. *) and locationProp = DeclaredAt of location | OpenedAt of location | StructureAt of location | SequenceNo of int withtype labelledRec = { (* Fields actually present in this record. If this was flexible at some stage there may be extra fields listed in the full field list. *) recList: { name: string, typeof: types } list, (* The names of all the fields including extra fields. *) fullList: labelFieldList } (* type identifiers. *) val isEquality: typeId -> bool val offsetId: typeId -> int val idAccess: typeId -> valAccess val sameTypeId: typeId * typeId -> bool val setEquality: typeId * bool -> unit val basisDescription: string -> typeIdDescription val makeFreeId: int * valAccess * bool * typeIdDescription -> typeId val makeFreeIdEqUpdate: int * valAccess * bool * typeIdDescription -> typeId val makeBoundId: int * valAccess * int * bool * bool * typeIdDescription -> typeId val makeBoundIdWithEqUpdate: int * valAccess * int * bool * bool * typeIdDescription -> typeId val makeTypeFunction: typeIdDescription * (typeVarForm list * types) -> typeId (* Types *) val badType: types val emptyType: types val isBad: types -> bool val isEmpty: types -> bool val recordFields : labelledRec -> string list val recordIsFrozen : labelledRec -> bool val tcName: typeConstrs -> string val tcArity: typeConstrs -> int val tcEquality: typeConstrs -> bool val tcSetEquality: typeConstrs * bool -> unit val tcIdentifier: typeConstrs -> typeId val tcLocations: typeConstrs -> locationProp list val tcIsAbbreviation: typeConstrs -> bool val makeTypeConstructor: string * typeId * locationProp list -> typeConstrs datatype typeConstrSet = (* A type constructor with its, possible, value constructors. *) TypeConstrSet of typeConstrs * values list val tsConstr: typeConstrSet -> typeConstrs val tsConstructors: typeConstrSet -> values list val tvLevel: typeVarForm -> int val tvEquality: typeVarForm -> bool val tvPrintity: typeVarForm -> bool val tvNonUnifiable: typeVarForm -> bool val tvValue: typeVarForm -> types val tvSetValue: typeVarForm * types -> unit val sameTv: typeVarForm * typeVarForm -> bool val makeTv: {value: types, level: int, equality: bool, nonunifiable: bool, printable: bool } -> typeVarForm val generalisable: int (* Access to values, structures etc. *) val isGlobal: valAccess -> bool val isLocal: valAccess -> bool val isSelected: valAccess -> bool val isFormal: valAccess -> bool val makeGlobal: codetree -> valAccess val makeLocal: unit -> valAccess val makeSelected: int * structVals -> valAccess val makeFormal: int -> valAccess val vaGlobal: valAccess -> codetree val vaFormal: valAccess -> int val vaLocal: valAccess -> { addr: int ref, level: level ref } val vaSelected: valAccess -> { addr: int, base: structVals } val makeEmptyGlobal: string -> structVals val makeGlobalStruct: string * signatures * codetree * locationProp list -> structVals val makeLocalStruct: string * signatures * locationProp list -> structVals val makeFormalStruct: string * signatures * int * locationProp list -> structVals val makeSelectedStruct: structVals * structVals * locationProp list -> structVals (* Functors *) val makeFunctor: string * structVals * signatures * valAccess * locationProp list -> functors (* Signatures *) val makeSignatureTable: unit -> univTable val makeSignature: string * univTable * int * locationProp list * (int -> typeId) * typeId list -> signatures (* Values. *) val valName: values -> string val valTypeOf: values -> types val undefinedValue: values val isUndefinedValue: values -> bool val isConstructor: values -> bool val isValueConstructor: values -> bool val makeOverloaded: string * types * typeDependent -> values val makeValueConstr: string * types * bool * int * valAccess * locationProp list -> values (* Infix status *) datatype infixity = Infix of int | InfixR of int | Nonfix datatype fixStatus = FixStatus of string * infixity datatype env = Env of { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allValNames: unit -> string list } val makeEnv: univTable -> env val valueVar: values Universal.tag val typeConstrVar: typeConstrSet Universal.tag val fixVar: fixStatus Universal.tag val structVar: structVals Universal.tag val signatureVar: signatures Universal.tag val functorVar: functors Universal.tag (* Types that can be shared. *) structure Sharing: sig type codetree = codetree and signatures = signatures and types = types and values = values and typeId = typeId and structVals = structVals and valAccess = valAccess and typeConstrs= typeConstrs and typeConstrSet=typeConstrSet and env = env and univTable = univTable and fixStatus = fixStatus and infixity = infixity and functors = functors and locationProp = locationProp and typeVarForm = typeVarForm and level = level end end; polyml-5.6/mlsource/MLCompiler/STRUCT_VALS.ML000066400000000000000000000652231265146633400206610ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009, 2012, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Global and Local values. Author: Dave Matthews,Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* This type contains the basic structures of global and local declarations. Putting the global declarations in a separate type allows us to install a new compiler (particularly to fix bugs) and still be compatible with declarations made with the old compiler. It is also convenient to put local values in here as well. *) functor STRUCT_VALS ( structure CODETREE : CODETREESIG where type machineWord = Address.machineWord (*****************************************************************************) (* UNIVERSALTABLE *) (*****************************************************************************) structure UNIVERSALTABLE : sig type 'a tag = 'a Universal.tag; type univTable type universal = Universal.universal val makeUnivTable: unit -> univTable; val univEnter: univTable * 'a tag * string * 'a -> unit; val univLookup: univTable * 'a tag * string -> 'a option; (* Freeze a mutable table so it is immutable. *) val univFreeze: univTable -> univTable val fold: (string * universal * 'a -> 'a) -> 'a -> univTable -> 'a end; structure PRETTY: PRETTYSIG (* Temporary addition. *) ) :> STRUCTVALSIG where type codetree = CODETREE.codetree and type univTable = UNIVERSALTABLE.univTable and type level = CODETREE.level = (*****************************************************************************) (* STRUCTVALS functor body *) (*****************************************************************************) struct open CODETREE; open Misc; open Universal; open UNIVERSALTABLE; (* Location for declarations. *) type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } (* The idea of this is reduce the number of mutable objects. *) datatype 'a possRef = FrozenRef of 'a | VariableRef of 'a ref fun pling(FrozenRef x) = x | pling(VariableRef(ref x)) = x fun updatePR(VariableRef r, x) = r := x | updatePR(FrozenRef _, _) = raise Fail "Assignment to frozen ref" (* References to identifiers. exportedRef is set to true if the identifier is exported to the global environment or to a structure. localRef contains the list of local uses. recursiveRef contains a list of (mutually) recursive references together with the name of the function that refers to this. It is used when computing whether a recursive function is actually refered to from elsewhere. This is an option type because this is used only within local identifiers. *) type references = { exportedRef: bool ref, localRef: location list ref, recursiveRef: (location * string) list ref } option fun makeRef(): references = SOME { exportedRef = ref false, localRef = ref nil, recursiveRef=ref nil } (* typeIds are used to distinguish between concrete types. Two types that share will have the same identifier. If the identifiers are different they are different types. There are three classes of type identifier. Free identifiers are used for types in the global environment. Bound identifiers occur in signatures, functors and while compiling structures. Type functions arise from type bindings (type abbreviations) or from "where type" definitions in signatures. The type identifier also contains the equality attribute. In ML97 only types have these identifiers. In ML90 these were also needed for structures. Free and Bound IDs contain information to find the equality and value-printing functions. *) type typeIdDescription = { location: location, name: string, description: string } datatype typeId = TypeId of { access: valAccess, description: typeIdDescription, idKind: typeIdKind } and typeIdKind = Free of { uid: uniqueId, allowUpdate: bool, arity: int } | Bound of { offset: int, eqType: bool possRef, isDatatype: bool, arity: int } | TypeFn of typeVarForm list * types (* A type is the union of these different cases. *) and types = TypeVar of typeVarForm | TypeConstruction of { name: string, constr: typeConstrs, args: types list, locations: locationProp list } | FunctionType of { arg: types, result: types } | LabelledType of labelledRec | OverloadSet of { typeset: typeConstrs list } | BadType | EmptyType and typeConstrs = TypeConstrs of { name: string, identifier: typeId, locations: locationProp list (* Location of declaration *) } and typeConstrSet = (* A type constructor with its, possible, value constructors. *) TypeConstrSet of typeConstrs * values list and labelFieldList = FieldList of string list * bool (* True if this is frozen *) | FlexibleList of labelFieldList ref (* Access to a value, structure or functor. *) and valAccess = Global of codetree | Local of { addr: int ref, level: level ref } | Selected of { addr: int, base: structVals } | Formal of int | Overloaded of typeDependent (* Values only. *) (* Structures. *) and structVals = Struct of { name: string, signat: signatures, access: valAccess, locations: locationProp list } (* Signatures. The representation of a signature deserves a bit of explanation. A signature is an environment: a set of values, type constructors and sub-structures. Behind the types associated with the type constructors and values are what the semantics calls "type names" but are referred to in the Poly/ML code as type-ids to avoid confusion with the text name of a type constructor. The same signature may be bound to a signature identifier, used as an argument to a functor, the result of a functor or the signature of a structure. The environment is the same in each case; what is different is the type names. To avoid rebuilding the environment for each case the same environment is used but with different sets of typeIdMap, firstBoundIndex and boundIds. typeIdMap maps the "offset" of any bound id found in the environment to a type-id. For structures the result will always be a free id and boundIds will be empty. In other cases it may map to either a free id, perhaps as the result of "where type" constraint, or to a bound id. Sharing constraints will cause different bound ids in the environment to map to the same resulting bound id. Normally, firstBoundIndex will be zero and boundIds will be the set of bound ids that can be produced by typeIdMap. The exception is the result signature of a functor. In that case typeIdMap may return bound Ids in the set of the boundIds for the argument to the functor, which will have offsets >= 0 and < firstBoundIndex or in the set for the result of the functor with offsets >= firstBoundIndex and < firstBoundIndex+length boundIds. When the functor is applied the typeIdMap for the structure that is produced maps the first set to the free ids of the actual argument and the maps the second set to new, unique free ids. *) and signatures = Signatures of { name: string, tab: univTable, typeIdMap: int -> typeId, firstBoundIndex: int, boundIds: typeId list, locations: locationProp list } and functors = Functor of { name: string, arg: structVals, result: signatures, access: valAccess, locations: locationProp list } (* Values. *) (* The overloaded functions divide up into basically two groups: Those =, <>, print and makestring which are infinitely overloaded and those *, + etc which are overloaded on a limited range of types. *) and typeDependent = Print | GetPretty | MakeString | AddPretty | Equal | NotEqual | AddOverload | TypeDep | GetLocation and values = Value of { name: string, typeOf: types, access: valAccess, class: valueClass, locations: locationProp list, (* Location of declaration *) references: references, instanceTypes: types list ref option (* Instance types for local variables. *) } (* Classes of values. *) and valueClass = ValBound | PattBound | Exception | Constructor of { nullary: bool, (* True if this is a single value (e.g. "nil") rather than a function. *) ofConstrs: int (* Total number of constructors in the datatype. *) } and locationProp = DeclaredAt of location | OpenedAt of location | StructureAt of location | SequenceNo of int withtype uniqueId = bool ref (* We use a ref here both because we can then set equality if we need but also because it allows us to create a unique Id. *) and typeVarForm = { value: types ref, encoding: Word.word } and labelledRec = { (* Fields actually present in this record. If this was flexible at some stage there may be extra fields listed in the full field list. *) recList: { name: string, typeof: types } list, (* The names of all the fields including extra fields. *) fullList: labelFieldList } (* A set of type contructors. This is used only during the compilation process and represents the set of possible types which may occur. It functions in much the same way as a type variable. Because we only allow overloading on monomorphic type constructors such as "int" and "word" we can restrict the set to containing only type constructors rather than general types. This overload set was added for ML 97 because ML 97, unlike ML 90, defaults overloaded operators and constants if unification does not result in a single type being found. The overload set is used in a similar way to a flexible record and will always be pointed at by a type variable so that the set can be replaced by a single type construction if the unification reduces to a single type. *) and overloadSetForm = { typeset: typeConstrs list } (* Identifiers *) fun makeFreeId(arity, access, eq, desc) = TypeId { access=access, description = desc, idKind = Free {uid = ref eq, allowUpdate=false, arity=arity}} (* At the moment the only reason for distinguishing makeFreeId and makeFreeIdEqUpdate is that it allows us to check that we're actually permitting update when needed. *) fun makeFreeIdEqUpdate(arity, access, eq, desc) = TypeId { access=access, description = desc, idKind = Free {uid = ref eq, allowUpdate=true, arity=arity}} fun makeBoundId (arity, access, n, eq, isdt, desc) = TypeId { access=access, description = desc, idKind = Bound{offset=n, eqType=FrozenRef eq, isDatatype = isdt, arity=arity}} (* Within the body of a functor we make bound stamps but may need to set the equality attribute. *) fun makeBoundIdWithEqUpdate (arity, access, n, eq, isdt, desc) = TypeId { access=access, description = desc, idKind = Bound{offset=n, eqType=VariableRef(ref eq), isDatatype = isdt, arity=arity}} (* Type functions currently always have Free ids. *) fun makeTypeFunction(desc, typeFn) = TypeId { access=Global CodeZero, description = desc, idKind = TypeFn typeFn}; (* Find the number - assuming it is bound. *) fun offsetId (TypeId{idKind=Bound {offset, ...}, ...}) = offset | offsetId _ = raise InternalError "offsetId: not a Bound"; (* Are two type constructors the same? *) fun sameTypeId (TypeId{idKind=Free{uid = a, ...}, ...}, TypeId{idKind=Free {uid = b, ...}, ...}) = a = b | sameTypeId (TypeId{idKind=Bound{offset=a, ...}, ...}, TypeId{idKind=Bound{offset=b, ...}, ...}) = a = b | sameTypeId _ = false (* Includes type functions. *) fun idAccess (TypeId { access, ...}) = access fun isEquality (TypeId { idKind = Free{uid = ref eq, ...}, ...}) = eq | isEquality (TypeId { idKind = Bound{eqType, ...}, ...}) = pling eqType | isEquality (TypeId { idKind = TypeFn _, ...}) = raise InternalError "isEquality: TypeFn" (* Set the equality property. Currently, free IDs are used for abstypes and datatypes that are local to a function as well as the usual case of using them for top-level types. *) fun setEquality(TypeId{idKind = Free{uid, allowUpdate=true, ...}, ...}, eq) = uid := eq | setEquality(TypeId{idKind = Bound{eqType=VariableRef id, ...}, ...}, eq) = id := eq | setEquality _ = raise InternalError "setEquality: can't set equality attribute" (* Signatures: Used for both signatures of local structures and for global structures (name spaces). Strictly signatures do not contain fix-status functors or signatures but as we use these structures for top-level name-spaces we have to have tables for these. *) val makeSignatureTable = makeUnivTable (* Make a signature, freezing the table. *) fun makeSignature (name, table, fbi, locations, typeIdMap, boundIds) = Signatures { name = name, tab = univFreeze table, typeIdMap = typeIdMap, firstBoundIndex = fbi, boundIds = boundIds, locations = locations } (* Types. *) (* Level at which type is generalisable. *) val generalisable = 9999; (* Destructors, constructors and predicates for types *) val emptyType = EmptyType; val badType = BadType; fun isEmpty EmptyType = true | isEmpty _ = false; fun isBad BadType = true | isBad _ = false; fun makeValueConstr (name, typeOf, nullary, constrs, access, locations) : values = Value { name = name, typeOf = typeOf, access = access, class = Constructor { nullary = nullary, ofConstrs = constrs }, locations = locations, references = NONE, instanceTypes = NONE }; (* A type variable is implemented as a true variable i.e. it can be assigned a particular type when it is unified. Initially it is set to EmptyType which represents an unset type variable. When it is unified with a type it is set to point to the type it has been unified with. Type variables associated with variables have level set to the nesting level, others have level set to "generalisable". If two type variables are united their levels are set to the lower of the two. If level is not "generalisable" the type variable is not generalisable. This is needed to deal with cases like fn a => let val x = a in x end and fn a => let val x = hd a in x end The level is set to "generalisable" at the end of the block with that level. Actually ``level'' is not actually changed - instead the type variable is assigned to a new variable with the correct level, since only the last variable in a sequence is looked at. ``equality'' is true if this is an equality variable e.g. ''a. ``nonunifiable'' is true for type variables introduced explicitly or type variables in signatures. Such type variables can have their level changed but cannot be unified with other types, with other nonunifiable type variables or with equality variables (unless it is already an equality variable). ``weak'' is true if this is an imperative type variable e.g. '_a *) fun sameTv (a : typeVarForm, b : typeVarForm) : bool = #value a = #value b; (* If the same ref it must be the same *) local open Word infix 8 >> << infix 7 andb infix 6 orb in fun makeTv {value : types, level, equality, nonunifiable, printable} : typeVarForm = { value = ref value, (* REF HOTSPOT - 400 *) encoding = (fromInt level << 0w3) orb (if equality then 0w4 else 0w0) orb (if nonunifiable then 0w2 else 0w0) orb (if printable then 0w1 else 0w0)} fun tvSetValue ({ value, ...} : typeVarForm, t : types) = value := t fun tvValue ({value = ref v, ...} : typeVarForm) : types = v fun tvLevel ({encoding, ...} : typeVarForm) : int = Word.toInt(encoding >> 0w3) fun tvEquality ({encoding, ...} : typeVarForm) = encoding andb 0w4 <> 0w0 fun tvNonUnifiable ({encoding, ...} : typeVarForm) = encoding andb 0w2 <> 0w0 fun tvPrintity ({encoding, ...} : typeVarForm) = encoding andb 0w1 <> 0w0 end local fun follow (FlexibleList(ref r)) = follow r | follow (FieldList c) = c in fun recordIsFrozen { fullList, ...} = #2 (follow fullList) and recordFields {fullList, ...} = #1 (follow fullList) end (* Type constructors are identifiers which take zero or more types and yield a type as result. Their main property is that two type constructors can be unified iff they are the same constructor. Another use for constructors is for aliasing types. In this case "typeVars" points to a list of type variables which are used in the "equivalent" type. ``equality'' is a flag indicating if the values can be tested for equality. *) fun tcName (TypeConstrs {name,...}) = name fun tcIdentifier (TypeConstrs {identifier,...}) = identifier fun tcLocations (TypeConstrs {locations, ...}) = locations (* Is this a type function? N.B. It is possible, though unlikely, that it is a datatype as well i.e. has value constructors. *) fun tcIsAbbreviation (TypeConstrs {identifier = TypeId{idKind = TypeFn _, ...},...}) = true | tcIsAbbreviation _ = false fun tcArity(TypeConstrs {identifier=TypeId{idKind=TypeFn(args, _),...}, ...}) = length args | tcArity(TypeConstrs {identifier=TypeId{idKind=Bound{arity, ...},...}, ...}) = arity | tcArity(TypeConstrs {identifier=TypeId{idKind=Free{arity, ...},...}, ...}) = arity (* Equality and "equivalence" are now properties of the type id. Retain these functions for the moment. *) val tcEquality = isEquality o tcIdentifier; fun tcSetEquality(tc, eq) = setEquality(tcIdentifier tc, eq) (* Construct a type constructor. *) fun makeTypeConstructor (name, uid, locations) = TypeConstrs { name = name, identifier = uid, locations = locations } fun tsConstr(TypeConstrSet(ts, _)) = ts and tsConstructors(TypeConstrSet(_, tvs)) = tvs val inBasis = { file = "Standard Basis", startLine = 0, startPosition = 0, endLine = 0, endPosition = 0} fun basisDescription name = { location = inBasis, description = "In Basis", name = name } (* Infix status. *) datatype infixity = Infix of int | InfixR of int | Nonfix datatype fixStatus = FixStatus of string * infixity fun isGlobal (Global _) = true | isGlobal _ = false; fun isLocal (Local _) = true | isLocal _ = false; fun isSelected (Selected _) = true | isSelected _ = false; fun isFormal (Formal _) = true | isFormal _ = false; fun vaGlobal (Global x) = x | vaGlobal _ = raise Match; fun vaLocal (Local x) = x | vaLocal _ = raise Match; fun vaSelected (Selected x) = x | vaSelected _ = raise Match; fun vaFormal (Formal x) = x | vaFormal _ = raise Match; val makeGlobal = Global; val makeFormal = Formal; fun makeLocal () = Local { addr = ref ~1 (* Invalid addr - catch errors *), level = ref baseLevel } fun makeSelected (addr, base) = Selected { addr = addr, base = base }; fun makeStruct (name, signat, access, locations) = Struct { name = name, signat = signat, access = access, locations = locations } (* Global structure *) fun makeGlobalStruct (name, signat, code, locations) = makeStruct (name, signat, makeGlobal code, locations) (* These are used in INITIALISE so must be mutable. *) fun makeEmptyGlobal name = makeStruct (name, Signatures { name = "", tab = makeUnivTable(), typeIdMap = fn _ => raise Subscript, firstBoundIndex = 0, boundIds = [], locations = [DeclaredAt inBasis] }, makeGlobal CodeZero, [DeclaredAt inBasis]) (* Local structure. *) fun makeLocalStruct (name, signat, location) = makeStruct (name, signat, makeLocal (), location); (* Structure in a local structure or a functor argument. *) fun makeSelectedStruct (selected as Struct{access, name, signat, locations, ...}, base, openLocs) = case access of Formal sel => makeStruct(name, signat, makeSelected (sel, base), openLocs @ locations) | Global code => (* Need to add the locations. *) makeStruct(name, signat, Global code, openLocs @ locations) | _ => selected fun makeFormalStruct (name, signat, addr, location) = makeStruct (name, signat, makeFormal addr, location); (* Values. *) fun makeOverloaded (name, typeOf, operation) : values = Value{ name = name, typeOf = typeOf, access = Overloaded operation, class = ValBound, locations = [DeclaredAt inBasis], references = NONE, instanceTypes = NONE}; val undefinedValue = Value{ name = "", typeOf = BadType, access = Global CodeZero, class = ValBound, locations = [DeclaredAt inBasis], references = NONE, instanceTypes = NONE }; fun isUndefinedValue(Value{name = "", ...}) = true | isUndefinedValue _ = false fun valName (Value{name, ...}) = name fun valTypeOf (Value{typeOf, ...}) = typeOf fun isConstructor (Value{class=Constructor _, ...}) = true | isConstructor (Value{class=Exception, ...}) = true | isConstructor _ = false; fun isValueConstructor (Value{class=Constructor _, ...}) = true | isValueConstructor _ = false; (* Functor value. *) fun makeFunctor (name, arg, result, access, locations) = Functor { name = name, arg = arg, result = result, access = access, locations = locations } val valueVar: values tag = tag(); val typeConstrVar: typeConstrSet tag = tag(); val fixVar: fixStatus tag = tag(); val structVar: structVals tag = tag(); val signatureVar: signatures tag = tag(); val functorVar: functors tag = tag(); fun makeLook (t:'a tag) table n = univLookup (table, t, n) and makeEnter (t:'a tag) table (n, v) = univEnter (table, t, n, v) and makeAllNames (t:'a tag) table () = UNIVERSALTABLE.fold (fn (s, u, l) => if Universal.tagIs t u then s :: l else l) [] table datatype env = Env of { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allValNames: unit -> string list } (* This creates functions for entering and looking up names. *) fun makeEnv tab = Env { lookupVal = makeLook valueVar tab, lookupType = makeLook typeConstrVar tab, lookupFix = makeLook fixVar tab, lookupStruct = makeLook structVar tab, lookupSig = makeLook signatureVar tab, lookupFunct = makeLook functorVar tab, enterVal = makeEnter valueVar tab, enterType = makeEnter typeConstrVar tab, enterFix = makeEnter fixVar tab, enterStruct = makeEnter structVar tab, enterSig = makeEnter signatureVar tab, enterFunct = makeEnter functorVar tab, allValNames = makeAllNames valueVar tab } structure Sharing = struct type codetree = codetree and signatures = signatures and types = types and values = values and typeId = typeId and structVals = structVals and valAccess = valAccess and typeConstrs= typeConstrs and typeConstrSet=typeConstrSet and env = env and univTable = univTable and fixStatus = fixStatus and infixity = infixity and functors = functors and locationProp = locationProp and typeVarForm = typeVarForm and level = level end end (* STRUCTVALS *); polyml-5.6/mlsource/MLCompiler/SignaturesStruct.sml000066400000000000000000000025251265146633400226200ustar00rootroot00000000000000(* Copyright David C. J. Matthews 2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure SignaturesStruct = SIGNATURES( structure LEX = Lex structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure TYPETREE = TypeTree structure PARSETREE = ParseTree structure UTILITIES = Utilities structure PRETTY = Pretty structure UNIVERSALTABLE = UniversalTable structure EXPORTTREE = ExportTreeStruct structure COPIER = CopierStruct structure DEBUG = Debug structure VALUEOPS = ValueOps structure UTILITIES = Utilities ); polyml-5.6/mlsource/MLCompiler/Skips.ML000066400000000000000000000017211265146633400200720ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Skips = SKIPS_ ( structure SYMBOLS = Symbols structure LEX = Lex structure SYMSET = SymSet ); polyml-5.6/mlsource/MLCompiler/StructVals.ML000066400000000000000000000017661265146633400211240ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure StructVals = STRUCT_VALS ( structure CODETREE = CodeTree structure UNIVERSALTABLE = UniversalTable structure PRETTY = Pretty ); polyml-5.6/mlsource/MLCompiler/Structures.ML000066400000000000000000000027241265146633400211700ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Structures = STRUCTURES_ ( structure LEX = Lex structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure VALUEOPS = ValueOps structure TYPETREE = TypeTree structure PARSETREE = ParseTree structure UTILITIES = Utilities structure PRETTY = Pretty structure UNIVERSALTABLE = UniversalTable structure DEBUG = Debug structure DEBUGGER = Debugger structure EXPORTTREE = ExportTreeStruct structure COPIER = CopierStruct structure TYPEIDCODE = TypeIDCodeStruct structure SIGNATURES = SignaturesStruct structure DEBUGGER = Debugger ); polyml-5.6/mlsource/MLCompiler/SymSet.ML000066400000000000000000000175001265146633400202270ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Cleaned up: David C.J. Matthews 2010 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Symbols Sets. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) (* These symbol sets are used in the parsing process. The only way they are actually used is the "inside" function which tests if a symbol is in the set. The representation used minimises the memory needed to implement each set union (++ operator). *) structure SymSet :> SymsetSig where type sys = Symbols.sys = (*****************************************************************************) (* SYMSET functor body *) (*****************************************************************************) struct open Symbols datatype symset = Set of sys -> bool val empty = Set (fn _ => false); infix 6 ++; (* ... fun plus (Set f, Set g) = Set (fn x => f x orelse g x); ... *) (* Experiment! *) fun (Set f) ++ (Set g) = Set (fn x => g x orelse f x); infix 5 inside fun sym inside (Set s) = s sym val abortParse = Set(fn AbortParse => true | _ => false) val ident = Set(fn Ident => true | _ => false) val abstypeSy = Set(fn AbstypeSy => true | _ => false) val andSy = Set(fn AndSy => true | _ => false) val andalsoSy = Set(fn AndalsoSy => true | _ => false) val asSy = Set(fn AsSy => true | _ => false) val caseSy = Set(fn CaseSy => true | _ => false) val datatypeSy = Set(fn DatatypeSy => true | _ => false) val doSy = Set(fn DoSy => true | _ => false) val elseSy = Set(fn ElseSy => true | _ => false) val endSy = Set(fn EndSy => true | _ => false) val exceptionSy = Set(fn ExceptionSy => true | _ => false) val fnSy = Set(fn FnSy => true | _ => false) val funSy = Set(fn FunSy => true | _ => false) val handleSy = Set(fn HandleSy => true | _ => false) val ifSy = Set(fn IfSy => true | _ => false) val inSy = Set(fn InSy => true | _ => false) val infixSy = Set(fn InfixSy => true | _ => false) val infixrSy = Set(fn InfixrSy => true | _ => false) val letSy = Set(fn LetSy => true | _ => false) val localSy = Set(fn LocalSy => true | _ => false) val nonfixSy = Set(fn NonfixSy => true | _ => false) val ofSy = Set(fn OfSy => true | _ => false) val opSy = Set(fn OpSy => true | _ => false) val openSy = Set(fn OpenSy => true | _ => false) val orelseSy = Set(fn OrelseSy => true | _ => false) val raiseSy = Set(fn RaiseSy => true | _ => false) val recSy = Set(fn RecSy => true | _ => false) val thenSy = Set(fn ThenSy => true | _ => false) val typeSy = Set(fn TypeSy => true | _ => false) val valSy = Set(fn ValSy => true | _ => false) val withSy = Set(fn WithSy => true | _ => false) val whileSy = Set(fn WhileSy => true | _ => false) val structureSy = Set(fn StructureSy => true | _ => false) val signatureSy = Set(fn SignatureSy => true | _ => false) val structSy = Set(fn StructSy => true | _ => false) val sigSy = Set(fn SigSy => true | _ => false) val sharingSy = Set(fn SharingSy => true | _ => false) val functorSy = Set(fn FunctorSy => true | _ => false) val withtypeSy = Set(fn WithtypeSy => true | _ => false) val eqtypeSy = Set(fn EqtypeSy => true | _ => false) val includeSy = Set(fn IncludeSy => true | _ => false) val whereSy = Set(fn WhereSy => true | _ => false) val leftParen = Set(fn LeftParen => true | _ => false) val rightParen = Set(fn RightParen => true | _ => false) val leftBrack = Set(fn LeftBrack => true | _ => false) val rightBrack = Set(fn RightBrack => true | _ => false) val comma = Set(fn Comma => true | _ => false) val colon = Set(fn Colon => true | _ => false) val semicolon = Set(fn Semicolon => true | _ => false) val verticalBar = Set(fn VerticalBar => true | _ => false) val equalsSign = Set(fn EqualsSign => true | _ => false) val thickArrow = Set(fn ThickArrow => true | _ => false) val underline = Set(fn Underline => true | _ => false) val typeIdent = Set(fn TypeIdent => true | _ => false) val stringConst = Set(fn StringConst => true | _ => false) val integerConst = Set(fn IntegerConst => true | _ => false) val realConst = Set(fn RealConst => true | _ => false) val wordConst = Set(fn WordConst => true | _ => false) val charConst = Set(fn CharConst => true | _ => false) val asterisk = Set(fn Asterisk => true | _ => false) val arrow = Set(fn Arrow => true | _ => false) val leftCurly = Set(fn LeftCurly => true | _ => false) val rightCurly = Set(fn RightCurly => true | _ => false) val threeDots = Set(fn ThreeDots => true | _ => false) val colonGt = Set(fn ColonGt => true | _ => false) val hashSign = Set(fn HashSign => true | _ => false) val othersy = Set(fn Othersy => true | _ => false) (* Collections of symbol sets for various syntactic elements *) (* Symbols which can be declared as identifiers *) val declarableVarSys = ident ++ asterisk; (* Symbols which can be variables *) val variableSys = declarableVarSys ++ equalsSign; (* Symbols which can be constructors *) val constructorSys = declarableVarSys ++ stringConst ++ integerConst ++ realConst ++ wordConst ++ charConst; (* The symbols which can start an atomic expression *) val startAtomicSys = letSy ++ opSy ++ leftBrack ++ leftParen ++ leftCurly ++ variableSys ++ constructorSys ++ hashSign; (* The symbols which can start a pattern, Note: "=" is not among them. *) (* real constants are not allowed in patterns in ML97. We leave them in and sort it out later. *) val startPatternSys = underline ++ declarableVarSys ++ constructorSys ++ leftParen ++ leftBrack ++ leftCurly ++ opSy; (* The symbols which can start a match *) val startMatchSys = startPatternSys; (* The symbols which can start an expression *) val startExpressionSys = raiseSy ++ ifSy ++ whileSy ++ caseSy ++ fnSy ++ startAtomicSys; (* The symbols which can start a declaration *) val startDecSys = valSy ++ typeSy ++ abstypeSy ++ exceptionSy ++ localSy ++ infixSy ++ infixrSy ++ nonfixSy ++ openSy ++ funSy ++ datatypeSy; (* Symbols which can start a type. *) val startTypeSys = typeIdent ++ ident ++ leftParen ++ leftCurly; (* Symbols which can start a signature. Strictly speaking "sharing" cannot start a signature. *) val startSigSys = datatypeSy ++ typeSy ++ eqtypeSy ++ valSy ++ exceptionSy ++ structureSy ++ sharingSy ++ includeSy; val startTopSys = structureSy ++ functorSy ++ signatureSy ++ startDecSys ++ startExpressionSys end; polyml-5.6/mlsource/MLCompiler/Symbols.ML000066400000000000000000000145741265146633400204430ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Lexical symbols for ML compiler. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 *) structure Symbols : SymbolsSig = struct datatype sys = AbortParse | Ident | AbstypeSy | AndSy | AndalsoSy | AsSy | CaseSy | DatatypeSy | DoSy | ElseSy | EndSy | ExceptionSy | FnSy | FunSy | HandleSy | IfSy | InSy | InfixSy | InfixrSy | LetSy | LocalSy | NonfixSy | OfSy | OpSy | OpenSy | OrelseSy | RaiseSy | RecSy | ThenSy | TypeSy | ValSy | WithSy | WhileSy | LeftParen | RightParen | LeftBrack | RightBrack | Comma | Colon | Semicolon | ThickArrow | VerticalBar | EqualsSign | Underline | TypeIdent | StringConst | IntegerConst | Asterisk | Arrow | RealConst | LeftCurly | RightCurly | ThreeDots | ColonGt | HashSign | StructureSy | SignatureSy | StructSy | SigSy | SharingSy | FunctorSy | WithtypeSy | EqtypeSy | IncludeSy | WhereSy | WordConst | CharConst | Othersy fun repr AbortParse = "\^G" | repr Ident = "" | repr AbstypeSy = "abstype" | repr AndSy = "and" | repr AndalsoSy = "andalso" | repr AsSy = "as" | repr CaseSy = "case" | repr DatatypeSy = "datatype" | repr DoSy = "do" | repr ElseSy = "else" | repr EndSy = "end" | repr ExceptionSy = "exception" | repr FnSy = "fn" | repr FunSy = "fun" | repr HandleSy = "handle" | repr IfSy = "if" | repr InSy = "in" | repr InfixSy = "infix" | repr InfixrSy = "infixr" | repr LetSy = "let" | repr LocalSy = "local" | repr NonfixSy = "nonfix" | repr OfSy = "of" | repr OpSy = "op" | repr OpenSy = "open" | repr OrelseSy = "orelse" | repr RaiseSy = "raise" | repr RecSy = "rec" | repr ThenSy = "then" | repr TypeSy = "type" | repr ValSy = "val" | repr WithSy = "with" | repr WhileSy = "while" | repr LeftParen = "(" | repr RightParen = ")" | repr LeftBrack = "[" | repr RightBrack = "]" | repr Comma = "," | repr Colon = ":" | repr Semicolon = ";" | repr ThickArrow = "=>" | repr VerticalBar = "|" | repr EqualsSign = "=" | repr Underline = "_" | repr TypeIdent = "" | repr StringConst = "" | repr IntegerConst = "" | repr Asterisk = "*" | repr Arrow = "->" | repr RealConst = "" | repr LeftCurly = "{" | repr RightCurly = "}" | repr ThreeDots = "..." | repr ColonGt = ":>" | repr HashSign = "#" | repr StructureSy = "structure" | repr SignatureSy = "signature" | repr StructSy = "struct" | repr SigSy = "sig" | repr SharingSy = "sharing" | repr FunctorSy = "functor" | repr WithtypeSy = "withtype" | repr EqtypeSy = "eqtype" | repr IncludeSy = "include" | repr WhereSy = "where" | repr WordConst = "" | repr CharConst = "" | repr Othersy = "unknown symbol" local open HashTable; val reservedWords = [ AbstypeSy, AndSy, AndalsoSy, AsSy, CaseSy, DatatypeSy, DoSy, ElseSy, EndSy, ExceptionSy, FnSy, FunSy, HandleSy, IfSy, InSy, InfixSy, InfixrSy, LetSy, LocalSy, NonfixSy, OfSy, OpSy, OpenSy, OrelseSy, RaiseSy, RecSy, ThenSy, TypeSy, ValSy, WithSy, WhileSy, StructureSy, SignatureSy, StructSy, SigSy, SharingSy, FunctorSy, WithtypeSy, EqtypeSy, IncludeSy, WhereSy, (* Reserved or special symbols *) Arrow, EqualsSign, ThickArrow, Asterisk, ColonGt, Underline, Colon, VerticalBar, HashSign ] local (* Make table sparse to minimise collisions. *) val table = hashMake (4 * List.length reservedWords); (* Enter each reserved word in the hash table *) val () = List.app (fn n => hashSet (table, repr n, n)) reservedWords in val table = hashFreeze table end in (* Returns the symbol if it is in the table else ident *) fun lookup str = getOpt(hashSub (table, str), Ident); end; end (* Symbols *); polyml-5.6/mlsource/MLCompiler/SymbolsSig.sml000066400000000000000000000040351265146633400213600ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature SymbolsSig = sig datatype sys = AbortParse | Ident | AbstypeSy | AndSy | AndalsoSy | AsSy | CaseSy | DatatypeSy | DoSy | ElseSy | EndSy | ExceptionSy | FnSy | FunSy | HandleSy | IfSy | InSy | InfixSy | InfixrSy | LetSy | LocalSy | NonfixSy | OfSy | OpSy | OpenSy | OrelseSy | RaiseSy | RecSy | ThenSy | TypeSy | ValSy | WithSy | WhileSy | LeftParen | RightParen | LeftBrack | RightBrack | Comma | Colon | Semicolon | ThickArrow | VerticalBar | EqualsSign | Underline | TypeIdent | StringConst | IntegerConst | Asterisk | Arrow | RealConst | LeftCurly | RightCurly | ThreeDots | ColonGt | HashSign | StructureSy | SignatureSy | StructSy | SigSy | SharingSy | FunctorSy | WithtypeSy | EqtypeSy | IncludeSy | WhereSy | WordConst | CharConst | Othersy val repr: sys -> string val lookup: string -> sys end; polyml-5.6/mlsource/MLCompiler/SymsetSig.sml000066400000000000000000000062621265146633400212200ustar00rootroot00000000000000(* Copyright (c) 2013 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature SymsetSig = sig type symset; type sys val inside: sys * symset -> bool; val ++ :symset * symset -> symset; val abortParse: symset; val ident: symset; val abstypeSy: symset; val andSy: symset; val andalsoSy: symset; val asSy: symset; val caseSy: symset; val datatypeSy: symset; val doSy: symset; val elseSy: symset; val endSy: symset; val exceptionSy: symset; val fnSy: symset; val funSy: symset; val handleSy: symset; val ifSy: symset; val inSy: symset; val infixSy: symset; val infixrSy: symset; val letSy: symset; val localSy: symset; val nonfixSy: symset; val ofSy: symset; val opSy: symset; val openSy: symset; val orelseSy: symset; val raiseSy: symset; val recSy: symset; val thenSy: symset; val typeSy: symset; val valSy: symset; val withSy: symset; val whileSy: symset; val leftParen: symset; val rightParen: symset; val leftBrack: symset; val rightBrack: symset; val comma: symset; val colon: symset; val semicolon: symset; val thickArrow: symset; val verticalBar: symset; val equalsSign: symset; val underline: symset; val typeIdent: symset; val stringConst: symset; val integerConst: symset; val asterisk: symset; val arrow: symset; val realConst: symset; val wordConst: symset; val charConst: symset; val leftCurly: symset; val rightCurly: symset; val threeDots: symset; val colonGt: symset; val hashSign: symset; val structureSy: symset; val signatureSy: symset; val structSy: symset; val sigSy: symset; val sharingSy: symset; val functorSy: symset; val withtypeSy: symset; val eqtypeSy: symset; val includeSy: symset; val whereSy: symset; val othersy: symset; val empty: symset; val variableSys: symset; val constructorSys: symset; val startAtomicSys: symset; val startPatternSys: symset; val startMatchSys: symset; val startExpressionSys: symset; val startDecSys: symset; val declarableVarSys: symset; val startTypeSys: symset; val startSigSys: symset; val startTopSys: symset; end; polyml-5.6/mlsource/MLCompiler/TYPEIDCODE.sml000066400000000000000000002101511265146633400207140ustar00rootroot00000000000000(* Copyright (c) 2009, 2013, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor TYPEIDCODE ( structure LEX : LEXSIG; structure CODETREE : CODETREESIG structure TYPETREE : TYPETREESIG structure STRUCTVALS : STRUCTVALSIG structure DEBUG: DEBUGSIG structure PRETTY : PRETTYSIG structure ADDRESS : AddressSig sharing LEX.Sharing = STRUCTVALS.Sharing = PRETTY.Sharing = CODETREE.Sharing = TYPETREE.Sharing = ADDRESS ) : TYPEIDCODESIG = struct open CODETREE PRETTY ADDRESS STRUCTVALS TYPETREE open RuntimeCalls (* This module deals with handling the run-time values that carry type information. At the moment that's just the equality and print operations but that will be extended. There are different versions according to whether this is a monomorphic constructor, a polymorphic constructor or a type. Monomorphic and polymorphic constructor values are passed around in the module system as run-time values for types and datatypes whereas type values are passed in the core language as an extra argument to polymorphic functions. Both monomorphic and polymorphic constructors contain a reference for the "printer" entry so that a pretty printer can be installed. The functions in polymorphic datatypes have to be applied to type values for the base types to construct a type value. Monomorphic datatypes just need some transformation. The effective types in each case are PolyType : (T('a) -> <'a t, 'a t> -> bool) * (T('a) -> 'a t * int -> pretty) ref MonoType : ( -> bool) * (t * int -> pretty) ref Type: ( -> bool) * (t * int -> pretty) where < > denotes multiple (poly-style) arguments rather than tuples. *) (* If this is true we are just using additional arguments for equality type variables. If false we are using them for all type variables and every polymorphic function is wrapped in a function that passes the type information. *) val justForEqualityTypes = true val arg1 = mkLoadArgument 0 (* Used frequently. *) val arg2 = mkLoadArgument 1 val InternalError = Misc.InternalError val orb = Word8.orb infix 7 orb; val mutableFlags = F_words orb F_mutable (* codeStruct and codeAccess are copied from ValueOps. *) fun codeStruct (Struct{access, ...}, level) = codeAccess (access, level) and codeAccess (Global code, _) = code | codeAccess (Local{addr=ref locAddr, level=ref locLevel}, level) = mkLoad (locAddr, level, locLevel) | codeAccess (Selected{addr, base}, level) = mkInd (addr, codeStruct (base, level)) | codeAccess _ = raise InternalError "No access" (* Load an identifier. *) fun codeId(TypeId{access, ...}, level) = codeAccess(access, level) (* Pretty printer code. These produce code to apply the pretty printer functions. *) fun codePrettyString(s: string) = mkDatatype[mkConst(toMachineWord tagPrettyString), mkConst(toMachineWord s)] and codePrettyBreak(n, m) = mkDatatype[mkConst(toMachineWord tagPrettyBreak), mkConst(toMachineWord n), mkConst(toMachineWord m)] and codePrettyBlock(n: int, t: bool, c: context list, args: codetree) = mkDatatype[mkConst(toMachineWord tagPrettyBlock), mkConst(toMachineWord n), mkConst(toMachineWord t), mkConst(toMachineWord c), args] (* Turn a list of codetrees into a run-time list. *) and codeList(c: codetree list, tail: codetree): codetree = List.foldr (fn (hd, tl) => mkTuple[hd, tl]) tail c (* Generate code to check that the depth is not less than the allowedDepth and if it is to print "..." rather than the given code. *) and checkDepth(depthCode: codetree, allowedDepth: int, codeOk, codeFail) = mkIf( mkEval( rtsFunction POLY_SYS_int_lss, [depthCode, mkConst(toMachineWord allowedDepth)]), codeFail, codeOk) (* Subtract one from the current depth to produce the depth for sub-elements. *) and decDepth depthCode = mkEval(rtsFunction POLY_SYS_aminus, [depthCode, mkConst(toMachineWord 1)]) val codePrintDefault = mkProc(codePrettyString "?", 1, "print-default", [], 0) structure TypeVarMap = struct (* Entries are either type var maps or "stoppers". *) datatype typeVarMapEntry = TypeVarFormEntry of (typeVarForm * (level->codetree)) list | TypeConstrListEntry of typeConstrs list type typeVarMap = { entryType: typeVarMapEntry, (* Either the type var map or a "stopper". *) cache: (* Cache of new type values. *) {typeOf: types, address: int, decCode: codeBinding} list ref, mkAddr: int->int, (* Make new addresses at this level. *) level: level (* Function nesting level. *) } list (* Default map. *) fun defaultTypeVarMap (mkAddr, level) = [{entryType=TypeConstrListEntry[], cache=ref [], mkAddr=mkAddr, level=level}] fun markTypeConstructors(typConstrs, mkAddr, level, tvs) = {entryType = TypeConstrListEntry typConstrs, cache = ref [], mkAddr=mkAddr, level=level} :: tvs fun getCachedTypeValues(({cache=ref cached, ...}) ::_): codeBinding list = (* Extract the values from the list. The later values may refer to earlier so the list must be reversed. *) List.rev (List.map (fn{decCode, ...} => decCode) cached) | getCachedTypeValues _ = raise Misc.InternalError "getCachedTypeValues" (* Extend a type variable environment with a new map of type variables to load functions. *) fun extendTypeVarMap (tvMap: (typeVarForm * (level->codetree)) list, mkAddr, level, typeVarMap) = {entryType = TypeVarFormEntry tvMap, cache = ref [], mkAddr=mkAddr, level=level} :: typeVarMap (* If we find the type var in the map return it as a type. This is used to eliminate apparently generalisable type vars from the list. *) fun mapTypeVars [] _ = NONE | mapTypeVars ({entryType=TypeVarFormEntry typeVarMap, ...} :: rest) tyVar = ( case List.find(fn(t, _) => sameTv(t, tyVar)) typeVarMap of SOME (tv, _) => SOME(TypeVar tv) | NONE => mapTypeVars rest tyVar ) | mapTypeVars (_ :: rest) tyVar = mapTypeVars rest tyVar (* Check to see if a type constructor is in the "stopper" set and return the level if it is. *) fun checkTypeConstructor(_, []) = ~1 (* Not there. *) | checkTypeConstructor(tyCons, {entryType=TypeVarFormEntry _, ...} :: rest) = checkTypeConstructor(tyCons, rest: typeVarMap) | checkTypeConstructor(tyCons, {entryType=TypeConstrListEntry tConstrs, ...} :: rest) = if List.exists(fn t => sameTypeId(tcIdentifier t, tcIdentifier tyCons)) tConstrs then List.length rest + 1 else checkTypeConstructor(tyCons, rest) local open TypeValue (* The printer and equality functions must be valid functions even when they will never be called. We may have to construct dummy type values by applying a polymorphic type constructor to them and if they don't have the right form the optimiser will complain. If we're only using type values for equality type variables the default print function will be used in polymorphic functions so must print "?". *) val errorFunction2 = mkProc(CodeZero, 2, "errorCode2", [], 0) val codeFn = mkProc(codePrettyString "fn", 1, "print-function", [], 0) local fun typeValForMonotype typConstr = let val codedId = codeId(tcIdentifier typConstr, baseLevel) val printerRefAddress = extractPrinter codedId val printFn = (* Create a function to load the printer ref and apply to the args. *) mkProc( mkEval( mkEval(rtsFunction POLY_SYS_load_word, [printerRefAddress, CodeZero]), [arg1]), 1, "print-" ^ tcName typConstr, [], 0) in createTypeValue{ eqCode=extractEquality codedId, printCode=printFn, boxedCode=extractBoxed codedId, sizeCode=extractSize codedId} end in (* A few common types. These are effectively always cached. *) val intCode = typeValForMonotype intConstr and boolCode = typeValForMonotype boolConstr and stringCode = typeValForMonotype stringConstr and charCode = typeValForMonotype charConstr end (* Code generate this now so we only get one entry. *) val codeTuple = mkTuple[ createTypeValue{ (* Unused type variable. *) eqCode=errorFunction2, printCode=codePrintDefault, boxedCode=boxedEither, sizeCode=singleWord}, createTypeValue{ (* Function. *) eqCode=errorFunction2, printCode=codeFn, boxedCode=boxedAlways, sizeCode=singleWord}, intCode, boolCode, stringCode, charCode ] val code = genCode(codeTuple, [], 0)() in (* Default code used for a type variable that is not referenced but needs to be provided to satisfy the type. *) val defaultTypeCode = mkInd(0, code) val functionCode = mkInd(1, code) val cachedCode = [(intConstr, mkInd(2, code)), (boolConstr, mkInd(3, code)), (stringConstr, mkInd(4, code)), (charConstr, mkInd(5, code))] end fun findCachedTypeCode(typeVarMap: typeVarMap, typ): ((level->codetree) * int) option = let (* Test if we have the same type as the cached type. *) fun sameType (t1, t2) = case (eventual t1, eventual t2) of (TypeVar tv1, TypeVar tv2) => ( case (tvValue tv1, tvValue tv2) of (EmptyType, EmptyType) => sameTv(tv1, tv2) | _ => false ) | (FunctionType{arg=arg1, result=result1}, FunctionType{arg=arg2, result=result2}) => sameType(arg1, arg2) andalso sameType(result1, result2) | (LabelledType{recList=list1, ...}, LabelledType{recList=list2, ...}) => ListPair.allEq( fn({name=n1, typeof=t1}, {name=n2, typeof=t2}) => n1 = n2 andalso sameType(t1, t2)) (list1, list2) | (TypeConstruction{constr=c1, args=a1, ...}, TypeConstruction{constr=c2, args=a2, ...}) => sameTypeConstr(c1, c2) andalso ListPair.allEq sameType (a1, a2) | _ => false and sameTypeConstr(tc1, tc2) = sameTypeId(tcIdentifier tc1, tcIdentifier tc2) fun findCodeFromCache([], _) = NONE | findCodeFromCache(({cache=ref cache, level, ...} :: rest): typeVarMap, ty) = ( case List.find(fn {typeOf, ...} => sameType(typeOf, ty)) cache of NONE => findCodeFromCache(rest, ty) | SOME{address, ...} => SOME(fn l => mkLoad(address, l, level), List.length rest +1) ) in case typ of TypeVar tyVar => ( case tvValue tyVar of EmptyType => let (* If it's a type var it is either in the type var list or we return the default. It isn't in the cache. *) fun findCodeFromTypeVar([], _) = ((fn _ => defaultTypeCode), 0) (* Return default code for a missing type variable. This can occur if we have unreferenced type variables that need to be supplied but are treated as "don't care". *) | findCodeFromTypeVar({entryType=TypeVarFormEntry typeVarMap, ...} :: rest, tyVar) = ( case List.find(fn(t, _) => sameTv(t, tyVar)) typeVarMap of SOME(_, codeFn) => (codeFn, List.length rest+1) | NONE => findCodeFromTypeVar(rest, tyVar) ) | findCodeFromTypeVar(_ :: rest, tyVar) = findCodeFromTypeVar(rest, tyVar) in SOME(findCodeFromTypeVar(typeVarMap, tyVar)) end | OverloadSet _ => let val constr = typeConstrFromOverload(typ, false) in findCachedTypeCode(typeVarMap, mkTypeConstruction(tcName constr, constr, [], [])) end | ty => findCachedTypeCode(typeVarMap, ty) ) | TypeConstruction { constr, args, ...} => let fun sameTypeConstr(tc1, tc2) = sameTypeId(tcIdentifier tc1, tcIdentifier tc2) in if tcIsAbbreviation constr (* Type abbreviation *) then findCachedTypeCode(typeVarMap, makeEquivalent (constr, args)) else if null args then (* Check the permanently cached monotypes. *) case List.find(fn (t, _) => sameTypeConstr(t, constr)) cachedCode of SOME (_, c) => SOME ((fn _ => c), ~1) | NONE => findCodeFromCache(typeVarMap, typ) else findCodeFromCache(typeVarMap, typ) end | FunctionType _ => SOME(fn _ => functionCode, ~1) (* Every function has the same code. *) | _ => findCodeFromCache(typeVarMap, typ) end end open TypeVarMap (* Find the earliest entry in the cache table where we can put this entry. *) fun getMaxDepth (typeVarMap: typeVarMap) (ty: types, maxSoFar:int) : int = case findCachedTypeCode(typeVarMap, ty) of SOME (_, cacheDepth) => Int.max(cacheDepth, maxSoFar) | NONE => let in case ty of TypeVar tyVar => ( case tvValue tyVar of OverloadSet _ => maxSoFar (* Overloads are all global. *) | EmptyType => maxSoFar | tyVal => getMaxDepth typeVarMap (tyVal, maxSoFar) ) | TypeConstruction{constr, args, ...} => if tcIsAbbreviation constr (* May be an alias *) then getMaxDepth typeVarMap (makeEquivalent (constr, args), maxSoFar) else List.foldl (getMaxDepth typeVarMap) (Int.max(maxSoFar, checkTypeConstructor(constr, typeVarMap))) args | LabelledType {recList, ...} => List.foldl (fn ({typeof, ...}, m) => getMaxDepth typeVarMap (typeof, m)) maxSoFar recList | _ => maxSoFar end (* Get the boxedness status for a type i.e. whether values of the type are always addresses, always tagged integers or could be either. *) fun boxednessForType(ty, level: level, getTypeValueForID, typeVarMap): codetree = case findCachedTypeCode(typeVarMap, ty) of SOME (code, _) => TypeValue.extractBoxed(code level) | NONE => let fun boxednessForConstruction(constr, args): codetree = (* Get the boxedness for a datatype construction. *) let (* Get the boxedness functions for the argument types. This applies only to polytypes. *) fun getArg ty : codetree = let val boxedFun = boxednessForType(ty, level, getTypeValueForID, typeVarMap) open TypeValue in (* We need a type value here although only the boxedFun will be used. *) createTypeValue{eqCode=CodeZero, printCode=CodeZero, boxedCode=boxedFun, sizeCode=singleWord} end val codeForId = TypeValue.extractBoxed(getTypeValueForID(tcIdentifier constr, args, level)) in (* Apply the function we obtained to any type arguments. *) if null args then codeForId else mkEval(codeForId, map getArg args) end in case ty of TypeVar tyVar => ( case tvValue tyVar of OverloadSet _ => boxednessForConstruction(typeConstrFromOverload(ty, false), []) | EmptyType => raise InternalError "boxedness: should already have been handled" | tyVal => boxednessForType(tyVal, level, getTypeValueForID, typeVarMap) ) | TypeConstruction{constr, args, ...} => if tcIsAbbreviation constr (* May be an alias *) then boxednessForType (makeEquivalent (constr, args), level, getTypeValueForID, typeVarMap) else boxednessForConstruction(constr, args) | LabelledType {recList=[{typeof=singleton, ...}], ...} => (* Unary tuples are optimised - no indirection. *) boxednessForType(singleton, level, getTypeValueForID, typeVarMap) | LabelledType _ => TypeValue.boxedAlways (* Tuple are currently always boxed. *) (* Functions are handled in the cache case. *) | _ => raise InternalError "boxednessForType: Unknown type" end (* Get the size for values of the type. A value N other than 1 means that every value of the type is a pointer to a tuple of exactly N words. Zero is never used. *) fun sizeForType(ty, level, getTypeValueForID, typeVarMap): codetree = case findCachedTypeCode(typeVarMap, ty) of SOME (code, _) => TypeValue.extractSize(code level) | NONE => let fun sizeForConstruction(constr, args): codetree = (* Get the size for a datatype construction. *) let (* Get the size functions for the argument types. This applies only to polytypes. *) fun getArg ty : codetree = let val sizeFun = sizeForType(ty, level, getTypeValueForID, typeVarMap) open TypeValue in (* We need a type value here although only the sizeFun will be used. *) createTypeValue{eqCode=CodeZero, printCode=CodeZero, boxedCode=CodeZero, sizeCode=sizeFun} end val codeForId = TypeValue.extractSize(getTypeValueForID(tcIdentifier constr, args, level)) in (* Apply the function we obtained to any type arguments. *) if null args then codeForId else mkEval(codeForId, map getArg args) end in case ty of TypeVar tyVar => ( case tvValue tyVar of OverloadSet _ => sizeForConstruction(typeConstrFromOverload(ty, false), []) | EmptyType => raise InternalError "size: should already have been handled" | tyVal => sizeForType(tyVal, level, getTypeValueForID, typeVarMap) ) | TypeConstruction{constr, args, ...} => if tcIsAbbreviation constr (* May be an alias *) then sizeForType (makeEquivalent (constr, args), level, getTypeValueForID, typeVarMap) else sizeForConstruction(constr, args) | LabelledType {recList=[{typeof=singleton, ...}], ...} => (* Unary tuples are optimised - no indirection. *) sizeForType(singleton, level, getTypeValueForID, typeVarMap) | LabelledType{recList, ...} => let val length = List.length recList in (* Set the length to the number of words that can be unpacked. If there are more than 4 items it's probably not worth packing them into other tuples so set this to one. *) if length <= 4 (*!maxPacking*) then mkConst(toMachineWord length) else TypeValue.singleWord end (* Functions are handled in the cache case. *) | _ => raise InternalError "sizeForType: Unknown type" end fun printerForType(ty, baseLevel, argTypes: typeVarMap) = let fun printCode(typ, level: level) = ( case typ of typ as TypeVar tyVar => ( case tvValue tyVar of EmptyType => ( case findCachedTypeCode(argTypes, typ) of SOME (code, _) => TypeValue.extractPrinter(code level) | NONE => raise InternalError "printerForType: should already have been handled" ) | OverloadSet _ => let val constr = typeConstrFromOverload(typ, false) in printCode(mkTypeConstruction(tcName constr, constr, [], []), level) end | _ => (* Just a bound type variable. *) printCode(tvValue tyVar, level) ) | TypeConstruction { constr=typConstr, args, name, ...} => if tcIsAbbreviation typConstr (* Handle type abbreviations directly *) then printCode(makeEquivalent (typConstr, args), level) else let val nLevel = newLevel level (* Get the type Id and put in code to extract the printer ref. *) val codedId = codeId(tcIdentifier typConstr, nLevel) open TypeValue val printerRefAddress = extractPrinter codedId (* We need a type value here. The printer field will be used to print the type argument and the boxedness and size fields may be needed to extract the argument from the constructed value. *) fun makePrinterId t = let fun codeForId(typeId, _, l) = codeId(typeId, l) in createTypeValue {eqCode=CodeZero, printCode=printCode(t, nLevel), boxedCode=boxednessForType(t, nLevel, codeForId, argTypes), sizeCode=sizeForType(t, nLevel, codeForId, argTypes)} end val argList = map makePrinterId args in case args of [] => (* Create a function that, when called, will extract the function from the reference and apply it the pair of the value and the depth. *) mkProc( mkEval( mkEval(rtsFunction POLY_SYS_load_word, [printerRefAddress, CodeZero]), [arg1]), 1, "print-"^name, getClosure nLevel, 0) | _ => (* Construct a function, that when called, will extract the function from the reference and apply it first to the base printer functions and then to the pair of the value and depth. *) mkProc( mkEval( mkEval( mkEval(rtsFunction POLY_SYS_load_word, [printerRefAddress, CodeZero]), argList), [arg1]), 1, "print-"^name, getClosure nLevel, 0) end | LabelledType { recList=[], ...} => (* Empty tuple: This is the unit value. *) mkProc(codePrettyString "()", 1, "print-labelled", [], 0) | LabelledType {recList=[{name, typeof}], ...} => let (* Optimised unary record *) val localLevel = newLevel level val entryCode = mkEval(printCode(typeof, localLevel), [arg1]) val printItem = codeList([codePrettyString(name^" ="), codePrettyBreak(1, 0), entryCode, codePrettyString "}"], CodeZero) in mkProc( codePrettyBlock(1, false, [], mkTuple[codePrettyString "{", printItem]), 1, "print-labelled", getClosure localLevel, 0) end | LabelledType (r as { recList, ...}) => let (* See if this has fields numbered 1=, 2= etc. N.B. If it has only one field we need to print 1= since we don't have singleton tuples. *) fun isRec([], _) = true | isRec({name, ...} :: l, n) = name = Int.toString n andalso isRec(l, n+1) val isTuple = recordIsFrozen r andalso isRec(recList, 1) andalso List.length recList >= 2 val localLevel = newLevel level val valToPrint = mkInd(0, arg1) and depthCode = mkInd(1, arg1) val fields = List.tabulate(List.length recList, fn n => n) val items = ListPair.zipEq(recList, fields) (* The ordering on fields is designed to allow mixing of tuples and records (e.g. #1). It puts shorter names before longer so that #11 comes after #2 and before #100. For named records it does not make for easy reading so we sort those alphabetically when printing. *) val printItems = if isTuple then items else Misc.quickSort(fn ({name = a, ...}, _) => fn ({name = b, ...}, _) => a <= b) items fun asRecord([], _) = raise Empty (* Shouldn't happen. *) | asRecord([({name, typeof, ...}, offset)], _) = let val entryCode = (* Last field: no separator. *) mkEval(printCode(typeof, localLevel), [mkTuple[mkInd(offset, valToPrint), decDepth depthCode]]) val (start, terminator) = if isTuple then ([], ")") else ([codePrettyString(name^" ="), codePrettyBreak(1, 0)], "}") in codeList(start @ [entryCode, codePrettyString terminator], CodeZero) end | asRecord(({name, typeof, ...}, offset) :: fields, depth) = let val (start, terminator) = if isTuple then ([], ")") else ([codePrettyString(name^" ="), codePrettyBreak(1, 0)], "}") in checkDepth(depthCode, depth, codeList( start @ [ mkEval( printCode(typeof, localLevel), [mkTuple[mkInd(offset, valToPrint), decDepth depthCode]]), codePrettyString ",", codePrettyBreak (1, 0) ], asRecord(fields, depth+1)), codeList([codePrettyString ("..." ^ terminator)], CodeZero) ) end in mkProc( codePrettyBlock(1, false, [], mkTuple[codePrettyString (if isTuple then "(" else "{"), asRecord(printItems, 0)]), 1, "print-labelled", getClosure localLevel, 0) end | FunctionType _ => mkProc(codePrettyString "fn", 1, "print-function", [], 0) | _ => mkProc(codePrettyString "", 1, "print-empty", [], 0) ) in printCode(ty, baseLevel) end and makeEq(ty, level: level, getTypeValueForID, typeVarMap): codetree = let fun equalityForConstruction(constr, args): codetree = (* Generate an equality function for a datatype construction. *) let (* Get argument types parameters for polytypes. There's a special case here for type vars, essentially the type arguments to the datatype, to avoid taking apart the type value record and then building it again. *) fun getArg ty = if (case ty of TypeVar tyVar => (case tvValue tyVar of EmptyType => true | _ => false) | _ => false) then ( case findCachedTypeCode(typeVarMap, ty) of SOME (code, _) => code level | NONE => raise InternalError "getArg" ) else let val eqFun = makeEq(ty, level, getTypeValueForID, typeVarMap) open TypeValue in (* We need a type value here. The equality function will be used to compare the argument type and the boxedness and size parameters may be needed for the constructors. *) createTypeValue{eqCode=eqFun, printCode=CodeZero, boxedCode=boxednessForType(ty, level, getTypeValueForID, typeVarMap), sizeCode=sizeForType(ty, level, getTypeValueForID, typeVarMap)} end val resFun = let val iden = tcIdentifier constr in (* Special case: If this is ref, Array.array or Array2.array we must use pointer equality and not attempt to create equality functions for the argument. It may not be an equality type. *) if isPointerEqType iden then rtsFunction POLY_SYS_word_eq else let open TypeValue val codeForId = extractEquality(getTypeValueForID(tcIdentifier constr, args, level)) in (* Apply the function we obtained to any type arguments. *) if null args then codeForId else mkEval(codeForId, map getArg args) end end in resFun end in case ty of TypeVar tyVar => ( case tvValue tyVar of OverloadSet _ => (* This seems to occur if there are what amount to indirect references to literals. *) equalityForConstruction(typeConstrFromOverload(ty, false), []) | EmptyType => ( case findCachedTypeCode(typeVarMap, ty) of SOME (code, _) => TypeValue.extractEquality(code level) | NONE => raise InternalError "makeEq: should already have been handled" ) | tyVal => makeEq(tyVal, level, getTypeValueForID, typeVarMap) ) | TypeConstruction{constr, args, ...} => if tcIsAbbreviation constr (* May be an alias *) then makeEq (makeEquivalent (constr, args), level, getTypeValueForID, typeVarMap) else equalityForConstruction(constr, args) | LabelledType {recList=[{typeof=singleton, ...}], ...} => (* Unary tuples are optimised - no indirection. *) makeEq(singleton, level, getTypeValueForID, typeVarMap) | LabelledType {recList, ...} => (* Combine the entries. fun eq(a,b) = #1 a = #1 b andalso #2 a = #2 b ... *) let (* Have to turn this into a new function. *) val nLevel = newLevel level fun combineEntries ([], _) = CodeTrue | combineEntries ({typeof, ...} :: t, n) = let val compareElements = makeEq(typeof, nLevel, getTypeValueForID, typeVarMap) in mkCand( mkEval(compareElements, [mkInd(n, arg1), mkInd(n, arg2)]), combineEntries (t, n+1)) end val tupleCode = combineEntries(recList, 0) in mkProc(tupleCode, 2, "eq{...}(2)", getClosure nLevel, 0) end | _ => raise InternalError "Equality for function" end (* Create equality functions for a set of possibly mutually recursive datatypes. *) fun equalityForDatatypes(typeDataList, eqAddresses, baseEqLevel, typeVarMap): (int * codetree) list = let val typesAndAddresses = ListPair.zipEq(typeDataList, eqAddresses) fun equalityForDatatype(({typeConstr=TypeConstrSet(tyConstr, vConstrs), eqStatus, (*boxedCode, sizeCode,*) ...}, addr), otherFns) = if eqStatus then let val nTypeVars = tcArity tyConstr val argTypes = List.tabulate(tcArity tyConstr, fn _ => makeTv{value=EmptyType, level=generalisable, nonunifiable=false, equality=false, printable=false}) val baseEqLevelP1 = newLevel baseEqLevel (* Argument type variables. *) val (localArgList, argTypeMap) = case argTypes of [] => ([], typeVarMap) | _ => let (* Add the polymorphic variables after the ordinary ones. *) (* Create functions to load these if they are used in the map. They may be non-local!!! *) val args = List.tabulate(nTypeVars, fn addr => fn l => mkLoadParam(addr+2, l, baseEqLevelP1)) (* Put the outer args in the map *) val varToArgMap = ListPair.zipEq(argTypes, args) (* Load the local args to return. *) val localArgList = List.tabulate (nTypeVars, fn addr => mkLoadParam(addr+2, baseEqLevelP1, baseEqLevelP1)) val addrs = ref 0 (* Make local declarations for any type values. *) fun mkAddr n = !addrs before (addrs := !addrs + n) in (localArgList, extendTypeVarMap(varToArgMap, mkAddr, baseEqLevelP1, typeVarMap)) end (* If this is a reference to a datatype we're currently generating load that address otherwise fall back to the default. *) fun getEqFnForID(typeId, _, l) = (* if sameTypeId(typeId, tcIdentifier tyConstr) andalso null argTypes then (* Directly recursive. *) TypeValue.createTypeValue{eqCode=mkLoadRecursive(l-baseLevel-1), printCode=CodeZero, boxedCode=boxedCode, sizeCode=sizeCode} else *) case List.find(fn({typeConstr=tc, ...}, _) => sameTypeId(tcIdentifier(tsConstr tc), typeId)) typesAndAddresses of SOME({boxedCode, sizeCode, ...}, addr) => (* Mutually recursive. *) TypeValue.createTypeValue{eqCode=mkLoad(addr, l, baseEqLevel), printCode=CodeZero, boxedCode=boxedCode, sizeCode=sizeCode} | NONE => codeId(typeId, l) (* Filter out the EnumForm constructors. They arise in situations such as datatype t = A of int*int | B | C i.e. where we have only one non-nullary constructor and it is a tuple. In this case we can deal with all the nullary constructors simply by testing whether the two arguments are the same. We don't have to discriminate the individual cases. *) fun processConstrs [] = (* The last of the alternatives is false *) CodeZero | processConstrs (Value{class, access, typeOf, ...} :: rest) = let fun addPolymorphism c = if nTypeVars = 0 orelse justForEqualityTypes then c else mkEval(c, localArgList) val base = codeAccess(access, baseEqLevelP1) open ValueConstructor fun matches arg = mkEval(addPolymorphism(extractTest base), [arg]) in case class of Constructor{nullary=true, ...} => let (* Nullary constructors are represented either by short constants or by constant tuples depending on the rest of the datatype. If this is a short constant the pointer equality is sufficient. This appears to increase the code size but the test should be optimised away because it is applied to a constant. (The "injection function" of a nullary constructor is the constant that represents the value). We have to test the tags if it is not short because we can't guarantee that the constant tuple hasn't been duplicated. *) val isShort = mkEval(rtsFunction POLY_SYS_is_short, [addPolymorphism(extractInjection base)]) in mkIf(mkIf(isShort, CodeFalse, matches arg1), matches arg2, processConstrs rest) end | _ => (* We have to unwrap the value. *) let (* Get the constructor argument given the result type. We might actually be able to take the argument type off directly but there's some uncertainty about whether we use the same type variables for the constructors as for the datatype. (This only applies for polytypes). *) val resType = constructorResult(typeOf, List.map TypeVar argTypes) (* Code to extract the value. *) fun destruct argNo = mkEval(addPolymorphism(extractProjection(codeAccess(access, baseEqLevelP1))), [mkLoadParam(argNo, baseEqLevelP1, baseEqLevelP1)]) (* Test whether the values match. *) val eqValue = mkEval( makeEq(resType, baseEqLevelP1, getEqFnForID, argTypeMap), [destruct 0, destruct 1]) in (* We have equality if both values match this constructor and the values within the constructor match. *) mkIf(matches arg1, mkCand(matches arg2, eqValue), processConstrs rest) end end (* We previously only tested for bit-wise (pointer) equality if we had at least one "enum" constructor in which case the test would eliminate all the enum constructors. I've now extended this to all cases where there is more than one constructor. The idea is to speed up equality between identical data structures. *) val eqCode = mkCor(mkTestptreq(arg1, arg2), processConstrs vConstrs) in if null argTypes then (addr, mkProc(eqCode, 2, "eq-" ^ tcName tyConstr ^ "(2)", getClosure baseEqLevelP1, 0)) :: otherFns else (* Polymorphic. Add an extra inline functions. *) let val nArgs = List.length argTypes val nLevel = newLevel baseEqLevel val nnLevel = newLevel nLevel (* Call the second function with the values to be compared and the base types. *) val polyArgs = List.tabulate(nArgs, fn i => mkLoadParam(i, nnLevel, nLevel)) in (addr, mkInlproc( mkInlproc( mkEval(mkLoad(addr+1, nnLevel, baseEqLevel), [arg1, arg2] @ polyArgs), 2, "eq-" ^ tcName tyConstr ^ "(2)", getClosure nnLevel, 0), nArgs, "eq-" ^ tcName tyConstr ^ "(2)(P)", getClosure nLevel, 0)) :: (addr+1, mkProc(mkEnv(getCachedTypeValues argTypeMap, eqCode), 2+nTypeVars, "eq-" ^ tcName tyConstr ^ "()", getClosure baseEqLevelP1, 0)) :: otherFns end end else (* Not an equality type. This will not be called but it still needs to be a function to ensure it's valid inside mkMutualDecs. *) (addr, mkProc(CodeZero, 2, "no-eq", [], 0)) :: otherFns in List.foldl equalityForDatatype [] typesAndAddresses end (* Create a printer function for a datatype when the datatype is declared. We don't have to treat mutually recursive datatypes specially because this is called after the type IDs have been created. *) fun printerForDatatype(TypeConstrSet(typeCons as TypeConstrs{name, ...}, vConstrs), level, typeVarMap) = let val argCode = mkInd(0, arg1) and depthCode = mkInd(1, arg1) val nLevel = newLevel level val constrArity = tcArity typeCons val argTypes = List.tabulate(constrArity, fn _ => makeTv{value=EmptyType, level=generalisable, nonunifiable=false, equality=false, printable=false}) val (localArgList, innerLevel, newTypeVarMap) = case constrArity of 0 => ([], nLevel, typeVarMap) | _ => let val nnLevel = newLevel nLevel fun mkTcArgMap (argTypes, level, oldLevel) = let val nArgs = List.length argTypes val argAddrs = List.tabulate(nArgs, fn n => n) val args = List.map(fn addr => fn l => mkLoadParam(addr, l, oldLevel)) argAddrs in (ListPair.zipEq(argTypes, args), List.map (fn addr => mkLoadParam(addr, level, oldLevel)) argAddrs) end val (varToArgMap, localArgList) = mkTcArgMap(argTypes, nnLevel, nLevel) val addrs = ref 1 (* Make local declarations for any type values. *) fun mkAddr n = !addrs before (addrs := !addrs + n) in (localArgList, nnLevel, extendTypeVarMap(varToArgMap, mkAddr, nLevel, typeVarMap)) end (* If we have an expression as the argument we parenthesise it unless it is a simple string, a tuple, a record or a list. *) (* fun parenthesise p = let val test = case p of PrettyBlock(_, _, _, items) => ( case items of PrettyString first :: tl => not(null tl) andalso first <> "(" andalso first <> "{" andalso first <> "[" | _ => false ) | _ => false in if test then PrettyBlock(3, true, [], [ PrettyString "(", PrettyBreak(0, 0), p, PrettyBreak(0, 0), PrettyString ")" ]) else p end *) local fun callIo function args = mkEval (rtsFunction function, args) fun eqStr (arg, str) = callIo POLY_SYS_word_eq [arg, mkConst(toMachineWord str)] fun isNotNull arg = callIo POLY_SYS_not_bool [callIo POLY_SYS_is_short [arg]] fun testTag(arg, tagV) = (* Test the tag in the first word of the datatype. *) mkTagTest(mkInd(0, arg), tagV, maxPrettyTag) fun listHd x = mkVarField(0, x) and listTl x = mkVarField(1, x) in val parenCode = mkProc( mkIf( testTag(mkLoadArgument 0, tagPrettyBlock), (* then *) mkEnv( [mkDec(0, mkVarField(4, mkLoadArgument 0))], (* items *) mkIf ( (* not(null items) andalso not(null(tl items)) andalso not (isPrettyString(hd items) andalso bracket) *) mkCand( isNotNull(mkLoadLocal 0), mkCand( isNotNull (listTl(mkLoadLocal 0)), callIo POLY_SYS_not_bool [ mkCand(testTag(listHd(mkLoadLocal 0), tagPrettyString), mkEnv( [mkDec(1, mkVarField(1, listHd(mkLoadLocal 0)))], mkCor(eqStr(mkLoadLocal 1, "("), mkCor(eqStr(mkLoadLocal 1, "{"), eqStr(mkLoadLocal 1, "["))) ) ) ] ) ), (* then: Parenthesise the argument. *) codePrettyBlock( 3, true, [], mkDatatype [ codePrettyString "(", mkDatatype [ codePrettyBreak(0, 0), mkDatatype [ mkLoadArgument 0, mkDatatype [ codePrettyBreak(0, 0), mkDatatype [codePrettyString ")", CodeZero ] ] ] ] ] ), (* else *) mkLoadArgument 0 ) ), (* else *) mkLoadArgument 0 ), 1, "parenthesise", [], 2) end fun printerForConstructors (Value{name, typeOf, access, class = Constructor{nullary, ...}, locations, ...} :: rest) = let (* The "value" for a value constructor is a tuple containing the test code, the injection and the projection functions. *) val constructorCode = codeAccess(access, innerLevel) (* If this is a polytype the fields in the constructor tuple are functions that first have to be applied to the type arguments to yield the actual injection/test/projection functions. For monotypes the fields contain the injection/test/projection functions directly. *) fun addPolymorphism c = if constrArity = 0 orelse justForEqualityTypes then c else mkEval(c, localArgList) open ValueConstructor val locProps = (* Get the declaration location. *) List.foldl(fn (DeclaredAt loc, _) => [ContextLocation loc] | (_, l) => l) [] locations val nameCode = codePrettyBlock(0, false, locProps, codeList([codePrettyString name], CodeZero)) val printCode = if nullary then (* Just the name *) nameCode else let val typeOfArg = constructorResult(typeOf, List.map TypeVar argTypes) val getValue = mkEval(addPolymorphism(extractProjection constructorCode), [argCode]) in codePrettyBlock(1, false, [], codeList( [ (* Put it in a block with the declaration location. *) nameCode, codePrettyBreak (1, 0), (* Print the argument and parenthesise it if necessary. *) mkEval(parenCode, [ mkEval( printerForType(typeOfArg, innerLevel, newTypeVarMap), [mkTuple[getValue, decDepth depthCode]] )] ) ], CodeZero)) end in (* If this was the last or only constructor we don't need to test. *) checkDepth(depthCode, 1, if null rest then printCode else let val testValue = mkEval(addPolymorphism(extractTest constructorCode), [argCode]) in mkIf(testValue, printCode, printerForConstructors rest) end, codePrettyString "...") end | printerForConstructors _ = raise InternalError ("No constructors:"^name) val printerCode = printerForConstructors vConstrs in (* Wrap this in the functions for the base types. *) if constrArity = 0 then mkProc(printerCode, 1, "print-"^name, getClosure innerLevel, 0) else mkProc(mkEnv(getCachedTypeValues newTypeVarMap, mkProc(printerCode, 1, "print-"^name, getClosure innerLevel, 0)), constrArity, "print"^name^"()", getClosure nLevel, 0) end (* Opaque matching and functor application create new type IDs using an existing type as implementation. The equality function is inherited whether the type was specified as an eqtype or not. The print function is no longer inherited. Instead a new reference is installed with a default print function. This hides the implementation. *) (* If this is a type function we're going to generate a new ref anyway so we don't need to copy it. *) fun codeGenerativeId(TypeId{idKind=TypeFn([], resType), ...}, isEq, mkAddr, level) = let (* Monotype abbreviation. *) (* Create a new type value cache. *) val typeVarMap = defaultTypeVarMap(mkAddr, level) open TypeValue val eqCode = if not isEq then CodeZero else (* We need a function that takes two arguments rather than a single pair. *) makeEq(resType, level, fn (typeId, _, l) => codeId(typeId, l), typeVarMap) val boxedCode = boxednessForType(resType, level, fn (typeId, _, l) => codeId(typeId, l), typeVarMap) val sizeCode = sizeForType(resType, level, fn (typeId, _, l) => codeId(typeId, l), typeVarMap) in mkEnv( TypeVarMap.getCachedTypeValues typeVarMap, createTypeValue { eqCode = eqCode, boxedCode = boxedCode, sizeCode = sizeCode, printCode = mkEval (rtsFunction POLY_SYS_alloc_store, [mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), codePrintDefault]) }) end | codeGenerativeId(TypeId{idKind=TypeFn(argTypes, resType), ...}, isEq, mkAddr, level) = let (* Polytype abbreviation: All the entries in the tuple are functions that must be applied to the base type values when the type constructor is used. *) (* Create a new type value cache. *) val typeVarMap = defaultTypeVarMap(mkAddr, level) val nArgs = List.length argTypes fun createCode(makeCode, name) = let val nLevel = newLevel level val addrs = ref 0 fun mkAddr n = !addrs before (addrs := !addrs + n) local val args = List.tabulate(nArgs, fn addr => fn l => mkLoadParam(addr, l, nLevel)) in val typeEnv = ListPair.zipEq(argTypes, args) end val argTypeMap = extendTypeVarMap(typeEnv, mkAddr, nLevel, typeVarMap) val innerFnCode = makeCode(nLevel, argTypeMap) in mkProc(mkEnv(getCachedTypeValues argTypeMap, innerFnCode), nArgs, name, getClosure nLevel, !addrs) end open TypeValue (* Create a print function.*) val printCode = createCode(fn _ => codePrintDefault, "print-helper()") and eqCode = if not isEq then CodeZero else createCode(fn(nLevel, argTypeMap) => makeEq(resType, nLevel, fn (typeId, _, l) => codeId(typeId, l), argTypeMap), "equality()") and boxedCode = createCode(fn(nLevel, argTypeMap) => boxednessForType(resType, nLevel, fn (typeId, _, l) => codeId(typeId, l), argTypeMap), "boxedness()") and sizeCode = createCode(fn(nLevel, argTypeMap) => sizeForType(resType, nLevel, fn (typeId, _, l) => codeId(typeId, l), argTypeMap), "size()") in mkEnv( TypeVarMap.getCachedTypeValues typeVarMap, createTypeValue { eqCode = eqCode, boxedCode = boxedCode, printCode = mkEval (rtsFunction POLY_SYS_alloc_store, [mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), printCode]), sizeCode = sizeCode }) end | codeGenerativeId(sourceId, _, mkAddr, level: level) = let (* Datatype. This is the same for monotype and polytypes except for the print fn. *) open TypeValue val { dec, load } = multipleUses (codeId(sourceId, level), fn () => mkAddr 1, level) val loadLocal = load level val arity = case sourceId of TypeId{idKind=Bound{arity, ...},...} => arity | TypeId{idKind=Free{arity, ...},...} => arity | TypeId{idKind=TypeFn _,...} => raise InternalError "Already checked" val printFn = if arity = 0 then codePrintDefault else mkProc(codePrintDefault, arity, "print-helper()", [], 0) val printCode = mkEval (rtsFunction POLY_SYS_alloc_store, [mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), printFn ] ) in mkEnv( dec, createTypeValue { eqCode = extractEquality loadLocal, printCode = printCode, boxedCode = extractBoxed loadLocal, sizeCode = extractSize loadLocal } ) end (* Create the equality and type functions for a set of mutually recursive datatypes. *) fun createDatatypeFunctions( typeDatalist: {typeConstr: typeConstrSet, eqStatus: bool, boxedCode: codetree, sizeCode: codetree } list, mkAddr, level, typeVarMap, makePrintFunction) = let (* Each entry has an equality function and a ref to a print function. The print functions for each type needs to indirect through the refs when printing other types so that if a pretty printer is later installed for one of the types the others will use the new pretty printer. That means that the code has to be produced in stages. *) (* Create the equality functions. Because mutual decs can only be functions we can't create the typeIDs themselves as mutual declarations. *) local (* If this is polymorphic make two addresses, one for the returned equality function and one for the inner function. *) fun makeEqAddr{typeConstr=TypeConstrSet(tyConstr, _), ...} = mkAddr(if tcArity tyConstr = 0 then 1 else 2) in val eqAddresses = List.map makeEqAddr typeDatalist (* Make addresses for the equalities. *) end val equalityFunctions = mkMutualDecs(equalityForDatatypes(typeDatalist, eqAddresses, level, typeVarMap)) (* Create the typeId values and set their addresses. The print function is initially set as zero. *) local fun makeTypeId({typeConstr, boxedCode, sizeCode, ...}, eqAddr) = let val var = vaLocal(idAccess(tcIdentifier(tsConstr typeConstr))) val newAddr = mkAddr 1 open TypeValue val idCode = createTypeValue { eqCode=mkLoadLocal eqAddr, printCode= mkEval (rtsFunction POLY_SYS_alloc_store, [mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), CodeZero (* Temporary - replaced by setPrinter. *)] ), boxedCode = boxedCode, sizeCode = sizeCode } in #addr var := newAddr; #level var:= level; mkDec(newAddr, idCode) end in val typeIdCode = ListPair.map makeTypeId (typeDatalist, eqAddresses) end (* Create the print functions and set the printer code for each typeId. *) local fun setPrinter{typeConstr as TypeConstrSet(tCons as TypeConstrs{identifier, ...}, _), ...} = let val arity = tcArity tCons val printCode = if makePrintFunction then printerForDatatype(typeConstr, level, typeVarMap) else if arity = 0 then codePrintDefault else mkProc(codePrintDefault, arity, "print-printdefault", [], 0) in mkNullDec( mkEval( rtsFunction POLY_SYS_assign_word, [TypeValue.extractPrinter(codeId(identifier, level)), CodeZero, printCode] )) end in val printerCode = List.map setPrinter typeDatalist end in equalityFunctions :: typeIdCode @ printerCode end (* Exported function. Returns a function from an ML pair of values to bool. N.B. This differs from the functions in the typeID which take a Poly pair. *) fun equalityForType(ty: types, level: level, typeVarMap: typeVarMap): codetree = let val nLevel = newLevel level (* The final result function must take a single argument. *) val resultCode = makeEq(ty, nLevel, fn (typeId, _, l) => codeId(typeId, l), typeVarMap) in (* We need to wrap this up in a new inline function. *) mkInlproc(mkEval(resultCode, [mkInd(0, arg1), mkInd(1, arg1)]), 1, "equality", getClosure nLevel, 0) end (* This code is used when the type checker has to construct a unique monotype because a type variable has escaped to the top level. The equality code always returns true and the printer prints "?". *) fun codeForUniqueId() = let open TypeValue val alwaysTrue = mkProc(CodeTrue, 2, "codeForUniqueId-equal", [], 0) val printCode = mkEval( rtsFunction POLY_SYS_alloc_store, [ mkConst (toMachineWord 1), mkConst (toMachineWord mutableFlags), codePrintDefault]) in createTypeValue{ eqCode = alwaysTrue, printCode = printCode, boxedCode = boxedEither, sizeCode = singleWord } end val noEquality = mkProc(CodeFalse, 2, "noEquality", [], 0) (* Since we don't have a way of writing a "printity" type variable there are cases when the printer will have to fall back to this. e.g. if we have a polymorphic printing function as a functor argument. *) val noPrinter = codePrintDefault (* If this is a polymorphic value apply it to the type instance. *) fun applyToInstance'([], level, _, code) = code level (* Monomorphic. *) | applyToInstance'(sourceTypes, level, polyVarMap, code) = let (* If we need either the equality or print function we generate a new entry and ignore anything in the cache. *) fun makePolyParameter {value=t, equality, printity} = if equality orelse printity then let open TypeValue fun getTypeValueForID(typeId, _, l) = codeId(typeId, l) val eqCode = if equality then makeEq(t, level, fn (typeId, _, l) => codeId(typeId, l), polyVarMap) else noEquality val boxedCode = boxednessForType(t, level, getTypeValueForID, polyVarMap) val printCode = if printity then printerForType(t, level, polyVarMap) else noPrinter val sizeCode = sizeForType(t, level, getTypeValueForID, polyVarMap) in createTypeValue{ eqCode=eqCode, printCode=printCode, boxedCode=boxedCode, sizeCode=sizeCode} end else (* If we don't require the equality or print function we can use the cache. *) case findCachedTypeCode(polyVarMap, t) of SOME (code, _) => code level | NONE => let val maxCache = getMaxDepth polyVarMap (t, 1) val cacheEntry = List.nth(polyVarMap, List.length polyVarMap - maxCache) val { cache, mkAddr, level=decLevel, ...} = cacheEntry local open TypeValue val boxedCode = boxednessForType(t, decLevel, fn (typeId, _, l) => codeId(typeId, l), polyVarMap) val sizeCode = sizeForType(t, decLevel, fn (typeId, _, l) => codeId(typeId, l), polyVarMap) in val typeValue = createTypeValue{ eqCode=noEquality, printCode=noPrinter, boxedCode=boxedCode, sizeCode=sizeCode} end (* Make a new entry and put it in the cache. *) val decAddr = mkAddr 1 val () = cache := {decCode = mkDec(decAddr, typeValue), typeOf = t, address = decAddr } :: !cache in mkLoad(decAddr, level, decLevel) end in mkEval(code level, List.map makePolyParameter sourceTypes) end (* For now limit this to equality types. *) fun applyToInstance(sourceTypes, level, polyVarMap, code) = applyToInstance'( List.filter(fn {equality, ...} => not justForEqualityTypes orelse equality) sourceTypes, level, polyVarMap, code) structure Sharing = struct type typeId = typeId type codetree = codetree type types = types type typeConstrs= typeConstrs type typeConstrSet=typeConstrSet type typeVarForm=typeVarForm type typeVarMap = typeVarMap type codeBinding = codeBinding type level = level end end; polyml-5.6/mlsource/MLCompiler/TYPEIDCODESIG.sml000066400000000000000000000057411265146633400212660ustar00rootroot00000000000000(* Copyright (c) 2009, 2015 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature TYPEIDCODESIG = sig type typeId type codetree type codeBinding type types type typeConstrs type typeConstrSet type typeVarForm type typeVarMap type level val codeId: typeId * level -> codetree val codeGenerativeId: typeId * bool * (int->int) * level -> codetree val createDatatypeFunctions: {typeConstr: typeConstrSet, eqStatus: bool, boxedCode: codetree, sizeCode: codetree } list * (int->int) * level * typeVarMap * bool -> codeBinding list val codeForUniqueId: unit->codetree (* Generate a function of the form t*int->pretty for values of type t. *) val printerForType: types * level * typeVarMap -> codetree (* Generate a function of the form (t,t) -> bool. *) val equalityForType: types * level * typeVarMap -> codetree val applyToInstance: { value: types, equality: bool, printity: bool} list * level * typeVarMap * (level -> codetree) -> codetree structure TypeVarMap: sig (* Cache of type values and map of type variables. *) type typeVarMap = typeVarMap val defaultTypeVarMap: (int->int) * level -> typeVarMap (* The end of the chain. *) (* Add a set of type variables to the map. *) val extendTypeVarMap: (typeVarForm * (level->codetree)) list * (int->int) * level * typeVarMap -> typeVarMap (* Look up a type variable and return the type it's mapped to. *) val mapTypeVars: typeVarMap -> typeVarForm -> types option (* Mark in the cache chain that some type constructors are new. *) val markTypeConstructors: typeConstrs list * (int->int) * level * typeVarMap -> typeVarMap (* Get the set of cached type values that have been created after this entry. *) val getCachedTypeValues: typeVarMap -> codeBinding list end val defaultTypeCode: codetree val justForEqualityTypes: bool structure Sharing: sig type typeId = typeId type codetree = codetree type types = types type typeConstrs= typeConstrs type typeConstrSet=typeConstrSet type typeVarForm=typeVarForm type typeVarMap = typeVarMap type codeBinding = codeBinding type level = level end end; polyml-5.6/mlsource/MLCompiler/TYPETREESIG.sml000066400000000000000000000242761265146633400211020ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*****************************************************************************) (* TYPETREE exports signature *) (*****************************************************************************) signature TYPETREESIG = sig type types; type values; type typeConstrs; type typeConstrSet type typeVarForm type lexan; type typeId; type pretty; type ptProperties type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type exportTree = location * ptProperties list type navigation = {parent: (unit -> exportTree) option, next: (unit -> exportTree) option, previous: (unit -> exportTree) option} type matchResult type locationProp type structVals type codetree type printTypeEnv = { lookupType: string -> (typeConstrSet * (int->typeId) option) option, lookupStruct: string -> (structVals * (int->typeId) option) option} val emptyTypeEnv: printTypeEnv val mkTypeVar: int * bool * bool * bool -> types val mkTypeConstruction: string * typeConstrs * types list * locationProp list -> types; val mkProductType: types list -> types; val mkFunctionType: types * types -> types; val mkLabelled: {name: string, typeof: types } list * bool -> types; val mkLabelEntry: string * types -> {name: string, typeof: types }; val mkOverloadSet: typeConstrs list -> types; val sortLabels: {name: string, typeof: types } list -> {name: string, typeof: types } list; val entryNumber: string * types -> int; val recordNotFrozen: types -> bool; val recordWidth: types -> int; val recordFieldMap: (types -> 'a) -> types -> 'a list val makeEquivalent: typeConstrs * types list -> types; val firstArg: types -> types; (* Follow a chain of unified type variables *) val eventual: types -> types (* Test for function type and return function argument. *) val getFnArgType: types -> types option (* Unify two type variables which would otherwise be non-unifiable. *) val linkTypeVars: typeVarForm * typeVarForm -> unit; val setTvarLevel: typeVarForm * int -> unit; (* Copy a type constructor. *) val copyTypeConstr: typeConstrs * (typeId -> typeId option) * (types -> types) * (string -> string) -> typeConstrs val copyTypeConstrWithCache: typeConstrs * (typeId -> typeId option) * (types -> types) * (string -> string) * typeConstrs list -> typeConstrs (* Copy a type. *) val copyType: types * (types -> types) * (typeConstrs -> typeConstrs) -> types; (* Compose two typeId maps. *) val composeMaps: (int -> typeId) * (int -> typeId) -> (int -> typeId) (* Print it out prettily *) val display: types * int * printTypeEnv -> pretty; val displayWithMap: types * int * printTypeEnv * (int->typeId) option -> pretty; (* Print out a type constructor. *) val displayTypeConstrs: typeConstrSet * int * printTypeEnv -> pretty; val displayTypeConstrsWithMap: typeConstrSet * int * printTypeEnv * (int->typeId) option -> pretty; (* A list of type variables. *) val displayTypeVariables: typeVarForm list * int -> pretty list; (* Returns the preferred type constructor from an overload. *) val typeConstrFromOverload: types * bool -> typeConstrs; (* Check a set of mutually recursive datatypes to see which admit equality. *) val computeDatatypeEqualities: typeConstrSet list * (int -> bool) -> unit; (* Unify two type structures to give a unified type. *) val unifyTypes: types * types -> matchResult option (* Pretty print the error message. *) val unifyTypesErrorReport: lexan * printTypeEnv * printTypeEnv * string -> matchResult -> pretty (* Check that a type constructor permits equality. *) val permitsEquality: typeConstrs -> bool (* And whether a type admits equality. *) val typePermitsEquality: types -> bool (* Generate new copies of all unbound type variables - this is used on all non-local values or constructors so that, for example, each occurence of "hd", which has type 'a list -> 'a, can be separately bound to types. *) val generalise: types -> types * {value: types, equality: bool, printity: bool} list (* Create an instance of an overloaded type. *) val generaliseOverload: types * typeConstrs list * bool -> types * types list; (* The same as generalise but with a function that looks up types. *) val generaliseWithMap: types * (typeVarForm -> types option) -> types * {value: types, equality: bool, printity: bool} list (* Return the type variables that would be generalised at this point. *) val getPolyTypeVars: types * (typeVarForm -> types option) -> typeVarForm list (* Release type variables at this nesting level. Updates the type to the generalised version. *) val allowGeneralisation: types * int * bool * lexan * location * (unit -> pretty) * printTypeEnv -> unit (* Check for a local datatype "escaping". Added for ML97. *) val checkForEscapingDatatypes: types * (string -> unit) -> unit (* Check for free type variables. Added for ML97. *) val checkForFreeTypeVariables: string * types * lexan * (unit->codetree) -> unit; val constructorResult: types * types list -> types; val identical: types * types -> bool; val boolConstr: typeConstrs; val intConstr: typeConstrs; val charConstr: typeConstrs; val stringConstr: typeConstrs; val wordConstr: typeConstrs; val realConstr: typeConstrs; val refConstr: typeConstrs; val arrayConstr: typeConstrs; val array2Constr: typeConstrs; val byteArrayConstr: typeConstrs; val unitConstr: typeConstrs; val exnConstr: typeConstrs; val undefConstr: typeConstrs; val boolType: types; val intType: types; val charType: types; val stringType: types; val realType: types; val unitType: types; val exnType: types; val wordType: types; val badType: types; val isPointerEqType: typeId -> bool val isFloatingPt: types -> bool val isUndefinedTypeConstr: typeConstrs -> bool val isBadType: types -> bool val sameTypeVar : types * types -> bool; (* If this is simply giving a new name to a type constructor returns the type identifier of the constructor that is being rebound. *) val typeNameRebinding: typeVarForm list * types -> typeId option val leastGeneral: types list -> types (* Parse tree operations. *) type typeParsetree val ParseTypeBad: typeParsetree val makeParseTypeConstruction: (string * location) * (typeParsetree list * location) * location -> typeParsetree val makeParseTypeProduct: typeParsetree list * location -> typeParsetree val makeParseTypeFunction: typeParsetree * typeParsetree * location -> typeParsetree val makeParseTypeLabelled: ((string * location) * typeParsetree * location) list * bool * location -> typeParsetree val makeParseTypeId: typeVarForm * location -> typeParsetree val unitTree: location -> typeParsetree val displayTypeParse: typeParsetree * int * printTypeEnv -> pretty; (* Fill in the values of type variables and make checks. *) val assignTypes: typeParsetree * (string * location -> typeConstrSet) * lexan -> types; (* Check the value we're discarding in an expression sequence or a let binding and return a string if it's not appropriate. *) val checkDiscard: types * lexan -> string option val typeExportTree: navigation * typeParsetree -> exportTree structure TypeValue: sig val extractEquality: codetree -> codetree and extractPrinter: codetree -> codetree and extractBoxed: codetree -> codetree and extractSize: codetree -> codetree val boxedNever: codetree and boxedAlways: codetree and boxedEither: codetree val isBoxedNever: codetree and isBoxedAlways: codetree and isBoxedEither: codetree val singleWord: codetree val createTypeValue: {eqCode: codetree, printCode: codetree, boxedCode: codetree, sizeCode: codetree} -> codetree end structure ValueConstructor: sig val extractTest: codetree -> codetree val extractInjection: codetree -> codetree val extractProjection: codetree -> codetree val createValueConstr: { testMatch: codetree, injectValue: codetree, projectValue: codetree } -> codetree val createNullaryConstr: { testMatch: codetree, constrValue: codetree } -> codetree end (* Types that can be shared. *) structure Sharing: sig type types = types and values = values and typeId = typeId and structVals = structVals and typeConstrs= typeConstrs and typeConstrSet=typeConstrSet and typeParsetree = typeParsetree and locationProp = locationProp and pretty = pretty and lexan = lexan and ptProperties = ptProperties and typeVarForm = typeVarForm and codetree = codetree and matchResult = matchResult end end; polyml-5.6/mlsource/MLCompiler/TYPE_TREE.ML000066400000000000000000004451531265146633400204140ustar00rootroot00000000000000(* Original Poly version: Title: Operations on type structures. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1985 ML translation and other changes: Copyright (c) 2000 Cambridge University Technical Services Limited Further development: Copyright (c) 2000-9, 2012-2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor TYPE_TREE ( structure LEX : LEXSIG structure STRUCTVALS : STRUCTVALSIG; structure PRETTY : PRETTYSIG structure CODETREE : CODETREESIG where type machineWord = Address.machineWord structure EXPORTTREE: EXPORTTREESIG; structure DEBUG: DEBUGSIG structure UTILITIES : sig val mapTable: ('a * 'a -> bool) -> {enter: 'a * 'b -> unit, lookup: 'a -> 'b option} val splitString: string -> { first:string, second:string } end; structure MISC : sig exception InternalError of string; val lookupDefault : ('a -> 'b option) -> ('a -> 'b option) -> 'a -> 'b option end; sharing LEX.Sharing = PRETTY.Sharing = EXPORTTREE.Sharing = STRUCTVALS.Sharing = CODETREE.Sharing ) : TYPETREESIG = (*****************************************************************************) (* TYPETREE functor body *) (*****************************************************************************) struct open MISC; open PRETTY; open STRUCTVALS; open LEX; open UTILITIES; open CODETREE; open EXPORTTREE val badType : types = BadType; (* added 16/4/96 SPF *) fun sameTypeVar (TypeVar x, TypeVar y) = sameTv (x, y) | sameTypeVar _ = false; fun isTypeVar (TypeVar _) = true | isTypeVar _ = false; fun isFunctionType (FunctionType _) = true | isFunctionType _ = false; fun isEmpty EmptyType = true | isEmpty _ = false; fun isBadType BadType = true | isBadType _ = false; val emptyType = EmptyType; fun typesTypeVar (TypeVar x) = x | typesTypeVar _ = raise Match; fun typesFunctionType (FunctionType x) = x | typesFunctionType _ = raise Match; (* This is really left over from an old definition. *) fun tcEquivalent(TypeConstrs{identifier = TypeId {idKind = TypeFn(_, result), ...}, ...}) = result | tcEquivalent _ = raise InternalError "tcEquivalent: Not a type function" (* A type construction is the application of a type constructor to a sequence of types to yield a type. A construction may have a nil list if it is a single type identifier such as ``int''. *) (* When a type constructor is encountered in the first pass this entry is put in. Subsequently a type constructor entry will be assigned to it so that the types can be checked. *) (*************) fun mkTypeVar (level, equality, nonunifiable, printable) = TypeVar (makeTv {value=emptyType, level=level, equality=equality, nonunifiable=nonunifiable, printable=printable}); fun mkTypeConstruction (name, typc, args, locations) = TypeConstruction {name = name, constr = typc, args = args, locations = locations} local (* Turn a tuple into a record of the form {1=.., 2=... }*) fun maptoRecord ([], _) = [] | maptoRecord (H::T, i) = {name=Int.toString i, typeof=H} :: maptoRecord (T,i+1) in fun mkProductType (typel: types list) = let val fields = maptoRecord (typel, 1) in LabelledType {recList = fields, fullList = FieldList(List.map #name fields, true)} end end fun mkFunctionType (arg, result) = FunctionType {arg = arg, result = result}; fun mkOverloadSet [constr] = (* If there is just a single constructor in the set we make a type construction from it. *) mkTypeConstruction(tcName constr, constr, nil, []) | mkOverloadSet constrs = let (* Make a type variable and point this at the overload set so we can narrow down the overloading. *) val var = mkTypeVar (generalisable, false, false, false) val set = OverloadSet {typeset=constrs}; in tvSetValue (typesTypeVar var, set); var end fun mkLabelled (l, frozen) = let val final = FieldList(map #name l, frozen) val lab = LabelledType {recList = l, fullList = if frozen then final else FlexibleList(ref final) } in if frozen then lab else let (* Use a type variable so that the record can be expanded. This also provides a model (equality etc). for any fields that are added later. *) val var = mkTypeVar (generalisable, false, false, false) val () = if isTypeVar var then tvSetValue (typesTypeVar var, lab) else (); in var end end (* Must remove leading zeros because the labels are compared by string comparison. *) fun mkLabelEntry (name, t) = let fun stripZeros s = if size s <= 1 orelse String.str(String.sub(s, 0)) <> "0" then s else stripZeros (String.substring(s, 1, size s-1)); in {name = stripZeros name, typeof = t} end; (* Functions to construct the run-time representations of type constructor values, type values and value constructors. These are all tuples and centralising the code here avoids having the offsets as integers at various places. Monotype constructor and type values are almost the same except that type values have the printer entry as the function whereas monotype constructors have the print entry as a ref pointing to the function, allowing addPrettyPrint to set a printer for the type. The entries for polytypes are functions that take the type values as arguments and return the corresponding values. *) structure TypeValue = struct val equalityOffset = 0 and printerOffset = 1 and boxnessOffset = 2 and sizeOffset = 3 local (* Values used to represent boxness. *) val boxedRepNever = 0w1 (* Never boxed, always tagged e.g. bool *) and boxedRepAlways = 0w2 (* Always boxed, never tagged e.g. function types *) and boxedRepEither = 0w3 (* Either boxed or tagged e.g. (arbitrary precision) int *) fun make n = mkConst(Address.toMachineWord n) fun isCode n = mkInlproc( mkEval(rtsFunction RuntimeCalls.POLY_SYS_word_eq, [mkLoadArgument 0, make n]), 1, "test-box", [], 0) in val boxedNever = make boxedRepNever and boxedAlways = make boxedRepAlways and boxedEither = make boxedRepEither (* Test for boxedness. This must be applied to the value extracted from the "boxedness" field after applying to any base type arguments in the case of a polytype constructor. *) val isBoxedNever = isCode boxedRepNever and isBoxedAlways = isCode boxedRepAlways and isBoxedEither = isCode boxedRepEither end (* Sizes are always a single word. *) val singleWord = mkConst(Address.toMachineWord 0w1) fun extractEquality idCode = mkInd(equalityOffset, idCode) and extractPrinter idCode = mkInd(printerOffset, idCode) and extractBoxed idCode = mkInd(boxnessOffset, idCode) and extractSize idCode = mkInd(sizeOffset, idCode) fun createTypeValue{eqCode, printCode, boxedCode, sizeCode} = mkTuple[eqCode, printCode, boxedCode, sizeCode] end (* Value constructors are represented by tuples, either pairs for nullary constructors or triples for constructors with arguments. For nullary functions the "injection" function is actually the value itself. If this is a polytype all the entries are functions that take the type values for the base types as arguments. *) structure ValueConstructor = struct val testerOffset = 0 val injectorOffset = 1 val projectorOffset = 2 fun extractTest constrCode = mkInd(testerOffset, constrCode) and extractInjection constrCode = mkInd(injectorOffset, constrCode) and extractProjection constrCode = mkInd(projectorOffset, constrCode) fun createValueConstr{testMatch, injectValue, projectValue} = mkTuple[testMatch, injectValue, projectValue] fun createNullaryConstr{ testMatch, constrValue } = mkTuple[testMatch, constrValue] end (* Eqtypes with built-in equality functions. The printer functions are all replaced in the basis. *) local open Address PRETTY RuntimeCalls TypeValue fun defaultMonoTypePrinter _ = PrettyString "?" fun defaultPolyTypePrinter _ _ = PrettyString "?" fun eqAndPrintCode (eqCode, nArgs, boxed) = let val code = if nArgs = 0 then createTypeValue{ eqCode=eqCode, printCode=mkConst (toMachineWord (ref defaultMonoTypePrinter)), boxedCode = boxed, sizeCode = singleWord } else createTypeValue{ eqCode=mkInlproc(eqCode, nArgs, "eq-helper()", [], 0), printCode=mkConst (toMachineWord (ref defaultPolyTypePrinter)), boxedCode = mkInlproc(boxed, nArgs, "boxed-helper()", [], 0), sizeCode = mkInlproc(singleWord, nArgs, "size-helper()", [], 0) } in Global (genCode(code, [], 0) ()) end fun makeConstr(name, eqFun, boxed) = makeTypeConstructor (name, makeFreeId(0, eqAndPrintCode(eqFun, 0, boxed), true, basisDescription name), [DeclaredAt inBasis]) (* wordEq is used both for tagged words and for pointer equality *) val wordEq = CODETREE.rtsFunction POLY_SYS_word_eq (* Strings can be either tagged single characters or vectors whose first word is the length. *) local val stringEquality = mkInlproc( mkCor( (* Either they're equal... *) mkEval(wordEq, [mkLoadArgument 0, mkLoadArgument 1]), (* ... or they're both long and ...*) mkCand( mkCand( mkEval(rtsFunction POLY_SYS_not_bool, [mkEval(rtsFunction POLY_SYS_is_short, [mkLoadArgument 0])]), mkEval(rtsFunction POLY_SYS_not_bool, [mkEval(rtsFunction POLY_SYS_is_short, [mkLoadArgument 1])]) ), (* ... their contents are equal. Because the first word contains the length if we include this in the test we will have tested the length as well and will stop immediately if the lengths are different. *) mkEval(rtsFunction POLY_SYS_bytevec_eq, [mkLoadArgument 0, CodeZero, mkLoadArgument 1, CodeZero, mkEval(rtsFunction POLY_SYS_plus_word, [ mkConst(toMachineWord wordSize), (* Use argument 1 here rather than 0. We could use either but this works better when we're using equality for pattern matching since it gets the length of the constant string. It also works better for the, to me, more natural ordering of variable=constant. *) mkEval(rtsFunction POLY_SYS_string_length, [mkLoadArgument 1]) ]) ]) ) ), 2, "stringEquality", [], 0) in val stringEquality = genCode(stringEquality, [], 0) () end in val intConstr = makeConstr("int", CODETREE.rtsFunction POLY_SYS_equala, boxedEither) (* Need arbitrary precision equality *) val charConstr = makeConstr("char", wordEq, boxedNever) (* Always short *) val stringConstr = makeConstr("string", stringEquality, boxedEither (* Single chars are unboxed. *)) val wordConstr = makeConstr("word", wordEq, boxedNever) (* Ref is a datatype with a single constructor. The constructor is added in INITIALISE. Equality is special for "'a ref", "'a array" and "'a Array2.array". They permit equality even if the 'a is not an eqType. *) val refConstr = makeTypeConstructor ("ref", makeFreeId(1, eqAndPrintCode(wordEq, 1, boxedAlways), true, basisDescription "ref"), [DeclaredAt inBasis]); val arrayConstr = makeTypeConstructor ("array", makeFreeId(1, eqAndPrintCode(wordEq, 1, boxedAlways), true, basisDescription "Array.array"), [DeclaredAt inBasis]); val array2Constr = makeTypeConstructor ("array", makeFreeId(1, eqAndPrintCode(wordEq, 1, boxedAlways), true, basisDescription "Array2.array"), [DeclaredAt inBasis]); val byteArrayConstr = makeTypeConstructor ("byteArray", makeFreeId(0, eqAndPrintCode(wordEq, 0, boxedAlways), true, basisDescription "byteArray"), [DeclaredAt inBasis]); (* Bool is a datatype. The constructors are added in INITIALISE. *) val boolConstr = makeTypeConstructor ("bool", makeFreeId(0, eqAndPrintCode(wordEq, 0, boxedNever), true, basisDescription "bool"), [DeclaredAt inBasis]); end (* These polytypes allow equality even if the type argument is not an equality type. *) fun isPointerEqType id = sameTypeId (id, tcIdentifier refConstr) orelse sameTypeId (id, tcIdentifier arrayConstr) orelse sameTypeId (id, tcIdentifier array2Constr) orelse sameTypeId (id, tcIdentifier byteArrayConstr) (* Non-eqtypes *) local open Address PRETTY TypeValue fun makeType(name, descr, boxed) = let fun defaultPrinter _ = PrettyString "?" val code = createTypeValue{ eqCode=CodeZero (* No equality. *), printCode=mkConst (toMachineWord (ref defaultPrinter)), boxedCode=boxed, sizeCode=singleWord } in makeTypeConstructor ( name, makeFreeId(0, Global (genCode(code, [], 0) ()), false, descr), [DeclaredAt inBasis]) end in val realConstr = makeType("real", basisDescription "real", boxedAlways(* Currently*)); (* Not an eqtype in ML97. *) val exnConstr = makeType("exn", basisDescription "exn", boxedAlways); (* "undefConstr" is used as a place-holder during parsing for the actual type constructor. If the type constructor is not found this may appear in an error message. *) val undefConstr = makeType("undefined", { location = inBasis, description = "Undefined", name = "undefined" }, boxedEither); end (* The unit type is equivalent to the empty record. *) val unitConstr = makeTypeConstructor ("unit", makeTypeFunction({ location = inBasis, description = "unit", name = "unit" }, ([], LabelledType {recList = [], fullList = FieldList([], true)})), [DeclaredAt inBasis]); (* Type identifiers bound to standard type constructors. *) val unitType = mkTypeConstruction ("unit", unitConstr, [], []); val intType = mkTypeConstruction ("int", intConstr, [], []); val realType = mkTypeConstruction ("real", realConstr, [], []); val charType = mkTypeConstruction ("char", charConstr, [], []); val stringType = mkTypeConstruction ("string", stringConstr, [], []); val boolType = mkTypeConstruction ("bool", boolConstr, [], []); val exnType = mkTypeConstruction ("exn", exnConstr, [], []); val wordType = mkTypeConstruction ("word", wordConstr, [], []); fun isUndefined cons = sameTypeId (tcIdentifier cons, tcIdentifier undefConstr); val isUndefinedTypeConstr = isUndefined (* Test if a type is the undefined constructor. *) fun isUndefinedType(TypeConstruction{constr, ...}) = isUndefined constr | isUndefinedType _ = false (* Similar to alphabetic ordering except that shorter labels come before longer ones. This has the advantage that numerical labels are compared by their numerical order i.e. 1 < 2 < 10 whereas alphabetic ordering puts "1" < "10" < "2". *) fun compareLabels (a : string, b : string) : int = if size a = size b then if a = b then 0 else if a < b then ~1 else 1 else if size a < size b then ~1 else 1; (* Sort using the label ordering. A simple sort routine - particularly if the list is already sorted. *) fun sortLabels [] = [] | sortLabels (s::rest) = let fun enter s _ [] = [s] | enter s name (l as ( (h as {name=hname, ...}) :: t)) = let val comp = compareLabels (name, hname); in if comp <= 0 then s :: l else h :: enter s name t end; in enter s (#name s) (sortLabels rest) end (* Chains down a list of type variables returning the type they are bound to. As a side-effect it also points all the type variables at this type to reduce the need for future chaining and to free unused type variables. Normally a type variable points to at most one other, which then points to "empty". However if we have unified two type variables by pointing one at the other, there may be type variables which pointed to the first and which cannot be found and redirected at the second until they themselves are examined. *) fun eventual (t as (TypeVar tv)) : types = let (* Note - don't change the level/copy information - the only type variable with this correct is the one at the end of the list. *) val oldVal = tvValue tv val newVal = eventual oldVal; (* Search that *) in (* Update the type variable to point to the last in the chain. We don't do this if the value hasn't changed. The reason for that was that assignment to refs in the database in the old persistent store system was very expensive and we wanted to avoid unnecessary assignments. This special case could probably be removed. *) if PolyML.pointerEq(oldVal, newVal) then () else tvSetValue (tv, newVal); (* Put it on *) case newVal of EmptyType => t (* Not bound to anything - return the type variable *) | LabelledType (r as { recList, fullList }) => if List.length recList = List.length(recordFields r) then (* All the generic fields are present so we don't need to do anything. *) if recordIsFrozen r then newVal else t else (* We need to add fields from the generic. *) let (* Add any fields from the generic that aren't present in this instance. *) fun createNewField name = { name = name, (* The new type variable has to be created with the same properties as if we had first generalised it from the generic and then unified with this instance. The level is inherited from the instance since the generic will always have level = generalisable. Nonunifiable must be false. *) typeof = mkTypeVar (tvLevel tv, tvEquality tv, false, tvPrintity tv)} fun addToInstance([], []) = [] | addToInstance(generic :: geRest, []) = createNewField generic :: addToInstance(geRest, []) | addToInstance([], instance) = instance (* This case can occur if we are producing an error message because of a type-incorrect program so we just ignore it. *) | addToInstance(generic :: geRest, inst as instance :: iRest) = let val order = compareLabels (generic, #name instance); in if order = 0 (* Equal *) then instance :: addToInstance(geRest, iRest) else if order < 0 (* generic name < instance name *) then createNewField generic :: addToInstance(geRest, inst) else (* This is another case that can occur with type-incorrect code. *) instance :: addToInstance(generic :: geRest, iRest) end val newList = addToInstance(recordFields r, recList) val newRecord = LabelledType {recList = newList, fullList = fullList} in tvSetValue(tv, newRecord); if recordIsFrozen r then newRecord else t end | OverloadSet _ => t (* Return the set of types. *) | _ => newVal (* Return the type it is bound to *) end | eventual t (* not a type variable *) = t; (* Apply a function to every element of a type. *) fun foldType f = let fun foldT typ v = let val t = eventual typ; val res = f t v; (* Process this entry. *) in case t of TypeVar tv => foldT (tvValue tv) res | TypeConstruction {args, ...} => (* Then process the arguments. *) List.foldr (fn (t, v) => foldT t v) res args | FunctionType {arg, result} => foldT arg (foldT result res) | LabelledType {recList,...} => List.foldr (fn ({ typeof, ... }, v) => foldT typeof v) res recList | BadType => res | EmptyType => res | OverloadSet _ => res end in foldT end; (* Checks to see whether a labelled record is in the form of a product i.e. 1=, 2= We only need this for prettyprinting. Zero-length records (i.e. unit) and singleton records are not considered as tuples. *) fun isProductType(LabelledType(r as {recList=recList as _::_::_, ...})) = let fun isRec [] _ = true | isRec ({name, ...} :: l) n = name = Int.toString n andalso isRec l (n+1) in recordIsFrozen r andalso isRec recList 1 end | isProductType _ = false; (* Test to see is a type constructor is in an overload set. *) fun isInSet(tcons: typeConstrs, (H::T): typeConstrs list) = sameTypeId (tcIdentifier tcons, tcIdentifier H) orelse isInSet(tcons, T) | isInSet(_, []: typeConstrs list) = false (* Returns the preferred overload if there is one. *) fun preferredOverload typeset = if isInSet(intConstr, typeset) then SOME intConstr else if isInSet(realConstr, typeset) then SOME realConstr else if isInSet(wordConstr, typeset) then SOME wordConstr else if isInSet(charConstr, typeset) then SOME charConstr else if isInSet(stringConstr, typeset) then SOME stringConstr else NONE fun equalTypeIds(x, y) = let (* True if two types are equal. *) fun equalTypes (TypeConstruction{constr=xVal, args=xArgs, ...}, TypeConstruction{constr=yVal, args=yArgs, ...}) = equalTypeIds(tcIdentifier xVal, tcIdentifier yVal) andalso equalTypeLists (xArgs, yArgs) | equalTypes (FunctionType x, FunctionType y) = equalTypes (#arg x, #arg y) andalso equalTypes (#result x, #result y) | equalTypes (LabelledType x, LabelledType y) = recordIsFrozen x andalso recordIsFrozen y andalso equalRecordLists (#recList x, #recList y) | equalTypes (TypeVar x, TypeVar y) = sameTv (x, y) | equalTypes (EmptyType, EmptyType) = true | equalTypes _ = false and equalTypeLists ([], []) = true | equalTypeLists (x::xs, y::ys) = equalTypes(x, y) andalso equalTypeLists (xs, ys) | equalTypeLists _ = false and equalRecordLists ([], []) = true | equalRecordLists (x::xs, y::ys) = #name x = #name y andalso equalTypes(#typeof x, #typeof y) andalso equalRecordLists (xs, ys) | equalRecordLists _ = false in case (x, y) of (TypeId{idKind=TypeFn(_, xEquiv), ...}, TypeId{idKind=TypeFn(_, yEquiv), ...}) => equalTypes(xEquiv, yEquiv) | _ => sameTypeId(x, y) end (* See if the types are the same. This is a bit of a fudge, but saves carrying around a flag saying whether the structures were copied. This is only an optimisation. If the values are different it will not go wrong. *) val identical : types * types -> bool = PolyML.pointerEq and identicalConstr : typeConstrs * typeConstrs -> bool = PolyML.pointerEq and identicalList : 'a list * 'a list -> bool = PolyML.pointerEq (* Copy a type, avoiding copying type structures unnecessarily. Used to make new type variables for all distinct type variables when generalising polymorphic functions, and to make new type stamps for type constructors when generalising signatures. *) fun copyType (at, copyTypeVar, copyTypeConstr) = let fun copyList [] = [] | copyList (l as (h :: t)) = let val h' = copyType (h, copyTypeVar, copyTypeConstr); val t' = copyList t; in if identical (h', h) andalso identicalList (t', t) then l else h' :: t' end (* copyList *); fun copyRecordList [] = [] | copyRecordList (l as ({name, typeof} :: t)) = let val typeof' = copyType (typeof, copyTypeVar, copyTypeConstr); val t' = copyRecordList t; in if identical (typeof', typeof) andalso identicalList (t', t) then l else {name=name, typeof=typeof'} :: t' end (* copyList *); val atyp = eventual at; in case atyp of TypeVar _ => (* Unbound type variable, flexible record or overloading. *) copyTypeVar atyp | TypeConstruction {constr, args, locations, ...} => let val copiedArgs = copyList args; val copiedConstr = copyTypeConstr constr; (* Use the name from the copied constructor. This will normally be the same as the original EXCEPT in the case where we are using copyType to generate copies of the value constructors of replicated datatypes. *) val copiedName = tcName copiedConstr in if identicalList (copiedArgs, args) andalso identicalConstr (copiedConstr, constr) then atyp else (* Must copy it. *) mkTypeConstruction (copiedName, copiedConstr, copiedArgs, locations) end | FunctionType {arg, result} => let val copiedArg = copyType (arg, copyTypeVar, copyTypeConstr); val copiedRes = copyType (result, copyTypeVar, copyTypeConstr); in if identical (copiedArg, arg) andalso identical (copiedRes, result) then atyp else FunctionType {arg = copiedArg, result = copiedRes} end | LabelledType {recList, fullList} => (* Rigid labelled records only. Flexible ones are treated as type vars. *) let val copiedList = copyRecordList recList in if identicalList (copiedList, recList) then atyp else LabelledType {recList = copiedList, fullList = fullList} end | EmptyType => EmptyType | BadType => BadType | OverloadSet _ => raise InternalError "copyType: OverloadSet found" end (* copyType *); (* Copy a type constructor if it is Bound and in the required range. If this refers to a type function copies that as well. Does not copy value constructors. *) fun copyTypeConstrWithCache (tcon, typeMap, _, mungeName, cache) = case tcIdentifier tcon of TypeId{idKind = TypeFn(args, equiv), description, access, ...} => let val copiedEquiv = copyType(equiv, fn x => x, fn tcon => copyTypeConstrWithCache (tcon, typeMap, fn x => x, mungeName, cache)) in if identical (equiv, copiedEquiv) then tcon (* Type is identical and we don't want to change the name. *) else (* How do we find a type function? *) makeTypeConstructor (mungeName(tcName tcon), TypeId { access = access, description = description, idKind = TypeFn(args, copiedEquiv)}, tcLocations tcon) end | id => ( case typeMap id of NONE => ( (*print(concat[tcName tcon, " not copied\n"]);*) tcon (* No change *) ) | SOME newId => let val name = #second(splitString (tcName tcon)) (* We must only match here if they're really the same. *) fun cacheMatch tc = equalTypeIds(tcIdentifier tc, newId) andalso #second(splitString(tcName tc)) = name in case List.find cacheMatch cache of SOME tc => ( (*print(concat[tcName tcon, " copied as ", tcName tc, "\n"]);*) tc (* Use the entry from the cache. *) ) | NONE => (* Either a hidden identifier or alternatively this can happen as part of the matching process. When matching a structure to a signature we first match up the type constructors then copy the type of each value replacing bound type IDs with the actual IDs as part of the checking process. We will return SOME newId but we don't have a cache so return NONE for List.find. *) let val newName = mungeName(tcName tcon) in (*print(concat[tcName tcon, " not cached\n"]);*) makeTypeConstructor(newName, newId, tcLocations tcon) end end ) (* Exported version. *) fun copyTypeConstr (tcon, typeMap, copyTypeVar, mungeName) = copyTypeConstrWithCache(tcon, typeMap, copyTypeVar, mungeName, []) (* Compose typeID maps. If the first map returns a Bound id we apply the second otherwise just return the result of the first. *) fun composeMaps(m1, m2) n = let fun map2 (TypeId{idKind=Bound{ offset, ...}, ...}) = m2 offset | map2 (id as TypeId{idKind=Free _, ...}) = id | map2 (TypeId{idKind=TypeFn(args, equiv), access, description, ...}) = let fun copyId(TypeId{idKind=Free _, ...}) = NONE | copyId id = SOME(map2 id) (* If it's a type function e.g. this was a "where type" we have to apply the map to any type identifiers in the type. *) val copiedEquiv = copyType(equiv, fn x => x, fn tcon => copyTypeConstr (tcon, copyId, fn x => x, fn y => y)) in TypeId{idKind = TypeFn(args, copiedEquiv), access=access, description=description} end in map2(m1 n) end (* Basic procedure to print a type structure. *) type printTypeEnv = { lookupType: string -> (typeConstrSet * (int->typeId) option) option, lookupStruct: string -> (structVals * (int->typeId) option) option} val emptyTypeEnv = { lookupType = fn _ => NONE, lookupStruct = fn _ => NONE } (* Test whether two type constructors are the same after mapping. This is used to try to find the correct "path" to a type constructor when printing. *) fun eqTypeConstrs(xTypeCons, xMap, yTypeCons, yMap) = let fun id x = x fun copyId (SOME mapTypeId) (TypeId{idKind=Bound{ offset, ...}, ...}) = SOME(mapTypeId offset) | copyId _ _ = NONE val mappedX = copyTypeConstr(xTypeCons, copyId xMap, id, id) and mappedY = copyTypeConstr(yTypeCons, copyId yMap, id, id) in equalTypeIds(tcIdentifier mappedX, tcIdentifier mappedY) end (* prints a block of items *) fun tDisp (t : types, depth : int, typeVarName : typeVarForm -> string, env: printTypeEnv, sigMap: (int->typeId)option) : pretty = let (* prints a block of items *) fun dispP (t : types, depth : int) : pretty = let (* prints a block of items *) fun parenthesise depth t = if depth <= 1 then PrettyString "..." else PrettyBlock (0, false, [], [ PrettyString "(", dispP (t, depth - 1), PrettyString ")" ]); (* prints a sequence of items *) fun prettyList [] _ _: pretty list = [] | prettyList [H] depth separator = let val v = eventual H; in if separator = "*" andalso (isFunctionType v orelse isProductType v) then (* Must bracket the expression *) [parenthesise depth v] else [dispP (v, depth)] end | prettyList (H :: T) depth separator = if depth <= 0 then [PrettyString "..."] else let val v = eventual H; in PrettyBlock (0, false, [], [(if separator = "*" andalso (isFunctionType v orelse isProductType v) then (* Must bracket the expression *) parenthesise depth v else dispP (v, depth)), PrettyBreak (if separator = "," then 0 else 1, 0), PrettyString separator ]) :: PrettyBreak (1, 0) :: prettyList T (depth - 1) separator end; val typ = eventual t; (* Find the real type structure *) in case typ of TypeVar tyVar => let val tyVal : types = tvValue tyVar; in case tyVal of EmptyType => PrettyString (typeVarName tyVar) | _ => dispP (tyVal, depth) end (* Type construction. *) | TypeConstruction {args, name, constr=typeConstructor, ...} => let val constrName = (* Use the type constructor name unless we're had an error. *) if isUndefined typeConstructor then name else tcName typeConstructor (* There are three possible cases: we may not find any type with the name, we may look up the name and find the type or we may look up the name and find a different type. *) datatype isFound = NotFound | FoundMatch | FoundNotMatch (* If we're printing a value that refers to a type constructor we want to print the correct amount of any structure prefix for the current context. *) fun findType (_, []) = NotFound | findType ({ lookupType, ... }, [typeName]) = ( (* This must be the name of a type. *) case lookupType typeName of SOME (t, map) => if eqTypeConstrs(typeConstructor, sigMap, tsConstr t, map) then FoundMatch else FoundNotMatch | NONE => NotFound ) | findType ({ lookupStruct, ... }, structName :: tail) = ( (* This must be the name of a structure. Does it contain our type? *) case lookupStruct structName of SOME(Struct { signat, ...}, map) => let val Signatures { tab, typeIdMap, ...} = signat val Env { lookupType, lookupStruct, ...} = makeEnv tab val newMap = case map of SOME map => composeMaps(typeIdMap, map) | NONE => typeIdMap fun subLookupType s = case lookupType s of NONE => NONE | SOME t => SOME(t, SOME newMap) fun subLookupStruct s = case lookupStruct s of NONE => NONE | SOME t => SOME(t, SOME newMap) in findType({lookupType=subLookupType, lookupStruct=subLookupStruct}, tail) end | NONE => NotFound ) (* See if we have this type in the current environment or in some structure in the current environment. The name we have may be a full structure path. *) fun nameToList ("", l) = (l, NotFound) (* Not there. *) | nameToList (s, l) = let val { first, second } = splitString s val currentList = second :: l in case findType(env, currentList) of FoundMatch => (currentList, FoundMatch) | FoundNotMatch => ( case nameToList(first, currentList) of result as (_, FoundMatch) => result | (l, _) => (l, FoundNotMatch) ) | NotFound => nameToList(first, currentList) end (* Try the type constructor name first. This is usually accurate. If not fall back to the type identifier. This may be needed in rarer cases. *) val names = case nameToList(constrName, []) of (names, FoundMatch) => names (* Found the type constructor name. *) | (names, f) => let (* Try the type identifier name. *) val TypeId { description = { name=idName, ...}, ...} = case (sigMap, tcIdentifier typeConstructor) of (SOME map, TypeId{idKind=Bound{offset, ...}, ...}) => map offset | (_, id) => id (* Only add "?" if we actually found a type with the required name but it wasn't the right one. This allows us to print a sensible result where the type has been shadowed but doesn't affect situations such as where we create a unique type name for a free type variable. *) fun addQuery n = case f of FoundNotMatch => "?" :: n | _ => n in if idName = "" then addQuery names else case nameToList(idName, []) of (idNames, FoundMatch) => idNames | (_, _) => addQuery names (* Print it as "?.t". This isn't ideal but will help in situations where we have redefined "t". *) end val newName = String.concatWith "." names (* Get the declaration position for the type constructor. *) val constrContext = if isUndefined typeConstructor then [] else ( case List.find(fn DeclaredAt _ => true | _ => false) (tcLocations typeConstructor) of SOME(DeclaredAt loc) => [ContextLocation loc] | _ => [] ) val constructorEntry = PrettyBlock(0, false, constrContext, [PrettyString newName(*constrName*)]) in case args of [] => constructorEntry | args as hd :: tl => let val argVal = eventual hd; in PrettyBlock (0, false, [], [ (* If we have just a single argument and it's just a type constructor or a construction we don't need to parenthesise it. *) if null tl andalso not (isProductType argVal orelse isFunctionType argVal) then dispP (argVal, depth - 1) else if depth <= 1 then PrettyString "..." else PrettyBlock(0, false, [], [PrettyString "(", PrettyBreak (0, 0)] @ prettyList args (depth - 1) "," @ [PrettyBreak (0, 0), PrettyString ")"] ), PrettyBreak(1, 0), constructorEntry (* The constructor. *) ]) end end | FunctionType {arg, result} => if depth <= 0 then PrettyString "..." else (* print out in infix notation *) let val evArg = eventual arg; in PrettyBlock (0, false, [], [ (* If the argument is a function it must be printed as (a-> b)->.. *) if isFunctionType evArg then parenthesise depth evArg else dispP (evArg, depth - 1), PrettyBreak(1, 2), PrettyString "->", PrettyBreak (1, 2), dispP (result, depth - 1) ]) end | LabelledType (r as {recList, ...}) => if depth <= 0 then PrettyString "..." else if isProductType typ then (* Print as a product *) PrettyBlock (0, false, [], (* Print them as t1 * t2 * t3 .... *) prettyList (map (fn {typeof, ...} => typeof) recList) depth "*") else (* Print as a record *) let (* The ordering on fields is designed to allow mixing of tuples and records (e.g. #1). It puts shorter names before longer so that #11 comes after #2 and before #100. For named records it does not make for easy reading so we sort those alphabetically when printing. *) val sortedRecList = Misc.quickSort(fn {name = a, ...} => fn {name = b, ...} => a <= b) recList in PrettyBlock (2, false, [], PrettyString "{" :: (let fun pRec [] _ = [] | pRec ({name, typeof} :: T) depth = if depth <= 0 then [PrettyString "..."] else [ PrettyBlock(0, false, [], [ PrettyBlock(0, false, [], [ PrettyString (name ^ ":"), PrettyBreak(1, 0), dispP(typeof, depth - 1) ] @ (if null T then [] else [PrettyBreak (0, 0), PrettyString ","]) ) ]@ (if null T then [] else PrettyBreak (1, 0) :: pRec T (depth-1)) ) ] in pRec sortedRecList (depth - 1) end) @ [ PrettyString (if recordIsFrozen r then "}" else case recList of [] => "...}" | _ => ", ...}")] ) end | OverloadSet {typeset = []} => PrettyString "no type" | OverloadSet {typeset = tconslist} => (* This typically arises when printing error messages in the second pass because the third pass will select a single type e.g. int where possible. To simplify the messages select a single type if possible. *) ( case preferredOverload tconslist of SOME tcons => dispP(mkTypeConstruction (tcName tcons, tcons,[], []), depth) | NONE => (* Just print the type constructors separated by / *) let fun constrLocation tcons = case List.find(fn DeclaredAt _ => true | _ => false) (tcLocations tcons) of SOME(DeclaredAt loc) => [ContextLocation loc] | _ => [] (* Type constructor with context. *) fun tconsItem tcons = PrettyBlock(0, false, constrLocation tcons, [PrettyString(tcName tcons)]) fun printTCcons [] = [] | printTCcons [tcons] = [tconsItem tcons] | printTCcons (tcons::rest) = tconsItem tcons :: PrettyBreak (0, 0) :: PrettyString "/" :: printTCcons rest in PrettyBlock (0, false, [], printTCcons tconslist) end ) | EmptyType => PrettyString "no type" | BadType => PrettyString "bad" end (* dispP *) in dispP (t, depth) end (* tDisp *); (* Generate unique type-variable names. *) fun varNameSequence () : typeVarForm -> string = (* We need to ensure that every distinct type variable has a distinct name. Each new type variable is given a name starting at "'a" and going on through the alphabet. *) let datatype names = Names of {name: string, entry: typeVarForm} val nameNum = ref ~1 val gNameList = ref [] (* List of names *) in (* If the type is already there return the name we have given it otherwise make a new name and put it in the list. *) fn var => case List.find (fn (Names {entry,...}) => sameTv (entry, var)) (!gNameList) of NONE => (* Not on the list - make a new name *) let fun name num = (if num >= 26 then name (num div 26 - 1) else "") ^ String.str (Char.chr (num mod 26 + Char.ord #"a")) val () = nameNum := !nameNum + 1 val n = (if tvEquality var then "''" else "'") ^ name(!nameNum) (* Should explicit type variables be distinguished? *) in gNameList := Names{name=n, entry=var} :: !gNameList; n end | SOME (Names {name,...}) => name end (* varNameSequence *) (* Create the type variables on the fly. *) fun tcTypeVars tc = List.tabulate(tcArity tc, fn _ => makeTv{value=EmptyType, level=generalisable, nonunifiable=false, equality=false, printable=false}) (* Print a type (as a block of items) *) fun displayWithMap (t : types, depth : int, env, sigMap) = tDisp (t, depth, varNameSequence (), env, sigMap) and display (t : types, depth : int, env) = tDisp (t, depth, varNameSequence (), env, NONE) (* Print out zero, one or more type variables (unblocked) *) fun printTypeVars([], _, _) = [] (* No type vars i.e. monotype *) | printTypeVars([oneVar], depth, typeV) = (* Single type var. *) [ tDisp (TypeVar oneVar, depth, typeV, emptyTypeEnv, NONE), PrettyBreak (1, 0) ] | printTypeVars(vars, depth, typeV) = (* Must parenthesise them. *) if depth <= 1 then [PrettyString "..."] else [ PrettyBlock(0, false, [], PrettyString "(" :: PrettyBreak(0, 0) :: (let fun pVars vars depth: pretty list = if depth <= 0 then [PrettyString "..."] else if null vars then [] else [ tDisp (TypeVar(hd vars), depth, typeV, emptyTypeEnv, NONE), PrettyBreak (0, 0) ] @ (if null (tl vars) then [] else PrettyString "," :: PrettyBreak (1, 0) :: pVars (tl vars) (depth - 1) ) in pVars vars depth end) @ [PrettyString ")"] ), PrettyBreak (1, 0) ] (* Version used in parsetree. *) fun displayTypeVariables (vars : typeVarForm list, depth : int) = printTypeVars (vars, depth, varNameSequence ()) (* Parse tree for types. This is used to represent types in the source. *) datatype typeParsetree = ParseTypeConstruction of { name: string, args: typeParsetree list, location: location, nameLoc: location, argLoc: location, (* foundConstructor is set to the constructor when it has been looked up. This allows us to get the location where it was declared if we export the parse-tree. *) foundConstructor: typeConstrs ref } | ParseTypeProduct of { fields: typeParsetree list, location: location } | ParseTypeFunction of { argType: typeParsetree, resultType: typeParsetree, location: location } | ParseTypeLabelled of { fields: ((string * location) * typeParsetree * location) list, frozen: bool, location: location } | ParseTypeId of { types: typeVarForm, location: location } | ParseTypeBad (* Place holder for errors. *) fun typeFromTypeParse( ParseTypeConstruction{ args, name, location, foundConstructor = ref constr, ...}) = let val argTypes = List.map typeFromTypeParse args in TypeConstruction {name = name, constr = constr, args = argTypes, locations = [DeclaredAt location]} end | typeFromTypeParse(ParseTypeProduct{ fields, ...}) = mkProductType(List.map typeFromTypeParse fields) | typeFromTypeParse(ParseTypeFunction{ argType, resultType, ...}) = mkFunctionType(typeFromTypeParse argType, typeFromTypeParse resultType) | typeFromTypeParse(ParseTypeLabelled{ fields, frozen, ...}) = let fun makeField((name, _), t, _) = mkLabelEntry(name, typeFromTypeParse t) in mkLabelled(sortLabels(List.map makeField fields), frozen) end | typeFromTypeParse(ParseTypeId{ types, ...}) = TypeVar types | typeFromTypeParse(ParseTypeBad) = BadType fun makeParseTypeConstruction((constrName, nameLoc), (args, argLoc), location) = ParseTypeConstruction{ name = constrName, nameLoc = nameLoc, args = args, argLoc = argLoc, location = location, foundConstructor = ref undefConstr } fun makeParseTypeProduct(recList, location) = ParseTypeProduct{ fields = recList, location = location } fun makeParseTypeFunction(arg, result, location) = ParseTypeFunction{ argType = arg, resultType = result, location = location } fun makeParseTypeLabelled(recList, frozen, location) = ParseTypeLabelled{ fields = recList, frozen = frozen, location = location } fun makeParseTypeId(types, location) = ParseTypeId{ types = types, location = location } fun unitTree location = ParseTypeLabelled{ fields = [], frozen = true, location = location } (* Build an export tree from the parse tree. *) fun typeExportTree(navigation, p: typeParsetree) = let val typeof = typeFromTypeParse p (* Common properties for navigation and printing. *) val commonProps = PTprint(fn d => display(typeof, d, emptyTypeEnv)) :: PTtype typeof :: exportNavigationProps navigation fun asParent () = typeExportTree(navigation, p) in case p of ParseTypeConstruction{ location, nameLoc, args, argLoc, ...} => let (* If the constructor has been bound return the declaration location. We have to attach the declaration location in the right place if this is a polytype e.g. if we have "int list" here we will have the location for "list" which is the second item not the first. *) val (name, decLoc) = case typeof of TypeConstruction { constr, name, ...} => if isUndefined constr then (name, []) else (name, mapLocationProps(tcLocations constr)) | _ => ("", []) (* Error? *) val navNameAndArgs = (* Separate cases for nullary, unary and higher type constructions. *) case args of [] => decLoc (* Singleton e.g. int *) | [oneArg] => let (* Single arg e.g. int list. *) (* Navigate between the type constructor and the argument. Since the arguments come before the constructor we go there first. *) fun getArg () = typeExportTree({parent=SOME asParent, previous=NONE, next=SOME getName}, oneArg) and getName () = getStringAsTree({parent=SOME asParent, previous=SOME getArg, next=NONE}, name, nameLoc, decLoc) in [PTfirstChild getArg] end | args => let (* Multiple arguments e.g. (int, string) pair *) fun getArgs () = (argLoc, exportList(typeExportTree, SOME getArgs) args @ exportNavigationProps{parent=SOME asParent, previous=NONE, next=SOME getName}) and getName () = getStringAsTree({parent=SOME asParent, previous=SOME getArgs, next=NONE}, name, nameLoc, decLoc) in [PTfirstChild getArgs] end in (location, navNameAndArgs @ commonProps) end | ParseTypeProduct{ location, fields, ...} => (location, exportList(typeExportTree, SOME asParent) fields @ commonProps) | ParseTypeFunction{ location, argType, resultType, ...} => (location, exportList(typeExportTree, SOME asParent) [argType, resultType] @ commonProps) | ParseTypeLabelled{ location, fields, ...} => let fun exportField(navigation, label as ((name, nameLoc), t, fullLoc)) = let (* The first position is the label, the second the type *) fun asParent () = exportField (navigation, label) fun getLab () = getStringAsTree({parent=SOME asParent, next=SOME getType, previous=NONE}, name, nameLoc, [PTtype(typeFromTypeParse t)]) and getType () = typeExportTree({parent=SOME asParent, previous=SOME getLab, next=NONE}, t) in (fullLoc, PTfirstChild getLab :: exportNavigationProps navigation) end in (location, exportList(exportField, SOME asParent) fields @ commonProps) end | ParseTypeId{ location, ...} => (location, commonProps) | ParseTypeBad => (nullLocation, commonProps) end fun displayTypeParse(types, depth, env) = display(typeFromTypeParse types, depth, env) (* Associates type constructors from the environment with type identifiers (NOT type variables) *) fun assignTypes (tp : typeParsetree, lookupType : string * location -> typeConstrSet, lex : lexan) = let fun typeFromTypeParse(ParseTypeConstruction{ args, name, location, foundConstructor, ...}) = let (* Assign constructor, then the parameters. *) val TypeConstrSet(constructor, _) = lookupType (name, location) val () = (* Check that it has the correct arity. *) if not (isUndefined constructor) then let val arity : int = tcArity constructor; val num : int = length args; in if arity <> num then (* Give an error message *) errorMessage (lex, location, String.concat["Type constructor (", tcName constructor, ") requires ", Int.toString arity, " type(s) not ", Int.toString num]) else foundConstructor := constructor end else () val argTypes = List.map typeFromTypeParse args in TypeConstruction {name = name, constr = constructor, args = argTypes, locations = [DeclaredAt location]} end | typeFromTypeParse(ParseTypeProduct{ fields, ...}) = mkProductType(List.map typeFromTypeParse fields) | typeFromTypeParse(ParseTypeFunction{ argType, resultType, ...}) = mkFunctionType(typeFromTypeParse argType, typeFromTypeParse resultType) | typeFromTypeParse(ParseTypeLabelled{ fields, frozen, ...}) = let fun makeField((name, _), t, _) = mkLabelEntry(name, typeFromTypeParse t) in mkLabelled(sortLabels(List.map makeField fields), frozen) end | typeFromTypeParse(ParseTypeId{ types, ...}) = TypeVar types | typeFromTypeParse(ParseTypeBad) = BadType in typeFromTypeParse tp end; (* When we have finished processing a list of patterns we need to check that the record is now frozen. *) fun recordNotFrozen (TypeVar t) : bool = (* Follow the chain *) recordNotFrozen (tvValue t) | recordNotFrozen (LabelledType r) = not(recordIsFrozen r) | recordNotFrozen _ = false (* record or type alias *); datatype generalMatch = Matched of {old: typeVarForm, new: types}; fun generaliseTypes (atyp : types, checkTv: typeVarForm->types option) = let val madeList = ref [] (* List of tyVars. *); fun tvs atyp = let val tyVar = typesTypeVar atyp; in case List.find(fn Matched{old, ...} => sameTv (old, tyVar)) (!madeList) of SOME(Matched{new, ...}) => new | NONE => ( case checkTv tyVar of SOME found => found | NONE => let (* Not on the list - make a new name *) (* Make a unifiable type variable even if the original is nonunifiable. *) val n : types = mkTypeVar (generalisable, tvEquality tyVar, false, tvPrintity tyVar) in (* Set the new variable to have the same value as the existing. That is only really needed if we have an overload set. *) tvSetValue (typesTypeVar n, tvValue tyVar); madeList := Matched {old = tyVar, new = n} :: !madeList; n end ) end fun copyTypeVar (atyp as TypeVar tyVar) = if tvLevel tyVar <> generalisable then atyp (* Not generalisable. *) else (* Unbound, overload set or flexible record *) let val newTv = tvs atyp in (* If we have a type variable pointing to a flexible record we have to copy the type pointed at by the variable. *) case tvValue tyVar of valu as LabelledType _ => tvSetValue (typesTypeVar newTv, copyType (valu, copyTypeVar, fn t => t)) | _ => (); newTv end | copyTypeVar atyp = atyp val copied = (* Only process type variables. Return type constructors unchanged. *) copyType (atyp, copyTypeVar, fn t => t (*copyTCons*)) in (copied, ! madeList) end (* generaliseTypes *); (* Exported wrapper for generaliseTypes. *) fun generalise atyp = let val (t, newMatch) = generaliseTypes (atyp, fn _ => NONE) fun makeResult(Matched{new, old}) = {value=new, equality=tvEquality old, printity=tvPrintity old} in (t, List.map makeResult newMatch) end; (* Return the original polymorphic type variables. *) fun getPolyTypeVars(atyp, map) = let val (_, newMatch) = generaliseTypes (atyp, map) in List.map (fn(Matched{old, ...}) => old) newMatch end; fun generaliseWithMap(atyp, map) = let val (t, newMatch) = generaliseTypes (atyp, map) fun makeResult(Matched{new, old}) = {value=new, equality=tvEquality old, printity=tvPrintity old} in (t, List.map makeResult newMatch) end (* Find the argument type which gives this result when the constructor is applied. If we have, for example, a value of type int list and we have discovered that this is a "::" node we have to work back by comparing the type of "::" ('a * 'a list -> 'a list) to find the argument of the constructor (int * int list) and hence how to print it. (Actually "list" is treated specially). *) fun constructorResult (FunctionType{arg, result=TypeConstruction{args, ...}}, typeArgs) = let val matches = ListPair.zip(List.map typesTypeVar args, typeArgs) fun getArg tv = case List.find(fn (atv, _) => sameTv(tv, atv)) matches of SOME (_, ty) => SOME ty | NONE => NONE in #1 (generaliseTypes(arg, getArg)) end | constructorResult _ = raise InternalError "Not a function type" (* If we have a type construction which is an alias for another type we construct the alias by first instantiating all the type variables and then copying the type. *) fun makeEquivalent (atyp, args) = case tcIdentifier atyp of TypeId{idKind=TypeFn(typeArgs, typeResult), ...} => let val matches = ListPair.zip(typeArgs, args) fun getArg tv = case List.find(fn (atv, _) => sameTv(tv, atv)) matches of SOME (_, ty) => SOME ty | NONE => NONE in #1 (generaliseTypes(typeResult, getArg)) end | TypeId _ => raise InternalError "makeEquivalent: Not a type function" (* Look for the occurrence of locally declared datatypes in the type of a value. *) fun checkForEscapingDatatypes(ty: types, errorFn: string->unit) : unit = let fun checkTypes (typ: types) (ok: bool) : bool = case typ of TypeConstruction {constr, args, ...} => if tcIsAbbreviation constr then (* May be an alias for a type that contains a local datatype. *) foldType checkTypes (makeEquivalent (constr, args)) ok else if ok then ( case tcIdentifier constr of TypeId{access=Local{addr, ...}, ...} => if !addr < 0 then ( errorFn("Type of expression contains local datatype (" ^ tcName constr ^") outside its definition."); false ) else true | _ => true (* Could we have a "selected" entry with a local datatype? *) ) else false | _ => ok in foldType checkTypes ty true; () end (* This 3-valued logic is used because in a few cases we may not be sure if equality testing is allowed. If we have 2 mutually recursive datatypes t = x of s | ... and s = z of t we would first examine "t", find that it uses "s", look at "s", find that refers back to "t". To avoid infinite recursion we return the result that equality "maybe" allowed for "t" and hence for "s". However we may find that the other constructors for "t" do not allow equality and so equality will not be allowed for "s" either. *) datatype tri = Yes (* 3-valued logic *) | No | Maybe; (* Returns a flag saying if equality testing is allowed for values of the given type. "equality" is used both to generate the code for a specific call of equality e.g. (a, b, c) = f(x), and to generate the equality operation for a type when it is declared. In the latter case type variables may be parameters which will be filled in later e.g. type 'a list = nil | op :: of ('a * 'a list). "search" is a function which looks up constructors in mutually recursive type declarations. "lookupTypeVar" deals with type variables. If they represent parameters to a type declaration equality checking will be allowed. If we are unifying this type to an equality type variable they will be unified to new equality type variables. Otherwise equality is not allowed. *) fun equality (ty, search, lookupTypeVar) : tri = let (* Can't use foldT because it is not monotonic (equality on ref 'a is allowed). *) (* Returns Yes only if equality testing is allowed for all types in the list. *) fun eqForList ([], soFar) = soFar | eqForList (x::xs, soFar) = case equality (x, search, lookupTypeVar) of No => No | Maybe => eqForList (xs, Maybe) | Yes => eqForList (xs, soFar); in case eventual ty of TypeVar tyVar => (* The type variable may point to a flexible record or an overload set or it may be the end of the chain. If this is a labelled record we have to make sure that any fields we add also admit equality. lookupTypeVar makes the type variable an equality type so that any new fields are checked for equality but we also have to call "equality" to check the existing fields. *) if tvEquality tyVar then Yes else ( case tvValue tyVar of lab as LabelledType _ => ( case lookupTypeVar tyVar of No => No | _ => equality (lab, search, lookupTypeVar) ) | _ => lookupTypeVar tyVar ) | FunctionType {...} => No (* No equality on function types! *) | TypeConstruction {constr, args, ...} => if isUndefined constr then No else if tcIsAbbreviation constr then (* May be an alias for a type that allows equality. *) equality (makeEquivalent (constr, args), search, lookupTypeVar) (* ref - Equality is permitted on refs of all types *) (* The Definition of Standard ML says that ref is the ONLY type constructor which is treated in this way. The standard basis library says that other mutable types such as array should also work this way. *) else if isPointerEqType(tcIdentifier constr) then Yes (* Others apart from ref and real *) else if tcEquality constr (* Equality allowed. *) then eqForList (args, Yes) (* Must be allowed for all the args *) else let (* Not an alias. - Look it up. *) val s = search (tcIdentifier constr); in if s = No then No else eqForList (args, s) end (* TypeConstruction *) | LabelledType {recList, ...} => (* Record equality if all subtypes are (ignore frozen!) *) (* TODO: Avoid copying the list? *) eqForList (map (fn{typeof, ...}=>typeof) recList, Yes) | OverloadSet _ => (* This should not happen because all overload sets should be pointed to by type variables and so should be handled in the TypeVar case. *) raise InternalError "equality - Overloadset found" | BadType => No | EmptyType => No (* shouldn't occur *) end (* When a datatype is declared we test to see if equality is allowed. The types are mutually recursive so value constructors of one type may take arguments involving values of any of the others. *) fun computeDatatypeEqualities(types: typeConstrSet list, boundIdEq) = let datatype state = Processed of tri (* Already processed or processing. *) | NotSeen of typeConstrSet list (* Value is list of constrs. *); (* This table tells us, for each type constructor, whether it definitely admits equality, definitely does not or whether we have yet to look at it. *) fun isProcessed (Processed _) = true | isProcessed _ = false; fun stateProcessed (Processed x) = x | stateProcessed _ = raise Match; fun stateNotSeen (NotSeen x) = x | stateNotSeen _ = raise Match; val {enter:typeId * state -> unit,lookup} = mapTable sameTypeId; (* Look at each of the constructors in the list. Equality testing is only allowed if it is allowed for each of the alternatives. *) fun constrEq _ [] soFar = soFar (* end of list - all o.k. *) | constrEq constructor (h :: t) soFar = (* The constructor may be a constant e.g. datatype 'a list = nil | ... or a function e.g. datatype 'a list = ... cons of 'a * 'a list. *) if not (isFunctionType (valTypeOf h)) (* Constant *) then constrEq constructor t soFar (* Go on to the next. *) else let (* Function - look at the argument type. *) (* Equality is allowed for any type-variable. The only type variables allowed are parameters to the datatype so if we have a type variable then equality is allowed for this datatype. *) val eq = equality (#arg (typesFunctionType (valTypeOf h)), genEquality, fn _ => Yes); in if eq = No then (* Not allowed. *) No else (* O.k. - go on to the next. *) constrEq constructor t (if eq = Maybe then Maybe else soFar) end (* constrEq *) (* This procedure checks to see if equality is allowed for this datatype. *) and genEquality constructorId = let (* Look it up to see if we have already done it. It may fail because we may have constructors that do not admit equality. *) val thisState = case (lookup constructorId, constructorId) of (SOME inList, _) => inList | (NONE, TypeId{idKind = Bound{offset, ...}, ...}) => Processed(if boundIdEq offset then Yes else No) | _ => Processed No in if isProcessed thisState then stateProcessed thisState (* Have either done it already or are currently doing it. *) else (* notSeen - look at it now. *) let (* Equality is allowed for this datatype only if all of them admit it. There are various other alternatives but this is what the standard says. If the "name" is rigid (free) we must not grant equality if it is not already there although that is not an error. *) (* Set the state to "Maybe". This prevents infinite recursion. *) val () = enter (constructorId, Processed Maybe); val eq = List.foldl (fn (cons, t) => if t = No then No else constrEq cons (tsConstructors cons) t) Yes (stateNotSeen thisState); in (* Set the state we have found if it is "yes" or "no". If it is maybe we have a recursive reference which appears to admit equality, but may not. E.g. if we have datatype t = A of s | B of int->int and s = C of t if we start processing "t" we will go on to "s" and do that before returning to "t". It is only later we find that "t" does not admit equality. If we get "Maybe" as the final result when all the recursion has been unwound we can set the result to "yes", but any intermediate "Maybe"s have to be done again. *) enter (constructorId, if eq = Maybe then thisState else Processed eq); eq end end (* genEquality *); in (* If we have an eqtype we set it to true, otherwise we set all of them to "notSeen" with the constructor as value. *) List.app (fn dec as TypeConstrSet(decCons, _) => let (* If we have two datatypes which share we may already have one in the table. We have to link them together. *) val tclist = case lookup (tcIdentifier decCons) of NONE => [dec] | SOME l => let val others = stateNotSeen l val newList = dec :: others; in (* If any of these are already equality types (i.e. share with an eqtype) then they all must be. *) if tcEquality decCons orelse tcEquality (tsConstr(hd others)) then List.app (fn d => tcSetEquality (tsConstr d, true)) newList else (); newList end in enter (tcIdentifier decCons, NotSeen tclist) end) types; (* Apply genEquality to each element of the list. *) List.app (fn TypeConstrSet(constructor, _) => let val constructorId = tcIdentifier constructor; val eqForCons = genEquality constructorId; in (* If the result is "Maybe" it involves a recursive reference, but the rest of the type allows equality. The type admits equality. *) if eqForCons = No then () (* Equality not allowed *) else ( (* Turn on equality. *) enter (constructorId, Processed Yes); tcSetEquality (constructor, true) ) end) types end (* computeDatatypeEqualities *); datatype matchResult = SimpleError of types * types * string | TypeConstructorError of types * types * typeConstrs * typeConstrs (* Type matching algorithm for both unification and signature matching. *) (* The mapping has now been moved out of here. Instead when signature matching the target signature is copied before this is called which means that this process is now symmetric. There may be some redundant tests left in here. *) fun unifyTypes(Atype : types, Btype : types) : matchResult option = let (* Get the result in here. This isn't very ML-like but it greatly simplifies converting the code. *) val matchResult: matchResult option ref = ref NONE fun matchError error = (* Only report one error. *) case matchResult of ref (SOME _) => () | r => r := SOME error fun cantMatch(alpha, beta, text) = matchError(SimpleError(alpha, beta, text)) fun match (Atype : types, Btype : types) : unit = let (* Check two records/tuples and return the combined type. *) fun unifyRecords (rA as {recList=typAlist, fullList = gA}, rB as {recList=typBlist, fullList = gB}, typA : types, typB : types) : types = let val typAFrozen = recordIsFrozen rA and typBFrozen = recordIsFrozen rB fun matchLabelled ([], []) = [] (* Something left in bList - this is fine if typeA is not frozen. e.g. (a: s, b: t) will match (a: s, ...) but not just (a:s). *) | matchLabelled ([], bList as {name=bName, ...} :: _) = ( if typAFrozen then cantMatch (typA, typB, "(Field " ^ bName ^ " missing)") else (); bList (* return the remainder of the list *) ) | matchLabelled (aList as {name=aName, ...} :: _, []) = (* Something left in bList *) ( if typBFrozen then cantMatch (typA, typB, "(Field " ^ aName ^ " missing)") else (); aList (* the rest of aList *) ) | matchLabelled (aList as ((aVal as {name=aName,typeof=aType})::aRest), bList as ((bVal as {name=bName,typeof=bType})::bRest)) = (* both not nil - look at the names. *) let val order = compareLabels (aName, bName); in if order = 0 (* equal *) then (* same name - must be unifiable types *) ( (* The result is (either) one of these with the rest of the list. *) match (aType, bType); aVal :: matchLabelled (aRest, bRest) ) else if order < 0 (* aName < bName *) then (* The entries in each list are in order so this means that this entry is not in bList. If the typeB is frozen this is an error. *) if typBFrozen (* Continue with the entry removed. *) then (cantMatch (typA, typB, "(Field " ^ aName ^ " missing)"); aList) else aVal :: matchLabelled (aRest, bList) else (* aName > bName *) if typAFrozen then (cantMatch (typA, typB, "(Field " ^ bName ^ " missing)"); bList) else bVal :: matchLabelled (aList, bRest) end (* not nil *); (* Return the combined list. Only actually used if both are flexible. *) val result = if typAFrozen andalso typBFrozen andalso List.length typAlist <> List.length typBlist then (* Don't attempt to unify the fields if we have the wrong number of items. If we've added or removed an item from a tuple e.g. a function with multiple arguments, it's more useful to know this than to get unification errors on fields that don't match. *) (cantMatch (typA, typB, "(Different number of fields)"); []) else matchLabelled (typAlist, typBlist) fun lastFlex(FlexibleList(ref(r as FlexibleList _))) = lastFlex r | lastFlex(FlexibleList r) = SOME r | lastFlex(FieldList _) = NONE in if typAFrozen then (if typBFrozen then () else valOf(lastFlex gB) := gA; typA) else if typBFrozen then (valOf(lastFlex gA) := gB; typB) else let (* We may have these linked already in which case we shouldn't do anything. *) val lastA = valOf(lastFlex gA) and lastB = valOf(lastFlex gB) in if lastA = lastB then () else let val genericFields = FieldList(map #name result, false) in (* If these are both flexible we have link all the generics together so that if we freeze any one of them they all get frozen. *) lastA := genericFields; lastB := FlexibleList lastA end; LabelledType {recList = result, fullList = gA} end end (* unifyRecords *); (* Sets a type variable to a value. - Checks that the type variable we are assigning does not occur in the expression we are about to assign to it. Such cases can occur if we have infinitely-typed expressions such as fun a. a::a where a has type 'a list list ... Also propagates the level information of the type variable. Now also deals with flexible records. *) fun assign (var, t) = let (* Mapped over the type to be assigned. *) (* Returns "false" if it is safe to make the assignment. Sorts out imperative type variables and propagates level information. N.B. It does not propagate equality status. The reason is that if we are unifying ''a with '_b ref, the '_b does NOT become an equality type var. In all other cases it would. *) fun occursCheckFails _ true = true | occursCheckFails ty false = let val t = eventual ty in case t of TypeVar tvar => let (* The level is the minimum of the two, and if we are unifying with an equality type variable we must make this into one. *) val minLev = Int.min (tvLevel var, tvLevel tvar); in if tvLevel tvar <> minLev then (* If it is nonunifiable we cannot make its level larger. *) if tvNonUnifiable tvar then cantMatch (Atype, Btype, "(Type variable is free in surrounding scope)") else let (* Must make a new type var with the right properties *) (* This type variable may be a flexible record, in which case we have to save the record and put it on the new type variable. foldType will apply checkForLoops to the record. *) val newTv = mkTypeVar (minLev, tvEquality tvar, false, tvPrintity tvar) in tvSetValue (typesTypeVar newTv, tvValue tvar); tvSetValue (tvar, newTv) end else (); sameTv (tvar, var) (* Safe if vars are different. *) end | TypeConstruction {args, constr, ...} => (* If this is a type abbreviation we have to expand this before processing any arguments. We mustn't process arguments that are not actually used. *) if tcIsAbbreviation constr then occursCheckFails(makeEquivalent (constr, args)) false else List.foldr (fn (t, v) => occursCheckFails t v) false args | FunctionType {arg, result} => occursCheckFails arg false orelse occursCheckFails result false | LabelledType {recList,...} => List.foldr (fn ({ typeof, ... }, v) => occursCheckFails typeof v) false recList | _ => false end val varVal = tvValue var (* Current value of the variable to be set. *) local (* We need to process any type abbreviations before applying the occurs check. The type we're assigning could boil down to the same type variable we're trying to assign. This doesn't breach the occurs check. *) fun followVarsAndTypeFunctions t = case eventual t of ev as TypeConstruction{constr, args, ...} => if tcIsAbbreviation constr then followVarsAndTypeFunctions(makeEquivalent (constr, args)) else ev | ev => ev in val finalType = followVarsAndTypeFunctions t end (* We may actually have the same type variable after any type abbreviations have been followed. *) val reallyTheSame = case finalType of TypeVar tv => sameTv (tv, var) | _ => false in (* start of "assign" *) case varVal of LabelledType _ => (* Flexible record. Check that the records are compatible. *) match (varVal, t) | OverloadSet _ => (* OverloadSet. Check that the sets match. This is only in the case where t is something other than an overload set since we remove the overload set from a variable when unifying two sets. *) match (varVal, t) | _ => (); if reallyTheSame then () (* Don't apply the occurs check or check for non-unifiable. *) (* If this type variable was put in explicitly then it can't be assigned to something else. (We have already checked for the type variables being the same). *) else if tvNonUnifiable var then cantMatch (Atype, Btype, "(Cannot unify with explicit type variable)") else if occursCheckFails finalType false then cantMatch (Atype, Btype, "(Type variable to be unified occurs in type)") else let (* Occurs check succeeded. *) fun canMkEqTv (tvar : typeVarForm) : tri = (* Turn it into an equality type var. *) if tvEquality tvar then Yes (* If it is nonunifiable we cannot make it into an equality type var. *) else if tvNonUnifiable tvar then No else (* Must make a new type var with the right properties *) let (* This type variable may be a flexible record or an overload set, in which case we have to save the record and put it on the new type variable. We have to do both because we have to ensure that the existing fields in the flexible record admit equality and ALSO that any additional fields we may add by unification with other records also admit equality. *) val newTv = mkTypeVar (tvLevel tvar, true, false, tvPrintity tvar) val oldValue = tvValue tvar in tvSetValue (tvar, newTv); (* If this is an overloaded type we must remove any types that don't admit equality. *) case oldValue of OverloadSet{typeset} => let (* Remove any types which do not admit equality. *) fun filter [] = [] | filter (h::t) = if tcEquality h then h :: filter t else filter t in case filter typeset of [] => No | [constr] => ( (* Turn a singleton into a type construction. *) tvSetValue (typesTypeVar newTv, mkTypeConstruction(tcName constr, constr, nil, [])); Yes ) | newset => ( tvSetValue (typesTypeVar newTv, OverloadSet{typeset=newset}); Yes ) end | _ => (* Labelled record or unbound variable. *) ( tvSetValue (typesTypeVar newTv, oldValue); Yes ) end; in (* If we are unifying a type with an equality type variable we must ensure that equality is allowed for that type. This will turn most type variables into equality type vars. *) if tvEquality var andalso equality (t, fn _ => No, canMkEqTv) = No then cantMatch (Atype, Btype, "(Requires equality type)") (* TODO: This can result in an unhelpful message if var is bound to a flexible record since there is no indication in the printed type that the flexible record is an equality type. It would be improved if we set the value to be EmptyType. At least then the type variable would be printed which would be an equality type. --- Adding the "Requires equality type" should improve things. *) else (); (* Propagate the "printity" status. This is probably not complete but doesn't matter too much since this is a Poly extension. *) if tvPrintity var then let fun makePrintity(TypeVar tv) _ = ( if tvPrintity tv then () else case tvValue tv of (* If it's an overload set we don't need to do anything. This will eventually be a monotype. *) OverloadSet _ => () | oldValue => let (* Labelled record or unbound variable. *) val newTv = mkTypeVar (tvLevel tv, tvEquality tv, tvNonUnifiable tv, true) in tvSetValue(tv, newTv); (* Put this on the chain if it's a labelled record. *) tvSetValue (typesTypeVar newTv, oldValue) end ) | makePrintity _ _ = () in foldType makePrintity t () end else (); (* Actually make the assignment. It doesn't matter if var is a labelled record, because t will be either a fixed record or a combination of the fields of var and t. Likewise if var was previously an overload set this may replace the set by a single type construction. *) (* If we have had an error don't make the assignment. At the very least it could prevent us producing useful error information and it could also result in unnecessary consequential errors. *) case !matchResult of NONE => tvSetValue (var, t) | SOME _ => () end end (* assign *); (* First find see if typeA and typeB are unified to anything already, and get the end of a list of "flexibles". *) val tA = eventual Atype and tB = eventual Btype in (* start of "match" *) if isUndefinedType tA orelse isUndefinedType tB then () (* If either of these was an undefined type constructor don't try to match. TODO: There are further tests below for this which are now redundant. *) else case (tA, tB) of (BadType, _) => () (* If either is an error don't try to match *) | (_, BadType) => () | (TypeVar typeAVar, TypeVar typeBVar) => (* Unbound type variable, flexible record or overload set. *) let (* Even if this is a one-way match we can allow type variables in the typeA to be instantiated to anything in the typeB. *) val typeAVal = tvValue typeAVar; (* We have two unbound type variables or flex. records. *) in if sameTv (typeAVar, typeBVar) (* same type variable? *) then () else (* no - assign one to the other *) if tvNonUnifiable typeAVar (* If we have a nonunifiable type variable we want to assign the typeB to it. If the typeB is nonunifiable as well we will get an error message. *) then assign (typeBVar, tA) else let (* If they are both flexible records we first set the typeB to the union of the records, and then set the typeA to that. In that way we propagate properties such as equality and level between the two variables. *) val typBVal = tvValue typeBVar in case (typeAVal, typBVal) of (LabelledType recA, LabelledType recB) => ( (* Turn these back into simple type variables to save checking the combined record against the originals when we make the assignment. (Would be safe but redundant). *) tvSetValue (typeBVar, emptyType); tvSetValue (typeAVar, emptyType); assign (typeBVar, unifyRecords (recA, recB, typeAVal, typBVal)); assign (typeAVar, tB) ) | (OverloadSet{typeset=setA}, OverloadSet{typeset=setB}) => let (* The lists aren't ordered so we just have to go through by hand. *) fun intersect(_, []) = [] | intersect(a, H::T) = if isInSet(H, a) then H::intersect(a, T) else intersect(a, T) val newSet = intersect(setA, setB) in case newSet of [] => cantMatch (Atype, Btype, "(Incompatible overloadings)") | _ => ( tvSetValue (typeBVar, emptyType); tvSetValue (typeAVar, emptyType); (* I've changed this from OverloadSet{typeset=newset} to use mkOverloadSet. The main reason was that it fixed a bug which resulted from a violation of the assumption that "equality" would not be passed an overload set except when pointed to by a type variable. It also removed the need for a separate test for singleton sets since mkOverloadSet deals with them. DCJM 1/9/00. *) assign (typeBVar, mkOverloadSet newSet); assign (typeAVar, tB) ) end | (EmptyType, _) => (* A is not a record or an overload set. *) assign (typeAVar, tB) | (_, EmptyType) => (* A is a record but B isn't *) assign (typeBVar, tA) (* typeB is ordinary type var. *) | _ => (* Bad combination of labelled record and overload set *) cantMatch (Atype, Btype, "(Incompatible types)") end end | (TypeVar typeAVar, _) => (* typeB is not a type variable so set typeA to typeB.*) (* Be careful if this is a non-unifiable type variable being matched to the special case of the identity type-construction. *) ( if tvNonUnifiable typeAVar orelse (case tvValue typeAVar of OverloadSet _ => true | _ => false) then ( case tB of TypeConstruction {constr, args, ...} => if isUndefined constr orelse not (tcIsAbbreviation constr) then ( case tB of TypeConstruction {constr, args, ...} => if isUndefined constr orelse not (tcIsAbbreviation constr) then assign (typeAVar, tB) else match(tA, eventual (makeEquivalent (constr, args))) | _ => assign (typeAVar, tB) ) else match(tA, eventual (makeEquivalent (constr, args))) | _ => assign (typeAVar, tB) ) else assign (typeAVar, tB) ) | (_, TypeVar typeBVar) => (* and typeA is not *) ( (* We have to check for the special case of the identity type-construction. *) if tvNonUnifiable typeBVar orelse (case tvValue typeBVar of OverloadSet _ => true | _ => false) then ( case tA of TypeConstruction {constr, args, ...} => if isUndefined constr orelse not (tcIsAbbreviation constr) then ( case tB of TypeVar tv => (* This will fail if we are matching a signature because the typeB will be non-unifiable. *) assign (tv, tA) (* set typeB to typeA *) | typB => match (tA, typB) ) else match(eventual (makeEquivalent (constr, args)), tB) | _ => ( case tB of TypeVar tv => (* This will fail if we are matching a signature because the typeB will be non-unifiable. *) assign (tv, tA) (* set typeB to typeA *) | typB => match (tA, typB) ) ) else ( case tB of TypeVar tv => (* This will fail if we are matching a signature because the typeB will be non-unifiable. *) assign (tv, tA) (* set typeB to typeA *) | typB => match (tA, typB) ) ) | (TypeConstruction({constr = tACons, args=tAargs, ...}), TypeConstruction ({constr = tBCons, args=tBargs, ...})) => ( (* We may have a number of possibilities here. a) If tA is an alias we simply expand it out and recurse (even if tB is the same alias). e.g. if we have string t where type 'a t = int*'a we expand string t into int*string and try to unify that. b) map it and see if the result is an alias. -- NOW REMOVED c) If tB is a type construction and it is an alias we expand that e.g. unifying "int list" and "int t" where type 'a t = 'a list (particularly common in signature/structure matching.) d) Finally we try to unify the stamps and the arguments. *) if isUndefined tACons orelse isUndefined tBCons then () (* If we've had an undefined type constructor don't try to check further. *) else if tcIsAbbreviation tACons (* Candidate is an alias - expand it. *) then match (makeEquivalent (tACons, tAargs), tB) else if tcIsAbbreviation tBCons then match (tA, makeEquivalent (tBCons, tBargs)) else if tcIsAbbreviation tBCons (* If the typeB is an alias it must be expanded. *) then match (tA, makeEquivalent (tBCons, tBargs)) else if sameTypeId (tcIdentifier tACons, tcIdentifier tBCons) then let (* Same type constructor - do the arguments match? *) fun matchLists [] [] = () | matchLists (a::al) (b::bl) = ( match (a, b); matchLists al bl ) | matchLists _ _ = (* This should only happen as a result of a different error. *) cantMatch (Atype, Btype, "(Different numbers of arguments)") in matchLists tAargs tBargs end (* When we have different type constructors, especially two with the same name, we try to produce more information. *) else matchError(TypeConstructorError(tA, tB, tACons, tBCons)) ) | (OverloadSet {typeset}, TypeConstruction {constr=tBCons, args=tBargs, ...}) => (* The candidate is an overloaded type and the target is a type construction. *) ( if not (isUndefined tBCons orelse not (tcIsAbbreviation tBCons)) then match (tA, makeEquivalent (tBCons, tBargs)) else if isUndefined tBCons then () else if tcIsAbbreviation tBCons then match (tA, makeEquivalent (tBCons, tBargs)) else (* See if the target type is among those in the overload set. *) if null tBargs (* Must be a nullary type constructor. *) andalso isInSet(tBCons, typeset) then () (* ok. *) (* Overload sets arise primarily with literals such as "1" and it's most likely that the error is a mismatch between int and another type rather than that the user assumed that the literal was overloaded on a type it actually wasn't. *) else case preferredOverload typeset of NONE => cantMatch (tA, tB, "(Different type constructors)") | SOME prefType => matchError( TypeConstructorError( mkTypeConstruction (tcName prefType, prefType,[], []), tB, prefType, tBCons)) ) | (TypeConstruction {constr=tACons, args=tAargs, ...}, OverloadSet {typeset}) => ( if not (isUndefined tACons orelse not (tcIsAbbreviation tACons)) then match (makeEquivalent (tACons, tAargs), tB) (* We should never find an overload set as the target for a signature match but it is perfectly possible for tB to be an overload set when unifying two types. *) else if null tAargs andalso isInSet(tACons, typeset) then () (* ok. *) else case preferredOverload typeset of NONE => cantMatch (tA, tB, "(Different type constructors)") | SOME prefType => matchError( TypeConstructorError( tA, mkTypeConstruction (tcName prefType, prefType,[], []), tACons, prefType)) ) | (OverloadSet _ , OverloadSet _) => raise InternalError "Unification: OverloadSet/OverloadSet" (* (OverloadSet , OverloadSet) should not occur because that should be handled in the (TypeVar, TypeVar) case. *) | (TypeConstruction({constr = tACons, args=tAargs, ...}), _) => if not (isUndefined tACons orelse not (tcIsAbbreviation tACons)) (* Candidate is an alias - expand it. *) then match (makeEquivalent (tACons, tAargs), tB) else (* typB not a construction (but typeA is) *) cantMatch (tA, tB, "(Incompatible types)") | (_, TypeConstruction {constr=tBCons, args=tBargs, ...}) => (* and typeA is not. *) (* May have a type equivalence e.g. "string t" matches int*string if type 'a t = int * 'a . Alternatively we may be matching a structure to a signature where the signature says "type t" and the structure contains "type t = int->int" (say). We need to set the type in the signature to int->int. *) if not (isUndefined tBCons orelse not (tcIsAbbreviation tBCons)) then match (tA, makeEquivalent (tBCons, tBargs)) else if isUndefined tBCons then () else if tcIsAbbreviation tBCons then match (tA, makeEquivalent (tBCons, tBargs)) else cantMatch (tB, tA, "(Incompatible types)") | (FunctionType {arg=typAarg, result=typAres, ...}, FunctionType {arg=typBarg, result=typBres, ...}) => ( (* must be unifiable functions *) (* In principle it doesn't matter whether we unify arguments or results first but it could affect the error messages. Is this the best way to do it? *) match (typAarg, typBarg); match (typAres, typBres) ) | (EmptyType, EmptyType) => () (* This occurs only with exceptions - empty means no argument *) | (LabelledType recA, LabelledType recB) => (* Unify the records, but discard the result because at least one of the records is frozen. *) (unifyRecords (recA, recB, tA, tB); ()) | _ => cantMatch (tA, tB, "(Incompatible types)") end (* match *) in match (Atype, Btype); ! matchResult end; (* unifyTypes *) (* Turn a result from matchTypes into a pretty structure so that it can be included in a message. *) fun unifyTypesErrorReport (_, alphaTypeEnv, betaTypeEnv, what) = let fun reportError(SimpleError(alpha: types, beta: types, reason)) = (* This previously used a single type variable sequence for both types. It may be that this is needed to make sensible error messages. *) PrettyBlock(3, false, [], [ PrettyString ("Can't " ^ what (* "match" if a signature, "unify" if core lang. *)), PrettyBreak (1, 0), display (alpha, 1000 (* As deep as necessary *), alphaTypeEnv), PrettyBreak (1, 0), PrettyString "to", PrettyBreak (1, 0), display (beta, 1000 (* As deep as necessary *), betaTypeEnv), PrettyBreak (1, 0), PrettyString reason ]) | reportError(TypeConstructorError(alpha: types, beta: types, alphaCons, betaCons)) = let fun expandedTypeConstr(ty, tyEnv, tyCons) = let fun lastPart name = #second(splitString name) (* Print the type which includes the type constructor name with as much additional information as we can. *) fun printWithDesc{ location, name, description } = PrettyBlock(3, false, [], [ display (ty, 1000, tyEnv) ] @ (if lastPart name = lastPart(tcName tyCons) then [] else [ PrettyBreak(1, 0), PrettyString "=", PrettyBreak(1, 0), PrettyBlock(0, false, [ContextLocation location], [PrettyString name]) ] ) @ (if description = "" then [] else [ PrettyBreak(1, 0), PrettyBlock(0, false, [ContextLocation location], [PrettyString ("(*" ^ description ^ "*)")]) ] ) ) in case tcIdentifier tyCons of TypeId { description, ...} => printWithDesc description end in PrettyBlock(3, false, [], [ PrettyString ("Can't " ^ what (* "match" if a signature, "unify" if core lang. *)), PrettyBreak (1, 0), expandedTypeConstr(alpha, alphaTypeEnv, alphaCons), PrettyBreak (1, 0), PrettyString (if what = "unify" then "with" else "to"), PrettyBreak (1, 0), expandedTypeConstr(beta, betaTypeEnv, betaCons), PrettyBreak (1, 0), PrettyString "(Different type constructors)" ]) end in reportError end (* Given a function type returns the first argument if the function takes a tuple otherwise returns the only argument. Extended to include the case where the argument is not a function in order to work properly for overloaded literals. *) fun firstArg(FunctionType{arg= LabelledType { recList = {typeof, ...} ::_, ...}, ...}) = eventual typeof | firstArg(FunctionType{arg, ...}) = eventual arg | firstArg t = t (* Returns an instance of an overloaded function using the supplied list of type constructors for the overloading. *) fun generaliseOverload(t, constrs, isConverter) = let (* Returns the result type of a function. *) fun getResult(FunctionType{result, ...}) = eventual result | getResult _ = raise InternalError "getResult - not a function"; val arg = if isConverter then getResult t else firstArg t in case arg of TypeVar tv => let (* The argument should be a type variable, possibly set to an empty overload set. This should be replaced by the current overload set in the copied function type. *) val newSet = mkOverloadSet constrs val (t, _) = generaliseTypes(t, fn old => if sameTv(old, tv) then SOME newSet else NONE) in (t, [newSet]) end | _ => raise InternalError "generaliseOverload - arg is not a type var" end (* Prints out a type constructor e.g. type 'a fred = 'a * 'a or datatype 'a joe = bill of 'a list | mary of 'a * int or simply type 'a abs if the type is abstract. *) fun displayTypeConstrsWithMap ( TypeConstrSet( TypeConstrs{identifier=TypeId{idKind=TypeFn(args, result), ...}, name, ...}, []), depth, typeEnv, sigMap) = (* Type function *) if depth <= 0 then PrettyString "..." else let val typeV = varNameSequence () (* Local sequence for this binding. *) in PrettyBlock (3, false, [], PrettyString "type" :: PrettyBreak (1, 0) :: printTypeVars (args, depth, typeV) @ [ PrettyString (#second(splitString name)), PrettyBreak(1, 0), PrettyString "=", PrettyBreak(1, 0), tDisp(result, depth-1, typeV, typeEnv, sigMap) ] ) end | displayTypeConstrsWithMap (TypeConstrSet(tCons, [] (* No constructors *)), depth, _, _) = (* Abstract type or type in a signature. *) if depth <= 0 then PrettyString "..." else PrettyBlock (3, false, [], PrettyString ( if tcEquality tCons then "eqtype" else "type") :: PrettyBreak (1, 0) :: printTypeVars (tcTypeVars tCons, depth, varNameSequence ()) @ [PrettyString (#second(splitString(tcName tCons)))] ) | displayTypeConstrsWithMap (TypeConstrSet(tCons as TypeConstrs{name, locations, ...}, tcConstructors), depth, typeEnv, sigMap) = (* It has constructors - datatype declaration *) if depth <= 0 then PrettyString "..." else let val typeV = varNameSequence () (* Construct a ('a, 'b, 'c) tyCons construction for the result types of each of the constructors. *) val typeVars = tcTypeVars tCons val typeResult = mkTypeConstruction(name, tCons, map TypeVar typeVars, locations) (* Print a single constructor (blocked) *) fun pValConstr (first, name, typeOf, depth) = let val (t, _) = generalise typeOf val firstBreak = PrettyBreak (1, if first then 2 else 0) in case t of FunctionType { arg, result} => let (* Constructor with an argument. The constructor "type" is the argument. We have to unify the result type of the function with the ('a, 'b, 'c) tyCons type so that we get the correct type variables in the argument. We just print the argument of the function. *) val _ = unifyTypes(result, typeResult) in [ firstBreak, PrettyBlock (0, false, [], PrettyBlock (0, false, [], (if first then PrettyBreak (0, 2) else PrettyBlock (0, false, [], [PrettyString "|", PrettyBreak(1, 2)]) ) :: (if depth <= 0 then [PrettyString "..."] else [ PrettyString name, PrettyBreak (1, 4), PrettyString "of"]) ) :: (if depth > 0 then [ PrettyBreak (1, 4), (* print the type as a single block of output *) tDisp (arg, depth - 1, typeV, typeEnv, sigMap) ] else []) ) ] end | _ => [ firstBreak, PrettyBlock (0, false, [], [if first then PrettyBreak (0, 2) else PrettyBlock (0, false, [], [PrettyString "|", PrettyBreak(1, 2)]), PrettyString (if depth <= 0 then "..." else name)] ) ] end (* Print a sequence of constructors (unblocked) *) fun pValConstrRest ([], _ ): pretty list = [] | pValConstrRest (H :: T, depth): pretty list = if depth < 0 then [] else pValConstr (false, valName H, valTypeOf H, depth) @ pValConstrRest (T, depth - 1) fun pValConstrList ([], _ ) = PrettyString "" (* shouldn't occur *) | pValConstrList (H :: T, depth) = PrettyBlock (2, true, [], pValConstr (true, valName H, valTypeOf H, depth) @ pValConstrRest (T, depth - 1) ) in PrettyBlock(0, false, [], [ PrettyBlock(0, false, [], PrettyString "datatype" :: PrettyBreak (1, 2) :: printTypeVars (typeVars, depth, typeV) @ [ PrettyString(#second(splitString(tcName tCons))), PrettyBreak(1, 0), PrettyString "=" ] ), pValConstrList (tcConstructors, depth - 1) ] ) end (* displayTypeConstrsWithMap *) fun displayTypeConstrs (tCons : typeConstrSet, depth : int, typeEnv) : pretty = displayTypeConstrsWithMap(tCons, depth, typeEnv, NONE) (* Return a type constructor from an overload. If there are several (i.e. the overloading has not resolved to a single type) it returns the "best". This is called in the third pass so it should never be called if there is not at least one type that is possible. *) fun typeConstrFromOverload(f, _) = let fun prefType(TypeVar tvar) = ( (* If we still have an overload set that's because it has not reduced to a single type. In ML 97 we default to int, real, word, char or string in that order. This works correctly for overloading literals so long as the literal conversion functions are correctly installed. *) case tvValue tvar of OverloadSet{typeset} => let (* If we accept this type we have to freeze the overloading to this type. I'm not happy about doing this here but it seems the easiest solution. *) fun freezeType tcons = ( tvSetValue(tvar, mkTypeConstruction(tcName tcons, tcons, [], [])); tcons ) in case preferredOverload typeset of SOME tycons => freezeType tycons | NONE => raise InternalError "typeConstrFromOverload: No matching type" end | _ => raise InternalError "typeConstrFromOverload: No matching type" (* Unbound or flexible record. *) ) | prefType(TypeConstruction{constr, args, ...}) = if not (tcIsAbbreviation constr) then constr (* Generally args will be nil in this case but in the special case of looking for an equality function for 'a ref or 'a array it may not be. *) else prefType (makeEquivalent (constr, args)) | prefType _ = raise InternalError "typeConstrFromOverload: No matching type" in prefType(firstArg(eventual f)) end; (* Return the result type of a function. Also used to test if the value is a function type. *) fun getFnArgType t = case eventual t of FunctionType {arg, ... } => SOME arg | _ => NONE (* Assigns type variables to variables with generalisation permitted if their level is at least that of the current level. In ML90 mode this produced an error message for any top-level free imperative type variables. We don't do that in ML97 because it is possible that another declaration may "freeze" the type variable before the composite expression reaches the top level. *) fun allowGeneralisation (t, level, nonExpansive, lex, location, moreInfo, typeEnv) = let fun giveError(s1: string, s2: string) = let (* Use a single sequence. *) val vars : typeVarForm -> string = varNameSequence (); open DEBUG val parameters = debugParams lex val errorDepth = getParameter errorDepthTag parameters in reportError lex { hard = true, location = location, message = PrettyBlock (3, false, [], [ PrettyString s1, PrettyBreak (1, 0), tDisp (t, errorDepth, vars, typeEnv, NONE), PrettyBreak (1, 0), PrettyString s2 ] ), context = SOME(moreInfo ()) } end local open DEBUG val parameters = debugParams lex in val checkOverloadFlex = getParameter narrowOverloadFlexRecordTag parameters end fun general t (genArgs as (showError, nonExpansive)) = case eventual t of TypeVar tvar => let val argSet = if tvLevel tvar >= level andalso tvLevel tvar <> generalisable andalso (case tvValue tvar of OverloadSet _ => false | _ => true) then let (* Make a new generisable type variable, except that type variables in an expansive context cannot be generalised. We also don't generalise if this is an overload set. The reason for that is that it allows us to get overloading information from the surrounding context. e.g. let fun f x y = x+y in f 2.0 end. An alternative would be take the default type (in this case int). DCJM 1/9/00. *) val nonCopiable = not nonExpansive val newLevel = if nonCopiable then level-1 else generalisable (* copiable *); val isOk = (* If the type variable has top-level scope then we have a free type variable. We only want to generate this message once even if we have multiple type variables.*) (* If the type variable is non-unifiable and the expression is expansive then we have an error since this will have to be a monotype. *) if tvNonUnifiable tvar andalso nonCopiable andalso showError then ( giveError("Type", "includes a free type variable"); false ) else showError; val newVal = mkTypeVar (newLevel, tvEquality tvar, if nonCopiable then (tvNonUnifiable tvar) else false, tvPrintity tvar) in (* If an explicit type variable is going out of scope we can generalise it, except if it is nonunifiable. *) (* It may be a flexible record so we have to transfer the record to the new variable. *) tvSetValue (typesTypeVar newVal, tvValue tvar); tvSetValue (tvar, newVal); (isOk, nonExpansive) end else genArgs in (* If we are using the "narrow" context for overloading and flexible records we should apply this here. Otherwise it is dealt with in the next pass when we have the full program context. *) case (checkOverloadFlex, tvValue tvar) of (true, LabelledType _) => giveError("Type", "is an unresolved flexible record") | (true, OverloadSet {typeset, ...}) => ( (* Set this to the "preferred" type. Typically this is "int" but for overloaded literals (e.g. 0w0) it could be something else. *) case preferredOverload typeset of SOME tycons => tvSetValue(tvar, mkTypeConstruction(tcName tycons, tycons, [], [])) | NONE => raise InternalError "general: No matching type" ) | _ => (); general (tvValue tvar) argSet (* Process any flexible record. *) end | TypeConstruction {args, constr, ...} => (* There is a pathological case here. If we have a type equivalence which contains type variables that do not occur on the RHS (e.g. type 'a t = int) then we generalise over them even with an expansive expression. This is because the semantics treats type abbreviations as type functions and so any type variables that are eliminated by the function application do not appear in the "type" that the semantics applies to the expression. *) if tcIsAbbreviation constr then let val (r1, _) = general(makeEquivalent (constr, args)) genArgs (* Process any arguments that have not been processed in the equivalent. *) val (r2, _) = List.foldr (fn (t, v) => general t v) (r1, true) args in (r2, nonExpansive) end else List.foldr (fn (t, v) => general t v) genArgs args | FunctionType {arg, result} => general arg (general result genArgs) | LabelledType {recList,...} => List.foldr (fn ({ typeof, ... }, v) => general typeof v) genArgs recList | _ => genArgs in general t (true, nonExpansive); () end (* end allowGeneralisation *); (* Check for free type variables at the top level. Added for ML97. This replaces the test in allowGeneralisation above and is applied to all top-level values including those in structures and functors. *) (* I've changed this from giving an error message, which prevented the code from evaluating, to giving a warning and setting the type variables to unique type variables. That allows, for example, fun f x = raise x; f Subscript; to work. DCJM 8/3/01. *) fun checkForFreeTypeVariables(valName: string, ty: types, lex: lexan, printAndEqCode) : unit = let (* Generate new names for the type constructors. *) val count = ref 0 fun genName num = (if num >= 26 then genName (num div 26 - 1) else "") ^ String.str (Char.chr (num mod 26 + Char.ord #"a")); fun checkTypes (TypeVar tvar) () = if isEmpty(tvValue tvar) andalso tvLevel tvar = 1 then (* The type variable is unbound (specifically, not an overload set) and it is not generic i.e. it must have come from an expansive expression. *) let val name = "_" ^ genName(!count) val _ = count := !count + 1; val declLoc = location lex (* Not correct but OK for the moment. *) val declDescription = { location = declLoc, name = name, description = "Constructed from a free type variable." } val tCons = makeTypeConstructor (name, makeFreeId(0, Global(printAndEqCode()), tvEquality tvar, declDescription), [DeclaredAt declLoc]); val newVal = mkTypeConstruction(name, tCons, [], []) in warningMessage(lex, location lex, concat["The type of (", valName, ") contains a free type variable. Setting it to a unique monotype."]); tvSetValue (tvar, newVal) end else () | checkTypes _ () = () in foldType checkTypes ty (); () end (* Returns true if a type constructor permits equality. *) fun permitsEquality constr = if tcIsAbbreviation constr then typePermitsEquality( mkTypeConstruction (tcName constr, constr, List.map TypeVar (tcTypeVars constr), [])) else tcEquality constr and typePermitsEquality ty = equality (ty, fn _ => No, fn _ => Yes) <> No (* See if a type abbreviation or "where type" has the form type t = s or type 'a t = 'a s etc and so is simply giving a new name to the type constructor. If it is it then checks that the type constructor used (s in this example) is just a simple type name. *) fun typeNameRebinding(typeArgs, typeResult): typeId option = let fun eqTypeVar(TypeVar ta, tb) = sameTv (ta, tb) | eqTypeVar _ = false in case typeResult of TypeConstruction {constr, args, ... } => if not (ListPair.allEq eqTypeVar(args, typeArgs)) then NONE else ( case tcIdentifier constr of TypeId{idKind=TypeFn _, ...} => NONE | tId => SOME tId ) | _ => NONE end (* Returns the number of the entry in the list. Used to find out the location of fields in a labelled record for expressions and pattern matching. Assumes that the label appears in the list somewhere. *) fun entryNumber (label, LabelledType{recList, ...}) = let (* Count up the list. *) fun entry ({name, ...}::l) n = if name = label then n else entry l (n + 1) | entry [] _ = raise Match in entry recList 0 end | entryNumber (label, TypeVar tvar) = entryNumber (label, tvValue tvar) | entryNumber (label, TypeConstruction{constr, ...}) = (* Type alias *) entryNumber (label, tcEquivalent constr) | entryNumber _ = raise InternalError "entryNumber - not a record" (* Size of a labelled record. *) fun recordWidth (LabelledType{recList, ...}) = length recList | recordWidth (TypeVar tvar) = recordWidth (tvValue tvar) | recordWidth (TypeConstruction{constr, ...}) = (* Type alias *) recordWidth (tcEquivalent constr) | recordWidth _ = raise InternalError "entryNumber - not a record" fun recordFieldMap f (LabelledType{recList, ...}) = List.map (f o (fn {typeof, ...} => typeof)) recList | recordFieldMap f (TypeVar tvar) = recordFieldMap f (tvValue tvar) | recordFieldMap f (TypeConstruction{constr, ...}) = recordFieldMap f (tcEquivalent constr) | recordFieldMap _ _ = raise InternalError "entryNumber - not a record" (* Unify two type variables which would otherwise be non-unifiable. Used when we have found a local type variable with the same name as a global one. *) fun linkTypeVars (a, b) = let val ta = typesTypeVar (eventual(TypeVar a)); (* Must both be type vars. *) val tb = typesTypeVar (eventual(TypeVar b)); in (* Set the one with the higher level to point to the one with the lower, so that the effective level is the lower. *) if (tvLevel ta) > (tvLevel tb) then tvSetValue (ta, TypeVar b) else tvSetValue (tb, TypeVar a) end; (* Set its level by setting it to a new type variable. *) fun setTvarLevel (typ, level) = let val tv = typesTypeVar (eventual(TypeVar typ)); (* Must be type var. *) in tvSetValue (tv, mkTypeVar (level, tvEquality tv, true, tvPrintity tv)) end; (* Construct the least general type from a list of types. This is used after type checking to try to remove polymorphism from local values. It takes the list of actual uses of the value, usually a function, and removes any unnecessary polymorphism. This is particularly the case if the function involves a flexible record, where the unspecified fields are treated as polymorphic, but where the function is actually applied to a records which are monomorphic. *) fun leastGeneral [] = EmptyType (* Never used? *) (* Don't use this at the moment - see the comment on TypeVar below. Also the comment on TypeConstruction for local datatypes. *) (* | leastGeneral [oneType] = oneType *)(* Just one - this is it. *) | leastGeneral(firstType::otherTypes): types = let fun canonical (typ as TypeVar tyVar) = ( case tvValue tyVar of EmptyType => typ | OverloadSet _ => let val constr = typeConstrFromOverload(typ, false) in mkTypeConstruction(tcName constr, constr, [], []) end | t => canonical t ) | canonical (typ as TypeConstruction { constr, args, ...}) = if tcIsAbbreviation constr (* Handle type abbreviations directly *) then canonical(makeEquivalent (constr, args)) else typ | canonical typ = typ (* Take the head of the each argument list and extract the least general. Then process the tail. It's an error if each element of the list does not contain the same number of items. *) fun leastArgs ([]::_) = [] | leastArgs (args as _::_) = leastGeneral(List.map hd args) :: leastArgs (List.map tl args) | leastArgs _ = raise Empty in case canonical firstType of (*typ as *)TypeVar _(*tv*) => let (*fun sameTypeVar(TypeVar tv1) = sameTv(tv, tv1) | sameTypeVar _ = false*) in (* If they are all the same type variable return that otherwise return a new generalisable type variable. They may all be equal if we always apply this function to a value whose type is a polymorphic type in the function that contains all these uses. *) (* Temporarily, at least, create a new type var in this case. If we have a polymorphic function that is only used inside another polymorphic function but isn't declared inside it, if we use the caller's type variable here the call won't be recognised as polymorphic. *) (*if List.all sameTypeVar otherTypes then typ else*) mkTypeVar(generalisable, false, false, false) end | TypeConstruction{ constr, args, name, locations, ...} => ( (* There is a potential problem if the datatype is local including if it was constructed in a functor. Almost always it will have been declared after the polymorphic function but if it happens not to have been we could set a polymorphic function to a type that doesn't exist yet. To avoid this we don't allow a local datatype here and instead fall back to the polymorphic case. *) case tcIdentifier constr of thisConstrId as TypeId{access=Global _, ...} => let val argLength = List.length args (* This matches if it is an application of the same type constructor. *) fun getTypeConstrs(TypeConstruction{constr, args, ...}) = if sameTypeId(thisConstrId, tcIdentifier constr) andalso List.length args = argLength then SOME args else NONE | getTypeConstrs _ = NONE val allArgs = List.mapPartial (getTypeConstrs o canonical) otherTypes in if List.length allArgs = List.length otherTypes then TypeConstruction{constr=constr, name=name, locations=locations, args = leastArgs(args :: allArgs)} else (* At least one of these wasn't the same type constructor. *) mkTypeVar(generalisable, false, false, false) end | _ => mkTypeVar(generalisable, false, false, false) ) | FunctionType{ arg, result } => let fun getFuns(FunctionType{arg, result}) = SOME(arg, result) | getFuns _ = NONE val argResults = List.mapPartial (getFuns o canonical) otherTypes in if List.length argResults = List.length otherTypes then let val (args, results) = ListPair.unzip argResults in FunctionType{arg=leastGeneral(arg::args), result = leastGeneral(result::results)} end else (* At least one of these wasn't a function. *) mkTypeVar(generalisable, false, false, false) end | LabelledType (r as {recList=firstRec, fullList}) => if recordIsFrozen r then let (* This matches if all the field names are the same. Extract the types. *) fun nameMatch({name=name1: string, ...}, {name=name2, ...}) = name1 = name2 fun getRecords(LabelledType{recList, ...}) = if ListPair.allEq nameMatch (firstRec, recList) then SOME(List.map #typeof recList) else NONE | getRecords _ = NONE val argResults = List.mapPartial (getRecords o canonical) otherTypes in if List.length argResults = List.length otherTypes then let (* Use the names from the first record (they all are the same) to build a new record. *) val argTypes = leastArgs(List.map #typeof firstRec :: argResults) fun recreateRecord({name, ...}, types) = {name=name, typeof=types} val newList = ListPair.map recreateRecord(firstRec, argTypes) in LabelledType{recList=newList, fullList=fullList } end else (* At least one of these wasn't a record. *) mkTypeVar(generalisable, false, false, false) end else (* At this stage the record should be frozen if the program is correct but if it isn't we could have a flexible record which we report elsewhere. *) mkTypeVar(generalisable, false, false, false) | _ => (* May arise if there's been an error. *) mkTypeVar(generalisable, false, false, false) end (* Test if this is floating point i.e. the "real" type. We could include abbreviations of real as well but it's probably not worth it. *) fun isFloatingPt t = case eventual t of TypeConstruction{args=[], constr, ...} => sameTypeId (tcIdentifier constr, tcIdentifier realConstr) | OverloadSet {typeset, ...} => ( case preferredOverload typeset of SOME t => sameTypeId (tcIdentifier t, tcIdentifier realConstr) | NONE => false ) | _ => false fun checkDiscard(t: types, lex: lexan): string option = let open DEBUG val checkLevel = getParameter reportDiscardedValuesTag (debugParams lex) fun isUnit(LabelledType{recList=[], ...}) = true (* Unit is actually an empty record *) | isUnit(TypeConstruction{ constr as TypeConstrs{identifier=TypeId{idKind=TypeFn _, ...}, ...}, args, ...}) = isUnit(makeEquivalent(constr, args)) | isUnit(TypeVar _) = true (* Allow unbound type vars *) | isUnit _ = false fun isAFunction(FunctionType _) = true | isAFunction(TypeConstruction{ constr as TypeConstrs{identifier=TypeId{idKind=TypeFn _, ...}, ...}, args, ...}) = isAFunction(makeEquivalent(constr, args)) | isAFunction _ = false in case checkLevel of 1 => if isAFunction (eventual t) then SOME "A function value is being discarded." else NONE | 2 => if isUnit (eventual t) then NONE else SOME "A non unit value is being discarded." | _ => NONE end structure Sharing = struct type types = types and values = values and typeId = typeId and structVals = structVals and typeConstrs= typeConstrs and typeConstrSet=typeConstrSet and typeParsetree = typeParsetree and locationProp = locationProp and pretty = pretty and lexan = lexan and ptProperties = ptProperties and typeVarForm = typeVarForm and codetree = codetree and matchResult = matchResult and generalMatch = generalMatch end end (* TYPETREE *); polyml-5.6/mlsource/MLCompiler/TypeIDCodeStruct.sml000066400000000000000000000021241265146633400224200ustar00rootroot00000000000000(* Copyright (c) 2009 David C. J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure TypeIDCodeStruct = TYPEIDCODE( structure CODETREE = CodeTree and STRUCTVALS = StructVals and LEX = Lex and DEBUG = Debug and PRETTY = Pretty and ADDRESS = Address and TYPETREE = TypeTree ); polyml-5.6/mlsource/MLCompiler/TypeTree.ML000066400000000000000000000023101265146633400205350ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure TypeTree = TYPE_TREE ( structure ADDRESS = Address structure DEBUG = Debug structure LEX = Lex structure STRUCTVALS = StructVals structure UTILITIES = Utilities structure MISC = Misc structure PRETTY = Pretty structure CODETREE = CodeTree structure EXPORTTREE = ExportTreeStruct ) ; polyml-5.6/mlsource/MLCompiler/UTILITIES_.ML000066400000000000000000000147121265146633400205170ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Various Utilities. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1988 *) functor UTILITIES_ ( (*****************************************************************************) (* LEX *) (*****************************************************************************) structure LEX : LEXSIG ) : (*****************************************************************************) (* UTILITIES export signature *) (*****************************************************************************) sig type lexan; type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } val noDuplicates: (string * 'a * 'a -> unit) -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option }; val searchList: unit -> { apply: (string * 'a -> unit) -> unit, enter: string * 'a -> unit, lookup: string -> 'a option}; val checkForDots: string * lexan * location -> unit; val mapTable: ('a * 'a -> bool) -> {enter: 'a * 'b -> unit, lookup: 'a -> 'b option}; val splitString: string -> { first:string,second:string } structure Sharing: sig type lexan = lexan end end (* UTILITIES export signature *) = (*****************************************************************************) (* UTILITIES functor body *) (*****************************************************************************) struct open LEX; (* A search list in which an identifier may only be entered once. Entering it a second time gives an error message (""fail"" is called) *) fun noDuplicates fail = let val variable = ref ([]); (* Works down the list from the first declaration to the last, applying a function to each element. *) fun apply f = let fun appl [] = () | appl ((name,value)::T) = (appl T; f (name, value)) in appl (!variable) end; (* Add entry to the list if it is not already there. If it is then call 'fail'. *) fun enter (name : string, value) = let fun look [] = variable := (name,value) :: !variable | look ((n,old)::T) = if n = name then fail(name, old, value) else look T; in look (!variable) end; (* Look up name *) fun lookup (name : string) = let fun look [] = NONE | look ((n,v)::T) = if n = name then SOME v else look T; in look (!variable) end; in { apply = apply, enter = enter, lookup = lookup } end; fun searchList () = let val variable = ref []; (* Works down the list from the first declaration to the last, applying a function to each element. *) fun apply f = let fun appl [] = () | appl ((name,value)::T) = (appl T; f (name, value)) in appl (!variable) end (* apply *); (* Add to list. *) fun enter (name : string, value) = variable := (name,value) :: !variable; (* Look up name *) fun lookup (name : string) = let fun look [] = NONE | look ((n,v)::T) = if n = name then SOME v else look T; in look (!variable) end; in { apply = apply, enter = enter, lookup = lookup } end; (* searchList *) fun checkForDots (name, lex, location) = let fun check i = if i > size name then () else if String.str(String.sub(name, i-1)) = "." then errorMessage (lex, location, "qualified name " ^ name ^ " illegal here") else check (i + 1) in check 1 end; (* Creates a table which will match values of one type and return corresponding results. *) fun mapTable (same : 'a * 'a -> bool) : {enter: 'a * 'b -> unit, lookup: 'a -> 'b option} = let val table : ('a * 'b) list ref = ref []; (* Don't allow duplicate keys in the list! *) local fun member (_, [] : ('a * 'b) list) = false | member (x, h::t) = same (#1 h, x) orelse member (x, t); fun delete (_, [] : ('a * 'b) list) = [] | delete (x, h::t) = if same (#1 h, x) then t else h :: delete (x, t); in fun enter (entry as (a: 'a, _: 'b)) : unit = let val list = !table; val newList = if member (a, list) then delete (a, list) else list; in table := entry :: newList end; end; (* old ... (* Add a newType entry to the table. *) fun enter (a, b) = table := (a,b) :: !table; ... *) (* Get a value if it's there *) fun lookup (x : 'a) : 'b option = let fun search [] = NONE | search ((a, b) :: T) = if same (a, x) then SOME b else search T; in search (!table) end; in {enter = enter, lookup = lookup} end; fun splitString s = (* Divides a name into its components. Returns the string split at the last ".". The first part is empty if there are no dots in it. *) let val (first, second) = Substring.splitr(fn c => c <> #".") (Substring.full s) in if Substring.isEmpty first then {first = "", second = s} else {first = Substring.string(Substring.trimr 1 first), second = Substring.string second } end structure Sharing = struct type lexan = lexan end end; polyml-5.6/mlsource/MLCompiler/Utilities.ML000066400000000000000000000016231265146633400207550ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Utilities = UTILITIES_ ( structure LEX = Lex ); polyml-5.6/mlsource/MLCompiler/VALUEOPSSIG.sml000066400000000000000000000137401265146633400210710ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C. J. Matthews 2009-2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature VALUEOPSSIG = sig type lexan type codetree type types type values type structVals type functors type valAccess type typeConstrs type typeConstrSet type signatures type fixStatus type univTable type pretty type location = { file: string, startLine: int, startPosition: int, endLine: int, endPosition: int } type locationProp type typeId type typeVarForm type typeVarMap type level type machineWord (* Construction functions. *) val mkGvar: string * types * codetree * locationProp list -> values val mkValVar: string * types * locationProp list -> values val mkPattVar: string * types * locationProp list -> values val mkSelectedVar: values * structVals * locationProp list -> values val mkGconstr: string * types * codetree * bool * int * locationProp list -> values val mkGex: string * types * codetree * locationProp list -> values val mkEx: string * types * locationProp list -> values type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list }; type printTypeEnv = { lookupType: string -> (typeConstrSet * (int->typeId) option) option, lookupStruct: string -> (structVals * (int->typeId) option) option} (* Print values. *) val displayFixStatus: fixStatus -> pretty val displaySignatures: signatures * int * printTypeEnv -> pretty val displayStructures: structVals * int * printTypeEnv -> pretty val displayFunctors: functors * int * printTypeEnv -> pretty val displayValues: values * int * printTypeEnv -> pretty val printValues: values * int -> pretty val nullEnvironment : nameSpace val codeStruct: structVals * level -> codetree val codeAccess: valAccess * level -> codetree val codeVal: values * level * typeVarMap * {value: types, equality: bool, printity: bool} list * lexan * location -> codetree val codeExFunction: values * level * typeVarMap * types list * lexan * location -> codetree val applyFunction: values * codetree * level * typeVarMap * {value: types, equality: bool, printity: bool} list * lexan * location -> codetree val getOverloadInstance: string * types * bool -> codetree*string val makeGuard: values * types list * codetree * level * typeVarMap -> codetree val makeInverse: values * types list * codetree * level * typeVarMap -> codetree val lookupStructure: string * {lookupStruct: string -> structVals option} * string * (string -> unit) -> structVals option val lookupStructureAsSignature: (string -> structVals option) * string * (string -> unit) -> structVals option val lookupValue: string * {lookupVal: string -> values option, lookupStruct: string -> structVals option} * string * (string -> unit) -> values val lookupTyp: {lookupType: string -> typeConstrSet option, lookupStruct: string -> structVals option} * string * (string -> unit) -> typeConstrSet val codeLocation: location -> codetree val getPolymorphism: values * types * typeVarMap -> {value: types, equality: bool, printity: bool} list val getLiteralValue: values * string * types * (string->unit) -> machineWord option (* Types that can be shared. *) structure Sharing: sig type lexan = lexan type codetree = codetree type types = types type values = values type structVals = structVals type functors = functors type valAccess = valAccess type typeConstrs = typeConstrs type typeConstrSet = typeConstrSet type signatures = signatures type fixStatus = fixStatus type univTable = univTable type pretty = pretty type locationProp = locationProp type typeId = typeId type typeVarForm = typeVarForm type typeVarMap = typeVarMap type level = level type machineWord = machineWord end end; polyml-5.6/mlsource/MLCompiler/VALUE_OPS.ML000066400000000000000000001710111265146633400203760ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Modified David C.J. Matthews 2008-9, 2013, 2015. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Title: Operations on global and local values. Author: Dave Matthews, Cambridge University Computer Laboratory Copyright Cambridge University 1986 *) functor VALUE_OPS ( structure LEX : LEXSIG; structure CODETREE : CODETREESIG structure STRUCTVALS : STRUCTVALSIG; structure TYPESTRUCT : TYPETREESIG structure PRINTTABLE : sig type typeConstrs type codetree val addOverload: string * typeConstrs * codetree -> unit val getOverload: string * typeConstrs * (unit->codetree) -> codetree val getOverloads: string -> (typeConstrs * codetree) list end; structure UNIVERSALTABLE: sig type universal = Universal.universal type univTable val app: (string * universal -> unit) -> univTable -> unit end; structure DEBUG : DEBUGSIG structure MISC : sig exception InternalError of string; (* compiler error *) exception Conversion of string (* string to int conversion failure *) val quickSort : ('a -> 'a -> bool) -> 'a list -> 'a list end; structure PRETTY : PRETTYSIG structure ADDRESS : AddressSig structure UTILITIES : sig val splitString: string -> { first:string,second:string } end; structure COPIER: COPIERSIG structure TYPEIDCODE: TYPEIDCODESIG structure DATATYPEREP: DATATYPEREPSIG sharing STRUCTVALS.Sharing = TYPESTRUCT.Sharing = LEX.Sharing = PRETTY.Sharing = COPIER.Sharing = CODETREE.Sharing = PRINTTABLE = ADDRESS = UNIVERSALTABLE = MISC = TYPEIDCODE.Sharing = DATATYPEREP.Sharing ) : VALUEOPSSIG = (*****************************************************************************) (* VALUEOPS functor body *) (*****************************************************************************) struct open MISC; open PRETTY; open LEX; open CODETREE; open TYPESTRUCT; (* Open this first because unitType is in STRUCTVALS as well. *) open Universal; (* for tag etc. *) open STRUCTVALS; open PRINTTABLE; open DEBUG; open ADDRESS; open RuntimeCalls; (* for POLY_SYS and EXC numbers *) open UTILITIES; open TYPEIDCODE open COPIER open DATATYPEREP (* Functions to construct the values. *) fun mkGconstr (name, typeof, code, nullary, constrs, location) = makeValueConstr (name, typeof, nullary, constrs, Global code, location); (* Global variable *) fun mkGvar (name, typeOf, code, locations) : values = Value{ name = name, typeOf = typeOf, access = Global code, class = ValBound, locations = locations, references = NONE, instanceTypes=NONE }; (* Local variable - Generated by the second pass. *) local fun makeLocalV class (name, typeOf, locations) = Value{ name = name, typeOf = typeOf, access = Local {addr = ref ~1 (* Must be set later *), level = ref baseLevel}, class = class, locations = locations, references = makeRef(), instanceTypes=SOME(ref []) }; in val mkValVar = makeLocalV ValBound and mkPattVar = makeLocalV PattBound end (* Value in a local structure or a functor argument. May be simple value, exception or constructor. *) fun mkSelectedVar (Value { access = Formal addr, name, typeOf, class, locations, ...}, base, openLocs) = (* If the argument is "formal" set the base to the base structure. *) Value{name=name, typeOf=typeOf, class=class, access=Selected{addr=addr, base=base}, locations=openLocs @ locations, references = NONE, instanceTypes=NONE} | mkSelectedVar (Value { access = Global code, name, typeOf, class, locations, ...}, _, openLocs) = (* Global: We need to add the location information. *) Value{name=name, typeOf=typeOf, class=class, access=Global code, locations=openLocs @ locations, references = NONE, instanceTypes=NONE} | mkSelectedVar(selected, _, _) = selected (* Overloaded? *); (* Construct a global exception. *) fun mkGex (name, typeof, code, locations) = Value{ name = name, typeOf = typeof, access = Global code, class = Exception, locations = locations, references = NONE, instanceTypes=NONE } (* Construct a local exception. *) fun mkEx (name, typeof, locations) = Value{ name = name, typeOf = typeof, access = Local{addr = ref 0, level = ref baseLevel}, class = Exception, locations=locations, references = NONE, instanceTypes=NONE } (* Locations in exception packets. In order to have a defined ordering of the fields, when we put the location in an exception packet we use this datatype rather than the "location" type. *) (* *) datatype RuntimeLocation = NoLocation | SomeLocation of (* file: *) string * (*startLine:*) int * (*startPosition:*) int * (*endLine:*) int * (*endPosition:*) int fun codeLocation({file="", startLine=0, startPosition=0, ...}) = mkConst(toMachineWord NoLocation) (* No useful information *) | codeLocation({file, startLine, startPosition, endLine, endPosition}) = mkConst(toMachineWord(file, startLine, startPosition, endLine, endPosition)) (*****************************************************************************) (* Look-up functions. *) (* Look up a structure. *) fun lookupStructure (kind, {lookupStruct:string -> structVals option}, name, errorMessage) = let val {first = prefix, second = suffix} = splitString name; val strLookedUp = if prefix = "" then lookupStruct suffix else case lookupStructure ("Structure", {lookupStruct=lookupStruct}, prefix, errorMessage) of NONE => NONE (* Already reported *) | SOME(str as Struct { signat, locations, ...}) => let (* Look up the first part in the structure environment. *) val Signatures { tab, typeIdMap, firstBoundIndex, ... } = signat val Env{lookupStruct, ...} = makeEnv tab (* If we have a DeclaredAt location for the structure use this as the StructureAt.*) val baseLoc = case List.find (fn DeclaredAt _ => true | _ => false) locations of SOME (DeclaredAt loc) => [StructureAt loc] | _ => [] in case lookupStruct suffix of SOME (Struct {signat, access, name=structName, locations, ...}) => let val Signatures { name=sigName, tab, typeIdMap = childMap, locations=sigLocs, ... } = signat (* We need to apply the map from the parent structure to the child. *) val copiedSig = makeSignature(sigName, tab, firstBoundIndex, sigLocs, composeMaps(childMap, typeIdMap), []) (* Convert Formal access to Selected and leave the others (Global?). *) val newAccess = case access of Formal sel => makeSelected (sel, str) | access => access val newStruct = Struct { name = structName, signat = copiedSig, access = newAccess, locations = baseLoc @ locations} in SOME newStruct end | NONE => NONE end in case strLookedUp of SOME s => SOME s | NONE => (* Not declared? *) (errorMessage (kind ^ " (" ^ suffix ^ ") has not been declared" ^ (if prefix = "" then "" else " in structure " ^ prefix)); NONE) end fun mkEnv x = let val Env e = makeEnv x in e end (* Look up a structure but ignore the access. This is used in sharing constraints where we're only interested in the signature. *) (* It's simpler to use the common code for this. *) fun lookupStructureAsSignature (lookupStruct, name, errorMessage) = lookupStructure("Structure", { lookupStruct = lookupStruct}, name, errorMessage) (* Look up a value, possibly in a structure. If it is in a structure we may have to apply a selection. *) fun lookupValue (kind, {lookupVal,lookupStruct}, name, errorMessage) = let val {first = prefix, second = suffix} = splitString name; val found = if prefix = "" then lookupVal suffix (* Look up the first part in the structure environment. *) else case lookupStructure ("Structure", {lookupStruct=lookupStruct}, prefix, errorMessage) of NONE => SOME undefinedValue | SOME (baseStruct as Struct { signat, locations, ...}) => let val Signatures { tab, typeIdMap, ...} = signat (* If we have a DeclaredAt location for the structure use this as the StructureAt.*) val baseLoc = case List.find (fn DeclaredAt _ => true | _ => false) locations of SOME (DeclaredAt loc) => [StructureAt loc] | _ => [] in case #lookupVal (mkEnv tab) suffix of SOME (Value{ name, typeOf, access, class, locations, ... }) => let fun copyId(TypeId{idKind=Bound{ offset, ...}, ...}) = SOME(typeIdMap offset) | copyId _ = NONE val copiedType = copyType (typeOf, fn x => x, fn tcon => copyTypeConstr (tcon, copyId, fn x => x, fn s => prefix^"."^s)) in SOME(mkSelectedVar ( Value{ name=name, typeOf=copiedType, access=access, class=class, locations=locations, references = NONE, instanceTypes=NONE }, baseStruct, baseLoc)) end | NONE => NONE end in case found of SOME v => v | NONE => (* Not declared? *) ( errorMessage (kind ^ " (" ^ suffix ^ ") has not been declared" ^ (if prefix = "" then "" else " in structure " ^ prefix)); undefinedValue ) end fun lookupTyp ({lookupType,lookupStruct}, name, errorMessage) = let val {first = prefix, second = suffix} = splitString name; val found = if prefix = "" then lookupType suffix else (* Look up the first part in the structure environment. *) case lookupStructure ("Structure", {lookupStruct=lookupStruct}, prefix, errorMessage) of NONE => SOME(TypeConstrSet(undefConstr, [])) | SOME (Struct { signat, ...}) => let val Signatures { tab, typeIdMap, ...} = signat in case #lookupType (mkEnv tab) suffix of SOME typeConstr => SOME(fullCopyDatatype(typeConstr, typeIdMap, prefix^".")) | NONE => NONE end in case found of SOME v => v | NONE => (* Not declared? *) ( errorMessage ("Type constructor" ^ " (" ^ suffix ^ ") has not been declared" ^ (if prefix = "" then "" else " in structure " ^ prefix)); TypeConstrSet(undefConstr, []) ) end (* Printing. *) (* This name space is used to help find type identifiers. However, because the functions are passed through to the resulting environment by INITIALISE we have to use the same type as the normal top-level environment. *) type nameSpace = { lookupVal: string -> values option, lookupType: string -> typeConstrSet option, lookupFix: string -> fixStatus option, lookupStruct: string -> structVals option, lookupSig: string -> signatures option, lookupFunct: string -> functors option, enterVal: string * values -> unit, enterType: string * typeConstrSet -> unit, enterFix: string * fixStatus -> unit, enterStruct: string * structVals -> unit, enterSig: string * signatures -> unit, enterFunct: string * functors -> unit, allVal: unit -> (string*values) list, allType: unit -> (string*typeConstrSet) list, allFix: unit -> (string*fixStatus) list, allStruct: unit -> (string*structVals) list, allSig: unit -> (string*signatures) list, allFunct: unit -> (string*functors) list }; val nullEnvironment : nameSpace = { lookupVal = fn _ => NONE, lookupType = fn _ => NONE, lookupFix = fn _ => NONE, lookupStruct = fn _ => NONE, lookupSig = fn _ => NONE, lookupFunct = fn _ => NONE, enterVal = fn _ => (), enterType = fn _ => (), enterFix = fn _ => (), enterStruct = fn _ => (), enterSig = fn _ => (), enterFunct = fn _ => (), allVal = fn () => [], allType = fn () => [], allFix = fn () => [], allStruct = fn () => [], allSig = fn () => [], allFunct = fn () => [] } (* Print a value given its type. *) fun printValueForType (value:machineWord, types, depth): pretty = let (* Constuct printer code applied to the argument and the depth. Code-generate and evaluate it. *) (* If this is polymorphic apply it to a dummy set of instance types. This may happen if we have val it = NONE at the top level. The equality attributes of the type variables must match so that this works correctly with justForEqualityTypes set. *) val addrs = ref 0 (* Make local declarations for any type values. *) local fun mkAddr n = !addrs before (addrs := !addrs + n) in val typeVarMap = TypeVarMap.defaultTypeVarMap(mkAddr, baseLevel) end val dummyTypes = List.map(fn tv => {value=TYPESTRUCT.unitType, equality=tvEquality tv, printity=false}) (getPolyTypeVars(types, fn _ => NONE)) val polyCode = applyToInstance(dummyTypes, baseLevel, typeVarMap, fn _ => mkConst value) val printerCode = mkEval( printerForType(types, baseLevel, typeVarMap), [mkTuple[polyCode, mkConst(toMachineWord depth)]]) val pretty = RunCall.unsafeCast( valOf(evalue(genCode(CODETREE.mkEnv(TypeVarMap.getCachedTypeValues typeVarMap, printerCode), [], !addrs)()))) in pretty end (* These are used to display the declarations made. *) fun displayFixStatus(FixStatus(name, f)): pretty = let open PRETTY val status = case f of Nonfix => PrettyString "nonfix" | Infix prec => PrettyBlock(0, false, [], [ PrettyString "infix", PrettyBreak (1, 0), PrettyString (Int.toString prec) ]) | InfixR prec => PrettyBlock(0, false, [], [ PrettyString "infixr", PrettyBreak (1, 0), PrettyString (Int.toString prec) ]) in PrettyBlock (0, false, [], [status, PrettyBreak (1, 0), PrettyString name]) end (* Returns the declaration location as the location for the context. *) fun getLocation locations = case List.find(fn DeclaredAt _ => true | _ => false) locations of SOME(DeclaredAt loc) => [ContextLocation loc] | _ => [] (* Displays value as a block, with no external formatting. This is used at the top level but it can be applied to values extracted with #lookup globalNameSpace. That can include constructors and overloaded functions. *) fun displayValues (Value{name, typeOf, class, access, locations, ...}, depth, nameSpace, sigMap): pretty = let (* Create the "val X =" part. *) fun valPart (valOrCons, isColon) = let val (space, equOrColon) = if isColon then (0, ":") else (1, "=") in PrettyBlock (0, false, [], [ PrettyString valOrCons, PrettyBreak (1, 0), PrettyBlock(0, false, getLocation locations, [PrettyString name]), PrettyBreak (space, 0), PrettyString equOrColon ] ) end val typeEnv = (* Environment to check for type constructors. *) { lookupType = #lookupType nameSpace, lookupStruct = #lookupStruct nameSpace} in if depth <= 0 then PrettyString "..." else case class of ValBound => let (* In nearly all cases if we have Global code we will have a constant. There was one case where "!" was actually a Lambda that hadn't been code-generated. *) val value = case access of Global code => evalue code | _ => NONE val start = case value of SOME v => [ valPart("val", false), PrettyBreak (1, 0), printValueForType (v, typeOf, depth), PrettyString ":" ] | _ => [ valPart("val", true) ] in PrettyBlock (3, false, [], start @ [ PrettyBreak (1, 0), displayWithMap (typeOf, depth, typeEnv, sigMap) ]) end | Exception => (* exceptions *) PrettyBlock (0, false, [], PrettyBlock (0, false, [], [ PrettyString "exception", PrettyBreak (1, 0), PrettyBlock(0, false, getLocation locations, [PrettyString name]) ] ) :: ( case getFnArgType typeOf of NONE => [] | SOME excType => [ PrettyBreak (1, 1), PrettyString "of", PrettyBreak (1, 3), displayWithMap (excType, depth, typeEnv, sigMap) ] ) ) | Constructor _ => (* This can only occur with #lookupVal *) PrettyBlock (3, false, [], [ valPart("constructor", true), PrettyBreak (1, 0), displayWithMap (typeOf, depth, typeEnv, sigMap) ]) | PattBound => (* Can this ever occur? *) PrettyBlock (3, false, [], [ valPart("val", true), PrettyBreak (1, 0), displayWithMap (typeOf, depth, typeEnv, sigMap) ]) end (* Print global values. This is passed through the bootstrap and used in the debugger. *) fun printValues (Value{typeOf, class, access, ...}, depth) = case (class, access) of (ValBound, Global code) => printValueForType (valOf(evalue code), typeOf, depth) | _ => PrettyString "" (* Probably shouldn't occur. *) (* Prints "sig ... end" as a block, with no external formatting *) fun displaySig (Signatures{tab, typeIdMap, ...}, depth : int, _ : int, { lookupType, lookupStruct, ...}, sigMap: (int-> typeId) option) : pretty = let (* Construct an environment for the types. *) val Env { lookupType = strType, lookupStruct = strStr, ...} = makeEnv tab (* Construct a map for types. *) val innerMap = case sigMap of NONE => SOME typeIdMap | SOME outerMap => SOME(composeMaps(typeIdMap, outerMap)) val compositeEnv = { lookupType = fn s => case strType s of NONE => lookupType s | SOME t => SOME (t, innerMap), lookupStruct = fn s => case strStr s of NONE => lookupStruct s | SOME s => SOME (s, innerMap) } val typeEnv: printTypeEnv = { lookupType = #lookupType compositeEnv, lookupStruct = #lookupStruct compositeEnv } fun displaySpec (_, value) : pretty list = if (tagIs signatureVar value) then (* Not legal ML97 *) [ PrettyBreak(1,2), displaySignatures (tagProject signatureVar value, depth - 1, compositeEnv)] else if (tagIs structVar value) then [ PrettyBreak(1,2), displayStructures (tagProject structVar value, depth - 1, compositeEnv, innerMap)] else if (tagIs typeConstrVar value) then [ PrettyBreak(1,2), displayTypeConstrsWithMap (tagProject typeConstrVar value, depth, typeEnv, innerMap) ] else if (tagIs valueVar value) then let (* Only print variables. Constructors are printed with their type. *) val value = tagProject valueVar value; in case value of Value{class = Constructor _, ...} => [] | _ => [ PrettyBreak(1,2), (* We lookup the infix status and any exception in the global environment only. Infix status isn't a property of a structure and it's too much trouble to look up exceptions in the structure. *) displayValues (value, depth, compositeEnv, innerMap) ] end else if (tagIs fixVar value) then (* Not legal ML97 *) [ PrettyBreak(1,2), displayFixStatus (tagProject fixVar value) ] else [] (* end displaySpec *) in PrettyBlock (0, true, [], PrettyString "sig" :: ( ( if depth <= 1 (* If the depth is 1 each of the calls to displaySpec will print "..." so we replace them all by a single "..." here. *) then [PrettyBreak (1, 0), PrettyString "..."] else let val declist = ref nil : (string * universal) list ref fun addToList nv = declist := nv :: !declist (* For the moment order them by name. We may change this to order primarily by kind and secondarily by name. *) fun order (s1: string, _) (s2: string, _) = s1 > s2 in (* Put all the entries into a list. *) UNIVERSALTABLE.app addToList tab; (* Sort the list and print it. *) List.foldl (fn (a, l) => displaySpec a @ l) [] (quickSort order (!declist)) end ) @ [PrettyBreak (1, 0), PrettyString "end"] ) ) end (* displaySig *) (* Print: signature S = sig .... end *) and displaySignatures (str as Signatures{locations, name, ...}, depth : int, nameSpace) : pretty = if depth <= 0 then PrettyString "..." else PrettyBlock(0, false, [], [ PrettyBlock(0, false, [], [ PrettyString "signature", PrettyBreak(1, 0), PrettyBlock(0, false, getLocation locations, [PrettyString name]), PrettyBreak(1, 0), PrettyString "=" ] ), PrettyBreak (1, 2), displaySig (str, depth, 1, nameSpace, NONE) ]) (* print structure in a block (no external spacing) *) and displayStructures (Struct{name, locations, signat, ...}, depth, nameSpace, sigMap): pretty = if depth <= 0 then PrettyString "..." else PrettyBlock (0, false, [], [ PrettyBlock(0, false, [], [ PrettyString "structure", PrettyBreak(1, 0), PrettyBlock(0, false, getLocation locations, [PrettyString name]), PrettyBreak(0, 0), PrettyString ":" ] ), PrettyBreak(1, 2), displayNamedSig(signat, depth - 1, 1, nameSpace, sigMap) ]) (* Internal function for printing structures and functors. If a signature has a name print the name rather than the contents. *) and displayNamedSig(sign as Signatures{name = "", ...}, depth, space, nameSpace, sigMap) = displaySig (sign, depth, space, nameSpace, sigMap) | displayNamedSig(Signatures{name, ...}, _, _, _, _) = PrettyString name fun displayFunctors (Functor{ name, locations, arg, result, ...}, depth, nameSpace) = if depth <= 0 then PrettyString "..." else let val arg as Struct { name = argName, signat as Signatures { tab = argTab, ... }, ...} = arg val argEntries = (if argName <> "" then [ PrettyBlock(0, false, [], [PrettyString argName, PrettyBreak(0, 0), PrettyString ":"]), PrettyBreak(1, 2) ] else []) @ [ displayNamedSig (signat, depth - 1, 0, nameSpace, NONE), PrettyBreak(0, 0), PrettyString "):", PrettyBreak(1, 0) ] (* Include the argument structure name in the type environment. *) val argEnv = if argName = "" then let val Env { lookupType=lt, lookupStruct=ls, ...} = makeEnv argTab in { lookupType = fn s => case lt s of NONE => #lookupType nameSpace s | SOME t => SOME(t, NONE), lookupStruct = fn s => case ls s of NONE => #lookupStruct nameSpace s | SOME s => SOME(s, NONE) } end else { lookupType = #lookupType nameSpace, lookupStruct = fn s => if s = argName then SOME(arg, NONE) else #lookupStruct nameSpace s } in PrettyBlock (0, false, [], [ PrettyBlock(0, false, [], [ PrettyBlock(0, false, [], [ PrettyString "functor", PrettyBreak(1, 0), PrettyBlock(0, false, getLocation locations, [PrettyString name]), PrettyBreak(1, 0), PrettyString "(" ]), PrettyBreak(0, 2), PrettyBlock(0, false, [], argEntries) ]), PrettyBreak(0, 2), displayNamedSig (result, depth - 1, 1, argEnv, NONE) ] ) end (* Exported version. *) val displayValues = fn (value, depth, nameSpace) => displayValues (value, depth, nameSpace, NONE) and displayStructures = fn (str, depth, nameSpace) => displayStructures (str, depth, nameSpace, NONE) (* Code-generation. *) (* Code-generate the values. *) fun codeStruct (Struct{access, ...}, level) = (* Global structures have no code value. Instead the values are held in the values of the signature. *) codeAccess (access, level) and codeAccess (Global code, _) = code | codeAccess (Local{addr=ref locAddr, level=ref locLevel}, level) = mkLoad (locAddr, level, locLevel) (* Argument or local *) | codeAccess (Selected{addr, base}, level) = (* Select from a structure. *) mkInd (addr, codeStruct (base, level)) | codeAccess _ = raise InternalError "No access" (*****************************************************************************) (* datatype access functions *) (*****************************************************************************) (* Get the appropriate instance of an overloaded function. If the overloading has not resolved to a single type it finds the preferred type if possible (i.e. int for most overloadings, but possibly real, word, string or char for conversion functions.) *) fun getOverloadInstance(name, instance, isConv): codetree*string = let val constr = typeConstrFromOverload(instance, isConv) in (getOverload(name, constr, fn _ => raise InternalError "getOverloadInstance: Missing"), tcName constr) end (* This is only used in addPrettyPrint. There's no point in producing a lot of detailed information. *) fun checkPPType (instanceType, matchType, fnName, lex, location, moreInfo) = case unifyTypes (instanceType, matchType) of NONE => () | SOME error => let open DEBUG val parameters = LEX.debugParams lex val errorDepth = getParameter errorDepthTag parameters in reportError lex { location = location, hard = true, message = PrettyBlock(0, true, [], [ PrettyString ("Argument for " ^ fnName), PrettyBreak (1, 3), PrettyBlock(0, false, [], [ PrettyString "Required type:", PrettyBreak (1, 0), display (matchType, errorDepth, emptyTypeEnv) ]), PrettyBreak (1, 3), PrettyBlock(0, false, [], [ PrettyString "Argument type:", PrettyBreak (1, 0), display (instanceType, errorDepth, emptyTypeEnv) ]), PrettyBreak (1, 3), unifyTypesErrorReport(lex, emptyTypeEnv, emptyTypeEnv, "unify") error ]), context = SOME (moreInfo ()) } end; (* This is applied to the instance variables if it is polymorphic and bound by a val or fun binding or is a datatype constructor. *) fun applyToInstanceType(polyVars, ValBound, level, typeVarMap, code) = applyToInstance(polyVars, level, typeVarMap, code) | applyToInstanceType(polyVars, Constructor _, level, typeVarMap, code) = applyToInstance(if justForEqualityTypes then [] else polyVars, level, typeVarMap, code) | applyToInstanceType(_, PattBound, level, _, code) = code level | applyToInstanceType(_, Exception, level, _, code) = code level val arg1 = mkLoadArgument 0 (* saves a lot of garbage *) fun addStatus typ = {value=typ, equality=false, printity=false} (* Code-generate an identifier matched to a value. N.B. If the value is a constructor it returns the pair or triple representing the functions on the constructor. *) fun codeVal (Value{access = Global code, class, ...}, level: level, typeVarMap, instance, _, _) = applyToInstanceType(instance, class, level, typeVarMap, fn _ => code) | codeVal (Value{access = Local{addr=ref locAddr, level=ref locLevel}, class, ...}, level, typeVarMap, instance, _, _) = let fun loadVar level = mkLoad (locAddr, level, locLevel) (* Argument or local *) in applyToInstanceType(instance, class, level, typeVarMap, loadVar) end | codeVal (Value{access = Selected{addr, base}, class, ...}, level: level, typeVarMap, instance, _, _) = (* Select from a structure. *) applyToInstanceType(instance, class, level, typeVarMap, fn level => mkInd (addr, codeStruct (base, level))) | codeVal (Value{access = Formal _, ...}, _, _, _, _, _) = raise InternalError "codeVal - Formal" | codeVal (Value{access = Overloaded Print, ...}, _, _, [], lex, _) = (* If this appears in a structure return a null printer function. It has to have the polymorphic form with an extra lambda outside. *) let (* We should have a single entry for the type. *) open DEBUG (* The parameter is the reference used to control the print depth when the value is actually printed. *) val prettyOut = getPrintOutput (LEX.debugParams lex) in mkProc( mkProc( CODETREE.mkEnv ( [ mkNullDec (mkEval( mkConst(toMachineWord prettyOut), [ mkConst(toMachineWord(PrettyString "?")) ]) ) ], arg1 (* Returns its argument. *) ), 1, "print()", [], 0), 1, "print(P)", [], 0) end | codeVal (Value{access = Overloaded Print, ...}, level: level, typeVarMap, [{value=argType, ...}], lex, _) = let (* We should have a single entry for the type. *) open DEBUG (* The parameter is the reference used to control the print depth when the value is actually printed. *) val printDepthFun = getParameter printDepthFunTag (LEX.debugParams lex) and prettyOut = getPrintOutput (LEX.debugParams lex) val nLevel = newLevel level in (* Construct a function that gets the print code, prints it out and returns its argument. *) mkProc( CODETREE.mkEnv ( [ mkNullDec ( mkEval( mkConst(toMachineWord prettyOut), [ mkEval( printerForType(argType, nLevel, typeVarMap), [ mkTuple[arg1, mkEval(mkConst(toMachineWord printDepthFun), [CodeZero])] ]) ]) ) ], arg1 (* Returns its argument. *) ), 1, "print()", getClosure nLevel, 0) end | codeVal (Value{access = Overloaded Print, ...}, _, _, _, _, _) = raise InternalError "Overloaded Print - wrong instance type" | codeVal (Value{access = Overloaded MakeString, ...}, _, _, [], _, _) = (* If this appears in a structure produce a default version. *) mkInlproc( mkProc(mkConst(toMachineWord "?"), 1, "makestring()", [], 0), 1, "makestring(P)", [], 0) | codeVal (Value{access = Overloaded MakeString, ...}, level: level, typeVarMap, [{value=argType, ...}], _, _) = let val nLevel = newLevel level in (* Construct a function that gets the print code and prints it out using "uglyPrint". *) mkProc( mkEval( mkConst(toMachineWord uglyPrint), [ mkEval( printerForType(argType, nLevel, typeVarMap), [ mkTuple[arg1, mkConst(toMachineWord 10000)] ]) ]), 1, "makestring()", getClosure nLevel, 0) end | codeVal (Value{access = Overloaded MakeString, ...}, _, _, _, _, _) = raise InternalError "Overloaded MakeString - wrong instance type" | codeVal (Value{access = Overloaded GetPretty, ...}, level, typeVarMap, [], _, _) = let val nLevel = newLevel level in (* If this appears in a structure return a default function. *) mkProc(printerForType(badType, nLevel, typeVarMap), 1, "getPretty", getClosure nLevel, 0) end | codeVal (Value{access = Overloaded GetPretty, ...}, level: level, typeVarMap, [{value=argType, ...}], _, _) = (* Get the pretty code for the specified argument. *) printerForType(argType, level, typeVarMap) | codeVal (Value{access = Overloaded GetPretty, ...}, _, _, _, _, _) = raise InternalError "Overloaded GetPretty - wrong instance type" | codeVal (Value{access = Overloaded AddPretty, ...}, _, _, [], _, _) = (* If this appears in a structure create a function that raises an exception if run. *) mkProc( mkConst (toMachineWord (fn _ => raise Fail "addPrettyPrint: The argument type was not a simple type construction")), 1, "AddPretty(P)", [], 0) | codeVal (Value{access = Overloaded AddPretty, ...}, level: level, _, [{value=installType, ...}, {value=argPrints, ...}], lex, loc) = let (* "instance" should be (int-> 'a -> 'b -> pretty) -> unit. We need to get the 'a and 'b. This function installs a pretty printer against the type which matches 'b. The type 'a is related to type of 'b as follows: If 'b is a monotype t then 'a is ignored. If 'b is a unary type constructor 'c t then 'a must have type 'c * int -> pretty. If 'b is a binary or higher type constructor e.g. ('c, 'd, 'e) t then 'a must be a tuple of functions of the form ('c * int -> pretty, 'd * int -> pretty, 'e * int -> pretty). When the installed function is called it will be passed the appropriate argument functions which it can call to print the argument types. *) val pretty = mkTypeVar (generalisable, false, false, false); (* Temporary hack. *) (* Find the last type constructor in the chain. We have to install this against the last in the chain because type constructors in different modules may be at different points in the chain. *) (* This does mean that it's not possible to install a pretty printer for a type constructor rather than a datatype. *) fun followTypes (TypeConstruction{constr, args, ...}) = if not (tcIsAbbreviation constr) then SOME(tcIdentifier constr, constr, List.length args) else followTypes (makeEquivalent (constr, args)) | followTypes (TypeVar tv) = ( case tvValue tv of EmptyType => NONE (* Unbound type variable *) | t => followTypes t ) | followTypes _ = NONE; val constrId = followTypes installType val () = case constrId of NONE => () | SOME (_, constr, arity) => let (* Check that the function tuple matches the arguments of the type we're installing for. *) (* Each entry should be a function of type 'a * int -> pretty *) fun mkFn arg = mkFunctionType(mkProductType[arg, TYPESTRUCT.intType], pretty) (* Create non-unifiable type vars to ensure this is properly polymorphic. *) val typeVars = List.tabulate(arity, fn _ => mkTypeVar (0, false, true, false)) val tupleType = case typeVars of [] => (* No arg so must have unit. *) unitType | [arg] => mkFn arg (* Just a single function. *) | args => mkProductType(List.map mkFn args) val addPPType = mkFunctionType(argPrints, mkFunctionType(installType, pretty)) val testType = mkFunctionType(tupleType, mkFunctionType( mkTypeConstruction(tcName constr, constr, typeVars, [DeclaredAt loc]), pretty)) in checkPPType(addPPType, testType, "addPrettyPrint", lex, loc, fn () => PrettyString "addPrettyPrint element functions must have type 'a * int -> pretty, 'b * int -> pretty, ... with one function for each type parameter") end; (* Only report the error when the function is run. Because addPrettyPrint is contained in the PolyML structure we may compile a reference to a polymorphic version of this for the structure record. It's replaced in the final structure by this version. *) in case constrId of SOME (typeId, _, arity) => let (* We need to transform the user-supplied function into the form required for the reference. The user function has type int -> 'b -> 'a -> pretty where 'b is either "don't care" if this is a monotype, the print function for the base type if it takes a single type argument or a tuple of base type functions if it takes more than one. The reference expects to contain a function of type 'a * int -> pretty for a monotype or a function of the form <'b1, 'b2...> -> 'a * int -> pretty if this is polytype where <...> represents poly-style multiple arguments. *) val printFunction = case arity of 0 => mkProc( mkEval( mkEval( mkEval( mkLoadClosure 0 (* The user-supplied fn *), [mkInd(1, arg1)] (* The depth *)), [CodeZero] (* Ignored args. *)), [mkInd(0, arg1)] (* Value to print *)), 1, "addPP-1", [arg1](* The user-supplied fn *), 0) | arity => let open TypeValue val args = if arity = 1 then [extractPrinter(mkLoadClosure 1)] else [mkTuple(List.tabulate(arity, fn n => extractPrinter(mkLoadClosure(n+1))))] in mkProc( mkProc( mkEval( mkEval( mkEval( mkLoadClosure 0 (* The user-supplied fn *), [mkInd(1, arg1)] (* The depth *)), args (* Base fns. *)), [mkInd(0, arg1)] (* Value to print *)), 1, "addPP-2", mkLoadClosure 0 :: List.tabulate(arity, mkLoadArgument), 0), arity, "addPP-1", [arg1], 0) end val nLevel = newLevel level in (* Generate a function that will set the "print" ref for the type to the argument function. *) mkProc( mkEval( rtsFunction POLY_SYS_assign_word, [TypeValue.extractPrinter( codeAccess(idAccess typeId, nLevel)), CodeZero, printFunction] ), 1, "addPP", getClosure nLevel, 0) end | NONE => mkConst (toMachineWord (fn _ => raise Fail "addPrettyPrint: The argument type was not a simple type construction")) end | codeVal (Value{access = Overloaded AddPretty, ...}, _, _, _, _, _) = raise InternalError "Overloaded AddPretty - wrong instance type" | codeVal (Value{access = Overloaded GetLocation, ...}, _, _, _, _, _) = (* This can't be used a value: It must be called immediately. *) let fun getLoc() = raise Fail "The special function PolyML.sourceLocation cannot be used as a value" in mkConst (toMachineWord getLoc) end | codeVal (value as Value{access = Overloaded _, ...}, level: level, typeVarMap, instance, lex, lineno) = let val nLevel = newLevel level in (* AddOverload, Equal, NotEqual, TypeDep *) mkProc(applyFunction (value, arg1, nLevel, typeVarMap, instance, lex, lineno), 1, "", getClosure nLevel, 0) end (* Some of these have a more efficient way of calling them as functions. *) and applyFunction (value as Value{class=Exception, ...}, argument, level, typeVarMap, instance, lex, lineno) = let (* If we are applying it as a function we cannot be after the exception id, we must be constructing an exception packet. *) (* Get the exception id, put it in the packet with the exception name the argument and, currently, an empty location as the exception location. *) val exIden = codeVal (value, level, typeVarMap, instance, lex, lineno); in mkTuple (exIden :: mkStr (valName value) :: argument :: [mkConst(toMachineWord NoLocation)]) end | applyFunction(value as Value{class=Constructor _, ...}, argument, level, typeVarMap, argVars, lex, lineno) = let (* If this is a value constructor we need to get the construction function and use that. *) fun getConstr level = ValueConstructor.extractInjection(codeVal (value, level, typeVarMap, [], lex, lineno)) val polyConstr = applyToInstance(if justForEqualityTypes then [] else argVars, level, typeVarMap, getConstr) in (* Don't apply this "early". It might be the ref constructor and that must not be applied until run-time. The optimiser should take care of any other cases. *) mkEval (polyConstr, [argument]) end | applyFunction (value as Value{access = Overloaded oper, name = valName, ...}, argument, level, typeVarMap, instance, lex, lineno) = ( case oper of Equal => (* Get the equality function for the type. *) let (* We should have a single entry for the type. *) val argType = case instance of [{value, ...}] => value | _ => raise InternalError "Overload Equal" (* The instance type is a function so we have to get the first argument. *) val code = equalityForType(argType, level, typeVarMap) in mkEval (code, [argument]) end | NotEqual => let (* We should have a single entry for the type. *) val argType = case instance of [{value, ...}] => value | _ => raise InternalError "Overload NotEqual" (* Use the "=" function to provide inequality as well as equality. *) val code = equalityForType(argType, level, typeVarMap) val isEqual = mkEval (code, [argument]) in mkNot isEqual end | TypeDep => let val argType = case instance of [{value, ...}] => value | _ => raise InternalError "Overload TypeDep" val (code, _) = getOverloadInstance(valName, argType, false) in mkEval (code, [argument]) end | AddOverload => (* AddOverload is only intended for use by writers of library modules. It only does limited checking and should be regarded as "unsafe". *) let fun rmvars (TypeVar tv) = rmvars(tvValue tv) | rmvars t = t (* instance should be ('a->'b) -> string -> unit. For overloadings on most functions (e.g. abs and +) we are looking for the 'a, which may be a pair, but in the case of conversion functions we want the 'b. *) val (resultType, argType) = case instance of [{value=alpha, ...}, {value=beta, ...}] => (rmvars alpha, rmvars beta) | _ => (badType, badType) fun followTypes(TypeConstruction{constr as TypeConstrs {identifier = TypeId{idKind = Free _, ...},...}, ...}) = constr | followTypes(TypeConstruction{constr as TypeConstrs {identifier = TypeId{idKind = TypeFn _, ...},...}, args, ...}) = followTypes (makeEquivalent (constr, args)) | followTypes(TypeConstruction{constr = TypeConstrs {identifier = TypeId{idKind = Bound _, ...},...}, ...}) = raise Fail "Cannot install an overload within a structure or functor" | followTypes _ = raise Fail "Invalid type (not a type construction) (addOverload)" fun addOverloading (argCode: codetree) (name: string) = let val typeToUse = if size name > 4 andalso String.substring(name, 0, 4) = "conv" (* For conversion functions it's the result type we're interested in. For everything else it's the argument type. This will be a pair for functions such as "+" and a single argument for "abs". *) then resultType else case argType of LabelledType{recList=[{typeof, ...}, _], ...} => rmvars typeof | argType => argType val tcons = followTypes typeToUse in addOverload(name, tcons, argCode) end (* This function is used if we can't get the codetree at compile time. *) fun addOverloadGeneral (arg: machineWord) = addOverloading(mkConst arg) in (* This is messy but necessary for efficiency. If we simply treat addOverload as a function we would be able to pick up the additional overloading as a pointer to a function. Most overloads are small functions or wrapped calls to RTS functions and so we need to get the inline code for them. *) (* evalue raises an exception if "argument" is not a constant, or more usefully, a global value containing a constant and possibly a piece of codetree to inline. *) case evalue(argument) of SOME _ => mkConst (toMachineWord (addOverloading argument)) | NONE => mkEval (mkConst (toMachineWord addOverloadGeneral), [argument]) end | GetLocation => (* Return the current location. *) mkConst(toMachineWord lineno) | _ => (* Print, MakeString, InstallPP *) (* Just call as functions. *) (* not early *) mkEval (codeVal (value, level, typeVarMap, instance, lex, lineno), [argument]) ) (* overloaded *) | applyFunction (value, argument, level, typeVarMap, instance, lex, lineno) = mkEval (codeVal (value, level, typeVarMap, instance, lex, lineno), [argument]) (* end applyFunction *) (* If the exception is being used as a value we want an exception packet or a function to make a packet. If it is a nullary constructor make an exception packet now, otherwise generate a function to construct an exception packet. *) fun codeExFunction (value, level, typeVarMap, instance, lex, lineno) = case getFnArgType(valTypeOf value) of (* N.B. Not "instance" *) NONE => applyFunction (value, CodeZero, level, typeVarMap, List.map addStatus instance, lex, lineno) | SOME _ => let val nLevel = newLevel level in mkProc (applyFunction (value, arg1, nLevel, typeVarMap, List.map addStatus instance, lex, lineno), 1, "", getClosure nLevel, 0) end (* Operations to compile code from the representation of a constructor. *) (* Code to test whether a value matches a constructor. This must be applied to any polymorphic variables in the instance but the result is always bool so we don't create a new function if the result is also polymorphic. It is just possible to have a resulting polytype here (N.B. that's different from having a parametric type) if we have a val binding. e.g. val SOME x = SOME nil. In that case we can choose an arbitrary type for the test and have to parameterise the result. *) fun makeGuard (value as Value{class=Constructor _, ...}, argVars, testing, level, typeVarMap) = let fun tester level = ValueConstructor.extractTest(codeVal (value, level, typeVarMap, [], nullLex, location nullLex)) val testCode = applyToInstance(if justForEqualityTypes then [] else List.map addStatus argVars, level, typeVarMap, tester) in mkEval(testCode, [testing]) end | makeGuard (value as Value{class=Exception, ...}, _, testing, level, typeVarMap) = (* Should only be an exception. Get the value of the exception identifier and compare with the identifier in the exception packet. *) mkTestptreq (mkInd (0, testing), codeVal (value, level, typeVarMap, [], nullLex, location nullLex)) | makeGuard _ = raise InternalError "makeGuard" (* Code to invert a constructor. i.e. return the value originally used as the argument. Apply to any polymorphic variables and construct a result. *) fun makeInverse(value as Value{class=Constructor{nullary=false, ...}, ...}, argVars, arg, level, typeVarMap): codetree = let fun getInverse level = ValueConstructor.extractProjection(codeVal (value, level, typeVarMap, [], nullLex, location nullLex)) val loadCode = applyToInstance(if justForEqualityTypes then [] else List.map addStatus argVars, level, typeVarMap, getInverse) in mkEval(loadCode, [arg]) end | makeInverse(Value{class=Constructor{nullary=true, ...}, ...}, _, _, _, _): codetree = (* makeInverse is called even on nullary constructors. Return zero to keep the optimiser happy. *) CodeZero | makeInverse (Value{class=Exception, ...}, _, arg, _, _) = (* Exceptions. - Get the parameter from third word *) (* We have to use a VarField here even though this field is present in every exception. The format of the value that is returned depends on the exception id. *) mkVarField (2,arg) | makeInverse _ = raise InternalError "makeInverse" (* Work out the polymorphism and the mapping between the formal type variables and the actual types. Because flexible records may introduce extra polymorphism we can only do this once we've frozen them. e.g. fun f x = #1 x + #2 x may be monomorphic or polymorphic depending on what it's subsequently applied to. *) (* Using unification here isn't ideal. We have to put the equality attribute back on to abstypes in case the unification requires it. There may be other situations where things don't work properly. *) fun getPolymorphism (Value{ typeOf, access, name, ...}, expType, typeVarMap) = let val (t, polyVars) = case access of Overloaded TypeDep => let val (t, polyVars) = generaliseOverload(typeOf, List.map #1 (getOverloads name), false) in (t, List.map (fn t => {value=t, equality=false, printity=false}) polyVars) end | _ => generaliseWithMap(typeOf, TypeVarMap.mapTypeVars typeVarMap) (* Ignore the result. There are circumstances in which we can get a unification error as the result of failing to find a fixed record type where the possible records we could find have non-unifiable types. See Tests/Fail/Test072.ML *) val _ = unifyTypes(t, expType) in polyVars end (* Convert a literal constant. We can only do this once any overloading has been resolved. *) fun getLiteralValue(converter, literal, instance, error): machineWord option = let val (conv, name) = getOverloadInstance(valName converter, instance, true) in SOME(RunCall.unsafeCast(valOf(evalue conv)) literal) handle Match => NONE (* Overload error *) | Conversion s => ( error("Conversion exception ("^s^") raised while converting " ^ literal ^ " to " ^ name); NONE ) | Overflow => ( error ("Overflow exception raised while converting " ^ literal ^ " to " ^ name); NONE ) | Thread.Thread.Interrupt => raise Thread.Thread.Interrupt | _ => ( error ("Exception raised while converting " ^ literal ^ " to " ^ name); NONE ) end (* Types that can be shared. *) structure Sharing = struct type lexan = lexan type codetree = codetree type types = types type values = values type structVals = structVals type functors = functors type valAccess = valAccess type typeConstrs = typeConstrs type typeConstrSet = typeConstrSet type signatures = signatures type fixStatus = fixStatus type univTable = univTable type pretty = pretty type locationProp = locationProp type typeId = typeId type typeVarForm = typeVarForm type typeVarMap = typeVarMap type level = level type machineWord = machineWord end end (* body of VALUEOPS *); polyml-5.6/mlsource/MLCompiler/ValueOps.ML000066400000000000000000000026531265146633400205440ustar00rootroot00000000000000(* Copyright (c) 2000, 2009 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ValueOps = VALUE_OPS ( structure LEX = Lex structure CODETREE = CodeTree structure STRUCTVALS = StructVals structure TYPESTRUCT = TypeTree structure PRINTTABLE = PrintTable structure UNIVERSALTABLE = UniversalTable structure DEBUG = Debug structure ADDRESS = Address structure MISC = Misc structure PRETTY = Pretty structure UNIVERSAL = Universal structure UTILITIES = Utilities structure COPIER = CopierStruct structure TYPEIDCODE = TypeIDCodeStruct structure DATATYPEREP = DatatypeRep ) ; polyml-5.6/mlsource/MLCompiler/ml_bind.ML000066400000000000000000000026401265146633400204060ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Updated David C.J. Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure MLCompiler = struct local open RuntimeCalls; (* Create the global environment. *) val globalTable : Make.gEnv = Make.makeGEnv (); val mainShell = Make.shellProc globalTable; val () = Initialise.initGlobalEnv globalTable; in (* "use" is used only during testing to enable the basis to be compiled in. *) val use = Make.useIntoEnv globalTable []; (* This is exported when building the normal distribution. *) val shell = mainShell val useString = Make.useStringIntoEnv globalTable; end; end; polyml-5.6/mlsource/extra/000077500000000000000000000000001265146633400156665ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/000077500000000000000000000000001265146633400176715ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/BehaviourRefs.ML000066400000000000000000000030131265146633400226640ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure BehaviourRefs : BehaviourRefsSig = struct (********************************************************************** * Couple of refs to control behaviour. **********************************************************************) (*** Quantity of creation info strored: If this is too big, space usage will increase causing excessive GC. At the moment, we can only recreate (reload) symbols, so most of the time this info is only used for debugging. ***) val max_volatile_creation_info_depth = ref 5; (*** If true, we print a message to inform the user that a symbol is being reloaded. This is probably only useful as debuging info. ***) val inform_about_symbol_reload = ref false; end; polyml-5.6/mlsource/extra/CInterface/BehaviourRefsSig.ML000066400000000000000000000017231265146633400233350ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature BehaviourRefsSig = sig val max_volatile_creation_info_depth : int ref; val inform_about_symbol_reload : bool ref; end; polyml-5.6/mlsource/extra/CInterface/CALL_WITH_CONV.ML000066400000000000000000000236561265146633400223320ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (********************************************************************** * Functor Definition. **********************************************************************) functor CALL_WITH_CONV (structure LowerLevel : LowerLevelSig) : CallWithConvSig = struct structure Ctype = LowerLevel.Ctype open LowerLevel open Ctype (* ... exception Never of string; fun never s = raise Never s; ... *) fun never s = raise Union.Never s; local open Union in (* now defined in Union ... val deVol = fn (Vol x) => x | _ => never "deVol"; val deChar = fn (Char x) => x | _ => never "deChar"; val deFloat = fn (Float x) => x | _ => never "deFloat"; val deDouble = fn (Double x) => x | _ => never "deDouble"; val deInt = fn (Int x) => x | _ => never "deInt"; val deShort = fn (Short x) => x | _ => never "deShort"; val deLong = fn (Long x) => x | _ => never "deLong"; val deString = fn (String x) => x | _ => never "deString"; ... *) abstype 'a Conversion= Conversion of (vol union -> 'a) * ('a -> (Ctype * vol) union) * Ctype unionChoice with infix @ infix @@ fun x @ (Conversion(_,to,_)) = In (to x) fun (Conversion(from,_,choice)) @@ pap = case (pap choice) of (union,[]) => from union | _ => never "@@" val ignore = chooseVol Cvoid fun want (Conversion(_,_,choice)) = Out choice; fun from (Conversion(fr,_,_)) x = fr x; (********************************************************************** * Special Conversion (efficient) **********************************************************************) val CHAR = Conversion (deChar, Char, chooseChar); val FLOAT = Conversion (deFloat, Float, chooseFloat); val DOUBLE = Conversion (deDouble, Double, chooseDouble); val INT = Conversion (deInt, Int, chooseInt); val SHORT = Conversion (deShort, Short, chooseShort); val LONG = Conversion (deLong, Long, chooseLong); val STRING = Conversion (deString, String, chooseString); val UINT = Conversion (deUint, Uint, chooseUint); (* Added DCJM 17/5/01. *) fun mapConversion (from',to') (Conversion(from,to,choice)) = Conversion (fn x => from' (from x), fn x => to (to' x), choice) fun mkConversion from to ctype = Conversion (fn v => if isVol v then from (deVol v) else never "mkConversion", fn x => Vol (ctype, to x), chooseVol ctype) val Cstring = Cpointer Cchar; fun ID x = x; (* ... fun breakConversion (Conversion(from,to,choice)) = let fun makeBreaker (fromSpecial,toSpecial,ctype,fromUnion,toUnion) = (fn vol => from (toUnion (fromSpecial vol)), fn x => toSpecial (fromUnion (to x)), ctype) in case choice of chooseVol ctype => makeBreaker (ID, ID, ctype, fn x => #2 (deVol x), Vol) | chooseChar => makeBreaker (fromCchar, toCchar, Cchar, deChar, Char) | chooseFloat => makeBreaker (fromCfloat, toCfloat, Cfloat, deFloat, Float) | chooseDouble => makeBreaker (fromCdouble, toCdouble, Cdouble, deDouble, Double) | chooseInt => makeBreaker (fromCint, toCint, Cint, deInt, Int) | chooseShort => makeBreaker (fromCshort, toCshort, Cshort, deShort, Short) | chooseLong => makeBreaker (fromClong, toClong, Clong, deLong, Long) | chooseString => makeBreaker (fromCstring, toCstring, Cstring, deString, String) end ... *) fun breakConversion (Conversion(from,to,choice)) = let fun makeBreaker (fromSpecial,toSpecial,ctype,fromUnion,toUnion) = (fn vol => from (toUnion (fromSpecial vol)), fn x => toSpecial (fromUnion (to x)), ctype) in if isChooseVol choice then makeBreaker (ID, ID, deChooseVol choice, fn x => #2 (deVol x), Vol) else if isChooseChar choice then makeBreaker (fromCchar, toCchar, Cchar, deChar, Char) else if isChooseFloat choice then makeBreaker (fromCfloat, toCfloat, Cfloat, deFloat, Float) else if isChooseDouble choice then makeBreaker (fromCdouble, toCdouble, Cdouble, deDouble, Double) else if isChooseInt choice then makeBreaker (fromCint, toCint, Cint, deInt, Int) else if isChooseShort choice then makeBreaker (fromCshort, toCshort, Cshort, deShort, Short) else if isChooseLong choice then makeBreaker (fromClong, toClong, Clong, deLong, Long) else if isChooseUint choice then makeBreaker (fromCuint, toCuint, Cuint, deUint, Uint) else (* ishooseString choice *) makeBreaker (fromCstring, toCstring, Cstring, deString, String) end end (* abstype *) end (* local open Union *) fun global sym conv () = (****** * Access to global constants. * Reads the value each time final unit is applied. ******) let val (from,_,_) = breakConversion conv in from (mapSym deref sym) end; fun setGlobal sym conv v = (****** * Set the value of a global constant to a new value. ******) let val (_,to,ctype) = breakConversion conv in assign ctype (mapSym deref sym) (to v) end; local fun call s = call_sym_and_convert s in fun call0 sym () RET () = RET @@ call sym [] fun call1 sym (A) RET (a) = RET @@ call sym [a@A] fun call2 sym (A,B) RET (a,b) = RET @@ call sym [a@A,b@B] fun call3 sym (A,B,C) RET (a,b,c) = RET @@ call sym [a@A,b@B,c@C] fun call4 sym (A,B,C,D) RET (a,b,c,d) = RET @@ call sym [a@A,b@B,c@C,d@D] fun call5 sym (A,B,C,D,E) RET (a,b,c,d,e) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E] fun call6 sym (A,B,C,D,E,F) RET (a,b,c,d,e,f) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F] fun call7 sym (A,B,C,D,E,F,G) RET (a,b,c,d,e,f,g) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G] fun call8 sym (A,B,C,D,E,F,G,H) RET (a,b,c,d,e,f,g,h) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H] fun call9 sym (A,B,C,D,E,F,G,H,I) RET (a,b,c,d,e,f,g,h,i) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I] fun call10 sym (A,B,C,D,E,F,G,H,I,J) RET (a,b,c,d,e,f,g,h,i,j) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J] fun call11 sym (A,B,C,D,E,F,G,H,I,J,K) RET (a,b,c,d,e,f,g,h,i,j,k) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J,k@K] fun call12 sym (A,B,C,D,E,F,G,H,I,J,K,L) RET (a,b,c,d,e,f,g,h,i,j,k,l) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J,k@K,l@L] fun call13 sym (A,B,C,D,E,F,G,H,I,J,K,L,M) RET (a,b,c,d,e,f,g,h,i,j,k,l,m) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J,k@K,l@L,m@M] fun call14 sym (A,B,C,D,E,F,G,H,I,J,K,L,M,N) RET (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J,k@K,l@L,m@M,n@N] fun call15 sym (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) RET (a,b,c,d,e,f,g,h,i,j,k,l,m,n,p) = RET @@ call sym [a@A,b@B,c@C,d@D,e@E,f@F,g@G,h@H,i@I,j@J,k@K,l@L,m@M,n@N,p@O] fun call1ret1 sym () (X) () = case call sym [ want X ] ignore of (_,[x]) => (from X x) | _ => never "call1ret1" fun call2ret1 sym (A) (X) (a) = case call sym [ a@A, want X ] ignore of (_,[x]) => (from X x) | _ => never "call2ret1" fun call2ret2 sym () (X,Y) () = case call sym [ want X, want Y ] ignore of (_,[x,y]) => (from X x, from Y y) | _ => never "call2ret2" fun call3ret1 sym (A,B) (X) (a,b) = case call sym [ a@A, b@B, want X ] ignore of (_,[x]) => (from X x) | _ => never "call3ret1" fun call3ret2 sym (A) (X,Y) (a) = case call sym [ a@A, want X, want Y ] ignore of (_,[x,y]) => (from X x, from Y y) | _ => never "call3ret2" fun call4ret1 sym (A,B,C) (X) (a,b,c) = case call sym [ a@A, b@B, c@C, want X ] ignore of (_,[x]) => (from X x) | _ => never "call4ret1" fun call4ret2 sym (A,B) (X,Y) (a,b) = case call sym [ a@A, b@B, want X, want Y ] ignore of (_,[x,y]) => (from X x, from Y y) | _ => never "call4ret2" fun call4ret3 sym (A) (X,Y,Z) (a) = case call sym [ a@A, want X, want Y, want Z ] ignore of (_,[x,y,z]) => (from X x, from Y y, from Z z) | _ => never "call4ret3" fun call5ret1 sym (A,B,C,D) (X) (a,b,c,d) = case call sym [ a@A, b@B, c@C, d@D, want X ] ignore of (_,[x]) => (from X x) | _ => never "call5ret1" fun call5ret2 sym (A,B,C) (X,Y) (a,b,c) = case call sym [ a@A, b@B, c@C, want X, want Y ] ignore of (_,[x,y]) => (from X x, from Y y) | _ => never "call5ret2" end (* local *) local fun prettyConv _ _ (_: 'a Conversion) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyConv end end (* struct *) polyml-5.6/mlsource/extra/CInterface/CINTERFACE.ML000066400000000000000000000035121265146633400215270ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CINTERFACE (structure ForeignException : ForeignExceptionSig structure ForeignDebug : ForeignDebugSig structure LowerLevel : OrigLowerLevelSig structure CallWithConv : CallWithConvSig structure Struct : StructSig structure Conversions : ConversionsSig structure StructConversionals : StructConversionalsSig sharing LowerLevel.Ctype = CallWithConv.Ctype = Struct.Ctype sharing type LowerLevel.vol = CallWithConv.vol = Struct.vol = Conversions.vol sharing type LowerLevel.sym = CallWithConv.sym sharing type CallWithConv.Conversion = Conversions.Conversion = StructConversionals.Conversion ) : CInterfaceSig = struct open ForeignException open ForeignDebug open LowerLevel open LowerLevel.BehaviourRefs open LowerLevel.Ctype open CallWithConv open Struct open Conversions open StructConversionals end; polyml-5.6/mlsource/extra/CInterface/CInterfaceSig.ML000066400000000000000000000317141265146633400225770ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CInterfaceSig = sig (********************************************************************** * ForeignException **********************************************************************) exception Foreign of string; (********************************************************************** * ForeignDebug **********************************************************************) val get_foreign_debug : unit -> int val set_foreign_debug : int -> unit (********************************************************************** * Ctype **********************************************************************) include CtypeSig (********************************************************************** * LowerLevel **********************************************************************) type vol val alloc : int -> Ctype -> vol val address : vol -> vol val deref : vol -> vol val offset : int -> Ctype -> vol -> vol val assign : Ctype -> vol -> vol -> unit val null : vol val max_volatile_creation_info_depth : int ref; val inform_about_symbol_reload : bool ref; val fillCstring : vol -> string -> unit val toCstring : string -> vol val toCchar : char -> vol val toCdouble : real -> vol val toCfloat : real -> vol val toCint : int -> vol val toClong : int -> vol val toCshort : int -> vol val toCuint : int -> vol val toCbytes : Word8Vector.vector -> vol (* These take an argument type list, the result type and an ML function and create a C function value which can be passed to a C function. Functions with Pascal calling conventions are used for Windows callbacks. *) val toCfunction : Ctype list -> Ctype -> (vol list -> vol) -> vol val toPascalfunction : Ctype list -> Ctype -> (vol list -> vol) -> vol (* We don't currently provide the reverse although we could probably use the call_sym function. val fromCfunction : vol -> (Ctype * vol) list -> Ctype -> vol val fromPascalfunction : vol -> (Ctype * vol) list -> Ctype -> vol *) val fromCstring : vol -> string val fromCchar : vol -> char val fromCdouble : vol -> real val fromCfloat : vol -> real val fromCint : vol -> int val fromClong : vol -> int val fromCshort : vol -> int val fromCuint : vol -> int val fromCbytes : vol * int -> Word8Vector.vector type dylib type sym val load_lib : string -> dylib val load_sym : dylib -> string -> sym val get_sym : string -> string -> sym val setFinal : sym -> vol -> unit val set_libPath : dylib -> string -> unit val get_libPath : dylib -> string val call_sym : sym -> (Ctype * vol) list -> Ctype -> vol structure Union : UnionSig val call_sym_and_convert : sym -> (Ctype, vol) Union.directedArg list -> Ctype Union.unionChoice -> (vol Union.union * vol Union.union list) val volOfSym : sym -> vol val mapSym : (vol -> 'a) -> sym -> 'a (********************************************************************** * CallWithConv **********************************************************************) type 'a Conversion; val mapConversion : ('a -> 'b) * ('b -> 'a) -> 'a Conversion -> 'b Conversion val mkConversion : (vol -> 'a) -> ('a -> vol) -> Ctype -> 'a Conversion val breakConversion : 'a Conversion -> (vol -> 'a) * ('a -> vol) * Ctype val global : sym -> 'a Conversion -> unit -> 'a val setGlobal:sym -> 'a Conversion -> 'a -> unit val call0 : sym -> unit -> 'a Conversion -> unit -> 'a val call1 : sym -> 'a Conversion -> 'b Conversion -> 'a -> 'b val call2 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion -> 'a * 'b -> 'c val call3 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> 'a * 'b * 'c -> 'd val call4 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> 'a * 'b * 'c * 'd -> 'e val call5 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion -> 'f Conversion -> 'a * 'b * 'c * 'd * 'e -> 'f val call6 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion -> 'g Conversion -> 'a * 'b * 'c * 'd * 'e * 'f -> 'g val call7 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion -> 'h Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g -> 'h val call8 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion -> 'i Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h -> 'i val call9 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion -> 'j Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j val call10 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion -> 'k Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k val call11 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion -> 'l Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l val call12 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion -> 'm Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm val call13 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion -> 'n Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n val call14 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion * 'n Conversion -> 'p Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'p val call15 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion * 'n Conversion * 'p Conversion -> 'q Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n * 'p -> 'q val call1ret1 : sym -> unit -> 'a Conversion -> unit -> 'a val call2ret1 : sym -> 'a Conversion -> 'b Conversion -> 'a -> 'b val call2ret2 : sym -> unit -> 'a Conversion * 'b Conversion -> unit -> 'a * 'b val call3ret1 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion -> 'a * 'b -> 'c val call3ret2 : sym -> 'a Conversion -> 'b Conversion * 'c Conversion -> 'a -> 'b * 'c val call4ret1 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> 'a * 'b * 'c -> 'd val call4ret2 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion * 'd Conversion -> 'a * 'b -> 'c * 'd val call4ret3 : sym -> 'a Conversion -> 'b Conversion * 'c Conversion * 'd Conversion -> 'a -> 'b * 'c * 'd val call5ret1 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> 'a * 'b * 'c * 'd -> 'e val call5ret2 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion * 'e Conversion -> 'a * 'b * 'c -> 'd * 'e (********************************************************************** * Struct **********************************************************************) val break_struct : Ctype list -> vol -> vol list val make_struct : (Ctype * vol) list -> vol (********************************************************************** * Conversions **********************************************************************) val CHAR : char Conversion val DOUBLE : real Conversion val FLOAT : real Conversion val INT : int Conversion val LONG : int Conversion val SHORT : int Conversion val STRING : string Conversion val VOID : unit Conversion val BOOL : bool Conversion val POINTER : vol Conversion val UINT : int Conversion val POINTERTO : 'a Conversion -> 'a Conversion val STRING' : string Conversion (********************************************************************** * StructConversionals **********************************************************************) val STRUCT2 : 'a Conversion * 'b Conversion -> ('a * 'b) Conversion val STRUCT3 : 'a Conversion * 'b Conversion * 'c Conversion -> ('a * 'b * 'c) Conversion val STRUCT4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> ('a * 'b * 'c * 'd) Conversion val STRUCT5 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion -> ('a * 'b * 'c * 'd * 'e) Conversion val STRUCT6 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion -> ('a * 'b * 'c * 'd * 'e * 'f) Conversion val STRUCT7 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g) Conversion val STRUCT8 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h) Conversion val STRUCT9 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i) Conversion (********************************************************************** * Function Conversionals **********************************************************************) val FUNCTION0 : unit -> 'a Conversion -> ( unit -> 'a ) Conversion val PASCALFUNCTION0 : unit -> 'a Conversion -> ( unit -> 'a ) Conversion val FUNCTION1 : 'a Conversion -> 'b Conversion -> ( 'a -> 'b ) Conversion val PASCALFUNCTION1 : 'a Conversion -> 'b Conversion -> ( 'a -> 'b ) Conversion val FUNCTION2 : 'a Conversion * 'b Conversion -> 'c Conversion -> ( 'a * 'b -> 'c) Conversion val PASCALFUNCTION2 : 'a Conversion * 'b Conversion -> 'c Conversion -> ( 'a * 'b -> 'c) Conversion val FUNCTION3 : 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> ( 'a * 'b * 'c -> 'd) Conversion val PASCALFUNCTION3 : 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> ( 'a * 'b * 'c -> 'd) Conversion val FUNCTION4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> ( 'a * 'b * 'c * 'd -> 'e) Conversion val PASCALFUNCTION4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> ( 'a * 'b * 'c * 'd -> 'e) Conversion end; polyml-5.6/mlsource/extra/CInterface/CTYPE_SAVE_SIZEOF.ML000066400000000000000000000046341265146633400227130ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*** This functor provides a wrapper around Ctype, which reduces the number of calls to Underlying.sizeof & Underlying.alignment by saving size & alignment information into each Ctype value. ***) functor CTYPE_SAVE_SIZEOF (Underlying : CtypeSig) : CtypeSig = struct open Underlying abstype Ctype = ctype of Underlying.Ctype * int * int with fun wrap ct = ctype (ct, Underlying.sizeof ct, Underlying.alignment ct) val Cvoid = ctype (Underlying.Cvoid, 0, 0); fun unpack (ctype (ct,_,_)) = ct; fun sizeof (ctype (_,size,_)) = size; fun alignment (ctype (_,_,alignment)) = alignment; end; val Cchar = wrap Underlying.Cchar; val Cdouble = wrap Underlying.Cdouble; val Cfloat = wrap Underlying.Cfloat; val Cint = wrap Underlying.Cint; val Clong = wrap Underlying.Clong; val Cuint = wrap Underlying.Cuint; val Cshort = wrap Underlying.Cshort; val voidStar = wrap Underlying.voidStar fun Cpointer t = wrap (Underlying.Cpointer (unpack t)); fun Cfunction(ts,t) = wrap (Underlying.Cfunction (map unpack ts, unpack t)); fun Cstruct ts = wrap (Underlying.Cstruct (map unpack ts)); fun align n t = Underlying.align n (unpack t); fun makeRaw t = Underlying.makeRaw (unpack t); local fun prettyCtype _ _ (_: Ctype) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyCtype end end; polyml-5.6/mlsource/extra/CInterface/CallWithConv.ML000066400000000000000000000016301265146633400224600ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CallWithConv = CALL_WITH_CONV (structure LowerLevel = LowerLevel); polyml-5.6/mlsource/extra/CInterface/CallWithConvSig.ML000066400000000000000000000150441265146633400231270ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CallWithConvSig = sig type sym type vol structure Ctype : CtypeSig type 'a Conversion; val CHAR : char Conversion val FLOAT : real Conversion val DOUBLE : real Conversion val INT : int Conversion val SHORT : int Conversion val LONG : int Conversion val STRING : string Conversion val UINT : int Conversion val mapConversion : ('a -> 'b) * ('b -> 'a) -> 'a Conversion -> 'b Conversion val mkConversion : (vol -> 'a) -> ('a -> vol) -> Ctype.Ctype -> 'a Conversion val breakConversion : 'a Conversion -> (vol -> 'a) * ('a -> vol) * Ctype.Ctype val global : sym -> 'a Conversion -> unit -> 'a val setGlobal:sym -> 'a Conversion -> 'a -> unit val call0 : sym -> unit -> 'a Conversion -> unit -> 'a val call1 : sym -> 'a Conversion -> 'b Conversion -> 'a -> 'b val call2 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion -> 'a * 'b -> 'c val call3 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> 'a * 'b * 'c -> 'd val call4 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> 'a * 'b * 'c * 'd -> 'e val call5 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion -> 'f Conversion -> 'a * 'b * 'c * 'd * 'e -> 'f val call6 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion -> 'g Conversion -> 'a * 'b * 'c * 'd * 'e * 'f -> 'g val call7 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion -> 'h Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g -> 'h val call8 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion -> 'i Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h -> 'i val call9 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion -> 'j Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j val call10 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion -> 'k Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k val call11 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion -> 'l Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l val call12 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion -> 'm Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm val call13 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion -> 'n Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n val call14 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion * 'n Conversion -> 'p Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'p val call15 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion * 'j Conversion * 'k Conversion * 'l Conversion * 'm Conversion * 'n Conversion * 'p Conversion -> 'q Conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n * 'p -> 'q val call1ret1 : sym -> unit -> 'a Conversion -> unit -> 'a val call2ret1 : sym -> 'a Conversion -> 'b Conversion -> 'a -> 'b val call2ret2 : sym -> unit -> 'a Conversion * 'b Conversion -> unit -> 'a * 'b val call3ret1 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion -> 'a * 'b -> 'c val call3ret2 : sym -> 'a Conversion -> 'b Conversion * 'c Conversion -> 'a -> 'b * 'c val call4ret1 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> 'a * 'b * 'c -> 'd val call4ret2 : sym -> 'a Conversion * 'b Conversion -> 'c Conversion * 'd Conversion -> 'a * 'b -> 'c * 'd val call4ret3 : sym -> 'a Conversion -> 'b Conversion * 'c Conversion * 'd Conversion -> 'a -> 'b * 'c * 'd val call5ret1 : sym -> 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> 'a * 'b * 'c * 'd -> 'e val call5ret2 : sym -> 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion * 'e Conversion -> 'a * 'b * 'c -> 'd * 'e end; polyml-5.6/mlsource/extra/CInterface/Conversions/000077500000000000000000000000001265146633400222015ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/Conversions/CONVERSIONS.ML000066400000000000000000000052641265146633400242520ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (********************************************************************** * Import Signatures **********************************************************************) signature ForeignExceptionSig_Import = sig val Foreign : string -> exn end; (********************************************************************** * Functor Definition **********************************************************************) functor CONVERSIONS ( structure LowerLevel : LowerLevelSig structure CallWithConv : CallWithConvSig structure ForeignException : ForeignExceptionSig_Import sharing type LowerLevel.vol = CallWithConv.vol sharing LowerLevel.Ctype = CallWithConv.Ctype ) : ConversionsSig = struct open LowerLevel; open LowerLevel.Ctype; open CallWithConv; open ForeignException; (* Generally we don't want to convert a unit value into a void except in the case when we're returning a void result from a callback. Just return zero in that case. *) val VOID = mkConversion (fn _ => ()) (fn () => toCint 0) Cvoid local fun int2bool 0 = false | int2bool _ = true fun bool2int false = 0 | bool2int true = 1 in val BOOL = mapConversion (int2bool,bool2int) INT; end fun ID x = x; val POINTER = mkConversion ID ID (Cpointer Cvoid) fun POINTERTO conv = let val (from,to,ctype) = breakConversion conv in mkConversion (from o deref) (address o to) (Cpointer ctype) end; (*** The conversion STRING' is Like STRING conversion, except when converting from C to ML, it also copes with NULL pointers. (However, the ML string created is identical to the ML string created when converting a pointer to a null.) ***) val STRING' = mkConversion (fn v => if fromCint v = 0 then "" else fromCstring v) toCstring (Cpointer Cchar); end (* struct *) polyml-5.6/mlsource/extra/CInterface/Conversions/ml_bind.ML000066400000000000000000000020141265146633400240340ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Conversions = CONVERSIONS (structure LowerLevel = LowerLevel structure CallWithConv = CallWithConv structure ForeignException = ForeignException); polyml-5.6/mlsource/extra/CInterface/ConversionsSig.ML000066400000000000000000000021151265146633400230750ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature ConversionsSig = sig type 'a Conversion type vol val VOID : unit Conversion val BOOL : bool Conversion val POINTER : vol Conversion val POINTERTO : 'a Conversion -> 'a Conversion val STRING' : string Conversion end polyml-5.6/mlsource/extra/CInterface/Ctype/000077500000000000000000000000001265146633400207555ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/Ctype/CTYPE.ML000066400000000000000000000116371265146633400221030ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited Further development copyright David C.J. Matthews 2011 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor CTYPE (structure Dispatch : DispatchSig) : CtypeSig = struct exception IllegalUseOfVoid datatype Ctype = Cchar | Cdouble | Cfloat | Cint | Clong | Cshort | Cuint | Cpointer of Ctype | Cstruct of Ctype list | Cfunction of Ctype list * Ctype | Cvoid (* generally useful definition *) val voidStar = Cpointer Cvoid local (* These are constants for a particular architecture so only need to be evaluated once. *) val alignCchar = Dispatch.alignment Dispatch.Cchar and alignCdouble = Dispatch.alignment Dispatch.Cdouble and alignCfloat = Dispatch.alignment Dispatch.Cfloat and alignCint = Dispatch.alignment Dispatch.Cint and alignClong = Dispatch.alignment Dispatch.Clong and alignCshort = Dispatch.alignment Dispatch.Cshort and alignCuint = Dispatch.alignment Dispatch.Cuint and alignCpointer = Dispatch.alignment Dispatch.Cpointer val sizeofCchar = Dispatch.sizeof Dispatch.Cchar and sizeofCdouble = Dispatch.sizeof Dispatch.Cdouble and sizeofCfloat = Dispatch.sizeof Dispatch.Cfloat and sizeofCint = Dispatch.sizeof Dispatch.Cint and sizeofClong = Dispatch.sizeof Dispatch.Clong and sizeofCshort = Dispatch.sizeof Dispatch.Cshort and sizeofCuint = Dispatch.sizeof Dispatch.Cuint and sizeofCpointer = Dispatch.sizeof Dispatch.Cpointer in fun alignment Cchar = alignCchar | alignment Cdouble = alignCdouble | alignment Cfloat = alignCfloat | alignment Cint = alignCint | alignment Clong = alignClong | alignment Cshort = alignCshort | alignment Cuint = alignCuint | alignment (Cpointer _) = alignCpointer | alignment (Cfunction _) = alignCpointer | alignment (Cstruct ts) = List.foldl(fn (t, n) => Int.max(alignment t, n)) 1 ts | alignment Cvoid = raise IllegalUseOfVoid fun align n t = (****** * returns first integer >= n * that satisfies alignment restrictions of the ctype t ******) let val a = alignment t in a*((n-1) div a + 1) end fun sizeof Cchar = sizeofCchar | sizeof Cdouble = sizeofCdouble | sizeof Cfloat = sizeofCfloat | sizeof Cint = sizeofCint | sizeof Clong = sizeofClong | sizeof Cshort = sizeofCshort | sizeof (Cpointer _) = sizeofCpointer | sizeof Cuint = sizeofCuint | sizeof (Cfunction _) = sizeofCpointer | sizeof (Cstruct ts) = (* The size of a structure is the sum of the sizes of each element with padding added before each so that it is correctly aligned. Then the structure is padded so that its size is a multiple of alignment. *) align (List.foldl(fn(t, n) => align n t + sizeof t) 0 ts) (Cstruct ts) | sizeof Cvoid = raise IllegalUseOfVoid end type RawCtype = Dispatch.RawCtype; fun makeRaw Cchar = Dispatch.Cchar | makeRaw Cdouble = Dispatch.Cdouble | makeRaw Cfloat = Dispatch.Cfloat | makeRaw Cint = Dispatch.Cint | makeRaw Clong = Dispatch.Clong | makeRaw Cshort = Dispatch.Cshort | makeRaw Cuint = Dispatch.Cuint | makeRaw (Cpointer _) = Dispatch.Cpointer | makeRaw (Cfunction _) = Dispatch.Cpointer (*Always the same as a pointer?*) | makeRaw (Cstruct l) = Dispatch.Cstruct(map makeRaw l) | makeRaw Cvoid = Dispatch.Cint (*hack*) end; (* struct *) polyml-5.6/mlsource/extra/CInterface/Ctype/ml_bind.ML000066400000000000000000000016401265146633400226140ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Ctype = CTYPE_SAVE_SIZEOF (CTYPE (structure Dispatch = Dispatch)); polyml-5.6/mlsource/extra/CInterface/CtypeSig.ML000066400000000000000000000027131265146633400216550ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature CtypeSig = sig type Ctype val Cchar : Ctype val Cdouble : Ctype val Cfloat : Ctype val Cint : Ctype val Clong : Ctype val Cshort : Ctype val Cuint : Ctype val Cpointer : Ctype -> Ctype val Cstruct : Ctype list -> Ctype val Cfunction : Ctype list * Ctype -> Ctype val Cvoid : Ctype val voidStar : Ctype exception IllegalUseOfVoid val sizeof : Ctype -> int val alignment : Ctype -> int val align : int -> Ctype -> int type RawCtype val makeRaw : Ctype -> RawCtype end; polyml-5.6/mlsource/extra/CInterface/Dispatch.ML000066400000000000000000000346111265146633400216670ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Dispatch: DispatchSig = struct abstype machineWord = MachineWord of word with val toWord : 'a -> machineWord = RunCall.unsafeCast; val isShortInt : machineWord -> bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short; val toShortInt : machineWord -> int = RunCall.unsafeCast; (* used for tags *) val unsafeCast : machineWord -> 'a = RunCall.unsafeCast; (* used for data values *) end local fun prettyWord _ _ (_: machineWord) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyWord end structure Union : UnionSig = struct (*** Defines datatypes used to communicate with new primitive: call_sym_and_convert. ***) exception Never of string; (* Used for failed assertions. *) fun never s = raise Never s; (* Don't use datatypes because their representations might change. Tags were originally allocated in alphabetical order, but ... datatype 'a union = Char of string | Double of real | Float of real | Int of int | Long of int | Short of int | String of string; | Vol of 'a ... *) (* "union" is the type of a raw value with the type information. *) (* we can't make this an abstype, because that might change the representation! *) type 'a union = machineWord * int; fun Char (x:char) : 'a union = (toWord x,1); fun Double (x:real) : 'a union = (toWord x,2); fun Float (x:real) : 'a union = (toWord x,3); fun Int (x:int) : 'a union = (toWord x,4); fun Long (x:int) : 'a union = (toWord x,5); fun Short (x:int) : 'a union = (toWord x,6); fun String (x:string) : 'a union = (toWord x,7); fun Vol (x:'a) : 'a union = (toWord x,8); fun Uint (x:int) : 'a union = (toWord x,9); fun isChar ((_,1) : 'a union) : bool = true | isChar _ = false; fun isDouble ((_,2) : 'a union) : bool = true | isDouble _ = false; fun isFloat ((_,3) : 'a union) : bool = true | isFloat _ = false; fun isInt ((_,4) : 'a union) : bool = true | isInt _ = false; fun isLong ((_,5) : 'a union) : bool = true | isLong _ = false; fun isShort ((_,6) : 'a union) : bool = true | isShort _ = false; fun isString ((_,7) : 'a union) : bool = true | isString _ = false; fun isVol ((_,8) : 'a union) : bool = true | isVol _ = false; fun isUint ((_,9) : 'a union) : bool = true | isUint _ = false; fun deChar ((x,1) : 'a union) : char = unsafeCast x | deChar _ = never "deChar"; fun deDouble ((x,2) : 'a union) : real = unsafeCast x | deDouble _ = never "deDouble"; fun deFloat ((x,3) : 'a union) : real = unsafeCast x | deFloat _ = never "deFloat"; fun deInt ((x,4) : 'a union) : int = unsafeCast x | deInt _ = never "deInt"; fun deLong ((x,5) : 'a union) : int = unsafeCast x | deLong _ = never "deLong"; fun deShort ((x,6) : 'a union) : int = unsafeCast x | deShort _ = never "deShort"; fun deString ((x,7) : 'a union) : string = unsafeCast x | deString _ = never "deString"; fun deVol ((x,8) : 'a union) : 'a = unsafeCast x | deVol _ = never "deVol"; fun deUint ((x,9) : 'a union) : int = unsafeCast x | deUint _ = never "deInt"; (* ... datatype 'a unionChoice = chooseChar | chooseDouble | chooseFloat | chooseInt | chooseLong | chooseShort | chooseString; | chooseVol of 'a ... *) (* unionChoice is the type information used when we want to indicate the type of a result. *) type 'a unionChoice = machineWord; local (* DCJM 25/3/00. This is a more complicated in ML97 than the original ML90. *) val w1: machineWord = toWord 1 and w2: machineWord = toWord 2 and w3: machineWord = toWord 3 and w4: machineWord = toWord 4 and w5: machineWord = toWord 5 and w6: machineWord = toWord 6 and w7: machineWord = toWord 7 and w9: machineWord = toWord 9 in val chooseChar : 'a unionChoice = w1; val chooseDouble : 'a unionChoice = w2; val chooseFloat : 'a unionChoice = w3; val chooseInt : 'a unionChoice = w4; val chooseLong : 'a unionChoice = w5; val chooseShort : 'a unionChoice = w6; val chooseString : 'a unionChoice = w7; val chooseUint : 'a unionChoice = w9; end; (* DCJM 8/10/99. This originally said simply {1=x} presumably with the intention of creating a single boxed object. That doesn't work any longer. Add an extra field to ensure that it's boxed. (We may be able to get the effect we want using datatype 'a t = A | B of 'a ) *) val chooseVol : 'a -> 'a unionChoice = fn x => toWord {1 = x, 2 = 99}; fun isChooseChar (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 1; fun isChooseDouble (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 2; fun isChooseFloat (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 3; fun isChooseInt (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 4; fun isChooseLong (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 5; fun isChooseShort (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 6; fun isChooseString (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 7; fun isChooseUint (x : 'a unionChoice) : bool = isShortInt x andalso toShortInt x = 9; fun isChooseVol (x : 'a unionChoice) : bool = not (isShortInt x); (* needed? *) (* DCJM 8/10/99. This original simply said { 1=y } but that no longer works. Changed so that it definitely indirects. *) fun deChooseVol (x : 'a unionChoice) : 'a = if not (isShortInt x) then (case unsafeCast x of {1 = y, ...}:'a * 'a => y) else never "deChooseVol"; (* directedArg is used to encode either an "in" parameter or an "out" parameter. *) (* ... datatype ('a, 'b) directedArg = In of ('a * 'b) union | Out of 'a unionChoice; ... *) type ('a,'b) directedArg = machineWord * int; val In : ('a * 'b) union -> ('a,'b) directedArg = fn x => (toWord x,1); val Out : 'a unionChoice -> ('a,'b) directedArg = fn x => (toWord x,2); val isIn : ('a,'b) directedArg -> bool = fn (_,1) => true | _ => false val isOut : ('a,'b) directedArg -> bool = fn (_,2) => true | _ => false val deIn : ('a,'b) directedArg -> ('a * 'b) union = fn (x,1) => unsafeCast x | _ => never "deIn" val deOut : ('a,'b) directedArg -> 'a unionChoice = fn (x,2) => unsafeCast x | _ => never "deOut" (* ... fun mapUnion f union = case union of Vol x => Vol (f x) | Char x => Char x | Double x => Double x | Float x => Float x | Int x => Int x | Short x => Short x | Long x => Long x | String x => String x ... *) fun mapUnion f (x : 'a union) = if isVol x then Vol (f (deVol x)) else x; (* ... fun mapUnionChoice f choice = case choice of chooseVol x => chooseVol (f x) | chooseChar => chooseChar | chooseDouble => chooseDouble | chooseFloat => chooseFloat | chooseInt => chooseInt | chooseShort => chooseShort | chooseLong => chooseLong | chooseString => chooseString ... *) fun mapUnionChoice f (x : 'a unionChoice) = if isChooseVol x then chooseVol (f (deChooseVol x)) else x; (* ... fun mapDirectedArg f g arg = case arg of In union => In (mapUnion (fn (ctype, vol) => (f ctype, g vol)) union) | Out choice => Out (mapUnionChoice f choice) ... *) fun mapDirectedArg f g (x : ('a,'b) directedArg) = if isIn x then In (mapUnion (fn (ctype, vol) => (f ctype, g vol)) (deIn x)) else Out (mapUnionChoice f (deOut x)) end; (* Don't use datatype because representation may change ... datatype RawCtype = Cchar | Cdouble | Cfloat | Cint | Clong | Cpointer | Cshort | Cstruct of int ... *) (* DCJM 23/3/04. This provides the interface to foreign.c in the run-time system. The representation is shared with that code. *) type RawCtype = machineWord; val Cchar = toWord 1; val Cdouble = toWord 2; val Cfloat = toWord 3; val Cint = toWord 4; val Clong = toWord 5; val Cpointer = toWord 6; val Cshort = toWord 7; val Cuint = toWord 8; (* The above are all tagged values. A struct is represented by an untagged value which is a vector of types. *) fun Cstruct (elements: RawCtype list) = toWord(Vector.fromList elements) abstype rawvol = rawvol with end; (* Purely abstract type. *) local fun prettyVol _ _ (_: rawvol) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyVol end fun foreign code args = RunCall.run_call2 RuntimeCalls.POLY_SYS_foreign_dispatch (code:int,args); local val dispatch_index = ref 0; in fun next currier = let val f = currier (foreign (!dispatch_index)) in dispatch_index := 1 + !dispatch_index; f end end (* Curry functions *) fun one f = f (* eta-reduced SPF 19/10/94 *) fun two f x y = f (x,y) fun three f x y z = f (x,y,z) (* The order of these declarations is critical - DO NOT CHANGE *) val get_foreign_debug = next(one); val set_foreign_debug = next(one); val load_lib = next(one); val load_sym = next(two); (* DCJM 7/4/04. It took me a while to figure out what was going on since I didn't have any documentation. There were two versions of call_sym: call_sym_origCversion and call_sym_and_convert. The older version, call_sym_origCversion, took three parameters: sym, args and retChoice. "sym" is the function to call, "args" is a list of pairs of type info (as a code) and values and "retChoice" indicates the type of the result. The result of this function is passed back as a vol. The newer version, call_sym_and_convert, also takes three parameters: sym, args and retChoice. "sym" and "retChoice" are the same as the previous version but "args" is now a list of entries which may be either "in" parameters which are the same as before or "out" parameters where only the type is supplied (since an "out" parameter doesn't have a value before the function is called). The result is now a pair where the first component is the function result as before and the second component the list of the values of the "out" parameters. The newer version does all the conversion of ML arguments into C values and of the result of the C function back into ML as part of a single RTS call whereas the older version required multiple RTS calls. *) val call_sym_and_convert = next(three); val alloc = next(one); (* Different name from that in foreign.c *) val address = next(one); val deref = next(one); val offset = next(two); val assign = next(three); val sizeof = next(one); (* Different name from that in foreign.c *) val alignment = next(one); val toCchar = next(one); val fromCchar = next(one); val toCdouble = next(one); val fromCdouble = next(one); val toCfloat = next(one); val fromCfloat = next(one); val toCint = next(one); val fromCint = next(one); val toClong = next(one); val fromClong = next(one); val toCshort = next(one); val fromCshort = next(one); val fillCstring = next(two); val toCstring = next(one); val fromCstring = next(one); val toCuint = next(one); (* Added DCJM 27/5/01 *) val fromCuint = next(one); (* Added DCJM 27/5/01 *) val toCbytes = next(one); (* Added DCJM 29/6/01 *) val fromCbytes = next(one); (* Added DCJM 29/6/01 *) (* Note: fromCbytes takes a pair. *) val toCfunction = next(three);(* Added DCJM 7/4/04 *) val toPascalfunction = next(three);(* Added DCJM 7/4/04 *) val setFinal = next(two); (* Added DCJM 2/8/09. *) val null = next(one) () (* Added DCJM 16/11/11. *) end (* struct *) polyml-5.6/mlsource/extra/CInterface/DispatchSig.ML000066400000000000000000000055641265146633400223370ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature DispatchSig = sig type rawvol type RawCtype val Cchar : RawCtype val Cdouble : RawCtype val Cfloat : RawCtype val Cint : RawCtype val Clong : RawCtype val Cpointer : RawCtype val Cshort : RawCtype val Cstruct : RawCtype list -> RawCtype val Cuint : RawCtype val get_foreign_debug : unit -> int val set_foreign_debug : int -> unit val load_lib : string -> rawvol val load_sym : rawvol -> string -> rawvol structure Union : UnionSig val call_sym_and_convert : rawvol -> (RawCtype, rawvol) Union.directedArg list -> RawCtype Union.unionChoice -> (rawvol Union.union * rawvol Union.union list) val alloc : int -> rawvol val address : rawvol -> rawvol val deref : rawvol -> rawvol val offset : rawvol -> int -> rawvol val assign : rawvol -> rawvol -> int -> unit val sizeof : RawCtype -> int val alignment : RawCtype -> int val toCchar : char -> rawvol val toCdouble : real -> rawvol val toCfloat : real -> rawvol val toCint : int -> rawvol val toClong : int -> rawvol val toCshort : int -> rawvol val toCuint : int -> rawvol val fromCchar : rawvol -> char val fromCdouble : rawvol -> real val fromCfloat : rawvol -> real val fromCint : rawvol -> int val fromClong : rawvol -> int val fromCshort : rawvol -> int val fromCuint : rawvol -> int val fillCstring : rawvol -> string -> unit val toCstring : string -> rawvol val fromCstring : rawvol -> string val toCbytes : Word8Vector.vector -> rawvol val fromCbytes : rawvol * int -> Word8Vector.vector val toCfunction : RawCtype list -> RawCtype -> (rawvol list -> rawvol) -> rawvol val toPascalfunction : RawCtype list -> RawCtype -> (rawvol list -> rawvol) -> rawvol val setFinal : rawvol -> rawvol -> unit val null : rawvol end; polyml-5.6/mlsource/extra/CInterface/Examples/000077500000000000000000000000001265146633400214475ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/Examples/Foreign.def000066400000000000000000000002621265146633400235200ustar00rootroot00000000000000; Exports file for DLL LIBRARY "Foreign" EXPORTS DupNString SumTree ReturnR2 MakeCallback MakeCallback2 MakeCallback3 AllocateIt FreeIt UpdateArg ReturnFn polyml-5.6/mlsource/extra/CInterface/Examples/ForeignTest.c000066400000000000000000000052551265146633400240530ustar00rootroot00000000000000/* Example code for a C-library accessible from ML using the CInterface structure. Copyright David C.J. Matthews 1999, 2009, 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Linux: cc -shared -o Foreign ForeignTest.c Windows: cl /MT ForeignTest.c /link /dll /out:Foreign.dll /def:Foreign.def Mac OS X : cc -dynamiclib -o Foreign.dylib ForeignTest.c */ #include #include #include /* Return a string duplicated n Times. */ char *DupNString(int n, char *str) { int nSize = strlen(str); char *res = malloc(n*nSize + 1); int i; *res = 0; for (i = 0; i < n; i++) strcat(res, str); return res; } typedef struct _tree { struct _tree *left, *right; int nValue; } *tree; int SumTree(tree t) { if (t == NULL) return 0; else return t->nValue + SumTree(t->left) + SumTree(t->right); } /* Tests to see whether small structures are returned specially. */ struct r2 { int n, m; }; struct r2 ReturnR2(int n, int m) { struct r2 ret; ret.n = n+1; ret.m = m+1; return ret; } /* Added. Callback function. */ typedef int (*INT_INT_CALLBACK) (int a, int b); int MakeCallback(int i, INT_INT_CALLBACK p) { return (*p)(i, 4) + (*p)(i+1, 5); } /* Another callback function. This tests the various argument types. */ typedef double (*DBL_CALLBACK) (int a, char b, double c, float d, short e, int *f); double MakeCallback2(DBL_CALLBACK p) { int x = 1; double y = p(12345, 'X', (double)1.414, (float)2.8, 44, &x); return y; } // Check that void results work for callbacks. void MakeCallback3(void(*mlcall)(int), int i) { mlcall(i+1); } /* Test for finalisation. */ void *AllocateIt() { void *p = malloc(1); printf("Allocated object at %p\n", p); fflush(stdout); return p; } void FreeIt(void *p) { printf("Freed object at %p\n", p); fflush(stdout); free(p); } /* Test for call-by-reference. Added in updated FFI. */ void UpdateArg(int i, int *p) { *p += i; } /* Test for returning a function. Added in updated FFI. */ static int acallBack(int q) { return q * 2; } typedef int (*CB)(int); void ReturnFn(CB *v) { *v = acallBack; } polyml-5.6/mlsource/extra/CInterface/Examples/ForeignTest.sml000066400000000000000000000114001265146633400244110ustar00rootroot00000000000000(* Example code for a C-library accessible from ML using the CInterface structure. Copyright David C.J. Matthews 1999-2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) open CInterface; val mylib = CInterface.load_lib "Foreign"; (* Example of creating a conversion for a datatype. *) datatype intTree = NullTree | Node of {left: intTree, right: intTree, valu: int}; (* The corresponding C structure is typedef struct _tree { struct _tree *left, *right; int nValue; } *tree; *) local (* Start with the C structure. *) val TREENODE = STRUCT3(POINTER, POINTER, INT); val (unMakeStruct, mkStruct, structType) = breakConversion TREENODE; in (* The following function builds a C data structure from an ML datatype. *) fun tree2vol NullTree: vol = null | tree2vol (Node{left, right, valu}) = let (* Construct a struct from the values. *) val str = mkStruct(tree2vol left, tree2vol right, valu) (* Allocate a struct on the heap. *) val v = alloc 1 structType in (* Copy it over *) assign structType v str; (* Return the address of the heap area. *) address v end; (* The inverse of tree2vol. We don't actually use this in this example. *) fun vol2tree v = if fromClong v = 0 then NullTree else let val struc = deref v (* Get the structure itself from the pointer. *) val (left, right, valu) = unMakeStruct struc in Node{left=vol2tree left, right=vol2tree right, valu = valu } end end; (* Build a conversion out of this. *) val TREE = mkConversion vol2tree tree2vol voidStar; val sumTree = CInterface.call1 ( CInterface.load_sym mylib "SumTree") TREE INT; val aTree = Node{left=Node{left=NullTree, right=NullTree, valu=4}, right=Node{ left= Node{left=NullTree, right=NullTree, valu=3}, right=NullTree, valu=5}, valu = 7}; sumTree aTree; (* Example of returning a structure. *) val returnR2 = CInterface.call2 ( CInterface.load_sym mylib "ReturnR2") (CInterface.INT, CInterface.INT) (STRUCT2(CInterface.INT, CInterface.INT)); (* This function crashes the old version. Now fixed. *) returnR2(5,6); (* Example of passing and returning strings. *) val dupNString = CInterface.call2 (CInterface.load_sym mylib "DupNString") (CInterface.INT, CInterface.STRING) CInterface.STRING; dupNString (4, "hi"); (* Example of a callback function. *) fun f (i, j) = (PolyML.print(i, j); i+j); val doAdd = call2 (load_sym mylib "MakeCallback") (INT, FUNCTION2 (INT, INT) INT) INT; doAdd(4, f); (* Check that an exception is properly propagated. *) (* This doesn't work if the library has been compiled with GCC. Foreign.c is C code not C++ and the C++ exception mechanism won't propagate a C++ exception through C code. *) (* doAdd(4, fn _ => raise Fail "failed"); *) (* int a, char b, double c, float d, short e, int *f *) fun myCallback [v1, v2, v3, v4, v5, v6] = let val a = fromCint v1; val b = fromCchar v2; val c = fromCdouble v3; val d = fromCfloat v4; val e = fromCshort v5 (* f ? *) in PolyML.print(a, b, c, d, e); toCdouble 99.0 end | myCallback _ = toCint 1234; val myCbVol = toCfunction [Cint, Cchar, Cdouble, Cfloat, Cshort, Cpointer Cint] Cdouble myCallback; val returnR3 = call_sym (load_sym mylib "MakeCallback2") [(Cpointer Cint, myCbVol) ] Cdouble; fromCdouble returnR3; val doit = call2(load_sym mylib "MakeCallback3") (FUNCTION1 INT VOID, INT) VOID; doit(fn i => print(Int.toString i), 2); (* Test for finalisation. *) val allocateIt = call0 (load_sym mylib "AllocateIt") () POINTER; val v1 = allocateIt(); val v2 = allocateIt (); val final = load_sym mylib "FreeIt"; setFinal final v1; setFinal final v2; (* Activating the finalisers requires a full GC. *) val v1 = 0; (* The v1 object is no longer reachable. *) PolyML.fullGC(); val v2 = 0; (* The v2 object is no longer reachable. *) PolyML.fullGC(); polyml-5.6/mlsource/extra/CInterface/Examples/NewForeignTest.sml000066400000000000000000000103621265146633400250710ustar00rootroot00000000000000(* Example code for the updated foreign-function interface. Copyright David C.J. Matthews 2015 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) open Foreign; val mylib = loadLibrary "Foreign"; (* Example of creating a conversion for a datatype. *) datatype intTree = NullTree | Node of {left: intTree, right: intTree, valu: int}; (* The corresponding C structure is typedef struct _tree { struct _tree *left, *right; int nValue; } *tree; *) local (* Start with the C structure. *) val treeNode = cStruct3(cPointer, cPointer, cInt) val {store=storeStruct, load=loadStruct, ctype = {size = sizeStruct, ...}, ... } = breakConversion treeNode in (* The following function builds a C data structure from an ML datatype. *) fun treeMake NullTree = Memory.null | treeMake(Node{left, right, valu}) = let val mem = Memory.malloc sizeStruct in ignore(storeStruct(mem, (treeMake left, treeMake right, valu))); mem end fun treeClear a = if a = Memory.null then () else let val (left, right, _) = loadStruct a in treeClear left; treeClear right; Memory.free a end fun treeStore(addr, tree) = let val mem = treeMake tree in Memory.setAddress(addr, 0w0, mem); (* The store function returns a function that frees the memory. *) fn () => treeClear mem end (* The inverse of treeStore. We don't actually use this in this example. *) fun treeGet a = if a = Memory.null then NullTree else let val (left, right, valu) = loadStruct a in Node{left=treeGet left, right=treeGet right, valu = valu } end fun treeLoad v = treeGet(Memory.getAddress(v, 0w0)) end; (* Build a conversion out of this. *) val cTree: intTree conversion = makeConversion { load = treeLoad, store = treeStore, ctype = LowLevel.cTypePointer }; val sumTree = buildCall1 (getSymbol mylib "SumTree", cTree, cInt); val aTree = Node{left=Node{left=NullTree, right=NullTree, valu=4}, right=Node{ left= Node{left=NullTree, right=NullTree, valu=3}, right=NullTree, valu=5}, valu = 7}; sumTree aTree; (* Example of returning a structure. *) val returnR2 = buildCall2 (getSymbol mylib "ReturnR2", (cInt, cInt), cStruct2(cInt, cInt)); returnR2(5,6); (* Example of passing and returning strings. *) val dupNString = buildCall2 (getSymbol mylib "DupNString", (cInt, cString), cString); dupNString (4, "hi"); (* Example of a callback function. *) fun f (i, j) = (PolyML.print(i, j); i+j); val fAsCFunction = buildClosure2(f, (cInt, cInt), cInt); val doAdd = buildCall2 (getSymbol mylib "MakeCallback", (cInt, cFunction: (int*int->int) closure conversion), cInt); doAdd(4, fAsCFunction); fun myCallback(a: int, b: char, c: real, d: real, e: int, f: Memory.voidStar) = ( PolyML.print(a, b, c, d, e); 99.0 ); local val myCallbackC = buildClosure6(myCallback, (cInt, cChar, cDouble, cFloat, cShort, cPointer), cDouble) val MakeCallback2 = buildCall1(getSymbol mylib "MakeCallback2", cFunction, cDouble) in val returnR3 = MakeCallback2 myCallbackC end; let val f = buildClosure1(fn i => print(Int.toString i), cInt, cVoid) val doit = buildCall2(getSymbol mylib "MakeCallback3", (cFunction, cInt), cVoid) in doit(f, 2) end; (* Call-by-reference. *) val r = ref 6; val updateArg = buildCall2 (getSymbol mylib "UpdateArg", (cInt, cStar cInt), cVoid); updateArg(5, r); (* Adds its first argument to the ref. *) !r; polyml-5.6/mlsource/extra/CInterface/ForeignDebug.ML000066400000000000000000000015741265146633400224720ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ForeignDebug : ForeignDebugSig = Dispatch; polyml-5.6/mlsource/extra/CInterface/ForeignDebugSig.ML000066400000000000000000000016771265146633400231410ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature ForeignDebugSig = sig val get_foreign_debug : unit -> int val set_foreign_debug : int -> unit end; polyml-5.6/mlsource/extra/CInterface/ForeignException.ML000066400000000000000000000016721265146633400234010ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ForeignException : ForeignExceptionSig = struct exception Foreign = RunCall.Foreign end; polyml-5.6/mlsource/extra/CInterface/ForeignExceptionSig.ML000066400000000000000000000016211265146633400240360ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature ForeignExceptionSig = sig exception Foreign of string end; polyml-5.6/mlsource/extra/CInterface/LowerLevel.ML000066400000000000000000000202361265146633400222060ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure LowerLevel = struct open Volatile; open Volatile.BehaviourRefs; open ForeignException; (********************************************************************** An 'a promise represents a suspended computation of type 'a. A promise is created by passing an 'a thunk (a function from unit to 'a) to makePromise. A promise is activated using forcePromise. When a promise is forced, the result is remembered for subsequent force. This ensures that the thunk passed to makePromise will be evaluated at most once. For example, evaluation of the following would cause the message, "computing..." to be echoed just once: fun echo s = output (std_out,s); let val P = makePromise (fn () => (echo "computing...\n"; 2 + 2)) in forcePromise P + forcePromise P end; **********************************************************************) datatype ('a,'b) either = This of 'a | That of 'b datatype 'a promise = Promise of (unit -> 'a, 'a) either ref fun makePromise thunk = Promise (ref (This thunk)); fun forcePromise (Promise thingref) = case (!thingref) of This thunk => let val res = thunk() in (thingref := That res; res) end | That res => res; (********************************************************************** An 'a inert represents a re-creatable value of type 'a. Recreation is performed when a given exception is raised during the subsequent use of the inert value. This is useful for objects which do not survive from one PolyML session to the next, e.g. values of type "vol". > makeInert CATCH BUILD Create an inert value by forcing the thunk BUILD. Use CATCH as a predicate on exception values. It must return true for any exception which indicates recreation of this inert value is necessary. Recreation will be achieved by re-forcing BUILD. > withInert INERT F Apply the function F to the value encapsulated within INERT. If during the course of this application recreation is necessary then perform that recreation. **********************************************************************) datatype 'a inert = Inert of 'a ref * (unit -> 'a) * (exn -> bool) fun makeInert catch build = Inert(ref(build()), build, catch); fun withInert (Inert(value,build,catch)) f = f (!value) handle e => if catch e then (value := build(); f (!value)) else raise e; (********************************************************************** * Debugging... **********************************************************************) fun inform str = (****** * Output a message if "inform_about_symbol_reload" ref is set. ******) if !inform_about_symbol_reload then TextIO.print str else (); (********************************************************************** * Combination of Inert & Promises... **********************************************************************) fun makeIP catch build = makePromise (fn () => makeInert catch build); fun withIP ip f = withInert (forcePromise ip) f (********************************************************************** * Implementation of dylib & sym. **********************************************************************) datatype dylib = Dylib of string ref * vol inert promise; datatype sym = Sym of vol inert promise; fun withDylib (Dylib(_,ip)) f = withIP ip f; fun withSym (Sym ip) f = withIP ip f; fun get_libPath (Dylib(pathRef,_)) = !pathRef; fun set_libPath (Dylib(pathRef,_)) path = pathRef := path; val catchIV = (****** * Returns "true" when given an `invalid volatile' exception. * Note: this string must *exactly* match the corresponding * string found in the runtime system file: .../Driver/foreign.c ******) fn Foreign "Invalid volatile" => true | _ => false; fun load_lib path = (****** * Load a dynamic library. * This loading is done lazily, i.e. not until the library is needed. * The library will automatically reload in subsequent PolyML sessions * using the latest pathname set by set_libPath above. ******) let val pathRef = ref path in Dylib(pathRef, makeIP catchIV (fn () => (inform ("Loading library: "^(!pathRef)^"\n"); Volatile.load_lib (!pathRef)))) end; fun load_sym dylib symName = (****** * Load a symbol from a dynamic library. * This loading is done lazily. Neither the library or the symbol * will be loaded until the symbol is actually needed. * The symbol will be reloaded in subsequent PolyML sessions. ******) Sym(makeIP catchIV (fn () => withDylib dylib (fn dylibVol => (inform ("Loading symbol: "^symName^"\n"); Volatile.load_sym dylibVol symName)))); fun call_sym_and_convert sym args retType = (****** * Call a symbol as a C-function. * May load/reload either the symbol, or both the symbol and the library. ******) withSym sym (fn symVol => Volatile.call_sym_and_convert symVol args retType); (* Set a finalizer for a vol. *) fun setFinal sym vol = withSym sym (fn symVol => Volatile.setFinal symVol vol) fun volOfSym sym = (****** * Extract a *valid* volatile from a symbol * May load/reload either the symbol, or both the symbol and the library. * * The reload is caused because we attempt to take the address * of the vol which will raise an exception if the vol is invalid. ******) withSym sym (fn symVol => (Volatile.address symVol; symVol)); fun mapSym f sym = (****** * Change order of params for export... ******) withSym sym f; fun get_sym libPath (*symName*) = (****** * Common combination of load_lib & load_sym. * Partial application will cause the library to be shared, and * hence only loaded/reloaded once per session. ******) load_sym (load_lib libPath) (*symName*) ; open Union; (* now imported from Union ... exception Never of string; ... *) fun never string = raise Never string; (* Define call_sym in terms of call_sym_and_convert *) fun call_sym sym args retCtype = let val result = call_sym_and_convert sym (map (fn x => In (Vol x)) args) (chooseVol retCtype) in case result of (v,[]) => if isVol v then deVol v else never "call_sym" | _ => never "call_sym" end local fun prettyDylib _ _ (_: dylib) = PolyML.PrettyString "?" fun prettySym _ _ (_: sym) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyDylib and () = PolyML.addPrettyPrinter prettySym end end; polyml-5.6/mlsource/extra/CInterface/LowerLevelSig.ML000066400000000000000000000061131265146633400226470ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature LowerLevelSig = sig (* The first part of this is copied from VolatileSig *) type vol structure Ctype : CtypeSig structure BehaviourRefs : BehaviourRefsSig (* val load_lib : string -> vol val load_sym : vol -> string -> vol structure Union : UnionSig val call_sym_and_convert : vol -> (Ctype.Ctype, vol) Union.directedArg list -> Ctype.Ctype Union.unionChoice -> (vol Union.union * vol Union.union list) *) val alloc : int -> Ctype.Ctype -> vol val address : vol -> vol val deref : vol -> vol val offset : int -> Ctype.Ctype -> vol -> vol val assign : Ctype.Ctype -> vol -> vol -> unit val toCchar : char -> vol val toCdouble : real -> vol val toCfloat : real -> vol val toCint : int -> vol val toClong : int -> vol val toCshort : int -> vol val toCuint : int -> vol val fromCchar : vol -> char val fromCdouble : vol -> real val fromCfloat : vol -> real val fromCint : vol -> int val fromClong : vol -> int val fromCshort : vol -> int val fromCuint : vol -> int val fillCstring : vol -> string -> unit val toCstring : string -> vol val fromCstring : vol -> string val toCbytes : Word8Vector.vector -> vol val fromCbytes : vol * int -> Word8Vector.vector val toCfunction : Ctype.Ctype list -> Ctype.Ctype -> (vol list -> vol) -> vol val toPascalfunction : Ctype.Ctype list -> Ctype.Ctype -> (vol list -> vol) -> vol type dylib type sym (* overwite specifications in VolatileSig *) val load_lib : string -> dylib val load_sym : dylib -> string -> sym val get_sym : string -> string -> sym val setFinal : sym -> vol -> unit val null : vol val set_libPath : dylib -> string -> unit val get_libPath : dylib -> string structure Union : UnionSig val call_sym_and_convert : sym -> (Ctype.Ctype, vol) Union.directedArg list -> Ctype.Ctype Union.unionChoice -> (vol Union.union * vol Union.union list) val volOfSym : sym -> vol val mapSym : (vol -> 'a) -> sym -> 'a (*end*) end; polyml-5.6/mlsource/extra/CInterface/OrigLowerLevelSig.ML000066400000000000000000000022631265146633400234720ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*** To maintain top level interface we simulate old primitve call_sym in terms of new primitive call_sym_and_convert. This signature adds call_sym to LowerLevelSig. ***) signature OrigLowerLevelSig = sig include LowerLevelSig; (*local open Ctype in*) val call_sym : sym -> (Ctype.Ctype * vol) list -> Ctype.Ctype -> vol (*end*) end; polyml-5.6/mlsource/extra/CInterface/STRUCT_CONVERSIONALS.ML000066400000000000000000000317511265146633400232630ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (********************************************************************** * * Functor Application * **********************************************************************) functor STRUCT_CONVERSIONALS ( structure CallWithConv : CallWithConvSig structure Struct : StructSig structure ForeignException : ForeignExceptionSig structure LowerLevel : LowerLevelSig sharing type CallWithConv.vol = Struct.vol = LowerLevel.vol sharing Struct.Ctype = CallWithConv.Ctype = LowerLevel.Ctype ) : StructConversionalsSig = struct open Struct; open CallWithConv; open Ctype; open ForeignException; open LowerLevel; exception Zip; fun zip [] [] = [] | zip (x::xs) (y::ys) = (x,y) :: zip xs ys | zip _ _ = raise Zip; exception Break fun break2 ts v = case break_struct ts v of [a,b] => (a,b) | _ => raise Break fun break3 ts v = case break_struct ts v of [a,b,c] => (a,b,c) | _ => raise Break fun break4 ts v = case break_struct ts v of [a,b,c,d] => (a,b,c,d) | _ => raise Break fun break5 ts v = case break_struct ts v of [a,b,c,d,e] => (a,b,c,d,e) | _ => raise Break fun break6 ts v = case break_struct ts v of [a,b,c,d,e,f] => (a,b,c,d,e,f) | _ => raise Break fun break7 ts v = case break_struct ts v of [a,b,c,d,e,f,g] => (a,b,c,d,e,f,g) | _ => raise Break fun break8 ts v = case break_struct ts v of [a,b,c,d,e,f,g,h] => (a,b,c,d,e,f,g,h) | _ => raise Break fun break9 ts v = case break_struct ts v of [a,b,c,d,e,f,g,h,i] => (a,b,c,d,e,f,g,h,i) | _ => raise Break fun STRUCT2 (c1,c2) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val ctypes = [ctype1,ctype2] fun from v = let val (v1,v2) = break2 ctypes v in (from1 v1,from2 v2) end fun to (a,b) = make_struct (zip ctypes [to1 a,to2 b]) in mkConversion from to (Cstruct ctypes) end fun STRUCT3 (c1,c2,c3) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val ctypes = [ctype1,ctype2,ctype3] fun from v = let val (v1,v2,v3) = break3 ctypes v in (from1 v1,from2 v2,from3 v3) end fun to (a,b,c) = make_struct (zip ctypes [to1 a,to2 b,to3 c]) in mkConversion from to (Cstruct ctypes) end fun STRUCT4 (c1,c2,c3,c4) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val ctypes = [ctype1,ctype2,ctype3,ctype4] fun from v = let val (v1,v2,v3,v4) = break4 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4) end fun to (a,b,c,d) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d]) in mkConversion from to (Cstruct ctypes) end fun STRUCT5 (c1,c2,c3,c4,c5) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val (from5,to5,ctype5) = breakConversion c5 val ctypes = [ctype1,ctype2,ctype3,ctype4,ctype5] fun from v = let val (v1,v2,v3,v4,v5) = break5 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4,from5 v5) end fun to (a,b,c,d,e) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d,to5 e]) in mkConversion from to (Cstruct ctypes) end fun STRUCT6 (c1,c2,c3,c4,c5,c6) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val (from5,to5,ctype5) = breakConversion c5 val (from6,to6,ctype6) = breakConversion c6 val ctypes = [ctype1,ctype2,ctype3,ctype4,ctype5,ctype6] fun from v = let val (v1,v2,v3,v4,v5,v6) = break6 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4,from5 v5,from6 v6) end fun to (a,b,c,d,e,f) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d,to5 e,to6 f]) in mkConversion from to (Cstruct ctypes) end fun STRUCT7 (c1,c2,c3,c4,c5,c6,c7) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val (from5,to5,ctype5) = breakConversion c5 val (from6,to6,ctype6) = breakConversion c6 val (from7,to7,ctype7) = breakConversion c7 val ctypes = [ctype1,ctype2,ctype3,ctype4,ctype5,ctype6,ctype7] fun from v = let val (v1,v2,v3,v4,v5,v6,v7) = break7 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4,from5 v5,from6 v6,from7 v7) end fun to (a,b,c,d,e,f,g) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d,to5 e,to6 f,to7 g]) in mkConversion from to (Cstruct ctypes) end fun STRUCT8 (c1,c2,c3,c4,c5,c6,c7,c8) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val (from5,to5,ctype5) = breakConversion c5 val (from6,to6,ctype6) = breakConversion c6 val (from7,to7,ctype7) = breakConversion c7 val (from8,to8,ctype8) = breakConversion c8 val ctypes = [ctype1,ctype2,ctype3,ctype4,ctype5,ctype6,ctype7,ctype8] fun from v = let val (v1,v2,v3,v4,v5,v6,v7,v8) = break8 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4,from5 v5,from6 v6,from7 v7,from8 v8) end fun to (a,b,c,d,e,f,g,h) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d,to5 e,to6 f,to7 g,to8 h]) in mkConversion from to (Cstruct ctypes) end fun STRUCT9 (c1,c2,c3,c4,c5,c6,c7,c8,c9) = let val (from1,to1,ctype1) = breakConversion c1 val (from2,to2,ctype2) = breakConversion c2 val (from3,to3,ctype3) = breakConversion c3 val (from4,to4,ctype4) = breakConversion c4 val (from5,to5,ctype5) = breakConversion c5 val (from6,to6,ctype6) = breakConversion c6 val (from7,to7,ctype7) = breakConversion c7 val (from8,to8,ctype8) = breakConversion c8 val (from9,to9,ctype9) = breakConversion c9 val ctypes = [ctype1,ctype2,ctype3,ctype4,ctype5,ctype6,ctype7,ctype8,ctype9] fun from v = let val (v1,v2,v3,v4,v5,v6,v7,v8,v9) = break9 ctypes v in (from1 v1,from2 v2,from3 v3,from4 v4,from5 v5,from6 v6,from7 v7,from8 v8,from9 v9) end fun to (a,b,c,d,e,f,g,h,i) = make_struct (zip ctypes [to1 a,to2 b,to3 c,to4 d,to5 e,to6 f,to7 g,to8 h,to9 i]) in mkConversion from to (Cstruct ctypes) end fun FUNCTION0 () (cr: 'a Conversion) = let val (_, tor, ctyper) = breakConversion cr (* Convert the result type. *) fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" (* Construct a wrapper function. The argument is ignored and the result is converted into a vol.*) fun convF f _ = tor(f()) fun to (f: unit->'a) : vol = toCfunction [] ctyper (convF f) in mkConversion from to (Cfunction ([], ctyper)) end; fun PASCALFUNCTION0 () cr = let val (_, tor, ctyper) = breakConversion cr (* Convert the result type. *) fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f _ = tor(f()) fun to f = toPascalfunction [] ctyper (convF f) in mkConversion from to (Cfunction ([], ctyper)) end; fun FUNCTION1 c1 cr = let val (from1,_,ctype1) = breakConversion c1 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" (* The wrapper function. We need a single argument. *) fun convF f [a] = tor(f(from1 a)) | convF _ _ = raise Union.Never "arg mismatch" fun to f : vol = toCfunction [ctype1] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1], ctyper)) end; fun PASCALFUNCTION1 c1 cr = let val (from1,_,ctype1) = breakConversion c1 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a] = tor(f(from1 a)) | convF _ _ = raise Union.Never "arg mismatch" fun to f : vol = toPascalfunction [ctype1] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1], ctyper)) end; fun FUNCTION2 (c1, c2) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b] = tor(f(from1 a, from2 b)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toCfunction [ctype1, ctype2] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2], ctyper)) end; fun PASCALFUNCTION2 (c1, c2) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b] = tor(f(from1 a, from2 b)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toPascalfunction [ctype1, ctype2] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2], ctyper)) end; fun FUNCTION3 (c1, c2, c3) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (from3,_,ctype3) = breakConversion c3 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b,c] = tor(f(from1 a, from2 b, from3 c)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toCfunction [ctype1, ctype2, ctype3] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2, ctype3], ctyper)) end; fun PASCALFUNCTION3 (c1, c2, c3) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (from3,_,ctype3) = breakConversion c3 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b,c] = tor(f(from1 a, from2 b, from3 c)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toPascalfunction [ctype1, ctype2, ctype3] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2, ctype3], ctyper)) end; fun FUNCTION4 (c1, c2, c3, c4) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (from3,_,ctype3) = breakConversion c3 val (from4,_,ctype4) = breakConversion c4 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b,c,d] = tor(f(from1 a, from2 b, from3 c, from4 d)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toCfunction [ctype1, ctype2, ctype3, ctype4] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2, ctype3, ctype4], ctyper)) end; fun PASCALFUNCTION4 (c1, c2, c3, c4) cr = let val (from1,_,ctype1) = breakConversion c1 val (from2,_,ctype2) = breakConversion c2 val (from3,_,ctype3) = breakConversion c3 val (from4,_,ctype4) = breakConversion c4 val (_,tor,ctyper) = breakConversion cr fun from _ = raise Foreign "Conversion from C function to ML function is not implemented" fun convF f [a,b,c,d] = tor(f(from1 a, from2 b, from3 c, from4 d)) | convF _ _ = raise Union.Never "arg mismatch" fun to f = toPascalfunction [ctype1, ctype2, ctype3, ctype4] ctyper (convF f) in mkConversion from to (Cfunction ([ctype1, ctype2, ctype3, ctype4], ctyper)) end; (* val FUNCTION : 'a Conversion * 'b Conversion -> ( 'a -> 'b ) Conversion val PASCALFUNCTION : 'a Conversion * 'b Conversion -> ( 'a -> 'b ) Conversion *) end (* struct *) polyml-5.6/mlsource/extra/CInterface/Struct/000077500000000000000000000000001265146633400211555ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/Struct/STRUCT.ML000066400000000000000000000037311265146633400224370ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (********************************************************************** * * Functor Definition * **********************************************************************) functor STRUCT (structure LowerLevel : LowerLevelSig) : StructSig = struct open LowerLevel open Ctype local fun offsets _ [] = [] | offsets acc (t::ts) = let val pos = align acc t in pos :: offsets (pos + sizeof t) ts end in val offsets = offsets 0 end exception Zip; fun zip [] [] = [] | zip (x::xs) (y::ys) = (x,y) :: zip xs ys | zip _ _ = raise Zip; fun unzip [] = ([],[]) | unzip ((x,y)::xys) = let val (xs,ys) = unzip xys in (x::xs,y::ys) end; fun assigns (t::ts) (l::ls) (r::rs) = (assign t l r; assigns ts ls rs) | assigns _ _ _ = (); fun make_struct xs = let val (types,values) = unzip xs val space = alloc 1 (Cstruct types) val locations = map (fn n => offset n Cchar space) (offsets types) in assigns types locations values; space end fun break_struct types v = map (fn n => offset n Cchar v) (offsets types) end (* struct *) polyml-5.6/mlsource/extra/CInterface/Struct/ml_bind.ML000066400000000000000000000016111265146633400230120ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Struct = STRUCT(structure LowerLevel = LowerLevel); polyml-5.6/mlsource/extra/CInterface/StructConversionals.ML000066400000000000000000000021111265146633400241500ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure StructConversionals = STRUCT_CONVERSIONALS (structure CallWithConv = CallWithConv structure Struct = Struct structure ForeignException = ForeignException structure LowerLevel = LowerLevel); polyml-5.6/mlsource/extra/CInterface/StructConversionalsSig.ML000066400000000000000000000062641265146633400246300ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature StructConversionalsSig = sig type 'a Conversion val STRUCT2 : 'a Conversion * 'b Conversion -> ('a * 'b) Conversion val STRUCT3 : 'a Conversion * 'b Conversion * 'c Conversion -> ('a * 'b * 'c) Conversion val STRUCT4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> ('a * 'b * 'c * 'd) Conversion val STRUCT5 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion -> ('a * 'b * 'c * 'd * 'e) Conversion val STRUCT6 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion -> ('a * 'b * 'c * 'd * 'e * 'f) Conversion val STRUCT7 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g) Conversion val STRUCT8 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h) Conversion val STRUCT9 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion * 'e Conversion * 'f Conversion * 'g Conversion * 'h Conversion * 'i Conversion -> ('a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i) Conversion val FUNCTION0 : unit -> 'a Conversion -> ( unit -> 'a ) Conversion val PASCALFUNCTION0 : unit -> 'a Conversion -> ( unit -> 'a ) Conversion val FUNCTION1 : 'a Conversion -> 'b Conversion -> ( 'a -> 'b ) Conversion val PASCALFUNCTION1 : 'a Conversion -> 'b Conversion -> ( 'a -> 'b ) Conversion val FUNCTION2 : 'a Conversion * 'b Conversion -> 'c Conversion -> ( 'a * 'b -> 'c) Conversion val PASCALFUNCTION2 : 'a Conversion * 'b Conversion -> 'c Conversion -> ( 'a * 'b -> 'c) Conversion val FUNCTION3 : 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> ( 'a * 'b * 'c -> 'd) Conversion val PASCALFUNCTION3 : 'a Conversion * 'b Conversion * 'c Conversion -> 'd Conversion -> ( 'a * 'b * 'c -> 'd) Conversion val FUNCTION4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> ( 'a * 'b * 'c * 'd -> 'e) Conversion val PASCALFUNCTION4 : 'a Conversion * 'b Conversion * 'c Conversion * 'd Conversion -> 'e Conversion -> ( 'a * 'b * 'c * 'd -> 'e) Conversion end polyml-5.6/mlsource/extra/CInterface/StructSig.ML000066400000000000000000000020071265146633400220510ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature StructSig = sig type vol structure Ctype : CtypeSig val break_struct : Ctype.Ctype list -> vol -> vol list val make_struct : (Ctype.Ctype * vol) list -> vol end; polyml-5.6/mlsource/extra/CInterface/UnionSig.ML000066400000000000000000000100241265146633400216530ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*** Defines datatypes used to communicate with new primitive: call_sym_and_convert. ***) signature UnionSig = sig (* raised if a destructor is given the wrong argument *) exception Never of string; (* datatype 'a union = Vol of 'a | Char of string | Double of real | Float of real | Int of int | Long of int | Short of int | String of string; *) type 'a union val Vol : 'a -> 'a union; val Char : char -> 'a union; val Double : real -> 'a union; val Float : real -> 'a union; val Int : int -> 'a union; val Long : int -> 'a union; val Short : int -> 'a union; val String : string -> 'a union; val Uint : int -> 'a union; val isVol : 'a union -> bool; val isChar : 'a union -> bool; val isDouble : 'a union -> bool; val isFloat : 'a union -> bool; val isInt : 'a union -> bool; val isLong : 'a union -> bool; val isShort : 'a union -> bool; val isString : 'a union -> bool; val isUint : 'a union -> bool; val deVol : 'a union -> 'a; val deChar : 'a union -> char; val deDouble : 'a union -> real; val deFloat : 'a union -> real; val deInt : 'a union -> int; val deLong : 'a union -> int; val deShort : 'a union -> int; val deString : 'a union -> string; val deUint : 'a union -> int; (* ... datatype 'ctype unionChoice = chooseVol of 'ctype | chooseChar | chooseDouble | chooseFloat | chooseInt | chooseLong | chooseShort | chooseString; ... *) type 'a unionChoice; val chooseChar : 'a unionChoice; val chooseDouble : 'a unionChoice; val chooseFloat : 'a unionChoice; val chooseInt : 'a unionChoice; val chooseLong : 'a unionChoice; val chooseShort : 'a unionChoice; val chooseString : 'a unionChoice; val chooseVol : 'a -> 'a unionChoice; val chooseUint : 'a unionChoice; val isChooseChar : 'a unionChoice -> bool; val isChooseDouble : 'a unionChoice -> bool; val isChooseFloat : 'a unionChoice -> bool; val isChooseInt : 'a unionChoice -> bool; val isChooseLong : 'a unionChoice -> bool; val isChooseShort : 'a unionChoice -> bool; val isChooseString : 'a unionChoice -> bool; val isChooseVol : 'a unionChoice -> bool; val isChooseUint : 'a unionChoice -> bool; val deChooseVol : 'a unionChoice -> 'a; (* ... datatype ('ctype, 'vol) directedArg = In of ('ctype * 'vol) union | Out of 'ctype unionChoice; ... *) type ('a,'b) directedArg; val In : ('a * 'b) union -> ('a,'b) directedArg; val Out : 'a unionChoice -> ('a,'b) directedArg; val isIn : ('a,'b) directedArg -> bool; val isOut : ('a,'b) directedArg -> bool ; val deIn : ('a,'b) directedArg -> ('a * 'b) union; val deOut : ('a,'b) directedArg -> 'a unionChoice; val mapUnion : ('a -> 'b) -> 'a union -> 'b union val mapUnionChoice : ('a -> 'b) -> 'a unionChoice -> 'b unionChoice val mapDirectedArg : ('a -> 'b) -> ('c -> 'd) -> ('a, 'c) directedArg -> ('b, 'd) directedArg end; polyml-5.6/mlsource/extra/CInterface/VOLS_THAT_HOLD_REFS.ML000066400000000000000000000262341265146633400231620ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*** Implementaion of a wrapper for the raw C programming primitives, which provides the means for holding onto ML objects to avoid GC. ***) (* I think the idea here is to allow C data structures to be built up. If we allocate a C object using the low-level "alloc" function it may be freed by the GC if the corresponding ML object is no longer referenced. We don't want that to happen if we have stored a pointer to this C object in another C object. Only if the root of the whole structure is no longer reachable do we want the objects within the structure to be freed. DCJM 30/4/01. I've modified this to make it more efficient, particularly for large arrays. DCJM 27/6/01. *) (********************************************************************** * Functor Definition **********************************************************************) functor VOLS_THAT_HOLD_REFS (structure Underlying : VolatileSig structure ForeignException : ForeignExceptionSig) :> VolatileSig = struct structure Ctype = Underlying.Ctype structure BehaviourRefs = Underlying.BehaviourRefs structure Union = Underlying.Union val sizeof = Ctype.sizeof; open ForeignException open Union (*..... datatype owner = Owner of rawvol * dependancy ref list and vol = Vol of rawvol * dependancy where type dependancy = (int * owner) option .....*) (* The int records information for offset *) datatype owner = Owner of Underlying.vol * ownerOpt Array.array ref and ownerOpt = None | Some of int * owner (* This is more storage efficient than using "option". *) datatype vol = Vol of {thevol: Underlying.vol, depends: ownerOpt} fun vol(thevol, depends) = Vol{thevol = thevol, depends = depends} fun thevol(Vol{thevol, ...}) = thevol and depends(Vol{depends, ...}) = depends val PointerSize = sizeof (Ctype.Cpointer Ctype.Cvoid) val MaxVectorSize = 20 (* Maximum initial size of the dependency array. *) fun selfOwner v deps = (****** * Create a vol that `owns' itself, with dependencies "deps". ******) vol (v,Some(0,Owner(v, ref deps))) (*********************************************************************** a = alloc(n) ***********************************************************************) (* "alloc" allocates a new region of memory. The dependencies are initialised to None. If the region is large we don't allocate a dependency array that big at this stage. Instead we grow the array later if necessary. Typically large arrays are byte arrays and they don't actually have dependencies. *) fun alloc n ctype = let val m = n * sizeof ctype val v = Underlying.alloc n ctype in selfOwner v (Array.array(Int.min(m div PointerSize, MaxVectorSize), None)) end (*********************************************************************** a = &b ***********************************************************************) (* "address" creates a new vol containing the address of an existing one. We create a single element array to hold the dependencies. *) fun address (Vol{thevol, depends}) = let val v = Underlying.address thevol in selfOwner v (Array.array (1, depends)) end (*********************************************************************** a = *b ***********************************************************************) (* "deref" returns the value at the appropriate offset. The dependency is the dependency at the corresponding (word) offset. (We need to do this if, for example, we have created a list in the C space. If we extract the tail of a cell we need to hang on to the rest of the list.) *) fun deref(Vol{thevol, depends}) = vol (Underlying.deref thevol, case depends of None => None | Some(i, Owner(_, ref refs)) => if i mod PointerSize <> 0 then None else let val j = i div PointerSize in if j < 0 orelse j >= Array.length refs then None else Array.sub(refs, j) end) (*********************************************************************** a = b.X (offset n objects of type ctype) [*a = ( char* )&b + n] ***********************************************************************) (* "offset" gives us a new address based on the old one. We shift the origin of the dependency index by the appropriate amount. Because offset can be applied to this vol to give a new address we can't select the dependency at this offset yet. This is where the self-owner comes in. Although we're creating a new vol here we need to retain the original vol in the event of a GC. *) fun offset n ctype (Vol{thevol, depends}) = let val m = n * sizeof ctype in vol (Underlying.offset n ctype thevol, case depends of None => None | Some (i,x) => Some (i+m, x)) end (*********************************************************************** a := b (n bytes) ***********************************************************************) (* When we make an assignment of h into g we update the dependencies of g to point to the dependencies of h. We may have to grow the destination array. *) fun assign ctype g h = let val n = sizeof ctype in case (depends g, depends h) of (Some(i, Owner(_, drefs as ref destRefs)), Some(j, Owner(_, ref sourceRefs))) => (* We only copy the references if we're moving at least a word and the source and destinations are word aligned. We also skip this if the offsets are negative. It's just possible that there might be a C function which would return an area of memory with a pointer offset within it. In that case we don't want to raise a Subscript exception but I don't know how to deal with the dependencies. *) if n < PointerSize orelse i mod PointerSize <> 0 orelse j mod PointerSize <> 0 orelse i < 0 orelse j < 0 then () else let (* Neither the source array nor the destination array may be big enough. *) val di = i div PointerSize (* Starting offset in dest. *) val si = j div PointerSize (* Starting offset in source. *) val maxLen = n div PointerSize (* Words to copy. *) val sLen = Array.length sourceRefs val toCopy = if si + maxLen <= sLen then maxLen else sLen - si in if toCopy <= 0 then () (* Nothing in the source to copy. *) else let val diMax = di + toCopy (* Maximum offset. *) val dLen = Array.length destRefs val dVec = if dLen < diMax then (* Need to grow array. *) let val newSize = Int.max(diMax, dLen + dLen div 2) val newArray = Array.array(newSize, None) in (* Copy the old dependencies *) Array.copy{dst = newArray, src = destRefs, di = 0}; drefs := newArray; (* Remember this new array. *) newArray end else destRefs in (* Copy the dependencies being updated by the assignment. *) ArraySlice.copy{dst = dVec, src = ArraySlice.slice(sourceRefs, si, SOME toCopy), di = di} end end | _ => (); Underlying.assign ctype (thevol g) (thevol h) end (********************************************************************** From / To C values **********************************************************************) fun makeVol v = selfOwner v (Array.array(1, None)) fun load_lib s = makeVol (Underlying.load_lib s) fun load_sym (Vol{thevol, ...}) s = makeVol (Underlying.load_sym thevol s) fun ID x = x; fun call_sym_and_convert g args rt = let val (u,us) = Underlying.call_sym_and_convert (thevol g) (map (mapDirectedArg ID thevol) args) rt in (mapUnion makeVol u, map (mapUnion makeVol) us) end; val toCchar = makeVol o Underlying.toCchar val toCdouble = makeVol o Underlying.toCdouble val toCfloat = makeVol o Underlying.toCfloat val toCint = makeVol o Underlying.toCint val toClong = makeVol o Underlying.toClong val toCshort = makeVol o Underlying.toCshort val toCstring = makeVol o Underlying.toCstring val toCuint = makeVol o Underlying.toCuint val toCbytes = makeVol o Underlying.toCbytes val fromCchar = Underlying.fromCchar o thevol val fromCdouble = Underlying.fromCdouble o thevol val fromCfloat = Underlying.fromCfloat o thevol val fromCint = Underlying.fromCint o thevol val fromClong = Underlying.fromClong o thevol val fromCshort = Underlying.fromCshort o thevol val fromCstring = Underlying.fromCstring o thevol val fromCuint = Underlying.fromCuint o thevol val fillCstring = Underlying.fillCstring o thevol fun fromCbytes(v, i) = Underlying.fromCbytes(thevol v, i) (* DCJM 7/4/04. I've added these although I suspect that they need to do more than they're currently doing. *) fun toCfunction argType resType (f: vol list -> vol) = let fun appF (args: Underlying.vol list) : Underlying.vol = let in thevol (f (map makeVol args)) end in makeVol (Underlying.toCfunction argType resType appF) end fun toPascalfunction argType resType (f: vol list -> vol) = let fun appF (args: Underlying.vol list) : Underlying.vol = let in thevol (f (map makeVol args)) end in makeVol (Underlying.toPascalfunction argType resType appF) end fun setFinal f v = Underlying.setFinal (thevol f) (thevol v) local fun prettyVol _ _ (_: vol) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyVol end val null = vol (Underlying.null, None) end (* struct *) polyml-5.6/mlsource/extra/CInterface/VOL_BASIC.ML000066400000000000000000000041241265146633400214650ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor VOL_BASIC (structure Ctype : CtypeSig structure BehaviourRefs : BehaviourRefsSig structure Dispatch : DispatchSig sharing type Dispatch.RawCtype = Ctype.RawCtype ) : VolatileSig = struct structure BehaviourRefs = BehaviourRefs; structure Ctype = Ctype structure Union = Dispatch.Union; open Dispatch type vol = rawvol open Union open Ctype fun offset i ct v = Dispatch.offset v (i * sizeof ct) fun alloc i ct = Dispatch.alloc (i * sizeof ct) fun assign ct v w = Dispatch.assign v w (sizeof ct) fun ID x = x; fun call_sym_and_convert v args rt = Dispatch.call_sym_and_convert v (map (mapDirectedArg makeRaw ID) args) (mapUnionChoice makeRaw rt) (* These both take an ML function and create a vol. They can and should be applied to the type information before they are applied to the ML function. It actually doesn't help much because VOLS_THAT_HOLD_REFS().toCfunction etc sapply them to all the arguments. *) fun toCfunction argType resType = Dispatch.toCfunction (map makeRaw argType) (makeRaw resType) fun toPascalfunction argType resType = Dispatch.toPascalfunction (map makeRaw argType) (makeRaw resType) end; polyml-5.6/mlsource/extra/CInterface/VolBasic.ML000066400000000000000000000017401265146633400216270ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure VolBasic = VOL_BASIC(structure Dispatch = Dispatch structure BehaviourRefs = BehaviourRefs structure Ctype = Ctype); polyml-5.6/mlsource/extra/CInterface/Volatile/000077500000000000000000000000001265146633400214505ustar00rootroot00000000000000polyml-5.6/mlsource/extra/CInterface/Volatile/Volatile.ML000066400000000000000000000215261265146633400234670ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (*** Implementaion of a wrapper for the raw C programming primitives, which provides the means for holding onto ML objects to avoid GC. Also Convert between Ctype & RawCtype where necessary. ***) signature VOLATILE_SIG = sig type vol type Ctype val load_lib : string -> vol val load_sym : vol -> string -> vol val call_sym : vol -> (Ctype * vol) list -> Ctype -> vol val alloc : int -> Ctype -> vol val address : vol -> vol val deref : vol -> vol val offset : int -> Ctype -> vol -> vol val assign : Ctype -> vol -> vol -> unit val toCchar : string -> vol val toCdouble : real -> vol val toCfloat : real -> vol val toCint : int -> vol val toClong : int -> vol val toCshort : int -> vol val toCuint : int -> vol val fromCchar : vol -> string val fromCdouble : vol -> real val fromCfloat : vol -> real val fromCint : vol -> int val fromClong : vol -> int val fromCshort : vol -> int val fromCuint : vol -> int end signature DISPATCH_SIG = sig type rawvol type RawCtype val load_lib : string -> rawvol val load_sym : rawvol -> string -> rawvol val call_sym : rawvol -> (RawCtype * rawvol) list -> RawCtype -> rawvol val alloc : int -> rawvol val address : rawvol -> rawvol val deref : rawvol -> rawvol val offset : rawvol -> int -> rawvol val assign : rawvol -> rawvol -> int -> unit val toCchar : string -> rawvol val toCdouble : real -> rawvol val toCfloat : real -> rawvol val toCint : int -> rawvol val toClong : int -> rawvol val toCshort : int -> rawvol val fromCchar : rawvol -> string val fromCdouble : rawvol -> real val fromCfloat : rawvol -> real val fromCint : rawvol -> int val fromClong : rawvol -> int val fromCshort : rawvol -> int end; signature RAW_CTYPE_SIG = sig datatype RawCtype = Cchar | Cdouble | Cfloat | Cint | Clong | Cpointer | Cshort | Cuint | Cstruct of RawCtype list end; signature CTYPE_SIG = sig datatype Ctype = Cchar | Cdouble | Cfloat | Cint | Clong | Cshort | Cuint | Cpointer of Ctype | Cstruct of Ctype list | Cvoid val sizeof : Ctype -> int end; signature FOREIGN_EXCEPTION_SIG = sig exception Foreign of string end; (********************************************************************** * * Functor Application * **********************************************************************) functor VOLATILE (structure Dispatch : DISPATCH_SIG structure RawCtype : RAW_CTYPE_SIG structure Ctype : CTYPE_SIG structure ForeignException : FOREIGN_EXCEPTION_SIG sharing type Dispatch.RawCtype = RawCtype.RawCtype ) : VOLATILE_SIG = struct (*** Make just type rawvol visible ***) local structure Rawvol : sig type rawvol end = Dispatch in open Rawvol end open Ctype open ForeignException (*..... datatype owner = Owner of rawvol * dependancy ref list and vol = Vol of rawvol * dependancy where type dependancy = (int * owner) option .....*) (* Local version of option *) datatype 'a option = Some of 'a | None; datatype owner = Owner of rawvol * (int * owner) option ref list abstype vol = Vol of rawvol * (int * owner) option with fun thevol (Vol (v,_)) = v fun depends (Vol (_,x)) = x val vol = Vol end local fun prettyVol _ _ (m: vol) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter prettyVol end val PointerSize = 4 (* DCJM: That should be obtained from bytes_per_word. *) fun copy n x = (****** * Make a list containing n elements all equal to x. ******) let fun copy' 0 acc = acc | copy' n acc = copy' (n-1) (x::acc) in if n <= 0 then [] else copy' n [] end fun drop 0 xs = xs | drop _ [] = [] | drop n (_::xs) = drop (n-1) xs; fun dependencies g = case depends g of None => [] | Some(i,Owner(_,refs)) => if i mod PointerSize = 0 then drop (i div PointerSize) refs else [] fun selfOwner v deps = (****** * Create a vol that `owns' itself, with depndancies "deps". ******) vol (v,Some(0,Owner(v,deps))) (*********************************************************************** a = alloc(n) ***********************************************************************) fun alloc n ctype = let val m = n * sizeof ctype val v = Dispatch.alloc m in selfOwner v (map ref (copy (m div PointerSize) None)) end (*********************************************************************** a = &b ***********************************************************************) fun address g = let val v = Dispatch.address (thevol g) in selfOwner v [ref (depends g)] end (*********************************************************************** a = *b ***********************************************************************) fun deref g = vol (Dispatch.deref (thevol g), case (dependencies g) of [] => None | (r::_) => !r) (*********************************************************************** a = b.X (offset n objects of type ctype) [*a = ( char* )&b + n] ***********************************************************************) fun offset n ctype g = let val m = n * sizeof ctype in vol (Dispatch.offset (thevol g) m, case depends g of None => None | Some (i,x) => Some (i+m, x)) end (*********************************************************************** a := b (n bytes) ***********************************************************************) fun copyRefs 0 _ _ = () | copyRefs n (g::gs) (h::hs) = (g := !h; copyRefs (n-1) gs hs) | copyRefs _ _ _ = () fun assign ctype g h = let val n = sizeof ctype in (copyRefs (n div 4) (dependencies g) (dependencies h); Dispatch.assign (thevol g) (thevol h) n) end (********************************************************************** From / To C values **********************************************************************) fun makeVol v = selfOwner v [] fun load_lib s = makeVol (Dispatch.load_lib s) handle Foreign mes => raise (Foreign ("load_lib "^s^": "^mes)) fun load_sym g s = makeVol (Dispatch.load_sym (thevol g) s) handle Foreign mes => raise (Foreign ("load_sym "^s^": "^mes)) fun convertRawCtype Cchar = RawCtype.Cchar | convertRawCtype Cdouble = RawCtype.Cdouble | convertRawCtype Cfloat = RawCtype.Cfloat | convertRawCtype Cint = RawCtype.Cint | convertRawCtype Clong = RawCtype.Clong | convertRawCtype Cshort = RawCtype.Cshort | convertRawCtype Cuint = RawCtype.Cuint | convertRawCtype (Cpointer _) = RawCtype.Cpointer | convertRawCtype (Cstruct ts) = RawCtype.Cstruct (map convertRawCtype ts) | convertRawCtype Cvoid = RawCtype.Cint (*hack*) fun call_sym g args rt = makeVol (Dispatch.call_sym (thevol g) (map (fn (t,g) => (convertRawCtype t,thevol g)) args) (convertRawCtype rt)) val toCchar = makeVol o Dispatch.toCchar val toCdouble = makeVol o Dispatch.toCdouble val toCfloat = makeVol o Dispatch.toCfloat val toCint = makeVol o Dispatch.toCint val toClong = makeVol o Dispatch.toClong val toCshort = makeVol o Dispatch.toCshort val toCuint = makeVol o Dispatch.toCuint val fromCchar = Dispatch.fromCchar o thevol val fromCdouble = Dispatch.fromCdouble o thevol val fromCfloat = Dispatch.fromCfloat o thevol val fromCint = Dispatch.fromCint o thevol val fromClong = Dispatch.fromClong o thevol val fromCshort = Dispatch.fromCshort o thevol val fromCuint = Dispatch.fromCuint o thevol end (* struct *) polyml-5.6/mlsource/extra/CInterface/Volatile/ml_bind.ML000066400000000000000000000017071265146633400233130ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Volatile = VOLS_THAT_HOLD_REFS (structure Underlying = VolBasic structure ForeignException = ForeignException); polyml-5.6/mlsource/extra/CInterface/VolatileSig.ML000066400000000000000000000047461265146633400223600ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* All volatile implementations must have this signature *) signature VolatileSig = sig type vol structure Ctype : CtypeSig structure BehaviourRefs : BehaviourRefsSig val load_lib : string -> vol val load_sym : vol -> string -> vol structure Union : UnionSig val call_sym_and_convert : vol -> (Ctype.Ctype, vol) Union.directedArg list -> Ctype.Ctype Union.unionChoice -> (vol Union.union * vol Union.union list) val alloc : int -> Ctype.Ctype -> vol val address : vol -> vol val deref : vol -> vol val offset : int -> Ctype.Ctype -> vol -> vol val assign : Ctype.Ctype -> vol -> vol -> unit val toCchar : char -> vol val toCdouble : real -> vol val toCfloat : real -> vol val toCint : int -> vol val toClong : int -> vol val toCshort : int -> vol val toCuint : int -> vol val fromCchar : vol -> char val fromCdouble : vol -> real val fromCfloat : vol -> real val fromCint : vol -> int val fromClong : vol -> int val fromCshort : vol -> int val fromCuint : vol -> int val fillCstring : vol -> string -> unit val toCstring : string -> vol val fromCstring : vol -> string val toCbytes : Word8Vector.vector -> vol val fromCbytes : vol * int -> Word8Vector.vector val toCfunction : Ctype.Ctype list -> Ctype.Ctype -> (vol list -> vol) -> vol val toPascalfunction : Ctype.Ctype list -> Ctype.Ctype -> (vol list -> vol) -> vol val setFinal : vol -> vol -> unit val null : vol end; polyml-5.6/mlsource/extra/CInterface/clean.sml000066400000000000000000000032631265146633400214740ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Clean up the name space by removing unnecessary declarations. *) val _ = List.app PolyML.Compiler.forgetSignature ["ForeignExceptionSig", "CallWithConvSig", "ConversionsSig", "ForeignDebugSig", "LowerLevelSig", "BehaviourRefsSig", "StructSig", "DispatchSig", "VolatileSig", "ForeignExceptionSig_Import", "OrigLowerLevelSig", "StructConversionalsSig", "UnionSig", "CtypeSig"]; val _ = List.app PolyML.Compiler.forgetStructure [ "LowerLevel", "ForeignDebug", "VolBasic", "Struct", "Dispatch", "Volatile", "Ctype", "StructConversionals", "CallWithConv", "BehaviourRefs", "ForeignException", "Conversions" ]; val _ = List.app PolyML.Compiler.forgetFunctor ["STRUCT", "CTYPE_SAVE_SIZEOF", "CINTERFACE", "CALL_WITH_CONV", "STRUCT_CONVERSIONALS", "CTYPE", "CONVERSIONS", "VOLS_THAT_HOLD_REFS", "VOL_BASIC"]; polyml-5.6/mlsource/extra/CInterface/ml_bind.ML000066400000000000000000000023711265146633400215320ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure CInterface (*: CInterfaceSig*) = CINTERFACE (structure ForeignException = ForeignException structure ForeignDebug = ForeignDebug structure LowerLevel = LowerLevel structure CallWithConv = CallWithConv structure Struct = Struct structure Conversions = Conversions structure StructConversionals = StructConversionals); polyml-5.6/mlsource/extra/Motif/000077500000000000000000000000001265146633400167445ustar00rootroot00000000000000polyml-5.6/mlsource/extra/Motif/InitialiseCore.ML000066400000000000000000000430221265146633400221020ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure InitialiseCore = struct local open MotifTypes XmTypes MotifCore in val U = XtSetExceptionType XmNaccelerator XmRString ; val U = XtSetExceptionType XmNacceleratorText XmRXmString ; val U = XtSetExceptionType XmNaccelerators XmRAcceleratorTable ; val U = XtSetExceptionType XmNadjustLast XmRBool ; val U = XtSetExceptionType XmNadjustMargin XmRBool ; val U = XtSetExceptionType XmNalignment XmRAlignment ; val U = XtSetExceptionType XmNallowOverlap XmRBool ; val U = XtSetExceptionType XmNallowResize XmRBool ; val U = XtSetExceptionType XmNallowShellResize XmRBool ; val U = XtSetExceptionType XmNancestorSensitive XmRBool ; val U = XtSetExceptionType XmNapplyLabelString XmRXmString ; val U = XtSetExceptionType XmNargc XmRInt ; val U = XtSetExceptionType XmNargv XmRStringTable ; val U = XtSetExceptionType XmNarmColor XmRPixel ; val U = XtSetExceptionType XmNarmPixmap XmRPixmap ; val U = XtSetExceptionType XmNarrowDirection XmRArrowDirection ; val U = XtSetExceptionType XmNautoShowCursorPosition XmRBool ; val U = XtSetExceptionType XmNautoUnmanage XmRBool ; val U = XtSetExceptionType XmNautomaticSelection XmRBool ; val U = XtSetExceptionType XmNbackground XmRPixel ; val U = XtSetExceptionType XmNbackgroundPixmap XmRPixmap ; val U = XtSetExceptionType XmNbaseHeight XmRInt ; val U = XtSetExceptionType XmNbaseWidth XmRInt ; val U = XtSetExceptionType XmNblinkRate XmRInt ; val U = XtSetExceptionType XmNborderColor XmRPixel ; val U = XtSetExceptionType XmNborderPixmap XmRPixmap ; val U = XtSetExceptionType XmNborderWidth XmRDimension ; val U = XtSetExceptionType XmNbottomAttachment XmRAttachment ; val U = XtSetExceptionType XmNbottomOffset XmRInt ; val U = XtSetExceptionType XmNbottomPosition XmRInt ; val U = XtSetExceptionType XmNbottomShadowColor XmRPixel ; val U = XtSetExceptionType XmNbottomShadowPixmap XmRPixmap ; val U = XtSetExceptionType XmNbottomWidget XmRWidget ; val U = XtSetExceptionType XmNbuttonAcceleratorText XmRXmStringTable ; val U = XtSetExceptionType XmNbuttonAccelerators XmRStringTable ; val U = XtSetExceptionType XmNbuttonCount XmRInt ; val U = XtSetExceptionType XmNbuttonFontList XmRFontList ; val U = XtSetExceptionType XmNbuttonMnemonicCharSets XmRXmStringTable ; val U = XtSetExceptionType XmNbuttonMnemonics XmRKeySymTable ; val U = XtSetExceptionType XmNbuttonSet XmRInt ; val U = XtSetExceptionType XmNbuttonType XmRButtonTypeTable ; val U = XtSetExceptionType XmNbuttons XmRXmStringTable ; val U = XtSetExceptionType XmNcancelButton XmRWidget ; val U = XtSetExceptionType XmNcancelLabelString XmRXmString ; val U = XtSetExceptionType XmNcascadePixmap XmRPixmap ; val U = XtSetExceptionType XmNchildren XmRWidgetList ; val U = XtSetExceptionType XmNclipWindow XmRWidget ; val U = XtSetExceptionType XmNcolormap XmRColormap ; val U = XtSetExceptionType XmNcolumns XmRShort ; val U = XtSetExceptionType XmNcommand XmRXmString ; val U = XtSetExceptionType XmNcommandWindow XmRWidget ; val U = XtSetExceptionType XmNcommandWindowLocation XmRCommandWindowLocation ; val U = XtSetExceptionType XmNcursorPosition XmRInt ; val U = XtSetExceptionType XmNcursorPositionVisible XmRBool ; val U = XtSetExceptionType XmNdecimalPoints XmRShort ; val U = XtSetExceptionType XmNdefaultButton XmRWidget ; val U = XtSetExceptionType XmNdefaultButtonShadowThickness XmRDimension ; val U = XtSetExceptionType XmNdefaultButtonType XmRDefaultButtonType ; val U = XtSetExceptionType XmNdefaultFontList XmRFontList ; val U = XtSetExceptionType XmNdefaultPosition XmRBool ; val U = XtSetExceptionType XmNdeleteResponse XmRDeleteResponse ; val U = XtSetExceptionType XmNdepth XmRInt ; val U = XtSetExceptionType XmNdialogStyle XmRDialogStyle ; val U = XtSetExceptionType XmNdialogTitle XmRXmString ; val U = XtSetExceptionType XmNdialogType XmRDialogType ; val U = XtSetExceptionType XmNdirListItemCount XmRInt ; val U = XtSetExceptionType XmNdirListItems XmRXmStringTable ; val U = XtSetExceptionType XmNdirListLabelString XmRXmString ; val U = XtSetExceptionType XmNdirMask XmRXmString ; val U = XtSetExceptionType XmNdirSpec XmRXmString ; val U = XtSetExceptionType XmNdirectory XmRXmString ; val U = XtSetExceptionType XmNdirectoryValid XmRBool ; val U = XtSetExceptionType XmNdoubleClickInterval XmRInt ; val U = XtSetExceptionType XmNeditMode XmREditMode ; val U = XtSetExceptionType XmNeditable XmRBool ; val U = XtSetExceptionType XmNentryAlignment XmRAlignment ; val U = XtSetExceptionType XmNentryBorder XmRDimension ; val U = XtSetExceptionType XmNfileListItemCount XmRInt ; val U = XtSetExceptionType XmNfileListItems XmRXmStringTable ; val U = XtSetExceptionType XmNfileListLabelString XmRXmString ; val U = XtSetExceptionType XmNfileTypeMask XmRFileTypeMask ; val U = XtSetExceptionType XmNfillOnArm XmRBool ; val U = XtSetExceptionType XmNfillOnSelect XmRBool ; val U = XtSetExceptionType XmNfilterLabelString XmRXmString ; val U = XtSetExceptionType XmNfontList XmRFontList ; val U = XtSetExceptionType XmNforeground XmRPixel ; val U = XtSetExceptionType XmNfractionBase XmRInt ; val U = XtSetExceptionType XmNgeometry XmRString ; val U = XtSetExceptionType XmNheight XmRDimension ; val U = XtSetExceptionType XmNheightInc XmRInt ; val U = XtSetExceptionType XmNhelpLabelString XmRXmString ; val U = XtSetExceptionType XmNhighlightColor XmRPixel ; val U = XtSetExceptionType XmNhighlightOnEnter XmRBool ; val U = XtSetExceptionType XmNhighlightPixmap XmRPixmap ; val U = XtSetExceptionType XmNhighlightThickness XmRDimension ; val U = XtSetExceptionType XmNhistoryItemCount XmRInt ; val U = XtSetExceptionType XmNhistoryItems XmRXmStringTable ; val U = XtSetExceptionType XmNhistoryMaxItems XmRInt ; val U = XtSetExceptionType XmNhistoryVisibleItemCount XmRInt ; val U = XtSetExceptionType XmNhorizontalScrollBar XmRWidget ; val U = XtSetExceptionType XmNhorizontalSpacing XmRDimension ; val U = XtSetExceptionType XmNiconMask XmRPixmap ; val U = XtSetExceptionType XmNiconName XmRString ; val U = XtSetExceptionType XmNiconNameEncoding XmRAtom ; val U = XtSetExceptionType XmNiconPixmap XmRPixmap ; val U = XtSetExceptionType XmNiconWindow XmRPixmap ; val U = XtSetExceptionType XmNiconX XmRInt ; val U = XtSetExceptionType XmNiconY XmRInt ; val U = XtSetExceptionType XmNiconic XmRBool ; val U = XtSetExceptionType XmNincrement XmRInt ; val U = XtSetExceptionType XmNindicatorOn XmRBool ; val U = XtSetExceptionType XmNindicatorSize XmRDimension ; val U = XtSetExceptionType XmNindicatorType XmRIndicatorType ; val U = XtSetExceptionType XmNinitialDelay XmRInt ; val U = XtSetExceptionType XmNinitialResourcesPersistent XmRBool ; val U = XtSetExceptionType XmNinitialState XmRInitialState ; val U = XtSetExceptionType XmNinput XmRBool ; val U = XtSetExceptionType XmNisAligned XmRBool ; val U = XtSetExceptionType XmNisHomogeneous XmRBool ; val U = XtSetExceptionType XmNitemCount XmRInt ; val U = XtSetExceptionType XmNitems XmRXmStringTable ; val U = XtSetExceptionType XmNkeyboardFocusPolicy XmRKeyboardFocusPolicy ; val U = XtSetExceptionType XmNlabelFontList XmRFontList ; val U = XtSetExceptionType XmNlabelInsensitivePixmap XmRPixmap ; val U = XtSetExceptionType XmNlabelPixmap XmRPixmap ; val U = XtSetExceptionType XmNlabelString XmRXmString ; val U = XtSetExceptionType XmNlabelType XmRLabelType ; val U = XtSetExceptionType XmNleftAttachment XmRAttachment ; val U = XtSetExceptionType XmNleftOffset XmRInt ; val U = XtSetExceptionType XmNleftPosition XmRInt ; val U = XtSetExceptionType XmNleftWidget XmRWidget ; val U = XtSetExceptionType XmNlistItemCount XmRInt ; val U = XtSetExceptionType XmNlistItems XmRXmStringTable ; val U = XtSetExceptionType XmNlistLabelString XmRXmString ; val U = XtSetExceptionType XmNlistMarginHeight XmRDimension ; val U = XtSetExceptionType XmNlistMarginWidth XmRDimension ; val U = XtSetExceptionType XmNlistSizePolicy XmRVisualPolicy ; val U = XtSetExceptionType XmNlistSpacing XmRDimension ; val U = XtSetExceptionType XmNlistUpdated XmRBool ; val U = XtSetExceptionType XmNlistVisibleItemCount XmRInt ; val U = XtSetExceptionType XmNmainWindowMarginHeight XmRDimension ; val U = XtSetExceptionType XmNmainWindowMarginWidth XmRDimension ; val U = XtSetExceptionType XmNmappedWhenManaged XmRBool ; val U = XtSetExceptionType XmNmappingDelay XmRInt ; val U = XtSetExceptionType XmNmargin XmRDimension ; val U = XtSetExceptionType XmNmarginBottom XmRDimension ; val U = XtSetExceptionType XmNmarginHeight XmRDimension ; val U = XtSetExceptionType XmNmarginLeft XmRDimension ; val U = XtSetExceptionType XmNmarginRight XmRDimension ; val U = XtSetExceptionType XmNmarginTop XmRDimension ; val U = XtSetExceptionType XmNmarginWidth XmRDimension ; val U = XtSetExceptionType XmNmaxAspectX XmRInt ; val U = XtSetExceptionType XmNmaxAspectY XmRInt ; val U = XtSetExceptionType XmNmaxHeight XmRInt ; val U = XtSetExceptionType XmNmaxLength XmRInt ; val U = XtSetExceptionType XmNmaxWidth XmRInt ; val U = XtSetExceptionType XmNmaximum XmRInt ; val U = XtSetExceptionType XmNmenuAccelerator XmRString ; val U = XtSetExceptionType XmNmenuBar XmRWidget ; val U = XtSetExceptionType XmNmenuCursor XmRCursor ; val U = XtSetExceptionType XmNmenuHelpWidget XmRWidget ; val U = XtSetExceptionType XmNmenuHistory XmRWidget ; val U = XtSetExceptionType XmNmenuPost XmRString ; val U = XtSetExceptionType XmNmessageAlignment XmRAlignment ; val U = XtSetExceptionType XmNmessageString XmRXmString ; val U = XtSetExceptionType XmNmessageWindow XmRWidget ; val U = XtSetExceptionType XmNminAspectX XmRInt ; val U = XtSetExceptionType XmNminAspectY XmRInt ; val U = XtSetExceptionType XmNminHeight XmRInt ; val U = XtSetExceptionType XmNminWidth XmRInt ; val U = XtSetExceptionType XmNminimizeButtons XmRBool ; val U = XtSetExceptionType XmNminimum XmRInt ; val U = XtSetExceptionType XmNmnemonic XmRKeySym ; val U = XtSetExceptionType XmNmnemonicCharSet XmRString ; val U = XtSetExceptionType XmNmultiClick XmRMultiClick ; val U = XtSetExceptionType XmNmustMatch XmRBool ; val U = XtSetExceptionType XmNmwmDecorations XmRInt ; val U = XtSetExceptionType XmNmwmFunctions XmRInt ; val U = XtSetExceptionType XmNmwmInputMode XmRInt ; val U = XtSetExceptionType XmNmwmMenu XmRString ; val U = XtSetExceptionType XmNnavigationType XmRNavigationType ; val U = XtSetExceptionType XmNnoMatchString XmRXmString ; val U = XtSetExceptionType XmNnoResize XmRBool ; val U = XtSetExceptionType XmNnumChildren XmRCardinal ; val U = XtSetExceptionType XmNnumColumns XmRShort ; val U = XtSetExceptionType XmNokLabelString XmRXmString ; val U = XtSetExceptionType XmNoptionLabel XmRXmString ; val U = XtSetExceptionType XmNoptionMnemonic XmRKeySym ; val U = XtSetExceptionType XmNorientation XmROrientation ; val U = XtSetExceptionType XmNoverrideRedirect XmRBool ; val U = XtSetExceptionType XmNpacking XmRPacking ; val U = XtSetExceptionType XmNpageIncrement XmRInt ; val U = XtSetExceptionType XmNpaneMaximum XmRDimension ; val U = XtSetExceptionType XmNpaneMinimum XmRDimension ; val U = XtSetExceptionType XmNpattern XmRXmString ; val U = XtSetExceptionType XmNpendingDelete XmRBool ; val U = XtSetExceptionType XmNpopupEnabled XmRBool ; val U = XtSetExceptionType XmNpostFromButton XmRInt ; val U = XtSetExceptionType XmNprocessingDirection XmRProcessingDirection ; val U = XtSetExceptionType XmNpromptString XmRXmString ; val U = XtSetExceptionType XmNpushButtonEnabled XmRBool ; val U = XtSetExceptionType XmNradioAlwaysOne XmRBool ; val U = XtSetExceptionType XmNradioBehavior XmRBool ; val U = XtSetExceptionType XmNrecomputeSize XmRBool ; val U = XtSetExceptionType XmNrefigureMode XmRBool ; val U = XtSetExceptionType XmNrepeatDelay XmRInt ; val U = XtSetExceptionType XmNresizable XmRBool ; val U = XtSetExceptionType XmNresizeHeight XmRBool ; val U = XtSetExceptionType XmNresizePolicy XmRResizePolicy ; val U = XtSetExceptionType XmNresizeWidth XmRBool ; val U = XtSetExceptionType XmNrightAttachment XmRAttachment ; val U = XtSetExceptionType XmNrightOffset XmRInt ; val U = XtSetExceptionType XmNrightPosition XmRInt ; val U = XtSetExceptionType XmNrightWidget XmRWidget ; val U = XtSetExceptionType XmNrowColumnType XmRRowColumnType ; val U = XtSetExceptionType XmNrows XmRShort ; val U = XtSetExceptionType XmNrubberPositioning XmRBool ; val U = XtSetExceptionType XmNsashHeight XmRDimension ; val U = XtSetExceptionType XmNsashIndent XmRPosition ; val U = XtSetExceptionType XmNsashShadowThickness XmRDimension ; val U = XtSetExceptionType XmNsashWidth XmRDimension ; val U = XtSetExceptionType XmNsaveUnder XmRBool ; val U = XtSetExceptionType XmNscaleHeight XmRDimension ; val U = XtSetExceptionType XmNscaleMultiple XmRInt ; val U = XtSetExceptionType XmNscaleWidth XmRDimension ; val U = XtSetExceptionType XmNscrollBarDisplayPolicy XmRScrollBarDisplayPolicy ; val U = XtSetExceptionType XmNscrollBarPlacement XmRScrollBarPlacement ; val U = XtSetExceptionType XmNscrollHorizontal XmRBool ; val U = XtSetExceptionType XmNscrollLeftSide XmRBool ; val U = XtSetExceptionType XmNscrollTopSide XmRBool ; val U = XtSetExceptionType XmNscrollVertical XmRBool ; val U = XtSetExceptionType XmNscrolledWindowMarginHeight XmRDimension ; val U = XtSetExceptionType XmNscrolledWindowMarginWidth XmRDimension ; val U = XtSetExceptionType XmNscrollingPolicy XmRScrollingPolicy ; val U = XtSetExceptionType XmNselectColor XmRPixel ; val U = XtSetExceptionType XmNselectInsensitivePixmap XmRPixmap ; val U = XtSetExceptionType XmNselectPixmap XmRPixmap ; val U = XtSetExceptionType XmNselectThreshold XmRInt ; val U = XtSetExceptionType XmNselectedItemCount XmRInt ; val U = XtSetExceptionType XmNselectedItems XmRXmStringTable ; val U = XtSetExceptionType XmNselectionArray XmRTextScanTypeTable ; val U = XtSetExceptionType XmNselectionArrayCount XmRInt ; val U = XtSetExceptionType XmNselectionLabelString XmRXmString ; val U = XtSetExceptionType XmNselectionPolicy XmRSelectionPolicy ; val U = XtSetExceptionType XmNsensitive XmRBool ; val U = XtSetExceptionType XmNseparatorOn XmRBool ; val U = XtSetExceptionType XmNseparatorType XmRShadowType ; val U = XtSetExceptionType XmNset XmRBool ; val U = XtSetExceptionType XmNshadowThickness XmRDimension ; val U = XtSetExceptionType XmNshadowType XmRShadowType ; val U = XtSetExceptionType XmNshellUnitType XmRUnitType ; val U = XtSetExceptionType XmNshowArrows XmRBool ; val U = XtSetExceptionType XmNshowAsDefault XmRDimension ; val U = XtSetExceptionType XmNshowSeparator XmRBool ; val U = XtSetExceptionType XmNshowValue XmRBool ; val U = XtSetExceptionType XmNskipAdjust XmRBool ; val U = XtSetExceptionType XmNsliderSize XmRInt ; val U = XtSetExceptionType XmNspacing XmRDimension ; val U = XtSetExceptionType XmNstringDirection XmRStringDirection ; val U = XtSetExceptionType XmNsubMenuId XmRWidget ; val U = XtSetExceptionType XmNsymbolPixmap XmRPixmap ; val U = XtSetExceptionType XmNtextAccelerators XmRAcceleratorTable ; val U = XtSetExceptionType XmNtextColumns XmRShort ; val U = XtSetExceptionType XmNtextFontList XmRFontList ; val U = XtSetExceptionType XmNtextString XmRXmString ; val U = XtSetExceptionType XmNtextTranslations XmRTranslationTable ; val U = XtSetExceptionType XmNtitle XmRString ; val U = XtSetExceptionType XmNtitleEncoding XmRAtom ; val U = XtSetExceptionType XmNtitleString XmRXmString ; val U = XtSetExceptionType XmNtopAttachment XmRAttachment ; val U = XtSetExceptionType XmNtopCharacter XmRInt ; val U = XtSetExceptionType XmNtopItemPosition XmRInt ; val U = XtSetExceptionType XmNtopOffset XmRInt ; val U = XtSetExceptionType XmNtopPosition XmRInt ; val U = XtSetExceptionType XmNtopShadowColor XmRPixel ; val U = XtSetExceptionType XmNtopShadowPixmap XmRPixmap ; val U = XtSetExceptionType XmNtopWidget XmRWidget ; val U = XtSetExceptionType XmNtransient XmRBool ; val U = XtSetExceptionType XmNtransientFor XmRWidget ; val U = XtSetExceptionType XmNtranslations XmRTranslationTable ; val U = XtSetExceptionType XmNtraversalOn XmRBool ; val U = XtSetExceptionType XmNtroughColor XmRPixel ; val U = XtSetExceptionType XmNunitType XmRUnitType ; val U = XtSetExceptionType XmNuseAsyncGeometry XmRBool ; val U = XtSetExceptionType XmNvalue XmRInt ; val U = XtSetExceptionType XmNverifyBell XmRBool ; val U = XtSetExceptionType XmNverticalScrollBar XmRWidget ; val U = XtSetExceptionType XmNverticalSpacing XmRDimension ; (* The O'Reilly book says this resource is a short - it's wrong! *) val U = XtSetExceptionType XmNvisibleItemCount XmRInt; val U = XtSetExceptionType XmNvisibleWhenOff XmRBool ; val U = XtSetExceptionType XmNvisual XmRVisual ; val U = XtSetExceptionType XmNvisualPolicy XmRVisualPolicy ; val U = XtSetExceptionType XmNwaitForWm XmRBool ; val U = XtSetExceptionType XmNwidth XmRDimension ; val U = XtSetExceptionType XmNwidthInc XmRInt ; val U = XtSetExceptionType XmNwinGravity XmRInt ; val U = XtSetExceptionType XmNwindowGroup XmRPixmap ; val U = XtSetExceptionType XmNwmTimeout XmRInt ; val U = XtSetExceptionType XmNwordWrap XmRBool ; val U = XtSetExceptionType XmNworkWindow XmRWidget ; val U = XtSetExceptionType XmNx XmRPosition ; val U = XtSetExceptionType XmNy XmRPosition ; end (* local *) ; end (* struct *) ; polyml-5.6/mlsource/extra/Motif/MOTIF_SIG.ML000066400000000000000000000457721265146633400205750ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature MOTIF_SIG = sig include XM_TYPES val XtParseTranslationTable : string -> XtTranslations val XtOverrideTranslations : Widget -> XtTranslations -> unit val XtAugmentTranslations : Widget -> XtTranslations -> unit val XtUninstallTranslations : Widget -> unit val XtTranslateTablePrint : XtTranslations -> unit val NoWidget : Widget val WidgetID : Widget -> int val WidgetExists : Widget -> bool val XtAppInitialise : string -> string -> string -> string list -> Arg list -> Widget val XtCreatePopupShell : string -> Widget -> Arg list -> Widget val XtRealizeWidget : Widget -> unit val XtUnrealizeWidget : Widget -> unit val XtDestroyWidget : Widget -> unit val XtManageChild : Widget -> unit val XtUnmanageChild : Widget -> unit val XtManageChildren : Widget list -> unit val XtUnmanageChildren : Widget list -> unit val XtSetExceptionType : ('a -> Arg) -> ('a -> XmRType) -> unit val XtSetValue : Widget -> Arg -> unit val XtSetValues : Widget -> Arg list -> unit val XtGetValue : Widget -> string -> Arg val XtGetValues : Widget -> string list -> Arg list val XtGetSubresources : Widget -> string -> string -> (string * string * XmRType) list -> Arg list val XtParent : Widget -> Widget val XtWindow : Widget -> XWindows.Drawable val XtDisplay : Widget -> XWindows.Display val XtName : Widget -> string val XtSetCallbacks : Widget -> (XtCallback * (Widget * 'a XWindows.XEvent * '_b -> '_b)) list -> '_b -> int -> 'a -> unit val XtSetSensitive : Widget -> bool -> unit val XtIsSensitive : Widget -> bool (* added 6/12/94 SPF *) val XtPopup : Widget -> XtGrabKind -> unit; val XtPopdown : Widget -> unit; val XtMapWidget : Widget -> unit; val XtUnmapWidget : Widget -> unit; (* added 19/1/95 SPF *) val XtIsManaged : Widget -> bool val XtIsRealized : Widget -> bool (* Added by DCJM. 23/3/01. *) val XtGetApplicationResources: Widget -> (string * string * XmRType) list -> Arg list ; val XtAddEventHandler: Widget -> XWindows.EventMask list -> bool -> (Widget * 'a XWindows.XEvent -> unit) -> unit val XmCreateArrowButton : Widget -> string -> Arg list -> Widget val XmCreateArrowButtonGadget : Widget -> string -> Arg list -> Widget val XmCreateBulletinBoard : Widget -> string -> Arg list -> Widget val XmCreateBulletinBoardDialog : Widget -> string -> Arg list -> Widget val XmCreateCascadeButton : Widget -> string -> Arg list -> Widget val XmCreateCascadeButtonGadget : Widget -> string -> Arg list -> Widget val XmCreateCommand : Widget -> string -> Arg list -> Widget val XmCreateDialogShell : Widget -> string -> Arg list -> Widget val XmCreateDrawingArea : Widget -> string -> Arg list -> Widget val XmCreateDrawnButton : Widget -> string -> Arg list -> Widget val XmCreateErrorDialog : Widget -> string -> Arg list -> Widget val XmCreateFileSelectionBox : Widget -> string -> Arg list -> Widget val XmCreateFileSelectionDialog : Widget -> string -> Arg list -> Widget val XmCreateForm : Widget -> string -> Arg list -> Widget val XmCreateFormDialog : Widget -> string -> Arg list -> Widget val XmCreateFrame : Widget -> string -> Arg list -> Widget val XmCreateInformationDialog : Widget -> string -> Arg list -> Widget val XmCreateLabel : Widget -> string -> Arg list -> Widget val XmCreateLabelGadget : Widget -> string -> Arg list -> Widget val XmCreateList : Widget -> string -> Arg list -> Widget val XmCreateMainWindow : Widget -> string -> Arg list -> Widget val XmCreateMenuBar : Widget -> string -> Arg list -> Widget val XmCreateMenuShell : Widget -> string -> Arg list -> Widget val XmCreateMessageBox : Widget -> string -> Arg list -> Widget val XmCreateMessageDialog : Widget -> string -> Arg list -> Widget val XmCreateOptionMenu : Widget -> string -> Arg list -> Widget val XmCreatePanedWindow : Widget -> string -> Arg list -> Widget val XmCreatePopupMenu : Widget -> string -> Arg list -> Widget val XmCreatePromptDialog : Widget -> string -> Arg list -> Widget val XmCreatePulldownMenu : Widget -> string -> Arg list -> Widget val XmCreatePushButton : Widget -> string -> Arg list -> Widget val XmCreatePushButtonGadget : Widget -> string -> Arg list -> Widget val XmCreateQuestionDialog : Widget -> string -> Arg list -> Widget val XmCreateRadioBox : Widget -> string -> Arg list -> Widget val XmCreateRowColumn : Widget -> string -> Arg list -> Widget val XmCreateScale : Widget -> string -> Arg list -> Widget val XmCreateScrollBar : Widget -> string -> Arg list -> Widget val XmCreateScrolledList : Widget -> string -> Arg list -> Widget val XmCreateScrolledText : Widget -> string -> Arg list -> Widget val XmCreateScrolledWindow : Widget -> string -> Arg list -> Widget val XmCreateSelectionBox : Widget -> string -> Arg list -> Widget val XmCreateSelectionDialog : Widget -> string -> Arg list -> Widget val XmCreateSeparator : Widget -> string -> Arg list -> Widget val XmCreateSeparatorGadget : Widget -> string -> Arg list -> Widget val XmCreateSimpleCheckBox : Widget -> string -> Arg list -> Widget val XmCreateSimpleMenuBar : Widget -> string -> Arg list -> Widget val XmCreateSimpleOptionMenu : Widget -> string -> Arg list -> Widget val XmCreateSimplePopupMenu : Widget -> string -> Arg list -> Widget val XmCreateSimplePulldownMenu : Widget -> string -> Arg list -> Widget val XmCreateSimpleRadioBox : Widget -> string -> Arg list -> Widget val XmCreateText : Widget -> string -> Arg list -> Widget val XmCreateTextField : Widget -> string -> Arg list -> Widget val XmCreateToggleButton : Widget -> string -> Arg list -> Widget val XmCreateToggleButtonGadget : Widget -> string -> Arg list -> Widget val XmCreateWarningDialog : Widget -> string -> Arg list -> Widget val XmCreateWorkArea : Widget -> string -> Arg list -> Widget val XmCreateWorkingDialog : Widget -> string -> Arg list -> Widget val XmCascadeButtonHighlight : Widget -> bool -> unit val XmCommandError : Widget -> XmString -> unit val XmCommandGetChild : Widget -> XmDefaultButtonType -> Widget val XmFileSelectionBoxGetChild : Widget -> XmDefaultButtonType -> Widget val XmFileSelectionDoSearch : Widget -> XmString -> unit val XmIsArrowButton : Widget -> bool val XmIsArrowButtonGadget : Widget -> bool val XmIsBulletinBoard : Widget -> bool val XmIsCascadeButton : Widget -> bool val XmIsCascadeButtonGadget : Widget -> bool val XmIsCommand : Widget -> bool val XmIsDesktopObject : Widget -> bool val XmIsDialogShell : Widget -> bool (* unsupported by solaris version of toolkit ... val XmIsDisplayObject : Widget -> bool ... *) val XmIsDrawingArea : Widget -> bool val XmIsDrawnButton : Widget -> bool val XmIsExtObject : Widget -> bool val XmIsFileSelectionBox : Widget -> bool val XmIsForm : Widget -> bool val XmIsFrame : Widget -> bool val XmIsGadget : Widget -> bool val XmIsLabel : Widget -> bool val XmIsLabelGadget : Widget -> bool val XmIsList : Widget -> bool val XmIsMainWindow : Widget -> bool val XmIsManager : Widget -> bool val XmIsMenuShell : Widget -> bool val XmIsMessageBox : Widget -> bool val XmIsMotifWMRunning : Widget -> bool val XmIsPanedWindow : Widget -> bool val XmIsPrimitive : Widget -> bool val XmIsPushButton : Widget -> bool val XmIsPushButtonGadget : Widget -> bool val XmIsRowColumn : Widget -> bool val XmIsScale : Widget -> bool (* unsupported by solaris version of toolkit ... val XmIsScreenObject : Widget -> bool ... *) val XmIsScrollBar : Widget -> bool val XmIsScrolledWindow : Widget -> bool val XmIsSelectionBox : Widget -> bool val XmIsSeparator : Widget -> bool val XmIsSeparatorGadget : Widget -> bool val XmIsShellExt : Widget -> bool val XmIsText : Widget -> bool val XmIsTextField : Widget -> bool val XmIsToggleButton : Widget -> bool val XmIsToggleButtonGadget : Widget -> bool val XmIsVendorShell : Widget -> bool val XmIsVendorShellExt : Widget -> bool (* unsupported in Motif 1.2 val XmIsWorldObject : Widget -> bool *) val XmMainWindowSetAreas : Widget -> Widget -> Widget -> Widget -> Widget -> Widget -> unit val XmMainWindowSep1 : Widget -> Widget val XmMainWindowSep2 : Widget -> Widget val XmMainWindowSep3 : Widget -> Widget val XmMessageBoxGetChild : Widget -> XmDefaultButtonType -> Widget val XmOptionButtonGadget : Widget -> Widget val XmOptionLabelGadget : Widget -> Widget val XmScrolledWindowSetAreas : Widget -> Widget -> Widget -> Widget -> unit val XmSelectionBoxGetChild : Widget -> XmDefaultButtonType -> Widget val XmSetMenuCursor : XWindows.Display -> XWindows.Cursor -> unit val XmTrackingLocate : Widget -> XWindows.Cursor -> bool -> Widget val XmUpdateDisplay : Widget -> unit (******************************************************************************) (* *) (* Operations on XmText Widgets *) (* *) (******************************************************************************) val XmTextGetAddMode : Widget -> bool val XmTextGetBaseline : Widget -> int val XmTextGetCursorPosition : Widget -> int val XmTextGetEditable : Widget -> bool val XmTextGetInsertionPosition : Widget -> int val XmTextGetLastPosition : Widget -> int val XmTextGetMaxLength : Widget -> int val XmTextGetSelection : Widget -> int val XmTextGetString : Widget -> string val XmTextGetTopCharacter : Widget -> int val XmTextInsert : Widget -> int -> string -> unit val XmTextPaste : Widget -> bool val XmTextRemove : Widget -> bool val XmTextReplace : Widget -> int -> int -> string -> unit val XmTextScroll : Widget -> int -> unit val XmTextSetAddMode : Widget -> bool -> unit val XmTextSetCursorPosition : Widget -> int -> unit val XmTextSetEditable : Widget -> bool -> unit val XmTextSetInsertionPosition : Widget -> int -> unit val XmTextSetMaxLength : Widget -> int -> unit val XmTextSetString : Widget -> string -> unit val XmTextSetTopCharacter : Widget -> int -> unit val XmTextShowPosition : Widget -> int -> unit val XmTextXYToPos : Widget -> int -> int -> int (******************************************************************************) (* *) (* Operations on XmTextField Widgets *) (* *) (******************************************************************************) val XmTextFieldGetAddMode : Widget -> bool val XmTextFieldGetBaseline : Widget -> int val XmTextFieldGetCursorPosition : Widget -> int val XmTextFieldGetEditable : Widget -> bool val XmTextFieldGetInsertionPosition : Widget -> int val XmTextFieldGetLastPosition : Widget -> int val XmTextFieldGetMaxLength : Widget -> int val XmTextFieldGetSelection : Widget -> int val XmTextFieldGetString : Widget -> string val XmTextFieldInsert : Widget -> int -> string -> unit val XmTextFieldPaste : Widget -> bool val XmTextFieldRemove : Widget -> bool val XmTextFieldReplace : Widget -> int -> int -> string -> unit val XmTextFieldSetAddMode : Widget -> bool -> unit val XmTextFieldSetCursorPosition : Widget -> int -> unit val XmTextFieldSetEditable : Widget -> bool -> unit val XmTextFieldSetInsertionPosition : Widget -> int -> unit val XmTextFieldSetMaxLength : Widget -> int -> unit val XmTextFieldSetString : Widget -> string -> unit val XmTextFieldShowPosition : Widget -> int -> unit val XmTextFieldXYToPos : Widget -> int -> int -> int (******************************************************************************) (* *) (* Operations on XmList Widgets *) (* *) (******************************************************************************) (* This widget maintains an ordered list of strings. The user can select or deselect strings in the list. The programmer can refer to the strings either by name (passing in the string itself) or by position (passing in an integer; the first string in the list has position 1). *) (************************* Adding Items to List *******************************) (* Add one item (the string) at the specified postion (the int). *) (* If the string is in the Widget's current selected items list, it will be pre-selected. *) val XmListAddItem : Widget -> string -> int -> unit; (* As XmListAddItems, except that the new item is not pre-selected. *) val XmListAddItemUnselected : Widget -> string -> int -> unit; (* Add a number of items, starting at the specifed position. *) val XmListAddItems : Widget -> string list -> int -> unit; (************************* Deleting Items from List ***************************) (* Delete all items in the list *) val XmListDeleteAllItems : Widget -> unit; (* Delete the item (specified as a string) from the list *) val XmListDeleteItem : Widget -> string -> unit; (* Delete several item (specified as strings) from the list *) val XmListDeleteItems : Widget -> string list -> unit; (* Delete the item (specified by its position) from the widget *) val XmListDeletePos: Widget -> int -> unit; (* Delete several items (specified by their positions) from the widget *) val XmListDeleteItemsPos: Widget -> int -> int -> unit; (************************* Deselecting Items **********************************) (* Deselect all items in the list *) val XmListDeselectAllItems: Widget -> unit; (* Deselect the item (specified as a string). *) val XmListDeselectItem: Widget -> string -> unit; (* Deselect the item (specified by its position). *) val XmListDeselectPos: Widget -> int -> unit; (************************* Query Functions ************************************) (* Return the list of positions at which the string appears in the list *) val XmListGetMatchPos: Widget -> string -> int list (* Return the list of positions of the currently selected items *) val XmListGetSelectedPos: Widget -> int list (* Does the item occur in the list? *) val XmListItemExists: Widget -> string -> bool; (* What is the first occurrence of the item in the list? (0 if absent). *) val XmListItemPos: Widget -> string -> int; (************************* Replacing Items in the List ************************) (* For each (old, new) pair, replace each occurrence of "old" with "new". *) val XmListReplaceItems: Widget -> (string * string) list -> unit; (* Replace items in the list, starting at the specified position *) val XmListReplaceItemsPos: Widget -> string list -> int -> unit; (************************* Selecting Items in the List ************************) (* Highlight the specified item and add it to the list of selected items. If the bool is true, also invoke the selection callback. *) val XmListSelectItem: Widget -> string -> bool -> unit; val XmListSelectPos: Widget -> int -> bool -> unit; (************************* Set Add Mode ***************************************) (* Activate (bool is "true") or deactivate (bool is "false") Add Mode. *) val XmListSetAddMode: Widget -> bool -> unit; (************************* Set Appearance *************************************) (* Make an existing item the last visible item in the list. *) val XmListSetBottomItem: Widget -> string -> unit; val XmListSetBottomPos: Widget -> int -> unit; (* Moves the horizontal scroolbar to the speciied position *) val XmListSetHorizPos: Widget -> int -> unit; (* Make an existing item the first visible item in the list. *) val XmListSetItem: Widget -> string -> unit; val XmListSetPos: Widget -> int -> unit; (************************* Miscellaneous *************************************) (* Not supported by the SUNOS version of the tool-kit ... val XmListAddItemsUnselected : Widget -> string list -> int -> unit; val XmListDeletePositions: Widget -> int list -> unit; val XmListGetKbdItemPos: Widget -> int val XmListPosSelected: Widget -> int -> bool; val XmListReplaceItemsPosUnselected: Widget -> string list -> int -> unit; val XmListReplaceItemsPositions: Widget -> (int * string) list -> unit; val XmListSetKbdItemPos: Widget -> int -> bool; val XmListUpdateSelectedList: Widget -> unit; val XmListYToPos: Widget -> int -> int val XmListPosToBounds: Widget -> ??? ... *) (* Added by DCJM. 23/3/01. *) val XmMenuPosition: Widget -> 'a XWindows.XEvent -> unit (* local *) end (* signature *) polyml-5.6/mlsource/extra/Motif/MOTIF_TYPES.ML000066400000000000000000000234041265146633400210430ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature MOTIF_TYPES = sig structure XWINDOWS: sig type Colormap; type Cursor; type Display; type Drawable; type Visual; type XFontStruct; type XWMStateHint; type 'a XEvent; end; (* should we have a separate Xt level? Probaly. SPF 6/12/94 *) type Widget; type XtAccelerators; type XtTranslations; (* Added 6/12/94 SPF *) datatype XtGrabKind = XtGrabNone | XtGrabNonexclusive | XtGrabExclusive; datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END; datatype XmArrowDirection = XmARROW_UP | XmARROW_DOWN | XmARROW_LEFT | XmARROW_RIGHT; datatype XmAttachment = XmATTACH_NONE | XmATTACH_FORM | XmATTACH_OPPOSITE_FORM | XmATTACH_WIDGET | XmATTACH_OPPOSITE_WIDGET | XmATTACH_POSITION | XmATTACH_SELF; datatype XmButtonType = XmPUSHBUTTON | XmCHECKBUTTON | XmTOGGLEBUTTON | XmRADIOBUTTON | XmCASCADEBUTTON | XmSEPARATOR | XmDOUBLE_SEPARATOR | XmTITLE; datatype XmCommandWindowLocation = XmCOMMAND_ABOVE_WORKSPACE | XmCOMMAND_BELOW_WORKSPACE; datatype XmDefaultButtonType = XmDIALOG_NONE | XmDIALOG_APPLY_BUTTON | XmDIALOG_CANCEL_BUTTON | XmDIALOG_DEFAULT_BUTTON | XmDIALOG_OK_BUTTON | XmDIALOG_FILTER_LABEL | XmDIALOG_FILTER_TEXT | XmDIALOG_HELP_BUTTON | XmDIALOG_LIST | XmDIALOG_LIST_LABEL | XmDIALOG_MESSAGE_LABEL | XmDIALOG_SELECTION_LABEL | XmDIALOG_SYMBOL_LABEL | XmDIALOG_TEXT | XmDIALOG_SEPARATOR | XmDIALOG_DIR_LIST | XmDIALOG_DIR_LIST_LABEL (* | XmDIALOG_COMMAND_TEXT = XmDIALOG_TEXT | XmDIALOG_VALUE_TEXT = XmDIALOG_TEXT | XmDIALOG_PROMPT_LABEL = XmDIALOG_SELECTION_LABEL | XmDIALOG_HISTORY_LIST = XmDIALOG_LIST | XmDIALOG_FILE_LIST = XmDIALOG_LIST | XmDIALOG_FILE_LIST_LABEL = XmDIALOG_LIST_LABEL *); val XmDIALOG_COMMAND_TEXT: XmDefaultButtonType; val XmDIALOG_VALUE_TEXT: XmDefaultButtonType; val XmDIALOG_PROMPT_LABEL: XmDefaultButtonType; val XmDIALOG_HISTORY_LIST: XmDefaultButtonType; val XmDIALOG_FILE_LIST: XmDefaultButtonType; val XmDIALOG_FILE_LIST_LABEL: XmDefaultButtonType; datatype XmDeleteResponse = XmDESTROY | XmUNMAP | XmDO_NOTHING; datatype XmDialogStyle = XmDIALOG_MODELESS | XmDIALOG_PRIMARY_APPLICATION_MODAL | XmDIALOG_FULL_APPLICATION_MODAL | XmDIALOG_SYSTEM_MODAL (* | XmDIALOG_APPLICATION_MODAL *); val XmDIALOG_APPLICATION_MODAL: XmDialogStyle; datatype XmDialogType = XmDIALOG_ERROR | XmDIALOG_INFORMATION | XmDIALOG_MESSAGE | XmDIALOG_QUESTION | XmDIALOG_WARNING | XmDIALOG_WORKING | XmDIALOG_WORK_AREA | XmDIALOG_PROMPT | XmDIALOG_SELECTION | XmDIALOG_COMMAND | XmDIALOG_FILE_SELECTION; datatype XmEditMode = XmMULTI_LINE_EDIT | XmSINGLE_LINE_EDIT; datatype XmFileTypeMask = XmFILE_REGULAR | XmFILE_DIRECTORY | XmFILE_ANY_TYPE; datatype XmIndicatorType = XmN_OF_MANY | XmONE_OF_MANY; datatype XmKeyboardFocusPolicy = XmEXPLICIT | XmPOINTER; datatype XmLabelType = XmPIXMAP | XmSTRING; datatype XmMultiClickType = XmMULTICLICK_DISCARD | XmMULTICLICK_KEEP; datatype XmNavigationType = XmNONE | XmTAB_GROUP | XmSTICKY_TAB_GROUP | XmEXCLUSIVE_TAB_GROUP; datatype XmOrientation = XmVERTICAL | XmHORIZONTAL; datatype XmPacking = XmPACK_TIGHT | XmPACK_COLUMN | XmPACK_NONE; datatype XmProcessingDirection = XmMAX_ON_TOP | XmMAX_ON_BOTTOM | XmMAX_ON_LEFT | XmMAX_ON_RIGHT; datatype XmResizePolicy = XmRESIZE_NONE | XmRESIZE_ANY | XmRESIZE_GROW; datatype XmRowColumnType = XmWORK_AREA | XmMENU_BAR | XmMENU_PULLDOWN | XmMENU_POPUP | XmMENU_OPTION; datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED; datatype XmScrollBarPlacement = XmBOTTOM_RIGHT | XmTOP_RIGHT | XmBOTTOM_LEFT | XmTOP_LEFT; datatype XmScrollingPolicy = XmAUTOMATIC | XmAPPLICATION_DEFINED; datatype XmSelectionPolicy = XmSINGLE_SELECT | XmMULTIPLE_SELECT | XmEXTENDED_SELECT | XmBROWSE_SELECT; datatype XmShadowType = XmNO_LINE | XmSINGLE_LINE | XmDOUBLE_LINE | XmSINGLE_DASHED_LINE | XmDOUBLE_DASHED_LINE | XmSHADOW_ETCHED_IN | XmSHADOW_ETCHED_OUT | XmSHADOW_IN | XmSHADOW_OUT; datatype XmStringDirection = XmSTRING_DIRECTION_L_TO_R | XmSTRING_DIRECTION_R_TO_L | XmSTRING_DIRECTION_DEFAULT; datatype XmTextScanType = XmSELECT_POSITION | XmSELECT_WHITESPACE | XmSELECT_WORD | XmSELECT_LINE | XmSELECT_ALL | XmSELECT_PARAGRAPH; datatype XmUnitType = XmPIXELS | Xm100TH_MILLIMETERS | Xm1000TH_INCHES | Xm100TH_POINTS | Xm100TH_FONT_UNITS; datatype XmVisualPolicy = XmVARIABLE | XmCONSTANT | XmRESIZE_IF_POSSIBLE; type XmString = string; type Arg = exn; datatype XmRType = XmRAcceleratorTable of XtAccelerators | XmRAlignment of XmAlignment | XmRArrowDirection of XmArrowDirection | XmRAtom of int | XmRAttachment of XmAttachment | XmRBool of bool | XmRButtonTypeTable of XmButtonType list | XmRCardinal of int | XmRColormap of XWINDOWS.Colormap | XmRCommandWindowLocation of XmCommandWindowLocation | XmRCursor of XWINDOWS.Cursor | XmRDefaultButtonType of XmDefaultButtonType | XmRDeleteResponse of XmDeleteResponse | XmRDialogStyle of XmDialogStyle | XmRDialogType of XmDialogType | XmRDimension of int | XmREditMode of XmEditMode | XmRFileTypeMask of XmFileTypeMask | XmRFontList of (XWINDOWS.XFontStruct * string) list | XmRIndicatorType of XmIndicatorType | XmRInitialState of XWINDOWS.XWMStateHint | XmRInt of int | XmRKeySym of int | XmRKeySymTable of int list | XmRKeyboardFocusPolicy of XmKeyboardFocusPolicy | XmRLabelType of XmLabelType | XmRMultiClick of XmMultiClickType | XmRNavigationType of XmNavigationType | XmROrientation of XmOrientation | XmRPacking of XmPacking | XmRProcessingDirection of XmProcessingDirection | XmRResizePolicy of XmResizePolicy | XmRRowColumnType of XmRowColumnType | XmRPixel of int | XmRPixmap of XWINDOWS.Drawable | XmRPosition of int | XmRScrollBarDisplayPolicy of XmScrollBarDisplayPolicy | XmRScrollBarPlacement of XmScrollBarPlacement | XmRScrollingPolicy of XmScrollingPolicy | XmRSelectionPolicy of XmSelectionPolicy | XmRShadowType of XmShadowType | XmRShort of int | XmRStringDirection of XmStringDirection | XmRString of string | XmRStringTable of string list | XmRTextScanTypeTable of XmTextScanType list | XmRTranslationTable of XtTranslations | XmRUnitType of XmUnitType | XmRVisual of XWINDOWS.Visual | XmRVisualPolicy of XmVisualPolicy | XmRWidget of Widget | XmRWidgetList of Widget list | XmRXmString of XmString | XmRXmStringTable of XmString list; datatype XtCallback = XmNactivateCallback | XmNapplyCallback | XmNarmCallback | XmNbrowseSelectionCallback | XmNcancelCallback | XmNcascadingCallback | XmNcommandChangedCallback | XmNcommandEnteredCallback | XmNdecrementCallback | XmNdefaultActionCallback | XmNdestroyCallback | XmNdisarmCallback | XmNdragCallback | XmNentryCallback | XmNexposeCallback | XmNextendedSelectionCallback | XmNfocusCallback | XmNgainPrimaryCallback | XmNhelpCallback | XmNincrementCallback | XmNinputCallback | XmNlosePrimaryCallback | XmNlosingFocusCallback | XmNmapCallback | XmNmessageCallback (* this callback gets Message XEvents only *) | XmNmodifyVerifyCallback | XmNmotionVerifyCallback | XmNmultipleSelectionCallback | XmNnoMatchCallback | XmNokCallback | XmNpageDecrementCallback | XmNpageIncrementCallback | XmNpopdownCallback | XmNpopupCallback | XmNresizeCallback | XmNsimpleCallback | XmNsingleSelectionCallback | XmNtoBottomCallback | XmNtoTopCallback | XmNunmapCallback | XmNvalueChangedCallback; end; (* signature *) polyml-5.6/mlsource/extra/Motif/MotifCore.ML000066400000000000000000001151221265146633400210670ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Note that this module depends on the compiler's *representation* of exceptions; this is absolutely disgusting, completely unnecessary, and a source of inefficiency (all those Casts!). When I have some spare time, I'm going to cure this. SPF 6/12/94 *) structure MotifCore = struct local open XWindows; open XCall; open MotifTypes; open XmTypes; fun fromAlignment XmALIGNMENT_BEGINNING = 0 | fromAlignment XmALIGNMENT_CENTER = 1 | fromAlignment XmALIGNMENT_END = 2; fun toAlignment 0 = XmALIGNMENT_BEGINNING | toAlignment 1 = XmALIGNMENT_CENTER | toAlignment _ = XmALIGNMENT_END; fun fromArrowDirection XmARROW_UP = 0 | fromArrowDirection XmARROW_DOWN = 1 | fromArrowDirection XmARROW_LEFT = 2 | fromArrowDirection XmARROW_RIGHT = 3; fun toArrowDirection 0 = XmARROW_UP | toArrowDirection 1 = XmARROW_DOWN | toArrowDirection 2 = XmARROW_LEFT | toArrowDirection _ = XmARROW_RIGHT; fun fromAttachment XmATTACH_NONE = 0 | fromAttachment XmATTACH_FORM = 1 | fromAttachment XmATTACH_OPPOSITE_FORM = 2 | fromAttachment XmATTACH_WIDGET = 3 | fromAttachment XmATTACH_OPPOSITE_WIDGET = 4 | fromAttachment XmATTACH_POSITION = 5 | fromAttachment XmATTACH_SELF = 6; fun toAttachment 0 = XmATTACH_NONE | toAttachment 1 = XmATTACH_FORM | toAttachment 2 = XmATTACH_OPPOSITE_FORM | toAttachment 3 = XmATTACH_WIDGET | toAttachment 4 = XmATTACH_OPPOSITE_WIDGET | toAttachment 5 = XmATTACH_POSITION | toAttachment _ = XmATTACH_SELF; fun fromButtonType XmPUSHBUTTON = 1 | fromButtonType XmCHECKBUTTON = 2 | fromButtonType XmTOGGLEBUTTON = 2 (* same as XmCHECKBUTTON *) | fromButtonType XmRADIOBUTTON = 3 | fromButtonType XmCASCADEBUTTON = 4 | fromButtonType XmSEPARATOR = 5 | fromButtonType XmDOUBLE_SEPARATOR = 6 | fromButtonType XmTITLE = 7; fun toButtonType 1 = XmPUSHBUTTON | toButtonType 2 = XmCHECKBUTTON | toButtonType 3 = XmRADIOBUTTON | toButtonType 4 = XmCASCADEBUTTON | toButtonType 5 = XmSEPARATOR | toButtonType 6 = XmDOUBLE_SEPARATOR | toButtonType _ = XmTITLE; fun fromCommandWindowLocation XmCOMMAND_ABOVE_WORKSPACE = 0 | fromCommandWindowLocation XmCOMMAND_BELOW_WORKSPACE = 1; fun toCommandWindowLocation 0 = XmCOMMAND_ABOVE_WORKSPACE | toCommandWindowLocation _ = XmCOMMAND_BELOW_WORKSPACE; fun fromDefaultButtonType XmDIALOG_NONE = 0 | fromDefaultButtonType XmDIALOG_APPLY_BUTTON = 1 | fromDefaultButtonType XmDIALOG_CANCEL_BUTTON = 2 | fromDefaultButtonType XmDIALOG_DEFAULT_BUTTON = 3 | fromDefaultButtonType XmDIALOG_OK_BUTTON = 4 | fromDefaultButtonType XmDIALOG_FILTER_LABEL = 5 | fromDefaultButtonType XmDIALOG_FILTER_TEXT = 6 | fromDefaultButtonType XmDIALOG_HELP_BUTTON = 7 | fromDefaultButtonType XmDIALOG_LIST = 8 | fromDefaultButtonType XmDIALOG_LIST_LABEL = 9 | fromDefaultButtonType XmDIALOG_MESSAGE_LABEL = 10 | fromDefaultButtonType XmDIALOG_SELECTION_LABEL = 11 | fromDefaultButtonType XmDIALOG_SYMBOL_LABEL = 12 | fromDefaultButtonType XmDIALOG_TEXT = 13 | fromDefaultButtonType XmDIALOG_SEPARATOR = 14 | fromDefaultButtonType XmDIALOG_DIR_LIST = 15 | fromDefaultButtonType XmDIALOG_DIR_LIST_LABEL = 16; fun toDefaultButtonType 0 = XmDIALOG_NONE | toDefaultButtonType 1 = XmDIALOG_APPLY_BUTTON | toDefaultButtonType 2 = XmDIALOG_CANCEL_BUTTON | toDefaultButtonType 3 = XmDIALOG_DEFAULT_BUTTON | toDefaultButtonType 4 = XmDIALOG_OK_BUTTON | toDefaultButtonType 5 = XmDIALOG_FILTER_LABEL | toDefaultButtonType 6 = XmDIALOG_FILTER_TEXT | toDefaultButtonType 7 = XmDIALOG_HELP_BUTTON | toDefaultButtonType 8 = XmDIALOG_LIST | toDefaultButtonType 9 = XmDIALOG_LIST_LABEL | toDefaultButtonType 10 = XmDIALOG_MESSAGE_LABEL | toDefaultButtonType 11 = XmDIALOG_SELECTION_LABEL | toDefaultButtonType 12 = XmDIALOG_SYMBOL_LABEL | toDefaultButtonType 13 = XmDIALOG_TEXT | toDefaultButtonType 14 = XmDIALOG_SEPARATOR | toDefaultButtonType 15 = XmDIALOG_DIR_LIST | toDefaultButtonType _ = XmDIALOG_DIR_LIST_LABEL; fun fromDeleteResponse XmDESTROY = 0 | fromDeleteResponse XmUNMAP = 1 | fromDeleteResponse XmDO_NOTHING = 2; fun toDeleteResponse 0 = XmDESTROY | toDeleteResponse 1 = XmUNMAP | toDeleteResponse _ = XmDO_NOTHING; fun fromDialogStyle XmDIALOG_MODELESS = 0 | fromDialogStyle XmDIALOG_PRIMARY_APPLICATION_MODAL = 1 | fromDialogStyle XmDIALOG_FULL_APPLICATION_MODAL = 2 | fromDialogStyle XmDIALOG_SYSTEM_MODAL = 3; fun toDialogStyle 0 = XmDIALOG_MODELESS | toDialogStyle 1 = XmDIALOG_PRIMARY_APPLICATION_MODAL | toDialogStyle 2 = XmDIALOG_FULL_APPLICATION_MODAL | toDialogStyle _ = XmDIALOG_SYSTEM_MODAL; fun fromDialogType XmDIALOG_ERROR = 1 (* XmMessageBox values *) | fromDialogType XmDIALOG_INFORMATION = 2 | fromDialogType XmDIALOG_MESSAGE = 3 | fromDialogType XmDIALOG_QUESTION = 4 | fromDialogType XmDIALOG_WARNING = 5 | fromDialogType XmDIALOG_WORKING = 6 | fromDialogType XmDIALOG_WORK_AREA = 0 (* XmSelectionBox values *) | fromDialogType XmDIALOG_PROMPT = 1 | fromDialogType XmDIALOG_SELECTION = 2 | fromDialogType XmDIALOG_COMMAND = 3 | fromDialogType XmDIALOG_FILE_SELECTION = 4; fun toDialogType 0 = XmDIALOG_WORK_AREA | toDialogType 1 = XmDIALOG_ERROR | toDialogType 2 = XmDIALOG_INFORMATION | toDialogType 3 = XmDIALOG_MESSAGE | toDialogType 4 = XmDIALOG_QUESTION | toDialogType 5 = XmDIALOG_WARNING | toDialogType _ = XmDIALOG_WORKING; fun fromEditMode XmMULTI_LINE_EDIT = 0 | fromEditMode XmSINGLE_LINE_EDIT = 1; fun toEditMode 0 = XmMULTI_LINE_EDIT | toEditMode _ = XmSINGLE_LINE_EDIT; fun fromFileTypeMask XmFILE_REGULAR = 1 | fromFileTypeMask XmFILE_DIRECTORY = 2 | fromFileTypeMask XmFILE_ANY_TYPE = 3; fun toFileTypeMask 1 = XmFILE_REGULAR | toFileTypeMask 2 = XmFILE_DIRECTORY | toFileTypeMask _ = XmFILE_ANY_TYPE; fun fromIndicatorType XmN_OF_MANY = 1 | fromIndicatorType XmONE_OF_MANY = 2; fun toIndicatorType 1 = XmN_OF_MANY | toIndicatorType _ = XmONE_OF_MANY; fun fromKeyboardFocusPolicy XmEXPLICIT = 0 | fromKeyboardFocusPolicy XmPOINTER = 1; fun toKeyboardFocusPolicy 0 = XmEXPLICIT | toKeyboardFocusPolicy _ = XmPOINTER; fun fromLabelType XmPIXMAP = 1 | fromLabelType XmSTRING = 2; fun toLabelType 1 = XmPIXMAP | toLabelType _ = XmSTRING; fun fromMultiClick XmMULTICLICK_DISCARD = 0 | fromMultiClick XmMULTICLICK_KEEP = 1; fun toMultiClick 0 = XmMULTICLICK_DISCARD | toMultiClick _ = XmMULTICLICK_KEEP; fun fromNavigationType XmNONE = 0 | fromNavigationType XmTAB_GROUP = 1 | fromNavigationType XmSTICKY_TAB_GROUP = 2 | fromNavigationType XmEXCLUSIVE_TAB_GROUP = 3; fun toNavigationType 0 = XmNONE | toNavigationType 1 = XmTAB_GROUP | toNavigationType 2 = XmSTICKY_TAB_GROUP | toNavigationType _ = XmEXCLUSIVE_TAB_GROUP; fun fromOrientation XmVERTICAL = 1 | fromOrientation XmHORIZONTAL = 2; fun toOrientation 1 = XmVERTICAL | toOrientation _ = XmHORIZONTAL; fun fromResizePolicy XmRESIZE_NONE = 0 | fromResizePolicy XmRESIZE_GROW = 1 | fromResizePolicy XmRESIZE_ANY = 2; fun toResizePolicy 0 = XmRESIZE_NONE | toResizePolicy 1 = XmRESIZE_GROW | toResizePolicy _ = XmRESIZE_ANY; fun fromRowColumnType XmWORK_AREA = 0 | fromRowColumnType XmMENU_BAR = 1 | fromRowColumnType XmMENU_PULLDOWN = 2 | fromRowColumnType XmMENU_POPUP = 3 | fromRowColumnType XmMENU_OPTION = 4; fun toRowColumnType 0 = XmWORK_AREA | toRowColumnType 1 = XmMENU_BAR | toRowColumnType 2 = XmMENU_PULLDOWN | toRowColumnType 3 = XmMENU_POPUP | toRowColumnType _ = XmMENU_OPTION; fun fromPacking XmPACK_TIGHT = 1 | fromPacking XmPACK_COLUMN = 2 | fromPacking XmPACK_NONE = 3; fun toPacking 1 = XmPACK_TIGHT | toPacking 2 = XmPACK_COLUMN | toPacking _ = XmPACK_NONE; fun fromProcessingDirection XmMAX_ON_TOP = 0 | fromProcessingDirection XmMAX_ON_BOTTOM = 1 | fromProcessingDirection XmMAX_ON_LEFT = 2 | fromProcessingDirection XmMAX_ON_RIGHT = 3; fun toProcessingDirection 0 = XmMAX_ON_TOP | toProcessingDirection 1 = XmMAX_ON_BOTTOM | toProcessingDirection 2 = XmMAX_ON_LEFT | toProcessingDirection _ = XmMAX_ON_RIGHT; fun fromScrollBarDisplayPolicy XmSTATIC = 0 | fromScrollBarDisplayPolicy XmAS_NEEDED = 1; fun toScrollBarDisplayPolicy 0 = XmSTATIC | toScrollBarDisplayPolicy _ = XmAS_NEEDED; fun fromScrollBarPlacement XmBOTTOM_RIGHT = 0 | fromScrollBarPlacement XmTOP_RIGHT = 1 | fromScrollBarPlacement XmBOTTOM_LEFT = 2 | fromScrollBarPlacement XmTOP_LEFT = 3; fun toScrollBarPlacement 0 = XmBOTTOM_RIGHT | toScrollBarPlacement 1 = XmTOP_RIGHT | toScrollBarPlacement 2 = XmBOTTOM_LEFT | toScrollBarPlacement _ = XmTOP_LEFT; fun fromScrollingPolicy XmAUTOMATIC = 0 | fromScrollingPolicy XmAPPLICATION_DEFINED = 1; fun toScrollingPolicy 0 = XmAUTOMATIC | toScrollingPolicy _ = XmAPPLICATION_DEFINED; fun fromSelectionPolicy XmSINGLE_SELECT = 0 | fromSelectionPolicy XmMULTIPLE_SELECT = 1 | fromSelectionPolicy XmEXTENDED_SELECT = 2 | fromSelectionPolicy XmBROWSE_SELECT = 3; fun toSelectionPolicy 0 = XmSINGLE_SELECT | toSelectionPolicy 1 = XmMULTIPLE_SELECT | toSelectionPolicy 2 = XmEXTENDED_SELECT | toSelectionPolicy _ = XmBROWSE_SELECT; fun fromShadowType XmNO_LINE = 0 | fromShadowType XmSINGLE_LINE = 1 | fromShadowType XmDOUBLE_LINE = 2 | fromShadowType XmSINGLE_DASHED_LINE = 3 | fromShadowType XmDOUBLE_DASHED_LINE = 4 | fromShadowType XmSHADOW_ETCHED_IN = 5 | fromShadowType XmSHADOW_ETCHED_OUT = 6 | fromShadowType XmSHADOW_IN = 7 | fromShadowType XmSHADOW_OUT = 8; fun toShadowType 0 = XmNO_LINE | toShadowType 1 = XmSINGLE_LINE | toShadowType 2 = XmDOUBLE_LINE | toShadowType 3 = XmSINGLE_DASHED_LINE | toShadowType 4 = XmDOUBLE_DASHED_LINE | toShadowType 5 = XmSHADOW_ETCHED_IN | toShadowType 6 = XmSHADOW_ETCHED_OUT | toShadowType 7 = XmSHADOW_IN | toShadowType _ = XmSHADOW_OUT; fun fromStringDirection XmSTRING_DIRECTION_L_TO_R = 0 | fromStringDirection XmSTRING_DIRECTION_R_TO_L = 1 | fromStringDirection XmSTRING_DIRECTION_DEFAULT = 255; fun toStringDirection 0 = XmSTRING_DIRECTION_L_TO_R | toStringDirection 1 = XmSTRING_DIRECTION_R_TO_L | toStringDirection _ = XmSTRING_DIRECTION_DEFAULT; fun fromTextScanType XmSELECT_POSITION = 0 | fromTextScanType XmSELECT_WHITESPACE = 1 | fromTextScanType XmSELECT_WORD = 2 | fromTextScanType XmSELECT_LINE = 3 | fromTextScanType XmSELECT_ALL = 4 | fromTextScanType XmSELECT_PARAGRAPH = 5; fun toTextScanType 0 = XmSELECT_POSITION | toTextScanType 1 = XmSELECT_WHITESPACE | toTextScanType 2 = XmSELECT_WORD | toTextScanType 3 = XmSELECT_LINE | toTextScanType 4 = XmSELECT_ALL | toTextScanType _ = XmSELECT_PARAGRAPH; fun fromUnitType XmPIXELS = 0 | fromUnitType Xm100TH_MILLIMETERS = 1 | fromUnitType Xm1000TH_INCHES = 2 | fromUnitType Xm100TH_POINTS = 3 | fromUnitType Xm100TH_FONT_UNITS = 4; fun toUnitType 0 = XmPIXELS | toUnitType 1 = Xm100TH_MILLIMETERS | toUnitType 2 = Xm1000TH_INCHES | toUnitType 3 = Xm100TH_POINTS | toUnitType _ = Xm100TH_FONT_UNITS; fun fromVisualPolicy XmVARIABLE = 0 | fromVisualPolicy XmCONSTANT = 1 | fromVisualPolicy XmRESIZE_IF_POSSIBLE = 2; fun toVisualPolicy 0 = XmVARIABLE | toVisualPolicy 1 = XmCONSTANT | toVisualPolicy _ = XmRESIZE_IF_POSSIBLE; fun fromXWMStateHint DontCareState = 0 | fromXWMStateHint NormalState = 1 | fromXWMStateHint ZoomState = 2 | fromXWMStateHint IconicState = 3 | fromXWMStateHint InactiveState = 4; fun toXWMStateHint 0 = DontCareState | toXWMStateHint 1 = NormalState | toXWMStateHint 2 = ZoomState | toXWMStateHint 3 = IconicState | toXWMStateHint _ = InactiveState; (* When this datatype changes the runtime system must change as well. *) (* I've removed this and replaced it simply by a tuple but making the tuple represent the values in the same way. That makes the interface independent of the way datatypes are represented. Note: the old representation of datatypes put the tag in the second word. DCJM 27/3/01. *) (* datatype CType = CAccelerators of XtAccelerators | CBool of bool (* typedef char Boolean *) | CColormap of Colormap | CCursor of Cursor | CDimension of int (* typedef unsigned short Dimension *) | CFontList of (XFontStruct * string) list | CInt of int | CIntTable of int list | CKeySym of int (* typedef unsigned int KeySym *) | CPixmap of Drawable | CPosition of int (* typedef short Position *) | CString of string | CStringTable of string list | CTrans of XtTranslations | CUnsignedChar of int | CUnsignedTable of int list (* typedef uchar * *) | CVisual of Visual | CWidget of Widget | CWidgetList of Widget list | CXmString of string | CXmStringTable of string list; *) val cAccelerators = 1 and cBool = 2 and cColormap = 3 and cCursor = 4 and cDimension = 5 and cFontList = 6 and cInt = 7 and cIntTable = 8 and cKeySym = 9 and cPixmap = 10 and cPosition = 11 and cString = 12 and cStringTable = 13 and cTrans = 14 and cUnsignedChar = 15 and cUnsignedTable = 16 and cVisual = 17 and cWidget = 18 and cWidgetList = 19 and cXmString = 20 and cXmStringTable = 21 fun I x = x; (* This version can be inlined for greater efficiency. SPF 1/6/95 *) val Cast : 'a -> 'b = RunCall.unsafeCast; val toInt : 'a -> int = Cast (* we could make this any type. *) fun CType (XmRAcceleratorTable a) = (toInt a, cAccelerators) | CType (XmRAlignment a) = (fromAlignment a, cUnsignedChar) | CType (XmRArrowDirection a) = (fromArrowDirection a, cUnsignedChar) | CType (XmRAtom i) = (i, cKeySym) (* Atom = unsigned = KeySym *) | CType (XmRAttachment a) = (fromAttachment a, cUnsignedChar) | CType (XmRBool b) = (toInt b, cBool) | CType (XmRButtonTypeTable L) = (toInt(map fromButtonType L), cUnsignedTable) | CType (XmRCardinal i) = (i, cKeySym) (* Cardinal = unsigned = KeySym *) | CType (XmRColormap c) = (toInt c, cColormap) | CType (XmRCommandWindowLocation t) = (fromCommandWindowLocation t, cUnsignedChar) | CType (XmRCursor c) = (toInt c, cCursor) | CType (XmRDefaultButtonType e) = (fromDefaultButtonType e, cInt) | CType (XmRDeleteResponse e) = (fromDeleteResponse e, cInt) | CType (XmRDialogStyle e) = (fromDialogStyle e, cInt) | CType (XmRDialogType e) = (fromDialogType e, cUnsignedChar) | CType (XmRDimension d) = (d, cDimension) | CType (XmREditMode e) = (fromEditMode e, cInt) | CType (XmRFileTypeMask m) = (fromFileTypeMask m, cUnsignedChar) | CType (XmRFontList L) = (toInt L, cFontList) | CType (XmRIndicatorType t) = (fromIndicatorType t, cUnsignedChar) | CType (XmRInitialState i) = (fromXWMStateHint i, cInt) | CType (XmRInt i) = (i, cInt) | CType (XmRKeySym k) = (k, cKeySym) | CType (XmRKeySymTable k) = (toInt k, cIntTable) | CType (XmRKeyboardFocusPolicy t) = (fromKeyboardFocusPolicy t, cUnsignedChar) | CType (XmRLabelType t) = (fromLabelType t, cUnsignedChar) | CType (XmRMultiClick t) = (fromMultiClick t, cUnsignedChar) | CType (XmRNavigationType t) = (fromNavigationType t, cUnsignedChar) | CType (XmROrientation r) = (fromOrientation r, cUnsignedChar) | CType (XmRPacking p) = (fromPacking p, cUnsignedChar) | CType (XmRProcessingDirection p) = (fromProcessingDirection p, cUnsignedChar) | CType (XmRResizePolicy p) = (fromResizePolicy p, cUnsignedChar) | CType (XmRRowColumnType p) = (fromRowColumnType p, cUnsignedChar) | CType (XmRPixel p) = (p, cInt) | CType (XmRPixmap p) = (toInt p, cPixmap) | CType (XmRPosition p) = (p, cPosition) | CType (XmRScrollBarDisplayPolicy p) = (fromScrollBarDisplayPolicy p, cUnsignedChar) | CType (XmRScrollBarPlacement p) = (fromScrollBarPlacement p, cUnsignedChar) | CType (XmRScrollingPolicy p) = (fromScrollingPolicy p, cUnsignedChar) | CType (XmRSelectionPolicy p) = (fromSelectionPolicy p, cUnsignedChar) | CType (XmRShadowType t) = (fromShadowType t, cUnsignedChar) | CType (XmRShort i) = (i, cPosition) (* Position = short *) | CType (XmRStringDirection t) = (fromStringDirection t, cUnsignedChar) | CType (XmRString s) = (toInt s, cString) | CType (XmRStringTable s) = (toInt s, cStringTable) | CType (XmRTextScanTypeTable L) = (toInt(map fromTextScanType L), cIntTable) | CType (XmRTranslationTable t) = (toInt t, cTrans) | CType (XmRUnitType t) = (fromUnitType t, cUnsignedChar) | CType (XmRVisual v) = (toInt v, cVisual) | CType (XmRVisualPolicy p) = (fromVisualPolicy p, cUnsignedChar) | CType (XmRWidget w) = (toInt w, cWidget) | CType (XmRWidgetList L) = (toInt L, cWidgetList) | CType (XmRXmString s) = (toInt s, cXmString) | CType (XmRXmStringTable t) = (toInt t, cXmStringTable); fun Convert (XmRAcceleratorTable _) = I | Convert (XmRAlignment _) = Cast toAlignment | Convert (XmRArrowDirection _) = Cast toArrowDirection | Convert (XmRAtom _) = I | Convert (XmRAttachment _) = Cast toAttachment | Convert (XmRBool _) = I | Convert (XmRButtonTypeTable _) = Cast (map toButtonType) | Convert (XmRCardinal _) = I | Convert (XmRColormap _) = I | Convert (XmRCommandWindowLocation _) = Cast toCommandWindowLocation | Convert (XmRCursor _) = I | Convert (XmRDefaultButtonType _) = Cast toDefaultButtonType | Convert (XmRDeleteResponse _) = Cast toDeleteResponse | Convert (XmRDialogStyle _) = Cast toDialogStyle | Convert (XmRDialogType _) = Cast toDialogType | Convert (XmRDimension _) = I | Convert (XmREditMode _) = Cast toEditMode | Convert (XmRFileTypeMask _) = Cast toFileTypeMask | Convert (XmRFontList _) = I | Convert (XmRIndicatorType _) = Cast toIndicatorType | Convert (XmRInitialState _) = Cast toXWMStateHint | Convert (XmRInt _) = I | Convert (XmRKeySym _) = I | Convert (XmRKeySymTable _) = I | Convert (XmRKeyboardFocusPolicy _) = Cast toKeyboardFocusPolicy | Convert (XmRLabelType _) = Cast toLabelType | Convert (XmRMultiClick _) = Cast toMultiClick | Convert (XmRNavigationType _) = Cast toNavigationType | Convert (XmROrientation _) = Cast toOrientation | Convert (XmRPacking _) = Cast toPacking | Convert (XmRProcessingDirection _) = Cast toProcessingDirection | Convert (XmRResizePolicy _) = Cast toResizePolicy | Convert (XmRRowColumnType _) = Cast toRowColumnType | Convert (XmRPixel _) = I | Convert (XmRPixmap _) = I | Convert (XmRPosition _) = I | Convert (XmRScrollBarDisplayPolicy _) = Cast toScrollBarDisplayPolicy | Convert (XmRScrollBarPlacement _) = Cast toScrollBarPlacement | Convert (XmRScrollingPolicy _) = Cast toScrollingPolicy | Convert (XmRSelectionPolicy _) = Cast toSelectionPolicy | Convert (XmRShadowType _) = Cast toShadowType | Convert (XmRShort _) = I | Convert (XmRStringDirection _) = Cast toStringDirection | Convert (XmRString _) = I | Convert (XmRStringTable _) = I | Convert (XmRTextScanTypeTable _) = Cast (map toTextScanType) | Convert (XmRTranslationTable _) = I | Convert (XmRUnitType _) = Cast toUnitType | Convert (XmRVisual _) = I | Convert (XmRVisualPolicy _) = Cast toVisualPolicy | Convert (XmRWidget _) = I | Convert (XmRWidgetList _) = I | Convert (XmRXmString _) = I | Convert (XmRXmStringTable _) = I; fun RName (XmRAcceleratorTable _) = "AcceleratorTable" | RName (XmRAlignment _) = "Alignment" | RName (XmRArrowDirection _) = "ArrowDirection" | RName (XmRAtom _) = "Atom" | RName (XmRAttachment _) = "Attachment" | RName (XmRBool _) = "Bool" | RName (XmRButtonTypeTable _) = "ButtonTypeTable" | RName (XmRCardinal _) = "Cardinal" | RName (XmRColormap _) = "Colormap" | RName (XmRCommandWindowLocation _) = "CommandWindowLocation" | RName (XmRCursor _) = "Cursor" | RName (XmRDefaultButtonType _) = "DefaultButtonType" | RName (XmRDeleteResponse _) = "DeleteResponse" | RName (XmRDialogStyle _) = "DialogStyle" | RName (XmRDialogType _) = "DialogType" | RName (XmRDimension _) = "Dimension" | RName (XmREditMode _) = "EditMode" | RName (XmRFileTypeMask _) = "FileTypeMask" | RName (XmRFontList _) = "FontList" | RName (XmRIndicatorType _) = "IndicatorType" | RName (XmRInitialState _) = "InitialState" | RName (XmRInt _) = "Int" | RName (XmRKeySym _) = "KeySym" | RName (XmRKeySymTable _) = "KeySymTable" | RName (XmRKeyboardFocusPolicy _) = "KeyboardFocusPolicy" | RName (XmRLabelType _) = "LabelType" | RName (XmRMultiClick _) = "MultiClick" | RName (XmRNavigationType _) = "NavigationType" | RName (XmROrientation _) = "Orientation" | RName (XmRPacking _) = "Packing" | RName (XmRProcessingDirection _) = "ProcessingDirection" | RName (XmRResizePolicy _) = "ResizePolicy" | RName (XmRRowColumnType _) = "RowColumnType" | RName (XmRPixel _) = "Pixel" | RName (XmRPixmap _) = "Pixmap" | RName (XmRPosition _) = "Position" | RName (XmRScrollBarDisplayPolicy _) = "ScrollBarDisplayPolicy" | RName (XmRScrollBarPlacement _) = "ScrollBarPlacement" | RName (XmRScrollingPolicy _) = "ScrollingPolicy" | RName (XmRSelectionPolicy _) = "SelectionPolicy" | RName (XmRShadowType _) = "ShadowType" | RName (XmRShort _) = "Short" | RName (XmRStringDirection _) = "StringDirection" | RName (XmRString _) = "String" | RName (XmRStringTable _) = "StringTable" | RName (XmRTextScanTypeTable _) = "TextScanTypeTable" | RName (XmRTranslationTable _) = "TranslationTable" | RName (XmRUnitType _) = "UnitType" | RName (XmRVisual _) = "Visual" | RName (XmRVisualPolicy _) = "VisualPolicy" | RName (XmRWidget _) = "Widget" | RName (XmRWidgetList _) = "WidgetList" | RName (XmRXmString _) = "XmString" | RName (XmRXmStringTable _) = "XmStringTable"; (* Added this function to remove the dependency on datatype representation. DCJM 28/3/01. *) fun insertValue (XmRAcceleratorTable _) v = XmRAcceleratorTable (Cast v) | insertValue (XmRAlignment _) v = XmRAlignment (Cast v) | insertValue (XmRArrowDirection _) v = XmRArrowDirection (Cast v) | insertValue (XmRAtom _) v = XmRAtom (Cast v) | insertValue (XmRAttachment _) v = XmRAttachment (Cast v) | insertValue (XmRBool _) v = XmRBool (Cast v) | insertValue (XmRButtonTypeTable _) v = XmRButtonTypeTable (Cast v) | insertValue (XmRCardinal _) v = XmRCardinal (Cast v) | insertValue (XmRColormap _) v = XmRColormap (Cast v) | insertValue (XmRCommandWindowLocation _) v = XmRCommandWindowLocation (Cast v) | insertValue (XmRCursor _) v = XmRCursor (Cast v) | insertValue (XmRDefaultButtonType _) v = XmRDefaultButtonType (Cast v) | insertValue (XmRDeleteResponse _) v = XmRDeleteResponse (Cast v) | insertValue (XmRDialogStyle _) v = XmRDialogStyle (Cast v) | insertValue (XmRDialogType _) v = XmRDialogType (Cast v) | insertValue (XmRDimension _) v = XmRDimension (Cast v) | insertValue (XmREditMode _) v = XmREditMode (Cast v) | insertValue (XmRFileTypeMask _) v = XmRFileTypeMask (Cast v) | insertValue (XmRFontList _) v = XmRFontList (Cast v) | insertValue (XmRIndicatorType _) v = XmRIndicatorType (Cast v) | insertValue (XmRInitialState _) v = XmRInitialState (Cast v) | insertValue (XmRInt _) v = XmRInt (Cast v) | insertValue (XmRKeySym _) v = XmRKeySym (Cast v) | insertValue (XmRKeySymTable _) v = XmRKeySymTable (Cast v) | insertValue (XmRKeyboardFocusPolicy _) v = XmRKeyboardFocusPolicy (Cast v) | insertValue (XmRLabelType _) v = XmRLabelType (Cast v) | insertValue (XmRMultiClick _) v = XmRMultiClick (Cast v) | insertValue (XmRNavigationType _) v = XmRNavigationType (Cast v) | insertValue (XmROrientation _) v = XmROrientation (Cast v) | insertValue (XmRPacking _) v = XmRPacking (Cast v) | insertValue (XmRProcessingDirection _) v = XmRProcessingDirection (Cast v) | insertValue (XmRResizePolicy _) v = XmRResizePolicy (Cast v) | insertValue (XmRRowColumnType _) v = XmRRowColumnType (Cast v) | insertValue (XmRPixel _) v = XmRPixel (Cast v) | insertValue (XmRPixmap _) v = XmRPixmap (Cast v) | insertValue (XmRPosition _) v = XmRPosition (Cast v) | insertValue (XmRScrollBarDisplayPolicy _) v = XmRScrollBarDisplayPolicy (Cast v) | insertValue (XmRScrollBarPlacement _) v = XmRScrollBarPlacement (Cast v) | insertValue (XmRScrollingPolicy _) v = XmRScrollingPolicy (Cast v) | insertValue (XmRSelectionPolicy _) v = XmRSelectionPolicy (Cast v) | insertValue (XmRShadowType _) v = XmRShadowType (Cast v) | insertValue (XmRShort _) v = XmRShort (Cast v) | insertValue (XmRStringDirection _) v = XmRStringDirection (Cast v) | insertValue (XmRString _) v = XmRString (Cast v) | insertValue (XmRStringTable _) v = XmRStringTable (Cast v) | insertValue (XmRTextScanTypeTable _) v = XmRTextScanTypeTable (Cast v) | insertValue (XmRTranslationTable _) v = XmRTranslationTable (Cast v) | insertValue (XmRUnitType _) v = XmRUnitType (Cast v) | insertValue (XmRVisual _) v = XmRVisual (Cast v) | insertValue (XmRVisualPolicy _) v = XmRVisualPolicy (Cast v) | insertValue (XmRWidget _) v = XmRWidget (Cast v) | insertValue (XmRWidgetList _) v = XmRWidgetList( Cast v) | insertValue (XmRXmString _) v = XmRXmString (Cast v) | insertValue (XmRXmStringTable _) v = XmRXmStringTable (Cast v); datatype Exn = EXN of unit ref * string * unit; val argTable = ref ([]:(Exn * string * XmRType) list); val Exn: Arg -> Exn = Cast; val Arg: Exn -> Arg = Cast; fun ArgName (e:Arg) = let (* open System; *) fun substring s i n = String.substring(s, i-1, n) val EXN (_,s,_) = Exn e; val n = size s; in if n < 3 orelse substring s 1 3 <> "XmN" then raise XWindows (s ^ " does not start with XmN") else substring s 4 (n - 3) end; fun FindByExn (e:Arg) = let val EXN (r1,n,value) = Exn e; (* This bit of code assumes that XmRType values are pairs with the tag in the second word and the value in the first. That's no longer correct. I've replaced it with the insertValue function above. DCJM 28/3/01. *) (*fun InsertValue (r:XmRType) = let val (_,tag) = Cast r; in Cast (value,tag):XmRType end;*) fun InsertValue (r:XmRType) = insertValue r value fun Find [] = raise XWindows (n ^ " has not been registered") | Find (H::T) = let val (EXN (r2,_,_),s,r) = H; in if r1 = r2 then (s,InsertValue r) else Find T end; in Find (!argTable) end; fun FindByString s = let fun Find [] = raise XWindows (s ^ " has not been registered.") | Find (H::T) = let val (_,t,_) = H; in if s = t then H else Find T end; in Find (!argTable) end; fun Length L = let fun Count [] n = n | Count (_::T) n = Count T (n+1); in Count L 0 end; in (*type CType = CType;*) val fromDefaultButtonType = fromDefaultButtonType; fun XtSetExnVals [] = [] | XtSetExnVals (H::T) = let val (s,r) = FindByExn H; val A = (s,CType r); in case H of XmNargv L => A :: XtSetExnVals (XmNargc (Length L) :: T) | XmNbuttonAccelerators L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNbuttonAcceleratorText L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNbuttonMnemonicCharSets L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNbuttonMnemonics L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNbuttons L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNbuttonType L => A :: XtSetExnVals (XmNbuttonCount (Length L) :: T) | XmNchildren L => A :: XtSetExnVals (XmNnumChildren (Length L) :: T) | XmNdirListItems L => A :: XtSetExnVals (XmNdirListItemCount (Length L) :: T) | XmNfileListItems L => A :: XtSetExnVals (XmNfileListItemCount (Length L) :: T) | XmNhistoryItems L => A :: XtSetExnVals (XmNhistoryItemCount (Length L) :: T) | XmNitems L => A :: XtSetExnVals (XmNitemCount (Length L) :: T) | XmNlistItems L => A :: XtSetExnVals (XmNlistItemCount (Length L) :: T) | XmNselectedItems L => A :: XtSetExnVals (XmNselectedItemCount (Length L) :: T) | XmNselectionArray L => A :: XtSetExnVals (XmNselectionArrayCount (Length L) :: T) | _ => A :: XtSetExnVals T end; fun XtSetExceptionType (E:'a -> Arg) (R:'a -> XmRType) = let val a:'a = Cast 0; val e = E a; val r = R a; in argTable := (Exn e,ArgName e,r) :: !argTable end; fun XtGetValue (w:Widget) (s:string):Arg = let val (EXN (u,n,_),_,r) = FindByString s; in Arg (EXN (u,n,Convert r (xcall (XCALL_GetValue,w,(s,CType r))))) end; local fun GetExns [] R C = (R,C) | GetExns ((s,c,d)::T) R C = let val (EXN (u,n,_),_,r) = FindByString s; val convert = Convert r; fun MakeExn v = Arg (EXN (u,n,convert v)); in GetExns T ((s,CType r,c,RName r,RName d,CType d) :: R) (MakeExn :: C) end; fun Zip [] _ acc = acc | Zip _ [] acc = acc | Zip (v::V) (c::C) acc = Zip V C (c v :: acc) in fun XtGetSubresources (w:Widget) (name:string) (class:string) (L:(string * string * XmRType) list):Arg list = let val (R,C) = GetExns L [] []; val V = xcall (XCALL_GetSubresources,w,name,class,R) in Zip V C [] end; fun XtGetApplicationResources (w:Widget) (L:(string * string * XmRType) list):Arg list = let val (R,C) = GetExns L [] [] ; val V = xcall (XCALL_XtGetApplicationResources,w,R) in Zip V C [] end ; end; local (* These have been copied over from the XWindows module. *) infix 9 Or; fun a Or b = xcall (12,a:int,b:int):int ; fun fromEventMask list = let fun MaskBit KeyPressMask = 1 | MaskBit KeyReleaseMask = 2 | MaskBit ButtonPressMask = 4 | MaskBit ButtonReleaseMask = 8 | MaskBit EnterWindowMask = 16 | MaskBit LeaveWindowMask = 32 | MaskBit PointerMotionMask = 64 | MaskBit PointerMotionHintMask = 128 | MaskBit Button1MotionMask = 256 | MaskBit Button2MotionMask = 512 | MaskBit Button3MotionMask = 1024 | MaskBit Button4MotionMask = 2048 | MaskBit Button5MotionMask = 4096 | MaskBit ButtonMotionMask = 8192 | MaskBit KeymapStateMask = 16384 | MaskBit ExposureMask = 32768 | MaskBit VisibilityChangeMask = 65536 | MaskBit StructureNotifyMask = 131072 | MaskBit ResizeRedirectMask = 262144 | MaskBit SubstructureNotifyMask = 524288 | MaskBit SubstructureRedirectMask = 1048576 | MaskBit FocusChangeMask = 2097152 | MaskBit PropertyChangeMask = 4194304 | MaskBit ColormapChangeMask = 8388608 | MaskBit OwnerGrabButtonMask = 16777216 | MaskBit ButtonClickMask = 2147483648 Or MaskBit ButtonPressMask Or MaskBit ButtonReleaseMask (* extra event mask *) ; fun OrTogether [] acc = acc | OrTogether (H::T) acc = OrTogether T (MaskBit H Or acc) ; in OrTogether list 0 end in fun XtAddEventHandler (w: Widget) (ev: EventMask list) (nonmaskable: bool) (handler: Widget * 'a XEvent -> unit) : unit = xcall(XCALL_XtAddEventHandler, w, fromEventMask ev, nonmaskable, handler) end end (* local *); end (* struct *); polyml-5.6/mlsource/extra/Motif/MotifTypes.ML000066400000000000000000000326721265146633400213130ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure MotifTypes = struct structure XWINDOWS = XWindows ; local open XWindows ; in abstype Widget = Widget of int with end ; abstype XtAccelerators = XtAccelerators of int with end ; abstype XtTranslations = XtTranslations of int with end ; type XmString = string ; datatype XmAlignment = XmALIGNMENT_BEGINNING | XmALIGNMENT_CENTER | XmALIGNMENT_END ; datatype XmArrowDirection = XmARROW_UP | XmARROW_DOWN | XmARROW_LEFT | XmARROW_RIGHT ; datatype XmAttachment = XmATTACH_NONE | XmATTACH_FORM | XmATTACH_OPPOSITE_FORM | XmATTACH_WIDGET | XmATTACH_OPPOSITE_WIDGET | XmATTACH_POSITION | XmATTACH_SELF ; datatype XmButtonType = XmPUSHBUTTON | XmCHECKBUTTON | XmTOGGLEBUTTON | XmRADIOBUTTON | XmCASCADEBUTTON | XmSEPARATOR | XmDOUBLE_SEPARATOR | XmTITLE ; datatype XmCommandWindowLocation = XmCOMMAND_ABOVE_WORKSPACE | XmCOMMAND_BELOW_WORKSPACE ; datatype XmDefaultButtonType = XmDIALOG_NONE | XmDIALOG_APPLY_BUTTON | XmDIALOG_CANCEL_BUTTON | XmDIALOG_DEFAULT_BUTTON | XmDIALOG_OK_BUTTON | XmDIALOG_FILTER_LABEL | XmDIALOG_FILTER_TEXT | XmDIALOG_HELP_BUTTON | XmDIALOG_LIST | XmDIALOG_LIST_LABEL | XmDIALOG_MESSAGE_LABEL | XmDIALOG_SELECTION_LABEL | XmDIALOG_SYMBOL_LABEL | XmDIALOG_TEXT | XmDIALOG_SEPARATOR | XmDIALOG_DIR_LIST | XmDIALOG_DIR_LIST_LABEL (* | XmDIALOG_COMMAND_TEXT = XmDIALOG_TEXT | XmDIALOG_VALUE_TEXT = XmDIALOG_TEXT | XmDIALOG_PROMPT_LABEL = XmDIALOG_SELECTION_LABEL | XmDIALOG_HISTORY_LIST = XmDIALOG_LIST | XmDIALOG_FILE_LIST = XmDIALOG_LIST | XmDIALOG_FILE_LIST_LABEL = XmDIALOG_LIST_LABEL *) ; val XmDIALOG_COMMAND_TEXT = XmDIALOG_TEXT ; val XmDIALOG_VALUE_TEXT = XmDIALOG_TEXT ; val XmDIALOG_PROMPT_LABEL = XmDIALOG_SELECTION_LABEL ; val XmDIALOG_HISTORY_LIST = XmDIALOG_LIST ; val XmDIALOG_FILE_LIST = XmDIALOG_LIST ; val XmDIALOG_FILE_LIST_LABEL = XmDIALOG_LIST_LABEL ; datatype XmDeleteResponse = XmDESTROY | XmUNMAP | XmDO_NOTHING ; datatype XmDialogStyle = XmDIALOG_MODELESS | XmDIALOG_PRIMARY_APPLICATION_MODAL | XmDIALOG_FULL_APPLICATION_MODAL | XmDIALOG_SYSTEM_MODAL (* | XmDIALOG_APPLICATION_MODAL *) ; val XmDIALOG_APPLICATION_MODAL = XmDIALOG_PRIMARY_APPLICATION_MODAL ; datatype XmDialogType = XmDIALOG_ERROR | XmDIALOG_INFORMATION | XmDIALOG_MESSAGE | XmDIALOG_QUESTION | XmDIALOG_WARNING | XmDIALOG_WORKING | XmDIALOG_WORK_AREA | XmDIALOG_PROMPT | XmDIALOG_SELECTION | XmDIALOG_COMMAND | XmDIALOG_FILE_SELECTION ; datatype XmEditMode = XmMULTI_LINE_EDIT | XmSINGLE_LINE_EDIT ; datatype XmFileTypeMask = XmFILE_REGULAR | XmFILE_DIRECTORY | XmFILE_ANY_TYPE ; datatype XmIndicatorType = XmN_OF_MANY | XmONE_OF_MANY ; datatype XmKeyboardFocusPolicy = XmEXPLICIT | XmPOINTER ; datatype XmLabelType = XmPIXMAP | XmSTRING ; datatype XmMultiClickType = XmMULTICLICK_DISCARD | XmMULTICLICK_KEEP ; datatype XmNavigationType = XmNONE | XmTAB_GROUP | XmSTICKY_TAB_GROUP | XmEXCLUSIVE_TAB_GROUP ; datatype XmOrientation = XmVERTICAL | XmHORIZONTAL ; datatype XmPacking = XmPACK_TIGHT | XmPACK_COLUMN | XmPACK_NONE ; datatype XmProcessingDirection = XmMAX_ON_TOP | XmMAX_ON_BOTTOM | XmMAX_ON_LEFT | XmMAX_ON_RIGHT ; datatype XmResizePolicy = XmRESIZE_NONE | XmRESIZE_ANY | XmRESIZE_GROW ; datatype XmRowColumnType = XmWORK_AREA | XmMENU_BAR | XmMENU_PULLDOWN | XmMENU_POPUP | XmMENU_OPTION ; datatype XmScrollBarDisplayPolicy = XmSTATIC | XmAS_NEEDED ; datatype XmScrollBarPlacement = XmBOTTOM_RIGHT | XmTOP_RIGHT | XmBOTTOM_LEFT | XmTOP_LEFT ; datatype XmScrollingPolicy = XmAUTOMATIC | XmAPPLICATION_DEFINED ; datatype XmSelectionPolicy = XmSINGLE_SELECT | XmMULTIPLE_SELECT | XmEXTENDED_SELECT | XmBROWSE_SELECT ; datatype XmShadowType = XmNO_LINE | XmSINGLE_LINE | XmDOUBLE_LINE | XmSINGLE_DASHED_LINE | XmDOUBLE_DASHED_LINE | XmSHADOW_ETCHED_IN | XmSHADOW_ETCHED_OUT | XmSHADOW_IN | XmSHADOW_OUT ; datatype XmStringDirection = XmSTRING_DIRECTION_L_TO_R | XmSTRING_DIRECTION_R_TO_L | XmSTRING_DIRECTION_DEFAULT ; datatype XmTextScanType = XmSELECT_POSITION | XmSELECT_WHITESPACE | XmSELECT_WORD | XmSELECT_LINE | XmSELECT_ALL | XmSELECT_PARAGRAPH ; datatype XmUnitType = XmPIXELS | Xm100TH_MILLIMETERS | Xm1000TH_INCHES | Xm100TH_POINTS | Xm100TH_FONT_UNITS ; datatype XmVisualPolicy = XmVARIABLE | XmCONSTANT | XmRESIZE_IF_POSSIBLE ; type Arg = exn ; datatype XmRType = XmRAcceleratorTable of XtAccelerators | XmRAlignment of XmAlignment | XmRArrowDirection of XmArrowDirection | XmRAtom of int | XmRAttachment of XmAttachment | XmRBool of bool | XmRButtonTypeTable of XmButtonType list | XmRCardinal of int | XmRColormap of Colormap | XmRCommandWindowLocation of XmCommandWindowLocation | XmRCursor of Cursor | XmRDefaultButtonType of XmDefaultButtonType | XmRDeleteResponse of XmDeleteResponse | XmRDialogStyle of XmDialogStyle | XmRDialogType of XmDialogType | XmRDimension of int | XmREditMode of XmEditMode | XmRFileTypeMask of XmFileTypeMask | XmRFontList of (XFontStruct * string) list | XmRIndicatorType of XmIndicatorType | XmRInitialState of XWMStateHint | XmRInt of int | XmRKeySym of int | XmRKeySymTable of int list | XmRKeyboardFocusPolicy of XmKeyboardFocusPolicy | XmRLabelType of XmLabelType | XmRMultiClick of XmMultiClickType | XmRNavigationType of XmNavigationType | XmROrientation of XmOrientation | XmRPacking of XmPacking | XmRProcessingDirection of XmProcessingDirection | XmRResizePolicy of XmResizePolicy | XmRRowColumnType of XmRowColumnType | XmRPixel of int | XmRPixmap of Drawable | XmRPosition of int | XmRScrollBarDisplayPolicy of XmScrollBarDisplayPolicy | XmRScrollBarPlacement of XmScrollBarPlacement | XmRScrollingPolicy of XmScrollingPolicy | XmRSelectionPolicy of XmSelectionPolicy | XmRShadowType of XmShadowType | XmRShort of int | XmRStringDirection of XmStringDirection | XmRString of string | XmRStringTable of string list | XmRTextScanTypeTable of XmTextScanType list | XmRTranslationTable of XtTranslations | XmRUnitType of XmUnitType | XmRVisual of Visual | XmRVisualPolicy of XmVisualPolicy | XmRWidget of Widget | XmRWidgetList of Widget list | XmRXmString of XmString | XmRXmStringTable of XmString list ; datatype XtCallback = XmNactivateCallback | XmNapplyCallback | XmNarmCallback | XmNbrowseSelectionCallback | XmNcancelCallback | XmNcascadingCallback | XmNcommandChangedCallback | XmNcommandEnteredCallback | XmNdecrementCallback | XmNdefaultActionCallback | XmNdestroyCallback | XmNdisarmCallback | XmNdragCallback | XmNentryCallback | XmNexposeCallback | XmNextendedSelectionCallback | XmNfocusCallback | XmNgainPrimaryCallback | XmNhelpCallback | XmNincrementCallback | XmNinputCallback | XmNlosePrimaryCallback | XmNlosingFocusCallback | XmNmapCallback | XmNmessageCallback (* this callback gets Message XEvents only *) | XmNmodifyVerifyCallback | XmNmotionVerifyCallback | XmNmultipleSelectionCallback | XmNnoMatchCallback | XmNokCallback | XmNpageDecrementCallback | XmNpageIncrementCallback | XmNpopdownCallback | XmNpopupCallback | XmNresizeCallback | XmNsimpleCallback | XmNsingleSelectionCallback | XmNtoBottomCallback | XmNtoTopCallback | XmNunmapCallback | XmNvalueChangedCallback ; end (* local *) ; end (* struct *) ; (* Suppress printing of abstract types. *) local open MotifTypes fun printWidget _ _ (_: Widget) = PolyML.PrettyString "?" and printAccel _ _ (_: XtAccelerators) = PolyML.PrettyString "?" and printTrans _ _ (_: XtTranslations) = PolyML.PrettyString "?" in val () = PolyML.addPrettyPrinter printWidget and () = PolyML.addPrettyPrinter printAccel and () = PolyML.addPrettyPrinter printTrans end; polyml-5.6/mlsource/extra/Motif/XM_TYPES.ML000066400000000000000000000724071265146633400205200ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XM_TYPES = sig include MOTIF_TYPES ; exception XmNaccelerator of string ; exception XmNacceleratorText of XmString ; exception XmNaccelerators of XtAccelerators ; exception XmNadjustLast of bool ; exception XmNadjustMargin of bool ; exception XmNalignment of XmAlignment ; exception XmNallowOverlap of bool ; exception XmNallowResize of bool ; exception XmNallowShellResize of bool ; exception XmNancestorSensitive of bool ; exception XmNapplyLabelString of XmString ; exception XmNargc of int ; exception XmNargv of string list ; exception XmNarmColor of int ; exception XmNarmPixmap of XWindows.Drawable ; exception XmNarrowDirection of XmArrowDirection ; exception XmNautoShowCursorPosition of bool ; exception XmNautoUnmanage of bool ; exception XmNautomaticSelection of bool ; exception XmNbackground of int ; exception XmNbackgroundPixmap of XWindows.Drawable ; exception XmNbaseHeight of int ; exception XmNbaseWidth of int ; exception XmNblinkRate of int ; exception XmNborderColor of int ; exception XmNborderPixmap of XWindows.Drawable ; exception XmNborderWidth of int ; exception XmNbottomAttachment of XmAttachment ; exception XmNbottomOffset of int ; exception XmNbottomPosition of int ; exception XmNbottomShadowColor of int ; exception XmNbottomShadowPixmap of XWindows.Drawable ; exception XmNbottomWidget of Widget ; exception XmNbuttonAcceleratorText of XmString list ; exception XmNbuttonAccelerators of string list ; exception XmNbuttonCount of int ; exception XmNbuttonFontList of (XWindows.XFontStruct * string) list ; exception XmNbuttonMnemonicCharSets of XmString list ; exception XmNbuttonMnemonics of int list ; exception XmNbuttonSet of int ; exception XmNbuttonType of XmButtonType list ; exception XmNbuttons of XmString list ; exception XmNcancelButton of Widget ; exception XmNcancelLabelString of XmString ; exception XmNcascadePixmap of XWindows.Drawable ; exception XmNchildren of Widget list ; exception XmNclipWindow of Widget ; exception XmNcolormap of XWindows.Colormap ; exception XmNcolumns of int ; exception XmNcommand of XmString ; exception XmNcommandWindow of Widget ; exception XmNcommandWindowLocation of XmCommandWindowLocation ; exception XmNcursorPosition of int ; exception XmNcursorPositionVisible of bool ; exception XmNdecimalPoints of int ; exception XmNdefaultButton of Widget ; exception XmNdefaultButtonShadowThickness of int ; exception XmNdefaultButtonType of XmDefaultButtonType ; exception XmNdefaultFontList of (XWindows.XFontStruct * string) list ; exception XmNdefaultPosition of bool ; exception XmNdeleteResponse of XmDeleteResponse ; exception XmNdepth of int ; exception XmNdialogStyle of XmDialogStyle ; exception XmNdialogTitle of XmString ; exception XmNdialogType of XmDialogType ; exception XmNdirListItemCount of int ; exception XmNdirListItems of XmString list ; exception XmNdirListLabelString of XmString ; exception XmNdirMask of XmString ; exception XmNdirSpec of XmString ; exception XmNdirectory of XmString ; exception XmNdirectoryValid of bool ; exception XmNdoubleClickInterval of int ; exception XmNeditMode of XmEditMode ; exception XmNeditable of bool ; exception XmNentryAlignment of XmAlignment ; exception XmNentryBorder of int ; exception XmNfileListItemCount of int ; exception XmNfileListItems of XmString list ; exception XmNfileListLabelString of XmString ; exception XmNfileTypeMask of XmFileTypeMask ; exception XmNfillOnArm of bool ; exception XmNfillOnSelect of bool ; exception XmNfilterLabelString of XmString ; exception XmNfontList of (XWindows.XFontStruct * string) list ; exception XmNforeground of int ; exception XmNfractionBase of int ; exception XmNgeometry of string ; exception XmNheight of int ; exception XmNheightInc of int ; exception XmNhelpLabelString of XmString ; exception XmNhighlightColor of int ; exception XmNhighlightOnEnter of bool ; exception XmNhighlightPixmap of XWindows.Drawable ; exception XmNhighlightThickness of int ; exception XmNhistoryItemCount of int ; exception XmNhistoryItems of XmString list ; exception XmNhistoryMaxItems of int ; exception XmNhistoryVisibleItemCount of int ; exception XmNhorizontalScrollBar of Widget ; exception XmNhorizontalSpacing of int ; exception XmNiconMask of XWindows.Drawable ; exception XmNiconName of string ; exception XmNiconNameEncoding of int ; exception XmNiconPixmap of XWindows.Drawable ; exception XmNiconWindow of XWindows.Drawable ; exception XmNiconX of int ; exception XmNiconY of int ; exception XmNiconic of bool ; exception XmNincrement of int ; exception XmNindicatorOn of bool ; exception XmNindicatorSize of int ; exception XmNindicatorType of XmIndicatorType ; exception XmNinitialDelay of int ; exception XmNinitialResourcesPersistent of bool ; exception XmNinitialState of XWindows.XWMStateHint ; exception XmNinput of bool ; exception XmNisAligned of bool ; exception XmNisHomogeneous of bool ; exception XmNitemCount of int ; exception XmNitems of XmString list ; exception XmNkeyboardFocusPolicy of XmKeyboardFocusPolicy ; exception XmNlabelFontList of (XWindows.XFontStruct * string) list ; exception XmNlabelInsensitivePixmap of XWindows.Drawable ; exception XmNlabelPixmap of XWindows.Drawable ; exception XmNlabelString of XmString ; exception XmNlabelType of XmLabelType ; exception XmNleftAttachment of XmAttachment ; exception XmNleftOffset of int ; exception XmNleftPosition of int ; exception XmNleftWidget of Widget ; exception XmNlistItemCount of int ; exception XmNlistItems of XmString list ; exception XmNlistLabelString of XmString ; exception XmNlistMarginHeight of int ; exception XmNlistMarginWidth of int ; exception XmNlistSizePolicy of XmVisualPolicy ; exception XmNlistSpacing of int ; exception XmNlistUpdated of bool ; exception XmNlistVisibleItemCount of int ; exception XmNmainWindowMarginHeight of int ; exception XmNmainWindowMarginWidth of int ; exception XmNmappedWhenManaged of bool ; exception XmNmappingDelay of int ; exception XmNmargin of int ; exception XmNmarginBottom of int ; exception XmNmarginHeight of int ; exception XmNmarginLeft of int ; exception XmNmarginRight of int ; exception XmNmarginTop of int ; exception XmNmarginWidth of int ; exception XmNmaxAspectX of int ; exception XmNmaxAspectY of int ; exception XmNmaxHeight of int ; exception XmNmaxLength of int ; exception XmNmaxWidth of int ; exception XmNmaximum of int ; exception XmNmenuAccelerator of string ; exception XmNmenuBar of Widget ; exception XmNmenuCursor of XWindows.Cursor ; exception XmNmenuHelpWidget of Widget ; exception XmNmenuHistory of Widget ; exception XmNmenuPost of string ; exception XmNmessageAlignment of XmAlignment ; exception XmNmessageString of XmString ; exception XmNmessageWindow of Widget ; exception XmNminAspectX of int ; exception XmNminAspectY of int ; exception XmNminHeight of int ; exception XmNminWidth of int ; exception XmNminimizeButtons of bool ; exception XmNminimum of int ; exception XmNmnemonic of int ; exception XmNmnemonicCharSet of string ; exception XmNmultiClick of XmMultiClickType ; exception XmNmustMatch of bool ; exception XmNmwmDecorations of int ; exception XmNmwmFunctions of int ; exception XmNmwmInputMode of int ; exception XmNmwmMenu of string ; exception XmNnavigationType of XmNavigationType ; exception XmNnoMatchString of XmString ; exception XmNnoResize of bool ; exception XmNnumChildren of int ; exception XmNnumColumns of int ; exception XmNokLabelString of XmString ; exception XmNoptionLabel of XmString ; exception XmNoptionMnemonic of int ; exception XmNorientation of XmOrientation ; exception XmNoverrideRedirect of bool ; exception XmNpacking of XmPacking ; exception XmNpageIncrement of int ; exception XmNpaneMaximum of int ; exception XmNpaneMinimum of int ; exception XmNpattern of XmString ; exception XmNpendingDelete of bool ; exception XmNpopupEnabled of bool ; exception XmNpostFromButton of int ; exception XmNprocessingDirection of XmProcessingDirection ; exception XmNpromptString of XmString ; exception XmNpushButtonEnabled of bool ; exception XmNradioAlwaysOne of bool ; exception XmNradioBehavior of bool ; exception XmNrecomputeSize of bool ; exception XmNrefigureMode of bool ; exception XmNrepeatDelay of int ; exception XmNresizable of bool ; exception XmNresizeHeight of bool ; exception XmNresizePolicy of XmResizePolicy ; exception XmNresizeWidth of bool ; exception XmNrightAttachment of XmAttachment ; exception XmNrightOffset of int ; exception XmNrightPosition of int ; exception XmNrightWidget of Widget ; exception XmNrowColumnType of XmRowColumnType ; exception XmNrows of int ; exception XmNrubberPositioning of bool ; exception XmNsashHeight of int ; exception XmNsashIndent of int ; exception XmNsashShadowThickness of int ; exception XmNsashWidth of int ; exception XmNsaveUnder of bool ; exception XmNscaleHeight of int ; exception XmNscaleMultiple of int ; exception XmNscaleWidth of int ; exception XmNscrollBarDisplayPolicy of XmScrollBarDisplayPolicy ; exception XmNscrollBarPlacement of XmScrollBarPlacement ; exception XmNscrollHorizontal of bool ; exception XmNscrollLeftSide of bool ; exception XmNscrollTopSide of bool ; exception XmNscrollVertical of bool ; exception XmNscrolledWindowMarginHeight of int ; exception XmNscrolledWindowMarginWidth of int ; exception XmNscrollingPolicy of XmScrollingPolicy ; exception XmNselectColor of int ; exception XmNselectInsensitivePixmap of XWindows.Drawable ; exception XmNselectPixmap of XWindows.Drawable ; exception XmNselectThreshold of int ; exception XmNselectedItemCount of int ; exception XmNselectedItems of XmString list ; exception XmNselectionArray of XmTextScanType list ; exception XmNselectionArrayCount of int ; exception XmNselectionLabelString of XmString ; exception XmNselectionPolicy of XmSelectionPolicy ; exception XmNsensitive of bool ; exception XmNseparatorOn of bool ; exception XmNseparatorType of XmShadowType ; exception XmNset of bool ; exception XmNshadowThickness of int ; exception XmNshadowType of XmShadowType ; exception XmNshellUnitType of XmUnitType ; exception XmNshowArrows of bool ; exception XmNshowAsDefault of int ; exception XmNshowSeparator of bool ; exception XmNshowValue of bool ; exception XmNskipAdjust of bool ; exception XmNsliderSize of int ; exception XmNspacing of int ; exception XmNstringDirection of XmStringDirection ; exception XmNsubMenuId of Widget ; exception XmNsymbolPixmap of XWindows.Drawable ; exception XmNtextAccelerators of XtAccelerators ; exception XmNtextColumns of int ; exception XmNtextFontList of (XWindows.XFontStruct * string) list ; exception XmNtextString of XmString ; exception XmNtextTranslations of XtTranslations ; exception XmNtitle of string ; exception XmNtitleEncoding of int ; exception XmNtitleString of XmString ; exception XmNtopAttachment of XmAttachment ; exception XmNtopCharacter of int ; exception XmNtopItemPosition of int ; exception XmNtopOffset of int ; exception XmNtopPosition of int ; exception XmNtopShadowColor of int ; exception XmNtopShadowPixmap of XWindows.Drawable ; exception XmNtopWidget of Widget ; exception XmNtransient of bool ; exception XmNtransientFor of Widget ; exception XmNtranslations of XtTranslations ; exception XmNtraversalOn of bool ; exception XmNtroughColor of int ; exception XmNunitType of XmUnitType ; exception XmNuseAsyncGeometry of bool ; exception XmNvalue of int ; exception XmNverifyBell of bool ; exception XmNverticalScrollBar of Widget ; exception XmNverticalSpacing of int ; exception XmNvisibleItemCount of int ; exception XmNvisibleWhenOff of bool ; exception XmNvisual of XWindows.Visual ; exception XmNvisualPolicy of XmVisualPolicy ; exception XmNwaitForWm of bool ; exception XmNwidth of int ; exception XmNwidthInc of int ; exception XmNwinGravity of int ; exception XmNwindowGroup of XWindows.Drawable ; exception XmNwmTimeout of int ; exception XmNwordWrap of bool ; exception XmNworkWindow of Widget ; exception XmNx of int ; exception XmNy of int ; val XmCAccelerator: string ; val XmCAcceleratorText: string ; val XmCAccelerators: string ; val XmCAdjustLast: string ; val XmCAdjustMargin: string ; val XmCAlignment: string ; val XmCAllowOverlap: string ; val XmCAllowShellResize: string ; val XmCApplyLabelString: string ; val XmCArgc: string ; val XmCArgv: string ; val XmCArmColor: string ; val XmCArmPixmap: string ; val XmCArrowDirection: string ; val XmCAttachment: string ; val XmCAutoShowCursorPosition: string ; val XmCAutoUnmanage: string ; val XmCAutomaticSelection: string ; val XmCBackground: string ; val XmCBackgroundPixmap: string ; val XmCBaseHeight: string ; val XmCBaseWidth: string ; val XmCBlinkRate: string ; val XmCBoolean: string ; val XmCBorderColor: string ; val XmCBorderWidth: string ; val XmCBottomShadowColor: string ; val XmCBottomShadowPixmap: string ; val XmCButtonAcceleratorText: string ; val XmCButtonAccelerators: string ; val XmCButtonCount: string ; val XmCButtonFontList: string ; val XmCButtonMnemonicCharSets: string ; val XmCButtonMnemonics: string ; val XmCButtonSet: string ; val XmCButtonType: string ; val XmCButtons: string ; val XmCCancelLabelString: string ; val XmCChildren: string ; val XmCClipWindow: string ; val XmCColormap: string ; val XmCColumns: string ; val XmCCommandWindow: string ; val XmCCommandWindowLocation: string ; val XmCCursor: string ; val XmCCursorPosition: string ; val XmCCursorPositionVisible: string ; val XmCDecimalPoints: string ; val XmCDefaultButtonShadowThickness: string ; val XmCDefaultButtonType: string ; val XmCDefaultFontList: string ; val XmCDefaultPosition: string ; val XmCDeleteResponse: string ; val XmCDepth: string ; val XmCDialogStyle: string ; val XmCDialogTitle: string ; val XmCDialogType: string ; val XmCDirListItemCount: string ; val XmCDirListItems: string ; val XmCDirListLabelString: string ; val XmCDirMask: string ; val XmCDirSpec: string ; val XmCDirectory: string ; val XmCDirectoryValid: string ; val XmCDoubleClickInterval: string ; val XmCEditMode: string ; val XmCEditable: string ; val XmCEntryBorder: string ; val XmCFileListItemCount: string ; val XmCFileListItems: string ; val XmCFileListLabelString: string ; val XmCFileTypeMask: string ; val XmCFillOnArm: string ; val XmCFillOnSelect: string ; val XmCFilterLabelString: string ; val XmCFontList: string ; val XmCForeground: string ; val XmCFraction: string ; val XmCGeometry: string ; val XmCHeight: string ; val XmCHeightInc: string ; val XmCHelpLabelString: string ; val XmCHighlightColor: string ; val XmCHighlightOnEnter: string ; val XmCHighlightPixmap: string ; val XmCHighlightThickness: string ; val XmCHorizontalScrollBar: string ; val XmCIconMask: string ; val XmCIconName: string ; val XmCIconNameEncoding: string ; val XmCIconPixmap: string ; val XmCIconWindow: string ; val XmCIconX: string ; val XmCIconY: string ; val XmCIconic: string ; val XmCIncrement: string ; val XmCIndicatorOn: string ; val XmCIndicatorSize: string ; val XmCIndicatorType: string ; val XmCInitialDelay: string ; val XmCInitialResourcesPersistent: string ; val XmCInitialState: string ; val XmCInput: string ; val XmCIsAligned: string ; val XmCIsHomogeneous: string ; val XmCItemCount: string ; val XmCItems: string ; val XmCKeyboardFocusPolicy: string ; val XmCLabelFontList: string ; val XmCLabelInsensitivePixmap: string ; val XmCLabelPixmap: string ; val XmCLabelString: string ; val XmCLabelType: string ; val XmCListLabelString: string ; val XmCListMarginHeight: string ; val XmCListMarginWidth: string ; val XmCListSizePolicy: string ; val XmCListSpacing: string ; val XmCListUpdated: string ; val XmCMainWindowMarginHeight: string ; val XmCMainWindowMarginWidth: string ; val XmCMappedWhenManaged: string ; val XmCMappingDelay: string ; val XmCMargin: string ; val XmCMarginBottom: string ; val XmCMarginHeight: string ; val XmCMarginLeft: string ; val XmCMarginRight: string ; val XmCMarginTop: string ; val XmCMarginWidth: string ; val XmCMaxAspectX: string ; val XmCMaxAspectY: string ; val XmCMaxHeight: string ; val XmCMaxItems: string ; val XmCMaxLength: string ; val XmCMaxWidth: string ; val XmCMaximum: string ; val XmCMenuBar: string ; val XmCMenuPost: string ; val XmCMenuWidget: string ; val XmCMessageString: string ; val XmCMessageWindow: string ; val XmCMinAspectX: string ; val XmCMinAspectY: string ; val XmCMinHeight: string ; val XmCMinWidth: string ; val XmCMinimizeButtons: string ; val XmCMinimum: string ; val XmCMnemonic: string ; val XmCMnemonicCharSet: string ; val XmCMultiClick: string ; val XmCMustMatch: string ; val XmCMwmDecorations: string ; val XmCMwmFunctions: string ; val XmCMwmInputMode: string ; val XmCMwmMenu: string ; val XmCNavigationType: string ; val XmCNoMatchString: string ; val XmCNoResize: string ; val XmCNumChildren: string ; val XmCNumColumns: string ; val XmCOffset: string ; val XmCOkLabelString: string ; val XmCOptionLabel: string ; val XmCOptionMnemonic: string ; val XmCOrientation: string ; val XmCOverrideRedirect: string ; val XmCPacking: string ; val XmCPageIncrement: string ; val XmCPaneMaximum: string ; val XmCPaneMinimum: string ; val XmCPattern: string ; val XmCPendingDelete: string ; val XmCPixmap: string ; val XmCPopupEnabled: string ; val XmCPosition: string ; val XmCPostFromButton: string ; val XmCProcessingDirection: string ; val XmCPromptString: string ; val XmCPushButtonEnabled: string ; val XmCRadioAlwaysOne: string ; val XmCRadioBehavior: string ; val XmCRecomputeSize: string ; val XmCRepeatDelay: string ; val XmCResizeHeight: string ; val XmCResizePolicy: string ; val XmCResizeWidth: string ; val XmCRowColumnType: string ; val XmCRows: string ; val XmCRubberPositioning: string ; val XmCSashHeight: string ; val XmCSashIndent: string ; val XmCSashWidth: string ; val XmCSaveUnder: string ; val XmCScaleHeight: string ; val XmCScaleMultiple: string ; val XmCScaleWidth: string ; val XmCScroll: string ; val XmCScrollBarDisplayPolicy: string ; val XmCScrollBarPlacement: string ; val XmCScrollSide: string ; val XmCScrolledWindowMarginHeight: string ; val XmCScrolledWindowMarginWidth: string ; val XmCScrollingPolicy: string ; val XmCSelectColor: string ; val XmCSelectInsensitivePixmap: string ; val XmCSelectPixmap: string ; val XmCSelectThreshold: string ; val XmCSelectedItemCount: string ; val XmCSelectedItems: string ; val XmCSelectionArray: string ; val XmCSelectionArrayCount: string ; val XmCSelectionLabelString: string ; val XmCSelectionPolicy: string ; val XmCSensitive: string ; val XmCSeparatorOn: string ; val XmCSeparatorType: string ; val XmCSet: string ; val XmCShadowThickness: string ; val XmCShadowType: string ; val XmCShellUnitType: string ; val XmCShowArrows: string ; val XmCShowAsDefault: string ; val XmCShowSeparator: string ; val XmCShowValue: string ; val XmCSliderSize: string ; val XmCSpacing: string ; val XmCStringDirection: string ; val XmCTextFontList: string ; val XmCTextPosition: string ; val XmCTextString: string ; val XmCTitle: string ; val XmCTitleEncoding: string ; val XmCTitleString: string ; val XmCTopItemPosition: string ; val XmCTopShadowColor: string ; val XmCTopShadowPixmap: string ; val XmCTransient: string ; val XmCTransientFor: string ; val XmCTranslations: string ; val XmCTraversalOn: string ; val XmCTroughColor: string ; val XmCUnitType: string ; val XmCUseAsyncGeometry: string ; val XmCValue: string ; val XmCVerifyBell: string ; val XmCVerticalScrollBar: string ; val XmCVisibleItemCount: string ; val XmCVisibleWhenOff: string ; val XmCVisual: string ; val XmCVisualPolicy: string ; val XmCWaitForWm: string ; val XmCWidget: string ; val XmCWidth: string ; val XmCWidthInc: string ; val XmCWinGravity: string ; val XmCWindowGroup: string ; val XmCWmTimeout: string ; val XmCWordWrap: string ; val XmCWorkWindow: string ; val XmCX: string ; val XmCY: string ; end (* sig *) ; polyml-5.6/mlsource/extra/Motif/XmNs.doc000066400000000000000000000513741265146633400203320ustar00rootroot00000000000000XmNaccelerator XmCAccelerator string XmLabel XmNacceleratorText XmCAcceleratorText XmString XmLabel XmNaccelerators XmCAccelerators XtAccelerators Core XmNactivateCallback XmCCallback (callback) XmArrowButton,XmCascadeButton,XmDrawnButton,XmPushButton,XmText,XmTextField XmNadjustLast XmCAdjustLast bool XmRowColumn XmNadjustMargin XmCAdjustMargin bool XmRowColumn XmNalignment XmCAlignment XmAlignment XmLabel XmNallowOverlap XmCAllowOverlap bool XmBulletinBoard XmNallowResize XmCBoolean bool XmPanedWindow XmNallowShellResize XmCAllowShellResize bool Shell XmNancestorSensitive XmCBoolean bool Core,RectObj XmNapplyCallback XmCCallback (callback) XmSelectionBox XmNapplyLabelString XmCApplyLabelString XmString XmSelectionBox XmNargc XmCArgc int ApplicationShell XmNargv XmCArgv string list ApplicationShell XmNarmCallback XmCCallback (callback) XmArrowButton,XmDrawnButton,XmPushButton,XmToggleButton XmNarmColor XmCArmColor Pixel XmPushButton XmNarmPixmap XmCArmPixmap Drawable XmPushButton XmNarrowDirection XmCArrowDirection XmArrowDirection XmArrowButton XmNautoShowCursorPosition XmCAutoShowCursorPosition bool XmText XmNautoUnmanage XmCAutoUnmanage bool XmBulletinBoard XmNautomaticSelection XmCAutomaticSelection bool XmList XmNbackground XmCBackground Pixel Core XmNbackgroundPixmap XmCBackgroundPixmap Drawable Core XmNbaseHeight XmCBaseHeight int WMShell XmNbaseWidth XmCBaseWidth int WMShell XmNblinkRate XmCBlinkRate int XmText,XmTextField XmNborderColor XmCBorderColor Pixel Core XmNborderPixmap XmCPixmap Drawable Core XmNborderWidth XmCBorderWidth Dimension Core,RectObj XmNbottomAttachment XmCAttachment XmAttachment XmForm XmNbottomOffset XmCOffset int XmForm XmNbottomPosition XmCPosition int XmForm XmNbottomShadowColor XmCBottomShadowColor Pixel XmManager,XmPrimitive XmNbottomShadowPixmap XmCBottomShadowPixmap Drawable XmManager,XmPrimitive XmNbottomWidget XmCWidget Widget XmForm XmNbrowseSelectionCallback XmCCallback (callback) XmList XmNbuttonAcceleratorText XmCButtonAcceleratorText XmString list XmRowColumn XmNbuttonAccelerators XmCButtonAccelerators string list XmRowColumn XmNbuttonCount XmCButtonCount int XmRowColumn XmNbuttonFontList XmCButtonFontList XFontStruct list XmBulletinBoard XmNbuttonMnemonicCharSets XmCButtonMnemonicCharSets XmString list XmRowColumn XmNbuttonMnemonics XmCButtonMnemonics KeySym list XmRowColumn XmNbuttonSet XmCButtonSet int XmRowColumn XmNbuttonType XmCButtonType XmButtonType list XmRowColumn XmNbuttons XmCButtons XmString list XmRowColumn XmNcancelButton XmCWidget Widget XmBulletinBoard XmNcancelCallback XmCCallback (callback) XmMessageBox,XmSelectionBox XmNcancelLabelString XmCCancelLabelString XmString XmMessageBox,XmSelectionBox XmNcascadePixmap XmCPixmap Drawable XmCascadeButton XmNcascadingCallback XmCCallback (callback) XmCascadeButton XmNchildren XmCChildren Widget list Composite XmNclipWindow XmCClipWindow Widget XmScrolledWindow XmNcolormap XmCColormap Colormap Core XmNcolumns XmCColumns short XmText,XmTextField XmNcommand XmCTextString XmString XmCommand XmNcommandChangedCallback XmCCallback (callback) XmCommand XmNcommandEnteredCallback XmCCallback (callback) XmCommand XmNcommandWindow XmCCommandWindow Widget XmMainWindow XmNcommandWindowLocation XmCCommandWindowLocation XmCommandWindowLocation XmMainWindow XmNcursorPosition XmCCursorPosition XmTextPosition XmText,XmTextField XmNcursorPositionVisible XmCCursorPositionVisible bool XmText,XmTextField XmNdecimalPoints XmCDecimalPoints short XmScale XmNdecrementCallback XmCCallback (callback) XmScrollBar XmNdefaultActionCallback XmCCallback (callback) XmList XmNdefaultButton XmCWidget Widget XmBulletinBoard XmNdefaultButtonShadowThickness XmCDefaultButtonShadowThickness Dimension XmPushButton XmNdefaultButtonType XmCDefaultButtonType XmDefaultButtonType XmMessageBox XmNdefaultFontList XmCDefaultFontList XFontStruct list VendorShell,XmMenuShell XmNdefaultPosition XmCDefaultPosition bool XmBulletinBoard XmNdeleteResponse XmCDeleteResponse XmDeleteResponse VendorShell XmNdepth XmCDepth int Core XmNdestroyCallback XmCCallback (callback) Core,Object XmNdialogStyle XmCDialogStyle XmDialogStyle XmBulletinBoard XmNdialogTitle XmCDialogTitle XmString XmBulletinBoard XmNdialogType XmCDialogType XmDialogType XmMessageBox,XmSelectionBox XmNdirListItemCount XmCDirListItemCount int XmFileSelectionBox XmNdirListItems XmCDirListItems XmString list XmFileSelectionBox XmNdirListLabelString XmCDirListLabelString XmString XmFileSelectionBox XmNdirMask XmCDirMask XmString XmFileSelectionBox XmNdirSpec XmCDirSpec XmString XmFileSelectionBox XmNdirectory XmCDirectory XmString XmFileSelectionBox XmNdirectoryValid XmCDirectoryValid bool XmFileSelectionBox XmNdisarmCallback XmCDisarmCallback (callback) XmArrowButton,XmDrawnButton,XmPushButton,XmToggleButton XmNdoubleClickInterval XmCDoubleClickInterval int XmList XmNdragCallback XmCCallback (callback) XmScale,XmScrollBar XmNeditMode XmCEditMode XmEditMode XmText XmNeditable XmCEditable bool XmText,XmTextField XmNentryAlignment XmCAlignment XmAlignment XmRowColumn XmNentryBorder XmCEntryBorder Dimension XmRowColumn XmNentryCallback XmCCallback (callback) XmRowColumn XmNexposeCallback XmCCallback (callback) XmDrawingArea,XmDrawnButton XmNextendedSelectionCallback XmCCallback (callback) XmList XmNfileListItemCount XmCFileListItemCount int XmFileSelectionBox XmNfileListItems XmCFileListItems XmString list XmFileSelectionBox XmNfileListLabelString XmCFileListLabelString XmString XmFileSelectionBox XmNfileTypeMask XmCFileTypeMask XmFileTypeMask XmFileSelectionBox XmNfillOnArm XmCFillOnArm bool XmPushButton XmNfillOnSelect XmCFillOnSelect bool XmToggleButton XmNfilterLabelString XmCFilterLabelString XmString XmFileSelectionBox XmNfocusCallback XmCCallback (callback) XmBulletinBoard,XmText XmNfontList XmCFontList XFontStruct list XmLabel,XmList,XmScale,XmText,XmTextField XmNforeground XmCForeground Pixel XmManager,XmPrimitive XmNfractionBase XmCFraction int XmForm XmNgainPrimaryCallback XmCCallback (callback) XmText,XmTextField XmNgeometry XmCGeometry string Shell XmNheight XmCHeight Dimension Core,RectObj XmNheightInc XmCHeightInc int WMShell XmNhelpCallback XmCCallback (callback) XmGadget,XmManager,XmPrimitive XmNhelpLabelString XmCHelpLabelString XmString XmMessageBox,XmSelectionBox XmNhighlightColor XmCHighlightColor Pixel XmManager,XmPrimitive XmNhighlightOnEnter XmCHighlightOnEnter bool XmGadget,XmPrimitive,XmScale XmNhighlightPixmap XmCHighlightPixmap Drawable XmManager,XmPrimitive XmNhighlightThickness XmCHighlightThickness Dimension XmGadget,XmPrimitive,XmScale XmNhistoryItemCount XmCItemCount int XmCommand XmNhistoryItems XmCItems XmString list XmCommand XmNhistoryMaxItems XmCMaxItems int XmCommand XmNhistoryVisibleItemCount XmCVisibleItemCount int XmCommand XmNhorizontalScrollBar XmCHorizontalScrollBar Widget XmScrolledWindow XmNhorizontalSpacing XmCSpacing Dimension XmForm XmNiconMask XmCIconMask Drawable WMShell XmNiconName XmCIconName string TopLevelShell XmNiconNameEncoding XmCIconNameEncoding Atom TopLevelShell XmNiconPixmap XmCIconPixmap Drawable WMShell XmNiconWindow XmCIconWindow Drawable WMShell XmNiconX XmCIconX int WMShell XmNiconY XmCIconY int WMShell XmNiconic XmCIconic bool TopLevelShell XmNincrement XmCIncrement int XmScrollBar XmNincrementCallback XmCCallback (callback) XmScrollBar XmNindicatorOn XmCIndicatorOn bool XmToggleButton XmNindicatorSize XmCIndicatorSize Dimension XmToggleButton XmNindicatorType XmCIndicatorType XmIndicatorType XmToggleButton XmNinitialDelay XmCInitialDelay int XmScrollBar XmNinitialResourcesPersistent XmCInitialResourcesPersistent bool Core XmNinitialState XmCInitialState XWMStateHint WMShell XmNinput XmCInput bool WMShell XmNinputCallback XmCCallback (callback) XmDrawingArea XmNisAligned XmCIsAligned bool XmRowColumn XmNisHomogeneous XmCIsHomogeneous bool XmRowColumn XmNitemCount XmCItemCount int XmList XmNitems XmCItems XmString list XmList XmNkeyboardFocusPolicy XmCKeyboardFocusPolicy XmKeyboardFocusPolicy VendorShell XmNlabelFontList XmCLabelFontList XFontStruct list XmBulletinBoard XmNlabelInsensitivePixmap XmCLabelInsensitivePixmap Drawable XmLabel XmNlabelPixmap XmCLabelPixmap Drawable XmLabel XmNlabelString XmCLabelString XmString XmLabel,XmRowColumn XmNlabelType XmCLabelType XmLabelType XmLabel XmNleftAttachment XmCAttachment XmAttachment XmForm XmNleftOffset XmCOffset int XmForm XmNleftPosition XmCPosition int XmForm XmNleftWidget XmCWidget Widget XmForm XmNlistItemCount XmCItemCount int XmSelectionBox XmNlistItems XmCItems XmString list XmSelectionBox XmNlistLabelString XmCListLabelString XmString XmSelectionBox XmNlistMarginHeight XmCListMarginHeight Dimension XmList XmNlistMarginWidth XmCListMarginWidth Dimension XmList XmNlistSizePolicy XmCListSizePolicy XmVisualPolicy XmList XmNlistSpacing XmCListSpacing Dimension XmList XmNlistUpdated XmCListUpdated bool XmFileSelectionBox XmNlistVisibleItemCount XmCVisibleItemCount int XmSelectionBox XmNlosePrimaryCallback XmCCallback (callback) XmText,XmTextField XmNlosingFocusCallback XmCCallback (callback) XmText,XmTextField XmNmainWindowMarginHeight XmCMainWindowMarginHeight Dimension XmMainWindow XmNmainWindowMarginWidth XmCMainWindowMarginWidth Dimension XmMainWindow XmNmapCallback XmCCallback (callback) XmBulletinBoard,XmRowColumn XmNmappedWhenManaged XmCMappedWhenManaged bool Core XmNmappingDelay XmCMappingDelay int XmCascadeButton XmNmargin XmCMargin Dimension XmSeparator XmNmarginBottom XmCMarginBottom Dimension XmLabel XmNmarginHeight XmCMarginHeight Dimension XmBulletinBoard,XmDrawingArea,XmFrame,XmLabel,XmPanedWindow,XmRowColumn,XmText,XmTextField XmNmarginLeft XmCMarginLeft Dimension XmLabel XmNmarginRight XmCMarginRight Dimension XmLabel XmNmarginTop XmCMarginTop Dimension XmLabel XmNmarginWidth XmCMarginWidth Dimension XmBulletinBoard,XmDrawingArea,XmFrame,XmLabel,XmPanedWindow,XmRowColumn,XmText,XmTextField XmNmaxAspectX XmCMaxAspectX int WMShell XmNmaxAspectY XmCMaxAspectY int WMShell XmNmaxHeight XmCMaxHeight int WMShell XmNmaxLength XmCMaxLength int XmText,XmTextField XmNmaxWidth XmCMaxWidth int WMShell XmNmaximum XmCMaximum int XmScale,XmScrollBar XmNmenuAccelerator XmCAccelerators string XmRowColumn XmNmenuBar XmCMenuBar Widget XmMainWindow XmNmenuCursor XmCCursor Cursor XmRowColumn XmNmenuHelpWidget XmCMenuWidget Widget XmRowColumn XmNmenuHistory XmCMenuWidget Widget XmRowColumn XmNmenuPost XmCMenuPost string XmRowColumn XmNmessageAlignment XmCAlignment XmAlignment XmMessageBox XmNmessageCallback XmCCallback (callback) (everything) XmNmessageString XmCMessageString XmString XmMessageBox XmNmessageWindow XmCMessageWindow Widget XmMainWindow XmNminAspectX XmCMinAspectX int WMShell XmNminAspectY XmCMinAspectY int WMShell XmNminHeight XmCMinHeight int WMShell XmNminWidth XmCMinWidth int WMShell XmNminimizeButtons XmCMinimizeButtons bool XmMessageBox,XmSelectionBox XmNminimum XmCMinimum int XmScale,XmScrollBar XmNmnemonic XmCMnemonic KeySym XmLabel,XmRowColumn XmNmnemonicCharSet XmCMnemonicCharSet string XmLabel,XmRowColumn XmNmodifyVerifyCallback XmCCallback (callback) XmText,XmTextField XmNmotionVerifyCallback XmCCallback (callback) XmText,XmTextField XmNmultiClick XmCMultiClick XmMultiClickType XmArrowButton,XmDrawnButton,XmPushButton XmNmultipleSelectionCallback XmCCallback (callback) XmList XmNmustMatch XmCMustMatch bool XmSelectionBox XmNmwmDecorations XmCMwmDecorations int VendorShell XmNmwmFunctions XmCMwmFunctions int VendorShell XmNmwmInputMode XmCMwmInputMode int VendorShell XmNmwmMenu XmCMwmMenu string VendorShell XmNnavigationType XmCNavigationType XmNavigationType XmGadget,XmManager,XmPrimitive XmNnoMatchCallback XmCCallback (callback) XmSelectionBox XmNnoMatchString XmCNoMatchString XmString XmFileSelectionBox XmNnoResize XmCNoResize bool XmBulletinBoard XmNnumChildren XmCNumChildren Cardinal Composite XmNnumColumns XmCNumColumns short XmRowColumn XmNokCallback XmCCallback (callback) XmMessageBox,XmSelectionBox XmNokLabelString XmCOkLabelString XmString XmMessageBox,XmSelectionBox XmNoptionLabel XmCOptionLabel XmString XmRowColumn XmNoptionMnemonic XmCOptionMnemonic KeySym XmRowColumn XmNorientation XmCOrientation XmOrientation XmRowColumn,XmScale,XmScrollBar,XmSeparator XmNoverrideRedirect XmCOverrideRedirect bool Shell XmNpacking XmCPacking XmPacking XmRowColumn XmNpageDecrementCallback XmCCallback (callback) XmScrollBar XmNpageIncrement XmCPageIncrement int XmScrollBar XmNpageIncrementCallback XmCCallback (callback) XmScrollBar XmNpaneMaximum XmCPaneMaximum Dimension XmPanedWindow XmNpaneMinimum XmCPaneMinimum Dimension XmPanedWindow XmNpattern XmCPattern XmString XmFileSelectionBox XmNpendingDelete XmCPendingDelete bool XmText,XmTextField XmNpopdownCallback XmCCallback (callback) Shell XmNpopupCallback XmCCallback (callback) Shell XmNpopupEnabled XmCPopupEnabled bool XmRowColumn XmNpostFromButton XmCPostFromButton int XmRowColumn XmNprocessingDirection XmCProcessingDirection XmProcessingDirection XmScale,XmScrollBar XmNpromptString XmCPromptString XmString XmCommand XmNpushButtonEnabled XmCPushButtonEnabled bool XmDrawnButton XmNradioAlwaysOne XmCRadioAlwaysOne bool XmRowColumn XmNradioBehavior XmCRadioBehavior bool XmRowColumn XmNrecomputeSize XmCRecomputeSize bool XmLabel XmNrefigureMode XmCBoolean bool XmPanedWindow XmNrepeatDelay XmCRepeatDelay int XmScrollBar XmNresizable XmCBoolean bool XmForm XmNresizeCallback XmCCallback (callback) XmDrawingArea,XmDrawnButton XmNresizeHeight XmCResizeHeight bool XmRowColumn,XmText XmNresizePolicy XmCResizePolicy XmResizePolicy XmBulletinBoard,XmDrawingArea XmNresizeWidth XmCResizeWidth bool XmRowColumn,XmText,XmTextField XmNrightAttachment XmCAttachment XmAttachment XmForm XmNrightOffset XmCOffset int XmForm XmNrightPosition XmCPosition int XmForm XmNrightWidget XmCWidget Widget XmForm XmNrowColumnType XmCRowColumnType XmRowColumnType XmRowColumn XmNrows XmCRows short XmText XmNrubberPositioning XmCRubberPositioning bool XmForm XmNsashHeight XmCSashHeight Dimension XmPanedWindow XmNsashIndent XmCSashIndent Position XmPanedWindow XmNsashShadowThickness XmCShadowThickness Dimension XmPanedWindow XmNsashWidth XmCSashWidth Dimension XmPanedWindow XmNsaveUnder XmCSaveUnder bool Shell XmNscaleHeight XmCScaleHeight Dimension XmScale XmNscaleMultiple XmCScaleMultiple int XmScale XmNscaleWidth XmCScaleWidth Dimension XmScale XmNscrollBarDisplayPolicy XmCScrollBarDisplayPolicy XmScrollBarDisplayPolicy XmList,XmScrolledWindow XmNscrollBarPlacement XmCScrollBarPlacement XmScrollBarPlacement XmScrolledWindow XmNscrollHorizontal XmCScroll bool XmText XmNscrollLeftSide XmCScrollSide bool XmText XmNscrollTopSide XmCScrollSide bool XmText XmNscrollVertical XmCScroll bool XmText XmNscrolledWindowMarginHeight XmCScrolledWindowMarginHeight Dimension XmScrolledWindow XmNscrolledWindowMarginWidth XmCScrolledWindowMarginWidth Dimension XmScrolledWindow XmNscrollingPolicy XmCScrollingPolicy XmScrollingPolicy XmScrolledWindow XmNselectColor XmCSelectColor Pixel XmToggleButton XmNselectInsensitivePixmap XmCSelectInsensitivePixmap Drawable XmToggleButton XmNselectPixmap XmCSelectPixmap Drawable XmToggleButton XmNselectThreshold XmCSelectThreshold int XmText,XmTextField XmNselectedItemCount XmCSelectedItemCount int XmList XmNselectedItems XmCSelectedItems XmString list XmList XmNselectionArray XmCSelectionArray XmTextScanType list XmText,XmTextField XmNselectionArrayCount XmCSelectionArrayCount int XmText,XmTextField XmNselectionLabelString XmCSelectionLabelString XmString XmSelectionBox XmNselectionPolicy XmCSelectionPolicy XmSelectionPolicy XmList XmNsensitive XmCSensitive bool Core,RectObj XmNseparatorOn XmCSeparatorOn bool XmPanedWindow XmNseparatorType XmCSeparatorType XmShadowType XmSeparator XmNset XmCSet bool XmToggleButton XmNshadowThickness XmCShadowThickness Dimension XmGadget,XmManager,XmPrimitive XmNshadowType XmCShadowType XmShadowType XmBulletinBoard,XmDrawnButton,XmFrame XmNshellUnitType XmCShellUnitType XmUnitType VendorShell XmNshowArrows XmCShowArrows bool XmScrollBar XmNshowAsDefault XmCShowAsDefault Dimension XmPushButton XmNshowSeparator XmCShowSeparator bool XmMainWindow XmNshowValue XmCShowValue bool XmScale XmNsimpleCallback XmCCallback (callback) XmRowColumn XmNsingleSelectionCallback XmCCallback (callback) XmList XmNskipAdjust XmCBoolean bool XmPanedWindow XmNsliderSize XmCSliderSize int XmScrollBar XmNspacing XmCSpacing Dimension XmPanedWindow,XmRowColumn,XmScrolledWindow,XmToggleButton XmNstringDirection XmCStringDirection XmStringDirection XmLabel,XmList,XmManager XmNsubMenuId XmCMenuWidget Widget XmCascadeButton,XmRowColumn XmNsymbolPixmap XmCPixmap Drawable XmMessageBox XmNtextAccelerators XmCAccelerators XtAccelerators XmSelectionBox XmNtextColumns XmCColumns short XmSelectionBox XmNtextFontList XmCTextFontList XFontStruct list XmBulletinBoard XmNtextString XmCTextString XmString XmSelectionBox XmNtextTranslations XmCTranslations XtTranslations XmBulletinBoard XmNtitle XmCTitle string WMShell XmNtitleEncoding XmCTitleEncoding Atom WMShell XmNtitleString XmCTitleString XmString XmScale XmNtoBottomCallback XmCCallback (callback) XmScrollBar XmNtoTopCallback XmCCallback (callback) XmScrollBar XmNtopAttachment XmCAttachment XmAttachment XmForm XmNtopCharacter XmCTextPosition XmTextPosition XmText XmNtopItemPosition XmCTopItemPosition int XmList XmNtopOffset XmCOffset int XmForm XmNtopPosition XmCPosition int XmForm XmNtopShadowColor XmCTopShadowColor Pixel XmManager,XmPrimitive XmNtopShadowPixmap XmCTopShadowPixmap Drawable XmManager,XmPrimitive XmNtopWidget XmCWidget Widget XmForm XmNtransient XmCTransient bool WMShell XmNtransientFor XmCTransientFor Widget TransientShell XmNtranslations XmCTranslations XtTranslations Core XmNtraversalOn XmCTraversalOn bool XmGadget,XmManager,XmPrimitive XmNtroughColor XmCTroughColor Pixel XmScrollBar XmNunitType XmCUnitType XmUnitType XmGadget,XmManager,XmPrimitive XmNunmapCallback XmCCallback (callback) XmBulletinBoard,XmRowColumn XmNuseAsyncGeometry XmCUseAsyncGeometry bool VendorShell XmNvalue XmCValue int XmScale,XmScrollBar XmNvalueChangedCallback XmCCallback (callback) XmScale,XmScrollBar,XmText,XmTextField,XmToggleButton XmNverifyBell XmCVerifyBell bool XmText,XmTextField XmNverticalScrollBar XmCVerticalScrollBar Widget XmScrolledWindow XmNverticalSpacing XmCSpacing Dimension XmForm XmNvisibleItemCount XmCVisibleItemCount short XmList XmNvisibleWhenOff XmCVisibleWhenOff bool XmToggleButton XmNvisual XmCVisual Visual Shell XmNvisualPolicy XmCVisualPolicy XmVisualPolicy XmScrolledWindow XmNwaitForWm XmCWaitForWm bool WMShell XmNwidth XmCWidth Dimension Core,RectObj XmNwidthInc XmCWidthInc int WMShell XmNwinGravity XmCWinGravity int WMShell XmNwindowGroup XmCWindowGroup Drawable WMShell XmNwmTimeout XmCWmTimeout int WMShell XmNwordWrap XmCWordWrap bool XmText XmNworkWindow XmCWorkWindow Widget XmScrolledWindow XmNx XmCX Position Core,RectObj XmNy XmCY Position Core,RectObj NOT SUPPORTED XmNinsertPosition Composite XmNscreen Core XmNcreatePopupChildProc Shell XmNdirSearchProc XmFileSelectionBox XmNfileSearchProc XmFileSelectionBox XmNqualifySearchDataProc XmFileSelectionBox XmNuserData XmGadget,XmManager,XmPrimitive XmNentryClass XmRowColumn XmNwhichButton XmRowColumn XmNsource XmText polyml-5.6/mlsource/extra/Motif/XmTypes.ML000066400000000000000000000771501265146633400206210ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XmTypes = struct local open MotifTypes XWindows in exception XmNaccelerator of string ; exception XmNacceleratorText of XmString ; exception XmNaccelerators of XtAccelerators ; exception XmNadjustLast of bool ; exception XmNadjustMargin of bool ; exception XmNalignment of XmAlignment ; exception XmNallowOverlap of bool ; exception XmNallowResize of bool ; exception XmNallowShellResize of bool ; exception XmNancestorSensitive of bool ; exception XmNapplyLabelString of XmString ; exception XmNargc of int ; exception XmNargv of string list ; exception XmNarmColor of int ; exception XmNarmPixmap of Drawable ; exception XmNarrowDirection of XmArrowDirection ; exception XmNautoShowCursorPosition of bool ; exception XmNautoUnmanage of bool ; exception XmNautomaticSelection of bool ; exception XmNbackground of int ; exception XmNbackgroundPixmap of Drawable ; exception XmNbaseHeight of int ; exception XmNbaseWidth of int ; exception XmNblinkRate of int ; exception XmNborderColor of int ; exception XmNborderPixmap of Drawable ; exception XmNborderWidth of int ; exception XmNbottomAttachment of XmAttachment ; exception XmNbottomOffset of int ; exception XmNbottomPosition of int ; exception XmNbottomShadowColor of int ; exception XmNbottomShadowPixmap of Drawable ; exception XmNbottomWidget of Widget ; exception XmNbuttonAcceleratorText of XmString list ; exception XmNbuttonAccelerators of string list ; exception XmNbuttonCount of int ; exception XmNbuttonFontList of (XFontStruct * string) list ; exception XmNbuttonMnemonicCharSets of XmString list ; exception XmNbuttonMnemonics of int list ; exception XmNbuttonSet of int ; exception XmNbuttonType of XmButtonType list ; exception XmNbuttons of XmString list ; exception XmNcancelButton of Widget ; exception XmNcancelLabelString of XmString ; exception XmNcascadePixmap of Drawable ; exception XmNchildren of Widget list ; exception XmNclipWindow of Widget ; exception XmNcolormap of Colormap ; exception XmNcolumns of int ; exception XmNcommand of XmString ; exception XmNcommandWindow of Widget ; exception XmNcommandWindowLocation of XmCommandWindowLocation ; exception XmNcursorPosition of int ; exception XmNcursorPositionVisible of bool ; exception XmNdecimalPoints of int ; exception XmNdefaultButton of Widget ; exception XmNdefaultButtonShadowThickness of int ; exception XmNdefaultButtonType of XmDefaultButtonType ; exception XmNdefaultFontList of (XFontStruct * string) list ; exception XmNdefaultPosition of bool ; exception XmNdeleteResponse of XmDeleteResponse ; exception XmNdepth of int ; exception XmNdialogStyle of XmDialogStyle ; exception XmNdialogTitle of XmString ; exception XmNdialogType of XmDialogType ; exception XmNdirListItemCount of int ; exception XmNdirListItems of XmString list ; exception XmNdirListLabelString of XmString ; exception XmNdirMask of XmString ; exception XmNdirSpec of XmString ; exception XmNdirectory of XmString ; exception XmNdirectoryValid of bool ; exception XmNdoubleClickInterval of int ; exception XmNeditMode of XmEditMode ; exception XmNeditable of bool ; exception XmNentryAlignment of XmAlignment ; exception XmNentryBorder of int ; exception XmNfileListItemCount of int ; exception XmNfileListItems of XmString list ; exception XmNfileListLabelString of XmString ; exception XmNfileTypeMask of XmFileTypeMask ; exception XmNfillOnArm of bool ; exception XmNfillOnSelect of bool ; exception XmNfilterLabelString of XmString ; exception XmNfontList of (XFontStruct * string) list ; exception XmNforeground of int ; exception XmNfractionBase of int ; exception XmNgeometry of string ; exception XmNheight of int ; exception XmNheightInc of int ; exception XmNhelpLabelString of XmString ; exception XmNhighlightColor of int ; exception XmNhighlightOnEnter of bool ; exception XmNhighlightPixmap of Drawable ; exception XmNhighlightThickness of int ; exception XmNhistoryItemCount of int ; exception XmNhistoryItems of XmString list ; exception XmNhistoryMaxItems of int ; exception XmNhistoryVisibleItemCount of int ; exception XmNhorizontalScrollBar of Widget ; exception XmNhorizontalSpacing of int ; exception XmNiconMask of Drawable ; exception XmNiconName of string ; exception XmNiconNameEncoding of int ; exception XmNiconPixmap of Drawable ; exception XmNiconWindow of Drawable ; exception XmNiconX of int ; exception XmNiconY of int ; exception XmNiconic of bool ; exception XmNincrement of int ; exception XmNindicatorOn of bool ; exception XmNindicatorSize of int ; exception XmNindicatorType of XmIndicatorType ; exception XmNinitialDelay of int ; exception XmNinitialResourcesPersistent of bool ; exception XmNinitialState of XWMStateHint ; exception XmNinput of bool ; exception XmNisAligned of bool ; exception XmNisHomogeneous of bool ; exception XmNitemCount of int ; exception XmNitems of XmString list ; exception XmNkeyboardFocusPolicy of XmKeyboardFocusPolicy ; exception XmNlabelFontList of (XFontStruct * string) list ; exception XmNlabelInsensitivePixmap of Drawable ; exception XmNlabelPixmap of Drawable ; exception XmNlabelString of XmString ; exception XmNlabelType of XmLabelType ; exception XmNleftAttachment of XmAttachment ; exception XmNleftOffset of int ; exception XmNleftPosition of int ; exception XmNleftWidget of Widget ; exception XmNlistItemCount of int ; exception XmNlistItems of XmString list ; exception XmNlistLabelString of XmString ; exception XmNlistMarginHeight of int ; exception XmNlistMarginWidth of int ; exception XmNlistSizePolicy of XmVisualPolicy ; exception XmNlistSpacing of int ; exception XmNlistUpdated of bool ; exception XmNlistVisibleItemCount of int ; exception XmNmainWindowMarginHeight of int ; exception XmNmainWindowMarginWidth of int ; exception XmNmappedWhenManaged of bool ; exception XmNmappingDelay of int ; exception XmNmargin of int ; exception XmNmarginBottom of int ; exception XmNmarginHeight of int ; exception XmNmarginLeft of int ; exception XmNmarginRight of int ; exception XmNmarginTop of int ; exception XmNmarginWidth of int ; exception XmNmaxAspectX of int ; exception XmNmaxAspectY of int ; exception XmNmaxHeight of int ; exception XmNmaxLength of int ; exception XmNmaxWidth of int ; exception XmNmaximum of int ; exception XmNmenuAccelerator of string ; exception XmNmenuBar of Widget ; exception XmNmenuCursor of Cursor ; exception XmNmenuHelpWidget of Widget ; exception XmNmenuHistory of Widget ; exception XmNmenuPost of string ; exception XmNmessageAlignment of XmAlignment ; exception XmNmessageString of XmString ; exception XmNmessageWindow of Widget ; exception XmNminAspectX of int ; exception XmNminAspectY of int ; exception XmNminHeight of int ; exception XmNminWidth of int ; exception XmNminimizeButtons of bool ; exception XmNminimum of int ; exception XmNmnemonic of int ; exception XmNmnemonicCharSet of string ; exception XmNmultiClick of XmMultiClickType ; exception XmNmustMatch of bool ; exception XmNmwmDecorations of int ; exception XmNmwmFunctions of int ; exception XmNmwmInputMode of int ; exception XmNmwmMenu of string ; exception XmNnavigationType of XmNavigationType ; exception XmNnoMatchString of XmString ; exception XmNnoResize of bool ; exception XmNnumChildren of int ; exception XmNnumColumns of int ; exception XmNokLabelString of XmString ; exception XmNoptionLabel of XmString ; exception XmNoptionMnemonic of int ; exception XmNorientation of XmOrientation ; exception XmNoverrideRedirect of bool ; exception XmNpacking of XmPacking ; exception XmNpageIncrement of int ; exception XmNpaneMaximum of int ; exception XmNpaneMinimum of int ; exception XmNpattern of XmString ; exception XmNpendingDelete of bool ; exception XmNpopupEnabled of bool ; exception XmNpostFromButton of int ; exception XmNprocessingDirection of XmProcessingDirection ; exception XmNpromptString of XmString ; exception XmNpushButtonEnabled of bool ; exception XmNradioAlwaysOne of bool ; exception XmNradioBehavior of bool ; exception XmNrecomputeSize of bool ; exception XmNrefigureMode of bool ; exception XmNrepeatDelay of int ; exception XmNresizable of bool ; exception XmNresizeHeight of bool ; exception XmNresizePolicy of XmResizePolicy ; exception XmNresizeWidth of bool ; exception XmNrightAttachment of XmAttachment ; exception XmNrightOffset of int ; exception XmNrightPosition of int ; exception XmNrightWidget of Widget ; exception XmNrowColumnType of XmRowColumnType ; exception XmNrows of int ; exception XmNrubberPositioning of bool ; exception XmNsashHeight of int ; exception XmNsashIndent of int ; exception XmNsashShadowThickness of int ; exception XmNsashWidth of int ; exception XmNsaveUnder of bool ; exception XmNscaleHeight of int ; exception XmNscaleMultiple of int ; exception XmNscaleWidth of int ; exception XmNscrollBarDisplayPolicy of XmScrollBarDisplayPolicy ; exception XmNscrollBarPlacement of XmScrollBarPlacement ; exception XmNscrollHorizontal of bool ; exception XmNscrollLeftSide of bool ; exception XmNscrollTopSide of bool ; exception XmNscrollVertical of bool ; exception XmNscrolledWindowMarginHeight of int ; exception XmNscrolledWindowMarginWidth of int ; exception XmNscrollingPolicy of XmScrollingPolicy ; exception XmNselectColor of int ; exception XmNselectInsensitivePixmap of Drawable ; exception XmNselectPixmap of Drawable ; exception XmNselectThreshold of int ; exception XmNselectedItemCount of int ; exception XmNselectedItems of XmString list ; exception XmNselectionArray of XmTextScanType list ; exception XmNselectionArrayCount of int ; exception XmNselectionLabelString of XmString ; exception XmNselectionPolicy of XmSelectionPolicy ; exception XmNsensitive of bool ; exception XmNseparatorOn of bool ; exception XmNseparatorType of XmShadowType ; exception XmNset of bool ; exception XmNshadowThickness of int ; exception XmNshadowType of XmShadowType ; exception XmNshellUnitType of XmUnitType ; exception XmNshowArrows of bool ; exception XmNshowAsDefault of int ; exception XmNshowSeparator of bool ; exception XmNshowValue of bool ; exception XmNskipAdjust of bool ; exception XmNsliderSize of int ; exception XmNspacing of int ; exception XmNstringDirection of XmStringDirection ; exception XmNsubMenuId of Widget ; exception XmNsymbolPixmap of Drawable ; exception XmNtextAccelerators of XtAccelerators ; exception XmNtextColumns of int ; exception XmNtextFontList of (XFontStruct * string) list ; exception XmNtextString of XmString ; exception XmNtextTranslations of XtTranslations ; exception XmNtitle of string ; exception XmNtitleEncoding of int ; exception XmNtitleString of XmString ; exception XmNtopAttachment of XmAttachment ; exception XmNtopCharacter of int ; exception XmNtopItemPosition of int ; exception XmNtopOffset of int ; exception XmNtopPosition of int ; exception XmNtopShadowColor of int ; exception XmNtopShadowPixmap of Drawable ; exception XmNtopWidget of Widget ; exception XmNtransient of bool ; exception XmNtransientFor of Widget ; exception XmNtranslations of XtTranslations ; exception XmNtraversalOn of bool ; exception XmNtroughColor of int ; exception XmNunitType of XmUnitType ; exception XmNuseAsyncGeometry of bool ; exception XmNvalue of int ; exception XmNverifyBell of bool ; exception XmNverticalScrollBar of Widget ; exception XmNverticalSpacing of int ; exception XmNvisibleItemCount of int ; exception XmNvisibleWhenOff of bool ; exception XmNvisual of Visual ; exception XmNvisualPolicy of XmVisualPolicy ; exception XmNwaitForWm of bool ; exception XmNwidth of int ; exception XmNwidthInc of int ; exception XmNwinGravity of int ; exception XmNwindowGroup of Drawable ; exception XmNwmTimeout of int ; exception XmNwordWrap of bool ; exception XmNworkWindow of Widget ; exception XmNx of int ; exception XmNy of int ; val XmCAccelerator = "Accelerator" ; val XmCAcceleratorText = "AcceleratorText" ; val XmCAccelerators = "Accelerators" ; val XmCAdjustLast = "AdjustLast" ; val XmCAdjustMargin = "AdjustMargin" ; val XmCAlignment = "Alignment" ; val XmCAllowOverlap = "AllowOverlap" ; val XmCAllowShellResize = "AllowShellResize" ; val XmCApplyLabelString = "ApplyLabelString" ; val XmCArgc = "Argc" ; val XmCArgv = "Argv" ; val XmCArmColor = "ArmColor" ; val XmCArmPixmap = "ArmPixmap" ; val XmCArrowDirection = "ArrowDirection" ; val XmCAttachment = "Attachment" ; val XmCAutoShowCursorPosition = "AutoShowCursorPosition" ; val XmCAutoUnmanage = "AutoUnmanage" ; val XmCAutomaticSelection = "AutomaticSelection" ; val XmCBackground = "Background" ; val XmCBackgroundPixmap = "BackgroundPixmap" ; val XmCBaseHeight = "BaseHeight" ; val XmCBaseWidth = "BaseWidth" ; val XmCBlinkRate = "BlinkRate" ; val XmCBoolean = "Boolean" ; val XmCBorderColor = "BorderColor" ; val XmCBorderWidth = "BorderWidth" ; val XmCBottomShadowColor = "BottomShadowColor" ; val XmCBottomShadowPixmap = "BottomShadowPixmap" ; val XmCButtonAcceleratorText = "ButtonAcceleratorText" ; val XmCButtonAccelerators = "ButtonAccelerators" ; val XmCButtonCount = "ButtonCount" ; val XmCButtonFontList = "ButtonFontList" ; val XmCButtonMnemonicCharSets = "ButtonMnemonicCharSets" ; val XmCButtonMnemonics = "ButtonMnemonics" ; val XmCButtonSet = "ButtonSet" ; val XmCButtonType = "ButtonType" ; val XmCButtons = "Buttons" ; val XmCCancelLabelString = "CancelLabelString" ; val XmCChildren = "Children" ; val XmCClipWindow = "ClipWindow" ; val XmCColormap = "Colormap" ; val XmCColumns = "Columns" ; val XmCCommandWindow = "CommandWindow" ; val XmCCommandWindowLocation = "CommandWindowLocation" ; val XmCCursor = "Cursor" ; val XmCCursorPosition = "CursorPosition" ; val XmCCursorPositionVisible = "CursorPositionVisible" ; val XmCDecimalPoints = "DecimalPoints" ; val XmCDefaultButtonShadowThickness = "DefaultButtonShadowThickness" ; val XmCDefaultButtonType = "DefaultButtonType" ; val XmCDefaultFontList = "DefaultFontList" ; val XmCDefaultPosition = "DefaultPosition" ; val XmCDeleteResponse = "DeleteResponse" ; val XmCDepth = "Depth" ; val XmCDialogStyle = "DialogStyle" ; val XmCDialogTitle = "DialogTitle" ; val XmCDialogType = "DialogType" ; val XmCDirListItemCount = "DirListItemCount" ; val XmCDirListItems = "DirListItems" ; val XmCDirListLabelString = "DirListLabelString" ; val XmCDirMask = "DirMask" ; val XmCDirSpec = "DirSpec" ; val XmCDirectory = "Directory" ; val XmCDirectoryValid = "DirectoryValid" ; val XmCDoubleClickInterval = "DoubleClickInterval" ; val XmCEditMode = "EditMode" ; val XmCEditable = "Editable" ; val XmCEntryBorder = "EntryBorder" ; val XmCFileListItemCount = "FileListItemCount" ; val XmCFileListItems = "FileListItems" ; val XmCFileListLabelString = "FileListLabelString" ; val XmCFileTypeMask = "FileTypeMask" ; val XmCFillOnArm = "FillOnArm" ; val XmCFillOnSelect = "FillOnSelect" ; val XmCFilterLabelString = "FilterLabelString" ; val XmCFontList = "FontList" ; val XmCForeground = "Foreground" ; val XmCFraction = "Fraction" ; val XmCGeometry = "Geometry" ; val XmCHeight = "Height" ; val XmCHeightInc = "HeightInc" ; val XmCHelpLabelString = "HelpLabelString" ; val XmCHighlightColor = "HighlightColor" ; val XmCHighlightOnEnter = "HighlightOnEnter" ; val XmCHighlightPixmap = "HighlightPixmap" ; val XmCHighlightThickness = "HighlightThickness" ; val XmCHorizontalScrollBar = "HorizontalScrollBar" ; val XmCIconMask = "IconMask" ; val XmCIconName = "IconName" ; val XmCIconNameEncoding = "IconNameEncoding" ; val XmCIconPixmap = "IconPixmap" ; val XmCIconWindow = "IconWindow" ; val XmCIconX = "IconX" ; val XmCIconY = "IconY" ; val XmCIconic = "Iconic" ; val XmCIncrement = "Increment" ; val XmCIndicatorOn = "IndicatorOn" ; val XmCIndicatorSize = "IndicatorSize" ; val XmCIndicatorType = "IndicatorType" ; val XmCInitialDelay = "InitialDelay" ; val XmCInitialResourcesPersistent = "InitialResourcesPersistent" ; val XmCInitialState = "InitialState" ; val XmCInput = "Input" ; val XmCIsAligned = "IsAligned" ; val XmCIsHomogeneous = "IsHomogeneous" ; val XmCItemCount = "ItemCount" ; val XmCItems = "Items" ; val XmCKeyboardFocusPolicy = "KeyboardFocusPolicy" ; val XmCLabelFontList = "LabelFontList" ; val XmCLabelInsensitivePixmap = "LabelInsensitivePixmap" ; val XmCLabelPixmap = "LabelPixmap" ; val XmCLabelString = "LabelString" ; val XmCLabelType = "LabelType" ; val XmCListLabelString = "ListLabelString" ; val XmCListMarginHeight = "ListMarginHeight" ; val XmCListMarginWidth = "ListMarginWidth" ; val XmCListSizePolicy = "ListSizePolicy" ; val XmCListSpacing = "ListSpacing" ; val XmCListUpdated = "ListUpdated" ; val XmCMainWindowMarginHeight = "MainWindowMarginHeight" ; val XmCMainWindowMarginWidth = "MainWindowMarginWidth" ; val XmCMappedWhenManaged = "MappedWhenManaged" ; val XmCMappingDelay = "MappingDelay" ; val XmCMargin = "Margin" ; val XmCMarginBottom = "MarginBottom" ; val XmCMarginHeight = "MarginHeight" ; val XmCMarginLeft = "MarginLeft" ; val XmCMarginRight = "MarginRight" ; val XmCMarginTop = "MarginTop" ; val XmCMarginWidth = "MarginWidth" ; val XmCMaxAspectX = "MaxAspectX" ; val XmCMaxAspectY = "MaxAspectY" ; val XmCMaxHeight = "MaxHeight" ; val XmCMaxItems = "MaxItems" ; val XmCMaxLength = "MaxLength" ; val XmCMaxWidth = "MaxWidth" ; val XmCMaximum = "Maximum" ; val XmCMenuBar = "MenuBar" ; val XmCMenuPost = "MenuPost" ; val XmCMenuWidget = "MenuWidget" ; val XmCMessageString = "MessageString" ; val XmCMessageWindow = "MessageWindow" ; val XmCMinAspectX = "MinAspectX" ; val XmCMinAspectY = "MinAspectY" ; val XmCMinHeight = "MinHeight" ; val XmCMinWidth = "MinWidth" ; val XmCMinimizeButtons = "MinimizeButtons" ; val XmCMinimum = "Minimum" ; val XmCMnemonic = "Mnemonic" ; val XmCMnemonicCharSet = "MnemonicCharSet" ; val XmCMultiClick = "MultiClick" ; val XmCMustMatch = "MustMatch" ; val XmCMwmDecorations = "MwmDecorations" ; val XmCMwmFunctions = "MwmFunctions" ; val XmCMwmInputMode = "MwmInputMode" ; val XmCMwmMenu = "MwmMenu" ; val XmCNavigationType = "NavigationType" ; val XmCNoMatchString = "NoMatchString" ; val XmCNoResize = "NoResize" ; val XmCNumChildren = "NumChildren" ; val XmCNumColumns = "NumColumns" ; val XmCOffset = "Offset" ; val XmCOkLabelString = "OkLabelString" ; val XmCOptionLabel = "OptionLabel" ; val XmCOptionMnemonic = "OptionMnemonic" ; val XmCOrientation = "Orientation" ; val XmCOverrideRedirect = "OverrideRedirect" ; val XmCPacking = "Packing" ; val XmCPageIncrement = "PageIncrement" ; val XmCPaneMaximum = "PaneMaximum" ; val XmCPaneMinimum = "PaneMinimum" ; val XmCPattern = "Pattern" ; val XmCPendingDelete = "PendingDelete" ; val XmCPixmap = "Pixmap" ; val XmCPopupEnabled = "PopupEnabled" ; val XmCPosition = "Position" ; val XmCPostFromButton = "PostFromButton" ; val XmCProcessingDirection = "ProcessingDirection" ; val XmCPromptString = "PromptString" ; val XmCPushButtonEnabled = "PushButtonEnabled" ; val XmCRadioAlwaysOne = "RadioAlwaysOne" ; val XmCRadioBehavior = "RadioBehavior" ; val XmCRecomputeSize = "RecomputeSize" ; val XmCRepeatDelay = "RepeatDelay" ; val XmCResizeHeight = "ResizeHeight" ; val XmCResizePolicy = "ResizePolicy" ; val XmCResizeWidth = "ResizeWidth" ; val XmCRowColumnType = "RowColumnType" ; val XmCRows = "Rows" ; val XmCRubberPositioning = "RubberPositioning" ; val XmCSashHeight = "SashHeight" ; val XmCSashIndent = "SashIndent" ; val XmCSashWidth = "SashWidth" ; val XmCSaveUnder = "SaveUnder" ; val XmCScaleHeight = "ScaleHeight" ; val XmCScaleMultiple = "ScaleMultiple" ; val XmCScaleWidth = "ScaleWidth" ; val XmCScroll = "Scroll" ; val XmCScrollBarDisplayPolicy = "ScrollBarDisplayPolicy" ; val XmCScrollBarPlacement = "ScrollBarPlacement" ; val XmCScrollSide = "ScrollSide" ; val XmCScrolledWindowMarginHeight = "ScrolledWindowMarginHeight" ; val XmCScrolledWindowMarginWidth = "ScrolledWindowMarginWidth" ; val XmCScrollingPolicy = "ScrollingPolicy" ; val XmCSelectColor = "SelectColor" ; val XmCSelectInsensitivePixmap = "SelectInsensitivePixmap" ; val XmCSelectPixmap = "SelectPixmap" ; val XmCSelectThreshold = "SelectThreshold" ; val XmCSelectedItemCount = "SelectedItemCount" ; val XmCSelectedItems = "SelectedItems" ; val XmCSelectionArray = "SelectionArray" ; val XmCSelectionArrayCount = "SelectionArrayCount" ; val XmCSelectionLabelString = "SelectionLabelString" ; val XmCSelectionPolicy = "SelectionPolicy" ; val XmCSensitive = "Sensitive" ; val XmCSeparatorOn = "SeparatorOn" ; val XmCSeparatorType = "SeparatorType" ; val XmCSet = "Set" ; val XmCShadowThickness = "ShadowThickness" ; val XmCShadowType = "ShadowType" ; val XmCShellUnitType = "ShellUnitType" ; val XmCShowArrows = "ShowArrows" ; val XmCShowAsDefault = "ShowAsDefault" ; val XmCShowSeparator = "ShowSeparator" ; val XmCShowValue = "ShowValue" ; val XmCSliderSize = "SliderSize" ; val XmCSpacing = "Spacing" ; val XmCStringDirection = "StringDirection" ; val XmCTextFontList = "TextFontList" ; val XmCTextPosition = "TextPosition" ; val XmCTextString = "TextString" ; val XmCTitle = "Title" ; val XmCTitleEncoding = "TitleEncoding" ; val XmCTitleString = "TitleString" ; val XmCTopItemPosition = "TopItemPosition" ; val XmCTopShadowColor = "TopShadowColor" ; val XmCTopShadowPixmap = "TopShadowPixmap" ; val XmCTransient = "Transient" ; val XmCTransientFor = "TransientFor" ; val XmCTranslations = "Translations" ; val XmCTraversalOn = "TraversalOn" ; val XmCTroughColor = "TroughColor" ; val XmCUnitType = "UnitType" ; val XmCUseAsyncGeometry = "UseAsyncGeometry" ; val XmCValue = "Value" ; val XmCVerifyBell = "VerifyBell" ; val XmCVerticalScrollBar = "VerticalScrollBar" ; val XmCVisibleItemCount = "VisibleItemCount" ; val XmCVisibleWhenOff = "VisibleWhenOff" ; val XmCVisual = "Visual" ; val XmCVisualPolicy = "VisualPolicy" ; val XmCWaitForWm = "WaitForWm" ; val XmCWidget = "Widget" ; val XmCWidth = "Width" ; val XmCWidthInc = "WidthInc" ; val XmCWinGravity = "WinGravity" ; val XmCWindowGroup = "WindowGroup" ; val XmCWmTimeout = "WmTimeout" ; val XmCWordWrap = "WordWrap" ; val XmCWorkWindow = "WorkWindow" ; val XmCX = "X" ; val XmCY = "Y" ; end (* local *) ; end (* struct *) ; polyml-5.6/mlsource/extra/Motif/initialClasses.awk000066400000000000000000000002151265146633400224150ustar00rootroot00000000000000/NOT SUPPORTED/ { exit } { if ( NF >= 2 && $3 != "(callback)" ) { printf ("val %s = \"%s\" ;\n",$2,substr($2,4,length($2)-3)) ; } } polyml-5.6/mlsource/extra/Motif/makeClasses.awk000066400000000000000000000001621265146633400217020ustar00rootroot00000000000000/NOT SUPPORTED/ { exit } { if ( NF >= 2 && $3 != "(callback)" ) { printf ("val %s: string ;\n",$2) ; } } polyml-5.6/mlsource/extra/Motif/makeExceptions.awk000066400000000000000000000011121265146633400224220ustar00rootroot00000000000000/NOT SUPPORTED/ { exit } { if ( NF >= 2 && $3 != "(callback)" ) { if ( $3 == "Atom" ) $3 = "int" ; if ( $3 == "Cardinal" ) $3 = "int" ; if ( $3 == "Dimension" ) $3 = "int" ; if ( $3 == "KeySym" ) $3 = "int" ; if ( $3 == "Pixel" ) $3 = "int" ; if ( $3 == "Position" ) $3 = "int" ; if ( $3 == "XmTextPosition" ) $3 = "int" ; if ( $3 == "short" ) $3 = "int" ; if ( $4 == "list" ) printf ("exception %s of %s list ;\n",$1,$3) ; else printf ("exception %s of %s ;\n",$1,$3) ; } } polyml-5.6/mlsource/extra/Motif/makeInitials.awk000066400000000000000000000065011265146633400220640ustar00rootroot00000000000000/NOT SUPPORTED/ { exit } { if ( NF >= 2 && $3 != "(callback)" ) { type = "unknown" ; if ( $3 =="Atom" ) type = "XmRAtom" ; if ( $3 =="Cardinal" ) type = "XmRCardinal" ; if ( $3 =="Colormap" ) type = "XmRColormap" ; if ( $3 =="Cursor" ) type = "XmRCursor" ; if ( $3 =="Dimension" ) type = "XmRDimension" ; if ( $3 =="Drawable" ) type = "XmRPixmap" ; if ( $3 =="KeySym" ) type = "XmRKeySym" ; if ( $3 =="KeySym" && $4 == "list" ) type = "XmRKeySymTable" ; if ( $3 =="Pixel" ) type = "XmRPixel" ; if ( $3 =="Position" ) type = "XmRPosition" ; if ( $3 =="Visual" ) type = "XmRVisual" ; if ( $3 =="Widget" ) type = "XmRWidget" ; if ( $3 =="Widget" && $4 == "list" ) type = "XmRWidgetList" ; if ( $3 =="XFontStruct" && $4 == "list" ) type = "XmRFontList" ; if ( $3 =="XWMStateHint" ) type = "XmRInitialState" ; if ( $3 =="XtAccelerators" ) type = "XmRAcceleratorTable" ; if ( $3 =="XmAlignment" ) type = "XmRAlignment" ; if ( $3 =="XmArrowDirection" ) type = "XmRArrowDirection" ; if ( $3 =="XmAttachment" ) type = "XmRAttachment" ; if ( $3 =="XmButtonType" && $4 == "list" ) type = "XmRButtonTypeTable" ; if ( $3 =="XmCommandWindowLocation" ) type = "XmRCommandWindowLocation" ; if ( $3 =="XmDefaultButtonType" ) type = "XmRDefaultButtonType" ; if ( $3 =="XmDeleteResponse" ) type = "XmRDeleteResponse" ; if ( $3 =="XmDialogStyle" ) type = "XmRDialogStyle" ; if ( $3 =="XmDialogType" ) type = "XmRDialogType" ; if ( $3 =="XmEditMode" ) type = "XmREditMode" ; if ( $3 =="XmFileTypeMask" ) type = "XmRFileTypeMask" ; if ( $3 =="XmIndicatorType" ) type = "XmRIndicatorType" ; if ( $3 =="XmKeyboardFocusPolicy" ) type = "XmRKeyboardFocusPolicy" ; if ( $3 =="XmLabelType" ) type = "XmRLabelType" ; if ( $3 =="XmMultiClickType" ) type = "XmRMultiClick" ; if ( $3 =="XmNavigationType" ) type = "XmRNavigationType" ; if ( $3 =="XmOrientation" ) type = "XmROrientation" ; if ( $3 =="XmPacking" ) type = "XmRPacking" ; if ( $3 =="XmProcessingDirection" ) type = "XmRProcessingDirection" ; if ( $3 =="XmResizePolicy" ) type = "XmRResizePolicy" ; if ( $3 =="XmRowColumnType" ) type = "XmRRowColumnType" ; if ( $3 =="XmScrollBarDisplayPolicy" ) type = "XmRScrollBarDisplayPolicy" ; if ( $3 =="XmScrollBarPlacement" ) type = "XmRScrollBarPlacement" ; if ( $3 =="XmScrollingPolicy" ) type = "XmRScrollingPolicy" ; if ( $3 =="XmSelectionPolicy" ) type = "XmRSelectionPolicy" ; if ( $3 =="XmShadowType" ) type = "XmRShadowType" ; if ( $3 =="XmString" ) type = "XmRXmString" ; if ( $3 =="XmString" && $4 == "list" ) type = "XmRXmStringTable" ; if ( $3 =="XmStringDirection" ) type = "XmRStringDirection" ; if ( $3 =="XmTextPosition" ) type = "XmRInt" ; if ( $3 =="XmTextScanType" && $4 == "list" ) type = "XmRTextScanTypeTable" ; if ( $3 =="XmUnitType" ) type = "XmRUnitType" ; if ( $3 =="XmVisualPolicy" ) type = "XmRVisualPolicy" ; if ( $3 =="XtTranslations" ) type = "XmRTranslationTable" ; if ( $3 =="bool" ) type = "XmRBool" ; if ( $3 =="int" ) type = "XmRInt" ; if ( $3 =="short" ) type = "XmRShort" ; if ( $3 =="string" ) type = "XmRString" ; if ( $3 =="string" && $4 == "list" ) type = "XmRStringTable" ; printf ("val U = XtSetExceptionType %s %s ;\n",$1,type) } } polyml-5.6/mlsource/extra/Motif/makeXmNs000066400000000000000000000040331265146633400204120ustar00rootroot00000000000000# echo "signature XM_TYPES = sig" > XM_TYPES.ML echo "include MOTIF_TYPES ;" >> XM_TYPES.ML echo "local open XWINDOWS in" >> XM_TYPES.ML awk -f makeExceptions.awk < XmNs.doc | align_of >> XM_TYPES.ML awk -f makeClasses.awk < XmNs.doc | align_types | sort | uniq >> XM_TYPES.ML echo "end (* local *) ;" >> XM_TYPES.ML echo "end (* sig *) ;" >> XM_TYPES.ML echo "structure XmTypes = struct" > XmTypes.ML echo "local open MotifTypes XWindows in" >> XmTypes.ML awk -f makeExceptions.awk < XmNs.doc | align_of >> XmTypes.ML awk -f initialClasses.awk < XmNs.doc | align_equals | sort | uniq >> XmTypes.ML echo "end (* local *) ;" >> XmTypes.ML echo "end (* struct *) ;" >> XmTypes.ML echo "structure InitialiseCore = struct" > InitialiseCore.ML echo "local open MotifTypes XmTypes MotifCore in" >> InitialiseCore.ML awk -f makeInitials.awk < XmNs.doc >> InitialiseCore.ML echo "end (* local *) ;" >> InitialiseCore.ML echo "end (* struct *) ;" >> InitialiseCore.ML exit echo "signature XM_TYPES = sig" > XM_TYPES.ML echo "include MOTIF_TYPES ;" >> XM_TYPES.ML echo "local open XWINDOWS in" >> XM_TYPES.ML awk -f makeDatatype.awk < XmNs.doc | align_of >> XM_TYPES.ML echo "end (* local *) ;" >> XM_TYPES.ML echo "end (* sig *) ;" >> XM_TYPES.ML echo "structure XmTypes = struct" > XmTypes.ML echo "local open MotifTypes XWindows in" >> XmTypes.ML awk -f makeDatatype.awk < XmNs.doc | align_of >> XmTypes.ML echo "end (* local *) ;" >> XmTypes.ML echo "end (* struct *) ;" >> XmTypes.ML polyml-5.6/mlsource/extra/Motif/ml_bind.ML000066400000000000000000000721471265146633400206150ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Motif: MOTIF_SIG = struct open MotifTypes; open XmTypes; open MotifCore; local open XWindows; open XCall; open InitialiseCore; in (******************************************************************************) (* *) (* A few Xt operations *) (* *) (******************************************************************************) val NoWidget:Widget = xcall (XCALL_NoWidget,0); fun WidgetID (w:Widget):int = xcall (XCALL_GetID,w); fun WidgetExists (w:Widget):bool = xcall (XCALL_ResourceExists,w); fun XtParseTranslationTable (s:string):XtTranslations = xcall (XCALL_XtParseTranslationTable,s); fun XtOverrideTranslations (w:Widget) (t:XtTranslations):unit = xcall (XCALL_XtOverrideTranslations,w,t); fun XtAugmentTranslations (w:Widget) (t:XtTranslations):unit = xcall (XCALL_XtAugmentTranslations,w,t); fun XtUninstallTranslations (w:Widget):unit = xcall (XCALL_XtUninstallTranslations,w); (* SPF 14/2/94 not currently supported by run-time ... fun XtTranslateTablePrint (t:XtTranslations):unit = xcall (XCALL_XtTranslateTablePrint,t); ... *) fun XtTranslateTablePrint (t:XtTranslations):unit = raise XWindows "XtTranslateTablePrint: not supported"; fun XtParent (w:Widget):Widget = xcall (XCALL_XtParent,w); fun XtWindow (w:Widget):Drawable = xcall (XCALL_XtWindow,w); fun XtDisplay (w:Widget):Display = xcall (XCALL_XtDisplay,w); fun XtName (w:Widget):string = xcall (XCALL_XtName,w); fun XtAppInitialise (D:string) (A:string) (C:string) (F:string list) (L:Arg list):Widget = let val shell = xcall (XCALL_AppInitialise,D,A,C,F,XtSetExnVals L); val display = XtDisplay shell; in XStartDisplayHandler display; shell end; fun XtCreatePopupShell (name:string) (parent:Widget) (L:Arg list):Widget = xcall (XCALL_XtCreatePopupShell,name,parent,XtSetExnVals L); fun XtRealizeWidget (w:Widget):unit = xcall (XCALL_XtRealizeWidget,w); fun XtUnrealizeWidget (w:Widget):unit = xcall (XCALL_XtUnrealizeWidget,w); fun XtDestroyWidget (w:Widget):unit = xcall (XCALL_XtDestroyWidget,w); fun XtManageChildren (L:Widget list):unit = xcall (XCALL_XtManageChildren,L); fun XtUnmanageChildren (L:Widget list):unit = xcall (XCALL_XtUnmanageChildren,L); fun XtManageChild w = XtManageChildren [w]; fun XtUnmanageChild w = XtUnmanageChildren [w]; fun XtSetValues (w:Widget) (L:Arg list):unit = xcall (XCALL_XtSetValues,w,XtSetExnVals L); fun XtSetValue w a = XtSetValues w [a]; fun XtGetValues w = map (XtGetValue w); (******************************************************************************) (* *) (* A few more Xt operations (SPF 6/12/94, 19/1/95) *) (* *) (******************************************************************************) datatype XtGrabKind = XtGrabNone | XtGrabNonexclusive | XtGrabExclusive; fun XtPopup (w: Widget) XtGrabNone : unit = xcall (XCALL_XtPopup,w,0) | XtPopup (w: Widget) XtGrabNonexclusive : unit = xcall (XCALL_XtPopup,w,1) | XtPopup (w: Widget) XtGrabExclusive : unit = xcall (XCALL_XtPopup,w,2); fun XtPopdown (w: Widget) : unit = xcall (XCALL_XtPopdown,w); fun XtMapWidget (w: Widget) : unit = xcall (XCALL_XtMapWidget,w); fun XtUnmapWidget (w: Widget) : unit = xcall (XCALL_XtUnmapWidget,w); fun XtIsManaged (w:Widget):bool = xcall (XCALL_XtIsManaged,w); fun XtIsRealized (w:Widget):bool = xcall (XCALL_XtIsRealized,w); (******************************************************************************) (* *) (* Motif Callbacks *) (* *) (******************************************************************************) datatype XtCallback = XmNactivateCallback | XmNapplyCallback | XmNarmCallback | XmNbrowseSelectionCallback | XmNcancelCallback | XmNcascadingCallback | XmNcommandChangedCallback | XmNcommandEnteredCallback | XmNdecrementCallback | XmNdefaultActionCallback | XmNdestroyCallback | XmNdisarmCallback | XmNdragCallback | XmNentryCallback | XmNexposeCallback | XmNextendedSelectionCallback | XmNfocusCallback | XmNgainPrimaryCallback | XmNhelpCallback | XmNincrementCallback | XmNinputCallback | XmNlosePrimaryCallback | XmNlosingFocusCallback | XmNmapCallback | XmNmessageCallback (* this callback gets Message XEvents only *) | XmNmodifyVerifyCallback | XmNmotionVerifyCallback | XmNmultipleSelectionCallback | XmNnoMatchCallback | XmNokCallback | XmNpageDecrementCallback | XmNpageIncrementCallback | XmNpopdownCallback | XmNpopupCallback | XmNresizeCallback | XmNsimpleCallback | XmNsingleSelectionCallback | XmNtoBottomCallback | XmNtoTopCallback | XmNunmapCallback | XmNvalueChangedCallback; local fun Name XmNactivateCallback = "activateCallback" | Name XmNapplyCallback = "applyCallback" | Name XmNarmCallback = "armCallback" | Name XmNbrowseSelectionCallback = "browseSelectionCallback" | Name XmNcancelCallback = "cancelCallback" | Name XmNcascadingCallback = "cascadingCallback" | Name XmNcommandChangedCallback = "commandChangedCallback" | Name XmNcommandEnteredCallback = "commandEnteredCallback" | Name XmNdecrementCallback = "decrementCallback" | Name XmNdefaultActionCallback = "defaultActionCallback" | Name XmNdestroyCallback = "destroyCallback" | Name XmNdisarmCallback = "disarmCallback" | Name XmNdragCallback = "dragCallback" | Name XmNentryCallback = "entryCallback" | Name XmNexposeCallback = "exposeCallback" | Name XmNextendedSelectionCallback = "extendedSelectionCallback" | Name XmNfocusCallback = "focusCallback" | Name XmNgainPrimaryCallback = "gainPrimaryCallback" | Name XmNhelpCallback = "helpCallback" | Name XmNincrementCallback = "incrementCallback" | Name XmNinputCallback = "inputCallback" | Name XmNlosePrimaryCallback = "losePrimaryCallback" | Name XmNlosingFocusCallback = "losingFocusCallback" | Name XmNmapCallback = "mapCallback" | Name XmNmessageCallback = "messageCallback" | Name XmNmodifyVerifyCallback = "modifyVerifyCallback" | Name XmNmotionVerifyCallback = "motionVerifyCallback" | Name XmNmultipleSelectionCallback = "multipleSelectionCallback" | Name XmNnoMatchCallback = "noMatchCallback" | Name XmNokCallback = "okCallback" | Name XmNpageDecrementCallback = "pageDecrementCallback" | Name XmNpageIncrementCallback = "pageIncrementCallback" | Name XmNpopdownCallback = "popdownCallback" | Name XmNpopupCallback = "popupCallback" | Name XmNresizeCallback = "resizeCallback" | Name XmNsimpleCallback = "simpleCallback" | Name XmNsingleSelectionCallback = "singleSelectionCallback" | Name XmNtoBottomCallback = "toBottomCallback" | Name XmNtoTopCallback = "toTopCallback" | Name XmNunmapCallback = "unmapCallback" | Name XmNvalueChangedCallback = "valueChangedCallback"; in fun XtSetCallbacks (w:Widget) (L:(XtCallback * (Widget * 'a XEvent * '_b -> '_b)) list) (initialState:'_b) = let fun NameCallbacks [] = [] | NameCallbacks ((c,f)::T) = (Name c,f) :: NameCallbacks T; datatype 'a option = None | Some of 'a; fun FindMessageCallback [] = None | FindMessageCallback ((XmNmessageCallback,f)::_) = Some f | FindMessageCallback (_::T) = FindMessageCallback T; val M = FindMessageCallback L; in xcall (XCALL_SetCallbacks,w,NameCallbacks L,initialState); fn (ms:int) => fn (alpha:'a) => case M of Some f => xcall (XCALL_InsertWidgetTimeout,w,ms,alpha,f) | None => () end; end; fun XtSetSensitive (w:Widget) (s:bool):unit = xcall (XCALL_XtSetSensitive,w,s); fun XtIsSensitive (w:Widget):bool = xcall (XCALL_XtIsSensitive,w); (******************************************************************************) (* *) (* Motif Widget Creation Routines *) (* *) (******************************************************************************) local fun CreateXm (n:int) (p:Widget) (s:string) (L:Arg list):Widget = xcall (n,p,s,XtSetExnVals L); in val XmCreateArrowButton = CreateXm XCALL_XmCreateArrowButton; val XmCreateArrowButtonGadget = CreateXm XCALL_XmCreateArrowButtonGadget; val XmCreateBulletinBoard = CreateXm XCALL_XmCreateBulletinBoard; val XmCreateBulletinBoardDialog = CreateXm XCALL_XmCreateBulletinBoardDialog; val XmCreateCascadeButton = CreateXm XCALL_XmCreateCascadeButton; val XmCreateCascadeButtonGadget = CreateXm XCALL_XmCreateCascadeButtonGadget; val XmCreateCommand = CreateXm XCALL_XmCreateCommand; val XmCreateDialogShell = CreateXm XCALL_XmCreateDialogShell; val XmCreateDrawingArea = CreateXm XCALL_XmCreateDrawingArea; val XmCreateDrawnButton = CreateXm XCALL_XmCreateDrawnButton; val XmCreateErrorDialog = CreateXm XCALL_XmCreateErrorDialog; val XmCreateFileSelectionBox = CreateXm XCALL_XmCreateFileSelectionBox; val XmCreateFileSelectionDialog = CreateXm XCALL_XmCreateFileSelectionDialog; val XmCreateForm = CreateXm XCALL_XmCreateForm; val XmCreateFormDialog = CreateXm XCALL_XmCreateFormDialog; val XmCreateFrame = CreateXm XCALL_XmCreateFrame; val XmCreateInformationDialog = CreateXm XCALL_XmCreateInformationDialog; val XmCreateLabel = CreateXm XCALL_XmCreateLabel; val XmCreateLabelGadget = CreateXm XCALL_XmCreateLabelGadget; val XmCreateList = CreateXm XCALL_XmCreateList; val XmCreateMainWindow = CreateXm XCALL_XmCreateMainWindow; val XmCreateMenuBar = CreateXm XCALL_XmCreateMenuBar; val XmCreateMenuShell = CreateXm XCALL_XmCreateMenuShell; val XmCreateMessageBox = CreateXm XCALL_XmCreateMessageBox; val XmCreateMessageDialog = CreateXm XCALL_XmCreateMessageDialog; val XmCreateOptionMenu = CreateXm XCALL_XmCreateOptionMenu; val XmCreatePanedWindow = CreateXm XCALL_XmCreatePanedWindow; val XmCreatePopupMenu = CreateXm XCALL_XmCreatePopupMenu; val XmCreatePromptDialog = CreateXm XCALL_XmCreatePromptDialog; val XmCreatePulldownMenu = CreateXm XCALL_XmCreatePulldownMenu; val XmCreatePushButton = CreateXm XCALL_XmCreatePushButton; val XmCreatePushButtonGadget = CreateXm XCALL_XmCreatePushButtonGadget; val XmCreateQuestionDialog = CreateXm XCALL_XmCreateQuestionDialog; val XmCreateRadioBox = CreateXm XCALL_XmCreateRadioBox; val XmCreateRowColumn = CreateXm XCALL_XmCreateRowColumn; val XmCreateScale = CreateXm XCALL_XmCreateScale; val XmCreateScrollBar = CreateXm XCALL_XmCreateScrollBar; val XmCreateScrolledList = CreateXm XCALL_XmCreateScrolledList; val XmCreateScrolledText = CreateXm XCALL_XmCreateScrolledText; val XmCreateScrolledWindow = CreateXm XCALL_XmCreateScrolledWindow; val XmCreateSelectionBox = CreateXm XCALL_XmCreateSelectionBox; val XmCreateSelectionDialog = CreateXm XCALL_XmCreateSelectionDialog; val XmCreateSeparator = CreateXm XCALL_XmCreateSeparator; val XmCreateSeparatorGadget = CreateXm XCALL_XmCreateSeparatorGadget; val XmCreateSimpleCheckBox = CreateXm XCALL_XmCreateSimpleCheckBox; val XmCreateSimpleMenuBar = CreateXm XCALL_XmCreateSimpleMenuBar; val XmCreateSimpleOptionMenu = CreateXm XCALL_XmCreateSimpleOptionMenu; val XmCreateSimplePopupMenu = CreateXm XCALL_XmCreateSimplePopupMenu; val XmCreateSimplePulldownMenu = CreateXm XCALL_XmCreateSimplePulldownMenu; val XmCreateSimpleRadioBox = CreateXm XCALL_XmCreateSimpleRadioBox; val XmCreateText = CreateXm XCALL_XmCreateText; val XmCreateTextField = CreateXm XCALL_XmCreateTextField; val XmCreateToggleButton = CreateXm XCALL_XmCreateToggleButton; val XmCreateToggleButtonGadget = CreateXm XCALL_XmCreateToggleButtonGadget; val XmCreateWarningDialog = CreateXm XCALL_XmCreateWarningDialog; val XmCreateWorkArea = CreateXm XCALL_XmCreateWorkArea; val XmCreateWorkingDialog = CreateXm XCALL_XmCreateWorkingDialog; end; (******************************************************************************) (* *) (* Motif Widget Query Routines *) (* *) (******************************************************************************) fun XmIsArrowButton (w:Widget):bool = xcall(XCALL_XmIsSomething, 1,w); fun XmIsArrowButtonGadget (w:Widget):bool = xcall(XCALL_XmIsSomething, 2,w); fun XmIsBulletinBoard (w:Widget):bool = xcall(XCALL_XmIsSomething, 3,w); fun XmIsCascadeButton (w:Widget):bool = xcall(XCALL_XmIsSomething, 4,w); fun XmIsCascadeButtonGadget (w:Widget):bool = xcall(XCALL_XmIsSomething, 5,w); fun XmIsCommand (w:Widget):bool = xcall(XCALL_XmIsSomething, 6,w); fun XmIsDesktopObject (w:Widget):bool = xcall(XCALL_XmIsSomething, 7,w); fun XmIsDialogShell (w:Widget):bool = xcall(XCALL_XmIsSomething, 8,w); (* unsupported by solaris version of toolkit ... fun XmIsDisplayObject (w:Widget):bool = xcall(XCALL_XmIsSomething, 9,w); ... *) fun XmIsDrawingArea (w:Widget):bool = xcall(XCALL_XmIsSomething,10,w); fun XmIsDrawnButton (w:Widget):bool = xcall(XCALL_XmIsSomething,11,w); fun XmIsExtObject (w:Widget):bool = xcall(XCALL_XmIsSomething,12,w); fun XmIsFileSelectionBox (w:Widget):bool = xcall(XCALL_XmIsSomething,13,w); fun XmIsForm (w:Widget):bool = xcall(XCALL_XmIsSomething,14,w); fun XmIsFrame (w:Widget):bool = xcall(XCALL_XmIsSomething,15,w); fun XmIsGadget (w:Widget):bool = xcall(XCALL_XmIsSomething,16,w); fun XmIsLabel (w:Widget):bool = xcall(XCALL_XmIsSomething,17,w); fun XmIsLabelGadget (w:Widget):bool = xcall(XCALL_XmIsSomething,18,w); fun XmIsList (w:Widget):bool = xcall(XCALL_XmIsSomething,19,w); fun XmIsMainWindow (w:Widget):bool = xcall(XCALL_XmIsSomething,20,w); fun XmIsManager (w:Widget):bool = xcall(XCALL_XmIsSomething,21,w); fun XmIsMenuShell (w:Widget):bool = xcall(XCALL_XmIsSomething,22,w); fun XmIsMessageBox (w:Widget):bool = xcall(XCALL_XmIsSomething,23,w); fun XmIsMotifWMRunning (w:Widget):bool = xcall(XCALL_XmIsSomething,24,w); fun XmIsPanedWindow (w:Widget):bool = xcall(XCALL_XmIsSomething,25,w); fun XmIsPrimitive (w:Widget):bool = xcall(XCALL_XmIsSomething,26,w); fun XmIsPushButton (w:Widget):bool = xcall(XCALL_XmIsSomething,27,w); fun XmIsPushButtonGadget (w:Widget):bool = xcall(XCALL_XmIsSomething,28,w); fun XmIsRowColumn (w:Widget):bool = xcall(XCALL_XmIsSomething,29,w); fun XmIsScale (w:Widget):bool = xcall(XCALL_XmIsSomething,30,w); (* unsupported by solaris version of toolkit ... fun XmIsScreenObject (w:Widget):bool = xcall(XCALL_XmIsSomething,31,w); ... *) fun XmIsScrollBar (w:Widget):bool = xcall(XCALL_XmIsSomething,32,w); fun XmIsScrolledWindow (w:Widget):bool = xcall(XCALL_XmIsSomething,33,w); fun XmIsSelectionBox (w:Widget):bool = xcall(XCALL_XmIsSomething,34,w); fun XmIsSeparator (w:Widget):bool = xcall(XCALL_XmIsSomething,35,w); fun XmIsSeparatorGadget (w:Widget):bool = xcall(XCALL_XmIsSomething,36,w); fun XmIsShellExt (w:Widget):bool = xcall(XCALL_XmIsSomething,37,w); fun XmIsText (w:Widget):bool = xcall(XCALL_XmIsSomething,38,w); fun XmIsTextField (w:Widget):bool = xcall(XCALL_XmIsSomething,39,w); fun XmIsToggleButton (w:Widget):bool = xcall(XCALL_XmIsSomething,40,w); fun XmIsToggleButtonGadget (w:Widget):bool = xcall(XCALL_XmIsSomething,41,w); fun XmIsVendorShell (w:Widget):bool = xcall(XCALL_XmIsSomething,42,w); fun XmIsVendorShellExt (w:Widget):bool = xcall(XCALL_XmIsSomething,43,w); (* Not supported in Motif 1.2 fun XmIsWorldObject (w:Widget):bool = xcall(XCALL_XmIsSomething,44,w); *) (******************************************************************************) (* *) (* Operations valid for specific Widget classes only *) (* *) (******************************************************************************) fun XmCascadeButtonHighlight (w:Widget) (b:bool):unit = xcall (XCALL_XmCascadeButtonHighlight,w,b); fun XmCommandError (w:Widget) (s:XmString):unit = xcall (XCALL_XmCommandError,w,s); fun XmCommandGetChild (w:Widget) (b:XmDefaultButtonType):Widget = xcall (XCALL_XmCommandGetChild,w,fromDefaultButtonType b); fun XmFileSelectionBoxGetChild (w:Widget) (b:XmDefaultButtonType):Widget = xcall (XCALL_XmFileSelectionBoxGetChild,w,fromDefaultButtonType b); fun XmFileSelectionDoSearch (w:Widget) (s:XmString):unit = xcall (XCALL_XmFileSelectionDoSearch,w,s); fun XmMainWindowSetAreas (a:Widget) (b:Widget) (c:Widget) (d:Widget) (e:Widget) (f:Widget):unit = xcall (XCALL_XmMainWindowSetAreas,a,b,c,d,e,f); fun XmMainWindowSep1 (w:Widget):Widget = xcall (XCALL_XmMainWindowSepX,w,1); fun XmMainWindowSep2 (w:Widget):Widget = xcall (XCALL_XmMainWindowSepX,w,2); fun XmMainWindowSep3 (w:Widget):Widget = xcall (XCALL_XmMainWindowSepX,w,3); fun XmMessageBoxGetChild (w:Widget) (b:XmDefaultButtonType):Widget = xcall (XCALL_XmMessageBoxGetChild,w,fromDefaultButtonType b); fun XmOptionButtonGadget (w:Widget):Widget = xcall (XCALL_XmOptionButtonGadget,w); fun XmOptionLabelGadget (w:Widget):Widget = xcall (XCALL_XmOptionLabelGadget,w); fun XmScrolledWindowSetAreas (a:Widget) (b:Widget) (c:Widget) (d:Widget):unit = xcall (XCALL_XmScrolledWindowSetAreas,a,b,c,d); fun XmSelectionBoxGetChild (w:Widget) (b:XmDefaultButtonType):Widget = xcall (XCALL_XmSelectionBoxGetChild,w,fromDefaultButtonType b); fun XmSetMenuCursor (d:Display) (c:Cursor):unit = xcall (XCALL_XmSetMenuCursor,d,c); fun XmTrackingLocate (w:Widget) (c:Cursor) (b:bool):Widget = xcall (XCALL_XmTrackingLocate,w,c,b); fun XmUpdateDisplay (w:Widget):unit = xcall (XCALL_XmUpdateDisplay,w); local type code = int; fun get (opn : code) : Widget -> '_a = fn (w:Widget) => xcall (opn,w); fun set (opn : code) : Widget -> '_a -> unit = fn (w:Widget) => fn(x:'_a) => xcall (opn,w,x); val getInt : code -> Widget -> int = get; val getBool : code -> Widget -> bool = get; val getString : code -> Widget -> string = get; val setInt : code -> Widget -> int -> unit = set; val setBool : code -> Widget -> bool -> unit = set; val setString : code -> Widget -> string -> unit = set; in (******************************************************************************) (* *) (* Operations on XmText Widgets *) (* *) (******************************************************************************) val XmTextGetAddMode = getBool XCALL_XmTextGetAddMode; val XmTextGetBaseline = getInt XCALL_XmTextGetBaseline; val XmTextGetCursorPosition = getInt XCALL_XmTextGetCursorPosition; val XmTextGetEditable = getBool XCALL_XmTextGetEditable; val XmTextGetInsertionPosition = getInt XCALL_XmTextGetInsertionPosition; val XmTextGetLastPosition = getInt XCALL_XmTextGetLastPosition; val XmTextGetMaxLength = getInt XCALL_XmTextGetMaxLength; val XmTextGetSelection = getInt XCALL_XmTextGetSelection; val XmTextGetString= getString XCALL_XmTextGetString; val XmTextGetTopCharacter = getInt XCALL_XmTextGetTopCharacter; fun XmTextInsert (w:Widget) (n:int) (s:string) : unit = xcall (XCALL_XmTextInsert,w,n,s); val XmTextPaste = getBool XCALL_XmTextPaste; val XmTextRemove = getBool XCALL_XmTextRemove; fun XmTextReplace (w:Widget) (from:int) (to:int) (s:string) : unit = xcall (XCALL_XmTextReplace,w,from,to,s); val XmTextScroll = setInt XCALL_XmTextScroll; val XmTextSetAddMode = setBool XCALL_XmTextSetAddMode; val XmTextSetCursorPosition = setInt XCALL_XmTextSetCursorPosition; val XmTextSetEditable = setBool XCALL_XmTextSetEditable; val XmTextSetInsertionPosition = setInt XCALL_XmTextSetInsertionPosition; val XmTextSetMaxLength = setInt XCALL_XmTextSetMaxLength; val XmTextSetString = setString XCALL_XmTextSetString; val XmTextSetTopCharacter = setInt XCALL_XmTextSetTopCharacter; val XmTextShowPosition = setInt XCALL_XmTextShowPosition; fun XmTextXYToPos (w:Widget) (x:int) (y:int) : int = xcall (XCALL_XmTextXYToPos,w,x,y); (******************************************************************************) (* *) (* Operations on XmTextField Widgets *) (* *) (******************************************************************************) val XmTextFieldGetAddMode = getBool XCALL_XmTextFieldGetAddMode; val XmTextFieldGetBaseline = getInt XCALL_XmTextFieldGetBaseline; val XmTextFieldGetCursorPosition = getInt XCALL_XmTextFieldGetCursorPosition; val XmTextFieldGetEditable = getBool XCALL_XmTextFieldGetEditable; val XmTextFieldGetInsertionPosition = getInt XCALL_XmTextFieldGetInsertionPosition; val XmTextFieldGetLastPosition = getInt XCALL_XmTextFieldGetLastPosition; val XmTextFieldGetMaxLength = getInt XCALL_XmTextFieldGetMaxLength; val XmTextFieldGetSelection = getInt XCALL_XmTextFieldGetSelection; val XmTextFieldGetString= getString XCALL_XmTextFieldGetString; fun XmTextFieldInsert (w:Widget) (n:int) (s:string) : unit = xcall (XCALL_XmTextFieldInsert,w,n,s); val XmTextFieldPaste = getBool XCALL_XmTextFieldPaste; val XmTextFieldRemove = getBool XCALL_XmTextFieldRemove; fun XmTextFieldReplace (w:Widget) (from:int) (to:int) (s:string) : unit = xcall (XCALL_XmTextFieldReplace,w,from,to,s); val XmTextFieldSetAddMode = setBool XCALL_XmTextFieldSetAddMode; val XmTextFieldSetCursorPosition = setInt XCALL_XmTextFieldSetCursorPosition; val XmTextFieldSetEditable = setBool XCALL_XmTextFieldSetEditable; val XmTextFieldSetInsertionPosition = setInt XCALL_XmTextFieldSetInsertionPosition; val XmTextFieldSetMaxLength = setInt XCALL_XmTextFieldSetMaxLength; val XmTextFieldSetString = setString XCALL_XmTextFieldSetString; val XmTextFieldShowPosition = setInt XCALL_XmTextFieldShowPosition; fun XmTextFieldXYToPos (w:Widget) (x:int) (y:int) : int = xcall (XCALL_XmTextFieldXYToPos,w,x,y); end; (* local *) (******************************************************************************) (* *) (* Operations on XmList Widgets *) (* *) (******************************************************************************) fun XmListAddItem (w: Widget) (s:string) (pos:int) : unit = xcall (XCALL_XmListAddItem,w,s,pos); fun XmListAddItemUnselected (w: Widget) (s: string) (pos: int) : unit = xcall (XCALL_XmListAddItemUnselected,w,s,pos); fun XmListAddItems (w: Widget) (sl: string list) (pos: int) : unit = xcall (XCALL_XmListAddItems,w,sl,pos); fun XmListDeleteAllItems (w: Widget) : unit = xcall (XCALL_XmListDeleteAllItems,w); fun XmListDeleteItem (w: Widget) (s: string) : unit = xcall (XCALL_XmListDeleteItem,w,s); fun XmListDeleteItems (w: Widget) (sl: string list) : unit = xcall (XCALL_XmListDeleteItems,w,sl); fun XmListDeletePos (w: Widget) (pos: int) : unit = xcall (XCALL_XmListDeletePos,w,pos); fun XmListDeleteItemsPos (w: Widget) (num: int) (pos: int) : unit = xcall (XCALL_XmListDeleteItemsPos,w,num,pos); fun XmListDeselectAllItems (w: Widget) : unit = xcall (XCALL_XmListDeselectAllItems,w); fun XmListDeselectItem (w: Widget) (s: string) : unit = xcall (XCALL_XmListDeselectItem,w,s); fun XmListDeselectPos (w: Widget) (pos: int) : unit = xcall (XCALL_XmListDeselectPos,w,pos); fun XmListGetMatchPos (w: Widget) (s: string) : int list = xcall (XCALL_XmListGetMatchPos,w,s); fun XmListGetSelectedPos (w: Widget) : int list = xcall (XCALL_XmListGetSelectedPos,w); fun XmListItemExists (w: Widget) (s: string) : bool = xcall (XCALL_XmListItemExists,w,s); fun XmListItemPos (w: Widget) (s: string) : int = xcall (XCALL_XmListItemPos,w,s); fun XmListReplaceItems (w: Widget) (oldNewPairs : (string * string) list) : unit = let val oldStrings = map #1 oldNewPairs; val newStrings = map #2 oldNewPairs; in xcall (XCALL_XmListReplaceItems,w,oldStrings,newStrings) end; fun XmListReplaceItemsPos (w: Widget) (sl: string list) (pos: int) : unit = xcall (XCALL_XmListReplaceItemsPos,w,sl,pos); fun XmListSelectItem (w: Widget) (s: string) (notify: bool) : unit = xcall (XCALL_XmListSelectItem,w,s,notify); fun XmListSelectPos (w: Widget) (pos: int) (notify: bool) : unit = xcall (XCALL_XmListSelectPos,w,pos,notify); fun XmListSetAddMode (w: Widget) (on: bool) : unit = xcall (XCALL_XmListSetAddMode,w,on); fun XmListSetBottomItem (w: Widget) (s:string) : unit = xcall (XCALL_XmListSetBottomItem,w,s); fun XmListSetBottomPos (w: Widget) (pos:int) : unit = xcall (XCALL_XmListSetBottomPos,w,pos); fun XmListSetHorizPos (w: Widget) (pos:int) : unit = xcall (XCALL_XmListSetHorizPos,w,pos); fun XmListSetItem (w: Widget) (s:string) : unit = xcall (XCALL_XmListSetItem,w,s); fun XmListSetPos (w: Widget) (pos:int) : unit = xcall (XCALL_XmListSetPos,w,pos); fun XmMenuPosition (w: Widget) (ev: 'a XEvent): unit = case ev of ButtonPress { rootPointer=XPoint{x,y}, ...} => xcall(XCALL_XmMenuPosition, w, x, y) | ButtonClick { rootPointer=XPoint{x,y}, ...} => xcall(XCALL_XmMenuPosition, w, x, y) | _ => raise XWindows("Bad event type in XmMenuPosition") end; (* local *) end; (* struct *) polyml-5.6/mlsource/extra/Win/000077500000000000000000000000001265146633400164235ustar00rootroot00000000000000polyml-5.6/mlsource/extra/Win/Base.sml000066400000000000000000001234361265146633400200230ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This contains various types and other values which are needed in various modules. All the exported types are contained in other structures. *) structure Base: sig val winCall0: Foreign.symbol -> unit -> 'a Foreign.conversion -> unit -> 'a val winCall1: Foreign.symbol -> 'a Foreign.conversion -> 'b Foreign.conversion -> 'a -> 'b val winCall2: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion -> 'c Foreign.conversion -> 'a * 'b -> 'c val winCall3: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion -> 'd Foreign.conversion -> 'a * 'b * 'c -> 'd val winCall4: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion -> 'e Foreign.conversion -> 'a * 'b * 'c * 'd -> 'e val winCall5: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion -> 'f Foreign.conversion -> 'a * 'b * 'c * 'd * 'e -> 'f val winCall6: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion -> 'g Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f -> 'g val winCall7: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion -> 'h Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g -> 'h val winCall8: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion -> 'i Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h -> 'i val winCall9: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion -> 'j Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i -> 'j val winCall10: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion * 'j Foreign.conversion -> 'k Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j -> 'k val winCall11: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion * 'j Foreign.conversion * 'k Foreign.conversion -> 'l Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k -> 'l val winCall12: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion * 'j Foreign.conversion * 'k Foreign.conversion * 'l Foreign.conversion -> 'm Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l -> 'm val winCall13: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion * 'j Foreign.conversion * 'k Foreign.conversion * 'l Foreign.conversion * 'm Foreign.conversion -> 'n Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm -> 'n val winCall14: Foreign.symbol -> 'a Foreign.conversion * 'b Foreign.conversion * 'c Foreign.conversion * 'd Foreign.conversion * 'e Foreign.conversion * 'f Foreign.conversion * 'g Foreign.conversion * 'h Foreign.conversion * 'i Foreign.conversion * 'j Foreign.conversion * 'k Foreign.conversion * 'l Foreign.conversion * 'm Foreign.conversion * 'n Foreign.conversion -> 'o Foreign.conversion -> 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h * 'i * 'j * 'k * 'l * 'm * 'n -> 'o val winAbi: Foreign.LibFFI.abi val kernel: string -> Foreign.symbol and user: string -> Foreign.symbol and commdlg: string -> Foreign.symbol and gdi: string -> Foreign.symbol and shell: string -> Foreign.symbol and comctl: string -> Foreign.symbol val cSIZE_T: int Foreign.conversion and cLPARAM: int Foreign.conversion and cLONG_PTR: int Foreign.conversion and cULONG_PTR: int Foreign.conversion and cINT_PTR: int Foreign.conversion and cUINT_PTR: int Foreign.conversion and cDWORD: int Foreign.conversion and cWORD: int Foreign.conversion and cDWORD_PTR: int Foreign.conversion and cUINT_PTRw: SysWord.word Foreign.conversion val cUint8w: Word8.word Foreign.conversion and cUint16w: Word.word Foreign.conversion and cUint32w: Word32.word Foreign.conversion and cUintw: Word32.word Foreign.conversion and cUlongw: Word32.word Foreign.conversion val cDWORDw: Word32.word Foreign.conversion and cWORDw: Word.word Foreign.conversion val cBool: bool Foreign.conversion val successState: string -> unit Foreign.conversion val cPOSINT: string -> int Foreign.conversion type POINT = { x: int, y: int } val cPoint: POINT Foreign.conversion type RECT = { left: int, top: int, right: int, bottom: int } val cRect: RECT Foreign.conversion type SIZE = { cx: int, cy: int } val cSize: SIZE Foreign.conversion eqtype 'a HANDLE val hNull: 'a HANDLE val isHNull: 'a HANDLE -> bool val handleOfVoidStar: Foreign.Memory.voidStar -> 'a HANDLE and voidStarOfHandle: 'a HANDLE -> Foreign.Memory.voidStar eqtype HMENU and HDC and HWND and HINSTANCE and HGDIOBJ and HDROP and HRSRC and HUPDATE val cHGDIOBJ: HGDIOBJ Foreign.conversion and cHDROP: HDROP Foreign.conversion and cHMENU: HMENU Foreign.conversion and cHINSTANCE: HINSTANCE Foreign.conversion and cHDC: HDC Foreign.conversion and cHWND: HWND Foreign.conversion val cHMENUOPT: HMENU option Foreign.conversion and cHGDIOBJOPT: HGDIOBJ option Foreign.conversion and cHWNDOPT: HWND option Foreign.conversion and cHRSRC: HRSRC Foreign.conversion and cHUPDATE: HUPDATE Foreign.conversion val hgdiObjNull:HGDIOBJ and isHgdiObjNull: HGDIOBJ -> bool and hdcNull: HDC and isHdcNull: HDC -> bool and hmenuNull: HMENU and isHmenuNull: HMENU -> bool and hinstanceNull: HINSTANCE and isHinstanceNull: HINSTANCE -> bool and hwndNull: HWND type HPALETTE = HGDIOBJ and HFONT = HGDIOBJ and HPEN = HGDIOBJ and HBITMAP = HGDIOBJ and HRGN = HGDIOBJ and HBRUSH = HGDIOBJ and HENHMETAFILE = HGDIOBJ and HMETAFILE = HGDIOBJ val cHPALETTE: HPALETTE Foreign.conversion and cHFONT: HFONT Foreign.conversion and cHPEN: HPEN Foreign.conversion and cHBITMAP: HBITMAP Foreign.conversion and cHRGN: HRGN Foreign.conversion and cHBRUSH: HBRUSH Foreign.conversion and cHENHMETAFILE: HENHMETAFILE Foreign.conversion and cHMETAFILE: HMETAFILE Foreign.conversion type HICON = HGDIOBJ and HCURSOR = HGDIOBJ val cHICON: HICON Foreign.conversion and cHCURSOR: HCURSOR Foreign.conversion val absConversion: {abs: 'a -> 'b, rep: 'b -> 'a} -> 'a Foreign.conversion -> 'b Foreign.conversion val tableLookup: (''a * ''b) list * ((''b -> ''a) * (''a -> ''b)) option -> (''a -> ''b) * (''b -> ''a) and tableSetLookup: (''a * Word32.word) list * ((Word32.word -> ''a) * (''a -> Word32.word)) option -> (''a list -> Word32.word) * (Word32.word -> ''a list) val tableConversion: (''a * ''b) list * ((''b -> ''a) * (''a -> ''b)) option -> ''b Foreign.conversion -> ''a Foreign.conversion (* tableSetConversion is always a cUint *) and tableSetConversion: (''a * Word32.word) list * ((Word32.word -> ''a) * (''a -> Word32.word)) option -> ''a list Foreign.conversion val list2Vector: 'a Foreign.conversion -> 'a list -> Foreign.Memory.voidStar * int datatype ClassType = NamedClass of string | ClassAtom of int val cCLASS: ClassType Foreign.conversion datatype ClipboardFormat = CF_NONE | CF_TEXT | CF_BITMAP | CF_METAFILEPICT | CF_SYLK | CF_DIF | CF_TIFF | CF_OEMTEXT | CF_DIB | CF_PALETTE | CF_PENDATA | CF_RIFF | CF_WAVE | CF_UNICODETEXT | CF_ENHMETAFILE | CF_OWNERDISPLAY | CF_DSPTEXT | CF_DSPBITMAP | CF_DSPMETAFILEPICT | CF_DSPENHMETAFILE | CF_PRIVATE of int | CF_GDIOBJ of int | CF_REGISTERED of int | CF_HDROP | CF_LOCALE val clipLookup: (ClipboardFormat -> int) * (int -> ClipboardFormat) datatype RESID = IdAsInt of int | IdAsString of string val cRESID: RESID Foreign.conversion val STRINGOPT: string option Foreign.conversion val cCHARARRAY: int -> string Foreign.conversion val fromCstring: Foreign.Memory.voidStar -> string val toCstring: string -> Foreign.Memory.voidStar (* Memory must be freed *) val copyStringToMem: Foreign.Memory.voidStar * int * string -> unit val fromCWord8vec: Foreign.Memory.voidStar * int -> Word8Vector.vector val toCWord8vec: Word8Vector.vector -> Foreign.Memory.voidStar (* Memory must be freed *) val getStringCall: (Foreign.Memory.voidStar * int -> int) -> string val getStringWithNullIsLength: (Foreign.Memory.voidStar * int -> int) -> string val getVectorResult: 'a Foreign.conversion -> (Foreign.Memory.voidStar * int -> int) -> int -> 'a vector eqtype HGLOBAL val cHGLOBAL: HGLOBAL Foreign.conversion val GlobalAlloc: int * int -> HGLOBAL val GlobalLock: HGLOBAL -> Foreign.Memory.voidStar val GlobalFree: HGLOBAL -> HGLOBAL val GlobalSize: HGLOBAL -> int val GlobalUnlock: HGLOBAL -> bool val HIWORD: Word32.word -> Word.word val LOWORD: Word32.word -> Word.word val MAKELONG: Word.word * Word.word -> Word32.word val HIBYTE: Word.word -> Word8.word val LOBYTE: Word.word -> Word8.word val unicodeToString: Word8Vector.vector -> string val stringToUnicode: string -> Word8Vector.vector val GetLastError: unit -> OS.syserror val checkResult: bool -> unit val raiseSysErr: unit -> 'a structure FindReplaceFlags: sig include BIT_FLAGS val FR_DIALOGTERM : flags val FR_DOWN : flags val FR_FINDNEXT : flags val FR_HIDEMATCHCASE : flags val FR_HIDEUPDOWN : flags val FR_HIDEWHOLEWORD : flags val FR_MATCHCASE : flags val FR_NOMATCHCASE : flags val FR_NOUPDOWN : flags val FR_NOWHOLEWORD : flags val FR_REPLACE : flags val FR_REPLACEALL : flags val FR_SHOWHELP : flags val FR_WHOLEWORD : flags val cFindReplaceFlags: flags Foreign.conversion end end = struct open Foreign (* val System_isShort : vol -> bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_is_short*) fun absConversion {abs: 'a -> 'b, rep: 'b -> 'a} (c: 'a conversion) : 'b conversion = let val { load=loadI, store=storeI, ctype } = breakConversion c fun load m = abs(loadI m) fun store(m, v) = storeI(m, rep v) in makeConversion { load = load, store = store, ctype = ctype } end (* In many cases we can pass a set of options as a bit set. *) (* fun bitsetConversion {abs, rep} = let val (fromC, toC, Ctype) = breakConversion INT val fromList = List.foldl (fn(i, n) => IntInf.orb(rep i, n)) 0 fun toList n = [abs n] (* This is a bit of a mess. *) in mkConversion (toList o fromCuint) (toCuint o fromList) Cuint end*) (* Conversions between Word/Word32/LargeWord etc. *) local open Memory LowLevel fun noFree () = () in local fun load(m: voidStar): Word8.word = get8(m, 0w0) fun store(m: voidStar, i: Word8.word) = (set8(m, 0w0, i); noFree) in val cUint8w: Word8.word conversion = makeConversion{ load=load, store=store, ctype = cTypeUint8 } end local fun load(m: voidStar): Word.word = get16(m, 0w0) fun store(m: voidStar, i: Word.word) = (set16(m, 0w0, i); noFree) in val cUint16w: Word.word conversion = makeConversion{ load=load, store=store, ctype = cTypeInt16 } end local fun load(m: voidStar): Word32.word = get32(m, 0w0) fun store(m: voidStar, i: Word32.word) = (set32(m, 0w0, i); noFree) in val cUint32w: Word32.word conversion = makeConversion{ load=load, store=store, ctype = cTypeUint32 } end val cUintw = cUint32w (* Int should be 32-bits on Windows. *) val _ = #size LowLevel.cTypeUint = #size LowLevel.cTypeUint32 orelse raise Fail "unsigned int is not 32-bits" val cUlongw = cUint32w val _ = #size LowLevel.cTypeUlong = #size LowLevel.cTypeUint32 orelse raise Fail "unsigned long is not 32-bits" end val cDWORD = cUint32 (* Defined to be 32-bit unsigned *) and cWORD = cUint16 (* Defined to be 16-bit unsigned *) val cDWORDw = cUint32w and cWORDw = cUint16w (* For some reason Windows has both INT_PTR and LONG_PTR and they are slightly different. *) val cLONG_PTR = if #size LowLevel.cTypePointer = 0w4 then cLong else cInt64 val cINT_PTR = if #size LowLevel.cTypePointer = 0w4 then cInt else cInt64 val cULONG_PTR = if #size LowLevel.cTypePointer = 0w4 then cUlong else cUint64 val cUINT_PTR = if #size LowLevel.cTypePointer = 0w4 then cUint else cUint64 val cLPARAM = cLONG_PTR val cSIZE_T = cULONG_PTR (* Probably. *) val cDWORD_PTR = cULONG_PTR (* Defined to be the same so I'm not sure why it's there .*) val cUINT_PTRw = absConversion{abs=Memory.voidStar2Sysword, rep=Memory.sysWord2VoidStar} cPointer (* These are called XXX32.DLL on both 32-bit and 64-bit. *) fun kernel name = getSymbol(loadLibrary "kernel32.dll") name and user sym = getSymbol(loadLibrary "user32.DLL") sym and commdlg sym = getSymbol(loadLibrary "comdlg32.DLL") sym and gdi sym = getSymbol(loadLibrary "gdi32.DLL") sym and shell sym = getSymbol(loadLibrary "shell32.DLL") sym and comctl sym = getSymbol(loadLibrary "comctl32.DLL") sym (* We need to use the Pascal calling convention on 32-bit Windows. *) val winAbi = case List.find (fn ("stdcall", _) => true | _ => false) LibFFI.abiList of SOME(_, abi) => abi | NONE => LibFFI.abiDefault (* As well as setting the abi we can also use the old argument order. *) fun winCall0 sym argConv resConv = buildCall0withAbi(winAbi, sym, argConv, resConv) and winCall1 sym argConv resConv = buildCall1withAbi(winAbi, sym, argConv, resConv) and winCall2 sym argConv resConv = buildCall2withAbi(winAbi, sym, argConv, resConv) and winCall3 sym argConv resConv = buildCall3withAbi(winAbi, sym, argConv, resConv) and winCall4 sym argConv resConv = buildCall4withAbi(winAbi, sym, argConv, resConv) and winCall5 sym argConv resConv = buildCall5withAbi(winAbi, sym, argConv, resConv) and winCall6 sym argConv resConv = buildCall6withAbi(winAbi, sym, argConv, resConv) and winCall7 sym argConv resConv = buildCall7withAbi(winAbi, sym, argConv, resConv) and winCall8 sym argConv resConv = buildCall8withAbi(winAbi, sym, argConv, resConv) and winCall9 sym argConv resConv = buildCall9withAbi(winAbi, sym, argConv, resConv) and winCall10 sym argConv resConv = buildCall10withAbi(winAbi, sym, argConv, resConv) and winCall11 sym argConv resConv = buildCall11withAbi(winAbi, sym, argConv, resConv) and winCall12 sym argConv resConv = buildCall12withAbi(winAbi, sym, argConv, resConv) and winCall13 sym argConv resConv = buildCall13withAbi(winAbi, sym, argConv, resConv) and winCall14 sym argConv resConv = buildCall14withAbi(winAbi, sym, argConv, resConv) (* Previously we had a specific call to do this. The error state is no longer set by the new FFI. *) (* fun GetLastError(): OS.syserror = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (1100, ()) *) local val getLastError = winCall0 (kernel "GetLastError") () cDWORD in fun GetLastError(): OS.syserror = (* Windows error codes are negative values in OS.syserror. *) RunCall.unsafeCast (~ (getLastError())) end (* The string argument of the SysErr exception is supposed to match the result of OS.errMsg. *) fun raiseSysErr () = let val err = GetLastError() in raise OS.SysErr(OS.errorMsg err, SOME err) end (* Many system calls return bool. If the result is false we raise an exception. *) fun checkResult true = () | checkResult false = raiseSysErr () val cBool: bool conversion = absConversion{abs = fn 0 => false | _ => true, rep = fn false => 0 | true => 1} cInt fun successState name: unit conversion = absConversion { abs = checkResult, rep = fn _ => raise Fail ("successState:" ^ name) } cBool type POINT = { x: int, y: int } local fun breakPoint ({x,y}: POINT) = (x,y) fun mkPoint (x,y): POINT = {x=x, y=y} in val cPoint = absConversion {abs=mkPoint, rep=breakPoint} (cStruct2 (cLong, cLong)) end type RECT = { left: int, top: int, right: int, bottom: int } local fun breakRect ({left,top,right,bottom}: RECT) = (left,top,right,bottom) fun mkRect (left,top,right,bottom): RECT = {left=left,top=top,right=right,bottom=bottom} in val cRect = absConversion {abs=mkRect, rep=breakRect} (cStruct4 (cLong,cLong,cLong,cLong)) end type SIZE = { cx: int, cy: int } local fun breakSize ({cx,cy}: SIZE) = (cx,cy) fun mkSize (cx,cy): SIZE = {cx=cx, cy=cy} in val cSize = absConversion {abs=mkSize, rep=breakSize} (cStruct2 (cLong,cLong)) end (* Handles are generally opaque values. We want them to be eqtypes, though. *) local structure HandStruct :> sig eqtype 'a HANDLE val hNull: 'a HANDLE val isHNull: 'a HANDLE -> bool val handleOfVoidStar: Memory.voidStar -> 'a HANDLE and voidStarOfHandle: 'a HANDLE -> Memory.voidStar end = struct type 'a HANDLE = Memory.voidStar val hNull = Memory.null fun isHNull h = h = hNull (* We sometimes need the next two functions internally. They're needed externally unless we change the result type of SendMessage to allow us to return a handle for certain messages. *) fun handleOfVoidStar h = h and voidStarOfHandle h = h end in open HandStruct end (* We just need these as placeholders. We never create values of these types. They are used simply as a way of creating different handle types. *) (* Don't use abstype - we want them to eqtypes *) datatype GdiObj = GdiObj and Instance = Instance and Drop = Drop and DeviceContext = DeviceContext and Menu = Menu and Window = Window and Global = Global and Src = Src and Update = Update (* HINSTANCE is used as an instance of a module. *) type HINSTANCE = Instance HANDLE and HDROP = Drop HANDLE and HGDIOBJ = GdiObj HANDLE and HDC = DeviceContext HANDLE and HMENU = Menu HANDLE and HWND = Window HANDLE and HGLOBAL = Global HANDLE and HRSRC = Src HANDLE and HUPDATE = Update HANDLE local fun cHANDLE() = absConversion {abs=handleOfVoidStar, rep=voidStarOfHandle} cPointer fun hoptOfvs n = if Memory.voidStar2Sysword n = 0w0 then NONE else SOME(handleOfVoidStar n) fun cHANDLEOPT() = absConversion {abs=hoptOfvs, rep=fn v => voidStarOfHandle(getOpt(v, hNull)) } cPointer in val cHGDIOBJ: HGDIOBJ conversion = cHANDLE() and cHDROP: HDROP conversion = cHANDLE() and cHMENU: HMENU conversion = cHANDLE() and cHINSTANCE: HINSTANCE conversion = cHANDLE() and cHDC: HDC conversion = cHANDLE() and cHWND: HWND conversion = cHANDLE() val cHMENUOPT: HMENU option conversion = cHANDLEOPT() and cHGDIOBJOPT: HGDIOBJ option conversion = cHANDLEOPT() and cHWNDOPT: HWND option conversion = cHANDLEOPT() val cHGLOBAL: HGLOBAL conversion = cHANDLE() and cHRSRC: HRSRC conversion = cHANDLE() and cHUPDATE: HUPDATE conversion = cHANDLE() end (* Temporary declarations. *) val hgdiObjNull:HGDIOBJ = hNull and isHgdiObjNull: HGDIOBJ -> bool = isHNull and hdcNull: HDC = hNull and isHdcNull: HDC -> bool = isHNull and hmenuNull: HMENU = hNull and isHmenuNull: HMENU -> bool = isHNull and hinstanceNull: HINSTANCE = hNull and isHinstanceNull: HINSTANCE -> bool = isHNull and hwndNull: HWND = hNull (* All these are various kinds of HGDIOBJ. It's too complicated to try to use different types for them. *) type HPALETTE = HGDIOBJ and HFONT = HGDIOBJ and HPEN = HGDIOBJ and HBITMAP = HGDIOBJ and HRGN = HGDIOBJ and HBRUSH = HGDIOBJ and HENHMETAFILE = HGDIOBJ and HMETAFILE = HGDIOBJ val cHPALETTE: HPALETTE conversion = cHGDIOBJ and cHFONT: HFONT conversion = cHGDIOBJ and cHPEN: HPEN conversion = cHGDIOBJ and cHBITMAP: HBITMAP conversion = cHGDIOBJ and cHRGN: HRGN conversion = cHGDIOBJ and cHBRUSH: HBRUSH conversion = cHGDIOBJ and cHENHMETAFILE: HENHMETAFILE conversion = cHGDIOBJ and cHMETAFILE: HMETAFILE conversion = cHGDIOBJ (* I'm not so happy about treating these as HGDIOBJ but it makes the types of messages such as BM_SETIMAGE simpler. *) type HICON = HGDIOBJ and HCURSOR = HGDIOBJ val cHICON = cHGDIOBJ and cHCURSOR = cHGDIOBJ (* The easiest way to deal with datatypes is often by way of a table. *) fun tableLookup (table: (''a * ''b) list, default) = let fun toInt [] x = (case default of NONE => raise Fail "tableLookup: not found" | SOME (_, d) => d x) | toInt ((y, i) :: tl) x = if x = y then i else toInt tl x fun fromInt [] x = (case default of NONE => raise Fail ("tableLookup: not found") | SOME (d, _) => d x) | fromInt ((y, i) :: tl) x = if x = i then y else fromInt tl x in (toInt table, fromInt table) end fun tableConversion (table: (''a * ''b) list, default) (conv: ''b conversion): ''a conversion = let val (toInt, fromInt) = tableLookup(table, default) in absConversion {abs = fromInt, rep = toInt} conv end (* In other cases we have sets of options. We represent them by a list. The order of the elements in the table is significant if we are to be able to handle multiple bits. Patterns with more than one bit set MUST be placed later than those with a subset of those bits. *) fun tableSetLookup (table: (''a * Word32.word) list, default) = let open Word32 (* Conversion to integer - just fold the values. *) fun toInt' [] x = (case default of NONE => raise Fail "tableLookup: not found" | SOME (_, d) => d x) | toInt' ((y, i) :: tl) x = if x = y then i else toInt' tl x val toInt = List.foldl (fn (a, b) => orb(toInt' table a, b)) 0w0 (* It would speed up the searches if we ordered the list so that multiple bit entries preceded those with fewer bits but it's much easier to lay out the tables if we do it this way. *) fun fromInt _ _ 0w0 = [] (* Zero is an empty list. *) | fromInt [] NONE x = (* Not found *) (case default of NONE => raise Fail ("tableLookup: not found" ^ Word32.toString x) | SOME (d, _) => [d x]) | fromInt [] (SOME(res, bits)) x = (* Found something - remove it from the set. *) (res :: fromInt table NONE (andb(x, notb bits))) | fromInt ((res, bits)::tl) sofar x = if bits <> 0w0 andalso andb(x, bits) = bits then (* Matches *) fromInt tl (SOME(res, bits)) x else (* Doesn't match *) fromInt tl sofar x in (toInt, fromInt table NONE) end fun tableSetConversion (table: (''a * Word32.word) list, default): ''a list conversion = let val (toInt, fromInt) = tableSetLookup(table, default) in absConversion {abs = fromInt, rep = toInt} cUintw end structure FindReplaceFlags:> sig include BIT_FLAGS val FR_DIALOGTERM : flags val FR_DOWN : flags val FR_FINDNEXT : flags val FR_HIDEMATCHCASE : flags val FR_HIDEUPDOWN : flags val FR_HIDEWHOLEWORD : flags val FR_MATCHCASE : flags val FR_NOMATCHCASE : flags val FR_NOUPDOWN : flags val FR_NOWHOLEWORD : flags val FR_REPLACE : flags val FR_REPLACEALL : flags val FR_SHOWHELP : flags val FR_WHOLEWORD : flags val cFindReplaceFlags: flags conversion end = struct open Word32 type flags = word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val FR_DOWN = 0wx00000001 val FR_WHOLEWORD = 0wx00000002 val FR_MATCHCASE = 0wx00000004 val FR_FINDNEXT = 0wx00000008 val FR_REPLACE = 0wx00000010 val FR_REPLACEALL = 0wx00000020 val FR_DIALOGTERM = 0wx00000040 val FR_SHOWHELP = 0wx00000080 val FR_NOUPDOWN = 0wx00000400 val FR_NOMATCHCASE = 0wx00000800 val FR_NOWHOLEWORD = 0wx00001000 val FR_HIDEUPDOWN = 0wx00004000 val FR_HIDEMATCHCASE = 0wx00008000 val FR_HIDEWHOLEWORD = 0wx00010000 val all = flags[FR_DOWN, FR_WHOLEWORD, FR_MATCHCASE, FR_FINDNEXT, FR_REPLACE, FR_REPLACEALL, FR_DIALOGTERM, FR_NOUPDOWN, FR_NOMATCHCASE, FR_NOWHOLEWORD, FR_HIDEUPDOWN, FR_HIDEMATCHCASE, FR_HIDEWHOLEWORD] val intersect = List.foldl (fn (a, b) => andb(a,b)) all val cFindReplaceFlags = cDWORDw end (* The class "string" may be a name or an atom. *) datatype ClassType = NamedClass of string | ClassAtom of int local open Memory val {store=storeS, load=loadS, ctype} = breakConversion cString fun storeClass(m, ClassAtom i) = if i >= 0 andalso i < 0xC000 then (setAddress(m, 0w0, sysWord2VoidStar(SysWord.fromInt i)); fn () => ()) else raise Fail "atom out of range" | storeClass(m, NamedClass s) = storeS(m, s) fun loadClass m = let val v = getAddress(m, 0w0) in if voidStar2Sysword v < 0wxC000 then ClassAtom(SysWord.toInt(voidStar2Sysword v)) else NamedClass(loadS m) end in val cCLASS = makeConversion { load = loadClass, store = storeClass, ctype = ctype } end (* Clipboard formats. I've added CF_NONE, CF_PRIVATE, CF_GDIOBJ and CF_REGISTERED. This is here because it is used in both Clipboard and Message (WM_RENDERFORMAT) *) datatype ClipboardFormat = CF_NONE | CF_TEXT | CF_BITMAP | CF_METAFILEPICT | CF_SYLK | CF_DIF | CF_TIFF | CF_OEMTEXT | CF_DIB | CF_PALETTE | CF_PENDATA | CF_RIFF | CF_WAVE | CF_UNICODETEXT | CF_ENHMETAFILE | CF_OWNERDISPLAY | CF_DSPTEXT | CF_DSPBITMAP | CF_DSPMETAFILEPICT | CF_DSPENHMETAFILE | CF_PRIVATE of int | CF_GDIOBJ of int | CF_REGISTERED of int | CF_HDROP | CF_LOCALE local val tab = [ (CF_NONE, 0), (CF_TEXT, 1), (CF_BITMAP, 2), (CF_METAFILEPICT, 3), (CF_SYLK, 4), (CF_DIF, 5), (CF_TIFF, 6), (CF_OEMTEXT, 7), (CF_DIB, 8), (CF_PALETTE, 9), (CF_PENDATA, 10), (CF_RIFF, 11), (CF_WAVE, 12), (CF_UNICODETEXT, 13), (CF_ENHMETAFILE, 14), (CF_HDROP, 15), (CF_LOCALE, 16), (CF_OWNERDISPLAY, 0x0080), (CF_DSPTEXT, 0x0081), (CF_DSPBITMAP, 0x0082), (CF_DSPMETAFILEPICT, 0x0083), (CF_DSPENHMETAFILE, 0x008E) ] fun toInt (CF_PRIVATE i) = if i >= 0 andalso i < 0xff then 0x0200 + i else raise Size | toInt (CF_GDIOBJ i) = if i >= 0 andalso i < 0xff then 0x0300 + i else raise Size | toInt (CF_REGISTERED i) = i | toInt _ = raise Match fun fromInt i = if i >= 0x0200 andalso i <= 0x02ff then CF_PRIVATE(i-0x0200) else if i >= 0x0300 andalso i <= 0x03ff then CF_GDIOBJ(i-0x0300) else if i >= 0xC000 andalso i < 0xFFFF then CF_REGISTERED i else raise Match in val clipLookup = tableLookup (tab, SOME(fromInt, toInt)) end (* Resources may be specified by strings or by ints. *) datatype RESID = IdAsInt of int | IdAsString of string local open Memory val {store=storeS, load=loadS, ctype} = breakConversion cString fun storeResid(m, IdAsInt i) = if i >= 0 andalso i < 65536 then (setAddress(m, 0w0, sysWord2VoidStar(SysWord.fromInt i)); fn () => ()) else raise Fail "resource id out of range" | storeResid(m, IdAsString s) = storeS(m, s) fun loadResid m = let val v = getAddress(m, 0w0) in if voidStar2Sysword v < 0w65536 then IdAsInt(SysWord.toInt(voidStar2Sysword v)) else IdAsString(loadS m) end in val cRESID = makeConversion { load = loadResid, store = storeResid, ctype = ctype } end (*datatype HelpContext = HelpInfo_MenuItem of | HelpInfo_Window of type HELPINFO = { }*) (* Useful conversions. *) (* Various functions return zero if error. This conversion checks for that. *) fun cPOSINT _ = absConversion {abs = fn 0 => raiseSysErr() | n => n, rep = fn i => i} cInt (* Conversion between string option and C strings. NONE is converted to NULL. *) val STRINGOPT = cOptionPtr cString (* Convert a C string to ML. *) fun fromCstring buff = let open Memory (* We can't use #load cString because the argument is the address of the address of the string. *) fun sLen i = if get8(buff, i) = 0w0 then i else sLen(i+0w1) val length = sLen 0w0 fun loadChar i = Char.chr(Word8.toInt(get8(buff, Word.fromInt i))) in CharVector.tabulate(Word.toInt length, loadChar) end (* Copy a string to a particular offset in a buffer and add a null terminator. *) fun copyStringToMem (buf, n, s) = let open Memory infix 6 ++ fun copyToBuf (i, v) = set8(buf, Word.fromInt(i+n), Byte.charToByte v) in CharVector.appi copyToBuf s; set8(buf, Word.fromInt(n + size s), 0w0) end fun toCstring s = let open Memory val sLen = Word.fromInt(String.size s) val sMem = malloc(sLen + 0w1) val () = copyStringToMem(sMem, 0, s) in sMem end (* When getting a string it is often the case that passing NULL returns the length required. Then a second call will actually retrieve the string. *) fun getStringWithNullIsLength(f: Memory.voidStar*int -> int): string = let open Memory val realLength = f(null, 0) val buff = malloc (Word.fromInt(realLength+1)) val _ = f(buff, realLength) handle ex => (free buff; raise ex) in fromCstring buff before free buff end (* In several cases when extracting a string it is not possible in advance to know how big to make the buffer. This function loops until all the string has been extracted. *) (* This is at least needed for GetClassName *) fun getStringCall(f: Memory.voidStar*int -> int): string = let open Memory fun doCall initialSize = let (* Allocate a buffer to receive the result. For safety we make it one character longer than we actually say because it's not always clear whether the length we pass is the size including the NULL. Equally we are only certain we have read the whole string if the return value is less than initialSize-1 because the return value could be the number of real characters copied to the buffer. *) val buff = malloc (Word.fromInt(initialSize+1)) val resultSize = f(buff, initialSize) handle ex => (free buff; raise ex) in if resultSize < initialSize-1 then (* We've got it all. *) fromCstring buff before free buff else ( free buff; doCall(initialSize + initialSize div 2) ) end in doCall (*1024*) 3 (* Use a small size initially for testing. *) end (* We have a number of calls that extract a vector of results. They are called with an initial size, set the vector to the results and return a count of the number actually assigned. *) fun getVectorResult(element: 'a conversion) = let val { load=loadElem, ctype={size=sizeElem, ...}, ...} = breakConversion element fun run f initialCount = let open Memory infix 6 ++ -- val vec = malloc(Word.fromInt initialCount * sizeElem) fun getElement i = loadElem(vec ++ Word.fromInt i * sizeElem) val resultCount = f (vec, initialCount) handle ex => (free vec; raise ex) in Vector.tabulate(resultCount, getElement) before free vec end in run end (* Some C functions take a vector of values to allow a variable number of elements to be passed. We use a list for this in ML. *) (* TODO: This discards the result of any store function so if we store strings we'll leak store. *) fun list2Vector (conv: 'a conversion) (l:'a list): Memory.voidStar * int = let val count = List.length l val {store=storea, ctype={size=sizea, ...}, ...} = breakConversion conv open Memory infix 6 ++ val vec = malloc(Word.fromInt count * sizea) fun setItem(item, v) = (ignore(storea(v, item)); v ++ sizea) val _ = List.foldl setItem vec l in (vec, count) end val GlobalAlloc = winCall2 (kernel "GlobalAlloc") (cInt, cSIZE_T) cHGLOBAL val GlobalLock = winCall1 (kernel "GlobalLock") (cHGLOBAL) cPointer val GlobalFree = winCall1 (kernel "GlobalFree") (cHGLOBAL) cHGLOBAL val GlobalSize = winCall1 (kernel "GlobalSize") (cHGLOBAL) cSIZE_T val GlobalUnlock = winCall1 (kernel "GlobalUnlock") (cHGLOBAL) cBool (* Conversion for Word8Vector. We can't do this as a general conversion because we can't find out how big the C vector is. *) fun fromCWord8vec (buff, length) = Word8Vector.tabulate(length, fn i => Memory.get8(buff, Word.fromInt i)) fun toCWord8vec(s: Word8Vector.vector): Memory.voidStar = let open Memory Word8Vector val sLen = Word.fromInt(length s) val sMem = malloc sLen val () = appi(fn(i, b) => set8(sMem, Word.fromInt i, b)) s in sMem end (* (* Conversion for a fixed size byte array. *) fun BYTEARRAY n = let val base = Cstruct (List.tabulate (n, fn _ => Cchar)) fun from v = toWord8vec(address v, n) fun to w = if Word8Vector.length w <> n then raise Size else deref(fromWord8vec w) in mkConversion from to base end *) (* Conversion for a fixed size char array. *) fun cCHARARRAY n : string conversion = let (* Make it a struct of chars *) val { size=sizeC, align=alignC, ffiType=ffiTypeC } = LowLevel.cTypeChar val arraySize = sizeC * Word.fromInt n fun ffiType () = LibFFI.createFFItype { size = arraySize, align = alignC, typeCode=LibFFI.ffiTypeCodeStruct, elements = List.tabulate (n, fn _ => ffiTypeC()) } val arrayType: LowLevel.ctype = { size = arraySize, align = alignC, ffiType = ffiType } open Memory fun load(v: voidStar): string = let (* It should be null-terminated but just in case... *) fun sLen i = if i = Word.fromInt n orelse get8(v, i) = 0w0 then i else sLen(i+0w1) val length = sLen 0w0 fun loadChar i = Char.chr(Word8.toInt(get8(v, Word.fromInt i))) in CharVector.tabulate(Word.toInt length, loadChar) end fun store(v: voidStar, s: string) = let (* The length must be less than the size to allow for the null *) val sLen = size s val _ = sLen < n orelse raise Fail "string too long" in CharVector.appi(fn(i, ch) => set8(v, Word.fromInt i, Word8.fromInt(Char.ord ch))) s; set8(v, Word.fromInt sLen, 0w0); fn () => () end in makeConversion { load = load, store = store, ctype = arrayType } end (* These should always be UNSIGNED values. *) local open Word32 infix << >> orb andb val w32ToW = Word.fromLargeWord o Word32.toLargeWord and wTow32 = Word32.fromLargeWord o Word.toLargeWord in fun LOWORD(l) = w32ToW(l andb 0wxFFFF) fun HIWORD(l) = w32ToW((l >> 0w16) andb 0wxFFFF) fun MAKELONG(a, b) = (wTow32 b << 0w16) orb (wTow32 a andb 0wxFFFF) end local open Word infix << >> orb andb val wToW8 = Word8.fromLargeWord o Word.toLargeWord in fun HIBYTE(w) = wToW8((w >> 0w8) andb 0wxFF) fun LOBYTE(w) = wToW8(w andb 0wxFF) end (* Convert between strings and vectors containing Unicode characters. N.B. These are not null terminated. *) local val CP_ACP = 0 (* Default *) val WideCharToMultiByte = winCall8 (kernel "WideCharToMultiByte") (cUint, cDWORD, cByteArray, cInt, cPointer, cInt, cPointer, cPointer) cInt val MultiByteToWideChar = winCall6 (kernel "MultiByteToWideChar") (cUint, cDWORD, cString, cInt, cPointer, cInt) cInt in fun unicodeToString(w: Word8Vector.vector): string = let open Memory val inputLength = Word8Vector.length w div 2 (* Number of unicode chars *) val outputLength = WideCharToMultiByte(CP_ACP, 0, w, inputLength, null, 0, null, null) val outputBuf = malloc(Word.fromInt outputLength) val conv = WideCharToMultiByte(CP_ACP, 0, w, inputLength, outputBuf, outputLength, null, null) fun loadChar i = Char.chr(Word8.toInt(get8(outputBuf, Word.fromInt i))) in (* We can't use fromCstring here because it's not necessarily null terminated. *) CharVector.tabulate(conv, loadChar) before free outputBuf end fun stringToUnicode(s: string): Word8Vector.vector = let open Memory val inputLength = size s (* This does not include a terminating NULL *) (* The lengths returned by MultiByteToWideChar are the number of Unicode chars *) val outputLength = MultiByteToWideChar(CP_ACP, 0, s, inputLength, null, 0) val outputBuf = malloc(Word.fromInt outputLength * 0w2) val conv = MultiByteToWideChar(CP_ACP, 0, s, inputLength, outputBuf, outputLength) fun loadByte i = get8(outputBuf, Word.fromInt i) in Word8Vector.tabulate(conv*2, loadByte) before free outputBuf end end end; polyml-5.6/mlsource/extra/Win/Bitmap.sml000066400000000000000000000447451265146633400203720ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Bitmap: sig type HBITMAP and HDC type COLORREF = Color.COLORREF type RECT = { top: int, left: int, bottom: int, right: int } type SIZE = { cx: int, cy: int } datatype BitmapCompression = BI_BITFIELDS | BI_RGB | BI_RLE4 | BI_RLE8 datatype FloodFillMode = FLOODFILLBORDER | FLOODFILLSURFACE type BITMAP = { width: int, height: int, widthBytes: int, planes: int, bitsPerPixel: int, bits: Word8Vector.vector option } type StretchMode val BLACKONWHITE : StretchMode val COLORONCOLOR : StretchMode val HALFTONE : StretchMode val MAXSTRETCHBLTMODE : StretchMode val WHITEONBLACK : StretchMode type RasterOpCode val BLACKNESS : RasterOpCode val DSTINVERT : RasterOpCode val MERGECOPY : RasterOpCode val MERGEPAINT : RasterOpCode val NOTSRCCOPY : RasterOpCode val NOTSRCERASE : RasterOpCode val PATCOPY : RasterOpCode val PATINVERT : RasterOpCode val PATPAINT : RasterOpCode val SRCAND : RasterOpCode val SRCCOPY : RasterOpCode val SRCERASE : RasterOpCode val SRCINVERT : RasterOpCode val SRCPAINT : RasterOpCode val WHITENESS : RasterOpCode val BitBlt : HDC * int * int * int * int * HDC * int * int * RasterOpCode -> unit val CreateBitmap : {bits: Word8Vector.vector option, width: int, height: int, planes: int, bitsPerPixel: int} -> HBITMAP val CreateBitmapIndirect : BITMAP -> HBITMAP val CreateCompatibleBitmap : HDC * int * int -> HBITMAP val ExtFloodFill : HDC * int * int * COLORREF * FloodFillMode -> unit val GetBitmapBits : HBITMAP * int -> Word8Vector.vector val GetBitmapDimensionEx : HBITMAP -> SIZE val GetPixel : HDC * int * int -> COLORREF val GetStretchBltMode : HDC -> StretchMode type QuaternaryRop val MAKEROP4 : {back: RasterOpCode, fore: RasterOpCode} -> QuaternaryRop val MaskBlt : HDC * int * int * int * int * HDC * int * int * HBITMAP * int * int * QuaternaryRop -> unit (*val PlgBlt : HDC * RECT * HDC * RECT * HBITMAP * int * int -> unit*) val SetBitmapBits : HBITMAP * Word8Vector.vector -> unit val SetBitmapDimensionEx : HBITMAP * int * int * SIZE -> SIZE val SetPixel : HDC * int * int * COLORREF -> COLORREF val SetStretchBltMode : HDC * StretchMode -> unit val StretchBlt : HDC * int * int * int * int * HDC * int * int * int * int * RasterOpCode -> unit type BITMAPINFOHEADER = { width: int, height: int, planes: int, bitsPerPixel: int, compression: BitmapCompression, sizeImage: int, xPelsPerM: int, yPelsPerM: int, clrUsed: int, clrImportant: int } (* ML extension to extract the information from a DIB. *) val getBitmapInfoHdr: Word8Vector.vector -> BITMAPINFOHEADER val GetDIBits: HDC * HBITMAP * int * int * BITMAPINFOHEADER option -> Word8Vector.vector val SetDIBits: HDC * HBITMAP * int * int * Word8Vector.vector -> unit end = struct local open Foreign Base fun checkBitmap c = (checkResult(not(isHgdiObjNull c)); c) in type HDC = HDC and HBITMAP = HBITMAP type COLORREF = Color.COLORREF type SIZE = SIZE and RECT = RECT open GdiBase local datatype StretchMode = W of int in type StretchMode = StretchMode val STRETCHMODE = absConversion {abs = W, rep = fn W n => n} cInt val BLACKONWHITE = W (1) val WHITEONBLACK = W (2) val COLORONCOLOR = W (3) val HALFTONE = W (4) val MAXSTRETCHBLTMODE = W (4) end (*TYPE: FloodFillMode *) datatype FloodFillMode = FLOODFILLBORDER | FLOODFILLSURFACE local val tab = [ (FLOODFILLBORDER, 0), (FLOODFILLSURFACE, 1) ] in val FLOODFILLMODE = tableConversion(tab, NONE) cUint end val ExtFloodFill = winCall5 (gdi "ExtFloodFill") (cHDC,cInt,cInt,cCOLORREF,FLOODFILLMODE) (successState "ExtFloodFill") val GetPixel = winCall3 (gdi "GetPixel") (cHDC,cInt,cInt) cCOLORREF val SetPixel = winCall4 (gdi "SetPixel") (cHDC,cInt,cInt, cCOLORREF) cCOLORREF val BitBlt = winCall9 (gdi "BitBlt") (cHDC,cInt,cInt,cInt,cInt,cHDC,cInt,cInt,cRASTEROPCODE) (successState "BitBlt") val CreateCompatibleBitmap = checkBitmap o winCall3 (gdi "CreateCompatibleBitmap") (cHDC,cInt,cInt) cHBITMAP val GetStretchBltMode = winCall1 (gdi "GetStretchBltMode") (cHDC) STRETCHMODE (* TODO: The raster op is supposed to be a combined operation for the foreground and background. *) val MaskBlt = winCall12(gdi "MaskBlt") (cHDC,cInt,cInt,cInt,cInt,cHDC,cInt,cInt,cHBITMAP,cInt, cInt,cQUATERNARY) (successState "MaskBlt") val SetStretchBltMode = winCall2(gdi "SetStretchBltMode") (cHDC,STRETCHMODE) (successState "SetStretchBltMode") val StretchBlt = winCall11(gdi "StretchBlt") (cHDC,cInt,cInt,cInt,cInt,cHDC,cInt,cInt,cInt,cInt,cRASTEROPCODE) (successState "StretchBlt") (* This definitely has the wrong type. *) (*val PlgBlt = winCall7 (gdi "PlgBlt")(cHDC,RECT,cHDC,RECT,HBITMAP,XCOORD,YCOORD) (successState "PlgBlt")*) local val setBitmapDimensionEx = winCall4 (gdi "SetBitmapDimensionEx") (cHBITMAP, cInt, cInt, cStar cSize) (successState "SetBitmapDimensionEx") in fun SetBitmapDimensionEx(hbm, width, height, s) = let val r = ref s in setBitmapDimensionEx(hbm, width, height, r); !r end end local val getBitmapDimensionEx = winCall2 (gdi "GetBitmapDimensionEx") (cHBITMAP, cStar cSize) (successState "SetBitmapDimensionEx") in fun GetBitmapDimensionEx hbm = let val r = ref {cx=0, cy=0} in getBitmapDimensionEx(hbm, r); !r end end val CreateBitmapIndirect = checkBitmap o winCall1 (gdi "CreateBitmapIndirect") (cConstStar cBITMAP) cHBITMAP local val cbm = checkBitmap o winCall5 (gdi "CreateBitmap") (cInt, cInt, cInt, cInt, cPointer) cHBITMAP in fun CreateBitmap{width, height, planes, bitsPerPixel, bits} = let val vec = case bits of NONE => Memory.null | SOME v => toCWord8vec v val res = cbm(width, height, planes, bitsPerPixel, vec) handle ex => (Memory.free vec; raise ex) in Memory.free vec; checkBitmap res end end (* local (* RGBQUAD values are four bytes of blue, green, red and a reserved byte. *) val RGBQUAD = cStruct4(cUint8, cUint8, cUint8, cUint8) fun from v = let val (b, g, r, _) = v in {red = r, blue = b, green = g} end fun to {red, green, blue} = (blue, green, red, 0) in val RGBQUAD = absConversion {rep=to, abs=from} RGBQUAD end*) (*TYPE: BitmapCompression *) datatype BitmapCompression = BI_RGB | BI_RLE8 | BI_RLE4 | BI_BITFIELDS local val tab = [ (BI_RGB, 0), (BI_RLE8, 1), (BI_RLE4, 2), (BI_BITFIELDS, 3) ] in val (fromComp, toComp) = tableLookup(tab, NONE) val BITCOMPRESSION = absConversion {abs = toComp, rep = fromComp} cDWORD end type BITMAPINFOHEADER = { width: int, height: int, planes: int, bitsPerPixel: int, compression: BitmapCompression, sizeImage: int, xPelsPerM: int, yPelsPerM: int, clrUsed: int, clrImportant: int } (* Device-independent bitmaps are intended to be used for storing and transferring bitmaps. I've written this code to simplify the process of packing and unpacking them. In particular it takes care of the calculating the header size which is generally a bit of a pain. DCJM. *) fun getBitmapInfoHdr(w: Word8Vector.vector): BITMAPINFOHEADER = let val size = LargeWord.toInt(PackWord32Little.subVec(w, 0)) (* Check that the size of the structure given by the first word is less than the overall size. There are various extended versions of the BITMAPINFOHEADER structure but we only look at the fields in the basic one. *) val _ = if size > Word8Vector.length w then raise Fail "Bitmap length field is wrong" else () val width = LargeWord.toIntX(PackWord32Little.subVecX(w, 1)) val height = LargeWord.toIntX(PackWord32Little.subVecX(w, 2)) val planes = LargeWord.toIntX(PackWord16Little.subVecX(w, 6)) val bitsPerPixel = LargeWord.toIntX(PackWord16Little.subVecX(w, 7)) val compression = toComp(LargeWord.toIntX(PackWord32Little.subVecX(w, 4))) val sizeImage = LargeWord.toIntX(PackWord32Little.subVecX(w, 5)) val xPelsPerM = LargeWord.toIntX(PackWord32Little.subVecX(w, 6)) val yPelsPerM = LargeWord.toIntX(PackWord32Little.subVecX(w, 7)) val clrUsed = LargeWord.toIntX(PackWord32Little.subVecX(w, 8)) val clrImportant = LargeWord.toIntX(PackWord32Little.subVecX(w, 9)) in { width = width, height = height, bitsPerPixel = bitsPerPixel, planes = planes, compression = compression, sizeImage = sizeImage, xPelsPerM = xPelsPerM, yPelsPerM = yPelsPerM, clrUsed = clrUsed, clrImportant = clrImportant } end local val DIB_RGB_COLORS = 0 (*val DIB_PAL_COLORS = 1*) val BITMAPINFOHEADER = cStruct11(cDWORD, cLong, cLong, cWORD, cWORD, BITCOMPRESSION, cDWORD, cLong, cLong, cDWORD, cDWORD) val {load=fromR, store=toR, ctype={size=rtypeSize, ...}} = breakConversion BITMAPINFOHEADER val getDIBits = winCall7 (gdi "GetDIBits") (cHDC, cHBITMAP, cUint, cUint, cPointer, cPointer, cUint) cInt val setDIBits = winCall7 (gdi "SetDIBits") (cHDC, cHBITMAP, cUint, cUint, cPointer, cPointer, cUint) cInt val sizeColourEntry = #size LowLevel.cTypeInt (* Should this RGBQUAD? *) in (* This is all a bit messy. GetDIBits can be used in a number of ways to get all or part of the information. Passing NULL for the "bits" argument and setting bitsPerPixel to zero in the BITMAPINFO argument simply fills in the BITMAPINFOHEADER. With bitsPerPixel non-zero it builds a colour table on the end of the BITMAPINFO. With "bits" non-NULL it builds the colour table and creates the bitmap. If NONE is given as the header it returns a vector containing only the header, allowing getBitmapInfoHdr to be used to unpack it. Otherwise it uses the information in the supplied header to get the bitmap. It ignores the passed in sizeImage because that may be wrong. *) fun GetDIBits(hdc: HDC, hb: HBITMAP, startScan, scanLines, NONE) = let (* Allocate a vector for the result and set the length field and bitsPerPixel. The others don't matter. *) open Memory val v = malloc rtypeSize val _ = toR(v, (Word.toInt rtypeSize, 0, 0, 0, 0, BI_RGB, 0, 0, 0, 0, 0)) val res = getDIBits(hdc, hb, startScan, scanLines, Memory.null, v, DIB_RGB_COLORS) handle ex => (free v; raise ex) in checkResult(res <> 0) handle ex => (free v; raise ex); fromCWord8vec(v, Word.toInt rtypeSize) before free v end | GetDIBits(hdc: HDC, hb: HBITMAP, startScan, scanLines, SOME {width, height, planes, bitsPerPixel, compression, sizeImage, xPelsPerM, yPelsPerM, clrUsed, clrImportant}) = let (* The passed in value for sizeImage may be wrong. Call GetDIBits to find the correct value. *) open Memory infix 6 ++ local (* This call will build a colour map so we have to have enough space for it. The biggest possible is with 8 bits. *) val w = malloc (rtypeSize + 0w256 * sizeColourEntry) val _ = toR(w, (Word.toInt rtypeSize, width, height, planes, bitsPerPixel, compression, sizeImage, xPelsPerM, yPelsPerM, clrUsed, clrImportant)) val _ = checkResult(getDIBits(hdc, hb, startScan, scanLines, null, w, DIB_RGB_COLORS) <> 0) handle ex => (free w; raise ex) in val (_, _, _, _, _, _, sizeImage, _, _, _, _) = fromR w val () = free w end (* Calculate the size of the palette. *) val numColours = if clrUsed <> 0 then clrUsed else if bitsPerPixel < 16 then IntInf.<<(1, Word.fromInt bitsPerPixel) else if compression = BI_BITFIELDS then 3 (* These are DWORD colour masks not RGBQUADS. *) else 0 (* No colour table. *) val bitOffset = rtypeSize + Word.fromInt numColours * sizeColourEntry val size = bitOffset + Word.fromInt sizeImage val w = malloc size val _ = toR(w, (Word.toInt rtypeSize, width, height, planes, bitsPerPixel, compression, sizeImage, xPelsPerM, yPelsPerM, clrUsed, clrImportant)) val _ = checkResult(getDIBits(hdc, hb, startScan, scanLines, w ++ bitOffset, w, DIB_RGB_COLORS) <> 0) handle ex => (free w; raise ex) in fromCWord8vec (w, Word.toInt size) before free w end fun SetDIBits(hdc, hb, startScan, scanLines, w) = let open Memory infix 6 ++ val v = toCWord8vec w (*val v = toCbytes w*) (* We need to work out the offset of the bits. For this we need the size of the header structure (which may not be a BITMAPINFOHEADER but some other version of it), the number of colours and the compression. *) val hdrSize = #1 (fromR v) val { clrUsed, compression, bitsPerPixel, ...} = getBitmapInfoHdr w val numColours = if clrUsed <> 0 then clrUsed else if bitsPerPixel < 16 then IntInf.<<(1, Word.fromInt bitsPerPixel) else if compression = BI_BITFIELDS then 3 (* These are DWORD colour masks not RGBQUADS. *) else 0 (* No colour table. *) val bitOffset = Word.fromInt hdrSize +Word.fromInt numColours * sizeColourEntry val res = setDIBits(hdc, hb, startScan, scanLines, v ++ bitOffset, v, DIB_RGB_COLORS) in checkResult(res <> 0) end end (* GetBitmapBits and SetBitmapBits are supposedly obsolete but they're useful for copying device-dependent bitmaps. *) fun GetBitmapBits(hbm, bytes): Word8Vector.vector = let val gbb = winCall3 (gdi "GetBitmapBits") (cHBITMAP, cDWORD, cPointer) cLong open Memory val buff = malloc (Word.fromInt bytes) val () = checkResult(gbb(hbm, bytes, buff) > 0) handle ex => (free buff; raise ex) in fromCWord8vec (buff, bytes) before free buff end fun SetBitmapBits(hbm, w) = let val sbb = winCall3 (gdi "SetBitmapBits") (cHBITMAP, cDWORD, cPointer) cLong val buff = toCWord8vec w open Memory val () = checkResult(sbb(hbm, Word8Vector.length w, buff) > 0) handle ex => (free buff; raise ex) in free buff end (* Other Bitmap functions: AlphaBlend CreateDIBitmap CreateDIBSection - This creates an area of memory to write to - won't work in ML. GetDIBColorTable GradientFill SetDIBColorTable SetDIBitsToDevice SetPixelV StretchDIBits TransparentBlt *) end end; polyml-5.6/mlsource/extra/Win/Brush.sml000066400000000000000000000155621265146633400202340ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Brush: sig type HBITMAP and HBRUSH and HDC datatype HatchStyle = HS_BDIAGONAL | HS_CROSS | HS_DIAGCROSS | HS_FDIAGONAL | HS_HORIZONTAL | HS_VERTICAL datatype BrushStyle = BS_HATCHED of HatchStyle | BS_HOLLOW | BS_PATTERN of HBITMAP | BS_SOLID type COLORREF = Color.COLORREF type LOGBRUSH = BrushStyle * COLORREF type POINT = {x: int, y: int} type RasterOpCode = Bitmap.RasterOpCode datatype ColorType = COLOR_SCROLLBAR | COLOR_BACKGROUND | COLOR_ACTIVECAPTION | COLOR_INACTIVECAPTION | COLOR_MENU | COLOR_WINDOW | COLOR_WINDOWFRAME | COLOR_MENUTEXT | COLOR_WINDOWTEXT | COLOR_CAPTIONTEXT | COLOR_ACTIVEBORDER | COLOR_INACTIVEBORDER | COLOR_APPWORKSPACE | COLOR_HIGHLIGHT | COLOR_HIGHLIGHTTEXT | COLOR_BTNFACE | COLOR_BTNSHADOW | COLOR_GRAYTEXT | COLOR_BTNTEXT | COLOR_INACTIVECAPTIONTEXT | COLOR_BTNHIGHLIGHT | COLOR_3DDKSHADOW | COLOR_3DLIGHT | COLOR_INFOTEXT | COLOR_INFOBK val CreateBrushIndirect : LOGBRUSH -> HBRUSH val CreateHatchBrush : HatchStyle * COLORREF -> HBRUSH val CreatePatternBrush : HBITMAP -> HBRUSH val CreateSolidBrush : COLORREF -> HBRUSH val GetSysColorBrush : ColorType -> HBRUSH val GetBrushOrgEx : HDC -> POINT val PatBlt : HDC * int * int * int * int * RasterOpCode -> unit val SetBrushOrgEx : HDC * POINT -> POINT end = struct local open Foreign Base (* fun gdicall_IW name CR (C1,C2) (a1) = let val (from1,to1,ctype1) = breakConversion C1 val (from2,to2,ctype2) = breakConversion C2 val (fromR,toR,ctypeR) = breakConversion CR val va1 = to1 a1 val va2 = address (alloc 1 ctype2) val res = callgdi name [(ctype1,va1),(Cpointer ctype2,va2)] ctypeR val _: unit = fromR res in (from2 (deref va2)) end fun gdicall_IM name CR (C1,C2) (a1,a2) = let val (from1,to1,ctype1) = breakConversion C1 val (from2,to2,ctype2) = breakConversion C2 val (fromR,toR,ctypeR) = breakConversion CR val va1 = to1 a1 val va2 = address (to2 a2) val res = callgdi name [(ctype1,va1),(Cpointer ctype2,va2)] ctypeR val _ : unit = fromR res in from2 (deref va2) end val XCOORD = INT : int Conversion val YCOORD = INT: int Conversion val WIDTH = INT: int Conversion val HEIGHT = INT: int Conversion*) in type HBRUSH = HBRUSH and COLORREF = Color.COLORREF and HBITMAP = HBITMAP and HDC = HDC and POINT = POINT open GdiBase (* BRUSHES *) val CreateBrushIndirect = winCall1 (user "CreateBrushIndirect") (cConstStar cLOGBRUSH) cHBRUSH and CreateHatchBrush = winCall2 (gdi "CreateHatchBrush") (cHATCHSTYLE, cCOLORREF) cHBRUSH and CreateSolidBrush = winCall1 (gdi "CreateSolidBrush") (cCOLORREF) cHBRUSH local val getBrushOrgEx = winCall2 (gdi "GetBrushOrgEx") (cHDC, cStar cPoint) (successState "GetBrushOrgEx") and setBrushOrgEx = winCall4 (gdi "SetBrushOrgEx")(cHDC, cInt, cInt, cStar cPoint) (successState "SetBrushOrgEx") in fun GetBrushOrgEx hdc = let val v = ref{x=0, y=0} in getBrushOrgEx(hdc, v); !v end and SetBrushOrgEx(hdc, {x, y}) = let val v = ref{x=0, y=0} in setBrushOrgEx(hdc, x, y, v); !v end end val CreatePatternBrush = winCall1 (gdi "CreatePatternBrush") (cHBITMAP) cHBRUSH val PatBlt = winCall6(gdi "PatBlt") (cHDC,cInt,cInt,cInt,cInt,cRASTEROPCODE) (successState "PatBlt") datatype ColorType = COLOR_SCROLLBAR | COLOR_BACKGROUND | COLOR_ACTIVECAPTION | COLOR_INACTIVECAPTION | COLOR_MENU | COLOR_WINDOW | COLOR_WINDOWFRAME | COLOR_MENUTEXT | COLOR_WINDOWTEXT | COLOR_CAPTIONTEXT | COLOR_ACTIVEBORDER | COLOR_INACTIVEBORDER | COLOR_APPWORKSPACE | COLOR_HIGHLIGHT | COLOR_HIGHLIGHTTEXT | COLOR_BTNFACE | COLOR_BTNSHADOW | COLOR_GRAYTEXT | COLOR_BTNTEXT | COLOR_INACTIVECAPTIONTEXT | COLOR_BTNHIGHLIGHT | COLOR_3DDKSHADOW | COLOR_3DLIGHT | COLOR_INFOTEXT | COLOR_INFOBK fun colourTypeToInt COLOR_SCROLLBAR = 0 | colourTypeToInt COLOR_BACKGROUND = 1 | colourTypeToInt COLOR_ACTIVECAPTION = 2 | colourTypeToInt COLOR_INACTIVECAPTION = 3 | colourTypeToInt COLOR_MENU = 4 | colourTypeToInt COLOR_WINDOW = 5 | colourTypeToInt COLOR_WINDOWFRAME = 6 | colourTypeToInt COLOR_MENUTEXT = 7 | colourTypeToInt COLOR_WINDOWTEXT = 8 | colourTypeToInt COLOR_CAPTIONTEXT = 9 | colourTypeToInt COLOR_ACTIVEBORDER = 10 | colourTypeToInt COLOR_INACTIVEBORDER = 11 | colourTypeToInt COLOR_APPWORKSPACE = 12 | colourTypeToInt COLOR_HIGHLIGHT = 13 | colourTypeToInt COLOR_HIGHLIGHTTEXT = 14 | colourTypeToInt COLOR_BTNFACE = 15 | colourTypeToInt COLOR_BTNSHADOW = 16 | colourTypeToInt COLOR_GRAYTEXT = 17 | colourTypeToInt COLOR_BTNTEXT = 18 | colourTypeToInt COLOR_INACTIVECAPTIONTEXT = 19 | colourTypeToInt COLOR_BTNHIGHLIGHT = 20 | colourTypeToInt COLOR_3DDKSHADOW = 21 | colourTypeToInt COLOR_3DLIGHT = 22 | colourTypeToInt COLOR_INFOTEXT = 23 | colourTypeToInt COLOR_INFOBK = 24 (* Create a brush from a system colour. *) val GetSysColorBrush = winCall1 (user "GetSysColorBrush") (cInt) cHBRUSH o colourTypeToInt (* Other Brush functions: CreateDIBPatternBrushPt *) end end; polyml-5.6/mlsource/extra/Win/Button.sml000066400000000000000000000221701265146633400204150ustar00rootroot00000000000000(* Copyright (c) 2001 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Buttons. *) structure Button: sig structure Style: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and BS_3STATE: flags and BS_AUTO3STATE: flags and BS_AUTOCHECKBOX: flags and BS_AUTORADIOBUTTON: flags and BS_BITMAP: flags and BS_BOTTOM: flags and BS_CENTER: flags and BS_CHECKBOX: flags and BS_DEFPUSHBUTTON: flags and BS_FLAT: flags and BS_GROUPBOX: flags and BS_ICON: flags and BS_LEFT: flags and BS_LEFTTEXT: flags and BS_MULTILINE: flags and BS_NOTIFY: flags and BS_OWNERDRAW: flags and BS_PUSHBUTTON: flags and BS_PUSHLIKE: flags and BS_RADIOBUTTON: flags and BS_RIGHT: flags and BS_RIGHTBUTTON: flags and BS_TEXT: flags and BS_TOP: flags and BS_USERBUTTON: flags and BS_VCENTER: flags end structure Notifications: sig val BN_CLICKED: int val BN_PAINT: int val BN_HILITE: int val BN_UNHILITE: int val BN_DISABLE: int val BN_DOUBLECLICKED: int val BN_PUSHED: int val BN_UNPUSHED: int val BN_DBLCLK: int val BN_SETFOCUS: int val BN_KILLFOCUS: int end structure State: sig val BST_UNCHECKED: int val BST_CHECKED: int val BST_INDETERMINATE: int val BST_PUSHED: int val BST_FOCUS: int end end = struct structure Style = struct open Window.Style (* Include all the windows styles. *) type flags = Window.Style.flags (* Causes the type to print as Dialog.Style.flags. *) val BS_PUSHBUTTON: flags = fromWord 0wx00000000 val BS_DEFPUSHBUTTON: flags = fromWord 0wx00000001 val BS_CHECKBOX: flags = fromWord 0wx00000002 val BS_AUTOCHECKBOX: flags = fromWord 0wx00000003 val BS_RADIOBUTTON: flags = fromWord 0wx00000004 val BS_3STATE: flags = fromWord 0wx00000005 val BS_AUTO3STATE: flags = fromWord 0wx00000006 val BS_GROUPBOX: flags = fromWord 0wx00000007 val BS_USERBUTTON: flags = fromWord 0wx00000008 val BS_AUTORADIOBUTTON: flags = fromWord 0wx00000009 val BS_OWNERDRAW: flags = fromWord 0wx0000000B val BS_LEFTTEXT: flags = fromWord 0wx00000020 val BS_TEXT: flags = fromWord 0wx00000000 val BS_ICON: flags = fromWord 0wx00000040 val BS_BITMAP: flags = fromWord 0wx00000080 val BS_LEFT: flags = fromWord 0wx00000100 val BS_RIGHT: flags = fromWord 0wx00000200 val BS_CENTER: flags = fromWord 0wx00000300 val BS_TOP: flags = fromWord 0wx00000400 val BS_BOTTOM: flags = fromWord 0wx00000800 val BS_VCENTER: flags = fromWord 0wx00000C00 val BS_PUSHLIKE: flags = fromWord 0wx00001000 val BS_MULTILINE: flags = fromWord 0wx00002000 val BS_NOTIFY: flags = fromWord 0wx00004000 val BS_FLAT: flags = fromWord 0wx00008000 val BS_RIGHTBUTTON: flags = BS_LEFTTEXT val all = flags[Window.Style.all, BS_PUSHBUTTON, BS_DEFPUSHBUTTON, BS_CHECKBOX, BS_AUTOCHECKBOX, BS_RADIOBUTTON, BS_3STATE, BS_AUTO3STATE, BS_GROUPBOX, BS_USERBUTTON, BS_AUTORADIOBUTTON, BS_OWNERDRAW, BS_LEFTTEXT, BS_TEXT, BS_ICON, BS_BITMAP, BS_LEFT, BS_RIGHT, BS_CENTER, BS_TOP, BS_BOTTOM, BS_VCENTER, BS_PUSHLIKE, BS_MULTILINE, BS_NOTIFY, BS_FLAT] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure Notifications = struct val BN_CLICKED = 0 val BN_PAINT = 1 val BN_HILITE = 2 val BN_UNHILITE = 3 val BN_DISABLE = 4 val BN_DOUBLECLICKED = 5 val BN_PUSHED = BN_HILITE val BN_UNPUSHED = BN_UNHILITE val BN_DBLCLK = BN_DOUBLECLICKED val BN_SETFOCUS = 6 val BN_KILLFOCUS = 7 end (* These are returned by SendMessage(button, BM_GETCHECK) so need to be integers. *) structure State = struct val BST_UNCHECKED = 0x0000 val BST_CHECKED = 0x0001 val BST_INDETERMINATE = 0x0002 val BST_PUSHED = 0x0004 val BST_FOCUS = 0x0008 end end; (* let open Button.Style fun getType w = let val typeField = fromWord(SysWord.andb(toWord w, 0wx0f)) in if typeField = BS_PUSHBUTTON then "BS_PUSHBUTTON" else if typeField = BS_DEFPUSHBUTTON then "BS_DEFPUSHBUTTON" else if typeField = BS_CHECKBOX then "BS_CHECKBOX" else if typeField = BS_AUTOCHECKBOX then "BS_AUTOCHECKBOX" else if typeField = BS_RADIOBUTTON then "BS_RADIOBUTTON" else if typeField = BS_3STATE then "BS_3STATE" else if typeField = BS_AUTO3STATE then "BS_AUTO3STATE" else if typeField = BS_GROUPBOX then "BS_GROUPBOX" else if typeField = BS_USERBUTTON then "BS_USERBUTTON" else if typeField = BS_AUTORADIOBUTTON then "BS_AUTORADIOBUTTON" else if typeField = BS_OWNERDRAW then "BS_OWNERDRAW" else "??" end val flagTable = [(BS_LEFTTEXT, "BS_LEFTTEXT"), (BS_ICON, "BS_ICON"), (BS_BITMAP, "BS_BITMAP"), (BS_CENTER, "BS_CENTER"), (* Must come before the next two. *) (BS_LEFT, "BS_LEFT"), (BS_RIGHT, "BS_RIGHT"), (BS_VCENTER, "BS_VCENTER"), (* Must come before the next two. *) (BS_TOP, "BS_TOP"), (BS_BOTTOM, "BS_BOTTOM"), (BS_PUSHLIKE, "BS_PUSHLIKE"), (BS_MULTILINE, "BS_MULTILINE"), (BS_NOTIFY, "BS_NOTIFY"), (BS_FLAT, "BS_FLAT"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = getType x :: accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *)polyml-5.6/mlsource/extra/Win/Caret.sml000066400000000000000000000067111265146633400202030ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Caret functions. *) structure Caret : sig type HWND and HBITMAP type POINT = { x: int, y: int } datatype caretShape = CaretBitmap of HBITMAP | CaretBlack of {width: int, height: int} | CaretGrey of {width: int, height: int} val CreateCaret : HWND * caretShape -> unit val DestroyCaret : unit -> unit val GetCaretBlinkTime : unit -> Time.time val GetCaretPos : unit -> POINT val HideCaret : HWND -> unit val SetCaretBlinkTime : Time.time -> unit val SetCaretPos : POINT -> unit val ShowCaret : HWND -> unit end = struct local open Foreign open Base open GdiBase in type HWND = HWND and HBITMAP = HBITMAP and POINT = POINT datatype caretShape = CaretBlack of {height: int, width: int} | CaretGrey of {height: int, width: int} | CaretBitmap of HBITMAP local val createCaret = winCall4 (user "CreateCaret") (cHWND, cHBITMAP, cInt, cInt) (successState "CreateCaret") val intAsHgdi = handleOfVoidStar o Memory.sysWord2VoidStar o SysWord.fromInt in (* The x and y value are only used if the bitmap is not 0 or 1. *) fun CreateCaret(hw, CaretBlack{height, width}) = createCaret(hw, hNull, width, height) | CreateCaret(hw, CaretGrey{height, width}) = createCaret(hw, intAsHgdi 1, width, height) | CreateCaret(hw, CaretBitmap hb) = createCaret(hw, hb, 0, 0) end val DestroyCaret = winCall0 (user "DestroyCaret") () (successState "DestroyCaret") val GetCaretBlinkTime = Time.fromMilliseconds o (winCall0 (user "GetCaretBlinkTime") () cUint) val HideCaret = winCall1 (user "HideCaret") (cHWND) (successState "HideCaret") val SetCaretBlinkTime = (winCall1 (user "SetCaretBlinkTime") cUint (successState "SetCaretBlinkTime")) o Time.toMilliseconds (* The result of ShowCaret may be false either if there was an error or if HideCaret was called more than once. *) val ShowCaret = winCall1 (user "ShowCaret") (cHWND) (successState "ShowCaret") local val getCaretPos = winCall1 (user "GetCaretPos") (cStar cPoint) (successState "GetCaretPos") val setCaretPos = winCall2 (user "SetCaretPos") (cInt, cInt) (successState "SetCaretPos") in fun GetCaretPos() = let val v = ref {x=0, y=0 } in getCaretPos v; !v end and SetCaretPos({x, y}: POINT) = setCaretPos(x, y) end end end; polyml-5.6/mlsource/extra/Win/Class.sml000066400000000000000000000242301265146633400202060ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Class: sig type HWND (* = Win.HWND *) and Message (* = Message.Message *) and HINSTANCE (* = Globals.HINSTANCE *) and HBRUSH (* = Brush.HBRUSH *) and HICON (* = Icon.HICON *) and HCURSOR (* = Cursor.HCURSOR *) and HGDIOBJ datatype LRESULT = LRESINT of int | LRESHANDLE of HGDIOBJ datatype 'a ATOM = Registered of {proc: HWND * Message * 'a -> LRESULT * 'a, className: string} | SystemClass of string val Button : unit ATOM val ComboBox : unit ATOM val ComboLBox : unit ATOM val DDEMLEvent : unit ATOM val Edit : unit ATOM val ListBox : unit ATOM val MDIClient : unit ATOM val ScrollBar : unit ATOM val Static : unit ATOM structure Style : sig include BIT_FLAGS val CS_BYTEALIGNCLIENT : flags val CS_BYTEALIGNWINDOW : flags val CS_CLASSDC : flags val CS_DBLCLKS : flags val CS_GLOBALCLASS : flags val CS_HREDRAW : flags val CS_KEYCVTWINDOW : flags val CS_NOCLOSE : flags val CS_NOKEYCVT : flags val CS_OWNDC : flags val CS_PARENTDC : flags val CS_SAVEBITS : flags val CS_VREDRAW : flags end type 'a WNDCLASSEX = {style: Style.flags, wndProc: HWND * Message * 'a -> LRESULT * 'a, hInstance: HINSTANCE, hIcon: HICON option, hCursor: HCURSOR option, hbrBackGround: HBRUSH option, menuName: Resource.RESID option, className: string, hIconSm: HICON option} val RegisterClassEx : 'a WNDCLASSEX -> 'a ATOM val UnregisterClass : string * HINSTANCE -> unit val GetClassInfoEx: HINSTANCE * string -> 'a WNDCLASSEX end = struct local open Foreign open Base open Resource in type Message = Message.Message type HWND = HWND and HINSTANCE = HINSTANCE and HICON = HICON and HBRUSH = HBRUSH and HCURSOR = HCURSOR and HGDIOBJ = HGDIOBJ datatype LRESULT = datatype Message.LRESULT structure Style = struct open Word32 type flags = Word32.word val toWord = SysWord.fromLargeWord o toLargeWord and fromWord = fromLargeWord o SysWord.toLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val CS_VREDRAW: flags = 0wx0001 val CS_HREDRAW: flags = 0wx0002 val CS_KEYCVTWINDOW: flags = 0wx0004 val CS_DBLCLKS: flags = 0wx0008 val CS_OWNDC: flags = 0wx0020 val CS_CLASSDC: flags = 0wx0040 val CS_PARENTDC: flags = 0wx0080 val CS_NOKEYCVT: flags = 0wx0100 val CS_NOCLOSE: flags = 0wx0200 val CS_SAVEBITS: flags = 0wx0800 val CS_BYTEALIGNCLIENT: flags = 0wx1000 val CS_BYTEALIGNWINDOW: flags = 0wx2000 val CS_GLOBALCLASS: flags = 0wx4000 val all = flags[CS_VREDRAW, CS_HREDRAW, CS_KEYCVTWINDOW, CS_DBLCLKS, CS_OWNDC, CS_CLASSDC, CS_NOKEYCVT, CS_NOCLOSE, CS_SAVEBITS, CS_BYTEALIGNCLIENT, CS_BYTEALIGNWINDOW, CS_GLOBALCLASS] val intersect = List.foldl (fn (a, b) => andb(a,b)) all end (* Classes are either registered by the user, in which case they have ML callback functions, or they are built-in, such as Edit. *) datatype 'a ATOM = Registered of { proc: HWND * Message * 'a -> LRESULT * 'a, className: string } | SystemClass of string val Button: unit ATOM = SystemClass "Button" and ComboBox: unit ATOM = SystemClass "ComboBox" and ComboLBox: unit ATOM = SystemClass "ComboLBox" and DDEMLEvent: unit ATOM = SystemClass "DDEMLEvent" and Edit: unit ATOM = SystemClass "Edit" and ListBox: unit ATOM = SystemClass "ListBox" and MDIClient: unit ATOM = SystemClass "MDIClient" (* Maybe treat this specially. *) and ScrollBar: unit ATOM = SystemClass "ScrollBar" and Static: unit ATOM = SystemClass "Static" type 'a WNDCLASSEX = {style: Style.flags, wndProc: HWND * Message * 'a -> LRESULT * 'a, hInstance: HINSTANCE, hIcon: HICON option, hCursor: HCURSOR option, hbrBackGround: HBRUSH option, menuName: RESID option, className: string, hIconSm: HICON option} local val cWNDCLASSEX = cStruct12(cUint,cUintw, cFunction,cInt,cInt,cHINSTANCE,cHGDIOBJOPT, cHGDIOBJOPT,cHGDIOBJOPT,cRESID,cString,cHGDIOBJOPT) val { ctype = {size=sizeWndclassEx, ...}, ...} = breakConversion cWNDCLASSEX val registerClassEx = winCall1 (user "RegisterClassExA") (cConstStar cWNDCLASSEX) cUint in fun RegisterClassEx({style: Style.flags, wndProc: HWND * Message * 'a -> LRESULT * 'a, hInstance: HINSTANCE, hIcon: HICON option, hCursor: HCURSOR option, hbrBackGround: HBRUSH option, menuName: RESID option, className: string, hIconSm: HICON option}: 'a WNDCLASSEX): 'a ATOM = let (* The window procedure we pass to the C call is our dispatch function in the RTS. *) val windowProc = Message.mainWinProc val cWndClass = (Word.toInt sizeWndclassEx, style, windowProc, 0, (* Class extra *) 0, (* Window extra *) hInstance, hIcon, hCursor, hbrBackGround, getOpt(menuName, IdAsInt 0), className, hIconSm) val res = registerClassEx cWndClass (* The result is supposed to be an atom but it doesn't always work to pass this directly to CreateWindow. *) in checkResult(res <> 0); Registered{proc = wndProc, className = className} end end local (* We can't use the same definition of WNDCLASSEX as above because we can't return a callback function as a result, at least at the moment. Also we use CallWindowProc because it does Unicode to ANSI conversion. *) val cWNDCLASSEX = cStruct12(cUint,cUint, cPointer,cInt,cInt,cHINSTANCE,cHGDIOBJOPT, cHGDIOBJOPT,cHGDIOBJOPT,cRESID,cString,cHGDIOBJOPT) val { ctype = {size=sizeWndclassEx, ...}, ...} = breakConversion cWNDCLASSEX val CallWindowProc = winCall5 (user "CallWindowProcA") (cPointer, cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw in fun GetClassInfoEx(hInst, class): 'a WNDCLASSEX = let val v = ref(Word.toInt sizeWndclassEx, 0, Memory.null, 0, 0, hNull, NONE, NONE, NONE, IdAsInt 0, "", NONE) val () = winCall3(user "GetClassInfoExA") (cHINSTANCE, cString, cStar cWNDCLASSEX) (successState "GetClassInfoEx") (hInst, class, v) val (_, style, wproc, _, _, hInstance, hIcon, hCursor, hbrBackGround, menuName, className, hIconSm) = !v val mName = case menuName of IdAsInt 0 => NONE | IdAsString "" => NONE | m => SOME m fun wndProc(hwnd, msg, state) = let val (msgId: int, wParam, lParam, freeMsg) = Message.compileMessage msg val res = CallWindowProc(wproc, hwnd, msgId, wParam, lParam) in (Message.messageReturnFromParams(msg, wParam, lParam, res), state) before freeMsg() end in {style = Style.fromWord(LargeWord.fromInt style), wndProc = wndProc, hInstance = hInstance, hIcon = hIcon, hCursor = hCursor, hbrBackGround = hbrBackGround, menuName = mName, className = className, hIconSm = hIconSm }: 'a WNDCLASSEX end (* The underlying call can take either a string or an atom. I really don't know which is better here. *) (* TODO: We should extract the window proc and call freeCallback on it. *) val UnregisterClass = winCall2 (user "UnregisterClassA") (cString, cHINSTANCE) (successState "UnregisterClass") end (* The following functions are used with window classes. GetClassInfoEx GetClassLong GetWindowLong - in Window SetClassLong SetWindowLong Obsolete Functions GetClassInfo GetClassWord GetWindowWord RegisterClass SetClassWord SetWindowWord *) end end; polyml-5.6/mlsource/extra/Win/Clipboard.sml000066400000000000000000000335121265146633400210430ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Clipboard : sig (* Clipboard formats. I've added CF_NONE, CF_PRIVATE, CF_GDIOBJ and CF_REGISTERED *) datatype ClipboardFormat = CF_NONE | CF_TEXT | CF_BITMAP | CF_METAFILEPICT | CF_SYLK | CF_DIF | CF_TIFF | CF_OEMTEXT | CF_DIB | CF_PALETTE | CF_PENDATA | CF_RIFF | CF_WAVE | CF_UNICODETEXT | CF_ENHMETAFILE | CF_OWNERDISPLAY | CF_DSPTEXT | CF_DSPBITMAP | CF_DSPMETAFILEPICT | CF_DSPENHMETAFILE | CF_PRIVATE of int | CF_GDIOBJ of int | CF_REGISTERED of int | CF_HDROP | CF_LOCALE type HBITMAP and HPALETTE and HWND and HDROP datatype CLIPHANDLE = CH_NONE | CH_TEXT of string | CH_BITMAP of HBITMAP | CH_METAFILEPICT of Metafile.METAFILEPICT | CH_SYLK of Word8Vector.vector | CH_DIF of Word8Vector.vector | CH_TIFF of Word8Vector.vector | CH_OEMTEXT of string | CH_DIB of Word8Vector.vector | CH_PALETTE of HPALETTE | CH_PENDATA of Word8Vector.vector | CH_RIFF of Word8Vector.vector | CH_WAVE of Word8Vector.vector | CH_UNICODETEXT of Word8Vector.vector | CH_ENHMETAFILE of Metafile.HENHMETAFILE | CH_OWNERDISPLAY of Word8Vector.vector | CH_DSPTEXT of Word8Vector.vector | CH_DSPBITMAP of Word8Vector.vector | CH_DSPMETAFILEPICT of Word8Vector.vector | CH_DSPENHMETAFILE of Word8Vector.vector | CH_PRIVATE of int * Word8Vector.vector | CH_GDIOBJ of int * Word8Vector.vector | CH_REGISTERED of int * Word8Vector.vector | CH_HDROP of HDROP | CH_LOCALE of Word8Vector.vector val ChangeClipboardChain : HWND * HWND -> bool val CloseClipboard : unit -> unit val CountClipboardFormats : unit -> int val EmptyClipboard : unit -> unit val EnumClipboardFormats : ClipboardFormat -> ClipboardFormat val GetClipboardData : ClipboardFormat -> CLIPHANDLE val GetClipboardFormatName : ClipboardFormat -> string val GetClipboardOwner : unit -> HWND val GetClipboardViewer : unit -> HWND val GetOpenClipboardWindow : unit -> HWND val GetPriorityClipboardFormat : ClipboardFormat list -> ClipboardFormat option val IsClipboardFormatAvailable : ClipboardFormat -> bool val OpenClipboard : HWND option -> unit val RegisterClipboardFormat : string -> ClipboardFormat val SetClipboardData : CLIPHANDLE -> unit val SetClipboardViewer : HWND -> HWND end = struct local open Foreign open Base val GMEM_SHARE = 0x2000 and GMEM_MOVEABLE = 0x0002 val GMEM_OPTS = IntInf.orb(GMEM_SHARE, GMEM_MOVEABLE) val {load=fromMFP, store=toMFP, ctype={size=sizeMfp, ...}, ...} = breakConversion GdiBase.cMETAFILEPICT in type HBITMAP = HBITMAP and HPALETTE = HPALETTE and HWND = HWND and HDROP = HDROP datatype ClipboardFormat = datatype ClipboardFormat (* The data is transferred to and from the clipboard in various formats. I've added this datatype to deal with them. *) datatype CLIPHANDLE = CH_NONE | CH_TEXT of string | CH_BITMAP of HBITMAP | CH_METAFILEPICT of Metafile.METAFILEPICT | CH_SYLK of Word8Vector.vector | CH_DIF of Word8Vector.vector | CH_TIFF of Word8Vector.vector | CH_OEMTEXT of string | CH_DIB of Word8Vector.vector | CH_PALETTE of HPALETTE | CH_PENDATA of Word8Vector.vector | CH_RIFF of Word8Vector.vector | CH_WAVE of Word8Vector.vector | CH_UNICODETEXT of Word8Vector.vector | CH_ENHMETAFILE of Metafile.HENHMETAFILE | CH_OWNERDISPLAY of Word8Vector.vector | CH_DSPTEXT of Word8Vector.vector | CH_DSPBITMAP of Word8Vector.vector | CH_DSPMETAFILEPICT of Word8Vector.vector | CH_DSPENHMETAFILE of Word8Vector.vector | CH_PRIVATE of int * Word8Vector.vector | CH_GDIOBJ of int * Word8Vector.vector | CH_REGISTERED of int * Word8Vector.vector | CH_HDROP of HDROP | CH_LOCALE of Word8Vector.vector local val (toInt, fromInt) = clipLookup in val cCLIPFORMAT = absConversion {abs = fromInt, rep = toInt} cUint end val ChangeClipboardChain = winCall2 (user "ChangeClipboardChain") (cHWND, cHWND) cBool and CloseClipboard = winCall0 (user "CloseClipboard") () (successState "CloseClipboard") and CountClipboardFormats = winCall0 (user "CountClipboardFormats") () cInt and EmptyClipboard = winCall0 (user "EmptyClipboard") () (successState "EmptyClipboard") and EnumClipboardFormats = winCall1 (user "EnumClipboardFormats") (cCLIPFORMAT) cCLIPFORMAT and GetClipboardOwner = winCall0 (user "GetClipboardOwner") () cHWND and GetClipboardViewer = winCall0 (user "GetClipboardViewer") () cHWND and GetOpenClipboardWindow = winCall0 (user "GetOpenClipboardWindow") () cHWND and IsClipboardFormatAvailable = winCall1 (user "IsClipboardFormatAvailable") (cCLIPFORMAT) cBool and OpenClipboard = winCall1 (user "OpenClipboard") (cHWNDOPT) (successState "OpenClipboard") and RegisterClipboardFormat = CF_REGISTERED o winCall1 (user "RegisterClipboardFormat") (cString) cUint and SetClipboardViewer = winCall1 (user "SetClipboardViewer") (cHWND) cHWND local (* The argument and result are actually HANDLE but we haven't got quite the right form of subclassing to allow all the various handle types to be combined. *) val setClipboardData = winCall2(user "SetClipboardData") (cCLIPFORMAT, cHGLOBAL) cHGLOBAL (* Most clipboard data is passed in memory allocated using GlobalAlloc. *) fun globString (s: string) = let val hGlob = GlobalAlloc(GMEM_OPTS, size s + 1) val mem = GlobalLock hGlob in copyStringToMem(mem, 0, s); GlobalUnlock hGlob; hGlob end and globMem (w: Word8Vector.vector) = let val length = Word8Vector.length w val hGlob = GlobalAlloc(GMEM_OPTS, length) val buf = GlobalLock hGlob in Word8Vector.appi (fn (i, v) => Memory.set8(buf, Word.fromInt i, v)) w; GlobalUnlock hGlob; hGlob end fun toHglobal (h: 'a HANDLE): HGLOBAL = handleOfVoidStar(voidStarOfHandle h) in (* SetClipboardData copies the data to the clipboard. It is possible to pass NULL as the handle and instead process the WM_RENDERFORMAT message. We don't support that. *) fun SetClipboardData(clip: CLIPHANDLE): unit = let (* Convert the various data formats and get the format type to pass. *) val (cf, data) = case clip of CH_NONE => raise Fail "SetClipboardData: No data" | CH_TEXT t => (CF_TEXT, globString t) | CH_BITMAP b => (CF_BITMAP, toHglobal b) | CH_METAFILEPICT p => let val hGlob = GlobalAlloc(GMEM_OPTS, Word.toInt sizeMfp) in ignore(toMFP(GlobalLock hGlob, p)); GlobalUnlock hGlob; (CF_METAFILEPICT, hGlob) end | CH_SYLK m => (CF_SYLK, globMem m) | CH_DIF m => (CF_DIF, globMem m) | CH_TIFF m => (CF_TIFF, globMem m) | CH_OEMTEXT t => (CF_OEMTEXT, globString t) | CH_DIB m => (CF_DIB, globMem m) | CH_PALETTE p => (CF_PALETTE, toHglobal p) | CH_PENDATA m => (CF_PENDATA, globMem m) | CH_RIFF m => (CF_RIFF, globMem m) | CH_WAVE m => (CF_WAVE, globMem m) | CH_UNICODETEXT m => (CF_UNICODETEXT, globMem m) | CH_ENHMETAFILE mf => (CF_ENHMETAFILE, toHglobal mf) | CH_OWNERDISPLAY m => (CF_OWNERDISPLAY, globMem m) | CH_DSPTEXT m => (CF_DSPTEXT, globMem m) | CH_DSPBITMAP m => (CF_DSPBITMAP, globMem m) | CH_DSPMETAFILEPICT m => (CF_DSPMETAFILEPICT, globMem m) | CH_DSPENHMETAFILE m => (CF_DSPENHMETAFILE, globMem m) | CH_PRIVATE(i, m) => (CF_PRIVATE i, globMem m) | CH_GDIOBJ(i, m) => (CF_GDIOBJ i, globMem m) | CH_REGISTERED(i, m) => (CF_REGISTERED i, globMem m) | CH_HDROP d => (CF_HDROP, toHglobal d) | CH_LOCALE m => (CF_LOCALE, globMem m) val res = setClipboardData (cf, data) in if res = hNull then raiseSysErr () else () end end local val getClipboardData = winCall1 (user "GetClipboardData") (cCLIPFORMAT) cHGLOBAL fun getMem hg = fromCWord8vec(GlobalLock hg, GlobalSize hg) before ignore(GlobalUnlock hg) and getText hg = fromCstring(GlobalLock hg) before ignore(GlobalUnlock hg) fun fromHglobal (h: HGLOBAL): 'a HANDLE = handleOfVoidStar(voidStarOfHandle h) in fun GetClipboardData(f: ClipboardFormat): CLIPHANDLE = let (* The result of GetClipboardData is a handle, usually but not always an HGLOBAL pointing to a piece of memory. *) val res = getClipboardData f val _ = checkResult (res <> hNull) in case f of CF_NONE => CH_NONE | CF_TEXT => CH_TEXT(getText res) | CF_BITMAP => CH_BITMAP(fromHglobal res) | CF_METAFILEPICT => CH_METAFILEPICT(fromMFP(GlobalLock res)) before ignore(GlobalUnlock res) | CF_SYLK => CH_SYLK(getMem res) | CF_DIF => CH_DIF(getMem res) | CF_TIFF => CH_TIFF(getMem res) | CF_OEMTEXT => CH_OEMTEXT(getText res) | CF_DIB => CH_DIB(getMem res) | CF_PALETTE => CH_PALETTE(fromHglobal res) | CF_PENDATA => CH_PENDATA(getMem res) | CF_RIFF => CH_RIFF(getMem res) | CF_WAVE => CH_WAVE(getMem res) | CF_UNICODETEXT => CH_UNICODETEXT(getMem res) | CF_ENHMETAFILE => CH_ENHMETAFILE(fromHglobal res) | CF_OWNERDISPLAY => CH_OWNERDISPLAY(getMem res) | CF_DSPTEXT => CH_DSPTEXT(getMem res) | CF_DSPBITMAP => CH_DSPBITMAP(getMem res) | CF_DSPMETAFILEPICT => CH_DSPMETAFILEPICT(getMem res) | CF_DSPENHMETAFILE => CH_DSPENHMETAFILE(getMem res) | CF_PRIVATE i => CH_PRIVATE(i, getMem res) | CF_GDIOBJ i => CH_GDIOBJ(i, getMem res) | CF_REGISTERED i => CH_REGISTERED(i, getMem res) | CF_HDROP => CH_HDROP(fromHglobal res) | CF_LOCALE => CH_LOCALE(getMem res) end end local val getformat = winCall3 (user "GetClipboardFormatNameA") (cCLIPFORMAT, cPointer, cInt) cInt in (* Loop until we have read the whole string. The result may legitimately be a null string. *) fun GetClipboardFormatName(f: ClipboardFormat): string = getStringCall(fn (buff, n) => getformat(f, buff, n)) end local val getPriorityClipboardFormat = winCall2(user "GetPriorityClipboardFormat") (cPointer, cInt) cInt in fun GetPriorityClipboardFormat(l: ClipboardFormat list): ClipboardFormat option = let val (vec, count) = list2Vector cCLIPFORMAT l val res = getPriorityClipboardFormat(vec, count) handle ex => (Memory.free vec; raise ex) val () = Memory.free vec in (* It returns 0 if the clipboard is empty, ~1 if it doesn't contain any of the requested formats and >0 if it contains one of the formats. We map ~1 to NONE. *) if res < 0 then NONE else SOME(#2 clipLookup res) end end end end; (* Other clipboard functions: GetClipboardSequenceNumber - Windows 98 and NT 5.0 only *) polyml-5.6/mlsource/extra/Win/Clipping.sml000066400000000000000000000072171265146633400207140ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Clipping : sig type HDC and HRGN type RECT = { top: int, left: int, bottom: int, right: int } type POINT = { x: int, y: int } type RegionOperation = Region.RegionOperation type ResultRegion = Region.ResultRegion val ExcludeClipRect : HDC * RECT -> ResultRegion val ExtSelectClipRgn : HDC * HRGN * RegionOperation -> ResultRegion val GetClipBox : HDC -> ResultRegion * RECT val GetClipRgn : HDC * HRGN -> unit val GetMetaRgn : HDC * HRGN -> unit val IntersectClipRect : HDC * RECT -> ResultRegion val OffsetClipRgn : HDC * int * int -> ResultRegion val PtVisible : HDC * POINT -> bool val RectVisible : HDC * RECT -> bool val SelectClipPath : HDC * RegionOperation -> unit val SelectClipRgn : HDC * HRGN -> unit val SetMetaRgn : HDC -> unit end = struct local open Foreign Base GdiBase in type RegionOperation = RegionOperation and ResultRegion = ResultRegion type RECT = RECT and HDC = HDC and HRGN = HRGN and POINT = POINT val ExtSelectClipRgn = winCall3(gdi "ExtSelectClipRgn") (cHDC,cHRGN,REGIONOPERATION) RESULTREGION val GetClipRgn = winCall2(gdi "GetClipRgn") (cHDC,cHRGN) (successState "GetClipRgn") val GetMetaRgn = winCall2(gdi "GetMetaRgn") (cHDC,cHRGN) (successState "GetMetaRgn") val OffsetClipRgn = winCall3(gdi "OffsetClipRgn") (cHDC,cInt,cInt) RESULTREGION val RectVisible = winCall2(gdi "RectVisible") (cHDC,cConstStar cRect) cBool val SelectClipPath = winCall2(gdi "SelectClipPath") (cHDC,REGIONOPERATION) (successState "SelectClipPath") val SelectClipRgn = winCall2(gdi "SelectClipRgn") (cHDC,cHRGN) (successState "SelectClipRgn") val SetMetaRgn = winCall1(gdi "SetMetaRgn") (cHDC) (successState "SetMetaRgn") local val ptVisible = winCall3(gdi "PtVisible") (cHDC,cInt,cInt) cBool in fun PtVisible(hd, {x, y}) = ptVisible(hd, x, y) end local val excludeClipRect = winCall5 (gdi "ExcludeClipRect") (cHDC,cInt,cInt,cInt,cInt) RESULTREGION in fun ExcludeClipRect (h,{left,top,right,bottom}) = excludeClipRect(h,left,top,right,bottom) end local val intersectClipRect = winCall5 (gdi "IntersectClipRect") (cHDC,cInt,cInt,cInt,cInt) RESULTREGION in fun IntersectClipRect (h,{left,top,right,bottom}: RECT) = intersectClipRect(h,left,top,right,bottom) end local val getClipBox = winCall2 (gdi "GetClipBox") (cHDC, cStar cRect) RESULTREGION val zeroRect = { top=0, bottom=0, left=0, right=0} in fun GetClipBox hdc = let val v = ref zeroRect val res = getClipBox(hdc, v) in (res, !v) end end end end; polyml-5.6/mlsource/extra/Win/Color.sml000066400000000000000000000234321265146633400202220ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Color (* Use American spelling for consistency. *): sig type HPALETTE and HDC datatype PaletteEntryFlag = PC_EXPLICIT | PC_NOCOLLAPSE | PC_NULL | PC_RESERVED type PALETTEENTRY = {red: int, green: int, blue: int, flags: PaletteEntryFlag} type COLORREF val toRGB : COLORREF -> {red: Int.int, blue: Int.int, green: Int.int} val RGB : {red: int, blue: int, green: int} -> COLORREF val PALETTERGB : {red: int, blue: int, green: int} -> COLORREF type SystemPaletteUse val SYSPAL_ERROR : SystemPaletteUse val SYSPAL_NOSTATIC : SystemPaletteUse val SYSPAL_STATIC : SystemPaletteUse val AnimatePalette : HPALETTE * int * PALETTEENTRY list -> bool val CreateHalftonePalette : HDC -> HPALETTE val CreatePalette : PALETTEENTRY list -> HPALETTE val GetNearestColor : HDC * COLORREF -> COLORREF val GetNearestPaletteIndex : HPALETTE * COLORREF -> int val GetPaletteEntries : HPALETTE * int * int -> PALETTEENTRY list val GetSystemPaletteEntries : HDC * int * int -> PALETTEENTRY list val GetSystemPaletteUse : HDC -> SystemPaletteUse val RealizePalette : HDC -> int val ResizePalette : HPALETTE * int -> unit val SelectPalette : HDC * HPALETTE * bool -> HPALETTE val SetPaletteEntries : HPALETTE * int * PALETTEENTRY list -> unit val SetSystemPaletteUse : HDC * SystemPaletteUse -> SystemPaletteUse val UnrealizeObject : HPALETTE -> unit val UpdateColors : HDC -> unit end = struct local open Foreign Base in type HDC = HDC and HPALETTE = HPALETTE open GdiBase local datatype SystemPaletteUse = W of int in type SystemPaletteUse = SystemPaletteUse val SYSTEMPALETTEUSE = absConversion {abs = W, rep = fn W n => n} cUint val SYSPAL_ERROR = W (0) val SYSPAL_STATIC = W (1) val SYSPAL_NOSTATIC = W (2) end datatype PaletteEntryFlag = PC_NULL | PC_RESERVED | PC_EXPLICIT | PC_NOCOLLAPSE type PALETTEENTRY = {red: int, green: int, blue: int, flags: PaletteEntryFlag} local val cPaletteEnt = cStruct4(cUint8, cUint8, cUint8, cUint8) val { load=loadPE, store=storePE, ctype={size=peSize, ...} } = breakConversion cPaletteEnt fun toPE({red, green, blue, flags}: PALETTEENTRY) = let val f = case flags of PC_NULL => 0 | PC_RESERVED => 1 | PC_EXPLICIT => 2 | PC_NOCOLLAPSE => 4 in (red, green, blue, f) end fun fromPE (red, green, blue, f): PALETTEENTRY = let val flags = case f of 0 => PC_NULL | 1 => PC_RESERVED | 2 => PC_EXPLICIT | 4 => PC_NOCOLLAPSE | _ => raise Match in {red=red, green=green, blue=blue, flags=flags} end open Memory infix 6 ++ val logPal = cStruct2(cWORD, cWORD) val {store=storeLP, ctype={size=lpSize, ...}, ...} = breakConversion logPal in (* Unfortunately we can't make a simple conversion here. When we load the entries we need to know how many we're loading. *) fun allocPEVec n = malloc(Word.fromInt n * peSize) val freePEVec = free local (* Copy the elements into the array. *) fun doStore (pe: PALETTEENTRY, vec) = ( ignore(storePE(vec, toPE pe)); (* Ignore result - nothing to free *) vec ++ peSize ) in fun palListToC pl = let val count = List.length pl val vec = allocPEVec count val _ = List.foldl doStore vec pl in (vec, count) end fun logPaletteToC pl = let (* A logical palette has two additional words at the start. *) val count = List.length pl val vec = malloc(Word.fromInt count * peSize + lpSize) val _ = storeLP(vec, (0x300, count)) val _ = List.foldl doStore (vec ++ lpSize) pl in vec end end fun palListFromC(vec, count) = let fun loadPalE n = fromPE(loadPE(vec ++ Word.fromInt n * peSize)) in List.tabulate(count, loadPalE) end end val GetSystemPaletteUse = winCall1(gdi "GetSystemPaletteUse") (cHDC) SYSTEMPALETTEUSE val RealizePalette = winCall1(gdi "RealizePalette") (cHDC) cUint val ResizePalette = winCall2(gdi "ResizePalette") (cHPALETTE,cUint) (successState "ResizePalette") val SelectPalette = winCall3(gdi "SelectPalette") (cHDC,cHPALETTE,cBool) cHPALETTE val SetSystemPaletteUse = winCall2(gdi "SetSystemPaletteUse") (cHDC,SYSTEMPALETTEUSE) SYSTEMPALETTEUSE val UpdateColors = winCall1(gdi "UpdateColors") (cHDC) (successState "UpdateColors") val CreateHalftonePalette = winCall1(gdi "CreateHalftonePalette") (cHDC) cHPALETTE val GetNearestColor = winCall2 (gdi "GetNearestColor") (cHDC,cCOLORREF) cCOLORREF val GetNearestPaletteIndex = winCall2 (gdi "GetNearestPaletteIndex") (cHPALETTE,cCOLORREF) cUint val UnrealizeObject = winCall1(gdi "UnrealizeObject") (cHPALETTE) (successState "UnrealizeObject") local val animatePalette = winCall4 (gdi "AnimatePalette") (cHPALETTE, cUint, cUint, cPointer) (cBool) in fun AnimatePalette (h,start,pl) = let val (vec, count) = palListToC pl val res = animatePalette(h, start, count, vec) handle ex => (freePEVec vec; raise ex) val () = freePEVec vec in res end end local val createPalette = winCall1 (gdi "CreatePalette") (cPointer) (cHPALETTE) in fun CreatePalette pl = let val vec = logPaletteToC pl val res = createPalette vec handle ex => (freePEVec vec; raise ex) val () = freePEVec vec val () = checkResult(not(isHNull res)) in res end end local val getPaletteEntries = winCall4 (gdi "GetPaletteEntries") (cHPALETTE, cUint, cUint, cPointer) cUint in fun GetPaletteEntries (h, start, no) = let val vec = allocPEVec no val res = getPaletteEntries (h, start, no, vec) (* The result is zero if error *) val result = palListFromC(vec, res) val () = freePEVec vec val () = checkResult(res <> 0) in result end end local val getSystemPaletteEntries = winCall4 (gdi "GetSystemPaletteEntries") (cHDC, cUint, cUint, cPointer) cUint in fun GetSystemPaletteEntries (h, start, no) = let val vec = allocPEVec no val res = getSystemPaletteEntries (h, start, no, vec) (* The result is zero if error *) val result = palListFromC(vec, res) val () = freePEVec vec val () = checkResult(res <> 0) in result end end local val setPaletteEntries = winCall4 (gdi "SetPaletteEntries") (cHPALETTE, cUint, cUint, cPointer) cUint in fun SetPaletteEntries (h, start,pl) = let val (vec, count) = palListToC pl val res = setPaletteEntries(h, start, count, vec) handle ex => (freePEVec vec; raise ex) val () = freePEVec vec in checkResult(res <> 0) end end (* Other Colour functions: GetColorAdjustment GetSystemPaletteUse SetColorAdjustment *) end end; (* Install a pretty printer for COLORREF. *) local open Color fun printColorRef _ _ x = let val {red, green, blue} = toRGB x in PolyML.PrettyString (concat["RGB{red=", Int.toString red, ",green=", Int.toString green, ",blue=", Int.toString blue, "}"]) end in val _ = PolyML.addPrettyPrinter printColorRef end; polyml-5.6/mlsource/extra/Win/ComboBase.sml000066400000000000000000000027541265146633400210020ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ComboBase = struct local open Foreign Base in datatype CBDirAttr = DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_DIRECTORY | DDL_ARCHIVE | DDL_POSTMSGS | DDL_DRIVES | DDL_EXCLUSIVE local val tab = [ (DDL_READWRITE, 0wx0000), (DDL_READONLY, 0wx0001), (DDL_HIDDEN, 0wx0002), (DDL_SYSTEM, 0wx0004), (DDL_DIRECTORY, 0wx0010), (DDL_ARCHIVE, 0wx0020), (DDL_POSTMSGS, 0wx2000), (DDL_DRIVES, 0wx4000), (DDL_EXCLUSIVE, 0wx8000) ] in val CBDIRATTRS = tableSetLookup(tab, NONE) end end end; polyml-5.6/mlsource/extra/Win/Combobox.sml000066400000000000000000000152441265146633400207160ustar00rootroot00000000000000(* Copyright (c) 2001 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Comboboxes. *) structure Combobox: sig structure Style: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW: flags and WS_CHILDWINDOW: flags and CBS_SIMPLE: flags and CBS_DROPDOWN: flags and CBS_DROPDOWNLIST: flags and CBS_OWNERDRAWFIXED: flags and CBS_OWNERDRAWVARIABLE: flags and CBS_AUTOHSCROLL: flags and CBS_OEMCONVERT: flags and CBS_SORT: flags and CBS_HASSTRINGS: flags and CBS_NOINTEGRALHEIGHT: flags and CBS_DISABLENOSCROLL: flags and CBS_UPPERCASE: flags and CBS_LOWERCASE: flags end structure Notifications: sig val CBN_SELCHANGE: int val CBN_DBLCLK: int val CBN_SETFOCUS: int val CBN_KILLFOCUS: int val CBN_EDITCHANGE: int val CBN_EDITUPDATE: int val CBN_DROPDOWN: int val CBN_CLOSEUP: int val CBN_SELENDOK: int val CBN_SELENDCANCEL: int end datatype CBDirAttr = DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_DIRECTORY | DDL_ARCHIVE | DDL_POSTMSGS | DDL_DRIVES | DDL_EXCLUSIVE end = struct open ComboBase structure Style = struct open Window.Style (* Include all the windows styles. *) val CBS_SIMPLE = fromWord 0wx0001 val CBS_DROPDOWN = fromWord 0wx0002 val CBS_DROPDOWNLIST = fromWord 0wx0003 val CBS_OWNERDRAWFIXED = fromWord 0wx0010 val CBS_OWNERDRAWVARIABLE = fromWord 0wx0020 val CBS_AUTOHSCROLL = fromWord 0wx0040 val CBS_OEMCONVERT = fromWord 0wx0080 val CBS_SORT = fromWord 0wx0100 val CBS_HASSTRINGS = fromWord 0wx0200 val CBS_NOINTEGRALHEIGHT = fromWord 0wx0400 val CBS_DISABLENOSCROLL = fromWord 0wx0800 val CBS_UPPERCASE = fromWord 0wx2000 val CBS_LOWERCASE = fromWord 0wx4000 val all = flags[Window.Style.all, CBS_SIMPLE, CBS_DROPDOWN, CBS_DROPDOWNLIST, CBS_OWNERDRAWFIXED, CBS_OWNERDRAWVARIABLE, CBS_AUTOHSCROLL, CBS_OEMCONVERT, CBS_SORT, CBS_HASSTRINGS, CBS_NOINTEGRALHEIGHT, CBS_DISABLENOSCROLL, CBS_UPPERCASE, CBS_LOWERCASE] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure Notifications = struct val CBN_SELCHANGE = 1 val CBN_DBLCLK = 2 val CBN_SETFOCUS = 3 val CBN_KILLFOCUS = 4 val CBN_EDITCHANGE = 5 val CBN_EDITUPDATE = 6 val CBN_DROPDOWN = 7 val CBN_CLOSEUP = 8 val CBN_SELENDOK = 9 val CBN_SELENDCANCEL = 10 end (* DlgDirListComboBox DlgDirSelectEx DlgDirSelectComboBoxEx *) end; (* let open Combobox.Style val flagTable = [(CBS_DROPDOWNLIST, "CBS_DROPDOWNLIST"), (* Must come before the next two. *) (CBS_SIMPLE, "CBS_SIMPLE"), (CBS_DROPDOWN, "CBS_DROPDOWN"), (CBS_OWNERDRAWFIXED, "CBS_OWNERDRAWFIXED"), (CBS_OWNERDRAWVARIABLE, "CBS_OWNERDRAWVARIABLE"), (CBS_AUTOHSCROLL, "CBS_AUTOHSCROLL"), (CBS_OEMCONVERT, "CBS_OEMCONVERT"), (CBS_SORT, "CBS_SORT"), (CBS_HASSTRINGS, "CBS_HASSTRINGS"), (CBS_NOINTEGRALHEIGHT, "CBS_NOINTEGRALHEIGHT"), (CBS_DISABLENOSCROLL, "CBS_DISABLENOSCROLL"), (CBS_UPPERCASE, "CBS_UPPERCASE"), (CBS_LOWERCASE, "CBS_LOWERCASE"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *) polyml-5.6/mlsource/extra/Win/CommonControls.sml000066400000000000000000000367151265146633400221300ustar00rootroot00000000000000(* Copyright (c) 2007, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Common controls. *) structure CommonControls: sig type HWND and HINSTANCE and HBITMAP val InitCommonControls: unit->unit structure ToolbarStyle: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and TBSTYLE_BUTTON:flags and TBSTYLE_SEP:flags and TBSTYLE_CHECK:flags and TBSTYLE_GROUP:flags and TBSTYLE_CHECKGROUP:flags and TBSTYLE_DROPDOWN:flags and TBSTYLE_AUTOSIZE:flags and TBSTYLE_NOPREFIX:flags and TBSTYLE_TOOLTIPS:flags and TBSTYLE_WRAPABLE:flags and TBSTYLE_ALTDRAG:flags and TBSTYLE_FLAT:flags and TBSTYLE_LIST:flags and TBSTYLE_CUSTOMERASE:flags and TBSTYLE_REGISTERDROP:flags and TBSTYLE_TRANSPARENT:flags and BTNS_BUTTON:flags and BTNS_SEP:flags and BTNS_CHECK:flags and BTNS_GROUP:flags and BTNS_CHECKGROUP:flags and BTNS_DROPDOWN:flags and BTNS_AUTOSIZE:flags and BTNS_NOPREFIX:flags and BTNS_SHOWTEXT:flags and BTNS_WHOLEDROPDOWN:flags end structure ToolbarState: sig include BIT_FLAGS val TBSTATE_CHECKED: flags and TBSTATE_PRESSED: flags and TBSTATE_ENABLED: flags and TBSTATE_HIDDEN: flags and TBSTATE_INDETERMINATE: flags and TBSTATE_WRAP: flags and TBSTATE_ELLIPSES: flags and TBSTATE_MARKED : flags end datatype ToolbarResource = ToolbarHandle of HBITMAP | ToolbarResource of HINSTANCE*Resource.RESID datatype ParentType = datatype Window.ParentType type TBBUTTON = { iBitmap: int, idCommand: int, fsState: ToolbarState.flags, fsStyle: ToolbarStyle.flags, dwData: int, isString: int}; val CreateToolbarEx: { relation: ParentType, style: ToolbarStyle.flags, nBitmaps: int, bitmaps: ToolbarResource, buttons: TBBUTTON list, xButton: int, yButton: int, xBitmap: int, yBitmap: int} -> HWND val CreateStatusWindow: { relation: ParentType, style: Window.Style.flags, text: string } -> HWND val SB_SIMPLEID: int structure StatusBarType: sig include BIT_FLAGS val SBT_NOBORDERS: flags and SBT_OWNERDRAW: flags and SBT_POPOUT: flags and SBT_RTLREADING : flags and SBT_TOOLTIPS: flags end (* Creating messages here is just too complicated. It's easier to do this with functions to send the message and deal with the result. *) val StatusBarSetText: {hWnd: HWND, iPart: int, uType: StatusBarType.flags, text: string}->int val StatusBarGetText: HWND*int -> string * StatusBarType.flags val StatusBarSetParts: HWND * int list -> bool end = struct datatype ParentType = datatype Window.ParentType local open Foreign open Globals open Base in type HWND = HWND and HINSTANCE = HINSTANCE and HBITMAP = HBITMAP val InitCommonControls = winCall0(comctl "InitCommonControls") () cVoid (* Toolbar style is a mess. The TBBUTTON structure allows only a single byte for the style but some of the values exceed that. Apparently it's necessary to use CreateWindowEx for those. *) structure ToolbarStyle = struct open Window.Style (* Include all the windows styles. *) val TBSTYLE_BUTTON = fromWord 0wx0 val TBSTYLE_SEP = fromWord 0wx1 val TBSTYLE_CHECK = fromWord 0wx2 val TBSTYLE_GROUP = fromWord 0wx4 val TBSTYLE_CHECKGROUP = flags[TBSTYLE_GROUP,TBSTYLE_CHECK] val TBSTYLE_DROPDOWN = fromWord 0wx8 val TBSTYLE_AUTOSIZE = fromWord 0wx10 val TBSTYLE_NOPREFIX = fromWord 0wx20 val TBSTYLE_TOOLTIPS = fromWord 0wx100 val TBSTYLE_WRAPABLE = fromWord 0wx200 val TBSTYLE_ALTDRAG = fromWord 0wx400 val TBSTYLE_FLAT = fromWord 0wx800 val TBSTYLE_LIST = fromWord 0wx1000 val TBSTYLE_CUSTOMERASE = fromWord 0wx2000 val TBSTYLE_REGISTERDROP = fromWord 0wx4000 val TBSTYLE_TRANSPARENT = fromWord 0wx8000 (* -- These are used with TB_SETEXTENDEDSTYLE/TB_GETEXTENDEDSTYLE val TBSTYLE_EX_DRAWDDARROWS = fromWord 0wx00000001 val TBSTYLE_EX_MIXEDBUTTONS = fromWord 0w8 val TBSTYLE_EX_HIDECLIPPEDBUTTONS = fromWord 0w16 val TBSTYLE_EX_DOUBLEBUFFER = fromWord 0wx80*) val BTNS_BUTTON = TBSTYLE_BUTTON val BTNS_SEP = TBSTYLE_SEP val BTNS_CHECK = TBSTYLE_CHECK val BTNS_GROUP = TBSTYLE_GROUP val BTNS_CHECKGROUP = TBSTYLE_CHECKGROUP val BTNS_DROPDOWN = TBSTYLE_DROPDOWN val BTNS_AUTOSIZE = TBSTYLE_AUTOSIZE val BTNS_NOPREFIX = TBSTYLE_NOPREFIX val BTNS_SHOWTEXT = fromWord 0wx0040 val BTNS_WHOLEDROPDOWN = fromWord 0wx0080 val all = flags[Window.Style.all, TBSTYLE_BUTTON, TBSTYLE_SEP, TBSTYLE_CHECK, TBSTYLE_GROUP, TBSTYLE_DROPDOWN, TBSTYLE_AUTOSIZE, TBSTYLE_NOPREFIX, TBSTYLE_TOOLTIPS, TBSTYLE_WRAPABLE, TBSTYLE_ALTDRAG, TBSTYLE_FLAT, TBSTYLE_LIST, TBSTYLE_CUSTOMERASE, TBSTYLE_TRANSPARENT, BTNS_SHOWTEXT, BTNS_WHOLEDROPDOWN] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure ToolbarState:> sig include BIT_FLAGS val TBSTATE_CHECKED: flags and TBSTATE_PRESSED: flags and TBSTATE_ENABLED: flags and TBSTATE_HIDDEN: flags and TBSTATE_INDETERMINATE: flags and TBSTATE_WRAP: flags and TBSTATE_ELLIPSES: flags and TBSTATE_MARKED : flags val cToolBarState: flags conversion (* Only used internally *) end = struct open Word8 type flags = Word8.word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val TBSTATE_CHECKED = 0w1 val TBSTATE_PRESSED = 0w2 val TBSTATE_ENABLED = 0w4 val TBSTATE_HIDDEN = 0w8 val TBSTATE_INDETERMINATE = 0wx10 val TBSTATE_WRAP = 0wx20 val TBSTATE_ELLIPSES = 0wx40 val TBSTATE_MARKED = 0wx80 val all = flags[TBSTATE_CHECKED, TBSTATE_PRESSED, TBSTATE_ENABLED, TBSTATE_HIDDEN, TBSTATE_INDETERMINATE, TBSTATE_WRAP, TBSTATE_ELLIPSES, TBSTATE_MARKED] val intersect = List.foldl (fn (a, b) => andb(a, b)) all val cToolBarState = cUint8w (*Must be a byte*) end datatype ToolbarResource = ToolbarHandle of HBITMAP | ToolbarResource of HINSTANCE*Resource.RESID type TBBUTTON = { iBitmap: int, idCommand: int, fsState: ToolbarState.flags, fsStyle: ToolbarStyle.flags, dwData: int, isString: int} local val TBBUTTON = cStruct6(cInt, cInt, ToolbarState.cToolBarState(*byte*), cUint8w, cDWORD_PTR, cINT_PTR) val {ctype={size=sizeTBB, ...}, ...} = breakConversion TBBUTTON val createToolbarEx = winCall13 (comctl "CreateToolbarEx") (cHWND,cDWORDw,cUint,cInt,cHINSTANCE, cPointer ,cPointer,cInt,cInt,cInt,cInt,cInt,cUint) cHWND val list2vec = list2Vector TBBUTTON in fun CreateToolbarEx { relation: ParentType, style: ToolbarStyle.flags, nBitmaps: int, bitmaps: ToolbarResource, buttons: TBBUTTON list, xButton: int, yButton: int, xBitmap: int, yBitmap: int}: HWND = let (* This must be a child and WS_CHILD is included by default *) val (parent, childId, styleWord) = case relation of ChildWindow{parent, id} => (parent, id, WinBase.Style.toWord style) | _ => raise Fail "CreateToolbarEx: relation must be ChildWindow" fun mapToStruct({iBitmap, idCommand, fsState, fsStyle, dwData, isString}:TBBUTTON) = (iBitmap, idCommand, fsState, Word8.fromLargeWord(ToolbarStyle.toWord fsStyle), dwData, isString) val (buttonVec, nButtons) = list2vec (map mapToStruct buttons) (* The wBMID argument may be either a resource identifier or a bitmap handle. *) val (hBMInst, wBMID, freeStr) = case bitmaps of ToolbarHandle hbm => (hinstanceNull, voidStarOfHandle hbm, Memory.null) | ToolbarResource(hi, IdAsInt wb) => (hi, Memory.sysWord2VoidStar(SysWord.fromInt wb), Memory.null) | ToolbarResource(hi, IdAsString str) => let val s = toCstring str in (hi, s, s) end val res = createToolbarEx(parent, Word32.fromLargeWord styleWord, childId, nBitmaps, hBMInst, wBMID, buttonVec, nButtons, xButton, yButton, xBitmap, yBitmap, Word.toInt sizeTBB) handle ex => (Memory.free freeStr; Memory.free buttonVec; raise ex) val () = Memory.free freeStr and () = Memory.free buttonVec in checkResult(not(isHNull res)); res end end local val createStatusWindow = winCall4 (comctl "CreateStatusWindowA") (cLong,cString,cHWND,cUint) cHWND in fun CreateStatusWindow{ relation: ParentType, style: Window.Style.flags, text: string } = let val (parent, childId, styleWord) = case relation of ChildWindow{parent, id} => let open WinBase.Style in (parent, id, toWord(flags[WS_CHILD, style])) end | _ => raise Fail "CreateStatusWindow: relation must be ChildWindow" val res = createStatusWindow(LargeWord.toInt styleWord, text, parent, childId) in checkResult(not(isHNull res)); res end end val SB_SIMPLEID = 0x00ff structure StatusBarType: sig include BIT_FLAGS val SBT_NOBORDERS: flags and SBT_OWNERDRAW: flags and SBT_POPOUT: flags and SBT_RTLREADING : flags and SBT_TOOLTIPS: flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val SBT_NOBORDERS = 0w256 val SBT_OWNERDRAW = 0wx1000 val SBT_POPOUT = 0w512 val SBT_RTLREADING = 0w1024 val SBT_TOOLTIPS = 0wx0800 val all = flags[SBT_NOBORDERS, SBT_OWNERDRAW, SBT_POPOUT, SBT_RTLREADING, SBT_TOOLTIPS] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end; val sendMsg = winCall4(user "SendMessageA") (cHWND, cUint, cUINT_PTR, cPointer) cUint fun StatusBarSetText{hWnd, iPart, uType, text}:int = let val s = toCstring text val res = sendMsg(hWnd, 0x401, IntInf.orb(iPart, LargeWord.toInt(StatusBarType.toWord uType)), s) handle ex => (Memory.free s; raise ex) val () = Memory.free s in res end fun StatusBarGetText(hWnd, iPart): string * StatusBarType.flags = let val result1 = Word32.fromInt(sendMsg(hWnd, 0x403, iPart, Memory.null)) val length = LOWORD result1 val flags = StatusBarType.fromWord(Word.toLargeWord(HIWORD result1)) in if StatusBarType.anySet(flags, StatusBarType.SBT_OWNERDRAW) then ("", flags) else let open Memory val buff = malloc (length+0w1) val reply = sendMsg(hWnd, 0x402, iPart, buff) handle ex => (free buff; raise ex) in (if reply = 0 then "" else fromCstring buff, flags) before free buff end end fun StatusBarSetParts(hWnd, parts: int list): bool = let val (vec, nParts) = list2Vector cInt parts open Memory val res = sendMsg(hWnd, 0x404, nParts, vec) handle ex => (free vec; raise ex) val () = free vec in res <> 0 end (* | compileMessage (SB_GETTEXT { iPart: int, text: string ref, length: int }) = (* Another case, like LB_GETTEXT. where we don't know the length so we add an extra argument to the ML message. *) (0x402, toCint iPart, address(alloc (length+1) Cchar)*) (* | compileMessage (SB_SETTEXT { iPart: int, uType: StatusBarType, text: string}) = (0x401, toCint 0, toCstring text) | compileMessage (SB_GETTEXT _) = (0x402, toCint 0, toCInt 0) | compileMessage (SB_GETTEXTLENGTH _) = (0x403, toCint 0, toCInt 0) | compileMessage (SB_SETPARTS _) = (0x404, toCint 0, toCInt 0) | compileMessage (SB_GETPARTS _) = (0x406, toCint 0, toCInt 0) | compileMessage (SB_GETBORDERS _) = (0x407, toCint 0, toCInt 0) | compileMessage (SB_SETMINHEIGHT _) = (0x408, toCint 0, toCInt 0) | compileMessage (SB_SIMPLE _) = (0x409, toCint 0, toCInt 0) | compileMessage (SB_GETRECT _) = (0x40A, toCint 0, toCInt 0)*) end end; polyml-5.6/mlsource/extra/Win/CommonDialog.sml000066400000000000000000001716571265146633400215310ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Common dialogues. *) structure CommonDialog : sig type HWND and HDC and COLORREF = Color.COLORREF and HINSTANCE type POINT = { x: int, y: int } type RECT = { left: int, top: int, right: int, bottom: int } (* Error codes *) datatype CDERR = DIALOGFAILURE | GENERALCODES | STRUCTSIZE | INITIALIZATION | NOTEMPLATE | NOHINSTANCE | LOADSTRFAILURE | FINDRESFAILURE | LOADRESFAILURE | LOCKRESFAILURE | MEMALLOCFAILURE | MEMLOCKFAILURE | NOHOOK | REGISTERMSGFAIL | PRINTERCODES | SETUPFAILURE | PARSEFAILURE | RETDEFFAILURE | LOADDRVFAILURE | GETDEVMODEFAIL | INITFAILURE | NODEVICES | NODEFAULTPRN | DNDMMISMATCH | CREATEICFAILURE | PRINTERNOTFOUND | DEFAULTDIFFERENT | CHOOSEFONTCODES | NOFONTS | MAXLESSTHANMIN | FILENAMECODES | SUBCLASSFAILURE | INVALIDFILENAME | BUFFERTOOSMALL | FINDREPLACECODES | BUFFERLENGTHZERO | CHOOSECOLORCODES val CommDlgExtendedError : unit -> CDERR (* ChooseColor *) (* structure ChooseColorFlags : sig include BIT_FLAGS val CC_ANYCOLOR : flags val CC_FULLOPEN : flags val CC_PREVENTFULLOPEN : flags val CC_RGBINIT : flags val CC_SHOWHELP : flags val CC_SOLIDCOLOR : flags end type CHOOSECOLOR = { owner: HWND option, result: COLORREF, customColors: COLORREF list, flags: ChooseColorFlags.flags } val ChooseColor : CHOOSECOLOR -> CHOOSECOLOR option (* ChooseFont *) structure ChooseFontFlags : sig include BIT_FLAGS val CF_ANSIONLY : flags val CF_APPLY : flags val CF_BOTH : flags val CF_EFFECTS : flags val CF_FIXEDPITCHONLY : flags val CF_FORCEFONTEXIST : flags val CF_NOFACESEL : flags val CF_NOOEMFONTS : flags val CF_NOSCRIPTSEL : flags val CF_NOSIMULATIONS : flags val CF_NOSIZESEL : flags val CF_NOSTYLESEL : flags val CF_NOVECTORFONTS : flags val CF_NOVERTFONTS : flags val CF_PRINTERFONTS : flags val CF_SCALABLEONLY : flags val CF_SCREENFONTS : flags val CF_SCRIPTSONLY : flags val CF_SELECTSCRIPT : flags val CF_SHOWHELP : flags val CF_TTONLY : flags val CF_WYSIWYG : flags end structure ChooseFontTypes : sig include BIT_FLAGS val BOLD_FONTTYPE : flags val ITALIC_FONTTYPE : flags val PRINTER_FONTTYPE : flags val REGULAR_FONTTYPE : flags val SCREEN_FONTTYPE : flags val SIMULATED_FONTTYPE : flags end type CHOOSEFONT = { owner: HWND option, context: HDC option, logFont: Font.LOGFONT option, pointSize: int, flags: ChooseFontFlags.flags, colors: COLORREF, style: string option, fontType: ChooseFontTypes.flags, size: {min: int, max: int} option } val ChooseFont : CHOOSEFONT -> CHOOSEFONT option *) (* FindText and ReplaceText *) structure FindReplaceFlags : sig include BIT_FLAGS val FR_DIALOGTERM : flags val FR_DOWN : flags val FR_FINDNEXT : flags val FR_HIDEMATCHCASE : flags val FR_HIDEUPDOWN : flags val FR_HIDEWHOLEWORD : flags val FR_MATCHCASE : flags val FR_NOMATCHCASE : flags val FR_NOUPDOWN : flags val FR_NOWHOLEWORD : flags val FR_REPLACE : flags val FR_REPLACEALL : flags val FR_SHOWHELP : flags val FR_WHOLEWORD : flags end datatype TemplateType = TemplateDefault | TemplateHandle of Dialog.DLGTEMPLATE | TemplateResource of HINSTANCE * Resource.RESID type FINDREPLACE = { owner : HWND, template: TemplateType, flags: FindReplaceFlags.flags, findWhat: string, replaceWith: string, bufferSize: int } val FindText : FINDREPLACE -> HWND val ReplaceText : FINDREPLACE -> HWND (* GetOpenFileName and GetSaveFileName *) structure OpenFileFlags : sig include BIT_FLAGS val OFN_ALLOWMULTISELECT : flags val OFN_CREATEPROMPT : flags val OFN_EXPLORER : flags val OFN_EXTENSIONDIFFERENT : flags val OFN_FILEMUSTEXIST : flags val OFN_HIDEREADONLY : flags val OFN_LONGNAMES : flags val OFN_NOCHANGEDIR : flags val OFN_NODEREFERENCELINKS : flags val OFN_NOLONGNAMES : flags val OFN_NONETWORKBUTTON : flags val OFN_NOREADONLYRETURN : flags val OFN_NOTESTFILECREATE : flags val OFN_NOVALIDATE : flags val OFN_OVERWRITEPROMPT : flags val OFN_PATHMUSTEXIST : flags val OFN_READONLY : flags val OFN_SHAREAWARE : flags val OFN_SHOWHELP : flags end type OPENFILENAME = { owner: HWND option, template: TemplateType, filter: (string * string) list, customFilter: (string * string) option, filterIndex: int, file: string, (* Initial value of file and returned result. *) maxFile: int, (* Max size of expected file name. *) fileTitle : string, initialDir: string option, title: string option, (* Optional title - default is Save or Open. *) flags: OpenFileFlags.flags, defExt: string option } val GetFileTitle : string -> string val GetOpenFileName : OPENFILENAME -> OPENFILENAME option val GetSaveFileName : OPENFILENAME -> OPENFILENAME option (* PageSetupDlg *) structure PageSetupFlags : sig include BIT_FLAGS val PSD_DEFAULTMINMARGINS : flags val PSD_DISABLEMARGINS : flags val PSD_DISABLEORIENTATION : flags val PSD_DISABLEPAGEPAINTING : flags val PSD_DISABLEPAPER : flags val PSD_DISABLEPRINTER : flags val PSD_INHUNDREDTHSOFMILLIMETERS : flags val PSD_INTHOUSANDTHSOFINCHES : flags val PSD_MARGINS : flags val PSD_MINMARGINS : flags val PSD_NONETWORKBUTTON : flags val PSD_NOWARNING : flags val PSD_RETURNDEFAULT : flags val PSD_SHOWHELP : flags end type PAGESETUPDLG = { owner: HWND option, devMode: DeviceContext.DEVMODE option, devNames: DeviceContext.DEVNAMES option, flags: PageSetupFlags.flags, paperSize: POINT, minMargin: RECT, margin: RECT (* For the moment we ignore the other options. *) } val PageSetupDlg : PAGESETUPDLG -> PAGESETUPDLG option (* PrintDlg *) structure PrintDlgFlags : sig include BIT_FLAGS val PD_ALLPAGES : flags val PD_COLLATE : flags val PD_DISABLEPRINTTOFILE : flags val PD_HIDEPRINTTOFILE : flags val PD_NONETWORKBUTTON : flags val PD_NOPAGENUMS : flags val PD_NOSELECTION : flags val PD_NOWARNING : flags val PD_PAGENUMS : flags val PD_PRINTSETUP : flags val PD_PRINTTOFILE : flags val PD_RETURNDC : flags val PD_RETURNDEFAULT : flags val PD_RETURNIC : flags val PD_SELECTION : flags val PD_SHOWHELP : flags val PD_USEDEVMODECOPIES : flags val PD_USEDEVMODECOPIESANDCOLLATE : flags end type PRINTDLG = { owner: HWND option, devMode: DeviceContext.DEVMODE option, devNames: DeviceContext.DEVNAMES option, context: HDC option, flags: PrintDlgFlags.flags, fromPage: int, toPage: int, minPage: int, maxPage: int, copies: int (* For the moment we ignore the other options. *) } val PrintDlg : PRINTDLG -> PRINTDLG option end = struct local open Foreign open Globals open Base open DeviceContext Color Font GdiBase val stringToBuf = copyStringToMem fun allocAndInitialise(space: int, str: string) = let open Memory val space = Int.max(space, size str) + 1 val buf = malloc(Word.fromInt space) in stringToBuf(buf, 0, str); buf end in type HWND = HWND and HDC = HDC and COLORREF = COLORREF and HINSTANCE = HINSTANCE type RECT = RECT and POINT = POINT datatype CDERR = DIALOGFAILURE (* 0xffff *) | GENERALCODES (* 0x0000 *) | STRUCTSIZE (* 0x0001 *) | INITIALIZATION (* 0x0002 *) | NOTEMPLATE (* 0x0003 *) | NOHINSTANCE (* 0x0004 *) | LOADSTRFAILURE (* 0x0005 *) | FINDRESFAILURE (* 0x0006 *) | LOADRESFAILURE (* 0x0007 *) | LOCKRESFAILURE (* 0x0008 *) | MEMALLOCFAILURE (* 0x0009 *) | MEMLOCKFAILURE (* 0x000A *) | NOHOOK (* 0x000B *) | REGISTERMSGFAIL (* 0x000C *) | PRINTERCODES (* 0x1000 *) | SETUPFAILURE (* 0x1001 *) | PARSEFAILURE (* 0x1002 *) | RETDEFFAILURE (* 0x1003 *) | LOADDRVFAILURE (* 0x1004 *) | GETDEVMODEFAIL (* 0x1005 *) | INITFAILURE (* 0x1006 *) | NODEVICES (* 0x1007 *) | NODEFAULTPRN (* 0x1008 *) | DNDMMISMATCH (* 0x1009 *) | CREATEICFAILURE (* 0x100A *) | PRINTERNOTFOUND (* 0x100B *) | DEFAULTDIFFERENT (* 0x100C *) | CHOOSEFONTCODES (* 0x2000 *) | NOFONTS (* 0x2001 *) | MAXLESSTHANMIN (* 0x2002 *) | FILENAMECODES (* 0x3000 *) | SUBCLASSFAILURE (* 0x3001 *) | INVALIDFILENAME (* 0x3002 *) | BUFFERTOOSMALL (* 0x3003 *) | FINDREPLACECODES (* 0x4000 *) | BUFFERLENGTHZERO (* 0x4001 *) | CHOOSECOLORCODES (* 0x5000 *) local val commDlgExtendedError = winCall0 (commdlg "CommDlgExtendedError") () cDWORD in fun CommDlgExtendedError () = case commDlgExtendedError () of 0x0000 => GENERALCODES | 0x0001 => STRUCTSIZE | 0x0002 => INITIALIZATION | 0x0003 => NOTEMPLATE | 0x0004 => NOHINSTANCE | 0x0005 => LOADSTRFAILURE | 0x0006 => FINDRESFAILURE | 0x0007 => LOADRESFAILURE | 0x0008 => LOCKRESFAILURE | 0x0009 => MEMALLOCFAILURE | 0x000A => MEMLOCKFAILURE | 0x000B => NOHOOK | 0x000C => REGISTERMSGFAIL | 0x1000 => PRINTERCODES | 0x1001 => SETUPFAILURE | 0x1002 => PARSEFAILURE | 0x1003 => RETDEFFAILURE | 0x1004 => LOADDRVFAILURE | 0x1005 => GETDEVMODEFAIL | 0x1006 => INITFAILURE | 0x1007 => NODEVICES | 0x1008 => NODEFAULTPRN | 0x1009 => DNDMMISMATCH | 0x100A => CREATEICFAILURE | 0x100B => PRINTERNOTFOUND | 0x100C => DEFAULTDIFFERENT | 0x2000 => CHOOSEFONTCODES | 0x2001 => NOFONTS | 0x2002 => MAXLESSTHANMIN | 0x3000 => FILENAMECODES | 0x3001 => SUBCLASSFAILURE | 0x3002 => INVALIDFILENAME | 0x3003 => BUFFERTOOSMALL | 0x4000 => FINDREPLACECODES | 0x4001 => BUFFERLENGTHZERO | _ => DIALOGFAILURE end; (* As always there are a number of ways of matching the C types to ML. Since functions such as GetOpenFileName update their parameters, probably the easiest way to deal with them is as functions which return an updated parameter set. *) datatype TemplateType = TemplateHandle of Dialog.DLGTEMPLATE | TemplateResource of HINSTANCE * Resource.RESID | TemplateDefault structure OpenFileFlags:> sig include BIT_FLAGS val OFN_ALLOWMULTISELECT : flags val OFN_CREATEPROMPT : flags val OFN_EXPLORER : flags val OFN_EXTENSIONDIFFERENT : flags val OFN_FILEMUSTEXIST : flags val OFN_HIDEREADONLY : flags val OFN_LONGNAMES : flags val OFN_NOCHANGEDIR : flags val OFN_NODEREFERENCELINKS : flags val OFN_NOLONGNAMES : flags val OFN_NONETWORKBUTTON : flags val OFN_NOREADONLYRETURN : flags val OFN_NOTESTFILECREATE : flags val OFN_NOVALIDATE : flags val OFN_OVERWRITEPROMPT : flags val OFN_PATHMUSTEXIST : flags val OFN_READONLY : flags val OFN_SHAREAWARE : flags val OFN_SHOWHELP : flags val cConvert: flags conversion end = struct open Word32 type flags = word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val OFN_READONLY = 0wx00000001 val OFN_OVERWRITEPROMPT = 0wx00000002 val OFN_HIDEREADONLY = 0wx00000004 val OFN_NOCHANGEDIR = 0wx00000008 val OFN_SHOWHELP = 0wx00000010 val OFN_NOVALIDATE = 0wx00000100 val OFN_ALLOWMULTISELECT = 0wx00000200 val OFN_EXTENSIONDIFFERENT = 0wx00000400 val OFN_PATHMUSTEXIST = 0wx00000800 val OFN_FILEMUSTEXIST = 0wx00001000 val OFN_CREATEPROMPT = 0wx00002000 val OFN_SHAREAWARE = 0wx00004000 val OFN_NOREADONLYRETURN = 0wx00008000 val OFN_NOTESTFILECREATE = 0wx00010000 val OFN_NONETWORKBUTTON = 0wx00020000 val OFN_NOLONGNAMES = 0wx00040000 (* force no long names for 4.x modules*) val OFN_EXPLORER = 0wx00080000 (* new look commdlg*) val OFN_NODEREFERENCELINKS = 0wx00100000 val OFN_LONGNAMES = 0wx00200000 (* force long names for 3.x modules*) val all = flags[OFN_READONLY, OFN_OVERWRITEPROMPT, OFN_HIDEREADONLY, OFN_NOCHANGEDIR, OFN_SHOWHELP, OFN_NOVALIDATE, OFN_ALLOWMULTISELECT, OFN_EXTENSIONDIFFERENT, OFN_PATHMUSTEXIST, OFN_FILEMUSTEXIST, OFN_CREATEPROMPT, OFN_SHAREAWARE, OFN_NOREADONLYRETURN, OFN_NOTESTFILECREATE, OFN_NONETWORKBUTTON, OFN_NOLONGNAMES, OFN_EXPLORER, OFN_NODEREFERENCELINKS, OFN_LONGNAMES] val intersect = List.foldl (fn (a, b) => andb(a,b)) all val cConvert = cDWORDw end (* These flags are local only. *) (*val OFN_ENABLEHOOK = OpenFileFlags.fromWord 0wx00000020 *) val OFN_ENABLETEMPLATE = OpenFileFlags.fromWord 0wx00000040 val OFN_ENABLETEMPLATEHANDLE = OpenFileFlags.fromWord 0wx00000080 type OPENFILENAME = { owner: HWND option, template: TemplateType, filter: (string * string) list, customFilter: (string * string) option, filterIndex: int, file: string, (* Initial value of file and returned result. *) maxFile: int, (* Max size of expected file name. *) fileTitle : string, initialDir: string option, title: string option, (* Optional title - default is Save or Open. *) flags: OpenFileFlags.flags, defExt: string option } local val OPENFILENAME = cStruct20(cDWORD, cHWNDOPT, cPointer (*HINSTANCE*), cPointer (* LPCTSTR*), cPointer (*LPTSTR*), cDWORD, cDWORD, cPointer (*LPTSTR*), cDWORD, cPointer (*LPTSTR*), cDWORD, STRINGOPT, STRINGOPT, OpenFileFlags.cConvert, cWORD, cWORD, STRINGOPT, cLPARAM, cPointer (* LPOFNHOOKPROC *), cPointer (* LPCTSTR*) (* cPointer, DWORD, DWORD*)) val {load=loadOFN, store=fromOFN, ctype={size=sizeOfnStruct, ...}, ...} = breakConversion OPENFILENAME fun getOpenSave doCall (arg: OPENFILENAME): OPENFILENAME option = let val { owner: HWND option, template: TemplateType, filter: (string * string) list, customFilter: (string * string) option, filterIndex: int, file: string, maxFile: int, fileTitle : string, initialDir: string option, title: string option, flags: OpenFileFlags.flags, defExt: string option, ...} = arg open Memory infix 6 ++ val (f1, inst, templ, toFree) = case template of TemplateHandle dlgTemp => let val dlg = toCWord8vec(Dialog.compileTemplate dlgTemp) in (OFN_ENABLETEMPLATEHANDLE, dlg, null, dlg) end | TemplateResource(hInst, IdAsInt wb) => ( OFN_ENABLETEMPLATE, voidStarOfHandle hInst, Memory.sysWord2VoidStar(SysWord.fromInt wb), null ) | TemplateResource(hInst, IdAsString str) => let val s = toCstring str in (OFN_ENABLETEMPLATE, voidStarOfHandle hInst, s, s) end | TemplateDefault => (OpenFileFlags.fromWord 0w0, null, null, null) val lpstrFilter = case filter of nil => Memory.null | _ => let (* The filter strings are pairs of strings with a final terminating null. That implies that the strings cannot be empty. Should we check that? Get the store needed for the strings, including the null terminations and the final null. *) val filterSize = List.foldl (fn((s1,s2),n) => size s1 + size s2 + n + 2) 1 filter open Memory infix 6 ++ val buf = malloc (Word.fromInt filterSize) fun copyToBuf((s1,s2), n) = let val ss1 = size s1 and ss2 = size s2 in stringToBuf(buf, n, s1); stringToBuf(buf, n+ss1+1, s2); n+ss1+ss2+2 (* Result is the next offset. *) end val lastAddr = List.foldl copyToBuf 0 filter val _ = set8(buf, Word.fromInt lastAddr, 0w0) in buf end val (lpstrCustomFilter, nMaxCustFilter) = case customFilter of NONE => (null, 0) | SOME (dispString, pattern) => let (* Make sure we have enough space. 100 is probably big enough. *) val space = Int.max(size dispString + size pattern + 2, 100) val buf = Memory.malloc(Word.fromInt space) in stringToBuf(buf, 0, dispString); stringToBuf(buf, size dispString + 1, pattern); (buf, space) end val lpstrFile = (* Full name of file including path. *) allocAndInitialise(maxFile, file) val lpstrFileTitle = (* Name excluding the path. *) allocAndInitialise(maxFile, fileTitle) val ofn = malloc sizeOfnStruct val args = (Word.toInt sizeOfnStruct, (* lStructSize *) owner, (* hwndOwner *) inst, (* hInstance *) lpstrFilter, lpstrCustomFilter, nMaxCustFilter, filterIndex, lpstrFile, maxFile+1, (* nMaxFile *) lpstrFileTitle, maxFile+1, (* nMaxFileTitle *) initialDir, title, OpenFileFlags.flags[f1, flags], (* Flags *) 0, (* nFileOffset *) 0, (* nFileExtension *) defExt, 0, (* lCustData *) null, (* lpfnHook *) templ) (* lpTemplateName *) val freeOfn = fromOFN(ofn, args) (* Copy into the memory *) fun freeAll() = ( freeOfn(); List.app free [ofn, toFree, lpstrFilter, lpstrCustomFilter, lpstrFile, lpstrFileTitle] ) val result = doCall ofn handle ex => (freeAll(); raise ex) in (if result then let (* Most of the fields are unchanged so we're better off extracting them from the original. If we've passed in a template we have to get it from the original because we can only convert a memory object to a Word8Vector.vector if we know its length. *) val (_, _, _, _, lpstrCustomFilter, _, nFilterIndex, lpstrFile, _, lpstrFileTitle, _, _, _, flagBits, _, _, _, _, _, _) = loadOFN ofn val customFilter = if lpstrCustomFilter = null then NONE else let (* The dialogue box copies the selected filter into the section of this string after the first string. *) val s1 = fromCstring lpstrCustomFilter val s2 = fromCstring (lpstrCustomFilter ++ Word.fromInt(size s1 +1)) in SOME(s1, s2) end in SOME { owner = owner, template = template, filter = filter, customFilter = customFilter, filterIndex = nFilterIndex, file = fromCstring lpstrFile, maxFile = maxFile, fileTitle = fromCstring lpstrFileTitle, initialDir = initialDir, title = title, (* Mask off the template flags. *) flags = let open OpenFileFlags in clear(fromWord 0wxE0, flagBits) end, defExt = defExt } end else NONE) before freeAll() end in val GetOpenFileName = getOpenSave (winCall1 (commdlg "GetOpenFileNameA") cPointer cBool) and GetSaveFileName = getOpenSave (winCall1 (commdlg "GetSaveFileNameA") cPointer cBool) end (* local *) local val getFileTitle = winCall3(commdlg "GetFileTitleA") (cString, cPointer, cWORD) cShort in fun GetFileTitle(file: string): string = let fun gft (m, n) = getFileTitle(file, m, n) in getStringWithNullIsLength gft end end (* This is a bit messy. It creates a modeless dialogue box and sends messages to the parent window. The only problem is that the message identifier is not a constant. It has to be obtained by a call to RegisterWindowMessage. *) (* We also have to ensure that the memory containing the FINDREPLACE structure is not freed until the dialogue window is destroyed. *) structure FindReplaceFlags = FindReplaceFlags (* These flags are local only. *) (*val FR_ENABLEHOOK = FindReplaceFlags.fromWord 0wx00000100*) val FR_ENABLETEMPLATE = FindReplaceFlags.fromWord 0wx00000200 val FR_ENABLETEMPLATEHANDLE = FindReplaceFlags.fromWord 0wx00002000 (* The address of this structure is passed in messages. That all looks extremely messy. *) type FINDREPLACE = { owner : HWND, (* NOT an option. *) template: TemplateType, flags: FindReplaceFlags.flags, findWhat: string, replaceWith: string, bufferSize: int } local val FINDREPLACE = cStruct11(cDWORD, cHWND, cPointer (*HINSTANCE*), FindReplaceFlags.cFindReplaceFlags, cPointer, cPointer, cWORD, cWORD, cLPARAM, cPointer (* LPFRHOOKPROC *), cPointer) val {store=fromOFR, ctype={size=sizeFR, ...}, ...} = breakConversion FINDREPLACE val findText = winCall1 (commdlg "FindTextA") cPointer cHWND and replaceText = winCall1 (commdlg "ReplaceTextA") cPointer cHWND fun findReplace doCall (arg: FINDREPLACE): HWND = let val { owner : HWND, (* NOT an option. *) template: TemplateType, flags: FindReplaceFlags.flags, findWhat: string, replaceWith: string, bufferSize: int } = arg open Memory val (f1, inst, templ, toFree) = case template of TemplateHandle dlgTemp => let val dlg = toCWord8vec(Dialog.compileTemplate dlgTemp) in (FR_ENABLETEMPLATEHANDLE, dlg, null, dlg) end | TemplateResource(hInst, IdAsInt wb) => ( FR_ENABLETEMPLATE, voidStarOfHandle hInst, Memory.sysWord2VoidStar(SysWord.fromInt wb), null ) | TemplateResource(hInst, IdAsString str) => let val s = toCstring str in (FR_ENABLETEMPLATE, voidStarOfHandle hInst, s, s) end | TemplateDefault => (FindReplaceFlags.fromWord 0w0, null, null, null) val lpstrFindWhat = allocAndInitialise(bufferSize, findWhat) val lpstrReplaceWith = allocAndInitialise(bufferSize, replaceWith) val m = malloc sizeFR val args = (Word.toInt sizeFR, (* lStructSize *) owner, (* hwndOwner *) inst, (* hInstance *) FindReplaceFlags.flags[f1, flags], (* Flags *) lpstrFindWhat, lpstrReplaceWith, bufferSize, bufferSize, 0, (* lCustData *) null, (* lpfnHook *) templ) (* lpTemplateName *) val freeOfr = fromOFR(m, args) fun freeAll() = ( freeOfr(); List.app free [m, toFree, lpstrFindWhat, lpstrReplaceWith] ) val result = doCall m handle ex => (freeAll(); raise ex) val () = checkResult(not(isHNull result)) handle ex => (freeAll(); raise ex) in (* The memory cannot be released until the dialogue is dismissed. Also, since this is a modeless dialogue we have to add it to the modeless dialogue list so that keyboard functions work. *) (* TODO: There may be better ways of ensuring the memory is freed. *) (Message.addModelessDialogue(result, SOME freeAll); result) end in val FindText = findReplace findText and ReplaceText = findReplace replaceText end structure PageSetupFlags :> sig include BIT_FLAGS val PSD_DEFAULTMINMARGINS : flags val PSD_DISABLEMARGINS : flags val PSD_DISABLEORIENTATION : flags val PSD_DISABLEPAGEPAINTING : flags val PSD_DISABLEPAPER : flags val PSD_DISABLEPRINTER : flags val PSD_INHUNDREDTHSOFMILLIMETERS : flags val PSD_INTHOUSANDTHSOFINCHES : flags val PSD_MARGINS : flags val PSD_MINMARGINS : flags val PSD_NONETWORKBUTTON : flags val PSD_NOWARNING : flags val PSD_RETURNDEFAULT : flags val PSD_SHOWHELP : flags val cConvert: flags conversion end = struct open Word32 type flags = word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val PSD_DEFAULTMINMARGINS = 0wx00000000 (* default (printer's) *) (*val PSD_INWININIINTLMEASURE = 0wx00000000 *)(* 1st of 4 possible *) val PSD_MINMARGINS = 0wx00000001 (* use caller's *) val PSD_MARGINS = 0wx00000002 (* use caller's *) val PSD_INTHOUSANDTHSOFINCHES = 0wx00000004 (* 2nd of 4 possible *) val PSD_INHUNDREDTHSOFMILLIMETERS = 0wx00000008 (* 3rd of 4 possible *) val PSD_DISABLEMARGINS = 0wx00000010 val PSD_DISABLEPRINTER = 0wx00000020 val PSD_NOWARNING = 0wx00000080 val PSD_DISABLEORIENTATION = 0wx00000100 val PSD_RETURNDEFAULT = 0wx00000400 val PSD_DISABLEPAPER = 0wx00000200 val PSD_SHOWHELP = 0wx00000800 (* val PSD_ENABLEPAGESETUPHOOK = 0wx00002000 val PSD_ENABLEPAGESETUPTEMPLATE = 0wx00008000 val PSD_ENABLEPAGESETUPTEMPLATEHANDLE = 0wx00020000 val PSD_ENABLEPAGEPAINTHOOK = 0wx00040000 *) val PSD_DISABLEPAGEPAINTING = 0wx00080000 val PSD_NONETWORKBUTTON = 0wx00200000 val all = flags[PSD_DEFAULTMINMARGINS, PSD_MINMARGINS, PSD_MARGINS, PSD_INTHOUSANDTHSOFINCHES, PSD_INHUNDREDTHSOFMILLIMETERS, PSD_DISABLEMARGINS, PSD_DISABLEPRINTER, PSD_NOWARNING, PSD_DISABLEORIENTATION, PSD_RETURNDEFAULT, PSD_DISABLEPAPER, PSD_SHOWHELP, PSD_DISABLEPAGEPAINTING, PSD_NONETWORKBUTTON] val intersect = List.foldl (fn (a, b) => andb(a,b)) all val cConvert = cDWORDw end structure PrintDlgFlags :> sig include BIT_FLAGS val PD_ALLPAGES : flags val PD_COLLATE : flags val PD_DISABLEPRINTTOFILE : flags val PD_HIDEPRINTTOFILE : flags val PD_NONETWORKBUTTON : flags val PD_NOPAGENUMS : flags val PD_NOSELECTION : flags val PD_NOWARNING : flags val PD_PAGENUMS : flags val PD_PRINTSETUP : flags val PD_PRINTTOFILE : flags val PD_RETURNDC : flags val PD_RETURNDEFAULT : flags val PD_RETURNIC : flags val PD_SELECTION : flags val PD_SHOWHELP : flags val PD_USEDEVMODECOPIES : flags val PD_USEDEVMODECOPIESANDCOLLATE : flags val cConvert: flags conversion end = struct open Word32 type flags = word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val PD_ALLPAGES = 0wx00000000 val PD_SELECTION = 0wx00000001 val PD_PAGENUMS = 0wx00000002 val PD_NOSELECTION = 0wx00000004 val PD_NOPAGENUMS = 0wx00000008 val PD_COLLATE = 0wx00000010 val PD_PRINTTOFILE = 0wx00000020 val PD_PRINTSETUP = 0wx00000040 val PD_NOWARNING = 0wx00000080 val PD_RETURNDC = 0wx00000100 val PD_RETURNIC = 0wx00000200 val PD_RETURNDEFAULT = 0wx00000400 val PD_SHOWHELP = 0wx00000800 (*val PD_ENABLEPRINTHOOK = 0wx00001000 val PD_ENABLESETUPHOOK = 0wx00002000 val PD_ENABLEPRINTTEMPLATE = 0wx00004000 val PD_ENABLESETUPTEMPLATE = 0wx00008000 val PD_ENABLEPRINTTEMPLATEHANDLE = 0wx00010000 val PD_ENABLESETUPTEMPLATEHANDLE = 0wx00020000 *) val PD_USEDEVMODECOPIES = 0wx00040000 val PD_USEDEVMODECOPIESANDCOLLATE = 0wx00040000 val PD_DISABLEPRINTTOFILE = 0wx00080000 val PD_HIDEPRINTTOFILE = 0wx00100000 val PD_NONETWORKBUTTON = 0wx00200000 val all = flags[PD_ALLPAGES, PD_SELECTION, PD_PAGENUMS, PD_NOSELECTION, PD_NOPAGENUMS, PD_COLLATE, PD_PRINTTOFILE, PD_PRINTSETUP, PD_NOWARNING, PD_RETURNDC, PD_RETURNIC, PD_RETURNDEFAULT, PD_SHOWHELP, PD_USEDEVMODECOPIES, PD_USEDEVMODECOPIESANDCOLLATE, PD_DISABLEPRINTTOFILE, PD_HIDEPRINTTOFILE, PD_NONETWORKBUTTON] val intersect = List.foldl (fn (a, b) => andb(a,b)) all val cConvert = cDWORDw end type PAGESETUPDLG = { owner: HWND option, devMode: DEVMODE option, devNames: DEVNAMES option, flags: PageSetupFlags.flags, paperSize: POINT, minMargin: RECT, margin: RECT (* For the moment we ignore the other options. *) } type PRINTDLG = { owner: HWND option, devMode: DEVMODE option, devNames: DEVNAMES option, context: HDC option, flags: PrintDlgFlags.flags, fromPage: int, toPage: int, minPage: int, maxPage: int, copies: int (* For the moment we ignore the other options. *) } local (* A DEVNAMES structure is a structure containing offsets followed by the actual strings. *) val DEVNAMES = cStruct4(cWORD, cWORD, cWORD, cWORD) val {load=toDN, store=fromDN, ctype={size=sizeDevN, ...}, ...} = breakConversion DEVNAMES val DN_DEFAULTPRN = 0x0001 (* Allocate global memory for the devnames if necessary *) fun toDevNames NONE = hNull | toDevNames (SOME{driver, device, output, default}) = let (* We need memory for the DEVNAMES structure plus the strings plus their terminating nulls. *) val devnameSize = Word.toInt sizeDevN val sizeDriver = size driver and sizeDevice = size device and sizeOutput = size output val space = devnameSize + sizeDriver + sizeDevice + sizeOutput + 3 val mHandle = GlobalAlloc(0, space) val buff = GlobalLock mHandle (* Copy in the strings and calculate the next offset. *) open Memory infix 6 ++ fun copyString b str = ( stringToBuf(b, 0, str); b ++ Word.fromInt(size str+1) ); val off1 = copyString (buff ++ sizeDevN) driver; val off2 = copyString off1 device val _ = copyString off2 output in ignore(fromDN(buff, (devnameSize, devnameSize+sizeDriver+1, devnameSize+sizeDriver+sizeDevice+2, if default then DN_DEFAULTPRN else 0))); GlobalUnlock mHandle; mHandle end (* Convert a DevNames structure. *) fun fromDevNames v = if isHNull v then NONE else let val buff = GlobalLock v val (off0, off1, off2, def) = toDN buff open Memory infix 6 ++ val driver = fromCstring(buff ++ Word.fromInt off0) val device = fromCstring(buff ++ Word.fromInt off1) val output = fromCstring(buff ++ Word.fromInt off2) val default = IntInf.andb(def, DN_DEFAULTPRN) <> 0 in GlobalUnlock v; SOME {driver=driver, device=device, output=output, default=default} end val PAGESETUPDLG = cStruct14(cDWORD, cHWNDOPT, cHGLOBAL, cHGLOBAL, PageSetupFlags.cConvert, cPoint, cRect, cRect, cHINSTANCE, cLPARAM, cPointer, cPointer, cPointer, cPointer) val {load=toPSD, store=fromPSD, ctype={size=sizePageSD, ...}, ...} = breakConversion PAGESETUPDLG (* This is a bit of a mess. It seems that it uses structure packing on 32-bits which means that the fields after the five shorts are not aligned onto 4-byte boundaries. We currently don't use them so we just define this as the structure as far as we use it and set the length explicitly. This problem doesn't arise with PrintDlgEx so that might be preferable. *) val PRINTDLG = cStruct11(cDWORD, cHWNDOPT, cHGLOBAL, cHGLOBAL, cHDC, PrintDlgFlags.cConvert, cWORD, cWORD, cWORD, cWORD, cWORD) val {load=toPRD, store=fromPRD, ...} = breakConversion PRINTDLG val printDlgSize = if #size LowLevel.cTypePointer = 0w4 then 0w66 else 0w120 val pageSetupDlg = winCall1 (commdlg "PageSetupDlgA") cPointer cBool and printDlg = winCall1 (commdlg "PrintDlgA") cPointer cBool in fun PageSetupDlg (arg: PAGESETUPDLG): PAGESETUPDLG option = let val { owner: HWND option, devMode: DEVMODE option, devNames: {driver: string, device: string, output: string, default: bool} option, flags: PageSetupFlags.flags, paperSize: POINT, minMargin: RECT, margin: RECT} = arg val devnames = toDevNames devNames val devmode = case devMode of NONE => hNull | SOME dv => let (* This has to be in global memory *) open DeviceBase val hGlob = GlobalAlloc(0, Word.toInt(devModeSize dv)) val mem = GlobalLock hGlob val () = setCDevMode(mem, dv) in GlobalUnlock hGlob; hGlob end open Memory val mem = malloc sizePageSD val str = (Word.toInt sizePageSD, owner, devmode, devnames, flags, paperSize, minMargin, margin, hinstanceNull, 0, null, null, null, null) val freePsd = fromPSD(mem, str) (* Set the PAGESETUPDLG struct *) fun freeAll() = let (* We can only free the handles after we've reloaded them. *) val (_, _, hgDevMode, hgDevNames, _, _, _, _, _, _, _, _, _, _) = toPSD mem in if isHNull hgDevNames then () else ignore(GlobalFree hgDevNames); if isHNull hgDevMode then () else ignore(GlobalFree hgDevMode); free mem; freePsd() end val result = pageSetupDlg mem handle ex => (freeAll(); raise ex) val (_, owner, hgDevMode, hgDevNames, flags, paperSize, minMargin, margin, _, _, _, _, _, _) = toPSD mem val devMode = if isHNull hgDevMode then NONE else let val r = SOME(DeviceBase.getCDevMode(GlobalLock hgDevMode)) in GlobalUnlock hgDevMode; r end; val devNames = fromDevNames hgDevNames val newArg = { owner = owner, devMode = devMode, devNames = devNames, flags = flags, paperSize = paperSize, minMargin = minMargin, margin = margin } val () = freeAll() in if result then SOME newArg else NONE end and PrintDlg (arg: PRINTDLG): PRINTDLG option = let val { owner: HWND option, devMode: DEVMODE option, devNames: {driver: string, device: string, output: string, default: bool} option, context: HDC option, flags: PrintDlgFlags.flags, fromPage: int, toPage: int, minPage: int, maxPage: int, copies: int} = arg val devnames = toDevNames devNames val devmode = case devMode of NONE => hNull | SOME dv => let (* This has to be in global memory *) open DeviceBase val hGlob = GlobalAlloc(0, Word.toInt(devModeSize dv)) val mem = GlobalLock hGlob val () = setCDevMode(mem, dv) in GlobalUnlock hGlob; hGlob end open Memory val mem = malloc printDlgSize (* Since we're not going to set all of it we need to zero it. *) local fun zero n = if n = printDlgSize then () else (set8(mem, n, 0w0); zero(n+0w1)) in val () = zero 0w0 end val freePRD = fromPRD(mem, (Word.toInt printDlgSize, owner, devmode, devnames, getOpt(context, hdcNull), flags, fromPage, toPage, minPage, maxPage, copies)) fun freeAll() = let (* We can only free the handles after we've reloaded them. *) val (_, _, hgDevMode, hgDevNames, _, _, _, _, _, _, _) = toPRD mem in if isHNull hgDevNames then () else ignore(GlobalFree hgDevNames); if isHNull hgDevMode then () else ignore(GlobalFree hgDevMode); free mem; freePRD() end val result = printDlg mem handle ex => (freeAll(); raise ex) (* Convert the result. We have to do this even if the result is false to make sure we call GlobalFree on any global handles. *) val (_, owner, hgDevMode, hgDevNames, hdc, flags, fromPage, toPage, minPage, maxPage, copies) = toPRD mem val devMode = if isHNull hgDevMode then NONE else let val r = SOME(DeviceBase.getCDevMode(GlobalLock hgDevMode)) in GlobalUnlock hgDevMode; r end; val devNames = fromDevNames hgDevNames val newArg = { owner = owner, devMode = devMode, devNames = devNames, context = if isHdcNull hdc then NONE else SOME hdc, flags = flags, fromPage = fromPage, toPage = toPage, minPage = minPage, maxPage = maxPage, copies = copies } val () = freeAll() in if result then SOME newArg else NONE end end (* structure ChooseFontFlags :> sig include BIT_FLAGS val CF_ANSIONLY : flags val CF_APPLY : flags val CF_BOTH : flags val CF_EFFECTS : flags val CF_FIXEDPITCHONLY : flags val CF_FORCEFONTEXIST : flags val CF_NOFACESEL : flags val CF_NOOEMFONTS : flags val CF_NOSCRIPTSEL : flags val CF_NOSIMULATIONS : flags val CF_NOSIZESEL : flags val CF_NOSTYLESEL : flags val CF_NOVECTORFONTS : flags val CF_NOVERTFONTS : flags val CF_PRINTERFONTS : flags val CF_SCALABLEONLY : flags val CF_SCREENFONTS : flags val CF_SCRIPTSONLY : flags val CF_SELECTSCRIPT : flags val CF_SHOWHELP : flags val CF_TTONLY : flags val CF_WYSIWYG : flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val CF_SCREENFONTS = 0wx00000001 val CF_PRINTERFONTS = 0wx00000002 val CF_BOTH = 0wx00000003: flags val CF_SHOWHELP = 0wx00000004 (* val CF_ENABLEHOOK = 0wx00000008 val CF_ENABLETEMPLATE = 0wx00000010 val CF_ENABLETEMPLATEHANDLE = 0wx00000020 *) (*val CF_INITTOLOGFONTSTRUCT = 0wx00000040*) (*val CF_USESTYLE = 0wx00000080*) val CF_EFFECTS = 0wx00000100 val CF_APPLY = 0wx00000200 val CF_ANSIONLY = 0wx00000400 val CF_SCRIPTSONLY = CF_ANSIONLY val CF_NOVECTORFONTS = 0wx00000800 val CF_NOOEMFONTS = CF_NOVECTORFONTS val CF_NOSIMULATIONS = 0wx00001000 (*val CF_LIMITSIZE = 0wx00002000*) val CF_FIXEDPITCHONLY = 0wx00004000 val CF_WYSIWYG = 0wx00008000 val CF_FORCEFONTEXIST = 0wx00010000 val CF_SCALABLEONLY = 0wx00020000 val CF_TTONLY = 0wx00040000 val CF_NOFACESEL = 0wx00080000 val CF_NOSTYLESEL = 0wx00100000 val CF_NOSIZESEL = 0wx00200000 val CF_SELECTSCRIPT = 0wx00400000 val CF_NOSCRIPTSEL = 0wx00800000 val CF_NOVERTFONTS = 0wx01000000 val all = flags[CF_SCREENFONTS, CF_PRINTERFONTS, CF_SHOWHELP, CF_EFFECTS, CF_APPLY, CF_ANSIONLY, CF_NOVECTORFONTS, CF_NOSIMULATIONS, CF_FIXEDPITCHONLY, CF_WYSIWYG, CF_FORCEFONTEXIST, CF_SCALABLEONLY, CF_TTONLY, CF_NOFACESEL, CF_NOSTYLESEL, CF_NOSIZESEL, CF_SELECTSCRIPT, CF_NOSCRIPTSEL, CF_NOVERTFONTS] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end structure ChooseFontTypes :> sig include BIT_FLAGS val BOLD_FONTTYPE : flags val ITALIC_FONTTYPE : flags val PRINTER_FONTTYPE : flags val REGULAR_FONTTYPE : flags val SCREEN_FONTTYPE : flags val SIMULATED_FONTTYPE : flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val SIMULATED_FONTTYPE = 0wx8000 val PRINTER_FONTTYPE = 0wx4000 val SCREEN_FONTTYPE = 0wx2000 val BOLD_FONTTYPE = 0wx0100 val ITALIC_FONTTYPE = 0wx0200 val REGULAR_FONTTYPE = 0wx0400 val all = flags[SIMULATED_FONTTYPE, PRINTER_FONTTYPE, SCREEN_FONTTYPE, BOLD_FONTTYPE, ITALIC_FONTTYPE, REGULAR_FONTTYPE] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end type CHOOSEFONT = { owner: HWND option, context: HDC option, logFont: LOGFONT option, pointSize: int, flags: ChooseFontFlags.flags, colors: COLORREF, style: string option, fontType: ChooseFontTypes.flags, size: {min: int, max: int} option } local val CHOOSEFONT = cStruct16(UINT, HWNDOPT, HDC, POINTER, INT, WORD, COLORREF, INT, INT, INT, INT, POINTER, SHORT, SHORT, INT, INT) val (toCF, fromCF, cfStruct) = breakConversion CHOOSEFONT val (toLF, fromLF, lfStruct) = breakConversion FontBase.LOGFONT val CF_LIMITSIZE = 0wx00002000 val CF_INITTOLOGFONTSTRUCT = 0wx00000040 val CF_USESTYLE = 0wx00000080 fun toCChooseFont({ owner: HWND option, context: HDC option, logFont: LOGFONT option, pointSize: int, flags: ChooseFontFlags.flags, colors: COLORREF, style: string option, fontType: ChooseFontTypes.flags, size: {min: int, max: int} option }) = let (* Use the supplied logFont otherwise allocate store for a new one. *) val logf = case logFont of SOME logf => address(fromLF logf) | NONE => address(alloc 1 lfStruct) (* Copy any style to the buffer - I don't know why this is 64. *) val lpszStyle = allocAndInitialise(64, getOpt(style, "")) val (min, max) = case size of SOME {min, max} => (min, max) | NONE => (0,0) val f1 = case size of SOME _ => CF_LIMITSIZE | _ => 0w0 val f2 = case logFont of SOME _ => CF_INITTOLOGFONTSTRUCT | _ => 0w0 val f3 = case style of SOME _ => CF_USESTYLE | _ => 0w0 val flags = List.foldl LargeWord.orb 0w0 [ChooseFontFlags.toWord flags, f1, f2, f3] in address( fromCF(sizeof cfStruct, owner, getOpt(context, hdcNull), logf, pointSize, flags, colors, 0, 0, 0, 0, lpszStyle, LargeWord.toInt (ChooseFontTypes.toWord fontType), 0, min, max)) end fun fromCChooseFont v : CHOOSEFONT = let val (_, owner, hdc, logf, pointSize, flags, colors, _, _, _, _, style, types, _, min, max) = toCF(deref v) val minMax = if LargeWord.andb(flags, CF_LIMITSIZE) = 0w0 then NONE else SOME{min=min, max=max} val style = if LargeWord.andb(flags, CF_USESTYLE) = 0w0 then NONE else SOME(fromCstring style) in { owner = owner, context = if isHdcNull hdc then NONE else SOME hdc, logFont = SOME(toLF(deref logf)), pointSize = pointSize, (* Remove CF_LIMITSIZE and/or CF_INITTOLOGFONTSTRUCT *) flags = ChooseFontFlags.intersect[ChooseFontFlags.fromWord flags], colors = colors, style = style, fontType = ChooseFontTypes.fromWord(LargeWord.andb(LargeWord.fromInt types, 0wxffff)), size = minMax} end in fun ChooseFont (arg: CHOOSEFONT): CHOOSEFONT option = let val converted = toCChooseFont arg val result = winCall1 (commdlg "ChooseFontA") POINTER BOOL converted in if result then SOME(fromCChooseFont converted) else NONE end end structure ChooseColorFlags :> sig include BIT_FLAGS val CC_ANYCOLOR : flags val CC_FULLOPEN : flags val CC_PREVENTFULLOPEN : flags val CC_RGBINIT : flags val CC_SHOWHELP : flags val CC_SOLIDCOLOR : flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val CC_RGBINIT = 0wx00000001 val CC_FULLOPEN = 0wx00000002 val CC_PREVENTFULLOPEN = 0wx00000004 val CC_SHOWHELP = 0wx00000008 (*val CC_ENABLEHOOK = 0wx00000010 val CC_ENABLETEMPLATE = 0wx00000020 val CC_ENABLETEMPLATEHANDLE = 0wx00000040*) val CC_SOLIDCOLOR = 0wx00000080 val CC_ANYCOLOR = 0wx00000100 val all = flags[CC_RGBINIT, CC_FULLOPEN, CC_PREVENTFULLOPEN, CC_SHOWHELP, CC_SOLIDCOLOR, CC_ANYCOLOR] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end type CHOOSECOLOR = { owner: HWND option, result: COLORREF, customColors: COLORREF list, flags: ChooseColorFlags.flags } local val CHOOSECOLOR = cStruct9(UINT, HWNDOPT, INT, COLORREF, POINTER, WORD, INT, INT, INT) (* The custom colours are held in an array of 16 elements. *) val CUSTOM = cStruct16(COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF, COLORREF) val (toCC, fromCC, ccStruct) = breakConversion CHOOSECOLOR val (toM, fromM, mStruct) = breakConversion CUSTOM val (toCR, fromCR, cref) = breakConversion COLORREF fun toCChooseColor { owner: HWND option, result: COLORREF, customColors: COLORREF list, flags: ChooseColorFlags.flags } = let val custom = alloc 1 mStruct val black = fromCR(RGB{red=0, green=0, blue=0}) fun fillCustom(_, 16) = () | fillCustom([], i) = (assign cref (offset i cref custom) black; fillCustom([], i+1)) | fillCustom(hd::tl, i) = (assign cref (offset i cref custom) (fromCR hd); fillCustom(tl, i+1)) in fillCustom(customColors, 0); address( fromCC(sizeof ccStruct, owner, 0, result, address custom, ChooseColorFlags.toWord flags, 0, 0, 0)) end fun fromCChooseColor v : CHOOSECOLOR = let val (_, owner, _, result, custom, flags, _, _, _) = toCC(deref v) val custom = List.tabulate(16, fn i => toCR(offset i cref(deref custom))) in { owner = owner, flags = ChooseColorFlags.fromWord flags, customColors = custom, result = result} end in fun ChooseColor (arg: CHOOSECOLOR): CHOOSECOLOR option = let val converted = toCChooseColor arg val result = winCall1 (commdlg "ChooseColorA") POINTER BOOL converted in if result then SOME(fromCChooseColor converted) else NONE end end *) (* typedef struct tagCHOOSECOLORA { DWORD lStructSize; HWND hwndOwner; HWND hInstance; COLORREF rgbResult; COLORREF* lpCustColors; DWORD Flags; LPARAM lCustData; LPCCHOOKPROC lpfnHook; LPCSTR lpTemplateName; } CHOOSECOLORA, *LPCHOOSECOLORA; *) (* ChooseColor PrintDlgEx - NT 5.0 and later only The following application-defined hook procedures are used with common dialog boxes. CCHookProc CFHookProc FRHookProc OFNHookProc OFNHookProcOldStyle PagePaintHook PageSetupHook PrintHookProc SetupHookProc *) end end; polyml-5.6/mlsource/extra/Win/Cursor.sml000066400000000000000000000141131265146633400204150ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Cursor: sig type HCURSOR and HINSTANCE type POINT = { x : int, y: int } type RECT = { left: int, top: int, right: int, bottom: int } val hcursorNull : HCURSOR val isHcursorNull : HCURSOR -> bool datatype CursorId = OCR_APPSTARTING | OCR_CROSS | OCR_IBEAM | OCR_NO | OCR_NORMAL | OCR_SIZEALL | OCR_SIZENESW | OCR_SIZENS | OCR_SIZENWSE | OCR_SIZEWE | OCR_UP | OCR_WAIT val ClipCursor : RECT -> unit val CopyCursor : HCURSOR -> HCURSOR val DestroyCursor : HCURSOR -> unit val GetClipCursor : unit -> RECT val GetCursor : unit -> HCURSOR val GetCursorPos : unit -> POINT val LoadCursor : HINSTANCE * Resource.RESID -> HCURSOR val LoadCursorFromFile : string -> HCURSOR val LoadSystemCursor : CursorId -> HCURSOR val LoadSystemCursorFromFile : CursorId -> HCURSOR val SetCursor : HCURSOR -> HCURSOR val SetCursorPos : int * int -> unit val SetSystemCursor : HCURSOR * CursorId -> unit val ShowCursor : bool -> int end = struct local open Foreign open Base open Resource in type HCURSOR = HCURSOR and HINSTANCE = HINSTANCE type RECT = RECT and POINT = POINT val hcursorNull = hgdiObjNull and isHcursorNull = isHgdiObjNull datatype CursorId = OCR_APPSTARTING (* Standard arrow and small hourglass *) | OCR_NORMAL (* Standard arrow *) | OCR_CROSS (* Crosshair *) | OCR_IBEAM (* I-beam *) | OCR_NO (* Slashed circle *) | OCR_SIZEALL (* Four-pointed arrow pointing north, south, east, and west *) | OCR_SIZENESW (* Double-pointed arrow pointing northeast and southwest *) | OCR_SIZENS (* Double-pointed arrow pointing north and south *) | OCR_SIZENWSE (* Double-pointed arrow pointing northwest and southeast *) | OCR_SIZEWE (* Double-pointed arrow pointing west and east *) | OCR_UP (* Vertical arrow *) | OCR_WAIT (* Hourglass *) local fun idToInt OCR_APPSTARTING = 32650 | idToInt OCR_NORMAL = 32512 | idToInt OCR_CROSS = 32515 | idToInt OCR_IBEAM = 32513 | idToInt OCR_NO = 32648 | idToInt OCR_SIZEALL = 32646 | idToInt OCR_SIZENESW = 32643 | idToInt OCR_SIZENS = 32645 | idToInt OCR_SIZENWSE = 32642 | idToInt OCR_SIZEWE = 32644 | idToInt OCR_UP = 32516 | idToInt OCR_WAIT = 32514 fun intToId _ = raise Fail "intToId" in val CURSORID = absConversion {abs=intToId, rep=idToInt} cDWORD end val SetSystemCursor = winCall2 (user "SetSystemCursor") (cHCURSOR, CURSORID) (successState "SetSystemCursor") fun checkCursor c = (checkResult(not(isHcursorNull c)); c) val LoadCursorFromFile = checkCursor o winCall1 (user "LoadCursorFromFileA") (cString) cHCURSOR (* ML extension - simpler than having a separate function. *) (* I found a note suggesting that it was better to use the Unicode version because not all implementations handle this properly. *) val LoadSystemCursorFromFile = checkCursor o winCall1 (user "LoadCursorFromFileW") (CURSORID) cHCURSOR val ClipCursor = winCall1 (user "ClipCursor") (cConstStar cRect) (successState "ClipCursor") val CopyCursor = checkCursor o winCall1 (user "CopyCursor") (cHCURSOR) cHCURSOR val DestroyCursor = winCall1 (user "DestroyCursor") (cHCURSOR) (successState "DestroyCursor") local val getClipCursor = winCall1 (user "GetClipCursor") (cStar cRect) (successState "GetClipCursor") in fun GetClipCursor (): RECT = let val r = ref { top = 0, bottom = 0, left = 0, right = 0 } in getClipCursor r; !r end end val GetCursor = winCall0 (user "GetCursor") () cHCURSOR local val getCursorPos = winCall1 (user "GetCursorPos") (cStar cPoint) (successState "GetCursorPos") in fun GetCursorPos (): POINT = let val r = ref { x = 0, y = 0 } in getCursorPos r; !r end end val SetCursor = winCall1 (user "SetCursor") cHCURSOR cHCURSOR val SetCursorPos = winCall2 (user "SetCursorPos") (cInt, cInt) (successState "SetCursorPos") val ShowCursor = winCall1 (user "ShowCursor") cBool cInt (* Superseded by LoadImage *) val LoadCursor = checkCursor o winCall2 (user "LoadCursorA") (cHINSTANCE, cRESID) cHCURSOR local val loadCursor = checkCursor o winCall2 (user "LoadCursorA") (cHINSTANCE, CURSORID) cHCURSOR in fun LoadSystemCursor(id: CursorId) = loadCursor(hinstanceNull, id) end (* TODO: CreateCursor a little complicated because it includes bit maps. *) end end; polyml-5.6/mlsource/extra/Win/DeviceBase.sml000066400000000000000000000602571265146633400211440ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure DeviceBase = struct local open Foreign Base in (* Paper sizes. *) (* Colours. Retain the American spelling for compatibility. *) datatype DMColor = DMCOLOR_MONOCHROME | DMCOLOR_COLOR local val tab = [ (DMCOLOR_MONOCHROME, 1), (DMCOLOR_COLOR, 2)] in val (fromDMC, toDMC) = tableLookup(tab, NONE) end (* Default source. *) datatype DMSource = DMBIN_UPPER | DMBIN_ONLYONE | DMBIN_LOWER | DMBIN_MIDDLE | DMBIN_MANUAL | DMBIN_ENVELOPE | DMBIN_ENVMANUAL | DMBIN_AUTO | DMBIN_TRACTOR | DMBIN_SMALLFMT | DMBIN_LARGEFMT | DMBIN_LARGECAPACITY | DMBIN_CASSETTE | DMBIN_FORMSOURCE | DMSOURCE_OTHER of int local val tab = [ (DMBIN_ONLYONE, 1), (DMBIN_UPPER, 1), (DMBIN_LOWER, 2), (DMBIN_MIDDLE, 3), (DMBIN_MANUAL, 4), (DMBIN_ENVELOPE, 5), (DMBIN_ENVMANUAL, 6), (DMBIN_AUTO, 7), (DMBIN_TRACTOR, 8), (DMBIN_SMALLFMT, 9), (DMBIN_LARGEFMT, 10), (DMBIN_LARGECAPACITY, 11), (DMBIN_CASSETTE, 14), (DMBIN_FORMSOURCE, 15)] in fun doConv (DMSOURCE_OTHER i) = i | doConv _ = raise Match val (fromDMS, toDMS) = tableLookup(tab, SOME(DMSOURCE_OTHER, doConv)) end (* Print quality. Positive numbers represent dots per inch. *) datatype DMResolution = DMRES_DRAFT | DMRES_LOW | DMRES_MEDIUM | DMRES_HIGH | DMRES_DPI of int local val tab = [ (DMRES_DRAFT, ~1), (DMRES_LOW, ~2), (DMRES_MEDIUM, ~3), (DMRES_HIGH, ~4)] in fun doConv (DMRES_DPI i) = i | doConv _ = raise Match val (fromDMR, toDMR) = tableLookup(tab, SOME(DMRES_DPI, doConv)) end datatype DMDuplex = DMDUP_SIMPLEX | DMDUP_VERTICAL | DMDUP_HORIZONTAL local val tab = [ (DMDUP_SIMPLEX, 1), (DMDUP_VERTICAL, 2), (DMDUP_HORIZONTAL, 3)] in val (fromDMD, toDMD) = tableLookup(tab, NONE) end datatype DMTrueType = DMTT_BITMAP | DMTT_DOWNLOAD | DMTT_SUBDEV | DMTT_DOWNLOAD_OUTLINE local val tab = [ (DMTT_BITMAP, 1), (DMTT_DOWNLOAD, 2), (DMTT_SUBDEV, 3), (DMTT_DOWNLOAD_OUTLINE, 4)] in val (fromDMTT, toDMTT) = tableLookup(tab, NONE) end datatype DMICMMethod = DMICMMETHOD_NONE | DMICMMETHOD_SYSTEM | DMICMMETHOD_DRIVER | DMICMMETHOD_DEVICE | DMICMMETHOD_OTHER of int local val tab = [ (DMICMMETHOD_NONE, 1), (DMICMMETHOD_SYSTEM, 2), (DMICMMETHOD_DRIVER, 3), (DMICMMETHOD_DEVICE, 4)] in fun doConv (DMICMMETHOD_OTHER i) = i | doConv _ = raise Match val (fromDMICMM, toDMICMM) = tableLookup(tab, SOME(DMICMMETHOD_OTHER, doConv)) end datatype DMICMIntent = DMICM_SATURATE | DMICM_CONTRAST | DMICM_COLORMETRIC | DMICMINTENT_OTHER of int local val tab = [ (DMICM_SATURATE, 1), (DMICM_CONTRAST, 2), (DMICM_COLORMETRIC, 3)] in fun doConv (DMICMINTENT_OTHER i) = i | doConv _ = raise Match val (fromDMICMI, toDMICMI) = tableLookup(tab, SOME(DMICMINTENT_OTHER, doConv)) end datatype DMMedia = DMMEDIA_STANDARD | DMMEDIA_TRANSPARENCY | DMMEDIA_GLOSSY | DMICMMEDIA_OTHER of int local val tab = [ (DMMEDIA_STANDARD, 1), (DMMEDIA_TRANSPARENCY, 2), (DMMEDIA_GLOSSY, 3)] in fun doConv (DMICMMEDIA_OTHER i) = i | doConv _ = raise Match val (fromDMM, toDMM) = tableLookup(tab, SOME(DMICMMEDIA_OTHER, doConv)) end datatype DMDither = DMDITHER_NONE | DMDITHER_COARSE | DMDITHER_FINE | DMDITHER_LINEART | DMDITHER_GRAYSCALE | DMDITHER_OTHER of int local val tab = [ (DMDITHER_NONE, 1), (DMDITHER_COARSE, 2), (DMDITHER_FINE, 3), (DMDITHER_LINEART, 4), (DMDITHER_GRAYSCALE, 5)] in fun doConv (DMDITHER_OTHER i) = i | doConv _ = raise Match val (fromDMDi, toDMDi) = tableLookup(tab, SOME(DMDITHER_OTHER, doConv)) end (* Paper orientation. *) datatype DMOrientation = DMORIENT_PORTRAIT | DMORIENT_LANDSCAPE local val tab = [ (DMORIENT_PORTRAIT, 1), (DMORIENT_LANDSCAPE, 2)] in (* Because we use getShort to get the values we don't need a Conversion. *) val (fromDMO, toDMO) = tableLookup(tab, NONE) end datatype DMPaperSize = DMPAPER_LETTER | DMPAPER_LETTERSMALL | DMPAPER_TABLOID | DMPAPER_LEDGER | DMPAPER_LEGAL | DMPAPER_STATEMENT | DMPAPER_EXECUTIVE | DMPAPER_A3 | DMPAPER_A4 | DMPAPER_A4SMALL | DMPAPER_A5 | DMPAPER_B4 | DMPAPER_B5 | DMPAPER_FOLIO | DMPAPER_QUARTO | DMPAPER_10X14 | DMPAPER_11X17 | DMPAPER_NOTE | DMPAPER_ENV_9 | DMPAPER_ENV_10 | DMPAPER_ENV_11 | DMPAPER_ENV_12 | DMPAPER_ENV_14 | DMPAPER_CSHEET | DMPAPER_DSHEET | DMPAPER_ESHEET | DMPAPER_ENV_DL | DMPAPER_ENV_C5 | DMPAPER_ENV_C3 | DMPAPER_ENV_C4 | DMPAPER_ENV_C6 | DMPAPER_ENV_C65 | DMPAPER_ENV_B4 | DMPAPER_ENV_B5 | DMPAPER_ENV_B6 | DMPAPER_ENV_ITALY | DMPAPER_ENV_MONARCH | DMPAPER_ENV_PERSONAL | DMPAPER_FANFOLD_US | DMPAPER_FANFOLD_STD_GERMAN | DMPAPER_FANFOLD_LGL_GERMAN | DMPAPER_ISO_B4 | DMPAPER_JAPANESE_POSTCARD | DMPAPER_9X11 | DMPAPER_10X11 | DMPAPER_15X11 | DMPAPER_ENV_INVITE | DMPAPER_RESERVED_48 | DMPAPER_RESERVED_49 | DMPAPER_LETTER_EXTRA | DMPAPER_LEGAL_EXTRA | DMPAPER_TABLOID_EXTRA | DMPAPER_A4_EXTRA | DMPAPER_LETTER_TRANSVERSE | DMPAPER_A4_TRANSVERSE | DMPAPER_LETTER_EXTRA_TRANSVERSE | DMPAPER_A_PLUS | DMPAPER_B_PLUS | DMPAPER_LETTER_PLUS | DMPAPER_A4_PLUS | DMPAPER_A5_TRANSVERSE | DMPAPER_B5_TRANSVERSE | DMPAPER_A3_EXTRA | DMPAPER_A5_EXTRA | DMPAPER_B5_EXTRA | DMPAPER_A2 | DMPAPER_A3_TRANSVERSE | DMPAPER_A3_EXTRA_TRANSVERSE | DMPAPER_OTHER of int local val tab = [ (DMPAPER_LETTER, 1), (DMPAPER_LETTERSMALL, 2), (DMPAPER_TABLOID, 3), (DMPAPER_LEDGER, 4), (DMPAPER_LEGAL, 5), (DMPAPER_STATEMENT, 6), (DMPAPER_EXECUTIVE, 7), (DMPAPER_A3, 8), (DMPAPER_A4, 9), (DMPAPER_A4SMALL, 10), (DMPAPER_A5, 11), (DMPAPER_B4, 12), (DMPAPER_B5, 13), (DMPAPER_FOLIO, 14), (DMPAPER_QUARTO, 15), (DMPAPER_10X14, 16), (DMPAPER_11X17, 17), (DMPAPER_NOTE, 18), (DMPAPER_ENV_9, 19), (DMPAPER_ENV_10, 20), (DMPAPER_ENV_11, 21), (DMPAPER_ENV_12, 22), (DMPAPER_ENV_14, 23), (DMPAPER_CSHEET, 24), (DMPAPER_DSHEET, 25), (DMPAPER_ESHEET, 26), (DMPAPER_ENV_DL, 27), (DMPAPER_ENV_C5, 28), (DMPAPER_ENV_C3, 29), (DMPAPER_ENV_C4, 30), (DMPAPER_ENV_C6, 31), (DMPAPER_ENV_C65, 32), (DMPAPER_ENV_B4, 33), (DMPAPER_ENV_B5, 34), (DMPAPER_ENV_B6, 35), (DMPAPER_ENV_ITALY, 36), (DMPAPER_ENV_MONARCH, 37), (DMPAPER_ENV_PERSONAL, 38), (DMPAPER_FANFOLD_US, 39), (DMPAPER_FANFOLD_STD_GERMAN, 40), (DMPAPER_FANFOLD_LGL_GERMAN, 41), (DMPAPER_ISO_B4, 42), (DMPAPER_JAPANESE_POSTCARD, 43), (DMPAPER_9X11, 44), (DMPAPER_10X11, 45), (DMPAPER_15X11, 46), (DMPAPER_ENV_INVITE, 47), (DMPAPER_RESERVED_48, 48), (DMPAPER_RESERVED_49, 49), (DMPAPER_LETTER_EXTRA, 50), (DMPAPER_LEGAL_EXTRA, 51), (DMPAPER_TABLOID_EXTRA, 52), (DMPAPER_A4_EXTRA, 53), (DMPAPER_LETTER_TRANSVERSE, 54), (DMPAPER_A4_TRANSVERSE, 55), (DMPAPER_LETTER_EXTRA_TRANSVERSE, 56), (DMPAPER_A_PLUS, 57), (DMPAPER_B_PLUS, 58), (DMPAPER_LETTER_PLUS, 59), (DMPAPER_A4_PLUS, 60), (DMPAPER_A5_TRANSVERSE, 61), (DMPAPER_B5_TRANSVERSE, 62), (DMPAPER_A3_EXTRA, 63), (DMPAPER_A5_EXTRA, 64), (DMPAPER_B5_EXTRA, 65), (DMPAPER_A2, 66), (DMPAPER_A3_TRANSVERSE, 67), (DMPAPER_A3_EXTRA_TRANSVERSE, 68) ] in (* Because we use getShort to get the values we don't need a Conversion. *) fun doConv (DMPAPER_OTHER i) = i | doConv _ = raise Match val (fromDMPS, toDMPS) = tableLookup(tab, SOME(DMPAPER_OTHER, doConv)) end type DEVMODE = { deviceName: string, driverVersion: int, orientation: DMOrientation option, paperSize: DMPaperSize option, paperLength: int option, paperWidth: int option, scale: int option, copies: int option, defaultSource: DMSource option, printQuality: DMResolution option, color: DMColor option, duplex: DMDuplex option, yResolution: int option, ttOption: DMTrueType option, collate: bool option, formName: string option, logPixels: int option, bitsPerPixel: int option, pelsWidth: int option, pelsHeight: int option, displayFlags: int option, (* Apparently no longer used. *) displayFrequency: int option, icmMethod: DMICMMethod option, icmIntent: DMICMIntent option, mediaType: DMMedia option, ditherType: DMDither option, panningWidth: int option, panningHeight: int option, driverPrivate: Word8Vector.vector } local val DM_SPECVERSION = 0x0401 (* The size of the structure is the same in both 32-bit and 64-bit modes but is larger in Unicode (220 bytes). *) val DMBaseSize = 0w156 (* Size of structure without any user data. *) (* These bits indicate the valid fields in the structure. *) val DM_ORIENTATION = 0x00000001 val DM_PAPERSIZE = 0x00000002 val DM_PAPERLENGTH = 0x00000004 val DM_PAPERWIDTH = 0x00000008 val DM_SCALE = 0x00000010 val DM_COPIES = 0x00000100 val DM_DEFAULTSOURCE = 0x00000200 val DM_PRINTQUALITY = 0x00000400 val DM_COLOR = 0x00000800 val DM_DUPLEX = 0x00001000 val DM_YRESOLUTION = 0x00002000 val DM_TTOPTION = 0x00004000 val DM_COLLATE = 0x00008000 val DM_FORMNAME = 0x00010000 val DM_LOGPIXELS = 0x00020000 val DM_BITSPERPEL = 0x00040000 val DM_PELSWIDTH = 0x00080000 val DM_PELSHEIGHT = 0x00100000 val DM_DISPLAYFLAGS = 0x00200000 val DM_DISPLAYFREQUENCY = 0x00400000 val DM_PANNINGWIDTH = 0x00800000 val DM_PANNINGHEIGHT = 0x01000000 val DM_ICMMETHOD = 0x02000000 val DM_ICMINTENT = 0x04000000 val DM_MEDIATYPE = 0x08000000 val DM_DITHERTYPE = 0x10000000 open Memory infix 6 ++ val {load=loadShort, store=storeShort, ctype={size=sizeShort, ...}} = breakConversion cShort val {load=loadDWord, store=storeDWord, ctype={size=sizeDWord, ...}} = breakConversion cDWORD (* We need separate versions of this for local and global storage. PageSetupDlg requires a HGLOBAL handle to the memory. *) fun getCDevMode(v: voidStar) : DEVMODE = let val ptr = ref v fun getShort() = loadShort(!ptr) before ptr := !ptr ++ sizeShort and getDWord() = loadDWord(!ptr) before ptr := !ptr ++ sizeDWord val deviceName = fromCstring (!ptr) val () = ptr := !ptr ++ 0w32 val _ = getShort() val driverVersion = getShort() val _ = getShort() val driverExtra = getShort() (* The "fields" value determines which of the fields are valid. *) val fields = getDWord() fun getOpt opt conv v = if IntInf.andb(fields, opt) = 0 then NONE else SOME(conv v) fun I x = x val orientation = (getOpt DM_ORIENTATION toDMO o getShort) () val paperSize = (getOpt DM_PAPERSIZE toDMPS o getShort) () val paperLength = getOpt DM_PAPERLENGTH I (getShort()) val paperWidth = getOpt DM_PAPERWIDTH I (getShort()) val scale = getOpt DM_SCALE I (getShort()) val copies = getOpt DM_COPIES I (getShort()) val defaultSource = (getOpt DM_DEFAULTSOURCE toDMS o getShort) () val printQuality = (getOpt DM_PRINTQUALITY toDMR o getShort) () val colour = (getOpt DM_COLOR toDMC o getShort) () val duplex = (getOpt DM_DUPLEX toDMD o getShort) () val yResolution = getOpt DM_YRESOLUTION I (getShort()) val ttOption = (getOpt DM_TTOPTION toDMTT o getShort) () val collate = getOpt DM_COLLATE I (getShort()) val formName = getOpt DM_FORMNAME I (fromCstring(!ptr)) val () = ptr := !ptr ++ 0w32 val logPixels = getOpt DM_LOGPIXELS I (getShort()) val bitsPerPixel = getOpt DM_BITSPERPEL I (getDWord()) val pelsWidth = getOpt DM_PELSWIDTH I (getDWord()) val pelsHeight = getOpt DM_PELSHEIGHT I (getDWord()) val displayFlags = getOpt DM_DISPLAYFLAGS I (getDWord()) (* Or dmNup *) val displayFrequency = getOpt DM_DISPLAYFREQUENCY I (getDWord()) val icmMethod = (getOpt DM_ICMMETHOD toDMICMM o getDWord) () val icmIntent = (getOpt DM_ICMINTENT toDMICMI o getDWord) () val mediaType = (getOpt DM_MEDIATYPE toDMM o getDWord) () val ditherType = (getOpt DM_DITHERTYPE toDMDi o getDWord) () val (*iccManufacturer*)_ = getDWord() val (*iccModel*)_ = getDWord() val panningWidth = getOpt DM_PANNINGWIDTH I (getDWord()) val panningHeight = getOpt DM_PANNINGHEIGHT I (getDWord()) val _ = voidStar2Sysword(!ptr) - voidStar2Sysword v = Word.toLargeWord DMBaseSize orelse raise Fail "loadCDevMode: length wrong" (* There may be private data at the end. *) fun loadByte _ = Memory.get8(!ptr, 0w0) before ptr := !ptr ++ 0w1 val driverPrivate = Word8Vector.tabulate(driverExtra, loadByte) in { deviceName = deviceName, driverVersion = driverVersion, orientation = orientation, paperSize = paperSize, paperLength = paperLength, paperWidth = paperWidth, scale = scale, copies = copies, defaultSource = defaultSource, printQuality = printQuality, color = colour, duplex = duplex, yResolution = yResolution, ttOption = ttOption, collate = case collate of NONE => NONE | SOME 0 => SOME false | SOME _ => SOME true, formName = formName, logPixels = logPixels, bitsPerPixel = bitsPerPixel, pelsWidth = pelsWidth, pelsHeight = pelsHeight, displayFlags = displayFlags, displayFrequency = displayFrequency, icmMethod = icmMethod, icmIntent = icmIntent, mediaType = mediaType, ditherType = ditherType, panningWidth = panningWidth, panningHeight = panningHeight, driverPrivate = driverPrivate } end fun setCDevMode(v: voidStar, (* This is the address of the data *) { deviceName: string, driverVersion: int, orientation: DMOrientation option, paperSize: DMPaperSize option, paperLength: int option, paperWidth: int option, scale: int option, copies: int option, defaultSource: DMSource option, printQuality: DMResolution option, color: DMColor option, duplex: DMDuplex option, yResolution: int option, ttOption: DMTrueType option, collate: bool option, formName: string option, logPixels: int option, bitsPerPixel: int option, pelsWidth: int option, pelsHeight: int option, displayFlags: int option, (* Apparently no longer used. *) displayFrequency: int option, icmMethod: DMICMMethod option, icmIntent: DMICMIntent option, mediaType: DMMedia option, ditherType: DMDither option, panningWidth: int option, panningHeight: int option, driverPrivate: Word8Vector.vector }: DEVMODE) : unit = let val ptr = ref v (* The name can be at most 31 characters. *) val devName = if size deviceName > 31 then String.substring(deviceName, 0, 31) else deviceName (* setShort and setLong set the appropriate field and advance the pointer. *) fun setShort i = ignore(storeShort(!ptr, i)) before ptr := !ptr ++ sizeShort and setDWord i = ignore(storeDWord(!ptr, i)) before ptr := !ptr ++ sizeDWord (* Optional values default to zero. If the option is SOME v we set the appropriate bit in "fields". *) val fields = ref 0 fun setOpt _ _ NONE = 0 | setOpt opt conv (SOME v) = (fields := IntInf.orb(!fields, opt); conv v) fun I x = x fun fromCollate true = 1 | fromCollate false = 0 val form = case formName of NONE => "" | SOME s => if size s > 31 then String.substring(s, 0, 31) else s in CharVector.appi(fn (i, c) => set8(!ptr, Word.fromInt i, Word8.fromInt(ord c))) devName; set8(!ptr, Word.fromInt(size devName), 0w0); ptr := !ptr ++ 0w32; setShort DM_SPECVERSION; setShort driverVersion; setShort (Word.toInt DMBaseSize); setShort (Word8Vector.length driverPrivate); setDWord 0; (* Fields - set this later. *) setShort(setOpt DM_ORIENTATION fromDMO orientation); setShort(setOpt DM_PAPERSIZE fromDMPS paperSize); setShort(setOpt DM_PAPERLENGTH I paperLength); setShort(setOpt DM_PAPERWIDTH I paperWidth); setShort(setOpt DM_SCALE I scale); setShort(setOpt DM_COPIES I copies); setShort(setOpt DM_DEFAULTSOURCE fromDMS defaultSource); setShort(setOpt DM_PRINTQUALITY fromDMR printQuality); setShort(setOpt DM_COLOR fromDMC color); setShort(setOpt DM_DUPLEX fromDMD duplex); setShort(setOpt DM_YRESOLUTION I yResolution); setShort(setOpt DM_TTOPTION fromDMTT ttOption); setShort(setOpt DM_COLLATE fromCollate collate); CharVector.appi(fn (i, c) => set8(!ptr, Word.fromInt i, Word8.fromInt(ord c))) form; set8(!ptr, Word.fromInt(size form), 0w0); ptr := !ptr ++ 0w32; setShort(setOpt DM_LOGPIXELS I logPixels); setDWord(setOpt DM_BITSPERPEL I bitsPerPixel); setDWord(setOpt DM_PELSWIDTH I pelsWidth); setDWord(setOpt DM_PELSHEIGHT I pelsHeight); setDWord(setOpt DM_DISPLAYFLAGS I displayFlags); setDWord(setOpt DM_DISPLAYFREQUENCY I displayFrequency); setDWord(setOpt DM_ICMMETHOD fromDMICMM icmMethod); setDWord(setOpt DM_ICMINTENT fromDMICMI icmIntent); setDWord(setOpt DM_MEDIATYPE fromDMM mediaType); setDWord(setOpt DM_DITHERTYPE fromDMDi ditherType); setDWord 0; setDWord 0; setDWord(setOpt DM_PANNINGWIDTH I panningWidth); setDWord(setOpt DM_PANNINGHEIGHT I panningHeight); (* Set the fields now. *) ignore(storeDWord(v ++ 0w40, !fields)); let fun copyToBuf (_, c) = set8(!ptr, 0w0, c) before ptr := !ptr ++ 0w1 in Word8Vector.appi copyToBuf driverPrivate end end fun devModeSize({driverPrivate: Word8Vector.vector, ...}: DEVMODE): word = DMBaseSize + Word.fromInt (Word8Vector.length driverPrivate) fun storeCDevMode(vaddr: voidStar, devmode) = let val v = malloc (devModeSize devmode) val () = setAddress(vaddr, 0w0, v) in setCDevMode(v, devmode); fn () => free v end fun loadCDevMode(vaddr: voidStar) : DEVMODE = getCDevMode(getAddress(vaddr, 0w0)) in val LPDEVMODE = makeConversion{load=loadCDevMode, store=storeCDevMode, ctype=LowLevel.cTypePointer } val getCDevMode = getCDevMode and setCDevMode = setCDevMode and devModeSize = devModeSize end end end; polyml-5.6/mlsource/extra/Win/DeviceContext.sml000066400000000000000000000725351265146633400217200ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure DeviceContext: sig type BITMAP and HDC and HGDIOBJ and HWND and HRGN type LOGBRUSH = Brush.LOGBRUSH type LOGFONT = Font.LOGFONT type LOGPEN = Pen.LOGPEN type POINT = {x: int, y: int} type StockObjectType val ANSI_FIXED_FONT : StockObjectType val ANSI_VAR_FONT : StockObjectType val BLACK_BRUSH : StockObjectType val BLACK_PEN : StockObjectType val CLR_INVALID : StockObjectType val DEFAULT_PALETTE : StockObjectType val DEVICE_DEFAULT_FONT : StockObjectType val DKGRAY_BRUSH : StockObjectType val GRAY_BRUSH : StockObjectType val HOLLOW_BRUSH : StockObjectType val LTGRAY_BRUSH : StockObjectType val NULL_BRUSH : StockObjectType val NULL_PEN : StockObjectType val OEM_FIXED_FONT : StockObjectType val SYSTEM_FIXED_FONT : StockObjectType val SYSTEM_FONT : StockObjectType val WHITE_BRUSH : StockObjectType val WHITE_PEN : StockObjectType val GetStockObject : StockObjectType -> HGDIOBJ eqtype DeviceItem val ASPECTX : DeviceItem val ASPECTXY : DeviceItem val ASPECTY : DeviceItem val BITSPIXEL : DeviceItem val CLIPCAPS : DeviceItem val COLORRES : DeviceItem val CURVECAPS : DeviceItem val DRIVERVERSION : DeviceItem val HORZRES : DeviceItem val HORZSIZE : DeviceItem val LINECAPS : DeviceItem val LOGPIXELSX : DeviceItem val LOGPIXELSY : DeviceItem val NUMBRUSHES : DeviceItem val NUMCOLORS : DeviceItem val NUMFONTS : DeviceItem val NUMMARKERS : DeviceItem val NUMPENS : DeviceItem val NUMRESERVED : DeviceItem val PDEVICESIZE : DeviceItem val PHYSICALHEIGHT : DeviceItem val PHYSICALOFFSETX : DeviceItem val PHYSICALOFFSETY : DeviceItem val PHYSICALWIDTH : DeviceItem val PLANES : DeviceItem val POLYGONALCAPS : DeviceItem val RASTERCAPS : DeviceItem val SCALINGFACTORX : DeviceItem val SCALINGFACTORY : DeviceItem val SIZEPALETTE : DeviceItem val TECHNOLOGY : DeviceItem val TEXTCAPS : DeviceItem val VERTRES : DeviceItem val VERTSIZE : DeviceItem val GetDeviceCaps : HDC * DeviceItem -> int (* Results of various calls to GetDeviceCaps. Perhaps its result type should be a union. *) val CC_CHORD : int val CC_CIRCLES : int val CC_ELLIPSES : int val CC_INTERIORS : int val CC_NONE : int val CC_PIE : int val CC_ROUNDRECT : int val CC_STYLED : int val CC_WIDE : int val CC_WIDESTYLED : int val CP_NONE : int val CP_RECTANGLE : int val CP_REGION : int val DT_CHARSTREAM : int val DT_DISPFILE : int val DT_METAFILE : int val DT_PLOTTER : int val DT_RASCAMERA : int val DT_RASDISPLAY : int val DT_RASPRINTER : int val LC_INTERIORS : int val LC_MARKER : int val LC_NONE : int val LC_POLYLINE : int val LC_POLYMARKER : int val LC_STYLED : int val LC_WIDE : int val LC_WIDESTYLED : int val PC_INTERIORS : int val PC_NONE : int val PC_PATHS : int val PC_POLYGON : int val PC_POLYPOLYGON : int val PC_RECTANGLE : int val PC_SCANLINE : int val PC_STYLED : int val PC_TRAPEZOID : int val PC_WIDE : int val PC_WIDESTYLED : int val PC_WINDPOLYGON : int val RC_BANDING : int val RC_BIGFONT : int val RC_BITBLT : int val RC_BITMAP64 : int val RC_DEVBITS : int val RC_DIBTODEV : int val RC_DI_BITMAP : int val RC_FLOODFILL : int val RC_GDI20_OUTPUT : int val RC_GDI20_STATE : int val RC_OP_DX_OUTPUT : int val RC_PALETTE : int val RC_SAVEBITMAP : int val RC_SCALING : int val RC_STRETCHBLT : int val RC_STRETCHDIB : int val TC_CP_STROKE : int val TC_CR_90 : int val TC_CR_ANY : int val TC_EA_DOUBLE : int val TC_IA_ABLE : int val TC_OP_CHARACTER : int val TC_OP_STROKE : int val TC_RA_ABLE : int val TC_RESERVED : int val TC_SA_CONTIN : int val TC_SA_DOUBLE : int val TC_SA_INTEGER : int val TC_SCROLLBLT : int val TC_SF_X_YINDEP : int val TC_SO_ABLE : int val TC_UA_ABLE : int val TC_VA_ABLE : int datatype DMColor = DMCOLOR_COLOR | DMCOLOR_MONOCHROME and DMDither = DMDITHER_COARSE | DMDITHER_FINE | DMDITHER_GRAYSCALE | DMDITHER_LINEART | DMDITHER_NONE | DMDITHER_OTHER of int and DMDuplex = DMDUP_HORIZONTAL | DMDUP_SIMPLEX | DMDUP_VERTICAL and DMICMIntent = DMICMINTENT_OTHER of int | DMICM_COLORMETRIC | DMICM_CONTRAST | DMICM_SATURATE and DMICMMethod = DMICMMETHOD_DEVICE | DMICMMETHOD_DRIVER | DMICMMETHOD_NONE | DMICMMETHOD_OTHER of int | DMICMMETHOD_SYSTEM and DMMedia = DMICMMEDIA_OTHER of int | DMMEDIA_GLOSSY | DMMEDIA_STANDARD | DMMEDIA_TRANSPARENCY and DMOrientation = DMORIENT_LANDSCAPE | DMORIENT_PORTRAIT and DMPaperSize = DMPAPER_10X11 | DMPAPER_10X14 | DMPAPER_11X17 | DMPAPER_15X11 | DMPAPER_9X11 | DMPAPER_A2 | DMPAPER_A3 | DMPAPER_A3_EXTRA | DMPAPER_A3_EXTRA_TRANSVERSE | DMPAPER_A3_TRANSVERSE | DMPAPER_A4 | DMPAPER_A4SMALL | DMPAPER_A4_EXTRA | DMPAPER_A4_PLUS | DMPAPER_A4_TRANSVERSE | DMPAPER_A5 | DMPAPER_A5_EXTRA | DMPAPER_A5_TRANSVERSE | DMPAPER_A_PLUS | DMPAPER_B4 | DMPAPER_B5 | DMPAPER_B5_EXTRA | DMPAPER_B5_TRANSVERSE | DMPAPER_B_PLUS | DMPAPER_CSHEET | DMPAPER_DSHEET | DMPAPER_ENV_10 | DMPAPER_ENV_11 | DMPAPER_ENV_12 | DMPAPER_ENV_14 | DMPAPER_ENV_9 | DMPAPER_ENV_B4 | DMPAPER_ENV_B5 | DMPAPER_ENV_B6 | DMPAPER_ENV_C3 | DMPAPER_ENV_C4 | DMPAPER_ENV_C5 | DMPAPER_ENV_C6 | DMPAPER_ENV_C65 | DMPAPER_ENV_DL | DMPAPER_ENV_INVITE | DMPAPER_ENV_ITALY | DMPAPER_ENV_MONARCH | DMPAPER_ENV_PERSONAL | DMPAPER_ESHEET | DMPAPER_EXECUTIVE | DMPAPER_FANFOLD_LGL_GERMAN | DMPAPER_FANFOLD_STD_GERMAN | DMPAPER_FANFOLD_US | DMPAPER_FOLIO | DMPAPER_ISO_B4 | DMPAPER_JAPANESE_POSTCARD | DMPAPER_LEDGER | DMPAPER_LEGAL | DMPAPER_LEGAL_EXTRA | DMPAPER_LETTER | DMPAPER_LETTERSMALL | DMPAPER_LETTER_EXTRA | DMPAPER_LETTER_EXTRA_TRANSVERSE | DMPAPER_LETTER_PLUS | DMPAPER_LETTER_TRANSVERSE | DMPAPER_NOTE | DMPAPER_OTHER of int | DMPAPER_QUARTO | DMPAPER_RESERVED_48 | DMPAPER_RESERVED_49 | DMPAPER_STATEMENT | DMPAPER_TABLOID | DMPAPER_TABLOID_EXTRA and DMResolution = DMRES_DPI of int | DMRES_DRAFT | DMRES_HIGH | DMRES_LOW | DMRES_MEDIUM and DMSource = DMBIN_AUTO | DMBIN_CASSETTE | DMBIN_ENVELOPE | DMBIN_ENVMANUAL | DMBIN_FORMSOURCE | DMBIN_LARGECAPACITY | DMBIN_LARGEFMT | DMBIN_LOWER | DMBIN_MANUAL | DMBIN_MIDDLE | DMBIN_ONLYONE | DMBIN_SMALLFMT | DMBIN_TRACTOR | DMBIN_UPPER | DMSOURCE_OTHER of int and DMTrueType = DMTT_BITMAP | DMTT_DOWNLOAD | DMTT_DOWNLOAD_OUTLINE | DMTT_SUBDEV type DEVMODE = { deviceName: string, driverVersion: int, orientation: DMOrientation option, paperSize: DMPaperSize option, paperLength: int option, paperWidth: int option, scale: int option, copies: int option, defaultSource: DMSource option, printQuality: DMResolution option, color: DMColor option, duplex: DMDuplex option, yResolution: int option, ttOption: DMTrueType option, collate: bool option, formName: string option, logPixels: int option, bitsPerPixel: int option, pelsWidth: int option, pelsHeight: int option, displayFlags: int option, (* Apparently no longer used. *) displayFrequency: int option, icmMethod: DMICMMethod option, icmIntent: DMICMIntent option, mediaType: DMMedia option, ditherType: DMDither option, panningWidth: int option, panningHeight: int option, driverPrivate: Word8Vector.vector } val CancelDC : HDC -> unit val CreateCompatibleDC : HDC -> HDC val CreateDC : string option * string option * string option * DEVMODE option -> HDC val DeleteDC : HDC -> unit val DeleteObject : HGDIOBJ -> unit datatype EnumObject = OBJ_BITMAP | OBJ_BRUSH | OBJ_DC | OBJ_ENHMETADC | OBJ_ENHMETAFILE | OBJ_EXTPEN | OBJ_FONT | OBJ_MEMDC | OBJ_METADC | OBJ_METAFILE | OBJ_PAL | OBJ_PEN | OBJ_REGION val GetCurrentObject : HDC * EnumObject -> HGDIOBJ val GetDC : HWND -> HDC datatype DeviceContextFlag = DCX_CACHE | DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS | DCX_EXCLUDERGN | DCX_EXCLUDEUPDATE | DCX_INTERSECTRGN | DCX_INTERSECTUPDATE | DCX_LOCKWINDOWUPDATE | DCX_NORECOMPUTE | DCX_NORESETATTRS | DCX_PARENTCLIP | DCX_VALIDATE | DCX_WINDOW val GetDCEx : HWND * HRGN * DeviceContextFlag list -> HDC val GetDCOrgEx : HDC -> POINT datatype GetObject = GO_Bitmap of BITMAP | GO_Brush of LOGBRUSH | GO_Font of LOGFONT | GO_Palette of int | GO_Pen of LOGPEN val GetObject : HGDIOBJ -> GetObject val GetObjectType : HGDIOBJ -> EnumObject val ReleaseDC : HWND * HDC -> bool val ResetDC : HDC * DEVMODE -> HDC val RestoreDC : HDC * int -> unit val SaveDC : HDC -> int val SelectObject : HDC * HGDIOBJ -> HGDIOBJ type DEVNAMES = {driver: string, device: string, output: string, default: bool} end = struct local open Foreign Base fun checkDC c = (checkResult(not(isHdcNull c)); c) in type HDC = HDC and HGDIOBJ = HGDIOBJ and HWND = HWND and HRGN = HRGN type LOGFONT = Font.LOGFONT open GdiBase DeviceBase type POINT = POINT datatype DeviceContextFlag = DCX_WINDOW | DCX_CACHE | DCX_NORESETATTRS | DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS | DCX_PARENTCLIP | DCX_EXCLUDERGN | DCX_INTERSECTRGN | DCX_EXCLUDEUPDATE | DCX_INTERSECTUPDATE | DCX_LOCKWINDOWUPDATE | DCX_NORECOMPUTE | DCX_VALIDATE local val tab = [ (DCX_WINDOW, 0wx00000001), (DCX_CACHE, 0wx00000002), (DCX_NORESETATTRS, 0wx00000004), (DCX_CLIPCHILDREN, 0wx00000008), (DCX_CLIPSIBLINGS, 0wx00000010), (DCX_PARENTCLIP, 0wx00000020), (DCX_EXCLUDERGN, 0wx00000040), (DCX_INTERSECTRGN, 0wx00000080), (DCX_EXCLUDEUPDATE, 0wx00000100), (DCX_INTERSECTUPDATE, 0wx00000200), (DCX_LOCKWINDOWUPDATE, 0wx00000400), (DCX_NORECOMPUTE, 0wx00100000), (DCX_VALIDATE, 0wx00200000)] in val DEVICECONTEXTFLAG = tableSetConversion(tab, NONE) end (* DEVNAMES is not actually used in this structure. *) type DEVNAMES = {driver: string, device: string, output: string, default: bool} datatype EnumObject = OBJ_PEN | OBJ_BRUSH | OBJ_DC | OBJ_METADC | OBJ_PAL | OBJ_FONT | OBJ_BITMAP | OBJ_REGION | OBJ_METAFILE | OBJ_MEMDC | OBJ_EXTPEN | OBJ_ENHMETADC | OBJ_ENHMETAFILE local val tab = [ (OBJ_PEN, 1), (OBJ_BRUSH, 2), (OBJ_DC, 3), (OBJ_METADC, 4), (OBJ_PAL, 5), (OBJ_FONT, 6), (OBJ_BITMAP, 7), (OBJ_REGION, 8), (OBJ_METAFILE, 9), (OBJ_MEMDC, 10), (OBJ_EXTPEN, 11), (OBJ_ENHMETADC, 12), (OBJ_ENHMETAFILE, 13) ] datatype EnumObject = W of int (* GetObjectType returns 0 in the event of an error. *) fun toInt _ = raise Match fun fromInt i = (checkResult(i <> 0); raise Match); in val ENUMOBJECT = tableConversion(tab, SOME(fromInt, toInt)) cUint end local datatype DeviceItem = W of int in type DeviceItem = DeviceItem val DEVICEITEM = absConversion {abs = W, rep = fn W n => n} cInt val DRIVERVERSION = W (0 (* Device driver version *)) val TECHNOLOGY = W (2 (* Device classification *)) val HORZSIZE = W (4 (* Horizontal size in millimeters *)) val VERTSIZE = W (6 (* Vertical size in millimeters *)) val HORZRES = W (8 (* Horizontal width in pixels *)) val VERTRES = W (10 (* Vertical width in pixels *)) val BITSPIXEL = W (12 (* Number of bits per pixel *)) val PLANES = W (14 (* Number of planes *)) val NUMBRUSHES = W (16 (* Number of brushes the device has *)) val NUMPENS = W (18 (* Number of pens the device has *)) val NUMMARKERS = W (20 (* Number of markers the device has *)) val NUMFONTS = W (22 (* Number of fonts the device has *)) val NUMCOLORS = W (24 (* Number of colors the device supports *)) val PDEVICESIZE = W (26 (* Size required for device descriptor *)) val CURVECAPS = W (28 (* Curve capabilities *)) val LINECAPS = W (30 (* Line capabilities *)) val POLYGONALCAPS = W (32 (* Polygonal capabilities *)) val TEXTCAPS = W (34 (* Text capabilities *)) val CLIPCAPS = W (36 (* Clipping capabilities *)) val RASTERCAPS = W (38 (* Bitblt capabilities *)) val ASPECTX = W (40 (* Length of the X leg *)) val ASPECTY = W (42 (* Length of the Y leg *)) val ASPECTXY = W (44 (* Length of the hypotenuse *)) val LOGPIXELSX = W (88 (* Logical pixels/inch in X *)) val LOGPIXELSY = W (90 (* Logical pixels/inch in Y *)) val SIZEPALETTE = W (104 (* Number of entries in physical palette *)) val NUMRESERVED = W (106 (* Number of reserved entries in palette *)) val COLORRES = W (108 (* Actual color resolution *)) val PHYSICALWIDTH = W (110 (* Physical Width in device units *)) val PHYSICALHEIGHT = W (111 (* Physical Height in device units *)) val PHYSICALOFFSETX = W (112 (* Physical Printable Area x margin *)) val PHYSICALOFFSETY = W (113 (* Physical Printable Area y margin *)) val SCALINGFACTORX = W (114 (* Scaling factor x *)) val SCALINGFACTORY = W (115 (* Scaling factor y *)) end (* Results of GetDeviceCaps. Since it returns an int all these are simply ints. *) val DT_PLOTTER = 0 (* Vector plotter *) val DT_RASDISPLAY = 1 (* Raster display *) val DT_RASPRINTER = 2 (* Raster printer *) val DT_RASCAMERA = 3 (* Raster camera *) val DT_CHARSTREAM = 4 (* Character-stream, PLP *) val DT_METAFILE = 5 (* Metafile, VDM *) val DT_DISPFILE = 6 (* Display-file *) (* Curve Capabilities *) val CC_NONE = 0 (* Curves not supported *) val CC_CIRCLES = 1 (* Can do circles *) val CC_PIE = 2 (* Can do pie wedges *) val CC_CHORD = 4 (* Can do chord arcs *) val CC_ELLIPSES = 8 (* Can do ellipese *) val CC_WIDE = 16 (* Can do wide lines *) val CC_STYLED = 32 (* Can do styled lines *) val CC_WIDESTYLED = 64 (* Can do wide styled lines *) val CC_INTERIORS = 128 (* Can do interiors *) val CC_ROUNDRECT = 256 (* *) (* Line Capabilities *) val LC_NONE = 0 (* Lines not supported *) val LC_POLYLINE = 2 (* Can do polylines *) val LC_MARKER = 4 (* Can do markers *) val LC_POLYMARKER = 8 (* Can do polymarkers *) val LC_WIDE = 16 (* Can do wide lines *) val LC_STYLED = 32 (* Can do styled lines *) val LC_WIDESTYLED = 64 (* Can do wide styled lines *) val LC_INTERIORS = 128 (* Can do interiors *) (* Polygonal Capabilities *) val PC_NONE = 0 (* Polygonals not supported *) val PC_POLYGON = 1 (* Can do polygons *) val PC_RECTANGLE = 2 (* Can do rectangles *) val PC_WINDPOLYGON = 4 (* Can do winding polygons *) val PC_TRAPEZOID = 4 (* Can do trapezoids *) val PC_SCANLINE = 8 (* Can do scanlines *) val PC_WIDE = 16 (* Can do wide borders *) val PC_STYLED = 32 (* Can do styled borders *) val PC_WIDESTYLED = 64 (* Can do wide styled borders *) val PC_INTERIORS = 128 (* Can do interiors *) val PC_POLYPOLYGON = 256 (* Can do polypolygons *) val PC_PATHS = 512 (* Can do paths *) (* Clipping Capabilities *) val CP_NONE = 0 (* No clipping of output *) val CP_RECTANGLE = 1 (* Output clipped to rects *) val CP_REGION = 2 (* obsolete *) (* Text Capabilities *) val TC_OP_CHARACTER = 0x00000001 (* Can do OutputPrecision CHARACTER *) val TC_OP_STROKE = 0x00000002 (* Can do OutputPrecision STROKE *) val TC_CP_STROKE = 0x00000004 (* Can do ClipPrecision STROKE *) val TC_CR_90 = 0x00000008 (* Can do CharRotAbility 90 *) val TC_CR_ANY = 0x00000010 (* Can do CharRotAbility ANY *) val TC_SF_X_YINDEP = 0x00000020 (* Can do ScaleFreedom X_YINDEPENDENT *) val TC_SA_DOUBLE = 0x00000040 (* Can do ScaleAbility DOUBLE *) val TC_SA_INTEGER = 0x00000080 (* Can do ScaleAbility INTEGER *) val TC_SA_CONTIN = 0x00000100 (* Can do ScaleAbility CONTINUOUS *) val TC_EA_DOUBLE = 0x00000200 (* Can do EmboldenAbility DOUBLE *) val TC_IA_ABLE = 0x00000400 (* Can do ItalisizeAbility ABLE *) val TC_UA_ABLE = 0x00000800 (* Can do UnderlineAbility ABLE *) val TC_SO_ABLE = 0x00001000 (* Can do StrikeOutAbility ABLE *) val TC_RA_ABLE = 0x00002000 (* Can do RasterFontAble ABLE *) val TC_VA_ABLE = 0x00004000 (* Can do VectorFontAble ABLE *) val TC_RESERVED = 0x00008000 val TC_SCROLLBLT = 0x00010000 (* Don't do text scroll with blt *) (* Raster Capabilities *) val RC_BITBLT = 1 (* Can do standard BLT. *) val RC_BANDING = 2 (* Device requires banding support *) val RC_SCALING = 4 (* Device requires scaling support *) val RC_BITMAP64 = 8 (* Device can support >64K bitmap *) val RC_GDI20_OUTPUT = 0x0010 (* has 2.0 output calls *) val RC_GDI20_STATE = 0x0020 val RC_SAVEBITMAP = 0x0040 val RC_DI_BITMAP = 0x0080 (* supports DIB to memory *) val RC_PALETTE = 0x0100 (* supports a palette *) val RC_DIBTODEV = 0x0200 (* supports DIBitsToDevice *) val RC_BIGFONT = 0x0400 (* supports >64K fonts *) val RC_STRETCHBLT = 0x0800 (* supports StretchBlt *) val RC_FLOODFILL = 0x1000 (* supports FloodFill *) val RC_STRETCHDIB = 0x2000 (* supports StretchDIBits *) val RC_OP_DX_OUTPUT = 0x4000 val RC_DEVBITS = 0x8000 local datatype StockObjectType = W of int in type StockObjectType = StockObjectType val STOCKOBJECTTYPE = absConversion {abs = W, rep = fn W n => n} cInt val WHITE_BRUSH = W (0) val LTGRAY_BRUSH = W (1) val GRAY_BRUSH = W (2) val DKGRAY_BRUSH = W (3) val BLACK_BRUSH = W (4) val NULL_BRUSH = W (5) val HOLLOW_BRUSH = NULL_BRUSH val WHITE_PEN = W (6) val BLACK_PEN = W (7) val NULL_PEN = W (8) val OEM_FIXED_FONT = W (10) val ANSI_FIXED_FONT = W (11) val ANSI_VAR_FONT = W (12) val SYSTEM_FONT = W (13) val DEVICE_DEFAULT_FONT = W (14) val DEFAULT_PALETTE = W (15) val SYSTEM_FIXED_FONT = W (16) (*val STOCK_LAST = W (16)*) val CLR_INVALID = W (0xFFFFFFFF) end val CancelDC = winCall1(gdi "CancelDC") (cHDC) (successState "CancelDC") val CreateCompatibleDC = winCall1(gdi "CreateCompatibleDC") (cHDC) cHDC val DeleteDC = winCall1(gdi "DeleteDC") (cHDC) (successState "DeleteDC") val DeleteObject = winCall1(gdi "DeleteObject") (cHGDIOBJ) (successState "DeleteObject") val GetCurrentObject = winCall2(gdi "GetCurrentObject") (cHDC,ENUMOBJECT) cHGDIOBJ val GetDC = checkDC o winCall1(user "GetDC") (cHWND) cHDC val GetDCEx = checkDC o winCall3(user "GetDCEx") (cHWND,cHRGN,DEVICECONTEXTFLAG) cHDC local val getDCOrgEx = winCall2(gdi "GetDCOrgEx") (cHDC, cStar cPoint) (successState "GetDCOrgEx") in fun GetDCOrgEx hdc = let val v = ref {x=0, y=0} in getDCOrgEx(hdc, v); !v end end val GetDeviceCaps = winCall2(gdi "GetDeviceCaps") (cHDC,DEVICEITEM) cInt val GetObjectType = winCall1(gdi "GetObjectType") (cHGDIOBJ) ENUMOBJECT val GetStockObject = winCall1 (gdi "GetStockObject") (STOCKOBJECTTYPE) cHGDIOBJ val ReleaseDC = winCall2(user "ReleaseDC") (cHWND,cHDC) cBool val RestoreDC = winCall2(gdi "RestoreDC") (cHDC,cInt) (successState "RestoreDC") val SaveDC = winCall1(gdi "SaveDC") (cHDC) cInt val ResetDC = winCall2 (gdi "ResetDC") (cHDC, LPDEVMODE) cHDC (* The result of SelectObject is a bit of a mess. It is the original object being replaced except if the argument is a region when it returns a RESULTREGION. Perhaps we need a different function for that. *) val SelectObject = winCall2(gdi "SelectObject") (cHDC,cHGDIOBJ) cHGDIOBJ val CreateDC = winCall4 (gdi "CreateDCA") (STRINGOPT, STRINGOPT, STRINGOPT, cOptionPtr LPDEVMODE) cHDC (* GetObject returns information about different kinds of GDI object. It takes a pointer to a structure whose size and format differ according to the type of object. To implement this properly in ML we have to find out the type before we start. *) datatype GetObject = GO_Bitmap of BITMAP (*| GO_DIBSection of DIBSECTION*) (* This is a subset of BITMAP *) (*| GO_ExPen of EXTLOGPEN*) | GO_Brush of LOGBRUSH | GO_Font of LOGFONT | GO_Pen of LOGPEN | GO_Palette of int local val getObj = winCall3 (gdi "GetObjectA") (cHGDIOBJ, cInt, cPointer) cInt val {load=fromCBM, ...} = breakConversion cBITMAP val {load=fromCLF, ...} = breakConversion FontBase.cLOGFONT val {load=fromCLB, ...} = breakConversion cLOGBRUSH val {load=fromCLP, ...} = breakConversion cLOGPEN val {load=fromCshort, ...} = breakConversion cShort in fun GetObject(hgdi: HGDIOBJ): GetObject = let (* Call with a NULL buffer to find out the memory required. Also checks the GDI object. *) open Memory val space = getObj(hgdi, 0, Memory.null) val _ = checkResult(space > 0); val mem = malloc (Word.fromInt space) val _ = getObj(hgdi, space, mem) handle ex => (free mem; raise ex) in (case GetObjectType hgdi of OBJ_PEN => GO_Pen(fromCLP mem) | OBJ_BRUSH => GO_Brush(fromCLB mem) | OBJ_BITMAP => GO_Bitmap(fromCBM mem) | OBJ_FONT => GO_Font(fromCLF mem) (*| OBJ_EXPEN => *) (* TODO!!*) | OBJ_PAL => GO_Palette(fromCshort mem) (* Number of entries. *) | _ => raise Fail "Different type") before free mem end end (* Other Device context functions: ChangeDisplaySettings ChangeDisplaySettingsEx CreateIC DeviceCapabilities DrawEscape EnumDisplayDevices EnumDisplaySettings EnumObjects EnumObjectsProc GetDCBrushColor - NT 5.0 and Win 98 only GetDCPenColor - NT 5.0 and Win 98 only SetDCBrushColor - NT 5.0 and Win 98 only SetDCPenColor - NT 5.0 and Win 98 only *) end end; polyml-5.6/mlsource/extra/Win/Dialog.sml000066400000000000000000000557101265146633400203470ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Dialogue boxes and operations on them. *) structure Dialog: sig type HWND and HINSTANCE datatype DLGCLASSES = DLG_CLASS of string * Window.Style.flags | DLG_BUTTON of Button.Style.flags | DLG_COMBOBOX of Combobox.Style.flags | DLG_EDIT of Edit.Style.flags | DLG_LISTBOX of Listbox.Style.flags | DLG_SCROLLBAR of Scrollbar.Style.flags | DLG_STATIC of Static.Style.flags datatype DLGTITLE = DLG_TITLERESOURCE of int | DLG_TITLESTRING of string structure Style: sig include BIT_FLAGS val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and DS_3DLOOK: flags and DS_ABSALIGN: flags and DS_CENTER: flags and DS_CENTERMOUSE: flags and DS_CONTEXTHELP: flags and DS_CONTROL: flags and DS_FIXEDSYS: flags and DS_LOCALEDIT: flags and DS_MODALFRAME: flags and DS_NOFAILCREATE: flags and DS_NOIDLEMSG: flags and DS_SETFONT: flags and DS_SETFOREGROUND: flags and DS_SYSMODAL: flags end type DLGITEMTEMPLATE = { extendedStyle: int, x: int, y: int, cx : int, cy: int, id: int, class: DLGCLASSES, title: DLGTITLE, creationData: Word8Vector.vector option } type DLGTEMPLATE = { style: Style.flags, extendedStyle: int, x : int, y: int, cx: int, cy: int, menu: Resource.RESID option, class: Resource.RESID option, title: string, font: (int * string) option, items: DLGITEMTEMPLATE list } val DialogBox : HINSTANCE * Resource.RESID * HWND * (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> int val DialogBoxIndirect: HINSTANCE * DLGTEMPLATE * HWND * (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> int val CreateDialog : HINSTANCE * Resource.RESID * HWND * (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> HWND val CreateDialogIndirect: HINSTANCE * DLGTEMPLATE * HWND * (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> HWND val GetDialogBaseUnits : unit -> {horizontal: int, vertical: int} val GetDlgCtrlID: HWND -> int and GetDlgItem: HWND * int -> HWND and GetDlgItemText: HWND * int -> string and IsDialogMessage: HWND * Message.MSG -> bool and EndDialog: HWND * int -> unit (* MessageBox and MessageBeep are in the MessageBox structure. *) (* CreateDialogIndirectParam CreateDialogParam DefDlgProc - Used to create custom dialogues DialogBoxIndirectParam DialogBoxParam DialogProc GetDlgItemInt - Ignore - probably better done with Int.toString SetDlgItemInt - ditto GetNextDlgGroupItem GetNextDlgTabItem MapDialogRect MessageBoxEx SendDlgItemMessage SetDlgItemText MessageBoxIndirect *) val compileTemplate : DLGTEMPLATE -> Word8Vector.vector val decompileTemplate : Word8Vector.vector -> DLGTEMPLATE end = struct local open Foreign open Base open Globals open Window open Resource fun checkWindow c = (checkResult(not(isHNull c)); c) (* Dialogue procedures never call DefWindowProc. *) fun dlgProcRes (lres, state) = (lres, state) in type HWND = HWND and HINSTANCE = HINSTANCE datatype DLGCLASSES = DLG_CLASS of string * Window.Style.flags (* Named window class. *) | DLG_BUTTON of Button.Style.flags | DLG_EDIT of Edit.Style.flags | DLG_STATIC of Static.Style.flags | DLG_LISTBOX of Listbox.Style.flags | DLG_SCROLLBAR of Scrollbar.Style.flags | DLG_COMBOBOX of Combobox.Style.flags datatype DLGTITLE = DLG_TITLESTRING of string | DLG_TITLERESOURCE of int structure Style = struct open Window.Style (* Include all the windows styles. *) val DS_ABSALIGN: flags = fromWord 0wx0001 val DS_SYSMODAL: flags = fromWord 0wx0002 val DS_LOCALEDIT: flags = fromWord 0wx0020 val DS_SETFONT: flags = fromWord 0wx0040 val DS_MODALFRAME: flags = fromWord 0wx0080 val DS_NOIDLEMSG: flags = fromWord 0wx0100 val DS_SETFOREGROUND: flags = fromWord 0wx0200 val DS_3DLOOK: flags = fromWord 0wx0004 val DS_FIXEDSYS: flags = fromWord 0wx0008 val DS_NOFAILCREATE: flags = fromWord 0wx0010 val DS_CONTROL: flags = fromWord 0wx0400 val DS_CENTER: flags = fromWord 0wx0800 val DS_CENTERMOUSE: flags = fromWord 0wx1000 val DS_CONTEXTHELP: flags = fromWord 0wx2000 val all = flags[Window.Style.all, DS_ABSALIGN, DS_SYSMODAL, DS_LOCALEDIT, DS_SETFONT, DS_MODALFRAME, DS_NOIDLEMSG, DS_SETFOREGROUND, DS_3DLOOK, DS_FIXEDSYS, DS_NOFAILCREATE, DS_CONTROL, DS_CENTER, DS_CENTERMOUSE, DS_CONTEXTHELP] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end type DLGITEMTEMPLATE = { extendedStyle: int, x: int, y: int, cx : int, cy: int, id: int, class: DLGCLASSES, title: DLGTITLE, creationData: Word8Vector.vector option } type DLGTEMPLATE = { style: Style.flags, extendedStyle: int, x : int, y: int, cx: int, cy: int, menu: Resource.RESID option, class: Resource.RESID option, title: string, font: (int * string) option, items: DLGITEMTEMPLATE list } (* Convert between the data structures and the templates. *) (* TODO: This only deals with the basic templates not the extended versions. *) fun decompileTemplate (w: Word8Vector.vector): DLGTEMPLATE = let val ptr = ref 0 val isExtended = PackWord32Little.subVec(w, 0) = 0wxFFFF0001 val _ = if isExtended then raise Fail "Extended templates not implemented" else (); val style = PackWord32Little.subVec(w, !ptr div 4) val _ = ptr := !ptr + 4; val exStyle = LargeWord.toInt(PackWord32Little.subVec(w, !ptr div 4)) val _ = ptr := !ptr + 4; val cdit = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val x = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val y = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val cx = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val cy = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; (* Extract a null-terminated Unicode string and advance ptr beyond it. *) fun getString () = let val start = !ptr fun advance () = let val next = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) in ptr := !ptr + 2; if next = 0 then () else advance() end in advance(); unicodeToString(Word8VectorSlice.vector(Word8VectorSlice.slice(w, start, SOME(!ptr-start-2)))) end fun ffffOrString(): Resource.RESID = let val next = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) in if next = 0xffff then ( (* Resource identifier. *) ptr := !ptr + 4; Resource.IdAsInt(LargeWord.toInt(PackWord16Little.subVec(w, (!ptr-2) div 2))) ) else (* Resource name. *) Resource.IdAsString(getString()) end (* Menu. *) val menu = case ffffOrString() of Resource.IdAsString "" => NONE | r => SOME r (* Class. *) val class = case ffffOrString() of Resource.IdAsString "" => NONE | r => SOME r (* Title - null terminated Unicode string. *) val title = getString() (* Font - only if DS_SETFONT included in the style. *) val font = if Style.anySet(Style.fromWord style, Style.DS_SETFONT) then let val size = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2 val name = getString() in SOME(size, name) end else NONE (* Items. *) fun processItem _ : DLGITEMTEMPLATE = let (* Must be aligned onto a DWORD boundary. *) val _ = while !ptr mod 4 <> 0 do ptr := !ptr + 1; val style = PackWord32Little.subVec(w, !ptr div 4) val _ = ptr := !ptr + 4; val exStyle = LargeWord.toInt(PackWord32Little.subVec(w, !ptr div 4)) val _ = ptr := !ptr + 4; val x = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val y = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val cx = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val cy = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val id = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val class = case ffffOrString() of Resource.IdAsString s => DLG_CLASS (s, Window.Style.fromWord style) | Resource.IdAsInt 0x0080 => DLG_BUTTON (Button.Style.fromWord style) | Resource.IdAsInt 0x0081 => DLG_EDIT (Edit.Style.fromWord style) | Resource.IdAsInt 0x0082 => DLG_STATIC (Static.Style.fromWord style) | Resource.IdAsInt 0x0083 => DLG_LISTBOX (Listbox.Style.fromWord style) | Resource.IdAsInt 0x0084 => DLG_SCROLLBAR (Scrollbar.Style.fromWord style) | Resource.IdAsInt 0x0085 => DLG_COMBOBOX (Combobox.Style.fromWord style) | _ => raise Fail "Unknown dialog type" val title = case ffffOrString() of Resource.IdAsString s => DLG_TITLESTRING s | Resource.IdAsInt i => DLG_TITLERESOURCE i val creation = let val length = LargeWord.toInt(PackWord16Little.subVec(w, !ptr div 2)) val _ = ptr := !ptr + 2; val start = !ptr val _ = ptr := !ptr + length in if length = 0 then NONE else SOME(Word8VectorSlice.vector(Word8VectorSlice.slice(w, start, SOME length))) end in { extendedStyle = exStyle, x = x, y = y, cx = cx, cy = cy, id = id, class = class, title = title, creationData = creation } end in { style = Style.fromWord style, extendedStyle = exStyle, x = x, y = y, cx = cx, cy = cy, menu = menu, class = class, title = title, font = font, items = List.tabulate(cdit, processItem) } end; (* Generate a dialogue template in memory. *) fun compileTemplate (t: DLGTEMPLATE) = let val basis = Word8Array.array (18, 0w0) val nullString = Word8Vector.tabulate(2, fn _ => 0w0) (* Force DS_SETFONT in the style according to whether we have a font specified. *) val style = if #font t = NONE then Style.clear(Style.DS_SETFONT, #style t) else Style.flags[#style t, Style.DS_SETFONT] val _ = PackWord32Little.update(basis, 0, Style.toWord style); val _ = PackWord32Little.update(basis, 1, LargeWord.fromInt(#extendedStyle t)); val _ = PackWord16Little.update(basis, 4, LargeWord.fromInt(List.length(#items t))); val _ = PackWord16Little.update(basis, 5, LargeWord.fromInt(#x t)); val _ = PackWord16Little.update(basis, 6, LargeWord.fromInt(#y t)); val _ = PackWord16Little.update(basis, 7, LargeWord.fromInt(#cx t)); val _ = PackWord16Little.update(basis, 8, LargeWord.fromInt(#cy t)); fun unicodeString s = Word8Vector.concat[stringToUnicode s, nullString] fun resOrString (Resource.IdAsString s) = unicodeString s | resOrString (Resource.IdAsInt i) = Word8Vector.fromList [0wxff, 0wxff, Word8.fromInt i, Word8.fromInt(i div 256)] val menu = case #menu t of NONE => nullString | SOME r => resOrString r val class = case #class t of NONE => nullString | SOME r => resOrString r val title = unicodeString(#title t) val font = case #font t of SOME (size, name) => [Word8Vector.fromList [Word8.fromInt size, Word8.fromInt(size div 256)], stringToUnicode name, nullString] | NONE => [] fun compileItems [] = [] | compileItems((t: DLGITEMTEMPLATE) :: rest) = let val basis = Word8Array.array(18, 0w0) val (style, class) = case #class t of DLG_CLASS(c, s) => (Window.Style.toWord s, Resource.IdAsString c) | DLG_BUTTON s => (Button.Style.toWord s, Resource.IdAsInt 0x80) | DLG_COMBOBOX s => (Combobox.Style.toWord s, Resource.IdAsInt 0x85) | DLG_EDIT s => (Edit.Style.toWord s, Resource.IdAsInt 0x81) | DLG_LISTBOX s => (Listbox.Style.toWord s, Resource.IdAsInt 0x83) | DLG_SCROLLBAR s => (Scrollbar.Style.toWord s, Resource.IdAsInt 0x84) | DLG_STATIC s => (Static.Style.toWord s, Resource.IdAsInt 0x82) val _ = PackWord32Little.update(basis, 0, style); val _ = PackWord32Little.update(basis, 1, LargeWord.fromInt(#extendedStyle t)); val _ = PackWord16Little.update(basis, 4, LargeWord.fromInt(#x t)); val _ = PackWord16Little.update(basis, 5, LargeWord.fromInt(#y t)); val _ = PackWord16Little.update(basis, 6, LargeWord.fromInt(#cx t)); val _ = PackWord16Little.update(basis, 7, LargeWord.fromInt(#cy t)); val _ = PackWord16Little.update(basis, 8, LargeWord.fromInt(#id t)); val title = resOrString( case #title t of DLG_TITLESTRING s => Resource.IdAsString s | DLG_TITLERESOURCE i => Resource.IdAsInt i) val creation = case #creationData t of NONE => [nullString] | SOME r => [r, nullString] val vec = Word8Vector.concat (Word8ArraySlice.vector(Word8ArraySlice.full basis) :: resOrString class :: title :: creation) val rounding = Word8Vector.length vec mod 4 in (* Must align onto a 4-byte boundary except for the last. *) (if rounding = 0 orelse rest = nil then vec else Word8Vector.concat[vec, Word8Vector.tabulate(4-rounding, fn _ => 0w0)]) :: compileItems rest end val header = Word8Vector.concat (Word8ArraySlice.vector(Word8ArraySlice.full basis) :: menu :: class :: title :: font) val rounding = Word8Vector.length header mod 4 val alignment = Word8Vector.tabulate(4-rounding, fn _ => 0w0) in Word8Vector.concat(header :: alignment :: compileItems (#items t)) end (* CreateDialogIndirect: Create a modeless dialogue using a resource. *) local val sysCreateDialog = winCall5 (user "CreateDialogParamA") (cHINSTANCE, cRESID, cHWND, cFunction, cLPARAM) cHWND in fun CreateDialog (hInst, lpTemplate, hWndParent, dialogueProc, init) = let val _ = Message.setCallback(dlgProcRes o dialogueProc, init); val res = checkWindow (sysCreateDialog(hInst, lpTemplate, hWndParent, Message.mainWinProc, 0)) in (* Add this to the modeless dialogue list so that keyboard operations will work. *) Message.addModelessDialogue(res, NONE); res end end (* CreateDialogIndirect: Create a modeless dialogue from a template. *) local val sysCreateDialogIndirect = winCall5 (user "CreateDialogIndirectParamA") (cHINSTANCE, cPointer, cHWND, cFunction, cLPARAM) cHWND in fun CreateDialogIndirect (hInst, template, hWndParent, dialogueProc, init) = let val _ = Message.setCallback(dlgProcRes o dialogueProc, init); (* Compile the template and copy it to C memory. *) val compiled = compileTemplate template val size = Word8Vector.length compiled open Memory val templ = malloc (Word.fromInt size) fun copyToBuf(i, v) = set8(templ, Word.fromInt i, v) val () = Word8Vector.appi copyToBuf compiled val res = checkWindow (sysCreateDialogIndirect(hInst, templ, hWndParent, Message.mainWinProc, 0)) val () = free templ in (* Add this to the modeless dialogue list so that keyboard operations will work. *) Message.addModelessDialogue(res, NONE); res end end (* DialogBox: create a dialogue using a resource. *) local val sysDialogBox = winCall5 (user "DialogBoxParamA") (cHINSTANCE, cRESID, cHWND, cFunction, cLPARAM) cINT_PTR in fun DialogBox (hInst, lpTemplate, hWndParent, dialogueProc, init) = let (* We can use the normal window procedure as a dialogue proc. *) val _ = Message.setCallback(dlgProcRes o dialogueProc, init); val result = sysDialogBox(hInst, lpTemplate, hWndParent, Message.mainWinProc, 0) in (* How do we remove the callback? Look for the last message? *) result end end (* DialogBoxIndirect: create a dialogue using a template. *) local val sysDialogBoxIndirect = winCall5 (user "DialogBoxIndirectParamA") (cHINSTANCE, cPointer, cHWND, cFunction, cLPARAM) cINT_PTR in fun DialogBoxIndirect (hInst, template, hWndParent, dialogueProc, init) = let val _ = Message.setCallback(dlgProcRes o dialogueProc, init); (* Compile the template and copy it to C memory. *) val compiled = compileTemplate template val size = Word8Vector.length compiled open Memory val templ = malloc (Word.fromInt size) fun copyToBuf(i, v) = set8(templ, Word.fromInt i, v) val _ = Word8Vector.appi copyToBuf compiled in sysDialogBoxIndirect(hInst, templ, hWndParent, Message.mainWinProc, 0) before free templ end end (* Get average size of system font. *) local val getDialogBaseUnits = winCall0 (user "GetDialogBaseUnits") () cDWORDw (* Actually LONG *) in fun GetDialogBaseUnits() : {horizontal: int, vertical: int} = let val base = getDialogBaseUnits () in {horizontal = Word.toInt(LOWORD base), vertical = Word.toInt(HIWORD base)} end end val GetDlgCtrlID = winCall1 (user "GetDlgCtrlID") cHWND cInt and GetDlgItem = winCall2 (user "GetDlgItem") (cHWND, cInt) cHWND val GetDlgItemText = Window.GetWindowText o GetDlgItem val IsDialogMessage = winCall2 (user "IsDialogMessage") (cHWND, Message.LPMSG) cBool val EndDialog = winCall2 (user "EndDialog") (cHWND, cINT_PTR) (successState "EndDialog") end end; polyml-5.6/mlsource/extra/Win/DragDrop.sml000066400000000000000000000053751265146633400206540ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure DragDrop: sig type HDROP type HWND (* = Window.HWND *) type POINT = { x: int, y: int } val DragAcceptFiles : HWND * bool -> unit val DragFinish : HDROP -> unit val DragQueryFile : HDROP -> string list val DragQueryPoint : HDROP -> POINT * bool end = struct local open Foreign Base in type HDROP = HDROP and HWND = HWND type POINT = POINT (* Call DragAcceptFiles to accept files. *) val DragAcceptFiles = winCall2 (shell "DragAcceptFiles") (cHWND,cBool) cVoid (* Call DragFinish when finished processing a WM_DROP message. *) and DragFinish = winCall1 (shell "DragFinish") (cHDROP) cVoid (* Call DragQueryFile to get the file(s). *) local val dragQueryFile = winCall4 (shell "DragQueryFileA") (cHDROP,cUint,cPointer,cUint) cUint in fun DragQueryFile (hd: HDROP): string list = let val nfiles = dragQueryFile(hd, ~1, Memory.null, 0) fun getFile n = let val buffsize = dragQueryFile(hd, n, Memory.null, 0) + 1 (* Must add one for NULL *) open Memory val buff = malloc(Word.fromInt buffsize) val _ = dragQueryFile(hd, n, buff, buffsize) handle ex => (free buff; raise ex) in fromCstring buff before free buff end in List.tabulate(nfiles, getFile) end end (* Call DragQueryPoint to find out where to drop the file(s). *) local val dragQueryPoint = winCall2 (shell "DragQueryPoint") (cHDROP, cStar cPoint) cBool in fun DragQueryPoint (hd: HDROP): POINT * bool = let val r = ref {x=0, y=0} val res = dragQueryPoint(hd, r) in (!r, res) end end end end; polyml-5.6/mlsource/extra/Win/Edit.sml000066400000000000000000000145721265146633400200360ustar00rootroot00000000000000(* Copyright (c) 2001 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Edit windows. *) structure Edit: sig structure Style: sig (* We use the same type so we can use this everywhere we can use the general window style. *) include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and ES_LEFT: flags and ES_CENTER:flags and ES_RIGHT:flags and ES_MULTILINE:flags and ES_UPPERCASE: flags and ES_LOWERCASE: flags and ES_PASSWORD: flags and ES_AUTOVSCROLL: flags and ES_AUTOHSCROLL: flags and ES_NOHIDESEL: flags and ES_OEMCONVERT: flags and ES_READONLY: flags and ES_WANTRETURN: flags and ES_NUMBER: flags end structure Notifications: sig val EN_SETFOCUS: int val EN_KILLFOCUS: int val EN_CHANGE: int val EN_UPDATE: int val EN_ERRSPACE: int val EN_MAXTEXT: int val EN_HSCROLL: int val EN_VSCROLL: int end end = struct structure Style = struct open Window.Style (* Include all the windows styles. *) val ES_LEFT: flags = fromWord 0wx0000 val ES_CENTER: flags = fromWord 0wx0001 val ES_RIGHT: flags = fromWord 0wx0002 val ES_MULTILINE: flags = fromWord 0wx0004 val ES_UPPERCASE: flags = fromWord 0wx0008 val ES_LOWERCASE: flags = fromWord 0wx0010 val ES_PASSWORD: flags = fromWord 0wx0020 val ES_AUTOVSCROLL: flags = fromWord 0wx0040 val ES_AUTOHSCROLL: flags = fromWord 0wx0080 val ES_NOHIDESEL: flags = fromWord 0wx0100 val ES_OEMCONVERT: flags = fromWord 0wx0400 val ES_READONLY: flags = fromWord 0wx0800 val ES_WANTRETURN: flags = fromWord 0wx1000 val ES_NUMBER: flags = fromWord 0wx2000 val all = flags[Window.Style.all, ES_LEFT, ES_CENTER, ES_RIGHT, ES_MULTILINE, ES_UPPERCASE, ES_LOWERCASE, ES_PASSWORD, ES_AUTOVSCROLL, ES_AUTOHSCROLL, ES_NOHIDESEL, ES_OEMCONVERT, ES_READONLY, ES_WANTRETURN, ES_NUMBER] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure Notifications = struct val EN_SETFOCUS = 0x0100 val EN_KILLFOCUS = 0x0200 val EN_CHANGE = 0x0300 val EN_UPDATE = 0x0400 val EN_ERRSPACE = 0x0500 val EN_MAXTEXT = 0x0501 val EN_HSCROLL = 0x0601 val EN_VSCROLL = 0x0602 end end; (* let open Edit.Style val flagTable = [(ES_CENTER, "ES_CENTER"), (ES_RIGHT, "ES_RIGHT"), (ES_MULTILINE, "ES_MULTILINE"), (ES_UPPERCASE, "ES_UPPERCASE"), (ES_LOWERCASE, "ES_LOWERCASE"), (ES_PASSWORD, "ES_PASSWORD"), (ES_AUTOVSCROLL, "ES_AUTOVSCROLL"), (ES_AUTOHSCROLL, "ES_AUTOHSCROLL"), (ES_NOHIDESEL, "ES_NOHIDESEL"), (ES_OEMCONVERT, "ES_OEMCONVERT"), (ES_READONLY, "ES_READONLY"), (ES_WANTRETURN, "ES_WANTRETURN"), (ES_NUMBER, "ES_NUMBER"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *)polyml-5.6/mlsource/extra/Win/Examples/000077500000000000000000000000001265146633400202015ustar00rootroot00000000000000polyml-5.6/mlsource/extra/Win/Examples/bitViewer.sml000066400000000000000000000261231265146633400226620ustar00rootroot00000000000000(* Copyright (c) 2001-7 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Example bitmap viewer. *) fun bitViewer() = let open Window Message Class Clipboard Menu Bitmap DeviceContext Brush Metafile open Font Color Painting Globals val app = ApplicationInstance() (* Identifiers for the menu items. *) val menuCopy = 1 and menuPaste = 2 local val editMenu = let val editMenu = CreateMenu(); in AppendMenu(editMenu, [], MenuId menuCopy, MFT_STRING "&Copy"); AppendMenu(editMenu, [], MenuId menuPaste, MFT_STRING "&Paste"); editMenu end; in (* Create the main menu and append the sub-menu. *) val menu = CreateMenu(); val _ = AppendMenu(menu, [], MenuHandle editMenu, MFT_STRING "&Edit") end; (* Window procedure for the window. *) fun wndProc(w: HWND, WM_CREATE _, NONE) = let (* Create a sub-window to display a bitmap. *) val static = CreateWindow{class = Static, name = "", style = Static.Style.flags[Static.Style.WS_CHILD, Static.Style.WS_VISIBLE, Static.Style.SS_BITMAP], x = CW_USEDEFAULT, y = CW_USEDEFAULT, height = CW_USEDEFAULT, width = CW_USEDEFAULT, relation = ChildWindow{parent=w, id=99 (* Not used *)}, instance = app, init = ()} in (LRESINT 0, SOME static) (* Return it as the "state". *) end | wndProc(w: HWND, WM_PAINT, state as SOME static) = (* WM_PAINT is sent to the window when at least some of it needs to be redrawn. *) let (* Fill this window with grey. We use this to fill all the area that isn't occupied by the subwindow containing the bitmap. A simpler way of doing this is to define a background colour for the class in which case we don't have to process this message at all. *) val (hdc, ps) = BeginPaint w val grey = RGB{red=128, blue=128, green=128} val _ = SetBkColor(hdc, grey); (* ExtTextOut with the ETO_OPAQUE is a common way of filling an area with a single colour. *) val _ = ExtTextOut(hdc, {x=0, y=0}, [ETO_OPAQUE], SOME(#paint ps), "", []); in EndPaint(w, ps); (LRESINT 0, state) end | wndProc(w: HWND, WM_SIZE {width, height, ...}, state as SOME static) = (* The main window has been resized. Recentre the child window. *) let val subRect = GetClientRect static in MoveWindow{hWnd = static, x = (width - #right subRect) div 2, y = (height - #bottom subRect) div 2, height = #bottom subRect, width = #right subRect, repaint = true}; (LRESINT 0, state) end | wndProc(w: HWND, msg as WM_COMMAND{notifyCode = 0, wId = 1 (* menuCopy*), control}, state as SOME static) = (* WM_COMMAND messages are sent when a menu item is pulled down. wId is the value we set as the ID when we created the menu. *) (* Copy the bitmap to the window as a device-independent bitmap. We could equally just copy the bitmap handle and let the clipboard do the work. *) let val LRESHANDLE (bitMap: HBITMAP) = SendMessage(static, STM_GETIMAGE{imageType=IMAGE_BITMAP}) in if isHNull bitMap then (DefWindowProc(w, msg), state) else ( OpenClipboard(SOME w); let val _ = EmptyClipboard(); (* Become owner. *) val winDC = GetDC static (* The first call returns the header of the bitmap that will be created. We can use all the defaults in it but we need to know the height which is the number of scan lines. *) val dibHdr as {height, ...} = getBitmapInfoHdr(GetDIBits(winDC, bitMap, 0, 0, NONE)) val dib = GetDIBits(winDC, bitMap, 0, height, SOME dibHdr) val _ = ReleaseDC(static, winDC) in SetClipboardData(CH_DIB dib) end (* Make sure the clipboard is closed if anything goes wrong. *) handle exn => (CloseClipboard(); raise exn); CloseClipboard(); (LRESINT 0, state) ) end | wndProc(w: HWND, msg as WM_COMMAND{notifyCode = 0, wId = 2 (* menuPaste*), control}, state as SOME static) = ( case GetPriorityClipboardFormat[CF_DIB, CF_BITMAP, CF_ENHMETAFILE] of (* Some drawing programs paste metafile information rather than bitmaps. *) SOME CF_ENHMETAFILE => ( OpenClipboard(SOME w); let val CH_ENHMETAFILE emh = GetClipboardData CF_ENHMETAFILE; (* Get the bounding frame of this metafile. This gives us the size of the bitmap. *) val hdr as {bounds = { right, left, top, bottom }, ... } = GetEnhMetaFileHeader emh val winDC = GetDC static (* In order to write to a new bitmap we first have to create a memory device context and select a new bitmap into it. *) val memDC = CreateCompatibleDC winDC val emfSize: SIZE = {cx = right - left, cy = bottom - top} val newbm = CreateCompatibleBitmap(winDC, right - left, bottom - top) (* Select the bitmap into the memory DC to draw to it. *) val oldBM = SelectObject(memDC, newbm); (* Play the metafile *) val _ = PlayEnhMetaFile(memDC, emh, {top = 0, left = 0, right = right - left, bottom = bottom - top }) (* Deselect the bitmap by selecting in the original (most likely NULL). *) val _ = SelectObject(memDC, oldBM); val _ = DeleteDC memDC (* Get rid of the device context. *) val _ = ReleaseDC(static, winDC) in setBitmap(newbm, w, static) end (* Make sure the clipboard is closed if anything goes wrong. *) handle exn => (CloseClipboard(); raise exn); CloseClipboard(); (LRESINT 0, state) ) | SOME CF_DIB => ( OpenClipboard(SOME w); let val CH_DIB dib = GetClipboardData CF_DIB; val winDC = GetDC static val { width, height, ...} = getBitmapInfoHdr dib (* Height could be negative for a top-down DIB. *) val newbm = CreateCompatibleBitmap(winDC, width, abs height) val _ = SetDIBits(winDC, newbm, 0, abs height, dib) val _ = ReleaseDC(static, winDC) in setBitmap(newbm, w, static) end (* Make sure the clipboard is closed if anything goes wrong. *) handle exn => (CloseClipboard(); raise exn); CloseClipboard(); (LRESINT 0, state) ) (* The clipboard synthesises DIBs from bitmaps so this code will never be executed. It's included for information only. *) | SOME CF_BITMAP => ( OpenClipboard(SOME w); let val CH_BITMAP hb = GetClipboardData CF_BITMAP; (* Get the size of the bitmap *) val GO_Bitmap (bmp as {widthBytes, height, ...}) = GetObject hb (* Create a copy. *) val newb = CreateBitmapIndirect bmp val bytes = widthBytes*height val v = GetBitmapBits(hb, bytes) val _ = SetBitmapBits(newb, v); in setBitmap(newb, w, static) end (* Make sure the clipboard is closed if anything goes wrong. *) handle exn => (CloseClipboard(); raise exn); CloseClipboard(); (LRESINT 0, state) ) | _ => (DefWindowProc(w, msg), state) (* Nothing we can use. *) ) | wndProc(w: HWND, msg as WM_NCDESTROY, state) = (* When the window is closed we send a QUIT message which exits from the application loop. *) (PostQuitMessage 0; (DefWindowProc(w, msg), state)) | wndProc(w: HWND, msg: Message, state) = (DefWindowProc(w, msg), state) (* Anything else. *) and setBitmap(newb: HBITMAP, main: HWND, static: HWND) = let (* Set this copy as the new image and get back the old one. *) val LRESHANDLE oldBM = SendMessage(static, STM_SETIMAGE{image=newb, imageType=IMAGE_BITMAP}) (* Get the size of the main window and the subwindow. *) val mainRect = GetClientRect main and subRect = GetClientRect static in (* If there was previously a bitmap we have to delete it. *) if isHNull oldBM then () else DeleteObject oldBM; (* Centre the window. *) MoveWindow{hWnd = static, x = (#right mainRect - #right subRect) div 2, y = (#bottom mainRect - #bottom subRect) div 2, height = #bottom subRect, width = #right subRect, repaint = true} end (* Register a window class. *) val at = Class.RegisterClassEx{style = Class.Style.flags[], wndProc = wndProc, hInstance = app, hIcon = NONE, hCursor = NONE, hbrBackGround = NONE, menuName = NONE, className = "bitViewerClass", hIconSm = NONE}; val w = CreateWindow{class = at, name = "bitViewer", style = Window.Style.WS_OVERLAPPEDWINDOW, x = CW_USEDEFAULT, y = CW_USEDEFAULT, height = CW_USEDEFAULT, width = CW_USEDEFAULT, relation = PopupWindow menu, instance = app, init = NONE}; in ShowWindow(w, SW_SHOW); SetForegroundWindow w; RunApplication(); UnregisterClass("bitViewerClass", app) end; polyml-5.6/mlsource/extra/Win/Examples/dialTest.sml000066400000000000000000000101201265146633400224610ustar00rootroot00000000000000(* Copyright (c) 2001-7 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Test routine for dialogue. Tests various messages. *) fun dlgProc (h, Message.WM_INITDIALOG _, ()) = (Message.LRESINT 1, ()) | dlgProc (h, Message.WM_COMMAND{notifyCode = 0, wId, ...}, ()) = (if wId = MessageBox.IDOK orelse wId = MessageBox.IDCANCEL then (Dialog.EndDialog(h, wId); Message.PostQuitMessage 0) else (); (Message.LRESINT 1, ())) | dlgProc msg = ((*PolyML.print msg;*)(Message.LRESINT 0, ())); val dial = ref Base.hwndNull; local open Dialog Window.Style in val template = {x = 0, y = 0, cx = 215, cy = 135, font = SOME (8, "MS Sans Serif"), menu = NONE, class = NONE, style = flags[WS_POPUP, WS_CAPTION, WS_SYSMENU], title = "Dialogue", extendedStyle = 0, items = [{x = 158, y = 7, cx = 50, cy = 14, id = 1, creationData = NONE, extendedStyle = 0, class = DLG_BUTTON(flags[WS_CHILD, WS_VISIBLE, WS_TABSTOP]), title = DLG_TITLESTRING "OK"}, {x = 158, y = 24, cx = 50, cy = 14, id = 2,creationData = NONE, extendedStyle = 0, class = DLG_BUTTON(flags[WS_CHILD, WS_VISIBLE, WS_TABSTOP]), title = DLG_TITLESTRING "Cancel"}, {x = 45, y = 67, cx = 48, cy = 61, id = 1003, title = DLG_TITLESTRING "", creationData = NONE, extendedStyle = 0, class = DLG_COMBOBOX(flags[WS_CHILD, WS_VISIBLE, WS_VSCROLL, WS_TABSTOP])}, {x = 23, y = 26, cx = 19, cy = 8, id = 65535, creationData = NONE, extendedStyle = 0, class = DLG_STATIC(flags[WS_CHILD, WS_VISIBLE, WS_GROUP]), title = DLG_TITLESTRING "Static"}, {x = 64, y = 24, cx = 40, cy = 14, id = 1000, creationData = NONE, extendedStyle = 0, class = DLG_EDIT(flags[WS_CHILD, WS_VISIBLE, WS_BORDER, WS_TABSTOP]), title = DLG_TITLESTRING ""}, {x = 14, y = 47, cx = 103, cy = 11, id = 1001, creationData = NONE, extendedStyle = 0, class = DLG_SCROLLBAR(flags[WS_CHILD, WS_VISIBLE]), title = DLG_TITLESTRING ""}, {x = 136, y = 46, cx = 58, cy = 72, id = 1002, creationData = NONE, extendedStyle = 0, class = DLG_LISTBOX (flags[WS_CHILD, WS_VISIBLE, WS_BORDER, WS_VSCROLL, WS_TABSTOP]), title = DLG_TITLESTRING ""}]} fun makedial() = CreateDialogIndirect(Globals.ApplicationInstance(), template, Globals.MainWindow(), dlgProc, ()); end; (* val hi = Resource.LoadLibrary "C:\\Source Files\\DialogueDLL\\Debug\\DialogueDLL.dll"; fun makedial() = Dialog.CreateDialog(hi, Resource.IdAsString "MYDIALOGUE", Globals.MainWindow(), dlgProc, ()); *) (* The dialogue has to be created by the thread that will handle its messages. *) fun runDialogue() = ( dial := makedial(); Window.ShowWindow(!dial, Window.SW_SHOW); Window.SetForegroundWindow (!dial); Message.RunApplication(); () ); Thread.Thread.fork(runDialogue, []); val combo = Dialog.GetDlgItem(!dial, 1003); val scroll = Dialog.GetDlgItem(!dial, 1001); val listbox = Dialog.GetDlgItem(!dial, 1002); val info = ref {minPos = 10, maxPos = 20, pageSize = 4, pos = 15, trackPos = 0}; Message.SendMessage(scroll, Message.SBM_SETSCROLLINFO{info= !info, options=Scrollbar.SIF_ALL}); Message.SendMessage(scroll, Message.SBM_GETSCROLLINFO{info=info, options=Scrollbar.SIF_ALL}); !info; Message.SendMessage(combo, Message.CB_DIR{attrs = [], fileSpec ="C:\\*"}); Message.SendMessage(combo, Message.CB_DIR{attrs = [], fileSpec ="C:\\*"}); polyml-5.6/mlsource/extra/Win/Examples/mlEdit.sml000066400000000000000000000740101265146633400221360ustar00rootroot00000000000000(* Copyright (c) 2001-7 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Example text editor. *) fun mlEdit () = let open Window Message Menu Edit Class Dialog CommonDialog MessageBox Caret open DeviceContext Font Printing Transform Painting Color open Keyboard (* Define values to be delivered when the menu items are selected. The Id is delivered as part of a WM_COMMAND message. *) val menuOpen = 1 and menuQuit = 2 and menuSave = 3 and menuSaveAs = 4 and menuCut = 5 and menuCopy = 6 and menuPaste = 7 and menuFind = 8 and menuPageSetup = 9 and menuPrint = 10 and menuAbout = 11 val app = Globals.ApplicationInstance() (* Borrow the Poly icon from the application program. It happens to be icon id 102. If this doesn't work return NULL. *) val polyIcon = Icon.LoadIcon(app, Resource.MAKEINTRESOURCE 102) handle _ => Globals.hNull; local (* Create sub-menus. *) val fileMenu = let val fileMenu = CreateMenu(); in AppendMenu(fileMenu, [], MenuId menuOpen, MFT_STRING "&Open"); AppendMenu(fileMenu, [], MenuId menuSave, MFT_STRING "&Save"); AppendMenu(fileMenu, [], MenuId menuSaveAs, MFT_STRING "Save &As..."); AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR); AppendMenu(fileMenu, [], MenuId menuPageSetup, MFT_STRING "Page Set&up..."); AppendMenu(fileMenu, [], MenuId menuPrint, MFT_STRING "P&rint..."); AppendMenu(fileMenu, [], MenuId 0, MFT_SEPARATOR); AppendMenu(fileMenu, [], MenuId menuQuit, MFT_STRING "&Quit"); fileMenu end; val editMenu = let val editMenu = CreateMenu(); in AppendMenu(editMenu, [], MenuId menuCut, MFT_STRING "Cu&t"); AppendMenu(editMenu, [], MenuId menuCopy, MFT_STRING "&Copy"); AppendMenu(editMenu, [], MenuId menuPaste, MFT_STRING "&Paste"); AppendMenu(editMenu, [], MenuId menuFind, MFT_STRING "&Find"); editMenu end; val helpMenu = let val helpMenu = CreateMenu() in AppendMenu(helpMenu, [], MenuId menuAbout, MFT_STRING "&About mlEdit..."); helpMenu end in (* Create the main menu and append the sub-menus. *) val menu = CreateMenu(); val _ = AppendMenu(menu, [], MenuHandle fileMenu, MFT_STRING "&File"); val _ = AppendMenu(menu, [], MenuHandle editMenu, MFT_STRING "&Edit") val _ = AppendMenu(menu, [], MenuHandle helpMenu, MFT_STRING "&Help") end; (* The "state" of the editor. *) type state = { edit: HWND, (* Handle to the edit window. *) devMode: DEVMODE option, devNames: DEVNAMES option, (* Printer settings *) fileName: string } fun wndProc(hw: HWND, msg: Message, NONE): LRESULT * state option = ( case msg of WM_CREATE _ => (* Create an edit window and return it as the state. *) let val edit = CreateWindow{class = Class.Edit, name = "", (* The style does not include horizontal scrolling. That causes us to use word-wrapping. *) style = Edit.Style.flags[Edit.Style.WS_CHILD, Edit.Style.WS_VISIBLE, Edit.Style.WS_VSCROLL, (*Edit.Style.WS_HSCROLL, *)Edit.Style.ES_LEFT, Edit.Style.ES_MULTILINE, Edit.Style.ES_AUTOVSCROLL(*, Edit.Style.ES_AUTOHSCROLL*)], x = 0, y = 0, height = 0, width = 0, relation = ChildWindow{parent=hw, id=99}, instance = Globals.ApplicationInstance(), init = ()} (* Create a 10 point Courier font. *) val hDC = GetDC edit; val height = ~10 * GetDeviceCaps(hDC, LOGPIXELSY) div 72; val _ = ReleaseDC(edit, hDC); val hFont = CreateFont{height=height, width=0, escapement=0, orientation=0, weight=FW_DONTCARE, italic=false, underline=false, strikeOut=false, charSet=ANSI_CHARSET, outputPrecision=OUT_DEFAULT_PRECIS, clipPrecision=[CLIP_DEFAULT_PRECIS], quality=DEFAULT_QUALITY, pitch=FIXED_PITCH, family=FF_MODERN, faceName="Courier"} in SendMessage(edit, WM_SETFONT{font=hFont, redrawflag=false}); (LRESINT 0, SOME{edit=edit, devMode=NONE, devNames = NONE, fileName=""}) end | _ => (DefWindowProc(hw, msg), NONE) ) | wndProc(hw: HWND, msg: Message, state: state option as SOME{edit, devMode, devNames, fileName, ...}) = case msg of WM_SETFOCUS _ => (* If we get a focus request we set the focus to the edit window. *) (SetFocus(SOME edit); (DefWindowProc(hw, msg), state)) | WM_SIZE{height, width, ...} => (* If we get a size change we set the size of the edit window. *) (MoveWindow{hWnd=edit, x=0, y=0, height=height, width=width, repaint=true}; (DefWindowProc(hw, msg), state)) | WM_NCDESTROY => (* When the window is closed we send a QUIT message which exits from the application loop. *) (PostQuitMessage 0; (DefWindowProc(hw, msg), state)) | WM_CLOSE => (* User has pressed the Close box. If it's ok to close we could call DestroyWindow ourselves. Just as an example we return NONE which passes it to the default window procedure and does it for us. *) (if checkForSave(hw, edit, fileName) then DefWindowProc(hw, msg) else LRESINT 0, state) | WM_COMMAND{notifyCode = 0, wId, ...} => (* Menu selections arrive here. *) if wId = menuQuit then ( if checkForSave(hw, edit, fileName) then DestroyWindow hw else (); (LRESINT 0, state) ) else if wId = menuOpen then let val on = { owner = SOME hw, template = TemplateDefault, filter = [("Text Files (*.txt)", "*.txt"), ("ML Files (*.sml)", "*.sml"), ("All Files (*.*)", "*.*")], customFilter = NONE, filterIndex = 1, file = "", maxFile = 1000, fileTitle = "", initialDir = NONE, title = NONE, flags = OpenFileFlags.flags[OpenFileFlags.OFN_HIDEREADONLY], defExt = NONE } in case GetOpenFileName on of NONE => (LRESINT 0, state) | SOME {file, ...} => (* If it's been modified we need to ask before overwriting. *) if checkForSave(hw, edit, fileName) then (let val f = TextIO.openIn file (* Text input will convert CRNL to \n. We need to reverse the process. *) fun nlToCrnl s = String.translate(fn #"\n" => "\r\n" | c => String.str c) s in (* Should we save any existing file? *) SetWindowText(edit, nlToCrnl(TextIO.inputAll f)); TextIO.closeIn f; SendMessage(edit, EM_SETMODIFY{modified=false}); (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames, fileName=file}) end) handle _ => (MessageBox(SOME hw, SOME(concat["Unable to open - ", file, "\n"(*, exnMessage exn*)]), SOME "Open failure", MessageBoxStyle.MB_OK); (LRESINT 0, state)) else (LRESINT 0, state) end else if wId = menuSave andalso fileName <> "" then (* Save to the original file name if there is one. *) ( saveDocument(hw, fileName, edit); (LRESINT 0, state) ) else if wId = menuSaveAs orelse wId = menuSave (* andalso fileName = "" *) then ( case saveAsDocument(hw, edit) of NONE => (LRESINT 0, state) | SOME newName => (LRESINT 0, (* Use the selected file name. *) SOME{edit=edit, devMode=devMode, devNames=devNames, fileName=newName}) ) else if wId = menuFind then let open FindReplaceFlags (* Create a "Find" dialogue. *) val find = FindText{owner = hw, template = TemplateDefault, flags=flags[FR_DOWN, FR_HIDEWHOLEWORD], findWhat="", replaceWith="", bufferSize = 100} in ShowWindow(find, SW_SHOW); (LRESINT 0, state) end (* Cut, Copy and Paste are all handled by the Edit window. *) else if wId = menuCut then (SendMessage(edit, WM_CUT); (LRESINT 0, state)) else if wId = menuCopy then (SendMessage(edit, WM_COPY); (LRESINT 0, state)) else if wId = menuPaste then (SendMessage(edit, WM_PASTE); (LRESINT 0, state)) else if wId = menuPageSetup then ( (* Put up the dialogue and change the settings if necessary. *) case PageSetupDlg {owner=SOME hw, devMode=devMode, devNames=devNames, flags=PageSetupFlags.flags[], paperSize={x=0,y=0}, minMargin={top=0,bottom=0,left=0,right=0}, margin={top=0,bottom=0,left=0,right=0}} of NONE => (LRESINT 0, state) | SOME {devMode, devNames, ...} => (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames, fileName=fileName}) ) else if wId = menuPrint (* "Print" menu item. *) then let (* Put up the dialogue box to get the settings. *) val printSettings = PrintDlg {owner=SOME hw, devMode=devMode, devNames=devNames, context=NONE, flags=PrintDlgFlags.flags[PrintDlgFlags.PD_RETURNDC, PrintDlgFlags.PD_NOSELECTION], fromPage=1, toPage=65535, minPage=1, maxPage=65535, copies=1}; in case printSettings of SOME {devMode, devNames, context = SOME hdc, flags, fromPage, toPage, ...} => (let (* If the "Selection" button has been pressed we only print the selection. *) val printWhat = if PrintDlgFlags.anySet(flags, PrintDlgFlags.PD_SELECTION) then let val from = ref 0 and to = ref 0 val _ = SendMessage(edit, EM_GETSEL{startPos = from, endPos = to}) val text = GetWindowText edit in if !from < 0 orelse !from > size text orelse !to < 0 orelse !from > size text then "" else String.substring(text, !from, !to - !from) end else (* "All" button pressed or "Pages" pressed. *) GetWindowText edit; val textLength = size printWhat (* Tell the spooler to start the document. *) val _ = StartDoc(hdc, {docName=fileName, output=NONE, dType=NONE}) (* Find out how big a character is. From this we can work out how many characters fit on a line and how many lines on a page. Since we're using a fixed width font this is fairly easy. *) val _ = SetMapMode(hdc, MM_TEXT) val white = RGB{red=255, blue=255, green=255} val black = RGB{red=0, blue=0, green = 0} val pageWidth = GetDeviceCaps(hdc, HORZRES) and pageHeight = GetDeviceCaps(hdc, VERTRES) (* Create the same font as we're using on the screen. Since this is a fixed width font it makes calculating the number of characters fairly easy. *) val charHeight = ~10 * GetDeviceCaps(hdc, LOGPIXELSY) div 72; val hFont = CreateFont{height=charHeight, width=0, escapement=0, orientation=0, weight=FW_DONTCARE, italic=false, underline=false, strikeOut=false, charSet=ANSI_CHARSET, outputPrecision=OUT_DEFAULT_PRECIS, clipPrecision=[CLIP_DEFAULT_PRECIS], quality=DEFAULT_QUALITY, pitch=FIXED_PITCH, family=FF_MODERN, faceName="Courier"} val oldFont = SelectObject(hdc, hFont); (* Use this font. *) val textMetric = GetTextMetrics hdc; fun printPage pno index = let (* If we are printing a range of pages we need to check whether we are in the range. *) val printThisPage = if PrintDlgFlags.anySet(flags, PrintDlgFlags.PD_PAGENUMS) then pno >= fromPage andalso (pno <= toPage orelse toPage < 0) else true val pageRect = {top=0, left=0, bottom=pageHeight, right=pageWidth} (* Calculate the number of lines and columns. *) val nLines = pageHeight div #height textMetric; val nCols = pageWidth div #maxCharWidth textMetric (* Output the lines to fill the page. *) fun outputLines lineNo p = if lineNo >= nLines then p (* Return last pointer. *) else let (* Find the point to split the line. We stop at the end of the text, a line break, the last word break on the line or the maximum number of characters. *) fun findEnd lastBreak i = if i >= textLength then (textLength, textLength) else if i-p > nCols then ( case lastBreak of NONE => (* No breaks on the line - break just before here. *) (i-1, i-1) | SOME b => b (* Break at the last break. *) ) else if i < textLength - 1 andalso String.sub(printWhat, i) = #"\r" andalso String.sub(printWhat, i+1) = #"\n" then (* End of line - stop here. *) (i, i+2) else if Char.isSpace(String.sub(printWhat, i)) then (* Remember this. *) findEnd (SOME(i, i+1)) (i+1) (* Actually tabs need to be handled more carefully. *) else findEnd lastBreak (i+1) val (endLine, nextLine) = findEnd NONE p val thisLine = if p >= textLength then "" else String.substring(printWhat, p, endLine-p) in if printThisPage then ( TabbedTextOut(hdc, {x=0, y= lineNo * #height textMetric}, thisLine, [], 0); () ) else (); outputLines (lineNo+1) nextLine end val nextPage = if printThisPage then let val _ = StartPage hdc; (* Fill the page with white. *) val _ = SetBkColor(hdc, white); val _ = SetTextColor(hdc, black); val _ = ExtTextOut(hdc, {x=0, y=0}, [ETO_OPAQUE], SOME pageRect, "", []); (* Print the text. *) val next = outputLines 0 index in EndPage hdc; next end else (* Format the page but don't print it. *) outputLines 0 index in if nextPage >= size printWhat then () else printPage (pno+1) nextPage end val _: unit = printPage 1 0 in EndDoc hdc; (* Restore the original font and delete the new one. *) SelectObject(hdc, oldFont); DeleteObject(hFont); DeleteDC hdc; (* Now delete the device context. *) (LRESINT 0, SOME{edit=edit, devMode=devMode, devNames=devNames, fileName=fileName}) end (* If any of the functions failed simply delete the device context and return the original state. *) handle (exn as OS.SysErr _) => ( print (exnName exn); AbortDoc hdc; DeleteDC hdc; (LRESINT 0, state))) | _ => (LRESINT 0, state) end else if wId = menuAbout then (aboutmlEdit hw; (LRESINT 0, state)) else (DefWindowProc(hw, msg), state) | FINDMSGSTRING{flags, findWhat, ...} => if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_DIALOGTERM) then (* The "find" box is going away. *) ( SetFocus(SOME edit); (LRESINT 0, state) ) else if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_FINDNEXT) then (* The Find Next button has been pressed. *) let (* Get the whole of the text - not very efficient. *) val text = GetWindowText edit val startPos = ref 0 and endPos = ref 0 (* Get the starting position. *) val _ = SendMessage(edit, EM_GETSEL{startPos=startPos, endPos=endPos}) val isDown = FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_DOWN) (* Get the starting position for the search. *) val startPos = if isDown then !endPos else !startPos - 1 val findLen = size findWhat (* Get the options. *) local val toLower = String.map Char.toLower in val doMatch: string * string -> bool = if FindReplaceFlags.anySet(flags, FindReplaceFlags.FR_MATCHCASE) then op = else fn (s1, s2) => toLower s1 = toLower s2 end fun doFind p = let val isMatch = p >= 0 andalso size text - p >= size findWhat andalso doMatch(String.substring(text, p, findLen), findWhat) in if isMatch then p else if isDown then if p = size text then p (* Finish *) else doFind(p+1) else (* Find up *) if p = 0 then ~1 (* Finish *) else doFind(p-1) end val foundAt = doFind startPos in if foundAt >= 0 andalso foundAt + findLen < size text then ( SendMessage(edit, EM_SETSEL{startPos=foundAt, endPos=foundAt + findLen}); SendMessage(edit, EM_SCROLLCARET); () ) else MessageBeep(MessageBoxStyle.fromWord 0wxFFFFFFFF); (LRESINT 0, state) end else (DefWindowProc(hw, msg), state) | _ => (DefWindowProc(hw, msg), state) (* If this document has been modified we want to ask before quitting or opening a new document. *) and checkForSave(hw, edit, fileName) = case SendMessage(edit, EM_GETMODIFY) of LRESINT 0 => true (* Unmodified - continue. *) | _ => let val res = MessageBox(SOME hw, SOME "Save document?", SOME "Confirm", MessageBoxStyle.MB_YESNOCANCEL) in if res = IDYES then if fileName = "" then saveAsDocument(hw, edit) <> NONE else saveDocument(hw, fileName, edit) else if res = IDNO then true (* Continue anyway. *) else false (* Cancel - don't exit or open. *) end and saveDocument(hw, fileName, edit) = (* Write the document to the given file name. *) let (* Write the file as binary. That way we don't need to convert CRNL to NL before writing. *) val f = BinIO.openOut fileName val s = GetWindowText edit in BinIO.output(f, Byte.stringToBytes s); BinIO.closeOut f; (* Document is now unmodified. *) SendMessage(edit, EM_SETMODIFY{modified=false}); true (* Succeeded. *) end handle _ => (MessageBox(SOME hw, SOME(concat["Unable to save to - ", fileName, "\n"(*, exnMessage exn*)]), SOME "Open failure", MessageBoxStyle.MB_OK); false) and saveAsDocument(hw, edit) = (* Ask for the file name before trying to save. *) let val on = { owner = SOME hw, template = TemplateDefault, filter = [("Text Files (*.txt)", "*.txt"), ("ML Files (*.sml)", "*.sml"), ("All Files (*.*)", "*.*")], customFilter = NONE, filterIndex = 1, file = "", maxFile = 1000, fileTitle = "", initialDir = NONE, title = NONE, flags = OpenFileFlags.flags[], defExt = NONE } in case GetSaveFileName on of NONE => NONE | SOME {file, filterIndex, fileTitle, ...} => let (* If the user typed a file name without an extension use the extension from the appropriate filter. *) val suffix = case filterIndex of 1 => ".txt" | 2 => ".sml" | _ => "" val fileName = if Char.contains fileTitle #"." then file else file ^ suffix in if saveDocument(hw, fileName, edit) then SOME file (* Return the selected name. *) else NONE end end and aboutmlEdit hw = (* Called when the user selects "About..." from the help menu. *) let (* Dialogue template containing three items: an OK button, a static picture and a piece of text. *) val pictureId = 1000 (* Could use any number here. *) open Static.Style val template = {x = 0, y = 0, cx = 210, cy = 94, font = SOME (8, "MS Sans Serif"), menu = NONE, class = NONE,title = "About mlEdit", extendedStyle = 0, style = flags[WS_POPUP, WS_CAPTION], items = [{x = 73, y = 62, cx = 50, cy = 14, id = 1, class = DLG_BUTTON (flags[WS_CHILD, WS_VISIBLE, WS_TABSTOP]), title = DLG_TITLESTRING "OK", creationData = NONE, extendedStyle = 0}, {x = 7, y = 7, cx = 32, cy = 32, id = pictureId, class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, SS_ICON]), title = DLG_TITLESTRING "", creationData = NONE, extendedStyle = 0}, {x = 15, y = 39, cx = 180, cy = 21, id = 65535, class = DLG_STATIC (flags[WS_CHILD, WS_VISIBLE, WS_GROUP]), title = DLG_TITLESTRING "mlEdit - An example of Windows programming in Poly/ML\ \\nCopyright David C.J. Matthews 2001-7", creationData = NONE, extendedStyle = 0}] } (* Dialogue procedure. *) fun dlgProc(dial, WM_INITDIALOG _, ()) = ( (* Send a message to the picture control to set it to this icon. *) SendMessage(GetDlgItem(dial, pictureId), STM_SETICON{icon=polyIcon}); (LRESINT 1, ()) ) | dlgProc(dial, WM_COMMAND{notifyCode = 0, wId=1 (* OK button *), ...}, ()) = (* When the OK button is pressed we end the dialogue. *) (EndDialog(dial, 1); (LRESINT 1, ()) ) | dlgProc _ = (LRESINT 0, ()) in DialogBoxIndirect(app, template, hw, dlgProc, ()); () end val className = "mlEditWindowClass" (* Register a class for the top-level window. Use the Poly icon from the application. *) val myWindowClass = RegisterClassEx{style = Class.Style.flags[], wndProc = wndProc, hInstance = app, hIcon = SOME polyIcon, hCursor = NONE, hbrBackGround = NONE, menuName = NONE, className = className, hIconSm = NONE}; val w = CreateWindow{class = myWindowClass, name = "mlEdit", style = Window.Style.WS_OVERLAPPEDWINDOW, x = CW_USEDEFAULT, y = CW_USEDEFAULT, height = CW_USEDEFAULT, width = CW_USEDEFAULT, relation = PopupWindow menu, instance = app, init = NONE}; in ShowWindow(w, SW_SHOW); SetForegroundWindow w; RunApplication(); (* Must unregister the class before returning otherwise RegisterClass will fail if we call mlEdit again. *) UnregisterClass(className, app) end; polyml-5.6/mlsource/extra/Win/FlagPrint.sml000066400000000000000000000041251265146633400210300ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) functor FlagPrint(structure BITS: BIT_FLAGS) = struct (* Auxiliary function to create a function to print out bit flags. The function must actually be installed by the caller because it has to be called with the type itself. *) fun createFlagPrinter (flagTable: (BITS.flags * string) list) = let fun accumulateFlags _ [] = [] | accumulateFlags f ((w, s)::t) = if BITS.allSet(w, f) then s :: accumulateFlags(BITS.clear(w, f)) t else accumulateFlags f t fun printFlags depth _ x = (* This is just the code to print a list. *) let open PolyML val stringFlags = accumulateFlags x flagTable fun plist [] _ = [] | plist _ 0 = [PrettyString "..."] | plist [h] _ = [PrettyString h] | plist (h::t) depth = PrettyString(h ^ ",") :: PrettyBreak (1, 0) :: plist t (depth - 1) in PrettyBlock (3, false, [], PrettyString "[" :: ((if depth <= 0 then [PrettyString "..."] else plist stringFlags depth) @ [PrettyString "]"] ) ) end in printFlags end; end; polyml-5.6/mlsource/extra/Win/Font.sml000066400000000000000000000561161265146633400200570ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Font : sig type HDC and HFONT type COLORREF = Color.COLORREF type POINT = {x: int, y: int} and SIZE = {cx: int, cy: int } and RECT = { top: int, left: int, bottom: int, right: int } datatype FontFamily = FF_DECORATIVE | FF_DONTCARE | FF_MODERN | FF_ROMAN | FF_SCRIPT | FF_SWISS and FontPitch = DEFAULT_PITCH | FIXED_PITCH | VARIABLE_PITCH and OutputPrecision = OUT_CHARACTER_PRECIS | OUT_DEFAULT_PRECIS | OUT_DEVICE_PRECIS | OUT_OUTLINE_PRECIS | OUT_RASTER_PRECIS | OUT_SCREEN_OUTLINE_PRECIS | OUT_STRING_PRECIS | OUT_STROKE_PRECIS | OUT_TT_ONLY_PRECIS | OUT_TT_PRECIS and OutputQuality = DEFAULT_QUALITY | DRAFT_QUALITY | PROOF_QUALITY | ANTIALIASED_QUALITY | CLEARTYPE_QUALITY | NONANTIALIASED_QUALITY and CharacterSet = ANSI_CHARSET | DEFAULT_CHARSET | SYMBOL_CHARSET | MAC_CHARSET | SHIFTJIS_CHARSET | HANGEUL_CHARSET | JOHAB_CHARSET | GB2312_CHARSET | CHINESEBIG5_CHARSET | GREEK_CHARSET | TURKISH_CHARSET | VIETNAMESE_CHARSET | HEBREW_CHARSET | ARABIC_CHARSET | BALTIC_CHARSET | RUSSIAN_CHARSET | THAI_CHARSET | EASTEUROPE_CHARSET | OEM_CHARSET type FontWeight = int val FW_BLACK : FontWeight val FW_BOLD : FontWeight val FW_DEMIBOLD : FontWeight val FW_DONTCARE : FontWeight val FW_EXTRABOLD : FontWeight val FW_EXTRALIGHT : FontWeight val FW_HEAVY : FontWeight val FW_LIGHT : FontWeight val FW_MEDIUM : FontWeight val FW_NORMAL : FontWeight val FW_REGULAR : FontWeight val FW_SEMIBOLD : FontWeight val FW_THIN : FontWeight val FW_ULTRABOLD : FontWeight val FW_ULTRALIGHT : FontWeight datatype ClippingPrecision = CLIP_DEFAULT_PRECIS | CLIP_STROKE_PRECIS | CLIP_LH_ANGLES | CLIP_DFA_DISABLE | CLIP_EMBEDDED type LOGFONT = { height : int, width : int, escapement : int, orientation : int, weight : FontWeight, italic : bool, underline : bool, strikeOut : bool, charSet : CharacterSet, outputPrecision: OutputPrecision, clipPrecision : ClippingPrecision list, quality : OutputQuality, pitch: FontPitch, family: FontFamily, faceName : string } datatype DrawTextMode = DT_BOTTOM | DT_CALCRECT | DT_CENTER | DT_EXPANDTABS | DT_EXTERNALLEADING | DT_INTERNAL | DT_LEFT | DT_NOCLIP | DT_NOPREFIX | DT_RIGHT | DT_SINGLELINE | DT_TABSTOP of int | DT_TOP | DT_VCENTER | DT_WORDBREAK and TextAlign = TA_BASELINE | TA_BOTTOM | TA_CENTER | TA_LEFT | TA_NOUPDATECP | TA_RIGHT | TA_TOP | TA_UPDATECP and TextMetricPitch = TMPF_DEVICE | TMPF_FIXED_PITCH | TMPF_TRUETYPE | TMPF_VECTOR and ExtendedTextMode = ETO_CLIPPED | ETO_GLYPH_INDEX | ETO_IGNORELANGUAGE | ETO_OPAQUE | ETO_RTLREADING type TEXTMETRIC = { height: int, ascent: int, descent: int, internalLeading: int, externalLeading: int, aveCharWidth: int, maxCharWidth: int, weight: int, overhang: int, digitizedAspectX: int, digitizedAspectY: int, firstChar: char, lastChar: char, defaultChar: char, breakChar: char, italic: bool, underlined: bool, struckOut: bool, pitch: TextMetricPitch list, family: FontFamily, charSet : CharacterSet } val AddFontResource : string -> int val CreateFont : LOGFONT -> HFONT val CreateFontIndirect : LOGFONT -> HFONT val CreateScalableFontResource : int * string * string * string -> unit val DrawText : HDC * string * RECT * DrawTextMode list -> int val ExtTextOut : HDC * POINT * ExtendedTextMode list * RECT option * string * int list -> unit val GetAspectRatioFilterEx : HDC -> SIZE val GetCharABCWidths : HDC * char * char -> (int * int * int) vector val GetCharABCWidthsFloat : HDC * char * char -> (real * real * real) vector val GetCharWidth32 : HDC * char * char -> int vector val GetCharWidthFloat : HDC * char * char -> real vector val GetTabbedTextExtent : HDC * string * int list -> SIZE val GetTextAlign : HDC -> TextAlign list val GetTextCharacterExtra : HDC -> int val GetTextColor : HDC -> COLORREF val GetTextExtentExPoint : HDC * string * int option -> {fit: int option, size: SIZE, extents: int list} val GetTextExtentPoint32 : HDC * string -> SIZE val GetTextFace : HDC -> string val GetTextMetrics : HDC -> TEXTMETRIC val RemoveFontResource : string -> unit val SetMapperFlags : HDC * bool -> bool val SetTextAlign : HDC * TextAlign list -> TextAlign list val SetTextCharacterExtra : HDC * int -> int val SetTextColor : HDC * COLORREF -> COLORREF val SetTextJustification : HDC * int * int -> unit val TabbedTextOut: HDC * POINT * string * int list * int -> SIZE val TextOut : HDC * POINT * String.string -> unit end = struct local open Foreign Base GdiBase (*val HEIGHT = INT: int conversion*) in type COLORREF = Color.COLORREF type SIZE = SIZE and POINT = POINT and RECT = RECT type HDC = HDC and HFONT = HFONT open FontBase (* Contains the types used in LOGFONT. *) datatype TextAlign = TA_NOUPDATECP | TA_UPDATECP | TA_LEFT | TA_RIGHT | TA_CENTER | TA_TOP | TA_BOTTOM | TA_BASELINE local val tab = [ (TA_NOUPDATECP, 0w0), (TA_UPDATECP, 0w1), (TA_LEFT, 0w0), (TA_RIGHT, 0w2), (TA_CENTER, 0w6), (TA_TOP, 0w0), (TA_BOTTOM, 0w8), (TA_BASELINE, 0w24) ] val TEXTALIGN = tableSetConversion(tab, NONE) in val GetTextAlign = winCall1(gdi "GetTextAlign") (cHDC) TEXTALIGN val SetTextAlign = winCall2(gdi "SetTextAlign") (cHDC,TEXTALIGN) TEXTALIGN end (*TYPE: DrawTextMode *) datatype DrawTextMode = DT_TOP | DT_LEFT | DT_CENTER | DT_RIGHT | DT_VCENTER | DT_BOTTOM | DT_WORDBREAK | DT_SINGLELINE | DT_EXPANDTABS | DT_NOCLIP | DT_EXTERNALLEADING | DT_CALCRECT | DT_NOPREFIX | DT_INTERNAL | DT_TABSTOP of int local val tab = [ (DT_TOP, 0wx0000), (DT_LEFT, 0wx0000), (DT_CENTER, 0wx0001), (DT_RIGHT, 0wx0002), (DT_VCENTER, 0wx0004), (DT_BOTTOM, 0wx0008), (DT_WORDBREAK, 0wx0010), (DT_SINGLELINE, 0wx0020), (DT_EXPANDTABS, 0wx0040), (DT_NOCLIP, 0wx0100), (DT_EXTERNALLEADING, 0wx0200), (DT_CALCRECT, 0wx0400), (DT_NOPREFIX, 0wx0800), (DT_INTERNAL, 0wx1000) ] val tabStop = 0wx0080 fun toInt (DT_TABSTOP i) = Word32.orb(tabStop, Word32.fromInt i*0w256) | toInt _ = raise Match fun fromInt i = if Word32.andb(i, tabStop) = tabStop then DT_TABSTOP(Word32.toInt(Word32.andb((Word32.>>(i, 0w8)), 0wxff))) else raise Match; val DRAWTEXTMODE = tableSetConversion(tab, SOME(fromInt, toInt)) in val DrawText = winCall4(user "DrawTextA") (cHDC,cString,cConstStar cRect,DRAWTEXTMODE) cInt end val AddFontResource = winCall1(gdi "AddFontResourceA") (cString) cInt val CreateScalableFontResource = winCall4(gdi "CreateScalableFontResourceA") (cDWORD,cString,cString,cString) (successState "CreateScalableFontResource") val GetTextCharacterExtra = winCall1(gdi "GetTextCharacterExtra") (cHDC) cInt val RemoveFontResource = winCall1(gdi "RemoveFontResourceA") (cString) (successState "RemoveFontResource") local val cFONTMAPPERFLAG: bool conversion = absConversion{rep=fn true => 0w1 | false => 0w0, abs=fn n => n <> 0w0} cDWORDw in val SetMapperFlags = winCall2(gdi "SetMapperFlags") (cHDC, cFONTMAPPERFLAG) cFONTMAPPERFLAG end val SetTextCharacterExtra = winCall2(gdi "SetTextCharacterExtra") (cHDC,cInt) cInt val SetTextJustification = winCall3(gdi "SetTextJustification") (cHDC,cInt,cInt) (successState "SetTextJustification") val GetTextColor = winCall1 (gdi "GetTextColor") (cHDC) cCOLORREF and SetTextColor = winCall2 (gdi "SetTextColor") (cHDC, cCOLORREF) cCOLORREF local val getAspectRatioFilterEx = winCall2(gdi "GetAspectRatioFilterEx") (cHDC, cStar cSize)(successState "GetAspectRatioFilterEx") in fun GetAspectRatioFilterEx hdc = let val s = ref{cx=0, cy= 0} in getAspectRatioFilterEx(hdc, s); !s end end local val createFont = winCall14 (gdi "CreateFontA") (cInt, cInt, cInt, cInt, cInt (* FONTWEIGHT *), cDWORDw, cDWORDw, cDWORDw, cDWORDw (*CHARACTERSET *), cDWORDw (* OUTPUTPRECISION *), cDWORDw (* CLIPPINGPRECISION *), cDWORDw (* OUTPUTQUALITY *), cDWORDw (* FONTPITCHANDFAMILY *), cString) cHFONT fun bToch false = 0w0 | bToch true = 0w1 val w8ToW32 = Word32.fromLargeWord o Word8.toLargeWord in fun CreateFont({height: int, width: int, escapement: int, orientation: int, weight: FontWeight, italic: bool, underline: bool, strikeOut: bool, charSet: CharacterSet, outputPrecision: OutputPrecision, clipPrecision: ClippingPrecision list, quality: OutputQuality, pitch: FontPitch, family: FontFamily, faceName: string}: LOGFONT) = createFont(height, width, escapement, orientation, weight, bToch italic, bToch underline, bToch strikeOut, w8ToW32(charsetToW8 charSet), w8ToW32(outPrecToW8 outputPrecision), clipPrecSetToW32 clipPrecision, w8ToW32(outQualToW8 quality), w8ToW32(pitchAndFamilyToW8 (pitch, family)), if size faceName > 31 then String.substring(faceName, 0, 31) else faceName) end (* CreateFont and CreateFontIndirect take the same arguments in ML. *) val CreateFontIndirect = winCall1 (gdi "CreateFontIndirectA") (cConstStar cLOGFONT) cHFONT datatype ExtendedTextMode = ETO_OPAQUE | ETO_CLIPPED | ETO_GLYPH_INDEX | ETO_RTLREADING | ETO_IGNORELANGUAGE local val tab = [ (ETO_OPAQUE, 0wx0002), (ETO_CLIPPED, 0wx0004), (ETO_GLYPH_INDEX, 0wx0010), (ETO_RTLREADING, 0wx0080), (ETO_IGNORELANGUAGE, 0wx1000) ] in val EXTENDEDTEXTOUT = tableSetConversion(tab, NONE) end local val extTextOut = winCall8 (gdi "ExtTextOutA") (cHDC,cInt,cInt, EXTENDEDTEXTOUT, cOptionPtr (cConstStar cRect), cString, cUint, cPointer) (successState "ExtTextOut") val l2Vec = list2Vector cInt in fun ExtTextOut (h,({x,y}:POINT), option, rect, text, gapl) = let val slen = String.size text val (gaps, _) = case gapl of [] => (Memory.null, 0) | _ => l2Vec gapl (* The Rect is optional but really depends on the ETO_OPAQUE or ETO_CLIPPED options. *) in extTextOut(h, x, y, option, rect, text, slen, gaps) handle ex => (Memory.free gaps; raise ex); Memory.free gaps end end local val ABC = cStruct3(cInt, cUint, cInt) val getCharABCWidths = winCall4 (gdi "GetCharABCWidthsA") (cHDC, cUint, cUint, cPointer) (successState "GetCharABCWidths") val getVec = getVectorResult ABC in fun GetCharABCWidths (h, c1: char, c2: char) = let fun getCharABC(abcarr, count) = (getCharABCWidths(h, ord c1, ord c2, abcarr); count) in getVec getCharABC (ord c2 - ord c1 + 1) end end local val ABC = cStruct3(cFloat, cFloat, cFloat) val getCharABCWidthsFloat = winCall4 (gdi "GetCharABCWidthsFloatA") (cHDC, cUint, cUint, cPointer) (successState "GetCharABCWidthsFloat") val getVec = getVectorResult ABC in fun GetCharABCWidthsFloat (h,c1,c2) = let fun getCharABC(abcarr, count) = (getCharABCWidthsFloat(h, ord c1, ord c2, abcarr); count) in getVec getCharABC (ord c2 - ord c1 + 1) end end local val getCharWidth32 = winCall4 (gdi "GetCharWidth32A") (cHDC, cUint, cUint, cPointer) (successState "GetCharWidth32") val getVec = getVectorResult cInt in fun GetCharWidth32 (h,c1,c2) = let fun getCharW(vec, count) = (getCharWidth32(h, ord c1, ord c2, vec); count) in getVec getCharW (ord c2 - ord c1 + 1) end end local val getCharWidthFloat = winCall4 (gdi "GetCharWidthFloatA") (cHDC,cUint, cUint, cPointer) (successState "GetCharWidthFloat") val getVec = getVectorResult cFloat in fun GetCharWidthFloat (h,c1,c2) = let fun getCharW(vec, count) = (getCharWidthFloat(h, ord c1, ord c2, vec); count) in getVec getCharW (ord c2 - ord c1 + 1) end end local val getTextExtentPoint32 = winCall4 (gdi "GetTextExtentPoint32A") (cHDC, cString, cInt, cStar cSize) (successState "GetTextExtentPoint32") in fun GetTextExtentPoint32 (h, s) = let val r = ref {cx=0, cy=0} val () = getTextExtentPoint32(h, s, size s, r) in !r end end local val textOut = winCall5 (gdi "TextOutA") (cHDC,cInt,cInt,cString,cInt) (successState "TextOut") in fun TextOut (h,({x,y}:POINT),s) = textOut(h, x, y, s, size s) end datatype TextMetricPitch = TMPF_FIXED_PITCH | TMPF_VECTOR | TMPF_TRUETYPE | TMPF_DEVICE (* N.B. TMPF_FIXED_PITCH is included if the font is NOT fixed pitch!! *) type TEXTMETRIC = { height: int, ascent: int, descent: int, internalLeading: int, externalLeading: int, aveCharWidth: int, maxCharWidth: int, weight: int, overhang: int, digitizedAspectX: int, digitizedAspectY: int, firstChar: char, lastChar: char, defaultChar: char, breakChar: char, italic: bool, underlined: bool, struckOut: bool, pitch: TextMetricPitch list, family: FontFamily, charSet : CharacterSet } local val TEXTMETRIC = cStruct20(cLong, cLong, cLong, cLong, cLong, cLong, cLong, cLong, cLong, cLong, cLong, cChar, cChar, cChar, cChar, cUint8w, cUint8w, cUint8w, cUint8w, cUint8w) val getTextMetrics = winCall2 (gdi "GetTextMetricsA") (cHDC, cStar TEXTMETRIC) (successState "GetTextMetrics") val tmpfTab = [ (TMPF_FIXED_PITCH, 0wx1), (* N.B. This is the opposite *) (TMPF_VECTOR, 0wx2), (TMPF_TRUETYPE, 0wx4), (TMPF_DEVICE, 0wx8) ] val (_, tmpfFromW32) = tableSetLookup(tmpfTab, NONE) in fun GetTextMetrics hdc : TEXTMETRIC = let val r = ref (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #" ", #" ", #" ", #" ", 0w0, 0w0, 0w0, 0w0, 0w0) val () = getTextMetrics (hdc, r) val (height, ascent, descent, internalLeading, externalLeading, aveCharWidth, maxCharWidth, weight, overhang, digitizedAspectX, digitizedAspectY, firstChar, lastChar, defaultChar, breakChar, italic, underlined, struckOut, pitchAndFamily, charSet) = !r (*val (fromChs, _, _) = breakConversion CHARACTERSET*) val family = toFamily(Word8.andb(pitchAndFamily, 0wxf0)) val pitch = tmpfFromW32(Word32.fromLargeWord(Word8.toLargeWord(Word8.andb(pitchAndFamily, 0wxf)))) in { height = height, ascent = ascent, descent = descent, internalLeading = internalLeading, externalLeading = externalLeading, aveCharWidth = aveCharWidth, maxCharWidth = maxCharWidth, weight = weight, overhang = overhang, digitizedAspectX = digitizedAspectX, digitizedAspectY = digitizedAspectY, firstChar = firstChar, lastChar = lastChar, defaultChar = defaultChar, breakChar = breakChar, italic = italic <> 0w0, underlined = underlined <> 0w0, struckOut = struckOut <> 0w0, family = family, pitch = pitch, charSet = charsetFromW8 charSet } end end local val getFaceCall = winCall3(gdi "GetTextFaceA") (cHDC, cInt, cPointer) cInt in fun GetTextFace hdc : string = getStringWithNullIsLength(fn(vec, len) => getFaceCall(hdc, len, vec)) end local val getTextExtentExPoint = winCall7(gdi "GetTextExtentExPointA") (cHDC, cString, cInt, cInt, cPointer, cPointer, cStar cSize) (successState "GetTextExtentExPoint") val {load=loadInt, ctype={size=sizeInt, ...}, ...} = breakConversion cInt in fun GetTextExtentExPoint(hdc: HDC, s: string, maxWidth: int option) : {fit: int option, extents: int list, size: SIZE} = let val count = size s open Memory infix 6 ++ val vec = malloc(Word.fromInt count * sizeInt) (* The lpnFit argument controls whether we get the maximum no. of chars. *) val lpnFit = case maxWidth of NONE => null | SOME _ => malloc sizeInt val sizeVec = ref {cx=0, cy=0} val () = getTextExtentExPoint (hdc, s, count, getOpt(maxWidth, 0), lpnFit, vec, sizeVec) handle ex => (free vec; free lpnFit; raise ex) val fit = case maxWidth of NONE => NONE | _ => SOME(loadInt lpnFit) fun loadExt i = loadInt(vec ++ Word.fromInt i * sizeInt) val extents = List.tabulate(getOpt(fit, count), loadExt) val () = free vec val () = free lpnFit in {fit = fit, extents = extents, size = ! sizeVec} end end local val tabbedTextOut = winCall8 (user "TabbedTextOutA") (cHDC, cInt, cInt, cString, cInt, cInt, cPointer, cInt) cDWORDw val list2vec = list2Vector cInt in fun TabbedTextOut(hdc, {x, y}: POINT, str, tabs, origin): SIZE = let val (tabVec, nTabs) = case tabs of [] => (Memory.null, 0) (* Make the vector null. *) | _ => list2vec tabs val res = tabbedTextOut(hdc, x, y, str, size str, nTabs, tabVec, origin) handle ex => (Memory.free tabVec; raise ex) val () = Memory.free tabVec val () = checkResult(res <> 0w0) in (* Zero represents an error. But it's also possible to return zero if the string is empty. *) {cx = Word.toInt(LOWORD res), cy = Word.toInt(HIWORD res)} end end local val tabbedTextExtent = winCall5 (user "GetTabbedTextExtentA") (cHDC, cString, cInt, cInt, cPointer) cDWORDw (*(POSINT "GetTabbedTextExtent")*) in fun GetTabbedTextExtent(hdc, str, tabs): SIZE = let val (tabVec, nTabs) = case tabs of [] => (Memory.null, 0) (* Make the vector null. *) | _ => list2Vector cInt tabs val res = tabbedTextExtent(hdc, str, size str, nTabs, tabVec) handle ex => (Memory.free tabVec; raise ex) val () = Memory.free tabVec val () = checkResult(res <> 0w0) in {cx = Word.toInt(LOWORD res), cy = Word.toInt(HIWORD res)} end end (* Other Font and Text functions: DrawTextEx EnumFontFamiliesEx EnumFontFamExProc GetCharacterPlacement GetFontData GetFontLanguageInfo GetFontUnicodeRanges GetGlyphIndices GetGlyphOutline GetKerningPairs GetOutlineTextMetrics GetRasterizerCaps GetTabbedTextExtent PolyTextOut *) end end; polyml-5.6/mlsource/extra/Win/FontBase.sml000066400000000000000000000232651265146633400206510ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure FontBase = struct local open Foreign Base in datatype OutputQuality = DEFAULT_QUALITY | DRAFT_QUALITY | PROOF_QUALITY | ANTIALIASED_QUALITY | CLEARTYPE_QUALITY | NONANTIALIASED_QUALITY local val tab = [ (DEFAULT_QUALITY, 0w0: Word8.word), (DRAFT_QUALITY, 0w1), (PROOF_QUALITY, 0w2), (NONANTIALIASED_QUALITY, 0w3), (ANTIALIASED_QUALITY, 0w4), (CLEARTYPE_QUALITY, 0w5) ] in val (outQualToW8, outQualFromW8) = tableLookup(tab, NONE) end datatype CharacterSet = ANSI_CHARSET | DEFAULT_CHARSET | SYMBOL_CHARSET | MAC_CHARSET | SHIFTJIS_CHARSET | HANGEUL_CHARSET | JOHAB_CHARSET | GB2312_CHARSET | CHINESEBIG5_CHARSET | GREEK_CHARSET | TURKISH_CHARSET | VIETNAMESE_CHARSET | HEBREW_CHARSET | ARABIC_CHARSET | BALTIC_CHARSET | RUSSIAN_CHARSET | THAI_CHARSET | EASTEUROPE_CHARSET | OEM_CHARSET local val tab = [ (ANSI_CHARSET, 0wx00: Word8.word), (DEFAULT_CHARSET, 0wx01), (SYMBOL_CHARSET, 0wx02), (MAC_CHARSET, 0wx4D), (SHIFTJIS_CHARSET, 0wx80), (HANGEUL_CHARSET, 0wx81), (JOHAB_CHARSET, 0wx82), (GB2312_CHARSET, 0wx86), (CHINESEBIG5_CHARSET, 0wx88), (GREEK_CHARSET, 0wxA1), (TURKISH_CHARSET, 0wxA2), (VIETNAMESE_CHARSET, 0wxA3), (HEBREW_CHARSET, 0wxB1), (ARABIC_CHARSET, 0wxB2), (BALTIC_CHARSET, 0wxBA), (RUSSIAN_CHARSET, 0wxCC), (THAI_CHARSET, 0wxDE), (EASTEUROPE_CHARSET, 0wxEE), (OEM_CHARSET, 0wxff) ] in val (charsetToW8, charsetFromW8) = tableLookup(tab, NONE) end (* In the underlying CreateFont call the pitch and family are ORed together. *) (*TYPE: FontFamily *) datatype FontFamily = FF_DONTCARE | FF_ROMAN | FF_SWISS | FF_MODERN | FF_SCRIPT| FF_DECORATIVE and FontPitch = DEFAULT_PITCH | FIXED_PITCH | VARIABLE_PITCH local open Word8 val tab1 = [ (DEFAULT_PITCH, 0w0), (FIXED_PITCH, 0w1), (VARIABLE_PITCH, 0w2)] and tab2 = [ (FF_DONTCARE, 0wx00 (* (0<<4) Don't care or don't know. *)), (FF_ROMAN, 0wx10 (* (1<<4) Variable stroke width, serifed. *)), (FF_SWISS, 0wx20 (* (2<<4) Variable stroke width, sans~serifed. *)), (FF_MODERN, 0wx30 (* (3<<4) Constant stroke width, serifed or sans~serifed. *)), (FF_SCRIPT, 0wx40 (* (4<<4) Cursive, etc. *)), (FF_DECORATIVE, 0wx50 (* (5<<4) Old English, etc. *))] val (fromPitch, toPitch) = tableLookup(tab1, NONE) and (fromFamily, toFamily) = tableLookup(tab2, NONE) in val toFamily = toFamily (* This is used in GetTextMetrics. *) fun pitchAndFamilyToW8 (pitch, family) = orb(fromPitch pitch, fromFamily family) fun pitchAndFamilyFromW8 i = (toPitch(andb(i, 0w3)), toFamily(andb(i, 0wxf0))) end (*TYPE: FontWeight - This type is really int, not an abstract type. *) type FontWeight = int (* Values between 0 and 1000 *) (*val FONTWEIGHT = cLong*) (* It's int for CreateFont but LONG for LONGFONT. *) val FW_DONTCARE = 0 val FW_THIN = 100 val FW_EXTRALIGHT = 200 val FW_LIGHT = 300 val FW_NORMAL = 400 val FW_MEDIUM = 500 val FW_SEMIBOLD = 600 val FW_BOLD = 700 val FW_EXTRABOLD = 800 val FW_HEAVY = 900 val FW_ULTRALIGHT = FW_EXTRALIGHT val FW_REGULAR = FW_NORMAL val FW_DEMIBOLD = FW_SEMIBOLD val FW_ULTRABOLD = FW_EXTRABOLD val FW_BLACK = FW_HEAVY datatype OutputPrecision = OUT_DEFAULT_PRECIS | OUT_STRING_PRECIS | OUT_CHARACTER_PRECIS | OUT_STROKE_PRECIS | OUT_TT_PRECIS | OUT_DEVICE_PRECIS | OUT_RASTER_PRECIS | OUT_TT_ONLY_PRECIS | OUT_OUTLINE_PRECIS | OUT_SCREEN_OUTLINE_PRECIS local val tab = [ (OUT_DEFAULT_PRECIS, 0w0: Word8.word), (OUT_STRING_PRECIS, 0w1), (OUT_CHARACTER_PRECIS, 0w2), (OUT_STROKE_PRECIS, 0w3), (OUT_TT_PRECIS, 0w4), (OUT_DEVICE_PRECIS, 0w5), (OUT_RASTER_PRECIS, 0w6), (OUT_TT_ONLY_PRECIS, 0w7), (OUT_OUTLINE_PRECIS, 0w8), (OUT_SCREEN_OUTLINE_PRECIS, 0w9) ] in val (outPrecToW8, outPrecFromW8) = tableLookup(tab, NONE) end (* TODO: This is a bit set. *) datatype ClippingPrecision = CLIP_DEFAULT_PRECIS | CLIP_STROKE_PRECIS | CLIP_LH_ANGLES | CLIP_DFA_DISABLE | CLIP_EMBEDDED (* CLIP_CHARACTER_PRECIS and CLIP_TT_ALWAYS "should not be used" [CLIP_DEFAULT_PRECIS] is the same as [] i.e. zero. *) local val tab = [ (CLIP_DEFAULT_PRECIS, 0wx0), (CLIP_STROKE_PRECIS, 0wx2), (CLIP_LH_ANGLES, 0wx10), (CLIP_DFA_DISABLE, 0w40), (CLIP_EMBEDDED, 0w80) ] in val (clipPrecSetToW32, clipPrecSetFromW32) = tableSetLookup(tab, NONE) end type LOGFONT = { height : int, width : int, escapement : int, orientation : int, weight : FontWeight, italic : bool, underline : bool, strikeOut : bool, charSet : CharacterSet, outputPrecision: OutputPrecision, clipPrecision : ClippingPrecision list, quality : OutputQuality, pitch: FontPitch, family: FontFamily, faceName : string } local val cLogFont = cStruct14(cLong, cLong, cLong, cLong, cLong, cUint8w, cUint8w, cUint8w, cUint8w, cUint8w, cUint8w, cUint8w, cUint8w, cCHARARRAY 32) fun chToB 0w0 = false | chToB _ = true fun bToch false = 0w0 | bToch true = 0w1 fun toLF(height, width, escapement, orientation, weight, italic, underline, strikeOut, charSet, outputPrecision, clipPrecision, quality, pitchFamily, faceName) : LOGFONT = let val (pitch, family) = pitchAndFamilyFromW8 pitchFamily in {height = height, width = width, escapement = escapement, orientation = orientation, weight = weight, italic = chToB italic, underline = chToB underline, strikeOut = chToB strikeOut, charSet = charsetFromW8 charSet, outputPrecision = outPrecFromW8 outputPrecision, clipPrecision = clipPrecSetFromW32(Word32.fromLargeWord(Word8.toLargeWord clipPrecision)), quality = outQualFromW8 quality, pitch = pitch, family = family, faceName = faceName} end fun fromLF ({height, width, escapement, orientation, weight, italic, underline, strikeOut, charSet, outputPrecision, clipPrecision, quality, pitch, family, faceName}: LOGFONT) = let val pitchFamily = pitchAndFamilyToW8(pitch, family) in (height, width, escapement, orientation, weight, bToch italic, bToch underline, bToch strikeOut, charsetToW8 charSet, outPrecToW8 outputPrecision, Word8.fromLargeWord(Word32.toLargeWord (clipPrecSetToW32 clipPrecision)), outQualToW8 quality, pitchFamily, faceName) end in val cLOGFONT = absConversion{abs=toLF, rep=fromLF} cLogFont end end end; polyml-5.6/mlsource/extra/Win/GdiBase.sml000066400000000000000000000316511265146633400204440ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure GdiBase = struct local open Foreign Base in local datatype RasterOpCode = W of int and QuaternaryRop = Y of int in type RasterOpCode = RasterOpCode type QuaternaryRop = QuaternaryRop val cRASTEROPCODE = absConversion {abs = W, rep = fn W n => n} cDWORD val cQUATERNARY = absConversion {abs = Y, rep = fn Y n => n} cDWORD val SRCCOPY = W (0x00CC0020 (* dest = source *)) val SRCPAINT = W (0x00EE0086 (* dest = source OR dest *)) val SRCAND = W (0x008800C6 (* dest = source AND dest *)) val SRCINVERT = W (0x00660046 (* dest = source XOR dest *)) val SRCERASE = W (0x00440328 (* dest = source AND (NOT dest ) *)) val NOTSRCCOPY = W (0x00330008 (* dest = (NOT source) *)) val NOTSRCERASE = W (0x001100A6 (* dest = (NOT src) AND (NOT dest) *)) val MERGECOPY = W (0x00C000CA (* dest = (source AND pattern) *)) val MERGEPAINT = W (0x00BB0226 (* dest = (NOT source) OR dest *)) val PATCOPY = W (0x00F00021 (* dest = pattern *)) val PATPAINT = W (0x00FB0A09 (* dest = DPSnoo *)) val PATINVERT = W (0x005A0049 (* dest = pattern XOR dest *)) val DSTINVERT = W (0x00550009 (* dest = (NOT dest) *)) val BLACKNESS = W (0x00000042 (* dest = BLACK *)) val WHITENESS = W (0x00FF0062 (* dest = WHITE *)) fun MAKEROP4{fore = (W fore): RasterOpCode, back = (W back): RasterOpCode} = Y(IntInf.orb(fore, IntInf.andb(IntInf.<<(back, 0w8), 0xFF000000))) end (* BITMAPS *) type BITMAP = { width: int, height: int, widthBytes: int, planes: int, bitsPerPixel: int, bits: Word8Vector.vector option } local val bitmapStruct = cStruct7(cLong, cLong, cLong, cLong, cWORD, cWORD, cPointer) val {load = fromCStr, store = toCStr, ctype = lpStruct} = breakConversion bitmapStruct open Memory fun storeBmp(v: voidStar, {width, height, widthBytes, planes, bitsPerPixel, bits}: BITMAP) = let val m = case bits of NONE => Memory.null | SOME b => toCWord8vec b in toCStr(v, (0, width, height, widthBytes, planes, bitsPerPixel, m)); fn () => Memory.free m end fun loadbmp(v: voidStar): BITMAP = let val (_, width, height, widthBytes, planes, bitsPerPixel, bits) = fromCStr v val bits = if bits = Memory.null then NONE else SOME (fromCWord8vec (bits, height * widthBytes)) in {width = width, height = height, widthBytes = widthBytes, planes = planes, bitsPerPixel = bitsPerPixel, bits = bits} end in val cBITMAP = makeConversion{store=storeBmp, load=loadbmp, ctype = lpStruct} end (* Line and Path *) datatype PointType = PT_MOVETO | PT_LINETO | PT_BEZIERTO | PT_LINETOANDCLOSE | PT_BEZIERTOANDCLOSE local val tab = [ (PT_LINETO, 2), (PT_BEZIERTO, 4), (PT_MOVETO, 6), (PT_LINETOANDCLOSE, 3), (PT_BEZIERTOANDCLOSE, 5) ] val (toInt, fromInt) = tableLookup(tab, NONE) in val cPOINTTYPE = absConversion {abs = fromInt, rep = toInt} cUint8 (* Encoded as single bytes *) end (* COLORREF - this is an RGB encoded into a 32-bit word. *) abstype COLORREF = C of Word32.word with local open Word32 infix 7 andb infix 6 orb infix 4 << >> in fun RGB{red: int, green: int, blue: int} = C(fromInt red andb 0wxff orb (fromInt green andb 0wxff << 0w8) orb (fromInt blue andb 0wxff << 0w16)) fun PALETTERGB rgb = let val C r = RGB rgb in C(r orb 0wx02000000) end fun toRGB(C p) = { red = toInt(p andb 0wxff), green = toInt((p >> 0w8) andb 0wxff), blue = toInt((p >> 0w16) andb 0wxff) } end val cCOLORREF = absConversion {abs=C, rep = fn(C v) => v} cDWORDw end (* Brush *) datatype BrushStyle = BS_SOLID | BS_HOLLOW | BS_HATCHED of HatchStyle | BS_PATTERN of HBITMAP (* | BS_DIBPATTERN of PACKEDDIB *) and HatchStyle = HS_HORIZONTAL | HS_VERTICAL | HS_FDIAGONAL | HS_BDIAGONAL | HS_CROSS | HS_DIAGCROSS type LOGBRUSH = BrushStyle * COLORREF local val cLBRUSH = cStruct3(cUint, cCOLORREF, cULONG_PTR) val {load=loadStr, store=storeStr, ctype=lbStruct} = breakConversion cLBRUSH val hbtab = [ (HS_HORIZONTAL, 0 (* ~~~~~ *)), (HS_VERTICAL, 1 (* ||||| *)), (HS_FDIAGONAL, 2 (* \\\\\ *)), (HS_BDIAGONAL, 3 (* (* /// *) *)), (HS_CROSS, 4 (* +++++ *)), (HS_DIAGCROSS, 5 (* xxxxx *)) ] val (fromHB, toHB) = tableLookup(hbtab, NONE) val hgdiAsInt = SysWord.toInt o Memory.voidStar2Sysword o voidStarOfHandle and intAsHgdi = handleOfVoidStar o Memory.sysWord2VoidStar o SysWord.fromInt fun storeLB(m, (BS_SOLID, cr)) = storeStr(m, (0, cr, 0)) | storeLB(m, (BS_HOLLOW, cr)) = storeStr(m, (1, cr (* actually ignored *), 0)) | storeLB(m, (BS_HATCHED hs, cr)) = storeStr(m, (2, cr, fromHB hs)) | storeLB(m, (BS_PATTERN hb, cr)) = storeStr(m, (3, cr (* actually ignored *), hgdiAsInt hb)) (* | toLB(BS_DIBPATTERN dp, cr) = toStr(5, cr (* treated specially *), ??? dp) *) fun loadLB (v: Memory.voidStar): LOGBRUSH = let val (t, cr, i) = loadStr v in case t of 0 => (BS_SOLID, cr) | 1 => (BS_HOLLOW, cr) | 2 => (BS_HATCHED(toHB i), cr) | 3 => (BS_PATTERN(intAsHgdi i), cr) | _ => raise Fail "Unknown brush type" end in val cHATCHSTYLE = absConversion {abs = toHB, rep = fromHB} cInt val cLOGBRUSH = makeConversion{load=loadLB, store=storeLB, ctype = lbStruct} end (* Pen *) (* This is confused. Many of these are only applicable for ExtCreatePen and most are mutually exclusive. *) datatype PenStyle = PS_SOLID | PS_DASH | PS_DOT | PS_DASHDOT | PS_DASHDOTDOT | PS_NULL | PS_INSIDEFRAME | PS_USERSTYLE | PS_ALTERNATE | PS_ENDCAP_ROUND | PS_ENDCAP_SQUARE | PS_ENDCAP_FLAT | PS_JOIN_ROUND | PS_JOIN_BEVEL | PS_JOIN_MITER | PS_COSMETIC | PS_GEOMETRIC type LOGPEN = PenStyle * int option * COLORREF local val LPEN = cStruct3(cUintw, cPoint, cCOLORREF) val {load=loadStr, store=storeStr, ctype=lpStruct} = breakConversion LPEN val tab = [ (PS_SOLID, 0w0), (PS_DASH, 0w1 (* ~~~~~~~ *)), (PS_DOT, 0w2 (* ....... *)), (PS_DASHDOT, 0w3 (* _._._._ *)), (PS_DASHDOTDOT, 0w4 (* _.._.._ *)), (PS_NULL, 0w5), (PS_INSIDEFRAME, 0w6), (PS_USERSTYLE, 0w7), (PS_ALTERNATE, 0w8), (PS_ENDCAP_ROUND, 0wx00000000), (PS_ENDCAP_SQUARE, 0wx00000100), (PS_ENDCAP_FLAT, 0wx00000200), (PS_JOIN_ROUND, 0wx00000000), (PS_JOIN_BEVEL, 0wx00001000), (PS_JOIN_MITER, 0wx00002000), (PS_COSMETIC, 0wx00000000), (PS_GEOMETRIC, 0wx00010000) ] val (fromPS, toPS) = tableLookup(tab, NONE) fun storeLP(m, (ps, width, cr): LOGPEN) = storeStr(m, (fromPS ps, {x=getOpt(width, 0), y=0}, cr)) fun loadLP v: LOGPEN = let val (ps, {x=width, ...}, cr) = loadStr v in (toPS ps, case width of 0 => NONE | i => SOME i, cr) end in val cPENSTYLE = tableSetConversion(tab, NONE) val cLOGPEN = makeConversion{store=storeLP, load=loadLP, ctype=lpStruct} end (* Transform *) datatype MapMode = MM_TEXT | MM_LOMETRIC | MM_HIMETRIC | MM_LOENGLISH | MM_HIENGLISH | MM_TWIPS | MM_ISOTROPIC | MM_ANISOTROPIC val MM_MIN = MM_TEXT val MM_MAX = MM_ANISOTROPIC val MM_MAX_FIXEDSCALE = MM_TWIPS local val tab = [ (MM_TEXT, 1), (MM_LOMETRIC, 2), (MM_HIMETRIC, 3), (MM_LOENGLISH, 4), (MM_HIENGLISH, 5), (MM_TWIPS, 6), (MM_ISOTROPIC, 7), (MM_ANISOTROPIC, 8) ] (* SetMapMode and GetMapMode return 0 in the event of an error. *) fun toInt _ = raise Match fun fromInt i = (checkResult(i <> 0); raise Match); in val cMAPMODE = tableConversion(tab, SOME(fromInt, toInt)) cInt (* int for Get/SetMapMode *) end (* REGIONS *) local datatype RegionOperation = W of int in type RegionOperation = RegionOperation val REGIONOPERATION = absConversion {abs = W, rep = fn W n => n} cInt val RGN_ERROR = W (0) val RGN_AND = W (1) val RGN_OR = W (2) val RGN_XOR = W (3) val RGN_DIFF = W (4) val RGN_COPY = W (5) end local datatype ResultRegion = W of int in type ResultRegion = ResultRegion val RESULTREGION = absConversion {abs = W, rep = fn W n => n} cInt val ERROR = W (0) val NULLREGION = W (1) val SIMPLEREGION = W (2) val COMPLEXREGION = W (3) end type METAFILEPICT = {mm: MapMode, size: SIZE, hMF: HMETAFILE} local val metaFilePict = cStruct3(cMAPMODE, cSize, cHMETAFILE) val {store=storeMfp, load=loadMfp, ctype=mfpStruct} = breakConversion metaFilePict fun storeCMfp(m, ({mm, size, hMF}: METAFILEPICT)) = storeMfp(m, (mm, size, hMF)) fun loadCMfp v : METAFILEPICT = let val (mm, size, hMF) = loadMfp v in {mm=mm, size=size, hMF=hMF} end in (* This is needed in the Clipboard structure. *) val cMETAFILEPICT = makeConversion{store=storeCMfp, load=loadCMfp, ctype=mfpStruct} end end end; polyml-5.6/mlsource/extra/Win/Globals.sml000066400000000000000000000026641265146633400205330ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Globals : sig eqtype 'a HANDLE eqtype HINSTANCE eqtype HWND val hNull : 'a HANDLE val isHNull : 'a HANDLE -> bool val ApplicationInstance : unit -> HINSTANCE val GetLastError : unit -> OS.syserror val MainWindow : unit -> HWND end = struct local open Foreign open Base in type 'a HANDLE = 'a HANDLE val hNull = hNull and isHNull = isHNull type HINSTANCE = HINSTANCE type HWND = HWND val GetLastError = Base.GetLastError fun ApplicationInstance() = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (1103, ()) and MainWindow() = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific (1104, ()) end end; polyml-5.6/mlsource/extra/Win/Icon.sml000066400000000000000000000055751265146633400200440ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Icon: sig type HICON and HINSTANCE and HDC val CopyIcon : HICON -> HICON val DestroyIcon : HICON -> unit val DrawIcon : HDC * int * int * HICON -> unit val ExtractIcon : HINSTANCE * string * int -> HICON val IDI_APPLICATION : Resource.RESID val IDI_ASTERISK : Resource.RESID val IDI_ERROR : Resource.RESID val IDI_EXCLAMATION : Resource.RESID val IDI_HAND : Resource.RESID val IDI_INFORMATION : Resource.RESID val IDI_QUESTION : Resource.RESID val IDI_WARNING : Resource.RESID val IDI_WINLOGO : Resource.RESID val LoadIcon : HINSTANCE * Resource.RESID -> HICON end = struct local open Foreign open Base open Resource in type HICON = HICON and HINSTANCE = HINSTANCE and HDC = HDC val isHiconNull = isHgdiObjNull fun checkIcon c = (checkResult(not(isHiconNull c)); c) val CopyIcon = checkIcon o winCall1 (user "CopyIcon") (cHICON) cHICON val DestroyIcon = checkResult o winCall1 (user "DestroyIcon") (cHICON) cBool val DrawIcon = checkResult o winCall4 (user "DrawIcon") (cHDC, cInt, cInt, cHICON) cBool val ExtractIcon = winCall3 (user "ExtractIcon") (cHINSTANCE, cString, cUint) cHICON val LoadIcon = checkIcon o winCall2 (user "LoadIconA") (cHINSTANCE, cRESID) cHICON (* Built-in icons. *) val IDI_APPLICATION = Resource.IdAsInt 32512 val IDI_ASTERISK = Resource.IdAsInt 32516 val IDI_EXCLAMATION = Resource.IdAsInt 32515 val IDI_HAND = Resource.IdAsInt 32513 val IDI_ERROR = IDI_HAND val IDI_INFORMATION = IDI_ASTERISK val IDI_QUESTION = Resource.IdAsInt 32514 val IDI_WARNING = IDI_EXCLAMATION val IDI_WINLOGO = Resource.IdAsInt 32517 (* TODO: CreateIcon - complicated CreateIconFromResource - complicated CreateIconFromResourceEx CreateIconIndirect DrawIconEx ExtractAssociatedIcon ExtractIconEx GetIconInfo LookupIconIdFromDirectory LookupIconIdFromDirectoryEx *) end end; polyml-5.6/mlsource/extra/Win/Keyboard.sml000066400000000000000000000043541265146633400207060ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Keyboard: sig type HWND val EnableWindow : HWND * bool -> bool val GetActiveWindow : unit -> HWND option val GetFocus : unit -> HWND option val IsWindowEnabled : HWND -> bool val SetActiveWindow : HWND -> HWND val SetFocus : HWND option -> HWND option end = struct local open Foreign Base fun checkWindow c = (checkResult(not(isHNull c)); c) in type HWND = HWND val EnableWindow = winCall2 (user "EnableWindow") (cHWND, cBool) cBool val GetActiveWindow = winCall0 (user "GetActiveWindow") () cHWNDOPT val GetFocus = winCall0 (user "GetFocus") () cHWNDOPT val IsWindowEnabled = winCall1 (user "IsWindowEnabled") (cHWND) cBool val SetActiveWindow = checkWindow o winCall1 (user "SetActiveWindow") (cHWND) cHWND (* The argument to SetFocus is an option because we may ignore input. The result may be null if there was an error or if no window had focus. *) val SetFocus = winCall1 (user "SetFocus") (cHWNDOPT) cHWNDOPT end end; (* ActivateKeyboardLayout GetAsyncKeyState GetKeyboardLayout GetKeyboardLayoutList GetKeyboardLayoutName GetKeyboardState GetKeyNameText GetKeyState keybd_event LoadKeyboardLayout MapVirtualKey MapVirtualKeyEx OemKeyScan RegisterHotKey SendInput SetKeyboardState ToAscii ToAsciiEx ToUnicode ToUnicodeEx UnloadKeyboardLayout UnregisterHotKey VkKeyScan VkKeyScanEx Obsolete Functions GetKBCodePage *) polyml-5.6/mlsource/extra/Win/Line.sml000066400000000000000000000130751265146633400200350ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Line : sig type HDC type RECT = { top: int, left: int, bottom: int, right: int } type POINT = { x: int, y: int } datatype PointType = PT_BEZIERTO | PT_BEZIERTOANDCLOSE | PT_LINETO | PT_LINETOANDCLOSE | PT_MOVETO eqtype ArcDirection val AD_CLOCKWISE : ArcDirection val AD_COUNTERCLOCKWISE : ArcDirection val AngleArc : HDC * int * int * int * real * real -> unit val Arc : HDC * int * int * int * int * int * int * int * int -> unit val ArcTo : HDC * int * int * int * int * int * int * int * int -> unit val GetArcDirection : HDC -> ArcDirection val LineTo : HDC * POINT -> unit val MoveToEx : HDC * POINT -> POINT val PolyBezier : HDC * POINT list -> unit val PolyBezierTo : HDC * POINT list -> unit val PolyDraw : HDC * (PointType * POINT) list -> unit val Polyline : HDC * POINT list -> unit val PolylineTo : HDC * POINT list -> unit val SetArcDirection : HDC * ArcDirection -> ArcDirection end = struct local open Foreign Base GdiBase val zeroPoint: POINT = {x=0, y=0} in type HDC = HDC and POINT = POINT and RECT = RECT datatype PointType = datatype PointType local datatype ArcDirection = W of int in type ArcDirection = ArcDirection val ARCDIRECTION = absConversion {abs = W, rep = fn W n => n} cInt val AD_COUNTERCLOCKWISE = W(1) val AD_CLOCKWISE = W(2) end; val AngleArc = winCall6(gdi "AngleArc") (cHDC,cInt,cInt,cDWORD,cFloat,cFloat) (successState "AngleArc") val Arc = winCall9(gdi "Arc") (cHDC,cInt,cInt,cInt,cInt,cInt,cInt,cInt,cInt) (successState "Arc") val ArcTo = winCall9(gdi "ArcTo") (cHDC,cInt,cInt,cInt,cInt,cInt,cInt,cInt,cInt) (successState "ArcTo") val GetArcDirection = winCall1(gdi "GetArcDirection") (cHDC) ARCDIRECTION val SetArcDirection = winCall2(gdi "SetArcDirection") (cHDC,ARCDIRECTION) ARCDIRECTION local val lineTo = winCall3 (gdi "LineTo") (cHDC,cInt,cInt) (successState "LineTo") in fun LineTo (h,({x,y}:POINT)) = lineTo (h,x,y) end local val moveToEx = winCall4 (gdi "MoveToEx") (cHDC, cInt, cInt, cStar cPoint) (successState "MoveToEx") in fun MoveToEx(h, ({x,y}:POINT)) = let val p = ref zeroPoint in moveToEx(h, x, y, p); !p end end local val polyBezier = winCall3 (gdi "PolyBezier") (cHDC,cPointer,cDWORD) (successState "PolyBezier") and polyBezierTo = winCall3 (gdi "PolyBezierTo") (cHDC,cPointer,cDWORD) (successState "PolyBezierTo") and polyDraw = winCall4 (gdi "PolyDraw") (cHDC,cPointer,cPointer, cInt) (successState "PolyDraw") and polyLine = winCall3 (gdi "Polyline") (cHDC,cPointer,cInt) (successState "Polyline") and polyLineTo = winCall3 (gdi "PolylineTo") (cHDC,cPointer,cDWORD) (successState "PolylineTo") val ptList = list2Vector cPoint val pTypeList = list2Vector cPOINTTYPE in fun PolyBezier (h, pts) = let val (ptarr, count) = ptList pts in polyBezier(h, ptarr, count) handle ex => (Memory.free ptarr; raise ex); Memory.free ptarr end and PolyBezierTo (h, pts) = let val (ptarr, count) = ptList pts in polyBezierTo(h, ptarr, count) handle ex => (Memory.free ptarr; raise ex); Memory.free ptarr end and PolyDraw (h, tplist: (PointType * POINT) list) = let val (typeList, pl) = ListPair.unzip tplist val (ptarr, count) = ptList pl val (farr, _) = pTypeList typeList in polyDraw(h, ptarr, farr,count) handle ex => (Memory.free ptarr; Memory.free farr; raise ex); Memory.free ptarr; Memory.free farr end and Polyline (h, pts: POINT list) = let val (ptarr, count) = ptList pts in polyLine(h, ptarr, count) handle ex => (Memory.free ptarr; raise ex); Memory.free ptarr end and PolylineTo (h, pts: POINT list) = let val (ptarr, count) = ptList pts in polyLineTo(h, ptarr, count) handle ex => (Memory.free ptarr; raise ex); Memory.free ptarr end end (* Other Line and Curve functions: LineDDA LineDDAProc PolyPolyline *) end end; polyml-5.6/mlsource/extra/Win/Listbox.sml000066400000000000000000000152101265146633400205630ustar00rootroot00000000000000(* Copyright (c) 2001 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Listboxes. *) structure Listbox: sig structure Style: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW: flags and WS_CHILDWINDOW: flags and LBS_NOTIFY: flags and LBS_SORT: flags and LBS_NOREDRAW: flags and LBS_MULTIPLESEL: flags and LBS_OWNERDRAWFIXED: flags and LBS_OWNERDRAWVARIABLE: flags and LBS_HASSTRINGS: flags and LBS_USETABSTOPS: flags and LBS_NOINTEGRALHEIGHT: flags and LBS_MULTICOLUMN: flags and LBS_WANTKEYBOARDINPUT: flags and LBS_EXTENDEDSEL: flags and LBS_DISABLENOSCROLL: flags and LBS_NODATA: flags and LBS_NOSEL: flags and LBS_STANDARD: flags end structure Notifications: sig val LBN_SELCHANGE: int val LBN_DBLCLK: int val LBN_SELCANCEL: int val LBN_SETFOCUS: int val LBN_KILLFOCUS: int end datatype LBDirAttr = DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_DIRECTORY | DDL_ARCHIVE | DDL_POSTMSGS | DDL_DRIVES | DDL_EXCLUSIVE end = struct structure Style = struct open Window.Style (* Include all the windows styles. *) val LBS_NOTIFY = fromWord 0wx0001 val LBS_SORT = fromWord 0wx0002 val LBS_NOREDRAW = fromWord 0wx0004 val LBS_MULTIPLESEL = fromWord 0wx0008 val LBS_OWNERDRAWFIXED = fromWord 0wx0010 val LBS_OWNERDRAWVARIABLE = fromWord 0wx0020 val LBS_HASSTRINGS = fromWord 0wx0040 val LBS_USETABSTOPS = fromWord 0wx0080 val LBS_NOINTEGRALHEIGHT = fromWord 0wx0100 val LBS_MULTICOLUMN = fromWord 0wx0200 val LBS_WANTKEYBOARDINPUT = fromWord 0wx0400 val LBS_EXTENDEDSEL = fromWord 0wx0800 val LBS_DISABLENOSCROLL = fromWord 0wx1000 val LBS_NODATA = fromWord 0wx2000 val LBS_NOSEL = fromWord 0wx4000 val LBS_STANDARD = flags[LBS_NOTIFY, LBS_SORT, WS_VSCROLL, WS_BORDER] val all = flags[Window.Style.all, LBS_NOTIFY, LBS_SORT, LBS_NOREDRAW, LBS_MULTIPLESEL, LBS_OWNERDRAWFIXED, LBS_OWNERDRAWVARIABLE, LBS_HASSTRINGS, LBS_USETABSTOPS, LBS_NOINTEGRALHEIGHT, LBS_MULTICOLUMN, LBS_WANTKEYBOARDINPUT, LBS_EXTENDEDSEL, LBS_DISABLENOSCROLL, LBS_NODATA, LBS_NOSEL] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure Notifications = struct val LBN_SELCHANGE = 1 val LBN_DBLCLK = 2 val LBN_SELCANCEL = 3 val LBN_SETFOCUS = 4 val LBN_KILLFOCUS = 5 end datatype LBDirAttr = datatype ComboBase.CBDirAttr end; (* let open Listbox.Style val flagTable = [(LBS_NOTIFY, "LBS_NOTIFY"), (LBS_SORT, "LBS_SORT"), (LBS_NOREDRAW, "LBS_NOREDRAW"), (LBS_MULTIPLESEL, "LBS_MULTIPLESEL"), (LBS_OWNERDRAWFIXED, "LBS_OWNERDRAWFIXED"), (LBS_OWNERDRAWVARIABLE, "LBS_OWNERDRAWVARIABLE"), (LBS_HASSTRINGS, "LBS_HASSTRINGS"), (LBS_USETABSTOPS, "LBS_USETABSTOPS"), (LBS_NOINTEGRALHEIGHT, "LBS_NOINTEGRALHEIGHT"), (LBS_MULTICOLUMN, "LBS_MULTICOLUMN"), (LBS_WANTKEYBOARDINPUT, "LBS_WANTKEYBOARDINPUT"), (LBS_EXTENDEDSEL, "LBS_EXTENDEDSEL"), (LBS_DISABLENOSCROLL, "LBS_DISABLENOSCROLL"), (LBS_NODATA, "LBS_NODATA"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *)polyml-5.6/mlsource/extra/Win/Locale.sml000066400000000000000000000100651265146633400203410ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Locale: sig datatype PrimaryLanguage = LANG_AFRIKAANS | LANG_ALBANIAN | LANG_ARABIC | LANG_BASQUE | LANG_BELARUSIAN | LANG_BULGARIAN | LANG_CATALAN | LANG_CHINESE | LANG_CROATIAN | LANG_CZECH | LANG_DANISH | LANG_DUTCH | LANG_ENGLISH | LANG_ESTONIAN | LANG_FAEROESE | LANG_FARSI | LANG_FINNISH | LANG_FRENCH | LANG_GERMAN | LANG_GREEK | LANG_HEBREW | LANG_HUNGARIAN | LANG_ICELANDIC | LANG_INDONESIAN | LANG_ITALIAN | LANG_JAPANESE | LANG_KOREAN | LANG_LATVIAN | LANG_LITHUANIAN | LANG_NORWEGIAN | LANG_POLISH | LANG_PORTUGUESE | LANG_ROMANIAN | LANG_RUSSIAN | LANG_SERBIAN | LANG_SLOVAK | LANG_SLOVENIAN | LANG_SPANISH | LANG_SWEDISH | LANG_THAI | LANG_TURKISH | LANG_UKRANIAN | LANG_VIETNAMESE | LANG_NEUTRAL datatype SubLanguage = SUBLANG_ARABIC_ALGERIA | SUBLANG_ARABIC_BAHRAIN | SUBLANG_ARABIC_EGYPT | SUBLANG_ARABIC_IRAQ | SUBLANG_ARABIC_JORDAN | SUBLANG_ARABIC_KUWAIT | SUBLANG_ARABIC_LEBANON | SUBLANG_ARABIC_LIBYA | SUBLANG_ARABIC_MOROCCO | SUBLANG_ARABIC_OMAN | SUBLANG_ARABIC_QATAR | SUBLANG_ARABIC_SAUDI_ARABIA | SUBLANG_ARABIC_SYRIA | SUBLANG_ARABIC_TUNISIA | SUBLANG_ARABIC_UAE | SUBLANG_ARABIC_YEMEN | SUBLANG_CHINESE_HONGKONG | SUBLANG_CHINESE_SIMPLIFIED | SUBLANG_CHINESE_SINGAPORE | SUBLANG_CHINESE_TRADITIONAL | SUBLANG_DUTCH | SUBLANG_DUTCH_BELGIAN | SUBLANG_ENGLISH_AUS | SUBLANG_ENGLISH_BELIZE | SUBLANG_ENGLISH_CAN | SUBLANG_ENGLISH_CARIBBEAN | SUBLANG_ENGLISH_EIRE | SUBLANG_ENGLISH_JAMAICA | SUBLANG_ENGLISH_NZ | SUBLANG_ENGLISH_SOUTH_AFRICA | SUBLANG_ENGLISH_TRINIDAD | SUBLANG_ENGLISH_UK | SUBLANG_ENGLISH_US | SUBLANG_FRENCH | SUBLANG_FRENCH_BELGIAN | SUBLANG_FRENCH_CANADIAN | SUBLANG_FRENCH_LUXEMBOURG | SUBLANG_FRENCH_SWISS | SUBLANG_GERMAN | SUBLANG_GERMAN_AUSTRIAN | SUBLANG_GERMAN_LIECHTENSTEIN | SUBLANG_GERMAN_LUXEMBOURG | SUBLANG_GERMAN_SWISS | SUBLANG_ITALIAN | SUBLANG_ITALIAN_SWISS | SUBLANG_KOREAN | SUBLANG_KOREAN_JOHAB | SUBLANG_NORWEGIAN_BOKMAL | SUBLANG_NORWEGIAN_NYNORSK | SUBLANG_PORTUGUESE | SUBLANG_PORTUGUESE_BRAZILIAN | SUBLANG_SERBIAN_CYRILLIC | SUBLANG_SERBIAN_LATIN | SUBLANG_SPANISH | SUBLANG_SPANISH_ARGENTINA | SUBLANG_SPANISH_BOLIVIA | SUBLANG_SPANISH_CHILE | SUBLANG_SPANISH_COLOMBIA | SUBLANG_SPANISH_COSTA_RICA | SUBLANG_SPANISH_DOMINICAN_REPUBLIC | SUBLANG_SPANISH_ECUADOR | SUBLANG_SPANISH_EL_SALVADOR | SUBLANG_SPANISH_GUATEMALA | SUBLANG_SPANISH_HONDURAS | SUBLANG_SPANISH_MEXICAN | SUBLANG_SPANISH_MODERN | SUBLANG_SPANISH_NICARAGUA | SUBLANG_SPANISH_PANAMA | SUBLANG_SPANISH_PARAGUAY | SUBLANG_SPANISH_PERU | SUBLANG_SPANISH_PUERTO_RICO | SUBLANG_SPANISH_URUGUAY | SUBLANG_SPANISH_VENEZUELA | SUBLANG_SWEDISH | SUBLANG_SWEDISH_FINLAND | SUBLANG_NEUTRAL | SUBLANG_DEFAULT | SUBLANG_SYS_DEFAULT datatype LANGID = MAKELANGID of PrimaryLanguage * SubLanguage val GetUserDefaultLangID: unit -> LANGID and GetSystemDefaultLangID: unit -> LANGID end = struct local open Foreign Base in open LocaleBase val GetUserDefaultLangID = winCall0 (kernel "GetUserDefaultLangID") () LANGID and GetSystemDefaultLangID = winCall0 (kernel "GetSystemDefaultLangID") () LANGID end end; polyml-5.6/mlsource/extra/Win/LocaleBase.sml000066400000000000000000000232041265146633400211330ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure LocaleBase = struct local open Foreign Base in datatype PrimaryLanguage = LANG_AFRIKAANS | LANG_ICELANDIC | LANG_ALBANIAN | LANG_INDONESIAN | LANG_ARABIC | LANG_ITALIAN | LANG_BASQUE | LANG_JAPANESE | LANG_BELARUSIAN | LANG_KOREAN | LANG_BULGARIAN | LANG_LATVIAN | LANG_CATALAN | LANG_LITHUANIAN | LANG_CHINESE | LANG_NEUTRAL | LANG_CROATIAN | LANG_NORWEGIAN | LANG_CZECH | LANG_POLISH | LANG_DANISH | LANG_PORTUGUESE | LANG_DUTCH | LANG_ROMANIAN | LANG_ENGLISH | LANG_RUSSIAN | LANG_ESTONIAN | LANG_SERBIAN | LANG_FAEROESE | LANG_SLOVAK | LANG_FARSI | LANG_SLOVENIAN | LANG_FINNISH | LANG_SPANISH | LANG_FRENCH | LANG_SWEDISH | LANG_GERMAN | LANG_THAI | LANG_GREEK | LANG_TURKISH | LANG_HEBREW | LANG_UKRANIAN | LANG_HUNGARIAN | LANG_VIETNAMESE datatype SubLanguage = SUBLANG_ARABIC_SAUDI_ARABIA | SUBLANG_GERMAN | SUBLANG_ARABIC_IRAQ | SUBLANG_GERMAN_SWISS | SUBLANG_ARABIC_EGYPT | SUBLANG_GERMAN_AUSTRIAN | SUBLANG_ARABIC_LIBYA | SUBLANG_GERMAN_LUXEMBOURG | SUBLANG_ARABIC_ALGERIA | SUBLANG_GERMAN_LIECHTENSTEIN | SUBLANG_ARABIC_MOROCCO | SUBLANG_ITALIAN | SUBLANG_ARABIC_TUNISIA | SUBLANG_ITALIAN_SWISS | SUBLANG_ARABIC_OMAN | SUBLANG_KOREAN | SUBLANG_ARABIC_YEMEN | SUBLANG_KOREAN_JOHAB | SUBLANG_ARABIC_SYRIA | SUBLANG_NEUTRAL | SUBLANG_ARABIC_JORDAN | SUBLANG_NORWEGIAN_BOKMAL | SUBLANG_ARABIC_LEBANON | SUBLANG_NORWEGIAN_NYNORSK | SUBLANG_ARABIC_KUWAIT | SUBLANG_PORTUGUESE | SUBLANG_ARABIC_UAE | SUBLANG_PORTUGUESE_BRAZILIAN | SUBLANG_ARABIC_BAHRAIN | SUBLANG_SERBIAN_LATIN | SUBLANG_ARABIC_QATAR | SUBLANG_SERBIAN_CYRILLIC | SUBLANG_CHINESE_TRADITIONAL | SUBLANG_SPANISH | SUBLANG_CHINESE_SIMPLIFIED | SUBLANG_SPANISH_MEXICAN | SUBLANG_CHINESE_HONGKONG | SUBLANG_SPANISH_MODERN | SUBLANG_CHINESE_SINGAPORE | SUBLANG_SPANISH_GUATEMALA | SUBLANG_DEFAULT | SUBLANG_SPANISH_COSTA_RICA | SUBLANG_DUTCH | SUBLANG_SPANISH_PANAMA | SUBLANG_DUTCH_BELGIAN | SUBLANG_SPANISH_DOMINICAN_REPUBLIC | SUBLANG_ENGLISH_US | SUBLANG_SPANISH_VENEZUELA | SUBLANG_ENGLISH_UK | SUBLANG_SPANISH_COLOMBIA | SUBLANG_ENGLISH_AUS | SUBLANG_SPANISH_PERU | SUBLANG_ENGLISH_CAN | SUBLANG_SPANISH_ARGENTINA | SUBLANG_ENGLISH_NZ | SUBLANG_SPANISH_ECUADOR | SUBLANG_ENGLISH_EIRE | SUBLANG_SPANISH_CHILE | SUBLANG_ENGLISH_SOUTH_AFRICA | SUBLANG_SPANISH_URUGUAY | SUBLANG_ENGLISH_JAMAICA | SUBLANG_SPANISH_PARAGUAY | SUBLANG_ENGLISH_CARIBBEAN | SUBLANG_SPANISH_BOLIVIA | SUBLANG_ENGLISH_BELIZE | SUBLANG_SPANISH_EL_SALVADOR | SUBLANG_ENGLISH_TRINIDAD | SUBLANG_SPANISH_HONDURAS | SUBLANG_FRENCH | SUBLANG_SPANISH_NICARAGUA | SUBLANG_FRENCH_BELGIAN | SUBLANG_SPANISH_PUERTO_RICO | SUBLANG_FRENCH_CANADIAN | SUBLANG_SWEDISH | SUBLANG_FRENCH_SWISS | SUBLANG_SWEDISH_FINLAND | SUBLANG_FRENCH_LUXEMBOURG | SUBLANG_SYS_DEFAULT local val tab = [ (LANG_NEUTRAL, 0x00), (LANG_AFRIKAANS, 0x36), (LANG_ALBANIAN, 0x1c), (LANG_ARABIC, 0x01), (LANG_BASQUE, 0x2d), (LANG_BELARUSIAN, 0x23), (LANG_BULGARIAN, 0x02), (LANG_CATALAN, 0x03), (LANG_CHINESE, 0x04), (LANG_CROATIAN, 0x1a), (LANG_CZECH, 0x05), (LANG_DANISH, 0x06), (LANG_DUTCH, 0x13), (LANG_ENGLISH, 0x09), (LANG_ESTONIAN, 0x25), (LANG_FAEROESE, 0x38), (LANG_FARSI, 0x29), (LANG_FINNISH, 0x0b), (LANG_FRENCH, 0x0c), (LANG_GERMAN, 0x07), (LANG_GREEK, 0x08), (LANG_HEBREW, 0x0d), (LANG_HUNGARIAN, 0x0e), (LANG_ICELANDIC, 0x0f), (LANG_INDONESIAN, 0x21), (LANG_ITALIAN, 0x10), (LANG_JAPANESE, 0x11), (LANG_KOREAN, 0x12), (LANG_LATVIAN, 0x26), (LANG_LITHUANIAN, 0x27), (LANG_NORWEGIAN, 0x14), (LANG_POLISH, 0x15), (LANG_PORTUGUESE, 0x16), (LANG_ROMANIAN, 0x18), (LANG_RUSSIAN, 0x19), (LANG_SERBIAN, 0x1a), (LANG_SLOVAK, 0x1b), (LANG_SLOVENIAN, 0x24), (LANG_SPANISH, 0x0a), (LANG_SWEDISH, 0x1d), (LANG_THAI, 0x1e), (LANG_TURKISH, 0x1f), (LANG_UKRANIAN, 0x22), (LANG_VIETNAMESE, 0x2a)] in val (fromPrim, toPrim) = tableLookup(tab, NONE) end local val tab = [ (SUBLANG_NEUTRAL, 0x00), (SUBLANG_DEFAULT, 0x01), (SUBLANG_SYS_DEFAULT, 0x02), (SUBLANG_ARABIC_SAUDI_ARABIA, 0x01), (SUBLANG_ARABIC_IRAQ, 0x02), (SUBLANG_ARABIC_EGYPT, 0x03), (SUBLANG_ARABIC_LIBYA, 0x04), (SUBLANG_ARABIC_ALGERIA, 0x05), (SUBLANG_ARABIC_MOROCCO, 0x06), (SUBLANG_ARABIC_TUNISIA, 0x07), (SUBLANG_ARABIC_OMAN, 0x08), (SUBLANG_ARABIC_YEMEN, 0x09), (SUBLANG_ARABIC_SYRIA, 0x0a), (SUBLANG_ARABIC_JORDAN, 0x0b), (SUBLANG_ARABIC_LEBANON, 0x0c), (SUBLANG_ARABIC_KUWAIT, 0x0d), (SUBLANG_ARABIC_UAE, 0x0e), (SUBLANG_ARABIC_BAHRAIN, 0x0f), (SUBLANG_ARABIC_QATAR, 0x10), (SUBLANG_CHINESE_TRADITIONAL, 0x01), (SUBLANG_CHINESE_SIMPLIFIED, 0x02), (SUBLANG_CHINESE_HONGKONG, 0x03), (SUBLANG_CHINESE_SINGAPORE, 0x04), (SUBLANG_DUTCH, 0x01), (SUBLANG_DUTCH_BELGIAN, 0x02), (SUBLANG_ENGLISH_US, 0x01), (SUBLANG_ENGLISH_UK, 0x02), (SUBLANG_ENGLISH_AUS, 0x03), (SUBLANG_ENGLISH_CAN, 0x04), (SUBLANG_ENGLISH_NZ, 0x05), (SUBLANG_ENGLISH_EIRE, 0x06), (SUBLANG_ENGLISH_SOUTH_AFRICA, 0x07), (SUBLANG_ENGLISH_JAMAICA, 0x08), (SUBLANG_ENGLISH_CARIBBEAN, 0x09), (SUBLANG_ENGLISH_BELIZE, 0x0a), (SUBLANG_ENGLISH_TRINIDAD, 0x0b), (SUBLANG_FRENCH, 0x01), (SUBLANG_FRENCH_BELGIAN, 0x02), (SUBLANG_FRENCH_CANADIAN, 0x03), (SUBLANG_FRENCH_SWISS, 0x04), (SUBLANG_FRENCH_LUXEMBOURG, 0x05), (SUBLANG_GERMAN, 0x01), (SUBLANG_GERMAN_SWISS, 0x02), (SUBLANG_GERMAN_AUSTRIAN, 0x03), (SUBLANG_GERMAN_LUXEMBOURG, 0x04), (SUBLANG_GERMAN_LIECHTENSTEIN, 0x05), (SUBLANG_ITALIAN, 0x01), (SUBLANG_ITALIAN_SWISS, 0x02), (SUBLANG_KOREAN, 0x01), (SUBLANG_KOREAN_JOHAB, 0x02), (SUBLANG_NORWEGIAN_BOKMAL, 0x01), (SUBLANG_NORWEGIAN_NYNORSK, 0x02), (SUBLANG_PORTUGUESE, 0x02), (SUBLANG_PORTUGUESE_BRAZILIAN, 0x01), (SUBLANG_SERBIAN_LATIN, 0x02), (SUBLANG_SERBIAN_CYRILLIC, 0x03), (SUBLANG_SPANISH, 0x01), (SUBLANG_SPANISH_MEXICAN, 0x02), (SUBLANG_SPANISH_MODERN, 0x03), (SUBLANG_SPANISH_GUATEMALA, 0x04), (SUBLANG_SPANISH_COSTA_RICA, 0x05), (SUBLANG_SPANISH_PANAMA, 0x06), (SUBLANG_SPANISH_DOMINICAN_REPUBLIC, 0x07), (SUBLANG_SPANISH_VENEZUELA, 0x08), (SUBLANG_SPANISH_COLOMBIA, 0x09), (SUBLANG_SPANISH_PERU, 0x0a), (SUBLANG_SPANISH_ARGENTINA, 0x0b), (SUBLANG_SPANISH_ECUADOR, 0x0c), (SUBLANG_SPANISH_CHILE, 0x0d), (SUBLANG_SPANISH_URUGUAY, 0x0e), (SUBLANG_SPANISH_PARAGUAY, 0x0f), (SUBLANG_SPANISH_BOLIVIA, 0x10), (SUBLANG_SPANISH_EL_SALVADOR, 0x11), (SUBLANG_SPANISH_HONDURAS, 0x12), (SUBLANG_SPANISH_NICARAGUA, 0x13), (SUBLANG_SPANISH_PUERTO_RICO, 0x14), (SUBLANG_SWEDISH, 0x01), (SUBLANG_SWEDISH_FINLAND, 0x02)] in val (fromSub, toSub) = tableLookup(tab, NONE) end datatype LANGID = MAKELANGID of PrimaryLanguage * SubLanguage local fun fromLANGID(MAKELANGID(prim, sub)) = IntInf.orb(fromPrim prim, IntInf.<<(fromSub sub, 0w10)) (* It seems that GetUserDefaultLangID at least sets the top word to something odd so we mask both parts. *) fun toLANGID l = MAKELANGID( toPrim(IntInf.andb(l, 0x3ff)), toSub(IntInf.andb(IntInf.~>>(l, 0w10), 0x3f)) ) in val LANGID: LANGID conversion = absConversion {abs = toLANGID, rep = fromLANGID} cUshort end end end; polyml-5.6/mlsource/extra/Win/MESSAGE.signature.sml000066400000000000000000000737171265146633400222430ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature MESSAGE = sig datatype ControlType = ODT_BUTTON | ODT_COMBOBOX | ODT_LISTBOX | ODT_MENU | ODT_STATIC datatype ImageType = IMAGE_BITMAP | IMAGE_CURSOR | IMAGE_ENHMETAFILE | IMAGE_ICON type HGDIOBJ and HWND and HMENU and HICON and HINSTANCE and HDC and HFONT and HRGN and HDROP type RECT = { left: int, top: int, right: int, bottom: int } type POINT = { x: int, y: int } datatype HitTest = HTBORDER | HTBOTTOM | HTBOTTOMLEFT | HTBOTTOMRIGHT | HTCAPTION | HTCLIENT | HTCLOSE | HTERROR | HTGROWBOX | HTHELP | HTHSCROLL | HTLEFT | HTMENU | HTMAXBUTTON | HTMINBUTTON | HTNOWHERE | HTREDUCE | HTRIGHT | HTSIZE | HTSYSMENU | HTTOP | HTTOPLEFT | HTTOPRIGHT | HTTRANSPARENT | HTVSCROLL | HTZOOM datatype LRESULT = LRESINT of int | LRESHANDLE of HGDIOBJ type KeyData type windowFlags and findReplaceFlags datatype ScrollDirection = SB_BOTTOM | SB_ENDSCROLL | SB_LEFT | SB_LINEDOWN | SB_LINELEFT | SB_LINERIGHT | SB_LINEUP | SB_PAGEDOWN | SB_PAGELEFT | SB_PAGERIGHT | SB_PAGEUP | SB_RIGHT | SB_THUMBPOSITION | SB_THUMBTRACK | SB_TOP type WindowPositionStyle datatype MouseKeyFlags = MK_LBUTTON | MK_RBUTTON | MK_SHIFT | MK_CONTROL | MK_MBUTTON type ClipboardFormat and ClassType datatype MarginSettings = UseFontInfo | Margins of {left: int option, right: int option } datatype MDITileFlags = MDITILE_VERTICAL | MDITILE_HORIZONTAL | MDITILE_SKIPDISABLED datatype EMCharFromPos = EMcfpEdit of POINT | EMcfpRichEdit of POINT | EMcfpUnknown of SysWord.word datatype SystemCommand = SC_ARRANGE | SC_CLOSE | SC_CONTEXTHELP | SC_DEFAULT | SC_HOTKEY | SC_HSCROLL | SC_KEYMENU | SC_MAXIMIZE | SC_MINIMIZE | SC_MONITORPOWER | SC_MOUSEMENU | SC_MOVE | SC_NEXTWINDOW | SC_PREVWINDOW | SC_RESTORE | SC_SCREENSAVE | SC_SEPARATOR | SC_SIZE | SC_TASKLIST | SC_VSCROLL datatype WMActivateOptions = WA_ACTIVE | WA_CLICKACTIVE | WA_INACTIVE datatype WMPrintOption = PRF_CHECKVISIBLE | PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED datatype WMSizeOptions = SIZE_MAXHIDE | SIZE_MAXIMIZED | SIZE_MAXSHOW | SIZE_MINIMIZED | SIZE_RESTORED datatype HelpHandle = MenuHandle of HMENU | WindowHandle of HWND (* Passed in the lpParam argument of a WM_NOTIFY message. TODO: Many of these have additional information. *) datatype Notification = NM_OUTOFMEMORY | NM_CLICK | NM_DBLCLK | NM_RETURN | NM_RCLICK | NM_RDBLCLK | NM_SETFOCUS | NM_KILLFOCUS | NM_CUSTOMDRAW | NM_HOVER | NM_NCHITTEST | NM_KEYDOWN | NM_RELEASEDCAPTURE | NM_SETCURSOR | NM_CHAR | NM_TOOLTIPSCREATED | NM_LDOWN | NM_RDOWN | NM_THEMECHANGED | LVN_ITEMCHANGING | LVN_ITEMCHANGED | LVN_INSERTITEM | LVN_DELETEITEM | LVN_DELETEALLITEMS | LVN_BEGINLABELEDIT | LVN_ENDLABELEDIT | LVN_COLUMNCLICK | LVN_BEGINDRAG | LVN_BEGINRDRAG | LVN_GETDISPINFO | LVN_SETDISPINFO | LVN_KEYDOWN | LVN_GETINFOTIP | HDN_ITEMCHANGING | HDN_ITEMCHANGED | HDN_ITEMCLICK | HDN_ITEMDBLCLICK | HDN_DIVIDERDBLCLICK | HDN_BEGINTRACK | HDN_ENDTRACK | HDN_TRACK | HDN_ENDDRAG | HDN_BEGINDRAG | HDN_GETDISPINFO | TVN_SELCHANGING | TVN_SELCHANGED | TVN_GETDISPINFO | TVN_SETDISPINFO | TVN_ITEMEXPANDING | TVN_ITEMEXPANDED | TVN_BEGINDRAG | TVN_BEGINRDRAG | TVN_DELETEITEM | TVN_BEGINLABELEDIT | TVN_ENDLABELEDIT | TVN_KEYDOWN | TVN_GETINFOTIP | TVN_SINGLEEXPAND | TTN_GETDISPINFO of string ref | TTN_SHOW | TTN_POP | TCN_KEYDOWN | TCN_SELCHANGE | TCN_SELCHANGING | TBN_GETBUTTONINFO | TBN_BEGINDRAG | TBN_ENDDRAG | TBN_BEGINADJUST | TBN_ENDADJUST | TBN_RESET | TBN_QUERYINSERT | TBN_QUERYDELETE | TBN_TOOLBARCHANGE | TBN_CUSTHELP | TBN_DROPDOWN | TBN_HOTITEMCHANGE | TBN_DRAGOUT | TBN_DELETINGBUTTON | TBN_GETDISPINFO | TBN_GETINFOTIP | UDN_DELTAPOS | RBN_GETOBJECT | RBN_LAYOUTCHANGED | RBN_AUTOSIZE | RBN_BEGINDRAG | RBN_ENDDRAG | RBN_DELETINGBAND | RBN_DELETEDBAND | RBN_CHILDSIZE | CBEN_GETDISPINFO | CBEN_DRAGBEGIN | IPN_FIELDCHANGED | SBN_SIMPLEMODECHANGE | PGN_SCROLL | PGN_CALCSIZE | NM_OTHER of int (* Catch-all for other cases. *) datatype Message = WM_NULL | WM_ACTIVATE of {active: WMActivateOptions, minimize: bool } (* Indicates a change in activation state *) | WM_ACTIVATEAPP of {active: bool, threadid: int } (* Notifies applications when a new task activates *) | WM_ASKCBFORMATNAME of { length: int, formatName: string ref} (* Retrieves the name of the clipboard format *) | WM_CANCELJOURNAL (* Notifies application when user cancels journaling *) | WM_CANCELMODE (* Notifies a Window to cancel internal modes *) | WM_CHANGECBCHAIN of { removed: HWND, next: HWND } (* Notifies clipboard viewer of removal from chain *) | WM_CHAR of {charCode: char, data: KeyData } (* Indicates the user pressed a character key *) | WM_CHARTOITEM of {key: int, caretpos: int, listbox: HWND } (* Provides list-box keystrokes to owner Window *) | WM_CHILDACTIVATE (* Notifies a child Window of activation *) (* This is WM_USER+1. It's only used in a GetFont dialogue box. | WM_CHOOSEFONT_GETLOGFONT of LOGFONT ref *) (* Retrieves LOGFONT structure for Font dialog box *) | WM_CLEAR (* Clears an edit control *) | WM_CLOSE (* System Close menu command was chosen *) | WM_COMMAND of {notifyCode: int, wId: int, control: HWND } (* Specifies a command message *) | WM_COMPAREITEM of (* Determines position of combo- or list-box item *) { controlid: int, ctlType: ControlType, ctlID: int, hItem: HWND, itemID1: int, itemData1: SysWord.word, itemID2: int, itemData2: SysWord.word } | WM_COPY (* Copies a selection to the clipboard *) | WM_CREATE of { instance: HINSTANCE, creation: Foreign.Memory.voidStar, menu: HMENU, parent: HWND, cy: int, cx: int, y: int, x: int, style: windowFlags, name: string, (* The class may be a string or an atom. *) class: ClassType, extendedstyle: int } (* Indicates a Window is being created *) | WM_CTLCOLORBTN of { displaycontext: HDC, button: HWND } (* Button is about to be drawn *) | WM_CTLCOLORDLG of { displaycontext: HDC, dialogbox: HWND } (* Dialog box is about to be drawn *) | WM_CTLCOLOREDIT of { displaycontext: HDC, editcontrol: HWND } (* Control is about to be drawn *) | WM_CTLCOLORLISTBOX of { displaycontext: HDC, listbox: HWND } (* List box is about to be drawn *) | WM_CTLCOLORMSGBOX of { displaycontext: HDC, messagebox: HWND } (* Message box is about to be drawn *) | WM_CTLCOLORSCROLLBAR of { displaycontext: HDC, scrollbar: HWND } (* Indicates scroll bar is about to be drawn *) | WM_CTLCOLORSTATIC of { displaycontext: HDC, staticcontrol: HWND } (* Control is about to be drawn *) (* Note the return value is an HBRUSH *) | WM_CUT (* Deletes a selection and copies it to the clipboard *) | WM_DEADCHAR of { charCode: char, data: KeyData } (* Indicates the user pressed a dead key *) | WM_DELETEITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, item: HWND, itemData: int } (* Indicates owner-draw item or control was altered *) | WM_DESTROY (* Indicates Window is about to be destroyed *) | WM_DESTROYCLIPBOARD (* Notifies owner that the clipboard was emptied *) | WM_DEVMODECHANGE of { devicename: string } (* Indicates the device-mode settings have changed *) | WM_DRAWCLIPBOARD (* Indicates the clipboard's contents have changed *) | WM_DRAWITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, itemAction: int, itemState: int, hItem: HWND , hDC: HDC, rcItem: RECT, itemData: int } (* Indicates owner-draw control/menu needs redrawing *) | WM_DROPFILES of { hDrop: HDROP } (* Indicates that a file has been dropped *) | WM_ENABLE of { enabled: bool } (* Indicates a Window's enable state is changing *) | WM_ENDSESSION of { endsession: bool } (* Indicates whether the Windows session is ending *) | WM_ENTERIDLE of { flag: int, window: HWND } (* Indicates a modal dialog box or menu is idle *) | WM_ENTERMENULOOP of { istrack: bool } (* Indicates entry into menu modal loop *) | WM_EXITMENULOOP of { istrack: bool } (* Indicates exit from menu modal loop *) | WM_ERASEBKGND of { devicecontext: HDC } (* Indicates a Window's background need erasing *) | WM_FONTCHANGE (* Indicates a change in the font-resource pool *) | WM_GETDLGCODE (* Allows dialog procedure to process control input TODO: This has parameters! *) | WM_GETFONT (* Retrieves the font that a control is using *) | WM_GETHOTKEY (* Gets the virtual-key code of a Window's hot key *) | WM_GETMINMAXINFO of { maxSize: POINT ref, maxPosition: POINT ref, minTrackSize: POINT ref, maxTrackSize: POINT ref } (* Gets minimum and maximum sizing information *) | WM_GETTEXT of { length: int, text: string ref } (* Gets the text that corresponds to a Window *) | WM_GETTEXTLENGTH (* Gets length of text associated with a Window *) | WM_HOTKEY of { id: int } (* Hot key has been detected *) | WM_HSCROLL of { value: ScrollDirection, position: int, scrollbar: HWND } (* Indicates a click in a horizontal scroll bar *) | WM_HSCROLLCLIPBOARD of { viewer: HWND, code: int, position: int } (* Prompts owner to scroll clipboard contents *) | WM_ICONERASEBKGND of { devicecontext: HDC } (* Notifies minimized Window to fill icon background *) | WM_INITDIALOG of { dialog: HWND, initdata: int } (* Initializes a dialog box *) | WM_INITMENU of { menu: HMENU } (* Indicates a menu is about to become active *) | WM_INITMENUPOPUP of { menupopup: HMENU, itemposition: int, isSystemMenu: bool } (* Indicates a pop-up menu is being created *) | WM_KEYDOWN of { virtualKey: int, data: KeyData } (* Indicates a nonsystem key was pressed *) | WM_KEYUP of { virtualKey: int, data: KeyData } (* Indicates a nonsystem key was released *) | WM_KILLFOCUS of { receivefocus: HWND } (* Indicates the Window is losing keyboard focus *) | WM_LBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of left button *) | WM_LBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when left mouse button is pressed *) | WM_LBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when left mouse button is released *) | WM_MBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of middle mouse button *) | WM_MBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when middle mouse button is pressed *) | WM_MBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when middle mouse button is released *) | WM_MDICASCADE of { skipDisabled: bool } (* Arranges MDI child Windows in cascade format *) | WM_MDICREATE of { class: ClassType, title: string, instance: HINSTANCE, x: int, y: int, cx: int, cy: int, style: int, cdata: int } (* Prompts MDI client to create a child Window *) | WM_MDIDESTROY of { child: HWND } (* Closes an MDI child Window *) | WM_MDIGETACTIVE (* Retrieves data about the active MDI child Window *) | WM_MDIICONARRANGE (* Arranges minimized MDI child Windows *) | WM_MDIMAXIMIZE of { child: HWND } (* Maximizes an MDI child Window *) | WM_MDINEXT of { child: HWND, flagnext: bool } (* Activates the next MDI child Window *) | WM_MDIREFRESHMENU (* Refreshes an MDI frame Window's menu *) | WM_MDIRESTORE of { child: HWND } (* Prompts MDI client to restore a child Window *) | WM_MDISETMENU of { frameMenu: HMENU, windowMenu: HMENU } (* Replaces an MDI frame Window's menu *) | WM_MDITILE of { tilingflag: MDITileFlags list } (* Arranges MDI child Windows in tiled format *) | WM_MEASUREITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, itemWidth: int ref, itemHeight: int ref, itemData: int } (* Requests dimensions of owner-draw control or item *) | WM_MENUCHAR of { ch: char, menuflag: MenuBase.MenuFlag, menu: HMENU } (* Indicates an unknown menu mnemonic was pressed *) | WM_MENUSELECT of { menuitem: int, menuflags: MenuBase.MenuFlag list, menu: HMENU } (* Indicates that the user selected a menu item *) | WM_MOUSEACTIVATE of { parent: HWND, hitTest: HitTest, message: int } (* Indicates a mouse click in an inactive Window *) | WM_MOUSEMOVE of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates mouse-cursor movement *) | WM_MOUSEHOVER of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates the mouse hovering in the client area *) | WM_MOUSELEAVE (* Indicates the mouse leaving the client area *) | WM_MOVE of { x: int, y: int } (* Indicates a Window's position has changed *) | WM_NCACTIVATE of { active: bool } (* Changes the active state of nonclient area *) | WM_NCCALCSIZE of { validarea: bool, newrect: RECT ref, oldrect: RECT, oldclientarea: RECT, hwnd: HWND, insertAfter: HWND, x: int, y: int, cx: int, cy: int, style: WindowPositionStyle list} (* Calculates the size of a Window's client area *) | WM_NCCREATE of { instance: HINSTANCE, creation: Foreign.Memory.voidStar, menu: HMENU, parent: HWND, cy: int, cx: int, y: int, x: int, style: windowFlags, name: string, class: ClassType, extendedstyle: int } (* Indicates a Window's nonclient area being created *) | WM_NCDESTROY (* Indicates Window's nonclient area being destroyed *) | WM_NCHITTEST of { x: int, y: int } (* Indicates mouse-cursor movement *) | WM_NCLBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient left button double-click *) | WM_NCLBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates left button pressed in nonclient area *) | WM_NCLBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates left button released in nonclient area *) | WM_NCMBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient middle button double-click *) | WM_NCMBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates middle button pressed in nonclient area *) | WM_NCMBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates middle button released in nonclient area *) | WM_NCMOUSEMOVE of { hitTest: HitTest, x: int, y: int } (* Indicates mouse-cursor movement in nonclient area *) | WM_NCMOUSEHOVER of { hitTest: HitTest, x: int, y: int } (* Indicates the mouse hovering in the nonclient area *) | WM_NCMOUSELEAVE (* Indicates the mouse leaving the nonclient area *) | WM_NCPAINT of { region: HRGN } (* Indicates a Window's frame needs painting *) | WM_NCRBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient right button double-click *) | WM_NCRBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates right button pressed in nonclient area *) | WM_NCRBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates right button released in nonclient area *) | WM_NEXTDLGCTL of { control: int, handleflag: bool } (* Sets focus to different dialog box control *) | WM_PAINT (* Indicates a Window's client area need painting *) | WM_PAINTCLIPBOARD of { clipboard: HWND } (* Prompts owner to display clipboard contents *) | WM_PAINTICON (* Icon is about to be painted *) | WM_PALETTECHANGED of { palChg: HWND } (* Indicates the focus-Window realized its palette *) | WM_PALETTEISCHANGING of { realize: HWND } (* Informs Windows that palette is changing *) | WM_PARENTNOTIFY of { eventflag: int, idchild: int, value: int } (* Notifies parent of child-Window activity *) | WM_PASTE (* Inserts clipboard data into an edit control *) | WM_POWER of { powerevent: int } (* Indicates the system is entering suspended mode *) | WM_QUERYDRAGICON (* Requests a cursor handle for a minimized Window *) | WM_QUERYENDSESSION of { source: int } (* Requests that the Windows session be ended *) | WM_QUERYNEWPALETTE (* Allows a Window to realize its logical palette *) | WM_QUERYOPEN (* Requests that a minimized Window be restored *) | WM_QUEUESYNC (* Delimits CBT messages *) | WM_QUIT of { exitcode: int } (* Requests that an application be terminated *) | WM_RBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of right mouse button *) | WM_RBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when right mouse button is pressed *) | WM_RBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when right mouse button is released *) | WM_RENDERALLFORMATS (* Notifies owner to render all clipboard formats *) | WM_RENDERFORMAT of { format: ClipboardFormat } (* Notifies owner to render clipboard data *) | WM_SETCURSOR of { cursorwindow: HWND, hitTest: HitTest, mousemessage: int } (* Prompts a Window to set the cursor shape *) | WM_SETFOCUS of { losing: HWND } | WM_SETFONT of {font: HFONT, redrawflag: bool } | WM_SETHOTKEY of { virtualKey: int } | WM_SETREDRAW of { redrawflag: bool } | WM_SETTEXT of { text: string } | WM_SHOWWINDOW of { showflag: bool, statusflag: int } | WM_SIZE of { flag: WMSizeOptions, width: int, height: int } | WM_SIZECLIPBOARD of { viewer: HWND} | WM_SYSCHAR of { charCode: char, data: KeyData } | WM_SYSCOLORCHANGE | WM_SYSCOMMAND of { commandvalue: SystemCommand, sysBits: int, p: POINT } | WM_SYSDEADCHAR of { charCode: char, data: KeyData } | WM_SYSKEYDOWN of { virtualKey: int, data: KeyData } | WM_SYSKEYUP of { virtualKey: int, data: KeyData } | WM_TIMECHANGE (* Indicates the system time has been set *) | WM_TIMER of { timerid: int } | WM_UNDO | WM_SYSTEM_OTHER of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_USER of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_APP of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_REGISTERED of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_VKEYTOITEM of { virtualKey: int, caretpos: int, listbox: HWND } | WM_VSCROLL of { value: ScrollDirection, position: int, scrollbar: HWND } | WM_VSCROLLCLIPBOARD of { viewer: HWND, code: int, position: int } | WM_WINDOWPOSCHANGED of { hwnd: HWND, front: HWND, x: int, y: int, width: int, height: int, flags: WindowPositionStyle list } | WM_WINDOWPOSCHANGING of { hwnd: HWND, front: HWND ref, x: int ref, y: int ref, width: int ref, height: int ref, flags: WindowPositionStyle list ref } | WM_NOTIFY of {from: HWND, idCtrl: int, idFrom: int, notification: Notification } | WM_CAPTURECHANGED of { newCapture: HWND } | WM_ENTERSIZEMOVE | WM_EXITSIZEMOVE | WM_PRINT of {hdc: HDC, flags: WMPrintOption list } | WM_PRINTCLIENT of {hdc: HDC, flags: WMPrintOption list } | WM_HELP of { ctrlId: int, itemHandle: HelpHandle, contextId: int, mousePos: POINT } | WM_GETICON of { big: bool } | WM_SETICON of { big: bool, icon: HICON } | WM_CONTEXTMENU of { hwnd: HWND, xPos: int, yPos: int } | WM_DISPLAYCHANGE of { bitsPerPixel: int, xScreen: int, yScreen: int } | EM_CANUNDO | EM_CHARFROMPOS of EMCharFromPos | EM_EMPTYUNDOBUFFER | EM_FMTLINES of {addEOL: bool} | EM_GETFIRSTVISIBLELINE | EM_GETLIMITTEXT | EM_GETLINE of { lineNo: int, size: int, result: string ref } | EM_GETLINECOUNT | EM_GETMARGINS | EM_GETMODIFY | EM_GETPASSWORDCHAR | EM_GETRECT of {rect: RECT ref} | EM_GETSEL of {startPos: int ref, endPos: int ref} | EM_GETTHUMB | EM_LIMITTEXT of {limit: int} | EM_LINEFROMCHAR of {index: int} | EM_LINEINDEX of {line: int} | EM_LINELENGTH of {index: int} | EM_LINESCROLL of {xScroll: int, yScroll: int} | EM_POSFROMCHAR of {index: int} | EM_REPLACESEL of {canUndo: bool, text: string} | EM_SCROLL of {action: ScrollDirection} | EM_SCROLLCARET | EM_SETMARGINS of {margins: MarginSettings} | EM_SETMODIFY of { modified: bool } | EM_SETPASSWORDCHAR of { ch: char } | EM_SETREADONLY of { readOnly: bool } | EM_SETRECT of {rect: RECT} | EM_SETRECTNP of {rect: RECT} | EM_SETSEL of {startPos: int, endPos: int} | EM_SETTABSTOPS of {tabs: IntVector.vector} | EM_UNDO | BM_CLICK | BM_GETCHECK | BM_GETIMAGE of {imageType: ImageType} | BM_GETSTATE | BM_SETCHECK of {state: int} | BM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType} | BM_SETSTATE of {highlight: bool } | BM_SETSTYLE of {redraw: bool, style: windowFlags} | CB_GETEDITSEL of {startPos: int ref, endPos: int ref} | CB_LIMITTEXT of {limit: int} | CB_SETEDITSEL of {startPos: int, endPos: int} | CB_ADDSTRING of { text: string } | CB_DELETESTRING of { index: int } | CB_GETCOUNT | CB_GETCURSEL | CB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string } | CB_GETLBTEXT of { index: int, length: int, text: string ref } | CB_GETLBTEXTLEN of { index: int } | CB_INSERTSTRING of { index: int, text: string } | CB_RESETCONTENT | CB_FINDSTRING of { indexStart: int, text: string } | CB_SELECTSTRING of { indexStart: int, text: string } | CB_SETCURSEL of { index: int } | CB_SHOWDROPDOWN of { show: bool } | CB_GETITEMDATA of { index: int } | CB_SETITEMDATA of { index: int, data: int } | CB_GETDROPPEDCONTROLRECT of { rect: RECT ref } | CB_SETITEMHEIGHT of { index: int, height: int } | CB_GETITEMHEIGHT of { index: int } | CB_SETEXTENDEDUI of { extended: bool } | CB_GETEXTENDEDUI | CB_GETDROPPEDSTATE | CB_FINDSTRINGEXACT of { indexStart: int, text: string } | CB_SETLOCALE of { locale: int } | CB_GETLOCALE | CB_GETTOPINDEX | CB_SETTOPINDEX of { index: int } | CB_GETHORIZONTALEXTENT | CB_SETHORIZONTALEXTENT of { extent: int } | CB_GETDROPPEDWIDTH | CB_SETDROPPEDWIDTH of { width: int } | CB_INITSTORAGE of { items: int, bytes: int } | LB_ADDSTRING of { text: string } | LB_INSERTSTRING of { index: int, text: string } | LB_DELETESTRING of { index: int } | LB_SELITEMRANGEEX of { first: int, last: int } | LB_RESETCONTENT | LB_SETSEL of { select: bool, index: int } | LB_SETCURSEL of { index: int } | LB_GETSEL of { index: int } | LB_GETCURSEL | LB_GETTEXT of { index: int, length: int, text: string ref } | LB_GETTEXTLEN of { index: int } | LB_GETCOUNT | LB_SELECTSTRING of { indexStart: int, text: string } | LB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string } | LB_GETTOPINDEX | LB_FINDSTRING of { indexStart: int, text: string } | LB_GETSELCOUNT | LB_GETSELITEMS of { items: IntArray.array } | LB_SETTABSTOPS of { tabs: IntVector.vector } | LB_GETHORIZONTALEXTENT | LB_SETHORIZONTALEXTENT of { extent: int } | LB_SETCOLUMNWIDTH of { column: int } | LB_ADDFILE of { fileName: string } | LB_SETTOPINDEX of { index: int } | LB_GETITEMRECT of { rect: RECT ref, index: int } | LB_GETITEMDATA of { index: int } | LB_SETITEMDATA of { index: int, data: int } | LB_SELITEMRANGE of { select: bool, first: int, last: int } | LB_SETANCHORINDEX of { index: int } | LB_GETANCHORINDEX | LB_SETCARETINDEX of { index: int, scroll: bool } | LB_GETCARETINDEX | LB_SETITEMHEIGHT of { index: int, height: int } | LB_GETITEMHEIGHT of { index: int } | LB_FINDSTRINGEXACT of { indexStart: int, text: string } | LB_SETLOCALE of { locale: int } (* Should be an abstract type? *) | LB_GETLOCALE (* Result will be the type used above. *) | LB_SETCOUNT of { items: int } | LB_INITSTORAGE of { items: int, bytes: int } | LB_ITEMFROMPOINT of { point: POINT } | STM_GETICON | STM_GETIMAGE of {imageType: ImageType} | STM_SETICON of {icon: HICON} | STM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType} | SBM_SETPOS of { pos: int, redraw: bool } | SBM_GETPOS | SBM_SETRANGE of { minPos: int, maxPos: int } | SBM_SETRANGEREDRAW of { minPos: int, maxPos: int } | SBM_GETRANGE of { minPos: int ref, maxPos: int ref } | SBM_ENABLE_ARROWS of ScrollBase.enableArrows | SBM_SETSCROLLINFO of { info: ScrollBase.SCROLLINFO, options: ScrollBase.ScrollInfoOption list } | SBM_GETSCROLLINFO of { info: ScrollBase.SCROLLINFO ref, options: ScrollBase.ScrollInfoOption list } | FINDMSGSTRING of { flags: findReplaceFlags, findWhat: string, replaceWith: string } type MSG = { msg: Message, hwnd: HWND, time: Time.time, pt: {x: int, y: int} } val GetInputState: unit -> bool val GetMessage: HWND option * int * int -> MSG val GetMessagePos: unit -> POINT val GetMessageTime: unit -> Time.time datatype QueueStatus = QS_ALLPOSTMESSAGE | QS_HOTKEY | QS_KEY | QS_MOUSEBUTTON | QS_MOUSEMOVE | QS_PAINT | QS_POSTMESSAGE | QS_SENDMESSAGE | QS_TIMER val QS_ALLEVENTS: QueueStatus list val QS_ALLINPUT: QueueStatus list val QS_INPUT: QueueStatus list val QS_MOUSE: QueueStatus list val GetQueueStatus: QueueStatus list -> QueueStatus list val InSendMessage: unit -> bool datatype PeekMessageOptions = PM_NOREMOVE | PM_REMOVE val PeekMessage: HWND option * int * int * PeekMessageOptions -> MSG option val PostQuitMessage: int -> unit val RegisterWindowMessage: string -> int val RunApplication: unit -> int val SendMessage: HWND * Message -> LRESULT val PostMessage: HWND * Message -> unit val HWND_BROADCAST: HWND val WaitMessage: unit -> bool (* These last few are just used internally. *) val subclass: HWND * (HWND * Message * 'a -> LRESULT * 'a) * 'a -> (HWND * Message -> LRESULT) val setCallback: (HWND * Message * 'a -> LRESULT * 'a) * 'a -> unit val addModelessDialogue: HWND * (unit->unit) option -> unit val removeCallback: HWND -> unit (*val updateWindowHandle: HWND -> unit*) val compileMessage: Message -> int * SysWord.word * SysWord.word * (unit->unit) val decompileMessage: int * SysWord.word * SysWord.word -> Message val messageReturnFromParams: Message * SysWord.word * SysWord.word * SysWord.word -> LRESULT val updateParamsFromMessage: Message * SysWord.word * SysWord.word -> unit val LPMSG: MSG Foreign.conversion val mainWinProc: (HWND * int * SysWord.word * SysWord.word -> SysWord.word) Foreign.closure end; polyml-5.6/mlsource/extra/Win/Menu.sml000066400000000000000000000564651265146633400200640ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Menu: sig type HMENU and HBITMAP and HWND and HINSTANCE type RECT = { left: int, top: int, right: int, bottom: int } datatype MenuFlag = MF_BYCOMMAND | MF_BYPOSITION | MF_SEPARATOR | MF_ENABLED | MF_GRAYED | MF_DISABLED | MF_UNCHECKED | MF_CHECKED | MF_USECHECKBITMAPS | MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_POPUP | MF_MENUBARBREAK | MF_MENUBREAK | MF_UNHILITE | MF_HILITE | MF_DEFAULT | MF_SYSMENU | MF_HELP | MF_RIGHTJUSTIFY | MF_MOUSESELECT datatype MenuIdOrHandle = MenuHandle of HMENU | MenuId of int datatype MenuItemOptions = MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER datatype MenuItemType = MFT_BITMAP of HBITMAP | MFT_OWNERDRAW of SysWord.word | MFT_SEPARATOR | MFT_STRING of string datatype MenuState = MFS_CHECKED | MFS_DEFAULT | MFS_DISABLED | MFS_ENABLED | MFS_GRAYED | MFS_HILITE | MFS_UNCHECKED | MFS_UNHILITE type MenuItemInfo = { menuType: MenuItemType, menuOptions: MenuItemOptions list, state: MenuState list, wID: int, hSubMenu: HMENU option, hbmpChecked: HBITMAP option, hbmpUnchecked: HBITMAP option, itemData: int } val AppendMenu : HMENU * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit val CheckMenuRadioItem : HMENU * int * int * int * MenuFlag -> unit val CreateMenu : unit -> HMENU val CreatePopupMenu : unit -> HMENU val DeleteMenu : HMENU * int * MenuFlag -> unit val DestroyMenu : HMENU -> unit val DrawMenuBar : HWND -> unit val EnableMenuItem : HMENU * int * MenuFlag -> MenuFlag list val GetMenu : HWND -> HMENU datatype GMDIFlags = GMDI_GOINTOPOPUPS | GMDI_USEDISABLED val GetMenuDefaultItem : HMENU * bool * GMDIFlags list -> int val GetMenuItemCount : HMENU -> int val GetMenuItemID : HMENU -> int val GetMenuItemInfo : HMENU * int * bool -> MenuItemInfo val GetMenuItemRect : HWND * HMENU * int -> RECT val GetMenuState : HMENU * int * MenuFlag -> MenuFlag list * int val GetMenuString : HMENU * int * MenuFlag -> string val GetSubMenu : HMENU * int -> HMENU val GetSystemMenu : HWND * bool -> HMENU val HiliteMenuItem : HWND * HMENU * int * MenuFlag list -> unit val InsertMenu : HMENU * int * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit val IsMenu : HMENU -> bool val LoadMenu : HINSTANCE * Resource.RESID -> HMENU val ModifyMenu : HMENU * int * MenuFlag list * MenuIdOrHandle * MenuItemType -> unit val RemoveMenu : HMENU * int * MenuFlag -> unit val SetMenu : HWND * HMENU option -> unit val SetMenuItemInfo : HMENU * int * bool * MenuItemInfo -> unit val InsertMenuItem : HMENU * int * bool * MenuItemInfo -> unit datatype TrackPopupMenuOptions = TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_CENTERALIGN | TPM_RIGHTALIGN | TPM_TOPALIGN | TPM_VCENTERALIGN | TPM_BOTTOMALIGN | (*TPM_HORIZONTAL | TPM_VERTICAL |*) TPM_NONOTIFY | TPM_RETURNCMD val TrackPopupMenu : HMENU * TrackPopupMenuOptions list * int * int * HWND -> int val SetMenuContextHelpId: HMENU * int -> unit val GetMenuContextHelpId: HMENU -> int end = struct local open Foreign open Base in open MenuBase type HMENU = HMENU and HBITMAP = HBITMAP and RECT = RECT and HWND = HWND and HINSTANCE = HINSTANCE val isHmenuNull = isHmenuNull fun checkMenu c = (checkResult(not(isHmenuNull c)); c) (* Check here means "make active", the opposite of uncheck *) val CheckMenuRadioItem = checkResult o winCall5 (user "CheckMenuRadioItem") (cHMENU, cUint, cUint, cUint, cMENUFLAG) cBool val CreateMenu = checkMenu o winCall0 (user "CreateMenu") () cHMENU val CreatePopupMenu = checkMenu o winCall0 (user "CreatePopupMenu") () cHMENU val DeleteMenu = checkResult o winCall3 (user "DeleteMenu") (cHMENU, cUint, cMENUFLAG) cBool val DestroyMenu = checkResult o winCall1 (user "DestroyMenu") (cHMENU) cBool val DrawMenuBar = checkResult o winCall1 (user "DrawMenuBar") (cHWND) cBool local val enableCall = winCall3(user "EnableMenuItem") (cHMENU, cUint, cMENUFLAG) cUintw in fun EnableMenuItem(hMenu: HMENU, id: int, flags: MenuFlag): MenuFlag list = let val res = enableCall(hMenu, id, flags) in checkResult(res <> ~ 0w1); toMenuFlagSet res end end val GetMenu = winCall1 (user "GetMenu") (cHWND) cHMENU datatype GMDIFlags = GMDI_GOINTOPOPUPS | GMDI_USEDISABLED local val tab = [ (GMDI_USEDISABLED, 0wx0001), (GMDI_GOINTOPOPUPS, 0wx0002) ] in val GMDIFLAGS = tableSetConversion(tab, NONE) end local val callGMDI = winCall3 (user "GetMenuDefaultItem") (cHMENU, cBool, GMDIFLAGS) cUint in fun GetMenuDefaultItem(hMenu: HMENU, m: bool, opts: GMDIFlags list): int = let val res = callGMDI(hMenu, m, opts) in checkResult(res <> ~1); res end end local val getMenuItemCount = winCall1 (user "GetMenuItemCount") (cHMENU) cInt in fun GetMenuItemCount hMenu = case getMenuItemCount hMenu of ~1 => raiseSysErr() | n => n end val GetMenuItemID = winCall1 (user "GetMenuItemID") (cHMENU) cUint local val getMenuString = winCall5 (user "GetMenuStringA") (cHMENU,cUint,cPointer,cInt,cMENUFLAG) (cPOSINT "GetMenuString") in (* We can get the length by passing null first, then get the actual string. *) fun GetMenuString(h,i,f): string = getStringWithNullIsLength(fn (buff, n) => getMenuString(h,i,buff,n,f)) end datatype MenuItemType = MFT_BITMAP of HBITMAP | MFT_SEPARATOR | MFT_STRING of string | MFT_OWNERDRAW of SysWord.word val mft_STRING = 0wx00000000 (* Replaced by MIIM_STRING *) val mft_BITMAP = 0wx00000004 (* Replaced by MIIM_BITMAP and hbmpItem *) val mft_OWNERDRAW = 0wx00000100 val mft_SEPARATOR = 0wx00000800 val mft_POPUP = 0wx00000010 val typeBits = 0wx914 datatype MenuItemOptions = MFT_MENUBARBREAK | MFT_MENUBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER local val tab = [ (MFT_MENUBARBREAK, 0wx00000020: Word32.word), (MFT_MENUBREAK, 0wx00000040), (MFT_RADIOCHECK, 0wx00000200), (MFT_RIGHTORDER, 0wx00002000), (MFT_RIGHTJUSTIFY, 0wx00004000)] in val (fromMFT, toMFT) = tableSetLookup(tab, NONE) end datatype MenuState = MFS_GRAYED | MFS_DISABLED | MFS_CHECKED | MFS_DEFAULT | MFS_HILITE | MFS_ENABLED | MFS_UNCHECKED | MFS_UNHILITE local val tab = [ (MFS_DISABLED, 0wx00000002), (MFS_ENABLED, 0wx00000000), (MFS_GRAYED, 0wx00000003), (MFS_CHECKED, 0wx00000008), (MFS_UNCHECKED, 0wx00000000), (MFS_HILITE, 0wx00000080), (MFS_UNHILITE, 0wx00000000), (MFS_DEFAULT, 0wx00001000)] in val cMENUSTATE = tableSetConversion(tab, NONE) end type MenuItemInfo = { (*mask: int,*) (* Datatype? *) menuType: MenuItemType, menuOptions: MenuItemOptions list, state: MenuState list, wID: int, hSubMenu: HMENU option, hbmpChecked: HBITMAP option, hbmpUnchecked: HBITMAP option, itemData: int } (* Although we can selectively return information it's probably simpler to return the lot. It's only in SetMenuItemInfo where we might want to update only some of the information. To find out if we've got all the string we will have to loop until the value of cch we get back is less than the buffer we passed. *) local (* Flags used in GetItemInfo and SetItemInfo. *) (*val MIIM_STATE = 0x00000001 val MIIM_ID = 0x00000002 val MIIM_SUBMENU = 0x00000004 val MIIM_CHECKMARKS = 0x00000008 (*val MIIM_TYPE = 0x00000010 *) (* Replaced by new fields. *) val MIIM_DATA = 0x00000020 val MIIM_STRING = 0x00000040 (* Added *) val MIIM_BITMAP = 0x00000080 (* Added *) val MIIM_FTYPE = 0x00000100*) val allInfo = 0x1ef val cMENUITEMINFO = cStruct12(cUintw,cUint,cUintw,cMENUSTATE,cUint,cHMENUOPT,cHGDIOBJOPT, cHGDIOBJOPT,cULONG_PTR,cPointer,cUint, cHGDIOBJ) val {ctype={size=sizeMenuItemStruct, ...}, ...} = breakConversion cMENUITEMINFO val sizeMenuItemStruct = Word32.fromLargeWord(Word.toLargeWord sizeMenuItemStruct) (*val (fromCmenuiteminfo, toCmenuiteminfo, menuItemStruct) = breakConversion MENUITEMINFO*) val getMenuItemInfo = winCall4 (user "GetMenuItemInfoA") (cHMENU, cUint, cBool, cStar cMENUITEMINFO) (successState "GetMenuItemInfo") val setMenuItemInfo = winCall4 (user "SetMenuItemInfoA") (cHMENU, cUint, cBool, cConstStar cMENUITEMINFO) (successState "SetMenuItemInfo") val insertMenuItem = winCall4 (user "InsertMenuItemA") (cHMENU, cUint, cBool, cConstStar cMENUITEMINFO) (successState "InsertMenuItem") in fun GetMenuItemInfo(hMenu: HMENU, uItem: int, fByPosition): MenuItemInfo = let (* First request allInfo. Look at the returned type and cch. If cch is non-zero allocate memory of cch+1 and pass memory pointer and cch+1 to get the string. *) val r = ref (sizeMenuItemStruct, allInfo, 0w0, [], 0, NONE, NONE, NONE, 0, Memory.null, 0, hNull) val () = getMenuItemInfo(hMenu, uItem, fByPosition, r) val cch = #11(!r) val str = if cch = 0 then "" else let open Memory val v = malloc (Word.fromInt cch + 0w1) val () = r := (sizeMenuItemStruct, allInfo, 0w0, [], 0, NONE, NONE, NONE, 0, v, cch+1, hNull) in (* Get the string. Updates r *) getMenuItemInfo(hMenu, uItem, fByPosition, r) handle ex => (free v; raise ex); fromCstring v before free v end val (_, _, mtype, state, wID, hSubMenu, hbmpChecked, hbmpUnchecked, itemData, typeData, _, hbmp) = ! r val menuType = if Word32.andb(mtype, mft_BITMAP) <> 0w0 then MFT_BITMAP hbmp else if Word32.andb(mtype, mft_OWNERDRAW) <> 0w0 then MFT_OWNERDRAW(Memory.voidStar2Sysword typeData) else if Word32.andb(mtype, mft_SEPARATOR) <> 0w0 then MFT_SEPARATOR else (* String *) MFT_STRING str (* The options are the other bits in the type field. *) val menuOptions = toMFT(Word32.andb(Word32.notb typeBits, mtype)) in { menuType = menuType, menuOptions = menuOptions, wID = wID, hSubMenu = hSubMenu, hbmpChecked = hbmpChecked, hbmpUnchecked = hbmpUnchecked, itemData = itemData, state = state } end (* It's simplest to set everything. *) fun SetMenuItemInfo(hMenu: HMENU, uItem: int, fByPosition, ({menuType, menuOptions, wID, hSubMenu, hbmpChecked, hbmpUnchecked, itemData, state }: MenuItemInfo)) = let open Memory val (bits, typeData, cch, bmp) = case menuType of MFT_BITMAP b => (mft_BITMAP, null, 0, b) | MFT_OWNERDRAW i => (mft_OWNERDRAW, sysWord2VoidStar i, 0, hNull) | MFT_SEPARATOR => (mft_SEPARATOR, null, 0, hNull) | MFT_STRING s => (mft_STRING, toCstring s, size s + 1, hNull) val mtype = Word32.orb(fromMFT menuOptions, bits) val r = (sizeMenuItemStruct, allInfo, mtype, state, wID, hSubMenu, hbmpChecked, hbmpUnchecked, itemData, typeData, cch, bmp) in setMenuItemInfo(hMenu, uItem, fByPosition, r) handle ex => (free typeData; raise ex); free typeData end fun InsertMenuItem(hMenu: HMENU, uItem: int, fByPosition, ({menuType, menuOptions, wID, hSubMenu, hbmpChecked, hbmpUnchecked, itemData, state }: MenuItemInfo)) = let open Memory val (bits, typeData, cch, bmp) = case menuType of MFT_BITMAP b => (mft_BITMAP, null, 0, b) | MFT_OWNERDRAW i => (mft_OWNERDRAW, sysWord2VoidStar i, 0, hNull) | MFT_SEPARATOR => (mft_SEPARATOR, null, 0, hNull) | MFT_STRING s => (mft_STRING, toCstring s, size s + 1, hNull) val mtype = Word32.orb(fromMFT menuOptions, bits) val r = (sizeMenuItemStruct, allInfo, mtype, state, wID, hSubMenu, hbmpChecked, hbmpUnchecked, itemData, typeData, cch, bmp) in insertMenuItem(hMenu, uItem, fByPosition, r) handle ex => (free typeData; raise ex); free typeData end end local val getMenuState = winCall3 (user "GetMenuState") (cHMENU,cUint,cMENUFLAG) cUintw in (* If the menu opens a submenu the high order word is the number of items. The low order word is the state. *) fun GetMenuState (hm, i, mf): MenuFlag list * int = let val res = getMenuState(hm, i, mf) in checkResult(res <> ~ 0w1); (toMenuFlagSet(Word32.fromLargeWord(Word.toLargeWord(LOWORD res))), Word.toInt(HIWORD res)) end end val GetSubMenu = winCall2 (user "GetSubMenu") (cHMENU,cInt) cHMENU val GetSystemMenu = winCall2 (user "GetSystemMenu") (cHWND,cBool) cHMENU val HiliteMenuItem = winCall4 (user "HiliteMenuItem") (cHWND,cHMENU,cUint,cMENUFLAGSET) (successState "HiliteMenuItem") val IsMenu = winCall1 (user "IsMenu") (cHMENU) cBool (* InsertMenu can insert a string item or a submenu. *) datatype MenuIdOrHandle = MenuId of int | MenuHandle of HMENU local open Memory (* Get the menu item. If this is a string we have to free the memory afterwards. *) fun getDisplay (MFT_BITMAP hb) = (mft_BITMAP, voidStarOfHandle hb, null) | getDisplay MFT_SEPARATOR = (mft_SEPARATOR, null, null) | getDisplay (MFT_STRING (s: string)) = let val v = toCstring s in (mft_STRING, v, v) end | getDisplay (MFT_OWNERDRAW i) = (mft_OWNERDRAW, sysWord2VoidStar i, null) fun InsertOrModifyMenu (functionName: string) = let val docall = winCall5 (user functionName) (cHMENU,cUint,cUintw,cPointer,cPointer) (successState functionName) in fn(hMenu: HMENU, pos: int, flags: MenuFlag list, new: MenuIdOrHandle, disp: MenuItemType) => let (* Flags - mask out the ones we set by other means. *) val f1 = Word32.andb(fromMenuFlagSet flags, Word32.notb typeBits) (* The C call incorporates various options within the flags. It's better, in ML, to pull these out and treat them as part of the datatype. *) (* The "new" argument indicates whether the item is a sub-menu or should send a message containing the id when the menu item is selected. *) val (f2, id) = case new of MenuId i => (0w0, sysWord2VoidStar (SysWord.fromInt i)) | MenuHandle m => (mft_POPUP, voidStarOfHandle m) (* The "disp" argument describes how the item is displayed. *) val (f3, str, toFree) = getDisplay disp val flags = List.foldl Word32.orb 0w0 [f1,f2,f3] in docall(hMenu, pos, flags, id, str) handle ex => (free toFree; raise ex); free toFree end end val appendMenu = winCall4 (user "AppendMenuA") (cHMENU,cUintw,cPointer,cPointer) (successState "AppendMenuA") in val InsertMenu = InsertOrModifyMenu "InsertMenuA" and ModifyMenu = InsertOrModifyMenu "ModifyMenuA" fun AppendMenu(hMenu: HMENU, flags: MenuFlag list, new: MenuIdOrHandle, disp: MenuItemType) = let val f1 = Word32.andb(fromMenuFlagSet flags, Word32.notb typeBits) val (f2, id) = case new of MenuId i => (0w0, sysWord2VoidStar (SysWord.fromInt i)) | MenuHandle m => (mft_POPUP, voidStarOfHandle m) val (f3, str, toFree) = getDisplay disp val flags = List.foldl Word32.orb 0w0 [f1,f2,f3] in appendMenu (hMenu, flags, id, str) handle ex => (free toFree; raise ex); free toFree end end val RemoveMenu = winCall3(user "RemoveMenu") (cHMENU, cUint, cMENUFLAG) (successState "RemoveMenu") datatype TrackPopupMenuOptions = TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_CENTERALIGN | TPM_RIGHTALIGN | TPM_TOPALIGN | TPM_VCENTERALIGN | TPM_BOTTOMALIGN | (*TPM_HORIZONTAL | TPM_VERTICAL |*) TPM_NONOTIFY | TPM_RETURNCMD local val tab = [ (TPM_LEFTBUTTON, 0wx0000), (TPM_RIGHTBUTTON, 0wx0002), (TPM_LEFTALIGN, 0wx0000), (TPM_CENTERALIGN, 0wx0004), (TPM_RIGHTALIGN, 0wx0008), (TPM_TOPALIGN, 0wx0000), (TPM_VCENTERALIGN, 0wx0010), (TPM_BOTTOMALIGN, 0wx0020), (*(TPM_HORIZONTAL, 0wx0000), (TPM_VERTICAL, 0wx0040),*) (TPM_NONOTIFY, 0wx0080), (TPM_RETURNCMD, 0wx0100) ] in val TRACKPOPUPOPTIONS = tableSetConversion(tab, NONE) end local val trackPopupMenu = winCall7 (user "TrackPopupMenu") (cHMENU, TRACKPOPUPOPTIONS, cInt, cInt, cInt, cHWND, cPointer) cInt in fun TrackPopupMenu(menu, flags, x, y, owner) = trackPopupMenu(menu, flags, x, y, 0, owner, Memory.null) end local val getMenuItemRect = winCall4 (user "GetMenuItemRect") (cHWND, cHMENU, cUint, cStar cRect) (successState "GetMenuItemRect") in fun GetMenuItemRect(hWnd, hMenu, item): RECT = let val r = ref { top = 0, bottom=0, left=0, right=0} val () = getMenuItemRect(hWnd, hMenu, item, r) in ! r end end val LoadMenu = winCall2 (user "LoadMenuA") (cHINSTANCE, cRESID) cHMENU val SetMenu = winCall2 (user "SetMenu") (cHWND, cHMENUOPT) (successState "SetMenu") val SetMenuContextHelpId = winCall2 (user "SetMenuContextHelpId") (cHMENU, cDWORD) (successState "SetWindowContextHelpId") val GetMenuContextHelpId = winCall1 (user "GetMenuContextHelpId") (cHMENU) cDWORD (* *) (*fun LoadMenuIndirect (mlist: (MenuFlag list * int * string) list list) = let val count = List.length mlist val menu = *) (* TODO: GetMenuCheckMarkDimensions - use GetSystemMetrics LoadMenuIndirect MenuItemFromPoint SetMenuDefaultItem SetMenuItemBitmaps TrackPopupMenuEx Obsolete Functions CheckMenuItem GetMenuCheckMarkDimensions ModifyMenu *) end end; (* struct datatype MenuItemData = MID of {option: Style.flag, id:MenuItem, display:string} (* I don't think this will work. The strings have to be Unicode. *) fun LoadMenuIndirect (mlist) = let val count = List.length mlist val menu = alloc count (Cstruct [Cshort,Cshort,Cpointer Cchar]) fun pl2a v n [] = () | pl2a v n (MID {option=flag, id= MenuID id, display=s} :: rest) = let val item = make_struct [(Cshort,toCshort (repE MenuFlagE flag)), (Cshort,toCshort id ), (Cpointer Cchar,toCstring s) ] in ( assign (Cstruct [Cshort,Cshort,Cpointer Cchar]) (offset n (Cstruct [Cshort,Cshort,Cpointer Cchar]) v) item ; pl2a v (n+1) rest ) end val u = pl2a menu 0 mlist in winCall1 (getuser "LoadMenuIndirectA") (POINTER) (cHMENU) (address menu) end end; *) polyml-5.6/mlsource/extra/Win/MenuBase.sml000066400000000000000000000061321265146633400206410ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure MenuBase = struct local open Foreign Base in (* TODO: This duplicates some of the other datatypes. *) datatype MenuFlag = (*MF_INSERT | MF_CHANGE | MF_APPEND | MF_DELETE | MF_REMOVE | *) MF_BYCOMMAND | MF_BYPOSITION | MF_SEPARATOR | MF_ENABLED | MF_GRAYED | MF_DISABLED | MF_UNCHECKED | MF_CHECKED | MF_USECHECKBITMAPS | MF_STRING | MF_BITMAP | MF_OWNERDRAW | MF_POPUP | MF_MENUBARBREAK | MF_MENUBREAK | MF_UNHILITE | MF_HILITE | MF_DEFAULT | MF_SYSMENU | MF_HELP | MF_RIGHTJUSTIFY | MF_MOUSESELECT local val tab = [ (*(MF_INSERT, 0wx00000000), (MF_CHANGE, 0wx00000080), (MF_APPEND, 0wx00000100), (MF_DELETE, 0wx00000200), (MF_REMOVE, 0wx00001000),*) (MF_BYCOMMAND, 0wx00000000), (MF_BYPOSITION, 0wx00000400), (MF_SEPARATOR, 0wx00000800), (MF_ENABLED, 0wx00000000), (MF_GRAYED, 0wx00000001), (MF_DISABLED, 0wx00000002), (MF_UNCHECKED, 0wx00000000), (MF_CHECKED, 0wx00000008), (MF_USECHECKBITMAPS, 0wx00000200), (MF_STRING, 0wx00000000), (MF_BITMAP, 0wx00000004), (MF_OWNERDRAW, 0wx00000100), (MF_POPUP, 0wx00000010), (MF_MENUBARBREAK, 0wx00000020), (MF_MENUBREAK, 0wx00000040), (MF_UNHILITE, 0wx00000000), (MF_HILITE, 0wx00000080), (MF_DEFAULT, 0wx00001000), (MF_SYSMENU, 0wx00002000), (MF_HELP, 0wx00004000), (MF_RIGHTJUSTIFY, 0wx00004000), (MF_MOUSESELECT, 0wx00008000) ] in val (fromMenuFlagSet, toMenuFlagSet) = tableSetLookup(tab, NONE) val cMENUFLAGSET = absConversion {abs=toMenuFlagSet, rep=fromMenuFlagSet} cUintw (* Sometimes we just want a single flag - either MF_BYCOMMAND or MF_BYPOSITION or, for WM_MENUCHAR, MF_POPUP or MF_SYSMENU. *) val (fromMenuFlag, toMenuFlag) = tableLookup(tab, NONE) val cMENUFLAG = tableConversion(tab, NONE) cUintw end end end; polyml-5.6/mlsource/extra/Win/Message.sml000066400000000000000000005106411265146633400205330ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Message: MESSAGE = struct local open Foreign open Memory open Base open Globals open WinBase fun user name = getSymbol(loadLibrary "user32.dll") name val toAddr = Memory.sysWord2VoidStar and fromAddr = Memory.voidStar2Sysword val RegisterMessage = winCall1 (user "RegisterWindowMessageA") cString cUint (* Used in WM_WINDOWPOSXXX and also WM_NCCALCSIZE *) val WINDOWPOS = cStruct7(cHWND, cHWND, cInt, cInt, cInt, cInt, cWINDOWPOSITIONSTYLE) local (* WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED. The C structure is the same but WM_WINDOWPOSCHANGING has refs in the ML to allow the call-back to change the position. *) val {load=fromCwindowpos, store=toCwindowpos, ctype={size=sizeCwp, ...}, ...} = breakConversion WINDOWPOS type wmWINDOWPOSCHANGED = { hwnd: HWND, front: HWND, x: int, y: int, width: int, height: int, flags: WindowPositionStyle list } and wmWINDOWPOSCHANGING = { hwnd: HWND, front: HWND ref, x: int ref, y: int ref, width: int ref, height: int ref, flags: WindowPositionStyle list ref } in fun cToMLWindowPosChanging{wp=_, lp}: wmWINDOWPOSCHANGING = let val (wh,front,x,y,width,height,flags) = fromCwindowpos(toAddr lp) in {hwnd = wh, front = ref front, x = ref x, y = ref y, width = ref width, height = ref height, flags = ref flags} end and cToMLWindowPosChanged{wp=_, lp}: wmWINDOWPOSCHANGED = let val (wh,front,x,y,width,height,flags) = fromCwindowpos(toAddr lp) in {hwnd = wh, front = front, x = x, y = y, width = width, height = height, flags = flags} end fun mlToCWindowPosChanging(msgNo, {hwnd, front=ref front, x=ref x, y=ref y, width=ref width, height=ref height, flags=ref flags}: wmWINDOWPOSCHANGING) = let open Memory val mem = malloc sizeCwp val freeCwp = toCwindowpos(mem, (hwnd, front, x, y, width, height, flags)) in (msgNo, 0w0, fromAddr mem, fn() => (freeCwp(); free mem)) end and mlToCWindowPosChanged(msgNo, {hwnd, front, x, y, width, height, flags}: wmWINDOWPOSCHANGED) = let open Memory val mem = malloc sizeCwp val freeCwp = toCwindowpos(mem, (hwnd, front, x, y, width, height, flags)) in (msgNo, 0w0, fromAddr mem, fn() => (freeCwp(); free mem)) end fun updateCfromMLwmWindowPosChanging( {wp=_, lp}, { front, x, y, width, height, flags, ...}:wmWINDOWPOSCHANGING) = let val (_,newfront,newx,newy,newwidth,newheight,newflags) = fromCwindowpos(toAddr lp) in front := newfront; x := newx; y := newy; width := newwidth; height := newheight; flags := newflags end and updateWindowPosChangingParms({wp=_, lp}, { hwnd, front=ref front, x=ref x, y=ref y, width=ref width, height=ref height, flags=ref flags}) = ignore(toCwindowpos(toAddr lp, (hwnd, front, x, y, width, height, flags))) end datatype ControlType = ODT_MENU | ODT_LISTBOX | ODT_COMBOBOX | ODT_BUTTON | ODT_STATIC local val tab = [ (ODT_MENU, 1), (ODT_LISTBOX, 2), (ODT_COMBOBOX, 3), (ODT_BUTTON, 4), (ODT_STATIC, 5) ] in val cCONTROLTYPE = tableConversion(tab, NONE) cUint end fun structAsAddr strConv = let val {load, store, ctype={size, ...}, ...} = breakConversion strConv fun make v = let open Memory val mem = malloc size val freeS = store(mem, v) in (fromAddr mem, fn () => (freeS(); free mem)) end in (load o toAddr, make) end val (_, makePointStructAddr) = structAsAddr cPoint local val MDICREATESTRUCT = cStruct9(cCLASS,cString,cHINSTANCE,cInt,cInt,cInt,cInt,cDWORD,cLPARAM) in val (toMdiCreate, fromMdiCreate) = structAsAddr MDICREATESTRUCT end local (* WM_COMPAREITEM *) val COMPAREITEMSTRUCT = cStruct8(cCONTROLTYPE,cUint,cHWND,cUint,cUINT_PTRw,cUint,cUINT_PTRw, cDWORD) val MEASUREITEMSTRUCT = cStruct6(cCONTROLTYPE,cUint,cUint,cUint,cUint,cULONG_PTR) val DELETEITEMSTRUCT = cStruct5(cCONTROLTYPE,cUint,cUint,cHWND,cULONG_PTR) val {store=toMeasureItem, ...} = breakConversion MEASUREITEMSTRUCT in val (toMLCompareItem, fromMLCompareItem) = structAsAddr COMPAREITEMSTRUCT and (toMLMeasureItem, fromMLMeasureItem) = structAsAddr MEASUREITEMSTRUCT and (toMLDeleteItem, fromMLDeleteItem) = structAsAddr DELETEITEMSTRUCT fun updateMeasureItemFromWpLp({itemWidth, itemHeight, ...}, {wp=_, lp}) = let val (_, _, _, iWidth, iHeight, _) = toMLMeasureItem lp in itemWidth := iWidth; itemHeight := iHeight end and updateMeasureItemParms({wp=_, lp}, {itemWidth=ref itemWidth, itemHeight=ref itemHeight, ...}) = let val (ctlType, ctlID, itemID, _, _, itemData) = toMLMeasureItem lp in ignore(toMeasureItem(toAddr lp, (ctlType, ctlID, itemID, itemWidth, itemHeight, itemData))) end end local (* WM_CREATE and WM_NCCREATE *) val CREATESTRUCT = cStruct12(cPointer,cHINSTANCE,cHMENU,cHWND,cInt,cInt,cInt,cInt,cUlongw,cString,cCLASS,cDWORD) val (toMLCreate, fromMLCreate) = structAsAddr CREATESTRUCT in fun decompileCreate{wp=_, lp} = let val (cp,inst,menu,parent, cy,cx,y,x, style, name,class, extendedstyle) = toMLCreate lp in { instance = inst, creation = cp, menu = menu, parent = parent, cy = cy, cx = cx, y = y, x = x, style = Style.fromWord(Word32.toLargeWord style), name = name, class = class, extendedstyle = extendedstyle } end and compileCreate(code, { instance, creation, menu, parent, cy, cx, y, x, style, name, class, extendedstyle}) = let val (addr, free) = fromMLCreate(creation, instance, menu, parent, cy, cx, y, x, Word32.fromLargeWord(Style.toWord style), name, class, extendedstyle) in (code, 0w0, addr, free) end end local val MINMAXINFO = cStruct5(cPoint,cPoint,cPoint,cPoint,cPoint) val {store=toCminmaxinfo, ...} = breakConversion MINMAXINFO val (toMLMinMax, fromMLMinMax) = structAsAddr MINMAXINFO in fun decompileMinMax{wp=_, lp} = let val (_, ptms, ptmp, ptts, ptmts) = toMLMinMax lp in { maxSize = ref ptms, maxPosition = ref ptmp, minTrackSize = ref ptts, maxTrackSize = ref ptmts} end and compileMinMax(code, { maxSize=ref maxSize, maxPosition=ref maxPosition, minTrackSize=ref minTrackSize, maxTrackSize=ref maxTrackSize}) = let val (addr, free) = fromMLMinMax({x=0,y=0}, maxSize, maxPosition, minTrackSize, maxTrackSize) in (code, 0w0, addr, free) end fun updateMinMaxFromWpLp({maxSize, maxPosition, minTrackSize, maxTrackSize}, {wp=_, lp}) = let val (_, ptms, ptmp, ptts, ptmts) = toMLMinMax lp in maxSize := ptms; maxPosition := ptmp; minTrackSize := ptts; maxTrackSize := ptmts end and updateMinMaxParms({wp=_, lp}, {maxSize=ref maxSize, maxPosition=ref maxPosition, minTrackSize=ref minTrackSize, maxTrackSize=ref maxTrackSize}) = let val (ptres, _, _, _, _) = toMLMinMax lp in ignore(toCminmaxinfo(toAddr lp, (ptres, maxSize, maxPosition, minTrackSize, maxTrackSize))) end end local val DRAWITEMSTRUCT = cStruct9(cCONTROLTYPE,cUint,cUint,cUint,cUint,cHWND,cHDC,cRect,cULONG_PTR) in val (toMLDrawItem, fromMLDrawItem) = structAsAddr DRAWITEMSTRUCT end local (* WM_NCCALCSIZE *) val NCCALCSIZE_PARAMS = cStruct4(cRect,cRect,cRect, cConstStar WINDOWPOS) val {load=loadStruct, store=storeStruct, ctype={size=sizeStr, ...}, ...} = breakConversion NCCALCSIZE_PARAMS val {load=loadRect, store=storeRect, ctype={size=sizeRect, ...}, ...} = breakConversion cRect in fun decompileNCCalcSize{wp=0w0, lp} = let val (newrect,oldrect,oldclientarea,winpos) = loadStruct (toAddr lp) val (wh,front,x,y,cx,cy,style) = winpos in { validarea = true, newrect = ref newrect, oldrect = oldrect, oldclientarea = oldclientarea, hwnd = wh, insertAfter = front, x = x, y = y, cx = cx, cy = cy, style = style } end | decompileNCCalcSize{wp=_, lp} = let val newrect = loadRect (toAddr lp) val zeroRect = {left=0, top=0, right=0, bottom=0} in { validarea = false, newrect = ref newrect, oldrect = zeroRect, oldclientarea = zeroRect, insertAfter = hwndNull, hwnd = hwndNull, x = 0, y = 0, cx = 0, cy = 0, style = [] } end and compileNCCalcSize{validarea=true, newrect=ref newrect, oldrect, oldclientarea, hwnd, insertAfter, x, y, cx, cy, style} = let open Memory val mem = malloc sizeStr val freeRect = storeStruct(mem, (newrect,oldrect,oldclientarea, (hwnd,insertAfter,x,y,cx,cy, style))) in (0x0083, 0w1, fromAddr mem, fn () => (freeRect(); free mem)) end | compileNCCalcSize{validarea=false, newrect=ref newrect, ...} = let open Memory val mem = malloc sizeRect val () = ignore(storeRect(mem, newrect)) in (0x0083, 0w0, fromAddr mem, fn () => free mem) end end local val HELPINFO = cStruct6(cUint, cInt, cInt, cPointer (* HANDLE *), cDWORD, cPoint) val {ctype={size=sizeHelpInfo, ...}, ...} = breakConversion HELPINFO val (toHelpInfo, fromHelpInfo) = structAsAddr HELPINFO in datatype HelpHandle = MenuHandle of HMENU | WindowHandle of HWND fun compileHelpInfo(code, {ctrlId, itemHandle, contextId, mousePos}) = let val (ctype, handl) = case itemHandle of MenuHandle m => (2, voidStarOfHandle m) | WindowHandle w => (1, voidStarOfHandle w) val (addr, free) = fromHelpInfo(Word.toInt sizeHelpInfo, ctype, ctrlId, handl, contextId, mousePos) in (code, 0w0, addr, free) end and decompileHelpInfo{wp=_, lp} = let val (_, ctype, ctrlId, itemHandle, contextId, mousePos) = toHelpInfo lp val hndl = if ctype = 2 then MenuHandle(handleOfVoidStar itemHandle) else WindowHandle(handleOfVoidStar itemHandle) in { ctrlId = ctrlId, itemHandle = hndl, contextId = contextId, mousePos = mousePos} end end local val {store=storeScrollInfo, ctype = {size=sizeStruct, ...}, ...} = breakConversion ScrollBase.cSCROLLINFOSTRUCT val (toScrollInfoStruct, fromScrollInfoStruct) = structAsAddr ScrollBase.cSCROLLINFOSTRUCT in fun toScrollInfo lp = let val (_, options, minPos, maxPos, pageSize, pos, trackPos) = toScrollInfoStruct lp val info = { minPos = minPos, maxPos = maxPos, pageSize = pageSize, pos = pos, trackPos = trackPos } in (info, options) end and fromScrollInfo({minPos, maxPos, pageSize, pos, trackPos}, options) = fromScrollInfoStruct(Word.toInt sizeStruct, options, minPos, maxPos, pageSize, pos, trackPos) and updateScrollInfo({wp=_, lp=lp}, {info=ref {minPos, maxPos, pageSize, pos, trackPos}, options}) = ignore(storeScrollInfo(toAddr lp, (Word.toInt sizeStruct, options, minPos, maxPos, pageSize, pos, trackPos))) end local val {store=storeWord, load=loadWord, ctype={size=sizeWord, ...}, ...} = breakConversion cWORD in (* We have to allocate a buffer big enough to receive the text and set the first word to the length of the buffer. *) fun compileGetLine {lineNo, size, ...} = let open Memory (* Allocate one extra byte so there's space for a null terminator. *) val vec = malloc (Word.max(Word.fromInt(size+1), sizeWord)) in ignore(storeWord(vec, size+1)); (0x00C5, SysWord.fromInt lineNo, fromAddr vec, fn () => free vec) end and decompileGetLine{wp, lp} = let (* The first word is supposed to contain the length *) val size = loadWord(toAddr lp) in { lineNo = SysWord.toInt wp, size = size(*-1 ? *), result = ref "" } end end val {load=loadInt, store=storeInt, ctype={size=sizeInt, ...}, ...} = breakConversion cInt local (* EM_SETTABSTOPS and LB_SETTABSTOPS *) open Memory infix 6 ++ in fun decompileTabStops{wp, lp} = let val v = toAddr lp fun getTab i = loadInt(v ++ Word.fromInt i * sizeInt) in IntVector.tabulate(SysWord.toInt wp, getTab) end and compileTabStops(code, tabs) = let val cTabs = IntVector.length tabs val vec = malloc(Word.fromInt cTabs * sizeInt) fun setVec(tab, addr) = (ignore(storeInt(addr, tab)); addr ++ sizeInt) val _ = IntVector.foldl setVec vec tabs in (code, SysWord.fromInt cTabs, fromAddr vec, fn () => free vec) end end local open Memory IntArray infix 6 ++ in fun compileGetSelItems(code, {items}) = (* Allocate a buffer to receive the items. Set each element of the buffer to ~1 so that the values are defined if not all of them are set. *) let open Memory IntArray val itemCount = length items infix 6 ++ val v = malloc(Word.fromInt itemCount * sizeInt) in appi(fn (i, s) => ignore(storeInt(v ++ Word.fromInt i * sizeInt, s))) items; (code, SysWord.fromInt itemCount, fromAddr v, fn () => free v) end fun updateGetSelItemsParms({wp=_, lp=lp}, {items}) = let val v = toAddr lp in appi(fn (i, s) => ignore(storeInt(v ++ Word.fromInt i * sizeInt, s))) items end and updateGetSelItemsFromWpLp({items}, {wp=_, lp, reply}) = let (* The return value is the actual number of items copied *) val nItems = SysWord.toIntX reply val b = toAddr lp open Memory infix 6 ++ fun newValue (i, old) = if i < nItems then loadInt(b ++ sizeInt * Word.fromInt i) else old in IntArray.modifyi newValue items end end (* Passed in the lpParam argument of a WM_NOTIFY message. TODO: Many of these have additional information. *) datatype Notification = NM_OUTOFMEMORY | NM_CLICK | NM_DBLCLK | NM_RETURN | NM_RCLICK | NM_RDBLCLK | NM_SETFOCUS | NM_KILLFOCUS | NM_CUSTOMDRAW | NM_HOVER | NM_NCHITTEST | NM_KEYDOWN | NM_RELEASEDCAPTURE | NM_SETCURSOR | NM_CHAR | NM_TOOLTIPSCREATED | NM_LDOWN | NM_RDOWN | NM_THEMECHANGED | LVN_ITEMCHANGING | LVN_ITEMCHANGED | LVN_INSERTITEM | LVN_DELETEITEM | LVN_DELETEALLITEMS | LVN_BEGINLABELEDIT | LVN_ENDLABELEDIT | LVN_COLUMNCLICK | LVN_BEGINDRAG | LVN_BEGINRDRAG | LVN_GETDISPINFO | LVN_SETDISPINFO | LVN_KEYDOWN | LVN_GETINFOTIP | HDN_ITEMCHANGING | HDN_ITEMCHANGED | HDN_ITEMCLICK | HDN_ITEMDBLCLICK | HDN_DIVIDERDBLCLICK | HDN_BEGINTRACK | HDN_ENDTRACK | HDN_TRACK | HDN_ENDDRAG | HDN_BEGINDRAG | HDN_GETDISPINFO | TVN_SELCHANGING | TVN_SELCHANGED | TVN_GETDISPINFO | TVN_SETDISPINFO | TVN_ITEMEXPANDING | TVN_ITEMEXPANDED | TVN_BEGINDRAG | TVN_BEGINRDRAG | TVN_DELETEITEM | TVN_BEGINLABELEDIT | TVN_ENDLABELEDIT | TVN_KEYDOWN | TVN_GETINFOTIP | TVN_SINGLEEXPAND | TTN_GETDISPINFO of string ref | TTN_SHOW | TTN_POP | TCN_KEYDOWN | TCN_SELCHANGE | TCN_SELCHANGING | TBN_GETBUTTONINFO | TBN_BEGINDRAG | TBN_ENDDRAG | TBN_BEGINADJUST | TBN_ENDADJUST | TBN_RESET | TBN_QUERYINSERT | TBN_QUERYDELETE | TBN_TOOLBARCHANGE | TBN_CUSTHELP | TBN_DROPDOWN | TBN_HOTITEMCHANGE | TBN_DRAGOUT | TBN_DELETINGBUTTON | TBN_GETDISPINFO | TBN_GETINFOTIP | UDN_DELTAPOS | RBN_GETOBJECT | RBN_LAYOUTCHANGED | RBN_AUTOSIZE | RBN_BEGINDRAG | RBN_ENDDRAG | RBN_DELETINGBAND | RBN_DELETEDBAND | RBN_CHILDSIZE | CBEN_GETDISPINFO | CBEN_DRAGBEGIN | IPN_FIELDCHANGED | SBN_SIMPLEMODECHANGE | PGN_SCROLL | PGN_CALCSIZE | NM_OTHER of int (* Catch-all for other cases. *) local (* Notification structures *) val NMHDR = cStruct3(cHWND, cUINT_PTR, cUint) val (toMLNmhdr, fromMLNmhdr) = structAsAddr NMHDR val CHARARRAY80 = cCHARARRAY 80 val NMTTDISPINFO = cStruct6(NMHDR, cPointer (* String or resource id *), CHARARRAY80, cHINSTANCE, cUint, cLPARAM); val (toMLNMTTDISPINFO, fromMLNMTTDISPINFO) = structAsAddr NMTTDISPINFO in fun compileNotification (from, idFrom, NM_OUTOFMEMORY) = fromMLNmhdr(from, idFrom, ~1) | compileNotification (from, idFrom, NM_CLICK) = fromMLNmhdr(from, idFrom, ~2) | compileNotification (from, idFrom, NM_DBLCLK) = fromMLNmhdr(from, idFrom, ~3) | compileNotification (from, idFrom, NM_RETURN) = fromMLNmhdr(from, idFrom, ~4) | compileNotification (from, idFrom, NM_RCLICK) = fromMLNmhdr(from, idFrom, ~5) | compileNotification (from, idFrom, NM_RDBLCLK) = fromMLNmhdr(from, idFrom, ~6) | compileNotification (from, idFrom, NM_SETFOCUS) = fromMLNmhdr(from, idFrom, ~7) | compileNotification (from, idFrom, NM_KILLFOCUS) = fromMLNmhdr(from, idFrom, ~8) | compileNotification (from, idFrom, NM_CUSTOMDRAW) = fromMLNmhdr(from, idFrom, ~12) | compileNotification (from, idFrom, NM_HOVER) = fromMLNmhdr(from, idFrom, ~13) | compileNotification (from, idFrom, NM_NCHITTEST) = fromMLNmhdr(from, idFrom, ~14) | compileNotification (from, idFrom, NM_KEYDOWN) = fromMLNmhdr(from, idFrom, ~15) | compileNotification (from, idFrom, NM_RELEASEDCAPTURE) = fromMLNmhdr(from, idFrom, ~16) | compileNotification (from, idFrom, NM_SETCURSOR) = fromMLNmhdr(from, idFrom, ~17) | compileNotification (from, idFrom, NM_CHAR) = fromMLNmhdr(from, idFrom, ~18) | compileNotification (from, idFrom, NM_TOOLTIPSCREATED) = fromMLNmhdr(from, idFrom, ~19) | compileNotification (from, idFrom, NM_LDOWN) = fromMLNmhdr(from, idFrom, ~20) | compileNotification (from, idFrom, NM_RDOWN) = fromMLNmhdr(from, idFrom, ~21) | compileNotification (from, idFrom, NM_THEMECHANGED) = fromMLNmhdr(from, idFrom, ~22) | compileNotification (from, idFrom, LVN_ITEMCHANGING) = fromMLNmhdr(from, idFrom, ~100) | compileNotification (from, idFrom, LVN_ITEMCHANGED) = fromMLNmhdr(from, idFrom, ~101) | compileNotification (from, idFrom, LVN_INSERTITEM) = fromMLNmhdr(from, idFrom, ~102) | compileNotification (from, idFrom, LVN_DELETEITEM) = fromMLNmhdr(from, idFrom, ~103) | compileNotification (from, idFrom, LVN_DELETEALLITEMS) = fromMLNmhdr(from, idFrom, ~104) | compileNotification (from, idFrom, LVN_BEGINLABELEDIT) = fromMLNmhdr(from, idFrom, ~105) | compileNotification (from, idFrom, LVN_ENDLABELEDIT) = fromMLNmhdr(from, idFrom, ~106) | compileNotification (from, idFrom, LVN_COLUMNCLICK) = fromMLNmhdr(from, idFrom, ~108) | compileNotification (from, idFrom, LVN_BEGINDRAG) = fromMLNmhdr(from, idFrom, ~109) | compileNotification (from, idFrom, LVN_BEGINRDRAG) = fromMLNmhdr(from, idFrom, ~111) | compileNotification (from, idFrom, LVN_GETDISPINFO) = fromMLNmhdr(from, idFrom, ~150) | compileNotification (from, idFrom, LVN_SETDISPINFO) = fromMLNmhdr(from, idFrom, ~151) | compileNotification (from, idFrom, LVN_KEYDOWN) = fromMLNmhdr(from, idFrom, ~155) | compileNotification (from, idFrom, LVN_GETINFOTIP) = fromMLNmhdr(from, idFrom, ~157) | compileNotification (from, idFrom, HDN_ITEMCHANGING) = fromMLNmhdr(from, idFrom, ~300) | compileNotification (from, idFrom, HDN_ITEMCHANGED) = fromMLNmhdr(from, idFrom, ~301) | compileNotification (from, idFrom, HDN_ITEMCLICK) = fromMLNmhdr(from, idFrom, ~302) | compileNotification (from, idFrom, HDN_ITEMDBLCLICK) = fromMLNmhdr(from, idFrom, ~303) | compileNotification (from, idFrom, HDN_DIVIDERDBLCLICK) = fromMLNmhdr(from, idFrom, ~305) | compileNotification (from, idFrom, HDN_BEGINTRACK) = fromMLNmhdr(from, idFrom, ~306) | compileNotification (from, idFrom, HDN_ENDTRACK) = fromMLNmhdr(from, idFrom, ~307) | compileNotification (from, idFrom, HDN_TRACK) = fromMLNmhdr(from, idFrom, ~308) | compileNotification (from, idFrom, HDN_ENDDRAG) = fromMLNmhdr(from, idFrom, ~311) | compileNotification (from, idFrom, HDN_BEGINDRAG) = fromMLNmhdr(from, idFrom, ~310) | compileNotification (from, idFrom, HDN_GETDISPINFO) = fromMLNmhdr(from, idFrom, ~309) | compileNotification (from, idFrom, TVN_SELCHANGING) = fromMLNmhdr(from, idFrom, ~401) | compileNotification (from, idFrom, TVN_SELCHANGED) = fromMLNmhdr(from, idFrom, ~402) | compileNotification (from, idFrom, TVN_GETDISPINFO) = fromMLNmhdr(from, idFrom, ~403) | compileNotification (from, idFrom, TVN_SETDISPINFO) = fromMLNmhdr(from, idFrom, ~404) | compileNotification (from, idFrom, TVN_ITEMEXPANDING) = fromMLNmhdr(from, idFrom, ~405) | compileNotification (from, idFrom, TVN_ITEMEXPANDED) = fromMLNmhdr(from, idFrom, ~406) | compileNotification (from, idFrom, TVN_BEGINDRAG) = fromMLNmhdr(from, idFrom, ~407) | compileNotification (from, idFrom, TVN_BEGINRDRAG) = fromMLNmhdr(from, idFrom, ~408) | compileNotification (from, idFrom, TVN_DELETEITEM) = fromMLNmhdr(from, idFrom, ~409) | compileNotification (from, idFrom, TVN_BEGINLABELEDIT) = fromMLNmhdr(from, idFrom, ~410) | compileNotification (from, idFrom, TVN_ENDLABELEDIT) = fromMLNmhdr(from, idFrom, ~411) | compileNotification (from, idFrom, TVN_KEYDOWN) = fromMLNmhdr(from, idFrom, ~412) | compileNotification (from, idFrom, TVN_GETINFOTIP) = fromMLNmhdr(from, idFrom, ~413) | compileNotification (from, idFrom, TVN_SINGLEEXPAND) = fromMLNmhdr(from, idFrom, ~415) | compileNotification (from, idFrom, TTN_GETDISPINFO(ref s)) = fromMLNMTTDISPINFO((from, idFrom, ~520), Memory.null, s, Globals.hNull, 0, 0) | compileNotification (from, idFrom, TTN_SHOW) = fromMLNmhdr(from, idFrom, ~521) | compileNotification (from, idFrom, TTN_POP) = fromMLNmhdr(from, idFrom, ~522) | compileNotification (from, idFrom, TCN_KEYDOWN) = fromMLNmhdr(from, idFrom, ~550) | compileNotification (from, idFrom, TCN_SELCHANGE) = fromMLNmhdr(from, idFrom, ~551) | compileNotification (from, idFrom, TCN_SELCHANGING) = fromMLNmhdr(from, idFrom, ~552) | compileNotification (from, idFrom, TBN_GETBUTTONINFO) = fromMLNmhdr(from, idFrom, ~700) | compileNotification (from, idFrom, TBN_BEGINDRAG) = fromMLNmhdr(from, idFrom, ~701) | compileNotification (from, idFrom, TBN_ENDDRAG) = fromMLNmhdr(from, idFrom, ~702) | compileNotification (from, idFrom, TBN_BEGINADJUST) = fromMLNmhdr(from, idFrom, ~703) | compileNotification (from, idFrom, TBN_ENDADJUST) = fromMLNmhdr(from, idFrom, ~704) | compileNotification (from, idFrom, TBN_RESET) = fromMLNmhdr(from, idFrom, ~705) | compileNotification (from, idFrom, TBN_QUERYINSERT) = fromMLNmhdr(from, idFrom, ~706) | compileNotification (from, idFrom, TBN_QUERYDELETE) = fromMLNmhdr(from, idFrom, ~707) | compileNotification (from, idFrom, TBN_TOOLBARCHANGE) = fromMLNmhdr(from, idFrom, ~708) | compileNotification (from, idFrom, TBN_CUSTHELP) = fromMLNmhdr(from, idFrom, ~709) | compileNotification (from, idFrom, TBN_DROPDOWN) = fromMLNmhdr(from, idFrom, ~710) | compileNotification (from, idFrom, TBN_HOTITEMCHANGE) = fromMLNmhdr(from, idFrom, ~713) | compileNotification (from, idFrom, TBN_DRAGOUT) = fromMLNmhdr(from, idFrom, ~714) | compileNotification (from, idFrom, TBN_DELETINGBUTTON) = fromMLNmhdr(from, idFrom, ~715) | compileNotification (from, idFrom, TBN_GETDISPINFO) = fromMLNmhdr(from, idFrom, ~716) | compileNotification (from, idFrom, TBN_GETINFOTIP) = fromMLNmhdr(from, idFrom, ~718) | compileNotification (from, idFrom, UDN_DELTAPOS) = fromMLNmhdr(from, idFrom, ~722) | compileNotification (from, idFrom, RBN_GETOBJECT) = fromMLNmhdr(from, idFrom, ~832) | compileNotification (from, idFrom, RBN_LAYOUTCHANGED) = fromMLNmhdr(from, idFrom, ~833) | compileNotification (from, idFrom, RBN_AUTOSIZE) = fromMLNmhdr(from, idFrom, ~834) | compileNotification (from, idFrom, RBN_BEGINDRAG) = fromMLNmhdr(from, idFrom, ~835) | compileNotification (from, idFrom, RBN_ENDDRAG) = fromMLNmhdr(from, idFrom, ~836) | compileNotification (from, idFrom, RBN_DELETINGBAND) = fromMLNmhdr(from, idFrom, ~837) | compileNotification (from, idFrom, RBN_DELETEDBAND) = fromMLNmhdr(from, idFrom, ~838) | compileNotification (from, idFrom, RBN_CHILDSIZE) = fromMLNmhdr(from, idFrom, ~839) | compileNotification (from, idFrom, CBEN_GETDISPINFO) = fromMLNmhdr(from, idFrom, ~800) | compileNotification (from, idFrom, CBEN_DRAGBEGIN) = fromMLNmhdr(from, idFrom, ~808) | compileNotification (from, idFrom, IPN_FIELDCHANGED) = fromMLNmhdr(from, idFrom, ~860) | compileNotification (from, idFrom, SBN_SIMPLEMODECHANGE) = fromMLNmhdr(from, idFrom, ~880) | compileNotification (from, idFrom, PGN_SCROLL) = fromMLNmhdr(from, idFrom, ~901) | compileNotification (from, idFrom, PGN_CALCSIZE) = fromMLNmhdr(from, idFrom, ~902) | compileNotification (from, idFrom, NM_OTHER code) = fromMLNmhdr(from, idFrom, code) local fun decompileNotifyArg (_, ~1) = NM_OUTOFMEMORY | decompileNotifyArg (_, ~2) = NM_CLICK | decompileNotifyArg (_, ~3) = NM_DBLCLK | decompileNotifyArg (_, ~4) = NM_RETURN | decompileNotifyArg (_, ~5) = NM_RCLICK | decompileNotifyArg (_, ~6) = NM_RDBLCLK | decompileNotifyArg (_, ~7) = NM_SETFOCUS | decompileNotifyArg (_, ~8) = NM_KILLFOCUS | decompileNotifyArg (_, ~12) = NM_CUSTOMDRAW | decompileNotifyArg (_, ~13) = NM_HOVER | decompileNotifyArg (_, ~14) = NM_NCHITTEST | decompileNotifyArg (_, ~15) = NM_KEYDOWN | decompileNotifyArg (_, ~16) = NM_RELEASEDCAPTURE | decompileNotifyArg (_, ~17) = NM_SETCURSOR | decompileNotifyArg (_, ~18) = NM_CHAR | decompileNotifyArg (_, ~19) = NM_TOOLTIPSCREATED | decompileNotifyArg (_, ~20) = NM_LDOWN | decompileNotifyArg (_, ~21) = NM_RDOWN | decompileNotifyArg (_, ~22) = NM_THEMECHANGED | decompileNotifyArg (_, ~100) = LVN_ITEMCHANGING | decompileNotifyArg (_, ~101) = LVN_ITEMCHANGED | decompileNotifyArg (_, ~102) = LVN_INSERTITEM | decompileNotifyArg (_, ~103) = LVN_DELETEITEM | decompileNotifyArg (_, ~104) = LVN_DELETEALLITEMS | decompileNotifyArg (_, ~105) = LVN_BEGINLABELEDIT | decompileNotifyArg (_, ~106) = LVN_ENDLABELEDIT | decompileNotifyArg (_, ~108) = LVN_COLUMNCLICK | decompileNotifyArg (_, ~109) = LVN_BEGINDRAG | decompileNotifyArg (_, ~111) = LVN_BEGINRDRAG | decompileNotifyArg (_, ~150) = LVN_GETDISPINFO | decompileNotifyArg (_, ~151) = LVN_SETDISPINFO | decompileNotifyArg (_, ~155) = LVN_KEYDOWN | decompileNotifyArg (_, ~157) = LVN_GETINFOTIP | decompileNotifyArg (_, ~300) = HDN_ITEMCHANGING | decompileNotifyArg (_, ~301) = HDN_ITEMCHANGED | decompileNotifyArg (_, ~302) = HDN_ITEMCLICK | decompileNotifyArg (_, ~303) = HDN_ITEMDBLCLICK | decompileNotifyArg (_, ~305) = HDN_DIVIDERDBLCLICK | decompileNotifyArg (_, ~306) = HDN_BEGINTRACK | decompileNotifyArg (_, ~307) = HDN_ENDTRACK | decompileNotifyArg (_, ~308) = HDN_TRACK | decompileNotifyArg (_, ~311) = HDN_ENDDRAG | decompileNotifyArg (_, ~310) = HDN_BEGINDRAG | decompileNotifyArg (_, ~309) = HDN_GETDISPINFO | decompileNotifyArg (_, ~401) = TVN_SELCHANGING | decompileNotifyArg (_, ~402) = TVN_SELCHANGED | decompileNotifyArg (_, ~403) = TVN_GETDISPINFO | decompileNotifyArg (_, ~404) = TVN_SETDISPINFO | decompileNotifyArg (_, ~405) = TVN_ITEMEXPANDING | decompileNotifyArg (_, ~406) = TVN_ITEMEXPANDED | decompileNotifyArg (_, ~407) = TVN_BEGINDRAG | decompileNotifyArg (_, ~408) = TVN_BEGINRDRAG | decompileNotifyArg (_, ~409) = TVN_DELETEITEM | decompileNotifyArg (_, ~410) = TVN_BEGINLABELEDIT | decompileNotifyArg (_, ~411) = TVN_ENDLABELEDIT | decompileNotifyArg (_, ~412) = TVN_KEYDOWN | decompileNotifyArg (_, ~413) = TVN_GETINFOTIP | decompileNotifyArg (_, ~415) = TVN_SINGLEEXPAND | decompileNotifyArg (lp, ~520) = let val nmt = toMLNMTTDISPINFO lp (* Just look at the byte data at the moment. *) in TTN_GETDISPINFO(ref(#3 nmt)) end | decompileNotifyArg (_, ~521) = TTN_SHOW | decompileNotifyArg (_, ~522) = TTN_POP | decompileNotifyArg (_, ~550) = TCN_KEYDOWN | decompileNotifyArg (_, ~551) = TCN_SELCHANGE | decompileNotifyArg (_, ~552) = TCN_SELCHANGING | decompileNotifyArg (_, ~700) = TBN_GETBUTTONINFO | decompileNotifyArg (_, ~701) = TBN_BEGINDRAG | decompileNotifyArg (_, ~702) = TBN_ENDDRAG | decompileNotifyArg (_, ~703) = TBN_BEGINADJUST | decompileNotifyArg (_, ~704) = TBN_ENDADJUST | decompileNotifyArg (_, ~705) = TBN_RESET | decompileNotifyArg (_, ~706) = TBN_QUERYINSERT | decompileNotifyArg (_, ~707) = TBN_QUERYDELETE | decompileNotifyArg (_, ~708) = TBN_TOOLBARCHANGE | decompileNotifyArg (_, ~709) = TBN_CUSTHELP | decompileNotifyArg (_, ~710) = TBN_DROPDOWN | decompileNotifyArg (_, ~713) = TBN_HOTITEMCHANGE | decompileNotifyArg (_, ~714) = TBN_DRAGOUT | decompileNotifyArg (_, ~715) = TBN_DELETINGBUTTON | decompileNotifyArg (_, ~716) = TBN_GETDISPINFO | decompileNotifyArg (_, ~718) = TBN_GETINFOTIP (*<<<*) | decompileNotifyArg (_, ~722) = UDN_DELTAPOS | decompileNotifyArg (_, ~832) = RBN_GETOBJECT | decompileNotifyArg (_, ~833) = RBN_LAYOUTCHANGED | decompileNotifyArg (_, ~834) = RBN_AUTOSIZE | decompileNotifyArg (_, ~835) = RBN_BEGINDRAG | decompileNotifyArg (_, ~836) = RBN_ENDDRAG | decompileNotifyArg (_, ~837) = RBN_DELETINGBAND | decompileNotifyArg (_, ~838) = RBN_DELETEDBAND | decompileNotifyArg (_, ~839) = RBN_CHILDSIZE | decompileNotifyArg (_, ~800) = CBEN_GETDISPINFO | decompileNotifyArg (_, ~808) = CBEN_DRAGBEGIN | decompileNotifyArg (_, ~860) = IPN_FIELDCHANGED | decompileNotifyArg (_, ~880) = SBN_SIMPLEMODECHANGE | decompileNotifyArg (_, ~901) = PGN_SCROLL | decompileNotifyArg (_, ~902) = PGN_CALCSIZE | decompileNotifyArg (_, code) = NM_OTHER code in fun decompileNotify {wp, lp} = let val (hwndFrom, idFrom, code) = toMLNmhdr lp val notification = decompileNotifyArg (lp, code) in { idCtrl = SysWord.toInt wp, from = hwndFrom, idFrom = idFrom, notification = notification} end end end local val cFINDREPLACE = cStruct11(cDWORD, cHWND, cHINSTANCE, FindReplaceFlags.cFindReplaceFlags, cString, cString, cWORD, cWORD, cPointer, cPointer, cPointer) val {load=loadFindReplace, store=storeFindReplace, ctype={size=sizeFindReplace, ...}, ...} = breakConversion cFINDREPLACE type findMsg = { flags: FindReplaceFlags.flags, findWhat: string, replaceWith: string } in fun compileFindMsg({flags, findWhat, replaceWith}: findMsg) = let open Memory val vec = malloc sizeFindReplace (* Is this right? It's supposed to create a buffer to store the result. *) val freeFR = storeFindReplace(vec, (Word.toInt sizeFindReplace, hNull, hNull, flags, findWhat, replaceWith, 0, 0, null, null, null)) in (RegisterMessage "commdlg_FindReplace", 0w0, fromAddr vec, fn() => (freeFR(); free vec)) end fun decompileFindMsg{wp=_, lp}: findMsg = let val (_, _, _, flags, findwhat, replace, _, _, _, _, _) = loadFindReplace(toAddr lp) (* The argument is really a FINDREPLACE struct. *) in {flags=flags, findWhat=findwhat, replaceWith=replace} end end val toHMENU: SysWord.word -> HMENU = handleOfVoidStar o Memory.sysWord2VoidStar and fromHMENU: HMENU -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHWND: SysWord.word -> HWND = handleOfVoidStar o Memory.sysWord2VoidStar and fromHWND: HWND -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHDC: SysWord.word -> HDC = handleOfVoidStar o Memory.sysWord2VoidStar and fromHDC: HDC -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHFONT: SysWord.word -> HFONT = handleOfVoidStar o Memory.sysWord2VoidStar and fromHFONT: HFONT -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHRGN: SysWord.word -> HRGN = handleOfVoidStar o Memory.sysWord2VoidStar and fromHRGN: HRGN -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHDROP: SysWord.word -> HDROP = handleOfVoidStar o Memory.sysWord2VoidStar and fromHDROP: HDROP -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHICON: SysWord.word -> HICON = handleOfVoidStar o Memory.sysWord2VoidStar and fromHICON: HICON -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle val toHGDIOBJ: SysWord.word -> HGDIOBJ = handleOfVoidStar o Memory.sysWord2VoidStar and fromHGDIOBJ: HGDIOBJ -> SysWord.word = Memory.voidStar2Sysword o voidStarOfHandle (* Maybe we should have two different types for horizontal and vertical. *) datatype ScrollDirection = SB_BOTTOM | SB_ENDSCROLL | SB_LINEDOWN | SB_LINEUP | SB_PAGEDOWN | SB_PAGEUP | SB_THUMBPOSITION | SB_THUMBTRACK | SB_TOP | SB_LEFT | SB_RIGHT | SB_LINELEFT | SB_LINERIGHT | SB_PAGELEFT | SB_PAGERIGHT local val tab = [ (SB_LINEUP, 0w0: word), (SB_LINELEFT, 0w0), (SB_LINEDOWN, 0w1), (SB_LINERIGHT, 0w1), (SB_PAGEUP, 0w2), (SB_PAGELEFT, 0w2), (SB_PAGEDOWN, 0w3), (SB_PAGERIGHT, 0w3), (SB_THUMBPOSITION, 0w4), (SB_THUMBTRACK, 0w5), (SB_TOP, 0w6), (SB_LEFT, 0w6), (SB_BOTTOM, 0w7), (SB_RIGHT, 0w7), (SB_ENDSCROLL, 0w8) ] in val (toCsd, fromCsd) = tableLookup(tab, NONE) end (* This is a bit of a mess. Various operations take or return handles to these types of image and also take this value as a parameter. *) datatype ImageType = IMAGE_BITMAP | IMAGE_CURSOR | IMAGE_ENHMETAFILE | IMAGE_ICON local val tab = [ (IMAGE_BITMAP, 0), (IMAGE_ICON, 1), (IMAGE_CURSOR, 2), (IMAGE_ENHMETAFILE, 3) ] in val (toCit, fromCit) = tableLookup(tab, NONE) end val (toCcbf, fromCcbf) = clipLookup datatype MouseKeyFlags = MK_LBUTTON | MK_RBUTTON | MK_SHIFT | MK_CONTROL | MK_MBUTTON local val tab = [ (MK_LBUTTON, 0wx0001), (MK_RBUTTON, 0wx0002), (MK_SHIFT, 0wx0004), (MK_CONTROL, 0wx0008), (MK_MBUTTON, 0wx0010) ] in val (toCmkf, fromCmkf) = tableSetLookup(tab, NONE) end datatype MDITileFlags = MDITILE_VERTICAL | MDITILE_HORIZONTAL | MDITILE_SKIPDISABLED local val tab = [ (MDITILE_VERTICAL, 0wx0000), (MDITILE_HORIZONTAL, 0wx0001), (MDITILE_SKIPDISABLED, 0wx0002) ] in val (toCmdif, fromCmdif) = tableSetLookup(tab, NONE) end datatype WMPrintOption = PRF_CHECKVISIBLE | PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN | PRF_OWNED local val tab = [ (PRF_CHECKVISIBLE, 0wx00000001), (PRF_NONCLIENT, 0wx00000002), (PRF_CLIENT, 0wx00000004), (PRF_ERASEBKGND, 0wx00000008), (PRF_CHILDREN, 0wx00000010), (PRF_OWNED, 0wx00000020) ] in val (toCwmpl, fromCwmpl) = tableSetLookup(tab, NONE) end val (toCcbal, fromCcbal) = ComboBase.CBDIRATTRS val (toCesbf, fromCesbf) = ScrollBase.ENABLESCROLLBARFLAG (*fun itob i = i <> 0*) (* These deal with signed quantities. LOWORD/HIWORD deal with words *) local val shift32 = Word.fromInt(SysWord.wordSize-32) and shift16 = Word.fromInt(SysWord.wordSize-16) open SysWord infix 5 << ~>> infix 7 andb infix 6 orb (* Y is the high order word, X is the low order word. *) in fun getYLParam (i: SysWord.word) = toIntX((i << shift32) ~>> shift16) and getXLParam (i: SysWord.word) = toIntX((i << shift16) ~>> shift16) fun makeXYParam (x, y) = ((fromInt y andb 0wxffff) << 0w16) orb (fromInt x andb 0wxffff) end in type flags = WinBase.Style.flags and WindowPositionStyle = WinBase.WindowPositionStyle datatype ControlType = datatype ControlType datatype ScrollDirection = datatype ScrollDirection datatype HitTest = HTBORDER | HTBOTTOM | HTBOTTOMLEFT | HTBOTTOMRIGHT | HTCAPTION | HTCLIENT | HTCLOSE | HTERROR | HTGROWBOX | HTHELP | HTHSCROLL | HTLEFT | HTMENU | HTMAXBUTTON | HTMINBUTTON | HTNOWHERE | HTREDUCE | HTRIGHT | HTSIZE | HTSYSMENU | HTTOP | HTTOPLEFT | HTTOPRIGHT | HTTRANSPARENT | HTVSCROLL | HTZOOM datatype LRESULT = LRESINT of int | LRESHANDLE of HGDIOBJ datatype ImageType = datatype ImageType (* WM_SIZE options. *) datatype WMSizeOptions = SIZE_RESTORED | SIZE_MINIMIZED | SIZE_MAXIMIZED | SIZE_MAXSHOW | SIZE_MAXHIDE local val tab = [ (SIZE_RESTORED, 0w0: SysWord.word), (SIZE_MINIMIZED, 0w1), (SIZE_MAXIMIZED, 0w2), (SIZE_MAXSHOW, 0w3), (SIZE_MAXHIDE, 0w4) ] in val (fromWMSizeOpt, toWMSizeOpt) = tableLookup(tab, NONE) end (* WM_ACTIVATE options *) datatype WMActivateOptions = WA_INACTIVE | WA_ACTIVE | WA_CLICKACTIVE local val tab = [ (WA_INACTIVE, 0w0: word), (WA_ACTIVE, 0w1), (WA_CLICKACTIVE, 0w2) ] in val (fromWMactive, toWMactive) = tableLookup(tab, NONE) end datatype SystemCommand = SC_SIZE | SC_MOVE | SC_MINIMIZE | SC_MAXIMIZE | SC_NEXTWINDOW | SC_PREVWINDOW | SC_CLOSE | SC_VSCROLL | SC_HSCROLL | SC_MOUSEMENU | SC_KEYMENU | SC_ARRANGE | SC_RESTORE | SC_TASKLIST | SC_SCREENSAVE | SC_HOTKEY | SC_DEFAULT | SC_MONITORPOWER | SC_CONTEXTHELP | SC_SEPARATOR local val tab = [ (SC_SIZE, 0xF000), (SC_MOVE, 0xF010), (SC_MINIMIZE, 0xF020), (SC_MAXIMIZE, 0xF030), (SC_NEXTWINDOW, 0xF040), (SC_PREVWINDOW, 0xF050), (SC_CLOSE, 0xF060), (SC_VSCROLL, 0xF070), (SC_HSCROLL, 0xF080), (SC_MOUSEMENU, 0xF090), (SC_KEYMENU, 0xF100), (SC_ARRANGE, 0xF110), (SC_RESTORE, 0xF120), (SC_TASKLIST, 0xF130), (SC_SCREENSAVE, 0xF140), (SC_HOTKEY, 0xF150), (SC_DEFAULT, 0xF160), (SC_MONITORPOWER, 0xF170), (SC_CONTEXTHELP, 0xF180)] in val (fromSysCommand, toSysCommand) = tableLookup(tab, NONE) end datatype EMCharFromPos = EMcfpEdit of POINT | EMcfpRichEdit of POINT | EMcfpUnknown of SysWord.word datatype WMPrintOption = datatype WMPrintOption (* Parameters to EM_SETMARGINS. *) datatype MarginSettings = UseFontInfo | Margins of {left: int option, right: int option } datatype MouseKeyFlags = datatype MouseKeyFlags datatype MDITileFlags = datatype MDITileFlags (* TODO: Perhaps use a record for this. It's always possible to use functions from Word32 though. *) type KeyData = Word32.word datatype Notification = datatype Notification datatype HelpHandle = datatype HelpHandle local val tab = [ (HTBORDER, 18), (HTBOTTOM, 15), (HTBOTTOMLEFT, 16), (HTBOTTOMRIGHT, 17), (HTCAPTION, 2), (HTCLIENT, 1), (HTCLOSE, 20), (HTERROR, ~2), (HTGROWBOX, 4), (HTHELP, 21), (HTHSCROLL, 6), (HTLEFT, 10), (HTMENU, 5), (HTMAXBUTTON, 9), (HTMINBUTTON, 8), (HTNOWHERE, 0), (HTREDUCE, 8), (HTRIGHT, 11), (HTSIZE, 4), (HTSYSMENU, 3), (HTTOP, 12), (HTTOPLEFT, 13), (HTTOPRIGHT, 14), (HTTRANSPARENT, ~1), (HTVSCROLL, 7), (HTZOOM, 9) ] in val (fromHitTest, toHitTest) = tableLookup(tab, SOME(fn _ => HTERROR, fn _ => ~2)) (* Include default just in case a new value is added some time *) end type findReplaceFlags = FindReplaceFlags.flags type windowFlags = flags datatype Message = WM_NULL | WM_ACTIVATE of {active: WMActivateOptions, minimize: bool } (* Indicates a change in activation state *) | WM_ACTIVATEAPP of {active: bool, threadid: int } (* Notifies applications when a new task activates *) | WM_ASKCBFORMATNAME of { length: int, formatName: string ref} (* Retrieves the name of the clipboard format *) | WM_CANCELJOURNAL (* Notifies application when user cancels journaling *) | WM_CANCELMODE (* Notifies a Window to cancel internal modes *) | WM_CHANGECBCHAIN of { removed: HWND, next: HWND } (* Notifies clipboard viewer of removal from chain *) | WM_CHAR of {charCode: char, data: KeyData } (* Indicates the user pressed a character key *) | WM_CHARTOITEM of {key: int, caretpos: int, listbox: HWND } (* Provides list-box keystrokes to owner Window *) | WM_CHILDACTIVATE (* Notifies a child Window of activation *) (* This is WM_USER+1. It's only used in a GetFont dialogue box. | WM_CHOOSEFONT_GETLOGFONT of LOGFONT ref *) (* Retrieves LOGFONT structure for Font dialog box *) | WM_CLEAR (* Clears an edit control *) | WM_CLOSE (* System Close menu command was chosen *) | WM_COMMAND of {notifyCode: int, wId: int, control: HWND } (* Specifies a command message *) | WM_COMPAREITEM of (* Determines position of combo- or list-box item *) { controlid: int, ctlType: ControlType, ctlID: int, hItem: HWND, itemID1: int, itemData1: SysWord.word, itemID2: int, itemData2: SysWord.word } | WM_COPY (* Copies a selection to the clipboard *) | WM_CREATE of { instance: HINSTANCE, creation: Foreign.Memory.voidStar, menu: HMENU, parent: HWND, cy: int, cx: int, y: int, x: int, style: windowFlags, name: string, (* The class may be a string or an atom. *) class: ClassType, extendedstyle: int } (* Indicates a Window is being created *) | WM_CTLCOLORBTN of { displaycontext: HDC, button: HWND } (* Button is about to be drawn *) | WM_CTLCOLORDLG of { displaycontext: HDC, dialogbox: HWND } (* Dialog box is about to be drawn *) | WM_CTLCOLOREDIT of { displaycontext: HDC, editcontrol: HWND } (* Control is about to be drawn *) | WM_CTLCOLORLISTBOX of { displaycontext: HDC, listbox: HWND } (* List box is about to be drawn *) | WM_CTLCOLORMSGBOX of { displaycontext: HDC, messagebox: HWND } (* Message box is about to be drawn *) | WM_CTLCOLORSCROLLBAR of { displaycontext: HDC, scrollbar: HWND } (* Indicates scroll bar is about to be drawn *) | WM_CTLCOLORSTATIC of { displaycontext: HDC, staticcontrol: HWND } (* Control is about to be drawn *) (* Note the return value is an HBRUSH *) | WM_CUT (* Deletes a selection and copies it to the clipboard *) | WM_DEADCHAR of { charCode: char, data: KeyData } (* Indicates the user pressed a dead key *) | WM_DELETEITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, item: HWND, itemData: int } (* Indicates owner-draw item or control was altered *) | WM_DESTROY (* Indicates Window is about to be destroyed *) | WM_DESTROYCLIPBOARD (* Notifies owner that the clipboard was emptied *) | WM_DEVMODECHANGE of { devicename: string } (* Indicates the device-mode settings have changed *) | WM_DRAWCLIPBOARD (* Indicates the clipboard's contents have changed *) | WM_DRAWITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, itemAction: int, itemState: int, hItem: HWND , hDC: HDC, rcItem: RECT, itemData: int } (* Indicates owner-draw control/menu needs redrawing *) | WM_DROPFILES of { hDrop: HDROP } (* Indicates that a file has been dropped *) | WM_ENABLE of { enabled: bool } (* Indicates a Window's enable state is changing *) | WM_ENDSESSION of { endsession: bool } (* Indicates whether the Windows session is ending *) | WM_ENTERIDLE of { flag: int, window: HWND } (* Indicates a modal dialog box or menu is idle *) | WM_ENTERMENULOOP of { istrack: bool } (* Indicates entry into menu modal loop *) | WM_EXITMENULOOP of { istrack: bool } (* Indicates exit from menu modal loop *) | WM_ERASEBKGND of { devicecontext: HDC } (* Indicates a Window's background need erasing *) | WM_FONTCHANGE (* Indicates a change in the font-resource pool *) | WM_GETDLGCODE (* Allows dialog procedure to process control input TODO: This has parameters! *) | WM_GETFONT (* Retrieves the font that a control is using *) | WM_GETHOTKEY (* Gets the virtual-key code of a Window's hot key *) | WM_GETMINMAXINFO of { maxSize: POINT ref, maxPosition: POINT ref, minTrackSize: POINT ref, maxTrackSize: POINT ref } (* Gets minimum and maximum sizing information *) | WM_GETTEXT of { length: int, text: string ref } (* Gets the text that corresponds to a Window *) | WM_GETTEXTLENGTH (* Gets length of text associated with a Window *) | WM_HOTKEY of { id: int } (* Hot key has been detected *) | WM_HSCROLL of { value: ScrollDirection, position: int, scrollbar: HWND } (* Indicates a click in a horizontal scroll bar *) | WM_HSCROLLCLIPBOARD of { viewer: HWND, code: int, position: int } (* Prompts owner to scroll clipboard contents *) | WM_ICONERASEBKGND of { devicecontext: HDC } (* Notifies minimized Window to fill icon background *) | WM_INITDIALOG of { dialog: HWND, initdata: int } (* Initializes a dialog box *) | WM_INITMENU of { menu: HMENU } (* Indicates a menu is about to become active *) | WM_INITMENUPOPUP of { menupopup: HMENU, itemposition: int, isSystemMenu: bool } (* Indicates a pop-up menu is being created *) | WM_KEYDOWN of { virtualKey: int, data: KeyData } (* Indicates a nonsystem key was pressed *) | WM_KEYUP of { virtualKey: int, data: KeyData } (* Indicates a nonsystem key was released *) | WM_KILLFOCUS of { receivefocus: HWND } (* Indicates the Window is losing keyboard focus *) | WM_LBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of left button *) | WM_LBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when left mouse button is pressed *) | WM_LBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when left mouse button is released *) | WM_MBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of middle mouse button *) | WM_MBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when middle mouse button is pressed *) | WM_MBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when middle mouse button is released *) | WM_MDICASCADE of { skipDisabled: bool } (* Arranges MDI child Windows in cascade format *) | WM_MDICREATE of { class: ClassType, title: string, instance: HINSTANCE, x: int, y: int, cx: int, cy: int, style: int, cdata: int } (* Prompts MDI client to create a child Window *) | WM_MDIDESTROY of { child: HWND } (* Closes an MDI child Window *) | WM_MDIGETACTIVE (* Retrieves data about the active MDI child Window *) | WM_MDIICONARRANGE (* Arranges minimized MDI child Windows *) | WM_MDIMAXIMIZE of { child: HWND } (* Maximizes an MDI child Window *) | WM_MDINEXT of { child: HWND, flagnext: bool } (* Activates the next MDI child Window *) | WM_MDIREFRESHMENU (* Refreshes an MDI frame Window's menu *) | WM_MDIRESTORE of { child: HWND } (* Prompts MDI client to restore a child Window *) | WM_MDISETMENU of { frameMenu: HMENU, windowMenu: HMENU } (* Replaces an MDI frame Window's menu *) | WM_MDITILE of { tilingflag: MDITileFlags list } (* Arranges MDI child Windows in tiled format *) | WM_MEASUREITEM of { senderId: int, ctlType: ControlType, ctlID: int, itemID: int, itemWidth: int ref, itemHeight: int ref, itemData: int } (* Requests dimensions of owner-draw control or item *) | WM_MENUCHAR of { ch: char, menuflag: MenuBase.MenuFlag, menu: HMENU } (* Indicates an unknown menu mnemonic was pressed *) | WM_MENUSELECT of { menuitem: int, menuflags: MenuBase.MenuFlag list, menu: HMENU } (* Indicates that the user selected a menu item *) | WM_MOUSEACTIVATE of { parent: HWND, hitTest: HitTest, message: int } (* Indicates a mouse click in an inactive Window *) | WM_MOUSEMOVE of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates mouse-cursor movement *) | WM_MOUSEHOVER of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates the mouse hovering in the client area *) | WM_MOUSELEAVE (* Indicates the mouse leaving the client area *) | WM_MOVE of { x: int, y: int } (* Indicates a Window's position has changed *) | WM_NCACTIVATE of { active: bool } (* Changes the active state of nonclient area *) | WM_NCCALCSIZE of { validarea: bool, newrect: RECT ref, oldrect: RECT, oldclientarea: RECT, hwnd: HWND, insertAfter: HWND, x: int, y: int, cx: int, cy: int, style: WindowPositionStyle list} (* Calculates the size of a Window's client area *) | WM_NCCREATE of { instance: HINSTANCE, creation: Foreign.Memory.voidStar, menu: HMENU, parent: HWND, cy: int, cx: int, y: int, x: int, style: windowFlags, name: string, class: ClassType, extendedstyle: int } (* Indicates a Window's nonclient area being created *) | WM_NCDESTROY (* Indicates Window's nonclient area being destroyed *) | WM_NCHITTEST of { x: int, y: int } (* Indicates mouse-cursor movement *) | WM_NCLBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient left button double-click *) | WM_NCLBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates left button pressed in nonclient area *) | WM_NCLBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates left button released in nonclient area *) | WM_NCMBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient middle button double-click *) | WM_NCMBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates middle button pressed in nonclient area *) | WM_NCMBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates middle button released in nonclient area *) | WM_NCMOUSEMOVE of { hitTest: HitTest, x: int, y: int } (* Indicates mouse-cursor movement in nonclient area *) | WM_NCMOUSEHOVER of { hitTest: HitTest, x: int, y: int } (* Indicates the mouse hovering in the nonclient area *) | WM_NCMOUSELEAVE (* Indicates the mouse leaving the nonclient area *) | WM_NCPAINT of { region: HRGN } (* Indicates a Window's frame needs painting *) | WM_NCRBUTTONDBLCLK of { hitTest: HitTest, x: int, y: int } (* Indicates nonclient right button double-click *) | WM_NCRBUTTONDOWN of { hitTest: HitTest, x: int, y: int } (* Indicates right button pressed in nonclient area *) | WM_NCRBUTTONUP of { hitTest: HitTest, x: int, y: int } (* Indicates right button released in nonclient area *) | WM_NEXTDLGCTL of { control: int, handleflag: bool } (* Sets focus to different dialog box control *) | WM_PAINT (* Indicates a Window's client area need painting *) | WM_PAINTCLIPBOARD of { clipboard: HWND } (* Prompts owner to display clipboard contents *) | WM_PAINTICON (* Icon is about to be painted *) | WM_PALETTECHANGED of { palChg: HWND } (* Indicates the focus-Window realized its palette *) | WM_PALETTEISCHANGING of { realize: HWND } (* Informs Windows that palette is changing *) | WM_PARENTNOTIFY of { eventflag: int, idchild: int, value: int } (* Notifies parent of child-Window activity *) | WM_PASTE (* Inserts clipboard data into an edit control *) | WM_POWER of { powerevent: int } (* Indicates the system is entering suspended mode *) | WM_QUERYDRAGICON (* Requests a cursor handle for a minimized Window *) | WM_QUERYENDSESSION of { source: int } (* Requests that the Windows session be ended *) | WM_QUERYNEWPALETTE (* Allows a Window to realize its logical palette *) | WM_QUERYOPEN (* Requests that a minimized Window be restored *) | WM_QUEUESYNC (* Delimits CBT messages *) | WM_QUIT of { exitcode: int } (* Requests that an application be terminated *) | WM_RBUTTONDBLCLK of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates double-click of right mouse button *) | WM_RBUTTONDOWN of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when right mouse button is pressed *) | WM_RBUTTONUP of { keyflags: MouseKeyFlags list, x: int, y: int } (* Indicates when right mouse button is released *) | WM_RENDERALLFORMATS (* Notifies owner to render all clipboard formats *) | WM_RENDERFORMAT of { format: ClipboardFormat } (* Notifies owner to render clipboard data *) | WM_SETCURSOR of { cursorwindow: HWND, hitTest: HitTest, mousemessage: int } (* Prompts a Window to set the cursor shape *) | WM_SETFOCUS of { losing: HWND } | WM_SETFONT of {font: HFONT, redrawflag: bool } | WM_SETHOTKEY of { virtualKey: int } | WM_SETREDRAW of { redrawflag: bool } | WM_SETTEXT of { text: string } | WM_SHOWWINDOW of { showflag: bool, statusflag: int } | WM_SIZE of { flag: WMSizeOptions, width: int, height: int } | WM_SIZECLIPBOARD of { viewer: HWND} | WM_SYSCHAR of { charCode: char, data: KeyData } | WM_SYSCOLORCHANGE | WM_SYSCOMMAND of { commandvalue: SystemCommand, sysBits: int, p: POINT } | WM_SYSDEADCHAR of { charCode: char, data: KeyData } | WM_SYSKEYDOWN of { virtualKey: int, data: KeyData } | WM_SYSKEYUP of { virtualKey: int, data: KeyData } | WM_TIMECHANGE (* Indicates the system time has been set *) | WM_TIMER of { timerid: int } | WM_UNDO | WM_SYSTEM_OTHER of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_USER of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_APP of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_REGISTERED of { uMsg: int, wParam: SysWord.word, lParam: SysWord.word } | WM_VKEYTOITEM of { virtualKey: int, caretpos: int, listbox: HWND } | WM_VSCROLL of { value: ScrollDirection, position: int, scrollbar: HWND } | WM_VSCROLLCLIPBOARD of { viewer: HWND, code: int, position: int } | WM_WINDOWPOSCHANGED of { hwnd: HWND, front: HWND, x: int, y: int, width: int, height: int, flags: WindowPositionStyle list } | WM_WINDOWPOSCHANGING of { hwnd: HWND, front: HWND ref, x: int ref, y: int ref, width: int ref, height: int ref, flags: WindowPositionStyle list ref } | WM_NOTIFY of {from: HWND, idCtrl: int, idFrom: int, notification: Notification } | WM_CAPTURECHANGED of { newCapture: HWND } | WM_ENTERSIZEMOVE | WM_EXITSIZEMOVE | WM_PRINT of {hdc: HDC, flags: WMPrintOption list } | WM_PRINTCLIENT of {hdc: HDC, flags: WMPrintOption list } | WM_HELP of { ctrlId: int, itemHandle: HelpHandle, contextId: int, mousePos: POINT } | WM_GETICON of { big: bool } | WM_SETICON of { big: bool, icon: HICON } | WM_CONTEXTMENU of { hwnd: HWND, xPos: int, yPos: int } | WM_DISPLAYCHANGE of { bitsPerPixel: int, xScreen: int, yScreen: int } | EM_CANUNDO | EM_CHARFROMPOS of EMCharFromPos | EM_EMPTYUNDOBUFFER | EM_FMTLINES of {addEOL: bool} | EM_GETFIRSTVISIBLELINE | EM_GETLIMITTEXT | EM_GETLINE of { lineNo: int, size: int, result: string ref } | EM_GETLINECOUNT | EM_GETMARGINS | EM_GETMODIFY | EM_GETPASSWORDCHAR | EM_GETRECT of {rect: RECT ref} | EM_GETSEL of {startPos: int ref, endPos: int ref} | EM_GETTHUMB | EM_LIMITTEXT of {limit: int} | EM_LINEFROMCHAR of {index: int} | EM_LINEINDEX of {line: int} | EM_LINELENGTH of {index: int} | EM_LINESCROLL of {xScroll: int, yScroll: int} | EM_POSFROMCHAR of {index: int} | EM_REPLACESEL of {canUndo: bool, text: string} | EM_SCROLL of {action: ScrollDirection} | EM_SCROLLCARET | EM_SETMARGINS of {margins: MarginSettings} | EM_SETMODIFY of { modified: bool } | EM_SETPASSWORDCHAR of { ch: char } | EM_SETREADONLY of { readOnly: bool } | EM_SETRECT of {rect: RECT} | EM_SETRECTNP of {rect: RECT} | EM_SETSEL of {startPos: int, endPos: int} | EM_SETTABSTOPS of {tabs: IntVector.vector} | EM_UNDO | BM_CLICK | BM_GETCHECK | BM_GETIMAGE of {imageType: ImageType} | BM_GETSTATE | BM_SETCHECK of {state: int} | BM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType} | BM_SETSTATE of {highlight: bool } | BM_SETSTYLE of {redraw: bool, style: windowFlags} | CB_GETEDITSEL of {startPos: int ref, endPos: int ref} | CB_LIMITTEXT of {limit: int} | CB_SETEDITSEL of {startPos: int, endPos: int} | CB_ADDSTRING of { text: string } | CB_DELETESTRING of { index: int } | CB_GETCOUNT | CB_GETCURSEL | CB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string } | CB_GETLBTEXT of { index: int, length: int, text: string ref } | CB_GETLBTEXTLEN of { index: int } | CB_INSERTSTRING of { index: int, text: string } | CB_RESETCONTENT | CB_FINDSTRING of { indexStart: int, text: string } | CB_SELECTSTRING of { indexStart: int, text: string } | CB_SETCURSEL of { index: int } | CB_SHOWDROPDOWN of { show: bool } | CB_GETITEMDATA of { index: int } | CB_SETITEMDATA of { index: int, data: int } | CB_GETDROPPEDCONTROLRECT of { rect: RECT ref } | CB_SETITEMHEIGHT of { index: int, height: int } | CB_GETITEMHEIGHT of { index: int } | CB_SETEXTENDEDUI of { extended: bool } | CB_GETEXTENDEDUI | CB_GETDROPPEDSTATE | CB_FINDSTRINGEXACT of { indexStart: int, text: string } | CB_SETLOCALE of { locale: int } | CB_GETLOCALE | CB_GETTOPINDEX | CB_SETTOPINDEX of { index: int } | CB_GETHORIZONTALEXTENT | CB_SETHORIZONTALEXTENT of { extent: int } | CB_GETDROPPEDWIDTH | CB_SETDROPPEDWIDTH of { width: int } | CB_INITSTORAGE of { items: int, bytes: int } | LB_ADDSTRING of { text: string } | LB_INSERTSTRING of { index: int, text: string } | LB_DELETESTRING of { index: int } | LB_SELITEMRANGEEX of { first: int, last: int } | LB_RESETCONTENT | LB_SETSEL of { select: bool, index: int } | LB_SETCURSEL of { index: int } | LB_GETSEL of { index: int } | LB_GETCURSEL | LB_GETTEXT of { index: int, length: int, text: string ref } | LB_GETTEXTLEN of { index: int } | LB_GETCOUNT | LB_SELECTSTRING of { indexStart: int, text: string } | LB_DIR of { attrs: ComboBase.CBDirAttr list, fileSpec: string } | LB_GETTOPINDEX | LB_FINDSTRING of { indexStart: int, text: string } | LB_GETSELCOUNT | LB_GETSELITEMS of { items: IntArray.array } | LB_SETTABSTOPS of { tabs: IntVector.vector } | LB_GETHORIZONTALEXTENT | LB_SETHORIZONTALEXTENT of { extent: int } | LB_SETCOLUMNWIDTH of { column: int } | LB_ADDFILE of { fileName: string } | LB_SETTOPINDEX of { index: int } | LB_GETITEMRECT of { rect: RECT ref, index: int } | LB_GETITEMDATA of { index: int } | LB_SETITEMDATA of { index: int, data: int } | LB_SELITEMRANGE of { select: bool, first: int, last: int } | LB_SETANCHORINDEX of { index: int } | LB_GETANCHORINDEX | LB_SETCARETINDEX of { index: int, scroll: bool } | LB_GETCARETINDEX | LB_SETITEMHEIGHT of { index: int, height: int } | LB_GETITEMHEIGHT of { index: int } | LB_FINDSTRINGEXACT of { indexStart: int, text: string } | LB_SETLOCALE of { locale: int } (* Should be an abstract type? *) | LB_GETLOCALE (* Result will be the type used above. *) | LB_SETCOUNT of { items: int } | LB_INITSTORAGE of { items: int, bytes: int } | LB_ITEMFROMPOINT of { point: POINT } | STM_GETICON | STM_GETIMAGE of {imageType: ImageType} | STM_SETICON of {icon: HICON} | STM_SETIMAGE of {image: HGDIOBJ, imageType: ImageType} | SBM_SETPOS of { pos: int, redraw: bool } | SBM_GETPOS | SBM_SETRANGE of { minPos: int, maxPos: int } | SBM_SETRANGEREDRAW of { minPos: int, maxPos: int } | SBM_GETRANGE of { minPos: int ref, maxPos: int ref } | SBM_ENABLE_ARROWS of ScrollBase.enableArrows | SBM_SETSCROLLINFO of { info: ScrollBase.SCROLLINFO, options: ScrollBase.ScrollInfoOption list } | SBM_GETSCROLLINFO of { info: ScrollBase.SCROLLINFO ref, options: ScrollBase.ScrollInfoOption list } | FINDMSGSTRING of { flags: findReplaceFlags, findWhat: string, replaceWith: string } (* GetMessage and PeekMessage return these values. *) type MSG = { msg: Message, hwnd: HWND, time: Time.time, pt: {x: int, y: int} } type HGDIOBJ = HGDIOBJ and HWND = HWND and RECT = RECT and POINT = POINT and HMENU = HMENU and HICON = HICON and HINSTANCE = HINSTANCE and HDC = HDC and HFONT = HFONT and HRGN = HRGN and HDROP = HDROP and ClipboardFormat = ClipboardFormat and ClassType = ClassType and findReplaceFlags = FindReplaceFlags.flags and windowFlags = flags (* WM_MOUSEMOVE etc *) fun decompileMouseMove(constr, wp, lp) = let val lp32 = Word32.fromLargeWord lp in constr { keyflags = fromCmkf(Word32.fromLargeWord wp), x = Word.toInt(LOWORD lp32), y = Word.toInt(HIWORD lp32) } end fun compileMouseMove(code, { keyflags, x, y}) = (code, Word32.toLargeWord (toCmkf keyflags), Word32.toLargeWord(MAKELONG(Word.fromInt x, Word.fromInt y)), fn()=>()) local (* EM_GETSEL and CB_GETEDITSEL *) val {load=loadDword, store=storeDword, ctype={size=sizeDword, ...}, ...} = breakConversion cDWORD in fun compileGetSel(code, {startPos=ref s, endPos=ref e}) = let open Memory infix 6 ++ (* Allocate space for two DWORDs *) val mem = malloc(sizeDword * 0w2) val eAddr = mem ++ sizeDword val () = ignore(storeDword(mem, s)) (* Can ignore the results *) and () = ignore(storeDword(eAddr, e)) in (code, fromAddr mem, fromAddr eAddr, fn () => free mem) end and decompileGetSel{wp, lp} = let val s = loadDword(toAddr wp) and e = loadDword(toAddr lp) in {startPos = ref s, endPos=ref e} end (* Update ML from wp/lp values *) fun updateGetSelFromWpLp({startPos, endPos}, {wp, lp}) = ( startPos := loadDword(toAddr wp); endPos := loadDword(toAddr lp) ) (* Update wp/lp from ML *) and updateGetSelParms({wp, lp}, {startPos = ref s, endPos = ref e}) = ( ignore(storeDword(toAddr wp, s)); ignore(storeDword(toAddr lp, e)) ) end local (* EM_GETRECT and CB_GETDROPPEDCONTROLRECT. LB_GETITEMRECT and WM_NCCALCSIZE are similar *) val {load=loadRect, store=storeRect, ctype={size=sizeRect, ...}, ...} = breakConversion cRect in fun compileGetRect(code, wp, r) = let open Memory val mem = malloc sizeRect val () = ignore(storeRect(mem, r)) (* Can ignore the result *) in (code, wp, fromAddr mem, fn () => free mem) end and compileSetRect(code, rect) = let open Memory val mem = malloc sizeRect val () = ignore(storeRect(mem, rect)) in (code, 0w0, fromAddr mem, fn () => free mem) end (* These can be used for updating *) val fromCrect = loadRect (* For the moment *) and toCrect = ignore o storeRect end val hiWord = Word.toInt o HIWORD o Word32.fromLargeWord and loWord = Word.toInt o LOWORD o Word32.fromLargeWord (* Decode a received message. *) fun decompileMessage (0x0000, _: SysWord.word, _: SysWord.word) = WM_NULL | decompileMessage (0x0001, wp, lp) = WM_CREATE(decompileCreate{wp=wp, lp=lp}) | decompileMessage (0x0002, _, _) = WM_DESTROY | decompileMessage (0x0003, _, lp) = WM_MOVE { x = loWord lp, y = hiWord lp } | decompileMessage (0x0005, wp, lp) = WM_SIZE { flag = toWMSizeOpt wp, width = loWord lp, height = hiWord lp } | decompileMessage (0x0006, wp, _) = let val wp32 = Word32.fromLargeWord wp in WM_ACTIVATE { active = toWMactive (LOWORD wp32), minimize = HIWORD wp32 <> 0w0 } end | decompileMessage (0x0007, wp, _) = WM_SETFOCUS { losing = handleOfVoidStar(toAddr wp) } | decompileMessage (0x0008, wp, _) = WM_KILLFOCUS { receivefocus = handleOfVoidStar(toAddr wp) } | decompileMessage (0x000A, wp, _) = WM_ENABLE { enabled = wp <> 0w0 } | decompileMessage (0x000B, wp, _) = WM_SETREDRAW { redrawflag = wp <> 0w0 } | decompileMessage (0x000C, _, lp) = WM_SETTEXT { text = fromCstring(toAddr lp) } (* When the message arrives we don't know what the text is. *) | decompileMessage (0x000D, wp, _) = WM_GETTEXT { length = SysWord.toInt wp, text = ref "" } | decompileMessage ( 0x000E, _, _) = WM_GETTEXTLENGTH | decompileMessage ( 0x000F, _, _) = WM_PAINT | decompileMessage ( 0x0010, _, _) = WM_CLOSE | decompileMessage ( 0x0011, wp, _) = WM_QUERYENDSESSION { source = SysWord.toInt wp } | decompileMessage (0x0012, wp, _) = WM_QUIT {exitcode = SysWord.toInt wp } | decompileMessage ( 0x0013, _, _) = WM_QUERYOPEN | decompileMessage ( 0x0014, wp, _) = WM_ERASEBKGND { devicecontext = toHDC wp } | decompileMessage ( 0x0015, _, _) = WM_SYSCOLORCHANGE | decompileMessage ( 0x0016, wp, _) = WM_ENDSESSION { endsession = wp <> 0w0 } | decompileMessage ( 0x0018, wp, lp) = WM_SHOWWINDOW { showflag = wp <> 0w0, statusflag = SysWord.toInt lp } | decompileMessage ( 0x001B, _, lp) = WM_DEVMODECHANGE { devicename = fromCstring(toAddr lp) } (* "0x001B" *) | decompileMessage ( 0x001C, wp, lp) = WM_ACTIVATEAPP { active = wp <> 0w0, threadid = SysWord.toInt lp } (* "0x001C" *) | decompileMessage ( 0x001D, _, _) = WM_FONTCHANGE | decompileMessage ( 0x001E, _, _) = WM_TIMECHANGE (* "0x001E" *) | decompileMessage ( 0x001F, _, _) = WM_CANCELMODE (* "0x001F" *) | decompileMessage ( 0x0020, wp, lp) = WM_SETCURSOR { cursorwindow = toHWND wp, hitTest = toHitTest(loWord lp), mousemessage = hiWord lp } | decompileMessage ( 0x0021, wp, lp) = WM_MOUSEACTIVATE { parent = toHWND wp, hitTest = toHitTest(loWord lp), message = hiWord lp } | decompileMessage (0x0022, _, _) = WM_CHILDACTIVATE (* "0x0022" *) | decompileMessage (0x0023, _, _) = WM_QUEUESYNC (* "0x0023" *) | decompileMessage (0x0024, wp, lp) = WM_GETMINMAXINFO(decompileMinMax{lp=lp, wp=wp}) | decompileMessage ( 0x0026, _, _) = WM_PAINTICON | decompileMessage ( 0x0027, wp, _) = WM_ICONERASEBKGND { devicecontext = toHDC wp } (* "0x0027" *) | decompileMessage ( 0x0028, wp, lp) = WM_NEXTDLGCTL { control = SysWord.toInt wp, handleflag = lp <> 0w0 } (* "0x0028" *) | decompileMessage (0x002B, wp, lp) = let val (ctlType,ctlID,itemID,itemAction,itemState,hItem,hDC, rcItem,itemData) = toMLDrawItem lp in WM_DRAWITEM{ senderId = SysWord.toInt wp, ctlType = ctlType, ctlID = ctlID, itemID = itemID, itemAction = itemAction, itemState = itemState, hItem = hItem, hDC = hDC, rcItem = rcItem, itemData = itemData } end | decompileMessage (0x002C, wp, lp) = let val (ctlType,ctlID,itemID, itemWidth,itemHeight,itemData) = toMLMeasureItem lp in WM_MEASUREITEM { senderId = SysWord.toInt wp, ctlType = ctlType, ctlID = ctlID, itemID = itemID, itemWidth = ref itemWidth, itemHeight = ref itemHeight, itemData = itemData } end | decompileMessage (0x002D, wp, lp) = let val (ctlType,ctlID,itemID,hItem,itemData) = toMLDeleteItem lp in WM_DELETEITEM { senderId = SysWord.toInt wp, ctlType = ctlType, ctlID = ctlID, itemID = itemID, item = hItem, itemData = itemData } end | decompileMessage ( 0x002E, wp, lp) = WM_VKEYTOITEM { virtualKey = loWord wp, caretpos = hiWord wp, listbox = toHWND lp } (* "0x002E" *) | decompileMessage ( 0x002F, wp, lp) = WM_CHARTOITEM { key = loWord wp, caretpos = hiWord wp,listbox = toHWND lp } (* "0x002F" *) | decompileMessage ( 0x0030, wp, lp) = (* The definition of WM_SETFONT says that it is the low order word of lp that says whether the control should be redrawn immediately. *) WM_SETFONT { font = toHFONT wp, redrawflag = SysWord.andb(0wxffff, lp) <> 0w0 } (* "0x0030" *) | decompileMessage ( 0x0031, _, _) = WM_GETFONT (* "0x0031" *) | decompileMessage ( 0x0032, wp, _) = WM_SETHOTKEY { virtualKey = SysWord.toInt wp } (* "0x0032" *) | decompileMessage ( 0x0033, _, _) = WM_GETHOTKEY (* "0x0033" *) | decompileMessage ( 0x0037, _, _) = WM_QUERYDRAGICON (* "0x0037" *) | decompileMessage (0x0039, wp, lp) = let val (ctlType, ctlID, hItem, itemID1, itemData1, itemID2, itemData2, _) = toMLCompareItem lp in WM_COMPAREITEM { controlid = SysWord.toInt wp, ctlType = ctlType, ctlID = ctlID, hItem = hItem, itemID1 = itemID1, itemData1 = itemData1, itemID2 = itemID2, itemData2 = itemData2 } end | decompileMessage (0x0046, wp, lp) = WM_WINDOWPOSCHANGING(cToMLWindowPosChanging{wp=wp, lp=lp}) | decompileMessage (0x0047, wp, lp) = WM_WINDOWPOSCHANGED(cToMLWindowPosChanged{wp=wp, lp=lp}) | decompileMessage ( 0x0048, wp, _) = WM_POWER { powerevent = SysWord.toInt wp } (* "0x0048" *) | decompileMessage ( 0x004B, _, _) = WM_CANCELJOURNAL (* "0x004B" *) | decompileMessage ( 0x004E, wp, lp) = WM_NOTIFY(decompileNotify{wp=wp, lp=lp}) | decompileMessage ( 0x0053, wp, lp) = WM_HELP(decompileHelpInfo{wp=wp, lp=lp}) (* WM_INPUTLANGCHANGEREQUEST 0x0050 WM_INPUTLANGCHANGE 0x0051 WM_TCARD 0x0052 WM_USERCHANGED 0x0054 WM_NOTIFYFORMAT 0x0055 NFR_ANSI 1 NFR_UNICODE 2 NF_QUERY 3 NF_REQUERY 4 WM_CONTEXTMENU 0x007B WM_STYLECHANGING 0x007C WM_STYLECHANGED 0x007D *) | decompileMessage ( 0x007B, wp, lp) = WM_CONTEXTMENU { hwnd = toHWND wp, xPos = loWord lp, yPos = hiWord lp} | decompileMessage ( 0x007E, wp, lp) = WM_DISPLAYCHANGE { bitsPerPixel = SysWord.toInt wp, xScreen = loWord lp, yScreen = hiWord lp} | decompileMessage ( 0x007F, wp, _) = WM_GETICON { big = SysWord.toInt wp = 1} | decompileMessage ( 0x0080, wp, lp) = WM_SETICON { big = SysWord.toInt wp = 1, icon = toHICON lp} | decompileMessage ( 0x0081, wp, lp) = WM_NCCREATE(decompileCreate{wp=wp, lp=lp}) | decompileMessage ( 0x0082, _, _) = WM_NCDESTROY | decompileMessage ( 0x0083, wp, lp) = WM_NCCALCSIZE(decompileNCCalcSize{wp=wp, lp=lp}) | decompileMessage ( 0x0084, _, lp) = WM_NCHITTEST { x = loWord lp, y = hiWord lp } (* "0x0084" *) | decompileMessage ( 0x0085, wp, _) = WM_NCPAINT { region = toHRGN wp } (* "0x0085" *) | decompileMessage ( 0x0086, wp, _) = WM_NCACTIVATE { active = wp <> 0w0 } (* "0x0086" *) | decompileMessage ( 0x0087, _, _) = WM_GETDLGCODE (* "0x0087" *) | decompileMessage ( 0x00A0, wp, lp) = WM_NCMOUSEMOVE { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A1, wp, lp) = WM_NCLBUTTONDOWN { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A2, wp, lp) = WM_NCLBUTTONUP { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A3, wp, lp) = WM_NCLBUTTONDBLCLK { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A4, wp, lp) = WM_NCRBUTTONDOWN { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A5, wp, lp) = WM_NCRBUTTONUP { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A6, wp, lp) = WM_NCRBUTTONDBLCLK { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A7, wp, lp) = WM_NCMBUTTONDOWN { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A8, wp, lp) = WM_NCMBUTTONUP { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage ( 0x00A9, wp, lp) = WM_NCMBUTTONDBLCLK { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } (* Edit control messages *) | decompileMessage ( 0x00B0, wp, lp) = EM_GETSEL (decompileGetSel{wp=wp, lp=lp}) | decompileMessage ( 0x00B1, wp, lp) = EM_SETSEL { startPos = SysWord.toInt wp, endPos = SysWord.toInt lp } | decompileMessage ( 0x00B2, _, lp) = EM_GETRECT {rect = ref(fromCrect(toAddr lp))} | decompileMessage ( 0x00B3, _, lp) = EM_SETRECT { rect = fromCrect(toAddr lp) } | decompileMessage ( 0x00B4, _, lp) = EM_SETRECTNP { rect = fromCrect(toAddr lp) } | decompileMessage ( 0x00B5, wp, _) = EM_SCROLL{action = fromCsd(Word.fromLargeWord wp)} | decompileMessage ( 0x00B6, wp, lp) = EM_LINESCROLL{xScroll = SysWord.toInt wp, yScroll = SysWord.toInt lp} | decompileMessage ( 0x00B7, _, _) = EM_SCROLLCARET | decompileMessage ( 0x00B8, _, _) = EM_GETMODIFY | decompileMessage ( 0x00B9, wp, _) = EM_SETMODIFY{modified = wp <> 0w0} | decompileMessage ( 0x00BA, _, _) = EM_GETLINECOUNT | decompileMessage ( 0x00BB, wp, _) = EM_LINEINDEX {line = SysWord.toIntX (* -1 = current line *) wp} (* EM_SETHANDLE 0x00BC *) | decompileMessage ( 0x00BE, _, _) = EM_GETTHUMB | decompileMessage ( 0x00C1, wp, _) = EM_LINELENGTH {index = SysWord.toIntX (* May be -1 *) wp} | decompileMessage ( 0x00C2, wp, lp) = EM_REPLACESEL {canUndo = wp <> 0w0, text = fromCstring(toAddr lp)} | decompileMessage ( 0x00C4, wp, lp) = EM_GETLINE(decompileGetLine{wp=wp, lp=lp}) | decompileMessage ( 0x00C5, wp, _) = EM_LIMITTEXT {limit = SysWord.toInt wp} | decompileMessage ( 0x00C6, _, _) = EM_CANUNDO | decompileMessage ( 0x00C7, _, _) = EM_UNDO | decompileMessage ( 0x00C8, wp, _) = EM_FMTLINES{addEOL = wp <> 0w0} | decompileMessage ( 0x00C9, wp, _) = EM_LINEFROMCHAR{index = SysWord.toInt wp} | decompileMessage ( 0x00CB, wp, lp) = EM_SETTABSTOPS{tabs=decompileTabStops{wp=wp, lp=lp}} | decompileMessage ( 0x00CC, wp, _) = EM_SETPASSWORDCHAR{ch = chr (SysWord.toInt wp)} | decompileMessage ( 0x00CD, _, _) = EM_EMPTYUNDOBUFFER | decompileMessage ( 0x00CE, _, _) = EM_GETFIRSTVISIBLELINE | decompileMessage ( 0x00CF, wp, _) = EM_SETREADONLY{readOnly = wp <> 0w0} (* EM_SETWORDBREAKPROC 0x00D0 EM_GETWORDBREAKPROC 0x00D1 *) | decompileMessage (0x00D2, _, _) = EM_GETPASSWORDCHAR | decompileMessage (0x00D3, wp, lp) = if wp = 0wxffff then EM_SETMARGINS{margins=UseFontInfo} else let val left = if SysWord.andb(wp, 0w1) <> 0w0 then SOME(loWord lp) else NONE val right = if SysWord.andb(wp, 0w2) <> 0w0 then SOME(hiWord lp) else NONE in EM_SETMARGINS{margins=Margins{left=left, right=right}} end | decompileMessage (0x00D4, _, _) = EM_GETMARGINS | decompileMessage (0x00D5, _, _) = EM_GETLIMITTEXT | decompileMessage (0x00D6, wp, _) = EM_POSFROMCHAR {index = SysWord.toInt wp} | decompileMessage (0x00D7, _, lp) = (* The value in lParam is different depending on whether this is an edit control or a rich edit control. Since we don't know we just pass the lp value. *) EM_CHARFROMPOS(EMcfpUnknown lp) (* Scroll bar messages *) | decompileMessage (0x00E0, wp, lp) = SBM_SETPOS {pos = SysWord.toInt wp, redraw = lp <> 0w0} | decompileMessage (0x00E1, _, _) = SBM_GETPOS | decompileMessage (0x00E2, wp, lp) = SBM_SETRANGE {minPos = SysWord.toInt wp, maxPos = SysWord.toInt lp} | decompileMessage (0x00E6, wp, lp) = SBM_SETRANGEREDRAW {minPos = SysWord.toInt wp, maxPos = SysWord.toInt lp} | decompileMessage (0x00E3, wp, lp) = SBM_GETRANGE { minPos = ref(loadInt(toAddr wp)), maxPos = ref(loadInt(toAddr lp)) } | decompileMessage (0x00E4, wp, _) = SBM_ENABLE_ARROWS(fromCesbf(SysWord.toInt wp)) | decompileMessage (0x00E9, _, lp) = let val (info, options) = toScrollInfo lp in SBM_SETSCROLLINFO{ info = info, options = options } end | decompileMessage (0x00EA, _, lp) = let (* The values may not be correct at this point but the mask should have been set. *) val (info, options) = toScrollInfo lp in SBM_GETSCROLLINFO{ info = ref info, options = options } end (* Button control messages *) | decompileMessage (0x00F0, _, _) = BM_GETCHECK | decompileMessage (0x00F1, wp, _) = BM_SETCHECK{state = SysWord.toInt wp} | decompileMessage (0x00F2, _, _) = BM_GETSTATE | decompileMessage (0x00F3, wp, _) = BM_SETSTATE{highlight = SysWord.toInt wp <> 0} | decompileMessage (0x00F4, wp, lp) = BM_SETSTYLE{redraw = SysWord.toInt lp <> 0, style = Style.fromWord wp} | decompileMessage (0x00F5, _, _) = BM_CLICK | decompileMessage (0x00F6, wp, _) = BM_GETIMAGE{imageType = fromCit(SysWord.toInt wp)} | decompileMessage (0x00F7, wp, lp) = BM_SETIMAGE{imageType = fromCit (SysWord.toInt wp), image = toHGDIOBJ lp} | decompileMessage (0x0100, wp, lp) = WM_KEYDOWN { virtualKey = SysWord.toInt wp, data = Word32.fromLargeWord lp } | decompileMessage (0x0101, wp, lp) = WM_KEYUP { virtualKey = SysWord.toInt wp, data = Word32.fromLargeWord lp } | decompileMessage (0x0102, wp, lp) = WM_CHAR { charCode = chr (SysWord.toInt wp), data = Word32.fromLargeWord lp } | decompileMessage (0x0103, wp, lp) = WM_DEADCHAR { charCode = chr (SysWord.toInt wp), data = Word32.fromLargeWord lp } | decompileMessage (0x0104, wp, lp) = WM_SYSKEYDOWN { virtualKey = SysWord.toInt wp, data = Word32.fromLargeWord lp } | decompileMessage (0x0105, wp, lp) = WM_SYSKEYUP { virtualKey = SysWord.toInt wp, data = Word32.fromLargeWord lp } | decompileMessage (0x0106, wp, lp) = WM_SYSCHAR { charCode = chr (SysWord.toInt wp), data = Word32.fromLargeWord lp } | decompileMessage (0x0107, wp, lp) = WM_SYSDEADCHAR { charCode = chr (SysWord.toInt wp), data = Word32.fromLargeWord lp } (* WM_IME_STARTCOMPOSITION 0x010D WM_IME_ENDCOMPOSITION 0x010E WM_IME_COMPOSITION 0x010F WM_IME_KEYLAST 0x010F *) | decompileMessage (0x0110, wp, lp) = WM_INITDIALOG { dialog = toHWND wp, initdata = SysWord.toInt lp } (* "0x0110" *) | decompileMessage (0x0111, wp, lp) = let val wp32 = Word32.fromLargeWord wp in WM_COMMAND { notifyCode = Word.toInt(HIWORD wp32), wId = Word.toInt(LOWORD wp32), control = toHWND lp } end | decompileMessage (0x0112, wp, lp) = WM_SYSCOMMAND { commandvalue = toSysCommand(SysWord.toInt(SysWord.andb(wp, 0wxFFF0))), sysBits = SysWord.toInt(SysWord.andb(wp, 0wxF)), p = {x= getXLParam lp, y= getYLParam lp}} | decompileMessage (0x0113, wp, _) = WM_TIMER { timerid = SysWord.toInt wp } (* "0x0113" *) | decompileMessage (0x0114, wp, lp) = WM_HSCROLL { value = fromCsd(LOWORD(Word32.fromLargeWord wp)), position = hiWord wp, scrollbar = toHWND lp } (* "0x0114" *) | decompileMessage (0x0115, wp, lp) = WM_VSCROLL { value = fromCsd(LOWORD(Word32.fromLargeWord wp)), position = hiWord wp, scrollbar = toHWND lp } (* "0x0115" *) | decompileMessage (0x0116, wp, _) = WM_INITMENU { menu = toHMENU wp } (* "0x0116" *) | decompileMessage (0x0117, wp, lp) = WM_INITMENUPOPUP { menupopup = toHMENU wp, itemposition = loWord lp, isSystemMenu = hiWord lp <> 0 } (* "0x0117" *) | decompileMessage (0x011F, wp, lp) = let val wp32 = Word32.fromLargeWord wp in WM_MENUSELECT { menuitem = Word.toInt(LOWORD wp32), menuflags = MenuBase.toMenuFlagSet(Word32.fromLargeWord(Word.toLargeWord(Word.andb(HIWORD wp32, 0wxffff)))), menu = toHMENU lp } (* "0x011F" *) end | decompileMessage (0x0120, wp, lp) = let val wp32 = Word32.fromLargeWord wp in WM_MENUCHAR { ch = chr(Word.toInt(LOWORD wp32)), menuflag = (* Just a single flag *) MenuBase.toMenuFlag(Word32.fromLargeWord(Word.toLargeWord(Word.andb(HIWORD wp32, 0wxffff)))), menu= toHMENU lp } (* "0x0120" *) end | decompileMessage (0x0121, wp, lp) = WM_ENTERIDLE { flag = SysWord.toInt wp, window = toHWND lp } (* "0x0121" *) | decompileMessage (0x0132, wp, lp) = WM_CTLCOLORMSGBOX { displaycontext = toHDC wp, messagebox = toHWND lp } (* "0x0132" *) | decompileMessage (0x0133, wp, lp) = WM_CTLCOLOREDIT { displaycontext = toHDC wp, editcontrol = toHWND lp } (* "0x0133" *) | decompileMessage (0x0134, wp, lp) = WM_CTLCOLORLISTBOX { displaycontext = toHDC wp, listbox = toHWND lp } (* "0x0134" *) | decompileMessage (0x0135, wp, lp) = WM_CTLCOLORBTN { displaycontext = toHDC wp, button = toHWND lp }(* "0x0135" *) | decompileMessage (0x0136, wp, lp) = WM_CTLCOLORDLG { displaycontext = toHDC wp, dialogbox = toHWND lp } (* "0x0136" *) | decompileMessage (0x0137, wp, lp) = WM_CTLCOLORSCROLLBAR { displaycontext = toHDC wp, scrollbar = toHWND lp } (* "0x0137" *) | decompileMessage (0x0138, wp, lp) = WM_CTLCOLORSTATIC { displaycontext = toHDC wp, staticcontrol = toHWND lp } (* "0x0138" *) (* Combobox messages. *) | decompileMessage (0x0140, wp, lp) = CB_GETEDITSEL (decompileGetSel{wp=wp, lp=lp}) | decompileMessage (0x0141, wp, _) = CB_LIMITTEXT {limit = SysWord.toInt wp} | decompileMessage (0x0142, _, lp) = CB_SETEDITSEL { startPos = loWord lp, endPos = hiWord lp } | decompileMessage (0x0143, _, lp) = CB_ADDSTRING {text = fromCstring(toAddr lp) } | decompileMessage (0x0144, wp, _) = CB_DELETESTRING {index = SysWord.toInt wp} | decompileMessage (0x0145, wp, lp) = CB_DIR {attrs = fromCcbal(Word32.fromLargeWord wp), fileSpec = fromCstring(toAddr lp) } | decompileMessage (0x0146, _, _) = CB_GETCOUNT | decompileMessage (0x0147, _, _) = CB_GETCURSEL | decompileMessage (0x0148, wp, _) = CB_GETLBTEXT { index = SysWord.toInt wp, length = 0, text = ref "" } | decompileMessage (0x0149, wp, _) = CB_GETLBTEXTLEN {index = SysWord.toInt wp} | decompileMessage (0x014A, wp, lp) = CB_INSERTSTRING {text = fromCstring(toAddr lp), index = SysWord.toInt wp } | decompileMessage (0x014B, _, _) = CB_RESETCONTENT | decompileMessage (0x014C, wp, lp) = CB_FINDSTRING {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x014D, wp, lp) = CB_SELECTSTRING {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x014E, wp, _) = CB_SETCURSEL {index = SysWord.toInt wp} | decompileMessage (0x014F, wp, _) = CB_SHOWDROPDOWN {show = wp <> 0w0} | decompileMessage (0x0150, wp, _) = CB_GETITEMDATA {index = SysWord.toInt wp} | decompileMessage (0x0151, wp, lp) = CB_SETITEMDATA {index = SysWord.toInt wp, data = SysWord.toInt lp} | decompileMessage (0x0152, _, lp) = CB_GETDROPPEDCONTROLRECT {rect = ref(fromCrect(toAddr lp))} | decompileMessage (0x0153, wp, lp) = CB_SETITEMHEIGHT {index = SysWord.toInt wp, height = SysWord.toInt lp} | decompileMessage (0x0154, wp, _) = CB_GETITEMHEIGHT {index = SysWord.toInt wp} | decompileMessage (0x0155, wp, _) = CB_SETEXTENDEDUI {extended = wp <> 0w0} | decompileMessage (0x0156, _, _) = CB_GETEXTENDEDUI | decompileMessage (0x0157, _, _) = CB_GETDROPPEDSTATE | decompileMessage (0x0158, wp, lp) = CB_FINDSTRINGEXACT {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x0159, wp, _) = CB_SETLOCALE {locale = SysWord.toInt wp} | decompileMessage (0x015A, _, _) = CB_GETLOCALE | decompileMessage (0x015b, _, _) = CB_GETTOPINDEX | decompileMessage (0x015c, wp, _) = CB_SETTOPINDEX {index = SysWord.toInt wp} | decompileMessage (0x015d, _, _) = CB_GETHORIZONTALEXTENT | decompileMessage (0x015e, wp, _) = CB_SETHORIZONTALEXTENT {extent = SysWord.toInt wp} | decompileMessage (0x015f, _, _) = CB_GETDROPPEDWIDTH | decompileMessage (0x0160, wp, _) = CB_SETDROPPEDWIDTH {width = SysWord.toInt wp} | decompileMessage (0x0161, wp, lp) = CB_INITSTORAGE {items = SysWord.toInt wp, bytes = SysWord.toInt lp} (* Static control messages. *) | decompileMessage (0x0170, wp, _) = STM_SETICON{icon = toHICON wp} | decompileMessage (0x0171, _, _) = STM_GETICON | decompileMessage (0x0172, wp, lp) = STM_SETIMAGE{imageType = fromCit(SysWord.toInt wp), image = toHGDIOBJ lp} | decompileMessage (0x0173, wp, _) = STM_GETIMAGE{imageType = fromCit(SysWord.toInt wp)} (* Listbox messages *) | decompileMessage (0x0180, _, lp) = LB_ADDSTRING {text = fromCstring(toAddr lp) } | decompileMessage (0x0181, wp, lp) = LB_INSERTSTRING {text = fromCstring(toAddr lp), index = SysWord.toInt wp } | decompileMessage (0x0182, wp, _) = LB_DELETESTRING {index = SysWord.toInt wp} | decompileMessage (0x0183, wp, lp) = LB_SELITEMRANGEEX {first = SysWord.toInt wp, last = SysWord.toInt lp} | decompileMessage (0x0184, _, _) = LB_RESETCONTENT | decompileMessage (0x0185, wp, lp) = LB_SETSEL {select = wp <> 0w0, index = SysWord.toInt lp} | decompileMessage (0x0186, wp, _) = LB_SETCURSEL {index = SysWord.toInt wp} | decompileMessage (0x0187, wp, _) = LB_GETSEL {index = SysWord.toInt wp} | decompileMessage (0x0188, _, _) = LB_GETCURSEL | decompileMessage (0x0189, wp, _) = LB_GETTEXT { index = SysWord.toInt wp, length = 0, text = ref "" } | decompileMessage (0x018A, wp, _) = LB_GETTEXTLEN {index = SysWord.toInt wp} | decompileMessage (0x018B, _, _) = LB_GETCOUNT | decompileMessage (0x018C, wp, lp) = LB_SELECTSTRING {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x018D, wp, lp) = LB_DIR {attrs = fromCcbal(Word32.fromLargeWord wp), fileSpec = fromCstring(toAddr lp) } | decompileMessage (0x018E, _, _) = LB_GETTOPINDEX | decompileMessage (0x018F, wp, lp) = LB_FINDSTRING {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x0190, _, _) = LB_GETSELCOUNT | decompileMessage (0x0191, wp, _) = LB_GETSELITEMS { items = IntArray.array(SysWord.toInt wp, ~1) } | decompileMessage (0x0192, wp, lp) = LB_SETTABSTOPS{tabs=decompileTabStops{wp=wp, lp=lp}} | decompileMessage (0x0193, _, _) = LB_GETHORIZONTALEXTENT | decompileMessage (0x0194, wp, _) = LB_SETHORIZONTALEXTENT {extent = SysWord.toInt wp} | decompileMessage (0x0195, wp, _) = LB_SETCOLUMNWIDTH {column = SysWord.toInt wp} | decompileMessage (0x0196, _, lp) = LB_ADDFILE {fileName = fromCstring(toAddr lp) } | decompileMessage (0x0197, wp, _) = LB_SETTOPINDEX {index = SysWord.toInt wp} | decompileMessage (0x0198, wp, lp) = LB_GETITEMRECT {index = SysWord.toInt wp, rect = ref(fromCrect(toAddr lp))} | decompileMessage (0x0199, wp, _) = LB_GETITEMDATA {index = SysWord.toInt wp} | decompileMessage (0x019A, wp, lp) = LB_SETITEMDATA {index = SysWord.toInt wp, data = SysWord.toInt lp} | decompileMessage (0x019B, wp, lp) = LB_SELITEMRANGE {select = wp <> 0w0, first = loWord lp, last = hiWord lp} | decompileMessage (0x019C, wp, _) = LB_SETANCHORINDEX {index = SysWord.toInt wp} | decompileMessage (0x019D, _, _) = LB_GETANCHORINDEX | decompileMessage (0x019E, wp, lp) = LB_SETCARETINDEX {index = SysWord.toInt wp, scroll = lp <> 0w0} | decompileMessage (0x019F, _, _) = LB_GETCARETINDEX | decompileMessage (0x01A0, wp, lp) = LB_SETITEMHEIGHT {index = SysWord.toInt wp, height = loWord lp} | decompileMessage (0x01A1, wp, _) = LB_GETITEMHEIGHT {index = SysWord.toInt wp} | decompileMessage (0x01A2, wp, lp) = LB_FINDSTRINGEXACT {text = fromCstring(toAddr lp), indexStart = SysWord.toInt wp } | decompileMessage (0x01A5, wp, _) = LB_SETLOCALE {locale = SysWord.toInt wp} | decompileMessage (0x01A6, _, _) = LB_GETLOCALE | decompileMessage (0x01A7, wp, _) = LB_SETCOUNT {items = SysWord.toInt wp} | decompileMessage (0x01A8, wp, lp) = LB_INITSTORAGE {items = SysWord.toInt wp, bytes = SysWord.toInt lp} | decompileMessage (0x01A9, _, lp) = LB_ITEMFROMPOINT {point = {x = loWord lp, y = hiWord lp }} | decompileMessage (0x0200, wp, lp) = decompileMouseMove(WM_MOUSEMOVE, wp, lp) | decompileMessage (0x0201, wp, lp) = decompileMouseMove(WM_LBUTTONDOWN, wp, lp) | decompileMessage (0x0202, wp, lp) = decompileMouseMove(WM_LBUTTONUP, wp, lp) | decompileMessage (0x0203, wp, lp) = decompileMouseMove(WM_LBUTTONDBLCLK, wp, lp) | decompileMessage (0x0204, wp, lp) = decompileMouseMove(WM_RBUTTONDOWN, wp, lp) | decompileMessage (0x0205, wp, lp) = decompileMouseMove(WM_RBUTTONUP, wp, lp) | decompileMessage (0x0206, wp, lp) = decompileMouseMove(WM_RBUTTONDBLCLK, wp, lp) | decompileMessage (0x0207, wp, lp) = decompileMouseMove(WM_MBUTTONDOWN, wp, lp) | decompileMessage (0x0208, wp, lp) = decompileMouseMove(WM_MBUTTONUP, wp, lp) | decompileMessage (0x0209, wp, lp) = decompileMouseMove(WM_MBUTTONDBLCLK, wp, lp) (* WM_MOUSEWHEEL 0x020A *) | decompileMessage (0x0210, wp, lp) = WM_PARENTNOTIFY { eventflag = loWord wp, idchild = hiWord wp, value = SysWord.toInt lp } | decompileMessage (0x0211, wp, _) = WM_ENTERMENULOOP { istrack= wp <> 0w0 } (* "0x0211" *) | decompileMessage (0x0212, wp, _) = WM_EXITMENULOOP { istrack= wp <> 0w0 } (* "0x0212" *) (* WM_NEXTMENU 0x0213 WM_SIZING 0x0214 *) | decompileMessage (0x0215, _, lp) = WM_CAPTURECHANGED { newCapture = toHWND lp } (* WM_MOVING 0x0216 WM_POWERBROADCAST 0x0218 WM_DEVICECHANGE 0x0219 *) | decompileMessage (0x0220, _, lp) = let val (class, title, hinst, x,y,cx,cy, style, lParam) = toMdiCreate lp in WM_MDICREATE { class = class, title = title, instance = hinst, x = x, y = y, cx = cx, cy = cy, style = style, cdata = lParam } end | decompileMessage (0x0221, wp, _) = WM_MDIDESTROY { child = toHWND wp } (* "0x0221" *) | decompileMessage (0x0223, wp, _) = WM_MDIRESTORE { child = toHWND wp } (* "0x0223" *) | decompileMessage (0x0224, wp, lp) = WM_MDINEXT { child = toHWND wp, flagnext = lp <> 0w0 } (* "0x0224" *) | decompileMessage (0x0225, wp, _) = WM_MDIMAXIMIZE { child = toHWND wp } (* "0x0225" *) | decompileMessage (0x0226, wp, _) = WM_MDITILE { tilingflag = fromCmdif(Word32.fromLargeWord wp) } (* "0x0226" *) | decompileMessage (0x0227, wp, _) = WM_MDICASCADE { skipDisabled = IntInf.andb((SysWord.toInt wp), 2) <> 0 } | decompileMessage (0x0228, _, _) = WM_MDIICONARRANGE | decompileMessage (0x0229, _, _) = WM_MDIGETACTIVE | decompileMessage (0x0230, wp, lp) = WM_MDISETMENU { frameMenu = toHMENU wp, windowMenu = toHMENU lp } (* "0x0230" *) | decompileMessage (0x0231, _, _) = WM_ENTERSIZEMOVE | decompileMessage (0x0232, _, _) = WM_EXITSIZEMOVE | decompileMessage (0x0233, wp, _) = WM_DROPFILES { hDrop = toHDROP wp } | decompileMessage (0x0234, _, _) = WM_MDIREFRESHMENU (* "0x0234" *) (* WM_IME_SETCONTEXT 0x0281 WM_IME_NOTIFY 0x0282 WM_IME_CONTROL 0x0283 WM_IME_COMPOSITIONFULL 0x0284 WM_IME_SELECT 0x0285 WM_IME_CHAR 0x0286 WM_IME_KEYDOWN 0x0290 WM_IME_KEYUP 0x0291 *) | decompileMessage (0x02A0, wp, lp) = WM_NCMOUSEHOVER { hitTest = toHitTest(SysWord.toInt wp), x = getXLParam lp, y = getYLParam lp } | decompileMessage (0x02A1, wp, lp) = decompileMouseMove(WM_MOUSEHOVER, wp, lp)(* "0x02A1" *) | decompileMessage (0x02A2, _, _) = WM_NCMOUSELEAVE (* "0x02A2" *) | decompileMessage (0x02A3, _, _) = WM_MOUSELEAVE (* "0x02A3" *) | decompileMessage (0x0300, _, _) = WM_CUT (* "0x0300" *) | decompileMessage (0x0301, _, _) = WM_COPY (* "0x0301" *) | decompileMessage (0x0302, _, _) = WM_PASTE (* "0x0302" *) | decompileMessage (0x0303, _, _) = WM_CLEAR (* "0x0303" *) | decompileMessage (0x0304, _, _) = WM_UNDO (* "0x0304" *) | decompileMessage (0x0305, wp, _) = WM_RENDERFORMAT { format = fromCcbf(SysWord.toInt wp) } (* "0x0305" *) | decompileMessage (0x0306, _, _) = WM_RENDERALLFORMATS (* "0x0306" *) | decompileMessage (0x0307, _, _) = WM_DESTROYCLIPBOARD (* "0x0307" *) | decompileMessage (0x0308, _, _) = WM_DRAWCLIPBOARD (* "0x0308" *) | decompileMessage (0x0309, wp, _) = WM_PAINTCLIPBOARD { clipboard = toHWND wp } (* "0x0309" *) | decompileMessage (0x030A, wp, lp) = WM_VSCROLLCLIPBOARD { viewer = toHWND wp, code = loWord lp, position = hiWord lp } (* "0x030A" *) | decompileMessage (0x030B, _, lp) = WM_SIZECLIPBOARD { viewer = toHWND lp } (* "0x030B" *) (* The format name is inserted by the window procedure so any incoming message won't have the information. Indeed the buffer may not have been initialised. *) | decompileMessage (0x030C, wp, _) = WM_ASKCBFORMATNAME { length = SysWord.toInt wp, formatName = ref "" } | decompileMessage (0x030D, wp, lp) = WM_CHANGECBCHAIN { removed = toHWND wp, next = toHWND lp } | decompileMessage (0x030E, wp, lp) = WM_HSCROLLCLIPBOARD { viewer = toHWND wp, code = loWord lp, position = hiWord lp } (* "0x030E" *) | decompileMessage (0x030F, _, _) = WM_QUERYNEWPALETTE (* "0x030F" *) | decompileMessage (0x0310, wp, _) = WM_PALETTEISCHANGING { realize = toHWND wp } (* "0x0310" *) | decompileMessage (0x0311, wp, _) = WM_PALETTECHANGED { palChg = toHWND wp } (* "0x0311" *) | decompileMessage (0x0312, wp, _) = WM_HOTKEY { id = SysWord.toInt wp } (* "0x0312" *) | decompileMessage (0x0317, wp, lp) = WM_PRINT { hdc = toHDC wp, flags = fromCwmpl(Word32.fromLargeWord lp) } | decompileMessage (0x0318, wp, lp) = WM_PRINTCLIENT { hdc = toHDC wp, flags = fromCwmpl(Word32.fromLargeWord lp) } | decompileMessage (m, wp, lp) = (* User, application and registered messages. *) (* Rich edit controls use WM_USER+37 to WM_USER+122. As and when we implement rich edit controls we may want to treat those messages specially. *) if m >= 0x0400 andalso m <= 0x7FFF then WM_USER { uMsg = m, wParam = wp, lParam = lp } else if m >= 0x8000 andalso m <= 0xBFFF then WM_APP { uMsg = m, wParam = wp, lParam = lp } else if m >= 0x8000 andalso m <= 0xFFFF then ( (* We could use PolyML.OnEntry or use a weak byte ref to initialise the registered messages. *) if m = RegisterMessage "commdlg_FindReplace" then FINDMSGSTRING(decompileFindMsg{wp=wp, lp=lp}) else WM_REGISTERED { uMsg = m, wParam = wp, lParam = lp } ) else (* Other system messages. *) WM_SYSTEM_OTHER { uMsg = m, wParam = wp, lParam = lp } fun btoi false = 0 | btoi true = 1 fun makeLong(x, y) = Word32.toLargeWord(MAKELONG(Word.fromInt x, Word.fromInt y)) (* If we return a string we need to ensure it's freed *) fun compileStringAsLp(code, wp, string) = let val s = toCstring string in (code, wp, fromAddr s, fn () => Memory.free s) end (* Requests for strings. Many of these don't pass the length as an argument. *) fun compileStringRequest(code, wparam, length) = let open Memory val mem = malloc(Word.fromInt length) in (code, wparam, fromAddr mem, fn () => free mem) end fun strAddrAsLp(code, wp, (addr, free)) = (code, wp, addr, free) fun noFree () = () fun compileMessage WM_NULL = (0x0000, 0w0: SysWord.word, 0w0: SysWord.word, noFree) | compileMessage (WM_CREATE args) = compileCreate(0x0001, args) | compileMessage WM_DESTROY = (0x0002, 0w0, 0w0, noFree) | compileMessage (WM_MOVE {x, y}) = (0x0003, 0w0, makeLong(x, y), noFree) | compileMessage (WM_SIZE {flag, width, height}) = (0x0005, fromWMSizeOpt flag, makeLong(width, height), noFree) | compileMessage (WM_ACTIVATE {active, minimize}) = (0x0006, Word32.toLargeWord(MAKELONG(fromWMactive active, if minimize then 0w1 else 0w1)), 0w0, noFree) | compileMessage (WM_SETFOCUS {losing}) = (0x0007, 0w0, fromHWND losing, noFree) | compileMessage (WM_KILLFOCUS {receivefocus}) = (0x0008, 0w0, fromHWND receivefocus, noFree) | compileMessage (WM_ENABLE {enabled}) = (0x000A, if enabled then 0w1 else 0w0, 0w0, noFree) | compileMessage (WM_SETREDRAW {redrawflag}) = (0x000B, if redrawflag then 0w1 else 0w0, 0w0, noFree) | compileMessage (WM_SETTEXT {text}) = compileStringAsLp(0x000C, 0w0, text) | compileMessage (WM_GETTEXT {length, ...}) = compileStringRequest(0x000D, SysWord.fromInt length, length) | compileMessage WM_GETTEXTLENGTH = (0x000E, 0w0, 0w0, noFree) | compileMessage WM_PAINT = (0x000F, 0w0, 0w0, noFree) | compileMessage WM_CLOSE = (0x0010, 0w0, 0w0, noFree) | compileMessage (WM_QUERYENDSESSION { source}) = (0x0011, SysWord.fromInt source, 0w0, noFree) | compileMessage (WM_QUIT {exitcode}) = (0x0012, SysWord.fromInt exitcode, 0w0, noFree) | compileMessage WM_QUERYOPEN = (0x0013, 0w0, 0w0, noFree) | compileMessage (WM_ERASEBKGND {devicecontext}) = (0x0014, 0w0, fromHDC devicecontext, noFree) | compileMessage WM_SYSCOLORCHANGE = (0x0015, 0w0, 0w0, noFree) | compileMessage (WM_ENDSESSION {endsession}) = (0x0016, SysWord.fromInt(btoi endsession), 0w0, noFree) | compileMessage (WM_SHOWWINDOW {showflag, statusflag}) = (0x0018, SysWord.fromInt(btoi showflag), SysWord.fromInt statusflag, noFree) | compileMessage (WM_DEVMODECHANGE {devicename}) = compileStringAsLp(0x001B, 0w0, devicename) | compileMessage (WM_ACTIVATEAPP {active, threadid}) = (0x001B, SysWord.fromInt(btoi active), SysWord.fromInt threadid, noFree) | compileMessage WM_FONTCHANGE = (0x001D, 0w0, 0w0, noFree) | compileMessage WM_TIMECHANGE = (0x001E, 0w0, 0w0, noFree) | compileMessage WM_CANCELMODE = (0x001F, 0w0, 0w0, noFree) | compileMessage (WM_SETCURSOR {cursorwindow, hitTest, mousemessage}) = (0x0020, fromHWND cursorwindow, makeLong(fromHitTest hitTest, mousemessage), noFree) | compileMessage (WM_MOUSEACTIVATE {parent, hitTest, message}) = (0x0021, fromHWND parent, makeLong(fromHitTest hitTest, message), noFree) | compileMessage WM_CHILDACTIVATE = (0x0022, 0w0, 0w0, noFree) | compileMessage WM_QUEUESYNC = (0x0023, 0w0, 0w0, noFree) | compileMessage(WM_GETMINMAXINFO args) = compileMinMax(0x0024, args) | compileMessage WM_PAINTICON = (0x0026, 0w0, 0w0, noFree) | compileMessage (WM_ICONERASEBKGND {devicecontext}) = (0x0027, fromHDC devicecontext, 0w0, noFree) | compileMessage (WM_NEXTDLGCTL {control, handleflag}) = (0x0028, SysWord.fromInt control, SysWord.fromInt(btoi handleflag), noFree) | compileMessage (WM_DRAWITEM { senderId, ctlType, ctlID, itemID, itemAction,itemState, hItem, hDC, rcItem, itemData}) = strAddrAsLp(0x002B, SysWord.fromInt senderId, fromMLDrawItem(ctlType, ctlID, itemID, itemAction,itemState, hItem, hDC,rcItem,itemData)) | compileMessage (WM_MEASUREITEM{ senderId, ctlType, ctlID, itemID, itemWidth=ref itemWidth, itemHeight=ref itemHeight, itemData}) = strAddrAsLp(0x002C, SysWord.fromInt senderId, fromMLMeasureItem(ctlType, ctlID, itemID, itemWidth, itemHeight, itemData)) | compileMessage (WM_DELETEITEM{ senderId, ctlType, ctlID, itemID, item, itemData}) = strAddrAsLp(0x002D, SysWord.fromInt senderId, fromMLDeleteItem(ctlType, ctlID, itemID, item, itemData)) | compileMessage (WM_VKEYTOITEM {virtualKey, caretpos, listbox}) = (0x002E, makeLong(virtualKey, caretpos), fromHWND listbox, noFree) | compileMessage (WM_CHARTOITEM {key, caretpos, listbox}) = (0x002F, makeLong(key, caretpos), fromHWND listbox, noFree) | compileMessage (WM_SETFONT {font, redrawflag}) = (0x0030, fromHFONT font, if redrawflag then 0w1 else 0w0, noFree) | compileMessage WM_GETFONT = (0x0031, 0w0, 0w0, noFree) | compileMessage (WM_SETHOTKEY {virtualKey}) = (0x0032, SysWord.fromInt virtualKey, 0w0, noFree) | compileMessage WM_GETHOTKEY = (0x0033, 0w0, 0w0, noFree) | compileMessage WM_QUERYDRAGICON = (0x0037, 0w0, 0w0, noFree) | compileMessage (WM_COMPAREITEM { controlid, ctlType, ctlID, hItem, itemID1,itemData1, itemID2,itemData2}) = let (* TODO: Perhaps we should have locale Id in the argument record. *) val LOCALE_USER_DEFAULT = 0x0400 in strAddrAsLp(0x0039, SysWord.fromInt controlid, fromMLCompareItem (ctlType, ctlID, hItem, itemID1, itemData1, itemID2, itemData2, LOCALE_USER_DEFAULT)) end | compileMessage (WM_WINDOWPOSCHANGING wpc) = mlToCWindowPosChanging(0x0046, wpc) | compileMessage (WM_WINDOWPOSCHANGED wpc) = mlToCWindowPosChanged(0x0047, wpc) | compileMessage (WM_POWER {powerevent}) = (0x0048, SysWord.fromInt powerevent, 0w0, noFree) | compileMessage WM_CANCELJOURNAL = (0x004B, 0w0, 0w0, noFree) | compileMessage (WM_NOTIFY {idCtrl, from, idFrom, notification}) = strAddrAsLp (0x004E, SysWord.fromInt idCtrl, compileNotification(from, idFrom, notification)) (* WM_INPUTLANGCHANGEREQUEST 0x0050 WM_INPUTLANGCHANGE 0x0051 WM_TCARD 0x0052 WM_USERCHANGED 0x0054 WM_NOTIFYFORMAT 0x0055 WM_STYLECHANGING 0x007C WM_STYLECHANGED 0x007D *) | compileMessage (WM_HELP args) = compileHelpInfo(0x0053, args) | compileMessage (WM_CONTEXTMENU { hwnd, xPos, yPos }) = (0x007B, fromHWND hwnd, makeLong(xPos, yPos), noFree) | compileMessage (WM_DISPLAYCHANGE { bitsPerPixel, xScreen, yScreen}) = (0x007E, SysWord.fromInt bitsPerPixel, makeLong(xScreen, yScreen), noFree) | compileMessage (WM_GETICON {big}) = (0x007F, SysWord.fromInt(btoi big), 0w0, noFree) | compileMessage (WM_SETICON { big, icon }) = (0x0080, SysWord.fromInt(btoi big), fromAddr(voidStarOfHandle icon), noFree) | compileMessage (WM_NCCREATE args) = compileCreate(0x0081, args) | compileMessage WM_NCDESTROY = (0x0082, 0w0, 0w0, noFree) | compileMessage (WM_NCCALCSIZE args) = compileNCCalcSize args | compileMessage (WM_NCHITTEST {x, y}) = (0x0084, 0w0, makeLong(x, y), noFree) | compileMessage (WM_NCPAINT {region}) = (0x0085, fromHRGN region, 0w0, noFree) | compileMessage (WM_NCACTIVATE {active}) = (0x0086, SysWord.fromInt(btoi active), 0w0, noFree) | compileMessage WM_GETDLGCODE = (0x0087, 0w0, 0w0, noFree) | compileMessage (WM_NCMOUSEMOVE {hitTest, x, y}) = (0x00A0, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCLBUTTONDOWN {hitTest, x, y}) = (0x00A1, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCLBUTTONUP {hitTest, x, y}) = (0x00A2, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCLBUTTONDBLCLK {hitTest, x, y}) = (0x00A3, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCRBUTTONDOWN {hitTest, x, y}) = (0x00A4, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCRBUTTONUP {hitTest, x, y}) = (0x00A5, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCRBUTTONDBLCLK {hitTest, x, y}) = (0x00A6, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCMBUTTONDOWN {hitTest, x, y}) = (0x00A7, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCMBUTTONUP {hitTest, x, y}) = (0x00A8, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_NCMBUTTONDBLCLK {hitTest, x, y}) = (0x00A9, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) (* Edit control messages *) | compileMessage (EM_GETSEL args) = compileGetSel(0x00B0, args) | compileMessage (EM_SETSEL{startPos, endPos}) = (0x00B1, SysWord.fromInt startPos, SysWord.fromInt endPos, noFree) | compileMessage (EM_GETRECT {rect=ref r}) = compileGetRect(0x00B2, 0w0, r) | compileMessage (EM_SETRECT {rect}) = compileSetRect(0x00B3, rect) | compileMessage (EM_SETRECTNP {rect}) = compileSetRect(0x00B4, rect) | compileMessage (EM_SCROLL{action}) = (0x00B5, Word.toLargeWord(toCsd action), 0w0, noFree) | compileMessage (EM_LINESCROLL{xScroll, yScroll}) = (0x00B6, SysWord.fromInt xScroll, SysWord.fromInt yScroll, noFree) | compileMessage EM_SCROLLCARET = (0x00B7, 0w0, 0w0, noFree) | compileMessage EM_GETMODIFY = (0x00B8, 0w0, 0w0, noFree) | compileMessage (EM_SETMODIFY{modified}) = (0x00B9, if modified then 0w1 else 0w0, 0w0, noFree) | compileMessage EM_GETLINECOUNT = (0x00BA, 0w0, 0w0, noFree) | compileMessage (EM_LINEINDEX{line}) = (0x00BB, SysWord.fromInt line, 0w0, noFree) (* EM_SETHANDLE 0x00BC *) | compileMessage EM_GETTHUMB = (0x00BE, 0w0, 0w0, noFree) | compileMessage (EM_LINELENGTH{index}) = (0x00BB, SysWord.fromInt index, 0w0, noFree) | compileMessage (EM_REPLACESEL{canUndo, text}) = compileStringAsLp(0x00C2, SysWord.fromInt(btoi canUndo), text) | compileMessage (EM_GETLINE args) = compileGetLine args | compileMessage (EM_LIMITTEXT{limit}) = (0x00C5, SysWord.fromInt limit, 0w0, noFree) | compileMessage EM_CANUNDO = (0x00C6, 0w0, 0w0, noFree) | compileMessage EM_UNDO = (0x00C7, 0w0, 0w0, noFree) | compileMessage (EM_FMTLINES{addEOL}) = (0x00C8, SysWord.fromInt(btoi addEOL), 0w0, noFree) | compileMessage (EM_LINEFROMCHAR{index}) = (0x00C9, SysWord.fromInt index, 0w0, noFree) | compileMessage (EM_SETTABSTOPS{tabs}) = compileTabStops(0x00CB, tabs) | compileMessage (EM_SETPASSWORDCHAR{ch}) = (0x00CC, SysWord.fromInt(ord ch), 0w0, noFree) | compileMessage EM_EMPTYUNDOBUFFER = (0x00CD, 0w0, 0w0, noFree) | compileMessage EM_GETFIRSTVISIBLELINE = (0x00CE, 0w0, 0w0, noFree) | compileMessage (EM_SETREADONLY{readOnly}) = (0x00CF, SysWord.fromInt(btoi readOnly), 0w0, noFree) (* EM_SETWORDBREAKPROC 0x00D0 EM_GETWORDBREAKPROC 0x00D1 *) | compileMessage EM_GETPASSWORDCHAR = (0x00D2, 0w0, 0w0, noFree) | compileMessage (EM_SETMARGINS{margins}) = ( case margins of UseFontInfo => (0x00D3, SysWord.fromInt 0xffff, 0w0, noFree) | Margins{left, right} => let val (b0, lo) = case left of SOME l => (0w1, l) | NONE => (0w0, 0) val (b1, hi) = case right of SOME r => (0w2, r) | NONE => (0w0, 0) in (0x00D3, SysWord.orb(b0, b1), makeLong(hi,lo), noFree) end ) | compileMessage EM_GETMARGINS = (0x00D4, 0w0, 0w0, noFree) (* Returns margins in lResult *) | compileMessage EM_GETLIMITTEXT = (0x00D5, 0w0, 0w0, noFree) | compileMessage (EM_POSFROMCHAR {index}) = (0x00D6, SysWord.fromInt index, 0w0, noFree) | compileMessage (EM_CHARFROMPOS arg) = let val (lParam, toFree) = case arg of EMcfpEdit{x,y} => (makeLong(x, y), noFree) | EMcfpRichEdit pt => makePointStructAddr pt | EMcfpUnknown lp => (lp, noFree) in (0x00D7, 0w0, lParam, toFree) end (* Scroll bar messages *) | compileMessage (SBM_SETPOS {pos, redraw}) = (0x00E0, SysWord.fromInt pos, SysWord.fromInt(btoi redraw), noFree) | compileMessage SBM_GETPOS = (0x00E1, 0w0, 0w0, noFree) | compileMessage (SBM_SETRANGE {minPos, maxPos}) = (0x00E2, SysWord.fromInt minPos, SysWord.fromInt maxPos, noFree) | compileMessage (SBM_SETRANGEREDRAW {minPos, maxPos}) = (0x00E6, SysWord.fromInt minPos, SysWord.fromInt maxPos, noFree) | compileMessage (SBM_GETRANGE _) = let (* An application should use GetScrollRange rather than sending this.*) open Memory (* We need to allocate two ints and pass their addresses *) val mem = malloc(0w2 * sizeInt) infix 6 ++ in (0x00E3, fromAddr mem, fromAddr(mem ++ sizeInt), fn () => free mem) end | compileMessage (SBM_ENABLE_ARROWS flags) = (0x00E4, SysWord.fromInt(toCesbf flags), 0w0, noFree) | compileMessage (SBM_SETSCROLLINFO {info, options}) = strAddrAsLp(0x00E9, 0w0, fromScrollInfo(info, options)) | compileMessage (SBM_GETSCROLLINFO {info = ref info, options}) = strAddrAsLp(0x00EA, 0w0, fromScrollInfo(info, options)) (* Button control messages *) | compileMessage BM_GETCHECK = (0x00F0, 0w0, 0w0, noFree) | compileMessage (BM_SETCHECK{state}) = (0x00F1, SysWord.fromInt state, 0w0, noFree) | compileMessage BM_GETSTATE = (0x00F2, 0w0, 0w0, noFree) | compileMessage (BM_SETSTATE{highlight}) = (0x00F3, SysWord.fromInt(btoi highlight), 0w0, noFree) | compileMessage (BM_SETSTYLE{redraw, style}) = (0x00F3, SysWord.fromInt(LargeWord.toInt(Style.toWord style)), SysWord.fromInt(btoi redraw), noFree) | compileMessage BM_CLICK = (0x00F5, 0w0, 0w0, noFree) | compileMessage (BM_GETIMAGE{imageType}) = (0x00F6, SysWord.fromInt(toCit imageType), 0w0, noFree) | compileMessage (BM_SETIMAGE{imageType, image}) = (0x00F7, SysWord.fromInt(toCit imageType), fromHGDIOBJ image, noFree) | compileMessage (WM_KEYDOWN {virtualKey, data}) = (0x0100, SysWord.fromInt virtualKey, Word32.toLargeWord data, noFree) | compileMessage (WM_KEYUP {virtualKey, data}) = (0x0101, SysWord.fromInt virtualKey, Word32.toLargeWord data, noFree) | compileMessage (WM_CHAR {charCode, data}) = (0x0102, SysWord.fromInt(ord charCode), Word32.toLargeWord data, noFree) | compileMessage (WM_DEADCHAR {charCode, data}) = (0x0103, SysWord.fromInt(ord charCode), Word32.toLargeWord data, noFree) | compileMessage (WM_SYSKEYDOWN {virtualKey, data}) = (0x0104, SysWord.fromInt virtualKey, Word32.toLargeWord data, noFree) | compileMessage (WM_SYSKEYUP {virtualKey, data}) = (0x0105, SysWord.fromInt virtualKey, Word32.toLargeWord data, noFree) | compileMessage (WM_SYSCHAR {charCode, data}) = (0x0106, SysWord.fromInt(ord charCode), Word32.toLargeWord data, noFree) | compileMessage (WM_SYSDEADCHAR {charCode, data}) = (0x0107, SysWord.fromInt(ord charCode), Word32.toLargeWord data, noFree) (* WM_IME_STARTCOMPOSITION 0x010D WM_IME_ENDCOMPOSITION 0x010E WM_IME_COMPOSITION 0x010F WM_IME_KEYLAST 0x010F *) | compileMessage (WM_INITDIALOG { dialog, initdata}) = (0x0110, fromHWND dialog, SysWord.fromInt initdata, noFree) | compileMessage (WM_COMMAND {notifyCode, wId, control}) = (0x0111, makeLong(wId, notifyCode), fromHWND control, noFree) | compileMessage (WM_SYSCOMMAND {commandvalue, sysBits, p={x,y}}) = (0x0112, SysWord.fromInt(IntInf.orb(sysBits, fromSysCommand commandvalue)), makeLong(x,y), noFree) | compileMessage (WM_TIMER {timerid}) = (0x0113, SysWord.fromInt timerid, 0w0, noFree) | compileMessage (WM_HSCROLL {value, position, scrollbar}) = (0x0114, makeLong(Word.toInt(toCsd value), position), fromHWND scrollbar, noFree) | compileMessage (WM_VSCROLL {value, position, scrollbar}) = (0x0115, makeLong(Word.toInt(toCsd value), position), fromHWND scrollbar, noFree) | compileMessage (WM_INITMENU {menu}) = (0x0116, fromHMENU menu, 0w0, noFree) | compileMessage (WM_INITMENUPOPUP {menupopup, itemposition, isSystemMenu}) = (0x0117, fromHMENU menupopup, makeLong(itemposition, btoi isSystemMenu), noFree) | compileMessage (WM_MENUSELECT {menuitem, menuflags, menu}) = (0x011F, makeLong(menuitem, Word32.toInt(MenuBase.fromMenuFlagSet menuflags)), fromHMENU menu, noFree) | compileMessage (WM_MENUCHAR { ch, menuflag, menu}) = (0x0120, makeLong(ord ch, Word32.toInt(MenuBase.fromMenuFlag menuflag)), fromHMENU menu, noFree) | compileMessage (WM_ENTERIDLE { flag, window}) = (0x0121, SysWord.fromInt flag, fromHWND window, noFree) | compileMessage (WM_CTLCOLORMSGBOX { displaycontext, messagebox}) = (0x0132, fromHDC displaycontext, fromHWND messagebox, noFree) | compileMessage (WM_CTLCOLOREDIT { displaycontext, editcontrol}) = (0x0133, fromHDC displaycontext, fromHWND editcontrol, noFree) | compileMessage (WM_CTLCOLORLISTBOX { displaycontext, listbox}) = (0x0134, fromHDC displaycontext, fromHWND listbox, noFree) | compileMessage (WM_CTLCOLORBTN { displaycontext, button}) = (0x0135, fromHDC displaycontext, fromHWND button, noFree) | compileMessage (WM_CTLCOLORDLG { displaycontext, dialogbox}) = (0x0136, fromHDC displaycontext, fromHWND dialogbox, noFree) | compileMessage (WM_CTLCOLORSCROLLBAR { displaycontext, scrollbar}) = (0x0137, fromHDC displaycontext, fromHWND scrollbar, noFree) | compileMessage (WM_CTLCOLORSTATIC { displaycontext, staticcontrol}) = (0x0138, fromHDC displaycontext, fromHWND staticcontrol, noFree) (* Combobox messages. *) | compileMessage (CB_GETEDITSEL args) = compileGetSel(0x0140, args) | compileMessage (CB_LIMITTEXT{limit}) = (0x0141, SysWord.fromInt limit, 0w0, noFree) | compileMessage (CB_SETEDITSEL{startPos, endPos}) = (0x0142, 0w0, makeLong(startPos, endPos), noFree) | compileMessage (CB_ADDSTRING{text}) = compileStringAsLp(0x0143, 0w0, text) | compileMessage (CB_DELETESTRING{index}) = (0x0144, SysWord.fromInt index, 0w0, noFree) | compileMessage (CB_DIR{attrs, fileSpec}) = compileStringAsLp(0x0145, Word32.toLargeWord(toCcbal attrs), fileSpec) | compileMessage CB_GETCOUNT = (0x0146, 0w0, 0w0, noFree) | compileMessage CB_GETCURSEL = (0x0147, 0w0, 0w0, noFree) | compileMessage (CB_GETLBTEXT {length, index, ...}) = compileStringRequest(0x0148, SysWord.fromInt index, length) | compileMessage (CB_GETLBTEXTLEN{index}) = (0x0149, SysWord.fromInt index, 0w0, noFree) | compileMessage (CB_INSERTSTRING{text, index}) = compileStringAsLp(0x014A, SysWord.fromInt index, text) | compileMessage CB_RESETCONTENT = (0x014B, 0w0, 0w0, noFree) | compileMessage (CB_FINDSTRING{text, indexStart}) = compileStringAsLp(0x014C, SysWord.fromInt indexStart, text) | compileMessage (CB_SELECTSTRING{text, indexStart}) = compileStringAsLp(0x014D, SysWord.fromInt indexStart, text) | compileMessage (CB_SETCURSEL{index}) = (0x014E, SysWord.fromInt index, 0w0, noFree) | compileMessage (CB_SHOWDROPDOWN{show}) = (0x014F, SysWord.fromInt(btoi show), 0w0, noFree) | compileMessage (CB_GETITEMDATA{index}) = (0x0150, SysWord.fromInt index, 0w0, noFree) | compileMessage (CB_SETITEMDATA{index, data}) = (0x0151, SysWord.fromInt index, SysWord.fromInt data, noFree) | compileMessage (CB_GETDROPPEDCONTROLRECT {rect=ref rect}) = compileGetRect(0x0152, 0w0, rect) | compileMessage (CB_SETITEMHEIGHT{index, height}) = (0x0153, SysWord.fromInt index, SysWord.fromInt height, noFree) | compileMessage (CB_GETITEMHEIGHT{index}) = (0x0154, SysWord.fromInt index, 0w0, noFree) | compileMessage (CB_SETEXTENDEDUI{extended}) = (0x0155, SysWord.fromInt(btoi extended), 0w0, noFree) | compileMessage CB_GETEXTENDEDUI = (0x0156, 0w0, 0w0, noFree) | compileMessage CB_GETDROPPEDSTATE = (0x0157, 0w0, 0w0, noFree) | compileMessage (CB_FINDSTRINGEXACT{text, indexStart}) = compileStringAsLp(0x0158, SysWord.fromInt indexStart, text) | compileMessage (CB_SETLOCALE{locale}) = (0x0159, SysWord.fromInt locale, 0w0, noFree) | compileMessage CB_GETLOCALE = (0x015A, 0w0, 0w0, noFree) | compileMessage CB_GETTOPINDEX = (0x015b, 0w0, 0w0, noFree) | compileMessage (CB_SETTOPINDEX{index}) = (0x015c, SysWord.fromInt index, 0w0, noFree) | compileMessage CB_GETHORIZONTALEXTENT = (0x015d, 0w0, 0w0, noFree) | compileMessage (CB_SETHORIZONTALEXTENT{extent}) = (0x015e, SysWord.fromInt extent, 0w0, noFree) | compileMessage CB_GETDROPPEDWIDTH = (0x015f, 0w0, 0w0, noFree) | compileMessage (CB_SETDROPPEDWIDTH{width}) = (0x0160, SysWord.fromInt width, 0w0, noFree) | compileMessage (CB_INITSTORAGE{items, bytes}) = (0x0161, SysWord.fromInt items, SysWord.fromInt bytes, noFree) (* Static control messages. *) | compileMessage (STM_SETICON{icon}) = (0x0170, fromHICON icon, 0w0, noFree) | compileMessage STM_GETICON = (0x0171, 0w0, 0w0, noFree) | compileMessage (STM_SETIMAGE{imageType, image}) = (0x0172, SysWord.fromInt(toCit imageType), fromHGDIOBJ image, noFree) | compileMessage (STM_GETIMAGE{imageType}) = (0x0173, SysWord.fromInt(toCit imageType), 0w0, noFree) (* Listbox messages *) | compileMessage (LB_ADDSTRING{text}) = compileStringAsLp(0x0180, 0w0, text) | compileMessage (LB_INSERTSTRING{text, index}) = compileStringAsLp(0x0181, SysWord.fromInt index, text) | compileMessage (LB_DELETESTRING{index}) = (0x0182, SysWord.fromInt index, 0w0, noFree) | compileMessage (LB_SELITEMRANGEEX{first, last}) = (0x0183, SysWord.fromInt first, SysWord.fromInt last, noFree) | compileMessage LB_RESETCONTENT = (0x0184, 0w0, 0w0, noFree) | compileMessage (LB_SETSEL{select, index}) = (0x0185, SysWord.fromInt(btoi select), SysWord.fromInt index, noFree) | compileMessage (LB_SETCURSEL{index}) = (0x0186, SysWord.fromInt index, 0w0, noFree) | compileMessage (LB_GETSEL{index}) = (0x0187, SysWord.fromInt index, 0w0, noFree) | compileMessage LB_GETCURSEL = (0x0188, 0w0, 0w0, noFree) | compileMessage (LB_GETTEXT {length, index, ...}) = compileStringRequest(0x0189, SysWord.fromInt index, length) | compileMessage (LB_GETTEXTLEN{index}) = (0x018A, SysWord.fromInt index, 0w0, noFree) | compileMessage LB_GETCOUNT = (0x018B, 0w0, 0w0, noFree) | compileMessage (LB_SELECTSTRING{text, indexStart}) = compileStringAsLp(0x018C, SysWord.fromInt indexStart, text) | compileMessage (LB_DIR{attrs, fileSpec}) = compileStringAsLp(0x018D, Word32.toLargeWord(toCcbal attrs), fileSpec) | compileMessage LB_GETTOPINDEX = (0x018E, 0w0, 0w0, noFree) | compileMessage (LB_FINDSTRING{text, indexStart}) = compileStringAsLp (0x018F, SysWord.fromInt indexStart, text) | compileMessage LB_GETSELCOUNT = (0x0190, 0w0, 0w0, noFree) | compileMessage (LB_GETSELITEMS args) = compileGetSelItems(0x0191, args) | compileMessage (LB_SETTABSTOPS{tabs}) = compileTabStops(0x0192, tabs) | compileMessage LB_GETHORIZONTALEXTENT = (0x0193, 0w0, 0w0, noFree) | compileMessage (LB_SETHORIZONTALEXTENT{extent}) = (0x0194, SysWord.fromInt extent, 0w0, noFree) | compileMessage (LB_SETCOLUMNWIDTH{column}) = (0x0195, SysWord.fromInt column, 0w0, noFree) | compileMessage (LB_ADDFILE{fileName}) = compileStringAsLp(0x0196, 0w0, fileName) | compileMessage (LB_SETTOPINDEX{index}) = (0x0197, SysWord.fromInt index, 0w0, noFree) | compileMessage (LB_GETITEMRECT{rect=ref rect, index}) = compileGetRect(0x0198, SysWord.fromInt index, rect) | compileMessage (LB_GETITEMDATA{index}) = (0x0199, SysWord.fromInt index, 0w0, noFree) | compileMessage (LB_SETITEMDATA{index, data}) = (0x019A, SysWord.fromInt index, SysWord.fromInt data, noFree) | compileMessage (LB_SELITEMRANGE{select, first, last}) = (0x019B, SysWord.fromInt(btoi select), makeLong(first, last), noFree) | compileMessage (LB_SETANCHORINDEX{index}) = (0x019C, SysWord.fromInt index, 0w0, noFree) | compileMessage LB_GETANCHORINDEX = (0x019D, 0w0, 0w0, noFree) | compileMessage (LB_SETCARETINDEX{index, scroll}) = (0x019E, SysWord.fromInt index, SysWord.fromInt(btoi scroll), noFree) | compileMessage LB_GETCARETINDEX = (0x019F, 0w0, 0w0, noFree) | compileMessage (LB_SETITEMHEIGHT{index, height}) = (0x01A0, SysWord.fromInt index, makeLong(height, 0), noFree) | compileMessage (LB_GETITEMHEIGHT{index}) = (0x01A1, SysWord.fromInt index, 0w0, noFree) | compileMessage (LB_FINDSTRINGEXACT{text, indexStart}) = compileStringAsLp(0x01A2, SysWord.fromInt indexStart, text) | compileMessage (LB_SETLOCALE{locale}) = (0x01A5, SysWord.fromInt locale, 0w0, noFree) | compileMessage LB_GETLOCALE = (0x01A6, 0w0, 0w0, noFree) | compileMessage (LB_SETCOUNT{items}) = (0x01A7, SysWord.fromInt items, 0w0, noFree) | compileMessage (LB_INITSTORAGE{items, bytes}) = (0x01A8, SysWord.fromInt items, SysWord.fromInt bytes, noFree) | compileMessage (LB_ITEMFROMPOINT { point = {x, y}}) = (0x01A9, 0w0, makeLong(x,y), noFree) | compileMessage (WM_MOUSEMOVE margs) = compileMouseMove(0x0200, margs) | compileMessage (WM_LBUTTONDOWN margs) = compileMouseMove(0x0201, margs) | compileMessage (WM_LBUTTONUP margs) = compileMouseMove(0x0202, margs) | compileMessage (WM_LBUTTONDBLCLK margs) = compileMouseMove(0x0203, margs) | compileMessage (WM_RBUTTONDOWN margs) = compileMouseMove(0x0204, margs) | compileMessage (WM_RBUTTONUP margs) = compileMouseMove(0x0205, margs) | compileMessage (WM_RBUTTONDBLCLK margs) = compileMouseMove(0x0206, margs) | compileMessage (WM_MBUTTONDOWN margs) = compileMouseMove(0x0207, margs) | compileMessage (WM_MBUTTONUP margs) = compileMouseMove(0x0208, margs) | compileMessage (WM_MBUTTONDBLCLK margs) = compileMouseMove(0x0209, margs) (* WM_MOUSEWHEEL 0x020A *) | compileMessage (WM_PARENTNOTIFY { eventflag, idchild, value}) = (0x0210, makeLong(eventflag,idchild), SysWord.fromInt value, noFree) | compileMessage (WM_ENTERMENULOOP {istrack}) = (0x0211, SysWord.fromInt(btoi istrack), 0w0, noFree) | compileMessage (WM_EXITMENULOOP {istrack}) = (0x0212, SysWord.fromInt(btoi istrack), 0w0, noFree) (* WM_NEXTMENU 0x0213 WM_SIZING 0x0214 *) | compileMessage (WM_CAPTURECHANGED {newCapture}) = (0x0215, 0w0, fromHWND newCapture, noFree) (* WM_MOVING 0x0216 WM_POWERBROADCAST 0x0218 WM_DEVICECHANGE 0x0219 *) | compileMessage (WM_MDICREATE{class, title, instance, x, y, cx, cy, style, cdata}) = strAddrAsLp (0x0220, 0w0, fromMdiCreate(class,title,instance,x,y,cx,cy,style,cdata)) | compileMessage (WM_MDIDESTROY{child}) = (0x0221, fromHWND child, 0w0, noFree) | compileMessage (WM_MDIRESTORE{child}) = (0x0223, fromHWND child, 0w0, noFree) | compileMessage (WM_MDINEXT{child, flagnext}) = (0x0224, fromHWND child, SysWord.fromInt(btoi flagnext), noFree) | compileMessage (WM_MDIMAXIMIZE{child}) = (0x0225, fromHWND child, 0w0, noFree) | compileMessage (WM_MDITILE{tilingflag}) = (0x0226, Word32.toLargeWord(toCmdif tilingflag), 0w0, noFree) | compileMessage (WM_MDICASCADE{skipDisabled}) = (0x0227, SysWord.fromInt(if skipDisabled then 2 else 0), 0w0, noFree) | compileMessage WM_MDIICONARRANGE = (0x0228, 0w0, 0w0, noFree) | compileMessage WM_MDIGETACTIVE = (0x0229, 0w0, 0w0 (* MUST be null *), noFree) | compileMessage (WM_MDISETMENU{frameMenu, windowMenu}) = (0x0230, fromHMENU frameMenu, fromHMENU windowMenu, noFree) | compileMessage WM_ENTERSIZEMOVE = (0x0231, 0w0, 0w0, noFree) | compileMessage WM_EXITSIZEMOVE = (0x0232, 0w0, 0w0, noFree) | compileMessage (WM_DROPFILES{hDrop}) = (0x0233, fromHDROP hDrop, 0w0, noFree) | compileMessage WM_MDIREFRESHMENU = (0x0234, 0w0, 0w0, noFree) (* WM_IME_SETCONTEXT 0x0281 WM_IME_NOTIFY 0x0282 WM_IME_CONTROL 0x0283 WM_IME_COMPOSITIONFULL 0x0284 WM_IME_SELECT 0x0285 WM_IME_CHAR 0x0286 WM_IME_KEYDOWN 0x0290 WM_IME_KEYUP 0x0291 *) | compileMessage (WM_NCMOUSEHOVER {hitTest, x, y}) = (0x02A0, SysWord.fromInt(fromHitTest hitTest), makeXYParam(x, y), noFree) | compileMessage (WM_MOUSEHOVER margs) = compileMouseMove(0x02A1, margs) | compileMessage WM_NCMOUSELEAVE = (0x02A2, 0w0, 0w0, noFree) | compileMessage WM_MOUSELEAVE = (0x02A3, 0w0, 0w0, noFree) | compileMessage WM_CUT = (0x0300, 0w0, 0w0, noFree) | compileMessage WM_COPY = (0x0301, 0w0, 0w0, noFree) | compileMessage WM_PASTE = (0x0302, 0w0, 0w0, noFree) | compileMessage WM_CLEAR = (0x0303, 0w0, 0w0, noFree) | compileMessage WM_UNDO = (0x0304, 0w0, 0w0, noFree) | compileMessage (WM_RENDERFORMAT {format}) = (0x0305, SysWord.fromInt(toCcbf format), 0w0, noFree) | compileMessage WM_RENDERALLFORMATS = (0x0306, 0w0, 0w0, noFree) | compileMessage WM_DESTROYCLIPBOARD = (0x0307, 0w0, 0w0, noFree) | compileMessage WM_DRAWCLIPBOARD = (0x0308, 0w0, 0w0, noFree) | compileMessage (WM_PAINTCLIPBOARD{clipboard}) = (0x030A, fromHWND clipboard, 0w0, noFree) | compileMessage (WM_VSCROLLCLIPBOARD{viewer, code, position}) = (0x030A, fromHWND viewer, makeLong(code, position), noFree) | compileMessage (WM_SIZECLIPBOARD{viewer}) = (0x030B, 0w0, fromHWND viewer, noFree) | compileMessage (WM_ASKCBFORMATNAME {length, ...}) = compileStringRequest(0x030C, SysWord.fromInt length, length) | compileMessage (WM_CHANGECBCHAIN{removed, next}) = (0x030D, fromHWND removed, fromHWND next, noFree) | compileMessage (WM_HSCROLLCLIPBOARD{viewer, code, position}) = (0x030E, fromHWND viewer, makeLong(code, position), noFree) | compileMessage WM_QUERYNEWPALETTE = (0x030F, 0w0, 0w0, noFree) | compileMessage (WM_PALETTEISCHANGING{realize}) = (0x0310, fromHWND realize, 0w0, noFree) | compileMessage (WM_PALETTECHANGED{palChg}) = (0x0311, fromHWND palChg, 0w0, noFree) | compileMessage (WM_HOTKEY{id}) = (0x0312, SysWord.fromInt id, 0w0, noFree) | compileMessage (WM_PRINT{hdc, flags}) = (0x0317, fromHDC hdc, Word32.toLargeWord(toCwmpl flags), noFree) | compileMessage (WM_PRINTCLIENT{hdc, flags}) = (0x0318, fromHDC hdc, Word32.toLargeWord(toCwmpl flags), noFree) | compileMessage (FINDMSGSTRING args) = compileFindMsg args | compileMessage (WM_SYSTEM_OTHER{uMsg, wParam, lParam}) = (uMsg, wParam, lParam, noFree) | compileMessage (WM_USER{uMsg, wParam, lParam}) = (uMsg, wParam, lParam, noFree) | compileMessage (WM_APP{uMsg, wParam, lParam}) = (uMsg, wParam, lParam, noFree) | compileMessage (WM_REGISTERED{uMsg, wParam, lParam}) = (uMsg, wParam, lParam, noFree) local val msgStruct = cStruct6(cHWND, cUint, cUINT_PTRw, cUINT_PTRw, cDWORD, cPoint) val { load=loadMsg, store=storeMsg, ctype={size=msgSize, ... }, ... } = breakConversion msgStruct in (* Store the address of the message in the memory. *) fun storeMessage(v: voidStar, {msg, hwnd, time, pt}: MSG) = let val (msgId: int, wParam, lParam, freeMem) = compileMessage msg val mem = Memory.malloc msgSize val f = storeMsg(mem, (hwnd, msgId, wParam, lParam, Time.toMilliseconds time, pt)) in setAddress(v, 0w0, mem); fn () => (freeMem(); f(); Memory.free mem) end fun loadMessage(v: voidStar): MSG = let val (hWnd, msgId, wParam, lParam, t, pt) = loadMsg v val msg = decompileMessage(msgId, wParam, lParam) val () = case msg of WM_USER _ => TextIO.print(Int.toString msgId ^ "\n") | _ => () in { msg = msg, hwnd = hWnd, time = Time.fromMilliseconds t, pt = pt } end val LPMSG: MSG conversion = makeConversion { load = loadMessage, store = storeMessage, ctype=LowLevel.cTypePointer } val msgSize = msgSize end (* Update the lParam/wParam values from the values in a returned message. This is needed if an ML callback makes a modification that has to be passed back to C. *) (* TODO: The rest of these. *) local fun copyString(_, _, 0) = () (* If the length is zero do nothing *) | copyString(ptr: voidStar, s: string, length: int) = let open Memory fun copyChar(i, c) = if i < length then set8(ptr, Word.fromInt i, Byte.charToByte c) else () in CharVector.appi copyChar s; (* Null terminate either at the end of the string or the buffer *) set8(ptr, Word.fromInt(Int.min(size s + 1, length-1)), 0w0) end in fun updateParamsFromMessage(msg: Message, wp: SysWord.word, lp: SysWord.word): unit = case msg of WM_GETTEXT{text = ref t, ...} => copyString(toAddr lp, t, SysWord.toInt wp) | WM_ASKCBFORMATNAME{formatName = ref t, ...} => copyString(toAddr lp, t, SysWord.toInt wp) | EM_GETLINE{result = ref t, size, ...} => copyString(toAddr lp, t, size) | EM_GETRECT {rect = ref r} => toCrect(toAddr lp, r) | EM_GETSEL args => updateGetSelParms({wp=wp, lp=lp}, args) | CB_GETEDITSEL args => updateGetSelParms({wp=wp, lp=lp}, args) | CB_GETLBTEXT {text = ref t, length, ...} => copyString(toAddr lp, t, length) | CB_GETDROPPEDCONTROLRECT {rect = ref r} => toCrect(toAddr lp, r) | SBM_GETRANGE {minPos=ref minPos, maxPos=ref maxPos} => (ignore(storeInt(toAddr wp, minPos)); ignore(storeInt(toAddr lp, maxPos))) | SBM_GETSCROLLINFO args => updateScrollInfo({wp=wp, lp=lp}, args) | LB_GETTEXT {text = ref t, length, ...} => copyString(toAddr lp, t, length) | LB_GETSELITEMS args => updateGetSelItemsParms({wp=wp, lp=lp}, args) | LB_GETITEMRECT{rect = ref r, ...} => toCrect(toAddr lp, r) | WM_NCCALCSIZE { newrect = ref r, ...} => toCrect(toAddr lp, r) (* This sets the first rect *) | WM_MEASUREITEM args => updateMeasureItemParms({wp=wp, lp=lp}, args) | WM_GETMINMAXINFO args => updateMinMaxParms({wp=wp, lp=lp}, args) | WM_WINDOWPOSCHANGING args => updateWindowPosChangingParms({wp=wp, lp=lp}, args) (* | WM_NOTIFY{ notification=TTN_GETDISPINFO(ref s), ...} => (* This particular notification allows the result to be fed back in several ways. We copy into the char array. *) assign charArray80 (offset 1 (Cpointer Cvoid) (offset 1 nmhdr (deref lp))) (toCcharArray80 s) *) | _ => () end (* Update the message contents from the values of wParam/lParam. This is used when a message has been sent or passed into C code that may have updated the message contents. Casts certain message results to HGDIOBJ. *) fun messageReturnFromParams(msg: Message, wp: SysWord.word, lp: SysWord.word, reply: SysWord.word): LRESULT = let val () = (* For certain messages we need to extract the reply from the arguments. *) case msg of WM_GETTEXT{text, ...} => text := (if reply = 0w0 then "" else fromCstring(toAddr lp)) | WM_ASKCBFORMATNAME{formatName, ...} => formatName := (if reply = 0w0 then "" else fromCstring(toAddr lp)) | EM_GETLINE{result, ...} => result := (if reply = 0w0 then "" else fromCstring(toAddr lp)) | EM_GETRECT { rect } => rect := fromCrect(toAddr lp) | EM_GETSEL args => updateGetSelFromWpLp(args, {wp=wp, lp=lp}) | CB_GETEDITSEL args => updateGetSelFromWpLp(args, {wp=wp, lp=lp}) | CB_GETLBTEXT {text, ...} => text := (if reply = 0w0 then "" else fromCstring(toAddr lp)) | CB_GETDROPPEDCONTROLRECT { rect } => rect := fromCrect(toAddr lp) | SBM_GETRANGE {minPos, maxPos} => (minPos := loadInt(toAddr wp); maxPos := loadInt(toAddr lp)) | SBM_GETSCROLLINFO {info, ...} => let val ({minPos, maxPos, pageSize, pos, trackPos}, _) = toScrollInfo lp in info := {minPos = minPos, maxPos = maxPos, pageSize = pageSize, pos = pos, trackPos = trackPos} end | LB_GETTEXT {text, ...} => text := (if reply = 0w0 then "" else fromCstring(toAddr lp)) | LB_GETSELITEMS args => updateGetSelItemsFromWpLp(args, {wp=wp, lp=lp, reply=reply}) | LB_GETITEMRECT{rect, ...} => rect := fromCrect(toAddr lp) (* This also has an item index *) | WM_NCCALCSIZE { newrect, ...} => (* Whatever the value of "validarea" we just look at the first rectangle. *) newrect := fromCrect (toAddr lp) | WM_GETMINMAXINFO args => updateMinMaxFromWpLp(args, {wp=wp, lp=lp}) | WM_WINDOWPOSCHANGING wpCh => updateCfromMLwmWindowPosChanging({wp=wp, lp=lp}, wpCh) | WM_MEASUREITEM args => updateMeasureItemFromWpLp(args, {wp=wp, lp=lp}) | _ => () val fromHgdi = handleOfVoidStar o toAddr in (* We need to "cast" some of the results. *) case msg of WM_GETFONT => LRESHANDLE(fromHgdi reply) | WM_GETICON _ => LRESHANDLE(fromHgdi reply) | WM_SETICON _ => LRESHANDLE(fromHgdi reply) | BM_GETIMAGE _ => LRESHANDLE(fromHgdi reply) | BM_SETIMAGE _ => LRESHANDLE(fromHgdi reply) | STM_GETICON => LRESHANDLE(fromHgdi reply) | STM_GETIMAGE _ => LRESHANDLE(fromHgdi reply) | STM_SETICON _ => LRESHANDLE(fromHgdi reply) | STM_SETIMAGE _ => LRESHANDLE(fromHgdi reply) | _ => LRESINT (SysWord.toInt reply) end (* Window callback table. *) local type callback = HWND * int * SysWord.word * SysWord.word -> SysWord.word (* *) datatype tableEntry = TableEntry of {hWnd: HWND, callBack: callback} (* Windows belong to the thread that created them so each thread has its own list of windows. Any thread could have one outstanding callback waiting to be assigned to a window that is being created. *) val threadWindows = Universal.tag(): tableEntry list Universal.tag val threadOutstanding = Universal.tag(): callback option Universal.tag (* This message is used to test if we are using the Poly callback. We use the same number as MFC uses so it's unlikely that any Windows class will use this. *) val WMTESTPOLY = 0x0360 fun getWindowList (): tableEntry list = getOpt (Thread.Thread.getLocal threadWindows, []) and setWindowList(t: tableEntry list): unit = Thread.Thread.setLocal(threadWindows, t) fun getOutstanding(): callback option = Option.join(Thread.Thread.getLocal threadOutstanding) and setOutstanding(t: callback option): unit = Thread.Thread.setLocal(threadOutstanding, t) (* Get the callback for this window. If it's the first time we've had a message for this window we need to use the outstanding callback. *) fun getCallback(hw: HWND): callback = case List.find (fn (TableEntry{hWnd, ...}) => hw = hWnd) (getWindowList ()) of SOME(TableEntry{callBack, ...}) => callBack | NONE => (* See if this has just been set up. *) (case getOutstanding() of SOME cb => (* It has. We now know the window handle so link it up. *) ( setWindowList(TableEntry{hWnd=hw, callBack=cb} :: getWindowList ()); setOutstanding NONE; cb ) | NONE => raise Fail "No callback found" ) fun removeCallback(hw: HWND): unit = setWindowList(List.filter (fn(TableEntry{hWnd, ...}) => hw <> hWnd) (getWindowList ())) fun mainCallbackFunction(hw:HWND, msgId:int, wParam:SysWord.word, lParam:SysWord.word): SysWord.word = if msgId = WMTESTPOLY then SysWord.fromInt ~1 (* This tests whether we are already installed. *) else getCallback hw (hw, msgId, wParam, lParam) val mainWinProc = buildClosure4withAbi(mainCallbackFunction, winAbi, (cHWND, cUint, cUINT_PTRw, cUINT_PTRw), cUINT_PTRw) val WNDPROC: (HWND * int * SysWord.word * SysWord.word -> SysWord.word) closure conversion = cFunction (* This is used to set the window proc. The result is also a window proc. *) val SetWindowLong = winCall3 (user "SetWindowLongPtrA") (cHWND, cInt, WNDPROC) cPointer val CallWindowProc = winCall5 (user "CallWindowProcA") (cPointer, cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw in val mainWinProc = mainWinProc and removeCallback = removeCallback fun windowCallback (call: HWND * Message * 'a -> LRESULT * 'a, init: 'a): (HWND * int * SysWord.word * SysWord.word -> SysWord.word) = let val state = ref init fun callBack(h: HWND, uMsg:int, wParam: SysWord.word, lParam: SysWord.word): SysWord.word = let val msg = decompileMessage(uMsg, wParam, lParam) handle exn => ( print(concat["Exception with message ", Int.toString uMsg, exnMessage exn ]); WM_NULL ) val (result, newState) = call(h, msg, !state) handle exn => ( print(concat["Exception with message ", PolyML.makestring msg, exnMessage exn ]); (LRESINT 0, !state) ) in (* For a few messages we have to update the value pointed to by wParam/lParam after we've handled it. *) updateParamsFromMessage(msg, wParam, lParam); state := newState; (* If our callback returned SOME x we use that as the result, otherwise we call the default. We do it this way rather than having the caller call DefWindowProc because that would involve recompiling the message and we can't guarantee that all the parameters of the original message would be correctly set. *) case result of LRESINT res => SysWord.fromInt res | LRESHANDLE res => fromAddr(voidStarOfHandle res) end; in callBack end (* When we first set up a callback we don't know the window handle so we use null. *) fun setCallback(call, init) = setOutstanding(SOME(windowCallback(call, init))) val sendMsg = winCall4(user "SendMessageA") (cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw fun subclass(w: HWND, f: HWND * Message * 'a -> LRESULT * 'a, init: 'a): (HWND * Message -> LRESULT) = let val testPoly = sendMsg(w, WMTESTPOLY, 0w0, 0w0) fun addCallback (hWnd, call: HWND * Message * 'a -> LRESULT * 'a, init: 'a): unit = setWindowList( TableEntry{ hWnd = hWnd, callBack = windowCallback(call, init) } :: getWindowList ()) val oldDefProc: callback = if SysWord.toIntX testPoly = ~1 then (* We already have our Window proc installed. *) let (* We should have a callback already installed. *) val oldCallback = getCallback w in removeCallback w; addCallback(w, f, init); oldCallback end else let (* Set up the new window proc and get the existing one. *) val oldWProc = SetWindowLong(w, ~4, mainWinProc) val defProc = fn (h, m, w, l) => CallWindowProc(oldWProc, h, m, w, l) in (* Remove any existing callback function and install the new one. *) removeCallback w; addCallback(w, f, init); defProc end in fn (hw: HWND, msg: Message) => let val (m: int, w: SysWord.word, l: SysWord.word, freeMem) = compileMessage msg val res: SysWord.word = oldDefProc(hw, m, w, l) in messageReturnFromParams(msg, w, l, res) before freeMem() end end end (* Keyboard operations on modeless dialogues are performed by isDialogMessage. We keep a list of modeless dialogues and process them in the main message loop. This also has an important function for dialogues created by FindText. They allocate memory which can't be freed until the dialogue has gone. *) local val modeless = ref [] val isDialogMessage = winCall2 (user "IsDialogMessage") (cHWND, cPointer) cBool val isWindow = winCall1 (user "IsWindow") (cHWND) cBool in fun addModelessDialogue (hWnd: HWND, doFree) = modeless := (hWnd, doFree) :: (!modeless) fun isDialogueMsg(msg: voidStar) = let (* Take this opportunity to filter any dialogues that have gone away. *) (* If this has gone away run any "free" function.*) fun filter(w, f) = if isWindow w then true (* Still there *) else (case f of NONE => () | SOME f => f(); false) in modeless := List.filter filter (!modeless); (* See if isDialogMessage returns true for any of these. *) List.foldl (fn ((w, _), b) => b orelse isDialogMessage(w, msg)) false (!modeless) end end datatype PeekMessageOptions = PM_NOREMOVE | PM_REMOVE (* TODO: We can also include PM_NOYIELD. *) val peekMsg = winCall5(user "PeekMessageA") (cPointer, cHWND, cUint, cUint, cUint) cBool fun PeekMessage(hWnd: HWND option, wMsgFilterMin: int, wMsgFilterMax: int, remove: PeekMessageOptions): MSG option = let val msg = malloc msgSize val opts = case remove of PM_REMOVE => 1 | PM_NOREMOVE => 0 val res = peekMsg(msg, getOpt(hWnd, hNull), wMsgFilterMin, wMsgFilterMax, opts) in (if not res then NONE else SOME(loadMessage msg)) before free msg end; (* TODO: This was originally implemented before we had threads. The only reason for continuing with it is to allow the thread to be interrupted. *) local val callWin = RunCall.run_call2 RuntimeCalls.POLY_SYS_os_specific in fun pauseForMessage(hwnd: HWND, min, max): unit = callWin(1101, (hwnd, min, max)) (* We implement WaitMessage within the RTS. *) fun WaitMessage(): bool = (pauseForMessage(hwndNull, 0, 0); true) end (* We don't use the underlying GetMessage function because that blocks the thread which would prevent other ML processes from running. Instead we use PeekMessage and an RTS call which allows other threads to run. *) fun GetMessage(hWnd: HWND option, wMsgFilterMin: int, wMsgFilterMax: int): MSG = case PeekMessage(hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE) of SOME msg => msg | NONE => let val hwnd = getOpt(hWnd, hwndNull) in pauseForMessage(hwnd, wMsgFilterMin, wMsgFilterMax); GetMessage(hWnd, wMsgFilterMin, wMsgFilterMax) end (* Wait for messages and dispatch them. It only returns when a QUIT message has been received. *) fun RunApplication() = let val peekMsg = winCall5(user "PeekMessageA") (cPointer, cHWND, cUint, cUint, cUint) cBool val transMsg = winCall1(user "TranslateMessage") (cPointer) cBool val dispMsg = winCall1(user "DispatchMessageA") (cPointer) cInt val msg = malloc msgSize val res = peekMsg(msg, hNull, 0, 0, 1) in if not res then (* There's no message at the moment. Wait for one. *) (free msg; WaitMessage(); RunApplication()) else case loadMessage msg of { msg = WM_QUIT{exitcode}, ...} => (free msg; exitcode) | _ => ( if isDialogueMsg msg then () else ( transMsg msg; dispMsg msg; () ); free msg; RunApplication() ) end local val sendMsg = winCall4(user "SendMessageA") (cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw in fun SendMessage(hWnd: HWND, msg: Message) = let val (msgId, wp, lp, freeMem) = compileMessage msg val reply = sendMsg(hWnd, msgId, wp, lp) in (* Update any result values and cast the results if necessary. *) messageReturnFromParams(msg, wp, lp, reply) before freeMem() end end local val postMessage = winCall4(user "PostMessageA") (cHWND, cUint, cUINT_PTRw, cUINT_PTRw) (successState "PostMessage") in fun PostMessage(hWnd: HWND, msg: Message) = let val (msgId, wp, lp, _) = compileMessage msg (* This could result in a memory leak. *) in postMessage(hWnd, msgId, wp, lp) end end val HWND_BROADCAST: HWND = handleOfVoidStar(sysWord2VoidStar 0wxffff) val PostQuitMessage = winCall1 (user "PostQuitMessage") cInt cVoid val RegisterWindowMessage = winCall1 (user "RegisterWindowMessageA") (cString) cUint val InSendMessage = winCall0 (user "InSendMessage") () cBool val GetInputState = winCall0 (user "GetInputState") () cBool local val getMessagePos = winCall0 (user "GetMessagePos") () cDWORDw in fun GetMessagePos(): POINT = let val r = getMessagePos () in { x = Word.toInt(LOWORD r), y = Word.toInt(HIWORD r) } end end val GetMessageTime = Time.fromMilliseconds o winCall0 (user "GetMessageTime") () cLong datatype QueueStatus = QS_KEY | QS_MOUSEMOVE | QS_MOUSEBUTTON | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_SENDMESSAGE | QS_HOTKEY | QS_ALLPOSTMESSAGE local val tab = [ (QS_KEY, 0wx0001), (QS_MOUSEMOVE, 0wx0002), (QS_MOUSEBUTTON, 0wx0004), (QS_POSTMESSAGE, 0wx0008), (QS_TIMER, 0wx0010), (QS_PAINT, 0wx0020), (QS_SENDMESSAGE, 0wx0040), (QS_HOTKEY, 0wx0080), (QS_ALLPOSTMESSAGE, 0wx0100) ] in val (fromQS, toQS) = tableSetLookup(tab, NONE) end val QS_MOUSE = [QS_MOUSEMOVE, QS_MOUSEBUTTON] val QS_INPUT = QS_KEY :: QS_MOUSE val QS_ALLEVENTS = QS_POSTMESSAGE :: QS_TIMER :: QS_PAINT :: QS_HOTKEY :: QS_INPUT val QS_ALLINPUT = QS_SENDMESSAGE :: QS_ALLEVENTS local val getQueueStatus = winCall1 (user "GetQueueStatus") (cUintw) cDWORDw in fun GetQueueStatus flags = let val res = getQueueStatus(fromQS flags) in (* The RTS uses PeekMessage internally so the "new messages" value in the LOWORD is meaningless. *) toQS(Word32.fromLargeWord(Word.toLargeWord(HIWORD(res)))) end end (* BroadcastSystemMessage DispatchMessage GetMessageExtraInfo InSendMessageEx - NT 5.0 and Windows 98 PostThreadMessage ReplyMessage SendAsyncProc SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo TranslateMessage Obsolete Functions PostAppMessage SetMessageQueue *) end end; polyml-5.6/mlsource/extra/Win/MessageBox.sml000066400000000000000000000136751265146633400212110ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure MessageBox : sig type HWND val IDABORT : int val IDCANCEL : int val IDCLOSE : int val IDHELP : int val IDIGNORE : int val IDNO : int val IDOK : int val IDRETRY : int val IDYES : int structure MessageBoxStyle : sig include BIT_FLAGS val MB_ABORTRETRYIGNORE : flags val MB_APPLMODAL : flags val MB_DEFAULT_DESKTOP_ONLY : flags val MB_DEFBUTTON1 : flags val MB_DEFBUTTON2 : flags val MB_DEFBUTTON3 : flags val MB_DEFBUTTON4 : flags val MB_HELP : flags val MB_ICONASTERISK : flags val MB_ICONERROR : flags val MB_ICONEXCLAMATION : flags val MB_ICONHAND : flags val MB_ICONINFORMATION : flags val MB_ICONQUESTION : flags val MB_ICONSTOP : flags val MB_ICONWARNING : flags val MB_NOFOCUS : flags val MB_OK : flags val MB_OKCANCEL : flags val MB_RETRYCANCEL : flags val MB_RIGHT : flags val MB_RTLREADING : flags val MB_SERVICE_NOTIFICATION : flags val MB_SERVICE_NOTIFICATION_NT3X : flags val MB_SETFOREGROUND : flags val MB_SYSTEMMODAL : flags val MB_TASKMODAL : flags val MB_TOPMOST : flags val MB_USERICON : flags val MB_YESNO : flags val MB_YESNOCANCEL : flags end val MessageBox : HWND option * string option * string option * MessageBoxStyle.flags -> int val MessageBeep: MessageBoxStyle.flags -> unit end = struct local open Foreign open Base open Globals in type HWND = HWND structure MessageBoxStyle = struct open Word32 type flags = word val toWord = toLargeWord and fromWord = fromLargeWord val flags = List.foldl (fn (a, b) => orb(a,b)) 0w0 fun allSet (fl1, fl2) = andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = andb(notb fl1, fl2) val MB_OK = 0wx00000000 val MB_OKCANCEL = 0wx00000001 val MB_ABORTRETRYIGNORE = 0wx00000002 val MB_YESNOCANCEL = 0wx00000003 val MB_YESNO = 0wx00000004 val MB_RETRYCANCEL = 0wx00000005 val MB_ICONHAND = 0wx00000010 val MB_ICONQUESTION = 0wx00000020 val MB_ICONEXCLAMATION = 0wx00000030 val MB_ICONASTERISK = 0wx00000040 val MB_USERICON = 0wx00000080 val MB_ICONWARNING = MB_ICONEXCLAMATION val MB_ICONERROR = MB_ICONHAND val MB_ICONINFORMATION = MB_ICONASTERISK val MB_ICONSTOP = MB_ICONHAND val MB_DEFBUTTON1 = 0wx00000000 val MB_DEFBUTTON2 = 0wx00000100 val MB_DEFBUTTON3 = 0wx00000200 val MB_DEFBUTTON4 = 0wx00000300 val MB_APPLMODAL = 0wx00000000 val MB_SYSTEMMODAL = 0wx00001000 val MB_TASKMODAL = 0wx00002000 val MB_HELP = 0wx00004000 (* Help Button *) val MB_NOFOCUS = 0wx00008000 val MB_SETFOREGROUND = 0wx00010000 val MB_DEFAULT_DESKTOP_ONLY = 0wx00020000 val MB_TOPMOST = 0wx00040000 val MB_RIGHT = 0wx00080000 val MB_RTLREADING = 0wx00100000 val MB_SERVICE_NOTIFICATION = 0wx00200000 val MB_SERVICE_NOTIFICATION_NT3X = 0wx00040000 val all = flags[MB_OK, MB_OKCANCEL, MB_ABORTRETRYIGNORE, MB_YESNOCANCEL, MB_YESNO, MB_RETRYCANCEL, MB_ICONHAND, MB_ICONQUESTION, MB_ICONEXCLAMATION, MB_ICONASTERISK, MB_USERICON, MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_DEFBUTTON4, MB_APPLMODAL, MB_SYSTEMMODAL, MB_TASKMODAL, MB_HELP, MB_NOFOCUS, MB_SETFOREGROUND, MB_DEFAULT_DESKTOP_ONLY, MB_TOPMOST, MB_RIGHT, MB_RTLREADING, MB_SERVICE_NOTIFICATION, MB_SERVICE_NOTIFICATION_NT3X] val intersect = List.foldl (fn (a, b) => andb(a,b)) all val cConvert: flags conversion = cUintw end (* Return values from a message box. Should this be a datatype? *) val IDOK = 1 val IDCANCEL = 2 val IDABORT = 3 val IDRETRY = 4 val IDIGNORE = 5 val IDYES = 6 val IDNO = 7 val IDCLOSE = 8 val IDHELP = 9 val MessageBox = winCall4 (user "MessageBoxA") (cHWNDOPT, STRINGOPT, STRINGOPT, MessageBoxStyle.cConvert) cInt val MessageBeep = winCall1 (user "MessageBeep") MessageBoxStyle.cConvert (successState "MessageBeep") end end; polyml-5.6/mlsource/extra/Win/Metafile.sml000066400000000000000000000273341265146633400206770ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Metafile : sig type HENHMETAFILE type HMETAFILE type HDC (*= Base.HDC*) type RECT = { top: int, left: int, bottom: int, right: int } type SIZE = { cx: int, cy: int } datatype MapMode = datatype Transform.MapMode type METAFILEPICT = {mm: MapMode, size: SIZE, hMF: HMETAFILE} type ENHMETAHEADER = { bounds: RECT, frame: RECT, fileSize: int, records: int, handles: int, palEntries: int, resolutionPixels: SIZE, resolutionMM: SIZE, openGL: bool } val CloseEnhMetaFile : HDC -> HENHMETAFILE val CloseMetaFile : HDC -> HMETAFILE val CopyEnhMetaFile : HENHMETAFILE * string -> HENHMETAFILE val CopyMetaFile : HMETAFILE * string -> HMETAFILE val CreateEnhMetaFile : HDC * string option * RECT * {pictureName: string, applicationName: string} option -> HDC val CreateMetaFile : string option -> HDC val DeleteEnhMetaFile : HENHMETAFILE -> unit val DeleteMetaFile : HMETAFILE -> unit val GdiComment : HDC * Word8Vector.vector -> unit val GetEnhMetaFile : string -> HENHMETAFILE val GetEnhMetaFileBits : HENHMETAFILE -> Word8Vector.vector val GetEnhMetaFileDescription : HENHMETAFILE -> {pictureName: string, applicationName: string} option val GetEnhMetaFileHeader : HENHMETAFILE -> ENHMETAHEADER val GetMetaFile : string -> HMETAFILE val GetMetaFileBitsEx : HMETAFILE -> Word8Vector.vector val GetWinMetaFileBits : HENHMETAFILE * Transform.MapMode * HDC -> Word8Vector.vector val PlayEnhMetaFile : HDC * HENHMETAFILE * RECT -> unit val PlayMetaFile : HDC * HMETAFILE -> unit val SetEnhMetaFileBits : Word8Vector.vector -> HENHMETAFILE val SetWinMetaFileBits : Word8Vector.vector * HDC * {size: SIZE, mapMode: MapMode} option -> HENHMETAFILE end = struct local open Foreign Base GdiBase in datatype MapMode = datatype Transform.MapMode type HENHMETAFILE = HENHMETAFILE and HMETAFILE = HMETAFILE type HDC = Base.HDC type SIZE = SIZE and RECT = RECT type METAFILEPICT = METAFILEPICT (* TODO: Many of these should check for NULL as a result indicating an error. *) val CloseEnhMetaFile = winCall1 (gdi "CloseEnhMetaFile") (cHDC) cHENHMETAFILE and CloseMetaFile = winCall1 (gdi "CloseMetaFile") (cHDC) cHMETAFILE and CopyEnhMetaFile = winCall2 (gdi "CopyEnhMetaFileA") (cHENHMETAFILE, cString) cHENHMETAFILE and CopyMetaFile = winCall2 (gdi "CopyMetaFileA") (cHMETAFILE, cString) cHMETAFILE and CreateMetaFile = winCall1 (gdi "CreateMetaFileA") (STRINGOPT) cHDC and DeleteEnhMetaFile = winCall1 (gdi "DeleteEnhMetaFile") (cHENHMETAFILE) (successState "DeleteEnhMetaFile") and DeleteMetaFile = winCall1 (gdi "DeleteMetaFile") (cHMETAFILE) (successState "DeleteMetaFile") and GetEnhMetaFile = winCall1 (gdi "GetEnhMetaFileA") (cString) cHENHMETAFILE and GetMetaFile = winCall1 (gdi "GetMetaFileA") (cString) cHMETAFILE and PlayEnhMetaFile = winCall3(gdi "PlayEnhMetaFile") (cHDC, cHENHMETAFILE, cConstStar cRect) (successState "PlayEnhMetaFile") and PlayMetaFile = winCall2(gdi "PlayMetaFile") (cHDC, cHMETAFILE) (successState "PlayMetaFile") local val cemf = winCall4 (gdi "CreateEnhMetaFileA") (cHDC, STRINGOPT, cConstStar cRect, cPointer) cHDC in fun CreateEnhMetaFile(hdc, name, r, NONE) = cemf(hdc, name, r, Memory.null) | CreateEnhMetaFile(hdc, name, r, SOME{applicationName, pictureName}) = let val appSize = size applicationName and pictSize = size pictureName open Memory val buff = malloc (Word.fromInt(appSize + pictSize + 3)) in (* The two strings are copied to the buffer with a null between and two nulls at the end. *) copyStringToMem(buff, 0, applicationName); copyStringToMem(buff, appSize+1, pictureName); set8(buff, Word.fromInt(appSize + pictSize + 2), 0w0); (cemf(hdc, name, r, buff) handle ex => (free buff; raise ex)) before free buff end end local val gdiComment = winCall3 (gdi "GdiComment") (cHDC, cUint, cPointer) (successState "GdiComment") in fun GdiComment(hdc, v) = let val vecsize = Word8Vector.length v val buff = toCWord8vec v in gdiComment (hdc, vecsize, buff) handle ex => (Memory.free buff; raise ex); Memory.free buff end end local val gemfb = winCall3 (gdi "GetEnhMetaFileBits") (cHENHMETAFILE, cUint, cPointer) (cPOSINT "GetEnhMetaFileBits") in fun GetEnhMetaFileBits(hemf: HENHMETAFILE): Word8Vector.vector = let (* Call with a NULL buffer to find out how big it is. *) open Memory val size = gemfb(hemf, 0, Memory.null) val buff = malloc(Word.fromInt size) val res = gemfb(hemf, size, buff) handle ex => (free buff; raise ex) in fromCWord8vec(buff, size) before free buff end end local val gemfb = winCall3 (gdi "GetMetaFileBitsEx") (cHMETAFILE, cUint, cPointer) (cPOSINT "GetMetaFileBitsEx") in fun GetMetaFileBitsEx(hemf: HMETAFILE): Word8Vector.vector = let (* Call with a NULL buffer to find out how big it is. *) open Memory val size = gemfb(hemf, 0, Memory.null) val buff = malloc(Word.fromInt size) val res = gemfb(hemf, size, buff) handle ex => (free buff; raise ex) in fromCWord8vec(buff, size) before free buff end end local val gemfd = winCall3 (gdi "GetEnhMetaFileDescriptionA") (cHENHMETAFILE, cUint, cPointer) cInt (* It's supposed to return a uint but GDI_ERROR is -1 *) in fun GetEnhMetaFileDescription(hemf: HENHMETAFILE) = (* Call with a NULL buffer to find out how big it is. *) case gemfd(hemf, 0, Memory.null) of 0 => NONE (* No error - simply no description. *) | len => if len < 0 then raiseSysErr() else let (* The application and picture names are encoded as a pair. *) open Memory infix 6 ++ val buff = malloc (Word.fromInt len) val res = gemfd(hemf, len, buff) val str1 = fromCstring buff val str2 = fromCstring(buff ++ Word.fromInt (size str1 +1)) in SOME {applicationName=str1, pictureName=str2} end end local val setEnhMetaFileBits = winCall2 (gdi "SetEnhMetaFileBits") (cUint, cPointer) cHENHMETAFILE in fun SetEnhMetaFileBits(v: Word8Vector.vector): HENHMETAFILE = let val mem = toCWord8vec v in (setEnhMetaFileBits (Word8Vector.length v, mem) handle ex => (Memory.free mem; raise ex)) before Memory.free mem end end local val gwmfb = winCall5 (gdi "GetWinMetaFileBits") (cHENHMETAFILE, cUint, cPointer, cMAPMODE, cHDC) (cPOSINT "GetWinMetaFileBits") in fun GetWinMetaFileBits(hemf, mapMode, hdc) = let (* Call with a null pointer to get the size. *) open Memory val size = gwmfb(hemf, 0, null, mapMode, hdc) val buff = malloc (Word.fromInt size) val _ = gwmfb(hemf, size, buff, mapMode, hdc) handle ex => (free buff; raise ex) in fromCWord8vec(buff, size) before free buff end end local val swmfb = winCall4 (gdi "SetWinMetaFileBits") (cUint, cPointer, cHDC, cOptionPtr(cConstStar cMETAFILEPICT)) cHENHMETAFILE in fun SetWinMetaFileBits(v, hdc, opts) = let val optmfp = case opts of NONE => NONE | SOME {size, mapMode} => SOME {mm=mapMode, size=size, hMF=hgdiObjNull} val mem = toCWord8vec v in (swmfb(Word8Vector.length v, mem, hdc, optmfp) handle ex => (Memory.free mem; raise ex)) before Memory.free mem end end type ENHMETAHEADER = { bounds: RECT, frame: RECT, fileSize: int, records: int, handles: int, palEntries: int, resolutionPixels: SIZE, resolutionMM: SIZE, openGL: bool } local val ENHMETAHEADER = cStruct18(cDWORD, cDWORD, cRect, cRect, cDWORD, cDWORD, cDWORD, cDWORD, cWORD, cWORD, cDWORD, cDWORD, cDWORD, cSize, cSize, cDWORD, cDWORD, cDWORD) val {load=toEMH, ...} = breakConversion ENHMETAHEADER val gemf = winCall3 (gdi "GetEnhMetaFileHeader") (cHENHMETAFILE, cUint, cPointer) (cPOSINT "GetEnhMetaFileHeader") in fun GetEnhMetaFileHeader(h: HENHMETAFILE): ENHMETAHEADER = let (* Initial call with a NULL buffer to get size and check the handle. *) open Memory val size = gemf(h, 0, null) val buff = malloc(Word.fromInt size) val _ = gemf(h, size, buff) handle ex => (free buff; raise ex) val (_, _, bounds, frame, _, _, fileSize, records, handles, _, _, _, palEntries, resolutionPixels, resolutionMM, _, _, openGL) = toEMH buff val () = free buff (* Ignore the description and the pixelFormat structure. We can get the description using GetEnhMetaFileDescription. *) in { bounds = bounds, frame = frame, fileSize = fileSize, records = records, handles = handles, palEntries = palEntries, resolutionPixels = resolutionPixels, resolutionMM = resolutionMM, openGL = openGL <> 0 } end end (* Other metafile Functions EnhMetaFileProc EnumEnhMetaFile GetEnhMetaFilePaletteEntries PlayEnhMetaFileRecord Obsolete Functions EnumMetaFile EnumMetaFileProc PlayMetaFileRecord SetMetaFileBitsEx *) end end; polyml-5.6/mlsource/extra/Win/Mouse.sml000066400000000000000000000037071265146633400202370ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Mouse : sig type HWND type POINT = { x: int, y: int } val DragDetect : HWND * POINT -> bool val GetCapture : unit -> HWND option val GetDoubleClickTime : unit -> Time.time val ReleaseCapture : unit -> unit val SetCapture : HWND -> HWND option val SetDoubleClickTime : Time.time -> unit val SwapMouseButton : bool -> bool end = struct local open Foreign Base in type HWND = HWND and POINT = POINT val GetCapture = winCall0 (user "GetCapture") () cHWNDOPT val SetCapture = winCall1 (user "SetCapture") (cHWND) cHWNDOPT val ReleaseCapture = winCall0 (user "ReleaseCapture") () (successState "ReleaseCapture") val SetDoubleClickTime = winCall1 (user "SetDoubleClickTime") (cUint) (successState "SetDoubleClickTime") o Time.toMilliseconds val GetDoubleClickTime = Time.fromMilliseconds o winCall0 (user "GetDoubleClickTime") () cUint val SwapMouseButton = winCall1 (user "SwapMouseButton") (cBool) cBool val DragDetect = winCall2 (user "DragDetect") (cHWND, cPoint) cBool end end; (* GetMouseMovePoints - NT 5.0 and Windows 98 only mouse_event TrackMouseEvent *) polyml-5.6/mlsource/extra/Win/Painting.sml000066400000000000000000000171001265146633400207100ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Painting : sig type HWND and HDC and COLORREF and HRGN type RECT = { top: int, left: int, bottom: int, right: int } type BinaryRasterOperation val R2_BLACK : BinaryRasterOperation val R2_COPYPEN : BinaryRasterOperation val R2_MASKNOTPEN : BinaryRasterOperation val R2_MASKPEN : BinaryRasterOperation val R2_MASKPENNOT : BinaryRasterOperation val R2_MERGENOTPEN : BinaryRasterOperation val R2_MERGEPEN : BinaryRasterOperation val R2_MERGEPENNOT : BinaryRasterOperation val R2_NOP : BinaryRasterOperation val R2_NOT : BinaryRasterOperation val R2_NOTCOPYPEN : BinaryRasterOperation val R2_NOTMASKPEN : BinaryRasterOperation val R2_NOTMERGEPEN : BinaryRasterOperation val R2_NOTXORPEN : BinaryRasterOperation val R2_WHITE : BinaryRasterOperation val R2_XORPEN : BinaryRasterOperation type PAINTSTRUCT = { hdc: HDC, erase: bool, paint: RECT, private: Word8Vector.vector } val BeginPaint : HWND -> HDC * PAINTSTRUCT val EndPaint : HWND * PAINTSTRUCT -> unit val GdiFlush : unit -> unit val GdiGetBatchLimit : unit -> int val GdiSetBatchLimit : int -> int val GetBkColor : HDC -> COLORREF val GetROP2 : HDC -> BinaryRasterOperation val GetUpdateRect : HWND * bool -> RECT option val GetUpdateRgn : HWND * HRGN * bool -> Region.ResultRegion val GetWindowDC : HWND -> HDC val InvalidateRgn : HWND * HRGN * bool -> unit val SetBkColor : HDC * COLORREF -> COLORREF val SetROP2 : HDC * BinaryRasterOperation -> BinaryRasterOperation val WindowFromDC : HDC -> HWND val InvalidateRect: HWND * RECT * bool -> unit end = struct local open Foreign Base GdiBase fun checkDC c = (checkResult(not(isHdcNull c)); c) val zeroRect:RECT = {top=0, bottom=0, left=0, right=0} in type ResultRegion = Region.ResultRegion type HDC = HDC and HRGN = HRGN and HWND = HWND type RECT = RECT and COLORREF = COLORREF (* GetROP2 and SetROP2. *) local datatype BinaryRasterOperation = W of int in type BinaryRasterOperation = BinaryRasterOperation val BINARYRASTEROPERATION = absConversion {abs = W, rep = fn W n => n} cInt val R2_BLACK = W (1 (* 0 *)) val R2_NOTMERGEPEN = W (2 (* DPon *)) val R2_MASKNOTPEN = W (3 (* DPna *)) val R2_NOTCOPYPEN = W (4 (* PN *)) val R2_MASKPENNOT = W (5 (* PDna *)) val R2_NOT = W (6 (* Dn *)) val R2_XORPEN = W (7 (* DPx *)) val R2_NOTMASKPEN = W (8 (* DPan *)) val R2_MASKPEN = W (9 (* DPa *)) val R2_NOTXORPEN = W (10 (* DPxn *)) val R2_NOP = W (11 (* D *)) val R2_MERGENOTPEN = W (12 (* DPno *)) val R2_COPYPEN = W (13 (* P *)) val R2_MERGEPENNOT = W (14 (* PDno *)) val R2_MERGEPEN = W (15 (* DPo *)) val R2_WHITE = W (16 (* 1 *)) end val GdiFlush = winCall0 (gdi "GdiFlush") () (successState "GdiFlush") val GdiGetBatchLimit = winCall0 (gdi "GdiGetBatchLimit") () cDWORD val GdiSetBatchLimit = winCall1 (gdi "GdiSetBatchLimit") (cDWORD) cDWORD val GetBkColor = winCall1 (gdi "GetBkColor") (cHDC) cCOLORREF val GetROP2 = winCall1(user "GetROP2") (cHDC) BINARYRASTEROPERATION val GetUpdateRgn = winCall3(user "GetUpdateRgn") (cHWND,cHRGN,cBool) RESULTREGION val GetWindowDC = winCall1(user "GetWindowDC") (cHWND) cHDC val InvalidateRgn = winCall3(user "InvalidateRgn") (cHWND,cHRGN,cBool) (successState "InvalidateRgn") val InvalidateRect = winCall3 (user "InvalidateRect") (cHWND, cConstStar cRect, cBool) (successState "InvalidateRect") val SetBkColor = winCall2 (gdi "SetBkColor") (cHDC, cCOLORREF) cCOLORREF val WindowFromDC = winCall1(user "WindowFromDC") (cHDC) cHWND val SetROP2 = winCall2(user "SetROP2") (cHDC, BINARYRASTEROPERATION) BINARYRASTEROPERATION local val getUpdateRect = winCall3 (user "GetUpdateRect") (cHWND, cStar cRect, cBool) cBool in fun GetUpdateRect (hw: HWND, erase: bool): RECT option = let val va = ref zeroRect (* If the update area is empty the result is zero. *) val res = getUpdateRect(hw, va, erase) in if res then SOME(!va) else NONE end end type PAINTSTRUCT = { hdc: HDC, erase: bool, paint: RECT, private: Word8Vector.vector } local fun toPt({hdc, erase, paint, private}: PAINTSTRUCT) = (hdc, erase, paint, Byte.bytesToString private) and fromPt(hdc, erase, paint, private) = {hdc = hdc, erase = erase, paint = paint, private = Byte.stringToBytes private} val PAINTSTRUCT = absConversion {abs=fromPt, rep=toPt} (cStruct4(cHDC, cBool, cRect, cCHARARRAY 40)) val beginPaint = winCall2 (user "BeginPaint") (cHWND, cStar PAINTSTRUCT) cHDC in fun BeginPaint(hwnd: HWND): HDC * PAINTSTRUCT = let val b = ref {hdc=hNull, erase=false, paint=zeroRect, private=Word8Vector.fromList []} val hdc = checkDC (beginPaint (hwnd, b)) in (hdc, !b) end val EndPaint = winCall2 (user "EndPaint") (cHWND, cConstStar PAINTSTRUCT) cVoid end (* Other painting and drawing functions: DrawAnimatedRects DrawCaption DrawEdge DrawFocusRect DrawFrameControl DrawState DrawStateProc ExcludeUpdateRgn GetBkMode GetBoundsRect GetWindowRgn GrayString LockWindowUpdate OutputProc PaintDesktop RedrawWindow SetBkMode SetBoundsRect SetWindowRgn UpdateWindow ValidateRect ValidateRgn *) end end; polyml-5.6/mlsource/extra/Win/Path.sml000066400000000000000000000077261265146633400200500ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Path : sig type HDC and HRGN type POINT = {x: int, y: int} datatype PointType = datatype Line.PointType val AbortPath : HDC -> unit val BeginPath : HDC -> unit val CloseFigure : HDC -> unit val EndPath : HDC -> unit val FillPath : HDC -> unit val FlattenPath : HDC -> unit val GetMiterLimit : HDC -> real val GetPath : HDC -> (PointType * POINT) list val PathToRegion : HDC -> HRGN val SetMiterLimit : HDC * real -> real val StrokeAndFillPath : HDC -> unit val StrokePath : HDC -> unit val WidenPath : HDC -> unit end = struct local open Foreign Base in type HDC = HDC and POINT = POINT and HRGN = HRGN datatype PointType = datatype Line.PointType (* PATHS *) val AbortPath = winCall1(gdi "AbortPath") (cHDC) (successState "AbortPath") val BeginPath = winCall1(gdi "BeginPath") (cHDC) (successState "BeginPath") val CloseFigure = winCall1(gdi "CloseFigure") (cHDC) (successState "CloseFigure") val EndPath = winCall1(gdi "EndPath") (cHDC) (successState "EndPath") val FillPath = winCall1(gdi "FillPath") (cHDC) (successState "FillPath") val FlattenPath = winCall1(gdi "FlattenPath") (cHDC) (successState "FlattenPath") val PathToRegion = winCall1(gdi "PathToRegion") (cHDC) cHRGN val StrokeAndFillPath = winCall1(gdi "StrokeAndFillPath") (cHDC) (successState "StrokeAndFillPath") val StrokePath = winCall1(gdi "StrokePath") (cHDC) (successState "StrokePath") val WidenPath = winCall1(gdi "WidenPath") (cHDC) (successState "WidenPath") local val getMiterLimit = winCall2(gdi "GetMiterLimit") (cHDC, cStar cFloat) (successState "GetMiterLimit") and setMiterLimit = winCall3(gdi "SetMiterLimit") (cHDC, cFloat, cStar cFloat) (successState "SetMiterLimit") in fun GetMiterLimit hdc = let val v = ref 0.0 in getMiterLimit(hdc, v); !v end and SetMiterLimit(hdc, m) = let val v = ref 0.0 in setMiterLimit(hdc, m, v); !v end end local val getPath = winCall4 (gdi "GetPath") (cHDC, cPointer, cPointer, cInt) cInt val {load=fromPt, ctype={size=sizePt, ...}, ...} = breakConversion cPoint val {load=fromTy, ...} = breakConversion GdiBase.cPOINTTYPE in fun GetPath h = let open Memory infix 6 ++ (* Passing 0 as the size will retrieve the number of points. *) val count = getPath(h, null, null, 0) val _ = checkResult(count >= 0) val ptarr = malloc(Word.fromInt count * sizePt) val farr = malloc(Word.fromInt count) val _ = getPath(h, ptarr, farr, count) handle ex => (free ptarr; free farr; raise ex) fun getElement n = (fromTy(farr ++ Word.fromInt n), fromPt(ptarr ++ Word.fromInt n * sizePt)) in List.tabulate(count, getElement) before (free ptarr; free farr) end end end end; polyml-5.6/mlsource/extra/Win/Pen.sml000066400000000000000000000054001265146633400176610ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Pen : sig type HPEN datatype PenStyle = PS_ALTERNATE | PS_COSMETIC | PS_DASH | PS_DASHDOT | PS_DASHDOTDOT | PS_DOT | PS_ENDCAP_FLAT | PS_ENDCAP_ROUND | PS_ENDCAP_SQUARE | PS_GEOMETRIC | PS_INSIDEFRAME | PS_JOIN_BEVEL | PS_JOIN_MITER | PS_JOIN_ROUND | PS_NULL | PS_SOLID | PS_USERSTYLE type COLORREF = Color.COLORREF type LOGBRUSH = Brush.LOGBRUSH type LOGPEN = PenStyle * int option * COLORREF val CreatePen : PenStyle list * int * COLORREF -> HPEN val CreatePenIndirect : LOGPEN -> HPEN val ExtCreatePen : PenStyle list * int * LOGBRUSH * (int * int) list -> HPEN end = struct local open Foreign Base in open GdiBase type HPEN = HPEN val CreatePen = winCall3 (gdi "CreatePen") (cPENSTYLE,cInt,cCOLORREF) (cHPEN) val CreatePenIndirect = winCall1 (gdi "CreatePenIndirect") (cConstStar cLOGPEN) (cHPEN) local val extCreatePen = winCall5 (gdi "ExtCreatePen") (cPENSTYLE,cDWORD,cConstStar cLOGBRUSH,cDWORD,cPointer) (cHPEN) val PAIR = absConversion {abs = fn _ => raise Fail "PAIR", rep = MAKELONG} cDWORDw val list2v = list2Vector PAIR in fun ExtCreatePen (ps: PenStyle list, width, log: LOGBRUSH, dashSp: (int*int) list) = let (* custom is supposed to be NULL if ps <> PS_USERSTYLE. Make sure it is at least NULL if the list is empty. *) val (custom, len) = case dashSp of [] => (Memory.null, 0) | _ => list2v (map (fn (i, j) => (Word.fromInt i, Word.fromInt j)) dashSp) in (extCreatePen(ps, width, log, len, custom) handle ex => (Memory.free custom; raise ex)) before Memory.free custom end end end end; polyml-5.6/mlsource/extra/Win/Printing.sml000066400000000000000000000050161265146633400207340ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Printing : sig type HDC type DOCINFO = { docName: string, output: string option, dType: string option} val StartDoc : HDC * DOCINFO -> int val StartPage : HDC -> unit val AbortDoc : HDC -> unit val EndDoc : HDC -> unit val EndPage : HDC -> unit datatype WMPrintOption = PRF_CHECKVISIBLE | PRF_NONCLIENT | PRF_CLIENT | PRF_ERASEBKGND | PRF_CHILDREN | PRF_OWNED end = struct local open Foreign Base in type HDC = HDC type DOCINFO = { docName: string, output: string option, dType: string option} (* PRINTING AND SPOOLING. *) local val DOCINFO = cStruct5(cInt, cString, STRINGOPT, STRINGOPT, cDWORDw) val {ctype={size=sizeDI, ...}, ...} = breakConversion DOCINFO val startdoc = winCall2(gdi "StartDocA")(cHDC, DOCINFO) cInt in fun StartDoc(hdc: HDC, {docName, output, dType}): int = let val res = startdoc(hdc, (Word.toInt sizeDI, docName, output, dType, 0w0)) in checkResult(res > 0); res end end local fun checkSuccess res = checkResult(res > 0) in val EndDoc = checkSuccess o winCall1(gdi "EndDoc") cHDC cInt val StartPage = checkSuccess o winCall1(gdi "StartPage") cHDC cInt val EndPage = checkSuccess o winCall1(gdi "EndPage") cHDC cInt val AbortDoc = checkSuccess o winCall1(gdi "AbortDoc") cHDC cInt end datatype WMPrintOption = datatype Message.WMPrintOption (* Other printing functions: DeviceCapabilities Escape ExtEscape SetAbortProc *) end end; polyml-5.6/mlsource/extra/Win/ROOT.sml000066400000000000000000000020671265146633400177300ustar00rootroot00000000000000PolyML.Compiler.reportUnreferencedIds := true; use "Base"; use "Globals"; use "LocaleBase"; use "Locale"; use "Resource"; use "WinBase"; use "ComboBase"; use "ScrollBase"; use "MenuBase"; use "MESSAGE.signature"; use "Message"; use "Class"; use "FlagPrint"; use "Window"; use "ComboBox"; use "Edit"; use "ListBox"; use "Scrollbar"; use "Static"; use "Button"; use "Dialog"; use "Cursor"; use "Icon"; use "Menu"; use "GdiBase"; use "Color"; use "FontBase"; use "Font"; use "DeviceBase"; use "Bitmap"; use "Brush"; use "Pen"; use "DeviceContext"; use "CommonDialog"; use "MessageBox"; use "Caret"; use "Transform"; use "Metafile"; use "Clipboard"; use "Rectangle"; use "Printing"; use "Line"; use "Path"; use "Region"; use "Painting"; use "Shape"; use "Clipping"; use "DragDrop"; use "Keyboard"; use "Mouse"; use "WinSystem"; use "CommonControls"; List.app PolyML.Compiler.forgetStructure [ "Base", "ComboBase", "FontBase", "MenuBase", "ScrollBase", "WinBase", "MessageBase", "GdiBase", "DeviceBase", "LocaleBase" ]; List.app PolyML.Compiler.forgetFunctor ["FlagPrint"]; polyml-5.6/mlsource/extra/Win/Rectangle.sml000066400000000000000000000101351265146633400210440ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Rectangle : sig type POINT = { x: int, y: int } type RECT = { top: int, left: int, bottom: int, right: int } val EqualRect : RECT * RECT -> bool val InflateRect : RECT * int * int -> RECT val IntersectRect : RECT * RECT -> RECT option val IsRectEmpty : RECT -> bool val OffsetRect : RECT * int * int -> RECT val PtInRect : RECT * POINT -> bool val SetRect : int * int * int * int -> RECT val SetRectEmpty : unit -> RECT val SubtractRect : RECT * RECT -> RECT val UnionRect : RECT * RECT -> RECT end = struct local open Foreign Base (* fun usercall_MII name CR (C1,C2,C3) (a1,a2,a3) = let val (from1,to1,ctype1) = breakConversion C1 val (from2,to2,ctype2) = breakConversion C2 val (from3,to3,ctype3) = breakConversion C3 val (fromR,toR,ctypeR) = breakConversion CR val va1 = address (to1 a1) val va2 = to2 a2 val va3 = to3 a3 val res = calluser name [(Cpointer ctype1,va1),(ctype2,va2),(ctype3,va3)] ctypeR in (fromR res,from1 (deref va1)) end*) in type RECT = RECT and POINT = POINT (* TODO: It would be a lot more efficient to implement these directly in ML. *) val zeroRect: RECT = {top=0, bottom=0, left=0, right=0} (* RECTANGLES. *) val EqualRect = winCall2 (user "EqualRect") (cConstStar cRect, cConstStar cRect) cBool local val inflateRect = winCall3 (user "InflateRect") (cStar cRect, cInt, cInt) (successState "InflateRect") in fun InflateRect(r, x, y) = let val v = ref r in inflateRect(v, x, y); !v end end local val intersectRect = winCall3 (user "IntersectRect") (cStar cRect, cConstStar cRect, cConstStar cRect) cBool in fun IntersectRect(r1, r2) = let val r = ref zeroRect in if intersectRect(r, r1, r2) then SOME(!r) else NONE end end local val offsetRect = winCall3 (user "OffsetRect") (cStar cRect, cInt, cInt) (successState "OffsetRect") in fun OffsetRect(r, x, y) = let val v = ref r in offsetRect(v, x, y); !v end end val IsRectEmpty = winCall1(user "IsRectEmpty") (cConstStar cRect) cBool val PtInRect = winCall2(user "PtInRect") (cConstStar cRect, cPoint) cBool local val setRect = winCall5 (user "SetRect") (cStar cRect, cInt, cInt, cInt, cInt) (successState "SetRect") in fun SetRect(a,b,c,d) : RECT = let val v = ref zeroRect in setRect(v, a,b,c,d); !v end end fun SetRectEmpty () : RECT = zeroRect (* No need to call C to do this *) local val subtractRect = winCall3 (user "SubtractRect") (cStar cRect, cConstStar cRect, cConstStar cRect) (successState "SubtractRect") and unionRect = winCall3 (user "UnionRect") (cStar cRect, cConstStar cRect, cConstStar cRect) (successState "UnionRect") in fun SubtractRect(r1, r2) = let val v = ref zeroRect in subtractRect(v, r1, r2); !v end and UnionRect(r1, r2) = let val v = ref zeroRect in unionRect(v, r1, r2); !v end end (* Other Rectangle functions: CopyRect *) end end; polyml-5.6/mlsource/extra/Win/Region.sml000066400000000000000000000205061265146633400203660ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Region: sig type HDC and HBRUSH and HRGN and HPEN type POINT = { x: int, y: int } type RECT = { top: int, left: int, bottom: int, right: int } type RegionOperation val RGN_AND : RegionOperation val RGN_COPY : RegionOperation val RGN_DIFF : RegionOperation val RGN_ERROR : RegionOperation val RGN_OR : RegionOperation val RGN_XOR : RegionOperation type ResultRegion val COMPLEXREGION : ResultRegion val NULLREGION : ResultRegion val ERROR : ResultRegion val SIMPLEREGION : ResultRegion type PolyFillMode val ALTERNATE : PolyFillMode val WINDING : PolyFillMode val CombineRgn : HRGN * HRGN * HRGN * RegionOperation -> ResultRegion val CreateEllipticRgn : RECT -> HRGN val CreatePolygonRgn : POINT list * PolyFillMode -> HRGN val CreateRectRgn : RECT -> HRGN val CreateRoundRectRgn : RECT * int * int -> HRGN val EqualRgn : HRGN * HRGN -> bool val FillRgn : HDC * HRGN * HBRUSH -> unit val FrameRgn : HDC * HRGN * HBRUSH * int * int -> unit val GetPolyFillMode : HDC -> PolyFillMode val GetRgnBox : HRGN -> RECT val InvertRgn : HDC * HRGN -> unit val OffsetRgn : HRGN * int * int -> ResultRegion val PaintRgn : HDC * HRGN -> unit val PtInRegion : HRGN * int * int -> bool val RectInRegion : HRGN * RECT -> bool val SetPolyFillMode : HDC * PolyFillMode -> PolyFillMode val SetRectRgn : HRGN * RECT -> unit end = struct local open Foreign Base in type HRGN = Base.HRGN and HBRUSH = Base.HBRUSH and HDC = Base.HDC and HPEN = HPEN and RECT = RECT and POINT = POINT open GdiBase local datatype PolyFillMode = W of int in type PolyFillMode = PolyFillMode val POLYFILLMODE = absConversion {abs = W, rep = fn W n => n} cInt val ALTERNATE = W (1) val WINDING = W (2) end val CombineRgn = winCall4(gdi "CombineRgn") (cHRGN,cHRGN,cHRGN,REGIONOPERATION) RESULTREGION val EqualRgn = winCall2(gdi "EqualRgn") (cHRGN,cHRGN) cBool val FillRgn = winCall3(gdi "FillRgn") (cHDC,cHRGN,cHBRUSH) (successState "FillRgn") val FrameRgn = winCall5(gdi "FrameRgn") (cHDC,cHRGN,cHBRUSH,cInt,cInt) (successState "FrameRgn") val GetPolyFillMode = winCall1(gdi "GetPolyFillMode") (cHDC) POLYFILLMODE val InvertRgn = winCall2(gdi "InvertRgn") (cHDC,cHRGN) (successState "InvertRgn") val OffsetRgn = winCall3(gdi "OffsetRgn") (cHRGN,cInt,cInt) RESULTREGION val PaintRgn = winCall2(gdi "PaintRgn") (cHDC,cHRGN) (successState "PaintRgn") val PtInRegion = winCall3(gdi "PtInRegion") (cHRGN,cInt,cInt) cBool val RectInRegion = winCall2(gdi "RectInRegion") (cHRGN,cRect) cBool val SetPolyFillMode = winCall2(gdi "SetPolyFillMode") (cHDC,POLYFILLMODE) POLYFILLMODE local val getRgnBox = winCall2(gdi "GetRgnBox") (cHRGN, cStar cRect) cInt val zeroRect = {top=0, bottom=0, left=0, right=0} in fun GetRgnBox hr = let val v = ref zeroRect in checkResult(getRgnBox(hr, v) <> 0); !v end end local val setRectRgn = winCall5 (gdi "SetRectRgn") (cHRGN,cInt,cInt,cInt,cInt) (successState "SetRectRgn") in fun SetRectRgn (h, { left, top, right, bottom }) = setRectRgn(h,left,top,right,bottom) end local val createEllipticRgn = winCall4 (gdi "CreateEllipticRgn") (cInt,cInt,cInt,cInt) cHRGN in fun CreateEllipticRgn {left,top,right,bottom} = createEllipticRgn(left,top,right,bottom) end local val createRectRgn = winCall4 (gdi "CreateRectRgn") (cInt,cInt,cInt,cInt) cHRGN in fun CreateRectRgn {left,top,right,bottom} = createRectRgn(left,top,right,bottom) end local val createRoundRectRgn = winCall6 (gdi "CreateRoundRectRgn") (cInt,cInt,cInt,cInt,cInt,cInt) cHRGN in fun CreateRoundRectRgn({left,top,right,bottom},w,h) = createRoundRectRgn(left,top,right,bottom,w,h) end local val createPolygonRgn = winCall3 (gdi "CreatePolygonRgn") (cPointer,cInt,POLYFILLMODE) cHRGN val ptList = list2Vector cPoint in fun CreatePolygonRgn (pts: POINT list, fmode) = let val (ptarr, count) = ptList pts in (createPolygonRgn(ptarr,count,fmode) handle ex => (Memory.free ptarr; raise ex)) before Memory.free ptarr end end (* fun ExtCreateRegion (x,rects,rectmain) = let val {r11,r12,r21,r22,tx,ty} = breakXForm x val xform = make_struct [ (Cfloat,toCfloat r11), (Cfloat,toCfloat r12), (Cfloat,toCfloat r21), (Cfloat,toCfloat r22), (Cfloat,toCfloat tx), (Cfloat,toCfloat ty) ] val count = List.length rects val rectarr = alloc count (Cstruct [Clong,Clong,Clong,Clong]) fun pl2a v n [] = () | pl2a v n ({left,top,right,bottom} :: rest) = let val item = make_struct [(Clong,toClong left), (Clong,toClong top), (Clong,toClong right), (Clong,toClong bottom)] in ( assign (Cstruct [Clong,Clong,Clong,Clong]) (offset n (Cstruct [Clong,Clong,Clong,Clong]) v) item ; pl2a v (n+1) rest ) end val u = pl2a rectarr 0 rects val {left,top,right,bottom} = rectmain val rgndata = make_struct [ (Clong,toClong 32), (Clong,toClong 1), (Clong,toClong count), (Clong,toClong 0 ), (Clong,toClong left), (Clong,toClong top), (Clong,toClong right), (Clong,toClong bottom), (Cvoid,rectarr) ] val struct_size = 64 + 16 * count in winCall3 (gdi "ExtCreateRegion") (POINTER,INT,POINTER) (cHRGN) (address xform,struct_size,address rgndata) end *) (* fun GetRegionData h = let val bufsize = winCall3 (gdi "GetRegionData") (cHRGN,LONG,POINTER) (LONG) (h,0,toCint 0) val rgndata = alloc 1 (Cstruct [Clong,Clong,Clong,Clong, Clong,Clong,Clong,Clong,Cvoid]) val res = winCall3 (gdi "GetRegionData") (cHRGN,LONG,POINTER) (LONG) (h,bufsize,address rgndata) in "not implemented" end *) (* Other Region Functions CreateEllipticRgnIndirect CreatePolyPolygonRgn CreateRectRgnIndirect ExtCreateRegion GetRegionData *) end end; polyml-5.6/mlsource/extra/Win/Resource.sml000066400000000000000000000164241265146633400207360ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Resource : sig datatype ResourceType = RT_CURSOR | RT_BITMAP | RT_ICON | RT_MENU | RT_DIALOG | RT_STRING | RT_FONTDIR | RT_FONT | RT_ACCELERATOR | RT_RCDATA | RT_MESSAGETABLE | RT_GROUP_CURSOR | RT_GROUP_ICON | RT_VERSION | RT_DLGINCLUDE | RT_ANICURSOR | RT_ANIICON | RT_PLUGPLAY | RT_VXD type HRSRC type HRSRCGLOBAL type HINSTANCE datatype RESID = IdAsInt of int | IdAsString of string val MAKEINTRESOURCE : int -> RESID type HUPDATE val BeginUpdateResource : string * bool -> HUPDATE val EndUpdateResource : HUPDATE * bool -> unit val FindResource : HINSTANCE * RESID * ResourceType -> HRSRC val FindResourceEx : HINSTANCE * ResourceType * RESID * Locale.LANGID -> HRSRC val FreeLibrary : HINSTANCE -> unit val LoadLibrary : string -> HINSTANCE val LoadResource : HINSTANCE * HRSRC -> HRSRCGLOBAL val LoadString : HINSTANCE * RESID -> string val LockResource : HRSRCGLOBAL -> Word8Vector.vector val SizeofResource : HINSTANCE * HRSRC -> int val UpdateResource : HUPDATE * ResourceType * RESID * Locale.LANGID * Word8Vector.vector option -> unit end = struct open Foreign open Base datatype RESID = datatype RESID fun MAKEINTRESOURCE i = if i >= 0 andalso i < 65536 then IdAsInt i else raise Fail "resource id out of range" fun checkHandle h = (checkResult(not(isHNull h)); h) datatype ResourceType = RT_CURSOR | RT_BITMAP | RT_ICON | RT_MENU | RT_DIALOG | RT_STRING | RT_FONTDIR | RT_FONT | RT_ACCELERATOR | RT_RCDATA | RT_MESSAGETABLE | RT_GROUP_CURSOR | RT_GROUP_ICON | RT_VERSION | RT_DLGINCLUDE | RT_ANICURSOR | RT_ANIICON | RT_PLUGPLAY | RT_VXD local fun toRes 1 = RT_CURSOR | toRes 2 = RT_BITMAP | toRes 3 = RT_ICON | toRes 4 = RT_MENU | toRes 5 = RT_DIALOG | toRes 6 = RT_STRING | toRes 7 = RT_FONTDIR | toRes 8 = RT_FONT | toRes 9 = RT_ACCELERATOR | toRes 10 = RT_RCDATA | toRes 11 = RT_MESSAGETABLE | toRes 12 = RT_GROUP_CURSOR | toRes 14 = RT_GROUP_ICON | toRes 16 = RT_VERSION | toRes 17 = RT_DLGINCLUDE | toRes 19 = RT_PLUGPLAY | toRes 20 = RT_VXD | toRes 21 = RT_ANICURSOR | toRes 22 = RT_ANIICON | toRes _ = raise Fail "Unknown Resource Type" fun fromRes RT_CURSOR = 1 | fromRes RT_BITMAP = 2 | fromRes RT_ICON = 3 | fromRes RT_MENU = 4 | fromRes RT_DIALOG = 5 | fromRes RT_STRING = 6 | fromRes RT_FONTDIR = 7 | fromRes RT_FONT = 8 | fromRes RT_ACCELERATOR = 9 | fromRes RT_RCDATA = 10 | fromRes RT_MESSAGETABLE = 11 | fromRes RT_GROUP_CURSOR = 12 | fromRes RT_GROUP_ICON = 14 | fromRes RT_VERSION = 16 | fromRes RT_DLGINCLUDE = 17 | fromRes RT_PLUGPLAY = 19 | fromRes RT_VXD = 20 | fromRes RT_ANICURSOR = 21 | fromRes RT_ANIICON = 22 in val RESOURCETYPE = absConversion {abs = toRes, rep = fromRes} cInt end local datatype HRSRCGLOBAL = HRSRCGLOBAL of Memory.voidStar * int in type HRSRCGLOBAL = HRSRCGLOBAL val LoadLibrary = checkHandle o winCall1 (kernel "LoadLibraryA") (cString) cHINSTANCE and FreeLibrary = winCall1 (kernel "FreeLibrary") (cHINSTANCE) (successState "FreeLibrary") and FindResource = checkHandle o winCall3 (kernel "FindResourceA") (cHINSTANCE, cRESID, RESOURCETYPE) cHRSRC and SizeofResource = winCall2 (kernel "SizeofResource") (cHINSTANCE, cHRSRC) cDWORD (* The name and type are in the reverse order in FindResource and FindResourceEx *) and FindResourceEx = checkHandle o winCall4 (kernel "FindResourceExA") (cHINSTANCE, RESOURCETYPE, cRESID, LocaleBase.LANGID) cHRSRC (* LoadResource - load a resource into memory and get a handle to it. *) local val loadResource = winCall2 (kernel "LoadResource") (cHINSTANCE, cHRSRC) and lockResource = winCall1 (kernel "LockResource") (cPointer) cPointer and loadString = winCall4 (user "LoadStringA") (cHINSTANCE, cRESID, cPointer, cInt) cInt in fun LoadResource (hInst, hRsrc) = let val size = SizeofResource (hInst, hRsrc) val load = loadResource cPointer val rsrc = load(hInst, hRsrc) in HRSRCGLOBAL(rsrc, size) end (* LockResource - get the resource as a piece of binary store. *) fun LockResource (HRSRCGLOBAL(hg, size)) = let val res = lockResource hg in Word8Vector.tabulate(size, fn i => Memory.get8(res, Word.fromInt i)) end fun LoadString (hInst, resId): string = let (* The underlying call returns the number of bytes copied EXCLUDING the terminating null. *) (* The easiest way to make sure we have enough store is to loop. *) open Memory fun tryLoad n = let val store = malloc n val used = Word.fromInt(loadString(hInst, resId, store, Word.toInt n)) in (* We can't distinguish the empty string from a missing resource. *) if used = 0w0 then "" else if used < n-0w1 then fromCstring store before free store else (free store; tryLoad(n*0w2)) end in tryLoad 0w100 end end val BeginUpdateResource = (fn c => (checkResult(not(isHNull c)); c)) o winCall2 (user "BeginUpdateResourceA") (cString, cBool) cHUPDATE val EndUpdateResource = winCall2 (user "EndUpdateResource") (cHUPDATE, cBool) (successState "EndUpdateResource") local val updateResource = winCall6 (user "UpdateResource") (cHUPDATE, RESOURCETYPE, cRESID, LocaleBase.LANGID, cOptionPtr cByteArray, cInt) (successState "UpdateResource") in (* NONE here means delete the resource, SOME means a value to store. *) (* N.B. If updating a string the new value must be in Unicode. *) fun UpdateResource(hup, rt, resid, lang, v as SOME vec) = updateResource(hup, rt, resid, lang, v, Word8Vector.length vec) | UpdateResource(hup, rt, resid, lang, NONE) = updateResource(hup, rt, resid, lang, NONE, 0) end end end; polyml-5.6/mlsource/extra/Win/ScrollBase.sml000066400000000000000000000055021265146633400211730ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure ScrollBase = struct local open Foreign Base in type enableArrows = { enableLeftUp: bool, enableRightDown: bool } val ESB_ENABLE_BOTH = { enableLeftUp = true, enableRightDown = true } val ESB_DISABLE_BOTH = { enableLeftUp = false, enableRightDown = false } val ESB_DISABLE_LEFT = { enableLeftUp = false, enableRightDown = true } val ESB_DISABLE_RIGHT = { enableLeftUp = true, enableRightDown = false } val ESB_DISABLE_UP = ESB_DISABLE_LEFT val ESB_DISABLE_DOWN = ESB_DISABLE_RIGHT local (* The arrows are disabled if the bit is set. *) fun toInt({enableLeftUp: bool, enableRightDown}: enableArrows) = IntInf.orb(if enableLeftUp then 0 else 1, if enableRightDown then 0 else 2) and fromInt i : enableArrows = {enableLeftUp = IntInf.andb(i, 1) = 0, enableRightDown = IntInf.andb(i, 2) = 0} in (* It's easier to use the functions directly for messages *) val ENABLESCROLLBARFLAG = (toInt, fromInt) val cENABLESCROLLBARFLAG = absConversion{rep = toInt, abs = fromInt} cUint end type SCROLLINFO = { minPos: int, maxPos: int, pageSize: int, pos: int, trackPos: int } datatype ScrollInfoOption = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL | SIF_TRACKPOS val SIF_ALL = [SIF_RANGE, SIF_PAGE, SIF_POS, SIF_TRACKPOS] local val tab = [ (SIF_RANGE, 0wx0001), (SIF_PAGE, 0wx0002), (SIF_POS, 0wx0004), (SIF_DISABLENOSCROLL, 0wx0008), (SIF_TRACKPOS, 0wx0010)] in (*val (fromSIF, toSIF) = tableSetLookup(tab, NONE)*) val cSCROLLINFOOPTION = tableSetConversion(tab, NONE) end (* Needed in Scrollbar and also Messages *) val cSCROLLINFOSTRUCT = cStruct7(cUint, cSCROLLINFOOPTION, cInt, cInt, cUint, cInt, cInt) end end; polyml-5.6/mlsource/extra/Win/Scrollbar.sml000066400000000000000000000254271265146633400210750ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Scrollbars. *) structure Scrollbar: sig type HWND and HDC and HRGN type RECT = { left: int, top: int, right: int, bottom: int } structure Style: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and SBS_HORZ:flags and SBS_VERT:flags and SBS_TOPALIGN:flags and SBS_LEFTALIGN:flags and SBS_BOTTOMALIGN:flags and SBS_RIGHTALIGN:flags and SBS_SIZEBOXTOPLEFTALIGN:flags and SBS_SIZEBOXBOTTOMRIGHTALIGN:flags and SBS_SIZEBOX:flags and SBS_SIZEGRIP:flags end type enableArrows = { enableLeftUp: bool, enableRightDown: bool } val ESB_ENABLE_BOTH: enableArrows val ESB_DISABLE_BOTH: enableArrows val ESB_DISABLE_LEFT: enableArrows val ESB_DISABLE_RIGHT: enableArrows val ESB_DISABLE_UP: enableArrows val ESB_DISABLE_DOWN: enableArrows type SCROLLINFO = { minPos: int, maxPos: int, pageSize: int, pos: int, trackPos: int } datatype ScrollInfoOption = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_DISABLENOSCROLL | SIF_TRACKPOS val SIF_ALL : ScrollInfoOption list datatype ScrollBarType = SB_BOTH | SB_CTL | SB_HORZ | SB_VERT datatype ScrollWindowFlag = SW_ERASE | SW_INVALIDATE | SW_SCROLLCHILDREN val EnableScrollBar : HWND * ScrollBarType * enableArrows -> unit val GetScrollInfo : HWND * ScrollBarType * ScrollInfoOption list -> SCROLLINFO val GetScrollPos : HWND * ScrollBarType -> int val ScrollDC : HDC * int * int * RECT * RECT * HRGN -> RECT val ScrollWindow : HWND * int * int * RECT * RECT -> unit val ScrollWindowEx : HWND * int * int * RECT * RECT * HRGN * ScrollWindowFlag list -> RECT val SetScrollInfo : HWND * ScrollBarType * ScrollInfoOption list * SCROLLINFO * bool -> int val SetScrollPos : HWND * ScrollBarType * int * bool -> int val SetScrollRange : HWND * ScrollBarType * int * int * bool -> bool val ShowScrollBar : HWND * ScrollBarType * bool -> unit end = struct local open Foreign Base in open ScrollBase type HDC = HDC and HWND = HWND and HRGN = HRGN and RECT = RECT structure Style = struct open Window.Style (* Include all the windows styles. *) val SBS_HORZ = fromWord 0wx0000 val SBS_VERT = fromWord 0wx0001 val SBS_TOPALIGN = fromWord 0wx0002 val SBS_LEFTALIGN = fromWord 0wx0002 val SBS_BOTTOMALIGN = fromWord 0wx0004 val SBS_RIGHTALIGN = fromWord 0wx0004 val SBS_SIZEBOXTOPLEFTALIGN = fromWord 0wx0002 val SBS_SIZEBOXBOTTOMRIGHTALIGN = fromWord 0wx0004 val SBS_SIZEBOX = fromWord 0wx0008 val SBS_SIZEGRIP = fromWord 0wx0010 val all = flags[Window.Style.all, SBS_HORZ, SBS_VERT, SBS_TOPALIGN, SBS_BOTTOMALIGN, SBS_SIZEBOX, SBS_SIZEGRIP] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end datatype ScrollBarType = SB_CTL | SB_HORZ | SB_VERT | SB_BOTH local val tab = [ (SB_HORZ, 0), (SB_VERT, 1), (SB_CTL, 2), (SB_BOTH, 3) ] in val cSCROLLBARTYPE = tableConversion(tab, NONE) cUint (* It's a UINT for EnableScrollBar and int for GetScrollInfo *) end datatype ScrollWindowFlag = SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE local val tab = [ (SW_SCROLLCHILDREN, 0wx0001), (SW_INVALIDATE, 0wx0002), (SW_ERASE, 0wx0004) ] in val cSCROLLWINDOWFLAG = tableSetConversion(tab, NONE) end local open Foreign open Base in val EnableScrollBar = winCall3(user "EnableScrollBar") (cHWND, cSCROLLBARTYPE, cENABLESCROLLBARFLAG) (successState "EnableScrollBar") val GetScrollPos = winCall2 (user "GetScrollPos") (cHWND,cSCROLLBARTYPE) cInt val SetScrollRange = winCall5(user "SetScrollRange") (cHWND,cSCROLLBARTYPE,cInt,cInt,cBool) cBool val SetScrollPos = winCall4(user "SetScrollPos") (cHWND,cSCROLLBARTYPE,cInt,cBool) cInt val ShowScrollBar = winCall3(user "ShowScrollBar") (cHWND,cSCROLLBARTYPE,cBool) (successState "ShowScrollBar") val ScrollWindow = winCall5(user "ScrollWindow") (cHWND,cInt,cInt,cConstStar cRect,cConstStar cRect) (successState "ScrollWindow") local val scrollDC = winCall7 (user "ScrollDC") (cHDC,cInt,cInt,cConstStar cRect,cConstStar cRect,cHRGN,cStar cRect) (successState "ScrollDC") val scrollWindowEx = winCall8(user "ScrollWindowEx") (cHWND,cInt,cInt,cConstStar cRect,cConstStar cRect,cHRGN,cStar cRect,cSCROLLWINDOWFLAG) (successState "ScrollWindowEx") in fun ScrollDC(hDC, dx, dy, prcScroll, prcClip, hrgnUpdate): RECT = let val v = ref{top=0, bottom=0, left=0, right=0} val () = scrollDC(hDC, dx, dy, prcScroll, prcClip, hrgnUpdate, v) in ! v end and ScrollWindowEx(hWnd, dx, dy, prcScroll, prcClip, hrgnUpdate, flags) = let val v = ref{top=0, bottom=0, left=0, right=0} val () = scrollWindowEx(hWnd, dx, dy, prcScroll, prcClip, hrgnUpdate, v, flags) in ! v end end local val {ctype = {size=sizeStruct, ...}, ...} = breakConversion cSCROLLINFOSTRUCT val getScrollInfo = winCall3 (user "GetScrollInfo") (cHWND, cSCROLLBARTYPE, cStar cSCROLLINFOSTRUCT) (successState "GetScrollInfo") and setScrollInfo = winCall4 (user "SetScrollInfo") (cHWND, cSCROLLBARTYPE, cConstStar cSCROLLINFOSTRUCT, cBool) cInt in fun GetScrollInfo(hwnd, sbt, options): SCROLLINFO = let val v = ref(Word.toInt sizeStruct, options, 0, 0, 0, 0, 0) val _: unit = getScrollInfo(hwnd, sbt, v) val (_, _, minPos, maxPos, pageSize, pos, trackPos) = ! v in {minPos = minPos, maxPos = maxPos, pageSize = pageSize, pos = pos, trackPos = trackPos} end and SetScrollInfo(hwnd, sbt, options, { minPos, maxPos, pageSize, pos, trackPos}, redraw): int = setScrollInfo(hwnd, sbt, (Word.toInt sizeStruct, options, minPos, maxPos, pageSize, pos, trackPos), redraw) end end end end; (* let open Scrollbar.Style (* The same values are used with different names for horizontal and vertical bars. Maybe we should generate different names according to whether the SBS_VERT flag is set. *) val flagTable = [(SBS_VERT, "SBS_VERT"), (SBS_TOPALIGN, "SBS_TOPALIGN"), (SBS_BOTTOMALIGN, "SBS_BOTTOMALIGN"), (SBS_SIZEBOX, "SBS_SIZEBOX"), (SBS_SIZEGRIP, "SBS_SIZEGRIP"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *) polyml-5.6/mlsource/extra/Win/Shape.sml000066400000000000000000000076531265146633400202130ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Shape: sig type HBRUSH type HDC type POINT = { x: int, y: int } type RECT = { top: int, left: int, bottom: int, right: int } val Chord : HDC * RECT * POINT * POINT -> unit val Ellipse : HDC * RECT -> unit val FillRect : HDC * RECT * HBRUSH -> unit val FrameRect : HDC * RECT * HBRUSH -> unit val InvertRect : HDC * RECT -> unit val Pie : HDC * RECT * POINT * POINT -> unit val Polygon : HDC * POINT list -> unit val Rectangle : HDC * RECT -> unit val RoundRect : HDC * RECT * int * int -> unit end = struct local open Foreign Base in type HDC = HDC and HBRUSH = HBRUSH type RECT = RECT and POINT = POINT (* FILLED SHAPES *) (* Strangely, some of these are in user32 and some in gdi32. *) val FillRect = winCall3 (user "FillRect") (cHDC,cConstStar cRect,cHBRUSH) (successState "FillRect") val FrameRect = winCall3 (user "FrameRect") (cHDC,cConstStar cRect,cHBRUSH) (successState "FrameRect") val InvertRect = winCall2 (user "InvertRect") (cHDC,cConstStar cRect) (successState "InvertRect") local val chord = winCall9 (gdi "Chord") (cHDC,cInt,cInt,cInt,cInt,cInt,cInt,cInt,cInt) (successState "Chord") in fun Chord (h,{left,top,right,bottom}: RECT,{x=x1,y=y1}: POINT,{x=x2,y=y2}: POINT) = chord (h,left,top,right,bottom,x1,y1,x2,y2) end local val ellipse = winCall5 (gdi "Ellipse") (cHDC,cInt,cInt,cInt,cInt) (successState "Ellipse") in fun Ellipse (h,{left,top,right,bottom}: RECT) = ellipse(h,left,top,right,bottom) end local val pie = winCall9 (gdi "Pie") (cHDC,cInt,cInt,cInt,cInt,cInt,cInt,cInt,cInt) (successState "Pie") in fun Pie (h,{left,top,right,bottom}: RECT,{x=x1,y=y1}: POINT,{x=x2,y=y2}: POINT) = pie(h,left,top,right,bottom,x1,y1,x2,y2) end local val polygon = winCall3 (gdi "Polygon") (cHDC,cPointer,cInt) (successState "Polygon") val ptList = list2Vector cPoint in fun Polygon (h,pts: POINT list) = let val (ptarr, count) = ptList pts in polygon (h, ptarr, count) handle ex => (Memory.free ptarr; raise ex); Memory.free ptarr end end local val rectangle = winCall5 (gdi "Rectangle") (cHDC,cInt,cInt,cInt,cInt) (successState "Rectangle") in fun Rectangle(h,{left,top,right,bottom}: RECT) = rectangle(h,left,top,right,bottom) end local val roundRect = winCall7 (gdi "RoundRect") (cHDC,cInt,cInt,cInt,cInt,cInt,cInt) (successState "RoundRect") in fun RoundRect(h,{left,top,right,bottom}: RECT,w,ht) = roundRect(h,left,top,right,bottom,w,ht) end (* Other Filled shape functions: PolyPolygon *) end end; polyml-5.6/mlsource/extra/Win/Static.sml000066400000000000000000000216051265146633400203730ustar00rootroot00000000000000(* Copyright (c) 2001 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Static windows e.g. labels. *) structure Static: sig structure Style: sig include BIT_FLAGS where type flags = Window.Style.flags val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags and SS_LEFT: flags and SS_CENTER: flags and SS_RIGHT: flags and SS_ICON: flags and SS_BLACKRECT: flags and SS_GRAYRECT: flags and SS_WHITERECT: flags and SS_BLACKFRAME: flags and SS_GRAYFRAME: flags and SS_WHITEFRAME: flags and SS_USERITEM: flags and SS_SIMPLE: flags and SS_LEFTNOWORDWRAP: flags and SS_OWNERDRAW: flags and SS_BITMAP: flags and SS_ENHMETAFILE: flags and SS_ETCHEDHORZ: flags and SS_ETCHEDVERT: flags and SS_ETCHEDFRAME: flags and SS_TYPEMASK: flags and SS_NOPREFIX: flags and SS_NOTIFY: flags and SS_CENTERIMAGE: flags and SS_RIGHTJUST: flags and SS_REALSIZEIMAGE: flags and SS_SUNKEN: flags and SS_ENDELLIPSIS: flags and SS_PATHELLIPSIS: flags and SS_WORDELLIPSIS: flags and SS_ELLIPSISMASK: flags end structure Notifications: sig val STN_CLICKED: int val STN_DBLCLK: int val STN_ENABLE: int val STN_DISABLE: int end end = struct structure Style = struct open Window.Style (* Include all the windows styles. *) val SS_LEFT: flags = fromWord 0wx00000000 val SS_CENTER: flags = fromWord 0wx00000001 val SS_RIGHT: flags = fromWord 0wx00000002 val SS_ICON: flags = fromWord 0wx00000003 val SS_BLACKRECT: flags = fromWord 0wx00000004 val SS_GRAYRECT: flags = fromWord 0wx00000005 val SS_WHITERECT: flags = fromWord 0wx00000006 val SS_BLACKFRAME: flags = fromWord 0wx00000007 val SS_GRAYFRAME: flags = fromWord 0wx00000008 val SS_WHITEFRAME: flags = fromWord 0wx00000009 val SS_USERITEM: flags = fromWord 0wx0000000A val SS_SIMPLE: flags = fromWord 0wx0000000B val SS_LEFTNOWORDWRAP: flags = fromWord 0wx0000000C val SS_OWNERDRAW: flags = fromWord 0wx0000000D val SS_BITMAP: flags = fromWord 0wx0000000E val SS_ENHMETAFILE: flags = fromWord 0wx0000000F val SS_ETCHEDHORZ: flags = fromWord 0wx00000010 val SS_ETCHEDVERT: flags = fromWord 0wx00000011 val SS_ETCHEDFRAME: flags = fromWord 0wx00000012 val SS_TYPEMASK: flags = fromWord 0wx0000001F val SS_NOPREFIX: flags = fromWord 0wx00000080 val SS_NOTIFY: flags = fromWord 0wx00000100 val SS_CENTERIMAGE: flags = fromWord 0wx00000200 val SS_RIGHTJUST: flags = fromWord 0wx00000400 val SS_REALSIZEIMAGE: flags = fromWord 0wx00000800 val SS_SUNKEN: flags = fromWord 0wx00001000 val SS_ENDELLIPSIS: flags = fromWord 0wx00004000 val SS_PATHELLIPSIS: flags = fromWord 0wx00008000 val SS_WORDELLIPSIS: flags = fromWord 0wx0000C000 val SS_ELLIPSISMASK: flags = fromWord 0wx0000C000 val all = flags[Window.Style.all, SS_LEFT, SS_CENTER, SS_RIGHT, SS_ICON, SS_BLACKRECT, SS_GRAYRECT, SS_WHITERECT, SS_BLACKFRAME, SS_GRAYFRAME, SS_WHITEFRAME, SS_USERITEM, SS_SIMPLE, SS_LEFTNOWORDWRAP, SS_OWNERDRAW, SS_BITMAP, SS_ENHMETAFILE, SS_ETCHEDHORZ, SS_ETCHEDVERT, SS_ETCHEDFRAME, SS_TYPEMASK, SS_NOPREFIX, SS_NOTIFY, SS_CENTERIMAGE, SS_RIGHTJUST, SS_REALSIZEIMAGE, SS_SUNKEN, SS_ENDELLIPSIS, SS_PATHELLIPSIS, SS_WORDELLIPSIS, SS_ELLIPSISMASK] val intersect = List.foldl (fn (a, b) => fromWord(SysWord.andb(toWord a, toWord b))) all end structure Notifications = struct val STN_CLICKED = 0 val STN_DBLCLK = 1 val STN_ENABLE = 2 val STN_DISABLE = 3 end end; (* let open Static.Style fun getType w = let val typeField = fromWord(SysWord.andb(toWord w, toWord SS_TYPEMASK)) in if typeField = SS_LEFT then "SS_LEFT" else if typeField = SS_CENTER then "SS_CENTER" else if typeField = SS_RIGHT then "SS_RIGHT" else if typeField = SS_ICON then "SS_ICON" else if typeField = SS_BLACKRECT then "SS_BLACKRECT" else if typeField = SS_GRAYRECT then "SS_GRAYRECT" else if typeField = SS_WHITERECT then "SS_WHITERECT" else if typeField = SS_BLACKFRAME then "SS_BLACKFRAME" else if typeField = SS_GRAYFRAME then "SS_GRAYFRAME" else if typeField = SS_WHITEFRAME then "SS_WHITEFRAME" else if typeField = SS_USERITEM then "SS_USERITEM" else if typeField = SS_SIMPLE then "SS_SIMPLE" else if typeField = SS_LEFTNOWORDWRAP then "SS_LEFTNOWORDWRAP" else if typeField = SS_OWNERDRAW then "SS_OWNERDRAW" else if typeField = SS_BITMAP then "SS_BITMAP" else if typeField = SS_ENHMETAFILE then "SS_ENHMETAFILE" else if typeField = SS_ETCHEDHORZ then "SS_ETCHEDHORZ" else if typeField = SS_ETCHEDVERT then "SS_ETCHEDVERT" else if typeField = SS_ETCHEDFRAME then "SS_ETCHEDFRAME" else "??" end val flagTable = [(SS_NOPREFIX, "SS_NOPREFIX"), (SS_NOTIFY, "SS_NOTIFY"), (SS_CENTERIMAGE, "SS_CENTERIMAGE"), (SS_RIGHTJUST, "SS_RIGHTJUST"), (SS_REALSIZEIMAGE, "SS_REALSIZEIMAGE"), (SS_SUNKEN, "SS_SUNKEN"), (SS_WORDELLIPSIS, "SS_WORDELLIPSIS"), (* Must come before the next two. *) (SS_ENDELLIPSIS, "SS_ENDELLIPSIS"), (SS_PATHELLIPSIS, "SS_PATHELLIPSIS"), (WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] fun accumulateFlags f [] = [] | accumulateFlags f ((w, s)::t) = if allSet(w, f) then s :: accumulateFlags(clear(w, f)) t else accumulateFlags f t fun printFlags(put, beg, brk, nd) depth _ x = (* This is just the code to print a list. *) let val stringFlags = getType x :: accumulateFlags x flagTable fun plist [] depth = () | plist _ 0 = put "..." | plist [h] depth = put h | plist (h::t) depth = ( put (h^","); brk (1, 0); plist t (depth - 1) ) in beg (3, false); put "["; if depth <= 0 then put "..." else plist stringFlags depth; put "]"; nd () end in PolyML.install_pp printFlags end; *)polyml-5.6/mlsource/extra/Win/Transform.sml000066400000000000000000000270271265146633400211230ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Transform: sig type HDC (*= Base.HDC*) type HWND (*= Base.HWND*) type POINT = { x: int, y: int } type SIZE = { cx: int, cy: int } datatype Fraction = Fraction of {num: int, denom: int} datatype MapMode = MM_ANISOTROPIC | MM_HIENGLISH | MM_HIMETRIC | MM_ISOTROPIC | MM_LOENGLISH | MM_LOMETRIC | MM_TEXT | MM_TWIPS val MM_MAX : MapMode val MM_MAX_FIXEDSCALE : MapMode val MM_MIN : MapMode type XForm = { m11: real, m12: real, m21: real, m22: real, dx: real, dy: real } type XFormType val MWT_IDENTITY : XFormType val MWT_LEFTMULTIPLY : XFormType val MWT_MAX : XFormType val MWT_MIN : XFormType val MWT_RIGHTMULTIPLY : XFormType type GraphicsMode val GM_ADVANCED : GraphicsMode val GM_COMPATIBLE : GraphicsMode val GM_ERROR : GraphicsMode val ClientToScreen : HWND * POINT -> POINT val CombineTransform : XForm * XForm -> XForm val DPtoLP : HDC * POINT list -> POINT list val GetCurrentPositionEx : HDC -> POINT val GetGraphicsMode : HDC -> GraphicsMode val GetMapMode : HDC -> MapMode val GetViewportExtEx : HDC -> SIZE val GetViewportOrgEx : HDC -> POINT val GetWindowExtEx : HDC -> SIZE val GetWindowOrgEx : HDC -> POINT val GetWorldTransform : HDC -> XForm val LPtoDP : HDC * POINT list -> POINT list val MapWindowPoints : HWND * HWND * POINT list -> POINT list val ModifyWorldTransform : HDC * XForm * XFormType -> unit val OffsetViewportOrgEx : HDC * int * int -> POINT val OffsetWindowOrgEx : HDC * int * int -> POINT val ScaleViewportExtEx : HWND * Fraction * Fraction -> SIZE val ScaleWindowExtEx : HWND * Fraction * Fraction -> SIZE val ScreenToClient : HWND * POINT -> POINT val SetGraphicsMode : HDC * GraphicsMode -> GraphicsMode val SetMapMode : HDC * MapMode -> MapMode val SetViewportExtEx : HDC * int * int -> SIZE val SetViewportOrgEx : HDC * int * int -> POINT val SetWindowExtEx : HDC * int * int -> SIZE val SetWindowOrgEx : HDC * int * int -> POINT val SetWorldTransform : HDC * XForm -> unit end = struct local open Foreign Base GdiBase in type HDC = Base.HDC and HWND = Base.HWND type POINT = POINT and SIZE = SIZE open GdiBase (* COORDINATE SPACES AND TRANSFORMATIONS *) local datatype GraphicsMode = W of int in type GraphicsMode = GraphicsMode val GRAPHICSMODE = absConversion {abs = W, rep = fn W n => n} cInt val GM_ERROR (* ???? *) = W 0 val GM_COMPATIBLE = W (1) val GM_ADVANCED = W (2) end (* An XFORM is a struct of six floats. Wrap this as an ML record for clarity *) type XForm = { m11: real, m12: real, m21: real, m22: real, dx: real, dy: real } local fun breakXForm {m11,m12,m21,m22,dx,dy} = (m11,m12,m21,m22,dx,dy) fun mkXForm (m11,m12,m21,m22,dx,dy) = {m11=m11,m12=m12,m21=m21,m22=m22,dx=dx,dy=dy} in val XFORM = absConversion {abs=mkXForm, rep=breakXForm} (cStruct6 (cFloat,cFloat,cFloat,cFloat,cFloat,cFloat)) end local datatype XFormType = W of int in type XFormType = XFormType val XFORMTYPE = absConversion {abs = W, rep = fn W n => n} cDWORD val MWT_IDENTITY = W (1) val MWT_LEFTMULTIPLY = W (2) val MWT_RIGHTMULTIPLY = W (3) val MWT_MIN = MWT_IDENTITY val MWT_MAX = MWT_RIGHTMULTIPLY end datatype Fraction = Fraction of {num:int, denom:int} local val clientToScreen = winCall2(user "ClientToScreen") (cHWND, cStar cPoint) (successState "ClientToScreen") val combineTransform = winCall3(gdi "CombineTransform") (cStar XFORM, cConstStar XFORM, cConstStar XFORM) (successState "CombineTransform") val getCurrentPositionEx = winCall2(gdi "GetCurrentPositionEx") (cHDC, cStar cPoint) (successState "GetCurrentPositionEx") val getViewportExtEx = winCall2(gdi "GetViewportExtEx") (cHDC, cStar cSize) (successState "GetViewportExtEx") val getViewportOrgEx = winCall2(gdi "GetViewportOrgEx") (cHDC, cStar cPoint) (successState "GetViewportOrgEx") val getWindowExtEx = winCall2(gdi "GetWindowExtEx") (cHDC, cStar cSize) (successState "GetWindowExtEx") val getWindowOrgEx = winCall2(gdi "GetWindowOrgEx") (cHDC, cStar cPoint) (successState "GetWindowOrgEx") val getWorldTransform = winCall2(gdi "GetWorldTransform") (cHDC, cStar XFORM) (successState "GetWorldTransform") val offsetViewportOrgEx = winCall4(gdi "OffsetViewportOrgEx") (cHDC, cInt, cInt, cStar cPoint) (successState "OffsetViewportOrgEx") val offsetWindowOrgEx = winCall4(gdi "OffsetWindowOrgEx") (cHDC, cInt, cInt, cStar cPoint) (successState "OffsetWindowOrgEx") val screenToClient = winCall2(user "ScreenToClient") (cHWND, cStar cPoint) (successState "ScreenToClient") val setViewportExtEx = winCall4(gdi "SetViewportExtEx") (cHDC, cInt, cInt, cStar cSize) (successState "SetViewportExtEx") val setViewportOrgEx = winCall4(gdi "SetViewportOrgEx") (cHDC, cInt, cInt, cStar cPoint) (successState "SetViewportOrgEx") val setWindowExtEx = winCall4(gdi "SetWindowExtEx") (cHDC, cInt, cInt, cStar cSize) (successState "SetWindowExtEx") val setWindowOrgEx = winCall4(gdi "SetWindowOrgEx") (cHDC, cInt, cInt, cStar cPoint) (successState "SetWindowOrgEx") val scaleViewportExtEx = winCall6 (gdi "ScaleViewportExtEx") (cHWND,cInt,cInt,cInt,cInt,cStar cSize) (successState "ScaleViewportExtEx") val scaleWindowExtEx = winCall6 (gdi "ScaleWindowExtEx") (cHWND,cInt,cInt,cInt,cInt,cStar cSize) (successState "ScaleWindowExtEx") val zeroXFORM: XForm = { m11=0.0, m12=0.0, m21=0.0, m22=0.0, dx=0.0, dy=0.0 } val zeroPoint: POINT = { x = 0, y = 0 } val zeroSize: SIZE = { cx = 0, cy = 0 } in fun ClientToScreen(w, p) = let val r = ref p in clientToScreen(w, r); !r end and CombineTransform(a, b) = let val r = ref zeroXFORM in combineTransform(r, a, b); ! r end and GetCurrentPositionEx hdc = let val p = ref zeroPoint in getCurrentPositionEx(hdc, p); !p end and GetViewportExtEx hdc = let val s = ref zeroSize in getViewportExtEx(hdc, s); !s end and GetViewportOrgEx hdc = let val p = ref zeroPoint in getViewportOrgEx(hdc, p); !p end and GetWindowExtEx hdc = let val s = ref zeroSize in getWindowExtEx(hdc, s); !s end and GetWindowOrgEx hdc = let val p = ref zeroPoint in getWindowOrgEx(hdc, p); !p end and GetWorldTransform hdc = let val r = ref zeroXFORM in getWorldTransform(hdc, r); !r end and OffsetViewportOrgEx (hdc, x, y) = let val p = ref zeroPoint in offsetViewportOrgEx(hdc, x, y, p); !p end and OffsetWindowOrgEx (hdc, x, y) = let val p = ref zeroPoint in offsetWindowOrgEx(hdc, x, y, p); !p end and ScreenToClient(hw, p) = let val r = ref p in screenToClient(hw, r); !r end and SetViewportExtEx (hdc, x, y) = let val p = ref zeroSize in setViewportExtEx(hdc, x, y, p); !p end and SetViewportOrgEx (hdc, x, y) = let val p = ref zeroPoint in setViewportOrgEx(hdc, x, y, p); !p end and SetWindowExtEx (hdc, x, y) = let val p = ref zeroSize in setWindowExtEx(hdc, x, y, p); !p end and SetWindowOrgEx (hdc, x, y) = let val p = ref zeroPoint in setWindowOrgEx(hdc, x, y, p); !p end and ScaleViewportExtEx (h,Fraction{num=n1,denom=d1},Fraction{num=n2,denom=d2}) = let val p = ref zeroSize in scaleViewportExtEx(h,n1,d1,n2,d2,p); !p end and ScaleWindowExtEx (h,Fraction{num=n1,denom=d1},Fraction{num=n2,denom=d2}) = let val p = ref zeroSize in scaleWindowExtEx(h,n1,d1,n2,d2,p); !p end end val ModifyWorldTransform = winCall3(gdi "ModifyWorldTransform") (cHDC, cConstStar XFORM, XFORMTYPE) (successState "ModifyWorldTransform") val SetWorldTransform = winCall2(gdi "SetWorldTransform") (cHDC, cConstStar XFORM) (successState "SetWorldTransform") val GetMapMode = winCall1(gdi "GetMapMode") (cHDC) cMAPMODE val SetMapMode = winCall2(gdi "SetMapMode") (cHDC,cMAPMODE) cMAPMODE (* Should check the result is non-zero. *) val GetGraphicsMode = winCall1 (gdi "GetGraphicsMode") (cHDC) GRAPHICSMODE val SetGraphicsMode = winCall2 (gdi "SetGraphicsMode") (cHDC, GRAPHICSMODE) GRAPHICSMODE local val dPtoLP = winCall3 (gdi "DPtoLP") (cHDC,cPointer,cInt) (successState "DPtoLP") and lPtoDP = winCall3 (gdi "LPtoDP") (cHDC,cPointer,cInt) (successState "LPtoDP") (* The result is the bits added in each direction to make the mapping or is zero if there is an error. The caller is supposed to call SetLastError and check GetLastError because the result could legitimately be zero. *) and mapWindowPoints = winCall4 (user "MapWindowPoints") (cHWND,cHWND,cPointer,cInt) cInt val {load=fromPt, store=toPt, ctype={size=sizePt, ...}, ...} = breakConversion cPoint fun mapPts call pts = let val count = List.length pts open Memory infix 6 ++ val mem = malloc(Word.fromInt count * sizePt) val _ = List.foldl (fn (p,n) => (ignore(toPt(n, p)); n ++ sizePt)) mem pts val _ = call(mem, count) handle ex => (free mem; raise ex) in List.tabulate(count, fn i => fromPt(mem ++ (Word.fromInt i * sizePt))) before free mem end in fun DPtoLP(h,pts) = mapPts(fn (mem, count) => dPtoLP(h, mem, count)) pts and LPtoDP(h,pts) = mapPts(fn (mem, count) => lPtoDP(h, mem, count)) pts and MapWindowPoints (h1,h2,pts) = mapPts(fn (mem, count) => mapWindowPoints(h1, h2, mem, count)) pts end end end; polyml-5.6/mlsource/extra/Win/WinBase.sml000066400000000000000000000256471265146633400205060ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This contains the types used in the Win structure. *) structure WinBase = struct local open Foreign Base in structure Style :> sig include BIT_FLAGS val WS_BORDER : flags val WS_CAPTION : flags val WS_CHILD : flags val WS_CHILDWINDOW : flags val WS_CLIPCHILDREN : flags val WS_CLIPSIBLINGS : flags val WS_DISABLED : flags val WS_DLGFRAME : flags val WS_GROUP : flags val WS_HSCROLL : flags val WS_ICONIC : flags val WS_MAXIMIZE : flags val WS_MAXIMIZEBOX : flags val WS_MINIMIZE : flags val WS_MINIMIZEBOX : flags val WS_OVERLAPPED : flags val WS_OVERLAPPEDWINDOW : flags val WS_POPUP : flags val WS_POPUPWINDOW : flags val WS_SIZEBOX : flags val WS_SYSMENU : flags val WS_TABSTOP : flags val WS_THICKFRAME : flags val WS_TILED : flags val WS_TILEDWINDOW : flags val WS_VISIBLE : flags val WS_VSCROLL : flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) (* Window styles. *) val WS_OVERLAPPED: flags = 0wx00000000 val WS_POPUP: flags = 0wx80000000 val WS_CHILD: flags = 0wx40000000 val WS_MINIMIZE: flags = 0wx20000000 val WS_VISIBLE: flags = 0wx10000000 val WS_DISABLED: flags = 0wx08000000 val WS_CLIPSIBLINGS: flags = 0wx04000000 val WS_CLIPCHILDREN: flags = 0wx02000000 val WS_MAXIMIZE: flags = 0wx01000000 val WS_CAPTION: flags = 0wx00C00000 (* WS_BORDER | WS_DLGFRAME *) val WS_BORDER: flags = 0wx00800000 val WS_DLGFRAME: flags = 0wx00400000 val WS_VSCROLL: flags = 0wx00200000 val WS_HSCROLL: flags = 0wx00100000 val WS_SYSMENU: flags = 0wx00080000 val WS_THICKFRAME: flags = 0wx00040000 val WS_GROUP: flags = 0wx00020000 val WS_TABSTOP: flags = 0wx00010000 val WS_MINIMIZEBOX: flags = 0wx00020000 val WS_MAXIMIZEBOX: flags = 0wx00010000 val WS_TILED: flags = WS_OVERLAPPED val WS_ICONIC: flags = WS_MINIMIZE val WS_SIZEBOX: flags = WS_THICKFRAME val WS_OVERLAPPEDWINDOW = flags[WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX] val WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW val WS_POPUPWINDOW = flags[WS_POPUP, WS_BORDER, WS_SYSMENU] val WS_CHILDWINDOW = WS_CHILD val all = flags[WS_OVERLAPPED, WS_POPUP, WS_CHILD, WS_MINIMIZE, WS_VISIBLE, WS_DISABLED, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_MAXIMIZE, WS_CAPTION, WS_BORDER, WS_DLGFRAME, WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, WS_THICKFRAME, WS_GROUP, WS_TABSTOP, WS_MINIMIZEBOX, WS_MAXIMIZEBOX] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end structure ExStyle:> sig include BIT_FLAGS val WS_EX_DLGMODALFRAME: flags and WS_EX_NOPARENTNOTIFY: flags and WS_EX_TOPMOST: flags and WS_EX_ACCEPTFILES : flags and WS_EX_TRANSPARENT: flags and WS_EX_MDICHILD: flags and WS_EX_TOOLWINDOW: flags and WS_EX_WINDOWEDGE: flags and WS_EX_CLIENTEDGE: flags and WS_EX_CONTEXTHELP: flags and WS_EX_RIGHT: flags and WS_EX_LEFT: flags and WS_EX_RTLREADING: flags and WS_EX_LTRREADING: flags and WS_EX_LEFTSCROLLBAR: flags and WS_EX_RIGHTSCROLLBAR: flags and WS_EX_CONTROLPARENT: flags and WS_EX_STATICEDGE: flags and WS_EX_APPWINDOW: flags and WS_EX_OVERLAPPEDWINDOW: flags and WS_EX_PALETTEWINDOW: flags end = struct type flags = SysWord.word fun toWord f = f fun fromWord f = f val flags = List.foldl (fn (a, b) => SysWord.orb(a,b)) 0w0 fun allSet (fl1, fl2) = SysWord.andb(fl1, fl2) = fl1 fun anySet (fl1, fl2) = SysWord.andb(fl1, fl2) <> 0w0 fun clear (fl1, fl2) = SysWord.andb(SysWord.notb fl1, fl2) val WS_EX_DLGMODALFRAME = 0wx00000001 val WS_EX_NOPARENTNOTIFY = 0wx00000004 val WS_EX_TOPMOST = 0wx00000008 val WS_EX_ACCEPTFILES = 0wx00000010 val WS_EX_TRANSPARENT = 0wx00000020 val WS_EX_MDICHILD = 0wx00000040 val WS_EX_TOOLWINDOW = 0wx00000080 val WS_EX_WINDOWEDGE = 0wx00000100 val WS_EX_CLIENTEDGE = 0wx00000200 val WS_EX_CONTEXTHELP = 0wx00000400 val WS_EX_RIGHT = 0wx00001000 val WS_EX_LEFT = 0wx00000000 val WS_EX_RTLREADING = 0wx00002000 val WS_EX_LTRREADING = 0wx00000000 val WS_EX_LEFTSCROLLBAR = 0wx00004000 val WS_EX_RIGHTSCROLLBAR = 0wx00000000 val WS_EX_CONTROLPARENT = 0wx00010000 val WS_EX_STATICEDGE = 0wx00020000 val WS_EX_APPWINDOW = 0wx00040000 val WS_EX_OVERLAPPEDWINDOW = flags[WS_EX_WINDOWEDGE, WS_EX_CLIENTEDGE] val WS_EX_PALETTEWINDOW = flags[WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, WS_EX_TOPMOST] val all = flags[WS_EX_DLGMODALFRAME, WS_EX_NOPARENTNOTIFY, WS_EX_TOPMOST, WS_EX_ACCEPTFILES, WS_EX_TRANSPARENT, WS_EX_MDICHILD, WS_EX_TOOLWINDOW, WS_EX_WINDOWEDGE, WS_EX_CLIENTEDGE, WS_EX_CONTEXTHELP, WS_EX_RIGHT, WS_EX_LEFT, WS_EX_RTLREADING, WS_EX_LTRREADING, WS_EX_LEFTSCROLLBAR, WS_EX_RIGHTSCROLLBAR, WS_EX_CONTROLPARENT, WS_EX_STATICEDGE, WS_EX_APPWINDOW] val intersect = List.foldl (fn (a, b) => SysWord.andb(a,b)) all end datatype WindowPositionStyle = SWP_ASYNCWINDOWPOS | SWP_DEFERERASE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_OTHER of Word32.word local val tab = [ (SWP_NOSIZE, 0wx0001), (SWP_NOMOVE, 0wx0002), (SWP_NOZORDER, 0wx0004), (SWP_NOREDRAW, 0wx0008), (SWP_NOACTIVATE, 0wx0010), (SWP_FRAMECHANGED, 0wx0020), (* The frame changed: send WM_NCCALCSIZE *) (SWP_SHOWWINDOW, 0wx0040), (SWP_HIDEWINDOW, 0wx0080), (SWP_NOCOPYBITS, 0wx0100), (SWP_NOOWNERZORDER, 0wx0200), (* Don't do owner Z ordering *) (SWP_NOSENDCHANGING, 0wx0400), (* Don't send WM_WINDOWPOSCHANGING *) (SWP_DEFERERASE, 0wx2000), (SWP_ASYNCWINDOWPOS, 0wx4000)] (* It seems that some other bits are set although they're not defined. *) fun toWord (SWP_OTHER i) = i | toWord _ = raise Match in val cWINDOWPOSITIONSTYLE = tableSetConversion(tab, SOME(SWP_OTHER, toWord)) end (* In C the parent and menu arguments are combined in a rather odd way. *) datatype ParentType = PopupWithClassMenu (* Popup or overlapped window using class menu. *) | PopupWindow of HMENU (* Popup or overlapped window with supplied menu. *) | ChildWindow of { parent: HWND, id: int } (* Child window. *) (* This function is used whenever windows are created. *) local open Style in (* In the case of a child window the "menu" is actually an integer which identifies the child in notification messages to the parent. We silently set or clear the WS_CHILD bit depending on the argument. *) fun unpackWindowRelation(relation: ParentType, style) = case relation of PopupWithClassMenu => (hwndNull, Memory.null, toWord(clear(WS_CHILD, style))) | PopupWindow hm => (hwndNull, voidStarOfHandle hm, toWord(clear(WS_CHILD, style))) | ChildWindow{parent, id} => (parent, Memory.sysWord2VoidStar(SysWord.fromInt id), toWord(flags[WS_CHILD, style])) end end end; polyml-5.6/mlsource/extra/Win/WinSystem.sml000066400000000000000000000165431265146633400211130ustar00rootroot00000000000000(* Copyright (c) 2001, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure WinSystem : sig type SystemMetrics val SM_ARRANGE : SystemMetrics val SM_CLEANBOOT : SystemMetrics val SM_CMOUSEBUTTONS : SystemMetrics val SM_CXBORDER : SystemMetrics val SM_CXCURSOR : SystemMetrics val SM_CXDLGFRAME : SystemMetrics val SM_CXDOUBLECLK : SystemMetrics val SM_CXDRAG : SystemMetrics val SM_CXEDGE : SystemMetrics val SM_CXFIXEDFRAME : SystemMetrics val SM_CXFRAME : SystemMetrics val SM_CXFULLSCREEN : SystemMetrics val SM_CXHSCROLL : SystemMetrics val SM_CXHTHUMB : SystemMetrics val SM_CXICON : SystemMetrics val SM_CXICONSPACING : SystemMetrics val SM_CXMAXIMIZED : SystemMetrics val SM_CXMAXTRACK : SystemMetrics val SM_CXMENUCHECK : SystemMetrics val SM_CXMENUSIZE : SystemMetrics val SM_CXMIN : SystemMetrics val SM_CXMINIMIZED : SystemMetrics val SM_CXMINSPACING : SystemMetrics val SM_CXMINTRACK : SystemMetrics val SM_CXSCREEN : SystemMetrics val SM_CXSIZE : SystemMetrics val SM_CXSIZEFRAME : SystemMetrics val SM_CXSMICON : SystemMetrics val SM_CXSMSIZE : SystemMetrics val SM_CXVSCROLL : SystemMetrics val SM_CYBORDER : SystemMetrics val SM_CYCAPTION : SystemMetrics val SM_CYCURSOR : SystemMetrics val SM_CYDLGFRAME : SystemMetrics val SM_CYDOUBLECLK : SystemMetrics val SM_CYDRAG : SystemMetrics val SM_CYEDGE : SystemMetrics val SM_CYFIXEDFRAME : SystemMetrics val SM_CYFRAME : SystemMetrics val SM_CYFULLSCREEN : SystemMetrics val SM_CYHSCROLL : SystemMetrics val SM_CYICON : SystemMetrics val SM_CYICONSPACING : SystemMetrics val SM_CYKANJIWINDOW : SystemMetrics val SM_CYMAXIMIZED : SystemMetrics val SM_CYMAXTRACK : SystemMetrics val SM_CYMENU : SystemMetrics val SM_CYMENUCHECK : SystemMetrics val SM_CYMENUSIZE : SystemMetrics val SM_CYMIN : SystemMetrics val SM_CYMINIMIZED : SystemMetrics val SM_CYMINSPACING : SystemMetrics val SM_CYMINTRACK : SystemMetrics val SM_CYSCREEN : SystemMetrics val SM_CYSIZE : SystemMetrics val SM_CYSIZEFRAME : SystemMetrics val SM_CYSMCAPTION : SystemMetrics val SM_CYSMICON : SystemMetrics val SM_CYSMSIZE : SystemMetrics val SM_CYVSCROLL : SystemMetrics val SM_CYVTHUMB : SystemMetrics val SM_DBCSENABLED : SystemMetrics val SM_DEBUG : SystemMetrics val SM_MENUDROPALIGNMENT : SystemMetrics val SM_MIDEASTENABLED : SystemMetrics val SM_MOUSEPRESENT : SystemMetrics val SM_MOUSEWHEELPRESENT : SystemMetrics val SM_NETWORK : SystemMetrics val SM_PENWINDOWS : SystemMetrics val SM_RESERVED1 : SystemMetrics val SM_RESERVED2 : SystemMetrics val SM_RESERVED3 : SystemMetrics val SM_RESERVED4 : SystemMetrics val SM_SECURE : SystemMetrics val SM_SHOWSOUNDS : SystemMetrics val SM_SLOWMACHINE : SystemMetrics val SM_SWAPBUTTON : SystemMetrics val GetSystemMetrics : SystemMetrics -> int end = struct local open Foreign open Base in abstype SystemMetrics = ABS of int with val SM_CXSCREEN = ABS 0 val SM_CYSCREEN = ABS 1 val SM_CXVSCROLL = ABS 2 val SM_CYHSCROLL = ABS 3 val SM_CYCAPTION = ABS 4 val SM_CXBORDER = ABS 5 val SM_CYBORDER = ABS 6 val SM_CXDLGFRAME = ABS 7 val SM_CYDLGFRAME = ABS 8 val SM_CYVTHUMB = ABS 9 val SM_CXHTHUMB = ABS 10 val SM_CXICON = ABS 11 val SM_CYICON = ABS 12 val SM_CXCURSOR = ABS 13 val SM_CYCURSOR = ABS 14 val SM_CYMENU = ABS 15 val SM_CXFULLSCREEN = ABS 16 val SM_CYFULLSCREEN = ABS 17 val SM_CYKANJIWINDOW = ABS 18 val SM_MOUSEPRESENT = ABS 19 val SM_CYVSCROLL = ABS 20 val SM_CXHSCROLL = ABS 21 val SM_DEBUG = ABS 22 val SM_SWAPBUTTON = ABS 23 val SM_RESERVED1 = ABS 24 val SM_RESERVED2 = ABS 25 val SM_RESERVED3 = ABS 26 val SM_RESERVED4 = ABS 27 val SM_CXMIN = ABS 28 val SM_CYMIN = ABS 29 val SM_CXSIZE = ABS 30 val SM_CYSIZE = ABS 31 val SM_CXFRAME = ABS 32 val SM_CYFRAME = ABS 33 val SM_CXMINTRACK = ABS 34 val SM_CYMINTRACK = ABS 35 val SM_CXDOUBLECLK = ABS 36 val SM_CYDOUBLECLK = ABS 37 val SM_CXICONSPACING = ABS 38 val SM_CYICONSPACING = ABS 39 val SM_MENUDROPALIGNMENT = ABS 40 val SM_PENWINDOWS = ABS 41 val SM_DBCSENABLED = ABS 42 val SM_CMOUSEBUTTONS = ABS 43 val SM_SECURE = ABS 44 val SM_CXEDGE = ABS 45 val SM_CYEDGE = ABS 46 val SM_CXMINSPACING = ABS 47 val SM_CYMINSPACING = ABS 48 val SM_CXSMICON = ABS 49 val SM_CYSMICON = ABS 50 val SM_CYSMCAPTION = ABS 51 val SM_CXSMSIZE = ABS 52 val SM_CYSMSIZE = ABS 53 val SM_CXMENUSIZE = ABS 54 val SM_CYMENUSIZE = ABS 55 val SM_ARRANGE = ABS 56 val SM_CXMINIMIZED = ABS 57 val SM_CYMINIMIZED = ABS 58 val SM_CXMAXTRACK = ABS 59 val SM_CYMAXTRACK = ABS 60 val SM_CXMAXIMIZED = ABS 61 val SM_CYMAXIMIZED = ABS 62 val SM_NETWORK = ABS 63 val SM_CLEANBOOT = ABS 67 val SM_CXDRAG = ABS 68 val SM_CYDRAG = ABS 69 val SM_SHOWSOUNDS = ABS 70 val SM_CXMENUCHECK = ABS 71 val SM_CYMENUCHECK = ABS 72 val SM_SLOWMACHINE = ABS 73 val SM_MIDEASTENABLED = ABS 74 val SM_MOUSEWHEELPRESENT = ABS 75 val SM_CXFIXEDFRAME = SM_CXDLGFRAME val SM_CYFIXEDFRAME = SM_CYDLGFRAME val SM_CXSIZEFRAME = SM_CXFRAME val SM_CYSIZEFRAME = SM_CYFRAME local val getSystemMetrics = winCall1 (user "GetSystemMetrics") (cInt) cInt in fun GetSystemMetrics(ABS i) = getSystemMetrics i end end end end; polyml-5.6/mlsource/extra/Win/Window.sml000066400000000000000000000521251265146633400204140ustar00rootroot00000000000000(* Copyright (c) 2001-7, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure Window : sig type HWND and HINSTANCE and HMENU type POINT = { x: int, y: int } type RECT = { left: int, top: int, right: int, bottom: int } structure Style: sig include BIT_FLAGS val WS_OVERLAPPED: flags and WS_POPUP: flags and WS_CHILD: flags and WS_MINIMIZE: flags and WS_VISIBLE: flags and WS_DISABLED:flags and WS_CLIPSIBLINGS:flags and WS_CLIPCHILDREN:flags and WS_MAXIMIZE:flags and WS_CAPTION:flags and WS_BORDER:flags and WS_DLGFRAME:flags and WS_VSCROLL:flags and WS_HSCROLL:flags and WS_SYSMENU:flags and WS_THICKFRAME:flags and WS_GROUP:flags and WS_TABSTOP:flags and WS_MINIMIZEBOX:flags and WS_MAXIMIZEBOX:flags and WS_TILED:flags and WS_ICONIC:flags and WS_SIZEBOX:flags and WS_OVERLAPPEDWINDOW:flags and WS_TILEDWINDOW:flags and WS_POPUPWINDOW:flags and WS_CHILDWINDOW:flags end structure ExStyle: sig include BIT_FLAGS val WS_EX_DLGMODALFRAME: flags and WS_EX_NOPARENTNOTIFY: flags and WS_EX_TOPMOST: flags and WS_EX_ACCEPTFILES : flags and WS_EX_TRANSPARENT: flags and WS_EX_MDICHILD: flags and WS_EX_TOOLWINDOW: flags and WS_EX_WINDOWEDGE: flags and WS_EX_CLIENTEDGE: flags and WS_EX_CONTEXTHELP: flags and WS_EX_RIGHT: flags and WS_EX_LEFT: flags and WS_EX_RTLREADING: flags and WS_EX_LTRREADING: flags and WS_EX_LEFTSCROLLBAR: flags and WS_EX_RIGHTSCROLLBAR: flags and WS_EX_CONTROLPARENT: flags and WS_EX_STATICEDGE: flags and WS_EX_APPWINDOW: flags and WS_EX_OVERLAPPEDWINDOW: flags and WS_EX_PALETTEWINDOW: flags end datatype WindowPositionStyle = SWP_ASYNCWINDOWPOS | SWP_DEFERERASE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW | SWP_OTHER of Word32.word datatype ShowWindowOptions = SW_HIDE | SW_MAXIMIZE | SW_MINIMIZE | SW_RESTORE | SW_SHOW | SW_SHOWDEFAULT | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_SHOWMINNOACTIVE | SW_SHOWNA | SW_SHOWNOACTIVATE | SW_SHOWNORMAL val SW_NORMAL: ShowWindowOptions val SW_MAX: ShowWindowOptions val ShowWindow: HWND * ShowWindowOptions -> bool datatype GetWindowFlags = GW_CHILD | GW_HWNDFIRST | GW_HWNDLAST | GW_HWNDNEXT | GW_HWNDPREV | GW_OWNER datatype ParentType = ChildWindow of {id: int, parent: HWND} | PopupWindow of HMENU | PopupWithClassMenu val GWL_EXSTYLE : int val GWL_HINSTANCE : int val GWL_HWNDPARENT : int val GWL_ID : int val GWL_STYLE : int val GWL_USERDATA : int val AdjustWindowRect : RECT * Style.flags * bool -> RECT val AdjustWindowRectEx : RECT * Style.flags * bool * int -> RECT val ArrangeIconicWindows : HWND -> int val BringWindowToTop : HWND -> unit val CW_USEDEFAULT : int val ChildWindowFromPoint : HWND * POINT -> HWND option val CloseWindow : HWND -> unit val CreateWindow : {x: int, y: int, init: 'a, name: string, class: 'a Class.ATOM, style: Style.flags, width: int, height: int, instance: HINSTANCE, relation: ParentType} -> HWND val CreateWindowEx : {x: int, y: int, init: 'a, name: string, class: 'a Class.ATOM, style: Style.flags, width: int, height: int, instance: HINSTANCE, relation: ParentType, exStyle: ExStyle.flags} -> HWND val CreateMDIClient: { relation: ParentType, style: Style.flags, instance: HINSTANCE, windowMenu: HMENU, idFirstChild: int} -> HWND val DefWindowProc: HWND * Message.Message -> Message.LRESULT val DefFrameProc: HWND * HWND * Message.Message -> Message.LRESULT val DefMDIChildProc: HWND * Message.Message -> Message.LRESULT val DestroyWindow: HWND -> unit val FindWindow: string option * string option -> HWND val FindWindowEx: HWND option * HWND option * string option * string option -> HWND val GetClassName : HWND -> string val GetClientRect : HWND -> RECT val GetDesktopWindow : unit -> HWND val GetForegroundWindow : unit -> HWND val GetLastActivePopup : HWND -> HWND val GetNextWindow : HWND * GetWindowFlags -> HWND val GetParent : HWND -> HWND option val GetTopWindow : HWND option -> HWND option val GetWindow : HWND * GetWindowFlags -> HWND option val GetWindowContextHelpId : HWND -> int val GetWindowLongPtr : HWND * int -> int val GetWindowRect : HWND -> RECT val GetWindowText : HWND -> string val GetWindowTextLength : HWND -> int val IsChild : HWND * HWND -> bool val IsIconic : HWND -> bool val IsWindow : HWND -> bool val IsWindowVisible : HWND -> bool val IsZoomed : HWND -> bool val MoveWindow : {x: int, y: int, hWnd: HWND, width: int, height: int, repaint: bool} -> unit val OpenIcon : HWND -> unit val SetForegroundWindow : HWND -> bool val SetParent : HWND * HWND option -> HWND val SetWindowContextHelpId : HWND * int -> unit val SetWindowLongPtr : HWND * int * int -> int val SetWindowPos : HWND * HWND * int * int * int * int * WindowPositionStyle list -> unit val SetWindowText : HWND * string -> unit val SubclassWindow : HWND * (HWND * Message.Message * 'a -> Message.LRESULT * 'a) * 'a -> (HWND * Message.Message) -> Message.LRESULT val WindowFromPoint : POINT -> HWND option end = struct local open Foreign open Globals open Base open Resource open Class fun checkWindow c = (checkResult(not(isHNull c)); c) in type HWND = HWND and HINSTANCE = HINSTANCE and RECT = RECT and POINT = POINT and HMENU = HMENU open WinBase (* Get Style and SetWindowPositionStyle *) datatype ShowWindowOptions = SW_HIDE | SW_MAXIMIZE | SW_MINIMIZE | SW_RESTORE | SW_SHOW | SW_SHOWDEFAULT | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_SHOWMINNOACTIVE | SW_SHOWNA | SW_SHOWNOACTIVATE | SW_SHOWNORMAL val SW_NORMAL = SW_SHOWNORMAL val SW_MAX = SW_SHOWDEFAULT local val showWindow = winCall2 (user "ShowWindow")(cHWND,cInt) (cBool) in fun ShowWindow (win, opt) = let val cmd = case opt of SW_HIDE => 0 | SW_SHOWNORMAL => 1 | SW_SHOWMINIMIZED => 2 | SW_SHOWMAXIMIZED => 3 | SW_MAXIMIZE => 3 | SW_SHOWNOACTIVATE => 4 | SW_SHOW => 5 | SW_MINIMIZE => 6 | SW_SHOWMINNOACTIVE => 7 | SW_SHOWNA => 8 | SW_RESTORE => 9 | SW_SHOWDEFAULT => 10 in showWindow (win, cmd) end end val CloseWindow = winCall1 (user "CloseWindow") (cHWND) (successState "CloseWindow") val FindWindow = checkWindow o winCall2 (user "FindWindowA") (STRINGOPT, STRINGOPT) cHWND val FindWindowEx = checkWindow o winCall4 (user "FindWindowExA") (cHWNDOPT, cHWNDOPT, STRINGOPT, STRINGOPT) cHWND val GetDesktopWindow = winCall0 (user "GetDesktopWindow") () cHWND val GetForegroundWindow = winCall0 (user "GetForegroundWindow") () cHWND val GetLastActivePopup = winCall1 (user "GetLastActivePopup") cHWND cHWND val GetParent = winCall1 (user "GetParent") cHWND cHWNDOPT val GetTopWindow = winCall1 (user "GetTopWindow") cHWNDOPT cHWNDOPT val GetWindowTextLength = winCall1 (user "GetWindowTextLengthA") cHWND cInt val SetWindowText = winCall2 (user "SetWindowTextA") (cHWND, cString) (successState "SetWindowText") local val getTextCall = winCall3 (user "GetWindowTextA") (cHWND, cPointer, cInt) cInt in fun GetWindowText(hwnd: HWND): string = let val baseLen = GetWindowTextLength hwnd (* The length returned by GetWindowTextLength may be larger than the text but we have to add one for the terminating null. *) open Memory val buff = malloc (Word.fromInt(baseLen+1)) val size = getTextCall(hwnd, buff, baseLen+1) in (if size = 0 then "" else fromCstring buff) before free buff end end (* Get the class name of a window. *) local val getClassName = winCall3 (user "GetClassNameA") (cHWND, cPointer, cInt) cInt in (* Unfortunately we can't pass NULL here to get the length. *) fun GetClassName hwnd = getStringCall(fn (v, i) => getClassName(hwnd, v, i)) end datatype GetWindowFlags = GW_CHILD | GW_HWNDFIRST | GW_HWNDLAST | GW_HWNDNEXT | GW_HWNDPREV | GW_OWNER local fun winFlag GW_HWNDFIRST = 0 | winFlag GW_HWNDLAST = 1 | winFlag GW_HWNDNEXT = 2 | winFlag GW_HWNDPREV = 3 | winFlag GW_OWNER = 4 | winFlag GW_CHILD = 5 val getWindow = winCall2 (user "GetWindow") (cHWND, cUint) cHWNDOPT val getNextWindow = winCall2 (user "GetNextWindow") (cHWND,cUint) cHWND in fun GetWindow (win, gwFlag) = getWindow (win, winFlag gwFlag) (* Only GW_HWNDNEXT and GW_HWNDPREV are allowed here but it's probably not worth making it a special case. *) fun GetNextWindow(win: HWND, gwFlag) = checkWindow (getNextWindow (win, winFlag gwFlag)) end val IsChild = winCall2 (user "IsChild") (cHWND,cHWND) cBool val IsIconic = winCall1 (user "IsIconic") (cHWND) cBool val IsWindow = winCall1 (user "IsWindow") (cHWND) cBool val IsWindowVisible = winCall1 (user "IsWindowVisible") (cHWND) cBool val IsZoomed = winCall1 (user "IsZoomed") (cHWND) cBool local val getClientRect = winCall2 (user "GetClientRect") (cHWND, cStar cRect) cBool and getWindowRect = winCall2 (user "GetWindowRect") (cHWND, cStar cRect) cBool and adjustWindowRect = winCall3 (user "AdjustWindowRect") (cStar cRect, cDWORD, cBool) cBool and adjustWindowRectEx = winCall4 (user "AdjustWindowRectEx") (cStar cRect, cDWORD, cBool, cDWORD) cBool in fun GetClientRect(hWnd: HWND): RECT = let val v = ref{bottom=0, top=0, left=0, right=0} val res = getClientRect (hWnd, v) in checkResult res; !v end fun GetWindowRect(hWnd: HWND): RECT = let val v = ref{bottom=0, top=0, left=0, right=0} val res = getWindowRect (hWnd, v) in checkResult res; !v end fun AdjustWindowRect(rect: RECT, style: Style.flags, bMenu: bool): RECT = let val v = ref rect val res = adjustWindowRect(v, LargeWord.toInt(Style.toWord style), bMenu) in checkResult res; !v end fun AdjustWindowRectEx(rect: RECT, style: Style.flags, bMenu: bool, exStyle: int): RECT = let val v = ref rect val res = adjustWindowRectEx(v, LargeWord.toInt(Style.toWord style), bMenu, exStyle) in checkResult res; !v end end val ArrangeIconicWindows = winCall1 (user "ArrangeIconicWindows") (cHWND) cUint val BringWindowToTop = winCall1 (user "BringWindowToTop") (cHWND) (successState "BringWindowToTop") val OpenIcon = winCall1 (user "OpenIcon") (cHWND) (successState "OpenIcon") val SetForegroundWindow = winCall1 (user "SetForegroundWindow") (cHWND) cBool local val setParent = winCall2 (user "SetParent") (cHWND, cHWND) cHWND in fun SetParent(child: HWND, new: HWND option): HWND = let val old = setParent(child, getOpt(new, hwndNull)) in checkResult(not(isHNull old)); old end end local val createWindowEx = winCall12 (user "CreateWindowExA") (cDWORD, cString, cString, cDWORD, cInt, cInt, cInt, cInt, cHWND, cPointer, cHINSTANCE, cPointer) cHWND in fun CreateWindowEx{class: 'a Class.ATOM, (* Window class *) name: string, (* Window name *) style: Style.flags, (* window style *) exStyle: ExStyle.flags, (* extended style *) x: int, (* horizontal position of window *) y: int, (* vertical position of window *) width: int, (* window width *) height: int, (* window height *) relation: ParentType, (* parent or owner window *) instance: HINSTANCE, (* application instance *) init: 'a}: HWND = let (* Set up a winCallback for ML classes and return the class name. *) val className: string = case class of Registered { proc, className} => (Message.setCallback(proc, init); className) | SystemClass s => s val (parent, menu, styleWord) = WinBase.unpackWindowRelation(relation, style) (* Create a window. *) val res = createWindowEx (LargeWord.toInt(ExStyle.toWord exStyle), className, name, LargeWord.toInt styleWord, x, y, width, height, parent, menu, instance, Memory.null) in checkResult(not(isHNull res)); res end end fun CreateWindow{class: 'a Class.ATOM, name: string, style: Style.flags, x: int, y: int, width: int, height: int, relation: ParentType, instance: HINSTANCE, init: 'a}: HWND = CreateWindowEx{exStyle=ExStyle.flags[], class=class, name=name, style=style, x=x, y=y, width=width, height=height,relation=relation, instance=instance, init=init} local val cCLIENTCREATESTRUCT = cStruct2(cHMENU, cUint) val createMDIClient = winCall12 (user "CreateWindowExA") (cDWORD, cString, cPointer, cDWORD, cInt, cInt, cInt, cInt, cHWND, cPointer, cHINSTANCE, cConstStar cCLIENTCREATESTRUCT) cHWND in fun CreateMDIClient{ relation: ParentType, (* This should always be ChildWindow *) style: Style.flags, instance: HINSTANCE, (* application instance *) windowMenu: HMENU, (* Window menu to which children are added. *) idFirstChild: int (* Id of first child when it's created. *) }: HWND = let val (parent, menu, styleWord) = unpackWindowRelation(relation, style) val createS = (windowMenu, idFirstChild) val res = createMDIClient (0, "MDICLIENT", Memory.null, LargeWord.toInt styleWord, 0, 0, 0, 0, parent, menu, instance, createS) in checkResult(not(isHNull res)); res end end local val defWindowProc = winCall4 (user "DefWindowProcA") (cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw and defFrameProc = winCall5 (user "DefFrameProcA") (cHWND, cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw and defMDIChildProc = winCall4 (user "DefMDIChildProcA") (cHWND, cUint, cUINT_PTRw, cUINT_PTRw) cUINT_PTRw in fun DefWindowProc (hWnd: HWND, msg: Message.Message): Message.LRESULT = let val (wMsg, wParam, lParam, freeMsg) = Message.compileMessage msg val res = defWindowProc(hWnd, wMsg, wParam, lParam) in Message.messageReturnFromParams(msg, wParam, lParam, res) before freeMsg() end fun DefFrameProc (hWnd: HWND, hWndMDIClient: HWND, msg: Message.Message): Message.LRESULT = let val (wMsg, wParam, lParam, freeMsg) = Message.compileMessage msg val res = defFrameProc(hWnd, hWndMDIClient, wMsg, wParam, lParam) in (* Write back any changes the function has made. *) Message.messageReturnFromParams(msg, wParam, lParam, res) before freeMsg() end fun DefMDIChildProc (hWnd: HWND, msg: Message.Message): Message.LRESULT = let val (wMsg, wParam, lParam, freeMsg) = Message.compileMessage msg val res = defMDIChildProc(hWnd, wMsg, wParam, lParam) in Message.messageReturnFromParams(msg, wParam, lParam, res) before freeMsg() end end val CW_USEDEFAULT = ~0x80000000 (* Default value for size and/ot position. *) local val destroyWindow = winCall1 (user "DestroyWindow") (cHWND) (successState "DestroyWindow") in fun DestroyWindow(hWnd: HWND) = ( destroyWindow hWnd; Message.removeCallback hWnd ) end (*val GWL_WNDPROC = ~4*) val GWL_HINSTANCE = ~6 val GWL_HWNDPARENT = ~8 val GWL_STYLE = ~16 val GWL_EXSTYLE = ~20 val GWL_USERDATA = ~21 val GWL_ID = ~12 val GetWindowLongPtr = winCall2 (user "GetWindowLongPtrA") (cHWND, cInt) cLONG_PTR (* SetWindowLong is a dangerous function to export. *) val SetWindowLongPtr = winCall3 (user "SetWindowLongPtrA") (cHWND, cInt, cLONG_PTR) cLONG_PTR (* ML extension. This replaces the GetWindowLong and SetWindowLong calls. *) val SubclassWindow = Message.subclass local val moveWindow = winCall6(user "MoveWindow") (cHWND,cInt,cInt,cInt,cInt,cBool) (successState "MoveWindow") in fun MoveWindow{hWnd: HWND, x: int, y: int, height: int, width: int, repaint: bool} = moveWindow(hWnd, x, y, width, height, repaint) end val SetWindowPos = winCall7 (user "SetWindowPos") (cHWND, cHWND, cInt, cInt, cInt, cInt, cWINDOWPOSITIONSTYLE) (successState "SetWindowPos") val SetWindowContextHelpId = winCall2 (user "SetWindowContextHelpId") (cHWND, cDWORD) (successState "SetWindowContextHelpId") val GetWindowContextHelpId = winCall1 (user "GetWindowContextHelpId") (cHWND) cDWORD val ChildWindowFromPoint = winCall2 (user "ChildWindowFromPoint") (cHWND, cPoint) cHWNDOPT and WindowFromPoint = winCall1 (user "WindowFromPoint") (cPoint) cHWNDOPT (* TODO: AnimateWindow - Only Win98/NT 5.0 BeginDeferWindowPos CascadeWindows ChildWindowFromPointEx DeferWindowPos EndDeferWindowPos EnumChildProc EnumChildWindows EnumThreadWindows EnumThreadWndProc EnumWindows EnumWindowsProc GetWindowPlacement GetWindowThreadProcessId IsWindowUnicode SetWindowPlacement ShowOwnedPopups ShowWindowAsync TileWindows *) end end; (* Because we're using opaque matching we have to install pretty printers outside the structure. *) local open Window.Style val flagTable = [(WS_POPUP, "WS_POPUP"), (WS_CHILD, "WS_CHILD"), (WS_MINIMIZE, "WS_MINIMIZE"), (WS_VISIBLE, "WS_VISIBLE"), (WS_DISABLED, "WS_DISABLED"), (WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS"), (WS_CLIPCHILDREN, "WS_CLIPCHILDREN"), (WS_MAXIMIZE, "WS_MAXIMIZE"), (WS_CAPTION, "WS_CAPTION"), (WS_BORDER, "WS_BORDER"), (WS_DLGFRAME, "WS_DLGFRAME"), (WS_VSCROLL, "WS_VSCROLL"), (WS_HSCROLL, "WS_HSCROLL"), (WS_SYSMENU, "WS_SYSMENU"), (WS_THICKFRAME, "WS_THICKFRAME"), (WS_GROUP, "WS_GROUP"), (WS_TABSTOP, "WS_TABSTOP"), (WS_MINIMIZEBOX, "WS_MINIMIZEBOX"), (WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX")] structure FlagP = FlagPrint(structure BITS = Window.Style) in val _ = PolyML.addPrettyPrinter (FlagP.createFlagPrinter flagTable) end; polyml-5.6/mlsource/extra/Win/Windows.pyp000066400000000000000000000020251265146633400206060ustar00rootroot00000000000000[Files] NFiles=53 File0=ROOT.sml Root=ROOT.sml File1=Base.sml File2=Bitmap.sml File3=Brush.sml File4=Button.sml File5=Caret.sml File6=Class.sml File7=Clipboard.sml File8=Clipping.sml File9=Color.sml File10=ComboBase.sml File11=Combobox.sml File12=CommonControls.sml File13=CommonDialog.sml File14=Cursor.sml File15=DeviceBase.sml File16=DeviceContext.sml File17=Dialog.sml File18=DragDrop.sml File19=Edit.sml File20=FlagPrint.sml File21=Font.sml File22=FontBase.sml File23=GdiBase.sml File24=Globals.sml File25=Icon.sml File26=Keyboard.sml File27=Line.sml File28=Listbox.sml File29=Locale.sml File30=LocaleBase.sml File31=Menu.sml File32=MenuBase.sml File33=Message.sml File34=MessageBox.sml File35=Metafile.sml File36=Mouse.sml File37=Painting.sml File38=Path.sml File39=Pen.sml File40=Printing.sml File41=Rectangle.sml File42=Region.sml File43=Resource.sml File44=Scrollbar.sml File45=ScrollBase.sml File46=Shape.sml File47=Static.sml File48=Transform.sml File49=WinBase.sml File50=Window.sml File51=WinSystem.sml File52=MESSAGE.signature.sml polyml-5.6/mlsource/extra/Win/clean.sml000066400000000000000000000022051265146633400202210ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Clean up the name space by removing unnecessary declarations. *) val _ = List.app PolyML.Compiler.forgetStructure [ "Base", "ComboBase", "FontBase", "MenuBase", "ScrollBase", "WinBase", "MessageBase", "GdiBase", "DeviceBase", "LocaleBase" ]; val _ = List.app PolyML.Compiler.forgetFunctor ["FlagPrint"]; polyml-5.6/mlsource/extra/Win/ml_bind.sml000066400000000000000000000032161265146633400205460ustar00rootroot00000000000000(* Copyright (c) 2001-7 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Build everything. *) local structure d = Dialog structure g = Globals structure c = Cursor structure i = Icon structure m = Menu structure cl = Class structure e = Edit structure w = Window structure o = CommonDialog structure b = MessageBox structure t = Caret structure cb = Clipboard structure mf = Metafile structure r = Rectangle structure t = Transform structure p = Printing structure p = Path (* Includes Line *) structure d = DeviceContext (* Includes Pen, Font, Brush, Color *) structure p = Painting structure s = Shape structure l = Line structure b = Bitmap structure c = Clipping structure dd = DragDrop structure k = Keyboard structure m = Mouse structure ws = WinSystem structure lo = Locale structure cc = CommonControls in end; polyml-5.6/mlsource/extra/XWindows/000077500000000000000000000000001265146633400174505ustar00rootroot00000000000000polyml-5.6/mlsource/extra/XWindows/XATOMS_SIG.ML000066400000000000000000000064521265146633400214260ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XATOMS_SIG = sig val XA_PRIMARY: int ; val XA_SECONDARY: int ; val XA_ARC: int ; val XA_ATOM: int ; val XA_BITMAP: int ; val XA_CARDINAL: int ; val XA_COLORMAP: int ; val XA_CURSOR: int ; val XA_CUT_BUFFER0: int ; val XA_CUT_BUFFER1: int ; val XA_CUT_BUFFER2: int ; val XA_CUT_BUFFER3: int ; val XA_CUT_BUFFER4: int ; val XA_CUT_BUFFER5: int ; val XA_CUT_BUFFER6: int ; val XA_CUT_BUFFER7: int ; val XA_DRAWABLE: int ; val XA_FONT: int ; val XA_INTEGER: int ; val XA_PIXMAP: int ; val XA_POINT: int ; val XA_RECTANGLE: int ; val XA_RESOURCE_MANAGER: int ; val XA_RGB_COLOR_MAP: int ; val XA_RGB_BEST_MAP: int ; val XA_RGB_BLUE_MAP: int ; val XA_RGB_DEFAULT_MAP: int ; val XA_RGB_GRAY_MAP: int ; val XA_RGB_GREEN_MAP: int ; val XA_RGB_RED_MAP: int ; val XA_STRING: int ; val XA_VISUALID: int ; val XA_WINDOW: int ; val XA_WM_COMMAND: int ; val XA_WM_HINTS: int ; val XA_WM_CLIENT_MACHINE: int ; val XA_WM_ICON_NAME: int ; val XA_WM_ICON_SIZE: int ; val XA_WM_NAME: int ; val XA_WM_NORMAL_HINTS: int ; val XA_WM_SIZE_HINTS: int ; val XA_MIN_SPACE: int ; val XA_NORM_SPACE: int ; val XA_MAX_SPACE: int ; val XA_END_SPACE: int ; val XA_SUPERSCRIPT_X: int ; val XA_SUPERSCRIPT_Y: int ; val XA_SUBSCRIPT_X: int ; val XA_SUBSCRIPT_Y: int ; val XA_UNDERLINE_POSITION: int ; val XA_UNDERLINE_THICKNESS: int ; val XA_STRIKEOUT_ASCENT: int ; val XA_STRIKEOUT_DESCENT: int ; val XA_ITALIC_ANGLE: int ; val XA_X_HEIGHT: int ; val XA_QUAD_WIDTH: int ; val XA_WEIGHT: int ; val XA_POINT_SIZE: int ; val XA_RESOLUTION: int ; val XA_COPYRIGHT: int ; val XA_NOTICE: int ; val XA_FONT_NAME: int ; val XA_FAMILY_NAME: int ; val XA_FULL_NAME: int ; val XA_CAP_HEIGHT: int ; val XA_WM_CLASS: int ; val XA_WM_TRANSIENT_FOR: int ; end (* XATOMS_SIG *) ; polyml-5.6/mlsource/extra/XWindows/XAtoms.ML000066400000000000000000000064501265146633400211220ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XAtoms: XATOMS_SIG = struct val XA_PRIMARY = 1 ; val XA_SECONDARY = 2 ; val XA_ARC = 3 ; val XA_ATOM = 4 ; val XA_BITMAP = 5 ; val XA_CARDINAL = 6 ; val XA_COLORMAP = 7 ; val XA_CURSOR = 8 ; val XA_CUT_BUFFER0 = 9 ; val XA_CUT_BUFFER1 = 10 ; val XA_CUT_BUFFER2 = 11 ; val XA_CUT_BUFFER3 = 12 ; val XA_CUT_BUFFER4 = 13 ; val XA_CUT_BUFFER5 = 14 ; val XA_CUT_BUFFER6 = 15 ; val XA_CUT_BUFFER7 = 16 ; val XA_DRAWABLE = 17 ; val XA_FONT = 18 ; val XA_INTEGER = 19 ; val XA_PIXMAP = 20 ; val XA_POINT = 21 ; val XA_RECTANGLE = 22 ; val XA_RESOURCE_MANAGER = 23 ; val XA_RGB_COLOR_MAP = 24 ; val XA_RGB_BEST_MAP = 25 ; val XA_RGB_BLUE_MAP = 26 ; val XA_RGB_DEFAULT_MAP = 27 ; val XA_RGB_GRAY_MAP = 28 ; val XA_RGB_GREEN_MAP = 29 ; val XA_RGB_RED_MAP = 30 ; val XA_STRING = 31 ; val XA_VISUALID = 32 ; val XA_WINDOW = 33 ; val XA_WM_COMMAND = 34 ; val XA_WM_HINTS = 35 ; val XA_WM_CLIENT_MACHINE = 36 ; val XA_WM_ICON_NAME = 37 ; val XA_WM_ICON_SIZE = 38 ; val XA_WM_NAME = 39 ; val XA_WM_NORMAL_HINTS = 40 ; val XA_WM_SIZE_HINTS = 41 ; val XA_MIN_SPACE = 43 ; val XA_NORM_SPACE = 44 ; val XA_MAX_SPACE = 45 ; val XA_END_SPACE = 46 ; val XA_SUPERSCRIPT_X = 47 ; val XA_SUPERSCRIPT_Y = 48 ; val XA_SUBSCRIPT_X = 49 ; val XA_SUBSCRIPT_Y = 50 ; val XA_UNDERLINE_POSITION = 51 ; val XA_UNDERLINE_THICKNESS = 52 ; val XA_STRIKEOUT_ASCENT = 53 ; val XA_STRIKEOUT_DESCENT = 54 ; val XA_ITALIC_ANGLE = 55 ; val XA_X_HEIGHT = 56 ; val XA_QUAD_WIDTH = 57 ; val XA_WEIGHT = 58 ; val XA_POINT_SIZE = 59 ; val XA_RESOLUTION = 60 ; val XA_COPYRIGHT = 61 ; val XA_NOTICE = 62 ; val XA_FONT_NAME = 63 ; val XA_FAMILY_NAME = 64 ; val XA_FULL_NAME = 65 ; val XA_CAP_HEIGHT = 66 ; val XA_WM_CLASS = 67 ; val XA_WM_TRANSIENT_FOR = 68 ; end (* XAtoms *) ; polyml-5.6/mlsource/extra/XWindows/XCURSORS_SIG.ML000066400000000000000000000071701265146633400217010ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XCURSORS_SIG = sig val XC_num_glyphs: int ; val XC_X_cursor: int ; val XC_arrow: int ; val XC_based_arrow_down: int ; val XC_based_arrow_up: int ; val XC_boat: int ; val XC_bogosity: int ; val XC_bottom_left_corner: int ; val XC_bottom_right_corner: int ; val XC_bottom_side: int ; val XC_bottom_tee: int ; val XC_box_spiral: int ; val XC_center_ptr: int ; val XC_circle: int ; val XC_clock: int ; val XC_coffee_mug: int ; val XC_cross: int ; val XC_cross_reverse: int ; val XC_crosshair: int ; val XC_diamond_cross: int ; val XC_dot: int ; val XC_dotbox: int ; val XC_double_arrow: int ; val XC_draft_large: int ; val XC_draft_small: int ; val XC_draped_box: int ; val XC_exchange: int ; val XC_fleur: int ; val XC_gobbler: int ; val XC_gumby: int ; val XC_hand1: int ; val XC_hand2: int ; val XC_heart: int ; val XC_icon: int ; val XC_iron_cross: int ; val XC_left_ptr: int ; val XC_left_side: int ; val XC_left_tee: int ; val XC_leftbutton: int ; val XC_ll_angle: int ; val XC_lr_angle: int ; val XC_man: int ; val XC_middlebutton: int ; val XC_mouse: int ; val XC_pencil: int ; val XC_pirate: int ; val XC_plus: int ; val XC_question_arrow: int ; val XC_right_ptr: int ; val XC_right_side: int ; val XC_right_tee: int ; val XC_rightbutton: int ; val XC_rtl_logo: int ; val XC_sailboat: int ; val XC_sb_down_arrow: int ; val XC_sb_h_double_arrow: int ; val XC_sb_left_arrow: int ; val XC_sb_right_arrow: int ; val XC_sb_up_arrow: int ; val XC_sb_v_double_arrow: int ; val XC_shuttle: int ; val XC_sizing: int ; val XC_spider: int ; val XC_spraycan: int ; val XC_star: int ; val XC_target: int ; val XC_tcross: int ; val XC_top_left_arrow: int ; val XC_top_left_corner: int ; val XC_top_right_corner: int ; val XC_top_side: int ; val XC_top_tee: int ; val XC_trek: int ; val XC_ul_angle: int ; val XC_umbrella: int ; val XC_ur_angle: int ; val XC_watch: int ; val XC_xterm: int ; end (* XCURSORS_SIG *) ; polyml-5.6/mlsource/extra/XWindows/XCall.ML000066400000000000000000000542201265146633400207100ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XCall = struct exception XWindows = RunCall.XWindows; fun xcall n = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows n (* The following XCALL numbers should match those in xcall_numbers.h *) (* in the Poly/ML run-time system. *) val XCALL_Not = 10; val XCALL_And = 11; val XCALL_Or = 12; val XCALL_Xor = 13; val XCALL_DownShift = 14; val XCALL_UpShift = 15; val XCALL_NoDrawable = 20; val XCALL_NoCursor = 21; val XCALL_NoFont = 22; val XCALL_NoColormap = 23; val XCALL_NoVisual = 24; val XCALL_GetTimeOfDay = 30; (* Colorcells 100 *) val XCALL_XAllocColor = 103; val XCALL_XAllocColorCells = 104; val XCALL_XAllocColorPlanes = 105; val XCALL_XAllocNamedColor = 106; val XCALL_XFreeColors = 107; val XCALL_XLookupColor = 108; val XCALL_XParseColor = 109; val XCALL_XQueryColor = 110; val XCALL_XQueryColors = 111; val XCALL_XStoreColor = 112; val XCALL_XStoreColors = 113; val XCALL_XStoreNamedColor = 114; val XCALL_BlackPixel = 115; val XCALL_WhitePixel = 116; (* Colormaps 150 *) val XCALL_XCopyColormapAndFree = 150; val XCALL_XCreateColormap = 151; val XCALL_XInstallColormap = 154; val XCALL_XListInstalledColormaps = 155; val XCALL_XUninstallColormap = 158; val XCALL_DefaultColormap = 159; val XCALL_DefaultVisual = 160; val XCALL_DisplayCells = 161; val XCALL_VisualClass = 162; val XCALL_VisualRedMask = 163; val XCALL_VisualGreenMask = 164; val XCALL_VisualBlueMask = 165; (* Cursors 200 *) val XCALL_XCreateFontCursor = 200; val XCALL_XCreateGlyphCursor = 201; val XCALL_XCreatePixmapCursor = 202; val XCALL_XDefineCursor = 203; val XCALL_XQueryBestCursor = 205; val XCALL_XRecolorCursor = 206; val XCALL_XUndefineCursor = 207; val XCALL_XOpenDisplay = 222; (* Display Specifications 250 *) val XCALL_CellsOfScreen = 250; val XCALL_DefaultDepth = 251; val XCALL_DisplayHeight = 252; val XCALL_DisplayHeightMM = 253; val XCALL_DisplayPlanes = 254; val XCALL_DisplayString = 255; val XCALL_DisplayWidth = 256; val XCALL_DisplayWidthMM = 257; val XCALL_DoesBackingStore = 258; val XCALL_DoesSaveUnders = 259; val XCALL_EventMaskOfScreen = 260; val XCALL_MaxCmapsOfScreen = 261; val XCALL_MinCmapsOfScreen = 262; val XCALL_ProtocolRevision = 263; val XCALL_ProtocolVersion = 264; val XCALL_ServerVendor = 265; val XCALL_VendorRelease = 266; (* Drawing Primitives 300 *) val XCALL_XClearArea = 300; val XCALL_XClearWindow = 301; val XCALL_XCopyArea = 302; val XCALL_XCopyPlane = 303; val XCALL_XDrawArc = 304; val XCALL_XDrawArcs = 305; val XCALL_XDrawImageString = 306; val XCALL_XDrawImageString16 = 307; val XCALL_XDrawLine = 308; val XCALL_XDrawLines = 309; val XCALL_XDrawPoint = 310; val XCALL_XDrawPoints = 311; val XCALL_XDrawRectangle = 312; val XCALL_XDrawRectangles = 313; val XCALL_XDrawSegments = 314; val XCALL_XDrawString = 315; val XCALL_XDrawString16 = 316; val XCALL_XDrawText = 317; val XCALL_XDrawText16 = 318; val XCALL_XFillArc = 319; val XCALL_XFillArcs = 320; val XCALL_XFillPolygon = 321; val XCALL_XFillRectangle = 322; val XCALL_XFillRectangles = 323; (* Events 350 *) val XCALL_XSelectInput = 350; val XCALL_XSynchronize = 351; val XCALL_GetState = 361; val XCALL_SetState = 362; val XCALL_NextEvent = 365; val XCALL_InsertTimeout = 366; val XCALL_XSetInputFocus = 370; val XCALL_XGetInputFocus = 371; val XCALL_XSetSelectionOwner = 372; val XCALL_XGetSelectionOwner = 373; val XCALL_XConvertSelection = 374; val XCALL_XSendSelectionNotify = 375; val XCALL_XDeleteProperty = 376; val XCALL_XInternAtom = 377; val XCALL_XGetAtomName = 378; (* Fonts 400 *) val XCALL_XGetFontPath = 401; val XCALL_XListFonts = 402; val XCALL_XListFontsWithInfo = 403; val XCALL_XLoadFont = 404; val XCALL_XLoadQueryFont = 405; val XCALL_XQueryFont = 406; val XCALL_XSetFontPath = 407; (* Grabbing 450 *) (* Graphics Context 500 *) val XCALL_DefaultGC = 500; val XCALL_UpdateGC = 501; val XCALL_XCreateGC = 503; val XCALL_XSetClipRectangles = 509; val XCALL_XSetDashes = 510; (* Images 550 *) val XCALL_XAddPixel = 550; val XCALL_XGetImage = 552; val XCALL_XGetPixel = 553; val XCALL_XGetSubImage = 554; val XCALL_XPutImage = 555; val XCALL_XPutPixel = 556; val XCALL_XSubImage = 557; val XCALL_BitmapBitOrder = 558; val XCALL_BitmapPad = 559; val XCALL_BitmapUnit = 560; val XCALL_ByteOrder = 561; (* Keyboard 600 *) val XCALL_XLookupString = 611; val XCALL_XQueryKeymap = 612; val XCALL_IsCursorKey = 618; val XCALL_IsFunctionKey = 619; val XCALL_IsKeypadKey = 620; val XCALL_IsMiscFunctionKey = 621; val XCALL_IsModifierKey = 622; val XCALL_IsPFKey = 623; (* Output Buffer 650 *) val XCALL_XFlush = 650; val XCALL_XSync = 651; (* Pointers 700 *) val XCALL_XQueryPointer = 703; (* Regions 750 *) (* Save Set 800 *) (* Screen Saver 850 *) val XCALL_XActivateScreenSaver = 850; val XCALL_XForceScreenSaver = 851; val XCALL_XGetScreenSaver = 852; val XCALL_XResetScreenSaver = 853; val XCALL_XSetScreenSaver = 854; (* Standard Geometry 900 *) val XCALL_XTranslateCoordinates = 902; (* Text 950 *) val XCALL_XTextExtents = 950; val XCALL_XTextExtents16 = 951; val XCALL_XTextWidth = 952; val XCALL_XTextWidth16 = 953; (* Tiles, Pixmaps, Stipples and Bitmaps 1000 *) val XCALL_XCreateBitmapFromData = 1000; val XCALL_XCreatePixmap = 1001; val XCALL_XCreatePixmapFromBitmapData = 1002; val XCALL_XQueryBestStipple = 1004; val XCALL_XQueryBestTile = 1005; val XCALL_XReadBitmapFile = 1006; val XCALL_XWriteBitmapFile = 1007; (* User Preferences 1050 *) val XCALL_XAutoRepeatOff = 1050; val XCALL_XAutoRepeatOn = 1051; val XCALL_XBell = 1052; val XCALL_XGetDefault = 1053; (* Window Attributes 1100 *) val XCALL_ChangeWindow = 1100; val XCALL_XGetGeometry = 1101; val XCALL_XGetWindowAttributes = 1102; val XCALL_XSetWindowBorderWidth = 1107; (* Window Configuration 1150 *) val XCALL_XCirculateSubwindows = 1150; val XCALL_XConfigureWindow = 1153; val XCALL_XLowerWindow = 1154; val XCALL_XMapRaised = 1155; val XCALL_XMapSubwindows = 1156; val XCALL_XMapWindow = 1157; val XCALL_XMoveResizeWindow = 1158; val XCALL_XMoveWindow = 1159; val XCALL_XQueryTree = 1160; val XCALL_XRaiseWindow = 1161; val XCALL_XReparentWindow = 1162; val XCALL_XResizeWindow = 1163; val XCALL_XRestackWindows = 1164; val XCALL_XUnmapSubwindows = 1165; val XCALL_XUnmapWindow = 1166; (* Window Existence 1200 *) val XCALL_RootWindow = 1200; val XCALL_DestroyXObject = 1201; val XCALL_XDestroySubwindows = 1202; val XCALL_XCreateSimpleWindow = 1203; val XCALL_XCreateWindow = 1204; (* Window Manager 1250 *) val XCALL_XSetProperty = 1299; val XCALL_XGetTextProperty = 1250; val XCALL_XGetWMHints = 1253; val XCALL_XGetWMSizeHints = 1255; val XCALL_XGetIconSizes = 1257; val XCALL_XGetTransientForHint = 1259; val XCALL_XGetWMColormapWindows = 1261; val XCALL_XGetRGBColormaps = 1263; val XCALL_XWMGeometry = 1264; (* Miscellaneous and Convenience functions 1300 *) val XCALL_GetID = 1300; val XCALL_ResourceExists = 1301; val XCALL_GetDisplay = 1303; (* X Toolkit 3000 *) val XCALL_NoWidget = 3000; val XCALL_AppInitialise = 3001; val XCALL_XtRealizeWidget = 3002; val XCALL_XtManageChildren = 3003; val XCALL_XtUnmanageChildren = 3004; val XCALL_XtDestroyWidget = 3005; val XCALL_SetCallbacks = 3006; val XCALL_XtSetValues = 3007; val XCALL_GetValue = 3008; val XCALL_XtParent = 3009; val XCALL_XtWindow = 3010; val XCALL_XtDisplay = 3011; val XCALL_XtUnrealizeWidget = 3012; val XCALL_XtName = 3013; val XCALL_XtParseTranslationTable = 3014; val XCALL_XtOverrideTranslations = 3015; val XCALL_XtAugmentTranslations = 3016; val XCALL_XtUninstallTranslations = 3017; val XCALL_XtTranslateTablePrint = 3018; val XCALL_XtCreatePopupShell = 3019; val XCALL_InsertWidgetTimeout = 3020; val XCALL_GetWidgetState = 3021; val XCALL_SetWidgetState = 3022; val XCALL_XtSetSensitive = 3023; val XCALL_XtIsSensitive = 3024; val XCALL_GetSubresources = 3025; val XCALL_Cast = 3026; (* added 6/12/94 SPF *) val XCALL_XtPopup = 3027; val XCALL_XtPopdown = 3028; val XCALL_XtMapWidget = 3029; val XCALL_XtUnmapWidget = 3030; (* added 19/1/95 SPF *) val XCALL_XtIsManaged = 3031; val XCALL_XtIsRealized = 3032; (* added 23/3/01 DCJM *) val XCALL_XtGetApplicationResources = 3033; val XCALL_XtAddEventHandler = 3034; val XCALL_XmCreateArrowButton = 4000; val XCALL_XmCreateArrowButtonGadget = 4001; val XCALL_XmCreateBulletinBoard = 4002; val XCALL_XmCreateBulletinBoardDialog = 4003; val XCALL_XmCreateCascadeButton = 4004; val XCALL_XmCreateCascadeButtonGadget = 4005; val XCALL_XmCreateCommand = 4006; val XCALL_XmCreateDialogShell = 4007; val XCALL_XmCreateDrawingArea = 4008; val XCALL_XmCreateDrawnButton = 4009; val XCALL_XmCreateErrorDialog = 4010; val XCALL_XmCreateFileSelectionBox = 4011; val XCALL_XmCreateFileSelectionDialog = 4012; val XCALL_XmCreateForm = 4013; val XCALL_XmCreateFormDialog = 4014; val XCALL_XmCreateFrame = 4015; val XCALL_XmCreateInformationDialog = 4016; val XCALL_XmCreateLabel = 4017; val XCALL_XmCreateLabelGadget = 4018; val XCALL_XmCreateList = 4019; val XCALL_XmCreateMainWindow = 4020; val XCALL_XmCreateMenuBar = 4021; val XCALL_XmCreateMenuShell = 4022; val XCALL_XmCreateMessageBox = 4023; val XCALL_XmCreateMessageDialog = 4024; val XCALL_XmCreateOptionMenu = 4025; val XCALL_XmCreatePanedWindow = 4026; val XCALL_XmCreatePopupMenu = 4027; val XCALL_XmCreatePromptDialog = 4028; val XCALL_XmCreatePulldownMenu = 4029; val XCALL_XmCreatePushButton = 4030; val XCALL_XmCreatePushButtonGadget = 4031; val XCALL_XmCreateQuestionDialog = 4032; val XCALL_XmCreateRadioBox = 4033; val XCALL_XmCreateRowColumn = 4034; val XCALL_XmCreateScale = 4035; val XCALL_XmCreateScrollBar = 4036; val XCALL_XmCreateScrolledList = 4037; val XCALL_XmCreateScrolledText = 4038; val XCALL_XmCreateScrolledWindow = 4039; val XCALL_XmCreateSelectionBox = 4040; val XCALL_XmCreateSelectionDialog = 4041; val XCALL_XmCreateSeparator = 4042; val XCALL_XmCreateSeparatorGadget = 4043; val XCALL_XmCreateSimpleCheckBox = 4044; val XCALL_XmCreateSimpleMenuBar = 4045; val XCALL_XmCreateSimpleOptionMenu = 4046; val XCALL_XmCreateSimplePopupMenu = 4047; val XCALL_XmCreateSimplePulldownMenu = 4048; val XCALL_XmCreateSimpleRadioBox = 4049; val XCALL_XmCreateText = 4050; val XCALL_XmCreateTextField = 4051; val XCALL_XmCreateToggleButton = 4052; val XCALL_XmCreateToggleButtonGadget = 4053; val XCALL_XmCreateWarningDialog = 4054; val XCALL_XmCreateWorkArea = 4055; val XCALL_XmCreateWorkingDialog = 4056; val XCALL_XmCascadeButtonHighlight = 4060; val XCALL_XmCommandError = 4061; val XCALL_XmCommandGetChild = 4062; val XCALL_XmFileSelectionBoxGetChild = 4063; val XCALL_XmFileSelectionDoSearch = 4064; val XCALL_XmIsSomething = 4080; val XCALL_XmMainWindowSetAreas = 4100; val XCALL_XmMainWindowSepX = 4101; val XCALL_XmMessageBoxGetChild = 4105; val XCALL_XmOptionButtonGadget = 4106; val XCALL_XmOptionLabelGadget = 4107; val XCALL_XmSelectionBoxGetChild = 4108; val XCALL_XmSetMenuCursor = 4200; val XCALL_XmScrolledWindowSetAreas = 4201; val XCALL_XmTextGetString = 4202; val XCALL_XmTextSetString = 4203; val XCALL_XmTextSetInsertionPosition = 4204; val XCALL_XmTrackingLocate = 4210; val XCALL_XmUpdateDisplay = 4211; (* XmText widget 4300 *) (* XmTextClearSelection 4300; *) (* XmTextCopy 4301; *) (* XmTextCut 4302; *) val XCALL_XmTextGetAddMode = 4303; val XCALL_XmTextGetBaseline = 4304; val XCALL_XmTextGetCursorPosition = 4305; val XCALL_XmTextGetEditable = 4306; val XCALL_XmTextGetInsertionPosition = 4307; val XCALL_XmTextGetLastPosition = 4308; val XCALL_XmTextGetMaxLength = 4309; val XCALL_XmTextGetSelection = 4310; (* XmTextGetSelectionPosition 4311; *) (* XCALL_XmTextGetString defined above *) (* XmTextGetSource 4313; *) val XCALL_XmTextGetTopCharacter = 4314; val XCALL_XmTextInsert = 4315; val XCALL_XmTextPaste = 4316; (* XmTextPosToXY 4317; *) val XCALL_XmTextRemove = 4318; val XCALL_XmTextReplace = 4319; val XCALL_XmTextScroll = 4320; val XCALL_XmTextSetAddMode = 4321; val XCALL_XmTextSetCursorPosition = 4322; val XCALL_XmTextSetEditable = 4323; (* XmTextSetHighlight 4324; *) (* XCALL_XmTextSetInsertionPosition defined above *) val XCALL_XmTextSetMaxLength = 4326; (* XmTextSetSelection 4327; *) (* XmTextSetSource 4328; *) (* XCALL_XmTextSetString defined above *) val XCALL_XmTextSetTopCharacter = 4330; val XCALL_XmTextShowPosition = 4331; val XCALL_XmTextXYToPos = 4332; (* XmTextField widget 4350 *) (* XmTextFieldClearSelection 4350; *) (* XmTextFieldCopy 4351; *) (* XmTextFieldCut 4352; *) val XCALL_XmTextFieldGetAddMode = 4353; val XCALL_XmTextFieldGetBaseline = 4354; val XCALL_XmTextFieldGetCursorPosition = 4355; val XCALL_XmTextFieldGetEditable = 4356; val XCALL_XmTextFieldGetInsertionPosition = 4357; val XCALL_XmTextFieldGetLastPosition = 4358; val XCALL_XmTextFieldGetMaxLength = 4359; val XCALL_XmTextFieldGetSelection = 4360; (* XmTextFieldGetSelectionPosition 4361; *) val XCALL_XmTextFieldGetString = 4362; val XCALL_XmTextFieldInsert = 4363; val XCALL_XmTextFieldPaste = 4364; (* XmTextFieldPosToXY 4365; *) val XCALL_XmTextFieldRemove = 4366; val XCALL_XmTextFieldReplace = 4367; val XCALL_XmTextFieldSetAddMode = 4368; val XCALL_XmTextFieldSetCursorPosition = 4369; val XCALL_XmTextFieldSetEditable = 4370; (* XmTextFieldSetHighlight 4371; *) val XCALL_XmTextFieldSetInsertionPosition = 4372; val XCALL_XmTextFieldSetMaxLength = 4373; (* XmTextFieldSetSelection 4374; *) val XCALL_XmTextFieldSetString = 4375; val XCALL_XmTextFieldShowPosition = 4376; val XCALL_XmTextFieldXYToPos = 4377; (* XmList widget 4400 *) val XCALL_XmListAddItem = 4400; val XCALL_XmListAddItemUnselected = 4401; val XCALL_XmListAddItems = 4402; val XCALL_XmListDeleteAllItems = 4403; val XCALL_XmListDeleteItem = 4404; val XCALL_XmListDeleteItems = 4405; val XCALL_XmListDeletePos = 4406; val XCALL_XmListDeleteItemsPos = 4407; val XCALL_XmListDeselectAllItems = 4408; val XCALL_XmListDeselectItem = 4409; val XCALL_XmListDeselectPos = 4410; val XCALL_XmListGetMatchPos = 4411; val XCALL_XmListGetSelectedPos = 4412; val XCALL_XmListItemExists = 4413; val XCALL_XmListItemPos = 4414; val XCALL_XmListReplaceItems = 4415; val XCALL_XmListReplaceItemsPos = 4416; val XCALL_XmListSelectItem = 4417; val XCALL_XmListSelectPos = 4418; val XCALL_XmListSetAddMode = 4419; val XCALL_XmListSetBottomItem = 4420; val XCALL_XmListSetBottomPos = 4421; val XCALL_XmListSetHorizPos = 4422; val XCALL_XmListSetItem = 4423; val XCALL_XmListSetPos = 4424; (* Added by DCJM. 23/3/01. *) val XCALL_XmMenuPosition = 4500; (* Not supported by the SUNOS version of the tool-kit ... val XCALL_XmListAddItemsUnselected val XCALL_XmListDeletePositions val XCALL_XmListGetKbdItemPos val XCALL_XmListPosSelected val XCALL_XmListReplaceItemsPosUnselected val XCALL_XmListReplaceItemsPositions val XCALL_XmListSetKbdItemPos val XCALL_XmListUpdateSelectedList val XCALL_XmListYToPos val XCALL_XmListPosToBounds ... *) end; polyml-5.6/mlsource/extra/XWindows/XCursors.ML000066400000000000000000000073461265146633400215040ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XCursors: XCURSORS_SIG = struct val XC_num_glyphs = 154 ; val XC_X_cursor = 0 ; val XC_arrow = 2 ; val XC_based_arrow_down = 4 ; val XC_based_arrow_up = 6 ; val XC_boat = 8 ; val XC_bogosity = 10 ; val XC_bottom_left_corner = 12 ; val XC_bottom_right_corner = 14 ; val XC_bottom_side = 16 ; val XC_bottom_tee = 18 ; val XC_box_spiral = 20 ; val XC_center_ptr = 22 ; val XC_circle = 24 ; val XC_clock = 26 ; val XC_coffee_mug = 28 ; val XC_cross = 30 ; val XC_cross_reverse = 32 ; val XC_crosshair = 34 ; val XC_diamond_cross = 36 ; val XC_dot = 38 ; val XC_dotbox = 40 ; val XC_double_arrow = 42 ; val XC_draft_large = 44 ; val XC_draft_small = 46 ; val XC_draped_box = 48 ; val XC_exchange = 50 ; val XC_fleur = 52 ; val XC_gobbler = 54 ; val XC_gumby = 56 ; val XC_hand1 = 58 ; val XC_hand2 = 60 ; val XC_heart = 62 ; val XC_icon = 64 ; val XC_iron_cross = 66 ; val XC_left_ptr = 68 ; val XC_left_side = 70 ; val XC_left_tee = 72 ; val XC_leftbutton = 74 ; val XC_ll_angle = 76 ; val XC_lr_angle = 78 ; val XC_man = 80 ; val XC_middlebutton = 82 ; val XC_mouse = 84 ; val XC_pencil = 86 ; val XC_pirate = 88 ; val XC_plus = 90 ; val XC_question_arrow = 92 ; val XC_right_ptr = 94 ; val XC_right_side = 96 ; val XC_right_tee = 98 ; val XC_rightbutton = 100 ; val XC_rtl_logo = 102 ; val XC_sailboat = 104 ; val XC_sb_down_arrow = 106 ; val XC_sb_h_double_arrow = 108 ; val XC_sb_left_arrow = 110 ; val XC_sb_right_arrow = 112 ; val XC_sb_up_arrow = 114 ; val XC_sb_v_double_arrow = 116 ; val XC_shuttle = 118 ; val XC_sizing = 120 ; val XC_spider = 122 ; val XC_spraycan = 124 ; val XC_star = 126 ; val XC_target = 128 ; val XC_tcross = 130 ; val XC_top_left_arrow = 132 ; val XC_top_left_corner = 134 ; val XC_top_right_corner = 136 ; val XC_top_side = 138 ; val XC_top_tee = 140 ; val XC_trek = 142 ; val XC_ul_angle = 144 ; val XC_umbrella = 146 ; val XC_ur_angle = 148 ; val XC_watch = 150 ; val XC_xterm = 152 ; end (* XCursors *) ; polyml-5.6/mlsource/extra/XWindows/XEVENT_SIG.ML000066400000000000000000000361511265146633400214230ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XEVENT_SIG = sig include XTYPES_SIG ; datatype EventMask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ResizeRedirectMask | SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask | ButtonClickMask (* extra event mask *) ; datatype Modifier = ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | AnyModifier ; datatype ButtonName = Button1 | Button2 | Button3 | Button4 | Button5 | AnyButton ; datatype Placement = PlaceOnTop | PlaceOnBottom ; datatype StackMode = Above | Below | TopIf | BottomIf | Opposite ; datatype NotifyMode = NotifyNormal | NotifyGrab | NotifyUngrab | NotifyWhileGrabbed ; datatype NotifyDetail = NotifyAncestor | NotifyVirtual | NotifyInferior | NotifyNonLinear | NotifyNonLinearVirtual | NotifyPointer | NotifyPointerRoot | NotifyDetailNone ; datatype GraphicsCode = CopyArea | CopyPlane ; datatype Visibility = VisibilityUnobscured | VisibilityPartiallyObscured | VisibilityFullyObscured ; datatype 'a XEvent = ButtonPress of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } | ButtonRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } | ButtonClick of { sendEvent: bool, (* extra event type *) window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName, up: int, (* number of up transitions *) down: int } (* number of down transitions *) | CirculateNotify of { sendEvent: bool, event: Drawable, window: Drawable, place: Placement } | CirculateRequest of { sendEvent: bool, parent: Drawable, window: Drawable, place: Placement } | ColormapNotify of { sendEvent: bool, window: Drawable, colormap: Colormap, new: bool, installed: bool } | ConfigureNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, overrideRedirect: bool } | ConfigureRequest of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, detail: StackMode } | CreateNotify of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, overrideRedirect: bool } | DestroyNotify of { sendEvent: bool, event: Drawable, window: Drawable } | EnterNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } | LeaveNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } | Expose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int } | FocusIn of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } | FocusOut of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } | GraphicsExpose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int, code: GraphicsCode } | NoExpose of { sendEvent: bool, window: Drawable, code: GraphicsCode } | GravityNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint } | KeymapNotify of { sendEvent: bool, window: Drawable, keyVector: bool list (* 256 bools *) } | KeyPress of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } | KeyRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } | MapNotify of { sendEvent: bool, event: Drawable, window: Drawable, overrideRedirect: bool } | UnmapNotify of { sendEvent: bool, event: Drawable, window: Drawable, fromConfigure: bool } | MapRequest of { sendEvent: bool, parent: Drawable, window: Drawable } | MotionNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, isHint: bool } | ReparentNotify of { sendEvent: bool, event: Drawable, window: Drawable, parent: Drawable, position: XPoint, overrideRedirect: bool } | ResizeRequest of { sendEvent: bool, window: Drawable, size: XRectangle } | SelectionClear of { sendEvent: bool, window: Drawable, selection: int, time: int } | SelectionNotify of { sendEvent: bool, requestor: Drawable, selection: int, target: int, property: int, time: int } | SelectionRequest of { sendEvent: bool, owner: Drawable, requestor: Drawable, selection: int, target: int, property: int, time: int } | VisibilityNotify of { sendEvent: bool, window: Drawable, visibility: Visibility } | DeleteRequest of { window: Drawable } (* extra event type *) | Message of { window: Drawable, message: 'a } (* extra event type *) | NoEvent ; end (* XEVENT_SIG *) ; polyml-5.6/mlsource/extra/XWindows/XKEYSYMS_SIG.ML000066400000000000000000001025461265146633400217100ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XKEYSYMS_SIG = sig val XK_VoidSymbol: int ; (* * TTY Functions, cleverly chosen to map to ascii, for convenience of * programming, but could have been arbitrary (at the cost of lookup * tables in client code. *) val XK_BackSpace: int ; val XK_Tab: int ; val XK_Linefeed: int ; val XK_Clear: int ; val XK_Return: int ; val XK_Pause: int ; val XK_Scroll_Lock: int ; val XK_Escape: int ; val XK_Delete: int ; (* International & multi-key character composition *) val XK_Multi_key: int ; (* Japanese keyboard support *) val XK_Kanji: int ; val XK_Muhenkan: int ; val XK_Henkan_Mode: int ; val XK_Henkan: int ; val XK_Romaji: int ; val XK_Hiragana: int ; val XK_Katakana: int ; val XK_Hiragana_Katakana: int ; val XK_Zenkaku: int ; val XK_Hankaku: int ; val XK_Zenkaku_Hankaku: int ; val XK_Touroku: int ; val XK_Massyo: int ; val XK_Kana_Lock: int ; val XK_Kana_Shift: int ; val XK_Eisu_Shift: int ; val XK_Eisu_toggle: int ; (* Cursor control & motion *) val XK_Home: int ; val XK_Left: int ; val XK_Up: int ; val XK_Right: int ; val XK_Down: int ; val XK_Prior: int ; val XK_Next: int ; val XK_End: int ; val XK_Begin: int ; (* Misc Functions *) val XK_Select: int ; val XK_Print: int ; val XK_Execute: int ; val XK_Insert: int ; val XK_Undo: int ; val XK_Redo: int ; val XK_Menu: int ; val XK_Find: int ; val XK_Cancel: int ; val XK_Help: int ; val XK_Break: int ; val XK_Mode_switch: int ; val XK_script_switch: int ; val XK_Num_Lock: int ; (* Keypad Functions, keypad numbers cleverly chosen to map to ascii *) val XK_KP_Space: int ; val XK_KP_Tab: int ; val XK_KP_Enter: int ; val XK_KP_F1: int ; val XK_KP_F2: int ; val XK_KP_F3: int ; val XK_KP_F4: int ; val XK_KP_Equal: int ; val XK_KP_Multiply: int ; val XK_KP_Add: int ; val XK_KP_Separator: int ; val XK_KP_Subtract: int ; val XK_KP_Decimal: int ; val XK_KP_Divide: int ; val XK_KP_0: int ; val XK_KP_1: int ; val XK_KP_2: int ; val XK_KP_3: int ; val XK_KP_4: int ; val XK_KP_5: int ; val XK_KP_6: int ; val XK_KP_7: int ; val XK_KP_8: int ; val XK_KP_9: int ; (* * Auxilliary Functions; note the duplicate definitions for left and right * function keys; Sun keyboards and a few other manufactures have such * function key groups on the left and/or right sides of the keyboard. * We've not found a keyboard with more than 35 function keys total. *) val XK_F1: int ; val XK_F2: int ; val XK_F3: int ; val XK_F4: int ; val XK_F5: int ; val XK_F6: int ; val XK_F7: int ; val XK_F8: int ; val XK_F9: int ; val XK_F10: int ; val XK_F11: int ; val XK_L1: int ; val XK_F12: int ; val XK_L2: int ; val XK_F13: int ; val XK_L3: int ; val XK_F14: int ; val XK_L4: int ; val XK_F15: int ; val XK_L5: int ; val XK_F16: int ; val XK_L6: int ; val XK_F17: int ; val XK_L7: int ; val XK_F18: int ; val XK_L8: int ; val XK_F19: int ; val XK_L9: int ; val XK_F20: int ; val XK_L10: int ; val XK_F21: int ; val XK_R1: int ; val XK_F22: int ; val XK_R2: int ; val XK_F23: int ; val XK_R3: int ; val XK_F24: int ; val XK_R4: int ; val XK_F25: int ; val XK_R5: int ; val XK_F26: int ; val XK_R6: int ; val XK_F27: int ; val XK_R7: int ; val XK_F28: int ; val XK_R8: int ; val XK_F29: int ; val XK_R9: int ; val XK_F30: int ; val XK_R10: int ; val XK_F31: int ; val XK_R11: int ; val XK_F32: int ; val XK_R12: int ; val XK_R13: int ; val XK_F33: int ; val XK_F34: int ; val XK_R14: int ; val XK_F35: int ; val XK_R15: int ; (* Modifiers *) val XK_Shift_L: int ; val XK_Shift_R: int ; val XK_Control_L: int ; val XK_Control_R: int ; val XK_Caps_Lock: int ; val XK_Shift_Lock: int ; val XK_Meta_L: int ; val XK_Meta_R: int ; val XK_Alt_L: int ; val XK_Alt_R: int ; val XK_Super_L: int ; val XK_Super_R: int ; val XK_Hyper_L: int ; val XK_Hyper_R: int ; (* Latin 1 *) val XK_space: int ; val XK_exclam: int ; val XK_quotedbl: int ; val XK_numbersign: int ; val XK_dollar: int ; val XK_percent: int ; val XK_ampersand: int ; val XK_apostrophe: int ; val XK_quoteright: int ; val XK_parenleft: int ; val XK_parenright: int ; val XK_asterisk: int ; val XK_plus: int ; val XK_comma: int ; val XK_minus: int ; val XK_period: int ; val XK_slash: int ; val XK_0: int ; val XK_1: int ; val XK_2: int ; val XK_3: int ; val XK_4: int ; val XK_5: int ; val XK_6: int ; val XK_7: int ; val XK_8: int ; val XK_9: int ; val XK_colon: int ; val XK_semicolon: int ; val XK_less: int ; val XK_equal: int ; val XK_greater: int ; val XK_question: int ; val XK_at: int ; val XK_A: int ; val XK_B: int ; val XK_C: int ; val XK_D: int ; val XK_E: int ; val XK_F: int ; val XK_G: int ; val XK_H: int ; val XK_I: int ; val XK_J: int ; val XK_K: int ; val XK_L: int ; val XK_M: int ; val XK_N: int ; val XK_O: int ; val XK_P: int ; val XK_Q: int ; val XK_R: int ; val XK_S: int ; val XK_T: int ; val XK_U: int ; val XK_V: int ; val XK_W: int ; val XK_X: int ; val XK_Y: int ; val XK_Z: int ; val XK_bracketleft: int ; val XK_backslash: int ; val XK_bracketright: int ; val XK_asciicircum: int ; val XK_underscore: int ; val XK_grave: int ; val XK_quoteleft: int ; val XK_a: int ; val XK_b: int ; val XK_c: int ; val XK_d: int ; val XK_e: int ; val XK_f: int ; val XK_g: int ; val XK_h: int ; val XK_i: int ; val XK_j: int ; val XK_k: int ; val XK_l: int ; val XK_m: int ; val XK_n: int ; val XK_o: int ; val XK_p: int ; val XK_q: int ; val XK_r: int ; val XK_s: int ; val XK_t: int ; val XK_u: int ; val XK_v: int ; val XK_w: int ; val XK_x: int ; val XK_y: int ; val XK_z: int ; val XK_braceleft: int ; val XK_bar: int ; val XK_braceright: int ; val XK_asciitilde: int ; val XK_nobreakspace: int ; val XK_exclamdown: int ; val XK_cent: int ; val XK_sterling: int ; val XK_currency: int ; val XK_yen: int ; val XK_brokenbar: int ; val XK_section: int ; val XK_diaeresis: int ; val XK_copyright: int ; val XK_ordfeminine: int ; val XK_guillemotleft: int ; val XK_notsign: int ; val XK_hyphen: int ; val XK_registered: int ; val XK_macron: int ; val XK_degree: int ; val XK_plusminus: int ; val XK_twosuperior: int ; val XK_threesuperior: int ; val XK_acute: int ; val XK_mu: int ; val XK_paragraph: int ; val XK_periodcentered: int ; val XK_cedilla: int ; val XK_onesuperior: int ; val XK_masculine: int ; val XK_guillemotright: int ; val XK_onequarter: int ; val XK_onehalf: int ; val XK_threequarters: int ; val XK_questiondown: int ; val XK_Agrave: int ; val XK_Aacute: int ; val XK_Acircumflex: int ; val XK_Atilde: int ; val XK_Adiaeresis: int ; val XK_Aring: int ; val XK_AE: int ; val XK_Ccedilla: int ; val XK_Egrave: int ; val XK_Eacute: int ; val XK_Ecircumflex: int ; val XK_Ediaeresis: int ; val XK_Igrave: int ; val XK_Iacute: int ; val XK_Icircumflex: int ; val XK_Idiaeresis: int ; val XK_ETH: int ; val XK_Eth: int ; val XK_Ntilde: int ; val XK_Ograve: int ; val XK_Oacute: int ; val XK_Ocircumflex: int ; val XK_Otilde: int ; val XK_Odiaeresis: int ; val XK_multiply: int ; val XK_Ooblique: int ; val XK_Ugrave: int ; val XK_Uacute: int ; val XK_Ucircumflex: int ; val XK_Udiaeresis: int ; val XK_Yacute: int ; val XK_THORN: int ; val XK_Thorn: int ; val XK_ssharp: int ; val XK_agrave: int ; val XK_aacute: int ; val XK_acircumflex: int ; val XK_atilde: int ; val XK_adiaeresis: int ; val XK_aring: int ; val XK_ae: int ; val XK_ccedilla: int ; val XK_egrave: int ; val XK_eacute: int ; val XK_ecircumflex: int ; val XK_ediaeresis: int ; val XK_igrave: int ; val XK_iacute: int ; val XK_icircumflex: int ; val XK_idiaeresis: int ; val XK_eth: int ; val XK_ntilde: int ; val XK_ograve: int ; val XK_oacute: int ; val XK_ocircumflex: int ; val XK_otilde: int ; val XK_odiaeresis: int ; val XK_division: int ; val XK_oslash: int ; val XK_ugrave: int ; val XK_uacute: int ; val XK_ucircumflex: int ; val XK_udiaeresis: int ; val XK_yacute: int ; val XK_thorn: int ; val XK_ydiaeresis: int ; (* Latin 2 *) val XK_Aogonek: int ; val XK_breve: int ; val XK_Lstroke: int ; val XK_Lcaron: int ; val XK_Sacute: int ; val XK_Scaron: int ; val XK_Scedilla: int ; val XK_Tcaron: int ; val XK_Zacute: int ; val XK_Zcaron: int ; val XK_Zabovedot: int ; val XK_aogonek: int ; val XK_ogonek: int ; val XK_lstroke: int ; val XK_lcaron: int ; val XK_sacute: int ; val XK_caron: int ; val XK_scaron: int ; val XK_scedilla: int ; val XK_tcaron: int ; val XK_zacute: int ; val XK_doubleacute: int ; val XK_zcaron: int ; val XK_zabovedot: int ; val XK_Racute: int ; val XK_Abreve: int ; val XK_Lacute: int ; val XK_Cacute: int ; val XK_Ccaron: int ; val XK_Eogonek: int ; val XK_Ecaron: int ; val XK_Dcaron: int ; val XK_Dstroke: int ; val XK_Nacute: int ; val XK_Ncaron: int ; val XK_Odoubleacute: int ; val XK_Rcaron: int ; val XK_Uring: int ; val XK_Udoubleacute: int ; val XK_Tcedilla: int ; val XK_racute: int ; val XK_abreve: int ; val XK_lacute: int ; val XK_cacute: int ; val XK_ccaron: int ; val XK_eogonek: int ; val XK_ecaron: int ; val XK_dcaron: int ; val XK_dstroke: int ; val XK_nacute: int ; val XK_ncaron: int ; val XK_odoubleacute: int ; val XK_udoubleacute: int ; val XK_rcaron: int ; val XK_uring: int ; val XK_tcedilla: int ; val XK_abovedot: int ; (* Latin 3 *) val XK_Hstroke: int ; val XK_Hcircumflex: int ; val XK_Iabovedot: int ; val XK_Gbreve: int ; val XK_Jcircumflex: int ; val XK_hstroke: int ; val XK_hcircumflex: int ; val XK_idotless: int ; val XK_gbreve: int ; val XK_jcircumflex: int ; val XK_Cabovedot: int ; val XK_Ccircumflex: int ; val XK_Gabovedot: int ; val XK_Gcircumflex: int ; val XK_Ubreve: int ; val XK_Scircumflex: int ; val XK_cabovedot: int ; val XK_ccircumflex: int ; val XK_gabovedot: int ; val XK_gcircumflex: int ; val XK_ubreve: int ; val XK_scircumflex: int ; (* Latin 4 *) val XK_kra: int ; val XK_kappa: int ; val XK_Rcedilla: int ; val XK_Itilde: int ; val XK_Lcedilla: int ; val XK_Emacron: int ; val XK_Gcedilla: int ; val XK_Tslash: int ; val XK_rcedilla: int ; val XK_itilde: int ; val XK_lcedilla: int ; val XK_emacron: int ; val XK_gcedilla: int ; val XK_tslash: int ; val XK_ENG: int ; val XK_eng: int ; val XK_Amacron: int ; val XK_Iogonek: int ; val XK_Eabovedot: int ; val XK_Imacron: int ; val XK_Ncedilla: int ; val XK_Omacron: int ; val XK_Kcedilla: int ; val XK_Uogonek: int ; val XK_Utilde: int ; val XK_Umacron: int ; val XK_amacron: int ; val XK_iogonek: int ; val XK_eabovedot: int ; val XK_imacron: int ; val XK_ncedilla: int ; val XK_omacron: int ; val XK_kcedilla: int ; val XK_uogonek: int ; val XK_utilde: int ; val XK_umacron: int ; (* Katakana *) val XK_overline: int ; val XK_kana_fullstop: int ; val XK_kana_openingbracket: int ; val XK_kana_closingbracket: int ; val XK_kana_comma: int ; val XK_kana_conjunctive: int ; val XK_kana_middledot: int ; val XK_kana_WO: int ; val XK_kana_a: int ; val XK_kana_i: int ; val XK_kana_u: int ; val XK_kana_e: int ; val XK_kana_o: int ; val XK_kana_ya: int ; val XK_kana_yu: int ; val XK_kana_yo: int ; val XK_kana_tsu: int ; val XK_kana_tu: int ; val XK_prolongedsound: int ; val XK_kana_A: int ; val XK_kana_I: int ; val XK_kana_U: int ; val XK_kana_E: int ; val XK_kana_O: int ; val XK_kana_KA: int ; val XK_kana_KI: int ; val XK_kana_KU: int ; val XK_kana_KE: int ; val XK_kana_KO: int ; val XK_kana_SA: int ; val XK_kana_SHI: int ; val XK_kana_SU: int ; val XK_kana_SE: int ; val XK_kana_SO: int ; val XK_kana_TA: int ; val XK_kana_CHI: int ; val XK_kana_TI: int ; val XK_kana_TSU: int ; val XK_kana_TU: int ; val XK_kana_TE: int ; val XK_kana_TO: int ; val XK_kana_NA: int ; val XK_kana_NI: int ; val XK_kana_NU: int ; val XK_kana_NE: int ; val XK_kana_NO: int ; val XK_kana_HA: int ; val XK_kana_HI: int ; val XK_kana_FU: int ; val XK_kana_HU: int ; val XK_kana_HE: int ; val XK_kana_HO: int ; val XK_kana_MA: int ; val XK_kana_MI: int ; val XK_kana_MU: int ; val XK_kana_ME: int ; val XK_kana_MO: int ; val XK_kana_YA: int ; val XK_kana_YU: int ; val XK_kana_YO: int ; val XK_kana_RA: int ; val XK_kana_RI: int ; val XK_kana_RU: int ; val XK_kana_RE: int ; val XK_kana_RO: int ; val XK_kana_WA: int ; val XK_kana_N: int ; val XK_voicedsound: int ; val XK_semivoicedsound: int ; val XK_kana_switch: int ; (* Arabic *) val XK_Arabic_comma: int ; val XK_Arabic_semicolon: int ; val XK_Arabic_question_mark: int ; val XK_Arabic_hamza: int ; val XK_Arabic_maddaonalef: int ; val XK_Arabic_hamzaonalef: int ; val XK_Arabic_hamzaonwaw: int ; val XK_Arabic_hamzaunderalef: int ; val XK_Arabic_hamzaonyeh: int ; val XK_Arabic_alef: int ; val XK_Arabic_beh: int ; val XK_Arabic_tehmarbuta: int ; val XK_Arabic_teh: int ; val XK_Arabic_theh: int ; val XK_Arabic_jeem: int ; val XK_Arabic_hah: int ; val XK_Arabic_khah: int ; val XK_Arabic_dal: int ; val XK_Arabic_thal: int ; val XK_Arabic_ra: int ; val XK_Arabic_zain: int ; val XK_Arabic_seen: int ; val XK_Arabic_sheen: int ; val XK_Arabic_sad: int ; val XK_Arabic_dad: int ; val XK_Arabic_tah: int ; val XK_Arabic_zah: int ; val XK_Arabic_ain: int ; val XK_Arabic_ghain: int ; val XK_Arabic_tatweel: int ; val XK_Arabic_feh: int ; val XK_Arabic_qaf: int ; val XK_Arabic_kaf: int ; val XK_Arabic_lam: int ; val XK_Arabic_meem: int ; val XK_Arabic_noon: int ; val XK_Arabic_ha: int ; val XK_Arabic_heh: int ; val XK_Arabic_waw: int ; val XK_Arabic_alefmaksura: int ; val XK_Arabic_yeh: int ; val XK_Arabic_fathatan: int ; val XK_Arabic_dammatan: int ; val XK_Arabic_kasratan: int ; val XK_Arabic_fatha: int ; val XK_Arabic_damma: int ; val XK_Arabic_kasra: int ; val XK_Arabic_shadda: int ; val XK_Arabic_sukun: int ; val XK_Arabic_switch: int ; (* Cyrillic *) val XK_Serbian_dje: int ; val XK_Macedonia_gje: int ; val XK_Cyrillic_io: int ; val XK_Ukrainian_ie: int ; val XK_Ukranian_je: int ; val XK_Macedonia_dse: int ; val XK_Ukrainian_i: int ; val XK_Ukranian_i: int ; val XK_Ukrainian_yi: int ; val XK_Ukranian_yi: int ; val XK_Cyrillic_je: int ; val XK_Serbian_je: int ; val XK_Cyrillic_lje: int ; val XK_Serbian_lje: int ; val XK_Cyrillic_nje: int ; val XK_Serbian_nje: int ; val XK_Serbian_tshe: int ; val XK_Macedonia_kje: int ; val XK_Byelorussian_shortu: int ; val XK_Cyrillic_dzhe: int ; val XK_Serbian_dze: int ; val XK_numerosign: int ; val XK_Serbian_DJE: int ; val XK_Macedonia_GJE: int ; val XK_Cyrillic_IO: int ; val XK_Ukrainian_IE: int ; val XK_Ukranian_JE: int ; val XK_Macedonia_DSE: int ; val XK_Ukrainian_I: int ; val XK_Ukranian_I: int ; val XK_Ukrainian_YI: int ; val XK_Ukranian_YI: int ; val XK_Cyrillic_JE: int ; val XK_Serbian_JE: int ; val XK_Cyrillic_LJE: int ; val XK_Serbian_LJE: int ; val XK_Cyrillic_NJE: int ; val XK_Serbian_NJE: int ; val XK_Serbian_TSHE: int ; val XK_Macedonia_KJE: int ; val XK_Byelorussian_SHORTU: int ; val XK_Cyrillic_DZHE: int ; val XK_Serbian_DZE: int ; val XK_Cyrillic_yu: int ; val XK_Cyrillic_a: int ; val XK_Cyrillic_be: int ; val XK_Cyrillic_tse: int ; val XK_Cyrillic_de: int ; val XK_Cyrillic_ie: int ; val XK_Cyrillic_ef: int ; val XK_Cyrillic_ghe: int ; val XK_Cyrillic_ha: int ; val XK_Cyrillic_i: int ; val XK_Cyrillic_shorti: int ; val XK_Cyrillic_ka: int ; val XK_Cyrillic_el: int ; val XK_Cyrillic_em: int ; val XK_Cyrillic_en: int ; val XK_Cyrillic_o: int ; val XK_Cyrillic_pe: int ; val XK_Cyrillic_ya: int ; val XK_Cyrillic_er: int ; val XK_Cyrillic_es: int ; val XK_Cyrillic_te: int ; val XK_Cyrillic_u: int ; val XK_Cyrillic_zhe: int ; val XK_Cyrillic_ve: int ; val XK_Cyrillic_softsign: int ; val XK_Cyrillic_yeru: int ; val XK_Cyrillic_ze: int ; val XK_Cyrillic_sha: int ; val XK_Cyrillic_e: int ; val XK_Cyrillic_shcha: int ; val XK_Cyrillic_che: int ; val XK_Cyrillic_hardsign: int ; val XK_Cyrillic_YU: int ; val XK_Cyrillic_A: int ; val XK_Cyrillic_BE: int ; val XK_Cyrillic_TSE: int ; val XK_Cyrillic_DE: int ; val XK_Cyrillic_IE: int ; val XK_Cyrillic_EF: int ; val XK_Cyrillic_GHE: int ; val XK_Cyrillic_HA: int ; val XK_Cyrillic_I: int ; val XK_Cyrillic_SHORTI: int ; val XK_Cyrillic_KA: int ; val XK_Cyrillic_EL: int ; val XK_Cyrillic_EM: int ; val XK_Cyrillic_EN: int ; val XK_Cyrillic_O: int ; val XK_Cyrillic_PE: int ; val XK_Cyrillic_YA: int ; val XK_Cyrillic_ER: int ; val XK_Cyrillic_ES: int ; val XK_Cyrillic_TE: int ; val XK_Cyrillic_U: int ; val XK_Cyrillic_ZHE: int ; val XK_Cyrillic_VE: int ; val XK_Cyrillic_SOFTSIGN: int ; val XK_Cyrillic_YERU: int ; val XK_Cyrillic_ZE: int ; val XK_Cyrillic_SHA: int ; val XK_Cyrillic_E: int ; val XK_Cyrillic_SHCHA: int ; val XK_Cyrillic_CHE: int ; val XK_Cyrillic_HARDSIGN: int ; (* Greek *) val XK_Greek_ALPHAaccent: int ; val XK_Greek_EPSILONaccent: int ; val XK_Greek_ETAaccent: int ; val XK_Greek_IOTAaccent: int ; val XK_Greek_IOTAdiaeresis: int ; val XK_Greek_OMICRONaccent: int ; val XK_Greek_UPSILONaccent: int ; val XK_Greek_UPSILONdieresis: int ; val XK_Greek_OMEGAaccent: int ; val XK_Greek_accentdieresis: int ; val XK_Greek_horizbar: int ; val XK_Greek_alphaaccent: int ; val XK_Greek_epsilonaccent: int ; val XK_Greek_etaaccent: int ; val XK_Greek_iotaaccent: int ; val XK_Greek_iotadieresis: int ; val XK_Greek_iotaaccentdieresis: int ; val XK_Greek_omicronaccent: int ; val XK_Greek_upsilonaccent: int ; val XK_Greek_upsilondieresis: int ; val XK_Greek_upsilonaccentdieresis: int ; val XK_Greek_omegaaccent: int ; val XK_Greek_ALPHA: int ; val XK_Greek_BETA: int ; val XK_Greek_GAMMA: int ; val XK_Greek_DELTA: int ; val XK_Greek_EPSILON: int ; val XK_Greek_ZETA: int ; val XK_Greek_ETA: int ; val XK_Greek_THETA: int ; val XK_Greek_IOTA: int ; val XK_Greek_KAPPA: int ; val XK_Greek_LAMDA: int ; val XK_Greek_LAMBDA: int ; val XK_Greek_MU: int ; val XK_Greek_NU: int ; val XK_Greek_XI: int ; val XK_Greek_OMICRON: int ; val XK_Greek_PI: int ; val XK_Greek_RHO: int ; val XK_Greek_SIGMA: int ; val XK_Greek_TAU: int ; val XK_Greek_UPSILON: int ; val XK_Greek_PHI: int ; val XK_Greek_CHI: int ; val XK_Greek_PSI: int ; val XK_Greek_OMEGA: int ; val XK_Greek_alpha: int ; val XK_Greek_beta: int ; val XK_Greek_gamma: int ; val XK_Greek_delta: int ; val XK_Greek_epsilon: int ; val XK_Greek_zeta: int ; val XK_Greek_eta: int ; val XK_Greek_theta: int ; val XK_Greek_iota: int ; val XK_Greek_kappa: int ; val XK_Greek_lamda: int ; val XK_Greek_lambda: int ; val XK_Greek_mu: int ; val XK_Greek_nu: int ; val XK_Greek_xi: int ; val XK_Greek_omicron: int ; val XK_Greek_pi: int ; val XK_Greek_rho: int ; val XK_Greek_sigma: int ; val XK_Greek_finalsmallsigma: int ; val XK_Greek_tau: int ; val XK_Greek_upsilon: int ; val XK_Greek_phi: int ; val XK_Greek_chi: int ; val XK_Greek_psi: int ; val XK_Greek_omega: int ; val XK_Greek_switch: int ; (* Technical *) val XK_leftradical: int ; val XK_topleftradical: int ; val XK_horizconnector: int ; val XK_topintegral: int ; val XK_botintegral: int ; val XK_vertconnector: int ; val XK_topleftsqbracket: int ; val XK_botleftsqbracket: int ; val XK_toprightsqbracket: int ; val XK_botrightsqbracket: int ; val XK_topleftparens: int ; val XK_botleftparens: int ; val XK_toprightparens: int ; val XK_botrightparens: int ; val XK_leftmiddlecurlybrace: int ; val XK_rightmiddlecurlybrace: int ; val XK_topleftsummation: int ; val XK_botleftsummation: int ; val XK_topvertsummationconnector: int ; val XK_botvertsummationconnector: int ; val XK_toprightsummation: int ; val XK_botrightsummation: int ; val XK_rightmiddlesummation: int ; val XK_lessthanequal: int ; val XK_notequal: int ; val XK_greaterthanequal: int ; val XK_integral: int ; val XK_therefore: int ; val XK_variation: int ; val XK_infinity: int ; val XK_nabla: int ; val XK_approximate: int ; val XK_similarequal: int ; val XK_ifonlyif: int ; val XK_implies: int ; val XK_identical: int ; val XK_radical: int ; val XK_includedin: int ; val XK_includes: int ; val XK_intersection: int ; val XK_union: int ; val XK_logicaland: int ; val XK_logicalor: int ; val XK_partialderivative: int ; val XK_function: int ; val XK_leftarrow: int ; val XK_uparrow: int ; val XK_rightarrow: int ; val XK_downarrow: int ; (* Special *) val XK_blank: int ; val XK_soliddiamond: int ; val XK_checkerboard: int ; val XK_ht: int ; val XK_ff: int ; val XK_cr: int ; val XK_lf: int ; val XK_nl: int ; val XK_vt: int ; val XK_lowrightcorner: int ; val XK_uprightcorner: int ; val XK_upleftcorner: int ; val XK_lowleftcorner: int ; val XK_crossinglines: int ; val XK_horizlinescan1: int ; val XK_horizlinescan3: int ; val XK_horizlinescan5: int ; val XK_horizlinescan7: int ; val XK_horizlinescan9: int ; val XK_leftt: int ; val XK_rightt: int ; val XK_bott: int ; val XK_topt: int ; val XK_vertbar: int ; (* Publishing *) val XK_emspace: int ; val XK_enspace: int ; val XK_em3space: int ; val XK_em4space: int ; val XK_digitspace: int ; val XK_punctspace: int ; val XK_thinspace: int ; val XK_hairspace: int ; val XK_emdash: int ; val XK_endash: int ; val XK_signifblank: int ; val XK_ellipsis: int ; val XK_doubbaselinedot: int ; val XK_onethird: int ; val XK_twothirds: int ; val XK_onefifth: int ; val XK_twofifths: int ; val XK_threefifths: int ; val XK_fourfifths: int ; val XK_onesixth: int ; val XK_fivesixths: int ; val XK_careof: int ; val XK_figdash: int ; val XK_leftanglebracket: int ; val XK_decimalpoint: int ; val XK_rightanglebracket: int ; val XK_marker: int ; val XK_oneeighth: int ; val XK_threeeighths: int ; val XK_fiveeighths: int ; val XK_seveneighths: int ; val XK_trademark: int ; val XK_signaturemark: int ; val XK_trademarkincircle: int ; val XK_leftopentriangle: int ; val XK_rightopentriangle: int ; val XK_emopencircle: int ; val XK_emopenrectangle: int ; val XK_leftsinglequotemark: int ; val XK_rightsinglequotemark: int ; val XK_leftdoublequotemark: int ; val XK_rightdoublequotemark: int ; val XK_prescription: int ; val XK_minutes: int ; val XK_seconds: int ; val XK_latincross: int ; val XK_hexagram: int ; val XK_filledrectbullet: int ; val XK_filledlefttribullet: int ; val XK_filledrighttribullet: int ; val XK_emfilledcircle: int ; val XK_emfilledrect: int ; val XK_enopencircbullet: int ; val XK_enopensquarebullet: int ; val XK_openrectbullet: int ; val XK_opentribulletup: int ; val XK_opentribulletdown: int ; val XK_openstar: int ; val XK_enfilledcircbullet: int ; val XK_enfilledsqbullet: int ; val XK_filledtribulletup: int ; val XK_filledtribulletdown: int ; val XK_leftpointer: int ; val XK_rightpointer: int ; val XK_club: int ; val XK_diamond: int ; val XK_heart: int ; val XK_maltesecross: int ; val XK_dagger: int ; val XK_doubledagger: int ; val XK_checkmark: int ; val XK_ballotcross: int ; val XK_musicalsharp: int ; val XK_musicalflat: int ; val XK_malesymbol: int ; val XK_femalesymbol: int ; val XK_telephone: int ; val XK_telephonerecorder: int ; val XK_phonographcopyright: int ; val XK_caret: int ; val XK_singlelowquotemark: int ; val XK_doublelowquotemark: int ; val XK_cursor: int ; (* APL *) val XK_leftcaret: int ; val XK_rightcaret: int ; val XK_downcaret: int ; val XK_upcaret: int ; val XK_overbar: int ; val XK_downtack: int ; val XK_upshoe: int ; val XK_downstile: int ; val XK_underbar: int ; val XK_jot: int ; val XK_quad: int ; val XK_uptack: int ; val XK_circle: int ; val XK_upstile: int ; val XK_downshoe: int ; val XK_rightshoe: int ; val XK_leftshoe: int ; val XK_lefttack: int ; val XK_righttack: int ; (* Hebrew *) val XK_hebrew_doublelowline: int ; val XK_hebrew_aleph: int ; val XK_hebrew_bet: int ; val XK_hebrew_beth: int ; val XK_hebrew_gimel: int ; val XK_hebrew_gimmel: int ; val XK_hebrew_dalet: int ; val XK_hebrew_daleth: int ; val XK_hebrew_he: int ; val XK_hebrew_waw: int ; val XK_hebrew_zain: int ; val XK_hebrew_zayin: int ; val XK_hebrew_chet: int ; val XK_hebrew_het: int ; val XK_hebrew_tet: int ; val XK_hebrew_teth: int ; val XK_hebrew_yod: int ; val XK_hebrew_finalkaph: int ; val XK_hebrew_kaph: int ; val XK_hebrew_lamed: int ; val XK_hebrew_finalmem: int ; val XK_hebrew_mem: int ; val XK_hebrew_finalnun: int ; val XK_hebrew_nun: int ; val XK_hebrew_samech: int ; val XK_hebrew_samekh: int ; val XK_hebrew_ayin: int ; val XK_hebrew_finalpe: int ; val XK_hebrew_pe: int ; val XK_hebrew_finalzade: int ; val XK_hebrew_finalzadi: int ; val XK_hebrew_zade: int ; val XK_hebrew_zadi: int ; val XK_hebrew_qoph: int ; val XK_hebrew_kuf: int ; val XK_hebrew_resh: int ; val XK_hebrew_shin: int ; val XK_hebrew_taw: int ; val XK_hebrew_taf: int ; val XK_Hebrew_switch: int ; end (* XKEYSYMS_SIG *) ; polyml-5.6/mlsource/extra/XWindows/XKeySyms.ML000066400000000000000000001077671265146633400214600ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XKeySyms: XKEYSYMS_SIG = struct val XK_VoidSymbol = 16777215 ; (* * TTY Functions, cleverly chosen to map to ascii, for convenience of * programming, but could have been arbitrary (at the cost of lookup * tables in client code. *) val XK_BackSpace = 65288 ; val XK_Tab = 65289 ; val XK_Linefeed = 65290 ; val XK_Clear = 65291 ; val XK_Return = 65293 ; val XK_Pause = 65299 ; val XK_Scroll_Lock = 65300 ; val XK_Escape = 65307 ; val XK_Delete = 65535 ; (* International & multi-key character composition *) val XK_Multi_key = 65312 ; (* Japanese keyboard support *) val XK_Kanji = 65313 ; val XK_Muhenkan = 65314 ; val XK_Henkan_Mode = 65315 ; val XK_Henkan = 65315 ; val XK_Romaji = 65316 ; val XK_Hiragana = 65317 ; val XK_Katakana = 65318 ; val XK_Hiragana_Katakana = 65319 ; val XK_Zenkaku = 65320 ; val XK_Hankaku = 65321 ; val XK_Zenkaku_Hankaku = 65322 ; val XK_Touroku = 65323 ; val XK_Massyo = 65324 ; val XK_Kana_Lock = 65325 ; val XK_Kana_Shift = 65326 ; val XK_Eisu_Shift = 65327 ; val XK_Eisu_toggle = 65328 ; (* Cursor control & motion *) val XK_Home = 65360 ; val XK_Left = 65361 ; val XK_Up = 65362 ; val XK_Right = 65363 ; val XK_Down = 65364 ; val XK_Prior = 65365 ; val XK_Next = 65366 ; val XK_End = 65367 ; val XK_Begin = 65368 ; (* Misc Functions *) val XK_Select = 65376 ; val XK_Print = 65377 ; val XK_Execute = 65378 ; val XK_Insert = 65379 ; val XK_Undo = 65381 ; val XK_Redo = 65382 ; val XK_Menu = 65383 ; val XK_Find = 65384 ; val XK_Cancel = 65385 ; val XK_Help = 65386 ; val XK_Break = 65387 ; val XK_Mode_switch = 65406 ; val XK_script_switch = 65406 ; val XK_Num_Lock = 65407 ; (* Keypad Functions, keypad numbers cleverly chosen to map to ascii *) val XK_KP_Space = 65408 ; val XK_KP_Tab = 65417 ; val XK_KP_Enter = 65421 ; val XK_KP_F1 = 65425 ; val XK_KP_F2 = 65426 ; val XK_KP_F3 = 65427 ; val XK_KP_F4 = 65428 ; val XK_KP_Equal = 65469 ; val XK_KP_Multiply = 65450 ; val XK_KP_Add = 65451 ; val XK_KP_Separator = 65452 ; val XK_KP_Subtract = 65453 ; val XK_KP_Decimal = 65454 ; val XK_KP_Divide = 65455 ; val XK_KP_0 = 65456 ; val XK_KP_1 = 65457 ; val XK_KP_2 = 65458 ; val XK_KP_3 = 65459 ; val XK_KP_4 = 65460 ; val XK_KP_5 = 65461 ; val XK_KP_6 = 65462 ; val XK_KP_7 = 65463 ; val XK_KP_8 = 65464 ; val XK_KP_9 = 65465 ; (* * Auxilliary Functions; note the duplicate definitions for left and right * function keys; Sun keyboards and a few other manufactures have such * function key groups on the left and/or right sides of the keyboard. * We've not found a keyboard with more than 35 function keys total. *) val XK_F1 = 65470 ; val XK_F2 = 65471 ; val XK_F3 = 65472 ; val XK_F4 = 65473 ; val XK_F5 = 65474 ; val XK_F6 = 65475 ; val XK_F7 = 65476 ; val XK_F8 = 65477 ; val XK_F9 = 65478 ; val XK_F10 = 65479 ; val XK_F11 = 65480 ; val XK_L1 = 65480 ; val XK_F12 = 65481 ; val XK_L2 = 65481 ; val XK_F13 = 65482 ; val XK_L3 = 65482 ; val XK_F14 = 65483 ; val XK_L4 = 65483 ; val XK_F15 = 65484 ; val XK_L5 = 65484 ; val XK_F16 = 65485 ; val XK_L6 = 65485 ; val XK_F17 = 65486 ; val XK_L7 = 65486 ; val XK_F18 = 65487 ; val XK_L8 = 65487 ; val XK_F19 = 65488 ; val XK_L9 = 65488 ; val XK_F20 = 65489 ; val XK_L10 = 65489 ; val XK_F21 = 65490 ; val XK_R1 = 65490 ; val XK_F22 = 65491 ; val XK_R2 = 65491 ; val XK_F23 = 65492 ; val XK_R3 = 65492 ; val XK_F24 = 65493 ; val XK_R4 = 65493 ; val XK_F25 = 65494 ; val XK_R5 = 65494 ; val XK_F26 = 65495 ; val XK_R6 = 65495 ; val XK_F27 = 65496 ; val XK_R7 = 65496 ; val XK_F28 = 65497 ; val XK_R8 = 65497 ; val XK_F29 = 65498 ; val XK_R9 = 65498 ; val XK_F30 = 65499 ; val XK_R10 = 65499 ; val XK_F31 = 65500 ; val XK_R11 = 65500 ; val XK_F32 = 65501 ; val XK_R12 = 65501 ; val XK_R13 = 65502 ; val XK_F33 = 65502 ; val XK_F34 = 65503 ; val XK_R14 = 65503 ; val XK_F35 = 65504 ; val XK_R15 = 65504 ; (* Modifiers *) val XK_Shift_L = 65505 ; val XK_Shift_R = 65506 ; val XK_Control_L = 65507 ; val XK_Control_R = 65508 ; val XK_Caps_Lock = 65509 ; val XK_Shift_Lock = 65510 ; val XK_Meta_L = 65511 ; val XK_Meta_R = 65512 ; val XK_Alt_L = 65513 ; val XK_Alt_R = 65514 ; val XK_Super_L = 65515 ; val XK_Super_R = 65516 ; val XK_Hyper_L = 65517 ; val XK_Hyper_R = 65518 ; (* Latin 1 *) val XK_space = 32 ; val XK_exclam = 33 ; val XK_quotedbl = 34 ; val XK_numbersign = 35 ; val XK_dollar = 36 ; val XK_percent = 37 ; val XK_ampersand = 38 ; val XK_apostrophe = 39 ; val XK_quoteright = 39 ; val XK_parenleft = 40 ; val XK_parenright = 41 ; val XK_asterisk = 42 ; val XK_plus = 43 ; val XK_comma = 44 ; val XK_minus = 45 ; val XK_period = 46 ; val XK_slash = 47 ; val XK_0 = 48 ; val XK_1 = 49 ; val XK_2 = 50 ; val XK_3 = 51 ; val XK_4 = 52 ; val XK_5 = 53 ; val XK_6 = 54 ; val XK_7 = 55 ; val XK_8 = 56 ; val XK_9 = 57 ; val XK_colon = 58 ; val XK_semicolon = 59 ; val XK_less = 60 ; val XK_equal = 61 ; val XK_greater = 62 ; val XK_question = 63 ; val XK_at = 64 ; val XK_A = 65 ; val XK_B = 66 ; val XK_C = 67 ; val XK_D = 68 ; val XK_E = 69 ; val XK_F = 70 ; val XK_G = 71 ; val XK_H = 72 ; val XK_I = 73 ; val XK_J = 74 ; val XK_K = 75 ; val XK_L = 76 ; val XK_M = 77 ; val XK_N = 78 ; val XK_O = 79 ; val XK_P = 80 ; val XK_Q = 81 ; val XK_R = 82 ; val XK_S = 83 ; val XK_T = 84 ; val XK_U = 85 ; val XK_V = 86 ; val XK_W = 87 ; val XK_X = 88 ; val XK_Y = 89 ; val XK_Z = 90 ; val XK_bracketleft = 91 ; val XK_backslash = 92 ; val XK_bracketright = 93 ; val XK_asciicircum = 94 ; val XK_underscore = 95 ; val XK_grave = 96 ; val XK_quoteleft = 96 ; val XK_a = 97 ; val XK_b = 98 ; val XK_c = 99 ; val XK_d = 100 ; val XK_e = 101 ; val XK_f = 102 ; val XK_g = 103 ; val XK_h = 104 ; val XK_i = 105 ; val XK_j = 106 ; val XK_k = 107 ; val XK_l = 108 ; val XK_m = 109 ; val XK_n = 110 ; val XK_o = 111 ; val XK_p = 112 ; val XK_q = 113 ; val XK_r = 114 ; val XK_s = 115 ; val XK_t = 116 ; val XK_u = 117 ; val XK_v = 118 ; val XK_w = 119 ; val XK_x = 120 ; val XK_y = 121 ; val XK_z = 122 ; val XK_braceleft = 123 ; val XK_bar = 124 ; val XK_braceright = 125 ; val XK_asciitilde = 126 ; val XK_nobreakspace = 160 ; val XK_exclamdown = 161 ; val XK_cent = 162 ; val XK_sterling = 163 ; val XK_currency = 164 ; val XK_yen = 165 ; val XK_brokenbar = 166 ; val XK_section = 167 ; val XK_diaeresis = 168 ; val XK_copyright = 169 ; val XK_ordfeminine = 170 ; val XK_guillemotleft = 171 ; val XK_notsign = 172 ; val XK_hyphen = 173 ; val XK_registered = 174 ; val XK_macron = 175 ; val XK_degree = 176 ; val XK_plusminus = 177 ; val XK_twosuperior = 178 ; val XK_threesuperior = 179 ; val XK_acute = 180 ; val XK_mu = 181 ; val XK_paragraph = 182 ; val XK_periodcentered = 183 ; val XK_cedilla = 184 ; val XK_onesuperior = 185 ; val XK_masculine = 186 ; val XK_guillemotright = 187 ; val XK_onequarter = 188 ; val XK_onehalf = 189 ; val XK_threequarters = 190 ; val XK_questiondown = 191 ; val XK_Agrave = 192 ; val XK_Aacute = 193 ; val XK_Acircumflex = 194 ; val XK_Atilde = 195 ; val XK_Adiaeresis = 196 ; val XK_Aring = 197 ; val XK_AE = 198 ; val XK_Ccedilla = 199 ; val XK_Egrave = 200 ; val XK_Eacute = 201 ; val XK_Ecircumflex = 202 ; val XK_Ediaeresis = 203 ; val XK_Igrave = 204 ; val XK_Iacute = 205 ; val XK_Icircumflex = 206 ; val XK_Idiaeresis = 207 ; val XK_ETH = 208 ; val XK_Eth = 208 ; val XK_Ntilde = 209 ; val XK_Ograve = 210 ; val XK_Oacute = 211 ; val XK_Ocircumflex = 212 ; val XK_Otilde = 213 ; val XK_Odiaeresis = 214 ; val XK_multiply = 215 ; val XK_Ooblique = 216 ; val XK_Ugrave = 217 ; val XK_Uacute = 218 ; val XK_Ucircumflex = 219 ; val XK_Udiaeresis = 220 ; val XK_Yacute = 221 ; val XK_THORN = 222 ; val XK_Thorn = 222 ; val XK_ssharp = 223 ; val XK_agrave = 224 ; val XK_aacute = 225 ; val XK_acircumflex = 226 ; val XK_atilde = 227 ; val XK_adiaeresis = 228 ; val XK_aring = 229 ; val XK_ae = 230 ; val XK_ccedilla = 231 ; val XK_egrave = 232 ; val XK_eacute = 233 ; val XK_ecircumflex = 234 ; val XK_ediaeresis = 235 ; val XK_igrave = 236 ; val XK_iacute = 237 ; val XK_icircumflex = 238 ; val XK_idiaeresis = 239 ; val XK_eth = 240 ; val XK_ntilde = 241 ; val XK_ograve = 242 ; val XK_oacute = 243 ; val XK_ocircumflex = 244 ; val XK_otilde = 245 ; val XK_odiaeresis = 246 ; val XK_division = 247 ; val XK_oslash = 248 ; val XK_ugrave = 249 ; val XK_uacute = 250 ; val XK_ucircumflex = 251 ; val XK_udiaeresis = 252 ; val XK_yacute = 253 ; val XK_thorn = 254 ; val XK_ydiaeresis = 255 ; (* Latin 2 *) val XK_Aogonek = 417 ; val XK_breve = 418 ; val XK_Lstroke = 419 ; val XK_Lcaron = 421 ; val XK_Sacute = 422 ; val XK_Scaron = 425 ; val XK_Scedilla = 426 ; val XK_Tcaron = 427 ; val XK_Zacute = 428 ; val XK_Zcaron = 430 ; val XK_Zabovedot = 431 ; val XK_aogonek = 433 ; val XK_ogonek = 434 ; val XK_lstroke = 435 ; val XK_lcaron = 437 ; val XK_sacute = 438 ; val XK_caron = 439 ; val XK_scaron = 441 ; val XK_scedilla = 442 ; val XK_tcaron = 443 ; val XK_zacute = 444 ; val XK_doubleacute = 445 ; val XK_zcaron = 446 ; val XK_zabovedot = 447 ; val XK_Racute = 448 ; val XK_Abreve = 451 ; val XK_Lacute = 453 ; val XK_Cacute = 454 ; val XK_Ccaron = 456 ; val XK_Eogonek = 458 ; val XK_Ecaron = 460 ; val XK_Dcaron = 463 ; val XK_Dstroke = 464 ; val XK_Nacute = 465 ; val XK_Ncaron = 466 ; val XK_Odoubleacute = 469 ; val XK_Rcaron = 472 ; val XK_Uring = 473 ; val XK_Udoubleacute = 475 ; val XK_Tcedilla = 478 ; val XK_racute = 480 ; val XK_abreve = 483 ; val XK_lacute = 485 ; val XK_cacute = 486 ; val XK_ccaron = 488 ; val XK_eogonek = 490 ; val XK_ecaron = 492 ; val XK_dcaron = 495 ; val XK_dstroke = 496 ; val XK_nacute = 497 ; val XK_ncaron = 498 ; val XK_odoubleacute = 501 ; val XK_udoubleacute = 507 ; val XK_rcaron = 504 ; val XK_uring = 505 ; val XK_tcedilla = 510 ; val XK_abovedot = 511 ; (* Latin 3 *) val XK_Hstroke = 673 ; val XK_Hcircumflex = 678 ; val XK_Iabovedot = 681 ; val XK_Gbreve = 683 ; val XK_Jcircumflex = 684 ; val XK_hstroke = 689 ; val XK_hcircumflex = 694 ; val XK_idotless = 697 ; val XK_gbreve = 699 ; val XK_jcircumflex = 700 ; val XK_Cabovedot = 709 ; val XK_Ccircumflex = 710 ; val XK_Gabovedot = 725 ; val XK_Gcircumflex = 728 ; val XK_Ubreve = 733 ; val XK_Scircumflex = 734 ; val XK_cabovedot = 741 ; val XK_ccircumflex = 742 ; val XK_gabovedot = 757 ; val XK_gcircumflex = 760 ; val XK_ubreve = 765 ; val XK_scircumflex = 766 ; (* Latin 4 *) val XK_kra = 930 ; val XK_kappa = 930 ; val XK_Rcedilla = 931 ; val XK_Itilde = 933 ; val XK_Lcedilla = 934 ; val XK_Emacron = 938 ; val XK_Gcedilla = 939 ; val XK_Tslash = 940 ; val XK_rcedilla = 947 ; val XK_itilde = 949 ; val XK_lcedilla = 950 ; val XK_emacron = 954 ; val XK_gcedilla = 955 ; val XK_tslash = 956 ; val XK_ENG = 957 ; val XK_eng = 959 ; val XK_Amacron = 960 ; val XK_Iogonek = 967 ; val XK_Eabovedot = 972 ; val XK_Imacron = 975 ; val XK_Ncedilla = 977 ; val XK_Omacron = 978 ; val XK_Kcedilla = 979 ; val XK_Uogonek = 985 ; val XK_Utilde = 989 ; val XK_Umacron = 990 ; val XK_amacron = 992 ; val XK_iogonek = 999 ; val XK_eabovedot = 1004 ; val XK_imacron = 1007 ; val XK_ncedilla = 1009 ; val XK_omacron = 1010 ; val XK_kcedilla = 1011 ; val XK_uogonek = 1017 ; val XK_utilde = 1021 ; val XK_umacron = 1022 ; (* Katakana *) val XK_overline = 1150 ; val XK_kana_fullstop = 1185 ; val XK_kana_openingbracket = 1186 ; val XK_kana_closingbracket = 1187 ; val XK_kana_comma = 1188 ; val XK_kana_conjunctive = 1189 ; val XK_kana_middledot = 1189 ; val XK_kana_WO = 1190 ; val XK_kana_a = 1191 ; val XK_kana_i = 1192 ; val XK_kana_u = 1193 ; val XK_kana_e = 1194 ; val XK_kana_o = 1195 ; val XK_kana_ya = 1196 ; val XK_kana_yu = 1197 ; val XK_kana_yo = 1198 ; val XK_kana_tsu = 1199 ; val XK_kana_tu = 1199 ; val XK_prolongedsound = 1200 ; val XK_kana_A = 1201 ; val XK_kana_I = 1202 ; val XK_kana_U = 1203 ; val XK_kana_E = 1204 ; val XK_kana_O = 1205 ; val XK_kana_KA = 1206 ; val XK_kana_KI = 1207 ; val XK_kana_KU = 1208 ; val XK_kana_KE = 1209 ; val XK_kana_KO = 1210 ; val XK_kana_SA = 1211 ; val XK_kana_SHI = 1212 ; val XK_kana_SU = 1213 ; val XK_kana_SE = 1214 ; val XK_kana_SO = 1215 ; val XK_kana_TA = 1216 ; val XK_kana_CHI = 1217 ; val XK_kana_TI = 1217 ; val XK_kana_TSU = 1218 ; val XK_kana_TU = 1218 ; val XK_kana_TE = 1219 ; val XK_kana_TO = 1220 ; val XK_kana_NA = 1221 ; val XK_kana_NI = 1222 ; val XK_kana_NU = 1223 ; val XK_kana_NE = 1224 ; val XK_kana_NO = 1225 ; val XK_kana_HA = 1226 ; val XK_kana_HI = 1227 ; val XK_kana_FU = 1228 ; val XK_kana_HU = 1228 ; val XK_kana_HE = 1229 ; val XK_kana_HO = 1230 ; val XK_kana_MA = 1231 ; val XK_kana_MI = 1232 ; val XK_kana_MU = 1233 ; val XK_kana_ME = 1234 ; val XK_kana_MO = 1235 ; val XK_kana_YA = 1236 ; val XK_kana_YU = 1237 ; val XK_kana_YO = 1238 ; val XK_kana_RA = 1239 ; val XK_kana_RI = 1240 ; val XK_kana_RU = 1241 ; val XK_kana_RE = 1242 ; val XK_kana_RO = 1243 ; val XK_kana_WA = 1244 ; val XK_kana_N = 1245 ; val XK_voicedsound = 1246 ; val XK_semivoicedsound = 1247 ; val XK_kana_switch = 65406 ; (* Arabic *) val XK_Arabic_comma = 1452 ; val XK_Arabic_semicolon = 1467 ; val XK_Arabic_question_mark = 1471 ; val XK_Arabic_hamza = 1473 ; val XK_Arabic_maddaonalef = 1474 ; val XK_Arabic_hamzaonalef = 1475 ; val XK_Arabic_hamzaonwaw = 1476 ; val XK_Arabic_hamzaunderalef = 1477 ; val XK_Arabic_hamzaonyeh = 1478 ; val XK_Arabic_alef = 1479 ; val XK_Arabic_beh = 1480 ; val XK_Arabic_tehmarbuta = 1481 ; val XK_Arabic_teh = 1482 ; val XK_Arabic_theh = 1483 ; val XK_Arabic_jeem = 1484 ; val XK_Arabic_hah = 1485 ; val XK_Arabic_khah = 1486 ; val XK_Arabic_dal = 1487 ; val XK_Arabic_thal = 1488 ; val XK_Arabic_ra = 1489 ; val XK_Arabic_zain = 1490 ; val XK_Arabic_seen = 1491 ; val XK_Arabic_sheen = 1492 ; val XK_Arabic_sad = 1493 ; val XK_Arabic_dad = 1494 ; val XK_Arabic_tah = 1495 ; val XK_Arabic_zah = 1496 ; val XK_Arabic_ain = 1497 ; val XK_Arabic_ghain = 1498 ; val XK_Arabic_tatweel = 1504 ; val XK_Arabic_feh = 1505 ; val XK_Arabic_qaf = 1506 ; val XK_Arabic_kaf = 1507 ; val XK_Arabic_lam = 1508 ; val XK_Arabic_meem = 1509 ; val XK_Arabic_noon = 1510 ; val XK_Arabic_ha = 1511 ; val XK_Arabic_heh = 1511 ; val XK_Arabic_waw = 1512 ; val XK_Arabic_alefmaksura = 1513 ; val XK_Arabic_yeh = 1514 ; val XK_Arabic_fathatan = 1515 ; val XK_Arabic_dammatan = 1516 ; val XK_Arabic_kasratan = 1517 ; val XK_Arabic_fatha = 1518 ; val XK_Arabic_damma = 1519 ; val XK_Arabic_kasra = 1520 ; val XK_Arabic_shadda = 1521 ; val XK_Arabic_sukun = 1522 ; val XK_Arabic_switch = 65406 ; (* Cyrillic *) val XK_Serbian_dje = 1697 ; val XK_Macedonia_gje = 1698 ; val XK_Cyrillic_io = 1699 ; val XK_Ukrainian_ie = 1700 ; val XK_Ukranian_je = 1700 ; val XK_Macedonia_dse = 1701 ; val XK_Ukrainian_i = 1702 ; val XK_Ukranian_i = 1702 ; val XK_Ukrainian_yi = 1703 ; val XK_Ukranian_yi = 1703 ; val XK_Cyrillic_je = 1704 ; val XK_Serbian_je = 1704 ; val XK_Cyrillic_lje = 1705 ; val XK_Serbian_lje = 1705 ; val XK_Cyrillic_nje = 1706 ; val XK_Serbian_nje = 1706 ; val XK_Serbian_tshe = 1707 ; val XK_Macedonia_kje = 1708 ; val XK_Byelorussian_shortu = 1710 ; val XK_Cyrillic_dzhe = 1711 ; val XK_Serbian_dze = 1711 ; val XK_numerosign = 1712 ; val XK_Serbian_DJE = 1713 ; val XK_Macedonia_GJE = 1714 ; val XK_Cyrillic_IO = 1715 ; val XK_Ukrainian_IE = 1716 ; val XK_Ukranian_JE = 1716 ; val XK_Macedonia_DSE = 1717 ; val XK_Ukrainian_I = 1718 ; val XK_Ukranian_I = 1718 ; val XK_Ukrainian_YI = 1719 ; val XK_Ukranian_YI = 1719 ; val XK_Cyrillic_JE = 1720 ; val XK_Serbian_JE = 1720 ; val XK_Cyrillic_LJE = 1721 ; val XK_Serbian_LJE = 1721 ; val XK_Cyrillic_NJE = 1722 ; val XK_Serbian_NJE = 1722 ; val XK_Serbian_TSHE = 1723 ; val XK_Macedonia_KJE = 1724 ; val XK_Byelorussian_SHORTU = 1726 ; val XK_Cyrillic_DZHE = 1727 ; val XK_Serbian_DZE = 1727 ; val XK_Cyrillic_yu = 1728 ; val XK_Cyrillic_a = 1729 ; val XK_Cyrillic_be = 1730 ; val XK_Cyrillic_tse = 1731 ; val XK_Cyrillic_de = 1732 ; val XK_Cyrillic_ie = 1733 ; val XK_Cyrillic_ef = 1734 ; val XK_Cyrillic_ghe = 1735 ; val XK_Cyrillic_ha = 1736 ; val XK_Cyrillic_i = 1737 ; val XK_Cyrillic_shorti = 1738 ; val XK_Cyrillic_ka = 1739 ; val XK_Cyrillic_el = 1740 ; val XK_Cyrillic_em = 1741 ; val XK_Cyrillic_en = 1742 ; val XK_Cyrillic_o = 1743 ; val XK_Cyrillic_pe = 1744 ; val XK_Cyrillic_ya = 1745 ; val XK_Cyrillic_er = 1746 ; val XK_Cyrillic_es = 1747 ; val XK_Cyrillic_te = 1748 ; val XK_Cyrillic_u = 1749 ; val XK_Cyrillic_zhe = 1750 ; val XK_Cyrillic_ve = 1751 ; val XK_Cyrillic_softsign = 1752 ; val XK_Cyrillic_yeru = 1753 ; val XK_Cyrillic_ze = 1754 ; val XK_Cyrillic_sha = 1755 ; val XK_Cyrillic_e = 1756 ; val XK_Cyrillic_shcha = 1757 ; val XK_Cyrillic_che = 1758 ; val XK_Cyrillic_hardsign = 1759 ; val XK_Cyrillic_YU = 1760 ; val XK_Cyrillic_A = 1761 ; val XK_Cyrillic_BE = 1762 ; val XK_Cyrillic_TSE = 1763 ; val XK_Cyrillic_DE = 1764 ; val XK_Cyrillic_IE = 1765 ; val XK_Cyrillic_EF = 1766 ; val XK_Cyrillic_GHE = 1767 ; val XK_Cyrillic_HA = 1768 ; val XK_Cyrillic_I = 1769 ; val XK_Cyrillic_SHORTI = 1770 ; val XK_Cyrillic_KA = 1771 ; val XK_Cyrillic_EL = 1772 ; val XK_Cyrillic_EM = 1773 ; val XK_Cyrillic_EN = 1774 ; val XK_Cyrillic_O = 1775 ; val XK_Cyrillic_PE = 1776 ; val XK_Cyrillic_YA = 1777 ; val XK_Cyrillic_ER = 1778 ; val XK_Cyrillic_ES = 1779 ; val XK_Cyrillic_TE = 1780 ; val XK_Cyrillic_U = 1781 ; val XK_Cyrillic_ZHE = 1782 ; val XK_Cyrillic_VE = 1783 ; val XK_Cyrillic_SOFTSIGN = 1784 ; val XK_Cyrillic_YERU = 1785 ; val XK_Cyrillic_ZE = 1786 ; val XK_Cyrillic_SHA = 1787 ; val XK_Cyrillic_E = 1788 ; val XK_Cyrillic_SHCHA = 1789 ; val XK_Cyrillic_CHE = 1790 ; val XK_Cyrillic_HARDSIGN = 1791 ; (* Greek *) val XK_Greek_ALPHAaccent = 1953 ; val XK_Greek_EPSILONaccent = 1954 ; val XK_Greek_ETAaccent = 1955 ; val XK_Greek_IOTAaccent = 1956 ; val XK_Greek_IOTAdiaeresis = 1957 ; val XK_Greek_OMICRONaccent = 1959 ; val XK_Greek_UPSILONaccent = 1960 ; val XK_Greek_UPSILONdieresis = 1961 ; val XK_Greek_OMEGAaccent = 1963 ; val XK_Greek_accentdieresis = 1966 ; val XK_Greek_horizbar = 1967 ; val XK_Greek_alphaaccent = 1969 ; val XK_Greek_epsilonaccent = 1970 ; val XK_Greek_etaaccent = 1971 ; val XK_Greek_iotaaccent = 1972 ; val XK_Greek_iotadieresis = 1973 ; val XK_Greek_iotaaccentdieresis = 1974 ; val XK_Greek_omicronaccent = 1975 ; val XK_Greek_upsilonaccent = 1976 ; val XK_Greek_upsilondieresis = 1977 ; val XK_Greek_upsilonaccentdieresis = 1978 ; val XK_Greek_omegaaccent = 1979 ; val XK_Greek_ALPHA = 1985 ; val XK_Greek_BETA = 1986 ; val XK_Greek_GAMMA = 1987 ; val XK_Greek_DELTA = 1988 ; val XK_Greek_EPSILON = 1989 ; val XK_Greek_ZETA = 1990 ; val XK_Greek_ETA = 1991 ; val XK_Greek_THETA = 1992 ; val XK_Greek_IOTA = 1993 ; val XK_Greek_KAPPA = 1994 ; val XK_Greek_LAMDA = 1995 ; val XK_Greek_LAMBDA = 1995 ; val XK_Greek_MU = 1996 ; val XK_Greek_NU = 1997 ; val XK_Greek_XI = 1998 ; val XK_Greek_OMICRON = 1999 ; val XK_Greek_PI = 2000 ; val XK_Greek_RHO = 2001 ; val XK_Greek_SIGMA = 2002 ; val XK_Greek_TAU = 2004 ; val XK_Greek_UPSILON = 2005 ; val XK_Greek_PHI = 2006 ; val XK_Greek_CHI = 2007 ; val XK_Greek_PSI = 2008 ; val XK_Greek_OMEGA = 2009 ; val XK_Greek_alpha = 2017 ; val XK_Greek_beta = 2018 ; val XK_Greek_gamma = 2019 ; val XK_Greek_delta = 2020 ; val XK_Greek_epsilon = 2021 ; val XK_Greek_zeta = 2022 ; val XK_Greek_eta = 2023 ; val XK_Greek_theta = 2024 ; val XK_Greek_iota = 2025 ; val XK_Greek_kappa = 2026 ; val XK_Greek_lamda = 2027 ; val XK_Greek_lambda = 2027 ; val XK_Greek_mu = 2028 ; val XK_Greek_nu = 2029 ; val XK_Greek_xi = 2030 ; val XK_Greek_omicron = 2031 ; val XK_Greek_pi = 2032 ; val XK_Greek_rho = 2033 ; val XK_Greek_sigma = 2034 ; val XK_Greek_finalsmallsigma = 2035 ; val XK_Greek_tau = 2036 ; val XK_Greek_upsilon = 2037 ; val XK_Greek_phi = 2038 ; val XK_Greek_chi = 2039 ; val XK_Greek_psi = 2040 ; val XK_Greek_omega = 2041 ; val XK_Greek_switch = 65406 ; (* Technical *) val XK_leftradical = 2209 ; val XK_topleftradical = 2210 ; val XK_horizconnector = 2211 ; val XK_topintegral = 2212 ; val XK_botintegral = 2213 ; val XK_vertconnector = 2214 ; val XK_topleftsqbracket = 2215 ; val XK_botleftsqbracket = 2216 ; val XK_toprightsqbracket = 2217 ; val XK_botrightsqbracket = 2218 ; val XK_topleftparens = 2219 ; val XK_botleftparens = 2220 ; val XK_toprightparens = 2221 ; val XK_botrightparens = 2222 ; val XK_leftmiddlecurlybrace = 2223 ; val XK_rightmiddlecurlybrace = 2224 ; val XK_topleftsummation = 2225 ; val XK_botleftsummation = 2226 ; val XK_topvertsummationconnector = 2227 ; val XK_botvertsummationconnector = 2228 ; val XK_toprightsummation = 2229 ; val XK_botrightsummation = 2230 ; val XK_rightmiddlesummation = 2231 ; val XK_lessthanequal = 2236 ; val XK_notequal = 2237 ; val XK_greaterthanequal = 2238 ; val XK_integral = 2239 ; val XK_therefore = 2240 ; val XK_variation = 2241 ; val XK_infinity = 2242 ; val XK_nabla = 2245 ; val XK_approximate = 2248 ; val XK_similarequal = 2249 ; val XK_ifonlyif = 2253 ; val XK_implies = 2254 ; val XK_identical = 2255 ; val XK_radical = 2262 ; val XK_includedin = 2266 ; val XK_includes = 2267 ; val XK_intersection = 2268 ; val XK_union = 2269 ; val XK_logicaland = 2270 ; val XK_logicalor = 2271 ; val XK_partialderivative = 2287 ; val XK_function = 2294 ; val XK_leftarrow = 2299 ; val XK_uparrow = 2300 ; val XK_rightarrow = 2301 ; val XK_downarrow = 2302 ; (* Special *) val XK_blank = 2527 ; val XK_soliddiamond = 2528 ; val XK_checkerboard = 2529 ; val XK_ht = 2530 ; val XK_ff = 2531 ; val XK_cr = 2532 ; val XK_lf = 2533 ; val XK_nl = 2536 ; val XK_vt = 2537 ; val XK_lowrightcorner = 2538 ; val XK_uprightcorner = 2539 ; val XK_upleftcorner = 2540 ; val XK_lowleftcorner = 2541 ; val XK_crossinglines = 2542 ; val XK_horizlinescan1 = 2543 ; val XK_horizlinescan3 = 2544 ; val XK_horizlinescan5 = 2545 ; val XK_horizlinescan7 = 2546 ; val XK_horizlinescan9 = 2547 ; val XK_leftt = 2548 ; val XK_rightt = 2549 ; val XK_bott = 2550 ; val XK_topt = 2551 ; val XK_vertbar = 2552 ; (* Publishing *) val XK_emspace = 2721 ; val XK_enspace = 2722 ; val XK_em3space = 2723 ; val XK_em4space = 2724 ; val XK_digitspace = 2725 ; val XK_punctspace = 2726 ; val XK_thinspace = 2727 ; val XK_hairspace = 2728 ; val XK_emdash = 2729 ; val XK_endash = 2730 ; val XK_signifblank = 2732 ; val XK_ellipsis = 2734 ; val XK_doubbaselinedot = 2735 ; val XK_onethird = 2736 ; val XK_twothirds = 2737 ; val XK_onefifth = 2738 ; val XK_twofifths = 2739 ; val XK_threefifths = 2740 ; val XK_fourfifths = 2741 ; val XK_onesixth = 2742 ; val XK_fivesixths = 2743 ; val XK_careof = 2744 ; val XK_figdash = 2747 ; val XK_leftanglebracket = 2748 ; val XK_decimalpoint = 2749 ; val XK_rightanglebracket = 2750 ; val XK_marker = 2751 ; val XK_oneeighth = 2755 ; val XK_threeeighths = 2756 ; val XK_fiveeighths = 2757 ; val XK_seveneighths = 2758 ; val XK_trademark = 2761 ; val XK_signaturemark = 2762 ; val XK_trademarkincircle = 2763 ; val XK_leftopentriangle = 2764 ; val XK_rightopentriangle = 2765 ; val XK_emopencircle = 2766 ; val XK_emopenrectangle = 2767 ; val XK_leftsinglequotemark = 2768 ; val XK_rightsinglequotemark = 2769 ; val XK_leftdoublequotemark = 2770 ; val XK_rightdoublequotemark = 2771 ; val XK_prescription = 2772 ; val XK_minutes = 2774 ; val XK_seconds = 2775 ; val XK_latincross = 2777 ; val XK_hexagram = 2778 ; val XK_filledrectbullet = 2779 ; val XK_filledlefttribullet = 2780 ; val XK_filledrighttribullet = 2781 ; val XK_emfilledcircle = 2782 ; val XK_emfilledrect = 2783 ; val XK_enopencircbullet = 2784 ; val XK_enopensquarebullet = 2785 ; val XK_openrectbullet = 2786 ; val XK_opentribulletup = 2787 ; val XK_opentribulletdown = 2788 ; val XK_openstar = 2789 ; val XK_enfilledcircbullet = 2790 ; val XK_enfilledsqbullet = 2791 ; val XK_filledtribulletup = 2792 ; val XK_filledtribulletdown = 2793 ; val XK_leftpointer = 2794 ; val XK_rightpointer = 2795 ; val XK_club = 2796 ; val XK_diamond = 2797 ; val XK_heart = 2798 ; val XK_maltesecross = 2800 ; val XK_dagger = 2801 ; val XK_doubledagger = 2802 ; val XK_checkmark = 2803 ; val XK_ballotcross = 2804 ; val XK_musicalsharp = 2805 ; val XK_musicalflat = 2806 ; val XK_malesymbol = 2807 ; val XK_femalesymbol = 2808 ; val XK_telephone = 2809 ; val XK_telephonerecorder = 2810 ; val XK_phonographcopyright = 2811 ; val XK_caret = 2812 ; val XK_singlelowquotemark = 2813 ; val XK_doublelowquotemark = 2814 ; val XK_cursor = 2815 ; (* APL *) val XK_leftcaret = 2979 ; val XK_rightcaret = 2982 ; val XK_downcaret = 2984 ; val XK_upcaret = 2985 ; val XK_overbar = 3008 ; val XK_downtack = 3010 ; val XK_upshoe = 3011 ; val XK_downstile = 3012 ; val XK_underbar = 3014 ; val XK_jot = 3018 ; val XK_quad = 3020 ; val XK_uptack = 3022 ; val XK_circle = 3023 ; val XK_upstile = 3027 ; val XK_downshoe = 3030 ; val XK_rightshoe = 3032 ; val XK_leftshoe = 3034 ; val XK_lefttack = 3036 ; val XK_righttack = 3068 ; (* Hebrew *) val XK_hebrew_doublelowline = 3295 ; val XK_hebrew_aleph = 3296 ; val XK_hebrew_bet = 3297 ; val XK_hebrew_beth = 3297 ; val XK_hebrew_gimel = 3298 ; val XK_hebrew_gimmel = 3298 ; val XK_hebrew_dalet = 3299 ; val XK_hebrew_daleth = 3299 ; val XK_hebrew_he = 3300 ; val XK_hebrew_waw = 3301 ; val XK_hebrew_zain = 3302 ; val XK_hebrew_zayin = 3302 ; val XK_hebrew_chet = 3303 ; val XK_hebrew_het = 3303 ; val XK_hebrew_tet = 3304 ; val XK_hebrew_teth = 3304 ; val XK_hebrew_yod = 3305 ; val XK_hebrew_finalkaph = 3306 ; val XK_hebrew_kaph = 3307 ; val XK_hebrew_lamed = 3308 ; val XK_hebrew_finalmem = 3309 ; val XK_hebrew_mem = 3310 ; val XK_hebrew_finalnun = 3311 ; val XK_hebrew_nun = 3312 ; val XK_hebrew_samech = 3313 ; val XK_hebrew_samekh = 3313 ; val XK_hebrew_ayin = 3314 ; val XK_hebrew_finalpe = 3315 ; val XK_hebrew_pe = 3316 ; val XK_hebrew_finalzade = 3317 ; val XK_hebrew_finalzadi = 3317 ; val XK_hebrew_zade = 3318 ; val XK_hebrew_zadi = 3318 ; val XK_hebrew_qoph = 3319 ; val XK_hebrew_kuf = 3319 ; val XK_hebrew_resh = 3320 ; val XK_hebrew_shin = 3321 ; val XK_hebrew_taw = 3322 ; val XK_hebrew_taf = 3322 ; val XK_Hebrew_switch = 65406 ; end (* XKeySyms *) ; polyml-5.6/mlsource/extra/XWindows/XTYPES_SIG.ML000066400000000000000000000021141265146633400214360ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) signature XTYPES_SIG = sig (* abstypes *) type Colormap ; type Cursor ; type Display ; type Drawable ; type Font ; type GC ; type Visual ; (* Geometry *) datatype XPoint = XPoint of { x:int,y:int } ; eqtype XRectangle ; end ; polyml-5.6/mlsource/extra/XWindows/XWINDOWS_R2_SIG.ML000066400000000000000000000133321265146633400222330ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* Grabbing *) eqtype GrabMode ; val GrabModeSync: GrabMode ; val GrabModeAsync: GrabMode ; eqtype GrabStatus ; val GrabSuccess: GrabStatus ; val AlreadyGrabbed: GrabStatus ; val GrabInvalidTime: GrabStatus ; val GrabNotViewable: GrabStatus ; val GrabFrozen: GrabStatus ; (* val XChangeActivePointerGrab: EventMask list -> Cursor -> int -> unit ; *) (* val XGrabButton: ButtonName -> Modifier list -> Drawable -> bool -> EventMask list -> GrabMode -> GrabMode -> Drawable -> Cursor -> unit ; *) (* val XGrabKey: int -> Modifier list -> Drawable -> bool -> GrabMode -> GrabMode -> unit ; *) (* val XGrabKeyboard: Drawable -> bool -> GrabMode -> GrabMode -> int -> GrabStatus ; *) (* val XGrabPointer: Drawable -> bool -> EventMask list -> GrabMode -> GrabMode -> Drawable -> Cursor -> int -> GrabStatus ; *) (* val XGrabServer: unit -> unit ; *) (* val XUngrabButton: ButtonName -> Modifier list -> Drawable -> unit ; *) (* val XUngrabKey: int -> Modifier list -> Drawable -> unit ; *) (* val XUngrabKeyboard: int -> unit ; *) (* val XUngrabPointer: int -> unit ; *) (* val XUngrabServer: unit -> unit ; *) val CurrentTime: int ; (* Keyboard *) eqtype AutoRepeatMode ; val AutoRepeatModeOff: AutoRepeatMode ; val AutoRepeatModeOn: AutoRepeatMode ; val AutoRepeatModeDefault: AutoRepeatMode ; datatype XKeyboardControl = KBKeyClickPercent of int | KBBellPercent of int | KBBellPitch of int | KBBellDuration of int | KBLed of int | KBLedMode of bool | KBKey of int | KBAutoRepeatMode of AutoRepeatMode ; datatype XKeyboardState = XKeyboardState of { keyClickPercent: int, bellPercent: int, bellPitch: int, bellDuration: int, leds: bool list, (* 32 bools *) autoRepeats: bool list, (* 256 bools *) globalAutoRepeat: AutoRepeatMode } ; datatype XModifierKeymap = XModifierKeymap of int (* maxKeysPerModifier *) * int list list ; (* 8 by maxKeysPerModifier keycodes *) eqtype MapIndex ; val ShiftMapIndex: MapIndex ; val LockMapIndex: MapIndex ; val ControlMapIndex: MapIndex ; val Mod1MapIndex: MapIndex ; val Mod2MapIndex: MapIndex ; val Mod3MapIndex: MapIndex ; val Mod4MapIndex: MapIndex ; val Mod5MapIndex: MapIndex ; eqtype MapStatus ; val MappingSuccess: MapStatus ; val MappingBusy: MapStatus ; val MappingFailed: MapStatus ; (* val XChangeKeyboardControl: XKeyboardControl list -> unit ; *) (* val XChangeKeyboardMapping: int -> int -> int list -> unit ; *) (* val XDeleteModifiermapEntry: XModifierKeymap -> int -> MapIndex -> unit ; *) (* val XGetKeyboardControl: unit -> XKeyboardState ; *) (* val XGetKeyboardMapping: int -> int -> int list ; *) (* val XGetModifierMapping: unit -> XModifierKeymap ; *) (* val XInsertModifiermapEntry: XModifierKeymap -> int -> MapIndex -> XModifierKeymap ; *) (* val XKeycodeToKeysym: int -> int -> int ; *) (* val XKeysymToKeycode: int -> int ; *) (* val XKeysymToString: int -> string ; *) (* val XLookupKeysym: int -> MapIndex -> int ; *) (* val XNewModifiermap: int -> XModifierKeymap ; *) (* val XQueryKeymap: unit -> bool list ; (* 256 bools *) *) (* val XRebindKeysym: int -> int list -> string -> unit ; *) (* val XRefreshKeyboardMapping: XMappingEvent -> unit ; *) (* val XSetModifierMapping: XModifierKeymap -> MapStatus ; *) (* val XStringToKeysym: string -> int ; *) (* Pointers *) (* val XChangePointerControl: bool -> bool -> int -> int -> int -> unit ; *) (* val XGetPointerControl: unit -> (int * int * int) ; *) (* val XGetPointerMapping: int -> int list ; *) (* val XSetPointerMapping: int list -> MapStatus ; *) (* val XWarpPointer: Drawable -> Drawable -> XRectangle -> XPoint -> unit ; *) (* Save Set *) eqtype SetMode ; val SetModeInsert: SetMode ; val SetModeDelete: SetMode ; (* val XAddToSaveSet: Drawable -> unit ; *) (* val XChangeSaveSet: Drawable -> SetMode -> unit ; *) (* val XRemoveFromSaveSet: Drawable -> unit ; *) polyml-5.6/mlsource/extra/XWindows/XWINDOWS_SIG.ML000066400000000000000000001056771265146633400217060ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (****************************************************************************** ****************************************************************************** *** *** *** Copyright (c) Abstract Hardware Limited 1988 - 1994 *** *** *** *** Copyright (c) 1987 Digital Equipment Corporation *** *** Copyright (c) 1987 Massachusetts Institute of Technology *** *** *** *** All Rights Reserved *** *** *** *** Permission to use, copy, modify, and distribute this signature and *** *** its documentation for any purpose and without fee is hereby granted, *** *** provided that the above copyright notices appear in all copies and *** *** that both the copyright notices and this permission notice appear in *** *** supporting documentation, and that the names of Digital, MIT and AHL *** *** not be used in advertising or publicity pertaining to distribution of *** *** the signature without specific, written prior permission. Digital, *** *** MIT and AHL disclaim all warranties with regard to this signature, *** *** including all implied warranties of merchantability and fitness, in *** *** no event shall Digital, MIT or AHL be liable for any special, *** *** indirect or consequential damages or any damages whatsoever resulting *** *** from loss of use, data or profits, whether in an action of contract, *** *** negligence or other tortious action, arising out of or in connection *** *** with the use or performance of this signature. *** *** *** ****************************************************************************** ******************************************************************************) signature XWINDOWS_SIG = sig structure XAtoms : XATOMS_SIG; structure XCursors : XCURSORS_SIG; structure XKeySyms : XKEYSYMS_SIG; exception XWindows of string ; include XEVENT_SIG ; (* Geometry *) val Left: XRectangle -> int ; val Right: XRectangle -> int ; val Top: XRectangle -> int ; val Bottom: XRectangle -> int ; val Width: XRectangle -> int ; (* width and height are non-negative *) val Height: XRectangle -> int ; val TopLeft: XRectangle -> XPoint ; val TopRight: XRectangle -> XPoint ; val BottomLeft: XRectangle -> XPoint ; val BottomRight: XRectangle -> XPoint ; exception XRectangle of { top:int,left:int,bottom:int,right:int } ; val Rect: { left:int,right:int,top:int,bottom:int } -> XRectangle ; val Area: { x:int,y:int,w:int,h:int } -> XRectangle ; val DestructRect: XRectangle -> { left:int,right:int,top:int,bottom:int } ; val DestructArea: XRectangle -> { x:int,y:int,w:int,h:int } ; val SplitRect: XRectangle -> (XPoint * XPoint) ; val MakeRect: XPoint -> XPoint -> XRectangle ; val Reflect: XRectangle -> XRectangle ; val NegativePoint: XPoint -> XPoint ; datatype Section = Nothing | Section of XRectangle ; val Intersection: XRectangle -> XRectangle -> Section ; val Union: XRectangle -> XRectangle -> XRectangle ; val OutsetRect: int -> XRectangle -> XRectangle ; val OffsetRect: XRectangle -> XPoint -> XRectangle ; val IncludePoint: XPoint -> XRectangle -> XRectangle ; (* meant to be used as infix operators *) val AddPoint: (XPoint * XPoint) -> XPoint ; val SubtractPoint: (XPoint * XPoint) -> XPoint ; (* meant to be used as infix predicates *) val Inside: (XRectangle * XRectangle) -> bool ; val Overlap: (XRectangle * XRectangle) -> bool ; val Within: (XPoint * XRectangle) -> bool ; val LeftOf: (XPoint * XRectangle) -> bool ; val RightOf: (XPoint * XRectangle) -> bool ; val AboveOf: (XPoint * XRectangle) -> bool ; val BelowOf: (XPoint * XRectangle) -> bool ; val HorizontallyAbutting: (XRectangle * XRectangle) -> bool ; val VerticallyAbutting: (XRectangle * XRectangle) -> bool ; val origin: XPoint ; val empty: XRectangle ; (* Colorcells *) datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int } ; val Pixel: XColor -> int ; val RGB: XColor -> (int * int * int) ; val Not: int -> int ; (* infix, for not-ing pixel values *) val And: int * int -> int ; (* infix, for and-ing pixel values *) val Or: int * int -> int ; (* infix, for or-ing pixel values *) val Xor: int * int -> int ; (* infix, for xor-ing pixel values *) val >> : int * int -> int ; (* infix, for shifting pixel values *) val << : int * int -> int ; (* infix, for shifting pixel values *) val XAllocColor: Colormap -> XColor -> XColor ; val XAllocColorCells: Colormap -> bool -> int -> int -> (int list * int list) ; val XAllocColorPlanes: Colormap -> bool -> int -> int -> int -> int -> (int list * int * int * int) ; val XAllocNamedColor: Colormap -> string -> (XColor * XColor) ; val XFreeColors: Colormap -> int list -> int -> unit ; val XLookupColor: Colormap -> string -> (XColor * XColor) ; val XParseColor: Colormap -> string -> XColor ; val XQueryColor: Colormap -> int -> XColor ; val XQueryColors: Colormap -> int list -> XColor list ; val XStoreColor: Colormap -> XColor -> unit ; val XStoreColors: Colormap -> XColor list -> unit ; val XStoreNamedColor: Colormap -> string -> int -> (bool * bool * bool) -> unit ; val BlackPixel: Display -> int ; val WhitePixel: Display -> int ; (* Colormaps *) datatype AllocType = AllocNone | AllocAll ; val XCopyColormapAndFree: Colormap -> Colormap ; val XCreateColormap: Drawable -> Visual -> AllocType -> Colormap ; val XFreeColormap: Colormap -> unit ; val XInstallColormap: Colormap -> unit ; val XListInstalledColormaps: Drawable -> Colormap list ; val XSetWindowColormap: Drawable -> Colormap -> unit ; val XUninstallColormap: Colormap -> unit ; val DefaultColormap: Display -> Colormap ; val DefaultVisual: Display -> Visual ; val DisplayCells: Display -> int ; datatype VisualClass = StaticGray | GrayScale | StaticColor | PseudoColor | TrueColor | DirectColor ; val VisualClass: Visual -> VisualClass ; val VisualRedMask: Visual -> int ; val VisualGreenMask: Visual -> int ; val VisualBlueMask: Visual -> int ; (* Cursors *) val XCreateFontCursor: Display -> int -> Cursor ; val XCreateGlyphCursor: Font -> Font -> int -> int -> XColor -> XColor -> Cursor ; val XCreatePixmapCursor: Drawable -> Drawable -> XColor -> XColor -> XPoint -> Cursor ; val XDefineCursor: Drawable -> Cursor -> unit ; val XFreeCursor: Cursor -> unit ; val XQueryBestCursor: Drawable -> XRectangle -> XRectangle ; val XRecolorCursor: Cursor -> XColor -> XColor -> unit ; val XUndefineCursor: Drawable -> unit ; (* Display Specifications *) datatype ShapeClass = CursorShape | TileShape | StippleShape ; val XQueryBestSize: ShapeClass -> Drawable -> XRectangle -> XRectangle ; datatype BackingStore = NotUseful | WhenMapped | Always ; val XOpenDisplay: string -> Display ; val XStartDisplayHandler: Display -> unit ; val AllPlanes: int ; val CellsOfScreen: Display -> int ; val DefaultDepth: Display -> int ; val DisplayHeight: Display -> int ; val DisplayHeightMM: Display -> int ; val DisplayPlanes: Display -> int ; val DisplayString: Display -> string ; val DisplayWidth: Display -> int ; val DisplayWidthMM: Display -> int ; val DoesBackingStore: Display -> BackingStore ; val DoesSaveUnders: Display -> bool ; val EventMaskOfScreen: Display -> EventMask list ; val MaxCmapsOfScreen: Display -> int ; val MinCmapsOfScreen: Display -> int ; val ProtocolRevision: Display -> int ; val ProtocolVersion: Display -> int ; val ServerVendor: Display -> string ; val VendorRelease: Display -> int ; (* Drawing Primitives *) datatype XArc = XArc of XRectangle * int * int ; datatype XTextItem = XTextItem of string * int * Font ; datatype XTextItem16 = XTextItem16 of int list * int * Font ; datatype CoordMode = CoordModeOrigin | CoordModePrevious ; datatype PolyShape = Complex | Nonconvex | Convex ; val XClearArea: Drawable -> XRectangle -> bool -> unit ; val XClearWindow: Drawable -> unit ; val XCopyArea: Drawable -> Drawable -> GC -> XPoint -> XRectangle -> unit ; val XCopyPlane: Drawable -> Drawable -> GC -> XPoint -> XRectangle -> int -> unit ; val XDrawArc: Drawable -> GC -> XArc -> unit ; val XDrawArcs: Drawable -> GC -> XArc list -> unit ; val XDrawImageString: Drawable -> GC -> XPoint -> string -> unit ; val XDrawImageString16: Drawable -> GC -> XPoint -> int list -> unit ; val XDrawLine: Drawable -> GC -> XPoint -> XPoint -> unit ; val XDrawLines: Drawable -> GC -> XPoint list -> CoordMode -> unit ; val XDrawPoint: Drawable -> GC -> XPoint -> unit ; val XDrawPoints: Drawable -> GC -> XPoint list -> CoordMode -> unit ; val XDrawRectangle: Drawable -> GC -> XRectangle -> unit ; val XDrawRectangles: Drawable -> GC -> XRectangle list -> unit ; val XDrawSegments: Drawable -> GC -> (XPoint * XPoint) list -> unit ; val XDrawString: Drawable -> GC -> XPoint -> string -> unit ; val XDrawString16: Drawable -> GC -> XPoint -> int list -> unit ; val XDrawText: Drawable -> GC -> XPoint -> XTextItem list -> unit ; val XDrawText16: Drawable -> GC -> XPoint -> XTextItem16 list -> unit ; val XFillArc: Drawable -> GC -> XArc -> unit ; val XFillArcs: Drawable -> GC -> XArc list -> unit ; val XFillPolygon: Drawable -> GC -> XPoint list -> PolyShape -> CoordMode -> unit ; val XFillRectangle: Drawable -> GC -> XRectangle -> unit ; val XFillRectangles: Drawable -> GC -> XRectangle list -> unit ; (* Events *) val XSelectInput: Drawable -> EventMask list -> unit ; val XSynchronize: Display -> int -> unit ; val XSetHandler: Drawable -> ('a XEvent * 'b -> 'b) -> 'b -> (int -> 'a -> unit) ; val NullHandler: 'a XEvent * 'b -> 'b ; val CurrentTime: int ; datatype RevertCode = RevertToParent | RevertToPointerRoot | RevertToNone ; val XSetInputFocus: Display -> Drawable -> RevertCode -> int -> unit ; val XGetInputFocus: Display -> (Drawable * RevertCode) ; val XSetSelectionOwner: Display -> int -> Drawable -> int -> unit ; val XGetSelectionOwner: Display -> int -> Drawable ; val XConvertSelection: { selection:int, target:int, property:int, requestor:Drawable, time:int } -> unit ; val XSendSelectionNotify: { selection:int, target:int, property:int, requestor:Drawable, time:int } -> unit ; val XDeleteProperty: Drawable -> int -> unit ; val XInternAtom: Display -> string -> bool -> int ; val XGetAtomName: Display -> int -> string ; (* Fonts *) datatype FontDirection = FontLeftToRight | FontRightToLeft ; datatype XCharStruct = XCharStruct of { lbearing: int, rbearing: int, width: int, ascent: int, descent: int, attributes: int } ; datatype XFontStruct = XFontStruct of { font: Font, direction: FontDirection, minChar: int, maxChar: int, minByte1: int, maxByte1: int, allCharsExist: bool, defaultChar: int, minBounds: XCharStruct, maxBounds: XCharStruct, perChar: XCharStruct list, ascent: int, descent: int } ; val XFreeFont: XFontStruct -> unit ; val XGetFontPath: Display -> string list ; val XListFonts: Display -> string -> int -> string list ; val XListFontsWithInfo: Display -> string -> int -> (string list * XFontStruct list) ; val XLoadFont: Display -> string -> Font ; val XLoadQueryFont: Display -> string -> XFontStruct ; val XQueryFont: Font -> XFontStruct ; val XSetFontPath: Display -> string list -> unit ; val XUnloadFont: Font -> unit ; (* Graphics Context *) datatype GCArcMode = ArcChord | ArcPieSlice ; datatype GCOrder = Unsorted | YSorted | YXSorted | YXBanded ; datatype GCFillRule = EvenOddRule | WindingRule ; datatype GCFillStyle = FillSolid | FillTiled | FillStippled | FillOpaqueStippled ; datatype GCFunction = GXclear | GXand | GXandReverse | GXcopy | GXandInverted | GXnoop | GXxor | GXor | GXnor | GXequiv | GXinvert | GXorReverse | GXcopyInverted | GXorInverted | GXnand | GXset ; datatype GCLineStyle = LineSolid | LineOnOffDash | LineDoubleDash ; datatype GCCapStyle = CapNotLast | CapButt | CapRound | CapProjecting ; datatype GCJoinStyle = JoinMiter | JoinRound | JoinBevel ; datatype GCSubwindowMode = ClipByChildren | IncludeInferiors ; val DefaultGC: Display -> GC ; datatype XGCValue = GCFunction of GCFunction | GCPlaneMask of int | GCForeground of int | GCBackground of int | GCLineWidth of int | GCLineStyle of GCLineStyle | GCCapStyle of GCCapStyle | GCJoinStyle of GCJoinStyle | GCFillStyle of GCFillStyle | GCFillRule of GCFillRule | GCTile of Drawable | GCStipple of Drawable | GCTSOrigin of XPoint | GCFont of Font | GCSubwindowMode of GCSubwindowMode | GCGraphicsExposures of bool | GCClipOrigin of XPoint | GCClipMask of Drawable | GCDashOffset of int | GCDashList of int | GCArcMode of GCArcMode ; val XChangeGC: GC -> XGCValue list -> unit ; val XCreateGC: Drawable -> XGCValue list -> GC ; val XFreeGC: GC -> unit ; val XSetArcMode: GC -> GCArcMode -> unit ; val XSetBackground: GC -> int -> unit ; val XSetClipMask: GC -> Drawable -> unit ; val XSetClipOrigin: GC -> XPoint -> unit ; val XSetClipRectangles: GC -> XPoint -> XRectangle list -> GCOrder -> unit ; val XSetDashes: GC -> int -> int list -> unit ; val XSetFillRule: GC -> GCFillRule -> unit ; val XSetFillStyle: GC -> GCFillStyle -> unit ; val XSetFont: GC -> Font -> unit ; val XSetForeground: GC -> int -> unit ; val XSetFunction: GC -> GCFunction -> unit ; val XSetGraphicsExposures: GC -> bool -> unit ; val XSetLineAttributes: GC -> int -> GCLineStyle -> GCCapStyle -> GCJoinStyle -> unit ; val XSetPlaneMask: GC -> int -> unit ; val XSetState: GC -> int -> int -> GCFunction -> int -> unit ; val XSetStipple: GC -> Drawable -> unit ; val XSetSubwindowMode: GC -> GCSubwindowMode -> unit ; val XSetTile: GC -> Drawable -> unit ; val XSetTSOrigin: GC -> XPoint -> unit ; (* Images *) datatype ImageFormat = XYBitmap | XYPixmap | ZPixmap ; datatype ImageOrder = LSBFirst | MSBFirst ; type ImageData ; val Data: string -> ImageData ; datatype XImage = XImage of { data: ImageData, size: XRectangle, depth: int, format: ImageFormat, xoffset: int, bitmapPad: int, byteOrder: ImageOrder, bitmapUnit: int, bitsPerPixel: int, bytesPerLine: int, visualRedMask: int, bitmapBitOrder: ImageOrder, visualBlueMask: int, visualGreenMask: int } ; val XAddPixel: Display -> XImage -> int -> unit ; val XCreateImage: Visual -> int -> ImageFormat -> int -> string -> XRectangle -> int -> int -> XImage ; val XGetImage: Drawable -> XRectangle -> int -> ImageFormat -> XImage ; val XGetPixel: Display -> XImage -> XPoint -> int ; val XGetSubImage: Drawable -> XRectangle -> int -> ImageFormat -> XImage -> XPoint -> unit ; val XPutImage: Drawable -> GC -> XImage -> XPoint -> XRectangle -> unit ; val XPutPixel: Display -> XImage -> XPoint -> int -> unit ; val XSubImage: Display -> XImage -> XRectangle -> XImage ; val BitmapBitOrder: Display -> ImageOrder ; val BitmapPad: Display -> int ; val BitmapUnit: Display -> int ; val ByteOrder: Display -> ImageOrder ; val ImageByteOrder: XImage -> ImageOrder ; val ImageSize: XImage -> XRectangle ; val ImageDepth: XImage -> int ; (* Keyboard *) (* keysym values are integers, and are defined in other signatures *) val XLookupString: Drawable -> int -> Modifier list -> (string * int) ; val XQueryKeymap: Display -> bool list ; (* 256 bools *) val IsCursorKey: int -> bool ; val IsFunctionKey: int -> bool ; val IsKeypadKey: int -> bool ; val IsMiscFunctionKey: int -> bool ; val IsModifierKey: int -> bool ; val IsPFKey: int -> bool ; (* Output Buffer *) val XFlush: Display -> unit ; val XSync: Display -> bool -> unit ; (* Pointers *) val XQueryPointer: Drawable -> (bool * Drawable * Drawable * XPoint * XPoint * Modifier list) ; (* Screen Saver *) datatype SaveMode = ScreenSaverReset | ScreenSaverActive ; datatype Blanking = DontPreferBlanking | PreferBlanking | DefaultBlanking ; datatype Exposures = DontAllowExposures | AllowExposures | DefaultExposures ; val XActivateScreenSaver: Display -> unit ; val XForceScreenSaver: Display -> SaveMode -> unit ; val XGetScreenSaver: Display -> (int * int * Blanking * Exposures) ; val XResetScreenSaver: Display -> unit ; val XSetScreenSaver: Display -> int -> int -> Blanking -> Exposures -> unit ; (* Standard Geometry *) val XTranslateCoordinates: Drawable -> Drawable -> XPoint -> XPoint * Drawable ; (* Text *) val XTextExtents: XFontStruct -> string -> (FontDirection * int * int * XCharStruct) ; val XTextExtents16: XFontStruct -> int list -> (FontDirection * int * int * XCharStruct) ; val XTextWidth: XFontStruct -> string -> int ; val XTextWidth16: XFontStruct -> int list -> int ; (* Tiles, Pixmaps, Stipples and Bitmaps *) datatype BitmapStatus = BitmapOpenFailed | BitmapFileInvalid | BitmapNoMemory | BitmapSuccess of Drawable * XRectangle * XPoint ; val XCreateBitmapFromData: Drawable -> string -> XRectangle -> Drawable ; val XCreatePixmap: Drawable -> XRectangle -> int -> Drawable ; val XCreatePixmapFromBitmapData: Drawable -> string -> XRectangle -> int -> int -> int -> Drawable ; val XFreePixmap: Drawable -> unit ; val XQueryBestStipple: Drawable -> XRectangle -> XRectangle ; val XQueryBestTile: Drawable -> XRectangle -> XRectangle ; val XReadBitmapFile: Drawable -> string -> BitmapStatus ; val XWriteBitmapFile: string -> Drawable -> XRectangle -> XPoint -> BitmapStatus ; (* User Preferences *) val XAutoRepeatOff: Display -> unit ; val XAutoRepeatOn: Display -> unit ; val XBell: Display -> int -> unit ; val XGetDefault: Display -> string -> string -> string ; (* Window Attributes *) datatype Gravity = ForgetGravity | NorthWestGravity | NorthGravity | NorthEastGravity | WestGravity | CenterGravity | EastGravity | SouthWestGravity | SouthGravity | SouthEastGravity | StaticGravity ; val UnmapGravity: Gravity ; (* same as ForgetGravity *) datatype XSetWindowAttributes = CWBackPixmap of Drawable | CWBackPixel of int | CWBorderPixmap of Drawable | CWBorderPixel of int | CWBitGravity of Gravity | CWWinGravity of Gravity | CWBackingStore of BackingStore | CWBackingPlanes of int | CWBackingPixel of int | CWOverrideRedirect of bool | CWSaveUnder of bool | CWEventMask of EventMask list | CWDontPropagate of EventMask list | CWColormap of Colormap | CWCursor of Cursor ; datatype WindowClass = CopyFromParentClass | InputOutputClass | InputOnlyClass ; datatype MapState = IsUnmapped | IsUnviewable | IsViewable ; datatype XWindowAttributes = XWindowAttributes of { position: XPoint, size: XRectangle, borderWidth: int, depth: int, visual: Visual, root: Drawable, class: WindowClass, bitGravity: Gravity, winGravity: Gravity, backingStore: BackingStore, backingPlanes: int, backingPixel: int, saveUnder: bool, colormap: Colormap, mapInstalled: bool, mapState: MapState, allEventMasks: EventMask list, yourEventMask: EventMask list, doNotPropagateMask: EventMask list, overrideRedirect: bool } ; val XChangeWindowAttributes: Drawable -> XSetWindowAttributes list -> unit ; val XGetGeometry: Drawable -> (Drawable * XPoint * XRectangle * int * int) ; val XGetWindowAttributes: Drawable -> XWindowAttributes ; val XSetWindowBackground: Drawable -> int -> unit ; val XSetWindowBackgroundPixmap: Drawable -> Drawable -> unit ; val XSetWindowBorder: Drawable -> int -> unit ; val XSetWindowBorderPixmap: Drawable -> Drawable -> unit ; val XSetWindowBorderWidth: Drawable -> int -> unit ; (* Window Configuration *) datatype CirculateDirection = RaiseLowest | LowerHighest ; datatype XWindowChanges = CWPosition of XPoint | CWSize of XRectangle | CWBorderWidth of int | CWStackMode of StackMode | CWSibling of Drawable ; val XCirculateSubwindows: Drawable -> CirculateDirection -> unit ; val XCirculateSubwindowsDown: Drawable -> unit ; val XCirculateSubwindowsUp: Drawable -> unit ; val XConfigureWindow: Drawable -> XWindowChanges list -> unit ; val XLowerWindow: Drawable -> unit ; val XMapRaised: Drawable -> unit ; val XMapSubwindows: Drawable -> unit ; val XMapWindow: Drawable -> unit ; val XMoveResizeWindow: Drawable -> XPoint -> XRectangle -> unit ; val XMoveWindow: Drawable -> XPoint -> unit ; val XQueryTree: Drawable -> (Drawable * Drawable * Drawable list) ; val XRaiseWindow: Drawable -> unit ; val XReparentWindow: Drawable -> Drawable -> XPoint -> unit ; val XResizeWindow: Drawable -> XRectangle -> unit ; val XRestackWindows: Drawable list -> unit ; val XUnmapSubwindows: Drawable -> unit ; val XUnmapWindow: Drawable -> unit ; (* Window Existence *) val NoDrawable: Drawable ; val NoCursor: Cursor ; val NoFont: Font ; val NoColormap: Colormap ; val NoVisual: Visual ; val ParentRelative: Drawable ; val CopyFromParentDrawable: Drawable ; val CopyFromParentVisual: Visual ; val PointerWindow: Drawable ; val InputFocus: Drawable ; val PointerRoot: Drawable ; val NoSymbol: int ; val AnyKey: int ; val RootWindow: Display -> Drawable ; val XDestroyWindow: Drawable -> unit ; val XDestroySubwindows: Drawable -> unit ; val XCreateSimpleWindow: Drawable -> XPoint -> XRectangle -> int -> int -> int -> Drawable ; val XCreateWindow: Drawable -> XPoint -> XRectangle -> int -> int -> WindowClass -> Visual -> XSetWindowAttributes list -> Drawable ; (* Window Manager *) datatype XWMStateHint = DontCareState | NormalState | ZoomState | IconicState | InactiveState ; datatype XWMHint = InputHint of bool | StateHint of XWMStateHint | IconPixmapHint of Drawable | IconWindowHint of Drawable | IconPositionHint of XPoint | IconMaskHint of Drawable ; datatype XWMSizeHint = PPosition of XPoint | PSize of XRectangle | PMinSize of XRectangle | PMaxSize of XRectangle | PResizeInc of XRectangle | PAspect of XPoint * XPoint | PBaseSize of XRectangle | PWinGravity of Gravity ; datatype XStandardColormap = XStandardColormap of { colormap: Colormap, redMax: int, redMult: int, greenMax: int, greenMult: int, blueMax: int, blueMult: int, basePixel: int, visual: Visual } ; datatype PropertyValue = PropertyArc of XArc list | PropertyAtom of int list | PropertyBitmap of Drawable list | PropertyColormap of Colormap list | PropertyCursor of Cursor list | PropertyDrawable of Drawable list | PropertyFont of Font list | PropertyInteger of int list | PropertyPixmap of Drawable list | PropertyPoint of XPoint list | PropertyRectangle of XRectangle list | PropertyRGBColormap of XStandardColormap list | PropertyString of string | PropertyVisual of Visual list | PropertyWindow of Drawable list | PropertyWMHints of XWMHint list | PropertyWMSizeHints of XWMSizeHint list | PropertyWMIconSizes of (XRectangle * XRectangle * XRectangle) list ; val XSetProperty: Drawable -> int -> PropertyValue -> int -> unit ; val XGetTextProperty: Drawable -> int -> (string * int * int * int) ; val XGetWMName: Drawable -> string ; val XGetWMIconName: Drawable -> string ; val XGetWMClientMachine: Drawable -> string ; val XSetWMName: Drawable -> string -> unit ; val XSetWMIconName: Drawable -> string -> unit ; val XSetWMClientMachine: Drawable -> string -> unit ; val XGetWMCommand: Drawable -> string list ; val XGetWMClass: Drawable -> string list ; val XSetWMCommand: Drawable -> string list -> unit ; val XSetWMClass: Drawable -> string list -> unit ; val XSetWMHints: Drawable -> XWMHint list -> unit ; val XGetWMHints: Drawable -> XWMHint list ; val XSetWMSizeHints: Drawable -> int -> XWMSizeHint list -> unit ; val XGetWMSizeHints: Drawable -> int -> XWMSizeHint list ; val XSetWMNormalHints: Drawable -> XWMSizeHint list -> unit ; val XGetWMNormalHints: Drawable -> XWMSizeHint list ; val XWMGeometry: Display -> string -> string -> int -> XWMSizeHint list -> XPoint * XRectangle * Gravity ; val XSetWMProperties: Drawable -> string -> string -> string list -> XWMSizeHint list -> XWMHint list -> string list -> unit ; val XSetIconSizes: Drawable -> (XRectangle * XRectangle * XRectangle) list -> unit ; val XGetIconSizes: Drawable -> (XRectangle * XRectangle * XRectangle) list ; val XSetTransientForHint: Drawable -> Drawable -> unit ; val XGetTransientForHint: Drawable -> Drawable ; val XSetWMColormapWindows: Drawable -> Drawable list -> unit ; val XGetWMColormapWindows: Drawable -> Drawable list ; val XSetRGBColormaps: Drawable -> int -> XStandardColormap list -> unit ; val XGetRGBColormaps: Drawable -> int -> XStandardColormap list ; (* Miscellaneous and Convenience functions *) val ColormapID: Colormap -> int ; (* id numbers for X resources *) val CursorID: Cursor -> int ; (* two X resources with the same id are the same resource *) val DrawableID: Drawable -> int ; val FontID: Font -> int ; val GCID: GC -> int ; val VisualID: Visual -> int ; val SameDrawable: Drawable -> Drawable -> bool ; val ColormapDisplay: Colormap -> Display ; (* Display associated with X resource *) val CursorDisplay: Cursor -> Display ; val DrawableDisplay: Drawable -> Display ; val FontDisplay: Font -> Display ; val GCDisplay: GC -> Display ; val VisualDisplay: Visual -> Display ; val ColormapExists: Colormap -> bool ; (* value brought across from previous session *) val CursorExists: Cursor -> bool ; val DrawableExists: Drawable -> bool ; val FontExists: Font -> bool ; val GCExists: GC -> bool ; val VisualExists: Visual -> bool ; val DisplayExists: Display -> bool ; val XSetColors: GC -> int -> int -> unit ; (* set foreground and background *) val XGetWindowRoot: Drawable -> Drawable ; (* root from XGetGeometry *) val XGetWindowPosition: Drawable -> XPoint ; (* position from XGetGeometry *) val XGetWindowSize: Drawable -> XRectangle ; (* size from XGetGeometry *) val XGetWindowBorderWidth: Drawable -> int ; (* border width from XGetGeometry *) val XGetWindowDepth: Drawable -> int ; (* depth from XGetGeometry *) val XGetWindowParent: Drawable -> Drawable ; (* parent from XQueryTree *) val XGetWindowChildren: Drawable -> Drawable list ; (* children from XQueryTree *) val GetTimeOfDay: unit -> int * int ; val FSFont: XFontStruct -> Font ; val FSDirection: XFontStruct -> FontDirection ; val FSMinChar: XFontStruct -> int ; val FSMaxChar: XFontStruct -> int ; val FSMinByte1: XFontStruct -> int ; val FSMaxByte1: XFontStruct -> int ; val FSAllCharsExist: XFontStruct -> bool ; val FSDefaultChar: XFontStruct -> int ; val FSMinBounds: XFontStruct -> XCharStruct ; val FSMaxBounds: XFontStruct -> XCharStruct ; val FSPerChar: XFontStruct -> XCharStruct list ; val FSAscent: XFontStruct -> int ; val FSDescent: XFontStruct -> int ; val CharLBearing: XCharStruct -> int ; val CharRBearing: XCharStruct -> int ; val CharWidth: XCharStruct -> int ; val CharAscent: XCharStruct -> int ; val CharDescent: XCharStruct -> int ; val CharAttributes: XCharStruct -> int ; val FSMinWidth: XFontStruct -> int ; val FSMaxWidth: XFontStruct -> int ; val FSMinHeight: XFontStruct -> int ; val FSMaxHeight: XFontStruct -> int ; val ShiftDown: Modifier list -> bool ; val ControlDown: Modifier list -> bool ; end (* XWINDOWS_SIG *) ; polyml-5.6/mlsource/extra/XWindows/ml_bind.ML000066400000000000000000003257731265146633400213270ustar00rootroot00000000000000(* Copyright (c) 2000 Cambridge University Technical Services Limited This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) structure XWindows: XWINDOWS_SIG = struct local open XCall; open XAtoms; in structure XAtoms = XAtoms; structure XCursors = XCursors; structure XKeySyms = XKeySyms; exception XWindows = XWindows; (* abstypes *) abstype Colormap = Colormap with end; abstype Cursor = Cursor with end; abstype Display = Display with end; abstype Drawable = Drawable with end; abstype Font = Font with end; abstype GC = GC with end; abstype Visual = Visual with end; (* Geometry *) datatype XPoint = XPoint of { x:int,y:int }; datatype XRectangle = R of { top:int,left:int,bottom:int,right:int }; fun Left (R {left,...}) = left; fun Right (R {right,...}) = right; fun Top (R {top,...}) = top; fun Bottom (R {bottom,...}) = bottom; fun Width (R {right,left,...}) = right - left; fun Height (R {top,bottom,...}) = bottom - top; fun TopLeft (R {top,left,...}) = XPoint { x=left ,y=top }; fun TopRight (R {top,right,...}) = XPoint { x=right,y=top }; fun BottomLeft (R {bottom,left,...}) = XPoint { x=left ,y=bottom }; fun BottomRight (R {bottom,right,...}) = XPoint { x=right,y=bottom }; exception XRectangle of { top:int,left:int,bottom:int,right:int }; fun Rect (rect as {left,top,right,bottom}) = ( if left <= right andalso top <= bottom then R rect else raise XRectangle rect ); fun Area {x,y,w,h} = Rect { left = x, top = y, right = x+w, bottom = y+h }; fun DestructRect (R rect) = rect; fun DestructArea rect = let val {left,top,right,bottom} = DestructRect rect; in { x = left, y = top, w = right-left, h = bottom-top } end; fun SplitRect rect = let val { top,left,bottom,right } = DestructRect rect; in (XPoint { x = left, y = top }, XPoint { x = right, y = bottom }) end; fun min a b : int = if a < b then a else b; fun max a b : int = if a > b then a else b; fun MakeRect p1 p2 = let val (XPoint{x=x1,y=y1}) = p1; val (XPoint{x=x2,y=y2}) = p2; in Rect { left = min x1 x2, top = min y1 y2, right = max x1 x2, bottom = max y1 y2 } end; fun Reflect rect = let val {top,left,bottom,right} = DestructRect rect; in Rect { left = top, top = left, right = bottom, bottom = right } end; fun NegativePoint (XPoint{x,y}) = XPoint { x = ~x, y = ~y }; datatype Section = Nothing | Section of XRectangle; fun Intersection r1 r2 = let val ML = max (Left r1) (Left r2); val MT = max (Top r1) (Top r2); val MR = min (Right r1) (Right r2); val MB = min (Bottom r1) (Bottom r2); in if MR > ML andalso MB > MT then Section (Rect { left = ML, top = MT, right = MR, bottom = MB }) else Nothing end; fun Union r1 r2 = let val ML = min (Left r1) (Left r2); val MT = min (Top r1) (Top r2); val MR = max (Right r1) (Right r2); val MB = max (Bottom r1) (Bottom r2); in Rect { left = ML, top = MT, right = MR, bottom = MB } end; fun OutsetRect dist rect = let val { top,left,bottom,right } = DestructRect rect; in Rect { left = left - dist, top = top - dist, right = right + dist, bottom = bottom + dist } end; fun OffsetRect rect (XPoint{x,y}) = let val { top,left,bottom,right } = DestructRect rect; in Rect { left = left + x, top = top + y, right = right + x, bottom = bottom + y } end; fun IncludePoint (XPoint{x,y}) rect = let val { top,left,bottom,right } = DestructRect rect; in Rect { left = min x left, top = min y top, right = max x right, bottom = max y bottom } end; infix AddPoint SubtractPoint; fun (XPoint{x,y}) AddPoint (XPoint{x=dx,y=dy}) = ( XPoint { x = x + dx, y = y + dy } ); fun (XPoint{x,y}) SubtractPoint (XPoint{x=dx,y=dy}) = ( XPoint { x = x - dx, y = y - dy } ); infix Inside Overlap Within LeftOf RightOf AboveOf BelowOf HorizontallyAbutting VerticallyAbutting; fun r1 Inside r2 = ( Left r1 >= Left r2 andalso Right r1 <= Right r2 andalso Top r1 >= Top r2 andalso Bottom r1 <= Bottom r2 ); fun r1 Overlap r2 = (case (Intersection r1 r2) of Nothing => false | Section _ => true); fun (XPoint{x,y}) Within rect = ( x >= Left rect andalso y >= Top rect andalso x < Right rect andalso y < Bottom rect ); fun (XPoint{x,y}) LeftOf rect = (x < Left rect); fun (XPoint{x,y}) RightOf rect = (x >= Right rect); fun (XPoint{x,y}) AboveOf rect = (y < Top rect); fun (XPoint{x,y}) BelowOf rect = (y >= Bottom rect); fun a HorizontallyAbutting b = ( (Right a = Left b orelse Left a = Right b) andalso (Top a <= Top b) andalso (Bottom a >= Bottom b) ); fun a VerticallyAbutting b = ( (Bottom a = Top b orelse Top a = Bottom b) andalso (Left a <= Left b) andalso (Right a >= Right b) ); val origin = XPoint { x=0,y=0 }; val empty = Area {x=0,y=0,w=0,h=0}; val a1 = Area { x=0,y=0,w=1,h=1 }; (* Colorcells 100 *) datatype XColor = XColor of { doRed: bool, doGreen: bool, doBlue: bool, red: int, green: int, blue: int, pixel: int }; fun Pixel (XColor {pixel,...}) = pixel; fun RGB (XColor {red,green,blue,...}) = (red,green,blue); fun Not (a:int):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_Not,a); infix 9 And Or Xor >> <<; fun a And b = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_And,a:int,b:int):int; fun a Or b = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_Or,a:int,b:int):int; fun a Xor b = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_Xor,a:int,b:int):int; fun a >> b = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DownShift,a:int,b:int):int; fun a << b = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpShift,a:int,b:int):int; fun XAllocColor (cmap:Colormap) (x:XColor):XColor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAllocColor,cmap,x); fun XAllocColorCells (cmap:Colormap) (contig:bool) (nplanes:int) (ncolors:int):(int list * int list) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAllocColorCells,cmap,contig,nplanes,ncolors); fun XAllocColorPlanes (cmap:Colormap) (contig:bool) (ncolors:int) (nreds:int) (ngreens:int) (nblues:int):(int list * int * int * int) = ( RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAllocColorPlanes,cmap,contig,ncolors,nreds,ngreens,nblues) ); fun XAllocNamedColor (cmap:Colormap) (name:string):(XColor * XColor) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAllocNamedColor,cmap,name); fun XFreeColors (cmap:Colormap) (pixels:int list) (planes:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFreeColors,cmap,pixels,planes); fun XLookupColor (cmap:Colormap) (name:string):(XColor * XColor) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XLookupColor,cmap,name); fun XParseColor (cmap:Colormap) (name:string):XColor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XParseColor,cmap,name); fun XQueryColor (cmap:Colormap) (pixel:int):XColor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryColor,cmap,pixel); fun XQueryColors (cmap:Colormap) (pixels:int list):XColor list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryColors,cmap,pixels); fun XStoreColor (cmap:Colormap) (x:XColor):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XStoreColor,cmap,x); fun XStoreColors (cmap:Colormap) (L:XColor list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XStoreColors,cmap,L); fun XStoreNamedColor (cmap:Colormap) (name:string) (pixel:int) (r:bool,g:bool,b:bool):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XStoreNamedColor,cmap,name,pixel,r,g,b); fun BlackPixel (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_BlackPixel,d); fun WhitePixel (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_WhitePixel,d); (* Colormaps 150 *) datatype AllocType = AllocNone | AllocAll; fun fromAllocType AllocNone = 0 | fromAllocType AllocAll = 1; datatype XStandardColormap = XStandardColormap of { colormap: Colormap, redMax: int, redMult: int, greenMax: int, greenMult: int, blueMax: int, blueMult: int, basePixel: int }; fun XCopyColormapAndFree (cmap:Colormap):Colormap = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCopyColormapAndFree,cmap); fun XCreateColormap (d:Drawable) (v:Visual) (a:AllocType):Colormap = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateColormap,d,v,fromAllocType a); fun XInstallColormap (cmap:Colormap):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XInstallColormap,cmap); fun XListInstalledColormaps (d:Drawable):Colormap list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XListInstalledColormaps,d); fun XUninstallColormap (cmap:Colormap):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XUninstallColormap,cmap); fun DefaultColormap (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DefaultColormap,d) : Colormap; fun DefaultVisual (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DefaultVisual,d) : Visual; fun DisplayCells (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayCells,d) : int; datatype VisualClass = StaticGray | GrayScale | StaticColor | PseudoColor | TrueColor | DirectColor; fun VisualClass (v:Visual) = case RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_VisualClass,v) of 0 => StaticGray | 1 => GrayScale | 2 => StaticColor | 3 => PseudoColor | 4 => TrueColor | _ => DirectColor; fun VisualRedMask (v:Visual):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_VisualRedMask,v); fun VisualGreenMask (v:Visual):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_VisualGreenMask,v); fun VisualBlueMask (v:Visual):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_VisualBlueMask,v); (* Cursors 200 *) fun XCreateFontCursor (d:Display) (n:int):Cursor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateFontCursor,d,n); fun XCreateGlyphCursor (sf:Font) (mf:Font) (sc:int) (mc:int) (fg:XColor) (bg:XColor):Cursor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateGlyphCursor,sf,mf,sc,mc,fg,bg); fun XCreatePixmapCursor (src:Drawable) (mask:Drawable) (fg:XColor) (bg:XColor) (hotspot:XPoint):Cursor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreatePixmapCursor,src,mask,fg,bg,hotspot); fun XDefineCursor (d:Drawable) (c:Cursor):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows(XCALL_XDefineCursor,d,c); fun XQueryBestCursor (d:Drawable) (r:XRectangle):XRectangle = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryBestCursor,d,r); fun XRecolorCursor (c:Cursor) (fg:XColor) (bg:XColor) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XRecolorCursor,c,fg,bg); fun XUndefineCursor (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XUndefineCursor,d); (* Display Specifications 250 *) datatype BackingStore = NotUseful | WhenMapped | Always; fun toBackingStore 0 = NotUseful | toBackingStore 1 = WhenMapped | toBackingStore _ = Always; fun fromBackingStore NotUseful = 0 | fromBackingStore WhenMapped = 1 | fromBackingStore Always = 2; datatype EventMask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | ButtonMotionMask | KeymapStateMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ResizeRedirectMask | SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask | ButtonClickMask (* extra event mask *); exception BadEventMask of int; fun toEventMask n = let fun MaskName 1 = KeyPressMask | MaskName 2 = KeyReleaseMask | MaskName 4 = ButtonPressMask | MaskName 8 = ButtonReleaseMask | MaskName 16 = EnterWindowMask | MaskName 32 = LeaveWindowMask | MaskName 64 = PointerMotionMask | MaskName 128 = PointerMotionHintMask | MaskName 256 = Button1MotionMask | MaskName 512 = Button2MotionMask | MaskName 1024 = Button3MotionMask | MaskName 2048 = Button4MotionMask | MaskName 4096 = Button5MotionMask | MaskName 8192 = ButtonMotionMask | MaskName 16384 = KeymapStateMask | MaskName 32768 = ExposureMask | MaskName 65536 = VisibilityChangeMask | MaskName 131072 = StructureNotifyMask | MaskName 262144 = ResizeRedirectMask | MaskName 524288 = SubstructureNotifyMask | MaskName 1048576 = SubstructureRedirectMask | MaskName 2097152 = FocusChangeMask | MaskName 4194304 = PropertyChangeMask | MaskName 8388608 = ColormapChangeMask | MaskName 16777216 = OwnerGrabButtonMask | MaskName 2147483648 = ButtonClickMask (* extra event mask *) | MaskName n = raise BadEventMask n; fun ShiftAndMask 0 mask acc = acc | ShiftAndMask n mask acc = ShiftAndMask (n And Not mask) (mask << 1) (if (n And mask) <> 0 then MaskName mask :: acc else acc); in ShiftAndMask n 1 [] end; fun fromEventMask list = let fun MaskBit KeyPressMask = 1 | MaskBit KeyReleaseMask = 2 | MaskBit ButtonPressMask = 4 | MaskBit ButtonReleaseMask = 8 | MaskBit EnterWindowMask = 16 | MaskBit LeaveWindowMask = 32 | MaskBit PointerMotionMask = 64 | MaskBit PointerMotionHintMask = 128 | MaskBit Button1MotionMask = 256 | MaskBit Button2MotionMask = 512 | MaskBit Button3MotionMask = 1024 | MaskBit Button4MotionMask = 2048 | MaskBit Button5MotionMask = 4096 | MaskBit ButtonMotionMask = 8192 | MaskBit KeymapStateMask = 16384 | MaskBit ExposureMask = 32768 | MaskBit VisibilityChangeMask = 65536 | MaskBit StructureNotifyMask = 131072 | MaskBit ResizeRedirectMask = 262144 | MaskBit SubstructureNotifyMask = 524288 | MaskBit SubstructureRedirectMask = 1048576 | MaskBit FocusChangeMask = 2097152 | MaskBit PropertyChangeMask = 4194304 | MaskBit ColormapChangeMask = 8388608 | MaskBit OwnerGrabButtonMask = 16777216 | MaskBit ButtonClickMask = 2147483648 Or MaskBit ButtonPressMask Or MaskBit ButtonReleaseMask (* extra event mask *); fun OrTogether [] acc = acc | OrTogether (H::T) acc = OrTogether T (MaskBit H Or acc); in OrTogether list 0 end; val AllPlanes = Not 0; fun CellsOfScreen (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_CellsOfScreen,d) : int; fun DefaultDepth (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DefaultDepth,d) : int; fun DisplayHeight (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayHeight,d) : int; fun DisplayHeightMM (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayHeightMM,d) : int; fun DisplayPlanes (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayPlanes,d) : int; fun DisplayString (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayString,d) : string; fun DisplayWidth (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayWidth,d) : int; fun DisplayWidthMM (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DisplayWidthMM,d) : int; fun DoesBackingStore (d:Display) = toBackingStore (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DoesBackingStore,d)); fun DoesSaveUnders (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DoesSaveUnders,d) : bool; fun EventMaskOfScreen (d:Display) = toEventMask (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_EventMaskOfScreen,d)); fun MaxCmapsOfScreen (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_MaxCmapsOfScreen,d) : int; fun MinCmapsOfScreen (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_MinCmapsOfScreen,d) : int; fun ProtocolRevision (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ProtocolRevision,d) : int; fun ProtocolVersion (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ProtocolVersion,d) : int; fun ServerVendor (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ServerVendor,d) : string; fun VendorRelease (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_VendorRelease,d) : int; (* Drawing Primitives 300 *) datatype XArc = XArc of XRectangle * int * int; datatype XTextItem = XTextItem of string * int * Font; datatype XTextItem16 = XTextItem16 of int list * int * Font; datatype CoordMode = CoordModeOrigin | CoordModePrevious; fun fromCoordMode CoordModeOrigin = 0 | fromCoordMode CoordModePrevious = 1; datatype PolyShape = Complex | Nonconvex | Convex; fun fromPolyShape Complex = 0 | fromPolyShape Nonconvex = 1 | fromPolyShape Convex = 2; fun XClearArea (d:Drawable) (r:XRectangle) (e:bool):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XClearArea,d,r,e); fun XClearWindow (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XClearWindow,d); fun XCopyArea (src:Drawable) (dst:Drawable) (gc:GC) (P:XPoint) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCopyArea,src,dst,gc,P,r); fun XCopyPlane (src:Drawable) (dst:Drawable) (gc:GC) (P:XPoint) (r:XRectangle) (plane:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCopyPlane,src,dst,gc,P,r,plane); fun XDrawArc (d:Drawable) (gc:GC) (a:XArc):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawArc,d,gc,a); fun XDrawArcs (d:Drawable) (gc:GC) (L:XArc list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawArcs,d,gc,L); fun XDrawImageString (d:Drawable) (gc:GC) (p:XPoint) (s:string):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawImageString,d,gc,p,s); fun XDrawImageString16 (d:Drawable) (gc:GC) (p:XPoint) (L:int list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawImageString16,d,gc,p,L); fun XDrawLine (d:Drawable) (gc:GC) (p1:XPoint) (p2:XPoint):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawLine,d,gc,p1,p2); fun XDrawLines (d:Drawable) (gc:GC) (L:XPoint list) (mode:CoordMode):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawLines,d,gc,L,fromCoordMode mode); fun XDrawPoint (d:Drawable) (gc:GC) (p:XPoint):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawPoint,d,gc,p); fun XDrawPoints (d:Drawable) (gc:GC) (L:XPoint list) (mode:CoordMode):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawPoints,d,gc,L,fromCoordMode mode); fun XDrawRectangle (d:Drawable) (gc:GC) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawRectangle,d,gc,r); fun XDrawRectangles (d:Drawable) (gc:GC) (L:XRectangle list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawRectangles,d,gc,L); fun XDrawSegments (d:Drawable) (gc:GC) (L:(XPoint * XPoint) list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawSegments,d,gc,L); fun XDrawString (d:Drawable) (gc:GC) (p:XPoint) (s:string):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawString,d,gc,p,s); fun XDrawString16 (d:Drawable) (gc:GC) (p:XPoint) (s:int list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawString16,d,gc,p,s); fun XDrawText (d:Drawable) (gc:GC) (p:XPoint) (L:XTextItem list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawText,d,gc,p,L); fun XDrawText16 (d:Drawable) (gc:GC) (p:XPoint) (L:XTextItem16 list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDrawText16,d,gc,p,L); fun XFillArc (d:Drawable) (gc:GC) (a:XArc):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFillArc,d,gc,a); fun XFillArcs (d:Drawable) (gc:GC) (L:XArc list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFillArcs,d,gc,L); fun XFillPolygon (d:Drawable) (gc:GC) (L:XPoint list) (shape:PolyShape) (mode:CoordMode):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFillPolygon,d,gc,L,fromPolyShape shape,fromCoordMode mode); fun XFillRectangle (d:Drawable) (gc:GC) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFillRectangle,d,gc,r); fun XFillRectangles (d:Drawable) (gc:GC) (L:XRectangle list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFillRectangles,d,gc,L); (* Events 350 *) datatype Modifier = ShiftMask | LockMask | ControlMask | Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | AnyModifier; exception BadModifier of int; fun toModifier n = let fun MaskName 1 = ShiftMask | MaskName 2 = LockMask | MaskName 4 = ControlMask | MaskName 8 = Mod1Mask | MaskName 16 = Mod2Mask | MaskName 32 = Mod3Mask | MaskName 64 = Mod4Mask | MaskName 128 = Mod5Mask | MaskName 256 = Button1Mask | MaskName 512 = Button2Mask | MaskName 1024 = Button3Mask | MaskName 2048 = Button4Mask | MaskName 4096 = Button5Mask | MaskName 32768 = AnyModifier | MaskName n = raise BadModifier n; fun ShiftAndMask 0 mask acc = acc | ShiftAndMask n mask acc = ShiftAndMask (n And Not mask) (mask << 1) (if (n And mask) <> 0 then MaskName mask :: acc else acc); in ShiftAndMask n 1 [] end; fun fromModifier list = let fun MaskBit ShiftMask = 1 | MaskBit LockMask = 2 | MaskBit ControlMask = 4 | MaskBit Mod1Mask = 8 | MaskBit Mod2Mask = 16 | MaskBit Mod3Mask = 32 | MaskBit Mod4Mask = 64 | MaskBit Mod5Mask = 128 | MaskBit Button1Mask = 256 | MaskBit Button2Mask = 512 | MaskBit Button3Mask = 1024 | MaskBit Button4Mask = 2048 | MaskBit Button5Mask = 4096 | MaskBit AnyModifier = 32768; fun OrTogether [] acc = acc | OrTogether (H::T) acc = OrTogether T (MaskBit H Or acc); in OrTogether list 0 end; datatype ButtonName = Button1 | Button2 | Button3 | Button4 | Button5 | AnyButton; fun toButtonName 1 = Button1 | toButtonName 2 = Button2 | toButtonName 3 = Button3 | toButtonName 4 = Button4 | toButtonName 5 = Button5 | toButtonName _ = AnyButton; fun fromButtonName Button1 = 1 | fromButtonName Button2 = 2 | fromButtonName Button3 = 3 | fromButtonName Button4 = 4 | fromButtonName Button5 = 5 | fromButtonName AnyButton = 0; datatype Placement = PlaceOnTop | PlaceOnBottom; fun toPlacement 0 = PlaceOnTop | toPlacement _ = PlaceOnBottom; datatype StackMode = Above | Below | TopIf | BottomIf | Opposite; fun toStackMode 0 = Above | toStackMode 1 = Below | toStackMode 2 = TopIf | toStackMode 3 = BottomIf | toStackMode _ = Opposite; fun fromStackMode Above = 0 | fromStackMode Below = 1 | fromStackMode TopIf = 2 | fromStackMode BottomIf = 3 | fromStackMode Opposite = 4; datatype NotifyMode = NotifyNormal | NotifyGrab | NotifyUngrab | NotifyWhileGrabbed; fun toNotifyMode 0 = NotifyNormal | toNotifyMode 1 = NotifyGrab | toNotifyMode 2 = NotifyUngrab | toNotifyMode _ = NotifyWhileGrabbed; datatype NotifyDetail = NotifyAncestor | NotifyVirtual | NotifyInferior | NotifyNonLinear | NotifyNonLinearVirtual | NotifyPointer | NotifyPointerRoot | NotifyDetailNone; fun toNotifyDetail 0 = NotifyAncestor | toNotifyDetail 1 = NotifyVirtual | toNotifyDetail 2 = NotifyInferior | toNotifyDetail 3 = NotifyNonLinear | toNotifyDetail 4 = NotifyNonLinearVirtual | toNotifyDetail 5 = NotifyPointer | toNotifyDetail 6 = NotifyPointerRoot | toNotifyDetail _ = NotifyDetailNone; datatype GraphicsCode = CopyArea | CopyPlane; fun toGraphicsCode 62 = CopyArea | toGraphicsCode _ = CopyPlane; datatype Visibility = VisibilityUnobscured | VisibilityPartiallyObscured | VisibilityFullyObscured; fun toVisibility 0 = VisibilityUnobscured | toVisibility 1 = VisibilityPartiallyObscured | toVisibility _ = VisibilityFullyObscured; datatype 'a XEvent = ButtonPress of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } | ButtonRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName } | ButtonClick of { sendEvent: bool, (* extra event type *) window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, button: ButtonName, up: int, (* number of up transitions *) down: int } (* number of down transitions *) | CirculateNotify of { sendEvent: bool, event: Drawable, window: Drawable, place: Placement } | CirculateRequest of { sendEvent: bool, parent: Drawable, window: Drawable, place: Placement } | ColormapNotify of { sendEvent: bool, window: Drawable, colormap: Colormap, new: bool, installed: bool } | ConfigureNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, overrideRedirect: bool } | ConfigureRequest of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, above: Drawable, detail: StackMode } | CreateNotify of { sendEvent: bool, parent: Drawable, window: Drawable, position: XPoint, size: XRectangle, borderWidth: int, overrideRedirect: bool } | DestroyNotify of { sendEvent: bool, event: Drawable, window: Drawable } | EnterNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } | LeaveNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, mode: NotifyMode, detail: NotifyDetail, focus: bool, modifiers: Modifier list } | Expose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int } | FocusIn of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } | FocusOut of { sendEvent: bool, window: Drawable, mode: NotifyMode, detail: NotifyDetail } | GraphicsExpose of { sendEvent: bool, window: Drawable, region: XRectangle, count: int, code: GraphicsCode } | NoExpose of { sendEvent: bool, window: Drawable, code: GraphicsCode } | GravityNotify of { sendEvent: bool, event: Drawable, window: Drawable, position: XPoint } | KeymapNotify of { sendEvent: bool, window: Drawable, keyVector: bool list (* 256 bools *) } | KeyPress of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } | KeyRelease of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, keycode: int } | MapNotify of { sendEvent: bool, event: Drawable, window: Drawable, overrideRedirect: bool } | UnmapNotify of { sendEvent: bool, event: Drawable, window: Drawable, fromConfigure: bool } | MapRequest of { sendEvent: bool, parent: Drawable, window: Drawable } | MotionNotify of { sendEvent: bool, window: Drawable, root: Drawable, subwindow: Drawable, time: int, pointer: XPoint, rootPointer: XPoint, modifiers: Modifier list, isHint: bool } | ReparentNotify of { sendEvent: bool, event: Drawable, window: Drawable, parent: Drawable, position: XPoint, overrideRedirect: bool } | ResizeRequest of { sendEvent: bool, window: Drawable, size: XRectangle } | SelectionClear of { sendEvent: bool, window: Drawable, selection: int, time: int } | SelectionNotify of { sendEvent: bool, requestor: Drawable, selection: int, target: int, property: int, time: int } | SelectionRequest of { sendEvent: bool, owner: Drawable, requestor: Drawable, selection: int, target: int, property: int, time: int } | VisibilityNotify of { sendEvent: bool, window: Drawable, visibility: Visibility } | DeleteRequest of { window: Drawable } (* extra event type *) | Message of { window: Drawable, message: 'a } (* extra event type *) | NoEvent fun XSelectInput (d:Drawable) (m:EventMask list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSelectInput,d,fromEventMask m); fun XSynchronize (d:Display) (n:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSynchronize,d,n); fun XSetHandler (drawable:Drawable) (Handler:'a XEvent * 'b -> 'b) (initialState:'b) = ( RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_SetState,drawable,Handler,initialState); fn (ms:int) => fn (alpha:'a) => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_InsertTimeout,drawable,ms,alpha,Handler) ); fun NullHandler (e,s) = s; local fun Exists x = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ResourceExists,x):bool; in val ColormapExists = Exists : Colormap -> bool; val CursorExists = Exists : Cursor -> bool; val DrawableExists = Exists : Drawable -> bool; val FontExists = Exists : Font -> bool; val GCExists = Exists : GC -> bool; val VisualExists = Exists : Visual -> bool; val DisplayExists = Exists : Display -> bool; end; local fun GetDisplay x = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetDisplay,x):Display; in val ColormapDisplay = GetDisplay : Colormap -> Display; val CursorDisplay = GetDisplay : Cursor -> Display; val DrawableDisplay = GetDisplay : Drawable -> Display; val FontDisplay = GetDisplay : Font -> Display; val GCDisplay = GetDisplay : GC -> Display; val VisualDisplay = GetDisplay : Visual -> Display; end; local fun MakeXKeyEvent (_,sendEvent,window,(root,subwindow,time,pointer,rootPointer,modifiers,keycode),_,_) = { sendEvent = sendEvent, window = window, root = root, subwindow = subwindow, time = time, pointer = pointer, rootPointer = rootPointer, modifiers = toModifier modifiers, keycode = keycode }; fun MakeXButtonEvent (_,sendEvent,window,(root,subwindow,time,pointer,rootPointer,modifiers,button),_,_) = { sendEvent = sendEvent, window = window, root = root, subwindow = subwindow, time = time, pointer = pointer, rootPointer = rootPointer, modifiers = toModifier modifiers, button = toButtonName button }; fun MakeXMotionEvent (_,sendEvent,window,(root,subwindow,time,pointer,rootPointer,modifiers,isHint),_,_) = { sendEvent = sendEvent, window = window, root = root, subwindow = subwindow, time = time, pointer = pointer, rootPointer = rootPointer, modifiers = toModifier modifiers, isHint = isHint }; fun MakeXCrossingEvent (_,sendEvent,window,(root,subwindow,time,pointer,rootPointer,mode,detail,focus,modifiers),_,_) = { sendEvent = sendEvent, window = window, root = root, subwindow = subwindow, time = time, pointer = pointer, rootPointer = rootPointer, mode = toNotifyMode mode, detail = toNotifyDetail detail, focus = focus, modifiers = toModifier modifiers }; fun MakeXExposeEvent (_,sendEvent,window,(region,count),_,_) = { sendEvent = sendEvent, window = window, region = region, count = count }; fun MakeXGraphicsExposeEvent (_,sendEvent,window,(region,count,code),_,_) = { sendEvent = sendEvent, window = window, region = region, count = count, code = toGraphicsCode code }; fun MakeXNoExposeEvent (_,sendEvent,window,code,_,_) = { sendEvent = sendEvent, window = window, code = toGraphicsCode code }; fun MakeXVisibilityEvent (_,sendEvent,window,visibility,_,_) = { sendEvent = sendEvent, window = window, visibility = toVisibility visibility }; fun MakeXCreateWindowEvent (_,sendEvent,parent,(window,position,size,borderWidth,overrideRedirect),_,_) = { sendEvent = sendEvent, window = window, parent = parent, position = position, size = size, borderWidth = borderWidth, overrideRedirect = overrideRedirect }; fun MakeXDestroyWindowEvent (_,sendEvent,event,window,_,_) = { sendEvent = sendEvent, event = event, window = window }; fun MakeXUnmapEvent (_,sendEvent,event,(window,fromConfigure),_,_) = { sendEvent = sendEvent, event = event, window = window, fromConfigure = fromConfigure }; fun MakeXMapEvent (_,sendEvent,event,(window,overrideRedirect),_,_) = { sendEvent = sendEvent, event = event, window = window, overrideRedirect = overrideRedirect }; fun MakeXFocusChangeEvent (_,sendEvent,window,(mode,detail),_,_) = { sendEvent = sendEvent, window = window, mode = toNotifyMode mode, detail = toNotifyDetail mode }; fun MakeXKeymapEvent (_,sendEvent,window,keyVector,_,_) = { sendEvent = sendEvent, window = window, keyVector = keyVector }; fun MakeXConfigureEvent (_,sendEvent,event,(window,position,size,borderWidth,above,overrideRedirect),_,_) = { sendEvent = sendEvent, event = event, window = window, position = position, size = size, borderWidth = borderWidth, above = above, overrideRedirect = overrideRedirect }; fun MakeXMapRequestEvent (_,sendEvent,parent,window,_,_) = { sendEvent = sendEvent, parent = parent, window = window }; fun MakeXReparentEvent (_,sendEvent,event,(window,parent,position,overrideRedirect),_,_) = { sendEvent = sendEvent, event = event, window = window, parent = parent, position = position, overrideRedirect = overrideRedirect }; fun MakeXConfigureRequestEvent (_,sendEvent,parent,(window,position,size,borderWidth,above,detail),_,_) = { sendEvent = sendEvent, parent = parent, window = window, position = position, size = size, borderWidth = borderWidth, above = above, detail = toStackMode detail }; fun MakeXGravityEvent (_,sendEvent,event,(window,position),_,_) = { sendEvent = sendEvent, event = event, window = window, position = position }; fun MakeXResizeRequestEvent (_,sendEvent,window,size,_,_) = { sendEvent = sendEvent, window = window, size = size }; fun MakeXCirculateEvent (_,sendEvent,event,(window,place),_,_) = { sendEvent = sendEvent, event = event, window = window, place = toPlacement place }; fun MakeXCirculateRequestEvent (_,sendEvent,parent,(window,place),_,_) = { sendEvent = sendEvent, parent = parent, window = window, place = toPlacement place }; fun MakeXSelectionClearEvent (_,sendEvent,window,(selection,time),_,_) = { sendEvent = sendEvent, window = window, selection = selection, time = time } fun MakeXSelectionEvent (_,sendEvent,requestor,(selection,target,property,time),_,_) = { sendEvent = sendEvent, requestor = requestor, selection = selection, target = target, property = property, time = time } fun MakeXSelectionRequestEvent (_,sendEvent,owner,(requestor,selection,target,property,time),_,_) = { sendEvent = sendEvent, owner = owner, requestor = requestor, selection = selection, target = target, property = property, time = time } fun MakeXColormapEvent (_,sendEvent,window,(colormap,new,installed),_,_) = { sendEvent = sendEvent, window = window, colormap = colormap, new = new, installed = installed }; fun MakeXClickEvent (_,sendEvent,window,(root,subwindow,time,pointer,rootPointer,modifiers,button,up,down),_,_) = { sendEvent = sendEvent, window = window, root = root, subwindow = subwindow, time = time, pointer = pointer, rootPointer = rootPointer, modifiers = toModifier modifiers, button = toButtonName button, up = up, down = down }; fun MakeDeleteEvent (_,_,window,_,_,_) = { window = window }; fun MakeMessageEvent (_,_,window,message,_,_) = { window = window, message = message }; fun NextEvent display = let val (data as (etype,_,window,_,callbacks, events)) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NextEvent,display); val event = case etype of 2 => KeyPress (MakeXKeyEvent (RunCall.unsafeCast data)) | 3 => KeyRelease (MakeXKeyEvent (RunCall.unsafeCast data)) | 4 => ButtonPress (MakeXButtonEvent (RunCall.unsafeCast data)) | 5 => ButtonRelease (MakeXButtonEvent (RunCall.unsafeCast data)) | 6 => MotionNotify (MakeXMotionEvent (RunCall.unsafeCast data)) | 7 => EnterNotify (MakeXCrossingEvent (RunCall.unsafeCast data)) | 8 => LeaveNotify (MakeXCrossingEvent (RunCall.unsafeCast data)) | 9 => FocusIn (MakeXFocusChangeEvent (RunCall.unsafeCast data)) | 10 => FocusOut (MakeXFocusChangeEvent (RunCall.unsafeCast data)) | 11 => KeymapNotify (MakeXKeymapEvent (RunCall.unsafeCast data)) | 12 => Expose (MakeXExposeEvent (RunCall.unsafeCast data)) | 13 => GraphicsExpose (MakeXGraphicsExposeEvent (RunCall.unsafeCast data)) | 14 => NoExpose (MakeXNoExposeEvent (RunCall.unsafeCast data)) | 15 => VisibilityNotify (MakeXVisibilityEvent (RunCall.unsafeCast data)) | 16 => CreateNotify (MakeXCreateWindowEvent (RunCall.unsafeCast data)) | 17 => DestroyNotify (MakeXDestroyWindowEvent (RunCall.unsafeCast data)) | 18 => UnmapNotify (MakeXUnmapEvent (RunCall.unsafeCast data)) | 19 => MapNotify (MakeXMapEvent (RunCall.unsafeCast data)) | 22 => ConfigureNotify (MakeXConfigureEvent (RunCall.unsafeCast data)) | 20 => MapRequest (MakeXMapRequestEvent (RunCall.unsafeCast data)) | 21 => ReparentNotify (MakeXReparentEvent (RunCall.unsafeCast data)) | 23 => ConfigureRequest (MakeXConfigureRequestEvent (RunCall.unsafeCast data)) | 24 => GravityNotify (MakeXGravityEvent (RunCall.unsafeCast data)) | 25 => ResizeRequest (MakeXResizeRequestEvent (RunCall.unsafeCast data)) | 26 => CirculateNotify (MakeXCirculateEvent (RunCall.unsafeCast data)) | 27 => CirculateRequest (MakeXCirculateRequestEvent (RunCall.unsafeCast data)) | 29 => SelectionClear (MakeXSelectionClearEvent (RunCall.unsafeCast data)) | 30 => SelectionRequest (MakeXSelectionRequestEvent (RunCall.unsafeCast data)) | 31 => SelectionNotify (MakeXSelectionEvent (RunCall.unsafeCast data)) | 32 => ColormapNotify (MakeXColormapEvent (RunCall.unsafeCast data)) | 42 => ButtonClick (MakeXClickEvent (RunCall.unsafeCast data)) | 43 => DeleteRequest (MakeDeleteEvent (RunCall.unsafeCast data)) | 99 => Message (MakeMessageEvent (RunCall.unsafeCast data)) | 100 => NoEvent | _ => raise XWindows "Bad event type"; in (event,window,callbacks,events) end; fun ProcessEvent (event,window,[],[]) () = let val (handler,state) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetState,window); val newState = handler (event,state); in if DrawableExists window then let val (newHandler,_) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetState,window); in if PolyML.pointerEq(handler, newHandler) then RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_SetState,window,nil,newState) else () end else () end | ProcessEvent (event,_,callbacks,events) () = let fun Call [] = () | Call ((w,f)::T) = ( Call T; RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_SetWidgetState,w,f (w,event,RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetWidgetState,w))) ); fun call [] = () | call ((w,f)::T) = (call T; f (w, event)) in Call callbacks; call events end; datatype 'a Option = None | Some of 'a; fun XWindowHandler display = let val E = Some (NextEvent display) handle XWindows _ => None; in case E of None => () | Some e => ( PolyML.exception_trace (ProcessEvent e) handle XWindows s => print("Exception XWindows \"" ^ s ^ "\" raised.\n") | _ => (); XWindowHandler display ) end; in fun XStartDisplayHandler display = (Thread.Thread.fork (fn () => XWindowHandler display, []); ()); fun XOpenDisplay (s:string):Display = let val display = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XOpenDisplay,s); in XStartDisplayHandler display; display end; end (* local *); val CurrentTime = 0; datatype RevertCode = RevertToNone | RevertToPointerRoot | RevertToParent; fun fromRevertCode RevertToNone = 0 | fromRevertCode RevertToPointerRoot = 1 | fromRevertCode RevertToParent = 2; fun toRevertCode 0 = RevertToNone | toRevertCode 1 = RevertToPointerRoot | toRevertCode _ = RevertToParent; fun XSetInputFocus (d:Display) (w:Drawable) (r:RevertCode) (t:int) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetInputFocus,d,w,fromRevertCode r,t); fun XGetInputFocus (d:Display):(Drawable * RevertCode) = let val (w,r) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetInputFocus,d); in (w,toRevertCode r) end; fun XSetSelectionOwner (d:Display) (selection:int) (owner:Drawable) (time:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetSelectionOwner,d,selection,owner,time); fun XGetSelectionOwner (d:Display) (selection:int):Drawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetSelectionOwner,d,selection); fun XConvertSelection {selection:int,target:int,property:int,requestor:Drawable,time:int}:unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XConvertSelection,selection,target,property,requestor,time); fun XSendSelectionNotify {selection:int,target:int,property:int,requestor:Drawable,time:int}:unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSendSelectionNotify,selection,target,property,requestor,time); fun XDeleteProperty (requestor:Drawable) (property:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDeleteProperty,requestor,property); fun XInternAtom (d:Display) (name:string) (onlyIfExists:bool):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XInternAtom,d,name,onlyIfExists); fun XGetAtomName (d:Display) (atom:int):string = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetAtomName,d,atom); (* Fonts 400 *) datatype FontDirection = FontLeftToRight | FontRightToLeft; datatype XCharStruct = XCharStruct of { lbearing: int, rbearing: int, width: int, ascent: int, descent: int, attributes: int }; datatype XFontStruct = XFontStruct of { font: Font, direction: FontDirection, minChar: int, maxChar: int, minByte1: int, maxByte1: int, allCharsExist: bool, defaultChar: int, minBounds: XCharStruct, maxBounds: XCharStruct, perChar: XCharStruct list, ascent: int, descent: int }; fun XGetFontPath (d:Display):string list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetFontPath,d); fun XListFonts (d:Display) (s:string) (n:int):string list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XListFonts,d,s,n); fun XListFontsWithInfo (d:Display) (s:string) (n:int):(string list * XFontStruct list) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XListFontsWithInfo,d,s,n); fun XLoadFont (d:Display) (s:string):Font = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XLoadFont,d,s); fun XLoadQueryFont (d:Display) (s:string):XFontStruct = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XLoadQueryFont,d,s); fun XQueryFont (f:Font):XFontStruct = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryFont,f); fun XSetFontPath (d:Display) (L:string list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetFontPath,d,L); (* Grabbing 450 *) (* Graphics Context 500 *) datatype GCArcMode = ArcChord | ArcPieSlice; fun fromArcMode ArcChord = 0 | fromArcMode ArcPieSlice = 1; datatype GCOrder = Unsorted | YSorted | YXSorted | YXBanded; fun fromOrder Unsorted = 0 | fromOrder YSorted = 1 | fromOrder YXSorted = 2 | fromOrder YXBanded = 3; datatype GCFillRule = EvenOddRule | WindingRule; fun fromFillRule EvenOddRule = 0 | fromFillRule WindingRule = 1; datatype GCFillStyle = FillSolid | FillTiled | FillStippled | FillOpaqueStippled; fun fromFillStyle FillSolid = 0 | fromFillStyle FillTiled = 1 | fromFillStyle FillStippled = 2 | fromFillStyle FillOpaqueStippled = 3; datatype GCFunction = GXclear | GXand | GXandReverse | GXcopy | GXandInverted | GXnoop | GXxor | GXor | GXnor | GXequiv | GXinvert | GXorReverse | GXcopyInverted | GXorInverted | GXnand | GXset; fun fromFunction GXclear = 0 | fromFunction GXand = 1 | fromFunction GXandReverse = 2 | fromFunction GXcopy = 3 | fromFunction GXandInverted = 4 | fromFunction GXnoop = 5 | fromFunction GXxor = 6 | fromFunction GXor = 7 | fromFunction GXnor = 8 | fromFunction GXequiv = 9 | fromFunction GXinvert = 10 | fromFunction GXorReverse = 11 | fromFunction GXcopyInverted = 12 | fromFunction GXorInverted = 13 | fromFunction GXnand = 14 | fromFunction GXset = 15; datatype GCLineStyle = LineSolid | LineOnOffDash | LineDoubleDash; fun fromLineStyle LineSolid = 0 | fromLineStyle LineOnOffDash = 1 | fromLineStyle LineDoubleDash = 2; datatype GCCapStyle = CapNotLast | CapButt | CapRound | CapProjecting; fun fromCapStyle CapNotLast = 0 | fromCapStyle CapButt = 1 | fromCapStyle CapRound = 2 | fromCapStyle CapProjecting = 3; datatype GCJoinStyle = JoinMiter | JoinRound | JoinBevel; fun fromJoinStyle JoinMiter = 0 | fromJoinStyle JoinRound = 1 | fromJoinStyle JoinBevel = 2; datatype GCSubwindowMode = ClipByChildren | IncludeInferiors; fun fromSubwindowMode ClipByChildren = 0 | fromSubwindowMode IncludeInferiors = 1; fun DefaultGC (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DefaultGC,d) : GC; datatype XGCValue = GCFunction of GCFunction | GCPlaneMask of int | GCForeground of int | GCBackground of int | GCLineWidth of int | GCLineStyle of GCLineStyle | GCCapStyle of GCCapStyle | GCJoinStyle of GCJoinStyle | GCFillStyle of GCFillStyle | GCFillRule of GCFillRule | GCTile of Drawable | GCStipple of Drawable | GCTSOrigin of XPoint | GCFont of Font | GCSubwindowMode of GCSubwindowMode | GCGraphicsExposures of bool | GCClipOrigin of XPoint | GCClipMask of Drawable | GCDashOffset of int | GCDashList of int | GCArcMode of GCArcMode; fun UpdateGC gc (GCFunction f) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,0 ,fromFunction f) | UpdateGC gc (GCPlaneMask mask) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,1 ,mask) | UpdateGC gc (GCForeground fg) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,2 ,fg) | UpdateGC gc (GCBackground bg) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,3 ,bg) | UpdateGC gc (GCLineWidth w) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,4 ,w) | UpdateGC gc (GCLineStyle ls) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,5 ,fromLineStyle ls) | UpdateGC gc (GCCapStyle cs) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,6 ,fromCapStyle cs) | UpdateGC gc (GCJoinStyle js) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,7 ,fromJoinStyle js) | UpdateGC gc (GCFillStyle fs) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,8 ,fromFillStyle fs) | UpdateGC gc (GCFillRule rule) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,9 ,fromFillRule rule) | UpdateGC gc (GCTile tile) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,10,tile) | UpdateGC gc (GCStipple stipple) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,11,stipple) | UpdateGC gc (GCTSOrigin (XPoint {x,y})) = (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,12,x); RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,13,y)) | UpdateGC gc (GCFont font) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,14,font) | UpdateGC gc (GCSubwindowMode mode) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,15,fromSubwindowMode mode) | UpdateGC gc (GCGraphicsExposures ex) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,16,ex) | UpdateGC gc (GCClipOrigin (XPoint {x,y})) = (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,17,x); RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,18,y)) | UpdateGC gc (GCClipMask mask) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,19,mask) | UpdateGC gc (GCDashOffset offset) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,20,offset) | UpdateGC gc (GCDashList dashes) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,21,dashes) | UpdateGC gc (GCArcMode mode) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_UpdateGC,gc,22,fromArcMode mode); fun XChangeGC gc [] = () | XChangeGC gc (H::T) = (UpdateGC gc H; XChangeGC gc T); fun XCreateGC (d:Drawable) (values:XGCValue list):GC = let val gc = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateGC,d); in XChangeGC gc values; gc end; fun XSetFunction gc f = UpdateGC gc (GCFunction f); fun XSetPlaneMask gc mask = UpdateGC gc (GCPlaneMask mask); fun XSetForeground gc fg = UpdateGC gc (GCForeground fg); fun XSetBackground gc bg = UpdateGC gc (GCBackground bg); fun XSetFillStyle gc fs = UpdateGC gc (GCFillStyle fs); fun XSetFillRule gc rule = UpdateGC gc (GCFillRule rule); fun XSetTile gc tile = UpdateGC gc (GCTile tile) fun XSetStipple gc stipple = UpdateGC gc (GCStipple stipple); fun XSetTSOrigin gc point = UpdateGC gc (GCTSOrigin point); fun XSetFont gc font = UpdateGC gc (GCFont font); fun XSetSubwindowMode gc mode = UpdateGC gc (GCSubwindowMode mode); fun XSetGraphicsExposures gc ex = UpdateGC gc (GCGraphicsExposures ex); fun XSetClipOrigin gc point = UpdateGC gc (GCClipOrigin point); fun XSetClipMask gc mask = UpdateGC gc (GCClipMask mask); fun XSetArcMode gc mode = UpdateGC gc (GCArcMode mode); fun XSetLineAttributes gc w ls cs js = XChangeGC gc [GCLineWidth w, GCLineStyle ls,GCCapStyle cs,GCJoinStyle js]; fun XSetState gc fg bg f mask = XChangeGC gc [GCForeground fg,GCBackground bg,GCFunction f, GCPlaneMask mask]; fun XSetClipRectangles (gc:GC) (p:XPoint) (L:XRectangle list) (order:GCOrder):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetClipRectangles,gc,p,L,fromOrder order); fun XSetDashes (gc:GC) (offset:int) (dashes:int list) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetDashes,gc,offset,dashes); (* Images 550 *) datatype ImageFormat = XYBitmap | XYPixmap | ZPixmap; datatype ImageOrder = LSBFirst | MSBFirst; abstype ImageData = ImageData of string with val Data = ImageData end; datatype XImage = XImage of { data: ImageData, size: XRectangle, depth: int, format: ImageFormat, xoffset: int, bitmapPad: int, byteOrder: ImageOrder, bitmapUnit: int, bitsPerPixel: int, bytesPerLine: int, visualRedMask: int, bitmapBitOrder: ImageOrder, visualBlueMask: int, visualGreenMask: int }; (* XImages need to be mutable for XAddPixel, XGetSubImage and XPutPixel to work properly *) fun XAddPixel (d:Display) (i:XImage) (a:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAddPixel,d,i,a); fun XCreateImage v depth format xoffset data size bitmapPad bytesPerLine = ( XImage { data = Data data, size = size, depth = depth, format = format, xoffset = xoffset, bitmapPad = bitmapPad, byteOrder = LSBFirst, bitmapUnit = 8, bitsPerPixel = 1, bytesPerLine = bytesPerLine, visualRedMask = VisualRedMask v, bitmapBitOrder = LSBFirst, visualBlueMask = VisualBlueMask v, visualGreenMask = VisualGreenMask v } ); fun XGetImage (d:Drawable) (r:XRectangle) (mask:int) (f:ImageFormat) = XImage (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetImage,d,r,mask,f)); fun XGetPixel (d:Display) (i:XImage) (point:XPoint):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetPixel,d,i,point); fun XGetSubImage (d:Drawable) (r:XRectangle) (mask:int) (f:ImageFormat) (i:XImage) (point:XPoint):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetSubImage,d,r,mask,f,i,point); fun XPutImage (d:Drawable) (gc:GC) (i:XImage) (p:XPoint) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XPutImage,d,gc,i,p,r); fun XPutPixel (d:Display) (i:XImage) (point:XPoint) (pixel:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XPutPixel,d,i,point,pixel); fun XSubImage (d:Display) (i:XImage) (r:XRectangle) = XImage (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSubImage,d,i,r)); fun BitmapBitOrder (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_BitmapBitOrder,d) : ImageOrder; fun BitmapPad (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_BitmapPad,d) : int; fun BitmapUnit (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_BitmapUnit,d) : int; fun ByteOrder (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ByteOrder,d) : ImageOrder; fun ImageByteOrder (XImage {byteOrder,...}) = byteOrder; fun ImageSize (XImage {size,...}) = size; fun ImageDepth (XImage {depth,...}) = depth; (* Keyboard 600 *) (* keysym values are integers, and are defined in other signatures *) fun XLookupString (d:Drawable) (keycode:int) (modifiers:Modifier list):(string * int) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XLookupString,d,keycode,fromModifier modifiers); fun XQueryKeymap (d:Display):bool list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryKeymap,d); fun IsCursorKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsCursorKey,k); fun IsFunctionKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsFunctionKey,k); fun IsKeypadKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsKeypadKey,k); fun IsMiscFunctionKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsMiscFunctionKey,k); fun IsModifierKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsModifierKey,k); fun IsPFKey (k:int):bool = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_IsPFKey,k); (* Output Buffer 650 *) fun XFlush (d:Display):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XFlush,d); fun XSync (d:Display) (b:bool):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSync,d,b); (* Pointers 700 *) fun XQueryPointer (d:Drawable) = let val (s:bool,root:Drawable,child:Drawable,r:XPoint,w:XPoint,m) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryPointer,d); in (s,root,child,r,w,toModifier m) end; (* Regions 750*) (* Save Set 800 *) (* Screen Saver 850 *) datatype SaveMode = ScreenSaverReset | ScreenSaverActive; fun fromSaveMode ScreenSaverReset = 0 | fromSaveMode ScreenSaverActive = 1; datatype Blanking = DontPreferBlanking | PreferBlanking | DefaultBlanking; fun toBlanking 0 = DontPreferBlanking | toBlanking 1 = PreferBlanking | toBlanking _ = DefaultBlanking; fun fromBlanking DontPreferBlanking = 0 | fromBlanking PreferBlanking = 1 | fromBlanking DefaultBlanking = 2; datatype Exposures = DontAllowExposures | AllowExposures | DefaultExposures; fun toExposures 0 = DontAllowExposures | toExposures 1 = AllowExposures | toExposures _ = DefaultExposures; fun fromExposures DontAllowExposures = 0 | fromExposures AllowExposures = 1 | fromExposures DefaultExposures = 2; fun XActivateScreenSaver (d:Display):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XActivateScreenSaver,d); fun XForceScreenSaver (d:Display) (s:SaveMode):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XForceScreenSaver,d,fromSaveMode s); fun XGetScreenSaver (d:Display) = let val (timeout,interval,blanking,exposures) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetScreenSaver,d); in (timeout:int,interval:int,toBlanking blanking,toExposures exposures) end; fun XResetScreenSaver (d:Display):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XResetScreenSaver,d); fun XSetScreenSaver (d:Display) (timeout:int) (interval:int) (blanking:Blanking) (exposures:Exposures) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetScreenSaver,d,timeout,interval,fromBlanking blanking,fromExposures exposures); (* Standard Geometry 900 *) fun XTranslateCoordinates (src:Drawable) (dst:Drawable) (p:XPoint):(XPoint * Drawable) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XTranslateCoordinates,src,dst,p); (* Text 950 *) fun XTextExtents (fs:XFontStruct) (s:string):(FontDirection * int * int * XCharStruct) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XTextExtents,fs,s); fun XTextExtents16 (fs:XFontStruct) (L:int list):(FontDirection * int * int * XCharStruct) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XTextExtents16,fs,L); fun XTextWidth (fs:XFontStruct) (s:string):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XTextWidth,fs,s); fun XTextWidth16 (fs:XFontStruct) (L:int list):int = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XTextWidth16,fs,L); (* Tiles, Pixmaps, Stipples and Bitmaps 1000 *) datatype BitmapStatus = BitmapOpenFailed | BitmapFileInvalid | BitmapNoMemory | BitmapSuccess of Drawable * XRectangle * XPoint; fun XCreateBitmapFromData (d:Drawable) (s:string) (r:XRectangle):Drawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateBitmapFromData,d,s,r); fun XCreatePixmap (d:Drawable) (r:XRectangle) (depth:int):Drawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreatePixmap,d,r,depth); fun XCreatePixmapFromBitmapData (d:Drawable) (s:string) (r:XRectangle) (fg:int) (bg:int) (depth:int):Drawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreatePixmapFromBitmapData,d,s,r,fg,bg,depth); fun XQueryBestStipple (d:Drawable) (r:XRectangle):XRectangle = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryBestStipple,d,r); fun XQueryBestTile (d:Drawable) (r:XRectangle):XRectangle = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryBestTile,d,r); datatype ShapeClass = CursorShape | TileShape | StippleShape; fun XQueryBestSize CursorShape = XQueryBestCursor | XQueryBestSize TileShape = XQueryBestTile | XQueryBestSize StippleShape = XQueryBestStipple; fun XReadBitmapFile (d:Drawable) (s:string) = let val (status,bitmap,size,hotspot) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XReadBitmapFile,d,s); in case status of 0 => BitmapSuccess (bitmap,size,hotspot) | 1 => BitmapOpenFailed | 2 => BitmapFileInvalid | _ => BitmapNoMemory end; fun XWriteBitmapFile (s:string) (bitmap:Drawable) (size:XRectangle) (hotspot:XPoint) = let val status = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XWriteBitmapFile,s,bitmap,size,hotspot); in case status of 0 => BitmapSuccess (bitmap,size,hotspot) | 1 => BitmapOpenFailed | 2 => BitmapFileInvalid | _ => BitmapNoMemory end; (* User Preferences 1050 *) fun XAutoRepeatOff (d:Display):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAutoRepeatOff,d); fun XAutoRepeatOn (d:Display):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XAutoRepeatOn,d); fun XBell (d:Display) (n:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XBell,d,n); fun XGetDefault (d:Display) (program:string) (option:string):string = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetDefault,d,program,option); (* Window Attributes 1100 *) datatype Gravity = ForgetGravity | NorthWestGravity | NorthGravity | NorthEastGravity | WestGravity | CenterGravity | EastGravity | SouthWestGravity | SouthGravity | SouthEastGravity | StaticGravity; val UnmapGravity = ForgetGravity; fun toGravity 0 = ForgetGravity | toGravity 1 = NorthWestGravity | toGravity 2 = NorthGravity | toGravity 3 = NorthEastGravity | toGravity 4 = WestGravity | toGravity 5 = CenterGravity | toGravity 6 = EastGravity | toGravity 7 = SouthWestGravity | toGravity 8 = SouthGravity | toGravity 9 = SouthEastGravity | toGravity _ = StaticGravity; fun fromGravity ForgetGravity = 0 | fromGravity NorthWestGravity = 1 | fromGravity NorthGravity = 2 | fromGravity NorthEastGravity = 3 | fromGravity WestGravity = 4 | fromGravity CenterGravity = 5 | fromGravity EastGravity = 6 | fromGravity SouthWestGravity = 7 | fromGravity SouthGravity = 8 | fromGravity SouthEastGravity = 9 | fromGravity StaticGravity = 10; datatype XSetWindowAttributes = CWBackPixmap of Drawable | CWBackPixel of int | CWBorderPixmap of Drawable | CWBorderPixel of int | CWBitGravity of Gravity | CWWinGravity of Gravity | CWBackingStore of BackingStore | CWBackingPlanes of int | CWBackingPixel of int | CWOverrideRedirect of bool | CWSaveUnder of bool | CWEventMask of EventMask list | CWDontPropagate of EventMask list | CWColormap of Colormap | CWCursor of Cursor; datatype WindowClass = CopyFromParentClass | InputOutputClass | InputOnlyClass; fun toWindowClass 0 = CopyFromParentClass | toWindowClass 1 = InputOutputClass | toWindowClass _ = InputOnlyClass; fun fromWindowClass CopyFromParentClass = 0 | fromWindowClass InputOutputClass = 1 | fromWindowClass InputOnlyClass = 2; datatype MapState = IsUnmapped | IsUnviewable | IsViewable; fun toMapState 0 = IsUnmapped | toMapState 1 = IsUnviewable | toMapState _ = IsViewable; datatype XWindowAttributes = XWindowAttributes of { position: XPoint, size: XRectangle, borderWidth: int, depth: int, visual: Visual, root: Drawable, class: WindowClass, bitGravity: Gravity, winGravity: Gravity, backingStore: BackingStore, backingPlanes: int, backingPixel: int, saveUnder: bool, colormap: Colormap, mapInstalled: bool, mapState: MapState, allEventMasks: EventMask list, yourEventMask: EventMask list, doNotPropagateMask: EventMask list, overrideRedirect: bool }; fun ChangeWindow d (CWBackPixmap pixmap) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,0 ,pixmap) | ChangeWindow d (CWBackPixel pixel) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,1 ,pixel) | ChangeWindow d (CWBorderPixmap pixmap) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,2 ,pixmap) | ChangeWindow d (CWBorderPixel pixel) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,3 ,pixel) | ChangeWindow d (CWBitGravity gravity) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,4 ,fromGravity gravity) | ChangeWindow d (CWWinGravity gravity) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,5 ,fromGravity gravity) | ChangeWindow d (CWBackingStore bs) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,6 ,fromBackingStore bs) | ChangeWindow d (CWBackingPlanes mask) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,7 ,mask) | ChangeWindow d (CWBackingPixel pixel) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,8 ,pixel) | ChangeWindow d (CWOverrideRedirect b) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,9 ,b) | ChangeWindow d (CWSaveUnder b) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,10,b) | ChangeWindow d (CWEventMask mask) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,11,fromEventMask mask) | ChangeWindow d (CWDontPropagate mask) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,12,fromEventMask mask) | ChangeWindow d (CWColormap cmap) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,13,cmap) | ChangeWindow d (CWCursor cursor) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_ChangeWindow,d,14,cursor); fun XChangeWindowAttributes d [] = () | XChangeWindowAttributes d (H::T) = (ChangeWindow d H; XChangeWindowAttributes d T); fun XGetGeometry (d:Drawable):(Drawable * XPoint * XRectangle * int * int) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetGeometry,d); fun XGetWindowAttributes (d:Drawable) = let val (position,size,borderWidth,depth,visual,root,class, bitGravity,winGravity,backingStore,backingPlanes, backingPixel,saveUnder,colormap,mapInstalled,mapState, allEventMasks,yourEventMask,doNotPropagateMask,overrideRedirect) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetWindowAttributes,d); in XWindowAttributes { position = position, size = size, borderWidth = borderWidth, depth = depth, visual = visual, root = root, class = toWindowClass class, bitGravity = toGravity bitGravity, winGravity = toGravity winGravity, backingStore = toBackingStore backingStore, backingPlanes = backingPlanes, backingPixel = backingPixel, saveUnder = saveUnder, colormap = colormap, mapInstalled = mapInstalled, mapState = toMapState mapState, allEventMasks = toEventMask allEventMasks, yourEventMask = toEventMask yourEventMask, doNotPropagateMask = toEventMask doNotPropagateMask, overrideRedirect = overrideRedirect } end; fun XSetWindowBackground d bg = ChangeWindow d (CWBackPixel bg); fun XSetWindowBackgroundPixmap d pixmap = ChangeWindow d (CWBackPixmap pixmap); fun XSetWindowBorder d border = ChangeWindow d (CWBorderPixel border); fun XSetWindowBorderPixmap d pixmap = ChangeWindow d (CWBorderPixmap pixmap); fun XSetWindowColormap d cmap = ChangeWindow d (CWColormap cmap); fun XSetWindowBorderWidth (d:Drawable) (width:int):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetWindowBorderWidth,d,width); (* Window Configuration 1150 *) val NoDrawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoDrawable,0) : Drawable; val ParentRelative = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoDrawable,1) : Drawable; val NoCursor = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoCursor,0) : Cursor; val NoFont = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoFont,0) : Font; val NoColormap = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoColormap,0) : Colormap; val NoVisual = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_NoVisual,0) : Visual; val CopyFromParentDrawable = NoDrawable; val CopyFromParentVisual = NoVisual; val PointerWindow = NoDrawable; val InputFocus = ParentRelative; val PointerRoot = ParentRelative; val NoSymbol = 0; val AnyKey = 0; datatype CirculateDirection = RaiseLowest | LowerHighest; fun fromCirculateDirection RaiseLowest = 0 | fromCirculateDirection LowerHighest = 1; datatype XWindowChanges = CWPosition of XPoint | CWSize of XRectangle | CWBorderWidth of int | CWStackMode of StackMode | CWSibling of Drawable; fun XCirculateSubwindows (d:Drawable) (dir:CirculateDirection):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCirculateSubwindows,d,fromCirculateDirection dir); fun XCirculateSubwindowsDown d = XCirculateSubwindows d LowerHighest; fun XCirculateSubwindowsUp d = XCirculateSubwindows d RaiseLowest; fun XConfigureWindow (win:Drawable) (L:XWindowChanges list):unit = let fun AddIn m n = if (m And n) = 0 then (m Or n) else raise XWindows "XConfigureWindow parameters"; fun Trans [] acc = acc | Trans ((CWPosition P)::T) (_,S,w,d,s,m) = Trans T (P,S,w,d,s,AddIn m 3) | Trans ((CWSize S)::T) (P,_,w,d,s,m) = Trans T (P,S,w,d,s,AddIn m 12) | Trans ((CWBorderWidth w)::T) (P,S,_,d,s,m) = Trans T (P,S,w,d,s,AddIn m 16) | Trans ((CWSibling d)::T) (P,S,w,_,s,m) = Trans T (P,S,w,d,s,AddIn m 32) | Trans ((CWStackMode s)::T) (P,S,w,d,_,m) = Trans T (P,S,w,d,fromStackMode s,AddIn m 64); in RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XConfigureWindow,win,Trans L (origin,a1,0,NoDrawable,0,0)) end; fun XLowerWindow (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XLowerWindow,d); fun XMapRaised (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XMapRaised,d); fun XMapSubwindows (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XMapSubwindows,d); fun XMapWindow (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XMapWindow,d); fun XMoveResizeWindow (d:Drawable) (p:XPoint) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XMoveResizeWindow,d,p,r); fun XMoveWindow (d:Drawable) (p:XPoint):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XMoveWindow,d,p); fun XQueryTree (d:Drawable):(Drawable * Drawable * Drawable list) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XQueryTree,d); fun XRaiseWindow (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XRaiseWindow,d); fun XReparentWindow (win:Drawable) (parent:Drawable) (p:XPoint):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XReparentWindow,win,parent,p); fun XResizeWindow (d:Drawable) (r:XRectangle):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XResizeWindow,d,r); fun XRestackWindows (L:Drawable list):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XRestackWindows,L); fun XUnmapSubwindows (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XUnmapSubwindows,d); fun XUnmapWindow (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XUnmapWindow,d); (* Window Existence 1200 *) fun RootWindow (d:Display) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_RootWindow,d) : Drawable; fun DestroyXObject x = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_DestroyXObject,x):unit; val XDestroyWindow = DestroyXObject : Drawable -> unit; val XFreeGC = DestroyXObject : GC -> unit; val XFreePixmap = DestroyXObject : Drawable -> unit; val XFreeCursor = DestroyXObject : Cursor -> unit; val XUnloadFont = DestroyXObject : Font -> unit; val XFreeColormap = DestroyXObject : Colormap -> unit; fun XFreeFont (XFontStruct {font,...}) = XUnloadFont font; fun XDestroySubwindows (d:Drawable):unit = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XDestroySubwindows,d); fun XCreateSimpleWindow (parent:Drawable) (position:XPoint) (size:XRectangle) (borderWidth:int) (border:int) (background:int): Drawable = ( RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateSimpleWindow,parent,position,size,borderWidth,border,background,NullHandler,42) ); fun XCreateWindow (parent:Drawable) (position:XPoint) (size:XRectangle) (borderWidth:int) (depth:int) (class:WindowClass) (visual:Visual) (L:XSetWindowAttributes list): Drawable = let val w = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XCreateWindow,parent,position,size,borderWidth,depth,fromWindowClass class,visual,NullHandler,42); in XChangeWindowAttributes w L; w end; (* Window Manager 1250 *) datatype XWMStateHint = DontCareState | NormalState | ZoomState | IconicState | InactiveState; fun fromXWMStateHint DontCareState = 0 | fromXWMStateHint NormalState = 1 | fromXWMStateHint ZoomState = 2 | fromXWMStateHint IconicState = 3 | fromXWMStateHint InactiveState = 4; fun toXWMStateHint 0 = DontCareState | toXWMStateHint 1 = NormalState | toXWMStateHint 2 = ZoomState | toXWMStateHint 3 = IconicState | toXWMStateHint _ = InactiveState; datatype XWMHint = InputHint of bool | StateHint of XWMStateHint | IconPixmapHint of Drawable | IconWindowHint of Drawable | IconPositionHint of XPoint | IconMaskHint of Drawable; datatype XWMSizeHint = PPosition of XPoint | PSize of XRectangle | PMinSize of XRectangle | PMaxSize of XRectangle | PResizeInc of XRectangle | PAspect of XPoint * XPoint | PBaseSize of XRectangle | PWinGravity of Gravity; datatype XStandardColormap = XStandardColormap of { colormap: Colormap, redMax: int, redMult: int, greenMax: int, greenMult: int, blueMax: int, blueMult: int, basePixel: int, visual: Visual }; datatype PropertyValue = PropertyArc of XArc list | PropertyAtom of int list | PropertyBitmap of Drawable list | PropertyColormap of Colormap list | PropertyCursor of Cursor list | PropertyDrawable of Drawable list | PropertyFont of Font list | PropertyInteger of int list | PropertyPixmap of Drawable list | PropertyPoint of XPoint list | PropertyRectangle of XRectangle list | PropertyRGBColormap of XStandardColormap list | PropertyString of string | PropertyVisual of Visual list | PropertyWindow of Drawable list | PropertyWMHints of XWMHint list | PropertyWMSizeHints of XWMSizeHint list | PropertyWMIconSizes of (XRectangle * XRectangle * XRectangle) list; fun fromXWMHints L = let fun AddIn m n = if (m And n) = 0 then (m Or n) else raise XWindows "XWMHint parameters"; fun Trans [] (i,s,p,w,P,m,f) = (i,fromXWMStateHint s,p,w,P,m,f) | Trans ((InputHint i)::T) (_,s,p,w,P,m,f) = Trans T (i,s,p,w,P,m,AddIn f 1) | Trans ((StateHint s)::T) (i,_,p,w,P,m,f) = Trans T (i,s,p,w,P,m,AddIn f 2) | Trans ((IconPixmapHint p)::T) (i,s,_,w,P,m,f) = Trans T (i,s,p,w,P,m,AddIn f 4) | Trans ((IconWindowHint w)::T) (i,s,p,_,P,m,f) = Trans T (i,s,p,w,P,m,AddIn f 8) | Trans ((IconPositionHint P)::T) (i,s,p,w,_,m,f) = Trans T (i,s,p,w,P,m,AddIn f 16) | Trans ((IconMaskHint m)::T) (i,s,p,w,P,_,f) = Trans T (i,s,p,w,P,m,AddIn f 32); in Trans L (false,DontCareState,NoDrawable,NoDrawable,origin,NoDrawable,0) end; fun fromXWMSizeHints L = let fun AddIn m n = if (m And n) = 0 then (m Or n) else raise XWindows "XWMSizeHint parameters"; fun Trans [] (p,s,min,max,inc,a,bs,wg,f) = (p,s,min,max,inc,a,bs,fromGravity wg,f) | Trans ((PPosition p) ::T) (_,s,min,max,inc,a,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 4) | Trans ((PSize s) ::T) (p,_,min,max,inc,a,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 8) | Trans ((PMinSize min)::T) (p,s,_ ,max,inc,a,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 16) | Trans ((PMaxSize max)::T) (p,s,min,_ ,inc,a,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 32) | Trans ((PResizeInc inc)::T) (p,s,min,max,_ ,a,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 64) | Trans ((PAspect a) ::T) (p,s,min,max,inc,_,bs,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 128) | Trans ((PBaseSize bs) ::T) (p,s,min,max,inc,a,_ ,wg,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 256) | Trans ((PWinGravity wg) ::T) (p,s,min,max,inc,a,bs,_ ,f) = Trans T (p,s,min,max,inc,a,bs,wg,AddIn f 512); in Trans L (origin,a1,a1,a1,a1,(origin,origin),a1,ForgetGravity,0) end; fun fromXStandardColormaps L = let fun Trans (XStandardColormap {colormap,redMax,redMult,greenMax,greenMult,blueMax,blueMult,basePixel,visual}) = ( (colormap,redMax,redMult,greenMax,greenMult,blueMax,blueMult,basePixel,visual) ); in map Trans L end; fun XSetProperty (w:Drawable) (property:int) (v:PropertyValue) (t:int):unit = ( case v of PropertyArc L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_ARC) | PropertyAtom L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_ATOM) | PropertyBitmap L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_BITMAP) | PropertyColormap L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_COLORMAP) | PropertyCursor L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_CURSOR) | PropertyDrawable L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_DRAWABLE) | PropertyFont L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_FONT) | PropertyInteger L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_INTEGER) | PropertyPixmap L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_PIXMAP) | PropertyPoint L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_POINT) | PropertyRectangle L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_RECTANGLE) | PropertyString s => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,s,XA_STRING) | PropertyVisual L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_VISUALID) | PropertyWindow L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_WINDOW) | PropertyRGBColormap L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,fromXStandardColormaps L,XA_RGB_COLOR_MAP) | PropertyWMHints L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,[fromXWMHints L],XA_WM_HINTS) | PropertyWMSizeHints L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,[fromXWMSizeHints L],XA_WM_SIZE_HINTS) | PropertyWMIconSizes L => RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XSetProperty,w,property,t,L,XA_WM_ICON_SIZE) ); fun XGetTextProperty (w:Drawable) (property:int):(string * int * int * int) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetTextProperty,w,property); fun GetSet property exceptionName = let fun Get w = let val (string,encoding,format,_) = XGetTextProperty w property; in if encoding = XA_STRING andalso format = 8 then string else raise XWindows exceptionName end; fun Set w s = XSetProperty w property (PropertyString s) XA_STRING; in (Get,Set) end; val (XGetWMName ,XSetWMName) = GetSet XA_WM_NAME "XGetWMName"; val (XGetWMIconName ,XSetWMIconName) = GetSet XA_WM_ICON_NAME "XGetWMIconName"; val (XGetWMClientMachine,XSetWMClientMachine) = GetSet XA_WM_CLIENT_MACHINE "XGetWMClientMachine"; fun GetSetList property exceptionName = let fun Split s = let fun Accum acc s [] = rev (s::acc) | Accum acc s (H::T) = if H = #"\000" then Accum (s::acc) "" T else Accum acc (s ^ String.str H) T; in Accum [] "" (explode s) end; fun Join [] = "" | Join [s] = s | Join (H::T) = H ^ "\000" ^ Join T; val (Get,Set) = GetSet property exceptionName; in (fn w => Split (Get w),fn w => fn L => Set w (Join L)) end; val (XGetWMCommand,XSetWMCommand) = GetSetList XA_WM_COMMAND "XGetWMCommand"; val (XGetWMClass ,XSetWMClass) = GetSetList XA_WM_CLASS "XGetWMClass"; fun XSetWMHints w L = XSetProperty w XA_WM_HINTS (PropertyWMHints L) XA_WM_HINTS; fun XGetWMHints (win:Drawable) = let val (i,s,p,w,P,m,f) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetWMHints,win); val s = toXWMStateHint s; in (if (f And 1) <> 0 then [InputHint i] else []) @ (if (f And 2) <> 0 then [StateHint s] else []) @ (if (f And 4) <> 0 then [IconPixmapHint p] else []) @ (if (f And 8) <> 0 then [IconWindowHint w] else []) @ (if (f And 16) <> 0 then [IconPositionHint P] else []) @ (if (f And 32) <> 0 then [IconMaskHint m] else []) end; fun XSetWMSizeHints w property L = XSetProperty w property (PropertyWMSizeHints L) XA_WM_SIZE_HINTS; fun XGetWMSizeHints (win:Drawable) (property:int) = let val (p,s,min,max,inc,a,bs,wg,f) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetWMSizeHints,win,property); val wg = toGravity wg; in (if (f And 4) <> 0 then [PPosition p] else []) @ (if (f And 8) <> 0 then [PSize s] else []) @ (if (f And 16) <> 0 then [PMinSize min] else []) @ (if (f And 32) <> 0 then [PMaxSize max] else []) @ (if (f And 64) <> 0 then [PResizeInc inc] else []) @ (if (f And 128) <> 0 then [PAspect a] else []) @ (if (f And 256) <> 0 then [PBaseSize bs] else []) @ (if (f And 512) <> 0 then [PWinGravity wg] else []) end; fun XSetWMNormalHints w L = XSetWMSizeHints w XA_WM_NORMAL_HINTS L; fun XGetWMNormalHints w = XGetWMSizeHints w XA_WM_NORMAL_HINTS; fun XSetWMProperties w windowName iconName commands normalHints wmHints class = ( if windowName <> "" then XSetWMName w windowName else (); if iconName <> "" then XSetWMIconName w iconName else (); if commands <> [] then XSetWMCommand w commands else (); XSetWMNormalHints w normalHints; XSetWMHints w wmHints; if class <> [] then XSetWMClass w class else () ); fun XSetIconSizes w sizes = XSetProperty w XA_WM_ICON_SIZE (PropertyWMIconSizes sizes) XA_WM_ICON_SIZE; fun XGetIconSizes (w:Drawable):(XRectangle * XRectangle * XRectangle) list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetIconSizes,w); fun XSetTransientForHint transient main = XSetProperty transient XA_WM_TRANSIENT_FOR (PropertyWindow [main]) XA_WINDOW; fun XGetTransientForHint (w:Drawable):Drawable = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetTransientForHint,w); fun XSetWMColormapWindows w subwins = let val property = XInternAtom (DrawableDisplay w) "WM_COLORMAP_WINDOWS" true; in if property = 0 then raise XWindows "XSetWMColormapWindows failed" else XSetProperty w property (PropertyWindow subwins) XA_WINDOW end; fun XGetWMColormapWindows (w:Drawable):Drawable list = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetWMColormapWindows,w); fun XSetRGBColormaps w property L = XSetProperty w property (PropertyRGBColormap L) XA_RGB_COLOR_MAP; fun XGetRGBColormaps (w:Drawable) (property:int) = let fun Trans (colormap,redMax,redMult,greenMax,greenMult,blueMax,blueMult,basePixel,visual) = ( XStandardColormap { colormap = colormap, redMax = redMax, redMult = redMult, greenMax = greenMax, greenMult = greenMult, blueMax = blueMax, blueMult = blueMult, basePixel = basePixel, visual = visual } ); in map Trans (RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XGetRGBColormaps,w,property)) end; fun XWMGeometry (d:Display) (user:string) (def:string) (borderWidth:int) (L:XWMSizeHint list):(XPoint * XRectangle * Gravity) = let val (p,r,g) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_XWMGeometry,d,user,def,borderWidth,fromXWMSizeHints L); in (p,r,toGravity g) end; (* Miscellaneous and Convenience functions 1300 *) local fun GetID x = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetID,x):int; in val ColormapID = GetID : Colormap -> int; val CursorID = GetID : Cursor -> int; val DrawableID = GetID : Drawable -> int; val FontID = GetID : Font -> int; val GCID = GetID : GC -> int; val VisualID = GetID : Visual -> int; end; fun SameDrawable a b = (DrawableID a = DrawableID b); fun XSetColors gc fg bg = (XSetForeground gc fg; XSetBackground gc bg); fun XGetWindowRoot w = #1 (XGetGeometry w); fun XGetWindowPosition w = #2 (XGetGeometry w); fun XGetWindowSize w = #3 (XGetGeometry w); fun XGetWindowBorderWidth w = #4 (XGetGeometry w); fun XGetWindowDepth w = #5 (XGetGeometry w); fun XGetWindowParent w = #2 (XQueryTree w); fun XGetWindowChildren w = #3 (XQueryTree w); fun GetTimeOfDay():(int * int) = RunCall.run_call1 RuntimeCalls.POLY_SYS_XWindows (XCALL_GetTimeOfDay,0); fun FSFont (XFontStruct {font ,...}) = font; fun FSDirection (XFontStruct {direction ,...}) = direction; fun FSMinChar (XFontStruct {minChar ,...}) = minChar; fun FSMaxChar (XFontStruct {maxChar ,...}) = maxChar; fun FSMinByte1 (XFontStruct {minByte1 ,...}) = minByte1; fun FSMaxByte1 (XFontStruct {maxByte1 ,...}) = maxByte1; fun FSAllCharsExist (XFontStruct {allCharsExist,...}) = allCharsExist; fun FSDefaultChar (XFontStruct {defaultChar ,...}) = defaultChar; fun FSMinBounds (XFontStruct {minBounds ,...}) = minBounds; fun FSMaxBounds (XFontStruct {maxBounds ,...}) = maxBounds; fun FSPerChar (XFontStruct {perChar ,...}) = perChar; fun FSAscent (XFontStruct {ascent ,...}) = ascent; fun FSDescent (XFontStruct {descent ,...}) = descent; fun CharLBearing (XCharStruct {lbearing ,...}) = lbearing; fun CharRBearing (XCharStruct {rbearing ,...}) = rbearing; fun CharWidth (XCharStruct {width ,...}) = width; fun CharAscent (XCharStruct {ascent ,...}) = ascent; fun CharDescent (XCharStruct {descent ,...}) = descent; fun CharAttributes (XCharStruct {attributes,...}) = attributes; fun FSMinWidth f = CharWidth (FSMinBounds f); fun FSMaxWidth f = CharWidth (FSMaxBounds f); fun FSMinHeight f = CharAscent (FSMinBounds f) + CharDescent (FSMinBounds f); fun FSMaxHeight f = CharAscent (FSMaxBounds f) + CharDescent (FSMaxBounds f); fun ShiftDown [] = false | ShiftDown (ShiftMask::_) = true | ShiftDown (_::T) = ShiftDown T; fun ControlDown [] = false | ControlDown (ControlMask::_) = true | ControlDown (_::T) = ControlDown T; end (* local *); end (* structure XWindows *); exception XWindows = XWindows.XWindows; local open XWindows; fun printRect _ _ (r:XRectangle) = let val R = DestructRect r; in PolyML.PrettyString ("Rect " ^ PolyML.makestring R) end; in val () = PolyML.addPrettyPrinter printRect end; polyml-5.6/poly.1000066400000000000000000000050161265146633400137610ustar00rootroot00000000000000.TH POLY 1 "Poly/ML Version 5.6 2015" .SH NAME poly \- the Poly/ML Standard ML implementation .SH SYNOPSIS .B poly .SH DESCRIPTION .I poly starts the Poly/ML shell. Poly/ML is an implementation of Standard ML written by David Matthews originally at the University of Cambridge and maintained as a project supported by contributors. .SH OPTIONS .TP .B \-v Print the version of Poly/ML and exit. .TP .B \--help Print a list of the arguments and exit. .TP .B \-q Suppress the start-up message. .TP .B \-i Interactive mode. Output a prompt for each input line. This is the default if input is from a terminal. .TP .B \--use FILE Reads input from FILE as though executing the ML command 'use "FILE";' before the ML shell starts. .TP .B \--eval STRING Compiles and executes STRING as ML before the ML shell starts. .TP .B \--error-exit Normally if the ML code raises an unhandled exception control returns to the ML shell. With this option the shell exits on an unhandled exception. .TP .B \--with-markup Include extra mark-up information when printing. This is only suitable when Poly/ML is run under an environment that is able to decode the additional information. .TP .B \--ideprotocol Run the IDE communications protocol rather than the normal read-eval-print loop. Only suitable for running within a development environment. .TP .B \--script The input is a shell script. The first line is skipped if it begins with #!. .TP .B \-H " size" Sets the initial heap size. The size may be written as a number optionally followed by K, M or G representing kilobytes, megabytes or gigabytes. If none of these is given the number is taken as megabytes. .TP .BI \--minheap " size" Set the minimum heap size. The heap will not shrink below this value. .TP .BI \--maxheap " size" Set the maximum heap size. The heap will not grow above this value. .TP .BI \--gcpercent " percent" Set the target percentage of time that the code should spend in the garbage collector. The heap sizer will attempt to set the heap size to achieve this target consistent with the minimum and maximum heap sizes given by the arguments and also consistent with keeping paging under control. .TP .BI \--gcthreads " threads" Sets the number of threads used in the parallel garbage collector. Setting this to 1 forces the garbage collector to be single-threaded. The value 0, the default, is taken to be the number of processors (cores) available. .TP .BI \--debug " options" Set various debugging options for the run-time system. .fi .SH SEE ALSO .PP .B http://www.polyml.org The Poly/ML web site. polyml-5.6/poly.ico000066400000000000000000000013761265146633400144000ustar00rootroot00000000000000 ( @@@@Q@@@@@@@0;0 0;@;p;wpx@X@p;wwwww0@@?polyml-5.6/polyc.1000066400000000000000000000020771265146633400141300ustar00rootroot00000000000000.TH POLY 1 "Poly/ML Version 5.6 2015" .SH NAME polyc \- Compile and link a Standard ML program using Poly/ML .SH SYNOPSIS .B polyc .I sourcefile .SH DESCRIPTION .I polyc is a script that compiles a Standard ML program using the Poly/ML compiler and creates an executable program from it. It can also be used to link object files created using the PolyML.export function with the Poly/ML libraries or to produce an object file. When used to compile a Standard ML program it expects the main function to be called "main" e.g. fun main() = print "Hello World\\n"; If the source file is a text file it is assumed to be ML source. If it is a binary file it is assumed to be an object file and will be linked with the Poly/ML library. .SH OPTIONS .B \-c "" Compile but do not link. The object file is written to a file whose name is based on the source file name with any extension replaced with .o .TP .BI \-o " output" Write the executable file to "output". .TP .BI \--help "" Write a list of the arguments and exit. .fi .SH SEE ALSO .PP .B http://www.polyml.org The Poly/ML web site. polyml-5.6/polyc.in000077500000000000000000000067361265146633400144070ustar00rootroot00000000000000#! /bin/sh prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ LINK=@CXX@ LIBDIR=@libdir@ LIBS="@LIBS@" CFLAGS="@CFLAGS@" DEFAULT_COMPILER="${BINDIR}/poly" COMPILER=${DEFAULT_COMPILER} # Extra options for Windows. config.status sets these conditionals to either "" or "#". @NATIVE_WINDOWS_FALSE@EXTRALDFLAGS="" @NATIVE_WINDOWS_TRUE@@ARCHX86_64_TRUE@EXTRALDFLAGS="-Wl,-u,WinMain" @NATIVE_WINDOWS_TRUE@@ARCHINTERPRET64_TRUE@EXTRALDFLAGS="-Wl,-u,WinMain" @NATIVE_WINDOWS_TRUE@@ARCHI386_TRUE@EXTRALDFLAGS="-Wl,-u,_WinMain@16 -Wl,--large-address-aware" @NATIVE_WINDOWS_TRUE@@ARCHINTERPRET_TRUE@EXTRALDFLAGS="-Wl,-u,_WinMain@16 -Wl,--large-address-aware" @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_TRUE@EXTRALDFLAGS+="-mwindows" @NATIVE_WINDOWS_TRUE@@WINDOWSGUI_FALSE@EXTRALDFLAGS+="-mconsole" @NATIVE_WINDOWS_TRUE@SUFFIX="obj" @NATIVE_WINDOWS_FALSE@SUFFIX="o" # Msys passes the Windows TEMP in temp (lower case) # On other systems allow TMPDIR to override /tmp. @NATIVE_WINDOWS_TRUE@TEMPORARYDIR=${temp:-/tmp} @NATIVE_WINDOWS_FALSE@TEMPORARYDIR=${TMPDIR:-/tmp} # Extra options for Mac OS X @EXPMACHO_TRUE@EXTRALDFLAGS="-Wl,-no_pie" TMPOBJFILE=${TEMPORARYDIR}/polyobj.$$.$SUFFIX trap 'rm -f "$TMPOBJFILE"' 0 compile() { echo "use (List.nth(CommandLine.arguments(), 2)); PolyML.export(List.nth(CommandLine.arguments(), 3), main);" | ${COMPILER} -q --error-exit "$1" "$2" } link() { if [ X"$2" = "X" ] then ${LINK} ${EXTRALDFLAGS} ${CFLAGS} "$1" -L${LIBDIR} -Wl,-rpath,${LIBDIR} -lpolymain -lpolyml ${LIBS} else ${LINK} ${EXTRALDFLAGS} ${CFLAGS} "$1" -o "$2" -L${LIBDIR} -Wl,-rpath,${LIBDIR} -lpolymain -lpolyml ${LIBS} fi } printhelp() { echo "Usage: polyc [OPTION]... [SOURCEFILE]" echo Compile and link a Standard ML source file with Poly/ML. echo echo " -b poly Use 'poly' as compiler instead of ${DEFAULT_COMPILER}" echo " -c Compile but do not link. The object file is written to the source file with .$SUFFIX extension." echo " -o output Write the executable file to 'output'" echo " --help Write this text and exit" exit } usage() { echo "$1" echo "Usage: polyc [OPTION]... [SOURCEFILE]" exit 1 } checkml() { extension="${1##*.}" case "$extension" in sml|ML) return 0 ;; o|obj) return 1;; *) test -r "$1" && file -b "$1" | grep -q text ;; esac } sourcefile="" outputfile="" compileonly="no" while [ $# -gt 0 ] do case "$1" in --help) printhelp ;; -b) shift [ $# -eq 0 ] && usage "Expected file name after -b" COMPILER="$1";; -c) compileonly="yes";; -o) shift [ $# -eq 0 ] && usage "Expected file name after -o" outputfile="$1";; *) [ X"$sourcefile" = "X" ] || usage "Only one source file name allowed" sourcefile="$1";; esac shift done [ X"$sourcefile" = "X" ] && usage "No input files" [ -r "$sourcefile" ] || usage "Error: $sourcefile: No such file" case "$compileonly" in yes) if [ "x$outputfile" = "x" ]; then basename=${sourcefile##*/} outputfile=${basename%.*}.o fi compile "$sourcefile" "$outputfile" ;; no) if checkml "$sourcefile" then compile "$sourcefile" "$TMPOBJFILE" && link "$TMPOBJFILE" "$outputfile" else link "$sourcefile" "$outputfile" fi ;; esac polyml-5.6/polyexports.h000066400000000000000000000071241265146633400154770ustar00rootroot00000000000000/* Title: polyexports.h Copyright (c) 2006, 2011, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This header contains the structures used in saved state created by "export". */ #ifndef _STANDALONE_H #define _STANDALONE_H 1 // Get time_t #ifdef HAVE_TIME_H #include #endif // Get uintptr_t #if HAVE_STDINT_H # include #endif #if HAVE_INTTYPES_H # ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS # endif # include #endif #ifdef HAVE_STDDEF_H # include #endif #if defined(HAVE_WINDOWS_H) # include #endif // There are several entries typedef struct _memTableEntry { void *mtAddr; // The address of the area of memory uintptr_t mtLength; // The length in bytes of the area uintptr_t mtFlags; // Flags describing the area. uintptr_t mtIndex; // An index to identify permanent spaces. } memoryTableEntry; #define MTF_WRITEABLE 0x00000001 // The area is writeable by ML code #define MTF_EXECUTABLE 0x00000002 // The area contains executable code #define MTF_NO_OVERWRITE 0x00000004 // With MTF_WRITEABLE: Don't load over the top #define MTF_BYTES 0x00000008 // Contains only byte data and no addresses typedef struct _exportDescription { unsigned structLength; // The length of this structure unsigned memTableSize; // The size of each entry in the memory table unsigned memTableEntries; // The number of entries in the memory table unsigned ioIndex; // The index in the memory table for the io interface area memoryTableEntry *memTable; // Pointer to the memory table. void *rootFunction; // Points to the start-up function time_t timeStamp; // Creation time stamp unsigned architecture; // Machine architecture unsigned rtsVersion; // Run-time system version unsigned ioSpacing; // Size of each entry in the io interface area. } exportDescription; extern exportDescription poly_exports; #ifdef __cplusplus extern "C" { #endif #if (defined(_WIN32) && ! defined(__CYGWIN__)) #include # ifdef LIBPOLYML_BUILD # ifdef DLL_EXPORT # define POLYLIB_API __declspec (dllexport) # endif # elif defined _MSC_VER // Visual C - POLYLIB_EXPORTS is defined in the library project settings # ifdef POLYLIB_EXPORTS # define POLYLIB_API __declspec (dllexport) # else # define POLYLIB_API __declspec (dllimport) # endif # elif defined DLL_EXPORT # define POLYLIB_API __declspec (dllimport) # else # define POLYLIB_API # endif extern POLYLIB_API int PolyWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow, exportDescription *exports); #else int polymain(int argc, char *argv[], exportDescription *exports); #endif #ifdef __cplusplus }; #endif #endif polyml-5.6/polyimport.1000066400000000000000000000026261265146633400152200ustar00rootroot00000000000000.TH POLY 1 "Poly/ML Version 5.6 2015" .SH NAME polyimport \- the Poly/ML import program .SH SYNOPSIS .B polyimport .I importfile .SH DESCRIPTION .I polyimport reads in a Poly/ML import file and runs it. Import files are generated using the PolyML.exportPortable function. .SH OPTIONS .B \-H " size" Sets the initial heap size. The size may be written as a number optionally followed by K, M or G representing kilobytes, megabytes or gigabytes. If none of these is given the number is taken as megabytes. .TP .BI \--minheap " size" Set the minimum heap size. The heap will not shrink below this value. .TP .BI \--maxheap " size" Set the maximum heap size. The heap will not grow above this value. .TP .BI \--gcpercent " percent" Set the target percentage of time that the code should spend in the garbage collector. The heap sizer will attempt to set the heap size to achieve this target consistent with the minimum and maximum heap sizes given by the arguments and also consistent with keeping paging under control. .TP .BI \--gcthreads " threads" Sets the number of threads used in the parallel garbage collector. Setting this to 1 forces the garbage collector to be single-threaded. The value 0, the default, is taken to be the number of processors (cores) available. .TP .BI \--debug " options" Set various debugging options for the run-time system. .fi .SH SEE ALSO .PP .B http://www.polyml.org The Poly/ML web site. polyml-5.6/polyimport.c000066400000000000000000000024461265146633400153020ustar00rootroot00000000000000/* Title: polyimport.c Copyright (c) 2006, 2015 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // This is the start-up function for Poly/ML for importing a portable database. #ifdef HAVE_CONFIG_H #include "config.h" #elif defined(_WIN32) #include "winconfig.h" #else #error "No configuration file" #endif #include "polyexports.h" #if (defined(_WIN32) && ! defined(__CYGWIN__)) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return PolyWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow, 0); } #else int main(int argc, char *argv[]) { return polymain(argc, argv, 0); } #endif polyml-5.6/polyml.pyp000066400000000000000000000174011265146633400147630ustar00rootroot00000000000000[General] RootFile=test [Files] NFiles=203 File0=mlsource\MLCompiler\COMPILER_BODY.ML File1=mlsource\MLCompiler\DEBUGGER_.sml Root=Root.ML File2=mlsource\MLCompiler\Debug.ML File3=mlsource\MLCompiler\Debugger.sml File4=basis\Signal.sml File5=mlsource\MLCompiler\INITIALISE_.ML File6=mlsource\MLCompiler\Initialise.ML File7=mlsource\MLCompiler\Structures.ML File8=mlsource\MLCompiler\STRUCTURES_.ML File9=mlsource\MLCompiler\StructVals.ML File10=mlsource\MLCompiler\Symbols.ML File11=mlsource\MLCompiler\SymSet.ML File12=mlsource\MLCompiler\TYPE_TREE.ML File13=mlsource\MLCompiler\TypeTree.ML File14=mlsource\MLCompiler\Utilities.ML File15=mlsource\MLCompiler\UTILITIES_.ML File16=mlsource\MLCompiler\VALUE_OPS.ML File17=mlsource\MLCompiler\ValueOps.ML File18=mlsource\MLCompiler\CompilerVersion.sml File19=mlsource\MLCompiler\CompilerBody.ML File20=mlsource\MLCompiler\ml_bind.ML File21=mlsource\MLCompiler\Lex.ML File22=mlsource\MLCompiler\LEX_.ML File23=mlsource\MLCompiler\LEXSIG.sml File24=mlsource\MLCompiler\Make.ML File25=mlsource\MLCompiler\MAKE_.ML File26=mlsource\MLCompiler\STRUCT_VALS.ML File27=mlsource\MLCompiler\PARSE_DEC.ML File28=mlsource\MLCompiler\PARSE_TYPE.ML File29=mlsource\MLCompiler\ParseDec.ML File30=mlsource\MLCompiler\ParseType.ML File31=mlsource\MLCompiler\Pretty.sml File32=mlsource\MLCompiler\PRETTYSIG.sml File33=mlsource\MLCompiler\PRINT_TABLE.ML File34=mlsource\MLCompiler\PrintTable.ML File35=mlsource\MLCompiler\Skips.ML File36=mlsource\MLCompiler\SKIPS_.ML File37=mlsource\MLCompiler\EXPORTTREESIG.sml File38=mlsource\MLCompiler\ExportTree.sml File39=mlsource\MLCompiler\ExportTreeStruct.sml File40=basis\FinalPolyML.sml File41=basis\PrettyPrinter.sml File42=mlsource\MLCompiler\STRUCTVALSIG.sml File43=mlsource\MLCompiler\TYPETREESIG.sml File44=mlsource\MLCompiler\VALUEOPSSIG.sml File45=basis\String.sml File46=basis\StringCvt.sml File47=mlsource\MLCompiler\STRUCTURESSIG.sml File48=basis\Vector.sml File49=basis\InitialBasis.ML File50=basis\Array.sml File51=basis\Array2.sml File52=mlsource\MLCompiler\CopierStruct.sml File53=mlsource\MLCompiler\COPIER.sml File54=mlsource\MLCompiler\COPIERSIG.sml File55=basis\build.sml File56=basis\Word32.sml File57=basis\LargeWord.sml File58=mlsource\MLCompiler\TypeIDCodeStruct.sml File59=mlsource\MLCompiler\TYPEIDCODE.sml File60=mlsource\MLCompiler\TYPEIDCODESIG.sml File61=mlsource\MLCompiler\CODETREESIG.ML File62=mlsource\MLCompiler\PARSETREESIG.sml File63=mlsource\MLCompiler\SignaturesStruct.sml File64=mlsource\MLCompiler\SIGNATURES.sml File65=mlsource\MLCompiler\SIGNATURESSIG.sml File66=basis\Universal.ML File67=basis\TextIO.sml File68=basis\InitialPolyML.ML File69=Root.ML File70=mlsource\BuildAll.sml File71=basis\TopLevelPolyML.sml File72=basis\ImperativeIO.sml File73=basis\BasicStreamIO.sml File74=basis\LibrarySupport.sml File75=basis\BoolArray.sml File76=basis\Thread.sml File77=mlsource\MLCompiler\CodeTree\BaseCodeTree.sml File78=mlsource\MLCompiler\CodeTree\BaseCodeTreeSig.sml File79=mlsource\MLCompiler\CodeTree\CODETREE.ML File80=mlsource\MLCompiler\CodeTree\ml_bind.ML File81=mlsource\MLCompiler\DEBUGGERSIG.sml File82=basis\OS.sml File83=mlsource\MLCompiler\Boot\UniversalTable.ML File84=basis\PackRealBig.sml File85=basis\NetHostDB.sml File86=basis\General.sml File87=basis\Option.sml File88=basis\IntInf.sml File89=basis\Windows.sml File90=basis\VectorSliceOperations.sml File91=basis\Bool.sml File92=basis\Int.sml File93=basis\List.sml File94=basis\HashArray.ML File95=basis\LibraryIOSupport.sml File96=basis\ExnPrinter.sml File97=basis\Timer.sml File98=basis\Date.sml File99=basis\Time.sml File100=basis\IEEE_REAL.sml File101=basis\IEEEReal.sml File102=basis\Real.sml File103=basis\Word8Array.sml File104=basis\ListPair.sml File105=mlsource\MLCompiler\Boot\Misc.ML File106=mlsource\MLCompiler\Boot\Address.ML File107=mlsource\MLCompiler\Boot\HashTable.ML File108=basis\PackWord8Big.sml File109=basis\Word8.sml File110=mlsource\BuildBasis.sml File111=basis\BinIO.sml File112=basis\BinPrimIO.sml File113=basis\BIT_FLAGS.sml File114=basis\Byte.sml File115=basis\CommandLine.sml File116=basis\GenericSock.sml File117=basis\IMPERATIVE_IO.sml File118=basis\INetSock.sml File119=basis\Int32.sml File120=basis\IntArray2.sml File121=basis\IntArray.sml File122=basis\INTEGER.sml File123=basis\IO.sml File124=basis\MATH.sml File125=basis\MONO_ARRAY.sml File126=basis\MONO_ARRAY_SLICE.sml File127=basis\MONO_VECTOR.sml File128=basis\MONO_VECTOR_SLICE.sml File129=basis\NetProtDB.sml File130=basis\NetServDB.sml File131=basis\PolyVectorOperations.sml File132=basis\Posix.sml File133=basis\PRIM_IO.sml File134=basis\PrimIO.sml File135=basis\processes.ML File136=basis\RealArray.sml File137=basis\RuntimeCalls.ML File138=basis\SML90.sml File139=basis\Socket.sml File140=basis\STREAM_IO.sml File141=basis\SysWord.sml File142=basis\Text.sml File143=basis\TextPrimIO.sml File144=basis\UniversalArray.ML File145=basis\Unix.sml File146=basis\UnixSock.sml File147=basis\VectorOperations.sml File148=basis\Weak.sml File149=mlsource\MLCompiler\DatatypeRep.ML File150=mlsource\MLCompiler\DATATYPEREPSIG.sml File151=mlsource\MLCompiler\DATATYPE_REP.ML File152=mlsource\MLCompiler\Boot\StretchArray.ML File153=basis\Word32In64.sml File154=mlsource\MLCompiler\CodeTree\CODETREE_FUNCTIONS.sml File155=mlsource\MLCompiler\CodeTree\CodetreeFunctionsSig.sml File156=mlsource\MLCompiler\CodeTree\CODETREE_STATIC_LINK_AND_CASES.sml File157=mlsource\MLCompiler\CodeTree\CODETREE_OPTIMISER.sml File158=mlsource\MLCompiler\CodeTree\CODETREE_REMOVE_REDUNDANT.sml File159=mlsource\MLCompiler\CodeTree\BackendIntermediateCode.sml File160=mlsource\MLCompiler\CodeTree\BackendIntermediateCodeSig.sml File161=mlsource\MLCompiler\CodeTree\CODETREE_SIMPLIFIER.sml File162=mlsource\MLCompiler\SymbolsSig.sml File163=mlsource\MLCompiler\SymsetSig.sml File164=mlsource\MLCompiler\CodeTree\CODETREE_CODEGEN_CONSTANT_FUNCTIONS.sml File165=mlsource\MLCompiler\ParseTree\ml_bind.ML File166=mlsource\MLCompiler\ParseTree\PARSE_TREE.ML File167=mlsource\MLCompiler\ParseTree\BaseParseTreeSig.sml File168=mlsource\MLCompiler\ParseTree\BASE_PARSE_TREE.sml File169=mlsource\MLCompiler\ParseTree\CODEGEN_PARSETREE.sml File170=mlsource\MLCompiler\ParseTree\CodegenParsetreeSig.sml File171=mlsource\MLCompiler\ParseTree\EXPORT_PARSETREE.sml File172=mlsource\MLCompiler\ParseTree\ExportParsetreeSig.sml File173=mlsource\MLCompiler\ParseTree\PRINT_PARSETREE.sml File174=mlsource\MLCompiler\ParseTree\PrintParsetreeSig.sml File175=mlsource\MLCompiler\ParseTree\TYPECHECK_PARSETREE.sml File176=mlsource\MLCompiler\ParseTree\TypeCheckParsetreeSig.sml File177=mlsource\MLCompiler\ParseTree\MATCH_COMPILER.sml File178=mlsource\MLCompiler\ParseTree\MatchCompilerSig.sml File179=basis\SingleAssignment.sml File180=mlsource\MLCompiler\CodeTree\X86Code\CODE_ARRAY.ML File181=mlsource\MLCompiler\CodeTree\X86Code\CodeCons.i386.ML File182=mlsource\MLCompiler\CodeTree\X86Code\CodeCons.x86_64.ML File183=mlsource\MLCompiler\CodeTree\X86Code\CODECONSSIG.sml File184=mlsource\MLCompiler\CodeTree\X86Code\CODEGEN_TABLE.ML File185=mlsource\MLCompiler\CodeTree\X86Code\CODEGEN_TABLESIG.sml File186=mlsource\MLCompiler\CodeTree\X86Code\CodeGenTable.ML File187=mlsource\MLCompiler\CodeTree\X86Code\GENERATE_CODE.ML File188=mlsource\MLCompiler\CodeTree\X86Code\ml_bind.i386.ML File189=mlsource\MLCompiler\CodeTree\X86Code\ml_bind.x86_64.ML File190=mlsource\MLCompiler\CodeTree\X86Code\X86CODESIG.sml File191=mlsource\MLCompiler\CodeTree\X86Code\X86LOWLEVEL.ML File192=mlsource\MLCompiler\CodeTree\X86Code\X86OPTIMISE.ML File193=mlsource\MLCompiler\CodeTree\X86Code\X86OUTPUTCODE.ML File194=basis\Statistics.ML File195=mlsource\MLCompiler\CodeTree\CODETREE_LAMBDA_LIFT.sml File196=basis\ASN1.sml File197=basis\PolyMLException.sml File198=basis\Foreign.sml File199=basis\ForeignConstants.sml File200=basis\ForeignMemory.sml File201=mlsource\MLCompiler\COMPILERBODYSIG.sml File202=mlsource\MLCompiler\DEBUGSIG.ML polyml-5.6/polystatistics.h000066400000000000000000000074261265146633400161720ustar00rootroot00000000000000/* Title: polystatics.h - Layout of statistics data in shared memory Copyright (c) 2011 David C.J. Matthews This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef POLY_STATISTICS_INCLUDED #define POLY_STATISTICS_INCLUDED #ifdef HAVE_SYS_TIME_H #include #endif // Name of shared memory file. This has the process ID appended. // In Unix this is in /tmp #define POLY_STATS_NAME "poly-stats-" // ASN1 tags for the statistics #define POLY_STATS_C_STATISTICS 0x60 // Application 0 - Implicit set #define POLY_STATS_C_COUNTERSTAT 0x61 // Application 1 - Implicit sequence #define POLY_STATS_C_SIZESTAT 0x62 // Application 2 - Implicit sequence #define POLY_STATS_C_TIMESTAT 0x63 // Application 3 - Implicit sequence #define POLY_STATS_C_IDENTIFIER 0x44 // Application 4 - Implicit integer #define POLY_STATS_C_NAME 0x45 // Application 5 - Implicit visible string #define POLY_STATS_C_COUNTER_VALUE 0x46 // Application 6 - Implicit integer #define POLY_STATS_C_BYTE_COUNT 0x47 // Application 7 - Implicit integer #define POLY_STATS_C_TIME 0x68 // Application 8 - Implicit sequence #define POLY_STATS_C_SECONDS 0x49 // Application 9 - Implicit integer #define POLY_STATS_C_MICROSECS 0x4A // Application 10 - Implicit integer #define POLY_STATS_C_USERSTAT 0x6B // Application 11 - Implicit sequence // Identifiers for the particular statistics #define POLY_STATS_ID_THREADS 1 // Total number of threads #define POLY_STATS_ID_THREADS_IN_ML 2 // Threads running ML code #define POLY_STATS_ID_THREADS_WAIT_IO 3 // Threads waiting for IO #define POLY_STATS_ID_THREADS_WAIT_MUTEX 4 // Threads waiting for a mutex #define POLY_STATS_ID_THREADS_WAIT_CONDVAR 5 // Threads waiting for a condition var #define POLY_STATS_ID_THREADS_WAIT_SIGNAL 6 // Special case - signal handling thread #define POLY_STATS_ID_GC_FULLGC 7 // Number of full garbage collections #define POLY_STATS_ID_GC_PARTIALGC 8 // Number of partial GCs #define POLY_STATS_ID_TOTAL_HEAP 9 // Total size of the local heap #define POLY_STATS_ID_AFTER_LAST_GC 10 // Space free after last GC #define POLY_STATS_ID_AFTER_LAST_FULLGC 11 // Space free after the last full GC #define POLY_STATS_ID_ALLOCATION 12 // Size of allocation space #define POLY_STATS_ID_ALLOCATION_FREE 13 // Space available in allocation area #define POLY_STATS_ID_NONGC_UTIME 14 #define POLY_STATS_ID_NONGC_STIME 15 #define POLY_STATS_ID_GC_UTIME 16 #define POLY_STATS_ID_GC_STIME 17 #define POLY_STATS_ID_USER0 18 #define POLY_STATS_ID_USER1 19 #define POLY_STATS_ID_USER2 20 #define POLY_STATS_ID_USER3 21 #define POLY_STATS_ID_USER4 22 #define POLY_STATS_ID_USER5 23 #define POLY_STATS_ID_USER6 24 #define POLY_STATS_ID_USER7 25 #endif // POLY_STATISTICS_INCLUDED polyml-5.6/resource.h000066400000000000000000000014401265146633400147110ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by PolyML.rc // #define IDR_MENU 101 #define IDD_ABOUT_POLYML 101 #define IDI_ICON 102 #define ID_EDIT_COPY 30002 #define ID_EDIT_PASTE 30003 #define ID_RUN_INTERRUPT 40001 #define ID_HELP_ABOUT 40002 #define ID_FILE_QUIT 40003 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif polyml-5.6/samplecode/000077500000000000000000000000001265146633400150265ustar00rootroot00000000000000polyml-5.6/samplecode/Networking/000077500000000000000000000000001265146633400171555ustar00rootroot00000000000000polyml-5.6/samplecode/Networking/HTTPSample.ML000066400000000000000000000015371265146633400213360ustar00rootroot00000000000000(* Example code to read from the Poly/ML website. *) let val s : Socket.active INetSock.stream_sock = INetSock.TCP.socket(); val SOME poly = NetHostDB.getByName "www.polyml.org" val addr = INetSock.toAddr(NetHostDB.addr poly, 80) (* There seems to be a bug in Solaris 8 which means that select indicates that there is data to read even when there isn't. *) fun readit () = case Socket.select{rds = [Socket.sockDesc s], wrs=[], exs=[], timeOut=SOME(Time.fromSeconds 10)} of { rds = [], ...} => () | _ => let val text = Socket.recvVec(s, 1) in if Word8Vector.length text = 0 then () else ( print(Byte.bytesToString text); readit() ) end in Socket.connect (s, addr); Socket.sendVec(s, Word8VectorSlice.full(Byte.stringToBytes "GET / HTTP/1.1\r\nHost: www.polyml.org\r\n\r\n")); readit(); Socket.close s end; polyml-5.6/samplecode/PolyML/000077500000000000000000000000001265146633400162025ustar00rootroot00000000000000polyml-5.6/samplecode/PolyML/CodeTree.ML000066400000000000000000000052571265146633400201370ustar00rootroot00000000000000(* Example code for let fun addOne x = x+1 in addOne 2 end *) local open PolyML.CodeTree RuntimeCalls val addFn = rtsFunction POLY_SYS_aplus val one = mkConstant (RunCall.unsafeCast 1) val addOne = mkFunction(mkCall(addFn, [mkLoad(~1, 0), one]), 1, "addOne") val two = mkConstant (RunCall.unsafeCast 2) val block = mkEnv([mkDec(1, addOne)], mkCall(mkLoad(1, 0), [two])) val run = genCode block () val result = valOf (evalue run) in val r: int = RunCall.unsafeCast result end; (* Another example showing how ML values can be incorporated in the code. The code is roughly equivalent to the ML code but the function being defined takes two arguments rather than a tuple. let fun concatWithSpace(a,b) = a ^ " " ^ b in TextIO.print(concatWithSpace("Hello", "World\n" end *) let open PolyML.NameSpace PolyML.CodeTree (* Simple case: just cast this as a constant. *) val printCode = mkConstant (RunCall.unsafeCast TextIO.print) (* More complicated case. Using this gets access to any inlined code for "^". *) val concat = codeForValue(valOf (#lookupVal PolyML.globalNameSpace "^")) (* fun concatWithSpace(a,b) = a ^ " " ^ b The function we're defining takes two arguments but ML functions such as "^" always take a single argument which may be a tuple. *) val space = mkConstant(RunCall.unsafeCast " ") val concatWithSpace = mkFunction( mkCall(concat, [mkTuple[ mkCall(concat, [mkTuple[mkLoad(~2, 0), space]]), mkLoad(~1, 0) ] ]), 2, "concatWithSpace") val hello = mkConstant(RunCall.unsafeCast "Hello") val world = mkConstant(RunCall.unsafeCast "World\n") val block = mkEnv( [mkDec(1, concatWithSpace)], mkCall(printCode, [mkCall(mkLoad(1, 0), [hello, world])] ) ) val code = genCode block in code(); () end; (* Example of building a loop. *) let open RuntimeCalls; open PolyML.CodeTree; fun printInt n = TextIO.print(Int.toString n ^ "\n"); val code = mkBeginLoop( mkIf( mkCall(rtsFunction POLY_SYS_equala, [mkLoad(1,0), mkConstant(RunCall.unsafeCast 10)]), mkConstant(RunCall.unsafeCast 0), mkEnv( [mkNullDec(mkCall(mkConstant(RunCall.unsafeCast printInt), [mkLoad(1,0)]))], mkLoop[ mkCall(rtsFunction POLY_SYS_aplus, [mkLoad(1,0), mkConstant(RunCall.unsafeCast 1)]) ] ) ) , [(1, mkConstant(RunCall.unsafeCast 0))] ) in genCode code () end; polyml-5.6/samplecode/ide/000077500000000000000000000000001265146633400155675ustar00rootroot00000000000000polyml-5.6/samplecode/ide/use.sml000066400000000000000000000151251265146633400171040ustar00rootroot00000000000000(* Title: Modified version of the "use" function which saves state Author: David Matthews Copyright David Matthews 2009 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (* This is an example version of the "use" function that the IDE may call in the prelude before a build. It takes a directory name and returns a "use" function that saves the state and dependencies in ".save" and ".deps" files within that directory. It should be called as e.g. val use = ideUse ".polysave" to define a version of "use" for the rest of the compilation. *) fun ideUse saveDirName = let (* If we are building under the IDE we need to record the dependencies and also save the state before each file we "use". *) val saveDirectory: string option ref = ref NONE val dependencies: string list ref = ref [] open OS.Path (* Get the root directory and save directory (typically .polysave). Do this once when this function is called and convert them to absolute paths using the current directory when this is called. Assume that the root directory is the parent of the save directory. N.B. Because the directory may not yet exist we can't use OS.FileSys.fullPath. *) val saveDirPath = mkAbsolute { path = saveDirName, relativeTo = OS.FileSys.getDir() } (* The root directory is the directory that is assumed to be the root of the project. For each source file within this directory with path a/b/c.ML there will be a corresponding saved state file .polysave/a/b/c.ML . If "use" is called on a file that is not within the root directory no information will be saved for that file. *) val { dir = rootPath, ...} = splitDirFile saveDirPath fun preUse fileName = let open OS.Path (* Create a directory hierarchy. *) fun createDirs path = if path = "" orelse (OS.FileSys.isDir path handle OS.SysErr _ => false) then () else ( createDirs (OS.Path.dir path); OS.FileSys.mkDir path ); (* Compute the full path to the actual file taking account of any change of directory then make it relative to the root. *) val filePathRelativeToRoot = let val fullFileName = OS.FileSys.fullPath fileName val pathFromRoot = mkRelative { path = fullFileName, relativeTo = rootPath } (* Is the file in the root directory or a sub-directory or is it in some other directory? *) val { arcs, ...} = fromString pathFromRoot in case arcs of topArc :: _ => (* If the first part of the path is ".." then it's in some other directory. *) if topArc = parentArc then NONE else SOME pathFromRoot | _ => NONE (* No path at all? *) end handle Path => NONE (* Different volumes: can't make relative path. *) | OS.SysErr _ => NONE (* If fileName doesn't actually exist. *) in case filePathRelativeToRoot of NONE => () (* Do nothing: we can't save it. *) | SOME fileName => let local val baseName = concat(saveDirPath, fileName) in val saveFile = mkCanonical (joinBaseExt{ base = baseName, ext = SOME "save"}) val depFile = mkCanonical (joinBaseExt{ base = baseName, ext = SOME "deps"}) end (* Reset the save directory before we save so that it isn't set in the saved state. That means that "use" won't save the state unless it's explicitly asked to. *) val saveSave = ! saveDirectory in (* Create any containing directories. *) createDirs(OS.Path.dir saveFile); saveDirectory := NONE; (* Save the state. *) PolyML.SaveState.saveChild (saveFile, List.length(PolyML.SaveState.showHierarchy())); (* Restore the ref. *) saveDirectory := saveSave; (* Write out the dependencies. *) let open TextIO val f = openOut depFile in List.app(fn s => output(f, s ^ "\n")) (!dependencies); closeOut f end; (* Add this file to the dependency list. *) dependencies := ! dependencies @ [fileName] end handle (ex as OS.SysErr args) => (print (String.concat["Exception SysErr(", PolyML.makestring args, ") raised for ", fileName, "\n"]); raise ex) end in fn originalName => let (* Find the actual file name by following the suffixes. This mirrors what "use" will do. *) (* use "f" first tries to open "f" but if that fails it tries "f.ML", "f.sml" etc. *) fun trySuffixes [] = (* Not found - attempt to open the original and pass back the exception. *) (TextIO.openIn originalName, originalName) | trySuffixes (s::l) = (TextIO.openIn (originalName ^ s), originalName ^ s) handle IO.Io _ => trySuffixes l (* First in list is the name with no suffix. *) val (inStream, fileName) = trySuffixes("" :: ! PolyML.suffixes) val () = preUse fileName in PolyML.use fileName (* Now call the underlying use to do the work. *) end end; polyml-5.6/winconfig.h000066400000000000000000000476361265146633400150660ustar00rootroot00000000000000/* Hand-generated config file for Windows. */ #ifndef CONF_H_INCLUDED #define CONF_H_INCLUDED /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to the type of elements in the array set by `getgroups'. Usually this is either `int' or `gid_t'. */ #undef GETGROUPS_T /* Define to 1 if the `getpgrp' function requires zero arguments. */ #undef GETPGRP_VOID /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA #define HAVE_ALLOCA 1 /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H #define HAVE_ASSERT_H 1 /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if your system has a working `chown' function. */ #undef HAVE_CHOWN /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H #define HAVE_CTYPE_H 1 /* Define to 1 if you have the declaration of `fpsetmask', and to 0 if you don't. */ #undef HAVE_DECL_FPSETMASK /* Define to 1 if you have the header file. */ #undef HAVE_DIRECT_H #define HAVE_DIRECT_H 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `dlopen' function. */ #undef HAVE_DLOPEN /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `dtoa' function. */ #undef HAVE_DTOA /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 #define HAVE_DUP2 1 /* Define to 1 if you have the header file. */ #undef HAVE_ELF_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H #define HAVE_ERRNO_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_EXCPT_H #define HAVE_EXCPT_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H #define HAVE_FCNTL_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_FENV_H #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) // Defined in VS 2013 #define HAVE_FENV_H 1 #endif /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H #define HAVE_FLOAT_H 1 /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR #define HAVE_FLOOR 1 /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the header file. */ #undef HAVE_FPU_CONTROL_H /* Define to 1 if you have the `ftruncate' function. */ #undef HAVE_FTRUNCATE /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if your system has a working `getgroups' function. */ #undef HAVE_GETGROUPS /* Define to 1 if you have the `gethostbyaddr' function. */ #undef HAVE_GETHOSTBYADDR #define HAVE_GETHOSTBYADDR 1 /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME #define HAVE_GETHOSTNAME 1 /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `getrusage' function. */ #undef HAVE_GETRUSAGE /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the gmp.h header file */ #undef HAVE_GMP_H /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H /* Define to 1 if the system has the type `IMAGE_FILE_HEADER'. */ #undef HAVE_IMAGE_FILE_HEADER #define HAVE_IMAGE_FILE_HEADER 1 /* Define to 1 if the system has the type `intptr_t'. */ #undef HAVE_INTPTR_T /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H // This was present in VS 2013 but not 2015. /* Define to 1 if you have the header file. */ #undef HAVE_IO_H #define HAVE_IO_H 1 /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have libffi */ #undef HAVE_LIBFFI /* Define to 1 if you have the `gcc' library (-lgcc). */ #undef HAVE_LIBGCC /* Define to 1 if you have the `gcc_s' library (-lgcc_s). */ #undef HAVE_LIBGCC_S /* Define to 1 if you have the `gdi32' library (-lgdi32). */ #undef HAVE_LIBGDI32 #define HAVE_LIBGDI32 1 /* Define to 1 if you have libgmp */ #undef HAVE_LIBGMP /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define to 1 if you have the `stdc++' library (-lstdc++). */ #undef HAVE_LIBSTDC__ /* Define to 1 if you have the `wsock32' library (-lwsock32). */ #undef HAVE_LIBWSOCK32 #define HAVE_LIBWSOCK32 1 /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the `Xext' library (-lXext). */ #undef HAVE_LIBXEXT /* Define to 1 if you have the `Xm' library (-lXm). */ #undef HAVE_LIBXM /* Define to 1 if you have the `Xt' library (-lXt). */ #undef HAVE_LIBXT /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H #define HAVE_LOCALE_H 1 /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if the system has the type `long long'. */ #undef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 /* Define to 1 if `lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_MACH_O_RELOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H #define HAVE_MALLOC_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H #define HAVE_MATH_H 1 /* Define to 1 if `gregs' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_GREGS /* Define to 1 if `mc_esp' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_MC_ESP /* Define to 1 if `regs' is a member of `mcontext_t'. */ #undef HAVE_MCONTEXT_T_REGS /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H #define HAVE_MEMORY_H 1 /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET #define HAVE_MEMSET 1 /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the `mkfifo' function. */ #undef HAVE_MKFIFO /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the `mprotect' function. */ #undef HAVE_MPROTECT /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H /* Define to 1 if you have the `pathconf' function. */ #undef HAVE_PATHCONF /* Define to 1 if you have the PE/COFF types. */ #undef HAVE_PECOFF #define HAVE_PECOFF 1 /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `rmdir' function. */ #undef HAVE_RMDIR /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT #define HAVE_SELECT 1 /* Define to 1 if you have the header file. */ #undef HAVE_SEMAPHORE_H /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE #define HAVE_SETLOCALE 1 /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the `sigaltstack' function. */ #undef HAVE_SIGALTSTACK /* Define to 1 if the system has the type `sighandler_t'. */ #undef HAVE_SIGHANDLER_T /* Define to 1 if you have the header file. */ #undef HAVE_SIGINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H #define HAVE_SIGNAL_H 1 /* Define to 1 if the system has the type `sig_t'. */ #undef HAVE_SIG_T /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET #define HAVE_SOCKET 1 /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT #define HAVE_SQRT 1 /* Define to 1 if the system has the type `stack_t'. */ #undef HAVE_STACK_T /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H #define HAVE_STDDEF_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H #define HAVE_STDIO_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP #define HAVE_STRDUP 1 /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR #define HAVE_STRERROR 1 /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME #define HAVE_STRFTIME 1 /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H #define HAVE_STRING_H /* Define to 1 if you have the `strtod' function. */ #undef HAVE_STRTOD #define HAVE_STRTOD 1 /* Define to 1 if `ss' is a member of `struct mcontext'. */ #undef HAVE_STRUCT_MCONTEXT_SS /* Define to 1 if the system has the type `struct sigcontext'. */ #undef HAVE_STRUCT_SIGCONTEXT /* Define to 1 if `sun_len' is a member of `struct sockaddr_un'. */ #undef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN /* Define to 1 if `ss' is a member of `struct __darwin_mcontext32'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT32_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext32'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT32___SS /* Define to 1 if `ss' is a member of `struct __darwin_mcontext64'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT64_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext64'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT64___SS /* Define to 1 if `ss' is a member of `struct __darwin_mcontext'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT_SS /* Define to 1 if `__ss' is a member of `struct __darwin_mcontext'. */ #undef HAVE_STRUCT___DARWIN_MCONTEXT___SS /* Define to 1 if you have the `sysctl' function. */ #undef HAVE_SYSCTL /* Define to 1 if you have the `sysctlbyname' function. */ #undef HAVE_SYSCTLBYNAME /* Define to 1 if the system has the type `SYSTEM_LOGICAL_PROCESSOR_INFORMATION'. */ #undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION #define HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION 1 /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ELF_386_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ELF_SPARC_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TCHAR_H #define HAVE_TCHAR_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H #define HAVE_TIME_H 1 /* Define to 1 if you have the header file. */ #undef HAVE_UCONTEXT_H /* Define to 1 if the system has the type `ucontext_t'. */ #undef HAVE_UCONTEXT_T /* Define to 1 if the system has the type `uintptr_t'. */ #undef HAVE_UINTPTR_T /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H #define HAVE_WINDOWS_H 1 /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_X11_XLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_XM_XM_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define if the host is an ARM (64-bit) */ /*#undef HOSTARCHITECTURE_AARCH64*/ /* Define if the host is an ARM (32-bit) */ /*#undef HOSTARCHITECTURE_ARM*/ /* Define if the host is an Itanium */ /*#undef HOSTARCHITECTURE_IA64*/ /* Define if the host is a MIPS (32-bit) */ /*#undef HOSTARCHITECTURE_MIPS*/ /* Define if the host is a PowerPC (32-bit) */ /*#undef HOSTARCHITECTURE_PPC*/ /* Define if the host is a PowerPC (64-bit) */ /*#undef HOSTARCHITECTURE_PPC64*/ /* Define if the host is a Sparc (32-bit) */ /*#undef HOSTARCHITECTURE_SPARC*/ /* Define if the host is an X86 (32-bit) */ /*#undef HOSTARCHITECTURE_X86*/ /* Define if the host is an X86 (64-bit) */ /*#undef HOSTARCHITECTURE_X86_64*/ /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define prefix of external names */ #ifdef _WIN64 # undef POLY_LINKAGE_PREFIX #else # define POLY_LINKAGE_PREFIX _ #endif /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* The size of `int', as computed by sizeof. */ // N.B. This is 4 on both 32-bit and 64-bit #define SIZEOF_INT 4 /* The size of `long', as computed by sizeof. */ // N.B. This is 4 on both 32-bit and 64-bit #define SIZEOF_LONG 4 /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP #ifdef _WIN64 #define SIZEOF_VOIDP 8 #else #define SIZEOF_VOIDP 4 #endif // Size of long long // N.B. This is 8 on both 32-bit and 64-bit #define SIZEOF_LONG_LONG 8 /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define if the X-Windows interface should be built */ #undef WITH_XWINDOWS /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t #define gid_t int /* Define to the type of a signed integer type wide enough to hold a pointer, if such a type exists, and if the system does not define it. */ #undef intptr_t /* Define to `int' if does not define. */ #undef mode_t #define mode_t int /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #define pid_t int /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ // There is an SSIZE_T #undef ssize_t #if defined(_MSC_VER) #include typedef SSIZE_T ssize_t; #endif /* Define to `int' if doesn't define. */ #define uid_t int /* Define to the type of an unsigned integer type wide enough to hold a pointer, if such a type exists, and if the system does not define it. */ #undef uintptr_t /* Define as `fork' if `vfork' does not work. */ #undef vfork #endif polyml-5.6/wininstall/000077500000000000000000000000001265146633400150765ustar00rootroot00000000000000polyml-5.6/wininstall/Licence.rtf000066400000000000000000000711211265146633400171570ustar00rootroot00000000000000{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} {\f28\froman\fcharset238\fprq2 Times New Roman CE;}{\f29\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f31\froman\fcharset161\fprq2 Times New Roman Greek;}{\f32\froman\fcharset162\fprq2 Times New Roman Tur;} {\f33\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f34\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f35\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f36\fswiss\fcharset238\fprq2 Arial CE;}{\f37\fswiss\fcharset204\fprq2 Arial Cyr;} {\f39\fswiss\fcharset161\fprq2 Arial Greek;}{\f40\fswiss\fcharset162\fprq2 Arial Tur;}{\f41\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f42\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f43\fswiss\fcharset186\fprq2 Arial Baltic;}} {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; \red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}}{\info{\author David Matthews}{\operator David Matthews}{\creatim\yr2009\mo11\dy8\hr11\min35}{\revtim\yr2009\mo11\dy8\hr11\min35} {\version2}{\edmins0}{\nofpages7}{\nofwords3479}{\nofchars19833}{\*\company }{\nofcharsws24356}{\vern8247}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701 \dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind4\viewscale100\nolnhtadjtbl \fet0\sectd \linex0\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3 \pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}} {\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f1\fs20 GNU LESSER GENERAL PUBLIC LICENSE \par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1\fs20 Version 2.1, February 1999}{\f1 \par }{\f1\fs20 \par Copyright (C) 1991, 1999 Free Software Foundation, Inc.}{\f1 }{\f1\fs20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA}{\f1 \par }{\f1\fs20 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.}{\f1 \par \par }{\f1\fs20 [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]}{\f1 \par \par }{\f1\fs20 Preamble}{\f1 \par \par }{\f1\fs20 The licenses for most software are designed to take away your freedom to share and change it. By contr ast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.}{\f1 \par \par }{\f1\fs20 This license, the Lesser General Public License, applies to some specially designated softw are packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strate gy to use in any particular case, based on the explanations below.}{\f1 \par \par }{\f1\fs20 When we speak of free software, we are referring to freedom of use,not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free s oftware (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 and use pieces of it in new free programs; and that you are informed that you can do these things.}{\f1 \par \par }{\f1\fs20 To protect yo ur rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify i t.}{\f1 \par \par }{\f1\fs20 For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the lib rary, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.}{\f1 \par \par }{\f1\fs20 We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.}{\f1 \par \par }{\f1\fs20 To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduc ed by others.}{\f1 \par \par }{\f1\fs20 Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Ther efore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.}{\f1 \par \par }{\f1\fs20 Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public Lice nse. We use this license for certain libraries in order to permit linking those libraries into non-free programs.}{\f1 \par \par }{\f1\fs20 When a program is linked with a library, whether statically or using}{\f1 \par }{\f1\fs20 a shared library, the combination of the two is legally speaking a combi ned work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.}{\f1 \par \par }{\f1\fs20 We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competi ng non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.}{\f1 \par \par }{\f1\fs20 For example, on rare occasions, there may be a spec ial need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely us ed non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.}{\f1 \par \par }{\f1\fs20 In other cases, permission to use a particular library in non-free programs enables a greater num ber of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.}{\f1 \par \par }{\f1\fs20 Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.}{\f1 \par \par }{\f1\fs20 The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latte r must be combined with the library in order to run.}{\f1 \par \par }\pard \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\b\f1\fs20 GNU LESSER GENERAL PUBLIC LICENSE \par TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION}{\f1 \par }{\f1\fs20 \par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1\fs20 0. This License Agreement applies to any software library or other program which contains a notice place d by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). \par Each licensee is addressed as "you".}{\f1 \par \par }{\f1\fs20 A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.}{\f1 \par \par }{\f1\fs20 The "Library", below, refers to any such software library or work which has been distributed under these terms . A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)}{\f1 \par \par }{\f1\fs20 "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code fo r all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.}{\f1 \par \par }{\f1\fs20 Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents con stitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.}{\f1 \par \par }{\f1\fs20 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library.}{\f1 \par \par }{\f1\fs20 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.}{\f1 \par \par }{\f1\fs20 2. You may mod ify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:}{\f1 \par \par }\pard \ql \li568\ri0\nowidctlpar\faauto\rin0\lin568\itap0 {\f1\fs20 a) The modified work must itself be a software library.}{\f1 \par \par }{\f1\fs20 b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.}{\f1 \par \par }{\f1\fs20 c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.}{\f1 \par \par }{\f1\fs20 d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.}{\f1 \par }\pard \ql \li568\ri0\nowidctlpar\tx568\faauto\rin0\lin568\itap0 {\f1 \par }{\f1\fs20 (For example, a function in a library to com pute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)}{\f1 \par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1 \par }{\f1\fs20 These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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.}{\f1 \par \par }{\f1\fs20 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 Library.}{ \f1 \par \par }{\f1\fs20 In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.}{\f1 \par \par }{\f1\fs20 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Pub lic License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.}{\f1 \par \par }{\f1\fs20 Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.}{\f1 \par \par }{\f1\fs20 This option is useful when you wish to copy part of the code of the Library into a program that is not a library.}{\f1 \par \par }{\f1\fs20 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with th e 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.}{\f1 \par \par }{\f1\fs20 If distribution of object code is made by offering access to copy from a desi gnated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.}{\f1 \par \par }{\f1\fs20 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Lib rary, and therefore falls outside the scope of this License.}{\f1 \par \par }{\f1\fs20 However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.}{\f1 \par \par }{\f1\fs20 When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not p recisely defined by law.}{\f1 \par \par }{\f1\fs20 If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)}{\f1 \par \par }{\f1\fs20 Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.}{\f1 \par \par }{\f1\fs20 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse}{\f1 \par }{\f1\fs20 engineering for debugging such modifications.}{\f1 \par \par }{\f1\fs20 You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notic es, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:}{\f1 \par \par }{\f1\fs20 a) Accompany the work with the complete corresponding machine-readable s ource code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)}{\f1 \par \par }{\f1\fs20 b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the li brary already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is inte rface-compatible with the version that the work was made with.}{\f1 \par \par }{\f1\fs20 c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.}{\f1 \par \par }{\f1\fs20 d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.}{\f1 \par \par }{\f1\fs20 e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.}{\f1 \par \par }{\f1\fs20 For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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.}{\f1 \par \par }{\f1\fs20 It may happen t hat this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribut e.}{\f1 \par \par }{\f1\fs20 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:}{\f1 \par \par }{\f1\fs20 a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.}{\f1 \par \par }{\f1\fs20 b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.}{\f1 \par \par }{\f1\fs20 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will a utomatically 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.}{\f1 \par \par }{\f1\fs20 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.}{\f1 \par \par }{\f1\fs20 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restricti ons on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.}{\f1 \par \par }{\f1\fs20 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (no t 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 sati s fy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by al l 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 Library.}{\f1 \par \par }{\f1\fs20 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.}{\f1 \par \par }{\f1\fs20 It is not the purpose of this section to induce you to infringe any patents or other property right clai ms 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 wid e 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 choic e.}{\f1 \par \par }{\f1\fs20 This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.}{\f1 \par \par }{\f1\fs20 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only i n or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.}{\f1 \par \par }{\f1\fs20 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from ti me 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.}{\f1 \par \par }{\f1\fs20 Each version is given a distinguishing version number. If the Library 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 Library does not specify a license version number, yo u may choose any version ever published by the Free Software Foundation.}{\f1 \par \par }{\f1\fs20 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 softwa re and of promoting the sharing and reuse of software generally. \par }{\f1 \par }{\f1\fs20 NO WARRANTY \par }{\f1 \par }{\f1\fs20 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 A S TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.}{\f1 \par \par }{\f1\fs20 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYR IGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (IN C LUDING 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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.}{\f1 \par }{\f1\fs20 \par }{\f1 \par }}polyml-5.6/wininstall/PolyML.wxs000066400000000000000000000236761265146633400170330ustar00rootroot00000000000000 = 600)]]> polyml-5.6/wininstall/polyicon/000077500000000000000000000000001265146633400167325ustar00rootroot00000000000000polyml-5.6/wininstall/polyicon/polyicon.c000066400000000000000000000003321265146633400207300ustar00rootroot00000000000000#include // This is a dummy executable. It's only needed because the installer // needs an executable to hold the icon. int __stdcall WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR s, int n) { return 0; } polyml-5.6/wininstall/polyicon/polyicon.rc000066400000000000000000000032671265146633400211240ustar00rootroot00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "windows.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.K.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""windows.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDR_POLYICON ICON DISCARDABLE "..\\..\\poly.ico" #endif // English (U.K.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED polyml-5.6/wininstall/polyicon/polyicon.vcxproj000066400000000000000000000163611265146633400222120ustar00rootroot00000000000000 Debug Win32 Release Win32 Debug x64 Release x64 {D4DF6521-6183-4E24-A327-55C72519836E} Win32Proj polyicon Application true v140_xp Unicode Application false v140_xp true Unicode Application true v140_xp Unicode Application false v140_xp true Unicode true true false false NotUsing Level3 Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true NotUsing Level3 Disabled _DEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true Level3 NotUsing MaxSpeed true true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true Level3 NotUsing MaxSpeed true true NDEBUG;_WINDOWS;%(PreprocessorDefinitions) Windows true true true polyml-5.6/wininstall/polyicon/resource.h000066400000000000000000000006711265146633400207360ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by polyicon.rc // #define IDR_POLYICON 128 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif polyml-5.6/wininstall/wininstall.wixproj000066400000000000000000000071621265146633400207140ustar00rootroot00000000000000 Debug x86 3.10 788ba1c9-699e-4f92-9faf-c7437a419042 2.0 PolyML Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets wininstall bin\$(Configuration)\ obj\$(Configuration)\ Debug bin\$(Configuration)\ obj\$(Configuration)\ PolyLib {0ba5d5b5-f85b-4c49-8a27-67186fa68922} True True Binaries;Content;Satellites INSTALLFOLDER PolyML {df3b373e-67df-4ab4-8b1e-f54c5810e2cf} True True Binaries;Content;Satellites INSTALLFOLDER PolyPerf {d9f58e8d-5fcd-4401-8d88-0c28732bd77b} True True Binaries;Content;Satellites INSTALLFOLDER polyicon {d4df6521-6183-4e24-a327-55c72519836e} True True Binaries;Content;Satellites INSTALLFOLDER $(WixExtDir)\WixUIExtension.dll WixUIExtension $(WixExtDir)\WixUtilExtension.dll WixUtilExtension